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SwAAH8AAR8gsAgACJ4FMNMAAR9wDwABH3MAASCUAAAABAQHAAEfkAAAAH2DAAP22AABgwAD82QE+AT0cwABIABTAAEf2nz0/AFYBAAEewABIBID3AQABFMAASBSqU0AAAADAAPyFAD0ewABILxQCAAIUwABIQJ9aQACAwABISotDAE7AAEihAAAAgU1ggXYAScAASLIhHMAASMEUwABItoxfDQBIAQABKwDAAP0pPgE9FcAASNCqs0EfwABI5IHaAQABFMAASPeMXw0AAD4BPRXAAEkTqrNBH8AASSeBjwAAAAA9G8AASUwNH8AASWSBpQEAARTAAEmAqrNBAABJwABJkiEcwABJnhTAAEmWjR4XAEgBAAErAMAA/Sk+AT0XwABJvxrAAEmtDYCBFMAAScmNHhcAgZU/ScAASdghHMAASekUwABJ3I0sGABIAQABKwDAAP0pPgE9F8AASgoawABJ+A2AghTAAEoZjSwYAIGYP0nAAEotIRzAAEpDFMAASjGNOhkASAEAASsAwAD88z4BPRfAAEpkGsAASlINgIMUwABKeI06GQCBmj9JwABKkSEcwABKohTAAEqVjUgaAEgBAAErAMAA/Sk+AT0XwABKwxrAAEqxDYCEFMAAStKNSBoAgZM/ScAASuYhHMAASvQUwABK6o1WGwBIAQABKwDAAP0pPgE9F8AASxUawABLAw2AhRTAAEshjVYbAIGUP0nAAEsyIRzAAEtDFMAASzaNZBwASAEAASsAwAD9KT4BPRfAAEtkGsAAS1INgIYUwABLc41kHACBlz9JwABLiCIUwABLjIziFAAAFMAAS5uM8RUAPgI9FcAAS62M4hQqPRzAAEvMFMAAS8aNABYAVgEAASQABieAsWrAAEvhYMAA/baAnyeBTieBT2rAAEw9YMAA/baA4CeBUADAAPyFP0nAAExgIhTAAExkjNMTAAAUwABMfIzxFQA+AT0cwABMlBTAAEyOjQAWAFYBAAEkAAYngLFqwABMqWDAAP22gOMngVEngVJqwABM/GDAAP22gSIngVAAwAD8hT9GwABNJMAATT/AAE0wAAAAgVNgwAD9tgAUwABNOI0AFgA+AT0cwABNVxrAAE1FDYFUAgACFMAATVytU0IAasAATXFgk3mBWgCBoEnAAE1/IhTAAE2DjLURAAEUwABNj4zEEgA+AT0ewABN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bkgBAAErAAArHMABIryBAMABzG6ETQEAAYDAASLDwAHMWACItQFbBoTFDcABIs7AASLOwAEjTQAAhFQAAAABA8ABIt/AASNNAAAAAQEBwAEi7AAAAIDyYJoKAABbAT4BScABIvUhHMABIwYWwAEi+S6FdIS/SAEAASsAiLc+AT0XwAEjFy6FdBzAASMogMABIybAAczahL4BAAEWwAEjNi6FdIS/AJoMhL8/AAAByusAActwAAHLxgABzDEAAcyzAAHNNwAAAAUChMgNwAEjsMABI7bAASXkA4V2AAABYISpAAACBITKDcABI+3AASP1GIJsAGCITgAEhMsNwAEkBMABJAkYgJYAYISpAAEFhNMNwAEkDsABJA7AASRTAAAAA8ABJBnAASRTAAAAAgICwAEkHwAABIJsYIhOAMABJC4AAASAlmCEqQAAYITIAT4BPTUAAAABAGCEqQEWwAEkOy6AloTLIxzAASRCggDAAc3eSAEAASsAACsXwAEkQoIAwAHN3oRSLoJYAWCEyAMIAYTKgADAAc27CAGEy4EAwAHNyAkBwAEkDoSwAAAAAAUGhM0NwAEkWMABJGHAASSjAACFZgAAAAEDwAEkbsABJKMAAAABAQHAASR/AAAAhWdgm0wAAGCIswFKwAEkiQEcwAEkjxbAASSJLoCWhMuFZgEAAYDAASSdwAHOYgCEqwaEzg3AASSowAEkqMABJN8AAIRNAAAAAQPAASSuwAEk3wAAAAEBAcABJMEAAACA8l2YeAFbAABbAUrAASTHARzAASTJgMABJMfAAc7BhXcBAAEuAJh+BoTPDcABJOPAASTjwAElJgAAhW8AAAABA8ABJOrAASUmAAAAAgICwAEk/gAAAIDyXZoSAltbAMABJQEAAACFcFsAAFsBSsABJQkBHMABJQuAwAElCcABzxeFdwIAAi6BwAElIsABzycAmhgGhNANwAElK8ABJSvAASVeAACETgAAAAEDwAElOMABJV4AAAABAQHAASVBAAAAgPJdmc4BWwAAXAE+AT01AAAAAQBghKkBFsABJUougJaEyyMcwAElUYEAwAHPmEgBAAErAAArHMABJVGBAMABz5iETQEAAYDAASVYwAHPggCErQFbBoTRDcABJWPAASVjwAEl4gAAhFQAAAABA8ABJXTAASXiAAAAAQEBwAElgQAAAIDyYJoKAABbAT4BScABJYohHMABJZQWwAElji6AloTLSAEAASsAwAD9KT4CPRfAASWlLoCWJsABJaUBHMABJbMWwAElrS6AloTLhE0BAAGAwAElusAB0AQAhK1ghKmEyz01AAAAAQBghKkBFsABJcQugJaEyyMcwAEly4EAwAHQbUgBAAErAAArF8ABJcuBAMAB0G2EUi6CWAFghMg/AAABzjsAAc6aAAHO8AABz1sAAc/dAAHQqQAAAAUChNQNwAEmT8ABJlrAASyPA4V4AWrAASZQYMAA+9AVAAFghKkAAAMEhNYNwAEmiMABJpAYhXkAYISpAASE1w3AASagwAEmpBiAvQFqwAEmlWDAAPvQFWCIfgAEhNgNwAEmvMABJtQYhXoBasABJqpgwAD70FJggnsAAgWE5A3AASbZwAEm2cABJ2wAAAADwAEm5MABJ2wAAAADAgPAASbwAAAAhXlghKkAwAEm/wAAAIC9YIh+AMABJw0AAACFe2CDWQFqAGDAAPzZdwBghNQBPwEKAMABJyyE5QMAA4DAASc4wAHRYoHAASdCwAHRbx7AASdIgj0BAAGCwAEnW8AB0XwAAAWE5Q3AASdxwAEnccABJ+oAhKQAA8ABJ4jAASfqAAAAAwMDwAEnlQAABIV5YISpAMABJ6QAAASAvWCIfgDAASevAAAEhXpggnsAAGCE1AE+AT01AAAAAQBghKkBFsABJ88uhXmE1iMcwAEn2YMAwAHSHUgBAAErAAArF8ABJ9mDAMAB0h2EUi6CWAFghNQECAGE1oAAwAHR7QgBhNeBAMAB0foIAYTYggDAAdIHCQHAASdxhLAAAAAABwaE2g3AASfvwAEn+sABKC8BAIV7AAAAAQPAASgKwAEoLwAAAAAAAABgg1kBSsABKA0BNQAAAAEAYIJ7ARbAASgNLoV6hNgjHMABKCeAAMAB0rdIAQABKwAAKxbAASgngADAAdK3hGyChAFgg1kGhNwNwAEoNMABKD3AASibAgCFewAAAAEDwAEoTMABKJsAAAABAQHAAShUAAAAgmZgg1kAAFwBPgE9F8ABKGIuhXoewAEofYI9AQABgMABKJDAAdMYAITYBoTeDcABKKDAASipwAErKgAAhWYAAAABA8ABKLbAASsqAAAAAQEBwAEoxwAAAIVnYJtMAABgiLMBPgVOwAEo2MABKOgAAIV7YINZARbAASjvLoV7hNpJwAEpBCEcwAEpGIHAASkIwAHThUgBAAErAMAA/Sk+A07AASkvwAEpOgAAhOZggxQBFsABKUyBwAEpPMAB04WE+YNhTsABKWbAASlzAACFfGCI7gEcwAEpfhbAASl1LoV5hNaFaAIAAoLAASmYwAHTwIDAASmkwAHTcACErErAASmyARzAASnxHsABKcaawgEAAYPAASnYwAHT4wCFfQEAARbAASoQgcABKgDAAdOFhP2DawCayT9OwAEqX8ABKmoAAIV+YMAA/bYBFsABKnEWwAEqbC6AvYTXgL2IgUnAASp7HMABKoqCwAEqf8AB1FdIAQABJ4PBAMAA/cU+AUrAASqhARbAASqugMABKqjAAdNwhX+bWknAASrCHMABKtGCwAEqxsAB1FdIAQABJ4WAAMAA/cU+AUrAASrrARbAASr4gMABKvLAAdNwhYGbXz9KwAErDAFqwAErGWCIyoR5BoTfDcABKy/AASsvwAErZgAAhE0AAAABA8ABKzXAAStmAAAAAQEBwAErSAAAAIDyXZh4AVsAAFsBSsABK04BHMABK1CAwAErTsAB1SaFggEAAS4AmH8GhOANwAErasABK2rAASutAACFbwAAAAEDwAErccABK60AAAACAgLAASuFAAAAgPJdmhICW1sAwAEriAAAAIVwWwAAWwFKwAErkAEcwAErkoDAASuQwAHVfIWCAgACLoHAASupwAHVjACaGQaE4Q3AASuywAErssABK/0AAIROAAAAAQPAASu/wAEr/QAAAAEBAcABK8gAAACA8l2ZzgFbAABcAT4CPTUAAAABAGCEqQEWwAEr0S6FeYTWIxzAASvbgQDAAdX9SAEAASsAACscwAEr24EAwAHV/YRNAQABgMABK+LAAdXnAIStAVs9NQAAAAEAYIh+ARbAASvqLoC9hNcjHMABK/CBAMAB1kRIAQABKwAAKxzAASvwgQDAAdZEhE0BAAGAwAEr98AB1ecAiIsBWwaE4g3AASwCwAEsAsABLI0AAIRUAAAAAQPAASwTwAEsjQAAAAEBAcABLCAAAACA8mCaCgAAWwE+AUnAASwpIRzAASw2FsABLC0uhXmE1kgBAAErAMAA/Sk+Aj0XwAEsRy6FeSbAASxHARzAASxbFsABLFIuhXmE1oRNAQABgMABLGLAAdawAIStYISphNY9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BoXkDcABejHAAXo6wAF7FwAAhWYAAAABA8ABekfAAXsXAAAAAQEBwAF6WAAAAIVnYJtMAABgiLMBPgJOwAF6csABencAAIKQYIkAASbAAXpyARzAAXqEFsABenkugmuF4YVmAQABgMABepLAAiufAISrYIkASsABep4BHMABeukewAF6sprEAgACFsABesGBwAF6vMACK7SEuIkCFsABetEuhReF4gCFfQEAARbAAXr9gcABevjAAiu0hamJDgCayQaF5Q3AAXscwAF7HMABe1UAAIRNAAAAAQPAAXsiwAF7VQAAAAEBAcABezUAAACA8l2YeAFbAABbAUrAAXs7ARzAAXs9gMABezvAAixghaoBAAEuAJioBoXmDcABe1nAAXtZwAF7ngAAhW8AAAABA8ABe2DAAXueAAAAAgICwAF7dAAAAIDyXZoSAltbAMABe3cAAACFcFsAAFsBSsABe38BHMABe4GAwAF7f8ACLLaFqgIAAi6BwAF7msACLMYAmkIGhecNwAF7o8ABe6PAAXv8AACETgAAAAEDwAF7sMABe/wAAAABAQHAAXu5AAAAgPJdmc4BWwAAXAE+Aj01AAAAAQBghKkBFsABe8IugmuF4SMcwAF7zoEAwAItN0gBAAErAAArHMABe86BAMACLTeETQEAAYDAAXvVwAItIQCErQFbPR7AAXvdgjUCAAIWwAF75y6FF4XigMABe/bAAi0hAAaF6A3AAXwBwAF8AcABfL0AAIRUAAAAAQPAAXwSwAF8vQAAAAEBAcABfB8AAACA8mCaCgAAWwE+AknAAXwoIRzAAXw3FsABfCwugmuF4UgBAAErAMAA/Sk+Aj0XwAF8SC6CaybAAXxIARzAAXxgFsABfFUugmuF4YRNAQABgMABfGfAAi3CAIStYISpheE9NQAAAAEAYISpARbAAXxxLoJrheEjHMABfH2BAMACLitIAQABKwAAKxfAAXx9gQDAAi4rhFIuglgBYIXfPz0ewAF8loI3AgACFsABfKguhReF4oDAAXy3wAItwgAAAAIreAACLDkAAiyPAAIs+gACLZsAAi6GAAAABQKF6w3AAX1cwAF9YsABf0UDhasAAAFghKkAAAEEhe0NwAF9iMABfY8YhawAYISpAAEFhfUNwAF9lMABfZTAAX3GAAAAA8ABfZfAAX3GAAAAAQEBwAF9nQAA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AIVvAAAAAQPAAakVwAGpUAAAAAICAsABqSkAAACA8l2aEgJbWwDAAaksAAAAhXBbAABbAUrAAak0ARzAAak2gMABqTTAAlzGhd0CAAIugcABqUzAAlzWAJo7AAACW/gAAlxJAAJcnwACXQoAAAADAoaKDcABqVXAAalbwAGqewOF3gAAAWCGcAAAAQSGjA3AAamJwAGpjhiAlgBgwAD6ggABBYaSDcABqZPAAamTwAGprAAAAAPAAamgwAGprAAAAAEBAcABqaYAAASAlmDAAPqCAABghooBPwIIAYaMgADAAl10CQHAAamThncAAAAAAwaGjg3AAamxwAGpusABqfIAAIVmAAAAAQPAAanHwAGp8gAAAAEBAcABqdgAAACFZ2CbTAAAYIizAUrAAaniARbAAanogMABqeLAAl3Ihd+bXAaGjw3AAan3wAGp98ABqjAAAIRNAAAAAQPAAan9wAGqMAAAAAEBAcABqhAAAACA8l2YeAFbAABbAUrAAaoWARzAAaoYgMABqhbAAl4ZheABAAEuAJijBoaQDcABqjTAAao0wAGqeQAAhW8AAAABA8ABqjvAAap5AAAAAgICwAGqTwAAAIDyXZoSAltbAMABqlIAAACFcFsAAFsBSsABqloBHMABqlyAwAGqWsACXm+F4AIAAi6BwAGqdcACXn8Amj0AAAJdoQACXfIAAl5IAAJeswAAAAMChpMNwAGqfsABqoTAAauYA4XhAAABYIZwAAABBIaVDcABqq7AAaqzGICWAGDAAPoKAAEFhpsNwAGquMABqrjAAarPAAAAA8ABqsPAAarPAAAAAQEBwAGqyQAABICWYMAA+goAAGCGkwE/AggBhpWAAMACXx0JAcABqriGdwAAAAADBoaXDcABqtTAAardwAGrEwAAhWYAAAABA8ABqurAAasTAAAAAQEBwAGq+wAAAIVnYJtMAABgiLMBSsABqwUBFsABqwuAwAGrBcACX3GFn5tZBoaYDcABqxjAAasYwAGrTwAAhE0AAAABA8ABqx7AAatPAAAAAQEBwAGrMQAAAIDyXZh4AVsAAFsBSsABqzcBHMABqzmAwAGrN8ACX8KF4gEAAS4AmKQGhpkNwAGrU8ABq1PAAauWAACFbwAAAAEDwAGrWsABq5YAAAACAgLAAatuAAAAgPJdmhICW1sAwAGrcQAAAIVwWwAA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AACEVAAAAAEDwAHIF8AByHcAAAABAQHAAcgkAAAAgPJgmgoAAFsBPgI9F8AByC0uhf8cwAHIOoDAAcg4wAKG94YBAQABFsAByEguhf+HJwCaDYcnPRfAAchXLoKQHMAByGCAwAHIXsAChveEvgEAARbAAchuLoKQhygAmgyHKAAAAoT9AAKFRgAChZwAAoYHAAKG0AACh18AAAAFAocxDcAByK7AAci0wAHLcgOGAgAAAWCEqQAAAgSHMw3AAcjjwAHI6xiCbABgiE4ABIc0DcAByRfAAckbGIJpAGCEqQABBYc8DcABySDAAckgwAHJeAAAAAPAAckjwAHJeAAAAAICAsABySkAAASCbGCITgDAAck4AAAEgmlghKkAAGCHMQE+Aj01AAAAAQBgiE4BFsAByUQugmyHMyMcwAHJToIAwAKIBkgBAAErAAArF8AByU6CAMACiAaEUi6CWAFghzE9NQAAAAEAYISpARbAAclhLoJphzQjHMAByWeCAMACiENIAQABKwAAKxfAAclnggDAAohDhFIuglgBYIcxAwgBhzOAAMACh+MIAYc0gQDAAofwCQHAAckghLAAAAAABQaHNg3AAcl9wAHJhsAByccAAIVmAAAAAQPAAcmTwAHJxwAAAAEBAcAByaQAAACFZ2CbTAAAYIizAUrAAcmuARzAAcmzFsABya4ugmmHNIVmAQABgMABycHAAojHAISrBoc3DcAByczAAcnMwAHJ+wAAhE0AAAABA8ABydLAAcn7AAAAAQEBwAHJ5QAAAIDyXZh4AVsAAFsBSsAByesBHMABye2AwAHJ68ACiSaGAwEAAS4AmKYGhzgNwAHJ/8AByf/AAco6AACFbwAAAAEDwAHKBsAByjoAAAACAgLAAcoaAAAAgPJdmhICW1sAwAHKHQAAAIVwWwAAWwFKwAHKJQEcwAHKJ4DAAcolwAKJfIYDAgACLoHAAco2wAKJjACaQAaHOQ3AAco/wAHKP8AByooAAIROAAAAAQPAAcpMwAHKigAAAAEBAcABylUAAACA8l2ZzgFbAABcAT4CPTUAAAABAGCITgEWwAHKXi6CbIczIxzAAcpogQDAAon9SAEAASsAACscwAHKaIEAwAKJ/YRNAQABgMABym/AAonnAIhrAVs9NQAAAAEAYISpARbAAcp3LoJphzQjHMAByn2BAMACikRI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AppTwAKaeAAAAAAAAABgwAD70AFKwAKaVgEjFsACmlwWwAKaVi6Alol8hqfAAP0VN4DHGMACmnCDwYmBAWDAAPvQBomhDcACmnzAApqKwAKa3AMASAAAAAEDwAKajMACmtwAAAABAQHAApqUAAAAg9ZgwAD9HAAAYMAA+goBSsACmqQBIiXAApqqgMACmqTAA0ikYImcAB7AApq/wAD1sQIAAhbAAprJLoCWiXwWwAKa1hTAAprQwANIpAABYImcgJaJfAAGiaINwAKa4cACmurAApscAACGmAAAAAEDwAKa8cACmxwAAAABAQHAApsCAAAAhWdgm0wAAGCIswFKwAKbDAEWwAKbEoDAApsMwANJKIXfm1wAAANHOwADR3YAA0fMAANIIgADSH4AA0kBAANJUgAAAAYCiacNwAKbIcACmyfAApyKA4aoAAABXYl6AWDAAP22AAAAAQWJrg3AAptcwAKbXMACm6cAAAADwAKbasACm6cAAAABAQHAAptyAAAAgJZgwAD9tgAAYImnAT4BQCEcwAKbm4DAApuVwANJuEgBAAErAMAA/cXAApuVwAKbogABCQDAApt7iYMBAAGAwAKbgcADSbgABAaJqQ3AApuswAKbrMACm8YAAIROAAAAAQPAApu5wAKbxgAAAAEBAcACm8IAAACA8l2ZzgFbAABcAT4ABomqDcACm8rAApvKwAKcAgAAhE0AAAABA8ACm9DAApwCAAAAAQEBwAKb4QAAAIDyXZlZAVsAAFsBSsACm+cBHMACm+mAwAKb58ADSmqGqQEAAS4AmWAGiasNwAKcBsACnAbAApxIAACE7wAAAAEDwAKcFcACnEgAAAABAQHAApweAAAAgPJdmc4BWwAAWwFKwAKcJAEcwAKcJoDAApwkwANKwIaqAQABLgCZ8QaJrA3AApxNwAKcVsACnIgAAIaYAAAAAQPAApxdwAKciAAAAAEBAcACnG4AAACFZ2CbTAAAYIizAUrAApx4ARbAApx+gMACnHjAA0sWhbqbXQAAA0oIAANKQwADSpkAA0rvAANLQAAAAAQCia8NwAKcjcACnJPAAp+OA4arAAABYIluAAACBImxDcACnMTAApzICYC9AGDAAP22AASJsg3AApzcwAKc7AmGrABggnsAAQWJvQ3AApzxwAKc8cACnSEAAAADwAKc/8ACnSEAAAACAgLAAp0FAAAEgL1gwAD9tgDAAp0QAAAEhqxggnsAAGCJrwE/AwgBibGAAMADS8IIAYmygQDAA0vRCQHAApzxiXkAAAAABwaJtA3AAp0mwAKdJsACnUAAAIROAAAAAQPAAp0zwAKdQAAAAAEBAcACnTwAAACA8l2ZzgFbAABcAT4ABom1DcACnUXAAp1FwAKdfQAAhE0AAAABA8ACnUvAAp19AAAAAQEBwAKdXAAAAIDyXZlZAVsAAFsBSsACnWIBHMACnWSAwAKdYsADTGiGrQEAAS4AmWEGibYNwAKdgcACnYHAAp3DAACE7wAAAAEDwAKdkMACncMAAAABAQHAAp2ZAAAAgPJdmc4BWwAAWwFKwAKdnwEcwAKdoYDAAp2fwANMvoauAQABLgCZ8gaJtw3AAp3IwAKdz8ACnlIAACMAAAABA8ACndfAAp5SAAAAAAAAAGDAAP22AT4BSsACneABIyEcwAKd+BbAAp3nLoasibJIAQABKwDAAP0pJMACnkQEJ4avFsACnikWwAKeHxbAAp4OLoasibKEaIKChHeCjSeGWhbAAp42LoC9ibEkwAKeTgInhq8WwAKeSS6AvYmxAWDAAP22Bom7DcACnlfAAp5fwAKejgEAg8EAAAABA8ACnmjAAp6OAAAAAAAAAGDAAPvQAUrAAp5rAR7AAp5xirYCAAIWwAKedy6AvYmxFsACnn0uhqyJsgAGibgNwAKek8ACnqHAAp9MAwBIAAAAAQPAAp6jwAKfTAAAAAEBAcACnqsAAACD1mDAAP0cAABgwAD6CgFKwAKeuwEiHsACnrvAAPWxAgACLoDAAp7LwANOAQABIiIlwAKe4oDAAp7cwANOAWCJrwAcwAKfDBbAAp8HFMACnwHAA04BAAFgia+AvYmxSAEAARbAAp8PLoC9ibEAwAD9xQAcwAKfOBbAAp8nFMACnyHAA04BAAFgia+GrImySAEAARbAAp87LoasibIAwAD9KQaJuQ3AAp9RwAKfWsACn4wAAIaYAAAAAQPAAp9hwAKfjAAAAAEBAcACn3IAAACFZ2CbTAAAYIizAUrAAp98ARbAAp+CgMACn3zAA07QheabXgAAA0wGAANMQQADTJcAA0ztAANNiAADTdsAA06pAANO+gAAAAcCib4NwAKfkcACn5fAAqPoA4awAAABYIluAAAEBInADcACn8fAAp/OCYXGAGCIswAEicENwAKf4cACn+oJhccAYIizAASJwg3AAqALwAKgEgmD0ABdwAD8dAFgidAABInEDcACofnAAqIIGIaxgi4AYMAA+9ABKwEFic8NwAKgF8ACoBfAAqBOAAAAA8ACoCLAAqBOAAAAAwMDwAKgKAAABIXGYIizAMACoDYAAASFx2CIswDAAqBGAAAEg9BdwAD8dAFgidAAAGCJvgE/BAgBicCAAMADT7kIAYnBgQDAA0/GCAGJwoIAwANP0wkBwAKgF4l5AAAAAAcGicYNwAKgU8ACoFPAAqEkAACETgAAAAEDwAKgYMACoSQAAAABAQHAAqBpAAAAgPJdmc4BWwAAXAE+Az0cwAKgehbAAqByLoXGicCETQEAAYDAAqCBwANQPwCItT0cwAKgkxbAAqCJLoXHicGETQEAAYDAAqCawANQPwCItUbAAqCiwAKg0MACoL4AAAGDz2CJ0AAWwAKgxy6D0InCPgI9HMACoOIWwAKg3oHAAqDYwANQnoPRidKE7wEAAYDAAqDywANQPwCJcj0cwAKhCBbAAqECgcACoPzAA1CegJaJ04TvAQABgMACoRjAA1A/AIlyBonHDcACoSnAAqEpwAKhXgAAhE0AAAABA8ACoS/AAqFeAAAAAQEBwAKhQAAAAIDyXZlZAVsAAFsBSsACoUYBHMACoUiAwAKhRsADUTCGsgEAAS4AmWIGicgNwAKhYsACoWLAAqGhAACE7wAAAAEDwAKhccACoaEAAAABAQHAAqF6AAAAgPJdmc4BWwAAWwFKwAKhgAEcwAKhgoDAAqGAwANRhoazAQABLgCZ8waJyQ3AAqGmwAKhrcACofAAACMAAAABA8ACobXAAqHwAAAAAAAAAGDAAP22AUrAAqG7ASTAAqHwCBbAAqHDLoWAwAD9MCdjFsACodEuhcaJwCeBixbAAqHbLoXHicEnhrQWwAKh5y6D0InCJ4MhBonNDcACogzAAqIUwAKipQEAg8EAAAABA8ACoh3AAqKlAAAAAAAAAGDAAPvQAT4BSsACoiMBNQAAAAEAYMAA+9ABFsACoiouhrGCLonEIxzAAqI6gADAA1JaSAEAASsAwAD88xfAAqIqLoaxgi4ewAKiRIq1AwADFsAComQWwAKiXC6FxonAg8HAAP0vFsACongWwAKibi6Fx4nBg8HAAP0vHsACooiKtwEAARbAAqKYLoPQicIAAInEgADAA1JaAWDAAPvQBonKDcACoqrAAqK4wAKjiAMASAAAAAEDwAKiusACo4gAAAABAQHAAqLCAAAAg9ZgwAD9HAAAYMAA+goBSsACotIBIh7AAqLSwAD1sQIAAi6AwAKi4sADUw8AASIiIiXAAqL5gMACovPAA1MPYIm+ABzAAqMjFsACoxsUwAKjFcADUw8AAWCJvoXGicBIAQABFsACoyYuhcaJwACItwAcwAKjSxbAAqNBFMACozvAA1MPAAFgib6Fx4nBSAEAARbAAqNOLoXHicEAiLcAHsACo2WCRgIAAhbAAqN2FMACo3DAA1MPAAFgib6D0InCFsACo38ug9CJwgAGicsNwAKjjcACo5bAAqPmAACGmAAAAAEDwAKjncACo+YAAAABAQHAAqOuAAAAhWdgm0wAAGCIswFKwAKjvgEcwAKjxIDAAqO+wANUCIXJAgACFsACo9MuhcaJwBbAAqPcLoXHicEAm2cAAANQGAADUQkAA1FfAANRtQADUiMAA1LpAANT4QADVEoAAAAHAonQDcACo+vAAqPxwAKlJgOGtQAAAWDAAP0cAAACBInSDcACpBXAAqQYCYPRAGCJbgAEidMNwAKkK8ACpDAJgJYAYIluAAEFidoNwAKkNMACpDTAAqRaAAAAA8ACpETAAqRaAAAAAgICwAKkSgAABIPRYIluAMACpFQAAASAlmCJbgAAYInQAT8DCAGJ0oAAwANU2AgBidOBAMADVOUJAcACpDTAAP0yAAAAAAMGidUNwAKkX8ACpGbAAqSCAAAjAAAAAQPAAqRuwAKkggAAAAAAAABgwAD9tgFKwAKkdAEkwAKkggMWwAKkdi6D0YnSJ4NVFsACpHwugJaJ0waJ2A3AAqSHwAKkj8ACpLIBAIPBAAAAAQPAAqSYwAKksgAAAAAAAABgwAD70AFKwAKkmwEewAKkoYq2AgACFsACpKcug9GJ0hbAAqSsLoCWidMABonWDcACpLfAAqTFwAKlJAMASAAAAAEDwAKkx8ACpSQAAAABAQHAAqTPAAAAg9ZgwAD9HAAAYMAA+goBSsACpN8BIiIlwAKk5YDAAqTfwANV5WCJ0AAcwAKlBhbAAqUCFMACpPzAA1XlAAFgidCD0YnSSAEAARbAAqUJLoPRidIAiXMAHMACpRwWwAKlFhTAAqUQwANV5QABYInQgJaJ00gBAAEWwAKlHy6AlonTAIlzAAADVRwAA1VsAANVvwADVnAAAAADAonbDcACpSnAAqUvwAKo3wOGtgAAAWCJbgAAAwSJ3Q3AAqVgwAKlbAmFvQBgiLMABIneDcACpYXAAqWMCYPQAF3AAPx0AWCJbgAEieANwAKnJMACpzMYhrGCLgBgwAD70AErAQWJ6w3AAqWRwAKlkcACpb4AAAADwAKlncACpb4AAAACAgLAAqWjAAAEhb1giLMAwAKltgAABIPQXcAA/HQBYIluAABgidsBPwMIAYndgADAA1cLCAGJ3oEAwANXGAkBwAKlkYl5AAAAAAcGieINwAKlw8ACpcPAAqZUAACETgAAAAEDwAKl0MACplQAAAABAQHAAqXZAAAAgPJdmc4BWwAAXAE+Aj0cwAKl7xbAAqXiLoW9id2ETQEAAYDAAqX2wANXegCItUbAAqX+wAKmJ8ACphIAAAGF/2CJbgAWwAKmHi6D0InePgE9HMACpjiBwAKmL8ADV7iE7wEAAYDAAqZIwANXegCJcgaJ4w3AAqZZwAKmWcACpo8AAIRNAAAAAQPAAqZfwAKmjwAAAAEBAcACpnAAAACA8l2ZWQFbAABbAUrAAqZ2ARzAAqZ4gMACpnbAA1gYhrcBAAEuAJljBonkDcACppPAAqaTwAKm0wAAhO8AAAABA8ACpqLAAqbTAAAAAQEBwAKmqwAAAIDyXZnOAVsAAFsBSsACprEBHMACprOAwAKmscADWG6GuAEAAS4AmfQGieUNwAKm2MACpt/AAqcbAAAjAAAAAQPAAqbnwAKnGwAAAAAAAABgwAD9tgFKwAKm7QEkwAKnGwYWwAKm9S6FgMAA/TAnYxbAAqcDLoW9id0nhrQWwAKnEi6D0IneJ4MhBonpDcACpzfAAqc/wAKnwAEAg8EAAAABA8ACp0jAAqfAAAAAAAAAAGDAAPvQAT4BSsACp04BNQAAAAEAYMAA+9ABFsACp1UuhrGCLongIxzAAqdlgADAA1k1SAEAASsAwAD88xfAAqdVLoaxgi4ewAKnb4qzAgACFsACp5MWwAKnhi6FvYndg8HAAP0vHsACp6OKtwEAARbAAqezLoPQid4AAInggADAA1k1AWDAAPvQBonmDcACp8XAAqfTwAKohAMASAAAAAEDwAKn1cACqIQAAAABAQHAAqfdAAAAg9ZgwAD9HAAAYMAA+goBSsACp+0BIh7AAqftwAD1sQIAAi6AwAKn/cADWdUAASIiJcACqBSAwAKoDsADWdVgidsAHMACqEQWwAKoNxTAAqgxwANZ1QABYInbhb2J3UgBAAEWwAKoRy6FvYndAIi3AB7AAqhhgkYCAAIWwAKochTAAqhswANZ1QABYInbg9CJ3hbAAqh7LoPQid4ABonnDcACqInAAqiSwAKo3QAAhpgAAAABA8ACqJnAAqjdAAAAAQEBwAKoqgAAAIVnYJtMAABgiLMBSsACqLoBHMACqMCAwAKousADWp+FvwEAARbAAqjQLoW9id0Am2UAAANXUwADV/EAA1hHAANYnQADWP4AA1mvAANaeAADWtcAAAAHAonsDcACqOLAAqjowAKsjAOGuQAAAWCJbgAAAwSJ7g3AAqkYwAKpJAmFvQBgiLMABInvDcACqT3AAqlECYPQAF3AAPx0AWCJbgAEifENwAKq2cACqugYhrGCLgBgwAD70AErAQWJ/A3AAqlJwAKpScACqXUAAAADwAKpVMACqXUAAAACAgLAAqlaAAAEhb1giLMAwAKpbQAABIPQXcAA/HQBYIluAABgiewBPwMIAYnugADAA1uCCAGJ74EAwANbjwkBwAKpSYl5AAAAAAcGifMNwAKpesACqXrAAqoLAACETgAAAAEDwAKph8ACqgsAAAABAQHAAqmQAAAAgPJdmc4BWwAAXAE+Aj0cwAKpphbAAqmZLoW9ie6ETQEAAYDAAqmtwANb8QCItUbAAqm1wAKp3sACqckAAAGF/2CJbgAWwAKp1S6D0InvPgE9HMACqe+BwAKp5sADXC+E7wEAAYDAAqn/wANb8QCJcgaJ9A3AAqoQwAKqEMACqkUAAIRNAAAAAQPAAqoWwAKqRQAAAAEBAcACqicAAACA8l2ZWQFbAABbAUrAAqotARzAAqovgMACqi3AA1yPhroBAAEuAJlkBon1DcACqknAAqpJwAKqiAAAhO8AAAABA8ACqljAAqqIAAAAAQEBwAKqYQAAAIDyXZnOAVsAAFsBSsACqmcBHMACqmmAwAKqZ8ADXOWGuwEAAS4AmfUGifYNwAKqjcACqpTAAqrQAAAjAAAAAQPAAqqcwAKq0AAAAAAAAABgwAD9tgFKwAKqogEkwAKq0AYWwAKqqi6FgMAA/TAnYxbAAqq4LoW9ie4nhrQWwAKqxy6D0InvJ4MhBon6DcACquzAAqr0wAKrdQEAg8EAAAABA8ACqv3AAqt1AAAAAAAAAGDAAPvQAT4BSsACqwMBNQAAAAEAYMAA+9ABFsACqwouhrGCLonxIxzAAqsagADAA12sSAEAASsAwAD88xfAAqsKLoaxgi4ewAKrJIqzAgACFsACq0gWwAKrOy6FvYnug8HAAP0vHsACq1iKtwEAARbAAqtoLoPQie8AAInxgADAA12sAWDAAPvQBon3DcACq3rAAquIwAKsOAMASAAAAAEDwAKrisACrDgAAAABAQHAAquSAAAAg9ZgwAD9HAAAYMAA+goBSsACq6IBIh7AAquiwAD1sQIAAi6AwAKrssADXkwAASIiJcACq8mAwAKrw8ADXkxgiewAHMACq/gWwAKr6xTAAqvlwANeTAABYInshb2J7kgBAAEWwAKr+y6FvYnuAIi3AB7AAqwVgkYCAAIWwAKsJhTAAqwgwANeTAABYInsg9CJ7xbAAqwvLoPQie8ABon4DcACrD3AAqxGwAKsigAAhpgAAAABA8ACrE3AAqyKAAAAAQEBwAKsXgAAAIVnYJtMAABgiLMBSsACrGgBHMACrG6AwAKsaMADXxaFwwEAARbAAqx9LoW9ie4Am2YAAANbygADXGgAA1y+AANdFAADXXUAA14mAANe7wADX04AAAAHAon9DcACrI/AAqyVwAKzugOGvAAAAWCJbgAABASJ/w3AAqzLwAKs2QmFzABggnsABIoADcACrPLAAqz/CYUXAF3AAPx0AWCIswAEigENwAKtIsACrS0Jhc0AXcAA/KUCYIJ7YIluAASKAw3AArFgwAKxbxiGsYIuAGDAAPvQASsBBYoPDcACrTLAAq0ywAKtfQAAAAPAAq1CwAKtfQAAAAMDA8ACrUgAAASFzGCCewDAAq1dAAAEhRddwAD8dAFgiLMAwAKtcQAABIXNXcAA/KUCYIJ7YIluAABgif0BPwQIAYn/gADAA2AWCAGKAIEAwANgIwgBigGCAMADYDYJAcACrTKJeQAAAAAIBooFDcACrYLAAq2MwAKtrwEAhOIAAAABA8ACrZbAAq2vAAAAAAAAAGCDFAFKwAKtmQEWwAKtqBbAAq2ZLoXMif+EaoKDBooIDcACrbTAAq20wAKu8AAAhE4AAAABA8ACrcHAAq7wAAAAAQEBwAKtygAAAIDyXZnOAVsAAFwBPgQ9HMACreoWwAKt4hbAAq3TLoXMif+EaoKDhO8BAAGAwAKt+sADYOoAg1E9HsACrgKCNQIAAhbAAq4MLoUXigCAwAKuG8ADYOoARsACriPAAq5XwAKuOAAAAYReYIJ7ABbAAq5RFsACrkUuhc2KAYNiwAD8xz4BPRzAAq5xFsACrmmBwAKuX8ADYVCEboKFhO8BAAGAwAKugcADYOoAg51GwAKuj8ACrsPAAq6jAAABhf9giW4AFsACrrsWwAKury6FzYoBKcAA/Mg+AT0cwAKu1IHAAq7LwANhpoTvAQABgMACruTAA2DqAIlyBooJDcACrvXAAq71wAKvLwAAhE0AAAABA8ACrvvAAq8vAAAAAQEBwAKvDAAAAIDyXZlZAVsAAFsBSsACrxIBHMACrxSAwAKvEsADYhCGvQEAAS4AmWUGigoNwAKvM8ACrzPAAq93AACE7wAAAAEDwAKvQsACr3cAAAABAQHAAq9LAAAAgPJdmc4BWwAAWwFKwAKvUQEcwAKvU4DAAq9RwANiZoa+AQABLgCZ9gaKCw3AAq98wAKvg8ACsVcAACMAAAABA8ACr4vAArFXAAAAAAAAAGDAAP22AT4HTsACr5rAAq+dAAGD5GDAAP4AAR/AAq+jwAD+HwAAAAA9HMACr7qAwAKvt8ADYsWCigEAASTAAq/bARbAAq/SFsACr8MuhcyJ/4RqgoMAwAD+FEnAAq/iIRbAArANFsACr/4WwAKv9hbAAq/nLoXMif+EaoKDhLiDI4FVwAD8Vj4DPRzAArAhgMACsB7AA2LFgooBAAEnYwDAAP4UPRzAArA2gMACsDPAA2LFgooBAAEcwAKwaRzAArBKFsACsDwuhReKAICrAQFgwAD9tgE0wAKwTgPAArBOwAKwZwAAAAEBAcACsE8AAACCkGCIswAAYMAA/bYBSsACsFgBHMACsF2BwAKwWMADY6YjAAAAAIJPAMAA/D1YAQABJ4GLAMAA/EYAwAD+FD0cwAKwf4DAArB8wANixYKKAQABJ4CXAMAA/hQ/PRzAArCYgMACsJXAA2LFgooBAAEnhr8AwAD+FD0cwAKwtRbAArCpLoXNigGD+AEAATTAArC9A8ACsL3AArElAAAAAgICwAKwyAAAAIXRYIJ7AMACsNsAAACF/2CJbgAAYMAA/NkBPgE9HMACsPCAwAKw7cADYsWCigEAASTAArEdBBbAArEKFsACsQKBwAKw+cADZE2EboKFgL2DXSeDVYLAArESwANkWieBiwDAAP4UAMAA/MQ9HMACsS+AwAKxLMADYsWCigEAASeGwADAAP4USsACsT8BHMACsUmAwAKxRsADYsUjAAAAAMAA/hkGigYNwAKxc8ACsXvAArI4AQCDwQAAAAEDwAKxhMACsjgAAAAAAAAAYMAA+9ABPgFKwAKxigE1AAAAAQBgwAD70AEWwAKxkS6GsYIuigMjHMACsaGAAMADZS5IAQABKwDAAPzzF8ACsZEuhrGCLh7AArGrirUDAAMWwAKx0hbAArHDLoXMif+DwcAA/S8ewAKx5IJCAQABFsACsfEuhReKAAAewAKyD4q5AQABFsACsicuhc2KAQAAigOAAMADZS4BYMAA+9AGigwNwAKyPcACskvAArNXAwBIAAAAAQPAArJNwAKzVwAAAAEBAcACslUAAACD1mDAAP0cAABgwAD6CgE+AUrAArJiASIewAKyacAA9bECAAIugMACsnnAA2XjAAEiIiIlwAKykoDAArKMwANl42CJ/QAcwAKyyhbAArK7FMACsrXAA2XjAAFgif2FzIn/SAEAARbAArLNLoXMif8AwAD9KQAewAKy64JGAgACFsACsvwUwAKy9sADZeMAAWCJ/YUXigAWwAKzCy6FF4oAAAAewAKzKYJHAgACFsACszkUwAKzM8ADZeMAAWCJ/YXNigEWwAKzRi6FzYoBAAaKDQ3AArNcwAKzZcACs7gAAIaYAAAAAQPAArNswAKzuAAAAAEBAcACs30AAACFZ2CbTAAAYIizAUrAArONAR/AArORiP4CAAIWwAKzny6E4ooFFsACs6ouhReKAAAAAANgfgADYMMAA2HpAANiPwADYpUAA2T3AANlvQADZrgAA2cWAAAACAKKEA3AArO9wAKzw8ACuG4DhsEAAAFgiW4AAAIEihINwAK0C8ACtBoJhsIAYIofAASKEw3AArQzwAK0OAmFZwBdwAD8dAFgiLMAAQWKHg3AArQ9wAK0PcACtHsAAAADwAK0WcACtHsAAAACAgLAArRfAAAEhsJgih8AwAK0dQAABIVnXcAA/HQBYIizAABgihABPwMIAYoSgADAA2esCAGKE4EAwANnuQkBwAK0PYl5AAAAAAcGihUNwAK0gMACtIDAArTeAACETgAAAAEDwAK0jcACtN4AAAABAQHAArSWAAAAgPJdmc4BWwAAXAE+Aj0cwAK0rxbAArSfLobCihKE7wEAAYDAArS/wANoGwCKKD0ewAK0x4I1AgACFsACtNEuhWeKE4DAArTYwANoGwAGihYNwAK048ACtOPAArUpAACETQAAAAEDwAK06cACtSkAAAABAQHAArT6AAAAgPJdmVkBWwAAWwFKwAK1AAEcwAK1AoDAArUAwANolobDAQABLgCZZgaKFw3AArUtwAK1LcACtYMAAITvAAAAAQPAArU8wAK1gwAAAAEBAcACtUUAAACA8l2ZzgFbAABbAUrAArVRARzAArVTgMACtVHAA2jshsQBAAEuAJn3BooYDcACtYjAArWPwAK17gAAIwAAAAEDwAK1l8ACte4AAAAAAAAAYMAA/bYBPgFKwAK1oAEkwAK16gYWwAK1qi6FgMAA/TAng9cWwAK1yRbAArW5LobCihKEkIojJ2McwAK13BbAArXWLoVnihNYAQABJ4GLAMAA/EYnhsUGihwNwAK188ACtfvAArZZAQCDwQAAAAEDwAK2BMACtlkAAAAAAAAAYMAA+9ABSsACtgcBHsACtg2KswIAAhbAArYyFsACtiIuhsKKEoPBiiQewAK2Qoq3AQABFsACtlIuhWeKEwAABooZDcACtl7AArZswAK3EQMASAAAAAEDwAK2bsACtxEAAAABAQHAArZ2AAAAg9ZgwAD9HAAAYMAA+goBPgFKwAK2gwEiIiXAAraQgMACtorAA2olYIoQABzAArbRFsACtsEUwAK2u8ADaiUAAWCKEIbCihJIAQABFsACttQuhsKKEgCKKgAewAK274JGAgACFsACtwAUwAK2+sADaiUAAWCKEIVnihMWwAK3By6FZ4oTAAaKGg3AArcWwAK3H8ACuGwAAIaYAAAAAQPAArcmwAK4bAAAAAEBAcACtzcAAACGxmCbTAAAYIizAT4ETsACt2HAArdmAAGCkGCJAAEcwAK3eBbAArdoLobCihKGmAEAAYDAAreAwANq2ACKK07AArecwAK3pAABhsddwAD8pQJgiUpgiLMBMsACt79giUpgiLMARsACt8fAArf0wAK30gAAAYDtYIlKABbAArfkgcACt9/AA2rthLiJAj4BPRzAArgDgsACt/zAA2segL8CAAKDwAK4BMADa0wcwAK4FhbAArgRLoVnihNLAQABFsACuB+CwAK4F8ADax5hwAD8yQDAAPyDAMAA/LpKwAK4MgEewAK4OZqoAgACFsACuEmBwAK4RMADau2FqYkOgsACuGDAA2seAAAAA2f0AANobwADaMUAA2kbAANpmAADaf8AA2qxAANr5gAAAAcCih8NwAK4ccACuHfAArvMA4bIAAABYIluAAABBIohDcACuKzAAri+CYbJAGCCewACBYotDcACuMPAArjDwAK5PQAAAAPAArjSwAK5PQAAAAEBAcACuN0AAACEkGCD5QAAYIofAT4BQBbAArkwgMACuSbAA2xehBmD98ACuSbAArk4AAIIAIohFsACuQ+AwAK5BcADbF6EXoJqCQHAArjDiXkAAAAABYouDcACuULAArlCwAK5dgCEpAADwAK5XcACuXYAAAABAQHAArljAAAEhslggnsAAGCKHwE/AggBiiGAAMADbNQJAcACuUKJeQAAAAAIBoojDcACuXvAArmJwAK5tQEAhJAAAAABA8ACuZPAArm1AAAAAAAAAGCD5QFKwAK5lgE1AAAAAQBggnsBFsACuZYuhsmKISMcwAK5qoAAwANtMkgBAAErAAArFsACuaqAAMADbTKEcoKHAWCD5QaKJg3AArm6wAK5usACug4AAIROAAAAAQPAArnHwAK6DgAAAAEBAcACudAAAACA8l2ZzgFbAABcAT4BPRzAArn4FsACuewWwAK52S6GyYohhHKCh4TvAQABgMACugjAA22TAIQaBoonDcACuhPAAroTwAK6TAAAhE0AAAABA8ACuhnAArpMAAAAAQEBwAK6KgAAAIDyXZlZAVsAAFsBSsACujABHMACujKAwAK6MMADbfiGygEAAS4AmWcGiigNwAK6UMACulDAArqTAACE7wAAAAEDwAK6X8ACupMAAAABAQHAArpoAAAAgPJdmc4BWwAAWwFKwAK6bgEcwAK6cIDAArpuwANuTobLAQABLgCZ+AaKKQ3AArqYwAK6n8ACutkAACMAAAABA8ACuqfAArrZAAAAAAAAAGDAAP22AT4BSsACurABJMACutUEFsACurouhYDAAP0wJ4PXFsACuskuhJCKIyeDIQaKJA3AArrewAK65sACuwQBAIPBAAAAAQPAArrvwAK7BAAAAAAAAABgwAD70AFKwAK68gEWwAK6/BbAArryLoSQiiODwYJWBooqDcACuwnAArsXwAK7cQMASAAAAAEDwAK7GcACu3EAAAABAQHAArshAAAAg9ZgwAD9HAAAYMAA+goBPgFKwAK7LgEiJcACuzuAwAK7NcADb0Fgih8AHMACu2EWwAK7VxTAArtRwANvQQABYIofhJCKI0gBAAEWwAK7ZC6EkIojAMAA/SkGiisNwAK7dsACu4PAArvKAACGmAAAAAEDwAK7isACu8oAAAABAQHAArubAAAAhWdgm0wAAGCJAAFKwAK7qwEWwAK7vhbAAru1FsACu6suhJCKI4Jqg+qFNYSVAAADbP8AA21sAANt0QADbicAA259AANu1AADbxsAA2+hAANv/AAAAAgCii8NwAK7z8ACu9XAAr33A4bMAAABYIluAAABBIoxDcACvA3AArwRCYKQAGCIswABBYo8DcACvBbAArwWwAK8NAAAAAPAArwpwAK8NAAAAAEBAcACvC8AAASCkGCIswAAYIovAT8CCAGKMYAAwANweAkBwAK8Fol5AAAAAAcGijMNwAK8OcACvDnAArxqAACETgAAAAEDwAK8RsACvGoAAAABAQHAArxPAAAAgPJdmc4BWwAAXAE+AT0cwAK8XRbAArxYLoKQijGETQEAAYDAArxkwANwygCItQaKNA3AArxvwAK8b8ACvKwAAIRNAAAAAQPAArx1wAK8rAAAAAEBAcACvIYAAACA8l2ZWQFbAABbAUrAAryMARzAAryOgMACvIzAA3Emhs0BAAEuAJloBoo1DcACvLDAArywwAK89wAAhO8AAAABA8ACvL/AArz3AAAAAQEBwAK8yAAAAIDyXZnOAVsAAFsBSsACvM4BHMACvNCAwAK8zsADcXyGzgEAAS4AmfkGijYNwAK8/MACvQPAAr0qAAAjAAAAAQPAAr0LwAK9KgAAAAAAAABgwAD9tgFKwAK9EQEkwAK9KgQWwAK9FC6FgMAA/TAng9cWwAK9Iy6CkIoxJ4MhBoo6DcACvS/AAr03wAK9UAEAg8EAAAABA8ACvUDAAr1QAAAAAAAAAGDAAPvQAUrAAr1DARbAAr1IFsACvUMugpCKMYPBwAD9LwaKNw3AAr1VwAK9Y8ACvbcDAEgAAAABA8ACvWXAAr23AAAAAQEBwAK9bQAAAIPWYMAA/RwAAGDAAPoKAT4BSsACvXoBIiXAAr2HgMACvYHAA3JvYIovABzAAr2sFsACvacUwAK9ocADcm8AAWCKL4KQijFIAQABFsACva8ugpCKMQCItwaKOA3AAr28wAK9xcACvfUAAIaYAAAAAQPAAr3MwAK99QAAAAEBAcACvd0AAACFZ2CbTAAAYIizAUrAAr3nARbAAr3tgMACvefAA3L0hYGbXwAAA3CjAANw/wADcVUAA3GrAANyAAADckkAA3LNAANzHgAAAAcCij0NwAK9+sACvgDAAr/jA4bPAAABYIluAAABBIo/DcACvjrAAr5ECYJrAGCEqQABBYpHDcACvknAAr5JwAK+kQAAAAPAAr5cwAK+kQAAAAEBAcACvmIAAASCa2CEqQAAYIo9AT4BPTUAAAABAGCEqQEWwAK+dC6Ca4o/IxzAAr6AgQDAA3OsSAEAASsAACsXwAK+gIEAwANzrIRSK4JYAWDAAPzZAggBij+AAMADc5YJAcACvkmJeQAAAAAFBopBDcACvpbAAr6WwAK+zQAAhE4AAAABA8ACvqPAAr7NAAAAAQEBwAK+rAAAAIDyXZnOAVsAAFwBPgE9HMACvsAWwAK+tS6Ca4o/hE0BAAGAwAK+x8ADdCgAhK0GikINwAK+0sACvtLAAr8PAACETQAAAAEDwAK+2MACvw8AAAABAQHAAr7pAAAAgPJdmVkBWwAAWwFKwAK+7wEcwAK+8YDAAr7vwAN0hIbQAQABLgCZaQaKQw3AAr8TwAK/E8ACv1oAAITvAAAAAQPAAr8iwAK/WgAAAAEBAcACvysAAACA8l2ZzgFbAABbAUrAAr8xARzAAr8zgMACvzHAA3TahtEBAAEuAJn6BopEDcACv1/AAr9owAK/qQAAhpgAAAABA8ACv2/AAr+pAAAAAQEBwAK/gAAAAIVnYJtMAABgiLMBSsACv4oBHMACv5UWwAK/ii6Ca4o/hWYBAAGAwAK/o8ADdTAAhKsGikUNwAK/rsACv8XAAr/hAACGmQFqwAK/r2DAAP0cAgAAAQPAAr/RwAK/4QAAAAAAAABghKkBSsACv9cBFsACv9cugmuKPwAAA3QBAAN0XQADdLMAA3UJAAN1aAADda8AAAAFAopIDcACwNzAAsDiwALLTwOCBQAAAWCCUgAABgSKSg3AAsEVwALBGQmG0gBgmnoABIpLDcACwdLAAsHgGIR9AF3AAPx0AWDAAP22ASsEikwNwALB+cACwgIJhtMAXcAA/HQBYIKLAASKTQ3AAsLiwALC7QmG1ABdwAD8pQJgwAD+N2CKoAAEik4NwALDf8ACw7cJhtUAXcAA/KUCYMAA/bZdimoBWwEywALDtWDAAP22XYpqAVsABIpPDcACxALAAsQQGIbWAGCCewErAQWKYA3AAsQVwALEFcACxTQAAAADwALEHsACxTQAAAADAAADwALENQAAAIbXYJp6AWoAYMAA/Nl3wALEUwAAAIbTXcAA/HQBYIKLAWoAYMAA/Nl3wALEdQAAAIbUXcAA/KUCYMAA/jdgiqABagBgwAD82XdgikgBPgE9HMACxSEuhtgAAAAAilEECACKSjUAAAABAGCaegGAwALEksADdrwjHMACxJuDAMADdydIAQABKwAAH8ACxKKanAAAAACDAMADdycBYJp6CACKTDUAAAABAF3AAPx0AWCCiwGBwALEzMADdtEjHMACxNaDAMADd2ZIAQABKwAAMcACxOJggosAgwDAA3dmAV3AAPx0AWCCiwgAik01AAAAAQBdwAD8pQJgwAD+N2CKoAGCwALE/MADduwjHMACxQiDAMADd69IAQABKwAAMsACxRhgwAD+N2CKoACDAMADd68BXcAA/KUCYMAA/jdgiqAJAcACxBWCZwAAAAAMBopRDcACxTnAAsU+wALHBAAAhtgAAAABA8ACxUvAAscEAAAAAAAAAFwBPgFJwALFVCEcwALFYhbAAsVYLobTikxIAQABKwDAAP0pPgFFwALFcwHAAsV8wALFfgAAYmDAAPvQAZMBHMACxYWAwALFg8ADeGJjAQABFsACxZEWwALFhy6G04pMYcAA/KMAwAD8/QGIwALFm8ADeGIcwALFmYDAAsWbwAN4YmQBAAGUAMAA/PU+BE7AAsYhwALGKQAAhENggosBHMACxjQWwALGKy6G04pMSwEAAYDAAsY1wAN4YgDAAPyDPRfAAsZJgcACxkHAA3jFhFIuglhOwALGbsACxnMAAIC9YJp6ARbAAsaHFsACxn2BwALGdcADeMWEXoJqhF+CfUnAAsaeIiEcwALGp4LAAsaiwAN5C0gBAAErAMAA/SkAIRzAAsa+FsACxreCwALGssADeQuEUpqESAEAARbAAsbBLobSikoAwAD9KT4BPRzAAsbYFsACxtMuhtKKSobZAQABgsACxuPAA3kLAJqRPz8GilINwALHCcACxw7AAseWAACEkwAAAAEDwALHI8ACx5YAAAAAAAAAXAE+AUXAAscsAcACxzXAAsc3AABiYMAA+9ABkwEcwALHPoDAAsc8wAN52GMBAAEWwALHShbAAsdALobTikxhwAD8owDAAPz9AYjAAsdUwAN52BzAAsdSgMACx1TAA3nYZAEAAZQAwAD89T4BPRzAAsdfLobaAQABHMACx4gWwALHfy6G04pMSwEAAYDAAseJwAN52ADAAPyDAIpTBopTDcACx5vAAsegwALIQQAAhtoAAAABA8ACx7/AAshBAAAAAQEBwALHyAAAAIRDYIKLAABcAT4CPRzAAsf/HMACx9wWwALH1y6G0opKhtsBAAEWwALH9IDAAsfswAN6kYR3go0AmoyElQEAARbAAsgOgMACyAbAA3qRhF6CagCakz0cwALIJoDAAsgewAN6kYSTAAAAAIKvBopUDcACyEbAAshLwALIfAAAhtwAAAABA8ACyF/AAsh8AAAAAAAAAFwBPgE9HMACyG0WwALIaC6G0opKht0AAAAAmpUGilsNwALIgcACyI/AAsi4AQCCVgAAAAEDwALImsACyLgAAAAAAAAAYIPlAUrAAsidATUAAAABAGCCewEWwALInS6G1opPIxzAAsitgADAA3t6SAEAASsAACsWwALIrYAAwAN7eoRygocBYIPlBopeDcACyL3AAsjGwALJFAIAglYAAAABA8ACyNDAAskUAAAAAQEBwALI2wAAAIHnYIPlAABcAT4BPRfAAsjnLobWHsACyPiCPQEAAYDAAskLwAN72wCKTwaKVQ3AAskZwALJGcACyUgAAIRNAAAAAQPAAskfwALJSAAAAAEBAcACySwAAACA8l2Y2gFbAABbAUrAAskyARzAAsk0gMACyTLAA3wzht4BAAEuAJk8BopWDcACyU3AAslNwALJqwAAhE4AAAABA8ACyVrAAsmrAAAAAQEBwALJYwAAAIDyXZnOAVsAAFwBPgI9HsACyWyCNQIAAhbAAsl2LobTikyAwALJgcADfIkAPTUAAAABAGCD5QEWwALJiS6CVopbIxzAAsmVgQDAA3y+SAEAASsAACscwALJlYEAwAN8voTvAQABgMACyaXAA3yJAIQaAVsGilcNwALJsMACybDAAsn8AACEVAAAAAEDwALJwcACyfwAAAABAQHAAsnOAAAAgPJgmgoAAFsBPgE9HsACydeCOQMAAxbAAsnlLobTikyAwALJ8MADfSouAAaKXA3AAsoBwALKD8ACyikBAIRaAAAAAQPAAsoiwALKKQAAAAAAAABgikgBSsACyiUBLgaKWA3AAsp3wALKgMACyt8AAIbfAAAAAQPAAsqLwALK3wAAAAICAsACypAAAACBu2DAAP43AMACypoAAACDXGDAAPvQAABgimEBPgFKwALKqAE1AAAAAQBgiqABHMACyroWwALKry6G1IpNSwEAAYDAAsq7wAN9tgDAAPy5IxzAAsrCggDAA33iSAEAASsAACscwALKwoIAwAN94obfAgACgMACys7AA322gcACytTAA33FAIqpAWCKYQaKWQ3AAsrkwALK6cACy00AAIbgAAAAAQPAAsr+wALLTQAAAAEBAcACyxIAAACG4V2KagFbAABcAT4BPRzAAsssFsACyyQuhtWKToC/AgACFsACyziAwALLLcADfnCD54psgMACyz/AA35wAMAA/LoAAAN4DwADeaYAA3pqAAN7AwADe0cAA3u0AAN8DAADfGIAA30DAAN9XAADfY8AA35JAAN+uQAAAAwCimENwALLr8ACy7XAAsxvA4biAAABYMAA/RwAAAMEimMNwALLzMACy9AJgbsAYMAA/jcABIpkDcACy97AAsviCYH6AGDAAPvQAASKZQ3AAsv8wALMAgmG4wBgwAD70AABBYppDcACzBPAAswTwALMPgAAAAPAAswbwALMPgAAAAMDA8ACzCEAAASBu2DAAP43AMACzCwAAASB+mDAAPvQAMACzDcAAASG42DAAPvQAABgimEBPwQIAYpjgADAA391CAGKZIEAwAN/hAgBimWCAMADf5MJAcACzBPAAP0yAAAAAAEGimcNwALMQ8ACzErAAsxtAAAjAAAAAQPAAsxSwALMbQAAAAAAAABgwAD9tgFKwALMWAEkwALMbQUWwALMWi6Bu4pjJ4LmFsACzGAugfqKZCeC5hbAAsxmLobjimUAAAN/1gADgDMAAAABAopqDcACzHLAAsyBwALSzAeG5AABAACCdmDAAP0cAVsBYMAA/RwAAAABBYpzAAAAAAQAAAMAAAAAAAAA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AAEng6UAwAD9xT4BPYrAAuT/wAON2hzAAuT9gsAC5P/AA43agY0BAAGUAMAA/PY/SsAC5TEBHMAC5UMWwALlOC6HCIqmgL4CAAIcwALlVxbAAuVNLocHiqJLAQABgcAC5VjAA4z8AMAA/IOCwALlYMADjdoAwAD9zD89MMAC5cYnhw0GiqkNwALmLsAC5jfAAukRAACG3wAAAAEDwALmQsAC6REAAAACAgLAAuZHAAAAgbtgwAD+NwDAAuZRAAAAg1xgwAD70AAAYIphAT4KScAC5l8iHMAC5m4WwALmYy6HB4qiSAEAASsAwAD9KQEWwALmhBbAAuZ5LocHiqKBVcAA/FY+AUrAAuaVAR/AAuagimkDAAOAwALmqcADjzZqwALmuGDAAPvQgZxqwALmy2DAAPvQgZwAPz0ewALm68AA+w8EAASBwALnAMADj0WTFsAC5xYWwALnCy6HB4qigejAAPxZJ4NcAE7AAucvwALnMwAAg75gwAD70AGTTsAC5zjAAuc9AACDvWDAAPvQARzAAudRFsAC50oWwALnPy6HB4qiYcAA/KOBjQEAAZQAwAD89kPAAudaHMAC52WCwALnYcADj/ZjAQABg8AC52fAA5AKAMAA/P0+A07AAud5wALnfQAAhw5gwAD70AEcwALnhIPAAud/wAOQCoGNAQABHMAC55QcwALnjYPAAueIwAOQCoGNAQABgsAC54/AA4/2AMAA/PaDvAEAAZQAwAD77QDAAPz2TsAC58HAAufHAACGgGDAAPvQARzAAufTFsAC58kuhweKoksBAAGEwALn1MADkGgAwAD8g0nAAufgHMAC5+qFwALn5MADkMSBawEAAYHAAuftwAOPRQDAAPz+PgE9isAC5//AA4/2hMAC6AXAA5BoPgE9i8AC6CHAA5AKHMAC6CyEwALoKMADkGiBjQEAAZQAwAD89k7AAuhHwALoUQAAhw9gwAD70AGCwALoU8ADj/ZOwALoYMAC6GoAAIcQYMAA+9ABHMAC6HYWwALobC6HB4qiSwEAAYTAAuh3wAORWADAAPyDTsAC6IvAAuiWAACHEWDAAPvQARzAAuialGQBAAGEwALonMADkVgAwAD89U7AAuivwALovAAAhxJgwAD70AEcwALoyRzAAujAlGQBAAGBwALowsADj0UAwAD89YGNAQABhcAC6MvAA5F0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pGCRVI+VBIxcF8AAYh3AAGLuBolKAGCRVAFqwABiUWCRVI+VBIxdF8AAYzvAAGOVBolLAF2RPgFgwAD82QFqwABjamCRVI+8BIxeF8AAY+PAAGUiBolPAGCRVAFqwABkF2CRVI+8BIxfF8AAZW/AAGW/BolQAF2RPgFgwAD82QFqwABlmWCRVIc1BIxgF8AAZg3AAGcZBofMAGCRVAFqwABmPGCRVIc1BIxhF8AAZ2bAAGe2BolRAF2RPgFgwAD82QFqwABnkGCRVIdfBIxiF8AAaATAAGkHBofNAGCRVAFqwABoM2CRVIdfBIxjF8AAaXXAAGsDBolSAF2RYAFhAWDAAP22YJFJAWrAAGm3XZFgAWEBYMAA/bZgkUmP5ASMZBfAAGttwABsgwaJVQBdkT4BYQFgwAD9tmCRSQFqwABrq12RPgFhAWDAAP22YJFJkA4EjGUXwABvEMAAcFgGiVgAXZFgAWEBYMAA/bZgkUkBasAAbz5dkWABYQFgwAD9tmCRSZA6BIxmF8AAcMDAAHGoBolbAF2RPgFhAWDAAP22YJFJAWrAAHDuXZE+AWEBYMAA/bZgkUmQZASMZxfAAHPEwAB1MwaJXgBdkWABYQFgwAD9tmCRSQFqwAB0AF2RYAFhAWDAAP22YJFJkI0EjGgXwAB1ncAAdqEGiWAAXZE+AWEBYMAA/bZgkUkBasAAddVdkT4BYQFgwAD9tmCRSZCrBIxpF8AAeQbAAHnSBofSAF2RYAFhAmDAAP43YMAA/bZgkUkBasAAeSddkWABYQJgwAD+N2DAAP22YJFJh4QEjGoXwAB6RMAAevYGiWIAXZE+AWECYMAA/jdgwAD9tmCRSQFqwAB6YV2RPgFhAmDAAP43YMAA/bZgkUmQ3QSMaxfAAHzLwAB92AaJZQBdkWABYQFgnqtgkUkBasAAfQRdkWABYQFgnqtgkUmRCwSMbBfAAH5CwAB/PQaJZwBdkT4BYQFgnqtgkUkBasAAfnddkT4BYQFgnqtgkUmRMgSMbRfAAIEWwACC2waJagBdkWABYQFgnqtgkUkBasAAgUZdkWABYQFgnqtgkUmRXASMbhfAAINBwACEIQaJbQBdkT4BYQFgnqtgkUkBasAAg3FdkT4BYQFgnqtgkUmRhASMbxfAAIZ9wACGwQaJcABdkT4BYMAA/NkBasAAhqFgkVSRtwSMcBfAAIcPwACH6QaJdABgkVQBasAAhzhgkVSRtwSMcRfAAIg2wACIfAaJdQBdkT4BYMAA/NkBasAAiFtgkVSR3wSMchfAAIjKwACJ/waJeQBgkVQBasAAiPRgkVSR3wSMcxfAAIpMwACKcAaJegBdkT4BYMAA/NkBasAAil5gkVSSCwSMdBfAAIq+wACL1gaJfgBgkVQBasAAitlgkVSSCwSMdRfAAIwjwACMaQaJfwBdkT4BYMAA/NkBasAAjEhgkVSSMASMdhfAAIy3wACN8gaJgQBgkVQBasAAjOFgkVSSMASMdxfAAI4/wACOZQaJggBdkT4BYMAA/NkBasAAjlJgkVSSWwSMeBfAAI6zwACPdgaJhgBgkVQBasAAjs9gkVSSWwSMeRfAAI/DwACP8QaJhwBdkT4BYMAA/NkBasAAj9pgkVSShgSMehfAAJA/wACREgaJiwBgkVQBasAAkF9gkVSShgSMexfAAJGswACTHQaJjABdkWABYQJgwAD9tmDAAP22YJFJAWrAAJHaXZFgAWECYMAA/bZgwAD9tmCRSZKuBIx8F8AAk5XAAJSCBomPAF2RPgFhAmDAAP22YMAA/bZgkUkBasAAk8NdkT4BYQJgwAD9tmDAAP22YJFJkt0EjH0XwACXkMAAmM4GiZIAXZFgAWECYMAA/bZgwAD9tmCRSQFqwACXtV2RYAFhAmDAAP22YMAA/bZgkUmTDgSMfhfAAJlKwACZ9gaJlQBdkT4BYQJgwAD9tmDAAP22YJFJAWrAAJlvXZE+AWECYMAA/bZgwAD9tmCRSZM0BIx/F8AAnE3AAJ0mBomXAF2RYAFhAWDAAP22YJFJAWrAAJx6XZFgAWEBYMAA/bZgkUmTYQSMgBfAAJ2MwACeXgaJmQBdkT4BYQFgwAD9tmCRSQFqwACdtV2RPgFhAWDAAP22YJFJk4oEjIEXwACgLsAAoPsGiZwAXZFgAWEBYMAA/bZgkUkBasAAoFddkWABYQFgwAD9tmCRSZOzBIyCF8AAoWHAAKHmBomeAF2RPgFhAWDAAP22YJFJAWrAAKGGXZE+AWEBYMAA/bZgkUmT0ASMgxfAAKOqwACkdAaJoABdkWABYQFgwAD9tmCRSQFqwACj0l2RYAFhAWDAAP22YJFJk/gEjIQXwACk2sAApZgGiaIAXZE+AWEBYMAA/bZgkUkBasAApP5dkT4BYQFgwAD9tmCRSZQhBIyFF8AAp13AAKg1BomlAF2RYAFhAWDAAP22YJFJAWrAAKeMXZFgAWEBYMAA/bZgkUmURwSMhhfAAKibwACpnQaJpgBdkT4BYQFgwAD9tmCRSQFqwACoxl2RPgFhAWDAAP22YJFJlGQEjIcXwACrbMAArDYGiagAXZFgAWEBYMAA/bZgkUkBasAAq5RdkWABYQFgwAD9tmCRSZSNBIyIF8AArJzAAK1aBomqAF2RPgFhAWDAAP22YJFJAWrAAKzAXZE+AWEBYMAA/bZgkUmUqgSMiRfAAK8fwACv9waJrABdkWABYQFgwAD9tmCRSQFqwACvTl2RYAFhAWDAAP22YJFJlNAEjIoXwACwXcAAsV8Gia0AXZE+AWEBYMAA/bZgkUkBasAAsIhdkT4BYQFgwAD9tmCRSZTtBIyLF8AAszLAALQPBomvAF2RYAFhAWDAAP22YJFJAWrAALNgXZFgAWEBYMAA/bZgkUmVFgSMjBfAALR1wAC1VAaJsQBdkT4BYQFgwAD9tmCRSQFqwAC0n12RPgFhAWDAAP22YJFJlT8EjI0XwAC3C8AAt1kGibQAXZE+AWDAAPzZAWrAALc0YJFUlWgEjI4XwAC3p8AAuFcGibcAYJFUAWrAALfVYJFUlWgEjI8XwAC4pMAAuMwGibgAXZE+AWDAAPzZAWrAALi4YJFUlZIEjJAXwAC5GsAAufYGibwAYJFUAWrAALk3YJFUlZIEjJEXwAC6Q8AAumUGib0AXZE+AWDAAPzZAWrAALpUYJFUlb0EjJIXwAC6s8AAu/IGicEAYJFUAWrAALrNYJFUlb0EjJMXwAC8P8AAvIsGicIAXZE+AWDAAPzZAWrAALxnYJFUle4EjJQXwAC82cAAvc4GicYAYJFUAWrAAL0GYJFUle4EjJUXwAC+G8AAvnEGiccAXZE+AWDAAPzZAWrAAL5IYJFUlhMEjJYXwAC+v8AAv4sGicoAYJFUAWrAAL7xYJFUlhMEjJcXwAC/2MAAwDQGicsAXZE+AWDAAPzZAWrAAMAIYJFUljcEjJgXwADAgsAAwVIGic4AYJFUAWrAAMC7YJFUljcEjJkXwADBn8AAwd0Gic8AXZE+AWDAAPzZAWrAAMG+YJFUlmoEjJoXwADCK8AAwz0GidQAYJFUAWrAAMJTYJFUlmoEjJsX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XZFgAWEBYMAA/bZgkUkBasACZ/BdkWABYQFgwAD9tmCRSbagBI2iF8ACaPzAAmmNBow+AF2RPgFhAWDAAP22YJFJAWrAAmklXZE+AWEBYMAA/bZgkUm2vQSNoxfAAms6wAJrZAaMQABdkT4BYMAA/NkBasACa09gkVS25QSNpBfAAmuywAJ2rQaMQwBgkVQBasACa9RgkVS25QSNpRfAAnb6wAJ3JgaMRABdkT4BYMAA/NkBasACdxBgkVS3CQSNphfAAnd0wAJ4WgaMRwBgkVQBasACd5dgkVS3CQSNpxfAAnjcwAJ5yQaMSABdkWABYQJgiLNgiLNgkUkBasACeQRdkWABYQJgiLNgiLNgkUm3LQSNqBfAAnpHwAJ63QaMSgBdkT4BYQJgiLNgiLNgkUkBasACemtdkT4BYQJgiLNgiLNgkUm3SwSNqRfAAn1+wAJ+ggaMTABdkWABYQFgwAD9tmCRSQFqwAJ9tF2RYAFhAWDAAP22YJFJt3QEjaoXwAJ+7MACf5gGjE4AXZE+AWEBYMAA/bZgkUkBasACfx5dkT4BYQFgwAD9tmCRSbeRBI2rF8ACgYzAAoLJBoxQAF2RYAFhAWDAAP22YJFJAWrAAoGvXZFgAWEBYMAA/bZgkUm3uQSNrBfAAoMvwAKDrgaMUgBdkT4BYQFgwAD9tmCRSQFqwAKDUl2RPgFhAWDAAP22YJFJt9YEja0XwAKF7MAChxQGjFQAXZFgAWEBYMAA/bZgkUkBasAChhBdkWABYQFgwAD9tmCRSbf+BI2uF8ACh3rAAof8BoxWAF2RPgFhAWDAAP22YJFJAWrAAoeeXZE+AWEBYMAA/bZgkUm4GwSNrxfAAoo6wAKLcQaMWABdkWABYQFgwAD9tmCRSQFqwAKKX12RYAFhAWDAAP22YJFJuEMEjbAXwAKL18ACjFwGjFoAXZE+AWEBYMAA/bZgkUkBasACi/xdkT4BYQFgwAD9tmCRSbhgBI2xF8ACjpTAAo+hBoxcAF2RYAFhAWDAAP22YJFJAWrAAo6xXZFgAWEBYMAA/bZgkUm4iASNshfAApAHwAKQdAaMXgBdkT4BYQFgwAD9tmCRSQFqwAKQJF2RPgFhAWDAAP22YJFJuKUEjbMXwAKSfcACk0gGjGAAXZFgAWEBYMAA/bZgkUkBasACkqJdkWABYQFgwAD9tmCRSbjN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wARQ0waOTQBdkT4BYMAA/NkBasAEULxgkVTAAFcnBI6MF8AEUSHABFH2Bo5RAGCRVAFqwARRQWCRVMAAVycEjo0XwARSYMAEUyoGjlIAXZFgAWEBYMAA/bZgkUkBasAEUopdkWABYQFgwAD9tmCRScAAV1IEjo4XwARTkMAEVBgGjlQAXZE+AWEBYMAA/bZgkUkBasAEU7ZdkT4BYQFgwAD9tmCRScAAV3MEjo8XwARVtsAEVeQGjlYAXZE+AWDAAPzZAWrABFXNYJFUwABXogSOkBfABFYywARW8gaOWQBgkVQBasAEVlJgkVTAAFeiBI6RF8AEVz/ABFdxBo5aAF2RPgFgwAD82QFqwARXWGCRVMAAV88EjpIXwARXv8AEWHwGjl0AYJFUAWrABFfhYJFUwABXzwSOkxfABFjJwARZDQaOXgBdkT4BYMAA/NkBasAEWO1gkVTAAFgLBI6UF8AEWVvABFsBBo5jAGCRVAFqwARZhGCRVMAAWAsEjpUXwARba8AEXFAGjmQAXZFgAWEBYJ6rYJFJAWrABFuPXZFgAWEBYJ6rYJFJwABYOQSOlhfABFy2wARdQQaOZgBdkT4BYQFgnqtgkUkBasAEXNZdkT4BYQFgnqtgkUnAAFhbBI6XF8AEXujABF+6Bo5oAF2RYAFhAmDAAP43YMAA/bZgkUkBasAEXw5dkWABYQJgwAD+N2DAAP22YJFJwABYhwSOmBfABGAswARgtAaOagBdkT4BYQJgwAD+N2DAAP22YJFJAWrABGBOXZE+AWECYMAA/jdgwAD9tmCRScAAWK0EjpkXwARicMAEYrQGjmwAXZE+AWDAAPzZAWrABGKUYJFUwABY4QSOmhfABGMCwARkAQaObwBgkVQBasAEYytgkVTAAFjhBI6bF8AEZE7ABGSCBo5wAF2RPgFgwAD82QFqwARkaGCRVMAAWRwEjpwXwARk0MAEZbQGjnUAYJFUAWrABGTzYJFUwABZHASOnRfABGYBwARmPwaOdgBdkT4BYMAA/NkBasAEZiBgkVTAAFlNBI6eF8AEZo3ABGewBo55AGCRVAFqwARmtWCRVMAAWU0Ejp8XwARn/cAEaDMGjnoAXZE+AWDAAPzZAWrABGgYYJFUwABZegSOoBfABGiBwARpcwaOfQBgkVQBasAEaKVgkVTAAFl6BI6hF8AEacDABGoIBo5+AF2RPgFgwAD82QFqwARp5mCRVMAAWbUEjqIXwARqVsAEazwGjoMAYJFUAWrABGqBYJFUwABZtQSOoxfABGuJwARrrQaOhABdkT4BYMAA/NkBasAEa5tgkVTAAFnmBI6kF8AEa/vABG0iBo6IAGCRVAFqwARsFmCRVMAAWeYEjqUXwARtjMAEbngGjokAXZFgAWEBYMAA/bZgkUkBasAEbbJdkWABYQFgwAD9tmCRScAAWhIEjqYXwARu3sAEb5sGjosAXZE+AWEBYMAA/bZgkUkBasAEbwBdkT4BYQFgwAD9tmCRScAAWkEEjqcXwARxd8AEcpkGjo4AXZFgAWEBYMAA/bZgkUkBasAEcZVdkWABYQFgwAD9tmCRScAAWnMEjqgXwARy/8AEc6UGjpEAXZE+AWEBYMAA/bZgkUkBasAEcx1dkT4BYQFgwAD9tmCRScAAWpcEjqkXwAR1n8AEdd0GjpMAXZE+AWDAAPzZAWrABHW+YJFUwABaygSOqhfABHYrwAR3OQaOlwBgkVQBasAEdlNgkVTAAFrKBI6rF8AEd4bABHfWBo6YAF2RPgFgwAD82QFqwAR3sGCRVMAAWwUEjqwXwAR4JMAEeTgGjpwAYJFUAWrABHhTYJFUwABbBQSOrRfABHmkwAR7QwaOnQBdkWABYQFgwAD+N2CRSQFqwAR5y12RYAFhAWDAAP43YJFJwABbMwSOrhfABHumwAR8VAaOoABdkT4BYQFgwAD+N2CRSQFqwAR7zV2RPgFhAWDAAP43YJFJwABbVwSOrxfABH6TwAR+2waOogBdkT4BYMAA/NkBasAEfrlgkVTAAFuRBI6wF8AEfynABIAlBo6mAGCRVAFqwAR/VGCRVMAAW5EEjrEXwASAncAEgaIGjqcAXZFgAWECYMAA/bZgwAD+N2CRSQFqwASAzF2RYAFhAmDAAP22YMAA/jdgkUnAAFu8BI6yF8AEghbABILdBo6pAF2RPgFhAmDAAP22YMAA/jdgkUkBasAEgkFdkT4BYQJgwAD9tmDAAP43YJFJwABb4gSOsxfABIUOwASGEwaOqwBdkWABYQJgwAD9tmDAAP43YJFJAWrABIU9XZFgAWECYMAA/bZgwAD+N2CRScAAXBMEjrQXwASGh8AEh04Gjq0AXZE+AWECYMAA/bZgwAD+N2CRSQFqwASGsl2RPgFhAmDAAP22YMAA/jdgkUnAAFw5BI61F8AEiVTABImiBo6vAF2RPgFgwAD82QFqwASJfWCRVMAAXHgEjrYXwASJ8MAEiwMGjrMAYJFUAWrABIoeYJFUwABceASOtxfABItQwASLlAaOtABdkT4BYMAA/NkBasAEi3RgkVTAAFyjBI64F8AEi+LABIyVBo63AGCRVAFqwASMC2CRVMAAXKMEjrkXwASM4sAEjRoGjrgAXZE+AWDAAPzZAWrABIz+YJFUwABc2QSOuhfABI1owASOPQaOvABgkVQBasAEjY1gkVTAAFzZBI67F8AEjqfABI9jBo69AF2RYAFhAWDAAP22YJFJAWrABI7KXZFgAWEBYMAA/bZgkUnAAF0EBI68F8AEj8nABJCiBo6/AF2RPgFhAWDAAP22YJFJAWrABI/oXZE+AWEBYMAA/bZgkUnAAF0zBI69F8AEkjLABJJmBo7CAF2RPgFgwAD82QFqwASSTGCRVMAAXWIEjr4XwASStMAEk0cGjsUAYJFUAWrABJLXYJFUwABdYgSOvxfABJOUwAST2AaOxgBdkT4BYMAA/NkBasAEk7hgkVTAAF2QBI7AF8AElCbABJT7Bo7KAGCRVAFqwASUT2CRVMAAXZAEjsEXwASVSMAElZYGjssAXZE+AWDAAPzZAWrABJVxYJFUwABdvQSOwhfABJXkwASW3AaOzgBgkVQBasAElhJgkVTAAF29BI7DF8AElynABJdvBo7PAF2RPgFgwAD82QFqwASXTmCRVMAAXe4EjsQXwASXvcAEmPYGjtMAYJFUAWrABJfnYJFUwABd7gSOxRfABJliwASaSgaO1ABdkWABYQFgwAD70GCRSQFqwASZk12RYAFhAWDAAPvQYJFJwABeGwSOxhfABJquwASbbwaO1gBdkT4BYQFgwAD70GCRSQFqwASa212RPgFhAWDAAPvQYJFJwABePASOxxfABJ0IwASdNAaO2ABdkT4BYMAA/NkBasAEnR5gkVTAAF55BI7IF8AEnYLABJ7VBo7dAGCRVAFqwASdoWCRVMAAXnkEjskXwASfIsAEn2AGjt4AXZE+AWDAAPzZAWrABJ9BYJFUwABeqgSOyhfABJ+uwASgrgaO4gBgkVQBasAEn9ZgkVTAAF6qBI7LF8AEoPvABKE/Bo7jAF2RPgFgwAD82QFqwAShH2CRVMAA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ewBdkWABYQFgwAD9tmCRSQFqwAWznl2RYAFhAWDAAP22YJFJwAB1xwSPfBfABbTLwAW11AaQfQBdkT4BYQFgwAD9tmCRSQFqwAW09V2RPgFhAWDAAP22YJFJwAB19gSPfRfABbeXwAW34QaQgABdkT4BYMAA/NkBasAFt75gkVTAAHY2BI9+F8AFuC/ABblsBpCFAGCRVAFqwAW4W2CRVMAAdjYEj38XwAW5ucAFueUGkIYAXZE+AWDAAPzZAWrABbnPYJFUwAB2cgSPgBfABbozwAW66AaQigBgkVQBasAFulJgkVTAAHZyBI+BF8AFuzXABbtvBpCLAF2RPgFgwAD82QFqwAW7UmCRVMAAdqsEj4IXwAW7vcAFvIQGkI8AYJFUAWrABbvjYJFUwAB2qwSPgxfABbzRwAW9GwaQkABdkT4BYMAA/NkBasAFvPhgkVTAAHbWBI+EF8AFvWnABb41BpCTAGCRVAFqwAW9lWCRVMAAdtYEj4UXwAW+gsAFvr4GkJQAXZE+AWDAAPzZAWrABb6gYJFUwAB3DASPhhfABb8MwAXAAQaQmABgkVQBasAFvzNgkVTAAHcMBI+HF8AFwGjABcEsBofWAF2RYAFhAWDAAP43YJFJAWrABcCMXZFgAWEBYMAA/jdgkUmGVQSPiBfABcGPwAXCAgaQmQBdkT4BYQFgwAD+N2CRSQFqwAXBr12RPgFhAWDAAP43YJFJwAB3NASPiRfABcOcwAXE+AaH1wBdkWABYQFgwAD+N2CRSQFqwAXDxV2RYAFhAWDAAP43YJFJhvEEj4oXwAXFW8AFxekGkJsAXZE+AWEBYMAA/jdgkUkBasAFxYRdkT4BYQFgwAD+N2CRScAAd1sEj4sXwAXH/8AFyMIGh9gAXZFgAWEBYMAA/jdgkUkBasAFyCZdkWABYQFgwAD+N2CRSYZ1BI+MF8AFySXABcmhBpCdAF2RPgFhAWDAAP43YJFJAWrABclIXZE+AWEBYMAA/jdgkUnAAHeCBI+NF8AFywDABctOBpCfAF2RPgFgwAD82QFqwAXLKWCRVMAAd6wEj44XwAXLnMAFzG4GkKIAYJFUAWrABcvKYJFUwAB3rASPjxfABcy7wAXNEwaQowBdkT4BYMAA/NkBasAFzOlgkVTAAHfUBI+QF8AFzWHABc5iBpCmAGCRVAFqwAXNlGCRVMAAd9QEj5EXwAXOzMAFz4gGkKcAXZFgAWEBYMAA/bZgkUkBasAFzu9dkWABYQFgwAD9tmCRScAAd/wEj5IXwAXP7sAF0McGkKkAXZE+AWEBYMAA/bZgkUkBasAF0A1dkT4BYQFgwAD9tmCRScAAeCsEj5MXwAXSV8AF0n8GkKwAXZE+AWDAAPzZAWrABdJrYJFUwAB4aASPlBfABdLNwAXThwaQsABgkVQBasAF0upgkVTAAHhoBI+VF8AF09TABdQiBpCxAF2RPgFgwAD82QFqwAXT/WCRVMAAeKEEj5YXwAXUcMAF1V4GkLUAYJFUAWrABdSeYJFUwAB4oQSPlxfABdYtwAXXnAaQtgBdkWABYQVgwAD70GDAAPvQYMAA/OZgwAD85mDAAPzmYJFJAWrABdZPXZFgAWEFYMAA+9BgwAD70GDAAPzmYMAA/OZgwAD85mCRScAAeMwEj5gXwAXYOsAF2OIGkLgAXZE+AWEFYMAA+9BgwAD70GDAAPzmYMAA/OZgwAD85mCRSQFqwAXYWF2RPgFhBWDAAPvQYMAA+9BgwAD85mDAAPzmYMAA/OZgkUnAAHkBBI+ZF8AF3UXABd68BpC6AF2RYAFhBWDAAPvQYMAA+9BgwAD85mDAAPzmYMAA/OZgkUkBasAF3WpdkWABYQVgwAD70GDAAPvQYMAA/OZgwAD85mDAAPzmYJFJwAB5QQSPmhfABd9awAXgCwaQvABdkT4BYQVgwAD70GDAAPvQYMAA/OZgwAD85mDAAPzmYJFJAWrABd97XZE+AWEFYMAA+9BgwAD70GDAAPzmYMAA/OZgwAD85mCRScAAeXYEj5sXwAXj9MAF5BwGkL4AXZE+AWDAAPzZAWrABeQIYJFUwAB5tgSPnBfABeRqwAXk5QaQwQBgkVQBasAF5IdgkVTAAHm2BI+dF8AF5YXABearBpDCAF2RYAFhAmCIs2CIs2CRSQFqwAXlr12RYAFhAmCIs2CIs2CRScAAed4Ej54XwAXnKcAF6BgGkMQAXZE+AWECYIizYIizYJFJAWrABedTXZE+AWECYIizYIizYJFJwAB6DgSPnxfABerfwAXrDQaQxwBdkT4BYMAA/NkBasAF6vZgkVTAAHo+BI+gF8AF61vABevgBpDKAGCRVAFqwAXre2CRVMAAej4Ej6EXwAXsgMAF7bkGkMsAXZFgAWECYIizYIizYJFJAWrABey1XZFgAWECYIizYIizYJFJwAB6ZgSPohfABe43wAXvSgaQzQBdkT4BYQJgiLNgiLNgkUkBasAF7mxdkT4BYQJgiLNgiLNgkUnAAHqWBI+jF8AF8lnABfOhBpDQAF2RYAFhAmCIs2CIs2CRSQFqwAXylF2RYAFhAmCIs2CIs2CRScAAesYEj6QXwAX0H8AF9ToGkNIAXZE+AWECYIizYIizYJFJAWrABfRWXZE+AWECYIizYIizYJFJwAB69gSPpRfABfhWwAX5ZAaQ1QBdkWABYQFgiLNgkUkBasAF+IFdkWABYQFgiLNgkUnAAHsmBI+mF8AF+c3ABfpnBpDXAF2RPgFhAWCIs2CRSQFqwAX5+F2RPgFhAWCIs2CRScAAe0UEj6cXwAX83cAF/dcGkNkAXZFgAWEBYIizYJFJAWrABf0AXZFgAWEBYIizYJFJwAB7bwSPqBfABf5AwAX+wgaQ2wBdkT4BYQFgiLNgkUkBasAF/mNdkT4BYQFgiLNgkUnAAHuOBI+pF8AGAOrABgESBpDdAF2RPgFgwAD82QFqwAYA/mCRVMAAe74Ej6oXwAYBYMAGAiAGkOEAYJFUAWrABgF9YJFUwAB7vgSPqxfABgJtwAYCsQaQ4gBdkT4BYMAA/NkBasAGApFgkVTAAHv5BI+sF8AGAv/ABgPgBpDmAGCRVAFqwAYDKGCRVMAAe/kEj60XwAYELcAGBHsGkOcAXZE+AWDAAPzZAWrABgRWYJFUwAB8JASPrhfABgTJwAYFewaQ6gBgkVQBasAGBPdgkVTAAHwkBI+vF8AGBcjABgX4BpDrAF2RPgFgwAD82QFqwAYF4GCRVMAAfE8Ej7AXwAYGRsAGBwEGkO8AYJFUAWrABgZnYJFUwAB8TwSPsRfABgdOwAYHeAaQ8ABdkT4BYMAA/NkBasAGB2NgkVTAAHx9BI+yF8AGB8bABgh0BpDzAGCRVAFqwAYH5GCRVMAAfH0Ej7MXwAYIwcAGCPEGkPQAXZE+AWDAAPzZAWrABgjZYJFUwAB8uwSPtBfABgk/wAYKYwaQ+QBgkVQBasAGCWBgkVTAAHy7BI+1F8AGCrDABgrgBpD6AF2RPgFgwAD82QFqwAYKyGCRVMAAfOkEj7YXwAYLLsAGC+MGkP0AYJFUAWrABgtPYJFUwAB86QSPtxfABgwwwAYMbAaQ/gBdkT4BYMAA/NkBasAGDE5gkVTAAH0iBI+4F8AGDLrABg2BBpECAGCRVAFqwAYM4WCRVMAAfSIEj7kXwAYNzsAGDfgGkQMAXZE+AWDAAPzZAWrABg3jYJFUwAB9UwSPuhfABg5GwAYPKAaRBwBgkVQBasAGDmRgkVTAAH1TBI+7F8AGD5bABhB8BpEIAF2RYAFhAWDAAP22YJFJAWrABg/FXZFgAWEBYMAA/bZgkUnAAH2ABI+8F8AGEOLABhJBBpEKAF2RPgFhAWDAAP22YJFJAWrABhENXZE+AWEBYMAA/bZgkUnAAH22BI+9F8AGFDjABhVRBpEOAF2RYAFhAWDAAP22YJFJAWrABhRqXZFgAWEBYMAA/bZgkUnAAH3lBI++F8AGFbvABha7BpEQAF2RPgFhAWDAAP22YJFJAWrABhXtXZE+AWEBYMAA/bZgkUnAAH4UBI+/F8AGGNDABhmnBpETAF2RYAFhAWDAAP22YJFJAWrABhj6XZFgAWEBYMAA/bZgkUnAAH5DBI/AF8AGGg3ABhsBBpEVAF2RPgFhAWDAAP22YJFJAWrABhozXZE+AWEBYMAA/bZgkUnAAH5yBI/BF8AGHM/ABh2mBpEYAF2RYAFhAWDAAP22YJFJAWrABhz5XZFgAWEBYMAA/bZgkUnAAH6hBI/CF8AGHgzABh8ABpEaAF2RPgFhAWDAAP22YJFJAWrABh4yXZE+AWEBYMAA/bZgkUnAAH7QBI/DF8AGIM7ABiGlBpEdAF2RYAFhAWDAAP22YJFJAWrABiD4XZFgAWEBYMAA/bZgkUnAAH7/BI/EF8AGIgvABiL/BpEfAF2RPgFhAWDAAP22YJFJAWrABiIxXZE+AWEBYMAA/bZgkUnAAH8uBI/FF8AGJOfABiX5BpEiAF2RYAFhAWDAAP22YJFJAWrABiUYXZFgAWEBYMAA/bZgkUnAAH9dBI/GF8AGJl/ABidBBpEkAF2RPgFhAWDAAP22YJFJAWrABiaQXZE+AWEBYMAA/bZgkUnAAH9+BI/HF8AGKTLABilmBpEmAF2RPgFgwAD82QFqwAYpTGCRVMAAf6oEj8gXwAYptMAGKjsGkSkAYJFUAWrABinXYJFUwAB/qgSPyRfABiqlwAYrewaRKgBdkWABYQFgwAD9tmCRSQFqwAYqzF2RYAFhAWDAAP22YJFJwAB/0gSPyhfABivhwAYsmAaRLABdkT4BYQFgwAD9tmCRSQFqwAYsBF2RPgFhAWDAAP22YJFJwACAAQSPyxfABi5lwAYvWgaRLwBdkWABYQFgwAD9tmCRSQFqwAYukV2RYAFhAWDAAP22YJFJwACAMASPzBfABi/AwAYwhgaRMQBdkT4BYQFgwAD9tmCRSQFqwAYv6F2RPgFhAWDAAP22YJFJwACAUQSPzRfABjJJwAYygQaRMwBdkT4BYMAA/NkBasAGMmVgkVTAAICOBI/OF8AGMs/ABjPGBpE3AGCRVAFqwAYy9GCRVMAAgI4Ej88XwAY0ZsAGNaMGkTgAXZFgAWECYIizYIizYJFJAWrABjSUXZFgAWECYIizYIizYJFJwACAuQSP0BfABjYhwAY3HAaROgBdkT4BYQJgiLNgiLNgkUkBasAGNk9dkT4BYQJgiLNgiLNgkUnAAIDpBI/RF8AGOfrABjpQBpE9AF2RPgFgwAD82QFqwAY6J2CRVMAAgRkEj9IXwAY6nsAGO1oGkUAAYJFUAWrABjrQYJFUwACBGQSP0xfABjunwAY76waRQQBdkT4BYMAA/NkBasAGO8tgkVTAAIFEBI/UF8AGPDnABj1GBpFFAGCRVAFqwAY8YmCRVMAAgUQEj9UXwAY9k8AGPdcGkUYAXZE+AWDAAPzZAWrABj23YJFUwACBdQSP1hfABj4lwAY/BQaRSgBgkVQBasAGPk5gkVTAAIF1BI/XF8AGP1LABj98BpFLAF2RPgFgwAD82QFqwAY/Z2CRVMAAgaIEj9gXwAY/ysAGQDMGkU4AYJFUAWrABj/oYJFUwACBogSP2RfABkChwAZBpgaRTwBdkWABYQFgwAD9tmCRSQFqwAZA0l2RYAFhAWDAAP22YJFJwACBygSP2hfABkIMwAZC8gaRUQBdkT4BYQFgwAD9tmCRSQFqwAZCOV2RPgFhAWDAAP22YJFJwACB+QSP2xfABkTPwAZE/QaRVABdkT4BYMAA/NkBasAGROZgkVTAAII2BI/cF8AGRUvABkYDBpFYAGCRVAFqwAZFa2CRVMAAgjYEj90XwAZGUMAGRowGkVkAXZE+AWDAAPzZAWrABkZuYJFUwACCbwSP3hfABkbawAZHvwaRXQBgkVQBasAGRwFgkVTAAIJvBI/fF8AGSC/ABkkrBpFeAF2RYAFhAWDAAP22YJFJAWrABkhnXZFgAWEBYMAA/bZgkUnAAIKaBI/gF8AGSZfABkqWBpFgAF2RPgFhAWDAAP22YJFJAWrABknLXZE+AWEBYMAA/bZgkUnAAILJBI/hF8AGTJDABk2ABpFjAF2RYAFhAmDAAPvQYMAA+9BgkUkBasAGTLBdkWABYQJgwAD70GDAAPvQYJFJwACC+ASP4hfABk3wwAZO4waRZQBdkT4BYQJgwAD70GDAAPvQYJFJAWrABk4QXZE+AWECYMAA+9BgwAD70GCRScAAgywEj+MXwAZRF8AGUlMGkWgAXZFgAWECYMAA+9BgwAD70GCRSQFqwAZROF2RYAFhAmDAAPvQYMAA+9BgkUnAAINjBI/kF8AGUsPABlO2BpFrAF2RPgFhAmDAAPvQYMAA+9BgkUkBasAGUuRdkT4BYQJgwAD70GDAAPvQYJFJwACDjASP5RfABlXmwAZWFAaRbQBdkT4BYMAA/NkBasAGVf1gkVTAAIPEBI/mF8AGVmLABldiBpFxAGCRVAFqwAZWgmCRVMAAg8QEj+cXwAZXr8AGV9UGkXIAXZE+AWDAAPzZAWrABlfCYJFUwACD9wSP6BfABlgjwAZY6QaRdgBgkVQBasAGWD9gkVTAAIP3BI/pF8AGWVHABlocBpF3AF2RYAFhAWDAAPvQYJFJAWrABll6XZFgAWEBYMAA+9BgkUnAAIQkBI/qF8AGWoDABlt3BpF5AF2RPgFhAWDAAPvQYJFJAWrABlqlXZE+AWEBYMAA+9BgkUnAAIRTBI/rF8AGXRTABl5OBpF8AF2RYAFhAWDAAP22YJFJAWrABl1EXZFgAWEBYMAA/bZgkUnAAISFBI/sF8AGXrTABl+KBpF/AF2RPgFhAWDAAP22YJFJAWrABl7gXZE+AWEBYMAA/bZgkUnAAISpBI/tF8AGYYfABmG3BpGBAF2RPgFgwAD82QFqwAZhn2CRVMAAhNsEj+4XwAZiBcAGYuIGkYUAYJFUAWrABmImYJFUwACE2wSP7xfABmNMwAZkAQaRhgBdkWABYQFgwAD9tmCRSQFqwAZjbV2RYAFhAWDAAP22YJFJwACFCASP8BfABmRnwAZlOQaRiABdkT4BYQFgwAD9tmCRSQFqwAZkhF2RPgFhAWDAAP22YJFJwACFNwSP8RfABmbpwAZnpAaRiwBdkWABYQJgwAD9tmDAAP43YJFJAWrABmcIXZFgAWECYMAA/bZgwAD+N2CRScAAhWYEj/IXwAZoFMAGaIUGkY0AXZE+AWECYMAA/bZgwAD+N2CRSQFqwAZoL12RPgFhAmDAAP22YMAA/jdgkUnAAIWMBI/zF8AGaoPABmtpBpGPAF2RYAFhA2DAAP22YMAA/jdgwAD+N2CRSQFqwAZqrV2RYAFhA2DAAP22YMAA/jdgwAD+N2CRScAAhb0Ej/QXwAZr6MAGbIUGkZEAXZE+AWEDYMAA/bZgwAD+N2DAAP43YJFJAWrABmwOXZE+AWEDYMAA/bZgwAD+N2DAAP43YJFJwACF6ASP9RfABm6vwAZu9QaRkwBdkT4BYMAA/NkBasAGbtRgkVTAAIYeBI/2F8AGb0PABnAaBpGWAGCRVAFqwAZvbWCRVMAAhh4Ej/cXwAZwiMAGcXIGkZcAXZFgAWEBYMAA/bZgkUkBasAGcLxdkWABYQFgwAD9tmCRScAAhkcEj/gXwAZx2MAGcqMGkZkAXZE+AWEBYMAA/bZgkUkBasAGcghdkT4BYQFgwAD9tmCRScAAhmgEj/kXwAZ0Z8AGdLMGkZsAXZE+AWDAAPzZAWrABnSPYJFUwACGogSP+hfABnUBwAZ14gaRnwBgkVQBasAGdS5gkVTAAIaiBI/7F8AGdi/ABnZ3BpGgAF2RPgFgwAD82QFqwAZ2VWCRVMAAhs0Ej/wXwAZ2xcAGd9MGkaMAYJFUAWrABnbwYJFUwACGzQSP/RfABnggwAZ4cAaRpABdkT4BYMAA/NkBasAGeEpgkVTAAIcGBI/+F8AGeL7ABnnIBpGoAGCRVAFqwAZ47WCRVMAAhwYEj/8XwAZ6FcAGej8GkakAXZE+AWDAAPzZAWrABnoqYJFUwACHNASQABfABnqNwAZ7UAaRrQBgkVQBasAGeqtgkVTAAIc0BJABF8AGe53ABnvPBpGuAF2RPgFgwAD82QFqwAZ7tmCRVMAAh20EkAIXwAZ8HcAGfOUGkbIAYJFUAWrABnw/YJFUwACHbQSQAxfABn2BwAZ++gaRswBdkWABYQJgwAD9tmCIs2CRSQFqwAZ9oV2RYAFhAmDAAP22YIizYJFJwACHmwSQBBfABn9wwAaALQaRtgBdkT4BYQJgwAD9tmCIs2CRSQFqwAZ/kF2RPgFhAmDAAP22YIizYJFJwACHwgSQBRfABoOLwAaE+waRuABdkWABYQJgwAD9tmCIs2CRSQFqwAaDq12RYAFhAmDAAP22YIizYJFJwACH9QSQBhfABoVxwAaGLgaRuwBdkT4BYQJgwAD9tmCIs2CRSQFqwAaFkV2RPgFhAmDAAP22YIizYJFJwACIHASQBxfABomDwAaK/AaRvQBdkWABYQJgwAD9tmCIs2CRSQFqwAaJo12RYAFhAmDAAP22YIizYJFJwACIUQSQCBfABotywAaMLwaRwABdkT4BYQJgwAD9tmCIs2CRSQFqwAaLkl2RPgFhAmDAAP22YIizYJFJwACIeASQCRfABo8+wAaPfAaRwgBdkT4BYMAA/NkBasAGj11gkVTAAIi7BJAKF8AGj8rABpEuBpHHAGCRVAFqwAaP8mCRVMAAiLsEkAsXwAaRmMAGklcGkcgAXZFgAWEBYJ6rYJFJAWrABpG8XZFgAWEBYJ6rYJFJwACI6QSQDBfABpK9wAaTagaRygBdkT4BYQFgnqtgkUkBasAGkt1dkT4BYQFgnqtgkUnAAIkWBJANF8AGlPrABpXTBpHNAF2RYAFhAmDAAP22YJ6rYJFJAWrABpUdXZFgAWECYMAA/bZgnqtgkUnAAIlDBJAOF8AGlkjABpb/BpHPAF2RPgFhAmDAAP22YJ6rYJFJAWrABpZnXZE+AWECYMAA/bZgnqtgkUnAAIlnBJAPF8AGmQzABpoqBpHRAF2RYAFhAmDAAP22YMAA/bZgkUkBasAGmT1dkWABYQJgwAD9tmDAAP22YJFJwACJlwSQEBfABpqiwAabwQaR0wBdkT4BYQJgwAD9tmDAAP22YJFJAWrABprTXZE+AWECYMAA/bZgwAD9tmCRScAAib0EkBEXwAaeVMAGnvkGkdUAXZFgAWEBYMAA/bZgkUkBasAGnnRdkWABYQFgwAD9tmCRScAAifEEkBIXwAafYcAGn80GkdcAXZE+AWEBYMAA/bZgkUkBasAGn31dkT4BYQFgwAD9tmCRScAAihIEkBMXwAahPsAGohIGkdkAXZFgAWEBYJ6rYJFJAWrABqFmXZFgAWEBYJ6rYJFJwACKPgSQFBfABqJ4wAajNQaR2wBdkT4BYQFgnqtgkUkBasAGopxdkT4BYQFgnqtgkUnAAIprBJAVF8AGpKrABqTiBpHeAF2RPgFgwAD82QFqwAakxmCRVMAAipsEkBYXwAalMMAGpgcGkeIAYJFUAWrABqVVYJFUwACKmwSQFxfABqZUwAamiAaR4wBdkT4BYMAA/NkBasAGpm5gkVTAAIrVBJAYF8AGptbABqekBpHnAGCRVAFqwAam+WCRVMAAitUEkBkXwAaoJMAGqSAGkegAXZFgAWECYMAA/bZgwAD9tmCRSQFqwAaoS12RYAFhAmDAAP22YMAA/bZgkUnAAIsABJAaF8AGqZzABqpvBpHqAF2RPgFhAmDAAP22YMAA/bZgkUkBasAGqb9dkT4BYQJgwAD9tmDAAP22YJFJwACLNASQGxfABqxdwAasjQaR7QBdkT4BYMAA/NkBasAGrHVgkVTAAItoBJAcF8AGrNvABq1DBpHwAGCRVAFqwAatAGCRVMAAi2gEkB0XwAatqsAGrmAGkfEAXZFgAWEBYMAA/jdgkUkBasAGrdBdkWABYQFgwAD+N2CRScAAi5AEkB4XwAauw8AGr3UGkfMAXZE+AWEBYMAA/jdgkUkBasAGruVdkT4BYQFgwAD+N2CRScAAi7EEkB8XwAaw6MAGsbYGkfUAXZFgAWEBYMAA/bZgkUkBasAGsRZdkWABYQFgwAD9tmCRScAAi94EkCAXwAayHMAGstYGkfcAXZE+AWEBYMAA/bZgkUkBasAGskZdkT4BYQFgwAD9tmCRScAAi/8EkCEXwAa0eMAGtKAGkfkAXZE+AWDAAPzZAWrABrSMYJFUwACMLgSQIhfABrTuwAa1dwaR/ABgkVQBasAGtQtgkVTAAIwuBJAjF8AGtcTABrXsBpH9AF2RPgFgwAD82QFqwAa12GCRVMAAjF4EkCQXwAa2OsAGtyIGkgEAYJFUAWrABrZXYJFUwACMXgSQJRfABrdvwAa3mQaSAgBdkT4BYMAA/NkBasAGt4RgkVTAAIyZBJAmF8AGt+fABridBpIGAGCRVAFqwAa4BWCRVMAAjJkEkCcXwAa5O8AGuyIGkgcAXZFgAWECYMAA/bZgwAD9tmCRSQFqwAa5cF2RYAFhAmDAAP22YMAA/bZgkUnAAIzHBJAoF8AGu57ABrxlBpIKAF2RPgFhAmDAAP22YMAA/bZgkUkBasAGu9NdkT4BYQJgwAD9tmDAAP22YJFJwACM8ASQKRfABr9FwAa/dQaSDABdkT4BYMAA/NkBasAGv11gkVTAAI0nBJAqF8AGv8PABsCnBpIQAGCRVAFqwAa/5GCRVMAAjScEkCsXwAbA9MAGwSQGkhEAXZE+AWDAAPzZAWrABsEMYJFUwACNVASQLBfABsFywAbCZwaSFABgkVQBasAGwZNgkVTAAI1UBJAtF8AGwrTABsLkBpIVAF2RPgFgwAD82QFqwAbCzGCRVMAAjYsEkC4XwAbDMsAGw/0GkhkAYJFUAWrABsNTYJFUwACNi4ENBpAwFpjrmPKaSgABgkAAAAABA5j/mkoAAAABAQGZBAAAAICsYMAA/jcAAGDAAP22AT4BSpoAASMcmguAmgfABQ6FSAEAASsAwAD+XisemhyTagMAAxqaM8AA/jyAmjnABQ6FGpo+nUAAAWDAAP22BpAxFpqTmpqbmgABkhoAAAABA5qmm5oAAAABAQGatAAAAISxXcAA/HQBYMAA/bYAAGDAAP22AT4FTprMmtMAAIKLYMAA/gABH5rZwAD+HwAAAABFmusBmvSa9gAAYmDAAPvQAZMBHJr9gpr7wAUPLmMBAAEcmwwWmwWAmv/ABQ70YcAA/KOBjQEAAZQAwAD89gDAAPz9AYqbEcAFDy4cmxKCmxHABQ8uZAEAAZQAwAD89T4CPRybI4GbHMAFDxGCigEAASeSGwDAAP4UPRybPIGbNcAFDxGCAgEAARybSYCbRMAFDvRLAQABgptKwAUPLgDAAPyDAMAA/hc9HJtcgZtVwAUPEYKKAQABJ5IbAMAA/hQ9HJtzgZtswAUPEYKKAQABFpt/gJt5wAUO9IHowAD8WQDAAP4USpuIASSbmAGBm5HABQ8RBpAzF4SkhKyF5wABkhyMHAAAAAEDhNSF5wAAAAEBAYTcAAAAgL1gwAD9tgAAYJFJAT4DSYTmFoTvgITqwAUQPYFVwAD9vD0whPgnkh0/PYiFFMAFED0ehRuCSQEAAYCFOMAFED0ASoVBAR+FTJFTAwABaoVUXZE+AWEBYMAA/bZgkUmI1wIiJIXDAyeSHoCFk8AFED0nkh9bMoXWYMAA/bZbASeAvYCF38AFED0GkDQXjOmM8Y5iAAGSIIwcAAAAAQONI45iAAAAAQEBjSsAAACAvWDAAP22AABgkUkBPgNJjTUWjT6AjTnABRDqgVXAAP28PTCNRyeSHT89iI1jwAUQ6h6NaoJJAQABgI2HwAUQ6gBKjZABH42bkVMDAAFqjaNdkT4BYQFgwAD9tmCRSYmFAiIkjj4DJ5IhgI4HwAUQ6ieSIlsyjlFgwAD9tlsBJ4C9gI5awAUQ6gaQNReQipCSkYcAAZIjjBwAAAABA5CrkYcAAAABAQGQswAAAIC9YMAA/bYAAGCRSQE+A0mQvRaQxoCQwcAFEZeBVcAA/bw9MJDPJ5IdPz2IkOvABRGXHpDygkkBAAGAkQ/ABRGXAEqRGAEfkSORUwMAAWqRK12RPgFhAWDAAP22YJFJicsCIiSRaQMnkiSAkV/ABRGXJ4FLWzKRdmDAAP22WwEngL2AkX/ABRGXBpA2F5TOlNaXRgABkiWMHAAAAAEDlPeXRgAAAAMDA5UEAAAAgL1gwAD9tgCVEwAAAJImYIizAJUjAAAAkidgiLMAAGCRSQE+CEmVLxaVOICVM8AFEkSBVcAA/bw9MJVBJ5IdPz2IlV3ABRJEHpVkgkkBAAGAlYHABRJEAE6VlpWeAACSKGCfZwEflaSfjAAAAABOlcKVzAAAkildwAD8dAFgwAD9HAEcldaDlc7ABRKikioBAAGBleDABRJRAJ9tTpX3lgIAAJIrXcAA/HQBYMAA/RwBHJYMg5YEwAUSopIqAQABgpYWwAUSXACfbU6WKJYtAACCkGDAAP22ARyWOYSWL8AFErhYAAAAAMAA/EZOlkqWUAAAkixgwAD9tgEcll2FllLABRLmWAAAAADAAPxGSpZnAR+WcpFTAwABapZ6XZE+AWEDYMAA/bZgiLNgiLNgkUmKIgIiHJbgJJbgByeDQoCWqMAFEkQnki2GlsfABRMUJ5Iuh5bVwAUTNieDQmQBAAEWlvSDluzABRKiki+figDAAP3LWzKXFWDAAP22WwMngL2Alx7ABRJEJ4KQgZcswAUSUSeSLIKXPMAFElwGkDcXnu6e9qGDAAGSMIwcAAAAAQOfHaGDAAAAAgICnywAAACSJmCIswCfPAAAAJInYIizAABgkUkBPgZOn1SfXAAAkihgn2cBH59in4wAAAAATp+An4oAAJIpXcAA/HQBYMAA/RwBHJ+Ugp+MwAUUI5IqAQABgJ+ewAUUBQCfbU6ftZ/AAACSK13AAPx0AWDAAP0cARyfyoKfwsAFFCOSKgEAAYGf1MAFFBAAn21On+af6wAAgpBgwAD9tgEcn/eDn+3ABRQ5WAAAAADAAPxGTqAIoA4AAJIsYMAA/bYBHKAbhKAQwAUUZ1gAAAAAwAD8RkqgJQEfoDCRUwQAAWqgOF2RPgFhAmCIs2CIs2CRSYrVAyIcoMYkoMYFJ5IxhaCIwAUUlSeSMoagusAFFLcngUtkAQABFqDegqDWwAUUI5Ivn4oAwAD9y4icJKFNAyeSM4ahQsAFFLcngUtbMqFgYMAA/bZbAieCkIChacAFFAUnkiyBoXnABRQQBpA4F6RupHalzQABkjSMHAAAAAEDpJmlzQAAAAEBAaSeAAAAkjVgwAD70AAAYJFJAT4CTqS0pLwAAJI2YMAA/bYBJKUEAieSNxyk8xyk5Ryk04CkycAFFYCECQEAATcQAMAA+/6SOAAAAADAAP3ckjkCAAKXJ4QIAMAA/dFKpQgBH6UTkVMDAAFqpRtdkT4BYQFgwAD70GCRSYsoAiIkpZ8DJ5I6gaVqwAUVlSeSO1sypbJgwAD9tlsBJ5I1gKXAwAUVgAaQORew8rD6sr0AAZI8jBwAAAABA7Eisr0AAAACAgKxKgAAAIC9YMAA/bYAsTcAAACSPWDAAP22AABgkUkBPgVJsUIWsUuAsUbABRZEgVXAAP28PTCxVCeSHT89iLFwwAUWRB6xd4JJAQABgLGUwAUWRABJsZ0WsaeBsaHABRZRgVXAAP28PTCxsCeSHT89ibHMwAUWUR6x1IJJAQABgbHxwAUWUQBKsfsBH7IGkVMDAAFqsg5dkT4BYQJgwAD9tmDAAP22YJFJjFICIiSyiQUnkj6AsmfABRZEJ5I/gbJ+wAUWUSeBS1syspxgwAD9tlsCJ4C9gLKlwAUWRCeSPYGytMAFFlEGkDoXtwq3ErnCAAGSQIwcAAAAAQO3P7nCAAAAAgICt0wAAACAvWDAAP22ALdZAAAAkj1gwAD9tgAAYJFJAT4FSbdkFrdtgLdowAUXSoFVwAD9vD0wt3Ynkh0/PYi3ksAFF0oet5mCSQEAAYC3tsAFF0oASbe/FrfJgbfDwAUXV4FVwAD9vD0wt9Inkh0/PYm37sAFF1cet/aCSQEAAYG4E8AFF1cASrgdAR+4KJFTBAABargwXZE+AWECYMAA/bZgwAD9tmCRSYyxAyIkuQgFJ5JBgLiBwAUXSieSQoG4/cAFF1cngUuInCS5jgMnkkOBuTvABRdXJ5JEWzK5oWDAAP22WwIngL2AuarABRdKJ5I9gbm5wAUXVwaQOxe9N70/vvgAAZJFjBwAAAABA71rvvgAAAABAQG9cwAAAIC9YMAA/bYAAGCRSQE+A0m9fRa9hoC9gcAFGGOBVcAA/bw9ML2PJ5IdPz2IvavABRhjHr2ygkkBAAGAvc/ABRhjAEq92AEfveORUwQAAWq9612RPgFhAWDAAP22YJFJjQADIiS+kgMnkkGAvjvABRhjJ5JGiJwkvtQDJ5JDgL7FwAUYYyeSR1syvudgwAD9tlsBJ4C9gL7wwAUYYwaQPBfAAEKNwABClcAARFEAAZJIjBwAAAABA8AAQsrAAERRAAAAAQEBwABC0gAAAIC9YMAA/bYAAGCRSQE+A0nAAELcFsAAQuWAwABC4MAFGS2BVcAA/bw9MMAAQu4nkh0/PYjAAEMKwAUZLR7AAEMRgkkBAAGAwABDLsAFGS0ASsAAQzcBH8AAQ0KRUwQAAWrAAENKXZE+AWEBYMAA/bZgkUmNRwMiJMAAQ+sDJ5JBgMAAQ6PABRktJ5JJiJwkwABELQMnkkOAwABEHsAFGS0nkkdbMsAAREBgwAD9tlsBJ4C9gMAAREnABRktBpA9F8AASNfAAEjfwABKEQABkkqMHAAAAAEDwABJB8AAShEAAAABAQHAAEkPAAAAgL1gwAD9tgAAYJFJAT4DScAASRkWwABJIoDAAEkdwAUaGYFVwAD9vD0wwABJKyeSHT89iMAASUfABRoZHsAASU6CSQEAAYDAAElrwAUaGQBKwABJdAEfwABJf5FTAwABasAASYddkT4BYQFgwAD9tmCRSY24AiIkwABJ7QMnkkuAwABJy8AFGhknkkxbMsAASgBgwAD9tlsBJ4C9gMAASgnABRoZBpA+F8AATTfAAE0/wABOjAABkk2MHAAAAAEDwABNZMAATowAAAABAQHAAE1rAAAAkk5gnqsAAGCRSQE+Ak7AAE19wABNhAAAgl5gwAD9tgEWwABNjIDAAE2GwAUa7oJensVKwABNlgEfwABNoZFTBAABasAATaldkT4BYQFgnqtgkUmODAMiJMAATiEDJ5JPgcAATf3ABRsDJ5JQiJwniSZbMsAATnlgwAD9tlsBJ5JOgMAAToPABRruBpA/F8AAUWzAAFF0wABSaQABklGMHAAAAAEDwABRoMAAUmkAAAABAQHAAFGnAAAAkk5gnqsAAGCRSQE+Ak7AAFG5wABRwAAAgl5gwAD9tgEWwABRyIDAAFHCwAUbqIJensVKwABR0gEfwABR3ZFTAwABasAAUeVdkT4BYQFgnqtgkUmOWgIiJMAAUkMDJ5JSgcAAUijABRu9J5JTWzLAAFJWYMAA/bZbASeSToDAAFJgwAUbqAaQQBfAAFiFwABYjcAAWeYAAZJUjBwAAAABA8AAWL3AAFnmAAAAAQEBwABYxQAAAIC9YMAA/bYAAGCRSQE+A0nAAFjPFsAAWNiAwABY08AFHF2BVcAA/bw9MMAAWOEnkh0/PYjAAFj9wAUcXR7AAFkEgkkBAAGAwABZIcAFHF0ASsAAWSoBH8AAWTWRUwMAAWrAAFk9XZE+AWEBYMAA/bZgkUmO5gIiJMAAWcIDJ5IegMAAWY7ABRxdJ5JVWzLAAFnVYMAA/bZbASeAvYDAAFnewAUcXQaQQRfAAGAEwABgDMAAYSgAAZJWjBwAAAABA8AAYDTAAGEoAAAAAQEBwABgPAAAAIPsYMAA/bYAAGCRSQE+AknAAGBIFsAAYFOAwABgTMAFHTKBVcAA/bw9MMAAYFwnklc/SsAAYHoBH8AAYIWRUwMAAWrAAGCNXZE+AWEBYMAA/bZgkUmPbQIiJMAAYQYDJ5JYgMAAYPvABR0yJ4FqWzLAAGETYMAA/bZbASeD7IDAAGEewAUdMgaQQhfAAGy/wABsx8AAbooAAZJZjBwAAAABA8AAbQLAAG6KAAAAAQEBwABtDwAAAIC9YMAA/bYAAGCRSQE+A0nAAG0ZFsAAbSKAwABtHcAFHemBVcAA/bw9MMAAbSsnkh0/PYjAAG1HwAUd6R7AAG1OgkkBAAGAwABta8AFHekASsAAbXQBH8AAbX+RUwQAAWrAAG2HXZE+AWEBYMAA/bZgkUmQDgMiJMAAbjcDJ5JagMAAbffABR3pJ5JbiJwniVRbMsAAbnlgwAD9tlsBJ4C9gMAAboLABR3pBpBDF8AAceTAAHHswABzVgABklyMHAAAAAEDwAByF8AAc1YAAAABAQHAAHIfAAAAg+xgwAD9tgAAYJFJAT4CScAAcisWwAByNoDAAHIvwAUew4FVwAD9vD0wwAByPyeSVz9KwAByXQEfwAByaJFTBAABasAAcnBdkT4BYQFgwAD9tmCRSZBkAyIkwABy/wMnkl2AwAByysAFHsMnkl6InCeJWlsywABzQWDAAP22WwEng+yAwABzTMAFHsMGkEQXwAB23cAAduXAAHiQAAGSX4wcAAAAAQPAAHcawAB4kAAAAAEBAcAAdyIAAACAvWDAAP22AABgkUkBPgNJwAB3LBbAAHc1gMAAdzDABR9/gVXAAP28PTDAAHc+J5IdPz2IwAB3WsAFH38ewAB3YYJJAQABgMAAd37ABR9/AErAAHeHAR/AAHeSkVMEAAFqwAB3ml2RPgFhAWDAAP22YJFJkKsDIiTAAHg9AyeSYIDAAHf9wAUffyeSW4icJ4lUWzLAAHh/YMAA/bZbASeAvYDAAHiIwAUffwaQRRfAAHsywAB7OsAAfF0AAZJhjBwAAAABA8AAe1TAAHxdAAAAAgICwAB7WQAAAJJiYMAA/jcAwAB7ZgAAAIPsYMAA/bYAAGCRSQE+A07AAHt5wAB7fQAAgKxgwAD9tgEewAB7f5AwAQABgMAAe43ABSBZAEnAAHuWFsAAe6GBwAB7msAFIGiBVcAA/bw9MMAAe6onklc/SsAAe8gBH8AAe9ORUwMAAWrAAHvbXZE+AWECYMAA/jdgwAD9tmCRSZDdAiIkwAB8KAQnkmOCwAB8FcAFIH8nkmSBwAB8HsAFIGhbMsAAfDtgwAD9tlsCJ4CsgMAAfEPABSBZJ4PsgcAAfFPABSBoBpBGF8AAf3nAAH+BwACAkgABkmWMHAAAAAEDwAB/s8AAgJIAAAABAQHAAH+6AAAAkk5gnqsAAGCRSQE+Ak7AAH/MwAB/0wAAgl5gwAD9tgEWwAB/24DAAH/VwAUhYIJensVKwAB/5QEfwAB/8JFTAwABasAAf/hdkT4BYQFgnqtgkUmRMgIiJMAAgGwDJ4NCgcAAgDfABSF1J5JmWzLAAIB/YMAA/bZbASeSToDAAICJwAUhYAaQRxfAAIRdwACEZcAAhjAAAZJnjBwAAAABA8AAhJLAAIYwAAAAAQEBwACEmQAAAJJOYJ6rAABgkUkBPgJOwACEq8AAhLIAAIJeYMAA/bYBFsAAhLqAwACEtMAFIhWCXp7FSsAAhMQBH8AAhM+RUwQAAWrAAITXXZE+AWEBYJ6rYJFJkYQDIiTAAIWcAyeDQoHAAIUbwAUiKieSaIicJ4lsWzLAAIYdYMAA/bZbASeSToDAAIYnwAUiFQaQSBfAAJS+wACUxsAAlvIAAZJpjBwAAAABA8AAlPHAAJbyAAAAAgICwACU+QAAAIC9YMAA/bYAwACVBgAAAJI9YMAA/bYAAGCRSQE+BUnAAJURFsAAlRqAwACVFcAFIs+BVcAA/bw9MMAAlSMnkh0/PYjAAJU/wAUizx7AAJVGgkkBAAGAwACVY8AFIs8AScAAlWwWwACVdoHAAJVwwAUi3oFVwAD9vD0wwACVfyeSHT89icAAlZvABSLeHsAAlaOCSQEAAYHAAJXAwAUi3gBKwACVygEfwACV1ZFTBAABasAAld1dkT4BYQJgwAD9tmDAAP22YJFJkt0DIiTAAJZ3BSeSaoDAAJYlwAUizyeSa4HAAJZPwAUi3ieSbIicJMAAlr4FJ5JtgcAAlqbABSLeJ5JugMAAlrTABSLPJ4FLWzLAAJbRYMAA/bZbAieAvYDAAJbawAUizyeSPYHAAJbpwAUi3gaQSRfAAJoywACaOsAAm+MAAZJvjBwAAAABA8AAmlzAAJvjAAAAAgICwACaZAAAAIPsYMAA/bYAwACacwAAAJJwYMAA/bYAAGCRSQE+A0nAAJqAFsAAmouAwACahMAFJDSBVcAA/bw9MMAAmpQnklc/ScAAmrIWwACavoHAAJq2wAUkQ4FVwAD9vD0wwACaxyeSVz9KwACa5QEfwACa8JFTBAABasAAmvhdkT4BYQJgwAD9tmDAAP22YJFJkzQDIiTAAJtzBSeScYDAAJtWwAUkNCeSLoHAAJtmwAUkQyeBS4icJ4mUWzLAAJu6YMAA/bZbAieD7IDAAJvFwAUkNCeScIHAAJvYwAUkQwaQShfAAJ6awACeosAAn8QAAZJyjBwAAAABA8AAnsjAAJ/EAAAAAQEBwACe0AAAAIC9YMAA/bYAAGCRSQE+A0nAAJ7aFsAAnuOAwACe3sAFJT+BVcAA/bw9MMAAnuwnkh0/PYjAAJ8IwAUlPx7AAJ8PgkkBAAGAwACfLMAFJT8ASsAAnzUBH8AAn0CRUwMAAWrAAJ9IXZE+AWEBYMAA/bZgkUmTigIiJMAAn6ADJ5JzgMAAn5bABSU/J4FLWzLAAJ+zYMAA/bZbASeAvYDAAJ+8wAUlPwaQSxfAAKIiwACiKsAAo0AAAZJ0jBwAAAABA8AAokzAAKNAAAAAAQEBwACiVAAAAIC9YMAA/bYAAGCRSQE+A0nAAKJeFsAAomeAwACiYsAFJhSBVcAA/bw9MMAAonAnkh0/PYjAAKKMwAUmFB7AAKKTgkkBAAGAwACisMAFJhQASsAAorkBH8AAosSRUwMAAWrAAKLMXZE+AWEBYMAA/bZgkUmT0AIiJMAAoxwDJ5J1gMAAoxLABSYUJ4FLWzLAAKMvYMAA/bZbASeAvYDAAKM4wAUmFAaQTBfAAKXUwACl3MAApu8AAZJ2jBwAAAABA8AApf3AAKbvAAAAAQEBwACmBQAAAIC9YMAA/bYAAGCRSQE+A0nAAKYPFsAAphiAwACmE8AFJumBVcAA/bw9MMAApiEnkh0/PYjAAKY9wAUm6R7AAKZEgkkBAAGAwACmYcAFJukASsAApmoBH8AApnWRUwMAAWrAAKZ9XZE+AWEBYMAA/bZgkUmUIQIiJMAApssDJ5J3gMAApsHABSbpJ4FLWzLAAKbeYMAA/bZbASeAvYDAAKbnwAUm6QaQTRfAAKnZwACp4cAAqwIAAZJ4jBwAAAABA8AAqgnAAKsCAAAAAQEBwACqEQAAAIC9YMAA/bYAAGCRSQE+A0nAAKobFsAAqiSAwACqH8AFJ76BVcAA/bw9MMAAqi0nkh0/PYjAAKpJwAUnvh7AAKpQgkkBAAGAwACqbcAFJ74ASsAAqnYBH8AAqoGRUwMAAWrAAKqJXZE+AWEBYMAA/bZgkUmUZAIiJMAAqt4DJ5J3gMAAqtTABSe+J4FLWzLAAKrxYMAA/bZbASeAvYDAAKr6wAUnvgaQThfAAK2WwACtnsAArrEAAZJ5jBwAAAABA8AArb/AAK6xAAAAAQEBwACtxwAAAIC9YMAA/bYAAGCRSQE+A0nAAK3RFsAArdqAwACt1cAFKJOBVcAA/bw9MMAAreMnkh0/PYjAAK3/wAUokx7AAK4GgkkBAAGAwACuI8AFKJMASsAAriwBH8AArjeRUwMAAWrAAK4/XZE+AWEBYMAA/bZgkUmUqgIiJMAAro0DJ5J6gMAAroPABSiTJ4FLWzLAAK6gYMAA/bZbASeAvYDAAK6pwAUokwaQTxfAALGbwACxo8AAssQAAZJ7jBwAAAABA8AAscvAALLEAAAAAQEBwACx0wAAAIC9YMAA/bYAAGCRSQE+A0nAALHdFsAAseaAwACx4cAFKWiBVcAA/bw9MMAAse8nkh0/PYjAALILwAUpaB7AALISgkkBAAGAwACyL8AFKWgASsAAsjgBH8AAskORUwMAAWrAALJLXZE+AWEBYMAA/bZgkUmU7QIiJMAAsqADJ5J6gMAAspbABSloJ4FLWzLAALKzYMAA/bZbASeAvYDAALK8wAUpaAaQUBfAALWQwAC1mMAAtr4AAZJ8jBwAAAABA8AAtb/AALa+AAAAAQEBwAC1xwAAAIC9YMAA/bYAAGCRSQE+A0nAALXRFsAAtdqAwAC11cAFKj2BVcAA/bw9MMAAteMnkh0/PYjAALX/wAUqPR7AALYGgkkBAAGAwAC2I8AFKj0ASsAAtiwBH8AAtjeRUwMAAWrAALY/XZE+AWEBYMAA/bZgkUmVPwIiJMAAtpoDJ5J9gMAAtpDABSo9J4FLWzLAALatYMAA/bZbASeAvYDAALa2wAUqPQaQURfAAMvNwADL1cAAzckAAZJ+jBwAAAABA8AAy/vAAM3JAAAAAQEBwADMAwAAAIC9YMAA/bYAAGCRSQE+A0nAAMwNFsAAzBaAwADMEcAFKxKBVcAA/bw9MMAAzB8nkh0/PYjAAMw7wAUrEh7AAMxCgkkBAAGAwADMX8AFKxIASsAAzGgBH8AAzHORUwQAAWrAAMx7XZE+AWEBYMAA/bZgkUmXNAMiJMAAzTcDJ4NCgMAAzLjABSsSJ5JoiJwniWxbMsAAzbhgwAD9tlsBJ4C9gMAAzcHABSsSBpBSF8AA0OnAANDxwADSuQABkn+MHAAAAAEDwADRGMAA0rkAAAABAQHAANEiAAAAkoBgiW4AAGCRSQE+BE7AANE9wADRRQAAkihgn2cBH8AA0UufjAAAAABOwADRacAA0XcAAJKBXcAA/HQBYMAA/RwBHMAA0YGBwADRecAFLAGSggEAAYDAANGPwAUr7ACfbk7AANGkwADRrQAAhf9gwAD9tgEcwADRvYLAANGvwAUsHVgAAAAAwAD8RkrAANHHAR/AANHSkVMDAAFqwADR2l2RPgFhAWCJbmCRSZeEAiIcwADSZiTAANJmAyeSg4PAANIkwAUsVSeShGQBAAEWwADSfoHAANJ2wAUsAZIvn4oAwAD9y1sywADSn2DAAP22WwEnhf+AwADSrMAFK+wGkFMXwADVucAA1cHAANd5AAGShYwcAAAAAQPAANXkwADXeQAAAAEBAcAA1e4AAACSgGCJbgAAYJFJAT4ETsAA1gnAANYRAACSKGCfZwEfwADWF5+MAAAAAE7AANY1wADWQwAAkoFdwAD8dAFgwAD9HAEcwADWTYHAANZFwAUtL5KCAQABgMAA1lvABS0aAJ9uTsAA1nDAANZ5AACF/2DAAP22ARzAANaJgsAA1nvABS1LWAAAAADAAPxGSsAA1pMBH8AA1p6RUwMAAWrAANamXZE+AWEBYIluYJFJl9ICIhzAANcmJMAA1yYDJ5KGg8AA1ujABS2DJ5KHZAEAARbAANc+gcAA1zbABS0vki+figDAAP3LWzLAANdfYMAA/bZbASeF/4DAANdswAUtGgaQVBfAANrFwADazcAA3JYAAZKIjBwAAAABA8AA2vrAANyWAAAAAQEBwADbBAAAAJKAYIluAABgkUkBPgROwADbH8AA2ycAAJIoYJ9nAR/AANstn4wAAAAATsAA20vAANtZAACSgV3AAPx0AWDAAP0cARzAANtjgcAA21vABS5dkoIBAAGAwADbccAFLkgAn25OwADbhsAA248AAIX/YMAA/bYBHMAA25+CwADbkcAFLnlYAAAAAMAA/EZKwADbqQEfwADbtJFTAwABasAA27xdkT4BYQFgiW5gkUmYIAIiHMAA3EMkwADcQwMnkoODwADcDMAFLrEnkolkAQABFsAA3FuBwADcU8AFLl2SL5+KAMAA/ctbMsAA3HxgwAD9tlsBJ4X/gMAA3InABS5IBpBVF8AA4TrAAOFCwADiXwABkoqMHAAAAAEDwADhc8AA4l8AAAABAQHAAOF7AAAAg+xgwAD9tgAAYJFJAT4CScAA4YcWwADhkoDAAOGLwAUvdoFVwAD9vD0wwADhmyeSVz9KwADhuQEfwADhxJFTAwABasAA4cxdkT4BYQFgwAD9tmCRSZiVAiIkwADiNwInkouAwADiLcAFL3ZbMsAA4kpgwAD9tlsBJ4PsgMAA4lXABS92BpBWF8AA5VbAAOVewADnLAABkoyMHAAAAAEDwADlhsAA5ywAAAABAQHAAOWQAAAAkiZgiLMAAGCRSQE+BE7AAOWnwADlrwAAkihgn2cBH8AA5bWfjAAAAABOwADl08AA5d0AAJIpXcAA/HQBYMAA/RwBHMAA5eeBwADl38AFMD+SKgEAAYDAAOXxwAUwKgCfbU7AAOYCwADmBwAAgpBgwAD9tgEcwADmE4LAAOYJwAUwW1gAAAAAwAD8RkrAAOYdAR/AAOYokVMDAAFqwADmMF2RPgFhAWCIs2CRSZjZAiIcwADm4STAAObhAyeSjYPAAOZ4wAUwkyeSjmQBAAEWwADm+YHAAObxwAUwP5Ivn4oAwAD9y1sywADnGmDAAP22WwEngpCAwADnI8AFMCoGkFcXwADrRsAA607AAO64AAGSj4wcAAAAAQPAAOt9wADuuAAAAAQEBMAA64oAAACD7GDAAP22AMAA65sAAACSgGCJbgDAAOuvAAAAkiZgiLMAwADrvwAAAJInYIizAABgkUkBPglJwADryxbAAOvWgMAA68/ABTFYgVXAAP28PTDAAOvfJ5JXP07AAOwJwADsEQAAkihgn2cBH8AA7BefjAAAAABOwADsNcAA7EMAAJKBXcAA/HQBYMAA/RwBHMAA7E2EwADsRcAFMbmSggEAAYHAAOxbwAUxZwCfbk7AAOx2wADsgAAAkildwAD8dAFgwAD9HAEcwADsioTAAOyCwAUxuZIqAQABgsAA7JTABTF0AJ9tTsAA7KvAAOy2AACSK13AAPx0AWDAAP0cARzAAOzAhMAA7LjABTG5kioBAAGDwADsysAFMYEAn21OwADs3MAA7OUAAIX/YMAA/bYBHMAA7PWFwADs58AFMdVYAAAAAMAA/EZOwADtBsAA7QsAAIKQYMAA/bYBHMAA7ReGwADtDcAFMg1YAAAAAMAA/EZOwADtKMAA7S4AAJIsYMAA/bYBHMAA7TuHwADtMMAFMkVYAAAAAMAA/EZKwADtRQEfwADtUJFTAwABasAA7VhdkT4BYQRgwAD9tmCJbmCIs2CIs2CRSZklAiIcwADuCyTAAO4LCSeSkIDAAO2uwAUxWCeSkRTAAO29wAUyfQgAJ5KSFMAA7eTABTKnCQAnkpMUwADt/8AFMtEKACeBS2QBAAEWwADuI4TAAO4bwAUxuZIvn4oAwAD9y1sywADuRGDAAP22WwQng+yAwADuWMAFMVgnhf+BwADudMAFMWcngpCCwADuj8AFMXQnkiyDwADup8AFMYEGkFgXwADyScAA8lHAAPTlAAGSlIwcAAAAAQPAAPKAwAD05QAAAAICAsAA8o8AAACSgGCJbgDAAPKjAAAAkiZgiLMAAGCRSQE+Bk7AAPK6wADywgAAkihgn2cBH8AA8sifjAAAAABOwADy5sAA8vQAAJKBXcAA/HQBYMAA/RwBHMAA8v6CwADy9sAFNBGSggEAAYDAAPMMwAUz7wCfbk7AAPMnwADzMQAAkildwAD8dAFgwAD9HAEcwADzO4LAAPMzwAU0EZIqAQABgcAA80XABTP8AJ9tTsAA81bAAPNfAACF/2DAAP22ARzAAPNvg8AA82HABTQtWAAAAADAAPxGTsAA84DAAPOFAACCkGDAAP22ARzAAPORhMAA84fABTRlWAAAAADAAPxGSsAA85sBH8AA86aRUwMAAWrAAPOuXZE+AWECYIluYIizYJFJmXQCIhzAAPSDJMAA9IMFJ5KVhcAA9CTABTSdJ5KWhsAA9HjABTTHJ4FLZAEAARbAAPSbgsAA9JPABTQRki+figDAAP3LWzLAAPS8YMAA/bZbAieF/4DAAPTJwAUz7yeCkIHAAPTcwAUz/AaQWRfAAPhwwAD4eMAA+qkAAZKXjBwAAAABA8AA+KbAAPqpAAAAAgICwAD4swAAAIPsYMAA/bYAwAD4xAAAAJKAYIluAABgkUkBPgVJwAD40xbAAPjegMAA+NfABTWngVXAAP28PTDAAPjnJ5JXP07AAPkRwAD5GQAAkihgn2cBH8AA+R+fjAAAAABOwAD5PcAA+UsAAJKBXcAA/HQBYMAA/RwBHMAA+VWCwAD5TcAFNe6SggEAAYHAAPljwAU1tgCfbk7AAPl4wAD5gQAAhf9gwAD9tgEcwAD5kYPAAPmDwAU2ClgAAAAAwAD8RkrAAPmbAR/AAPmmkVMDAAFqwAD5rl2RPgFhAmDAAP22YIluYJFJmckCIhzAAPpEJMAA+kQFJ5KYgMAA+f7ABTWnJ5KZhMAA+h7ABTZCJ5KaZAEAARbAAPpcgsAA+lTABTXuki+figDAAP3LWzLAAPp9YMAA/bZbAieD7IDAAPqIwAU1pyeF/4HAAPqcwAU1tgaQWhfAAP4fwAD+J8ABAFEAAZKbjBwAAAABA8AA/lDAAQBRAAAAAgICwAD+XQAAAIPsYMAA/bYAwAD+bgAAAJKAYIluAABgkUkBPgVJwAD+fRbAAP6IgMAA/oHABTckgVXAAP28PTDAAP6RJ5JXP07AAP67wAD+wwAAkihgn2cBH8AA/smfjAAAAABOwAD+58AA/vUAAJKBXcAA/HQBYMAA/RwBHMAA/v+CwAD+98AFN2uSggEAAYHAAP8NwAU3MwCfbk7AAP8iwAD/KwAAhf9gwAD9tgEcwAD/O4PAAP8twAU3h1gAAAAAwAD8RkrAAP9FAR/AAP9QkVMDAAFqwAD/WF2RPgFhAmDAAP22YIluYJFJmhUCIhzAAP/sJMAA/+wFJ5KcgMAA/6XABTckJ5KdhMAA/8bABTe/J5KaZAEAARbAAQAEgsAA//zABTdrki+figDAAP3LWzLAAQAlYMAA/bZbAieD7IDAAQAwwAU3JCeF/4HAAQBEwAU3MwaQWxfAAQODwAEDi8ABBOQAAZKejBwAAAABA8ABA7nAAQTkAAAAAQEBwAEDwQAAAIC9YMAA/bYAAGCRSQE+A0nAAQPLFsABA9SAwAEDz8AFOKGBVcAA/bw9MMABA90nkh0/PYjAAQP5wAU4oR7AAQQAgkkBAAGAwAEEHcAFOKEASsABBCYBH8ABBDGRUwMAAWrAAQQ5XZE+AWEBYMAA/bZgkUmaagIiJMABBMADJ5KfgMABBJDABTihJ5KgWzLAAQTTYMAA/bZbASeAvYDAAQTcwAU4oQaQXBfAAQjAwAEIyMABCxEAAZKhjBwAAAABA8ABCQDAAQsRAAAAAQEBwAEJDwAAAJKAYIluAABgkUkBPgROwAEJKsABCTIAAJIoYJ9nAR/AAQk4n4wAAAAATsABCVbAAQlkAACSgV3AAPx0AWDAAP0cARzAAQlugcABCWbABTmLkoIBAAGAwAEJfMAFOXYAn25OwAEJkcABCZoAAIX/YMAA/bYBHMABCaqCwAEJnMAFOadYAAAAAMAA/EZKwAEJtAEfwAEJv5FTAwABasABCcddkT4BYQFgiW5gkUmaugIiHMABCr4kwAEKvgMnkqKDwAEKGsAFOd8nkqNkAQABFsABCtaBwAEKzsAFOYuSL5+KAMAA/ctbMsABCvdgwAD9tlsBJ4X/gMABCwTABTl2BpBdF8ABDnzAAQ6EwAEQkAABkqSMHAAAAAEDwAEOrMABEJAAAAABAQHAAQ62AAAAkoBgiW4AAGCRSQE+BE7AAQ7RwAEO2QAAkihgn2cBH8ABDt+fjAAAAABOwAEO/cABDwsAAJKBXcAA/HQBYMAA/RwBHMABDxWBwAEPDcAFOrmSggEAAYDAAQ8jwAU6pACfbk7AAQ84wAEPQQAAhf9gwAD9tgEcwAEPUYLAAQ9DwAU61VgAAAAAwAD8RkrAAQ9bAR/AAQ9mkVMDAAFqwAEPbl2RPgFhAWCJbmCRSZr8AiIcwAEQPSTAARA9AyeSpYPAARAuwAU7DSeBS2QBAAEWwAEQVYHAARBNwAU6uZIvn4oAwAD9y1sywAEQdmDAAP22WwEnhf+AwAEQg8AFOqQGkF4XwAET/sABFAbAARbDAAGSpowcAAAAAQPAARQowAEWwwAAAAMDA8ABFDcAAACSgGCJbgDAARRLAAAAkiZgiLMAwAEUWwAAAJInYIizAABgkUkBPghOwAEUc8ABFHsAAJIoYJ9nAR/AARSBn4wAAAAATsABFJ/AARStAACSgV3AAPx0AWDAAP0cARzAARS3g8ABFK/ABTwBkoIBAAGAwAEUxcAFO9IAn25OwAEU4MABFOoAAJIpXcAA/HQBYMAA/RwBHMABFPSDwAEU7MAFPAGSKgEAAYHAART+wAU73wCfbU7AARUVwAEVIAAAkitdwAD8dAFgwAD9HAEcwAEVKoPAARUiwAU8AZIqAQABgsABFTTABTvsAJ9tTsABFUbAARVPAACF/2DAAP22ARzAARVfhMABFVHABTwdWAAAAADAAPxGTsABFXDAARV1AACCkGDAAP22ARzAARWBhcABFXfABTxVWAAAAADAAPxGTsABFZLAARWYAACSLGDAAP22ARzAARWlhsABFZrABTyNWAAAAADAAPxGSsABFa8BH8ABFbqRUwMAAWrAARXCXZE+AWEDYIluYIizYIizYJFJm0QCIhzAARZQJMABFlAHJ5Knh8ABFg3ABTzFJ5KoFMABFinABTzvCAAnkpMUwAEWRMAFPRkJACeBS2QBAAEWwAEWaIPAARZgwAU8AZIvn4oAwAD9y1sywAEWiWDAAP22WwMnhf+AwAEWlsAFO9IngpCBwAEWqcAFO98nkiyCwAEWucAFO+wGkF8XwAEZ88ABGfvAARu4AAGSqYwcAAAAAQPAARokwAEbuAAAAAEBAcABGi4AAACSgGCJbgAAYJFJAT4ETsABGknAARpRAACSKGCfZwEfwAEaV5+MAAAAAE7AARp1wAEagwAAkoFdwAD8dAFgwAD9HAEcwAEajYHAARqFwAU+LZKCAQABgMABGpvABT4YAJ9uTsABGrDAARq5AACF/2DAAP22ARzAARrJgsABGrvABT5JWAAAAADAAPxGSsABGtMBH8ABGt6RUwMAAWrAARrmXZE+AWEBYIluYJFJm5cCIhzAARtlJMABG2UDJ5KGg8ABGy7ABT6BJ5KJZAEAARbAARt9gcABG3XABT4tki+figDAAP3LWzLAARueYMAA/bZbASeF/4DAARurwAU+GAaQYBfAAR8WwAEfHsABIREAAZKqjBwAAAABA8ABH0LAASERAAAAAwMDwAEfTwAAAIPsYMAA/bYAwAEfXgAAAJJwYMAA/bYAwAEfbgAAAJKrYMAA/bYAAGCRSQE+BEnAAR97FsABH4aAwAEff8AFP0aBVcAA/bw9MMABH48nklc/ScABH60WwAEfuYHAAR+xwAU/VYFVwAD9vD0wwAEfwieSVz9JwAEf4BbAAR/sgsABH+TABT9kgVXAAP28PTDAAR/1J5JXP0rAASATAR/AASAekVMDAAFqwAEgJl2RPgFhA2DAAP22YMAA/bZgwAD9tmCRSZvlAiIkwAEgwQcnkpCAwAEgccAFP0YnkpGBwAEggMAFP1UnkqyCwAEgtMAFP2QngUtbMsABINRgwAD9tlsDJ4PsgMABIN/ABT9GJ5JwgcABIPLABT9VJ5KrgsABIQbABT9kBpBhF8ABJBzAASQkwAElUQABkq2MHAAAAAEDwAEkTcABJVEAAAABAQHAASRVAAAAg+xgwAD9tgAAYJFJAT4CScABJGEWwAEkbIDAASRlwAVAm4FVwAD9vD0wwAEkdSeSVz9KwAEkkwEfwAEknpFTAwABasABJKZdkT4BYQFgwAD9tmCRSZxAAiIkwAElKQMnkq6AwAEk/8AFQJsnkq9bMsABJTxgwAD9tlsBJ4PsgMABJUfABUCbBpBiF8ABKJLAASiawAEp3gABkrCMHAAAAAEDwAEox8ABKd4AAAABAQHAASjPAAAAg+xgwAD9tgAAYJFJAT4CScABKNsWwAEo5oDAASjfwAVBUoFVwAD9vD0wwAEo7yeSVz9KwAEpDQEfwAEpGJFTAwABasABKSBdkT4BYQFgwAD9tmCRSZySAiIkwAEptgMnkrGAwAEpccAFQVInkrJbMsABKclgwAD9tlsBJ4PsgMABKdTABUFSBpBjF8ABM6LAATOqwAE1OAABkrOMHAAAAAEDwAEzzMABNTgAAAACAgLAATPUAAAAg+xgwAD9tgDAATPjAAAAknBgwAD9tgAAYJFJAT4DScABM/AWwAEz+4DAATP0wAVCCYFVwAD9vD0wwAE0BCeSVz9JwAE0IhbAATQugcABNCbABUIYgVXAAP28PTDAATQ3J5JXP0rAATRVAR/AATRgkVMDAAFqwAE0aF2RPgFhAmDAAP22YMAA/bZgkUmdlAIiJMABNPwFJ5KQgMABNLHABUIJJ5KRgcABNMDABUIYJ5K0WzLAATUPYMAA/bZbAieD7IDAATUawAVCCSeScIHAATUtwAVCGAaQZBfAATzQwAE82MABPmsAAZK1jBwAAAABA8ABPQLAAT5rAAAAAQEBwAE9CgAAAIC9YMAA/bYAAGCRSQE+A0nAAT0UFsABPR2AwAE9GMAFQw+BVcAA/bw9MMABPSYnkh0/PYjAAT1CwAVDDx7AAT1JgkkBAAGAwAE9ZsAFQw8ASsABPW8BH8ABPXqRUwQAAWrAAT2CXZE+AWEBYMAA/bZgkUmeTwMiJMABPeoDJ5K2gMABPczABUMPJ5K3iJwnil1bMsABPlpgwAD9tlsBJ4C9gMABPmPABUMPBpBlF8ABRqnAAUaxwAFHyAABkriMHAAAAAEDwAFG0sABR8gAAAABAQHAAUbaAAAAgL1gwAD9tgAAYJFJAT4DScABRuQWwAFG7YDAAUbowAVD6YFVwAD9vD0wwAFG9ieSHT89iMABRxLABUPpHsABRxmCSQEAAYDAAUc2wAVD6QBKwAFHPwEfwAFHSpFTAwABasABR1JdkT4BYQFgwAD9tmCRSZ82AiIkwAFHpAMnkrmAwAFHmsAFQ+kngUtbMsABR7dgwAD9tlsBJ4C9gMABR8DABUPpBpBmF8ABU6fAAVOvwAFU5wABkrqMHAAAAAEDwAFT3MABVOcAAAABAQHAAVPkAAAAgL1gwAD9tgAAYJFJAT4DScABU+4WwAFT94DAAVPywAVEvoFVwAD9vD0wwAFUACeSHT89iMABVBzABUS+HsABVCOCSQEAAYDAAVRAwAVEvgBKwAFUSQEfwAFUVJFTAwABasABVFxdkT4BYQFgwAD9tmCRSaBvAiIkwAFUwwMnkruAwAFUucAFRL4ngUtbMsABVNZgwAD9tlsBJ4C9gMABVN/ABUS+BpBnF8ABWyrAAVsywAFcbQABkryMHAAAAAEDwAFbXcABXG0AAAABAQHAAVtlAAAAgL1gwAD9tgAAYJFJAT4DScABW28WwAFbeIDAAVtzwAVFk4FVwAD9vD0wwAFbgSeSHT89iMABW53ABUWTHsABW6SCSQEAAYDAAVvBwAVFkwBKwAFbygEfwAFb1ZFTAwABasABW91dkT4BYQFgwAD9tmCRSaEMAiIkwAFcSQMnkr2AwAFcJ8AFRZMnkkxbMsABXFxgwAD9tlsBJ4C9gMABXGXABUWTBpBoF8ABYSfAAWEvwAFidwABkr6MHAAAAAEDwAFhTcABYncAAAACAgLAAWFVAAAAg+xgwAD9tgDAAWFkAAAAknBgwAD9tgAAYJFJAT4DScABYXEWwAFhfIDAAWF1wAVGaIFVwAD9vD0wwAFhhSeSVz9JwAFhoxbAAWGvgcABYafABUZ3gVXAAP28PTDAAWG4J5JXP0rAAWHWAR/AAWHhkVMDAAFqwAFh6V2RPgFhAmDAAP22YMAA/bZgkUmhfwIiJMABYkEFJ5K/gMABYifABUZoJ5LAgcABYjXABUZ3J4FqWzLAAWJOYMAA/bZbAieD7IDAAWJZwAVGaCeScIHAAWJswAVGdwaQaRfAAWl7wAFpg8ABa3EAAZLBjBwAAAABA8ABaaXAAWtxAAAAAgICwAFprQAAAIC9YMAA/bYAwAFpugAAAIPsYMAA/bYAAGCRSQE+BEnAAWnGFsABac+AwAFpysAFR26BVcAA/bw9MMABadgnkh0/PYjAAWn0wAVHbh7AAWn7gkkBAAGAwAFqGMAFR24AScABaiEWwAFqLIHAAWolwAVHfYFVwAD9vD0wwAFqNSeSVz9KwAFqUwEfwAFqXpFTBAABasABamZdkT4BYQJgwAD9tmDAAP22YJFJojQDIiTAAWrJBSeSwoDAAWqawAVHbieSw4HAAWq9wAVHfSeBS4icJ4q4WzLAAWtOYMAA/bZbAieAvYDAAWtXwAVHbieD7IHAAWtnwAVHfQaQahfAAW4XwAFuH8ABbzcAAZLEjBwAAAABA8ABbkHAAW83AAAAAQEBwAFuSQAAAIC9YMAA/bYAAGCRSQE+A0nAAW5TFsABblyAwAFuV8AFSJeBVcAA/bw9MMABbmUnkh0/PYjAAW6BwAVIlx7AAW6IgkkBAAGAwAFupcAFSJcASsABbq4BH8ABbrmRUwMAAWrAAW7BXZE+AWEBYMAA/bZgkUmiiwIiJMABbxMDJ4NCgMABbvDABUiXJ5LFWzLAAW8mYMAA/bZbASeAvYDAAW8vwAVIlwaQaxfAAXI8wAFyRMABc4AAAZLGjBwAAAABA8ABcnbAAXOAAAAAAQEBwAFyfgAAAIC9YMAA/bYAAGCRSQE+A0nAAXKIFsABcpGAwAFyjMAFSWyBVcAA/bw9MMABcponkh0/PYjAAXK2wAVJbB7AAXK9gkkBAAGAwAFy2sAFSWwASsABcuMBH8ABcu6RUwMAAWrAAXL2XZE+AWEBYMAA/bZgkUmi3QIiJMABc1wDJ5LHgMABc1LABUlsJ4FLWzLAAXNvYMAA/bZbASeAvYDAAXN4wAVJbAaQbBfAAXYTwAF2G8ABdzIAAZLIjBwAAAABA8ABdjbAAXcyAAAAAQEBwAF2PgAAAIC9YMAA/bYAAGCRSQE+A0nAAXZIFsABdlGAwAF2TMAFSkGBVcAA/bw9MMABdlonkh0/PYjAAXZ2wAVKQR7AAXZ9gkkBAAGAwAF2msAFSkEASsABdqMBH8ABdq6RUwMAAWrAAXa2XZE+AWEBYMAA/bZgkUmjLwIiJMABdw4DJ5LJgMABdurABUpBJ5LKWzLAAXchYMAA/bZbASeAvYDAAXcqwAVKQQaQbRfAAX8WwAF/HsABgNsAAZLLjBwAAAABA8ABf1fAAYDbAAAAAQEBwAF/XwAAAIC9YMAA/bYAAGCRSQE+A0nAAX9pFsABf3KAwAF/bcAFSxaBVcAA/bw9MMABf3snkh0/PYjAAX+XwAVLFh7AAX+egkkBAAGAwAF/u8AFSxYASsABf8QBH8ABf8+RUwQAAWrAAX/XXZE+AWEBYMAA/bZgkUmj2gMiJMABgIUDJ5LMgMABgGXABUsWJ5LNiJwnitZbMsABgMpgwAD9tlsBJ4C9gMABgNPABUsWBpBuF8ABhbLAAYW6wAGHFAABks6MHAAAAAEDwAGF4MABhxQAAAABAQHAAYXoAAAAgL1gwAD9tgAAYJFJAT4DScABhfIWwAGF+4DAAYX2wAVL8IFVwAD9vD0wwAGGBCeSHT89iMABhiDABUvwHsABhieCSQEAAYDAAYZEwAVL8ABKwAGGTQEfwAGGWJFTAwABasABhmBdkT4BYQFgwAD9tmCRSaRXAiIkwAGG8AMnks+AwAGGsMAFS/AnktBbMsABhwNgwAD9tlsBJ4C9gMABhwzABUvwBpBvF8ABib/AAYnHwAGK3wABktGMHAAAAAEDwAGJ8sABit8AAAABAQHAAYn6AAAAgL1gwAD9tgAAYJFJAT4DScABigQWwAGKDYDAAYoIwAVMxYFVwAD9vD0wwAGKFieSHT89iMABijLABUzFHsABijmCSQEAAYDAAYpWwAVMxQBKwAGKXwEfwAGKapFTAwABasABinJdkT4BYQFgwAD9tmCRSaSdAiIkwAGKwQMng0KAwAGKqsAFTMUnktJbMsABis5gwAD9tlsBJ4C9gMABitfABUzFBpBwF8ABjuzAAY70wAGRnQABktOMHAAAAAEDwAGPGMABkZ0AAAACAgLAAY8iAAAAkiZgiLMAwAGPMAAAAIC9YMAA/bYAAGCRSQE+Bk7AAY9GwAGPTgAAkihgn2cBH8ABj1SfjAAAAABOwAGPcsABj3wAAJIpXcAA/HQBYMAA/RwBHMABj4aCwAGPfsAFTb6SKgEAAYDAAY+QwAVNmgCfbUnAAY+aFsABj6OBwAGPnsAFTaeBVcAA/bw9MMABj6wnkh0/PYnAAY/IwAVNpx7AAY/PgkkBAAGBwAGP7MAFTacATsABj/zAAZABAACCkGDAAP22ARzAAZANg8ABkAPABU3aWAAAAADAAPxGSsABkBcBH8ABkCKRUwQAAWrAAZAqXZE+AWECYIizYMAA/bZgkUmk9QMiHMABkMgkwAGQyAUnko2EwAGQbsAFTlMnktSBwAGQlsAFTacnktVkAQABFsABkOCCwAGQ2MAFTb6SL5+KAMAA/cuInCTAAZFqBSeS1oHAAZEswAVNpyeS14TAAZFMwAVOUyeS2FsywAGRfWDAAP22WwIngpCAwAGRhsAFTZongL2BwAGRlcAFTacGkHEXwAGVPsABlUbAAZiAAAGS2YwcAAAAAQPAAZVmwAGYgAAAAAUFBcABlXAAAACA7mDAAPvQAMABlXsAAACS2mDAAPvQAMABlYcAAACS22DAAPzmAMABlZIAAACS3GDAAPzmAMABlZ0AAACS3WDAAPzmAABgkUkBPglJwAGVqBzAAZWygMABlazABU9YSAEAASsAwAD88z0wwAGVuyeS3j9JwAGV2BzAAZXjgcABldzABU9nSAEAASsAwAD88z0wwAGV7CeS3j9JwAGWCRzAAZYTgsABlg3ABU92SAEAASsAwAD88z0wwAGWHCeS3z9OwAGWQcABlkYAAJLgYMAA/bYBHMABlk6CwAGWSMAFT3aBuAEAAZYAwAD9DUnAAZZkHMABlm6DwAGWaMAFT4VIAQABKwDAAPzzPTDAAZZ3J5LfP07AAZacwAGWoQAAkuFgwAD9tgEcwAGWvBzAAZapg8ABlqPABU+FgbgBAAGWAMAA/Q2SOQEAATcMAMAA/dFJwAGWyxzAAZbVhMABls/ABU+USAEAASsAwAD88z0wwAGW3ieS3z9OwAGXA8ABlwgAAJLiYMAA/bYBHMABlyMcwAGXEITAAZcKwAVPlIG4AQABlgDAAP0NkjkBAAE3DADAAP3RSsABlzIBH8ABlz2RUwMAAWrAAZdFXZE+AWEFYMAA+9BgwAD70GDAAPzmYMAA/OZgwAD85mCRSaVSAiIkwAGX6wsnkuOAwAGXg8AFT1gnkuSBwAGXl8AFT2cnkuWFwAGXq8AFUCAnkuaGwAGXv8AFUHMnkueHwAGX1cAFUNcnkuhbMsABl/5gwAD9tlsFJ4DugMABmBHABU9YJ5LagcABmCrABU9nJ5LggsABmELABU92J5Lhg8ABmFnABU+FJ5LihMABmHDABU+UBpByF8ABm+DAAZvowAGdhgABkumMHAAAAAEDwAGcEMABnYYAAAABAQHAAZwYAAAAgL1gwAD9tgAAYJFJAT4DScABnCIWwAGcK4DAAZwmwAVSBYFVwAD9vD0wwAGcNCeSHT89iMABnFDABVIFHsABnFeCSQEAAYDAAZx0wAVSBQBKwAGcfQEfwAGciJFTBAABasABnJBdkT4BYQFgwAD9tmCRSaWsAyIkwAGc8AMnksKAwAGcysAFUgUnkuqInCeKuFsywAGddWDAAP22WwEngL2AwAGdfsAFUgUGkHMXwAGkIMABpCjAAaW7AAGS64wcAAAAAQPAAaRVwAGluwAAAAEBAcABpF0AAACAvWDAAP22AABgkUkBPgNJwAGkZxbAAaRwgMABpGvABVLfgVXAAP28PTDAAaR5J5IdPz2IwAGklcAFUt8ewAGknIJJAQABgMABpLnABVLfAErAAaTCAR/AAaTNkVMEAAFqwAGk1V2RPgFhAWDAAP22YJFJpk8DIiTAAaVXAyeS7IDAAaUjwAVS3yeS7YicJ4sCWzLAAaWqYMAA/bZbASeAvYDAAaWzwAVS3waQdBfAAan6wAGqAsABqyUAAZLujBwAAAABA8ABqiXAAaslAAAAAQEBwAGqLQAAAIC9YMAA/bYAAGCRSQE+A0nAAao3FsABqkCAwAGqO8AFU7mBVcAA/bw9MMABqkknkh0/PYjAAaplwAVTuR7AAapsgkkBAAGAwAGqicAFU7kASsABqpIBH8ABqp2RUwMAAWrAAaqlXZE+AWEBYMAA/bZgkUmmywIiJMABqwEDJ4NCgMABqtXABVO5J5LvWzLAAasUYMAA/bZbASeAvYDAAasdwAVTuQaQdRfAAa3MwAGt1MABrvcAAZLwjBwAAAABA8ABrfzAAa73AAAAAQEBwAGuBAAAAIC9YMAA/bYAAGCRSQE+A0nAAa4OFsABrheAwAGuEsAFVI6BVcAA/bw9MMABriAnkh0/PYjAAa48wAVUjh7AAa5DgkkBAAGAwAGuYMAFVI4ASsABrmkBH8ABrnSRUwMAAWrAAa58XZE+AWEBYMAA/bZgkUmnEQIiJMABrtMDJ5LxgMABrsnABVSOJ4FLWzLAAa7mYMAA/bZbASeAvYDAAa7vwAVUjgaQdhfAAbIQwAGyGMABs3UAAZLyjBwAAAABA8ABsknAAbN1AAAAAQEBwAGyUQAAAIC9YMAA/bYAAGCRSQE+A0nAAbJbFsABsmSAwAGyX8AFVWOBVcAA/bw9MMABsm0nkh0/PYjAAbKJwAVVYx7AAbKQgkkBAAGAwAGyrcAFVWMASsABsrYBH8ABssGRUwMAAWrAAbLJXZE+AWEBYMAA/bZgkUmnVgIiJMABs1EDJ5LxgMABsynABVVjJ5LzWzLAAbNkYMAA/bZbASeAvYDAAbNtwAVVYwaQdxfAAbYMwAG2FMABt0sAAZL0jBwAAAABA8ABtjrAAbdLAAAAAQEBwAG2QgAAAIC9YMAA/bYAAGCRSQE+A0nAAbZMFsABtlWAwAG2UMAFVjiBVcAA/bw9MMABtl4nkh0/PYjAAbZ6wAVWOB7AAbaBgkkBAAGAwAG2nsAFVjgASsABtqcBH8ABtrKRUwMAAWrAAba6XZE+AWEBYMAA/bZgkUmnmwIiJMABtycDJ5JSgMABtvfABVY4J5L1WzLAAbc6YMAA/bZbASeAvYDAAbdDwAVWOAaQeBfAAbpGwAG6TsABu+0AAZL2jBwAAAABA8ABumzAAbvtAAAAAwMDwAG6dAAAAIC9YMAA/bYAwAG6fgAAAJJiYMAA/jcAwAG6iAAAAJL3YMAA/jcAAGCRSQE+BUnAAbqTFsABupyAwAG6l8AFVw2BVcAA/bw9MMABuqUnkh0/PYjAAbrBwAVXDR7AAbrIgkkBAAGAwAG65cAFVw0ATsABuvXAAbr5AACArGDAAP22AR7AAbr7kDABAAGBwAG7CcAFVxwATsABuxnAAbseAACS+GDAAP22AR7AAbsgkDABAAGCwAG7LsAFVysASsABuzgBH8ABu0ORUwMAAWrAAbtLXZE+AWEDYMAA/bZgwAD+N2DAAP43YJFJp/YCIiTAAbutByeDQoDAAbt2wAVXDSeS+YPAAbuWwAVXgyeSLoTAAbujwAVXqieBS1sywAG7wGDAAP22WwMngL2AwAG7ycAFVw0ngKyBwAG71sAFVxwnkviCwAG75MAFVysGkHkXwAG/AMABvwjAAcCzAAGS+owcAAAAAQPAAb8swAHAswAAAAMDA8ABvzQAAACAvWDAAP22AMABvz4AAACSYmDAAP43AMABv0gAAACS92DAAP43AABgkUkBPgVJwAG/UxbAAb9cgMABv1fABViIgVXAAP28PTDAAb9lJ5IdPz2IwAG/gcAFWIgewAG/iIJJAQABgMABv6XABViIAE7AAb+1wAG/uQAAgKxgwAD9tgEewAG/u5AwAQABgcABv8nABViXAE7AAb/ZwAG/3gAAkvhgwAD9tgEewAG/4JAwAQABgsABv+7ABVimAErAAb/4AR/AAcADkVMDAAFqwAHAC12RPgFhA2DAAP22YMAA/jdgwAD+N2CRSahNAiIkwAHAcwcng0KAwAHAPMAFWIgnkvmDwAHAXMAFWP4nki6EwAHAacAFWSUngUtbMsABwIZgwAD9tlsDJ4C9gMABwI/ABViIJ4CsgcABwJzABViXJ5L4gsABwKrABVimBpB6F8ABw53AAcOlwAHFRAABkvuMHAAAAAEDwAHDw8ABxUQAAAADAwPAAcPLAAAAgL1gwAD9tgDAAcPVAAAAkmJgwAD+NwDAAcPfAAAAkvdgwAD+NwAAYJFJAT4FScABw+oWwAHD84DAAcPuwAVaA4FVwAD9vD0wwAHD/CeSHT89iMABxBjABVoDHsABxB+CSQEAAYDAAcQ8wAVaAwBOwAHETMABxFAAAICsYMAA/bYBHsABxFKQMAEAAYHAAcRgwAVaEgBOwAHEcMABxHUAAJL4YMAA/bYBHsABxHeQMAEAAYLAAcSFwAVaIQBKwAHEjwEfwAHEmpFTAwABasABxKJdkT4BYQNgwAD9tmDAAP43YMAA/jdgkUmopgIiJMABxQQHJ4NCgMABxM3ABVoDJ5L8g8ABxO3ABVp5J5IuhMABxPrABVqgJ4FLWzLAAcUXYMAA/bZbAyeAvYDAAcUgwAVaAyeArIHAAcUtwAVaEieS+ILAAcU7wAVaIQaQexfAAciMwAHIlMAByj8AAZL9jBwAAAABA8AByLjAAco/AAAAAwMDwAHIwAAAAIC9YMAA/bYAwAHIygAAAJJiYMAA/jcAwAHI1AAAAJL3YMAA/jcAAGCRSQE+BUnAAcjfFsAByOiAwAHI48AFW36BVcAA/bw9MMAByPEnkh0/PYjAAckNwAVbfh7AAckUgkkBAAGAwAHJMcAFW34ATsAByUHAAclFAACArGDAAP22AR7AAclHkDABAAGBwAHJVcAFW40ATsAByWXAAclqAACS+GDAAP22AR7AAclskDABAAGCwAHJesAFW5wASsAByYQBH8AByY+RUwMAAWrAAcmXXZE+AWEDYMAA/bZgwAD+N2DAAP43YJFJqQgCIiTAAcn/ByeDQoDAAcnIwAVbfieS/IPAAcnowAVb9CeSLoTAAcn1wAVcGyeBS1sywAHKEmDAAP22WwMngL2AwAHKG8AFW34ngKyBwAHKKMAFW40nkviCwAHKNsAFW5wGkHwXwAHNFsABzR7AAc5SAAGS/owcAAAAAQPAAc1DwAHOUgAAAAEBAcABzUsAAACAvWDAAP22AABgkUkBPgNJwAHNVRbAAc1egMABzVnABVz5gVXAAP28PTDAAc1nJ5IdPz2IwAHNg8AFXPkewAHNioJJAQABgMABzafABVz5AErAAc2wAR/AAc27kVMDAAFqwAHNw12RPgFhAWDAAP22YJFJqWQCIiTAAc4uAyeS/4DAAc4JwAVc+SeTAFsywAHOQWDAAP22WwEngL2AwAHOSsAFXPkGkH0XwAHRCsAB0RLAAdI7AAGTAYwcAAAAAQPAAdE+wAHSOwAAAAEBAcAB0UYAAACAvWDAAP22AABgkUkBPgNJwAHRUBbAAdFZgMAB0VTABV3OgVXAAP28PTDAAdFiJ5IdPz2IwAHRfsAFXc4ewAHRhYJJAQABgMAB0aLABV3OAErAAdGrAR/AAdG2kVMDAAFqwAHRvl2RPgFhAWDAAP22YJFJqaoCIiTAAdIXAyeDQoDAAdH3wAVdzieTAlsywAHSKmDAAP22WwEngL2AwAHSM8AFXc4GkH4XwAHVNsAB1T7AAdZyAAGTA4wcAAAAAQPAAdVjwAHWcgAAAAEBAcAB1WsAAACAvWDAAP22AABgkUkBPgNJwAHVdRbAAdV+gMAB1XnABV6jgVXAAP28PTDAAdWHJ5IdPz2IwAHVo8AFXqMewAHVqoJJAQABgMAB1cfABV6jAErAAdXQAR/AAdXbkVMDAAFqwAHV412RPgFhAWDAAP22YJFJqfsCIiTAAdZOAyeS/4DAAdYpwAVeoyeTBFsywAHWYWDAAP22WwEngL2AwAHWasAFXqMGkH8XwAHZKsAB2TLAAdpbAAGTBYwcAAAAAQPAAdlewAHaWwAAAAEBAcAB2WYAAACAvWDAAP22AABgkUkBPgNJwAHZcBbAAdl5gMAB2XTABV94gVXAAP28PTDAAdmCJ5IdPz2IwAHZnsAFX3gewAHZpYJJAQABgMAB2cLABV94AErAAdnLAR/AAdnWkVMDAAFqwAHZ3l2RPgFhAWDAAP22YJFJqkECIiTAAdo3AyeDQoDAAdoXwAVfeCeTBlsywAHaSmDAAP22WwEngL2AwAHaU8AFX3gGkIAXwAHdI8AB3SvAAd5YAAGTB4wcAAAAAQPAAd1LwAHeWAAAAAEBAcAB3VIAAACSTmCeqwAAYJFJAT4CTsAB3WTAAd1rAACCXmDAAP22ARbAAd1zgMAB3W3ABWBNgl6exUrAAd19AR/AAd2IkVMEAAFqwAHdkF2RPgFhAWCeq2CRSaqLAyIkwAHd7AMnkwiBwAHdysAFYGInkwmInCeLP1sywAHeRWDAAP22WwEnkk6AwAHeT8AFYE0GkIEXwAHhYsAB4WrAAeK7AAGTCowcAAAAAQPAAeGUwAHiuwAAAAEBAcAB4ZwAAACAvWDAAP22AABgkUkBPgNJwAHhphbAAeGvgMAB4arABWEHgVXAAP28PTDAAeG4J5IdPz2IwAHh1MAFYQcewAHh24JJAQABgMAB4fjABWEHAErAAeIBAR/AAeIMkVMDAAFqwAHiFF2RPgFhAWDAAP22YJFJqtoCIiTAAeKXAyeTC4DAAeJjwAVhByeTDFsywAHiqmDAAP22WwEngL2AwAHis8AFYQcGkIIXwAHlicAB5ZHAAea0AAGTDYwcAAAAAQPAAeXAwAHmtAAAAAEBAcAB5cgAAACAvWDAAP22AABgkUkBPgNJwAHl0hbAAeXbgMAB5dbABWHcgVXAAP28PTDAAeXkJ5IdPz2IwAHmAMAFYdwewAHmB4JJAQABgMAB5iTABWHcAErAAeYtAR/AAeY4kVMDAAFqwAHmQF2RPgFhAWDAAP22YJFJqyACIiTAAeaWAyeTDoDAAeaMwAVh3CeBS1sywAHmo2DAAP22WwEngL2AwAHmrMAFYdwGkIMXwAHpY8AB6WvAAeqKAAGTD4wcAAAAAQPAAemQwAHqigAAAAEBAcAB6ZgAAACAvWDAAP22AABgkUkBPgNJwAHpohbAAemrgMAB6abABWKxgVXAAP28PTDAAem0J5IdPz2IwAHp0MAFYrEewAHp14JJAQABgMAB6fTABWKxAErAAen9AR/AAeoIkVMDAAFqwAHqEF2RPgFhAWDAAP22YJFJq3ECIiTAAepmAyeTEIDAAepcwAVisSeBS1sywAHqeWDAAP22WwEngL2AwAHqgsAFYrEGkIQXwAHtNcAB7T3AAe5cAAGTEYwcAAAAAQPAAe1iwAHuXAAAAAEBAcAB7WoAAACAvWDAAP22AABgkUkBPgNJwAHtdBbAAe19gMAB7XjABWOGgVXAAP28PTDAAe2GJ5IdPz2IwAHtosAFY4YewAHtqYJJAQABgMAB7cbABWOGAErAAe3PAR/AAe3akVMDAAFqwAHt4l2RPgFhAWDAAP22YJFJq7cCIiTAAe44AyeTEoDAAe4uwAVjhieBS1sywAHuS2DAAP22WwEngL2AwAHuVMAFY4YGkIUXwAHxC8AB8RPAAfI4AAGTE4wcAAAAAQPAAfE9wAHyOAAAAAEBAcAB8UUAAACAvWDAAP22AABgkUkBPgNJwAHxTxbAAfFYgMAB8VPABWRbgVXAAP28PTDAAfFhJ5IdPz2IwAHxfcAFZFsewAHxhIJJAQABgMAB8aHABWRbAErAAfGqAR/AAfG1kVMDAAFqwAHxvV2RPgFhAWDAAP22YJFJq/0CIiTAAfIUAyeTFIDAAfIKwAVkWyeBS1sywAHyJ2DAAP22WwEngL2AwAHyMMAFZFsGkIYXwAH6McAB+jnAAfuXAAGTFYwcAAAAAQPAAfpmwAH7lwAAAAEBAcAB+m4AAACAvWDAAP22AABgkUkBPgNJwAH6eBbAAfqBgMAB+nzABWUwgVXAAP28PTDAAfqKJ5IdPz2IwAH6psAFZTAewAH6rYJJAQABgMAB+srABWUwAErAAfrTAR/AAfrekVMDAAFqwAH65l2RPgFhAWDAAP22YJFJrNACIiTAAftzAyeTFoDAAftAwAVlMCeTF1sywAH7hmDAAP22WwEngL2AwAH7j8AFZTAGkIcXwAIEkMACBJjAAgWIAAGTGIwcAAAAAQPAAgS5wAIFiAAAAAEBAcACBMEAAACD7GDAAP22AABgkUkBPgJJwAIEzRbAAgTYgMACBNHABWYFgVXAAP28PTDAAgThJ5JXP0rAAgT/AR/AAgUKkVMDAAFqwAIFEl2RPgFhAWDAAP22YJFJrdYCIiTAAgVgAyeTGYDAAgVJwAVmBSeTGlsywAIFc2DAAP22WwEng+yAwAIFfsAFZgUGkIgXwAIOAMACDgjAAg7vAAGTG4wcAAAAAQPAAg4kwAIO7wAAAAEBAcACDiwAAACD7GDAAP22AABgkUkBPgJJwAIOOBbAAg5DgMACDjzABWa8gVXAAP28PTDAAg5MJ5JXP0rAAg5qAR/AAg51kVMDAAFqwAIOfV2RPgFhAWDAAP22YJFJrsECIiTAAg7HAyeTGYDAAg6vwAVmvCeTHFsywAIO2mDAAP22WwEng+yAwAIO5cAFZrwGkIkXwAIRkMACEZjAAhJ/AAGTHYwcAAAAAQPAAhG5wAISfwAAAAEBAcACEcAAAACSTmCeqwAAYJFJAT4CTsACEdLAAhHZAACCXmDAAP22ARbAAhHhgMACEdvABWdzgl6exUrAAhHrAR/AAhH2kVMDAAFqwAIR/l2RPgFhAWCeq2CRSa8RAiIkwAISWQMnkx6BwAISTcAFZ4gngUtbMsACEmxgwAD9tlsBJ5JOgMACEnbABWdzBpCKF8ACFWXAAhVtwAIWpQABkx+MHAAAAAEDwAIVk8ACFqUAAAABAQHAAhWbAAAAg+xgwAD9tgAAYJFJAT4CScACFacWwAIVsoDAAhWrwAVoKIFVwAD9vD0wwAIVuyeSVz9KwAIV2QEfwAIV5JFTBAABasACFexdkT4BYQFgwAD9tmCRSa9ZAyIkwAIWUQMnkyCAwAIWIMAFaCgnkyGInCeLoVsywAIWkGDAAP22WwEng+yAwAIWm8AFaCgGkIsXwAIZQ8ACGUvAAhoxAAGTIowcAAAAAQPAAhlswAIaMQAAAAEBAcACGXMAAACSTmCeqwAAYJFJAT4CTsACGYXAAhmMAACCXmDAAP22ARbAAhmUgMACGY7ABWjkgl6exUrAAhmeAR/AAhmpkVMDAAFqwAIZsV2RPgFhAWCeq2CRSa+oAiIkwAIaCwMnkyOBwAIZ/8AFaPkngUtbMsACGh5gwAD9tlsBJ5JOgMACGijABWjkBpCMF8ACHnvAAh6DwAIfwgABkySMHAAAAAEDwAIeocACH8IAAAABAQHAAh6oAAAAkk5gnqsAAGCRSQE+Ak7AAh66wAIewQAAgl5gwAD9tgEWwAIeyYDAAh7DwAVpmYJensVKwAIe0wEfwAIe3pFTBAABasACHuZdkT4BYQFgnqtgkUmwIQMiJMACHzsDJ5MlgcACHy/ABWmuJ4FLiJwni69bMsACH69gwAD9tlsBJ5JOgMACH7nABWmZBpCNF8ACImnAAiJxwAIjWwABkyaMHAAAAAEDwAIik8ACI1sAAAABAQHAAiKaAAAAkk5gnqsAAGCRSQE+Ak7AAiKswAIiswAAgl5gwAD9tgEWwAIiu4DAAiK1wAVqU4JensVKwAIixQEfwAIi0JFTAwABasACIthdkT4BYQFgnqtgkUmwYwIiJMACIzUDJ5MngcACIynABWpoJ4FLWzLAAiNIYMAA/bZbASeSToDAAiNSwAVqUwaQjhfAAidywAInesACKF4AAZMojBwAAAABA8ACJ5rAAiheAAAAAQEBwAInoQAAAJJOYJ6rAABgkUkBPgJOwAIns8ACJ7oAAIJeYMAA/bYBFsACJ8KAwAInvMAFawiCXp7FSsACJ8wBH8ACJ9eRUwMAAWrAAiffXZE+AWEBYJ6rYJFJsNYCIiTAAig4AyeTKYHAAigswAVrHSeBS1sywAIoS2DAAP22WwEnkk6AwAIoVcAFawgGkI8XwAIqxMACKszAAiu5AAGTKowcAAAAAQPAAirpwAIruQAAAAEBAcACKvEAAACD7GDAAP22AABgkUkBPgJJwAIq/RbAAisIgMACKwHABWu9gVXAAP28PTDAAisRJ5JXP0rAAisvAR/AAis6kVMDAAFqwAIrQl2RPgFhAWDAAP22YJFJsR0CIiTAAiuRAyeTGYDAAit1wAVrvSeTK1sywAIrpGDAAP22WwEng+yAwAIrr8AFa70GkJAXwAIzsMACM7jAAjSPAAGTLIwcAAAAAQPAAjPUwAI0jwAAAAEBAcACM9sAAACSTmCeqwAAYJFJAT4CTsACM+3AAjP0AACCXmDAAP22ARbAAjP8gMACM/bABWx0gl6exUrAAjQGAR/AAjQRkVMDAAFqwAI0GV2RPgFhAWCeq2CRSbIMAiIkwAI0aQMnky2BwAI0XcAFbIkngUtbMsACNHxgwAD9tlsBJ5JOgMACNIbABWx0BpCRF8ACNwPAAjcLwAI37AABky6MHAAAAAEDwAI3JsACN+wAAAABAQHAAjcuAAAAg+xgwAD9tgAAYJFJAT4CScACNzoWwAI3RYDAAjc+wAVtKYFVwAD9vD0wwAI3TieSVz9KwAI3bAEfwAI3d5FTAwABasACN39dkT4BYQFgwAD9tmCRSbJQAiIkwAI3xAMnky+AwAI3uMAFbSkngUtbMsACN9dgwAD9tlsBJ4PsgMACN+LABW0pBpCSF8ACOl/AAjpnwAI7OAABkzCMHAAAAAEDwAI6gcACOzgAAAABAQHAAjqIAAAAkk5gnqsAAGCRSQE+Ak7AAjqawAI6oQAAgl5gwAD9tgEWwAI6qYDAAjqjwAVt4IJensVKwAI6swEfwAI6vpFTAwABasACOsZdkT4BYQFgnqtgkUmyoAIiJMACOxIDJ5MxgcACOwbABW31J4FLWzLAAjslYMAA/bZbASeSToDAAjsvwAVt4AaQkxfAAj98wAI/hMACQQMAAZMyjBwAAAABA8ACP6bAAkEDAAAAAQEBwAI/rgAAAIPsYMAA/bYAAGCRSQE+AknAAj+6FsACP8WAwAI/vsAFbpWBVcAA/bw9MMACP84nklc/SsACP+wBH8ACP/eRUwQAAWrAAj//XZE+AWEBYMAA/bZgkUmzDwMiJMACQGUDJ5MzgMACQEDABW6VJ5M0iJwni+lbMsACQO5gwAD9tlsBJ4PsgMACQPnABW6VBpCUF8ACRaHAAkWpwAJHXQABkzWMHAAAAAEDwAJFyMACR10AAAADAwPAAkXQAAAAgL1gwAD9tgDAAkXaAAAAkmJgwAD+NwDAAkXkAAAAkvdgwAD+NwAAYJFJAT4FScACRe8WwAJF+IDAAkXzwAVvUYFVwAD9vD0wwAJGASeSHT89iMACRh3ABW9RHsACRiSCSQEAAYDAAkZBwAVvUQBOwAJGUcACRlUAAICsYMAA/bYBHsACRleQMAEAAYHAAkZlwAVvYABOwAJGdcACRnoAAJL4YMAA/bYBHsACRnyQMAEAAYLAAkaKwAVvbwBKwAJGlAEfwAJGn5FTAwABasACRqddkT4BYQNgwAD9tmDAAP43YMAA/jdgkUmziQIiJMACRx0HJ5M2gMACRufABW9RJ5M3g8ACRvfABW/HJ5M4hMACRxPABW/uJ4FLWzLAAkcwYMAA/bZbAyeAvYDAAkc5wAVvUSeArIHAAkdGwAVvYCeS+ILAAkdUwAVvbwaQlRfAAku3wAJLv8ACTOAAAZM5jBwAAAABA8ACS9rAAkzgAAAAAQEBwAJL4gAAAIC9YMAA/bYAAGCRSQE+A0nAAkvsFsACS/WAwAJL8MAFcMyBVcAA/bw9MMACS/4nkh0/PYjAAkwawAVwzB7AAkwhgkkBAAGAwAJMPsAFcMwASsACTEcBH8ACTFKRUwMAAWrAAkxaXZE+AWEBYMAA/bZgkUm0CAIiJMACTLwDJ4NCgMACTILABXDMJ5M6WzLAAkzPYMAA/bZbASeAvYDAAkzYwAVwzAaQlhfAAk+gwAJPqMACUOIAAZM7jBwAAAABA8ACT8nAAlDiAAAAAQEBwAJP0QAAAIC9YMAA/bYAAGCRSQE+A0nAAk/bFsACT+SAwAJP38AFcaGBVcAA/bw9MMACT+0nkh0/PYjAAlAJwAVxoR7AAlAQgkkBAAGAwAJQLcAFcaEASsACUDYBH8ACUEGRUwMAAWrAAlBJXZE+AWEBYMAA/bZgkUm0WgIiJMACUL4DJ4NCgMACUIHABXGhJ5M8WzLAAlDRYMAA/bZbASeAvYDAAlDawAVxoQaQlxfAAmL+wAJjBsACZA8AAZM9jBwAAAABA8ACYybAAmQPAAAAAQEBwAJjLQAAAJJOYJ6rAABgkUkBPgJOwAJjP8ACY0YAAIJeYMAA/bYBFsACY06AwAJjSMAFcnaCXp7FSsACY1gBH8ACY2ORUwQAAWrAAmNrXZE+AWEBYJ6rYJFJth4DIiTAAmO9AyeTPoHAAmOswAVyiyeSR4icJMACY+kDJ5M/gcACY93ABXKLJ4FLWzLAAmP8YMAA/bZbASeSToDAAmQGwAVydgaQmBfAAmnJwAJp0cACau0AAZNAjBwAAAABA8ACaffAAmrtAAAAAQEBwAJp/wAAAIC9YMAA/bYAAGCRSQE+A0nAAmoJFsACahKAwAJqDcAFc0KBVcAA/bw9MMACahsnkh0/PYjAAmo3wAVzQh7AAmo+gkkBAAGAwAJqW8AFc0IASsACamQBH8ACam+RUwMAAWrAAmp3XZE+AWEBYMAA/bZgkUm2vQIiJMACaskDJ5NBgMACar/ABXNCJ4FLWzLAAmrcYMAA/bZbASeAvYDAAmrlwAVzQgaQmRfAAnsZwAJ7IcACfRAAAZNCjBwAAAABA8ACe0LAAn0QAAAAAgICwAJ7TAAAAJImYIizAMACe1wAAACSJ2CIswAAYJFJAT4GTsACe3TAAnt8AACSKGCfZwEfwAJ7gp+MAAAAAE7AAnugwAJ7qgAAkildwAD8dAFgwAD9HAEcwAJ7tILAAnuswAV0OZIqAQABgMACe77ABXQXAJ9tTsACe9XAAnvgAACSK13AAPx0AWDAAP0cARzAAnvqgsACe+LABXQ5kioBAAGBwAJ79MAFdCQAn21OwAJ8BsACfAsAAIKQYMAA/bYBHMACfBeDwAJ8DcAFdFVYAAAAAMAA/EZOwAJ8KMACfC4AAJIsYMAA/bYBHMACfDuEwAJ8MMAFdI1YAAAAAMAA/EZKwAJ8RQEfwAJ8UJFTAwABasACfFhdkT4BYQJgiLNgiLNgkUm3SwIiHMACfLgkwAJ8uAUnkxmFwAJ8j8AFdMUnk0OGwAJ8rMAFdO8ngUtkAQABFsACfMyCwAJ8xMAFdDmSL5+KAMAA/ctbMsACfO1gwAD9tlsCJ4KQgMACfPbABXQXJ5IsgcACfQbABXQkBpCaF8ACf9TAAn/cwAKBHQABk0SMHAAAAAEDwAKAC8ACgR0AAAABAQHAAoATAAAAgL1gwAD9tgAAYJFJAT4DScACgB0WwAKAJoDAAoAhwAV1z4FVwAD9vD0wwAKALyeSHT89iMACgEvABXXPHsACgFKCSQEAAYDAAoBvwAV1zwBKwAKAeAEfwAKAg5FTAwABasACgItdkT4BYQFgwAD9tmCRSbeRAiIkwAKA+QMnkmqAwAKAzcAFdc8nk0VbMsACgQxgwAD9tlsBJ4C9gMACgRXABXXPBpCbF8ACg+rAAoPywAKFfQABk0aMHAAAAAEDwAKEEsAChX0AAAABAQHAAoQaAAAAgL1gwAD9tgAAYJFJAT4DScAChCQWwAKELYDAAoQowAV2pIFVwAD9vD0wwAKENieSHT89iMAChFLABXakHsAChFmCSQEAAYDAAoR2wAV2pABKwAKEfwEfwAKEipFTAwABasAChJJdkT4BYQFgwAD9tmCRSbfWAiIkwAKFWQMnk0eAwAKEz8AFdqQnk0hbMsAChWxgwAD9tlsBJ4C9gMAChXXABXakBpCcF8ACiDjAAohAwAKJtgABk0mMHAAAAAEDwAKIYcACibYAAAABAQHAAohpAAAAgL1gwAD9tgAAYJFJAT4DScACiHMWwAKIfIDAAoh3wAV3eYFVwAD9vD0wwAKIhSeSHT89iMACiKHABXd5HsACiKiCSQEAAYDAAojFwAV3eQBKwAKIzgEfwAKI2ZFTAwABasACiOFdkT4BYQFgwAD9tmCRSbgbAiIkwAKJkgMnk0eAwAKJH8AFd3knk0pbMsACiaVgwAD9tlsBJ4C9gMACia7ABXd5BpCdF8ACjJjAAoygwAKOJQABk0uMHAAAAAEDwAKMwsACjiUAAAABAQHAAozKAAAAgL1gwAD9tgAAYJFJAT4DScACjNQWwAKM3YDAAozYwAV4ToFVwAD9vD0wwAKM5ieSHT89iMACjQLABXhOHsACjQmCSQEAAYDAAo0mwAV4TgBKwAKNLwEfwAKNOpFTAwABasACjUJdkT4BYQFgwAD9tmCRSbhgAiIkwAKOAQMnk0eAwAKNgcAFeE4nk0xbMsACjhRgwAD9tlsBJ4C9gMACjh3ABXhOBpCeF8ACkLDAApC4wAKSEwABk02MHAAAAAEDwAKQ0sACkhMAAAABAQHAApDaAAAAgL1gwAD9tgAAYJFJAT4DScACkOQWwAKQ7YDAApDowAV5I4FVwAD9vD0wwAKQ9ieSHT89iMACkRLABXkjHsACkRmCSQEAAYDAApE2wAV5IwBKwAKRPwEfwAKRSpFTAwABasACkVJdkT4BYQFgwAD9tmCRSbilAiIkwAKR7wKAwAKRgsAFeSMnk05bMsACkgJgwAD9tlsBJ4C9gMACkgvABXkjBpCfF8AClGPAApRrwAKVfwABk0+MHAAAAAEDwAKUicAClX8AAAABAQHAApSRAAAAgL1gwAD9tgAAYJFJAT4DScAClJsWwAKUpIDAApSfwAV59YFVwAD9vD0wwAKUrSeSHT89iMAClMnABXn1HsAClNCCSQEAAYDAApTtwAV59QBKwAKU9gEfwAKVAZFTAwABasAClQldkT4BYQFgwAD9tmCRSbjqAiIkwAKVWwMnk1CAwAKVO8AFefUnk1FbMsAClW5gwAD9tlsBJ4C9gMAClXfABXn1BpCgF8ACmAPAApgLwAKZnwABk1KMHAAAAAEDwAKYJ8ACmZ8AAAABAQHAApgxAAAAkiZgiLMAAGCRSQE+BE7AAphIwAKYUAAAkihgn2cBH8ACmFafjAAAAABOwAKYdMACmH4AAJIpXcAA/HQBYMAA/RwBHMACmIiBwAKYgMAFet+SKgEAAYDAApiSwAV6ygCfbU7AApijwAKYqAAAgpBgwAD9tgEcwAKYtILAApiqwAV6+1gAAAAAwAD8RkrAApi+AR/AApjJkVMDAAFqwAKY0V2RPgFhAWCIs2CRSbktAiIcwAKZVCTAAplUAyeTU4PAApkSwAV7MyeTVGQBAAEWwAKZbIHAAplkwAV635Ivn4oAwAD9y1sywAKZjWDAAP22WwEngpCAwAKZlsAFesoGkKEXwAKc6MACnPDAAp+TAAGTVYwcAAAAAQPAAp0NwAKfkwAAAAMDA8ACnRwAAACSJmCIswDAAp0sAAAAkidgiLMAwAKdPQAAAJNWYIizAABgkUkBPghOwAKdVcACnV0AAJIoYJ9nAR/AAp1jn4wAAAAATsACnYHAAp2LAACSKV3AAPx0AWDAAP0cARzAAp2Vg8ACnY3ABXwnkioBAAGAwAKdn8AFe/gAn21OwAKdtsACncEAAJIrXcAA/HQBYMAA/RwBHMACncuDwAKdw8AFfCeSKgEAAYHAAp3VwAV8BQCfbU7AAp3twAKd+AAAk1ddwAD8dAFgwAD9HAEcwAKeAoPAAp36wAV8J5IqAQABgsACngzABXwSAJ9tTsACnh7AAp4jAACCkGDAAP22ARzAAp4vhMACniXABXxDWAAAAADAAPxGTsACnkDAAp5GAACSLGDAAP22ARzAAp5ThcACnkjABXx7WAAAAADAAPxGTsACnmTAAp5qAACTWGDAAP22ARzAAp53hsACnmzABXyzWAAAAADAAPxGSsACnoEBH8ACnoyRUwMAAWrAAp6UXZE+AWEDYIizYIizYIizYJFJuXQCIhzAAp8mJMACnyYHJ5NTh8ACntbABXzrJ5NZFMACnubABX0VCAAnk1oUwAKfGsAFfT8JACeBS2QBAAEWwAKfPoPAAp82wAV8J5Ivn4oAwAD9y1sywAKfX2DAAP22WwMngpCAwAKfaMAFe/gnkiyBwAKfeMAFfAUnk1iCwAKficAFfBIGkKIXwAKicMAConjAAqSMAAGTW4wcAAAAAQPAAqKUwAKkjAAAAAICAsACopwAAACAvWDAAP22AMACoqsAAACSJmCIswAAYJFJAT4GScACorYWwAKiv4DAAqK6wAV+PoFVwAD9vD0wwAKiyCeSHT89iMACouTABX4+HsACouuCSQEAAYDAAqMIwAV+PgBOwAKjHcACoyUAAJIoYJ9nAR/AAqMrn4wAAAAATsACo0nAAqNTAACSKV3AAPx0AWDAAP0cARzAAqNdgsACo1XABX6jkioBAAGBwAKjZ8AFfk0An21OwAKjeMACo30AAIKQYMAA/bYBHMACo4mDwAKjf8AFfr9YAAAAAMAA/EZKwAKjkwEfwAKjnpFTAwABasACo6ZdkT4BYQJgwAD9tmCIs2CRSbnAAiIcwAKkMyTAAqQzBSeTXIDAAqPgwAV+PieTXYTAAqQQwAV+9yeTXmQBAAEWwAKkS4LAAqRDwAV+o5Ivn4oAwAD9y1sywAKkbGDAAP22WwIngL2AwAKkdcAFfj4ngpCBwAKkg8AFfk0GkKMXwAKnJcACpy3AAqhhAAGTX4wcAAAAAQPAAqdUwAKoYQAAAAEBAcACp1wAAACAvWDAAP22AABgkUkBPgNJwAKnZhbAAqdvgMACp2rABX/ZgVXAAP28PTDAAqd4J5IdPz2IwAKnlMAFf9kewAKnm4JJAQABgMACp7jABX/ZAErAAqfBAR/AAqfMkVMDAAFqwAKn1F2RPgFhAWDAAP22YJFJuggCIiTAAqg9BSeTUIDAAqgPwAV/2SeTYIDAAqgywAV/2SeTYVsywAKoUGDAAP22WwEngL2AwAKoWcAFf9kGkKQXwAKzAsACswrAArSUAAGTYowcAAAAAQPAArMwwAK0lAAAAAEBAcACszgAAACAvWDAAP22AABgkUkBPgNJwAKzQhbAArNLgMACs0bABYC6gVXAAP28PTDAArNUJ5IdPz2IwAKzcMAFgLoewAKzd4JJAQABgMACs5TABYC6AErAArOdAR/AArOokVMEAAFqwAKzsF2RPgFhAWDAAP22YJFJuwkDIiTAArQMAyeTY4DAArPvwAWAuieTZIicJ4yKWzLAArSDYMAA/bZbASeAvYDAArSMwAWAugaQpRfAArhKwAK4UsACuh0AAZNljBwAAAABA8ACuIXAArodAAAAAQEBwAK4jQAAAIC9YMAA/bYAAGCRSQE+A0nAAriXFsACuKCAwAK4m8AFgZSBVcAA/bw9MMACuKknkh0/PYjAArjFwAWBlB7AArjMgkkBAAGAwAK46cAFgZQASsACuPIBH8ACuP2RUwQAAWrAArkFXZE+AWEBYMAA/bZgkUm7XwMiJMACuYwDJ5NjgMACuVvABYGUJ5NmiJwnjJBbMsACugxgwAD9tlsBJ4C9gMACuhXABYGUBpCmF8ACvWjAAr1wwAK/AwABk2eMHAAAAAEDwAK9msACvwMAAAABAQHAAr2iAAAAgL1gwAD9tgAAYJFJAT4DScACvawWwAK9tYDAAr2wwAWCboFVwAD9vD0wwAK9vieSHT89iMACvdrABYJuHsACveGCSQEAAYDAAr3+wAWCbgBKwAK+BwEfwAK+EpFTBAABasACvhpdkT4BYQFgwAD9tmCRSbumAyIkwAK+ggMnk2iAwAK+ZMAFgm4nkreInCeKXVsywAK+8mDAAP22WwEngL2AwAK++8AFgm4GkKcXwALCesACwoLAAsPwAAGTaYwcAAAAAQPAAsK3wALD8AAAAAEBAcACwr8AAACAvWDAAP22AABgkUkBPgNJwALCyRbAAsLSgMACws3ABYNIgVXAAP28PTDAAsLbJ5IdPz2IwALC98AFg0gewALC/oJJAQABgMACwxvABYNIAErAAsMkAR/AAsMvkVMDAAFqwALDN12RPgFhAWDAAP22YJFJu/gCIiTAAsPMAyeDQoDAAsODwAWDSCeTalsywALD32DAAP22WwEngL2AwALD6MAFg0gGkKgXwALHBsACxw7AAshXAAGTa4wcAAAAAQPAAsdIwALIVwAAAAEBAcACx1UAAACAvWDAAP22AABgkUkBPgNJwALHXxbAAsdogMACx2PABYQdgVXAAP28PTDAAsdxJ5IdPz2IwALHjcAFhB0ewALHlIJJAQABgMACx7HABYQdAErAAse6AR/AAsfFkVMDAAFqwALHzV2RPgFhAWDAAP22YJFJvD4CIiTAAsgzAyeDQoDAAsgUwAWEHSeTbFsywALIRmDAAP22WwEngL2AwALIT8AFhB0GkKkXwALMKMACzDDAAs6jAAGTbYwcAAAAAQPAAsxfwALOowAAAAICAsACzG4AAACSJmCIswDAAsx+AAAAkidgiLMAAGCRSQE+Bk7AAsyWwALMngAAkihgn2cBH8ACzKSfjAAAAABOwALMwsACzMwAAJIpXcAA/HQBYMAA/RwBHMACzNaCwALMzsAFhRSSKgEAAYDAAszgwAWE8gCfbU7AAsz3wALNAgAAkitdwAD8dAFgwAD9HAEcwALNDILAAs0EwAWFFJIqAQABgcACzRbABYT/AJ9tTsACzSjAAs0tAACCkGDAAP22ARzAAs05g8ACzS/ABYUwWAAAAADAAPxGTsACzUrAAs1QAACSLGDAAP22ARzAAs1dhMACzVLABYVoWAAAAADAAPxGSsACzWcBH8ACzXKRUwQAAWrAAs16XZE+AWECYIizYIizYJFJvJQDIhzAAs4OJMACzg4FJ5NuhcACzdDABYWgJ5NvhsACzgLABYXKJ4FLZAEAARbAAs4mgsACzh7ABYUUki+figDAAP3LiJwnjKNbMsACzoBgwAD9tlsCJ4KQgMACzonABYTyJ5IsgcACzpnABYT/BpCqF8AC1PTAAtT8wALXGwABk3CMHAAAAAEDwALVIsAC1xsAAAACAgLAAtUxAAAAkiZgiLMAwALVQQAAAJInYIizAABgkUkBPgZOwALVWcAC1WEAAJIoYJ9nAR/AAtVnn4wAAAAATsAC1YXAAtWPAACSKV3AAPx0AWDAAP0cARzAAtWZgsAC1ZHABYbRkioBAAGAwALVo8AFhq8An21OwALVusAC1cUAAJIrXcAA/HQBYMAA/RwBHMAC1c+CwALVx8AFhtGSKgEAAYHAAtXZwAWGvACfbU7AAtXrwALV8AAAgpBgwAD9tgEcwALV/IPAAtXywAWG7VgAAAAAwAD8Rk7AAtYNwALWEwAAkixgwAD9tgEcwALWIITAAtYVwAWHJVgAAAAAwAD8RkrAAtYqAR/AAtY1kVMDAAFqwALWPV2RPgFhAmCIs2CIs2CRSb0wAiIcwALWvyTAAta/BSeSjYXAAtaDwAWHXSeTcYbAAtazwAWHhyeBS2QBAAEWwALW14LAAtbPwAWG0ZIvn4oAwAD9y1sywALW+GDAAP22WwIngpCAwALXAcAFhq8nkiyBwALXEcAFhrwGkKsXwALkPMAC5ETAAuZfAAGTcowcAAAAAQPAAuSBwALmXwAAAAEBAcAC5JAAAACSJmCIswAAYJFJAT4ETsAC5KfAAuSvAACSKGCfZwEfwALktZ+MAAAAAE7AAuTTwALk3QAAkildwAD8dAFgwAD9HAEcwALk54HAAuTfwAWIfJIqAQABgMAC5PHABYhnAJ9tTsAC5QLAAuUHAACCkGDAAP22ARzAAuUTgsAC5QnABYiYWAAAAADAAPxGSsAC5R0BH8AC5SiRUwQAAWrAAuUwXZE+AWEBYIizYJFJvoIDIhzAAuXMJMAC5cwDJ5Nzg8AC5aXABYjQJ5N0ZAEAARbAAuXkgcAC5dzABYh8ki+figDAAP3LiJwnjNFbMsAC5k1gwAD9tlsBJ4KQgMAC5lbABYhnBpCsF8AC62XAAuttwALsbAABk3WMHAAAAAEDwALricAC7GwAAAABAQHAAuuRAAAAgL1gwAD9tgAAYJFJAT4DScAC65sWwALrpIDAAuufwAWJmoFVwAD9vD0wwALrrSeSHT89iMAC68nABYmaHsAC69CCSQEAAYDAAuvtwAWJmgBKwALr9gEfwALsAZFTAwABasAC7AldkT4BYQFgwAD9tmCRSb77AiIkwALsTgMnk3aAwALsRMAFiZongUtbMsAC7FtgwAD9tlsBJ4C9gMAC7GTABYmaBpCtF8AC96LAAveqwAL4tAABk3eMHAAAAAEDwAL3xMAC+LQAAAABAQHAAvfMAAAAgL1gwAD9tgAAYJFJAT4DScAC99YWwAL334DAAvfawAWKb4FVwAD9vD0wwAL36CeSHT89iMAC+ATABYpvHsAC+AuCSQEAAYDAAvgowAWKbwBKwAL4MQEfwAL4PJFTAwABasAC+ERdkT4BYQFgwAD9tmCRScAAQDUCIiTAAviQAyeSjYDAAvh0wAWKbyeTeFsywAL4o2DAAP22WwEngL2AwAL4rMAFim8GkK4XwAL7qsAC+7LAAvz+AAGTeYwcAAAAAQPAAvvdwAL8/gAAAAEBAcAC++UAAACAvWDAAP22AABgkUkBPgNJwAL77xbAAvv4gMAC+/PABYtGgVXAAP28PTDAAvwBJ5IdPz2IwAL8HcAFi0YewAL8JIJJAQABgMAC/EHABYtGAErAAvxKAR/AAvxVkVMDAAFqwAL8XV2RPgFhAWDAAP22YJFJwABAkwIiJMAC/NoDJ5JSgMAC/KnABYtGJ5N6WzLAAvztYMAA/bZbASeAvYDAAvz2wAWLRgaQrxfAAv/4wAMAAMADAUYAAZN7jBwAAAABA8ADADDAAwFGAAAAAQEBwAMAOAAAAIC9YMAA/bYAAGCRSQE+A0nAAwBCFsADAEuAwAMARsAFjB2BVcAA/bw9MMADAFQnkh0/PYjAAwBwwAWMHR7AAwB3gkkBAAGAwAMAlMAFjB0ASsADAJ0BH8ADAKiRUwMAAWrAAwCwXZE+AWEBYMAA/bZgkUnAAEDjAiIkwAMBIgMnk3yAwAMBDcAFjB0nk31bMsADATVgwAD9tlsBJ4C9gMADAT7ABYwdBpCwF8ADA7DAAwO4wAMFEgABk36MHAAAAAEDwAMD2sADBRIAAAABAQHAAwPkAAAAkiZgiLMAAGCRSQE+BE7AAwP7wAMEAwAAkihgn2cBH8ADBAmfjAAAAABOwAMEJ8ADBDEAAJIpXcAA/HQBYMAA/RwBHMADBDuBwAMEM8AFjQmSKgEAAYDAAwRFwAWM9ACfbU7AAwRWwAMEWwAAgpBgwAD9tgEcwAMEZ4LAAwRdwAWNJVgAAAAAwAD8RkrAAwRxAR/AAwR8kVMDAAFqwAMEhF2RPgFhAWCIs2CRScAAQS4CIhzAAwTVJMADBNUDJ5N/g8ADBMrABY1dJ4FLZAEAARbAAwTfgcADBNfABY0Jki+figDAAP3LWzLAAwUAYMAA/bZbASeCkIDAAwUJwAWM9AaQsRfAAxJcwAMSZMADFAMAAZOAjBwAAAABA8ADEoTAAxQDAAAAAgICwAMSjAAAAIC9YMAA/bYAwAMSlgAAAIDuYMAA+9AAAGCRSQE+BEnAAxKhFsADEqqAwAMSpcAFjiSBVcAA/bw9MMADErMnkh0/PYjAAxLPwAWOJB7AAxLWgkkBAAGAwAMS88AFjiQAScADEvwcwAMTBoHAAxMAwAWOM0gBAAErAMAA/PM9MMADEw8nkt4/SsADEywBH8ADEzeRUwQAAWrAAxM/XZE+AWECYMAA/bZgwAD70GCRScAAQrQDIiTAAxOTAyeDQoDAAxNswAWOJCeTgYicJMADE88DJ5OCgcADE7LABY4zJ5ODWzLAAxPiYMAA/bZbAieAvYDAAxPrwAWOJCeA7oHAAxP6wAWOMwaQshfAAxcdwAMXJcADGJ4AAZOEjBwAAAABA8ADF0fAAxieAAAAAQEBwAMXTwAAAIC9YMAA/bYAAGCRSQE+A0nAAxdZFsADF2KAwAMXXcAFj1mBVcAA/bw9MMADF2snkh0/PYjAAxeHwAWPWR7AAxeOgkkBAAGAwAMXq8AFj1kASsADF7QBH8ADF7+RUwQAAWrAAxfHXZE+AWEBYMAA/bZgkUnAAEMdAyIkwAMYQwMng0KAwAMYAMAFj1knk4WInCeNLVsywAMYjWDAAP22WwEngL2AwAMYlsAFj1kGkLMXwAMcG8ADHCPAAx4vAAGThowcAAAAAQPAAxxIwAMeLwAAAAEBAcADHFIAAACSJmCIswAAYJFJAT4ETsADHGnAAxxxAACSKGCfZwEfwAMcd5+MAAAAAE7AAxyVwAMcnwAAkildwAD8dAFgwAD9HAEcwAMcqYHAAxyhwAWQSpIqAQABgMADHLPABZA1AJ9tTsADHMTAAxzJAACCkGDAAP22ARzAAxzVgsADHMvABZBmWAAAAADAAPxGSsADHN8BH8ADHOqRUwQAAWrAAxzyXZE+AWEBYIizYJFJwABDfwMiHMADHZUkwAMdlQMnk4eDwAMdS8AFkJ4nk4hkAQABFsADHa2BwAMdpcAFkEqSL5+KAMAA/cuInCeNM1sywAMeHWDAAP22WwEngpCAwAMeJsAFkDUGkLQXwAMhZsADIW7AAyNEAAGTiYwcAAAAAQPAAyGYwAMjRAAAAAICAsADIaAAAACAvWDAAP22AMADIa0AAACSPWDAAP22AABgkUkBPgVJwAMhuBbAAyHBgMADIbzABZFqgVXAAP28PTDAAyHKJ5IdPz2IwAMh5sAFkWoewAMh7YJJAQABgMADIgrABZFqAEnAAyITFsADIh2BwAMiF8AFkXmBVcAA/bw9MMADIiYnkh0/PYnAAyJCwAWReR7AAyJKgkkBAAGBwAMiZ8AFkXkASsADInEBH8ADInyRUwMAAWrAAyKEXZE+AWECYMAA/bZgwAD9tmCRScAAQ9ICIiTAAyMQBSeTioDAAyLswAWRaieTi4HAAyMFwAWReSeBS1sywAMjI2DAAP22WwIngL2AwAMjLMAFkWonkj2BwAMjO8AFkXkGkLUXwAMn4sADJ+rAAymeAAGTjIwcAAAAAQPAAygJwAMpngAAAAMDA8ADKBEAAACAvWDAAP22AMADKBsAAACSYmDAAP43AMADKCUAAACS92DAAP43AABgkUkBPgVJwAMoMBbAAyg5gMADKDTABZKugVXAAP28PTDAAyhCJ5IdPz2IwAMoXsAFkq4ewAMoZYJJAQABgMADKILABZKuAE7AAyiSwAMolgAAgKxgwAD9tgEewAMomJAwAQABgcADKKbABZK9AE7AAyi2wAMouwAAkvhgwAD9tgEewAMovZAwAQABgsADKMvABZLMAErAAyjVAR/AAyjgkVMDAAFqwAMo6F2RPgFhA2DAAP22YMAA/jdgwAD+N2CRScAARFwCIiTAAyleByeTjYDAAykowAWSrieTN4PAAyk4wAWTJCeTjoTAAylUwAWTSyeBS1sywAMpcWDAAP22WwMngL2AwAMpesAFkq4ngKyBwAMph8AFkr0nkviCwAMplcAFkswGkLYXwAMtJ8ADLS/AAy9kAAGTj4wcAAAAAQPAAy1fwAMvZAAAAAICAsADLW4AAACSJmCIswDAAy1+AAAAkidgiLMAAGCRSQE+Bk7AAy2WwAMtngAAkihgn2cBH8ADLaSfjAAAAABOwAMtwsADLcwAAJIpXcAA/HQBYMAA/RwBHMADLdaCwAMtzsAFlE2SKgEAAYDAAy3gwAWUKwCfbU7AAy33wAMuAgAAkitdwAD8dAFgwAD9HAEcwAMuDILAAy4EwAWUTZIqAQABgcADLhbABZQ4AJ9tTsADLijAAy4tAACCkGDAAP22ARzAAy45g8ADLi/ABZRpWAAAAADAAPxGTsADLkrAAy5QAACSLGDAAP22ARzAAy5dhMADLlLABZShWAAAAADAAPxGSsADLmcBH8ADLnKRUwMAAWrAAy56XZE+AWECYIizYIizYJFJwABEwgIiHMADLwgkwAMvCAUnk5CFwAMu38AFlNknk5GGwAMu/MAFlQMngUtkAQABFsADLyCCwAMvGMAFlE2SL5+KAMAA/ctbMsADL0FgwAD9tlsCJ4KQgMADL0rABZQrJ5IsgcADL1rABZQ4BpC3F8ADM+rAAzPywAM3oAABk5KMHAAAAAEDwAM0FcADN6AAAAAEBATAAzQkAAAAkiZgiLMAwAM0NAAAAJInYIizAMADNEMAAACAvWDAAP22AMADNFAAAACSPWDAAP22AABgkUkBPgpOwAM0Z8ADNG8AAJIoYJ9nAR/AAzR1n4wAAAAATsADNJPAAzSdAACSKV3AAPx0AWDAAP0cARzAAzSnhMADNJ/ABZYlkioBAAGAwAM0scAFleUAn21OwAM0yMADNNMAAJIrXcAA/HQBYMAA/RwBHMADNN2EwAM01cAFliWSKgEAAYHAAzTnwAWV8gCfbUnAAzTyFsADNPuCwAM09sAFlf+BVcAA/bw9MMADNQQnkh0/PYrAAzUgwAWV/x7AAzUngkkBAAGCwAM1RMAFlf8AScADNU0WwAM1V4PAAzVRwAWWDoFVwAD9vD0wwAM1YCeSHT89i8ADNXzABZYOHsADNYSCSQEAAYPAAzWhwAWWDgBOwAM1ssADNbcAAIKQYMAA/bYBHMADNcOFwAM1ucAFlkFYAAAAAMAA/EZOwAM11MADNdoAAJIsYMAA/bYBHMADNeeGwAM13MAFlnlYAAAAAMAA/EZKwAM18QEfwAM1/JFTBAABasADNgRdkT4BYQRgiLNgiLNgwAD9tmDAAP22YJFJwABFMgMiHMADNqwkwAM2rAknk5OHwAM2TMAFlzMnk5QUwAM2c8AFl10IACeTlYLAAzaTwAWV/yeSkYPAAzagwAWWDieBS2QBAAEWwAM2xITAAza8wAWWJZIvn4oAwAD9y4icJ41LWzLAAzc3YMAA/bZbBCeCkIDAAzdJwAWV5SeSLIHAAzdhwAWV8ieAvYLAAzd5wAWV/yeSPYPAAzeQwAWWDgaQuBfAAzx9wAM8hcADQF4AAZOWjBwAAAABA8ADPLTAA0BeAAAABAQEwAM8wwAAAJImYIizAMADPNMAAACSJ2CIswDAAzziAAAAgL1gwAD9tgDAAzzvAAAAkj1gwAD9tgAAYJFJAT4KTsADPQbAAz0OAACSKGCfZwEfwAM9FJ+MAAAAAE7AAz0ywAM9PAAAkildwAD8dAFgwAD9HAEcwAM9RoTAAz0+wAWYwJIqAQABgMADPVDABZiAAJ9tTsADPWfAAz1yAACSK13AAPx0AWDAAP0cARzAAz18hMADPXTABZjAkioBAAGBwAM9hsAFmI0An21JwAM9kRbAAz2agsADPZXABZiagVXAAP28PTDAAz2jJ5IdPz2KwAM9v8AFmJoewAM9xoJJAQABgsADPePABZiaAEnAAz3sFsADPfaDwAM98MAFmKmBVcAA/bw9MMADPf8nkh0/PYvAAz4bwAWYqR7AAz4jgkkBAAGDwAM+QMAFmKkATsADPlHAAz5WAACCkGDAAP22ARzAAz5ihcADPljABZjcWAAAAADAAPxGTsADPnPAAz55AACSLGDAAP22ARzAAz6GhsADPnvABZkUWAAAAADAAPxGSsADPpABH8ADPpuRUwQAAWrAAz6jXZE+AWEEYIizYIizYMAA/bZgwAD9tmCRScAARZsDIhzAAz9qJMADP2oJJ5OTh8ADPvfABZnOJ5OUFMADPx7ABZn4CAAnk5WCwAM/PsAFmJonkpGDwAM/S8AFmKknk5dkAQABFsADP4KEwAM/esAFmMCSL5+KAMAA/cuInCeNS1sywAM/9WDAAP22WwQngpCAwANAB8AFmIAnkiyBwANAH8AFmI0ngL2CwANAN8AFmJonkj2DwANATsAFmKkGkLkXwANFzMADRdTAA0rZAAGTmIwcAAAAAQPAA0YCwANK2QAAAAYGBsADRgwAAACSJmCIswDAA0YgAAAAkidgiLMAwANGLwAAAIC9YMAA/bYAwANGPAAAAJI9YMAA/bYAwANGSgAAAJOZYMAA/bYAwANGWAAAAJOaYMAA/bYAAGCRSQE+Dk7AA0ZvwANGdwAAkihgn2cBH8ADRn2fjAAAAABOwANGm8ADRqUAAJIpXcAA/HQBYMAA/RwBHMADRq+GwANGp8AFm3mSKgEAAYDAA0a5wAWbGwCfbU7AA0bQwANG2wAAkitdwAD8dAFgwAD9HAEcwANG5YbAA0bdwAWbeZIqAQABgcADRu/ABZsoAJ9tScADRvoWwANHA4LAA0b+wAWbNYFVwAD9vD0wwANHDCeSHT89isADRyjABZs1HsADRy+CSQEAAYLAA0dMwAWbNQBJwANHVRbAA0dfg8ADR1nABZtEgVXAAP28PTDAA0doJ5IdPz2LwANHhMAFm0QewANHjIJJAQABg8ADR6nABZtEAEnAA0ezFsADR72EwANHt8AFm1OBVcAA/bw9MMADR8Ynkh0/PYzAA0fiwAWbUx7AA0fqgkkBAAGEwANIB8AFm1MAScADSBEWwANIG4XAA0gVwAWbYoFVwAD9vD0wwANIJCeSHT89jcADSEDABZtiHsADSEiCSQEAAYXAA0hlwAWbYgBOwANIdsADSHsAAIKQYMAA/bYBHMADSIeHwANIfcAFm5VYAAAAAMAA/EZOwANImMADSJ4AAJIsYMAA/bYBHMADSKsUwANIoMAFm80IAFgAAAAAwAD8RkrAA0i1AR/AA0jAkVMEAAFqwANIyF2RPgFhBmCIs2CIs2DAAP22YMAA/bZgwAD9tmDAAP22YJFJwABGDgMiHMADSaskwANJqw0nk5MUwANJG8AFnQkJACeTlBTAA0lCwAWdMwoAJ5OVgsADSWLABZs1J5KRg8ADSW/ABZtEJ5ObhMADSYvABZtTJ5OchcADSZ/ABZtiJ4FLZAEAARbAA0nDhsADSbvABZt5ki+figDAAP3LiJwnjUtbMsADSkBgwAD9tlsGJ4KQgMADSlLABZsbJ5IsgcADSmrABZsoJ4C9gsADSoLABZs1J5I9g8ADSpnABZtEJ5OZhMADSrHABZtTJ5OahcADSsnABZtiBpC6F8ADUNLAA1DawANWBQABk52MHAAAAAEDwANREMADVgUAAAAGBgbAA1EaAAAAkiZgiLMAwANRLgAAAJInYIizAMADUT0AAACAvWDAAP22AMADUUoAAACSPWDAAP22AMADUVgAAACTmWDAAP22AMADUWYAAACTmmDAAP22AABgkUkBPg5OwANRfcADUYUAAJIoYJ9nAR/AA1GLn4wAAAAATsADUanAA1GzAACSKV3AAPx0AWDAAP0cARzAA1G9hsADUbXABZ7ykioBAAGAwANRx8AFnpQAn21OwANR3sADUekAAJIrXcAA/HQBYMAA/RwBHMADUfOGwANR68AFnvKSKgEAAYHAA1H9wAWeoQCfbUnAA1IIFsADUhGCwANSDMAFnq6BVcAA/bw9MMADUhonkh0/PYrAA1I2wAWerh7AA1I9gkkBAAGCwANSWsAFnq4AScADUmMWwANSbYPAA1JnwAWevYFVwAD9vD0wwANSdieSHT89i8ADUpLABZ69HsADUpqCSQEAAYPAA1K3wAWevQBJwANSwRbAA1LLhMADUsXABZ7MgVXAAP28PTDAA1LUJ5IdPz2MwANS8MAFnswewANS+IJJAQABhMADUxXABZ7MAEnAA1MfFsADUymFwANTI8AFntuBVcAA/bw9MMADUzInkh0/PY3AA1NOwAWe2x7AA1NWgkkBAAGFwANTc8AFntsATsADU4TAA1OJAACCkGDAAP22ARzAA1OVh8ADU4vABZ8OWAAAAADAAPxGTsADU6bAA1OsAACSLGDAAP22ARzAA1O5FMADU67ABZ9GCABYAAAAAMAA/EZKwANTwwEfwANTzpFTBAABasADU9ZdkT4BYQZgiLNgiLNgwAD9tmDAAP22YMAA/bZgwAD9tmCRScAARo4DIhzAA1TKJMADVMoNJ5OeFMADVDrABaCCCQAnk5QUwANUYcAFoKwKACeTlYLAA1SBwAWerieSkYPAA1SOwAWevSeTm4TAA1SqwAWezCeTnIXAA1S+wAWe2yeBS2QBAAEWwANU4obAA1TawAWe8pIvn4oAwAD9y4icJ41ZWzLAA1VsYMAA/bZbBieCkIDAA1V+wAWelCeSLIHAA1WWwAWeoSeAvYLAA1WuwAWerieSPYPAA1XFwAWevSeTmYTAA1XdwAWezCeTmoXAA1X1wAWe2waQuxfAA1rJwANa0cADXqUAAZOfjBwAAAABA8ADWvzAA16lAAAABAQEwANbCwAAAJImYIizAMADWxsAAACSJ2CIswDAA1sqAAAAgL1gwAD9tgDAA1s3AAAAkj1gwAD9tgAAYJFJAT4KTsADW07AA1tWAACSKGCfZwEfwANbXJ+MAAAAAE7AA1t6wANbhAAAkildwAD8dAFgwAD9HAEcwANbjoTAA1uGwAWiTZIqAQABgMADW5jABaINAJ9tTsADW6/AA1u6AACSK13AAPx0AWDAAP0cARzAA1vEhMADW7zABaJNkioBAAGBwANbzsAFohoAn21JwANb2RbAA1vigsADW93ABaIngVXAAP28PTDAA1vrJ5IdPz2KwANcB8AFoicewANcDoJJAQABgsADXCvABaInAEnAA1w0FsADXD6DwANcOMAFojaBVcAA/bw9MMADXEcnkh0/PYvAA1xjwAWiNh7AA1xrgkkBAAGDwANciMAFojYATsADXJnAA1yeAACCkGDAAP22ARzAA1yqhcADXKDABaJpWAAAAADAAPxGTsADXLvAA1zBAACSLGDAAP22ARzAA1zOhsADXMPABaKhWAAAAADAAPxGSsADXNgBH8ADXOORUwQAAWrAA1zrXZE+AWEEYIizYIizYMAA/bZgwAD9tmCRScAARwEDIhzAA12kJMADXaQJJ5Oeh8ADXUTABaNbJ5OUFMADXWvABaOFCAAnk5WCwANdi8AFoicnkpGDwANdmMAFojYngUtkAQABFsADXbyEwANdtMAFok2SL5+KAMAA/cuInCeNWVsywANePGDAAP22WwQngpCAwANeTsAFog0nkiyBwANeZsAFohongL2CwANefsAFoicnkj2DwANelcAFojYGkLwXwANj8cADY/nAA2hGAAGToIwcAAAAAQPAA2QlwANoRgAAAAUFBcADZC8AAACSJmCIswDAA2RDAAAAkidgiLMAwANkUgAAAIC9YMAA/bYAwANkYQAAAJNWYIizAMADZHAAAACSPWDAAP22AABgkUkBPgxOwANkh8ADZI8AAJIoYJ9nAR/AA2SVn4wAAAAATsADZLPAA2S9AACSKV3AAPx0AWDAAP0cARzAA2THhcADZL/ABaT1kioBAAGAwANk0cAFpKgAn21OwANk6MADZPMAAJIrXcAA/HQBYMAA/RwBHMADZP2FwANk9cAFpPWSKgEAAYHAA2UHwAWktQCfbUnAA2USFsADZRuCwANlFsAFpMKBVcAA/bw9MMADZSQnkh0/PYrAA2VAwAWkwh7AA2VHgkkBAAGCwANlZMAFpMIATsADZXrAA2WFAACTV13AAPx0AWDAAP0cARzAA2WPhcADZYfABaT1kioBAAGDwANlmcAFpNEAn21JwANlpBbAA2WuhMADZajABaTegVXAAP28PTDAA2W3J5IdPz2MwANl08AFpN4ewANl24JJAQABhMADZfjABaTeAE7AA2YJwANmDgAAgpBgwAD9tgEcwANmGobAA2YQwAWlEVgAAAAAwAD8Rk7AA2YrwANmMQAAkixgwAD9tgEcwANmPofAA2YzwAWlSVgAAAAAwAD8Rk7AA2ZPwANmVQAAk1hgwAD9tgEcwANmYhTAA2ZXwAWlwggAWAAAAADAAPxGSsADZmwBH8ADZneRUwQAAWrAA2Z/XZE+AWEFYIizYIizYMAA/bZgiLNgwAD9tmCRScAAR20DIhzAA2c5JMADZzkLJ5OTFMADZtDABaY7CQAnk5QUwANm98AFpmUKACeTlYLAA2cXwAWkwieSkRTAA2ckwAWmjwsAJ4FqhMADZy3ABaTeJ4FLZAEAARbAA2dRhcADZ0nABaT1ki+figDAAP3LiJwnjUtbMsADZ8RgwAD9tlsFJ4KQgMADZ9bABaSoJ5IsgcADZ+7ABaS1J4C9gsADaAbABaTCJ5NYg8ADaB3ABaTRJ5I9hMADaDbABaTeBpC9F8ADbY/AA22XwANyCgABk6GMHAAAAAEDwANty8ADcgoAAAAFBQXAA23VAAAAkiZgiLMAwANt6QAAAJInYIizAMADbfgAAACAvWDAAP22AMADbgcAAACTVmCIswDAA24WAAAAkj1gwAD9tgAAYJFJAT4MTsADbi3AA241AACSKGCfZwEfwANuO5+MAAAAAE7AA25ZwANuYwAAkildwAD8dAFgwAD9HAEcwANubYXAA25lwAWoIJIqAQABgMADbnfABafTAJ9tTsADbo7AA26ZAACSK13AAPx0AWDAAP0cARzAA26jhcADbpvABaggkioBAAGBwANurcAFp+AAn21JwANuuBbAA27BgsADbrzABaftgVXAAP28PTDAA27KJ5IdPz2KwANu5sAFp+0ewANu7YJJAQABgsADbwrABaftAE7AA28gwANvKwAAk1ddwAD8dAFgwAD9HAEcwANvNYXAA28twAWoIJIqAQABg8ADbz/ABaf8AJ9tScADb0oWwANvVITAA29OwAWoCYFVwAD9vD0wwANvXSeSHT89jMADb3nABagJHsADb4GCSQEAAYTAA2+ewAWoCQBOwANvr8ADb7QAAIKQYMAA/bYBHMADb8CGwANvtsAFqDxYAAAAAMAA/EZOwANv0cADb9cAAJIsYMAA/bYBHMADb+SHwANv2cAFqHRYAAAAAMAA/EZOwANv9cADb/sAAJNYYMAA/bYBHMADcAgUwANv/cAFqO0IAFgAAAAAwAD8RkrAA3ASAR/AA3AdkVMEAAFqwANwJV2RPgFhBWCIs2CIs2DAAP22YIizYMAA/bZgkUnAAEfcAyIcwANw8CTAA3DwCyeTnhTAA3CHwAWpZgkAJ5OUFMADcK7ABamQCgAnk5WCwANwzsAFp+0nkpEUwANw28AFqboLACeBaoTAA3DkwAWoCSeBS2QBAAEWwANxCIXAA3EAwAWoIJIvn4oAwAD9y4icJ41ZWzLAA3GIYMAA/bZbBSeCkIDAA3GawAWn0yeSLIHAA3GywAWn4CeAvYLAA3HKwAWn7SeTWIPAA3HhwAWn/CeSPYTAA3H6wAWoCQaQvhfAA3Y2wAN2PsADdx8AAZOijBwAAAABA8ADdl7AA3cfAAAAAQEBwAN2YwAAAJJiYMAA/jcAAGCRSQE+Ak7AA3Z0wAN2eAAAgKxgwAD9tgEewAN2epAwAQABgMADdojABar+AErAA3aRAR/AA3ackVMDAAFqwAN2pF2RPgFhAWDAAP43YJFJwABIYgIiJMADdvwDJ5OjgcADdvPABasVJ4FLWzLAA3cPYMAA/bZbASeArIDAA3cXwAWq/gaQvxfAA4EiwAOBKsADhGYAAZOkjBwAAAABA8ADgVrAA4RmAAAAAgICwAOBZwAAAIPsYMAA/bYAwAOBcwAAAJJiYMAA/jcAAGCRSQE+A0nAA4F9FsADgYiAwAOBgcAFq7uBVcAA/bw9MMADgZEnklc/TsADgbbAA4G6AACArGDAAP22AR7AA4G8kDABAAGBwAOBysAFq8oASsADgdMBH8ADgd6RUwMAAWrAA4HmXZE+AWECYMAA/bZgwAD+N2CRScAAST0CIiTAA4QxBSeTpYDAA4JdwAWruyeTpoLAA4ODwAWsBCeTp1sywAOERGDAAP22WwIng+yAwAOET8AFq7sngKyBwAOEXsAFq8oGkMAXwAOIP8ADiEfAA4o5AAGTqIwcAAAAAQPAA4h9wAOKOQAAAAEBAcADiIUAAACD7GDAAP22AABgkUkBPgJJwAOIkRbAA4icgMADiJXABazHgVXAAP28PTDAA4ilJ5JXP0rAA4jDAR/AA4jOkVMDAAFqwAOI1l2RPgFhAWDAAP22YJFJwABJjwIiJMADihEDJ5OlgMADiVPABazHJ5OpWzLAA4okYMAA/bZbASeD7IDAA4ovwAWsxwaQwRfAA5AxwAOQOcADlHIAAZOqjBwAAAABA8ADkGfAA5RyAAAABAQEwAOQdAAAAIPsYMAA/bYAwAOQgwAAAJJwYMAA/bYAwAOQkwAAAJKrYMAA/bYAwAOQoAAAAJJiYMAA/jcAAGCRSQE+BUnAA5CqFsADkLWAwAOQrsAFrYCBVcAA/bw9MMADkL4nklc/ScADkNwWwAOQ6IHAA5DgwAWtj4FVwAD9vD0wwAOQ8SeSVz9JwAORDxbAA5EbgsADkRPABa2egVXAAP28PTDAA5EkJ5JXP07AA5FJwAORTQAAgKxgwAD9tgEewAORT5AwAQABg8ADkV3ABa2tAErAA5FmAR/AA5FxkVMDAAFqwAOReV2RPgFhBGDAAP22YMAA/bZgwAD9tmDAAP43YJFJwABJ6wIiJMADk+0JJ5OlgMADke7ABa2AJ5OrgcADkhvABa2PJ5OsgsADkj3ABa2eJ5OthMADkz/ABa4tJ5OnWzLAA5QAYMAA/bZbBCeD7IDAA5QUwAWtgCeScIHAA5QvwAWtjyeSq4LAA5RLwAWtnieArIPAA5RjwAWtrQaQwhfAA5jxwAOY+cADm8UAAZOujBwAAAABA8ADmS3AA5vFAAAAAwMDwAOZOgAAAIPsYMAA/bYAwAOZSQAAAJJwYMAA/bYAwAOZWQAAAJKrYMAA/bYAAGCRSQE+BEnAA5lmFsADmXGAwAOZasAFryqBVcAA/bw9MMADmXonklc/ScADmZgWwAOZpIHAA5mcwAWvOYFVwAD9vD0wwAOZrSeSVz9JwAOZyxbAA5nXgsADmc/ABa9IgVXAAP28PTDAA5ngJ5JXP0rAA5n+AR/AA5oJkVMDAAFqwAOaEV2RPgFhA2DAAP22YMAA/bZgwAD9tmCRScAASlECIiTAA5t1ByeTpYDAA5qMwAWvKieTq4HAA5q5wAWvOSeTrILAA5rbwAWvSCeTr1sywAObiGDAAP22WwMng+yAwAObk8AFryonknCBwAObpsAFrzknkquCwAObusAFr0gGkMMXwAOgjMADoJTAA6HDAAGTsIwcAAAAAQPAA6C7wAOhwwAAAAEBAcADoMMAAACAvWDAAP22AABgkUkBPgNJwAOgzRbAA6DWgMADoNHABbCBgVXAAP28PTDAA6DfJ5IdPz2IwAOg+8AFsIEewAOhAoJJAQABgMADoR/ABbCBAErAA6EoAR/AA6EzkVMDAAFqwAOhO12RPgFhAWDAAP22YJFJwABK6QIiJMADoZ8DJ4NCgMADoW/ABbCBJ5OxWzLAA6GyYMAA/bZbASeAvYDAA6G7wAWwgQaQxBfAA6TewAOk5sADpkMAAZOyjBwAAAABA8ADpRHAA6ZDAAAAAQEBwAOlGQAAAIC9YMAA/bYAAGCRSQE+A0nAA6UjFsADpSyAwAOlJ8AFsViBVcAA/bw9MMADpTUnkh0/PYjAA6VRwAWxWB7AA6VYgkkBAAGAwAOldcAFsVgASsADpX4BH8ADpYmRUwMAAWrAA6WRXZE+AWEBYMAA/bZgkUnAAEtHAiIkwAOmHwMnk7OAwAOmAMAFsVgnk7RbMsADpjJgwAD9tlsBJ4C9gMADpjvABbFYBpDFF8ADqrDAA6q4wAOt2gABk7WMHAAAAAEDwAOq5MADrdoAAAADAwPAA6rxAAAAgL1gwAD9tgDAA6sAAAAAkiZgiLMAwAOrEAAAAJInYIizAABgkUkBPghJwAOrHBbAA6slgMADqyDABbIvgVXAAP28PTDAA6suJ5IdPz2IwAOrSsAFsi8ewAOrUYJJAQABgMADq27ABbIvAE7AA6uDwAOriwAAkihgn2cBH8ADq5GfjAAAAABOwAOrr8ADq7kAAJIpXcAA/HQBYMAA/RwBHMADq8ODwAOru8AFsqGSKgEAAYHAA6vNwAWyPgCfbU7AA6vkwAOr7wAAkitdwAD8dAFgwAD9HAEcwAOr+YPAA6vxwAWyoZIqAQABgsADrAPABbJLAJ9tTsADrBXAA6waAACCkGDAAP22ARzAA6wmhMADrBzABbK9WAAAAADAAPxGTsADrDfAA6w9AACSLGDAAP22ARzAA6xKhcADrD/ABbL1WAAAAADAAPxGSsADrFQBH8ADrF+RUwQAAWrAA6xnXZE+AWEDYMAA/bZgiLNgiLNgkUnAAEuxAyIcwAOtFSTAA60VByeTtoDAA6zAwAWyLyeTt4bAA6zLwAWzLSeTuIfAA60JwAWzVyeBS2QBAAEWwAOtLYPAA60lwAWyoZIvn4oAwAD9y4icJMADrZYFJ5O5gMADrXHABbIvJ5O6h8ADrYvABbNXJ4FLWzLAA62pYMAA/bZbAyeAvYDAA62ywAWyLyeCkIHAA63AwAWyPieSLILAA63QwAWySwaQxhfAA7HfwAOx58ADsrIAAZO7jBwAAAABA8ADsgbAA7KyAAAAAQEBwAOyCwAAAJJiYMAA/jcAAGCRSQE+Ak7AA7IcwAOyIAAAgKxgwAD9tgEewAOyIpAwAQABgMADsjDABbR5AErAA7I5AR/AA7JEkVMDAAFqwAOyTF2RPgFhAWDAAP43YJFJwABMCwIiJMADspUDJ5O8gcADso3ABbSQJ4FqWzLAA7KiYMAA/bZbASeArIDAA7KqwAW0eQaQxxfAA7ZXwAO2X8ADuCIAAZO9jBwAAAABA8ADtofAA7giAAAAAQEBwAO2jwAAAIPsYMAA/bYAAGCRSQE+AknAA7abFsADtqaAwAO2n8AFtTaBVcAA/bw9MMADtq8nklc/SsADts0BH8ADttiRUwQAAWrAA7bgXZE+AWEBYMAA/bZgkUnAAExqAyIkwAO3XQMnk76AwAO3MsAFtTYnk7+InCeNqlsywAO4DWDAAP22WwEng+yAwAO4GMAFtTYGkMgXwAO66MADuvDAA7wwAAGTwIwcAAAAAQPAA7sTwAO8MAAAAAEBAcADuxsAAACAvWDAAP22AABgkUkBPgNJwAO7JRbAA7sugMADuynABbX0gVXAAP28PTDAA7s3J5IdPz2IwAO7U8AFtfQewAO7WoJJAQABgMADu3fABbX0AErAA7uAAR/AA7uLkVMDAAFqwAO7k12RPgFhAWDAAP22YJFJwABMugIiJMADvAwDJ5PBgMADvALABbX0J4FLWzLAA7wfYMAA/bZbASeAvYDAA7wowAW19AaQyRfAA8LZwAPC4cADxF0AAZPCjBwAAAABA8ADwxHAA8RdAAAAAgICwAPDHgAAAIC9YMAA/bYAwAPDKAAAAJJiYMAA/jcAAGCRSQE+BEnAA8MyFsADwzuAwAPDNsAFtsuBVcAA/bw9MMADw0Qnkh0/PYjAA8NgwAW2yx7AA8NngkkBAAGAwAPDhMAFtssATsADw5TAA8OYAACArGDAAP22AR7AA8OakDABAAGBwAPDqMAFttoASsADw7EBH8ADw7yRUwMAAWrAA8PEXZE+AWECYMAA/bZgwAD+N2CRScAATVwCIiTAA8QsBSeTw4DAA8QWwAW2yyeTxILAA8QjwAW3MieBS1sywAPEP2DAAP22WwIngL2AwAPESMAFtssngKyBwAPEVcAFttoGkMoXwAPHTcADx1XAA8huAAGTxYwcAAAAAQPAA8eBwAPIbgAAAAEBAcADx4kAAACD7GDAAP22AABgkUkBPgJJwAPHlRbAA8eggMADx5nABbf1gVXAAP28PTDAA8epJ5JXP0rAA8fHAR/AA8fSkVMDAAFqwAPH2l2RPgFhAWDAAP22YJFJwABNrgIiJMADyEYCJ5PGgMADyDzABbf1WzLAA8hZYMAA/bZbASeD7IDAA8hkwAW39QaQyxfAA8tkwAPLbMADzPAAAZPHjBwAAAABA8ADy5PAA8zwAAAAAgICwAPLmwAAAIC9YMAA/bYAwAPLqAAAAIPsYMAA/bYAAGCRSQE+BEnAA8u0FsADy72AwAPLuMAFuKuBVcAA/bw9MMADy8Ynkh0/PYjAA8viwAW4qx7AA8vpgkkBAAGAwAPMBsAFuKsAScADzA8WwAPMGoHAA8wTwAW4uoFVwAD9vD0wwAPMIyeSVz9KwAPMQQEfwAPMTJFTAwABasADzFRdkT4BYQJgwAD9tmDAAP22YJFJwABOAAIiJMADzMAEJ5PIgMADzKnABbirJ5PJgcADzLbABbi6WzLAA8zNYMAA/bZbAieAvYDAA8zWwAW4qyeD7IHAA8zmwAW4ugaQzBfAA9XgwAPV6MAD1yIAAZPKjBwAAAABA8AD1hnAA9ciAAAAAQEBwAPWIQAAAIC9YMAA/bYAAGCRSQE+A0nAA9YrFsAD1jSAwAPWL8AFuc6BVcAA/bw9MMAD1j0nkh0/PYjAA9ZZwAW5zh7AA9ZggkkBAAGAwAPWfcAFuc4ASsAD1oYBH8AD1pGRUwMAAWrAA9aZXZE+AWEBYMAA/bZgkUnAAE6iAiIkwAPW/gMnk8uAwAPW9MAFuc4ngUtbMsAD1xFgwAD9tlsBJ4C9gMAD1xrABbnOBpDNF8AD2bTAA9m8wAPayQABk8yMHAAAAAEDwAPZ4cAD2skAAAABAQHAA9npAAAAgL1gwAD9tgAAYJFJAT4DScAD2fMWwAPZ/IDAA9n3wAW6pYFVwAD9vD0wwAPaBSeSHT89iMAD2iHABbqlHsAD2iiCSQEAAYDAA9pFwAW6pQBKwAPaTgEfwAPaWZFTAwABasAD2mFdkT4BYQFgwAD9tmCRScAATu8CIiTAA9qrAyeTzYDAA9qhwAW6pSeBS1sywAPauGDAAP22WwEngL2AwAPawcAFuqUGkM4XwAPdscAD3bnAA99aAAGTzowcAAAAAQPAA93gwAPfWgAAAAICAsAD3egAAACAvWDAAP22AMAD3fUAAACSPWDAAP22AABgkUkBPgVJwAPeABbAA94JgMAD3gTABbt8gVXAAP28PTDAA94SJ5IdPz2IwAPeLsAFu3wewAPeNYJJAQABgMAD3lLABbt8AEnAA95bFsAD3mWBwAPeX8AFu4uBVcAA/bw9MMAD3m4nkh0/PYnAA96KwAW7ix7AA96SgkkBAAGBwAPer8AFu4sASsAD3rkBH8AD3sSRUwMAAWrAA97MXZE+AWECYMAA/bZgwAD9tmCRScAAT0ECIiTAA98mBSeTzYDAA98OwAW7fCeTxIHAA98bwAW7iyeBS1sywAPfOWDAAP22WwIngL2AwAPfQsAFu3wnkj2BwAPfUcAFu4sGkM8XwAPkIsAD5CrAA+VwAAGTz4wcAAAAAQPAA+RfwAPlcAAAAAEBAcAD5GcAAACAvWDAAP22AABgkUkBPgNJwAPkcRbAA+R6gMAD5HXABbzAgVXAAP28PTDAA+SDJ5IdPz2IwAPkn8AFvMAewAPkpoJJAQABgMAD5MPABbzAAErAA+TMAR/AA+TXkVMDAAFqwAPk312RPgFhAWDAAP22YJFJwABPuwIiJMAD5UwDJ5PQgMAD5ULABbzAJ4FLWzLAA+VfYMAA/bZbASeAvYDAA+VowAW8wAaQ0BfAA+qJwAPqkcAD7AkAAZPRjBwAAAABA8AD6rvAA+wJAAAAAgICwAPqwwAAAIC9YMAA/bYAwAPq0AAAAIPsYMAA/bYAAGCRSQE+BEnAA+rcFsAD6uWAwAPq4MAFvZeBVcAA/bw9MMAD6u4nkh0/PYjAA+sKwAW9lx7AA+sRgkkBAAGAwAPrLsAFvZcAScAD6zcWwAPrQoHAA+s7wAW9poFVwAD9vD0wwAPrSyeSVz9KwAPraQEfwAPrdJFTAwABasAD63xdkT4BYQJgwAD9tmDAAP22YJFJwABQDQIiJMAD69kDgMAD67LABb2XJ5PSgcAD68/ABb2mWzLAA+vmYMAA/bZbAieAvYDAA+vvwAW9lyeD7IHAA+v/wAW9pgaQ0RfAA++IwAPvkMAD8cUAAZPTjBwAAAABA8AD78nAA/HFAAAAAgICwAPv2AAAAJImYIizAMAD7+YAAACAvWDAAP22AABgkUkBPgZOwAPv/MAD8AQAAJIoYJ9nAR/AA/AKn4wAAAAATsAD8CjAA/AyAACSKV3AAPx0AWDAAP0cARzAA/A8gsAD8DTABb7bkioBAAGAwAPwRsAFvrcAn21JwAPwUBbAA/BZgcAD8FTABb7EgVXAAP28PTDAA/BiJ5IdPz2JwAPwfsAFvsQewAPwhYJJAQABgcAD8KLABb7EAE7AA/CywAPwtwAAgpBgwAD9tgEcwAPww4PAA/C5wAW+91gAAAAAwAD8RkrAA/DNAR/AA/DYkVMDAAFqwAPw4F2RPgFhAmCIs2DAAP22YJFJwABQYgIiHMAD8WwkwAPxbAUnk9SEwAPxUsAFv3Ank9WBwAPxYcAFvsQngUtkAQABFsAD8YSCwAPxfMAFvtuSL5+KAMAA/ctbMsAD8aVgwAD9tlsCJ4KQgMAD8a7ABb63J4C9gcAD8b3ABb7EBpDSF8AD9MLAA/TKwAP2KAABk9aMHAAAAAEDwAP08cAD9igAAAACAgLAA/T5AAAAg+xgwAD9tgDAA/UIAAAAknBgwAD9tgAAYJFJAT4DScAD9RUWwAP1IIDAA/UZwAXAVIFVwAD9vD0wwAP1KSeSVz9JwAP1RxbAA/VTgcAD9UvABcBjgVXAAP28PTDAA/VcJ5JXP0rAA/V6AR/AA/WFkVMDAAFqwAP1jV2RPgFhAmDAAP22YMAA/bZgkUnAAFC3AiIkwAP17AUnkxmAwAP1ysAFwFQnk9eBwAP138AFwGMngUtbMsAD9f9gwAD9tlsCJ4PsgMAD9grABcBUJ5JwgcAD9h3ABcBjBpDTF8AD+RfAA/kfwAP6cgABk9iMHAAAAAEDwAP5RcAD+nIAAAACAgLAA/lNAAAAg+xgwAD9tgDAA/lcAAAAknBgwAD9tgAAYJFJAT4DScAD+WkWwAP5dIDAA/ltwAXBXIFVwAD9vD0wwAP5fSeSVz9JwAP5mxbAA/mngcAD+Z/ABcFrgVXAAP28PTDAA/mwJ5JXP0rAA/nOAR/AA/nZkVMDAAFqwAP54V2RPgFhAmDAAP22YMAA/bZgkUnAAFEOAiIkwAP6NgUnk9mAwAP6HcAFwVwngZ6BwAP6KsAFwWsngWpbMsAD+klgwAD9tlsCJ4PsgMAD+lTABcFcJ5JwgcAD+mfABcFrBpDUF8AD/SnAA/0xwAP+JQABk9qMHAAAAAEDwAP9W8AD/iUAAAABAQHAA/1jAAAAg+xgwAD9tgAAYJFJAT4CScAD/W8WwAP9eoDAA/1zwAXCZIFVwAD9vD0wwAP9gyeSVz9KwAP9oQEfwAP9rJFTAwABasAD/bRdkT4BYQFgwAD9tmCRScAAUWACIiTAA/4DAyeT24DAA/34wAXCZCeBalsywAP+EGDAAP22WwEng+yAwAP+G8AFwmQGkNUXwAQA08AEANvABAH9AAGT3IwcAAAAAQPABAEDwAQB/QAAAAEBAcAEAQsAAACAvWDAAP22AABgkUkBPgNJwAQBFRbABAEegMAEARnABcMdgVXAAP28PTDABAEnJ5IdPz2IwAQBQ8AFwx0ewAQBSoJJAQABgMAEAWfABcMdAErABAFwAR/ABAF7kVMDAAFqwAQBg12RPgFhAWDAAP22YJFJwABRiQIiJMAEAdkDJ5PdgMAEAc/ABcMdJ4FLWzLABAHsYMAA/bZbASeAvYDABAH1wAXDHQaQ1hfABAS1wAQEvcAEBaYAAZPejBwAAAABA8AEBOrABAWmAAAAAQEBwAQE7wAAAJJiYMAA/jcAAGCRSQE+Ak7ABAUAwAQFBAAAgKxgwAD9tgEewAQFBpAwAQABgMAEBRTABcP0AErABAUdAR/ABAUokVMDAAFqwAQFMF2RPgFhAWDAAP43YJFJwABR1AIiJMAEBYkDJ5PfgcAEBXLABcQLJ5PgWzLABAWWYMAA/bZbASeArIDABAWewAXD9AaQ1xfABAiUwAQInMAECbcAAZPhjBwAAAABA8AECMrABAm3AAAAAQEBwAQI0gAAAIPsYMAA/bYAAGCRSQE+AknABAjeFsAECOmAwAQI4sAFxLGBVcAA/bw9MMAECPInklc/SsAECRABH8AECRuRUwMAAWrABAkjXZE+AWEBYMAA/bZgkUnAAFIhAiIkwAQJlQInk+KAwAQJi8AFxLFbMsAECaJgwAD9tlsBJ4PsgMAECa3ABcSxBpDYF8AEDxLABA8awAQSDQABk+OMHAAAAAEDwAQPRsAEEg0AAAADAwPABA9TAAAAgL1gwAD9tgDABA9iAAAAkiZgiLMAwAQPcgAAAJInYIizAABgkUkBPghJwAQPfhbABA+HgMAED4LABcVngVXAAP28PTDABA+QJ5IdPz2IwAQPrMAFxWcewAQPs4JJAQABgMAED9DABcVnAE7ABA/lwAQP7QAAkihgn2cBH8AED/OfjAAAAABOwAQQEcAEEBsAAJIpXcAA/HQBYMAA/RwBHMAEECWDwAQQHcAFxdmSKgEAAYHABBAvwAXFdgCfbU7ABBBGwAQQUQAAkitdwAD8dAFgwAD9HAEcwAQQW4PABBBTwAXF2ZIqAQABgsAEEGXABcWDAJ9tTsAEEHfABBB8AACCkGDAAP22ARzABBCIhMAEEH7ABcX1WAAAAADAAPxGTsAEEJnABBCfAACSLGDAAP22ARzABBCshcAEEKHABcYtWAAAAADAAPxGSsAEELYBH8AEEMGRUwQAAWrABBDJXZE+AWEDYMAA/bZgiLNgiLNgkUnAAFKzAyIcwAQRWCTABBFYByeSYIDABBEjwAXFZyeT5IbABBE/wAXGZSeT5YfABBFMwAXGjyeBS2QBAAEWwAQRcIPABBFowAXF2ZIvn4oAwAD9y4icJ44JWzLABBHcYMAA/bZbAyeAvYDABBHlwAXFZyeCkIHABBHzwAXFdieSLILABBIDwAXFgwaQ2RfABBW0wAQVvMAEGD4AAZPmjBwAAAABA8AEFdvABBg+AAAAAgICwAQV5QAAAJImYIizAMAEFfUAAACSJ2CIswAAYJFJAT4GTsAEFg3ABBYVAACSKGCfZwEfwAQWG5+MAAAAAE7ABBY5wAQWQwAAkildwAD8dAFgwAD9HAEcwAQWTYLABBZFwAXHtZIqAQABgMAEFlfABceTAJ9tTsAEFm7ABBZ5AACSK13AAPx0AWDAAP0cARzABBaDgsAEFnvABce1kioBAAGBwAQWjcAFx6AAn21OwAQWn8AEFqQAAIKQYMAA/bYBHMAEFrCDwAQWpsAFx9FYAAAAAMAA/EZOwAQWwcAEFscAAJIsYMAA/bYBHMAEFtSEwAQWycAFyAlYAAAAAMAA/EZKwAQW3gEfwAQW6ZFTBAABasAEFvFdkT4BYQJgiLNgiLNgkUnAAFMWAyIcwAQXdSTABBd1BSeTboXABBc3wAXIQSeTb4bABBdpwAXIayeBS2QBAAEWwAQXjYLABBeFwAXHtZIvn4oAwAD9y4icJMAEGAgDJ5PnhsAEF/3ABchrJ4FLWzLABBgbYMAA/bZbAieCkIDABBgkwAXHkyeSLIHABBg0wAXHoAaQ2hfABBxBwAQcScAEHU0AAZPojBwAAAABA8AEHGnABB1NAAAAAQEBwAQccQAAAIC9YMAA/bYAAGCRSQE+A0nABBx7FsAEHISAwAQcf8AFyWSBVcAA/bw9MMAEHI0nkh0/PYjABBypwAXJZB7ABBywgkkBAAGAwAQczcAFyWQASsAEHNYBH8AEHOGRUwMAAWrABBzpXZE+AWEBYMAA/bZgkUnAAFOVAiIkwAQdLwMnkkuAwAQdJcAFyWQngUtbMsAEHTxgwAD9tlsBJ4C9gMAEHUXABclkBpDbF8AEIQzABCEUwAQjkgABk+mMHAAAAAEDwAQhOcAEI5IAAAACAgLABCFDAAAAkiZgiLMAwAQhUwAAAJInYIizAABgkUkBPgZOwAQha8AEIXMAAJIoYJ9nAR/ABCF5n4wAAAAATsAEIZfABCGhAACSKV3AAPx0AWDAAP0cARzABCGrgsAEIaPABcpdkioBAAGAwAQhtcAFyjsAn21OwAQhzMAEIdcAAJIrXcAA/HQBYMAA/RwBHMAEIeGCwAQh2cAFyl2SKgEAAYHABCHrwAXKSACfbU7ABCH9wAQiAgAAgpBgwAD9tgEcwAQiDoPABCIEwAXKeVgAAAAAwAD8Rk7ABCIfwAQiJQAAkixgwAD9tgEcwAQiMoTABCInwAXKsVgAAAAAwAD8RkrABCI8AR/ABCJHkVMEAAFqwAQiT12RPgFhAmCIs2CIs2CRScAAU/cDIhzABCLVJMAEItUFJ5PqhcAEIqjABcrpJ5PrhsAEIsnABcsTJ4FLZAEAARbABCLtgsAEIuXABcpdki+figDAAP3LiJwnjhxbMsAEI29gwAD9tlsCJ4KQgMAEI3jABco7J5IsgcAEI4jABcpIBpDcF8AEJz3ABCdFwAQpswABk+yMHAAAAAEDwAQnacAEKbMAAAACAgLABCdzAAAAkiZgiLMAwAQngwAAAJInYIizAABgkUkBPgZOwAQnm8AEJ6MAAJIoYJ9nAR/ABCepn4wAAAAATsAEJ8fABCfRAACSKV3AAPx0AWDAAP0cARzABCfbgsAEJ9PABcwckioBAAGAwAQn5cAFy/oAn21OwAQn/MAEKAcAAJIrXcAA/HQBYMAA/RwBHMAEKBGCwAQoCcAFzBySKgEAAYHABCgbwAXMBwCfbU7ABCgtwAQoMgAAgpBgwAD9tgEcwAQoPoPABCg0wAXMOFgAAAAAwAD8Rk7ABChPwAQoVQAAkixgwAD9tgEcwAQoYoTABChXwAXMcFgAAAAAwAD8RkrABChsAR/ABCh3kVMEAAFqwAQof12RPgFhAmCIs2CIs2CRScAAVF0DIhzABCj9JMAEKP0FJ5PthcAEKNDABcyoJ5PrhsAEKPHABczSJ4FLZAEAARbABCkVgsAEKQ3ABcwcki+figDAAP3LiJwnjiJbMsAEKZBgwAD9tlsCJ4KQgMAEKZnABcv6J5IsgcAEKanABcwHBpDdF8AELVbABC1ewAQvyAABk+6MHAAAAAEDwAQtgcAEL8gAAAACAgLABC2LAAAAkiZgiLMAwAQtmwAAAJInYIizAABgkUkBPgZOwAQts8AELbsAAJIoYJ9nAR/ABC3Bn4wAAAAATsAELd/ABC3pAACSKV3AAPx0AWDAAP0cARzABC3zgsAELevABc3bkioBAAGAwAQt/cAFzbkAn21OwAQuFMAELh8AAJIrXcAA/HQBYMAA/RwBHMAELimCwAQuIcAFzduSKgEAAYHABC4zwAXNxgCfbU7ABC5FwAQuSgAAgpBgwAD9tgEcwAQuVoPABC5MwAXN91gAAAAAwAD8Rk7ABC5nwAQubQAAkixgwAD9tgEcwAQueoTABC5vwAXOL1gAAAAAwAD8RkrABC6EAR/ABC6PkVMEAAFqwAQul12RPgFhAmCIs2CIs2CRScAAVMMDIhzABC8TJMAELxMFJ5PvhcAELubABc5nJ5PrhsAELwfABc6RJ4FLZAEAARbABC8rgsAELyPABc3bki+figDAAP3LiJwnjihbMsAEL6VgwAD9tlsCJ4KQgMAEL67ABc25J5IsgcAEL77ABc3GBpDeF8AEM2vABDNzwAQ13QABk/CMHAAAAAEDwAQzlsAENd0AAAACAgLABDOgAAAAkiZgiLMAwAQzsAAAAJInYIizAABgkUkBPgZOwAQzyMAEM9AAAJIoYJ9nAR/ABDPWn4wAAAAATsAEM/TABDP+AACSKV3AAPx0AWDAAP0cARzABDQIgsAENADABc+akioBAAGAwAQ0EsAFz3gAn21OwAQ0KcAENDQAAJIrXcAA/HQBYMAA/RwBHMAEND6CwAQ0NsAFz5qSKgEAAYHABDRIwAXPhQCfbU7ABDRawAQ0XwAAgpBgwAD9tgEcwAQ0a4PABDRhwAXPtlgAAAAAwAD8Rk7ABDR8wAQ0ggAAkixgwAD9tgEcwAQ0j4TABDSEwAXP7lgAAAAAwAD8RkrABDSZAR/ABDSkkVMEAAFqwAQ0rF2RPgFhAmCIs2CIs2CRScAAVSkDIhzABDUoJMAENSgFJ5PxhcAENPvABdAmJ5PrhsAENRzABdBQJ4FLZAEAARbABDVAgsAENTjABc+aki+figDAAP3LiJwnji5bMsAENbpgwAD9tlsCJ4KQgMAENcPABc94J5IsgcAENdPABc+FBpDfF8AEOZXABDmdwAQ8GwABk/KMHAAAAAEDwAQ5w8AEPBsAAAACAgLABDnSAAAAkiZgiLMAwAQ54gAAAJInYIizAABgkUkBPgZOwAQ5+sAEOgIAAJIoYJ9nAR/ABDoIn4wAAAAATsAEOibABDowAACSKV3AAPx0AWDAAP0cARzABDo6gsAEOjLABdFZkioBAAGAwAQ6RMAF0TcAn21OwAQ6W8AEOmYAAJIrXcAA/HQBYMAA/RwBHMAEOnCCwAQ6aMAF0VmSKgEAAYHABDp6wAXRRACfbU7ABDqMwAQ6kQAAgpBgwAD9tgEcwAQ6nYPABDqTwAXRdVgAAAAAwAD8Rk7ABDquwAQ6tAAAkixgwAD9tgEcwAQ6wYTABDq2wAXRrVgAAAAAwAD8RkrABDrLAR/ABDrWkVMEAAFqwAQ63l2RPgFhAmCIs2CIs2CRScAAVY8DIhzABDtpJMAEO2kFJ5PzhcAEOzfABdHlJ5P0hsAEO13ABdIPJ4FLZAEAARbABDuBgsAEO3nABdFZki+figDAAP3LiJwnjjRbMsAEO/hgwAD9tlsCJ4KQgMAEPAHABdE3J5IsgcAEPBHABdFEBpDgF8AEP8bABD/OwARCTAABk/WMHAAAAAEDwAQ/7sAEQkwAAAACAgLABD/4AAAAkiZgiLMAwARACAAAAJInYIizAABgkUkBPgZOwARAIMAEQCgAAJIoYJ9nAR/ABEAun4wAAAAATsAEQEzABEBWAACSKV3AAPx0AWDAAP0cARzABEBggsAEQFjABdMYkioBAAGAwARAasAF0vYAn21OwARAgcAEQIwAAJIrXcAA/HQBYMAA/RwBHMAEQJaCwARAjsAF0xiSKgEAAYHABECgwAXTAwCfbU7ABECywARAtwAAgpBgwAD9tgEcwARAw4PABEC5wAXTNFgAAAAAwAD8Rk7ABEDUwARA2gAAkixgwAD9tgEcwARA54TABEDcwAXTbFgAAAAAwAD8RkrABEDxAR/ABED8kVMEAAFqwARBBF2RPgFhAmCIs2CIs2CRScAAVfUDIhzABEGKJMAEQYoFJ5P2hcAEQVjABdOkJ5P0hsAEQX7ABdPOJ4FLZAEAARbABEGigsAEQZrABdMYki+figDAAP3LiJwnjjpbMsAEQilgwAD9tlsCJ4KQgMAEQjLABdL2J5IsgcAEQkLABdMDBpDhF8AERfrABEYCwARIdgABk/eMHAAAAAEDwARGJ8AESHYAAAACAgLABEYxAAAAkiZgiLMAwARGQQAAAJInYIizAABgkUkBPgZOwARGWcAERmEAAJIoYJ9nAR/ABEZnn4wAAAAATsAERoXABEaPAACSKV3AAPx0AWDAAP0cARzABEaZgsAERpHABdTXkioBAAGAwARGo8AF1LUAn21OwARGusAERsUAAJIrXcAA/HQBYMAA/RwBHMAERs+CwARGx8AF1NeSKgEAAYHABEbZwAXUwgCfbU7ABEbrwARG8AAAgpBgwAD9tgEcwARG/IPABEbywAXU81gAAAAAwAD8Rk7ABEcNwARHEwAAkixgwAD9tgEcwARHIITABEcVwAXVK1gAAAAAwAD8RkrABEcqAR/ABEc1kVMEAAFqwARHPV2RPgFhAmCIs2CIs2CRScAAVlsDIhzABEfGJMAER8YFJ5P4hcAER5TABdVjJ5P0hsAER7rABdWNJ4FLZAEAARbABEfegsAER9bABdTXki+figDAAP3LiJwnjkBbMsAESFNgwAD9tlsCJ4KQgMAESFzABdS1J5IsgcAESGzABdTCBpDiF8AETEHABExJwARO0QABk/mMHAAAAAEDwARMcsAETtEAAAACAgLABEyBAAAAkiZgiLMAwARMkQAAAJInYIizAABgkUkBPgZOwARMqcAETLEAAJIoYJ9nAR/ABEy3n4wAAAAATsAETNXABEzfAACSKV3AAPx0AWDAAP0cARzABEzpgsAETOHABdaWkioBAAGAwARM88AF1nQAn21OwARNCsAETRUAAJIrXcAA/HQBYMAA/RwBHMAETR+CwARNF8AF1paSKgEAAYHABE0pwAXWgQCfbU7ABE07wARNQAAAgpBgwAD9tgEcwARNTIPABE1CwAXWslgAAAAAwAD8Rk7ABE1dwARNYwAAkixgwAD9tgEcwARNcITABE1lwAXW6lgAAAAAwAD8RkrABE16AR/ABE2FkVMEAAFqwARNjV2RPgFhAmCIs2CIs2CRScAAVrADIhzABE4fJMAETh8FJ5P6hcAETe3ABdciJ5P0hsAEThPABddMJ4FLZAEAARbABE43gsAETi/ABdaWki+figDAAP3LiJwnjjRbMsAETq5gwAD9tlsCJ4KQgMAETrfABdZ0J5IsgcAETsfABdaBBpDjF8AEVFTABFRcwARVaQABk/uMHAAAAAEDwARUf8AEVWkAAAABAQHABFSHAAAAgL1gwAD9tgAAYJFJAT4DScAEVJEWwARUmoDABFSVwAXYM4FVwAD9vD0wwARUoyeSHT89iMAEVL/ABdgzHsAEVMaCSQEAAYDABFTjwAXYMwBKwARU7AEfwARU95FTAwABasAEVP9dkT4BYQFgwAD9tmCRScAAV3MCIiTABFVLAyeSvYDABFVBwAXYMyeBS1sywARVWGDAAP22WwEngL2AwARVYcAF2DMGkOQXwARdfcAEXYXABF5uAAGT/IwcAAAAAQPABF2iwARebgAAAAEBAcAEXakAAACSTmCeqwAAYJFJAT4CTsAEXbvABF3CAACCXmDAAP22ARbABF3KgMAEXcTABdkKgl6exUrABF3UAR/ABF3fkVMDAAFqwARd512RPgFhAWCeq2CRScAAWFsCIiTABF5IAyeT/YHABF4cwAXZHyeT/lsywAReW2DAAP22WwEnkk6AwAReZcAF2QoGkOUXwARg8MAEYPjABGIj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wAXrF4FVwAD9vD0wwATn5yeSHT89iMAE6APABesXHsAE6AqCSQEAAYDABOgnwAXrFwBKwAToMAEfwAToO5FTAwABasAE6ENdkT4BYQFgwAD9tmCRScAAZNECIiTABOidAyeUK4DABOiTwAXrFyeBS1sywATosGDAAP22WwEngL2AwAToucAF6xcGkPYXwATuBMAE7gzABPBeAAGULIwcAAAAAQPABO4swATwXgAAAAICAsAE7jQAAACULWDAAP22AMAE7kMAAACSNWDAAPvQAABgkUkBPgNJwATuUiEcwATubRbABO5mFsAE7mCAwATuVsAF6+6ULsAA/b9hwAD8VUgBAAGUAMAA/PM9MMAE7nMkwATumQMnlC+AwATujcAF6+4ng0I/TsAE7qTABO6sAACSNmDAAP22ASTABO70AieSNxzABO7jHMAE7tUcwATuw4HABO65wAXr/YQJAQABNxAAwAD7/pI4AAAAAMAA/dySOQIAApcnhAgAwAD90UrABO74AR/ABO8DkVMEAAFqwATvC12RPgFhAmDAAP22YMAA+9BgkUnAAGVUAyIkwATvsQUnlDCAwATvWsAF6+4nlDGCwATvacAF7GMnlDKInCePXFsywATwK2DAAP22WwInlC2AwATwOcAF6+4nkjWBwATwUcAF6/0GkPcXwATzQsAE80rABPSjAAGUM4wcAAAAAQPABPNqwAT0owAAAAEBAcAE828AAACSNWDAAPvQAABgkUkBPgJOwATzhcAE840AAJI2YMAA/bYBJMAE89UCJ5I3HMAE88QcwATzthzABPOkgMAE85rABe1chAkBAAE3EADAAPv+kjgAAAAAwAD93JI5AgAClyeECADAAP3RSsAE89kBH8AE8+SRUwMAAWrABPPsXZE+AWEBYMAA+9BgkUnAAGWnAiIkwAT0dQMnlDSBwAT0QMAF7XMnkjtbMsAE9IhgwAD9tlsBJ5I1gMAE9JbABe1cBpD4F8AFAN7ABQDmwAUCHAABlDWMHAAAAAEDwAUBDsAFAhwAAAABAQHABQEWAAAAgL1gwAD9tgAAYJFJAT4DScAFASAWwAUBKYDABQEkwAXuSoFVwAD9vD0wwAUBMieSHT89iMAFAU7ABe5KHsAFAVWCSQEAAYDABQFywAXuSgBKwAUBewEfwAUBhpFTAwABasAFAY5dkT4BYQFgwAD9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AK0QYMAA+9DAAGM0AJThPRzAAK0gLpetAQABFsAArTGAwACtLMAH5VyEU4JZAJUbPRzAAK1CLpemAQABFsAArV2AwACtWMAH5VyFGIVUAJUWBpU+LsAArXbAAK2HwACuNgAAhZYBasAArXdgwAD9HAIAAAEDwACtlcAArjYAAAABAQHAAK2gAAAAg+5ghWIAAFwBPgQ9HMAArawuhukBAAFqwACtumDAAPvQwABjAQCU4T0cwACtyi6XrQEAARbAAK3bgMAArdbAB+X/hFOCWQCVGz0cwACt7C6XpgEAARbAAK4HgMAArgLAB+X/hRiFZACVFj0cwACuHS6G8wEAARbAAK4sgMAArifAB+X/gJaFZQCU+QaVPy7AAK47wACuTMAAr2IAAIWgAWrAAK48YMAA/RwCAAABA8AArmHAAK9iAAAAAQEBwACucwAAAIPuYIWTAABcAT4GPRzAAK5/LobpAQABasAAro1gwAD70MAAYo8AlOE9HMAArqQul60BAAEWwACutYDAAK6wwAfmw4RTglkAlRs9HMAArsYuhvMBAAEWwACu1YDAAK7QwAfmw4V5hZUAlPk9HMAAruQuhvEBAAEWwACu84DAAK7uwAfmw4C9hZYAlR09HMAArv4ul3kBAAEWwACvFoDAAK8RwAfmw1uFlwCU+z0cwACvJi6XXgEAARbAAK9FgMAAr0DAB+bDhXqFmACVFQaVQC7AAK9nwACveMAAsH8AAIWiAWrAAK9oYMAA/RwCAAABA8AAr5LAALB/AAAAAQEBwACvqQAAAIPuYIWmAABcAT4FPRzAAK+1LobpAQABasAAr8NgwAD70LG+AJThPRzAAK/fLpetAQABFsAAr/CAwACv68AH58iEU4JZAJUbPRzAALABLobxAQABFsAAsBCAwACwC8AH58iAvYWoAJUdPRzAALAbLpd5AQABFsAAsDOAwACwLsAH58hbhakAlPs9HMAAsEMul14BAAEWwACwYoDAALBdwAfnyIV6haoAlRUGlUEuwACwhMAAsJXAALGWAACFigFqwACwhWDAAP0cAgAAAQPAALCwwACxlgAAAAEBAcAAsMgAAACD7mCFHAAAXAE+BT0cwACw1C6G6QEAAWrAALDiYMAA+9DAAHx6AJThPRzAALD/LpetAQABFsAAsRCAwACxC8AH6KqEU4JZAJUbPRzAALEh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wADSJ8AA0mQAAAABAQHAANI3AAAAg+5gh4UAAFwBPgE9HMAA0kMuhukBAAFqwADSUWDAAPvQnrAAlOEGlW0uwADSacAA0nrAANNnAACGGwFqwADSamDAAP0cAgAAAQPAANKOwADTZwAAAAEBAcAA0p8AAACD7mCHjQAAXAE+BT0cwADSqy6G6QEAAWrAANK5YMAA+9CEawCU4T0cwADSzy6G8wEAARbAANLegMAA0tnACAkRhbSHjwCU+T0cwADS7i6XrQEAARbAANL/gMAA0vrACAkRhhmHkQCVGz0cwADTGi6XrQEAARbAANMrgMAA0ybACAkRhhqHkgCVGz0cwADTRC6XewEAARbAANNbgMAA01bACAkRIoeQAJUFBpVuLsAA02zAANN9wADUdwAAhh0BasAA021gwAD9HAIAAAEDwADTksAA1HcAAAABAQHAANOkAAAAg+5gh5oAAFwBPgVJwADTsBzAANPCFsAA07QulyeUsJS3SAEAASsAwAD9KT4BPRfAANPTLpcnlLAfwADT55XXAAAAAJS3Pz0cwADUDxbAANQBLpcnlLCUt5eXAQABgMAA1BXACAnzAJXTPRzAANQgLobpAQABasAA1C5gwAD70MAAWUoAlOE9HMAA1EUuhvMBAAEWwADUVIDAANRPwAgJ84Jph5wAlPk9HMAA1G0WwADUXy6XJ5SwlLcGAAAAAJXUBpVvLsAA1HzAANSNwADVVAAAhgABasAA1H1gwAD9HAIAAAEDwADUpMAA1VQAAAABAQHAANS4AAAAg+5ghyUAAFwBPgQ9HMAA1MQuhukBAAFqwADU0mDAAPvQwACRLgCU4T0cwADU6y6XrQEAARbAANT8gMAA1PfACArshFOCWQCVGz0cwADVDS6G8gEAARbAANUggMAA1RvACArsgpCHKACU7T0cwADVKy6XVgEAARbAANVHgMAA1ULACArshf+HJwCU6gaVcC7AANVZwADVasAA1gkAAIYfAWrAANVaYMAA/RwCAAABA8AA1X3AANYJAAAAAQEBwADVjQAAAIPuYIekAABcAT4DPRzAANWZLobpAQABasAA1adgwAD70KGvAJThPRzAANW8LpetAQABFsAA1c2AwADVyMAIC7CEU4JZAJUbPRzAANXeLobtAQABHMAA1fcWwADV6i6XJ5SwlLdLAQABFsAA1f2AwADV+MAIC7CCRYemAJXVAJTjBpVxLsAA1g7AANYfwADWygAAhiEBasAA1g9gwAD9HAIAAAEDwADWMsAA1soAAAABAQHAANZCAAAAg+5gh64AAFwBPgQ9HMAA1k4uhukBAAFqwADWXGDAAPvQodoAlOE9HMAA1nEul60BAAEWwADWgoDAANZ9wAgMaYRTglkAlRs9HMAA1pMuhvMBAAEWwADWooDAANadwAgMaYW0h7AAlPk9HMAA1rIuhvMBAAEWwADWwYDAANa8wAgMaYJph7EAlPkGlXIuwADWz8AA1uDAANeCAACGIwFqwADW0GDAAP0cAgAAAQPAANbwwADXggAAAAEBAcAA1v0AAACD7mCHuQAAXAE+BD0cwADXCS6G6QEAAWrAANcXYMAA+9CkBgCU4T0cwADXKS6XrQEAARbAANc6gMAA1zXACA0rhFOCWQCVGz0cwADXSy6G8wEAARbAANdagMAA11XACA0rgmmHuwCU+T0cwADXZS6G8wEAARbAANd0gMAA12/ACA0rhbSHvACU+QaVcy7AANeHwADXmMAA2QsAAIYnAWrAANeIYMAA/RwCAAABA8AA16nAANkLAAAAAQEBwADXtwAAAIPuYIfEAABcAT4JPSMcwADX1BbAANfDLpcmlLCUtkgBAAErAMAA/SkXwADXwy6XJpSwH8AA19yVzQAAAACUtisBYJXBPRzAANgEFsAA1/MulyaUsJS2l5gAAAAAlcg9HMAA2BUuhukBAAFqwADYI2DAAPvQpdgAlOE9HMAA2DYul60BAAEWwADYR4DAANhCwAgN7YRTglkAlRs9HMAA2Fgul7oBAAEWwADYeoDAANh1wAgN7YYlh8YAlYA9HMAA2Ioul3sBAAEWwADYoYDAANicwAgN7YW0h8cAlQU9HMAA2LEul2UBAAEWwADYxIDAANi/wAgN7YYmh8gAlPA9HMAA2NIuhvMBAAEWwADY4YDAANjcwAgN7YJph8kAlPk9HMAA2P0WwADY7C6XJpSwlLaXmQAAAACVyQaVdC7AANkQwADZIcAA2rYAAIYrAWrAANkRYMAA/RwCAAABA8AA2TTAANq2AAAAAQEBwADZRAAAAIPuYIfRAABcAT4JPSMcwADZYRbAANlQLpcmlLCUtkgBAAErAMAA/SkXwADZUC6XJpSwH8AA2WmVzQAAAACUtisBYJXBPRzAANmRFsAA2YAulyaUsJS2l5gAAAAAlcg9HMAA2aIuhukBAAEjFsAA2bGAwADZrMAID16GKofXasAA2b9gwAD70LqJasAA2dlgwAD70KqIAWDAAPvQAJThPRzAANnuLpetAQABFsAA2f+AwADZ+sAID16EU4JZAJUbPRzAANoQLpetAQABFsAA2iGAwADaHMAID16GKYfTAJUbPRzAANoyLpfAAQABFsAA2lCAwADaS8AID16CbIfUAJV/PRzAANpfLobzAQABFsAA2m6AwADaacAID16DzIfVAJT5PRzAANp9LobzAQABFsAA2oyAwADah8AID16CaYfWAJT5PRzAANqoFsAA2pculyaUsJS2l5kAAAAAlckGlXUuwADau8AA2szAANwxAACGLgFqwADavGDAAP0cAgAAAQPAANrgwADcMQAAAAEBAcAA2vEAAACD7mCH3wAAXAE+B0nAANr9HMAA2xQWwADbAS6XKJSwlLhIAQABKwDAAP0pPgE9F8AA2yUulyiUsB/AANs+leEAAAAAlLg/PRzAANtwFsAA210ulyiUsJS4l5cBAAGAwADbdsAIEPQAld09HMAA24EuhukBAAFqwADbj2DAAPvQpgMAlOE9HMAA26Uul60BAAEWwADbtoDAANuxwAgQ9IRTglkAlRs9HMAA28cuhvMBAAEWwADb1oDAANvRwAgQ9IJrh+EAlPk9HMAA2+cul3EBAAEWwADcBIDAANv/wAgQ9IYth+IAlPY9HMAA3CMWwADcEC6XKJSwlLgGAQABgMAA3CjACBD0AJXeBpV2LsAA3DbAANxHwADdnQAAhjMBasAA3DdgwAD9HAIAAAEDwADcVsAA3Z0AAAABAQHAANxiAAAAg+5gh+oAAFwBPgVOwADcnsAA3KUAAGFgwAD70AEWwADcuBbAANysgMAA3KfACBI2hbmH7GHAAPyjPRzAANzELobtAQABgcAA3NDACBJJAJTjRcAA3N0BwADc5sAA3OgAAGJgwAD70AGTARzAANzvgsAA3O3ACBKUYwEAAYHAANzxwAgSSQDAAPz9AYrAANz7wAgSlBzAANz5gsAA3PvACBKUZAEAAZQAwAD89T4CPRzAAN0GLpetAQABHMAA3SgWwADdF4DAAN0SwAgSNoYwh+1LAQABgsAA3SnACBKUAMAA/IMAlRs9HMAA3TQuhvMBAAEc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AGDAAPvQAZMBBZXNAAAAAAQAAAMAAAAAAAAAAABglcEBPwEJAQDAAP0yAAAAAAUGlccuwAEQ8cABEPbAARFpAACXzgAAAAEDwAEQ/cABEWkAAAABAQHAARESAAAAg+5giE4AAFwBPgI9IxzAAREkFsABER4uJ5XDSAEAASsAwAD9KRfAAREeLicywAERQmCITmDAAPvQAJXDKwFdwAD8pQJgiE5gwAD70D0cwAERTxbAARFKLieVw4C/AgACgMABEVDACD22NQAAAAEAYMAA+9ABFsABEVgumAyVxTUAAAABAGDAAPvQARfAARFYLpgMHMABEWOBAMAIPidkAQABlADAAPz1lcWBAMAIPicAwAD8ugaVyC7AARFuwAERc8ABEcAAAJeYAAAAAQPAARF8wAERwAAAAAAAAABcAT4CPSMcwAERjBbAARGFLpgLlcRIAQABKwDAAP0pF8ABEYUumAsewAERlMAA924BAWDAAPvQAZMAlcQrAV3AAPx0AWDAAPvQPRzAARGsFsABEaUumAuVxFYBAAEWwAERsC6YDJXFAMAA/IUGlckuwAERxcABEcrAARIAAACXmQAAAAEDwAER0sABEgAAAAAAAAAAXAE+AT0XwAER2y6YDBzAARHwFsABEekumAuVxIYRAAAAAMAA/JOVxQaVyi7AARIFwAESCsABElgAAJe+AAAAAQPAARIWwAESWAAAAAEBAcABEhsAAACYDWDAAPvQAABcAT4BPRfAARI0LpgMHMABEkAWwAESNC6YDJXFZAEAAYDAARJDwAg/fQDAAPz1lcUGlcsuwAESXcABEmrAARK6AwBLAAAAAQPAARJswAESugAAAAEBAcABEoEAAACD7mCITgAAYMAA+9ABPgFKwAESjQEjHMABEpoWwAESlC4nlcNIAQABKwDAAP0pKxzAARKwFsABEqsuJ5XDSwEAAYDAARKxwAg/4wDAAPy5AWDAAPvQAAAIPY8ACD5yAAg/BgAIP1YACD+9AAhAPwAAAAUClc4uwAESv8ABEsXAARPfA5gOAAABYMAA/RwAAAIEldAuwAES98ABExgJJwBdwAD8pQJgh5pgwAD70AEywAETFmCHmmDAAPvQAASV0S7AARMgwAETLxiYDABgwAD70AGTAQWV1wAAAAAEAAADAAAAAAAAAAAAYJXOAT8BCQEAwAD9MgAAAAADBpXTLsABEzTAARM5wAETewAAl5cAAAABA8ABEz7AARN7AAAAAQEBwAETUAAAAIPuYIeaAABcAT4BPRzAARNhFsABE1wuJ5XQgL8CAAKAwAETYsAIQQs1AAAAAQBgwAD70AEWwAETai6YDJXRNQAAAAEAYMAA+9ABF8ABE2oumAwcwAETdYEAwAhBO2QBAAGUAMAA/PWV0YEAwAhBOwDAAPy6BpXULsABE4DAAROFwAETowAABgAAAAEDwAETicABE6MAAAAAAAAAXAE+AT0XwAETlC6YDBzAAROSFsABE5QumAyV0YGNAQABlADAAPz2ldEGldUuwAETqMABE7XAARPdAwBLAAAAAQPAARO3wAET3QAAAAEBAcABE8kAAACD7mCHmgAAYMAA+9ABSsABE9IBHMABE9cWwAET0i4nldBLAQABgMABE9jACEH8AMAA/LkAAAhA5AAIQYYACEHWAAhCNgAAAAMCldguwAET4sABE+jAARVVA5gPAAABYMAA/RwAAAIEldouwAEUGcABFDQJJwBdwAD8pQJgh+pgwAD70AEywAEUMmCH6mDAAPvQAASV2y7AARQ8wAEUSxiYDABgwAD70AGTAQWV4QAAAAAEAAADAAAAAAAAAAAAYJXYAT8BCQEAwAD9MgAAAAADBpXdLsABFFDAARRVwAEU0AAAl5cAAAABA8ABFFrAARTQAAAAAQEBwAEUawAAAIPuYIffAABcAT4BRsABFHfAARSfwAEUhwAAAJgQYIfqABbAARSYgMABFJPACEL6hi2H4j4BPRzAARSsFsABFKcuJ5XagL8CAAKBwAEUrcAIQxU1AAAAAQBgwAD70AEWwAEUuS6YDJXbNQAAAAEAYMAA+9ABF8ABFLkumAwcwAEUxIIAwAhDVGQBAAGUAMAA/PWV24IAwAhDVADAAPy6BpXeLsABFNXAARTawAEVHwAABgAAAAEDwAEU3sABFR8AAAABAQHAARTvAAAAg+5gh98AAFwBPgE9F8ABFPsumAwcwAEVBxbAART7LpgMlduBjQEAARbAARUVFsABFQ+AwAEVCsAIQ8WGLYfiYcAA/KMAwAD89pXbBpXfLsABFSTAARUxwAEVUwMASwAAAAEDwAEVM8ABFVMAAAABAQHAARU/AAAAg+5gh+oAAGDAAPvQAUrAARVIARzAARVNFsABFUguJ5XaSwEAAYDAARVOwAhEPQDAAPy5AAAIQtMACEOfAAhEFwAIRHcAAAADApXiLsABFVjAARVewAEaWQOYEQAAAV2aBQFbAAAFBJXkLsABFZ/AARWsCZcqAGCV+gAEleUuwAEVxsABFdwJg9AAXcAA/HQBYIluATHAARXaYIluAASV5i7AARX5wAEWFAmYEgBdwAD8pQJgiW5gwAD70AEywAEWEmCJbmDAAPvQAASV5y7AARYcwAEWKhiYEwBgwAD70AGTBJXpLsABFkPAARZLCZgUlLAAYJSzAAEFle8uwAEWUMABFlDAARaCAAAAA8ABFl/AARaCAAAAAgICwAEWZQAABJcqYJX6AMABFnkAAASYFGCUswAAYJXiAT8DCAGV5IAAwAhFXggBlemBAMAIRWsJAcABFlCaCQAAAAADBpXrLsABFofAARaLwAEZ4wAAl1MAAAABA8ABFo7AARnjAAAAAQEBwAEWmAAAAIX/YIluAABgwAD70AE+CE7AARaywAEWvAABmBVgwAD70AEcwAEWxRbAARa+LpgSleZLAQABgMABFsbACEXHAMAA/LlJwAEW1SEcwAEW44HAARbZwAhF3kgBAAErAMAA/PNKwAEW7AGBwAEW88AIRd4/PRzAARd3gMABF27ACEXHhE4BAAEuAIlwScABF5ElwAEXnoDAAReVwAhFx2CJpz4BPRzAARfHFsABF7kulyqV5JdTAQABFsABF9QUwAEXy8AIRccAAWCJp4CWiXwAlf5JwAEX5yXAARf0gMABF+vACEXHYImvPgE9HMABGB0WwAEYDy6XKpXkl1MBAAEWwAEYKhTAARghwAhFxwABYImvgL2JsQCV/knAARg8JcABGEmAwAEYQMAIRcdgiZw+AT0cwAEYchbAARhkLpcqleSXUwEAASTAARiJARbAARiCFMABGHnACEXHAAFgiZyAlol8AJX+ScABGJclwAEYpIDAARibwAhFx2CJlD4CTsABGMbAARjMAAGAlmDAAPvQARbAARjXFMABGM7ACEXHAAFgiZSAlol8ScABGOQhHMABGPwcwAEY9RzAARjvgsABGOnACEdLl8gAAAAAwAD79IO8AQABNx4AwAD77UgBAAGTAMAA/PM+AT0cwAEZGhbAARkMLpcqleSXUwEAASTAARkmAYLAARkgwAhHSwCV/j8/TsABGUbAARlQAAGYFmDAAPvQARbAARlSLpgTlec9HMABGWoWwAEZYi6D0JXlVgEAAYDAARluwAhFxwDAAPyFPRfAARl9LpgTHMABGYgWwAEZfS6YE5XnZAEAARzAARmUFsABGYsumBSUsJXpl1kBAAGAwAEZrMAIRccAlOwAwAD89ZXnSsABGbsBNQAAAAEAXcAA/KUCYIluYMAA+9ABFsABGcIumBKV5jUAAAABAGCJbgGAwAEZysAIRcc1AAAAAQBgwAD70AGCwAEZ1sAIR941AAAAAQBcARzAARnJg8ABGcnACEhogL8CAAKEwAEZycAISIeFAMAISJoAwAD8uoUAwAhImgaV7C7AARnowAEZ6MABGiMAAJfVAAAAAQPAARoAwAEaIwAAAAEBAcABGgoAAACD7mCJbgAAWwE+AT0cwAEaFi6XUwEAAYDAARoawAhJCgCV6waV7S7AARoowAEaNcABGlcDAEsAAAABA8ABGjfAARpXAAAAAQEBwAEaQQAAAIPuYIluAABgwAD70AFKwAEaSgEcwAEaURbAARpKLpgSleZLAQABgMABGlLACElaAMAA/LkAAAhFoAAISOMACEk0AAhJlQAAAAMClfAuwAEaXMABGmLAAR0MA5gXAAABYMAA/RwAAAIElfIuwAEamcABGrcJJwBdwAD8pQJgiUpgwAD70AEywAEatWCJSmDAAPvQAASV8y7AARq/wAEazhiYDABgwAD70AGTAQWV+QAAAAAEAAADAAAAAAAAAAAAYJXwAT8BCQEAwAD9MgAAAAADBpX1LsABGtPAARrYwAEbsAAAl5cAAAABA8ABGt3AARuwAAAAAQEBwAEa8gAAAIS4XcAA/HQBYIlKAABcAT4BRcABGwgBwAEbEcABGxMAAGJgwAD70AGTARzAARsagcABGxjACEp3YwEAARbAARsrgMABGxzACEpZYcAA/KMAwAD8/QGJwAEbNcAISnccwAEbM4HAARs1wAhKd2QBAAGUAMAA/PU+A07AARtOwAEbWAAAgO1giUoBHMABG2iAwAEbWsAISllLAQABgcABG2nACEp3AMAA/IM9HMABG3gWwAEbcy4nlfKAvwIAAoLAARt5wAhK2RbAARuGLpgMlfMAwAD8uj0XwAEbmy6YDBzAARuZFsABG5sumAyV82QBAAGUAMAA/PWV8waV9i7AARu1wAEbusABHHQAAAYAAAAB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hMABLZXAAS23AACCiAFqwAEthWDAAP0cAgAAAQPAAS2awAEttwAAAAAAAABcAT4AAAAIYBUACGCBAAhguAAAAAICli8uwAEtvMABLcLAATa6A5gtAAABYMAA/RwAAAABBZYzAAAAAAQAAAMAAAAAAAAAAABgli8BPwEJAQDAAP0yAAAAAAEGljEuwAEv1sABL+HAATa4AAGYLgAAAAEDwAEv6sABNrgAAAAFAwXAAS/1AAAAgkVdwAD8dAFgwAD70ADAATABAAAAJ2DAAPvQAMABMA8AAACDRGDAAP22AMABMCIAAABqYMAA+9ABasABMCpgwAD70AnAATAxAAAAgoxgwAD70AFqAGDAAPzZdwBgwAD70AE+Bz0ewAEwSMAA+xAEAASBwAEwWMAIYUqAwAEwX8AIYTUrFsABMHSAwAEwbcAIYTVhwAD8owA9jMABMIHACGGAHsABMJLAAPsRAwADg8ABMKLACGFnhMABMKnACGGAFsABMLWCwAEwrsAIYVhhwAD9ugBJwAEwwhzAATDMg8ABMMbACGFnSAEAAYTAATDPwAhhgADAAPzzSsABMNQBgcABMNvACGFKP07AATDqwAEw7AAAYmDAAPvQAYPAATDuwAhhZ07AATD9wAExBAAAYWDAAPvQARbAATENgMABMQbACGE1YcAA/KNEwAExGT4DTsABMSjAATExAACYL2DAAPvQARzAATE6gsABMTPACGFYhAsBAAE1AAAAAQBgwAD70AGFwAExRcAIYkY1AAAAAQBgwAD70AGNwAExRcAIYkYcwAExRocAwAhis2QBAAGUAMAA/PWHAMAIYrMAwAD9xEPAATFRHMABMWGHwAExWMAIYo1jAQABN4CAAMAA/P0+BEnAATFyHMABMXyBwAExdsAIYUqBbQEAAYbAATF/wAhiYQDAAP0ASsABMYcBHMABMY6UgcQAAAAAwAD78z89HMABMaCAwAExmsAIYTWAvwIAAjUAAAABAGDAAPvQAYHAATGhwAhhSjUAAAABAGDAAPvQAYnAATGhwAhhShzAATGmFADACGNvCABkAQABlADAAPz1FADACGNvCACHwAExrMAIYo0AwAD8hEnAATG+HMABMcSFwAExwsAIYkaBbQEAAYTAATHHwAhhgADAAP0ASsABMcwBgcABMdPACGFKPz2PwAEx4sAIYo0cwAEx9ILAATHtwAhhWIQLAQABNQAAAAEAYMAA+9ABhcABMf/ACGJGNQAAAAEAYMAA+9ABjcABMf/ACGJGHMABMgAUAMAIZBkIAGQBAAGUAMAA/PUUAMAIZBkIAADAAP3EScABMhMcwAEyIIfAATIXwAhijWMBAAE3iAAAwAD8/T4EPYnAATIzwAhhShzAATI5gcABMjPACGFKZAEAAZUAwAD89UnAATJHHMABMlGBwAEyS8AIYUqAlwEAAYbAATJTwAhiYQDAAPz/SsABMlsBHMABMmKUgcQAAAAAwAD78z89HMABMnSAwAEybsAIYTWAvwIAAhzAATJ7gcABMnXACGFKgY0BAAGVAMAA/PYcwAEyhzeAwIEGAQABHMABMpOHwAEyisAIYo2DvAEAATcGAMAA++0AwAD76QDAAPyEPRzAATKogMABMqLACGE1gL8CAAIcwAEyr4HAATKpwAhhSoGNAQABlADAAPz2HMABMrs3gICBBgEAARzAATLHh8ABMr7ACGKNg3cBAAE3PwDAAPvoAMAA++kAwAD8hEnAATLdIRzAATLzHMABMuqHwAEy4cAIYo2DdwEAATfAAPgAAMAA++hIAQABN8AA2AAAwAD88z4FPYnAATMkwAhhShzAATMqgcABMyTACGFKZAEAAZYAwAD89UnAATM4HMABM0KBwAEzPMAIYUqAlwEAAYbAATNEwAhiYQDAAPz/SsABM0wBHMABM1OUgcQAAAAAwAD78z89HMABM2WAwAEzX8AIYTWAvwIAAhzAATNsgcABM2bACGFKgY0BAAGWAMAA/PYcwAEzeDeA4IEGAQABHMABM4SHwAEze8AIYo2DvAEAATcMAMAA++0AwAD76QDAAPyEPRzAATOagMABM5TACGE1gL8CAAIcwAEzoYHAATObwAhhSoGNAQABlQDAAPz2HMABM603gICBBgEAARzAATPAHMABM7qHwAEzscAIYo2DvAEAATcGAMAA++2DdwEAATc/AMAA++gAwAD76QDAAPyEPRzAATPXgMABM9HACGE1gL8CAAIcwAEz3oHAATPYwAhhSoGNAQABlADAAPz2HMABM+o3gICBBgEAARzAATP2h8ABM+3ACGKNg3cBAAE3PwDAAPvoAMAA++kAwAD8hD4LScABNBYcwAE0I4fAATQawAhijYFtAQABN8AA3AAAwAD9AErAATQuARzA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wABK6AAAAAICAsAASWAAAAAiYMAA/bYAwABJdwAAAJieYJp6AABglkYBPgNOwABKJ8AASjIAAJifYMAA/bYBNQAAAAEAYMAA/bYBNQAAAAEAYJp6ATUAAAABAGCaegGBwABKNMAInGQjHMAASkGCAMAInKJIAQABKwAAKxbAAEpBggDACJyil6iahgFgmnojHMAASk2CAMAInJhIAQABKwAAKxbAAEpNggDACJyYgL2agAFgwAD9tiMcwABKUoIAwAicjEgBAAErAAAnAIIAwAicjAFgwAD9tknAAEpdHMAASmyCwABKYcAInHmB1gEAASeYoADAAP3IPgFKwABKiQEfwABKlJZNAQABgMAASqrACJxWAD9KwABKvgEfwABKyZZKAQABgMAAStzACJxWAAaWhy/AAErtwABK/cAAUhgAAJihljQAAAABA8AASxDAAFIYAAAAAQEBwABLFQAAAJiiYMAA+9AAAGCWTgE+Ek7AAEsywABLQQAAmKNgwAD70AEWwABLQy6YTJY0lmdOwABLZcAAS2wAAIF2YJZOAR/AAEtyllwAAAAAPRfAAEvELphMljQcwABL/BzAAEvoFsAAS9IumFOWNJZuZAEAAYDAAEvqwAidpQDAAPz1gY0BAAEcwABMApWDiAEAAZcAwAD89wDAAPz2lmc9F8AATBKCwABMC8AInduYRBzAAEwhLob9AAAAAJZ5llk9F8AATMeCwABMwMAInduXNx7AAEzcwAD1ywEBYMAA+9ABHMAATPoWwABM7YLAAEzmwAid25hElllkAQABlADAAPz1AJZYPRfAAE0LgsAATQTACJ3bmEUcwABNJi6G/QAAAACWeZZaScAATTghHMAATVwWwABNQ4LAAE08wAid25hFllpIAQABgMAATV/ACJ2lAMAA/PM+AT0wwABNeiQAByeYpCeYpYDAAE3uwAidpSeYpieYpxbAAE5lgsAATl7ACJ3bmEWWWieBaj89F8AATrQumEyWNBzAAE7AFsAATrQumEyWNJZngY0BAAEcwABPDRzAAE7mHMAATuEWwABO1ILAAE7NwAid25hElllkAQABlADAAPz1ZAEAAWrAAE74YMAA+9CD7wDAAPz1g4gBAAGXAMAA/PcAwAD89pZnPRfAAE9DgsAATzzACJ3bmD0cwABPdhbAAE9gLphTljSWbmQBAAEcwABP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wAD70AEcwACuoS6YwwAAAACW207AAK67wACuxQAAhF5ggnsBHMAArscumLQAAAAAlqROwACu6sAArvQAAFtghXMBHMAArvYumOAAAAAAltRKwACvDwE1wACvGgAAAQBghE4BH8AArxqEXAIAAoPAAK83wAj0RITAAK9CwAj0YwA1AAAAAQBbARfAAK9ZhcAAr1fACPSHhIeBwACvZ8AI8wCEMzUAAAABAFsBF8AAr3+FwACvfcAI9IeEU4LAAK+MwAj0I4JZhQDACPSHAcAAr6NqwACvo2DAAPvQg/IAPgJOwACvx8AAr84AAINcYMAA+9ABHMAAr9AumMMAAAAAlttKwACv5gE1wACv8QAAAQBghF0BH8AAr/GEawIAAhzAALAhLpi0AAAAAJakHMAAsDgumOAAAAAAltQANQAAAAEAWwEXwACwVYPAALBTwAj1OIRTgsAAsGLACPURglmDAMAI9TgBwACweWrAALB5YMAA+9DAAI0kAD4BSsAAsJMBH8AAsJ6EdAEAARzAALCvLpjhAAAAAJbZAAHAALDhasAAsOFgwAD70MAAjFsAPgFKwACw/AEfwACxB4R9AQABJsAAsRkBHMAAsRkumOIAAAAAlsRgh40AAAE+AT0wwACxQhzAALFILoHCAQABJMAAsW8CJ5jjgMAAsWvACPLfAJZ2Bpa2L8AAsX/AALGMwACyZQAAmNsAAAABA8AAsaLAALJlAAAAAgICwACxqAAAAJjkYMAA+goAwACxugAAAJjlYMAA+9AAAGCEfgE+AUrAALHQASMcwACx1y6YcAAAAACWlhzAALH5LocDAgAAApjkgMAAsiXACPZYmOWBwACyQ8AI9meWtysBYIR+Bpa3L8AAsmrAALJ3wAC5cwAAhwMAAAABA8AAsofAALlzAAAAAgAAAsAAspUAAACY5GDAAPoKAWrAALKjYMAA+goAwACyrgAAAJjlYMAA+9ABasAAsr5gwAD70IGcYIR+AT4YTsAAss3AALLRAACD52DAAPvQARzAALLTLob6AAAAAJZ3QBzAALLugsAAsurACPcfSAEAAWrAALL1YMAA+9BSAMAA/PPAALLqwACzAQBOwACzDMAAsxMAAINcYMAA+9ABHMAAsxUumMMAAAAAlttOwACzK8AAszUAAJi3YMAA+9ABHMAAszcumMMAAAAAlttOwACzVcAA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HMAAzyMumLQAAAAAlqQcwADPOi6YZgAAAACWvgA1AAAAAQBbARfAAM9Yg8AAz1bACQy2hFOCwADPZcAJDI+CWYMAwAkMtgHAAM98asAAz3xgwAD70MAAYo8APgJOwADPmsAAz6EAAINcYMAA+9ABHMAAz6MumMMAAAAAlttKwADPuQE1wADPxAAAAQBghZMBH8AAz8SFpQQABBzAAM/hLphmAAAAAJa+HMAAz/MuhwEAAAAAlqccwADQCy6Y4AAAAACW1BzAANAcLpi0AQAAAZerKZakADUAAAABAFsBF8AA0E6DwADQTMAJDVCEU4LAANBbwAkNKYJZgwDACQ1QAcAA0HJqwADQcmDAAPvQsb4APgNOwADQlcAA0JwAAINcYMAA+9ABHMAA0J4umMMAAAAAlts9HMAA0LQumNMBAAFqwADQ12DAAPvQFQCWsErAANDsATXAAND3AAABAGCFpgEfwADQ94W3AwADHMAA0SYuhwEAAAAAlqccwADRMi6Y4AAAAACW1BzAANFDLpi0AQAAAZerKZakADUAAAABAFsBF8AA0XWDwADRc8AJDiGEU4LAANGCwAkN4IJZgwDACQ4hAcAA0ZlqwADRmWDAAPvQwAB8egA+Ak7AANG9wADRxAAAg1xgwAD70AEcwADRxi6YwwAAAACW20rAANHcATXAANHnAAABAGCFHAEfwADR54UuAwADHMAA0hcumGYAAAAAlr4cwADSKS6YtAAAAACWpBzAANJALpjgAAAAAJbUADUAAAABAFsBF8AA0l2DwADSW8AJDsyEU4LAANJqwAkOpYJZgwDACQ7MAcAA0oFqwADSgWDAAPvQwABgrgA+Ak7AANKfwADSpgAAg1xgwAD70AEcwADSqC6YwwAAAACW20rAANK+ATXAANLJAAABAGCFuAEfwADSyYXKAwACHMAA0vMumLQAAAAAlqQcwADTCi6Y4AAAAACW1AGEHSo1AAAAAQBbARfAANNDg8AA00HACQ90hFOCwADTUMAJD02CWYMAwAkPdAHAANNnasAA02dgwAD70MAAfVAAPgJOwADTisAA05EAAINcYMAA+9ABHMAA05MumMMAAAAAlttKwADTqQE1wADTtAAAAQBghbgBH8AA07SFygMAAhzAANPeLpi0AAAAAJakHMAA0/UumOAAAAAAltQBhB0pNQAAAAEAWwEXwADULYPAANQrwAkQEYRTgsAA1DrACQ/qglmDAMAJEBEBwADUUWrAANRRYMAA+9DAAGAdAD4CTsAA1HTAANR7AACDXGDAAPvQARzAANR9LpjDAAAAAJbbSsAA1JMBNcAA1J4AAAEAYIXLAR/AANSehd4DAAIcwADUzS6YtAAAAACWpBzAANTkLpjgAAAAAJbUAYQdKjUAAAABAFsBF8AA1R2DwADVG8AJEK6EU4LAANUqwAkQh4JZgwDACRCuAcAA1UFqwADVQWDAAPvQgysAPgJOwADVacAA1XAAAINcYMAA+9ABHMAA1XIumMMAAAAAlttKwADViAE1wADVkwAAAQBghcsBH8AA1ZOF3gMAAhzAANXCLpi0AAAAAJakHMAA1dkumOAAAAAAltQBhB0pNQAAAAEAWwEXwADWEYPAANYPwAkRSYRTgsAA1h7ACREiglmDAMAJEUkBwADWNWrAANY1YMAA+9DAAF3rAD4BSsAA1kIBH8AA1k2F9QEAARzAANZRLphmAAAAAJa+AAHAANZzasAA1nNgwAD70IPsAD4BSsAA1o4BH8AA1pmGAgMAAxzAANarLphmAAAAAJa+HMAA1skumO4BAAEcwADW4S6G+gAAAACWdwCWuxzAANbuLphmAAAAAJa+AAHAANcQasAA1xBgwAD70MAAXY0APgFKwADXLwEfwADXOoYQBAAEHMAA11AumGYAAAAAlr4cwADXYi6YZgAAAACWvhzAANeALphmAAAAAJa+HMAA15IumPEAAAAAltAAAcAA17hqwADXuGDAAPvQrf8APgJOwADX2cAA1+AAAINcYMAA+9ABHMAA1+IumMMAAAAAlttKwADX+AE1wADYAwAAAQBghhEBH8AA2AOGGwEAARzAANgXLpjEAAAAAJa8ADUAAAABAFsBF8AA2DmDwADYN8AJEtWEU4LAANhGwAkSroJZgwDACRLVAcAA2F1qwADYXWDAAPvQwACRPQA+A07AANh8wADYgwAAg1xgwAD70AEcwADYhS6YwwAAAACW207AANifwADYrAAAhb1giLMBHMAA2K4uhwIAAAAAltFKwADYxgE1wADY0QAAAQBghhwBH8AA2NGGJwIAARzAANjjLpjEAAAAAJa8AYW9g8AA2RPACRNbNQAAAAEAWwEXwADZLYTAANkrwAkTgIRTgsAA2TrACRM6glmEAMAJE4ABwADZUWrAANlRYMAA+9DAAJFAAD4DTsAA2W/AANl2AACDXGDAAPvQARzAANl4LpjDAAAAAJbbTsAA2ZLAANmfAACFvWCIswEcwADZoS6HAgAAAACW0UrAANm5ATXAANnEAAABAGCGKAEfwADZxIYzAgABHMAA2dUumMQAAAAAlrwBhb2DwADaBcAJFBE1AAAAAQBbARfAANofhMAA2h3ACRQ2hFOCwADaLMAJE/CCWYQAwAkUNgHAANpDasAA2kNgwAD70MAAkUMAPgROwADaYcAA2mgAAINcYMAA+9ABHMAA2moumMMAAAAAlttOwADahMAA2owAAIXGYIizARzAANqOLocCAAAAAJbRTsAA2qrAANq0AACFx2CIswEcwADati6HAgAAAACW0UrAANrOATXAANrZAAABAGCGNAEfwADa2YZAAwABHMAA2uoumMQAAAAAlrwChcaDwADbFcAJFMeFx4TAANspwAkU5jUAAAABAFsBF8AA20CFwADbPsAJFQuEU4LAANtNwAkUpoJZhQDACRULAcAA22RqwADbZGDAAPvQwACRRgA+C07AANuCwADbiQAAg1xgwAD70AEcwADbiy6YwwAAAACW207AANurwADbugAAhcxggnsBHMAA27wumGkAAAAAlqNOwADb6cAA2/cAAIUXXcAA/HQBYIizARzAANv5LpjdAAAAAJbNTsAA3BnAANwpAACYamDAAPvQARzAANwrLob8AAAAAJZ4TsAA3FrAANxmAACFzV3AAPylAmCCe2CEqQEywADcf2CCe2CEqQBFwADciwHAANyUwADclgAAYmDAAPvQAZMBHMAA3J2HwADcm8AJFjdjAQABhcAA3J/ACRXrAMAA/P0Bj8AA3LDACRY3HMAA3LGHwADcsMAJFjdkAQABlADAAPz1PgNOwADc0cAA3NoAAYXRYIJ7ARzAAN0HHMAA3Oouhv8AAAAAlp+YawAAAACal07AAN0ywADdOAABgJZghKkBHMAA3ToumGYAAAAAlr49HMAA3WGGwADdVsAJFgyAvwIAAhTAAN1iwAkWjwgAFMAA3W7ACRa7CQAAwAD8uk7AAN2LwADdlwAAmPJgwAD70AEcwADdmS6G/AAAAACWeE7AAN3DwADdywAAhc5dwAD8dAFgh40BHsAA3dHAAPXLAQFgh40Bh8AA3efACRcJ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SmDAAPvQwACD9AA+AUrAARJeAWrAARJrYIjihIgBwAESiGrAARKIYMAA+9DAAJEBAD4BSsABEp0BasABEqpgiL7AAJIhAcABEshqwAESyGDAAPvQwACRBAA+AUrAARLdAWrAARLqYIjKhHkBwAETCGrAARMIYMAA+9CEAwA+AUrAARMaAWrAARMnYIjWwACSMgHAARNCasABE0JgwAD70MAAkQcAPgFKwAETWQEfwAETZIj/AgACHMABE4sumGkAAAAAlqMcwAEToS6Y3QAAAACWzQABwAETxWrAARPFYMAA+9DAAJEQAD4BSsABE+IBH8ABE+2I/wIAAhzAARQULphpAAAAAJajasABFCpdwAD8dAFgiLOFjQABwAEUTmrAARROYMAA+9DAAJEKAD4LTsABFGjAARSBAACY3mDAAPvQARbAARSWFsABFIMumEqWY2HAAPyjTsABFKrAARS5AACEuF3AAPx0AWCJSgEcwAEUuy6YywAAAACW0k7AARTnwAEU/gAAhRlgwAD70AEcwAEVAC6G/AAAAACWeE7AARUYwAEVLAAAmQRgwAD70AEcwAEVLi6G/AAAAACWeE7AARVGwAEVUQAAhY1dwAD8dAFgiLMBHMABFVMumN0AAAAAls1OwAEVc8ABFXkAAIVXXcAA/HQBYIksARzAARV7LpkCAAAAAJbOTsABFZzAARWoAACGeGCIswEcwAEVqi6Y8QAAAACW0EAcwAEV8BzAARXhFsABFdqFwAEVz8AJRsphwAD8o2QBAAEWwAEV6YbAARXjwAlG72HAAPyjAMAA/PVIAQABhMABFfPACUapAMAA/PPAARXPwAEWBgBOwAEWFcABFiAAAIU0YIizARzAARYiLocCAAAAAJbRPRfAARZNFsABFjoumEqWY2GBwAEWVsAJRjzAAPyhSsABFngBH8ABFoOJGQYAAoXAARaQwAlGyhTAARacwAlHiAgABIS4gsABFsTACUZjhRmDwAEW+MAJRoiEu4bAARctwAlG74Z4JsABF00Bh8ABF03ACUcUYIkaAcABF2pqwAEXamDAAPvQwACREwA+A07AAReKwAEXlQAAhY1dwAD8dAFgiLMBHMABF5cumN0AAAAAls1OwAEXt8ABF8IAAIU0YIizARzAARfELocCAAAAAJbRSsABF9wBH8ABF+eJGQIAAoHAARf0wAlI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MpUumEyWNJZnTsABMqzAATKzAAGBdmCCiwEdwAEyu5isAgACgMABMsfACWDzgcABMtLACWEAAJaoSsABMuIBJsABMuIBHMABMukumF6WNAIAAoPAATL8wAlhNoLAATMEwAlhFwCW6GCCiwaW7S/AATMYwAEzLMABM70AAJi+AWrAATMZYMAA/RwCAAABA8ABMzfAATO9AAAAAAAAAGCC7wE+A07AATNGwAEzUQABl49gwAD70AEWwAEzUy6YTJY0lmdOwAEzasABM3EAAYF2YILvAR3AATN5mL4AAAAAlq1KwAEzjAEmwAEzjAEcwAEzky6YXpY0AgACgcABM6bACWHvgMABM67ACWHQAJboYILvBpbuL8ABM8LAATPUwAE0dwAAmL8BasABM8NgwAD9HAIAAAEDwAEz3cABNHcAAAABAQHAATPiAAAAmLdgwAD70AAAYIMUAT4DTsABM/nAATQEAAGXj2DAAPvQARbAATQGLphMljSWZ07AATQdwAE0JAABgXZggxQBHcABNCyYvwEAAYDAATQ2wAlibwCWrkrAATRGASbAATRGARzAATRNLpheljQCAAKCwAE0YMAJYqWBwAE0aMAJYoYAluhggxQGlu8vwAE0fMABNI7AATUbAACYwAFqwAE0fWDAAP0cAgAAAQPAATSXwAE1GwAAAAAAAABgg3cBPgNOwAE0psABNLEAAZePYMAA+9ABFsABNLMumEyWNJZnTsABNMrAATTRAAGBdmCDdwEdwAE02ZjAAAAAAJaxSsABNOoBJsABNOoBHMABNPEumF6WNAIAAoHAATUEwAljVYDAATUMwAljNgCW6GCDdwaW8C/AATUgwAE1OMABNdEAAJjQAWrAATUhYMAA/RwCAAABA8ABNUfAATXRAAAAAAAAAGCDpAE+A07AATVWwAE1YQABl49gwAD70AEWwAE1Yy6YTJY0lmdOwAE1esABNYEAAYF2YIOkAR3AATWJmNAAAAAAlrJKwAE1oAEmwAE1oAEcwAE1py6YXpY0AgACgcABNbrACWP8gMABNcLACWPdAJboYIOkBpbxL8ABNdbAATXswAE2lwAAmMEBasABNddgwAD9HAIAAAEDwAE1+cABNpcAAAABAQHAATX+AAAAmLdgwAD70AAAYIPlAT4DTsABNhXAATYgAAGXj2DAAPvQARbAATYiLphMljSWZ07AATY5wAE2QAABgXZgg+UBHcABNkiYwQEAAYDAATZWwAlkfACWs0rAATZmASbAATZmARzAATZtLpheljQCAAKCwAE2gMAJZLKBwAE2iMAJZJMAluhgg+UGlvIvwAE2nMABNsbAATeDAACY0QFqwAE2nWDAAP0cAgAAAQPAATbnwAE3gwAAAAAAAABgg8MBPgNOwAE29sABNwEAAZePYMAA+9ABFsABNwMumEyWNJZnTsABNxrAATchAAGBdmCDwwEdwAE3KZjRAAAAAJa0SsABN1IBJsABN1IBHMABN1kumF6WNAIAAoHAATdswAllYoDAATd0wAllQwCW6GCDwwaW8y/AATeIwAE3oMABODkAAJjXAWrAATeJYMAA/RwCAAABA8ABN6/AATg5AAAAAAAAAGCEMQE+A07AATe+wAE3yQABl49gwAD70AEWwAE3yy6YTJY0lmdOwAE34sABN+kAAYF2YIQxAR3AATfxmNcAAAAAlrVKwAE4CAEmwAE4CAEcwAE4Dy6YXpY0AgACgcABOCLACWYJgMABOCrACWXqAJboYIQxBpb0L8ABOD7AAThXwAE5bgAAhwMBasABOD9gwAD9HAIAAAEDwAE4Z8ABOW4AAAACAAACwAE4dQAAAJjkYMAA+goBasABOINgwAD6CgDAATiOAAAAmOVgwAD70AFqwAE4nmDAAPvQgZxghH4BPgNOwAE4r8ABOLoAAZePYMAA+9ABFsABOLwumEyWNJZnTsABONPAATjaAAGBdmCEfgEdwAE44ocDAgAAApjkgMABOQrACWaKmOWBwAE5KMAJZqSWt0rAATk9ASbAATk9ARzAATlELpheljQCAAKDwAE5V8AJZuWCwAE5X8AJZsYAluhghH4GlvUvwAE5c8ABOYrAATohAACYZgFqwAE5dGDAAP0cAgAAAQPAATmYwAE6IQAAAAAAAABghKkBPgNOwAE5p8ABObIAAZePYMAA+9ABFsABObQumEyWNJZnTsABOcvAATnSAAGBdmCEqQEdwAE52phmAAAAAJa+SsABOfABJsABOfABHMABOfcumF6WNAIAAoHAAToKwAlnooDAAToSwAlngwCW6GCEqQaW9i/AATomwAE6PMABOtEAAJjgAWrAATonYMAA/RwCAAABA8ABOknAATrRAAAAAAAAAGCFcwE+A07AATpYwAE6YwABl49gwAD70AEWwAE6ZS6YTJY0lmdOwAE6fMABOoMAAYF2YIVzAR3AATqLmOAAAAAAltRKwAE6oAEmwAE6oAEcwAE6py6YXpY0AgACgcABOrrACWhJgMABOsLACWgqAJboYIVzBpb3L8ABOtbAATrywAE7kwAAmQkBasABOtdgwAD9HAIAAAEDwAE7BcABO5MAAAAAAAAAYIWBAT4DTsABOxTAATsfAAGXj2DAAPvQARbAATshLphMljSWZ07AATs4wAE7PwABgXZghYEBHcABO0eZCQAAAACW1krAATtiASbAATtiARzAATtpLpheljQCAAKBwAE7fMAJaPCAwAE7hMAJaNEAluhghYEGlvgvwAE7mMABO7jAATxhAACY9AFqwAE7mWDAAP0cAgAAAQPAATvPwAE8YQAAAAAAAABgiE4BPgNOwAE73sABO+kAAZePYMAA+9ABFsABO+sumEyWNJZnTsABPALAATwJAAGBdmCITgEdwAE8EZj0AAAAAJbaSsABPDABJsABPDABHMABPDcumF6WNAIAAoHAATxKwAlpl4DAATxSwAlpeACW6GCITgaW+S/AATxmwAE8fMABPREAAJjiAWrAATxnYMAA/RwCAAABA8ABPInAAT0RAAAAAAAAAGCHXwE+A07AATyYwAE8owABl49gwAD70AEWwAE8pS6YTJY0lmdOwAE8vMABPMMAAYF2YIdfAR3AATzLmOIAAAAAlsRKwAE84AEmwAE84AEcwAE85y6YXpY0AgACgcABPPrACWo+gMABPQLACWofAJboYIdfBpb6L8ABPRbAAT0twAE9xAAAmMkBasABPRdgwAD9HAIAAAEDwAE9O8ABPcQAAAAAAAAAYILgAT4DTsABPUrAAT1VAAGXj2DAAPvQARbAAT1XLphMljSWZ07AAT1uwAE9dQABgXZgguABHcABPX2YyQAAAACWqkrAAT2TASbAAT2TARzAAT2aLpheljQCAAKBwAE9rcAJauWAwAE9tcAJasYAluhgguAGlvsvwAE9ycABPefAAT6iAACYwgFqwAE9ymDAAP0cAgAAAQPAAT38wAE+ogAAAAEBAcABPgUAAACEQ2CCiwAAYIK7AT4DTsABPhrAAT4lAAGXj2DAAPvQARbAAT4nLphMljSWZ07AAT4+wAE+RQABgXZggrsBHcABPk2YwgEAAYDAAT5jwAlrZQCWqUrAAT5xASbAAT5xARzAAT54LpheljQCAAKCwAE+i8AJa5mBwAE+k8AJa3oAluhggrsGlvwvwAE+p8ABPr/AAT9uAACYygFqwAE+qGDAAP0cAgAAAQPAAT7OwAE/bgAAAAEBAcABPtcAAACEQ2CCiwAAYILVAT4DTsABPuzAAT73AAGXj2DAAPvQARbAAT75LphMljSWZ07AAT8QwAE/FwABgXZggtUBHcABPx+YygEAAYDAAT8vwAlsIgCWrErAAT89ASbAAT89ARzAAT9ELpheljQCAAKCwAE/V8AJbFaBwAE/X8AJbDcAluhggtUGlv0vwAE/c8ABP4TAAUAHAACY/AFqwAE/dGDAAP0cAgAAAQPAAT+WwAFABwAAAAEBAcABP6IAAACYEGCH6gAAXAE+Aj0cwAE/si6YXpY0AgACgMABP8XACWzfFsABP88umEyWNJZnAJboPR3AAT/nmPwBAAGAwAE/+sAJbN8AlsUGlv4vwAFADMABQB3AAUCYAACZBgFqwAFADWDAAP0cAgAAAQPAAUAuwAFAmAAAAAEBAcABQD0AAACZEWCJSgAAXAE+Aj0cwAFASi6YXpY0AgACgMABQF3ACW1gFsABQGQumEyWNJZnAJboPR3AAUB8mQYBAAGAwAFAjsAJbWAAltMGlv8vwAFAncABQLPAAUGVAACYzwFqwAFAnmDAAP0cAgAAAQPAAUDAwAFBlQAAAAAAAABgiV8BPgNOwAFAz8ABQNoAAZePYMAA+9ABFsABQNwumEyWNJZnTsABQPvAAUEAAACCkGCI7gEmwAFA+wEdwAFBCIcCAAAAAJbRYIjuSsABQRwBJsABQRwBHMABQSMumF6WNAIAAh/AAUFDiW0CAAIWwAFBXoHAAUFZwAluCIZ0iPAWwAFBboHAAUFpwAluCIUXiPIAgMABQYbACW3pAJboYIlfBpcAL8ABQZrAAUGrwAFCNgAAhwEBasABQZtgwAD9HAIAAAEDwAFBs8ABQjYAAAAAAAAAYIh+AT4DTsABQcLAAUHNAAGXj2DAAPvQARbAAUHPLphMljSWZ07AAUHmwAFB7QABgXZgiH4BHcABQfWHAQAAAACWp0rAAUIFASbAAUIFARzAAUIMLpheljQCAAKBwAFCH8AJbt6AwAFCJ8AJbr8AluhgiH4GlwIvwAFCO8ABQk/AAUJrAQCG+QFqwAFCPGDAAP0cAgAAAQPAAUJdwAFCawAAAAAAAABgwAD70AFKwAFCYAEWwAFCYC6YTJY0lmcGlwMvwAFCcMABQorAAUKZAQCENAFqwAFCcWDAAP0cAgAAAQPAAUKQwAFCmQAAAAAAAABdwAD8dAFgwAD70AFKwAFCkwEWwAFCky6YS5Y0lmYAAAlX2wAJXD4ACV0kAAldugAJXpAACWAaAAlgwQAJYZYACWI9AAli/AAJY6MACWRKAAllCQAJZbAACWZXAAlnSQAJZ/AACWiXAAlpPgAJaeUACWqMAAlrMwAJa/AACWytAAltLgAJba8ACW6FAAlvLAAJb3cACW/IAAAAHQKXBi/AAULvwAFC9cABRAUDmCsAAAFgwAD9HAAAAgSXCC/AAUNgwAFDagmG4QBdimoBWwAElwkvwAFDxcABQ8wJhscAXcAA/KUCYMAA+9BgwAD70AABBZcLL8ABQ9HAAUPRwAFEAwAAAAPAAUPkwAFEAwAAAAICAsABQ+oAAASG4V2KagFbAMABQ/sAAASGx13AAPylAmDAAPvQYMAA+9AAAGCXBgE/AwgBlwiAAMAJcL0IAZcJgQDACXDMCQHAAUPRwAD9MgAAAAAAAAAJcRAAAAAAAAABLwAJcRsACGvWAAhtMgAIbfkACG5uAAhuywAIb/MACVcaAAlwRQAJcRkAAAAIAAlxGwAAAAAAAACXDJkSMAAABID2AADAAPVzAAEAAYX2gRkAAMAAxMMAAQEBgmCBOwAAgi4AAIFRAACmCgAAAAAACgKXGzCBcYGAgisHmRMAAQAAgnZgwAD9HAFbAWDAAP0cAAACBJcdMIGRgZoYJwBgwAD70AGTBJceMIGzgcYJgKsAXcAA/KUCXwAAYMAA/bYBMoHEXwAAYMAA/bYAAQWXJAAAAAAEAAADAAAAAAAAAAAAXZcbAV8AAAE/AQkBAMAA/TIAAAAAAgaXIDCBy4HSghMAAJkUAAAAAQOB2YITAAAAAQEBgdwAACCD0V8AAAAAYMAA/bYBSoHkARyB6BaB5C6Aq5cemRUCAAKAgfTACXIwNIH5A4H5ghIAAAAAAAAAYMAA/bYBSoH/ASSCEgIWggEugySXIheCCy4nHIIJFoILLieXHWQBAAGUAMAA/PWXHQDAAPzABpciMIIYgiOCKQECgyQAAAABA4IpgikAAAAAAAAAYMAA/bYAAAAJchMACXKiAAlyxgAAAAIClyUwgi6CNIKJA5kWAAEAAIJ2YMAA/RwBWwFdlxsBXwAAAAABBJcnMIJlgmsJgyQAYMAA/bYAAQWXKTCCb4JvgocAAAADgnqChwAAAAEBAYKAAAAEgyRgwAD9tgAAXZclAV8AAAE/AggBlyeAAMAJcycJAYJvlyQAAAAAAAAACXNUAAAAAAKXKjCCjIKShCs3mRcAAAFdmgUBYMAA/NkAAV2XGwFgiW4CBJcsMIGRgZoYJwBgwAD70AGTBJctMIGzgcYJgKsAXcAA/KUCYIluYMAA/bYBMoHEYIluYMAA/bYAAQWXMwAAAAAEAAADAAAAAAAAAAAAYJcqAT8BCQAAmgkAAAAAAgaXLzCBy4HSghMAAJkUAAAAAQOB2YITAAAAAQEBgdwAACCD0WCJbgAAYMAA/bYBSoHkARyB6BaB5C6Aq5cemRUCAAKAgfTACXP7NIH5A4H5ghIAAAAAAAAAYMAA/bYBSoH/ASSCEgIWggEugySXIheCCy4nHIIJFoILLieXHWQBAAGUAMAA/PWXHQDAAPzABpcxMIIYgiOCKQECgyQAAAABA4IpgikAAAAAAAAAYMAA/bYAAAAJc94ACXRtAAl0kQAAAAIClzQwgoyCkoQrA5kYAAABYJcqAAABBJc2MILlgusJgyQAYMAA/bYAAQWXOzCC74LvgwkAAAADgvyDCQAAAAEBAYMCAAAEgyRgwAD9tgAAYJc0AT8CCAGXNoAAwAl04wkBgu+XMwAAAAACBpc4MIMOgxWD3QAAmRQAAAABA4Mcg90AAAABAQGDJgAAIIX/YIluAABgwAD9tgE+AkmDNiEcgz8WgzsugKuXHodBAQABgINLwAl1KQDAAPy4PgE9HIOcgIOTwAl1KYROAQABLgCJcD9Kg7sBHYPImRQBAAGAg9DACXUpAJcgBpc5MIPig+KEKQAAl9UAAAABA4P6hCkAAAABAQGEBAAAAIX/YIluAABgwAD82QE+AT0chBQumRQBAAGAhBzACXWnAJc4AAAJdQwACXWKAAl1zwAAAAIClzwwhC6ENIdfA5kZAAIAAIJ2YMAA/RwBWwAAmRpgwAD9HAFbAWDAAP0cAAADBJc+MIRhhHcJmRsAXcAA/KUCXwAAYMAA/bYBMoR1XwAAYMAA/bYABJc/MISQhKYJmRwAXcAA/KUCXwEAYMAA/bYBMoSkXwEAYMAA/bYABJdAMIS8hNkJhDAAXcAA/WcBYMAA/bYBHoTMwADA4gABYMAA/bYAAAEFl0QAAAAABAAAAwAAAAAAAAAAAF2XPAJfAABfAQABPwEJAQDAAP0yAAAAAAEGl0IwhN6E5YddAACZHQAAAAEDhPGHXQAAAAMDA4T0AAAgmR5fAAAAhPwAACCZH18BAACFCQAAAJkgYQBgwAD9tgAAYMAA/bYBPgRPhR6FHgAAAZkhYQBgwAD9tgADhSiGDQAAAAAAAABgwAD9tgE+BU6FN4VEAACZImDAAP22ARyFUYKFRsAJduUgAAAAAABJhVschWkWhV8uhDCXQFYBAAGEhW3ACXckAMAA/XRKhXwBhIWDwAl3JD9OhZuFnQAAYmDAAPvQAZVDhaghHIW6FoWwLoQwl0BWAQABJIXPAoSFwMAJdySFhc3ACXdtAMAA/XQ+AT2Nhd7ACXdtHIXchYXewAl3bWQBAAGUAMAA/PVKhe8BJIYHAoSF+MAJdySFhgXACXdtSYYUIRyGHYCGGMAJds9IAQABKwDAAP0pPgNOhjWGPAAAgXZgwAD9tgEchkQWhj4umRuXPksBAAGAhkXACXbPAMAA/LlJhlIhHIZdhIZWwAl39EgBAAErAMAA/cVKhmYBhIZtwAl39D9KhnsBNQAAAAEAXcAA/KUCXwAAYMAA/bYBFoaCLpkblz41AAAAAQBfAAABgIaJwAl2zzUAAAABAGDAAP22ARyGm4OGkcAJdwAgAAAAAAA1AAAAAQBcARyGiIWGiMAJeEaAvwIAAoaGiMAJeGOHAMAJeHQAwAD8uocAwAl4dD9JhqkhHIaygYatwAl22kgBAAErAMAA/Sk+A06GyobRAACBdmDAAP22ARyG2RaG0y6ZHJc/SwEAAYGG2sAJdtoAwAD8uUmG5yEchvKEhuvACXjaSAEAASsAwAD9xUqG+wGEhwLACXjaP0qHEAE1AAAAAQBdwAD8pQJfAQBgwAD9tgEWhxcumRyXPzUAAAABAF8BAAGBhx7ACXbaNQAAAAEAYMAA/bYBHIcwg4cmwAl3ACAAAAAAADUAAAABAFwBHIcdhYcdwAl5LIC/AgAChocdwAl5SYcAwAl5WgDAAPy6hwDACXlaPz0whz4nmSMAAAl2sgAJeawAAAABApdFMI69jsOZjAOZJAAAAWDAAP0cAAAKBJdHMI7zjy8JhiUAXZcbAWCITgEfjwmXKQEBYIhOASeZJQAEl0gwj0ePbgmEiABdlxsBYINZAR+PVZcpAQFgg1kBJ5kmAASXSTCPhY+vCYSBAF2XGwFggxQBH4+TlykBAWCDFAEnmScABJdKMI/Ij/QJhtMAXZcbAWCCiwEfj9iXKQEBYIKLASeZKAAEl0swkBOQTgmEuABdlxsBYIlKAR+QLpcpAQFgiUoBJ5kpAASXTDCQaJCQCZkqAF2XGwFgglIBH5B1lykBAWCCUgEnmSsABJdNMJCqkM0JmSwAXZcbAWCJbgEfkLqXOwEAASeZLQAEl04wkP+RPQmZLgBdlzwCYIJ7YJp6AR+RFJdEAAJggntgmnoAAASXTzCTOJNbCZkvAGDAAP1GAR6TTMAA/V8BAAEnmTAABJdQMJh7mJsJmTEAYMAA/UYBHpiNwAD9XwEAASeZMgABBZdeAAAAAAQAAAMAAAAAAAAAAABgl0UBPwEJAQDAAP0yAAAAAAsGl1IwkUKRQpGDAACZMwAAAAEDkU6RgwAAAAEBAZFjAAAAg+5giE4AAFsBSpFsARyRdhaRbC6GJZdHmRQBAAGAkX7ACXttAJcgBpdTMJGHkYeRtwAAmTQAAAABA5GRkbcAAAABAQGRmQAAAIPuYINZAABbAUqRogEckaoWkaIuhIiXSJkUAQABgJGywAl7tgCXIAaXVDCRu5G7kekAAJk1AAAAAQORxJHpAAAAAQEBkcsAAACD7mCDFAAAWwFKkdQBHJHcFpHULoSBl0mZFAEAAYCR5MAJe/8AlyAGl1Uwke2R7ZIhAACZNgAAAAEDkfiSIQAAAAEBAZIBAAAAg+5ggosAAFsBSpIKARySFBaSCi6G05dKmRQBAAGAkhzACXxIAJcgBpdWMJIlkiWSagAAmTcAAAABA5I2kmoAAAABAQGSRQAAAIPuYIlKAABbAUqSTgEckl0Wkk4uhLiXS5kUAQABgJJlwAl8kQCXIAaXVzCSbpJukqUAAJk4AAAAAQOSfJKlAAAAAQEBkogAAACD7mCH6gAAWwFKkpEBHJKYFpKRLpkql0yZFAEAAYCSoMAJfNoAlyAGl1gwkqmSqZLsAACZOQAAAAEDkr2S7AAAAAEBAZLPAAAAg+5gh5oAAFsBSpLYARyS3xaS2C6ZKpdMmRQBAAGAkufACX0jAJcgBpdZMJLwkvCTJgAAmToAAAABA5L8kyYAAAABAQGTBgAAAIPuYIluAABbAUqTDwEckxkWkw8umSyXTZkUAQABgJMhwAl9bACXIAaXWjCTYJNglckAAJk7AAAAAQOTcZXJAAAAAgEBk3oAAACD7mCCiwABk4gAAACZImDAAP22AWoAYMAA/Nl3WwE+AUqTnQEck60Wk6QumS6XTpkdAwADFpO/gJO6wAl9tYRegmoWk9kWk8+Ak8rACX21hF6CaoRfgn00k/ADk/CVxAAAAAAAAABgwAD9tgE+BEmT+yEclAyBk//ACX3BSAEAASsAwAD9xUqUFQGBlBzACX3BP0mUMCEclD4WlDmAlDTACX21gL2ClEgBAAErAMAA/cVKlEcBHJROLpk8AQABFpRigJRdwAl9tYC9gpQAl1w/SZRvIRyUghaUeICUc8AJfbWEd4KNSAEAASsAwAD+Xj4DTpSZlJ4AAE5gwAD9tgEjFpSvFpSlgJSgwAl9tYR3go2ZPcAA/k4klOoBFpTSgJTNwAl9tYR3go0WlQgWlPsWlPGAlOzACX21hHeCjYMYwAD+RYHowAD8WQFgwAD9tkmVFhyVH4KVGsAJfqxPAQABJ4N8AMAA/cc+AT2KlT7ACX6sHJVKgpVFwAl+rIC+AgACkxyVYxaVXIKVV8AJfqxhwAD9uoGNAQABFpVtJ4N8YcAA/boAwAD89gDAAP3MP0qViAEclY8umTwBAAGClZ7ACX6sAJdcP0qVswEnmT4Al0IGl1swlc6VzphpAACZPwAAAAEDle6YaQAAAAMCApX5AAAAg+5ggnsAlg0AAACAvWCaegABliEAAACZImDAAP22AWoAYMAA/Nl3WwE+AUqWNgEclkYWlj0umS6XTpkdAwADgJZTwAl/qIGWWcAJf7M0ll8Dll+YZAAAAAAAAABgwAD9tgE+BEmWaiEclnuClm7ACX+/SAEAASsAwAD9xUqWhAGClovACX+/P06WrZa7AACEX2CaegE1AAAAAQBgmnoBgZa9wAl/syMclsKDAMAJgENIAQABKwAAFpbKgJbFwAl/qIRfgn2DAMAJgEMBYJp6SZbfIRyW9zUAAAABAGCaegGDluPACYA2IxyW8oQAwAmAhEgBAAErAAArFpbyhADACYCEgL2agAFgwAD9tkgBAAErAMAA/cU+BU6XDpcTAABOYMAA/bYBFpcjg5cVwAmANoC9moBOlzWXOwAAmUBgwAD70AEcl0KElz3ACYDGlloBAAEWl04umS+XTwDAAP3KSZdmHJdwhZdqwAmA4oFtAQABkwDAAP0APgE9jJeCwAmAxhyXjoSXicAJgMaAvgEAARyXnoWXmMAJgOJkAQABlADAAPz1AMAA/cw/SZe2HJe/hJe6wAmAxk8BAAEng3wAwAD9xz4BPYyX3sAJgMYcl+qEl+XACYDGgL4CAAKTHJgDFpf8hJf3wAmAxmHAAP26gY0BAAEWmA0ng3xhwAD9ugDAAPz2AMAA/cw/SpgoARyYLy6ZPAEAAYSYPsAJgMYAl1w/SphTASeZPgCXQgaXXDCYoJinmYoAAJk8AAAAAQOYtZmKAAAAAQEBmL0AAACAvWDAAP22AABgwAD9tgE+BE6YzZjRAACZQWDAAPvQARyY2ICY08AJgfaWWgEAARaY5C6ZMZdQAMAA/cpJmPYhHJj+gZj6wAmCDUgBAAEcmQGUgcQAAAAAwAD78wDAAPzzPgE9iJkNwAmB9hyZGYCZFMAJgfaAvgEAARyZJ4GZI8AJgg1kAQABlADAAPz1AMAA/cw/SZk3HJlHFplAgJk7wAmB9mHAAP26gJcBAAGXAMAA/P8+AUqZVAEcmWCAmVvACYH2gL4CAAKTlgDAAP3MP0qZewGAmYLACYH2AAAJe1AACXuZAAl74gAJfCsACXx0AAl8vQAJfQYACX1PAAl9mAAJf4sACYHZAAmC1wAAAAsCl18wmY+ZnppiB5lCAAABYMAA/RwAAAABBZdlAAAAAAQAAAMAAAAAAAAAAABgl18BPwEJAQDAAP0yAAAAAAMGl2EwmayZs5nuAAKZQwAAAAEDmcOZ7gAAAAICApnMAAAAmURgl2YAmekAAACD7mCITgAAYMAA/bYABpdiMJnymfmaKwACmUUAAAABA5oHmisAAAACAgKaEAAAAJlEYJdmAJomAAAAg+5ghH4AAGDAAP22AAaXYzCaL5o2mmAAAplGAAAAAQOaQ5pgAAAAAgICmkwAAACZRGCXZgCaWwAAAIPuYIN3AABgwAD9tgAAAAmDSwAJg4UACYO/AAmD+QAAAAMCl2YwmpOamcAA5PEDmUcAAAFdmc4BYMAA/NkAABAEl2gwmsya2gmZSABgl0UABJdpMJrvmvMJhDsAYMAA/iAABJdqMJsHmxAJmUkAYJdfAASXazCbQptKCYbVAF3AAPylAmDAAP22XYpqAWDAAP0cAASXbDCbWptlGJlKAGCmDQAEl20wm22bfBiD3QBgwAD70AGTBJduMJuEm44YhuMAYMAA+9ABkwSXbzCbl5ujGIRHAGDAAPoKAASXcDCbrJu3GIRIAGDAAPoKAASXcTCbwJvMGIRJAGDAAPoKAASXcjCb3JvlBJlLAGDAAPvQAZMEl3Mwm/Sb/ASZTABgwAD70AGUBJd0MJwLnBUEmU0AYMAA+9ABlQSXdTCcHZwqGIJOAGDAAPvQARqcJZdyBJd2MKLEotkFmU4AYMAA/bYBJ5lPBJd3MKLvoxQFmVAAYIh+AR6i/4iHAQABGqMEl3YAAQWYLjCcL5wvnUAAAAADnDadQAAAAAgBAZw8AAAEhDtgwAD+IAAHnFQAAACZSGCXRQFqAGDAAPzZd5xvAAAEhEdgwAD6CgFqAGDAAPzZd5yIAAAEhEhgwAD6CgFqnJVgwAD6CgCcpwAABIRJYMAA+goBapy1YMAA+goAnMcAAASZSmCmDQFqAGDAAPzZd5zfAAAEmUlgl18BagBgwAD82Xec9QAABIbVXcAA/KUCYMAA/bZdimoBYMAA/RwBagBgwAD82Xdgl2YBPwkIAZdpgADACYWHCAGXb4IAwAmFqAgBl3CDAMAJhb0IAZdxhADACYXTCAGXbIUAwAmF6QgBl2qGAMAJhfwIAZdrhwDACYYPCACXaDUAAAABAGCXRQGBnR7ACYWVIxydLRQAwAmGhAgASAEAASsAAB+dNJdeAAAAABQAwAmGhAgAAWCXRQkBnC+aBAAAAACAtAaXeTCdRZ1NnroAAJlRAAAAAQOdWJ66AAAAAgICnWUAAACZSmCmDQCdoAAAAIbVXcAA/KUCYMAA/bZdimoBYMAA/RwAAGCXZgE+AUqdsAEfnbuYLggAARadwy6EO5dpB5lKgJ3ewAmG5YbVgZ39wAmG8JlIFp4fLplIl2iZSRaeQi6ZSZdqhEcWnmMuhEeXb4RIFp6GLoRIl3CESRaeqS6ESZdxBpd6MJ6/nsSe9QAAmVIAAAABA57TnvUAAAABAQGe2QAAAIPuYIJLAABgwAD6CgE+AUqe5QEqBpd7MJ76nv+fGgAAmVMAAAABA58NnxoAAAABAQGfEwAAAIPuYIJLAABcAT4ABpd8MJ8enyOfPAAAmVQAAAABA58vnzwAAAABAQGfNQAAAIPuYIJLAABcAT4ABpd9MJ9Bn0ifowAAmVUAAAABA59Wn6MAAAABAQGfXwAAAIPuYIKLAABgwAD9tgE+AUqfawEmn2sBNQAAAAEAYMAA/bYBFp93gJ9ywAmIGYC9gpQjHJ98gQDACYg2SAEAASsAAByfjhaffy6ZSJdomTYBAAGAn5rACYgZAJdVgQDACYg2AVtgwAD9tgaXfjCfqJ+voKcAAJlWAAAAAQOfwqCnAAAAAQEBn8sAAACD7mCCiwAAYMAA/bYBPgNJn9ccn+CAn9vACYikSAEAASsAwAD9KUqf6QEnmVc/SaAEIiEcoBQWoAgumUqXbEgBAAErAMAA/SkAIRygQBygKxagHy6ZSpdsmVgBAAGAoDrACYikAKYPSAEAARygQ5SBxAAAAADAAPvzAMAA/PM+AUqgTwEmoE8BHKBlFqBWLplIl2iZOwEAAYCgd8AJiKQAl1pgwAD9tj9KoIgBHKCPLplVAQABgKCewAmIpACXfQaXfzCgrKCzoQgAAJlZAAAAAQOgv6EIAAAAAQEBoMYAAACD7mCDFAAAYMAA/bYBPgFKoNIBJqDSATUAAAABAGDAAP22ARag3oCg2cAJiYWAvYMaIxyg44EAwAmJokgBAAErAAAcoPUWoOYumUiXaJk1AQABgKD/wAmJhQCXVIEAwAmJogFbYMAA/bYGl4AwoQ2hFKHmAACHNgAAAAEDoSWh5gAAAAEBAaEsAAAAg+5ggxQAAGDAAP22AT4ESaE4HKFBgKE8wAmKEEgBAAErAMAA/SlKoUoBJ5laP06haqFvAACAvWDAAP22ARyhcS6ZWQEAAYChfsAJihAAl39OoZChmAAAhENgwAD9tgEcoZoumVYBAAEWobOAoa7ACYoQhKWDPgCXfkqhygEkoeIDgqHTwAmKZieGWoGh3cAJikQGl4Ewoeuh8qKrAACZWwAAAAEDogWiqwAAAAEBAaIOAAAAg+5ggu8AAGDAAP22AT4DSaIaHKIjgKIewAmKxEgBAAErAMAA/SlKoiwBJ5lcP06iTqJWAACEQ2DAAP22ARyiWC6ZVgEAARaicYCibMAJisSEpYL6AJd+SqKIASSipwOBopHACYr4J4ZaFqKhgKKcwAmKxIC9gvMGl4IwoxmjHqPRAACZXQAAAAEDoyuj0QAAAAEBAaMzAAAAg+5gg1kAAGCIfgE+A0mjPxyjUzUAAAABAGCIfgEWo0iAo0PACYtdgL2DXSMco06BAMAJi3ZIAQABKwAAKxajToEAwAmLdoC9iIEBYMAA/bZIAQABJwAAwAD9xUqjWgEao2GXdz9Jo3AhHKN+FqN5gKN0wAmLXYC9g11IAQABKwCIikqjhwEWo5OAo47ACYtdgL2DXT9Ko50BHqOoiIcBAAEmo7wBHKO8FqOtLplIl2iZNAEAAYCjx8AJi10Al1NgwAD9tgAGl4Mwo9aj3aVKAACHNQAAAAEDo++lSgAAAAEBAaP3AAAAg+5gg1kAAGDAAP22AT4DSaQDHKQMgKQHwAmMREgBAAErAMAA/SlKpBUBJ5leP06kNqQ7AACAvWDAAP22ARakURykPS6ZXQEAAYCkS8AJjEQAl4KAvYiBSaRbJaRrFqRkgKRfwAmMRIRSglhggxQ+Ak6khKSOAACGdGDAAP22ARykkC6HNgEAASakpwEWpKeApKLACYxEhFKCWGCDFACXgEqktgEkpNADgqS/wAmMuieGWoGky8AJjHg+Ak6k7KT0AACEQ2DAAP22ARyk9i6ZVgEAARalD4ClCsAJjESEpYNiAJd+SqUoASSlQAOCpTHACY0FJ4ZagaU7wAmMeAaXhDClT6VWpb8AAJlfAAAAAQOlZaW/AAAAAQEBpXoAAACD7mCITgAAYMAA/bYBPgFKpYYBJqWGATUAAAABAGDAAP22ARalkoCljcAJjWOAvYhSIxyll4EAwAmNgEgBAAErAAAcpakWpZoumUiXaJkzAQABgKW2wAmNYwCXUoEAwAmNgAFbYMAA/bYGl4UwpcSly6ZZAACZYAAAAAEDpd+mWQAAAAEBAaX0AAAAg+5giE4AAGDAAP22AT4CSaYAHKYJgKYEwAmN7kgBAAErAMAA/SlKphIBJ5lhP0qmOQEcpkAumV8BAAGAplDACY3uAJeEBpeGMKZepmWm0gAAmWIAAAABA6Z5ptIAAAABAQGmiAAAAIPuYIlKAABgwAD9tgE+AUqmlAEmppQBNQAAAAEAYMAA/bYBFqaggKabwAmOVYC9iU4jHKalgQDACY5ySAEAASsAABymtxamqC6ZSJdomTcBAAGApsnACY5VAJdWgQDACY5yAVtgwAD9tgaXhzCm16beqN4AAJljAAAAAQOm96jeAAAAAQEBpwYAAACD7mCJSgAAYMAA/bYBPgNJpxIcpxuApxbACY7gSAEAASsAwAD9KUqnJAEnmWQ/TqdMp1EAAIC9YMAA/bYBHKdTLpliAQABgKdowAmO4ACXhkmncyIlp4MWp3yAp3fACY7ghFKCWGCEfgAlp6kWp6IWp5uAp5bACY7ghFKCWIRSglhgg1k+Ak6nw6fKAACCZmDAAP22ARynzC6HNQEAASan6wEWp+sWp+SAp9/ACY7ghFKCWIRSglhgg1kAl4NKp/oBJKgRA4KoA8AJj2wnhlqBqAzACY8USageJaguFqgngKgiwAmO4IRSglhggxQ+Ak6oR6hRAACGdGDAAP22ARyoUy6HNgEAASaoagEWqGqAqGXACY7ghFKCWGCDFACXgEqoeQEkqJMDgqiCwAmP1SeGWoGojsAJjxQ+AUqoqAGBqK/ACY8UBpeIMKjjqOipZAAAmWUAAAABA6j+qWQAAAABAQGpCQAAAIJVYIpIAABcAT4BPRypGi6ZZgIAAieZZxapUYCpR8AJkEeEfYpLAJeJBpeJMKlpqW6sPQAAmWYAAAABA6mBrD0AAAACAgKpiQAAAJloYMAA/bYAqZ4AAACEfV3AAPx0AWDAAP22AABcAT4BSam0HKnQNQAAAAEAXcAA/HQBYMAA/bYBgam4wAmQnyMcqciCAMAJkL5IAQABKwAAKxapyIIAwAmQvoFVwAD8VgFgwAD6CkgBAAEqAMAA/Sk+Bj0cqeIumWkBAAEnmWoAl6Q9HKn3LoKKAQABJ5lrAJeRPRyqCy6CigEAAYCqEcAJkJIAl5E9HKogLplpAQABJ4LmAJekPRyqNC6ZaQEAASeZagCXpEaqSapqqlUAAACIQWDAAP22AIGqWsAJkJ8+BU6qiKqQAACIu13AAPylAmDAAP22YMAA/RwBJqqIARyql2qqkmDAAMejiFiHCgEAAYKqnsAJkWIAwADHqV3AAPylAmDAAP22YMAA/RxOqreqygAAh6tdwAD8dAFgwAD9HAEmqrcBHKrTg6rMwAmReUsBAAEnh6sAwAD8uV3AAPx0AWDAAP0cTqsAqwYAAJbmXcAA/HQBYMAA/bYBHKsmHKsbhKsIwAmRxVgBAAEngK8AwAD8RoCmAQABJ4CvAMAA/dlFqzsBq0SrRgAAYmDAAPvQAZMBHKtNhqtLwAmSPWMBAAEWq1WFq0/ACZH/YcAA/KMAwAD8/QGOq13ACZI9HKtehqtdwAmSPWQBAAGUAMAA/PU+BD0cq24ugooBAAEnmWoAl5FOq4yrlAAAmWxgwAD9tgEcq58cq5uFq5bACZH/SwEAAYarnMAJkj0AwAD8g5ltAAAAAMAA/c9Jq7YWq8KHq7rACZKdg7LAAP29PRyrzi6CigEAASeA2QCXkT89HKvkLplpAQABh6vswAmSnQCXpEmsCBasEoWsDMAJkf+DssAA/Fc9HKweLplpAQABJ5lqAJekPz8Gl4owrEKsR64EAACERAAAAAEDrFeuBAAAAAEBAaxgAAAAhENggosAAFwBPgc9HKxvLpevAQABFqyLgKyDwAmTTIRjgpYAl7g9HKydLpluAQABJ4RDAJeXSay3IRysyBasw4Csu8AJk0yAvYKUSAEAASsAwAD9xT4BPRys2S6ZbgEAARas64Cs48AJk0yAvYKUAJeXPz0crPwumWkBAAEnlp4Al6ROrSKtKgAAmW9gphoBHq0wpiEBAAGArUPACZNMAE6tWa1fAACZcGCXZgEcrWEumVECAAKBrW3ACZPVNQAAAAEAYIpIARatfoCtdsAJk0yEWoJkIxytkoIAwAmUD0gBAAErAAArFq2SggDACZQPhtWKTgFdwAD8pQJgwAD9tl2KagFbAJd5PRytp4KtocAJk/KZcQMAAYCtw8AJk0wCmXIumXOBrfjACZPVl4wGl4swrgmuDq/wAACZdAAAAAEDriWv8AAAAAEBAa45AAAAmW9gphoAAFwBPgFGrkiud65RAAAAhENggosAFq5kgK5cwAmUnJl1piQ+Ak6ug66OAACZdmDAAP22ARyumICukMAJlJyZdwEAAYGupsAJlLEApihJrrYcrsWCrrrACZTNSAEAAScAAMAA/cU+Ak6u2q7hAACDJFsBHK7+Fq7vLplIl2iZOwIAAYGvEMAJlLEBmSInmXiXWj0crzgumWkBAAEkr1kDJ5l5g69RwAmVDyeWngCXpD4CTq93r34AAIMkWwEcr48Wr4AumUiXaJk7AQABga+hwAmUsQCXWj0cr7MumWkBAAEkr90FJ5l6gq/FwAmUzSeZe4Ov1cAJlVknlp4Al6QGl4wwr/Wv+rK7AACZcQAAAAEDsBWyuwAAAAMBAbAeAAAAhENggosAArA2AAAAmXJgl2YBagBgwAD82XewVwAAAJlzYKYaAWoAYMAA/Nl3XAE+DD0jHLB7gbBuwAmVzkgBAAErAMAA/SmJsG7ACZXOLisBYJdmPRywloGwicAJlc6ZZgIAAieZfBaw0oCwysAJlcKEfYKVAJeJSbDoIRyw+4Kw7MAJleFIAQABKwDAAP0pPgE9HLEZgbEMwAmVzpl0AQABgrExwAmV4QCXiz89HLFNLpexAQABFrFsgLFkwAmVwoR+gpgAl409HLGELplpAAAAAJekPRyxqBaxm4Cxk8AJlcKAz4KXg/gBAAEWsbAuhvOXmgDAAPxCSbHAFrHZFrHMgLHEwAmVwoDPgpeDssAA/Fc9HLHlLplpAAAAAJekPz0csgIWsfyAsfTACZXChH+CmYP4AQABFrIKLobzl5oAwAD8Qj0csisWsiKAshrACZXChICCmoP4AQABFrIzLobzl5oAwAD8Qj0cslMWskuAskPACZXChIGCm4P4AQABFrJbLobzl5oAwAD8Qj0csnoWsnOAsmvACZXChIOCnYP4AQABFrKCLobzl5oAwAD8Qj0csqUWspqAspLACZXChIKCnIP4AQABFrKtLobzl5oAwAD8QgaXjTCywLLFuCkAAJexAAAAAQOy27gpAAAAAQEBsuwAAACEfl3AAPx0AWCCewAAXAE+BUmzBRazG4CzCcAJl7mBVcAA/FZKsyQAPz0cszAugooBAAEnmX0Al5FOs1mzYQAAmX5gwAD6CgEpRrNts5yzfAAAAIReYIJ7AICzicAJl7k+BEmzpIGzqMAJl/g+AT2Js7vACZf4Kj4BPRyz4y6CigEAASeBiwCXkU60ArQHAACD7mCCaAEWtBOCtAnACZgMg+6Cfkm0HyW0KIO0I8AJmEhggxQ+A060RLRQAACZf2CCiwEWtFcUtFLACZhIAwFggxSEpYM+TrR4tH8AAIMkYMAA/bYBJrR4ARy0kBa0gS6ZSJdomTsBAAGEtKLACZh1AJdaYMAA/bY9HLS4LoKKAQABHLTMHLTFhbS+wAmYlWQBAAEnhloAwAD9y2QBAAEWtNMUtM7ACZhIAwFggxSAvYMaAMAA/csAl5FJtOcltPCDtOvACZhIYIN3PgNOtQy1GAAAmX9ggosBFrUfFLUawAmYSAMBYIN3hKWDYk61QLVHAACDJGDAAP22ASa1QAEctVgWtUkumUiXaJk7AQABhLVqwAmZGwCXWmDAAP22PRy1gC6CigEAARy1lBy1jYW1hsAJmTtkAQABJ4ZaAMAA/ctkAQABFrWgFrWbFLWWwAmYSAMBYIN3gL2DXYC9iIEAwAD9ywCXkUm1tCW1vYO1uMAJmEhgg+U+A0613bXpAACZf2CCiwEWtfAUtevACZhIAwFgg+WEpYNiTrYRthgAAIMkYMAA/bYBJrYRARy2KRa2Gi6ZSJdomTsBAAGEtjvACZnIAJdaYMAA/bY9HLZRLoKKAQABHLZlHLZehbZXwAmZ6GQBAAEnhloAwAD9y2QBAAEWtnEWtmwUtmfACZhIAwFgg+WAvYNdgL2IgQDAAP3LAJeRSbaFJbaOg7aJwAmYSGCC7z4DTrastrgAAJl/YIKLARa2vxS2usAJmEgDAWCC74SlgvpOtuC25wAAgyRgwAD9tgEmtuABHLb4FrbpLplIl2iZOwEAAYS3CsAJmnUAl1pgwAD9tj0ctyAugooBAAEctzQcty2FtybACZqVZAEAASeGWgDAAP3LZAEAARa3OxS3NsAJmEgDAWCC74C9gvMAwAD9ywCXkUm3TyEct2sWt12Ct1PACZgMhF+CfUgBAAErAMAA/Sk+AT0ct34ugooBAAEct5wWt46Ct4TACZgMhF+CfSMAAAAAmpYAl5E+AT0wt8Aft8rAAPtpAQABJLfyARa35YO34MAJmEiFgMAA/TAAPRy4Ay6ZaQEAASeDIQCXpD0cuBwumWkAAAAAl6QGl44wuC64M7z9AACEQAAAAAEDuEW8/QAAAAEBAbhQAAAAglVgikgAAFwBPgpOuG24dQAAmW9gpg0BH7h7phkBAAGAuJDACZutAE64pLiqAACZcGCXZgEcuKwumVECAAKBuLjACZu+FrjLgLjBwAmbrYbVik4Al3k9HLjaLpluAQABJ4HnAJeXPRy48S6ZgAEAASeAvACXlT0cuQ2CuQfACZvbmYEBAAEWuTmAuS/ACZuthtaKTwCXsD0cuU4umWkBAAEnlp4Al6RJuWAWuWQuhEmXcT4BPRy5gIK5esAJm9uZggEAAYC5jsAJm60Al5w/PRy5pC6ZZQEAAYC5u8AJm60Al4hGucsAudQAAACEQ2CCiwAWuemAud/ACZuthtOKTEE+Dkm5/Ba6CIO6AMAJnJmEH4KiPgJJuh4hFrojLoRHl28+AUK6PQA/PRy6WS6ZbgEAASeEKQCXlz9Jun4WuoIuhEmXcT4BPRy6oIK6msAJm9uZggEAAYO6rsAJnJkAl5w/PRy6xi6XrwEAARa64oO62sAJnJmEY4KWAJe4PRy69i6ZbgEAASeEQwCXl0m7EiEcuyMWux6DuxbACZyZgL2ClEgBAAErAMAA/cU+AT0cuzYumW4BAAEWu0iDu0DACZyZgL2ClACXlz9Ju10hHLtzFrtpg7thwAmcmYR3go1IAQABKwDAAP5ePgI9HLuGLpmAAQABJ5YoAJeVPRy7oy6ZbgEAASS7xQMng64Wu7mDu7HACZyZhHeCjSeDrgCXlz9Ou9q74QAAgyRbARy78ha74y6ZSJdomTsBAAGDvATACZyZAJdaPRy8FC6ZgAEAASeZgwCXlT0cvC0umW4BAAEmvDcBhLw3wAmd1GDAAP22AJeXPRy8Ri6ZaQEAASeGvwCXpD01AAAAAQBgl2YBgrxdwAmb2xe8Y4W8Y8AJnjeD3Ry8Wxa8Y4W8Y8AJnjeD3ZdtZAEAAZQAwAD89ZdtPRy8fYK8d8AJm9uZcQEAAYO8mcAJnJkAl4w9NQAAAAEAYJdmAYK8q8AJm9sXvLGFvLHACZ6Mg90cvKkWvLGFvLHACZ6Mg92XbYGNAQABlADAAPz2l209HLzELplpAQABJ4bAAJekPRy83C6XVwEAAYC878AJm60Al48Gl48wvQK9B77XAACXVwAAAAEDvRm+1wAAAAEBAb0kAAAAglVgikgAAFwBPglJvTUWvVYWvVIWvUgWvTkumUiXaJksl02Aq5cegVXAAPzKSr1fAD9OvXe9fwAAmW9gpg0BH72FphkBAAGAvZrACZ8HAE69rr20AACZcGCXZgEcvbYumVECAAKBvcLACZ8/Fr3VgL3LwAmfB4bVik4Al3k9HL3kLpluAQABJ5mEAJeXPRy+AS6ZaQEAASeGvwCXpD01AAAAAQBgl2YBgr4WwAmfXBe+HIO+HMAJn6uD3Ry+FBa+HIO+HMAJn6uD3ZdtZAEAAZQAwAD89ZdtRr4tvoG+QQAAAYX/YIluABy+dxa+cha+bha+ZBa+VS6ZSJdomSyXTYCrlx6DYsAA/MeArQAAAADAAPxIPgE9HL6Pgr6JwAmfXIbzAQABg76ZwAmf6QCXmj01AAAAAQBgl2YBgr6wwAmfXBe+toO+tsAJoD6D3Ry+rha+toO+tsAJoD6D3ZdtgY0BAAGUAMAA/PaXbT0cvscumWkBAAEnhsAAl6QGl5Awvty+4L8hAACZhQAAAAEDvu2/IQAAAAEBAb73AAAAg+5gglIAAGDAAPvQAT4BSr8DAR6/FZhGAQABJr8YAYC/GMAJoKVghKkABpeRML8mvyu/eQAAgooAAAABA78wv3kAAAABAQG/OAAAAIPsYMAA/bYAAFwBPgI9HL9LFr9GLoQ7l2mCigEAAYC/UcAJoPEAwAD+Ij0Xv14uhuMcv2UWv14uhuOXbmQBAAEWv2+Av2jACaDxYcAA/boAwAD89ZduBpeSML9+v4O/zwAAmYYAAAABA7+Nv88AAAABAAG/lgAAAIPsYMAA/bYBar+fYMAA/bbAAJI9AFwBPgI9HL+rLoKKAQABgL+xwAmhaQCXkT0Xv74ugk4av8aXcpd1BpeTML/Uv9nAAEARAACZhwAAAAEDv+TAAEARAAAAAAAAAFwBPgFJv+0hHL/3Fr/xLoJOl3VIAQABGr/6l3IAwAD88z0cwABAAS6ZhgAAAACXkj8Gl5QwwABAFsAAQBvAAEBhAACZiAAAAAEDwABAJsAAQGEAAAABAQHAAEAuAAAAg+xgwAD9tgAAXAE+Aj0cwABAPC6CigEAAYDAAEBCwAmiIwCXkT0XwABATy6CThrAAEBXl3SXdQaXlTDAAEBmwABAa8AAQMIAAJmAAAAAAQPAAEB2wABAwgAAAAEBAcAAQH4AAACD7GDAAP22AABcAT4DPRzAAECMLpmHAAAAAJeTPRzAAECfLoKKAQABgMAAQKXACaKIAJeRPRzAAECyLpmGAAAAAJeSBpeWMMAAQMfAAEDMwABBFwAAmYkAAAABA8AAQNbAAEEXAAAAAQABwABA3wAAAIPsYMAA/bYBasAAQOhgwAD9toFpAFwBPgI9HMAAQPQugooBAAGAwABA+sAJovkAl5E9HMAAQQcumYYAAAAAl5IGl5cwwABBHMAAQSHAAEGdAACZbgAAAAEDwABBKsAAQZ0AAAABAQHAAEEyAAAAg+xgwAD9tgAAXAE+BEnAAEFAFsAAQUuAwABBRMAJo2eBVcAA/bxKwABBVAA/PRzAAEFgLpmKAAAAAJeYPRzAAEF6LoKKAQABgMAAQYDACaNnAJeRPRfAAEGNLoJOGsAAQZWXc5d1BpeYMMAAQaLAAEGnwABB8wAAmYoAAAABA8AAQbnAAEHzAAAAAAAAAFwBPgFJwABBwhzAAEHMFsAAQcYugk6XdUgBAAEawABBz5dzAMAA/PM+AT0cwABB3S6ZhgAAAACXkj8Gl5kwwABB+MAAQf3AAEI4AACZiwAAAAEDwABCDcAAQjgAAAAAAAAAXAE+AT0cwABCFi6ZhgEAARzAAEImJ4Pcg4gBAAEWwABCKC6D3ZdtAMAA/dAAl5IGl5owwABCPcAAQkLAAEQZAACG8wAAAAEDwABCS8AARBkAAAABAQHAAEJRAAAAg+5ggksAAFwBPgFJwABCXRzAAEJmgMAAQmHACaS0SAEAASsAwAD9KT4BPRzAAEJ3LpmIAQABJ5mMAJeUPgZOwABCp8AAQrEAAZmNYMAA+goBHMAAQrMumVIBAAGAwABCw8AJpLQAl3pJwABC0IHAAELUwAmk+j4BPRzAAELpLplTAQABgMAAQvjACaS0AJd7P0nAAEMOIhbAAEMSLoRIl3AAJcAAQyaAwABDIcAJpLRgglI+AT0cwABDPS6ZbgEAASTAAENdAyeZjhbAAENQFMAAQ0vACaS0AAFgglKEU4JZJ5mPAJeXP0nAAENuIhbAAENyLoRJl3EAJcAAQ4eAwABDgsAJpLRgglI+AT0cwABDni6ZggEAARTAAEOswAmktAABYIJSAJecPz0cwABDx4DAAEPCwAmktIRNAQABLgCCTUnAAEPcgcAAQ+DACaT6PgE9HMAAQ/UumVQBAAGAwABEAsAJpLQAl3w/BpebMMAARB7AAEQjwABEewAAl3sAAAABA8AARDTAAER7AAAAAQEBwABEOgAAAIPuYIJLAABcAT4BScAAREYhHMAARE+AwABESsAJpk1IAQABKwDAAP0pPgE9HMAARGWAwABEYMAJpk2ETQEAAS4Agk0/BpecMMAARIDAAESFwABFigAAmYIAAAABA8AARJLAAEWKAAAAAQEBwABEnAAAAIPuYIJSAABcAT4BScAARKghHMAARLUWwABErC6G1ZdrSAEAASsAwAD9KT4BRsAARMbAAETmwABEzwAAAJmQXYpqAWDAAP0cABbAAETeFsAARNUuhtWXaynAAPzIPgJOwABE9sAARQMAAZmRYMAA/RwBHMAARQ8WwABFCIHAAEUFwAmm+4bHim1LAQABgMAARRDACaa/AMAA/LlJwABFHyEcwABFMILAAEUjwAmnJUgBAAErAMAA/Sk+AT0cwABFRS6ZbgEAASTAAEVtBSeZkhbAAEVXgcAARVTACab7g+eKbCeAvILAAEVewAmnJSeZjwCXlz8/BpedMMAARY/AAEWUwABGRQAAmZMAAAABA8AARabAAEZFAAAAAgICwABFsAAAAIKQYIizAMAARb0AAACEqmDAAP22AABcAT4CPRzAAEXPLpmUAQABgMAARdnACafiAJeeScAAReQhHMAARfOBwABF6MAJp+9IAQABKwDAAP3FPgM9HMAARgQugooBAAEnUACXkT0cwABGFi6CigEAAYHAAEYcwAmn7wCXkT0XwABGLy6CThrAAEY3l3OXdT8Gl54wwABGSsAARk/AAEbOAACZlAAAAAEDwABGWMAARs4AAAABAQHAAEZiAAAAgpBgiLMAAFwBPgFJwABGbhzAAEZ3gMAARnLACaieSAEAASsAiLc+AT0cwABGiC6CigEAASeZlQCXkT4BPRzAAEa4gMAARrPACaiehE0BAAEuAIi1BpefMMAARtPAAEbYwABHNAAAmZYAAAABA8AARunAAEc0AAAAAQEBwABG8wAAAIKQYIizAABcAT4BScAARv8hHMAARwiAwABHA8AJqSBIAQABKwCItz4BPRzAAEcegMAARxnACakghE0BAAEuAIi1PwaXoDDAAEc5wABHOcAASHcAAIT2AAAAAQPAAEdHwABIdwAAAAEBAcAAR1IAAACCkGCJXwAAYMAA/NkBPgFJwABHXhzAAEdngMAAR2LACamQSAEAASsAiWo+AT0cwABHeC6CigEAASeZlwCXkT4CPRzAAEekLpmYAQABFsAAR8qAwABHxcAJqZCGdIlhAJeuScAAR9wWwABH8xbAAEflgMAAR+DACamQhReJYoOywAD8Vz4DPRzAAEgJLpmIAQABJ2MAl5Q9HMAASCMuiD4CAWCIswIWwABIMoDAAEgtwAmpkIUXiWIWwABIQS6ZlJeeAJetPRzAAEhVLpmIAQABJ4CXAJeUPwaXoTDAAEh8wABIfMAASV8AAIaGAAAAAQPAAEiMwABJXwAAAAEBAcAASJkAAACCkGCJGgAAYMAA/NkBPgI9HMAASKUumZkBAAEWwABIwIDAAEi7wAmqlYaFiSAAl7NJwABI0hbAAEjpFsAASNuAwABI1sAJqpWFF4keg7LAAPxXPgM9HMAASP0umYgBAAEnYwCXlD0cwABJFS6IPgIBYIizAhbAAEkkgMAASR/ACaqVhReJHhbAAEkzLpmUl54Al609HMAASUUumYgBAAEngJcAl5Q/BpeiMMAASWTAAElpwABJxgAAmZoAAAABA8AASXbAAEnGAAAAAgICwABJfAAAAJmbYMAA+goAwABJjAAAAIC9YMAA/bYAAFwBPgFJwABJmIDAAEmcwAmraT4BPRzAAEmtLpluAQABgcAASbfACat4AJeXPwaXozDAAEnLwABJ0MAASn8AAIbxAAAAAQPAAEnZwABKfwAAAAEBAcAASd8AAACAvWCIfgAAXAE+AUnAAEnrHMAASfo1AAAAAQBgiH4BgMAASe/ACavcIxzAAEn1gQDACav5SAEAASsAACsWwABJ9YEAwAmr+YC9iIEBYMAA/bZIAQABJwAAwAD9xT4BPRzAAEoJLpluAQABGsAAShOXdgCXlz4BPRzAAEo4LpluAQABNQAAAAEAYMAA/bYBNQAAAAEAYIh+AYDAAEpCwAmr3CMcwABKSIEAwAmsckgBAAErAAArFsAASkiBAMAJrHKAvYiBAWDAAP22IxzAAEpNgQDACaxmSAEAASsAACeZnIEAwAmsZgFgwAD9tgCXlwaXpDDAAEqEwABKicAASw8AAJlpAAAAAQPAAEqQwABLDwAAAAEAAcAASpkAAACD7GDAAP22AWoAYMAA/Nl3AFwBPgRJwABKqCEcwABKs4DAAEqswAms+UgBAAErAMAA/cU+AT0cwABKxC6CigEAAYDAAErKwAms+QCXkT89HMAASt0ugooBAAEngK8Al5E9F8AASu4ugk4awABK9pdyl3U9F8AASwEuhuOTl24Gl6UwwABLFMAASxnAAFAaAACZnQAAAAEDwABLJsAAUBoAAAAEAQHAAEs0AAAAgmpghH4AA8AAS0UAAACAvVsBagBgwAD82XfAAEtdAAAAhRFdwAD8dAFghDEBagBgwAD82XfAAEtwAAAAmZ5gwAD6CgFqwABLf2DAAPoKdVwBPghJwABLjCXAAEuVgcAAS5DACa2zYMAA/bY+AT0cwABLqC6ZbgEAARTAAEuywAmtswEBYMAA/bYAl5dJwABLxCXAAEvNgcAAS8jACa2zYIh+PgE9HMAAS94uhvEBAAEUwABL6MAJrbMBAWCIfgCXoz4BQBzAAEwOgcAATAnACa2zSAEAASsAwAD9KcAATAnAAEwVAD0cwABMIi6ZnwEAARbAAExCgMAATDnACa2lhLiEgwCXqz0cwABMVy6ZoAMAAxbAAExzgMAATGrACa2lhLqEhRbAAEySgMAATInACa2lhLuEhhbAAEy0gMAATKvACa2lhRmEhACXrD0cwABM0S6ZoQIAAhbAAEzzgMAATOrACa2lhTSEhzUAAAABAGCXXwEWwABM/y6ZSZdqIxzAAE0KhADACa8WSAEAASsAACscwABNCoQAwAmvFplFAgACLoDAAE0fwAmtpQCXYgFgwAD9tgCXqknAAE0vIiEcwABNQILAAE0zwAmtxkgBAAErAMAA/SkAFsAATViCwABNS8AJrcaDssAA/Fc+Bj0cwABNbC6ZaQAAAACXpD0XwABNfy6D3RzAAE19FsAATX8ug92XbWQBAAGUAMAA/PWXbT0cwABNki6ZiwAAAACXmT0cwABNrC6ZiQEAASeC5gCXlj0cwABNwy6IPgIBYIQxAoLAAE3NwAmtxhbAAE3bLobzl5oAl609F8AATe8ug90cwABN7RbAAE3vLoPdl22BjQEAAZQAwAD89pdtP0nAAE4GIRzAAE4fFsAAThOAwABOCsAJraWFToSBSAEAAWrAAE4uYISahOYAwAD9KT4BPRzAAE48LpmAAQABHMAATkgumaIBAAEWwABOZ4DAAE5ewAmtpYVOhIEAl6YAl5U/ScAAToAiIRzAAE6dFsAATo2AwABOhMAJraWFT4SCSAEAAWrAAE6sYISahOYAwAD9KQAhHMAATtUWwABOxYDAAE68wAmtpYVPhIJIAQABFsAATuGAwABO2MAJraWFToSBAMAA/Sk+Az0cwABO9i6ZgAEAASeZowCXlT0cwABPGi6ZgAEAARzAAE8mLpmiAQABFsAAT0WAwABPPMAJraWFT4SCAJemAJeVPRzAAE9eLpmAAQABJ5mkAJeVP0nAAE97IRzAAE+NFsAAT4iAwABPf8AJraWCaYSUSAEAASsAwAD9KT4BPRzAAE+eLpmlAgABFsAAT7mAwABPsMAJraWCaYSUAZmeg8AAT87ACa3hl6dJwABP6YPAAE/twAmt4T4BPRzAAFAELplpAQABJ5aeAJekPwaXpjDAAFAfwABQJsAAUc8AAJmiAAAAAQPAAFA7wABRzwAAAAEBAcAAUEgAAACZpmCEmgAAYMAA/bYBPgFHwABQVoDAAFBewAmx9AYBwABQf2rAAFB/YISahOYAPgFKwABQjQEnmacBwABQs2rAAFCzYISahPsAPgFKwABQxQEnmagBwABQ7GrAAFDsYISahQoAPgFKwABQ+wEnmakBwABRImrAAFEiYISahRkAPgFKwABRNQEnmaoBwABRXWrAAFFdYISahSgAPgFKwABRcwEnmasAAT4BSsAAUZ0BJMAAUcUDJ5msgMAAUb3ACbH0J4CXBpenMMAAUdTAAFHZwABUhwAAmaUAAAABA8AAUerAAFSHAAAAAgEBwABR9QAAAIJpYIdfAAHAAFIBAAAAmZ5gwAD6CgFqwABSEGDAAPoKdVwBPgFJwABSHSIlwABSJoDAAFIhwAmy5mCHbwAWwABSQhbAAFI3FMAAUjLACbLmAAFgh2+GEIdxgVXAAPxWPgQ9HMAAUlMumYcAAAAAl5M9HMAAUmgumYgBAAEnma0Al5Q9F8AAUoEugk4awABSiZdzl3VJwABSlYHAAFKZwAmy9D4BPRzAAFKyLplpAAAAAJekP0nAAFLQJcAAUtmAwABS1MAJsuZgh28+CT0cwABS6y6ZhwAAAACXkz0cwABTAC6ZaQEAASeZrgCXpD0XwABTFi6D3RzAAFMUFsAAUxYug92XbWQBAAGUAMAA/PWXbT0cwABTORbAAFMuFMAAUynACbLmAAFgh2+GEIdxg/gBAAEWwABTQS6G85eaAMAA/EI9F8AAU1Uug90cwABTUxbAAFNVLoPdl22BjQEAAZQAwAD89pdtPRzAAFNoLpmLAAAAAJeZPRzAAFOCLpmIAQABJ4bAAJeUPRfAAFOaLoJOGsAAU6KXc5d1ScAAU66BwABTssAJsvQ+AT0cwABTyy6ZaQAAAACXpD9JwABT6SIlwABT8oDAAFPtwAmy5mCIDgAhgcAAVAnACbL0PgI9HMAAVCAumYABAAEnma8Al5U9HMAAVDkumbABAAEWwABUThTAAFRJwAmy5gABYIgOgmuIEACXtj4BPRzAAFRuLpmxAQABgMAAVHjACbLmAJepBpeoMMAAVIzAAFSMwABcZQAAmbIAAAABA8AAVJ3AAFxlAAAAAwEBwABUqwAAAIPuYIkAAALAAFTSAAAAmbNdwAD8dAFgiE4BagBgwAD82XfAAFUFAAAAmbRdwAD8dAFgiE4BagBgwAD82XdbAT4QScAAVRocwABVJBbAAFUeLoJOl3VIAQABGsAAVSeXcwDAAPzzPgE9HMAAVTUumYcAAAAAl5M/PRzAAFVOLpmfAQABFsAAVWqAwABVZcAJtUSEuIkCAJerPRzAAFV/LpmIAQABJ4PXAJeUTsAAVaTAAFWvAACFjV3AAPx0AWCIswEWwABVtoDAAFWxwAm1RIS6iQROwABV1sAAVeoAAJm1YMAA+goBKknAAFX3IRzAAFYNgcAAVfvACbVSSAEAASsAwAD9KT4BRsAAVh7AAFZUwABWNwAAAJm2YIhOAIHAAFZBwAm1Uj4BPYzAAFZewAm2HyKEwABWgMAJth8BHMAAVrEWwABWqhbAAFaehcAAVpfACbZbhGOIUWHAAPyjgJcBAAGTAMAA/P8/ScAAVsghHMAAVtmCwABWzMAJtW1IAQABKwDAAP0pPgFGwABW6sAAVxvAAFcDAAAAmbZgiE4AgsAAVw3ACbVtPgE9jMAAVyXACbYfIoTAAFdHwAm2HwEcwABXeBbAAFdxFsAAV2WFwABXXsAJtt6EY4hRYcAA/KOAlwEAAZMAwAD8/z9JwABXkCKEwABXlMAJth8AIRzAAFe9gcAAV6vACbVSSAEAASsAwAD9KT4BPRzAAFfOLog+AgFgiE4CHMAAV+qBwABX2MAJtVKWPgEAARbAAFf0gMAAV+/ACbVEhRmJAwDAAPxKFsAAWBcul8CYDQCXrT4BPRzAAFhFLog+AgFgiLMCHMAAWFqDwABYT8AJtfaWPgEAARbAAFhkgMAAWF/ACbVEhRmJAwDAAPxKFsAAWH0umZSXngCXrUnAAFiUHMAAWLQWwABYnYDAAFiYwAm1RIUZiQNjAQABFsAAWMGDwABYtsAJtfZhwAD8owDAAPz9PgRJwABY0RzAAFjxFsAAWNqAwABY1cAJtUSFGYkDgJcBAAGTAMAA/P8+AT0cwABZAC6ZiQAAAACXlj89HMAAWRwumYgBAAEnmY4Al5RJwABZNCKEwABZOMAJth8AIRzAAFlhgcAAWU/ACbVSSAEAASsAwAD9KT4BPRzAAFl0Log+AgFgiE4CHMAAWZCBwABZfsAJtVKWKQEAARbAAFmagMAAWZXACbVEhRmJAwDAAPxMFsAAWb8ul8CYDQCXrT4BPRzAAFnxLog+AgFgiLMCHMAAWgaDwABZ+8AJtfaWKQEAARbAAFoQgMAAWgvACbVEhRmJAwDAAPxMFsAAWikumZSXngCXrT0cwABaQy6ZiAEAASeZjwCXlD9JwABaXxbAAFp4FsAAWmiAwABaY8AJtUSEu4kFg7LAAPxXPgRJwABajBbAAFqqFsAAWpWAwABakMAJtUSEuokEg7LAAPxXPgE9HMAAWsAumYkAAAAAl5Y/PRzAAFrcLpmIAQABJ5muAJeUScAAWvQihMAAWvjACbYfACEcwABbHILAAFsPwAm1bUgBAAErAMAA/Sk+AT0cwABbLy6IPgIBYIhOAoLAAFs5wAm1bRbAAFtHLpfAmA0Al60+AT0cwABbeS6IPgIBYIksAhbAAFuIgMAAW4PACbVEhLuJBRbAAFuZLoaJmB4Al609HMAAW7gumYgBAAEnhsAAl5Q/PRzAAFvULpmIAQABJ4MhAJeUPRzAAFvqLpmHAAAAAJeTPRzAAFv9LoKKAQABJ5m3AJeRPRzAAFwNLpm4AQABFsAAXCOAwABcHsAJtUSGZ4kGAJgYPRzAAFw1LpmGAAAAAJeSPRzAAFxHLpmUAQABFsAAXFaAwABcUcAJtUSFNIkIAJeeBpepMMAAXGrAAFxvwABdogAAmbEAAAABA8AAXHjAAF2iAAAAAQEBwABcgwAAAIJpYIdfAABcAT4BScAAXI8lwABcmIDAAFyTwAm66mCHbz4GPRzAAFyqLplpAQABJ4a/AJekPRfAAFzBLoPdHMAAXL8WwABcwS6D3ZdtZAEAAZQAwAD89ZdtPRzAAFzkFsAAXNkUwABc1MAJuuoAAWCHb4YQh3GD+AEAARbAAFzsLobzl5oAwAD8Qj0XwABdAC6D3RzAAFz+FsAAXQAug92XbYGNAQABlADAAPz2l209HMAAXRMumYsAAAAAl5k9HMAAXS0umWkBAAEnhsAAl6Q+BD0cwABdTi6ZaQAAAACXpD0XwABdYS6D3RzAAF1fFsAAXWEug92XbWQBAAGUAMAA/PWXbT0cwABddC6G8wEAAYDAAF1+wAm66gCXmj0XwABdjS6D3RzAAF2LFsAAXY0ug92XbYGNAQABlADAAPz2l20Gl6owwABdp8AAXazAAF5AAACZoQAAAAEDwABdu8AAXkAAAAACAgLAAF3FAAAAgpBgiLMAwABd0gAAAISqYMAA/bYAAFwBPgNJwABd5BzAAF3tgMAAXejACbxaSAEAASsAiLdKwABd9gA/PRzAAF4CLpmAAQABJ5m3AJeVPRzAAF4YLpmTAgACgMAAXivACbxagcAAXjHACbxnAJedBperMMAAXkXAAF5KwABfTAAAmZ8AAAABA8AAXmDAAF9MAAAAAQEBwABedQAAAIS4XcAA/HQBYIlKAABcAT4FScAAXosWwABenoDAAF6PwAm894FVwAD8VkrAAF6nAD89HMAAXrMumYgBAAEnYwCXlD0cwABeyS6IPgIBYIlKAoDAAF7TwAm89xbAAF7jLobzl5oAl609HMAAXvMumYgBAAEngJcAl5Q9F8AAXwkugk4awABfEZdzl3UGl6wwwABfUcAAX1bAAGIzAACZoAAAAAEDwABfaMAAYjMAAAADAwPAAF+DAAAAhY1dwAD8dAFgiE4AwABfrwAAAIVXXcAA/HQBYIhOAMAAX7oAAACFGWDAAPvQAABcAT4FPRzAAF/YLpmIAQABJ4PXAJeUPRzAAF/uLog+AgFgiE4CHMAAYAyAwABgAcAJvbCWPgEAAYLAAGARwAm91gDAAPxKFsAAYCoul8CYDQCXrUnAAGBJHMAAYGSCwABgTcAJvdZjAQABFsAAYHGAwABgZsAJvbBhwAD8owDAAPz9PgRJwABggRzAAGCcgsAAYIXACb3WgJcBAAGTAMAA/P8+AT0cwABgqy6ZiQAAAACXlj89HMAAYMcumYgBAAEnmY4Al5Q9HMAAYN8uiD4CAWCITgIcwABg/4DAAGD0wAm9sJYpAQABgsAAYQTACb3WAMAA/EwWwABhHS6XwJgNAJetPRzAAGE+LpmIAQABJ5mPAJeUP0nAAGFaFsAAYWSBwABhXsAJvcODssAA/Fc+BEnAAGF4FsAAYYeAwABhfMAJvbCDssAA/Fc+AT0cwABhnS6ZiQAAAACXlj89HMAAYbkumYgBAAEnma4Al5Q9HMAAYdEuiD4CAWCITgKBwABh28AJvcMWwABh4i6XwJgNAJetPRzAAGIDLpmIAQABJ4bAAJeUPz0cwABiHy6ZiAEAASeDIQCXlAaXrTDAAGI4wABiPcAAY0UAAIg+AAAAAQPAAGJJwABjRQAAAQAAgnZgwAD9HAFbAwICwABiVgAAAIcsXcAA/DIBXwAAAMAAYmIAAACZuWEBXwAAXAABwABifwAAAIGvYMAA/bYBasAAYopgwAD9toFpXAE+Ak7AAGKbwABioQAAgxlgwAD6CgEpRsAAYq3AAGLFwABitgAAAIPuXwAAAIDAAGK+wAm/0D4CScAAYs2DwABi0cAJwBQ+AT2LwABi4sAJwBQqPgE9HMAAYwgumYkBAAGCwABjE8AJv/QAl5Y9HMAAYzWBwABjLcAJv+MgAQABhMAAYzbACcAwAAAGl64wwABjSsAAY0/AAGPDAACZmAAAAAEDwABjb8AAY8MAAAABAQHAAGN6AAAAhF5ggnsAAFwBPgE9HMAAY4sumW4BAAEcwABjlS6ZugEAAYDAAGO0wAnAwgCXrwCXlwaXrzDAAGPIwABjz8AAZR4AAJm6AAAAAQPAAGPtwABlHgAAAAEBAcAAY/gAAACEXmCCewAAYMAA/bYBPgRJwABkCRzAAGQXgMAAZA3ACcEhSAEAASsAwAD9KUrAAGQgASeZWj9JwABkOSEcwABkTBbAAGRHgMAAZD3ACcEhg+6CfkgBAAErAMAA/SlKwABkVQEcwABkXC6HNgEAARbAAGR4gMAAZG7ACcEhhGqCgwCXgD9JwABkhiEcwABkohbAAGSUgMAAZIrACcEhhF+CfUgBAAErAMAA/SlKwABksQEcwABkuC6ZuwEAARbAAGTZgMAAZM/ACcEhhF+CfQCXsj89MMAAZO0nmbwGl7AwwABlI8AAZSjAAGWeAACZgQAAAAEDwABlScAAZZ4AAAABAQHAAGVUAAAAhF5ggnsAAFwBPgE9HMAAZWUumW4BAAEcwABlby6ZvQEAAYDAAGWPwAnCKgCXsQCXlwaXsTDAAGWjwABlqsAAZv0AAJm9AAAAAQPAAGXJwABm/QAAAAEBAcAAZdQAAACEXmCCewAAYMAA/bYBPgRJwABl5RzAAGXzgMAAZenACcKJSAEAASsAwAD9KUrAAGX8ASeZXj9JwABmFiEcwABmKRbAAGYkgMAAZhrACcKJg+6CfkgBAAErAMAA/SlKwABmMgEcwABmOS6HNQEAARbAAGZWgMAAZkzACcKJhGyChACXgz9JwABmZSEcwABmgRbAAGZzgMAAZmnACcKJhF+CfUgBAAErAMAA/SlKwABmkAEcwABmly6ZuwEAARbAAGa4gMAAZq7ACcKJhF+CfQCXsj89MMAAZswnmbwGl7IwwABnAsAAZwnAAGrXAACZuwAAAAEDwABnH8AAatcAAAABAQHAAGcuAAAAgL1gmnoAAGDAAP22AT4MScAAZzoWwABnQ4DAAGc+wAnDkpeEmoU9MMAAZ0snmb4/ScAAZ2gcwABndhbAAGdxgMAAZ2zACcOSgL2agIHWAQABJ4N/AMAA/cg9MMAAZ4cnmb8/T8AAZ6LAAGeiAAABmcBhAWCaelsAA8AAZ6/AAGiKAAAAAQEBwABnvgAAAIiKYJp6AABbAT4CScAAZ8shHMAAZ+M1AAAAAQBggnsBFsAAZ9OCwABnz8AJxCCEXpqBIxzAAGfegwDACcQ+SAEAASsAACsWwABn3oMAwAnEPoPugn4BYIJoSAEAASsAwAD9KUrAAGf0ARzAAGf7LplWAQABFsAAaB0WwABoE4LAAGgPwAnEIIRemoGEaIKCAJd+P0rAAGgvARzAAGhFFsAAaDYumUiXaJk/AgACFsAAaHWCwABoccAJxCCEXpqBgsAAaIDACcQgAJdbT8AAaJHAAGiRAAABmcFhAWCaelsAA8AAaJzAAGjmAAAAAQEBwABoqwAAAJnCYJp6AABbAUrAAGi7ARzAAGjcHMAAaNUcwABoyIHAAGi7wAnEASABAAEWwABozYPAAGjJwAnFFoRSmoQAAGQBAAEnhloAAGQBAAEWwABo4oPAAGjewAnFFoC9moAAAEnAAGjtFsAAaP0WwABo9oDAAGjxwAnDkoRSmoSXhJqFSsAAaQUBJsAAaQUBHMAAaRmBwABpDMAJxAEgAQABgMAAaRrACcOSAABgwAD9tj9JwABpJRbAAGk8FsAAaTUWwABpLoDAAGkpwAnDkoRSmoSEUpqEl4SahUrAAGlEASbAAGlEARzAAGlWgsAAaUvACcT3IAEAAYDAAGlXwAnDkgAAYMAA/bY/TsAAaXHAAGl4AACZw2CaegEWwABpf4DAAGl6wAnDkoRSmoRDwABpiyEcwABpnxbAAGmag8AAaZPACcYlgL2agIHWAQABJ4N/AMAA/cg9i8AAabDACcYlFsAAacCDwABpucAJxiWEUpqETsAAadTAAGnbAACEUmDAAP22AScAScAAaeUWwABp/hbAAGn3FsAAafCDwABp6cAJxiWEUpqEhFKahJeEmoU+AT2MwABqDsAJxo4mwABqDgEcwABqJIHAAGoXwAnEASABAAEWwABqLIPAAGolwAnGJYRSmoQAAGDAAP22PgE9jMAAakjACcaOJsAAakgBHMAAalyCwABqUcAJxPcgAQABFsAAamSDwABqXcAJxiWEUpqEAABgwAD9tknAAGp4HMAAaoYWwABqgYDAAGp8wAnDkoC9moBIAQABJwAAwAD9xUrAAGqNASTAAGqvA4TAAGqWwAnGjieGWhrAAGqfl3Y/SsAAarUBJMAAatMDhMAAar7ACcaOJ4ZaFsAAas2AwABqyMAJw5KAvZqABpezMMAAatzAAGrhwABrQQAAmZkAAAABA8AAavbAAGtBAAAAAQEBwABq/wAAAIaFYILvAABcAT4BPRzAAGsSLpluAQABHMAAaxwumVsBAAGAwABrMMAJx90Al4EAl5cGl7QwwABrRsAAa0vAAGxYAACZxAAAAAEDwABrYcAAbFgAAAABAQHAAGt2AAAAgmxgiE4AAFwBPgROwABrjMAAa5YAAZmNYMAA+goBHMAAa5gumVIBAAGAwABrqMAJyDwAl3pJwABrt4HAAGu7wAnITz4BPRzAAGvOLplTAQABgMAAa93ACcg8AJd7Pz0cwABr8i6ZbgEAARzAAGv8LplgAQABgMAAbBHACcg8AJeFAJeXScAAbCGBwABsJcAJyE8+AT0cwABsOC6ZVAEAAYDAAGxFwAnIPACXfD8Gl7UwwABsXcAAbGLAAGzGAACZxQAAAAEDwABsfcAAbMYAAAABAQHAAGyMAAAAg+5giUoAAFwBPgE9HMAAbJgumW4BAAEcwABsoi6ZYwEAAYDAAGy8wAnJFwCXhwCXlwaXtjDAAGzLwABs0MAAbtsAAJmwAAAAAQPAAGzfwABu2wAAAAIBAsAAbOsAAACD7mCEqQDAAGz2AAAAmcZgwAD70AFqAGDAAPzZdwBcAT4ITsAAbRbAAG0gAAGZjWDAAPoKARzAAG0iLplSAQABgMAAbTLACcl2AJd6ScAAbT2CwABtQcAJyaA+AT0cwABtVC6ZUwEAAYDAAG1jwAnJdgCXez9JwABtdBbAAG14LoRIl3A9HMAAbYUumW4BAAEkwABtpQMnmY4WwABtmIDAAG2TwAnJdoRTglknmY8Al5c/TsAAbbHAAG3BAACZx2DAAPoKASpJwABtziIhHMAAbeSBwABt0sAJyYNIAQABKwDAAPzzABzAAG4DHMAAbe8umYUBAAGAwABt/cAJyXYAl5BjAQABgcAAbgXACcmDAMAA/P0+Aj2LwABuIMAJyjApPRzAAG4+LpmIAQABJ4PXAJeUPz0cwABuWi6G8wEAAYDAAG5kwAnJdgCXmknAAG5vg8AAbnPACcowPgE9HMAAbowumYgBAAEngyEAl5Q/ScAAbqiCwABurMAJyaA+AT0cwABuvy6ZVAEAAYDAAG7MwAnJdgCXfD8Gl7cwwABu4MAAbuXAAG/eAACXuwAAAAEDwABu9MAAb94AAAABAQHAAG8AAAAAg+5ghKkAAFwBPgI9HMAAbwwumYgBAAEng38Al5RJwABvIiXAAG8rgMAAbybACcs8YIXLPgI9HMAAb00umYEBAAEWwABvdBTAAG9vwAnLPAABYIXLhRiFzQCXsD0cwABvjC6FmgEAARbAAG+gFMAAb5vACcs8AAFghctbhc4AmA4+AT0cwABvvy6ZsAEAAYDAAG/PwAnLPACXtgaXuDDAAG/jwABv6MAAcRYAAJevAAAAAQPAAG/7wABxFgAAAAIBAcAAcA0AAACHLF3AAPx0AWCEqQABwABwGgAAAJnIYMAA+goBasAAcClgwAD6CnVcAT4BRsAAcDbAAHBVwABwRgAAAIPuYISpAIDAAHBOwAnMBD4DScAAcF2BwABwYcAJzBg+AT0cwABwei6ZiwAAAACXmT89HMAAcJwul7sBAAGCwABwrMAJzD8Al7dJwABwuYHAAHC9wAnMGD4BPRzAAHDWLplpAAAAAJekPgE9HMAAcPgumYYAAAAAl5IGl7kwwABxG8AAcRvAAHE3AACEmgAAAAEDwABxJ8AAcTcAAAABAQHAAHEwAAAAg+5ggosAAGDAAPzZAT4ABpe6MMAAcTzAAHE8wAB2lQAAhQ4AAAABA8AAcUbAAHaVAAAAAQEBwABxTQAAAIPuYIN3AABgwAD82QE+Dz0cwABxWS6XrwEAARbAAHFygMAAcW3ACc0jhGODXACXuD0cwABxhC6ZiwAAAACXmT0cwABxnC6ZmgIAAhbAAHGvgMAAcarACc0jhBmDhyeEIwCXoj0cwABxyC6ZmgIAAhbAAHHbgMAAcdbACc0jhCCDhCeEKgCXoj0cwABx+i6ZmgIAAhbAAHINgMAAcgjACc0jhQuDiieZyQCXoj0cwAByRC6ZmgIAAhbAAHJXgMAAclLACc0jhBuDhSeEJQCXoj0cwABybi6ZmgIAAhbAAHKBgMAAcnzACc0jhB2DhieEJwCXoknAAHL+FsAAcweAwABzAsAJzSOEGYOHPgI9HMAAcxkumZoCAAIWwABzLIDAAHMnwAnNI4UJg4gnmcoAl6I9HMAAc1IumZoCAAIWwABzZYDAAHNgwAnNI4UKg4knmcsAl6I+Aj0cwABzmC6ZmgIAAiEWwABzrIDAAHOnwAnNI4UJg4gnmcwAl6JJwABz1RbAAHPegMAAc9nACc0jhBuDhT4BPRzAAHPxLpmaAgACFsAAdASAwABz/8AJzSOFCoOJJ5nLAJeiPgE9HMAAdDsumZoCAAIhFsAAdE+AwAB0SsAJzSOFCoOJJ5nNAJeiPRzAAHSELpluAQABJ4SOAJeXPRzAAHScLpmGAAAAAJeSPRzAAHSuLpmTAgACFsAAdMaAwAB0wcAJzSOCkIN5NQAAAAEAYJdfARbAAHTMLplJl2ojHMAAdNeBAMAJz0lIAQABKwAAKxzAAHTXgQDACc9JmUYCAAIugMAAdOvACc0jAJdjAWDAAP22AJedPRzAAHT3LobxAQABHMAAdQEumV0BAAGAwAB1D8AJzSMAl4IAl6NJwAB1GyEcwAB1MBbAAHUkgMAAdR/ACc0jhQGDe0gBAAErAMAA/Sk+Aj0cwAB1QS6ZgAEAASeAvACXlT0cwAB1WS6ZsAEAARbAAHVugMAAdWnACc0jhQGDewCXtj9JwAB1hiIiHMAAdZ8WwAB1kIDAAHWLwAnNI4T5g2FIAQABKwDAAP0pACEcwAB11BbAAHXMFsAAdbuAwAB1tsAJzSOEpYNihGGCjkgBAAEWwAB13IDAAHXXwAnNI4Rhg14AwAD+XgEiIRzAAHYFFsAAdfaAwAB18cAJzSOE+YNhSAEAASsAwAD9KQAhHMAAdjgWwAB2MBbAAHYhgMAAdhzACc0jhPmDYYRhgyJIAQABFsAAdkCAwAB2O8AJzSOEYYNeAMAA/l4+AT0cwAB2Ui6ZbgEAASTAAHZ4AyeZzhbAAHZsgMAAdmfACc0jhGGDXieZzwCXlz89HMAAdoUumWkBAAEnlp4Al6QGl7swwAB2msAAdprAAHnJAACFMgAAAAEDwAB2qMAAeckAAAABAQHAAHazAAAAg+5gg+UAAGDAAPzZAT4LPRzAAHa/LpevAQABFsAAdtiAwAB208AJ0UiEY4NcAJe4PRzAAHbqLpmLAAAAAJeZPRzAAHcCLpmaAgACFsAAdxWAwAB3EMAJ0UiEH4P5J4QpAJeiPRzAAHcyLpmaAgACFsAAd0WAwAB3QMAJ0UiEGYP3J4QjAJeiPRzAAHdeLpmaAgACFsAAd3GAwAB3bMAJ0UiEGoP4J4QkAJeiPRzAAHeOLpmaAgACFsAAd6GAwAB3nMAJ0UiFJIP7J5nQAJeiPRzAAHfLLpmaAgACFsAAd96AwAB32cAJ0UiFJYP8J5nRAJeiPRzAAHgRLpmaAgACFsAAeCSAwAB4H8AJ0UiFLIP/J5nSAJeiPRzAAHheLpluAQABHsAAeGiXGgEAARbAAHiDgMAAeH7ACdFIgmeD6AAAl5dJwAB4jyIiHMAAeKgWwAB4mYDAAHiUwAnRSIT5g2FIAQABKwDAAP0pACEcwAB43RbAAHjVFsAAeMSAwAB4v8AJ0UiEpYNihGGCjkgBAAEWwAB45YDAAHjgwAnRSIRhg14AwAD+XgEiIRzAAHkOFsAAeP+AwAB4+sAJ0UiE+YNhSAEAASsAwAD9KQAhHMAAeUEWwAB5ORbAAHkqgMAAeSXACdFIhPmDYYRhgyJIAQABFsAAeUmAwAB5RMAJ0UiEYYNeAMAA/l4+AT0cwAB5Wy6ZbgEAASTAAHmBAyeZzhbAAHl1gMAAeXDACdFIhGGDXieZzwCXlz89HMAAeY4umZ0CAAEWwAB5oYDAAHmcwAnRSIJqg+oBgL0cwAB5sS6ZXQEAAYDAAHm/wAnRSACXgpelBpe8MMAAec7AAHnOwAB7PgAAhRQAAAABA8AAed7AAHs+AAAAAQEBwAB56wAAAIPuYIOkAABgwAD82QE+Bz0cwAB59y6XrwEAARbAAHoQgMAAegvACdPphGODXACXuD0cwAB6Ii6ZiwAAAACXmT0cwAB6Oi6ZmgIAAhbAAHpNgMAAekjACdPphB+DryeEKQCXoj0cwAB6ai6ZmgIAAhbAAHp9gMAAenjACdPphB2DrieEJwCXoj0cwAB6lC6ZmgIAAhbAAHqngMAAeqLACdPphIeDsCeZ0wCXoj0cwAB6xi6ZbgEAASeY1QCXlz0cwAB65C6ZnQMAARbAAHr3gMAAevLACdPpgmqDqAKAvRbAAHsUgMAAew/ACdPpgL2DXYURFsAAey2AwAB7KMAJ0+mFEYOpl6UGl70wwAB7Q8AAe0PAAH4kAACFGwAAAAEDwAB7ZcAAfiQAAAABAQHAAHuEAAAAg+5gg8MAAGDAAPzZAT4MPRzAAHuQLpevAQABFsAAe6mAwAB7pMAJ1R2EY4NcAJe4PRzAAHu7LpmLAAAAAJeZPRzAAHvTLpmaAgACFsAAe+aAwAB74cAJ1R2EH4PQJ4QpAJeiPRzAAHwDLpmaAgACFsAAfBaAwAB8EcAJ1R2EHYPPJ4QnAJeiPRzAAHwtLpluAQABJ5nUAJeXScAAfFQhHMAAfGIWwAB8XYDAAHxYwAnVHYC9g11IAQABKwCIij4BPRzAAHxzLobxAQABFsAAfIKAwAB8fcAJ1R2AvYNdAJejPz0cwAB8ky6ZnwEAARbAAHyvgMAAfKrACdUdhLiDyACXqz0cwAB8xC6ZoAMAAxbAAHzcgMAAfNfACdUdhLqDyRbAAHz3gMAAfPLACdUdhLuDyxbAAH0VgMAAfRDACdUdhRmDygCXrD0cwAB9Mi6ZgAEAASeAvACXlT0cwAB9SC6ZgQEAARbAAH1vgMAAfWrACdUdhRiDxwCXsEnAAH2FFsAAfZwWwAB9joDAAH2JwAnVHYUXg8aDssAA/Fc+Az0cwAB9sC6ZiAEAASdjAJeUPRzAAH3ILog+AgFgiLMCFsAAfdeAwAB90sAJ1R2FF4PGFsAAfeYumZSXngCXrT0cwAB9+C6ZiAEAASeAlwCXlD89HMAAfhQumWkBAAEnlp4Al6QGl74wwAB+KcAAfinAAIJzAACE7gAAAAEDwAB+M8AAgnMAAAABAQHAAH46AAAAg+5ggxQAAGDAAPzZAT4TPRzAAH5GLpevAQABFsAAfl+AwAB+WsAJ106EY4MZAJe4PRzAAH5xLpmLAAAAAJeZPRzAAH6JLpmaAgACFsAAfpyAwAB+l8AJ106EGoMwJ4QkAJeiPRzAAH65LpluAQABJ5nVAJeXPRzAAH7RLpluAQABHMAAftsumVkBAAGAwAB+6MAJ104Al38Al5c9HMAAfvQumZ8BAAEWwAB/EIDAAH8LwAnXToS4gyMAl6tJwAB/JRbAAH8ugMAAfynACddOhOmDOD4EPRzAAH9KLpmAAQABJ4C8AJeVPRzAAH9iLoT2AQABFsAAf3aAwAB/ccAJ106E1IMkAJegPRzAAH+ILpmAAQABJ5nWAJeVPRzAAH+jLoT2AQABFsAAf7eAwAB/ssAJ106E1YMlAJegScAAf9AhHMAAf+MWwAB/2YDAAH/UwAnXToTUgyRIAQABKwCJaj4CPRzAAH/0LpmAAQABJ5nXAJeVPRzAAIASLoT2AQABFsAAgCaAwACAIcAJ106E1IMkAJegP0nAAIA8FsAAgFYWwACARYDAAIBAwAnXToTWgyaDssAA/Fc+Aj0cwACAai6ZgAEAASeZ2ACXlT0cwACAiy6IPgIBYIlfAhbAAICagMAAgJXACddOhNaDJhbAAICsLoT2l6AAl60/TsAAgMvAAIDZAACZ2WDAAP22ASeGv0nAAIDlIRzAAIEHFsAAgP8WwACA7oDAAIDpwAnXToSlgz6EYYKOSAEAARbAAIEPgMAAgQrACddOhGGDIgDAAP5ePgE9icAAgSDACdlRHMAAgS6BwACBIMAJ2VFkAQABJMAAgUsCJ5naFsAAgUKAwACBPcAJ106EYYMiAMAA/cs/PRzAAIFXLplpAQABgcAAgV/ACdlRAJekPRfAAIF1LoPdHMAAgXMWwACBdS6D3ZdtZAEAAZQAwAD89ZdtPRzAAIGSFsAAgYuAwACBhsAJ106Eg4Mng/gBAAEWwACBmi6G85eaAMAA/EI9HMAAgbwWwACBr4DAAIGqwAnXToTXgyiD+AEAARbAAIHELobzl5oAwAD8Qj0cwACB5BbAAIHZgMAAgdTACddOhIKDKYP4AQABFsAAgewuhvOXmgDAAPxCPRzAAIIgFsAAggGAwACB/MAJ106E2IMqg/gBAAEWwACCKC6G85eaAMAA/EI9F8AAgjoug90cwACCOBbAAII6LoPdl22BjQEAAZQAwAD89pdtPRzAAIJLLpmLAAAAAJeZPRzAAIJjLplpAQABJ4bAAJekBpe/MMAAgnjAAIJ4wACERQAAhL0AAAABA8AAgoTAAIRFAAAAAQEBwACCjQAAAIPuYILvAABgwAD82QE+CD0cwACCmS6XrwEAARbAAIKygMAAgq3ACds/hGOC8gCXuD0cwACCxC6ZiwAAAACXmT0cwACC3C6ZbgEAASeGewCXlz0cwACC9i6ZbgEAARbAAIMFgMAAgwDACds/gL2C8wCXlz0cwACDEC6ZnwEAARbAAIMsgMAAgyfACds/hLiC9ACXqz0cwACDQS6ZgAEAASeAvACXlUnAAINXJcAAg2UWwACDYIDAAINbwAnbP4KQgvVgiQA+AT0cwACDfi6ZsgMAASbAAIOVARbAAIOVgMAAg5DACds/gpCC9WCJAAKZsxbAAIO9gMAAg7jACds/hLqC95m0FsAAg/CAwACD68AJ2z+Eu4L4l6g+AT0cwACEFS6G8wEAARbAAIQkgMAAhB/ACds/gpCC9QCXmj0cwACENS6ZaQEAASeWngCXpAaXwDDAAIRKwACESsAAhPwAAIVyAAAAAQPAAIRgwACE/AAAAAEBAcAAhHMAAACD7mCEsQAAYMAA/NkBPgI9HMAAhH8umW4BAAEnmdsAl5dJwACEpCEcwACEtRbAAIStgMAAhKjACdy6IoSzSAEAASsAwAD9xT4BPRzAAITGLpluAQABJMAAhPEDJ4OuHMAAhNQumdwBAAEWwACE5oDAAIThwAncuiKEswCXyieDrgCXlz8Gl8EwwACFAcAAhQHAAIXjAACFoAAAAAEDwACFFsAAheMAAAABAQHAAIUoAAAAg+5ghZMAAGDAAPzZAT4EPRzAAIU0LpmwAgACFsAAhUmAwACFRMAJ3WyFeYWVasAAhV5gwAD70MAAaa0Al7Y9HMAAhWwumYgBAAEngWoAl5Q9HMAAhYIumd0CAAIWwACFnIDAAIWXwAndbIC9hZYWwACFp4DAAIWiwAndbIV6hZgAl+w9HMAAhcYuhvMBAAEWwACF1YDAAIXQwAndbFuFlwCXmgaXwjDAAIXowACF6MAAhucAAIWKAAAAAQPAAIYDwACG5wAAAAEBAcAAhhsAAACD7mCFHAAAYMAA/NkBPgU9HMAAhicumbACAAIWwACGPIDAAIY3wAnePYV5hR5qwACGUWDAAPvQwABprQCXtj0cwACGXy6ZiAEAASeZ3gCXlD0cwACGdy6ZgQEAARbAAIaegMAAhpnACd49hRiFHwCXsD0cwACGtC6ZiAEAASeGwACXlD0cwACGyi6G8wEAARbAAIbZgMAAhtTACd49W4UgAJeaBpfDMMAAhuzAAIbswACHuAAAhaIAAAABA8AAhwbAAIe4AAAAAQEBwACHHQAAAIPuYIWmAABgwAD82QE+BD0cwACHKS6ZbgEAASeZ3wCXlz0cwACHQS6ZiAEAASeBagCXlD0cwACHVy6Z3QIAAhbAAIdxgMAAh2zACd8OgL2FqBbAAId8gMAAh3fACd8OhXqFqgCX7D0cwACHmy6G8wEAARbAAIeqgMAAh6XACd8OW4WpAJeaBpfEMMAAh73AAIe9wACIdAAAhaQAAAABA8AAh9LAAIh0AAAAAQEBwACH5AAAAIPuYIW4AABgwAD82QE+Az0cwACH8C6ZmgIAAhbAAIgDgMAAh/7ACd/ChB2FvCeEJwCXoj0cwACIGi6ZgQEAARbAAIhBgMAAiDzACd/ChRiFugCXsD0cwACIVy6G8wEAARbAAIhmgMAAiGHACd/CW4W7AJeaBpfFMMAAiHnAAIh5wACJPwAAhaYAAAABA8AAiJPAAIk/AAAAAQEBwACIqgAAAIPuYIXLAABgwAD82QE+Az0cwACIti6ZbgEAASMWwACIxYDAAIjAwAngZIQdhc8nhCcnmeABYMAA/bYAl5c9HMAAiOUumYEBAAEWwACJDIDAAIkHwAngZIUYhc0Al7A9HMAAiSIuhvMBAAEWwACJMYDAAIkswAngZFuFzgCXmgaXxjDAAIlEwACJRMAAiacAAIWtAAAAAQPAAIlMwACJpwAAAAEBAcAAiVEAAACD7mCF6wAAYMAA/NkBPgI9HMAAiV0umYgBAAEnmeEAl5Q9HMAAiXMumbACAAIWwACJiIDAAImDwAnhEIWshe1qwACJnGDAAPvQwACDwQCXtgaXxzDAAImswACJrMAAip0AAIWyAAAAAQPAAInCwACKnQAAAAEBAcAAidUAAACD7mCF9gAAYMAA/NkBPgROwACJ5cAAifAAAJniYMAA+9ABHMAAig1qwACJ/V3AAPylAmDAAP22YMAA+9DAAJL2SwEAARbAAIoTgMAAig7ACeGOhbCF+QDAAPy5PRzAAIoiLpmwAgACFsAAijeAwACKMsAJ4Y6Fr4X4gcAAij3ACeGlAJe2PRzAAIpOLpmAAQABFsAAil+AwACKWsAJ4Y6FsIX5AJeVPRzAAIpuLpmwAgACFsAAioOAwACKfsAJ4Y6FsYX6HMAAipWBwACKisAJ4aVkAQABlADAAPz1AJe2BpfIMMAAiqLAAIqiwACLzwAAhbcAAAABA8AAirzAAIvPAAAAAQEBwACK0wAAAIPuYIYDAABgwAD82QE+CD0cwACK3y6ZsAIAAhbAAIr0gMAAiu/ACeKbhbSGBWrAAIsKYMAA+9CBVQCXtj0cwACLGy6ZhwAAAACXkz0cwACLLi6CigEAASeA9ACXkT0cwACLPi6Z5QEAARbAAItTgMAAi07ACeKbhbaGCACX7T0cwACLZC6ZhgAAAACXkj0cwACLdi6ZsAEAARbAAIuLgMAAi4bACeKbga2GBgCXtj0cwACLli6ZgAEAASeC5gCXlT0cwACLrC6ZsAEAARbAAIvBgMAAi7zACeKbhbWGBwCXtgaXyTDAAIvUwACL28AAjewAAJnmAAAAAQPAAIvuwACN7AAAAAEBAcAAi/MAAACYL2DAAPvQAABgwAD9tgE+AUfAAIwDgMAAjAvACeOqCQHAAIwiasAAjCJgwAD70IPvAD4BSsAAjC0BJ4QNAcAAjEZqwACMRmDAAPvQg/IAPgFKwACMUgEnhA4BwACMa2rAAIxrYMAA+9DAAI0kAD4BSsAAjHcBJ5nnAcAAjJBqwACMkGDAAPvQwACMWwA+AUrAAIycASeZ6AHAAIy1asAAjLVgwAD70IP1AD4BSsAAjMEBJ4QPAcAAjNpqwACM2mDAAPvQg+wAPgFKwACM5gEnhAwBwACM/2rAAIz/YMAA+9Ct/wA+AUrAAI0LASeZ6QHAAI0kasAAjSRgwAD70IQDAD4BSsAAjTABJ4QQAAE+AUnAAI1VIhzAAI1igMAAjVnACeOqYwEAATcgAMAA/P0BHMAAjXOAwACNasAJ46qAlwEAATd+AMAA/P8+AUrAAI2GARzAAI2TJ4QHZAEAARzAAI2hJMAAjaABgMAAjZfACeOqkjkCAAKXJ4QIAMAA/dEAwAD9yz4BSsAAjc0BKwaXyjDAAI3xwACN+MAAj5cAAJncAAAAAQPAAI4EwACPlwAAAAEBAcAAjgwAAACD7GDAAP22AABgwAD9tgE+A07AAI4nAAAAgotgwAD+AABFwACOMwHAAI48wACOPgAAYmDAAPvQAZMBHMAAjkWCwACOQ8AJ5ZRjAQABFsAAjk6AwACOR8AJ5WZhwAD9ugDAAPz9AYrAAI5YwAnllBzAAI5WgsAAjljACeWUZAEAAZQAwAD89T4CTsAAjmrAAI50AACULWDAAP22ARzAAI52LpnmAQABHMAAjpGAwACOisAJ5WaECwEAAYLAAI6cwAnllADAAP3EAJfJScAAjqchHMAAjrWDwACOq8AJ5fZIAQABKwDAAP3FPgI9IxzAAI7PgcAAjsjACeV/SAEAASsAwAD9KYnAAI7IwAnlfx/AAI7XwAD+HwEAARzAAI7rgMAAjuTACeVmgL4CAAKTgsAAjvjACeWUAMAA/cwAKwFgwAD+AD0cwACPDIHAAI8FwAnlf4KKAQABg8AAjxLACeX2AMAA/hQ+AT01AAAAAQBgwAD+AAGBwACPNcAJ5X8jHMAAjz2EAMAJ5tZIAQABKwAAKxzAAI89hADACebWgooBAAEcwACPSYDAAI9DwAnlZksBAAGCwACPSsAJ5ZQAwAD9wwDAAP4UAVxKwACPYQEjHMAAj2+BwACPaMAJ5X9IAQABKwDAAP0pgMAAj3nACeVmHMAAj4mBwACPgsAJ5X8jAAAAAMAA/hkBYMAA/bYGl8swwACPnMAAj5zAAJElAACFuwAAAAEDwACPtMAAkSUAAAABAQHAAI/JAAAAg+5ghhEAAGDAAPzZAT4FScAAj9UcwACP3xbAAI/ZLoJOl3VIAQABGsAAj+KXcwDAAPzzPgE9HMAAj/AumYYAAAAAl5I/PRzAAJAILoKKAQABJ4OuAJeRRsAAkBjAAJA7wACQIQAAAJnqYISpABbAAJAugMAAkCnACeehhbmGEz4BScAAkEMlwACQTIHAAJBHwAnoCGCGeD4BPRzAAJBoLpmIAQABHMAAkHQumdwBAAEWwACQhhTAAJCBwAnoCAEBYIZ4gJaGegCXygCXlD4DPRzAAJCmLpmIAQABJ5nrAJeUPRzAAJDCLpmwAQABgcAAkNLACegIAJe2PRzAAJDhLpmIAQABJ4bAAJeUPRzAAJEFLoKKAQABJ4OuAJeRPRfAAJEVLoJOGsAAkR2Xc5d1BpfMMMAAkSrAAJEqwACR+gAAhcAAAAABA8AAkUDAAJH6AAAAAQEBwACRUwAAAIPuYIYcAABgwAD82QE+Ak7AAJFkwACRagAAgxlgwAD6CgEpRsAAkXbAAJGawACRhgAAAJnqYISpABbAAJGTgMAAkY7ACej+hb6GHz4DScAAkaIhgcAAkafACekVPRzAAJGuLpmAAQABJ2QAl5U/PRzAAJHGLpmwAQABgsAAkdbACekxAJe2PYnAAJHjwAnpFSoGl80wwACR/8AAkf/AAJLMAACFxAAAAAEDwACSFMAAkswAAAABAQHAAJImAAAAg+5ghigAAGDAAPzZAT4CTsAAkjfAAJI9AACDGWDAAPoKASlGwACSScAAkmzAAJJZAAAAmepghKkAFsAAkmaAwACSYcAJ6b2FwoYrPgNJwACSdCGBwACSecAJ6dQ9HMAAkoAumYABAAEnZACXlT89HMAAkpgumbABAAGCwACSqMAJ6fAAl7Y9icAAkrXACenUKgaXzjDAAJLRwACS0cAAk54AAIXKAAAAAQPAAJLmwACTngAAAAEBAcAAkvgAAACD7mCGNAAAYMAA/NkBPgJOwACTCcAAkw8AAIMZYMAA+goBKUbAAJMbwACTPsAAkysAAACZ6mCEqQAWwACTOIDAAJMzwAnqfIXIhjg+A0nAAJNGIYHAAJNLwAnqkz0cwACTUi6ZgAEAASdkAJeVPz0cwACTai6ZsAEAAYLAAJN6wAnqrwCXtj2JwACTh8AJ6pMqBpfPMMAAk6PAAJOjwACX0gAAhdAAAAABA8AAk7jAAJfSAAAAAQEBwACTygAAAIPuYIZBAABgwAD82QE+CD0cwACT1i6ZmAEAARbAAJP8gMAAk/fACes7hcyGQwCXrknAAJQRFsAAlCgWwACUGoDAAJQVwAnrO4UXhkSDssAA/Fc+Az0cwACUPC6ZiAEAASdjAJeUPRzAAJRULog+AgFgiLMCFsAAlGOAwACUXsAJ6zuFF4ZEFsAAlHIumZSXngCXrT0cwACUhC6ZiAEAASeAlwCXlD89HMAAlKAumYgBAAEnma4Al5ROwACUu8AAlMEAAIMZYMAA+goBKT0cwACU3hbAAJTSgMAAlM3ACes7hc2GRYP4AQABNMAAlOYDwACU5sAAlcMAAAACAgLAAJTxAAAAhdFggnsAwACVBgAAAICWYISpAABgwAD82QE+BUnAAJUVIYHAAJUawAnr+z4BPRzAAJUrLpmJAAAAAJeWPz0cwACVRy6ZbgEAASTAAJVwARbAAJVqFsAAlWUWwACVXYLAAJVUwAnsP4RugoWAvYNdgL2IgQCXlz0cwACVeS6ZiAEAASeC5gCXlD0cwACVkS6ZsAEAAYPAAJWhwAnsTACXtj2JwACVr8AJ6/sqAMAA/MRGwACVysAAlfjAAJXfAAAAmexgh40AFsAAle+AwACV6sAJ6zuFzoZGPgZJwACWACGBwACWBcAJ6/s+AT0cwACWFi6ZiQAAAACXlj89HMAAljIugooBAAEnme0Al5E9HMAAlkoumbABAAEWwACWYoLAAJZawAns/4W0h48Al7ZJwACWdCEcwACWiBbAAJaAgsAAlnjACez/IoeQSAEAASsAwAD9KT4CPRzAAJabLpmJAAAAAJeWPRzAAJaxLpmwAQABFsAAlsmCwACWwcAJ7P8ih5AAl7Y/PRzAAJbhLoKKAQABJ4MhAJeRPYnAAJbzwAnr+ypGwACXDMAAl0TAAJccAAAAme5ghKkAFsAAlzOAwACXLsAJ6zuFz4ZHPgNJwACXTCGBwACXUcAJ6/s+AT0cwACXYi6ZiQAAAACXlj89HMAAl34umbABAAGCwACXjsAJ7fIAl7Y9icAAl6XACev7Kj0cwACXvi6ZiAEAASeGwACXlAaX0DDAAJfXwACX18AAmGsAAIXUAAAAAQPAAJfowACYawAAAAEBAcAAl/YAAACD7mCGUgAAYMAA/NkBPgM9HMAAmAIumbACAAIWwACYF4DAAJgSwAnukIWshlRqwACYK2DAAPvQgz4Al7Y9HMAAmDwumYABAAEnme8Al5U9HMAAmFMumZQBAAEWwACYYoDAAJhdwAnukIKQhlUAl54Gl9EwwACYcMAAmHDAAJkpAACF2AAAAAEDwACYgcAAmSkAAAABAQHAAJiPAAAAg+5ghl4AAGDAAPzZAT4DPRzAAJibLpmwAgACFsAAmLCAwACYq8AJ7y2FrIZhasAAmMRgwAD70IM+AJe2PRzAAJjVLpmAAQABIxbAAJjmgMAAmOHACe8thdeGZSeZ8CeZgwFgwAD9tgCXlT0cwACZES6ZlAEAARbAAJkggMAAmRvACe8tgpCGYgCXngaX0jDAAJkuwACZLsAAmYoAAIXnAAAAAQPAAJlAwACZigAAAAEBAcAAmU8AAACD7mCGpQAAYMAA/NkBPgI9HMAAmVsumYgBAAEnhq8Al5Q9HMAAmXEumW4BAAEWwACZgIDAAJl7wAnv5oCWhqcAl5cGl9MwwACZj8AAmY/AAJnQAACF6QAAAAEDwACZn8AAmdAAAAABAQHAAJmsAAAAg+5ghrAAAGDAAPzZAT4BPRzAAJm4LpmUAQABFsAAmceAwACZwsAJ8FaCkIayAJeeBpfUMMAAmdXAAJnVwACaGQAAhesAAAABA8AAmejAAJoZAAAAAQEBwACZ+AAAAIPuYIa7AABgwAD82QE+AT0cwACaBC6ZbgEAASeZ8QCXlwaX1TDAAJoewACaHsAAmlcAAIXtAAAAAQPAAJoqwACaVwAAAAEBAcAAmjMAAACD7mCGxAAAYMAA/NkBPgE9HMAAmj8umW4BAAEnmfIAl5cGl9YwwACaXMAAmlzAAJrHAACF7wAAAAEDwACaZsAAmscAAAABAQHAAJptAAAAg+5ghs0AAGDAAPzZAT4DPRzAAJp5LpluAQABJ5nzAJeXPRzAAJqRLpmGAAAAAJeSPRzAAJqjLpmwAQABFsAAmriAwACas8AJ8VKCa4bPAJe2BpfXMMAAmszAAJrMwACcFgAAhfEAAAABA8AAmtzAAJwWAAAAAQEBwACa6QAAAIPuYIbYAABgwAD82QE+BUnAAJr1FsAAmv6AwACa+cAJ8dGEHYbaPgI9HMAAmw8umW4BAAEnhCcAl5c9HMAAmykumYYAAAAAl5I/ScAAm0EhHMAAm1cWwACbSoDAAJtFwAnx0YW9httIAQABKwCItz4DPRzAAJtoLpmIAQABJ2MAl5Q9HMAAm4AumZQBAAEWwACbj4DAAJuKwAnx0YW9htsAl549HMAAm6QumYgBAAEngJcAl5Q/PRzAAJvALpmIAQABJ5mOAJeUPRzAAJvWLog+AgFghKkCFsAAm+WAwACb4MAJ8dGFuYbcFsAAm/IuhvOXmgCXrT0cwACcAi6ZiAEAASeZjwCXlAaX2DDAAJwbwACcG8AAnWMAAIXzAAAAAQPAAJwqwACdYwAAAAEBAcAAnDYAAACD7mCG5QAAYMAA/NkBPgVJwACcQhbAAJxLgMAAnEbACfMHhB2G5z4CPRzAAJxcLpluAQABJ4QnAJeXPRzAAJx2LpmGAAAAAJeSP0nAAJyOIRzAAJykFsAAnJeAwACcksAJ8weFvYboSAEAASsAiLc+Az0cwACctS6ZiAEAASdjAJeUPRzAAJzNLpmUAQABFsAAnNyAwACc18AJ8weFvYboAJeePRzAAJzxLpmIAQABJ4CXAJeUPz0cwACdDS6ZiAEAASeZrgCXlD0cwACdIy6IPgIBYISpAhbAAJ0ygMAAnS3ACfMHhbmG6RbAAJ0/Lobzl5oAl609HMAAnU8umYgBAAEnhsAAl5QGl9kwwACdaMAAnWjAAJ6/AACF9QAAAAEDwACdd8AAnr8AAAABAQHAAJ2DAAAAg+5ghvIAAGDAAPzZAT4FScAAnY8WwACdmIDAAJ2TwAn0PYQdhvQ+Aj0cwACdqS6ZbgEAASeEJwCXlz0cwACdwy6ZhgAAAACXkj9JwACd2yEcwACd7BbAAJ3kgMAAnd/ACfQ9hcaG9UgBAAErAIi3PgM9HMAAnf0umYgBAAEnYwCXlD0cwACeFS6IPgIBYIizAjHAAJ4fYIizAhbAAJ4lgMAAniDACfQ9hcaG9RbAAJ4zgMAAni7ACfQ9hceG9hbAAJ4/LpmUl54Al609HMAAnlEumYgBAAEngJcAl5Q/PRzAAJ5tLpmIAQABJ5muAJeUPRzAAJ6DLog+AgFghwACFsAAnpKAwACejcAJ9D2D0Ib3FsAAnpsuhvOXmgCXrT0cwACeqy6ZiAEAASeGwACXlAaX2jDAAJ7EwACexMAAnzoAAIX3AAAAAQPAAJ7RwACfOgAAAAEBAcAAntsAAACD7mCHAAAAYMAA/NkBPgM9HMAAnucumbABAAEWwACe/IDAAJ73wAn1m4PRhwIAl7Y9HMAAnwYumYkBAAEnguYAl5Y9HMAAnxsumbABAAEWwACfMIDAAJ8rwAn1m4CWhwMAl7YGl9swwACfP8AAnz/AAJ+pAACF+gAAAAEDwACfU8AAn6kAAAABAQHAAJ9kAAAAg+5ghwoAAGDAAPzZAT4CPRzAAJ9wLpluAQABJ5n0AJeXPRzAAJ+ILpmwAQABFsAAn52AwACfmMAJ9iyFrIcMAJe2BpfcMMAAn67AAJ+uwACgGwAAhf0AAAABA8AAn8XAAKAbAAAAAQEBwACf2QAAAIPuYIcaAABgwAD82QE+AT0cwACf5S6ZnQIAARbAAJ/4gMAAn/PACfacgmqHHAGZniqXpQaX3TDAAKAgwACgIMAAoHsAAIXbAAAAAQPAAKAywACgewAAAAEBAcAAoEEAAACD7mCGeAAAYMAA/NkBPgE9HMAAoE0umW4BAAEkwACgdgMng64cwACgWy6Z3AEAARbAAKBtgMAAoGjACfb9gJaGegCXyieDrgCXlwaX3jDAAKCAwACggMAAoMUAAIXdAAAAAQPAAKCPwACgxQAAAAEBAcAAoJsAAACD7mCGgQAAYMAA/NkBPgE9HMAAoKcumW4BAAEkwACgwAEWwACguYDAAKC0wAn3dYCWhoMAl5cGl98wwACgysAAoMrAAKEVAACF4AAAAAEDwACg3MAAoRUAAAABAQHAAKDrAAAAg+5ghooAAGDAAPzZAT4BPRzAAKD3LpluAQABJMAAoRABFsAAoQmAwAChBMAJ99mAloaMAJeXBpfgMMAAoRrAAKEawAChYQAAheIAAAABA8AAoSrAAKFhAAAAAQEBwAChNwAAAIPuYIaTAABgwAD82QE+AT0cwAChQy6ZbgEAASTAAKFcARbAAKFVgMAAoVDACfg9gJaGlQCXlwaX4TDAAKFmwAChZsAAoaQAAIXkAAAAAQPAAKF2wAChpAAAAAEBAcAAoYMAAACD7mCGnAAAYMAA/NkBPgE9HMAAoY8umW4BAAEnhDwAl5cGl+IwwAChqcAAoanAAKI6AACGAwAAAAEDwAChscAAojoAAAABAQHAAKG2AAAAg+5ghzEAAGDAAPzZAT4EPRzAAKHCLpluAQABJ5n1AJeXPRzAAKHYLpfAAQABFsAAofaAwACh8cAJ+PCCbIczAJgNPRzAAKIFLpmAAQABJ5n2AJeVPRzAAKIcLpmwAQABFsAAojGAwACiLMAJ+PCCaYc0AJe2BpfjMMAAoj/AAKI/wACi/wAAhgUAAAABA8AAolPAAKL/AAAAAQEBwACiZAAAAIPuYIc9AABgwAD82QE+BD0cwACicC6ZgAEAASeZ9wCXlT0cwACiii6Z+AIAARbAAKKjFsAAop6AwACimcAJ+ZOCaYc/hhCHcQGGmSmX9z0cwACiyC6ZiAEAASeZ+QCXlD0cwACi4C6ZsAEAARbAAKL1gMAAovDACfmTgJaHQACXtgaX5DDAAKMEwACjBMAAo68AAIWqAAAAAQPAAKMWwACjrwAAAAEBAcAAoyUAAACD7mCF3wAAYMAA/NkBPgQ9HMAAozEumbABAAEWwACjRoDAAKNBwAn6QoJrheEAl7Y9HMAAo1cumYgBAAEnYwCXlD0cwACjbS6IPgIBYIizAhbAAKN8gMAAo3fACfpChReF4hbAAKOLLpmUl54Al609HMAAo5sumYgBAAEngJcAl5QGl+UwwACjtMAAo7TAAKRYAACGCAAAAAEDwACjxMAApFgAAAABAQHAAKPRAAAAg+5gh0kAAGDAAPzZAT4FPRzAAKPdLpluAQABJ4YGAJeXPRzAAKP7LpmIAQABJ4PXAJeUPRzAAKQRLpluAQABFsAApCcWwACkIIDAAKQbwAn68YSih0uAvYLAAJeXPRzAAKQyLpmIAQABJ4MhAJeUPRfAAKRILoJOGsAApFCXc5d1BpfmMMAApF3AAKRdwAClHAAAhgsAAAABA8AApHbAAKUcAAAAAQEBwACkjAAAAIPuYIdUAABgwAD82QE+BT0cwACkmC6ZbgEAASeGCQCXlz0cwACkvy6ZiAEAASeD1wCXlD0cwACk1S6ZbgEAARbAAKTrFsAApOSAwACk38AJ+6CEoodWgL2CwACXlz0cwACk9i6ZiAEAASeDIQCXlD0XwAClDC6CThrAAKUUl3OXdQaX5zDAAKUhwAClIcAApdEAAISuAAAAAQPAAKUxwACl0QAAAAEBAcAApT4AAACD7mCC1QAAYMAA/NkBPgU9HMAApUoul68BAAEWwAClY4DAAKVewAn8T4RjgtcAl7g9HMAApXUumYsAAAAAl5k9HMAApY0umW4BAAEnmeoAl5c9HMAApaQumW4BAAEWwACls4DAAKWuwAn8T4StgtgAl5c9HMAApcEumWkBAAEnlp4Al6QGl+gwwACl1sAApdbAAKf3AACEqwAAAAEDwACl7MAAp/cAAAABAQHAAKX/AAAAg+5ggrsAAGDAAPzZAT4IPRzAAKYLLpmLAAAAAJeZPRzAAKYjLpluAQABIxbAAKYygMAApi3ACf0BhKiCyCeEoieEowFgwAD9tgCXl07AAKZbAAAAiHhbAEnAAKZqIRzAAKaSNQAAAAEAYIJ7ARbAAKZzgMAApm7ACf0BhJyCvyMcwACmjYIAwAn9bEgBAAErAAArFsAApo2CAMAJ/WyD7oJ+AWCCaEgBAAErAMAA/Sk+AT2JwACmo8AJ/VUkwACm0AEWwACmxRbAAKa3gMAAprLACf0BhKaCxoR3go0+AT2JwACm5cAJ/VUkwACnKAE1AAAAAQBgmnoBNQAAAAEAYIJ7ARbAAKb5gMAApvTACf0BhJyCvyMcwACnE4IAwAn+AkgBAAErAAArFsAApxOCAMAJ/gKEX4J9AWCaeiMcwACnIoIAwAn9+EgBAAErAAArFsAApyKCAMAJ/fiAvZqAAWDAAP22PRzAAKc0LpluAQABJMAAp0wDJ4OugcAAp0HACf1VJ4OuAJeXScAAp1MWwACnXIDAAKdXwAn9AYSpgsk+AT0cwACncC6ZbgEAASeZ+gCXlz9JwACnkSEcwACnnxbAAKeagMAAp5XACf0BgL2CwEgBAAErAMAA/cU+Aj0cwACnsC6ZbgEAASeZgwCXlz0cwACnxy6ZbgEAARbAAKfWgMAAp9HACf0BgL2CwACXlz89HMAAp+cumWkBAAEnlp4Al6QGl+kwwACn/MAAp/zAAKhJAACX2QAAAAEDwACoDcAAqEkAAAABAQHAAKgZAAAAg+5ghKkAAGDAAPzZAT4BPRzAAKglLpluAQABJMAAqEQBFsAAqDeAwACoMsAJ/1OFgMAA/TAAl5cGl+owwACoTsAAqE7AAKkzAACFdQAAAAEDwACoXsAAqTMAAAABAQHAAKhrAAAAg+5ghLwAAGDAAPzZAT4CPRzAAKh3LpnEAQABFsAAqJOAwACojsAJ/7mCbIS+AJe0ScAAqKIhHMAAqLgWwACoq4DAAKimwAn/uYV0hL9IAQABKwCItz4EPRzAAKjJLpmIAQABJ5muAJeUPRzAAKjhLobzAQABFsAAqPCAwACo68AJ/7mFdIS/AJeaPRzAAKkFLpmIAQABJ4bAAJeUPRfAAKkdLoJOGsAAqSWXc5d1PwaX6zDAAKk4wACpOMAAqcEAAIV3AAAAAQPAAKlIwACpwQAAAAEBAcAAqVUAAACD7mCEyAAAYMAA/NkBPgM9HMAAqWEumcQBAAEWwACpfYDAAKl4wAoAloJshMoAl7Q9HMAAqYwumYABAAEngLwAl5U9HMAAqaIumbABAAEWwACpt4DAAKmywAoAloCWhMsAl7YGl+wwwACpxsAAqcvAAKqmAACZ3QAAAAEDwACp38AAqqYAAAACAgLAAKnlAAAAgL1giH4AwACp9QAAAIJFYIJ7AABcAT4BScAAqgMhHMAAqg6BwACqB8AKATRIAQABKwDAAP0pPgM9HMAAqh8umYgBAAEnma4Al5Q9HMAAqjcumYEBAAGBwACqWcAKATQAl7A9HMAAqmgumYgBAAEnhsAAl5Q+AT0cwACqjS6G8QEAAYDAAKqXwAoBJwCXowaX7TDAAKqrwACqsMAAqzgAAJnlAAAAAQPAAKq/wACrOAAAAAEBAcAAqskAAACCkGCIswAAXAE+AUnAAKrVIRzAAKregMAAqtnACgHjSAEAASsAiLc+Az0cwACq7y6ZiAEAASeZrgCXlD0cwACrBy6ZlAEAAYDAAKsRwAoB4wCXnj0cwACrHi6ZiAEAASeGwACXlD8Gl+4wwACrPcAAqz3AAKv2AACFggAAAAEDwACrTcAAq/YAAAABAQHAAKtaAAAAg+5ghNQAAGDAAPzZAT4DPRzAAKtmLpmwAgACFsAAq3uAwACrdsAKAneFeYTWasAAq5BgwAD70MAAaa0Al7Y9HMAAq54umYgBAAEngWoAl5Q9HMAAq7Qumd0CAAIWwACrzoDAAKvJwAoCd4C9hNcWwACr2YDAAKvUwAoCd4V6hNgAl+wGl+8wwACr+8AAq/vAAKzrAACFhAAAAAEDwACsC8AArOsAAAABAQHAAKwYAAAAg+5ghOYAAGDAAPzZAT4FPRzAAKwkLpmwAgACFsAArDmAwACsNMAKAyiFeYToasAArE5gwAD70MAAaa0Al7Y9HMAArFwumYgBAAEngWoAl5Q9HMAArHIumd0CAAIWwACsjIDAAKyHwAoDKIC9hOkWwACsl4DAAKySwAoDKIV6hOsAl+w9HMAArLYumYABAAEngLwAl5U9HMAArMwumbABAAEWwACs4YDAAKzcwAoDKICWhOoAl7YGl/AwwACs8MAArPDAAK2TAACFkAAAAAEDwACtBcAArZMAAAABAQHAAK0XAAAAg+5ghS8AAGDAAPzZAT4DPRzAAK0jLpluAQABJ5nfAJeXPRzAAK07LpmIAQABJ4FqAJeUPRzAAK1RLpndAgACFsAArWuAwACtZsAKBAyAvYUxFsAArXaAwACtccAKBAyFeoUyAJfsBpfxMMAArZjAAK2YwACucgAAhZIAAAABA8AAra3AAK5yAAAAAQEBwACtvwAAAIPuYIVAAABgwAD82QE+BT0cwACtyy6ZbgEAASeZ3wCXlz0cwACt4y6ZiAEAASeBagCXlD0cwACt+S6Z3QIAAhbAAK4TgMAArg7ACgSggL2FQhbAAK4egMAArhnACgSghXqFRACX7D0cwACuPS6ZgAEAASeAvACXlT0cwACuUy6ZsAEAARbAAK5ogMAArmPACgSggJaFQwCXtgaX8jDAAK53wACud8AAr00AAIWGAAAAAQPAAK6NwACvTQAAAAEBAcAArqAAAACD7mCE+QAAYMAA/NkBPgQ9HMAArqwumbACAAIWwACuwYDAAK68wAoFZ4V5hPtqwACu1mDAAPvQwABprQCXtj0cwACu5C6ZiAEAASeZ3gCXlD0cwACu/C6ZgQEAARbAAK8jgMAArx7ACgVnhRiE/ACXsD0cwACvOS6ZiAEAASeGwACXlAaX8zDAAK9SwACvUsAAsF8AAIWIAAAAAQPAAK9owACwXwAAAAEBAcAAr3sAAACD7mCFCgAAYMAA/NkBPgY9HMAAr4cumbACAAIWwACvnIDAAK+XwAoGGIV5hQxqwACvsWDAAPvQwABprQCXtj0cwACvvy6ZiAEAASeZ3gCXlD0cwACv1y6ZgQEAARbAAK/+gMAAr/nACgYYhRiFDQCXsD0cwACwFC6ZiAEAASeGwACXlD0cwACwKi6ZgAEAASeAvACXlT0cwACwQC6ZsAEAARbAALBVgMAAsFDACgYYgJaFDgCXtgaX9DDAALBkwACwZMAAsMQAAIWUAAAAAQPAALBywACwxAAAAAEBAcAAsH0AAACD7mCFUgAAYMAA/NkBPgE9HMAAsIkumYEBAAEWwACwsIDAALCrwAoG/IUYhVQAl7AGl/UwwACwycAAsMnAALFgAACFlgAAAAEDwACw18AAsWAAAAABAQHAALDiAAAAg+5ghWIAAGDAAPzZAT4DPRzAALDuLpmBAQABFsAAsRWAwACxEMAKB1qFGIVkAJewPRzAALErLpmAAQABJ4C8AJeVPRzAALFBLpmwAQABFsAAsVaAwACxUcAKB1qAloVlAJe2Bpf2MMAAsWXAALFlwACx7AAAhg4AAAABA8AAsX3AALHsAAAAAQEBwACxkgAAAIPuYIdlAABgwAD82QE+Az0cwACxni6ZiwAAAACXmT0cwACxti6ZsAEAARbAALHLgMAAscbACgfrgmuHZwCXtj0cwACx3C6ZaQEAASeWngCXpAaX9zDAALHxwACx9sAAs1MAAJn4AAAAAQPAALIEwACzUwAAAAIBAcAAshUAAACGEF3AAPx0AWCHXwABwACyJwAAAIaZYMAA+goBasAAsjZgwAD6CgBcAT4HScAAskQWwACyU4DAALJIwAoIaoFVwAD8Vj4CPSOBwACyZMAKCH4cwACycy6ZiAEAASeZrQCXlBzAALKHLplpAQABJ5mtAJekAVxKwACynAA/PRzAALKuLplpAQABJ5muAJekPRfAALLCLoPdHMAAssAWwACywi6D3ZdtZAEAAZQAwAD89ZdtPRzAALLegMAAstPACghqg/gBAAEWwACy5i6G85eaAMAA/EI9F8AAsvgug90cwACy9hbAALL4LoPdl22BjQEAAZQAwAD89pdtPRzAALMJLpmLAAAAAJeZPSOBwACzIcAKCH4cwACzMC6ZiAEAASeGwACXlBzAALNDLplpAQABJ4bAAJekAVwGl/gwwACzWMAAs1jAALOwAACGEgAAAAEDwACzYsAAs7AAAAABAQHAALNpAAAAg+5gh28AAGDAAPzZAT4CPRzAALN1LpmLAAAAAJeZPRzAALONLpn4AQABFsAAs6GAwACznMAKCdCGEIdxAJf3Bpf5MMAAs7XAALO1wAC0NAAAhhUAAAABA8AAs8XAALQ0AAAAAQEBwACz0gAAAIPuYId6AABgwAD82QE+Az0cwACz3i6ZiwAAAACXmT0cwACz9i6ZgAEAASeZ+wCXlT0cwAC0ES6Z+AEAARbAALQlgMAAtCDACgo9hhCHfACX9waX+jDAALQ5wAC0OcAAtJAAAIYXAAAAAQPAALRMwAC0kAAAAAEBAcAAtFwAAACD7mCHhQAAYMAA/NkBPgI9HMAAtGgumYsAAAAAl5k9HMAAtIAumWkBAAEnlp4Al6QGl/swwAC0lcAAtJXAALYmAACGGwAAAAEDwAC0qcAAtiYAAAACAQHAALS6AAAAg+5gh40AAcAAtMYAAACGmWDAAPoKAWrAALTVYMAA+goAYMAA/NkBPgZJwAC04yGBwAC06MAKCyg+AT0cwAC0/i6ZiwAAAACXmT89HMAAtRwumW4BAAEnmfsAl5c9HMAAtTUumYgBAAEng9cAl5Q9HMAAtUsumbABAAEWwAC1YIDAALVbwAoLGoW0h48Al7ZJwAC1cCEcwAC1gRbAALV5gMAAtXTACgsaIoeQSAEAASsAwAD9KT4CPRzAALWSLpmJAAAAAJeWPRzAALWmLpmwAQABFsAAtbuAwAC1tsAKCxoih5AAl7Y/ScAAtc8hgcAAtdTACgsoPgE9HMAAteoumWkBAAEnmfwAl6Q+AT0cwAC2DC6ZiAEAASeDIQCXlAaX/DDAALYrwAC2K8AAttoAAIYdAAAAAQPAALZAwAC22gAAAAEBAcAAtlIAAACD7mCHmgAAYMAA/NkBPgQ9HMAAtl4umYsAAAAAl5k9HMAAtnYumW4BAAEmwAC2jwEcwAC2jxbAALaALplIl2iZOQEAAYDAALakwAoMZgCXWGDAAP22AJeXPRzAALawLplpAQABJ4LmAJekPRzAALbCLobzAQABFsAAttGAwAC2zMAKDGaCaYecAJeaBpf9MMAAtt/AALbfwAC3jwAAhh8AAAABA8AAtvLAALePAAAAAQEBwAC3AgAAAIPuYIekAABgwAD82QE+BD0cwAC3Di6ZiwAAAACXmT0cwAC3Ji6ZbgEAASeZ/QCXlz0cwAC3Pi6ZbgEAASbAALdXARzAALdXFsAAt0gumUiXaJk5AQABFsAAt3GAwAC3bMAKDR+CRYemAJdYYMAA/bYAl5c9HMAAt38umWkBAAEnlp4Al6QGl/4wwAC3lMAAt5TAALheAACGIQAAAAEDwAC3p8AAuF4AAAABAQHAALe3AAAAg+5gh64AAGDAAPzZAT4GPRzAALfDLpmLAAAAAJeZPRzAALfbLpmAAQABJ5n+AJeVPRzAALf1LpmIAQABJ4PXAJeUPRzAALgLLpmwAQABFsAAuCCAwAC4G8AKDdKFtIewAJe2PRzAALgwLpmIAQABJ4MhAJeUPRzAALhGLpmxAQABFsAAuFWAwAC4UMAKDdKCaYexAJepBpf/MMAAuGPAALhjwAC5UAAAhiMAAAABA8AAuHPAALlQAAAAAQEBwAC4gAAAAIPuYIe5AABgwAD82QE+CD0cwAC4jC6ZiwAAAACXmT0cwAC4pC6ZbgEAASeZ/wCXlz0cwAC4uS6ZsQEAARbAALjIgMAAuMPACg6WgmmHuwCXqT0cwAC40y6ZiwAAAACXmT0cwAC46y6ZgAEAASeZ/gCXlT0cwAC5BS6ZiAEAASeD1wCXlD0cwAC5Gy6ZsAEAARbAALkwgMAAuSvACg6WhbSHvACXtj0cwAC5QC6ZaQEAASeDIQCXpAaYADDAALlVwAC5VcAAutQAAIYnAAAAAQPAALlmwAC61AAAAAEBAcAAuXQAAACD7mCHxAAAYMAA/NkBPgo9HMAAuYAumYsAAAAAl5k9HMAAuZgumYABAAEnmgAAl5U9HMAAubAumYgBAAEng9cAl5Q9HMAAucYuiD4CAWCITgIWwAC51YDAALnQwAoPe4Ylh8YWwAC54C6XwJgNAJetPRzAALn/LpmJAQABJ5aeAJeWScAAuhQhHMAAuicWwAC6HYDAALoYwAoPe4W0h8dIAQABKwDAAP0pPgE9HMAAujgumbABAAEWwAC6TYDAALpIwAoPe4W0h8cAl7Y/PRzAALpjLpmJAQABJ5aeAJeWPRzAALp4Log+AgFghKkCFsAAuoeAwAC6gsAKD3uGJofIFsAAupAumbCXtgCXrT0cwAC6pi6ZiAEAASeDIQCXlD0cwAC6vC6ZsQEAARbAALrLgMAAusbACg97gmmHyQCXqQaYATDAALrZwAC62cAAvDMAAIYrAAAAAQPAALrswAC8MwAAAAEBAcAAuvwAAACD7mCH0QAAYMAA/NkBPgk9HMAAuwgumYsAAAAAl5lJwAC7IBbAALspgMAAuyTAChDphiqH1z4BPRzAALs6LpmAAQABJ5n0AJeVPz0cwAC7Wi6ZgAEAASeaAACXlT0cwAC7ci6ZiAEAASeD1wCXlD0cwAC7iC6XwAIAARbAALumgMAAu6HAChDpgmyH1AGaASmYDT0cwAC7yi6ZgAEAASeZ9gCXlT0cwAC74S6ZsAEAARbAALv2gMAAu/HAChDpg8yH1QCXtj0cwAC8BS6ZiAEAASeDIQCXlD0cwAC8Gy6ZsQEAARbAALwqgMAAvCXAChDpgmmH1gCXqQaYAjDAALw4wAC8OMAAvVsAAIYuAAAAAQPAALxMwAC9WwAAAAEBAcAAvF0AAACD7mCH3wAAYMAA/NkBPgo9HMAAvGkumYsAAAAAl5k9HMAAvIEumW4BAAEnmgIAl5c9HMAAvJoumYgBAAEng9cAl5Q9HMAAvLAumbABAAEWwAC8xYDAALzAwAoSD4Jrh+EAl7Y9HMAAvNYumWkBAAEnmgMAl6Q9F8AAvOwug90cwAC86hbAALzsLoPdl21kAQABlADAAPz1l209HMAAvQgWwAC9AoDAALz9wAoSD4Yth+KD+AEAARbAAL0QLobzl5oAwAD8Qj0XwAC9Ii6D3RzAAL0gFsAAvSIug92XbYGNAQABlADAAPz2l209HMAAvTMumYsAAAAAl5k9HMAAvUsumWkBAAEnhsAAl6QGmAMwwAC9YMAAvWDAAL9GAACGMwAAAAEDwAC9b8AAv0YAAAABAQHAAL17AAAAg+5gh+oAAGDAAPzZAT4JTsAAvY7AAL2UAACY+2DAAP22ASbAAL2OARzAAL2lFsAAvZYumUiXaJk4AQABgMAAvbTAChNIAJdXYMAA/bY9HMAAvb8umYsAAAAAl5k9HMAAvdcumW4BAAGBwAC94cAKE18Al5c9HMAAve0umWkBAAEnguYAl6RGwAC9/8AAvijAAL4IAAAAgmtghKkAFsAAvhuAwAC+FsAKE0iFuYfsPgQ9HMAAvjAumYsAAAAAl5k9HMAAvkoumW4BAAEnmgQAl5c9HMAAvmMumbABAAGCwAC+c8AKE94Al7Y9HMAAvoYumWkBAAEnguYAl6RJwAC+nhbAAL6ngMAAvqLAChNIhjGH7z4DPRzAAL66LpmLAAAAAJeZPRzAAL7ULpluAQABJ5oFAJeXPRzAAL7wLplpAQABJ4LmAJekPz0XwAC/Ci6D3RzAAL8IFsAAvwoug92XbWQBAAGUAMAA/PWXbT0cwAC/Gy6G8wEAARbAAL8qgMAAvyXAChNIgmmH7gCXmj0XwAC/Ny6D3RzAAL81FsAAvzcug92XbYGNAQABlADAAPz2l20GmAQwwAC/S8AAv0vAAMAKAACGNQAAAAEDwAC/Z8AAwAoAAAABAQHAAL+AAAAAg+5gh/gAAGDAAPzZAT4EPRzAAL+MLpmLAAAAAJeZPRzAAL+kLpluAQABJ5oGAJeXPRzAAL+/LpluAQABJsAAv9gBHMAAv9gWwAC/yS6ZSJdomTgBAAEWwAC/7IDAAL/nwAoVKIJFh/oAl1dgwAD9tgCXlz0cwAC/+i6ZaQEAASeWngCXpAaYBTDAAMAPwADAD8AAwUoAAIY3AAAAAQPAAMAfwADBSgAAAAEBAcAAwCwAAACD7mCIAgAAYMAA/NkBPgc9HMAAwDgumYsAAAAAl5k9HMAAwFAumW4BAAEnmgcAl5c9HMAAwGUumYgBAAEng9cAl5Q9HMAAwHsumbABAAEWwADAkIDAAMCLwAoV24W0iAQAl7Y9HMAAwKAumYgBAAEngyEAl5Q9HMAAwLYumbEBAAEWwADAxYDAAMDAwAoV24GtiAUAl6lJwADA0CEcwADA4xbAAMDZgMAAwNTAChXbhbWIBkgBAAErAMAA/Sk+Az0cwADA9C6ZiwAAAACXmT0cwADBDi6ZbgEAASeaCACXlz0cwADBJy6ZsQEAARbAAME2gMAAwTHAChXbhbWIBgCXqT8GmAYwwADBT8AAwU/AAMImAACGOQAAAAEDwADBY8AAwiYAAAABAQHAAMF0AAAAg+5giA4AAGDAAPzZAT4EPRzAAMGALpmLAAAAAJeZPRzAAMGYLpluAQABJ5oJAJeXScAAwbEhHMAAwcUWwADBuoDAAMG1wAoXC4JriBBIAQABKwDAAP0pPgI9HMAAwdYumYYAAAAAl5I9HMAAweoumbABAAEWwADB/4DAAMH6wAoXC4JriBAAl7Y/PRzAAMIWLplpAQABJ5aeAJekBpgHMMAAwivAAMIrwADCuQAAhjwAAAABA8AAwjjAAMK5AAAAAQEBwADCQgAAAIPuYIgYAABgwAD82QE+BD0cwADCTi6ZiwAAAACXmT0cwADCZi6ZbgEAASeaCgCXlz0cwADCfC6ZsQEAARbAAMKLgMAAwobAChfVgmmIGgCXqT0cwADCoxbAAMKbgMAAwpbAChfVhjuIG4P4AQABFsAAwqsuhvOXmgDAAPxCBpgIMMAAwr7AAMK+wADEswAAhkAAAAABA8AAwsjAAMSzAAAAAQEBwADCzwAAAIPuYIgkAABgwAD82QE+CD0cwADC2y6ZiwAAAACXmUnAAMLzIRzAAMMCFsAAwvyAwADC98AKGICGPogmSAEAASsAiLc+Az0cwADDEy6ZbgEAASeaCwCXlz0cwADDKi6ZlAEAARbAAMM5gMAAwzTAChiAhj6IJgCXnj0cwADDRy6ZhgAAAACXkj89HMAAw18umW4BAAEnmgwAl5c9HMAAw3cumYgBAAEng9cAl5RJwADDjSEcwADDoBbAAMOWgMAAw5HAChiAgeyIJ0gBAAErAMAA/Sk+AT0cwADDsS6XwAEAARbAAMPPgMAAw8rAChiAgeyIJwCYDT4BPRzAAMPuLpluAQABJ5oNAJeXScAAxBchHMAAxCsWwADEIIDAAMQbwAoYgIY/iChIAQABKwDAAP0pPgI9HMAAxDwumYkAAAAAl5Y9HMAAxFAul8ABAAEWwADEboDAAMRpwAoYgIY/iCgAmA0/PRzAAMSFLpmIAQABJ4MhAJeUPRzAAMSbLpmxAQABFsAAxKqAwADEpcAKGICCaYgpAJepBpgJMMAAxLjAAMS4wADFdgAAhkMAAAABA8AAxMfAAMV2AAAAAQEBwADE0wAAAIPuYIgwAABgwAD82QE+Bj0cwADE3y6ZiwAAAACXmT0cwADE9y6ZbgEAASeaCgCXlz0cwADFDS6ZsQEAARbAAMUcgMAAxRfAChpFgmmIMgCXqT0cwADFJy6ZiwAAAACXmT0cwADFPy6ZbgEAASeaDgCXlz0cwADFWS6ZsQEAARbAAMVogMAAxWPAChpFhkKIMwCXqQaYCjDAAMV7wADFe8AAxpgAAIZJAAAAAQPAAMWOwADGmAAAAAEBAcAAxZ4AAACD7mCIOwAAYMAA/NkBPgQ9HMAAxaoumYsAAAAAl5lJwADFwhbAAMXLgMAAxcbAChsGhkeIQj4BPRzAAMXgLpluAQABJ5oPAJeXScAAxgAWwADGCYDAAMYEwAobBoZIiEM+AT0cwADGGy6ZbgEAASeaEACXlz4BPRzAAMZELpluAQABJ5oRAJeXPRzAAMZiLpmwAQABFsAAxneAwADGcsAKGwaCa4g9AJe2PRzAAMaILplpAQABJ5aeAJekBpgLMMAAxp3AAMadwADHNwAAhlEAAAABA8AAxrXAAMc3AAAAAQEBwADGygAAAIPuYIhOAABgwAD82QE+Az0cwADG1i6ZiwAAAACXmT0cwADG7i6XwAIAAYDAAMcHwAob7wGaASmYDT0cwADHJy6ZaQEAASeWngCXpAaYDDDAAMc8wADHPMAAyKAAAIZTAAAAAQPAAMdUwADIoAAAAAEBAcAAx2kAAACD7mCIcwAAYMAA/NkBPgQ9HMAAx3Uul68BAAEWwADHlxbAAMeOgMAAx4nAChxogmyIdYRjiFEAl7g9HMAAx6kumYsAAAAAl5k9HMAAx8EumW4BAAEngmoAl5dJwADH3CEcwADH7hbAAMflgMAAx+DAChxogmqIdkgBAAErAMAA/Sk+AT0cwADH/y6ZnQIAARbAAMgSgMAAyA3AChxogmqIdgGAvRzAAMgiLplfAQABFsAAyDeAwADIMsAKHGiCbIh1AJeEl6U+Aj0cwADIVi6ZbgEAARzAAMhgLplfAQABFsAAyHWAwADIcMAKHGiCbIh1AJeEAJeXPRzAAMiHLplpAQABJ5oSAJekBpgNMMAAyKXAAMiqwADL6AAAl8AAAAABA8AAyMLAAMvoAAAAAgEBwADI1wAAAIPuYIhOAAHAAMjpAAAAmgFgwAD6CgFqwADI+GDAAPoKAFwBPgtJwADJBhbAAMkKLoRIl3A9HMAAyRcumW4BAAEkwADJNwMnmY4WwADJKoDAAMklwAodn4RTglknmY8Al5c/ScAAyT4WwADJQi6ESZdxPRzAAMlQLpmCAQABgMAAyV7ACh2fAJecPz0cwADJaS6XrwIAARbAAMmCgMAAyX3ACh2fhGOIUQGZyCqXuD0cwADJqi6ZmgIAAhbAAMm9gMAAybjACh2fhCCIYCeEKgCXoj0cwADJ3C6ZmgIAAhbAAMnvgMAAyerACh2fhQuIYieZyQCXoj0cwADKJi6ZmgIAAhbAAMo5gMAAyjTACh2fhBuIXieEJQCXoj0cwADKUC6ZmgIAAhbAAMpjgMAAyl7ACh2fhB2IXyeEJwCXoknAAMp6IRzAAMqIFsAAyoOAwADKfsAKHZ+CkIhUSAEAASsAiLc+AT0cwADKmS6ZkwIAAhbAAMqxgMAAyqzACh2fgpCIVDUAAAABAGCXXwEWwADKty6ZSZdqIxzAAMrCggDACh8qSAEAASsAACscwADKwoIAwAofKplDAgACLoDAAMrZwAodnwCXYQFgwAD9tgCXnT9JwADK6yIiIoHAAMrvwAodrQAhFsAAywaAwADLAcAKHZ+EG4heACEWwADLF4DAAMsSwAodn4QdiF8AHMAAyywWwADLJ4DAAMsiwAodn4KQiFRIAQABKwCItz4BPRzAAMs9LpluAQABJ4QmAJeXPz0cwADLWS6ZbgEAARzAAMtjLplfAQABgMAAy3PACh2fAJeEAJeXScAAy38hHMAAy5QWwADLiIDAAMuDwAodn4UBiFZIAQABKwDAAP0pPgI9HMAAy6UumYABAAEngLwAl5U9HMAAy70umbABAAEWwADL0oDAAMvNwAodn4UBiFYAl7Y/BpgOMMAAy+3AAMvtwADNOAAAhZoAAAABA8AAy/vAAM04AAAAAQEBwADMBgAAAIPuYIVzAABgwAD82QE+BUnAAMwSFsAAzCEWwADMG4DAAMwWwAogkIVnhXWDssAA/Fc+Az0cwADMNS6ZiAEAASdjAJeUPRzAAMxNLog+AgFgiLMCFsAAzFyAwADMV8AKIJCFZ4V1FsAAzGMumZSXngCXrT0cwADMdS6ZiAEAASeAlwCXlD89HMAAzJEumYgBAAEng9cAl5ROwADMq8AAzLMAAJoTXcAA/DIBYIJSARzAAMzrMcAAzM1dwAD8dAFgglICFsAAzNOAwADMzsAKIJCFjYV2FsAAzOSAwADM38AKIJCFV4V3hIkBAWCCUgE0wADM8gPAAMzywADM+gAAAAEBAcAAzPMAAACDe13AAPx0AWCCUgAAXcAA/HQBYIJSAUrAAMz5AYHAAMz5wAohmQDAAPxAPRzAAM0BLog+AgFgglICgcAAzQvACiEvFsAAzRQuhvOXmgCXrT0cwADNJC6ZiAEAASeDIQCXlAaYDzDAAM09wADNPcAAzbwAAIWcAAAAAQPAAM1RwADNvAAAAAEBAcAAzWIAAACD7mCFgQAAYMAA/NkBPgM9HMAAzW4umW4BAAEWwADNfYDAAM14wAoiKYC9hYMAl5c9HMAAzYgumYkBAAEnguYAl5Y9HMAAzZ0umbABAAEWwADNsoDAAM2twAoiKYCWhYQAl7YGmBAwwADNwcAAzcHAAM4iAACX4QAAAAEDwADN0cAAziIAAAABAQHAAM3cAAAAg+5gh18AAGDAAPzZAT4CPRzAAM3oLpmLAAAAAJeZPRzAAM4ALplpAQABJMAAzh0BFsAAzhCAwADOC8AKIrqFgMAA/TAAl6QGmBEwwADOJ8AAzifAAM6CAACFQAAAAAEDwADOPsAAzoIAAAABAQHAAM5SAAAAg+5ghDgAAGDAAPzZAT4BPRzAAM5eLpluAQABJ5oUAJeXBpgSMMAAzofAAM6HwADPKwAAhUMAAAABA8AAzpzAAM8rAAAAAQEBwADOrgAAAIPuYIQ/AABgwAD82QE+Az0cwADOui6ZgQEAARbAAM7hgMAAztzACiN+hUKEQQCXsD0cwADO9i6ZgAEAASeAvACXlT0cwADPDC6ZsAEAARbAAM8hgMAAzxzACiN+gJaEQgCXtgaYEzDAAM8wwADPMMAAz9UAAIVFAAAAAQPAAM9FwADP1QAAAAEBAcAAz1cAAACD7mCETgAAYMAA/NkBPgM9HMAAz2MumW4BAAEnmd8Al5c9HMAAz3sumYEBAAEWwADPooDAAM+dwAokD4UYhFAAl7A9HMAAz7guhvMBAAEWwADPx4DAAM/CwAokD1uEUQCXmgaYFDDAAM/awADP2sAA0IoAAIVHAAAAAQPAAM/1wADQigAAAAEBAcAA0A0AAACD7mCEXQAAYMAA/NkBPgM9HMAA0BkumW4BAAEnmfEAl5c9HMAA0DAumYEBAAEWwADQV4DAANBSwAokn4UYhF8Al7A9HMAA0G0uhvMBAAEWwADQfIDAANB3wAokn1uEYACXmgaYFTDAANCPwADQj8AA0O0AAIVJAAAAAQPAANCkwADQ7QAAAAEBAcAA0LYAAACD7mCEbAAAYMAA/NkBPgE9HMAA0MIul8ABAAEWwADQ4IDAANDbwAolL4JshG4AmA0GmBYwwADQ8sAA0PLAANFjAACFTAAAAAEDwADRCMAA0WMAAAABAQHAANEbAAAAg+5ghHUAAGDAAPzZAT4BPRzAANEnLoYbAgABFsAA0UGAwADRPMAKJY2FS4R3AYaZKZf7BpgXMMAA0WjAANFowADRzwAAl9sAAAABA8AA0XrAANHPAAAAAQEBwADRhwAAAIPuYIQxAABgwAD82QE+Aj0cwADRky6ZiwAAAACXmT0cwADRqy6ZaQEAASTAANHKAieDVRbAANG9gMAA0bjACiXuhYDAAP0wAJekBpgYMMAA0dTAANHUwADTkQAAmbgAAAABA8AA0eTAANORAAAAAQEBwADR8QAAAIZnYIilAABbAT4BQUfAANIEgMAA0gzACiZmAwHAANIyasAA0jJgiKWFRwA+Az0cwADSQi6ZiAEAASeDiACXlD0XwADSXC6CThrAANJkl3OXdULAANKgAAHAANK+asAA0r5giKWFVgA+Aj0cwADS0C6ZiAEAASeA9ACXlELAANMYAALAANM2asAA0zZgiKWFdMAA01ZqwADTVmCIpYVlAD4BQsAA04IABpgZMMAA05bAANOWwADT3AAAhmsAAAABA8AA06bAANPcAAAAAQEBwADTswAAAIPuYIi+AABgwAD82QE+AT0cwADTvy6ZbgEAASeaFQCXlwaYGjDAANPhwADT4cAA1CIAAIZuAAAAAQPAANPxwADUIgAAAAEBAcAA0/4AAACD7mCIygAAYMAA/NkBPgE9HMAA1AoumW4BAAEnmhYAl5cGmBswwADUJ8AA1CfAANRfAACGcAAAAAEDwADUNMAA1F8AAAABAQHAANQ+AAAAg+5giNYAAGDAAPzZAT4BPRzAANRKLpluAQABJ5oXAJeXBpgcMMAA1GTAANRkwADVvgAAhnYAAAABA8AA1HbAANW+AAAAAQEBwADUhQAAAIPuYIjuAABgwAD82QE+Az0cwADUkS6ZmAEAARbAANS3gMAA1LLACigohnSI8ACXrknAANTHFsAA1N4WwADU0IDAANTLwAooKIUXiPKDssAA/Fc+BD0cwADU8i6ZiAEAASdjAJeUPRzAANUKLog+AgFgiLMCFsAA1RmAwADVFMAKKCiFF4jyFsAA1SgumZSXngCXrT0cwADVOi6ZiAEAASeAlwCXlD0XwADVUi6CThrAANVal3OXdT89HMAA1ZgumbgBAAEWwADVroDAANWpwAooKIZniPEAmBgGmB0wwADVw8AA1cPAANYJAACGfAAAAAEDwADV1MAA1gkAAAABAQHAANXiAAAAg+5giQAAAGDAAPzZAT4BPRzAANXuLpmyAQABgMAA1gDACikvAJeoBpgeMMAA1g7AANYOwADWjQAAhokAAAABA8AA1hzAANaNAAAAAQEBwADWJwAAAIPuYIksAABgwAD82QE+BD0cwADWMy6ZbgEAARbAANZCgMAA1j3ACimEgL2JLgCXlz0cwADWTS6ZiAEAASeC5gCXlD0cwADWYy6ZhgAAAACXkj0cwADWdS6ZlAEAARbAANaEgMAA1n/ACimEgpCJLwCXngaYHzDAANaSwADWksAA17MAAIaNAAAAAQPAANaowADXswAAAAEBAcAA1rsAAACD7mCJOQAAYMAA/NkBPgM9HMAA1scumcUBAAEWwADW6IDAANbjwAoqJIDtiT0Al7U9HMAA1vgumbgBAAEWwADXDoDAANcJwAoqJIZniTwAmBhJwADXICEcwADXNxbAANcpgMAA1yTACiokhoyJPkgBAAErAIi3PgQ9HMAA10gumYYAAAAAl5I9HMAA11wumW4BAAEnmdcAl5c9HMAA13gumYYAAAAAl5I9HMAA14wumZQBAAEWwADXm4DAANeWwAoqJIaMiT4Al54/BpggMMAA17jAANe4wADZNQAAhpMAAAABA8AA18rAANk1AAAAAQEBwADX2QAAAIPuYIlKAABgwAD82QE+Bj0cwADX5S6ZmgIAAhbAANf4gMAA1/PACischQuJUyeZyQCXoj0cwADYLy6XrwIAARbAANhIgMAA2EPACischGOJTQGZyCqXuD0cwADYcC6ZbgEAARzAANh6LpliAQABgMAA2I/ACiscAJeGAJeXPRzAANibLpmAAQABJ5nXAJeVPRzAANi3LpmUAQABFsAA2MaAwADYwcAKKxyFaYlPAJeeScAA2NIhHMAA2OcWwADY24DAANjWwAorHIaSiVBIAQABKwCItz4CPRzAANj4LpmAAQABJ4C8AJeVPRzAANkQLpmUAQABFsAA2R+AwADZGsAKKxyGkolQAJeePwaYITDAANk6wADZP8AA2ZsAAJdWAAAAAQPAANlVwADZmwAAAAEBAcAA2V8AAACD7mCJbgAAXAE+AT0cwADZay6ZbgEAASbAANmEARzAANmEFsAA2XUumUiXaJk6AQABgMAA2ZHACixVAJdZYMAA/bYAl5cGmCIwwADZoMAA2aDAANoAAACGAAAAAAEDwADZt8AA2gAAAAABAQHAANnLAAAAg+5ghyUAAGDAAPzZAT4BPRzAANnXLpdWAQABFsAA2fOAwADZ7sAKLMiF/4cnAJghBpgjMMAA2gXAANoFwADajgAAl9EA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B8AASpkDmk0AAQAAlvNgwAD9HAFbAWDAAP0cAAFdmVkBXwAAAQSZgjHAAERdwABEZgmaTph3AF2ZbAFbAAEFmZQxwABEa8AARGvAAESTAAAAA8AARIPAAESTAAAAAQEBwABEiQAABJpOXZlsAVsAAF2ZfwFfAAABPwIIAZmCgADACpbsCQHAAERrwAD9MgAAAAAPBpmEMcAARJjAAESmwABFCgAAhtABasAARJlgwAD9HAIAAAEDwABEvsAARQoAAAABAQHAAETTAAAAg+5gij0AAF8AAAFKwABE4gEmwABE4gEcwABE7BbAAETiLppOmHeZgobQAQABgMAARQXACpdRAJl8XwAABpmFMcAARQ/AAEUdwABFgQAAhs0BasAARRBgwAD9HAIAAAEDwABFNcAARYEAAAABAQHAAEVKAAAAg+5gii8AAF8AAAFKwABFWQEmwABFWQEcwABFYxbAAEVZLppOmHeZgobNAQABgMAARXzACpfGAJl7XwAABpmGMcAARYbAAEWUwABF7AAAhsoBasAARYdgwAD9HAIAAAEDwABFqMAARewAAAABAQHAAEW5AAAAg+5gih8AAF8AAAFKwABFyAEmwABFyAEcwABF0hbAAEXILppOmHeZgobKAQABgMAARefACpg7AJl6XwAABpmHMcAARfHAAEX/wABGfgAAhsMBasAARfJgwAD9HAIAAAEDwABGIMAARn4AAAABAQHAAEY+AAAAg+5gihAAAF8AAAFKwABGTQEmwABGTQEcwABGVxbAAEZNLppOmHeZgobDAQABgMAARnnACpiwAJl5XwAABpmIMcAARoPAAEaRwABG7AAAhr0BasAARoRgwAD9HAIAAAEDwABGpsAARuwAAAABAQHAAEa4AAAAg+5gif0AAF8AAAFKwABGxwEmwABGxwEcwABG0RbAAEbHLppOmHeZgoa9AQABgMAARufACpklAJl4XwAABpmJMcAARvHAAEb/wABHRQAAhroBasAARvJgwAD9HAIAAAEDwABHD8AAR0UAAAABAQHAAEccAAAAg+5giewAAF8AAAFKwABHJQEmwABHJQEcwABHLxbAAEclLppOmHeZgoa6AQABgMAAR0DACpmaAJl3XwAABpmKMcAAR0rAAEdYwABHoQAAhrcBasAAR0tgwAD9HAIAAAEDwABHacAAR6EAAAABAQHAAEd3AAAAg+5gidsAAF8AAAFKwABHgAEmwABHgAEcwABHihbAAEeALppOmHeZgoa3AQABgMAAR5zACpoPAJl2XwAABpmLMcAAR6bAAEe0wABH+gAAhrIBasAAR6dgwAD9HAIAAAEDwABHxMAAR/oAAAABAQHAAEfRAAAAg+5gib4AAF8AAAFKwABH2gEmwABH2gEcwABH5BbAAEfaLppOmHeZgoayAQABgMAAR/XACpqEAJl1XwAABpmMMcAAR//AAEgNwABIYgAAhq0BasAASABgwAD9HAIAAAEDwABIIMAASGIAAAABAQHAAEgwAAAAg+5gia8AAF8AAAFKwABIPwEmwABIPwEcwABISRbAAEg/LppOmHeZgoatAQABgMAASF3ACpr5AJl0XwAABpmNMcAASGfAAEh1wABIygAAhqkBasAASGhgwAD9HAIAAAEDwABIiMAASMoAAAABAQHAAEiYAAAAg+5giacAAF8AAAFKwABIpwEmwABIpwEcwABIsRbAAEinLppOmHeZgoapAQABgMAASMXACptuAJlzXwAABpmOMcAASM/AAEjdwABJMgAAhqUBasAASNBgwAD9HAIAAAEDwABI8MAASTIAAAABAQHAAEkAAAAAg+5giZwAAF8AAAFKwABJDwEmwABJDwEcwABJGRbAAEkPLppOmHeZgoalAQABgMAASS3ACpvjAJlyXwAABpmPMcAASTfAAElFwABJiwAAhqIBasAASThgwAD9HAIAAAEDwABJVcAASYsAAAABAQHAAEliAAAAg+5giZQAAF8AAAFKwABJawEmwABJawEcwABJdRbAAElrLppOmHeZgoaiAQABgMAASYbACpxYAJlxXwAABpmQMcAASZDAAEmewABJ5wAAhp8BasAASZFgwAD9HAIAAAEDwABJr8AASecAAAABAQHAAEm9AAAAg+5giYwAAF8AAAFKwABJxgEmwABJxgEcwABJ0BbAAEnGLppOmHeZgoafAQABgMAASeLACpzNAJlwXwAABpmRMcAASezAAEn6wABKQwAAhpwBasAASe1gwAD9HAIAAAEDwABKC8AASkMAAAABAQHAAEoZAAAAg+5giYQAAF8AAAFKwABKIgEmwABKIgEcwABKLBbAAEoiLppOmHeZgoacAQABgMAASj7ACp1CAJlvXwAABpmSMcAASkjAAEpWwABK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AIPuYIg7AMAAiFoAACCFcF8BAAAAXwAAAUrAAIhoARzAAIhoLpfhAgACgMAAiHnACuBagcAAiH/ACuBnAJpJBppcMcAAiIfAAIiJwACI5wAAhlEAAAABA8AAiKHAAIjnAAAAAgICwACItgAAAIPuYIhOAMAAiL4AACCFcF8BAAAAXwAAAUrAAIjMARzAAIjMLpfhAgACgMAAiN3ACuDGgcAAiOPACuDTAJpJBppdMcAAiOvAAIjtwACJSwAAhlMAAAABA8AAiQXAAIlLAAAAAgICwACJGgAAAIPuYIhzAMAAiSIAACCFcF8BAAAAXwAAAUrAAIkwARzAAIkwLpfhAgACgMAAiUHACuEygcAAiUfACuE/AJpJAAAK2LoACtkHAArZcwAK2d8ACtpLAAratwAK2yMACtuPAArb+wAK3GcACtzTAArdPwAK3asACt4XAAregwAK3u8ACt9bAArfxwAK4DMACuCfAArhCwAK4XcAAAAVAppgMcAAiVDAAIlfwACQ5geaWQACAACW82DAAP0cAVsAAIJ2YMAA/RwBWwFdmhICXwAAXwEAAAFdmkcCXwAAXwEAAAEFmngxwACJvsAAicTAAInSAQAAA8AAidDAAInSAAAAAAAAAF2aYAJfAABfAQABPwEJAcAAicSaRgAAAAAVBppiMcAAidfAAInZwACKCAAAl+EAAAABA8AAienAAIoIAAAAAgICwACJ9AAAAIPuYIdfAMAAifwAACCFcF8BAAAAXwAAAUrAAIoEASsGmmMxwACKDMAAig7AAIpsAACGDgAAAAEDwACKJsAAimwAAAACAgLAAIo7AAAAg+5gh2UAwACKQwAAIIVwXwEAAABfAAABSsAAilEBHMAAilEul+ECAAKAwACKYsAK4smBwACKaMAK4tYAmmIGmmQxwACKcMAAinLAAIquAACGEgAAAAEDwACKfMAAiq4AAAACAgLAAIqDAAAAg+5gh28AwACKiwAAIIVwXwEAAABfAAABSsAAipMBHMAAipMul+ECAAKAwACKpMAK4zWBwACKqsAK40IAmmIGmmUxwACKssAAirTAAIr8AACGFQAAAAEDwACKxMAAivwAAAACAgLAAIrRAAAAg+5gh3oAwACK2QAAIIVwXwEAAABfAAABSsAAiuEBHMAAiuEul+ECAAKAwACK8sAK46GBwACK+MAK464A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FjaahwEAARbAAEcwgMAARyvACxYhhniJBwCbEgFgiLNJwABHQhzAAEdWFsAAR0sumpmbC0gBAAGCwABHWcALFngAwAD880rAAEdhAYDAAEdowAsWIT9KwABHcgEfwABHfYkZBgAChMAAR4rACxbrhsAAR6DACxgqBIS7hcAAR8XACxd/hLiDwABH7sALFqyFGRbAAEgjgMAASB7ACxYhhRmJA4Z4JsAASFABh8AASFDACxhjYIkaBpscNMAASGXAAEhqwABJHAAAmpwAAAABA8AASHvAAEkcAAAAAQEBwABIjQAAAIJFYJsHAABcAT4DTsAASJ/AAEikAACD7mCbBwEuQ8AASLAhHMAASLyBwABIt8ALGZFIAQABgMAASL/ACxl+AMAA/Sk+Aj01AAAAAQBgmwcBgcAASNHACxmRF8AASNaCwABI1sALGcyamRzAAEjPFsAASNaCwABI1sALGcyamZsLZAEAAZQAwAD89ZsLPYnAAEjowAsZkRbAAEj0gcAASO/ACxmRmpWbCT01AAAAAQBgmwcBgMAASQfACxl+F8AASQ6CwABJDsALGi+amRzAAEkFFsAASQ6CwABJDsALGi+amZsLZAEAAZQAwAD89ZsLBpsdNMAASSHAAEkqwABKhQAAmoQAAAABA8AASTfAAEqFAAAAAQEBwABJRgAAAIJsYIlKAABgiLMBPgNOwABJWsAASWYAAICJYJsHAS5DwABJciEcwABJhYHAAEl5wAsasEgBAAErAMAA/Sk+A07AAEmawABJpgAAhFdgiLMBHMAASbSBwABJqMALGrCW9gIAAoDAAEm7wAsamxbAAEnFLpqYmwoAmw1JwABJ3iEcwABJ7oLAAEniwAsa4kgBAAErAIi3PgI9HMAASgEumpwBAAGBwABKE8ALGrAAmxxKwABKKQGCwABKMMALGuI/PYnAAEpLwAsasBbAAEplgcAASlnACxqwmpWbCUrAAEp2ASsGmx40wABKisAASpPAAEr4AACGjQAAAAEDwABKqcAASvgAAAABAQHAAEq8AAAAg+5giTkAAGCIswE+AUrAAErIATUAAAABAGCIswEcwABKzy6ahAEAARbAAErigMAASt3ACxurgO2JPQCbHSMcwABK7YEAwAsbxkgBAAErAACAwABK8MALG6uBAMALG8YBYIizAAALD4AACw+6AAsP7AALECAACxEeAAsR1wALEiIACxJaAAsSkgALEsoACxMCAAsUAAALFRAACxXBAAsV+gALGVcACxp0AAsbhAALHBUAAAASApshNMAASv3AAEsDwABOswOanQAAAWCa/wAAAgSbIzTAAEs+wABLRxiangBgwAD70AGTBJskNMAAS1DAAEtiGJqfAGDAAPoKASoBBZspNMAAS2fAAEtnwABMEAAAAAPAAEt7wABMEAAAAAIBAsAAS5kAAACE5F3AAPylAmCJSmCIswDAAEvDAAAAmpVgmyEBagBgwAD82XcAYJshAT4BPRzAAEv4FsAAS+suhOSbAYClAQABgMAAS//ACxzTAMAA/MEBCQDAAEvTmwYBAAGBwABL2cALHOkAAgabJjTAAEwVwABMNsAATJgAAJqaAWrAAEwWYMAA/RwCAAABA8AATEnAAEyYAAAAAAAAAGCbIQE+AUrAAExSAR/AAExdmykCAAIywABMi2CJSmCIswAuAAabJzTAAEydwABMssAATrEAAIaNAWrAAEyeYMAA/RwCAAABA8AATMjAAE6xAAAAAQEBwABM2wAAAIPuYIk5AABgiLMBPgVOwABM8MAATPwAAIRXYIizARzAAEz+LpqEAQABFsAATRGAwABNDMALHciA7Yk9AJsdScAATSEcwABNMYHAAE0lwAsd3UgBAAErAIi3SsAATToBgMAATUHACx3IP0nAAE1LFsAATU8ump+bJErAAE1bAYHAAE1iwAsd3T89F8AATXUump4cwABNcxbAAE11LpqemyNkAQABlADAAPz1myNJwABNgBzAAE2KFsAATYQump6bI4CXAQABFsAATZkWwABNjC6E5JsBYcAA/MkAwAD8/z4DPRfAAE2pLpqfKZskPRfAAE3ELpqeHMAATcIWwABNxC6anpsjgY0BAAGUAMAA/PabI0rAAE3RAYHAAE3YwAsd3T4EPYnAAE34wAsd3RzAAE4GLpqHAQABgcAATgzACx3dAJsSPRzAAE5gFsAATlQuhOSbAYC/AgACFsAATmaAwABOYcALHciA7Yk9gcAATnPACx3dAMAA/Lo9F8AATogump4cwABOhhbAAE6ILpqemyOBjQEAAZQAwAD89psjSsAATpUBgcAATpzACx3dAAALHT8ACx2WAAsfewAAAAICmyo0wABOtsAATrzAAGiJA5qgAAABYMAA/RwA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APxJRsAAS0oAwABLVQAAAID1YIMUAIDAAEtawAt+SD01AAAAAQBgnBsBHMAAS20WwABLZS6bM5uSm9tLAQABgsAAS27AC36dAMAA/LkjHMAAS3KDAMALfrVIAQABKwAAKxfAAEtygwDAC361m00pnB0BYMAA+gpKwABLgwEcwABLmBbAAEuTFsAAS4oumzObkpvbg2LAAPzHgaUBAAEWwABLq4HAAEuewAt+aYMXwAD9cwDAAPw+BpvqN8AAS73AAEvOwABMdwAAmwwBasAAS75gwAD9HAIAAAEDwABL2sAATHcAAAACAgLAAEvhAAAAmw1ggxQAwABL8QAAAITmYIMUAABgwAD6CgE+AknAAEwDHsAATAfAAPWxAgACgMAATBHAC399gcAATBvAC3+KAErAAEwoASk/SsAATDkBHMAATFIcwABMQC6bTAEAAYDAAExIwAt/fQCb5ZsMAQABHMAATF8um0wBAAGBwABMZ8ALf4oAm+UAnC8Gm+s3wABMfMAATI3AAE0xAACa3wFqwABMfWDAAP0cAgAAAQPAAEyYwABNMQAAAAICAsAATJ8AAACa3mCDFADAAEyuAAAAhOZggxQAAGDAAPoKAT4CScAATMAewABMxMAA9bECAAKAwABMzsALgD+BwABM18ALgEwASsAATOQBKT9KwABM9QEcwABNDRzAAEz8LptMAQABgMAATQTAC4A/AJvlmt8BAAEcwABNGS6bTAEAAYHAAE0hwAuATACb5QCcMAab7DfAAE02wABNR8AATZsAAJsOAWrAAE03YMAA/RwCAAABA8AATVTAAE2bAAAAAQEBwABNWwAAAISMYIMUAABgwAD6CgE+AUrAAE1pARbAAE2NFsAATYAcwABNcC6bTAEAAYDAAE14wAuBAQCb5Zs+nCKDssAA/FcGm+43wABNoMAATbHAAFDXAACbU5uSAAAAAQPAAE3KwABQ1wAAAAEBAcAATdYAAACBVGCcGwAAXcAA/HQBYJwbAT4HScAATeIhHMAATgAWwABN64DAAE3mwAuBcZtUnCZIAQABKwDAAP0pSsAATgkBFsAAThWAwABOEMALgXGbVJwmP07AAE4zwABOOAAAm1VgnD8BNcAATj4AAAEAYJw/AR/AAE4+nEQAAAAANQAAAAEAWwEcwABOSoHAAE5IwAuB3VYBAAGAwABOTsALgXEA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AIiTwAupDAGbCCqb9UnAAIixHMAAiLqEwACItcALqQxIAQABKwDAAP0pPgE9MMAAiM0kwACJBwUnm4sWwACI6YPAAIjiwAuo84C9gxonm4wWwACI/YPAAIj2wAuo84RhgyIngWo/ScAAiRchHMAAiTEWwACJIITAAIkbwAupDJt/nB9IAQABgsAAiTTAC6jQAMAA/PM+AT0wwACJQSQACiebjRbAAIlshMAAiWfAC6kMm3+cHyebjoLAAImCwAuo0CebjyebkBbAAImhg8AAiZrAC6jzgL2DGiebjBbAAIm1g8AAia7AC6jzhGGDIieBaj89isAAic/AC6jQHMAAidCCwACJz8ALqNBkAQABlADAAPz1BpvyN8AAiuvAAIrvwACP9AAAm3qbkgAAAAEDwACLBMAAj/QAAAADAgLAAIsLAAAAhOJggxQAwACLIQAAAJuRXcAA/WcBYIMUAAHAAItCAAAAm3tdwAD8dAFggxQBagBgwAD82XdgwAD70AE+D07AAItawACLXwAAgVRgnBsBHMAAi2kWwACLYS6bM5uSm9tLAQABgMAAi2rAC62FAMAA/LlJwACLeiEcwACLg4PAAIt+wAutykgBAAErAMAA/Sk+AUrAAIuUARbAAIugg8AAi5vAC63Kmp6cID9JwACLsiEcwACLxIHAAIu3wAutklYBAAGAwACLyMALrYUAwAD9dD4BPTDAAIvcJMAAjBICJ5uSFsAAjAyAwACMAsALrYWAvYMaPz2LwACMH8ALrcofwACMKpwzAQABgMAAjDXAC62FAE7AAIxKwACMVQAAm5NgwAD70AEcwACMV5SBxAAAAADAAPvzScAAjF8hHMAAjHcWwACMbYDAAIxjwAuthYTUgyRIAQABKwCJaj4BPYzAAIyIwAuunx7AAIyVwADP8AIBYMAA+9AChMAAjKTAC66fHMAAjLoum3qbkgMAAhbAAIzkFsAAjNqAwACM0MALrYWE1IMkhOKJZIHAAIzvwAutkgGbe4LAAI0YwAutppvyAD9JwACNMSEcwACNSxbAAI0/gMAAjTXAC62FhNWDJUgBAAErAIlqPgE9jMAAjVzAC66fHsAAjWnAAM/wAgFgwAD70AKEwACNeMALrp8cwACNji6bepuSAwACFsAAjboWwACNroDAAI2kwAuthYTVgyWE4olkgcAAjcXAC62SAZt7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rADAAPy5TsAAsBbAALArAACboGCcEQE1wACwMQAAAQBgnBEBH8AAsDGcGgAAAAA1AAAAAQBbARzAALBQgsAAsE7AC8wEmzoBAAEWwACwYoHAALBdwAvLv5t/nB8AnBaCAMALzAROwACwfcAAsJEAAJuhYJwRATXAALCXAAABAGCcEQEfwACwl5waAAAAADUAAAABAFsBHMAAsLaDwACwtMALzGObOgEAARbAALDIgcAAsMPAC8u/m3+cHwCcFoMAwAvMY0nAALDgIRzAALD1FsAAsOuAwACw5MALy6yE1IMkSAEAASsAiWo+A07AALERwACxHwAAm6JgnBsBHMAAsSkWwACxIS6bM5uSm9tLAQABFsAAsTsWwACxMYDAALEqwAvLrITUgySE4olkAMAA/Lk9HMAAsW2CwACxTcALy/ObPQEAARbAALGLhMAAsX3AC8zYm6OcJACcFz0cwACxvoPAALGqwAvMUps9AQABFsAAsdyEwACxzsALzNibpJwlAJwXP0nAALH/IRzAALIWFsAAsgqAwACyA8ALy6yE1YMlSAEAASsAiWo+Ak7AALIywACyQgAAm6VgnBsBHMAAskwWwACyRC6bM5uSm9tLAQABFsAAsmAWwACyVIDAALJNwAvLrITVgyWE4olkAMAA/Lk9HMAAspGDwACycsALzFKbPQEAARbAALKxhMAAsqHAC82Ym6ScJQCcFz9GwACy1MAAswnAALLjAAAAhNRgiV8AFsAAsveAwACy8MALy6yE1oMmPgJOwACzHMAAsyoAAJuiYJwbARzAALM0FsAAsywumzObkpvbSwEAARbAALM/hMAAszXAC84QhOKJZADAAPy5PRzAALNlg8AAs1HAC8xSmz0BAAEWwACzg4XAALN1wAvOMpuknCUAnBc9F8AAs6uBwACzpsALy7+boxzAALPZgsAAs8TAC8vzm0AAAAAAnBicJD0XwACz94HAALPywAvLv5ukHMAAtCODwAC0D8ALzFKbQAAAAACcGJwlBpwIN8AAtTjAALVCwAC27QAAm6YAAAABA8AAtVXAALbtAAAAAAAAAF3AAPx0AWDAAPvQAT4DTsAAtWLAALVpAACBdl3AAPx0AWDAAPvQATHAALVwYMAA+9AARsAAtXjAALWcwAC1gwAAAISMYIMUABbAALWWFsAAtY0umzObkpvbg2LAAPzH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AAvnzgAAAAIAAACcRZu8OAAAAoD1AACCLgAAgQgAAKZSAAAAAAABApxGOIFugXSrbwObvQAAAWDAAP0cAAA1BJxIOIGpg0YFm74AXcAA/KUCYMAA/bZdwAD8dAFgwAD9tgEygbtgwAD9tl3AAPx0AWDAAP22AyebvzGBzmDAAP22ECebwCebwSebwiebwyebxCebxSebxiebxyebyCebySebyiebyyeExiebzCebzSebziebzzGC8GDAAP22ASebyyeb0DGDG2DAAP22AicDJ5vRBJxJOINeg2MJJwBgplMABJxLOINwg3wYm9KcRQBggosBKwScTDiDhoOSGJvTnEUAYIMUASsEnE04g5yDphib1JxFAGCDFAErBJxOOIOwg7oYm9WcRQBggxQBKwScTziDxIPNGJvWnEUAYIMUASsEnFA4g9eD4Bib15xFAGCDFAErBJxROIPqg/YYm9icRQBggxQBKwScUjiEAIQMGJvZnEUAYIMUASsEnFM4hBaEIBib2pxFAGCDFAErBJxUOIQqhDMYm9ucRQBggxQBKwScVTiEPYRGGJvcnEUAYIMUASsEnFY4hFCEXhib3ZxFAGCDFAErBJxXOIRohHYYm96cRQBggxQBKwScWDiEgISMGJvfnEUAYIMUASsEnFk4hJaEoBib4JxFAGCDFAErBJxaOISqhLgYm+GcRQBggxQBKwScWziEwoTSGJvinEUAYIMUASsEnFw4hNyE8hib45xFAGCDFAErBJxdOIUChSYYm+ScRQBgg6QBKwScXjiFNoVaGJvlnEUAYIOkASsEnF84hWiFfBib5pxFAGCD5QErBJxgOIWKhaYYm+ecRQBgg+UBKwScYTiFtIXHGJvonEUAYIPlASsEnGI4hdeF/Rib6ZxFAGCDpAErBJxjOIYLhhgYm+qcRQBgg+UBKwScZDiGJoY2GJvrnEUAYIPlASsEnGU4hkGGVRib7JxFAGCDFAErBJxmOIZihm8Ym+2cRQBggosBKwScZziGeYaFGJvunEUAYIMUASsEnGg4ho+Gnxib75xFAGCDFAErBJxpOIaphrUYm/CcRQBggxQBKwScajiGv4bYGJvxnEUAYIMUASsEnGs4huKG8Bib8pxFAGCDFAErBJxsOIcAhx8Ym/OcRQBgg6QBKwScbTiHLYdMGJv0nEUAYIPlASsEnG44h1qHcRib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jGSMZYxmjGeMaIxpjGqMa4xsjG2MboxvjHCMcYxyjHOMdIx1jHaMd4x4jHmMeox7jHyMfYx+jH+MgIyBjIKMg4yEjIWMhoyHjIiMiYyKjIuMjIyNjI6Mj4yQjJGMkoyTjJSMlYyWjJeMmIyZjJqMm4ycjJ2MnoyfjKCMoYyijKOMpIyljKaMp4yojKmMqoyrjKyMrYyujK+MsIyxjLKMs4y0jLWMtoy3jLiMuYy6jLuMvIy9jL6Mv4zAjMGMwozDjMSMxYzGjMeMyIzJjMqMy4zMjM2MzozPjNCM0YzSjNOM1IzVjNaM14zYjNmM2ozbjNyM3YzejN+M4IzhjOKM44zkjOWM5oznjOiM6YzqjOuM7IztjO6M74zwjPGM8ozzjPSM9Yz2jPeM+Iz5jPqM+4z8jP2M/oz/jQCNAY0CjQONBI0FjQaNB40IjQmNCo0LjQyNDY0OjQ+NEI0RjRKNE40UjRWNFo0XjRiNGY0ajRuNHI0djR6NH40gjSGNIo0jjSSNJY0mjSeNKI0pjSqNK40sjS2NLo0vjTCNMY0yjTONNI01jTaNN404jTmNOo07jTyNPY0+jT+NQI1BjUKNQ41EjUWNRo1HjUiNSY1KjUuNTI1NjU6NT41QjVGNUo1TjVSNVY1WjVeNWI1ZjVqNW41cjV2NXo1fjWCNYY1ijWONZI1ljWaNZ41ojWmNao1rjWyNbY1ujW+NcI1xjXKNc410jXWNdo13jXiNeY16jXuNfI19jX6Nf42AjYGNgo2DjYSNhY2GjYeNiI2JjYqNi42MjY2Njo2PjZCNkY2SjZONlI2VjZaNl42YjZmNmo2bjZyNnY2ejZ+NoI2hjaKNo42kjaWNpo2njaiNqY2qjauNrI2tja6Nr42wjbGNso2zjbSNtY22jbeNuI25jbqNu428jb2Nvo2/jcCNwY3CjcONxI3FjcaNx43IjcmNyo3LjcyNzY3Ojc+N0I3RjdKN043UjdWN1o3XjdiN2Y3ajduN3I3djd6N343gjeGN4o3jjeSN5Y3mjeeN6I3pjeqN643sje2N7o3vjfCN8Y3yjfON9I31jfaN9434jfmN+o37jfyN/Y3+jf+OAI4BjgKOA44EjgWOBo4HjgiOCY4KjguODI4Njg6OD44QjhGOEo4TjhSOFY4WjheOGI4ZjhqOG44cjh2OHo4fjiCOIY4ijiOOJI4ljiaOJ44ojimOKo4rjiyOLY4uji+OMI4xjjKOM440jjWONo43jjiOOY46jjuOPI49jj6OP45AjkGOQo5DjkSORY5GjkeOSI5JjkqOS45Mjk2OTo5PjlCOUY5SjlOOVI5VjlaOV45YjlmOWo5bjlyOXY5ejl+OYI5hjmKOY45kjmWOZo5njmiOaY5qjmuObI5tjm6Ob45wjnGOco5zjnSOdY52jneOeI55jnqOe458jn2Ofo5/joCOgY6CjoOOhI6FjoaOh46IjomOio6LjoyOjY6Ojo+OkI6RjpKOk46UjpWOlo6XjpiOmY6ajpuOnI6djp6On46gjqGOoo6jjqSOpY6mjqeOqI6pjqqOq46sjq2Oro6vjrCOsY6yjrOOtI61jraOt464jrmOuo67jryOvY6+jr+OwI7BjsKOw47EjsWOxo7HjsiOyY7KjsuOzI7Njs6Oz47QjtGO0o7TjtSO1Y7WjteO2I7ZjtqO247cjt2O3o7fjuCO4Y7ijuOO5I7ljuaO547ojumO6o7rjuyO7Y7uju+O8I7xjvKO8470jvWO9o73jviO+Y76jvuO/I79jv6O/48AjwGPAo8DjwSPBY8GjwePCI8JjwqPC48Mjw2PDo8PjxCPEY8SjxOPFI8VjxaPF48YjxmPGo8bjxyPHY8ejx+PII8hjyKPI48kjyWPJo8njyiPKY8qjyuPLI8tjy6PL48wjzGPMo8zjzSPNY82jzePOI85jzqPO488jz2PPo8/j0CPQY9Cj0OPRI9Fj0aPR49Ij0mPSo9Lj0yPTY9Oj0+PUI9Rj1KPU49Uj1WPVo9Xj1iPWY9aj1uPXI9dj16PX49gj2GPYo9jj2SPZY9mj2ePaI9pj2qPa49sj22Pbo9vj3CPcY9yj3OPdI91j3aPd494j3mPeo97j3yPfY9+j3+PgI+Bj4KPg4+Ej4WPho+Hj4iPiY+Kj4uPjI+Nj46Pj4+Qj5GPko+Tj5SPlY+Wj5ePmI+Zj5qPm4+cj52Pno+fj6CPoY+ij6OPpI+lj6aPp4+oj6mPqo+rj6yPrY+uj6+PsI+xj7KPs4+0j7WPto+3j7iPuY+6j7uPvI+9j76Pv4/Aj8GPwo/Dj8SPxY/Gj8ePyI/Jj8qPy4/Mj82Pzo/Pj9CP0Y/Sj9OP1I/Vj9aP14/Yj9mP2o/bj9yP3Y/ej9+P4I/hj+KP44/kj+WP5o/n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Pz9JwADQNh7AANA6wAD1sQIAAofAANBEwA3qOmrAANBKYMAA+9CD8gA+AknAANBaIYXAANBfwA3qCj4DPRzAANC6Lp87AQABhsAA0MjADeoeAKBpPY3AANDhwA3qCik9jsAA0QHADeoeFsAA0RAunz2gtD89HMAA0S4un1AAAAAAoHVJwADRUhzAANFbh8AA0VbADeo6gJcBAAE3fwDAAPz/PgI9jMAA0WzADen2Kj2NwADRjcAN6goqPz2PwADRssAN6jocwADRuS6fOAAAAACgZknAANHOIYXAANHTwA3qCj0cwADR4i6fOwEAAYbAANHwwA3qHgCgaT89HMAA0gMun5oGAAOAwADSFsAN6W+BwADSIcAN6X6DwADSLcAN6dsDnOaEwADSR8AN6fafmymfnCqgsUrAANJ+AYfAANKFwA3qOgagsE3AANKSwADSlsAA1kQAAJy9AAAAAQPAANKgwADWRAAAAAEBAcAA0qUAAACULWDAAPvQAABgwAD70AE+Ak7AANK6wADSxQAAn6JgoVEBHsAA0sehUAIAAoDAANLlwA3uRBbAANLwLpz3oFoAScAA0wElwADTEIHAANMFwA3uXWChZj4JTsAA0zgAAACHTmDAAPvQAE7AANNUwADTXgAAn6NdwAD8dAFgwAD70AExwADTZWDAAPvQAEnAANNvIhzAANN9FsAA03gWwADTcy6D66BcgpCey0gBAAFqwADTimCe88AApmIAwAD9KQAcwADTpRbAANOdFsAA05gug+ugXJ1qnrVIAQABFsAA06gunPegWgDAAPzzPgM9isAA077ADe6kFsAA09AWwADTyy6D66Bch06etD0cwADT7oPAANPkwA3utIClAQABFsAA1AEWwADT+hbAANP1LoProFyCXp7Fn6PAAP2+AMAA/IY9F8AA1BUug+sWwADUIRbAANQcLoProFyc8p7JoFw+AT2KwADUQsAN7qQWwADUWhTAANRPwA3uXQEBYKFmh06eWD0cwADUfoPAANR0wA3utFYBAAEWwADUjRTAANSCwA3uXQEBYKFmlC2haADAAPyFPRzAANSfLp9XAQABFMAA1LHADe5dAQFgoWYAoHpOwADUyMAA1M0AAIOwYMAA+9ABHMAA1M8un44BAAEpAKCyQ8AA1O4ewADU9aBQAgAChMAA1QfADfAaKQA+Aj0cwADVKIPAANUewA3utFYBAAGEwADVLMAN8BoAwAD8hT2MwADVO8AN8BocwADVQi6fOAAAAACgZj0cwADVWy6fQwEAAR/AANVznWADAANqwADViGCe88AApmIewADVosAA/d4BAAGDwADVt8AN7rQAgsAA1cPADe6kAACgoUrAANXXAYTAANXewA3wGj4CPRzAANX3Lp9XAQABgcAA1gnADe5dAKB6SsAA1hwBHMAA1iMun44BAAEpAKCyBqCxTcAA1knAANZOwADYkwAAn5oAAAABA8AA1mDAANiTAAAABgMDwADWZQAAAJ+UYMAA+9AAwADWdAAAAJ+YYMAA+9AAwADWhAAAAGpgwAD70AADwADWlwAAAJzmYMAA+goBagBgwAD82XfAANanAAAAn5tgwAD6CgFqAGDAAPzZd8AA1rkAAACfnGDAAPoKAWoAYMAA/Nl3XAE+BU7AANbOwADW1QAAn6RgwAD9tgEewADW28AA/d4BAAEjhMAA1vnADfF+McAA1wdgwAD70AOAwADXCMAN8TqAwADXE8AN8TqAwADXHsAN8ToxwADXK2DAAPvQAYDAANcswA3xOgFdwAD8dAFgwAD70ABOwADXRMAA10sAAIMkYMAA/bYBI4XAANdNwA3xlSTAANdgAieDpIbAANdYwA3xsYbAANdiwA3xsQFgwAD9tj0cwADXby6fRQQABGrAANeXYJ7zwACnHoLAANefwA3xWIPAANemwA3xZ4bAANexwA3xsQCgbk7AANf+wADYCQAAn6VgwAD70AEjHMAA2BYWwADYCy6c96BaYwEAARbAANgYLp8+oLUAwAD8/RbAANgnLpz3oFqBwADYNMAN8UkBYMAA+9A9HMAA2EQun1cBAAEfwADYWqGVAwADh8AA2G3ADfIhFMAA2HXADfKVCAAWwADYgS6fPqC1AACgegagsk3AANiYwADYnMAA2VMAAJ+OAAAAAQPAANitwADZUwAAAAEBAcAA2LMAAACfpmDAAPoKAABgwAD70AE+AknAANjIHMAA2Mwun10AAAAAoIJKwADY2wFqwADY4mDAAPvQCT9JwADY7IDAANjwwA3zQj4BSsAA2QcBHMAA2Q4unzgAAAAAoGY+AUrAANlAARzAANlHlIHEAAAAAMAA+/MAAA14tAANeVAADXl0AA15pQANeckADXn2AA16GgANej4ADXpz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AWqGTmDAAPvQwACRCgSh0VOGYYaBBqAmAGDAAPvQAWqGfmDAAPvQhJEEodJTho2GuQagJwBgwAD70AFqhrZgwAD70MAArbcEodNThsWG5QagKABgwAD70AFqhuJgwAD70MAAq6cEodRThvGHFAagKQBgwAD70AFqhxFgwAD70MAAsYoEodVThyCHTwagKgBgwAD70AFqh0xgwAD70MAAs1oEodZTh1uHjwagKwBgwAD70AFqh4xgwAD70MAAr4kEoddTh5uHwwagLABgwAD70AFqh8BgwAD70MAAq3AEodhTh8+H7wagLQBgwAD70AFqh+xgwAD70MAAqzwEodlTh/uIGwagLgBgwAD70AFqiBhgwAD70MAAke8EodpTiCeIRwagLwBgwAD70AFqiERgwAD70MAAresEodtTiFOIcAagMABgwAD70AFqiG1gwAD70MAArAgEodxTiHyInAagMQBgwAD70AFqiJlgwAD70MAArHIEod1TiKiIywagMgBgwAD70AFqiMhgwAD70MAArYEEod5TiNeI9wagMwBgwAD70AFqiPRgwAD70MAArUkEod9TiQOJJQagNABgwAD70AFqiSJgwAD70MAAqK4EoeBTiTGJVQagNQBgwAD70AFqiVJgwAD70MAAqHoEoeFTiWGJjgagNgBgwAD70AFqiYtgwAD70MAAkfkEoeJTiZqJ1gagNwBgwAD70AFqidNgwAD70MAAp6kEoeNTieKKFwagOABgwAD70AFqihRgwAD70MAAp98EoeRTiiOKSQagOQBgwAD70AFqikZgwAD70MAAqRUEoeVTilWKeQagOgBgwAD70AFqinZgwAD70MAAqUkEoeZTioWKqAagOwBgwAD70AFqiqVgwAD70MAAqX8EoedTirSK1AagPABgwAD70AFqitFgwAD70MAAsfIEoehTiuCLAwagPQBgwAD70AFqiwBgwAD70MAAsCUEoelTiw+LMgagPgBgwAD70AFqiy9gwAD70MAAr+8EoepTiz6LYwagPwBgwAD70AFqi2BgwAD70MAArrcEoetTi2+LlQagQABgwAD70AFqi5JgwAD70MAAroEEoexTi6GLygagQQBgwAD70AFqi8dgwAD70MAAsskEoe1Ti9aMAgagQgBgwAD70AFqi/9gwAD70MAAspMEoe5TjA6MNgagQwBgwAD70AFqjDNgwAD70MAAryAEoe9TjEKMZAagRABgwAD70AFqjGFgwAD70MAArDwEofBTjHCMkAagRQBgwAD70AFqjI1gwAD70MAAqkAEofFTjJyMvgagRgBgwAD70AFqjLtgwAD70MAAkW0EofJTjMqNAwagRwBgwAD70AFqjQBgwAD70MAAsigEofNTjQ+NUAagSABgwAD70AFqjU1gwAD70MAAsIUEofRTjVyNjwagSQBgwAD70AFqjYxgwAD70MAAsL4EofVTjZuN0wagSgBgwAD70AFqjdBgwAD70MAAsPIEofZTjd+OIAagSwBgwAD70AFqjh1gwAD70MAAt18EofdTjiyOcQagTABgwAD70AFqjm5gwAD70MAAt2MEofhTjn2OsAagTQBgwAD70AFqjq1gwAD70MAArKgEoflTjryO9AagTgBgwAD70AFqjvFgwAD70MAAs5AEofpTjwCPOwagTwBgwAD70AFqjzhgwAD70MAArOEEoftTj0ePiAagUABgwAD70AFqj4VgwAD70MAAlHwAAVMADml2AA5gEQAAAAAADml2AAAAAAAAAKH8oFFUAAAggPcAAMAA9XMAAQABhfaBGgAArhUAAQEBoFKBUwAAp44AAQEBnkWBmAAAjBygUwCBwAAAjBwAAQEEgiWHy4fQiK6CEAAAnQqeDgEBAZy4glAAAK4jAAEBBKBUoFWgVqBXgp8AAK5WAAEBBqBYmVCgWaBaoFugXIMGAACudgABAQmgXaBeoF+gYKBhoGKgY6BkoGWD7AAAnRIAAQEElO2cvZyrnMCERQAAroAAAQEGoGagZ6BooGmgaqBrhPYAAJG9AAEBAYIThRwAAJ1FAAEBA5UtgimCKIWBAACoWAABAQGgbIWuAACRmwABAQGCD4XYAACuogABAQagbaBuoG+gcKBxoHKGlAAArtYAAIa6AACu/gABAQGgc4b8AACvjwABAQOgdKB1oHaHagAAsBwAAQEEkMCgd6B4oHmH+QAAsM8AAQEBoHqIIgAAsN0AAQEXoHugfKB9oH6gf6CAoIGggqCDoISghaCGoIegiKCJoIqgi6CMoI2gjqCPoJCgkYscAACzNAABAQGgkotnAACzYQABAQGgk4uMAACztgABAQGglIuvAAC0AQABAQGglYvwAACrAqCWAQECnuqgl4xTAACR2AABAQWVSJVUlViVWYJl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wADUn8AAWW8BAAGAwADUrsAO5VIAAKMQAKIwBqJuVMAA1MXAANTKwADWfAAAoXUAAAABA8AA1OLAANZ8AAAAAQEBwADU6QAAAJJOYJ6rAABcAT4CTsAA1P3AANUCAAChgmDAAP0cARzAANUELqDCAAAAAMAAWb1JwADVDyXAANUYgcAA1RPADubJYLLUPgJOwADVQ8AA1UwAAIV5YMAA/RwBIx7AANVOwABZZAIAAieBaoDAANVcwA7mtgAcwADVZS6gwgAAAADAAFm9HMAA1W0uoMAAAAAAojEBYMAA/Rw9HMAA1YIuoL8BAAEcwADVjBTAANWHwA7myQEBYLLUoYMCAAKCwADVmcAO5wQWwADVqYDAANWjwA7mtodOnrQAstkAojA+Az0cwADVyi6gwgAAAADAAFm9PYjAANXXwA7mthbAANXlgMAA1d/ADua2g7Cexj0cwADV8S6gvwEAARzAANX2LqDHAwADHMAA1iRqwADWCV2RYAFhAWCeq2CRSbC7iAUBAAGAwADWMsAO5rYAkWQewADWRMAAWWgBAAGAwADWU8AO5rYAHsAA1lvAAFlvAQABgMAA1mrADua2AACjEACiMAaib1TAANaBwADWhsAA1wAAAKGFAAAAAQPAANacwADXAAAAAAICAsAA1qoAAACCamCEfgDAANa+AAAAW2CFcwAAYMAA+goBPgFKwADW8QEpBqJwVMAA1wXAANccwADhIQAAoTkBasAA1wZgwAD9HAIAAAEDwADXMsAA4SEAAAAKBATAANdFAAAAhXlghKkAwADXVgAAAIC9YMAA/bYAwADXZgAAAFtghXMAwADXdQAAAIdOYMAA+9AABsAA148AAACIN2CDWQFqAGDAAPzZd8AA16UAAACHc2DAAPoKAWrAANeuYMAA+goAwADXwAAAAIUtYMAA+goBasAA18pgwAD6CgDAANfcAAAAhS9gwAD6CgFqwADX5mDAAPoKAMAA1/gAAACEGWDAAPoKAWrAANgCYMAA+goAwADYHgAAACJgkWcBagBgwAD82XdghKkBPglOwADYMsAA2DkAAGFgwAD70AEWwADYQIHAANg7wA7oyWHAAP26TsAA2FDAANhcAAChhmDAAPvQARzAANhjgcAA2F7ADujJlloBAAEngWoAwAD9yknAANh5IRzAANiJFMAA2H3ADumxCwBIAQABHMAA2IyUgcQAAAAAwAD78wDAAPzzPgE9FcAA2JjADumMChzAANifFMAA2JjADumMCgCBjQEAARzAANiuFMAA2KLADumxCwBkAQABlADAAPz1AMAA/PY/TsAA2MLAANjNAAChh2CIfgEewADY04iHAgACgcAA2NjADujJFsAA2OYWwADY3i6EQ6IIoOm0rQBOwADZDAAAAIJTXcAA/HQBYJFnAEnAANkZIiEcwADZJ4TAANkdwA7o9EgBAAErAMAA/SkAIRzAANlFFsAA2TyEwADZMsAO6PSEW4JlSAEAASsAwAD9KT4GTsAA2VrAANleAACArGDAAP43ARbAANlzFsAA2WqEwADZYMAO6PSEW4JlgbuKY07AANmDwADZigAAg1xgwAD70AEWwADZloTAANmMwA7o9IRTgllOwADZsAAAAJ8bYJFJAE7AANnKwADZ0QAAYWDAAPvQAWrAANnTYMAA+9AVScAA2eMiJcAA2fGEwADZ58AO6PRgg6QAFsAA2g0UwADaA8AO6PQEAWCDpISHg7A+Aj0VwADaJMAO6w4PFsAA2kYWwADaNxTAANotwA7o9AQBYIOkhPmDYYRTglk9FcAA2lrADuszEBzAANqpasAA2nFdkWABYQFgwAD9tmCRSY7JiAUBAAEWwADa0BbAANrBFMAA2rfADuj0BAFgg6SE+YNhgL2DGgCRZD4CPRXAANruwA7rQREWwADa/IHAANr3wA7oyWHAAP26PRXAANsMwA7rMxBqwADbI2CRVI6lPRXAANtIwA7qiA0xwADbUmCRZwEcwADbYhTAANtTwA7rMxAAglsDAAMUwADbb8AO6uAOABTAANt0wA7rDg8AFMAA23zADutBEQAAkVA/ScAA25AcwADbnBTAANuUwA7pcQkASAEAASsAwAD9KT4BScAA262GwADbscAO6SM+AT0VwADbxcAO6XEJHMAA3FAcwADbzy6hiAUAAhTAANvhwA7qUAwAg8AA2+3ADujkA4dzhcAA3BLADukJoYkqglMUwADcOsAO6ogNAKJxglsDAAMWwADcXS6ArKISg8AA3GLADujkFMAA3G7ADumMCgAAkVBJwADchIfAANyIwA7pPT4BPRXAANycwA7pcQkcwADdJxzAANymLqGKBQACFMAA3LjADupQDACDwADcxMAO6OQDh3OFwADc6cAO6QmhiSqC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34JensVhwAD9uoCXAQABlADAAPz/PgJOwAEQysABENAAAICWYMAA/bYBHsABEN6uhgQABBbAARD8hMABEPbADw/fgl6exYbAAREEwA8QO4TAARELwA8P3y4AScABESEWwAERKxTAARElwA8QvAgAg7LAAP29PgE9HMABEU+HwAERQ8APEGlWAQABHMABEVoWwAERUy6gmqIHobUCAAIUwAERaMAPELwIAITAARFvwA8P3wCzyADAAPyFPz9FwAERkAHAARGZwAERmwAAYmDAAPvQAZQBHMABEaIUwAERoMAPEWYIAGMBAAEcwAERsRbAARGqg8ABEaTADw86YcAA/KOBjQEAAZQAwAD89gDAAPz9ARXAARG2wA8RZggcwAERtxTAARG2wA8RZggAZAEAAZQAwAD89T4CTsABEczAARHRAACZ6mDAAP0cARzAARHYg8ABEdPADw86SwEAARTAARHZwA8RZggAAMAA/INJwAER5SXAARHuFMABEenADxHdCQBgnqs+AUnAARIEIRzAARIbFsABEhQWwAESDRTAARIIwA8R3QkBYJ6rgl6exWHAAP26SAEAAZMAwAD88z4CTsABEjbAARI8AACAlmDAAP22AR7AARI+rokEAAQWwAESTBTAARJHwA8R3QkBYJ6rgl6exYbAARJUwA8QOxTAARJbwA8R3QkBYJ6rLgA9HMABEoCHwAESdMAPEGlWAQABHMABEosWwAEShC6gmqIHobUCAAIUwAESmcAPEmQKABTAARKgwA8R3QkBYJ6rALPIAMAA/IU/PgE9HMABEtuHwAESz8APEGlWAQABHMABEt8uoMEBAAEUwAES58APEd0JAACiNADAAPyFScABEzIcwAETSRbAARNCFsABEzuFwAETNsAPEA2CXp7FYcAA/bqAlwEAAZQAwAD8/z4CTsABE1/AARNlAACAlmDAAP22AR7AARNnrocFAAUWwAETkIXAAROLwA8QDYJensWGwAETmMAPEDuFwAETn8APEA0WwAETqoXAAROlwA8QDYSHnr8uAEnAARPGFsABE9AUwAETysAPE2AIAIOywAD9vT4BPRzAARP0h8ABE+jADxBpVgEAARzAARP/FsABE/guoJqiB6G1AgACFMABFA3ADxNgCACFwAEUFMAPEA0As8gAwAD8hT8/PRzAARQ0LqC/AQABHMABFEAWwAEUOS6gmqIHobcCAAKHwAEUXsAPEGmBwAEUa8APDh0As+wAojAGon1UwAEUhMABFJXAARUrAAChuAFqwAEUhWDAAP0cAgAAAQPAARSnwAEVKwAAAAICAsABFK4AAAChuWCeqwDAARTAAAAAobpgwAD6CgAAXAE+Aj0cwAEUzy6g4QEAASehuwCjJ0nAARTvgcABFPPADxSNPgE9HMABFQsWwAEVBC6gmqIHobwBAAEmwAEVGwEcwAEVGy6gwgAAAADAAFm9YISpALO/PwaiflTAARUwwAEVQcABFXkAAKG9AWrAARUxYMAA/RwCAAABA8ABFU3AARV5AAAAAQEBwAEVVAAAAJJOYJ6rAABcAT4BPRzAARVhLqDhAQABJ6G+AKMnBqJ/VMABFX7AARWPwAEYdgAAob8BasABFX9gwAD9HAIAAAEDwAEVqMABGHYAAAABAQHAARWtAAAAocBgwAD70AAAXAE+BT0cwAEVwS6g4QEAASehwQCjJ07AARX5wAEV/wAAhH9dwAD8dAFghKkBHMABFgEuoMkBAAGAwAEWEcAPFX0AojZOwAEWNQAAAIW5XcAA/HQBYISpAEXAARaEAcABFo3AARaPAABiYMAA+9ABkwEcwAEWloPAARaUwA8V62MBAAEWwAEWnoHAARaYwA8VpGHAAPyjAMAA/P0Bi8ABFqbADxXrHMABFqeDwAEWpsAPFetkAQABlADAAPz1PgJOwAEWvsABFsMAAJnqYISpARzAARbKgcABFsXADxWkSwEAAYPAARbLwA8V6wDAAPyDScABFtUlwAEW3oTAARbZwA8WTWCGET4CScABFwAcwAEXEILAARcEwA8V0kgBAAErAMAA/Sk+AT2KwAEXJcAPFdIcwAEXOYHAARczwA8VpIFYAgACk4PAARdEwA8V6wDAAPyXP0bAARdawAEXisABF2oAAACCa2CEqQAWwAEXfRTAARd4wA8WTQQBYIYRhbmGEz4BPRzAAReigsABF5bADxXSVgEAAYXAARemwA8W6gDAAPyFPgFJwAEX1CEcwAEX5ILAARfYwA8V0kgBAAErAMAA/Sk+AT0cwAEYBYLAARf5wA8V0lYBAAGEwAEYCcAPFk0AwAD8hT89HMABGCwuoL8BAAEcwAEYOBbAARgxLqCaogehtwIAAjUAAAABAF3AAPx0AWCEqQGCwAEYVsAPFdIjHMABGGKDAMAPF5ZIAQABKwAAgcABGGXADxWkgwDADxeWAV3AAPx0AWCEqSsAs+wAojAGooBUwAEYe8ABGIzAARsOAAChwgFqwAEYfGDAAP0cAgAAAQPAARicwAEbDgAAAAEBAcABGKMAAACSTmCeqwAAXAE+BD0cwAEYsC6g4QEAASehwwCjJ07AARjSwAEY2AAAgJZgwAD70AEewAEY3sAA/AABAAEWwAEY7YDAARjnwA8YE4JensUAScABGPoWwAEY/i6CTKIVPgJJwAEZEhzAARkcgcABGRbADxg4SAEAASsAwAD88z4BPRzAARkvLqC/AQABHsABGTSdFgQABCehxCehwhbAARl2gMABGXDADxgTh06etBbAARmCLoCsohIAAKIwPgE9HMABGaAuoL8BAAEcwAEZrBbAARmlLqCaogehxQIAAoHAARm3wA8YOIDAARm+wA8YEwCzwgCiMErAARnVAD9JwAEacSIcwAEae4HAARp1wA8YOEgBAAErAMAA/PMBHMABGoyBwAEahsAPGDhjAQABkwDAAPz9PgE9HMABGpkuoL8BAAEcwAEapRbAARqeLqCaogehxgIAAhbAARq7gMABGrXADxgTgl6exYDAARrDwA8YEwCzwwCiMD4BPRzAARrfLqC/AQABHMABGusWwAEa5C6gmqIHocUCAAKBwAEa9sAPGDiAwAEa/cAPGBMAs8IAojAGooFUwAEbE8ABGyTAARupAAChxwFqwAEbFGDAAP0cAgAAAQPAARs7wAEbqQAAAAEBAcABG0IAAAChyGCeqwAAXAE+Aj0cwAEbUy6g4QEAASehyQCjJz0cwAEbfS6hAwMAA5MrgMABG5vADxn8AKJIBqKCVMABG67AARu/wAEcZQAAocoBasABG69gwAD9HAIAAAEDwAEb28ABHGUAAAACAgLAARviAAAAoctgnqsAwAEb9AAAAJ0EYJ6rAABcAT4CPRzAARwELqDhAQABJ6HJAKMnPRzAARwuLqHMAwADKRbAARxSgMABHEfADxpsg7CexoHAARxYwA8aeQCigwaig1TAARxqwAEce8ABHikAAKHMAWrAARxrYMAA/RwCAAABA8ABHI3AAR4pAAAAAwMDwAEcmgAAAKHNYMAA+goAwAEcrwAAAJ9AYJ6rAMABHMEAAACdBGCeqwAAXAE+Az0cwAEc0S6g4QEAASeGOACjJ07AARz/wAEdCgAAgmtghKkBI4DAAR0MwA8a+hzAAR0cLqDAAAAAAKIxKwFghKlJwAEdNiIhHMABHUWDwAEdOsAPGztIAQABKwDAAP0pABbAAR1QLqC7ois+AT0cwAEdZy6gvwEAARzAAR1sLqHOAgACasABHZNgkVSflhbAAR3AgcABHbXADxsJh06etACjFQCiMD4BPRzAAR3hLqC/AQABHMABHe0WwAEd5i6gmqIHoc8DAAOBwAEd/cAPGwmDwAEeCcAPGzuCwAEeFcAPGxYAs+sAojAGooRUwAEeLsABHj/AAR7xAACh0AFqwAEeL2DAAP0cAgAAAQPAAR5RwAEe8QAAAAEBAcABHlgAAACSTmCeqwAAXAE+BE7AAR5wwAEeegAAhbRghKkBHMABHnwuoMAAAAAAojE9HMABHo8uodEBAAGBwAEeqcAPHFUAoyo9HMABHrkuoL8BAAGBwAEevsAPHFUAojA9HcABHtSh0AEAAYDAAR7nwA8cQgCu0AaihVTAAR72wAEfB8ABH2sAAKHSAWrAAR73YMAA/RwCAAABA8ABHxfAAR9rAAAAAQEBwAEfHgAAAJJOYJ6rAABcAT4CPTUAAAABAGCvkAEWwAEfKy6goKIUIxzAAR85gQDADx0ASAEAASsAACscwAEfOYEAwA8dAKHTAAAAAK+bAVw9HcABH1Ch0gEAAYDAAR9hwA8c7ACu0QaihlTAAR9wwAEfgcABILAAAKHUAWrAAR9xYMAA/RwCAAABA8ABH4/AASCwAAAAAgICwAEflgAAAKHVYJ6rAMABH6UAAACh1mCeqwAAXAE+BU7AAR/AwAEfyQAAoddgh18BHMABH8suoM4BAAGBwAEf4cAPHZIAojlOwAEf+8ABIAQAAKHYYIdfARzAASAGLqDPAAAAAKI6TsABICXAASAvAACFtGCEqQEmwAEgJQEcwAEgMS6gwgAAAADAAFm9YISpPTUAAAABAGCvkAEWwAEgPC6goKIUIxzAASBKhQDADx4XSAEAASsAACscwAEgSoUAwA8eF6HZAAAAAK+eAVw9HMABIGEuoL8BAAEcwAEgbRbAASBmLqCaogeh2gUABYDAASB5wA8dhYTAASCCwA8d7IPAASCNwA8dzYHAASCXwA8dkoLAASCiwA8dpQCz5ACiMAaih1TAASC1wAEgxsABIZ8AAKHbAWrAASC2YMAA/RwCAAABA8ABINzAASGfAAAAAQEBwAEg4wAAAKHcYJ6rAABcAT4DPRzAASD9LqDhAQABJ6HdAKMnQBzAASFKFsABIT6AwAEhK8APHtidb57KSAEAASeAvADAAP3FwAEhK8ABIVAAPRzAASFXLqHeAgABHMABIWwuoMAAAAAAojEBod+AwAEhiMAPHtiiiQaiiFTAASGkwAEhtcABJYgAAKHgAWrAASGlYMAA/RwCAAABA8ABIdDAASWIAAAAAQEBwAEh1wAAAJJOYJ6rAABcAT4GPRzAASHkLqDhAQABJ6HhAKMnTsABIhLAASIaAACEHWDAAPoKASEcwAEiSBzAASI7FsABIh0uoK+iJIN3AQABasABIj1gwAD70CEAwAD76EgBAAGTAMAA/PNOwAEiV8ABIl8AAIQbYMAA+goBIRzAASKNHMABIoAWwAEiYi6gr6Ikg3cBAAFqwAEigmDAAPvQg1EAwAD76EgBAAGTAMAA/PNOwAEiogAAAIUBYISpAEnAASKzIR7AASK4wABZZAIAAieZ9oDAASLHwA8fgwA+AUnAASOigcABI6bADx+oPgE9i8ABI7nADyA3HMABI8cuoMcDAAMcwAEkHWrAASPnXZFgAWEBYMAA/bZgkUmeJYgFAQABFsABJDGAwAEkK8APH4OCXp7FAJFkFsABJEyAwAEkRsAPH4OHTp60FsABJGqAwAEkZMAPH4NhnsQAoxBJwAEkgILAASSEwA8f7z4BPYvAASSXwA8gNxzAASSlLqDHAwADHMABJPtqwAEkxV2RYAFhAWDAAP22YJFJu4iIBQEAARbAASUPgMABJQnADx+Dgl6exQCRZBbAASUqgMABJSTADx+Dh06etBbAASVIgMABJULADx+DYZ7EAKMQPz89HMABJWMuod4BAAGDwAEleMAPIDcAookGoolUwAEljcABJZLAASltAACh3gAAAAEDwAElpsABKW0AAAACAQHAASWyAAAAhQFghKkAAcABJcYAAACh32CeqwFqAGDAAPzZd1wBPgpOwAEl4cABJeYAAIPuYMAA/RwBHMABJeguoMIAAAAAwABZvUnAASXzJcABJfyCwAEl98APIcxgwABaBz4CPRzAASYXLqC/AQABFMABJhzADyHMAgFgwABaBwCiMErAASYpAD9OwAEmRsABJlEA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wAE2pC6g4QEAASeGDwCjJ07AATbHwAE2zQAAmfdgh18BHMABNs8uoMsDAAOAwAE22MAPMBiBwAE238APMCeCwAE26sAPMDQAojg9HMABNvsuoQYAAAAArrs9HMABNxEuoL8BAAGDwAE3FsAPMFkAojAGopFUwAE3JcABNyrAATfjAACh8wAAAAEDwAE3RMABN+MAAAABAQHAATdLAAAAkk5gnqsAAFwBPgE9HMABN9EuoMIAAAAAwABZvQaiklTAATfowAE3+cABOZMAAKH0AWrAATfpYMAA/RwCAAABA8ABOBPAATmTAAAAAQEBwAE4GgAAAJJOYJ6rAABcAT4EPRzAATgnLqDhAQABJ6H1AKMnTsABOFrAAThgAACAlmCEqQEcwAE4Yi6gwAAAAACiMU7AATh8wAE4hgAAoOtgwAD9HAEcwAE4iC6gwgAAAADAAFm9ScABOJMhJcABOKGCwAE4l8APMXlgsOU+AT0cwAE4uC6gvwEAARzAATi9LqDHAwADasABONBgkVTAAGhyHsABOOTAAFloAQABgMABOPPADzE1AB7AATkFwABZbwEAAYDAATkUwA8xNQAAoxAAojA+AT0cwAE5MS6gvwEAAR/AATk6snEFAAUugMABOV3ADzE1JsABOWQBgsABOWTADzF5YLDlgcABOW/ADzFaFsABOXyAwAE5dsAPMTWdb57KAACiMAaik1TAATmYwAE5qcABOt8AAKH2AWrAATmZYMAA/RwCAAABA8ABObLAATrfAAAAAQEBwAE5twAAAIdOYMAA+9AAAFwBPgFJwAE5ySXAATnUHMABOc0unzoAAAAAwABZvGCjYT4DTsABOfjAATn/AACCRWCjYQEmwAE5+AEcwAE6AS6fOgAAAADAAFm8YKNhPRzAAToPLqH3AgACgMABOiDADzKOFsABOjOBwAE6LMAPMsKh+KNkAK68PRzAATpHLqH5AgACgMABOlvADzKOFsABOm6BwAE6Z8APMsKh+qNlAK69PgI9HMABOpIuofcBAAGAwAE6o8APMo4Arrw9HMABOrYuofkBAAGAwAE6ysAPMo4Arr0GopRUwAE65MABOunAATutAACh+wAAAAEDwAE6+cABO60AAAABAQHAATsEAAAAhUtgh18AAFwBPgFJwAE7FSEcwAE7LxbAATsZLqCqoh9IAQABKwDAAP0pPgI9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+oJZhgDAEDQwgcACl07AEDL6AKMvBqMRVMACl2LAApd5wAKZogAAoO4BasACl2NgwAD9HAIAAAEDwAKXhsACmaIAAAAEAwPAApeSAAAAgmtghKkAwAKXpgAAACJgkUkAwAKXswAAAGFgwAD70AABwAKX1wAAAIJTXcAA/HQBYJFnAWoAYMAA/Nl3YISpAT4DTsACl+vAApf2AACHTmDAAPvQARzAApf/FsACl/guoJqiB5jDAQABgMACmArAEDS3ALPNTsACmCTAApgtAACHrGCRoQEWwAKYPBbAApg3gcACmC/AEDTEgpORS4eskURJwAKYSiIcwAKYV4XAAphOwBA1NEgBAAFqwAKYY2CRoYGhAMAA/SkBIhzAAph9hcACmHTAEDU0SAEAAWrAApiJYJGhiGwAwAD9KQAhFsACmKAugkyiFT4BSsACmLQBHMACmLsuoNoDAAKAwAKY28AQNLccwAKY74HAApjnwBA0xIJbAwADFsACmPwugKyiEoTAApkBwBA1AYLAApkNwBA00ACRUAGCU4PAApkpwBA036MSPgI9HMACmUYunmoEAAOBwAKZUcAQNMSEwAKZWsAQNQGCwAKZZsAQNNABglODwAKZd8AQNN+jJErAApmHAYDAApmOwBA0twajElTAApmnwAKZvsACnHEAAKDaAWrAApmoYMAA/RwCAAABA8ACmdLAApxxAAAAAwICwAKZ3gAAAIJrYISpAMACmfkAAAAiYJFnAAHAApoeAAAAglNdwAD8dAFgkWcBagBgwAD82XdghKkBPgNOwAKayMACms8AAINcYMAA+9ABHMACmtgWwAKa0S6gmqIHmMMBAAGAwAKa48AQNokAs81JwAKa9BzAApr/g8ACmvjAEDbFSAEAARzAApsClIHEAAAAAMAA+/MAwAD88z4BPYvAApsOwBA2xRbAApsfgcACmxfAEDaWh06Raj9KwAKbNQEfwAKbQIc8AgACNcACm1EAAAEAYIhOAR/AAptRiHICAAEcwAKbey6hDAEAARzAApuWLqDHBAADFsACm7yBwAKbtMAQNpaIsZFsFsACm9OBwAKby8AQNpaHTpFqFsACm+eBwAKb38AQNpZhkWsBglOCwAKcCMAQNqOjEACjMAGCkGrAApwrYIjihIg1AAAAAQBbARfAApxFhMACnEPAEDdThFODwAKcUsAQNsWC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ggAAot8BasAC5V9gwAD9HAIAAAEDwALlk8AC5oIAAAADAwPAAuWmAAAAo51ghKkAwALluwAAAFtghXMAwALlygAAAIdOYMAA+9AAAGCEqQE+AknAAuXcFsAC5eAugkyiFUrAAuXsAYDAAuXzwBBs0z9KwALmAgE1wALmIQAAAQBghKkBHsAC5iGtXgIAAoDAAuZJwBBs04HAAuZUwBBs4AA1AAAAAQBbARfAAuZng8AC5mXAEG0ohFOCwALmdMAQbOyCWYMAwBBtKAajNFTAAuaHwALmnsAC58EAAKOgAWrAAuaIYMAA/RwCAAABA8AC5r7AAufBAAAABAQEwALm0QAAAKOdYISpAMAC5uEAAACjoWDAAPoKAMAC5vgAAACjomCEqQDAAucBAAAAh05gwAD70AAAYISpAT4CScAC5xMWwALnFy6CTKIVSsAC5yMBgMAC5yrAEG2sP0rAAuc5ATXAAudYAAABAGCEqQEewALnWK1fAwADgMAC54LAEG2sgcAC543AEG25gsAC55nAEG3IADUAAAABAFsBF8AC56aEwALnpMAQbhGEU4PAAuezwBBt1YJZhADAEG4RAAAOdUsADnWcAA514AAOdj0ADnaCAA53EgAOd1IADneSAA537QAOeVEADnnFAA56tgAOe6cADnx5AA581AAOfSIADn2dAA5/NAAOgQgADoM6AA6DswAOhHMADoTiAA6JagAOioIADouIAA6MjgAOkMwADpEVAA6SSAAOlPsADpWJAA6WDwAOlrcADpclAA6auQAOm3QADqp5AA6r/wAOrZIADrZyAA66TgAOvmkADsNuAA7EQQAOxTEADsYsAA7LtAAOzEcADtFKAA7R7wAO0v8ADtbBAA7X7wAO2fgADtrCAA7bSQAO2/sADt0LAA7fwgAO4okADuO1AA7lKwAO5o8ADug6AA7oigAO8CoADvG+AA7zVAAO9esADvanAA73aQAO9/kADvw0AA79pwAO/lUADwuZAA8NAAAPDW4ADw3cAA8UTgAPFPUADxVLAA8X4QAPGcoADxo6AA8ayAAPHBAADxy6AA8dUwAPHqYADx9RAA8hfQAPJLAADyUAAA8luQAPJogADyfDAA8qDQAPL+YADzC5AA8xAwAPMlwADzNxAA80CgAPNsIADzc1AA83iwAPN+EADziuAA88+AAPQZoAD0I6AA9D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ACEcwABHoxbAAEeWLqPHo5pIAQABKwDAAP0pPgROwABHwcAAR88AAKP+XcAA/WcBYIKLAR7AAEfVwADA4gABYIKLAABGwABH68AASB/AAEf/AAAAhCFgwABVpgAWwABIFxbAAEgKLqPHo5opwAD8yD4BPRzAAEg3gcAASCnAELomVgEAARbAAEhDgsAASDvAELpVgkXAAFW3AMAA/XRGwABIWsAASILAAEhpAAAAo/9gikgAFsAASHMuo9Cjoz4BPRzAAEiagcAASIzAELomlvcBAAEWwABIq4LAAEikwBC6r4bTikwAwAD9eEbAAEjFwABI6MAASNIAAACIimCCiwCBwABI2cAQuiY+AT0cwABJAoDAAEjywBC5zlYBAAEWwABJCoLAAEkGwBC6/IR3go0AwAD9dD8Go6xVwABJQsAASU/AAE49AACj7gAAAAEDwABJacAATj0AAgABAQHAAEmGAAAAo+RdwAD8dAFgwABVpgAAXcAAuKkBXAE+Dk4AAAABgchdwAC37wFcAR/AAEmdwAC3/AABXAAATgAAAACByV3AALilAVwATgAAAACBylsATgAAAACBy1sATgAAAACBzFsATgAAAACBzVsBk04AAAAAgc5bAE4AAAAAgc9bAE/AAElPAAAAAIHQWwADwABJacAATj0EAAADAAMAAAAAgdFbAAAAAACB0lsAAAAAAIHTWwAAWwFLPgNBPgFJwABJoyEcwABJtRbAAEmnLqPQo6NIAQABKwDAAP0pPgROwABJy8AASdoAAKQAYMAA+goBKkbAAEnpwABKEcAASfgAAACj/2CKSAAWwABKAi6j0KOjPgNOwABKIMAASi4AAKQBYMAA+goBKkbAAEo/wABKZcAASkwAAACIimCCiwAWwABKWhTAAEpTwBC8ZA4AhtOKTD4BScAASnEhHMAASpUWwABKjBbAAEqFFsAASnYuo8WjmJUVn7OebaAoh0EBAAEWwABKpRTAAEqhwBC8mhAAhHeCjQDAAPy4PgQ9HMAASt8WwABK1RbAAErOFsAASr8uo8WjmJUVn7OG06AqVgEAARTAAErjwBC8mhAAAMAA/IU9HMAASwQWwABK9S6jxaOYnk4BAAEUwABLD8AQvJoQAACfuj0cwABLMYDAAEshwBC7ZlYBAAEcwABLSxbAAEtEFsAASzUuo8WjmJUVn7OeawIA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ABEmOAARJlkAESaJABEmuQARJvQAESckABEneQARJ7AAESfpABEoHQARKFsAESjDABEpAwARKqcAES9bABEy1AARM40AETQkABE3GQARN98AETpbABE9CQARPhcAEUAtABFCLAARQnwAEUMvABFDogARQ/gAEUR7ABFFUQARRd0AEUYrABFHnQARSS8AEUonAAAAJAKkhFnAAFhtwABYc8AAW1EDpTEAAAFgwAD9HAABYICRAgSkh1nAAFi0wABYvQmlMqQzAGCkNgAEpIhZwABY2sAAWOUJpTOkMwBggJEAAQWkjVnAAFjqwABY6sAAWWQAAAADwABY+cAAWWQAAAACAgLAAFj/AAAEpTJgpDYAwABZHQAAAIGTYICRAABgpIQBPwMIAaSHgADAEUswCACkiDUAAAABAGCAkQGBwABZQMARSz0jHMAAWUeCAMARS2BIAQABKwAAasAAWVBgtW3AALveggDAEUtgAWCAkQkBwABY6sAA/TIAAAAAAgakilnAAFlpwABZhMAAWt0AAIKOAWrAAFlqYMAA/RwCAAABA8AAWZTAAFrdAAAAAwMDwABZowAAAIC9YMAA/bYAwABZsAAAAIKPYMAA/bYAwABZygAAAIKQYHUAAGCAhQE+AknAAFnWFsAAWeQWwABZ2i6lMqQzpIeksaRWPgFKwABaSgEcwABabGrAAFpXYLVtwAC73oKOAwADgMAAWn3AEUvcgcAAWoPAEUvrgsAAWo7AEUv6ALVvP0rAAFqfARzAAFqyFsAAWqYupTOkM6SIgo4DAAOAwABaw8ARS9yBwABaycARS+uCwABa1MARS/oAgJMGpItZwABa4sAAWwPAAFtPAACCkQFqwABa42DAAP0cAgAAAQPAAFsTwABbTwAAAAEBAcAAWxgAAACArGDAAP43AABggIsBPgFKwABbIwEcwABbNhbAAFsqLqUzpDOkiIKRAQABgMAAW0fAEUzQAICUAAARS6oAEUyeABFNDgAAAAICpI5ZwABbncAAW6PAAFvaA6U0AAABYMAA/RwAAAIEpJBZwABbu8AAW8cYpTUAYMAA+9ABkwSkkVnAAFvPwABb2BiAgABgwAD70AGTAQWkkwAAAAAEAAADAAAAAAAAAAAAYKSOAT8BCQEAwAD9MgAAAAAAAAARTZIAAAAAAqSUWcAAW93AAFvjwACADwOlNgAA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hU4WwABHdYDAAEdwwBJMooVOhIGFTxbAAEeggMAAR5vAEkyihU+EgjUAAAABAFsBF8AAR7mEwABHt8ASTcaEUxzAAEfGLqf/p8QBAAEWwABH3IDAAEfXwBJMooRTglkAp9SCWTUAAAABAFsBF8AAR/CEwABH7sASTcaEzBzAAEgALqf/p8QBAAEWwABIFoDAAEgRwBJMooTMhIAAp9SEgIQAwBJNxgaoJGzAAEgtwABILcAASPEAAIWaAAAAAQPAAEg7wABI8QAAAAEBAcAASEYAAACD7mCFcwAAWwE+AUrAAEhSAR/AAEhdhX8DAAEcwABIghzAAEh3FsAASGyAwABIZ8ASTyGFjYV2gKsBAWCEqQE2FsAASHsunqun1QFghKkAwAD8PYCtAAAAAMAA/EgChWccwABItRzAAEimFsAASKCAwABIm8ASTyGFZ4V1gKsBAWCIswEWwABIqi6e5KfXAMAA/D2ArQAAAADAAPxIhVccwABI5BzAAEjZFsAASNOAwABIzsASTyGFV4V3gKsBAWCFgQE2FsAASN0unqun1QFghYEAwAD8PYCtAAAAAMAA/EgGqCVswABI9sAASPbAAEljAACFnAAAAAEDwABJCsAASWMAAAABAQHAAEkbAAAAg+5ghYEAAFsBPgFKwABJJwEfwABJMoWKAgACFsAASUeAwABJQsASUDCAvYWDHMAASU0unqsBAWCEqQEWwABJWIDAAElTwBJQMICWhYQAp9UABqgmbMAASWjAAElowABJtwAAl9MAAAABA8AASXvAAEm3AAAAAQEBwABJiQAAAIPuYIZwAABbAT4BSsAASZUBHMAASZwul9kBAAGAwABJrsASUK8AqCcGqCdswABJvMAASbzAAEohAACX2QAAAAEDwABJzcAASiEAAAABAQHAAEnZAAAAg+5ghKkAAFsBPgE9MMAASeUkwABKHQInqAmAwABKGMASUQUGqChswABKJsAASibAAEqOAACX2wAAAAEDwABKOMAASo4AAAABAQHAAEpFAAAAg+5ghDEAAFsBPgE9MMAASlEkwABKigInqAqAwABKhcASUVYGqClswABKk8AASpPAAErsAACX3QAAAAEDwABKoMAASuwAAAABAQHAAEqoAAAAg+5gg1kAAFsBPgE9MMAASrQkwABK6AInqAuAwABK48ASUacGqCpswABK8cAASvHAAEtTAACX4QAAAAEDwABLAcAAS1MAAAABAQHAAEsMAAAAg+5gh18AAFsBPgE9MMAASxgkwABLTwInqAyAwABLSsASUfgGqCtswABLWMAAS1jAAEvVAACHBQAAAAEDwABLZ8AAS9UAAAABAQHAAEtxAAAAg+5gglIAAFsBPgE9MMAAS30kAAMnqA0nqA6AwABLzMASUkkGqCxswABL2sAAS9rAAExGAACFTAAAAAEDwABL8MAATEYAAAABAQHAAEwDAAAAg+5ghHUAAFsBPgFKwABMDwEfwABMGoR9AQABHMAATCwunqsBAWCHjQEWwABMN4DAAEwywBJSmoVLhHcAp9UABqgtbMAATEvAAExLwABMtgAAhgsAAAABA8AATGTAAEy2AAAAAQEBwABMegAAAIPuYIdUAABbAT4BSsAATIYBH8AATJGHXgEAARbAAEyrgMAATKbAElMHhKKHVgAGqC5swABMu8AATLvAAE0CAACEtgAAAAEDwABMysAATQIAAAABAQHAAEzWAAAAg+5gguAAAFsBPgFKwABM4gEcwABM6S6HBQEAAYDAAEz5wBJTYwCoKwaoL2zAAE0HwABNB8AATZYAAIVDAAAAAQPAAE0cwABNlgAAAAEBAcAATS4AAACD7mCEPwAAWwE+AUrAAE06AR/AAE1FhE0CAAIWwABNcIDAAE1rwBJTuYVChEEcwABNgC6eqwEBYISpARbAAE2LgMAATYbAElO5gJaEQgCn1QAGqDBswABNm8AATZvAAE4xAACFqgAAAAEDwABNrcAATjEAAAABAQHAAE28AAAAg+5ghd8AAFsBPgFKwABNyAEfwABN04XqAgACHMAATeounqsBAWCEqQEWwABN9YDAAE3wwBJUOIJrheEAp9UcwABOJBzAAE4VFsAATgeAwABOAsASVDiFF4XigKsBAWCIswEWwABOGS6e5KfXAMAA/D2ArQAAAADAAPxIAAaoMWzAAE42wABONsAATpAAAIVAAAAAAQPAAE5NwABOkAAAAAEBAcAATmEAAACD7mCEOAAAWwE+AUrAAE5tAR/AAE54hD4AAAAABqgybMAATpXAAE6VwABO6gAAhKsAAAABA8AATqvAAE7qAAAAAQEBwABOvgAAAIPuYIK7AABbAT4BSsAATsoBHMAATtEuhwUBAAGAwABO4cASVSwAqCsG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wACYNcAAmJIAAJ8iAWrAAJgeYMAA/RwCAAABA8AAmEfAAJiSAAAAAQEBwACYUQAACIKQYIizAABgwABWdQE+AUrAAJhdASbAAJhdARzAAJhpgMAAmGTAExNehE0BAAEfwACYdMAAUeQBAAEuAACItWDAAFZ1AAASqygAEqufABKryAAStVwAErblABK30AASuj0AEr31ABLC3gASwxIAEsNxABLGWwASyngAEsyMABLNlQASzp4AEs+LABLQewAS0Z4AEtL0ABLUYgAS1YgAEtauABLY/QAS4NoAEuXkABLxewAS8tUAEvW0ABL4JgAS+RUAEvloABL6jwAS+3YAEvypABL+fQATAMYAEwHXABMDcAATBOsAEwamABMHjgATB/kAEwpdABMLugATDqUAEw92ABMRrQATEfEAExMsABMTqQAAADICqStwwACicsAAonjAAKMFA6jTAAABYMAA/RwAAAMEqS1wwACincAAoqAJmcIAYIMUAASpLnDAAKK0wACitQmB1QBgiV8ABKkvcMAAosnAAKLKCYJKAGCJXwABBakxcMAAos/AAKLVwACjAwEAAAPAAKLpwACjAwAAAAMDA8AAou8AAASZwmCDFADAAKL5AAAEgdVgiV8AwACjAQAABIJKYIlfAABgqSsBPwQIAaktgADAExT3CAGpLoEAwBMVBAgBqS+CAMATFREJAcAAotXAAP0yAAAAAAAAABMVUgAAAAAEBKjicMAAmSHAAJyVBqjUAGDAAP22AWrAAJk5YMAA/bbAANTPBKjjcMAAnSHAAKCGBqjVAGDAAP22AWrAAJ06YMAA/bbAANTSBKjkcMAAoRfAAKGOBqjWAGDAAP22AWrAAKE1YMAA/bbAANTVBKjlcMAAoh7AAKJvBqjXAGDAAP22AWrAAKI6YMAA/bbAANTYAAFwABMV7QASqZwAExR6ABMVWwAAAAIAExXtAAAAAAAAAKkyqNhxAAALg9QAAMAA9XMAAQABhfaD9wAAwADp+ZVwAIQQAACCLgAAhDIAAJuSAACEYAAAp8QAAISEAACcRQAAhK0AAIImAACE0gAAmqQAAIT9AACbSQAAhS0AAIq+AACFWwAAjBwAAQEdgiWHy4ndieGJ+oo9ikKKRopKh9CJ4onnieyJ8Yn7if+KIooDigeKC4oQihSKGYoeiiaKK4ovijSKSwABAKjZ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APoKASsEqX9xv9K/8wmo+QBgiYQBH7/liYsAAAAABKmAccAAQArAAEAvCaj6AGCJjAEfwABAHYmTAQABKQAEqYFxwABARsAAQG0JqPsAYImMAR/AAEBaiZMBAAEqAASpgnHAAECHwABAmAmo/ABdwAD8dAFgglIBMcAAQJZgglIABKmDccAAQK3AAEC8GKj9AGCp4QErBKmEccAAQNbAAEDZGJZ1AGCp7wAEqYVxwABA7cAAQR4YqP4AXcAA/WcBYISpAR7AAEEEwADA4wABYISpAAAEqYZxwABBOsAAQWoYqP8AXcAA/KUCYIluYIluAR7AAEFIwADA2gACYIluYIluAAAEqYdxwABBdMAAQYgYqQAAYMAA+goBKwSpiHHAAEG8wABBxRipAQBgwAD70AErBKmJccAAiLTAAIj7BakCAGDAAP1GAR7AAIjXwAD9XwEAASepAwAEqYpxwACJDcAAiscGqQQAXcAA/HQBYMAA/bYBasAAiSFdwAD8dAFgwAD9tsAA1NsBBangccAAQonAAEKJwABHtwAAAAPAAEKawABHtwAAAAYEBMAAQqAAAASnwGCK3QDAAEKuAAAEh5VdwAD8pQJgwAD9tmDAAP22AMAAQscAAASGxmCbTADAAELjAAAEqOZgqg0AAsAAQv4AAASezGDAAPoKAWrAAEMMYMAA+goAwABDGAAABIeWYMAA+goBasAAQzVgwAD6CgBgqW8BPgJJwABE5CIcwABE+xbAAEToLoeVqXNIAQABKwDAAP0pACEWwABFDxbAAEUHLqfAqXGHWYrlPgE9MMAARTUfwABFP8AA+wMBAAEkAAInqQUnqQYAPz0XwABF7S6o+DLAAEYQYIMUYMAA+goMFsAARiIWwABGGC6HYal1msacjSkWwABGQxbAAEY5LodhqXWaypyUKhbAAEZnFsAARl0uh2GpdZrHnJkpFsAARocWwABGfS6HYal1nC+cmikWwABGshbAAEaoLodhqXWa0pygKRbAAEbTFsAARskuh2GpdZrUnKQpFsAARvMWwABG6S6HYal1msWcqCkWwABHFBbAAEcKLodhqXWaxJyqKRbAAEc3FsAARy0uh2GpdZrTnKMpFsAAR1cWwABHTS6HYal1msucuCkWwABHehbAAEdwLodhqXWazJy5KRbAAEedFsAAR5Muh2GpdZrNnL4pqX4NCAGpcYAAwBM4BwgBqXOBAMATOBQIAal2ggDAEzguCAGpd4MAwBM4OwgBqXiEAMATOEkIAal0hQDAEzhjCACpchbAAENfgMAAQ1fAEzgHh1eK5AgAqXUWwABDlILAAEOEwBM4Lodhm04IAKl7MsAAQ9NgiW5giW4ACACpfDLAAEP7YIJLYIluAAgAqYQfwABEEan/AAAAAAgAqXkmwABERQEjhMAAREfAEzhJHMAARJIWwABEexbAAERxgsAARGHAEzguh2GbTiecSZwLAwADJ560J6kHJ6kIAKZiKwFgg1lgg3cJAcAAQomaCQAAAABRBqmMccAAQfTAAEH9wABCOgEAqQkAAAABA8AAQhHAAEI6AAAAAAAAAGDAAPoKAUrAAEIUASIWwABCFC6pAKmHASEcwABCNhbAAEIsLqkBqYhIAQABkwDAAPzzBqmNccAAQj/AAEJIwABChAEAqQoAAAABA8AAQlzAAEKEAAAAAAAAAGDAAPoKAUrAAEJfARzAAEJvFsAAQl8uh1epckgBAAFqwABCgmCK0YWyAMAA/SkGqY9xwABHvMAAR8DAAEhcAACcwgAAAAEDwABHysAASFwAAAABAQHAAEfUAAAAg+5gglIAAGDAAP43AT4CQ8AAR+AiIRzAAEfsgMAAR+fAEzunSAEAASsAwAD9KQAhJcAAR/yAwABH98ATO6dggm8+AT2IwABIFcATO6cWwABIIYDAAEgcwBM7p4RSglhKwABIMwE1AAAAAQBggm8BJsAASEAAgMAASDvAEzunYIJvIxzAAEhRgQDAEzwUSAEAASsAACsWwABIUYEAwBM8FIRhgnEBYMAA/jcGqZBxwABIYcAASGXAAElgAACpCwAAAAEDwABIcsAASWAAAAACAgLAAEh3AAAAgKxgwAD+NwDAAEiFAAAAg+5gglIAAGDAAPvQAT4DScAASJEcwABImYDAAEiVwBM8f0gBAAErAMAA/l5KwABIogFqwABIsmDAAPvQgZw/Q8AASMAiIRzAAEjMgcAASMfAEzyOSAEAASsAwAD9KQAcwABI5xbAAEjcgcAASNfAEzyOhFOCWUgBAAFqwABI82DAAPvQgZwAwAD88z4BPYnAAEkFwBM8jhbAAEkRgcAASQzAEzyOhFKCWErAAEkjASMcwABJL4HAAEkqwBM8jkgBAAErAMAA/SlqwABJQmDAAPvQgZwWwABJUoHAAElNwBM8joRTglkBYMAA+9AGqZFxwABKb8AASnjAAFCcAACe3gAAAAEDwABKgMAAUJwAAAABAQHAAEqMAAAAg+5ghKkAAGCJbgE+Az0XwABKmC6pACqphz0XwABKui6pAZOpiEs+A07AAEriwABK6QAAgXZgiW4BHMAASusuqQypMgEAAYDAAEsCwBM9qACpnknAAEsPIhbAAEsTLoeWqXQAJcAASziBwABLMcATPdhgij0+AUrAAEtaARzAAEthLoHDAgACgMAAS2jAEz2oasAAS25gkVSdQgCpkj9KwABLmgGBwABLocATPdgAAsAAS69gqgABwABLygAAAYNNYKoAAAA+CE7AAEvfwABL4wABgKxgwAD+NwEcwABL5S6cwgEAARbAAEvygcAAS/DAEz5mg+6qAgCpj07AAEwJwABMFAABhFNgwAD70AEcwABMFi6pCwIAAoLAAEwkwBM+dxbAAEwrgcAATCnAEz5mg+6qAgCpkE7AAEw+wABMTQABiLJgkWcBHMAATFkWwABMUYHAAExPwBM+ZiKqA4JbAwADgsAATGbAEz53g8AATGvAEz6qasAATHdgwAD70BUAkVBOwABMj8AATJ8AAakNXcAA/HQBYJFnATHAAEyxYJFnAEnAAEy7IRzAAEzJFsAATMGBwABMv8ATPmaCU6oESAEAASsAwAD9KT0cwABM4oXAAEzSwBM/MoClAQABFsAATOuBwABM6cATPmaCU6oEAMAA/IY/RsAATPvAAE0lwABNDwAAAYPuYIJSABbAAE0XLqj8qYI+A07AAE05wABNPQABgKxgwAD+NwEcwABNPy6cwgEAAYbAAE1KwBM/rQCpj07AAE1jwABNbgABhFNgwAD70AEcwABNcC6pCwIAAofAAE1+wBM/x4bAAE2DwBM/rQCpkD0cwABNooXAAE2SwBM/MlYBAAEcwABNy2rAAE2zYJFUluaCWwMAA4fAAE3YwBM/xxTAAE3dwBM/8QgAasAATelgwAD70BUAkVwAwAD8hT0cwABOERbAAE4DLqjmqXeBwwIAAoTAAE4YwBM+5oXAAE4owBM/MgCqD0rAAE5AAR/AAE5LikcBAAEfwABOY4S7AQABFsAATn8WwABOd4HAAE51wBM+ZiKqAyKRTAAAwABOkGCqBwHAAE63AAABg01gqgcAAD4ETsAAT5jAAE+gAACpDmCEsQEfwABPpoS7AQABFsAAT7qBwABPuMATQNgiqgoAScAAT8ocwABP4RbAAE/WgsAAT87AE0DphFOCWUgBAAFqwABP7WDAAPvQgZwAwAD88z4BPRfAAFAJgsAAUAHAE0DphFMWwABQG4DAAFAWwBM9qIRTglmCWT89HMAAUEMWwABQNS6o5ql3qQ8BAAGCwABQW8ATQOkAqhBKwABQawEfwABQdopHAQABgsAAUIrAE0DpAAapknHAAFDqwABQ78AAUXsAAIHDAAAAAQPAAFD1wABRewAAAAMCAsAAUP8AAACD7mCCUgDAAFENAAAAImCRSQABwABRLAAAAIJTXcAA/HQBYJFnAWoAYMAA/Nl3YMAA/NkBPgE9MMAAUTwfwABRRqoGAwACgMAAUVfAE0HQgcAAUV3AE0HdAYJTgsAAUW/AE0HqBqmTccAAUhbAAFIbwABShwAAqRAAAAABA8AAUijAAFKHAAAAAgICwABSMgAAAIPuYIJSAMAAUj8AAAAiYMAA/bYAAGDAAPzZAT4BPTDAAFJOH8AAUliqDAIAAoDAAFJ1wBNCYoHAAFJ7wBNCbwAGqZRxwABSysAAUtPAAFO5AACpEQAAAAEDwABS3sAAU7kAAAACAgLAAFLqAAAAnq1ghKkAwABS/wAAAIRXYISpAABgiW4BPgI9F8AAUx6BwABTEsATQt2EUxbAAFM0gMAAUyvAE0LQhFOCWYJZSsAAU4oBH8AAU5WKRwEAAYHAAFOpwBNC3QAGqZVxwABUuMAAVMPAAFW2AACpEgAAAAEDwABUysAAVbYAAAABAQHAAFTUAAAAhf9giW4AAGCEqQE+A07AAFTvwABU+gAAgmtghKkBHMAAVQWAwABU/MATQ1eGmQAAAACJdUnAAFUZIRzAAFUvFsAAVR4uqP6phVYBAAGBwABVM8ATQ2wAwAD9dD4CPYnAAFVIwBNDbBzAAFVcFsAAVVUunq6pfZ6rAQFghKkBgcAAVWLAE0NsAKfVPRzAAFWGFsAAVXUuqP6phVYBAAGBwABVisATQ2wAwAD9dD9KwABVoQGBwABVqMATQ2wGqZZxwABXscAAV7bAAFfQAACpEwAAAAEDwABXv8AAV9AAAAAAAAAAXAFKwABXxQE1AAAAAQBgwAD70AEWwABXxS6pAamINQAAAAEAYMAA+9ABF8AAV8UuqQEcwABXzoAAwBNES2QBAAGUAMAA/PWpiIAAwBNESwapl3HAAFgQwABYFcAAWC8AAKkUAAAAAQPAAFgewABYLwAAAAAAAABcAUrAAFgkATUAAAABAGDAAPvQARbAAFgkLqkBqYg1AAAAAQBgwAD70AEXwABYJC6pARzAAFgtgADAE0TCgY0BAAGUAMAA/PapiIAAwBNEwgapmHHAAFg0wABYPcAAWWIAAIZ+AAAAAQPAAFhCwABZYgAAAAICAsAAWEwAAACerWCJbgDAAFhfAAAAhFdgiW4AAGCJbgE+AknAAFhyIR7AAFh3wAD1sQIAAoDAAFiBwBNFMIHAAFiLwBNFPQA+BD2IwABYocATRTAcwABYrC6c4gEAAYDAAFi5wBNFMACp2D2JwABYysATRT0cwABY2C6c4gEAAYHAAFjlwBNFPQCp2D0cwABZABbAAFj5Lqj/qYaAvwIAAoHAAFkBwBNFPYDAAFkQwBNFMADAAPy6SsAAWSABgcAAWSfAE0U9P0rAAFk+ARzAAFlFLpziAQABgcAAWVLAE0U9AKnYBqmZccAAWWfAAFlwwABZuQAAqRUAAAABA8AAWXfAAFm5AAAAAQEBwABZgQAAAIX/YIluAABgiW4BPgFKwABZkQE1AAAAAQBgiW4BHMAAWZ8WwABZmC6o/6mGSwEAAYDAAFmgwBNGOgDAAPy5IxzAAFmqgQDAE0ZVSAEAASsAAIDAAFmtwBNGOoEAwBNGVQFgiW4GqZpxwABZvsAAWcfAAFpjAACHVAAAAAEDwABZ2MAAWmMAAAABAQHAAFnmAAAAhf9gidsAAGCJbgE+AknAAFn2FsAAWfouqQmpjErAAFoPAYDAAFoWwBNGzD9KwABaJAEcwABaKy6GfgIAAoDAAFoxwBNGzBzAAFpDFsAAWjsup8CpcYdUAQABgMAAWlXAE0bMAIrfAKmYBqmbccAAWmjAAFpxwABbCgAAh1UAAAABA8AAWoHAAFsKAAAAAQEBwABajgAAAIX/YInsAABgiW4BPgJJwABanhbAAFqiLqkJqYxKwABatwGAwABavsATR2M/SsAAWswBHMAAWtMuhn4CAAKAwABa2cATR2McwABa6xbAAFrjLqfAqXGHVQEAAYDAAFr8wBNHYwCK4ACpmAapnHHAAFsPwABbGMAAW7EAAIdWAAAAAQPAAFsowABbsQAAAAEBAcAAWzUAAACF/2CJvgAAYIluAT4CScAAW0UWwABbSS6pCamMSsAAW14BgMAAW2XAE0f6P0rAAFtzARzAAFt6LoZ+AgACgMAAW4DAE0f6HMAAW5IWwABbii6nwKlxh1YBAAGAwABbo8ATR/oAiuEAqZgGqZ5xwABcXcAAXGbAAF9MAACpDKkyAAAAAQPAAFx8wABfTAAAAAEBAcAAXIgAAACD7mCEqQAAYIluAT4GTsAAXJnAAFyoAACpFmDAAPoKARbAAFyqLqkAqYc9F8AAXMQuqQAqqYdOwABc7wAAAIF2YIluAEnAAFz7FsAAXQMWwABc/y6WdamEgVWp9j4BScAAXXIcwABdgBbAAF12Lqj3qXyHQQEAAYDAAF2MwBNIkwDAAPy4PgE9isAAXZ3AE0jRJsAAXZ0BNQAAAAEAYMAA/RwBHMAAXa8WwABdpi6o96l8SwEAAYDAAF2wwBNIkwDAAPy5IxzAAF22gwDAE0kySAEAASsAABzAAF25LoHDAgACgMAAXcDAE0iTasAAXcZgkVSWwQCpkoMAwBNJMgFgwAD9HGCJbj4CPRzAAF4EFsAAXfsuqPepfIC/AgACgMAAXgXAE0iTKwDAAPy6Sz4BPYrAAF4rwBNI0TUAAAABAF3AAPylAmCCS2DAAP0cARbAAF40Lqj3qXw1AAAAAQBghKkBgMAAXj7AE0iTNQAAAAEAWwEcwABeS4DAAF5GwBNIk4RNAQABLgCErTUAAAABAFwBHMAAXj2DwABePcATSdWAvwIAAoTAAF49wBNJ9IUAwBNKBwDAAPy6hQDAE0oHAAHAAF5jWwHAAF5qAAABg01bAAA+Aj0cwABegxbAAF55Lqj3qXyEWQEAAYDAAF6KwBNIkwDAAPzCPS/AAF6bPgE9isAAXsnAE0jRJsAAXskBHMAAXteAwABe0sATSJOETQEAAS4AhK1giW49F8AAXu8uqQAigcAAXwbAE0ioASXAAF8fgsAAXxjAE0jRYIo9qYdKwABfOwGCwABfQsATSNEGqZ9xwABfUcAAX1rAAF/iAACpF6kyAAAAAQPAAF94wABf4gAAAAEBAcAAX4QAAACD7mCEqQAAYIluAT4CScAAX5AcwABfmYDAAF+UwBNLJEgBAAErAMAA/SlKwABfogEWwABfqS6o+al/P0rAAF+7ARzAAF/CLqkMqTIBAAGAwABf2cATSyQAqZ4GqaBxwABf58AAX/DAAGCJAACo8gAAAAEDwABgAMAAYIkAAAACAgLAAGAKAAAAg+5gglIAwABgGQAAAKkYYQBgiW4AAGCJbgE+AUw+Aj0cwABgMi6pGQEAAYDAAGA+wBNLrACpokrAAGBLARzAAGBVgcAAYFLAE0u5IAAAAAAAPgE9HMAAYG8uqRoBAAGAwABgesATS6wAqaMGqaFxwABgjsAAYJfAAGFHAACpGwAAAAEDwABgssAAYUcAAAACAgLAAGC8AAAAg+5gglIAwABgywAAAKkYYQBgiW4AAGCJbgE+AUnAAGDYFsAAYOkWwABg3C6o/KmCgVXAAPxWPgFKwABg+gEcwABhAS6o8gIAAoDAAGESwBNMRYHAAGEYwBNMUgCpoD4BSsAAYTEBHMAAYTuBwABhOMATTFIgAAAAAAAGqaJxwABhTMAAYUzAAGGVAACpGQAAAAEDwABhV8AAYZUAAAABAQHAAGFhAAAAqRxgglIAAFsBPgE9HMAAYYEWwABhdC6o/KmCVgEAAYDAAGGFwBNM7QDAAPyFBqmjccAAYZrAAGGawABiIAAAqRoAAAABA8AAYaTAAGIgAAAAAQEBwABhrgAAAKkcYIJSAABbAT4CQBzAAGHaFsAAYdUWwABhyC6o/KmCgejAAPxZSAEAAYDAAGHdwBNNSADAAP0pwABhyMAAYegAPRfAAGH8FsAAYe8uqPypgmEcwABiGRbAAGISFsAAYgUuqPypgmHAAPyjgY0BAAGUAMAA/PbAAPyhBqmkccAAYiXAAGIlwABjBQAAhwUAAAABA8AAYjTAAGMFAAAAAQEBwABiOgAAAIPuYIJLAABgiW4BPgFKwABinwEcwABipi6pEAIAAibAAGK9AYDAAGK9wBNN8GCCUiTAAGMAAyepHRbAAGLygMAAYu3AE03whYDAAP0wJ5nhAKmTBqmlccAAYwrAAGMKwABjPAAAheQAAAABA8AAYxrAAGM8AAAAAQEBwABjJwAAAIPuYIacAABgiW4BSsAAYzABFsAAYzAuqPmpfwappnHAAGNBwABjQcAAY5EAAIXiAAAAAQPAAGNRwABjkQAAAAEBAcAAY14AAACD7mCGkwAAYIluAT4BSsAAY2oBHMAAY3EuqR4BAAEWwABjh4DAAGOCwBNOuoCWhpUAqc0GqadxwABjlsAAY5bAAGTDAACF3QAAAAEDwABjpcAAZMMAAAABAQHAAGOxAAAAg+5ghoEAAGCJbgE+AUrAAGQoASMWwABkLy6pCqmNHMAAZE0unOIBAAEfwABkXqlCAQABFsAAZISAwABkf8ATTxuAloaDAACp2BzAAGSWLpziAQABH8AAZKeJmwEAARbAAGS4gMAAZLPAE08bgJaGgwAAqdgBYIluBqmoccAAZMjAAGTIwABlLAAAheAAAAABA8AAZNrAAGUsAAAAAQEBwABk6QAAAIPuYIaKAABgiW4BPgFKwABk9QEcwABk/C6c4gEAARzAAGUJLqkfAQABFsAAZSGAwABlHMATT8GAloaMAKnOAKnYBqmpccAAZTHAAGUxwABllQAAhdsAAAABA8AAZUPAAGWVAAAAAQEBwABlUgAAAIPuYIZ4AABgiW4BPgFKwABlXgEcwABlZS6c4gEAAR/AAGV2ia4BAAEWwABlioDAAGWFwBNQMICWhnoAAKnYBqmqccAAZZrAAGWawABmNgAAhekAAAABA8AAZarAAGY2AAAAAQEBwABltwAAAIPuYIawAABgiW4BPgJOwABl0sAAZdcAAYKQYIizARzAAGXZLqkgAgACgMAAZerAE1CcFsAAZfWAwABl8MATUJyCkIayAKnUSsAAZgABHMAAZgcunOIBAAEfwABmGIo8AQABgcAAZizAE1CxAACp2Aapq3HAAGY7wABmO8AAaeEAAIYAAAAAAQPAAGZSwABp4QAAAAEBAcAAZmYAAACD7mCHJQAAYIluAT4ETsAAZnvAAGaEAACF/2CJbgEWwABmi4DAAGaGwBNROYX/hydOwABmosAAZqkAAIF2YIluAYHAAGarwBNRTknAAGa5JcAAZsaBwABmvcATUU5gij0+AT2KwABm5sATUXEcwABm7y6o8gIAAhbAAGcJFMAAZwDAE1FOAQFgij2Ca4o/NMAAZxUDwABnFcAAZ10AAAAAAAAAYIluAT4BSsAAZyIBHMAAZykuqQypMgEAARbAAGdJFMAAZ0DAE1FOAQFgij2Ca4o/AKmeAKmgScAAZ2sWwABnby6pCqmNPgFJwABnjCXAAGeZgcAAZ5DAE1FOYImcPgJOwABnvcAAZ8MAAICWYMAA+oIBFsAAZ84UwABnxcATUU4BAWCJnICWiXxJwABoHiIWwABoKIPAAGgiwBNSQ6khwAD9GAAcwABoTRzAAGg6g8AAaDTAE1JDqSIAAAAAwAD6nkgBAAGDwABoUMATUkMAwAD88z4BPYrAAGhjwBNRcR/AAGhwqUABAAGDwABokcATUkMAPz8/SsAAacIBHMAAackunOIBAAGCwABp1sATUXEAqdgGqaxxwABp5sAAaebAAGtmAACF8QAAAAEDwABp9sAAa2YAAAABAQHAAGoDAAAAg+5ghtgAAGCJbgE+BEnAAGoPIRbAAGoZgMAAahTAE1MdhB2G2j4BSsAAaioBHMAAajEugcMCAAKAwABqQ8ATUx0cwABqbWrAAGpJXZFgAWEBYMAA/bZgkUmcF4gFAQABJ5vHAJFkAKmSP07AAGqpwABqsQABhCFgqjsBH8AAar+qQQMAA4DAAGrTwBNTHRbAAGregMAAatnAE1Mdhb2G2y4ARsAAavfAAGskwABrBwAAAJYgYISpABbAAGsXgMAAaxLAE1MdhbmG3D4BPRzAAGs0gcAAayzAE1OPVgEAAYLAAGs4wBNTzwCqNUrAAGtMARzAAGtbgcAAa1PAE1OPooYAAAAAqj8Gqa1xwABra8AAa2vAAGxxAACFwAAAAAEDwABrgcAAbHEAAAABAQHAAGuUAAAAg+5ghhwAAGCJbgE+A07AAGu6wABrwgABhCFgqjsBH8AAa9CqQQMAA4DAAGvkwBNUUhbAAGvvgMAAa+rAE1RShb2GHi4ARsAAbAjAAGwswABsGAAAAINbYISpABbAAGwlgMAAbCDAE1RShb6GHz4BPRzAAGw8gcAAbDTAE1RnqSMBAAGCwABsRsATVKcAqjZKwABsVwEcwABsZoHAAGxewBNUZ6KGAAAAAKo/BqmuccAAbHbAAGx2wABt8QAAhfMAAAABA8AAbIXAAG3xAAAAAQEBwABskQAAAIPuYIblAABgiW4BPgRJwABsnSEWwABsp4DAAGyiwBNVK4Qdhuc+AUrAAGy4ARzAAGy/LoHDAgACgMAAbNHAE1UrHMAAbPtqwABs112RYAFhAWDAAP22YJFJnBeIBQEAASecOQCRZACpkj9OwABtNcAAbT0AAYQhYKpCAR/AAG1LqkoDAAOAwABtXsATVSsWwABtaYDAAG1kwBNVK4W9huguAEbAAG2CwABtr8AAbZIAAACWIGCEqQAWwABtooDAAG2dwBNVK4W5huk+AT0cwABtv4HAAG23wBNVnVYBAAGCwABtw8ATVd0AqjVKwABt1wEcwABt5oHAAG3ewBNVnaKGAAAAAKpIBqmvccAAbfbAAG32wABu9wAAhcQAAAABA8AAbgvAAG73AAAAAQEBwABuHQAAAIPuYIYoAABgiW4BPgNOwABuQsAAbkoAAYQhYKpCAR/AAG5YqkoDAAOAwABua8ATVmAWwABudoDAAG5xwBNWYIW9hiouAEbAAG6PwABussAAbp8AAACpJGCEqQAWwABurIDAAG6nwBNWYIXChis+AT0cwABuwoHAAG66wBNWdakjAQABgsAAbszAE1a1AKo2SsAAbt0BHMAAbuyBwABu5MATVnWihgAAAACqSAapsHHAAG78wABu/MAAcHwAAIX1AAAAAQPAAG8LwABwfAAAAAEBAcAAbxcAAACD7mCG8gAAYIluAT4EScAAbyMhFsAAby2AwABvKMATVzmEHYb0PgFKwABvPgEcwABvRS6BwwIAAoDAAG9XwBNXORzAAG+BasAAb11dkWABYQFgwAD9tmCRSZwXiAUBAAEnm8gAkWQAqZI/TsAAb7vAAG/DAAGEIWCqSwEfwABv0apZBAAEgMAAb+TAE1c5FsAAb++AwABv6sATVzmFxob1FsAAb/2AwABv+MATVzmFx4b2LgBGwABwE8AAcDrAAHAhAAAAliBghwAAFsAAcDGAwABwLMATVzmD0Ib3PgE9HMAAcEqBwABwQsATV6tWAQABgsAAcE7AE1f9AKpUSsAAcGIBHMAAcHGBwABwacATV6uihgAAAACqVwapsXHAAHCBwABwgcAAcYsAAIXKAAAAAQPAAHCWwABxiwAAAAEBAcAAcKgAAACD7mCGNAAAYIluAT4DTsAAcM3AAHDVAAGEIWCqSwEfwABw46pZBAAEgMAAcPbAE1iAFsAAcQGAwABw/MATWICFxoY2FsAAcQ+AwABxCsATWICFx4Y3LgBGwABxJcAAcUfAAHE1AAAAgKtghKkAFsAAcUGAwABxPMATWICFyIY4PgE9HMAAcVeBwABxT8ATWJWpIwEAAYLAAHFhwBNY5wCqVUrAAHFxARzAAHGAgcAAcXjAE1iVooYAAAAAqlcGqbJxwABxkMAAcZDAAHImAACF/QAAAAEDwABxp8AAciYAAAABAQHAAHG7AAAAg+5ghxoAAGCJbgE+AUrAAHHHARzAAHHOLoHDAgACgMAAcd7AE1lrHMAAcghqwABx5F2RYAFhAWDAAP22YJFJnBeIBQEAASebzACRZACpkgaps3HAAHIrwAByK8AAfOgAAIWmAAAAAQPAAHJFwAB86AAAAAEBAcAAclwAAACD7mCFywAAYIluAT4NTsAAcnrAAHKGAAGY1WCDpAEWwAByjYDAAHKIwBNZ6IJFhdJOwABypcAAcqsAAaklYIMUARbAAHK5gcAAcq3AE1n9hPmDYU7AAHLSwABy2wAAqSZgwAD6CgEcwABy44LAAHLdwBNaIEgBAAEWwABy8BbAAHLmLodhqXWcL5yaAMAA/SlJwABzCSEWwABzGoHAAHMOwBNZ/YQdg64+AUrAAHMrARzAAHMyLqkQAgACgMAAc0DAE1noJ6knAKmTP0nAAHN2IiEcwABzlBbAAHOPFsAAc4aBwABzesATWf2CaoOogmmElEgBAAErAMAA/SkAISXAAHPBFsAAc7wWwABzs4HAAHOnwBNZ/YJqg6iCaYSUYIeFPgFKwABz3QEcwABz5C6pEAIAAoDAAHP9wBNZ6CQABiepKIDAAHQcwBNZ6CepKSeDrhbAAHRhFsAAdFwWwAB0U4HAAHRHwBNZ/YJqg6iCaYSUhYDAAP0wJ0oAqZM/ScAAdH0WwAB0h4LAAHSBwBNaIIQagzA+AUrAAHSbARzAAHSiLqkQAgACgMAAdLvAE1noJMAAdPwFJ6kogMAAdNDAE1noJ6kqgsAAdPPAE1ogJ0oAqZM/TsAAdRDAAHUcAAGpK13AAPx0AWCJbgEcwAB1Hi6pLAEAARbAAHU/gMAAdTrAE1noW4XOAKnVTsAAdVXAAHVbAAGFV13AAPylAmDAAP22YIluARzAAHVdLqktAQABFsAAdXmAwAB1dMATWehbhc4AqdZJwAB1iiKDwAB1jsATWkMAFsAAdZouqQmpjD4BSsAAdbcBHMAAdb4uqRECAAKAwAB11cATWegfwAB16YXdAwACgcAAdf/AE1n9HMAAdhouqS4DAAOEwAB2L8ATW8WFwAB2PMATW/sWwAB2UhbAAHZIgMAAdkPAE1noW4XOhWeFdQCp1wGEHSkAqZQ/ScAAdxuDwAB3H8ATWkM+A07AAHdAwAB3SgABqS9giW4BFsAAd1iEwAB3TMATW8WAw8AA/FpJwAB3ZyIlwAB3dYbAAHdrwBNc0WCJpwAcwAB3ii6pMAEAARbAAHemFMAAd5zAE1zRBgFgiaeAlol8AKm1PgFKwAB3uAEcwAB3vy6c4gEAAR/AAHfQib0CAAIWwAB36RTAAHffwBNc0QYBYImngJaJfCsAAKnYP0rAAHgGARzAAHgNLoHDAgACFsAAeC4WwAB4IxbAAHgZgMAAeBTAE1noW4XOhY2FdoMZwAD8WBzAAHhiasAAeD9dkWABYQFgiW5gkUma4YgFAQABhsAAeHDAE1zRAJFkAKmSP07AAHiOwAB4nAABhRddwAD8dAFgiLMBHMAAeJ4uqTECAAKAwAB4tMATWegWwAB4v4DAAHi6wBNZ6FuFzgCp0UXAAHkKAcAAeRPAAHkVAABiYMAA+9ABFsAAeSWGwAB5F8ATXdBhwAD8owEcwAB5L4fAAHktwBNeFGMBAAEWwAB5RhbAAHk3gsAAeTHAE1oghLiDI2HAAPyjAMAA/P0Bj8AAeU7AE14UHMAAeU+HwAB5TsATXhRkAQABlADAAPz1PgE9HMAAeWmGwAB5W8ATXdBWAQABasAAeXNgiMqEeQDAAPyFSsAAebQBJsAAebQBHMAAebsuqTIDAAOCwAB50sATWiCGwAB52cATXdA0wAB56APAAHnowAB84wAAAAAAAABgiW4BPgFKwAB58wEcwAB5+i6pGwIAAoDAAHoWwBNZ6DTAAHocA8AAehzAAHzbAAAAAAAAAGCJbgE+BEnAAHquFsAAerIuqQmpjD4EPRzAAHrTLqkTAAAAAKmWPRzAAHrqLqkzBAAEgcAAexXAE1n9hsAAeyLAE13QhMAAezHAE1vFhcAAez7AE1v7AKm3PRzAAHtQLqkUAAAAAKmXSsAAe2cBHMAAe24uqRECAAKAwAB7esATWegcwAB7kBbAAHuALqj9qYOpNAAAAACp7ACplD89HMAAe78uqTMEAASBwAB76MATWf2GwAB79cATXdCEwAB8BMATW8WFwAB8EcATW/sAqbdJwAB8IRbAAHwlLqkJqYw+AUrAAHxGARzAAHxNLqkRAgACgMAAfFnAE1noHMAAfG8WwAB8Xy6o/amDqTQAAAAAqewAqZQ/SsAAfJ4BHMAAfKUunOIBAAEcwAB8whbAAHyyLqj9qYOpNQAAAACp6wCp2ACpoQCp2WCJbgaptHHAAHztwAB87cAAgDMAAIXQAAAAAQPAAH0CwACAMwAAAAEBAcAAfRQAAACD7mCGQQAAYIluAT4BSsAAfSABJsAAfSABHMAAfScuqTIDAAMWwAB9Q4DAAH0+wBNgloTihkkWwAB9U4DAAH1OwBNgloUXhkQ0wAB9YgPAAH1iwACALgAAAAAAAABgiW4BPgVGwAB9bcAAfZ3AAH2CAAAAhUtgh40AFsAAfZSAwAB9j8ATYJaFzoZGPgE9HMAAfacuqTYBAAGBwAB9s8ATYQkAqbg9HMAAfd4WwAB90oDAAH3NwBNgloXNhkWD+AEAATTAAH3mA8AAfebAAH57AAAAAgICwAB98QAAAIXRYIJ7AMAAfgYAAACAlmCEqQAAYMAA/NkBPgE9HMAAficWwAB+Fy6o/amDqTcCAAIWwAB+S4HAAH5CwBNhc4RugoUcwAB+VC6pDKkyAQABgsAAfmvAE2GAAKmeAKnqAMAA/MQ9HMAAfpkWwAB+iYDAAH6EwBNgloXPhkeD+AEAATTAAH6hA8AAfqHAAH9zAAAAAQEBwAB+rQAAAICWYISpAABgwAD82QE+Ak7AAH7HwAB+0AAAhf9giW4BHMAAftIuqQypMgEAAYHAAH7pwBNiDwCpnknAAH75JcAAfwaCwAB+/cATYiZgij0+AT0cwAB/ShbAAH86FsAAfyouqP2pg4XPqehWAQABHMAAf04uqRIBAAEUwAB/VsATYiYCAWCKPQCplQDAAPyFPwDAAPxCScAAf3wWwAB/gC6pCamMPgFKwAB/nwEcwAB/pi6pEQIAAoDAAH+ywBNglhzAAH/IFsAAf7guqP2pg6k0AAAAAKnsAKmUP0rAAH/zARzAAH/6LpziAQABHMAAgBcWwACABy6o/amDqTUAAAAAqesAqdgAqdlgiW4GqbVxwACAOMAAgD3AAIaaAACpMAAAAAEDwACATsAAhpoAAAABAQHAAIBWAAAAgL1gwAD9tgAAYMAA+goBPglJwACEjxzAAISYgMAAhJPAE2NJSAEAASsAwAD9xUrAAIShASo/ScAAhLMcwACEvIDAAIS3wBNjSUgBAAEnAADAAP3FSsAAhMMBKT9OwACE28AAhOEAAYR/XcAA/HQBYMAA/bYBHMAAhOiAwACE48ATY0mApgEAASeBagDAAP3ZRcAAhSwBwACFNcAAhTcAAGJgwAD70AGTARzAAIU+gsAAhTzAE2PmYwEAARzAAIVNFsAAhUaBwACFQMATY61hwAD8o4GNAQABlADAAPz2AMAA/P0BisAAhVTAE2PmHMAAhVKCwACFVMATY+ZkAQABlADAAPz1PgFJwACFXyEcwACFZC6pOAEAARzAAIWBgcAAhXzAE2OtSwEAAYLAAIWCwBNj5gDAAPyDAKm2SsAAhYcBKj9OwACFp8AAhawAAIHoYMAA/bYBFsAAhbSBwACFrsATY62B6MAA/FlJwACFvhzAAIXQasAAhcJdwAD8dAFgwAD9tsAA1WWDFwEAAYLAAIXZwBNklADAAPxBPgFKwACF6AEpP0nAAIX/HMAAhgiCwACGA8ATZJRPAQABJ4C8AMAA/cc+AT2KwACGH8ATZJQcwACGK4LAAIYmwBNklIC+AgACkxzAAIZEFsAAhj2CwACGOMATZJRhwAD9uoGNAQABlADAAPz2AMAA/cw/ScAAhlQhHMAAhlkuqTgBAAGCwACGccATZJQAqbZKwACGeAEqP0rAAIaLASkGqbZxwACKzMAAitHAAItZAACpOAAAAAEDwACK6MAAi1kAAAABAQHAAIrwAAAAgL1gwAD9tgAAYMAA+goBPgFKwACK/AEiHMAAixoawACLA6mJqTkBAAGAwACLI8ATZbAAwAD9UwAhHMAAi0dqwACLNV3AAPx0AWDAAP22wADU24MXAQABgMAAi1DAE2WwAMAA/EEGqbdxwACLXsAAi17AAJhqAACpMwAAAAEDwACLecAAmGoAAAAEBATAAIuNAAAAmNVgg6QAwACLrwAAAIUXXcAA/HQBYIizAMAAi9MAAACpOl3AAPx0AWCJbgDAAIwEAAAAqTtdwAD8pQJgwAD9tmCJbgAAWwE+AUrAAIwaARzAAIwhLqjyAgACgMAAjDLAE2ZDNMAAjD8DwACMP8AAmGUAAAAAAAAAYIluAT4BSsAAjEoBJsAAjEoBHMAAjFEuqOkBAAE0wACMZAPAAIxkwACYXQAAAAAAAABgwAD82QE+CE7AAIx9wACMgwABqSVggxQBFsAAjJGAwACMhcATZkOE+YNhTsAAjLzAAIzFAAGCamCEfgEWwACM04DAAIzHwBNmQ4Jqg6hFwACNcAHAAI15wACNewAAYmDAAPvQAZMBHMAAjYKGwACNgMATZ0hjAQABFsAAjZkWwACNioTAAI2EwBNm/YS4gyNhwAD8owDAAPz9AY7AAI2hwBNnSBzAAI2ihsAAjaHAE2dIZAEAAZQAwAD89T4BPRzAAI22FsAAjbIulnWphKk8AgACHMAAjeAWwACN0oTAAI3MwBNm/YS4gyNLAQABhsAAjeHAE2dIAMAA/IMcwACN8oHAAI3lwBNmUEsBAAGGwACN88ATZ0gAwAD8gwCp+UXAAI4KAcAAjhPAAI4VAABiYMAA+9ABkwEcwACOHIbAAI4awBNoGWMBAAEWwACOPBbAAI4nhcAAjh7AE2cghLqEhWHAAPyjAMAA/P0BjsAAjkTAE2gZHMAAjkWGwACORMATaBlkAQABlADAAPz1PgNOwACOb8AAjnkAAYDtYIhOARzAAI6mFsAAjpKFwACOicATZyCEuoSFSwEAAYbAAI6nwBNoGQDAAPyDTsAAjsTAAI7KAAGAlmCJbgEjHMAAjs+GwACOzcATaBljAQABFsAAjuWCwACO0cATZmNhwAD8owDAAPz9HMAAjxCCwACO/cATZmNLAQABhsAAjxHAE2gZAMAA/IMcwACPJC6pF6kyAQABFsAAj02HwACPQ8ATaISFAYhWAKmfAWCJbj0cwACPaRbAAI9lLpZ1qYSo7gIAAofAAI96wBNohBTAAI+FwBNovggAAKn6RsAAj5/AAI/lwACPvgAAAYDtYIhOABbAAI/UhcAAj8vAE2cghLuEhj4CTsAAkADAAJAGAAGAlmCJbgE1AAAAAQBgiW4BHMAAkBaDwACQCMATZnZLAQABFsAAkCGGwACQF8ATaXSAvYhSAMAA/LkjHMAAkCeHAMATaadIAQABKwAAHMAAkDguqRepMgEAARbAAJBhhsAAkFfAE2l0hQGIVgCpn4cAwBNppwFgiW49HMAAkH0WwACQeS6WdamEqO4CAAKGwACQjsATaXSHwACQmcATaZYAqfpGwACRDMAAkTTAAJEdAAABhI5gg3cAFsAAkSyEwACRJsATZv2Eg4MnPgFJwACRQCEWwACRS4bAAJFFwBNqS4QZg4c+AT0cwACRcxbAAJFjLqj9qYOpNwIAAobAAJGSwBNqSxzAAJGZLqkXqTIBAAEWwACRvobAAJG4wBNqS4UBg3sAqZ8Aqeo/RsAAkevAAJIkwACSAgAAAak9YIQxABbAAJIWgMAAkgrAE2ZDhRGDqT4BScAAkjAlwACSOYbAAJI0wBNq02CEPz4BPRzAAJJsFsAAklwuqP2pg6k3AgACFsAAkpAUwACSi8ATatMGAWCEP4SOhEQcwACSly6pDKkyAQABFsAAkrMUwACSrsATatMGAWCEP4CWhEIAqZ4AqepJwACSzSXAAJLWhsAAktHAE2rTYIRsPgJOwACTE8AAkxwAAYJsYIhOARbAAJMjFMAAkx7AE2rTBgFghGyCbIRuPRzAAJM9FsAAkzkulnWphKjuAgACh8AAk1/AE2t7HMAAk2kuqQypMgEAARbAAJOJh8AAk4DAE2t7hQGIVgCpngCp+knAAJOpJcAAk7KGwACTrcATatNghE4+AT0cwACT1S6pMwQABBbAAJQHFMAAlALAE2rTBgFghE6CRYRTHMAAlB8uqT4CAAIUwACUT8ATatMGAWCEThbAAJRwFsAAlGGAwACUVcATZkOE+YNhhNSDJACp0hzAAJSMLqksAQABFsAAlK0UwACUqMATatMGAWCETluEUQCp1RzAAJTJLqktAQABFsAAlOUUwACU4MATatMGAWCETluEUQCp1gCpt0nAAJUDJcAAlQyGwACVB8ATatNghF0+AT0cwACVvi6pMwQABBbAAJXwFMAAlevAE2rTBgFghF2CRYRigcAAlgjAE2ZQHMAAlicuqSwBAAEWwACWSBTAAJZDwBNq0wYBYIRdW4RgAKnVHMAAlmQuqS0BAAEWwACWgBTAAJZ7wBNq0wYBYIRdW4RgAKnWAKm3ScAAlp4lwACWp4bAAJaiwBNq02CEdT4BPRzAAJbLLqk2AQABFsAAltwUwACW18ATatMGAWCEdYVLhHcAqbg+AUrAAJcHARzAAJcOLqkQAgACgMAAly3AE2ZDJAAEJ6k/J4OuFsAAl5KGwACXjcATatOFgMAA/TAnSgCpk0bAAJfDwACYCMAAl9wAAACF/2CKPQAWwACX7BbAAJfoLpZ1qYSpQKn3PgE9HMAAmDQWwACYJBbAAJgULqj9qYOFz6noVgEAARzAAJg4LqkSAQABhsAAmEDAE222AKmVAMAA/IUAqdpgiW4AqaAGqbhxwACYb8AAmHTAAJ+OAACpNgAAAAEDwACYf8AAn44AAAABAQHAAJiQAAAAhUtgh40AAFwBPgJOwACYsMAAmLoAAYW0YIluARzAAJi8LqkMqTIBAAEWwACY3YDAAJjTwBNuQYW0h48AqZ5JwACY7hbAAJjyLqkJqYw+A07AAJkawACZIgAAImCEqQErScAAmTAhHMAAmUYWwACZPoDAAJk0wBNuQSKHkEgBAAErAMAA/Sk+Az0cwACZWS6pEwAAAACplj2KwACZbsATbpgcwACZeC6pEgEAARzAAJmALqkMqTIBAAEWwACZoYDAAJmXwBNuQSKHkACpngCplT0cwACZtC6pFAAAAACplz89HMAAmecWwACZ3xbAAJnPLqj9qYOFzqnnVgEAAR/AAJnvh5kEAAEcwACZ/y6pEgEAAYHAAJoHwBNuVACplQMigsAAmibAE26YhhkWwACaWYDAAJpPwBNuQYYZh5GGGhbAAJqXgMAAmo3AE25BhhqHkgDAAPyFScAAmrglwACaxoHAAJq8wBNuVGCJjD4BScAAmt8hFsAAmu4UwACa5MATblQBAWCJjICWiXw+A0nAAJr/HMAAmxUWwACbDYDAAJsDwBNuQSKHkEgBAAErAMAA/Sk+AT0cwACbKi6BwwIAAhbAAJs7gMAAmzHAE25BhbSHj2rAAJtGYJFUmFMAqZI/TsAAm4nAAJuRAAEiYIluARzAAJuTLqkMqTIBAAEWwACbtIDAAJuqwBNuQSKHkACpnknAAJvGFsAAm8ouqQmpjD4BPRzAAJwDFsAAm/sWwACb6y6o/amDhc6p51YBAAEfwACcC4eZBAABHMAAnBsuqRIBAAEUwACcI8ATblQBAWCJjACplQMiHMAAnEYuqRIBAAGCwACcTsATcCkAqZWGGRbAAJyGgMAAnHzAE25BhhmHkYYaFsAAnMiAwACcvsATbkGGGoeSAMAA/IVJwACc7SXAAJz5gsAAnPHAE3ApYImnPgE9HMAAnRgugcMCAAIWwACdOIDAAJ0uwBNuQYW0h48cwACdkGrAAJ1RXZFgAWEBYMAA/bZgkUmYeIgFAQABFsAAnaYUwACdnsATcCkCAWCJp4CWiXwAkWQAqZI+AT0cwACdyi6BwwIAAhbAAJ3qgMAAneDAE25BIoeQHMAAnh5qwACeAV2RYAFhA2CJbmCIs2CIs2CRSZsjiAUDAAOCwACeP8ATcCkWwACeahbAAJ5aLobGqXaFuptdHMAAnpCCwACeiMATcCmGmAEAARbAAJ6YLobGqXYAiXQAkWQAqZI/PgE9HMAAntEugcMCAAIWwACe7YDAAJ7jwBNuQYW0h48cwACfH2rAAJ8CXZFgAWEDYIluYIizYIizYJFJmyOIBQMAA4HAAJ8twBNuVBbAAJ9WFsAAn0YuhsapdoWfm1kcwACfaoHAAJ9gwBNuVIaYAQABFsAAn3IuhsapdgCJdACRZACpkgapuXHAAJ+TwACfk8AAn/QAAIVyAAAAAQPAAJ+pwACf9AAAAAEBAcAAn7wAAACD7mCEsQAAYIluAT4BSsAAn8gBHMAAn88uqRACAAKAwACf3cATcpYWwACf6IDAAJ/jwBNyliKEswCpkwapunHAAJ/5wACf+cAAxBsAAIWgAAAAAQPAAKAOwADEGwAAAAEBAcAAoCAAAACD7mCFkwAAYIluAT4HQBbAAKCFFsAAoH8WwACgdYDAAKBwwBNy/1uFl4VXhXeBVcAA/FbAAKBwwACgjABOwACgo8AAoKwAAYV5YIluARzAAKCuLqkMqTIBAAEWwACgyoDAAKDFwBNy/4V5hZUAqZ5OwACg7sAAoPgAAVtdwAD8dAFgiW4BHMAAoQIuqSwBAAEWwAChI4DAAKEewBNy/1uFlwCp1UnAAKE0FsAAoTguqQmpjD4BSsAAoVUBHMAAoVwuqRECAAKAwAChc8ATcv8fwAChh4WkAwADHMAAoZguqRIBAAGBwAChoMATc0MAqZUWwAChsIDAAKGrwBNy/4C9hZYcwAChxC6pLgMAA4LAAKHZwBNzdjLAAKHkYMAA/bZgiW4AFsAAofcWwACh7YDAAKHowBNy/1uFl4VnhXUAqdcAAKmUP0nAAKKfIhzAAKK0FsAAoq2CwACio8ATc3ZhwAD8o0gBAAGUAMAA/PMAHMAAossWwACixhbAAKLBgMAAorzAE3L/gL2FloC9iIFIAQABJ0gAwAD9xT4ETsAAouLAAKLoAAGFsWCJbgEcwACi84LAAKLqwBNzdksBAAGTAMAA/INJwACjsSIcwACjtS6GpwEAAYHAAKO7wBNzQwCpygEcwACjyC6GpwEAAYPAAKPOwBN0owCpyj4BSsAAo+ABFsAAo+cuqPupgT9JwACkQxzAAKRHLqlBAQABgcAApE7AE3NDAKnJPgFKwACkYwEcwACkai6pHgEAARzAAKR7LqlBAQABg8AApILAE3SjAKnJAKnNP0nAAKSaIiIiIiIlwACkp4HAAKSewBNzQ2CJhAElwACkzYHAAKTEwBNzQ2CJjAElwACk84HAAKTqwBNzQ2CJlAElwAClGIHAAKUPwBNzQ2CJnAElwAClQIHAAKU3wBNzQ2CJpwElwAClZYPAAKVfwBN0o2CJhD4BSsAApYABHMAApYcuqR4BAAEcwACloYHAAKWYwBNzQ0gBAAGDwAClpMATdKMAiXMAqc0+AUrAAKXDARzAAKXKLoHDAgACgMAApd7AE3L/HMAAphpqwACl8F2RYAFhAmCJbmCIs2CRSZlWiAUCAAKBwACmOcATc0McwACmTIHAAKZDwBNzQ4aYAQABFsAAplQuhsapdgCJdACRZACpkj9JwACmySXAAKbWgcAAps3AE3NDYImnPgFJwACm8RzAAKcGFsAApv+CwACm9cATc3ZhwAD8o0gBAAGUAMAA/PM+AUfAAKcWFsAApygWwACnI4DAAKcewBNy/4C9hZaAvYiBAQHAAKc/asAApz9gwAD9tsAAkmIAPgNOwACnX8AAp2UAAYPWYIluARzAAKdwgsAAp2fAE3N2SwEAAZMAwAD8g0nAAKeBJcAAp4uDwACnhcATdutgiac+AUrAAKeuARzAAKe1LpziAQABH8AAp9mJrgEAARzAAKf3FsAAp/EUwACn6MATc0MBAWCJp4CWiXxkAQABFsAAp/8UwACn+cATdusDAWCJp4CWiXwAwAD9ywAAqdg/SsAAqCIBHMAAqCkugcMCAAKAwACoQcATcv8cwACogWrAAKhXXZFgAWEEYMAA/bZgiW5giLNgiLNgkUmY/4gFBAAEJ2QUwACovcATc0MBAWCJpxbAAKjrFsAAqNsuhsapdoW6m10cwACpEYPAAKkLwBN264aYAQABFsAAqRkuhsapdgCJdACRZACpkj9JwACpSiIlwACpV4HAAKlOwBNzQ2CJlAElwACpcoHAAKlpwBNzQ2CpOD4BScAAqZQcwACpqRbAAKmigsAAqZjAE3N2YcAA/KNIAQABkwDAAPzzPgFHwACpuRbAAKnLFsAAqcaAwACpwcATcv+AvYWWgL2IgQIBwACp4mrAAKniYMAA/bbAANViAD4DScAAqfgWwACp/C6pCqmNPgNOwACqKMAAqi4AAICWYMAA+dwBFsAAqlQmwACqOgCBwACqMcATc0NgqTio26k6ScAAqm8cwACqeYPAAKpzwBN4sEgBAAEawACqg8AA+d4AwAD9KT4BSsAAqpsBHMAAqqIunOIBAAEfwACqs4mmAQABHMAAqsIoAAAAAAAAAACBxAAAAADAAPqVAACp2D9KwACq6AEcwACq7y6c4gEAAR/AAKsAqUEBAAEcwACrIYPAAKsiwBN4sIHEAAAAAMAA+esAAKnYP07AAKtJwACrTwAAgJZgwAD70AEWwACraybAAKtbAIHAAKtSwBNzQ2CJlICWiXxKwACrfgEcwACrhS6c4gEAAR/AAKuWiZsBAAEcwACrooPAAKujwBN5dYHEAAAAAMAA+/MAAKnYAcAAq7tqwACru2DAAP22wACyXgA+A0nAAKvMFsAAq9AuqQqpjT4CTsAAq/zAAKwCAACAlmDAAPncARbAAKwoJsAArA4AgcAArAXAE3NDYKk4qNupOkrAAKxDARzAAKxKLpziAQABH8AArFupQQEAARzAAKyYHMAArJCDwACskcATegGEhgAAAADAAPn4qOABAAE3IADAAPoCAACp2D9OwACsyMAArM4AAICWYMAA+9ABFsAArOomwACs2gCBwACs0cATc0NgiZSAlol8SsAArP0BHMAArQQunOIBAAEfwACtFYmbAQABHMAArSGDwACtIsATeniEhgAAAADAAPvrAACp2EnAAK1CHMAArVcWwACtUILAAK1GwBNzdmHAAPyjSAEAAZQAwAD88z4ETsAArXbAAK18AAGD1mCJbgEcwACth4LAAK1+wBNzdksBAAGTAMAA/INOwACtmsAArZ0AAalCYMAA/bYBFsAArakWwACtpIDAAK2fwBNy/4C9hZaAvYiBScAArbciJcAArcGDwACtu8ATewZgiZQBJcAArdmDwACt08ATewZgqTg+A0nAAK3/IiIcwACuB4TAAK4EwBN7L0gBAAEng7oAwAD9xQEcwACuFYTAAK4SwBN7L0gBAAEng7wAwAD9xQEcwACuI4TAAK4gwBN7L0gBAAEnla8AwAD9xT4DTsAArkDAAK5OAACiumDAAP0cASMlwACuWYHAAK5QwBNzQ2CJlBbAAK6DFMAArnrAE3NDAQFgiZSAlol8FsAArr8mwACupQCBwACunMATc0NgqTio26k6AWDAAP0cTsAArtzAAK7nAACpQ2DAAPvQASMlwACu74PAAK7pwBN7BmCJlBbAAK8WFMAArxDAE3sGAwFgiZSAlol8HMAAr1sWwACvTybAAK81AIPAAK8vwBN7BmCpOKjbqTqpRAAAAADAAPoEAWDAAPvQScAA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vwIAAjUAAAABAGDAAPvQAYXAARGZwBPCjTUAAAABAGDAAPvQAY3AARGZwBPCjRzAARGaFADAE8MBCABkAQABlADAAPz1FADAE8MBCAAfwAERpIWKAgAChsABEbTAE8LHHMABEbouqRIBAAGHwAERwsATwtYAqZUAAMAA/IQAwAD8xErAARHXAR/AARHihX8DAAGDwAER7MATwWIChVeEwAER/8ATwZyFZ4LAARINwBPBRwap2HHAARIcwAESJcABEpEAAJziAAAAAQPAARIxwAESkQAAAAEBAcABEjsAAACF/2CJbgAAYIluAT4BSsABEksBHMABEmgWwAESUi6o9ql7mRUCAAKAwAESdMATw9U0wAESfgPAARJ+wAESjAAAAAAAAABgiW4BSsABEoQBgMABEoTAE8PVAMAA/MAGqdlxwAESlsABEpbAAROmAACpMgAAAAEDwAESrMABE6YAAAADAwPAARKzAAAAqSVggxQAwAESyQAAAIUXXcAA/HQBYIizAMABEtgAAACWJGEAWwAAWwE+Ak7AARL0wAES+AAAg1pgqeEBFsABEvouqP2pg0w+Aj0XwAETGy6o/R/AARMxqe4DAAMugMABE0fAE8RggcABE07AE8RtAKmDSsABE2QBHMABE22CwAETa8ATxIAgAAAAAAA+AT0XwAEThy6o/YPAAROZwBPEk6mDBqnaccABE6vAAROrwAEUZgAAqOkAAAABA8ABE73AARRmAAAAAQEBwAETvgAAAJYkYQBbAABbAT4CTsABE+bAARPtAAGpY2Cp7wEWwAET7y6WdamETD4CPRfAARQELpZ1H8ABFA6p/wAAAACphErAARQtARzAARQ2gMABFDTAE8UwIAAAAAAAPgE9F8ABFFAulnWBwAEUVsATxUOphAap23HAARRrwAEUdMABFh4AAKlFAAAAAQPAARSOwAEWHgAAAAQEBMABFJYAAACpQmDAAP22AMABFJ4AAACB1WDAAPvQAMABFKUAAACCSmDAAPvQAMABFLEAAACD7mCCUgAAYIluAT4ETsABFMEAAACBdmDAAPvQAEFHwAEUzYDAARTVwBPFzQMBwAEU5mrAARTmYMAA/bbAAJJTAD4CPYzAARTzwBPGDxzAART+gcABFPzAE8XcgQYBAAGCwAEVAMATxesAwAD76ULAARULAAHAARUdasABFR1gwAD9tsAAklkAPgI9jMABFSrAE8YPHMABFTWBwAEVM8ATxdyDdwEAAYLAARU3wBPF6wDAAPvoQsABFUIAAcABFVRqwAEVVGDAAP22wACSVgA+Aj2MwAEVYcATxg8cwAEVbIHAARVqwBPF3IO7AQABgsABFW7AE8XrAMAA++pCwAEVeQBJwAEVixbAARWPLqkKqY0+AUrAARWsARzAARWzLpziAQABH8ABFcSpPwEAAYTAARXawBPGDwAAqdg/SsABFe4BHMABFfUunOIBAAEfwAEWBombAQABhMABFhLAE8YPAACp2Aap3HHAARYjwAEWLMABGU4AAKlIAAAAAQPAARZIwAEZTgAAAAUEBMABFlAAAACpQmDAAP22AMABFlgAAACB1WDAAPvQAMABFl8AAACCSmDAAPvQAMABFmsAAACD7mCCUgABwAEWeAAAAKlJWwFqwAEWimDAAPoKAGCJbgE+BE7AARacAAAAgXZgwAD70ABBR8ABFqiAwAEWsMATx4wDAcABFsFqwAEWwWDAAP22wACSXwA+Aj2NwAEWz8ATx+QcwAEW2oHAARbYwBPHm4O6AQABgsABFt3AE8eqAMAA++xCwAEW6AABwAEW+mrAARb6YMAA/bbAAJJcAD4CScABFwgWwAEXDC6pCqmNPgJJwAEXLSbAARcxAYTAARcxwBPHx2DAAPoKPgE9icABF3nAE8ebHMABF3uBwAEXecATx5uBjQEAARzAAReMHMABF4GBwAEXf8ATx5uDdwEAAWrAAReDYMAA+9DAANXRAMAA++iDugEAAZQAwAD77ADAAPz2Pz2NwAEXqMATx+QcwAEXs4HAARexwBPHm4O8AQABgsABF7bAE8eqAMAA++0+AT2NwAEX1MATx+QcwAEX34HAARfdwBPHm4O8AQABgsABF+LAE8eqAMAA++1CwAEX9wABwAEYCWrAARgJYMAA/bbAAKysAD4CPY3AARhZwBPH5CMcwAEYZILAARhiwBPHqoFtAQABN0AAwAD9AJMcwAEYeRzAARhzgcABGHHAE8ebg7wBAAGCwAEYdsATx6oAwAD77YN3AQABHMABGIwcwAEYf5SDugEAARzAARiGN0CBjQEAAYLAARiIwBPHqgDAAPz2AMAA++yBjQEAAZQAwAD89gDAAPvoAWDAAPvQQsABGJoAScABGKwWwAEYsC6pCqmNPgFKwAEYzQEcwAEY1C6c4gEAAR/AARjlqT8BAAEcwAEZAoXAARj7wBPH5KjgAQABNyAAwAD78QAAqdg/SsABGR4BHMABGSUunOIBAAEfwAEZNombAQABhcABGULAE8fkAACp2Aap3XHAARlTwAEZXMABHZEAAKlKAAAAAQPAARl6wAEdkQAAAAQEBMABGYkAAACpQmDAAP22AMABGZEAAACB1WDAAPzmAMABGZgAAACCSmDAAPzmAMABGaQAAACD7mCCUgAAYIluAT4GTsABGbQAAACBdmDAAPzmAEFHwAEZwIDAARnIwBPKjwYBwAEZ2WrAARnZYMAA/bbAAJJiAD4CPYzAARnmwBPK0RzAARnxgcABGe/AE8qeZAEAAYLAARnzwBPKrQDAAPz1QsABGf4AAcABGhBqwAEaEGDAAP22wACSZAA+Aj2MwAEaHcATytEcwAEaKIHAARomwBPKnoGNAQABgsABGirAE8qtAMAA/PZCwAEaNQABwAEaR2rAARpHYMAA/bbAAJJnAD4CPYzAARpUwBPK0RzAARpfgcABGl3AE8qeg4gBAAGCwAEaYcATyq0AwAD890LAARpsAAHAARp+asABGn5gwAD9tsAAkm0APgI9jMABGovAE8rRHMABGpaBwAEalMATyp5QAQABgsABGpjAE8qtAMAA/PlCwAEaowABwAEatWrAARq1YMAA/bbAAJJvAD4CPYzAARrDwBPK0RzAARrOgcABGszAE8qehoEBAAGCwAEa0cATyq0AwAD8+kLAARrcAAHAARruasABGu5gwAD9tsAAkmoAPgI9jMABGvvAE8rRHMABGwaBwAEbBMATyp6VrgEAAYLAARsIwBPKrQDAAPz4QsABGxMAScABGyUlwAEbMITAARspwBPK0WDAAPvQPgJJwAEbQBbAARtELqkKqY0+AUrAARtjARzAARtqLpziAQABH8ABG3upPwEAARTAARuRwBPK0QQBYMAA+9AAAKnYP0rAARupARzAARuwLpziAQABH8ABG8GJmwEAARzAARvUFMABG83AE8rRBAFgwAD70KllAQABN0AAwAD78gAAqdg/ScABG+4lwAEb+YTAARvywBPK0WDAAPqCPgFKwAEcDAEcwAEcEy6c4gEAARzAARwgLqkfAQABFMABHDPAE8rRBAFgwAD6ggCpzgCp2D9HwAEcSIDAARxQwBPKjwQBwAEcYWrAARxhYMAA/bbAAJJOAD4BSsABHG4BHMABHHUuqR4BAAEcwAEciIHAARyGwBPKnmMBAAGCwAEcisATyq0AwAD8/QCpzQHAARyZasABHJlgwAD9tsAAklAAPgFKwAEcpwEcwAEcri6pHgEAARzAARzBgcABHL/AE8qegWsBAAGCwAEcxMATyq0AwAD8/gCpzQHAARzTasABHNNgwAD9tsAAkksAPgFKwAEc4QEcwAEc6C6pHgEAARzAARz7gcABHPnAE8qegW0BAAGCwAEc/sATyq0AwAD9AACpzQHAAR0NasABHQ1gwAD9tsAAkkgAPgFKwAEdGgEcwAEdIS6pHgEAARzAAR00gcABHTLAE8qegJcBAAGCwAEdNsATyq0AwAD8/wCpzUrAAR1FARzAAR1MLqkQAgACg8ABHVrAE8q8JMABHYwDJ6lmgMABHYfAE8qPJ4FLAKmTBqneccABHZbAAR2ewAEedgAAqVcAAAABA8ABHafAAR52AAAAAQEBwAEdsQAAAIPuYIJSAABggosBPgFDwAEeHSk+AknAAR4yJcABHjuAwAEeNsATzxRggotKwAEeRwEUwAEeTsATzxQAAWCCiz89iMABHlrAE88UFsABHmaAwAEeYcATzxSEUoJYAAATOtAAEzsqABM7gAATPFgAEz2BABNBqQATQjsAE0KpABNDMAATRBoAE0SRABNFCQATRhMAE0alABNHPAATR9MAE0hqABNK+wATS4UAE0weABNMxgATTSEAE03JABNOSgATTpMAE070ABNPmgATUAkAE1B1ABNREgATUvYAE1QrABNVBAATVjkAE1cSABNYWQATWUQAE1nBABNgbwATYyIAE2WJABNmHAATbhoAE3JvABNy2AATifAAE4+FABOSLQATlcgAE5aAABOYGQATm0gAE6AGABOqSwATq4IAE61bABOu6wATr7sAE7JEABOy5AATs9wAE7RSABO1AAATt5oAE7f9ABO5LAATuyUAE7wnABO8owATvSAAE73wABO+3gATv54AE8D1ABPDrgATxDkAE8UJABPFpgATx2UAE8poABPO7QATz3cAAABRAqnhccABH5bAAR+cwAEk8gOpZwAAAWDAAP0cAAAGBKnjccABH8LAAR/LGKloAGCpbwAEqeRxwAEgAcABIAYJqSUAYIMUAASp5XHAASBdwAEgagmFFwBdwAD8dAFgiLMABKnmccABILbAASDSCYSDAF3AAPylAmCDd2CJbgEywAEg0GCDd2CJbgAEqedxwAEg88ABIRAJhc4AXcAA/HQBYIeNATHAASEOYIeNAASp6HHAASEswAEhTAmFzwBdwAD8dAFghKkBMcABIUpghKkAAQWp7nHAASFRwAEhUcABIZAAAAADwAEhYMABIZAAAAADAwPAASFmAAAEqWhgqW8AwAEhdgAABKklYIMUAMABIYIAAASFF13AAPx0AWCIswAAYKnhAT8ECAGp44AAwBPRtggBqeSBAMAT0cMIAanlggDAE9HQCQHAASFRwAD9MgAAAAADBqnqccABIZXAASGawAEh6gAAqTcAAAABA8ABIafAASHqAAAAAgICwAEhrgAAAISOYIN3AMABIb4AAACF/2CJbgAAXAE+AT0cwAEh1BbAASHOLoSDqeaAvwIAAoDAASHVwBPSPoHAASHewBPSSwDAAPy6BqnrccABIe/AASIAwAEjggAAqTUAAAABA8ABIg3AASOCAAAAAAAAAGCJ/QE+BUAWwAEiJRbAASIdLoXOqeeBVcAA/FbAASIdwAEiLABOwAEiUsABIl4AAYXNXcAA/KUCYIJ7YIluATLAASJ1YIJ7YIluAD0cwAEihBbAASJ9LoSDqeaD+AEAATTAASKMA8ABIozAASMKAAAAAgICwAEikwAAAISOYIN3AMABIqMAAACAlmCJbgAAYMAA/NkBPgJAISXAASK/gsABIrnAE9MyYIo9wAEiucABItYAPRzAASLqgMABIt/AE9LXgL8CAAIWwAEi8YHAASLrwBPTJYRegmqCwAEi/sAT0zIAwAD8ugDAAPzEQBbAASMoFsABIxguhc+p6IFVwAD8VsABIxjAASMvAErAASM2AR/AASNBig8DAAMWwAEjWBbAASNSLqklqeSEXoJqFsABI2MuhRep5YDAASNywBPS1wAGqexxwAEjh8ABI5jAASTwAACpNAAAAAEDwAEjsMABJPAAAAAAAAAAYIZBAT4DTsABI9rAASPmAAGFzV3AAPylAmCCe2CEqQEywAEj/2CCe2CEqQA9HMABJA4WwAEkBy6Eg6nmg/gBAAE0wAEkFgPAASQWwAEkegAAAAICAsABJB0AAACEjmCDdwDAASQtAAAAgJZgiW4AAGDAAPzZAT4BPRzAASRHgMABJDzAE9QigL8CAAIWwAEkToHAASRIwBPUcIRegmocwAEkZRbAASRbLqloqeOpEgEAAYLAASRtwBPUfQCplQDAAPy6AMAA/MRKwAEkgQEfwAEkjIZRBQAFFsABJKwWwAEkpi6pJankhF6CahbAASS3LoUXqeWAwAEkxsAT1CIWwAEk0y6FzqnnFsABJNwuhc+p6AAAABPSFwAT0okAE9PzABPVLgAAAAMCqe9xwAElPMABJULAASzMA6lpAAABYMAA/RwAAAMEqfJxwAElscABJeMJqWqpMgBdwAD8pQJgiUpgiLMBMsABJeFgiUpgiLMABKnzccABJkjAASZ8CalrqTIAXcAA/KUCYIhOYIluATLAASZ6YIhOYIluAASp9HHAASdJwAEniwmpbKkyAF3AAP1nAWCITgEewAEnccAAwOIAAWCITgAAAQWp/wAAAAAEAAADAAAAAAAAAAAAYKnvAT8BCQEAwAD9MgAAAAAHBqn2ccABJ8DAASfJwAEoAAEAgVUAAAABA8ABJ9HAASgAAAAAAAAAAGDAAPoKAUrAASfUASIWwAEn4xbAASfULqlqqTKp8oFVwAD8ygAWwAEn+RbAASfuLqlrqTKp84FVwAD8ygap+XHAASgFwAEoCsABKKgAAKk8AAAAAQPAASgfwAEoqAAAAAICAsABKC4AAACA7WCJSgDAAShCAAAAgJZgiLMAAFwBPgJAIRzAAShmFsABKFcuqWqpMqnyh0EBAAGAwAEocsAT1pUAwAD8uMABKFbAASh8AD0cwAEokRbAASiDLqlqqTKp8oC/AgACgMABKJLAE9aVgcABKJ/AE9aiAMAA/LoGqfpxwAEorcABKLLAASl2AACo7gAAAAEDwAEowsABKXYAAAACAgLAASjXAAAAgmxgiE4AwAEo6gAAAICWYIluAABcAT4CPRzAASkBFsABKPcuqWupMqnzgL8CAAKAwAEpAsAT1ziBwAEpDsAT10UAwAD8uknAASkZJcABKSOBwAEpHcAT10Vgij0+AT0cwAEpXxbAASlDLqlsqTKp9FYBAAGAwAEpY8AT1zgAwAD9dD8GqftxwAEpe8ABKYTAASoZAACpbQAAAAEDwAEpmMABKhkAAAABAQHAASmnAAAAgO1giUoAAGCIswE+A07AASnHwAEpzQABgJZgiLMBHMABKd0WwAEpzy6paqkyqfJLAQABgMABKd7AE9fpAMAA/LlAIRzAASn7gcABKfXAE9f+SAEAASsAiLfAASn1wAEqAgBKwAEqCQGBwAEqEMAT1/4GqfxxwAEqHsABKifAASr3AACpTgAAAAEDwAEqNcABKvcAAAABAQHAASpKAAAAgmxgiE4AAGCJbgE+A07AASpjwAEqaQAAgJZgiW4BHMABKnUWwAEqay6pa6kyqfNLAQABgMABKnbAE9iIAMAA/LlJwAEqhSXAASqPgcABKonAE9idYIo9PgE9HMABKssWwAEqry6pbKkyqfSEWQEAAYDAASrSwBPYiADAAP12P0rAASrnAYHAASruwBPYnQap93HAASs/wAErYcABLEABAKlAAAAAAQPAASt8wAEsQAAAAAAAAABdwAD8MgFgij0BPgJJwAErghbAASuiFsABK4YuqWypMqn0gVXAAPxWSsABK6sBasABK7JdwAD8dAFgij3AANXVP0rAASvAARzAASvjFsABK8cuqWypMqn0gKsBAWCKPQE0wAEsBQPAASwFwAEsOwAAAAEBAcABLBoAAACCbGCITgAAYIo9AUrAASwnASbAASwnARzAASwxFsABLCcuqWupMqnzSwEAAYDAASwywBPZuQDAAPy5YIo9AMAA/D0Gqf1xwAEsRcABLE7AASzKAACFfQAAAAEDwAEsXMABLMoAAAABAQHAASxmAAAAgpBgiLMAAGCIswE+AknAASxyFsABLIUWwAEsdi6paqkyqfKBVcAA/MpKwAEsjgGAwAEslcAT2ik/SsABLJ8BHsABLKaaqAIAAoDAASyxwBPaKRbAASy3LqlqqTKp8gAAABPWCgAT1m4AE9cRABPXwgAT2GEAE9kdABPaAgAT2o8AAAAHAqoAccABLQjAAS0OwAEttQOpbgAAAWDAAP0cAAADBKoCccABLTLAAS02CYPuAGCCUgAEqgNxwAEtSMABLU8JIgBgkUkABKoEccABLW7AAS11CYJTAF3AAPx0AWCRZwABBaoGccABLXrAAS16wAEtswAAAAPAAS2KwAEtswAAAAMCAsABLZAAAASD7mCCUgDAAS2bAAAEImCRSQABwAEtqgAABIJTXcAA/HQBYJFnAWoAYMAA/Nl3YKoAAT8ECAGqAoAAwBPbNggBqgOBAMAT20MIAaoEggDAE9tQCQHAAS16wAD9MgAAAAAAAAAT254AAAAAAqoHccABLbjAAS2+wAEuRgOpbwAAAWDAAP0cAAACBKoJccABLe7AAS3yCYPuAGCCUgAEqgpxwAEuA8ABLgoJIgBgwAD9tgABBaoMccABLg/AAS4PwAEuRAAAAAPAAS4rwAEuRAAAAAICAsABLjEAAASD7mCCUgDAAS48AAAEImDAAP22AABgqgcBPwMIAaoJgADAE9wRCAGqCoEAwBPcHgkBwAEuD8AA/TIAAAAAAAAAE9xWAAAAAAKqDXHAAS5JwAEuWMABLwAHqXAAAAFgwAD9HAAAAAEFqhJxwAEuasABLnDAAS5/AQAAA8ABLn3AAS5/AAAAAAAAAGCqDQE/AQkBwAEucMAA/TIAAAAAAgaqD3HAAS6EwAEuicABLsUAAoHDAAAAAQPAAS6PwAEuxQAAAAICAsABLp8AAAAiYJFnAMABLr0AAACCU13AAPx0AWCRZwAAXAAGqhBxwAEuysABLs/AAS7+AAKpDwAAAAEDwAEu5sABLv4AAAABAQHAAS75AAAAg+5ghLEAAFwAAAAT3LYAE9z/ABPdNgAAAAICqhNxwAEvA8ABLwnAATGMA6lxAAABYMAA/RwAAWCqDQABBaobccABLzrAAS9AwAEvVQEAAAPAAS9TwAEvVQAAAAAAAABgqhMBPwEJAcABL0DAAP0yAAAAAAQGqhVxwAEvWsABL2vAATAcAACBwwFqwAEvW2DAAP0cAgAAAQPAAS9xwAEwHAAAAAICAsABL4EAAAAiYJFnAMABL58AAACCU13AAPx0AWCRZwAAXAE+Aj0cwAEvri6pcqkyAQABgMABL7bAE93TAKoYRsABL8TAAS/zwAEv2AAAAJ8bYJFnAIHAAS/qwBPd3z4BPRzAAS/7LqlyqTIBAAGCwAEwA8AT3hoAqhgGqhZxwAEwIcABMDLAATB1AACpDwFqwAEwImDAAP0cAgAAAQPAATBJwAEwdQAAAAEBAcABMFwAAACD7mCEsQAAXAE+AAaqGHHAATB6wAEwf8ABMOgAAKlyqTIAAAABA8ABMIbAATDoAAAAAQEBwAEwlgAAACJgkWcAAFwBPgE9HMABMKUunM4DAAMWwAEwu4DAATCzwBPeuYCskWkWwAEwyIDAATDAwBPeuYdOkWoWwAEw3IDAATDUwBPeuSKRbwCqGQaqGXHAATDtwAEw8sABMYoAAJzOAAAAAQPAATD/wAExigAAAAMDA8ABMQQAAACArGDAAP43AMABMQ0AAACDXGDAAPvQAMABMRwAAAAiYMAA/bYAAFwBPgI9G8ABMS7AAOo4Nyo9HMABMUsawAExRMAA6j6CAgEAASTAATGFBYDAATFVwBPfNSeC5oHAATFawBPfRCepc4LAATF9wBPfUwDAAPUEAAAT3aEAE95MABPekAAT3w4AE9+yAAAABAKqHHHAATGPwAExlcABNmUDqXQAAAFdmT8BYMAA+goAAAEEqh9xwAEx08ABMgEJqXWpMgBdwAD9ZwFgiUoBHsABMe3AAMDiAAFgiUoAAAEFqiwAAAAABAAAAwAAAAAAAAAAAGCqHAE/AQkBAJlLAAAAAAoGqiFxwAEyBsABMgvAATJLAACo9QAAAAEDwAEyGcABMksAAAABAQHAATIjAAAAgpBgiLMAAGDAAPoKAT4BSsABMi8BJsABMi8BHMABMjuAwAEyNsAT4GWETQEAAS4AiLVgwAD6CgaqInHAATJQwAEyVcABMrEAAJfXAAAAAQPAATJkwAEysQAAAAEBAcABMm4AAACD7mCIswAAYMAA+goBPgE9MMABMnonqXYGqiNxwAEytsABMrvAATLlAACGawAAAAEDwAEyy8ABMuUAAAABAQHAATLYAAAAg+5giL4AAGDAAPoKAUrAATLhASkGqiRxwAEy6cABMu7AATMYAACGbgAAAAEDwAEy/sABMxgAAAABAQHAATMLAAAAg+5giMoAAGDAAPoKAUrAATMUASkGqiVxwAEzHMABMyHAATNFAACGcAAAAAEDwAEzLsABM0UAAAABAQHAATM4AAAAg+5giNYAAGDAAPoKAUrAATNBASkGqiZxwAEzScABM07AATN2AACGcgAAAAEDwAEzXcABM3YAAAABAQHAATNpAAAAg+5giOIAAGDAAPoKAUrAATNyASkGqidxwAEze8ABM4DAATPsAACGjQAAAAEDwAEzlsABM+wAAAABAQHAATOpAAAAg+5giTkAAGDAAPoKAT4BSsABM7UBHMABM9AWwAEzvC6pdakyqh+DFwEAARbAATPegMABM9nAE+IYgO2JPQDAAP1zBqooccABM/HAATP2wAE0hQAAhnYAAAABA8ABNAjAATSFAAAAAQEBwAE0FwAAAIPuYIjuAABgwAD6CgE+AUrA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RgAAFF67ABRfqwAUYTEAAAACAqtceMAARQTAAEUKwABGTwOqXAAAAWCH+AABYKxjAAEFq2J4wABFZsAARWbAAEWfAAAAA8AARXzAAEWfAAAAAQEBwABFiAAAAIJFYIfqAABgq1wBPwEJAMAARZKIAQEAAYDAAEWYwBRhhAACBqteeMAARaTAAEW7wABF0wEAqikAAAABA8AARcrAAEXTAAAAAAAAAGCshQFKwABFzQEmwABFzQEWwABFzS6CRYf6YKyFBqtgeMAARdjAAEXpwABGTQAAqh4BasAARdlgwAD9HAIAAAEDwABF+MAARk0AAAABAQHAAEYKAAAAhy5grWMAAFwBPgFKwABGGQEcwABGKIDAAEYgwBRiJapdAQABLgCtewAAFGGuABRh8wAUYlQAAAACAqtjeMAARpLAAEaYwABIGgOqXgAAAWCHMQABYKt6AQSrZXjAAEblwABG8RihLwBgiLMBKwEFq2t4wABG9sAARvbAAEdYAAAAA8AARwvAAEdYAAAAAgICwABHIAAAAIJsYIhOAMAARzUAAACCaWCEqQAAYKtjAT8BCQDAAEdDhzwCAAKAwABHScAUYryBwABHU8AUYskAAgarZ3jAAEddwABHbMAAR3wBAKodAAAAAQPAAEd1wABHfAAAAAAAAABghKkBSsAAR3gBFsAAR3gugmmHNAaraXjAAEeBwABHksAASBgAAKoeAWrAAEeCYMAA/RwCAAABA8AAR6HAAEgYAAAAAgICwABHswAAAIcuYK1jAMAAR8UAAACqLWCIswAAXAE+AUrAAEfYARzAAEfngMAAR9/AFGNqql8CAAIugcAASAjAFGN3AK18AAAUYvwAFGM4ABRjrwAAAAICq2x4wABIX8AASGXAAEmQA6pgAAABYIe5AAFgrGMAAQWrcnjAAEilwABIpcAASO4AAAADwABIr8AASO4AAAACAgLAAEi6AAAAgmlgh18AwABIywAAAIW0YISpAABgq2wBPwEJAMAASNiHwwIAAoDAAEjewBRkAoHAAEjkwBRkDwACBqtueMAASPPAAEkCwABJIAEAqiEAAAABA8AASRTAAEkgAAAAAAAAAGCEqQFKwABJFwEWwABJFy6FtIe8BqtweMAASSXAAEk2wABJjgAAqh4BasAASSZgwAD9HAIAAAEDwABJRcAASY4AAAABAQHAAElXAAAAhy5grWMAAFwBPgFKwABJZgEcwABJdYDAAEltwBRksKphAQABLgCtfQAAFGRCABRkfgAUZN8AAAACAqtzeMAASdzAAEniwABLBQOqYgAAAWCGigABYKt6AQSrdXjAAEoywABKPhihLwBgiLMBKwEFq3l4wABKQ8AASkPAAEpuAAAAA8AASlHAAEpuAAAAAQEBwABKWQAAAICWYMAA+oIAAGCrcwE/AQkAwABKYoaSAQABgMAASmjAFGVHAAEGq3d4wABKc8AASoTAAEsDAACqHgFqwABKdGDAAP0cAgAAAQPAAEqTwABLAwAAAAICAsAASqUAAACHLmCtYwDAAEq3AAAAqi1giLMAAFwBPgFKwABKygEcwABK2YDAAErRwBRlpapjAgACLoHAAErzwBRlsgCtfgAAFGVzABRl6gAAAAECq3p4wABLXsAAS23AAExqB6pkAAABYISpAAABBKt8eMAAS6DAAEusGKEvAGCIswErAQWrgAAAAAAEAAADAAAAAAAAAAAAYKt6AT8BCQEAhLAAAAAAAQarfnjAAEwkwABMKcAATGgAAqoeAAAAAQPAAEw4wABMaAAAAAICAsAATEoAAACHLmCtYwDAAExcAAAAqi1giLMAAFwAAAAUZk0AFGaRAAAAAQKrgXjAAEy4wABMvsAATaUDqmUAAAFgh4UAAWCsYwABBauFeMAATRHAAE0RwABNKQAAAAPAAE0nwABNKQAAAAAAAABgq4EBPwEJAcAATRGHjAAAAAABBquDeMAATS7AAE0/wABNowAAqh4BasAATS9gwAD9HAIAAAEDwABNTsAATaMAAAABAQHAAE1gAAAAhy5grWMAAFwBPgFKwABNbwEcwABNfoDAAE12wBRnJqpmAQABLgCtfwAAFGb0ABRnVQAAAAECq4Z4wABN+MAATf7AAE9MA6pnAAABYIdlAAFgrGMAAQWrjHjAAE5bwABOW8AATqEAAAADwABOdsAATqEAAAABAQHAAE6CAAAAgmtghKkAAGCrhgE/AQkAwABOkIduAQABgMAATpbAFGekAAIGq4h4wABOpsAATrXAAE7LAQCqHQAAAAEDwABOvsAATssAAAAAAAAAYISpAUrAAE7BARbAAE7BLoJrh2cGq4p4wABO0MAATuHAAE9KAACqHgFqwABO0WDAAP0cAgAAAQPAAE7wwABPSgAA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qywpr2UGrYx5wABFTcAARVLAAEmdAACqfgAAAAEDwABFZcAASZ0AAAACAgLAAEV1AAAAg+5gq7oAwABFhAAAAKotYIizAABcAT4KTsAARZvAAEWoAACqfGCEqQEWwABFr4DAAEWqwBT1BKp8q79OwABFxcAARdMAAKp9YISpARbAAEXagMAARdXAFPUEqn2rwD0cwABGSBbAAEY/Lqo+rWWqSgMAA4LAAEZYwBT1JIHAAEZmwBT1ESkArN1OwABGgsAARooAAKstYIizAR7AAEaMqwQCAAKCwABGnMAU9SQWwABGqi6qPq1lAD0XwABGxxbAAEa+gMAARrnAFPUEgmyHM4KQhMAARs7AFPWViFRJwABHLCXAAEc8gcAARzDAFPURYKrvPgE9HMAAR10WwABHVC6qPq1lqkoEAAODwABHbcAU9UeEwABHfMAU9ZUpAapTKazdPgE9HMAAR8cWwABHvi6qPq1lqkoEAAODwABH18AU9UeBwABH5sAU9REpAapTKazdTsAASCfAAEgvAACqRmCIswEewABIMasEAgACg8AASEHAFPVHFsAASFAuqj6tZQA9F8AASO+AwABI6sAU9QShLxzAAEklFsAASQ8WwABJBi6qPq1loL2vRapWAgAChMAASTvAFPWVhcAASUTAFPZfAMAAiMCrvD0XwABJXBbAAElXgMAASVLAFPUEgmmrvoW2HsAASWmrBAIAAoDAAEl5wBT1BBbAAEl/Lqo+rWUAhghKwABJjgErBq2NecAASaLAAEmnwABLwQAAqoAAAAABA8AASbbAAEvBAAAAAQEBwABJwgAAAIPuYKvFAABcAT4GTsAASdLAAEnkAACqIWCEqQEWwABJ64DAAEnmwBT3PKohq8dOwABKBsAAShMAAKpLYIjuARbAAEoyFsAASigWwABKHhbAAEoVLqo+rWWHYa8qmsacjYT0g0I9HMAASkgWwABKPy6qPq1lqkoDAAOBwABKYcAU90+CwABKdMAU93IhFsAASowWwABKgy6qPq1lh3qvQgCs3T0cwABKphbAAEqdLqo+rWWqTAQABILAAErAwBT3ch7AAErWqwQCAAKBwABK5sAU908WwABK+S6qPq1lABbAAEsRgMAASwzAFPc8hbSIBBbAAEszFsAASymAwABLJMAU9zyFtIgEhFOCWQCvUj0cwABLTRbAAEtE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iqtEScABD9IlwAEP3IbAAQ/WwBV91WCFYj4DPY3AAQ/ywBV9uBbAARAOFsABEAcUwAEQAcAVfdUGAWCFYoJFhWeE/oNsPYzAARAgwBV9qhbAARA0FMABEC7AFX3VBgFghWKCRYVnPR7AARBWwABTsAEAAYTAARBrwBV9qgA/PRzAARCIgMABEIPAFXzPqj2rAgMAAxbAARCSLqo+rWWCwAEQnMAVfO+FwAEQpsAVfbgAq009HMABEL6AwAEQucAVfM+qx6sCAAAAAKy4SsABENsBKwatrXnAARDvwAERAMABEmoAAIWUAWrAARDwYMAA/RwCAAABA8ABEQ7AARJqAAAAAgICwAERGQAAAIPuYIVSAMABESgAACCqLWCIswAAXAE+BU7AARE/wAERRgAAgkVgg1kBFsABEU2AwAERSMAVfvmCRYVWPR7AARFtwABTsAEAAYLAARGCwBV/GQBOwAERk8ABEZgAAIKQYIizARbAARGhgsABEZrAFX8ZhP2Da0nAARGxIiXAARG8gsABEbXAFX8ZYIPlABzAARHYFsABEdMUwAERzMAVfxkCAWCD5YJng+hIAQABasABEelghCKEtgDAAP0pPgE9i8ABEfnAFX9THMABEgkWwAESAC6qPq1lq3kDAAODwAESHMAVf1OBwAESIsAVfwaAwAESL8AVfvkAr24/PRzAARJJFsABEkAuqj6tZasOAgACgMABElvAFX75g8ABEmHAFX9TAK9OBq2uecABEm/AARKAwAEVWgAAhaQBasABEnBgwAD9HAIAAAEDwAESlcABFVoAAAACAgLAARKnAAAAg+5ghbgAwAEStgAAIKotYIizAABcAT4FTsABEtbAARLhAACrLmCJAAEjIRzAARLvFsABEuiAwAES48AVgFeCRYW/SAEAASsAwAD9KRbAARMWFsABEw0WwAETBoDAARMBwBWAV4JFhb+CaoPqhTWElR/AARMxiRkCAAIxwAETPmCIswBqwAETSGCIyoR5AAFgiQBOwAETYcABE3oAAKsWYMAA+goBIRzAAROtHsABE4SrCAEAARbAAROigMABE53AFYBXW4W7AEgBAAErAMAA/SlOwAETvsABE84AAKsTYK+JARzAARPZFsABE9Auqj6tZasUBQAFgcABE+nAFYBkFsABE/uAwAET9sAVgFeEU4JZgsABFA/AFYB3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YIizAGrAASO4YIjKhHkAPYvAASPOwBWLXmrAASPhYIjKhHlOwAEkFMABJCQAAKsTYK+JARzAASQvFsABJCYuqj6tZasUBQAFgcABJEjAFYs9FsABJGKAwAEkXcAVizCEU4JZgsABJHbAFYtQg8ABJIrAFYteFsABJKOAwAEknsAVizCqaqygAK9lPRfAASTAgMABJLvAFYswoS8WwAEk34TAASTPwBWMKIKQr4yssErAASTpARzAASTwLqrGAgACgMABJRHAFYswgcABJRfAFYs9AK24Bq23ecABJSzAASUxwAEnCQAAqsUAAAABA8ABJUrAAScJAAAAAgICwAElZwAAAIPuYKymAMABJXYAAACqLWCIswAAXAE+Az01AAAAAQBghKkBFsABJkeAwAEmQsAVjQCCa6yoIxzAASZZFsABJlKCwAEmUsAVjSGEUoJYSAEAASsAwAD9KRfAASZSgsABJlLAFY0hhFKAwAEmXcAVjQCCWCsBYIJSPRzAASZxFsABJmguqj6tZapKAwADFsABJo+AwAEmisAVjQCCa6yoasABJqFgqu/AANYJIRbAASa6FsABJrEuqj6tZYd6r0IArN1KwAEmywEcwAEm0i6qxgIAAoDAASbzwBWNAIHAASb5wBWNDQCtuAatuHnAAScOwAEnE8ABJ9cAAKrGAAAAAQPAASczwAEn1wAAAAICAsABJ1cAAACD7mCsrgDAASdmAAAAqi1giLMAAFwBPgM9HMABJ36AwAEnecAVjhWqx6sCAAAAAKy4PRfAASeggMABJ5vAFY4VoS9qwAEntWCIyoR5rLBKwAEnyAErBq25ecABJ9zAASfhwAEoIQAAhesAAAABA8ABJ/TAASghAAAAAgICwAEoBAAAAIPuYIa7AMABKBMAACCqLWCIswAAXAE+AAatunnAASgmwAEoN8ABKMsAAIXvAWrAASgnYMAA/RwCAAABA8ABKEHAASjLAAAAAgICwAEoSAAAAIPuYIbNAMABKFcAACCqLWCIswAAXAE+AT0cwAEocxbAAShqLqo+rWWqSgMAAxbAASiRgMABKIzAFY7pgmuGz2rAASijYKrvwADWCSEWwAEovBbAASizLqo+rWWHeq9CAKzdBq27ecABKNDAASjVwAEpKAAAq4AAAAABA8ABKOfAASkoAAAAAQEBwAEo9gAAAIPuYKzAAABcAT4BPRzAASkLFsABKQIuqj6tZarZAQABFsABKR+AwAEpGsAVj3mCaYgpAKzfBq28ecABKS3AASkywAEp4QAAqs8AAAABA8ABKUfAASnhAAAAAQEBwAEpWQAAAIPuYKzGAABcAT4CPRzAASluFsABKWUuqj6tZarZAQABFsABKYKAwAEpfcAVj9yCaYgaAKzfRsABKY3AASm1wAEplgAAAKuBYKzAABbAASmlgMABKaDAFY/cqs6syD4BPRzAASm9LquAAQABgcABKdDAFZAhAK27Bq29ecABKebAASnrwAEqdQAAqtEAAAABA8ABKgLAASp1AAAAAQEBwAEqFgAAAIPuYKzNAABcAT4CPRzAASorFsABKiIuqj6tZarZAQABFsABKj+AwAEqOsAVkIGCaYgyAKzfPRzAASpTFsABKkouqj6tZarZAQABFsABKmeAwAEqYsAVkIGGQogzAKzfBq2+ecABKnrAASp/wAErIgAAqtsAAAABA8ABKpfAASsiAAAAAgICwAEqswAAAIPuYKziAMABKsIAAACqLWCIswAAXAE+Aj0XwAEq2oDAASrVwBWRDqEvFsABKwYWwAEq/BbAASryFsABKukuqj6tZYdhryqazZy+hPSDQqzkSsABKxMBKwatv3nAASsnwAErLMABLYAAAKrpAAAAAQPAAStLwAEtgAAAAAICAsABK24AAACD7mCs8wDAASt9AAAAqi1giLMAAFwBPglOwAErmQAAAKo/YIizAE7AASurwAErsAAAnmtghKkBFsABK7eAwAErssAVkZOea6tCScABK8ElwAEryoPAASvFwBWRwWCEvD4BPYrAASviwBWRszUAAAABAGCIswEWwAEr8hTAASvtwBWRwQMBYIS8hXSEvyMcwAEr/4QAwBWSBkgBAAErAAAWwAEsEBbAASwHFMABLALAFZHBAwFghLyCbIS+gpCIVIQAwBWSBgFgiLM/TsABLCnAASw2AACqQGCIswFqwAEsPmCq78AA1glOwAEsVcABLFsAAIKKYISpARbAASxigMABLF3AFZGTgoqrREnAASxtJcABLHeFwAEsccAVkoJghMg+Aj2MwAEsj8AVkmUWwAEsrRbAASykFMABLJ7AFZKCBQFghMiCbITKgpCIVEnAASy5IRzAASzCg8ABLL3AFZHBSAEAASsAwAD9KT4BPRzAASza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wAE3QMAVmauCkIhUTsABN13AATdqAACFdGCIswEcwAE3ixbAATd1FsABN2wuqj6tZaCgrNqrhwMAAxbAATekgMABN5/AFZmLqvSrAq0hFsABN7CAwAE3q8AVmYuq9asCrSKDwAE3uMAVmdcAr5pJwAE3zyEcwAE34IXAATfTwBWaIUgBAAErAIi3PgE9NQAAAAEAYMAAUekBFsABN/oWwAE38S6qPq1lqFuvRCMcwAE4C4YAwBWaokgBAAErAAArHMABOAuGAMAVmqKorwQABBbAATgbFsABOBIuqj6tZYCsr0EWwAE4JYDAATggwBWZi4RTglknhXQfwAE4T8AAUgABAAGFwAE4a8AVmiEAAMAAUesBXD89F8ABOIqAwAE4hcAVmYuFdIXAATiZwBWaIYS/TsABOK/AATi0AACCkGCIswE1AAAAAQBgiLMBhcABOLbAFZohIxzAATjDhgDAFZtYSAEAASsAAITAATjGwBWZ/oYAwBWbWAFgiLNJwAE44hbAATjvgsABOObAFZmrquGrAq0BPgE9jsABOQnAFZtHHMABORkWwAE5EC6qPq1lq3kDAAOGwAE5LMAVm0eBwAE5MsAVmZiAwAE5P8AVmYsAr24/PRfAATlVgMABOVDAFZmLoS+GwAE5ZMAVm0etH0rAATluASsGrcR5wAE5gsABOYfAATtQAACq+AAAAAEDwAE5mcABO1AAAAABAQHAATmoAAAAg+5grScAAFwBPgVOwAE5uMABOcoAAKohYISpARbAATnRgMABOczAFZwyqiGtKU7AATnswAE5+QAAqktgiO4BFsABOhgWwAE6DhbAAToEFsABOfsuqj6tZYdhryqaxpyNhPSDQj0cwAE6LhbAATolLqo+rWWqSgMAA4HAATpHwBWcRYLAATpawBWcaCEWwAE6chbAATppLqo+rWWHeq9CAKzdPRzAATqMFsABOoMuqj6tZapMBAAEgsABOqbAFZxoHsABOryrBAIAAoHAATrMwBWcRRbAATrfLqo+rWUAFsABOveAwAE68sAVnDKFtIewFsABOxkWwAE7D4DAATsKwBWcMoW0h7CEU4JZAK9SPRzAATszFsABOyouqj6tZarZAQABFsABO0eAwAE7QsAVnDKCaYexAKzfBq3FecABO1XAATtawAE+ZAAAqvoAAAABA8ABO2zAAT5kAAAAAQEB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ANYLhcAA1f3AFnBeSwEAARTAANYMwBZzGQoAAMAA/IMAasAA1ihgiMqEeQFgiLMAwAD8uj2PwADWRcAWcQoewADWYZq+AQABFMAA1mnAFnLuCQAAPgE9j8AA17nAFnEKasAA19VgmrrAAJMURcAA2L8BwADYyMAA2MoAAGJgwAD70AGTARzAANjRFMAA2M/AFnR+CQBjAQABFsAA2NuGwADY08AWcIdhwAD8owDAAPz9ARXAANjjwBZ0fgkcwADY5BTAANjjwBZ0fgkAZAEAAZQAwAD89T4CTsAA2QzAANkTAACZtmCs+QEmwADZDAEcwADZHIbAANkVwBZwh0sBAAEUwADZHcAWdH4JAADAAPyDYKz5ScAA2ScewADZR60GAQABFMAA2VnAFnTlCgAAPgROwADZdQAAAKEvYIizAEnAANmLHMAA2akcwADZpRTAANmPwBZxGAgASwEAARTAANmmwBZ0fgkAAMAA/INIAQABFsAA2cAWwADZthbAANmsLodhryqaxZyohPSDQgCItz4BPRXAANnVwBZ1PgsWwADZ+hbAANnuFsAA2eQuh2GvKprEnKqE9INCScAA2hIhHMAA2jAcwADaLBTAANoWwBZxGAgASwEAARTAANotwBZ0fgkAAMAA/INIAQABKwCItz4BPRXAANpFwBZ1PgsewADaVMAAU7UCAAIWwADaZC6HYa8qHMAA2oqHwADafcAWcQqFfQEAARzAANqvFMAA2pnAFnEYCABLAQABFMAA2rDAFnR+CQAAwAD8gwCayQA+AT0VwADa0cAWdT4LasAA2uZgiMqEeT01AAAAAQBgwABR6QEWwADbBy6oW69EIxzAANsYFADAFnZzDABIAQABKwAAKxzAANsYFADAFnZzDACorwQABBbAANsfLoCsr0EWwADbKxTAANskwBZ05QoAhFOCWSeCkB/AANtPwABSAAEAARTAANtrwBZ1PgsAAADAAFHrAVw9F8AA24oUwADbg8AWdOUKAIKQFMAA25HAFnU+CwCIVD9JwADcViElwADcaIPAANxawBZuEmCq7z4BPYvAANyBwBZuEhzAANyeh8AA3JHAFnEKhX0BAAGDwADcrcAWbhIAmsk/TsAA3VnAAN1tAACshGDAAPoKAYTAAN1vwBZuJ07AAN2ZwADdqwAArIVgrwMBFsAA3bIuq3WvSk7AAN3V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wAETesAWkzUAPgFKwAETzQFqwAET2mCIyoR5P07AARQawAEUIAAArJNgiLMBHMABFDCBwAEUIsAWklUgAQABg8ABFDHAFpM1AABJwAEUPhzAARRIhMABFELAFpPNSAEAASsAiLdKwAEUUQGDwAEUWMAWkzU/TsABFGjAARRuAACslGCIswEcwAEUfoHAARRwwBaSVSABAAGEwAEUf8AWk80AAEnAARSNHMABFJeFwAEUkcAWlCZIAQABKwCIt0rAARSgAYPAARSnwBaTNT89i8ABFLPAFpM1hcABFLrAFpQmPYjAARTpwBaSPBzAART+gcABFPDAFpJVIAEAAYDAART/wBaSPAAABq9ygITAARUTwAEVHMABFokAAKsNAAAAAQPAARUswAEWiQAAAAEBAcABFTYAAACCkGCIswAAYIizAT4CScABFUIiJcABFUuAwAEVRsAWlOBgiO4AHsABFWfAAPWxAgACFsABFXYUwAEVccAWlOAAAWCI7oTiiPQWwAEVixbAARWBLodhryqa0JyXAD4BSsABFaMBFMABFarAFpTgAAFgiO4/SsABFiIBH8ABFi2I/gIAAhbAARZOFsABFkQuh2GvKprQnJcxwAEWZ2CIswE1AAAAAQBgiLMBgMABFmjAFpTgIxzAARZtgQDAFpWHSAEAASsAAGrAARZ2YIjKhHmBAMAWlYcBYIizAAavc4CEwAEWjsABFpfAARdTAACsUgAAAAEDwAEWpcABF1MAAAABAQHAARavAAAAgpBgiLMAAGCIswE+Ak7AARa/wAEW0wAArJVgiLMBNQAAAAEAYIizAYDAARbVwBaV6SMcwAEW2oEAwBaWD0gBAAErAABqwAEW42CIyoR5gQDAFpYPAWCIs0rAARb2AR/AARcBiP4CAAIWwAEXIhbAARcYLodhryqa2ZyWMcABFzlgiLMBgcABFzrAFpX+AAavdICEwAEXWMABF2HAARfaAACrHgAAAAEDwAEXacABF9oAAAACAgLAARdzAAAAgpBgiLMAwAEXfwAAAISMYIMUAABgiLMBPgFKwAEXjQEfwAEXmIj+AgACgcABF6bAFpazMcABF7hgiLMBNQAAAAEAYIizAYDAARe5wBaWpiMcwAEXvoIAwBaW6kgBAAErAABqwAEXx2CIyoR5ggDAFpbqAWCIswAGr3aAhMABF9/AARfkwAEZGQAArHyu/gAAAAEDwAEX9MABGRkAAAACAgLAARgGAAAAW2CFcwDAARgWAAAAmblhAmDAAP22YISpXAAAXAE+AkbAARhKwAEYd8ABGFMAAACCa2CEqQAWwAEYa4DAARhhwBaXToWNhXY+AT0cwAEYh4HAARh/wBaXWiACAAIrgsABGI7AFpd9AABGwAEYpcABGNLAARiuAAAArJZghYEAFsABGMuAwAEYwcAWl06FV4V3PgE9HMABGOKBwAEY2sAWl1ogAgACFsABGPOCwAEY48AWl8aAvYWDFsABGQmCwAEY+cAWl8aAloWEAAAGr3eAhMABGR7AARklwAEa/QAArGyu/gAAAAEDwAEZOMABGv0AAAAEBATAARlGAAAAhIxggxQAwAEZUwAAAIC9YIh+AMABGV4AAACbBmDAAPoKAMABGWoAAACHTmDAAPvQAABgg1kBPgNOwAEZg8ABGYoAAIJmYINZARzAARmkFsABGZMWwAEZjC6q1a9AqMjAAFOjrJcFAAWAwAEZzsAWmEqBwAEZ1sAWmFeCwAEZ3MAWmGSDwAEZ5MAWmHMWwAEZ8C6EQ69HAMAAUHtJwAEZ/iIcwAEaCYTAARoCwBaYikgBAAErAMAA/SkANQAAAAEAYMAA+goBNQAAAAEAYLSfARbAARoVLoRDr0cjHMABGh6FAMAWmRhIAQABKwAAKxbAARoehQDAFpkYnm/AAFTAAWDAAPoKIxzAARomhQDAFpkMSAEAASsAACqFAMAWmQwBYMAA+go+AT0jHMABGmmEwAEaYsAWmIpIAQABKwDAAP0pjMABGmLAFpiKHMABGoYWwAEady6qW69DmwkDAAKAwAEamcAWmEqBwAEaocAWmFcBmwaCwAEar8AWmGSbrSsBYINZP0rAARrCAR7AARrdwABTsAEAAYTAARrywBaYigAGr3iAhMABG/zAARwrwAEgpQAArGeu/gAAAAEDwAEcR8ABIKUAAAABAQHAARxaAAAAgmtghKkAAF2RYAFhAmCIs2CIs2CRSQE+CEnAARxsJcABHHuAwAEccMAWmhtghtg+AUrAARyTAWrAARyaXZFgAWECYIizYIizYJFJwABUKj9JwAEcxCXAARzTgMABHMjAFpobYIbyPgFKwAEc6gFqwAEc8V2RYAFhAmCIs2CIs2CRScAAVJA/ScABHRolwAEdKYDAAR0ewBaaG2CG5T4BSsABHUABasABHUddkWABYQJgiLNgiLNgkUnAAFT2P0nAAR1wJcABHX+AwAEddMAWmhtghxo+AUrAAR2eAWrAAR2lXZFgAWECYIizYIizYJFJwABTxD9JwAEd0CXAAR3fgMABHdTAFpobYIXLPgFKwAEeAQFqwAEeCF2RYAFhAmCIs2CIs2CRScAAVcI/ScABHi4lwAEePYDAAR4ywBaaG2CFUj4DTsABHlfAAR5eAACCRWCDWQEWwAEeaxTAAR5gwBaaGwABYIVSgkWFVknAAR55IiXAAR6EgcABHn3AFptnYIPlABzAAR6gFsABHpsUwAEelMAWm2cBAWCD5YJng+hIAQABasABHrFghCKEtgDAAP0pPgFJwAEewyEcwAEe3RbAAR7OFMABHsfAFptnAQFgg+WE+YNhSAEAASsAwAD9KT4BSsABHvIBasABHvldkWABYQJgiLNgiLNgkUnAAFYoPgFKwAEfNQFqwAEfPF2RYAFhAmCIs2CIs2CRScAAVos/SsABH3kBKz9JwAEfkCXAAR+fgMABH5TAFpobYIS8PgJOwAEfu8ABH8QAAIJsYIhOARbAAR/RFMABH8bAFpobAAFghLyCbIS+ScABH+EiJcABH+6BwAEf5cAWnGVgrPkAHsABIDatBwEAARTAASBGwBacZQEBYKz5AD4BSsABIFsBasABIGJdkWABYQJgiLNgiLNgkUnAAFVcPz9KwAEglgErBq95gITAASCqwAEgr8ABIqQAAKxirv4AAAABA8ABIMHAASKkAAAAAgICwAEgywAAAKpLYIizAMABIOIAAACsXWCIswAAYMAA+goBPgRJwAEg9CIlwAEhBYDAASD4wBadEGCI7gAcwAEhOBbAASEuFMABISHAFp0QAAFgiO6E4oj0SAEAARbAASFRFsABITsuoL2vRZrQm2MAwAD9KT4BPYjAASFowBadEBzAASGkFsABIZcmwAEhhQCAwAEheMAWnRBgiO6FF4jySwEAAZMAwAD8gz9JwAEhsyXAASHEgMABIbfAFp0QYIkASsABIdUBKT9JwAEh5hzAASH3gMABIerAFp0QSAEAARbAASIQFsABIfouoL2vRZrOwACIuwCItz4BScABIikhHMABIkQWwAEiLi6gva9Fmt8CAAKBwAEiUMAWnR2AwAEiXMAWnRAAwABT7z4B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wQEAAYHAATFswBagegCE5QEAAYPAATGVwBakQwCayoaWiWVOwAEyg8ABMoYAAKyiYIjuARbAATKXgsABMojAFqCHhpaJZT0cwAEytxbAATKuLqyYr4GspQIAAoTAATLHwBalJIXAATLLwBalaADAAFpYPRzAATLfFsABMtYurJivgaylAgAChcABMu/AFqVohMABMvPAFqUkAMAAWlgGr4aAhMABMwXAATMKwAE79wAAmvkAAAABA8ABMw/AATv3AAAAAQEBwAEzFgAAAITiYIMUAABcAT4MTsABMzHAATM9AACE1WCJXwEWwAEzSYDAATM/wBamCoTVgyVAHMABM3sWwAEzbYHAATNhwBamHYUXiWKWMAEAATTAATOBA8ABM4HAATOgAAAAAQEBwAEzggAAAIOmYIizAABgwAD6CgFKwAEziAEcwAEzioLAATOIwBamcEgBAAFqwAEzk2Cq78AA1gkAiLcAwAD8RcABM2HAATOhAE7AATSKwAE0kwAArJxgiV8BFsABNJ+AwAE0lcAWpgqE1IMkTsABNLTAATS/AACsm2CDFAEWwAE0zYHAATTBwBamHYTiiWROwAE05sABNPUAAKydYIlfARbAATUCg8ABNPfAFqbdhNSDJD0cwAE1TS6smgMAA4PAATVhwBam3YLAATVtwBamuoTAATV3wBanAACvhU7AATXmwAE17QAAgXZdwAD8pQJgiUpgwABTxwEcwAE1+BbAATXvLqyYr4GspgAAAADAAFpXTsABNmfAATZyAACagF3AAPx0AWCJSgEcwAE5kRzAATaOFsABNn+DwAE2dMAWpt2EuIMjgKsBAWCJSgE0wAE2kgPAATaSwAE5jwAAAAEBAcABNpMAAACA1GCJSgAAYIlKAT4FTsABNqLAATatAACsp2DAAFPHARzAATa1hcABNq/AFqdNSwEAAYbAATa2wBan0ADAAPy5ScABN1ciIRzAATdmh8ABN1vAFqflSAEAASsAwAD9KQAhHMABN4IWwAE3fIfAATdxwBan5YZ/wABTykgBAAEWwAE3kIfAATeFwBan5YZ+wABTyQCItz4CPRzAATehLqyZAgACHMABN+JqwAE3vF2RYAFhA2DAAP22YMAA/bZgiLNgkUnAAGGDiAUDAAMWwAE3+4PAATfwwBam3YC9gxoWwAE4JBbAATgagsABOBHAFqa6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sNnAALDkwACzzAAArSew3QAAAAEDwACw98AAs8wAAAACAgLAALEKAAAAgJZghKkAwACxKwAAAK0GYKtAAABghKkBPgZOwACxSMAAsVYAAK0oYIhOAR/AALFciHIBAAGAwACxecAXf18AScAAsYUcwACxkBbAALGJLpsGsalIAQABKwDAAP0pPgE9HMAAsakWwACxoS6s/rDdsOihiwMAAhrAALG+rmYewACxzMAAWWgBAAEWwACx2y6STrDpAAGHcymzUz9OwACyC8AAshEAAIKKYIWmATXAALIXAAABAGCFpgEfwACyF4W2AwADGsAAsjauZhzAALJUFsAAskwurP+w3bDsoWIBAAEcwACyahbAALJiLqz/sN2w7FsCAAIxwACyjWCEqQIcwACyji6tJgAAAACxsB/AALKhhMcBAAGCwACyrcAXf4EAFsAAssoukk6w6QCzuQCz/ibAALLbARbAALLbLpsGsalgg+UANQAAAAEAWwEXwACy64PAALLpwBeAE4RTHsAAsvjAAFloAQABFsAAswcukk6w6QCCWYMAwBeAEz01AAAAAQBgq0ABgcAAsxPAF39sIxzAALMmhADAF4DjSAEAASsAACsXwACzJoQAwBeA44KKg8AAsy7AF4ACq0QBYIWmTsAAsz3AALNDAACtD2CITgEfwACzSYhyAQABg8AAs2bAF4ACAErAALNyAR7AALN5sN8CAAKCwACzisAXf4EewACzmbDfAgAChMAAs6HAF4EmH8AAs6yExwEAAYLAALO4wBd/gQAAAAaxs4CIwACz0cAAs+jAALWUAACtBLDdAWrAALPSYMAA/RwCAAABA8AAs/fAALWUAAAAAAAAAGCEqQE+AknAALQAHMAAtAsWwAC0BC6hp7GoSAEAASsAwAD9KT4BPRzAALQkFsAAtBwurP6w3bDooYsDAAIawAC0Oa5lHsAAtEfAAFloAQABFsAAtFYukk6w6QABh3Mps1M/SsAAtMABNcAAtMsAAAEAYKx1AR/AALTLrH0DAAIawAC06a5lJsAAtQcBHMAAtQcWwAC0/y6s/7DdsOyhYgEAARzAALUdFsAAtRUurP+w3bDsWwIAAjHAALUzYISpARbAALU0LiexpxbAALU8LpJOsOkAs7kAs/5gqxIBhXsmwAC1XgEWwAC1Xi6hp7GoYIPlNQAAAAEAWwEXwAC1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UYqEpoLGTsAA0RnAANEeAACea2CtPwE1wADRJAAAAQBgrT8BH8AA0SStRgIAAhbAANFQFsAA0UguhCGx0q00wABRihzAANFqFsAA0WIuhCGx0q01AQABFsAA0YYWwADRfi6s/rDdsOigmrM7AMAAUZIANQAAAAEAWwEXwADRl4HAANGVwBebdIRTHsAA0aTAAFloAQABFsAA0bMukk6w6QCCWYEAwBebdD01AAAAAQBgq0ABgMAA0b/AF5svIxzAANHSggDAF5wHSAEAASsAACsXwADR0oIAwBecB55rgcAA0dnAF5tjq0IBYK0/SsAA0eMBgcAA0erAF5tjBrHagIjAANH3wADSDsAA03AAAKFkAWrAANH4YMAA/RwCAAABA8AA0hrAANNwAAAAAgICwADSHwAAAINcYMAA+9AAwADSMQAAAFtghXMAAGCEqQE+AknAANJCIhzAANJ0FsAA0m0cwADSThbAANJGLqz/sN2w7KLMAQABgcAA0mLAF5yaALO8YcAA/KOAlwEAAZMAwAD8/wEcwADSrBbAANKlHMAA0osWwADSgy6s/7DdsOyizQEAAYHAANKawBecmgCzu2HAAPyjgJcBAAGTAMAA/P8+AT0cwADSwRbAANK5Lqz+sN2w6KGNAwADasAA0uNgkVTAAFuRgMAA0wfAF5yLFsAA0x0nrTNhwAD9ugCzUD9KwADTMAEcwADTPxbAANM3LoQhsdKtNgMAA4DAANNRwBecixbAANNZLqz/sN2w7IHAANNiwBecmgDAAFGRBrHbgIjAANN1wADThsAA09sAAIQsAWrAANN2YMAA/RwCAAABA8AA043AANPbAAAAAQEBwADTmQAAAIQ7YMAA/iAAAFwBPgI9HMAA06qAwADTpcAXnduCigEAASetNwDAAP4iPRzAANPJgMAA08TAF53bgooBAAEWwADTzy6EIbHSAMAA/iIAABeacAAXmrUAF5r6ABecWAAXnagAF54uAAAABQKx3oCIwADT4MAA0+bAAOMfA604AAABYLDlAAACBLHggIjAANQtwADUPAmtOQBgsn8ABLHhgIjAANRRwADUYAmtOgBgsOUAAQWx8oCIwADUZcAA1GXAANT6AAAAA8AA1HzAANT6AAAABAQEwADUlwAAAJVWYLM1AMAA1KUAAACSTmCeqwDAANS3AAAErTlgsn8AwADUzQAABK06YLDlAABgsd4BPwMIAbHgggDAF57QCAGx4YMAwBee3QkAwADU5rEKAgACgMAA1OzAF562gcAA1PTAF57DAAsGseSAiMAA1P/AANUWwADVqQAArQSw3QFqwADVAGDAAP0cAgAAAQPAANUlwADVqQAAAAAAAABghKkBPgFKwADVLgEcwADVPRbAANU1Lqz+sN2w6KOYAwADHMAA1WEWwADVUS6tOrHhrQSw3QAAAACw8ybAANWMARbAANWMFsAA1XwurTmx4IMksoFgwABRcRbAANWaFsAA1ZQukk6w6YdOnrQAs0sGseWAiMAA1a7AANXFwADWmQAArQWw3QFqwADVr2DAAP0cAgAAAQPAANXOwADWmQAAAAEBAcAA1ekAAACtBmCrQAAAYISpAT4BSsAA1gIBHMAA1hEWwADWCS6s/rDdsOijmAMAAxzAANY+FsAA1i4urTqx4a0FsN0BAAGAwADWSMAXn/4AsPcmwADWdAEWwADWdBbAANZkLq05seCDJLKBYMAAUXEWwADWihbAANaELpJOsOmHTp60ALNLBrHmgIjAANaewADWtcAA18kAAK0JsN0BasAA1p9gwAD9HAIAAAEDwADWv8AA18kAAAADAwPAANbLAAAAgJZghKkAwADW1wAAAKMlYMAA+goAwADXBAAAAK0GYKtAAABghKkBPgFKwADXHQEcwADXLBbAANckLqz+sN2w6KOYAwADHMAA11kWwADXSS6tOrHhrQmw3QMAA4DAANdkwBeguYHAANdrwBegxoLAANd4wBeg1QCw+CbAANekARbAANekFsAA15QurTmx4IMksoFgwABRcRbAANe6FsAA17Qukk6w6YdOnrQAs0sGseeAiMAA187AANf0wADYTgAArQcBasAA189gwAD9HAIAAAEDwADYCsAA2E4AAAABAQHAANgWAAAAo6JghKkAAGCrQAFKwADYJAEmwADYJAEewADYNa1cAQABgMAA2ErAF6GgAGCrQAax6ICIwADYU8AA2F/AANpnAACg7AFqwADYVGDAAP0cAgAAAQPAANhywADaZwAAAAMDA8AA2JIAAAChgmCy1ADAANicAAAArRJgwAD70ADAANixAAAAoYRgwAD6CgAAWwE+Ak7AANjLwADY2gAArTtgwAD9HAEcwADY9BbAANjkLq06seGg7AMAA4DAANkIwBeiCIHAANkOwBeiFYLAANkewBeiJACxA0nAANkwJcAA2UODwADZNMAXojlgsOU+AUrAANlZAR/AANlksfIEAAQWwADZhy6s/rDdsOgWwADZkC6STrDpFsAA2ZcurTmx4BTAANmowBeiOQMBYLDlAD4CTsAA2dfAANniAACCa2CEqQEmwADZ1wGDwADZ5MAXojlghKlKwADZ+gEcwADaCRbAANoBLqz+sN2w6KOYAwADhMAA2ijAF6LXJsAA2kQBFsAA2kQWwADaNC6tObHggySygWDAAFFxFsAA2lIWwADaTC6STrDph06etACzSwax74CIwADabMAA2oPAANr8AQCtALDdAWrAANptYMAA/RwCAAABA8AA2pXAANr8AAAAAAAAAGDAAP22AT4BSsAA2psBJsAA2psBHsAA2qKdGAMAAyetPB7AANrcwABZaAEAARbAANrrLpJOsOkAFsAA2vMurQKw3bDvAGDAAP22BrHwgIjAANsBwADbGMAA2z8BAK0BsN0BasAA2wJgwAD9HAIAAAEDwADbI8AA2z8AAAAAAAAAYMAA/bYBSsAA2yYBJ604BrHpgIjAANtEwADbXMAA36QAAKJYAWrAANtFYMAA/RwCAAABA8AA23rAAN+kAAAAAQEBwADbkAAAAFtdwAD8dAFgwABWtwAAYMAAVnUBPghOwADbqMAA260AAIC9YMAA/bYBJAADFsAA28IWwADbsi6tObHgrQCw3bKEJ4FqFsAA2/IWwADb4i6tOrHhrQCw3bDtTsAA3BfAANwcAACCkGDAAFZ1ARzAANw2FsAA3CYurTqx4aJYAQABgMAA3FXAF6RKALEETsAA3HQAAAAiYJFnAEnAANyBIiXAANyKgsAA3IXAF6SrYMAAVjgAJcAA3LIWwADcphTAANyhwBekqwIBYMAAVjiemsAAVjxgwABVmD4CTsAA3OTAANzwAACemmDAAFWYASbAANzkARbAANz3FMAA3PLAF6SrAgFgwABWOJ6awABWPGDAAFWYPYvAAN0KwBek3hbAAN0ghMAA3RTAF6UsIsAAVZo+Ak7AAN1AwADdSwAAh05gwAD70AEewADdTcAAWWgBAAEWwADdbBbAAN1cLq05seCSTrDpAD2LwADdesAXpN4cwADeShzAAN2uasAA3YRdkWABYQJgiLNgwAD9tmCRSaTIiAUCAAIc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AACjJWDAAPoKAWrAARIUYMAA+goAYISpAT4BSsABEiIBHMABEikurUgCAAEcwAESPBbAARI0Lqz/sN2w7FsCAAIxwAESUmCEqQGAwAESU8AXyOEWwAESWy6STrDpALO5AYUvKbIYBrIigIjAARKDwAESmsABEvYAAKDGAWrAARKEYMAA/RwCAAABA8ABEqnAARL2AAAAAAAAAGCEqQE+AUrAARKyARzAARK5Lq1IAgABHMABEswWwAESxC6s/7DdsOyhTgEAARbAARLbLpJOsOkAs7oBhS0pshgGsiSAiMABEvvAARMSwAETbwAArRCw3QFqwAES/GDAAP0cAgAAAQPAARMiwAETbwAAAAAAAABghKkBPgFKwAETKwEcwAETMi6tSAIAARzAARNFFsABEz0urP+w3bDsoU4BAAEWwAETVC6STrDpALO6AYUtKbIYBrIlgIjAARN0wAETi8ABFBEAAK0RsN0BasABE3VgwAD9HAIAAAEDwAETnMABFBEAAAABAQHAAROoAAAAgJZghKkAAGCEqQE+AUrAARO1ARzAARO8Lq1IAgABHMABE88WwAETxy6s/7DdsOxbAgACMcABE+VghKkBgMABE+bAF8qVFsABE+4ukk6w6QCzuQGFLymyGAayJoCIwAEUFsABFC3AARZ4AACi2gFqwAEUF2DAAP0cAgAAAQPAARQ+wAEWeAAAAAYGBsABFFsAAACFF13AAPx0AWDAAFa3AMABFHcAAACAvWDAAP22AMABFI0AAABbYIVzAMABFKQAAACh6mCeqwDAARS7AAAAotlgnqsAwAEU2gAAAKE7YLDQAABghKkBPgJJwAEU6yEcwAEU/YDAARTvwBfLJ0gBAAErAMAA/Sk+AkAWwAEVPxzAARUdFsABFRUurP+w3bDsoV8BAAGCwAEVNMAXy0sAs72BVcAA/FbAARUVwAEVRgA9HMABFVcWwAEVTy6s/7DdsOyhYAIAAoLAARV8wBfLSxzAARWPFsABFYcurP6w3bDooWEBAAGAwAEVpsAXyycAs1gAs74/SsABFcEBHMABFdAWwAEVyC6s/rDdsOiiyAQABBzAARYCFsABFfourP6w3bDooQwBAAEcwAEWHS6tSAEAAYLAARYowBfLSwCyGADAAFOAK4LAARZLwBfLSx7AARZewABZaAEAARbAARZtLpJOsOkAALNbAAAXwKYAF8EqABfBlwAXwewAF8JTABfDFQAXw5AAF8QxABfE3QAXxfoAF8dUABfIrgAXyXYAF8nqABfKYAAXyvQAF8yUAAAAEAKyLYCIwAEWfcABFoPAASCYA6CPAAABYLIWAAABBLIvgIjAARbbwAEW3wmAvQFqwAEWxWDAAP0cAmCIfgABBbJAgIjAARf8wAEX/MABGHoAlUkAA8ABGBzAARh6AAAAAwMDwAEYPgAAAJVWYLM1AMABGEwAAACSTmCeqwDAARhYAAAEgL1giH4AAGCyLQE/AggBsi+CAMAXzVkJAMABGGayLAIAAoDAARhswBfNP4HAARh0wBfNTAAKBrIxgIjAARbkwAEW7MABF/cEAQAAAAABA8ABFwPAARf3AAAAAwMDwAEXJQAAAJVWYLM1AMABFzMAAACSTmCeqwDAARc/AAAAgL1giH4AAGCyLQE+AknAARdLFsABF1kWwAEXVILAARdPwBfN14C9iIGBVcAA/bw+AT0ewAEXap0WBAAEJ4WYJ4C9HsABF4XAAFloAQABgcABF5TAF83KABbAARejgMABF5zAF829gKzAAFN3AD9KwAEXswEfwAEXvrJAAwADgMABF9/AF829gcABF+fAF83KgsABF+7AF83XAAayNICIwAEYf8ABGJbAARi9AQCtAbDdAWrAARiAYMAA/RwCAAABA8ABGKHAARi9AAAAAAAAAGDAAP22AUrAARikASegjwayNoCIwAEYwsABGNnAARnYAAChZAFqwAEYw2DAAP0cAgAAAQPAARjlwAEZ2AAAAAICAsABGOoAAACHTmDAAPvQAMABGQAAAABbYIVzAABghKkBPgFKwAEZEQEcwAEZIBbAARkYLqz+sN2w6KLfAwADHMABGVAWwAEZSC6s/rDdsOihDAEAARzAARl4Lq1IAgABgcABGYPAF87/AYNcgMABGZbAF87wsjcAwABTgIHAARmswBfO/xbAARnJgcABGb/AF87/hFOCWQCzXQayN4CIwAEZ3cABGfTAARuvAACtSAFqwAEZ3mDAAP0cAgAAAQPAARn+wAEbrwAAAAQBAcABGgkAAABbYIVzAAPAARogAAAAhS1gwAD6CgFqwAEaKmDAAPoKAMABGjYAAACFL2DAAPoKAWrAARpAYMAA+goAwAEaSwAAAINcYMAA+9ABagBgwAD82XdghKkB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YMAA/bYBSsABInkBFsABIoUWwAEieS6emrJDgL3AAFGdBrJJgIjAASKOwAEipcABIsYBAK0BsN0BasABIo9gwAD9HAIAAAEDwAEisMABIsYAAAAAAAAAYMAA/bYBSsABIrMBJ6COBrJLgIjAASLLwAEi3MABIzcAAIQsAWrAASLMYMAA/RwCAAABA8ABIuPAASM3AAAAAQEBwAEi7wAAAIQ7YMAA/iAAAFwBPgI9HMABIwCAwAEi+8AX17mCigEAASetGwDAAP4iPRzAASMcgMABIxfAF9e5gooBAAEWwAEjLhbAASMiLp6askOAvcAAUZ0AwAD+IgayTICIwAEjPMABI1PAASPyAACjJAFqwAEjPWDAAP0cAgAAAQPAASNiwAEj8gAAAAIBAcABI24AAACAlmCEqQABwAEjewAAAKMlYMAA+goBasABI4hgwAD6CgBghKkBPgFKwAEjlgE1wAEjoQAAAQBghOYBH8ABI6GE9wMAAxbAASOtLoV5skQWwAEjty6AvbJFgMABI73AF9hKADUAAAABAFsBF8ABI8yCwAEjysAX2H+EUx7AASPZwABZaAEAARbAASPoLpJOsOkAglmCAMAX2H8Gsk2AiMABI/fAASQOwAEkdAAAoMYBasABI/hgwAD9HAIAAAEDwAEkHcABJHQAAAAAAAAAYISpAT4BSsABJCYBNcABJDEAAAEAYITUAR/AASQxhOQCAAIWwAEkPS6FebJEFsABJEcugL2yRQA1AAAAAQBbARfAASROgMABJEzAF9krhFMewAEkW8AAWWgBAAEWwAEkai6STrDpAIJZgADAF9krBrJOgIjAASR5wAEkkMABJPgAAKFkAWrAASR6YMAA/RwCAAABA8ABJJzAAST4AAAAAgICwAEkoQAAAINcYMAA+9AAwAEkswAAAFtghXMAAGCEqQE+AUrAASTEASbAASTEAR7AASTLnRgDAAMnoWSAwAEk58AX2cAWwAEk7y6tArDdsO8AYISpAAAX1uoAF9dBABfXhgAX2BcAF9jqABfZjQAX2hQAAAAGArJRgIjAAST9wAElDMABK+QHrUoAAAFgsOUAAAEEslOAiMABJUjAASVRCaDrAGCw5QABBbJigIjAASVWwAElVsABJc4AAAADwAEla8ABJc4AAAADAwPAASWNAAAAlVZgszUAwAElmwAAAJJOYJ6rAMABJacAAASg62Cw5QAAYLJRAT8CCAGyU4IAwBfapQkAwAElurEKAgACgMABJcDAF9qLgcABJcjAF9qYAAkGslaAiMABJdPAASXqwAEmSwEArQCw3QFqwAEl1GDAAP0cAgAAAQPAASX8wAEmSwAAAAAAAABgwAD9tgE+AUrAASYCASbAASYCAR7AASYJnRgDAAMnrT8WwAEmLxbAASYpLpJOsOmHTp60FsABJkMWwAEmOy6s/rDdsOiArMAAU3cAYMAA/bYGsliAiMABJlDAASZnwAEm5wAAoWQBasABJlFgwAD9HAIAAAEDwAEmc8ABJucAAAACAgLAASZ4AAAAh05gwAD70ADAASaOAAAAW2CFcwAAYISpAT4BSsABJp8BJsABJp8BHsABJqadFgQABCTAASbAARbAASazLoWAwAD9MCehZIDAASbSwBfbnBbAASbeLq0CsN2w7wBghKkGslmAiMABJuzAAScDwAEnaQAAoyQBasABJu1gwAD9HAIAAAEDwAEnEsABJ2kAAAACAQHAASceAAAAgJZghKkAAcABJysAAACjJWDAAPoKAWrAASc4YMAA+goAYISpAT4BSsABJ0YBHMABJ00urRGw3QEAAYDAASdfwBfcNQCyYAayWoCIwAEnbsABJ4XAASgcAACtCgFqwAEnb2DAAP0cAgAAAQPAASedwAEoHAAAAAQDA8ABJ7AAAACAlmCEqQDAASfAAAAAgpBgiLMAwAEnygAAAINcYMAA+9AAAcABJ94AAACjJWDAAPoKAWrAASfrYMAA+goAYISpAT4BSsABJ/kBHMABKAAurRGw3QEAAYDAASgSwBfctQCyYAayW4CIwAEoIcABKDjAASk3AACtCwFqwAEoImDAAP0cAgAAAQPAAShPwAEpNwAAAAcCAsABKFUAAACtDGCIfgDAAShwAAAAgJZghKkABcABKIIAAACDXGDAAPvQAWrAASiKYMAA+9CBnMABKJkAAACjJWDAAPoKAWrAASimYMAA+goAwAEovQAAAIV7YIPlAWoAYMAA/Nl3wAEo2QAAAKozYMAA+goBasABKOZgwAD6CgDAASj4AAAAqjJgwAD6CgFqwAEpBmDAAPoKAGCEqQE+AUrAASkUARzAASkbLq0RsN0BAAGBwAEpLcAX3V4AsmAGslyAiMABKTzAASlTwAEp8QAAor4BasABKT1gwAD9HAIAAAEDwAEpZ8ABKfEAAAAEAQHAASltAAAArQxgiH4AA8ABKYgAAACDXGDAAPvQAWrAASmQYMAA+9CBnMABKZkAAACjJWDAAPoKAWrAASmmYMAA+goAwAEptwAAAIV7YIPlAWoAYMAA/Nl3YISpAT4BSsABKc8BHMABKdYurRGw3QEAASsAsmAGsl2AiMABKfbAASoNwAEqrAAArQ0BasABKfdgwAD9HAIAAAEDwAEqIsABKqwAAAAEAQHAASooAAAArQxgiH4AA8ABKkMAAACDXGDAAPvQAWrAASpLYMAA+9CBnMABKlQAAACjJWDAAPoKAWrAASphYMAA+goAwAEqcgAAAIV7YIPlAWoAYMAA/Nl3YISpAT4BSsABKooBHMABKpEurRGw3QEAASsAsmAGsl+AiMABKrHAASq9wAErHgAArRCw3QFqwAEqsmDAAP0cAgAAAQPAASrNwAErHgAAAAAAAABghKkBPgFKwAEq1gEmwAEq1gEewAEq3Z0YAwADJ61LFsABKwIWwAEq/C6STrDph06etBbAASsWFsABKw4urP6w3bDogKzAAFN3AGCEqQayYICIwAErI8ABKzrAASviAACtEbDdAWrAASskYMAA/RwCAAABA8ABK0vAASviAAAAAQEBwAErVwAAAICWYISpAABghKkBPgFKwAErZAEcwAErcxbAAStrLqz+sN2w6KDHAwADasABK4BgkVS/XB7AASuxwABZaAEAARbAASvALpJOsOkAHsABK8jAAFlvAQABFsABK9cukk6w6QAAwABTewAAF9riABfbaQAX3AIAF9yCABfdHgAX3g8AF963ABffXwAX3+IAF+CEAAAACQKyY4CIwAEr58ABK+3AATvNA6B7AAABYLJRAAACBLJlgIjAASwywAEsNwmAlgBghKkABLJmgIjAASxDwAEsVRih3ABgwAD9tgABBbJxgIjAASxawAEsWsABLQIAAAADwAEsa8ABLQIAAAAFBQXAASyGAAAAlVZgszUAwAEslAAAAJJOYJ6rAMABLKsAAACg62Cw5QDAASy7AAAEgJZghKkAwAEsxwAABKHcYMAA/bYAAGCyYwE/AwgBsmWDAMAX4UUIAbJmhADAF+FSCQDAASzjsmIDAAOAwAEs6cAX4R6BwAEs8cAX4SuCwAEs+MAX4TgABgayaYCIwAEtB8ABLR7AAS0/AQCtAbDdAWrAAS0IYMAA/RwCAAABA8ABLSnAAS0/AAAAAAAAAGDAAP22AUrAAS0sASegewaya4CIwAEtRMABLVvAAS2VAACgxgFqwAEtRWDAAP0cAgAAAQPAAS1qwAEtlQAAAAAAAABghKkBPgFKwAEtcwEcwAEtei6tTAEAASoAsm0GsmyAiMABLZrAAS2xwAEt6QAAoMgBasABLZtgwAD9HAIAAAEDwAEtv8ABLekAAAAAAAAAYISpAT4BSsABLcgBHMABLc8urUwBAAEpALJtBrJtgIjAAS3uwAEt+cABOXQAAK1MAAAAAQPAAS4JwAE5dAAAAAEBAcABLg8AAACjJWDAAPoKAABghKkBPgJJwAEuIiEcwAEuPhbAAS4uFsABLiYurP6w3bDooKyzOkgBAAFqwAEuUWCuFsAAt2oAwAD9KT4BSsABLl8BHMABLm4WwAEuZi6s/rDdsOigxwMAA2rAAS6GYJFUwABnaR7AAS6lwABZaAEAARbAAS60LpJOsOkAFsABLsIWwAEuvC6STrDpYZ7EAMAAU3s/ScABLtUewAEu2cAA9bECAAIngLwWwAEu6C6h3LJmAD4BSsABLwUBHMABLxYWwAEvDC6g67JToyQCAAEWwAEvJi6AlrJlAaMlgMABLzrAF+KvsPpJwAEvUx7AAS9XwAD1sQIAAiedyhbAAS9nLqHcsmYAPgFKwAEvhAEcwAEvlRbAAS+LLqDrslOtCwQAAhrAAS+trnEWwAEvty6AlrJlAoNcHsABL9DAAFloAQABFsABL98ukk6w6QCjJYDAAS/0wBfir7D8ScABMA0ewAEwEcAA9bECAAInncAWwAEwIS6h3LJmAD4BSsABMD4BHMABME8WwAEwRS6g67JTrQsEAAIawAEwZ65rFsABMHIugJayZQKDXB7AATCLwABZaAEAARbAATCaLpJOsOkAoyWAwAEwr8AX4q+w/EnAATDIHsABMMzAAPWxAgACJ53ZFsABMNwuodyyZgA+AUrAATD5ARzAATEKFsABMQAuoOuyU60LBAACGsABMSKubBbAATEwLoCWsmUCg1wewAExScAAWWgBAAEWwAExWC6STrDpAKMlgMABMW3AF+KvsPxJwAExhh7AATGKwAD1sQIAAiedxRbAATGaLqHcsmYAPgFKwAExtwEcwAExyBbAATG+LqDrslOtCwQAAhrAATHgrnAWwAEx7S6AlrJlAoNcHsABMgbAAFloAQABFsABMhUukk6w6QCjJYDAATIqwBfir7D8ScABMkMewAEyR8AA9bECAAInnZcWwAEyVy6h3LJmAD4BSsABMnQBHMABMoUWwAEyey6g67JTrQsEAAIawAEyna5YFsABMqwugJayZQKDXB7AATLFwABZaAEAARbAATLULpJOsOkAoyWAwAEy6cAX4q+w/EnAATMCHsABMwbAAPWxAgACJ53WFsABMxYuodyyZgA+AUrAATMzARzAATNEFsABMzouoOuyU60LBAACGsABM1yuXBbAATNqLoCWsmUCg1wewAEzg8AAWWgBAAEWwAEzki6STrDpAKMlgMABM6fAF+KvsPxJwAEzwB7AATPEwAD1sQIAAiedvRbAATPVLqHcsmYAPgFKwAEz8gEcwAE0AxbAATP5LqDrslOtCwQAAhrAATQbrmcWwAE0Ki6AlrJlAoNcHsABNEPAAFloAQABFsABNFIukk6w6QCjJYDAATRnwBfir7D8ScABNIAewAE0hMAA9bECAAInnbMWwAE0lS6h3LJmAD4BSsABNLIBHMABNMMWwAE0uS6g67JTrQsEAAIawAE0265yFsABNOsugJayZQKDXB7AATUEwABZaAEAARbAATUTLpJOsOkAoyWAwAE1KMAX4q+w/EnAATVBHsABNUXAAPWxAgACJ522FsABNVcuodyyZgA+AUrAATV0ARzAATWFFsABNXsuoOuyU60LBAACGsABNZ2ucxbAATWuLoCWsmUCg1wewAE1x8AAWWgBAAEWwAE11i6STrDpAKMlgMABNevAF+KvsPxJwAE2BB7AATYIwAD1sQIAAied0hbAATYZLqHcsmYAPgFKwAE2NgEcwAE2RxbAATY9LqDrslOtCgQAAxbAATZrLoCWsmVqwAE2eGCIyoR5HsABNofAAFloAQABFsABNpYukk6w6QABoyWAwAE2tcAX4q+w+0nAATbOHsABNtLAAPWxAgACJ52nFsABNuIuodyyZgA+AUrAATb/ARzAATcQFsABNwYuoOuyU60LBAACGsABNyiuWxbAATczLoCWsmUCg1wewAE3TMAAWWgBAAEWwAE3Wy6STrDpAKMlgMABN3DAF+KvsPxJwAE3iR7AATeNwAD1sQIAAiedohbAATedLqHcsmYAPgFKwAE3ugEcwAE3yxbAATfBLqDrslOtCwQAAhrAATfjrlkWwAE37C6AlrJlAoNcHsABOAXAAFloAQABFsABOBQukk6w6QCjJYDAATgpwBfir7D8ScABOEIewAE4RsAA9bECAAInnd8WwAE4Vy6h3LJmAD4BSsABOHQBHMABOIUWwAE4ey6g67JTrQsEAAIawAE4na5tFsABOKsugJayZQKDXB7AATjEwABZaAEAARbAATjTLpJOsOkAoyWAwAE46MAX4q+w/D4BSsABOQkBJsABOQkBHsABORCdFgQABBbAATkaLqHcsmYnrUwWwAE5SBbAATlCLpJOsOmHTp60FsABOWYWwAE5Xi6s/rDdsOiArMAAU3cAYISpBrJugIjAATl5wAE5kcABOw8AAKENAWrAATl6YMAA/RwCAAABA8ABOabAATsPAAAAAQEBwAE5uAAAAJ7EXcAA/KUCYMAA/bZgwAD70AAAYIQxAT4CScABOdEiIR7AATnWwAD1sQIAAieAvBbAATnlLqHcsmYAASElwAE6DhbAAToELqDrslNgsTY+AUrAATo3ARzAATpIFsABOj4uoOuyU6ENAQABgMABOl7AF+oEALEBP0rAATp8ARzAATqLFsABOoMurP6w3bDooQ0FAAUqFsABOrIWwAE6qC6g67JTrQCw3bDtHsABOs3AAFloAQABFsABOuYWwAE63C6g67JTkk6w6QAewAE67sAAWWgBAAEWwAE6/S6STrDpABbAATsFLoCWsmUAs0QGsm+AiMABOxTAATslwAE7ywAAhCwBasABOxVgwAD9HAIAAAEDwAE7LMABO8sAAAABAQHAATs4AAAAhDtgwAD+IAAAXAE+BD0cwAE7SYDAATtEwBfrLIKKAQABJ61GAMAA/iI9HsABO2G0NwIAAhbAATttLoCWsmWAwAE7dMAX6ywAPRzAATuEgMABO3/AF+ssgooBAAEnrU0AwAD+Ij0cwAE7roDAATupwBfrLIKKAQABFsABO7QuodyyZgDAAP4iAAAX4aQAF+HpABfiOAAX4ocAF+nRABfq+QAX67oAAAAGArJygIjAATvQwAE71sABP9UDoHwAAAFgslEAAAIEsnSAiMABPBvAATwpCa0MAGCIfgAEsnWAiMABPD7AATxNCYV7AGCD5QABBbJ+gIjAATxSwAE8UsABPQYAAAAD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wADTVC6ewsAAVaiew6hbSwEAAYHAANNgwBmU1QDAAPy5AWDAAFStScAA020hHMAA03eEwADTccAZlUlIAQABKwDAAP0pPgE9HMAA1AeCwADUAMAZlPyuRgEAAYTAANQSwBmVSQDAAFTMPgFJwADVQoPAANVGwBmVIj4BPRzAANVpFsAA1Vwuol7AAFWqp+YCAAKBwADVc8AZlNWCwADVecAZlPwAqJA+AT0cwADVqhbAANWdLqJewABVqoSKAgACgcAA1bTAGZTVgsAA1brAGZT8AKiPTsAA1ezAANX+AACuR2DAAFYyARbAANYALqghwABVukPAANYSHMAA1iuBwADWGcAZlnJdAAAAAMAA/G8+A07AANZGwADWSwAAgL1gwAD9tgEWwADWX4HAANZNwBmWcoC9wABWNE7AANZ3wADWfgAAgmZgwABUrQEWwADWkoHAANaAwBmWcl7AAPxxScAA1x8WwADXKoPAANcjwBmW1p5vwABUwD4AScAA110cwADXZoLAANdhwBmWr4HWAQABJ4C1AMAA/cg+AT0cwADXiBbAANeBLp5MtK6uSAIAAoLAANeewBmWr4PAANekwBmW1gC02D4BPRzAANfLFsAA18Qunky0rq5JAgACgsAA1+HAGZavg8AA1+fAGZbWALTZBrTXgJbAANgFwADYCcAA2O4AAJ6VAAAAAQPAANgbwADY7gAAAAAAAABgwAD70AE+BUnAANgkIRbAANgpLp5vwABUwErAANgyAZM/TsAA2ETAANhKAACA7mDAAPvQAZNOwADYacAA2HIAAFxdwAD8bQFgwABUrQEWwADYeS5cwABVuUPAANiHHMAA2JeBwADYjsAZl+5dAAAAAMAA/G8+AT2IwADYq8AZl9ocwADYsYDAANirwBmX2mQBAAEcwADYxRbAANi9gcAA2LTAGZfuXsAA/HGoSwAAAADAAFTNAMAA/PVKwADY3gGAwADY5cAZl9oGtNiAlsAA2PPAANj4wADaDQAArkgAAAABA8AA2Q3AANoNAAAAAgICwADZFQAAAIC9YMAA/bYAwADZJwAAAIJmYMAAVK0AAFwBPgFJwADZNRbAANlAgcAA2TnAGZi3hS/AAFTCPgJAHMAA2W0cwADZZhbAANlfFsAA2VkunsLAAFWomwioXEsBAAGAwADZZ8AZmKgAwAD8uUgBAAErAMAA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AACvLmDAAFzIAABcAT4CRsAAQfrAAEIhwABCCwAAAIC9YLajABbAAEITLq8otns+AUFHwABCKRbAAEI2gsAAQjHAGnMwgme2phQBwABCW2rAAEJbYLaFwADaJQA+Aj0XwABCdILAAEJvwBpzMICWFsAAQoKAwABCfMAacwSvMMAAY+22vELAAEKcAAHAAELAasAAQsBgtoXAANo2AD4CPRfAAELggsAAQtvAGnMwgJYcwABC7oDAAELowBpzBK8yAQABJsAAQwMBFsAAQwOCwABC/sAaczAStqlgvJEAwABkOLa8QsAAQxQAAcAAQzhqwABDOGC2hcAA2kcAPgI9F8AAQ1KCwABDTcAaczCAlhzAAENggMAAQ1rAGnMEhnQBAAEmwABDbwEWwABDb4LAAENqwBpzMBK2qWC8pQDAAGQ5trxCwABDgAABwABDpGrAAEOkYLaFwADaWAA+Aj0XwABDx4LAAEPCwBpzMICWHMAAQ9WAwABDz8AacwSvNQEAASbAAEP5ARbAAEP5gsAAQ/TAGnMwErapYLy3AMAAZDq2vELAAEQKAAHAAEQuasAARC5gtoXAANppAD4CPRfAAERMgsAAREfAGnMwgJYcwABEWoDAAERUwBpzBK83AQABJsAARHEBFsAARHGCwABEbMAaczAStqlgvMwAwABkRba8QsAARIIAAcAARKZqwABEpmC2hcAA2nsAPgI9F8AARMWCwABEwMAaczCAlhzAAETTgMAARM3AGnMErzkBAAEmwABE6wEWwABE64LAAETmwBpzMBK2qWC8zADAAGQ7trxCwABE/AABwABFIGrAAEUgYLaFwADajQA+Aj0XwABFO4LAAEU2wBpzMICWHMAARUmAwABFQ8AacwSvOwEAASbAAEVZARbAAEVZgsAARVTAGnMwErapYLylAMAAZEq2vELAAEVqAAHAAEWOasAARY5gtoXAANqfAD4CPRfAAEWtgsAARajAGnMwgJYcwABFu4DAAEW1wBpzBK89AQABJsAARc8BFsAARc+CwABFysAaczAStqlgwABiTwDAAGRJtrxCwABF4AABwABGBGrAAEYEYLaFwADasQA+Aj0XwABGIYLAAEYcwBpzMICWHMAARi+AwABGKcAacwSvPwEAASbAAEZFARbAAEZFgsAARkDAGnMwErapYLylAMAAZEu2vELAAEZWAAHAAEZ6asAARnpgtoXAANrDAD4CPRfAAEaZgsAARpTAGnMwgJYcwABGp4DAAEahwBpzBK9BAQABJsAARr8BFsAARr+CwABGusAaczAStqlgvMwAwABkILa8QsAARtAAAcAARvRqwABG9GC2hcAA2tUAPgI9F8AARxKCwABHDcAaczCAlhzAAEcggMAARxrAGnMEr0MBAAEmwABHPwEWwABHP4LAAEc6wBpzMBK2qWC8yQDAAGQttrxCwABHUAABwABHdGrAAEd0YLaFwADa5wA+Aj0XwABHj4LAAEeKwBpzMICWHMAAR52AwABHl8AacwSvRQEAASbAAEexARbAAEexgsAAR6zAGnMwErapYMAAS0gAwABkJLa8QsAAR8IAAcAAR+ZqwABH5mC2hcAA2vsAPgI9F8AASAaCwABIAcAaczCAlhzAAEgUgMAASA7AGnMEr0cBAAEmwABILQEWwABILYLAAEgowBpzMBK2qWC8yQDAAGREtrxCwABIPgABwABIYmrAAEhiYLaFwADbDwA+Aj0XwABIjYLAAEiIwBpzMICWHMAASJuAwABIlcAacwSvSQEAASbAAEi7ARbAAEi7gsAASLbAGnMwErapYLylAMAAZCq2vELAAEjMAAHAAEjwasAASPBgtoXAANshAD4CPRfAAEkagsAASRXAGnMwgJYcwABJKIDAAEkiwBpzBK9LAQABJsAASUcBFsAASUeCwABJQsAaczAStqlgvJEAwABkK7a8QsAASVgAAcAASXxqwABJfGC2hcAA2zUAPgI9F8AASaiCwABJo8AaczCAlhzAAEm2gMAASbDAGnMEr00BAAEmwABJ1wEWwABJ14LAAEnSwBpzMBK2qWC8twDAAGQptrxCwABJ6AABwABKDGrAAEoMYLaFwADbSQA+Aj0XwABKP4LAAEo6wBpzMICWHMAASk2AwABKR8AacwSvTwEAASbAAEp1ARbAAEp1gsAASnDAGnMwErapYLyxAMAAZCy2vELAAEqGAAHAAEqqasAASqpgtoXAANtbAD4CPRfAAErQgsAASsvAGnMwgJYcwABK3oDAAErYwBpzBK9RAQABFsAASvmCwABK9MAaczCXHraqAMAAZDa2vELAAEsJAAHAAEstasAASy1gtoXAANtvAD4CPRfAAEtXgsAAS1LAGnMwgJYcwABLZYDAAEtfwBpzBK9TAgACJsAAS4QBFsAAS4SCwABLf8AaczAStqlgwABLSBbAAEuPgsAAS4rAGnMwlx62qgDAAGQ3trxCwABLnwABwABLw2rAAEvDYLaFwADbgwA+Aj0XwABL2oLAAEvVwBpzMICWHMAAS+iAwABL4sAacwSvVQEAASbAAEv0ARbAAEv0gsAAS+/AGnMwErapYMAA/bYAwABkTLa8QsAATAUARsAATB7AAExXwABMNQAAAIJrYLbPABbAAExDLq8ptnw+AUFHwABMXxbAAExygsAATGfAGnrLgme20gYBwABMnWrAAEydYLa/wADblwA+Aj0XwABMyoLAAEy/wBp6y4CWJsAATMoBHMAATSIcwABM54DAAEzSwBpzBK9XAQABJsAATQ0BFsAATQ2CwABNAsAaessSttNgvJYAwABkQ69YAQABFsAATUOCwABNOMAaesulTsAAk7EAwACTumDAAJTjtuJCwABNYQABwABNi2rAAE2LYLa/wADbqAA+Aj0XwABNtoLAAE2rwBp6y4CWJsAATbYBHMAATgwcwABN04DAAE2+wBpzBK9aAQABJsAATfcBFsAATfeCwABN7MAaessSttNgvKUAwABkP69YAQABFsAATi2CwABOIsAaesulTsAAk7EAwACTumDAAJTjtuJCwABOSwABwABOdWrAAE51YLa/wADbuQA+Aj0XwABOn4LAAE6UwBp6y4CWJsAATp8BHMAATvQcwABOvIDAAE6nwBpzBK9cAQABJsAATt8BFsAATt+CwABO1MAaessSttNgvJEAwABkQa9YAQABFsAATxWCwABPCsAaesulTsAAk7EAwACTumDAAJTjtuJCwABPMwABwABPXWrAAE9dYLa/wADbygA+Aj0XwABPiYLAAE9+wBp6y4CWJsAAT4kBHMAAT+AcwABPpoDAAE+RwBpzBK9eAQABJsAAT8sBFsAAT8uCwABPwMAaessSttNgvLcAwABkPa9YAQABFsAAUAGCwABP9sAaesulTsAAk7EAwACTumDAAJTjtuJCwABQHwABwABQSWrAAFBJYLa/wADb2wA+Aj0XwABQaILAAFBdwBp6y4CWJsAAUGgBHMAAULkcwABQh4HAAFBwwBpzE69gAQABJsAAUKQBFsAAUKSCwABQmcAaessSttNgwABguwDAAFzEr1gBAAEWwABQ2oLAAFDPwBp6y6VOwACTsQDAAJO6YMAAlOO24kLAAFD4AAHAAFEiasAAUSJgtr/AANvtAD4CPRfAAFFNgsAAUULAGnrLgJYmwABRTQEcwABRqRzAAFFsgcAAUVXAGnMTr2IBAAEmwABRlAEWwABRlILAAFGJwBp6yxK202DAAP22AMAAXMOvWAEAARbAAFHKgsAAUb/AGnrLpU7AAJOxAMAAk7pgwACU47biQsAAUegABraCgKDAAFIEwABSF8AAU2YAACMBasAAUgVgwAD9HAIAAAEDwABSH8AAU2YAAAAAAAAAYMAA/bYBPghOwABSNcAAUjgAAIPkYMAA/gABH8AAUj7AAP4fAAAAAD0cwABSVYDAAFJSwBp+i4KKAQABJ69jAMAA/hQ9HMAAUnqAwABSd8AafouCigEAASMhHMAAUoUWwABSgC6Ck7Z5SAEAASsAwAD9KR7AAFKPwACSjgEAARbAAFKdLoKTtnkAJ69kAWDAAP22AMAA/hQ9HMAAUriAwABStcAafouCigEAASTAAFLPAyevZRbAAFLHLq8ntnongKcAwAD+FD0cwABS2YDAAFLWwBp+i4KKAQABJMAAUvwDJ69mFsAAUu4uryi2eyeApwDAAP4UPRzAAFMGgMAAUwPAGn6LgooBAAEkwABTNAInr2cWwABTIS6vKbZ8AMAA/hQ9HMAAUz6AwABTO8AafouCigEAASeDIQDAAP4USsAAU04BHMAAU1iAwABTVcAafosjAAAAAMAA/hkAABpw/gAacg4AGnLcABp+TwAaf90AAAAEAraFgKDAAFNrwABTcMAAVRsLr2gAAAFgwAD9HAAAFwS2h4CgwABTcMAAU3AJJwBgwAD70AAEtomAoMAAU3DAAFNwCSi1/ABgwAD9tgAEtoqAoMAAU3DAAFNwBikAXcAA/HQBYLaFAWoAXcAA/HQBYLaFwADb/AS2i4CgwABThMAAU4QGr2kAYLaFAWoAYLaFwADaJQS2jICgwABTkMAAU5AGrzIAYLaFAWoAYLaFwADaNgS2jYCgwABTo8AAU6MGhnQAYLaFAWoAYLaFwADaRwS2joCgwABTsMAAU7AGr2oAYLaFAWoAYLaFwADaWAS2j4CgwABTxsAAU8YGr2sAYLaFAWoAYLaFwADaaQS2kICgwABT18AAU9cGr2wAYLaFAWoAYLaFwADaewS2kYCgwABT6cAAU+kGrzsAYLaFAWoAYLaFwADajQS2koCgwABT98AAU/cGrz0AYLaFAWoAYLaFwADanwS2k4CgwABUCcAAVAkGhOQAYLaFAWoAYLaFwADasQS2lICgwABUGcAAVBkGr20AYLaFAWoAYLaFwADawwS2lYCgwABUK8AAVCsGr24AYLaFAWoAYLaFwADa1QS2loCgwABUPMAAVDwGoS4AYLaFAWoAYLaFwADa5wS2l4CgwABUSsAAVEoGr28AYLaFAWoAYLaFwADa+wS2mICgwABUXcAAVF0Gr0kAYLaFAWoAYLaFwADbDwS2mYCgwABUe8AAVHsGr0sAYLaFAWoAYLaFwADbIQS2moCgwABUmMAAVJgGr00AYLaFAWoAYLaFwADbNQS2m4CgwABUt8AAVLcGr08AYLaFAWoAYLaFwADbSQS2nICgwABU3cAAVN0Gr1EAYLaFAWoAYLaFwADbWwS2nYCgwABU9sAAVPYGr1MAYLaFAWoAYLaFwADbbwS2noCgwABVE8AAVRMGr1UAYLaFAWoAYLaFwADbgwEFtqKAoMAAU3DAAFNwwABVGwEAAAPAAFNwwABVGwAAAAICAsAAU3AAAAQnYMAA+9AAwABTcAAABChgwAD9tgAAYLaFAT8DCAC2h4AAwBqC6AgAtomBAMAagvYJAADAAP0yAAAAAAEGtqCAoMAAU3DAAFNwwABVGwAAIwAAAAEDwABTcMAAVRsAAAAAAAAAYMAA/bYBSgABDwAutokAABqDKwAag2EAAAABArajgKDAAFUewABVJMAAaakDr3AAAAFgwACU7QABYMAAY4sFBLalgKDAAFVzwABVhwaD5wBgwAD9tgFqwABVeWDAAP22wADcUQS2poCgwABVosAAVaYJgmcAYLaFAAS2qICgwABVssAAVbgYlwa1/ABgwACU7QErBLapgKDAAFXJwABVzQkSAGDAAP0cAAS2qoCgwABV6MAAVesJlx4AXcAA/WcBYLylAAEFtr6AoMAAVfDAAFXwwABWHQAAAAPAAFX7wABWHQAAAAMBAcAAVgEAAASCZ2C2hQACwABWDQAABBJgwAD9HAFqAGDAAPzZd8AAVhgAAASXHl3AAP1nAWC8pQFqAGDAAPzZd2C2owE/BAgBtqaAAMAahDsIAbapgQDAGoRJCAG2qoIAwBqEXwkBwABV8MAAlPcAAAAADQa2rICgwABWIsAAVirAAF2nBAGuzgAAAAEDwABWSMAAXacAAAABAQHAAFZUAAAAg0RgwABdKgAAYLajAT4HPRzAAFZpgMAAVmLAGoTVgpQBAAFqwABWb2DAAP22wADcUQDAAF0sTsAAVonAAFaOAACCZ2C2hQEcwABWl4DAAFaQwBqE1a9yAQFgtoUBasAAVrBdwAD8dAFgtoXAANv8AMAAXT9OwABWxAAAABJgwAD9HABOwABW3wAAAJceXcAA/WcBYLylAEFHwABW6IHAAFbwwBqFEwoBwABXE2rAAFcTYLaFwADaJQA+AULAAFclAALAAFdHasAAV0dgtoXAANshwABXfWrAAFd9YLaFwADaNgA+A07AAFebwABXrQAAr3NgwAD6CgEcwABXtoDAAFevwBqE1a7sAAAAAMAAXThJwABXyoTAAFfOwBqFwj4BPYrAAFftwBqFURzAAFf7gMAAV/TAGoTVmL8AAAAAwABdXD4BPYrAAFgjwBqFURzAAFgxgMAAWCrAGoTVmL4AAAAAwABdYELAAFhSAATAAFh0asAAWHRgtoXAANpHwABYmmrAAFiaYLaFwADajcAAWMFqwABYwWC2hcAA2rHAAFjqasAAWOpgtoXAANsPAD4CPYrAAFkOwBqFURzAAFkcgMAAWRXAGoTVmL8AAAAAwABdXELAAFkxAAfAAFlTasAAWVNgtoXAANpYwABZgmrAAFmCYLaFwADaacAAWaxqwABZrGC2hcAA2nvAAFnXasAAWddgtoXAANrVwABaAWrAAFoBYLaFwADaw8AAWixqwABaLGC2hcAA2vvAAFpYasAAWlhgtoXAANs1AD4CPYrAAFp9wBqFURzAAFqLgMAAWoTAGoTVqzIAAAAAwABdYULAAFqhAAHAAFrDasAAWsNgtoXAANqfAD4CPYrAAFrbwBqFURzAAFrpgMAAWuLAGoTVhwIAAAAAwABdVELAAFsBAAHAAFsjasAAWyNgtoXAANrnAD4CPYrAAFs3wBqFUR7AAFtHwABLfgEAAYDAAFtawBqE1QBCwABbawABwABbjWrAAFuNYLaFwADbSQA+Aj2KwABbucAahVEcwABbx4DAAFvAwBqE1a90AAAAAMAAXWVCwABb4wABwABcBWrAAFwFYLaFwADbWwA+Aj2LwABcJMAahWAcwABcPxzAAFwxgMAAXCrAGoTVrusAAWC8pQAAwABdXpUTAAAAAMAA/ElCwABcUAABwABccmrAAFxyYLaFwADbbwA+Az2KwABclcAahVEewABcpcAAS34BAAGAwABcuMAahNUAPYvAAFzJwBqFYBzAAFzkHMAAXNaAwABcz8AahNWu6wABYLylAADAAF1elRMAAAAAwAD8SULAAFz1AAHAAF0XasAAXRdgtoXAANuDAD4CPYrAAF0nwBqFURzAAF01gMAAXS7AGoTVr3UAAAAAwABdO0LAAF1LAD0cwABdY4DAAF1cwBqE1YKMAQABasAAXWdgwAD9tsAA3FEAwABdLUrAAF1xAR/AAF18tr4DAAGBwABdiMAahRMCEoLAAF2UwBqFUZceg8AAXZ/AGoVgBraugKDAAF2swABdscAAZLUAAK7PAAAAAQPAAF3AwABktQAAAAEBAcAAXcoAAACEO2DAAFzbAABcAT4EPRzAAF3bgMAAXdbAGol4gpQBAAFqwABd4WDAAP22wADcUQDAAFzgPRzAAF3wgMAAXevAGol4r3YBAAEWwABd+i6CZ7amAMAAXOxBR8AAXgUWwABeDS6CZ7amCgHAAF4wasAAXjBgtoXAANolAD4BQsAAXkIAAsAAXmRqwABeZGC2hcAA2yHAAF6aasAAXppgtoXAANo2AD4DPRzAAF64gMAAXrPAGol4rvMBAAElwABexxbAAF7CLhK2qWC8pQDAAFzlScAAXuAlwABe6RbAAF7kLhK2qWC8pT4BPRzAAF8KgMAAXwXAGol4r3cBAAEmwABfFQEWwABfFS4StqlgwACONgDAAF0JPgE9HMAAXzyAwABfN8AaiXiveAEAASbAAF9JARbAAF9JLhK2qWDAAI5QAMAAXQ1CwABfYgAEwABfhGrAAF+EYLaFwADaR8AAX6pqwABfqmC2hcAA2o3AAF/RasAAX9FgtoXAANqxwABf+mrAAF/6YLaFwADbDwA+Aj0cwABgI4DAAGAewBqJeK93AQABJsAAYC4BFsAAYC4uErapYMAAjjYAwABdCULAAGA9AAfAAGBfasAAYF9gtoXAANpYwABgjmrAAGCOYLaFwADaacAAYLhqwABguGC2hcAA2nvAAGDjasAAYONgtoXAANrVwABhDWrAAGENYLaFwADaw8AAYThqwABhOGC2hcAA2vvAAGFkasAAYWRgtoXAANs1AD4CPRzAAGGOgMAAYYnAGol4qyMBAAEmwABhmgEWwABhmi4StqlgwACOPADAAF0OQsAAYakAAcAAYctqwABhy2C2hcAA2p8APgI9HMAAYeiAwABh48AaiXiG8gEAASbAAGH2ARbAAGH2LhK2qWDAAGJPAMAAXQFCwABiBQABwABiJ2rAAGInYLaFwADa5wA+A07AAGJEwABiTQAApN5gwABLSAEmwABiRAEWwABiTy4StqlgwABLSD0cwABiZoHAAGJdwBqMQ67PAQABgMAAYnbAGol4AMAAS2RCwABihQABwABip2rAAGKnYLaFwADbSQA+A07AAGLmwABi8wAArYtgvLEBJsAAYuYBFsAAYvUuErapYLyxPRzAAGMIgMAAYwPAGol4r3kBAAEmwABjGgGBwABjGsAajKZgwACOSwDAAF0SQsAAYzEAAcAAY1NqwABjU2C2hcAA21sAPgI9HMAAY3eAwABjcsAaiXiu8gEAARbAAGOELpcetqoAwABdC0LAAGOSAAHAAGO0asAAY7RgtoXAANtvAD4ETsAAY+DAAGPpAACk3mDAAEtIASbAAGPgARbAAGPrLhK2qWDAAEtIPRzAAGQCgcAAY/nAGo1Nrs8BAAGAwABkEsAaiXgAwABLZD0cwABkJoDAAGQhwBqJeK7yAQABFsAAZDMulx62qgDAAF0LQsAAZEEAAcAAZGNqwABkY2C2hcAA24MAPgI9HMAAZHiAwABkc8AaiXiBuQEAASbAAGSEARbAAGSELhK2qWDAAP22AMAAXOhCwABkkwA9HMAAZKmAwABkpMAaiXiCjAEAAWrAAGStYMAA/bbAANxRAMAAXOEGtrWAoMAAZLrAAGTGwABlGgEAgJYAAAABA8AAZMzAAGUaAAAAAAAAAGDAAJTtAT4CQCEcwABk4BbAAGTZLpcGtfy2qEgBAAErAMAA/SnAAGTZwABk5wEkwABlAgInr3ouSsAAZQkBFsAAZRAulwa1/LaoBra8gKDAAGUfwABlKMAAZbICAICWAAAAAQPAAGUtwABlsgAAAAEBAcAAZTYAAACD7mDAAJTtAABcAT4DQBzAAGVQFsAAZUkulwa1/LaoSAEAASsAwAD9KcAAZUnAAGVXAEAhHMAAZWqAwABlZcAajsdIAQABKwDAAP0pwABlZcAAZXEAPRfAAGV4LpcGtfwmwABleAEcwABlhoDAAGWBwBqOx69YAQABFsAAZZwupU7AAJOxAMAAk7pgwACU7baoBra2gKDAAGW3wABlzsAAZgkBAIPRAWrAAGW4YMAA/RwCAAABA8AAZdLAAGYJAAAAAAAAAGDAAP22AT4CQCEcwABl5hbAAGXfLpcGtfy2qEgBAAErAMAA/SnAAGXfwABl7QBKwABl9AEWwABmAhbAAGX7LpcGtfy2qIPRwACU9Aa2t4CgwABmDsAAZiXAAGZ9AQCAvQFqwABmD2DAAP0cAgAAAQPAAGYqwABmfQAAAAAAAABgwAD9tgE+AkAhHMAAZj4WwABmNy6XBrX8tqhIAQABKwDAAP0pwABmN8AAZkUBJMAAZmACJ696LkrAAGZnARbAAGZ1FsAAZm4ulwa1/LaogL3AAJWjBra4gKDAAGaCwABml8AAZv0BAK97AWrAAGaDYMAA/RwCAAABA8AAZqPAAGb9AAAAAAAAAGDAAPoKAT4CQCEcwABmtxbAAGawLpcGtfy2qEgBAAErAMAA/SnAAGawwABmvgEkwABm2QInr3ouSsAAZuABFsAAZu4WwABm5y6XBrX8tqive8AAlPUGtq+AoMAAZwLAAGcSwABnigAAgksBasAAZwNgwAD9HAIAAAEDwABnG8AAZ4oAAAABAQHAAGckAAAgg9ZgwACU7QAAYMAA+9ABPgJAIRzAAGc/FsAAZzgulwa1/LaoSAEAASsAwAD9KcAAZzjAAGdGASTAAGdhAievei5KwABnaAEcwABndhbAAGdvLpcGtfy2qIJLAQABgMAAZ4DAGpEjAMAA+hgGtrmAoMAAZ4/AAGexwABn9QEAr3wBasAAZ5BgwAD9HAIAAAEDwABnwMAAZ/UAAAAAAAAAXcAA/DIBYMAAk6wBPgFKwABnxgEjIRzAAGfUFsAAZ80ulwa1/LaoSAEAASsAwAD9KTHAAGfeYMAAk6wBFsAAZ98ulwa1/LaoasAAZ+ldwAD8dAFgwACTrMAA3FQBXcAA/HQBYMAAk6wGtrqAoMAAZ/rAAGgOwABoXQEAg8EBasAAZ/tgwAD9HAIAAAEDwABoF8AAaF0AAAAAAAAAYMAA+9ABPgFKwABoHQEewABoLIH0AgFgvKUCFsAAaDQulx62qh7AAGhBgfICAAIWwABoTS6CZ7amFsAAaFMuErapAAAGtrCAoMAAaGLAAGh8wABpQAMASAFqwABoY2DAAP0cAgAAAQPAAGh+wABpQAAAAAEBAcAAaIYAAACD1mDAAP0cAABgwAD6CgE+AknAAGiTHsAAaJfAAPWxAgACLoDAAGinwBqS2wBKwABorwEpP0rAAGjAASIiIiXAAGjNgMAAaMfAGpLbYLajABzAAGjsFsAAaOcugme2pkgBAAEWwABo9RTAAGjvwBqS2wABYLajgme2pgDAAP0pABzAAGkKFsAAaQUuErapSAEAARbAAGkTFMAAaQ3AGpLbAAFgtqMStqkAwAD9KQAewABpI4HlAgFgvKUCFsAAaS0ulx62qhbAAGk4FMAAaTLAGpLbAAFgtqOXHraqAAa2sYCgwABpRcAAaVjAAGmnAAAjAWrAAGlGYMAA/RwCAAABA8AAaWDAAGmnAAAAAAAAAGDAAP22AUrAAGlsASTAAGmnByevfRbAAGl/LoJntqYnr34WwABpiy4Stqknr381AAAAAQBgwACU7QEWwABpmS6XBrX8tqgjHMAAaaGAAMAalCFIAQABKwAAKxbAAGmhgADAGpQhg9HAAJT0AWDAAP22J4MhBrazgKHAAH3GwAB9y8AAfdMAgK+AwACSewAAAAEDwAB90cAAfdMAAAAAAAAAYMAAlO0BSsAAfcsBJsAAfcsBHMAAfcsunO0BAAEfAMAA+H8FAAVqwAB9y2DAAP4owADcW5NqAF3AAPx0AWDAAP40wACTXGoAXcAA/HQBW4JiHsAAfcvAAPyvAQJgwAD+KFsBagBdwAD8pQJgwAD+KFvAAJNjAAAAwAD9K2DAAJTtAAAahK0AGolQABqOLAAajp8AGo9fABqP3gAakGcAGpDwABqRlQAakjEAGpKpABqTvwAalGYAGpUUAAAADQK2v4CgwABprMAAabHAAGpPC6+BAAABYMAA/RwAAAkEtsGAoMAAabHAAGmxCScAYMAA+9AABLbDgKDAAGmxwABpsQkotfwAYMAA/bYABLbEgKDAAGmxwABpsQYpAF3AAPx0AWC2vwFqAF3AAPx0AWC2v8AA3GAEtsWAoMAAacvAAGnLBq+CAGC2vwFqAGC2v8AA25cEtsaAoMAAaeXAAGnlBq+DAGC2vwFqAGC2v8AA26gEtseAoMAAaf3AAGn9Bq+EAGC2vwFqAGC2v8AA27kEtsiAoMAAahTAAGoUBq+FAGC2vwFqAGC2v8AA28oEtsmAoMAAai3AAGotBoX/AGC2vwFqAGC2v8AA29sEtsqAoMAAajnAAGo5Bq+GAGC2vwFqAGC2v8AA2+0BBbbOgKDAAGmxwABpscAAak8BAAADwABpscAAak8AAAACAgLAAGmxAAAEJ2DAAPvQAMAAabEAAAQoYMAA/bYAAGC2vwE/AwgAtsGAAMAalp8IALbDgQDAGpatCQAAwAD9MgAAAAABBrbMgKDAAGmxwABpscAAak8AACMAAAABA8AAabHAAGpPAAAAAAAAAGDAAP22AUoAAQ8ALrbDAAAaluIAGpcYAAAAAQK2z4CgwABqUsAAaljAAHcJA6+HAAABYMAAlisAAWDAAGOLBAS20YCgwABqv8AAatkGg+cAYMAA/bYBasAAasVgwAD9tsAA3H0EttKAoMAAavrAAGr+CYJnAGC2vwAEttOAoMAAaw/AAGsTCRIAYMAA/RwABLbVgKDAAGslwABrKxiXBrX8AGDAAJTjASsBBbbkgKDAAGswwABrMMAAa1cAAAADwABrQcAAa1cAAAACAgLAAGtHAAAEgmdgtr8AwABrUgAABBJgwAD9HAAAYLbPAT8DCAG20oAAwBqX1wgBttOBAMAal+QJAcAAazDAAJYyAAAAAAkGtteAoMAAa1zAAGtkwABvgQQBrs4AAAABA8AAa4jAAG+BAAAAAQEBwABrlAAAAINEYMAAXSoAAGC2zwE+Bj0cwABrqYDAAGuiwBqYRIKUAQABasAAa69gwAD9tsAA3H0AwABdLE7AAGvPwABr1AAAgmdgtr8BHMAAa92AwABr1sAamESvcgEBYLa/AWrAAGv8XcAA/HQBYLa/wADcYADAAF0/TsAAbBAAAAASYMAA/RwAQUfAAGwagcAAbCLAGpiCBgHAAGxLasAAbEtgtr/AANuXAD4CPYrAAGxrwBqYwBzAAGx5gMAAbHLAGphEmKwAAAAAwABdWULAAGyQAAHAAGy4asAAbLhgtr/AANuoAD4CPYrAAGzWwBqYwBzAAGzkgMAAbN3AGphEmL8AAAAAwABdXELAAGz5AAHAAG0hasAAbSFgtr/AANu5AD4DTsAAbUPAAG1VAACvc2DAAPoKARzAAG1egMAAbVfAGphEruwAAAAAwABdOEnAAG1yg8AAbXbAGplrPgE9isAAbZXAGpjAHMAAbaOAwABtnMAamESYvwAAAADAAF1cPgE9isAAbcvAGpjAHMAAbdmAwABt0sAamESYvgAAAADAAF1gQsAAbfoAAcAAbiJqwABuImC2v8AA28oAPgI9isAAbkHAGpjAHMAAbk+AwABuSMAamESrMgAAAADAAF1hQsAAbmUAAcAAbo1qwABujWC2v8AA29sAPgI9isAAbp/AGpjAHMAAbq2AwABupsAamESviQAAAADAAF1qQsAAbsUAAcAAbu1qwABu7WC2v8AA2+0APgI9isAAbwvAGpjAHMAAbxmAwABvEsAamESvdQAAAADAAF07QsAAby8APRzAAG9HgMAAb0DAGphEgowBAAFqwABvS2DAAP22wADcfQDAAF0tSsAAb1UBH8AAb2C25AIAAoHAAG9ywBqYgoLAAG94wBqYwAAGttmAoMAAb4bAAG+LwABy9QAArs8AAAABA8AAb5rAAHL1AAAAAQEBwABvpAAAAIQ7YMAAXNsAAFwBPgQ9HMAAb7WAwABvsMAamxeClAEAAWrAAG+7YMAA/bbAANx9AMAAXOA9HMAAb8qAwABvxcAamxevdgEAARbAAG/ULoJnttIAwABc7EFHwABv3xbAAG/nLoJnttIGAcAAcBBqwABwEGC2v8AA25cAPgI9HMAAcDWAwABwMMAamxevigEAASbAAHBCARbAAHBCLhK202DAAI4wAMAAXQZCwABwUQABwABweWrAAHB5YLa/wADbqAA+Aj0cwABwnIDAAHCXwBqbF693AQABJsAAcKcBFsAAcKcuErbTYMAAjjYAwABdCULAAHC2AAHAAHDeasAAcN5gtr/AANu5AD4DPRzAAHEAgMAAcPvAGpsXrvMBAAElwABxDxbAAHEKLhK202C8pQDAAFzlScAAcSglwABxMRbAAHEsLhK202C8pT4BPRzAAHFSgMAAcU3AGpsXr3cBAAEmwABxXQEWwABxXS4SttNgwACONgDAAF0JPgE9HMAAcYSAwABxf8AamxeveAEAASbAAHGRARbAAHGRLhK202DAAI5QAMAAXQ1CwABxqgABwABx0mrAAHHSYLa/wADbygA+Aj0cwABx9oDAAHHxwBqbF6sjAQABJsAAcgIBFsAAcgIuErbTYMAAjjwAwABdDkLAAHIRAAHAAHI5asAAcjlgtr/AANvbAD4CPRzAAHJQgMAAckvAGpsXr4sBAAEmwAByXgEWwAByXi4S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r88AYLblAWoAYLblwADc6wS28oCgwAB3h8AAd4cGr9AAYLblAWoAYLblwADc/QS284CgwAB3lsAAd5YGr9EAYLblAWoAYLblwADdDwS29ICgwAB3pcAAd6UGr9IAYLblAWoAYLblwADdIQS29YCgwAB3ssAAd7IGr9MAYLblAWoAYLblwADdMwS29oCgwAB3xsAAd8YGr9QAYLblAWoAYLblwADdRQS294CgwAB33cAAd90GoSAAYLblAWoAYLblwADdWQS2+ICgwAB37MAAd+wGr9UAYLblAWoAYLblwADdbQS2+YCgwAB3/cAAd/0GobUAYLblAWoAYLblwADdfwS2+oCgwAB4DsAAeA4Gr9YAYLblAWoAYLblwADdkwS2+4CgwAB4J8AAeCcGoj0AYLblAWoAYLblwADdpwS2/ICgwAB4NsAAeDYGr9cAYLblAWoAYLblwADduQS2/YCgwAB4S8AAeEsGgmoAYLblAWoAYLblwADdzQS2/oCgwAB4V8AAeFcGr9gAYLblAWoAYLblwADd4QS2/4CgwAB4aMAAeGgGr9kAYLblAWoAYLblwADd9QS3AICgwAB4csAAeHIGgO0AYLblAWoAYLblwADeCQS3AYCgwAB4f8AAeH8Gr9oAYLblAWoAYLblwADeHQS3AoCgwAB4lsAAeJYGoXoAYLblAWoAYLblwADeMQS3A4CgwAB4qMAAeKgGr9sAYLblAWoAYLblwADeRQS3BICgwAB4t8AAeLcGr9wAYLblAWoAYLblwADeWQS3BYCgwAB4wsAAeMIGgyQAYLblAWoAYLblwADebQS3BoCgwAB4zMAAeMwGgnQAYLblAWoAYLblwADegQS3B4CgwAB41sAAeNYGr90AYLblAWoAYLblwADelQS3CICgwAB46MAAeOgGr94AYLblAWoAYLblwADeqQS3CYCgwAB4+cAAePkGrGUAYLblAWoAYLblwADeuwS3CoCgwAB5CMAAeQgGr98AYLblAWoAYLblwADezwS3C4CgwAB5IsAAeSIGr+AAYLblAWoAYLblwADe4wS3DICgwAB5MMAAeTAGr+EAYLblAWoAYLblwADe9QS3DYCgwAB5S8AAeUsGr+IAYLblAWoAYLblwADfCQS3DoCgwAB5YMAAeWAGr+MAYLblAWoAYLblwADfGwS3D4CgwAB5bcAAeW0Gr+QAYLblAWoAYLblwADfLwS3EICgwAB5gcAAeYEGrXcAYLblAWoAYLblwADfQQS3EYCgwAB5lcAAeZUGr+UAYLblAWoAYLblwADfVQS3EoCgwAB5rMAAeawGr+YAYLblAWoAYLblwADfaQS3E4CgwAB5vcAAeb0GqAQAYLblAWoAYLblwADffQS3FICgwAB5y8AAecsGr+cAYLblAWoAYLblwADfkQS3FYCgwAB53sAAed4GoqoAYLblAWoAYLblwADfowS3FoCgwAB57cAAee0GorMAYLblAWoAYLblwADftwS3F4CgwAB5/cAAef0Gr+gAYLblAWoAYLblwADfywS3GICgwAB6D8AAeg8Goc8AYLblAWoAYLblwADf3wS3GYCgwAB6IsAAeiIGo2oAYLblAWoAYLblwADf8QS3GoCgwAB6NMAAejQGo3QAYLblAWoAYLblwADgAwS3G4CgwAB6ScAAekkGoxAAYLblAWoAYLblwADgFwS3HICgwAB6WMAAelgGozYAYLblAWoAYLblwADgKQS3HYCgwAB6asAAemoGr+kAYLblAWoAYLblwADgOwS3HoCgwAB6fMAAenwGoh0AYLblAWoAYLblwADgTQS3H4CgwAB6jMAAeowGodoAYLblAWoAYLblwADgXwS3IICgwAB6m8AAepsGozgAYLblAWoAYLblwADgcQS3IYCgwAB6rcAAeq0GoSoAYLblAWoAYLblwADggwS3IoCgwAB6xMAAesQGmfcAYLblAWoAYLblwADglQS3I4CgwAB6zcAAes0Gr+oAYLblAWoAYLblwADgpwEFtyeAoMAAdxHAAHcRwAB61gEAAAPAAHcRwAB61gAAAAICAsAAdxEAAAQnYMAA+9AAwAB3EQAABChgwAD9tgAAYLblAT8DCAC254AAwBqqYAgAtumBAMAaqm4JAADAAP0yAAAAAAEGtyWAoMAAdxHAAHcRwAB61gAAIwAAAAEDwAB3EcAAetYAAAAAAAAAYMAA/bYBSgABDwAutukAABqqowAaqtkAAAABArcogKDAAHsowAB7LsAAiCoDr+sAAAFgwAD9HAAAOgS3KoCgwAB7UcAAe2AGg+cAYMAA/bYBasAAe1dgwAD9tsAA4aEEtyuAoMAAe3jAAHuOBpxwAGDAAP22AWrAAHuCYMAA/bbAAOGkBLcsgKDAAHum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GvvSH8AAz9XAAJdQAQABHMAAz+cWwADP4C6DRLeyr3UAAAAAwABdOwA9HMAA0AUWwADP/i6DRLeygowBAAFqwADQFGDAAP22wADhpADAAF0tQsAA0CYAAcAA0ENqwADQQ2C25cAA3JQAPgQ9HMAA0FkWwADQUi6DRLeygpQBAAFqwADQamDAAP22wADhpwDAAF0sPYrAANB6wBr70h/AANCFwACXRAEAARzAANCOLp5rAAFgwACU4wAAt7cAPRzAANCmFsAA0J8ug0S3soKMAQABasAA0LVgwAD9tsAA4acAwABdLULAANDFAAHAANDiasAA0OJgtuXAANylAD4EPRzAANEAFsAA0Pkug0S3soKUAQABasAA0RFgwAD9tsAA4aoAwABdLD2KwADRKcAa+9IfwADRNMAAlzYBAAEcwADRTBbAANFFLoNEt7KvdQAAAADAAF07AD0cwADRahbAANFjLoNEt7KCjAEAAWrAANF5YMAA/bbAAOGqAMAAXS1CwADRkQABwADRrmrAANGuYLblwADctgA+Bj0cwADRxxbAANHALoNEt7KClAEAAWrAANHYYMAA/bbAAOGtAMAAXSxOwADR+cAA0f4AAIC9YMAAlOMBHMAA0gAunmsAAWDAAJTjAAC3t07AANIewADSJAAAgJZgwACU4wEcwADSJi6eawABYMAAlOMAALe3PYrAANI2wBr70h/AANJBwACWpAIAAoPAANJNwBr99oTAANJTwBr+HAA9HMAA0moWwADSYy6DRLeygowBAAFqwADSeWDAAP22wADhrQDAAF0tQsAA0owAAcAA0qlqwADSqWC25cAA3McAPgY9HMAA0ssWwADSxC6DRLeygpQBAAFqwADS3GDAAP22wADhsADAAF0sTsAA0wrAANMVAACwOl3AAPx0AWDAAJaYARzAANMXLq7oAAFgwACWmAAAt7hOwADTMMAA0zsAALA7YMAA+goBHMAA00QWwADTPS6DRLeyruwAAAAAwABdOD2KwADTWMAa+9IfwADTY8AAlpcCAAGDwADTeMAa/tUBsDuEwADTkMAa/wE9HMAA06wWwADTpS6DRLeygowBAAFqwADTu2DAAP22wADhsADAAF0tQsAA09cAAcAA0/RqwADT9GC25cAA3NkAPgQ9HMAA1A4WwADUBy6DRLeygpQBAAFqwADUH2DAAP22wADhswDAAF0sPYrAANQzwBr70h/AANQ+wACWiAAAAAA9HMAA1F0WwADUVi6DRLeygowBAAFqwADUbGDAAP22wADhswDAAF0tQsAA1IAAAcAA1J1qwADUnWC25cAA3OsAPgU9HMAA1L4WwADUty6DRLeygpQBAAFqwADUz2DAAP22wADhtgDAAF0sTsAA1P7AANUHAACIP13AAPx0AWDAAJTjARzAANUJLq7oAAFgwACU4wAAt7g9isAA1R3AGvvSH8AA1SjAAJZ8AQABg8AA1TzAGwBDAD0cwADVVhbAANVPLoNEt7KCjAEAAWrAANVlYMAA/bbAAOG2AMAAXS1CwADVgAABwADVnWrAANWdYLblwADc/QA+BD0cwADVuRbAANWyLoNEt7KClAEAAWrAANXKYMAA/bbAAOG5AMAAXSw9isAA1eDAGvvSH8AA1evAAJUuAQABHMAA1founmsAAWDAAJTjAAC3twA9HMAA1hIWwADWCy6DRLeygowBAAFqwADWIWDAAP22wADhuQDAAF0tQsAA1jcAAcAA1lRqwADWVGC25cAA3Q8APgY9HMAA1nAWwADWaS6DRLeygpQBAAFqwADWgWDAAP22wADhvADAAF0sTsAA1qPAANavAACv0WC2owEewADWvbasAQABFsAA1tAug0S3sgA9HMAA1u4WwADW4S6vKLezVgEAAYPAANbywBsBjQDAAPyFPYrAANcIwBr70oPAANcPwBsBjT0cwADXKxbAANckLoNEt7KCjAEAAWrAANc6YMAA/bbAAOG8AMAAXS1CwADXUAABwADXbWrAANdtYLblwADdIQA+Bj0cwADXhxbAANeALoNEt7KClAEAAWrAANeYYMAA/bbAAOG/AMAAXSxOwADXtMAA17sAAIMkYMAAlO0BHMAA170unmsAAWDAAJTtAAC3t07AANfVwADX2gAAllFgwACU7QEcwADX3C6eawABYMAAlO0AALe3PYrAANfswBr70h/AANf3wABmSgIAAoPAANgBwBsCUoTAANgJwBsCeAA9HMAA2B8WwADYGC6DRLeygowBAAFqwADYLmDAAP22wADhvwDAAF0tQsAA2EIAAcAA2F9qwADYX2C25cAA3TMAPgQ9HMAA2IAWwADYeS6DRLeygpQBAAFqwADYkWDAAP22wADhwgDAAF0sPYrAANiswBr70h/AANi3wABmHgEAARzAANjPFsAA2Mgug0S3sq91AAAAAMAAXTsAPRzAANjtFsAA2OYug0S3soKMAQABasAA2PxgwAD9tsAA4cIAwABdLULAANkXAAHAANk0asAA2TRgtuXAAN1FAD4FPRzAANlYFsAA2VEug0S3soKUAQABasAA2WlgwAD9tsAA4cUAwABdLE7AANmYwADZngAAhH9dwAD8dAFgwACWMwEcwADZoC6u6AABYMAAljMAALe4PYrAANm0wBr70h/AANm/wACWYgEAAYPAANnWwBsDywA9HMAA2e0WwADZ5i6DRLeygowBAAFqwADZ/GDAAP22wADhxQDAAF0tQsAA2hoAAcAA2jdqwADaN2C25cAA3VkAPgQ9HMAA2lMWwADaTC6DRLeygpQBAAFqwADaZGDAAP22wADhyADAAF0sPYrAANp6wBr70h/AANqFwACWTAAAAAA9HMAA2qYWwADany6DRLeygowBAAFqwADatWDAAP22wADhyADAAF0tQsAA2ssAAcAA2uhqwADa6GC25cAA3W0APgQ9HMAA2wYWwADa/y6DRLeygpQBAAFqwADbF2DAAP22wADhywDAAF0sPYrAANsvwBr70h/AANs6wACWbgEAARzAANtSFsAA20sug0S3sq91AAAAAMAAXTsAPRzAANtwFsAA22kug0S3soKMAQABasAA239gwAD9tsAA4csAwABdLULAANuXAAHAANu0asAA27RgtuXAAN1/AD4EPRzAANvSFsAA28sug0S3soKUAQABasAA2+NgwAD9tsAA4c4AwABdLD2KwADb+8Aa+9IfwADcBsAAllYBAAEcwADcHhbAANwXLoNEt7KvdQAAAADAAF07AD0cwADcPBbAANw1LoNEt7KCjAEAAWrAANxLYMAA/bbAAOHOAMAAXS1CwADcYwABwADcgGrAANyAYLblwADdkwA+BT0cwADcphbAANyfLoNEt7KClAEAAWrAANy3YMAA/bbAAOHRAMAAXSxOwADc38AA3OQAAIC9YMAAlO0BHMAA3OYunmsAAWDAAJTtAAC3tz2KwADc9sAa+9IfwADdAcAAlQEBAAGDwADdGsAbBjYAPRzAAN0wFsAA3Skug0S3soKMAQABasAA3T9gwAD9tsAA4dEAwABdLULAAN1fAAHAAN18asAA3XxgtuXAAN2nAD4EPRzA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wLgvAGC8pQErBLlpgKTAAH4dwAB+MxixwbgvAGC85AErBLlqgKTAAH5JwAB+ZBixwrgvAGC85AErBLlrgKTAAH53wAB+jhixw7gvAGC8zAErBLlsgKTAAH6hwAB+vRixxLgvAGC8zAErBLltgKTAAILPwACC4hixxbgvAGC8zAErBLlugKTAAIyewACMthixxrgvAGC8zAErBLlvgKTAAI1cwACNdxixx7gvAGC8zAErBLlwgKTAAI4wwACOURixyLgvAGC8zAErBLlxgKTAAJAKwACQHRixybgvAGC8pQErBLlygKTAAJCnwACQtRixyrgvAGC8pQErBLlzgKTAAJEywACRPxixy7gvAGC8pQErBLl0gKTAAJG5wACRxxixzLgvAGC8pQErBLl1gKTAAJJEwACSTxixzbgvAGC8pQErBLl2gKTAAJK9wACSyxixzrgvAGC8pQErBLl3gKTAAJNIwACTVBixz7gvAGC8pQErBLl4gKTAAJPLwACT1xix0LgvAGC8pQErBLl5gKTAAJROwACUaxix0bgvAGC8pQErBLl6gKTAAJUdwACVPBix0rgvAGC8pQErBLl7gKTAAJX0wACWDhix07gvAGC8pQErBLl8gKTAAJatwACWxRix1LgvAGC8pQErBLl9gKTAAJdewACXbxix1bgvAGC8pQErBLl+gKTAAJf1wACYDRix1rgvAGC8pQErBLl/gKTAAJiowACYvBix17gvAGC8pQErBLmAgKTAAJlLwACZXRix2LgvAGC8pQErBLmBgKTAAJnmwACZ/Rix2bgvAGC8pQErBLmCgKTAAJqVwACarhix2rgvAGC8pQErBLmDgKTAAJtMwACbXxix27gvAGC8pQErBLmEgKTAAJvrwACb+Rix3LgvAGC8pQErBLmFgKTAAJx2wACchBix3bgvAGC8pQErBLmGgKTAAJ3ewACd+Rix3rgvAGC8zAErBLmHgKTAAJ9KwACfYhix37gvAGC85AErBLmIgKTAAKABwACgExix4LgvAGC8zAErBLmJgKTAAKCowACgsxix4bgvAGC8zAErBLmKgKTAAKT2wAClBBix4rgvAGC8zAErBLmLgKTAAKWNwAClnhix47gvAGC8zAErBLmMgKTAAKYwwACmRBix5LgvAGC8zAErBLmNgKTAAKbSwACm3xix5bgvAGC8pQErBLmOgKTAAKdzwACnhRix5rgvAGC8pQErBLmPgKTAAKi4wACoyRix57gvAGC8pQErBLmQgKTAAKscwACrKRix6LgvAGC8pQErBLmRgKTAAKuXwACrqRix6bgvAGC8pQErBLmSgKTAAKwswACsPRix6rgvAGC8pQErBLmTgKTAAK0DwACtGBix67gvAGC8pQErBLmUgKTAAK4dwACuMhix7LgvAGC8pQErBLmVgKTAAK6vwACuwRix7bgvAGC8pQErBLmWgKTAAK9EwACvUBicAbgvAGC8pQErBLmXgKTAAK/IwACv3Rix7rgvAGC8yQErBLmYgKTAALBrwACwgxix77gvAGC8yQErBLmZgKTAALEawACxMhix8LgvAGC8pQErBLmagKTAALHIwACx5Rix8bgvAGC8twErBLmbgKTAALKjwACyvxix8rgvAGC8pQErBLmcgKTAALbgwAC29hix87gvAGC8pQErBLmdgKTAALeBwAC3mRix9LgvAGC85AErBLmegKTAALg+wAC4SRix9bgvAGC8zAErBLmfgKTAALjFwAC40Rix9rgvAGC8zAErBLmggKTAALlQwAC5XRix97gvAGC8zAErBLmhgKTAALnfwAC59xix+LgvAGC8zAErBLmigKTAALqUwAC6sBix+bgvAGC8zAErBLmjgKTAALtjwAC7ehix+rgvAGC8zAErBLmkgKTAAMFbwADBghix+7gvAGC8zAErBLmlgKTAANhFwADYThix/LgvAGC8zAErBLmmgKTAANi7wADYyBix/bgvAGC8zAErBLmngKTAANlHwADZWBix/rgvAGC8zAErBLmogKTAANnewADZ7Rix/7gvAGC8zAErBLmpgKTAANtcwADbZxiyALgvAGC8yQErBLmqgKTAANvPwADb2hiyAbgvAGC8yQErBLmrgKTAANxCwADcUBiyArgvAGC8yQErBLmsgKTAANzKwADc2BiyA7gvAGC8zAErBLmtgKTAAN1hwADdbxiyBLgvAGC8zAErBLmugKTAAN34wADeChiyBbgvAGC8zAErBLmvgKTAAN6iwADevhiyBrgvAGC8zAErBLmwgKTAAN91wADfkhiyB7gvAGC8zAErBLmxgKTAAOBMwADgaxiyCLgvAGC8zAErBLmygKTAAObcwADm9hiyCbgvAGC8pQErBLmzgKTAAOeOwADnoBiyCrgvAGC8pQErBLm0gKTAAOmUwADprhiyC7gvAGC8yQErBLm1gKTAAOp0wADqjxiyDLgvAGC85AErBLm2gKTAAOuQwADrpRiyDbgvAGC8pQErBLm3gKTAAOx6wADskhiyDrgvAGC8pQErBLm4gKTAAO2hwADtrxiyD7gvAGC8pQErBLm5gKTAAO5qwADueBiyELgvAGC8pQErBLm6gKTAAO8swADvShiyEbgvAGDAAPoKASoEubuApMAA71rAAO9sGLISuC8AYLylASsEubyApMAA73zAAO+PGLITuC8AYLylASsBBbrYgKTAAEgTwABIE8AASD8AAAADwABIJcAASD8AAAACAgLAAEgrAAAEsaxgutkAwABINgAABLGtYIEUAABguT0BPwMIAblAgADAG3TDCAG5QYEAwBt00AkBwABIE8AA/TIAAAAAgRYGub6ApMAASGDAAEh8wABIwwEAmsQBasAASGFgwAD9HAIAAAEDwABIiMAASMMAAAAAAAAAYLylAUrAAEiRATUAAAABAGC8pQEWwABIkS6b07gvuUIjHMAASJ6AAMAbdUdIAQABKwDAAP0pF8AASJEum9O4LxzAAEiiLrIUuC8CAAIWwABIrS6cKrnRJ5vAALqfuUKAAMAbdUcBYLylBrm/gKTAAEjiwABI/sAASTkBAJrGAWrAAEjjYMAA/RwCAAABA8AASQjAAEk5AAAAAAAAAGC8pQFKwABJCwE1AAAAAQBgvKUBFsAASQsum9W4L7lDIxzAAEkWgADAG3XkSAEAASsAwAD9KRfAAEkLLpvVuC8cwABJGi6yFLgvAgACFsAASSUunCq50SebwgC6n7lDgADAG3XkAWC8pQa5wICkwABJV8AASXPAAEmrAQCayQFqwABJWGDAAP0cAgAAAQPAAEl8wABJqwAAAAAAAABgvKUBSsAASX8BNQAAAAEAYLylARbAAEl/LpvXuC+5RCMcwABJiYAAwBt2gUgBAAErAMAA/SkXwABJfy6b17gvHMAASY0ushS4LwIAAhbAAEmYLpwqudEnm8QAup+5RIAAwBt2gQFgvKUGucGApMAAScnAAEnlwABKHQEAmscBasAAScpgwAD9HAIAAAEDwABJ7sAASh0AAAAAAAAAYLylAUrAAEnxATUAAAABAGC8pQEWwABJ8S6b1rgvuUUjHMAASfuAAMAbdx5I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AAEnsogAwAD9xQAcwADSrhbAANKmgMAA0p/AG+sOhEO8xkgBAAEWwADSsS6w1bnZAMAA/SkGuq6ApMAA0w7AANMTwADUHAAAsom4LwAAAAEDwADTKsAA1BwAAAABAQHAANMvAAAAlWJgwAD70AAAXAE+AkAcwADTYYDAANNPwBvro4CXAQABkwDAAPz/wADTT8AA02QAScAA02scwADTgYDAANNvwBvro4CXAQABNxQAwAD8/z4BPR7AANOPtacCAAJqwADTo2C1ucAAu7UkAAInsoqAwADT/sAb66MAPwa6zoCkwADUIcAA1DnAANTaAACxZAFqwADUImDAAP0cAgAAAQPAANROwADU2gAAAAEBAcAA1FMAAACVYmDAAPvQAABgvKUBPgI9HMAA1Gwusom4LwEAAYDAANSEwBvsVgC6rkrAANScARzAANSjLrJkuC8BAAEkwADU1QInhaiAwADUw8Ab7FYAuq0Gus+ApMAA1N/AANT6wADVnQAAsWUBasAA1OBgwAD9HAIAAAEDwADVEMAA1Z0AAAABAQHAANUVAAAAlWJgwAD70AAAYLzMAT4CPRzAANUuLrKJuC8BAAGAwADVRsAb7OEAuq5KwADVXgEcwADVZS6yY7gvAQABJMAA1ZgCJ7CYgMAA1YbAG+zhALqsBrpxgKTAANWiwADVwcAA1iABALFmAWrAANWjYMAA/RwCAAABA8AA1eHAANYgAAAAAAAAAGC8zAFKwADV6gEcwADV6i6yY7gvAQABJ7FmALqsBrpygKTAANYlwADWRMAA1q8BALFnAWrAANYmYMAA/RwCAAABA8AA1mrAANavAAAAAAAAAGC8zAFKwADWcwEcwADWcy6yY7gvAQABJ7FnALqsBrrQgKTAANa0wADWxcAA13IAALGlAWrAANa1YMAA/RwCAAABA8AA1tnAANdyAAAAAQEBwADW5gAAAJnCYLylAABgwAD6CgE+AUrAANbxASIiHMAA1wQWwADW/IDAANb4wBvuDoRDvKdIAQABFsAA1wcusbG4L7lZAMAA/SkAIRzAANcsFsAA1yeAwADXI8Ab7g6AvbyTSAEAASeFqADAAP3FABzAANdTFsAA106AwADXSsAb7g6AvbyTgdYBAAEnhagAwAD9yAa6r4CkwADXjMAA15jAANfSAACyZ7gvAAAAAQPAANelwADX0gAAAAEBAcAA160AAACAvWDAAP22AABgvKUBSsAA17YBHMAA17YushS4LwIAAhbAANfBLrDUudiAwADXzcAb7swAup8GurCApMAA19fAANfmwADYMQAAsoO4LwAAAAEDwADX9sAA2DEAAAABAQHAANf+AAAAgL1gwAD9tgAAYLzMAUrAANgNASbAANgNARzAANgNLrIauC8CAAIWwADYIC6w1LnYgMAA2CzAG+8zALqgYLzMBrpzgKTAANhSwADYccAA2KcBALFoAWrAANhTYMAA/RwCAAABA8AA2HrAANinAAAAAAAAAGC8zAFKwADYfQE1AAAAAQBgvMwBFsAA2H0usfy4L7mlIxzAANiHgADAG++4SAEAASsAwAD9KRfAANh9LrH8uC8cwADYiy6yg7gvAQABJ7FoALqwuaWAAMAb77gBYLzMBrp0gKTAANjMwADY68AA2TMBALFpAWrAANjNYMAA/RwCAAABA8AA2PjAANkzAAAAAAAAAGC8zAFKwADZAQE1AAAAAQBgvMwBFsAA2QEusf24L7mmIxzAANkPgADAG/BLSAEAASsAwAD9KRfAANkBLrH9uC8cwADZEy6yg7gvAQABJ7FpALqwuaaAAMAb8EsBYLzMBrp1gKTAANlcwADZe8AA2coBALFqAWrAANldYMAA/RwCAAABA8AA2YzAANnKAAAAAAAAAGC8zAFKwADZlQE1AAAAAQBgvMwBFsAA2ZUusf64L7mnIxzAANmngADAG/DeSAEAASsAwAD9KRfAANmVLrH+uC8cwADZqy6yg7gvAQABJ7KLALqwuaeAAMAb8N4BYLzMBrp2gKTAANnxwADaEMAA2l4BALFrAWrAANnyYMAA/RwCAAABA8AA2h/AANpeAAAAAAAAAGC8zAFKwADaKAE1AAAAAQBgvMwBFsAA2igusf+4L7moIxzAANo4gADAG/FxSAEAASsAwAD9KRfAANooLrH/uC8cwADaPC6yg7gvAQABJ7FrALqwuaiAAMAb8XEBYLzMBrp4gKTAANpjwADac8AA2qEBALKMuC8AAAABA8AA2oHAANqhAAAAAAAAAGC8pQFKwADahAEcwADahC6yFLgvAgACFsAA2o8usNS52CeyjQC6nwa6eYCkwADapcAA2rXAANrtAQCyjrgvAAAAAQPAANrHwADa7QAAAAAAAABgvKUBSsAA2soBHMAA2soushS4LwIAAhbAANrVLrDUudgnso8Aup8GurGApMAA2vHAANr9wADbSwAAspC4LwAAAAEDwADbD8AA20sAAAABAQHAANsXAAAAgL1gwAD9tgAAYLzJAUrAANsmASbAANsmARzAANsmLrIiuC8CAAIWwADbNy6yjLgvuniAwADbRsAb8pMAuqFgvMkGunqApMAA22vAANuHwADbvgEAsWwBasAA22xgwAD9HAIAAAEDwADbksAA274AAAAAAAAAYLzJAUrAANuVATUAAAABAGC8yQEWwADblS6yALgvuakjHMAA26GAAMAb8xpIAQABKwDAAP0pF8AA25UusgC4LxzAANulLrKQuC8BAAEnspEAurG5qYAAwBvzGgFgvMkGunuApMAA297AANv6wADcMQEAsW4BasAA299gwAD9HAIAAAEDwADcBcAA3DEAAAAAAAAAYLzJAUrAANwIATUAAAABAGC8yQEWwADcCC6yAbgvuaojHMAA3BSAAMAb861IAQABKwDAAP0pF8AA3AgusgG4LxzAANwYLrKQuC8BAAEnspIAurG5qoAAwBvzrQFgvMkGunyApMAA3FTAANxwwADctgEAsW0BasAA3FVgwAD9HAIAAAEDwADcfsAA3LYAAAAAAAAAYLzJAUrAANyHATUAAAABAGC8yQEWwADchy6yArgvuasjHMAA3JaAAMAb9EBIAQABKwDAAP0pF8AA3IcusgK4LxzAANyaLrKQuC8BAAEnspMAurG5q4AAwBv0QAFgvMkGun2ApMAA3NzAANz7wADdTQEAsW8BasAA3N1gwAD9HAIAAAEDwADdCcAA3U0AAAAAAAAAYLzMAUrAAN0SASbAAN0SATUAAAABAGC8zAEWwADdEi6yA7gvuawjHMAA3SGAAMAb9NlIAQABKwDAAP0pF8AA3RIusgO4LybAAN0SARzAAN0lLrIiuC8CAAIWwADdNi6yjLgvungnspQAuqFgvMy5rIAAwBv02QFgvLdgvMwGun6ApMAA3XPAAN2SwADd5AEAsXABasAA3XRgwAD9HAIAAAEDwADdoMAA3eQAAAAAAAAAYLzMAUrAAN2pASbAAN2pATUAAAABAGC8zAEWwADdqS6yBLgvua0jHMAA3biAAMAb9YpIAQABKwDAAP0pF8AA3akusgS4LybAAN2pARzAAN28LrIiuC8C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68ABEgLAARIjAAKyyAAAAAEDwAESDMABEiMAAAABAQHAARIbAAAAhENgvJYAAF3AAPwyAWC8mwAGuwOApMABEmTAARJ8wAESpQACsskAAAABA8ABEo7AARKlAAAAAQEBwAESnQAAAIRDYLyWAABdwAD8MgFgwABguwAGuwSApMABEuLAARL6wAETGwACssoAAAABA8ABEwrAARMbAAAAAQEBwAETFwAAAJnCYLylAABdwAD8MgFgwABguwAGuwWApMABE1vAARNzwAETxwACsssAAAABA8ABE4TAARPHAAAAAgEBwAETkgAAAIJmYLy3AAHAAROmAAAAssxgwAD6CgFqwAETwGDAAPoKAF3AAPwyAWDAAGC7AAAAHBgwABwYeAAcGLQAHBjwABwZMAAcGXIAHBm0ABwaEAAAAAcCuwiApMABE8zAARPbwAEgiAeyzQAAAWC62QAAAAEFuxcAAAAABAAAAwAAAAAAAAAAAGC7CAE/AQkBALr8AAAAAAwGuwqApMABFFfAARRcwAEUpAACss4AAAABA8ABFHbAARSkAAAAAgICwAEUgwAAAJnCYLylAMABFI0AAACBpmEBYLy3XAAAXAAGuwuApMABFN7AARTjwAEVQAACss8AAAABA8ABFPnAARVAAAAAAgICwAEVDQAAAJnCYLylAMABFRcAAACBpmEBYLzrXAAAXAAGuwyApMABFXrAARV/wAEVzwACstAAAAABA8ABFZPAARXPAAAAAgICwAEVqAAAAIJmYLy3AMABFbUAAACBpmEBYLzMXAAAXAAGuw2ApMABFjfAARY8wAEWZAACstEAAAABA8ABFlPAARZkAAAAAQEBwAEWYAAAAJnCYLylAABgwAD6CgAGuw6ApMABGKHAARitwAEY1AACstIAAAABA8ABGMPAARjUAAAAAQEBwAEY0AAAAJnCYLylAABgvKUABrsPgKTAARl2wAEZf8ABGboAArLTAAAAAQPAARmZwAEZugAAAAEBAcABGa0AAACti2C8sQAAYMAAYk8ABrsQgKTAARpWwAEaX8ABGqwAArLUAAAAAQPAARp8wAEarAAAAAICAsABGpAAAACZpmC80wDAARqhAAAAhTRgwABiTwAAYMAAYk8ABrsRgKTAARuBwAEbisABG8gAArLVAAAAAQPAARuvwAEbyAAAAAEBAcABG78AAACC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pcAArVnAAK2ECbN7AF3AAPylAmC8t2C7oQEywACtgmC8t2C7oQAEu5WApcAArfjAAK4sCbN8AF3AAPylAmDAAGC7YLuhATLAAK4qYMAAYLtgu6EABLuXgKXAAK5+wACuiQmzfbsYAGC7dAABBbuggKXAAK6OwACujsAArqkAAAADwACul8AArqkAAAABAQHAAK6dAAAEs31gu3QAAGC7kAE/AggBu5eAAMAceHMJAcAAro7AAP0yAAAAAAUGu5mApcAArufAAK7wwACvDgEAg7IAAAABA8AArvvAAK8OAAAAAAAAAGDAAPoKAUrAAK7+ARbAAK8EFsAArv4usyi7koOywAD8Vwa7m4ClwACvPMAAr0XAAK+MAACzSgAAAAEDwACvTcAAr4wAAAAAAAAAYLuhAT4CQBbAAK9dLoOyu5nAAK9dwACvZwBKwACvbgEcwACvexbAAK91LrMou5KfEAAAAADAAMJBBrucgKXAALCwwACwtcAAsfsAAISLAAAAAQPAALC9wACx+wAAAAICAsAAsMoAAACWIGC8pQDAALDdAAAAsz9gu4IAAFwBPgJOwACw8sAAsPcAAIciYLuhARzAALEHFsAAsPkus3q7k0sBAAGAwACxCMAceXQAwAD8uUnAALEWHMAAsR+CwACxGsAceZRIAQABKwDAAP0pPgM9isAAsTDAHHmUH8AAsTu7rgIAAoDAALFJwBx5dIHAALFSwBx5gQA9HMAAsXIWwACxZC6zeruTgL8CAAKAwACxc8AceXSCwACxfsAceZQAwAD8uj0cwACxkBbAALGKLrMou5JWAQABgsAAsZTAHHmUAMAAwkU+AT0XwACxs4LAALGuwBx5lLN+HMAAsc4WwACxwi6zfbsYu5eW/AIAAhbAALHZgsAAsdTAHHmUs367o4HAALHnwBx5gQC7fbujBrudgKXAALMfwACzJMAAtG0AAISKAAAAAQPAALMtwAC0bQAAAAICAsAAszsAAACWIGC8twDAALNOAAAAsz9gu4IAAFwBPgJOwACzY8AAs2gAAIciYLuhARzAALN4FsAAs2ous3u7lEsBAAGAwACzecAcesoAwAD8uUnAALOHHMAAs5CCwACzi8AceupIAQABKwDAAP0pPgM9isAAs6HAHHrqH8AAs6y7tQIAAoDAALO7wBx6yoHAALPEwBx61wA9HMAAs+QW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y8bAAMvSAACzkV3AAPylAmC8pWC7GwEcwADL64LAAMvcwByI5iACAAIWwADL8oDAAMvswByIx7OLuxi7yxbAAMwGgMAAzADAHIjHs4y7GLvNAABOwADMP8AAzEwAALOSXcAA/KUCYLy3YLsbARzAAMxmg8AAzFbAHIkWIAIAAhbAAMxtgMAAzGfAHIjHs4e7GLvMFsAAzIKAwADMfMAciMezjLsYu80AAE7AAMy8wADMywAAs5NdwAD8pQJgwABgu2C7GwEcwADM54TAAMzVwByJRiABAAEWwADM7oDAAMzowByIx7ONuxi7zgAATsAAzSnAAM1EAACzlF3AAPylAmC8m2C7ZQEywADNRmC8m2C7ZQA9HMAAzXkWwADNVIDAAM1OwByIx7L1uxi70IP4AQABNMAAzYEDwADNgcAAzoQAAAACAgLAAM2PAAAAhKJgvJsAwADNqQAAAJaXYLtlAABgwAD82QE+AT0cwADN2BTAAM2+wByKZggAgL8CAAIUwADN2cAcir4JAB/AAM3nu2wDAAMWwADOGRTAAM4NwByKywoAs2a7ZxbAAM49FMAAzjHAHIrLCgCDJLtoHMAAzl2BwADOT8AciNQgAQABFsAAzmoUwADOXsAcissKALNnuxi7agAAAADAAPy6AMAA/MRKwADOjAEfwADOl7voCgAKFsAAzrWAwADOr8AciMek7bvIFsAAztOAwADOzcAciMezirvJhcAAzuvAHIl2hsAAzwDAHInMasAAz1ddwAD8pQJgvPBguxvAAOZBh8AAz3zAHIoiFsAAz5qAwADPlMAciMewfLvRFsAAz7WAwADPr8AciMey8LsYu88WwADP1YDAAM/PwByIx7NBu9IUwADP6sAcimYIAAAGu9WApcAA0EvAANBTwADXqQQBrs4AAAABA8AA0HTAANepAAAAAQEBwADQgAAAAINEYMAAXSoAAGC7xQE+DD0cwADQlYDAANCOwByMOYKUAQABasAA0JtgwAD9tsAA5j4AwABdLE7AANCqwADQuQAApO1gwAD6CgEcwADQwoDAANC7wByMOa7sAAAAAMAAXThOwADQ48AA0O8AALB8XcAA/HQBYLsbARzAAND4gMAA0PHAHIw5rugBAWC7GwE0wADRAQPAANEBwADR3wAAAAAAAABguxsBPgROwADREcAA0R4AALLlYMAA+goBHMAA0SeAwADRIMAcjDmu7AAAAADAAF04TsAA0UDAANFFAACAvWDAAP22ARzAANFOgMAA0UfAHIw5r3UAAAAAwABdO07AANF0wADRfgAAsz9dwAD9ZwFgvJsBHMAA0ZUcwADRh4DAANGAwByMObOVAAAAAMAAXXKVEwAAAADAAPxJSsAA0aQBH8AA0a+7JwMAA4LAANG6wByM6oPAANHIwByNFYTAANHOwByNQAAAwABdN07AANHxwADSAAAAs4pguxsBHMAA0g2CwADSAsAcjKJLAQABHMAA0hWAwADSDsAcjDmwfQAAAADAAF05AMAA/INOwADSQ8AA0k8AALORXcAA/KUCYLylYLsbARzAANJYgMAA0lHAHIw5s5YBAmC8pWC7GwE0wADSZQPAANJlwADSmwAAAAAAAABguxsBPgFKwADScAEcwADSgoLAANJ3wByMoksBAAEcwADSioDAANKDwByMObB9AAAAAMAAXTkAwAD8gwDAAF1fTsAA0sDAANLNAACzkl3AAPylAmC8t2C7GwEcwADS3oDAANLXwByMObOXAQJgvLdguxsBNMAA0uwDwADS7MAA0zUAAAABAQHAANL6AAAAgmZgvLcAAGC7GwE+AUrAANMKARzAANMcgsAA0xHAHIyiSwEAARzAANMkgMAA0x3AHIw5sH0AAAAAwABdOQDAAPyDAMAAXWROwADTW8AA02oAALOTXcAA/KUCYMAAYLtguxsBHMAA03OAwADTbMAcjDmzmAECYMAAYLtguxsBNMAA04MDwADTg8AA07kAAAAAAAAAYLsbAT4BSsAA044BHMAA06CCwADTlcAcjKJLAQABHMAA06iAwADTocAcjDmwfQAAAADAAF05AMAA/IMAwABdb07AANPawADT6gAAs5ldwAD8pQJgvJtgwAD9tgEcwADT+4DAANP0wByMObOaAQFgwAD9tgEWwADUEIDAANQJwByMOa91wABdOwDAAF1zTsAA1D/AANRLAACzQV3AAPylAmDAAP22XcAA/HQBYLsbARzAANRUgMAA1E3AHIw5s5sBAV3AAPx0AWC7GwE0wADUYgPAANRiwADUxgAAAAAAAABdwAD8dAFguxsBPgFKwADUbQEcwADUe4DAANR0wByMOa7oAQFguxsBNMAA1IQDwADUhMAA1L4AAAAAAAAAYLsbAT4BSsAA1JEBHMAA1KOCwADUmMAcjKJLAQABHMAA1KuAwADUpMAcjDmwfQAAAADAAF05AMAA/IMAwABdNwDAAF0+TsAA1PLAANUNAACzlF3AAPylAmC8m2C7ZQEcwADVHoDAANUXwByMObOaAQFgu2UBNMAA1SwDwADVLMAA1i8AAAAAAAAAYLtlAT4ETsAA1T7AANVLAACzZmDAAP22ARzAANVUgMAA1U3AHIw5r3UAAAAAwABdO07AANVvwADVdgAAgyRgwAD9tgEcwADVf4DAANV4wByMOa91AAAAAMAAXTtOwADVocAA1bIAALNoYLyWARzAANW7gMAA1bTAHIw5mKwAAAAAwABdWUrAANXQAR/AANXbu2wDAAMUwADWAcAckQUJABTAANYPwByRMAoAFMAA1hfAHJFbCwAAAMAAXXM9HMAA1j2AwADWNsAcjDmCjAEAAWrAANZBYMAA/bbAAOY+AMAAXS1KwADWSwEfwADWVrvoCgAKgcAA1m7AHIx3g8AA1obAHI2vhMAA1p7AHI3vhcAA1rPAHI53asAA1wpdwAD8pQJgvPBguxvAAOZBhsAA1y/AHI8MgsAA10fAHIyih8AA11zAHI+YFMAA13XAHI/lCAAUwADXisAckLoJAAAGu9eApcAA1+DAANflwADdiAAArs8AAAABA8AA1/TAAN2IAAAAAQEBwADX/gAAAIQ7YMAAXNsAAFwBPgw9HMAA2A+AwADYCsAckoSClAEAAWrAANgVYMAA/bbAAOY+AMAAXOA9HMAA2CSAwADYH8AckoSu8wEAARbAANguLqTtu8gAwABc5U7AANhYwADYagAAs5xdwAD8pQJguxtgwAD70AEywADYbGC7G2DAAPvQAD0cwADYeYDAANh0wByShIg+AgFguxsCFsAA2IMusHy70TTAANiQA8AA2JDAANl1AAAAAQEBwADYnAAAALNFYLsbAABgwAD82QE+BD0cwADYwYHAANiwwByS44C/AgACgsAA2MLAHJNBFsAA2OKBwADY0MAckuNhwAD8yQDAAPy6PRzAANj1gMAA2PDAHJKErvMBAAEWwADZCoLAANj/wByTQbLlux0AwABc5T0cwADZJIDAANkfwByShIG5AQABFsAA2TuCwADZMMAck0GAvbseAMAAXOg9HMAA2U2AwADZSMAckoSznQEAARbAANllgsAA2VrAHJNBsua7GLsgAMAAXR8AwABc5D0cwADZgYDAANl8wByShLCDAQABHMAA2ZuBwADZisAckuNLAQABFsAA2Zwus4q7yQDAAPy5AMAAXOY9HMAA2beAwADZssAckoSzngIBYLsbAhbAANnFLrOLuxi7yzTAANnTA8AA2dPAANomAAAAAQEBwADZ3wAAALNFYLsbAABgwAD82QE+AT0cwADZ+IDAANnzwByShLCDAQABHMAA2hKBwADaAcAckuNLAQABgsAA2hPAHJSFAMAA/LkAwABc5gDAAF0MPRzAANoygMAA2i3AHJKEs58CAWC7GwIWwADaQS6zh7sYu8w0wADaWAPAANpYwADawAAAAAICAsAA2mYAAACCZmC8twDAANp5AAAAs0VguxsAAGDAAPzZAT4BPRzAANqSgMAA2o3AHJKEsIMBAAEcwADarIHAANqbwByS40sBAAGDwADarcAclR0AwAD8uQDAAFzmAMAAXRE9HMAA2syAwADax8AckoSzoAIBYLsbAhbAANrdLrONuxi7zjTAANruA8AA2u7AANtBAAAAAQEBwADa+gAAALNFYLsbAABgwAD82QE+AT0cwADbE4DAANsOwByShLCDAQABHMAA2y2BwADbHMAckuNLAQABgsAA2y7AHJWoAMAA/LkAwABc5gDAAF0aPRzAANtNgMAA20jAHJKEs6ECAWDAAP22AhbAANtcLrLwuxi7zxbAANtzgMAA227AHJKEgbnAAFzoAMAAXSA9HMAA24qAwADbhcAckoSzogIBXcAA/HQBYLsbAhbAANuZLrNBu9I0wADbpgPAANumwADcWwAAAAEBAcAA27gAAACwfF3AAPx0AWC7GwAAYMAA/NkBPgE9HMAA29KAwADbzcAckoSIPgIBYLsbAoLAANvnwByWdTTAANv+A8AA2/7AANxTAAAAAQEBwADcCgAAALNFYLsbAABcAUrAANwnARzAANwsgMAA3CfAHJKEsIMBAAEcwADcRoHAANw1wByS40sBAAGDwADcR8AclsUAwAD8uQDAAFzmAMAAXOQAwABc6z0cwADcZ4DAANxiwByShLOhAgFgu2UCFsAA3HYusvW7GLvQNMAA3JsDwADcm8AA3XAAAAABAQHAANyuAAAAs6Ngu2UAAGDAAPzZAT4DPRzAANzOgMAA3MnAHJKEgbkBAAEWwADc7ILAANzawByXVLNmu2cAwABc6D0cwADdBoDAAN0BwByShIG5AQABFsAA3SSCwADdEsAcl1SDJLtoAMAAXOg9HMAA3TiAwADdM8AckoSvigEAASbAAN1XARbAAN1XgsAA3UXAHJdUs2e7GLtqYMAAjjAAwABdBgDAAF0gPRzAAN18gMAA3XfAHJKEgowBAAFqwADdgGDAAP22wADmPgDAAFzhBrvYgKXAAN4fwADeKsAA3y8AALOkAAAAAQPAAN48wADfLwAAAAIBAcAA3kkAAACZwmC8pQABwADeVAAAAJerYMAA+goBasAA3l9gwAD6CgBguxsBPgRJwADebSEWwADeci6k7bvISsAA3oIBFsAA3okus4q7yT9OwADeqMAA3q0AALL4YLsbARzAAN67FsAA3q8us4u7GLvLSwEAAYDAAN68wByYTADAAPy5QCKBwADezcAcmFoBIRzAAN7fgsAA3trAHJicSAEAASsAwAD9KcAA3s3AAN7mASTAAN8HAiezpYDAAN8DwByYTErAAN8OATUAAAABAGC7GwGCwADfFcAcmJwjHMAA3xqDAMAcmRZIAQABKwAAFsAA3x0us4q7yYMAwByZFgFguxsGu9mApcAA3zTAAN8/wADfgQAAs6YAAAABA8AA31vAAN+BAAAAAQEBwADfaAAAAJnCYLylAABguxsBSsAA33ABHMAA33wWwADfcC6zi7sYu8tLAQABgMAA333AHJl3AMAA/LkGu9qApcAA373AAN/IwADgtAAAs4gAAAABA8AA39vAAOC0AAAAAQEBwADf6QAAAIJmYLy3AABguxsBPgRJwADf9yEWwADf/C6k7bvISsAA4AwBFsAA4BMus4q7yT9OwADgMsAA4DcAALL4YLsbARzAAOBGFsAA4Dkus4e7GLvMSwEAAYDAAOBHwByZ2gDAAPy5QCEcwADgYIHAAOBbwByaEEgBAAErAMAA/SnAAOBbwADgZwEkwADgjAIns6eAwADghcAcmdpKwADgkwE1AAAAAQBguxsBgcAA4JrAHJoQIxzAAOCfggDAHJp/SAEAASsAABbAAOCiLrOKu8mCAMAcmn8BYLsbBrvbgKXAAOC5wADgxMAA4RUAALOoAAAAAQPAAODhwADhFQAAAAEBAcAA4O8AAACCZmC8twAAYLsbAUrAAOEAARzAAOENFsAA4QAus4e7GLvMSwEA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iga/GICtmOeZAJkwAQCFagFqmOhgwAD9HAIAAAEDmQmZMAAAAAAAAABgwABAigFKmQwBNQAAAAEAYMAAQIoBFpkMLrVovtq+4yMcmRaAAMAdmGBIAQABKwDAAECpF5kMLrVovtpqmSBgv7jAAOd4vuOAAMAdmGABYMAAQIoGvxmArZk1mU6ZeAEAtO0Bapk2YMAA/RwCAAABA5lYmXgAAAAAAAAAYMAAQIoBSplbAWqZYWC/uMAA54MGvxqArZl9mYqaGwEAtYcAAAABA5mhmhsAAAAAAAAAYMAAQIoBSpmqATUAAAABAGDAAECKARaZqi61fr7avvkjHJnCgADAHZkPSAEAASsAwABAqReZqi61fr7aHpnKwABAmQIAAhaZ/BaZ7S6y+78AsRG4ihaaDi61Zb7avuAAvvmAAMAdmQ8BYMAAQIoGvxuArZogmi2apgEAtYgAAAABA5o/mqYAAAAAAAAAYMAAQIoBSppCATUAAAABAGDAAECKARaaQi61f77avvojHJpVgADAHZmcSAEAASsAwABAqReaQi61f77aHppjwABAmAIAAhaaixaafC6y+78AsQe4gBaamS61Zb7avuAAvvqAAMAdmZwBYMAAQIoGvxyArZqrmribQQEAtYkAAAABA5rJm0EAAAAAAAAAYMAAQIoBSprSATUAAAABAGDAAECKARaa0i61gL7avvsjHJrkgADAHZopSAEAASsAwABAqRea0i61gL7aHprswABAmAIAAhabHxabEC6y+78AsRO4jBabNC61Zb7avuAAvvuAAMAdmikBYMAAQIoGvx2ArZtGm1Ob6AEAtYoAAAABA5tpm+gAAAAAAAAAYMAAQIoBSptyATUAAAABAGDAAECKARabci61gb7avvwjHJuJgADAHZq2SAEAASsAwABAqRebci61gb7aHpuRwABAlgIAAhabwRabsi6y+78AsRa4jxab2y61Zb7avuAAvvyAAMAdmrYBYMAAQIoGvx6ArZvtm/qcgAEAtYsAAAABA5wKnIAAAAAAAAAAYMAAQIoBSpwTATUAAAABAGDAAECKARacEy61gr7avv0jHJwkgADAHZtDSAEAASsAwABAqRecEy61gr7aHpwswABAmAIAAhacXxacUC6y+78AsQW4fhaccy61Zb7avuAAvv2AAMAdm0MBYMAAQIoGvyGArZyFnJ6e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Br9WgK3AAEaowABGwcAARxkAALUWAWrAAEapYMAA/RwCAAABA8AARs/AAEcZAAAAAQEBwABG2QAACICWYMAAQIoAAGC9sQFKwABG6QEewABG9r2+AQABHMAARwIutaW+2gEAAYDAAEcSwB24AwC/NgAGvzaArcAARx7AAEcjwABHdwAAtaW+2gAAAAEDwABHMsAAR3cAAAABAQHAAEc8AAAAgJZgwABAigAAYMAA+goBPgFKwABHSQEcwABHVoDAAEdQwB24a7WkAQABFsAAR2YutWW+2r7gAMAAQKUGv1eArcAAR3zAAEeVwABIHQAAtRcBasAAR31gwAD9HAIAAAEDwABHncAASB0AAAABAQHAAEenAAAIgJZgwABAigAAYL2xAT4BSsAAR7QBHsAAR8i9vgEAASIcwABH44DAAEfdwB244LWmAQABFsAAR/YutWW+2r7gAMAAQKQAIRbAAEgOgMAASAjAHbjgtZjAAEC4AAa/WICtwABIIsAASDvAAEirAAC1GAFqwABII2DAAP0cAgAAAQPAAEhJwABIqwAAAAEBAcAASFMAAAiAlmDAAECKAABgvbEBPgFKwABIYAEewABIdL2+AQABHMAASIaAwABIgMAduXW1pgEAARbAAEiZLrVlvtq+4ADAAECkAAa/WYCtwABIsMAASMnAAElQAAC1GQFqwABIsWDAAP0cAgAAAQPAAEjSwABJUAAAAAEBAcAASNwAAAiAlmDAAECKAABgvbEBPgFKwABI6QEewABI/b2+AQABIhzAAEkYgMAASRLAHbnztacBAAEWwABJKS61Zb7avuAAwABApgAhFsAASUGAwABJO8AdufO1mMAAQLgABr9agK3AAElVwABJbsAAScgAALUaAWrAAElWYMAA/RwCAAABA8AASX3AAEnIAAAAAQEBwABJhwAACICWYMAAQIoAAGC9sQFKwABJlwEewABJpL2+AQABHMAASbAutai+2gEAAYDAAEnBwB26iAC/NwAGvzeArcAASc3AAEnSwABKKAAAtai+2gAAAAEDwABJ4sAASigAAAABAQHAAEnsAAAAgJZgwABAigAAYMAA+goBPgFKwABJ+QEcwABKBoDAAEoAwB268LWnAQABFsAAShcutWW+2r7gAMAAQKYGv1uArcAASi3AAEpGwABKzgAAtRsBasAASi5gwAD9HAIAAAEDwABKTsAASs4AAAABAQHAAEpYAAAIgJZgwABAigAAYL2xAT4BSsAASmUBHsAASnm9vgEAASIcwABKlIDAAEqOwB27ZbWiAQABFsAASqcutWW+2r7gAMAAQKcAIRbAAEq/gMAASrnAHbtltZjAAEC4AAa/XICtwABK08AASuzAAEtcAAC1HAFqwABK1GDAAP0cAgAAAQPAAEr6wABLXAAAAAEBAcAASwQAAAiAlmDAAECKAABgvbEBPgFKwABLEQEewABLJb2+AQABHMAASzeAwABLMcAdu/q1ogEAARbAAEtKLrVlvtq+4ADAAECnAAa/XYCtwABLYcAAS3rAAEvYAAC1HQFqwABLYmDAAP0cAgAAAQPAAEuLwABL2AAAAAEBAcAAS5UAAAiAlmDAAECKAABgvbEBSsAAS6UBHsAAS7K9vgEAARzAAEu+LrWpvtoBAAGAwABL0cAdvHgAvzgABr84gK3AAEvdwABL4sAATJEAALWpvtoAAAABA8AAS/TAAEyRAAAAAQEBwABL/gAAAICWYMAAQIoAAGDAAPoKAT4BSsAATAsBIiIiHMAATBIutaG+2gEAAYDAAEwowB284AC/NAEcwABMOi61pb7aAQABgMAATErAHbzgAL82ARzAAExcLrWovtoBAAGAwABMbcAdvOAAvzcBHMAATH8utZm+2gEAAYDAAEyHwB284AC/MAa/XoCtwABMlsAATKvAAEzkAACW/AFqwABMl2DAAP0cAgAAAQPAAEywwABM5AAAAAICAsAATLoAAAiB1WDAAECKAMAATMYAAAiCSmDAAECKAABgwABAigFKwABMzAEcwABMzoDAAEzMwB29m5b8AgACgcAATNTAHb2qFsAATNcutWW+2r7gAMAAQLAGv1+ArcAATOnAAEz+wABNSwAAlv0BasAATOpgwAD9HAIAAAEDwABNCsAATUsAAAACAgLAAE0UAAAIgdVgwABAigDAAE0gAAAIgkpgwABAigAAYMAAQIoBSsAATSwBHMAATS6AwABNLMAdviaW/QIAAoHAAE07wB2+NRbAAE0+LrVlvtq+4ADAAECyBr9ggK3AAE1QwABNacAATc0AALUfAWrAAE1RYMAA/RwCAAABA8AATXTAAE3NAAAAAgICwABNfgAACIHVYMAAQIoAwABNigAACIJKYMAAQIoAAGC9sQFKwABN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AQABgIdHwB3eGgDAAECdPRyHV4CHUsAd3hq1tQEAASaHawEWh2sutSS/i2CCUgDAAFz4PRyHhYCHgMAd3hq1tgEAASaHlwEWh5cutSW/jGDAAI48AMAAXQ89HIe7FoevLprRv42uzwEAAYCHy8Ad3hoAwABAnT0ch9uAh9bAHd4arvQBAAEWh+ouYb+OAMAAXOc9HIf8gIf3wB3eGoKMAQABaogAYMAA/bbAAOe8AMAAXOEGv5OArogNiCKI0QAAhmMBaogOYMAA/RwCAAABA4gqiNEAAAAAAAAAYMAAQIoBPgFKiDMBIxaIOi61mMAAQAcuH4hiv58FAAUciH4WiHQutaq/ioZjAAAAAMAAQKEWiIoutSS/ixaIpi61Jb+MFoi5LprRv40WiMYuYb+OAAFgv4cGv5SArojWiOuJoAAAhmQBaojXYMAA/RwCAAABA4j2iaAAAAAAAAAAYMAAQIoBPgFKiP8BIxaJBi61mMAAQAcfiR+/nwUABRyJOxaJMS61qr+KhmQAAAAAwABAohaJSi61JL+LFolmLrUlv4wWiXkumtG/jRaJhi5hv44ALgFgv4cGv5uAromlibqJzQEAtSEBaommYMAA/RwCAAABA4nGic0AAAAAAAAAYMAA+goBSonJASkGv5yAronRieaJ9QEAtQEBaonSYMAA/RwCAAABA4nuifUAAAAAAAAAYMAA+goBSonxASkGv5WAron6iguLCgAAtbcBaon7YMAA/RwCAAABA4oeiwoAAAABAQGKHwAAAIPWWwAAYMAA+goBPgJJiiwhJYo2gIowwB3gvmC/h0qKTQEqP0qKXwEiIiIdimy1twEAAYCKgMAd4L4AwABAJQAciqEWipIutSS/i0gBAAEWiqqAiqTAHeC+tSQAAMAA/SkAHIrQForELprRv41IAQABForZgIrTwB3gvprRAADAAECpAByK9xaK8C5hv45IAQABFosAgIr6wB3gvmEAAMAA/PMGv5aArosPiySMPQAAlv0BaosQYMAA/RwCAAABA4swjD0AAAACAgKLOgAAAIPWYMAAQIoAi04AAACkzGDAAE0PAABgwABAigE+A06Laot+AAC1uGDAAECKARyLihaLgC61qr+Klv0CAAKAi5fAHeGNgYuewB3hmgDAAECySYuwFovIgou0wB3hsbW5wABAukqL1wGCi97AHeGx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AEfjwB4jPapbwABNHZrfAgAChMAASArAHiSjFsAASBWBwABIE8AeIzCWUb+/AMAAcO9KwABIHAEqP0rAAEg0ASkGv92AsMAASEjAAEhRwABLCAAAtfUAAAABA8AASGHAAEsIAAAAAgICwABIbwAAAIPWYL+4AMAASIMAAACkzGDAAE0PAABgwABAigE+A0AcwABIohbAAEidLpZRv79IAQABFsAASKuAwABIpcAeJTWWUb+/AMAA/SnAAEidwABIrwBOwABJxsAASc8AALXoYMAA+9ABIxzAAEnYFsAASdIuhHy/wGMBAAEWwABJ4IDAAEnawB4lNYR8v8AAwAD8/RzAAEn3FsAASfEuhHy/wIN3AQABHMAASgwcwABKBxbAAEoBgMAASfvAHiU1hHy/wIN3AQABlADAAPvogQYBAAEcwABKDpSEhgAAAADAAPvrAMAA++kAwAD76BzAAEooFsAASiKAwABKHMAeJTWEfL/Ag3cBAAEcwABKNxzAAEoyFsAASiwuhHy/wIN3AQABlADAAPvogQYBAAEcwABKOZSEhgAAAADAAPvrAMAA++kAwAD76AFgwAD70EnAAEpCHMAASkwWwABKRi6EfL/ASAEAAYLAAEpPwB4ljwDAAPzzPgFKwABKYQEuScAASnkcwABKiRbAAEqDgMAASn3AHiU1hHy/wEgBAAGCwABKjMAeJY8AwAD88z4BSsAASp4BgMAASqXAHiU1PgFKwABKvwEewABKyr/CAwADFsAASuIullG/v4LAAErowB4lj4HAAErywB4lQgAGv96AsMAASw3AAEsWwABOXQAAtfYAAAABA8AASzDAAE5dAAAAAgICwABLRQAAAIPWYL+4AMAAS1kAAACkzGDAAE0PAABgwABAigE+BUAhHMAAS3gWwABLcy6WUb+/SAEAARbAAEuBgMAAS3vAHidLllG/vwDAAP0pwABLc8AAS4UAQBzAAEuuFsAAS5+BwABLk8AeJ1iqW8AATR2bDAIAAhbAAEvBgMAAS7vAHidLllG/vxbAAEvHLpZRv78AwABw7sAAS5PAAEvMAEnAAExCFsAATEYutQG/60rAAExPARzAAExWLrX3AQABgMAATGjAHidLAL/fP07AAE2XwABNoAAAtehgwAD70AEcwABNrhbAAE2ogMAATaLAHidLhHy/wIN3AQABHMAATb0c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lcAAQu/AAEM8FsAAR8sut5bAAELvwABDPRbAAEfjLreXwABC78AAQz4ASsAAR/wBHMAASAuHwABIA8AfYEmihgAAAADAAHtWAKQIAAAfXo8AH2F/AAAAAQLAAENDgLvAAEgjwABIKcAAVFkDt5sAAAFgwAD9HAABYMAAcf4CBMAAQ0aAu8AASI/AAEimCbPawABC7wBgwABBMgAEwABDR4C7wABIysAASNgYt5zAAELvAGDAAEENASsBBcAAQ1uAu8AASN3AAEjdwABJYAAAAAPAAEj5wABJYAAAAAICAsAASQ4AAACCRWC8twDAAEkbAAAEs9pgwABBMgAAYMAAQ0MBPgE9F8AASTout5zAAELvHMAASUsut53AAELvAQABgMAASVXAH2ITAMAAQ0rAAENHAggBwABDRoEAwB9iIAkBwABI3cAA/TIAAAAAEAbAAENKgLvAAEllwABJhcAASgkAALedwABC7wAAAAEDwABJjsAASgkAAAABAQHAAEmcAAAAg01gvLcAAGDAAEENAUrAAEmoARzAAEnLFsAASagus9rAAELvwABDRrPtAQABIyXAAEncgMAASdrAH2KwYLzrFsAASfkUwABJ98AfYrAAAWC865jVvO2AwABKB8AfYrABYLy3AMAAQTcGwABDS4C7wABKDsAASijAAEq/AAC3ngFqwABKD2DAAP0cAgAAAQPAAEo3wABKvwAAAAEBAcAASkcAAACCamC8zAAAYL3LAT4BSsAASlcBHsAASnPAAHxWAgACgMAASpnAH2NUFsAASqMus9rAAELvwABDRgAGwABDTIC7wABKxMAASt7AAEtxAAC3nwFqwABKxWDAAP0cAgAAAQPAAEr2wABLcQAAAAICAsAASxIAAACD7mCFkwDAAEssAAAAsHhgvdYAAGC9ywE+AUrAAEtHARzAAEtdFsAAS04ut5zAAELvwABDR7ZkAQABgMAAS2jAH2PJAMAAQRUGwABDTYC7wABLdsAAS5DAAEvnAAC3oAFqwABLd2DAAP0cAgAAAQPAAEuhwABL5wAAAAEBAcAAS7EAAACD7mCE1AAAYL3LAT4BSsAAS70BHMAAS9MWwABLxC63nMAAQu/AAENHtmQBAAGAwABL3sAfZE0AwABBFQbAAENOgLvAAEvswABMBsAATGkAALehAWrAAEvtYMAA/RwCAAABA8AA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Q4gAAACD7mDAAEinAABbAUrAAEORARzAAEORLri4AQABgMAAQ6HAH/9mAMAARLAGwABE2YDAwABDqsAAQ7bAAEPzAAC4VgFqwABDq2DAAP0cAgAAAQPAAEPGwABD8wAAAAEBAcAAQ9QAAACD7mDAAEkaAABbAUrAAEPdARzAAEPdLriGAQABgMAAQ+7AH//MAMAARKUGwABE2oDAwABD98AAQ/fAAEQ0AAC4uwAAAAEDwABEB8AARDQAAAABAQHAAEQVAAAAg+5gwABHEwAAWwFKwABEHgEcwABEHi64hgEAAYDAAEQvwCAAJwDAAESlBsAARNuAwMAARDjAAEREwABEewAAuFcBasAARDlgwAD9HAIAAAEDwABEUcAARHsAAAABAQHAAERcAAAAg+5gwABHGgAAWwFKwABEZQEcwABEZS64uwEAAYDAAER2wCAAjQDAAETaBsAARNyAwMAARH/AAESLwABEwgAAuFgBasAARIBgwAD9HAIAAAEDwABEmMAARMIAAAABAQHAAESjAAAAg+5gwABHIQAAWwFKwABErAEcwABErC64uwEAAYDAAES9wCAA8wDAAETaBsAARN2AwMAARMbAAETSwABFDQAAuFkBasAARMdgwAD9HAIAAAEDwABE4cAARQ0AAAABAQHAAETuAAAAg+5gwABIVAAAWwFKwABE9wEcwABE9y64hgEAAYDAAEUIwCABWQDAAESlBsAARN6AwMAARRHAAEUdwABFXgAAuFoBasAARRJgwAD9HAIAAAEDwABFLMAARV4AAAABAQHAAEU5AAAAg+5gwABILAAAWwFKwABFQgEcwABFQi64tQEAAYDAAEVZwCABvwDAAEStBsAARN+AwMAARWLAAEVuwABFoQAAuFwBasAARWNgwAD9HAIAAAEDwABFecAARaEAAAABAQHAAEWCAAAAg+5gwABHzgAAWwFKwABFiwEcwABFiy64tAEAAYDAAEWcwCACJQDAAESsBsAAROCAwMAARaXAAEWxwABF3gAAha0BasAARaZgwAD9HAIAAAEDwABFucAARd4AAAABAQHAAEW/AAAAg+5gwABITAAAWwFKwABFyAEcwABFyC64hgEAAYDAAEXZwCACiwDAAESlBsAAROGAwMAAReLAAEXuwABGOwAAuF0BasAAReNgwAD9HAIAAAEDwABGBcAARjsAAAABAQHAAEYaAAAAg+5gwABI9wAAWwFKwABGIwEcwABGIy64sgEAAYDAAEY2wCAC8QDAAESqBsAAROKAwMAARj/AAEZLwABGeAAAuF8BasAARkBgwAD9HAIAAAEDwABGU8AARngAAAABAQHAAEZZAAAAg+5gwABIbQAAWwFKwABGYgEcwABGYi64hgEAAYDAAEZzwCADVwDAAESlBsAAROOAwMAARnzAAEaIwABGxAAAuFsBasAARn1gwAD9HAIAAAEDwABGlcAARsQAAAABAQHAAEagAAAAg+5gwABHZwAAWwFKwABGqQEcwABGqS64rgEAAYDAAEa/wCADvQDAAESmBsAAROSAwMAARsjAAEbUwABHFgAAuF4BasAARslgwAD9HAIAAAEDwABG58AARxYAAAABAQHAAEb4AAAAg+5gwABIWgAAWwFKwABHAQEcwABHAS64WQEAAYDAAEcRwCAEIwDAAETdBsAAROWAwMAARxrAAEcmwABHZQAAuGABasAARxtgwAD9HAIAAAEDwABHOsAAR2UAAAABAQHAAEdMAAAAg+5gwABJzQAAWwFKwABHVQEcwABHVS64uQEAAYDAAEdgwCAEiQDAAES6BsAAROaAwMAAR2nAAEd1wABHugAAuGEBasAAR2pgwAD9HAIAAAEDwABHicAAR7oAAAABAQHAAEebAAAAg+5gwABG+AAAWwFKwABHpAEcwABHpC64hgEAAYDAAEe1wCAE7wDAAESlBsAAROeAwMAAR77AAEfKwABH+AAAuGIBasAAR79gwAD9HAIAAAEDwABH0sAAR/gAAAABAQHAAEfYAAAAg+5gwABGBgAAWwFKwABH4QEcwABH7BbAAEfmgMAAR+HAIAVVgJbAAEYIhE0BAAEuAMAARdMGwABE6IDAwABH/MAASAjAAEhGAAC4YwFqwABH/WDAAP0cAgAAAQPAAEgWwABIRgAAAAEBAcAASCIAAACD7mDAAEeCAABbAUrAAEgrARzAAEgrLriuAQABgMAASEHAIAXGAMAARKYGwABE6YDAwABISsAASFbAAEiJAACwZgFqwABIS2DAAP0cAgAAAQPAAEhhwABIiQAAAAEBAcAASGoAAACD7mDAAEiwAABbAUrAAEhzARzAAEhzLri2AQABgMAASITAIAYsAMAARK4GwABE6oDAwABIjcAASJnAAEjSAAC4ZAFqwABIjmDAAP0cAgAAAQPAAEinwABI0gAAAAEBAcAASLMAAACD7mDAAEeYAABbAUrAAEi8ARzAAEi8LriwAQABgMAASM3AIAaSAMAARKcGwABE64DAwABI1sAASOLAAEkdAAC4ZQFqwABI12DAAP0cAgAAAQPAAEjxwABJHQAAAAEBAcAASP4AAACD7mDAAEehAABbAUrAAEkHARzAAEkHLriwAQABgMAASRjAIAb4AMAARKcGwABE7IDAwABJIcAASS3AAElpAAC4agFqwABJImDAAP0cAgAAAQPAAEk6wABJaQAAAAEBAcAASUUAAACD7mDAAEdwAABbAUrAAElOARzAAElOLriuAQABgMAASWTAIAdeAMAARKYGwABE7YDAwABJbcAASXnAAEmsAACwYgFqwABJbmDAAP0cAgAAAQPAAEmEwABJrAAAAAEBAcAASY0AAACD7mDAAEeLAABbAUrAAEmWARzAAEmWLri2AQABgMAASafAIAfEAMAARK4GwABE7oDAwABJsMAASbzAAEnvAAC4ZgFqwABJsWDAAP0cAgAAAQPAAEnHwABJ7wAAAAEBAcAASdAAAACD7mDAAEjYAABbAUrAAEnZARzAAEnZLriGAQABgMAASerAIAgqAMAARKUGwABE74DAwABJ88AASf/AAEo8AAC4ZwFqwABJ9GDAAP0cAgAAAQPAAEoPwABKPAAAAAEBAcAASh0AAACD7mDAAEkMAABbAUrAAEomARzAAEomLriGAQABgMAASjfAIAiQAMAARKUGwABE8IDAwABKQMAASkzAAEqLAAC4aAFqwABKQWDAAP0cAgAAAQPAAEpdwABKiwAAAAEBAcAASmwAAACD7mDAAEnUAABbAUrAAEp1ARzAAEp1LriGAQABgMAASobAIAj2AMAARKUGwABE8YDAwABKj8AASpvAAErUAAC4aQFqwABKkGDAAP0cAgAAAQPAAEqpwABK1AAAAAEBAcAASrUAAACD7mDAAEndAABbAUrAAEq+ARzAAEq+LriGAQABgMAASs/AIAlcAMAARKUGwABE8oDAwABK2MAASuTAAEsWAACwTgFqwABK2WDAAP0cAgAAAQPAAErtwABLFgAAAAEBAcAASvQAAACD7mDAAEhhAABbAUrAAEr9ARzAAEr9LrheAQABgMAASxHAIAnCAMAAROQGwABE84DAwABLGsAASybAAEtXAACF7wFqwABLG2DAAP0cAgAAAQPAAEswwABLVwAAAAEBAcAASzgAAACD7mDAAEjQAABbAUrAAEtBARzAAEtBLri2AQABgMAAS1LAIAooAMAARK4GwABE9IDAwABLW8AAS2fAAEusAAC4awFqwABLXGDAAP0cAgAAAQPAAEt7wABLrAAAAAEBAcAAS40AAACD7mDAAEi2AABbAUrAAEuWARzAAEuWLriGAQABgMAAS6fAIAqOAMAARKUGwABE9YDAwABLsMAAS7zAAEwIAAC4bAFqwABLsWDAAP0cAgAAAQPAAEvRwABMCAAAAAEBAcAAS+QAAACD7mDAAEd5AABbAUrAAEvtARzAAEvtLriuAQABgMAATAPAIAr0AMAARKYGwABE9oDAwABMDMAATBjAAExFAACwYwFqwABMDWDAAP0cAgAAAQPAAEwgwABMRQAAAAEBAcAATCYAAACD7mDAAEgMAABbAUrAAEwvARzAAEwvLri2AQABgMAATEDAIAtaAMAARK4GwABE94DAwABMScAATFXAAEyAAAC4UAFqwABMSmDAAP0cAgAAAQPAAExcwABMgAAAAAEBAcAATGEAAACD7mDAAElDAABbAUrAAExqARzAAExqLriGAQABgMAATHvAIAvAAMAARKUGwABE+IDAwABMhMAATJDAAEzJAAC4UgFqwABMhWDAAP0cAgAAAQPAAEyewABMyQAAAAEBAcAATKoAAACD7mDAAEltAABbAUrAAEyzARzAAEyzLriGAQABgMAATMTAIAwmAMAARKUGwABE+YDAwABMzcAATNnAAE0gAAC4UQFqwABMzmDAAP0cAgAAAQPAAEzuwABNIAAAAAEBAcAATQEAAACD7mDAAElgAABbAUrAAE0KARzAAE0KLriGAQABgMAATRvAIAyMAMAARKUGwABE+oDAwABNJMAATTDAAE1tAAC4bQFqwABNJWDAAP0cAgAAAQPAAE1DwABNbQAAAAEBAcAATVQAAACD7mDAAEl1AABbAUrAAE1dARzAAE1dLri5AQABgMAATWjAIAzyAMAARLoGwABE+4DAwABNccAATX3AAE26AAC4bwFqwABNcmDAAP0cAgAAAQPAAE2QwABNugAAAAEBAcAATaEAAACD7mDAAEmqAABbAUrAAE2qARzAAE2qLri5AQABgMAATbXAIA1YAMAARLoGwABE/IDAwABNvsAATcrAAE4HAAC4bgFqwABNv2DAAP0cAgAAAQPAAE3dwABOBwAAAAEBAcAATe4AAACD7mDAAEmRAABbAUrAAE33ARzAAE33Lri5AQABgMAATgLAIA2+AMAARLoGwABE/YDAwABOC8AAThfAAE5KAAC4cAFqwABODGDAAP0cAgAAAQPAAE4lwABOSgAAAAEBAcAATjEAAACD7mDAAEm2AABbAUrAAE46ARzAAE46Lri5AQABgMAATkXAIA4kAMAARLoGwABE/oDAwABOTsAATlrAAE6LAACwNgFqwABOT2DAAP0cAgAAAQPAAE5kwABOiwAAAAEBAcAATmwAAACD7mDAAEi9AABbAUrAAE51ARzAAE51LriGAQABgMAATobAIA6KAMAARKUGwABE/4DAwABOj8AATpvAAE7MAAC4cQFqwABOkGDAAP0cAgAAAQPAAE6lwABOzAAAAAEBAcAATq0AAACD7mDAAEjGAABbAUrAAE62ARzAAE62LriGAQABgMAATsfAIA7wAMAARKUGwABFAIDAwABO0cAATt3AAE8iAAC4cgFqwABO0mDAAP0cAgAAAQPAAE7xwABPIgAAAAEBAcAATwMAAACD7mDAAEqXAABbAUrAAE8MARzAAE8MLriGAQABgMAATx3AIA9WAMAARKUGwABFAYDAwABPJsAATzLAAE+HAAC4cwFqwABPJ2DAAP0cAgAAAQPAAE9LwABPhwAAAAEBAcAAT2IAAACD7mDAAEqgAABbAUrAAE9xARzAAE9xLriGAQABgMAAT4LAIA+8AMAARKUGwABFAoDAwABPjMAAT5jAAE/jAAC4dAFqwABPjWDAAP0cAgAAAQPAAE+vwABP4wAAAAEBAcAAT8QAAACD7mDAAEq9AABbAUrAAE/NARzAAE/NLriGAQABgMAAT97AIBAiAMAARKUGwABFA4DAwABP6MAAT/TAAFAnAAC4dQFqwABP6WDAAP0cAgAAAQPAAE//wABQJwAAAAEBAcAAUAgAAACD7mDAAErNAABbAUrAAFARARzAAFARLriGAQABgMAAUCLAIBCIAMAARKUGwABFBIDAwABQK8AAUDfAAFBmAAC4dgFqwABQLGDAAP0cAgAAAQPAAFBDwABQZgAAAAEBAcAAUE0AAACD7mDAAErb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wACtEMAgbDwAwAD9KUrAAK0XASo/ScAArSkhHMAArTMWwACtLS6Z98AARWlIAQABFsAArTyAwACtNsAgbDyZ98AARWkAwAD9KUrAAK1DARzAAK1QFsAArUoumffAAEVpuOwBAAEWwACtYIDAAK1awCBsPJn3wABFaQDAAEVcP07AAK16wACtggAAXmDAAEVhARbAAK2JLoOwwABFa0PAAK2TIRzAAK2igcAArZrAIGzkSAEAASsAwAD9KT4CScAArbMcwACtv4HAAK23wCBs5EgBAAGAwACtwsAgbDwAwAD9KUrAAK3JASk/PYnAAK3cwCBs5BbAAK3ugcAArebAIGzkg7DAAEVrSsAArf4BKgbAAEXrgMDAAK4TwACuIMAAsnQAALlWAAAAAQPAAK4rwACydAAAAAMDA8AArjkAAACkzGDAAE0PAMAArk8AAACCkGDAAGJPAMAArlkAAACCZ2DAAPvQAABgwABFYQE+CknAAK5lHMAArm6BwACuacAgbaxIAQABKwDAAP0pSsAArncBLj89icAArojAIG2sFsAArpSBwACuj8AgbayzwcAAYlFAIRbAAK9DgcAArz7AIG2so5PAAGJZwACvPcAAr1EAQCIWwACvZIHAAK9fwCBtrLImwABiUgEWwACvd4HAAK9ywCBtrLlXwABiWMAAr1/AAK+FAEnAAK+MFsAAr5WBwACvkMAgbayHeMAAYlRKwACvoAEuP0nAAK+xFsAAr7qBwACvtcAgbay5WMAAYlVKwACvwgEuP0nAAK/THMAAr9yBwACv18AgbaxIAQABFsAAr/oWwACv64DAAK/fwCBtnbL7wABNF4YKuFIAwAD9KUrAALAGAS4/ScAAsBciFsAAsCCBwACwG8Agbay5V8AAYlgBFsAAsDeBwACwMsAgbay5WcAAYls+AUrAALBLAR/AALBWwABJjwUABYHAALBmwCBtrILAALBswCBtuxbAALCcFsAAsIiAwACwfMAgbZ2weMAATRieYr3YLhbAALCvLqVOwABFZAA/QBbAALDZgcAAsNTAIG2ssxfAAGJWwACw1MAAsOgAScAAsO8iHMAAsPiCwACw88AgbbtIAQABasAAsQtgwAD70AkAwAD88wAhFsAAsR+BwACxGsAgbayyJsAAYlI+AT0wwACxMyTAALFsBSe5WoHAALFWwCBtrCe5Wy4ngyE+A07AALGPwACxnQAAuVxgwABidgEmwACxjwGBwACxn8AgbaxgwABidk7AALG5wACxwQAAmt5gvcsBHMAAse4WwACxz4DAALHDwCBtnbB4wABNGLT4AQABFsAAshKDwACyBMAgb+2WIMAAYngAvfdKwACyIgEfwACyLcAASY8FAAWBwACyPcAgbayCwACyQ8AgbbuEwACyScAgcBQuFsAAslgupU7AAEVkAAbAAEXsgMDAALLZwACy3sAAs1MAALldAAAAAQPAALLxwACzUwAAAAEBAcAAsv8AAACD1mDAAEVhAABgwAD6CgE+AUrAALMMARzAALMtFsAAsxkWwACzEy6Z98AARWm42sAART5IAQABFsAAszwWwACzNoDAALMwwCBwvpn3wABFabjawABFPgDAAP0pBsAARe2AwMAAs1jAALNrwACzkAAAIwFqwACzWWDAAP0cAgAAAQPAALNzwACzkAAAAAAAAABgwAD9tgFKwACzeQEkwACzkAIWwACzgS6FgMAA/TAnuV4AACBK9gAgS0QAIEuLACBLzAAgTBMAIEyvACBM9AAgTSwAIE1xACBNqQAgTg8AIE5zACBO1wAgTzsAIE+fACBQAwAgUGcAIFDLACBRLwAgUZMAIFH3ACBSWwAgUr8AIFMjACBThwAgU+sAIFRPACBUswAgVRcAIFV7ACBV3wAgVkMAIFanACBXCwAgV28AIFfTACBYNwAgWJsAIFj/ACBZNwAgWX4AIFm2ACBaCQAgXN0AIF5eACBeoQAgXugAIF8vACBfbQAgYP8AIGIvACBjUwAgZPkAIGVdACBnEgAgZ48AIGiDACBouwAgaPMAIGkrACBpYwAgaZsAIGnTACBqCwAgakMAIGp7ACBqswAgavoAIGuiACBr2gAgbBIAIG1zACBwlAAgcSAAIHF2AAAASgLAAEXwgMDAALPYwACz3sAAx4kDuV8AAAFgwAD9HAAAAwTAAEXzgMDAALQDwAC0Cgm5YMAARAkAYMAARWEABMAARfSAwMAAtI/AALSvCblhwABECQBdwAD8dAFgwABFYQExwAC0rWDAAEVhAATAAEX1gMDAALTDwAC01Qm5YsAARAkAXcAA/HQBYMAA+9ABMcAAtNNgwAD70AABBcAARgWAwMAAtNrAALTawAC09wCAtcAARAkAA8AAtOnAALT3AAAAAQEB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iSYAIIl3ACCJyQAgilMAIIqWACCK/gAgi0sAIIuvACCMAQAAAAkCwABGMIDAwADS58AA0vbAANQhB7l+AAABYMAARjcAAAABBcAARjaAwMAA0yLAANMiwADTiQAAAAPAANM0wADTiQAAAAICAsAA00kAAAC2nmC91gDAANNkAAAAglFdwAD8dAFgwABFYQAAYMAARjABPwEJAMAA03TAAEY8AgACgMAA03rAIIx1gcAA04LAIIyCAAMGwABGMoDAwADTjcAA057AANO0AQCFtAAAAAEDwADTqMAA07QAAAAAAAAAYMAARWEBSsAA06sBHMAA07EWwADTqy6CUcAARWdLAQABkwDAAPyDBsAARjOAwMAA07jAANPIwADT6QEAuX8AAAABA8AA09PAANPpAAAAAAAAAGDAAEUqAUrAANPWARzAANPmFsAA09wWwADT1i6Z98AARWm40MAARTdLAQABkwDAAPyDBsAARjSAwMAA0+3AANP9wADUHwEAuYAAAAABA8AA1AnAANQfAAAAAAAAAGDAAEUqAUrAANQMARzAANQcFsAA1BIWwADUDC6Z98AARWm40MAARTdLAQABlADAAPyDAAAgjMEAII0TACCNcAAgjc0AAAADAsAARjeAwMAA1CTAANQzwADV2ge5gQAAAWDAAEVhAAAAAQXAAEY8gMDAANRZwADUWcAA1YAAAAADwADUZcAA1YAAAAACAgLAANR6AAAAtp5gvdYAwADUlQAAAIJRXcAA/HQBYMAARWEAAGDAAEY3AT8BCQDAANVhwABF7wIAAoHAANVnwCCONhbAANV2gMAA1W/AII4ptO297QACBsAARjmAwMAA1YTAANWVwADVrAAAuTYBasAA1YVgwAD9HAIAAAEDwADVosAA1awAAAAAAAAAYMAA+goBSsAA1agBKQbAAEY6gMDAANWwwADVwcAA1dgAALlVAWrAANWxYMAA/RwCAAABA8AA1c7AANXYAAAAAAAAAGDAAPoKAUrAANXUASkAACCOfgAgjsEAII8EAAAAAgLAAEY9gMDAANYHwADWDcAA2tYDuYIAAAFgwABFYQAABATAAEY/gMDAANZAwADWRwmWIABgvKUABMAARkCAwMAA1qTAANavCbmDAGDAAPoKAATAAEZBgMDAANf/wADYEBi5hABdwAD8dAFgwABidgAEwABGQoDAwADYjMAA2JYYtAEAYLzMAAEFwABGSoDAwADYm8AA2JvAANmlAAAAA8AA2KLAANmlAAAABwQEwADYqAAABJYgYLylAMAA2MQAAACCUV3AAPx0AWDAAEVhAMAA2NoAAACCkGC9ywDAANj4AAAApU5gwABBxQADwADZFwAABLmEXcAA/HQBYMAAYnYBagBgwAD82XfAANkvAAAEuYNgwAD6CgFqwADZPGDAAPoKAMAA2UgAAAS0AWC8zAFqAGDAAPzZd2DAAEY9AT4BPRfAANl8LqVOg8AA2ZDAII/xwABFZAUIAcAARj+AAMAgj8IIAcAARkGEAMAgkAEIAcAARkCFAMAgkB4IAcAARkKGAMAgkDgJAMAA2V3AAEXvAgACgcAA2WPAII/PgsAA2WvAII/kAAQGwABGRIDAwADZqsAA2bvAANnrAAC5NAFqwADZq2DAAP0cAgAAAQPAANnHwADZ6wAAAAEBAcAA2dwAAAC2nmC91gAAYMAA+goBSsAA2ecBKQbAAEZIgMDAANnwwADaAcAA2j8BALmFAAAAAQPAANoKwADaPwAAAAAAAABgwABFYQE+AkAWwADaFy65g8AARkDAANoXwADaIgBKwADaKQEWwADaNxbAANowLoJRwABFZ4HowAD8WQbAAEZFgMDAANpEwADaUMAA2oUAAIRNAWrAANpFYMAA/RwCAAABA8AA2lbAANqFAAAAAQEBwADaYAAAAIcuXcAARAoBWwAAWwFKwADabAEcwADadIDAANpswCCRqLg4AQABLgDAAEQXBsAARkaAwMAA2orAANqdwADa1AAAIwFqwADai2DAAP0cAgAAAQPAANqlwADa1AAAAAAAAABgwAD9tgFKwADaqwEkwADa1AUnuYYWwADatS6WIMAARj8ngYsWwADawC65hMAARkEngyEAACCQvQAgkQ0AIJFzACCR2wAgkkMAAAAEAsAARkuAwMAA2xDAANsWwADcPQO5hwAAAWDAAEVhAAAAAQXAAEZRgMDAANs6wADbOsAA23gAAAADwADbRMAA23gAAAABAQHAANtTAAAAgpBgvcsAAGDAAEZLAT8BCQDAANtbwABF7wIAAjHAANtvYMAARWEAgMAA23PAIJKjAAMGwABGTYDAwADbfcAA247AANu+AAC5NAFqwADbfmDAAP0cAgAAAQPAANuawADbvgAAAAEBAcAA268AAAC2nmC91gAAYMAA+goBSsAA27oBKQbAAEZOgMDAANvDwADbz8AA3AcAAIRNAWrAANvEYMAA/RwCAAABA8AA29XAANwHAAAAAQEBwADb3wAAAIcuXcAARAoBWwAAWwFKwADb6wEcwADb84DAANvrwCCTYbg5AQABLgDAAEQYBsAARk+AwMAA3AzAANwfwADcOwAAIwFqwADcDWDAAP0cAgAAAQPAANwnwADcOwAAAAAAAABgwAD9tgFKwADcLQEnuYgAACCS3AAgkywAIJOUACCT2AAAAAMCwABGUoDAwADcQMAA3E/AAN8bB7mJAAABYMAARWEAAAMEwABGVYDAwADcdcAA3IoYuYrAAEQJAGDAAPoKASoEwABGVoDAwADdTcAA3WYYuYsAYMAA+goBKgTAAEZXgMDAAN4xwADeRQa5jABgwAD70AFqwADeRGDAAPvQFQEFwABGXYDAwADda8AA3WvAAN4cAAAAA8AA3XLAAN4cAAAAAgICwADdhgAAAIJRXcAA/HQBYMAARWEAwADdnAAAALmNYL3LAABgwABGUgE+Aj0cwADd3BbAAN3QLrQFwABFbLc8AAAAAMAAd989HMAA3gEWwADd9S60BcAARWy3PQAAAADAAHfhAQkAwADdsMAARe8CAAKAwADdtsAglJCBwADdvsAglKUAAwbAAEZZgMDAAN5KwADeW8AA3ocAALkzAWrAAN5LYMAA/RwCAAABA8AA3mPAAN6HAAAAAQEBwADeeAAAALaeYL3WAABgwAD6CgFKwADegwEpBsAARlqAwMAA3ozAAN6dwADe1gAAuTQBasAA3o1gwAD9HAIAAAEDwADeqcAA3tYAAAABAQHAAN6+AAAAtp5gvdYAAGDAAPoKAUrAAN7JARbAAN7JLrmKwABECcAARlUGwABGW4DAwADe28AA3uDAAN8ZAAC5jgAAAAEDwADe7cAA3xkAAAABAQHAAN7zAAAAgJZgwAD6CgAAXAE+AT0XwADfAC65isAARAmAwADfEMAgle7AAEZVAAAglRUAIJVlACCVxAAglhwAAAADAsAARl6AwMAA3x7AAN8twADnMwe5jwAAAWDAAEZSAAAFBMAARmCAwMAA32/AAN96CbmQAGDAAIWkAATAAEZhgMDAAN+TwADfmxik3gFqwADff2DAAP0cAmDAAEtIAATAAEZjgMDAAN+twADfuhi5kcAARAkAYL3LAATAAEZkgMDAAN/SwADf5wm5ksAARAkAYL3LAATAAEZlgMDAAN/4wADf/xiWIABgvLcAAQXAAEZzgMDAAOAEwADgBMAA4hcAAAADwADgEsAA4hcAAAAGBgbAAOAcAAAApN5gwABLSADAAOArAAAEuZFgvcsAwADgPwAABJYgYLy3AMAA4GEAAACCUV3AAPx0AWDAAEVhAMAA4G4AAAC5k2DAAPoKAMAA4IsAAAC5jWC9ywAAYMAARl4BPgNAIRzAAOHBhMAA4bPAIJdASAEAASsAwAD9KcAA4bPAAOHIAEAhHMAA4eQWwADh1i65kcAARAnAAEZjSAEAASsAwAD9KcAA4dbAAOHrAD0XwADh8i65i4TAAOIGwCCXQMAARlYGCAHAAEZjgQDAIJcRCAHAAEZlggDAIJceCADAAEZhgMAA4K/AIJcCCADAAEZkgcAA4N7AIJcRCADAAEZgI4TAAOEDwCCXQB7AAOE4wACFqwEAAYDAAOFKwCCXAgBqwADhaGDAAIWkwADsmAFgwACFpAkAwADhjMAARl0CAAKDwADhksAglyuFwADhmsAgl08ACgbAAEZngMDAAOIcwADiLsAA4ksBAIV8AAAAAQPAAOI7wADiSwAAAAAAAABgvcsBSsAA4j4BFsAA4j4uuZHAAEQJwABGYwbAAEZrgMDAAOJQwADiVcAA4w0AALmUAAAAAQPAAOJnwADjDQAAAAICAsAA4oMAAACweGC91gDAAOKmAAAAgJZgvcsAAFwBPgE9F8AA4rMuuZHAAEQJHMAA4t+AwADiy8AgmMmW/QIAAhbAAOLsLrmSwABECcAARmSBwADjA8AgmNYAviLAAEZjBsAARmyAwMAA4xLAAOMlwADjawAAIwFqwADjE2DAAP0cAgAAAQPAAOMtwADjawAAAAAAAABgwAD9tgFKwADjMwEkwADjawQnuZUWwADjTi6k3sAARmEnuZYWwADjXi6FfMAARmcGwABGaIDAwADjcMAA44HAAOOWAQCFeQAAAAEDwADjisAA45YAAAAAAAAAYMAARWEBSsAA440BHMAA45MWwADjjS6CUcAARWdLAQABkwDAAPyDBsAARm2AwMAA45vAAOO0wADkJwAAuTgBasAA45xgwAD9HAIAAAEDwADjw8AA5CcAAAABAQHAAOPRAAAApMxgwABNDwAAYMAARWEBPgFKwADj5AEjHMAA4+suuZcBAAGAwADj/8AgmhQAwABGbhzAAOQUFsAA5A4uglHAAEVnSwEAAZQAwAD8gxzAAOQgFsAA5BouglHAAEVnSwEAAZMAwAD8gwFgwABFYQbAAEZpgMDAAORowADke8AA5IgBAoUXAAAAAQPAAOSIwADkiAAAAAAAAABdwAD8dAFgwABiTwAGwABGboDAwADkysAA5M/AAOVGAAC5lwAAAAEDwADk4sAA5UYAAAABAQHAAOTwAAAApMxgwABNDwAAYMAA+goBPgFKwADlAwEiFsAA5QouuYvAAEZWABzAAOUoFsAA5R8uhXnAAEZotQ4BAAGAwADlNsAgmukAwABF5gbAAEZvgMDAAOVLwADlW8AA5Y0AALk9AWrAAOVMYMAA/RwCAAABA8AA5WPAAOWNAAAAAAAAAGDAAPvQAUrAAOVpAWrAAOV2YMAA+9CxvgbAAEZwgMDAAOWSwADlo8AA5c8AALk8AWrAAOWTYMAA/RwCAAABA8AA5a3AAOXPAAAAAQEBwADlrgAACIPWYMAARWEAAGDAAPoKAUrAAOW4ASXAAOW+gMAA5bjAIJu8YMAARl4GwABGcYDAwADl1MAA5eXAAOcxAAC5QAFqwADl1WDAAP0cAgAAAQPAAOXvwADnMQAAAAEBAcAA5f8AAAiD1mDAAEZeAABgwAD6CgE+AUrAAObSASIcwADm5xbAAObiFsAA5tkupN7AAEZhgL3AAEtWSAEAARbAAOb5FsAA5vCAwADm6sAgnCCk3sAARmGAvcAAS1YAwAD9xQAcwADnFxbAAOcSFsAA5wkupN7AAEZhgmfAAEtLSAEAARbAAOcpFsAA5yCAwADnGsAgnCCk3sAARmGCZ8AAS0sAwAD9KQAAIJhaACCYnwAgmSgAIJmNACCZ3wAgmogAIJq/ACCbOQAgm4cAIJvrACCcyAAAAAoCwABGdIDAwADnNsAA5zzAAOlRA7mYAAABYMAARl4AAAEEwABGdoDAwADnh8AA55QJhRcBasAA52dgwAD9HAJdwAD8dAFgwABiTwABBcAARnqAwMAA55nAAOeZwADpAwAAAAPAAOenwADpAwAAAAUFBcAA57EAAACk3mDAAEtIAMAA58kAAACFfGC9ywDAAOfwAAAAglFdwAD8dAFgwABFYQDAAOgGAAAAuY1gvcsAwADoFwAABIUXXcAA/HQBYMAAYk8AAGDAAEZ0AT4DQBbAAOiDgMAA6HrAIJ1qto3AAEtbwADoesAA6JAAQBzAAOjHFsAA6LUWwADop4DAAOiewCCdarRpwABLTZViwABon0gBAAEWwADo2BbAAOjKLoUXwABGdmHAAPyjAMAA/PPAAOiewADo3gBAIRbAAOjtLrmLwABGVsAA6OzAAOj+AAIIAcAARnaEAMAgnagJAMAA6C7AAEZzBgAGgMAA6DTAIJ1qgcAA6D7AIJ15K4LAAOhSwCCdhiqDwADoYcAgnZsAAQbAAEZ4gMDAAOkHwADpE8AA6U8AAIRNAWrAAOkIYMAA/RwCAAABA8AA6RnAAOlPAAAAAQEBwADpIwAAAIcuXcAARAoBWwAAWwFKwADpLwEcwADpN4DAAOkvwCCev7hIAQABLgDAAEQoAAAgnooAIJ7yAAAAAQLAAEZ7gMDAAOlUwADpWsAA7EcDuZkAAAFgwABGXgAAAQTAAEZ9gMDAAOmrwADpuAmFFwFqwADpi2DAAP0cAl3AAPx0AWDAAGJPAAEFwABGgoDAwADpvcAA6b3AAOuIAAAAA8AA6dHAAOuIAAAABwYGwADp4gAAAKTeYMAAS0gAwADqAAAAAIV8YL3LAMAA6icAAACCUV3AAPx0AWDAAEVhAMAA6kMAAAC5jWC9ywDAAOpaAAAEhRddwAD8dAFgwABiTwDAAOqBAAAApU5gwABBxQABwADqoAAAALmTYMAA+goBasAA6q9gwAD6CgBgwABGewE+Aj0XwADrES6lToXAAOslwCCfw8AARWRAHMAA62wWwADrWhbAAOtMgMAA60PAIJ9wtGnAAEtNlWLAAGifSAEAARbAAOt9FsAA628uhRfAAEZ9YcAA/KMAwAD888AA60PAAOuDAAIIAcAARn2EAMAgn64JAMAA6r/AAEZzBgAGgMAA6sXAIJ9wgcAA6s/AIJ9/K4LAAOrjwCCfjIbAAOrrwCCf04PAAOr6wCCfoQACBsAARn+AwMAA643AAOugwADr8wAAIwFqwADrjmDAAP0cAgAAAQPAAOuowADr8wAAAAAAAABgwAD9tgFKwADrtAEkwADr8wQnuZoWwADr1i6k3sAARmEnuZYWwADr5i6FfMAARmcGwABGgIDAwADr98AA7APAAOxFAACETQFqwADr+GDAAP0cAgAAAQPAAOwJwADsRQAAAAEBAcAA7BMAAACHLl3AAEQKAVsAAFsBSsAA7B8BHMAA7CeAwADsH8AgoTy4SgEAAS4AwABEKgAAIKCiACChBwAgoW8AAAACAsAARoOAwMAA7ErAAOxZwADuGQe5mwAAAWDAAEZeAAAAAQXAAEaHgMDAAOyIwADsiMAA7a0AAAADwADsm8AA7a0AAAAGBgbAAOysAAAApN5gwABLSADAAOzKAAAAhXxgvcsAwADs6wAAAJYgYLy3AMAA7Q0AAACCUV3AAPx0AWDAAEVhAMAA7SAAAAC5k2DAAPoKAMAA7UMAAAC5jWC9ywAAYMAARoMBPwEJAMAA7VfAAEZzBgAGgMAA7WrAIKHHgcAA7XTAIKHWgsAA7YLAIKHjg8AA7YvAIKHwhMAA7ZPAIKIFhcAA7aLAIKIUAAEGwABGhYDAwADtssAA7cXAAO4XAAAjAWrAAO2zYMAA/RwCAAABA8AA7c3AAO4XAAAAAAAAAGDAAP22AUrAAO3ZASTAAO4XBCe5nBbAAO36LqTewABGYSe5lhbAAO4KLoV8wABGZwAAIKJvACCi1AAAAAECwABGiIDAwADuHMAA7iLAAPIPA7mdAAABYMAARoMAAAABBcAARpGAwMAA7lfAAO5XwADv3AAAAAPAAO5rwADv3AAAAAcHB8AA7nwAAACk3mDAAEtIAMAA7poAAACFfGC9ywDAAO67AAAAliBgvLcAwADu3QAAAIJRXcAA/HQBYMAARWEAwADu8AAAALmTYMAA+goAwADvEwAAALmNYL3LAMAA7zcAAAClTmDAAEHFAABgwABGiAE+AT0XwADvsy6lTobAAO/HwCCjgsAARWQBCQDAAO9SwABGhwYABoDAAO9YwCCjKIHAAO9iwCCjN4LAAO9wwCCjRIPAAO95wCCjUYTAAO+BwCCjZoXAAO+cwCCjdQAFBsAARoqAwMAA7+HAAO/twADwLwAAhE0BasAA7+JgwAD9HAIAAAEDwADv88AA8C8AAAABAQHAAO/9AAAAhy5dwABECgFbAABbAUrAAPAJARzAAPARgMAA8AnAIKQruEkBAAEuAMAARCkGwABGjoDAwADwNMAA8D3AAPBvAQC5ngAAAAEDwADwR8AA8G8AAAAAAAAAYMAA+goBSsAA8EoBIiEcwADwUhbAAPBKLpYgwABGZUgBAAErAMAA/SkAFsAA8GUWwADwXS6WIMAARmWyfLy/BsAARo+AwMAA8HTAAPCTwADwtgEAhRcBasAA8HVgwAD9HAIAAAEDwADwocAA8LYAAAAAAAAAXcAA/HQBYMAAYk8BSsAA8KQBasAA8KRdwAD8dAFgwABiT8AA7J8GwABGi4DAwADxDMAA8R3AAPGiAAC5MwFqwADxDWDAAP0cAgAAAQPAAPElwADxogAAAAEBAcAA8ToAAAC2nmC91gAAYMAA+goBSsAA8UUBIxbAAPFFLrmewABGjhbAAPFyHMAA8WMWwADxXhbAAPFXLoJRwABFZ4HowAD8WaxpAQABgMAA8WrAIKVZAMAARa+yYL26HcAA8ZK5MwEAAYDAAPGbwCClWQDAAEZZAWDAAPoKBsAARoyAwMAA8afAAPG6wADyDQAAIwFqwADxqGDAAP0cAgAAAQPAAPHCwADyDQAAAAAAAABgwAD9tgFKwADxzgEkwADyDQQnuZ8WwADx8C6k3sAARmEnuZYWwADyAC6FfMAARmcAACCj9gAgpF4AIKTIACClJAAgpdYAIKY7AAAABQLAAEaSgMDAAPISwADyGMAA9dcDuaAAAAFgwABGgwAAAQTAAEaUgMDAAPLEwADy1hi5oQBgwAD6CgEqAQXAAEabgMDAAPLbwADy28AA9L4AAAADwADy78AA9L4AAAAHBwfAAPMAAAAApN5gwABLSADAAPMeAAAAhXxgvcsAwADzPwAAAJYgYLy3AMAA82EAAACCUV3AAPx0AWDAAEVhAMAA83QAAAC5k2DAAPoKAMAA8/UAAAC5jWC9ywDAAPQZAAAApU5gwABBxQAAYMAARpIBPgE9F8AA9JUupU6GwAD0qcAgpxPAAEVkAQkAwAD0NMAARocGAAaAwAD0OsAgprmBwAD0RMAgpsiCwAD0UsAgptWDwAD0W8AgpuKEwAD0Y8AgpveFwAD0fsAgpwYAAwbAAEaWgMDAAPTDwAD0z8AA9REAAIRNAWrAAPTEYMAA/RwCAAABA8AA9NXAAPURAAAAAQEBwAD03wAAAIcuXcAARAoBWwAAWwFKwAD06wEcwAD084DAAPTrwCCnvLhLAQABLgDAAEQrBsAARpmAwMAA9RbAAPU1wAD1WAEAhRcBasAA9RdgwAD9HAIAAAEDwAD1Q8AA9VgAAAAAAAAAXcAA/HQBYMAAYk8BSsAA9UYBasAA9UZdwAD8dAFgwABiT8AA7J8GwABGl4DAwAD1XcAA9XDAAPXVAAAjAWrAAPVeYMAA/RwCAAABA8AA9XjAAPXVAAAAAAAAAGDAAP22AUrAAPWEASTAAPXVBie5ohbAAPWmLqTewABGYSe5lhbAAPW2LoV8wABGZye5oxbAAPXNLpYgwABGZQAAIKeHACCn7wAgqEsAIKi/AAAAAwLAAEacgMDAAPXawAD14MAA+hIDuaQAAAFgwABGUgAABATAAEaegMDAAPYVwAD2HAmWIABgvLcABMAARp+AwMAA9nHAAPZ+CYUXAF3AAPx0AWDAAGJPAATAAEaggMDAAPaOwAD2nAm5pQBgwAD6CgAEwABGoYDAwAD4LsAA+D8YuYQAXcAA/HQBYMAAYnYBKwEFwABGqIDAwAD4bsAA+G7AAPk/AAAAA8AA+HvAAPk/AAAABgQEwAD4gQAABJYgYLy3AMAA+IoAAACCUVsAwAD4oAAAAIKQYL3LAMAA+KsAAASFF13AAPx0AWDAAGJPAALAAPjGAAAEuaVgwAD6CgFqwAD41mDAAPoKdcAA+OEAAAC5k2DAAPoKAWrAAPjwYMAA+goAYMAARpwBPgE9F8AA+RouuYuFwAD5LsAgqd/AAEZWBAgBwABGnoAAwCCpiggBwABGn4MAwCCprwgBwABGoIQAwCCpxQkAwAD5AMAARl0CAAImwAD5BgGBwAD5BsAgqZddwAD8dAFgwABFYYLAAPkOwCCpogAEBsAARqOAwMAA9qHAAPaywAD26AAAuTMBasAA9qJgwAD9HAIAAAEDwAD2usAA9ugAAAABAQHAAPbPAAAAtp5gvdYAAGDAAPoKAUrAAPbaARbAAPbaLrmlwABGoAbAAEakgMDAAPlEwAD5UMAA+YsAAIRNAWrAAPlFYMAA/RwCAAABA8AA+VbAAPmLAAAAAQEBwAD5YAAAAIcuXcAARAoBWwAAWwFKwAD5bAEcwAD5dIDAAPlswCCq/rhMAQABLgDAAEQsBsAARqWAwMAA+ZDAAPmgwAD50QAAuT0BasAA+ZFgwAD9HAIAAAEDwAD5qMAA+dEAAAAAAAAAYMAA+9ABSsAA+a4BasAA+btgwAD70MAAYzQGwABGpoDAwAD51sAA+enAAPoQAAAjAWrAAPnXYMAA/RwCAAABA8AA+fHAAPoQAAAAAAAAAGDAAP22AUrAAPn3ASTAAPoQAie5phbAAPoILpYgwABGngAAIKpuACCqyQAgqzEAIKuBACCr1wAAAAQCwABGqYDAwAD6FcAA+hvAAP8KA7mnAAABYMAARpwAAAMEwABGq4DAwAD6i8AA+pEJuagAYLylAATAAEasgMDAAPqgwAD6qAmFLwBgwAD6CgAEwABGrYDAwAD6x8AA+s8JpN4BasAA+q1gwAD9HAJgwABLSAABBcAARreAwMAA+tTAAPrUwAD8cwAAAAPAAPrgwAD8cwAAAAkICMAA+vUAAACWIGC8twDAAPsJAAAEuahgvKUAwAD7HAAABKTeYMAAS0gAwAD7PwAAAIJRXcAA/HQBYMAARWEAwAD7UgAAALmTYMAA+goAwAD7dQAAAIKQYL3LAMAA+5AAAACFF13AAPx0AWDAAGJPAMAA+7cAAAClTmDAAEHFAAHAAPvWAAAEhS9gwAD6CgFqAGDAAPzZd2DAAEapAT4BPRfAAPxKLqVOh8AA/F7AIKz6wABFZAQIAcAARquBAMAgrJgIAcAARq2CAMAgrKUIAcAARqwUAMAgrQoIAAkAwAD76cAARqgFAASAwAD778AgrIuDwAD7+MAgrLSFwAD8AMAgrNiGwAD8BsAgrOUBuZOEwAD8MMAgrMkGBsAARq+AwMAA/HjAAPyJwAD8ngEAhXkAAAABA8AA/JLAAPyeAAAAAAAAAGDAAEVhAUrAAPyVARzAAPybFsAA/JUuglHAAEVnSwEAAZMAwAD8gwbAAEaygMDAAPyiwAD8u8AA/S4AALk4AWrAAPyjYMAA/RwCAAABA8AA/MrAAP0uAAAAAQEBwAD82AAAAKTMYMAATQ8AAGDAAEVhAT4BSsAA/OsBIxzAAPzyLrmXAQABgMAA/QbAIK4rAMAARrMcwAD9GxbAAP0VLoJRwABFZ0sBAAGUAMAA/IMcwAD9JxbAAP0hLoJRwABFZ0sBAAGTAMAA/IMBYMAARWEGwABGs4DAwAD9cMAA/XXAAP3sAAC5lwAAAAEDwAD9iMAA/ewAAAABAQHAAP2WAAAApMxgwABNDwAAYMAA+goBPgFKwAD9qQEiFsAA/bAuuYvAAEZWABzAAP3OFsAA/cUuhXnAAEavtQ4BAAGAwAD93MAgrskAwABF5gbAAEa0gMDAAP3xwAD9/cAA/iMAACMBasAA/fJgwAD9HAIAAAEDwAD+BcAA/iMAAAAAAAAAYMAA/bYBSsAA/gsBJMAA/iMCJ7mpFsAA/hsuliDAAEaeBsAARrWAwMAA/ifAAP4zwAD+bQAAhE0BasAA/ihgwAD9HAIAAAEDwAD+OcAA/m0AAAABAQHAAP5DAAAAhy5dwABECgFbAABbAUrAAP5PARzAAP5XgMAA/k/AIK+kuE0BAAEuAMAARC0GwABGsIDAwAD+csAA/oPAAP8IAQCAlgAAAAEDwAD+icAA/wgAAAAAAAAAYMAARWEBPgJAFsAA/pYuhS/AAEaswAD+lsAA/p4ASsAA/vIBFsAA/wAWwAD++S6CUcAARWeB6MAA/FkAACCtpAAgrfYAIK6fACCvGQAgr28AIK/XACCwPQAAAAYCwABGuIDAwAD/DcAA/xPAAQFqA7mqAAABYMAARpwAAAABBcAARr2AwMAA/7TAAP+0wAEAxAAAAAPAAP/KwAEAxAAAAAQEBMAA/+gAAACWIGC86wDAAQAKAAAAglFdwAD8dAFgwABFYQDAAQAmAAAAgpBgvcsAwAEARAAAAKVOYMAAQcUAAGDAAEa4AT4BPRfAAQCbLqVOg8ABAK/AILDUwABFZAEJAMABAF/AAEaoBAAEgMABAGXAILClgcABAG7AILCygsABAHbAILDHasABAHxdwAD8dAFgwABiT8AA7J8AAgbAAEa6gMDAAQDJwAEA3MABARQAACMBasABAMpgwAD9HAIAAAEDwAEA5MABARQAAAAAAAAAYMAA/bYBSsABAOoBJMABARQCJ7mrFsABAQ4WwAEBBi6WIMAARp6AvbyTBsAARruAwMABARjAAQEkwAEBaAAAhE0BasABARlgwAD9HAIAAAEDwAEBKsABAWgAAAABAQHAAQE0AAAAhy5dwABECgFbAABbAUrAAQFAARzAAQFIgMABAUDAILHVuE4BAAEuAMAARC4AACCxQQAgsaAAILIIAAAAAgLAAEa+gMDAAQFtwAEBc8ABBOEDuawAAAFgwABGnAAAAAEFwABGw4DAwAEDTMABA0zAAQRAAAAAA8ABA2DAAQRAAAAABAQEwAEDcAAAAJYgYLzMAMABA4wAAACCUV3AAPx0AWDAAEVhAMABA6gAAACCkGC9ywDAAQPAAAAApU5gwABBxQAAYMAARr4BPgE9F8ABBBcupU6DwAEEK8Agso/AAEVkAQkAwAED28AARqgEAASAwAED4cAgsmCBwAED6sAgsm2CwAED8sAgsoJqwAED+F3AAPx0AWDAAGJPwADsnwACBsAARsCAwMABBEXAAQRYwAEEjQAAIwFqwAEERmDAAP0cAgAAAQPAAQRgwAEEjQAAAAAAAABgwAD9tgFKwAEEZgEkwAEEjQMnua0WwAEEhhbAAQR+LpYgwABGnoC9vJMngyEGwABGwYDAwAEEkcABBJ3AAQTfAACETQFqwAEEkmDAAP0cAgAAAQPAAQSjwAEE3wAAAAEBAcABBK0AAACHLl3AAEQKAVsAAFsBSsABBLkBHMABBMGAwAEEucAgs5O4TwEAAS4AwABELwAAILL8ACCzXgAgs8YAAAACAsAARsSAwMABBOTAAQTzwAEFyQe5rgAAAWDAAEVhAAABBMAARsaAwMABBSvAAQUyCZYgAGC8yQABBcAARsqAwMABBTfAAQU3wAEFnAAAAAPAAQVDwAEFnAAAAAMDA8ABBUkAAASWIGC8yQDAAQVlAAAAglFdwAD8dAFgwABFYQDAAQV7AAAAgpBgvcsAAGDAAEbEAT8CCAHAAEbGgADAILQ1CQDAAQWJwABF7wIAAoHAAQWPwCC0QoLAAQWXwCC0VwABBsAARsiAwMABBaHAAQWywAEFxwEAhXkAAAABA8ABBbvAAQXHAAAAAAAAAGDAAEVhAUrAAQW+ARzAAQXEFsABBb4uglHAAEVnSwEAAZMAwAD8gwAAILSaACC07AAAAAECwABGy4DAwAEFzMABBdLAAQyGA7mvAAABYMAARsQAAAEEwABGzYDAwAEGAMABBgwJqz4AYMAA+goAAQXAAEbbgMDAAQYRwAEGEcABCCwAAAADwAEGGsABCCwAAAAFBATAAQYnAAAAliBgvMkAwAEGPQAAAIV5YMAARWEAwAEGVQAAAIKQYL3LAMABBnMAAAClTmDAAEHFAAHAAQaSAAAAqz5gwAD6CgFqAGDAAPzZd2DAAEbLAT4FPRfAAQdJLqVOg8ABB13AILWCwABFZD0cwAEHgBbAAQd0LrQFwABFbLmwAAAAAMAAd+A9HMABB6cWwAEHmy60BcAARWy5sQAAAADAAHfiPRzAAQfDLrkuAAAAAMAARahJwAEH1BbAAQfdLqs+wABGzT4BPRzAAQf/FsABB/MutAXAAEVstzoAAAAAwAB38D8CCADAAEbNIyEcwAEG14TAAQbKwCC1kkgBAAErAMAA/SmEwAEG4sAgtZIWwAEG+YDAAQbxwCC1Was+vMIBYMAA+goJAMABBw/AAEbKAwADgMABBxXAILVZMcABByxgwABFYQGBwAEHLcAgtWaCwAEHOMAgtXUACgbAAEbPgMDAAQgxwAEIQsABCgQAALUOAWrAAQgyYMAA/RwCAAABA8ABCE/AAQoEAAAAAQEBwAEIXQAAAKTMYMAATQ8AAGDAAPoKAT4DScABCHAcwAEIghbAAQh0LqVNwABFY0gBAAErAMAA/SlKwAEIiwEqP0nAAQk7JcABCU0WwAEJPy6lTcAARWNgwACFMT4CTsABCW3AAQl3AAC5smDAAIUxASbAAQltARbAAQl5LqVNwABFY2DAAIUxSsABCY4BHMABCbwWwAEJoYDAAQmVwCC27LdzwABNFLmzAQABFsABCdmBwAEJz8Agt0qE+cAAhTMAwAB53T9KwAEJ9AEqBsAARtCAwMABCgnAAQoawAEKcQAAuTMBasABCgpgwAD9HAIAAAEDwAEKIsABCnEAAAABAQHAAQo3AAAAtp5gvdYAAGDAAPoKAUrAAQpIARbAAQpgHMABClEWwAEKSC6FecAARsisaQEAAYDAAQpYwCC37QDAAEWvsmC9ugbAAEbRgMDAAQp2wAEKj8ABCsQAALk4AWrAAQp3YMAA/RwCAAABA8ABCp7AAQrEAAAAAQEBwAEKrAAAAKTMYMAATQ8AAGDAAEVhAUrAAQq8ARbAAQq8LoV5wABGyAbAAEbSgMDAAQrIwAEK2cABCvAAALk5AWrAAQrJYMAA/RwCAAABA8ABCubAAQrwAAAAAAAAAGDAAPoKAUrAAQrsASkGwABG2YDAwAEK9MABCv3AAQsbAQC5tAAAAAEDwAELCcABCxsAAAAAAAAAYMAA+goBSsABCwwBHMABCxQWwAELDC6WIMAARsZIAQABKwDAAP0pBsAARtOAwMABCyDAAQsswAELYwAAhE0BasABCyFgwAD9HAIAAAEDwAELMsABC2MAAAABAQHAAQs8AAAAhy5dwABECgFbAABbAUrAAQtIARzAAQtQgMABC0jAILlbuD0BAAEuAMAARBwGwABG1IDAwAELaMABC3jAAQulAAC5PQFqwAELaWDAAP0cAgAAAQPAAQuAwAELpQAAAAAAAABgwAD70AFKwAELhgFqwAELk2DAAPvQwABkIAbAAEbVgMDAAQupwAELusABC+EAALk8AWrAAQuqYMAA/RwCAAABA8ABC8TAAQvhAAAAAQEBwAELxQAACIPWYMAARWEAAGDAAPoKAUrAAQvPASXAAQvVgMABC8/AILoTYMAARssGwABG1oDAwAEL5cABC/bAAQwtAAC5QAFqwAEL5mDAAP0cAgAAAQPAAQwAwAEMLQAAAAEBAcABDAsAAAiD1mDAAEbLAABgwAD6CgFKwAEMFQEcwAEMHRbAAQwVLpYgwABGxkgBAAEWwAEMJoDAAQwgwCC6d5YgwABGxgDAAP0pBsAARteAwMABDDHAAQxEwAEMhAAAIwFqwAEMMmDAAP0cAgAAAQPAAQxMwAEMhAAAAAAAAABgwAD9tgFKwAEMUgEkwAEMhAUnubUWwAEMZS6WIMAARsYnubYWwAEMcy65K8AARaEngyEAACC2twAgt7gAILg0ACC4kQAguNQAILkmACC5jgAgud4AILpCACC6wQAguykAAAAKAsAARtyAwMABDInAAQyPwAEQBwO5twAAAWDAAEbEAAAAAQXAAEbngMDAAQyywAEMssABDekAAAADwAEMu8ABDekAAAAEBATAAQzQAAAAtp5gvdYAwAEM5AAAAJYgYLzJAMABDQAAAACFeWDAAEVhAMABDRcAAACAlmDAAEVhAABgwABG3AE+Az0cwAENehbAAQ1uLrQFwABFbLmwAAAAAMAAd+A9HMABDaEWwAENlS60BcAARWy5sQAAAADAAHfiPRzAAQ3JFsABDb0utAXAAEVstzsAAAAAwAB38gEJAMABDSbAAEbKAwADgcABDSzAILuuMcABDUNgwABFYQKCwAENRMAgu7uDwAENTsAgu8oWwAENXYDAAQ1WwCC7obTtve0ABwbAAEbegMDAAQ3uwAEN/8ABDlYAALkzAWrAAQ3vYMAA/RwCAAABA8ABDgfAAQ5WAAAAAQEBwAEOHAAAALaeYL3WAABgwAD6CgFKwAEOLQEWwAEORRzAAQ42FsABDi0uhXnAAEbIrGkBAAGAwAEOPcAgvLMAwABFr7JgvboGwABG34DAwAEOW8ABDnTAAQ6pAAC5OAFqwAEOXGDAAP0cAgAAAQPAAQ6DwAEOqQAAAAEBAcABDpEAAACkzGDAAE0PAABgwABFYQFKwAEOoQEWwAEOoS6FecAARsgGwABG4IDAwAEOrcABDr7AAQ7VAAC5OQFqwAEOrmDAAP0cAgAAAQPAAQ7LwAEO1QAAAAAAAABgwAD6CgFKwAEO0QEpBsAARuWAwMABDtrAAQ7rwAEO/QEAgJYAAAABA8ABDvHAAQ79AAAAAAAAAGDAAEVhAUrAAQ70ARzAAQ76FsABDvQuglHAAEVnSwEAAZQAwAD8gwbAAEbhgMDAAQ8BwAEPDcABD0QAAIRNAWrAAQ8CYMAA/RwCAAABA8ABDxPAAQ9EAAAAAQEBwAEPHQAAAIcuXcAARAoBWwAAWwFKwAEPKQEcwAEPMYDAAQ8pwCC+Ibg+AQABLgDAAEQdBsAARuKAwMABD3vAAQ+MwAEPrQAAuVUBasABD3xgwAD9HAIAAAEDwAEPmcABD60AAAAAAAAAYMAA+goBSsABD58BFsABD6YWwAEPny64xsAARWiBVcAA/FYGwABG44DAwAEPssABD8XAARAFAAAjAWrAAQ+zYMAA/RwCAAABA8ABD83AARAFAAAAAAAAAGDAAP22AUrAAQ/TASTAARAFBSe5uBbAAQ/mLpYgwABGxie5thbAAQ/0LrkrwABFoSeDIQAAILx+ACC8+gAgvVcAIL2aACC97AAgvlQAIL6tACC/FQAAAAcCwABG6IDAwAEQCsABEBDAARQEA7m5AAABYMAARWEAAAEEwABG6oDAwAEQP8ABEEsJqz4AYMAA+goAAQXAAEb3gMDAARBPwAEQT8ABEbMAAAADwAEQWcABEbMAAAADAgLAARBnAAAAhXlgwABFYQDAARB/AAAAgpBgvcsAAcABEJYAAASrPmDAAPoKAWoAYMAA/Nl3YMAARugBPgVAIRzAARDtFsABEOAuqz7AAEbqSAEAASsAwAD9KcABEODAARD0AD0cwAERBxbAARD7LrQFwABFbLmwAAAAAMAAd+A9HMABES4WwAERIi60BcAARWy5sQAAAADAAHfiPRzAARFKLrkuAAAAAMAARahJwAERWxbAARFkLqs+wABG6j4BPRzAARGGFsABEXoutAXAAEVstzoAAAAAwAB38D8CCAHAAEbqggDAIL+3CQDAARCtwABF7wIAAjHAARDBYMAARWEBgMABEMLAIL+agcABEM3AIL+pAAkGwABG7IDAwAERuMABEcnAARHiAQCFeQAAAAEDwAER0sABEeIAAAAAAAAAYMAARWEBSsABEdUBFsABEdwWwAER1S6CUcAARWeAw8AA/FoGwABG7oDAwAER58ABEfjAARJPAAC5MwFqwAER6GDAAP0cAgAAAQPAARIAwAESTwAAAAEBAcABEhUAAAC2nmC91gAAYMAA+goBSsABEiYBFsABEj4cwAESLxbAARImLoV5wABG7KxpAQABgMABEjbAIMExAMAARa+yYL26BsAARu+AwMABElTAARJtwAESogAAuTgBasABElVgwAD9HAIAAAEDwAESfMABEqIAAAABAQHAARKKAAAApMxgwABNDwAAYMAARWEBSsABEpoBFsABEpouhXnAAEbsBsAARvCAwMABEqbAARK3wAESzgAAuTkBasABEqdgwAD9HAIAAAEDwAESxMABEs4AAAAAAAAAYMAA+goBSsABEsoBKQbAAEbxgMDAARLTwAES38ABExcAAIRNAWrAARLUYMAA/RwCAAABA8ABEuXAARMXAAAAAQEBwAES7wAAAIcuXcAARAoBWwAAWwFKwAES+wEcwAETA4DAARL7wCDCTbhAAQABLgDAAEQfBsAARvKAwMABExzAARMswAETWgAAuT0BasABEx1gwAD9HAIAAAEDwAETNMABE1oAAAAAAAAAYMAA+9ABSsABEzoBasABE0dgwAD70MAAQe8GwABG84DAwAETXsABE2/AAROXAAC5PAFqwAETX2DAAP0cAgAAAQPAARN5wAETlwAAAAEBAcABE3oAAAiD1mDAAEVhAABgwAD6CgFKwAEThAElwAETioDAAROEwCDDBWDAAEboBsAARvSAwMABE5vAAROswAET0AAAuUABasABE5xgwAD9HAIAAAEDwAETtsABE9AAAAABAQHAARPCAAAIg9ZgwABG6AAAYMAA+goBSsABE8wBKQbAAEb1gMDAARPUwAET58ABFAIAACMBasABE9VgwAD9HAIAAAEDwAET78ABFAIAAAAAAAAAYMAA/bYBSsABE/UBJ7m6AAAgwK4AIMD8ACDBeAAgwdUAIMIYACDCgAAgwtAAIMM0ACDDhgAgw8oAAAAJAsAARviAwMABFJHAARSXwAEbgQO5uwAAAWDAAEYPAAAGBMAARvqAwMABFNLAARTfBrm8AGDAAPvQAWrAARTeYMAA+9AJBMAARvuAwMABFPDA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jAAAAAAAAABgwABmtAFKwAEgiAErBsAARy+AwMABIJHAASCiwAEhGAAAuTMBasABIJJgwAD9HAIAAAEDwAEgqsABIRgAAAABAQHAASC/AAAAtp5gvdYAAGDAAPoKAT4BSsABIM0BIhzAASDgFsABINQutAXAAEVsuTEAAAAAwAB33QEcwAEhABbAASD0LrQFwABFbLkyAAAAAMAAd94AACDR/QAg0jUAINJtACDS9gAAAAMCwABHMoDAwAEhHcABISPAASqJA7nNAAABYMAARyoAAAUEwABHNIDAwAEhV8ABIWMJuc4AYMAAmO0ABMAARzWAwMABIX7AASGJCbnMAWrAASFoYMAA/RwCYMAA+goABMAARzaAwMABIa7AASG8Ca8EAWrAASGOYMAA/RwCYMAAZrQABMAARzeAwMABIdTAASHhGLnPAGDAAGacAATAAEc4gMDAASH6wAEiCQm50ABgvMwAAgXAAEdEgMDAASIOwAEiDsABJWQAAAADwAEiGsABJWQAAAAIAwPAASIgAAAEuc5gwACY7QDAASI8AAAAgpBgvcsAwAEiVQAAAIJRXcAA/HQBYMAARWEABcABImkAAAS5zGDAAPoKAWrAASJ2YMAA+goAwAEijwAAALnRYMAAd8UBagBgwAD82XfAASKtAAAArwRgwABmtAFqAGDAAPzZd8ABItcAAAC5z2DAAGacAWoAYMAA/Nl3wAEi8QAABLnQYLzMAWoAYMAA/Nl3YMAARzIBPgZAIRzAASOTFsABI4Yuuc7AAEc0SAEAASsAwAD9KcABI4bAASOaAEnAASOhIhzAASOthMABI6XAINQvSAEAASsAwAB31gAhHMABI8eFwAEjuMAg1EZIAQABKwDAAP0pPgE9jMABI9jAINQvFsABI/GFwAEj4sAg1Ea0BcAAZrs/ScABJAgcwAEkHxbAASQRLrnPwABHN0gBAAErAMAA/Sk+AT0XwAEkNS65zyMcwAEkVYXAASRGwCDURkgBAAErAMAA/SlqwAEkfmDAAGacwADsphbAASSdhcABJI7AINRGuc/AAGa8AWDAAGacwABHNz9AIRzAASTQFsABJMIuuc/AAEc3SAEAASsAwAD9KcABJL3AASTXAEnAASTfIRzAASTrhMABJOPAINQvSAEAASsAwAB31j0cwAElABbAAST0LrQFwABFbFYBAAGEwAElBMAg1C8AwAB39z9JwAElEiIhHMABJSWFwAElFsAg1EZIAQABKwDAAP0pABbAASU/hcABJTDAINRGuS3AAGa+PgE9HMABJU8uuS4AAAAAwABFqD8GCAHAAEc0gADAINPjCAHAAEc1gwDAINQVCAHAAEc4hwDAINR0CADAAEc2hcABIyHAINRGCADAAEc3hsABI07AINRdCQDAASNlwABHMQIAAoHAASNrwCDT8oLAASNxwCDT/wAFwABHRYDAwAElacABJWnAASaUAIVLAAPAASV/wAEmlAAAAAUFBcABJYwAAAC5zmDAAJjtAMABJa0AAACCUV3AAPx0AWDAAEVhAMABJccAAAC50WDAAHfFAMABJd8AAACvBGDAAGa0AMABJf0AAACCkGC9ywAAYMAARzIBPwEKAMABJgvAAEdEBgADgMABJhDAINa7hMABJh7AINb9gcABJiTAINbKA7nMKbnRgsABJmDAINbfrwSDwAEmhcAg1u4JBsAARzqAwMABJpnAASalwAEm3wAAhE0BasABJppgwAD9HAIAAAEDwAEmq8ABJt8AAAABAQHAASa1AAAAhy5dwABECgFbAABbAUrAASbBARzAASbJgMABJsHAINeLuD8BAAEuAMAARB4GwABHO4DAwAEm5MABJvXAAScTAAC5VQFqwAEm5WDAAP0cAgAAAQPAAScCwAEnEwAAAAAAAABgwAD6CgFKwAEnCAEWwAEnCC65zMAARzUGwABHPIDAwAEnF8ABJyjAASgjAAC5MwFqwAEnGGDAAP0cAgAAAQPAAScwwAEoIwAAAAEBAcABJ0UAAAC2nmC91gAAYMAA+goBPgJJwAEnUxzAASdlFsABJ14WwAEnVy6CUcAARWdhwAD8o4CXAQABkwDAAPz/PgFKwAEncgEjFsABJ5UcwAEnhhbAASeAFsABJ3kuglHAAEVngxnAAPxYrGkBAAGAwAEnjcAg2EEAwABFr7JgvboWwAEnwRbAASezLrnPwABHN7kzwABmphbAASfuFsABJ+QWwAEn1i65z8AARze50sAAZqm5M8AAZqYBYMAA+go/SsABKAIBFsABKBcWwAEoCS65z8AARze5M8AAZqYGwABHPYDAwAEoKMABKDnAAShsAAC5OQFqwAEoKWDAAP0cAgAAAQPAAShGwAEobAAAAAAAAABgwAD6CgFKwAEoTAEWwAEoWhbAAShMLrnPwABHN7nTwABmqAbAAEc+gMDAAShxwAEogsABKRkAALk0AWrAAShyYMAA/RwCAAABA8ABKI7AASkZAAAAAQEBwAEoowAAALaeYL3WAABgwAD6CgFKwAEotAEiIiEcwAEowxbAASi0Lq8EwABHNkgBAAErAMAA/SkAFsABKOMWwAEo1C6vBMAARza5NMAAZr0AFsABKQgcwAEo+S6saQEAAYDAASkAwCDZrgDAAEWvtNW9uwbAAEc/gMDAASkewAEpLsABKV4AALk9AWrAASkfYMAA/RwCAAABA8ABKTbAASleAAAAAAAAAGDAAPvQAUrAASk8AWrAASlJYMAA+9CxGgbAAEdAgMDAASliwAEpc8ABKZ0AALk8AWrAASljYMAA/RwCAAABA8ABKX3AASmdAAAAAQEBwAEpfgAACIPWYMAARWEAAGDAAPoKAUrAASmIASXAASmOgMABKYjAINqkYMAARzIGwABHQYDAwAEpocABKbLAASo5AAC5QAFqwAEpomDAAP0cAgAAAQPAASm8wAEqOQAAAAEBAcABKcoAAAiD1mDAAEcyAABgwAD6CgE+AUrAASnXASIhHMABKfIWwAEp6xbAASneLrnOwABHNINEwACY70gBAAErAMAA/cUAHMABKhkWwAEqEhbAASoFLrnOwABHNINEwACY70gBAAEWwAEqLxbAASoigMABKhzAINsIuc7AAEc0g0TAAJjvAMAA/cUGwABHQoDAwAEqPsABKlHAASqHAAAjAWrAASo/YMAA/RwCAAABA8ABKlnAASqHAAAAAAAAAGDAAP22AUrAASpfASTAASqHAye51BbAASp9FsABKnAuuc7AAEc0g0TAAJjvJ7nVAAAg11YAINe+ACDYDAAg2SAAINl5ACDaIQAg2m8AINrTACDbkwAg2/cAAAAJAsAAR0aAwMABKozAASqbwAEsXQe51gAAAWDAAEVhAAABBMAAR0iAwMABKt3AASrlCaTeAWrAASrDYMAA/RwCYMAAS0gAAQXAAEdPgMDAASrpwAEq6cABK90AAAADwAEq9sABK90AAAAEBATAASsLAAAAha9gwABFYQDAASseAAAAhbFgwABFYQDAASsqAAAEpN5gwABLSADAAStCAAAAgpBgvcsAAGDAAEdGAT4DPRzAASuLFsABK38utAXAAEVs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wAD6CgFKwAExEwElwAExGYDAATETwCDj22DAAEdeBsAAR2SAwMABMSfAATE4wAExXgAAuUABasABMShgwAD9HAIAAAEDwAExQsABMV4AAAABAQHAATFQAAAIg9ZgwABFYQAAYMAA+goBSsABMVoBKQAAIOKgACDjCAAg41gAIOOmACDkCgAg5FwAAAAFAsAAR2eAwMABMWPAATFpwAEzcQO52gAAAWDAAEdQAAAAAQXAAEdvgMDAATGRwAExkcABMhkAAAADwAExmsABMhkAAAAEBATAATGoAAAAha9gwABFYQDAATG7AAAAhbFgwABFYQDAATHLAAAApN5gwABLSADAATHpAAAAgpBgvcsAAGDAAEdnAT8BCQDAATH3wABHVAQABIDAATH9wCDkwIHAATIDwCDkz4LAATIKwCDk3oPAATIUwCDk7QAFBsAAR2mAwMABMh3AATIpwAEyYAAAhE0BasABMh5gwAD9HAIAAAEDwAEyL8ABMmAAAAABAQHAATI5AAAAhy5dwABECgFbAABbAUrAATJFARzAATJNgMABMkXAIOVruFsBAAEuAMAARDsGwABHaoDAwAEyZcABMpHAATK4AACcwQFqwAEyZmDAAP0cAgAAAQPAATKawAEyuAAAAAAAAABgwABpDwFKwAEyoAFqwAEysGDAAGmBwADs0AbAAEdrgMDAATK8wAEyzMABMvgAALk9AWrAATK9YMAA/RwCAAABA8ABMtTAATL4AAAAAAAAAGDAAPvQAUrAATLaAWrAATLnYMAA+9CE4AbAAEdsgMDAATL8wAEzDcABMzQAALk8AWrAATL9YMAA/RwCAAABA8ABMxfAATM0AAAAAQEBwAEzGAAACIPWYMAARWEAAGDAAPoKAUrAATMiASXAATMogMABMyLAIOZxYMAAR2cGwABHbYDAwAEzOMABM0nAATNvAAC5QAFqwAEzOWDAAP0cAgAAAQPAATNTwAEzbwAAAAEBAcABM2EAAAiD1mDAAEVhAABgwAD6CgFKwAEzawEpAAAg5TYAIOWeACDl7gAg5jwAIOagACDm8gAAAAUCwABHcIDAwAEzdMABM3rAATWCA7nbAAABYMAAR1AAAAABBcAAR3iAwMABM6LAATOiwAE0KgAAAAPAATOrwAE0KgAAAAQEBMABM7kAAACFr2DAAEVhAMABM8wAAACFsWDAAEVhAMABM9wAAACk3mDAAEtIAMABM/oAAACCkGC9ywAAYMAAR3ABPwEJAMABNAjAAEdUBAAEgMABNA7AIOdWgcABNBTAIOdlgsABNBvAIOd0g8ABNCXAIOeDAAUGwABHcoDAwAE0LsABNDrAATRxAACETQFqwAE0L2DAAP0cAgAAAQPAATRAwAE0cQAAAAEBAcABNEoAAACHLl3AAEQKAVsAAFsBSsABNFYBHMABNF6AwAE0VsAg6AG4agEAAS4AwABETAbAAEdzgMDAATR2wAE0osABNMkAAJzBAWrAATR3YMAA/RwCAAABA8ABNKvAATTJAAAAAAAAAGDAAGkPAUrAATSxAWrAATTBYMAAaXjAAOzfBsAAR3SAwMABNM3AATTdwAE1CQAAuT0BasABNM5gwAD9HAIAAAEDwAE05cABNQkAAAAAAAAAYMAA+9ABSsABNOsBasABNPhgwAD70IM+BsAAR3WAwMABNQ3AATUewAE1RQAAuTwBasABNQ5gwAD9HAIAAAEDwAE1KMABNUUAAAABAQHAATUpAAAIg9ZgwABFYQAAYMAA+goBSsABNTMBJcABNTmAwAE1M8Ag6QdgwABHcAbAAEd2gMDAATVJwAE1WsABNYAAALlAAWrAATVKYMAA/RwCAAABA8ABNWTAATWAAAAAAQEBwAE1cgAACIPWYMAARWEAAGDAAPoKAUrAATV8ASkAACDnzAAg6DQAIOiEACDo0gAg6TYAIOmIAAAABQLAAEd5gMDAATWFwAE1i8ABN8oDudwAAAFgwABHUAAAAAEFwABHgYDAwAE1u8ABNbvAATZLAAAAA8ABNczAATZLAAAABAQEwAE12gAAAIWvYMAARWEAwAE17QAAAIWxYMAARWEAwAE1/QAAAKTeYMAAS0gAwAE2GwAAAIKQYL3LAABgwABHeQE/AQkAwAE2KcAAR1QEAASAwAE2L8Ag6eyBwAE2NcAg6fuCwAE2PMAg6gqDwAE2RsAg6hkABQbAAEd7gMDAATZPwAE2W8ABNpoAAIRNAWrAATZQYMAA/RwCAAABA8ABNmHAATaaAAAAAQEBwAE2awAAAIcuXcAARAoBWwAAWwFKwAE2dwEcwAE2f4DAATZ3wCDql7hsAQABLgDAAERRBsAAR3yAwMABNp/AATbLwAE3AAAAnMEBasABNqBgwAD9HAIAAAEDwAE21MABNwAAAAAAAAAAYMAAaQ8BSsABNuABasABNvBgwABpnMAA7O4GwABHfYDAwAE3BMABNxTAATdJAAC5PQFqwAE3BWDAAP0cAgAAAQPAATccwAE3SQAAAAAAAABgwAD70AFKwAE3IgFqwAE3L2DAAPvQrf8GwABHfoDAwAE3TcABN17AATeNAAC5PAFqwAE3TmDAAP0cAgAAAQPAATdowAE3jQAAAAEBAcABN2kAAAiD1mDAAEVhAABgwAD6CgFKwAE3cwElwAE3eYDAATdzwCDrnWDAAEd5BsAAR3+AwMABN5HAATeiwAE3yAAAuUABasABN5JgwAD9HAIAAAEDwAE3rMABN8gAAAABAQHAATe6AAAIg9ZgwABFYQAAYMAA+goBSsABN8QBKQAAIOpiACDqygAg6xoAIOtoACDrzAAg7B4AAAAFAsAAR4KAwMABN83AATfTwAE54QO53QAAAWDAAEdQAAAAAQXAAEeKgMDAATf8wAE3/MABOIUAAAADwAE4BsABOIUAAAAEBATAATgUAAAAha9gwABFYQDAATgnAAAAhbFgwABFYQDAATg3AAAApN5gwABLSADAAThVAAAAgpBgvcsAAGDAAEeCAT8BCQDAAThjwABHVAQABIDAAThpwCDsgoHAAThvwCDskYLAATh2wCDsoIPAATiAwCDsrwAFBsAAR4SAwMABOInAATiVwAE4zQAAhE0BasABOIpgwAD9HAIAAAEDwAE4m8ABOM0AAAABAQHAATilAAAAhy5dwABECgFbAABbAUrAATixARzAATi5gMABOLHAIO0tuGMBAAEuAMAAREQGwABHhYDAwAE40sABOP7AATkmAACcwQFqwAE402DAAP0cAgAAAQPAATkHwAE5JgAAAAAAAABgwABpDwFKwAE5DQFqwAE5HWDAAGmTwADtAAbAAEeGgMDAATkqwAE5OsABOWcAALk9AWrAATkrYMAA/RwCAAABA8ABOULAATlnAAAAAAAAAGDAAPvQAUrAATlIAWrAATlVYMAA+9DAAEIiBsAAR4eAwMABOWvAATl8wAE5pAAAuTwBasABOWxgwAD9HAIAAAEDwAE5hsABOaQAAAABAQHAATmHAAAIg9ZgwABFYQAAYMAA+goBSsABOZEBJcABOZeAwAE5kcAg7jVgwABHggbAAEeIgMDAATmowAE5ucABOd8AALlAAWrAATmpYMAA/RwCAAABA8ABOcPAATnfAAAAAQEBwAE50QAACIPWYMAARWEAAGDAAPoKAUrAATnbASkAACDs+AAg7WAAIO2wACDuAAAg7mQAIO62AAAABQLAAEeLgMDAATqkwAE6qsABPPEDud4AAAFgwABGNwAAAAEFwABHlIDAwAE6y8ABOsvAATsnAAAAA8ABOtLAATsnAAAAAgICwAE65wAAALaeYL3WAMABOwIAAACCUV3AAPx0AWDAAEVhAABgwABHiwE/AQkAwAE7EsAARjwCAAKAwAE7GMAg7xqBwAE7IMAg7ycABQbAAEeNgMDAATsswAE7NsABO14AAIX/AAAAAQPAATs+wAE7XgAAAAEBAcABO0MAAAAnYMAA+9AAAGDAAEg2AUrAATtNASbAATtNARzAATtTFsABO00uglHAAEVnSwEAARzAATtagMABO1TAIO+QZAEAAZQAwAD89QDAAPyDYMAASDYGwABHkYDAwAE7YsABO3PAATuKAQCCawAAAAEDwAE7fsABO4oAAAAAAAAAYMAARWEBSsABO4EBHMABO4cWwAE7gS6CUcAARWdLAQABkwDAAPyDBsAAR5KAwMABPDTAATxEwAE8agEAud8AAAABA8ABPFLAATxqAAAAAAAAAGDAAEUqAUrAATxVARbAATxmFsABPFsWwAE8VS6Z98AARWm40MAARTeB6MAA/FkGwABHjoDAwAE8b8ABPHvAATywAACETQFqwAE8cGDAAP0cAgAAAQPAATyBwAE8sAAAAAEBAcABPIsAAACHLl3AAEQKAVsAAFsBSsABPJcBHMABPJ+AwAE8l8Ag8MiwYgEAAS4AwABETQbAAEePgMDAATy1wAE8yMABPO8AACMBasABPLZgwAD9HAIAAAEDwAE80MABPO8AAAAAAAAAYMAA/bYBSsABPNYBJMABPO8CJ7ngFsABPOguglHAAEVnAAAg72YAIO/oACDwOgAg8JMAIPD7ACDxUQAAAAUCwABHlYDAwAE89MABPQPAAT23B7nhAAABYMAAR0YAAAABBcAAR5eAwMABPSrAAT0qwAE9tQAAAAPAAT02wAE9tQAAAAQEBMABPUQAAACFr2DAAEVhAMABPVcAAACFsWDAAEVhAMABPWcAAACk3mDAAEtIAMABPYUAAACCkGC9ywAAYMAAR5UBPwEJAMABPZPAAEdPBAAEgMABPZnAIPG1gcABPZ/AIPHEgsABPabAIPHTg8ABPbDAIPHiAAAAACDyKwAAAAACwABHmIDAwAE9usABPcDAAT/KA7niAAABYMAAR5UAAAABBcAAR6CAwMABPeTAAT3kwAE+bQAAAAPAAT3uwAE+bQAAAAQEBMABPfwAAACFr2DAAEVhAMABPg8AAACFsWDAAEVhAMABPh8AAACk3mDAAEtIAMABPj0AAACCkGC9ywAAYMAAR5gBPwEJAMABPkvAAEeXBAAEgMABPlHAIPJ7gcABPlfAIPKKgsABPl7AIPKZg8ABPmjAIPKoAAUGwABHmoDAwAE+ccABPn3AAT61AACETQFqwAE+cmDAAP0cAgAAAQPAAT6DwAE+tQAAAAEBAcABPo0AAACHLl3AAEQKAVsAAFsBSsABPpkBHMABPqGAwAE+mcAg8ya4ZAEAAS4AwABERgbAAEebgMDAAT66wAE+5sABPw4AAJzBAWrAAT67YMAA/RwCAAABA8ABPu/AAT8OAAAAAAAAAGDAAGkPAUrAAT71AWrAAT8FYMAAaUjAAO0PBsAAR5yAwMABPxLAAT8iwAE/UAAAuT0BasABPxNgwAD9HAIAAAEDwAE/KsABP1AAAAAAAAAAYMAA+9ABSsABPzABasABPz1gwAD70IPvBsAAR52AwMABP1TAAT9lwAE/jQAAuTwBasABP1VgwAD9HAIAAAEDwAE/b8ABP40AAAABAQHAAT9wAAAIg9ZgwABFYQAAYMAA+goBSsABP3oBJcABP4CAwAE/esAg9CxgwABHmAbAAEeegMDAAT+RwAE/osABP8gAALlAAWrAAT+SYMAA/RwCAAABA8ABP6zAAT/IAAAAAQEBwAE/ugAACIPWYMAARWEAAGDAAPoKAUrAAT/EASkAACDy8QAg81kAIPOpACDz9wAg9FsAIPStAAAABQLAAEehgMDAAT/NwAE/08ABQeMDueMAAAFgwABHlQAAAAEFwABHqYDAwAE/+MABP/jAAUCCAAAAA8ABQAPAAUCCAAAABAQEwAFAEQAAAIWvYMAARWEAwAFAJAAAAIWxYMAARWEAwAFANAAAAKTeYMAAS0gAwAFAUgAAAIKQYL3LAABgwABHoQE/AQkAwAFAYMAAR5cEAASAwAFAZsAg9RGBwAFAbMAg9SCCwAFAc8Ag9S+DwAFAfcAg9T4ABQbAAEejgMDAAUCGwAFAksABQMsAAIRNAWrAAUCHYMAA/RwCAAABA8ABQJjAAUDLAAAAAQEBwAFAogAAAIcuXcAARAoBWwAAWwFKwAFArgEcwAFAtoDAAUCuwCD1vLhlAQABLgDAAERHBsAAR6SAwMABQNDAAUD8wAFBJQAAnMEBasABQNFgwAD9HAIAAAEDwAFBBcABQSUAAAAAAAAAYMAAaQ8BSsABQQsBasABQRtgwABpUMAA7R4GwABHpYDAwAFBKcABQTnAAUFoAAC5PQFqwAFBKmDAAP0cAgAAAQPAAUFBwAFBaAAAAAAAAABgwAD70AFKwAFBRwFqwAFBVGDAAPvQwABgrgbAAEemgMDAAUFswAFBfcABQaYAALk8AWrAAUFtYMAA/RwCAAABA8ABQYfAAUGmAAAAAQEBwAFBiAAACIPWYMAARWEAAGDAAPoKAUrAAUGSASXAAUGYgMABQZLAIPbEYMAAR6EGwABHp4DAwAFBqsABQbvAAUHhAAC5QAFqwAFBq2DAAP0cAgAAAQPAAUHFwAFB4QAAAAEBAcABQdMAAAiD1mDAAEVhAABgwAD6CgFKwAFB3QEpAAAg9YcAIPXvACD2PwAg9o8AIPbzACD3RQAAAAUCwABHqoDAwAFB5sABQezAAUPeA7nkAAABYMAAR5UAAAABBcAAR7KAwMABQgzAAUIMwAFCkQAAAAPAAUISwAFCkQAAAAQEBMABQiAAAACFr2DAAEVhAMABQjMAAACFsWDAAEVhAMABQkMAAACk3mDAAEtIAMABQmEAAACCkGC9ywAAYMAAR6oBPwEJAMABQm/AAEeXBAAEgMABQnXAIPepgcABQnvAIPe4gsABQoLAIPfHg8ABQozAIPfWAAUGwABHrIDAwAFClcABQqHAAULVAACETQFqwAFClmDAAP0cAgAAAQPAAUKnwAFC1QAAAAEBAcABQrEAAACHLl3AAEQKAVsAAFsBSsABQr0BHMABQsWAwAFCvcAg+FS4NQEAAS4AwABEEQbAAEetgMDAAULawAFDBsABQyoAAJzBAWrAAULbYMAA/RwCAAABA8ABQw/AAUMqAAAAAAAAAGDAAGkPAUrAAUMVAWrAAUMlYMAAaTjAAO0tBsAAR66AwMABQy7AAUM+wAFDaAAAuT0BasABQy9gwAD9HAIAAAEDwAFDRsABQ2gAAAAAAAAAYMAA+9ABSsABQ0wBasABQ1lgwAD70IPyBsAAR6+AwMABQ2zAAUN9wAFDoQAAuTwBasABQ21gwAD9HAIAAAEDwAFDh8ABQ6EAAAABAQHAAUOIAAAIg9ZgwABFYQAAYMAA+goBSsABQ5IBJcABQ5iAwAFDksAg+VpgwABHqgbAAEewgMDAAUOlwAFDtsABQ9wAALlAAWrAAUOmYMAA/RwCAAABA8ABQ8DAAUPcAAAAAQEBwAFDzgAACIPWYMAARWEAAGDAAPoKAUrAAUPYASkAACD4HwAg+IcAIPjXACD5JQAg+YkAIPnbAAAABQLAAEezgMDAAUPhwAFD58ABRd8DueUAAAFgwABHlQAAAAEFwABHu4DAwAFECMABRAjAAUSOAAAAA8ABRA/AAUSOAAAABAQEwAFEHQAAAIWvYMAARWEAwAFEMAAAAIWxYMAARWEAwAFEQAAAAKTeYMAAS0gAwAFEXgAAAIKQYL3LAABgwABHswE/AQkAwAFEbMAAR5cEAASAwAFEcsAg+j+BwAFEeMAg+k6CwAFEf8Ag+l2DwAFEicAg+mwABQbAAEe1gMDAAUSSwAFEnsABRNMAAIRNAWrAAUSTYMAA/RwCAAABA8ABRKTAAUTTAAAAAQEBwAFErgAAAIcuXcAARAoBWwAAWwFKwAFEugEcwAFEwoDAAUS6wCD66rgzAQABLgDAAEQPBsAAR7aAwMABRNjAAUUEwAFFKQAAnMEBasABRNlgwAD9HAIAAAEDwAFFDcABRSkAAAAAAAAAYMAAaQ8BSsABRRMBasABRSNgwABpMMAA7TwGwABHt4DAwAFFLcABRT3AAUVoAAC5PQFqwAFFLmDAAP0cAgAAAQPAAUVFwAFFaAAAAAAAAABgwAD70AFKwAFFSwFqwAFFWGDAAPvQwACNJAbAAEe4gMDAAUVswAFFfcABRaIAALk8AWrAAUVtYMAA/RwCAAABA8ABRYfAAUWiAAAAAQEBwAFFiAAACIPWYMAARWEAAGDAAPoKAUrAAUWSASXAAUWYgMABRZLAIPvyYMAAR7MGwABHuYDAwAFFpsABRbfAAUXdAAC5QAFqwAFFp2DAAP0cAgAAAQPAAUXBwAFF3QAAAAEBAcABRc8AAAiD1mDAAEVhAABgwAD6CgFKwAFF2QEpAAAg+rUAIPsdACD7bQAg+70AIPwhACD8cwAAAAUCwABHvIDAwAFF4sABRejAAUfgA7nmAAABYMAAR5UAAAABBcAAR8SAwMABRgnAAUYJwAFGjwAAAAPAAUYQwAFGjwAAAAQEBMABRh4AAACFr2DAAEVhAMABRjEAAACFsWDAAEVhAMABRkEAAACk3mDAAEtIAMABRl8AAACCkGC9ywAAYMAAR7wBPwEJAMABRm3AAEeXBAAEgMABRnPAIPzXgcABRnnAIPzmgsABRoDAIPz1g8ABRorAIP0EAAUGwABHvoDAwAFGk8ABRp/AAUbUAACETQFqwAFGlGDAAP0cAgAAAQPAAUalwAFG1AAAAAEBAcABRq8AAACHLl3AAEQKAVsAAFsBSsABRrsBHMABRsOAwAFGu8Ag/YK4NgEAAS4AwABEEgbAAEe/gMDAAUbZwAFHBcABRyoAAJzBAWrAAUbaYMAA/RwCAAABA8ABRw7AAUcqAAAAAAAAAGDAAGkPAUrAAUcUAWrAAUckYMAAaUDAAO1LBsAAR8CAwMABRy7AAUc+wAFHaQAAuT0BasABRy9gwAD9HAIAAAEDwAFHRsABR2kAAAAAAAAAYMAA+9ABSsABR0wBasABR1lgwAD70MAAjFsGwABHwYDAwAFHbcABR37AAUejAAC5PAFqwAFHbmDAAP0cAgAAAQPAAUeIwAFHowAAAAEBAcABR4kAAAiD1mDAAEVhAABgwAD6CgFKwAFHkwElwAFHmYDAAUeTwCD+imDAAEe8BsAAR8KAwMABR6fAAUe4wAFH3gAAuUABasABR6hgwAD9HAIAAAEDwAFHwsABR94AAAABAQHAAUfQAAAIg9ZgwABFYQAAYMAA+goBSsABR9oBKQAAIP1NACD9tQAg/gUAIP5VACD+uQAg/wsAAAAFAsAAR8WAwMABR+PAAUfywAFJXwe55wAAAWDAAEVhAAABBMAAR8eAwMABSDPAAUg7CaTeAWrAAUgZYMAA/RwCYMAAS0gAAQXAAEfNgMDAAUg/wAFIP8ABSQQAAAADwAFIS8ABSQQAAAADAwPAAUhZAAAAgXtgwABFYQDAAUhlAAAEpN5gwABLSADAAUhvAAAAgpBbAABgwABHxQE+Az0cwAFIshbAAUimLrQFwABFbLmwAAAAAMAAd+A9HMABSNkWwAFIzS60BcAARWy5sQAAAADAAHfiPRzAAUj1LrkuAAAAAMAARagCCAHAAEfHgQDAIP+iCQDAAUh9wABF7wIAAjHAAUiRYMAARWEBgMABSJLAIP+TJsABSJoBgsABSJrAIP+xYL3LAAIGwABHyYDAwAFJCcABSRrAAUkuAQCFrAAAAAEDwAFJIsABSS4AAAAAAAAAYMAARWEBSsABSSUBHMABSSsWwAFJJS6CUcAARWdLAQABkwDAAPyDBsAAR8uAwMABSTPAAUlSwAFJXQACnMEAAAABA8ABSVvAAUldAAAAAAAAAGDAAGkKAAAAIQBQACEAogAhANMAAAACAsAAR86AwMABSWLAAUlowAFLPwO56AAAAWDAAEfFAAAAAQXAAEfWgMDAAUmJwAFJicABSfAAAAADwAFJkMABSfAAAAADAwPAAUmeAAAAgXtgwABFYQDAAUmuAAAApN5gwABLSADAAUnGAAAAgpBgvcsAAGDAAEfOAT8BCQDAAUnUwABHzQMAA4DAAUnawCEBK4HAAUnhwCEBOoLAAUnrwCEBSQAFBsAAR9CAwMABSfTAAUoAwAFKNQAAhE0BasABSfVgwAD9HAIAAAEDwAFKBsABSjUAAAABAQHAAUoQAAAAhy5dwABECgFbAABbAUrAAUocARzAAUokgMABShzAIQG+uFwBAAEuAMAARDwGwABH0YDAwAFKOsABSmXAAUqKAACcwQFqwAFKO2DAAP0cAgAAAQPAAUpuwAFKigAAAAAAAABgwABpCgFKwAFKdAFqwAFKhGDAAGkcwADtXQbAAEfSgMDAAUqOwAFKnsABSsgAALk9AWrAAUqPYMAA/RwCAAABA8ABSqbAAUrIAAAAAAAAAGDAAPvQAUrAAUqsAWrAAUq5YMAA+9CD9QbAAEfTgMDAAUrMwAFK3cABSwIAALk8AWrAAUrNYMAA/RwCAAABA8ABSufAAUsCAAAAAQEBwAFK6AAACIPWYMAARWEAAGDAAPoKAUrAAUryASXAAUr4gMABSvLAIQLEYMAAR84GwABH1IDAwAFLBsABSxfAAUs9AAC5QAFqwAFLB2DAAP0cAgAAAQPAAUshwAFLPQAAAAEBAcABSy8AAAiD1mDAAEVhAABgwAD6CgFKwAFLOQEpAAAhAYkAIQHxACECQQAhAo8AIQLzACEDRQAAAAUCwABH14DAwAFLQsABS0jAAU0NA7npAAABYMAAR8UAAAABBcAAR9+AwMABS2bAAUtmwAFLygAAAAPAAUtqwAFLygAAAAMDA8ABS3gAAACBe2DAAEVhAMABS4gAAACk3mDAAEtIAMABS6AAAACCkGC9ywAAYMAAR9cBPwEJAMABS67AAEfNAwADgMABS7TAIQOpgcABS7vAIQO4gsABS8XAIQPHAAUGwABH2YDAwAFLzsABS9rAAUwMAACETQFqwAFLz2DAAP0cAgAAAQPAAUvgwAFMDAAAAAEBAcABS+oAAACHLl3AAEQKAVsAAFsBSsABS/YBHMABS/6AwAFL9sAhBDy4MQEAAS4AwABEDAbAAEfagMDAAUwRwAFMPMABTF4AAJzBAWrAAUwSYMAA/RwCAAABA8ABTEXAAUxeAAAAAAAAAGDAAGkKAUrAAUxLAWrAAUxbYMAAagrAAO1vBsAAR9uAwMABTGLAAUxywAFMmQAAuT0BasABTGNgwAD9HAIAAAEDwAFMesABTJkAAAAAAAAAYMAA+9ABSsABTIABasABTI1gwAD70MAAQbwGwABH3IDAwAFMncABTK7AAUzQAAC5PAFqwAFMnmDAAP0cAgAAAQPAAUy4wAFM0AAAAAEBAcABTLkAAAiD1mDAAEVhAABgwAD6CgFKwAFMwwElwAFMyYDAAUzDwCEFRGDAAEfXBsAAR92AwMABTNTAAUzlwAFNCwAAuUABasABTNVgwAD9HAIAAAEDwAFM78ABTQsAAAABAQHAAUz9AAAIg9ZgwABFYQAAYMAA+goBSsABTQcBKQAAIQQHACEEbwAhBL8AIQUPACEFcwAhBcUAAAAFAsAAR+CAwMABTRDAAU0WwAFO7gO56gAAAWDAAEfFAAAAAQXAAEfogMDAAU03wAFNN8ABTZ4AAAADwAFNPsABTZ4AAAADAwPAAU1MAAAAgXtgwABFYQDAAU1cAAAApN5gwABLSADAAU10AAAAgpBgvcsAAGDAAEfgAT8BCQDAAU2CwABHzQMAA4DAAU2IwCEGKYHAAU2PwCEGOILAAU2ZwCEGRwAFBsAAR+KAwMABTaLAAU2uwAFN4wAAhE0BasABTaNgwAD9HAIAAAEDwAFNtMABTeMAAAABAQHAAU2+AAAAhy5dwABECgFbAABbAUrAAU3KARzAAU3SgMABTcrAIQa8uDQBAAEuAMAARBAGwABH44DAwAFN6MABThPAAU44AACcwQFqwAFN6WDAAP0cAgAAAQPAAU4cwAFOOAAAAAAAAABgwABpCgFKwAFOIgFqwAFOMmDAAGkVwADtfgbAAEfkgMDAAU48wAFOTMABTncAALk9AWrAAU49YMAA/RwCAAABA8ABTlTAAU53AAAAAAAAAGDAAPvQAUrAAU5aAWrAAU5nYMAA+9DAAIPBBsAAR+WAwMABTnvAAU6MwAFOsQAAuTwBasABTnxgwAD9HAIAAAEDwAFOlsABTrEAAAABAQHAAU6XAAAIg9ZgwABFYQAAYMAA+goBSsABTqEBJcABTqeAwAFOocAhB8RgwABH4AbAAEfmgMDAAU61wAFOxsABTuwAALlAAWrAAU62YMAA/RwCAAABA8ABTtDAAU7sAAAAAQEBwAFO3gAACIPWYMAARWEAAGDAAPoKAUrAAU7oASkAACEGhwAhBu8AIQc/ACEHjwAhB/MAIQhFAAAABQLAAEfpgMDAAU7xwAFO98ABT8gDuesAAAFgwABGNwAAAAEFwABH7oDAwAFPFsABTxbAAU9fAAAAA8ABTxvAAU9fAAAAAQEBwAFPMAAAALaeYL3WAABgwABH6QE/AQkAwAFPOsAARjwCAAKAwAFPQMAhCKlqwAFPSF3AAPx0AWDAAEVhwADtjQACBsAAR+uAwMABT2PAAU9vwAFPgwAAIwFqwAFPZGDAAP0cAgAAAQPAAU93wAFPgwAAAAAAAABgwAD9tgFKwAFPfQEnBgbAAEfsgMDAAU+HwAFPk8ABT8YAAIRNAWrAAU+IYMAA/RwCAAABA8ABT5nAAU/GAAAAAQEBwAFPowAAAIcuXcAARAoBWwAAWwFKwAFPrwEcwAFPt4DAAU+vwCEJY7g7AQABLgDAAEQaAAAhCOsAIQkuACEJlgAAAAICwABH74DAwAFPy8ABT9HAAVCiA7nsAAABYMAARjcAAAABBcAAR/SAwMABT/DAAU/wwAFQOQAAAAPAAU/1wAFQOQAAAAEBAcABUAoAAAC2nmC91gAAYMAAR+8BPwEJAMABUBTAAEY8AgACgMABUBrAIQnuasABUCJdwAD8dAFgwABFYcAA7Y0AAgbAAEfxgMDAAVA9wAFQScABUF0AACMBasABUD5gwAD9HAIAAAEDwAFQUcABUF0AAAAAAAAAYMAA/bYBSsABUFcBJ7ntBsAAR/KAwMABUGHAAVBtwAFQoAAAhE0BasABUGJgwAD9HAIAAAEDwAFQc8ABUKAAAAABAQHAAVB9AAAAhy5dwABECgFbAABbAUrAAVCJARzAAVCRgMABUInAIQqpuEEBAAEuAMAARCAAACEKMAAhCnQAIQrcAAAAAgLAAEf1gMDAAVClwAFQtMABUukHue4AAAFgwABGNwAAAgTAAEf3gMDAAVDkwAFQ6gmCRQBgwACFWgAEwABH+IDAwAFRBMABUQkJmPsAYMAAhVEAAgXAAEf6gMDAAVENwAFRDcABUd8AAAADwAFREsABUd8AAAADAwPAAVEnAAAAtp5gvdYAwAFRNAAABIJFYMAAhVoAwAFRVAAAAKVOYMAAQcUAAGDAAEf1AT4BPRfAAVG2LqVOgsABUcrAIQuCwABFZAMIAcAAR/eBAMAhC3MIAMAAR/grCQDAAVGFwABGPAIAAoDAAVGLwCELZmrAAVGTXcAA/HQBYMAARWHAAO2NAAXAAEf7gMDAAVHjwAFR48ABUucAue8AA8ABUfDAAVLnAAAAAwMDwAFSBQAAALaeYL3WAMABUh0AAACY+2DAAIVRAMABUjwAAAClTmDAAEHFAABgwABH9QE+AT0XwAFSvi6lToLAAVLSwCEMMcAARWQDCADAAEf4gcABUl/AIQwiCADAAEf3FsABUn2BwAFSd8AhDCKCRcAAhVQJAMABUo3AAEY8AgACgMABUpPAIQwVasABUptdwAD8dAFgwABFYcAA7Y0AAAAAIQy1AAAAAALAAEf8gMDAAVLswAFS8sABVj0DufAAAAFgwABH9QAAAQTAAEf+gMDAAVPpwAFUAAm58QBgwAD6CgACBcAASAOAwMABVAXAAVQFwAFUyAAAAAPAAVQLwAFUyAAAAAQDA8ABVCAAAAC2nmC91gDAAVQzAAAAgkVgwACFWgDAAVRTAAAApU5gwABBxQABwAFUdwAABLnxYMAA+goBasABVJBgwAD6CgBgwABH/AE/AggBwABH/oMAwCENSgkAwAFUoMAAR/oDAAOAwAFUpsAhDR6BwAFUrsAhDSuCwAFUtsAhDToABcAASASAwMABVM3AAVTNwAFVmgC57wADwAFU28ABVZoAAAADAwPAAVTwAAAAtp5gvdYAwAFVCAAAAJj7YMAAhVEAwAFVJwAAAKVOYMAAQcUAAGDAAEf8AT8CCADAAEf+KgkAwAFVccAAR/sDAAOAwAFVecAhDceBwAFVgcAhDdSCwAFViMAhDeMAAgbAAEgAgMDAAVWfwAFVssABVfYAACMBasABVaBgwAD9HAIAAAEDwAFVusABVfYAAAAAAAAAYMAA/bYBSsABVcABIyEcwAFVxxbAAVXBLpj7wABH+EgBAAErAMAA/SkkwAFV7QInufIWwAFV4RbAAVXbLpj7wABH+KNOwACFUyeZ/QFgwAD9tgbAAEgBgMDAAVX7wAFWB8ABVjsAAIRNAWrAAVX8YMAA/RwCAAABA8ABVg3AAVY7AAAAAQEBwAFWFwAAAIcuXcAARAoBWwAAWwFKwAFWIwEcwAFWK4DAAVYjwCEO6LBnAQABLgDAAEQUAAAhDiwAIQ6zACEPGwAAAAICwABIBYDAwAFWQMABVkbAAVhUA7nzAAABYMAAR/UAAAACBcAASAqAwMABVmLAAVZiwAFW9gAAAAPAAVZrwAFW9gAAAAMDA8ABVoAAAAC2nmC91gDAAVaTAAAAgkVgwACFWgDAAVazAAAApU5gwABBxQAAYMAASAUBPwEJAMABVs7AAEf6AwADgMABVtTAIQ9zgcABVtzAIQ+AgsABVuTAIQ+PAAXAAEgLgMDAAVb7wAFW+8ABV6IAue8AA8ABVwzAAVeiAAAAAwMDwAFXIQAAALaeYL3WAMABVzkAAACY+2DAAIVRAMABV1gAAAClTmDAAEHFAABgwABIBQE/AQkAwAFXecAAR/sDAAOAwAFXgcAhD/aBwAFXicAhEAOCwAFXkMAhEBIAAgbAAEgHgMDAAVenwAFXusABWAoAACMBasABV6hgwAD9HAIAAAEDwAFXwsABWAoAAAAAAAAAYMAA/bYBSsABV84BIyEcwAFX1RbAAVfPLpj7wABH+EgBAAErAMAA/SkkwAFX/gInufQWwAFX8hbAAVfsLpj7wABH+KNOwACFUyeaBgFgwAD9tgbAAEgIgMDAAVgPwAFYG8ABWFIAAIRNAWrAAVgQYMAA/RwCAAABA8ABWCHAAVhSAAAAAQEBwAFYKwAAAIcuXcAARAoBWwAAWwFKwAFYNwEcwAFYP4DAAVg3wCERELBpAQABLgDAAEQWAAAhEFQAIRDbACERQwAAAAICwABIDIDAwAFYV8ABWF3AAVm0A7n1AAABYMAARjcAAAMEwABIDoDAwAFYh8ABWJAYgewAYMAASFQBKwTAAEgPgMDAAVigwAFYqhi59gBgwABFKgErBMAASBCAwMABWLrAAVjGGKKvAGDAAEUqASsBBcAASBeAwMABWMrAAVjKwAFZEgAAAAPAAVjOwAFZEgAAAAEBAcABWOMAAAC2nmC91gAAYMAASAwBPwEJAMABWO3AAEY8AgACgMABWPPAIRHpasABWPtdwAD8dAFgwABFYcAA7Y0AAwbAAEgSgMDAAVkWwAFZIsABWTUAACMBasABWRdgwAD9HAIAAAEDwAFZKsABWTUAAAAAAAAAYMAA/bYBSsABWTABJ5oKBsAASBOAwMABWTnAAVlFwAFZdwAAhE0BasABWTpgwAD9HAIAAAEDwAFZS8ABWXcAAAABAQHAAVlVAAAAhy5dwABECgFbAABbAUrAAVlhARzAAVlpgMABWWHAIRKksGMBAAEuAMAARFIGwABIFYDAwAFZe8ABWYvAAVmyAQC59wAAAAEDwAFZlcABWbIAAAAAAAAAYMAARSoBSsABWZgBFsABWa4WwAFZoxbAAVmdLpn3wABFabjQwABFN4HowAD8WQAAIRIrACESbwAhEtcAIRMwAAAAAwLAAEgYgMDAAVrJwAFaz8ABW+gDufgAAAFgwABGNwAAAAEFwABIH4DAwAFa8cABWvHAAVs9AAAAA8ABWvnAAVs9AAAAAQEBwAFbDgAAALaeYL3WAABgwABIGAE/AQkAwAFbGMAARjwCAAKAwAFbHsAhE4xqwAFbJl3AAPx0AWDAAEVhwADtjQADBsAASBqAwMABW0HAAVtNwAFbZQAAIwFqwAFbQmDAAP0cAgAAAQPAAVtVwAFbZQAAAAAAAABgwAD9tgFKwAFbWwEnufkGwABIG4DAwAFbacABW3XAAVurAACETQFqwAFbamDAAP0cAgAAAQPAAVt7wAFbqwAAAAEBAcABW4UAAACHLl3AAEQKAVsAAFsBSsABW5EBHMABW5mAwAFbkcAhFEe4PAEAAS4AwABEGwbAAEgdgMDAAVuvwAFbv8ABW+YBALn6AAAAAQPAAVvQwAFb5gAAAAAAAABgwABFKgFKwAFb0wEcwAFb4xbAAVvZFsABW9MumffAAEVpuNDAAEU3SwEAAZMAwAD8gwAAIRPOACEUEgAhFHoAIRTXAAAAAwLAAEgggMDAAVvrwAFb8cABXlgDufsAAAFgwABGMAAAAQTAAEgigMDAAVwfwAFcNhi5/ABgwABJ8AErAQXAAEgrgMDAAVw6wAFcOsABXKIAAAADwAFcPcABXKIAAAACAgLAAVxSAAAAtp5gvdYAwAFcZwAAAIW0YMAARWEAAGDAAEggAT8BCQDAAVx6wABGNgIAAoDAAVyAwCEVTTHAAVyWYMAARWEBgcABXJfAIRVaAAUGwABIJIDAwAFcpsABXLLAAVzEAAAjAWrAAVynYMAA/RwCAAABA8ABXLrAAVzEAAAAAAAAAGDAAP22AUrAAVzAASeaBwbAAEglgMDAAVzIwAFc1MABXQUAAIRNAWrAAVzJYMAA/RwCAAABA8ABXNrAAV0FAAAAAQEBwAFc5AAAAIcuXcAARAoBWwAAWwFKwAFc8AEcwAFc+IDAAVzwwCEWF7BuAQABLgDAAEQkBsAASCeAwMABXQrAAV0awAFdjgEAuf0AAAABA8ABXSTAAV2OAAAAAAAAAGDAAEUqAT4CQB7AAV0xwAD1sQIAAhzAAV1QFsABXUEWwAFdOy6Z98AARWm4gcAARTlLAQABkwDAAPyDHMABXWUWwAFdWxbAAV1VLpn3wABFabjQwABFN0sBAAGTAMAA/IMAwAFdMcABXWkASsABXXABHMABXYcWwAFdfRbAAV13Lpn3wABFabjQwABFN0sBAAGTAMAA/IMGwABIKIDAwAFdk8ABXaPAAV4XAQC5/gAAAAEDwAFdrcABXhcAAAAAAAAAYMAARSoBPgJAHsABXbrAAPWxAgACHMABXdkWwAFdyhbAAV3ELpn3wABFabiBwABFOUsBAAGUAMAA/IMcwAFd7hbAAV3kFsABXd4umffAAEVpuNDAAEU3SwEAAZQAwAD8gwDAAV26wAFd8gBKwAFd+QEcwAFeEBbAAV4GFsABXgAumffAAEVpuNDAAEU3SwEAAZQAwAD8gwbAAEgpgMDAAV4cwAFeLMABXlYBALn3AAAAAQPAAV42wAFeVgAAAAAAAABgwABFKgFKwAFeOQEWwAFeShbAAV45Lrn8wABIIrjYwABJ8wAAIRWeACEV4gAhFkoAIRcMACEXzgAhGBwAAAAFAsAASCyAwMABXlvAAV5hwAFgAgO5/wAAAWDAAEYwAAADBMAASC6AwMABXp3AAV61BroAAGDAAPvQAWrAAV60YMAA+9AJBMAASC+AwMABXsrAAV7bBroBAGDAAPvQAWrAAV7aYMAA+9AVBMAASDCAwMABXurAAV7uCYJnAGDAAPvQAAEFwABINYDAwAFe8sABXvLAAV+MAAAAA8ABXv3AAV+MAAAAAwIDwAFfEgAAALaeYL3WAMABXycAAACFtGDAAEVhAMABXz4AAASCZ2DAAPvQAWrAAV9FYMAA+9AJAGDAAEgsAT8CCAHAAEgwggDAIRj9CQDAAV9kwABGNgIAAoDAAV9qwCEY4THAAV+AYMAARWEBgcABX4HAIRjuAAIGwABIMoDAwAFfkMABX5zAAV+3AAAjAWrAAV+RYMAA/RwCAAABA8ABX6TAAV+3AAAAAAAAAGDAAP22AUrAAV+qASe6AgbAAEgzgMDAAV+7wAFfx8ABYAAAAIRNAWrAAV+8YMAA/RwCAAABA8ABX83AAWAAAAAAAQEBwAFf1wAAAIcuXcAARAoBWwAAWwFKwAFf4wEcwAFf64DAAV/jwCEZ0bhaAQABLgDAAEQ6AAAhGVgAIRmcACEaBAAAAAICwABINoDAwAFgBcABYAvAAWVVA7oDAAABYMAARWEAAAEEwABIOIDAwAFgQsABYEoJhf8AYMAAYLsAAQXAAEhLgMDAAWBOwAFgTsABYLkAlUkAA8ABYGDAAWC5AAAAAgICwAFgZgAABIX/YMAAYLsAwAFgfgAAAKlfYL3LAABgwABINgE/AggBwABIOIAAwCEadgkAwAFglMAARe8CAAIxwAFgqGDAAEVhAIHAAWCswCEahQAPBsAASDqAwMABYL7AAWDKwAFhAQAAIwFqwAFgv2DAAP0cAgAAAQPAAWDSwAFhAQAAAAAAAABgwAD9tgFKwAFg2AEkwAFhAQInugQcwAFg7RbAAWDkLoX/wABIOK+PAAAAAMAAYNwGwABIO4DAwAFhBcABYRHAAWFIAACETQFqwAFhBmDAAP0cAgAAAQPAAWEXwAFhSAAAAAEBAcABYSEAAACHLl3AAEQKAVsAAFsBSsABYS0BHMABYTWAwAFhLcAhG2SGAQEAAS4AwABEFQbAAEg8gMDAAWFNwAFhXsABYXIAALiWAWrAAWFOYMAA/RwCAAABA8ABYWjAAWFyAAAAAAAAAGDAAPoKAUrAAWFuASkGwABIPYDAwAFhdsABYYfAAWGtAAC5SwFqwAFhd2DAAP0cAgAAAQPAAWGYwAFhrQAAAAAAAABgwAD6CgFKwAFhngEWwAFhpxbAAWGeLoX/wABIOLoFwABgvwbAAEg+gMDAAWGxwAFhwsABYeUAALlMAWrAAWGyYMAA/RwCAAABA8ABYdDAAWHlAAAAAAAAAGDAAPoKAUrAAWHWARbAAWHfFsABYdYuhf/AAEg4rGnAAGC+BsAASD+AwMABYenAAWH6wAFiHgAAuU0BasABYepgwAD9HAIAAAEDwAFiCsABYh4AAAAAAAAAYMAA+goBSsABYhABFsABYhkWwAFiEC6F/8AASDi6BsAAYMQGwABIQIDAwAFiIsABYjPAAWJYAAC5TgFqwAFiI2DAAP0cAgAAAQPAAWJEwAFiWAAAAAAAAABgwAD6CgFKwAFiSgEWwAFiUxbAAWJKLoX/wABIOLoHwABgwgbAAEhBgMDAAWJcwAFibcABYpQAALlPAWrAAWJdYMAA/RwCAAABA8ABYn3AAWKUAAAAAAAAAGDAAPoKAUrAAWKDARbAAWKMFsABYoMuhf/AAEg4tRvAAGDFBsAASEKAwMABYpjAAWKpwAFizAAAuVABasABYplgwAD9HAIAAAEDwAFit8ABYswAAAAAAAAAYMAA+goBSsABYr0BFsABYsYWwAFivS6F/8AASDi6CMAAYMYGwABIQ4DAwAFi0MABYuHAAWMCAAC5UQFqwAFi0WDAAP0cAgAAAQPAAWLuwAFjAgAAAAAAAABgwAD6CgFKwAFi9AEWwAFi/RbAAWL0LoX/wABIOKtWwABgyAbAAEhEgMDAAWMGwAFjF8ABYzwAALlSAWrAAWMHYMAA/RwCAAABA8ABYybAAWM8AAAAAAAAAGDAAPoKAUrAAWMsARbAAWM1FsABYywuhf/AAEg4ugnAAGDBBsAASEWAwMABY0DAAWNRwAFjdAAAuVMBasABY0FgwAD9HAIAAAEDwAFjX8ABY3QAAAAAAAAAYMAA+goBSsABY2UBFsABY24WwAFjZS6F/8AASDi6CsAAYMAGwABIRoDAwAFjecABY4rAAWPLAAC1DgFqwAFjemDAAP0cAgAAAQPAAWOXwAFjywAAAAEBAcABY6UAAACkzGDAAE0PAABgwAD6CgFKwAFjtQEWwAFjvhbAAWO1LoX/wABIOLUOwABgzgbAAEhHgMDAAWP9wAFkDsABZC0AALlUAWrAAWP+YMAA/RwCAAABA8ABZCPAAWQtAAAAAAAAAGDAAPoKAUrAAWQpASkGwABISYDAwAFkMsABZELAAWVTAgC5KwFqwAFkM2DAAP0cAgAAAQPAAWRRwAFlUwAAAAEBAcABZFIAAACCkGC9ywAAXAE+AknAAWUQIRzAAWUVLrlQAAAAAMAASEJKwAFlJwA/PRnAAWU5uSuAwAFlS8AhH9vAAEWhAAAhGsoAIRsvACEblwAhG9oAIRwzACEcjAAhHOUAIR0+ACEdlwAhHfAAIR5JACEeogAhHvsAIR9jACEfpgAhIB8AAAAPAsAASEyAwMABZVjAAWVewAFm2wO6CwAAAWDAAEVhAAAAAQXAAEhTgMDAAWV8wAFlfMABZekAAAADwAFlgMABZekAAAACAgLAAWWOAAAAgJZgwABFYQDAAWWjAAAAgpBgvcsAAGDAAEhMAT4BPRzAAWXaLrkuAAAAAMAARagBCQDAAWWxwABF7wIAAjHAAWXFYMAARWEBgMABZcbAISCrgcABZc7AISC6AAQGwABIToDAwAFl7sABZfrAAWYsAACETQFqwAFl72DAAP0cAgAAAQPAAWYAwAFmLAAAAAEBAcABZgoAAACHLl3AAEQKAVsAAFsBSsABZhYBHMABZh6AwAFmFsAhIUOFrQEAAS4AwABEPQbAAEhPgMDAAWYwwAFmQMABZmcAALk9AWrAAWYxYMAA/RwCAAABA8ABZkjAAWZnAAAAAAAAAGDAAPvQAUrAAWZOAWrAAWZbYMAA+9DAAIFyBsAASFCAwMABZmvAAWZ8wAFmngAAuTwBasABZmxgwAD9HAIAAAEDwAFmhsABZp4AAAABAQHAAWaHAAAIg9ZgwABFYQAAYMAA+goBSsABZpEBJcABZpeAwAFmkcAhIftgwABITAbAAEhRgMDAAWaiwAFms8ABZtkAALlAAWrAAWajYMAA/RwCAAABA8ABZr3AAWbZAAAAAQEBwAFmywAACIPWYMAARWEAAGDAAPoKAUrAAWbVASkAACEhDgAhIXYAISHGACEiKgAhInwAAAAEAsAASFSAwMABZ77AAWfEwAFo6QO6DAAAAWDAAEVhAAAAAQXAAEhZgMDAAWfpwAFn6cABaGIAAAADwAFn9MABaGIAAAACAgLAAWf8AAAAgmxgvJEAwAFoFAAAAIKQYL3LAABgwABIVAE+AT0XwAFoRi6lTYDAAWhWwCEi3MAARWMBCQDAAWgiwABF7wIAAjHAAWg2YMAARWEAgcABaDrAISLpAAIGwABIVoDAwAFoZ8ABaHPAAWieAAAjAWrAAWhoYMAA/RwCAAABA8ABaHvAAWieAAAAAAAAAGDAAP22AUrAAWiBASTAAWieAie6DRbAAWiYFsABaIoupU3AAEVjgL28kwbAAEhXgMDAAWiiwAForsABaOcAAIRNAWrAAWijYMAA/RwCAAABA8ABaLTAAWjnAAAAAQEBwAFovgAAAIcuXcAARAoBWwAAWwFKwAFoygEcwAFo0oDAAWjKwCEjzbhZAQABLgDAAEQ5AAAhIzkAISOYACEkAAAAAAICwABIWoDAwAFo7MABaPLAAWucA7oOAAABYMAASFQAAAABBcAASGCAwMABaRrAAWkawAFpZgAAAAPAAWkpwAFpZgAAAAICAsABaTEAAACCbGC8kQDAAWlJAAAAgpBgvcsAAGDAAEhaAT8BCQDAAWlRwABIWQIAAoDAAWlXwCEkWIHAAWlhwCEkZQADBsAASFyAwMABaknAAWpOwAFrDQAAug8AAAABA8ABalzAAWsNAAAAAAAAAGDAAPoKAT4CRsABamXAAWqHwAFqdwAAAKOoYMAARWEAFsABan8uuMbAAEVoPgJJwAFqjyXAAWqYgMABapPAISTYYMAARxpKwAFqpgEpP0nAAWq5IiXAAWrCgMABar3AISTYYMAARyEAHMABat0WwAFq1xTAAWrSwCEk2AABYMAARyGew8AARyZIAQABLgDAAP0pSsABauYBKT9KwAFq/QEqBsAASF2AwMABaxLAAWsewAFrTQAAIwFqwAFrE2DAAP0cAgAAAQPAAWsmwAFrTQAAAAAAAABgwAD9tgFKwAFrLAEkwAFrTQInuhAWwAFrRxbAAWs5LqVNwABFY4C9vJMGwABIXoDAwAFrUcABa13AAWuaAACETQFqwAFrUmDAAP0cAgAAAQPAAWtjwAFrmgAAAAEBAcABa20AAACHLl3AAEQKAVsAAFsBSsABa3kBHMABa4GAwAFrecAhJfy4XgEAAS4AwABEPwAAISScACElaAAhJccAISYvAAAAAwLAAEhhgMDAAWufwAFrpcABbgADuhEAAAFgwABIWgAAAAEFwABIbIDAwAFrx8ABa8fAAWwKAAAAA8ABa8zAAWwKAAAAAgICwAFr1wAAAJYgYMAAhTEAwAFr7gAAAIKQYL3LAABgwABIYQE/AQkAwAFr9sAASGACAAKAwAFr/MAhJouBwAFsBcAhJpoABgbAAEhjgMDAAWwPwAFsKcABbE0BAKVNAWrAAWwQYMAA/RwCAAABA8ABbDfAAWxNAAAAAAAAAGDAAIUxAUrAAWw6ASbAAWw6ARjAAWxApU3AAEVjYMAAhTEGwABIZYDAwAFsUsABbGfAAWy1AgClTQFqwAFsU2DAAP0cAgAAAQPAAWx0wAFstQAAAAEBAcABbIkAAAiew2DAAIUxAABcAT4BPRnAAWycpU2AwAFsrMAhJ17AAEVjBsAASGeAwMABbLrAAWzGwAFs+QAAhE0BasABbLtgwAD9HAIAAAEDwAFszMABbPkAAAABAQHAAWzWAAAAhy5dwABECgFbAABbAUrAAWziARzAAWzqgMABbOLAISe8sE4BAAEuAMAARE4GwABIaIDAwAFs/sABbQ/AAW0uAAC5VAFqwAFs/2DAAP0cAgAAAQPAAW0kwAFtLgAAAAAAAABgwAD6CgFKwAFtKgEpBsAASGmAwMABbTPAAW1EwAFt0gAAtQ4BasABbTRgwAD9HAIAAAEDwAFtUcABbdIAAAABAQHAAW1fAAAApMxgwABNDwAAYMAA+goBPgFKwAFtcgEcwAFtnhbAAW2FgMABbXnAIShnt3PAAE0UubMBAAEWwAFtvxbAAW2xLqVNwABIY4T5wACFMwDAAHndBsAASGqAwMABbdfAAW3qwAFt/gAAIwFqwAFt2GDAAP0cAgAAAQPAAW3ywAFt/gAAAAAAAABgwAD9tgFKwAFt+AEnmfEAACEm0QAhJykAISeHACEn7wAhKDIAISi/ACEpAwAAAAYCwABIbYDAwAFuA8ABbgnAAXKbA7oSAAABYMAARWEAAAQEwABIb4DAwAFuNMABbk8GuhMAYMAA+9ABasABbk5gwAD70AkEwABIcIDAwAFuYMABbmoGuhQAYMAA+9ABasABbmlgwAD70BUEwABIcYDAwAFue8ABboQGuhUAYMAA+9ABasABboNgwAD70CEEwABIcoDAwAFujcABbroYuhYAYMAA+9ABasABbqNgwAD70AkEBcAASHiAwMABb57AAW+ewAFwIAAAAAPAAW+iwAFwIAAAAAMDA8ABb6kAAACCbGC88ADAAW/GAAAAglFdwAD8dAFgwABFYQDAAW/cAAAAgpBgvcsAAGDAAEhtAT4BPRfAAXAELqVNgMABcBTAISn7wABFYwEJAMABb+rAAEXvAgACgcABb/DAISoIgsABb/jAISodAAXAAEh5gMDAAXAkwAFwJMABcIQAuhcAA8ABcDHAAXCEAAAAAgICwAFwOAAAAIJsYLzwAMABcFAAAACCkGC9ywAAYMAASG0BPwEKAMABcF7AAEh4AwADgMABcGPAISqQMcABcHtgwABFYQCBwAFwf8AhKp0ABcAASHqAwMABcIjAAXCIwAFxBAC6GAADwAFwmMABcQQAAAADAwPAAXCfAAAAgmxgvPAAwAFwtgAAAIF7YMAARWEAwAFwywAAAIKQYL3LAABgwABIbQE/AQoAwAFw2cAASHgDAAOAwAFw3sAhKwQxwAFw9mDAAEVhAYHAAXD3wCErEYLAAXD/wCErIAAFwABIe4DAwAFxCMABcQjAAXF7ALoZAAPAAXEXwAFxewAAAAMDA8ABcR4AAACCbGC88ADAAXE7AAAAglFdwAD8dAFgwABFYQDAAXFRAAAAgpBgvcsAAGDAAEhtAT8BCgDAAXFfwABIeAMAA4DAAXFkwCErkIHAAXFuwCErnYLAAXF2wCErsgADBsAASHSAwMABcYDAAXGFwAFyLwAAuhoAAAABA8ABcY3AAXIvAAAAAQEBwAFxmwAAAIF7YMAARWEAAFwBPgRAHMABca8uuMUAAAAAwABFzcABca/AAXG/AD0cwAFxzRbAAXHGLoJRwABFZ1YBAAGAwAFx0cAhLBwAwAD8hUAcwAFx8hbAAXHrFsABceQuglHAAEVnYcAA/KOBawEAARbAAXIIFsABcfsWwAFx9S6Z98AARWm4osAARTZhwAD8owDAAPz+wAFx5MABcg4APRzAAXIiFsABchuAwAFyFcAhLBy4xsAARWhWAQABLgDAAPyFBsAASHWAwMABcjTAAXJAwAFyVwAAIwFqwAFyNWDAAP0cAgAAAQPAAXJIwAFyVwAAAAAAAABgwAD9tgFKwAFyTgEkwAFyVwInuhsWwAFyVC6zVcAARWUGwABIdoDAwAFyW8ABcmfAAXKZAACETQFqwAFyXGDAAP0cAgAAAQPAAXJtwAFymQAAAAEBAcABcncAAACHLl3AAEQKAVsAAFsBSsABcoMBHMABcouAwAFyg8AhLW24XwEAAS4AwABEQAAAISvyACEs4gAhLTgAIS2gAAAAAwLAAEh8gMDAAXKewAFyrcABc0sHuhwAAAFgwABHRgAAAQTAAEh+gMDAAXLYwAFy+Bi6HQBgwAD6CgEqAQXAAEiAgMDAAXL8wAFy/MABc0kAAAADwAFzB8ABc0kAAAAEBATAAXMIAAAAha9bAMABcw4AAACFsVsAwAFzFQAAAKTeWwDAAXMfAAAAgpBbAABgwABIfAE/AQkAwAFzJ8AAR08EAAQmwAFzLQGAwAFzLcAhLhZgwABFYSbAAXMzAYHAAXMzwCEuIWDAAEVhJsABczoBgsABczrAIS4sYMAAS0gmwAFzRAGDwAFzRMAhLjdgvcsAAAAAIS6oAAAAAALAAEiBgMDAAXNOwAFzVMABdWoDuh4AAAFgwABIfAAAAQTAAEiDgMDAAXObwAFzrRi6HwBgwAD9tgErAQXAAEiLgMDAAXPHwAFzx8ABdBIAAAADwAFz0MABdBIAAAAEBATAAXPRAAAAha9bAMABc9cAAACFsVsAwAFz3gAAAKTeWwDAAXPoAAAAgpBbAABgwABIgQE/AQkAwAFz8MAASIAEAASAwAFz9sAhLxKBwAFz/MAhLx2CwAF0A8AhLyiDwAF0DcAhLzMABQbAAEiFgMDAAXQWwAF0IsABdFkAAIRNAWrAAXQXYMAA/RwCAAABA8ABdCjAAXRZAAAAAQEBwAF0MgAAAIcuXcAARAoBWwAAWwFKwAF0PgEcwAF0RoDAAXQ+wCEvr7hEAQABLgDAAEQjBsAASIaAwMABdF7AAXSKwAF0sQAAnMEBasABdF9gwAD9HAIAAAEDwAF0k8ABdLEAAAAAAAAAYMAAaQ8BSsABdJkBasABdKlgwABp68AA7ZQGwABIh4DAwAF0tcABdMXAAXTxAAC5PQFqwAF0tmDAAP0cAgAAAQPAAXTNwAF08QAAAAAAAABgwAD70AFKwAF00wFqwAF04GDAAPvQg1EGwABIiIDAwAF09cABdQbAAXUtAAC5PAFqwAF09mDAAP0cAgAAAQPAAXUQwAF1LQAAAAEBAcABdREAAAiD1mDAAEVhAABgwAD6CgFKwAF1GwElwAF1IYDAAXUbwCEwtWDAAEiBBsAASImAwMABdTHAAXVCwAF1aAAAuUABasABdTJgwAD9HAIAAAEDwAF1TMABdWgAAAABAQHAAXVaAAAIg9ZgwABFYQAAYMAA+goBSsABdWQBKQAAIS96ACEv4gAhMDIAITCAACEw5AAhMTYAAAAFAsAASIyAwMABdW3AAXVzwAF3MgO6IAAAAWDAAEh8AAAAAQXAAEiUgMDAAXWUwAF1lMABdd4AAAADwAF1nMABdd4AAAAEBATAAXWdAAAAha9bAMABdaMAAACFsVsAwAF1qgAAAKTeWwDAAXW0AAAAgpBbAABgwABIjAE/AQkAwAF1vMAASIAEAASAwAF1wsAhMZqBwAF1yMAhMaWCwAF1z8AhMbCDwAF12cAhMbsABQbAAEiOgMDAAXXiwAF17sABdiQAAIRNAWrAAXXjYMAA/RwCAAABA8ABdfTAAXYkAAAAAQEBwAF1/gAAAIcuXcAARAoBWwAAWwFKwAF2CgEcwAF2EoDAAXYKwCEyN7hCAQABLgDAAEQhBsAASI+AwMABdinAAXZVwAF2ewAAnMEBasABdipgwAD9HAIAAAEDwAF2XsABdnsAAAAAAAAAYMAAaQ8BSsABdmQBasABdnRgwABp0cAA7aMGwABIkIDAwAF2f8ABdo/AAXa6AAC5PQFqwAF2gGDAAP0cAgAAAQPAAXaXwAF2ugAAAAAAAABgwAD70AFKwAF2nQFqwAF2qmDAAPvQwAB8egbAAEiRgMDAAXa+wAF2z8ABdvUAALk8AWrAAXa/YMAA/RwCAAABA8ABdtnAAXb1AAAAAQEBwAF22gAACIPWYMAARWEAAGDAAPoKAUrAAXbkASXAAXbqgMABduTAITM/YMAASIwGwABIkoDAwAF2+cABdwrAAXcwAAC5QAFqwAF2+mDAAP0cAgAAAQPAAXcUwAF3MAAAAAEBAcABdyIAAAiD1mDAAEVhAABgwAD6CgFKwAF3LAEpAAAhMgIAITJqACEyugAhMwoAITNuACEzwAAAAAUCwABIlYDAwAF3NcABdzvAAXkfA7ohAAABYMAASHwAAAABBcAASJ2AwMABd2HAAXdhwAF3tgAAAAPAAXduwAF3tgAAAAQEBMABd28AAACFr1sAwAF3dQAAAIWxWwDAAXd8AAAApN5bAMABd4YAAACCkFsAAGDAAEiVAT8BCQDAAXeUwABIgAQABIDAAXeawCE0JIHAAXegwCE0L4LAAXenwCE0OoPAAXexwCE0RQAFBsAASJeAwMABd7rAAXfGwAF4AQAAhE0BasABd7tgwAD9HAIAAAEDwAF3zMABeAEAAAABAQHAAXfWAAAAhy5dwABECgFbAABbAUrAAXfiARzAAXfqgMABd+LAITTBuEMBAAEuAMAARCIGwABImIDAwAF4BsABeDLAAXhdAACcwQFqwAF4B2DAAP0cAgAAAQPAAXg7wAF4XQAAAAAAAABgwABpDwFKwAF4QQFqwAF4UWDAAGnawADtsgbAAEiZgMDAAXhhwAF4ccABeKIAALk9AWrAAXhiYMAA/RwCAAABA8ABeHnAAXiiAAAAAAAAAGDAAPvQAUrAAXh/AWrAAXiMYMAA+9DAAH1QBsAASJqAwMABeKbAAXi3wAF44gAAuTwBasABeKdgwAD9HAIAAAEDwAF4wcABeOIAAAABAQHAAXjCAAAIg9ZgwABFYQAAYMAA+goBSsABeMwBJcABeNKAwAF4zMAhNclgwABIlQbAAEibgMDAAXjmwAF498ABeR0AALlAAWrAAXjnYMAA/RwCAAABA8ABeQHAAXkdAAAAAQEBwAF5DwAACIPWYMAARWEAAGDAAPoKAUrAAXkZASkAACE0jAAhNPQAITVEACE1lAAhNfgAITZKAAAABQLAAEiegMDAAXkiwAF5KMABetUDuiIAAAFgwABIfAAAAAEFwABIpoDAwAF5RsABeUbAAXmNAAAAA8ABeUvAAXmNAAAABAQEwAF5TAAAAIWvWwDAAXlSAAAAhbFbAMABeVkAAACk3lsAwAF5YwAAAIKQWwAAYMAASJ4BPwEJAMABeWvAAEiABAAEgMABeXHAITaugcABeXfAITa5gsABeX7AITbEg8ABeYjAITbPAAUGwABIoIDAwAF5kcABeZ3AAXnQAACETQFqwAF5kmDAAP0cAgAAAQPAAXmjwAF50AAAAAEBAcABea0AAACHLl3AAEQKAVsAAFsBSsABebkBHMABecGAwAF5ucAhN0u4VAEAAS4AwABENAbAAEihgMDAAXnVwAF6AcABeiQAAJzBAWrAAXnWYMAA/RwCAAABA8ABegrAAXokAAAAAAAAAGDAAGkPAUrAAXoQAWrAAXogYMAAab/AAO3BBsAASKKAwMABeijAAXo4wAF6YAAAuT0BasABeilgwAD9HAIAAAEDwAF6QMABemAAAAAAAAAAYMAA+9ABSsABekYBasABelNgwAD70MAAe7sGwABIo4DAwAF6ZMABenXAAXqYAAC5PAFqwAF6ZWDAAP0cAgAAAQPAAXp/wAF6mAAAAAEBAcABeoAAAAiD1mDAAEVhAABgwAD6CgFKwAF6igElwAF6kIDAAXqKwCE4U2DAAEieBsAASKSAwMABepzAAXqtwAF60wAAuUABasABep1gwAD9HAIAAAEDwAF6t8ABetMAAAABAQHAAXrFAAAIg9ZgwABFYQAAYMAA+goBSsABes8BKQAAITcWACE3fgAhN84AITgeACE4ggAhONQAAAAFAsAASKeAwMABetjAAXrewAF8qgO6IwAAAWDAAEh8AAAAAQXAAEivgMDAAXsBwAF7AcABe00AAAADwAF7C8ABe00AAAAEBATAAXsMAAAAha9bAMABexIAAACFsVsAwAF7GQAAAKTeWwDAAXsjAAAAgpBbAABgwABIpwE/AQkAwAF7K8AASIAEAASAwAF7McAhOTiBwAF7N8AhOUOCwAF7PsAhOU6DwAF7SMAhOVkABQbAAEipgMDAAXtRwAF7XcABe5UAAIRNAWrAAXtSYMAA/RwCAAABA8ABe2PAAXuVAAAAAQEBwAF7bQAAAIcuXcAARAoBWwAAWwFKwAF7eQEcwAF7gYDAAXt5wCE51bhVAQABLgDAAEQ1BsAASKqAwMABe5rAAXvGwAF77gAAnMEBasABe5tgwAD9HAIAAAEDwAF7z8ABe+4AAAAAAAAAYMAAaQ8BSsABe9UBasABe+VgwABpyMAA7dAGwABIq4DAwAF78sABfALAAXwwAAC5PQFqwAF782DAAP0cAgAAAQPAAXwKwAF8MAAAAAAAAABgwAD70AFKwAF8EAFqwAF8HWDAAPvQwABprQbAAEisgMDAAXw0wAF8RcABfG0AALk8AWrAAXw1YMAA/RwCAAABA8ABfE/AAXxtAAAAAQEBwAF8UAAACIPWYMAARWEAAGDAAPoKAUrAAXxaASXAAXxggMABfFrAITrdYMAASKcGwABIrYDAwAF8ccABfILAAXyoAAC5QAFqwAF8cmDAAP0cAgAAAQPAAXyMwAF8qAAAAAEBAcABfJoAAAiD1mDAAEVhAABgwAD6CgFKwAF8pAEpAAAhOaAAIToIACE6WAAhOqgAITsMACE7XgAAAAUCwABIsIDAwAF8rcABfLPAAX4FA7okAAABYMAARjcAAAABBcAASLWAwMABfNTAAXzUwAF9mAAAAAPAAXzbwAF9mAAAAAMDA8ABfPAAAAC2nmC91gDAAX0FAAAAgJZgwABFYQDAAX0kAAAApU5gwABBxQAAYMAASLABPgE9F8ABfW8upU6CwAF9g8AhO97AAEVkAQkAwAF9P8AARjwCAAKAwAF9RcAhO8IxwAF9W2DAAEVhAYHAAX1cwCE7zwACBsAASLKAwMABfZzAAX2owAF9vgAAIwFqwAF9nWDAAP0cAgAAAQPAAX2wwAF9vgAAAAAAAABgwAD9tgFKwAF9tgEnmgkGwABIs4DAwAF9wsABfc7AAX4DAACETQFqwAF9w2DAAP0cAgAAAQPAAX3UwAF+AwAAAAEBAcABfd4AAACHLl3AAEQKAVsAAFsBSsABfeoBHMABffKAwAF96sAhPLKwZgEAAS4AwABERQAAITw5ACE8fQAhPOUAAAACAsAASLaAwMABfgjAAX4OwAF/0AO6JQAAAWDAAEVhAAAAAQXAAEi8gMDAAX44wAF+OMABfw8AAAADwAF+SMABfw8AAAADAwPAAX5dAAAAtp5gvdYAwAF+cgAAAICWYMAARWEAwAF+kQAAAKVOYMAAQcUAAGDAAEi2AT4BPRfAAX7mLqVOgsABfvrAIT1ZwABFZAEJAMABfqzAAEXvAgACMcABfsBgwABFYQGBwAF+wcAhPUoWwAF+0IDAAX7JwCE9PbTtve0AAwbAAEi4gMDAAX8TwAF/H8ABfz8AACMBasABfxRgwAD9HAIAAAEDwAF/J8ABfz8AAAAAAAAAYMAA/bYBSsABfy0BJ7omBsAASLmAwMABf0PAAX9PwAF/jQAAhE0BasABf0RgwAD9HAIAAAEDwAF/VcABf40AAAABAQHAAX9fAAAAhy5dwABECgFbAABbAUrAAX9rARzAAX9zgMABf2vAIT42uGsBAAEuAMAARFAGwABIuoDAwAF/kcABf6LAAX/OAAC5MwFqwAF/kmDAAP0cAgAAAQPAAX+qwAF/zgAAAAEBAcABf78AAAC2nmC91gAAYMAA+goBSsABf8oBKQAAIT29ACE+AQAhPmkAIT65AAAAAwLAAEi9gMDAAX/TwAF/2cABgXgDuicAAAFgwABFYQAAAQTAAEi/gMDAAYFXwAGBdhi0BQFqwAGBQGDAAP0cAmDAAHfFAR/AAYFpwAB3/wAAAAABBcAASMWAwMABf/nAAX/5wAGAUgAAAAPAAX//wAGAUgAAAAICAsABgA0AAACAlmDAAEVhAMABgCIAAACCkGC9ywAAYMAASL0BPwEJAMABgDDAAEXvAgACMcABgERgwABFYQGAwAGARcAhP0aBwAGATcAhP1UAAwbAAEjBgMDAAYBWwAGAYsABgHcAACMBasABgFdgwAD9HAIAAAEDwAGAasABgHcAAAAAAAAAYMAA/bYBSsABgHABJ5n0BsAASMKAwMABgHvAAYCHwAGAuwAAhE0BasABgHxgwAD9HAIAAAEDwAGAjcABgLsAAAABAQHAAYCXAAAAhy5dwABECgFbAABbAUrAAYCjARzAAYCrgMABgKPAIUAQsDYBAAEuAMAARA4GwABIw4DAwAGA/sABgQ/AAYE7AAC5MwFqwAGA/2DAAP0cAgAAAQPAAYEXwAGBOwAAAAEBAcABgSwAAAC2nmC91gAAYMAA+goBSsABgTcBKQAAIT+XACE/2wAhQEMAIUCTAAAAAwLAAEjGgMDAAYF7wAGBgcABg3QDuigAAAFgwABFYQAAAgTAAEjIgMDAAYKFwAGCjBiwXgBgwAD6CgAEwABIyYDAwAGDU8ABg3IYtAUBasABgzxgwAD9HAJgwAB3xQEfwAGDZcAAd/8AAAAAAQXAAEjPgMDAAYGhwAGBocABgnwAAAADwAGBp8ABgnwAAAAEBATAAYG8AAAAtp5gvdYAwAGB0QAAAICWYMAARWEAwAGB3QAABLBeYMAA+goAwAGB/gAAAKVOYMAAQcUAAGDAAEjGAT4BPRfAAYJTLqVOg8ABgmfAIUFkwABFZAIIAcAASMiCAMAhQVUJAMABghnAAEXvAgACMcABgi1gwABFYQGBwAGCLsAhQUYWwAGCPYDAAYI2wCFBObTtve0AAwbAAEjLgMDAAYKQwAGCnMABgrEAACMBasABgpFgwAD9HAIAAAEDwAGCpMABgrEAAAAAAAAAYMAA/bYBSsABgqoBJ5oRBsAASMyAwMABgrXAAYLBwAGC9QAAhE0BasABgrZgwAD9HAIAAAEDwAGCx8ABgvUAAAABAQHAAYLRAAAAhy5dwABECgFbAABbAUrAAYLdARzAAYLlgMABgt3AIUJNuHEBAAEuAMAARFcGwABIzYDAwAGC+cABgwrAAYM3AAC5MwFqwAGC+mDAAP0cAgAAAQPAAYMSwAGDNwAAAAEBAcABgycAAAC2nmC91gAAYMAA+goBSsABgzIBKgAAIUHUACFCGAAhQoAAIULQAAAAAwLAAEjQgMDAAYN3wAGDfcABhQIDuikAAAFgwABGNwAAAQTAAEjSgMDAAYOowAGDsQm6KgBgwAD6CgABBcAASNeAwMABg7XAAYO1wAGElwAAAAPAAYO7wAGElwAAAAQDA8ABg9AAAAC2nmC91gDAAYPlAAAAgJZgwABFYQDAAYQEAAAApU5gwABBxQABwAGEIwAABLoqYMAA+goBasABhC5gwAD6CgBgwABI0AE+AT0XwAGEbi6lToLAAYSCwCFDYcAARWQCCAHAAEjSgwDAIUNxCQDAAYQ+wABGPAIAAoDAAYREwCFDRTHAAYRaYMAARWEBgcABhFvAIUNSAAIGwABI1IDAwAGEm8ABhKfAAYS8AAAjAWrAAYScYMAA/RwCAAABA8ABhK/AAYS8AAAAAAAAAGDAAP22AUrAAYS1ASeZ8wbAAEjVgMDAAYTAwAGEzMABhQAAAIRNAWrAAYTBYMAA/RwCAAABA8ABhNLAAYUAAAAAAQEBwAGE3AAAAIcuXcAARAoBWwAAWwFKwAGE6AEcwAGE8IDAAYTowCFEW4XvAQABLgDAAERPAAAhQ+IAIUQmACFEjgAAAAICwABI2IDAwAGFvMABhcLAAYlTA7orAAABYMAARWEAAAEEwABI2oDAwAGF9sABhf0JliAAYLy3AAEFwABI5IDAwAGGAsABhgLAAYeDAAAAA8ABhgnAAYeDAAAAAwMDwAGGDwAABJYgYLy3AMABhiYAAACCkGC9ywDAAYY+AAAApU5gwABBxQAAYMAASNgBPgZAIRzAAYaMFsABhoQuliDAAEjaSAEAASsAwAD9KcABhoTAAYaTAD0cwAGGphbAAYaaLrQFwABFbLmwAAAAAMAAd+A9HMABhs0WwAGGwS60BcAARWy5sQAAAADAAHfiScABhukWwAGG9RbAAYbtLpYgwABI2qs+vMI+AT0cwAGHFxbAAYcLLrQFwABFbLosAAAAAMAAd+Q/PRzAAYdELrkuAAAAAMAARag9F8ABh1oupU6CwAGHbsAhRRfAAEVkAggBwABI2oAAwCFE/QkAwAGGWcAARe8CAAIxwAGGbWDAAEVhAIHAAYZxwCFFCgAHBsAASNyAwMABh4fAAYeTwAGHuQAAIwFqwAGHiGDAAP0cAgAAAQPAAYebwAGHuQAAAAAAAABgwAD9tgFKwAGHoQEkwAGHuQInui0WwAGHsxbAAYerLpYgwABI2oC9vJMGwABI3YDAwAGHvcABh8nAAYf+AACETQFqwAGHvmDAAP0cAgAAAQPAAYfPwAGH/gAAAAEBAcABh9kAAACHLl3AAEQKAVsAAFsBSsABh+UBHMABh+2AwAGH5cAhRrG4ZgEAAS4AwABESAbAAEjegMDAAYgDwAGIE8ABiEoAALlBAWrAAYgEYMAA/RwCAAABA8ABiB7AAYhKAAAAAAAAAGDAAPvQAUrAAYgkARzAAYg4HcABiCq5QQAAAADAAEXPg7sBAAEWwAGIQhbAAYg6LpYgwABI2oPBwAD9LwDAAPvqBsAASN+AwMABiE7AAYhewAGIiAAAuT0BasABiE9gwAD9HAIAAAEDwAGIZsABiIgAAAAAAAAAYMAA+9ABSsABiGwBasABiHlgwAD70MAAdZcGwABI4IDAwAGIjMABiJ3AAYjCAAC5PAFqwAGIjWDAAP0cAgAAAQPAAYinwAGIwgAAAAEBAcABiKgAAAiD1mDAAEVhAABgwAD6CgFKwAGIsgElwAGIuIDAAYiywCFH4GDAAEjYBsAASOGAwMABiMbAAYjXwAGJDAAAuUABasABiMdgwAD9HAIAAAEDwAGI4cABiQwAAAABAQHAAYjqAAAIg9ZgwABI2AAAYMAA+goBSsABiPQBHMABiPwWwAGI9C6WIMAASNpIAQABFsABiQWAwAGI/8AhSESWIMAASNoAwAD9KQbAAEjigMDAAYkQwAGJIcABiVEAALlUAWrAAYkRYMAA/RwCAAABA8ABiTbAAYlRAAAAAAAAAGDAAPoKAUrAAYk8ASEWwAGJRRbAAYk9LpYgwABI2qs+vMIAACFGHQAhRnwAIUbkACFHWwAhR6sAIUgPACFIjgAhSOYAAAAHAsAASOWAwMABiVbAAYlcwAGQAgO6LgAAAWDAAEVhAAABBMAASOeAwMABifnAAYoLGLovAF3AAP1nAWC8pQErAQXAAEj2gMDAAYthwAGLYcABjGQAAAADwAGLbcABjGQAAAACAgLAAYt7AAAAhXlgwABFYQDAAYuTAAAAgpBgvcsAAGDAAEjlAT4EPRfAAYvSLqVOFsABi++AwAGL5sAhSXClTsAARWTAAEVkPRzAAYwSFsABjAYutAXAAEVsubAAAAAAwAB34D0cwAGMORbAAYwtLrQFwABFbLmxAAAAAMAAd+I9HMABjFUuuS4AAAAAwABFqAEJAMABi6HAAEXvAgACMcABi7VgwABFYQGAwAGLtsAhSXCBwAGLwcAhSX8ACgbAAEjpgMDAAYxpwAGMfMABjK4AACMBasABjGpgwAD9HAIAAAEDwAGMhMABjK4AAAAAAAAAYMAA/bYBSsABjIoBJMABjK4CJ7owFsABjJsuui/AAEjnBsAASOqAwMABjLLAAYy+wAGM+AAAhE0BasABjLNgwAD9HAIAAAEDwAGMxMABjPgAAAABAQHAAYzOAAAAhy5dwABECgFbAABbAUrAAYzaARzAAYzigMABjNrAIUq3uEcBAAEuAMAARCcGwABI8IDAwAGM/MABjQ3AAY0iAQCFeQAAAAEDwAGNFsABjSIAAAAAAAAAYMAARWEBSsABjRkBHMABjR8WwAGNGS6CUcAARWdLAQABkwDAAPyDBsAASPGAwMABjSfAAY0wwAGNZgEAujEAAAABA8ABjVHAAY1mAAAAAAAAAGDAAPoKAUrAAY1UARzAAY1iFsABjVsWwAGNVC6CUcAARWdhwAD8o0gBAAGVAMAA/PMGwABI8oDAwAGNasABjXvAAY2mAQC6MgAAAAEDwAGNmsABjaYAAAAAAAAAYMAARWEBSsABjZ0BHMABjaMWwAGNnS6CUcAARWdLAQABlADAAPyDBsAASPSAwMABjarAAY2zwAGOMwIAujIAAAABA8ABjdHAAY4zAAAAAQEBwAGN3AAAAIX/YMAASDYAAFwBPgJAIRbAAY30LroxwABI8cABjfPAAY4UAD0cwAGOIhbAAY4bLoJRwABFZ1YBAAGAwAGOJsAhTBQAwAD8hQbAAEjrgMDAAY44wAGOScABjngAALUOAWrAAY45YMAA/RwCAAABA8ABjlbAAY54AAAAAQEBwAGOZAAAAKTMYMAATQ8AAGDAAPoKAUrAAY50ASkGwABI7IDAwAGOfcABjo3AAY68AAC5PQFqwAGOfmDAAP0cAgAAAQPAAY6VwAGOvAAAAAAAAABgwAD70AFKwAGOmwFqwAGOqGDAAPvQgVUGwABI7YDAwAGOwMABjtHAAY77AAC5PAFqwAGOwWDAAP0cAgAAAQPAAY7bwAGO+wAAAAEBAcABjtwAAAiD1mDAAEVhAABgwAD6CgFKwAGO5gElwAGO7IDAAY7mwCFNOGDAAEjlBsAASO6AwMABjv/AAY8QwAGQAAAAuUABasABjwBgwAD9HAIAAAEDwAGPGsABkAAAAAABAQHAAY8oAAAIg9ZgwABI5QAAYMAA+goBPgFKwAGPNQEiHMABj08WwAGPPC66L8AASOdIAQABFsABj1iAwAGPUsAhTZy6L8AASOcAwAD9KQEiHMABj5EWwAGPihbAAY93LrovwABI52HAAMyQSAEAARbAAY+tFsABj5qAwAGPlMAhTZy6L8AASOdhwADMkADAAPzzABzAAY/WFsABj8Muui/AAEjnhAIBAAEWwAGP6IDAAY/iwCFNnLovwABI5wDAAP18AAAhSiwAIUqCACFK6gAhSzwAIUuYACFL6gAhTGMAIUy1ACFNAwAhTWcAIU5dAAAACgLAAEj3gMDAAZF3wAGRfcABlOkDujMAAAFgwABGXgAAAgTAAEj5gMDAAZHHwAGR1BiFFwFqwAGRrWDAAP0cAl3AAPx0AWDAAGJPAATAAEj6gMDAAZHpwAGR+xi6LwBdwAD9ZwFgvKUAAQXAAEkAgMDAAZIAwAGSAMABk+IAAAADwAGSE8ABk+IAAAAHBwfAAZIvAAAAtp5gvdYAwAGSRgAAAKTeYMAAS0gAwAGSZAAAAIV8YL3LAMABkosAAACCUV3AAPx0AWDAAEVhAMABkqcAAAC5jWC9ywDAAZK+AAAEhRddwAD8dAFgwABiTwDAAZLYAAAEui9dwAD9ZwFgvKUAAGDAAEj3AT4DQCXAAZNJHMABk0WDwAGTP8AhT0VLAQABkwDAAPyDYMAASDbAAZM/wAGTVQBAHMABk30WwAGTbRzAAZNpg8ABk2PAIU9FSwEAAZMAwAD8g7krwABFoUgBAAEWwAGTh4DAAZOAwCFPHIVqveQAwAD9KcABk2PAAZOPAEAcwAGTxhbAAZO0FsABk6aBwAGTncAhTym0acAAS02VYsAAaJ9IAQABFsABk9cWwAGTyS6FF8AASPlhwAD8owDAAPzzwAGTncABk90AAwgBwABI+YUAwCFPZwgBwABI+oYAwCFPfAkAwAGS9MAARnMGAAaBwAGS+sAhTymCwAGTBMAhTzgrg8ABkxjAIU9FKYTAAZMmwCFPWgADBsAASPyAwMABk+bAAZP3wAGULAAAuZcBasABk+dgwAD9HAIAAAEDwAGUCsABlCwAAAABAQHAAZQYAAAApMxgwABNDwAAYMAA+goBSsABlCgBKQbAAEj9gMDAAZQxwAGURMABlJYAACMBasABlDJgwAD9HAIAAAEDwAGUTMABlJYAAAAAAAAAYMAA/bYBSsABlFgBJMABlJYEJ7o0FsABlHkupN7AAEZhJ7mWFsABlIkuhXzAAEZnBsAASP6AwMABlJrAAZSmwAGU5wAAhE0BasABlJtgwAD9HAIAAAEDwAGUrMABlOcAAAABAQHAAZS2AAAAhy5dwABECgFbAABbAUrAAZTCARzAAZTKgMABlMLAIVGYuF0BAAEuAMAARD4AACFQrAAhUP4AIVFjACFRywAAAAMCwABJAYDAwAGVN8ABlT3AAZg1A7o1AAABYMAARWEAAAEEwABJA4DAwAGVdMABlXsJliAAYLzJAAEFwABJC4DAwAGVgMABlYDAAZbrAAAAA8ABlYvAAZbrAAAAAwMDwAGVmAAABJYgYLzJAMABla8AAACCkGC9ywDAAZXHAAAApU5gwABBxQAAYMAASQEBPgM9HMABlnsWwAGWby60BcAARWy3PAAAAADAAHffPRzAAZagFsABlpQutAXAAEVstz0AAAAAwAB34T0XwAGWwi6lToLAAZbWwCFSWMAARWQCCAHAAEkDgADAIVI+CQDAAZXiwABF7wIAAjHAAZX2YMAARWEAgcABlfrAIVJLAAUGwABJBYDAwAGW8MABlvzAAZcnAAAjAWrAAZbxYMAA/RwCAAABA8ABlwTAAZcnAAAAAAAAAGDAAP22AUrAAZcKASTAAZcnAie6NhbAAZchFsABlxkuliDAAEkDgL28kwbAAEkGgMDAAZcrwAGXN8ABl3AAAIRNAWrAAZcsYMAA/RwCAAABA8ABlz3AAZdwAAAAAQEBwAGXRwAAAIcuXcAARAoBWwAAWwFKwAGXUwEcwAGXW4DAAZdTwCFTgrhTAQABLgDAAEQzBsAASQeAwMABl3XAAZeFwAGXlQAAuT0BasABl3ZgwAD9HAIAAAEDwAGXjcABl5UAAAAAAAAAYMAA+9ABSsABl5MBNx4GwABJCIDAwAGXwcABl9LAAZfyAAC5VAFqwAGXwmDAAP0cAgAAAQPAAZfnwAGX8gAAAAAAAABgwAD6CgFKwAGX7QEqBsAASQmAwMABl/bAAZgHwAGYMwAAuTMBasABl/dgwAD9HAIAAAEDwAGYD8ABmDMAAAABAQHAAZgkAAAAtp5gvdYAAGDAAPoKAUrAAZgvASkAACFS7gAhU00AIVO1ACFT+QAhVDwAIVSMAAAABQLAAEkMgMDAAZg4wAGYPsABmzoDujcAAAFgwABFYQAAAQTAAEkOgMDAAZhxwAGYeBiWIABgvLcAAQXAAEkZgMDAAZh8wAGYfMABmX0AAAADwAGYiMABmX0AAAADAwPAAZidAAAAtp5gvdYAwAGYqgAABJYgYLy3AMABmMAAAACAlmDAAEVhAABgwABJDAE+Az0cwAGZEBbAAZkELrQFwABFbLmwAAAAAMAAd+A9HMABmTcWwAGZKy60BcAARWy5sQAAAADAAHfiPRzAAZlfFsABmVMutAXAAEVsujgAAAAAwAB35gIIAcAASQ6BAMAhVRQJAMABmM/AAEXvAgACMcABmONgwABFYQGCwAGY5MAhVSEWwAGY84DAAZjswCFVB7Ttve0ABwbAAEkQgMDAAZmBwAGZjcABmbkAACMBasABmYJgwAD9HAIAAAEDwAGZlcABmbkAAAAAAAAAYMAA/bYBSsABmZsBJMABmbkCJ7o5FsABmbMWwAGZqy6WIMAASQ6AvbyTBsAASRGAwMABmb3AAZnJwAGaAwAAhE0BasABmb5gwAD9HAIAAAEDwAGZz8ABmgMAAAABAQHAAZnZAAAAhy5dwABECgFbAABbAUrAAZnlARzAAZntgMABmeXAIVZjuGcBAAEuAMAAREkGwABJF4DAwAGaCMABmhnAAZovAQCAlgAAAAEDwAGaH8ABmi8AAAAAAAAAYMAARWEBSsABmiIBFsABmikWwAGaIi6CUcAARWeAw8AA/FoGwABJEoDAwAGaNMABmkTAAZp0AAC5PQFqwAGaNWDAAP0cAgAAAQPAAZpMwAGadAAAAAAAAABgwAD70AFKwAGaUgFqwAGaX2DAAPvQwAB1DAbAAEkTgMDAAZp4wAGaicABmrMAALk8AWrAAZp5YMAA/RwCAAABA8ABmpPAAZqzAAAAAQEBwAGalAAACIPWYMAARWEAAGDAAPoKAUrAAZqeASXAAZqkgMABmp7AIVdpYMAASQwGwABJFIDAwAGat8ABmsjAAZsCAAC5QAFqwAGauGDAAP0cAgAAAQPAAZrSwAGbAgAAAAEBAcABmuAAAAiD1mDAAEkMAABgwAD6CgFKwAGa6gEcwAGa8hbAAZrqLpYgwABJDkgBAAEWwAGa+4DAAZr1wCFXzZYgwABJDgDAAP0pBsAASRWAwMABmwbAAZsXwAGbOAAAuVUBasABmwdgwAD9HAIAAAEDwAGbJMABmzgAAAAAAAAAYMAA+goBSsABmyoBFsABmzEWwAGbKi64xsAARWiBVcAA/FYAACFVzwAhVi4AIVaWACFW5AAhVzQAIVeYACFYFwAhWHAAAAAHAsAASRqAwMABmz3AAZtDwAGcfgO6OgAAAWDAAEVhAAAAAQXAAEkggMDAAZtpwAGbacABm8AAAAADwAGbdcABm8AAAAACAgLAAZuJAAAAglFdwAD8dAFgwABFYQDAAZufAAAAgpBgvcsAAGDAAEkaAT8BCQDAAZutwABF7wIAAoDAAZuzwCFY3IHAAZu7wCFY8QADBsAASRyAwMABm8TAAZvQwAGb7AAAIwFqwAGbxWDAAP0cAgAAAQPAAZvYwAGb7AAAAAAAAABgwAD9tgFKwAGb3gEnujsGwABJHYDAwAGb8MABm/zAAZw2AACETQFqwAGb8WDAAP0cAgAAAQPAAZwCwAGcNgAAAAEBAcABnAwAAACHLl3AAEQKAVsAAFsBSsABnBgBHMABnCCAwAGcGMAhWaG4VgEAAS4AwABENgbAAEkegMDAAZw7wAGcTMABnHwAALk0AWrAAZw8YMAA/RwCAAABA8ABnFjAAZx8AAAAAQEBwAGcbQAAALaeYL3WAABgwAD6CgFKwAGceAEpAAAhWSgAIVlsACFZ1AAhWiQAAAADAsAASSGAwMABnQbAAZ0MwAGhjQO6PAAAAWDAAEVhAAABBMAASSOAwMABnUfAAZ1PCaTeAWrAAZ0tYMAA/RwCYMAAS0gAAQXAAEkygMDAAZ1TwAGdU8ABnnEAAAADwAGdWcABnnEAAAAEBATAAZ1nAAAAhXlgwABFYQDAAZ1+AAAAJ2DAAEVhAMABnYoAAASk3mDAAEtIAMABnagAAACCkGC9ywAAYMAASSEBPgQ9HMABnfUWwAGd6S60BcAARWy5sAAAAADAAHfgPRzAAZ4cFsABnhAutAXAAEVsubEAAAAAwAB34j0cwAGeRBbAAZ44LrQFwABFbLo9AAAAAMAAd+o9HMABnmIuuS4AAAAAwABFqAIIAcAASSOCAMAhWsEJAMABnbbAAEXvAgACMcABncpgwABFYQKAwAGdy8AhWqSBwAGd1cAhWrODwAGd3cAhWtAACwbAAEklgMDAAZ52wAGeicABnqcAACMBasABnndgwAD9HAIAAAEDwAGekcABnqcAAAAAAAAAYMAA/bYBSsABnpcBJ7o+BsAASSaAwMABnqvAAZ63wAGe6wAAhE0BasABnqxgwAD9HAIAAAEDwAGevcABnusAAAABAQHAAZ7HAAAAhy5dwABECgFbAABbAUrAAZ7TARzAAZ7bgMABntPAIVwGuEUBAAEuAMAARCUGwABJLoDAwAGe8MABnwHAAZ8WAQCFeQAAAAEDwAGfCsABnxYAAAAAAAAAYMAARWEBSsABnw0BHMABnxMWwAGfDS6CUcAARWdLAQABkwDAAPyDBsAASS+AwMABnxrAAZ8rwAGfPQEAJwAAAAEDwAGfMcABnz0AAAAAAAAAYMAARWEBSsABnzQBHMABnzoWwAGfNC6CUcAARWdLAQABlADAAPyDBsAASTCAwMABn8DAAZ/VwAGf5wEAuS8BasABn8FgwAD9HAIAAAEDwAGf38ABn+cAAAAAAAAAYMAA+goBSsABn+IBKgbAAEkngMDAAZ/swAGgBcABoDoAALk4AWrAAZ/tYMAA/RwCAAABA8ABoBTAAaA6AAAAAQEBwAGgIgAAAKTMYMAATQ8AAGDAAEVhAUrAAaAyARbAAaAyLoV5wABJLgbAAEkogMDAAaA+wAGgT8ABoGYAALk5AWrAAaA/YMAA/RwCAAABA8ABoFzAAaBmAAAAAAAAAGDAAPoKAUrAAaBiASkGwABJKYDAwAGgasABoHvAAaDSAAC5MwFqwAGga2DAAP0cAgAAAQPAAaCDwAGg0gAAAAEBAcABoJgAAAC2nmC91gAAYMAA+goBSsABoKkBFsABoMEcwAGgshbAAaCpLoV5wABJLqxpAQABgMABoLnAIV30AMAARa+yYL26BsAASSqAwMABoNfAAaDnwAGhEAAAuT0BasABoNhgwAD9HAIAAAEDwAGg78ABoRAAAAAAAAAAYMAA+9ABSsABoPUBasABoQJgwAD70MAAYwEGwABJK4DAwAGhFMABoSXAAaFWAAC5PAFqwAGhFWDAAP0cAgAAAQPAAaEvwAGhVgAAAAEBAcABoT0AAAiD1mDAAEVhAABgwAD6CgFKwAGhRwElwAGhTYDAAaFHwCFewGDAAEkhBsAASSyAwMABoVrAAaFrwAGhiwAAuUABasABoVtgwAD9HAIAAAEDwAGhdcABoYsAAAABAQHAAaF9AAAIg9ZgwABJIQAAYMAA+goBSsABoYcBKQAAIVuNACFb0QAhXDkAIVyLACFc3AAhXR8AIV18ACFdvwAhXjsAIV6LACFe7wAhX0EAAAALAsAASTOAwMABohfAAaIdwAGmOwO6PwAAAWDAAEVhAAABBMAASTWAwMABol7AAaJmCaTeAWrAAaJEYMAA/RwCYMAAS0gAAQXAAElCgMDAAaJqwAGiasABo6UAAAADwAGidsABo6UAAAAFBQXAAaKLAAAAtp5gvdYAwAGioAAAAIV5YMAARWEAwAGivQAAACdgwABFYQDAAaLRAAAAgJZgwABFYQDAAaLdAAAEpN5gwABLSAAAYMAASTMBPgM9HMABo0EWwAGjNS60BcAARWy5sAAAAADAAHfgPRzAAaNoFsABo1wutAXAAEVsubEAAAAAwAB34j0cwAGjkBbAAaOELrQFwABFbLpAAAAAAMAAd+wCCAHAAEk1hADAIWAaCQDAAaLvwABF7wIAAjHAAaMDYMAARWEDgcABowTAIV/ugsABow7AIV/9g8ABoxXAIWALFsABoySAwAGjHcAhX+G07b3tAAkGwABJN4DAwAGjqcABo7zAAaPhAAAjAWrAAaOqYMAA/RwCAAABA8ABo8TAAaPhAAAAAAAAAGDAAP22AUrAAaPKASe6QQbAAEk4gMDAAaPlwAGj8cABpCsAAIRNAWrAAaPmYMAA/RwCAAABA8ABo/fAAaQrAAAAAQEBwAGkAQAAAIcuXcAARAoBWwAAWwFKwAGkDQEcwAGkFYDAAaQNwCFhU7hGAQABLgDAAEQmBsAAST2AwMABpDDAAaRBwAGkVgEAhXkAAAABA8ABpErAAaRWAAAAAAAAAGDAAEVhAUrAAaRNARzAAaRTFsABpE0uglHAAEVnSwEAAZMAwAD8gwbAAEk+gMDAAaRawAGka8ABpH0BACcAAAABA8ABpHHAAaR9AAAAAAAAAGDAAEVhAUrAAaR0ARzAAaR6FsABpHQuglHAAEVnSwEAAZQAwAD8gwbAAEk/gMDAAaSBwAGkksABpKQBAICWAAAAAQPAAaSYwAGkpAAAAAAAAABgwABFYQFKwAGkmwEcwAGkoRbAAaSbLoJRwABFZ0sBAAGVAMAA/IMGwABJQIDAwAGlJ8ABpTzAAaVOAQC5LwFqwAGlKGDAAP0cAgAAAQPAAaVGwAGlTgAAAAAAAABgwAD6CgFKwAGlSQEqBsAASTmAwMABpVPAAaVswAGloQAAuTgBasABpVRgwAD9HAIAAAEDwAGle8ABpaEAAAABAQHAAaWJAAAApMxgwABNDwAAYMAARWEBSsABpZkBFsABpZkuhXnAAEk9BsAASTqAwMABpaXAAaW2wAGlzQAAuTkBasABpaZgwAD9HAIAAAEDwAGlw8ABpc0AAAAAAAAAYMAA+goBSsABpckBKQbAAEk7gMDAAaXRwAGl4sABpjkAALkzAWrAAaXSYMAA/RwCAAABA8ABperAAaY5AAAAAQEBwAGl/wAAALaeYL3WAABgwAD6CgFKwAGmEAEWwAGmKBzAAaYZFsABphAuhXnAAEk9rGkBAAGAwAGmIMAhY5MAwABFr7JgvboAACFg2gAhYR4AIWGGACFh2AAhYikAIWJ7ACFivgAhYxsAIWNeACFj2gAAAAkCwABJQ4DAwAGmfcABpoPAAbOfA7pCAAABYMAARWEAAAYEwABJRYDAwAGm6cABpvYGukMAYMAA+9ABasABpvVgwAD70AkEwABJRoDAwAGnXcABp28GukQAYMAA+9ABasABp25gwAD70BUEwABJR4DAwAGnvcABp88GukUAYMAA+9ABasABp85gwAD70CEEwABJSIDAwAGn48ABp/EJukYAYMAAYk8ABMAASUmAwMABp//AAagDCYJnAGDAAPvQAATAAElKgMDAAagSwAGoHwm6RwBgwAD6CgAFBcAASVuAwMABqCTAAagkwAGpBAC6SAADwAGoLsABqQQAAAAEBATAAag4AAAAukZgwABiTwDAAahVAAAAgmtgwABFYQDAAah1AAAAgpBgvcsAwAGojQAAAKVOYMAAQcUAAGDAAElDAT8BCgDAAaitwABJXwUABYDAAajDwCFlBjHAAajTYMAARWEBgcABqNTAIWUVasABqOFgwAD70AmCwAGo7MAhZSSDwAGo8sAhZTEABcAASVyAwMABqUrAAalKwAGqTwC6SQADwAGpWMABqk8AAAAEBATAAaliAAAAukZgwABiTwDAAal/AAAAgmtgwABFYQDAAamfAAAAgpBgvcsAwAGptwAAAKVOYMAAQcUAAGDAAElDAT8BCgDAAanX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AMAARa+z8b25PgFKwAHFRwEpP0rAAcVmASo/ScABxYIWwAHFi4LAAcWGwCF9l7lXwABiWD4CScABxdYWwAHGAxzAAcXnFsABxdouuOvAAEmArGkBAAGBwAHF7sAhfXIAwABFr7Pxvbk+AUrAAcYhASk/SsABxoQBKj8/ScABxu0WwAHHHhzAAccFgcABxvHAIX1yhAIBAAEWwAHHES6s3sAASXsAviSyYL26PgFKwAHHOQEqP07AAcdfwAHHaQAAulhgvcsBFsABx3gWwAHHay6468AASYC5K8AARaFKwAHHjQEWwAHHxRzAAceogcABx5TAIX1ytUACAAKDwAHHrcAhf1IWwAHHuC6s3sAASXsAvkGz8b25BsAASY2AwMABx97AAcfxwAHIpgAAIwFqwAHH32DAAP0cAgAAAQPAAcf5wAHIpgAAAAAAAABgwAD9tgFKwAHH/wEkAAknumAWwAHIFi66RsAASXknumEWwAHILC6CZ8AASXongYsjFsAByD0uulzAAEl+JMAByHwDJ7piFsAByGYuulvAAEl/J4GLJwABYMAA/bYnumMWwAHImC6468AASYAngyEAACF3oAAheDYAIXiIACF41QAheaIAIXn+ACF6WgAhesIAIXsUACF7VwAhe6cAIXwLACF8TgAhfS8AIX+zACGAVwAAAA8CwABJkYDAwAHKN8AByj3AAdRbA7pkAAABYMAARhIAAAcEwABJk4DAwAHKicAByqAGumUAYMAA+9ABasAByp9gwAD70BUEwABJlIDAwAHKtcAByswGumYAYMAA+9ABasABystgwAD70FIEwABJlYDAwAHK4MAByu4JukYAYMAAYk8ABMAASZaAwMAByvzAAcsACYJnAGDAAPvQAATAAEmXgMDAAcwzwAHMTAm6ZwBgwABLSAAEwABJmIDAwAHMX8ABzGoYrN4AYL3LAATAAEmZgMDAAcylwAHMrhi6WABgvcsBKwEFwABJqYDAwAHM7cABzO3AAc6JAAAAA8ABzPzAAc6JAAAABgUFwAHNAgAABLpGYMAAYk8AwAHNFwAABIJnYMAA+9AAwAHNKwAAAIKQYL3LAMABzUQAAACBe2DAAEVhAMABzV0AAAClTmDAAEHFAAHAAc18AAAEumdgwABLSAFqAGDAAPzZd2DAAEmRAT4DQBzAAc4AFsABzewuumjAAEmn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SsACJ0ABKj9OwAInZsACJ3oAALB4YL3WARbAAieIgMACJ3zAIdLJsHjAAE0YTsACJ6/AAie5AAC6WGC9ywEWwAInyBbAAie7LrjrwABK4rkrwABFoUrAAifdARbAAig1HMACKAGBwAIn5MAh0wW1QAIAAoLAAigGwCHTKhbAAigdFsACKBEurN7AAErdtN+90AC+QbPxvbkGwABK6oDAwAIoTsACKGHAAijLAAAjAWrAAihPYMAA/RwCAAABA8ACKGnAAijLAAAAAAAAAGDAAP22AT4CTsACKHnAAih/AACBxWDAAP22ASMWwAIogS6F18AASt8nurknuroBYMAA/bZKwAIorgEkwAIoxwMnuruAwAIowMAh09IngyEAACHQEgAh0GQAIdDBACHRBAAh0WwAIdG6ACHSHgAh0p8AIdOUACHUGAAAAAkCwABK7YDAwAIpM8ACKTnAAi5SA7q8AAABYMAARhIAAAQEwABK74DAwAIpasACKXIJuq8AYMAAYk8ABMAASvCAwMACKZfAAimiCazeAGC9zgAEwABK8YDAwAIpscACKbwJhdcAYMAA+goABMAASvKAwMACKdPAAinZCZZBAGC8twABBcAASv6AwMACKd7AAinewAIqoAAAAAPAAinswAIqoAAAAAYGBsACKfoAAACDHmDAAEVhAMACKggAAAS6r2DAAGJPAMACKhcAAASs3mC9zgDAAiovAAAEhddgwAD6CgDAAipBAAAElkFgvLcAwAIqVwAAAIKQYL3LAABgwABK7QE/BggBwABK74EAwCHU+wgBwABK8IIAwCHVCggBwABK8YMAwCHVFwgBwABK8oQAwCHVJgwAQCEcwAIqeIPAAipswCHVF0gBAAErAMAA/SnAAipswAIqfwAJAMACKorAAEYaAgACMcACKpBgwABFYQGAwAIqkcAh1OyFwAIqm8Ah1TMACAbAAEr0gMDAAiqlwAIqwsACKtsBALjrAWrAAiqmYMAA/RwCAAABA8ACKs/AAirbAAAAAAAAAGDAAEVhAUrAAirSARzAAirYFsACKtIuglHAAEVnSwEAAZMAwAD8gwbAAEr2gMDAAirgwAIq8cACKwkAALlVAWrAAirhYMAA/RwCAAABA8ACKv7AAisJAAAAAAAAAGDAAPoKAUrAAisEASoGwABK94DAwAIrDsACKxrAAitWAACE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wAD8pQJgvKVgwABvAQEyqAVgvKVgwABvAQAEwABMRIDDqLqo7Am7D8AATAgAXcAA/KUCYLy3YMAAboQBMqjqYLy3YMAAboQABMAATEWAw6o+qoIJuxDAAEwIAF3AAPylAmDAAP22XcAA/WcBYMAAboQBMqqAYMAA/bZdwAD9ZwFgwABuhAAEwABMRoDDqxWrWAm7EcAATAgAXcAA/KUCYMAA/bZdwAD9ZwFgwABuhAEyq1ZgwAD9tl3AAP1nAWDAAG6EAATAAExHgMOr7KwvCbsSwABMCABdwAD8pQJgwAD9tl3AAP1nAWDAAG6EATKsLWDAAP22XcAA/WcBYMAAboQABMAATEiAw6xLrHEJu5TAAEwIAF3AAP1nAWC8yQEerF/AAMDiAAFgvMkAAATAAExJgMOsiqypCbsTwABMCABdwAD9ZwFgwABiTwEerJrAAMDiAAFgwABiTwAABMAATEqAw602rVgJu5XAAEwIAF3AAP1nAWC88AEerUzAAMDiAAFgvPAAAATAAExLgMOtd63ACbuWwABMCABdwAD9ZwFgvMwBHq2rwADA4gABYLzMAAAEwABMTIDDrdut4wmxrcAATAgAYIEUAATAAExNgMOuAK4TCa8NwABMCABgutkABMAATE6Aw64nrjEJu5fAAEwIAGDAAGNiAATAAExPgMOuSq5ZCbO/wABMCABguDAABMAATFCAw650roQJt7DAAEwIAGDAAGouAATAAExRgMOuoK6yCbe2wABMCABgwABqXQAEwABMUoDDrtOu6gm7mMAATAgAYMAAeekABMAATFOAw68IrxwJt7fAAEwIAGDAAIHdAATAAExUgMOvPq9NCbuZwABMCABgwACC2gAEwABMVYDDr2aveAm7msAATAgAYMAAbaQABMAATFaAw6+br7QJt7jAAEwIAGDAAHpkAATAAExXgMOv06/oCbubwABMCABgwABvoAAEwABMWIDDsAmwIAm318AATAgAYMAAbmoABMAATFmAw7BHsGMJuxTAAEwIAGDAAG9jAATAAExagMOwg7CZCbucwABMCABgwABxKAAEwABMW4DDsLCwvQm7ncAATAgAYMAAcV8ABMAATFyAw7DHsNYYu57AAEwIAGDAAPoKASoEwABMXYDDsOew+Bi7n8AATAgAYMAATVEBKwTAAExegMOxFLFCCbugwABMCABdwAD9ZwFgvLcBHrEvwADA4gABYLy3AAAEwABMX4DDsWCxigm7FcAATAgAXcAA/WcBYMAAYLsBHrF2wADA4gABYMAAYLsAAATAAExggMOxoLHJCbuhwABMCABdwAD9ZwFgvPABHrG9wADA4gABYLzwAAAEwABMYYDDseCyCxi7osAATAgAXcAA/WcBYLy3AR6x+MAAwOIAAWC8twAABMAATGKAw7JOslkJt1TAAEwIAGDAAIONAAEFwABMjYDDsl6yXrSHAAAAA7J4tIcAAAARERGyhQAABLGtYIEUALKaAAAEt1RgwACDjQCysgAABK8NYLrZALLSAAAEu5dgwABjYgCy6QAABLO/YLgwALMFAAAEt7BgwABqLgCzIgAABLe2YMAAal0As0EAAAS7mGDAAHnpALNlAAAEt7dgwACB3QCzhgAABLuZYMAAgtoAs6IAAAS7mmDAAG2kALPBAAAEt7hgwAB6ZACz5wAABLubYMAAb6AAtAkAAAS312DAAG5qALQtAAAEuxRgwABvYwC0VgAABLucYMAAcSgAtHkAAAS7nWDAAHFfAABgwABMOQE/EggBwABMTIAAwCJyAQgBwABMYoEAwCJyDAgBwABMTYIAwCJyGQgBwABMToMAwCJyJAgBwABMT4QAwCJyMQgBwABMUIUAwCJyPAgBwABMUYYAwCJySQgBwABMUocAwCJyVggBwABMUxQAwCJyYwgACAHAAExUFADAInJwCQAIAcAATFUUAMAicn0KAAgBwABMVhQAwCJyigsACAHAAExXFADAInKXDAAIAcAATFgUAMAicqQNAAgBwABMWRQAwCJysQ4ACAHAAExaFADAInK+DwAIAcAATFsUAMAicssQAAkBsl7AAG+eAAAAACYGwABMZIDDqAyoLahWAQC7GQAAAAEDqEKoVgAAAAAAAABdwAD8pQJgvKVgwABvAQFKqEUBFqhFLrsOwABMCMAATEMGwABMZYDDqPGpFKk5AQC7owAAAAEDqSqpOQAAAAAAAABdwAD8pQJgvLdgwABuhAFKqS0BFqktLrsPwABMCMAATEQGwABMZoDDshCyGbIsAQC41QAAAAEDsiKyLAAAAAAAAABgwAD6CgFKsiUBFrIlLruewABMCMAATFwGwABMZ4DDtIy0srUZAQCbfQFqtI1gwAD9HAIAAAEDtMO1GQAAAAAAAABd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PgFKwABErQEpPz9KwABE1gEqBsAATH2Aw8AARTTAAEVYwABFkQAAu6UAAAABA8AARWvAAEWRAAAAAAAAAF3AAPylAmC8pWDAAEwtAT4BSsAARXQBFsAARXsuu5HAAEwIwABMPAbAAExzgMPAAEWWwABFrsAARi8AALsiwABMCAAAAAEDwABFysAARi8AAAABAQHAAEXYAAAAgmZgvLcAAF3AAPwyAWDAAGiXAT4BSsAAReYBHMAARe0uuyDAAEwIAgACHMAARhUWwABGCC67C8AATAjAAExASwEAARbAAEYdgMAARhbAIn/SgL28kwDAAPy5gMAARiTAIn/SAMAATHEGwABMdIDDwABGNMAARjnAAEarAAC7I8AATAgAAAABA8AARkrAAEarAAAAAQEBwABGWAAAAIJmYLy3AABgwAD6CgE+AUrAAEZmARzAAEZtLrsewABMCAIAAhzAAEaRFsAARoIuuwzAAEwIwABMQUsBAAEWwABGmYDAAEaSwCKAb4C9vJMAwAD8uYDAAEagwCKAbwDAAExyBsAATHWAw8AARrDAAEa1wABHJwAAuyTAAEwIAAAAAQPAAEbGwABHJwAAAAEBAcAARtQAAACCZmC8twAAYMAA+goBPgFKwABG4gEcwABG6S67HsAATAgCAAIcwABHDRbAAEb+LrsNwABMCMAATEJLAQABFsAARxWAwABHDsAigQaAvbyTAMAA/LmAwABHHMAigQYAwABMcgbAAEx+gMPAAEcswABHPcAAULkAAK8WAWrAAEctYMAA/RwCAAABA8AAR0/AAFC5AAAAAgICwABHYgAAAK8XYMAAZ14AwABHgQAAALslXgACAgJgvLddwABoCwFgwABu6gABV8AAbnQAXAAAXAE+BE7AAEecwABHpQAApN5gwABLSAEWwABHsoDAAEenwCKBpKTewABnYU7AAEfHwABH0gAAq3tgwAD9tgEWwABH3YLAAEfUwCKB34C9wABLVk/AAEfowABH7QAAAbsmYQNdwAD8pQJgwAD9tl3AAP1nAWDAAG6EYQFgwABuhF3AAGgLAWDAAG7qYQFgwABuhGDAAPoKXAADwABH9cAASfsAAAADAwPAAEgdAAAAs0xdwAD8pQJgwAD9tl3AAP1nAWDAAG6EAMAASEMAAACIoWEBYMAAboRdwABoCwFgwABu6gDAAEhrAAAAuydhAWDAAG6EYMAA+goAAFwBPgE9HMAASJcuuyjAAEwIAwADhcAASKPAIoKBg8AASK7AIoIGNMAASLoDwABIusAASfQAAAABAQHAAEjHAAAAuylgwABuhAAAYMAA+goBPgJJwABI2CIcwABI5YLAAEjcwCKB37VSAQABFsAASPoUwABI9MAigw4IAKQQwABuhwDAAEtlABzAAEkuFsAASREuuxTAAEwIwABMWbVQAwADgMAASU7AIoGkFsAASWAUwABJWsAigw4IAKQQwABuhy4AwABvZj4CPRzAAEmFgcAASXvAIoGzIAIAAhbAAEmMFMAASYbAIoMOCACkEMAAboccwABJmobAAEmUwCKCoSABAAEUwABJm8Aigw4IAAAAAABKwABJrgEcwABJxIfAAEm1wCKCvSABAAEUwABJxcAigw4IAAAAP0rAAEnfASoAwABMekFHwABKAhbAAEoVgMAASgrAIoGkgmfAAGdtAwHAAEo3asAASjdgwABnUcAA72MAPgM9HMAASkcuuysCAAIWwABKeYDAAEpuwCKBpKTewABnYRbAAEqOgMAASoPAIoGkhRfAAGduAMAAb5tJwABKphzAAEqqLrsswABMCAIAAoDAAEq/wCKBpBbAAErLLrsLwABMCMAATEAAwABMdj4BPRzAAErvhMAASufAIoIxIAMAAxbAAEr/LrsQwABMCMAATEU0wABLLgPAAEsuwABLiwAAAAEBAcAASy8AAABFYMAAboQAAF3AAGgLAWDAAG7qAUrAAEs1ARzAAEs3hcAASzXAIoTtuy0CAAJqwABLWl3AAGgLAWDAAG83wADvdxbAAEt9FsAAS3SAwABLacAigaSk3sAAZ2G0acAAS00AwABuozTAAEy/A8AATL/AAEzgAAAAAQEBwABMwAAAALsuYMAAboQAAGDAAPoKAUrAAEzGASEWwABMyYXAAEzHwCKFbbsvwABumAAAP0LAAEz1AAHAAE0WasAATRZgwABnUcAA74sAPgJJwABNIxzAAE0nLrsswABMCAIAAoDAAE08wCKBpBbAAE1ILrsMwABMCMAATEEAwABMdj4BPRzAAE1uhMAATWbAIoIxIAMAAxbAAE1+LrsRwABMCMAATEY0wABNrAPAAE2swABN0QAAAAEBAcAATa0AAABFYMAAboQAAF3AAGgLAWDAAG7qAUrAAE2zARzAAE21hcAATbPAIoYonmsBAAFqwABNw13AAGgLAWDAAG83wADvdwDAAG6hNMAATtgDwABO2MAATvcAAAABAQHAAE7ZAAAAuy5gwABuhAAAYMAA+goBSsAATt8BIRbAAE7ihcAATuDAIoaJuzHAAG6ZAAA/QsAATwwAAcAATy1qwABPLWDAAGdRwADvogA+AknAAE86HMAATz4uuyzAAEwIAgACgMAAT1PAIoGkFsAAT18uuw3AAEwIwABMQgDAAEx2PgE9HMAAT4WEwABPfcAigjEgAwADFsAAT5UuuxLAAEwIwABMRzTAAE/DA8AAT8PAAE/pAAAAAQEBwABPxAAAAEVgwABuhAAAXcAAaAsBYMAAbuoBSsAAT8oBHMAAT8yFwABPysAih0SCigEAAWrAAE/bXcAAaAsBYMAAbzfAAO93AMAAbqI0wABQdQPAAFB1wABQlQAAAAEBAcAAUHYAAAC7LmDAAG6EAABgwAD6CgFKwABQfAEhFsAAUH+FwABQfcAih6W7M8AAbpoAAD9CwABQqgAGwABMdoDDwABQvsAAUMPAAFNzAAC7LMAATAgAAAABA8AAUNfAAFNzAAAAAgICwABQ4wAAAK8XYMAAZ14AwABRJQAAALs0XcAA/KUCYMAA/bZdwAD8pQJgwABLSGDAAG9YAABgwAD6CgE+B07AAFFBwABRSgAApN5gwABLSAEWwABRV4DAAFFMwCKIDaTewABnYU7AAFFswABRcQAAgL1gwAD9tgEWwABRfILAAFFzwCKIS4C9wABLVk7AAFGNwABRmAAArKdgwAD9HAEWwABRpYDAAFGawCKIDbQPwABnYk7AAFHgwABR6gAAux9dwAD8pQJgwABLSGDAAG9YARzAAFH4gcAAUezAIogcmRUCAAKDwABSDcAiiHI0wABSEwPAAFITwABSRAAAAAAAAABdlDgCYMAAS0hgwABvWAFKwABSGQEfwABSHZRMAAJgwABLSGDAAG9YAAAAwAD8wE7AAFJnwABScwAAhOFgwABvXgEmwABSZwEcwABSfoXAAFJ1wCKIwEsBAAGCwABSf8AiiEsAwAD8uWDAAG9eScAAUo4cwABSnobAAFKSwCKJPkgBAAErAMAA/Sk+Aj0cwABSuIXAAFKvwCKIwIC/AgACgsAAUrnAIohLHMAAUu0WwABSxS67FMAATAjAAExZtU4CAAKCwABTB8AiiEuEwABTEcAiiJkAwABvZQDAAPy6SsAAUyQBKT9KwABTOwEcwABTTobAAFNCwCKJPrVUAQABhMAAU2TAIoiZAMAAb2AGwABMf4DDwABTeMAAU4nAAFPPAAC0tQFqwABTeWDAAP0cAgAAAQPAAFOYwABTzwAAAAEBAcAAU6wAAAiCkGDAAGJPAABcAT4BPRzAAFPCFsAAU7guuxPAAEwIwABMSVYBAAGAwABTxsAiilEAwAD9dAbAAEyAgMPAAFPUwABT5cAAVDkAAK8aAWrAAFPVYMAA/RwCAAABA8AAU/jAAFQ5AAAAAQEBwABUBQAAAK7wYMAAZ/YAAGDAAPoKAT4BSsAAVBABHMAAVCcWwABUFy67FcAATAjAAExfVgEAARbAAFQvgMAAVCvAIorCgJbAAGf5AMAA/XQGwABMgYDDwABUPsAAVE/AAGKxAACvFAFqwABUP2DAAP0cAgAAAQPAAFRgwABisQAAAAICAsAAVGsAAACvFWDAAGeQAMAAVIkAAAC7JV4AAgICYLy3XcAAaAsBYMAAbuoAAVfAAG50AFwAAFwBPgdJwABUmxzAAFSuFsAAVKmAwABUn8Aii0eCZ8AAZ5RIAQABasAAVL9gwABncsAA8TAAwAD9KT4FTsAAVNbAAFTkAACzD2C88AEmwABU1gEWwABU8IDAAFTmwCKLR5YgwABnk2C88E7AAFUMwABVEQAAgpBgwABi4gEcwABVMRbAAFUdLq8NwABMCMAATE2ywAEAAYLAAFVGwCKLuQC690nAAFVcFsAAVXMWwABVZYPAAFVgwCKL56JawABi6YOywAD8Vz4BPRzAAFWgFsAAVYkuu6HAAEwIwABMYFYBAAGCwABVpMAii7kAwAD9dD89HMAAVdIWwABVwi67lcAATAjAAExKVgEAASbAAFXgARbAAFXggMAAVdbAIotHliDAAGeTYLzwAMAA/XRKwABV8ABJwABWAxzAAFYWFsAAVhGAwABWB8Aii0eCZ8AAZ5RIAQABasAAVidgwABncsAA5QgAwAD9KT4CScAAVj01AAAAAQBgwAD6CgE1AAAAAQBdwAD8dAFgwABiTwEWwABWS4DAAFZBwCKLR4UXwABnmiMcwABWWoIAwCKM+UgBAAErAAArFsAAVlqCAMAijPmDssAA/FcBYMAA+gojHMAAVmWCAMAijO1IAQABKwAAKoIAwCKM7QFgwAD6Cj4BPRzAAFZ5LrsrAgACHsAAVqTAAEt4AgACasAAVrhgwABoZsAA4xAWwABWyIDAAFa+wCKLR7RpwABnlwAWwABW7oDAAFbkwCKLR4UXwABnmgDAAG+bP0rAAFcMAD9OwABXLMAAVzQAAJYgYLy3ASbAAFcsARbAAFdAgMAAVzbAIotHliDAAGeTYLy3TsAAV2DAAFdnAAC0ol3AAGgLAWDAAG7qAR/AAFdtwABoPAABYMAAbuoAAE7AAFeTwABXmQAAuylgwABuhAEcwABXmy67NcAATAgCAAKCwABXq8AijciDwABXtMAijfYAwABMe0nAAFfCIiIWwABXz4LAAFfHwCKNyIQZvLsBFsAAV+OCwABX28AijciHery6ABbAAFf6gsAAV/LAIo3Ih3a8vj4BPRzAAFgmFsAAWAsuu5LAAEwIwABMPlYBAAEmwABYNAEWwABYNIDAAFgqwCKLR5YgwABnk2C8yQDAAP10P0FHwABZKRbAAFk7gMAAWTHAIotHgmfAAGeUEQHAAFlcasAAWVxgwABncsAA7+EAPgFCwABZeAABwABZmGrAAFmYYMAAZ3LAAO/5AD4CPRzAAFnCFsAAWbQuu5TAAEwIwABMSFYBAAEmwABZ0AEWwABZ0IDAAFnGwCKLR5YgwABnk2C8yQDAAP10QsAAWeIAAsAAWgJqwABaAmDAAGdywADxMMAAWiRqwABaJGDAAGdywADlCAA+AULAAFpcAAHAAFp8asAAWnxgwABncsAA8JwAPgM9HMAAWpuDwABalMAijfaApQEAARzAAFqohMAAWqLAIo4hnmsBAAFqwABatl3AAGgLAWDAAG83wADwPgDAAG6hAMAAaB09HMAAWugWwABazS67k8AATAjAAEw/VgEAASbAAFr2ARbAAFr2gMAAWuzAIotHliDAAGeTYLzMAMAA/XRCwABbCAABwABbKGrAAFsoYMAAZ3LAAPBTAD4DPRzAAFtPFsAAW0Euu5TAAEwIwABMSFYBAAEmwABbXQEWwABbXYDAAFtTwCKLR5YgwABnk2C8yQDAAP10PRzAAFt2g8AAW2/AIo32gKUBAAEcwABbg4TAAFt9wCKOIYKKAQABasAAW5JdwABoCwFgwABvN8AA8D4AwABuogDAAGgdQsAAW6kAAcAAW8lqwABbyWDAAGdywADwswA+Aj0cwABb44PAAFvcwCKN9oClAQABHMAAW/CEwABb6sAijiGeawEAAWrAAFv+XcAAaAsBYMAAbzfAAPA+AMAAbqEAwABoHULAAFwVAAHAAFw1asAAXDVgwABncsAA8MoAPgI9HMAAXFCDwABcScAijfaApQEAARzAAFxdhMAAXFfAIo4hnmsBAAFqwABca13AAGgLAWDAAG83wADvzQDAAG6hAMAAaB1CwABcgwABwABco2rAAFyjYMAAZ3LAAO+5AD4CPRzAAFzDg8AAXLzAIo32gKUBAAEcwABc0ITAAFzKwCKOIZ5rAQABasAAXN5dwABoCwFgwABvN8AA780AwABuoQDAAGgdQsAAXPYAAcAAXRZqwABdFmDAAGdywADwagA+Aj0cwABdN4PAAF0wwCKN9oClAQABHMAAXUSEwABdPsAijiGCigEAAWrAAF1TXcAAaAsBYMAAbzfAAPA+AMAAbqIAwABoHULAAF1qAAHAAF2KasAAXYpgwABncsAA8IIAPgI9HMAAXaWDwABdnsAijfaApQEAARzAAF2yhMAAXazAIo4hgooBAAFqwABdwV3AAGgLAWDAAG83wADvzQDAAG6iAMAAaB1CwABd2QABwABd+WrAAF35YMAAZ3LAAPDiAD4CPRzAAF4Ug8AAXg3AIo32gKUBAAEcwABeIYTAAF4bwCKOIak9AAAAAMAAbp8AwABoHULAAF4yAAHAAF5SasAAXlJgwABncsAA8PwAPgI9HMAAXnaDwABeb8AijfaApQEAARzAAF6DhMAAXn3AIo4hu0QBAAEWwABemoDAAF6QwCKLR4X/wABnmQDAAG6gAMAAaB1CwABergABwABezmrAAF7OYMAAZ3LAAPApAD4DPRzAAF7kLrs7AQABgMAAXv3AIotHAMAAb5o9HMAAXxiDwABfEcAijfaApQEAARzAAF8yhMAAXyzAIo4huy0CAAJqwABfQl3AAGgLAWDAAG83wADwPhbAAF9ZgMAAX0/AIotHtGnAAGeXAMAAbqMAwABoHULAAF9yAAHAAF+SasAAX5JgwABncsAA5O4APgM9HMAAX6kuuzsBAAGAwABfwsAii0cAwABvmj0cwABf3YPAAF/WwCKN9oClAQABHMAAX/eEwABf8cAijiG7LQIAAmrAAGAHXcAAaAsBYMAAbzfAAO/NFsAAYB+AwABgFcAii0e0acAAZ5cAwABuowDAAGgdQsAAYDgAAsAAYFhqwABgWGDAAGdywADkusAAYIVqwABghWDAAGdywADk1AA+Aj0cwABgroPAAGCnwCKN9oClAQABHMAAYMiEwABgwsAijiG7LQIAAmrAAGDYXcAAaAsBYMAAbzfAAO/NFsAAYPCAwABg5sAii0e0acAAZ5cAwABuowDAAGgdQsAAYQkAAcAAYSlqwABhKWDAAGdywADlIAA+Aj0ewABhQLWnAgACgsAAYUnAIo3IJ7uqAELAAGGRAALAAGGxasAAYbFgwABncsAA8RbAAGHUasAAYdRgwABncsAA8BEAPgE9HsAAYem1pwIAAmrAAGHyYLW5wAC8DiTAAGJbAye7RxbAAGIxgMAAYifAIotHgmfAAGeUJ7urAEnAAGJoFsAAYnODwABibMAijfaDssAAaBc+AT0cwABikYHAAGKHwCKLViACAAIWwABimITAAGKSwCKOIaQQwABuh4PAAGKgwCKN9gAAPwbAAEx3gMPAAGMywABjPcAAY4YAALuswABMCAAAAAEDwABjTsAAY4YAAAABAQHAAGNlAAAImcJgvKUAAGDAAG8BAUrAAGNzAR/AAGN3wABvDgEAAYDAAGOCwCKWFgAGwABMeIDDwABjvsAAY8nAAGRNAAC7HMAATAgAAAABA8AAY9fAAGRNAAAAAQEBwABj5AAAAJnCYLylAABgwABvAQE+AUrAAGPvARzAAGQIFsAAY/Yuuw7AAEwIwABMQ5kVAgACgMAAZBTAIpZ0NMAAZBkDwABkGcAAZEgAAAAAAAAAYMAAbwEBPgFKwABkJAEcwABkKy67rMAATAgBAAGAwABkPcAilnQAwABMdwDAAPzABsAATHmAw8AAZJHAAGSWwABm5QAAuxvAAEwIAAAAAQPAAGSvwABm5QAAAAICAsAAZLwAAACZwmC8pQDAAGTTAAAAuxpeAAICAmC8pV3AAGgLAWDAAG8PAAFXwABudQBcAABcAT4CT8AAZYvAAGWQAAABu05hAWC8pWDAAPoKAAPAAGWcwABmdwAAAAEBAcAAZakAAACE5mC8pQAAYMAA+goBPgNOwABlyMAAZc4AALspYMAAbwEBHMAAZdAuuxzAAEwIAQABg8AAZd/AIpeGAMAATHhJwABl8iEWwABl/YTAAGX3wCKXnaj1wABvAz4CPRzAAGYggcAAZhfAIpczIAIAAhbAAGYnhMAAZiHAIpedmcLAAG8FHMAAZjKEwABmLMAil52wmAAAAADAAG8HAABKwABmSgEpP0rAAGZlASpDwABmfiIhHMAAZomAwABmhcAilyZIAQABKwDAAP0pABzAAGaggsAAZpTAIpdjIAEAAYDAAGahwCKXJgAAPgE9iMAAZq/AIpcmHMAAZskWwABmtS6vDcAATAjAAExNsrQBAAGAwABm18AilyYAuuwGwABMgoDDwABm6sAAZvvAAGhYAAC0oQFqwABm62DAAP0cAgAAAQPAAGcOwABoWAAAAAMCAsAAZxsAAACZwmC8pQDAAGczAAAAuyVeAAICAmC8t13AAGgLAWDAAG7qAAFXwABudABcAAHAAGdLAAAAtJBgwAD6CgFqwABnZWDAAPoKAFwBPgE9HMAAZ4cWwABncy6vDcAATAjAAExNsrYCAAKAwABnmsAimNw0wABnpwPAAGenwABoUwAAAAICAsAAZ7QAAACZwmC8pQDAAGfGAAAAgmZgvLcAAGDAAPzZAT4BPRzAAGfWLrtJwABMCAQAA4PAAGf2wCKZZoTAAGf7wCKZc4HAAGgDwCKY6QG0kILAAGgzwCKZEMAATHwAuuoGwABMeoDDwABpAcAAaQbAAGuJAAC7KMAATAgAAAABA8AAaRHAAGuJAAAAAwMDwABpMAAAAICrXcAA/KUCYMAA/bZdwAD9ZwFgwABuhADAAGk8AAAApxtgwAD9tgDAAGlTAAAAu61hAWDAAG6EYMAA+goAAFwBPgZOwABphsAAaY4AAISIXcAA/WcBYMAAboQBHMAAaZOAwABpkMAimfVLAQABgcAAaZTAIpoVAMAA/LlJwABppRzAAGmxg8AAaanAIppASAEAASsAwAD9KUrAAGm6AD89HMAAaoqAwABqh8AimfWAvwIAAoHAAGqLwCKaFR7AAGqdwADA4gABYMAAboQAAADAAPy6TsAAasbAAGrQAACXCF3AAP1nAWDAAG6EAR7AAGrWwADA4gABYMAAboQAAEbAAGruwABrEcAAav8AAAC7KWDAAG6EAIPAAGsIwCKaQD4BScAAaxkhHMAAaymCwABrHsAimiQgAQABhcAAayrAIpsEAAA+AT0cwABrRoTAAGs8wCKa0VYBAAGFwABrSsAimwQAwAD9dD89HMAAa3QcwABrZ4DAAGtkwCKZ9UsBAAGBwABraMAimhUAwAD8uYClAQABhMAAa3vAIprRAMAA/XUGwABMe4DDwABrjsAAa5rAAHc/AAC7NcAATAgAAAABA8AAa6nAAHc/AAAAAwICwABrtwAAAIJmYLy3AMAAa9IAAAC0ol3AAGgLAWDAAG7qAAHAAGvmAAAAtJBgwAD6CgFqwABsAGDAAPoKAGDAAG6EAT4DTsAAbBrAAGwgAAC7KWDAAG6EARzAAGwuFsAAbCIuuw/AAEwIwABMREsBAAGAwABsL8Aim8wAwAD8uUnAAGw8HMAAbEaDwABsQMAinBJIAQABKwDAAG6kPgJJwABsVxbAAGxigMAAbFvAIpvMhPy8vD4KTsAAbIXAAGyQAACnG2DAAP22ARbAAGyZgMAAbJLAIpvMgL28k07AAGyzwABstwAAmcJgvKUBFsAAbMCAwABsucAim8yE+bzFTsAAbxrAAG8jAACGSGDAAPoKARzAAG82FsAAbyUut7DAAEwIwABMULKwAQABhcAAb0TAIpypAMAAajY9i8AAb1LAIpwSHsAAb17AAG6JAQABgMAAb2rAIpvMAEnAAG97IhbAAG+GgMAAb3/AIpvMh3a8vgAhhsAAb5LAIpzMPgE9HMAAb6+BwABvqMAim9mApQEAARzAAG+8g8AAb7bAIpwSqT0AAAAAwABunwDAAGgdP0nAAG/XIYLAAG/cwCKb7z4CScAAcAIiFsAAcA2AwABwBsAim8yHdry+AIbAAHAYwCKczD4BPRzAAHAwLrSDAQABgMAAcETAIpvMAMAATIQ/ScAAcGMiIhbAAHBugMAAcGfAIpvMsny8vwAcwABwlhbAAHCRgMAAcIrAIpvMgL28k0gBAAFqwABwpWDAAP22wADi5ADAAP3FABzAAHDPFsAAcLsurw3AAEwIwABMTbK7AQABhcAAcN7AIpypALrxPgE9HMAAcRoWwABw8i67lsAATAjAAExLVgEAASbAAHEeAYDAAHEewCKbzGC8zADAAP10Pz9JwABxRiIWwABxUIPAAHFKwCKcErsxwABumQAcwABxaS67I8AATAgBAAGAwABxe8Aim8wAwABMdD4BPRzAAHGXgcAAcZDAIpvZgKUBAAEcwABxpIPAAHGewCKcEp5rAQABasAAcbJdwABoCwFgwABvN8AA73cAwABuoQDAAGgdP0nAAHHVFsAAcd+DwABx2cAinBK7L8AAbpg+Ak7AAHIcwAByKwAAuyFdwAD8MgFgwABolwEcwAByOy67IsAATAgBAAGAwAByWMAim8wAwABMc0FGwABya8AAcp/AAHJ+AAAAtGlgwABolwCHwAByj8Ainw0+Aj0cwABytIHAAHKtwCKb2YClAQABHMAAcsGDwAByu8AinBK7LQIAAmrAAHLRXcAAaAsBYMAAbzfAAO93FMAAcuDAIp9MCAAAwABuowDAAGgdScAAcv0hFsAAcwiDwABzAsAinBK7L8AAbpg+AULAAHMxAD8/ScAAc2QiFsAAc26DwABzaMAinBK7M8AAbpoAHMAAc4guuyTAAEwIAQABgMAAc5rAIpvMAMAATHU+AT0cwABztoHAAHOvwCKb2YClAQABHMAAc8ODwABzvcAinBKCigEAAWrAAHPSXcAAaAsBYMAAbzfAAO93AMAAbqIAwABoHT9JwABz9iGCwABz+8Aim+8+A0nAAHQhFsAAdCuDwAB0JcAinBK7L8AAbpg+AT0cwAB0thzAAHSDFsAAdFIuuxDAAEwIwABMRZkVAgAChMAAdI/AIpyENMAAdJsDwAB0m8AAdKMAAAAAAAAAXcAA/WcBYMAAboQBSsAAdKEBNQAAAAEAXcAA/WcBYMAAboQBHgDAAMDiAAFgwABuhAAAhwDAIqDXAMAA/MBWAQABg8AAdLrAIpwSAMAA/XQ/ScAAdNgWwAB04oPAAHTcwCKcErsxwABumT4BPRzAAHVqHMAAdTcWwAB1By67EcAATAjAAExGmRUCAAKEwAB1Q8AinIQ0wAB1TwPAAHVPwAB1VwAAAAAAAABdwAD9ZwFgwABuhAFKwAB1VQE1AAAAAQBdwAD9ZwFgwABuhAEeAMAAwOIAAWDAAG6EAACHAMAioYEAwAD8wFYBAAGDwAB1bsAinBIAwAD9dD9JwAB1jBbAAHWWg8AAdZDAIpwSuzPAAG6aPgE9HMAAdh8cwAB17BbAAHW8LrsSwABMCMAATEeZFQIAAoTAAHX4wCKchDTAAHYEA8AAdgTAAHYMAAAAAAAAAF3AAP1nAWDAAG6EAUrAAHYKATUAAAABAF3AAP1nAWDAAG6EAR4AwADA4gABYMAAboQAAIcAwCKiKwDAAPzAVgEAAYPAAHYjwCKcEgDAAP10Pz8+Aj2LwAB2WMAinBIewAB2ZMAAbokBAAGAwAB2cMAim8wAScAAdoEWwAB2jIDAAHaFwCKbzId2vL4+AT0cwAB2qIHAAHahwCKb2YClAQABHMAAdrWDwAB2r8AinBKpPQAAAADAAG6fAMAAaB0/ScAAdtYhgsAAdtvAIpvvPgE9HMAAdwsWwAB2/y67D8AATAjAAExEgL8CAAKAwAB3DMAim8yDwAB3FsAinBIAwAD8uj8/SsAAdy8Bg8AAdzbAIpwSBsAATHyAw8AAd0TAAHdJwACAwQAAu0nAAEwIAAAAAQPAAHdowACAwQAAAAQDA8AAd3wAAACZwmC8pQDAAHeOAAAAgmZgvLcAwAB3qQAAALslXgACAgJgvLddwABoCwFgwABu6gABV8AAbnQAXAABwAB3wQAAALSQYMAA+goBasAAd9tgwAD6CgBcAT4EScAAd+khFsAAd/WBwAB37sAio2aE/Ly8SsAAeAcAP07AAHgawAB4JQAApxtgwAD9tgEWwAB4LoHAAHgnwCKjZoC9vJNOwAB4RcAAeEsAALspYMAAboQBHMAAeFkWwAB4TS67D8AATAjAAExESwEAAYHAAHhawCKjZgDAAPy5ScAAeGccwAB4cYXAAHhrwCKj/UgBAAErAMAAbqQ+A07AAHiVwAB4nAAAtKJdwABoCwFgwABu6gEfwAB4osAAaDwAAWDAAG7qAAA9jcAAeL7AIqP9HMAAeMYuuzXAAEwIAwACgcAAeNbAIqNmhsAAeN7AIqRWAbSQg8AAeQrAIqOawABMe0nAAHkrFsAAeTaGwAB5L8AipFaDssAAaBc+AUnAAHlMg8AAeVDAIqOaPgE9MMAAeXYfwAB5gLXKAgACgcAAeZrAIqNmJMAAee8EJ7tKgcAAecbAIqNmJ7tLhcAAeenAIqP9AD4BPRzAAHoXgsAAeg3AIqNzIAIAAhbAAHoehcAAehjAIqP9pBDAAG6HhsAAeibAIqRWAAA/PgNOwAB6YMAAemkAAJ6tYMAAboQBhcAAemvAIqP9ScAAeniDwAB6fMAio5o+AT2NwAB6oMAio/0cwAB6roXAAHqowCKj/Z6rAAAAAMAAbqU/ScAAesUWwAB6z4XAAHrJwCKj/buuwABulz4HTsAAewLAAHsJAAC0ol3AAGgLAWDAAG7qAR/AAHsPwABoPAABYMAAbuoAAEnAAHstIhbAAHs3hcAAezHAIqP9uzHAAG6ZABzAAHtQLrsjwABMCAEAAYHAAHtiwCKjZgDAAEx0PgE9HMAAe36HwAB7d8AipcCApQEAARzAAHuLhcAAe4XAIqP9nmsBAAFqwAB7mV3AAGgLAWDAAG83wADvdwDAAG6hAMAAaB0/ScAAe7wWwAB7xoXAAHvAwCKj/bsvwABumD4CTsAAfAPAAHwSAAC7IV3AAPwyAWDAAGiXARzAAHwiLrsiwABMCAEAAYHAAHw/wCKjZgDAAExzQUbAAHxSwAB8hsAAfGUAAAC0aWDAAGiXABTAAHx2wCKmhggAPgI9HMAAfJuHwAB8lMAipcCApQEAARzAAHyohcAAfKLAIqP9uy0CAAJqwAB8uF3AAGgLAWDAAG83wADvdxTAAHzHwCKmxQkAAMAAbqMAwABoHUnAAHzkIRbAAHzvhcAAfOnAIqP9uy/AAG6YPgFCwAB9GAA/P0nAAH1LIhbAAH1VhcAAfU/AIqP9uzPAAG6aABzAAH1vLrskwABMCAEAAYHAAH2BwCKjZgDAAEx1PgE9HMAAfZ2HwAB9lsAipcCApQEAARzAAH2qhcAAfaTAIqP9gooBAAFqwAB9uV3AAGgLAWDAAG83wADvdwDAAG6iAMAAaB0/ScAAfdwhg8AAfeHAIqOaPgNJwAB+ByEWwAB+EoXAAH4MwCKj/bsxwABumT4BPTUAAAABAF3AAP1nAWDAAG6EARzAAH5VFsAAfjcuuxHAAEwIwABMRksBAAGEwAB+VsAio9gAwAD8uSMcwAB+YxQAwCKoBAgASAEAASsAACscwAB+YxQAwCKoBAgAhFkBAAGFwAB+asAio/0AwAD9dgFgwAD6Cj9JwAB+iCEWwAB+k4XAAH6NwCKj/bsvwABumD4BPTUAAAABAF3AAP1nAWDAAG6EARzAAH7ZFsAAfrouuxDAAEwIwABMRUsBAAGEwAB+2sAio9gAwAD8uSMcwAB+5xQAwCKolwgASAEAASsAACscwAB+5xQAwCKolwgAhFkBAAGFwAB+7sAio/0AwAD9dgFgwAD6Cj9JwAB/DCEWwAB/F4XAAH8RwCKj/bszwABumj4BPTUAAAABAF3AAP1nAWDAAG6EARzAAH9bFsAAfz0uuxLAAEwIwABMR0sBAAGEwAB/XMAio9gAwAD8uSMcwAB/aRQAwCKpKggASAEAASsAACscwAB/aRQAwCKpKggAhFkBAAGFwAB/cMAio/0AwAD9dgFgwAD6Cj8/ScAAf5Yig8AAf5rAIqOaACEcwAB/wIbAAH+3wCKlVrlAAQABhcAAf8vAIqP9AMAAbqY+AT0cwAB/9BbAAH/rFsAAf98ut1TAAEwIwABMYqS6wACDkKVPAgACgcAAgBHAIqNmJAAHJ7tKgcAAgD3AIqNmJ7uvJ7uwhsAAgGHAIqVWJ7uxhcAAgHTAIqP9ALWNPz0cwACAmYLAAICPwCKjcyACAAIWwACAoIXAAICawCKj/aQQwABuh4fAAICowCKlwAAAPwbAAEyDgMPAAIDGwACA6MAAgYwAALuyAWrAAIDHYMAA/RwCAAABA8AAgPbAAIGMAAAAAQEBwACBAwAAAJnCYLylAABdwAD8MgFgvKUBPgJOwACBJMAAgSkAAK2YXcAA/DIBYLylARzAAIFLFsAAgUIWwACBKy67nMAATAjAAExatfzAAHExSwEAAYDAAIFMwCKqmQDAAPy5SsAAgVYBIyEcwACBYoHAAIFdwCKqtEgBAAErAMAA/SmBwACBbMAiqrRqwACBc13AAPx0AWC8pcAA8b0BXcAA/DIBYLylBsAATISAw8AAgZHAAIGiwACCOgAAtIMBasAAgZJgwAD9HAIAAAEDwACBtcAAgjoAAAABAQHAAIHDAAAAliBgvLcAAFwBPgFJwACB0iIWwACB3oDAAIHWwCKrdoT8vLwAIRbAAIH7gMAAgfPAIqt2hBq8xD4BPRzAAIIkFsAAgg8uu6DAAEwIwABMXlYBAAGAwACCKMAiq3YAwAD9dD8GwABMhYDDwACCP8AAglDAAIKoAACzAQFqwACCQGDAAP0cAgAAAQPAAIJcwACCqAAAAAEBAcAAgmoAAACCZmC8twAAYMAA+goBPgFKwACCeAE1AAAAAQBgwAD6CgE1AAAAAQBgwABuhAEcwACCixbAAIJ/LrsPwABMCMAATERLAQABgMAAgozAIqwUAMAA/LkjHMAAgpWBAMAirD1IAQABKwAAKxbAAIKVgQDAIqw9u1LAAG5+AWDAAPoKIxzAAIKcgQDAIqwxSAEAASsAACqBAMAirDEBYMAA+goGwABMhoDDwACCrcAAgtDAAIjdAAC7swAAAAEDwACC5sAAiN0AAAAAAAAAXcAA/KUCYLylXcAA/WcBYLylAT4ETsAAgxLAAIMvAAC7tF3AAPylAmC8pV3AAP1nAWC8pQEewACDPcAA/KwAAmC8pV3AAP1nAWC8pQAAT8AAg+3AAIPyAAABu7VhAmC8pWDAAEwtXAADwACD/cAAh44AAAACAgLAAIQKAAAAmcJgvKUAwACEIQAAAIFUYMAATC0AAFwBPgRJwACELyEWwACEOYPAAIQ0wCKtabuMwABMNj4BSsAAhFUAPz0cwACEghbAAIRrLrucwABMCMAATFq7pwMAAYLAAISjwCKtXAK7qBbAAITNg8AAhMjAIq1pu4fAAEwwu6kWwACFDIPAAIUHwCKtabuIwABMMcAAcTpOwACFrsAAhbkAAITmYLylARzAAIXJFsAAhbsuu53AAEwIwABMW7K0AQABgsAAhdfAIq1cAMAAcWVDwACF4yEcwACF9YTAAIXqwCKt9kgBAAErAMAA/Sk+A07AAIYZwACGOwAAu7ZdwAD9ZwFgvKUBHMAAhmaAwACGScAirPuZFQIAAoTAAIaDwCKt9jTAAIaPA8AAho/AAIarAAAAAAAAAF3AAP1nAWC8pQFKwACGlQEewACGmcAAwOIAAWC8pQAAAMAA/MBGwACGtsAAhvbAAIbJAAAAXmDAAGJ2ABzAAIbiFsAAhtQuu53AAEwIwABMW7u3AQABgsAAhvDAIq1cAMAAcWY+AT0cwACHJIXAAIcCwCKuT1YBAAEWwACHMIbAAIcowCKuxJYgwABieADAAP10PYzAAIdMwCKt9hzAAIdnFsAAh1kuu53AAEwIwABMW7K0AQABhMAAh3XAIq32AMAAcWU9HMAAiJscwACIhS67pQAAAADAAEx9g/gBAAGBwACIo8AirTgAwAD8xErAAIi2AYDAAIi9wCKs+wbAAEyHgMPAAIjiwACI+cAAinAAALu4AAAAAQPAAIkXwACKcAAAAAAAAABdwAD8MgFgvLcBPgROwACJMsAAiUoAALu5XcAA/WcBYLy3AR7AAIlQwADA4gABYLy3AABGwACJacAAiaPAAIl7AAAAu7pgvLcAFsAAiY0uu6DAAEwIwABMXj4BScAAiascwACJry67JMAATAgBAAGBwACJwcAir/kAwABMdT4BPRzAAIn0gMAAidzAIq/KVgEAAYHAAIn4wCKv+QDAAP10Pz0cwACKM4DAAIobwCKvyoClAQABFsAAijouu5TAAEwIwABMSADAAP11SsAAik4BgMAAilXAIq/KBsAATIiAw8AAinXAAIqGwACK2AAApOcBasAAinZgwAD9HAIAAAEDwACKk8AAitgAAAABAQHAAIqgAAAAmcJgvKUAAFwBPgE9HMAAisIWwACKqy67nMAATAjAAExapOcBAAGAwACK0MAisMsAwABxNAbAAEyJgMPAAIrdwACK7sAAi/gAALu7AWrAAIreYMAA/RwCAAABA8AAivvAAIv4AAAAAwMDwACLEAAAAIJmYLy3AMAAiyQAAACCkGC8pQDAAIs4AAAAu7xgwABv9QAAYMAA+goBPgFKwACLtAEcwACLuy67vQMAAxbAAIvVgMAAi87AIrE7hPm8xYHAAIvlwCKxSILAAIvrwCKxVQDAAEyKBsAATIqAw8AAi/3AAIwCwACPVAAAu70AAAABA8AAjBTAAI9UAAAAAwMDwACMIQAAALu+YLylAMAAjEEAAACCkGC8pQDAAIxbAAAAu7xgwABv9QAAYMAA+goBPgJHwACMa4LAAIxzwCKx6wMBwACMmGrAAIyYYMAAb/XAAOeRAD4BSsAAjKcBHMAAjMUWwACMri67nMAATAjAAExau78CAAKAwACM6sAisdGBwACM/sAisd4AwABxPAHAAI0easAAjR5gwABv9cAA56gAPgFKwACNNgEcwACNVBbAAI09LrucwABMCMAATFq7wAIAAoDAAI14wCKx0YHAAI2MwCKx3gDAAHE9AcAAjaxqwACNrGDAAG/1wADnQgA+AknAAI29IhzAAI3UgMAAjcHAIrHRSAEAARbAAI3nFsAAjdcus7/AAEwIwABMT5rFuDsAwAD9KQEcwACOE4DAAI4AwCKx0UgBAAEWwACOJhbAAI4WLrO/wABMCMAATE+xC7iEAMAA/Sk+AUrAAI6JASk/SsAAjqgBHMAAjsYWwACOry67nMAATAjAAExau8ECAAKAwACO6sAisdGBwACO/sAisd4AwABxPj0wwACPDx/AAI8ZwAD7YgEAASTAAI9PAye7woLAAI9FwCKx6yeBagAGwABMi4DDwACPWcAAj3LAAJqsAAClDwFqwACPWmDAAP0cAgAAAQPAAI98wACarAAAAAEBAcAAj5AAAACkumC1hwAAYMAATVEBPgtOwACPw8AAj+AAALu0XcAA/KUCYLylXcAA/WcBYLylARzAAI/qLruzAAAAAMAATIZOwACQFsAAkCMAALNHYMAAgcYBHMAAkDoWwACQJS63t8AATAjAAExTgogAAAAAwACB6j0XwACQRy67nsAATAgpwABMXE7AAJB7wACQiwAAt2hdwAD8pQJgvLdgwABuhAEywACQjWC8t2DAAG6EAD0cwACQohbAAJCVLrsPwABMCMAATESD+AEAATTAAJCqA8AAkKrAAJI9AAAAAgICwACQuAAAAIJmYLy3AMAAkMwAAAC7ZmDAAG6EAABgwAD82QE+AUnAAJDhFsAAkPGFwACQ5cAitLe7UsAAbn4+Aj0cwACREoPAAJEDwCK0UoC/AgAChMAAkRPAIrSqhcAAkR3AIrS3AMAA/LpAHMAAkUsWwACROS67osAATAjAAExhgxcBAAGEwACRVMAitKoAwAD9c8AAkTnAAJFbASTAAJGiBSe3wYTAAJFywCK0qie7w4XAAJGVwCK0tyeBaj4BQCEcwACR1hbAAJHELruiwABMCMAATGGDFwEAAYTAAJHfwCK0qgDAAP1zwACRw8AAkeYBJMAAki0FJ7fBhMAAkf3AIrSqJ7vEhcAAkiDAIrS3J4FqAMAA/MRGwACSRMAAknPAAJJWAAAAgmZgvLcAFsAAkmAuu6LAAEwIwABMYT4BQBzAAJKPFsAAkoIuuw/AAEwIwABMRIdBAQABhMAAkpvAIrXMAMAA/LjAAJKCwACSogEkwACS3gMnt8GEwACSt8Aitcwnu8VOwACS/8AAkxEAALmEXcAA/WcBYMAAYnYBHsAAkxfAAMDiAAFgwABidgAAPRzAAJNHHMAAkzEuu6UAAAAAwABMfYP4AQABNMAAk08DwACTT8AAlGYAAAACAgLAAJNQAAAAgLVgvKUAwACTZQAAAIFUYMAATC0AAGDAAPzZAT4BScAAk3MhHMAAk40WwACTfIbAAJN3wCK2mbuGwABML0gBAAErAMAA/Sk+AUbAAJOgwACT3sAAk7MAAAC7xl3AAP1nAWDAAEwiABbAAJPWFsAAk8WGwACTwMAitpm7hsAATC8pwAD8yD4BRsAAk+rAAJQPwACT+AAAAJVxYMAATCIAh8AAlATAIrblPgE9HMAAlC+EwACUHcAitjNWAQABFsAAlDwUwACUM8AityMIAIKQwABMJADAAP10PwDAAPzETsAAlHvAAJSHAACkzGDAAE1RAR/AAJSNwACHXxwAARbAAJSeLrdUwABMCMAATGIbehbAAJS8LrGtwABMCMAATEyk5SbAAJTiARbAAJTiLq8NwABMCMAATE1guv23dxbAAJUKLruXwABMCMAATE6y+ybAAJUuARbAAJUuLrO/wABMCMAATE9guRS3bxzAAJVmFsAAlVMut7bAAEwIwABMUYKIAAAAAMAAamO3cxzAAJWgFsAAlYguu5jAAEwIwABMUoKIAAAAAMAAee2zR4LAAJW/wCK0DrZ3HMAAlf0WwACV5y67m8AATAjAAExXgogAAAAAwABvpLfFFsAAlh4uu5nAAEwIwABMVLP1FsAAlkYuu5rAAEwIwABMVbvHFsAAlnYuuwrAAEwIwABMPbd4FsAAlsAWwACWpi63uMAATAjAAExWt3jAAHpsu8gWwACW8C67oMAATAjAAExeu7kcwACXJy67uAAAAADAAEyHt2iDwACXYsAitFK1/BbAAJedFsAAl4Yuu5zAAEwIwABMWrX8wABxMbu0gcAAl87AIrPeqlscwACYGxbAAJgELrucwABMCMAATFqCiAAAAADAAHEzpPocwACYVRbAAJg9LrfXwABMCMAATFiCiAEAARbAAJhbLrGtwABMCMAATEwAwABub7tUFsAAmHguuxPAAEwIwABMSbtZFsAAmKsuu1nAAG+Tu1oWwACY9C67WsAAb5S7UxbAAJk3LrtTwABvlbtnFsAAmXAuu6HAAEwIwABMYLvJFsAAmcQuu5bAAEwIwABMS7MQFsAAmgUuu5XAAEwIwABMSrmEhMAAmjHAIrYzScAAmkkawACaTaQyPgE9F8AAmmsuu5/AAEwIhcAAmn/AIrdywABMXT9KwACalgGFwACancAit3IAACJzzAAidA4AInRQACJ0iQAidTMAInWUACJ17wAidjUAInalACJ3gwAieDEAInu3ACJ9+QAif1IAIn+kACKAQQAigNgAIoFvACKH3wAiihwAIoqNACKLEgAilegAIpZGACKW+AAimKcAIpnHACKbngAioysAIqpkACKrQQAiq98AIqy6ACKvkgAisJYAIrEGACKxpwAis5IAIroZAAAAJgAAAYDDACK6vAAiYEMAImEvACJknQAiZ7EAImvvACK6ugAAAAUAIrq8AAAAAAAAAMAATI67yoDEAAADgQIAALyQAACBJgAAgeAA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FsAASi4WwABKIC60acAATkKDwcAAaKsAwAD89wDAAPz1RsAASjzAAEpowABKVAAAAICWYMAATZYAFsAASl0uW8AATkM+AT2IwABKcMAjMgccwABKeYDAAEpwwCMyB4O7AQABHMAASn83F4OIAQABFsAASoeBwABKgcAjMraDwcAATZ0AwAD89wDAAPvqSsAASpsBgMAASqLAIzIHBsAATk2Ax8AASrPAAErEwABMDQAAvCXAAE1uAWrAAEq0YMAA/RwCAAABA8AASsvAAEwNAAAAAQEBwABK6gAACIPWYMAATj4AAGDAAPoKAT4FScAASvchHMAASwAWwABK+y6CkMAATkBIAQABFsAASwmAwABLA8AjM2GCkMAATkAAwABiiErAAEsPASo/ScAASyEhHMAASywWwABLJS6CRcAATkFIAQABFsAASzWAwABLL8AjM2GCRcAATkEAwAD9KUrAAEs9ASo/ScAAS08hHMAAS2EWwABLUy60acAATkJIAQABFsAAS2qAwABLZMAjM2G0acAATkIAwABot0rAAEt5ASo/RcAAS4sBwABLlMAAS5YAAGJgwAD70AGTARzAAEudgcAAS5vAIzQzYwEAARbAAEupFsAAS58uW8AATkNhwAD8owDAAPz9AYnAAEuxwCM0MxzAAEuygcAAS7HAIzQzZAEAAZQAwAD89T4BScAAS74hHMAAS88cwABLyxbAAEvCLlvAAE5DSwEAAYHAAEvMwCM0MwDAAPyDSAEAARzAAEvhFsAAS9iAwABL0sAjM2FbwABOQ0sBAAGBwABL4sAjNDMAwAD8gwDAAE2rSsAAS+YBKj9KwABL/gEpBsAATkaAx8AATBLAAEwnwABMOgEAvCkBasAATBNgwAD9HAIAAAEDwABMMsAATDoAAAAAAAAAYMAA+goBSsAATDUBKgbAAE5HgMfAAEw/wABMVMAATJQBALwqAWrAAExAYMAA/RwCAAABA8AATGDAAEyUAAAAAAAAAGDAAPoKAT4BSsAATGYBHMAATHcWwABMbS5bwABOQ4HUAQABNMAATHsDwABMe8AATI8AAAABAQHAAEx8AAAAg01gwABNlgAAYMAA+goBSsAATIIBFsAATISAwABMgsAjNbW8KsAATZ8AwAD8RwAAIynZACMqGQAjKogAIyvJACMs0gAjLWIAIy5kACMxxAAjMygAIzUFACM1SAAjNeoAAAALAsAATlSAx8AATNbAAEzcwABYlgO8XAAAAWDAAE2WAAABBMAATlaAx8AATTjAAE1DCYW5AF3AAPx0AWDAAE2WAAEFwABOZIDHwABNSMAATUjAAE13AAAAA8AATWXAAE13AAAAAQEBwABNawAABIW5XcAA/HQBYMAATZYAAGDAAE5UAT8CCAHAAE5WgADAIzaFCQHAAE1IwABNrgAAAAAJBsAATliAx8AATXzAAE2jwABNzQEAgmcBasAATX1gwAD9HAIAAAEDwABNqMAATc0AAAAAAAAAYMAATW8BSsAATasBasAATcJgwABNb8AA8kQGwABOW4DHwABN0sAATd7AAE5LAACETQFqwABN02DAAP0cAgAAAQPAAE3kwABOSwAAAAIBAsAATf8AAACHLl3AAE+XAltbAMAATgkAAACCU1sBagBgwAD82XcAWwE+AUrAAE4ZARzAAE4ogMAATiDAIzdDvF0CAAIugcAATj/AIzdVAMAAT6QGwABOXYDHwABOUMAATmHAAE95AAC8JMAATW4BasAATlFgwAD9HAIAAAEDwABOdsAAT3kAAAABAQHAAE6EAAAAg+RgwAD+AAAAXAE+BD0cwABOkYDAAE6OwCM3zoKKAQABJ7xeAMAA/hROwABOwMAATsoAALw/YMAA/bYBJwBGwABO1MAATwLAAE7sAAAAgJZgwABNlgAWwABO9S6FucAATlY+Az0cwABPDYDAAE8KwCM3zoKKAQABgcAATxPAIzf/AMAA/hQ9HMAATyuCwABPJcAjOBy8JMAATW4BAAGAwABPQcAjN84AwABNqD2JwABPTMAjN/8ngKc9HMAAT2qAwABPZ8AjN86CigEAASe8QADAAP4UBsAATmCAx8AAT37AAE+dwABQMgAArvgBasAAT39gwAD9HAIAAAEDwABPosAAUDIAAAABAQHAAE+3AAAAW2DAAIiqAABgwABNlgE+AUrAAE/IAR/AAE/TwABOZAEAARzAAFAlHMAAUAYWwABP+i6FucAATlaAqwEBYMAATZYBNMAAUAoDwABQCsAAUCMAAAABAQHAAFALAAAAgdVgwABNlgAAYMAATZYBSsAAUBEBHMAAUBOBwABQEcAjOTyu+AEAAYDAAFAZwCM43wDAAE2iAMAA/D2ArQAAAADAAPxIAAbAAE5hgMfAAFA3wABQUcAAVeYAAJ7eAWrAAFA4YMAA/RwCAAABA8AAUFnAAFXmAAAAAQEBwABQcAAAAICJYMAAiIAAAGDAAGC7AT4FTsAAUIjAAFCQAAC4qWDAAPoKASlOwABQqcAAUKwAAIPkYMAA/gABH8AAULLAAP4fAAAAAEbAAFDGAMAAUN4AAACCa2DAAE2WABbAAFDsLoW5wABOVkE+A07AAFEPwABRFQAAgJZgwABguwEcwABRIoPAAFEXwCM6EJ7eAQABgMAAUSvAIzm+AMAATaNJwABRPyEWwABRSoTAAFFEwCM6L7iWwABgvT4CPYnAAFFgwCM51ypCwABR9gA/ScAAUg4WwABSGITAAFISwCM6L7NbwABgyz4BScAAUi8lwABSOYTAAFIzwCM6L2DAAGFxPgE9HMAAUmCCwABSXcAjOeuCigEAARbAAFJsFMAAUmbAIzovBAFgwABhcZ1vwABhcwDAAP4UScAAUoklwABSk4TAAFKNwCM6L2DAAGEUPgE9HMAAUreCwABStMAjOeuCigEAARbAAFLDFMAAUr3AIzovBAFgwABhFKlUwABhFgDAAP4UScAAUt0lwABS54TAAFLhwCM6L2DAAGEuPgE9HMAAUw6CwABTC8AjOeuCigEAARbAAFMaFMAAUxTAIzovBAFgwABhLqqLwABhMADAAP4UScAAUzclwABTQYTAAFM7wCM6L2DAAGFGPgE9HMAAU2aCwABTY8AjOeuCigEAARbAAFNyFMAAU2zAIzovBAFgwABhRpznwABhSwDAAP4UScAAU40lwABTl4TAAFORwCM6L2DAAGD6PgE9HMAAU7yCwABTucAjOeuCigEAASsAwAD+FD8+Az0cwABT9oDAAFPqwCM5vqU+AwADg8AAVA/AIzoQasAAVCdgpOTAAL6MMsAAVExbWwInhf+DwABUZMAjOhAngpAcwABUiITAAFSCwCM6L4aYAQABFsAAVJyAwABUkMAjOb6y+8AAiIIAwABg2ADAAIiPPYnAAFTAwCM51ypCwABVVgBJwABVcoHAAFV2wCM51z4BSsAAVYcBHsAAVY7AAGj1AQABHMAAVa6CwABVq8AjOesjAAAAAMAA/hkAP0rAAFXFAR/AAFXQwABiSQAAAAAGwABOXoDHwABV68AAVfvAAFa0AACGW8AATW4BasAAVexgwAD9HAIAAAEDwABWC8AAVrQAAAAAAAAAYMAA+9ABPgNOwABWGMAAViEAAIPBYMAA+9ABHMAAViY3EYOIAQABFsAAVjQWwABWKC6FucAATlZhwAD8owDAAPz3RsAAVkDAAFZuwABWWAAAAICWYMAATZYAFsAAVmEuhbnAAE5WPgE9iMAAVnbAIz0tHMAAVn+AwABWdsAjPS2DuwEAARzAAFaFNxODiAEAARbAAFaNgcAAVofAIz1vg8HAAE2dAMAA/PcAwAD76krAAFahAYDAAFaowCM9LQbAAE5fgMfAAFa5wABWysAAV8sAALwlwABNbgFqwABWumDAAP0cAgAAAQPAAFbRwABXywAAAAEBAcAAVvAAAAiD1mDAAE5UAABgwAD6CgE+A0nAAFb9IRzAAFcUFsAAVw0WwABXAS6FucAATlZhwAD8o0gBAAEWwABXKRbAAFcdgMAAVxfAIz4bhbnAAE5WYcAA/KMAwAD880rAAFcxASo/RcAAV0MBwABXTMAAV04AAGJgwAD70AGTARzAAFdVgcAAV1PAIz6JYwEAARbAAFdjFsAAV1cuhbnAAE5WYcAA/KMAwAD8/QGJwABXa8AjPokcwABXbIHAAFdrwCM+iWQBAAGUAMAA/PU+AUnAAFd4IRzAAFeLHMAAV4cWwABXfC6FucAATlZLAQABgcAAV4jAIz6JAMAA/INIAQABHMAAV58WwABXlIDAAFeOwCM+G4W5wABOVksBAAGBwABXoMAjPokAwAD8gwDAAE2rSsAAV6QBKj9KwABXvAEpBsAATmKAx8AAV9DAAFfqwABYOAAAvCMBasAAV9FgwAD9HAIAAAEDwABX9sAAWDgAAAABAQHAAFgGAAAAsvtguDAAAGDAAGJ2AUrAAFgfARbAAFgugMAAWB/AIz+Thbq4VwbAAE5ZgMfAAFg9wABYUsAAWJQBALwqAWrAAFg+YMAA/RwCAAABA8AAWF7AAFiUAAAAAAAAAGDAAPoKAT4BSsAAWGQBHMAAWHcWwABYay6FucAATlaB1AEAATTAAFh7A8AAWHvAAFiPAAAAAQEBwABYfAAAAINNYMAATZYAAGDAAPoKAUrAAFiCARbAAFiEgMAAWILAI0AtvCrAAE2fAMAA/EcAACM2vgAjNw4AIzeVACM4qgAjOYkAIzzqACM94gAjP14AIz+/ACNAYgAAAAkCwABOZYDHwABYrcAAWLPAAFv6A7xfAAABYMAATZYAAAEEwABOZ4DHwABY+MAAWPwJgL0AYMAA/bYAAQXAAE5zgMfAAFkBwABZAcAAWSQAAAADwABZGcAAWSQAAAABAQHAAFkfAAAEgL1gwAD9tgAAYMAATmUBPwIIAcAATmeAAMAjQO8JAcAAWQHAAE2uAAAAAAcGwABOaYDHwABZKcAAWVDAAFl1AQCCZwFqwABZKmDAAP0cAgAAAQPAAFlVwABZdQAAAAAAAABgwABNbwFKwABZWAFqwABZb2DAAE1vwADz7AbAAE5rgMfAAFl6wABZhsAAWe4AAIRNAWrAAFl7YMAA/RwCAAABA8AAWYzAAFnuAAAAAgECwABZpwAAAIcuXcAAT5cCW1sAwABZsQAAAIJTWwFqAGDAAPzZdwBbAT4BSsAAWcEBHMAAWdCAwABZyMAjQae8YAIAAi6BwABZ4sAjQbkAwABPpQbAAE5tgMfAAFnzwABaBMAAWlMAALwkwABNbgFqwABZ9GDAAP0cAgAAAQPAAFoZwABaUwAAAAEBAcAAWicAAACD5GDAAP4AAABcAT4BPRzAAFo0gMAAWjHAI0IygooBAAEkwABaTgMnvGEWwABaSC6AvcAATmcngyEAwAD+FAbAAE5ugMfAAFpYwABaaMAAWpAAAIZbwABNbgFqwABaWWDAAP0cAgAAAQPAAFp4wABakAAAAAAAAABgwAD70AFKwABafgEcwABagTcNg4gBAAEWwABaiBbAAFqDLoC9wABOZ4PBwAD9uwDAAPz3BsAATm+Ax8AAWpXAAFqmwABa8QAAvCXAAE1uAWrAAFqWYMAA/RwCAAABA8AAWq3AAFrxAAAAAQEBwABaxwAACIPWYMAATmUAAGDAAPoKAT4BSsAAWtQBHMAAWuAWwABa2y6AvcAATmdIAQABFsAAWumAwABa48AjQx6AvcAATmcAwAD9xQbAAE5wgMfAAFr2wABbEMAAW4sAAJ7eAWrAAFr3YMAA/RwCAAABA8AAWxjAAFuLAAAAAQEBwABbLwAAAICJYMAAiIAAAGDAAGC7AT4BSsAAW0IBHsAAW0nAAGkCAgACFsAAW3KAwABbZsAjQ5+y+8AAiIIWwABbgi6AvcAATmcABsAATnGAx8AAW5DAAFuqwABb+AAAvCMBasAAW5FgwAD9HAIAAAEDwABbtsAAW/gAAAABAQHAAFvGAAAAsvtguDAAAGDAAGJ2AUrAAFvfARbAAFvugMAAW9/AI0Qfhea4WAAAI0EiACNBcgAjQfkAI0J3ACNC5QAjQ2oAI0PqACNESwAAAAcCwABOdIDHwABcD8AAXBXAAGAcA7xiAAABYMAATZYAAAIEwABOdoDHwABcjcAAXJEJgpAAYMAAYk8ABMAATneAx8AAXKLAAFymCYC9AGDAAP22AAEFwABOg4DHwABcq8AAXKvAAF1SAAAAA8AAXMHAAF1SAAAAAgICwABcxwAABIKQYMAAYk8AwABc0gAABIC9YMAA/bYAAGDAAE50AT4BQCIiFsAAXOoWwABc5S6CkMAATnazF8AAYlYBFsAAXQIWwABc/S6CkMAATna6WcAAYlcBFsAAXRQWwABdDy6CkMAATnaHeMAAYlTAAFzlwABdHQEkwABdTQInvGMWwABdSC6CkMAATnYDCAHAAE52gADAI0TpCAHAAE53gQDAI0T4CQHAAFyrwABNrgAAAAAHBsAATnmAx8AAXVfAAF1+wABdoQEAgmcBasAAXVhgwAD9HAIAAAEDwABdg8AAXaEAAAAAAAAAYMAATW8BSsAAXYYBasAAXZ1gwABNb8AA9AYGwABOe4DHwABdpsAAXbLAAF4YAACETQFqwABdp2DAAP0cAgAAAQPAAF24wABeGAAAAAIBAsAAXdMAAACHLl3AAE+XAltbAMAAXd0AAACCU1sBagBgwAD82XcAWwE+AUrAAF3tARzAAF38gMAAXfTAI0YlnuQCAAIugcAAXgzAI0Y3AMAAT6YGwABOfYDHwABeHcAAXi7AAF57AAC8JMAATW4BasAAXh5gwAD9HAIAAAEDwABeQ8AAXnsAAAABAQHAAF5RAAAAg+RgwAD+AAAAXAE+AT0cwABeXoDAAF5bwCNGsIKKAQABJMAAXnYDJ7xkFsAAXnAugpDAAE52J4MhAMAA/hQGwABOgIDHwABegMAAXprAAF8TAACe3gFqwABegWDAAP0cAgAAAQPAAF6iwABfEwAAAAEBAcAAXrkAAACAiWDAAIiAAABgwABguwE+AUrAAF7MAR7AAF7TwABo+QIAAhbAAF76gMAAXu7AI0cqsvvAAIiCFsAAXwougpDAAE52AAbAAE5+gMfAAF8YwABfKMAAX1AAAIZbwABNbgFqwABfGWDAAP0cAgAAAQPAAF84wABfUAAAAAAAAABgwAD70AFKwABfPgEcwABfQTcNg4gBAAEWwABfSBbAAF9DLoKQwABOdoPBwAD9LwDAAPz3BsAATn+Ax8AAX1XAAF9mwABfrwAAvCXAAE1uAWrAAF9WYMAA/RwCAAABA8AAX23AAF+vAAAAAQEBwABfhQAACIPWYMAATnQAAGDAAPoKAT4BSsAAX5IBHMAAX54WwABfmS6CkMAATnZIAQABFsAAX6eAwABfocAjSByCkMAATnYAwAD9KQbAAE6BgMfAAF+0wABfzsAAYBoAALwjAWrAAF+1YMAA/RwCAAABA8AAX9rAAGAaAAAAAQEBwABf6gAAALL7YLgwAABgwABidgFKwABgAwEWwABgEoDAAGADwCNInYWBuFsAACNFoAAjRfAAI0Z3ACNG9QAjR3UAI0fjACNIaAAjSMkAAAAHAsAAToSAx8AAYHTAAGB6wABp/gO8ZQAAAWDAAE2WAAACBMAAToaAx8AAYMfAAGDRCYJrAGDAAE2WAATAAE6HgMfAAGDkwABg6AmCkABgwABiTwABBcAATpSAx8AAYO3AAGDtwABhHQAAAAPAAGEBwABhHQAAAAICAsAAYQcAAASCa2DAAE2WAMAAYRgAAASCkGDAAGJPAABgwABOhAE/AwgBwABOhoAAwCNJZwgBwABOh4EAwCNJdgkBwABg7cAATa4AAAAACAbAAE6JgMfAAGEiwABhScAAYWoBAIJnAWrAAGEjYMAA/RwCAAABA8AAYU7AAGFqAAAAAAAAAGDAAE1vAUrAAGFRAWrAAGFoYMAATW/AAPHoBsAATouAx8AAYW/AAGF7wABh3wAAhE0BasAAYXBgwAD9HAIAAAEDwABhgcAAYd8AAAACAQLAAGGcAAAAhy5dwABPlwJbWwDAAGGmAAAAglNbAWoAYMAA/Nl3AFsBPgFKwABhtgEcwABhxYDAAGG9wCNKOrxmAgACLoHAAGHTwCNKTADAAE+aBsAATo2Ax8AAYeTAAGH1wABigwAAvCTAAE1uAWrAAGHlYMAA/RwCAAABA8AAYgrAAGKDAAAAAQEBwABiGAAAAIPkYMAA/gAAAFwBPgM9HMAAYiWAwABiIsAjSsWCigEAASe8ZwDAAP4UPRzAAGJIFsAAYj0ugmvAAE6GvCTAAE1uAQABgMAAYl7AI0rFAMAATag9HMAAYmqAwABiZ8AjSsWCigEAASTAAGJ+Aye5thbAAGJ4LoKQwABOhyeDIQDAAP4UBsAATpCAx8AAYojAAGKiwABoFQAAnt4BasAAYolgwAD9HAIAAAEDwABiqsAAaBUAAAABAQHAAGLBAAAAgIlgwACIgAAAYMAAYLsBPgZOwABkgcAAZJEAALxoYMAAYLsBHMAAZJ4WwABkky6Ca8AAToae3gEAAYDAAGSnwCNLhADAAE2jScAAZLohFsAAZMuAwABkv8AjS4S8acAAiIZKwABk1wGBwABk3sAjS50/TsAAZSLAAGUxAACrfWDAAGJPARzAAGVLgcAAZTvAI0udhpgBAAEWwABlX4DAAGVTwCNLhLL7wACIggDAAGDYTsAAZb7AAGXMAAC8amDAAGJPARzAAGXagMAAZc7AI0uEvGsBAAEWwABl6y6CkMAATocAwACIjUnAAGZYIR7AAGZdwABo/wMAAxbAAGaMgMAAZoDAI0uEhWfAAIiDgsAAZpPAI0v+g8AAZqPAI0w9AD4CPRzAAGdCgMAAZzbAI0uEpT4DAAMWwABnTi6Ca8AAToZqwABnZmCk5MAAvcgywABnh1tbAyeF/xbAAGeULoJrwABOhieCkILAAGeowCNL/ie8bBbAAGfELoKQwABOhwDAAIiPSsAAZ9IBH8AAZ93AAGJJAAAAAD9KwABn+wGBwABoAsAjS50GwABOkYDHwABoGsAAaDnAAGiqAACu+AFqwABoG2DAAP0cAgAAAQPAAGg+wABoqgAAAAEBAcAAaFMAAABbYMAAiKoAAGDAAE2WAT4BSsAAaGQBH8AAaG/AAE6UAgACHMAAaI8WwABohC6Ca8AAToau+AEAAYDAAGiVwCNNaQDAAE2iFsAAaKEugpDAAE6HAAbAAE6OgMfAAGivwABov8AAaQIAAIZbwABNbgFqwABosGDAAP0cAgAAAQPAAGjPwABpAgAAAAAAAABgwAD70AFKwABo1QEcwABo6BzAAGjYNw2DiAEAARbAAGjfFsAAaNougpDAAE6Hg8HAAP0vAMAA/PdkAQABHMAAaO03EYOIAQABFsAAaPoWwABo7y6Ca8AAToaDwcAATZ0AwAD89wDAAPz1BsAATo+Ax8AAaQfAAGkYwABpgQAAvCXAAE1uAWrAAGkIYMAA/RwCAAABA8AAaR/AAGmBAAAAAQEBwABpNQAACIPWYMAAToQAAGDAAPoKAT4BSsAAaUIBIhzAAGlUFsAAaUkugmvAAE6GSAEAARbAAGldgMAAaVfAI06ggmvAAE6GAMAATasAHMAAaXAWwABpay6CkMAATodIAQABFsAAaXmAwABpc8AjTqCCkMAATocAwAD9KQbAAE6SgMfAAGmGwABpoMAAafwAALwjAWrAAGmHYMAA/RwCAAABA8AAaazAAGn8AAAAAQEBwABpvAAAALL7YLgwAABgwABidgFKwABp1QEmwABp1QEcwABp4BbAAGnVLoJrwABOhrwjAQABgMAAae3AI09RAMAATaRgwABidgAAI0m1ACNKBQAjSowAI0tPACNNNAAjTcMAI05nACNPHAAjT5oAAAAIAsAATpWAx8AAajjAAGo+wABtlAO8bQAAAWDAAE2WAAABBMAATpeAx8AAaofAAGqOCZYgAGC8yQABBcAATqKAx8AAapPAAGqTwABquAAAAAPAAGqqwABquAAAAAEBAcAAarAAAASWIGC8yQAAYMAATpUBPwIIAcAATpeAAMAjUCEJAcAAapPAAE2uAAAAAAYGwABOmYDHwABqvcAAauTAAGsIAQCCZwFqwABqvmDAAP0cAgAAAQPAAGrpwABrCAAAAAAAAABgwABNbwFKwABq7AFqwABrA2DAAE1vwADy1AbAAE6bgMfAAGsNwABrGcAAa4AAAIRNAWrAAGsOYMAA/RwCAAABA8AAax/AAGuAAAAAAgECwABrOgAAAIcuXcAAT5cCW1sAwABrRAAAAIJTWwFqAGDAAPzZdwBbAT4BSsAAa1QBHMAAa2OAwABrW8AjUNeFDgIAAi6BwABrdMAjUOkAwABPqAbAAE6dgMfAAGuFwABrlsAAa+oAALwkwABNbgFqwABrhmDAAP0cAgAAAQPAAGurwABr6gAAAAEBAcAAa7kAAACD5GDAAP4AAABcAT4BPRzAAGvGgMAAa8PAI1FigooBAAEkwABr5QMnvG4WwABr3C6WIMAATpcngyEAwAD+FAbAAE6ggMfAAGvvwABsCcAAbOwAAJ7eAWrAAGvwYMAA/RwCAAABA8AAbBHAAGzsAAAAAQEBwABsKAAAAICJYMAAiIAAAGDAAGC7AT4BSsAAbDsBHMAAbE6AwABsQsAjUdy8bwIAAhbAAGxcLpYgwABOlzTAAGxlA8AAbGXAAGznAAAAAAAAAGDAAGC7AT4CTsAAbIPAAGyMAACF/2DAAE2WARzAAGyagMAAbI7AI1HcvHABAAEWwABsqy6WIMAATpcAwACIikrAAGy7ARzAAGzLgcAAbMLAI1I3nt4BAAGAwABs1MAjUdwAwABNowDAAIiSBsAATp6Ax8AAbPHAAG0BwABtLAAAhlvAAE1uAWrAAGzyYMAA/RwCAAABA8AAbRHAAG0sAAAAAAAAAGDAAPvQAUrAAG0XARzAAG0aNw2DiAEAARbAAG0kFsAAbRwuliDAAE6Xg8HAAP0vAMAA/PcGwABOn4DHwABtMcAAbULAAG2SAAC8JcAATW4BasAAbTJgwAD9HAIAAAEDwABtScAAbZIAAAABAQHAAG1iAAAIg9ZgwABOlQAAYMAA+goBPgFKwABtbwEcwABtfhbAAG12LpYgwABOl0gBAAEWwABth4DAAG2BwCNTQJYgwABOlwDAAP0pAAAjUFIAI1CiACNRKQAjUacAI1KZACNTBwAjU4wAAAAGAsAATqOAx8AAbcPAAG3JwABxCwO8cQAAAWDAAE2WAAABBMAATqWAx8AAbhTAAG4bCZYgAGC88AABBcAATrCAx8AAbiDAAG4gwABuTQAAAAPAAG4/wABuTQAAAAEBAcAAbkUAAASWIGC88AAAYMAATqMBPwIIAcAATqWAAMAjVAsJAcAAbiDAAE2uAAAAAAYGwABOp4DHwABuUsAAbnnAAG6mAQCCZwFqwABuU2DAAP0cAgAAAQPAAG5+wABupgAAAAAAAABgwABNbwFKwABugQFqwABumGDAAE1vwAD0OgbAAE6pgMfAAG6rwABut8AAbyYAAIRNAWrAAG6sYMAA/RwCAAABA8AAbr3AAG8mAAAAAgECwABu2AAAAIcuXcAAT5cCW1sAwABu4gAAAIJTWwFqAGDAAPzZdwBbAT4BSsAAbvIBHMAAbwGAwABu+cAjVMG8cgIAAi6BwABvGsAjVNMAwABPpwbAAE6rgMfAAG8rwABvPMAAb5gAALwkwABNbgFqwABvLGDAAP0cAgAAAQPAAG9RwABvmAAAAAEBAcAAb18AAACD5GDAAP4AAABcAT4BPRzAAG9sgMAAb2nAI1VMgooBAAEkwABvkwMnvHMWwABvii6WIMAATqUngyEAwAD+FAbAAE6ugMfAAG+dwABvt8AAcFsAAJ7eAWrAAG+eYMAA/RwCAAABA8AAb7/AAHBbAAAAAQEBwABv1gAAAICJYMAAiIAAAGDAAGC7AT4CTsAAb/zAAHAFAACF/2DAAE2WARzAAHATgMAAcAfAI1XGvHQBAAEWwABwJC6WIMAATqUAwACIiUrAAHAyARzAAHBCgcAAcDnAI1Xfnt4BAAGAwABwS8AjVcYAwABNowbAAE6sgMfAAHBgwABwcMAAcJsAAIZbwABNbgFqwABwYWDAAP0cAgAAAQPAAHCAwABwmwAAAAAAAABgwAD70AFKwABwhgEcwABwiTcNg4gBAAEWwABwkxbAAHCLLpYgwABOpYPBwAD9LwDAAPz3BsAATq2Ax8AAcKDAAHCxwABxCQAAvCXAAE1uAWrAAHChYMAA/RwCAAABA8AAcLjAAHEJAAAAAQEBwABw2QAACIPWYMAATqMAAGDAAPoKAT4BSsAAcOYBHMAAcPUWwABw7S6WIMAATqVIAQABFsAAcP6AwABw+MAjVuOWIMAATqUAwAD9KQAAI1Q8ACNUjAAjVRMAI1WRACNWPAAjVqoAI1cvAAAABgLAAE6xgMfAAHE/wABxRcAAdMcDvHUAAAFgwABNlgAAAgTAAE6zgMfAAHGUwABxmwmWIABgvMwABMAATrSAx8AAcbLAAHG2CYKQAGDAAGLiAAEFwABOwIDHwABxu8AAcbvAAHHuAAAAA8AAcdXAAHHuAAAAAgICwABx2wAABJYgYLzMAMAAcekAAASCkGDAAGLiAABgwABOsQE/AwgBwABOs4AAwCNXxwgBwABOtIEAwCNX1AkBwABxu8AATa4AAAAABwbAAE62gMfAAHHzwAByGsAAckEBAIJnAWrAAHH0YMAA/RwCAAABA8AAch/AAHJBAAAAAAAAAGDAAE1vAUrAAHIiAWrAAHI5YMAATW/AAPK8BsAATriAx8AAckbAAHJSwAByvAAAhE0BasAAckdgwAD9HAIAAAEDwAByWMAAcrwAAAACAQLAAHJzAAAAhy5dwABPlwJbWwDAAHJ9AAAAglNbAWoAYMAA/Nl3AFsBPgFKwAByjQEcwABynIDAAHKUwCNYmLPnAgACLoHAAHKwwCNYqgDAAE+pBsAATrqAx8AAcsHAAHLSwABzKQAAvCTAAE1uAWrAAHLCYMAA/RwCAAABA8AAcufAAHMpAAAAAQEBwABy9QAAAIPkYMAA/gAAAFwBPgE9HMAAcwKAwABy/8AjWSOCigEAASTAAHMkAye8dhbAAHMbLpYgwABOsyeDIQDAAP4UBsAATr2Ax8AAcy7AAHNIwABzrQAAnt4BasAAcy9gwAD9HAIAAAEDwABzUMAAc60AAAABAQHAAHNnAAAAgIlgwACIgAAAYMAAYLsBPgFKwABzegEfwABzhcAAYPACAAIWwABzmy6WIMAATrMWwABzpC6CkMAATrQABsAATruAx8AAc7LAAHPCwABz7QAAhlvAAE1uAWrAAHOzYMAA/RwCAAABA8AAc9LAAHPtAAAAAAAAAGDAAPvQAUrAAHPYARzAAHPbNw2DiAEAARbAAHPlFsAAc90uliDAAE6zg8HAAP0vAMAA/PcGwABOvIDHwABz8sAAdAPAAHRWAAC8JcAATW4BasAAc/NgwAD9HAIAAAEDwAB0CsAAdFYAAAABAQHAAHQmAAAIg9ZgwABOsQAAYMAA+goBPgFKwAB0MwEcwAB0QhbAAHQ6LpYgwABOs0gBAAEWwAB0S4DAAHRFwCNah5YgwABOswDAAP0pBsAATr6Ax8AAdFvAAHR1wAB0xQAAvCMBasAAdFxgwAD9HAIAAAEDwAB0gcAAdMUAAAABAQHAAHSRAAAAsvtguDAAAGDAAGJ2AUrAAHSqARbAAHS5gMAAdKrAI1sIhTW4WQAAI1gTACNYYwAjWOoAI1loACNZ4AAjWk4AI1rTACNbNAAAAAcCwABOwYDHwAB0+cAAdP/AAKfYA7x3AAABYMAATZYAAAQEwABOw4DHwAB1UMAAdVQJha8AYMAATZYABMAATsSAx8AAdW3AAHV1CYWwAGDAAIbzAATAAE7FgMfAAHWSwAB1lwmFsQBgwABNlgAEwABOxoDHwACk7sAAp9YGvHgAXcAA/KUCYMAAhtNgwAD70AFqwACk/13AAPylAmDAAIbTYMAA+9DAAPfhAQXAAE7WgMfAAHWcwAB1nMAAdlMAAAADwAB1tMAAdlMAAAADAwPAAHW6AAAEha9gwABNlgDAAHXFAAAEhbBgwACG8wDAAHXUAAAEhbFgwABNlgAAYMAATsEBPgFAIRzAAHYGHMAAdfZqwAB16F3AAPylAmDAAIbTYMAA+9DAAPfhSwEAARbAAHYAFsAAdfcuhbDAAE7EgmfAAIb1AMAA/LlIAQABKwDAAPzzwAB16MAAdg0BJMAAdk4DJ7yPFsAAdkMuhbDAAE7EJ4FLBAgBwABOw4AAwCNcKAgBwABOxIEAwCNcNwgBwABOxYIAwCNcRgkBwAB1nMAATa4AAAAACwbAAE7IgMfAAHZYwAB2ZMAAdr0AAbyQAAAAAQPAAHZ1wAB2vQAAAAEBAcAAdoUAAACFsGDAAIbzAABgwAD6CgFKwAB2mAEhHMAAdrYcwAB2pmrAAHaYXcAA/KUCYMAAhtNgwAD70MAA9+FLAQABFsAAdrCAwAB2p8AjXSyCZ8AAhvUAwAD8uUgBAAErAMAA/PMGwABO0oDHwAB2wsAAdunAAHcOAQCCZwFqwAB2w2DAAP0cAgAAAQPAAHbuwAB3DgAAAAAAAABgwABNbwFKwAB28QFqwAB3CGDAAE1vwADx/wbAAE7JgMfAAHcTwAB3H8AAd4cAAIRNAWrAAHcUYMAA/RwCAAABA8AAdyXAAHeHAAAAAgECwAB3QAAAAIcuXcAAT5cCW1sAwAB3SgAAAIJTWwFqAGDAAPzZdwBbAT4BSsAAd1oBHMAAd2mAwAB3YcAjXhiwUgIAAi6BwAB3e8AjXioAwABPqgbAAE7LgMfAAHeMwAB3ncAAeGgAALwkwABNbgFqwAB3jWDAAP0cAgAAAQPAAHeywAB4aAAAAAEBAcAAd8AAAACD5GDAAP4AAABcAT4FPRzAAHfNgMAAd8rAI16jgooBAAEnvJEAwAD+FD0cwAB37RbAAHfoLoWvwABOw7wkwABNbgEAAYDAAHgDwCNeowDAAE2oPRzAAHgPgMAAeAzAI16jgooBAAEkwAB4KwMnvJIWwAB4Gy6FsMAATsQnvJMAwAD+FD0cwAB4OBbAAHgyLoWxwABOxbwkwABNbgEAAYDAAHhOwCNeowDAAE2oPRzAAHhagMAAeFfAI16jgooBAAEngyEAwAD+FAbAAE7OgMfAAHhtwAB4h8AAmecAAJ7eAWrAAHhuYMAA/RwCAAABA8AAeI/AAJnnAAAAAQEBwAB4pgAAAICJYMAAiIAAAGDAAGC7AT4JTsAAeMfAAHjRAAC8lGDAAGC7ARzAAHjYFsAAeNMuha/AAE7Dnt4BAAGAwAB44cAjX6cAwABNo0nAAHjzIRbAAHkCgcAAePjAI1/AuJbAAGC9SsAAeQ4BH8AAeRnAAGJJAAAAAD9OwAB5PwAAALyVYMAAYLsAQUfAAHl5FsAAeYoWwAB5gS6FsMAATsSCZ8AAhvUDAcAAebBqwAB5sGDAAIbTwAD1ZQA+AknAAHnFIhbAAHnTgcAAecnAI1/AugXAAGC/ABbAAHnngcAAed3AI1/AugnAAGDBPgE9isAAefzAI2AlHsAAeg3AAGFlAAAAAD4BPYrAAHo+wCNgJRzAAHpRFsAAeksuhbHAAE7Fnt4BAAGAwAB6WsAjX6cAwABNo0LAAHp6AAHAAHqgasAAeqBgwACG08AA9X8APgJJwAB6tCIWwAB6woHAAHq4wCNfwLoFwABgvwAWwAB61oHAAHrMwCNfwLoKwABgwD4BPYrAAHrqwCNgJR7AAHr7wABhVwAAAAA+AT2KwAB7K8AjYCUcwAB7PhbAAHs4LoWxwABOxZ7eAQABgMAAe0fAI1+nAMAATaNCwAB7ZwAAAT4BPYrAAHuFwCNgJRzAAHuYFsAAe5IuhbHAAE7Fnt4BAAGAwAB7ocAjX6cAwABNo0nAAHu6IRbAAHvKgsAAe7/AI2AluJbAAGC9SsAAe9YBH8AAe+HAAGJJAAAAAD9OwAB7/sAAfAYAALipYMAA+goBKUFHwAB8EhbAAHwjFsAAfBouhbDAAE7EgmfAAIb1CALAAHxJasAAfElgwACG08AA9TfAAHxrasAAfGtgwACG08AA9U4APgNJwAB8eyEWwAB8ioHAAHyAwCNfwLNbwABgyz4BScAAfKMhFsAAfLOCwAB8qMAjYCWsacAAYL4+Aj0cwAB81YDAAHzJwCNfp6U+AwADFsAAfPIuha/AAE7DasAAfQRgpOTAAL4YMsAAfSxbWwMnhf8WwAB9SC6Fr8AATsMngpAcwAB9boHAAH1kwCNfwIaYAQABFsAAfYKAwAB9dsAjX6ey+8AAiIIAwABg2CeFsBbAAH2tLoWwwABOxADAAIiPPYvAAH3SwCNh2yo/P0nAAH4BIRbAAH4RgsAAfgbAI2Als1vAAGDLPgFJwAB+KiEWwAB+OYHAAH4vwCNfwKxpwABgvj4CPRzAAH5bgMAAfk/AI1+npT4DAAMWwAB+eC6FscAATsVqwAB+i2Ck5MAAvhgywAB+s1tbAyeF/xbAAH7PLoWxwABOxSeCkBzAAH73gsAAfuzAI2AlhpgBAAEWwAB/C4DAAH7/wCNfp7L7wACIggDAAGDYJ4WwFsAAfzYuhbDAAE7EAMAAiI89i8AAf1vAI2HbKj8/QsAAf4oAAcAAf69qwAB/r2DAAIbTwAD2LwA+AknAAH+8FsAAf8qBwAB/wMAjX8C1G8AAYMU+AUnAAH/gIRbAAH/wgsAAf+XAI2AltRvAAGDFPgI9HMAAgBSAwACACMAjX6elPgMAAxbAAIAxLoWxwABOxWrAAIBEYKTkwAC+xjLAAIBmW1sCJ4X/FsAAgIIuhbHAAE7FJ4KQHMAAgKqCwACAn8AjYCWGmAEAARbAAIC+gMAAgLLAI1+nsvvAAIiCAMAAYNgAwACIjz2LwACA6sAjYdsqP0nAAIEWFsAAgSSBwACBGsAjX8C6BsAAYMQ+AUnAAIE3IRbAAIFHgsAAgTzAI2AlugbAAGDEPgI9HMAAgWiAwACBXMAjX6elPgMAAxbAAIGFLoWxwABOxWrAAIGYYKTkwAC+2DLAAIG3W1sCJ4X/FsAAgdMuhbHAAE7FJ4KQHMAAgfuCwACB8MAjYCWGmAEAARbAAIIPgMAAggPAI1+nsvvAAIiCAMAAYNgAwACIjz2LwACCO8AjYdsqP0nAAIJnFsAAgnaCwACCa8AjYCW1G8AAYMU+AUnAAIKMIRbAAIKbgcAAgpHAI1/AtRvAAGDFPgI9HMAAgr+AwACCs8AjX6elPgMAAxbAAILcLoWvwABOw2rAAILuYKTkwAC+xjLAAIMQW1sCJ4X/FsAAgywuha/AAE7DJ4KQHMAAg1KBwACDSMAjX8CGmAEAARbAAINmgMAAg1rAI1+nsvvAAIiCAMAAYNgAwACIjz2LwACDksAjYdsqP0nAAIO+FsAAg82CwACDwsAjYCW6BsAAYMQ+AUnAAIPgIRbAAIPvgcAAg+XAI1/AugbAAGDEPgI9HMAAhBCAwACEBMAjX6elPgMAAxbAAIQtLoWvwABOw2rAAIQ/YKTkwAC+2DLAAIReW1sCJ4X/FsAAhHouha/AAE7DJ4KQHMAAhKCBwACElsAjX8CGmAEAARbAAIS0gMAAhKjAI1+nsvvAAIiCAMAAYNgAwACIjz2LwACE4MAjYdsqPz4CPRzAAIUzgMAAhRjAI1+npT4DAAMuasAAhVFgpOTAAL3cMsAAhW1bWwQnvJYWwACFiy6Fr8AATsMnvJccwACFs4HAAIWpwCNfwIaYAQABFsAAhceAwACFu8AjX6ey+8AAiIIAwABg2Ce8mBbAAIX1LoWxwABOxSe8mRzAAIYggsAAhhXAI2AlhpgBAAEWwACGNIDAAIYowCNfp7L7wACIggDAAGDYAMAAiI89i8AAhlzAI2HbKkLAAIZ/AAnAAIakasAAhqRgwACG08AA9kbAAIbHasAAhsdgwACG08AA9l7AAIbqasAAhupgwACG08AA9nbAAIcNasAAhw1gwACG08AA9o7AAIcxasAAhzFgwACG08AA9wzAAIdUasAAh1RgwACG08AA9tjAAId4asAAh3hgwACG08AA9qbAAIeaasAAh5pgwACG08AA9vLAAIe+asAAh75gwACG08AA9r4APgRJwACHyiEWwACH2YHAAIfPwCNfwLoGwABgxD4CPRzAAIgHgMAAh+zAI1+npT4DAAMWwACIEy6Fr8AATsNqwACIJWCk5MAAvgQywACIR1tbAyeF/xbAAIhhLoWvwABOwyeCkBzAAIiFgcAAiHvAI1/AhpgBAAEWwACImYDAAIiNwCNfp7L7wACIggDAAGDYJ4WwFsAAiMIuhbDAAE7EAMAAiI89i8AAiOPAI2HbKj9JwACJBiEWwACJFoLAAIkLwCNgJboGwABgxD4CPRzAAIk1gMAAiSnAI1+npT4DAAMWwACJUC6FscAATsVqwACJY2Ck5MAAvgQywACJhVtbAyeF/xbAAImfLoWxwABOxSeCkBzAAInFgsAAibrAI2AlhpgBAAEWwACJ2YDAAInNwCNfp7L7wACIggDAAGDYJ4WwFsAAigIuhbDAAE7EAMAAiI89i8AAiiPAI2HbKj9JwACKRiKDwACKSsAjYdsAIhzAAIpwFsAAimsWwACKYi6FsMAATsSCZ8AAhvVIAQABasAAioZgwACG08AA9o4AwAD9KQEcwACKrBbAAIqnFsAAip4uhbDAAE7EgmfAAIb1SAEAAWrAAIrCYMAAhtPAAPcMAMAA/Sk+AUnAAIrUFsAAiuOCwACK2MAjYCWpQcAAYNI+Aj0cwACLBYDAAIr5wCNfp6U+AwADFsAAixEuhbHAAE7FasAAiyRgpOTAAL5mMsAAi0pbWwMnha8WwACLUy6Fr8AATsMnhbEWwACLYi6FscAATsUnhbAWwACLdS6FsMAATsQAwACIjz2LwACLjcAjYdsqPz9CwACLvAAGwACL4WrAAIvhYMAAhtPAAPXlwACMBGrAAIwEYMAAhtPAAPX9wACMJ2rAAIwnYMAAhtPAAPYVwACMS2rAAIxLYMAAhtPAAPWzwACMbmrAAIxuYMAAhtPAAPXLwACMkGrAAIyQYMAAhtPAAPWZAD4EScAAjJ0hFsAAjKyBwACMosAjX8C6B8AAYMI+Aj0cwACM2oDAAIy/wCNfp6U+AwADFsAAjOYuha/AAE7DasAAjPhgpOTAAL3wMsAAjRpbWwMnhf8WwACNNC6Fr8AATsMngpAcwACNWIHAAI1OwCNfwIaYAQABFsAAjWyAwACNYMAjX6ey+8AAiIIAwABg2CeFsBbAAI2VLoWwwABOxADAAIiPPYvAAI22wCNh2yo/ScAAjdkhFsAAjemCwACN3sAjYCW6B8AAYMI+Aj0cwACOCIDAAI38wCNfp6U+AwADFsAAjiMuhbHAAE7FasAAjjZgpOTAAL3wMsAAjlhbWwMnhf8WwACOci6FscAATsUngpAcwACOmILAAI6NwCNgJYaYAQABFsAAjqyAwACOoMAjX6ey+8AAiIIAwABg2CeFsBbAAI7VLoWwwABOxADAAIiPPYvAAI72wCNh2yo/ScAAjxkig8AAjx3AI2HbACIiHMAAj0MWwACPPhbAAI81LoWwwABOxIJnwACG9UgBAAFqwACPWWDAAIbTwAD15QDAAP0pARzAAI9+FsAAj3kWwACPcC6FsMAATsSCZ8AAhvVIAQABasAAj5RgwACG08AA9f0AwAD9KQEcwACPuRbAAI+0FsAAj6suhbDAAE7EgmfAAIb1SAEAAWrAAI/PYMAAhtPAAPYVAMAA/Sk+Ak7AAI/zwACP+QAAvJpgwABhFAEmwACP8wGCwACP+8AjYCVgwABhFEnAAJARHMAAkCQWwACQG4TAAJAVwCNtF6lUwABhFmMBAAEawACQLcAA+d4AwAD5+T4CPRzAAJBNgMAAkEHAI1+npT4DAAMWwACQWS6FscAATsVqwACQbGCk5MAAvwAywACQlFtbAyeFrxbAAJCdLoWvwABOwyeFsRbAAJCsLoWxwABOxSeFsBbAAJC/LoWwwABOxADAAIiPPYvAAJDXwCNh2yo/P0LAAJEGAAHAAJErasAAkStgwACG08AA9WUAPgNJwACRQCEWwACRT4HAAJFFwCNfwLoFwABgvz4CPRzAAJF+gMAAkWPAI1+npT4DAAMWwACRii6Fr8AATsNqwACRnGCk5MAAvzoywACRvltbAyeF/xbAAJHYLoWvwABOwyeCkBzAAJH8gcAAkfLAI1/AhpgBAAEWwACSEIDAAJIEwCNfp7L7wACIggDAAGDYJ4WwFsAAkjkuhbDAAE7EAMAAiI89i8AAklrAI2HbKj9JwACSfSEWwACSjYLAAJKCwCNgJboFwABgvz4CPRzAAJKtgMAAkqHAI1+npT4DAAMWwACSyC6FscAATsVqwACS22Ck5MAAvzoywACS/VtbAyeF/xbAAJMXLoWxwABOxSeCkBzAAJM9gsAAkzLAI2AlhpgBAAEWwACTUYDAAJNFwCNfp7L7wACIggDAAGDYJ4WwFsAAk3ouhbDAAE7EAMAAiI89i8AAk5vAI2HbKj9CwACTvgABwACT42rAAJPjYMAAhtPAAPV/AD4DScAAk/chFsAAlAaBwACT/MAjX8C6BcAAYL8+Aj0cwACUNYDAAJQawCNfp6U+AwADFsAAlEEuha/AAE7DasAAlFNgpOTAAL9OMsAAlHRbWwMnhf8WwACUji6Fr8AATsMngpAcwACUsoHAAJSowCNfwIaYAQABFsAAlMaAwACUusAjX6ey+8AAiIIAwABg2CeFsBbAAJTvLoWwwABOxADAAIiPPYvAAJUQwCNh2yo/ScAAlTMhFsAAlUOCwACVOMAjYCW6BcAAYL8+Aj0cwACVcoDAAJVXwCNfp6U+AwADFsAAlX4uhbHAAE7FasAAlZFgpOTAAL9OMsAAlbJbWwMnhf8WwACVzC6FscAATsUngpAcwACV8oLAAJXnwCNgJYaYAQABFsAAlgaAwACV+sAjX6ey+8AAiIIAwABg2CeFsBbAAJYvLoWwwABOxADAAIiPPYvAAJZQwCNh2yo/QsAAlnMAAcAAlphqwACWmGDAAIbTwAD3PgA+Az0cwACWs4DAAJanwCNfp6U+AwADLmrAAJbRYKTkwAC+ejLAAJbpW1sAAMAAiI89i8AAlvbAI2HbKkLAAJcPAAHAAJc0asAAlzRgwACG08AA9yQAPgFCwACXiABJwACXmYPAAJedwCNh2z4BR8AAl64WwACXvxbAAJe2LoWwwABOxIJnwACG9QIBwACX52rAAJfnYMAAhtPAAPVOAD4CTsAAmAvAAJgSAACVoGDAAGFGASbAAJgLARzAAJg4asAAmDJgwABp48AA9/qDWQIAAoHAAJg9wCNfwILAAJhIwCNgJQDAAGnnYMAAYUZKwACYXwEcwACYbYTAAJhmwCNxjaF8AAAAAMAAYU8AAT4DTsAAmKDAAJimAACAlmDAAGC7ARzAAJjtHsAAmKjAAGkEAQABFsAAmNQuhbDAAE7EAINZAgACgcAAmPLAI1/AgsAAmP3AI2AlAMAAaRFJwACZFCEcwACZHoTAAJkYwCNx/EgBAAErAMAA/Sk+AUrAAJk1AYTAAJk8wCNx/D89HMAAmXSAwACZWcAjX6elPgMAAy5qwACZkmCk5MAAwK4ywACZr1tbAADAAIiPP0rAAJnGAR/AAJnRwABiSQAAAAAGwABOz4DHwACZ7MAAmgvAAJqfAACu+AFqwACZ7WDAAP0cAgAAAQPAAJoQwACanwAAAAEBAcAAmiUAAABbYMAAiKoAAGDAAE2WAT4BSsAAmjYBH8AAmkHAAE7WAwADHMAAmmgWwACaYy6Fr8AATsOu+AEAAYDAAJpuwCNy7wDAAE2iFsAAmnouhbDAAE7EHMAAmooWwACahC6FscAATsWu+AEAAYDAAJqQwCNy7wDAAE2iAAbAAE7QgMfAAJqkwACa2sAAov4AALwjAWrAAJqlYMAA/RwCAAABA8AAmubAAKL+AAAAAQEBwACa9gAAALL7YLgwAABgwABidgE+A07AAJsVwACbIwAAvJtgwABiTwEcwACbKhbAAJslLoWvwABOw7wjAQABgMAAmzfAI3OiAMAATaROwACbVcAAm2QAALycYMAAYk8BHMAAm2wWwACbZi6FscAATsW8IwEAAYDAAJt5wCNzogDAAE2kR8AAm44WwACbnxbAAJuWLoWwwABOxIJnwACG9QcIwACbxWrAAJvFYMAAhtPAAPU3wACb52rAAJvnYMAAhtPAAPVOwACcDWrAAJwNYMAAhtPAAPVlwACcOGrAAJw4YMAAhtPAAPV/wACcYmrAAJxiYMAAhtPAAPamwACchGrAAJyEYMAAhtPAAPa+wACcpmrAAJymYMAAhtPAAPbYwACcymrAAJzKYMAAhtPAAPbyAD4BSsAAnNgBFsAAnO6AwACc38Ajc6KFn7hTAcAAnRZqwACdFmDAAIbTwAD2LwA+A0nAAJ0jHMAAnTWBwACdJ8Ajc7lIAQABFsAAnUeAwACdOMAjc6KFurhXAMAA/Sk+AkAcwACddYLAAJ1mwCNz8EgBAAEWwACdh4DAAJ14wCNzooW6uFcAwAD9KcAAnWbAAJ2RAErAAJ2eARbAAJ20gMAAnaXAI3Oihbq4V0nAAJ3PIhzAAJ3hgcAAndPAI3O5SAEAARbAAJ3zgMAAneTAI3OihX+4VQDAAP0pABzAAJ4ZgsAAngrAI3PwSAEAARbAAJ4rgMAAnhzAI3OihX+4VQDAAP0pPgFKwACeQAEWwACeVoDAAJ5HwCNzooV/uFU/QCIcwACehoHAAJ54wCNzuUgBAAEWwACemIDAAJ6JwCNzooXfuFYAwAD9KQEcwACewYLAAJ6ywCNz8EgBAAEWwACe04DAAJ7EwCNzooXfuFYAwAD9KcAAnnjAAJ7dAErAAJ7oARbAAJ7+gMAAnu/AI3Oihd+4VgPAAJ8oasAAnyhgwACG08AA9kbAAJ9LasAAn0tgwACG08AA9l7AAJ9uasAAn25gwACG08AA9wwAPgNJwACfeyIcwACfjYHAAJ9/wCNzuUgBAAEWwACfn4DAAJ+QwCNzooV/uFUAwAD9KQAcwACfxYLAAJ+2wCNz8EgBAAEWwACf14DAAJ/IwCNzooV/uFUAwAD9KT4BSsAAn+wBFsAAoAKAwACf88Ajc6KFf7hVP0AiHMAAoDKBwACgJMAjc7lIAQABFsAAoESAwACgNcAjc6KF37hWAMAA/SkBHMAAoG2CwACgXsAjc/BIAQABFsAAoH+AwACgcMAjc6KF37hWAMAA/SnAAKAkwACgiQBKwACglAEWwACgqoDAAKCbwCNzooXfuFYBwACg1GrAAKDUYMAAhtPAAPZ2AD4BSsAAoOEBFsAAoPeAwACg6MAjc6KF37hWAcAAoSFqwAChIWDAAIbTwAD2jgA+AUrAAKEvARbAAKFFgMAAoTbAI3OihX+4VQbAAKFsasAAoWxgwACG08AA9bPAAKGPasAAoY9gwACG08AA9cvAAKGxasAAobFgwACG08AA9ZnAAKHUasAAodRgwACG08AA9eXAAKH3asAAofdgwACG08AA9f3AAKIaasAAohpgwACG08AA9hUAPgFKwACiKAEWwACiPoDAAKIvwCNzooV/uFUCwACiZWrAAKJlYMAAhtPAAPckwACijGrAAKKMYMAAhtPAAPc+AD4BPTDAAKKbH8AAoqXAAPtiAQABJMAAovMCJ7ydFsAAououhbDAAE7EAAbAAE7TgMfAAKMDwACjF8AAo0IBAJniAWrAAKMEYMAA/RwCAAABA8AAoyLAAKNCAAAAAAAAAGDAAPvQAUrAAKMlARzAAKMzasAAoyVdwAD8pQJgwACG02DAAPvQwAD34UsBAAEWwACjPRbAAKM0LoWwwABOxIJnwACG9QDAAPy5BsAATsyAx8AAo0fAAKNXwACjvAAAhlvAAE1uAWrAAKNIYMAA/RwCAAABA8AAo2fAAKO8AAAAAAAAAGDAAPvQAT4BSsAAo3ABHMAAo6McwACjjhzAAKN6Nw2DiAEAARbAAKOFFsAAo3wuhbDAAE7Eg8HAAP0vAMAA/PdkAQABHMAAo5M3EYOIAQABFsAAo5oWwACjlS6Fr8AATsODwcAATZ0AwAD89wDAAPz1ZAEAARzAAKOoNxODiAEAARbAAKOwFsAAo6ouhbHAAE7Fg8HAAE2dAMAA/PcAwAD89QbAAE7NgMfAAKPBwACj0sAApGMAALwlwABNbgFqwACjwmDAAP0cAgAAAQPAAKPZwACkYwAAAAEBAcAAo/MAAAiD1mDAAE7BAABgwAD6CgE+AUrAAKQAASIiHMAApBAWwACkBy6FsMAATsRIAQABFsAApBmAwACkE8AjeleFsMAATsQAwAD9KQAcwACkMhbAAKQtLoWvwABOw0gBAAEWwACkO4DAAKQ1wCN6V4WvwABOwwDAAE2rABzAAKRRFsAApEsuhbHAAE7FSAEAARbAAKRagMAApFTAI3pXhbHAAE7FAMAATasGwABO1IDHwACkaMAApH3AAKS/AQC8KgFqwACkaWDAAP0cAgAAAQPAAKSJwACkvwAAAAAAAABgwAD6CgE+AUrAAKSPASIWwACkmxbAAKSWLoWvwABOw7wqwABNnwEWwACksBbAAKSqLoWxwABOxbwqwABNnwAAI10CACNdkwAjXeMAI15qACNfcgAjcroAI3NtACN4wgAjeUIAI3oeACN7AwAje3cAAAALAsAATteAx8AAqBfAAKgdwACuXwO8ngAAAWDAAE2WAAACBMAATtmAx8AAqHHAAKh1CYWvAGDAAE2WAATAAE7agMfAAKiSwAColwmFsQBgwABNlgABBcAATumAx8AAqJzAAKicwACozgAAAAPAAKi3wACozgAAAAICAsAAqL0AAASFr2DAAE2WAMAAqMgAAASFsWDAAE2WAABgwABO1wE/AwgBwABO2YAAwCN8JQgBwABO2oEAwCN8NAkBwAConMAATa4AAAAACgbAAE7cgMfAAKjTwACo+sAAqSIBAIJnAWrAAKjUYMAA/RwCAAABA8AAqP/AAKkiAAAAAAAAAGDAAE1vAUrAAKkCAWrAAKkZYMAATW/AAPLsBsAATuCAx8AAqSfAAKkzwACpngAAhE0BasAAqShgwAD9HAIAAAEDwACpOcAAqZ4AAAACAQLAAKlUAAAAhy5dwABPlwJbWwDAAKleAAAAglNbAWoAYMAA/Nl3AFsBPgFKwACpbgEcwACpfYDAAKl1wCN8+LyfAgACLoHAAKmSwCN9CgDAAE+rBsAATuKAx8AAqaPAAKm0wACqdQAAvCTAAE1uAWrAAKmkYMAA/RwCAAABA8AAqcnAAKp1AAAAAQEBwACp1wAAAIPkYMAA/gAAAFwBPgU9HMAAqeSAwACp4cAjfYOCigEAASe8oADAAP4UPRzAAKoHFsAAqgIuha/AAE7ZvCTAAE1uAQABgMAAqh3AI32DAMAATag9HMAAqimAwACqJsAjfYOCigEAASe8kwDAAP4UPRzAAKpFFsAAqj8uhbHAAE7avCTAAE1uAQABgMAAqlvAI32DAMAATag9HMAAqmeAwACqZMAjfYOCigEAASeDIQDAAP4UBsAATuWAx8AAqnrAAKqUwACr3wAAnt4BasAAqntgwAD9HAIAAAEDwACqnMAAq98AAAABAQHAAKqzAAAAgIlgwACIgAAAYMAAYLsBPgROwACq1MAAqt4AALyUYMAAYLsBHMAAquUWwACq4C6Fr8AATtme3gEAAYDAAKruwCN+cgDAAE2jTsAAqw7AAKsZAAC8lWDAAGC7ARzAAKshFsAAqxsuhbHAAE7ant4BAAGAwACrKsAjfnIAwABNo0nAAKs8IhbAAKtKgcAAq0DAI36LuJbAAGC9ABbAAKtjgsAAq1jAI37CuJbAAGC9PgFKwACrdwEcwACrl2rAAKuOYMAAaevAAO2Ug1kCAAKBwACrnMAjfouCwACrp8AjfsIAwABp7z9KwACrvgEfwACrycAAYkkAAAAABsAATuaAx8AAq+TAAKwDwACskAAArvgBasAAq+VgwAD9HAIAAAEDwACsCMAArJAAAAABAQHAAKwdAAAAW2DAAIiqAABgwABNlgE+AUrAAKwuAR/AAKw5wABO6QIAAhzAAKxjFsAArF4uha/AAE7ZrvgBAAGAwACsacAjf6cAwABNohzAAKx7FsAArHUuhbHAAE7arvgBAAGAwACsgcAjf6cAwABNogAGwABO3YDHwACslcAArKnAAKy5AQCZ4gFqwACslmDAAP0cAgAAAQPAAKy0wACsuQAAAAAAAABgwAD70AFKwACstwE3DwbAAE7jgMfAAKy+wACszsAArRoAAIZbwABNbgFqwACsv2DAAP0cAgAAAQPAAKzewACtGgAAAAAAAABgwAD70AE+AUrAAKznARzAAK0BHMAArPE3EYOIAQABFsAArPgWwACs8y6Fr8AATtmDwcAATZ0AwAD892QBAAEcwACtBjcTg4gBAAEWwACtDhbAAK0ILoWxwABO2oPBwABNnQDAAPz3AMAA/PUGwABO5IDHwACtH8AArTDAAK2WAAC8JcAATW4BasAArSBgwAD9HAIAAAEDwACtN8AArZYAAAABAQHAAK1UAAAIg9ZgwABO1wAAYMAA+goBPgFKwACtYQEiHMAArW0WwACtaC6Fr8AATtlIAQABFsAArXaAwACtcMAjgTyFr8AATtkAwABNqwAcwACthBbAAK1+LoWxwABO2kgBAAEWwACtjYDAAK2HwCOBPIWxwABO2gDAAE2rBsAATueAx8AArZvAAK21wACuAQAAvCMBasAArZxgwAD9HAIAAAEDwACtwcAArgEAAAABAQHAAK3RAAAAsvtguDAAAGDAAGJ2AUrAAK3qARbAAK35gMAArerAI4HthZ+4UwbAAE7egMfAAK4GwACuG8AArl0BALwqAWrAAK4HYMAA/RwCAAABA8AArifAAK5dAAAAAAAAAGDAAPoKAT4BSsAAri0BIhbAAK45FsAArjQuha/AAE7ZvCrAAE2fARbAAK5OFsAArkguhbHAAE7avCrAAE2fAAAjfHMAI3zDACN9SgAjfj0AI39yACOAGQAjgF0AI4EDACOBuAAjghkAI4KNAAAACgLAAE7qgMfAAK6NwACuk8AAuoEDvKEAAAFgwABNlgAAAwTAAE7sgMfAAK7ewACu5gmFsABgwACGwgAEwABO7YDHwACvA8AArw0JgmsAYMAATZYABMAATu6Ax8AAufzAALp/Brx4AF3AAPylAmDAAIa1YMAA+9ABasAAug1dwAD8pQJgwACGtWDAAPvQwAD4OwEFwABO/YDHwACvEsAArxLAAK+BAAAAA8AA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AABgwABNlgE+AUrAANFBARzAANFSgMAA0UjAI6L/vLsBAAEWwADRYy6AvcAATzYAwACIsAbAAE8+gMfAANFxwADRgcAA0akAAIZbwABNbgFqwADRcmDAAP0cAgAAAQPAANGRwADRqQAAAAAAAABgwAD70AFKwADRlwEcwADRmjcNg4gBAAEWwADRoRbAANGcLoC9wABPNoPBwAD9uwDAAPz3BsAATz+Ax8AA0a7AANG/wADR+gAAvCXAAE1uAWrAANGvYMAA/RwCAAABA8AA0cbAANH6AAAAAQEBwADR3gAACIPWYMAATzQAAGDAAPoKAUrAANHoARzAANHtFsAA0egugL3AAE82SAEAARbAANH2gMAA0fDAI6PngL3AAE82AMAA/cUGwABPQYDHwADR/8AA0hnAANJsAACe3gFqwADSAGDAAP0cAgAAAQPAANIhwADSbAAAAAEBAcAA0jgAAACAiWDAAIiAAABgwABguwE+AUrAANJLAR/AANJWwABiSQAAAAAGwABPOYDHwADSccAA0obAANKZAQC8KgFqwADScmDAAP0cAgAAAQPAANKSwADSmQAAAAAAAABgwAD6CgFKwADSlQEpAAAjoXMAI6HFACOiTAAjosoAI6NAACOjrgAjpDEAI6SRACOk1AAAAAgCwABPRIDHwADSnsAA0q3AANbCB7y8AAABYMAATZYAAAIEwABPRoDHwADTB8AA0wsJgL0AYMAATZYABMAAT0eAx8AA0yjAANM0CYMlAGDAAE2WAAEFwABPUYDHwADTOcAA0znAANN4AAAAA8AA01rAANN4AAAAAgICwADTYAAABIC9YMAATZYAwADTawAABIMlYMAATZYAAGDAAE9EAT8DCAHAAE9GgADAI6V2CAHAAE9HgQDAI6WFCQHAANM5wABNrgAAAAAFBsAAT0qAx8AA033AANOCwADVCAAAvL3AAE1uAAAAAQPAANObwADVCAAAAAMDA8AA07IAAACAiWDAAIiAAMAA09gAAACAvWDAAE2WAMAA0+wAAACpL2DAAGC7AABgwAD6CgE+AknAANP9IRbAANQMgsAA1ALAI6YQtRvAAGDFPgI9HMAA1CqAwADUHsAjpfKlPgMAA4HAANRBwCOmAWrAANRTYKTkwAC/FDLAANR3W1sCJ4X/gcAA1I3AI6YBJ4KQHMAA1K2CwADUo8Aj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AFwBPgE9HMABD/QWwAEP8S6D5MAAT7qCigEAARbAAQ/+gMABD/rAI9sqqovAAE3bAMAA/hQGwABPwoDHwAEQE8ABECTAARBtAAC8MQFqwAEQFGDAAP0cAgAAAQPAARAswAEQbQAAAAIBAsABEEMAAAC81WDAAE3KAMABEEkAACCAtVsBagBgwAD82XcAXAE+AT0cwAEQVhbAARBTLoPkwABPuoKKAQABFsABEGCAwAEQXMAj27apVMAATcwAwAD+FAbAAE/DgMfAARBywAEQg8ABEMYAALw6AWrAARBzYMAA/RwCAAABA8ABEIzAARDGAAAAAgECwAEQpAAAALzVYMAATfcAwAEQqgAAIIC1WwFqAGDAAPzZdwBcAT4BPRzAARC3FsABELQug+TAAE+6gooBAAErAMAA/hQGwABPxIDHwAEQy8ABENzAARFqAAC8NwFqwAEQzGDAAP0cAgAAAQPAARDnwAERagAAAAIBAsABEQEAAAC81WDAAE3oAMABEQcAACCAtVsBagBgwAD82XcAXAE+AT0cwAERSRbAARFGLoPkwABPuoKKAQABJMABEWUDJ4OuFsABEVeAwAERU8Aj3Ludb8AATeong64AwAD+FAbAAE/FgMfAARFvwAERgMABEsoAAIctAWrAARFwYMAA/RwCAAABA8ABEYnAARLKAAAAAgECwAERoQAAALzVYMAATgQAwAERpwAAIIC1WwFqAGDAAPzZdwBcAT4GPRzAARG0FsABEbEug+TAAE+6gooBAAEnvNoAwAD+FD0cwAERyS682AEAARbAARHggMABEdzAI91TgpDAAE4GAMAAT709HMABEe4WwAER6y6D5MAAT7qCigEAASeZjgDAAP4UTsABEgPAARIOAAC7jmDAAPoKASpGwAESG8ABEkjAARIzAAAAgJZgwABNlgAWwAESQIDAARI8wCPdUynAAE4HPgNJwAESUILAARJUwCPd3j4BPRzAARJtFsABEmoug+TAAE+6gooBAAEngYsAwAD+FD89HMABEogumocBAAGDwAESjsAj3foAwABPvj2KwAESnMAj3d4pPRzAARK8FsABErkug+TAAE+6gooBAAEnmY8AwAD+FAbAAE/GgMfAARLPwAES4MABE5AAALxCAWrAARLQYMAA/RwCAAABA8ABEujAAROQAAAAAgECwAES/wAAALzV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ASkkFMABKR3AJRPvAgFgg+WFLYQBPgE9i8ABKTjAJRQEFsABKUYUwAEpP8AlE+8CAWCD5YT9hAlJwAEpXxbAASlqFMABKWPAJRPvAgFgg+WFL4QCPgE9i8ABKX7AJRQEFsABKYwUwAEphcAlE+8CAWCD5YT+hAo+AT2LwAEpr8AlFAQWwAEpxhbAASm9FMABKbbAJRPvAgFgg+WCaoPqhTWElUnAASnnJcABKfKCwAEp68AlE+9gg3c+AT2LwAEqBMAlFAQWwAEqEhTAASoLwCUT7wIBYIN3gpCDeT4BPR7AASornRYEAAQkwAEqTAEWwAEqP4LAASo4wCUT74WAwAD9MCTAASpXAYLAASpQwCUT7xbAASpgFsABKlkuhFLAAFERh07AAFYYFsABKn0WwAEqdi6EUsAAURGEYcAAVhkASsABKpEBHMABKxMewAEqpZrCAQABHMABKsGAwAEqt8AlE9O9FwIAAibAASroAYHAASrowCUT4mCI7hbAASr5gsABKvLAJRPvhPmDYQDAAFB3AIV9AQABg8ABKyLAJRQEAJrJBsAAUTKAysABKzDAASs1wAEsFAAAvekAAAABA8ABK0PAASwUAAAAAwMDwAErWgAAAIdlYMAAUGQAwAErbgAAAIHVYIizAMABK3oAAACCSmCIswAAYMAA+goBPgFJwAErgxbAASuHLoUvwABREz4BSsABK5kBHMABK7AWwAErqoDAASugwCUV/oVnwABQcb3ZAgACgsABK8LAJRYagcABK8XAJRYNAMAAiOc+AUrAASvcARzAASvzFsABK+2AwAEr48AlFf6FZ8AAUHG92QIAAoHAASwFwCUWDYLAASwIwCUWGgDAAIjnBsAAUTOAysABLBnAASwswAE9FwAAo5kBasABLBpgwAD9HAIAAAEDwAEsMcABPRcAAAABAQHAASxIAAAAh2VgwABQZAAAYINZAT4OScABLFkhHMABLHsWwAEsXS694sAAUS5IAQABKwDAAP0pPgFKwAEsjAEWwAEsky694sAAUS4/ScABLLwhJcABLM8WwAEsxxbAASzALoRSwABREYRDwABUXGC0nz4BSsABLPEBJsABLPEBF8ABLPguveImwAEs+AEWwAEtKxbAAS0lFsABLRgurWzAAFESgxnAAPxYgkXAAFS0YINZwABRLmCDWT9OwAEtRsABLU8AAIS8YIizARbAAS1cFsABLVgWwAEtUS6EUsAAURGZwsAAVF2EvINDTsABLXYAAAC96mDAAFStAE7AAS2OAAAAvetgiLMARcABLaEBwAEtqsABLawAAGJgwAD70AEcwAEtwhbAAS27FsABLa4urWzAAFESYcAA/KOBjQEAAZQAwAD89gEcwAEtyYTAAS3HwCUX/4FtAQABkwDAAP0AAYzAAS3PwCUX/xzAAS3QhMABLc/AJRf/gY0BAAGUAMAA/PY+BE7AAS3owAEt8gAAiDdgwABUrQEcwAEuABbAAS30Lq1swABREksBAAGEwAEuAcAlF/8AwAD8g07AAS4SwAEuGQAAgkVgg1kBJsABLhIBFsABLiWFwAEuG8AlGHaCRcAAVLRgg1lOwAEuPMABLkoAAL3sYIizARzAAS5MLr3oAwADgMABLl7AJRbwgcABLmnAJRerhsABLnPAJRisAMAAUTFJwAEughzAAS6QgsABLobAJRfcSAEAASsAwAD9KT4CPYrAAS6jwCUX3IXAAS6vwCUYdj2LwAEuwsAlF+yHwAEu0sAlGNo+AUnAAS74HMABLvwuvekDAAOAwAEvC8AlFvCHwAEvFsAlGNqDwAEvJcAlF+wAwABRMj4DPTUAAAABAGDAAFBfAWrAAS9BYMAAUF93IxzAAS9IFADAJRmQCABIAQABKwAAKxzAAS9IFADAJRmQCACWcgEAASTAAS/KCCe97R7AAS95wABQVAEAAYXAAS+CwCUYdgAngNmHwAEvkMAlGNonve4ewAEvpMAAUFQBAAGCwAEvrcAlF9wAJ4DZg8ABL7vAJRfsAMAAUGEBXD2KwAEv18AlF9yFwAEv48AlGHY9i8ABL/jAJRfsh8ABMAjAJRjaPgE9NQAAAAEAYMAAUF8BasABMDJgwABQX3cjHMABMDkUAMAlGk8IAEgBAAErAAArHMABMDkUAMAlGk8IAJZyAQABJMABMJoEJ73tHsABMGrAAFBUAQABhcABMHPAJRh2ACe97x7AATCFwABQVAEAAYLAATCOwCUX3AAAwABQYQFcScABMLkhHMABMMeCwAEwvcAlF9xIAQABKwDAAP0pPgI9NQAAAAEAYMAAUF8BasABMNhgwABQX3cjHMABMN+EAMAlGu5IAQABKwAAKxzAATDfhADAJRrulnIBAAEkwAExIAInvfAewAExC8AAUFQBAAGCwAExFMAlF9wAAMAAUGEBXEFFwAExKQHAATEywAExNAAAYmDAAPvQAZMBHMABMTuEwAExOcAlG1VjAQABFsABMUoWwAExPS6tbMAAURJhwAD8owDAAPz9AYzAATFSwCUbVRzAATFThMABMVLAJRtVZAEAAZQAwAD89T4ETsABMW3AATF3AACIN2DAAFStARzAATGFFsABMXkurWzAAFESSwEAAYTAATGGwCUbVQDAAPyDTsABMZnAATGgAACCRWCDWQEmwAExmQEWwAExrIXAATGiwCUbuoJFwABUtGCDWU7AATHFwAEx0wAAvexgiLMBHMABMdUuvegDAAOAwAEx58AlFvCBwAEx8sAlF6uGwAEx/MAlG/AAwABRMUnAATINIRzAATISLr3pAwADgMABMiHAJRbwg8ABMizAJRfsh8ABMjvAJRweAMAAUTI+BD01AAAAAQBgwABQXwFqwAEyV2DAAFBfdyMcwAEyXhQAwCUcjggASAEAASsAACscwAEyXhQAwCUcjggAlnIBAAEkwAEyvwQnve0ewAEyj8AAUFQBAAGCwAEymMAlF9wAJ73vHsABMqrAAFBUAQABhcABMrPAJRu6AADAAFBhAVxOwAEy1MABMtgAAICsYMAA/bYBJMABMvEBFsABMuwWwAEy5BbAATLdLoRSwABREYRDwABUXICswABVuEnAATL9IiIcwAEzBRTAATMBwCUdDAgASAEAASe98QDAAP3FABzAATNIFsABM0MWwAEzNhbAATMuFsABMycuhFLAAFERhGHAAFYZgxjAAP5FgejAAPxZSAEAASe98gDAAP3FASIcwAEzchTAATNuwCUdDAgASAEAASeeyADAAP3FABzAATPAFsABM7sWwAEzrhbAATOmFsABM58uhFLAAFERhGHAAFYZgxjAAP5FgejAAPxZSAEAASe98wDAAP3FPgA+Aj2KwAE0XsAlF9wrPYvAATR8wCUX7CtCwAE0qAA/P0nAATTLHMABNNmCwAE0z8AlF9xIAQABKwDAAP0pPgVOwAE08cABNPYAAIC9YMAA/bYBFsABNP8WwAE0+C6EUsAAURGhUMAAVGJOwAE1HMABNSMAAGFgwAD70AEjFsABNSwWwAE1JS6EUsAAURG99MAAVMqUFsABNVOEwAE1TsAlHkdhwAD9ugFgwAD70E7AATV2wAE1fgAAglNdwAD8dAFgkWcBHMABNkIcwAE1jRbAATWALq1swABREoCrAQFgkWcBNMABNZEDwAE1kcABNkAAAAABAQHAATWeAAAAlpZgwABUrQAAYJFnAT4BSsABNasBHMABNfZqwAE1smCRVKOJglsDAAMWwAE2BYbAATYDwCUe/YRhwABUshbAATYQhsABNg7AJR79h07AAFSzFsABNjAWwAE2HobAATYcwCUe/aFQwABUtmHAAP26AJFcAMAA/D2ArQAAAADAAPxIPRzAATZaFsABNlMuhFLAAFERnmoEAAMcwAE2lmrAATZwXZFgAWECYMAA/bZgwAD9tmCRSZKuiAUCAAIWwAE2uhbAATazLoRSwABREaFQwABUYhbAATbgFsABNtoWwAE2zS6tbMAAURKDGcAA/FihUMAAVLYAkWQWwAE3BRbAATb+LoRSwABREYdOwABWGIXAATcbwCUecQGCU4bAATc2wCUetcAAVG1KwAE3RgErPz01AAAAAQBgwABQXwFqwAE3XWDAAFBfdyMcwAE3ZIQAwCUgNkgBAAErAAArHMABN2SEAMAlIDaWcgEAASTAATe8BCe99RbAATeRLqFQwABRHCeDVR7AATenwABQVAEAAYLAATewwCUX3AAAwABQYQFcTsABN9LAATfXAACCZ2CEIgFqwAE352CEIoS2ScABN/MiIhbAATgBgsABN/fAJRfch3bAAFS7ARbAATgWgsABOAzAJRfchS/AAFTCARbAATgsgsABOCLAJRfchS3AAFS9PgE9jMABOD7AJSCmIxbAAThFLoUvwABRE2rAATheYIQihKdqwAE4dWCEIoSYAWCEIknAATiIIiXAATidFsABOJaCwAE4jMAlF9yCRcAAVLRgg+UAHMABOMsWwAE4xhbAATi/gsABOLXAJRfcgkXAAFS0gmcASAEAAWrAATjcYIQihMUAwAD9KT4BPYzAATjuwCUgpmrAATkDYIQihMU/ScABORgWwAE5HC694MAAURQ+Az01AAAAAQBgwABQXwFqwAE5MmDAAFBfdyMcwAE5OYUAwCUhuUgBAAErAAArHMABOTmFAMAlIbmWcgEAASTAATm6Cye99RbAATloLqFQwABRHCe99hbAATmQLoRSwABRESeBi4LAATmZwCUX3CeBixbAATmlLq1swABREieBi4TAATm0wCUgpieDIQDAAFBhAVxOwAE5ysABOc8AAL33YINZARzAATovH8ABOd/AAIjhBQAFgMABOe7AJRbwFsABOfkuhFLAAFERgsABOgHAJRfcFsABOgwurWzAAFEShMABOhrAJSCmAKFrAAAAAMAAiNVJwAE6QRzAATpQFsABOkwWwAE6RS6EUsAAURGZwsAAVF1IAQABFsABOliFwAE6U8AlIkmE+YNhAMAA/Sk+BT0cwAE6fRbAATp5FsABOnIuhFLAAFERmcLAAFRdhIoBAAGFwAE6h8AlIkkAg05OwAE6q8ABOrMAAIRDYLSfASbAATqrARbAATq8FsABOrUuhFLAAFERhEPAAFRcYLSfScABOs0lwAE64hbAATrbgsABOtHAJRfcgkXAAFS0YIPlPgE9NcABOwQAAAEAXcAA/HQBYIPlARbAATsEhsABOvzAJSMVreG0pTUAAAABAFsBHMABOxeHwAE7FcAlI2pWAQABJsABOxsBhcABOxvAJSJJYIPlAMAA/IU1AAAAAQBbARzAATsih8ABOyDAJSNqVgEAASbAATswARbAATswgsABOybAJRfcgkXAAFS0YIPlAMAA/IWHAMAlI2o/PTUAAAABAGDAAFBfAWrAATtLYMAAUF93IxzAATtShwDAJSQESAEAASsAACscwAE7UocAwCUkBJZyAQABJMABO6gEJ731FsABO4MuoVDAAFEcJ734hcABO6PAJSJJAMAAUGEBXEnAATuzFsABO74WwAE7ty6EUsAAURGE6cAAVFg+AUrAATveASbAATveARfAATvlLr3iJsABO+UBFsABPA+CwAE8BcAlF9yCRcAAVLRgg1nAAFEuYINZPgFKwAE8MgEXwAE8OS694oXAATxZwCUiScAAUS4/Pz01AAAAAQBgwABQXwFqwAE8fGDAAFBfdyMcwAE8g4UAwCUk3UgBAAErAAArHMABPIOFAMAlJN2WcgEAASTAATzVAye99RbAATywLqFQwABRHCe9+QDAAFBhAVxKwAE83AEmwAE83AEXwAE84y694ibAATzjARbAAT0NgsABPQPAJRfcgkXAAFS0YINZwABRLmCDWQbAAFE0gMrAAT0cwAE9NsABPdkAAL2BAWrAAT0dYMAA/RwCAAABA8ABPUDAAT3ZAAAAAQEBwAE9TgAAAIRSYMAAVEoAAGDAAFEPAT4BSsABPVwBIxzA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J4C/AB/AAESKhX8BAAExwABElGCEqQIfwABEpoTkAwADH8AARLaExwEAARTAAETCwCXEAwgAAB7AAETMiIcBAAEng9EAFsAARNkuvj/AAFI9AB/AAET3hOQDAAMfwABFGITHAQABFMAARSTAJcQDCAAAHsAARS6IhwEAASeAlgAWwABFPS6+QMAAUj4AABbAAEVkLr4+wABSOwAATsAARYLAAEWMAACFS2CHXwEfwABFkofeAwADFMAARarAJcQDCAAfwABFs4TkAwADhcAARb/AJcMbHsAARcqIhwEAASeD0AAWwABF2y6iOcAAUjoAFMAARejAJcQPCQAAScAARfgWwABGAoDAAEX8wCXC2KGEsIU+AT0VwABGF8AlyBkKH8AARieIDQMAAx/AAEZChfUBAAEfwABGSoWkBAAEH8AARl+ExwEAAYbAAEZrwCXDSQAewABGdoiHAQABJ0gAH8AARpSFfwEAATHAAEaeYISpAR/AAEajhqQAAAAAABbAAEa0LpxBwABSOQAAFMAARs7AJcgZCgArAD89HMAARvmEwABG9MAlwwRWAQABFMAARv3AJcgZCgAAwAD8hQbAAFJPgNvAAEcQwABHGcAAUl0AAL5TwABSMQAAAAEDwABHMcAAUl0AAAAEAwPAAEdEAAAAg+5ghKkAwABHUwAAAJrRYIizAMAAR3EAAACIP13AAPx0AWCEqQABwABHhwAAAKI4YMAA+goBasAAR45gwAD6CgBgglIBPglOwABH68AAR+0AAGJgwAD70AGTQUXAAEf2AAEcwABH/4TAAEf9wCXJtmMBAAEWwABICoLAAEgBwCXJgWHAAPyjAMAA/P0BjMAASBTAJcm2HMAASBKEwABIFMAlybZkAQABlADAAPz1PgJJwABIHyXAAEgvHMAASCuCwABII8AlyYFLAQABhMAASCzAJcm2AMAA/INgsCFCwABIRgA/PRzAAEhbgsAASFPAJcmBgL8CAAKEwABIXMAlybYmwABIWwE1wABIbQAAAQBbARzAAEhtHMAASGmCwABIYcAlyYFLAQABhMAASGrAJcm2AMAA/IOETQEAAS4AhK01AAAAAQBbARfAAEh7hcAASHnAJcp2hFKAwABIhMAlyWcAhQDAJcp2YISpAMAA/IRJwABIyRzAAEjPhMAASM3AJcm2SAEAARbAAEjbgsAASNLA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AAMDA8AASQcAAAC+9GCeqwDAAEkfAAAAoqFgnqsAwABJMAAAAJ0EYJ6rAABcAT4MQBzAAElHLqFbAgACgMAASVLAJnPEMcAASWRgrtoFasAASXZgrtrAANjIasAASZNgrtrAANjVasAASbtgrtrAANgnasAASdRgrtrAANhZasAASfBgrtrAANiBAMAAWbPAAElHwABKCQA9HMAAShAuoOEBAAEnvvYAwABTcE7AAEpCwABKVwAArelgwAD9tgEewABKWcAAU28BAAGAwABKccAmc8QATsAASpTAAEqeAACE1GDAAFZ1ASbAAEqUARzAAEqgLqDCAAAAAMAAWb1gwABWdU7AAErFwABK0wAAolpdwAD8dAFgwABWmwEmwABKxQEcwABK1S6gwgEAAWrAAErjYMAAWXrAALpaAMAAWb1dwAD8dAFgwABWm07AAEr7wABLBgAArepgwAD70AEmwABK+wEcwABLCC6gwgAAAADAAFm9YMAA+9BOwABLGsAASx8AAIC9YMAA/bYBJsAASxoBHMAASyEuoMIBAAFqwABLL2DAAFl6wADYRADAAFm9YMAA/bZJwABLOhzAAEtDh8AASz7AJnU6SAEAASsAwAD9xT4CPY7AAEtUwCZ1DBbAAEtygMAAS2HAJnPEh06etD2PwABLhMAmdTokwABLmAGGwABLjcAmdQw/TsAAS7rAAEvDAACG1V3AAPx0AWDAAFX8ASbAAEu6ARzAAEvFLqDCAQABasAAS9NgwABZesAAt8sAwABZvV3AAPx0AWDAAFX8PRzAAEviLqFJAQABFsAAS/6AwABL7cAmc8SHTp60AMAAWcVOwABME8AATB8AAJhiYMAA+9ABIxzAAEwqFMAATCHAJnXLCABIAQABKwDAAP0pFsAATE2AwABMPMAmc8SHTp60FsAATHEWwABMaxTAAExiwCZ1ywgAgxnAAPxYh07AAFX+AWDAAPvQPRzAAEyJFsAATIEuhEPAAFL7rfgJAAmDwABMqsAmdG0UwABMyMAmdcsIAGrAAEzaYMAA+9DAANclh8AATPzAJnU6hcAATQrAJnTEhMAATSHAJnSWFMAATTTAJnY2CQCGwABNScAmdQwWwABNZoLAAE1dwCZz3odOnrQAtScGwABTMIDgwABNesAATYjAAE64AAC/OQAAAAEDwABNnMAATrgAAAABAQHAAE2jAAAAkk5gnqsAAGCEIgE+BEnAAE2wHMAATbqAwABNtMAmd0NIAQABKwDAAP0pSsAATcMBasAATdhghCKEtj9JwABN5B7AAE3owABZZAIAAieaQYDAAE34wCZ3QwBKwABOAAFqwABOFWCEIoSYP0nAAE4hHsAATiXAAFlkAgACJ5cegMAATjXAJndDAErAAE49AWrAAE5SYIQihKc/SsAATl4BJsAATl4BHsAATmWdFgQABBbAAE5+gMAATnjAJndDgl6exSe/ORbAAE6kgMAATp7AJndDh06etBbAAE6wLoCswABTBABghCIGwABTMYDgwABOvcAATs7AAE+FAAC/OgFqwABOvmDAAP0cAgAAAQPAAE7hwABPhQAAAAICAsAATugAAAC+i2CeqwDAAE78AAAAvztgnqsAAFwBPgI9HMAATxkWwABPES6EQ8AAUvuuBQIAASe/PAGuayq1HD0cwABPUy6gvwEAASMhHMAAT2aBwABPWMAmeHJIAQABKwDAAP0pasAAT3BgwAD70IM+kwFgwAD70ADAAFm6BsAAUzKA4MAAT4rAAE+bwABV9gAAvqEBasAAT4tgwAD9HAIAAAEDwABPrMAAVfYAAAADAwPAAE+zAAAAn0BgnqsAwABPxQAAAL6iYJ6rAMAAT9UAAACdBGCeqwAAXAE+FT0cwABP5S6g4QEAASe+oQDAAFNwTsAAUBXAAFAaAACCZ2DAAFLsASbAAFAVARzAAFAcLqDCAAAAAMAAWb1gwABS7E7AAFBEwABQTAAAoQldwAD8dAFgwABVAAEmwABQRAEcwABQTi6gwgAAAADAAFm9XcAA/HQBYMAAVQBOwABQXcAAUGsAAL89YMAA+9ABJsAAUF0BHMAAUG0uoMIAAAAAwABZvWDAAPvQTsAAUJLAAFCgAACiWl3AAPx0AWDAAFabASbAAFCSARzAAFCiLqDCAAAAAMAAWb1dwAD8dAFgwABWm07AAFCxwABQvAAAh05gwAD70AEmwABQsQEcwABQvi6gwgAAAADAAFm9YMAA+9BOwABQ0MAAUNUAAIC9YMAA/RwBHMAAUNcuoMIAAAAAwABZvU7AAFDuwABQ+QAAhTRgwABWdQEmwABQ7gEcwABQ+y6gwgAAAADAAFm9YMAAVnVOwABRC8AAURYAAIQaYMAA+goBHMAAUR2DwABRGMAmeVhIAQABasAAUStgwABS7MAA+fAAwAD9KUnAAFE5IiEcwABRRoHAAFE9wCZ5JEgBAAErAMAA/SkAHsAAUVHAAFlkAgACJ5cegcAAUWHAJnkkAD4BScAAUXQiHMAAUYCEwABReMAmeYZIAQABKwDAAP0pASEcwABRmhbAAFGThMAAUYvAJnmGYcAA/KNIAQABlADAAPzzPgE9FcAAUhnAJnqnCio/P07AAFJDwABSTQAAoe1gwAD70AEmwABSQwEcwABSTy6gwgAAAADAAFm9YMAA+9BJwABSWhTAAFJewCZ6pwoAPgE9FcAAUnLAJntsCxzAAFJ8FMAAUnLAJntsCwCBBgEAAWrAAFJ/YMAA+9AVAMAA++k/ScAAUpchHMAAUqwWwABSmy6uFsAAUwFIAQABKwDAAP3FPgE9FcAAUr3AJntsCxzAAFLHFMAAUr3AJntsCwCBBgEAAWrAAFLKYMAA+9CDPgDAAPvpP07AAFL4wABTAQAAhtVdwAD8dAFgwABV/AEmwABS+AEcwABTAy6gwgAAAADAAFm9XcAA/HQBYMAAVfw9HMAAUw4uoUkBAAEWwABTJIDAAFMZwCZ5F4dOnrQAwABZxT0cwABTbxzAAFNGFsAAUzUuhEPAAFL7rewBAAEnvzwAtR2eeAIAAobAAFN8wCZ57hbAAFOLLoRDwABS+wC1VknAAFOZJcAAU6IUwABTncAmelYIAGDAAFoHSsAAU7UAP07AAFPLwABT2wABqENgwAD70AEjHMAAU+4UwABT5cAmfDIMAEgBAAErAMAA/SkWwABUA4DAAFP4wCZ5F4dOnrQWwABUHxbAAFQZFMAAVBDAJnwyDACDGcAA/FiHTsAAVf4BYMAA+9BOwABUNsAAVEsAAK3pYMAA/bYBHsAAVE3AAFNvAQABgMAAVGXAJnkXAD0cwABUfhbAAFR2LoRDwABS+4SPDgANFMAAVJTAJn1WDgAUwABUssAmfDIMABTAAFTEwCZ7bAsAFMAAVNfAJnp5CQAmwABU6wEUwABU68AmelYIAGDAAP22hsAAVPnAJnnuhMAAVRDAJnmGHMAAVSEuvzkBAAGBwABVNsAmeSQAwABTMBTAAFVJwCZ87w0Ah8AAVWLAJnoohcAAVXbAJnnAFsAAVZaCwABVjcAmeTGHTp60FsAAVaourhbAAFMBAYd6KbUsPRfAAFXbLq4WK8AAUwEGwABTM4DgwABV+8AAVgzAAFbrAAC+2AFqwABV/GDAAP0cAgAAAQPAAFYkwABW6wAAAAICAsAAVisAAAChuWCeqwDAAFY+AAAAochgnqsAAFwBPgI9HMAAVk8uoOEBAAEnvtkAwABTcEnAAFZ1IRzAAFaKFsAAVnkurhbAAFMBSAEAASsAwAD9xT4BPRzAAFabLqC/AQABasAAVqtgwABS7MAA+gcAwABZuj4BPRzAAFbILqC/AQABasAAVthgwABS7MAA+fAAwABZugbAAFM0gODAAFbwwABXAcAAV3YAAL7aAWrAAFbxYMAA/RwCAAABA8AAVyDAAFd2AAAAAgICwABXJwAAAKG5YJ6rAMAAVzoAAAChyGCeqwAAXAE+AT0cwABXSy6g4QEAASe+2wDAAFNwBsAAUzWA4MAAV3vAAFeMwABYdgAAvtwBasAAV3xgwAD9HAIAAAEDwABXq8AAWHYAAAACAgLAAFeyAAAAoblgnqsAwABXxQAAAKHIYJ6rAABcAT4CScAAV9YhFsAAV9suh27AAFL8PgE9HcAAV/eiEQMAA2rAAFgZYJFUrluAwABYNcAmf7mAwABYQsAmf7kAwABZ4z89HMAAWFouoL8BAAFqwABYamDAAFLswAD6BwDAAFm6BsAAUzaA4MAAWHvAAFiMwABZTAAAvqgBasAAWHxgwAD9HAIAAAEDwABYoMAAWUwAAAABAQHAAFinAAAAkk5gnqsAAFwBPgI9HMAAWLQuoOEBAAEnvqkAwABTcEnAAFjWIRzAAFjrFsAAWNourhbAAFMBSAEAASsAwAD9xT4BPRzAAFj8LqC/AQABasAAWQxgwABS7MAA+gcAwABZuj4BPRzAAFkpLqC/AQABasAAWTlgwABS7MAA+fAAwABZugbAAFM3gODAAFlRwABZYsAAWe8AAL8+AWrAAFlSYMAA/RwCAAABA8AAWXvAAFnvAAAAAgICwABZggAAAJJOYJ6rAMAAWY4AAAC/P2DAAPoKAABcAT4CPRzAAFmmLqDhAQABJ78+AMAAU3A9HMAAWdMuoL8BAAFqwABZ42DAAFLswAD6BwDAAFm6BsAAUziA4MAAWfTAAFoFwABe+gAAv0ABasAAWfVgwAD9HAIAAAEDwABaEMAAXvoAAAAGBgbAAFoXAAAAvztgnqsAwABaLAAAAKDzYJ6rAMAAWj8AAACg9GCeqwDAAFpbAAAAoPZgnqsAwABacgAAAL6iYJ6rAMAAWoIAAACAvWCeqwAAXAE+CT0XwABaji6guyIcwABaszUAAAABAGCeqwGFwABapsAmgfUjHMAAWqyGAMAmghdIAQABKwAAKxbAAFqshgDAJoIXgl6exQFgwAD9tkgBAAEWwABa0RbAAFq+FsAAWrYuhEPAAFL7rgi1DIC9tU8AwAD9xQAcwABa4oTAAFrZwCaB6EgBAAErAMAA/SnAAFL+TsAAWv4AAACh7V3AAPx0AWCuSgBJwABbDSEcwABbH4DAAFsRwCaBtEgBAAErAMAA/Sk+Aj0jHMAAWzqGwABbMMAmgpdIAQABKwDAAP0pjsAAWzDAJoKXMcAAW0hgrkoAKwFdwAD8dAFgrko9HMAAW1yGwABbUsAmgpdWAQABasAAW2BgrkrAANbqAMAA/IU/ScAAW3UhHMAAW4WBwABbecAmgcFIAQABKwDAAP0pPgFJwABblhbAAFuaLqC7wABS/j4BPRzAAFuzLqIRAwADasAAW9dgkVTAAHxPgcAAW/HAJoHBgcAAW/7AJoHBAMAAWeM+Aj0jHMAAXC2GwABcI8AmgpdIAQABKwDAAP0pjsAAXCPAJoKXMcAAXDtgrkoAKwFdwAD8dAFgrko9HMAAXFGGwABcR8AmgpdWAQABasAAXFVgrkrAANcIAMAA/IU/ScAAXHAhHMAAXIOCwABcdMAmgc5IAQABKwDAAP0pPgI9IxzAAFyehsAAXJTAJoKXSAEAASsAwAD9KY7AAFyUwCaClzHAAFysYK5KACsBXcAA/HQBYK5KPRzAAFzAhsAAXLbAJoKXVgEAAWrAAFzEYK5KwADW2wDAAPyFP0nAAFzaIRzAAFzug8AAXN7AJoHbSAEAASsAwAD9KT4CTsAAXQbAAF0NAACCXmDAAP22ARbAAF0fg8AAXQ/AJoHbgl6exUnAAF0tHsAAXTHAAPWxAgACJ4Qmh8AAXULAJoSDAD4CPSMcwABdX4bAAF1VwCaCl0gBAAErAMAA/SmOwABdVcAmgpcxwABdbWCuSgArAV3AAPx0AWCuSj0cwABdg4bAAF15wCaCl1YBAAFqwABdh2CuSsAA1xcAwAD8hUnAAF2aHsAAXZ7AAPWxAgACJ4Qlh8AAXbHAJoSDAD4CPSMcwABdzobAAF3EwCaCl0gBAAErAMAA/SmOwABdxMAmgpcxwABd3GCuSgArAV3AAPx0AWCuSj0cwABd8obAAF3owCaCl1YBAAFqwABd9mCuSsAA1vkAwAD8hT4CPSMcwABeH4bAAF4VwCaCl0gBAAErAMAA/SmOwABeFcAmgpcxwABeLWCuSgArAV3AAPx0AWCuSj0cwABeQ4bAAF45wCaCl1YBAAFqwABeR2CuSsAA1s0AwAD8hT89HMAAXmEuoL8BAAE1AAAAAQBgwAD70AE1AAAAAQBgnqsBg8AAXmbAJoHbIxzAAF53hwDAJoYUSAEAASsAACsWwABed4cAwCaGFIdOnrQBYMAA+9AjHMAAXoKHAMAmhghIAQABKwAAHMAAXoWUgcQAAAAAwAD784cAwCaGCAFgwAD70ADAAFm6PRzAAF6OLqC/AQABNQAAAAEAXcAA/HQBYK5KAYbAAF6TwCaClyMcwABenYcAwCaGkEgBAAErAABqwABeqmDAAFl6wAD7aocAwCaGkAFgwAD9HADAAFm6PRzAAF7CFsAAXrouhEPAAFL7rgUCAAEnvzwBrmsqtRwGwABTOYDgwABe/8AAXxDAAHIqAAC+3gFqwABfAGDAAP0cAgAAAQPAAF8ZwAByKgAAAAUFBcAAXyAAAAC+omCeqwDAAF8wAAAAn0BgnqsAwABfQgAAAL7fYJ6rAMAAX1oAAAChEmCeqwDAAF9zAAAAnQRgnqsAAFwBPhw9HMAAX4MuoOEBAAEnhTkAwABTcE7AAF+owABfsQAAv0JgwABS7AEmwABfqAEcwABfsy6gwgAAAADAAFm9YMAAUuxJwABfvhzAAF/LhcAAX8LAJoeKSAEAAWrAAF/ZYMAAUuzAAPoeAMAA/Sk+AT0cwABgIi6gwgAAAADAAFm9P07AAGBQwABgWAAAoQldwAD8dAFgwABVAAEmwABgUAEcwABgWi6gwgAAAADAAFm9XcAA/HQBYMAAVQBOwABgacAAYHcAAL89YMAA+9ABJsAAYGkBHMAAYHkuoMIAAAAAwABZvWDAAPvQTsAAYJ7AAGCsAACiWl3AAPx0AWDAAFabASbAAGCeARzAAGCuLqDCAAAAAMAAWb1dwAD8dAFgwABWm07AAGC9wABgyAAAh05gwAD70AEmwABgvQEcwABgyi6gwgAAAADAAFm9YMAA+9BOwABg3MAAYOsAAL9DYMAA/RwBHMAAYO0uoMIAAAAAwABZvUnAAGD4IhzAAGEOasAAYQVgkjzAAJAWSAEAARTAAGERwCaIxgoAAMAA/SkAHMAAYSuGwABhI8Amh/ZIAQABKwDAAP0pPgE9FcAAYTzAJojGCmrAAGFWYJI8wACQPj9OwABhcwAAAIC9YMAA/RwATsAAYYsAAACCZ2CEIgBJwABhlSXAAGGoFMAAYZnAJojGCgBgkjw+BD0VwABhvcAmiUcLHsAAYcSSOgEAARTAAGHVwCaIxgoBYJI8AD0VwABh7MAmiVcMasAAYgFghCKExU7AAGIVwABiKwAAv0RgwAD70AEewABiLZI7AQABFMAAYkvAJojGCgFgkjwAScAAYmIhHMAAYn01AAAAAQBgwAD70AE1AAAAAQBdwAD8dAFgwABVAAGGwABiZ8Amh/YjHMAAYnAUAMAmifsOAEgBAAErAAArFsAAYnAUAMAmifsOAGHAAPyjAWDAAPvQIxzAAGJ3FADAJonvDgBIAQABKwAAkxQAwCaJ7w4AAWDAAPvQSAEAARTAAGKAwCaJuA0AAMAA/PM+BE7AAGKlAAAAiKtbAEFHwABitxTAAGK/wCaJuA0ABAHAAGLnasAAYudgwAD70AkAPgI9FcAAYvbAJop+DmrAAGMBXZFgAWEBYMAA/bZgkUnAAGpBQsAAYzEAAcAAY0hqwABjSGDAAPvQFQA+AknAAGNXHMAAY21qwABjZGCSPMAAkBZIAQABFMAAY3DAJojGCgFgkjwAwAD9KT4BPRXAAGOQwCaKfg5qwABjm12RYAFhAWDAAP22YJFJwABp4D4BPRXAAGPmwCaKfg5qwABj8V2RYAFhAWDAAP22YJFJwABqjkLAAGQvAAHAAGRGasAAZEZgwAD70CEAPgI9FcAAZFXAJop+DmrAAGRgXZFgAWEBYMAA/bZgkUnAAGrsQsAAZJAAAAE+AT0ewABkt50WBAAEJMAAZNkBFMAAZMPAJom4DQAnlbEUwABlDMAmiJgJABbAAGUYLoCswABTBABOwABlN8AAZT4AAIPsYMAA/bYBJsAAZTcBFMAAZUDAJolHCwBgwAD9tj0cwABlTi6eagMAAybAAGViARzAAGViFMAAZVnAJop+DgCIBQEAARTAAGVwwCaJRwsAAABgkUkUwABld8AmiJgJABbAAGWKFMAAZYPAJovbDwBhwAD9ugDAAFNtPgFJwABlqiEcwABltobAAGWuwCaH9kgBAAErAMAA/Sk+AUbAAGXLwABl+sAAZecAAACZtmDAAFUAAIbAAGXxwCaH9j4BScAAZgghFsAAZhQUwABmDcAmjIoOAL9FwABVCz4BPRzAAGYwLp5qAwADasAAZjtgkVTAAGs8FsAAZmYUwABmX8AmjIoOAIdOwABWGBbAAGaQFsAAZosUwABmhMAmjIoOAIC9wABVBWHAAP26AMAAU20/Pz4CPRXAAGbYwCaJRwsUwABm38AmiMYKAD0VwABm9cAmiVcMHMAAZvwuvzkBAAGAwABnEcAmhy8AwABTME7AAGcywABnPQAAhTRgwABWdQEmwABnMgEcwABnPy6gwgAAAADAAFm9YMAAVnVOwABnT8AAZ1oAAIQaYMAA+goBHMAAZ2WFwABnXMAmh4pIAQABasAAZ3NgwABS7MAA+fAAwAD9KUnAAGeBIiEcwABnjoDAAGeFwCaHL0gBAAErAMAA/SkAHsAAZ5nAAFlkAgACJ5cegMAAZ6nAJocvAD4BScAAZ7wiHMAAZ8iGwABnwMAmh/ZIAQABKwDAAP0pASEcwABn4hbAAGfbhsAAZ9PAJof2YcAA/KNIAQABlADAAPzzPgE9FcAAaGHAJo2CDio/P07AAGiLwABolQAAoe1gwAD70AEewABooK5SAgABJsAAaKkBHMAAaKkuoMIAAAAAwABZvV3AAPx0AWCuSgGEGhTAAGi8wCaNgg4AScAAaM0hHMAAaOIWwABo0S6uFsAAUwFIAQABKwDAAP3FPgE9FcAAaPPAJo5HDxzAAGj9FMAAaPPAJo5HDwCBBgEAAWrAAGkAYMAA+9CDPgDAAPvpP0nAAGkYIRzAAGk3HMAAaScUwABpHcAmjkcPAIN3AQABasAAaSlgwAD70IM+AMAA++hIAQABkwDAAPzzPgE9FcAAaUXAJo5HDxzAAGlPFMAAaUXAJo5HDwCDdwEAARzAAGlSasAAaVNgwAD70BWEhgAAAADAAPvrAMAA++g/TsAAaXDAAGl4AACEHWDAAPoKASEcwABpkhzAAGmFFMAAaXvAJo5HDwCDdwEAAWrAAGmHYMAA+9AhAMAA++hIAQABkwDAAPzzTsAAaaDAAGm2AAC/RmDAAPvQASbAAGmgARzAAGm4LqDCAAAAAMAAWb1gwAD70E7AAGnZwABp4gAAhtVdwAD8dAFgwABV/AEmwABp2QEcwABp5C6gwgAAAADAAFm9XcAA/HQBYMAAVfxOwABp9sAAagsAAK3pYMAA/bYBHsAAag3AAFNvAQABgcAAaiXAJoc8AD0cwABqcBzAAGpHFsAAajYuhEPAAFL7rewBAAEnvzwAtR2eeAIAAhTAAGp9wCaIXggAFsAAaowuhEPAAFL7ALVWScAAapolwABqoxTAAGqewCaJRwsAYMAAWgc+Az0XwABqvi6uFivAAFMBPRfAAGrdLqC7KsAAUv5KwABq+gA/TsAAaxPAAGsjAACuFGDAAP22ASMiHMAAazIUwABrLcAmiVcMAEgBAAFqwABrQ2CEIoSYAMAA/SkBHMAAa1IUwABrTcAmiVcMAEgBAAFqwABrY2CEIoSnAMAA/SkrHMAAa5MWwABriy6EQ8AAUvuuHAIAAhTAAGu1wCaJRwsAFMAAa7vAJoiYCQAAtSABYMAA/bZJwABrzCEcwABr4BTAAGvQwCaQvBQASAEAASsAwAD9xT4EScAAa/EiFMAAa/XAJo9jEAAAIRzAAGwJhcAAbADAJoeKSAEAAWrAAGwXYMAAUuzAAPnwAMAA/Sk+Aj0cwABsKy6eagMAA2rAAGw2YJFUlmoUwABsV8Amj6sRADcFAMAAU209FcAAbHrAJo5HDxzAAGyEFMAAbHrAJo5HDwCDdwEAARzAAGyHasAAbIhgwAD70CGEhgAAAADAAPvrAMAA++g/ScAAbKEhHMAAbLAUwABspcAmjVQNAEgBAAErAMAA/Sk+Aj0cwABtAy6iEQMAA2rAAG0nYJFUn5aBwABtScAmhzyBwABtVcAmhzwAwABZ4z0VwABtasAmjVQNKz9OwABtlcAAbaUAAahDYMAA+9ABIxzAAG26FMAAbbHAJo/ZEgBIAQABKwDAAP0pFsAAbc+BwABtxMAmhzyHTp60FsAAbesWwABt5RTAAG3cwCaP2RIAgxnAAPxYh07AAFX+AWDAAPvQPRzAAG4FFsAAbf0uhEPAAFL7rhMOAA0UwABuH8AmkBMTABTAAG4/wCaP2RIAFMAAblPAJo5HDwAUwABuaMAmjVQNABTAAG5+wCaJRwsAFMAAbo7AJpC8FAAUwABuqcAmiF4IAIbAAG7CwCaH9hTAAG7VwCaSbhUAFMAAbvDAJoiYCQCHwABvBsAmiDAWwABvKITAAG8fwCaHY4dOnrQWwABvPi6uFsAAUwEBoRKDwABvbcAmh1a1Kz4DScAAb5QUwABvmMAmj2MQAD4CPRzAAG+rLp5qAwADasAAb7ZgkVSesxTAAG/KwCaPqxEANwUAwABTbT0VwABv7cAmjkcPHMAAb/cUwABv7cAmjkcPAIN3AQABHMAAb/pqwABv+2DAAPvQIYSGAAAAAMAA++sAwAD76D9OwABwHsAAcC4AAahDYMAA+9ABIxzAAHBDFMAAcDrAJo/ZEgBIAQABKwDAAP0pFsAAcFiBwABwTcAmhzyHTp60FsAAcHQWwABwbhTAAHBlwCaP2RIAgxnAAPxYh07AAFX+AWDAAPvQPRzAAHCOFsAAcIYuhEPAAFL7hI8OAA0UwABwpsAmkBMTABTAAHDGwCaP2RIAFMAAcNrAJo5HDwAUwABw78AmjVQNACbAAHEFARTAAHEFwCaJRwsAYMAA/bYUwABxFcAmiF4IAIbAAHEuwCaH9hTAAHFBwCaJVwwAFMAAcVHAJpQJFQAUwABxbMAmiJgJAIfAAHGCwCaIMBbAAHGkhMAAcZvAJodjh06etBbAAHG6Lq4WwABTAQGHeiq1LD0XwABx9C6uFivAAFMBPRfAAHIRLqC7KsAAUv4GwABTOoDgwAByL8AAckDAAHPYAAC+jwFqwAByMGDAAP0cAgAAAQPAAHJlwABz2AAAAAEBAcAAcmwAAAC+kGCeqwAAXAE+BD0cwAByfy6g4QEAASe+kQDAAFNwTsAAcrnAAHLAAACt52DAAP0cARzAAHLCLqDCAAAAAMAAWb1OwABy1MAAct4AAITUYMAA/RwBHMAAcuAuoMIAAAAAwABZvUnAAHLrJcAAcvaBwABy78AmlaJgwABaBz4BPRzAAHMRLqC/AQABFMAAcxbAJpWiAQFgwABaBwDAAFm6ScAAcyolwABzOILAAHMuwCaVxWDAAFoHPgE9HMAAc1MuoL8BAAEUwABzWMAmlcUCAWDAAFoHAMAAWbo+AT0cwABzdy6gvwEAARzAAHOEFsAAc3wuhEPAAFL7reYDAAMmwABzowGCwABzo8AmlcVgwABWdSbAAHOuAYHAAHOuwCaVol3AAPx0AWDAAFZ1FsAAc8KAwABztsAmlXuHTp60ALUXAMAAWboGwABTO4DgwABz3cAAc+7AAHgUAAC++gFqwABz3mDAAP0cAgAAAQPAAHQGwAB4FAAAAAUFBcAAdA0AAACfQGCeqwDAAHQfAAAAvvtgnqsAwAB0OQAAAJWgYJ6rAMAAdEcAAAC+/GCeqwDAAHRgAAAAnQRgnqsAAFwBPg49HMAAdHAuoOEBAAEnvvoAwABTcE7AAHSjwAB0uAAArelgwAD9tgEewAB0usAAU28BAAGAwAB00sAmlv4ATsAAdPXAAHUAAACecl3AAPx0AWDAAFZ1ASbAAHT1ARzAAHUCLqKmAQABg8AAdQ/AJpclAMAAWb5dwAD8dAFgwABWdU7AAHUuwAB1PwAArhBgwAD9HAEcwAB1QS6gwgAAAADAAFm9TsAAdVDAAHVaAACh7WDAAPvQASbAAHVQARzAAHVcLqDCAAAAAMAAWb1gwAD70E7AAHWBwAB1jwAAolpdwAD8dAFgwABWmwEmwAB1gQEcwAB1kS6gwgAAAADAAFm9XcAA/HQBYMAAVptOwAB1oMAAdasAAIdOYMAA+9ABJsAAdaABHMAAda0uoMIAAAAAwABZvWDAAPvQTsAAdb/AAHXEAACAvWDAAP0cARzAAHXGLqDCAAAAAMAAWb1OwAB158AAdfAAAIbVXcAA/HQBYMAAVfwBJsAAdecBHMAAdfIuoMIAAAAAwABZvV3AAPx0AWDAAFX8PRzAAHX9LqFJAQABFsAAdhOAwAB2CMAmlv6HTp60AMAAWcVJwAB2JCIlwAB2LRTAAHYowCaYfgsAYMAAWgcBJcAAdlOHwAB2QsAml8VgwABaBz4CPRzAAHZ2FsAAdm4uhEPAAFL7rewBAAEnrm0AtR1KwAB2pAA/TsAAdrvAAHbLAACoQ2DAAPvQARbAAHbYgMAAds3AJpb+h06etE7AAHbswAB2+gAAqERgwAD70AEWwAB3BYTAAHb8wCaXModOnrQ9HMAAdx0WwAB3FS6EQ8AAUvuuDwoACoXAAHc/wCaXWRTAAHddwCaYoQwAJsAAd28BFMAAd2/AJph+CwBgwAD9thTAAHd9wCaYFgkAFMAAd5TAJpfoCAAmwAB3pwGHwAB3p8Aml8VgwABWdYbAAHfBwCaXghTAAHfVwCaZUw0AFMAAd+7AJphQCgAUwAB4AsAmmXgOAAC1KAbAAFM8gODAAHgZwAB4KsAAePQAAKLvAWrAAHgaYMAA/RwCAAABA8AAeDrAAHj0AAAAAwMDwAB4PwAAAIDuYMAA+9AAwAB4TAAAAJ9AYJ6rAMAAeF4AAACdBGCeqwAAXAE+Aj0cwAB4bi6g4QEAASei8ADAAFNwPRzAAHiPLqC/AQABNQAAAAEAXcAA/HQBYMAAVnUBHMAAeLtqwAB4ml3AAFn8AWDAAFZ1wAD7gaDCAgACFsAAeL8uoM3AAFmxgMAAeMbAJpppAMAAWf4jHMAAeM2DAMAmmrhIAQABKwAAasAAeOJgwABZesAAuEiDAMAmmrgBYMAA/RwAwABZugbAAFM9gODAAHj5wAB5CsAAeYAAAKLxAWrAAHj6YMAA/RwCAAABA8AAeSTAAHmAAAAAAQEBwAB5KwAAAJJOYJ6rAABcAT4CPRzAAHk4LqDhAQABJ6LyAMAAU3A9HMAAeWAuoMIBAAFqwAB5bmDAAFl6wAC4SADAAFm9BsAAUz6A4MAAeYXAAHmWwAB5zgAAob0BasAAeYZgwAD9HAIAAAEDwAB5osAAec4AAAABAQHAAHmpAAAAkk5gnqsAAFwBPgE9HMAAebYuoOEBAAEnob4AwABTcAbAAFM/gODAAHnTwAB55MAAeoEAAKJPAWrAAHnUYMAA/RwCAAABA8AAegHAAHqBAAAAAQEBwAB6CAAAAKJQYJ6rAABcAT4BScAAehQhFsAAei8WwAB6KBbAAHohFsAAehkuhEPAAFL7lRW0+4JFqPifNqd8PgE9HMAAekouolEBAAGAwAB6csAmnD0AwABXjT8GwABTQIDgwAB6hsAAepfAAHwxAACiUgFqwAB6h2DAAP0cAgAAAQPAAHqhwAB8MQAAAAICAsAAeqgAAACfQGCeqwDAAHq6AAAAolNgnqsAAFwBPgY9HMAAes4uoOEBAAEnhMYAwABTcEnAAHrmIRbAAHsBFsAAevoWwAB68xbAAHrrLoRDwABS+5UVtPuCRaj4nzanfD4BPRzAAHscLqJUAQABgcAAezbAJpzbAMAAV4s/TsAAe2HAAHtrAABbXcAA/HQBYMAAVnUBJsAAe2EBHMAAe20uoMIAAAAAwABZvV3AAPx0AWDAAFZ1TsAAe3zAAHuHAACHTmDAAPvQASbAAHt8ARzAAHuJLqDCAAAAAMAAWb1gwAD70E7AAHubwAB7oAAAgL1gwAD9HAEcwAB7oi6gwgAAAADAAFm9ScAAe60lwAB7toTAAHuxwCads2DAAFoHPgE9HMAAe9EuoL8BAAEUwAB71sAmnbMEAWDAAFoHAMAAWbo+AT0cwAB78C6gvwEAARzAAHv9FsAAe/UuhEPAAFL7reQDAAOEwAB8CsAmnbOCwAB8EMAmnUyDwAB8G8AmnYUAtRYAwABZugbAAFNBgODAAHw2wAB8R8AAfOkAAL6NAWrAAHw3YMAA/RwCAAABA8AAfFLAAHzpAAAAAQEBwAB8VwAAAIDuYMAA+9AAAFwBPgI9HMAAfGQuoOEBAAEnvo4AwABTcD0cwAB8gC6gvwEAATUAAAABAF3AAPx0AWDAAFY4ARzAAHyxasAAfItdwABZ/AFgwABWOMAA+0GgwgIAAhbAAHy1LqDNwABZsYDAAHy8wCaejADAAFn+IxzAAHzDgQDAJp7BSAEAASsAAB/AAHzSwABaDQEAARzAAHzhlIHEAAAAAMAA+/MAgQDAJp7BAWDAAP0cAMAAWboGwABTQoDgwAB87sAAfP/AAH1tAACjfwFqwAB872DAAP0cAgAAAQPAAH0UwAB9bQAAAAEBAcAAfRsAAACSTmCeqwAAXAE+Aj0dwAB9LqN/AQABgMAAfUTAJp+AAMAAWdA9F8AAfVAuvxUqwABS/wbAAFNDgODAAH1ywAB9g8AAffYAAKJjAWrAAH1zYMAA/RwCAAABA8AAfZTAAH32AAAAAQEBwAB9mwAAAJJOYJ6rAABcAT4CPRzAAH2oLqDhAQABJ6JkAMAAU3A9HMAAfccuoL8BAAEcwAB91BbAAH3MLoRDwABS+63oAQABFsAAfeaAwAB94MAmn+6HTp60ALUZAMAAWboGwABTRIDgwAB9+8AAfgzAAH+jAACiegFqwAB9/GDAAP0cAgAAAQPAAH4gwAB/owAAAAUFBcAAficAAACSTmCeqwDAAH45AAAAgmdgwABZRgDAAH5FAAAAontgnqsAwAB+YAAAAKD0YJ6rAMAAfnYAAACg9mCeqwAAXAE+AknAAH66IRbAAH7VFsAAfs4WwAB+xxbAAH6/LoRDwABS+5UVtPuCRaj4nzanfD4BPRzAAH7wLqD4AQABgsAAfw/AJqChAMAAV4w/PRzAAH8pLqC/AQABHMAAf1sjIRzAAH8+g8AAfy/AJqCuSAEAASsAwAD9KWrAAH9IYMAA+9CBVZMBYMAA+9CBBgEAAR7AAH9urlMBAAE1AAAAAQBgnqsBhMAAf4bAJqC7IxzAAH+XhQDAJqFlSAEAASsAACsWwAB/l4UAwCahZYJensUBYMAA/bYAAMAA++kAwABZugbAAFNFgODAAH+owAB/ucAAgjUAAKJ8AWrAAH+pYMAA/RwCAAABA8AAf8vAAII1AAAABwcHwAB/2QAAAKJ9YJ6rAMAAf/IAAACifmCeqwDAAIAPAAAAoepgnqsAwACAJgAAAKJ/YJ6rAMAAgEQAAACigGCeqwDAAIBuAAAAgmdgwABY+ADAAICFAAAAooFgwABZRgAAXAE+Bz0cwACAly6g4QEAASeiggDAAFNwTsAAgL7AAIDJAACHTmDAAPvQASbAAIC+ARzAAIDLLqDCAAAAAMAAWb1gwAD70E7AAIDdwACA4gAAgL1gwAD9HAEcwACA5C6gwgAAAADAAFm9TsAAgPvAAIEAAACCkGDAAFZ1ASbAAID7ARzAAIECLr82AQABHMAAgRcuoMIAAAAAwABZvQDAAFMsYMAAVnVOwACBJ8AAgTEAAKHtYMAA+9ABJsAAgScBHMAAgTMuoMIAAAAAwABZvWDAAPvQTsAAgVTAAIFdAACG1V3AAPx0AWDAAFX8ASbAAIFUARzAAIFfLqDCAAAAAMAAWb1dwAD8dAFgwABV/EnAAIFqJcAAgXMUwACBbsAmoocIAGDAAFoHPgE9HMAAgY4uoL8BAAEUwACBk8AmoocIAWDAAFoHAMAAWbo+AT0cwACBrS6gvwEAARzAAIG6FsAAgbIuhEPAAFL7riQHAAcUwACBzcAmoxYLABTAAIHXwCai6AoAFMAAgeLAJqKqCQAmwACB6AEUwACB6MAmoocIAGDAAP22IRzAAIIEgMAAgfjAJqHgSAEAASsAwAD9KYfAAIINwCaiWYPAAIIZwCaiBwC1MQDAAFm6BsAAU0aA4MAAgjrAAIJLwACClAAAoo8BasAAgjtgwAD9HAIAAAEDwACCdcAAgpQAAAAAAAAAXAE+AAbAAFNHgODAAIKZwACCqsAAgyoAAKKQAWrAAIKaYMAA/RwCAAABA8AAgtLAAIMqAAAAAAAAAFwBPgE9HMAAgtsuoOEBAAEnopEAwABTcAbAAFNIgODAAIMvwACDQMAAg7wAAKKTAWrAAIMwYMAA/RwCAAABA8AAg1vAAIO8AAAAAgICwACDYgAAAJWgYJ6rAMAAg3AAAACSTmCeqwAAXAE+AT0cwACDfS6g4QEAASeilADAAFNwBsAAU0mA4MAAg8HAAIPSwACETAAAopUBasAAg8JgwAD9HAIAAAEDwACD88AAhEwAAAABAQHAAIP6AAAAkk5gnqsAAFwBPgE9HMAAhAcuoOEBAAEnopYAwABTcAbAAFNKgODAAIRRwACEYsAAh+QAAKKIAWrAAIRSYMAA/RwCAAABA8AAhH3AAIfkAAAAAwMDwACEiQAAAIDuYMAA+9AAwACElgAAAJ9AYJ6rAMAAhKgAAACdBGCeqwAAXAE+BD0cwACEuC6g4QEAASeiiQDAAFNwTsAAhPjAAIT9AACCZ2DAAFj4ASMewACE/8AAWWQCAAInma6BwACFDcAmpakAasAAhTdgwABY+MAAuelqwACFY2DAAFj4wAC6AAFgwABY+E7AAIafwACGqgAAmoBdwAD8dAFgwABVAAEcwACG5mrAAIa6XcAAWfwBYMAAVQDAALoUoMICAAIWwACG6i6gzcAAWbGAwACG8cAmpZoAwABZ/knAAIb9HMAAhwyEwACHAcAmpixIAQABKwDAAP0pPgE9HMAAhx0uoL8BAAEfwACHJsAAWg0BAAEewACHNcAAWWgBAAGBwACHRMAmpakAAADAAFm6PgJGwACHZsAAh5vAAIeCAAAAgO1gwABVAACEwACHj8Ampiw+AT0XwACHr4XAAIelwCam2oJng8AAh7bAJqXdwABVBj0cwACHyi6gvwEAAYTAAIfPwCamLADAAFm6BsAAU0uA4MAAh+nAAIf6wACSfwAAopgBasAAh+pgwAD9HAIAAAEDwACIDcAAkn8AAAAEBATAAIgZAAAAgO5gwAD70ADAAIgmAAAAn0BgnqsAwACIOAAAAJ0EYJ6rAMAAiE0AAACCZ2DAAFlGAABcAT4GPRzAAIhZLqDhAQABJ6KZAMAAU3BOwACImgAAAKEJXcAA/HQBYMAAVQAAScAAiKccwACIsYDAAIirwCanYUgBAAGUAMAA/PM+Ak7AAIjGwACIywAAgehgwAD9HAEcwACIzS6gwgAAAADAAFm9ScAAiNolwACI44XAAIjewCan6F3AAPx0AWDAAFUAPgE9jMAAiQ7AJqezFMAAiRjAJqfoBQFdwAD8dAFgwABVAEnAAIkrISXAAIk0hcAAiS/AJqfoYMAAWgc+A0AhHMAAiV6FwACJWcAmp+hIAQABKwDAAP0pwACJWcAAiWUAPYzAAIlwwCansx7AAIl+wAD1ywEBYMAAVQABlAA9HMAAia6EwACJp8Amp7OAvwIAApMmwACJrgGFwACJtMAmp+hgwABVAADAAPyEP0nAAInNHMAAideAwACJ0cAmp2GAlwEAAZQAwAD8/z4DTsAAievAAInwAACB6GDAAP0cARzAAInyLqDCAAAAAMAAWb09iMAAif/AJqdhHMAAigSAwACJ/8Amp2GBjQEAAZQAwAD89knAAIoOJcAAiheFwACKEsAmqPVgwABaBz4BPRzAAIo0Lr59AQABgMAAijzAJqdhAMAAWbRJwACKUSXAAIpahcAAilXAJqj1XcAA/HQBYMAAVQA+Aj2MwACKhcAmp7McwACKzmrAAIqVXcAAWfwBYMAAVQDAALoUopwDAAMWwACK2C6gzcAAWbGAwACK38Amp2EWwACK6xTAAIrmwCao9QUBXcAA/HQBYMAAVQBhwAD8owDAAFn/ScAAivwhHMAAiwiEwACLAMAmp7NIAQABKwDAAP0pPgE9HMAAiyWEwACLHcAmp7ODXgMAA4DAAIsuwCanYRbAAIs9hMAAizXAJqezYcAA/KMUwACLRcAmqPUFAV3AAPx0AWDAAFUAAMAA/Jk/PgI9jMAAi23AJqezHMAAi7ZqwACLfV3AAFn8AWDAAFUAwAC6FKKcAwADFsAAi8AuoM3AAFmxgMAAi8fAJqdhlADAAFn/ScAAi9ohHMAAi+aEwACL3sAmp7NIAQABKwDAAP0pPgE9HMAAjAKEwACL+8Amp7OAvwIAAoDAAIwDwCanYSbAAIwCAYXAAIwMwCao9WDAAFUAAMAA/IQ/P0nAAIwuIRzAAIw6hMAAjDLAJqezSAEAASsAwAD9KT4CQBbAAIxahMAAjFLAJqezg7LAAPxXwACMUsAAjGQAScAAjG0cwACMgBbAAIx5hMAAjHHAJqezYcAA/KNIAQABlQDAAPzzPgFJwACM0CIhHMAAjOQWwACM3xzAAIzbhMAAjNTAJqezSwEAAZMAwAD8g4C9wABVBUgBAAErAMAA/cUAHMAAjP8WwACM+hzAAIz2hMAAjO/AJqezSwEAAZMAwAD8g4C9wABVBUgBAAEWwACNDRzAAI0JhMAAjQLAJqezSwEAAZQAwAD8g4C9wABVBQDAAP3FPgE9HMAAjR8unmoEAAMcwACNWWrAAI05XZFgAWEBYMAA/bZgkUmrmogFAQABFsAAjXIcwACNboTAAI1nwCans0sBAAGUAMAA/IOAvcAAVQUAkWQWwACNkhzAAI2OhMAAjYfAJqezSwEAAZQAwAD8g4dOwABWGBbAAI28FsAAjbccwACNs4TAAI2swCans0sBAAGUAMAA/IOAvcAAVQVhwAD9ugGCUzHAAI3bYJFnARzAAI5bHMAAjidqwACN7V2RYAFhAWDAAP22YJFJq+CIBQEAARbAAI5AHMAAjjyEwACONcAmp7NLAQABlADAAPyDgL3AAFUFAJFkglsDAAMWwACOgS6ArMAAUwQWwACOkRzAAI6NhMAAjobAJqezSwEAAZMAwAD8g4dOwABWGBbAAI6tFsAAjqgcwACOpITAAI6dwCans0sBAAGTAMAA/IOAvcAAVQVhwAD9ugCRUMAAU20/ScAAjt4cwACO8RbAAI7qhMAAjuLAJqezYcAA/KOAlwEAAZUAwAD8/z4CTsAAjyTAAI8uAACsfl3AAPylAmDAAP22YMAAVQABMsAAj1xgwAD9tmDAAFUAAEbAAI9oAMAAj4QAAACZtmDAAFUAAITAAI+OwCans0E+AknAAI+jHMAAj7MWwACProbAAI+nwCatroC9wABVBUgBAAErAMAA/cVCwACPvAA/ScAAj9AcwACP3oXAAI/UwCate4dBAQABFsAAj/GGwACP6sAmra6AvcAAVQUAwAD8uD4BPRzAAJAGLp5qBAADHMAAkEJqwACQIl2RYAFhAWDAAP22YJFJq5qIBQEAARbAAJBXhsAAkFDAJq2ugL3AAFUFAJFkFsAAkHWGwACQbsAmra6HTsAAVhgWwACQnRbAAJCYhsAAkJHAJq2ugL3AAFUFYcAA/boBglMxwACQvmCRZwEcwACRQBzAAJEOasAAkNJdkWABYQFgwAD9tmCRSavgiAUBAAEWwACRI4bAAJEcwCatroC9wABVBQCRZIJbAwADFsAAkU0ugKzAAFMEFsAAkWkcwACRW4XAAJFSwCate0sBAAEWwACRY4bAAJFcwCatroC9wABVBQDAAPy5h07AAFYYFsAAkasWwACRphzAAJGYhcAAkY/AJq17SwEAARbAAJGghsAAkZnAJq2ugL3AAFUFAMAA/LmAvcAAVQVhwAD9ugCRUMAAU20+AT0cwACR74XAAJHmwCate4C/AgACFsAAkfeGwACR8MAmra6AvcAAVQWGwACR/8Amra4AwAD8uj8/PRzAAJIvLqC/AQABFsAAkj+BwACSNMAmp3CHTp60AMAAWbo9HMAAklAuoL8BAAE1AAAAAQBdwAD8dAFgwABVAAGEwACSVcAmp7MjHMAAkl2FAMAmr95IAQABKwAAasAAkmpgwABZesAA+5CFAMAmr94BYMAA/RwAwABZugbAAFNMgODAAJKEwACSlcAAkx0AAL6WAWrAAJKFYMAA/RwCAAABA8AAkq3AAJMdAAAAAgICwACStAAAAJJOYJ6rAMAAksYAAACCZ2DAAFlGAABcAT4CPRzAAJLSLqC/AQABFsAAkt2AwACS18AmsF+HTp60AMAAWbo9HcAAkvS+lgIAAoDAAJMNwCawX4HAAJMUwCawbADAAFnTBsAAU02A4MAAkyLAAJMzwACT1AAAozsBasAAkyNgwAD9HAIAAAEDwACTPMAAk9QAAAAFBQXAAJNDAAAAozpgnqsAwACTWQAAAIJnYMAAWOYAwACTZQAAAKMWYJ6rAMAAk4IAAACjPGCeqwDAAJOUAAAAoz1gnqsAAFwBPgE9HMAAk6ouoOEBAAEnoF0AwABTcAbAAFNOgODAAJPZwACT6sAAlo0AAL73AWrAAJPaYMAA/RwCAAABA8AAk/HAAJaNAAAAAwMDwACT+AAAAL74YJ6rAMAAlAsAAACiL2CeqwDAAJQaAAAAgO5gwAD70AAAXAE+Cj0cwACUJy6g4QEAASe++QDAAFNwTsAAlEbAAJRbAACt6WDAAP22AR7AAJRdwABTbwEAAYDAAJR1wCaxiwBOwACUnsAAlLAAAK4fXcAA/HQBYMAAVOkBHMAAlOZqwACUwF3AAFn8AWDAAFTpwAD7p6DCAgACFsAAlOouoM3AAFmxgsAAlPHAJrGlAMAAWf5OwACVAcAAlQwAAIdOYMAA+9ABJsAAlQEBHMAAlQ4uoMIAAAAAwABZvWDAAPvQTsAAlTjAAJVIAACoQ2DAAPvQARbAAJVWgMAAlUrAJrGLh06etE7AAJVtwACVcgAAgL1gwAD9HAEcwACVdC6gwgAAAADAAFm9TsAAlZXAAJWeAACG1V3AAPx0AWDAAFX8ASbAAJWVARzAAJWgLqDCAAAAAMAAWb1dwAD8dAFgwABV/D0cwACVqy6hSQEAARbAAJXCgMAAlbbAJrGLh06etADAAFnFScAAldMlwACV3IfAAJXXwCaym2DAAFoHSsAAle8APz0cwACWAxbAAJX7LoRDwABS+64eBwAHg8AAlgvAJrHOFMAAliHAJrK+CAAmwACWKwGHwACWK8AmsptgwAD9toTAAJYxwCax94bAAJZMwCaydoXAAJZdwCaySDUAAAABAGCeqwE1AAAAAQBgnqsBgcAAlmnAJrGYIxzAAJZ0FADAJrOeCQBIAQABKwAAKxbAAJZ0FADAJrOeCQCdDZ64AWCeqyMcwACWfhQAwCazlAkASAEAASsAACsWwACWfhQAwCazlAkAh06etAFgwAD70AC1LQbAAFNPgODAAJaSwACWo8AAlw4AAL9IAWrAAJaTYMAA/RwCAAABA8AAlrnAAJcOAAAAAQEBwACWwAAAAJJOYJ6rAABcAT4BPRzAAJbVFsAAls0uhEPAAFL7rgUCAAEnriEBrmsqtRwGwABTUIDgwACXE8AAlyTAAJe6AACiWQFqwACXFGDAAP0cAgAAAQPAAJc1wACXugAAAAEBAcAAlzwAAACfQGCeqwAAXAE+Aj0cwACXTi6g4QEAASeiWQDAAFNwPRzAAJd7FsAAl3MuhEPAAFL7rgUCAAEnriMBrmsqtRwGwABTUYDgwACXv8AAl9DAAJiBAACijAFqwACXwGDAAP0cAgAAAQPAAJfxwACYgQAAAAEBAcAAl/gAAACSTmCeqwAAXAE+Aj0cwACYBS6g4QEAASeijADAAFNwPRzAAJhCFsAAmDouhEPAAFL7rgUCAAEnriMBrmsqtRwGwABTUoDgwACYhsAAmJfAAJpvAACiYAFqwACYh2DAAP0cAgAAAQPAAJimwACabwAAAAICAsAAmK0AAACiYWCeqwDAAJjCAAAAolNgnqsAAFwBPgc9HMAAmNYuoOEBAAEnhncAwABTcEnAAJj2IRbAAJkRFsAAmQoWwACZAxbAAJj7LoRDwABS+5UVtPuCRaj4nzanfD4BPRzAAJksLqJUAQABgcAAmUbAJrWqAMAAV4s/TsAAmXzAAJmEAAChCV3AAPx0AWDAAFUAASbAAJl8ARzAAJmGLqDCAAAAAMAAWb1dwAD8dAFgwABVAD0cwACZkS6gwgAAAADAAFm9TsAAmbrAAJnFAACFNGDAAFZ1ASbAAJm6ARzAAJnHLqDCAAAAAMAAWb1gwABWdU7AAJnswACZ+gAAolpdwAD8dAFgwABWmwEmwACZ7AEcwACZ/C6gwgAAAADAAFm9XcAA/HQBYMAAVps9HMAAmgcuoL8BAAEcwACaFBbAAJoMLoRDwABS+64iBAAEg8AAmi3AJrZmhMAAmjnAJraUgsAAmkjAJrYbFsAAml+AwACaUcAmtZ2HTp60ALUvAMAAWboGwABTU4DgwACadMAAmoXAAJxoAACijQFqwACadWDAAP0cAgAAAQPAAJqkwACcaAAAAAICAsAAmqsAAACh6mCeqwDAAJq8AAAAonFgnqsAAFwBPgc9HMAAmswuoOEBAAEnoo4AwABTcE7AAJsZwACbIQAAoQldwAD8dAFgwABVAAEmwACbGQEcwACbIy6gwgAAAADAAFm9XcAA/HQBYMAAVQBOwACbMsAAm0AAAL89YMAA+9ABJsAAmzIBHMAAm0IuoMIAAAAAwABZvWDAAPvQTsAAm1nAAJtkAACFNGDAAFZ1ASbAAJtZARzAAJtmLqDCAAAAAMAAWb1gwABWdU7AAJuLwACbmQAAolpdwAD8dAFgwABWmwEmwACbiwEcwACbmy6gwgAAAADAAFm9XcAA/HQBYMAAVptJwACbpiEWwACbwRbAAJu6FsAAm7MWwACbqy6EQ8AAUvuVFbT7gkWo+J82p3w+AT0cwACb3C6iVAEAAYHAAJv2wCa3ZgDAAFeLPz0cwACcCy6gvwEAARzAAJwYFsAAnBAuhEPAAFL7riIEAASEwACcMcAmt/WFwACcPcAmuCOCwACcTMAmt42DwACcVcAmt8cAtS8AwABZugbAAFNUgODAAJxtwACcfsAApDIAAL6YAWrAAJxuYMAA/RwCAAABA8AAnJLAAKQyAAAAAwMDwACcoAAAAL6ZYJ6rAMAAnLYAAACVoGCeqwDAAJzEAAAAnQRgnqsAAFwBPgo9HMAAnNQuoOEBAAEnvpgAwABTcE7AAJ0DwACdGAAArelgwAD9tgEewACdGsAAU28BAAGAwACdMsAmuSkATsAAnWEAAACiWl3AAPx0AWDAAFabAE7AAJ17AAAAgL1gwAD9HABOwACdiQAAAIdOYMAA+9AATsAAna0AAACFNWDAAFWGAEnAAJ2/HMAAncqBwACdw8AmuTZIAQABKwDAAP0pPglOwACd+MAAngAAAKEJXcAA/HQBYMAAVQABJsAAnfgBHMAAngIuoMIAAAAAwABZvV3AAPx0AWDAAFUAPRzAAJ4PLqDCAAAAAMAAWb09jMAAni7AJrmTJsAAni4BHMAAnj4uoMIAAAAAwABZvV3AAPx0AWDAAFabPY7AAJ5LwCa5uSbAAJ5LARzAAJ5YLqDCAAAAAMAAWb1gwAD70D2NwACeZcAmuakcwACebC6gwgAAAADAAFm9TsAAnoXAAJ6QAACFNGDAAFZ1ASbAAJ6FARzAAJ6SLqDCAAAAAMAAWb1gwABWdUnAAJ7/JcAAnwiFwACfA8AmualgwABaBz4DPRzAAJ8lLqDCAAAAAMAAWb09HMAAn0kWwACfQS6EQ8AAUvut7AEAASeubQC1HUrAAJ95AD89HMAAn5cWwACfjy6EQ8AAUvuuBQIAASeuIwGuayq1HD2PwACf2sAmuckcwACf+xbAAJ/zLoRDwABS+64iBAAEFMAAoAvAJrqtCQArFMAAoB3AJrn4CACGwACgJsAmubkAtS8+Bk7AAKBKwACgTwAAgpBgwAD9HAEcwACgUS6gwgAAAADAAFm9PYzAAKBewCa5kybAAKBeARzAAKBuLqDCAAAAAMAAWb1dwAD8dAFgwABWmz2OwACge8AmubkmwACgewEcwACgiC6gwgAAAADAAFm9YMAA+9A9jcAAoJXAJrmpHMAAoJwuoMIAAAAAwABZvUnAAKCpJcAAoLKFwACgrcAmualgwABaBz4DPRzAAKDPLqDCAAAAAMAAWb09HMAAoPMWwACg6y6EQ8AAUvut7AEAASeubQC1HUrAAKEjAD9JwAChOSXAAKFCFMAAoT3AJruPCABgwABVhj4BPY/AAKKrwCa5yRTAAKK6wCa7jwgBYMAAVYY+AT0cwACjCS6eagMAA2rAAKMUYJFUwACHbRbAAKM2gcAAoy/AJrk2h06etBbAAKNJgcAAo0LAJrk2YZ7EAMAAU21OwACjesAAo4MAAIbVXcAA/HQBYMAAVfwBJsAAo3oBHMAAo4UuoMIAAAAAwABZvV3AAPx0AWDAAFX8PRzAAKOQLqFJAQABFsAAo6qAwACjm8AmuSmHTp60AMAAWcU9HMAAo8MWwACjuy6EQ8AAUvuuIAYABoPAAKPYwCa5ahTAAKPuwCa84wgAJsAAo/gBhcAAo/jAJrmpYMAA/baEwACkBsAmuZOHwACkFcAmucmGwACkI8AmubkAtS4GwABTVYDgwACkN8AApEjAAKgHAACg8gFqwACkOGDAAP0cAgAAAQPAAKRZwACoBwAAAAcHB8AApGcAAACg82CeqwDAAKSAAAAAoPRgnqsAwACknAAAAKD1YJ6rAMAApLMAAACg9mCeqwDAAKTOAAAAgO5gwAD70ADAAKThAAAAn0BgnqsAwACk+QAAAJ0EYJ6rAABcAT4KPRzAAKUJLqDhAQABJ6DyAMAAU3BJwAClYSEWwAClfBbAAKV1FsAApW4WwAClZi6EQ8AAUvuVFbT7gkWo+J82p3w+AT0cwAClly6g+AEAAYLAAKW2wCa96wDAAFeMP07AAKXcwACl5wAArn1dwAD8dAFgtVwBHMAApekuv0kBAAGEwACl98AmvgUAwABTV07AAKYPwACmFAAAgpBgwABWdQEmwACmDwEcwACmFi6/NgEAARzAAKYrLqDCAAAAAMAAWb0AwABTLGDAAFZ1TsAApjvAAKZFAACh7WDAAPvQARzAAKalHMAApm4jIRzAAKZUgMAApkjAJr3RSAEAASsAwAD9KWrAAKZeYMAA+9CDK5MBYMAA+9CBBgEAASMhHMAApoiBwACmecAmvd5IAQABKwDAAP0pasAAppJgwAD70IFVkwFgwAD70ADAAPvpgQYBAAEewACmuK5TAQABNQAAAAEAYJ6rAYPAAKbQwCa9+CMcwACm4RQAwCa/kAkASAEAASsAACsWwACm4RQAwCa/kAkAgl6exQFgwAD9tgAAwAD76U7AAKcEwACnDQAAhtVdwAD8dAFgwABV/AEmwACnBAEcwACnDy6gwgAAAADAAFm9XcAA/HQBYMAAVfw9HMAApxouoUkBAAEWwACnMIXAAKclwCa+FIdOnrQAwABZxUnAAKdBHMAAp1CHwACnRcAmvpJIAQABKwDAAP0pSsAAp1kAP07AAKdswACngQAArelgwAD9tgEewACng8AAU28BAAGFwACnm8AmvhQAPRzAAKe0FsAAp6wuhEPAAFL7rnwFAAUUwACnx8AmwFcLABTAAKfdwCa/1goAFMAAp+fAJr8ACQAUwACn8sAmvsIIAIfAAKf4wCa+kgC1KgbAAFNWgODAAKgMwACoHcAArJUAAKD5AWrAAKgNYMAA/RwCAAABA8AAqCbAAKyVAAAABwcHwACoLQAAAKDzYJ6rAMAAqEAAAACg9GCeqwDAAKhWAAAAoPVgnqsAwACobQAAAKD2YJ6rAMAAqIIAAACA7mDAAPvQAMAAqI8AAACfQGCeqwDAAKihAAAAnQRgnqsAAFwBPgo9HMAAqLEuoOEBAAEnoPoAwABTcEnAAKj+IRbAAKkZFsAAqRIWwACpCxbAAKkDLoRDwABS+5UVtPuCRaj4nzanfD4BPRzAAKk0LqD4AQABgsAAqVPAJsEdAMAAV4w/TsAAqXnAAKmEAACufV3AAPx0AWC1XAEcwACphi6/SQEAAYTAAKmUwCbBNwDAAFNXTsAAqazAAKmxAACCkGDAAFZ1ASbAAKmsARzAAKmzLqDCAAAAAMAAWb1gwABWdU7AAKnCwACpzAAAoe1gwAD70AEcwACqLBzAAKn1IyEcwACp24DAAKnPwCbBA0gBAAErAMAA/SlqwACp5WDAAPvQgyuTAWDAAPvQgQYBAAEjIRzAAKoPgcAAqgDAJsEQSAEAASsAwAD9KWrAAKoZYMAA+9CBVZMBYMAA+9AAwAD76YEGAQABHsAAqj+uUwEAATUAAAABAGCeqwGDwACqV8AmwSojHMAAqmgUAMAmwrIJAEgBAAErAAArFsAAqmgUAMAmwrIJAIJensUBYMAA/bYAAMAA++lJwACqdSIcwACqhYDAAKp5wCbBA0gBAAErAMAA/SkAIRzAAKqmHMAAqpoUwACqkMAmwiIJAIN3AQABasAAqpxgwAD70CEAwAD76EgBAAGTAMAA/PM+Aj0cwACrFS6eagMAA2rAAKsgYJFUnocWwACrS4PAAKs7wCbBKodOnrQWwACrcYPAAKthwCbBKmGexADAAFNtPRXAAKuAwCbCIgkcwACrihTAAKuAwCbCIgkAg3cBAAEcwACrjWrAAKuOYMAA+9AhhIYAAAAAwAD76wDAAPvoP07AAKu5wACrwgAAhtVdwAD8dAFgwABV/AEmwACruQEcwACrxC6gwgAAAADAAFm9XcAA/HQBYMAAVfxJwACrzxzAAKveh8AAq9PAJsHESAEAASsAwAD9KUrAAKvnAD9OwACr+sAArA8AAK3pYMAA/bYBHsAArBHAAFNvAQABhcAArCnAJsFGAD0cwACsQhbAAKw6LoRDwABS+658BQAFFMAArFXAJsQqCwAUwACsa8Amw8wKABTAAKx1wCbCIgkAFMAArIDAJsH0CACHwACshsAmwcQAtSoGwABTV4DgwACsmsAArKrAAK9FAAC/SQAAAAEDwACst8AAr0UAAAABAQHAAKy8AAAAgO5gwAD70AAAXcAA/HQBYLVcAT4FScAArMkcwACs04DAAKzNwCbEy0gBAAGTAMAA/PNKwACs2QErP07AAKz6wACtBQAArn1dwAD8dAFgtVwBHsAArQvAAPXLAQFgtVwBgMAArRvAJsTLAE7AAK0swACtPQAAvxhgwAD6CgEqRcAArUoBwACtU8AArVUAAGJgwAD70AEcwACtXYDAAK1XwCbEy4GNAQABlADAAPz2ASEcwACtZIPAAK1iwCbFVkgBAAEcwACtZ5SBxAAAAADAAPvzAMAA/PMBi8AArWvAJsVWHMAArWyDwACta8AmxVaBjQEAAZQAwAD89j4GTsAArXzAAK2KAACoRGDAAPvQASbAAK18ARzAAK2MLqDCAAAAAMAAWb1gwAD70E7AAK2fwACtqgAArn9gnqsBJsAArZ8BHMAArawuoMIAAAAAwABZvWCeq07AAK2/wACt3AAAv0pgnqsBJsAArb8BHMAArd4uoMIAAAAAwABZvWCeq07AAK3vwACt+gAAh05gwAD70AEmwACt7wEcwACt/C6gwgAAAADAAFm9YMAA+9BOwACuEMAArhUAAIC9YMAA/RwBHMAArhcuoMIBAAFqwACuJWDAAFl6wAC6IwDAAFm9ScAArjglwACuQRTAAK48wCbGfwgAYMAAWgc+AT2KwACuXsAmxT0pPgE9HMAArpiBwACujsAmxQ2AvwIAAoPAAK6ZwCbFVh/AAK6itWQFAAUmwACurAEUwACurMAmxn8IAGDAAP22h8AArrLAJsZRhsAArsrAJsYnhcAArujAJsX9hMAArvTAJsXPAADAAPyESsAArxYBI4LAAK8dwCbFPSuBwACvN8AmxQ0BXcAA/HQBYLVcBsAAU1iA4MAAr0rAAK9bwACxAAAAo3YBasAAr0tgwAD9HAIAAAEDwACvbMAAsQAAAAABAQHAAK9zAAAAkk5gnqsAAFwBPgU9HMAAr4AuoOEBAAEno3YAwABTcE7AAK+pwACvtAAAh05gwAD70AEmwACvqQEcwACvti6gwgAAAADAAFm9YMAA+9BOwACvyMAAr80AAIC9YMAA/RwBHMAAr88uoMIAAAAAwABZvT0cwACwcy6gwgAAAADAAFm9ScAAsH4lwACwh4LAALCCwCbH7WDAAFoHPgE9HMAAsKIuoL8BAAEUwACwp8Amx+0CAWDAAFoHAMAAWbo+AT0cwACwwS6gvwEAARzAALDOFsAAsMYuhEPAAFL7riYDAAMmwACw3gGCwACw3sAmx+1gwAD9tiuBwACw6sAmx78AtTIAwABZugbAAFNZgODAALEFwACxFsAAsfsAAKN3AWrAALEGYMAA/RwCAAABA8AAsTDAALH7AAAAAgICwACxNwAAAJJOYJ6rAMAAsUIAAACA7mDAAPvQAABcAT4DPRzAALFPLqDhAQABJ79LAMAAU3BAHMAAsYSBwACxfsAmyOeAlwEAAZMAwAD8/8AAsX7AALGHAD0cwACxji6gvwEAATUAAAABAF3AAPx0AWDAAFabARzAALHCasAAsZldwABZ/AFgwABWm8AAuvGgwgIAAhbAALHGLqDNwABZsYHAALHNwCbI5wDAAFn+IxzAALHUggDAJsk/SAEAASsAAGrAALHpYMAAWXrAALpaggDAJsk/AWDAAP0cAMAAWboGwABTWoDgwACyAMAAshHAALNrAACjeAFqwACyAWDAAP0cAgAAAQPAALIgwACzawAAAAMDA8AAsicAAACSTmCeqwDAALIyAAAAJ2DAAPvQAMAAsj8AAACjeWCeqwAAXAE+BD0cwACyVS6g4QEAASejeADAAFNwTsAAsoTAALKKAACFaWDAAFZ1ASbAALKEARzAALKMLr82AQABHMAAsqEuoMIAAAAAwABZvQDAAFMsYMAAVnVOwACy/cAAswwAAIS4XcAA/HQBYMAAVpsBJsAAsv0BHMAAsw4unzoAAAAAwABZvF3AAPx0AWDAAFabScAAsxohHMAAsy2EwACzHsAmym9IAQABKwDAAP0pPgE9F8AAs1QcwACzTITAALM+wCbKb0sBAAGBwACzTcAmyfwAwAD8g4Vpg8AAs1zAJsoxwABWnT8GwABTW4DgwACzcMAAs4HAAL0TAACjewFqwACzcWDAAP0cAgAAAQPAALORwAC9EwAAAAICAsAAs5gAAACfQGCeqwDAALOqAAAAnQRgnqsAAFwBPgU9HMAAs7ouoOEBAAEno3sAwABTcE7AALQvwAC0PgAAhLhdwAD8dAFgwABWmwEmwAC0LwEcwAC0QC6fOgAAAADAAFm8XcAA/HQBYMAAVptOwAC0bgAAAK3yXcAA/KUCYMAA/bZgwABWmwBJwAC0hyEcwAC0moLAALSLwCbLZ0gBAAErAMAA/Sk+AUbAALSrwAC038AAtMQAAACEIWDAAFabAILAALTPwCbLZz4BScAAtOkhHMAAtPsWwAC09YTAALTtwCbL5IVpwABWnUgBAAErAMAA/Sk+BEnAALUQHMAAtSiDwAC1FMAmy6FIAQABKwDAAP0pPgI9i8AAtT/AJsuhHsAAtVnAAPysAAJgwAD9tmDAAFabAABGwAC1icAAtb3AALWiAAAAhCFgwABWmwCCwAC1rcAmy2c+AT0cwAC14IPAALXNwCbLoYC/AgACFsAAtemFwAC14cAmzHKAvcAAVo+FwAC18cAmzHIAwAD8uj9OwAC4g8AAuIkAAIVpYMAAVpsBhMAAuIvAJsvkQUXAALieAcAAuKfAALitAAC/TGDAAPvQAZMBIiEcwAC4zBbAALjGhcAAuMDAJszEhWnAAFadSAEAASsAwAD9KQAcwAC43YbAALjXwCbM5mMBAAEWwAC47oLAALjfwCbLZ2HAAPyjAMAA/P0BjsAAuQbAJszmHMAAuQSGwAC5BsAmzOZkAQABlADAAPz1PgI9jcAAuRvAJszEHMAAuTaDwAC5I8Amy6FLAQABFsAAuUMWwAC5PYXAALk3wCbMxIVpwABWnYC9wABWeADAAPy5ScAAuVYiHMAAuWCFwAC5WsAmzMRIAQABKwDAAFaxARzAALlxhcAAuWvAJszESAEAAYTAALl0wCbL5ADAAFaxQsAAuX0AP0nAALmaIhzAALmkhcAAuZ7AJszESAEAAYTAALmnwCbL5ADAAFaxACEcwAC5vhbAALm4hcAAubLAJszEhWnAAFadSAEAASsAwAD9KT4FTsAAugLAALoGAAC/TV3AAPx0AWDAAP22AR7AALoMwAD3bgEBYMAA/bYBkwA9jcAAuijAJszEHMAAukODwAC6MMAmy6FLAQABFsAAulIWwAC6TITAALpEwCbL5IVpwABWnYC9wABWeADAAPy5Q8AAumUhHMAAunKFwAC6bMAmzMRIAQABhMAAunXAJsvkAMAAVrE+Aj0cwAC6kobAALqOwCbOQlYBAAEWwAC6nIXAALqWwCbMxIC9wABWjwDAAPyFPY3AALqxwCbMxBzAALrMg8AAurnAJsuhSwEAARbAALrZFsAAutOFwAC6zcAmzMSFacAAVp2AvcAAVngAwAD8uU7AALsCwAC7CgAAImCRSQEjFsAAuxCGwAC7DMAmzkKBVcAA/FYcwAC7TWrAALsqXZFgAWEBYMAA/bZgkUmljogFAQABFsAAu2OEwAC7W8Amy+SAvcAAVo8AkWQcwAC7mGrAALt7XZFgAWECYMAA/bZgwAD9tmCRSaIFiAUCAAIWwAC7w4TAALu7wCbL5IC9wABWjxzAALvNhsAAu8nAJs5CWAEAASeTtwDAAPxGAJFkAWCRST0cwAC76C6eagMAA4fAALvzwCbPQhbAALwEhMAAu/zAJsvkh07AAFYYFsAAvB0WwAC8GITAALwQwCbL5IC9wABWj2HAAP26AMAAU20/Pz9JwAC8TxbAALxTLr8VwABS/z4CPRzAALxuLp5qAwADasAAvHlgkVSf/B7AALypwABZaAEAAYDAALy4wCbLMwAewAC8xcAAWXACAAKAwAC80sAmyzOBwAC83sAmy0AAAMAAU209F8AAvPAuvxUqwABS/z8GwABTXIDgwAC9GMAAvSnAAL70AAC+fgFqwAC9GWDAAP0cAgAAAQPAAL0ywAC+9AAAAAQEBMAAvUAAAAC+f2CeqwDAAL1TAAAAvoBgnqsAwAC9ZAAAAKHIYJ6rAMAAvXQAAAChumDAAPoKAABcAT4FPRzAAL2DLqDhAQABJ75+AMAAU3BOwAC9pMAAva8AAIdOYMAA+9ABHMAAvbEuvxYAAAAAwABTBk7AAL3NwAC93wAAv05gwAD9HAEcwAC94S6gwgAAAADAAFm9TsAAvgLAAL4LAACG1V3AAPx0AWDAAFX8ASbAAL4CARzAAL4NLqDCAAAAAMAAWb1dwAD8dAFgwABV/EnAAL4Yg8AAvhzAJtESPgE9HMAAvjUWwAC+LS6EQ8AAUvuuewQABIbAAL4/wCbRgR7AAL5TwABUBQMAA4XAAL5fwCbRXoTAAL5ywCbROxbAAL5+LoCswABTBAArhMAAvorAJtE7ALUlPgE9HMAAvrIWwAC+qi6EQ8AAUvuuewQABIbAAL68wCbRgSsmwAC+zAGFwAC+zMAm0V5gwAD9toTAAL7fwCbROwC1JQbAAFNdgODAAL75wAC/CsAAwPsAAKLBAWrAAL76YMAA/RwCAAABA8AAvyHAAMD7AAAAAwMDwAC/LwAAAGpgnqsAwAC/PAAAAKDkYJ6rAMAAv1QAAACdBGCeqwAAXAE+Bz0cwAC/ZC6g4QEAASeiwgDAAFNwPRzAAL+MLqKmAQABgcAAv5nAJtKmAMAAWb5OwAC/xsAAv80AAJ+kYMAA/bYBJsAAv8YBHMAAv88uoqYBAAGBwAC/3MAm0qYAwABZvmDAAP22TsAAwAXAAMATAACFF13AAPx0AWDAAFZ1ASbAAMAFARzAAMAVLqDCAAAAAMAAWb1dwAD8dAFgwABWdU7AAMAkwADALwAAh05gwAD70AEmwADAJAEcwADAMS6gwgAAAADAAFm9YMAA+9BOwADAQ8AAwEgAAIC9YMAA/RwBHMAAwEouoMIAAAAAwABZvUnAAMBVJcAAwF6GwADAWcAm05NgwABaBz4BPRzAAMB5LqC/AQABFMAAwH7AJtOTBgFgwABaBwDAAFm6PgE9HMAAwJguoL8BAAEcwADApRbAAMCdLoRDwABS+65qBAAEhsAAwMjAJtOThMAAwM7AJtMrg8AAwN3AJtL0hcAAwOXAJtNlALUbAMAAWboGwABTXoDgwADBAMAAwRHAAMIzAAC/TwFqwADBAWDAAP0cAgAAAQPAAMEjwADCMwAAAAMDA8AAwTEAAAC+i2CeqwDAAMFFAAAAvztgnqsAwADBWgAAAL9QYJ6rAABcAT4DPRfAAMFsLqC7KcAAUv49HMAAwY4WwADBhi6EQ8AAUvuuBQIAASeuGgGuayq1HD0cwADB0C6gvwEAARzAAMIAIyEcwADB5IHAAMHWwCbUgkgBAAErAMAA/SlqwADB7mDAAPvQgz6TAWDAAPvQgQYBAAEjIRzAAMIWgsAAwgvAJtSPSAEAASsAwAD9KWrAAMIgYMAA+9AhkwFgwAD70ADAAPvpAMAAWboGwABTX4DgwADCOMAAwknAAMa9AAC+0gFqwADCOWDAAP0cAgAAAQPAAMJZwADGvQAAAAMDA8AAwmcAAACfQGCeqwDAAMJ5AAAAvtNgnqsAwADCjwAAAJ0EYJ6rAABcAT4RPRzAAMKfLqDhAQABJ77UAMAAU3BOwADCy8AAwtAAAIJnYMAAUuwBJsAAwssBHMAAwtIuoMIAAAAAwABZvWDAAFLsTsAAwvkAAAChMmDAAFSeAEnAAMMQHMAAwxmDwADDFMAm1b5IAQABasAAwydgwABS7MAA+h4AwAD9KT4BPYzAAMNHwCbV7CbAAMNHARzAAMNbLr82AQABHMAAw3AuoMIAAAAAwABZvQDAAFMsYMAAVJ4/TsAAw5/AAMOnAAChCV3AAPx0AWDAAFUAASbAAMOfARzAAMOpLqDCAAAAAMAAWb1dwAD8dAFgwABVAE7AAMO4wADDxgAAvz1gwAD70AEmwADDuAEcwADDyC6gwgAAAADAAFm9YMAA+9A9HMAAw9MuoMIAAAAAwABZvU7AAMP0wADD/wAAh05gwAD70AEmwADD9AEcwADEAS6gwgAAAADAAFm9YMAA+9BOwADEE8AAxBgAAIC9YMAA/RwBHMAAxBouoMIAAAAAwABZvU7AAMQpwADEMwAAoe1gwAD70AEmwADEKQEcwADENS6gwgAAAADAAFm9YMAA+9BJwADEQCEcwADEVRbAAMRELq4WwABTAUgBAAErAMAA/cU+AT0VwADEZsAm1ygJHMAAxHAUwADEZsAm1ygJAIEGAQABasAAxHNgwAD70IM+AMAA++k/TsAAxKHAAMSqAACG1V3AAPx0AWDAAFX8ASbAAMShARzAAMSsLqDCAAAAAMAAWb1dwAD8dAFgwABV/EnAAMS3JcAAxMAUwADEu8Am1wUIAGDAAFoHPgI9HMAAxOMWwADE2y6EQ8AAUvut7AEAASeubQC1HUrAAMURAD9OwADFKsAAxT8AAK3pYMAA/bYBHsAAxUHAAFNvAQABgMAAxVnAJtV9AD0cwADFchbAAMVqLoRDwABS+64YCwALFMAAxYzAJtglCwAUwADFqsAm16sKABTAAMW8wCbXKAkAFMAAxc/AJtcFCACFwADF3cAm1l6EwADF7sAm1ewWwADGFIDAAMYJwCbVfYdOnrSHwADGKMAm1teGwADGPMAm1pgWwADGXILAAMZTwCbVl4dOnrQWwADGcC6uFsAAUwEAtTA9F8AAxocurhYrwABTAT0XwADGpC6guyrAAFL+BsAAU2CA4MAAxsLAAMbTwADHagAAvtcBasAAxsNgwAD9HAIAAAEDwADG7MAAx2oAAAACAgLAAMbzAAAAn0BgnqsAwADHBQAAAJ0EYJ6rAABcAT4CPRzAAMcVLqDhAQABJ5VIAMAAU3A9HMAAxz8uoL8BAAFqwADHT2DAAFLswAD6HgDAAFm6BsAAU2GA4MAAx2/AAMeAwADK2QAAoeUBasAAx3BgwAD9HAIAAAEDwADHk8AAytkAAAACAgLAAMeaAAAAodxgnqsAwADHtAAAAJJOYJ6rAABcAT4HPRzAAMfBLqDhAQABJ4VBAMAAU3BOwADH68AAx/YAAK5/YJ6rARbAAMgLgMAAx/jAJtm/g7Cexk7AAMgbwADIIAAAg7BgnqsBFsAAyC2CwADIIsAm2fODsJ7GQ8AAyDciIRzAAMhDg8AAyD7AJtoWSAEAAYHAAMhGwCbZzADAAP0pACEWwADIVYPAAMhQwCbaFp1snrk+Aj2KwADKUcAm2fODwADKXsAm2hY9i8AAymrAJtoWFsAAynaDwADKccAm2haDsJ7GPRzAAMqGLqC/AQABFsAAyp6AwADKi8Am2b+DsJ7GAMAAWbo9HMAAyqkuoL8BAAGCwADKrsAm2fMAwABZuj0cwADKvy6gvwEAARbAAMrKgcAAysTAJtnMh06etADAAFm6BsAAU2KA4MAAyt7AAMrvwADLpwAAoeYBasAAyt9gwAD9HAIAAAEDwADLB8AAy6cAAAABAQHAAMsOAAAAkk5gnqsAAFwBPgQ9HMAAyxsuoOEBAAEnoecAwABTcD0cwADLQS6gvwEAAWrAAMtQYMAAWXrAALlRAMAAWbo9HMAAy2cuoL8BAAFqwADLdmDAAFl6wAC5UQDAAFm6PRzAAMuNLqC/AQABFsAAy5iAwADLksAm2zmHTp60AMAAWboGwABTY4DgwADLrMAAy73AAMw2AAChEwFqwADLrWDAAP0cAgAAAQPAAMvMwADMNgAAAAMDA8AAy9EAAACA7mDAAPvQAMAAy94AAACfQGCeqwDAAMvwAAAAnQRgnqsAAFwBPgE9HMAAzAAuoOEBAAEnoRQAwABTcAbAAFNkgODAAMw7wADMTMAAzMwAAKEQAWrAAMw8YMAA/RwCAAABA8AAzGDAAMzMAAAAAAAAAFwBPgE9HMAAzGkuoOEBAAEnoREAwABTcAbAAFNlgODAAMzRwADM4sAAzUcAAL7nAWrAAMzSYMAA/RwCAAABA8AAzPXAAM1HAAAAAQEBwADM/AAAAJ0EYJ6rAABcAT4CPRzAAM0MLqDhAQABJ77oAMAAU3A9HMAAzS0uoMIAAAAAwABZvQbAAFNmgODAAM1MwADNXcAAza0AAKECAWrAAM1NYMAA/RwCAAABA8AAzWbAAM2tAAAAAAAAAFwBPgI9HMAAzW8uoOEBAAEnhPcAwABTcEAcwADNoRbAAM2QLq4WwABTAUgBAAErAMAA/cXAAM2QwADNqAAGwABTZ4DgwADNssAAzcPAAM9yAAC+kgFqwADNs2DAAP0cAgAAAQPAAM3YwADPcgAAAAEBAcAAzd8AAAC+kGCeqwAAXAE+Bj0cwADN8i6g4QEAASe+kwDAAFNwTsAAzh3AAM4kAACt52DAAP0cARzAAM4mLqDCAAAAAMAAWb1OwADONcAAzkMAAL9RYMAA+9ABJsAAzjUBHMAAzkUuoMIAAAAAwABZvWDAAPvQTsAAzlfAAM5hAACE1GDAAP0cARzAAM5jLqDCAAAAAMAAWb1JwADObiIlwADOfIPAAM5ywCbeEWDAAFoHASXAAM6YgcAAzpHAJt3AYMAAWgc+AT0cwADOsy6gvwEAAR/AAM68wABaDQEAARbAAM7XgMAAzsvAJt2Zh06etAAAwABZuj4BPRzAAM74LqC/AQABHMAAzwUWwADO/S6EQ8AAUvut5gMAAybAAM8kAYPAAM8kwCbeEWDAAFZ1JsAAzy8BgcAAzy/AJt3AXcAA/HQBYMAAVnUWwADPQ4DAAM83wCbdmYdOnrQAtRcAwABZuj0cwADPWy6gvwEAAYLAAM9gwCbd4wDAAFm6BsAAU2iA4MAAz3fAAM+IwADPywAAvpQBasAAz3hgwAD9HAIAAAEDwADPn8AAz8sAAAAAAAAAXAE+AT0cwADPqC6g4QEAASe+lQDAAFNwBsAAU2mA4MAAz9DAAM/hwADQZwAAv1IBasAAz9FgwAD9HAIAAAEDwADP8sAA0GcAAAADAwPAAM/5AAAAgpRgnqsAwADQBgAAAL77YJ6rAMAA0BoAAAChuWCeqwAAXAE+Aj0cwADQLS6g4QEAASe/UwDAAFNwPRfAANBMLq4WK8AAUwEGwABTaoDgwADQbMAA0H3AANDpAAC/VAFqwADQbWDAAP0cAgAAAQPAANCOwADQ6QAAAAEBAcAA0JUAAAC+8WCeqwAAXAE+Aj0cwADQqS6g4QEAASe/VADAAFNwPRfAANDOLq4WK8AAUwEGwABTa4DgwADQ7sAA0P/AANFuAAC+6gFqwADQ72DAAP0cAgAAAQPAANESwADRbgAAAAMDA8AA0RcAAAC+62DAAPvQAMAA0SoAAACfQGCeqwDAANE8AAAAnQRgnqsAAFwBPgE9HMAA0UwuoOEBAAEnvuwAwABTcAbAAFNsgODAANFzwADRhMAA0eAAAKIjAWrAANF0YMAA/RwCAAABA8AA0ZfAANHgAAAAAgICwADRngAAAKIkYJ6rAMAA0bAAAACiJWCeqwAAXAE+AT0cwADRwS6g4QEAASeCJwDAAFNwBsAAU22A4MAA0eXAANHqwADS0AAAnmoAAAABA8AA0fTAANLQAAAABQMDwADR/QAAACJgkUkAwADSCgAAAIdOYMAA+9AAwADSGgAAAGFgwAD70AACwADSLgAAAJ8TYMAA+goBasAA0jpgwAD6CgDAANJWAAAAglNdwAD8dAFgkWcBagBgwAD82XdcAT4BPRzAANJuFsAA0mYuhEPAAFL7nmoGAASAwADSecAm4VuBwADSgsAm4WeCwADSjsAm4XYWwADSli6ArMAAUwQCnxODwADSr8Am4YWCU4TAANLEwCbhn8AAVb4GwABTboDgwADS1cAA0ubAANN1AAC/CwFqwADS1mDAAP0cAgAAAQPAANL0wADTdQAAAAICAsAA0wMAAACCk12RPgFbAMAA0w8AAACSTmCeqwAAYMAA+goBPgFKwADTHAEiHsAA0yPAAIlLAgACgMAA0zjAJuJMgcAA0z7AJuJbAAEdwADTVr8LAgACgMAA02XAJuJMgcAA02vAJuJbAMAAWeQGwABTb4DgwADUEsAA1CDAANbMAAG/VQAAAAEDwADUN8AA1swAAAABAQHAANQ+AAAAkk5gnqsAAGDAAP22AT4GTsAA1FHAANRaAAC/VmCeqwEWwADUYoDAANRcwCbi45zjnshJwADUeRzAANSGgcAA1H3AJuL6SAEAASsAwAD9KUrAANSPASs/TsAA1KXAANStAAC/V2DAAPoKASpOwADUvsAA1MUAAIKLYMAA/gABH8AA1MvAAP4fAAAAAEPAANTfIRzAANTvgcAA1ObAJuL6SAEAASsAwAD9KT4DTsAA1QfAANUOAACCXmDAAP22ARbAANUZgcAA1RDAJuL6gl6exUnAANUnHMAA1TKEwADVK8Am45aB1gEAASe/WADAAP3IPgM9isAA1U/AJuNCKj0cwADVb4PAANVowCbjVoJCAAAAAMAA/hg9HMAA1YeDwADVgMAm41aCigEAAYTAANWNwCbjlgDAAP4UScAA1aMcwADVroTAANWnwCbjloHWAQABJ79ZAMAA/cg+A0nAANXLIYLAANXQwCbjQj4CPYrAANXlwCbjQik9HMAA1gaDwADV/8Am41aCQgAAAADAAP4YP0nAANYhFsAA1iyDwADWJcAm41aDssAA/h0+AT0cwADWS4PAANZEwCbjVoICAAAAAMAA/hc/PRzAANZvg8AA1mjAJuNWgooBAAGEwADWdcAm45YAwAD+FD89icAA1ozAJuL6FsAA1qCBwADWl8Am4vqDsJ7GSsAA1rABHMAA1r6DwADWt8Am41YjAAAAAMAA/hkGwABTcIDgwADW0cAA1uLAANcqAACg4QFqwADW0mDAAP0cAgAAAQPAANbswADXKgAAAAEBAcAA1vQAAACAvWDAAP22AABcAT4AAAAmQnIAJkK3ACZC+QAmRIAAJkWpACZGcAAmRsoAJkeyACZImgAmSV0AJkrsACZLuAAmTj4AJk8FACZQuQAmUaMAJlJRACZTZAAmU/0AJlSCACZWNAAmVp8AJlbqACZYoQAmWX4AJlr7ACZb2wAmXbAAJl8NACZfcQAmYRIAJmJzACZi/QAmZJ4AJmVwACZl6QAmZl8AJmcmACZoCQAma1UAJmvBACZwEwAmc48AJncZACZ4MAAmeOIAJn5RACZ/HAAmf4QAJoA4ACaA9gAmgX8AJob6ACaVRgAmlskAJpo0ACabMwAmm60AJpwIACacmQAmnlcAJp9LACafuQAmoFAAJqGrACakGgAmpFQAJqSiACalCgAmpWUAJqcsACawKgAmsMUAJrFWACa0CwAmtHIAJrTtACa1aAAmtyQAJrj0ACa9nAAmwM4AJsShACbHYwAmyKUAJsm6ACbK/gAm0LYAJtJlACbUQAAm1UgAJtkDACbZigAm2wQAJtvAACbcNwAm3IUAJtzxACbdZAAm3xgAJt9mACbf6QAm4FIAJuDJACbhMQAm4hcAJuK5ACblCwAm5VQAAABsAAABgOAAJucPACY/jAAmQPwAJucNAAAAAgAm5w8AAAAAAAAAwABTcwCA4QAAA4DaAACCLgABAQOFl4VlhneBJgAAnEUAAQEBm72BXwAAjBwAAQECgiWHywAAAAECwABTdIDhgZuBqoSFB6oAAAABYMAA/RwAAAABBcAAU4IAAAAABAAAAwAAAAAAAAAAAGDAAFN0AT8BCQEAwAD9MgAAAAAJBsAAU3aA4YG+gcyB1QECh2EAAAABA4HVgdUAAAAAAAAAYJxGAAbAAFN3gOGB2oHigeUBAoCsAAAAAQOB5YHlAAAAAAAAAGDAAP43AAbAAFN5gOGB6oHugg4CAqCpAAAAAQOCAoIOAAAAAQEBgggAAACAlmDAAPoKAABcAAbAAFN7gOGCE4IegpMAAqDHAAAAAQOCKoKTAAAABQMDgjMAAAAiYJFJAIJAAAAAh05gwAD70ACCUAAAAGFgwAD70AACgnQAAACCU13AAPx0AWCRZwFqAGDAAPzZd4KCAAAAoh9gwAD6CgFqAGDAAPzZd2CEqQAGwABTfIDhgpiCp4L7AAKizgAAAAEDgryC+wAAAAMDA4LRAAAAgmpgiQAAguUAAABbYIVzAIL0AAAAg1xgwAD70AAAYJFnAAbAAFN9gOGDAIMFg3MAAp5qAAAAAQODD4NzAAAABQMDgxgAAAAiYJFJAIMlAAAAh05gwAD70ACDNQAAAGFgwAD70AACg1kAAACCU13AAPx0AWCRZwFqAGDAAPzZd4NnAAAAnxNgwAD6CgFqAGDAAPzZd1wABsAAU36A4YN4g4OD6gACoO4AAAABA4OQg+oAAAAEAwODnAAAAIJrYISpAIOwAAAAImCRSQCDvQAAAGFgwAD70AABg+EAAACCU13AAPx0AWCRZwFqAGDAAPzZd2CEqQAGwABTf4Dhg++D9oRIAAKhNAAAAAEDhBOESAAAAAMBAYQbAAAAgL1gwAD9tgAChC8AAACGdGDAAP22AWoAYMAA/Nl3hD8AAACHc2DAAPoKAWoAYMAA/Nl3YMAA/bYABsAAU4CA4YRNhFiEgwACoQwAAAABA4RyhIMAAAABAQGEfgAAAIPuYISpAABghKkAAAAm568AJufUACbn+wAm6CsAJuihACbo6AAm6VwAJum7ACbqGQAm6kkAAAAJAAABgOEAJup4ACbnaQAm6nYAAAABACbqeAAAAAAAAADAAFODAIDiAAAHgNwAAIIuAAEBDIUQhmaaSYZthQCGd4ZzhPeGkYaKhoSGSoIMAACbkgABAQGa+oJPAACcRQABAQGbvYKIAADAAFHlAAEBAahPgsgAAKdnAAEBBKO9p7SeXJ5Zg2kAAK7+AAEBAaBzg5kAAMAAU8IAAQEBqgcAAAADAsAAU4aA4oPcg+GEFwuoPgAAAWDAAP0cAAAGBMAAU4iA4oPhg+EJJwBgwAD70AAEwABTioDig+GD4QkowABTgwBgwAD9tgAEwABTi4Dig+GD4QYpAF3AAPx0AWDAAFOGAWoAXcAA/HQBYMAAU4bAAPvKBMAAU4yA4oPug+4GhCoAYMAAU4YBagBgwABThsAA2TIEwABTjYDig/uD+waahgBgwABThgFqAGDAAFOGwAD5TgTAAFOOgOKEDIQMBr9bAGDAAFOGAWoAYMAAU4bAAPu2AQXAAFOSgOKD4YPhhBcBAAADg+GEFwAAAAICAoPhAAAEJ2DAAPvQAIPhAAAEKGDAAP22AABgwABThgE/AwgAwABTiIAAwCbsBggAwABTioEAwCbsEgkAAMAA/TIAAAAAAQbAAFOQgOKD4YPhhBcAACMAAAABA4PhhBcAAAAAAAAAYMAA/bYBSgABDwAuwABTigAAJuxLACbsewAAAAECwABTk4DihYyFkoscA6oBAAABXZk/AWDAAPoKAAACBMAAU5aA4oXihesYv1zAAFODAGDAAFOGAATAAFOXgOKGCoYkCb9dwABTgwBdwAD8dAFgiUoAAQXAAFOfgOKGKYYphrQAAAADhk2GtAAAAAIBAYZTAAAEv11dwAD8dAFgiUoAAYZ/AAAArI9gwABThgFqAGDAAPzZd2DAAFOTAT8DCAHAAFOXgADAJuz5CADAAFOWgYalwCbtCwkBhimZSwAAAAAFBsAAU5mA4oa5hsqG8QAAl9cBaoa6YMAA/RwCAAABA4bZhvEAAAABAQGG4wAAAIPuYIizAABgwAD6CgFKhuwBKgbAAFOagOKG9ocHiU0AAIZ8AWqG92DAAP0cAgAAAQOHGIlNAAAAAQEBhyYAAACD7mCJAAAAYMAA+goBPglJhzImh0YBHIdGFoc7gIc2wCbttYU0iQiETQEAAS4AiLVgwAD6CkqHVAEpP06Hbod6AAC/XmDAAFOGARaHfC6/XMAAU4PAAFOWPReHiy6/XMAAU4Nqh6BgwABThsAA+7bAAFOWRoevh9qHuAAAAIDtYIlKABaHyoCHxcAm7bWEuIkCPgFJh+Imh/YBHIf2FofwgofmwCbuMoVpiU+ETQEAAS4AiLVgwAD6CkqIBAEpPz0XiBsuv1zAAFODHognwABThQEAAYGINsAm7fYAwABTlkaISIh5iFEAAACA7WCIswAWiGOAiF7AJu21hLqJBD4BSYiBJoiPARyIj4KIhcAm7p+ETQEAAS4AiLVgwAD6CkqInQEpP0aItIjgiL0AAACA7WCJLAAWiM+AiMrAJu21hLuJBT4BSYjoJoj7ARyI+xaI9oKI7MAm7uSCkIkvhE0BAAEuAIi1YMAA+gpKiQkBKT89F4kgLr9cwABTg4GJLMAm7fbAAFOWSok9ASoGwABTm4DiiVKJY4oDAACGdgFqiVNgwAD9HAIAAAEDiXWKAwAAAAEBAYmEAAAAg+5giO4AAGDAAPoKAT4CRomQibmJmQAAAB9giLMAFomqgImlwCbvb4UXiPI+AUmJwSaJzgEcic6BicXAJu+IhE0BAAEuAIi1YMAA+gpKidwBKT9KifMBKgbAAFOcgOKKCIoZimYAAIaGAWqKCWDAAP0cAgAAAQOKKYpmAAAAAQEBijYAAACD7mCJGgAAYMAA+goBPgFKikIBJopCARyKVhaKToCKScAm7/WGaIkihE0BAAEuAIi1YMAA+goGwABTnYDiimuKfIsaAACGjQFqimxgwAD9HAIAAAEDipKLGgAAAAEBAYqlAAAAg+5giTkAAGDAAPoKAT4BSoqxASIhHIrCFoq4Lr9cwABTg8AAU5ZIAQABaorOYMAAU4bAANkyAMAA/SkAHIr+ForjLr9dwABTg8AAU5eDFwEAARaLDICLB8Am8FmA7Yk9AMAA/EEAACbtTAAm7YwAJu9GACbvzAAm8DAAJvDDAAAABQLAAFOggOKMQYxQmgMHqgIAAAFgwAD9HAAACATAAFOigOKMd4yFGKpbAGCbngErBMAAU6OA4oygjLAYqMgAYMAAUGQBKwTAAFOkgOKMv4zIGIdhAGCcRgErBMAAU6WA4o0djTwYqM8AYMAA+goBKgTAAFOmgOKNV41sGKC9AGDAAFPkASsEwABTp4Dijq+OwAmrEABdwAD8pQJgg6RgwABVpgEyjr5gg6RgwABVpgAEwABTqIDij/SQBgmrDwBdwAD8pQJgg6RgwABVpgEykARgg6RgwABVpgAEwABTqYDikCGQMAmoWwBgwABR6QABBcAAU7KA4pA1kDWQXgAAAAOQSJBeAAAAAQEBkE4AAASoW2DAAFHpAABgwABToAE/AggBwABTqYAAwCbx6gkBkDXAAP0yAAAAAAYGwABTq4DikNCQ3ZE6AAKgugAAAAEDkPSROgAAAAMDA5EAAAAAgKxgwAD+NwCREwAAAIS8YIjuAJEyAAAAhENgtJ8AAGCvKAAGwABTrIDikaqRt5IXAAKq0gAAAAEDkdGSFwAAAAMDA5HdAAAAgKxgwAD+NwCR8AAAAIS8YIjuAJIPAAAAhENgtJ8AAGCvKAAGwABTrYDikuuS8JThAACouwAAAAEDkxGU4QAAAAAAAABcAT4CRpNzk6aThAAAAJjVYIOkABaToBaTky6rEMAAU6eDYsAA/Mc+AkaTrpPxk7cAAACemmCITgAWk9sWk9KAk8bAJvLTgmqDqIS6hIU+AT0ck/suqxECAAKBlBPAJvL4gJQgwCby0wDAAFOuRpQ8lHqURQAAAJ6aYIhOABaUaRaUYICUVMAm8tOCaoOohLuEhj4BPRyUhC6rEQIAAoGUnMAm8zyAlKnAJvLTAMAAU649HJTWFpTJLqsQwABTp4JCAAAAAMAA/MMGwABTroDilOaU65c4AACrEQAAAAEDlQKXOAAAAAICApUXAAAAmbZgiE4AlSsAAACEUmCDpAAAXAE+AUmVORyVSRaVRICVPcAm87OCkIhUSAEAASsAiLc+AkaVWpWMlWUAAACEjmCDdwAWlYQWlXWBlW7AJvO+hPmDYYSDgyc+AUmVlhyVqhaVpRaVoIKVmsAm8/GAvYNdgL2IgUgBAAEWlbSAla3AJvOzgL2IUgDAAP3FPgM9HpXawABTsAEAAYKV78Am8/EAPReWCICWAcAm87OCkBaWFYKWD8Am8/GCkIN5iFRKliUAPz0XlxSAlw3AJvOzgpBqlyFgiMqEeYhUPwbAAFOvgOKXwJfFmKcAAKjKAAAAAQOX1JinAAAAAgICl98AAACHYWCcRgCX+QAAAIdlYJueAABcAT4DPReYDy6HYYCYG8Am9LTAAFOkPReYLy6qW4GYQMAm9L/AAFOiPReYVC6gvR+YeMAAU/kCAAKAmI7AJvS0gZiZwCb0vwDAAFOmBsAAU7CA4pismLqaAQABv18AAAABA5jOmgEAAAABAQGY1gAAAIJmYINZAABgg1kBPgJJmOQlmO+AmOjAJvU3YIN3PgJOmQqZDwAAgpBgiLMBFpkYFJkRwCb1NwABYIN3gpCDeUmZJCWZLYGZKMAm9VxgwABRRD4BSZlNIRyZZBaZXRaZVhSZUcAm9VwBAWDAAFFEgmbAAFFGgkXAAFS0SAEAARSZZ8Am9TcAAWCDdwDAAP0pPgE9HJmHFpmAFJl7wCb1XAEBYMAAUUSCZsAAUUa+GAEAARSZl8Am9TcAAWCDdwDAAFX4PgE9HJnHFpnAFJm7wCb1XAEBYMAAUUSCZsAAUUaozgAAAADAAFX3Pz9KmfABgJn3wCb1NwAAJvIZACbyYQAm8qkAJvOTACb0lAAm9RcAJvYyAAAABgABBsAAU4WA4oQahCOFFQABmo0AAAABA4QxhRUAAAABAQGEOwAAAKhJYMAAU4YAAGDAAFOGAT4CR4RJgIRRwCb2dQMBhG9qhG9gwABThsAA2TIAPgFKhIABaoSQYMAAU4bAAPlOAYSxaoSxYMAAU4bAAPlOAD4BSoTGAWqE1mDAAFOGwADZMgGE82qE82DAAFOGwAD7tgA+AEqFBAGAhQvAJvZ1AYDiACb29wAm6xgAJuyIACbw4AAm9lMAAAADACb2VQAm9vcAAAABAAAAwABTswCA4wAAA4DcAACCLgABAQWGZoZthneGc4aIgUYAAJxFAAEBAZu9gX8AAKrhAAEBAp7onukAAAABAsAAU7eA44iOiJSUuwO/YAAAAV2q6gFgiLMAAAIEwABTuYDjiOmI8QmFagBgiLMABMAAU7qA44j7iQkYv2EAYMAA+goAAQXAAFPBgOOJDokOiYQAAAADiSuJhAAAAAICAok2AAAAh2FgnEYAiUYAAAS/YWDAAPoKAABgwABTtwE/AwgBwABTuoEAwCb3yQgAwABTuRaJfRaJc4CJacAm976axZyohPSDQgkBiQ6q7gAAAAAEBsAAU7yA44mJiZ6P6QAAhnwBaomKYMAA/RwCAAABA4mvj+kAAAABAQGJvQAAAIPuYIkAAABgiLMBPglOidKJ4AAAv2JgiLMBJonSARyJ8haJ54CJ4sAm+DqFNIkIhE0BAAEuAIi1YIizPReKBC6/YSEWihYuv2HAAFO6wABTuk6KOYpRAAC/Y13AAPx0AWCIswErRYpdAYpmimgAAGJgwAD70AGTARyKb4OKbcAm+KhjAQABFoqLFop2gIpxwCb4OoS6iQRhwAD8owDAAPz9AYuKk8Am+KgcipSDipPAJvioZAEAAZQAwAD89T4CToqpirYAAITkYIizASaKqQEcitUcitEWir2AirjAJvg6hLqJBEsBAAGDitLAJvioAMAA/IOETQEAAS4AiLVgiLNJiukhHIr6hIrtwCb4/0gBAAErAIi3PgI9IxyLJYKLDcAm+JFIAQABKwDAAP0piosNwCb4kRyLTxaLOoCLNcAm+DqEuokEgK0BAAABhVgqwAD8SCsBXcAA/HQBYIizPRyLh4KLcMAm+JGAvwIAAoOLiMAm+KiEi43AJvj/AMAA/IQ/Tou9i9AAAL9kXcAA/HQBYIksAStFi9wBi+WL5wAAYmDAAPvQAZMBHIvuhIvswCb52WMBAAEWjAUWi/WAi/DAJvg6hLuJBWHAAPyjAMAA/P0BjIwNwCb52RyMDoSMDcAm+dlkAQABlADAAPz1PgJOjCOMMAAAhORgiLMBJowjARyMTxaMShyMRhaMN4CMMsAm+DqEu4kFSwEAAYSMR8Am+dkAwAD8g4KQiS+ETQEAAS4AiLVgiLNJjGMhHIx0hYxnwCb6MEgBAAErAIi3PgI9IxyMmoOMh8Am+cJIAQABKwDAAP0pi4yHwCb5whyMsxaMo4CMnsAm+DqEu4kFgK0BAAABhVgqwAD8SCsBXcAA/HQBYIksPRyM5oOM1MAm+cKAvwIAAoSM58Am+dkfjPyJOAIAAhaNHhyNGhaNC4CNBsAm+DqEu4kFSwEAAYSNG8Am+dkAwAD8g4C9iS6FjSTAJvowAADAAPyEPz0XjUUuv2EhFo1XLr9hwABTusAAU7pOjXSNgAAAhnhgiLMBJo10ATUAAAABAGCJGgEWjYeAjYLAJvg6hniJByMcjZSEAMAm+1JIAQABKwAAKxyNlIQAwCb7UoRNAQABLgCJJQFbYIizSY2mIiIiHI24gY2qwCb4TUgBAAErAIi3AByN44KNy8Am+JFIAQABKwDAAP0pAByOCYON9sAm+cJIAQABKwDAAP0pAByOKISOHMAm+0FIAQABKwCItz4BSo5iASs+AUqOggEfjo2JGQYAAjUAAAABAF3AAPx0AWCIswGCjqXAJviRIxyOvYUAwCb7/UgBAAErAAAWjsWAjsDAJvg6hLqJBIUAwCb7/QFdwAD8dAFgiLM1AAAAAQBgiLMBgY7lwCb4TSMcjvOFAMAm/ENIAQABKwAAFo77gI72wCb4OoU0iQiFAMAm/EMBYIizBIS7NQAAAAEAXcAA/HQBYIksAYOPIsAm+cIjHI81hQDAJvyASAEAASsAABaPPYCPOMAm+DqEu4kFhQDAJvyAAV3AAPx0AWCJLIS4Fo9tgI9owCb4OoS4iQKFGRaPpICPn8Am+DqFGYkDhngmj9MBhI/TwCb7QWCJGgbAAFO9gOOP7pADkjwAAIZ2AWqP72DAAP0cAgAAAQOQFZI8AAAAAQEBkCQAAACD7mCI7gAAYIizAT4DTpA/kFAAAL9lXcAA/HQBYIizAStFkFwBkGWQZwAAYmDAAPvQAZMBHJBugpBswCb9SGMBAAEWkIMWkHWAkHDAJv0ehReI8mHAAPyjAMAA/P0BipCLwCb9SByQjIKQi8Am/UhkAQABlADAAPz1PgJOkKGQrgAAhORgiLMBJpChARyQxhyQwhaQtYCQsMAm/R6FF4jySwEAAYKQw8Am/UgAwAD8g4RNAQABLgCItWCIs0mQ2iEckOuDkN7AJv2fSAEAASsAiLc+Aj0jHJEPgZD+wCb9MUgBAAErAMAA/SmJkP7AJv0xHJEmFpEYgJETwCb9HoUXiPKArQEAAAGFWCrAAPxIKwFdwAD8dAFgiLM9HJFXgZFHwCb9MYC/AgACgpFYwCb9SIORXcAm/Z8AwAD8hD9JkX0ckZKBkYHAJv0xSAEAASsAwAD9KT4BSpHYASs+AUqR+AEfkgOI/gIAAhaSFoCSEcAm/R6E4oj0gZIhwCb9MQAGwABTvoDjkkGSVpKxAACe+QFqkkJgwAD9HAIAAAEDkmaSsQAAAAEBAZJzAAAAg+5gqu8AAGCIswFKkoIBIxaSgi6/YcAAU7oWkpMuhWrAAFO5apKkYIjKhHkBYIizBsAAU7+A45OTk6OUuQABgpsAAAABA5OmlLkAAAADAwOTuAAAAIdhYJxGAJPIAAAAv2FgwAD6CgCT4QAAAKn7YIizAABgiLMBPgROk/OT+wAAhy5gwABTtwEflAHAAFPBAgACgJQfwCb/IYGUKsAm/ywATpRDlEoAAIF2WwEclFOClEzAJv85hE0BAAGDlFrAJv9MAIi1QByUhhaUd4OUb8Am/0y/YcAAU7pIAQABgZSJwCb/LADAAP0plG+UlwBKlJ4BJpSeATUAAAABAFsBhJSlwCb/dCMclKyFAMAm/8lIAQABKwAAgpSvwCb/OYUAwCb/yQFbYIizAAAm+BEAJvz1ACb+owAm/wEAJv/6AAAABAACBsAAU7WA44QohDGEqQABqgYAAAABA4RAhKkAAAACAgKESwAAAIdhYJxGAIRfAAAAqftgiLMAAGCIswFKhG4BHoSMwABTvwMAA4CEkMAnADUqgYSiwCcAQAAGwABTtoDjhwqHE4eHAAG/ZgAAAAEDhx+HhwAAAAICAocqAAAAh2FgnEYAhz4AAACp+2CIswAAYIizAUqHTQEeh2vAAFO/AwADgIdvwCcAjimBh4DAJwCZAAGA4wAnAMcAJvddACcAEwAAAAEAJwAVACcAbgAnAMcAAAACAAAAwABTwgCA5AAACYDcAACCLgABAQiEyoZmhm2Gd4ZzhoiFHYaRgacAAJuSAAEBAZr6geoAAJxFAAEBAZu9giMAAJqkAAEBAZVGgmEAAKY4AAEBAZq9gswAAMAAiLUAAQEBvQWDAAAAwABaRAABAQGsPoNFAACq4QABAQOe6an8qfqDjwAAwABTswABAQKqBr9mAAAABALAAFPHgOSJ5InqjEQDvQYAAAFgwAD9HAAAAgTAAFPJgOSKfoqDGIZ+AGCIswAEwABTyoDkiwmLDhiGfwBgiLMAAgXAAFPPgOSLE4sTi2wAAAADiyGLbAAAAAAAAABgwABTxwE/AwgAwABTyWqLOmCq78AA1gkIAMAAU8pqi19gqu/AANYJCQGLE8AA/TIAAAAABcAAU9GA5Itxi3GLmQCAtcAAU8IAA4uBi5kAAAACAgKLhwAABIZ+YIizAIuTAAAEhn9giLMAAGDAAFPHAT8DCAHAAFPJgADAJwIzCAHAAFPKgQDAJwI+CQGLccAA/TIAAAAAAgbAAFPMgOSLnouti9oAAJ6rAAAAAQOLsovaAAAAAAAAAGDAAFPHAUqLuAEfi7zAAFPRAgACFovNLoZ+wABTyRaL1C6Gf8AAU8oABsAAU82A5Ivfi+aMQgAAIwAAAAEDi+6MQgAAAAAAAABgwAD9tgFKi/oBJIxCAx6L/arkAQABFowQLoZ+wABTyQAnv2cejCeq5AEAARaMOi6Gf8AAU8oAAAAnAncAJwLBACcDGAAAAAICwABT0oDkjEeMTbs2N79oAAABYKY5AAFgwACItgABBcAAU+MAAAAABAAAAwAAAAAAAgICAAAAAIdhYJxGAAAAAACHZVsAAGDAAFPSAT8BCQAApj8CAAKAAMAnA12BAMAnA2cADAbAAFPUgMuCfYKHgpQBAprPAAAAAQOClIKUAAAAAAAAAGCDFAAGwABT1YDLgpiCqoKyAQKFagAAAAEDgrKCsgAAAAAAAABgiO4ABsAAU9aAy4K2gsiC0gEChgoAAAABA4LSgtIAAAAAAAAAYIjuAAbAAFPXgMuC1oLogvcBAprOAAAAAQOC94L3AAAAAAAAAGCI7gAGwABT2YDLgvyDAYMyAAKa3wAAAAEDgwyDMgAAAAICAoMWAAAAmt5giLMAgygAAACE1GCIswAAYMAA+goABsAAU9qAy4M3g0WDjgACmwIAAAABA4Ndg44AAAACAgKDcwAAAJqjYIjuAIOIAAAAkixgiO4AAGCI7gAGwABT24DLhL6Ex4usAAC9wwAAAAEDhNyLrAAAAAICAoTmAAAAmqNgiLMAhPYAAACSLGCIswAAYIizAT4RSYX4HoX8wAD1sQIAAoCGBsAnBLqBhg3AJwTFAD4BSoYdAYCGJMAnBLo/SYZoJYZygIZswCcEumCq7z4BSoaKAYGGkcAnBMU/SYaiJYasgYamwCcExWCq7z4BSobEAYCGy8AnBLo/SYcFJYcPgIcJwCcEumCI1j4BSockAYGHK8AnBMU/SYc8JYdGgYdAwCcExWCI1j4BSodbAYCHYsAnBLo/SYezJYe9gIe3wCcEumCIyj4BSofVAYGH3MAnBMU/SYftJYf3gYfxwCcExWCIyj4BSogPAYCIFsAnBLo/SYhwHIh6gIh0wCcEukgBAAEWiH0uhgrAAIi6AIi3PgFKiJEBgYiYwCcExT9JiKkciLOBiK3AJwTFSAEAARaIti6GCsAAiLoAiLc+AUqIygGAiNHAJwS6P0mJFCWJHoCJGMAnBLpgiOJKiS0BFIk0wCcEugABYIjiP0mJPyWJSYGJQ8AnBMVgiOJKiVgBFIlfwCcExQEBYIjiP0mJahyJdICJbsAnBLpIAQABFol3LoVqwACIuQCIt0qJgQGAiYjAJwS6P0mJkxyJnYGJl8AnBMVIAQABFomgLoVqwACIuQCIt0qJqgGBibHAJwTFP0mJ8SIlifuAifXAJwS6YIkAACWKFIGKDsAnBMVgiQA+AUqKLQEcijQuvcTAAIi1AgACFIpQwCcEugABYIkAFIpXwCcExQEBYIkAAMAAiMI/SYrVHIrZLprfAgACgIrlwCcEuoGK7MAnBMUAwACIvT4BSor8AYCLA8AnBLo/SYsVHIsZLprfAgACgYslwCcExYCLLMAnBLoAwACIvT4BSos8AYGLQ8AnBMU/SouPAWqLnGCI4oSIBsAAU9yAy4zTjNyV/wAAqlYAAAABA4zxlf8AAAACAgKM+wAAAJqjYIizAI0LAAAAkixgiLMAAGCIswE+FUmODR6OEcAA9bECAAKAjhvAJwd5gY4iwCcHhAA+AUqOMgGAjjnAJwd5P0mOfSWOh4COgcAnB3lgqu8+AUqOnwGBjqbAJweEP0mOtyWOwYGOu8AnB4Rgqu8+AUqO2QGAjuDAJwd5P0mPHSWPJ4CPIcAnB3lgiNY+AUqPPAEUj0PAJwd5AAFgiNY/SY9UJY9egY9YwCcHhGCI1j4BSo9zARSPesAnB4QBAWCI1j9Jj9Elj9uAj9XAJwd5YIjKPgFKj/MBFI/6wCcHeQABYIjKP0mQCyWQFYGQD8AnB4RgiMo+AUqQLQEUkDTAJweEAQFgiMo/SZCSHJCcgJCWwCcHeUgBAAEWkJ8uhgrAAIi6AIi3PgFKkLMBgJC6wCcHeT9JkMsckNWBkM/AJweESAEAARaQ2C6GCsAAiLoAiLc+AUqQ7AGBkPPAJweEP0mRMSWRO4CRNcAnB3lgiOJKkUoBgZFRwCcHhD9JkVwlkWaBkWDAJweEYIjiSpF1AYCRfMAnB3k/SZGHHJGRgJGLwCcHeUgBAAEWkZQuhWrAAIi5AIi3SpGeAYGRpcAnB4Q/SZGwHJG6gZG0wCcHhEgBAAEWkb0uhWrAAIi5AIi3SpHHAYCRzsAnB3k/SZHaIiWR5ICR3sAnB3lgiTkBJZICgZH8wCcHhGCJOT4BSpIgARySJy69xcAAiLUCAAKAkkjAJwd5gZJPwCcHhADAAIjFP0mS4yIlku2AkufAJwd5YIkAACWTBoGTAMAnB4RgiO4+AT2IkyDAJwd5FpMoLprOwACIuz9Jk0MiJZNNgZNHwCcHhGCJAAAlk2aAk2DAJwd5YIjuPgE9iZOAwCcHhBaTiC6azsAAiLs/SZQJIiWUE4CUDcAnB3lgiO4AJZQtgZQnwCcHhGCI7j4BSpRHARyUTi69xsAAiLUCAAIUlGvAJwd5AAFgiO4UlHLAJweEAQFgiO4AwACIxD9JlIUiJZSPgJSJwCcHeWCJAAAllKiBlKLAJweEYIkAPgFKlMEBHJTILr3HwACItQIAAhSU5MAnB3kAAWCJABSU68AnB4QBAWCJAADAAIjDP0mU/iIllQiAlQLAJwd5YIi+ASWVIIGVGsAnB4RgiL4+AUqVOAFqlUVgiL7AAJIhP0AqlbOVuAEkldoEJ73IgJXEwCcHeSe9yYGV1MAnB4RKleEBapXuYIjKhHkGwABT3oDLmNuY5KQBAAC9xMAAiLUAAAABA5j/pAEAAAACAgKZDQAAAIGmYIkAAJkdAAAAvcpgiQAAAGCIswE+C06aCJoYAAC9y2DAAPvQAR6aIsAAz/ACAWDAAPvQAhaaQhaaLYCaK8AnCzmEuokEYcAA/KMWmmEWmkyBmkrAJwtEhLqJBGHAAPyjAE6acpqHAACEul3AAPx0AWCIswEemo3AAPXLAQFgiLMBgpqcwCcLVwBFmrIBmruavQAAYmDAAPvQAZMBHJrEhJrCwCcLzWMBAAGCmsbAJwtXAMAA/P0BjJrXwCcLzRya2ISa18AnC81kAQABlADAAPz1PgFJmuQcmuqEmujAJwvNYwEAARabAxaa7oCa7MAnCzmEuokEYcAA/KMAwAD8/T4CTpsZmx8AAL3MYIizARybNxabI4CbIcAnCzmEuokESwEAAYSbOMAnC80AwAD8g0mbRBybSoSbSMAnC81jAQABFptjFptOgZtMwCcLRIS6iQRhwAD8owDAAPz9PgJOm3ubgQAAvc1giLMBHJuZFpuFgZuDwCcLRIS6iQRLAQABhJuawCcLzQDAAPyDPRybvIObqMAnC6KAvwIAAoSbvcAnC80cm8IuqlYCAAKFm9jAJwxDhpvfwCcMnwDAAIjAAMAA/IQ+AT0cnBaDnALAJwuigL8CAAKEnBfAJwvNhZwcwCcMQwDAAPyEPgE9HJxYg5xEwCcLooC/AgAChJxZwCcLzRycdBacYIGcXsAnC0SEuokESwEAAYScdcAnC80AwAD8gwDAAPyETp00nUsAAIUZYMAA+9ABHp1VwADP7wIBYMAA+9ACFp1ggJ1ewCcLOYUZiQMWnXqBnXjAJwtEhRmJAwBOnZydqgAAvc5gwAD6CgEcncOEnazAJw1pYwEAAYKdxcAnC1cAwAD8/U6eF54nAACEu13AAPx0AWCJLAExnilgiSwAPgNOnj2ePwAAYmDAAPvQAZNOnk6eUAAAl6BgwAD70AGTQUOeWyk+AUmechyeeIeedsAnDeljAQABFp6MFp58gJ56wCcLOYS7iQVhwAD8owDAAPz9PgFJnqAcnqYUnqTAJw34CABjAQABFp66Fp6qgZ6owCcLRIS7iQVhwAD8owDAAPz9PgROntSe2gAAvc9gwAD9tgEWnvEcnu0Wnt6AntzAJws5hLuJBUsBAAGHnu7AJw3pAMAA/IOAvYkuTp8Hnw0AAL3QYMAA/bYBFp8kHJ8gFp8RgZ8PwCcLRIS7iQVLAQABFJ8hwCcN+AgAAMAA/IOAvYkuTp86n0AAAL3RYMAA+9ABHJ9IFJ9CwCcObQkAgksBAAEUn1LAJw6kCgAAwAD9xkmfZhyfcBSfasAnDt0LAGMBAAGTAMAA/P0+AT0cn5WGn4XAJw3NVgEAARyfqhafm4CfmcAnCzmEu4kFSwEAATUAAAABAGDAAPvQAYefq8AnDek1AAAAAQBgwAD70AGPn6vAJw3pHJ+sFADAJw9KDABkAQABlADAAPz1FADAJw9KDAAAwAD8gwDAAPyFSZ/FHJ/PFJ/JwCcO3QsAgJcBAAGTAMAA/P8+AT0cn/SGn+TAJw3NVgEAARygCRaf+oGf+MAnC0SEu4kFSwEAATUAAAABAGDAAPvQARSgCsAnDfgIADUAAAABAGDAAPvQARWgCsAnDfgIHKALFADAJw/XDABkAQABlADAAPz1FADAJw/XDAAAwAD8gwDAAPyFPgE9HKBEhqA0wCcNzVYBAAEfoEyJOAIAAhSgacAnDm0JAByggi6qVgIAAhagrxygqRagmoCgmMAnCzmEu4kFSwEAATUAAAABAGDAAPvQAYegqsAnDek1AAAAAQBgwAD70AGPoKrAJw3pHKCrFADAJxBqDABkAQABlADAAPz1FADAJxBqDAAAwAD8g4KQiS8WoOIcoNwWoM2BoMvAJwtEhLuJBUsBAAE1AAAAAQBgwAD70AEUoN3AJw34CAA1AAAAAQBgwAD70AEVoN3AJw34CByg3hQAwCcQzgwAZAEAAZQAwAD89RQAwCcQzgwAAMAA/IOCkIkvAMAAiMAAAMAA/IU+Aj0coSiGoRjAJw3NgKUBAAEcoUEWoTGAoS/AJws5hLuJBZYpAQABh6FGwCcN6QDAAPxMAMAA/IZCoVcAPgI9HKGVhqGFwCcNzYClAQABHKGuFqGegaGcwCcLRIS7iQWWKQEAARShs8AnDfgIAADAAPxMAMAA/IZCocIATqHqofMAAL3SYMAA+goBFqIFhqH1wCcNzYOywAD8V0miqSKFoq3AJw2kAIeivsAnEaRKosgBaqLVYIjihIg/TqMeoykAAIU0YIizARyjKy69wwIAAhajQ4CjQcAnCzmFNIkIFqNRgaNPwCcLRIU0iQgAwACIv0qjYgEfo22JGQQAAoOjesAnC6IUo5DAJxHjCAAChLuGo7XAJw3NhRmEo+bAJw1pBsAAU9+Ay6Yfpiiu5AAAvcfAAIi1AAAAAQOmQ67kAAAAAgICplEAAACBpmCJAACmYQAAAL3KYIkAAABgiLMBPglJp+0hHKgKFqfzgKfxwCcSbIUZiQNIAQABFqgPgagNwCcSd4UZiQMAwAD88z4BSqgvARaoRBaoNi6az8AAiLiE9INCP06oW6hyAACFGWDAAPvQARaodoCodMAnEmyFGYkDTqk4qUgAAL3LYMAA+9ABHqlSwADP7wIBYMAA+9ACFqlyFqldgKlbwCcSbIS6iQRhwAD8oxapkRapfIGpesAnEneEuokEYcAA/KMATqmiqbcAAIS6XcAA/HQBYIizAR6pvcAA9csBAWCIswGDqczAJxLrAEWp4gGp66ntAABiYMAA+9ABkwEcqfSFqfLAJxNhYwEAAYOp9sAnEusAwAD8/QGNqgfAJxNhHKoIhaoHwCcTYWQBAAGUAMAA/PU+AT0cqiiEqhTAJxM2gL8CAAKFqinAJxNhHKouLr3DAgACHKplFqpRgKpPwCcSbIS6iQRLAQABhapmwCcTYQDAAPyDHKqAFqpsgapqwCcSd4S6iQRLAQABhaqBwCcTYQDAAPyDAMAAiL8AwAD8hE6qyKrYAACEu13AAPx0AWCJLAExqtpgiSwAPgNOqu6q8AAAYmDAAPvQAZNOqv+rAQAAl6BgwAD70AGTQUOrDCk+AUmrIxyrKYarJ8AnFDFjAQABFqs9FqstgKsrwCcSbIS7iQVhwAD8owDAAPz9PgFJq1Ecq1eHq1XAJxRAYwEAARaraxarW4GrWcAnEneEu4kFYcAA/KMAwAD8/T4ETquFq4sAAL3PYMAA/bYBFquiHKueFquPgKuNwCcSbIS7iQVLAQABhqufwCcUMQDAAPyDgL2JLk6ruKu+AAC90GDAAP22ARar1Ryr0RarwoGrwMAnEneEu4kFSwEAAYer0sAnFEAAwAD8g4C9iS5Oq+ur8QAAvdFgwAD70AEcq/kUq/PAJxSzCACCSwEAARSsA8AnFOoJAADAAP3GSawXHKwhFKwbwCcVIQoAYwEAAZMAwAD8/T4BPY6sNsAnFDEcrDeGrDbAJxQxZAEAAZQAwAD89UmsThysWBSsUsAnFSEKAICXAQABkwDAAPz/PgE9j6xtwCcUQBysboesbcAnFEBkAQABlADAAPz1PgE9HKylhayVwCcUFVYBAAEfrK2JOAIAAhSsysAnFLMIABys4y69wwIAAhatEBytChas+4Cs+cAnEmyEu4kFSwEAATUAAAABAGDAAPvQAYatC8AnFDE1AAAAAQBgwAD70AGOrQvAJxQxHK0MFADAJxYBCwBkAQABlADAAPz1FADAJxYBCwAAwAD8g4KQiS8WrUMcrT0WrS6BrSzAJxJ3hLuJBUsBAAE1AAAAAQBgwAD70AGHrT7AJxRANQAAAAEAYMAA+9ABj60+wCcUQBytPxQAwCcWZQsAZAEAAZQAwAD89RQAwCcWZQsAAMAA/IOCkIkvAMAAiL8AAMAA/IU+AUKteQA+AUKtpwBOrgGuDAAAhTRgiLMBHK4OLqpWAgACFq4mgK4kwCcSbIU0iQgWrjSBrjLAJxJ3hTSJCADAAIjASq5FAR+uUIkZBAAChK5dwCcTNoauc8AnFsgChLuFrpjAJxQVhRmCrsnAJxLOBsAAU+CAy67prvK14AAAvcbAAIi1AAAAAQOvDrXgAAAAAgICryQAAACao2CI7gCvOQAAAJIsYIjuAABgiLMBPgRJszUcszkumt8CAAKAs0XAJxdPgbNMwCcXWgDAAIi9PgFKs1wBgbNjwCcXWj9Js3Qcs3gumt8CAAKBs4TAJxdagLOLwCcXTwDAAIi9PgFKs5sBgLOiwCcXTz9Js7MiIiWzvYCzt8AnF09giO4AJbPfgbPZwCcXWmCI7gAes/vAAPWxAgACFrQLFLQFwCcXTwABYIjuhOKI9Ba0HBS0FsAnF1oBAWCI7oTiiPQAPgZOtD+0RgAAvdNdwAD8dAFgiLMBFrROFLRIwCcXTwABYIjuhReI8k60crR5AAC91F3AAPx0AWCIswEWtIEUtHvAJxdaAQFgiO6FF4jyQBy0rBa0pYK0nsAnGBthwAD8o0gBAAEWtLaDtK/AJxhBYcAA/KMAwAD887SetLwATrTUtNoAAL3VXcAA/HQBYIizAR604MAA9csBAWCIswEWtOyCtOXAJxgbYcAA/KMARbT7AbUEtQYAAGJgwAD70AGTARy1DYW1C8AnGMpjAQABFrUWgrUPwCcYG2HAAPyjAMAA/P0BjbUewCcYyhy1H4W1HsAnGMpkAQABlADAAPz1PgE9HLUyhLUtwCcYl4C/AgAChbUzwCcYyhy1OC6qVgIAAhy1VIK1TsAnGBtLAQABhbVVwCcYygDAAPyDHLVfg7VZwCcYQUsBAAGFtWDAJxjKAMAA/IMAwACIwADAAPyESrVzAR+1foj+AgACFrWSFLWMwCcXTwABYIjuhOKI9IS1ncAnGJcAP0q1rwEctbYumwICAAKAtc/AJxdPgbXWwCcXWgDAAIi+BsAAU+GAy7Xlte7AAEHFAAC9xcAAiLUAAAABA7YOwABBxQAAAAICArYYAAAAmqNgiLMAtigAAACSLGCIswAAYIizAT4DSb4qHL4uLprfAgACgL46wCcZ54G+QcAnGfIAwACIvT4BSr5RAYG+WMAnGfI/Sb5pHL5tLprfAgACgb55wCcZ8oC+gMAnGecAwACIvT4BSr6QAYC+l8AnGec/Sb6oJb6ygL6swCcZ52CJOT4BSr+dARy/pC6qVgIAAhzAAEAIHr/Smr4BAAEyv9pgiUpgiLMBFr/hFL/bwCcZ5wABYIk5gO2JPRa/7C6GCsAAiLoAhX0BAAEWwABAJxbAAEAdFMAAQBfAJxnnAAFgiTmA7Yk9hWmJTwCayYHAAEA5wCcZ8gDAAIjAScAAQEwlwABAVoHAAEBQwCcZ8mCJOT4BSsAAQHQBHMAAQHsuqlYCAAKAwABAnMAnGeccwABA8B7AAEC6mr4BAAEywABAwmCJSmCIswEWwABAyRTAAEDDwCcZ8gEBYIk5gO2JPRbAAEDULoYKwACIugCFfQEAARbAAEEPFsAAQQUUwABA/8AnGfIBAWCJOYDtiT2FaYlPAJrJAMAAiMA+AkAqwABBk8AAQZgASsAAQaEBasAAQa5giMqEeQAAJwOOACcDswAnA9gAJwP9ACcEIgAnBF8AJwSaACcHWQAnCxUAJxJIACcXKwAnGb8AJxujAAAADALAAFPkgOSMR4xNuzYDqgcAAAFgwABT0gAAAAEFwABT+YDkjKWMpY0NAAAAA4y6jQ0AAAACAgKMxQAAAIdhYJxGAIzfAAAAh2Vgm54AAGDAAFPkAT8BCQCM8sAAU+MCAAKAjPjAJxwTgY0DwCccHgAQBsAAU+aA5I0SjRyNRAEAms8AAAABA40qjUQAAAAAAAAAYIMUAUqNLQEWjTcWjS0uh2GbTprPnJUGwABT6IDkjUmNV43iAACbAgAAAAEDjW+N4gAAAAICAo2FAAAAmqNgiO4AjZoAAACSLGCI7gAAYIjuAT4BSo2nARyNuBaNri6HZaY7mwICAAKAjdHAJxylgY3YwCccsACbpwbAAFPpgOSOLY4yjrYAAL3XAAAAAQOOP462AAAAAgICjk8AAACsp2DAAFPHAI5kAAAAhn5giLMAAFwBPgE9F458gI5xwCcdB4Z+HI6ELqpWAgACFo6lgI6awCcdB4Z+wABTyYGOrMAnHRQAwACIwMAAU8kGwABT6oDkjwGPBo+KAAC92AAAAAEDjxOPigAAAAICAo8jAAAArKdgwABTxwCPOAAAAIZ/YIizAABcAT4BPRePUICPRcAnHXqGfxyPWC69wwIAAhaPeYCPbsAnHXqGf8AAU8qBj4DAJx2HAMAAiL/AAFPKBsAAU+uA5I+Pj6SRGwAAhYwBao+QYMAA/RwCAAABA4/BkRsAAAACAgKPywAAAJqjYIizAI/bAAAAkixgiLMAAGCIswE+AkmQkByQmoCQlMAnHfZIAQABFpCdLoV/m1oAiLc+AkmQrhyQuIGQssAnHgFIAQABFpC7LoV/m1oAiLdKkMQBgZDLwCceAT9JkNgckOKBkNzAJx4BSAEAARaQ5S6F35tcAIi3SpDxAYGQ+MAnHgE/P0qRCQEWkRAumsibWwbAAFPsgOSV9ZX6m4UAAKtHAAAAAQOWFJuFAAAABwYGliUAAACsQmCIswCWUwAAAL9pXcAA/HQBYIlKAJZ/AAAAq0VdwAD8dAFgiLMAlqEAAACrRl3AAPx0AWCIswCWvQAAAL9qYIizAJblAAAAq0RdwAD8dAFgiLMAAZcAAAAAhB1gwAD6CgFqlwlgwAD6CgBcAT4FSZcXFpcxgZcbwCceuYFVwAD8Vj4BSpdCAD9OmGOYbAAArJhgwABaRQEemHLAAFpLAgACLoGYj8AnHrkASZisIRyYsS6rDAEAAYSYwMAnHuwAwABT8D4CSZjchpjgwCcfCT4BPYyY88AnHuwcmTofmQvAAFQBAQABFpkiLodhm04AhX0BAAGEmUnAJx7sAJrJPz0cmXSHmWvAJx8+rKUCAAKAmYTAJx6uhJmYwCce7ADAAFpYP0mZtyEcmceCmbvAJx7KSAEAASsAwAD9KT4BRZnYAZnhmeMAAGJgwAD70AGTARyZ6hSZ6MAnH/YIAGMBAAEWmfiCmezAJx7KYcAA/KMAwAD8/QEVmgDAJx/2CByaARSaAMAnH/YIAGQBAAGUAMAA/PU+AT0cmqWHmpzAJx8+rKUCAAIcmsCDmrXAJx7bSwEAARSawcAnH/YIAADAAPyDHJrQgprFwCceyksBAAEUmtHAJx/2CAAAwAD8gwDAAFpYPz0cmukuv2sEAAMcmxSHmwvAJx8+rKYAAAAAwABaV4GbKsAnHrmFm0HAJx73Ab9sHJt5gpttwCceykgBAAErAMAA/SnAAFPuBsAAU+2A5JuKm4+d4AAAv20AAAABA5ueneAAAAABAQGbrQAAAIDtYIlKAABgwAD6CgE+Ak6dNZ07AACFaWCIswEWnUeAnT3AJyD/hWmJT0qdUgEiIiWdX4GdWcAnIRRgiO4AHp17wAD1sQIAAhadixSdhcAnIRQBAWCI7oTiiPQWnaAWnZYuh2GbTprEnKoAACWdzhadwoCduMAnIP+GkolQYIjKBsAAU+6A5KFvoXSrUQAAv2sAAAABA6GMq1EAAAAEAwOhsAAAAIThXcAA/KUCYIlKYMAAU8cAodcAAAC/aV3AAPx0AWCJSgCh/QAAAKtEXcAA/HQBYIizAAGiGAAAAL9sYMAA+goBaqItYMAA+goAXAE+BU6iSqJmAAC/bl3AAPx0AWCIswEjg6JwwCch3SscopuCoo3AJyHLgK0BAAABhVgqwAD8SAFdwAD8dAFgiLNForkBosKixAAAYmDAAPvQAZMBHKLLhaLJwCciOGMBAAEWouOBos3AJyG6YcAA/KMAwAD8/QGNouvAJyI4HKLshaLrwCciOGQBAAGUAMAA/PU+Bk6jBqMQAACe4mCJSgEcoyeBoxLAJyG6SwEAAYWjKMAnIjgAwAD8g06jN6NGAAC/b2CIswEWo1KGo0jAJyKIhWmJT06jaAAAAL9wYIizAEmjgSEco4Yuv20BAAGGo5bAJyKIAMAAU+0+AT0Vo6zAJyLKCBykGh6j2ZrEAgACgaPjwCchuoKj+sAnIcsAhX0BAAGHpCnAJyKvAJrJP06kTaRYAACsp2DAAFPHARykZYCkWsAnIaRLAQABhqRmwCciiADAAPy5SaR4g6R8wCch3T4BPRykqIKkm8AnIcuAvwIAAoWkqcAnIjgcpLouv3HAAFPCAgACFKTZwCcjJAkAFKTlwCciyggAAMAAU/cAwAD8hD4BPRylHYKlEMAnIcuAvwIAAoWlHsAnIjgcpSMuv3LAAFPCAwADHKVmhKVLwCch+EsBAAGFpWfAJyI4AMAA/IMUpWvAJyMkCQAUpXfAJyLKCAAAwABT9gDAAPyESaYFg6YJwCch3T4BSqYmAD9Opn2miAAAv3NdwAD8pQJgiUpgiLMBMqajYIlKYIizAEWmqwGmtKa2AABiYMAA+9ABkwEcpr2GprvAJyQpYwEAARam1YGmv8AnIbphwAD8owDAAPz9AY6m3cAnJCkcpt6Gpt3AJyQpZAEAAZQAwAD89T4ITqb4pwIAAJ7iYIlKARynGYGnBMAnIbpLAQABhqcawCckKQDAAPyDTqcopzMAAKynYMAAU8cBHKdAgKc1wCchpEsBAAGHp0HAJyR5AMAA/LlOp1enZgAAv29giLMBHKe+Hqd/msQCAAKBp4nAJyG6gqegwCchywCFfQEAARan14enzcAnJHmFaYlPAJrJTqfqp/MAAKsVYIizARyoAoKn9cAnIctLAQABhqgDwCckKQDAAPyDTqgSqBoAAIKcYMAA+goBHKgcLr90AgACFKg0wCclBgoAFKg+wCckoAgAAMAAU/RJqFEiFKhVwCclLQsAACEcqGEuv20BAAGHqHHAJyR5AMAAU+0+Ak6o1KjmAAC/cGCIswEUqOjAJyTJCQA9FakAwCclLQscqQoumt8CAAIUqRbAJyUGCgAUqSDAJyWCDAAAwABT7z9JqUMhFKlIwCclLQsAPgA/Saq5Hqq9quMBAAEUqsXAJyUGCgAAPgE9HKrkharawCckBoC/AgACh6rlwCckeRSq8sAnJQYKAADAAPy6PwbAAFPvgOSrVqtnrD4AAJrfAWqrV2DAAP0cAgAAAQOrcqw+AAAAAgICq3wAAACa3mCIswCrjgAAAITUYIizAABgwAD6CgE+A0mrnyWrq4Cro8AnJjdgqu9Kq7sBKT9Jq8wiHKvYgKvQwCcmN0gBAAEtYMAA/NkAiLcAJavtgavjwCcmQmCq70qr/QEpP0qsDgEdrBua3wIAAoCsJ8AnJjeBrDDAJyZCAJuABsAAU/CA5KxDrEitewAAqwwAAAABA6xWrXsAAAABAQGsYAAAAIJTYIizAABgwAD6CgE+AkmsbyWse4Csc8AnJthgiMo+AUqtSgEpP0qtYQEcrXCArWjAJybYSAEAASsAiLcGwABT8YDkrzGvNrEpAACqRQAAAAEDr1uxKQAAAAICAq9tAAAAgmZgg+UAr34AAACFfGCIswAAYMAA+goBPgNJsDocsE8WsEoWsEWAsD7AJyc6gL2DXYC9iIFIAQABJ5gqAMAA/cVKsF8BKj9JsHEhIiWwhIGwd8AnJ0VgiO4AHrCgwAD1sQIAAhawtxSwqsAnJ0UBAWCI7oTiiPQWsMwWsMIuh2GbTprHnJkAPgFKsOABKj9KsPgBHLD/LoWLAQABgLEewCcnOgCbbQbAAFPygOSxLrE/sbQAAJrcAWqxL2DAAP0cAgAAAQOxRLG0AAAAAQEBsU4AAACDpmCIswAAYMAA+goBPgFJsVclsV2AsVvAJygOYKrvPgFKsXUBKT4BSrGVAR2xoprcAQABgLGowCcoDgCbfAbAAFPzgOSys7K8tRQAAL91AAAAAQOyz7UUAAAAAgEBst8AAACsp2DAAFPHAAGy9wAAAL92YMAA+goBarMBYMAA+goAYIizAT4DSbM2HrM6quMBAAEWs02As0LAJyhxhn7AAFPJAEqzVQEWs2eAs1zAJyhxhn7AAFPJP0mzch6zdqrjAQABFrOJgLN+wCcocYZ/wABTygBKs5EBFrOjgLOYwCcocYZ/wABTyj9JtAAhJbQVFrQPgLQEwCcocYZ+wABTyWCq7z4BSrQuASOBtDXAJyh/HrRKwABTtgIAAha0Vy6HYZtOFrRtgLRiwCcocYZ+wABTyQAWtIuAtIDAJyhxhn7AAFPJAWCIsz4BSrSlASOBtKzAJyh/HrTBwABTtQIAAha00S6HYZtOFrTngLTcwCcocYZ/wABTygAWtQWAtPrAJyhxhn/AAFPKAWCIswbAAFP0gOS1ZLVptg4AAL90AAAAAQO1gLYOAAAAAgICtYoAAACCkGCIswC1nwAAAKynYMAAU8cAAGDAAPoKAT4BSrWxASIctbgumt8CAAIWtc+BtcTAJynMhn7AAFPJgLXWwCcpwQDAAFPvABy15y6a3wIAAoC188AnKcEWtgSBtfnAJynMhn/AAFPKAMAAU+8GwABT9oDkthO2HLhHAAC/csAAU8IAAAABA7Y2uEcAAAADAwO2QAAAAL93YIizALZvAAAArKdgwABTxwC2hAAAAL9wYIizAABgiLMBPgNJtysety+q4wEAAYC3N8AnKlYAPgFKt1oBgLdhwCcqVj9Jt4YhHLecgreKwCcqbkgBAAErAIi3PgI9ibetwCcqYRy3xYG3usAnKmGeqwAAAADAAFPMPRy31C692AIAAoG34sAnKmGCt+7AJypuAMAAU+o/SrgNARy4FC6/dQIAAYG4KMAnKmEBv3YpwABT8wbAAFP3gOS4TLhVuzQAAL9xwABTwgAAAAEDuHO7NAAAAAICAriKAAAArKdgwABTxwC4nwAAAL9wYIizAABgiLMBPgROuMG4wwAAg6ZgiLMBHLjFLr91AQABgLjZwCcrMwDAAFPzSbjqIR6476rjAQABgrj3wCcrUwA+AUq5AwGCuQrAJytTP0m6dCEcuoqBunjAJytASAEAASsAiLc+Az2IupvAJyszHLqzgLqowCcrM56rAAAAAMAAU8w9HLrCLr3YAgACgLrQwCcrM4G63MAnK0AAwABT6kq69gEcuv0uv3UBAAGAuxHAJyszAMAAU/M/SrsoAYK7L8AnK1MAACccTQAnHIUAJxznACcdWgAnHc0AJx6OACcg3wAnIYQAJyYOACcmuAAnJxoAJyflACcoUQAnKaEAJyoyACcrDwAnLAwAAAAQAsAAU/qA5Ls5uz+8dAOsQAAAAWCaugAAAQTAAFP9gOS7f7uJCb94wABTwgBgnEYAAQXAAFQBgOS7jruOu7UAAAADu6S7tQAAAAEBAbuqAAAEv3hgnEYAAGDAAFP6AT8CCAHAAFP9gADAJyyhCQG7jprMAAAAAAEGwABT/4Dku7q7z7xyAACahAFqu7tgwAD9HAIAAAEDu9y8cgAAAAICArvrAAAAgO1giUoAu/sAAACahWDAAPoKAABgiLMBPgFKvA0BI4G8FMAnLQAWvD4WvDQWvCkuv3jAAFPCwABT/ZrFnKiE9INCFrxnFrxbFrxQLr94wABTwsAAU/2axJyqhPSDQgFgiO4AACcszAAnLVwAAAABAAMGwABTxIDkhBqEJ4cUAAG/eQAAAAEDhDuHFAAAAAMDA4ROAAAAgpBgiQAAhHUAAACeqF3AAPylAmCJSmCIswCEngAAAL96XcAA/HQBYIlKAABgiQABPgJOhLmExgAAhORgmroBHoTVmr4BAAGBhN3AJy2WAEqE8QEfhPyJGQYAAhyFSxyFKhaFFYCFEMAnLYuEuokEgKsBAWCIswEWhTuDhS7AJy3DhX2ayQDAAPw9gK0AAAAAwAD8SByFaIOFW8AnLcOFfQEAARaFfICFd8AnLYuFNIkIAJrJBIS7HIYtHIXAFoWlgIWgwCcti4S7iQWAqwEBYIksATSFxAOFxIYgAAAAAQEBhcUAAACFV2CJLAAAYIksAUqFzwEfhdOJOAIAAhaF8oSF7MAnLnGAvYkuHIYFg4X4wCctw4V9AQABFoYahIYUwCcucYKQiS8AmskAAMAA/D2ArQAAAADAAPxIhLiChk3AJy2qhRkWhoOAhn7AJy2LhRmJA4Z4JobRASMchr8WhrOAhq7AJy2LhniJB0gBAAErAIkoKxyG8YOG5MAnLcOFfQEAARaHBYCHAMAnLYuGeIkHAJrJAWCIs2CJGgbAAFPFgOSHroe3iD0AAaw/AAAAAQOHzIg9AAAAAgICh9oAAACFNWCJAACH7wAAAIC9YMAA/bYAAGCIswE+AUqH+QE1AAAAAQBgiLMBHIgNgIgAwCcvTIZ9AQABgYgfwCcvVwCJFSMciCWCAMAnL3BIAQABKwAAaoguYIjKhHmCAMAnL3ABYIizBsAAU8aA5IjIiNGJpgABqggAAAABA4jriaYAAAACAgKI+QAAAIU1YIkAAIkLAAAAYmDAAPvQAABgiLMBPgFJiRIciRiBiRbAJy/gYwEAARaJPBaJJ4CJGsAnL9WEuokEYcAA/KMAwAD8/T4BSolKARyJchaJXoCJUcAnL9WEuokESwEAAYGJc8AnL+AAwAD8gz4BSomGAWqJk2CIyoR5AYDkACcwVAAnAYEAJwMpACcb3AAnLFUAJy1pAAAABAAnLWsAJy8sACcvtQAnMFQAAAADAAAAwABUAr97gOUAAAOA+QAAgi4AAQEBhWWBLAAAnRIAAQECnKucwIFhAACRvQABAQGCEwAAAAUCwABUB4DlgYSBioO5A6uWAAABYMAA/RwAAAIEwABUCYDlgaaBqgmAvQBgwAD9tgAEwABUCoDlgbiBwgmHTgBgwAD70AACBcAAVBSA5YHHgceCIQAAAAOB0YIhAAAAAQEBgdgAAACSTmCeqwAAYMAAVAcBPwMIAMAAVAkWgfSAge7AJzEggl6exQgAwABUChaCF4CCEcAnMSCHTp60CQGBx8AA/TIAAAAABcAAVBaA5YImgiaCTgCAtcAAVAIAA4Iygk4AAAACAgKCOAAABIC9YMAA/bYAgkMAAASHTmDAAPvQAABgwABUBwE/AwgBwABUCYAAwCcxiAgBwABUCoEAwCcxlQkBgibAAP0yAAAAAAUGwABUDIDlglOCW4KtBAG/fAAAAAEDgnOCrQAAAAEBAYJ6AAAAkk5gnqsAAGDAAFQHAT4BSoKHAR+CksAAVCMBAAGAgqPAJzHwAAbAAFQOgOWCsoLBgtQBAIUBAAAAAQOCzYLUAAAAAAAAAGCEqQFKgtABKwbAAFQPgOWC2YLhgwoBAK6LAAAAAQOC74MKAAAAAAAAAGDAAPvQAUqC8gEcgv0WgvIuh07AAFQKZAEAARaDBBaC/y6AvcAAVAlhwAD9ugDAAPz1BsAAVBGA5YMPgx2DfgAAoa8AAAABA4Mqg34AAAABAQGDMgAAAKGuYMAA/RwAAGDAAFQsAT4BSoNDAR+DTsAAVDUDAAOAg17AJzK3FoNpLoC9wABUCRaDby6HTsAAVAoABsAAVBKA5YODg5aDtwAAIwFqg4RgwAD9HAIAAAEDg56DtwAAAAAAAABgwAD9tgFKg6QBJIO3Aye/fRaDsS6AvcAAVAkngyEAACcx0AAnMhoAJzJEACcylwAnMvcAJzM+AAAABQLAAFQXgOWDvIPChbUDv34AAAFgwAD9HAABYMAAVAcBBMAAVBmA5YP5g/4Jkk4AYJ6rAAEFwABUI4DlhAOEA4QfAAAAA4QThB8AAAABAQGEGQAABJJOYJ6rAABgwABUFwE/AggBwABUGYAAwCczqgkBhAPAAP0yAAAAAAYGwABUG4DlhCSEO4RPAQCAvQFqhCVgwAD9HAIAAAEDhECETwAAAAAAAABgwAD9tgFKhEMBFoRJFoRDLpJOwABUGYJensUGwABUHIDlhFSEaISGAQCHTgFqhFVgwAD9HAIAAAEDhHOEhgAAAAAAAABgwAD70AFKhHYBFoR8FoR2LpJOwABUGYdOnrQGwABUHYDlhIuEpoS5AQCFAQFqhIxgwAD9HAIAAAEDhLKEuQAAAAAAAABghKkBSoS1ASsGwABUHoDlhL6E0oT7AQCuiwFqhL9gwAD9HAIAAAEDhOCE+wAAAAAAAABgwAD70AFKhOMBHITuFoTjLodOwABUHGQBAAEWhPUWhPAugL3AAFQbYcAA/boAwAD89QbAAFQggOWFAIUahXQAAKGvAWqFAWDAAP0cAgAAAQOFJ4V0AAAAAQEBhS8AAAChrmDAAP0cAABgwABULAE+AUqFQAEfhUvAAFQ9AgACgIVfwCc1GRaFai6STsAAVBkABsAAVCGA5YV5hYyFswAAIwFqhXpgwAD9HAIAAAEDhZSFswAAAAAAAABgwAD9tgFKhZoBJIWzAye/fxaFrS6AvcAAVBsngyEAACcz1wAnNBwAJzRhACc0lAAnNPAAJzVPACc1lgAAAAYCwABUJIDlhbiFvodVA6HrAAABYMAAVBcAAAEEwABUJoDlhg6GGQmFAQFqhfJgwAD9HAJghKkAAQXAAFQrgOWGHoYehoIAAAADhjOGggAAAAICAoZFAAAAnY1gwABUFwCGVgAABIUBYISpAABgwABUJAE/AggBwABUJoEAwCc2FwkAhmvAAFQjAQABFoZ8gIZxwCc2CpJOwABUGQACBsAAVCiA5YaHhqGHAAAAoa8BaoaIYMAA/RwCAAABA4auhwAAAAABAQGGtgAAAKGuYMAA/RwAAGDAAFQsAT4BSobHASaGxwEehs6dGAMAAyehrxaG6y6HTsAAVBwrAGDAAFQsBsAAVCmA5YcFhxiHUwAAIwFqhwZgwAD9HAIAAAEDhyCHUwAAAAAAAABgwAD9tgFKhyYBJIdTBSe/gBaHPy6AvcAAVBsngYsWh0YuhQHAAFQmJ4MhAAAnNlQAJza3ACc3CwAAAAICwABULIDlh1iHXokFA6uXAAABYMAAVAcAAAEEwABULoDlh5CHmQmhrgBgwAD9HAACBcAAVDOA5Yeeh56H2QAAAAOHq4fZAAAAAgICh7EAAAShrmDAAP0cAIfCAAAAn6RgnqsAAGDAAFQsAT8CCAHAAFQugADAJzdoCQCHzMAAVBQBAAGBh9LAJzd1AAXAAFQ1gOWH3ofeiDwAgLXAAFQCAAOH7Yg8AAAAAwMDh/MAAAShrmDAAP0cAIgFAAAAgL1gwAD9tgCIDwAAAIdOYMAA+9AAAGDAAFQsAT8CCAHAAFQugADAJzfICQCIKcAAVBYCAAKBiCvAJzfVgogxwCc34gACBsAAVDCA5YhBiFuIugAAoa8BaohCYMAA/RwCAAABA4hoiLoAAAABAQGIcAAAAKGuYMAA/RwAAGDAAFQsAT4BSoiBASaIgQEeiIidGAMAAyehrxaIpS6HTsAAVAorAGDAAFQsBsAAVDGA5Yi/iNKJAwAAIwFqiMBgwAD9HAIAAAEDiNqJAwAAAAAAAABgwAD9tgFKiOABJIkDBSe/gRaI8S6hrsAAVC4ngYsWiP0ugL3AAFQJJ4MhAAAnOB8AJziCACc41gAAAAICwABUNoDliQiJDorgA7+CAAABYMAAVBcAAWDAAFQsAQTAAFQ4gOWJcYl6CaGuAWqJWWDAAP0cAmDAAP0cAAEFwABUPYDliX+Jf4oRAAAAA4mSihEAAAACAgKJmAAABKGuYMAA/RwAiakAAACfpGCeqwAAYMAAVDYBPwMIAcAAVDiAAMAnOUEMAEAiISWJyoCJwMAnOUFgwABUBwElieaAidzAJzlBYMAAVBeJwIn5AAkAigTAAFQjAQABgYoKwCc5TgACBsAAVDqA5YoWijCKjwAAoa8BaooXYMAA/RwCAAABA4o9io8AAAABAQGKRQAAAKGuYMAA/RwAAGDAAFQsAT4BSopWASaKVgEeil2dGAMAAyehrxaKei6HTsAAVBwrAGDAAFQsBsAAVDuA5YqUiqeK3gAAIwFqipVgwAD9HAIAAAEDiq+K3gAAAAAAAABgwAD9tgFKirUBJIreBSe/gxaKzC6hrsAAVDgngYsWitgugL3AAFQbJ4MhAAAnOasAJzoOACc6YgAAAAIAAwbAAFQEgOWK44rojQsAAb+EAAAAAQOK/o0LAAAABAQEixIAAACAvWDAAFQsAIslAAAAgotgwAD+AACLMQAAAIdOYMAA+9AAi0EAAACEYWDAAP43AABcAT4ETotbi2UAAaGuYMAA/RwBFotsgItnwCc6laGuwABULkmLeSWLh4SLfcAnOs9gwABULD4BPR6Ln8AAVAQEAAQUi7bAJzrPBAFgwABULIGLwcAnOqKCi8nAJzqvg4vVwCc6vABJi+gli/aEi+zAJzrPYMAAVAc+AT0cjBKBjAvAJzqigooBAAEWjCIUjBjAJzrPBAFgwABUB4C9wABUCQDAAP4USYwyJYxAhIw2wCc6z2DAAP22PgE9HIxYgYxRwCc6ooKKAQABFIxewCc6zwQBYMAA/bYAwAD+FD4BPR6MeZ0WBAAEJIydARaMkISMhsAnOs+FgMAA/TAnv4SCjLnAJzqvg4zNwCc6vAA9HIzkgYzdwCc6ooKKAQABJ4FqAMAA/hQ9HIz5gYzywCc6ooKKAQABFo0EgIz/wCc6lYC9wABUCQDAAP4UBsAAVAWA5Y0OjRWOuAABq5kAAAABA40gjrgAAAADAwONKAAAAIC9YMAA/RwAjTIAAACHTmDAAPvQAI1CAAAAhGFgwAD+NwAAYMAA/bYBPgFJjU8ljViAjVPAJzw1YMAA/bY+AUqNaQEUjXDAJzw1AAFgwAD9tkmNfyWNiICNg8AnPDVgwABULD4DTo2tjbQAAIKLYMAA/gABH426wAD+HwAAAAA9Ho3OwABUBAQABBSN5cAnPDUAAWDAAFQsg43rwCc8oIGN88AnPEKCjf/AJzxPAEqODQEkjh0Bg44WwCc8oEmOKCWOMYCOLMAnPDVgwABUBz4BSo5GARaOUhSOTcAnPDUAAWDAAFQHgL3AAFQJPgFKjmcBJo5nAR6Obp0WBAAEJI6NARaOgICOe8AnPDWFgMAA/TAnq5mBjp7AJzxCgo6qwCc8TwBgwAD9tgbAAFQGgOWOu47Bj0QAAauYAAAAAQOO2I9EAAAAAQEBjuQAAACdjWDAAFQHAABgnqsBPgJOjwWPFQAAv4VgwABUFwEmjwUBgI8XwCc9g2DAAFQXSo8lATUAAAABAGDAAFQXAYGPLMAnPZgjHI89ggDAJz27SAEAASsAACsWjz2CAMAnPbuSTsAAVBkBYJ6rAYDlACc98gAnML8AJzNbACc1twAnNxwAJzjnACc6cwAAAAUAJzp1ACc8FQAnPWMAJz3yAAAAAwAAAMAAVD6/hoDmAAACgP8AAIIuAAEBAYZmgTAAAK3nAAEBA55cnl2eXgAAAAECwABUP4DmgYGBkIN/B6uaAAABYMAAVosAAAEEwABUQYDmgdWB2QmCkABgiLMAAQXAAFRIgOaB3oHegnkAAAADgfCCeQAAAAQEBIH/AAAAgL1gwAD9tgCCCgAABIKQYIizAIIfAAAAvhNgwABVpgCCNAAAAIdOYMAA+9AAAGDAAFQ/AT8CCAHAAFRBgQDAJz6uCQCCSMAAVpkFAAUrk4CCV8AnPqGCgl3AJz65g4JuwCc+xgADBsAAVEOA5oJ+goeC0wAAv4cAAAABA4KQgtMAAAACAgKCoAAAAIRDYMAAVaYAgrsAAABbXcAA/HQBYMAAVnUAAGCIswFKgs8BFoLPLoKQwABUQQbAAFREgOaC2ILhg0wAAL+IAAAAAQOC/YNMAAAAAgICgxQAAACEQ2DAAFWmAIMsAAAAW13AAPx0AWCIswAAYIizAT4BSoM9ARaDRC6CkMAAVEEGwABURoDmg1GDXIN9AQCjswAAAAEDg2aDfQAAAAAAAABgwAD9tgFKg2kBJ6uaAAAnPwwAJz9eACc/sAAnP94AAAADAAABgOYAJz/1ACc+VwAnP/MAAAABACc/9QAAAAAAAADAAFRJv4mA5wAAFID4AACCLgABARqFl4XVhMqFEIZmhm2FZYUAhU2Gc4ZqhfCE94WehlSFHYU2hRaGOIWThpWF6oaRhoqGSoZvg1IAAIIuAAEBAoZ3hoqDmgAAm5IAAQEBmvqD3QAAp8QAAQEBqA+EGAAAnEUAAQEBm72EUQAAwABaDgABAQOt2a3ardyEyQAAmqQAAQEClUaadoUTAACapL+KAQEBmrOFawAAm0kAAQEBmr+FsAAAqEEAAQEBnlGF8wAArecAAQEKqDueVp5cqBGoPafSqDSeXZ5eqBqHDAAAjBwAAQEjgiWHy4zZjSSQOpA+kEKQRofQixeMz4z8jQGNJY0rjTeNRI1JjVONV42ujdePEI9Dj8iPzI/Rj9aP2o/fj+SP6ZBxkHuRd40vAACnZwABAQ6oO55WqDyeWae1nlqeXKgRqD2eW6uep9KeXagajtAAAJHYAAEBApVYlUiPPgAAn70AAQEBlQCPeAAAwACI4gABAQG9CI+jAACuVgABAQGr5Y/SAACdEgABAQSU7Zy9nKuDX5AtAACoWAABAQGeUpBcAACq4QABAQGe6QAAAAICwABUSoDnkJuQqsABDu4HnkMAAAFgwABWiwAACgTAAFRMgOeRQpFPGKJaAF3AAPx0AWDAAFabAATAAFRNgOeSAJIJGITUAGDAAFZ1AATAAFROgOeSa5J1GJ5yAF3AAPx0AWDAAFZ1AATAAFRPgOeS1ZLcGKhCAF3AAPx0AWDAAFZ1AATAAFRQgOeS7ZLyCZ7CAGCoYwAEwABUUYDnkwOTDwmE1wBgqGMABMAAVFKA55MnkzMJol4AYKiLAATAAFRTgOeTS5NiCahIAGCoiwAEwABUVIDnk4uTohi/iwBdwAD8pQJgwAD9tmDAAFSXASsEwABUVYDnk7STwBit3gBgwABUSgErAQXAAFSWgOeTxZPFlYgAAAADk9GViAAAAAsLC5PvAAAAhtVdwAD8dAFgwABV/ACUAwAAAKHtYMAA+9AAlBsAAACAvWDAAP22AJQsAAAEolpdwAD8dAFgwABWmwCURgAABITUYMAAVnUAlFwAAASecl3AAPx0AWDAAFZ1AJRzAAAEqEJdwAD8dAFgwABWdQCUhwAABJ7CYKhjAJSZAAAEhNdgqGMAlLwAAACEUmDAAFWmAJTOAAAAh05gwAD70AAAYMAAVEoBPwkIAcAAVEyDAMAnQxgIAcAAVE2EAMAnQysIAcAAVE6FAMAnQzgIAcAAVE+GAMAnQ0sIAcAAVFCHAMAnQ14IAcAAVFEUAMAnQ2kIAAgAwABUUh+U9aiTAQABh5UCwCdDXgAIAMAAVFMflTCokwEAARSVPcAnQ2kIAAAJAJVUwABWmQUABYCVWsAnQuuBlWTAJ0L+gpVvwCdDCxSVdcAnQ3QJABSVfcAnQ4EKAAA7BsAAVFeA55WNlZiVswEAo7MAAAABA5WilbMAAAAAAAAAYMAA/bYBSpWlASeeQwbAAFRYgOeWFJYdlkYBAITpAAAAAQOWMJZGAAAAAAAAAGDAAPoKAUqWMwEhHJY/FpYzLoTVwABUWkgBAAErAMAA/SkGwABUWYDnlkuWYJa8AQCt/gFqlkxgwAD9HAIAAAEDlniWvAAAAAAAAABgwAD6CgE+AUqWfgEiFpaFLoTpwABUWAAYlqGt/sAAViIGwABUWoDnlsGW0ZbcAQKE1QAAAAEDltyW3AAAAAAAAABgwABWdQAGwABUZIDnluGW6pcIAgKE1QAAAAEDlvWXCAAAAAEBAZcCAAAAhOhgwABWdQAAXAAGwABUW4Dnlw2XM5dQAQCoQQAAAAEDl0mXUAAAAAAAAABdwAD8dAFgwABUngFKl0wBKwbAAFRcgOeXVZdol8YBAIRDAAAAAQOXcJfGAAAAAAAAAGDAAFWmAT4CTpeFl40AAIRDYMAAVaYBJpeFARaXjy6EUsAAVpBgwABVpkqXmwE1AAAAAQBgwABVpgEWl6qAl6LAJ0WyqHLAAFWtIxyXuIEAwCdF2EgBAAErAACAl7vAJ0WygQDAJ0XYAWDAAFWmBsAAVGaA55fLl9CZSwAAnowAAAABA5fnmUsAAAABAQGX9wAAAIRDYMAAVaYAAFwBPgRPmAaYCwAAAaKGYQJgwAD9tmDAAFStXAADmBCYmAAAAAICApgYAAAAv4xgwAD9tgCYLAAAAJ6aYMAAVK0AAFwBPgJOmE+YVgAAgmZgwABV6QEmmE8Bg5hYwCdGeWDAAFXpPRyYcoSYa8AnRoyejAEAAYCYisAnRjcAwABV9j0emLXAAFFtBQAFIxaYzy6eb8AAVMAWmOAWmNkunkzAAFRggkXAAFReFpjpLpnCwABUXQFggxQWmO4uhtXAAFaNJpj4AYCY+MAnRjdgtJ8uKwA9HJkfFpkSLoTXwABUUYP4AQABgZknwCdGTACofz0cmTkWmTMunsLAAFRQg/gBAAGBmUHAJ0ZMAKh/BsAAVGeA55ntmfKb9gAAo4sAAAABA5oIm/YAAAACAgKaEAAAAINEYMAA/bYAmh8AAACCRWDAAP22AABgwAD6CgE+BU6aRJpNAAC/jWDAAFSXAR+aU8AAVJwBAAGBmmrAJ0d/AD0jHJqPFpp3Lr+LwABUVEgBAAErAMAA/SkXmncuv4symrNgwAD9tmDAAFSXAMAAVFQrAV3AAPylAmDAAP22YMAAVJc9HJrSFpq7Lr+LwABUVIC/AgACgJrTwCdHcoKa3cAnR5YAwAD8ukOa6yEcmvuCmvLAJ0eWSAEAASsAwAD9KT4DSZsMFpsZgpsQwCdHlr+OwABUmkqbKAEqP0mbPBybUBabSYKbQMAnR5aCRcAAVJlIAQABgJtTwCdHcgDAAP3FPgI9F5tugptlwCdHlr+OKcAAVJpKm4wBKT89ipunwCdHlhybyRabsi6/i8AAVFRLAQABFpvTgpvKwCdHloJFwABUmQDAAPy5SpvmASoGwABUaIDnm/ucC63QAACegAFqm/xgwAD9HAIAAAEDnB6t0AAAAAEBAZwuAAAIhENgwABVpgAAYMAA+9ABPgVJnD0cnFcWnEEuqEHAAFRbSAEAASsAwAD9KUqcYAGTP0acbpytnI8AAACXt2DAAFSeABacli6oQcAAVFs+AT0cnLmBnLXAJ0kpo34CAAIWnMMunsLAAFRQgJzKwCdI7gDAAFSpTpzinOgAAIDuYMAA+9ABFp0AFpzqLqhBwABUW2HAAPyjSZ0MIRydFoGdEMAnSWlIAQABkwDAAPzzPgNOnT+dTAAAhNddwAD8pQJgwAD9tmDAAFXpASadPwEWnWAWnVMuhNfAAFRRnsOoW13AAPylAmDAAP22YMAAVelOnbWduwAAhLFdwAD8dAFgwAD9tgEcnc8WncqCnb3AJ0mkg2LAAPzHgK0AAAAAwAD8SEad3536nesAAACAvWDAAP22AIOd88AnSeM+Ak6eEJ4cAACemmDAAFStARyeKoKeHsAnSaRLAQABhJ4rwCdKGQDAAPy5RJ46PgNJnkkhHJ5gFp5ZhZ5NwCdKMIRSwABUsUgBAAEuAMAA/Sk+AT0ennedFwQABCSejAEWnoQuhGHAAFYZJJ6tARaepBaenYWekcAnSjCEUsAAVLGEYcAAVLIWnq8uh07AAFYYFp7LLoRhwABWGQA/SZ7rJZ77hZ7vwCdKMGDAAFV5PgJOn4+foQAAoTJgwABUngEWn78Un7PAJ0owBQFgwABVeaEywABVe0mf3iEcn/SGn+LAJ0rfSAEAASsAwAD9KT4DTqAZoCcAAL+PYMAAVK0BFqA7hqApwCdK34JFwABUpUmgURygZhagYRSgVcAnSjAFAWDAAFV5g7DAAFSvSAEAASsAwAD9KT4BPRyhsy6/kAIAAhShzcAnSjAFAWDAAFV5JqHaAYCh2sAnSO5gtJ8AwABUdz9JogIlohSHogbAJ0sfYMAAVRs+A06iSaJXAACFF13AAPx0AWCIswEWomUUolnAJ0owBQFgwABVeYUXwABVfEmihByilhSiiMAnS6cIAEgBAAErAMAA/Sk+AT0Vo4fAJ0unCB6jm8AA/HkDAWCIswImo/sBFqP7FqPsFqPdFqPWFKPIwCdLHwcBYMAAVRuCRcAAVLSE+QCEuABhAGDAAPvQaqQfYIjKhHkBhVgpPz0cpIMUpHfAJ0owBQFgwABVeb+RAgACJqTAARakwBSkssAnSx8HAWDAAFUbgkXAAFS0YINZFKTIwCdLpwgAAMAAVYBJpO0lpP+HpPHAJ0sfYKhEPgNOpTalRAAAhRddwAD8dAFgiLMBFqVSFKVGwCdKMAUBYMAAVXmFF8AAVXxJpXEcpYMUpXXAJ0yVCABIAQABKwDAAP0pPgE9FaZ0wCdMlQgepojAAPx5AwFgiLMCFqboFqbZFqbKFqbDFKa1wCdLHwcBYKhEgkWoSoT5g2GEuIMjYcAA/KNqpwxgiMqEeQGFWCk/PRyncBSnZMAnSjAFAWDAAFV5v5ECAAIWp60Up5/AJ0sfBwFgqESCZqhHFKe1wCdMlQgAAMAAVYBJp9olp+yHp97AJ0sfYKixPgNOqBuoIwAAImCRSQEcqFtqqCVdkWABYQFgwAD9tmCRSad+iAUBAAEWqHuGqGnAJ0rfoVDAAFSnAJFkSaifFqivFKijwCdKMAUBYMAAVXmEHcAAVh0+AT0cqMwunmoDAAMUqNfAJ01wCAAWqOwUqODAJ0owBQFgwABVeYdOwABWGGqo+GDAAPvQFQDAAFRtPgE9HKkuLp5qAwADFKk5wCdNcAgAFqlOFKlCwCdKMAUBYMAAVXmHTsAAVhhqqVpgwAD70BUAwABUbT0XqicUqhvAJ0owBQFgwABVeYJpH6oyke0BAAEWqnuGqmnAJ0rfoVDAAFSnAMAAVUE+A06qvqrGAAAiYJFJARyq/2qqyF2RYAFhAWDAAP22YJFJwAB1x4gFAQABFqsfhqsNwCdK36FQwABUpwCRZEmrQxarUxSrR8AnSjAFAWDAAFV5hB3AAFYdPgE9HKtwLp5qAwADFKt7wCdOawgAFquQFKuEwCdKMAUBYMAAVXmHTsAAVhhqq5xgwAD70BUAwABUbT4BPRyr0i6eagMAAxSr3cAnTmsIABar8hSr5sAnSjAFAWDAAFV5h07AAFYYaqv+YMAA+9AVAMAAVG09F6zLFKy/wCdKMAUBYMAAVXmCaR+s1pHtAQABFq0fhq0NwCdK36FQwABUpwDAAFVBPz89ja1nwCdKMBatgYWtdcAnSjCDsMAAVK8hHK2kha2YwCdKMEgBAAErAMAA/Sk/Sq3AAYGtx8AnSWkGwABUaYDnrgmuFbCIAAChowAAAAEDriawiAAAAAUEBK41AAAAgL1gwAD9tgCuPwAAAIdOYMAA+9AArk8AAACEYWDAAP43AK5nAAAAv5JgwABVpgABroUAAACFL2DAAPoKAWquj2DAAPoKAGDAAFStAT4ESa6dIiEcrrkWrrKDrqHAJ0/nnkzAAFS1SAEAARauxBauvC6EQ8AAVFyeTMAAVLUAwAD9KQAcrtOArs7AJ0/AgdYBAAEngLUAwAD9yD4BSq7sASs/Tq8PrxsAAJ6aYMAAVK0BI4SvHcAnT/UcrzYWrzAunsLAAFRQoaoEAAOAr0PAJ0/Aga9JwCdPzYKvVcAnT9oBqCwqqHccr4YWr4AunsLAAFRQlvYEAAOAr43AJ0/Aga+TwCdPzYKvn8AnT9oBqCwqqHYBYMAAVK1Jr8UiHK/Vha/JwCdQaEgBAAErAMAA/SkAFq/gLp5vwABUwD4BSq/xARyv/xav+C6eTMAAVGChowUABICwHMAnT8CBsCLAJ0/NgrAuwCdP2oOwN8AnT+cBhS+EsF3AJ0/1wABUaT9KsHIBhbB5wCdQaAbAAFRqgOewjbCZsl4AAKLeAAAAAQOwsbJeAAAABAQEsMAAAACAvWDAAP22ALDKAAAAh05gwAD70ACw2gAAAICsYMAA/jcAsO4AAAC/kmDAAFWmAABgwABUrQE+BEmxBiIhHLEiFrEbg7EKwCdRlp5MwABUtUgBAAEWsS0WsSUuhEPAAFRcnkzAAFS1AMAA/SkAHLE8gLE3wCdRb4HWAQABJ4C1AMAA/cg+AUqxVQErP06xeLGEAACemmDAAFStARyxkxaxhi6E18AAVFGW9gMAA4CxmsAnUW+BsaDAJ1F8grGswCdRiQCodkmxtiIcscaEsbrAJ1IBSAEAASsAwAD9KQAWsdEunm/AAFTAPgFKseIBHLHwFrHpLp5MwABUYKLeBAAEgLIUwCdRb4GyGsAnUXyCsibAJ1GJg7IrwCdRlgDAAFRqP0qySAGEsk/AJ1IBBsAAVGuA57JjsmiytAAAg/gAAAABA7JvsrQAAAABAQGydQAAAIGmYQJgwAD9tmDAAFStXAAAXAE+AT0csqYWsqAunsLAAFRQg/gBAAGAsq7AJ1LBAKh/BsAAVGyA57MiszC0EwAAnnUAAAABA7M+tBMAAAABAQGzRgAAAIC9YMAA/bYAAGDAAFXpAT4BSrNSASazUgE1AAAAAQBgwABUrQEcs2QWs18Ws1kunsLAAFRQnsOoW0sBAAGAs2XAJ1MYAMAA/LkjHLNrgQDAJ1M3SAEAASsAAB6zdp0UAwADHLO1arOTXZFgAWECYMAA/bZgwAD9tmCRScAATxuIBQIAAoCz1MAnUxgWs9ouoVDAAFRiAJFkHLP6lIHEAAAAAMAA+/MrAIEAwCdTNwFbYMAAVekGwABUbYDntBi0HbUHAACeagAAAAEDtCe1BwAAAAUDA7QwAAAAImCRSQC0PQAAAIdOYMAA+9AAtE0AAABhYMAA+9AAArRhAAAAnxNgwAD6CgFqtG1gwAD6CgC0iQAAAIJTXcAA/HQBYJFnAWoAYMAA/Nl3XAE+AT0ctKEWtJkuhEPAAFRcnmoGAASAtKzAJ1PygbS1wCdT/IK0wcAnVAkWtMkuhGHAAFYZAp8Tg7TmwCdUFoJThLT7wCdULMAAVb4GwABUboDnttu26beqAAC/kwAAAAEDtvm3qgAAAAEBAbcBAAAAgL1gwAD9tgAAYMAAVekBPgNOtxm3JQAAnppgwABUrQEctycunnUBAAGAtzbAJ1SyAMAAVGxDt0EhHLdZFrdUgbdIwCdUyYOwwABUr0gBAAErAMAA/Sk+AT2Jt2rAJ1TJFreEgbd4wCdUyYOwwABUr0q3lAEmt5QBgbebwCdUyWDAAFXpBsAAVF2A57evt7m3vAECmcIAAAABA7e8t7wAAAAAAAAAYIMUAAbAAFRegOe3wbfLt9gBAIJFAAAAAQO30rfYAAAAAAAAAGCDFAFKt9UBFrfVLpnCwABUXQbAAFRfgOe33bfnt/ABAqhAAAAAAQO38LfwAAAAAAAAAGCDFAAGwABUYIDnt/W4ErgwAQCeTAFqt/ZgwAD9HAIAAAEDuBm4MAAAAAAAAABgwABUSgFKuBwBNQAAAAEAYMAAVEoBFrgcLq3ewABUVSMcuCmAAMAnVe1IAQABKwAALoAAwCdV7QFgwABUSgbAAFRvgOe4YLhuuWgAAL+IAAAAAQO4irloAAAAAgICuKEAAACEQ2DAAFWmALi5AAAAW13AAPx0AWCIswAAYIjuAT4CQCIcuNuBuNHAJ1ZNSAEAASsAwAD9KQEcuQAWuPkWuOoWuOYumcLAAFRdhLiDI2HAAPyjSAEAARa5DYG5A8AnVk1hwAD8owDAAPzzuNG5EwBKuRoBIxy5K4G5IcAnVk1IAQABKwDAAP0pFrk5Frk1LpnCwABUXYT0g0IfuUeI/gIAAha5VS6ZwsAAVF2BuVrAJ1ZNAAFgiO4GwABUYYDnuW25gbmxAQCtQAFquW5gwAD9HAIAAAEDuZS5sQAAAAAAAABgwAD70AFKuZcBNQAAAAEAYMAA+9ABNQAAAAEAXcAA/HQBYMAAVpsBFrmXLqJawABUTCMcuaaAAMAnVz1IAQABKwAAKxa5poAAwCdXPWHAAPyjAWDAAPvQIxy5rYAAwCdXMUgBAAErAACTgADAJ1cxAWDAAPvQBsAAVHCA57m2ucW+iAAAvigAAAABA7nXvogAAAACAgK57gAAAIRDYMAAVaYAugkAAABbXcAA/HQBYMAAVnUAAF3AAPx0AWCIswE+Bkm6GiIcuiiBuh7AJ1fJSAEAASsAwAD9KQAcukEWujMuolrAAFRMSAEAASsAwAD9KT4BSrpSATG6Y2CIswA/SbpyIhy6gIG6dsAnV8lIAQABKwDAAP0pACEcupkWuosuolrAAFRMSAEAASsAwAD9KT4ETrq5usAAAIF2XcAA/HQBYIizAR660MAA/HkDAWCIswIWuvQWuuYuolrAAFRMYcAA/KMrAYVYKUW7GQG7IrskAABiYMAA+9ABkwEcuyuDuynAJ1iUYwEAARa7NIK7LcAnWFphwAD8owDAAPz9AYu7PsAnWJQcuzyDuz7AJ1iUZAEAAZQAwAD89T4BPRy7UYK7S8AnWFqAvwIAAoO7UsAnWJQcu3QWu2gcu2QWu1cuolrAAFRMSwEAAYO7ZcAnWJQAwAD8g4aSwABWnqKGAQABgLt6wCdXvADAAFaFAMAA/IRJu5Ilu56Au5bAJ1e8YLSfPgE9HLvXFrvJFLvBwCdXvAABYLSfq0S0poClAQABgrvewCdYWgDAAP11P0q79QGCu/zAJ1haP0m8DyIhHLwdgbwTwCdXyUgBAAErAMAA/SkAIRy8ORa8MoG8KMAnV8lhwAD8o0gBAAE1AAAAAQBgwAD70AE1AAAAAQBdwAD8dAFgwABWmwEWvD0uolrAAFRMIxy8TIIAwCdZvkgBAAErAAArFrxMggDAJ1m+YcAA/KMBYMAA+9AjHLxTggDAJ1mySAEAASsAAJOCAMAnWbIBYMAA+9AAwAD88z4BSryvASa8rwEevLadFgQABBa9Khy892q8y12RYAFhAWDAAPvQYJFJwACEJIgFAQABFr0TFr0FLqJawABUTGHAAPyjAJFkIpFMJ74oHL1dlIHEAAAAAMAA+/MrAF3AAPx0AWCIsz9Ovby9wwAAgXZdwAD8dAFgiLMBHr3RwAD8eQMBYIizAha98YG958AnV8lhwAD8oysBhVgpRb4UAb4dvh8AAGJgwAD70AGTARy+JoO+JMAnWsFjAQABFr4vgr4owCdaimHAAPyjAMAA/P0Bi745wCdawRy+N4O+OcAnWsFkAQABlADAAPz1PgE9HL5Kgr5EwCdaioC/AgACg75LwCdawRy+XRy+WYG+UMAnV8lLAQABg75awCdawQDAAPyDooYBAAGAvmPAJ1e8AMAAVoUAwAD8hEq+dwGCvn7AJ1qKBsAAVHGA577avui/jgAAv4cAAAABA77xv44AAAACAgK/AQAAAIRDYMAAVaYAvxwAAABbXcAA/HQBYMAAVnUAAGCI7gE+AUq/LQEcvzQuv4gCAAKAv1rAJ1uFHL9jLr4oAgACgL92wCdbhYG/f8AnW5IAwABUcADAAFRvBsAAVHKA57+Tv53AAEBnAACoRwAAAAEDv6vAAEBnAAAAAgICv8IAAACEQ2DAAFWmAL/dAAAAW13AAPx0AWDAAFZ1AABgiV8BPgJOv/S/+AAAmcJggxQBIxa/+i6eb8AAVMAWwABACxbAAEAELp5MwABUYIJFwABUXhbAAEAZLpnCwABUXQFggxRKwABAIgEfwABALYlsAgACgsAAQDfAJ1wrHMAAQDwuvigCAAKAwABAT8AnXASBwABAWMAnXBEAwABUcAAGwABUc4DnwABAbMAAQHbAAEIiAACenwAAAAEDwABAhsAAQiIAAAACAgLAAECdAAAAhENgwABVpgDAAEC4AAAAW13AAPx0AWDAAFZ1AABgiV8BPgJOwABAz8AAQNMAAJnCYIMUASMWwABA1S6eb8AAVMAWwABA5hbAAEDfLp5MwABUYIJFwABUXhbAAED0LpnCwABUXQFggxRJwABA/SEcwABBC4HAAEEBwCdc3kgBAAErAMAA/Sk+AUrAAEEcAR/AAEEniWwCAAKCwABBMcAnXPocwABBNi6+KAIAAoDAAEFJwCdcz4HAAEFSwCdc3gDAAFRwAD4BSsAAQXIBH8AAQX2JbAIAAoLAAEGSwCdc+h7AAEGlwAD8eQMBYIizAhbAAEHdFsAAQc6CwABBysAnXPqEuIMjYcAA/KNqwABB62Cq78AA1gkBhVgpAAbAAFR0gOfAAEInwABCLMAASogAAJ6FAAAAAQPAAEI7wABKiAAAAAEBAcAAQkYAAACHYWCcRgAAXAE+CUnAAEM6HMAAQ0kWwABDPi6ecsAAVE5IAQABKwDAAP0pSsAAQ1IAP07AAEOXAAAAv5RgwABUSgBOwABDs8AAQ8IAAL+VYMAAVnUBFsAAQ8QuhNTAAFRNScAAQ9MlwABD5oLAAEPXwCdeZWDAAFY4PgJOwABED8AARBQAAL+WYMAAVK0BFsAARCUUwABEFsAnXmUCAWDAAFY4nprAAFY8ScAARDglwABEQYPAAEQ8wCdenmDAAFRKPgE9icAARFzAJ15VFMAARGnAJ16eAwFgwABUSj8/TsAARLUAAAC/l13AAPylAmDAAFRKYMAA+9AATsAARNoAAAC/mF3AAPylAmDAAFRKYMAA+9AATsAARQHAAEUNAAC/mV3AAP1nAWDAAFRKAR7AAEUTwADA4gABYMAAVEoAAEbAAEUswABFUcAART0AAACCkGDAAFZ1ABbAAEVFLp5ywABUTj4BScAARVklwABFYobAAEVdwCdfa2DAAFY4PgNOwABFhcAARZAAAIdOYMAA+9ABHMAARZKUgcQAAAAAwAD7807AAEXOwABF0wAAv5ZgwABUrQEWwABF2hTAAEXVwCdfawYBYMAAVjiemsAAVjxJwABF7yXAAEX4FMAARfPAJ1/GCABgwABUSj4CTsAARiLAAEYsAACdNGDAAFRKARTAAEYuwCdfxggBYMAAVEpJwABGPhzAAEZNgcAARkLAJ15VSAEAARTAAEZQwCdgEAkAAMAA/Sk+AT0cwABGaS6eagMAAxzAAEaiasAARoVdkWABYQFgwAD9tmCRScAAQuuIBQEAARbAAEa6FMAARrDAJ2AQCQCAvcAAVo8AkWSHwABG0cAnX6NqwABG7WDAAPvQFQDAAFRtScAARwkcwABHGYXAAEcNwCdfOIMXAQABFMAARyLAJ2AQCQAAwAD9cz4FPSMcwABHa4PAAEdiwCdfAkgBAAErAMAA/SmLwABHYsAnXwIewABHc8AA/KwAAmDAAFRKYMAA+9AAACsBXcAA/KUCYMAAVEpgwAD70D01AAAAAQBdwAD8pQJgwABUSmDAAPvQAYPAAEeZwCdfAjUAAAABAGDAAFRKARTAAEeiwCdgEAkAIxzAAEetHMAAR6EUwABHocAnYTIKAEsBAAEUwABHocAnYVILAADAAPy5SAEAASsAwAD88zUAAAABAGDAAPvQAZM1AAAAAQBcARzAAEehFMAAR6HAJ2EyCgCAvwIAAhTAAEehwCdhUgsAFADAJ2GdDAAAwAD8uhQAwCdhnQwAKwFgwAD70D01AAAAAQBdwAD8pQJgwABUSmDAAPvQAYPAAEfAwCdfAjUAAAABAGDAAFRKARTAAEfJwCdgEAkAHMAAR8gUwABHyMAnYe8KAIC/AgACFMAAR8jAJ2IPCwAcwABH1BzAAEfIFMAAR8jAJ2HvCgBLAQABFMAAR8jAJ2IPCwAAwAD8uWQBAAGUAMAA/PUAwAD8uj0jHMAAR/eEwABH58AnXx1IAQABKwDAAP0pjMAAR+fAJ18dHsAAR//AAPysAAJgwABUSmDAAPvQAAArAV3AAPylAmDAAFRKYMAA+9A9NQAAAAEAXcAA/KUCYMAAVEpgwAD70AGEwABIJcAnXx01AAAAAQBgwABUSgEUwABINcAnYBAJACMcwABIQBzAAEg0FMAASDTAJ2LLCgBLAQABFMAASDTAJ2LrCwAAwAD8uUgBAAErAMAA/PM1AAAAAQBgwAD70AGHwABIRMAnX6M1AAAAAQBcARzAAEg0FMAASDTAJ2LLCgCAvwIAAhTAAEg0wCdi6wsAFADAJ2M2DAAAwAD8uhQAwCdjNgwAKwFgwAD70EnAAEhhHMAASHYWwABIbxTAAEhlwCdgEAkAgkXAAFReSAEAARbAAEiDgMAASHnAJ14bmtCclwDAAP0pPgE9HMAASKAunmoDAANqwABIq2CRVMAAQlKHwABIxsAnX6MWwABI+BbAAEjzFsAASOwUwABI4sAnYBAJAIJFwABUXoC9gxphwAD9ugDAAFRtPgE9HMAASSyFwABJIMAnXzhWAQABFMAASTDAJ2AQCQAAwAD9dD8/ScAASWQhHMAASXGDwABJaMAnXwJIAQABKwDAAP0pPgE9HMAASYuDwABJgsAnXwKD+AEAATTAAEmTA8AASZPAAEp9AAAAAgICwABJoQAAAJ00YMAAVEoAwABJsAAAAL+aYMAA+9AAAGDAAPzZAT4BPRzAAEnHLp5qAwADHMAASfpqwABJ312RYAFhAmDAAP22YMAA+9BgkUnAAEJ9iAUCAAIWwABKI4bAAEoZwCdkiYC9wABWj4fAAEopwCdkmACRZBzAAEpShMAASkPAJ18dSwEAAYbAAEpTwCdkiQDAAPy5asAASmtgwAD70BUAwABUbQDAAPzEPwbAAFR1gOfAAEqNwABKksAAUZ8AAL+bAAAAAQPAAEqowABRnwAAAAICAsAASroAAACE1GCJXwDAAErVAAAAhsZgm0wAAFwBPgNOwABLAcAASwkAAIRDYLSfASbAAEsBARbAAEsQLoRDwABUXGC0n07AAEs2wABLPQAAraJdwAD8dAFgwABaMgEewABLP8AAWhIDAAIfwABLY4j+AgACFsAAS3uAwABLccAnZWKE4olkFsAAS5CAwABLhsAnZWKFF4liAIHAAEuowCdlbwGuUipJwABL4CEcwABL64PAAEvkwCdlqEgBAAErAMAA/Sk+AUbAAEv8wABMJMAATBMAAACuTGDAAFoyAIPAAEwcwCdlqD4GTsAATDYAAAAiYJFJAE7AAExQwABMWQAAH2CIswEWwABMYYTAAExbwCdmMR/AAFo0TsAATIHAAEyPAACesmCJSgEWwABMl4TAAEyRwCdmMZ6ywABaNU7AAEyzwABMvAAAqxVgwAD6CgEcwABM1BbAAEzGgsAATL7AJ2WCq0S0poMXAQABhsAATN3AJ2ZZAMAA/XNJwABM8CIlwABM/YbAAEz0wCdmWWCJAAAcwABNLxbAAE0oFsAATRkUwABNEMAnZlkGAWCJAIS4iQJhwAD8o4CXAQABkwDAAPz/PgJJwABNQBTAAE1EwCdmoQgAPgE9jcAATVzAJ2ZMHMAATa9qwABNZl2RYAFhAWCIs2CRSb5aiAUBAAEUwABNvcAnZlkGAWCJAACRZD4BPY3AAE3nwCdmTGrAAE3xYJFUvqw9j8AATjvAJ2Z8Kz4BScAATmwUwABOcMAnZqEIAD4BPY3AAE6IwCdmTBzAAE7TasAATqJdkWABYQZgiLNgiLNgwAD9tmDAAP22YMAA/bZgwAD9tmCRScAARlWIBQYABobAAE72wCdmWRbAAE8ih8AATxTAJ2Z8hWmJTxbAAE9Lh8AATz3AJ2Z8gL2JTh7AAE9lwABaFAEAARbAAE9+hMAAT3jAJ2Yxrk7AAFo2ABbAAE+2FsAAT6yAwABPosAnZWKE4olkgL2DGhbAAE/QLoC9wABWjwCRZD4BPY3AAE/2wCdmTBzAAFApasAAUABdkWABYQZgiLNgiLNgwAD9tmDAAP22YMAA/bZgwAD9tmCRScAARdWIBQYABobAAFBIwCdmWRbAAFBwh8AAUGLAJ2Z8hWmJTxbAAFCVh8AAUIfAJ2Z8gL2JTh7AAFCrwABaFAEAARbAAFDEhMAAUL7AJ2Yxrk7AAFo2ABbAAFD4FsAAUO6AwABQ5MAnZWKE4olkgL2DGhbAAFEOLoC9wABWjwCRZD0cwABRPILAAFE0wCdlgq5QBAAEhcAAUWHAJ2ZMFsAAUWouhGHAAFYZFsAAUXMuh07AAFYYh8AAUX/AJ2Z8ALTbPwbAAFR2gOfAAFGkwABRqcAAXLcAAKi2AAAAAQPAAFG9wABctwAAAAEBAcAAUc4AAACGxmCbTAAAXAE+CU7AAFH6wABSAgAAhENgtJ8BJsAAUfoBFsAAUgkuhEPAAFRcYLSfRsAAUkXAAFJ5wABSWAAAAIDtYIlKABbAAFJpFsAAUmUumcLAAFRdhLiDIz4CTsAAUpnAAFKgAACtol3AAPx0AWDAAFoyAR7AAFKiwABaEgMAAhbAAFLOgsAAUsTAJ2nGhWmJT4DAAFLVwCdphQGuUilJwABTECEcwABTG4PAAFMUwCdp60gBAAErAMAA/Sk+AUbAAFMuAMAAU0UAAACuTGDAAFoyAIPAAFNOwCdp60E+Bk7AAFNrwABTdAAAH2CIswEWwABTfITAAFN2wCdqVB/AAFo0TsAAU57AAFOsAACesmCJSgEWwABTtITAAFOuwCdqVJ6ywABaNUnAAFPNHMAAU+cWwABT2YHAAFPRwCdpmKtEtKaDFwEAAYXAAFPwwCdqcADAAP1zPgFCwABVagA/TsAAVZMAAAAiYJFJAEnAAFWmIiXAAFWzhcAAVarAJ2pwYIkAABzAAFXlFsAAVd4WwABVzxTAAFXGwCdqcAUBYIkAhLiJAmHAAPyjgJcBAAGTAMAA/P8+Aj2PwABV+MAnavBqwABWAmCRVL6sPY7AAFZCwCdqkys+AT2PwABWd8AnavAcwABWn2rAAFaBXZFgAWEEYIizYIizYMAA/bZgwAD9tmCRScAARPWIBQQABIXAAFa+wCdqcBbAAFbmhsAAVtjAJ2qThWmJTxbAAFcLhsAAVv3AJ2qTgL2JTh7AAFchwABaFAEAARbAAFc6hMAAVzTAJ2pUrk7AAFo2AACRZD0cwABXaoHAAFdiwCdpmK5QBAAEh8AAV5HAJ2rwFsAAV5ouhGHAAFYZFsAAV62CwABXo8AnacaEU4JZhsAAV7nAJ2qTALTbP0nAAFf+IRzAAFgQFsAAWAYWwABYAi6ZwsAAVF2E1IMkSAEAASsAiWo+AT0cwABYIS6/mwIAAhbAAFg8FsAAWDgumcLAAFRdhNSDJIDAAFhHwCdphQDAAFR1P0nAAFhjIRzAAFh3FsAAWGsWwABYZy6ZwsAAVF2E1YMlSAEAASsAiWo+AT0cwABYiC6/mwIAAhbAAFijFsAAWJ8umcLAAFRdhNWDJYDAAFiwwCdphQDAAFR1P0nAAFjMIRzAAFjlFsAAWNQWwABY0C6ZwsAAVF2E1oMmSAEAASsAwAD9KT4BRsAAWPbAAFkowABZBQAAAITUYIlfABbAAFkWFsAAWRIumcLAAFRdhNaDJj4BPRzAAFkyLr+bAgACgsAAWUnAJ20ggMAAWVTAJ2mFAMAAVHU/RsAAWZLAAFmywABZnQAAAISOYIN3ABbAAFmqFsAAWaYumcLAAFRdhIODJz4BPRzAAFnCgcAAWbrAJ2mYrlECAAKCwABZ1cAnbXGAwABZ3MAnaYUAtNxGwABZ+MAAWiTAAFoHAAAAhJBgg+UAFsAAWhgWwABaFC6ZwsAAVF2EgoMpPgE9HMAAWjSBwABaLMAnaZiuVAMAAxbAAFpjgsAAWlnAJ23HgmqD6oDAAFptwCdphRbAAFp+LoRhwABWGQC03kbAAFqSwABaxMAAWqMAAACY1WCDpAAWwABathbAAFqyLpnCwABUXYTXgyg+AT0cwABa1IHAAFrMwCdpmK5UAwADFsAAWwWCwABa+cAnbjKCaoOogMAAWw/AJ2mFFsAAWyAuhGHAAFYZALTeRsAAWzTAAFuSwABbVwAAAIIUYIPDABbAAFtyFsAAW24umcLAAFRdhNiDKj4BPRzAAFuigcAAW5rAJ2mYrlMGAAOAwABbzMAnaYUWwABb3S6EYcAAVhkWwABb8oLAAFvmwCdunYRTglkDhLgWwABcJILAAFwYwCdunYS4g8iEuhbAAFxggsAAXFTAJ26dhLqDyYS7FsAAXJ2CwABckcAnbp2Eu4PLtN0GwABUd4DnwABcvMAAXMHAAGFzAAC/kAAAAAEDwABc2sAAYXMAAAACAgLAAFzzAAAAmNVgwABVRADAAF0VAAAAhENgtJ8AAFwBPgROwABfC8AAXx0AAL+cYKhEASbAAF8LARzAAF86FsAAXzQWwABfLhbAAF8nLp5MwABUYJ7CwABUUJ7DqFuZFQIAAieWQjTAAF9XA8AAX1fAAGC6AAAAAAAAAGCoRAE+BU7AAF9uwABfdgAAotVghtgBH8AAX3yG5AEAATHAAF+UYISpAABOwABfpMAAX6kAAIC9YIh+AR7AAF+viIcCAAInlkIWwABfzYHAAF/FwCdvdIRDtKEATsAAX+PAAF/pAACEjmCDdwE1wABf7wAAAQBgg3cBH8AAX++DowQAAYPAAF/1wCdwCwOEGSmFAYLAAGAiwCdv5oRhFsAAYDgWwABgNC6ZwsAAVF2EYYMiNQAAAAEAWwEXwABgS4TAAGBJwCdwTYRTFsAAYFwWwABgWC6ZwsAAVF2EU4JZglmEAMAncE09HMAAYHIWwABgbi6ZwsAAVF2EigEAAYTAAGB8wCdwPACDTkrAAGCKAR/AAGCVqFcCAAKEwABgp8AncDwuAADAAPzAYKhETsAAYMfAAGDNAACEjmCDdwEmwABgxwEWwABg4YLAAGDPwCdvh4JFqEpgg3dOwABg+cAAYQEAAKLVYIbYASbAAGD5ARbAAGEJg8AAYQPAJ3EOhQGDe2CG2D0cwABhNxbAAGEihMAAYRrAJ3E6hbmG3FYBAAE1wABhPwAAAQBghVIBH8AAYT+FYAEAARbAAGFVgMAAYUnAJ29lgkXAAFVRADUAAAABAFsBF8AAYV6FwABhXMAncYKEUoTAAGFnwCdxOoJYhQDAJ3GCAMAA/IUGwABUeIDnwABheMAAYX3AAGPSAAC/nQAAAAEDwABhkMAAY9IAAAAFBQXAAGGeAAAAhWdgwACI4wDAAGGyAAAAm5xgg1kAwABhzwAAAKt6YINZAMAAYesAAACFL2DAAPoKAMAAYfsAAACZuWEDYINZYINZYMAA+gpbAABcAT4BRsAAYrzAAGL/wABiywAAAITUYIlfABbAAGL3FsAAYuiCwABi2MAnciGE+YNhhO2DPT4CTsAAYw7AAGMQAABFYINZARzAAGMiFsAAYxiAwABjEsAncgWHZcAAiOW9IQMAAxbAAGNQhcAAY0bAJ3JjhOKJZBbAAGNrgsAAY1vAJ3IhgL2DXYPAAGNxwCdyLgDAAFB5ScAAY4IhHMAAY4iGwABjhsAnco5IAQABKwDAAP0pPgE9HMAAY6OEwABjm8Ancj0gAwADgcAAY6TAJ3IUhsAAY7TAJ3KOg8AAY7fAJ3IuAAA/BsAAVHmA58AAY9fAAGPcwABvBAAAvdoAAAABA8AAY+nAAG8EAAAABgUFwABj9wAAAIVnYMAAiOMAwABkCwAAAJucYINZAMAAZCgAAACremCDWQDAAGREAAAAhS9gwAD6CgDAAGRUAAAAmblhA2CDWWCDWWDAAPoKWwABwABkqAAAAL3bYMAA+goBasAAZLtgwAD6CgBcAT4DScAAZMkcwABk3IHAAGTNwCdzd0gBAAGCwABk38Anc4QAwAD9KT4BSsAAZPgAP0nAAGUKIiXAAGUdgcAAZQ7AJ3N3YIOkASXAAGU/gsAAZS/AJ3OEYIOkPgE9HsAAZVedFQMAAye/nhbAAGWhgcAAZZLAJ3N3hFOCWRbAAGWtLoRhwABWGQA/ScAAZcEiJcAAZdSBwABlxcAnc3dgg+UAJcAAZfSCwABl5MAnc4Rgg+U+A0nAAGYKIhzAAGYiFsAAZh0UwABmDsAnc3cBAWCD5YJng+hIAQABasAAZjNghCKEtgDAAP0pABzAAGZcFsAAZlcUwABmR8Anc4QCAWCD5YJng+hIAQABasAAZm1ghCKEtgDAAP0pPgJOwABmhMAAZpIAAL+fYMAA+goBHMAAZpQuv6AEAASAwABmtcAnc2gUwABmvMAnc3cBAWCD5RTAAGbMwCdzhAIBYIPlhcAAZt3AJ3O5AMAAVIdJwABm+IbAAGb8wCd08T4BPRzAAGcXLr+dBQAFgMAAZzrAJ3NoFMAAZ0HAJ3N3AQFgg+UUwABnUcAnc4QCAWCD5YPAAGdiwCdzkYTAAGdswCdzoADAAFR4Pz9JwABnjyIcwABnpxbAAGeiFMAAZ5PAJ3N3AQFgg+WCZ4PoSAEAAWrAAGe4YIQihJgAwAD9KQAcwABn4RbAAGfcFMAAZ8zAJ3OEAgFgg+WCZ4PoSAEAAWrAAGfyYIQihJgAwAD9KT4BPRzAAGgELr+hBAAEgMAAaCXAJ3NoFMAAaCzAJ3N3AQFgg+UUwABoPMAnc4QCAWCD5YXAAGhNwCdzuQDAAFSIP0nAAGhuIhzAAGiGFsAAaIEUwABocsAnc3cBAWCD5YJng+hIAQABasAAaJdghCKEpwDAAP0pABzAAGjAFsAAaLsUwABoq8Anc4QCAWCD5YJng+hIAQABasAAaNFghCKEpwDAAP0pPgJOwABo6MAAaPYAAL+fYMAA+goBHMAAaPguv6IEAASAwABpGcAnc2gUwABpIMAnc3cBAWCD5RTAAGkwwCdzhAIBYIPlhcAAaUHAJ3O5AMAAVIlJwABpXIbAAGlgwCd2qj4BPRzAAGl7Lr+dBQAFgMAAaZ7AJ3NoFMAAaaXAJ3N3AQFgg+UUwABptcAnc4QCAWCD5YPAAGnGwCdzkYTAAGnQwCdzoADAAFR4Pz8+Bk7AAGoFwABqHQAAv6NgwAD6CgEiJcAAai6BwABqH8Anc3dgg3cBIiXAAGpTgcAAakTAJ3N3YIPlABbAAGpyFMAAamPAJ3N3AQFgg+WFLYQBTsAAaofAAGqgAAC/pGDAAPoKASIlwABqsoLAAGqiwCdzhGCDdwEiJcAAatiCwABqyMAnc4Rgg+UAFsAAavgUwABq6MAnc4QCAWCD5YUthAFOwABrDcAAayUAAL+lYMAA+goBIiIiJcAAazeBwABrKMAnc3dgg3cAIRbAAGthFMAAa1LAJ3N3AQFgg3eEG4OFACEWwABrihTAAGt7wCdzdwEBYIN3hB2DhgEiJcAAa6+BwABroMAnc3dgg+UAFsAAa84UwABrv8Anc3cBAWCD5YUvhAJOwABr48AAa/wAAL+mYMAA+goBIiIiJcAAbA+CwABr/8Anc4Rgg3cAIRbAAGw6FMAAbCrAJ3OEAgFgg3eEG4OFACEWwABsZBTAAGxUwCdzhAIBYIN3hB2DhgEiJcAAbIqCwABsesAnc4Rgg+UAFsAAbKoUwABsmsAnc4QCAWCD5YUvhAJJwABsuiKGwABsvsAnd1cAh8AAbNnAJ3enPgE9HMAAbP0uv6EEAASAwABtHsAnc2iBwABtJcAnc3eCwABtNcAnc4SFwABtRsAnc7kAwABUiD9JwABtZyIUwABta8And/cIAAAUwABthsAneHsJAD4CTsAAba/AAG29AAC/n2DAAPoKARzAAG2/Lr+iBAAEgMAAbeDAJ3NogcAAbefAJ3N3gsAAbffAJ3OEhcAAbgjAJ3O5AMAAVIlJwABuIxTAAG4nwCd5bwoAPgE9HMAAbkIuv50FAAWAwABuZcAnc2iBwABubMAnc3eCwABufMAnc4SDwABujcAnc5GEwABul8Anc6AAwABUeD8/BsAAVHqA58AAbwnAAG8OwABvYAAAnocAAAABA8AAbxzAAG9gAAAAAgICwABvMwAAAIdlYJueAMAAb04AAACGxmCbTAAAXAE+AAbAAFR7gOfAAG9lwABvasAAb9YAAJ6IAAAAAQPAAG9+wABv1gAAAAMDA8AAb4kAAACHYWCcRgDAAG+jAAAAh2Vgm54AwABvxAAAAIbGYJtMAABcAT4ABsAAVHyA58AAb9vAAG/gwABw3wAAv6cAAAABA8AAb/rAAHDfAAAAAwMDwABwCAAAAKklYIMUAMAAcB4AAACHZWCbngDAAHAvAAAAmsRggxQAAGDAAPoKAT4CTsAAcEnAAHBWAACc7WCDWQEcwABwYoHAAHBYwCd63ZsFAgACgMAAcHTAJ3rQGsAAcHuubwCbq0rAAHCSASIhHMAAcKaDwABwmcAnewFIAQABKwDAAP0pACEcwABwzRbAAHC+g8AAcLHAJ3sBhPmDYUgBAAGCwABw0MAneuoAwAD9KQbAAFR9gOfAAHDkwABw6cAAdasAAL+oAAAAAQPAAHESwAB1qwAAAAMDA8AAcSEAAAC/qWCDWQDAAHFFAAAAgkVgn8AAwABxVwAAAISQYIPlAABcAT4KTsAAcW/AAHF2AACDJGDAAP22ASMWwABxioLAAHGAwCd7xoUthAEnpw8jFsAAcaiCwABxnsAne8aFL4QCJ6cRJwABYMAA/bYBYMAA/bZOwABxz8AAcdoAAKEuYISpARzAAHHxFsAAceOBwABx3MAne7meSKdwh3IGAAYWwAByHhbAAHIXgcAAchDAJ3u5lRWfxodhqO0fwAByNYbDAAAAABzAAHJWg8AAck/AJ3vZZAEAARbAAHJnFsAAcmKCwAByWMAne8aAvYNdgL2IgQDAAP3LHsAAcnmFeQEAARbAAHKXgsAAco3AJ3vGgmqD6gAWwABytILAAHKqwCd7xoRTglkqAIr8TsAAcuzAAHLzAACBdmCEqQE1wABy+QAAAQBghZMBH8AAcvmFpAQABB/AAHMOhsMAAAAAGsAAcyiubx/AAHM+hX8BAAExwABzSGCEqQGEwABzScAnfCYAgMAAc1fAJ3usADUAAAABAFsBF8AAc3aFwABzdMAnfO+EUxbAAHONgsAAc4PAJ3vGhFOCWYJZhQDAJ3zvScAAc50hJcAAc78WwABztBbAAHOrgsAAc6HAJ3vGgmqD6oU0hIdgiNY+AT2NwABz1cAnfN41wABz4gAAAQBghl4BH8AAc+KGbwIAAoXAAHPvwCd83hbAAHQKFsAAdAGCwABz98Ane8aCaoPqhTSEhwA1AAAAAQBbARfAAHQghsAAdB7AJ32mhdcphmc1AAAAAQBbARfAAHQ9hsAAdDvAJ32mhFMWwAB0VILAAHRKwCd7xoRTglmCWYYAwCd9pj89F8AAdH0WwAB0dILAAHRqwCd7xoJqg+qCaTXAAHSIAAABAGCIDgEfwAB0iIgXAQABhcAAdJjAJ3zeADUAAAABAFsBF8AAdKiGwAB0psAnfkqEUxbAAHS/gsAAdLXAJ3vGhFOCWYJZhgDAJ35KhJc9F8AAdOcWwAB04hbAAHTZgsAAdM/AJ3vGgmqD6oJphJSEUhbAAHT6gsAAdPDAJ3vGgmqD6oJYPRfAAHUTgsAAdQnAJ3vGhBoqhA49F8AAdTWCwAB1K8Ane8aFLCmEFD0XwAB1Y4LAAHVZwCd7xoUkKoQRPRfAAHWLgsAAdYHAJ3vGhSUqhBIGwABUfoDnwAB1sMAAdbXAAHhvAAC/qgAAAAEDwAB12cAAeG8AAAAEBATAAHXhAAAAnO1gg1kAwAB2AgAAAIJFYJ/AAMAAdhQAAACEkGCD5QDAAHYuAAAAh2Vgm54AAFwBPghOwAB2UMAAdlcAAJ6uYKg8AR/AAHZdqEACAAACnq8ewAB2iZqpAQABHMAAdsCDwAB2tsAnf3abAwIAAhbAAHbVLpnCwABUXRbAAHbkgsAAdtrAJ39phPmDYQCbqACn+ipOwAB3JsAAdy0AAL+rYIPlATXAAHc2AAABAGCD5QEcwAB3NoTAAHcvwCd/iZ6rAQFgg+UBgsAAdzzAJ39pAKfVNQAAAAEAWwEXwAB3SIXAAHdGwCd/+oQfKoQPhQDAJ3/6PRzAAHdgLr+oAwADgMAAd4rAJ39PgcAAd5jAJ39chcAAd6DAJ3/pAMAAVH09HMAAd7wWwAB3sRbAAHetLpnCwABUXYSCgylWAQABhcAAd8DAJ3/pAMAA/IU9F8AAd9SFwAB3zcAnf+mEUhbAAHfdLpnCwABUXYJYTsAAd/zAAHgEAACEQ2C0nwEmwAB3/AEWwAB4Cy6EQ8AAVFxgtJ89HMAAeDIWwAB4IIbAAHgYwCeAwq3htKVWAQABhcAAeDbAJ3/pAMAA/IU9HMAAeF0WwAB4S4bAAHhDwCeAwq3htKVWAQABgsAAeGHAJ39pAMAA/IUGwABUf4DnwAB4dMAAeHnAAHvIAAC/rAAAAAEDwAB4n8AAe8gAAAAEBATAAHinAAAAnO1gg1kAwAB4yAAAAIJFYJ/AAMAAeNYAAACEjmCDdwDAAHjsAAAAh2Vgm54AAFwBPgVOwAB5CsAAeRcAAITkYJq6AR7AAHkmmsEBAAEcwAB5R4PAAHk9wCeBjJsDAgACFsAAeVwumcLAAFRdFsAAeWeCwAB5YcAngX+E+YNhAJuoAE7AAHmHwAB5jgAAoadgg+UBNcAAeZQAAAEAYIPlAR/AAHmUhCAEAAMWwAB5rYLAAHmnwCeBf4C9g11qwAB5yWCEIoSYH8AAed2EmQYAASsFhLgxwAB6G2CJSgCEujHAAHpWYIhOAIS7McAAeoxgiE4AhRmThTQcwAB63ITAAHrPwCeBn4V9AQABFsAAevGCwAB668AngX+CkIN5AJrJAYRhFsAAexCCwAB7CsAngX+EYYNeNQAAAAEAWwEXwAB7IYXAAHsfwCeCAIRTFsAAezSCwAB7LsAngX+EU4JZglmFAMAnggA9HMAAe0Quv6gDAAOAwAB7bsAngWWBwAB7fMAngXKFwAB7hMAnge8AwABUfT0cwAB7oBbAAHuVFsAAe5EumcLAAFRdhIKDKVYBAAGFwAB7pMAnge8AwAD8hT0XwAB7uIXAAHuxwCeB74RSFsAAe8EumcLAAFRdglgGwABUgIDnwAB7zcAAe9LAAH+HAAC/rQAAAAEDwAB7+MAAf4cAAAAEBATAAHwAAAAAnO1gg1kAwAB8IQAAAIJFYJ/AAMAAfC8AAACEjmCDdwDAAHxFAAAAh2Vgm54AAFwBPgVOwAB8Y8AAfHAAAITkYJq6AR7AAHx/msEBAAEcwAB8oIPAAHyWwCeDnJsDAgACFsAAfLUumcLAAFRdFsAAfMCCwAB8usAng4+E+YNhAJuoAE7AAHzgwAB85wAAmwZgg+UBNcAAfO0AAAEAYIPlAR/AAHzthCAEAAMWwAB9BoLAAH0AwCeDj4C9g11qwAB9ImCEIoSnH8AAfTaEmQYAASsFhLgxwAB9dGCJSgCEujHAAH2vYIhOAR/AAH3DiHECAAEngJYBgpAcwAB+BYTAAH34wCeDr4V9AQABFsAAfhqCwAB+FMAng4+CkIN5AJrJhLsxwAB+YmCITgCFGZSFNGrAAH6rYIjWwACSMgGEYRbAAH7PgsAAfsnAJ4OPhGGDXjUAAAABAFsBF8AAfuCFwAB+3sAnhBCEUxbAAH7zgsAAfu3AJ4OPhFOCWYJZhQDAJ4QQPRzAAH8DLr+oAwADgMAAfy3AJ4N1gcAAfzvAJ4OChcAAf0PAJ4P/AMAAVH09HMAAf18WwAB/VBbAAH9QLpnCwABUXYSCgylWAQABhcAAf2PAJ4P/AMAA/IU9F8AAf3eFwAB/cMAng/+EUhbAAH+ALpnCwABUXYJYBsAAVIGA58AAf/TAAH/5wACTggAAnooAAAABA8AAgBLAAJOCAAAAAgICwACAJwAAAIJFYJ/AAMAAgD4AAACHZWCbngAAYMAA+goBPhBJwACATxbAAIBXFsAAgFMumcLAAFRdhBqDMErAAIBjASo/TsAAgIDAAICYAAC/rl3AAP1nAWCIfgEewACAnsAAwOIAAWCIfgAATsAAgLnAAIDXAAC/r13AAP1nAWCIfgEewACA3cAAwOIAAWCIfgAATsAAgPTAAIEMAAC/sGCDFAEWwACBEhbAAIEOLpnCwABUXYTmgzVDwACBIiIhHMAAgUqEwACBMsAnhjVIAQABKwDAAP0pABbAAIFthMAAgVXAJ4Y1hBqDMD4BPYzAAIGBwCeGNRbAAIGzhMAAgZvAJ4Y1hOaDNUnAAIHJIRzAAIHlhMAAgc3AJ4Y1SAEAASsAwAD9KT4FTsAAgfvAAIIbAAC/sWDAAPoKARzAAIIdLr+nAwADhMAAgkPAJ4Y1gcAAglzAJ4WuFsAAgm6AwACCZ8AnhaGaxJ/SAMAAVHxOwACCj8AAgpgAAL+yXcAA/HQBYINZARzAAIKugcAAgqTAJ4WumwcBAAGEwACCwcAnhjUAm6xGwACC4cAAgznAAILtAAAAgmZgg1kAHMAAgwuBwACDAcAnha6bCgEAAYTAAIMfwCeGNQCbrj4BScAAg0MiIoXAAINIwCeGywEiIRzAAIPzHMAAg6QWwACDk4TAAIN7wCeGNYSlgz6CSwEAARbAAIPhFsAAg9KHwACDy8Anh1CE+YNhhKWDPgCCtUgBAAGTAMAA/PMAFsAAhDMWwACELofAAIQnwCeHUIC9g12GV4iFABzAAISEHsAAhFybuQIAAobAAIRtwCeHEhbAAIR+h8AAhHfAJ4dQgL2DXQBIAQABKwDAAP0pPgE9HMAAhLGCwACEmcAnhedWAQABFsAAhLyHwACEtcAnh1CAvYNdAMAA/XQ/TsAAhOnAAIT5AAC/s13AAPx0AWCDWQEcwACFD4HAAIUFwCeFrpsHAgABhMAAhSLAJ4Y1AZsIKZusRsAAhVHAAIW5wACFXQAAAIJmYINZABzAAIV8gcAAhWfAJ4WumwoCAAGEwACFkMAnhjUBmwgpm64+AUnAAIXDHMAAhgUewACF1pu5AgACh8AAhefAJ4haFsAAhf8UwACF+MAniJsIAIC9g10ASAEAASsAwAD9KT4BPRzAAIZEg8AAhibAJ4YOVgEAARbAAIZPFMAAhkjAJ4ibCACAvYNdAMAA/XQ/P07AAIZ6wACGhwAAnO1gg1kBHsAAhpibuQIAAhzAAIa8gcAAhrLAJ4WumwoBAAEWwACG0C6ZwsAAVF0Am64awACG1q5vAE7AAIb7wACHBAAAv7JdwAD8dAFgg1kBHMAAhxCBwACHBsAnha6bBwEAARbAAIcjLpnCwABUXQCbrE7AAIc6wACHQwAAm3RdwAD8dAFgg1kBHMAAh0+BwACHRcAnha6bCwEAARbAAIdiLpnCwABUXQCbr07AAIdywACHkAAAv7RgwAD6CgEcwACHmi6/pwMAAxbAAIe1LpnCwABUXYHAAIe6wCeFrhbAAIfMgMAAh8XAJ4WhmsSf0gDAAFR8TsAAh+PAAIfrAACtkmDAAPoKASpGwACH+ADAAIgEAAAAgmZgg1kAHMAAiBiBwACIDsAnha6bCgEAARbAAIgsLpnCwABUXQCbrkE+AknAAIn3IiIiJcAAigIUwACJ+8AnilMKAGCD5QAiFMAAih3AJ4nwCAABIiEcwACKrhzAAIp8FsAAilAWwACKTC6ZwsAAVF2EpYM+gksBAAEWwACKnBbAAIqNFMAAiobAJ4pTCgFgg+WE+YNhhKWDPgCCtUgBAAGTAMAA/PMAFsAAiuoWwACK5RTAAIrewCeKUwoBYIPlgL2DXYZXiIUAHMAAizkewACLEZu5AgAChsAAiyLAJ4l+FsAAizMUwACLLMAnilMKAWCD5YC9g10ASAEAASsAwAD9KQAhHMAAi2eCwACLT8AnheeDFwEAARbAAIt3FMAAi3DAJ4pTCgFgg+WAvYNdAMAA/XM+BEnAAIuIIRzAAIvDHsAAi5ubuQIAAofAAIuswCeJtxbAAIu9FMAAi7bAJ4pTCgFgg+WAvYNdAEgBAAErAMAA/Sk+AT0cwACL2C6/qAMAA4XAAIwRwCeJOYDAAIwfwCeFoRTAAIwnwCeKUwoBYIPlAMAAVH0+AT0cwACMSy6/qgQABIXAAIx/wCeJOYDAAIyNwCeFoRTAAIyVwCeKUwoBYIPlgcAAjJ3AJ4WuAMAAVH49HMAAjNOCwACMu8AnhedWAQABFsAAjN4UwACM18AnilMKAWCD5YC9g10AwAD9dD0VwACM7cAnijoJKULAAI0FAD9JwACNHiIiJcAAjSkUwACNIsAnilMKAGCDdwAcwACNdh7AAI1Om7kCAAKGwACNX8AniX4WwACNcBTAAI1pwCeKUwoBYIN3gL2DXQBIAQABKwDAAP0pACEcwACNpILAAI2MwCeF54MXAQABFsAAjbQUwACNrcAnilMKAWCDd4C9g10AwAD9cz4DPRzAAI3FLr+sBAAEhcAAjfnAJ4k5gMAAjgfAJ4WhFMAAjg/AJ4pTCgFgg3eBwACOF8Anha4AwABUfz0cwACOQ4LAAI4rwCeF51YBAAEWwACOThTAAI5HwCeKUwoBYIN3gL2DXQDAAP10PRXAAI5dwCeKOgkpP07AAI6NwACOnQAAv7NdwAD8dAFgg1kBHMAAjrGBwACOp8Anha6bBwIAARbAAI7ELpnCwABUXQGbCCmbrE7AAI7qwACO+gAAm2xdwAD8dAFgg1kBHMAAjw6BwACPBMAnha6bCwIAARbAAI8hLpnCwABUXQGbCCmbr0bAAI86wACPg8AAj0YAAACCZmCDWQAcwACPWoHAAI9QwCeFrpsKAgABFsAAj24umcLAAFRdAZsIKZuuPgJJwACPiyIiJcAAj5YUwACPj8AnjgAMAGCD5QAcwACP7h7AAI+/m7kCAAIUwACP0MAnjYAKABbAAI/oFMAAj+HAJ44ADAFgg+WAvYNdAEgBAAErAMAA/SkAIRzAAJAwg8AAkBLAJ4YOgxcBAAEWwACQQBTAAJA5wCeOAAwBYIPlgL2DXQDAAP1zPgNJwACQUSEcwACQkx7AAJBkm7kCAAIUwACQdcAnjbwLABbAAJCNFMAAkIbAJ44ADAFgg+WAvYNdAEgBAAErAMAA/Sk+AT0cwACQtC6/qAMAA4XAAJDtwCeJOYDAAJD7wCeFoRTAAJEDwCeOAAwBYIPlAMAAVH0+AT0cwACRJy6/qgQABIXAAJFbwCeJOYDAAJFpwCeFoRTAAJFxwCeOAAwBYIPlgcAAkXnAJ4WuAMAAVH49HMAAkbWDwACRl8Anhg5WAQABFsAAkcAUwACRucAnjgAMAWCD5YC9g10AwAD9dD0VwACRz8AnijoJKT9JwACR7SIiJcAAkfgUwACR8cAnjgAMAGCDdwAcwACSTB7AAJIdm7kCAAIUwACSLsAnjYAKABbAAJJGFMAAkj/AJ44ADAFgg3eAvYNdAEgBAAErAMAA/SkAIRzAAJKOg8AAknDAJ4YOgxcBAAEWwACSnhTAAJKXwCeOAAwBYIN3gL2DXQDAAP1zPgM9HMAAkq8uv60EAASFwACS48AniTmAwACS8cAnhaEUwACS+cAnjgAMAWCDd4HAAJMBwCeFrgDAAFSAPRzAAJMzg8AAkxXAJ4YOVgEAARbAAJM+FMAAkzfAJ44ADAFgg3eAvYNdAMAA/XQ9FcAAk03AJ4o6CSk/SsAAk3ABFMAAk3fAJ4o6CQAGwABUg4DnwACTh8AAk4vAAJTKAAC/tcAAVEkAAAABA8AAk5jAAJTKAAAAAQEBwACToAAAAIJmYINZAABgwAD+NwE+A0nAAJOuJcAAk7mAwACTssAnkOpgg3dKwACTwwEWwACT0RTAAJPKwCeQ6gABYIN3hGGDXj9JwACT3iXAAJPpgMAAk+LAJ5DqYIPlSsAAk/cBFsAAlAUUwACT/sAnkOoAAWCD5YRhg14/SsAAlIIBJsAAlIIBHsAAlImdFgQABCTAAJSqARbAAJSdgMAAlJbAJ5DqhYDAAP0wJ7+1HMAAlL2UgcQAAAAAwAD78ysAYMAA/jcGwABUhIDnwACUz8AAlNzAAKLjAAC/tsAAVEkAAAABA8AAlPnAAKLjAAAABgYGwACVBwAAAIVnYMAAiOMAwACVGwAAAJucYINZAMAAlTgAAACremCDWQDAAJVcAAAAv7dghH4AwACVgQAAAL+4YIR+AMAAlZ8AAAC922DAAPoKAABgmroBPgROwACVxMAAldoAAL+5YJq6AWrAAJXpYJq6wACTFEnAAJX0FsAAliYWwACWFxbAAJYIgsAAlfjAJ5H8hPmDYYS4gyODssAA/Fc+AT2OwACWOsAnkjoewACWX5rCAQABHMAAlowWwACWd4DAAJZxwCeR4IdlwACI5b0XAgACFsAAlrkWwACWtS6ZwsAAVF2EvINDFsAAltOCwACWw8AnkfyE+YNhAMAAUHcAP0nAAJbvIRzAAJccNQAAAAEAXcAA/HQBYIlKATUAAAABAGCEfgGDwACW88AnkgkjHMAAlwWHAMAnkv9IAQABKwAAKxbAAJcFhwDAJ5L/hLiEgwFdwAD8dAFgiUojHMAAlxWHAMAnku9IAQABKwAAKxbAAJcVhwDAJ5LvYcAA/KMBYMAA+9BIAQABNQAAAAEAXcAA/HQBYIlKATUAAAABAGCEfgGEwACXJ8AnkhYjHMAAlzqHAMAnk31IAQABKwAAKxbAAJc6hwDAJ5N9hLiEgwFdwAD8dAFgiUojHMAAl0qHAMAnk21IAQABKwAAKxbAAJdKhwDAJ5NtYcAA/KMBYMAA+9AAwAD88z4BPRzAAJdiFsAAl1ouhEPAAFRcnmoFAAQcwACXnmrAAJd4XZFgAWECYMAA/bZgwAD9tmCRScAAbiuIBQIAAiQAAxbAAJfcFsAAl82BwACXvsAnke+E+YNhgL2DGieBahbAAJgNFsAAmAiBwACX+cAnke+AvYNdgL2IgSQAAxbAAJhFFsAAmDaCwACYJsAnkfyE+YNhgL2DGieBahbAAJh3FsAAmHKCwACYYsAnkfyAvYNdgL2IgQCRZBbAAJiZgcAAmIrAJ5HvhFOCWWrAAJivYMAA+9AVFsAAmNKBwACYw8Anke+EYYNeAYJTHMAAmewxwACY7mCRZwEcwACZcRzAAJkzasAAmQBdkWABYQFgwAD9tmCRScAAa2SIBQEAARbAAJlWFsAAmVGCwACZQcAnkfyAvYNdgL2IgQCRZIJbAwADHMAAmX4uv7XAAFRJAQABgsAAmYzAJ5H8AMAAVIMWwACZxoLAAJm2wCeR/IRTgllqwACZ0mDAAPvQFQCRUGQBAAEcwACZ/C6/ugIAAoXAAJoNwCeSI4HAAJofwCeR7wDAAFSKAMAA/JbAAFW+ScAAmjwiIRbAAJplFsAAmlcWwACaUBbAAJpJFsAAmkEuhEPAAFRclRXAAFW1gkWgK55Ip3CCTIruACEcwACanDUAAAABAGCEfgGDwACae8AnkgkjHMAAmo2HAMAnldtIAQABKwAAKxbAAJqNhwDAJ5XbhLiEgwFdwAD8dAFgiUpIAQABKwDAAP0pPgVOwACaysAAmtoAAJ6oXcAA/KUCYIlKYIizATLAAJr/YIlKYIizAEXAAJsJAcAAmxLAAJsUAABiYMAA+9ABkwEcwACbGxTAAJsZwCeWUggAYwEAARbAAJs9FsAAmy6DwACbHcAnkgmEuISDYcAA/KMAwAD8/QEVwACbR8AnllIIHMAAm0UUwACbR8AnllIIAGQBAAGUAMAA/PU+AT0cwACbY4fAAJtUwCeWJ4C/AgACHMAAm4QWwACbdoTAAJtkwCeSFoS4hINLAQABFMAAm4XAJ5ZSCAAAwAD8gx/AAJubiUkBAAEcwACbzBbAAJu+g8AAm63AJ5IJhLiEg0sBAAEUwACbzcAnllIIAADAAPyDAADAAPy6TsAAm+3AAJv6AACE5GCaugEewACcCZq+AQABh8AAnBHAJ5YnAEXAAJwpAcAAnDLAAJw0AABiYMAA+9ABkwEcwACcOxTAAJw5wCeXZgkAYwEAARbAAJxdFsAAnE6DwACcPcAnkgmEuISDYcAA/KMAwAD8/QEVwACcZ8Anl2YJHMAAnGUUwACcZ8Anl2YJAGQBAAGUAMAA/PU+A07AAJyCwACclAAAv7tgiUoBHMAAnLUWwACcp4PAAJyWwCeSCYS4hINLAQABFMAAnLbAJ5dmCQAAwAD8g07AAJzQwACc4wAAv7xgiUoBHMAAnQUWwACc94TAAJzlwCeSFoS4hINLAQABFMAAnQbAJ5dmCQAAwAD8g0nAAJ0SIRbAAJ0qFMAAnRfAJ5gSCwCFC4lTPgROwACdV8AAnWUAAL+9YIizARbAAJ15FMAAnWfAJ5fWCgCFaYlPTsAAnZPAAJ2iAAC/vmCIswEWwACdtxTAAJ2kwCeYEgsAhWmJT0nAAJ3IIRzAAJ3ihsAAnczAJ5I6SAEAASsAwAD9KT4CPRXAAJ35wCeYagwcwACeH4bAAJ4JwCeSOoV9AQABFMAAni7AJ5hqDAAAmsk9FcAAnkrAJ5iPDRzAAJ6BhsAAnmvAJ5I6hX0BAAEUwACekMAnmI8NAACayT9JwACetyEcwACeyRTAAJ67wCeYagwASAEAARzAAJ7ZFMAAnszAJ5c8CACFfQEAARTAAJ7owCeYjw0AAJrJAIi3PgE9HMAAnw8WwACfBy6EQ8AAVFyeagUABBzAAJ9RasAAnytdkWABYQJgwAD9tmDAAP22YJFJwABuK4gFAgACJAADFsAAn5UWwACfhoHAAJ93wCeR74T5g2GAvYMaJ4FqFsAAn8wWwACfx4HAAJ+4wCeR74C9g12AvYiBJAADFsAAoAoWwACf+4LAAJ/rwCeR/IT5g2GAvYMaJ4FqFsAAoEIWwACgPYLAAKAtwCeR/IC9g12AvYiBAJFkFsAAoGqBwACgW8Anke+EU4JZasAAoIZgwAD70BUWwACgr4HAAKCgwCeR74Rhg14BglMcwACh7THAAKDRYJFnARzAAKFmHMAAoSJqwACg6V2RYAFhAWDAAP22YJFJwABrZIgFAQABFsAAoUUWwAChQILAAKEwwCeR/IC9g12AvYiBAJFkglsDAAMcwAChcy6/tcAAVEkBAAGCwAChgcAnkfwAwABUgxbAAKHBgsAAobHAJ5H8hFOCWWrAAKHNYMAA+9AVAJFQZAEAARzAAKIDLr+6AgAChcAAohTAJ5IjgcAAoibAJ5HvAMAAVIoAwAD8lsAAVb4/Pz2OwACiXMAnkjoewACii5rHAgAChsAAopPAJ5I6FMAAoqrAJ5c8CAAAP0rAAKLDAYbAAKLKwCeSOgbAAFSFgOfAAKLowACi9cAApJYAAL+/wABUSQAAAAEDwACjEcAApJYAAAACAgLAAKMfAAAAhWdgwACI4wDAAKMtAAAAm5xgg1kAAGCaugE+A07AAKNQwACjZQAAv8BgmroBasAAo3RgmrrAAJMUScAAo38WwACjsBbAAKOhFsAAo5KBwACjg8Anm5OE+YNhhLiDI4OywAD8Vz4BPYrAAKPEwCebqB7AAKPomsIBAAEcwACkFRbAAKQAgMAAo/rAJ5uEh2XAAIjlvRcCAAIWwACkQhbAAKQ+LpnCwABUXYS8g0MWwACkW4HAAKRMwCebk4T5g2EAwABQdwA/SsAApHcBgsAApH7AJ5uoBsAAVIaA58AApJvAAKSgwACvRAAAv8HAAFRJAAAAAQPAAKSrwACvRAAAAAsKCsAApLkAAACFZ2DAAIjjAMAApNMAAAC/uWCaugDAAKT9AAAAv8BgmroAwAClIAAAAJucYINZAMAApT0AAACremCDWQDAAKVdAAAAq4JgiLMAwAClegAAALlcYIizAMAApZQAAACEIGDAAPoKAMAApbsAAAC/u2CITgDAAKXZAAAAvdtgwAD6CgABwACl9wAAAL/CYMAA+goBasAApg9gwAD6CgBcAT4HScAAph0WwACmRRbAAKY3FsAApjAWwACmKRbAAKYhLoRDwABUXJUVwABVtYJFoCueSKdwgkyK7krAAKZRAD9JwACmXiEcwACmeIHAAKZiwCecnUgBAAErAMAA/Sk+AT2OwACmicAnnN4cwACmr4HAAKaZwCecnYV9AQABhsAApr7AJ5zeAJrJP0nAAKbYIRzAAKbxgsAAptzAJ5yqSAEAASsAwAD9KT4BPY3AAKcCwCec0RzAAKcmgsAApxHAJ5yqhX0BAAGFwACnNcAnnNEAmsk/TsAAp1TAAKdgAAC/w2DAAPoKASIhHMAAp3QUwACnYsAnnPoIAEgBAAErAMAA/SkBFMAAp3/AJ50XCgBOwACno8AAp6sAAJreYIizASMUwACnrcAnnggLAIbAAKe7wCec3oXAAKfLwCec0QFgiLNOwACn5sAAp/AAAITUYIizASMUwACn8sAnnggLAIXAAKgAwCec0YbAAKgPwCec3gFgiLNJwACoIxzAAKgtgMAAqCfAJ5yOvdkCAAIUwACoP8AnnkMMABTAAKhIwCeedg0AAMAAiOc+AEnAAKiiIofAAKimwCec6wAcwACou4DAAKi1wCecjr3ZAgACFMAAqM3AJ552DQAUwACo2MAnnkMMAADAAIjnPgBJwACpfSIlwACpiRTAAKmBwCeeQwwAYIi+ASXAAKmlFMAAqZvAJ552DQBgiL4+AD4GTsAAqk/AAKpiAAC/xGDAAP22ASTAAKqxAxbAAKqPFsAAqoCDwACqccAnnLeE+YNhgL2DGieBahbAAKqrFsAAqqaDwACql8AnnLeAvYNdgL2IgU7AAKrAwACq1AAAv8VgwAD9tgEkwACrJQMWwACrAhbAAKrzhMAAquPAJ5zEhPmDYYC9gxongWoWwACrHxbAAKsahMAAqwrAJ5zEgL2DXYC9iIFOwACrNQAAACJgkUkATsAAq0gAAACEU2DAAPvQAEnAAKtaHMAAq3AUwACrXsAnnPoIAEgBAAErAMAA/Sk+Aj0VwACrg8Ann/MQHMAAq7RqwACrjV2RYAFhBGDAAP22YIizYIizYMAA/bZgkUnAAG3EiAUEAAQUwACrz8Ann08OAIXAAKvvwCec0YbAAKwJwCec3hTAAKwkwCefoQ8AAJFkPRXAAKxCwCegABEWwACsXoPAAKxPwCect4RTglk+Aj0VwACsgcAnn/MQHMAArLFqwACsi12RYAFhBWDAAP22YMAA/bZgiLNgiLNgwAD9tmCRScAAbVCIBQUABRbAAKzeFMAArMzAJ5z6CACAvYhSFMAArPDAJ59PDgCFwACtEMAnnNGGwACtKsAnnN4UwACtRcAnn6EPAACRZD0VwACtY8AnoAARFsAArYIUwACtcMAnnPoIAIRTglk9HMAAraQWwACtnC6EQ8AAVFyeagUABBTAAK2vwCef8xAAFMAArbjAJ6AAEQBqwACtxGDAAPvQFRbAAK3dg8AArc7AJ5y3hGGDXgGCUxzAAK73McAArflgkWcBHMAArnwcwACuPmrAAK4LXZFgAWEBYMAA/bZgkUnAAGtkiAUBAAEWwACuYRbAAK5chMAArkzAJ5zEgL2DXYC9iIEAkWSCWwMAAxzAAK6JLr+1wABUSQEAAYTAAK6XwCecxADAAFSDFsAArtGEwACuwcAnnMSEU4JZasAArt1gwAD70BUAkVBkAQABHMAArwcuv7oCAAIUwACvGMAnnQcJAIPAAK8qwCectwDAAFSKAMAA/JbAAFW+BsAAVIeA58AAr67AAK+zwADJtAAAv6AAAAABA8AAr8bAAMm0AAAABAQEwACvzQAAAIVnYMAAiOMAwACv3gAAAJucYIPlAMAAr/4AAACremCD5QDAALAUAAAAvdtgwAD6CgAAYMAA+goBPhRAHMAAsEcWwACwQoHAALAzwCeiloJng+hIAQABasAAsFhghCKEtgDAAP0pwACwM8AAsF4AQBzAALCBFsAAsHyCwACwbMAnoqOCZ4PoSAEAAWrAALCSYIQihLYAwAD9KcAAsGzAALCYAE7AALCkwACwsgAAv59gwAD6CgEqTsAAsMzAALDdAAC/t2CEfgEWwACw7oHAALDfwCeiloJqg+pOwACxCcAAsRsAAL+4YIR+ARbAALEtgsAAsR3AJ6KjgmqD6k7AALFJwACxXwAAv7lgmroBHMAAsWEuv7bAAFRJBgAGgMAAsYjAJ6KHgcAAsZfAJ6KWgsAAsa/AJ6KjhcAAscjAJ6NFhsAAseLAJ6Nog8AAsf3AJ6KwAMAAVIROwACyIsAAsjcAAL/AYJq6ARzAALJBLr+/wABUSQIAAoDAALJewCeih4HAALJlwCeilgDAAFSFPRzAALJ7Lr/BwABUSQoACoDAALKQwCeih4fAALKfwCejixTAALK+wCej5ggAgcAAstzAJ6KWgsAAsvTAJ6KjFsAAsx6FwACzDcAno0WFNISHFsAAs0SGwACzMsAno2iFNISHKiuDwACzdcAnorAAwABUhknAALOMHMAAs70WwACzthbAALOhhcAAs5DAJ6NFhLqEhWHAAPyjYwEAARbAALPuFsAAs9mGwACzx8Ano2iEuoSFYcAA/KMAwAD8/T4BPRzAALQGFsAAs/4uhEPAAFRcnmoFAAQcwAC0RWrAALQcXZFgAWECYMAA/bZgwAD9tmCRScAAbBmIBQIAAiQAAxbAALSDFsAAtHSBwAC0ZcAnopaE+YNhgL2DGieBahbAALS0FsAAtK+BwAC0oMAnopaAvYNdgL2IgSQAAxbAALTsFsAAtN2CwAC0zcAnoqOE+YNhgL2DGieBahbAALUeFsAAtRmCwAC1CcAnoqOAvYNdgL2IgQCRZBbAALVAgcAAtTHAJ6KWhFOCWWrAALVWYMAA+9AVFsAAtXmBwAC1asAnopaEYYNeAYJTHMAAtowxwAC1lWCRZwEcwAC2GBzAALXaasAAtaddkWABYQFgwAD9tmCRScAAa2SIBQEAARbAALX9FsAAtfiCwAC16MAnoqOAvYNdgL2IgQCRZIJbAwADFsAAtjWCwAC2JcAnoqOEYYNeFsAAtmaCwAC2VsAnoqOEU4JZasAAtnJgwAD70BUAkVBkAQABHMAAtpwuv7oCAAKDwAC2rcAnorCBwAC2v8AnopYAwABUigDAAPyWwABVvj9JwAC22xzAALcIFsAAtvGGwAC238Ano2iFGYSEYwEAARbAALcjhcAAtxLAJ6NFhRmEhADAAPz9PgE9HMAAt0sWwAC3Qy6EQ8AAVFyeagUABBzAALeHasAAt2FdkWABYQJgwAD9tmDAAP22YJFJwABs5YgFAgACJAADFsAAt8UWwAC3toHAALenwCeiloT5g2GAvYMaJ4FqFsAAt/YWwAC38YHAALfiwCeiloC9g12AvYiBJAADFsAAuC4WwAC4H4LAALgPwCeio4T5g2GAvYMaJ4FqFsAAuGAWwAC4W4LAALhLwCeio4C9g12AvYiBAJFkFsAAuIKBwAC4c8AnopaEU4JZasAAuJhgwAD70BUWwAC4u4HAALiswCeiloRhg14BglMcwAC5zjHAALjXYJFnARzAALlaHMAAuRxqwAC46V2RYAFhAWDAAP22YJFJwABrZIgFAQABFsAAuT8WwAC5OoLAALkqwCeio4C9g12AvYiBAJFkglsDAAMWwAC5d4LAALlnwCeio4Rhg14WwAC5qILAALmYwCeio4RTgllqwAC5tGDAAPvQFQCRUGQBAAEcwAC53i6/ugIAAoPAALnvwCeisIHAALoBwCeilgDAAFSKAMAA/JbAAFW+P0XAALodAcAAuibAALooAABiYMAA+9ABkwEiHMAAujcUwAC6NcAnqGEJAGMBAAEWwAC6XxbAALpKhcAAujnAJ6NFhLqEhWHAAPyjAMAA/P0AHMAAuncUwAC6dcAnqGEJAGMBAAEWwAC6oBbAALqLhsAAunnAJ6NohLqEhWHAAPyjAMAA/P0BFcAAurDAJ6hhCRzAALqxFMAAurDAJ6hhCQBkAQABlADAAPz1PgROwAC6wcAAutMAAL+7YIhOARzAALr6FsAAuuaFwAC61cAno0WEuoSFSwEAARTAALr7wCeoYQkAAMAA/INOwAC7CcAAuxwAAL+8YIhOARzAALtEFsAAuzCGwAC7HsAno2iEuoSFSwEAARTAALtFwCeoYQkAAMAA/IM9HMAAu08uv8HAAFRJCgAKgMAAu2bAJ6KHh8AAu3fAJ6OLFMAAu5jAJ6PmCACBwAC7uMAnopaCwAC70sAnoqMWwAC7/xTAALvtwCepCAoAgpCIVBbAALw5HMAAvDUWwAC8IYbAALwPwCejaIS6hIVLAQABFMAAvDbAJ6hhCQAAwAD8g4KQiFQiFsAAvFsUwAC8ScAnqQgKAIQgiGABFsAAvH0UwAC8asAnqUQLAIQgiGAUwAC8lMAnqQgKAIPAALyxwCeisADAAFSGScAAvMoWwAC84BTAALzOwCepCAoAhCCIYD2MwAC87cAnozEpP0nAAL0NIhbAAL0yFsAAvSKFwAC9EcAno0WEu4SGgVXAAPxWABbAAL1nFsAAvVeGwAC9RcAno2iEu4SGgVXAAPxWPgFKwAC9eAGEwAC9f8AnozE/ScAAvZgcwAC9xBbAAL29FsAAva2FwAC9nMAno0WEu4SGYcAA/KNjAQABFsAAvfAWwAC94IbAAL3OwCejaIS7hIZhwAD8owDAAPz9PgE9HMAAvggWwAC+AC6EQ8AAVFyeagUABBzAAL5CasAAvh5dkWABYQJgwAD9tmDAAP22YJFJwABrsYgFAgACJAADFsAAvoAWwAC+cYHAAL5iwCeiloT5g2GAvYMaJ4FqFsAAvrEWwAC+rIHAAL6dwCeiloC9g12AvYiBJAADFsAAvukWwAC+2oLAAL7KwCeio4T5g2GAvYMaJ4FqFsAAvxsWwAC/FoLAAL8GwCeio4C9g12AvYiBAJFkFsAAvz2BwAC/LsAnopaEU4JZasAAv1NgwAD70BUWwAC/doHAAL9nwCeiloRhg14BglMcwADAiTHAAL+SYJFnARzAAMAVHMAAv9dqwAC/pF2RYAFhAWDAAP22YJFJwABrZIgFAQABFsAAv/oWwAC/9YLAAL/lwCeio4C9g12AvYiBAJFkglsDAAMWwADAMoLAAMAiwCeio4Rhg14WwADAY4LAAMBTwCeio4RTgllqwADAb2DAAPvQFQCRUGQBAAEcwADAmS6/ugIAAoPAAMCqwCeisIHAAMC8wCeilgDAAFSKAMAA/JbAAFW+P0/AAMDYwADA3AAAAb4JYQJgiE5giE5gwAD70AADwADA8sAAwVIAAAACAgLAAMEHAAAAv8ZgiE4AwADBHwAAAL/HYIhOAABgwAD70AE+AUrAAMErARzAAME6FsAAwTUUwADBMsAnrNwKAIC9iFKCSwEAARbAAMFHFMAAwUTAJ6zpCwCAvYhSAMAA/cZOwADBc8AAwYYAAL/IXcAA/HQBYIhOATXAAMGUAAABAF3AAPx0AWCITgEewADBlMAA/HoBAWCITgEWwADBr4XAAMGewCejRYS7hIYANQAAAAEAWwEcwADBzBTAAMHKwCetVAoAgK4BAAEUwADB0cAnrLYJAADAAPyHFADAJ61UCgBOwADCCMAAwhwAAL/JXcAA/HQBYIhOATXAAMIqAAABAF3AAPx0AWCITgEewADCKsAA/HoBAWCITgEWwADCRobAAMI0wCejaIS7hIYANQAAAAEAWwEcwADCYxTAAMJhwCet1QsAgK4BAAEUwADCaMAnrLYJAADAAPyHFADAJ63VCwBOwADCo8AAwrsAAL/KXcAA/G0BYIhOARbAAMLYFMAAwsXAJ609CgBcwAD8VE7AAMMEwADDHQAAv8tdwAD8bQFgiE4BFsAAwzsUwADDJ8Anrb4LAFzAAPxUQUPAAMNUIhzAAMNzFMAAw1vAJ64/DABdAAAAAMAA/G8AHMAAw6IUwADDicAnrmsNAF0AAAAAwAD8bz4EQ8AAw7YhHMAAw+IWwADD3RbAAMPVFMAAw73AJ64/DABewAD8cYC9iFJIAQABFsAAxBAWwADECBTAAMPvwCeuaw0AXsAA/HGAvYhSAMAA/cU+AUnAAMQgIRzAAMQ9FMAAxCXAJ64/DABdAAAAAMAA/G8+Aj0cwADEXRbAAMRVLoRDwABUXJ5qBQAEHMAAxJ5qwADEd12RYAFhA2DAAP22YMAA/bZgwAD9tmCRScAAbIGIBQMAAyQAAxbAAMTgFsAAxNGBwADEwsAnopaE+YNhgL2DGieBahbAAMUVFsAAxRCBwADFAcAnopaAvYNdgL2IgRbAAMVQFsAAxUgUwADFL8AnrmsNAF7AAPxxgL2IUiQAAxbAAMWKFsAAxXuCwADFa8AnoqOE+YNhgL2DGieBahbAAMXAFsAAxbuCwADFq8AnoqOAvYNdgL2IgQCRZBbAAMXmgcAAxdfAJ6KWhFOCWWrAAMYAYMAA+9AVFsAAxieBwADGGMAnopaEYYNeAYJTHMAAx1IxwADGR2CRZwEcwADG1hzAAMaUasAAxl1dkWABYQFgwAD9tmCRScAAa2SIBQEAARbAAMa3FsAAxrKCwADGosAnoqOAvYNdgL2IgQCRZIJbAwADFsAAxvOCwADG48AnoqOEYYNeFsAAxyiCwADHGMAnoqOEU4JZasAAxzRgwAD70BUAkVBkAQABHMAAx2Yuv7oCAAKDwADHd8AnorCBwADHicAnopYAwABUigDAAPyWwABVvkLAAMelAD9OwADHzsAAx+AAAL+7YIhOARbAAMf6FMAAx+LAJ64/DABewAD8cT0cwADICS6/wcAAVEkKAAqAwADIIMAnooeHwADIMcAno4sUwADIUsAno+YIAIHAAMhywCeiloLAAMiMwCeioxbAAMi5FMAAyKfAJ7ESDgCCkIhUFsAAyOoWwADI4hTAAMjJwCeuaw0AXsAA/HGCkIhUFsAAyQwUwADI+sAnsRIOAIQgiGAUwADJI8AnsRIOAIPAAMlAwCeisADAAFSGScAAyVkWwADJbxTAAMldwCexEg4AhCCIYD2MwADJfMAnozEpP0rAAMmcAYTAAMmjwCejMQbAAFSIgOfAAMm5wADJvsAAzIQAAL+hAAAAAQPAAMnRwADMhAAAAAQEBMAAydgAAACFZ2DAAIjjAMAAyeYAAACbnGCDWQDAAMoDAAAAq3pgg1kAwADKGQAAAL3bYMAA+goAAFwBPgVOwADKPsAAylQAAL+5YJq6ARzAAMpWLr+2wABUSQYABoDAAMp9wCeyM4HAAMqEwCeyQoLAAMqUwCeyTysrg8AAyrHAJ7JcAMAAVIROwADK1cAAyuoAAL/AYJq6ARzAAMr0Lr+/wABUSQIAAoDAAMsRwCeyM4HAAMsYwCeyQgDAAFSFTsAAyzHAAMs+AACrgmCIswEWwADLT4HAAMtAwCeyQoT9g2tOwADLY8AAy3EAALlcYIizARbAAMuDgsAAy3PAJ7JPhP2Daz0cwADLky6/wcAAVEkKAAqAwADLqMAnsjOEwADLt8AnsnGFwADL1sAnsryBwADL9MAnskKCwADMDMAnsk+GwADMJcAnsvOHwADMO8AnsxYqK4PAAMxvwCeyXADAAFSGBsAAVImA58AAzO7AAMzzwADRfgAAv6IAAAABA8AAzQbAANF+AAAABAQEwADNDQAAAIVnYMAAiOMAwADNGwAAAJucYINZAMAAzTgAAACremCDWQDAAM1OAAAAvdtgwAD6CgAAYMAA+goBPgpOwADNc8AAzYkAAL+5YJq6ARzAAM2LLr+2wABUSQYABoDAAM2ywCezwYHAAM25wCez0ILAAM3JwCez3Ssrg8AAzebAJ7PqAMAAVIROwADOCsAAzh8AAL/AYJq6ARzAAM4pLr+/wABUSQIAAoDAAM5GwCezwYHAAM5NwCez0ADAAFSFTsAAzmbAAM5zAACrgmCIswEWwADOhIHAAM51wCez0IT+g2xOwADOmMAAzqYAALlcYIizARbAAM64gsAAzqjAJ7PdhP6DbE7AAM7MwADO3gAAv7tgiE4BNQAAAAEAXcAA/HQBYIhOATUAAAABAGCEfgEWwADO94HAAM7owCez0IJqg2ojHMAAzwEUAMAntOwIAEgBAAErAAArFsAAzwEUAMAntOwIAIS6hIUBXcAA/HQBYIhOIxzAAM8XFADAJ7TcCABIAQABKwAAKxzAAM8XFADAJ7TcCACWMwEAAZMAwAD8UQFgiE5OwADPLsAAzzoAAIQgYMAA+goBNQAAAAEAYMAA+goBNQAAAAEAYIhOARTAAM88wCe0ywgAIxzAAM9PFADAJ7WKCQBIAQABKwAAKxbAAM9PFADAJ7WKCQCEIIhgAWDAAPoKIxzAAM9bFADAJ7V+CQBIAQABKwAAKhQAwCe1fgkAAWDAAPoKScAAz2kiIRTAAM9uwCe1awkAACXAAM+MgcAAz33AJ7PQYIN3PgE9FcAAz57AJ7VrCRbAAM+7FMAAz6zAJ7PQAQFgg3eEIIOEP0nAAM/SIiEUwADP18AntWsJAAAlwADP9oLAAM/mwCez3WCDdz4BPRXAANAIwCe1awkWwADQJhTAANAWwCez3QIBYIN3hCCDhD89HMAA0D0uv8HAAFRJCwAKgMAA0FLAJ7PBhMAA0GHAJ7QDhcAA0IDAJ7ROgcAA0J7AJ7PQgsAA0LbAJ7PdhsAA0M/AJ7SFh8AA0OXAJ7SoFMAA0PzAJ7VrCQAUwADREcAntMsIAIPAANEswCez6gG/winAAFSGSsAA0WgBFMAA0W/AJ7VrCQAGwABUioDnwADR08AA0ejAANZOAAC/ugAAAAEDwADR+MAA1k4AAAACAgLAANIFAAAAvdtgwAD6CgDAANIeAAAAm5xgg1kAAF3AAPx0AWCRZwE+AknAANI0HMAA0lYWwADSR4HAANI4wCe3QYT5g2FIAQABFsAA0lkumcLAAFRdAMAA/Sk+AUrAANKBAWrAANKIXcAA/HQBYJFnwADZaT9JwADSnIDAANKgwCe3Mj4BSsAA0tMBMcAA0tpgkWcBHMAA0zQcwADTD2rAANLkXZFgAWEBYMAA/bZgkUnAAEyZiAUBAAEWwADTIRbAANMdLpnCwABUXYC9gxoAkWSCWwMAAxbAANNFFsAA00EumcLAAFRdhGGDIhbAANNSFsAA004umcLAAFRdhFOCWRbAANNnFsAA02IWwADTXi6ZwsAAVF2AvYMaYcAA/boAkVA+AUnAANOLFsAA05MWwADTjy6ZwsAAVF2E3IMyPgROwADT4sAA0+sAAL/MYMAA/bYBFsAA0/wWwADT8RbAANPtLpnCwABUXYTmgzWE6oM5TsAA1BrAANQkAAC/zWDAAP22ARbAANQ3FsAA1CoWwADUJi6ZwsAAVF2E54M2gL2DGk7AANRJwADUWQAAv85gwAD70AEWwADUfhbAANRfFsAA1FsumcLAAFRdhOyDO2HAAP26SsAA1I4BMcAA1JVgkWcBHMAA1QccwADU1WrAANShXZFgAWECYMAA/bZgwAD9tmCRScAAQ6yIBQIAAoPAANTjwCe4pYLAANTuwCe4dACRZIJbAwADFsAA1RgWwADVFC6ZwsAAVF2EYYMiFsAA1SUWwADVIS6ZwsAAVF2EU4JZhMAA1THAJ7jWAJFQPgFKwADVjQExwADVlGCRZwEcwADV+BzAANXRasAA1aBdkWABYQFgwAD9tmCRScAAY9CIBQEAARbAANXjFsAA1d8umcLAAFRdgL2DGgCRZIJbAwADFsAA1gkWwADWBS6ZwsAAVF2EYYMiFsAA1hYWwADWEi6ZwsAAVF2EU4JZFsAA1isWwADWJhbAANYiLpnCwABUXYC9gxphwAD9ugCRUAbAAFRigOfAANZTwADWXsAA1w8BAKFQAAAAAQPAANZwwADXDwAAAAAAAABgwAD9tgE+AUrAANZ2ASMiFsAA1n0uhOnAAFRYACEWwADWlC6t/sAAVFkkwADXBQMWwADWwxbAANa5LoTUwABUTaFQwABWeieHRhbAANbpFsAA1t0uhNXAAFRaoVDAAFZ6FsAA1wcugL3AAFaPAWDAAP22BsAAVIuA58AA1xTAANcZwADZvwAAqMUAAAABA8AA1y7AANm/AAAAAAAAAFwBPgJAFsAA10IWwADXPi6ZwsAAVF2E34M0wADXPsAA11QARsAA11vAANeXwADXbAAAAKimYMAAVK0AFsAA148WwADXiRbAANd8LoTXwABUUZ7DqFspwAD8yD4BScAA158iIRbAANexgMAA16TAJ7smhIfAAFTEACIWwADX2IDAANfLwCe7JoQewABUugEWwADX8oDAANflwCe7Jod5wABUuT4BPRzAANgMLp5qBAADHMAA2FtqwADYJF2RYAFhAWDAAP22YJFJwABAZIgFAQABFsAA2GkuoVDAAFRiAJFkFsAA2Ikuh07AAFYYasAA2KFgwAD70BUBglMxwADYwGCRZwEcwADZQhzAANkOasAA2NBdkWABYQFgwAD9tmCRScAAQMKIBQEAARbAANkcLqFQwABUYgCRZIJbAwADFsAA2XOAwADZZsAnuyaEYcAAVLIWwADZiYDAANl8wCe7JodOwABUs2rAANmVYMAA+9AVAJFQwABUbT8GwABUjIDnwADZxMAA2cnAAN0kAACoxgAAAAEDwADZ3sAA3SQAAAABAQHAANnuAAAAh2Vgm54AAFwBPgNOwADajMAA2pYAAITUYIjuARbAANqmFsAA2pwWwADamC6ZwsAAVF2E1IMkhpaJZU7AANrIwADa1QAAhORgmroBHsAA2uSawQEAARbAANr2FsAA2vIumcLAAFRdhNWDJQBGwADbCMAA20/AANsXAAAArKdgiV8AHMAA2zYWwADbKRbAANslLpnCwABUXYTngzaE4AAAAACDTD4CTsAA22XAANtvAACdNGCI7gEWwADbqBzAANuIgsAA23vAJ7zehOUBAAGDwADbnMAnvRcAmsqGlollScAA278hHMAA3AEcwADbzYDAANvDwCe8nIVsAgACgcAA2+HAJ7yvFsAA2/aEwADb7MAnvUmE4oj0AJupSAEAAYTAANwOwCe9SQCI/D4BPRzAANwrFsAA3CMuhEPAAFRcnmoEAAQcwADccWrAANxDXZFgAWEDYIizYIizYIizYJFJwABhHYgFAwADgcAA3JDAJ7yvhMAA3JvAJ71JFsAA3LYWwADcqhbAANymLpnCwABUXYTVgyWG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2fYAKNomACjaggAo2rIAKNr4ACjbPgAo25EAKNvrACjcJgAo3HcAKNyyACjdBQAo3UsAKN2GACjd1wAo3hIAKN5uACjeoAAo3uYAKN8YACjfPwAo35QAKN/EACjgCgAo4DsAKOCUACjgxAAo4R4AKOFOACjhlAAo4cQAKOIKACjiPAAo4pgAKOLKACjjGQAo42sAKOOvACjj9QAo5E8AKOStACjlNwAo5YgAKOXFACjmLgAo5rYAKOb6ACjnPgAo54IAKOeyACjoBQAo6EkAKOh5ACjovwAo6RAAKOlUACjphAAo6cgAKOn4ACjqPgAo6m4AKOqyACjq4gAo6yYAKOtWACjrsgAo6/YAKOwzACjsZQAo7LQAKOzkACjtPgAo7YIAKO27ACjuAQAo7kUAKO7LACjvCQAo71sAKO+vACjv7QAo8EEAKPB/ACjw3gAo8RoAKPFuACjxqgAo8f4AKPI8ACjymwAo8voAKPNOACjzjAAo8+AAKPQeACj0igAo9OsAKPUnACj1eQAo9bcAKPYJACj2RQAo9qQAKPb2ACj3NAAo94YAKPfYACj4FAAo+GgAKPikACj5EgAo+VcAKPmrACj5/wAo+lUAKPqnACj68gAo+0YAKPuEACj75QAo/EQAKPyAACj8ywAo/S4AKP2CACj9swAo/gUAKP5KACj+xwAo/00AKP+LACj/3wApABsAKQCHACkAxQApATMAKQFxACkB0AApAg4AKQKJACkCxwApAyYAKQNkACkDwwApBCIAKQSBACkE1QApBTQAKQWiACkGAQApBj8AKQaRACkGzwApBy4AKQdqACkH2AApCBYAKQh3ACkI1gApCRQAKQlzACkJyQApChsAKQpZACkK+wApC0QAKQuwACkL7gApDE0AKQyJACkM2wApDUcAKQ2ZACkOCQApDmgAKQ68ACkPhAApECsAKRCvACkRAwApET8AKRGeACkR3AApEkoAKRKcACkS7gApEyoAKRN1ACkT4gApFCAAKRR/ACkUuwApFRoAKRVwACkV0QApFg0AKRZsACkWvgApFxAAKRdMACkXngApF9oAKRgJACkYaAApGKQAKRj4ACkZQQApGZMAKRnlACkaIQApGl0AKRqxACkbAwApG1UAKRunACkb4wApHEIAKRyjACkdAgApHWEAKR2zACkeIQApHo8AKR7hACkfLAApH7QAKSAGACkgWAApINMAKSFdACkhrwApIhAAKSJiACkingApIvAAKSNCACkjlAApI+YAKSQ4ACkkigApJNwAKSU7ACklmgApJewAKSY+ACkmkAApJuIAKSdDACknnQApKEMAKSikACko9gApKUgAKSmaACkpyQApKg4AKSptACkqvwApKxEAKStPACkruwApLBAAKSyDACktHwApLZMAKS3lACkuFgApLoEAKS7oACkvGQAAAR0AAAGA/wApM5gAKNW/ACkzlgAAAAEAKTOYAAAAAAAAAMAAV+3AAECJgQAAABSA+AAAjBwAAQECh8uIroEuAACMHKBTAIFWAACRvQABAQKCEYITgYgAAJ3CAAEBDZ34nQOd+Z3+lTKeB53/ngidcp1znO+RTZzcgw4AAKGpAAEBFKA0oBCgBZUxoCygEaAooBOgCJzdoAagAqAXoBSgFqAVoCCgR6AmoAmFQQAAwABY5QABAQGgXYVkAACSWwABAQGCJ4WWAADAAIlMAACFuAAAwABY8wABAQOgX7/2v/iGXAAAwACJawABAQHAAECKhpgAAMAAWQUAAQECoGDAAECLhvAAAMAAVskAAQEBq+yHFwAAwACKkgABAQTAAECMwABAjcAAQI7AAECPh60AAMAAiqEAAQEBwABAkIfXAADAAFlFAAEBAaBhiAMAAMAAiq8AAQECwABAkZ1ciE0AAMAAitkAAQEDwABAksAAQJPAAECUiOIAAMAAiv4AAQEBwABAlYkhAADAAIspAAEBCMAAQJbAAECXwABAmMAAQJnAAECawABAm8AAQJzAAECdihEAAMAAWWIAAQEIwABAnsAAQJ/AAECgwABAocAAQKLAAECjwABApKBlAAABwABX74EAwAOSEMAAQKUAAQAAgnZgwAD9HAFbXgABAQFfAAAAAVfAAFfvAV8AAGCRSQABwAOSPAAAAABfAAAAAAECwABX8IEApvim/sADkbwDoF4AAAFgwAD9HAAABwTAAFfygQCnEqcaGKhvAGDAAFbKAATAAFfzgQCnRKdmGL5tAGDAAPoKASkEwABX9IEAqGGogBi+bgBgklwBaqh8YJJcwACQqwTAAFf1gQCqrarOGL5vAGDAAIqiAWqqw2DAAIqiwAD74gTAAFf2gQCrT6tdGMAAQKcAYMAAiwcBKwTAAFf3gQDAAfmOwAH5oBjAAECo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AADAAIlSAVxKwABGCwEcwABGEi7AAEDFAQABgMAARirAKUK5AMAAWEQ/Q8AARkAWwABGUhbAAEZNgMAARkfAKUK5g7Cexp1cnr0+AT2IwABGaMApQrkWwABGdoDAAEZwwClCuYOwnsY/PYrAAEaOwClDAhbAAEabgMAARpXAKUK5g7CexknAAEalFsAARq6CwABGqcApQwKdXZ7APgFKwABGyQEcwABG0C7AAEDDAwADg8AARvDAKUNygsAARvfAKUMCgcAARv3AKULGAMAAWApJwABHGRbAAEcigsAARx3AKUMCnWWevD4CPTUAAAABAGDAAIlNAYHAAEenwClCxiMcwABHt4QAwClFYEgBAAErAAArHMAAR7eEAMApRWDAAEDEAAAAAMAAiVIBXErAAEfRARzAAEfYLsAAQMUBAAGDwABH8MApQ3IAwABYREnAAEgDIRzAAEgSFsAASA2DwABIB8ApQ3KDsJ7GSAEAAYLAAEgVwClDAgDAAP0pPgI9NQAAAAEAYMAAiU0BgcAASCPAKULGIxzAAEgzhADAKUX1SAEAASsAACscwABIM4QAwClF9cAAQMQAAAAAwACJUgFcSsAASJsBHMAASKIuwABAxQEAAYPAAEi6wClDcgDAAFhEP0nAAEjcIhbAAEjlgsAASODAKUMCnW6evgAewABI88AAWWQCAAIng9cWwABJBoLAAEkBwClDAoOwnsYAPgM9HMAASWUuwABAxgIAAoLAAEl8wClDAmrAAEmIYJFUwACDxADAAFjFPRzAAEoPFsAASgYuwABAqsAAV/vAAEDHAgACgsAASjTAKUMCJMAASmICJ8AAQMgWwABKVoLAAEpRwClDAodOnrQAwACLJUrAAEprARzAAEpyLsAAQMUBAAGCwABKisApQwIAwABYRD89HMAASu8WwABK5i6ob8AAV/LAAEB1AQABgsAASwPAKUMCAMAAV35KwABLDgEcwABLFS7AAEDJAQABgMAASzXAKUK5AMAAWMkGwABYB4EAwABLvcAAS8PAAE1eAADAAEDKAAAAAQPAAEvhwABNXgAAAAICAsAAS+gAAABqYJ6rAMAAS/UAAACdYmCeqwAAYJ6rAT4DTsAATArAAEwTAACoF2CeqwEWwABMG4DAAEwVwClHmYOwnsZDwABMJSEcwABMNYLAAEwswClHukgBAAGBwABM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AD0cwADXxRbAANe8LqhvwABX8sAAQGkBAAGCwADX48ApoxMAwABXYU7AANfzwADYAgAAoqlgwAD70AGTQUPAANgLKT4HTsAA2CbAANgrAACDsGCeqwEWwADYM4DAANgtwCmi74OwnsZJwADYPx7AANhDwABZZAIAAieGwITAANhRwCmjpgA+AULAANhiAD89iMAA2HfAKaLvHMAA2IkuwABBDwMAA4DAANiewCmi72rAANi5YMAAWPjAALnpgcAA2MjAKaL8AMAAWCk9jMAA2NXAKaOmFsAA2OKAwADY3MApou+DsJ7GPYvAANjwwCmjiRzAANjug8AA2PDAKaOJZAEAAZQAwAD89UnAANkGIR7AANkLwABZZAIAAieAp4TAANkZwCmjpgA+AknAANkqIR7AANkvwABZZAIAAieGwITAANk9wCmjpgA+Az0cwADZZi7AAEDGAgAChMAA2YzAKaOmHMAA2a9qwADZmF2RYAFhAWDAAP22YJFJrqSIBQEAASeGwACRZADAAFjFPYzAANoBwCmjphbAANoOgsAA2gjAKaMTnQ2euEPAANoiIRzAANo0FsAA2i+AwADaKcApou+DsJ7GSAEAAYTAANo3wCmjpgDAAP0pPgE9iMAA2kvAKaLvFsAA2lmAwADaU8Apou+DsJ7GP0LAANp9AD89iMAA2pLAKaLvhMAA2prAKaOmScAA2qocwADavYPAANquwCmjiUgBAAGTAMAA/PM+Az0cwADayy7AAEEQAwADgMAA2ujAKaLvasAA2v9gkVSsNB/AANstnqAEAARqwADbW2Ce88AApmInABbAANt2FsAA23GAwADba8Apou+DsJ7Gh06etJMAAMAAWFU9iMAA243AKaLvHMAA258uwABBDwMAA4DAANu0wCmi72rAANvPYMAAWPjAALnpgcAA297AKaL8AMAAWCk9i8AA2+3AKaOJHMAA2+uDwADb7cApo4lkAQABlADAAPz1Pz2IwADcB8Apou8WwADcFYDAANwPwCmi74OwnsZAHsAA3CbAAFlkAgACJ4bAgMAA3DTAKaLvAMAA3CbAANw6AD0cwADcShbAANxBLqhvwABX8qKIAwADg8AA3GbAKaOJgsAA3HbAKaMTgMAA3H3AKaLvAMAAV2JKwADciQGAwADckMApou8GwABYLIEAwADc7cAA3PPAAN4HAADA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AFg3ScABEc8hHMABEfYWwAER5ITAARHTwCnDQL78wACK90gBAAErAMAA/Sk+AUnAARIJhsABEg3AKcPfPgE9HMABEiguwABAxgIAAhbAARJQhMABEj/AKcNAvvzAAIr3asABEndgkVTAAGLQAMAAWMU+AT2OwAESrsApw98pPz0cwAES5hbAARLdLqhvwABX8r8yAAAAAMAAVugiIR7AARNcwABZZAIAAieZrhbAARNwgMABE2rAKcLug7CexgAAIRzAARN/h8ABE3nAKcQ2SAEAAYDAAROCwCnC7gDAAP0pPRfAAROPLqhvg8ABE5rAKcMfwABX8krAAROvAYDAARO2wCnC7gbAAFg7gQDAARQWwAEUHMABFMUAAMAAQTUAAAABA8ABFCvAARTFAAAAAQEBwAEUMgAAAJJOYJ6rAABgnqsBPgJJwAEUPyEewAEURMAAWWQCAAInmgsWwAEUWYDAARRTwCnHuoOwnsYAPgI9HMABFHEWwAEUaC6ob8AAV/K/NQIAAiuTAMAAVuZKwAEUjwGAwAEUlsApx7o/SsABFKcBHMABFK4uwABBNwEAAYDAARS7wCnHugDAAFg8BsAAWDyBAMABFMrAARTQwAEWvwAAwABBNwAAAAEDwAEU3MABFr8AAAABAQHAARTjAAAAkk5gnqsAAGCeqwE+Bk7AART2wAEVAAAAoqFgnqsBFsABFQiAwAEVAsApyHODsJ7GQCIiHsABFV7AAFlkAgACJ5oLgcABFW3AKciIAAEewAEVg8AAWWQCAAInmdeBwAEVl8ApyIgAARzAARW+FsABFbeBwAEVrcApyIiCXp7FSAEAASehaADAAP3FwAEVXsABFckATsABFdTAARXeAACoi2DAAPvQAZNEwAEV5z4CPYjAARXywCnIcxzAARYYHsABFfrAAIsxAgACFsABFgyAwAEWBsApyHODsJ7GKQDAAEElAgACFsABFjCAwAEWKsApyHODsJ7GLgDAAIs6PYrAARZFwCnJDhzAARZDgsABFkXAKckOZAEAAZQAwAD89R7AARZdwABZZAIAAieApxbAARZxgMABFmvAKchzg7CexgA9HMABFoYWwAEWfS6ob8AAV/K/NQIAAoHAARaUwCnIiILAARafwCnJDgDAAFbmSsABFq8BgMABFrbAKchzBsAAWD2BAMABF0/AARdVwAEfPwAAwABA0AAAAAEDwAEXY8ABHz8AAAABAQHAARdqAAAAvvRgnqsAAGCeqwE+DkAewAEXicAAWWQCAAIngo+AwAEXn8ApyiMAwAEXicABF7AATsABF73AARfDAACSTmCeqwGAwAEXxcApyiNOwAEX4cABF+YAAIC9YJ6rARbAARfugcABF+jAKcpbg7CexknAARf4IhbAARgBgsABF/zAKcp1nOieugAhHsABGBLAAFlkAgACJ5oLgsABGCHAKcp1AD4BPYnAARgwwCnKW4LAARg4wCnKdT4BPYrAARhRwCnKdSs9icABGGjAKcpbHMABGJMewAEYcMAAizICAAKBwAEYhsApylspAMAAQP8CAAKBwAEYosApylsuAMAAi0g9HMABGL0WwAEYtC6ob8AAV/K+8wIAAoDAARjXwCnKI4LAARjpwCnKdQDAAFbqTsABGPrAARkEAACioWCeqwEWwAEZDIHAARkGwCnKW4OwnsZJwAEZFiEewAEZG8AAWWQCAAInmguDwAEZKsApy1cAPgFJwAEZUCIiHsABGVTAAFlkAgACJ5nXg8ABGWjAKctXAAEewAEZgMAAWWQCAAInmdiDwAEZl8Apy1cAAR7AARmvwABZZAIAAieZ1oPAARnAwCnLVwA+AT0cwAEZ1i7AAEDGAgACg8ABGfrAKctXHMABGiNqwAEaC12RYAFhAWDAAP22YJFJsP2IBQEAASeaCwCRZADAAFjFPgI9HMABGlAuwABAxgIAAoHAARp0wCnKWxzAARqdasABGoFdkWABYQFgwAD9tmCRSa2tiAUBAAEnmgsAkWQAwABYxT2LwAEau8Apy1ccwAEa0BbAARrHLsAAQKrAAFf7wABBBAIAAoHAARrnwCnKW2rAARr2YJ3uwACeVQDAAIsmP07AARsWwAEbHwAAwABA/GDAAIs0AR7AARshwACLMQIAAoPAARstwCnLVykAPYnAARtDwCnKWxzAARtUhMABG0vAKcy0wABA7wIAAoPAARtlwCnLVy4AwACLO0nAARt7IR7AARuAwABZZAIAAieZrhbAARuUgcABG47AKcpbg7CexgA+A07AARu7wAEbwAAAg7BgnqsBFsABG8iBwAEbwsApyluDsJ7GQUPAARvUIRbAARvhhcABG9zAKc04nWyeuT4BScABG/IiIiIiHsABG/bAAFlkAgACJ4CnhcAB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tW/AKtiKg7CexkAewAK1hsAAWWQCAAInmYOBwAK1lcAq2J8AwAK1hsACtZ4ATsACta7AArW3AADAAED8YMAAizQBHMACtbkuwABBzgEAAYDAArXQwCrYigDAAFidPYjAArXcwCrYihzAArXtgsACteTAKtjuwABBJQIAAoDAArX/wCrYii4AwACLOj0cwAK2GhbAArYRLqhvwABX8qJlAQABgcACtivAKtifAMAAV6BKwAK2OgEcwAK2QS7AAEHPAQABgMACtlrAKtiKAMAAWJ8GwABYn4EAwAK2acACtm/AArjxAADAAEHPAAAAAQPAAraHwAK48QAAAAEBAcACto4AAACSTmCeqwAAYJ6rAT4BQ8ACtpspPglOwAK2tsACtrsAAIOwYJ6rARbAArbDgMACtr3AKtm9g7Cexk7AArbWwAK23AAAgJZgwAD9tgEWwAK244HAArbewCrZ2p1vnspJwAK29iIhHsACtvvAAPWxAgACgsACtwXAKtn9J5nvAAAhHsACtxbAAPWxAgACgsACtyDAKtn9J5mDAD4BSsACtzgBgMACtz/AKtm9Pz0cwAK3wy7AAEC3AgACgcACt+PAKtnaasACt+9dkWABYQFgnqtgkUnAAIjpAMAAWMZJwAK4Dx7AArgTwABZZAIAAieZ4RbAArgmgcACuCHAKtnag7CexgA+AT2JwAK4N8Aq2doWwAK4Q4HAArg+wCrZ2oOwnsY/TsACuGDAArhpAADAAED8YMAAizQBHMACuGsuwABBzgEAAYHAAriCwCrZ2gDAAFidPYjAAriPwCrZvRzAArigg8ACuJfAKtrmwABA/QEAAYHAAripwCrZ2gDAAIs+PYnAAri2wCrZ2hbAArjDgMACuL3AKtm9g7Cexj2KwAK4z8Aq2f0WwAK43IHAArjXwCrZ2p1vnsoGwABYoIEAwAK5XsACuWPAArw6AADAAEHRAAAAAQPAArl5wAK8OgAAAAEBAcACuYAAAACSTmCeqwAAYMAA+goBPgJJwAK5jRbAArmXgMACuZHAKtumnOieuj4DScACua0ewAK5scAAWWQCAAInYxbAArnFgMACub/AKtumg7CexgA+A07AArnpwAK58wAAnuJgwACLQQEewAK59cAAizIBAAGAwAK6C8Aq26YAScACuhscwAK6KYHAArofwCrb/kgBAAFqwAK6LGDAAItBwAD/ngDAAP0pPgFKwAK6SgEqPz2IwAK6asAq26YcwAK6fIHAArpywCrb/pYpAQABgMACuoHAKtumAMAAi0k/PYjAArqXwCrbphbAArqlgMACup/AKtumg7CexknAArqxHsACurXAAFlkAgACJ4PXgMACusPAKtumAD4CPYjAArrVwCrbphbAArrsFsACuuOAwAK63cAq26adDZ64g7CexkrAArr6ASIiIh7AArsBwABZZAIAAieZroDAArsPwCrbpgABHsACuyXAAFlkAgACJ5mvgMACuzTAKtumAAEewAK7SsAAWWQCAAInmamAwAK7XMAq26YAAR7AArtywABZZAIAAieZp4DAAruDwCrbpgBJwAK7mB7AArucwABZZAIAAieZr4DAArurwCrbpgA+AUrAArwLASk/P0rAArwqASoGwABYoYEAwAK8hMACvInAAr05AADAAEHFAAAAAQPAAryewAK9OQAAAAEBAcACvKUAAACSTmCeqwAAYMAA+goBPgFKwAK8sgEiIiIewAK8ucAAWWQCAAInma6AwAK8x8Aq3bMAAR7AArzZwABZZAIAAieZr4DAArzowCrdswABHsACvPrAAFlkAgACJ5mpgMACvQzAKt2zAAEewAK9HsAAWWQCAAInmaeAwAK9L8Aq3bMABsAAWKKBAMACvT7AAr1EwALAywAAwABBkQAAAAEDwAK9bsACwMsAAAABAQHAAr17AAABamCeqwAAYJ6rAT4ETsACvY7AAr2ZAAC/UGCeqwEWwAK9oYDAAr2bwCreZYOwnsZAHsACvbLAAFlkAgACJ4QngcACvcTAKt55AMACvbLAAr3PAEnAAr3WIR7AAr3bwACKsQEAARbAAr3xgcACvebAKt55g7CexgA+A07AAr4JwAK+EgAAwABA/GDAAIs0AR7AAr4UwACLMQIAAoHAAr4gwCreeSoAScACvjocwAK+R4LAAr4+wCre5kgBAAFqwAK+SmDAAIs0wAD+xwDAAP0pPgROwAK+YsACvmcAAIOwYJ6rARbAAr50gcACvmnAKt55g7CexknAAr6CIRbAAr6Mg8ACvofAKt8+nOieuj4BSsACvqYBHMACvq0uwABBkwEAAYDAAr7GwCreZQDAAFhyPz2LwAK+4MAq3z4WwAK+7IPAAr7nwCrfPoOwnsZJwAK++iEiIiIiHsACvwDA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A1vpAADAAEFjAAAAAQPAA1SxwANb6QAAAAoKCsADVL8AAACSTmCeqwDAA1TSAAAAwABBP2CeqwDAA1TrAAAAvztgnqsAwANVBgAAAKDzYJ6rAMADVR8AAACg9GCeqwDAA1U7AAAAoPVgnqsAwANVUgAAAKD2YJ6rAMADVW8AAADAAEEUYJ6rAMADVYoAAADAAED8YMAAizQAwANVoAAAAL6iYJ6rAABgnqsBPgZOwANVtsADVbsAAIOwYJ6rARbAA1XDgMADVb3AKztMg7Cexk7AA1XUwANV2gAAgJZgwAD9tgEWwANV4RTAA1XcwCs73goAnW+eyknAA1XzHsADVffAAPWxAgACFMADVgHAKzwBCwAnmdUAPgFKwANWGgEcwANWIS7AAEH3AQABFMADVjvAKzveCgAAwABYyknAA1ZNHsADVlHAAPWxAgACFMADVlvAKzwBCwAnnSEAPgFKwANWcwEcwANWei7AAEH4AQABFMADVpPAKzveCgAAwABYy0nAA1alHsADVqnAAPWxAgACFMADVrPAKzwBCwAnhnsAPgFKwANWzgEcwANW1S7AAEH5AQABFMADVvHAKzveCgAAwABYzEnAA1cDIhbAA1cMFMADVwfAKzveCgCdbp6+ABzAA1coFsADVx8UwANXGsArO94KAJ0NnrhIAQABKwDAAP0pPgFKwANXOQEcwANXQC7AAEFiBwAHgcADV2DAKztZgsADV23AKztog8ADV4bAKzt1hMADV5PAKzuChcADV6PAKzuPhsADV67AKzuch8ADV7/AKzupAMAAWMI/ScADV9ciIiIhHMADV+QUwANX28ArO8kJAEgBAAErAMAA/SkBHsADV/fAAPWxAgACFMADWAHAKzwBCwAng9cAAR7AA1gYwAD1sQIAAhTAA1giwCs8AQsAJ5mvAAEewANYOsAA9bECAAIUwANYRMArPAELACeZrgA+AT2IwANYWcArO0wcwANYYS7AAEFhCgAKgcADWHjAKztZgsADWI/AKztog8ADWKjAKzt1hMADWL/AKzuChcADWNnAKzuPhsADWO7AKzuch8ADWQnAKzupFMADWR/AKzu4CAAUwANZM8ArO8kJABbAA1lNgMADWUfAKztMg7CexgDAAFheScADWV8cwANZaYDAA1ljwCs7TEgBAAGBwANZbMArO1kAwAD9KT4DPRzAA1nPLsAAQLcCAAIUwANZ78ArO94KAGrAA1n7XZFgAWEBYJ6rYJFJruoAwABYxj0cwANaKBbAA1ofLqhvwABX8r7nAQABFMADWjzAKzveCgAAwABXWUnAA1pJIR7AA1pOwAD1sQIAAhTAA1pYwCs8AQsAJ4bAAD4BPYjAA1qTwCs7TBTAA1qbwCs73goAPz4BPYjAA1q8wCs7TBzAA1rELr7mCgAKgcADWtvAKztZgsADWvLAKztog8ADWwvAKzt1hMADWyLAKzuChcADWzzAKzuPhsADW1HAKzuch8ADW2zAKzupFMADW4LAKzu4CAAWwANbnIDAA1uWwCs7TIOwnsYqAMAAWEU9HMADW8gWwANbvy6ob8AAV/KhAgAAAADAAFdaSsADW9kBgMADW+DAKztMBsAAWMSBAMADXHvAA1yBwANd4gAAwABBfAAAAAEDwANcmcADXeIAAAABAQHAA1ygAAAAkk5gnqsAAGCeqwE+Bk7AA1yzwANcuAAAg7BgnqsBFsADXMCAwANcusArQBKDsJ7GPRzAA1zKLsAAQMYCAAKBwANc4cArQCdqwANc7WCRVMAAe74AwABYxT2JwANdCMArQCccwANdGBbAA10PLsAAQKrAAFf7wABBRQIAAoDAA10twCtAEmrAA10+YJ7zwACxLgDAAIsnPRzAA11XFsADXU4uqG/AAFfyozcBAAGBwANdbMArQCcAwABXukPAA114HMADXX8uwABBPQIAAieGwIHAA12SwCtAJwDAAFhBPgI9iMADXaHAK0ASgcADXanAK0AnPYnAA121wCtAJxbAA13CgMADXbzAK0ASg7CexkrAA13SAYDAA13ZwCtAEgbAAFjFgQDAA13nwANd7MADXswAAMAAQMYAAAABA8ADXgLAA17MAAAAAgICwANeCQAAAJJOYJ6rAMADXhgAAAAiYJFJAABcAT4CPYjAA15nwCtBYx7AA15vwABZZwEAAYDAA16GwCtBYwA9HMADXpsWwANeki6ob8AAV/KiEQMAA4HAA16ywCtBcIDAA167wCtBY4DAA17CwCtBYwDAAFfgBsAAWMaBAMADXtHAA17WwANgBAAAwABAtwAAAAEDwANe9cADYAQAAAACAgLAA18DAAAAkk5gnqsAwANfMAAAAIirXZFgAV4AAQEBYJ6rAAFXwABX7wFgnqtgkUkAAFwBPgI9iMADX4DAK0IEHsADX4jAAFlnAQABgMADX5/AK0IEAD0cwANftBbAA1+rLqhvwABX8qIRAwADHMADX92BwANf1MArQhGIBQEAAYDAA1/rwCtCBACRZIDAA1/zwCtCBIDAA1/6wCtCBADAAFfgBsAAWMeBAMADYAnAA2APwANgsQAAwABAuAAAAAEDwANgI8ADYLEAAAABAQHAA2AqAAAAkk5gnqsAAGCeqwE+AkPAA2A3JcADYESAwANgPsArQtNgoVE+Aj0cwANgZBbAA2BbLqhvwABX8sAAQIABAAEmwANgdQGAwANgdcArQtNgoVEAwABX4T2IwANgg8ArQtMWwANgkYDAA2CLwCtC04OwnsZKwANgoQGAwANgqMArQtMGwABYyIEAwANgtsADYLzAA2ExAADAAECyAAAAAQPAA2DLwANhMQAAAAEBAcADYNIAAACSTmCeqwAAYJ6rAT4CQ8ADYN8lwANg7IDAA2DmwCtDhmChUT4BPYjAA2EDwCtDhhbAA2ERgMADYQvAK0OGg7CexkrAA2EhAYDAA2EowCtDhgbAAFjJgQDAA2E2wANhPMADYskAAMAAQMkAAAABA8ADYVvAA2LJAAAAAQEBwANhYgAAAJJOYJ6rAABgnqsBPgVOwANhdcADYXoAAIOwYJ6rARbAA2GCgMADYXzAK0QJg7Cexj0cwANhjC7AAEC3AgACgcADYbXAK0QeIx7AA2HDwABZZAIAAieWnoHAA2HRwCtEHgBqwANh612RYAFhAWCeq2CRScAAiOlqwANiF12RYAFhAWCeq2CRSa+BAV2RYAFhAWCeq2CRSQDAAFjGScADYjkewANiPcAAWWQCAAInma6BwANiS8ArRB4APgE9icADYlrAK0QeHMADYmEuvnUBAAGAwANic8ArRAkAwABYsj89HMADYo4WwANihS6ob8AAV/K+ggEAAYHAA2KvwCtEHgDAAFd9SsADYroBgcADYsHAK0QeBsAAWMqBAMADYs7AA2LUwANl9AAAwABB9wAAAAEDwANi7cADZfQAAAABAQHAA2L0AAAAkk5gnqsAAGCeqwE+BkAewANjCMAAWWQCAAInmdWAwANjGsArRU8AwANjCMADYyAAPRzAA2MnLsAAQMYCAAKAwANjPsArRU9qwANjS2CRVJJbAMAAWMU9HMADY24WwANjZS6ob8AAV/K+5wEAAYDAA2OCwCtFTwDAAFdZTsADY5TAA2OZAACDsGCeqwEWwANjoYDAA2ObwCtFT4OwnsZJwANkdxbAA2SAgcADZHvAK0XSnOieuj4DPYjAA2SvwCtFT4HAA2S3wCtF0j2JwANkw8ArRdIWwANk0IDAA2TKwCtFT4OwnsZJwANlZCIewANlaMAAWWQCAAInma6BwANldsArRdIAACEcwANljRbAA2WEgcADZX/AK0XSnQ2euEgBAAErAMAA/Sk+AT2IwANlu8ArRU8WwANlyIHAA2XDwCtF0p0Nnrg/P0rAA2XkAYDAA2XrwCtFTwbAAFjLgQDAA2X5wANl/8ADaTkAAMAAQfgAAAABA8ADZhfAA2k5AAAAAQEBwANmHgAAAJJOYJ6rAABgnqsBPgZAHsADZjLAAFlkAgACJ50hgMADZkPAK0bZAMADZjLAA2ZJAD0cwANmUC7AAEDGAgACgMADZmfAK0bZasADZnRgkVStMADAAFjFPRzAA2aWFsADZo0uqG/AAFfyvucBAAGAwANmqsArRtkAwABXWU7AA2a8wANmwQAAg7BgnqsBFsADZsmAwANmw8ArRtmDsJ7GScADZ54WwANnp4HAA2eiwCtHXJzonro+Az2IwANn1cArRtmBwANn3cArR1w9icADZ+nAK0dcFsADZ/aAwANn8MArRtmDsJ7GScADaAIiHsADaAbAAFlkAgACJ5mugcADaBTAK0dcAAAhHMADaCsWwANoIoHAA2gdwCtHXJ0NnrhIAQABKwDAAP0pPgE9iMADaQDAK0bZFsADaQ2BwANpCMArR1ydDZ64Pz9KwANpKQGAwANpMMArRtkGwABYzIEAwANpPsADaUTAA2rfAADAAEH5AAAAAQPAA2lfwANq3wAAAAEBAcADaWYAAACSTmCeqwAAYJ6rAT4EQB7AA2l6wABZZAIAAieGe4DAA2mOwCtIYwDAA2l6wANplAA9HMADaZsuwABAxgIAAoDAA2mywCtIY2rAA2m/YJFUwACHNADAAFjFPRzAA2nkFsADadsuqG/AAFfyvucBAAGAwANp+MArSGMAwABXWUrAA2rPAYDAA2rWwCtIYwbAAFjNgQDAA2tNwANrU8ADa+AAAJYjAAAAAQPAA2tXwANr4AAAAAICAsADa2MAAACfQGCd1gDAA2t1AAAAnQRgnqsAAGCeqwE+Az0cwANrkIDAA2uFwCtJIJ1wAQABgcADa5jAK0ktAJ5zPRfAA2uygMADa6fAK0kgnQ2BwANrvcArSS2d3krAA2vLAYDAA2vSwCtJIAbAAFjOgQDAA2wswANsMsADbi8AAKFGAAAAAQPAA2xIwANuLwAAAAEBAcADbE8AAACSTmCeqwAAYJ6rAT4EScADbZohHMADba0WwANtpIDAA22ewCtJtpzynslIAQABKwDAAP0pPgFKwANtvgEWwANty4DAA23FwCtJtpzynsk/TsADbeXAA23sAACam2CeqwEewANt8p6xAQABHMADbfyUgcQAAAAAwAD78wA9F8ADbgyBwANuBcArSg2DsIDAA24TwCtJtp7OSsADbh4BgcADbiXAK0oNBsAAWM+BAMADbqnAA26vwANwqAAAwABB+gAAAAEDwANuusADcKgAAAABAQHAA27BAAAAkk5gnqsAAGCeqwE+BU7AA27UwANu3QAAnzFgnqsBFsADbuWAwANu38ArSo+c457ITsADbwLAA28KAACfh2CeqwErTsADbxvAA28nAADAAEH7YMAA+goBKkPAA280IRzAA29EgcADbzvAK0qkSAEAASsAwAD9KT4DTsADb1zAA29jAACCXmDAAP22ARbAA29ugcADb2XAK0qkgl6exUnAA298HMADb4eEwANvgMArSw+B1gEAASe/WQDAAP3IPgFJwANvpCGDwANvqcArStk+Aj2KwANvwsArSseBwANvzMArSqQ9i8ADb+DAK0rZKT9JwANwCxzAA3AWhMADcA/AK0sPgdYBAAEnv1gAwAD9yD4CPYrAA3AzwCtKx4HAA3A9wCtKpD2LwANwT8ArStkqPz2JwANwcsArSqQWwANwhoHAA3B9wCtKpIOwnsZKwANwlgGCwANwncArSscGwABY0IEAwANxa8ADcW/AA3IyAADAAEH8AAAAAQPAA3GFwANyMgAAAAEBAcADcYwAAACfh2CeqwAAYMAA+9ABPgFKwANxmwEjHMADcbEWwANxqoDAA3GiwCtMHYJensWB1gEAASe/WQDAAP3IHMADcc0uwABB/QEAAYDAA3HxwCtMHQDAAFjSHMADcgQuwABB/gEAAYDAA3ImwCtMHQDAAFjRAWDAAPvQBsAAWNGBAMADcq/AA3KzwAN2cAAAwABB/gAAAAEDwANy1MADdnAAAAAB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wAOQpcADkKgAAMAAQgdgwAD70AEcwAOQsoDAA5CqwCthM4QLAQABg8ADkL3AK2GCAMAA/cRJwAOQySIcwAOQ0ITAA5DNwCth3EgBAAE3KADAAPzzARzAA5DehMADkNvAK2HcSAEAATc6AMAA/PM+AUrAA5DvASk/Q8ADkQYewAORDcAAWWwBAAGEwAORGsArYdwAPgM9i8ADkSfAK2GCHMADkTWDwAORL8ArYYJkAQABlADAAPz1ScADkUAcwAORSoPAA5FEwCthgoFtAQABgsADkU3AK2FdAMAA/QA+AUrAA5FfASo/PYzAA5F7wCth3BzAA5GIgMADkYDAK2EzhAsBAAGDwAORk8ArYYIAwAD9xErAA5GlARzAA5GvhMADkazAK2HcSAEAATdbAMAA/PMAACk21AApNxIAKTeGACk39wApOGgAKTi1ACk5BQApOVQAKTmkACk9HwApQdgAKUKNAClHbQApSKIAKUl4AClLegApU5IAKVTGAClWzwApWL0AKV96AClgogApZG0AKWXSAClnNAApaQQAKWoKAClrEAApbFIAKW3fAClvWgApcHIAKXJqAClzjgApdjEAKXb2ACl6zAApfHoAKX10ACmAGwApgRgAKYGYACmCvAApg+IAKYRiACmKYQApi1kAKZ64ACmiwwApps4AKafCACmodwApqYEAKanrACmuwwApsR4AKbMiACm0sgAptjoAKbzYACm+KQApv6cAKcH3ACnCwgApx44AKchHACnJ9wApz0AAKdCaACnSDQAp04MAKdQwACnUqAAp1UMAKeKVACnppQAp7lYAKe/WACnyowAp890AKfSZACn4cwAp/94AKgNzACoEEwAqBfEAKgdOACoIrAAqCeEAKgtEACoMXQAqDR0AKg5lACoP0wAqEUoAKhGtACoTbwAqFC4AKhSmAComHgAqMYgAKjhgACo7wQAqPOkAKj44ACpAiQAqQYUAKkPmACpFLQAqSZwAKlLDACpUVAAqVg4AKlj/ACpaMQAqZJ8AKmZAACpoQwAqaTsAKmshACpr3QAqbxEAKm/BACpxRAAqfN0AKn3qACqCZQAqh+oAKo0ZACqU/gAqmIgAKpncACqamAAqmwIAKpwLACqdrQAqn5cAKqXBACqt8AAqr7sAKrM6ACq08wAqt1IAKrhsACq6lAAqu78AKrzUACrAxAAq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f4EIg6eDpwYpAF3AAPx0AWDAAFl6AWoAXcAA/HQBYMAAWXrAAQjbBMAAWYCBCIO1g7UGhZcAYMAAWXoBagBgwABZesAAuCMEwABZgYEIg8KDwgbAAEJPAGDAAFl6AWoAYMAAWXrAAQb3BMAAWYKBCIPIg8gGwABCUABgwABZegFqAGDAAFl6wAC6dATAAFmDgQiD1oPWBoYPAGDAAFl6AWoAYMAAWXrAALfvBMAAWYSBCIPfg98GwABCUQBgwABZegFqAGDAAFl6wADX+gTAAFmFgQiD7oPuBsAAQlIAYMAAWXoBagBgwABZesABBxAEwABZhoEIhAGEAQa+wgBgwABZegFqAGDAAFl6wAD6XgTAAFmHgQiEEIQQBsAAQlMAYMAAWXoBagBgwABZesABByoEwABZiIEIhByEHAa+swBgwABZegFqAGDAAFl6wAD6ggTAAFmJgQiEL4QvBsAAQlQAYMAAWXoBagBgwABZesABB0QEwABZioEIhE6ETgbAAEJVAGDAAFl6AWoAYMAAWXrAAQdeBMAAWYuBCIRxhHEGwABCVgBgwABZegFqAGDAAFl6wAEHeATAAFmMgQiEjISMBsAAQlcAYMAAWXoBagBgwABZesABB5QEwABZjYEIhMKEwgbAAEJYAGDAAFl6AWoAYMAAWXrAANgSBMAAWY6BCITUhNQGwABCWQBgwABZegFqAGDAAFl6wAD6mgTAAFmPgQiE4ITgBsAAQloAYMAAWXoBagBgwABZesABB7AEwABZkIEIhPiE+AaFZQBgwABZegFqAGDAAFl6wAC5jwTAAFmRgQiFBoUGBsAAQlsAYMAAWXoBagBgwABZesABB8wEwABZkoEIhReFFwaFQQBgwABZegFqAGDAAFl6wAC5UQTAAFmTgQiFK4UrBqKZAGDAAFl6AWoAYMAAWXrAAPuQBMAAWZSBCIU/hT8GwABCXABgwABZegFqAGDAAFl6wAC7AATAAFmVgQiFT4VPBsAAQl0AYMAAWXoBagBgwABZesABB+gEwABZloEIhWmFaQbAAEJeAGDAAFl6AWoAYMAAWXrAAQgEBMAAWZeBCIWChYIGq5YAYMAAWXoBagBgwABZesAAuiMEwABZmIEIhZCFkAa+ugBgwABZegFqAGDAAFl6wAD7KgTAAFmZgQiFooWiBqEUAGDAAFl6AWoAYMAAWXrA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YIMUAUrAAETwARbAAEUGFsAARPwWwABE8C6AicAAWmaHYZtOmtCclwbAAFprgQrAAEUYwABFLsAARVoBAJrFAWrAAEUZYMAA/RwCAAABA8AARTjAAEVaAAAAAAAAAGCDFAFKwABFOwEWwABFURbAAEVHFsAARTsugInAAFpmh2GbTprFnKgGwABabYEKwABFX8AARXDAAEXfAAC92AFqwABFYGDAAP0cAgAAAQPAAEV9wABF3wAAAAICAsAARY0AAACsp2DAAFPHAMAARaIAAACGf2CIswAAXAE+AT0cwABFuxbAAEWvLoCJwABaZr3YAgACgMAARcnALAtXgcAARdXALAtmAMAAU+oGwABaboEKwABF5MAARfXAAEZkAAC91wFqwABF5WDAAP0cAgAAAQPAAEYCwABGZAAAAAICAsAARhIAAACsp2DAAFPHAMAARicAAACGfmCIswAAXAE+AT0cwABGQBbAAEY0LoCJwABaZr3XAgACgMAARk7ALAvbgcAARlrALAvqAMAAU+kGwABab4EKwABGacAARnzAAEceAACbCQFqwABGamDAAP0cAgAAAQPAAEaOwABHHgAAAAMCAsAARpUAAACEjGCDFADAAEaiAAAAgL1giH4AAcAARq4AAACbBmDAAPoKAWrAAEa2YMAA+goAYINZAT4BSsAARsQBHMAARuoWwABG1xbAAEbLLoCJwABaZodlpjubCQMAAoDAAEb9wCwMX4HAAEcFwCwMbAGbBoLAAEcTwCwMeputBsAAWnCBCsAARyPAAEc9wABHuQAAhWwBasAARyRgwAD9HAIAAAEDwABHUMAAR7kAAAACAgLAAEdfAAAAgpBgiO4AwABHawAAAITmYIMUAABgiO4BPgFKwABHfQEcwABHkBbAAEeELoCJwABaZoVsAgACgMAAR6TALA0UgcAAR6rALA0hAKY9BsAAWnGBCsAAR77AAEfYwABIHwAAhgcBasAAR79gwAD9HAIAAAEDwABH4sAASB8AAAABAQHAAEfsAAAAgpBgiLMAAGCI7gE+AUrAAEf4ARzAAEgLFsAAR/8ugInAAFpmhgcBAAGAwABIFsAsDZsAm2oAACwJqgAsCggALApmACwKxAAsCyIALAumACwMKgAsDN8ALA1mACwN1wAAAAkCwABadIEKwABJGcAASR/AAEqTA8AAQqUAAAFg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yYFtAQABFsAASdkWwABJ0S6ZRMAAXCymEMAAW9QAwAD9AD4BPY7AAEnrwCzElpM/TsAASgzAAEoUAACEMWDAAPvQAZNOwABKIsAASioAAMAAQ1RgwAD6CgEqPRzAAEo/FsAASjcumUTAAFwspRcCAAInhDEywABKT2DAAP22WwInrwgkwABKXgGAwABKW8AswLMngO6DwABKacAswiQAwABb2T0cwABKfYXAAEp2wCzD4YP4AQABNMAASoUDwABKhcAATQMAAAACAgLAAEqKAAAAgO5gwAD70ADAAEqVAAAAphBdwAD9ZwFbAABgwAD82QE+A0nAAEqnHMAASrOHwABKq8AsxSFIAQABFsAASr4WwABKti6ZRMAAXCymEMAAW9QAwAD88z4CPRzAAEraFsAAStIumUTAAFwswABDJQAAAADAAFvcPRXAAErwwCzFNQgpP0nAAEsOIhzAAEsiFsAASxsUwABLEsAsxcoKAGHAAMyQSAEAAZQAwAD88wAiHMAAS0OGwABLNcAsxJZIAQABkwDAAPzzASEcwABLU4LAAEtMwCzBCSABAAEWwABLXRTAAEtUwCzFygoAgxnAAPxYAAA+AT0cwABLeBbAAEtwLplEwABcLIRWAgACJ6YQMsAAS4pgwAD9tlsCJ4DuFMAAS5TALMW7CQAnwABDEBbAAEuvFMAAS6bALMXKCgCDGcAA/FgAwABb2j4BPRzAAEvXFsAAS88umUTAAFwshFYDAAMnphAywABL6WDAAP22WwIngO4UwABL88AsxbsJACemEBbAAEwPFMAATAbALMXKCgBhwADMkDTAAEwkA8AATCTAAEziAAAAAAAAAGDAAPzZAT4BPRzAAEw8FMAATDPALMXKCgCD+AEAATTAAExEA8AATETAAEzWAAAAAQEBwABMRQAAAMAAQxBbAABgwAD82QE+AT0cwABMXC7AAENJBQADJ6YQJMAATH8BFMAATHfALMefCwAcwABMhIHAAEyBwCzAxEsBAAEUwABMhcAsx58LAADAAPy5Aq64hsAATKbALMSWwABDVSrAAFxGAMAA/EIAwABb2j2PwABM88AsxSEcwABM+ofAAEzzwCzFIWQBAAGUAMAA/PUAwAD8xEnAAE0KFMAATQ7ALMU1CAA+AT0cwABNJxbAAE0fLplEwABcLMAAQyYAAAAAwABb3T89HMAATUUWwABNPS6ZRMAAXCyCiAEAASeEMQDAAFvbBsAAXEOBEsAATV7AAE1jwABNxQAAwABDNwAAAAEDwABNbcAATcUAAAAAAAAAXAE+AT0cwABNfhbAAE12LplEwABcLMAAQyICAAInwABDVjTAAE2OA8AATY7AAE3AAAAAAAAAAGDAAPzZAT4BPRzAAE2nFsAATaIWwABNmS7AAENDwABcMYNiwAD8x4P4AQABFsAATa8uwABDV8AAXEQAwAD8QgDAAFvXBsAAXESBEsAATcrAAE3PwABOKgAAwABDVwAAAAEDwABN2MAATioAAAABAQHAAE3ZAAAAg9FbAABcAT4CTsAATfTAAE35AADAAENYYMAAXCABHMAATgMWwABN+y7AAENDwABcMUsBAAGAwABOBMAsyWMAwAD8uT0cwABOE4HAAE4OwCzJdMAAQzcBAAEWwABOHi6ZRMAAXCwAwABcJgbAAFxFgRLAAE4vwABOQMAAURcAAMAAQxkBasAATjBgwAD9HAIAAAEDwABOT8AAURcAAAAGBATAAE5QAAAAwABDWVsAwABOXwAAAIHVXcAA/DIBWwDAAE5iAAAAwABDWlsAwABOcQAAAIJKXcAA/DIBWwACwABOfwAAAMAAQxxdwAD8pQJbWwFqAGDAAPzZd8AATooAAADAAEMdXcAA/KUCW1sBagBgwAD82XdcAT4BPRzAAE6gFsAATpgumUTAAFwshFYDAAMnwABDWzLAAE62YMAA/bZbASevCCTAAE7QA4DAAE7CwCzKCyfAAENcgsAATsvALMopNMAATtMDwABO08AAURIAAAAAAAAAYMAA/NkBPgZOwABO48AATukAAMAAQ11dwAD8dAFbARzAAE8WHMAATu2BwABO68AsyhiBpQEAATTAAE7zA8AATvPAAE8UAAAAAQEBwABO9AAAAINNWwAAYMAA+goBSsAATvoBIiEcwABO/IbAAE76wCzLLEgBAAErAMAA/SkAHMAATwmDwABPB8AsyjaDFwEAAYbAAE8SwCzLLADAAPxBAMAA/D6ArQAAAADAAPxITsAATyvAAE80AADAAENeXcAA/HQBWwEcwABPYhzAAE84gcAATzbALMoYgaUBAAE0wABPPgPAAE8+wABPYAAAAAEBAcAATz8AAACDTVsAAGDAAPoKAUrAAE9FASIhHMAAT0eHwABPRcAs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AAABA8AAQs3AAEMkAAAAAQEBwABC2wAAAICWYLybAABcAT4CPRzAAELoLsAARB/AAFzVAQABasAAQwBgwABei8ABD9AAwABdzz0cwABDDS7AAESDwABc1QEAAYDAAEMawC1/VgDAAF3WBsAAXdaBF8AAQynAAEMuwABDiAAAwABEg8AAXNUAAAABA8AAQzrAAEOIAAAAAQEBwABDSAAAAICWYLybAABcAT4BPRzAAENiFsAAQ1Uus2zAAFzVwABds4KKAgACgMAAQ2jALX/dFsAAQ28uwABEhMAAXNXAAF3XAMAAX0kGwABd14EXwABDjcAAQ5LAAESSAADAAESEwABc1QAAAAEDwABDpsAARJIAAAABAQHAAEO0AAAAgJZgvJsAAFwBPgQ9HMAARAsusFkBAAEWwABEI4DAAEQdwC2AWoC9vJ0AwABfvT0cwABELi7AAEQhwABc1QEAARbAAEQ+gMAARDjALYBagKy8oADAAF3VPRzAAERILsAARCHAAFzVAQABFsAARFiAwABEUsAtgFqzX7yeAMAAXdU9HMAARHIuwABEO8AAXNUBAAEWwABEg4DAAER9wC2AWoSpvJ8AwABdygbAAF35gRfAAESXwABEqMAARQ4AALgfAWrAAESYYMAA/RwCAAABA8AARLzAAEUOAAAAAQEBwABEygAAAMAAQ8xgwABdjAAAXAE+AkAhHMAAROaAwABE38AtgT9IAQABKwDAAP0pwABE38AARO0APRfAAET0LsAARBHAAFzVgMAARQTALYE/wABdtgbAAF36gRfAAEUTwABFJMAARbEAALd/AWrAAEUUYMAA/RwCAAABA8AARTnAAEWxAAAAAQEBwABFSAAAAMAAQ8xgwABdoQAAXAE+A0AhHMAARWSAwABFXcAtgclIAQABKwDAAP0pwABFXcAARWsAQBzAAEWIFsAARXkuwABEEsAAXNXAAF23SAEAASsAwAD9KcAARXnAAEWPAD0XwABFli7AAEQSwABc1YDAAEWnwC2BycAAXbcGwABd+4EXwABFtsAARcfAAEbCAACwggFqwABFt2DAAP0cAgAAAQPAAEXfwABGwgAAAAEBAcAAResAAACAlmC7GwAAXAE+AkAhHMAARhcWwABGCC7AAEQSwABc1cAAXbdIAQABKwDAAP0pwABGCMAARh4BJAACJ8AARIUnwABEhj0cwABGmRbAAEaKLsAARBLAAFzVwABdt7CCAgACLoDAAEa4wC2CfgDAAF2kBsAAXfyBF8AARsfAAEbYwABHrwAAsH8BasAARshgwAD9HAIAAAEDwABG6sAAR68AAAABAQHAAEb5AAAAgJZgvcsAAFwBPgJAIRzAAEccFsAARw0uwABEEsAAXNXAAF23SAEAASsAwAD9KcAARw3AAEcjASfAAESHPRzAAEeMFsAAR30uwABEEsAAXNXAAF23sH8CAAIugMAAR6XALYMqAMAAXaMGwABd/YEXwABHtMAAR8XAAEiBAACwgQFqwABHtWDAAP0cAgAAAQPAAEfQwABIgQAAAAEBAcAAR9kAAACAlmDAAJOsAABcAT4CQCEcwABH/BbAAEftLsAARBLAAFzVwABdt0gBAAErAMAA/SnAAEftwABIAwEnwABEiD0cwABIZRbAAEhWLsAARBLAAFzVwABdt7CBAgACLoDAAEh3wC2DzgDAAF2lBsAAXdiBF8AASNTAAEjZwABI6wACwABEFsAAXNUAAAABA8AASN/AAEjrAAAAAQEBwABI5wAAAIPnYMAA/bYAAFwABsAAXdmBF8AASTzAAElBwABJUQACwABEF8AAXNUAAAABA8AASUXAAElRAAAAAQEBwABJTQAAAIPnYMAA/bYAAFwABsAAXdqBF8AASZzAAEmhwABJvQACwABEgcAAXNUAAAABA8AASbLAAEm9AAAAAQEBwABJtwAAAICWYMAA/jcAAFwABsAAXduBF8AASgvAAEoQwABKMgACwABEgMAAXNUAAAABA8AASiTAAEoyAAAAAQEBwABKLAAAAICWYMAA/bYAAFwABsAAXdyBF8AASpTAAEqZwABKtQACwABEIsAAXNUAAAABA8AASqrAAEq1AAAAAQEBwABKrwAAAICWYMAA+9AAAFwABsAAXd2BF8AASwLAAEsHwABLKAACwABEL8AAXNUAAAABA8AASxnAAEsoAAAAAQEBwABLIgAAAICWWwAAXAAAAC1NXgAtT2kALVBGAC1RNwAtUrYALVRCAC1VBwAtVacALVaOAC1XLAAtWAsALViDAC1Y7gAtWioALVqgAC1bHAAtW5IALVwOAC1chAAtXN0ALV1RAC1d5AAtXkEALV7UAC1fZwAtYDoALWCzAC1hEgAtYZcALWI1AC1jHgAtZGUALWYo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wADseQHAAETCasAARMJgwABgicABDnUAPgNOwABE5MAARO0AAIJqYMAAjkIBJsAAROQBHMAARO8uqzIAAAAAwABeIWDAAI5CTsAARQ7AAEUTAACCkGDAAGJPARzAAEUVLocCAAAAAMAAXkJKwABFLQEfwABFOMAAYPACAAKBwABFTsAtuyMmwABFWAGCwABFWMAtu1FgwABi4gABwABFfGrAAEV8YMAAYInAAQ6OAD4DTsAARZPAAEWYAACCkGDAAGJPARzAAEWaLocCAAAAAMAAXkJOwABFxsAARc4AAIPQXcAA/HQBYMAAYLsBHMAARdAuwABD6wABYMAAYLsAAMAAX61KwABF6QEfwABF9MAAYasCAAImwABGBgGBwABGBsAtu7pgwABidoLAAEYMwC273QABwABGM2rAAEYzYMAAYInAAQ6oAD4DTsAARknAAEZOAACCkGDAAGJPARzAAEZQLocCAAAAAMAAXkJOwABGecAARoEAAIPQYMAAYbwBJsAARnkBHMAARoMur4kAAAAAwABeU2DAAGG8SsAARpsBH8AARqbAAGoXAgACJsAARswBgcAARszALbxTYMAAYnaCwABG0sAtvHYAAcAARvlqwABG+WDAAGCJwAEOwgA+Bk7AAEcPwABHFAAAgpBgwABiTwEcwABHFi6HAgAAAADAAF5CTsAAR0DAAEdIAADAAER0YMAAYZwBJsAAR0ABHMAAR0our4kAAAAAwABeU2DAAGGcTsAAR3bAAEd9AAApXcAA/HQBYMAAYLsBHMAAR38uwABD6wABYMAAYLsAAMAAX61OwABHpsAAR7EAAMAARHVgwABguwEcwABHsy7AAEPoAAAAAMAAX6xOwABH1sAAR+UAALDiYMAA+goBHMAAR+curuwAAAAAwABeSkrAAEf7AR/AAEgGwABqLAUABSbAAEg5AYHAAEg5wC286mDAAGJ2gsAASD/ALb0Ng8AASEjALb09hMAASFDALb1shcAASFzALb2TAAHAAEiKasAASIpgwABgicABDtwAPgNOwABIrcAASLIAAIKQYMAAYnYBJsAASK0BHMAASLQuhwIAAAAAwABeQmDAAGJ2TsAASOzAAEjzAACEg13AAPylAmC8yWDAAGC7ARzAAEkBLrOXAQJgvMlgwABguwE0wABJPAPAAEk8wABJYwAAAAEBAcAASUoAAACCZmC8twAAYMAAYLsBSsAASVUBHMAASVUur4kAAAAAwABeUwDAAF+hSsAASW4BH8AASXnAAGIcAgACgcAASZLALb4XgsAASZjALb5FAAHAAEm+asAASb5gwABgicABDvYAPgNOwABJ1cAASeUAALM5YMAAYk8BHMAASecuhwIAAAAAwABeQk7AAEoIwABKDQAAgpBgwABiTwEcwABKDy6HAgAAAADAAF5CSsAASicBH8AASjLAAGGbAgACgcAASkTALb7yJsAASlUBgsAASlXALb8VYMAAYnYAAcAASnlqwABKeWDAAGCJwAEPEAA+A07AAEqfwABKrQAAhRddwAD8dAFgwABiTwEcwABKry7AAEPgAAAAAMAAX5pOwABK1sAASt8AAIJqYMAAYLsBHMAASuEur4kAAAAAwABeU0rAAEr5AR/AAEsEwABiLAIAAoHAAEsfwC2/fibAAEsuAYLAAEsuwC2/qWDAAGDgAAHAAEtWasAAS1ZgwABgicABDywAPgFKwABLbAEfwABLd8AAYkkAAAAAAcAAS6hqwABLqGDAAGCJwAEPSAA+Ak7AAEvJwABLzQAAmcJgvKUBHMAAS88umL8AAAAAwABeH0rAAEvkAR/AAEvvwABh3wEAAYHAAEwIwC3AOwABwABMK2rAAEwrYMAAYInAAQ9kAD4DTsAATFLAAExbAACF/2DAAGC7ARzAAExdLq+JAAAAAMAAXlNOwABMgMAATIUAALL4YLsbARzAAEyHLrB7AAAAAMAAXllKwABMqgEfwABMtcAAYj0CAAKBwABM0cAtwI6CwABM28AtwLEAAcAATP9qwABM/2DAAGCJwAEPfgA+Ak7AAE0owABNNgAAtN9gvcsBHMAATTgusHcAAAAAwABeWkrAAE1VAR/AAE1gwABh/wEAAYHAAE1+wC3BDQABwABNq2rAAE2rYMAAYInAAQ+YAD4BSsAATcABasAATc1gwABiAMAA7IABwABOBmrAAE4GYMAAYInAAQ+0AD4CTsAATijAAE4tAACAvWDAAJZNASbAAE4oARzAAE4vLrB6AAAAAMAAXltgwACWTUrAAE5FAR/AAE5QwABh7wEAAYHAAE5kwC3BigA9MMAATnUfwABOf8AA+2IBAAEkwABOuQMnwABEx4DAAE6ywC25MieBagAGwABeNYEYwABOw8AATs/AAFQf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AEihwABJ7gAAAAPAAEixwABJ7gAAAAMDA8AASMcAAACCkGDAAGJ2AMAASOEAAACDYl3AAPx0AWDAAGC7AMAASPsAAAApXcAA/HQBYMAAYLsAAGDAAGG8AT4BQBzAAEnZFsAASdKBwABJzcAu9BRhwAD8o0gBAAEWwABJ44LAAEncwC70KWHAAPyjAMAA/PPAAEnNwABJ6QAECADAAGG+gcAASRfALvQUCADAAGG/gsAASTPALvQpCADAAGHAHsAASVuB8wIAAoLAAElxwC70KR7AAEmBgfMCAAKBwABJisAu9BQewABJmIHxAQABgMAASaPALvQFAAAACQDAAEm0wABhjAEAAYDAAEm6wC70BQAJBsAAYcSBI8AASfPAAEoIwABKFQEAq1YBasAASfRgwAD9HAIAAAEDwABKDsAAShUAAAAAAAAAYMAA+goBSsAAShEBKQbAAGHIgSPAAEoawABKNMAATAUDAEgBasAAShtgwAD9HAIAAAEDwABKNsAATAUAAAABAQHAAEo7AAAAg9ZbAABgwAD6CgE+CEnAAEpIHsAASkzAAPWxAgACLoDAAEpcwC71dABKwABKZAEpP0nAAEp1ISXAAEp/gMAASnnALvV0YMAAYbxKwABKlQEqP07AAEq4wABKwQAAwABFtmDAAGG8ASbAAEq4AYDAAErDwC71dGDAAGG8ScAASs4hHMAAStsWwABK0i6DwcAAYcBIAQABFsAASueBwABK3sAu9c6DwcAAYcAAwAD880rAAErxASo/ScAASwMhHMAASwwWwABLBy6CkMAAYYRIAQABFsAASxWAwABLD8Au9XSCkAAAwABiiErAAEsbASo/ScAASy0hHMAASzgWwABLMS5hwABhxUgBAAEWwABLQYDAAEs7wC71dGEAAMAA/PNKwABLSQEqP0XAAEtbAcAAS2TAAEtmAABiYMAA+9ABkwEcwABLbYLAAEtrwC72qGMBAAEWwABLby5hwABhxQDAAPz9AYrAAEt3wC72qBzAAEt4gsAAS3fALvaoZAEAAZQAwAD89T4CScAAS4QhHMAAS5AcwABLjBbAAEuILoNiwABhvksBAAGCwABLjcAu9qgAwAD8g0gBAAEcwABLoBbAAEucgcAAS5PALvXOg2LAAGG+SwEAAYLAAEuhwC72qADAAPyDAMAA/SlKwABLpQEqP0nAAEu5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aRbAAEVaLrPCwABi5YHUAQABNMAARW0DwABFbcAARZEAAAABAQHAAEVuAAAAgpBgwABiTwAAYMAA+goBSsAARXcBFsAARXyAwABFd8AvWga7psAAYlwAwAD8RwEcwABFtRbAAEWeLrPDwABi5oHUAQABNMAARbkDwABFucAARd0AAAABAQHAAEW6AAAAgpBgwABiTwAAYMAA+goBSsAARcMBFsAARciAwABFw8AvWma7psAAYlwAwAD8RwEcwABF/hbAAEXqLrPEwABi6IHUAQABNMAARgIDwABGAsAARiYAAAABAQHAAEYDAAAAgpBgwABiTwAAYMAA+goBSsAARgwBFsAARhGAwABGDMAvWsa7psAAYlwAwAD8RwbAAGLvgSTAAEYwwABGQcAAR7wAAMAARdIBasAARjFgwAD9HAIAAAEDwABGVMAAR7wAAAABAQHAAEZVAAAAgaZhAWDAAGKiWwAAXAE+BT0cwABGhxbAAEZ5LqJawABi6YP4AQABNMAARo8DwABGj8AARroAAAABAQHAAEaQAAAAgpBgwABitAAAXAFKwABGmQEcwABGpBbAAEaegcAARpnAL1t0hWnAAGK6wABF0gEAAYDAAEa4wC9bMgDAAGJgAMAA/EI9HMAARswWwABGwS6FNMAAYuTAAEXSAQABgMAARuDAL1syAMAAYmA9HMAARvcWwABG6C6zwsAAYuWD+AEAATTAAEb/A8AARv/AAEckAAAAAQEBwABHAAAAAIKQYMAAYk8AAFwBSsAARwkBHMAARw6BwABHCcAvXBHAAEXSAQABgMAARyLAL1syAMAAYmAAwAD8Qj0cwABHQhbAAEcrLrPDwABi5oP4AQABNMAAR0oDwABHSsAAR28AAAABAQHAAEdLAAAAgpBgwABiTwAAXAFKwABHVAEcwABHWYHAAEdUwC9cfMAARdIBAAGAwABHbcAvWzIAwABiYADAAPxCPRzAAEeKFsAAR3Yus8TAAGLog/gBAAE0wABHkgPAAEeSwABHtwAAAAEBAcAAR5MAAACCkGDAAGJPAABcAUrAAEecARzAAEehgcAAR5zAL1znwABF0gEAAYDAAEe1wC9bMgDAAGJgAMAA/EIGwABi8YEkwABHwcAAR9LAAEp5AADAAEXRwABiSgFqwABHwmDAAP0cAgAAAQPAAEfswABKeQAAAAEBAcAA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wABH88AAZOoAP0rAANbyARzAANb5Lq9XAQABFsAA1xyAwADXFMAwJXSEQ7zGAMAAZEMGwABkPoEmwADXLcAA1zTAANeWAACvgwAAAAEDwADXSMAA15YAAAABAQHAANdVAAAAliBgvKUAAGDAAP22AT4BSsAA12QBHMAA12sur4IBAAEWwADXioDAANeCwDAmJIRDvKcAwABkQgbAAGQ/gSbAANebwADXucAA2CMAAK9aAWrAANecYMAA/RwCAAABA8AA19HAANgjAAAAAQEBwADX3gAAAJYgYLylAABgwACVrgE+AUrAANftARzAANf0Lq9XAQABFsAA2BeAwADYD8AwJpeEQ7ynAMAAZEMGwABkQIEmwADYKMAA2C/AANjhAACvhAAAAAEDwADYQsAA2OEAAAABAQHAANhKAAAAliBgvJEAAGDAAP22AT4CScAA2FklwADYZYDAANhdwDAm/2C8rD4BSsAA2H8BHMAA2IYur4IBAAEWwADYpRTAANidwDAm/wABYLyshEO8rgDAAGRCP0rAANi5ARzAANjALq+DAQABJsAA2NUBgMAA2NXAMCb/YLylAMAAZD4GwABkQYEmwADY5sAA2QTAANnCAACvXAFqwADY52DAAP0cAgAAAQPAANkbwADZwgAAAAEBAcAA2SMAAACWIGC8kQAAYMAAla4BPgJJwADZMiXAANk+gMAA2TbAMCe4YLysPgFKwADZWAEcwADZXy6vVwEAARbAANmCFMAA2XrAMCe4AAFgvKyEQ7yuAMAAZEM/SsAA2ZYBHMAA2Z0ur1oBAAEmwADZtgGAwADZtsAwJ7hgvKUAwABkPwbAAGRCgSbAANoEwADaC8AA24cAAK+CAAAAAQPAANohwADbhwAAAAEBAcAA2jAAAACEQ2C8lgAAYMAA/bYBPgRJwADaPxzAANpLgMAA2kPAMChmSAEAARbAANpeFsAA2k4us7/AAGOuwABj8LDSuEoAwAD9KUrAANpzASesED9OwADah8AA2osAAICsYMAA/jcBFsAA2pWAwADajcAwKGalGLyYScAA2qccwADathbAANqvgcAA2qvAMCi8gbrAAP49SAEAASeHaADAAP3FPgNJwADayRzAANrWFsAA2tGBwADazcAwKLxOwAD+QkgBAAEnsKIAwAD9xUrAANrhASfAAEdMP0nAANrzHMAA2wAWwADa+4HAANr3wDAovE7AAP5CgdYBAAEngLUAwAD9yErAANsRASfAAEdJP0rAANsjASeacj9KwADbOQEcwADbURrAANtAwABjuEsBAAEcwADbaBbAANtfFsAA21qAwADbUsAwKGaAvbyTg8HAAP27la4BAAEWwADbfBrAANtqwABjuGHAAPyjAMAA/PgAwAD8gwbAAGRDgSbAANuMwADbqsAA3CMAAK9XAWrAANuNYMAA/RwCAAABA8AA28TAANwjAAAAAQEBwADb0wAAAIRDYLyWAABgwACVrgE+AUrAANviAR/AANvtwACVtwEAARzAANv/Lq+CAQABgMAA3BbAMCoSAMAAZEIABsAAZESBJsAA3CjAANw/wADdNAAAr0cBasAA3ClgwAD9HAIAAAEDwADcUsAA3TQAAAABAQHAANxfAAAAliBgvMkAAGDAAJTtAT4DQCIWwADcfYDAANx1wDAqiYd6vLoBFsAA3JOAwADci8AwKomEGby7wADcdcAA3JsATsAA3K3AANyyAACAvWDAAJTtARzAANy0LsAAR9bAAGOuAwFgvLcDgMAA3N/AMCqJFsAA3OguwABH6sAAY67AAGQTFsAA3QkuwABHcsAAY90AwABkCUrAAN0lAYHAAN0swDAq0AbAAGRFgSbAAN05wADdUMAA3rcAAK83AWrAAN06YMAA/RwCAAABA8AA3WHAAN63AAAAAQEBwADdcQAAAJYgYLzMAABgwACU7QE+BEAiFsAA3Y+AwADdh8AwK2iHery6ARbAAN2lgMAA3Z3AMCtohBm8u8AA3YfAAN2tAE7AAN27wADdxQAArNxgwAD9tgEjHMAA3eYWwADd14DAAN3PwDAraIT5vMVIAQABKwDAAP0pJwAWwADeDBbAAN39gMAA3fXAMCtohPm8xYC9vJMBYMAA/bZOwADeHcAA3iUAAIRDYMAA/bYBHMAA3icuwABHqMAAY64BAAEWwADeRoDAAN4+wDAraIRDvMYAwABkFUrAAN5UARzAAN5bLsAAR9HAAGOuAQABJMAA3rIGgsAA3oPAMCwHJ4C1gcAA3o7AMCuvJ4C1FsAA3qOAwADem8AwK2iAvbyTJ8AAR/QAwABkBQbAAGRGgSbAAN75wADfAMAA4EMAAMAAR/UAAAABA8AA3yDAAOBDAAAAAgICwADfNgAAAIRDYLyWAMAA30YAAACWIGC8kQAAYMAA/bYBPgJOwADf5cAA3/EAAIZWYMAA/bYBHMAA3/MuwABHqMAAY64BAAGAwADgCsAwLL4AwABkFUrAAOAYASTAAOA/A4LAAOAiwDAs4ieBahbAAOA5gcAA4DHAMCzLgL28kwbAAGRHgSbAAOBIwADgT8AA4IUAAMAAR/YAAAABA8AA4GbAAOCFAAAAAQEBwADgdQAAAIX/YMAAYLsAAGDAAP22AUrAAOCCASeHTQbAAGP6gSbAAOCKwADglcAA4MIBAMAAR70AAAABA8AA4LDAAODCAAAAAAAAAGDAAP22AUrAAOCzASfAAEf3BsAAY/uBJsAA4T7AAOFJwADhagEAwABH+AAAAAEDwADhWcAA4WoAAAAAAAAAYMAA/bYBSsAA4VwBJ8AAR/kGwABkSIEmwADh2sAA4eXAAOMWAADAAEf6AAAAAQPAAOH4wADjFgAAAAEBAcAA4gYAAACFNWDAAGLiAABgwACU7QE+AUrAAOIaARzAAOI1FsAA4iEuwABHh8AAY+mZFQIAAoDAAOJBwDAuMDTAAOJPA8AA4k/AAOMRAAAAAAAAAGDAAJTtAT4DPSMcwADibRbAAOJaLsAAR4jAAGOuwABjzEgBAAErAMAA/SkXwADiWi7AAEeIwABjrh/AAOJ1wABkuAAAAADAAGPMKwFgwABkqk7AAOKXwADipAAAmSJgwAD9tgEcwADiuRbAAOKmLsAAR4jAAGOuwABjzMAAR/sBAAGAwADixcAwLjAAwABkrkrAAOLaARzAAOLhLsAAR6YCAAIWwADi7i7AAEd0wABj34HAAOL9wDAu1gDAAGQ1AMAA/MAGwABkSYEmwADjG8AA4zLAAOS6AACvPQFqwADjHGDAAP0cAgAAAQPAAONAwADkugAAAAEBAcAA40oAAACCkGDAAGJPAABgwACU7QE+A0nAAONWFsAA41+AwADjWsAwL325V8AAYlg+AUrAAOO/AR/AAOPKwABmXgEAATHAAOPXYMAAZfcDH8AA4+XAAGYeAQABFsAA5AEWwADj9i63IMAAY9bAAEf8wABk0wAmwADkHAEawADkHMAAY71gwABl9ybAAOQ4ARzAAOQ4LsAAR/oBAAEmwADkTAGAwADkTMAwL31gwABi4gDAAGRIYMAAZfcAP07AAOR0wADkggAAuVxgwABidgEmwADkdAGAwADkhMAwL31gwABidkrAAOSOARzAAOSVLq87AQABFsAA5K6BwADkoMAwMDuWIMAAYngAwABkSgbAAGRKgSbAAOS/wADk1sAA5b4AAK87AWrAAOTAYMAA/RwCAAABA8AA5ODAAOW+AAAAAQEBwADk7QAAAJYgYLylAABgwACU7QE+AUrAAOVCAR/AAOVNwABmXgEAATHAAOVaYMAAZfcCH8AA5WbAAGYeAQABFsAA5YIWwADldy63IMAAY9bAAEf8wABk0wAmwADlmwEcwADlmy6vMgEAAYDAAOWrwDAwwADAAGQ4YMAAZfcABsAAZBiBJsAA5gfAAOYOwADmsAAAwABH5sAAY64AAAABA8AA5iLAAOawAAAAAQEBwADmKgAAAIC9YMAA/bYAAGDAAP22AT4DScAA5jYcwADmRRbAAOY6LsAAR4nAAGPrgxcBAAGAwADmTsAwMW4AwAD9cz4BPYjAAOZdwDAxbiTAAOZtAied24DAAOZowDAxbj9AIRzAAOaMFsAA5oEuwABHicAAY+uDFwEAAYDAAOaVwDAxbgDAAP1zwADmgMAA5poASsAA5qEBgMAA5qjAMDFuBsAAZEuBJsAA5rXAAObMwADndAAArz8BasAA5rZgwAD9HAIAAAEDwADm3MAA53QAAAABAQHAAObpAAAAliBgvKUAAGDAAJTtAT4BSsAA5vgBH8AA5wPAAGZeAQABMcAA5xBgwABl9wIfwADnHMAAZh4BAAEWwADnOBbAAOctLrcgwABj1sAAR/3AAGTUACbAAOdRARzAAOdRLq8yAQABgMAA52HAMDJFAMAAZDhgwABl9wAGwABkTIEmwADnecAA55DAAOm6AACvVQFqwADnemDAAP0cAgAAAQPAAOeWwADpugAAAAEBAcAA554AAACAvWDAAP22AABgwACU7QE+A0nAAOeqIhzAAOezgMAA567AMDL4gdYBAAEWwADnyRbAAOe+LrcgwABj1qcOwABkygDAAP3IABzAAOfuFsAA5+eAwADn4sAwMvhhwAD9uoCXAQABFsAA6AgWwADn+xbAAOfwLrcgwABj1qcOwABkymHAAP26AMAA/P8+AUrAAOgYAR/AAOgjwABmNwIAAhbAAOguLsAAR2jAAGOuwABjvx/AAOhSwABmHgEAARzAAOhogMAA6GPAMDL4gL4BAAEWwADoihbAAOh9FsAA6HIutyDAAGPWpw7AAGTKYcAA/boAwAD9zAAAP0nAAOifIhzAAOiogMAA6KPAMDL4gdYBAAEWwADovhbAAOizLrcgwABj1qcQwABkywDAAP3IABzAAOjjFsAA6NyAwADo18AwMvhhwAD9uoCXAQABFsAA6P0WwADo8BbAAOjlLrcgwABj1qcQwABky2HAAP26AMAA/P8+AUrAAOkNAR/AAOkYwABmNwIAAhbAAOkjLsAAR2nAAGOuwABjwB/AAOlHwABmHgEAARzAAOldgMAA6VjAMDL4gL4BAAEWwADpfxbAAOlyFsAA6WcutyDAAGPWpxDAAGTLYcAA/boAwAD9zAAAP0rAAOmVAR/AAOmgwABmHgEAAYDAAOmxwDAy+AAGwABkTYEmwADpv8AA6cbAAO6MAADAAEevAAAAAQPAAOnewADujAAAAAEBAcAA6eYAAACAvWDAAP22AABgwAD9tgE+AknAAOnyHMAA6fuAwADp9sAwNSZIAQABKwDAAP3FSsAA6gQBKz9JwADqFRzAAOoegMAA6hnAMDUmSAEAASdIAMAA/cU+AUrAAOovASfAAEf+ScAA6kkcwADqUoDAAOpNwDA1JkgBAAEnhIYAwAD9xT4BSsAA6mIBJ8AAR/9JwADqfRzAAOqGgMAA6oHAMDUmSAEAASdLAMAA/cU+AUrAAOqXASfAAEgAScAA6rQcwADqvYDAAOq4wDA1JkgBAAEngL8AwAD9xT4BSsAA6s8BJ8AASAFJwADq7xzAAOr4gMAA6vPAMDUmSAEAASeDiADAAP3FPgFKwADrCAEnwABIAknAAOsjHMAA6yyAwADrJ8AwNSZIAQABJ1AAwAD9xT4BSsAA6zwBJ8AASANJwADrVxzAAOtggMAA61vAMDUmSAEAASeVrgDAAP3FPgFKwADrcAEnwABIBEnAAOuLHMAA65SAwADrj8AwNSZIAQABJ4aBAMAA/cU+AUrAAOulASfAAEgFScAA68EcwADryoDAAOvFwDA1JkgBAAEnZADAAP3FPgFKwADr2gEnwABIBknAAOv1HMAA6/6AwADr+cAwNSZIAQABJ4O6AMAA/cU+AUrAAOwPASfAAEgHScAA7CocwADsM4DAAOwuwDA1JkgBAAEng7wAwAD9xT4BSsAA7EQBJ8AASAhJwADsXxzAAOxogMAA7GPAMDUmSAEAASeVrwDAAP3FPgFKwADsegEnwABICUnAAOyWHMAA7J+AwADsmsAwNSZIAQABJ4FtAMAA/cU+AUrAAOywASfAAEgKScAA7MocwADs04DAAOzOwDA1JkgBAAEngJcAwAD9xT4BSsAA7OMBJ6d2ScAA7P0cwADtBoDAAO0BwDA1JkgBAAEngWsAwAD9xT4BSsAA7RcBJ8AASAtJwADtMRzAAO06gMAA7TXAMDUmSAEAASdjAMAA/cU+AUrAAO1KASencUnAAO1kHMAA7W2AwADtaMAwNSZIAQABJ4N3AMAA/cU+AUrAAO19ASfAAEgMScAA7ZgcwADtoYDAAO2cwDA1JkgBAAEng7sAwAD9xT4BSsAA7bEBJ8AASA1JwADtzBzAAO3VgMAA7dDAMDUmSAEAASeBBgDAAP3FPgFKwADt5QEnwABIDknAAO3/HMAA7giAwADuA8AwNSZIAQABJ4GNAMAA/cU+AUrAAO4YASenSknAAO4zHMAA7jyAwADuN8AwNSZIAQABJ4HEAMAA/cU+AUrAAO5RASfAAEgPPgFKwADudwGAwADufsAwNSYGwABkToEmwADukcAA7pjAAPLcAADAAEgQAAAAAQPAAO68wADy3AAAAAEBAcAA7sYAAACCkGDAAGJPAABgwAD9tgE+CEnAAO7SFsAA7tuAwADu1sAwOTGHeMAAYlRKwADu5gEnmhY/ScAA7vwlwADvBYDAAO8AwDA5MWDAAGKMPgFKwADvHQEcwADvJC7AAEf1AgACFsAA710WwADvVRTAAO9QwDA5MQABYMAAYoyWIMAAYo6EQ7yuFsAA72sUwADvZsAwOTEAAWDAAGKMliDAAGKOAMAAZEY/ScAA738lwADviIDAAO+DwDA5MWDAAGLiPgFKwADwHgEnwABIET9OwADwRcAA8E8AAJ00YMAAYnYBJsAA8EUBgMAA8FHAMDkxYMAAYnZOwADwYsAA8GcAAIC9YMAA/bYBHMAA8GkuwABH9QIAAhbAAPClFsAA8J2BwADwk8AwOgWWIMAAYniEQ7ynFsAA8LiBwADwrsAwOgWWIMAAYngAwABkRknAAPIiFsAA8j4WwADyMIHAAPImwDA6BYUXwABieYFVwAD8VkrAAPJHAYLAAPJOwDA6LD9OwADyX8AA8mkAAFtgwAD9tgEcwADyrh7AAPJ3wAD8eQIBYMAA/bYCFsAA8psWwADyjYHAAPKDwDA6BYUXwABieWHAAPyjJ5oWAFgBAAEngYsAwAD8RkrAAPK+ASTAAPLYBILAAPLHwDA6LCdjg8AA8s3AMDq2J4CXAAAv1gYAL9bvAC/XdgAv2BYAL9oaAC/cTAAv3scAL98bAC/fegAv39IAL+AQAC/gTgAv4IkAL+DHAC/hFQAv4VMAL+GaAC/h1AAv4ocAL+L2AC/kdQAv5gYAL+evAC/ojQAv6TYAL+qgAC/rmQAv7DIAL+1yAC/uMgAv8aIAL/LMAC/zLQAv89UAL/RuAC/03AAv9UoAL/W4AC/28QAv+BkAL/rIAC/89wAv/ZwAL/46AC//dwAwALQAMAFSADAB7QAwAxcAMAOmADAFOAAwBcYAMAZUADAH2wAwCrQAMAxLADAN/gAwEHEAMBGdADAUegAwFXYAMBasADAXQwAwF7wAMBlZADAZ1wAwGr4AMB6QADAfggAwIDUAMCFPADAh7AAwIloAMCOkADAkQAAwJJ4AMCU/ADAl+gAwJmIAMCbVADAngwAwKDwAMCndADAqVAAwKzMAMCySADAtPQAwLYgAMC3GADAuBAAwL0gAMDCLADAxPgAwMhAAMDLDADA0+gAwOQUAMDsuAAAAYQLAAGRRgSbAAPrDwAD6ycABFQMDwABIEgAAAWDAAP0cAAFdwABgpQJbWwsEwABkU4EmwAD7F8AA+00FnYwAYMAA/UYBHsAA+yjAAP1fAQABJ8AAR20ABMAAZFSBJsAA+17AAPtvBsAASBMAYMAA+9ABasAA+25gwAD70II8BMAAZFWBJsAA+4DAAPuVBsAASBQAYMAA+9ABasAA+5NgwAD70MAAYK4EwABkVoEmwAD7psAA+7wGwABIFQBgwAD70AFqwAD7u2DAAPvQUgTAAGRYgSbAAPvNwAD70wm3V8AAY64AYMAAY7EABMAAZFmBJsAA++rAAPv2CbVlwABjrgBgwABNDwAEwABkWoEmwAD8GMAA/B8JwABIFsAAY64AYMAAZIAABMAAZFuBJsAA/CvAAPw2GIbSAGDAAP22ASsEwABkXIEmwAD8Y8AA/HEYwABIFwBgwAD6CgEqBMAAZF2BJsAA/KrAAPzAGMAASBgAXcAA/HQBYMAA/bYBMcAA/L5gwAD9tgAEwABkXoEmwAD8yMAA/NIYYQBgwAD70AGTAQXAAGR/gSbAAPzXwAD818AA/RoAAAADwAD87MAA/RoAAAADAwPAAPzyAAAEt1dgwABjsQDAAPz/AAAEtWVgwABNDwDAAP0SAAAEwABIFmDAAGSAAABgwABkUQE/BAgBwABkWIAAwDA+gQgBwABkWYEAwDA+kAgBwABkWoIAwDA+nwkBwAD818AA/TIAAAAAGwbAAGRhgSbAAP0fwAD9N8AA/XMBAK8NwABjrgAAAAEDwAD9S8AA/XMAAAAAAAAAYLsIAUrAAP1UARbAAP1hFsAA/VQutWXAAGOuwABkWaTlwABNFQbAAGRigSbAAP13wAD9isAA/bYBALe6wABjrgAAAAEDwAD9mcAA/bYAAAAAAAAAYMAAbeQBSsAA/ZwBFsAA/akWwAD9nC61ZcAAY67AAGRZs/XAAE0RBsAAZGSBJsAA/bvAAP3CwAD+xgAAmRQAAAABA8AA/cnAAP7GAAAAAQEBwAD92AAAAIX/YMAAYLsAAGDAAP22AT4FPRzAAP3oLsAASBnAAGOuAQABgMAA/e/AMD/AAMAAZGtJwAD9/hzAAP4HFsAA/gIuhtLAAGRbSAEAASsAwAD9xUrAAP4QASfAAEgaP0nAAP4nFsAA/isuwABIF8AAZFxKwAD+MwEkwAD+bwMWwAD+PS6G0sAAZFsngLUcwAD+RS7AAEgbAgACgMAA/lDAMD/AasAA/lpgwAD70FIAwABkZT9JwAD+dRzAAP6KFsAA/oMWwAD+eS7AAEgYwABkXWHAAPyjSAEAAZQAwAD880rAAP6QASTAAP6iAifAAEgcFsAA/pwuhtLAAGRbP0rAAP6oARzAAP65FsAA/q8uwABIGMAAZF1YAQABJ4C1AMAA/EYGwABkZYEmwAD+y8AA/tLAAP8zAADAAEgbAAAAAQPAAP7cwAD/MwAAAAICAsAA/usAAACF/2DAAGC7AMAA/vkAAACBtGDAAPvQAABgwAD9tgFKwAD/CQEcwAD/CS7AAEgdAgACHMAA/xoWwAD/Ei7AAEgWwABjrsAAZFrAAEgeAQABgMAA/yLAMEEUAMAAZI2BwAD/LcAwQSMAwABkZgbAAGRmgSbAAP84wAD/P8ABAJsAAMAASB0AAAABA8AA/0fAAQCbAAAAAgICwAD/TAAAAIPIYMAA+9AAwAD/VgAAAGFgwAD70AAAYMAA/bYBPgQ9iMAA/2TAMEGyHMAA/2mAwAD/ZMAwQbKDdwEAATff////AMAA++hOwAD/icAA/4wAAIPkYMAA/gABH8AA/5LAAP4fAAAAAEFFwAD/pgHAAP+vwAD/sQAAYmDAAPvQAZMBHMAA/7iDwAD/tsAwQiZjAQABgcAA/7rAMEHBAMAA/P0Bi8AA/8LAMEImHMAA/8ODwAD/wsAwQiZkAQABlADAAPz1PgROwAD/08AA/9kAAKwKYMAA+9ABHMAA/+CAwAD/28AwQbKVrgEAATc+AMAA/Pg9HMAA/++CwAD/7MAwQgCCigEAARzAAQA1J8AASB9LAQABhMABAEHAMEJ+AMAA/cMAwAD+FD2IwAEAUMAwQbIcwAEAVYDAAQBQwDBBsoaBAQABNz4AwAD8+knAAQBjHMABAGyAwAEAZ8AwQbJIAQABkwDAAPzzQsABAHIAP0rAAQCDARzAAQCNgsABAIrAMEIAIwAAAADAAP4ZBsAAZGeBJsABAKDAAQClwAEBHwAAwABIIAAAAAEDwAEArMABAR8AAAABAQHAAQC0AAAAlllgwAD9tgAAXAE+AknAAQDEIhzAAQDNFsABAMguhtLAAGRbSAEAASsAwAD9xQAWwAEA4hbAAQDYLsAASBjAAGRdgVXAAPxWPgE9F8ABAPMuhtKAwAEA+sAwQ3DAAGRbPz0cwAEBDi5WAQABgMABARLAMENwAMAAZGgGwABkaIEmwAEBJMABASnAAQI6AABWAAAAAQPAAQEswAECOgAAAAEBAcABATQAAACWWWDAAP22AABcAT4FQBzAAQFbFsABAVSAwAEBS8AwRBphwAD9uoCXAQABkwDAAPz/wAEBS8ABAV4APRzAAQFvFsABAWUuwABIGMAAZF1WAQABgMABAXPAMEQaAMAA/IU9F8ABAYIuYRzAAQGJFsABAYIuYcAAZF5kAQABFsABAZWAwAEBjMAwRBphwAD9ugDAAPz1wABkXknAAQGhHMABAbYWwAEBrxbAAQGlLsAASBjAAGRdYcAA/KOAlwEAAWrAAQG4YMAA+9CCPADAAPz/PRfAAQHHLsAASBcpwABkXD9JwAEB2iIhHMABAeMWwAEB3i6G0sAAZFtIAQABKwDAAP3FABzAAQH1FsABAe4uYcAAZF6AlwEAARzAAQIHHMABAgMWwAEB/BbAAQH3LobSwABkW2HAAP26ZAEAAZQAwAD89WQBAAFqwAECCWDAAPvQwABgrgDAAPz1AMAA/P8+AT0XwAECIy7AAEgXKcAAZFw/BsAAZGmBJsABAj/AAQJEwAEC9AAAwABIIQAAAAEDwAECUcABAvQAAAABAQHAAQJZAAAAlllgwAD9tgAAXAE+AUnAAQJpIhzAAQJ9FsABAnaAwAECbcAwRb9hwAD9uoFrAQABasABAoBgwAD70MAAYK4AwAD8/gAcwAECnxrAAQKUwABkU6k5AQABgMABAqjAMEW/AMAA/VM+AT0cwAECuy5WAQABgMABAr/AMEW/AMAAZGg+AT0XwAEC3S7AAEgXKcAAZFwGwABka4EmwAEC+cABAv7AAQNCAADAAEgZwABjrgAAAAEDwAEDBMABA0IAAAABAQHAAQMTAAAAhf9gwABguwAAXAE+AT0cwAEDLIDAAQMjwDBGiIRNAgACLisAwABg2gbAAGRsgSbAAQNHwAEDWMABA68AALPnAWrAAQNIYMAA/RwCAAABA8ABA2XAAQOvAAAAAgECwAEDfAAACIX/YMAAYOAAwAEDhwAAKIC1WwFqAGDAAPzZdwBcAT4BPRzAAQORLlYBAAEWwAEDphbAAQOegMABA5XAMEbsliDAAGDigL28kwDAAGRoBsAAZG2BJsABA7TAAQPFwAEEJQAAhaoBasABA7VgwAD9HAIAAAEDwAED18ABBCUAAAACAQLAAQPzAAAIhf9gwABiHQDAAQP+AAAogLVbAWoAYMAA/Nl3AFwBPgE9HMABBAguwABIGcAAY64BAAEWwAEEGIDAAQQPwDBHdYJqwABiIADAAGRrBsAAZG6BJsABBCrAAQQ7wAEEewAAvDoBasABBCtgwAD9HAIAAAEDwAEERMABBHsAAAACAQLAAQRXAAAIhf9gwABg+gDAAQRiAAAogLVbAWoAYMAA/Nl3AFwBPgE9HMABBGwuVgEAASeEPADAAGRoBsAAZG+BJsABBIDAAQSRwAEE1wAAwABFggFqwAEEgWDAAP0cAgAAAQPAAQShwAEE1wAAAAIBAsABBLMAAAiF/2DAAGI+AMABBL4AACiAtVsBagBgwAD82XcAXAE+AT0cwAEEyC5WAQABJ4Q8AMAAZGgGwABkcIEmwAEE3MABBO3AAQXbAAC8MQFqwAEE3WDAAP0cAgAAAQPAAQT1wAEF2wAAAAIBAsABBQcAAAiF/2DAAGEUAMABBRIAACiAtVsBagBgwAD82XcAXAE+AUnAAQVXHMABBW0WwAEFZIDAAQVbwDBI3KlUwABhFmMBAAEawAEFdsAA+d4AwAD5+T4BPRzAAQWELlYBAAEkwAEFoAInRRzAAQWMFsABBZaAwAEFjcAwSNypVMAAYRaBxAAAAADAAPnrAMAAZGg+AT0cwAEFti5WAQABJMABBdABFsABBcaAwAEFvcAwSNypVMAAYRYAwABkaAbAAGRxgSbAAQXgwAEF8cABBjcAALw0AWrAAQXhYMAA/RwCAAABA8ABBfzAAQY3AAAAAgECwAEGEQAACIX/YMAAYS4AwAEGHAAAKIC1WwFqAGDAAPzZdwBcAT4BPRfAAQYmLsAASBcpwABkXAbAAGRygSbAAQY8wAEGTcABBqkAALwuAWrAAQY9YMAA/RwCAAABA8ABBlbAAQapAAAAAgECwAEGaQAACIX/YMAAYUYAwAEGdAAAKIC1WwFqAGDAAPzZdwBcAT4BPRzAAQZ+LlYBAAEjFsABBouAwAEGgsAwSj26CsAAYMAnlrMnnSgBYMAA/bYAwABkaAbAAGRzgSbAAQauwAEGv8ABB1oAALw3AWrAAQavYMAA/RwCAAABA8ABBsrAAQdaAAAAAgECwAEG3wAACIX/YMAAYXEAwAEG6gAAKIC1WwFqAGDAAPzZdwBcAT4BPRzAAQczLsAASCEBAAEWwAEHSoDAAQdBwDBKyp1vwABhcwDAAGRpBsAAZHSBJsABB1/AAQdwwAEJBwAAhy0BasABB2BgwAD9HAIAAAEDwAEHecABCQcAAAACAQLAAQeMAAAIhf9gwABhnADAAQeXAAAogLVbAWoAYMAA/Nl3AFwBPgM9HMABB9suwABIIAEAASebxwDAAGRnTsABB/TAAQf7AABhYMAA+9ABFsABCAaAwAEH/cAwS01hwABhoknAAQgSHMABCCYWwAEIH4DAAQgWwDBLTWHAAGGiSAEAAZMAwAD88z4BPRzAAQg0LlYBAAEnhZgAwABkaEnAAQhNHMABCFiCwAEIUcAwS4uBbQEAAWrAAQhbYMAA+9CCPADAAP0APgE9F8ABCHIuwABIFynAAGRcPgFBRcABCJQBwAEIncABCJ8AAGJgwAD70AGTARzAAQimg8ABCKTAMEwvYwEAAYLAAQiowDBLiwDAAPz9AYvAAQiwwDBMLxzAAQixg8ABCLDAMEwvZAEAAZQAwAD89T4CPRzAAQi/LsAASBnAAGOuAQABHMABCNYWwAEIz4DAAQjGwDBLTYPQwABhnksBAAGDwAEI18AwTC8AwAD8gwDAAGRrScABCOQWwAEI6C7AAEgXwABkXELAAQjwAD8GwABkdYEmwAEJDMABCR3AAQoDAAC8QgFqwAEJDWDAAP0cAgAAAQPAAQklwAEKAwAAAAIBAsABCTcAAAiF/2DAAGGsAMABCUIAACiAtVsBagBgwAD82XcAXAE+Aj0cwAEJhi7AAEggAQABJ5w5AMAAZGdJwAEJmhzAAQmuFsABCaeAwAEJnsAwTRdhwABhskgBAAGTAMAA/PM+AT0cwAEJvC5WAQABJ4WYAMAAZGg+AT0cwAEJ3S5WAQABHMABCeEuwABIGwIAAoDAAQnswDBNFzcFAMAAZGUAwABkaAbAAGR2gSbAAQoIwAEKGcABC6gAALxFAWrAAQoJYMAA/RwCAAABA8ABCiHAAQuoAAAAAgECwAEKUgAACIX/YMAAahgAwAEKXQAAKIC1WwFqAGDAAPzZdwBcAT4CPRzAAQqhLsAASCABAAEnm8gAwABkZ0nAAQq1HMABCskWwAEKwoDAAQq5wDBN9GHAAGHFSAEAAZMAwAD88z4BPRzAAQrXLlYBAAEnhZgAwABkaD4BPRzAAQtgLlYBAAEcwAELhBzAAQtkLsAASBsCAAIWwAELeIDAAQtvwDBN9MAARHTAAGoklQDAAGRlZAEAARzAAQuGLsAASBsCAAKAwAELkcAwTfSWAMAAZGUAwAD9ywDAAGRoBsAAZHeBJsABC63AAQu+wAEP2AAAvEsBasABC65gwAD9HAIAAAEDwAELzsABD9gAAAACAQLAAQvoAAAIhf9gwABiDADAAQvzAAAogLVbAWoAYMAA/Nl3AFwBPgU9HMABC/0uwABIIAEAARbAAQwbFsABDBMWwAEMDoDAAQwFwDBPB4KQwABhhJYgwABieIC9vJMAwABkZ07AAQyJwAEMkgABvFhdwAD8pQJgvMlgwABguwEWwAEMnYDAAQyUwDBPB4SDwABiDk7AAQytwAEMsgAAmIBgwAD70AEWwAEMvYLAAQy0wDBPamHAAPzJScABDMkiHMABDNKDwAEMzcAwT5pIAQABlADAAPzzARzAAQzfg8ABDNrAME+aSAEAAZUAwAD88z4DTsABDPkAAAC/8GC8yQBBRsABDQvAAQ00wAENHAAAAISOYLzJABbAAQ0ugsABDSXAME9qg2LAAPzHPgJOwAENRcABDUoAAIC9YMAA/bYBFsABDVKFwAENTMAwUBCAvbyTScABDWAcwAENaYbAAQ1kwDBQNEgBAAEnJwDAAP3FPgE9jMABDYHAME/5hcABDY7AMFAQScABDaQcwAENrYbAAQ2owDBQNEgBAAEnKADAAP3FPgA+Aj2MwAEN98AwT/krQsABDhQAScABDjMhHMABDkKEwAEON8AwT/lIAQABKwDAAP0pPgI9HMABDlUuwABIGcAAY64BAAEcwAEOaxbAAQ5lgMABDlzAME8HhIPAAGIOSwEAAYTAAQ5swDBP+QDAAPy5AMAAZGtKwAEOggA/Pz0cwAEPAhbAAQ7uLq8NwABjrsAAZGGy1gIAAhbAAQ8lFsABDyCAwAEPF8AwTweCkMAAYYSWIMAAYng0wAEPNgPAAQ82wAEP0wAAAAICAsABDzcAAACAtWC8pQDAAQ9GAAAAhI5gvMkAAGDAAPzZAT4DScABD1UWwAEPWS7AAEgXwABkXErAAQ9hAD9JwAEPbxbAAQ+WHMABD4IWwAEPcy63usAAY67AAGRis/YBAAEmwAEPjwGFwAEPj8AwUYNgwAB1ZADAAG3uwABIIsAAbfhKwAEPoAA/PRzAAQ+uLsAASBnAAGOuAQABHMABD8QWwAEPvoDAAQ+1wDBPB4SDwABiDksBAAGFwAEPxcAwUYMAwAD8uQDAAGRrALsSBsAAZHiBJsABD93AAQ/uwAESZQAAnuQBasABD95gwAD9HAIAAAEDwAEP98ABEmUAAAACAQLAARAKAAAIhf9gwABhjQDAARAVAAAogLVbAWoAYMAA/Nl3AFwBPgc9HMABELwuwABIIAEAASeExgDAAGRnTsABENrAARDfAACCkGDAAGJPARbAARDqgMABEOHAMFJ5sznAAGGPTsABEQYAAACAvWDAAP22AEnAAREQJcABERmCwAERFMAwUrdgwABidj4BPYvAAREzwDBS3hbAARFHFsABET8UwAEROsAwUrcCAWDAAGJ2liDAAGJ4gL28k0nAARFYJcABEWGCwAERXMAwUrdgwABijD4BPYvAARF5wDBS3hbAARGNFsABEYUUwAERgMAwUrcCAWDAAGKMliDAAGKOgL28kz9JwAERnRzAARGmg8ABEaHAMFLeSAEAASsAwAD9xT4BPYvAARHowDBS3hzAARH2FsABEe8ut1fAAGOuwABkWMAASBABAAGCwAESG8AwUrcAwABkTj89HMABEiwuwABIIQEAAYPAARI6wDBS3gDAAGRpPRzAARJFLlYBAAEcwAESSS7AAEgbAgACgMABElTAMFJ5lgDAAGRlAMAAZGgGwABkeYEmwAESasABEnvAARNPAAC4RwFqwAESa2DAAP0cAgAAAQPAARKLwAETTwAAAAIBAsABEqUAAAiF/2DAAGHQAMABErAAACiAtVsBagBgwAD82XcAXAE+Aj0cwAETCC7AAEggAQABHMABEyIWwAETHRbAARMZgMABExDAMFRPmcLAAGHSgL28k4LkAgACJ2QngLUAwAD91gDAAGRnPRzAARM9LlYBAAEnwABIIwDAAGRoBsAAZHqBJsABE1TAARNlwAETygAAwABFfgFqwAETVWDAAP0cAgAAAQPAARN6wAETygAAAAIBAsABE5kAAAiF/2DAAGHwAMABE6QAACiAtVsBagBgwAD82XcAXAE+AT0cwAETri5WAQABJ8AASCQAwABkaAbAAGR7gSbAARPPwAET4MABFDUAAMAARX8BasABE9BgwAD9HAIAAAEDwAET8MABFDUAAAACAQLAARQKAAAIhf9gwABiAADAARQVAAAogLVbAWoAYMAA/Nl3AFwBPgE9HMABFB8uVgEAASfAAEglAMAAZGgGwABkfIEmwAEUOsABFEvAARSPAADAAEWAAWrAARQ7YMAA/RwCAAABA8ABFFbAARSPAAAAAgECwAEUawAACIX/YMAAYeAAwAEUdgAAKIC1WwFqAGDAAPzZdwBcAT4BPRzAARSALlYBAAEngL0AwABkaAbAAGR9gSbAARSUwAEUpcABFQEAAMAARYEBasABFJVgwAD9HAIAAAEDwAEUuMABFQEAAAACAQLAARTVAAAIhf9gwABiLQDAARTgAAAogLVbAWoAYMAA/Nl3AFwBPgE9HMABFOouwABIIAEAASfAAEJZAMAAZGcAADA+7AAwP0AAMD+WADBA6AAwQYYAMENEADBD8QAwRZMAMEZYADBGtwAwR0AAMEfHADBINgAwSKcAMEmcADBKCAAwSpUAMEsYADBM4gAwTb8AME7SADBSRAAwVBoAMFTPADBV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AT4CTsABIZ3AASGmAADAAEAgYMAA/bYBFsABIbUWwAEhsYDAASGowDBk5JnCwABh0oC9vJNKwAEhvwEcwAEhxi7AAEgrwABjrgIAAjcFgsABIdXAMGUUAMAAZJAGwABkpIEmwAEh58ABIffAASLVAADAAEV+AWrAASHoYMAA/RwCAAABA8ABIgzAASLVAAAAAgECwAEiKwAACIX/YMAAYfAAwAEiNgAAKIC1YMAA/NkBagBgwAD82XcAYMAA+9ABPgE9MMABIkAewAEiRrWnAgACasABIlhgtbnAALu1JAACJ8AASC0nwABILgAGwABkpYEmwAEi2sABIurAASO5AADAAEV/AWrAASLbYMAA/RwCAAABA8ABIvrAASO5AAAAAgECwAEjFAAACIX/YMAAYgAAwAEjHwAAKIC1YMAA/NkBagBgwAD82XcAYMAA+9ABPgE9MMABIykewAEjL7WnAgACasABI0FgtbnAALu1JAACJ8AASC8nwABILgAGwABkpoEmwAEjvsABI87AASSOAADAAEWAAWrAASO/YMAA/RwCAAABA8ABI9nAASSOAAAAAgECwAEj7gAACIX/YMAAYeAAwAEj+QAAKIC1YMAA/NkBagBgwAD82XcAYMAA+9ABPgE9MMABJAMewAEkCbWnAgACasABJBtgtbnAALu1JAACJ8AASDAnwABILgAGwABkp4EmwAEkk8ABJKPAASVFAADAAEWBAWrAASSUYMAA/RwCAAABA8ABJLbAASVFAAAAAgECwAEk0wAACIX/YMAAYi0AwAEk3gAAKIC1YMAA/NkBagBgwAD82XcAYMAA+9ABPgJOwAEk7MABJPEAAIPIYMAA+9ABFsABJQEWwAEk/IDAASTzwDBnU7L4wABiMIPBwAD9L0rAASUPAR7AASUWwABklAIAAoLAASUfwDBngxzAASUlLsAASBnAAGOuAQABFsABJTWAwAElLMAwZ1PAAER8wABiLwDAAGSPAAbAAGSQgSbAASVKwAElTsABJpMAAMAASCvAAGOuAAAAAQPAASVZwAEmkwAAAAICAsABJV4AAACDyGDAAPvQAMABJWsAAACIQWDAAP22AABgwAD70AE+BE7AASV4wAElfwAAYWDAAPvQARbAASWDgcABJYHAMGg7YcAA/bo9iMABJY/AMGgsHsABJZbAAGSUAgACgMABJZ/A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IRbAATEvgcABMSXAMHZ6h3jAAGJUSsABMToBKj9KwAExUgEpBsAAZLaBJsABMWbAATFywAE0gwAAhnwBasABMWdgwAD9HAIAAAEDwAExg8ABNIMAAAACAgLAATGRAAAIgpBgwABi4gDAATGXAAAggLVbAABbAT4HScABMaAcwAExpC7AAEg4wABjrgEAAYDAATG6wDB2/QDAAGS1PgI9HMABMcwWwAExyS6D5MAAZKyCigEAASTAATH1AieB/BbAATHtFsABMd6AwAEx2cAwdv2zwsAAYuVhwAD8owDAAP4USsABMf4APz0cwAEyEC6ahwEAARbAATIbgMABMhbAMHb9hTTAAGLkAMAAZK89HMABMi8WwAEyLC6D5MAAZKyCigEAASeAtQDAAP4URsABMj/AATJvwAEyTQAAAIDtYMAAYk8AFsABMl+AwAEyWsAwdv2zwsAAYuU+Aj0cwAEyehbAATJ3LoPkwABkrIKKAQABJ4C1AMAA/hQ9HMABMowumocBAAGCwAEyksAwd9kAwABkr07AATKtwAEyswAAgxlgwAD6CgEqRsABMsDAATL4wAEyzgAAAIDtYMAAYk8AFsABMuCAwAEy28Awdv2zw8AAYuY+BEnAATMAIYLAATMFwDB4OD4BPRzAATMZFsABMxYug+TAAGSsgooBAAEngLUAwAD+FD89HMABMzYWwAEzMy6D5MAAZKyCigEAASeAtQDAAP4UPRzAATNILpqHAQABg8ABM07AMHhUAMAAZK89isABM2DAMHg4KUnAATN4IRbAATOWFsABM4KAwAEzfcAwdv2zxMAAYuiBVcAA/FY+Aj2KwAEzp8AweDgqRsABM7zAATPxwAEzygAAAIDtYMAAYk8AFsABM9yAwAEz18Awdv2zxMAAYug+BEnAATP7IYLAATQAwDB4OD4BPRzAATQWFsABNBMug+TAAGSsgooBAAEngLUAwAD+FD89HMABNDcWwAE0NC6D5MAAZKyCigEAASeAtQDAAP4UPRzAATRLLpqHAQABg8ABNFHAMHkpAMAAZK89isABNGXAMHg4KT8AADBylgAwcy4AMHOnADBz+wAwdIgAMHUVADB1ogAwdsgAMHnEAAAACALAAGS5gSbAATSIwAE0jsABOJ4DwABIOQAAAWDAAP0cAAACBMAAZLyBJsABNhvAATYvCcAASDrAAGOu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LcAAQ2/AAEN3wABFGQQBwABKiwAAAAEDwABDisAARRkAAAABAQHAAEOYAAAAliBgvLcAAGDAAGeQAT4DQBbAAEO/gMAAQ7fAMaimhPy8vMAAQ7fAAEPPAR7AAEPZtacCAAKAwABD4sAxqKYkwABEMAMnwABKjIDAAEQMwDGopifAAEqJAEAiFsAARFCAwABESMAxqKaHdry+ARbAAERjgMAARFvAMaimhS28wMAAREjAAERrAR7AAER1tacCAAKAwABEfsAxqKYkwABEzQMnwABKjIDAAESowDGopifAAEpsAErAAETVAR/AAETgwABnwwIAAoDAAETzwDGopmrAAEUKYMAAZ3LAAPDKAAbAAGeygS3AAEVOwABFVsAARsIEAcAASo0AAAABA8AARWnAAEbCAAAAAQEBwABFdgAAAJYgYLzJAABgwABnkAE+A0AWwABFnYDAAEWVwDGpuIT8vLzAAEWVwABFrQEewABFt7WnAgACgMAARcDAMam4JMAARg4DJ8AASo6AwABF6sAxqbgnwABKiQBAFsAARiWAwABGHcAxqbiHdry+wABGHcAARiwBHsAARja1pwIAAoDAAEY/wDGpuCTAAEZ2AyfAAEqOgMAARl3AMam4J8AASnMASsAARn4BH8AARonAAGfDAgACgMAARpzAMam4asAARrNgwABncsAA8IIABsAAZ7OBLcAARxHAAEcZwABJMAQBwABKjwAAAAEDwABHNMAASTAAAAACAgLAAEdOAAAAliBgvOQAwABHZQAAALRpYMAAaJcAAGDAAGeQAT4DQBbAAEeSgMAAR4rAMaq2h3m8vcAAR4rAAEefAR7AAEeptacCAAKAwABHssAxqrYkwABIBwMnwABKkIDAAEfowDGqtifAAEqRAEAhHMAASC2BwABIH8AxqsNIAQABKwDAAGi3wABIH8AASDQBHsAASD61pwIAAoDAAEhUwDGqtiQAAyfAAEqSgMAASLLAMaq2J4FqAErAAEjDAR/AAEjOwABnwwMAAoDAAEjhwDGqtmrAAEj4YMAAZ3LAAOTuAbRpgcAASR7AMarDBsAAZ7SBLcAASY/AAEmXwABMCgQBwABKkwAAAAEDwABJt8AATAoAAAAEBATAAEnRAAAAliBgvOQAwABJ7gAAALRpYMAAaJcAwABKEQAAAIKQYMAAYnYAwABKKgAAAISh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wAD53AAAYMAA+dwBSsAARO0BHMAARPKAwABE7cAyJveDiAEAAYHAAET0wDInBgDAAPnuBsAAaYaBMcAARP7AAEUOwABFOwAAwABLFgFqwABE/2DAAP0cAgAAAQPAAEUWwABFOwAAAAICAsAARRsAAACFr2DAAPzmAMAARSUAAACFsWDAAPzmAABgwAD85gFKwABFLwEcwABFNIDAAEUvwDIneoOIAQABgcAARTbAMieJAMAA/PcGwABph4ExwABFQMAARUzAAEVuAACu+AFqwABFQWDAAP0cAgAAAQPAAEVRwABFbgAAAAICAsAARVIAAACFr1sAwABFWAAAAIWxWwAAWwFKwABFYgEcwABFZ4DAAEViwDIn+4OIAQABgcAARWnAMigGAAAAADImwAAyJ0MAMifGADIoOAAAAAMCwABpioExwABFc8AARXnAAEbmA8AASxsAAAFgwABpbwAAAQTAAGmMgTHAAEXFwABFzwmAvQFqwABFrWDAAP0cAmDAAP22ASeVrgEFwABpkoExwABF1MAARdrAAEXrAQAAA8AARenAAEXrAAAAAAAAAGDAAGmKAT8BCQHAAEXawABpdwAAAAADBsAAaY6BMcAARfDAAEYDwABGbwAAwABLBAFqwABF8WDAAP0cAgAAAQPAAEYLwABGbwAAAAICAsAARhMAAACFr2DAAPncAMAARiAAAACFsWDAAPncAABgwAD53AE+AknAAEYtHMAARjeBwABGMcAyKRtIAQABGsAARkHAAPneAMAA/SlKwABGRwErP0rAAEZYARzAAEZkgMAARl/AMikMla4BAAGBwABGZsAyKRsAwAD58QbAAGmPgTHAAEZ0wABGhMAARrEAAMAASxYBasAARnVgwAD9HAIAAAEDwABGjMAARrEAAAACAgLAAEaRAAAAha9gwAD85gDAAEabAAAAhbFgwAD85gAAYMAA/OYBSsAARqUBHMAARqqAwABGpcAyKb6VrgEAAYHAAEaswDIpzQDAAPz4BsAAaZCBMcAARrbAAEbCwABG5AAArvgBasAARrdgwAD9HAIAAAEDwABGx8AARuQAAAACAgLAAEbIAAAAha9bAMAARs4AAACFsVsAAFsBSsAARtgBHMAARt2AwABG2MAyKj+VrgEAAYHAAEbfwDIqSgAAAAAyKNUAMimHADIqCgAyKnwAAAADAsAA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tADAAEozAAAEwABLql3AAPylAmC8t2DAAGa0AABgwABqpAE/BggBwABqqYAAwDKXNQgBwABqqoEAwDKXRAgBwABqq4IAwDKXXggBwABqrIMAwDKXeAgBwABqrYQAwDKXkgkBwABJmcAA/TIAAAAAIgbAAGqvgTLAAEpRwABKWcAAUOUEAcAAS58AAAABA8AASm7AAFDlAAAAAgICwABKggAAAICrYMAAg0wAwABKmAAAABJgwAB/4AAAYMAAaqQBPghOwABKuMAASsgAALGKYMAAangBHsAAStbAAGqDAgACgMAASvHAMpgsgcAASvbAMpg7AE7AAEsbwABLLAAAwABLp13AAPylAmC8t2DAAP22ATLAAEsuYLy3YMAA/bYATsAAS1rAAEtvAADAAEuoXcAA/KUCYLzMYMAAZrQBMsAAS3FgvMxgwABmtABOwABLm8AAS7MAAMAAS6ldwAD8pQJgvLdgwABmtAEywABLtWC8t2DAAGa0AE7AAEvfwABL+AAAwABLql3AAPylAmC8t2DAAGa0ATLAAEv6YLy3YMAAZrQAPRzAAEwIgcAATAPAMpg7wABLsgEAATTAAEwgA8AATCDAAE3lAAAABAQEwABMKwAAAIPuYINZAMAATEAAAACAvWDAAP22AMAATF8AAADAAEnlXcAA/DIBYMAA/bYAwABMjAAAAMAASeZdwAD8MgFgwAD9tgAAYMAA/NkBPgROwABMtcAATLwAAIJmYLy3ARzAAEzCgMAATL7AMpgsnAsBAAGHwABMzMAymV4AwACDXD0cwABM6YPAAEzZwDKYhYC/AgACFMAATOrAMpmyCwAUwABM9MAymWsIAADAAPy6TsAATQXAAE0RAADAAEnoYMAA+goBHMAATSOCwABNE8AymFPAAEt2AQABFMAATTXAMpmyCwAAwABqjj0cwABNWITAAE1EwDKYsYC/AgACJsAATVgBFMAATVnAMpmyCwBgvMwcwABNZ4DAAE1jwDKYLMAAS7MEAAOHwABNjcAymV4UwABNk8AymXoJABTAAE2nwDKZkQoAAcAASegUwABN0sAymhMMAMAAg3AAwAD8ugDAAH/8PRzAAE3ygcAATe3AMpg7wABLtAEAATTAAE4JA8AATgnAAFArAAAABAQEwABOFAAAAIPuYINZAMAATikAAACAvWDAAP22AMAATkgAAADAAEnlXcAA/DIBYMAA/bYAwABOdQAAAMAASeZdwAD8MgFgwAD9tgAAYMAA/NkBPgVOwABOncAATqMAAISOYLzJASbAAE6dARzAAE6pgMAATqXAMpgsnAsBAAGHwABOs8AymvAAwACDXGC8yT0cwABO0IPAAE7AwDKYhYC/AgACFMAATtHAMptECwAUwABO2sAymv0IAADAAPy6TsAATuvAAE73AADAAEnoYMAA+goBHMAATwmCwABO+cAymFPAAEt2AQABFMAATxvAMptECwAAwABqjj0cwABPQIXAAE8pwDKY3YC/AgACFMAAT0HAMptECwAcwABPToDAAE9KwDKYLMAAS7UEAAMmwABPdwGHwABPd8AymvBgg3cUwABPfcAymwwJABTAAE+RwDKbIwoAAcAASegUwABPvMAym64MAMAAg24AwAD8uj0cwABP6IbAAE/QwDKZCYC/AgACFMAAT+nAMptECwAcwABQAIDAAE/8wDKYLMAAS7YBAAEmwABQHwGHwABQH8AymvBgg3cAwACDbwDAAPy6AMAAf/1KwABQMwEfwABQPsAAatYFAAWCwABQVsAymFODwABQb8AymIWEwABQicAymLGFwABQp8AymN2GwABQyMAymQkABsAAarCBMsAAUOrAAFDywABVPgQBrs4AAAABA8AAURPAAFU+AAAAAgICwABRJgAAAINEYMAAXSoAwABRQQAAAKTlYLrZAABgwABqpAE+CD0cwABRYoDAAFFbwDKdG4KUAQABasAAUWhgwAD9tsABMc8AwABdLE7AAFGCwABRkgAAsYpgwABqLgEewABRoMAAaoQCAAKAwABRw8AynRuBwABRy8AynSoATsAAUf7AAFIPAADAAEunXcAA/KUCYLy3YMAA/bYBHMAAUiCAwABSGcAynRuzlwECYLy3YMAA/bYBNMAAUi4DwABSLsAAUloAAAABAQHAAFI8AAAAgmZgvLcAAGDAAP22AUrAAFJHARzAAFJOgMAAUkfAMp0br3UAAAAAwABdOwDAAF1kTsAAUoXAAFKaAADAAEuoXcAA/KUCYLzMYMAAZrQBHMAAUquAwABSpMAynRuzlwECYLzMYMAAZrQBNMAAUrkDwABSucAAUwsAAAABAQHAAFLHAAAAgmZgvLcAAGDAAGa0AUrAAFLeAR7AAFLiwABmxQEAAYDAAFMEwDKdGwAAwABdZE7AAFM0wABTTAAAwABLqV3AAPylAmC8t2DAAGa0ARzAAFNdgMAAU1bAMp0bs5cBAmC8t2DAAGa0ATTAAFNrA8AAU2vAAFO9AAAAAQEBwABTeQAAAIJmYLy3AABgwABmtAFKwABTkAEewABTlMAAZsUBAAGAwABTtsAynRsAAMAAXWROwABT5sAAU/8AAMAAS6pdwAD8pQJgvLdgwABmtAEcwABUEIDAAFQJwDKdG7OXAQJgvLdgwABmtAE0wABUHgPAAFQewABUcAAAAAEBAcAAVCwAAACCZmC8twAAYMAAZrQBSsAAVEMBHsAAVEfAAGbFAQABgMAAVGnAMp0bAADAAF1kPRzAAFR+gMAAVHfAMp0bgowBAAFqwABUgmDAAP22wAExzwDAAF0tSsAAVIwBH8AAVJfAAGrWBQAFJsAAVK8BgsAAVK/AMp1oYMAAaniDwABUyMAynZqEwABU4sAynh6FwABVAMAynqCGwABVIcAynyIABsAAarKBMsAAVUPAAFVUwABYBgAArs8BasAAVURgwAD9HAIAAAEDwABVY8AAWAYAAAABAQHAAFVtAAAAhDtgwABc2wAAXAE+Bz0cwABVfoDAAFV5wDKgSoKUAQABasAAVYRgwAD9tsABMc8AwABc4D0cwABVnxbAAFWOLrewwABqLcAAaqmuzwEAAYDAAFWvwDKgSgDAAGqGPRzAAFXAgMAAVbvAMqBKs58CAWDAAP22AhbAAFXPLsAAS6fAAGqqNMAAVekDwABV6cAAViUAAAACAgLAAFX3AAAAgmZgvLcAwABWBgAAAIC9YMAA/bYAAFwBSsAAVg8BHMAAVhSAwABWD8AyoEqBuQEAAYLAAFYgwDKg9gDAAFzoAMAAXRE9HMAAVjKAwABWLcAyoEqznwIBYMAAZrQCFsAAVkEuwABLqMAAaqs0wABWXwPAAFZfwABWuwAAAAICAsAAVm0AAACCZmC8twDAAFaEAAAArvZgwABmtAAAYMAA/NkBPgE9HMAAVp+CwABWlsAyoXyuzwEAAYDAAFavwDKgSgDAAGbHAMAAXRE9HMAAVsiAwABWw8AyoEqznwIBYMAAZrQCFsAAVtcuwABLqcAAaqw0wABW+APAAFb4wABXVAAAAAICAsAAVwYAAACCZmC8twDAAFcdAAAArvZgwABmtAAAYMAA/NkBPgE9HMAAVziCwABXL8AyogOuzwEAAYDAAFdIwDKgSgDAAGbHAMAAXRE9HMAAV2CAwABXW8AyoEqznwIBYMAAZrQCFsAAV28uwABLqsAAaq00wABXkQPAAFeRwABX7QAAAAICAsAAV58AAACCZmC8twDAAFe2AAAArvZgwABmtAAAYMAA/NkBPgE9HMAAV9GCwABXyMAyooquzwEAAYDAAFfhwDKgSgDAAGbHAMAAXRE9HMAAV/qAwABX9cAyoEqCjAEAAWrAAFf+YMAA/bbAATHPAMAAXOEGwABqzYEywABYC8AAWDbAAFh1AQDAAEuOAWrAAFgMYMAA/RwCAAABA8AAWEnAAFh1AAAAAAAAAF3AAPylAmC8lmDAAP22AUrAAFhSARbAAFhjFsAAWFIut7DAAGotwABqqcAAS47AAGp+BsAAas6BMsAAWHrAAFibwABY6AEAwABLkAFqwABYe2DAAP0cAgAAAQPAAFi1wABY6AAAAAAAAABdwAD9ZwFgvKUBSsAAWL4BFsAAWM8WwABYvi63sMAAai3AAGqpwABLkMAAaoAGwABqz4EywABY7cAAWRbAAFlRAQDAAEuPAWrAAFjuYMAA/RwCAAABA8AAWSfAAFlRAAAAAAAAAF3AAPylAmC8pWDAAP22AUrAAFkwARbAAFlBFsAAWTAut7DAAGotwABqqcAAS4/AAGp/BsAAatCBMsAAWVbAAFmAwABZuwEAwABLkQFqwABZV2DAAP0cAgAAAQPAAFmRwABZuwAAAAAAAABdwAD8pQJgvLdgwAD9tgFKwABZmgEWwABZqxbAAFmaLrewwABqLcAAaqnAAEuRwABqgQbAAGqzgTLAAFnAwABZ0cAAWjwAAMAAS30BasAAWcFgwAD9HAIAAAEDwABZ6sAAWjwAAAABAQHAAFn3AAAAliBgvKUAAGDAAPoKAT4BSsAAWgYBHMAAWicWwABaDS7AAEuQwABqzoMXAQABgMAAWjDAMqTKAMAA/XMGwABqtIEywABaQcAAWlLAAFqlAACysAFqwABaQmDAAP0cAgAAAQPAAFpfwABapQAAAAEBAcAAWmwAAACWIGC8pQAAYMAA+goBSsAAWn4BHMAAWo8WwABafi63sMAAai3AAGqpsrABAAGAwABancAypUEAwABqhwbAAGq1gTLAAFqqwABaw8AAWxwAAMAAS3IBasAAWqtgwAD9HAIAAAEDwABa18AAWxwAAAABAQHAAFrkAAAAmcJgvKUAAF3AAPx0AWDAAP22AUrAAFryARzAAFsDFsAAWvIut7DAAGotwABqqcAAS3IBAAGAwABbGMAypboAwABqiAbAAGq2gTLAAFshwABbMsAAW5cAAMAAS3MBasAAWyJgwAD9HAIAAAEDwABbTMAAW5cAAAABAQHAAFtZAAAAmcJgvKUAAGDAAPoKAUrAAFtnARzAAFt4FsAAW2cut7DAAGotwABqqcAAS3MBAAGAwABbk8AypjsAwABqiQbAAGrRgTLAAFucwABbscAAW+QBAMAAS3QBasAAW51gwAD9HAIAAAEDwABbwcAAW+QAAAAAAAAAYMAA+goBSsAAW8QBFsAAW9UWwABbxC63sMAAai3AAGqpwABLdMAAapEGwABqt4EywABb6cAAW/rAAFxZAADAAEt1AWrAAFvqYMAA/RwCAAABA8AAXAzAAFxZAAAAAQEBwABcGwAAAJYgYLyWAABgwAD6CgFKwABcLQEcwABcPhbAAFwtLrewwABqLcAAaqnAAEt1AQABgMAAXFHAMqcXAMAAaooGwABquIEywABcXsAAXG/AAFzIAACyrwFqwABcX2DAAP0cAgAAAQPAAFx/wABcyAAAAAEBAcAAXIwAAACWIGC8pQAAYMAA+goBSsAAXJ4BHMAAXK8WwABcni63sMAAai3AAGqpsq8BAAGAwABcwMAyp5AAwABqiwbAAGq5gTLAAFzNwABc3sAAXUUAAMAAR80BasAAXM5gwAD9HAIAAAEDwABc9cAAXUUAAAABAQHAAF0CAAAAliBgvKUAAGDAAPoKAUrAAF0UARzAAF0lFsAAXRQut7DAAGotwABqqcAAR80BAAGAwABdPcAyqAkAwABqjwbAAGq6gTLAAF1KwABdXcAAXbgAAMAAS3wBasAAXUtgwAD9HAIAAAEDwABddMAAXbgAAAABAQHAAF2DAAAAliBgvJYAAGDAAP22AT4BSsAAXZIBHMAAXasWwABdmS7AAEuOwABqzUsBAAGAwABdrMAyqIQAwAD8uQbAAGq7gTLAAF29wABd0MAAXiUAAMAAS34BasAAXb5gwAD9HAIAAAEDwABd5cAAXiUAAAABAQHAAF3yAAAAliBgvKUAAGDAAP22AT4BSsAAXgEBHMAAXhgWwABeCC7AAEuPwABqz0sBAAGAwABeGcAyqPwAwAD8uQbAAGq8gTLAAF4qwABePcAAXpQAAMAAS38BasAAXitgwAD9HAIAAAEDwABeU8AAXpQAAAABAQHAAF5hAAAAliBgvLcAAGDAAP22AT4BSsAAXnABHMAAXocWwABedy7AAEuRwABq0EsBAAGAwABeiMAyqXQAwAD8uQbAAGq+gTLAAF6ZwABeqsAAXwkAAMAAS6XAAGotAWrAAF6aYMAA/RwCAAABA8AAXrzAAF8JAAAAAQEBwABeygAAAJYgYLy3AABgwAD6CgE+AUrAAF7ZARzAAF7xFsAAXuAuwABLkcAAatCHQQEAAYDAAF79wDKp8ADAAPy4BsAAasOBMsAAXw7AAF8fwABhbQAAwABLdgFqwABfD2DAAP0cAgAAAQPAAF8wwABhbQAAAAEBAcAAXz4AAACWIGC8twAAYMAA+goBPgFJwABfTSIiIhbAAF9ZgMAAX1HAMqppsny8vwEWwABfd4DAAF9vwDKqaYd5vL0BFsAAX5iAwABfkMAyqmmFLbzAARbAAF+0gMAAX6zAMqpphS+8wT4GTsAAX9XAAF/eAACCamC8zAEmwABf1QGAwABf4MAyqmlgvMxJwABf7yEWwABf/YHAAF/0wDKq1YQfvM5KwABgCQEqP0nAAGAeHMAAYCIuwABLpcAAai0BAAGBwABgNcAyqtUAwABqvkrAAGBAASk/ScAAYFMhHMAAYG8WwABgYIHAAGBXwDKq1YT5vMVIAQABKwDAAP0pPgFKwABgggEcwABgiS6yrwEAARbAAGCjgcAAYJrAMqrVhPm8xQDAAGq4P0nAAGDCFsAAYM+BwABgxsAyqtWHery6PgFKwABg5QEcwABg7C7AAEt1AQABFsAAYQiBwABg/8AyqtWEQ7zGAMAAarc/SsAAYSABKj4BSsAAYUEBHMAAYUguwABLpcAAai0BAAGAwABhW8AyqmkAwABqvgbAAGrEgTLAAGFywABhg8AAYgEAAMAAR8UBasAAYXNgwAD9HAIAAAEDwABhlsAAYgEAAAABAQHAAGGkAAAAliBgvLcAAGDAAPoKAT4BSsAAYbMBIhzAAGG6LsAAS3YBAAGAwABhzMAyrD4AwABqwwEcwABh6RbAAGHYLsAAS6fAAGqqh0EBAAGAwABh9cAyrD4AwAD8uAbAAGrFgTLAAGIGwABiGcAAY/cAAMAAR8YBasAAYgdgwAD9HAIAAAEDwABiLMAAY/cAAAABAQHAAGI6AAAAliBgvLcAAGDAAP22AT4DTsAAYlDAAGJVAACAvWDAAP22ARzAAGJnFsAAYlcuwABLp8AAaqpLAQABgMAAYmjAMqzUAMAA/LlJwABidiIcwABif4HAAGJ6wDKs60gBAAErAMAA/cUAHMAAYoouwABLdgEAAYDAAGKcwDKs1ADAAGrDPgI9icAAYzjAMqzrIxbAAGNHgMAAYz/AMqzUh3m8vRzAAGNhLsAAS7fAAGotAQABFsAAY3yAwABjdMAyrNSE+bzFAMAAasAcwABjmC7AAEu4wABqLQEAAYDAAGOswDKs1ADAAGrBAWDAAP22PRzAAGPMFsAAY7wuwABLp8AAaqqAvwIAAoDAAGPNwDKs1IHAAGPYwDKs6wDAAPy6P0rAAGPoAYHAAGPvwDKs6wbAAGq/gTLAAGP8wABkA8AAZNQAAMAAS7nAAGotAAAAAQPAAGQXwABk1AAAAAEBAcAAZCYAAACWIGC8lgAAYMAA/bYBPgNOwABkPMAAZEoAAMAAS7pgwAD9tgEcwABkTC7AAEt8AQABgMAAZGTAMq44AMAAarpJwABkciIhHMAAZISBwABkdsAyrk9IAQABKwDAAP3FABbAAGSdgcAAZI/AMq5Pg7LAAP29SsAAZKkBgcAAZLDAMq5PP0rAAGTDASeZeAbAAGrAgTLAAGTZwABk4MAAZdAAAMAAS7fAAGotAAAAAQPAAGTywABl0AAAAAEBAcAAZP8AAACWIGC8pQAAYMAA/bYBPgNOwABlFcAAZSMAAMAAS7pgwAD9tgEcwABlJS7AAEt+AQABgMAAZTvAMq77AMAAartJwABlSSIhHMAAZVuBwABlTcAyrxJIAQABKwDAAP3FABbAAGV0gcAAZWbAMq8Sg7LAAP29SsAAZYABgcAAZYfAMq8SP0rAAGWaARzAAGWhLsAAS4ABAAEWwABlx4DAAGW/wDKu+4C9vJMAwABqywbAAGrBgTLAAGXVwABl3MAAZ8IAAMAAS7jAAGotAAAAAQPAAGXvwABnwgAAAAEBAcAAZf0AAACWIGC8twAAYMAA/bYBPgROwABmE8AAZiEAAMAAS7pgwAD9tgEcwABmMxbAAGYjLsAAS5HAAGrQSwEAAYDAAGY0wDKv3wDAAPy5QCEiHMAAZmUWwABmVC7AAEuRwABq0IdBAQABgMAAZnHAMq/fAMAA/LgAHMAAZouBwABmfcAyr/ZIAQABKwDAAP3FwABmUsAAZpMBHsAAZp21pwIAAoDAAGazwDKv3yQABCe3wYDAAGbRwDKv3yfAAEu7J8AAS7wAScAAZy0iIRzAAGc/gcAAZzHAMq/2SAEAASsAwAD9xQAWwABnWIHAAGdKwDKv9oOywAD9vT4BSsAAZ2wBgcAAZ3PAMq/2P0rAAGeMARzAAGeTLsAAS4ABAAEWwABnuYDAAGexwDKv34C9vJMAwABqywbAAGrGgTLAAGklwABpOMAAaycAAMAAS3sBasAAaSZgwAD9HAIAAAEDwABpUcAAaycAAAABAQHAAGlhAAAAliBgvMwAAGDAAP22AT4HScAAaXAhHMAAaXUuwABLdgEAAYDAAGmHwDKxTgDAAGrDSsAAaZEBKz9JwABpohbAAGmugMAAaabAMrFOhPy8vErAAGnAASeZ8T9JwABp0xbAAGnfgMAAadfAMrFOh3m8vT4BSsAAafYBHMAAaf0uwABLvcAAai0BAAEWwABqHIDAAGoUwDKxToT5vMUAwABqwj9OwABqRMAAakcAAIPkYMAA/gABH8AAak3AAP4fAAAAAD0cwABqZIHAAGphwDKx94KKAQABHMAAamouwABLucAAai0BAAEWwABqh4DAAGp/wDKxToRDvMYAwABqvwDAAP4UScAAapYhHMAAarEWwABqooDAAGqawDKxToT5vMVIAQABKwDAAP0pPgE9NcAAasIAAAEAYMAA/gABgcAAasLAMrH3NQAAAAEAWwEcwABqxoLAAGrEwDKygoKKAQABJ4FqAMAA/hQ1AAAAAQBbARzAAGrSgsAAatDAMrKCgooBAAEcwABq2C7AAEu3wABqLQEAARbAAGrzgMAAauvAMrFOhPm8xQDAAGrAAMAA/hSCAMAysoI/SsAAaw8BHMAAaxmBwABrFsAysfcjAAAAAMAA/hkGwABqwoEywABrLMAAazPAAGvGAADAAEu9wABqLQAAAAEDwABrScAAa8YAAAABAQHAAGtWAAAAliBgvKUAAGDAAP22AT4CScAAa2UhHMAAa2ousq8BAAGAwABre8Ays1gAwABquErAAGuFASs/SsAAa5YBHMAAa50uwABLucAAai0BAAEWwABruoDAAGuywDKzWIRDvKcAwABqvwbAAGrHgTLAAGvLwABr3MAAbGgAAMAAS3cBasAAa8xgwAD9HAIAAAEDwABr6sAAbGgAAAABAQHAAGv4AAAAliBgvLcAAGDAAPoKAT4CScAAbAccwABsCy7AAEt2AQABgMAAbB3AMrP6AMAAasNKwABsJwEpP0rAAGw4ARzAAGxQFsAAbD8uwABLp8AAaqqHQQEAAYDAAGxcwDKz+gDAAPy4BsAAasiBMsAAbG3AAGyIwABthQAAwABLeAFqwABsbmDAAP0cAgAAAQPAAGyfwABthQAAAAEBAcAAbK8AAACWQWC8zAAAYMAAZrQBPgJAHMAAbOIWwABszS7AAEuowABqq4dBAQABgMAAbO7AMrSbAMAA/LjAAGzNwABs9QEewABs/7WnAgACgMAAbQjAMrSbJMAAbVYDJ8AAS76AwABtTsAytJsngWoASsAAbV4BHMAAbXkWwABtZS7AAEuowABqq0sBAAGAwABtesAytJsAwAD8uQbAAGrJgTLAAG2KwABtpcAAbsMAAMAAS3kBasAAbYtgwAD9HAIAAAEDwABtv8AAbsMAAAABAQHAAG3MAAAAhI5gvMkAAGDAAGa0AT4CQBzAAG4BFsAAbekuwABLqcAAaqyHQQEAAYDAAG4NwDK1bgDAAPy4wABt6cAAbhMBHsAAbh21pwIAAoDAAG4zwDK1biQABCfAAEu/J8AAS8CAwABui8AytW4ngWoASsAAbpoBHMAAbrgWwABuoS7AAEupwABqrEsBAAGAwABuucAytW4AwAD8uQbAAGrKgTLAAG7IwABu48AAb+kAAMAAS3oBasAAbslgwAD9HAIAAAEDwABu/sAAb+kAAAABAQHAAG8LAAAAhI5gvMkAAGDAAGa0AT4CQBzAAG9BFsAAbyguwABLqsAAaq2HQQEAAYDAAG9NwDK2QwDAAPy4wABvKMAAb1MBHsAAb121pwIAAoDAAG9mwDK2QyTAAG+3AyfAAEvBgMAAb7DAMrZDJ4FqAErAAG+/ARzAAG/eFsAAb8YuwABLqsAAaq1LAQABgMAAb9/AMrZDAMAA/LkGwABqy4EywABv7sAAcAHAAHCrAADAAEuAAWrAAG/vYMAA/RwCAAABA8AAcB7AAHCrAAAAAQEBwABwJgAAAIC9YMAA/bYAAGDAAP22AT4BSsAAcDIBIxzAAHA+gMAAcDnAMrcWgdYBAAFqwABwSWDAAP22wAEx1ADAAP3IHMAAcHCAwABwa8AytxaAvgEAARbAAHCRasAAcHpgwAD9tsABMdRhwAD9ugDAAP3MgMAAcKPAMrcWAWDAAP22BsAAatKBMsAAcLDAAHDhwABxIAEAwABLjQFqwABwsWDAAP0cAgAAAQPAAHD0wABxIAAAAAAAAABdwAD8pQJgvKVgwABq1wFKwABw/QEWwABxDhbAAHD9LrewwABqLcAAaqnAAEuNwABqfQbAAGrUgTLAAHElwABxSMAAcWUBALGswABqLQFqwABxJmDAAP0cAgAAAQPAAHFNwABxZQAAAAAAAABgutkBSsAAcVABFsAAcWEWwABxUC63sMAAai3AAGqpsazAAGotwABqfAAAMpgAADKc8QAyoBUAMqLwADKjWgAyo78AMqQpADKkkwAypQwAMqWDADKmBAAypn8AMqbgADKnWwAyp9IAMqhNADKoxQAyqT0AMqm1ADKqMgAyrAcAMqydADKuCAAyrssAMq+vADKxFwAysygAMrPDADK0ZAAytTcAMrYMADK23wAyt5oAMrgEADK4ZwAAACICwABq14EywABxasAAcXDAAHU+A8AAS8IAAAFgwAD9HAAAAgTAAGrZgTLAAHGWwABxmwmEsQBdwAD8dAFgwAD9tgAEwABq2oEywABxqsAAcbMJwABLpABgwAD6CgABBcAAauSBMsAAcsfAAHLHwABy+gCVSQADwABy3sAAcvoAAAACAgLAAHLkAAAEhLFdwAD8dAFgwAD9tgDAAHLwAAAEwABLpGDAAPoKAABgwABq1wE/AwgBwABq2YAAwDK5fAgBwABq2oEAwDK5kQkBwAByx8AA/TIAAAAABQbAAGrcgTLAAHG4wABxwMAAcsIEAQAAAAABA8AAcc7AAHLCAAAAAQEBwABx1gAAAMAAS5JgwAD9tgAAYMAAatcBPgROwABx8sAAcfcAAMAASP1dwAD8dAFgwAD9tgEcwAByAYDAAHH5wDK5+4CmAQABJ4CnAMAA/dlOwAByHsAAciQAAISxXcAA/HQBYMAA/bYBHMAAckwcwAByK4HAAHImwDK6FoGlAQABNMAAcjEDwAByMcAAckoAAAABAQHAAHIyAAAAiEFgwAD9tgAAYMAA+goBSsAAcjgBIRzAAHI7gsAAcjnAMrqQgdYBAAEnmeEAwAD9yADAAPw+gK0AAAAAwAD8SE7AAHJfwAByaQAAwABLpGDAAPoKARzAAHJwgcAAcmvAMroWgxcBAAEnwABLwwDAAPxBSsAAcooBH8AAcpXAAGrkAgACgsAAcq3AMrpMg8AAcrTAMrrYAAbAAGregTLAAHL/wABzCsAAc+oBAIGwAAAAAQPAAHMPwABz6gAAAAAAAABgwAD9tgE+BE7AAHMiwABzJQAAg+RgwAD+AAEfwABzK8AA/h8AAAAAPRzAAHNCgMAAcz/AMrtigooBAAEcwABzThbAAHNILoSxwABq2VgBAAEngKcAwAD8RgDAAP4UScAAc14WwABzYi7AAEukwABq2j4CScAAc3UWwABzfxbAAHN5LoSxwABq2YOywAD8Vz4BPRzAAHOYgMAAc5XAMrtigooBAAEngKcAwAD+FD89HMAAc7WAwABzssAyu2KCigEAASfAAEvDAMAA/hQ/SsAAc9IBHMAAc9yAwABz2cAyu2IjAAAAAMAA/hkGwABq34EywABz78AAdAPAAHQ6AQCDwQFqwABz8GDAAP0cAgAAAQPAAHQMwAB0OgAAAAAAAABgwAD70AFKwAB0DwEewAB0F4HzAgACFsAAdCAuhLHAAGrZFsAAdDEWwAB0Jy7AAEukwABq2oPBwAD6DgAGwABq4YEywAB0P8AAdFnAAHUSAwBIAWrAAHRAYMAA/RwCAAABA8AAdFvAAHUSAAAAAQEBwAB0XAAAAIPWWwAAYMAA+goBPgNJwAB0aR7AAHRtwAD1sQIAAi6AwAB0fcAyvOkASsAAdIUBKT9JwAB0liElwAB0oIDAAHSawDK86WDAAGrXSsAAdLQBKj9KwAB0xgEiHsAAdM2B5AIBYMAA/bYCFsAAdNsuhLHAAGrZJsAAdOgBFsAAdOiAwAB04sAyvOmEsQBdwAD8dAFgwAD9tgAAHMAAdPwWwAB08i7AAEukwABq2kgBAAEWwAB1BYDAAHT/wDK86cAAS6QAAMAA/SkGwABq4oEywAB1F8AAdSrAAHU8AAAjAWrAAHUYYMAA/RwCAAABA8AAdTLAAHU8AAAAAAAAAGDAAP22AUrAAHU4ARbAAHU4LoGwwABq3gAAMrnSADK7LgAyvEMAMry1ADK9twAyvgQAAAAFAAABgTIAMr4jADJxfQAydAIAMne8ADJ5cQAyeu8AMoEHADKQ3wAyleEAMrj4ADK+IQAAAAkAMr4jAAAAAAAAAMAAauXAAEvEgTMAAAqA/AAAgi6CBgCBJQAAwACE3gAAgT8AAKQwAACBWAAAvJAAAIF8AADAAI4pAACBnwAAwACFUAAAgcAAAMAAYkoAAIHhAADAAFzVAACCEAAAwABxzwAAgisAAMAAdH8AAQEBwABGUwAAAAcCwABq6IEzgliCXo3lA8AAS8UAAAFgwAD9HAAAAgTAAGrqgTOC7IMFBoPnAGDAAP22AWqC8mDAAP22wAEx2QTAAGrsgTODNYNACcAAS8fAAGrlAF3AAPylAmC8t2DAAHIRAAIFwABq9IEzg0WDRYNpAAAAA4NUg2kAAAAAAAAAYMAAaugBPwIIAMAAauwyg2dgvLdgwAByEQAJAYNFwAD9MgAAAAAFwABq9YEzg26DboOYAJVJAAODhoOYAAAAAQEBg4wAAATAAEvHXcAA/KUCYLy3YMAAchEAAGDAAGroAT8CCAHAAGrsgADAMr+YCQGDbsAA/TIAAAAABAbAAGrugTOD2oPihggEAa7OAAAAAQOEBIYIAAAAAQEBhBAAAACDRGDAAF0qAABgwABq6AE+Bj0chCWAhB7AMr/ygpQBAAFqhCtgwAD9tsABMdkAwABdLE6EWoRmAADAAEvHXcAA/KUCYLy3YMAAchEBMoRoYLy3YMAAchEAToR0hH0AAMAAS8hgwAD70AEchIaAhH/AMr/ysH0AAAAAwABdOUWElQGEnoSgAABiYMAA+9ABkwEchKeDhKXAMsB4YwEAAYKEqcAywFAAwAD8/QGLhLPAMsB4HIS0g4SzwDLAeGQBAAGUAMAA/PU+A06E0oTcAADAAEvJYMAAchEBH4TswABrFgEAAYCFFcAyv/IAToU3hT8AAISIXcAA/HQBYLy3ARyFSICFQcAyv/Ku7wABYLy3AADAAF1jRoVdhYKFbwAAAIJmYLy3AIWFecAywOM+AT0chZeBhYzAMsAqgL8CAAKGhZjAMsERhIWiwDLAwADAAPy6PRyFxoCFv8Ayv/KCjAEAAWqFymDAAP22wAEx2QDAAF0tSoXUAR+F38AAavUBAAGBhfjAMsAqAAbAAGrwgTOGQIZFiZMAAK7PAAAAAQOGVImTAAAAAQEBhl4AAACEO2DAAFzbAABcAT4GPRyGb4CGasAywZ+ClAEAAWqGdWDAAP22wAEx2QDAAFzgTogGiBEAAMAAS8pdwAD8pQJgwAByEV3AAPx0AWC8twEyiBNgwAByEV3AAPx0AWC8twA9HIgnFogbLsAAS8fAAGrlwABq7IP4AQABNIgvA4gviKgAAAACAgKIPQAAAIJmYLy3AIhXAAAAwABLyWDAAHIRAABgwAD82QE+AT0ciJYciHWBiGrAMsHTmRUCAAKDiIHAMsI2NIiMA4iMiJQAAAAAAAAAXcAA/HQBYLy3AUqIkgExiJJgvLcAAMAA/MBWAQABgoiawDLCKwDAAPyFAMAA/MQ9HIi0gIivwDLBn7CDAQABFojIgYi9wDLB02HAAPzJAMAAXOY9HIjpgYjVwDLB04P4AQABNIjxA4jxiXsAAAACAgKJBAAAAMAAS8lgwAByEQCJIgAAAISIXcAA/HQBYLy3AABgwAD82QE+Aj0ciT2CiTPAMsLors8BAAGAiU3AMsGfAMAAciM9HIlfgIlawDLBn673AQABg4lswDLC9wDAAF0QAMAA/MQ9HImHgImCwDLBn4KMAQABaomLYMAA/bbAATHZAMAAXOEGwABq8YEzicyJ3oxmAADAAEvLAAAAAQOJ6oxmAAAAAQEBifgAAACCZmC8twAAYMAAchEBPgNOi6+LtgAApBBgvLcBgIu4wDLDkUmLxCWLz4GLyMAyw6ZgvOs9iIvpwDLDkRaL+RSL8sAyw6YBAWC865jVvO0/SowKARyMHRaMES7AAEvHwABq5cAAauyZFQIAAoCMMsAyw5E0jDoDjDqMYQAAAAAAAABgwABq9gFKjEABH4xEwABrFQEAAYCMWsAyw5EAAMAA/MAGwABq8oEzjOKM543jAADAAEvMAAAAAQOM843jAAAAAgICjQEAAACCZmC8twCNGwAAAMAAS8lgwAByEQAAXAE+A0AhHI06gI0zwDLEWkgBAAErAMAA/SmNM41BASfAAEvNQCEcjXMWjWcuwABLx8AAauXAAGrsh0EBAAGAjX/AMsRaAMAA/LiNZo2GASSNuQMnwABLzoCNscAyxFongWo9HI3LFo3ALsAAS8fAAGrlwABq7IC/AgACgI3MwDLEWoGN1sAyxGUAwAD8ugAAMr/SADLBfwAyw28AMsQ4ADLFAwAAAAQCwABq9oEzjeiN7qbVA8AAS88AAAFgwAD9HAABYMAAchEGBMAAaviBM46ljrcGg+cAYMAA/bYBao6rYMAA/bbAATHeBMAAavqBM47JjtcYwABL0cAAauUAYLy3AATAAGr7gTOPAo84CcAAS9LAAGrlAF3AAI53AmDAAGtLYMAAa1cBH48WwACOfgACYMAAa0tgwABrVwAABMAAavyBM49gj5cYwABL08AAauUAXcAA/KUCYIhOYMAAa0sBMo+VYIhOYMAAa0sABMAAav2BM4+5j8cYwABL1MAAauUAXcAA/KUCYIJSYMAAayoBKwTAAGr+gTOP54/4GMAAS9XAAGrlAF3AAPwyAWCHpAErAgXAAGsVgTOP/Y/9kCcAAAADkBKQJwAAAAEBAZAYAAAEwABL0WC8twAAYMAAavYBPwIIAcAAavqAAMAyxkQJAY/9wAD9MgAAAAAFwABrFoEzkG+Qb5StAK7OAAOQl5StAAAAAQEBkKMAAACDRGDAAF0qAABgwABq9gE+CD0ckLiAkLHAMsaOgpQBAAFqkL5gwAD9tsABMd4AwABdLD0XkMguwABL0cAAauUckOCAkNnAMsaOqzIAAAAAwABdYcAAavpOkPaRAgAAwABL1mDAAPvQARyRC4CRBMAyxo6wfQAAAADAAF05RZEaAZEjkSUAAGJgwAD70AGTARyRLIKRKsAyxxNjAQABgZEuwDLG6wDAAPz9AYqRO8AyxxMckTyCkTvAMscTZAEAAZQAwAD89T4ITpFMkVIAACdgwAD70AEckVuAkVTAMsaOsH0AAAAAwABdOU6Rc5F4AACAvWDAAP22ARyRgYCResAyxo6wdAAAAADAAF08TpGgkbMAAMAAS9dgwAD6CgEckbyAkbXAMsaOruwAAAAAwABdOE6R5ZHqAACD7mCITgEmkeUBHJHzgJHswDLGjsAAQ9kAAAAAwABdSmCITk6SEJIWAACew2DAAGtLAR+SHMAAa1YDAAKEkiPAMsd9FpIpLqmfwABrEwHAAEvXhZJWwDLHoE6Se5KAAAASYMAAa1cBH5KGwABrYQEAAYaSkMAyx8UAPRySpRaSnS7AAEvSwABq5cAAavvAAEvYAwJgwABrS2DAAGtXA4OStcAyx1uHkrzAMsfvFJLDwDLIJQgAAMAAjns9HJLcFpLQLsAAS9PAAGrlwABq/IC/AgAChpLdwDLHxYeS5cAyx+8AwAD8uk6S+pMEAADAAEvZYMAA+9ABHJMNgJMGwDLGjrB9AAAAAMAAXTlJkxwckyqCkyDAMsiygJcBAAGTAMAA/P8+Aj0XkzcuwABL1MAAauUyk0hgglJgwABrKgDAAGr9RZNSAZNbk10AAGJgwAD70AGTARyTZIOTYsAyyRFjAQABgpNmwDLIsgDAAPz9AYuTccAyyREck3KDk3HAMskRZAEAAZQAwAD89T4DTpOMk5MAAIJFYMAAayoBHpOZwABrNgEAAYCTuMAyxo4ATpPbk+EAAIcsXcAA/HQBYIJSARyT6oCT48Ayxo62hQABYIJSAADAAF1MRpQDlCOUFAAAAIPuYIJSAIWUHMAyyXo+AT0clD0WlC8uwABL1MAAauXAAGr9gL8CAAKGlD7AMsmohJRGwDLJWQDAAPy6Pz0XlGouwABL1cAAauUclIWAlH7AMsaOtoUAAWCHpAAAwABdTMAAav49HJShgJSawDLGjoKMAQABapSlYMAA/bbAATHeAMAAXS0CCAHAAGr6KwkBkG/AAP0yAAAAABIGwABrAIEzlOuU/JoxAACuzwFqlOxgwAD9HAIAAAEDlQuaMQAAAAEBAZUVAAAAhDtgwABc2wAAXAE+Bz0clSaAlSHAMspwgpQBAAFqlSxgwAD9tsABMd4AwABc4D0clTuAlTbAMspwqyMBAAEmlUcBFpVHLqmfwABrE2DAAI48AMAAXQ49HJVggJVbwDLKcLCDAQABFpVxFpVpLsAAS9LAAGrlwABq+5iAwACOZADAAFzmPRyVhBaVfC7AAEvSwABq5cAAavuD+AECYMAAa0tgwABrVwE0lYwDlYyWjAAAAAICApWUAAAAnsNgwABrSwCVpQAAABJgwABrVwAAYMAA/NkBPgVAHJXOFpXAgZW6wDLLKrNYwABrTkgBAAEWldEuqZ/AAGsTAMAA/SmVupXeAD0cleyAlefAMspwsIMBAAEWlfuBlfXAMssqwABEXMAAjlcAwABc5j0clhOAlg7AMspwsFkBAAEWliuBliXAMssqgL3AAGtNAMAAXOk9HJY9gJY4wDLKcK7zAQABFpZNgZZHwDLLKsAAS9fAAGtPAMAAXOU9HJZtgJZowDLKcMAAQ7cBAAEWloCClnvAMss3g+7AAGtZAMAAXPcAwACOfEmWkyEclqYWlpcuwABL1MAAauXAAGr9SAEAASsAwAD9KT4ETphOmFoAAMAAS9pdwAD8pQJgwABrKl3AAPx0AWCCUgEymFxgwABrKl3AAPx0AWCCUgA9HJh1FphmLsAAS9TAAGrlwABq/YP4AQABNJh9A5h9mOoAAAACAgKYigAAAIPuYIJSAJicAAAAgkVgwABrKgAAYMAA/NkBPgE9HJjYHJi6gZiuwDLMO5kVAgACg5jGwDLMnjSYzgOYzpjWAAAAAAAAAF3AAPx0AWCCUgFKmNQBMZjUYIJSAADAAPzAVgEAAYKY3MAyzJMAwAD8hQDAAPzEPRyY+ICY88AyynCwgwEAARaZDYGZAcAyzDthwAD8yQDAAFzmPRyZKIGZHMAyzDuD+AEAATSZMAOZMJmxAAAAAgICmT0AAACCRWDAAGsqAJlXAAAAhyxdwAD8dAFgglIAAGDAAPzZAT4CPRyZb4KZaMAyzU6uzwEAAYCZf8AyynAAwABrOD0cmZOAmY7AMspwtokBAAGDmaLAMs1bAMAAXPkAwAD8xD4BPRyZzICZx8AyynCwgwEAAZMAwABc5j0cmeiAmePAMspwtokCAAEWmfcuwABL1cAAauXAAGr+AZerKcAAXPk9HJolgJogwDLKcIKMAQABapopYMAA/bbAATHeAMAAXOEGwABrAoEzmoKah5wLAADAAEvbwABq5QAAAAEDmpWcCwAAAAEBAZqiAAAAg+5gglIAAFwBPgFJmq4cmsEWmrIuwABL1MAAauXAAGr9SAEAASsAwAD9KT4FTpremuYAAIcuYMAAaxcBH5rswABrKQEAARaa+C6pn8AAaxMAQ5tDISWbT4CbSsAyzjlgg1k+AT2Im2jAMs45Fpt0gJtvwDLOOYRSglg9HJuQgJuLwDLOOYRNAQABgZuXwDLObACCWz0Xm6cuwABL1MAAauUWm8CBm7jAMs5swABL3MAAaxzAAGr9PReb1S7AAEvVwABq5Rab8YGb6cAyzmzAAEvdwABrHcAAav4/BsAAaxOBM5wQnC2cTAEAqZ8BapwRYMAA/RwCAAABA5w7nEwAAAAAAAAAYLy3AUqcPgEWnD4uwABL0cAAauXAAGr6BsAAawOBM5xRnFecmwAAwABEBAAAAAEDnGacmwAAAAEBAZxrAAAAJ2DAAPvQAABgvPABPgFKnHgBHJyHFpx/LsAAS9LAAGrlwABq+7eLAQABgJyRwDLPfQDAAI5hBsAAawSBM5ygnLedmAAAwABL3gFqnKFgwAD9HAIAAAEDnMydmAAAAAEBAZzfAAAAg+5gh6QAAGDAAIVaAT4EPRyc6y7AAEvbwABq5QEAARac/4Cc+sAyz+OCRYemAMAAawJOnRedHgAAgkVgwACFWgEcnS4WnSAuwABL1MAAauXAAGr9SwEAAYCdL8Ayz+MAwAD8uUAhHJ1IgZ1BwDLQG0gBAAErAMAA/SmdQZ1PAR6dUbWnAgACFp1aLqmfwABrEySdfwMnwABL34CdecAyz+MngWoASp2HAYGdjsAy0BsGwABrBYEznZ2drp4QAADAAEvgAWqdnmDAAP0cAgAAAQOdxp4QAAAAAQEBndkAAACD7mCHpAAAYMAA+goBPgFKneUBHJ3+Fp3sLsAAS9XAAGrlwABq/oMXAQABgJ4HwDLQwwDAAPxBBsAAawaBM54VniyfHwAAwABL4QFqnhZgwAD9HAIAAAEDnkqfHwAAAAEBAZ5mAAAAg+5gh/gAAGDAAIVaAT4EPRyeci7AAEvbwABq5QEAARaehoCegcAy0SqCRYf6AMAAawJOnp6epQAAgkVgwACFWgEcnrUWnqcuwABL1MAAauXAAGr9SwEAAYCetsAy0SoAwAD8uUAhHJ7PgZ7IwDLRYkgBAAErAMAA/SmeyJ7WAR6e2LWnAgACFp7hLqmfwABrEySfBgMnwABL34CfAMAy0SongWoASp8OAYGfFcAy0WIGwABrB4EznySfO5+pAADAAEviAWqfJWDAAP0cAgAAAQOfVZ+pAAAAAQEBn2QAAACD7mCH6gAAYMAAhVoBPgI9HJ9wLsAAS9vAAGrlAQABgJ9/wDLSCgDAAGsCSp+KARyfnxafkS7AAEvUwABq5cAAav1LAQABgJ+gwDLSCgDAAPy5BsAAawiBM5+un8WgLAAAwABL4wFqn69gwAD9HAIAAAEDn9egLAAAAAEBAZ/nAAAAg+5gh7kAAGDAAIVaAT4CPRyf8y7AAEvbwABq5QEAAYCgAsAy0owAwABrAkqgDQEcoCIWoBQuwABL1MAAauXAAGr9SwEAAYCgI8Ay0owAwAD8uQbAAGsJgTOgMaBIoLcAAMAAS+QBaqAyYMAA/RwCAAABA6BdoLcAAAABAQGgcgAAAIPuYIeaAABgwACFWgE+Aj0coH4uwABL28AAauUBAAGAoI3AMtMOAMAAawJKoJgBHKCtFqCfLsAAS9TAAGrlwABq/UsBAAGAoK7AMtMOAMAA/LkGwABrCoEzoLyg06FCAADAAEvlAWqgvWDAAP0cAgAAAQOg6aFCAAAAAQEBoP0AAACD7mCH3wAAYMAAhVoBPgI9HKEJLsAAS9vAAGrlAQABgKEYwDLTkADAAGsCSqEjARyhOBahKi7AAEvUwABq5cAAav1LAQABgKE5wDLTkADAAPy5BsAAawuBM6FHoV6hxwAAwABL5gFqoUhgwAD9HAIAAAEDoXGhxwAAAAEBAaGCAAAAg+5gh8QAAGDAAIVaAT4CPRyhji7AAEvbwABq5QEAAYChncAy1BIAwABrAkqhqAEcob0Woa8uwABL1MAAauXAAGr9SwEAAYChvsAy1BIAwAD8uQbAAGsMgTOhzKHjolAAAMAAS+cBaqHNYMAA/RwCAAABA6H4olAAAAABAQGiCwAAAIPuYIfRAABgwACFWgE+Aj0cohcuwABL28AAauUBAAGAoibAMtSUAMAAawJKojEBHKJGFqI4LsAAS9TAAGrlwABq/UsBAAGAokfAMtSUAMAA/LkGwABrDYEzolWibKLZAADAAEvoAWqiVmDAAP0cAgAAAQOigaLZAAAAAQEBopQAAACD7mCHrgAAYMAAhVoBPgI9HKKgLsAAS9vAAGrlAQABgKKvwDLVFgDAAGsCSqK6ARyizxaiwS7AAEvUwABq5cAAav1LAQABgKLQwDLVFgDAAPy5BsAAaw6BM6LeovCkLQAAwABL6QFqot9gwAD9HAIAAAEDowCkLQAAAAEBAaMYAAAAg+5giE4AAGC88AE+AUqjJAEcozgWoysuwABL08AAauXAAGr8mRUCAAKAo0TAMtWYNKNKA6NKpCgAAAAAAAAAYMAAa0sBPgNOo1yjYgAAnsNgwABrSwEfo2jAAGtWAwACFqN0gKNvwDLVmIC9iFIWo3ouqZ/AAGsTAcAAS9clo7MWo6yAo6fAMtWYhFKCWGCEfj0co9YWo84uwABL0sAAauXAAGr7wABL6gICYMAAa0tgwABrVwKBo/LAMtXlH6P9wABrYQEAAYCkB8Ay1ZgAAMAAjnpKpBUBgaQcwDLV5QDAAPzABsAAaw+BM6QypESlqQAAwABL6wFqpDNgwAD9HAIAAAEDpFilqQAAAAICAqR1AAAAg+5giTkApIoAAACzVGDAAHHVAABgvPABPgFKpWMBH6VuwACFRQEAARyli4GlgMAy1rfAAEvsAQABgKWfwDLWrADAAHHdAAbAAGsQgTOlrqXKpjoAAMAAS+0BaqWvYMAA/RwCAAABA6XlpjoAAAABAQGl9wAACIDtYMAAa0sAAGCEfgE+AUqmCAEWpiocphcWpg8uwABL0sAAauXAAGr7wABL7gEAAYCmH8Ay1yIAwACOdMAAQAzAAGtfBsAAaxGBM6Y/plSm0wAAwABL7wFqpkBgwAD9HAIAAAEDpmCm0wAAAAICAqZwAAAAs1RgwABx1QCmjQAACJ7DYMAAa0sAAGDAAGJPAT4BSqaaARymuBymqRamoS7AAEvSwABq5cAAavvAAEvuAQABgaaxwDLXowDAAI50wABL8AEAAYCmxMAy15YAwABrXQAAMspHADLOEwAyzxkAMs9bADLPuAAy0JgAMtD/ADLR3wAy0mEAMtLjADLTZQAy0+cAMtRpADLU6wAy1W0AMtaBADLW9wAy12sAMtf5AAAAEgLAAGsXgTOm2KbeuZkDwABL8QAAAV2ZzgFbAAAFBMAAaxmBM6cFpxIYwABL8gBgwAD70AGTBMAAaxqBM6capygYo0sAYMAA+9ABkwTAAGsbgTOnP6dFCYJmAGC8twAEwABrHIEzp22nnwnAAEvcAF3AAPylAmCCUmDAAGsqATKnnWCCUmDAAGsqAATAAGsdgTOnwKfvCcAAS90AXcAA/WcBYIekAR6n18AAwOIAAWCHpAAAAQXAAGspgTOn9Kf0qAwAAAADp/+oDAAAAAEBAagFAAAEgmZgvLcAAGDAAGsXAT8CCAHAAGsbgADAMtkZCQGn9JoEAAAAAAgGwABrIIEzqBGoHakMAADAAEvzwABq5QAAAAEDqCupDAAAAAEBAag4AAAAg+5gglIAAGDAAGsqAT4BSqhEARyoWRaoSy7AAEvcwABrHJkVAgACgKhlwDLZajSoawOoa6kHAAAAAAAAAGDAAGsqAT4BSqh2AR+ogcAAaz4EAAIWqI0ugmbAAGsbNQAAAAEAYMAA+9ABFqiVLsAAS/LAAGsZNQAAAAEAYMAA+9ABF6iVLsAAS/IcqJ6BAMAy2c1kAQABlADAAPz1wABrGYEAwDLZzQLAAEv0Jai7gKi2wDLZamCH38AAS/UlqO+AqOrAMtlqYIfqAMAA/MAGwABrIYEzqRGpIqnZAADAAEv2wABq5QAAAAEDqTOp2QAAAAEBAalAAAAAgkVgwABrKgAAYMAAaz8BPgFJqU4WqWAWqVmAqVLAMtpjmSrAAGs8gVXAAPxWPgFKqXEBJqlxARypf4CpeMAy2mPAAEv3AQABJKmeAieY+zUAAAABAGDAAPvQARapkC6jS8AAaxo1AAAAAQBgwAD70AEXqZAuo0scqZqBAMAy2rhkAQABlADAAPz1wABrGoEAwDLauADAAGs5YMAAaz8+AUqptAEmqbQBFqnJFqnCgKm7wDLaY5kqwABrPIDDwAD8WmDAAGs/BsAAayKBM6neqeqqHwAAl88BaqnfYMAA/RwCAAABA6n1qh8AAAABAQGp/gAAAIPuYIJLAABbAUqqBwEcqgyAqgfAMttXhE4BAAEuAIJOBsAAayOBM6okqjCrDQABwABL+AAAAAEDqkCrDQAAAAEBAapNAAAAg+5gglIAAGDAAPoKAT4BSqpZASIiIiIlqmWAqmDAMtueYIfEASWqiICqg8Ay255gh9EBJaqtgKqowDLbnmCHrgElqtKAqs3AMtueYIe5ASWq9ICq78Ay255gh98GwABrJIEzqxKrHqvYAAHAAEv5AAAAAQOrMavYAAAAAQEBqz4AAACD7mCCUgAAYMAA+goBPgFKq0oBIiIiJatWgKtRwDLcIWCHxAElq3mAq3TAMtwhYIfRASWrnoCrmcAy3CFgh64BJavDgKu+wDLcIWCHuQbAAGslgTOr3avptpEAAIYfAWqr3mDAAP0cAgAAAQOr/LaRAAAAAQEBrA8AAACD7mCHpAAAWwE+B06sJwAAAIJFYMAAayoATqw/rEQAAIJpYIJSARasUhasS4CsRsAy3JyCRYemgmmHnE6saKxvAACEUmCCUgEWrH0WrHaArHHAMtycgkWHpoRSglhJrP4iJa0Jg60CwDLc3WCHbwAcrS8WrSoWrR8UrRjAMtzdAwFgh2+GEIdxgejAAPxZSAEAARatN4CtMsAy3JyCRYemAMAA/Sk+AT2Lry7AMtzdFq8+g683wDLc3YRSglg/Sa9QHq9UwABrIwEAAYKvZcAy3LsAPgY9ibA7wDLcrRywRC7AAEvzwABq5QEAAYKwU8Ay3LsAwABrID0XsGeBsGDAMtyto2cpwABrM06wj7CWAAC4DGCCUgGAsJjAMtycTrCpsLQAAMAAS/pgwAD6CgEqQUOwwyEcsNGEsMrAMt2sSAEAARaw2YCw1MAy3JyCRYemAMAA/Sk+Akmw6x6w78AAayMBAAGEsQDAMt2sAD4CPY2xFcAy3cAhHLEphLEiwDLdrEgBAAGCsSzAMty7AMAA/SlCsTwAPz2MsVXAMt2sFrFlhLFewDLdrIRSglhJsXuFsX/AMt3APgJOsaaxrAAAmPtgwABrPwEcsa4uwABL9sAAauUBAAGBscDAMtytAMAAayE9F7HXhrHRwDLeW6NnKcAAa0M/SbIAHrIEwABrJAEAAYOyGMAy3N0APgc9ibLxwDLcrRyy+i7AAEvzwABq5QEAAYOzCcAy3N0AwABrID0Xsx+BsxjAMtyto3MpwABrND0cs08Wsz4uwABL3cAAax1WAQABgLNTwDLcnADAAP10TrNss3MAALgMYIJSAYCzdcAy3JxOs4azkQAAwABL+mDAAPoKASpBQ7OgIRyzroSzp8Ay3wRIAQABFrO2gLOxwDLcnIJFh6YAwAD9KT4CSbPIHrPMwABrJAEAAYSz4MAy3wQAPgI9jbP1wDLfGCEctAmEtALAMt8ESAEAAYK0DMAy3LsAwAD9KUK0HAA/PYy0NcAy3wQWtEWEtD7AMt8EhFKCWEm0W4W0X8Ay3xg+Ak60hrSMAACY+2DAAGs/ARy0ji7AAEv2wABq5QEAAYG0oMAy3K0AwABrIT0XtLeGtLHAMt+zo3MpwABrRD8+BD2JtZ3AMtytHLWmLsAAS/PAAGrlAQABFrW6gLW1wDLcnIJFh6YAwABrID0XtdCBtcnAMtyto2cpwABrM061/bYDAACY+2DAAGs/ARy2BS7AAEv2wABq5QEAAYG2F8Ay3K0AwABrIT0XtiyEtibAMuAuo2cpwABrQz0ctlkWtkwuwABL3MAAaxyAvwIAAoC2WsAy3JyBtmLAMtytAMAA/Lo9HbZ0hh8BAAGAtojAMtycAJkVBsAAayaBM7aWtqK36QAAhjUBaraXYMAA/RwCAAABA7a+t+kAAAABAQG22gAAAIPuYIf4AABbAT4GTrbytvkAAIJFYMAAayoBHLb7LsAAS/PAAGrlAQABFrcPgLcKwDLgzYJFh/oAwABrID0XtyOBtxzAMuDeo3MpwABrND0ct00Wt0AuwABL3MAAaxyAvwIAAoC3TsAy4M2Bt1bAMuDeAMAA/LpOt3O3eQAAmPtgwABrPwEct3suwABL9sAAauUBAAGBt43AMuDeAMAAayE9F7eggreawDLhSaNzKcAAa0Q9HbfDhjUBAAGAt+DAMuDNAJkbBsAAayeBM7fut/q5lwAAhi4BarfvYMAA/RwCAAABA7gOuZcAAAABAQG4IgAAAIPuYIffAABbAT4DPRy4Pha4M4C4LsAy4cCCa4fhhE0BAAEuAIStSbhQFrhfFrhZgLhUwDLhwIYth+KDssAA/Fc+AT0cuVMuwABL88AAauUBAAGAuWLAMuHAAMAAayA/PR25eYYuAQABgLmOwDLhwACZGgAAMtlEADLaPQAy2y4AMtt8ADLb/wAy3HMAMuCkADLhlwAy4jcAAAAIAsAAayqBM7mcuaLAAEZVA8AAS/sAAAFgwACFWgAACATAAGssgTO6O7pOBoPnAGDAAP22AWq6QWDAAP22wAEx4wTAAGstgTO6ZrpzCbNYAGC8twAEwABrLoEzuo26mQmoLwFqunhgwAD9HAJgwAD70AAEwABrMIEzurO6uhjAAEv9wABq5QBdwAD8dAFgwACFUQErBMAAazGBM7rVut0JwABL9AFqur9gwAD9HAJgwAD6CgAEwABrMoEzuvi7BAnAAEv1AWq64mDAAP0cAmDAAPoKAATAAGszgTO7GbsmGKNnAWq7CWDAAP0cAmDAAPoKAATAAGs0gTO7O7tLGKNzAWq7K2DAAP0cAmDAAPoKAAEFwABrPoEzu1C7ULwFAAAAA7tbvAUAAAAGAgK7YQAABLNYYLy3ALt1AAAEqC9gwAD70AAEu48AAATAAEv0YMAA+goBaruZYMAA+goAu6sAAATAAEv1YMAA+goBaru5YMAA+goAu8sAAASjZ2DAAPoKAWq72mDAAPoKALvsAAAEo3NgwAD6CgFqu/5gwAD6CgBgwABrKgE/BwgBwABrLYAAwDLjiwgBwABrLoEAwDLjlggBwABrMYIAwDLjpAgBwABrMoMAwDLjvAgBwABrM4QAwDLj1AgBwABrNIUAwDLj6gkBu1DAAIVnAAAAAAUGwABrNoEzvEO8S7/4BAGuzgAAAAEDvGm/+AAAAAEBAbx1AAAAg0RgwABdKgAAYMAAayoBPgw9HLyKgLyDwDLkfYKUAQABaryQYMAA/bbAATHjAMAAXSxOvKe8tQAAs1hgvLcBHLy+gLy3wDLkfasyAAAAAMAAXWFOvNS84QAAqC9gwAD70AEcvOqAvOPAMuR9sH0AAAAAwABdOU68/r0HAADAAEv0YMAA+goBHL0QgL0JwDLkfa7sAAAAAMAAXThOvSW9MgAAwABL9WDAAPoKARy9O4C9NMAy5H2u7AAAAADAAF04Tr1QvV4AAKNnYMAA+goBHL1ngL1gwDLkfa7sAAAAAMAAXThOvXy9jQAAo3NgwAD6CgEcvZaAvY/AMuR9ruwAAAAAwABdOE69sr25AACCRWDAAGsqAR+9v8AAaz4GAAKBvcvAMuS1gr3awDLk1gTAAEv0g736wDLk+cAAS/WEvhrAMuUeo2eFvj/AMuVDo3OGvmjAMuVmTr6Dvo4AAKMrYMAA+9ABHL6XgL6QwDLkfbB9AAAAAMAAXTlFvqYBvq++sQAAYmDAAPvQAZMBHL64FL62wDLl/wkAYwEAARS+usAy5dkIAADAAPz9ARW+xsAy5f8JHL7HFL7GwDLl/wkAZAEAAZQAwAD89T4ETr7avuQAAKNOYMAA/bYBHL7tgL7mwDLkfa91AAAAAMAAXTtOvwa/FAAAo2dgwAD6CgEcvx2AvxbAMuR9ruwAAAAAwABdOE6/NL9FAACjc2DAAPoKARy/ToC/R8Ay5H2u7AAAAADAAF04PRy/Z4e/YMAy5YnAAEv3AwABFL9wwDLmTgoAAqNnFL+UwDLmcQsAo3MUv7XAMuaUDADAAGs5PRy/2YC/0sAy5H2CjAEAAWq/3WDAAP22wAEx4wDAAF0tSr/nAYe/7sAy5YkGwABrOIEzwABALMAAQDHAAEKEAACuzwAAAAEDwABAQMAAQoQAAAABAQHAAEBKAAAAhDtgwABc2wAAXAE+CT0cwABAW4DAAEBWwDLnQoKUAQABasAAQGFgwAD9tsABMeMAwABc4D0cwABAcIDAAEBrwDLnQqsjAQABJsAAQHwBFsAAQHwus1jAAGstYMAAjjwAwABdDj0cwABAlYDAAECQwDLnQrCDAQABFsAAQJ4uqC/AAGsuAMAAXOY9HMAAQLaAwABAscAy50Ku8wEAARbAAEDALsAAS/TAAGsxAMAAXOU9HMAAQNSAwABAz8Ay50Ku8wEAARbAAEDeLsAAS/XAAGsyAMAAXOU9HMAAQPaAwABA8cAy50Ku8wEAARbAAEEALqNnwABrMwDAAFzlPRzAAEEZgMAAQRTAMudCrvMBAAEWwABBIy6jc8AAazQAwABc5UnAAEE6IRzAAEFGFsAAQT4uwABL/cAAauXAAGswSAEAASsAwAD9KT4CPRzAAEFcgMAAQVfAMudCsIMBAAEWwABBbRbAAEFlLsAAS/3AAGrlwABrMGHAAPyjAMAAXOZGwABBfMAAQajAAEGRAAAAwABL/mDAAIVRABbAAEGfLsAAS/3AAGrlwABrMD4DPRzAAEG3gMAAQbLAMudCgbkBAAEWwABBzoHAAEHDwDLo0YC9vJMAwABc6D0cwABB4oDAAEHdwDLnQq7zAQABFsAAQfeBwABB7MAy6NGjZ8AAhVYAwABc5T0cwABCFIDAAEIPwDLnQq7zAQABFsAAQimBwABCHsAy6NGjc8AAhVcAwABc5T4BPRzAAEJcgMAAQlfAMudCsIMBAAGTAMAAXOY9HMAAQniAwABCc8Ay50KCjAEAAWrAAEJ8YMAA/bbAATHjAMAAXOEGwABrOYEzwABCicAAQqXAAEP/AADAAEv3AWrAAEKKYMAA/RwCAAABA8AAQq3AAEP/AAAAAwEBwABCtQAAAKNOYMAA/bYAAsAAQswAAACjZ2DAAPoKAWrAAELbYMAA+goAwABC5wAAAKNzYMAA+goBasAAQvlgwAD6CgBgwACFUQE+BD0jHMAAQw8WwABDBy7AAEv9wABq5cAAazBIAQABKwDAAP0pF8AAQwcuwABL/cAAauUxwABDJGDAAIVRAMAAazArAV3AAPx0AWDAAIVRTsAAQzzAAENMAADAAEv/YMAAhVEBH8AAQ1LAAGtKBAACLoDAAENpwDLp9QKjZ4HAAEOLwDLqBaNzgsAAQ6zAMuofPRzAAEPLFsAAQ8MuwABL/cAAauXAAGswVgEAAYPAAEPPwDLqjwDAAPyFSsAAQ+UBg8AAQ+zAMuqPBsAAazyBM8AARATAAEQqwABEZgEAmSoBasAARAVgwAD9HAIAAAEDwABEMcAARGYAAAAAAAAAXcAA/HQBYMAAhVEBPgFKwABENwE1AAAAAQBdwAD8dAFgwACFUQEWwABEPi7AAEv9wABq5cAAazAjHMAAREaAAMAy61RIAQABKwAAasAAREldwAD8dAFgwACFUcAA7d+AAMAy61QBXcAA/HQBYMAAhVEGwABrOoEzwABEa8AARH7AAEZTAAAjAWrAAERsYMAA/RwCAAABA8AARIbAAEZTAAAAAAAAAGDAAP22AT4NTsAARJzAAESfAACD5GDAAP4AAR/AAESlwAD+HwAAAAA9HMAARLyAwABEucAy6+6CigEAASfAAEwAAMAA/hQ9HMAARNqAwABE18Ay6+6CigEAASfAAEwBAMAA/hQ9HMAARPqAwABE98Ay6+6CigEAARbAAEUALrNYwABrLQDAAP4UPRzAAEUXgMAARRTAMuvugooBAAEnwABMAgDAAP4UPRzAAEU3gMAARTTAMuvugooBAAEWwABFPS6oL8AAay4AwAD+FD0cwABFU4DAAEVQwDLr7oKKAQABJ8AATAMAwAD+FD0cwABFdIDAAEVxwDLr7oKKAQABFsAARXouo2fAAGszAMAA/hQ9HMAARZGAwABFjsAy6+6CigEAASfAAEwEAMAA/hQ9HMAARbWAwABFssAy6+6CigEAARbAAEW7LqNzwABrNADAAP4UScAARdIhHMAARd4WwABF1i7AAEv9wABq5cAAazBIAQABKwDAAP0pPgI9HMAARfKAwABF78Ay6+6CigEAASfAAEwFAMAA/hQ9HMAARg6AwABGC8Ay6+6CigEAARbAAEYULsAAS/3AAGrlwABrMADAAP4UPz0cwABGK4DAAEYowDLr7oKKAQABJ4MhAMAA/hRKwABGOwEcwABGRYDAAEZCwDLr7iMAAAAAwAD+GQAAMuRdADLnGAAy6b4AMusJADLrsAAy7eMAAAAFAsAAaz+BM8AARljAAEZewABJFQPAAEwGAAABYMAAhVEAAAQEwABrQYEzwABGqMAARq4JgkUBasAARoxgwAD9HAJgwACFWgAEwABrQoEzwABGy8AARtQJo04BasAARrNgwAD9HAJgwAD9tgAEwABrQ4EzwABG6cAARvYYo2cBasAARtlgwAD9HAJgwAD6CgAEwABrRIEzwABHC8AARxsYo3MBasAARvtgwAD9HAJgwAD6CgABBcAAa0qBM8AARyDAAEcgwABHjgAAAAPAAEcwwABHjgAAAAQCAsAARzYAAASCRWDAAIVaAMAAR0MAAASjTmDAAP22AALAAEdaAAAEo2dgwAD6CgFqwABHaWDAAPoKAMAAR3UAAASjc2DAAPoKAWrAAEeHYMAA+goAYMAAaz8BPwUIAcAAa0GAAMAy7tkIAcAAa0KBAMAy7ugIAcAAa0OCAMAy7vgIAcAAa0SDAMAy7xIJAcAARyDAAIVZAAAAAAIGwABrRoEzwABHk8AAR6rAAEe7AQCAvQFqwABHlGDAAP0cAgAAAQPAAEevwABHuwAAAAAAAABgwAD9tgFKwABHsgEWwABHsi6jTsAAa0IGwABrSIEzwABHv8AAR9LAAEkTAAAjAWrAAEfAYMAA/RwCAAABA8AAR9rAAEkTAAAAAAAAAGDAAP22AT4KTsAAR/DAAEfzAACD5GDAAP4AAR/AAEf5wAD+HwAAAAA9HMAASBCAwABIDcAy7/+CigEAASfAAEwHAMAA/hQ9HMAASDOAwABIMMAy7/+CigEAASfAAEwIAMAA/hQ9HMAASFCAwABITcAy7/+CigEAARbAAEhWLqNOwABrQgDAAP4UPRzAAEhpgMAASGbAMu//gooBAAEnwABMAwDAAP4UPRzAAEiKgMAASIfAMu//gooBAAEWwABIkC6jZ8AAa0MAwAD+FD0cwABIp4DAAEikwDLv/4KKAQABJ8AATAQAwAD+FD0cwABIy4DAAEjIwDLv/4KKAQABFsAASNEuo3PAAGtEAMAA/hQ9HMAASOuAwABI6MAy7/+CigEAASeDIQDAAP4USsAASPsBHMAASQWAwABJAsAy7/8jAAAAAMAA/hkAADLvcwAy78EAMvE+AAAAAgLAAGtLgTPAAEkYwABJHsAAS9cDwABMCQAAAWDAAI5VAAADBMAAa02BM8AASVfAAElbCYC9AWrAAEk/YMAA/RwCYMAA/bYABMAAa06BM8AASXLAAEl/CbNYAGC8twAEwABrT4EzwABJxsAASdgJwABL1wBgwAD6CgABBcAAa1aBM8AASd3AAEndwABKVwAAAAPAAEnjwABKVwAAAAMCAsAASekAAASAvWDAAP22AMAASfQAAASzWGC8twABwABKCQAABMAAS9dgwAD6CgFqwABKHWDAAPoKAGDAAGtLAT4BQCElwABKQBbAAEoyLrNYwABrTmDAAHU4wABKMsAASlIABAgBwABrTYAAwDLx7ggBwABrToEAwDLx/QgBwABrT4IAwDLyCwkBwABJ3cAAjlkAAAAAAgbAAGtSgTPAAEpcwABKZ8AASncBAMAASVrAAGrlAAAAAQPAAEptwABKdwAAAAAAAABgwAD9tgFKwABKcAEnnsMGwABrVIEzwABKfMAASo/AAEvVAAAjAWrAAEp9YMAA/RwCAAABA8AASpfAAEvVAAAAAAAAAGDAAP22AT4ITsAASq3AAEqwAACD5GDAAP4AAR/AAEq2wAD+HwAAAAA9HMAASs2AwABKysAy8wKCigEAASTAAErcAhbAAErVLsAASVrAAGrlwABrUieD1wDAAP4UScAASuMhHMAASwQWwABK9RbAAErnLrNYwABrToT5vMVIAQABKwDAAP0pPgI9HMAASxiAwABLFcAy8wKCigEAARbAAEs7FsAASywWwABLHi6zWMAAa06E+bzFgL28kwDAAP4UPRzAAEtLgMAAS0jAMvMCgooBAAEngWoAwAD+FD89HMAAS2SAwABLYcAy8wKCigEAARbAAEt4FsAAS2ous1jAAGtOgL28kwDAAP4UPRzAAEuGgMAAS4PAMvMCgooBAAEnhq8AwAD+FD0cwABLmYDAAEuWwDLzAoKKAQABFsAAS58ugL3AAGtNAMAA/hQ9HMAAS62AwABLqsAy8wKCigEAASeDIQDAAP4USsAAS70BHMAAS8eAwABLxMAy8wIjAAAAAMAA/hkAADLyhAAy8sQAMvR9AAAAAgLAAGtXgTPAAEvawABL4MAATOIDwABMCgAAAWDAAP0cAAACBMAAa1mBM8AATAvAAEwPCYPuAGCITgAEwABrW4EzwABMHcAATCIYkibAAGrlAGDAAGJPASsBBcAAa2GBM8AATCfAAEwnwABMOwAAAAPAAEwwwABMOwAAAAEBAcAATDYAAASD7mCITgAAYMAAa1cBPwIIAcAAa1mAAMAy9QwJAcAATCfAAP0yAAAAAAIGwABrXYEzwABMQMAATEnAAEysAADAAEvwAAAAAQPAAExUwABMrAAAAAEBAcAATGQAAACzVGDAAHHVAABgwABiTwE+AUrAAEx2ATUAAAABAGDAAGJPARbAAEx9LpImwABq5cAAa1sjHMAATIOBAMAy9YhIAQABKwDAAP0pF8AATH0ukibAAGrlHMAATJKAwABMh8Ay9WnAAEvwAQABFsAATKMWwABMni6D7sAAa1mCkIhUAMAAcdvAAGtbgQDAMvWIAWDAAGJPBsAAa1+BM8AATLHAAEzFwABM4AEAwABADAAAAAEDwABM0sAATOAAAAAAAAAAYIR+AUrAAEzVASbAAEzVARbAAEzaFsAATNUug+7AAGtZhFKCWGCEfgAAMvU9ADL2BAAy9lkAAAACAAEGwABq54EzwABNecAATX7AAE8pAAHAAEwLAAAAAQPAAE2cwABPKQAAAAQEBMAATbIAAACy2mDAAGroAMAATdYAAACzVGDAAHHVAMAATfUAAACCamC8zADAAE4IAAAAgaZeAAECAWC88AHAAEgiYMAA+goAXAAAXAE+Ak7AAE5DwABOTQAAwABLyWDAAHIRARzAAE5fgMAATk/AMvaYwABLywEAAYLAAE5swDL2tgDAAGrxPR7AAE55wABx1AMAA4HAAE6RwDL2p4LAAE6dwDL2tjTAAE6tA8AATq3AAE8mAAAAAgEBwABOxQAAAIJsYIhOAAHAAE7VAAAAwABIImDAAPoKAWoAYMAA/Nl3YMAA/NkBPgE9HMAATueDwABO5sAy9sMgAgABHMAATvKEwABO6MAy9ufAAEvpAQABhcAATwPAMvdRAMAAchUBwABIIobAAE8YwDL3XwAAAYEzADL3xgAyvtcAMsUcADLYSgAy4mAAMu4AADLxTwAy9I4AMvZqAAAABwAy9mwAMvfGAAAAAQAAAMAAa2LAAEwMgTQAAAWBdAAAgi6CBgCBnAAAnEUAAIHFAACbkgAAgfMAAIq+AACCIAAAwACHKgAAAAAAAgLAAGtpgTSFW4VhkjoDt/8AAAFgiugAAAIEwABra4E0hZSFmQmEfABgisYABMAAa2yBNIW2hboJgL0BaoWeYMAA/RwCYMAA/bYAAQXAAGt8gTSFv4W/heMAAAADhcyF4wAAAAICAoXSAAAEgL1gwAD9tgCF3QAABIR8YIrGAABgwABraQE/AwgBwABrbIAAwDL4oggBwABra4EAwDL4rwkBhb+LCAAAAAAMBsAAa26BNIXohf2GGwEAgkwBaoXpYMAA/RwCAAABA4YIhhsAAAAAAAAAYMAA+goBSoYLARaGERaGCy6EfMAAa2uCTIrIBsAAa2+BNIYghjWGZgEAh10BaoYhYMAA/RwCAAABA4ZShmYAAAAAAAAAYMAA+goBSoZVASEWhlwWhlYuhHzAAGtrgkyKyAbAAGtwgTSGa4aIhroBAIdaAWqGbGDAAP0cAgAAAQOGn4a6AAAAAAAAAF3AAPx0AWDAAP22AUqGogEchrRqhqJdwAD8pQJgwAD9tl3AAPx0AWDAAP22wAEy4ksBAAEWhrUugL3AAGtsAMAA/LkGwABrdIE0hr+G0IdLAACHZwFqhsBgwAD9HAIAAAEDhueHSwAAAAEBAYbsAAAAgKxgwAD+NwAAYMAA+goBSob6ASIchwUWhv6AhvrAMvoHgbrAAP49SAEAASeHaADAAP3FACIchyIWhx2AhxnAMvoHTsAA/kJIAQABJ4dpAMAA/cUBHIc4FoczgIcvwDL6B07AAP5CSAEAASewvQDAAP3FBsAAa3WBNIdQh2GICAAAh2oBaodRYMAA/RwCAAABA4eCiAgAAAACAgKHhwAAAIdrYMAA/jcAh5UAAACHbGDAAP43AABgwAD6CgFKh6gBIh2HrodqAgACgIfQwDL6p4GH2sAy+rQAivoBHoftwABraAEAAYCH/8Ay+qcABsAAa3aBNIgNiB6ITQAAh24BaogOYMAA/RwCAAABA4gqiE0AAAABAQGILwAAAICsYMAA/jcAAGDAAPoKAUqINwEeiDfAAGtoAQABgIhJwDL7IgAGwABrcYE0iFKIZ4iMAQCHbwFqiFNgwAD9HAIAAAEDiISIjAAAAAAAAABgwAD6CgFKiIcBKgbAAGtygTSIkYimiMoBAIdwAWqIkmDAAP0cAgAAAQOIw4jKAAAAAAAAAGDAAPoKAUqIxgEpBsAAa3eBNIjPiOCJ1AAAh2QBaojQYMAA/RwCAAABA4kIidQAAAAGBQWJHQAAAIJVYIpIAIk4AAAAh2FgnEYAiVgAAACHZWCbngCJegAAAIbTXcAA/HQBYIKLAImeAAAAh2JdiswCW1sAAYm+AAAAh2NhAWDAAP22XAFqAGDAAPzZd1wBPgAGwABreIE0idmJ84+PAACHcgFqidpgwAD9HAIAAAEDigiPjwAAAAYGBooaAAAAh2FgnEYAijkAAACFeWCEqQCKUAAAAIC9YMAA/bYAimkAAABbYIVzAIp+AAAAg1xgwAD70ACKkQAAAIdzYMAA+goAAGCEqQE+A06KpAAAAIJnYMAA+9AASYquHIq3goqywDL8e4HWAQABJ6cPAMAA/cg+Aj2OitPAMvy0aoraYMAA+9AVPYqK/MAy/HsciwiCiwPAMvx7gL4BAAGXAMAA/cxJiyEciyqCiyXAMvx7gdYBAAEnpxEAwAD9yD4CPY6LRsAy/LRqi01gwAD70CE9iotvwDL8exyLe4KLdsAy/HuAvgEAAZcAwAD9zD4BPY6LnMAy/LRqi6NgwAD70AlKi8kBNYvUAAABAGCFuAEfi9SFyQIAAiaMDgEcjA4Wi/uAi/HAMvxlJ5xJnAYCAAInm78nsoYApmRgg+UfjFWFfwEAATGMcWCEqQU1jIEAAAEAYIZ4AR+MgYaAAQABgoySwDL8ewA1AAAAAQBbAReMmYeMl8Ay/bSEU4SMpsAy/JKCWYcAwDL9tB+MvIbkAQABHI0MHIzqFozkg4zawDL8iIVnhXWAqwEBYIawATSM7gOM7o0KAAAAAQEBjO8AAACDpmCIswAAYIawAUqM9QEfjPmGugEAAYeNCMAy/iMAAMAA/D2ArQAAAADAAPxIADWNJQAAAQBghtgBH40lhuQBAAEWjT6DjTTAMvyIhY2FdgA1AAAAAQBbAReNS4eNScAy/liEU4SNWMAy/JKCWYcAwDL+WDWNbgAAAQBghvIBH41uhv8CAAEejYDAAPx6AQFghwABHI22Fo2wg42mwDL8iIVXhXeAqwEBWwE0jboDjbqOmQAAAAEBAY3OAAAAhXBghYEAAGCHAAE+AUqN4QE1jewAAAEAYIcAAR+N7IcJAgACNY4NAAABAGCGeAEfjg2GgAEAARaOIoeOHsAy/uGAvYWDADUAAAABAFsBF44pFI4nwDL/CwgAhFMWjjqHjjbAMv7hhFOCWYJZFADAMv8LCAAWjlqHjlbAMv7hgJaFhAA1AAAAAQBbAReOcRSOb8Ay/vgIAIRTFo6Ch45+wDL+4YRTglmCWRQAwDL++AgAAMAA/D0AAYXGFo68Fo6wgI6mwDL8ZZrLnLiE9INCNQAAAAEAWwEXjtOHjtHAMv6dhB0cjvUWju4WjuiDjt7AMvyIhVeFd2HAAPyjSAEAAZMAwAD884b0NQAAAAEAWwEXjwmHjwfAMv6dhFMWjyCDjxbAMvyIhFOCWYJZhwDAMv6dNY86AAABAGCGgQEfjzqGiQEAAYaPSMAy/LQANQAAAAEAWwEXj0+Hj03AMwAZhFOEj1zAMvySglmHAMAzABkAADUAAAABAFsBF494h492wDL9bYRThI+FwDL8koJZhwDAMv1tBsAAa3mBNI+Uj66RpgAAh3QBao+VYMAA/RwCAAABA4/KkaYAAAAPBQWP1QAAAIdhYJxGAI/0AAAAhXlghKkAkAUAAACAvWDAAP22AJAYAAAAW2CFcwCQJwAAAINcYMAA+9AACpA7AAAAh3VgwAD6CgFqkEVgwAD6CgCQVwAAAIUtYMAA+goBapBhYMAA+goAkHMAAACFL2DAAPoKAWqQfWDAAPoKAJCPAAAAh3ZgwAD6CgFqkJhgwAD6CgCQqgAAAId3YMAA+goBapC7YMAA+goAkM0AAACHeGDAAPoKAWqQ2GDAAPoKAJDqAAAAh3NgwAD6CgFqkPNgwAD6CgCRBQAAAIQZYMAA+goBapEPYMAA+goAkSEAAACHeWDAAPoKAWqRMGDAAPoKAJFCAAAAh3pgwAD6CgFqkU5gwAD6CgBghKkBPgFKkX0BH5GIhLsBAAErAAbAAGt6gTSRq5HIkjgAAIeDAWqRrGDAAP0cAgAAAQOR2JI4AAAAAQEBkeMAAACHYWCcRgAAYIrdAUqR9wFqkf1gwABrfcABMwEAADL45gAy+SsAMvlxADL53gAy+n4AMvr5ADL7TAAy+4EAMvu2ADL8PAAzAHsAMwHPADMCGAAAAAwCwABrfYE0lkSWSpdFA8AATBkAAAFgit0AAAEEwABrf4E0lpaWsgmHWQFqloBgwAD9HAJgwAD6CgABBcAAa4OBNJa3lr2W+QEAAAOW1Jb5AAAAAQAAAZbbAAAEh1lgwAD6CgFqAGDAAPzZd2DAAGt9AT8CCAHAAGt/gADAMwKnCQGWvYrnAAAAAAEGwABrgYE0lv6XHpdDAQCHVwFqlv9gwAD9HAIAAAEDly6XQwAAAAAAAABgitEBSpcxAWqXQWCK0YWyAAAzAtsAMwMVAAAAAQIEwABrZYE0gmODIQbAAEwawABrYgBdwAD8MgFgwAD9tgFqgn1dwAD8dAFgwAD9tsABMy0EwABrZoE0ktaWQQbAAEwcwABrYgBdwAD8pQJgwAD9tl3AAPx0AWDAAP22AWqS613AAPylAmDAAP22XcAA/HQBYMAA/bbAATLiAQbAAGtogTSDJIMphRUAAcAATB0AAAABA4M6hRUAAAABAQGDPwAAAICsYMAA/jcAAGDAAPoKAT4DT4NIg00AAAHAAEweYQBgwAD6CgADg1+EVQAAAAAAAABgwAD6CgE+Ak6Db4N6AACBXWDAAP22ARaDgICDfMAzA8JOwAD+QkqDigEiIhyDnIKDkcAzBAGDFwEAASfAAEwfAMAA/dMBHIPcgoPRwDMEAYMXAQABJ8AATCAAwAD90wEchBuChBDAMwQBgxcBAAEnwABMIQDAAP3TT4RahF8AAAHAAEwiYQBgwAD6CgADhHGE2wAAAAAAAABgwAD6CgE+AkmEeiEchIkWhIKAhH7AMwPCgbrAAP49SAEAASeHaADAAP3FSoSUASo/SoSmARyExWqErV3AAPwyAWDAAP22wAEzLYMXAQABFoTSgITOwDMDwk7AAP5CAMAA/EFKhOABIhyE+YGE58AzA9sgAAAAAAABHIURgoT/wDMEdCAAAAAAAAGBNAAzBRoAMvg8ADMCUQAzAyIAAAACADMDoAAzBRoAAAABAAAAwABrhACBNQAABYERAACCLoIGAIE5AAC8kAAAgV0AAMAAjikAAIGAAADAAGhlAACBoQAAwABiSgAAAAAADwLAAGuHgTWB6IHugskDwABMIwAAAWDAAI4wAAACBMAAa4mBNYIrgi8JgL0BaoITYMAA/RwCYMAA/bYABMAAa4qBNYJJglUJpRgBaoI0YMAA/RwCYMAA/jcAAQXAAGuOgTWCWoJagoAAAAADgmKCgAAAAAICAoJoAAAEgL1gwAD9tgCCcwAABKUYYMAA/jcAAGDAAGuHAT8DCAHAAGuJgADAMwXyCAHAAGuKgQDAMwX/CQGCWsAAjjUAAAAAAQbAAGuMgTWChYKYgscAACMBaoKGYMAA/RwCAAABA4KggscAAAAAAAAAYMAA/bYBSoKmASSCxwRqgqlgwAD9tsABM2AnwABMJRaCwS6AvcAAa4kngyEAADMGOgAzBo8AAAABAsAAa4+BNYLMgtKEBQPAAEwmAAABYMAAjjYAAAMEwABrkYE1gw2DFAmEQwFqgvNgwAD9HAJgwABrhwAEwABrkoE1gzKDNgmAvQFqgxpgwAD9HAJgwAD9tgAEwABrk4E1g1GDWwmEGgFqgztgwAD9HAJgwAD6CgABBcAAa5mBNYNgg2CDkgAAAAODZoOSAAAAAwICg2wAAASEQ2DAAGuHAIN6AAAEgL1gwAD9tgABg4YAAASEGmDAAPoKAWoAYMAA/Nl3YMAAa48BPwQIAcAAa5GAAMAzBy8IAcAAa5KBAMAzBzwIAcAAa5OCAMAzB0oJAYNgwACOOwAAAAACBsAAa5WBNYOXg6yDvgEAtFUBaoOYYMAA/RwCAAABA4O2g74AAAAAAAAAYMAA+goBSoO5ASoGwABrl4E1g8OD1oQDAAAjAWqDxGDAAP0cAgAAAQOD3oQDAAAAAAAAAGDAAP22AUqD5AEkhAMEaoPnYMAA/bbAATNgJ8AATCcWg/0ugL3AAGuSJ4MhAAAzB5gAMwfNADMIIgAAAAICwABrmoE1hAiEDoTlA8AATCgAAAFgwACOUAAAAgTAAGucgTWETYRUCYRDAWqEM2DAAP0cAmDAAGuHAATAAGudgTWEcoR2CYC9AWqEWmDAAP0cAmDAAP22AAEFwABroYE1hHuEe4ScAAAAA4SDhJwAAAACAgKEiQAABIRDYMAAa4cAhJcAAASAvWDAAP22AABgwABrmgE/AwgBwABrnIAAwDMIqAgBwABrnYEAwDMItQkBhHvAAI5UAAAAAAEGwABrn4E1hKGEtITjAAAjAWqEomDAAP0cAgAAAQOEvITjAAAAAAAAAGDAAP22AUqEwgEkhOMEaoTFYMAA/bbAATNgJ8AATCkWhN0ugL3AAGudJ4MhAAAzCPAAMwlFAAAAAQLAAGuigTWE6IT3iTkHwABMKgAAAWDAAI48AAAEBMAAa6SBNYU0hTsJhEMBaoUaYMAA/RwCYMAAa4cABMAAa6WBNYVYhWYJhPkBaoVAYMAA/RwCYMAAa48ABMAAa6eBNYV1hXoJKMAAa4QAYMAAaGYABMAAa6iBNYWJhZIJwABMK8AAa4QAYMAA+goAAQXAAGu8gTWFl4WXhgIAAAADhZ6GAgAAAAQDA4WkAAAEhENgwABrhwCFsgAABIT5YMAAa48AhccAAAQoYMAAaGYAAYXUAAAAhBlgwAD6CgFqhd5gwAD6CgBgwABrogE/BQgBwABrpIAAwDMJ+ggBwABrpYEAwDMKBwgBwABrp4IAwDMKFAgAwABrqIOF+sAzCiEJAYWXwACOQQAAAAAPBsAAa6qBNYYHhh6GMAEAgL0BaoYIYMAA/RwCAAABA4YjhjAAAAAAAAAAYMAA/bYBSoYmARaGLBaGJi4owABrhMAAa6eBsMAAaGoGwABrq4E1hjWGSoZdAQCnGwFqhjZgwAD9HAIAAAEDhlWGXQAAAAAAAABgwABoZgFKhlgBFoZYLijAAGuEwABrpwbAAGusgTWGYoZ3howBAKs+AWqGY2DAAP0cAgAAAQOGhIaMAAAAAAAAAGDAAPoKAUqGhwEqBsAAa62BNYaRhqaGtgEAhB0BaoaSYMAA/RwCAAABA4auhrYAAAAAAAAAYMAA+goBSoaxASoGwABrroE1hruG0IbjAQCEGgFqhrxgwAD9HAIAAAEDhtuG4wAAAAAAAABgwAD6CgFKht4BKgbAAGuvgTWG6Ib9hw4BAIUvAWqG6WDAAP0cAgAAAQOHBocOAAAAAAAAAGDAAPoKAUqHCQEqBsAAa7CBNYcThyiHOQEAhS0BaocUYMAA/RwCAAABA4cxhzkAAAAAAAAAYMAA+goBSoc0ASoGwABrsYE1hz6HU4dmAQCyfAFqhz9gwAD9HAIAAAEDh16HZgAAAAAAAABgwAD6CgFKh2EBKgbAAGuygTWHa4eAh5ABAId2AWqHbGDAAP0cAgAAAQOHiIeQAAAAAAAAAGDAAPoKAUqHiwEqBsAAa7OBNYeVh6qHwAEAh3kBaoeWYMAA/RwCAAABA4e4h8AAAAAAAAAAYMAA+goBSoe7ASoGwABrtIE1h8WH2ogSAQCE/AFqh8ZgwAD9HAIAAAEDh+uIEgAAAAAAAABgwAD6CgFKh+4BIiEch/0Wh+4uhPnAAGulSAEAASsAwAD9KQAhFogJLsAATCvAAGuEwABrqAbAAGu1gTWIF4gsiFsBAIQZAWqIGGDAAP0cAgAAAQOINYhbAAAAAAAAAGDAAPoKAUqIOAEiIRyIRxaIOC6E+cAAa6VIAQABKwDAAP0pABaIUi7AAEwrwABrhMAAa6gGwABrtoE1iGCIdYiZAQCHegFqiGFgwAD9HAIAAAEDiICImQAAAAAAAABgwAD6CgFKiIMBHIiSFoiDLoT5wABrpUgBAAErAMAA/SkGwABruIE1iJ6IqYiuAQLAAElawABrhAAAAAEDiK6IrgAAAAAAAABgwAD9tgAGwABruoE1iLOIxok3AAAjAWqItGDAAP0cAgAAAQOIzok3AAAAAAAAAGDAAP22AUqI1AEkAAZqiNdgwAD9tsABM2AWiOcuwABJWsAAa4TAAGu4J4PXIyEciQcWiPguhPnAAGulSAEAASsAwAD9KSSJKwIWiSMWiRQuhPnAAGulgL3AAGuSJ4FqJwABYMAA/bYWiTEugL3AAGuqJ4MhAAAzCn0AMwrHADMLCAAzCz0AMwtyADMLpwAzC9wAMwwRADMMRgAzDHsAMwywADMNDwAzDW0AMw24ADMN5QAzDoIAAAAPAsAAa72BNYk8iUuLDQfAAEwsAAABYMAAa6IAAmC8zGDAAI5CAwTAAGu/gTWJvYnPCbRbAWqJmWDAAP0cAmC88wAEwABrwIE1ieqJ9AmEHwFqidRgwAD9HAJgwAD6CgAEwABrwYE1ihaKIQmFTgFqiflgwAD9HAJgvNMAAQXAAGvDgTWKJoomiwsAAAADii+LCwAAAAcFBYo5AAAAhENgwABrhwCKSQAAAIT5YMAAa48Ail4AAACAvWDAAGhmAIpvAAAEtFtgvPMAiogAAASFTmC80wACiqEAAACEGWDAAPoKAWqKq2DAAPoKAIq3AAAEhB9gwAD6CgFqisNgwAD6CgBgwABrvQE/BAgBwABrv4MAwDMPhQgBwABrwYQAwDMPkAgBwABrwIYAwDMPsgkAitPAAGu8BAADgIrZwDMPXoGK4sAzD2uCivLAMw94AYQZhYsCwDMPnAAAADMQHwAAAAACwABrxIE1ixCLH43cB8AATC0AAAFgwABrvQACYLzkYMAAjkUBBMAAa8aBNYuOi5UJhB0Baot4YMAA/RwCYMAA+goAAQXAAGvQgTWLmouajK8AAAADi6aMrwAAAAUDA4u1AAAAhPlgwABrjwCLygAAAIC9YMAAaGYAi+MAAAC0W2C88wACjAMAAACEH2DAAPoKAWoAYMAA/Nl3jBQAAASEHWDAAPoKAWoAYMAA/Nl3YMAAa8QBPwIIAcAAa8aEAMAzEMIJAIwmwABrwwYABRaMO4CMLMAzEIeEQ8AAa5GAjETAMxCHgYxUwDMQlIKMWsAzEKFqjIZgvNPAANm8AYQfg4ykwDMQrQYGwABryIE1jLSMyYzeAQCHeQFqjLVgwAD9HAIAAAEDjNeM3gAAAAAAAABgwAD6CgFKjNoBKQbAAGvJgTWM44z4jREBAIT8AWqM5GDAAP0cAgAAAQONCY0RAAAAAAAAAGDAAPoKAUqNDAEqBsAAa8qBNY0WjSuNPAEAhBkBao0XYMAA/RwCAAABA400jTwAAAAAAAAAYMAA+goBSo03ASoGwABry4E1jUGNVo1pAQCHegFqjUJgwAD9HAIAAAEDjWGNaQAAAAAAAABgwAD6CgFKjWQBKgbAAGvMgTWNbo2DjagBALKtAWqNb2DAAP0cAgAAAQONoI2oAAAAAAAAAGDAAPoKAUqNowEqBsAAa86BNY2tjcSN2gEAwABJWsAAa4QBao2uYMAA/RwCAAABA43KjdoAAAAAAAAAYMAA/bYBSo3NASeY1QAAMxEwADMRZQAzEZoAMxHPADMSBAAzEjkAMxJ2AAAABgLAAGvRgTWN343lj4IDwABMLgAAAWDAAGvEAAAAAQXAAGvWgTWOFY4VjxAAAAADjiuPEAAAAAUDA446AAAAhPlgwABrjwCOTwAAAIC9YMAAaGYAjmgAAAC0W2C88wACjogAAACEH2DAAPoKAWoAYMAA/Nl3jpkAAACEHWDAAPoKAWoAYMAA/Nl3YMAAa9EBPwEJAI6rwABr0AUAA4COscAzEtCBjsHAMxLdgo7HwDMS6gKEH4OO88AzEvaEHYSPCMAzEwsCBsAAa9OBNY8VjyqPRwEAtAIBao8WYMAA/RwCAAABA48/j0cAAAAAAAAAYMAA+goBSo9CASoGwABr1IE1j0yPYY+AAQCzCAFqj01gwAD9HAIAAAEDj3mPgAAAAAAAAABgwAD6CgFKj3wBKQAAMxNcADMTkQAzE8YAAAACAsAAa9eBNY+Fj4uRfQPAAEwvAAABYMAAa8QAAAEEwABr2YE1j8+P6wmyrQFqj7lgwAD9HAJgwAD6CgABBcAAa96BNY/wj/CRCwAAAAOQA5ELAAAABgMDkBIAAACE+WDAAGuPAJAnAAAAgL1gwABoZgCQQAAAALRbYLzzAAOQYAAAAIQfYMAA+goBagBgwAD82XeQcQAAAIQdYMAA+goBagBgwAD82XeQfwAABLKtYMAA+goBagBgwAD82XdgwABr1wE/AggBwABr2YUAwDMUfgkAkKbAAGvQBQADgJCswDMULoGQvMAzFDuCkMLAMxRIAoQfg5DuwDMUVIQdhJEDwDMUaQIGwABr24E1kRCRJZFBAQC0AgFqkRFgwAD9HAIAAAEDkTqRQQAAAAAAAABgwAD6CgFKkT0BKQbAAGvcgTWRRpFbkXsBALMIAWqRR2DAAP0cAgAAAQORc5F7AAAAAAAAAGDAAPoKAUqRdgEqAAAzFNsAMxUQADMVRQAAAAICwABr34E1kYCRhpNlA8AATDAAAAFgwABrvQAAAQTAAGvhgTWRu5HFCYQaAWqRpWDAAP0cAmDAAPoKAAEFwABr54E1kcqRypMKAAAAA5HRkwoAAAAIBQWR2wAAAIRDYMAAa4cAkesAAACE+WDAAGuPAJIAAAAAgL1gwABoZgCSHwAAALRbYLzzAJI/AAAAhU5gvNMAA5JYAAAAhBlgwAD6CgFqAGDAAPzZd5JnAAAAhB9gwAD6CgFqAGDAAPzZd5J4AAAEhBpgwAD6CgFqAGDAAPzZd2DAAGvfAT8CCAHAAGvhhwDAMxYVCQCSjcAAa8MHAAWAkpPAMxWtgZKcwDMVuoKSrMAzFceDkrLAMxXUhJLGwDMV3wKEGYWS6cAzFeuEH4aS/8AzFgACBsAAa+OBNZMPkySTNgEAsnwBapMQYMAA/RwCAAABA5MvkzYAAAAAAAAAYMAA+goBSpMyASkGwABr5YE1kzuTUpNjAQDAAElawABrhAFqkzxgwAD9HAIAAAEDk1iTYwAAAAAAAABgwAD9tgFKk1sBJ5ZBAAAzFoAAMxa1ADMW8gAAAAICwABr6IE1k2iTbpU/A8AATDEAAAFgwABrvQAAAQTAAGvqgTWTo5OtCYQaAWqTjWDAAP0cAmDAAPoKAAEFwABr8IE1k7KTspTmAAAAA5O5lOYAAAAHBASTwwAAAIRDYMAAa4cAk9MAAACE+WDAAGuPAJPoAAAAgL1gwABoZgCUAAAAAIVOYLzTAAOUGQAAAIQZYMAA+goBagBgwAD82XeUKAAAAIQfYMAA+goBagBgwAD82XeUOQAABIQaYMAA+goBagBgwAD82XdgwABr6AE/AggBwABr6oYAwDMXtwkAlE7AAGvDBwAFgJRUwDMXWoGUXcAzF2eClG3AMxd0apR5YLzzwAEzZYOUosAzF4EChBmElMXAMxeNhB+FlNvAMxeiAgbAAGvsgTWU65UAlRABAIUtAWqU7GDAAP0cAgAAAQOVCZUQAAAAAAAAAGDAAPoKAUqVDAEpBsAAa+6BNZUVlSyVPQEAwABJWsAAa4QBapUWYMAA/RwCAAABA5UylT0AAAAAAAAAYMAA/bYBSpU1ASehpwAAMxglADMYWgAzGJcAAAACAsAAa/GBNZVClUiXLQPAAEwyAAABYMAAa70AAAEEwABr84E1lX2VhwmEGgFqlWdgwAD9HAJgwAD6CgABBcAAa/qBNZWMlYyWpgAAAAOVk5amAAAABgMDlZ0AAACEQ2DAAGuHAJWtAAAAhPlgwABrjwCVwgAAAIC9YMAAaGYAA5XUAAAAhBlgwAD6CgFqAGDAAPzZd5XjAAAAhB9gwAD6CgFqAGDAAPzZd5X0AAAEhBpgwAD6CgFqAGDAAPzZd2DAAGvxAT8CCAHAAGvzhQDAMxlRCQCWCcAAa8MHAAWAlg/AMxj/gZYYwDMZDIKWKMAzGRlqljRgvPPAATN3apZpYLzTwADZvAKEGYOWhcAzGSeEH4SWm8AzGTwDBsAAa/WBNZarlsCW1AEAqz4BapasYMAA/RwCAAABA5bNltQAAAAAAAAAYMAA+goBSpbQASkGwABr9oE1ltmW7pb+AQCFLwFqltpgwAD9HAIAAAEDlveW/gAAAAAAAABgwAD6CgFKlvoBKQbAAGv4gTWXA5calysBAMAASVrAAGuEAWqXBGDAAP0cAgAAAQOXIJcrAAAAAAAAAGDAAP22AUqXIwEnmwYAADMZwgAzGfcAMxosADMaaQAAAAMCwABr+4E1lzCXNpjKA8AATDMAAAFgwABrogACYLzJYMAAjkgCBMAAa/2BNZeNl5kJqz4Bapd3YMAA/RwCYMAA+goABMAAa/6BNZe0l7sJhB0BapeeYMAA/RwCYMAA+goAAQXAAGwEgTWXwJfAmHMAAAADl8aYcwAAAAYDA5fQAAAAhENgwABrhwCX4AAAAIT5YMAAa48Al/UAAACAvWDAAGhmAAOYBwAAAIQZYMAA+goBagBgwAD82XeYFgAABKs+YMAA+goBagBgwAD82XeYKQAABIQdYMAA+goBagBgwAD82XdgwABr+wE/AwgBwABr/YQAwDMbOAgBwABr/oUAwDMbTQkAmDvAAGu8BAADgJhBwDMa+4GYSsAzGwiCmFrAMxsVAYQZg5hqwDMbIwIGwABsAIE1mHiYjZicAQCHdgFqmHlgwAD9HAIAAAEDmJWYnAAAAAAAAABgwAD6CgFKmJgBKQbAAGwCgTWYoZi4mMgBAMAASVrAAGuEAWqYomDAAP0cAgAAAQOYvpjIAAAAAAAAAGDAAP22AUqYwQEnhI4AADMbrQAzG+IAMxwfAAAAAgLAAGwFgTWYzZjTmhUDwABMNAAAAWDAAI5LAAADBMAAbAeBNZkamSkJtFgBapkCYMAA/RwCYLyRAATAAGwIgTWZRplKCYC9AWqZLmDAAP0cAmDAAP22AATAAGwJgTWZZJlpCScBaplPYMAA/RwCYMAA+9AAAQXAAGwNgTWZbplumagAAAADmXuZqAAAAAMDA5mBAAAEtFhgvJEAmZcAAASAvWDAAP22AJmiAAAEJ2DAAPvQAABgwABsBQE/BAgBwABsB4AAwDMcwAgBwABsCIEAwDMcywgBwABsCYIAwDMc2AkBmW7AAI5PAAAAAAEGwABsC4E1ma2ZwJoTAAAjAWqZrmDAAP0cAgAAAQOZyJoTAAAAAAAAAGDAAP22AUqZ1AEkmhMGapnXYMAA/bbAATNgJ8AATDUWmgYWmfYutFjAAGwHgL28kyeBahaaDS6AvcAAbAgngyEAADMdHgAzHYcAAAABAsAAbA6BNZoYmh6bvwOy4QAAAWDAAP0cAAFgvPAFBMAAbBCBNZpbml8JgL0BappDYMAA/RwCYMAA/bYABMAAbBGBNZp2moMJs1gAYLy3AATAAGwSgTWalJqlCcAATDYAYLyRAATAAGwTgTWawJrECYPuAGCHFQAEwABsFIE1mtWa4RiFNQBgwABi4gErAQXAAGwYgTWa5prmmz0AAAADmvSbPQAAAAQEBJsBAAAEgL1gwAD9tgCbDAAABLNYYLy3AJsgAAAEwABMNmC8kQCbOAAABIPuYIcVAABgwABsDgE/BQgBwABsEIAAwDMePQgBwABsEYEAwDMeSggBwABsEoIAwDMeVQgBwABsE4MAwDMeYgkBmubAAP0yAAAAAAEGwABsFoE1m0KbVZu9AAAjAWqbQ2DAAP0cAgAAAQObXZu9AAAAAAAAAGDAAP22AUqbYwEkAAdqm2ZgwAD9tsABM2AnwABMNyeD1xabnRabjy6zWMAAbBGAvbyTJ4FqNQAAAAEAYMAA/bYBFpulLoC9wABsECMcm6qAAMAzHxJIAQABKwAAJ7NZgADAMx8SAWDAAP22J4MhAAAzHrMAMx9KAAAAAQLAAGwZgTWbwpvInUYDwABMOAAAAWDAAP0cAAFgvLEFBMAAbBuBNZwWnCUJtFgBapv+YMAA/RwCYLyRAATAAGwcgTWcQpxGCYC9AWqcKmDAAP0cAmDAAP22AATAAGwdgTWcYJxlCScBapxLYMAA/RwCYMAA+9AABMAAbB6BNZxynHcYhWkAYMAAYk8BKwTAAGwfgTWchJyPGIaSAGDAAGJPASsBBcAAbCOBNZyUnJSc0wAAAAOcppzTAAAAAwMDnKwAAAS0WGC8kQCcwgAABIC9YMAA/bYAnM0AAAQnYMAA+9AAAGDAAGwZAT8ECAHAAGwbgADAMyAWCAHAAGwcgQDAMyAhCAHAAGwdggDAMyAuCQGclMAA/TIAAAAAAQbAAGwhgTWc2JzrnUQAACMBapzZYMAA/RwCAAABA5zznUQAAAAAAAAAYMAA/bYBSpz/ASSdRAZqnQJgwAD9tsABM2AnwABMORadNxadJy60WMAAbBuAvbyTJ4FqFp0+LoC9wABsHCeDIQAAMyB0ADMg3QAAAAEBBMAAa4aBNYHQgeUGwABMOgBgwAD9tgFqgeFgwAD9tsABM2AAAYE1ADMhDwAzBX0AMwacADMIMwAzCVIAMw7HADMQKAAzEpcAMxPXADMVVgAzFwMAMxioADMafgAzHDAAMx2UADMfVwAzIOoAAAAPADMhDwAAAAAAAADAAGwkwABMO4E2AAAAAAAAFgLAAGwogTaB+4IKhCoHwABMPAAAAWDAAP0cAAAEBMAAbCqBNoKWgpoYgL0AYMAA/bYBKwTAAGwrgTaDboN4GLP3AGDAAP22ASsEwABsLIE2g8eDyxiYgABgwAD70AErBMAAbC2BNoP6hAAYhFIAYMAAbCgBKwEFwABsMwAAAAAEAAADAAAAAAAAAAAAYMAAbCgBPwEJAQDAAP0yAAAAAAIGwABsL4E2gkSCUYJVAQKCZwAAAAEDglWCVQAAAAAAAABgwABs7wAGwABsMYE2hAWEB4QoAAKETQAAAAEDhBCEKAAAAQAAgnZgwAD9HAFbAQEBhCAAAACHLl3AAG0BAV8AAAAAXwAAAAAAMyIWADMiPQAzIn4AAAACAsAAbDSBNoS3hMaGXQfAAEw9AAABYMAA/RwAAWDAAGwoBgTAAGw2gTaE84T3CYJnAGDAAGzvAATAAGw3gTaFA4UNGLP3AGDAAP22AATAAGw4gTaFFYUZGJiAAGDAAPvQAATAAGw5gTaFIoUoGIRSAGDAAGwoASsEwABsOoE2hTSFOBiAvQBgwAD9tgAEwABsO4E2ha+FuRizRQBgwABsegACBcAAbD+BNoW+hb6GCgAAAAOFx4YKAAAABQUFhc0AAASCZ2DAAGzvAIXYAAAEgL1gwAD9tgCF4wAABLNFYMAAbHoAhfQAAASYgGDAAPvQAIX/AAAEs/dgwAD9tgAAYMAAbDQBPwYIAcAAbDaAAMAzI0wIAcAAbDqBAMAzI1kIAcAAbDuCAMAzI2YIAcAAbDiDAMAzI3MIAcAAbDeEAMAzI4AJAYW+wAD9MgAAAAAFwABsQIE2hg+GD4YsAJVJAAOGIYYsAAAAAQEBhicAAASCZ2DAAGzvAABgwABsNAE/BggBwABsNysIAcAAbDgrCAHAAGw7KwgBwABsOisIAcAAbDaAAMAzI/oJAYYPwAD9MgAAAAABBsAAbD2BNoYxhjiGWwAAIwAAAAEDhkCGWwAAAAAAAABgwAD9tgFKhkYBJIZbBhaGSC6CZ8AAbDYngNkWhk4ugL3AAGw6J8AAQtUWhlUumIDAAGw4J5mPAAAzJEUAMyScAAAAAQLAAGxBgTaGu4bKhz8HwABMPgAAAWDAAP0cAAFgwABsKAEEwABsQ4E2hzSHPRitmABdwAD8dAFgwABs2gExhztgwABs2gABBcAAbEUAAAAABAAAAwAAAAAAAAAAAGDAAGxBAT8BCQEAwAD9MgAAAAAAAAAzJRoAAAAAAsAAbEaBNoeBh4eRUQPAAEw/AAABYMAA/RwAAA0EwABsSIE2h8yH0xiv6gBgwABsWQErBMAAbEmBNogqiEUYhtMAXcAA/HQBYMAAbGwBMYhDYMAAbGwABMAAbEqBNoi3iNMYs/sAXcAA/HQBYMAAbL0BMYjRYMAAbL0ABMAAbEuBNokciTYYhIAAXcAA/HQBYMAAbK8BMYk0YMAAbK8ABMAAbEyBNomAiZcYhIEAXcAA/HQBYMAAbIMBMYmVYMAAbIMABMAAbE2BNonbifEYhIMAXcAA/HQBYMAAbKIBMYnvYMAAbKIABMAAbE6BNosSiy4YmSwAXcAA/HQBYMAAbJQBMYssYMAAbJQABMAAbE+BNot/i5kYs/0AXcAA/HQBYMAAbNIBMYuXYMAAbNIABMAAbFCBNowYjDgYsHwAXcAA/HQBYMAAbHoBMYw2YMAAbHoABMAAbFGBNo1ajWcYtD8AXcAA/KUCYMAA/bZdwAD8pQJgwAD9tlsBKwTAAGxSgTaOm46sGIDPAF3AAPylAmDAAGwoXcAA/HQBYMAAbCgBMo6qYMAAbChdwAD8dAFgwABsKAAEwABsU4E2j2OPbgmB4wBgwAD70AE3BgTAAGxUgTaQ75D/CcAATEAAYMAA+9ABkwEFwABsWIE2kQSRBJENAAAAA5ELkQ0AAAAAAAAAYMAAbEYBPwEJAZEEwAD9MgAAAAABBsAAbFaBNpESkRSRTwAAhE0AAAABA5EdkU8AAAEAAIJ2YMAA/RwBWwEBAZEtAAAAhy5dwABtAQFfAAAAAF8AAAFKkTkBHJFBgJE5wDMnZMAATEEBAAEuAMAAbQMAADMnOQAzJ5UAAAABAsAAbFmBNpFUkVqVVgPAAExCAAABYMAA/RwAAA0EwABsW4E2kXeRgRi0QABgwABsvQAEwABsXIE2kYmRjRiYgABgwAD70AAEwABsXYE2kZiRphi0QQBgwAD9tgAEwABsXoE2kbORxBi0QgBgwAD6HAAEwABsX4E2kdGR5Bi0QwBgwAD6pgAEwABsYIE2kfGR/xi0RABgwAD6pgAEwABsYYE2kgySHBi0RQBgwAD6pgAEwABsYoE2kk6SYRi0RgBgwAD6CgAEwABsY4E2kpmSqhi0SABgwAD6CgAEwABsZIE2kuqS+Bi0SQBgwAD6CgAEwABsZYE2kyyTPxi0SgBgwAD6CgAEwABsZoE2k3uTiBi0SwBgwAD6CgAEwABsZ4E2k5KTmhi0TABgwAD6CgABBcAAbGuBNpOfk5+VDgAAAAOTqpUOAAAADQAADZO4AAAEtEBgwABsvQFqAGDAAPzZd5PPAAAEmIBgwAD70AFqAGDAAPzZd5PgAAAEtEFgwAD9tgFqAGDAAPzZd5P7AAAEtEJgwAD6HAFqAGDAAPzZd5QZAAAEtENgwAD6pgFqAGDAAPzZd5Q5AAAEtERgwAD6pgFqAGDAAPzZd5RUAAAEtEVgwAD6pgFqAGDAAPzZd5RxAAAEtEZgwAD6CgFqAGDAAPzZd5SRAAAEtEhgwAD6CgFqAGDAAPzZd5SvAAAEtElgwAD6CgFqAGDAAPzZd5TKAAAEtEpgwAD6CgFqAGDAAPzZd5TqAAAEtEtgwAD6CgFqAGDAAPzZd5UEAAAEtExgwAD6CgFqAGDAAPzZd2DAAGxZAT8OCAHAAGxbgADAMyjtCAHAAGxcgQDAMykCCAHAAGxdggDAMykXCAHAAGxegwDAMyksCAHAAGxfhADAMylBCAHAAGxghQDAMylWCAHAAGxhhgDAMylrCAHAAGxihwDAMymACAHAAGxjFADAMymVCAAIAcAAbGQUAMAzKaoJAAgBwABsZRQAwDMpvwoACAHAAGxmFADAMynUCwAIAcAAbGcUAMAzKekMAAkBk5/AAP0yAAAAAAEGwABsaYE2lROVFZVUAACETQAAAAEDlR6VVAAAAQAAgnZgwAD9HAFbAQEBlS4AAACHLl3AAG0BAV8AAAAAXwAAAUqVOgEclUKAlTrAMyrksG8BAAEuAMAAbQQAADMquQAzKxMAAAABAsAAbGyBNpWFlYuaAAOIjAAAAWDAAGw0AAAFBMAAbG6BNpXileUYgKwAYMAA/jcABMAAbG+BNpYzllcYs+gAXcAA/HQBYMAAbL0BMZZVYMAAbL0ABMAAbHCBNpaflsAYs+oAXcAA/HQBYMAAbKIBMZa+YMAAbKIABMAAbHGBNpb/lxYYhIEAXcAA/HQBYMAAbIMBMZcUYMAAbIMABMAAbHKBNpdYl3IYhIAAXcAA/HQBYMAAbK8BMZdwYMAAbK8AAgXAAGx4gTaY9Zj1mXoAAAADmQCZegAAAAQEBJkIAAAAgL1gwAD9tgCZEwAABICsYMAA/jcAmScAAACzRWDAAGx6AJk3AAAAmIBgwAD70AAAYMAAbGwBPwIIAcAAbG6BAMAzLAkJAJlFwABsPwUABWqZVGDAAGzvwAEzjoCZXcAzK/yCmWPAMywWg5lvwDMsIysABcAAbHmBNpl/mX+ZuACVSQADmZOZuAAAAAAAAABgwABsbAE/AggBwABsbisJAJmewABsQAEAAWqZsGDAAGzvwAEzjgACBsAAbHSBNpiNmJaY8AEAgVUAAAABA5iemPAAAAAAAAAAYMAA+goBSpinASIiFpi5FpinLrPowABsb4FVwAD8VgAWmNYWmMQus+rAAGxwgVXAAPxWABaY6RaY4S6EgcAAbHGBVcAA/FYGwABsdoE2mb2Zv5n+AACETQAAAAEDmciZ/gAAAQAAgnZgwAD9HAFbAQEBmdgAAACHLl3AAG0BAV8AAAAAXwAAAUqZ5AEcmeyAmeTAMy1LhJoBAAEuAMAAbQUAADMsuAAzLSAAMy16AAAAAgLAAGx6gTaa3JrinHcDwABMRAAAAWDAAGw0AAACBMAAbHyBNpsOmxYYguMAYMAA/bYABMAAbH2BNptkm3gYmW8AXcAA/HQBYMAA/bYBMZt2YMAA/bYAAgXAAGyBgTabfZt9m+wAAAADm4ub7AAAAAMDA5uRAAAEguNgwAD9tgCbogAAAIC9YMAA/bYAm6wAAACYgGDAAPvQAABgwABsegE/AggBwABsfIAAwDMt/QkAm7rAAGw/BQAFapvJYMAAbO/AATOngZvVwDMuCiuCm+HAMy4XKwAFwABsgoE2m/Gb8ZwwAJVJAAOcCJwwAAAAAAAAAGDAAGx6AT8CCAHAAGx8KwkAnBPAAGxAAQABapwlYMAAbO/AATOnAAEGwABsf4E2nDWcN5x1AACETQAAAAEDnECcdQAAAQAAgnZgwAD9HAFbAQEBnFAAAACHLl3AAG0BAV8AAAAAXwAAAUqcXAEcnGSAnFzAMy7RwABMRgEAAS4AwABtDAAAMy6mADMvAgAAAAECwABsg4E2nKGcp596A8AATEcAAAFgwABsNAAAAwTAAGyFgTac8Zz7GIQaAGDAAPoKAATAAGyGgTadh52jGLP7AF3AAPx0AWDAAGy9ATGdoWDAAGy9AATAAGyHgTaeS55hGISDAF3AAPx0AWDAAGyiATGeX2DAAGyiAAIFwABsi4E2nmaeZp76AAAAA55vnvoAAAAEAAAEnn8AAACAvWDAAP22AWoAYMAA/Nl3nooAAASEGmDAAPoKAWoAYMAA/Nl3nqUAAACzRWDAAGx6AWoAYMAA/Nl3nrUAAACYgGDAAPvQAWqeu2DAAPvQCWDAAGyDAT8CCAHAAGyFgQDAMy+7CQCex8AAbD8FAAVqntZgwABs78ABM8GAnt3AMy+mgp7jwDMv0IOe78AzL+UrAAXAAGyMgTae/57/nzQAlUkAA58RnzQAAAAAAAAAYMAAbIMBPwIIAcAAbIUrCQCfHMAAbEABAAFqny5gwABs78ABM8EAAQbAAGyJgTafOZ87n3gAAIRNAAAAAQOfRJ94AAABAACCdmDAAP0cAVsBAQGfVAAAAIcuXcAAbQEBXwAAAABfAAABSp9gARyfaICfYMAzMK2E7gEAAS4AwABtBgAAMzCCADMw3AAAAAECwABsjYE2oDugQaFaA8AATEkAAAFgwAD9HAAAAwTAAGyPgTagfKCBGGoAYMAA+9AABMAAbJCBNqCyoLUYgowAYMAA+9AABMAAbJGBNqEkoSgYgbAAYMAA/bYAAQXAAGyTgTahLaEtoVgAAAADoTWhWAAAAAMAAAOhPAAABGpgwAD70AFqAGDAAPzZd6FIAAAEgoxgwAD70AFqAGDAAPzZd6FSAAAEgbBgwAD9tgFqAGDAAPzZd2DAAGyNAT8ECAHAAGyPgADAMzFhCAHAAGyQgQDAMzF1CAHAAGyRggDAMzGKCQGhLcAA/TIAAAAAAAAAMzHYAAAAAALAAGyUgTahvKHCo28DwABMSgAAAWDAAGw0AAABBMAAbJaBNqImoioYgpMAXcAA/HQBYMAAbI0AAgXAAGyagTaiZqJmouYAAAADonKi5gAAAAMAAAOieAAAAJiAYMAA+9ABaqJ+YMAA+9AJooYAAASCk13AAPx0AWDAAGyNAWoAYMAA/Nl3opsAAACzRWDAAGx6AWoAYMAA/Nl3YMAAbJQBPwIIAcAAbJaBAMAzMkwJAKKwwABsPwUABWqiv2DAAGzvwAEz2iuCos/AMzJngKLbwDMyNisABcAAbJuBNqLrouujJgCVSQADowCjJgAAAAAAAABgwABslAE/AggBwABslisJAKMLwABsQAEAAWqjHWDAAGzvwAEz2gABBsAAbJiBNqMroy2jbQAAhE0AAAABA6M2o20AAAEAAIJ2YMAA/RwBWwEBAaNGAAAAhy5dwABtAQFfAAAAAF8AAAFKo1IBHKNagKNSwDMzKIYBAQABLgDAAG0IAAAzMv0AMzNXAAAAAQLAAGycgTajmaOfpyk3wABMTAAAAWDAAGw0AAFgwABsQQEEwABsnoE2hzSHPRitmABdwAD8dAFgwABs2gExhztgwABs2gACBcAAbKAAAAAABAAAAwAAAAAABQUFAAAAAIJnWwAAAAAAgL1bAAAAAACzRVsAAAAAAJiAWwAAAAAAs/dbAABgwABsnAE/AQkAAMAAbD8FAAWAAMAzM8CBAMAzM8iCAMAzM9CDAMAzM9iEAMAzM+AABcAAbKEAAAAABJVJAAMAAAAAAAEBAQAAAACCZ1sAAGDAAGycAT8BCQAAwABsQAEAAYAAwDM0MAAAAAAzNFMAAAAAAsAAbKKBNqOZo5+nKQOujgAAAWDAAGycAAAGBMAAbKSBNqPxo/UYgpAAYMAA/bYABMAAbKWBNqQ9pEkYoS8AYMAA/bYABMAAbKaBNqSVpJ0Ys/0AXcAA/HQBYMAAbNIABMAAbKeBNqTgpOQYgpMAXcAA/HQBYMAAbI0ABMAAbKiBNqUrpTIYhB0AYMAA+goABMAAbKmBNqWHpZIYhQEAYMAAbJQBKwIFwABsrYE2pZell6apAAAAA6WgpqkAAAAJAAAJpbAAAACAvWDAAP22AWoAYMAA/Nl3pcMAAACz92DAAP22AWoAYMAA/Nl3pdkAAACYgGDAAPvQAWql32DAAPvQCaXtAAAEgpBgwAD9tgFqAGDAAPzZd6X+AAAEoS9gwAD9tgFqAGDAAPzZd6YXAAAEs/1dwAD8dAFgwABs0gFqAGDAAPzZd6YsAAAEgpNdwAD8dAFgwABsjQFqAGDAAPzZd6ZHAAAAs0VgwABsegFqAGDAAPzZd6ZeAAAEhB1gwAD6CgFqAGDAAPzZd2DAAGyiAT8GCAHAAGykgwDAMzVfCAHAAGylhADAMzV0CAHAAGymhQDAMzWJCAHAAGynhgDAMzWkCAHAAGyoFADAMzXUCAAJAKZwwABsoAUABWqmf2DAAGzvwAEz9ICmhsAzNR+HpozAMzW/gqaYwDM1SYGmnsAzNTQABcAAbK6BNqaupq6m4wCVSQADpsCm4wAAAAAAAABgwABsogE/BggBwABsqCsIAcAAbKcrCAHAAGymKwgBwABspSsIAcAAbKQrCQCmy8AAbKEBAAFqpt1gwABs78ABM/QAAQbAAGyrgTam6KbqpycAAIRNAAAAAQOm86cnAAABAACCdmDAAP0cAVsBAQGnAwAAAIcuXcAAbQEBXwAAAABfAAABSqcPARynF4CnD8AzNu+FDgEAAS4AwABtBwAAMzbEADM3HgAAAAECwABsr4E2p1mnX6ipA8AATE4AAAFgwABsNAAAAQTAAGyxgTanoaelGIKQAGDAAP22AAIFwABstYE2p6qnqqgjAAAAA6e1qCMAAAADAwOnvQAAAIC9YMAA/bYAp8gAAASCkGDAAP22AKfdAAAAs0VgwABsegAAYMAAbK8BPwIIAcAAbLGBAMAzN4YJAKfxwABsPwUABWqoAGDAAGzvwAE0DYCoCcAzN3mCqA/AMzeTkysABcAAbLaBNqgoqCioYQCVSQADqDyoYQAAAAAAAABgwABsrwE/AggBwABssSsJAKhHwABsQAEAAWqoWWDAAGzvwAE0DQABBsAAbLOBNqhmqGiopwAAhE0AAAABA6hxqKcAAAEAAIJ2YMAA/RwBWwEBAaiBAAAAhy5dwABtAQFfAAAAAF8AAAFKqI0BHKiVgKiNwDM4TYS9AQABLgDAAG0KAAAzOCIAMzh8AAAAAQLAAGy3gTao2KjerwI3wABMUAAAAWDAAGw0AAFgwABsQQEEwABsuYE2hzSHPRitmABdwAD8dAFgwABs2gExhztgwABs2gACBcAAbLsAAAAABAAAAwAAAAAABQUFAAAAAIJnWwAAAAAAgL1bAAAAAACzRVsAAAAAAJiAWwAAAAAAs/dbAABgwABstwE/AQkAAMAAbD8FAAWAAMAzOOWBAMAzOO2CAMAzOPWDAMAzOP2EAMAzOQUABcAAbLwAAAAABJVJAAMAAAAAAAEBAQAAAACCZ1sAAGDAAGy3AT8BCQAAwABsQAEAAYAAwDM5VQAAAAAzOXgAAAAAAsAAbL2BNqjYqN6vAgPAAExRAAABYMAAbLcAAA4EwABsv4E2qSCpOwbAAExSAGDAAPvQAWqpOmDAAPvQCQTAAGzAgTapUKlpBsAATFMAYMAA+9ABaqloYMAA+9AVBMAAbMGBNql+qZYGwABMVABgwAD70AFqqZVgwAD70CEEwABswoE2qaupyAbAAExVAGDAAPvQAWqpx2DAAPvQUgTAAGzDgTaqH6orGLQIAGDAAPvQAATAAGzEgTaqbKp1GKHtAGDAAGznAATAAGzFgTaq0KrYGLP9AF3AAPx0AWDAAGzSAATAAGzGgTarBasJGIKQAGDAAP22AATAAGzHgTarNas/GIU0AGDAAP22AATAAGzIgTara6t9GKyGAGDAAP22AATAAGzJgTaryqvUGJqAAF3AAPx0AWDAAGzgAATAAGzKgTasRKxPGLQFAGDAAP22AATAAGzLgTasl6yjGLQHAGDAAPvQAATAAGzMgTas2KzcGIKTAF3AAPx0AWDAAGyNAAIFwABs0IE2rOGs4a55AAAAA6ztrnkAAAAOAAAOrP0AAACAvWDAAP22AWoAYMAA/Nl3rRAAAACz92DAAP22AWoAYMAA/Nl3rTEAAACzRWDAAGx6AWoAYMAA/Nl3rUcAAACYgGDAAPvQAWqtTWDAAPvQCa1bAAAEtAhgwAD70AFqAGDAAPzZd610AAAEoe1gwABs5wFqAGDAAPzZd62KAAAEs/1dwAD8dAFgwABs0gFqAGDAAPzZd62fAAAEgpBgwAD9tgFqAGDAAPzZd62wAAAEhTRgwAD9tgFqAGDAAPzZd63HAAAErIZgwAD9tgFqAGDAAPzZd63mAAAEmoBdwAD8dAFgwABs4AFqAGDAAPzZd639AAAEtAVgwAD9tgFqAGDAAPzZd64VAAAEtAdgwAD70AFqAGDAAPzZd64uAAAEgpNdwAD8dAFgwABsjQFqAGDAAPzZd2DAAGy9AT8LCAHAAGzDhADAMzt0CAHAAGzEhQDAMzuJCAHAAGzFhgDAMzueCAHAAGzGhwDAMzu5CAHAAGzHFADAMzvOCAAIAcAAbMgUAMAzO+MJAAgBwABsyRQAwDM7+AoACAHAAGzKFADAMzwTCwAIAcAAbMsUAMAzPCgMAAgBwABszBQAwDM8PQ0ACQCuPcAAbLsFAAVqrkxgwABs78ABNCeArlbAMzsfgq5cwDM7SYOuaMAzO16Brm7AMzs0AAXAAGzRgTaufq5+rrkAlUkAA66TrrkAAAAAAAAAYMAAbL0BPwsIAcAAbMwrCAHAAGzLKwgBwABsyisIAcAAbMkrCAHAAGzIKwgBwABsxysIAcAAbMYrCAHAAGzFKwgBwABsxCsIAcAAbMMrCQCunsAAbLwBAAFqrrBgwABs78ABNCcAAQbAAGzOgTauvq7ArwAAAIRNAAAAAQOuya8AAAABAACCdmDAAP0cAVsBAQGu2QAAAIcuXcAAbQEBXwAAAABfAAABSq7lARyu7YCu5cAzPcez5wEAAS4AwABtCQAAMz2cADM99gAAAAECwABs0oE2r0avTLDYA8AATFcAAAFgwABsNAAAAQTAAGzUgTavr6+3GIJqAGDAAGy9AAIFwABs2IE2r7yvvLBSAAAAA6/HsFIAAAAEAAAEr9cAAACAvWDAAP22AWoAYMAA/Nl3r+wAAACzRWDAAGx6AWoAYMAA/Nl3r/wAAACYgGDAAPvQAWqwAmDAAPvQCbAKAAAEgmpgwABsvQFqAGDAAPzZd2DAAGzSAT8CCAHAAGzUgwDAMz6SCQCwHcAAbD8FAAVqsCxgwABs78ABNECAsDXAMz5SgbA7wDM+Z4KwR8AzPnwrAAXAAGzZgTawV7BXsJAAlUkAA7BrsJAAAAAAAAAAYMAAbNIBPwIIAcAAbNQrCQCwdsAAbEABAAFqsIhgwABs78ABNEAAAQbAAGzWgTawlbCXsNYAAIRNAAAAAQOwoLDWAAABAACCdmDAAP0cAVsBAQGwsAAAAIcuXcAAbQEBXwAAAABfAAABSrC8ARywxICwvMAzP1nAAExZAQABLgDAAG0LAAAzPy4AMz+KAAAAAQLAAGzagTaxC7ERsnQDs7sAAAFgwAD9HAAAAgTAAGzcgTaxabFvCYJFAGDAAGwoAATAAGzdgTayQ7JHCavFAGDAAP22AAEFwABs34E2skyyTLJyAAAAA7JasnIAAAACAgKyYAAABIJFYMAAbCgAsm0AAASrxWDAAP22AABgwABs2gE/AwgBwABs3IAAwDM/+AgBwABs3YEAwDNABQkBskzAAP0yAAAAAAAAADNAQAAAAAACwABs4IE2srGyt7NJA8AATFoAAAFgwAD9HAAAAwTAAGzigTay1rLaCYC9AGDAAP22AATAAGzjgTay67LvCYKQAGDAAP22AATAAGzkgTazALMMCauCAGDAAP22AAEFwABs5oE2sxGzEbNHAAAAA7Mes0cAAAADAwOzJAAABIC9YMAA/bYAsy8AAASCkGDAAP22ALM6AAAEq4JgwAD9tgAAYMAAbOABPwQIAcAAbOKAAMAzQMEIAcAAbOOBAMAzQM4IAcAAbOSCAMAzQNsJAbMRwAD9MgAAAAAAAAAzQSIAAAAAAsAAbOeBNrN1s3u0eAPAAExbAAABYMAA/RwAAAQEwABs6YE2s5yzpAmEGQBgwAD6CgAEwABs6oE2s7OzugmEHQBgwAD6CgAEwABs64E2s8mz0gmEHgBgwAD6CgAEwABs7IE2s+Gz6wmEHwBgwAD6CgABBcAAbO6BNrPws/C0dgAAAAO0AbR2AAAABAAABLQPAAAEhBlgwAD6CgFqtBlgwAD6CgC0KwAABIQdYMAA+goBarQ0YMAA+goAtEYAAASEHmDAAPoKAWq0UWDAAPoKALRjAAAEhB9gwAD6CgFqtG9gwAD6CgBgwABs5wE/BQgBwABs6YAAwDNBuQgBwABs6oEAwDNBzwgBwABs64IAwDNB5QgBwABs7IMAwDNB+wkBs/DAAP0yAAAAAAAAADNCVgAAAAACwABs74E2tLy0wbUlC8AATFwAAAFgwAD9HAAACwTAAGzxgTa0wbTBCScAYMAA+9AABMAAbPOBNrTBtMEJKMAAbCQAYMAA/bYABMAAbPSBNrTBtMEGKQBdwAD8dAFgwABs7wFqAF3AAPx0AWDAAGzvwAE0VQTAAGz1gTa0zrTOBoRDAGDAAGzvAWoAYMAAbO/AATOOBMAAbPaBNrTZtNkGs+sAYMAAbO8BagBgwABs78ABM8EEwABs94E2tOK04gaCagBgwABs7wFqAGDAAGzvwAE0JwTAAGz4gTa07rTuBoSOAGDAAGzvAWoAYMAAbO/AATP0BMAAbPmBNrT3tPcGhf8AYMAAbO8BagBgwABs78ABM9oEwABs+oE2tQO1AwazRQBgwABs7wFqAGDAAGzvwAEzpwTAAGz7gTa1EbURBoZ7AGDAAGzvAWoAYMAAbO/AATQNBMAAbPyBNrUctRwGtAoAYMAAbO8BagBgwABs78ABNEABBcAAbQCBNrTBtMG1JQEAAAO0wbUlAAAAAgICtMEAAAQnYMAA+9AAtMEAAAQoYMAA/bYAAGDAAGzvAT8DCADAAGzxgADAM0PvCADAAGzzgQDAM0P7CQAAwAD9MgAAAAABBsAAbP6BNrTBtMG1JQAAIwAAAAEDtMG1JQAAAAAAAABgwAD9tgFKAAEPAC7AAGzzAAAzRDQAM0RkAAAAAQLAAG0BgTa5Yblwut8HwABMXQABAACCdmDAAP0cAVsBYMAA/RwAAAABBcAAbQ4AAAAABAAAAwAAAAAAAAAAAF3AAG0BAV8AAAE/AQkBAMAA/TIAAAAACgbAAG0DgTa5g7mFuZsAAsAATEEAAAABA7mNuZsAAAABAQG5lgAAAIFUYMAAbEYAAF8AAAAGwABtBIE2uZ+5obm/AAKwbwAAAAEDua25vwAAAAEBAbm6AAAAgVRgwABsWQAAXwAAAAbAAG0FgTa5w7nFueMAAoSaAAAAAQO50bnjAAAAAQEBud4AAACBVGDAAGxsAABfAAAABsAAbQaBNrnnuem6AwAChO4AAAABA7nzugMAAAABAQG5/gAAAIFUYMAAbIMAAF8AAAAGwABtB4E2uge6CbojAAKFDgAAAAEDuhO6IwAAAAEBAboeAAAAgVRgwABsogAAXwAAAAbAAG0IgTa6J7opukkAAoYBAAAAAQO6NrpJAAAAAQEBukQAAACBVGDAAGyUAABfAAAABsAAbQmBNrpNuk+6bwACs+cAAAABA7pcum8AAAABAQG6agAAAIFUYMAAbL0AAF8AAAAGwABtCoE2unO6dbqTAAKEvQAAAAEDuoG6kwAAAAEBAbqOAAAAgVRgwABsrwAAXwAAAAbAAG0LgTa6l7qZurcAAsAATFkAAAABA7qlurcAAAABAQG6sgAAAIFUYMAAbNIAAF8AAAAGwABtDIE2uru6vbrdAALAAExGAAAAAQO6yLrdAAAAAQEButgAAACBVGDAAGx6AABfAAAAAAAzRMgAM0T8ADNFLgAzRWAAM0WSADNFxAAzRfYAM0YoADNGWgAzRo4AM0bCAAAACgLAAG0PgTa8cLx2wABAZwPAAExeAAABXcAAbQEBYMAA/NkAAAABBcAAbRwAAAAABAAAAwAAAAAAAAAAAGDAAG0PAT8BCQEAwABtDgAAAAAKBsAAbRGBNrypvKm9lwAAwABMQQAAAAEDvLG9lwAAAAEBAby6AAAAgVRgwABsRgAAYMAA/NkBPgI9HL1TFr1JgL1EwDNHZYbTwABsSYP4AQABFr1bLoSawABtEwDAAPxCPRy9fRa9c4C9bsAzR2WZLMAAbE6D+AEAARa9hS6GAcAAbRYAwAD8QgbAAG0SgTa9nL2cvbwAALBvAAAAAQO9qL28AAAAAQEBvbUAAACBVGDAAGxZAABgwAD82QE+AAbAAG0TgTa9wb3BvpYAAISaAAAAAQO9zb6WAAAAAQEBvdoAAACBVGDAAGxsAABgwAD82QE+BD0cvf0WveuAvebAM0ghs+jAAGxvg/gBAAEWvgUus+fAAG0XAMAA/EI9HL4wFr4egL4ZwDNIIbPqwABscIP4AQABFr44LoUOwABtFQDAAPxCPRy+Vha+ToC+ScAzSCGEgcAAbHGD+AEAARa+Xi6E7sAAbRQAwAD8Qj0cvn0WvnSAvm/AM0ghhIDAAGxyg/gBAAEWvoUuhL3AAG0YAMAA/EIGwABtFIE2vpu+m78KAACE7gAAAAEDvqW/CgAAAAEBAb6wAAAAgVRgwABsgwAAYMAA/NkBPgI9HL7LFr7BgL68wDNI97P7wABshoP4AQABFr7TLrPnwABtFwDAAPxCPRy+8xa+7IC+58AzSPeEg8AAbIeD+AEAARa++y6FDsAAbRUAwAD8QgbAAG0VgTa/D78Pv1cAAIUOAAAAAQO/Gb9XAAAAAQEBvyQAAACBVGDAAGyiAABgwAD82QE+AT0cvz4WvzWAvzDAM0l9s/3AAGymg/gBAAEWv0YuwABMWcAAbRoAwAD8QgbAAG0WgTa/XL9cv34AAIYBAAAAAQO/ab9+AAAAAQEBv3cAAACBVGDAAGyUAABgwAD82QE+AAbAAG0XgTa/g7+Dv9EAALPnAAAAAQO/kL/RAAAAAQEBv54AAACBVGDAAGy9AABgwAD82QE+AT0cv7gWv6+Av6rAM0oTs/3AAGzFg/gBAAEWv8AuwABMWcAAbRoAwAD8QgbAAG0YgTa/1r/Wv/YAAIS9AAAAAQO/4r/2AAAAAQEBv+8AAACBVGDAAGyvAABgwAD82QE+AAbAAG0ZgTa/+r/6wABAHAAAwABMRgAAAAEDwABABcAAQBwAAAABAQHAAEAVAAAAgVRgwABsegAAYMAA/NkBPgAGwABtGoE2wABAIMAAQCDAAEBlAADAAExZAAAAAQPAAEAswABAZQAAAAEBAcAAQDkAAACBVGDAAGzSAABgwAD82QE+AT0cwABARS6z5wEAARbAAEBYgMAAQFPAM0r1gmrAAGzUAMAAbRcAADNHQwAzR8sAM0gBADNI1wAzSV0AM0m9ADNJ8wAzSlMAM0qJADNKyQAzSzIAAAAKAAIGwABsJoE2tSi1L7cdAAHAAExfAAAAAQO1O7cdAAAAAQEBtUUAAACCZ2DAAGzvAABgwAD9tgE+AUe1T4C1V8AzS4cJAbVxarVxYMAAbO/AATOOAD4BSrWAASeEQwG1pGq1pGDAAGzvwAEzwQA+AUq1sQEnmdUBtdNqtdNgwABs78ABNCcAPgFKteMBJ4JqAbYIarYIYMAAbO/AATP0AD4BSrYVASeEjgG2N2q2N2DAAGzvwAEz2gA+AUq2RwEnhf8BtmxqtmxgwABs78ABM6cAPgFKtn4BJ7NFAbalaralYMAAbO/AATQNAD4BSra0ASeGewG22Gq22GDAAGzvwAE0QAA+AUq25wEntAoAAT4BSrcMASsGwABsJ4E2tyC3KbkXAAHAAExgAAAAAQO3N7kXAAAAAQEBtz8AAACCZ2DAAP22AABgwABs7wE+AUe3SYC3UcAzTJsJAbdiardiYMAA/bbAAJz/AD4BSrdzAWq3g2DAAGzvwAEzjgG3lWq3lWDAAP22wACWpgA+AUq3pAFqt7RgwABs78ABM8EBt8Rqt8RgwAD9tsABFGEAPgFKt9YBarfmYMAAbO/AATQnAbf5arf5YMAA/bbAATR8AD4BSrgIAWq4GGDAAGzvwAEz9AG4KGq4KGDAAP22wAE0fwA+AUq4OgFquEpgwABs78ABM9oBuF1quF1gwAD9tsABNIIAPgFKuHEBariBYMAAbO/AATOnAbiWariWYMAA/bbAAKI/AD4BSrinAWq4t2DAAGzvwAE0DQG4yWq4yWDAAP22wAE0hQA+AUq42gFquOpgwABs78ABNEAAAT4BSrkGASsBgTYAM03VADMhdgAzIo8AMySpADMlIwAzJ6IAMysgADMtiwAzLw8AMzDpADMx4QAzM2QAMzRcADM3KwAzOIkAMzmBADM+AwAzP5cAM0BJADNBKwAzQl8AM0RxADNG8wAzS2MAAAAWADNLZQAzTHkAM03VAAAAAgAAAMAAbR0AgTcAAAWBJQAAwAC9lwAAgT8AAMAAxMMAAIFXAADAAJqkAACBhAAAwACapQAAgZwAAMAAbCQAAAAAAAQCwABtIYE3gn+Chay3A8AATGEAAAFdwADHTgJdwAD8pQJgwAD9tltgwABsRgAAAQTAAG0jgTeDOYNfCbeYAF3AAPylAmDAAP22YMAAbCgBHoNIwADAjwACYMAA/bZgwABsKAAAAQXAAG02AAAAAAQAAAMAAAAAAAAAAABgwABtIQE/AQkBAMAAx1cAAAAADwbAAG0lgTeDZINsjaAAAIi4AAAAAQODc42gAAAAAQEBg4kAACCCYF3AAPylAmDAAP22WwAAYMAAbEYBPhA9HIOeFoOVLreYwABtI4JCAAAAAMAA/MNOg7CDtwAAgXZgwABsRgEfg73AAGxYAAAAAE6D0IPZAACIP1sBHIPfgIPbwDNPPksBAAEniD8AwAD8uT0chO4WhOSBhN3AM090htPAAGxJgKUBAAEchSIWhRsmhRMAHIUHgoT/wDNPjksBAAEnhEMAAF3AAPylAltbKcAA/MiAqwEBYMAAbGwBNIUmA4UmhTwAAAABAQGFJwAAAIJjWwAAYMAAbGwBSoUtARyFLS7AAExiAQABJoU6AYOFOsAzUAldwAD8pQJbWwDAAG0nAMAA/D0AwAD8hj0chVwWhUuBhUTAM090hIHAAGxMgKUBAAEchYUWhX4mhXYAHIVsgoVkwDNPjksBAAEnmdUAAF3AAPylAltbKcAA/MiAqwEBYMAAbIMBNIWJA4WJhZ0AAAABAQGFigAAAID1WwAAYMAAbIMBSoWQARyFkC7AAEEkAQABJoWbAYOFm8AzUKVdwAD8pQJbWwDAAG0oAMAA/D0AwAD8hj0chbYWhayBhaXAM090s/vAAGxKgKUBAAEchesWheQmhdwAHIXPgoXHwDNPjksBAAEngmoAAF3AAPylAltbKcAA/MiAqwEBYMAAbL0BNIXvA4XvhgYAAAABAQGF8AAAAIGmWwAAYMAAbL0BSoX2ARyF9i7AAExjAQABJoYEAYOGBMAzUUFdwAD8pQJbWwDAAG0vAMAA/D0AwAD8hkmGXiEchnYchmqChmLAM0+OSwEAASe0CgAASAEAASsAwAD9KT4BPRyGlxaGjoGGh8AzT3Sz/cAAbE+ApQEAARyGzRaGxiaGvgAchrKChqrAM0+OSwEAASe0CgAAXcAA/KUCW1spwAD8yICrAQFgwABs0gE0htEDhtGG5wAAAAEBAYbSAAAAgPVbAABgwABs0gFKhtgBHIbYLsAATGQBAAEmhuUBg4blwDNSA13AAPylAltbAMAAbTIAwAD8PQDAAPyGPz0chwwWhvyBhvXAM090hIPAAGxNgKUBAAEchzUWhy4mhyYAHIccgocUwDNPjksBAAEnhI4AAF3AAPylAltbKcAA/MiAqwEBYMAAbKIBNIc5A4c5h00AAAABAQGHOgAAAIGmWwAAYMAAbKIBSodAARyHQC7AAExlAQABJodLAYOHS8AzUqBdwAD8pQJbWwDAAG0pAMAA/D0AwAD8hj0ch2UWh1yBh1XAM090hIDAAGxLgKUBAAEch5kWh5Imh4oAHId+god2wDNPjksBAAEnhnsAAF3AAPylAltbKcAA/MiAqwEBYMAAbK8BNIedA4edh7MAAAABAQGHngAAAIOmWwAAYMAAbK8BSoekARyHpC7AAEDRAQABJoexAYOHscAzUzxdwAD8pQJbWwDAAG0rAMAA/D0AwAD8hj0ch8wWh8KBh7vAM090mSzAAGxOgKUBAAEciAEWh/omh/IAHIflgofdwDNPjksBAAEnhf8AAF3AAPylAltbKcAA/MiAqwEBYMAAbJQBNIgFA4gFiBwAAAABAQGIBgAAAID1WwAAYMAAbJQBSogMARyIDC7AAExmAQABJogaAYOIGsAzU9hdwAD8pQJbWwDAAG0qAMAA/D0AwAD8hj0ciDUciCmAiCXAM08+SwEAASfAAExnAMAA/LmD+AEAATSIPQOIPYk6AAAAAgICiD4AAACD+VsAiEEAAACVBlsAAGDAAPzZAT4DTohYiFwAAMAASMpgwABsQQEmiFgBHIhmFoheLreYwABtI0sBAAGDiGfAM1RIAMAA/LlgwABsQUAhHIh8hYh4wDNUZEgBAAErAMAA/SmIeIiDAEaIjIiiiJUAAAC4DVsAJoicAYSInMAzVFFdwAD8MgFbPgNOiLCItwAAgkVgwABsKAEciMEWiLkut5jAAG0jSwEAARyIxYaIwsAzVLpLAQABJ7NVAAAAwAD8uUAhHIjkh4jdwDNU2EgBAAErAMAA/SmI3YjrAD0ciP8WiPqFiPbAM1RkrZjAAGxDVgEAAR+JB8AAbN8CAAKHiRbAM1TYJokhARyJIYaJHsAzVLpLAQABJ6vFAABgwAD9tgAAwAD8hQAAPTUAAAABAFsBHIlGgIlCwDNPPksBAAEngM8AwAD8uSMciViDAMAzVXlIAQABKwAAKxyJWIMAwDNVeYP4AQABNIlgA4lgifgAAAACAgKJaAAAAIP5YMAA/bYAiWsAAACAz1sAAGDAAPzZAT4CTomOiZMAAJUGXcAA/HQBYMAA/bYBJomOAYWJlcAzVdFdwAD8dAFgwAD9tj0cibwWibCBianAM090gM/AAGxSgL8CAAIcicUWib0ut5jAAG0jSwEAAYSJxsAzVcQAwAD8uRyJ6RyJ0YaJzMAzVeSAqwEBYMAAbCgBNInVA4nViecAAAABAQGJ1gAAAJaWYMAA/bYAAGDAAGwoAUqJ3AEcieQWidwut5jAAG0jSwEAAYeJ5cAzVmkAwAD8uQDAAPw9gK0AAAAAwAD8SADAAPy6AAABWz0cihwWigeBigDAM090sHzAAGxQgKUBAAEcikEmijgAHIoogIokwDNPPksBAAEnsHwAwAD8uV3AAPx0AVuAqwEBYMAAbHoBNIpFA4pFil4AAAABAQGKRgAAAK19WwAAYMAAbHoBSopMARyKTC7AAExoAQABJopcAYOKXMAzVwtdwAD8pQJbWwDAAG0mAMAA/D0AwAD8hj0Xim6BimfAM090r+ocinguwABMaQEAASaKiQEciomAioXAM08+SwEAASev6gDAAPy5XcAA/KUCW1sAwABtLMAAbEhJipwhHIq2HIqkgIqgwDNPPksBAAEntD8AwAD8uUgBAAErAMAA/Sk+A06KzYreAAHAAExqXcAA/KUCYMAA/bZdwAD8pQJgwAD9tlsBHIsJJosBAByK74CK68AzTz5LAQABJ7Q/AMAA/LldwAD8pQJbW5YyAAJgwAD9tl3AAPylAmDAAP22WwAAwAD8tkaLNYtki0AAAAGEQ13AAPylAmDAAP22WwAWi1yDi0vAM1e5KcAA/Mg+AUmLbiEci4Uci3mEi3LAM1ggSwEAASeZbwDAAPy5SAEAASsAwAD9KT4DTowljC8AAcAATGtdwAD8pQJgwAD9tlsBJoxEAByMOISMMcAzWCBLAQABJ5lvAMAA/LldwAD8pQJgwAD9tls9HIxxhYxnwDNYb4P4AQABNIx5A4x5jN8AAAACAgKMegAAAIMkYMAA/bYAjIIAAACBolsAAGDAAPzZAT4BPRyMoIWMl8AzWG+AvwIAAoaMocAzWMocjMQmjLIAh4yswDNY113AAPx0AVuWMgABYMAA/bYAAMAA/IIAwAD8ugDAAPzEPRyM84SM7MAzWCCAvwIAAieZbxyNC4WNAcAzWG+WMgACYMAA/bZdwAD8dAFgwAD9tgAAwAD8tgDAAPy6Pz0XjUiBjUHAM090tD+DjVjAM1e5wABsUT9KjY8BgY2WwDNPdAbAAG0mgTeNpY20juEAAMAATGgAAAABA43DjuEAAAABAQGNyAAAAIJgXcAA/KUCW1sAAGDAAGx6AT4ETo3jjeoAAIF2YMAAbHoBJo3jARyN7C7AAExsAQABHI34gI30wDNZsUsBAAEns1UAwAD8uQDAAG0zYMAAbHo9NY4FAAABAGDAAGx6AYGOBcAzWcs1AAAAAQBbAReOFIKOEsAzWgqC4yaOFAEcjiOAjh/AM1mxSwEAASeC4wDAAPy5YMAA/bbAAGx8NQAAAAEAWwEXjjiCjjbAM1oKgL0mjjgBHI5DgI4/wDNZsUsBAAEngL0AwAD8uWDAAP22wABsOjUAAAABAFsBF45Ugo5SwDNaCpiAJo5UARyOX4COW8AzWbFLAQABJ5iAAMAA/LlgwAD70MAAbDiCAMAzWgo9HI6FFo50gY5twDNZy5lvwABsfYClAQABNQAAAAEAXcAA/DIBYMAA/bYBHI6mJo6dAByOkYCOjcAzWbFLAQABJ5lvAMAA/LldwAD8dAFbgKsBAWDAAP22ATSOqgOOqo68AAAAAQEBjqsAAACIQVsAAGDAAP22AUqOsQEmjrMAgo6xwDNbL2DAAP22AMAA/D0jHI6+ggDAM1riSAEAASsAAGqOwV3AAPx0AWDAAP22gxuCAMAzWuIBXcAA/DIBYMAA/bYAwAD8hkqO0AGBjtfAM1nLBsAAbSeBN47mjvKRfQAAwABMYgAAAAEDjv6RfQAAAAEBAY8DAAAAgmBdwAD8pQJbWwAAYMAAbGwBPgROjxuPIgAAgXZgwABsbAEmjxsBHI8kLsAATGwBAAEcjzCAjyzAM1u9SwEAASezVQDAAPy5AMAAbTNgwABsbD01jz0AAAEAYMAAbGwBgY89wDNb1zUAAAABAFsBF49Mgo9KwDNcFoC9Jo9MARyPV4CPU8AzW71LAQABJ4C9AMAA/LlgwAD9tsAAbDo1AAAAAQBbARePaIKPZsAzXBaArB6PcsAA/mUBAAEmj3wBHI98gI94wDNbvUsBAAEnpRgAwAD8uWDAAP22AMAAbG41AAAAAQBbARePloKPlMAzXBazRSaPlgEcj6MuwABMbAEAARyPr4CPq8AzW71LAQABJ7NFAMAA/LkAwABtM2DAAGx6wABsOzUAAAABAFsBF4/Hgo/FwDNcFpiAJo/HARyP0oCPzsAzW71LAQABJ5iAAMAA/LlgwAD70MAAbDiCAMAzXBZGj+CQEY/pAAAAhFZbACaQAwEckAMcj/aAj/LAM1u9SwEAASeXggDAAPy5gKsBAAEWkAcuwABMbMAAbTMAAF3AAPwyAVs+AUmQGSWQI4KQHcAzXStgwABsvT4BPRyQVxaQRYGQPsAzW9ez6MAAbG9WAQABFJBbwDNdKwIBYMAAbL0AwAD8hUmQcCWQeoKQdMAzXStgwABsoj4BPRyQqxaQmYGQksAzW9ez6sAAbHBWAQABFJCvwDNdKwIBYMAAbKIAwAD8hUmQxCWQzoKQyMAzXStgwABsgz4BPRyQ9RaQ7YGQ5sAzW9eEgcAAbHFWAQABFJD5wDNdKwIBYMAAbIMAwAD8hT4CQCWRJYKRH8AzXStgwABsr5EfkTMAPRyRThaRRYGRPsAzW9eEgMAAbHJWAQABJpFSAYKRUsAzXStgwABsrwDAAPyFSpFsAYGRc8AzW9cGwABtKIE3kYKRjJPAAADAAEEkAAAAAQORlpPAAAAAAQEBkZsAAACCYF3AAPylAltbAABgwABsgwE+BU6RsZG4AACBdmDAAGyDASaRsQEckbouwABMbAEAARyRxoCRwsAzXptLAQABJ7NVAMAA/LkAwABtM2DAAGyDPTWR0wAAAQBgwABsgwGBkdPAM161NQAAAAEAWwEXkeKCkeDAM170gL0mkeIBHJHtgJHpwDNem0sBAAEngL0AwAD8uWDAAP22wABsOjUAAAABAFsBF5H+gpH8wDNe9IRSHJIHLsAATGwBAAEckhOAkg/AM16bSwEAASeEUgDAAPy5AMAAbTPAAGw5NQAAAAEAWwEXkieCkiXAM170s0UmkicBHJI0LsAATGwBAAEckkCAkjzAM16bSwEAASezRQDAAPy5AMAAbTNgwABsesAAbDs1AAAAAQBbAReSWIKSVsAzXvSYgCaSWAEckmOAkl/AM16bSwEAASeYgADAAPy5YMAA+9DAAGw4NQAAAAEAWwEXknSCknLAM170hBockp8ckpIckoWAkoHAM16bSwEAASeh7QDAAPy5SwEAASeEJAAASAEAASkAwAD9KcAAbIWCAMAzXvRAJZK6gZKzwDNetWDAAGyDkrOSxgBGks2S/pLWAAAAhFZbACaS8AEckvAckuOAkt/AM16bSwEAASeXggDAAPy5gKsBAAEWkvQuwABMbMAAbTMAAF3AAPwyAVs+AUmTBiWTEIKTCsAzYGFgwABsvT4BPRyTPBaTMoGTK8AzXrWz+8AAbIZWAQABFJNAwDNgYQIBYMAAbL0AwAD8hT4CQCWTbIKTZsAzYGFgwABsopNmk3gAPRyTkRaTioGTg8AzXrWEg8AAbIdWAQABJpOVAYKTlcAzYGFgwABsogDAAPyFSpOvAYGTtsAzXrUGwABtKYE3k8WTz5YdAADAAExlAAAAAQOT2ZYdAAAAAQEBk94AAACCYF3AAPylAltbAABgwABsogE+Ak6T9JP7AACBdmDAAGyiASaT9AEck/0uwABMbAEAARyUCYCUBcAzYVNLAQABJ7NVAMAA/LkAwABtM2DAAGyiSpQWATWUHQAAAQBgwABsogGBlB3AM2FtNQAAAAEAWwEXlCyClCrAM2GvgL0mlCwBHJQ3gJQzwDNhU0sBAAEngL0AwAD8uWDAAP22wABsOjUAAAABAFsBF5RIgpRGwDNhr4RSHJRRLsAATGwBAAEclF2AlFnAM2FTSwEAASeEUgDAAPy5AMAAbTPAAGw5NQAAAAEAWwEXlHGClG/AM2Gvs/cmlHEBHJSCgJR+wDNhU0sBAAEns/cAwAD8uWDAAP22wABsNzUAAAABAFsBF5SZgpSXwDNhr7NFJpSZARyUpi7AAExsAQABHJSygJSuwDNhU0sBAAEns0UAwAD8uQDAAG0zYMAAbHrAAGw7NQAAAAEAWwEXlMqClMjAM2GvmIAmlMoBHJTVgJTRwDNhU0sBAAEnmIAAwAD8uWDAAPvQwABsODUAAAABAFsBF5TmgpTkwDNhr4KQJpTmARyU8YCU7cAzYVNLAQABJ4KQAMAA/LlgwAD9tsAAbKQ1AAAAAQBbAReVAoKVAMAzYa+hLyaVAgEclRWAlRHAM2FTSwEAASehLwDAAPy5YMAA/bbAAGylNQAAAAEAWwEXlS6ClSzAM2GvgpMclTUuwABMbQEAARyVQ4CVP8AzYVNLAQABJ4KTAMAA/LkAwABtNMAAbKc1AAAAAQBbAReVVYKVU8AzYa+EHSaVVQE1AAAAAQBbARyVY4CVX8AzYVNLAQABJ4QnAMAA/LkjHJVtFADAM2OxCwBIAQABKwAAKhQAwDNjsQsAAVtgwAD6CsAAbKg1AAAAAQBbAReVfoKVfMAzYa+FASaVfgEclYwuwABMbAEAARyVmICVlMAzYVNLAQABJ4UBAMAA/LkAwABtM2DAAGyUwABsqTUAAAABAFsBF5WxgpWvwDNhr7P9HJYRHJXiJpXOAByVwYCVvcAzYVNLAQABJ5eCAMAA/LldwAD8dAFbgKsBAWDAAGzSATSV8wOV85YEAAAAAQEBlfQAAACA9VsAAGDAAGzSAUqV+gEmlfoBHJX6LsAATGwBAAEUlgLAM2SPDQAAwABtM2DAAGzSAMAA/D2ArQAAAADAAPxIwABspoIAwDNhrwbAAG0qgTeWIpYvlwEAAMAATGYAAAABA5Y8lwEAAAABAQGWQQAAAIJgXcAA/KUCW1sAAGDAAGyUAT4CTpZalmEAAIF2YMAAbJQBJpZaARyWYy7AAExsAQABHJZvgJZrwDNlAEsBAAEns1UAwAD8uQDAAG0zYMAAbJRKlnwBNZaDAAABAGDAAGyUAYGWg8AzZRo1AAAAAQBbAReWkoKWkMAzZVyCkxyWmS7AAExtAQABHJangJajwDNlAEsBAAEngpMAwAD8uQDAAG00wABsljUAAAABAFsBF5a5gpa3wDNlXJiAJpa5ARyWxICWwMAzZQBLAQABJ5iAAMAA/LlgwAD70MAAbDg1AAAAAQBbAReW1YKW08AzZVyzRSaW1QEcluIuwABMbAEAARyW7oCW6sAzZQBLAQABJ7NFAMAA/LkAwABtM2DAAGx6wABsO4IAwDNlXAbAAG0rgTeXBpcSl+AAAMAAQNEAAAABA5cel+AAAAABAQGXIwAAAIJgXcAA/KUCW1sAAGDAAGyvAT4CTpc7l0IAAIF2YMAAbK8BJpc7ARyXRC7AAExsAQABHJdQgJdMwDNmU0sBAAEns1UAwAD8uQDAAG0zYMAAbK9Kl10BNZdkAAABAGDAAGyvAYGXZMAzZm01AAAAAQBbAReXc4KXccAzZq+AvSaXcwEcl36Al3rAM2ZTSwEAASeAvQDAAPy5YMAA/bbAAGw6NQAAAAEAWwEXl4+Cl43AM2avhFIcl5guwABMbAEAARyXpICXoMAzZlNLAQABJ4RSAMAA/LkAwABtM8AAbDk1AAAAAQBbAReXuIKXtsAzZq+CkCaXuAEcl8OAl7/AM2ZTSwEAASeCkADAAPy5YMAA/bbAAGyxNQAAAAEAWwEXl9SCl9LAM2avmICTwABsOIIAwDNmrwbAAG0sgTeX5ZfxnjgAAMAATGkAAAABA5f9njgAAAABAQGYAgAAAIJgXcAA/KUCW1sAAGDAAGxZAT4ITpgSmB4AAMAATG5gwABsWQE1mCQAAAEAYMAAbFkBH5gkwABsawAAAAA1AAAAAQBbAReYOoGYOMAzZ9q0QCaYOgEcmEcuwABMbAEAARyYU4CYT8AzZ69LAQABJ7RAAMAA/LkAwABtM2DAAGy9wABsWzUAAAABAFsBF5hrgZhpwDNn2piAJphrARyYdoCYcsAzZ69LAQABJ5iAAMAA/LlgwAD70MAAbFw1AAAAAQBbAReYh4GYhcAzZ9q0Qh6YpMAA+lgBAAEmmK4BHJiugJiqwDNnr0sBAAEntEIAwAD8uWDAAP22AMAAbF41AAAAAQBbAReYzYGYy8AzZ9q0QSaYzQEcmOKAmN7AM2evSwEAASe0QQDAAPy5YMAA/bbAAGxdNQAAAAEAWwEXmP2BmPvAM2fatEYmmP0BHJkXgJkTwDNnr0sBAAEntEYAwAD8uWDAAPoKwABsYjUAAAABAFsBF5k3gZk1wDNn2rRIJpk3ARyZT4CZS8AzZ69LAQABJ7RIAMAA/LlgwAD6CsAAbGM1AAAAAQBbAReZbYGZa8AzZ9q0SSaZbQEcmYKAmX7AM2evSwEAASe0SQDAAPy5YMAA+grAAGxkNQAAAAEAWwEXmZ2BmZvAM2fatEommZ0BHJm3gJmzwDNnr0sBAAEntEoAwAD8uWDAAPoKwABsZTUAAAABAFsBF5nXgZnVwDNn2rRLJpnXARyZ64CZ58AzZ69LAQABJ7RLAMAA/LlgwAD6CsAAbGY1AAAAAQBbAReaBYGaA8AzZ9q0TCaaBQEcmhSAmhDAM2evSwEAASe0TADAAPy5YMAA+grAAGxngQDAM2faTpp6mo4AALRDWwEcmpSAmpDAM2evSwEAASe0QwDAAPy5SZqxJZrJgpq1wDNqOWDAAP22PgE9F5rogZrcwDNnybRDHJr+LsAATG/AAG0dAQABFJsNwDNqOQIBYMAA/bYAwABtLsAAbF8+AkAlm1GCmz3AM2o5YMAA+9CbPZtXAD0Xm2yBm2DAM2fJtEMfm5DAAPrSAQAAAcAATHAmm6cBgpunwDNqOWDAAPvQwABsX06bzJvbAAC0RFsBHJvhgJvdwDNnr0sBAAEntEQAwAD8uUmb+SWcDIOb/cAzauhgwAD9tj4BPRecK4GcH8AzZ8m0RBycPC7AAExvwABtHQEAARScS8AzaugDAWDAAP22AMAAbS7AAGxgPgJAJZyFg5x2wDNq6GDAAPvQnHaciwA9F5yggZyUwDNnybREH5y1wAD60gEAAAHAAExwJpzMAYOczMAzauhgwAD70MAAbGBOnOyc/QAAtEVbARydA4Cc/8AzZ69LAQABJ7RFAMAA/LlJnR0lnTKEnSHAM2uXYMAA/bY+AT0XnVGBnUXAM2fJtEUcnWQuwABMb8AAbR0BAAEUnXPAM2uXBAFgwAD9tgDAAG0uwABsYT4CQCWdsYSdoMAza5dgwAD70J2gnbcAPRedzIGdwMAzZ8m0RR+d7cAA+tIBAAABwABMcCaeBAGEngTAM2uXYMAA+9DAAGxhSp4iAYGeKcAzZ8kGwABtLoE3noOejKDtAADAAExvwABtHQAAAAEDnpqg7QAAAAEBAZ6iAAAAgbNgwAD9tgAAYMAA+qYBPgdJnrIhHJ7AgJ63wDNsdoMXAQABJ4LmAMAA/dM+AUqe1wEfnuLAAPrSAQAAAZaNHp79wAD7/wEAAYCfA8AzbHYAP06fHZ8jAACEf13AAPx0AWDAAP22ARyfLoCfJcAzbHaApgEAASeC5gDAAP3ZTp9Cn0gAAMAATHFgwAD6ggEen1HAAPqgAQABHJ9cgZ9XwDNszksBAAGTAMAA/IMATp9qn3IAAMAATHJgwAD6ggEen3vAAPqgAQABHJ+GgZ+BwDNszksBAAGUAMAA/IMATp+Un5wAAIG1YMAA+oIBHp+lwAD6oAEAARyfsIGfq8AzbM5LAQABlQDAAPyDAE6gQqBOAADAAExzYMAA+oIBHKCOHKBqHKBgaqBQYMAA+9DAALWog4gBAAGEoGLAM21aAMAA/PdkAQABHKCEaqB0YMAA+9DAATSIg4gBAAGDoIbAM20qAMAA/PcAwAD6j2QBAAEcoKZqoJhgwAD70MABNI6DiAEAAYKgqMAzbPoAwAD89wDAAPqPSqCzAR+gvsAA+tIBAAABlo0coOGFoNXAM22IwABLMwAAAADAAPqXBsAAbS+BN6DyoP+kQAAAwABMYwAAAAEDoQykQAAAAAEBAaERAAAAgmBdwAD8pQJbWwAAYMAAbL0BPgJOoSqhMQAAgXZgwABsvQEmoSoBHKEzLsAATGwBAAEcoT+AoTvAM25ZSwEAASezVQDAAPy5AMAAbTNgwABsvUqhTAE1oVMAAAEAYMAAbL0BgaFTwDNuczUAAAABAFsBF6FigqFgwDNutYC9JqFiARyhbYChacAzbllLAQABJ4C9AMAA/LlgwAD9tsAAbDo1AAAAAQBbARehfoKhfMAzbrWEUhyhhy7AAExsAQABHKGTgKGPwDNuWUsBAAEnhFIAwAD8uQDAAG0zwABsOTUAAAABAFsBF6GngqGlwDNutbP3JqGnARyhuIChtMAzbllLAQABJ7P3AMAA/LlgwAD9tsAAbDc1AAAAAQBbARehz4KhzcAzbrWzRSahzwEcodwuwABMbAEAARyh6ICh5MAzbllLAQABJ7NFAMAA/LkAwABtM2DAAGx6wABsOzUAAAABAFsBF6IAgqH+wDNutZiAJqIAARyiC4CiB8AzbllLAQABJ5iAAMAA/LlgwAD70MAAbDg1AAAAAQBbAReiHIKiGsAzbrWCkCaiHAEcoieAoiPAM25ZSwEAASeCkADAAPy5YMAA/bbAAGzGNQAAAAEAWwEXojiCojbAM261hTQmojgBHKJJgKJFwDNuWUsBAAEnhTQAwAD8uWDAAP22wABsxzUAAAABAFsBF6JggqJewDNutayGJqJgARyieYCidcAzbllLAQABJ6yGAMAA/LlgwAD9tsAAbMg1AAAAAQBbAReimIKilsAzbrWagByi6hyizCaiwwAcorSAorDAM25ZSwEAASeagADAAPy5XcAA/HQBW4CrAQFgwABs4AE0otADotCi6AAAAAEBAaLRAAAAgNRbAABgwABs4AFKotcBHKLXLsAATHQBAAEmouYBFKLmwDNw6gsAXcAA/KUCW1sAwABtMADAAPw9gK0AAAAAwAD8SMAAbMk1AAAAAQBbARei+4Ki+cAzbrWCkxyjAi7AAExtAQABHKMQgKMMwDNuWUsBAAEngpMAwAD8uQDAAG00wABszDUAAAABAFsBF6MigqMgwDNutbQFJqMiARyjNICjMMAzbllLAQABJ7QFAMAA/LlgwAD9tsAAbMo1AAAAAQBbARejTIKjSsAzbrW0ByajTAEco1+Ao1vAM25ZSwEAASe0BwDAAPy5YMAA+9DAAGzLNQAAAAEAWwEXo3iCo3bAM261oe0co44uwABMdQEAAR6jocAAwNsBAmDAAP22YMAA+goBJqO8ARyjvICjuMAzbllLAQABJ6HtAMAA/LldwAD8pQJbWwAAwABtMcAAbMQ1AAAAAQBbARej1IKj0sAzbrWz/RykNBykBSaj8QAco+SAo+DAM25ZSwEAASeXggDAAPy5XcAA/HQBW4CrAQFgwABs0gE0pBYDpBakJwAAAAEBAaQXAAAAgPVbAABgwABs0gFKpB0BJqQdARykHS7AAExsAQABFKQlwDNylBAAAMAAbTNgwABs0gDAAPw9gK0AAAAAwAD8SMAAbMWCAMAzbrUGwABtMIE3pEWkU6S4AADAAEx0AAAAAQOkYaS4AAAAAQEBpGYAAACCYF3AAPylAltbAABgwABs4AFKpHUBH6R5wABs5gMAAyakiwEcpIuApIfAM3MFSwEAASeAvQDAAPy5YMAA/bYmpJkBHKSZgKSVwDNzBUsBAAEngpAAwAD8uWDAAP22JqSnARykp4Cko8AzcwVLAQABJ6uCAMAA/LlgwAD9tgAGwABtMYE3pL2kz6XJAADAAEx1AAAAAQOk3aXJAAAAAQEBpPAAAACCYF3AAPylAmDAAP22YMAA+goAAGDAAGznAT4BSqT8AR+lB8AAbO4EAAAEhBkcpTscpTCApSzAM3OqSwEAASeEIwDAAPy5SAEAASkAwAD9KYQdHKVjHKVZgKVVwDNzqksBAAEnhCcAwAD8uUgBAAEpAMAA/SmEHhyljxylg4Clf8Azc6pLAQABJ4QoAMAA/LlIAQABKQDAAP0phB8cpb0cpbCApazAM3OqSwEAASeEKQDAAPy5SAEAASkAwAD9KQbAAG0ygTelzqXapvUAAMAATGQAAAABA6XmpvUAAAABAQGl6wAAAIJgXcAA/KUCW1sAAGDAAGzSAT4CTqYDpgoAAIF2YMAAbNIBJqYDARymDC7AAExsAQABHKYYgKYUwDN0kEsBAAEns1UAwAD8uQDAAG0zYMAAbNJKpiUBNaYsAAABAGDAAGzSAYGmLMAzdKo1AAAAAQBbARemO4KmOcAzdOyAvSamOwEcpkaApkLAM3SQSwEAASeAvQDAAPy5YMAA/bbAAGw6NQAAAAEAWwEXpleCplXAM3TshFIcpmAuwABMbAEAARymbICmaMAzdJBLAQABJ4RSAMAA/LkAwABtM8AAbDk1AAAAAQBbARemgIKmfsAzdOyzRSamgAEcpo0uwABMbAEAARymmYCmlcAzdJBLAQABJ7NFAMAA/LkAwABtM2DAAGx6wABsOzUAAAABAFsBF6axgqavwDN07JiAJqaxARymvICmuMAzdJBLAQABJ5iAAMAA/LlgwAD70MAAbDg1AAAAAQBbARemzYKmy8AzdOyCaiamzQEcptguwABMbAEAARym5ICm4MAzdJBLAQABJ4JqAMAA/LkAwABtM2DAAGy9wABs1IIAwDN07AbAAG0zgTem+qb/qtEAAMAATGwAAAABA6cGqtEAAAABAQGnBwAAALNVWwAAYMAAbCgBPgNOpxinJQAAwABMdmDAAP22ASanGAGApyfAM3ZhYMAA/bZJpy8cp0CBpzPAM3Z0SAEAASsAwAD9xT4BSqdRASs/SqdoARyneBanby63mMAAbSOZFQIAAoGnhMAzdnQ0p5IDp5KqzAAAAAAAAABgwABsNAE+AkmnnRynroGnocAzdnSB1gEAASfAAEx3AMAA/cg+AUqn0QEfp9zAAGzRAAAAAEmoAhyoE4GoBsAzdnSB1gEAASfAAEx4AMAA/cg+AUqoNQEfqEDAAGzZAAAAAEmoZRyodoGoacAzdnSB1gEAASfAAEx5AMAA/cg+AUqomAEfqKPAAGx5AAAAAEmoyByo2YGozMAzdnSB1gEAASfAAEx6AMAA/cg+AUqo+QEfqQTAAGyMAAAAAEmpJxypOIGpK8AzdnSB1gEAASfAAEx7AMAA/cg+AUqpWAEfqWPAAGyuAAAAAEmphhypl4GpisAzdnSB1gEAASfAAEx8AMAA/cg+AUqpugEfqcXAAGybAAAAAEmp6xyp/IGp78AzdnSB1gEAASfAAEx9AMAA/cg+AUqqHgEfqinAAGy2AAAAAEmqThyqX4GqUsAzdnSB1gEAASfAAEx+AMAA/cg+AUqqhAEfqo/AAGyCAAAAAD9AKqq/qsQAAMAA/MAGwABtNIE3qtaq5ay1AADAAExtAAAAAQOq7qy1AAAAAQEBqvcAAACCYFsAAF3AAPx0AWDAAGyNAT4DSaszJas8gKs3wDN4fmDAAP22PgFKq08BMatWYMAAbI0BH6tbwABskwMAAANqK4KMK4GwFKuCwDN4fgABYMAA/bY/SauVJauegKuZwDN4fl3AAPx0AVs+AUqrrwEcrJMcq7sUq7bAM3h+AAFdwAD8dAFbgKsBAWDAAGyNATSrvwOrv6yRAAAAAQEBq8gAAACAllsAAGDAAGyNAT4CTqvuq/cAAMAATH9dwAD8pQJgwAD9tlsBJqvuAYGr+cAzeSBdwAD8pQJgwAD9tltKrAgBH6wTwABskwMAAANqJqw4ARysOIKsMMAzeTNLAQABJ2oAwAD8uWDAAPvQgowmrFwBHKxcgqxUwDN5M0sBAAEngowAwAD8uWDAAPvQgbAmrH8BHKx/gqx3wDN5M0sBAAEngbAAwAD8uWDAAP22AMAA/D2ArQAAAADAAPxIP0qsqAExrK9gwABsjQAAADNPHgAzWY8AM1ubADNeeQAzYTEAM2TeADNmMQAzZ40AM2xQADNuNwAzcuMAM3OIADN0bgAzdj8AM3hcADN57gAAAA8CwABtN4E3rLqswMAATQIDwABMgAAAAV3AAMdOAmDAAGxGXcAA/KUCW1sAAV3AAG0BAV3AAPylAltbAwTAAG05gTetYK10CbQwAGDAAPoKAATAAG06gTetjK2pCcAATIEAXcAA/KUCYMAAbChgwABtWwEerZbAAMCPAAJgwABsKGDAAG1bAAAEwABtO4E3rbyt1AnAAEyCAF3AAP1nAWDAAPvQAR6tysAAwOIAAWDAAPvQAAABBcAAbVSBN63ZrdmuEwAAAAOt764TAAAAAQAAAa32AAAEtDBgwAD6CgFqrgxgwAD6CgBgwABtNwE/AggBwABtOYAAwDN7BAkBrdnAAMdXAAAAABUGwABtPYE3rhiuG7EyAADAAEyDAAAAAQOuILEyAAAAAQEBriYAAACBVGDAAGwoAABgwABtWwE+CE6uNq5DAADAAEx2YMAAbVsBHK5IFq5FLsAATIHAAG06SwEAAYCuScAze10AwAD8uUmuVCEcrmWBrljAM3t0SAEAASsAwAD9KUqubgGBrnXAM3t0P0AiIiIlrp2ArpjAM3tdYMAAbGwBJa7AgK67wDN7XWDAAGyUASWu5ICu38Aze11gwABsegEhHK8RFq8KgK8FwDN7XYRSwABsLUgBAAErAMAA/SmumK8YASSvKQGAryTAM3tdTq81AAAAs1VgwAD70ABJrz0lr0aAr0HAM3tdYMAAbJQ+BEAcr6wWr6cUr6LAM3tdAAFgwABslIC9wABsOkgBAAErAMAA/cWvoq+zAEAcr88Wr8gUr8PAM3tdAAFgwABslIRSwABsOUgBAAErAMAA/Smvw6/WAEAhHK/wFq/rFK/mwDN7XQABYMAAbJSCk8AAbJZIAQABKwDAAP0pr+av9wA9irAvwDN8KhawSRawRBawPhawORSwNMAze10AAWDAAGyUgpPAAGyWgxnAAPxYgbDAAGyRg8HAAP27PgE9irBmwDN8KhawnB6wa8AAmqgDAAGAsHTAM3tdAsAATIQpwABMhSmDwcAA/btDsLEhHLDBFrC5LsAATILAAG07VgEAAYKwxcAzfCoAwAD9dD4BPYqw0sAzfCocsNSCsNLAM3wqZAEAAZQAwAD89T2JsOLAM3t0H7D1wABtYgIAAhaw/YCw+MAze12CZ8AAbC8ksQgBgrEFwDN8KgBKsQ8BNQAAAAEAXcAA/KUCYMAAbChgwABtWwEWsRYuwABMgcAAbTo1AAAAAQBgwABsKAGAsRrAM3tdNQAAAAEAYMAAbVsBgbEiwDN7dDUAAAABAFwBHLEZg7EZwDN9p4C/AgAChLEZwDN9yoUAwDN93QDAAPy6hQDAM33dBsAAbT6BN7E3sTuxZQAAiLgAAAABA7FCsWUAAAABAQGxSwAAIIFUYMAAbEYAAF3AAPylAltbAUqxVAEcsVmAsVTAM34+hE0BAV3AAPylAltbAS4AwABsVgbAAG1AgTexarFusnIAAMAATIbAAG0dAAAAAQOxeLJyAAAAAQEBsYQAAACWo13AAPx0AWDAAGwoAABdwAD8pQJbWwE+A06x07HXAACAq13AAMPlAmDAAP22XcAA/KUCW1sBH7HdwADECAECYMAA/bZdwAD8pQJbWwFqsfdhAmDAAP22YMAA/bZgwAD70MABNJQARrIMsiSyFQAAAIFUYMAAbCgAgLIdwDN+nD4BPRyyL4GyLMAzfryAvwIAAiSyQwEWsj8csjMuwABMgwEAAYKyOcAzfw0AwABtPbNVwABtXhyyTIKyR8Azfw2ETQEBXcAA/KUCW1sBLgDAAGwxAMAAw/ZKsmQBgbJrwDN+vAbAAG1BgTeyd7J7tOwAAMAATIfAAG0dAAAAAQOykLTsAAAAAQEBspkAAACBVGDAAGxGAABdwAD8pQJbWwE+CE6yqbK3AADAAEyIXcAA/KUCW1sBHLK5LsAATIbAAG0dAQABFrLJgLLEwDN/qobTwABsSQDAAG1ATrLdsukAAMAATIldwAD8pQJbWwEcsusuwABMhsAAbR0BAAEWsvuAsvbAM3+qhIHAAGxMAMAAbUBOsw2zGwAAwABMil3AAPylAltbARyzHS7AAEyGwABtHQEAARazLYCzKMAzf6qz+8AAbEoAwABtQE6zQbNOAADAAEyLXcAA/KUCW1sBHLNQLsAATIbAAG0dAQABFrNggLNbwDN/qoSAwABsSwDAAG1ATrNzs34AAMAATIxdwAD8pQJbWwEcs4AuwABMhsAAbR0BAAEWs5CAs4vAM3+qhIPAAGxNAMAAbUBOs6GzrwAAwABMjV3AAPylAltbARyzsS7AAEyGwABtHQEAARazwYCzvMAzf6qZLMAAbE4AwABtQE6z1bPiAADAAEyOXcAA/KUCW1sBHLPkLsAATIbAAG0dAQABFrP0gLPvwDN/qrP9wABsTwDAAG1ASrQDATK0CltbByeEQ4G0HcAzf8QnmdWCtDvAM3/8J4Jqg7RawDOANCeGe4S0esAzgGwnhI6FtJfAM4CkJ4X/hrS1wDOA3Ce0Coe01cAzgRQGwABtQoE3tPG09bViAADAAEyPwABtHQAAAAEDtQm1YgAAAAEBAbUZAAAAgVRgwABs2gAAXcAA/KUCW1sBSrUoATK1KFtbAiezVRa1Qhy1Ly7AAEyDAQABFrU6gLU1wDOBwYJFwABs3ADAAG09wABMdsAAbWAnq8UWtV2AtVjAM4HBq8XAAGzdBsAAbUOBN7VntWu3HgAAwABMkMAAbR0AAAABA7V/tx4AAAABAQG1iAAAALQqYMAAbEYAAF3AAPylAltbAT4FTrWbtZ8AAICrXcAAw+UCYMAA/bZdwAD8dAFbAR+1pcAAxAgBAmDAAP22XcAA/HQBWwFqtcBhAmDAAP22YMAA/bZgwAD70MABNJQAT7XVtdoAAAGVVmEBYMAAbEFcAAO14La+AAAAAQEBteoAAACBVGDAAGxBAABcAT4CSbX4FrYGFrYBg7X8wDOCy62YwABsQ4FVwAD8Vkq2DwA/PRy2IIG2HcAzgmOAvwIAAha2LRy2IS7AAEyDAQABg7YnwDOCywDAAG09wABMdsAAbWA1tncAAAEAXcAA/HQBXcAA/KUCW1sBHLZ3HLZSFrZCg7Y9wDOCy62YwABsQ4CrAQFdwAD8pQJbWwEWtlYuwABMj8AAbR3AAG1CAMAA/D2ArQAAAADAAPxINQAAAAEAWwEcto6EtozAM4MxgK4BAAE0tpMDtpO2twAAAAICAraUAAAAgdVdwAD8pQJbWwC2lwAAAIJKXcAA/KUCW1sAAGDAAPvQAUq2nQEmtp0BHLalHLaehbadwDODrUsBAAEns1UAwAD8uYJLAQABHLawhravwDODvUsBAAEns1UAwAD8uQAAYMAA+9AAwAD8h4QAwDODMQDAAMP2PRy21xa2zYC2xcAzgkmz+8AAbEqD+AEAAYK238AzgrAAwAD8Qj0ctvsWtvSAtuzAM4JJhIPAAGxNg/gBAAGCtwPAM4KwAMAA/EJKtxABgbcXwDOCYwbAAG1EgTe3I7cnuBsAAMAATJHAAG0dAAAAAQO3QLgbAAAAAQEBt0kAAAC0KmDAAGxGAABdwAD8pQJbWwE+A063XLdgAACAq13AAMPlAmDAAP22XcAA/HQBWwEft2bAAMQIAQJgwAD9tl3AAPx0AVsBareBYQJgwAD9tmDAAP22YMAA+9DAATSUAD0ct6sWt56At5bAM4SigM/AAGxSg/gBAAE0t7MDt7O4BgAAAAICAre0AAAAg/lgwABsKAC3twAAAIDyXcAA/HQBYMAAbCgAAGDAAPzZAT4BPRy3xYG3wsAzhLyAvwIAAha3zxy3xi7AAEyDAQABgrfMwDOFLQDAAG09wABMdsAAbWAet9/AAG0gAgACg7f2wDOFOha3+S7AAEyDwABtPQAAwADD9gDAAPzESrgNAYG4FMAzhLwGwABtSYE3uCC4JLp9AADAAExBAAAAAQO4LLp9AAAAAQEBuDUAAACBVGDAAGxGAABdwAD8pQJbWwE+BE64RbhOAACIP13AAPylAltbARy4UC7AAEyHwABtHQEAAYC4ZsAzhd0AwABtQU64dbiBAADAAEySXcAA/KUCW1sBHLiDLsAATJDAAG0dAQABgLiYwDOF3QDAAG1DTrinuLgAAMAATJNdwAD8pQJbWwEcuLouwABMkcAAbR0BAAGAuNTAM4XdAMAAbURKuN8BMrjmW1sIJ4g/gbj6wDOF9yfAAExngrkVwDOGJCeAz4O5OMAzhlMnsHwcuYscuXAWuWSAuV/AM4XdsHzAAGxQgKsBAV3AAPylAltbATS5dAO5dLmJAAAAAQEBuXUAAAC7LmDAAGx6AABdwAD8pQJbWwFKuXsBHLl9hLl7wDOG34RNAQFdwAD8pQJbWwEuAMAAbH8AwAD8PYCtAAAAAMAA/EgnwABMlCMWuasutDDAAG05NwUWucuAucbAM4XdgePAAGxTAWDAAPvQJ7Q/FrnwgLnrwDOF3bQ/wABsUSfAAEyVIxa6Gy60MMAAbTmUFro7gLo2wDOF3cAATEDAAGxUAWDAAPvQJ6/qHLpnFrpfgLpawDOF3a/qwABsSIRNAQFdwAD8pQJbWwEuAMAAbGkGwABtSoE3uoK6hr1QAACwbwAAAAEDupK9UAAAAAEBAbqfAAAAgVRgwABsWQAAXcAA/KUCW1sBPgFKuqsBMrqyW1sNJ7RAFrrfHLrILsAATIMBAAEWutOAus7AM4fTtEDAAGxbAMAAbT3AAEx2wABtYCeYgBa7AIC6+8Azh9OYgMAAbFwntEEWuyOAux7AM4fTtEHAAGxdJ7RCJLtpARa7VoC7UcAzh9O0QsAAbF4ntEMWu6EWu42Au4jAM4fTtEPAAGxfnxLAAPrOJ7REFrvdFrvOgLvJwDOH07REwABsYJ8SwAD6zie0RRa8HRa8DIC8B8Azh9O0RcAAbGGfEsAA+s4ntEYWvE+AvErAM4fTtEbAAGxiJ7RIFryEgLx/wDOH07RIwABsYye0SRa8tIC8r8Azh9O0ScAAbGQntEoWvOaAvOHAM4fTtErAAGxlJ7RLFr0XgL0SwDOH07RLwABsZie0TBa9PYC9OMAzh9O0TMAAbGcGwABtRYE3vVW9Wb+WAADAAEyWwABtHQAAAAEDvWi/lgAAAAEBAb1zAAAAgVRgwABsNAAAXcAA/KUCW1sBPgVOvYO9hwAAn+JdwAD8pQJgwAD9tmDAAP0cATK9iWDAAP22YMAA/RwEJ7NVFr2jHL2XLsAATIMBAAGAvZ3AM4lNAMAAbT3AAEx2wABtYCeCZx69v8AAbCYBAAEWvdGAvczAM4lNgmfAAGw2ACeAvRa964C95sAziU2AvcAAbDonmIAWvgSAvf/AM4lNmIDAAGw4Sb6MIRy+oBa+lYC+kMAziU2zRcAAbDtIAQABKwDAAP0pPgE9HL60gb6xwDOJZ4C/AgACJ7NFFr7cHL7FLsAATIMBAAEWvtCAvsvAM4lNs0XAAGw7AMAAbT3AAEx2wABtYADAAPy6P0m+9CEcvwgWvv2AvvjAM4lNs/fAAGw3SAEAASsAwAD9xT0cvxSBvxHAM4lngL8CAAIns/cWvyqAvyXAM4lNs/fAAGw3AMAA/Lo/Sb86IRy/Sha/Q4C/PsAziU2EUsAAbDlIAQABKwDAAP0pPRy/VoG/U8AziWeAvwIAAieEUha/dhy/Yy7AAEyDAQABFr9ugL9pwDOJTYRSwABsOQDAAG09wABMdsAAbWAAwAD8uj9Kv4gBgb+PwDOJZwbAAG1LgTe/m7+fwABBJwAAhJoAAAABA7+rwABBJwAAAAEBAb+4AAAAgVRgwABsbAAAXcAA/KUCW1sBPgFKv8QBNb/LAAABAF3AAPylAltbARy/yy7AAEyWwABtHQEAAYC/28AzizwAwABtRTUAAAABAFsBHL/pgb/nwDOLWoClAQABMsAAQABgwAD9tmDAAP0cAieXgh7AAEAWwABtIAIAAhzAAEDOMcAAQDpdwAD8dAFgwABsKAQWwABAT4DAAEBKwDOLPLPowABsbxbAAEB1gMAAQHDAM4s8s+rAAGxwFsAAQJuAwABAlsAzizyEgcAAbHEWwABAt4DAAECywDOLPISAwABscoSJAQFgwABsKAE0wABA1QPAAEDVwABA3QAAAAEBAcAAQNYAAABiXcAA/HQBYMAAbCgAAF3AAPx0AWDAAGwoAUrAAEDcAYLAAEDcwDOMPgDAAPxAFsAAQOwuwABMg8AAbT0AJ6UYJMAAQRkBFsAAQRSAwABBD8AzizyArMAAbG4AwAD8wYEAwDOLWgbAAG1MgTfAAEEswABBMMAAQosAAITuAAAAAQPAAEE6wABCiwAAAAEBAcAAQUUAAACBVGDAAGyDAABdwAD8pQJbWwE+AUrAAEFRATXAAEFYAAABAF3AAPylAltbARzAAEFYLsAATJbAAG0dAQABgMAAQWjAM4zUAMAAbUU1AAAAAQBbARzAAEF2gcAAQXTAM4z2gKUBAAEywABBjWDAAP22YMAA/RwCJ6HtMsAAQfFgwAD9tmDAAPoKASeEJBbAAEIDgMAAQf7AM4zUhBrAAGyFJ5eCHsAAQiTAAG0gAgACHMAAQmYxwABCSF3AAPx0AWDAAGwoAhbAAEJOgMAAQknAM4zUhIPAAGyHFsAAQluAwABCVsAzjNSz+8AAbIaEiQEBYMAAbCgBNMAAQm0DwABCbcAAQnUAAAABAQHAAEJuAAAAYl3AAPx0AWDAAGwoAABdwAD8dAFgwABsKAFKwABCdAGCwABCdMAzjeYAwAD8QBbAAEJ4LsAATIPAAG09AADAAPzBgQDAM4z2BsAAbU2BN8AAQpDAAEKUwABEewAAhQ4AAAABA8AAQp7AAER7AAAAAQEBwABCqQAAAIFUYMAAbKIAAF3AAPylAltbAT4DTsAAQrnAAELAAACBdl3AAPylAltbATXAAELCAAABAF3AAPylAltbARzAAELCLsAATJbAAG0dAQABgMAAQtLAM45fAMAAbUU1AAAAAQBbARzAAELggcAAQt7AM46RgKUBAAEywABC92DAAP22YMAA/RwEJ5eCHsAAQw3AAG0gAgACFsAAQymAwABDJMAzjl+z/cAAbKYWwABDMy7AAEyDwABtPQAnoS8WwABDWIDAAENTwDOOX6EvwABspSeCkxzAAEN2LsAATJfAAG0dAQABFsAAQ4qAwABDhcAzjl+Ck8AAbKcAwABtSCeCkBbAAEOmgMAAQ6HAM45fgpDAAGykAMAA/MGBAMAzjpFJwABDuhbAAEPDgMAAQ77AM45fhB3AAGyoPgI9HMAAQ9qBwABD1MAzjnuAvwIAAieEJykAwAD8uknAAEPyIRzAAEQHFsAAQ/uAwABD9sAzjl+FAcAAbKlIAQABKwDAAP0pPgE9HMAARCCBwABEGsAzjnuAvwIAAieFARbAAERKHMAARDIuwABMgwEAARbAAEQ9gMAARDjAM45fhQHAAGypAMAAbT3AAEx2wABtYADAAPy6Pz9KwABEagGBwABEccAzjnsGwABtToE3wABEgMAARITAAET/AACGAQAAAAEDwABEkcAARP8AAAABAQHAAESfAAAAgVRgwABslAAAXcAA/KUCW1sBSsAARKgBNcAARKgAAAEAXcAA/KUCW1sBHMAARKguwABMlsAAbR0BAAGAwABEuMAzkHEAwABtRTUAAAABAFsBHMAARMSBwABEwsAzkJGApQEAATLAAETbYMAA/bZgwAD9HAEngpMcwABE5C7AAEyXwABtHQEAARbAAET4gMAARPPAM5BxgpPAAGyWAMAAbUgAwAD8wYEAwDOQkQbAAG1GgTfAAEZGwABGSsAARw4AAMAATJjAAG0dAAAAAQPAAEZhwABHDgAAAAEBAcAARnQAAADAAEyZYMAAbOcAAF3AAPylAltbAUrAAEZ9ATLAAEZ9W1sEJ4QjFsAARpaAwABGkcAzkVSEGcAAbOknhCcWwABGtoDAAEaxwDORVIQdwABs6ieEKBbAAEbXgMAARtLAM5FUhB7AAGzrJ4QpFsAARvuAwABG9sAzkVSEH8AAbOwGwABtR4E3wABHE8AARxfAAEeRAADAAEyawABtHQAAAAEDwABHKsAAR5EAAAABAQHAAEc5AAAAgVRgwABs4AAAXcAA/KUCW1sBSsAAR0gBMsAAR0hbWwMngL0WwABHVoDAAEdRwDOSCYC9wABs4ieCkBbAAEdpgMAAR2TAM5IJgpDAAGzjJ6uCFsAAR4SAwABHf8AzkgmrgsAAbOQGwABtT4E3wABHlsAAR5rAAEpZAACz5wAAAAEDwABHp8AASlkAAAABAQHAAEe1AAAAgVRgwABsvQAAXcAA/KUCW1sBPgFKwABHwQE1wABHyAAAAQBdwAD8pQJbWwEcwABHyC7AAEyWwABtHQEAAYDAAEfYwDOSnwDAAG1FNQAAAAEAWwEcwABH5oHAAEfkwDOSwYClAQABMsAAR/1gwAD9tmDAAP0cCSeXgh7AAEgTwABtIAIAAhbAAEgvgMAASCrAM5Kfs/3AAGzFFsAASDkuwABMg8AAbT0AJ6HtHMAASFYuwABMmMAAbR0BAAEWwABIc4DAAEhuwDOSn6HtwABsxADAAG1GJ4U0FsAASJqAwABIlcAzkp+FNMAAbMcnrIYWwABIyYDAAEjEwDOSn6yGwABsyCeagBzAAEkyHMAASQ8WwABJBIDAAEj/wDOSn5qAwABsyYCrAQFdwAD8pQJbWwE0wABJEwPAAEkTwABJMAAAAAEBAcAASRQAAACA1GDAAGzgAABdwAD8pQJbWwFKwABJGgEcwABJGi7AAEyawABtHQEAAYLAAEkuwDOT6wDAAG1HAMAA/D2ArQAAAADAAPxIJ7QFFsAASViAwABJU8Azkp+0BcAAbMontAcWwABJgoDAAEl9wDOSn7QHwABsyyeCkxzAAEmgLsAATJfAAG0dAQABFsAASbSAwABJr8Azkp+Ck8AAbMwAwABtSCeCkBbAAEnQgMAAScvAM5KfgpDAAGzGAMAA/MGBAMAzksEGwABtUIE3wABKXsAASmLAAEr3AADAAExZAAAAAQPAAEpuwABK9wAAAAEBAcAASnsAAACBVGDAAGzSAABdwAD8pQJbWwE+AUrAAEqHATXAAEqOAAABAF3AAPylAltbARzAAEqOLsAATJbAAG0dAQABgMAASp7AM5ThAMAAbUU1AAAAAQBbARzAAEqsgcAASqrAM5UDgKUBAAEywABKw2DAAP22YMAA/RwBJ4JqFsAASuUcwABK0C7AAEyDAQABFsAAStuAwABK1sAzlOGCasAAbNQAwABtPcAATHbAAG1gAMAA/MGBAMAzlQMGwABtUYE3wABK/MAASvzAAEtJAACEvQAAAAEDwABLCMAAS0kAAAABAQHAAEsVAAAAgVRgwABsrwAAXcAA/KUCW1sBSsAASx4BNcAASx4AAAEAXcAA/KUCW1sBHMAASx4uwABMlsAAbR0BAAGAwABLLsAzlckAwABtRTUAAAABAFsBHMAASzWBwABLM8AzlemAvwIAAieCkBbAAEtFgMAAS0DAM5XJgpDAAGyxAMAA/LqBAMAzlekGwABtUoE3wABLTsAAS07AAEvLAADAAExGAAAAAQPAAEtZwABLywAAAAEBAcAAS2kAAACBVGDAAGx6AABdwAD8pQJbWwFKwABLcgE1wABLcgAAAQBdwAD8pQJbWwEcwABLci7AAEyWwABtHQEAAYDAAEuCwDOWggDAAG1FNQAAAAEAWwEcwABLjoHAAEuMwDOWooC/AgACJ4LjFsAAS6KAwABLncAzloKC48AAbHwAwAD8ujUAAAABAFsBHMAAS7GBwABLr8AzlqKAvwIAAieZbxbAAEvEgMAAS7/AM5aCmW/AAGx9AMAA/LqBAMAzlqIGwABtSIE3wABL0MAAS9fAAE0AAADAAEyXwABtHQAAAAEDwABL5cAATQAAAAABAQHAAEv1AAAAgpNdwAD8dAFgwABsjQAAYMAA/RwBPgJJwABMARbAAEwFLrQwwABtOT4BSsAATCMBHMAATEIcwABML4DAAEwqwDOXdoCrAQFgwAD9tgE0wABMMwPAAEwzwABMQAAAAAEBAcAATDQAAACA9WDAAGyNAABgwAD9tgFKwABMOgEWwABMPIHAAEw6wDOX3oGwwABskQDAAPw9WAEAASeArwDAAPxGP0rAAExYARzAAEz0HMAATG2AwABMX8Azl3aAqwEBYMAA/RwBNMAATHkDwABMecAATOkAAAABAQHAAEx6AAAAgPVgwABsjQAAXcAA/KUCYMAA/bZgwAD9HAFKwABMgAEywABMgGDAAP22YMAA/RwDJ2oWwABMm4HAAEyZwDOYV2rAAGyPJ4KMFsAATLmBwABMt8AzmFeCjMAAbJAngbAWwABM1oHAAEzUwDOYV4GwwABskQDAAPw9gK0AAAAAwAD8SAAAM3s7ADN+HgAzfnYAM3+EADOBmwAzgiMAM4R8ADOFuwAzh7MAM4knADOLGAAzjKoAM441ADOQRwAzkSQAM5HZADOSdQAzlLUAM5WfADOWVgAzl0YAM5jgAAAAFQLAAG1VgTfAAE0FwABNC8AATkoDwABMmwAAAV3AAMcvAmDAAGxGXcAA/KUCW1sAAAIEwABtV4E3wABNWsAATWEJiLcAXcAAx04CYMAAbEZdwAD8pQJbWwAEwABtWIE3wABNg8AATakJgfcAXcAAx04CXcAA/KUCW1tgwABsRgEfwABNkcAAbTYAAAAAAQXAAG1agTfAAE2uwABNrsAATkgAAAADwABNvsAATkgAAAABAAABwABNxQAAALQwYMAA+goBasAATdtgwAD6CgBgwABtVQE/AggAwABtVx/AAE35wABtVAEAAAG0MIDAAE4zwDOZ8AkBwABNrsAAxzkAAAAAAAAAM5o/AAAAAALAAG1bgTfAAE5NwABOU8AATtgDwABMnAAAAWDAAP0cAAACBMAAbV2BN8AATmnAAE5tCYJnAGDAAGzvAATAAG1egTfAAE5+wABOgAmzVQBgwAD9tgABBcAAbWKBN8AAToXAAE6FwABOmwAAAAPAAE6HwABOmwAAAAICAsAATo0AAASCZ2DAAGzvAMAATpgAAASzVWDAAP22AABgwABtWwE/AwgBwABtXYAAwDOawwgBwABtXoEAwDOa0gkBwABOhcAA/TIAAAAAAQbAAG1ggTfAAE6gwABOq8AATtYBAMAATHYAAAABA8AATrjAAE7WAAAAAAAAAGDAAP22AUrAAE67ASTAAE7WAx7AAE6+wABsJgEAARbAAE7LLoJnwABtXQAnUBbAAE7TLrNVwABtXgAAM5sRADObdwAAAAEAAQbAAG0ggTeBsYG+gloAAcAATJ3AAG0dAAAAAQOB1IJaAAAAAgICge0AAACWo13AAPwyAWDAAGwoAIIGAAAAwABMnmEBYMAAbChgwABtWwAAXcAA/HQBYMAA/bYBSoIUATWCPAAAAQBdwAD8dAFgwAD9tgEcgjwcghqAghTAM5usgKsBAWDAAP22ATSCHgOCHoI6AAAAAQEBgh8AAABiYMAAbCgAAGDAAP22AUqCJQEWgi4cgiqBgiXAM5u/IAEAAYKCK8AznB4AAMAATHbAAG1gAMAA/D2ArQAAAADAAPxINQAAAAEAWwEcgkaCgkTAM5vngK4BAAFqgkthAmDAAP22YMAA/bZgwAD70MABNJQAwAD8h4IAwDOb5wGBNwAznKAAM06PADN6MwAzmT0AM5pIADObhAAAAAQAM5uGADOcoAAAAAEAAADAAG1jAIE4AAAEgVIAAMAAxMMAAIFqAADAAJqqAACBiQAAwACbEAAAgaoAAMAAbCQAAAAAAAICwABtbYE4go+ClZk8A5clAAABYMAA/RwAAV3AAG0BAVwBBMAAbW+BOILVgtkJhDsAYMAAmucAAQXAAG2HgTiC3oLegvYAAAADguuC9gAAAAEBAYLxAAAEhDtgwACa5wAAYMAAbW0BPwIIAcAAbW+AAMAznVcJAYLewAD9MgAAAAAUBsAAbXGBOIL7gwCDSwAAwABMnwAAAAEDgwmDSwAAAAEBAYMTAAAAwABMoGDAAPocAABcAT4BPRyDJBaDHy6EO8AAbW+BuQEAARyDNYCDMMAznajAAEyhAAAAAMAA+mIAwACa3AbAAG1ygTiDUINVg6YAAMAATKIAAAABA4Nig6YAAAABAQGDbAAAAIGzYMAA+qYAAFwBPgE9HIOBFoN8LoQ7wABtb7CDAQABFoOTgIOKwDOeDJ8SwAD6zgDAAJrdBsAAbXOBOIOrg7CEBwAAwABMowAAAAEDg8GEBwAAAAEBAYPHAAAAgVRgwABsKAAAXAE+Aj0cg9gWg9MuhDvAAG1vr3YBAAEWg+eAg+LAM55ogmfAAGwvAMAAmtk9HIP3gIPywDOeaIRNAQFcAS4AwABsMQbAAG10gTiEDIQRiFEAAMAATEEAAAABA4QZiFEAAAABAQGEIgAAAIFUYMAAbEYAAFwBPhI9HIQzFoQuLoQ7wABtb7CDAQABFoRBgIQ8wDOe24HjwABsUwDAAJrdPRyEVBaETy6EO8AAbW+wgwEAARaEYoCEXcAzntvAAExAwABsVADAAJrdPRyEehaEdS6EO8AAbW+IPgIBYMAAbGwCFoSJgISEwDOe24bTwABsSRaElC6EmsAAbX4AwACaxD0chREWhQwuhDvAAG1viD4CAWDAAGyDAhaFIICFG8AzntuEgcAAbEwWhSkuhO7AAG1/AMAAmsQ9HIU/FoU6LoQ7wABtb4g+AgFgwABsvQIWhU6AhUnAM57bs/vAAGxKFoVZLrPnwABtggDAAJrEPRyFchaFbS6EO8AAbW+IPgIBYMAAbK8CFoWBgIV8wDOe24SAwABsSxaFiy6EvcAAbYQAwACaxD0chaMWhZ4uhDvAAG1viD4CAWDAAGyiAhaFsoCFrcAzntuEg8AAbE0WhbouhQ7AAG2AAMAAmsQ9HIXQFoXLLoQ7wABtb4g+AgFgwABslAIWhd+AhdrAM57bmSzAAGxOFoXqLoYBwABtgQDAAJrEPRyGAxaF/i6EO8AAbW+IPgIBYMAAbNICFoYSgIYNwDOe27P9wABsTxaGHC7AAExZwABtgwDAAJrET4YwhjUAAAHAAEykYQFgwABsQVwAA4ZGhpMAAAABAQGGUAAAAIFUYMAAbEEAAFwBPgE9HIZjFoZeLoQ7wABtb4g+AgFgwABs2gIWhnKChm3AM6DirZjAAGxDFoZ4LsAATKXAAG1jwABtfADAAJrEPRyGphaGn4CGmsAzntuEg8AAbE2D+AEAAYGGrsAzoMUAwAD8Qj0chtUWhsuAhsbAM57bs/vAAGxKg/gBAAGBht3AM6DFAMAA/EI9HIb7Fob2LoQ7wABtb7CDAQABFocWFocJgIcEwDOe24DPwABsUmHAAPzJAMAAmt09HIc1FocogIcjwDOe24DPwABsUoP4AQABNIc9A4c9h7EAAAACAgKHQwAAAIPRYMAAbCgAh1MAAAApXcAA/HQBYMAAbCgAAGDAAPzZAT4CPRyHYy7AAEyjAQABgod1wDOh0gDAAG1zPRyHhhaHgS6EO8AAbW+IPgIBYMAAbCgCg4eQwDOh3xaHmC7AAEyjwABtcwDAAJrEAMAA/MQ9HIe9Foe4LoQ7wABtb4g+AgFgwABsegIWh8yAh8fAM57bsHzAAGxQFofZLsAATEbAAG2FAMAAmsQ9HIfwFofrLoQ7wABtb4G5AQABHof8wADE6AEAARaIDICIB8Azntu0P8AAbFEAAMAAmtw9HIghLrBvAQABFogzgIguwDOe26/qwABsSADAAG11PRyIRhaIQS6EO8AAbW+CiAAAAADAAJrzBsAAbXWBOIhWiFuKugAAsG8AAAABA4hniroAAAABAQGIdAAAAIFUYMAAbFkAAFwBPgw9HIiALrPnAQABFoiTgIiOwDOjCrRAwABsWwDAAG2CPRyIqRaIpC6EO8AAbW+wgwEAARaIt4CIssAzowqYgMAAbFwAwACa3T0ciMcWiMIuhDvAAG1vsFkBAAEWiN6AiNnAM6MKtEHAAGxdAMAAmsE9HIjzLsAATJ8BAAEWiQKAiP3AM6MKtELAAGxeAMAAbXE9HIkaLsAATKIBAAEWiS2AiSjAM6MKtEPAAGxfAMAAbXI9HImWLsAATKIBAAEWiamAiaTAM6MKtEXAAGxhAMAAbXI9HInFFonALoQ7wABtb67zAQABFonUgInPwDOjCrRGwABsYgDAAJraPRyJ8xaJ7i6EO8AAbW+u8wEAARaKAoCJ/cAzowq0SMAAbGMAwACa2j0cih8WihouhDvAAG1vrvMBAAEWii6AiinAM6MKtEnAAGxkAMAAmto9HIpIFopDLoQ7wABtb67zAQABFopXgIpSwDOjCrRKwABsZQDAAJraPRyKdhaKcS6EO8AAbW+u8wEAARaKhYCKgMAzowq0S8AAbGYAwACa2j0cip4WipkuhDvAAG1vrvMBAAEWiq2AiqjAM6MKtEzAAGxnAMAAmtoGwABtd4E4ir+KxIvdAADAAEyWwABtYwAAAAEDitOL3QAAAAEBAYreAAAAgVRgwABsNAAAXAE+BD0ciu8WiuouhDvAAG1vsFkBAAEWiwaAiwHAM6UEgL3AAGw6AMAAmsE9HIsWFosRLoQ7wABtb7CDAQABFoskgIsfwDOlBJiAwABsOADAAJrdPRyLNBaLLy6EO8AAbW+wWQEAARaLS4CLRsAzpQSz98AAbDcAwACawT0ci1wuwABMpsAAbWMBAAEWi3SAi2/AM6UEs0XAAGw7AMAAbX0GwABtfoE4i+KL541eAACEmgAAAAEDi/ONXgAAAAEBAYwAAAAAhENgwABsbAAAXAE+AT0cjBQWjA8uhDvAAG1vsCkCAWDAAGxsAoCMIMAzpdM0jCkDjCmNWQAAAAEBAYw2AAAAgVRgwABsbAAAYMAA/NkBPgY9HIxJFoxELoQ7wABtb7biAQABFoxXgYxSwDOmEoCswABsbgDAAJrbPRyMYy7AAEyWwABtYwEAAYGMc8AzphIAwABtdz0cjIUWjIAuhDvAAG1viD4CAWDAAGy9AhaMlIGMj8AzphKz6MAAbG8WjKcus+fAAG2CAMAAmsQ9HIzCFoy9LoQ7wABtb4g+AgFgwABsogIWjNGBjMzAM6YSs+rAAGxwFozkLoUOwABtgADAAJrEPRyM/BaM9y6EO8AAbW+IPgIBYMAAbIMCFo0LgY0GwDOmEoSBwABscRaNFC6E7sAAbX8AwACaxD0cjSwWjScuhDvAAG1viD4CAWDAAGyvAhaNO4GNNsAzphKEgMAAbHIWjUUuhL3AAG2EAMAAmsQAwACa2AbAAG1/gTiNY41ojmMAAITuAAAAAQONco5jAAAAAQEBjX0AAACZwmDAAGyDAABcAT4BPRyNjRaNiC6EO8AAbW+wKQIBYMAAbIMCgI2ZwDOnbTSNngONno5eAAAAAQEBjakAAACBVGDAAGyDAABgwAD82QE+BD0cjbcuwABMlsAAbWMBAAGBjcfAM6esAMAAbXc9HI3ZFo3ULoQ7wABtb67zAQABFo3ogY3jwDOnrIQawABshQDAAJraPRyOABaN+y6EO8AAbW+IPgIBYMAAbKICFo4PgY4KwDOnrISDwABshxaOFy6FDsAAbYAAwACaxD0cji8WjiouhDvAAG1viD4CAWDAAGy9AhaOPoGOOcAzp6yz+8AAbIYWjkkus+fAAG2CAMAAmsQAwACa2AbAAG2AgTiOaI5tkAkAAIUOAAAAAQOOd5AJAAAAAQEBjoIAAACEjmDAAGyiAABcAT4BPRyOlBaOjy6EO8AAbW+wKQIBYMAAbKICgI6gwDOomTSOpwOOp5AEAAAAAQEBjrIAAACBVGDAAGyiAABgwAD82QE+Bz0cjsAuwABMlsAAbWMBAAGBjtDAM6jYAMAAbXc9HI7iFo7dLoQ7wABtb4g+AgFgwABs0gIWjvGBjuzAM6jYs/3AAGymFo77LsAATFnAAG2DAMAAmsQ9HI8VFo8QLoQ7wABtb4G5AQABFo8mgY8hwDOo2KEvwABspQDAAJrcPRyPQBaPOy6EO8AAbW+IPgIBYMAAbI0CFo9PgY9KwDOo2IKTwABspxaPVS7AAEynwABtY8AAbXgAwACaxD0cj3EWj2wuhDvAAG1vgbkBAAEWj4KBj33AM6jYgpDAAGykAMAAmtw9HI+UFo+PLoQ7wABtb67zAQABFo+jgY+ewDOo2IQdwABsqADAAJraSY+zFo+8gY+3wDOo2IQdwABsqD4BPRyPzy7AAEyowABtYwEAARaP6YGP5MAzqNiFAcAAbKkAwABteT8AwACa2AbAAG14gTiQDpAOkJ8AAMAATKfAAG1jAAAAAQOQHJCfAAAAAQEBkCYAAACCk2DAAGyNAABbAT4DPRyQNxaQMi6EO8AAbW+u9AEAARaQS4CQRsAzql5qwABsjwDAAJrAPRyQXBaQVy6EO8AAbW+u9AEAARaQcICQa8Azql6CjMAAbJAAwACawD0ckH8WkHouhDvAAG1vsFkBAAEWkJaAkJHAM6pegbDAAGyRAMAAmsEGwABteYE4kKSQqZEwAADAAEyowABtYwAAAAEDkL2RMAAAAAEBAZDLAAAAgVRgwABslAAAXAE+Aj0ckNwWkNcuhDvAAG1vrvMBAAEhHJDrgJDmwDOrDUgBAAErAMAA/SkAwACa2kmQ+SEckQKAkP3AM6sNSAEAASsAwAD9KT4BPRyREy6GAQEAAYCRIcAzqw0AwABtgT8GwABtgYE4kTWROpHuAACGAQAAAAEDkUeR7gAAAAEBAZFVAAAAhf9gwABslAAAXAE+AT0ckWoWkWUuhDvAAG1vsCkCAWDAAGyUAoCRdsAzq500kYADkYCR6QAAAAEBAZGOAAAAgVRgwABslAAAYMAA/NkBPgI9HJGcLsAATJbAAG1jAQABgZGswDOr3ADAAG13PRyRvhaRuS6EO8AAbW+IPgIBYMAAbI0CFpHNgZHIwDOr3IKTwABslhaR0y7AAEynwABtY8AAbXgAwACaxADAAJrYBsAAbXqBOJHzkfiTEQAAwABMmMAAbWMAAAABA5IPkxEAAAABAQGSIgAAAMAATJlgwABs5wAAXAE+Bk6SMpI4AACAlmDAAPvQAZNJkkEWkkqAkkXAM6x2hBnAAGzpPYmSVMAzrIscklqBklTAM6yLgQYBAAFqkl1gwAD70IM+AMAA++k/SZJuFpJ3gJJywDOsdoQdwABs6j2JkoDAM6yLHJKGgZKAwDOsi4EGAQABapKJYMAA+9CBVQDAAPvpP0mSmRaSooCSncAzrHaEHsAAbOs9iZKtwDOsixySs4GSrcAzrIuBBgEAAWqStmDAAPvQIQDAAPvpP0mSyBaS0YCSzMAzrHaEH8AAbOw9iZLdwDOsixyS44GS3cAzrIuBBgEAAWqS5mDAAPvQFQDAAPvpPz0ckv4WkvkuhDvAAG1vsIMBAAGBkwfAM6yLAMAAmt0GwABte4E4kxaTG5OyAADAAEyawABtYwAAAAEDky6TsgAAAAEBAZM9AAAAgVRgwABs4AAAXAE+Az0ck04Wk0kuhDvAAG1vgbkBAAEWk1+Ak1rAM63FgL3AAGziAMAAmtw9HJNvFpNqLoQ7wABtb4G5AQABFpOAgJN7wDOtxYKQwABs4wDAAJrcPRyTkBaTiy6EO8AAbW+BuQEAARaToYCTnMAzrcWrgsAAbOQAwACa3AbAAG2CgTiTt5O8leMAALPnAAAAAQOTyZXjAAAAAQEBk9cAAACCamDAAGy9AABcAT4BPRyT7BaT5y6EO8AAbW+wKQIBYMAAbL0CgJP4wDOubzSUAgOUApXeAAAAAQEBlBAAAACBVGDAAGy9AABgwAD82QE+Cj0clB4uwABMlsAAbWMBAAGBlC7AM66uAMAAbXc9HJRAFpQ7LoQ7wABtb4g+AgFgwABs0gIWlE+BlErAM66us/3AAGzFFpRZLsAATFnAAG2DAMAAmsQ9HJRuLsAATJjAAG1jAQABFpSLgZSGwDOurqHtwABsxADAAG16PRyUohaUnS6EO8AAbW+BuQEAARaUs4GUrsAzrq6FNMAAbMcAwACa3D0clMsWlMYuhDvAAG1vgbkBAAEWlNyBlNfAM66urIbAAGzIAMAAmtw9HJT8FpT3LoQ7wABtb4g+AgFgwABs4AIWlQuBlQbAM66umoDAAGzJFpUXLsAATJrAAG1jwABtewDAAJrEPRyVOBaVMy6EO8AAbW+BuQEAARaVSYGVRMAzrq60BcAAbMoAwACa3D0clWIWlV0uhDvAAG1vrvQBAAEWlXaBlXHAM66utAfAAGzLAMAAmsA9HJWQFpWLLoQ7wABtb4g+AgFgwABsjQIWlZ+BlZrAM66ugpPAAGzMFpWlLsAATKfAAG1jwABteADAAJrEPRyVwRaVvC6EO8AAbW+BuQEAARaV0oGVzcAzrq6CkMAAbMYAwACa3ADAAJrYBsAAbXyBOJXole2WZgAAwABMpcAAbWMAAAABA5YBlmYAAAABAQGWEQAAAIFUYMAAbNoAAFwBPgI9HJYdLsAATKMBAAEWljSAli/AM7CrgkXAAGzcAMAAbXM9HJZGFpZBLoQ7wABtb7BZAQABFpZdgJZYwDOwq6vFwABs3QDAAJrBBsAAbYOBOJZrlnCXEgAAwABMWQAAAAEDlnyXEgAAAAEBAZaJAAAAtApgwABs0gAAXAE+AT0clp0WlpguhDvAAG1vsCkCAWDAAGzSAoCWqcAzsSg0lrIDlrKXDQAAAAEBAZa/AAAAgVRgwABs0gAAYMAA/NkBPgI9HJbNLsAATJbAAG1jAQABgZbdwDOxZwDAAG13PRyW6i6z5wEAARaW/YGW+MAzsWeCasAAbNQAwABtggDAAJrYBsAAbYSBOJcXlxyXvQAAhL0AAAABA5col70AAAABAQGXNQAAAIZ7YMAAbK8AAFwBPgE9HJdJFpdELoQ7wABtb7ApAgFgwABsrwKAl1XAM7HdNJdeA5del7gAAAABAQGXawAAAIFUYMAAbK8AAGDAAPzZAT4CPRyXeS7AAEyWwABtYwEAAYGXicAzshwAwABtdz0cl5sWl5YuhDvAAG1vgbkBAAEWl6yBl6fAM7IcgpDAAGyxAMAAmtwAwACa2AbAAG19gTiXwpfHmEwAAMAATKbAAG1jAAAAAQOX2ZhMAAAAAQEBl+kAAACBVGDAAGx6AABcAT4CPRyX+haX9S6EO8AAbW+u8wEAASEcmAmAmATAM7KhSAEAASsAwAD9KQDAAJraSZgXIRyYIICYG8AzsqFIAQABKwDAAP0pPgE9HJgxLsAATEYBAAGAmD3AM7KhAMAAbYU/BsAAbYWBOJhRmFaZOgAAwABMRgAAAAEDmGGZOgAAAAEBAZhxAAAAgZNgwABsegAAXAE+AT0cmIQWmH8uhDvAAG1vsCkCAWDAAGx6AoCYkMAzszU0mJgDmJiZNQAAAAEBAZioAAAAgVRgwABsegAAYMAA/NkBPgM9HJi2LsAATJbAAG1jAQABgZjGwDOzdADAAG13PRyY2BaY0y6EO8AAbW+wWQEAARaY74GY6sAzs3SC48AAbHwAwACawT0cmQUWmQAuhDvAAG1viD4CAWDAAP22AhaZFIGZD8Azs3SZb8AAbH0WmSIWmR0uhDvAAG1vgbnAAJrcAMAAmsQAwACa2AAAM52GADOd6gAznkYAM565ADOi6gAzpN4AM6WzADOnTQAzqHkAM6o4ADOq5wAzq30AM6xQADOtnwAzrk8AM7CFADOxBgAzsb0AM7J7ADOzEwAztBMAAAAUAsAAbYiBOJk/mUW5QAPAAEypAAABYMAA/RwAAAEEwABtioE4mWmZbwmDRABgwACbSwABBcAAbaKBOJlzmXOZjAAAAAOZf5mMAAAAAQEBmYUAAASDRGDAAJtLAABgwABtiAE/AggBwABtioAAwDO0ugkBmXPAAP0yAAAAABQGwABtjIE4mZGZmpnZAADAAEyqAAAAAQOZopnZAAAAAAAAAGDAAPocAT4BSpmrAR6Zu8AA+lgBAAEcmcgWmcEug0TAAG2Kr3UAAAAAwACbRwAGwABtjYE4md6Z55ozAADAAEyrAAAAAQOZ85ozAAAAAAAAAGDAAPqmAT4BSpn8AR+aB8AA+tIBAAABwABMcByaJRaaHi6DRMAAbYqwfQAAAADAAJtIBsAAbY6BOJo4mj2ciwAAwABMrAAAAAEDmk2ciwAAAAAAAABgwABsKAE+A06aX5pkAACCZ2DAAGzvARyabRaaZi6DRMAAbYqvcgEBYMAAbO8Bapp/XcAA/HQBYMAAbO/AATRVAMAAmz1HmoyAmpTAM7W7CAGasGqasGDAAGzvwAEzjgA+AUqawQEcmsgumKwAAAAAwABtmQGa62qa62DAAGzvwAEzwQA+AUqa+gEcmwEumL8AAAAAwABtmgGbImqbImDAAGzvwAE0JwA+AUqbNAEcmzsuwABMrQAAAADAAG2dAZtfaptfYMAAbO/AATP0AD4BSptuARybdS6YwAAAAADAAG2bAZuWapuWYMAAbO/AATPaAD4BSpuoARybry6viQAAAADAAG2cAZvTapvTYMAAbO/AATOnAD4BSpvnARyb7i7AAEyuAAAAAMAAbaABnBBqnBBgwABs78ABNA0APgFKnCEBHJwoLpi+AAAAAMAAbZ8BnEtqnEtgwABs78ABNEAAPgFKnFwBHJxjLsAATK8AAAAAwABtnkqcfAErBsAAbY+BOJyQnJikDAAAg50AAAABA5yfpAwAAAAAAAAAYMAAbEYBPhZOnKycsQAAgVRgwABsRgEfnLfAAGxYAAAAAE6cypzSAACB42DAAPvQARyc2xac1C6DRMAAbYqwfQAAAADAAJtITpzunPsAAMAATEBgwAD70AEcnQQWnP0ug0TAAG2KsH0AAAAAwACbSEmdEyIhHJ0kFp0cgJ0XwDO3V4HjwABsU0gBAAGBnSfAM7dxAMAA/PMBIRydRBadN4CdMsAzt1fAAExAwABsVEgBAAGCnUfAM7eXAMAA/PM+AT0enV3AAPWzAQABJAAIJ8AATLCBnaDAM7dxJ4Fqgp2pwDO3lyfAAEyxFp3cgJ3XwDO3V4HjwABsUyeBahad7ICd58Azt1fAAExAwABsVAA/PReeDICeB8Azt1eG0xyeHxaeGC6DRMAAbYqu6AEBYMAAbGwBFp4oLpiswABtmQDAAJskwABsST0Xnj+AnjrAM7dXhIEcnlAWnkkug0TAAG2KrugBAWDAAGyDARaeWS6Yv8AAbZoAwACbJMAAbEw9F55ugJ5pwDO3V7P7HJ6BFp56LoNEwABtiq7oAQFgwABsvQEWnoouwABMrcAAbZ0AwACbJMAAbEo9F56igJ6dwDO3V4SAHJ60Fp6tLoNEwABtiq7oAQFgwABsrwEWnr0umL7AAG2fAMAAmyTAAGxLPRee1ICez8Azt1eEgxye5Bae3S6DRMAAbYqu6AEBYMAAbKIBFp7tLpjAwABtmwDAAJskwABsTT0XnwKAnv3AM7dXmSwcnxUWnw4ug0TAAG2KrugBAWDAAGyUARafHi6vicAAbZwAwACbJMAAbE49F582gJ8xwDO3V7P9HJ9IFp9BLoNEwABtiq7oAQFgwABs0gEWn1EuwABMr8AAbZ4AwACbJMAAbE9Pn2SfaQAAAcAATLJhAWDAAGxBXAADn3mfxwAAAAEBAZ+DAAAAgVRgwABsQQAAXAE+AT0Xn5aEn5HAM7oErZgcn6QWn50ug0TAAG2KrugBAWDAAGzaARafrS7AAEyzwABtY8AAbZcAwACbJMAAbEM9HJ/aFp/TgJ/OwDO3V4SDwABsTYP4AQABg5/iwDO55wDAAPxCPRygCBaf/oCf+cAzt1ez+8AAbEqD+AEAAYOgEMAzuecAwAD8Qk6gLKA+AADAAEy0YMAA+9ABHKBHFqBALoNEwABtirB9AAAAAMAAm0hDoFYcoG+EoF3AM7qegJcBAAGTAMAA/P8+BE6ggaCFAACD0WDAAGwoARyghy7AAEysAAAAAMAAbY5OoKygswAAKV3AAPx0AWDAAGwoARygvBagtS6DRMAAbYqu6AEBYMAAbCgBFqDFLsAATKzAAG2OAMAAmyQ9HKDvFqDjgKDewDO3V4DPwABsUoC/AgAChaDwwDO64Iag98Azuv8AwAD8uj2MoQXAM7qeHKEWhKEFwDO6noGNAQABlADAAPz2PRehKoChJcAzt1ewfByhPxahOC6DRMAAbYqu6AEBYMAAbHoBFqFILsAATK7AAG2gAMAAmyTAAGxQTqF8oYAAAICrXcAA/KUCYMAA/bZdwAD8pQJgwAD9tlsBJqF8ARyhqh6hisAAxOkBAAEcoZwWoZUug0TAAG2Kr3UAAAAAwACbRwCWMgACYMAA/bZdwAD8pQJgwAD9tlsAAABdwAD8pQJgwAD9tl3AAPylAmDAAP22W0ah1KH2od8AAAGEQ13AAPylAmDAAP22WwAWoe6FoerAM7u9KcAA/Mg+AUmh/iEcohUcogmGogLAM7w6SwEAASeZbwDAAPy5SAEAASsAwAD9KT4DTqKvorkAAcAATGtdwAD8pQJgwAD9tlsBJqLOAByiwoaiu8AzvDpLAQABJ5lvAMAA/LldwAD8pQJgwAD9tls9HKL5h6LvwDO8iYP4AQABNKMBA6MBo2MAAAACAgKjAgAAAIMkYMAA/bYAowoAAACBolsAAGDAAPzZAT4BPRyjJoejHcAzvImAvwIAAhSjJ8AzvOQIAByjSiajOAAUozLAM7zxCQBdwAD8dAFbljIAAWDAAP22AADAAPyCAMAA/LoAwAD8xD0co3WGo27AM7w6gL8CAAInmW8co42Ho4PAM7yJljIAAmDAAP22XcAA/HQBYMAA/bYAAMAA/LYAwAD8uj89F6PCgKO9wDO3V7Q/haPSwDO7vcAAbFE9F6PggKPbwDO3V6/qHKPqLsAATLUAAAAAwABtkMAAbEhKo/0BgKQEwDO3VwbAAG2QgTikEaQdprAAAMAATLUAAAABA6QoprAAAAAAAAAAYMAAbFkBPg9OpDWkOgAAgVRgwABsWQEfpEDAAGxrAAAAAD0XpFiApFPAM735tEAcpGUuwABMrQAAAADAAG2dwABsWz0XpH6ApHnAM735mIAcpIwWpIUug0TAAG2KsH0AAAAAwACbSMAAbFw9F6SggKSbwDO9+bRBHKS4FqSxLoNEwABtirB0AAAAAMAAmybAAGxdPRek1YCk0MAzvfm0Qhyk6S7AAEyqAAAAAMAAbYzAAGxePRek/oCk+cAzvfm0QxylFC7AAEyrAAAAAMAAbY3AAGxfPRelLYClKMAzvfm0RB+lQsAA+tIBAAABwABMcJPAAGxgPRelZoClYcAzvfm0RRyleS7AAEyrAAAAAMAAbY3AAGxhPRelkoCljcAzvfm0RhylrxalqC6DRMAAbYqu7AAAAADAAJtGwABsYj0XpcSApb/AM735tEgcpd8Wpdgug0TAAG2KruwAAAAAwACbRsAAbGM9F6X0gKXvwDO9+bRJHKYMFqYFLoNEwABtiq7sAAAAAMAAm0bAAGxkPRemIYCmHMAzvfm0ShymPhamNy6DRMAAbYqu7AAAAADAAJtGwABsZT0XplOApk7AM735tEscpmoWpmMug0TAAG2KruwAAAAAwACbRsAAbGY9F6Z/gKZ6wDO9+bRMHKaRFqaKLoNEwABtiq7sAAAAAMAAm0bAAGxnSqahAYCmqMAzvfkGwABtkoE4prWmuqfOAADAAEy2wABtYwAAAAEDpsinzgAAAAEBAabTAAAAgVRgwABsNAAAXAE+BD0XpuSApt/AM8AogL0cpvIWpusug0TAAG2KsHQAAAAAwACbJsAAbDo9F6cPgKcKwDPAKJiAHKcdFqcWLoNEwABtirB9AAAAAMAAm0jAAGw4PRenMYCnLMAzwCiz9xynRRanPi6DRMAAbYqwdAAAAADAAJsmwABsNz0Xp2KAp13AM8Aos0Ucp28uwABMt8AAbWMAAAAAwABtmMAAbDsGwABtmYE4p9On36qGAACYrAAAAAEDp+qqhgAAAAAAAABgwABsbAFKp/ABHKf3FqfwLoNEwABtirB1AQFgwABsbAE0qA8DqA+qhQAAAAAAAABgwABsbAE+DU6oKKgtAACBVGDAAGxsAR+oM8AAbHkAAAAAPReoWICoU8AzwTGArByoZRaoXi6DRMAAbYq24AAAAADAAJs+wABsbj0cqHguwABMtsAAbWMBAAGAqIfAM8ExAMAAbZI9F6ibgKiWwDPBMbPoHKi2FqivLoNEwABtiq7oAQFgwABsvQEWqL8uwABMrcAAbZ0AwACbJMAAbG89F6jbgKjWwDPBMbPqHKj2FqjvLoNEwABtiq7oAQFgwABsogEWqP8umMDAAG2bAMAAmyTAAGxwPRepGICpE8AzwTGEgRypKRapIi6DRMAAbYqu6AEBYMAAbIMBFqkyLpi/wABtmgDAAJskwABscT0XqUuAqUbAM8ExhIAcqV0WqVYug0TAAG2KrugBAWDAAGyvARapZi6YvsAAbZ8AwACbJMAAbHJPqX2pfQAAAa30YQFgwABsNGDAAGxsAAOphqmuAAAAAQEBqZEAAACEVmDAAGw0AABgwABsbAFKqZsBF6mhgqmbwDPCjoRSgKmqwDPBMcAAbDk9HKnPFqm9gKm4wDPBMbPowABsb4P4AQABganXwDPCbwDAAPxCPRyqAhap8ICp68AzwTGz6sAAbHCD+AEAAYGqCsAzwm8AwAD8Qj0cqisWqiOAqh7AM8ExhIHAAGxxg/gBAAGBqjPAM8JvAMAA/EI9HKpVFqpMgKpHwDPBMYSAwABscoP4AQABgapdwDPCbwDAAPxCSqpxAYCqeMAzwTEAwACbPAbAAG2agTiqi6qVrFoAAJi/AAAAAQOqnqxaAAAAAAAAAGDAAGyDAUqqpAEcqqsWqqQug0TAAG2KsHUBAWDAAGyDATSqwQOqwaxZAAAAAAAAAGDAAGyDAT4JTqrYqt0AAIFUYMAAbIMBH6rjwABsjAAAAAA9HKsBLsAATLbAAG1jAQABgKsQwDPDuwDAAG2SPRerJICrH8Azw7uEGhyrOBarMS6DRMAAbYqu7AAAAADAAJtGwABshT0Xq1GAq0zAM8O7hIMcq2EWq1oug0TAAG2KrugBAWDAAGyiARarai6YwMAAbZsAwACbJMAAbIc9F6uDgKt+wDPDu7P7HKuWFquPLoNEwABtiq7oAQFgwABsvQEWq58uwABMrcAAbZ0AwACbJMAAbIZPq7ertwAAAa30YQFgwABsNGDAAGyDAAOrwKvoAAAAAQEBq8sAAACEVmDAAGw0AABgwABsgwFKq9UBF6vbgqvVwDPEqoRSgKvkwDPDu8AAbDk9HKv+Fqv3gKvywDPDu4SDwABsh4P4AQABgawGwDPEiwDAAPxCPRysKRasH4CsGsAzw7uz+8AAbIaD+AEAAYGsMcAzxIsAwAD8QkqsRQGArEzAM8O7AMAAmzwGwABtm4E4rF+saa6HAACYwAAAAAEDrHKuhwAAAAAAAABgwABsogFKrHgBHKx/Fqx4LoNEwABtirB1AQFgwABsogE0rJUDrJWuhgAAAAAAAABgwABsogE+Ck6srKyxAACBVGDAAGyiAR+st8AAbK4AAAAAPRys1S7AAEy2wABtYwEAAYCs5MAzxY0AwABtkj0XrPiArPPAM8WNs/0crQoWrQMug0TAAG2KrugBAWDAAGzSARatEy7AAEyvwABtngDAAJskwABspj0XrS6ArSnAM8WNoS8crUQWrT0ug0TAAG2Kr3UAAAAAwACbR8AAbKU9F61fgK1awDPFjYKTHK1tFq1mLoNEwABtiq7oAQFgwABsjQEWrXYuwABMuMAAbWPAAG2TAMAAmyTAAGynPRetk4CtjsAzxY2CkBytoRatmi6DRMAAbYqvdQAAAADAAJtHwABspD0XrbyArbfAM8WNhB0crc0WrcYug0TAAG2KruwAAAAAwACbRsAAbKhJreEWreqAreXAM8WNhB3AAGyoPgE9F64EgK3/wDPFjYUBHK4SLsAATLnAAG1jAAAAAMAAbZTAAGypPz0crkkWrkCArjvAM8WNs/3AAGymg/gBAAE0rlEDrlGuZwAAAAEBAa5SAAAAgPVgwABs0gAAYMAAbKIBSq5YAReuWoGuWMAzxxKEUoCuY8AzxY3AAGw5AMAA/EJKrnIBgK55wDPFjQDAAJs8BsAAbZOBOK6MrpWvOQAAwABMuMAAbWMAAAABA66irzkAAAAAAAAAYMAAbI0BPgFKrqsBNa62AAABAGDAAGyNAR+utsAAbJMAAAAANQAAAAEAWwEXrsmArsfAM8eKahyu2Bau0S6DRMAAbYqu7gAAAADAAJslwABsjzUAAAABAFsBF67wgK7uwDPHioKMHK79Fq72LoNEwABtiq7uAAAAAMAAmyXAAGyQNQAAAAEAWwEXrxWArxPAM8eKgbAcryMWrxwug0TAAG2KsHQAAAAAwACbJsAAbJGAAMAzx4oGwABtlIE4rz6vS6/IAADAAEy5wABtYwAAAAEDr16vyAAAAAAAAABgwABslAE+A06vbK92AADAAEy6YMAA+goBHK9/Fq94LoNEwABtiq7sAAAAAMAAm0ZJr4+Ar5PAM8hjSq+eARyvpS6viQAAAADAAG2cP0qvuQErBsAAbZyBOK/Nr9qwuQAAr4kAAAABA6/msLkAAAAAAAAAYMAAbJQBSq/sARyv8xav7C6DRMAAbYqwdQEBYMAAbJQBNLAMA7AMsLgAAAAAAAAAYMAAbJQBPgROsCawKwAAgVRgwABslAEfsDHAAGybAAAAAD0csFIuwABMtsAAbWMBAAGAsGHAM8kGAMAAbZI9F7B1gLBwwDPJBoKTHLCDFrB8LoNEwABtiq7oAQFgwABsjQEWsIwuwABMuMAAbWPAAG2TAMAAmyTAAGyWSrCkAYCwq8AzyQYAwACbPAbAAG2VgTiwvrDQseYAAMAATLvAAG1jAAAAAQOw5rHmAAAAAAAAAGDAAGznAT4CTrDzsPkAAICWYMAA+9ABHLECFrD7LoNEwABtirB9AAAAAMAAm0hKsREBH7EcwABs7gQAAASEGSEcsVUcsUeAsUHAM8m4g3cBAAFqsUlgwAD70IM+AMAA++hIAQABkwDAAPzzhB0hHLF/HLFygLFswDPJuIN3AQABarF0YMAA+9CBVQDAAPvoSAEAAZMAwAD884QeIRyxrRyxnoCxmMAzybiDdwEAAWqxoGDAAPvQIQDAAPvoSAEAAZMAwAD884QfIRyx3RyxzYCxx8AzybiDdwEAAWqxz2DAAPvQFQDAAPvoSAEAAZMAwAD88wbAAG2WgTix67H5sngAAMAATLzAAG1jAAAAAQOyC7J4AAAAAAAAAGDAAGzgAT4BSrIUAR+yH8AAbOYDAAMcsj0WsjYug0TAAG2Kr3UAAAAAwACbRxyyUhaySy6DRMAAbYqvdQAAAADAAJtHHLJnFrJgLoNEwABtiq91AAAAAMAAm0cABsAAbZ2BOLJ9soq1OwAAwABMrQAAAAEDspa1OwAAAAAAAABgwABsvQFKspwBHLKjFrKcLoNEwABtirB1AQFgwABsvQE0srwDsry1OgAAAAAAAABgwABsvQE+DU6y1rLbAACBVGDAAGy9AR+y4cAAbNEAAAAAPRyzAi7AAEy2wABtYwEAAYCzEcAzy4EAwABtkj0XsyWAsyDAM8uBs/0cszcWszAug0TAAG2KrugBAWDAAGzSARazQC7AAEyvwABtngDAAJskwABsxT0Xs1uAs1bAM8uBoe0cs2cuwABMu8AAbWMAAAAAwABtlcAAbMQ9F7OOgLOJwDPLgYU0HLOiFrObLoNEwABtiq91AAAAAMAAm0fAAGzHPRezvYCzuMAzy4Gshhyz2Raz0i6DRMAAbYqvdQAAAADAAJtHwABsyD0Xs/SAs+/AM8uBmoActAgWtAEug0TAAG2KrugBAWDAAGzgARa0ES7AAEy8wABtY8AAbZYAwACbJMAAbMk9F7QzgLQuwDPLgbQFHLRIFrRBLoNEwABtiq91AAAAAMAAm0fAAGzKPRe0Y4C0XsAzy4G0Bxy0eRa0ci6DRMAAbYqu7gAAAADAAJslwABsyz0XtJeAtJLAM8uBgpMctKUWtJ4ug0TAAG2KrugBAWDAAGyNARa0ri7AAEy4wABtY8AAbZMAwACbJMAAbMw9F7TLgLTGwDPLgYKQHLTZFrTSLoNEwABtiq91AAAAAMAAm0fAAGzGPRy0/Ra09IC078Azy4Gz/cAAbMWD+AEAATS1BQO1BbUbAAAAAQEBtQYAAACA9WDAAGzSAABgwABsvQFKtQwBF7UOgbUMwDPNfYRSgLUXwDPLgcAAbDkAwAD8Qkq1JgGAtS3AM8uBAMAAmzwGwABtl4E4tUC1T7WvAADAAEyzwABtYwAAAAEDtWK1rwAAAAAAAABgwABs2gFKtW4BH7VywABs3wIAAhy1gS7AAEysAAAAAMAAbY4ctZwWtZUug0TAAG2KsHQAAAAAwACbJgAGwABtnoE4tbS1wLa0AADAAEyvAAAAAQO1y7a0AAAAAAAAAGDAAGzSAUq10QEctdgWtdEug0TAAG2KsHUBAWDAAGzSATS18AO18LazAAAAAAAAAGDAAGzSAT4FTrYJtg4AAIFUYMAAbNIBH7YUwABs2QAAAAA9HLY0LsAATLbAAG1jAQABgLZDwDPOgADAAG2SPRe2V4C2UsAzzoCCahy2Yi7AAEytAAAAAMAAbZ3AAGzUPRe2iBa2f4C2esAzzoCCasAAbNSEUoC2kcAzzoDAAGw5SrafAYC2psAzzoAAwACbPAbAAG2fgTi2ubbFt4AAAJi+AAAAAQO20LeAAAAAAAAAAGDAAGyvAUq21gEctt0WttYug0TAAG2KsHUBAWDAAGyvATS29QO29bd/AAAAAAAAAGDAAPzZAT4DTrcOtxMAAIFUYMAAbK8BH7cZwABstgAAAAA9HLc5LsAATLbAAG1jAQABgLdIwDPPYQDAAG2SPRe3XIC3V8Azz2GCkBy3aha3Yy6DRMAAbYqvdQAAAADAAJtHwABssQDAAJs8BsAAbZiBOLeFt5S4DQAAwABMt8AAbWMAAAABA7eluA0AAAAAAAAAYMAAbHoBPgNOt7O3vQAAwABMumDAAPoKARy3xha3vy6DRMAAbYqu7AAAAADAAJtGSbfWgLfawDPP80q35QEct+wuwABMrgAAAADAAG2gP0q3/gErBsAAbaCBOLgSuCG5PgAAwABMrgAAAAEDuCu5PgAAAAAAAABgwABsegFKuDEBHLg4FrgxLoNEwABtirB1AQFgwABsegE0uFMDuFO5PQAAAAAAAABgwABsegE+BU64b7h0AACBVGDAAGx6AR+4esAAbIIAAAAAPRy4nS7AAEy2wABtYwEAAYC4rMAz0JoAwABtkj0XuMCAuLvAM9CaguMcuNIWuMsug0TAAG2KsHQAAAAAwACbJsAAbHw9F7jzgLjuwDPQmplvHLkEFrj9LoNEwABtiq7oAQFgwAD9tgEWuRQWuQ0ug0TAAG2Kr3XAAJtHAMAAmyTAAGx9SrkpAYC5MMAz0JoAwACbPAAAM7TpADO1OgAztY8AM7ctADO9zQAzwAIAM8DXADPDYQAzxTMAM8dWADPIMwAzyKwAM8mIADPKogAzyyUAM83BADPOJAAzzwcAM8/DADPQPgAz0UcAAAAUBATAAG1mgTi5TblhBsAATL3AAG1jAGDAAPvQAWq5XWDAAPvQgz4EwABtZ4E4uW25gAbAAEy+wABtYwBgwAD70AFquXxgwAD70IFVBMAAbWiBOLmMuaEGwABMv8AAbWMAYMAA+9ABarmdYMAA+9AhBMAAbWmBOLmtucMGwABMwMAAbWMAYMAA+9ABarm/YMAA+9AVAgbAAG1rgTiBv4HEgisAAZVEAAAAAQOByoIrAAAAAgICgdMAAACBVGDAAGxGAIHpAAAAhDtdwAD9hAFdwAD8dAFgwAD70AAAXAE+AT0cghsfgffAAG2HAQABH4IJwACa9wEAAYGCFMAz0mEAAMAATEEBAAGAgiTAM9JUAMAAbXQGwABtbIE4gi6CNoKMAAGHCgAAAAEDgjyCjAAAAAEBAYJHAAAAEl3AAPx0AWDAAPvQAABgwABsRgE+AUqCUQEcgoEfglzAAG2iAQABH4JtwACbWAEAAYCCesAz0tMAAIOdAAAAAMAAbY8BgTgAM9McADOdBAAztGwAM9GgAAAAAgAz0jQAM9KzADPTHAAAAAIAAADAAG2jAIE5AAAPgNoAAIIuggYAgQMAAKQwAACBHAAAwABgiAAAgT8AALyQAACBYwAAwACGqAAAgYsAAMAAm1kAAIGuAADAAHR/AAEBAcAATMGB3gAAwAB/NgAAggoAAMAAg0sAAIIvAADAAENcAACCWAAAwABrhAABAQPAAEwmwABMM8AATC2CnQAAwACHLwAAgsMAAID7AACC3QAAwABc1QAAgwsAAMAAbnIAAAAAAAgCwABtpIE5hjuGQZclA7esAAABYMAA/RwAAAMEwABtp4E5hm2GeAm3VMAAbaMAYMAAg0wABMAAbaiBOYaahqkJwABMwsAAbaMAXcAA/KUCYMAAa49gwABtsQEyhqdgwABrj2DAAG2xAATAAG2pgTmG0IblCcAATMPAAG2jAF3AAPylAmDAAGv7YMAAbbcBMobjYMAAa/tgwABttwABBcAAbbCBOYbqhuqHTwAAAAOG+IdPAAAAAQEBhxAAAADAAEzEYMAAQ18AAGDAAG2kAT8CCADAAG2nFodFgIc2wDPUr7NUwABDfAkBhurAAP0yAAAAAAQGwABtq4E5h7+HxJP/AACvEQAAAAEDh92T/wAAAAEBAYflAAAAhIxgwABrjwAAXAE+Bk6H/IgGAACE4mCDFAEciBQWiAgut1TAAG2jwABtp8AATMUBAAGAiCHAM9UKAMAAg2tOiEKITwAAhNddwAD8dAFgwABrxAExiFFgwABrxABOiHSIfgAAs/RdwAD8pQJgwABr+2DAAG2/ATKIgGDAAGv7YMAAbb8ARoiIAIiWAAAAhI5gg3cAFoipgYifwDPVHYSDgydBPgVJiLkhFojEhIi+wDPVl4T8g4xCiNYAP06I84kAAADAAEzGYLzJARyJDhaJAi63VMAAbaPAAG2nwABMxwEAAYSJF8Az1ZcAwACDX06JM4k+AACCa2CEqQEWiUaEiUDAM9WXhQGDe06JZ4ltAACAlmDAAGC7ARyJexaJby63VMAAbaPAAG2nwABMyAMAAYaJjMAz1f4CwABMySrAAEzKKcAAg2lJidUiIRyJ34eJ2cAz1hlIAQABKwDAAP0pABaJ8IeJ6sAz1hm4lsAAYL0+AT0cig+DigbAM9VsgL8CAAImig8BhYoQwDPVy2DAAGv7H4okwABtxgEAAYeKMsAz1hkAAMAA/Lo/RopNioiKYQAAAJjVYIOkABaKeoGKcMAz1R2E14MoPgNOip2KsAAAwABMy2DAAGvEASaKnQEcir4WirIut1TAAG2jwABtp6fIAQABhIrNwDPWvgDAAINeYMAAa8Q9HIrugorhwDPVTlYBAAGFivLAM9baAMAA/IVGiw0AiyEAAACFAWCEMQAWizyEizDAM9a+hRGDqUE+AUmLVCWLZIaLWMAz1zRghD8+B06LloubAAASYMAAbb8BHIu0g4urwDPVbEsBAAEci8EWi7Uut1TAAG2jwABtp8AATMcBAAEWi9YUi8rAM9c0BgFghD+EjoREAMAAg18AwAD8uUmL6RyL8oeL7cAz12NIAQABKwDAAP0pPgFCjI8AP06MvIzNAADAAEzMYMAAbdUBaozVYMAAbdXAATSyTo0EjQoAAICWYISpARaNGBSNDMAz1zQGAWCEP4CWhEJOjTeNRQAAwABMzmDAAGC7ARyNUxaNRy63VMAAbaPAAG2nwABMyAMAARSNZMAz1+8JAALAAEzJKsAATMopwACDaUmNsCIhHI3CFI20wDPYDwoASAEAASsAwAD9KQAWjdsUjc3AM9gPCgC4lsAAYL0+AT0VjfXAM9fSCB+ODMAAbeABAAEUjh/AM9gPCgAASY5AJY5KFI5EwDPX7wkAYIS8PgNOjoKOjAAAgO1giE4BFo6UFI6OwDPX7wkBYIS8gmyEvk6Oro63AACBsWDAAPvQARyO8xaO3haO1YSOycAz1r6CaoOohLqEhYC7AQABFI77wDPYsQsAAMAA/IlJjxMhHI8gFI8XwDPY0QwASAEAARyPI5SBxAAAAADAAPvzAMAA/PM+AUmPNxyPRBSPO8Az2NEMAIFtAQABFo9cFo9ThI9HwDPWvoJqg6iFGYSEAMAA/QA+Aj0Vj4bAM9gPChyPohaPli63VMAAbaPAAG2nwABMyAMAARaP0hSPyMAz2LELAIUBiFYCwABMySrAAEzKKcAAg2lJkEQiIRyQVhSQSMAz2A8KAEgBAAErAMAA/SkAFpBvFJBhwDPYDwoAuJbAAGC9PgE9FZCPwDPX0ggfkLzAAG3hAgACFJDTwDPY0QwAFJDdwDPYDwoAAD8/PgI9FZEywDPY0QwckXQWkWQWkVuEkU/AM9a+gmqDqIS7hIaAuwEAARSRfMAz2LELAADAAPyJSZGWIRyRoxSRmsAz2NEMAEgBAAEckaaUgcQAAAAAwAD78wDAAPzzPgI9FZG8wDPYDwockdgWkcwut1TAAG2jwABtp8AATMgDAAEWkggUkf7AM9ixCwCFAYhWAsAATMkqwABMyinAAINpSZJ6IiEckowUkn7AM9gPCgBIAQABKwDAAP0pABaSpRSSl8Az2A8KALiWwABgvT4BPRWSxcAz19IIH5LywABt4gIAAhaTDhSTBMAz2LELAIC9iFIUkxTAM9gPCgAAPz8/PRyTexaTb4eTasAz12OFEcAAbcKAvwIAAoWTfMAz1toUk5LAM9fSCAAAwAD8uj89HJPKFpPALsAATMLAAG2jwABtqIC/AgACgJPLwDPVCh+T2cAAbbYCAAKCk+PAM9VOg5PxwDPVbAAAwAD8ugbAAG2sgTmUBJQJlj0AALfjAAAAAQOUHJY9AAAAAgIClCQAAACEjmDAAGv7AJRBAAAAwABMz2DAAJvsAABcAT4FTpRclGEAAIPuYIN3ASaUXAEclG8WlGMut1TAAG2jwABtp7faAQABgJR9wDPbhwDAAIN2YIN3TpSXlKIAAIJrYISpARaUqYKUpMAz26mFAYN7TpTIlM4AAICWYMAAYLsBHJTcFpTQLrdUwABto8AAbafAAEzIAwABg5TtwDPb3wLAAEzJFpUXgpUSwDPbqYQdg4bAAEzKKcAAg2lJlTkiIRyVQ4SVPcAz2/pIAQABKwDAAP0pACEWlVWElU/AM9v6uJbAAGC9PgE9jJVpwDPb+is/PRyWCRaV+S7AAEzDwABto8AAbamAvwIAAoCWCsAz24cflhfAAG2+AgAChJYnwDPb+oGWLsAz25QAAMAA/LoGwABtrYE5lkKWUJa7AADAAEzQAAAAAQOWapa7AAAAAQEBlnIAAACEjmDAAGv7AABgwABtvwE+AUqWfwEclrAWlqcclpAWloYuwABMwsAAbaPAAG2oSwEAARaWl4CWkcAz3NqE+cAAa6UAwAD8ubP0wABttEsBAAGAlrHAM9zaAMAA/LkGwABtroE5lsCW0JcjAADAAEzRAAAAAQOW7JcjAAAAAQEBlvQAAACEjmDAAGv7AABgwABttwE+AUqXAQEclxgWlwguwABMw8AAbaPAAG2pSwEAAYCXGcAz3V4AwAD8uQAAM9TqADPbZwAz3LgAM908ADPdmwAAAAQCwABtsYE5lyiXLpfCA8AATNIAAAFgwAD9HAAAAgTAAG2zgTmXVZdhCYTXAF3AAPx0AWDAAGvEAATAAG20gTmXhpePCbP0AF3AAPylAmDAAGv7YMAAbb8AAQXAAG22gTmXlJeUl8AAAAADl52XwAAAAAICApejAAAEhNddwAD8dAFgwABrxACXtgAABLP0XcAA/KUCYMAAa/tgwABtvwAAYMAAbbEBPwMIAcAAbbOAAMAz3igIAcAAbbSBAMAz3jsJAZeUwAD9MgAAAAAAAAAz3oEAAAAAAsAAbbeBOZfFl8uYswPAAEzTAAABYMAA/RwAAAIEwABtuYE5l/OX/wmWNgBgwABguwAEwABtuoE5mB+YKQnAAEzPAGDAAJvsAAEFwABtvoE5mC6YLphhAAAAA5g9mGEAAAACAgKYQwAABJY2YMAAYLsAmFYAAATAAEzPYMAAm+wAAGDAAG23AT8DCAHAAG25gADAM97vCAHAAG26gQDAM978CQGYLsAA/TIAAAAAAQbAAG28gTmYZphvmLEBAMAATNQAAAABA5h/mLEAAAAAAAAAYMAA+goBSpiCASIhHJiNFpiCLsAATM/AAG26SAEAASsAwAD9KQAhHJiqFpijFpiYLsAATM/AAG26hIPAAJvvSAEAASsAwAD9KQAAM985ADPfpQAAAAECwABtv4E5mLaYvJngA8AATNUAAAFgwAD9HAAAAgTAAG3BgTmY4pjuCZY2AGDAAGC7AATAAG3CgTmZF5koCYURAF3AAPylAmDAAGvEYMAAbdUBMpkmYMAAa8RgwABt1QABBcAAbcaBOZktmS2ZTQAAAAOZOplNAAAAAQEBmUAAAASWNmDAAGC7AABgwABtvwE/AggBwABtwYAAwDPgLgkBmS3AAP0yAAAAAAEGwABtxIE5mVKZZZneAAAjAWqZU2DAAP0cAgAAAQOZbZneAAAAAAAAAGDAAP22AUqZeQEkAAYnwABM1jUAAAABAGDAAGC7ARaZly6WNsAAbcEjHJmlgADAM+CZSAEAASsAACscmaWAAMAz4JmvjwAAAADAAGDcAWDAAP22J4CnJ8AATNcWmdAuhRHAAG3CJ4MhAAAz4F0AM+DuAAAAAQLAAG3HgTmZ45nomiYLwABM2AAAAWDAAP0cAAAHBMAAbcmBOZnomegJJwBgwAD70AAEwABty4E5meiZ6AkowABtowBgwAD9tgAEwABtzIE5meiZ6AYpAF3AAPx0AWDAAG3HAWoAXcAA/HQBYMAAbcfAATUbBMAAbc2BOZn8mfwGukgAYMAAbccBagBgwABtx8ABNNUEwABtzoE5mgaaBgaFjQBgwABtxwFqAGDAAG3HwAE07gTAAG3PgTmaFJoUBoVXAGDAAG3HAWoAYMAAbcfAATUHBMAAbdCBOZodmh0GwABM3ABgwABtxwFqAGDAAG3HwAE0ngEFwABt1IE5meiZ6JomAQAAA5nomiYAAAACAgKZ6AAABCdgwAD70ACZ6AAABChgwAD9tgAAYMAAbccBPwMIAMAAbcmAAMAz4g0IAMAAbcuBAMAz4hkJAADAAP0yAAAAAAEGwABt0oE5meiZ6JomAAAjAAAAAQOZ6JomAAAAAAAAAGDAAP22AUoAAQ8ALsAAbcsAADPiUgAz4oIAAAABAsAAbdWBOZopmi+eTAOFPgAAAWDAAP0cAAAEBMAAbdeBOZpVmlkJgmcAYMAAbccABMAAbdiBOZpnmmwJJwBgwAD70AAEwABt2YE5mn2agQmAvQBgwAD9tgAEwABt2oE5mpmangmAlgBgwABguwAEBcAAbeCBOZqjmqObEgC6SAADmrWbEgAAAAEBAZq7AAAEgJZgwABguwAAYMAAbdUBPwUIAcAAbdqAAMAz4xoIAMAAbddqmuFgwABtx8ABNNUIAMAAbdgrCADAAG3ZKwkBmqPAAP0yAAAAAAXAAG3hgTmbF5sXm4QAhY0AA5stm4QAAAACAgKbMwAABCdgwAD70ACbPwAABICWYMAAYLsAAGDAAG3VAT8FCAHAAG3YgADAM+OECAHAAG3agQDAM+OQCADAAG3XaptlYMAAbcfAATTuCADAAG3ZKwkBmxfAAP0yAAAAAAXAAG3igTmbiZuJm+wAhVcAA5uam+wAAAACAgKboAAABIC9YMAA/bYAm6sAAASAlmDAAGC7AABgwABt1QE/BQgBwABt2YAAwDPj/wgBwABt2oEAwDPkDAgAwABt12qb0WDAAG3HwAE1BwgAwABt2CsJAZuJwAD9MgAAAAAFwABt44E5m/Gb95x0AcAATNwAA5wKnHQAAAAAAAAAYMAAbdUBPwUIAMAAbddqnCxgwABtx8ABNJ4IAMAAbdgrCADAAG3ZKwgAwABt2isJAZv3wAD9MgAAAAACBsAAbdyBOZx5nISeGwEAtGoAAAABA5yOnhsAAAAAAAAAYMAA/bYBPgJHnJQWnJwugmfAAG3XBAGcv2qcv2DAAG3HwAE01QA+AUqczwEcnNwWnNYugJbAAG3ar48AAAAAwABg3AGdC2qdC2DAAG3HwAE07gA+AUqdHwEknUoDFp0oLifAAG3YJ4LmHJ02Fp0wLoCWwABt2q+PAAAAAMAAYNwBnWdqnWdgwABtx8ABNQcAPgFKnXYBJJ2gAxadfy6AvcAAbdknguYcnYwWnYYugJbAAG3ar48AAAAAwABg3AGdvWqdvWDAAG3HwAE0ngA+AUqdzgEngPQ9MJ3kH53uwAD7YgEAASSeFgInwABM3RaeES6CZ8AAbdcABsAAbd6BOZ4gnjOeSgAAIwFqniFgwAD9HAIAAAEDnjueSgAAAAAAAABgwAD9tgFKnkEBFp5BLrRqwABt3AAAM+S6ADPl1AAz5hEAAAACAsAAbeSBOZ5PnlXAAFDKA7vmAAABYMAA/RwAAAIEwABt5oE5nuGe9waD5wBgwAD9tgFqnudgwAD9tsABNTIEwABt6IE5n3efgQnAAEzfwABtowBdwAD8pQJgvMlgwABt8gABBcAAbfGBOZ+Gn4afpwCAtcAAbaMAA5+Wn6cAAAABAQGfnAAABMAATN9dwAD8pQJgvMlgwABt8gAAYMAAbeQBPwIIAcAAbeiAAMAz5qUJAZ+GwAD9MgAAAAAEBsAAbeqBOZ/on/ChOwQBrs4AAAABA6ARoTsAAAACAgKgJAAAAINEYMAAXSoAoDwAAAB6YIEUAABgwABt5AE+BD0coFKAoEvAM+b/gpQBAAFqoFhgwAD9tsABNTIAwABdLE6ghqCQAACz9F3AAPylAmC8yWDAAG3yARygmYCgksAz5v+zlwECYLzJYMAAbfIBNKCwA6CwoPUAAAABAQGgvgAAAIJmYLy3AABgwABt8gFKoMkBHqDNwABt/QEAAYCg7sAz5v8AAMAAXWQ9HKEDgKD8wDPm/4KMAQABaqEHYMAA/bbAATUyAMAAXS1KoREBH6EcwABt8QEAAYKhLcAz50EABsAAbe2BOaFyoXeiUQAArs8AAAABA6GGolEAAAABAQGhkAAAAIQ7YMAAXNsAAFwBPgM9HKGhgKGcwDPoAYKUAQABaqGnYMAA/bbAATUyAMAAXOA9HKG2gKGxwDPoAbOfAgFgwABt8gIWoc4uwABM38AAbaPAAG3oNKHiA6HiojkAAAACAgKh8AAAAIJmYLy3AKIKAAAAEmDAAG3yAABcAUqiHwEcoiSCoh/AM+hyrs8BAAGAojTAM+gBAMAAbf8AwABdET0cokWAokDAM+gBgowBAAFqoklgwAD9tsABNTIAwABc4QbAAG3rgTmiVqJewABP9wQBligAAAABA6JxwABP9wAAAAMDA6KDAAAApMxgwACHMACioAAAAICrYMAAf3AAorsAAAB6YIEUAABgwABt5AE+Dk6i7qL4AACz9F3AAPylAmC8yWDAAG3yATKi+mC8yWDAAG3yAE+jA6MIAAABwABM4GEBYLzJYMAA+goAA6MTo6cAAAABAQGjIAAAAISOYLzJAABgwAD6CgE+AUqjLwEiIRyjUxajQ4CjN8Az6Oqk+sAAh0jAAEzhAQABhaNgwDPpXQDAAG4/ACEco4wWo4GAo3XAM+jqt2/AAIc2wABLdwEAAYWjm8Az6V0AwABqRz0co9wWo8gWo7qAo67AM+jqs/XAAIdEwABMwsAAbaPAAG2og/gBAAE0o+QDo+S0gwAAAAICAqPxAAAAmcJgvKUApAAAAADAAES9YMAAbbEAAGDAAPzZAT4BPRykJxakHYakE8Az6gaz9MAAbbSD+AEAATSkLwOkL7R7AAAAAgICpDcAAADAAEziYMAAa/sApE0AAAASYMAAbb8AAGDAAPzZAT4ETqRkpGsAAMAATONgwAB1ZAEmpGQBHKRxgaRtwDPo98AATOQBAAGHpIHAM+pFAMAAf3RgwAB1ZEmkkhyknRSklsAz6moJAEgBAAErAMAA/Sk+AUqksgA/TqVppXUAALtmYMAAboQBHKWSFqWDgKV3wDPo6rdowACHRksBAAGHpZPAM+pFAMAA/LlJpaQhFqW1FKWpwDPqwQoAu2nAAG6NPgFJpcocpdmEpc7AM+k+IAEAAYel2sAz6kUAAD4BPRyl+oOl8cAz6RiAvwIAAhSl+8Az6moJAGqmC2DAAG3ywAE1NwDAAPy6Pz4BSaZVIRymaxamXhSmWcAz6lQIAJY2wABtwUgBAAErAMAA/Sk+CE6mkAAAAJY2YMAAYLsATqavprwAAMAATOVgwAD6CgEqT6bSptcAAAHAAEzmYQFgwABgu1wAA6bqqBIAAAABAQGm+QAAAICWYMAAYLsAAFwBPgJJpxAUpxTAM+uHDABKpyIAP0mnOBynSRSnPMAz63kLAEgBAAErAMAA/Sk+AT0Vp2TAM+t5CxSnc8Az67gOAEmnjyEcp6AUp5PAM+t5CwBIAQABFKejwDPruA4AAMAA/Sk+Aj0Vp7zAM+t5Cys9FafhwDPrhwwpPz0cqD4WqC0UqCHAM+rBCgDAAEznwABujIP4AQABFKhGwDPrmw0AAMAA/EJOqG6ogAAAwABM6GDAAPoKASlBRqiUAKimAAAAmNVgwABrxAAWqL+GqLXAM+oGhNfAAG2zQT4GSajdFKjhwDPrhwwAPgFCqQEAP06pM6lEAADAAEzpYMAAboQBHKlzFqlkgKlYwDPo6rdowACHRksBAAEUqXTAM+yDDwAAwAD8uUmpkByppRSplMAz7LcQAEgBAAErAMAAbqQ+AUKp8gE/Tqotqj8AAMAATOpgvPMBIxyqbxaqX4CqU8Az6Oqk+sAAh0jAAEzhAQABFKp8wDPsgw8AAMAAbj8Wqq0UqqHAM+yDDwC0W8AAa78WqukUqtjAM+y3EADAAEzqwABulgFgvPNOqxerIwAAhQFgwABt1QEcqzYWqyoUqyXAM+pUCACFEcAAbcJLAQABFKs3wDPsgw8AAMAA/LlJq1Mcq2MUq1fAM+1vEgBIAQABKwDAAP0pPgE9Fat+wDPsbQ4qPgFBR6vAFqvUFKvIwDPtbxIAgmfAAG3XBAGsA2qsA2DAAG3HwAE01QA+Aj0crDIUrB/AM+ubDQAgAQABFqw/FKwzwDPtbxIAgJbAAG3aAABCrFsCAayJaqyJYMAAbcfAATTuAD4CSaypHKy/Fqy5FKytwDPtbxIAJ8AAbdiBbQEAARas7BSs2sAz7Q0RAIS6vPcAwAD9AD4BPRytLRStGsAz65sNACABAAEWrToUrS7AM+1vEgCAlsAAbdoAAD4BPRWtdcAz64cMKUKttAIBreJqreJgwABtx8ABNQcAPgJJrf0hHK49Fq4UFK4CwDPtDREAhLu8+IMXAQABFq5SFK5GwDPtbxIAgL3AAG3ZAMAA/EE+AT0croQUrnHAM+ubDQAgAQABFq6RFK6FwDPtbxIAgJbAAG3aAAA+AT0VrszAM+uHDClCrwsCAa85aq85YMAAbcfAATSeAD4CPRWvVsAz64cMKUKvfwJJr8IhFK/HwDPsbQ4APgE9HK/9FK/qwDPrmw0AIAEAARawAxSv/sAz6lQIAJY2wABtwQAAP0mwLCIhFLAxwDPrhwwAACEcsE4UsEHAM+t5CwBIAQABKwDAAP0pPgZOsHWwewAAgJZgwABguwEcsIGBsH3AM+j3wABM6wEAARSwk8Az63kLAADAAH92TrC1sMsAAMAATOxgwAD6CgEqTrDnsQAAAMAATO1gwAD6CgEqQCEcsSQUsR7AM++RDwBIAQABKwDAAP0psR6xKwBJsTwiIRaxTRSxQcAz6sEKAMAATO7AAG6QAByxZISxWcAz6T4gAQABh7FlwDPqRQAAPgE9FbGAwDPvvxApSbGzIiIiFrG9FLG3wDPvkQ8ArGnAAGC+ARax3xSx2cAz75EPALoHwABgwgEWsgAUsfrAM++RDwC6BcAAYL8BFrIiFLIcwDPvkQ8AtRvAAGDFPgE9FbMIwDPv0REpPz0cs1CDs0fAM+kYgL8CAAIUs1HAM+pqCQAfs1/AAG4GBAAABJY2FLOSwDPvkQ8AwABM7xSzv8Az778QAMAASCIUs/LAM++/EADAAEztFLQ1wDPv0REAAMAA/Lo/PwDAAPzEAMAA/MROtJi0qgAAwABM8F3AAPx0AWDAAGv7ATG0rGDAAGv7AE60wbTRAADAAEzxXcAA/HQBYMAAa/sBMbTTYMAAa/sAPRy1ARa06IC03MAz6Oq3aMAAh0aD+AEAATS1CQO1CbaDAAAAAgICtRcAAACCZmC8twC1KwAAALtmYMAAboQAAGDAAPzZAT4BSbVAIha1S4e1RMAz8WiHdry+ACEWtV6HtVfAM/FohPy8vD4CTrWKtZoAAMAATPJgwABttwEctdIWtcIWtbSAtajAM+jqs/XAAIdEwABMw8AAbaPAAG2pSwEAAYe108Az8WgAwAD8uUm15Ba1+BS16MAz8a4JAMAATNTAAG28PgE9HLYlhrYVwDPxIlYBAAEmtikBh7YpwDPxaGDAAGv7AMAA/IU+AT0ctl+Ftk3AM/ECVgEAASa2YwGHtmPAM/FoYMAAa/sAwAD8hT8AwAD8xE62uLbIAADAAEzzXcAA/WcBYMAAa/sBNQAAAAEAXcAA/WcBYMAAa/sBHgDAAMDiAAFgwABr+wAAhwDAM/JxTrcvtz0AAMAATPRdwAD9ZwFgwABr+wE1AAAAAQBdwAD9ZwFgwABr+wEeAMAAwOIAAWDAAGv7AAAUAMAz8q8IAE64BLgXAADAAEz1YMAA+9ABk0+4+7kNAAABwABM9mEBYMAAa/tgwABt8gADuRnAAEv3AAAAAQEBuSEAAADAAEziYMAAa/sAAGDAAG3yAT4LTrk4uT8AAMAATONgwAB1ZAEmuTgBHLlFgblBwDPo98AATOQBAAEUuVXAM/MPCwAAwAB/dGDAAHVkSbmmHLmxFLmqwDPzKAwASAEAASsAwAD9KUq5ugErP0654LnlAAASYMAAbfIBHLnwg7nnwDPpGEsBAAEUufHAM/MoDAAAwAD8uUm6ABy6FIe6BMAz8lqDFwEAARS6HcAz8w8LAADAAP1zPgFKunMBNQAAAAEAYMAAbfIBFLp6wDPzgA0AIxy6fxQAwDPz0A4ASAEAASsAAGq6iGDAAG3ywAE1YRQAwDPz0A4AAWDAAG3yP0m6qxy6vRS6r8Az8pgIAIMXAQABFLrGwDPzDwsAAMAA/XM+AUq69wErPz0cuyAUuxLAM/KYCABWAQABFLskwDPzDwsAAMAA/XROuz+7SwAAu2ZgwABuhAEcu2gWu1mAu03AM+jqt2jAAIdGSwEAARS7acAz8w8LAADAAPy5Sbt4IiEWu4kUu33AM/RcDgC7acAAbo0AHLufhLuUwDPpPiABAAEUu6DAM/MPCwAAAD4BPRW7s8Az84ANNQAAAAEAXcAA/KUCYLzJYMAAbfIBg7u6wDPpGDUAAAABAGDAAHVkARS7xMAz8ygMADUAAAABAGDAAG3yAWq71GDAAG3ywAE1NzUAAAABAFwBHLvDFLvDwDP0zA8AgL8CAAIUu8PAM/ToEAAUAMAz9P0RAADAAPy6FADAM/T9EQA+CU68E7wmAADAAEzvYMAA+goBIRa8NRS8KcAz9FwOAMAATO7AAG6QTrxXvGcAAMAATPJgwABttwEcvJ8WvI8WvIGAvHXAM+jqs/XAAIdEwABMw8AAbaPAAG2pSwEAARS8oMAz8w8LAADAAPy5Try/vMUAAICWYMAAYLsBHLzYgbzHwDPo98AATOsCAAEWvPoUvOrAM/V0EACWNsAAbbkBl6spwAB/dk69wL3JAADAAEgiYMAA+goBIiIUvdfAM/VODwAAIRy98xS97cAz9bkRAEgBAAErAMAA/SkAHL4JhL3+wDPpPiABAAEUvgrAM/MPCwAAAE6+IQAAAMAATPdgwAD6CgBOwABAywAAAMAATPhdwAD8dAFgvMkATsAAQO/AAED9AADAAEz5YMAA+9ABK0nAAEEOFMAAQRLAM/XzEgA+AT0VwABBjcAz9kETKj4DPRXAAEMZwDP2QRMhHMAAQykUwABDI8Az9bkRAEgBAAErAMAA/SlJwABDPCEUwABDQcAz9kETAD4DTsAAQ+PAAEPuAADAAEzPYMAAm+wBFsAARAAUwABD8MAz9XQQAMAATM/AAG26PRXAAEQYwDP2QRM1AAAAAQBgwAD6CgE1AAAAAQBgwACb7AEUwABEIsAz9tYWACMcwABELhQAwDP3GhcASAEAASsAACsWwABELhQAwDP3GhcAwABM98AAm/YBYMAA+gojHMAARDYUAMAz9w4XAEgBAAErAAAqFADAM/cOFwABYMAA+gpJwABETCIUwABEUMAz9kETAAAhHMAARG0WwABEZhTAAERbwDP21hYAhIPAAJvvSAEAASsAwAD9KT4BQUbAAESGwABEr8AARJQAAACD7mCDdwAWwABEpxTAAEScwDP21hYAhIPAAJvvPgZOwABEyMAARNMAAMAATPpgwABr+wEmwABEyAEcwABE7BbAAEThgMAARNXAM+jqs1TAAIcywABMxwEAARTAAET1wDP3yRcAAMAAg+9gwABr+07AAEUewABFKAAAwABM+2DAAG3yARzAAEU2FMAARSrAM/LsCgAgAQABFMAARTfAM/fvGAAAAEnAAEVUHMAARWIUwABFWMAz+D8ZAEgBAAErAMAA/Sk+Aj0VwABFt8Az9kETKkLAAEXaAD9JwABGAxbAAEYRFMAARgfAM/g/GQDAAEz8wABuAj4CPRXAAEZqwDP2QRMqQsAARo0AP0nAAEa2IRbAAEbFFMAARrvAM/g/GQDAAEzvwABt9z4CPRXAAEeywDP2QRMqQsAAR9UAP0nAAEf+IRbAAEgNFMAASAPAM/g/GQDAAEzswABuAz4CPSMcwABITxTAAEg4wDP2URQASAEAASsAwAD9KRXAAEg4wDP2URQxwABIU2C8yQArAV3AAPx0AWC8yUnAAEhpGsAASG2kMj4BPRzAAEiwFMAASJnAM/ZRFABWAQABJsAASLgBHMAASLiBwABItMAz6PfAAEzkAQABFMAASMjAM/fvGAAAwAB/dGC8yQDAAPyFPz8/P0nAAEkxIhTAAEk1wDP2QRMAACEcwABJVxTAAElAwDP2URQASAEAASsAwAD9KT4CPRXAAEluwDP2ZxU1AAAAAQBgwAD70AEUwABJfsAz8tgJADUAAAABAGDAAPvQARXAAEl+wDPy2AkcwABJkBQAwDP5/BYAZAEAAZQAwAD89RQAwDP5/BYAScAASaAhGsAASaWkMj4BPRXAAEnLwDP2URQrPz4BPRXAAEoXwDP2URQrPRXAAEpVwDPzgA01AAAAAQBdwAD8pQJgvMlgwABt8gGDwABKXMAz6Rg1AAAAAQBgwAB1ZAEUwABKZsAz8ygMADUAAAABAGDAAG3yAR/AAEp0wABuBgYAAAaWNhTAAEqhwDP1uREAwABM7xTAAErIwDP1Tg8AwABIIhTAAErywDP18xIAwABM9xTAAEsRwDP2QRMAwABM9RTAAEs6wDP2ZxUAwABM/RTAAEt3wDP2URQANQAAAAEAXAEcwABKZRTAAEplwDP6fRYAgL8CAAIUwABKZcAz+psXABQAwDP6shgAAMAA/LoUAMAz+rIYAD0cwABLrRTAAEufwDPymAgAhFkBAAEUwABLtMAz8w8LAADAAP12PRzAAEvTh8AAS8PAM/JaVgEAARTAAEvXwDPzDwsAAMAA/XRKwABL5gEUwABL7cAz84ANAD0cwABMcIXAAExewDPxAoP4AQABFMAATHjAM/LsCgAAwAD8Qj0cwABNTYbAAE09wDPxIoCuAQABNMAATVIDwABNUsAAT5kAAAACAgLAAE1aAAAAgdVgwABr+wDAAE1kAAAAgkpgwABr+wAAYMAA+9ABPglOwABNc8AATXoAAIF2YMAA+9ABHsAATYbAAIaqAgACFsAATaUWwABNnRTAAE2bwDP8BQsAhEPAAGukpRjAAGuKFsAATb0WwABNtRTAAE2zwDP8FAwAhEPAAGukpRjAAGuKAEnAAE3SIRzAAE3dFMAATdbAM/wtDQBIAQABkwDAAPzzSsAATeMBFMAATerAM/wtDQA/TsAATgTAAE4OAADAAEz+YIphARbAAE44HMAATicWwABOHIDAAE4QwDPo6rNUwACHMrfaAQABFMAATjXAM/wFCwAAwACEAIRbgmVOwABOVMAATl4AAMAATP9gimEBFsAATogcwABOdxbAAE5sgMAATmDAM+jqs1TAAIcyt9oBAAEUwABOhcAz/BQMAADAAIQAhFuCZT0VwABOmMAz/C0NHsAATqHAAIatAgACFsAATr0UwABOs8Az/MEOAIG7imMWwABOzRTAAE7DwDP9Cw8AgbuKYwBJwABO2iEcwABO5RTAAE7ewDP8LQ0ASAEAAZMAwAD880rAAE7rARTAAE7ywDP8LQ0APz0VwABPAMAz/C0NHMAATxgWwABPExTAAE8JwDP8wQ4AgfqKZIJLAQABFsAATywUwABPIsAz/QsPAIH6imQAwAD89EnAAE85IRzAAE9EFMAATz3AM/wtDQBIAQABkwDAAPzzSsAAT0oBFMAAT1HAM/wtDQA/SsAAT18BHMAAT3cWwABPcBTAAE9mwDP8wQ4AhuOKZYJLAQABFsAAT4sUwABPgcAz/QsPAIbjimUAwAD89ADAAPyHPRzAAE+xhsAAT6HAM/Eig/gBAAEUwABPucAz8uwKAADAAPxCSsAAT80BH8AAT9jAAG3xAQABg8AAT+nAM+kYAAbAAG3ugTnAAFBcwABQbsAAUMgAALP2AAAAAQPAAFB6wABQyAAAAAEBAcAAUIIAAACEjmDAAHVkAABgwABt8gE+AUrAAFCPATUAAAABAGDAAG3yARzAAFCgFsAAUJYuwABM38AAbaPAAG3oSwEAAYDAAFChwDP+5gDAAPy5IxzAAFCogQDAM/8FSAEAASsAAGrAAFCxYMAAbfLAATVhgQDAM/8FAWDAAG3yAAAz5t8AM+fhADPoxgAz/rwAM/9mAAAABALAAG3ygTnAAFECwABRCMAAXFUDwABNAAAAAWDAAP0cAAAIBMAAbfSBOcAAUTLAAFFNBoPnAGDAAP22AWrAAFE4YMAA/bbAATWLBMAAbfWBOcAAUWbAAFFyCZY2AGDAAGC7AATAAG32gTnAAFGBwABRmQnAAEztAGDAAPoKAATAAG33gTnAAFGowABRugnAAEzvAGDAAPoKAATAAG34gTnAAFHJwABR0QnAAEgiAGDAAPoKAATAAG35gTnAAFJ8wABSgwnAAEz3AGDAAPoKAATAAG36gTnAAFNHwABTWQnAAEz1AGDAAPvQAATAAG37gTnAAFN2wABTlgnAAEz9AF3AAPx0AWC8yQABBcAAbgaBOcAAU5vAAFOhwABUrwEAAAPAAFOywABUrwAAAAcAAAfAAFPAAAAEljZgwABguwFqAGDAAPzZd8AAU9kAAATAAEztYMAA+goBasAAU/NgwAD6CgDAAFQFAAAEwABM72DAAPoKAWrAAFQZYMAA+goAwABUKwAABMAASCJgwAD6CgFqwABUNWDAAPoKAMAAVEcAAATAAEz3YMAA+goBasAAVFBgwAD6CgDAAFRiAAAEwABM9WDAAPvQAWrAAFR2YMAA/Nl3wABUhwAABMAATP1dwAD8dAFgvMkBasAAVKlgwAD82XdgwABt8gE/CAgBwABt9YAAwDQArwgBwABt9oEAwDQAxggBwABt94IAwDQA4ggBwABt+IMAwDQA/ggBwABt+YQAwDQBGggBwABt+oUAwDQBNggBwABt+4YAwDQBUgkBwABTocAA/TIAAAAABgbAAG39gTnAAFS0wABUvMAAWA8EAcAATQIAAAABA8AAVNzAAFgPAAAAAQEBwABU6AAAAINEYMAAXSoAAGDAAG3yAT4KPRzAAFT9gMAAVPbANAIJgpQBAAFqwABVA2DAAP22wAE1iwDAAF0sTsAAVRzAAFUpAACWNmDAAGC7ARzAAFUygMAAVSvANAIJwABD6AAAAADAAF1rTsAAVVHAAFVqAADAAEztYMAA+goBHMAAVXOAwABVbMA0Agmu7AAAAADAAF04TsAAVYjAAFWbAADAAEzvYMAA+goBHMAAVaSAwABVncA0Agmu7AAAAADAAF04TsAAVbnAAFXCAADAAEgiYMAA+goBHMAAVcuAwABVxMA0Agmu7AAAAADAAF04TsAAVeDAAFXoAADAAEz3YMAA+goBHMAAVfGAwABV6sA0Agmu7AAAAADAAF04TsAAVgXAAFYYAADAAEz1YMAA+9ABHMAAViGAwABWGsA0Agmu7gAAAADAAF06TsAAVkjAAFZfAADAAEz4XcAA/HQBYLzJARzAAFZwgMAAVmnANAIJru8BAWC8yQABrukpwABdYz0cwABWqIDAAFahwDQCCYKMAQABasAAVqxgwAD9tsABNYsAwABdLUrAAFa2AR/AAFbBwABuBgcAAAeWNoHAAFbqwDQCScAATO2CwABXGsA0AnbAAEzvg8AAV1DANAKjwABIIoTAAFd2wDQC0MAATPeFwABXkcA0Av3AAEz1hsAAV7bANAMqwABM/YfAAFf0wDQDVwbAAG3/gTnAAFgUwABYGcAAWZgAAK7PAAAAAQPAAFgowABZmAAAAAEBAcAAWDIAAACEO2DAAFzbAABcAT4JPRzAAFhDgMAAWD7ANARKgpQBAAFqwABYSWDAAP22wAE1iwDAAFzgPRzAAFhYgMAAWFPANARKwABDxgEAARbAAFhsLpY2wABt9QDAAF0YPRzAAFiEgMAAWH/ANARKrvMBAAEWwABYji7AAEztwABt9gDAAFzlPRzAAFiygMAAWK3ANARKrvMBAAEWwABYvC7AAEzvwABt9wDAAFzlPRzAAFjagMAAWNXANARKrvMBAAEWwABY5C7AAEgiwABt+ADAAFzlPRzAAFj4gMAAWPPANARKrvMBAAEWwABZAi7AAEz3wABt+QDAAFzlPRzAAFkVgMAAWRDANARKrvQBAAEWwABZJC7AAEz1wABt+gDAAFznPRzAAFlCgMAAWT3ANARKrvcCAAEWwABZTy7AAEz9wABt+wGXqynAAF0QPRzAAFmMgMAAWYfANARKgowBAAFqwABZkGDAAP22wAE1iwDAAFzhBsAAbgKBOcAAWfrAAFoDwABaLQEAwABM/AAAAAEDwABaCsAAWi0AAAAAAAAAYMAA+goBSsAAWg0BIhzAAFoaFsAAWg0uljbAAG31SAEAASsAwAD9KQAhFsAAWiYuwABM98AAbfkGwABuA4E5wABaMsAAWjvAAFqQAQDAAEzsAAAAAQPAAFpRwABakAAAAAAAAABgwAD6CgFKwABaWgEiIhbAAFpaLsAATO/AAG33ABbAAFpwLsAASCLAAG34ACEcwABaiRbAAFp8LpY2wABt9UgBAAErAMAA/SkGwABuBIE5wABalcAAWqfAAFrgAQDAAEzOAAAAAQPAAFq1wABa4AAAAAAAAABgwABguwFKwABauAEjFsAAWrguwABM78AAbfcWwABazS6WNsAAbfUrAWDAAGC7BsAAbgCBOcAAWuXAAFr4wABcUwAAIwFqwABa5mDAAP0cAgAAAQPAAFsAwABcUwAAAAAAAABgwAD9tgFKwABbDAEkABMnwABNAzUAAAABAGDAAGC7ARbAAFsuLpY2wABt9SMcwABbPIAAwDQHP0gBAAErAAArHMAAWzyAAMA0Bz+vjwAAAADAAGDcAWDAAP22J4CnJ8AATQQWwABbcy7AAEztwABt9ieApyfAAE0FFsAAW6kuwABM78AAbfcnwABNBhbAAFvGLsAASCLAAG34J4CnJ8AATQcWwABb4S7AAEz3wABt+SfAAE0IFsAAW/0uwABM9cAAbfongKcnwABNCRbAAFwxLsAATP3AAG37J4MhAAA0Ad0ANAQgADQFwAA0BiUANAaaADQG9QA0CAYAAAAGAAABgTkANAgpADPT9wAz3bQAM96KADPfsgAz4PsAM+KPADPmIgAz/38ANAgnAAAACAA0CCkAAAAAAAAAwABuBwCBOgAAAQEAAFoOAAAAAAECwABuCIE6KzGBKgPAAE0KAAABYMAA/RwAAV3AAP2EAV3AAPx0AWDAAPvQAQTAAG4KgTp9gIMYgZMAYICLAAEFwABuD4E6gIiAiICsAAAAA4CfgKwAAAABAQGApQAABIGTYICLAABgwABuCAE/AggBwABuCoAAwDQI0QkBgIjAAP0yAAAAAAIGwABuDIE6gLGAwoDyAABWAWqAsmDAAP0cAgAAAQOAxYDyAAAAAQEBgNAAACASXcAA/HQBYMAA+9AAAFwBPgE9HIDjFoDcLoGTwABuCoKKAQABgIDpwDQJJgCAjQbAAG4NgTqA94EIgSgAAIKIAWqA+GDAAP0cAgAAAQOBDYEoAAAAAAAAAFwBPgE9HIEdFoEWLoGTwABuCoKIAAAAAICOAAA0CP4ANAlaADQJngAAAAIAAAGBOgA0CbEANAh3ADQJrwAAAAEANAmxAAAAAAAAAMAAbhDAAE0LgTsAAA2BAwAAgi6CBgCBLAAApDAAAIFFAAC4LwABAQKxi7LEgZEAAMAAYIgAAIG0AAC1hgAAgeYAAKThAACCDQAAvJAAAIIxAADAAH/TAACCUgAAwACb/QAAgmwAAMAAa2IAAIKUAACA+wAAgq4AAMAAXNUAAILcAADAAGgKAAAAAAAEAsAAbhSBO4L8gwKUFAPAAE0MAAABYMAA/RwAABgEwABuF4E7gyGDJwmXFsAAbhAAYMAA+9AABMAAbhiBO4M4gzwJgL0AYMAA/bYABMAAbhmBO4NLg1sJwABNDQBgwAD6CgAEwABuGoE7g2qDdwnAAE0OAGDAAPoKAATAAG4bgTuDhoOSCcAATQ8AYMAA+goABMAAbhyBO4TthTsGt+gAYMAAbhQBaoUEYMAAbhTAAOnuBMAAbh2BO4W8hgwGt+kAYMAAbhQBaoXUYMAAbhTAAOoUBMAAbh6BO4YvhqAGt+oAYMAAbhQBaoZEYMAAbhTAAOo6BMAAbh+BO4bDhvsGt+sAYMAAbhQBaobbYMAAbhTAAOpgBMAAbiCBO4esiA4Gt+wAYMAAbhQBaoe9YMAAbhTAAOqGBMAAbiGBO4lKib0Gt+0AYMAAbhQBaolgYMAAbhTAAOqtBMAAbiKBO4rWi0kGt+4AYMAAbhQBaorsYMAAbhTAAOrUBMAAbiOBO4tsi88GwABNEABgwABuFAFqi3xgwABuFMAA6vsEwABuJIE7i/KMVQbAAE0RAGDAAG4UAWqMAmDAAG4UwADrIgTAAG4lgTuMeIzoBsAATRIAYMAAbhQBaoyLYMAAbhTAAOtJBMAAbiaBO40LjXwGwABNEwBgwABuFAFqjR5gwABuFMAA63AEwABuJ4E7jZ+OGAbAAE0UAGDAAG4UAWqNtmDAAG4UwADrlwTAAG4ogTuOO460BsAASrsAYMAAbhQBao5SYMAAbhTAAOvABMAAbimBO47Xj04GwABNFQBgwABuFAFqju1gwABuFMAA6+kEwABuKoE7j3GP6AbAAE0WAGDAAG4UAWqPh2DAAG4UwADsEATAAG4rgTuQEZEZBikAXcAA/HQBYMAAbhQBapAaXcAA/HQBYMAAbhTAAOw2BMAAbiyBO5FYkckGwABNFwBdwAD8pQJgwABuFF3AAP1nAWDAAG4UAWqRYl3AAPylAmDAAG4UXcAA/WcBYMAAbhTAATYXBMAAbi2BO5IHk4sGwABNGABdwAD8pQJgwABuFF3AAP1nAWDAAG4UAWqSEl3AAPylAmDAAG4UXcAA/WcBYMAAbhTAATivBMAAbi6BO5PJlBIGwABNGQBdwAD8pQJgwABuFF3AAP1nAWDAAG4UAWqT1F3AAPylAmDAAG4UXcAA/WcBYMAAbhTAATjhAQXAAG4ygTuDl4OdhCwBAAADg62ELAAAAAUCAoOzAAAElxZgwAD70ACDwAAABIC9YMAA/bYAA4PSAAAEwABNDWDAAPoKAWqD5GDAAPoKAIP2AAAEwABNDmDAAPoKAWqEBWDAAPoKAIQXAAAEwABND2DAAPoKAWqEJWDAAPoKAGDAAG4UAT8GCAHAAG4XgADANA4BCAHAAG4YgQDANA4OCAHAAG4ZggDANA4cCAHAAG4agwDANA40CAHAAG4bhADANA5MCQGDncAA/TIAAAAAAQbAAG4wgTuEMYQ5hIIBACcAAAABA4Q/hIIAAAAAAAAAYMAA+9ABPgJAHIRTFoRMLpcWwABuEMAAbhdIAQABHIRdaoRWXcAA/HQBYMAAbhTAAOw2gLsBAAEuAMAA/IkAwAD884RMhGoASoRxARaEeC6XFsAAbhDAAG4XAAA0DrUANA8vAAAAAQLAAG4zgTupNKlDtHIHwABNGgAAAWDAAP0cAAABBMAAbjaBO6lDAASWQsAAbhAAWwExAFsBGgDAAG44ABEGwABuOIE7qZSpnKokBEGuzgAAAAEDqb6qJAAAAAICAqnaAAAAemCBFACp7gAAAINEYMAAXSoAAGDAAG4zAT01AAAAAIJtWwEaAMAAblQTAAAGwABuOoE7qlyqYap/AAKuzwAAAAEDqnCqfwAAAAEBAap6AAAAhDtgwABc2wAAXAAGwABuO4E7qtuq4KsFAALAAE0bAAAAAQOq8KsFAAAAAQEBqv4AAACCZmC8twAAYMAA+goABsAAbjyBO6uDq4irqAACwABNHAAAAAEDq5OrqAAAAAEBAauhAAAAgmZgvLcAAGDAAPoKAAbAAG49gTusKKwtrE4AAsAATR0AAAABA6w5rE4AAAABAQGsRwAAAIJmYLy3AABgwAD6CgAGwABuPoE7rK6ss6zXAALAAE0eAAAAAQOswqzXAAAAAQEBrNAAAACCZmC8twAAYMAA+goABsAAbj+BO600rTmtWgACwABM4QAAAAEDrUWtWgAAAAEBAa1TAAAAgmZgvLcAAGDAAPoKAAbAAG5AgTutoK2lrcUAAsAATR8AAAABA62wrcUAAAABAQGtvgAAAIJmYLy3AABgwAD6CgAGwABuQYE7rhCuFa46AALAAE0gAAAAAQOuJa46AAAAAQEBrjMAAACCZmC8twAAYMAA+goABsAAbkKBO666rr+u7wACtwgAAAABA67Oru8AAAABAQGu1AAAAIGmYQFgvMxcAABcAAbAAG5DgTuvca92r6cAArcKAAAAAQOvhq+nAAAAAQEBr4wAAACBpmEBYLzMXAAAXAAGwABuRIE7sAWwCrA6AAK3QwAAAAEDsBmwOgAAAAEBAbAfAAAAgaZhAWC8zFwAAFwABsAAbkWBO7CdsKKw1wACt0QAAAABA7C2sNcAAAABAQGwvAAAAIGmYQFgvMxcAABcAAbAAG5GgTuxbbF5saUAArMiAAAAAQOxkLGlAAAAAQEBsZ4AAACCZmC8twAAYIFnAAbAAG5HgTuyNLJAsnMAArMgAAAAAQOyXrJzAAAAAQEBsmwAAACCZmC8twAAYIFnAAbAAG5IgTuzb7N7s6cAAsAATSEAAAABA7OSs6cAAAABAQGzoAAAAIJmYLy3AABggWcABsAAbkmBO7Q1tEG0cAACsx4AAAABA7RbtHAAAAABAQG0aQAAAIJmYLy3AABggWcAAAA0D3kANA/KADQP+gA0EC4ANBBiADQQlgA0EMoANBD+ADQRMgA0EWYANBGXADQRyAA0EfkANBIqADQSWgA0EooANBK8ADQS7AAAABECwABuSoE7tHW0e8AATNADwABNIgAAAWDAAP0cAAFgwABuMwYEwABuTIE7tSi1QAaD5wBgwAD9tgFqtS5gwAD9tsABOQAEwABuToE7tVe1cwnAAE0kwABuEABggWcABMAAbk+BO7WJtawJwABNJcAAbhAAYIFnAATAAG5QgTu1wrXeCcAATSbAAG4QAGCBZwAEwABuUYE7tfS2EwnAAE0nwABuEABggWcABMAAblKBO7ZKtlsJt8oAXcAA/KUCYLy3XcAAaAsBYMAAbhQAAQXAAG5pgTu2YLZguBMAAAADtnO4EwAAAAICAraEAAAAemCBFAC2kgAABLfKXcAA/KUCYLy3XcAAaAsBYMAAbhQAAGDAAG5KAT8GCAHAAG5SgQDANBQsCADAAG5OFrbZgLbRwDQUIoL+gUgIAMAAbk8Wtz2AtzXANBQigv+BSQgAwABuUBa3lYC3jcA0FCKDAIFKCADAAG5RFrf1gLftwDQUIoMBgUsJAbZgwAD9MgAAAAASBsAAblSBO7gYuCC5nAQBrs4AAAABA7hGuZwAAAACAgK4XgAAAHpggRQAuHIAAACDRGDAAF0qAABgwABuSgE+BD0cuIeBuIDANBTkgpQBAAFquI1gwAD9tsABOQAAwABdLE64xLjWAAC3yl3AAPylAmC8t13AAGgLAWDAAG4UARy454G44MA0FOSzlwECYLy3XcAAaAsBYMAAbhQBNLkCA7kCuUIAAAABAQG5EAAAAIJmYLy3AABdwABoCwFgwABuFAFKuRsBH7kfwABoPQEBYMAAbhQBHLk4gbkxwDQU5LB9AAAAAMAAXTkAAMAAXWQ9HLlQgblJwDQU5IKMAQABarlUYMAA/bbAATkAAMAAXS1KuV4BH7lpwABuaQIAAoC5fcA0FNqCuYbANBUcAAbAAG5WgTu5obmyuo8AAK7PAWq5omDAAP0cAgAAAQO5wbqPAAAAAQEBucsAAACEO2DAAFzbAABcAT4DPRy53IC518A0FhCClAEAAWq54mDAAP22wAE5AADAAFzgPRy58YC57MA0FhCznwIBXcAAaAsBYMAAbhQCFroALrfKwABuUjS6GwO6G7p3AAAAAgICuikAAACCZmC8twC6SwAAAJceXcAAaAsBYMAAbhQAAGDAAPzZAT4BPRy6XYC6WMA0FhCwgwEAARa6aoK6ZsA0FoGAlsAAaBUAwABc5gDAAF0RPRy6g4C6fsA0FhCCjAEAAWq6h2DAAP22wAE5AADAAFzhBsAAbliBO7qUupm7TQAAwABNKMAAbhAAAAABA7qju00AAAACAgK6sQAAAIJmYLy3ALrKAAAAhKpgwABuFAAAYMAA+goBPgJOuva6+gAAlx5dwABoCwFgwABuFAEcuw0Wuvwut8rAAG5SSwEAAYC7DsA0Fw4AwAD8uUq7GwEiIRy7JoK7IsA0FzBIAQABKwDAAGgoABy7NYK7McA0FzCDFwEAAYG7PsA0FxkAwABoJAbAAG5ZgTu7Urtju8QAAMAATRsBartTYMAA/RwCAAABA7tzu8QAAAABAQG7gQAAAIJmYLy3AABgwAD6CgFKu5IBHLuSLsAATSjAAG4QAgACgLudwDQXwmq7tmDAAG4UwADq1ADAAG5YBsAAblqBO7vJu9q8MQAAwABNHAFqu8pgwAD9HAIAAAEDu+W8MQAAAAEBAbvzAAAAgmZgvLcAAGDAAPoKAUq8BAEcvAQuwABNKMAAbhACAAKAvA/ANBgqarwoYMAAbhTAAOnuAMAAblgGwABuW4E7vDa8R7ygAADAAE0dAWq8N2DAAP0cAgAAAQO8U7ygAAAAAQEBvGEAAACCZmC8twAAYMAA+goBSrxyARy8ci7AAE0owABuEAIAAoC8fcA0GJJqvJZgwABuFMAA6hQAwABuWAbAAG5cgTu8pby2vRUAAMAATR4BarymYMAA/RwCAAABA7zFvRUAAAABAQG80wAAAIJmYLy3AABgwAD6CgFKvOQBHLzkLsAATSjAAG4QAgACgLzvwDQY+mq9CGDAAG4UwADqOgDAAG5YBsAAbl2BO70avSu9hAAAwABM4QFqvRtgwAD9HAIAAAEDvTe9hAAAAAEBAb1FAAAAgmZgvLcAAGDAAPoKAUq9VgEcvVYuwABNKMAAbhACAAKAvWHANBliar16YMAAbhTAAOpgAMAAblgGwABuXoE7vYm9mr3xAADAAE0fAWq9imDAAP0cAgAAAQO9pb3xAAAAAQEBvbMAAACCZmC8twAAYMAA+goBSr3EARy9xC7AAE0owABuEAIAAoC9z8A0GcpqvehgwABuFMAA6oYAwABuWAbAAG5fgTu99r4HvmgAAMAATSABar33YMAA/RwCAAABA74XvmgAAAABAQG+JQAAAIJmYLy3AABgwAD6CgFKvjYBHL42LsAATSjAAG4QAgACgL5BwDQaMmq+WmDAAG4UwADqrQDAAG5YBsAAbmCBO75tvn6/aQAAtwgBar5uYMAA/RwCAAABA76Nv2kAAAABAQG+kwAAAIGmYQFgvMxcAABcAT4BPRy+0Ba+tS63ysAAblKD+AEAATS+2AO+2L9kAAAAAgICvuYAAACCZmC8twC/CAAAAJceXcAAaAsBYMAAbhQAAGDAAPzZAT4BSb8VHL8dgr8ZwDQa14MXAQABar83YMAAbhTAAOnuAMAAaCQ+AT0cv02Av0zANBqYIAEAASa/TgGBv07ANBrMYLzMAAA/AMAA/MQGwABuYYE7v26/f8AAQGwAALcKAWq/b2DAAP0cAgAAAQO/j8AAQGwAAAABAQG/lQAAAIGmYQFgvMxcAABcAT4BPRy/0ha/ty63ysAAblKD+AEAATS/2gO/2sAAQGcAAAACAgK/6AAAAIJmYLy3AMAAQAoAAACXHl3AAGgLAWDAAG4UAABgwAD82QE+AUnAAEAXHMAAQB+CwABAG8A0G6uDFwEAAWrAAEA5YMAAbhTAAOoUAMAAaCQ+AT0cwABAUIDAAEBPwDQbaiABAAEmwABAUQGBwABAUcA0G6BgvMwAAD8AwAD8xAbAAG5igTvAAEBxwABAgsAAQW0AALdDAWrAAEByYMAA/RwCAAABA8AAQJHAAEFtAAAAAQEBwABAlwAAAIGmYQFgvMxcAABcAT4BPRzAAEDUFsAAQLkut8rAAG5Sg/gBAAE0wABA3APAAEDcwABBaAAAAAICAsAAQOoAAACCZmC8twDAAEEMAAAAlx5dwABoCwFgwABuFAAAYMAA/NkBPgFJwABBGRzAAEEhgsAAQR3ANBylgxcBAAFqwABBO2DAAG4UwADqhgDAAGgkPgE9HMAAQVGAwABBUMA0HFggAQABJsAAQVIBgcAAQVLANByYYLzMAAA/AMAA/MQGwABuY4E7wABBcsAAQYPAAEJ4AAC3RAFqwABBc2DAAP0cAgAAAQPAAEGXwABCeAAAAAEBAcAAQZ0AAACBpmEBYLzMXAAAXAE+AT0cwABB2hbAAEG/LrfKwABuUoP4AQABNMAAQeIDwABB4sAAQnMAAAACAgLAAEHwAAAAgmZgvLcAwABCEgAAAJceXcAAaAsBYMAAbhQAAGDAAPzZAT4BScAAQh8cwABCJ4LAAEIjwDQdn4MXAQABasAAQkFgwABuFMAA6q0AwABoJD4BPRzAAEJcgMAAQlvANB1SIAEAASbAAEJdAYHAAEJdwDQdkmC8zAAAPwDAAPzEBsAAbmSBO8AAQn3AAEKVwABFRAAAsyIBasAAQn5gwAD9HAIAAAEDwABCrMAARUQAAAABAQHAAEK6AAAAgmZgvLcAAGCBZwE+AknAAELIIRzAAELTgMAAQszANB5MSAEAASsAwAD9KT4CTsAAQv7AAEMKAACEY13AAGgLAWDAAG4UARzAAEMdFsAAQwwut8rAAG5SSwEAAYDAAEMewDQeTADAAPy5ScAAQy0hHMAAQz2BwABDMcA0HoFIAQABKwDAAGgoPgFJwABDUBzAAENggcAAQ1TANB6BgxcBAAFqwABDemDAAG4UwADrSQDAAGgkPgFKwABDkwFqwABDpmCBZ4MFScAAQ74cwABDzoHAAEPCwDQegYMXAQABasAAQ+hgwABuFMAA63AAwABoJD4BSsAARAEBasAARBRggWeDEEnAAEQsHMAARDyBwABEMMA0HoGDFwEAAWrAAERWYMAAbhTAAOuXAMAAaCQ+AUrAAERzAWrAAESGYIFngwVJwABEnhzAAESugcAARKLANB6BgxcBAAFqwABEyGDAAG4UwADrwADAAGgkPgFKwABE5QFqwABE+GCBZ4MQPz8/SsAARR0BFsAARSQuwABNJMAAbhDAAG5OBsAAbmWBO8AARUnAAEVhwABIHAAAsyABasAARUpgwAD9HAIAAAEDwABFf8AASBwAAAABAQHAAEWNAAAAgmZgvLcAAGCBZwE+AknAAEWbIRzAAEWmgMAARZ/ANCAgSAEAASsAwAD9KT4CTsAARdHAAEXdAACEY13AAGgLAWDAAG4UARzAAEXwFsAARd8ut8rAAG5SSwEAAYDAAEXxwDQgIADAAPy5ScAARgAhHMAARhCBwABGBMA0IFVIAQABKwDAAGgoPgFJwABGIxzAAEYzgcAARifANCBVgxcBAAFqwABGTWDAAG4UwADrSQDAAGgkPgFKwABGZgFqwABGeWCBZ4MFScAARpEcwABGoYHAAEaVwDQgVYMXAQABasAARrtgwABuFMAA63AAwABoJD4BSsAARtQBasAARudggWeDEEnAAEb/HMAARw+BwABHA8A0IFWDFwEAAWrAAEcpYMAAbhTAAOvpAMAAaCQ+AUrAAEdFAWrAAEdYYIFngwVJwABHcBzAAEeAgcAAR3TANCBVgxcBAAFqwABHmmDAAG4UwADsEADAAGgkPgFKwABHtgFqwABHyWCBZ4MQPz8/SsAAR+4BFsAAR/UuwABNJcAAbhDAAG5PBsAAbmaBO8AASCHAAEg5wABK5gAAwABNIQFqwABIImDAAP0cAgAAAQPAAEhQwABK5gAAAAEBAcAASF4AAACCZmC8twAAYIFnAT4CScAASGwhHMAASHeAwABIcMA0IfZIAQABKwDAAP0pPgJOwABIosAASK4AAIRjXcAAaAsBYMAAbhQBHMAASMEWwABIsC63ysAAblJLAQABgMAASMLANCH2AMAA/LlJwABI0SEcwABI4YHAAEjVwDQiK0gBAAErAMAAaCg+AUnAAEj0HMAASQSBwABI+MA0IiuDFwEAAWrAAEkeYMAAbhTAAOtJAMAAaCQ+AUrAAEk3AWrAAElKYIFngwVJwABJYhzAAElygcAASWbANCIrgxcBAAFqwABJjGDAAG4UwADrcADAAGgkPgFKwABJpQFqwABJuGCBZ4MQScAASdAcwABJ4IHAAEnUwDQiK4MXAQABasAASfpgwABuFMAA6+kAwABoJD4BSsAAShYBasAASilggWeDBUnAAEpBHMAASlGBwABKRcA0IiuDFwEAAWrAAEprYMAAbhTAAOwQAMAAaCQ+AUrAAEqHAWrAAEqaYIFngxA/Pz9KwABKvwEWwABKxi7AAE0mwABuEMAAblAGwABuZ4E7wABK68AASwPAAEzOAACzHgFqwABK7GDAAP0cAgAAAQPAAEsdwABMzgAAAAEBAcAASysAAACCZmC8twAAYIFnAT4CScAASzkhHMAAS0SAwABLPcA0I8pIAQABKwDAAP0pPgJOwABLb8AAS3sAAIRjXcAAaAsBYMAAbhQBHMAAS44WwABLfS63ysAAblJLAQABgMAAS4/ANCPKAMAA/LlJwABLniEcwABLroHAAEuiwDQj/0gBAAErAMAAaCg+AUnAAEvBHMAAS9GBwABLxcA0I/+DFwEAAWrAAEvrYMAAbhTAAOr7AMAAaCQ+AUrAAEwBAWrAAEwUYIFngwVJwABMLBzAAEw8gcAATDDANCP/gxcBAAFqwABMVmDAAG4UwADrIgDAAGgkPgFKwABMbAFqwABMf2CBZ4MQPz8/SsAATKQBFsAATKsuwABNJ8AAbhDAAG5RAAA0FLoANBXnADQW6AA0F5cANBf/ADQYZwA0GM8ANBk3ADQZnwA0GgcANBpvADQbPQA0HCMANB0dADQeFwA0H+sANCG/ADQjlQA0JO8AAAASAsAAbmqBO8AATNPAAEzZwABOcwPAAE0pAAABYMAA/RwAAAEEwABubIE7wABNIcAATTcYt8oAXcAA/KUCYLy3XcAAaAsBYMAAbhQBMsAATTVgvLddwABoCwFgwABuFAABBcAAbnEAAAAABAAAAwAAAAAAAAAAAGDAAG5qAT8BCQEAwAD9MgAAAAACBsAAbm6BO8AATTzAAE1BwABN+QAAt94AAAABA8AATVrAAE35AAAAAgICwABNbwAAAIJmYLy3AMAATZEAAACEY13AAGgLAWDAAG4UAABcAT4BScAATaQWwABNtIHAAE2owDQmAYOywABoFz4BPRzAAE3ZFsAATcgut8rAAG5sgL8CAAKAwABN2sA0JfSBwABN5MA0JgEAwAD8uj8GwABub4E7wABN/sAATg7AAE5xAACCiAAAAAEDwABOE8AATnEAAAABAQHAAE4kAAAAemCBFAAAYMAAbjMBPgFKwABOMwEfwABOPsAAbmkCAAKAwABOUsA0Jo8WwABOWy63ysAAbmwAAAA0JcoANCZlADQmzAAAAAIAAgbAAG4SgTuUF5QymYAAAcAATSoAAAABA5RNmYAAAAADAwOUYwAAALL7YLkUAJSLAAAApOVguv0AlLAAAACWIGC8twAAXcAA/HQBYMAAgAABPgNOlNiU5AAAhGNdwAD8dAFgwACAAAExlOZgwACAAABGlOwAlP8AAADAAEzOYMAAYLsAHJUpgZUWwDQnDLLLAQABgpU7wDQnFwC7BUE+BUmVSyEWlV6ElVDANCdTwABFg8AAYMlClXMAP06VmpWgAACAlmDAAGIMASaVmgGElaLANCdTYMAAYgxOlcGVxQAAmcJgvKUBFpXSFpXNhZXHwDQnmoKQwABhhJYgwABieEAhHJXqhpXmwDQnuUgBAAErAMAA/SmV5pXxAEmWFRyWHYaWGcA0J7lIAQABFpYvgJYgwDQnAbGSuRsAwAD9KT4BPRyWVoOWSsA0JzJWAQABapZgYMAAgADAATkFAMAA/IVJlo4clpaGlpLANCe5SAEAARaWqICWmcA0JwGxk7kcAMAA/Sk+AT0cltCDlsTANCcyVgEAAWqW2mDAAIAAwAE5GQDAAPyFSZcJHJcRhpcNwDQnuUgBAAEWlyOAlxTANCcBnEK5GADAAP0pPghOl0aXUAAAqS9gwABguwEcl2gWl2KFl1zANCeahIPAAGIOSwEAARaXeICXacA0JwGxjrkZAMAA/LlJl5UiHJejh5eZwDQorEgBAAErAMAA/SkBIRaXuYeXr8A0KKy1G8AAYMVCl8MAP06X2pffAACAvWDAAP22ARaYBCaX7ACHl+LANCisYMAAYXGdb8AAYXNOmB6YJQAAgyRgwAD9tgEnwABNK0mYOSEcmEMUmD7ANCkUCACB1gEAARSYTsA0KTwJAADAAP3IQphXAD9OmG6YdQAAn6RgwAD9tgEcmHwUmHfANCkUCACAvgEAARaYjRSYhsA0KTwJAGHAAP26AMAA/cxOmKuYuAAAwABNLGDAAGC7ARyY0BaYyoWYxMA0J5qEg8AAYg5LAQABFpjggJjRwDQnAbGPuRoAwAD8uT0cmQyDmQDANCcyVgEAAR+ZH8AAgAkCAAEUmTTANCl4CgABwABNLSEWmVYUmUnANCmuCwCsacAAYL4AwAD8hT9KmWwBg5lzwDQnMgbAAG4TgTuZg5mdqTEAAcAATS4AAAABA5m1qTEAAAAEBASZywAAAHpggRQAmesAAACkumC1hwCaAwAAAIJmYINZAJoqAAAAt9xdwAD8dAFgwACAAAAAXcAAaAsBYMAAbhQBPgdOml6aagAAhGNdwABoCwFgwABuFAEfmnDAAGg8AAFgwABuFAAATpqUmpgAAICsYMAA/jcBFpqyFpqhgpqawDQqaoSlg2KEd4KNTprEmt8AAMAATS9gwAD6CgEiIhaa74Ca58A0KlWCyIFCARybBhaa/4Wa+8A0Kr2BusAA/j1IAQABJ4doAMAA/cUBHpsTwABraAEAAYWbJcA0Kr0ARpsum2abSAAAABJgwACAAACDm1DANCp1PgVOm3ObeAAAgL1gwAD9tgEWm3+Hm3rANCs5gL3AAIAFTpuQm5cAAJ+kYMAA/bYBFpueh5uZwDQrOZ+kwACAAk6br5u1AACetWDAAPoKASpBRpvCm/+b2AAAAISqYMAAbhQAapv3XcAA/HQBYMAAbhTAAOw2PgFJnAccnBsWnBYUnAvANCuiCwCAvcAAbhhIAQABFJwewDQrbgkAAMAA/cU+Bz0VnDDANCuNCik9HJxShJxGwDQqmFYBAAEUnFbANCuiCwAAwABoHEmcbBacdYeccMA0KznAAE0twACAAz4BPRycloGcjcA0Kl+ulAMAAx6cuMAAnAIBAAGCnNbANCpqAGqc+WCk5MAAu/oynRBbWwEngbAknUwDJ8AATTAUnSTANCtPCAAnwABNMQC1jz9JnWIWnXEUnWbANCuiCwDAAE0NwABuGT4BSZ2PIiElnZqCnZPANCpqYIPlACElnbWCna7ANCpqYIOkPgE9HJ3ggZ3XwDQqX66UAwADHp4EwACcAgEAAYKeIsA0KmoAap43YKTkwAC7+jKeQFtbASeBsCQABCfAAE0wFJ5jwDQrTwgAJ8AATTInwABNMwC1jz8/SZ7pFp74FJ7twDQrogsAwABNDsAAbho+AUmfEyElnx6CnxfANCpqYIN3PgE9HJ9DgZ86wDQqX66UAwADHp9nwACcAgEAAYKfhcA0KmoAap+aYKTkwAC7+jKfo1tbASeBsCQABCfAAE0wFJ/GwDQrTwgAJ8AATTInwABNNAC1jz8/SaA6IhagSRSgPsA0K6ILAMAATQ/AAG4bACGGoFrANCrhPgE9HKCLgaCCwDQqX66UAwADHqCtwACcAgEAAYKgy8A0KmoAaqDuYKTkwAC7+jKhBVtbASeBsCShPAMnwABNNRShNcA0K08IACeIfAC1jz9CoVIAP0mhayEUoXDANCuNCgA+AT0coYiBoX/ANCpfrpQDAAMeoabAAJwCAQABgqHEwDQqagBqoeNgpOTAALv6MqH2W1sBJ4GwJKIoAyfAAE02FKIhwDQrTwgAJ4h8ALWPP06iaqJ9AADAAE03XcAA/KUCYMAAbhRdwABoCwFgwABuFAEyon9gwABuFF3AAGgLAWDAAG4UAEaihaLeopsAAACEqmDAAG4UAByiu4Sir8A0KpiDzAEAAWqi1V3AAPx0AWDAAG4UwADsNgDAAGglPgZOovqjAgAAwABNF13AAP1nAWDAAG4UARyjHGqjFV3AAPylAmDAAG4UXcAA/WcBYMAAbhTAATYXSwEAARSjHcA0Lp0IAADAAPy5SaMuIRyjOhSjMsA0LtMJAEgBAAErAMAA/Sk+AUajS6Nzo2EAAACD1mDAAG4UABSjasA0LtMJAD4BSaN9HKONhKOBwDQqmIMXAQABFKOWwDQvPAoAAMAAaCQ+AT0co7OBo6rANCpfrpUDAAMeo9TAAJwCAQABgqPywDQqagBqpAdgpOTAALv6MqQQW1sBJ4GwJAAGJ8AATTgWpEUUpDrANC6dCACAvcAAbhgnwABNOSfAAE04FqSBFKR7wDQvPAoAgL3AAG4YJ5ROALWTPz9OpMuk1AAAwABNGF3AAP1nAWDAAG4UARyk72qk513AAPylAmDAAG4UXcAA/WcBYMAAbhTAATivSwEAARSk8MA0Lp0IAADAAPy5SaUBIRylDhSlBcA0L+oKAEgBAAErAMAA/Sk+AUalH6VIpTUAAACD1mDAAG4UABSlPsA0L+oKAD4BSaVSIhylYoSlVsA0KpiDFwEAARSla8A0MFMLAADAAGgkACE1AAAAAQBgwAD6CgE1AAAAAQBdwABoCwFgwABuFAEcpZWHpYPANC5jSwEAARSllsA0MFMLAADAAPy5IxylnhQAwDQwmwwASAEAASsAACscpZ4UAMA0MJsMAIMXAQABFKWnwDQunQgAAMAAaCQBYMAA+gojHKWzFADANDCPDABIAQABKwAAKhQAwDQwjwwAAWDAAPoKPgI9HKXTgaXKwDQqX66UAwADHqX1wACcAgEAAYKmE8A0KmoAaqYoYKTkwAC7+jKmMVtbASeBsCQABifAAE04FqZmFKZbwDQunQgAgL3AAG4YJ8AATTonwABNOxamsBSmqsA0MFMLAIC9wABuGCeUTgC1jz0cpwU1AAAAAQBdwAD8pQJgwABuFF3AAGgLAWDAAG4UAYem08A0LmM1AAAAAQBgwABuFAEUpubANC6dCAA1AAAAAQBdwABoCwFgwABuFAEcpuUUpuXANDGaDABLAQABFKblwDQxvg0AAMAA/LkjHKbyFADANDHTDgBIAQABKwDAAGgoNQAAAAEAXcAAaAsBYMAAbhQBH6b6wABoPAABYMAAbhQAADUAAAABAFwBHKblFKblwDQxmgwAgL8CAAIUpuXANDG+DQAUAMA0MhkPAADAAPy6FADANDIZDwAUAMA0MdMOAAFdwABoCwFgwABuFFYBAAEUpwnANDBTCwAAwABoHD8/TqdDp0wAAMAATRldwAD9ZwFgwABuFAEcp2dqp19dwAD8pQJgwABuFF3AAP1nAWDAAG4UwAE44UsBAAEUp2jANC6dCAAAwAD8uUmneSEcp4YUp33ANDKaCwBIAQABKwDAAP0pPgFGp5enwKetAAAAg9ZgwABuFAAUp7bANDKaCwA+AUmnyiEcp9uEp8/ANCqYgxcBAAEUp+TANDMDDAAAwABoJD4BPRyoAYGn+MA0Kl+ulAMAAx6oI8AAnAIBAAGCqEHANCpqAGqoVmCk5MAAu/oyqF9bWwEngbAkAAYnwABNOBaolBSoicA0Lp0IAIC9wABuGCfAAE08J8AATT0WqOcUqOHANDMDDACAvcAAbhgnlE4AtY8/P0qpHQGEqSTANCqYAYE7ADQzvAA0ClsANA88ADQTOQA0JUAANCbdAAAABAA0Jt8ANCozADQzvAAAAAIAAADAAG5yAIE8AAAIgNoAAMAAz9XAAEZ0AID3AACkMAAAgRAAAMAAYIgAAIEzAAC8kAAAgVcAAMAAfF0AAIF6AADAAFzVAACBqAAAwABoCgAAgccAAMAAaJYAAAAAAsAAbnSBPMAAU8jAAE0+AABeAAICAmC8t13AAGgLAWDAAG7qAAFXwABudABcAALAAFPoAAAAgmZgvLcAwABUAwAAALSiXcAAaAsBYMAAbuoAAMAAbnWBPMAAWWPAAE0/AABeAAICAmC8pV3AAGgLAWDAAG8PAAFXwABudQBcAALAAFmBAAAAmcJgvKUAwABZmAAAALSiXcAAaAsBYMAAbw8AAA4CwABudoE8geaB9YTaB8AATUAAAQAAgnZgwAD9HAFbAWDAAP0cAAABBMAAbnmBPIIbgiYJwABNQcAAbnIAXcAAaAsBXwAAAAIFwABugoE8giuCK4JRAL+rAAOCP4JRAAAAAQEBgkUAAATAAE1BXcAAaAsBXwAAAABdwABudgFfAAABPwIIAcAAbnmAAMA0NVEJAYIrwAD9MgAAAAAFwABug4E8glaCVoK2AAAAA4JjgrYAAAAAAAAAXcAAbnYBXwAAAT4BPRyCnhaCki7AAE1BwABucsAAbnmApQEAARaCpS7AAE1CwABucsAAbn0AwABoHQIIAMAAbnkfgn/AAGg8AAFfAAAAAAkBglbAAP0yAAAAAAQGwABufIE8gvmDCIM2AQDAAE1DwABucgAAAAEDgxSDNgAAAAAAAABdwABoCwFfAAABSoMXARyDJBaDFy7AAE1CwABucsAAbn3AAErLAQABFoMqLsAATUHAAG5ywABueQDAAGgiBsAAbn2BPIM7g0qDVgECwABNQsAAbnIAAAABA4NWg1YAAAAAAAAAXcAAaAsBXwAAAAbAAG5+gTyDi4OUg7QBALtSAAAAAQODm4O0AAAAAAAAAGDAAPoKAUqDngEWg6oWg54uwABNQ8AAbnLAAG58g7LAAGgXBsAAboCBPIQKhA+E2AAAwABNRAAAAAEDhBuE2AAAAAEBAYQtAAAgg9ZdwABudgFfAAAAAGDAAPoKAT4CSYQ6HoQ+wAD1sQIAAi6AhE7ANDb8AEqEVgEpP0qEZwEiHISBFoR7FoRuLsAATULAAG5ywABufYCWwABoFUgBAAEWhJcWhIqAhITANDb8wABNQsAAbnLAAG59gJbAAGgVAMAA/PMAHIS6FoS0FoSoLsAATUHAAG5ywABueYCWwABoFUgBAAEWhM8WhMOAhL3ANDb8wABNQcAAbnLAAG55gJbAAGgVAMAA/PMAADQ2AQA0NmUANDaWADQ22gA0N8AAAAAEAsAAboSBPIUnhTamKwfAAE1FAAABXcAAbnYBYMAAbuoAAAIEwABuhoE8hiCGQQbAAE1GAF3AAGgLAWDAAG83AWqGMV3AAGg/AWDAAG83wAE5LQTAAG6HgTyGWYZfCaQQAGC8twACBcAAbqiBPIZkhmSGjwCVSQADhniGjwAAAAEBAYZ+AAAEpBBgvLcAAGDAAG6EAT8CCAHAAG6HgADANDhbCQCGiMAAboMAAAAABcAAbqmBPIaUhpSG8wC/qwADhqaG8wAAAAICAoasAAAEpBBgvLcAhscAAADAAE1HXcAAaAsBYMAAbuoAAGDAAG6EAT8CCAHAAG6HgADANDijCQCG4cAAboIBAAGBhujANDiuABsGwABuiYE8hviHAJIJBAEAAAAAAQOHC5IJAAAAAgEBhxkAAACCZmC8twABhy8AAAC7TGDAAG9LAWoAYMAA/Nl3YMAAboQBPgVPh6yHvAAAAcAATUhhAV3AAGgLAWDAAG83XcAAaAsBYMAAbzcAA4fUihUAAAABAQGH5QAAAJ6tXcAAaAsBYMAAbzcAAF3AAGgLAWDAAG83AT4CSYf3IRyIBIOH+8A0OWRIAQABKwDAAGgoPgJJiBcWiCSDiBvANDlkgVXAAGgWSogtAWqINF3AAGgLAWDAAG83wAE5LT9KiEYBHIhWg4hNwDQ5ZJ6rAAAAAMAAaCc/SYhtIiIWiHiAiHHANDkLh3q8ugEWiI2AiIbANDkLhBm8uwEWiKCAiJnANDkLh3m8vT4BSoj+AR6JCcAAaBMBAWDAAG83ATGJHGDAAG83AWqJJGDAAG83wAE5QwBJiUEWiUyAiUXANDkLhPy8vD4BSoloAR6Jc8AAaBMBAWDAAG83AWqJjV3AAPx0AWDAAG83wAE5VwA+AkAlibuAibTANDkLYMAAfQuJtInKASSJ6AInmmuAieHANDkLSonzAR+J/sAAaDwAAWDAAG83AABPipaKpgAAAcAATUphAF3AAGgLAWDAAG83AAOKuosCAAAAAAAAAF3AAGgLAWDAAG83AT4BSorFARyK5IKKzMA0OTcgAQABNQAAAAEAYMAAb0sBgYrlwDQ5FyMcivaEAMA0OvhIAQABKwAAKxaK9oQAwDQ6+LttwABvTgFdwABoCwFgwABvNwAAT4uFi5UAAAHAAE1LYQBdwABoCwFgwABvNwADi6qL8wAAAAAAAABdwABoCwFgwABvNwE+AUqLtQEci9SCi7zANDk3IAEAATUAAAABAGDAAG9LAYGL1cA0ORcjHIvmhQDANDuASAEAASsAACsWi+aFAMA0O4C7cMAAb08BXcAAaAsBYMAAbzcAAE+MgIyQAAABwABNTGEAXcAAaAsBYMAAbzcAA4ymjPAAAAAAAAAAXcAAaAsBYMAAbzcBPgFKjLEBHIzQgoy4wDQ5NyABAAE1AAAAAQBgwABvSwGBjNHANDkXIxyM4oYAwDQ8CEgBAAErAAArFozihgDANDwIu3TAAG9QAV3AAGgLAWDAAG83AABJjPcWjQKAjPvANDkLh3a8vj4BSY0TFo0egI0XwDQ5C6s+vMI+AUqNNgEfjUHAAG7UBAABJo1MAYCNTMA0OQtgvMkDwABNTRyNhIONcMA0OrQgAAAAAADAAE1OHI26hI2lwDQ7PCAAAAAAAMAATU8cjfKFjdzANDvEIAAAAAAAPgFKjg4BH44ZwABu1AQAASaOJAGAjiTANDkLYLzJA8AATU0cjlyDjkjANDq0IAAAAAAAwABNTmqOfV3AAGgLAWDAAG83wAE5LcAATU8cjruFjqXANDvEIAAAAAAASY7TFo7egI7XwDQ5C4UtvMA+AUqO8AEfjvvAAG66BAABgI8JwDQ5CwPAAE1NHI8/g48rwDQ6tCAAAAAAAMAATU5qj15dwABoCwFgwABvN8ABOS3AAE1PHI+ahY+EwDQ7xCAAAAAAAEmPqhaPtYCPrsA0OQuFL7zBPgFKj8cBH4/SwABuugQAAYCP4MA0OQsDwABNTWqQAl3AAGgLAWDAAG83wAE5LcAATU4ckDyEkCfANDs8IAAAAAAAwABNT2qQXF3AAGgLAWDAAG83wAE5LUmQchaQfYCQdsA0OQuHeby9PgFKkJQBH5CfwABu6QMAASaQqwGAkKvANDkLYLzMAsAATU1qkM1dwABoCwFgwABvN8ABOS3AAE1PHJD/hZDpwDQ7xCAAAAAAAD4CQCWRJYCRHsA0OQtgvMyRHpE2AR6RQrWnAgACgJFLwDQ5CySRbwInmmuAkWjANDkLAEqReQEfkYTAAG7pAwABJpGQAYCRkMA0OQtgvMwCwABNTRyRxoORssA0OrQgAAAAAADAAE1PHJH8hZHmwDQ7xCAAAAAAAAbAAG6LgTySPZJGklUBAMAATVAAAAABA5JOklUAAAAAAAAAYMAA+goBSpJRASkGwABujIE8kpCSrJLEAQDAAEznAAAAAQOSvZLEAAAAAAAAAF3AAPwyAWDAAGC7AUqSwAErBsAAbo2BPJNUk12TeAEAu2kAAAABA5Nlk3gAAAAAAAAAYMAA+goBSpNoARaTbhaTaC67bcAAbo+DssAAaBcGwABujoE8k96T8pQaAQDAAE1NAAAAAQOUAZQaAAAAAAAAAF3AAGgLAWDAAG83AUqUBAFqlApdwABoPwFgwABvN8ABOS0GwABuj4E8lFmUbZSMAQC7bQAAAAEDlHOUjAAAAAAAAABdwABoCwFgwABvNwFKlHYBapR8XcAAaD8BYMAAbzfAATktBsAAbpCBPJTHlNCU7QEAwABM7gAAAAEDlNmU7QAAAAAAAABgwAD6CgFKlNwBFpTjFpTcLrtwwABukoOywABoFwbAAG6RgTyVVJVolZEBAMAATU4AAAABA5V4lZEAAAAAAAAAXcAAaAsBYMAAbzcBSpV7AWqVgV3AAGg/AWDAAG83wAE5LQbAAG6SgTyV0ZXllgUBALtwAAAAAQOV7JYFAAAAAAAAAF3AAGgLAWDAAG83AUqV7wFqlfVdwABoPwFgwABvN8ABOS0GwABuk4E8luKW65cKAQDAAE1RAAAAAQOW9ZcKAAAAAAAAAGDAAPoKAUqW+AEWlwAWlvguu3TAAG6Vg7LAAGgXBsAAbpSBPJd2l4qXtAEAwABNTwAAAAEDl5uXtAAAAAAAAABdwABoCwFgwABvNwFKl54BapekXcAAaD8BYMAAbzfAATktBsAAbpWBPJf5mA2YLgEAu3QAAAABA5gVmC4AAAAAAAAAXcAAaAsBYMAAbzcBSpgYAWqYHl3AAGg/AWDAAG83wAE5LQbAAG6WgTyY5Zj8mRUBAMAATOoAAAABA5kOmRUAAAAAAAAAYLzzAUqZEQErBsAAbpeBPJmDmYyaAAEAu64AAAABA5mhmgAAAAAAAAAAYMAA+goBSpmqASIiFpmqLrsvwABumAEWmcsuuzHAAG6ZARaZ6i67M8AAbpoGwABumIE8ml2aZpq2AQC7LwAAAAEDmn6atgAAAAAAAABgwAD6CgFKmocBHJqYFpqHLsAATU/AAG6UgxcBAAFqmqhgwABvN8AA8U0AwABoJAbAAG6ZgTybB5sQm1wBALsxAAAAAQObJptcAAAAAAAAAGDAAPoKAUqbLwEcmz4Wmy8uwABNTcAAbo6DFwEAAWqbTmDAAG83wADxTQDAAGgkBsAAbpqBPJuum7ecBQEAuzMAAAABA5vOnAUAAAAAAAAAYMAA+goBSpvXARyb5xab1y7AAE1OwABukYMXAQABapv3YMAAbzfAAPFNAMAAaCQGwABun4E8nNOc5pz/AACpPQAAAAEDnOqc/wAAAAAAAABdwABoCwFgwABu6gFKnPABapz7XcAAaAsBYMAAburAATlqBsAAbqCBPJ3dnfCeJwAAu0QAAAABA538nicAAAABAQGeCwAAAIX/YMAAYLsAAF3AAGgLAWDAAG7qAUqeGAFqniNdwABoCwFgwABu6sABOWoGwABuoYE8nvefCp87AACeawAAAAEDnw6fOwAAAAEBAZ8fAAAAwABNUl3AAGgLAWDAAG83AABdwABoCwFgwABu6gFKnywBap83XcAAaAsBYMAAburAATlqBsAAbqKBPJ+mn7mf6wAAgooAAAABA5++n+sAAAABAQGfzwAAAMAATVJdwABoCwFgwABvNwAAXcAAaAsBYMAAbuoBSp/cAWqf513AAGgLAWDAAG7qwAE5agbAAG6jgTyg9KEHoWgAALstAAAAAQOhDaFoAAAAAgICoSkAAADAAE1SXcAAaAsBYMAAbzcAoUEAAAC0aWDAAGiXAABdwABoCwFgwABu6gFKoVkBaqFkXcAAaAsBYMAAburAATlqBsAAbpyBPKFtoZChtgEAwABNQsAAbnIBaqFuYMAA/RwCAAABA6GdobYAAAAAAAAAXcAAaAsBYMAAbuoBSqGgAWqhq13AAGgLAWDAAG7qwAE5ewbAAG6dgTyhu6HPoeoBAIPBAWqhvGDAAP0cAgAAAQOh2KHqAAAAAAAAAGDAAPvQAUqh2wEWoeIWodsupBDAAG6Hg8HAAP0vBsAAbqSBPKHvogmilAMASAFqofBgwAD9HAIAAAEDoguilAAAAAEBAaIMAAAAg9ZbAABgwAD6CgE+A0miGR6iHcAA9bECAAIugKItwDRFUQBKojUBKT9JokYhJaJQgKJKwDRFUWDAAG6ESqJhASo/SqJzARyigRaiei6kEMAAbodIAQABFqKKgKKEwDRFUaQQAADAAP0pBsAAbqWBPKKZoqWirAACnqsAAAABA6KqoqwAAAAAAAAAYMAAboQABsAAbqaBPKKxoramKQAAuUAAAAABA6LApikAAAABAQGizQAAAIPWYMAAboQAAGDAAPoKAT4CQByi6Bai4S6kEMAAbodIAQABFqLxgKLrwDRGBqQQwABuhwDAAP0pouGi9wBKov4BIiIiIiIiIiIiIiIiIiIiIhyjDRajBS7AAE1QwABui0gBAAEWoxaAoxDANEYGwABNUMAAbosAwAD9KQAcozEWoykuu2nAAG6NSAEAARajOoCjNMA0Rga7acAAbo0AwAD9KQAco1cWo00uwABNUcAAbpNIAQABFqNggKNawDRGBsAATVHAAG6TAMAA/SkAHKN+FqN1LsAATO7AAG6QSAEAARajh4CjgcA0RgbAAEzuwABukADAAP0pAByjsRajmy67McAAbplIAQABFqO6gKO0wDRGBrsxwABumQDAAP0pAByj8haj2y67M8AAbppIAQABFqP7gKP1wDRGBrszwABumgDAAP0pABykNRakHS67L8AAbphIAQABFqQ+gKQ4wDRGBrsvwABumADAAP0pABykdhakYS67rsAAbpdIAQABFqR/gKR5wDRGBruuwABulwDAAP0pABykqxakny7AAE1BwABucsAAbnlIAQABFqS0gKSuwDRGBsAATUHAAG5ywABueQDAAGgoAByk1xakyy7AAE1DwABucsAAbnxIAQABFqTggKTawDRGBsAATUPAAG5ywABufADAAGgoAByk/Rak9y67bcAAbo9IAQABFqUGgKUAwDRGBrttwABujwDAAGgoABylHhalFy67cMAAbpJIAQABFqUngKUhwDRGBrtwwABukgDAAGgoABylQRalOS67dMAAbpVIAQABFqVKgKVEwDRGBrt0wABulQDAAGgoABylbBalXS7AAE1NwABujkgBAAEWpXWApW/ANEYGwABNTcAAbo4AwABoKAAcpZ8WpY8uwABNTsAAbpFIAQABFqWogKWiwDRGBsAATU7AAG6RAMAAaCgAHKXUFqXDLsAATU/AAG6USAEAARal3YCl18A0RgbAAE1PwABulADAAGgoABymCxal+S7AAEzqwABulkgBAAEWphSApg7ANEYGwABM6sAAbpYAvP8AADQ47AA0PscAND71ADQ/KQA0P2cAND+sADQ/7wA0QC8ANEB0ADRAtwA0QPcANEE8ADRBfwA0QasANEH4ADRCSAA0QpgANELoADRDKwA0Q3sANEPTADREKwA0RJAANETiADRFKQA0Rb8ANEXmADRJJAAAABsCwABuqoE8pmCmZrMfA8AATVMAAAFgwABuhAAABgTAAG6sgTymrqa8CcAATU0BaqaNYMAA/RwCXcAAaAsBYMAAbzcABMAAbq2BPKbjpvIJwABNTgFqpsJgwAD9HAJdwABoCwFgwABvNwAEwABuroE8pxmnKQnAAE1PAWqm+GDAAP0cAl3AAGgLAWDAAG83AATAAG6vgTynUKdVCbttAWqnL2DAAP0cAl3AAGgLAWDAAG83AATAAG6wgTynfKeCCbtwAWqnW2DAAP0cAl3AAGgLAWDAAG83AATAAG6xgTynqaewCbt0AWqniGDAAP0cAl3AAGgLAWDAAG83AAIFwABuuYE8p7WntamQAL+rAAOnyamQAAAACAICp9cAAACCZmC8twCn8gAAAMAATUddwABoCwFgwABu6gAGqAoAAATAAE1NXcAAaAsBYMAAbzcBagBgwAD82XeoJQAABMAATU5dwABoCwFgwABvNwFqAGDAAPzZd6hBAAAEwABNT13AAGgLAWDAAG83AWoAYMAA/Nl3qF4AAAS7bV3AAGgLAWDAAG83AWoAYMAA/Nl3qHAAAAS7cF3AAGgLAWDAAG83AWoAYMAA/Nl3qIMAAAS7dF3AAGgLAWDAAG83AWoAYMAA/Nl3YMAAbqoB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U13AAPx0AWDAAG83wAE5VwDAAGglJ4CnJ8AATVgcsXUWsW4uu3DAAG6wg8wBAAFqsYVdwAD8dAFgwABvN8ABOVcAwABoJSeApyfAAE1ZHLGpFrGhLrt0wABusYPMAQABarG5XcAA/HQBYMAAbzfAATlXAMAAaCUngKcnwABNWhyx6xax3C7AAE1NwABurIPMAQABarH7XcAA/HQBYMAAbzfAATlXAMAAaCUngKcnwABNWxyyLxayHy7AAE1OwABurYPMAQABarI/XcAA/HQBYMAAbzfAATlXAMAAaCUngKcnwABNXByydRayZC7AAE1PwABuroPMAQABarKFXcAA/HQBYMAAbzfAATlXAMAAaCUngKcnwABNXRyysBaypC7AAE1BwABucsAAbnmDzAEAAWqyw13AAPx0AWDAAG7qwADm5gDAAGglJ4CnJ8AATV41AAAAAQBdwAD8MgFgwABguwEWsuguwABM58AAbowjHLL6gADANFPYSAEAASsAACscsvqAAMA0U9iAqwEBYMAA/bYBNLL+A7L+sxkAAAABAQGy/wAAAID1YMAAYLsAAGDAAP22AUqzBQEcsweBswXANFQor48AAAAAwABg3ADAAPw9AV3AAPwyAWDAAP22J4MhAAA0TekANE7fADRP1wA0UR0ANFInADRUaAAAAAUCwABuu4E8s0mzT8AAQrADwABNXwAAAWDAAG6EAAAIBMAAbr2BPLODs4oYwABNUAFqs3NgwAD9HAJgwAD6CgAEwABuvoE8s7GzvwnAAE1NAWqzkGDAAP0cAl3AAGgLAWDAAG83AATAAG6/gTyz5rP1CcAATU4BarPFYMAA/RwCXcAAaAsBYMAAbzcABMAAbsCBPLQctCwJwABNTwFqs/tgwAD9HAJdwABoCwFgwABvNwAEwABuwYE8tFO0WAm7bQFqtDJgwAD9HAJdwABoCwFgwABvNwAEwABuwoE8tH+0hgm7dAFqtF5gwAD9HAJdwABoCwFgwABvNwAEwABuw4E8tK20swm7cAFqtIxgwAD9HAJdwABoCwFgwABvNwAEwABuxYE8tMy03RjAAE1gwABucgBdwAD8dAFgwABguwErAgXAAG7TgTy04rTitssAv6sAA7TztssAAAAJAgK1AAAAAISOYLzJALUaAAAAwABNR13AAGgLAWDAAG7qAAe1MgAABMAATU1d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AE1NXcAAaAsBYMAAbzcBagBgwAD82XfAAESJAAAEu21dwABoCwFgwABvNwFqAGDAAPzZd8AARJUAAATAAE1PXcAAaAsBYMAAbzcBagBgwAD82XfAAESsAAAEu3RdwABoCwFgwABvNwFqAGDAAPzZd2DAAG7VAT8KCAHAAG7bgQDANGPrCAHAAG7XgwDANGQUCAHAAG7ZhADANGQzCAHAAG7YhQDANGRQCAHAAG7ahgDANGRvDABAIRzAAETUg8AARMXANGQUSAEAASsAwABoKMAARMXAAETbAAwAQCEcwABE/oXAAETtwDRkUEgBAAErAMAAaCjAAETtwABFBQAMAEAhHMAARR2EwABFF8A0ZDNIAQABKwDAAGgowABFF8AARSQADABAIRzAAEU+hsAARTbANGRvSAEAASsAwABoKMAARTbAAEVFAAkAwABFVsAAbqkCAAKAwABFXcA0Y96CwABFZ8A0Y/wABcAAbumBPMAARXfAAEV3wABGzAAAAAPAAEWCwABGzAAAAAMBAcAARZIAAACCamC8zAACwABFqAAABMAATU1dwABoCwFgwABvNwFqAGDAAPzZd8AARb0AAATAAE1PXcAAaAsBYMAAbzcBagBgwAD82XdgwABu1QE/CAgBwABu14EAwDRltwgBwABu2IIAwDRl1ggAwABu2R/AAEXkwABoPAABYMAAbzcAAAgAwABu2h/AAEYFwABoPAABYMAAbzcAAAgAwABu2x/AAEYtwABvNQEAARbAAEZFgMAARjzANGWptFu8zwAMAEAhHMAARniBwABGacA0ZbdIAQABKwDAAGgowABGacAARn8ADABAIRzAAEaigsAARpHANGXWSAEAASsAwABoKMAARpHAAEapAAkAwABGusAAbqgBAAGAwABGw8A0ZakACAbAAG7dgTzAAEbRwABG5sAARyEBAMAATVEBasAARtJgwAD9HAIAAAEDwABG8MAARyEAAAAAAAAAYMAA+goBSsAARvMBIhbAAEb7FsAARvMuu3TAAG7ag7LAAGgXABbAAEcYFsAARwkuwABNZMAAbtvAAE1RwABvMQbAAG7fgTzAAEcmwABHScAAR6gBAMAATULAAG5yAWrAAEcnYMAA/RwCAAABA8AAR1bAAEeoAAAAAAAAAF3AAGgLAWDAAG7qAUrAAEdfASMWwABHZhbAAEdfLqQQwABuh4T8vLxqwABHhF3AAGgLAWDAAG7qwAE5jGrAAEeeXcAAaAsBYMAAburAATmdAV3AAGgLAWDAAG7qBsAAbuOBPMAAR63AAEfMwABKwgAAnmsBasAAR65gwAD9HAIAAAEDwABH0MAASsIAAAABAQHAAEfhAAAAwABNUl3AAGgLAWDAAG83AABdwABoCwFgwABu6gE+Bk7AAEf2wABIBwAAwABNZWDAAPoKARbAAEgJLsAATVHAAG7dTsAASB3AAEgsAADAAE1UYMAA+goBFsAASC4uu2nAAG6NPRzAAEhBFsAASDsuu23AAG7ZgKUBAAEcwABIVxbAAEhILsAATU3AAG7XlvcBAAGAwABIYcA0aBEAwABoHwDAAGgdPRzAAEh5FsAASHEuu3TAAG7agKUBAAEcwABIkRbAAEiALsAATU/AAG7YlvcBAAFqwABIpF3AAGgLAWDAAG83wADvdwDAAGgfAMAAaB09HMAASMgWwABIuS7AAE1kwABu28AATWYAAAAAwABvLUnAAEjYgcAASNzANGg4PgJJwABI9oLAAEj6wDRoWz4BSsAASRQBasAASSZdwABoCwFgwABu6sABOWo/SsAASToBHMAASU0WwABJQS7AAE1BwABucsAAbnmW9wEAASMWwABJXhbAAElXLqQQwABuh4T8vLxqwABJhl3AAGgLAWDAAG7qwAE5r2rAAEm1XcAAaAsBYMAAburAATnAAV3AAGgLAWDAAG7qAMAAaB9JwABJ2ILAAEncwDRoWz4BSsAASfQBHMAASgcWwABJ+y7AAE1BwABucsAAbnmW9wEAAWrAAEocXcAAaAsBYMAAburAATl7AMAAaB8+AUrAAEo9ARzAAEpQFsAASkQuwABNQcAAbnLAAG55lvcBAAEjFsAASmEWwABKWi6kEMAAboeE/Ly8asAASoldwABoCwFgwABu6sABOYxqwABKrV3AAGgLAWDAAG7qwAE5nQFdwABoCwFgwABu6gDAAGgfBsAAbuSBPMAASsfAAErmwABMagAAuy0BasAASshgwAD9HAIAAAEDwABK7MAATGoAAAACAgLAAEsEAAAAwABNUl3AAGgLAWDAAG83AMAASxwAAAC0aWDAAGiXAABdwABoCwFgwABu6gE+BE7AAEs2wABLRwAAwABNZWDAAPoKARbAAEtJLsAATVHAAG7dPRzAAEtnFsAAS1guwABNZMAAbtu7LQEAAYHAAEtuwDRq4ADAAG8sPRzAAEuKFsAAS4Iuu3TAAG7agKUBAAEcwABLohbAAEuRLsAATU/AAG7YlvcBAAGAwABLrMA0askAwABoHwDAAGgdScAAS7yCwABLwMA0av8+AUrAAEvaAWrAAEvsXcAAaAsBYMAAburAATlqPgFKwABMBQEcwABMIxbAAEwMLsAATUHAAG5ywABueZb3AQABIxbAAEwtLrtpwABujWrAAExCXcAAaAsBYMAAburAATlqasAATFRdwABoCwFgwABu6sABOXsBXcAAaAsBYMAAbuoAwABoHwbAAG7ggTzAAExvwABMksAATMcBAMAATOoBasAATHBgwAD9HAIAAAEDwABMpMAATMcAAAAAAAAAYLzzAUrAAEynARbAAEy2FsAATKcuwABNZMAAbtvAAEzqwABvMwbAAG7hgTzAAEzMwABM4cAATYIBALsvAWrAAEzNYMAA/RwCAAABA8AATPnAAE2CAAAAAAAAAGDAAPoKAUrAAE0CASIcwABNExbAAE0CLsAATU/AAG7YgxcBAAFqwABNI2DAAG83wADxTQDAAGgkASIcwABNRBbAAE08Lrt0wABu2oMXAQABasAATVRgwABvN8AA8U0AwABoJAAhFsAATXYWwABNZy7AAE1kwABu28AATWfAAG8yBsAAbuWBPMAATYfAAE2fwABOsAAAnqsBasAATYhgwAD9HAIAAAEDwABNpMAATrAAAAAAAAAAYMAAboQBPgFKwABNrQEfwABNuMAAbugHAAMmwABN1AEWwABN1C6kEMAAbodgvMwcwABN6xbAAE3cLsAATWTAAG7bnqsAAAAAwABvLhzAAE4AFsAATfQuwABNQcAAbnLAAG55nqsAAAAAwABoJwS7bRzAAE4eFsAAThguu23AAG7ZnqsAAAAAwABoJ8AATU0cwABOThbAAE4/LsAATU3AAG7XnqsAAAAAwABoJ7t0HMAATnAWwABOaC67dMAAbtqeqwAAAADAAGgnwABNTxzAAE6kFsAATpMuwABNT8AAbtieqwAAAADAAGgnBsAAbuaBPMAATrXAAE7IwABQQAAAIwFqwABOtmDAAP0cAgAAAQPAAE7QwABQQAAAAAAAAABgwAD9tgFKwABO1gEkABUnwABNaBbAAE7kLqQQwABuhyeApyfAAE1XHMAATwIWwABO/C67bcAAbtmDzAEAAWrAAE8SXcAA/HQBYMAAbzfAATlXAMAAaCUngKcnwABNWRzAAE82FsAATy4uu3TAAG7ag8wBAAFqwABPRl3AAPx0AWDAAG83wAE5VwDAAGglJ4CnJ8AATWkWwABPaS7AAE1kwABu2yeApyfAAE1aHMAAT6IWwABPky7AAE1NwABu14PMAQABasAAT7JdwAD8dAFgwABvN8ABOVcAwABoJSeApyfAAE1cHMAAT+gWwABP1y7AAE1PwABu2IPMAQABasAAT/hdwAD8dAFgwABvN8ABOVcAwABoJSeApyfAAE1dHMAAUCMWwABQFy7AAE1BwABucsAAbnmDzAEAAWrAAFA2XcAA/HQBYMAAburAAObmAMAAaCUngyEAADRmzAA0Z0QANGfcADRqlAA0bB4ANGx7ADRtMQA0blEANG/cAAAACALAAG7qgTzAAFCMwABQkcAAUVcLwABNagAAAWDAAP0cAAAGBMAAbuyBPMAAUJHAAFCRCScAYMAA+9AABMAAbu6BPMAAUJHAAFCRCSjAAG5yAGDAAP22AATAAG7vgTzAAFCRwABQkQYpAF3AAPx0AWDAAG7qAWoAXcAA/HQBYMAAburAAObmBMAAbvCBPMAAUNrAAFDaBsAATWsAYMAAbuoBagBgwABu6sAA5qQEwABu8YE8wABRC8AAUQsGwABNbABgwABu6gFqAGDAAG7qwADmuwTAAG7ygTzAAFFFwABRRQbAAE1tAGDAAG7qAWoAYMAAburAAObSAQXAAG72gTzAAFCRwABQkcAAUVcBAAADwABQkcAAUVcAAAACAgLAAFCRAAAEJ2DAAPvQAMAAUJEAAAQoYMAA/bYAAGDAAG7qAT8DCADAAG7sgADANHEjCADAAG7ugQDANHExCQAAwAD9MgAAAAABBsAAbvSBPMAAUJHAAFCRwABRVwAAIwAAAAEDwABQkcAAUVcAAAAAAAAAYMAA/bYBSgABDwAuwABu7gAANHFsADRxpgAAAAECwABu94E8wABRhsAAUYzAAFO4A8AATW4AAAFgwAD9HAAABgTAAG75gTzAAFG7wABR4wbAAEjtAF3AAGgLAWDAAG7qAWrAAFHIXcAAaD8BYMAAburAATlqBMAAbvqBPMAAUgfAAFI8BsAATW8AXcAAaAsBYMAAbuoBasAAUiFdwABoPwFgwABu6sABOXsEwABu+4E8wABSYMAAUqEGwABNcABdwABoCwFgwABu6gFqwABShl3AAGg/AWDAAG7qwAE5rwTAAG78gTzAAFLFwABTBAbAAE1xAF3AAGgLAWDAAG7qAWrAAFLpXcAAaD8BYMAAburAATnABMAAbv2BPMAAUyjAAFNeBsAATXIAXcAAaAsBYMAAbuoBasAAU0NdwABoPwFgwABu6sABOYwEwABu/oE8wABTgsAAU7YGwABNcwBdwABoCwFgwABu6gFqwABTm13AAGg/AWDAAG7qwAE5nQEFwABvAAAAAAAEAAADAAAAAAAAAAAAYMAAbvcBPwEJAQDAAP0yAAAAAAAAADRzPwAAAAACwABvAYE8wABUk8AAVJnAAFdUA8AATXQAAAFdwABudgFgwABvDwAAAwTAAG8DgTzAAFTNwABU4xio9QBgwAD6CgEqBMAAbwSBPMAAVOzAAFUBGLWVAGDAAPoKASoEwABvBYE8wABVGMAAVRsJmcIAYLylAAEFwABvDoE8wABVIMAAVSDAAFU+AAAAA8AAVSrAAFU+AAAAAQEBwABVMAAABJnCYLylAABgwABvAQE/AggBwABvBYAAwDRz4gkAwABVN8AAboMAAAAABAbAAG8HgTzAAFVDwABVVcAAVf4AALCYAAAAAQPAAFVgwABV/gAAAAAAAABdwABoCwFgwABvDwE+A0nAAFVpFsAAVW0uqPXAAG8DPgFKwABVhQFqwABVll3AAGgLAWDAAG8PwAE50j89F8AAVaYuqPUpwABvA0rAAFXBARzAAFXUFsAAVcguwABNQcAAbnLAAG55lvcBAAFqwABV6F3AAGgLAWDAAG8PwAE54wDAAGgfBsAAbwiBPMAAVgPAAFYVwABWuQAAux0AAAABA8AAVh7AAFa5AAAAAAAAAF3AAGgLAWDAAG8PAT4DScAAVicWwABWKy61lcAAbwQ+AUrAAFZCAWrAAFZTXcAAaAsBYMAAbw/AATnSPz0XwABWYy61lSnAAG8ESsAAVn0BHMAAVpAWwABWhC7AAE1BwABucsAAbnmW9wEAAWrAAFakXcAAaAsBYMAAbw/AATn0AMAAaB8GwABvDIE8wABWvsAAVuDAAFb9AQDAAE1CwABucgFqwABWv2DAAP0cAgAAAQPAAFbtwABW/QAAAAAAAABdwABoCwFgwABvDwFKwABW8AFqwABW+l3AAGgLAWDAAG8PwAE6BQbAAG8JgTzAAFcCwABXFcAAV1IAACMBasAAVwNgwAD9HAIAAAEDwABXHcAAV1IAAAAAAAAAYMAA/bYBSsAAVyMBJMAAV1IDFsAAVyUumcLAAG8FJ4LmHMAAVzcWwABXKy7AAE1DwABucsAAbnyDzAEAAWrAAFdJXcAA/HQBYMAAbw/AAToWAMAAaCUAADR0EwA0dMMANHVzADR11QA0dmAAAAAEAsAAbw+BPMAAV53AAFeiwABXxwvAAE11AAABYMAA/RwAAAUEwABvEYE8wABXosAAV6IJJwBgwAD70AAEwABvE4E8wABXosAAV6IJKMAAbnIAYMAA/bYABMAAbxSBPMAAV6LAAFeiBikAXcAA/HQBYMAAbw8BagBdwAD8dAFgwABvD8ABOhYEwABvFYE8wABXrcAAV60GwABNdgBgwABvDwFqAGDAAG8PwADm/ATAAG8WgTzAAFe7wABXuwbAAE13AGDAAG8PAWoAYMAAbw/AAOcTAQXAAG8agTzAAFeiwABXosAAV8cBAAADwABXosAAV8cAAAACAgLAAFeiAAAEJ2DAAPvQAMAAV6IAAAQoYMAA/bYAAGDAAG8PAT8DCADAAG8RgADANHdxCADAAG8TgQDANHd/CQAAwAD9MgAAAAABBsAAbxiBPMAAV6LAAFeiwABXxwAAIwAAAAEDwABXosAAV8cAAAAAAAAAYMAA/bYBSgABDwAuwABvEwAANHe6ADR39AAAAAECwABvG4E8wABX9cAAV/vAAFlTA8AATXgAAAFgwAD9HAAABATAAG8dgTzAAFgowABYTwbAAEjtAF3AAGgLAWDAAG8PAWrAAFg1XcAAaD8BYMAAbw/AATnSBMAAbx6BPMAAWHLAAFisBsAATXkAXcAAaAsBYMAAbw8BasAAWJJdwABoPwFgwABvD8ABOeMEwABvH4E8wABYz8AAWQgGwABNegBdwABoCwFgwABvDwFqwABY7l3AAGg/AWDAAG8PwAE59ATAAG8ggTzAAFkrwABZUQawnABdwABoCwFgwABvDwFqwABZN13AAGg/AWDAAG8PwAE6BQEFwABvIgAAAAAEAAADAAAAAAAAAAAAYMAAbxsBPwEJAQDAAP0yAAAAAAAAADR5IQAAAAACwABvI4E8wABZ+MAAWf7AAGxbA8AATXsAAAFgwAD9HAAABQTAAG8mgTzAAFpvwABaggnAAE18wABucgBgvPMABMAAbyeBPMAAWtPAAFrdGMAATX3AAG5yAGDAAPoKAATAAG8ogTzAAFu0wABb0RjAAE1+wABucgBgwAD70AAEwABvKYE8wABcUcAAXG4YwABNf8AAbnIAYMAA+goABMAAbyqBPMAAXUXAAF1fGMAATYDAAG5yAF3AAP1nAWDAAP22AAIFwABvNYE8wABdZMAAXWTAAF87AAAAA8AAXXLAAF87AAAAAQEBwABdeAAABMAATXxgvPMAAGDAAG8jAT4EPRfAAF2TLsAATX3AAG5yKsAAbyc9F8AAXasuwABNf8AAbnIcwABd7hbAAF3fFsAAXcsuwABNfMAAbnLAAG8mhLi8+UgBAAGTAMAA/PPAAG8pPRfAAF34LsAATX7AAG5yIxzAAF5BFsAAXiwWwABeGC7AAE18wABucsAAbyaEurz3SAEAARbAAF5kFsAAXlAuwABNfMAAbnLAAG8mtGW89gDAAPzzK5MBYMAA+9DAAG8oScAAXpchFsAAXsAWwABesBbAAF6cLsAATXzAAG5ywABvJoS7vPiBVcAA/FY+AT0XwABe0S7AAE2AwABuch7AAF78wADA5AEBYMAA/bYBFsAAXyEWwABfDS7AAE18wABucsAAbyaEu7z4AMAAbyo/BggBwABvKisIAcAAbykrCAHAAG8oKwgBwABvJysIAcAAbyaAAMA0ehIJAcAAXWTAAP0yAAAAAAXAAG82gTzAAF9AwABfQMAAYPAAv6sAA8AAX1XAAGDwAAAABQEBwABfWwAABMAATXxgvPMABMAAX3wAAADAAE1RYMAA+goBagBgwAD82XfAAF+RAAAAwABNgWDAAPvQAWoAYMAA/Nl3wABfugAAAMAATYJgwAD6CgFqAGDAAPzZd8AAX+oAAADAAE2DXcAA/WcBYMAA/bYBagBgwAD82XdgwABvIwE/BggBwABvJoAAwDR7pwgAwABvJ4HAAGAbwDR7twgAwABvKILAAGBOwDR70AgAwABvKYPAAGCUwDR76QgAwABvKoTAAGDXwDR8AgkBwABfQMAA/TIAAAAABwbAAG8sgTzAAGD1wABg+sAAZdwAALstAAAAAQPAAGEAwABl3AAAAAEBAcAAYQ8AAAC0aWDAAGiXAABgwAD6CgE+B0nAAGEkFsAAYSguwABNZ8AAbzJKwABhNQEqPz0XwABhRy7AAE19wABucinAAG8nTsAAYWPAAGFrAACtkmDAAPoKASpJwABheCEcwABhmhbAAGF8LsAATX7AAG5ywABvKEgBAAErAMAA/PM+BE7AAGGvwABhzwAAwABNhGDAAPvQAR7AAGHRwADP8AIBYMAA+9ACFsAAYeUuwABNfsAAbnLAAG8oFsAAYhKAwABiBMA0fKq2+cAAaKMAPYnAAGIywDR88hzAAGI6gcAAYjLANHzygQYBAAEhHMAAYmeCwABiR8A0fS9IAQABFsAAYmouwABNfsAAbnLAAG8oAMAA/PMAwAD6Ez0XwABijy7AAE1+wABucoLAAGKvwDR9L8AAbyhJwABi1hzAAGL4FsAAYtouwABNfsAAbnLAAG8ogW0BAAEWwABjGRbAAGMFLsAATXzAAG5ywABvJoS6vPcAwAD9AD4BPRfAAGM5LsAATX7AAG5yK8AAbyg/P0nAAGNxIiEcwABjkBbAAGN1LsAATYDAAG5ywABvKkgBAAErAMAA/SkAFsAAY8AWwABjsYDAAGOjwDR8qqk7wABop4OywAD8Vz4ETsAAY9jAAGP2AADAAE2FYMAA+9ABFsAAZBMWwABj+C7AAE2AwABucsAAbyphwADMkD0cwABkPBbAAGQhLsAATYDAAG5ywABvKpb3AQABFsAAZFSAwABkRsA0fKqpO8AAaKcAwAD9eD2JwABka8A0fPIcwABkc4HAAGRrwDR88oEGAQABIRzAAGSegsAAZIDANH6HSAEAARbAAGS8FsAAZKEuwABNgMAAbnLAAG8qYcAAzJAAwAD88wDAAPoTScAAZMoWwABk6RbAAGTOLsAATYDAAG5ywABvKoFVwAD8Vj4BPRfAAGT8LsAATYDAAG5yK8AAbyo/P0nAAGUxIiEWwABlNi7AAE1/wABucsAAbykAHMAAZXcWwABlZYDAAGVXwDR8qpViwABon4CXAQABkwDAAPz/PgI9F8AAZYQuwABNf8AAbnIpwABvKT2JwABlsMA0fPIpP0rAAGXKAYHAAGXRwDR88gbAAG8xgTzAAGXhwABl6sAAZgEBAMAATVEAAAABA8AAZfTAAGYBAAAAAAAAAGDAAPoKAUrAAGX3ARbAAGX3LsAATX3AAG5ywABvJwbAAG8ygTzAAGYGwABmD8AAZrABAMAATWcAAAABA8AAZhvAAGawAAAAAAAAAGDAAPoKAUrAAGYkASIiIhbAAGYkLsAATX3AAG5ywABvJwAcwABmVhbAAGY4LsAATX7AAG5ywABvKEgBAAErAMAA/PMAHMAAZoIWwABmZy7AAE2AwABucsAAbypIAQABKwDAAP0pABbAAGaTLsAATX/AAG5ywABvKQbAAG8tgTzAAGa1wABmusAAZ1sAAMAATWYAAAABA8AAZsLAAGdbAAAAAAAAAFwBPgQ9F8AAZssuwABNfcAAbnIpwABvJz0XwABm4i7AAE1+wABucivAAG8oPRfAAGcMLsAATYDAAG5yK8AAbyo9F8AAZzMuwABNf8AAbnIpwABvKQbAAG8zgTzAAGdgwABnd8AAadQBAMAATOoAAAABA8AAZ4nAAGnUAAAAAAAAAGC88wE+A0nAAGePIRbAAGeULsAATX3AAG5ywABvJ0rAAGegASs/ScAAZ7EWwABntS7AAE1nwABvMkrAAGfCARbAAGfJLsAATXzAAG5ywABvJj9KwABn4gEfwABn7b0JBAAEFsAAaB0WwABoCS7AAE18wABucsAAbya0Zbz2NQAAAAEAYMAA+9ABFsAAaDkuwABNfsAAbnLAAG8oIxzAAGhXgADANIIISAEAASsAABbAAGh6FsAAaGYuwABNfMAAbnLAAG8mhLq894AAwDSCCAFgwAD70CMcwABosxbAAGiYLsAATYDAAG5ywABvKkgBAAErAMAA/SkWwABo3RbAAGjJLsAATXzAAG5ywABvJoS7vPgcwABpdxzAAGkwFsAAaQ8WwABo+y7AAE18wABucsAAbyaEu7z4gaUBAAE0wABpNgPAAGk2wABpZAAAAAEBAcAAaTcAAACDo2DAAP22AABgwAD6CgFKwABpPQEhHMAAaVkWwABpPi7AAE2AwABucsAAbyqDFwEAAYDAAGliwDSC2gDAAP1zAMAA/D6ArQAAAADAAPxIAV3AAPx0AWDAAP22IxbAAGmJLsAATX/AAG5ywABvKRbAAGm9FsAAaakuwABNfMAAbnLAAG8mhLi8+ZMBYMAA+9AABsAAby6BPMAAadnAAGnowABrIAAAnqsAAAABA8AAae3AAGsgAAAAAAAAAGDAAG8jAT4BSsAAafYBH8AAagHAAG82BQABFsAAahcuwABNfMAAbnLAAG8mBMAATVEWwABqPy7AAE19wABucsAAbyfAAE2BFsAAanEuwABNfsAAbnLAAG8owABNghbAAGq2LsAATX/AAG5ywABvKcAATYM1AAAAAQBdwAD9ZwFgwAD9tgEWwABq+C7AAE2AwABucsAAbyojHMAAaxSAAMA0hBFIAQABKwAAKxzAAGsUgADANIQRlRMAAAAAwAD9gQFdwAD9ZwFgwAD9tgbAAG8vgTzAAGslwABrOMAAbFkAACMBasAAayZgwAD9HAIAAAEDwABrQMAAbFkAAAAAAAAAYMAA/bYBPgFKwABrSQEkAA0nwABNhifAAE2HFsAAa3cuwABNfcAAbnLAAG8nJ4CnJ8AATYgWwABrrC7AAE1+wABucsAAbygngKcnwABNiRbAAGv0LsAATX/AAG5ywABvKSeApyfAAE2KFsAAbDkuwABNgMAAbnLAAG8qJ4MhAAA0fIAANH/sADSANwA0gNwANIFdADSDcgA0hGkANIUcAAAABwLAAG83gTzAAGzNwABs0sAAbZELwABNiwAAAWDAAP0cAAAGBMAAbzmBPMAAbNLAAGzSCScAYMAA+9AABMAAbzuBPMAAbNLAAGzSCSjAAG5yAGDAAP22AATAAG88gTzAAGzSwABs0gYpAF3AAPx0AWDAAG83AWoAXcAA/HQBYMAAbzfAATlXBMAAbz2BPMAAbQjAAG0IBsAATYwAYMAAbzcBagBgwABvN8ABOUMEwABvPoE8wABtRcAAbUUGwABNjQBgwABvNwFqAGDAAG83wADxTQTAAG8/gTzAAG2EwABthAbAAE2OAGDAAG83AWoAYMAAbzfAAPFkAQXAAG9DgTzAAGzSwABs0sAAbZEBAAADwABs0sAAbZEAAAACAgLAAGzSAAAEJ2DAAPvQAMAAbNIAAAQoYMAA/bYAAGDAAG83AT8DCADAAG85gADANIZfCADAAG87gQDANIZtCQAAwAD9MgAAAAABBsAAb0GBPMAAbNLAAGzSwABtkQAAIwAAAAEDwABs0sAAbZEAAAAAAAAAYMAA/bYBSgABDwAuwABvOwAANIaoADSG4gAAAAECwABvRIE8wABty8AAbdHAAG/IA8AATY8AAAFgwAD9HAAAAwTAAG9GgTzAAG4mwABuUwbAAE2MAF3AAGgLAWDAAG83AWrAAG47XcAAaD8BYMAAbzfAAO/NBMAAb0eBPMAAbt/AAG8NBsAATY0AXcAAaAsBYMAAbzcBasAAbvVdwABoPwFgwABvN8AA73cEwABvSIE8wABvmsAAb8YGwABNjgBdwABoCwFgwABvNwFqwABvrl3AAGg/AWDAAG83wADwPgEFwABvSgAAAAAEAAADAAAAAAAAAAAAYMAAb0QBPwEJAQDAAP0yAAAAAAAAADSH3AAAAAACwABvS4E8wABwE8AAcBnAAHMQA8AATZAAAAFgwAD9HAAABATAAG9NgTzAAHA+wABwUgaD5wBgwAD9tgFqwABwRGDAAP22wAE6JQTAAG9OgTzAAHBtwABwcgm7bQBdwABoCwFgwABvNwAEwABvT4E8wABwjMAAcJIJu3AAXcAAaAsBYMAAbzcABMAAb1CBPMAAcKzAAHCzCbt0AF3AAGgLAWDAAG83AAEFwABvVoE8wABwuMAAcLjAAHDrAAAAA8AAcMTAAHDrAAAAAwMDwABwygAABLttXcAAaAsBYMAAbzcAwABw1gAABLtwXcAAaAsBYMAAbzcAwABw4wAABLt0XcAAaAsBYMAAbzcAAGDAAG9LAT8ECAHAAG9OgADANIiyCAHAAG9PgQDANIjHCAHAAG9QggDANIjcCQHAAHC4wAD9MgAAAAACBsAAb1KBPMAAcPDAAHD4wAByVgQBrs4AAAABA8AAcRfAAHJWAAAAAQEBwABxIwAAAINEYMAAXSoAAGDAAG9LAT4GPRzAAHE4gMAAcTHANIlXgpQBAAFqwABxPmDAAP22wAE6JQDAAF0sTsAAcVjAAHFeAAC7bV3AAGgLAWDAAG83AR/AAHFkwABoTQEBYMAAbzcBHMAAcXmAwABxcsA0iVewfQAAAADAAF05AE7AAHGZwABxoAAAu3BdwABoCwFgwABvNwEfwABxpsAAaE0BAWDAAG83ARzAAHG7gMAAcbTANIlXsH0AAAAAwABdOQBOwABx28AAceMAALt0XcAAaAsBYMAAbzcBH8AAcenAAGhNAQFgwABvNwEcwABx/oDAAHH3wDSJV7B9AAAAAMAAXTkAPRzAAHIVgMAAcg7ANIlXgowBAAFqwAByGWDAAP22wAE6JQDAAF0tSsAAciMBH8AAci7AAG9WAwADgcAAcjvANImXgsAAckLANInag8AAckrANIodAAbAAG9UgTzAAHJbwAByYMAAcw4AAK7PAAAAAQPAAHJvwABzDgAAAAEBAcAAcnkAAACEO2DAAFzbAABcAT4FPRzAAHKKgMAAcoXANIregpQBAAFqwABykGDAAP22wAE6JQDAAFzgPRzAAHKfgMAAcprANIresIMBAAEWwAByrhbAAHKoLrttwABvToCWwABoFQDAAFzmPRzAAHK/gMAAcrrANIresIMBAAEWwAByzxbAAHLILrtwwABvT4CWwABoFQDAAFzmPRzAAHLggMAActvANIresIMBAAEWwABy8RbAAHLpLrt0wABvUICWwABoFQDAAFzmPRzAAHMCgMAAcv3ANIregowBAAFqwABzBmDAAP22wAE6JQDAAFzhAAA0iS0ANIq0ADSL0AAAAAIAAAGBPAA0i+MANDTtADQ32QA0SZkANFSFADRizQA0cAUANHGzADRzSAA0dnkANHgBADR5KgA0hUEANIbvADSH5QA0i+EAAAAOADSL4wAAAAAAAADAAG9XwABNkYE9AAAJgPIAALgvAACBFAAAvJAAAIE4AADAAGhlAACBWQAAwABiSgAAgXoAAMAAb/IAAIGbAADAAGotAAEBAbDMgdkAAMAATQsAAQEDu+ukl7t5ghUAAMAASzYAAQEBpJOCOwAAwABnUAABAQKuya7KAAAACALAAG9YgT2EVYRkiIwHwABNkgAAAWDAAP0cAAAAAQXAAG9dAAAAAAQAAAMAAAAAAAAAAABgwABvWAE/AQkBAMAA/TIAAAAAAgbAAG9agT2GL4Y0hnIAArVVAAAAAQOGOoZyAAAAAwMDhkgAAACWIGC8twCGVgAAAIC9YMAAaGYAhmwAAAi1UWDAAE0MAABgwAD6CgAGwABvW4E9iEKIR4iKAAK1PAAAAAEDiGCIigAAAAICAohqAAAApN5gwABLSACIhAAACLVRYMAATQwAAGDAAPoKAAAANIz6ADSNRgA0jYcAAAACAsAAb16BPYjLiNqJ4Ae1WAAAAWDAAG9YAAAAAQXAAG9iAAAAAAQAAAMAAAAAAAAAAABgwABvXgE/AQkBAMAAb10AAAAAAQbAAG9ggT2Jp4msid4AArVUAAAAAQOJwYneAAAAAQEBidMAAAisp2DAAP0cAABgwAD6CgAAADSN3gA0jhIAAAABAsAAb2OBPYpAik+L/Ae1WQAAAWDAAP0cAAAAAQXAAG9oAAAAAAQAAAMAAAAAAAAAAABgwABvYwE/AQkBAMAA/TIAAAAAAgbAAG9lgT2K94sTi2AAArVOAAAAAQOLLItgAAAAAgICiz0AAACk3mDAAEtIAItOAAAAtU9gwAD9HAAAYMAAb14ABsAAb2aBPYuui7OL+gACtVAAAAABA4vBi/oAAAADAwOLzQAAAK8XYMAAZ14Ai+YAAACCZmC8twCL9AAAALVRYMAATQwAAGDAAPoKAAAANI5lADSOpgA0jvIAAAACAsAAb2mBPYycjKKPXAPAAE2TAAABYMAA/RwAAWDAAG9jAAEFwABvboE9jOWM640EAQAAA40CjQQAAAAAAAAAYMAAb2kBPwEJAYzrwAD9MgAAAAACBsAAb2uBPY0JjTCN4AAAtU4Bao0KYMAA/RwCAAABA41JjeAAAAACAgKNWgAAAKTeYMAAS0gAjWsAAAC1T2DAAP0cAABgwABvbwE+AUqNhAE1jY8AAAEAYMAAb28BH42PwABvegAAAAA1AAAAAQBbARyNtIKNssA0j6i1VAEAASaNygGBjcrANI+NYMAAb3sAwABvd4IAwDSPqAbAAG9sgT2N5Y32j1oAALVQAWqN5mDAAP0cAgAAAQOOBI9aAAAAAwMDjhcAAACvF2DAAGdeAI4wAAAAgmZgvLcAjkwAAAi1UWDAAE05AABgwAD6CgE+A06OYo5rAACk3mDAAEtIARaOeICObcA0kBqk3sAAZ2FOjpuOpgAArKdgwABvewEmjpsBFo6zgI6owDSQGrQPwABnYmDAAG97So7LASIcjtuDjtLANJBJtVIBAAGBjurANJAnAMAAS2UAIhyPCYSO/sA0kGhIAQABKwDAAG+EARyPK4SPIMA0kGi1VQMAA4GPMsA0kCcWj0ODjzrANJBJpxvAAEtMgo9PwDSQMgDAAG+DAAA0j1cANI/xADSQ+AAAAAICwABvb4E9j1+PZZSaA8AATZQAAAFgwABvXgAAAgTAAG9xgT2PrY+6GLYUAGDAAPoKASoEwABvc4E9j9iP5BjAAE2VwABvVwBdwAD9ZwFgwABvewErAQXAAG96AAAAAAQAAAMAAAAAAAAAAABgwABvbwE/AQkBAMAAb2IAAAAABAbAAG91gT2P6Y/6kSEAALVVAWqP6mDAAP0cAgAAAQOQAJEhAAAAAwMDkA4AAACWIGC8twCQHAAAAIC9YMAAaGYAkCgAAAi1UWDAAE0MAABgwAD6CgE+BEmQNRaQOS62FMAAb3FKkEABKT9JkFEckGIWkFUuwABNlcAAb1fAAG9zSAEAASsAwAD9KUqQawEqP0aQfZCzkJcAAACsp2DAAG97ABaQpS7AAE2VwABvV8AAb3M+AUmQuxyQyoOQv8A0kh61VQMAA4CQ0cA0kbKBkNrANJG9JpDgAYKQ4MA0kcpgwABNOQDAAG+DPgFKkPIBKT9KkREBKgbAAG92gT2RJpE3koMAALU8AWqRJ2DAAP0cAgAAAQORUJKDAAAAAgICkVoAAACk3mDAAEtIAJFqAAAItVFgwABNDAAAYMAA+goBPgNJkXcWkXsuthTAAG9xPgFKkYoBKT9JkaEhHJGyFpGlLsAATZXAAG9XwABvc0gBAAErAMAA/Sk+AUaRw5H5kd0AAACsp2DAAG97ABaR6y7AAE2VwABvV8AAb3M+AUmSAxySEoKSB8A0kwi1PAIAAoCSLMA0kqiBkjbANJK1AMAAb4I+AUqSSgEpPz9KknMBKgbAAG93gT2SiJKZk7sAALVUAWqSiWDAAP0cAgAAAQOSrpO7AAAAAQEBksQAAAisp2DAAG97AABgwAD6CgE+BEmS1haS2i62FMAAb3FKkuEBKj9JkvMckwc1AAAAAQBgwABvewGAkvfANJODIxyTA4EAwDSTs0gBAAErAAArFpMDgQDANJOzmcLAAG99AWC8pUgBAAErAMAA/Sk+Az0XkxguthQpwABvcT0XkywuwABNlcAAb1crwABvc0qTRwEpPz0jHJNrFpNeLsAATZXAAG9XwABvc0gBAAErAMAA/SkXk14uwABNlcAAb1cek3PAAMDiAAFgwABvewAAwABvcysBXcAA/WcBYMAAb3tKk5QBHJOoFpObLsAATZXAAG9XwABvc1YBAAGAk6zANJODAMAA/XQGwABveIE9k8CT05SYAAAjAWqTwWDAAP0cAgAAAQOT25SYAAAAAAAAAGDAAP22AT4BSZPkFpPoLrYUwABvcT4BSpP3ASe2FkmUEiEclCMWlBYuwABNlcAAb1fAAG9zSAEAASsAwAD9KT4BSpQ0ASSUagMnYxyUXhyUTBaUPy7AAE2VwABvV8AAb3OAqwEBYLylATSUUAOUUJRcAAAAAQEBlFEAAACA9WDAAG97AABgvKUBSpRXARaUWYCUV8A0lS2ZwsAAb30AwAD8PVgBAAEngKcAwAD8RieAlz4BSpR/ASe2FwAANJGJADSSfwA0k1oANJSNADSVcAAAAAQCwABve4E9lJ2Uo5nEA8AASjoAAAFgwAD9HAAAAgTAAG99gT2UzpTRCZnCAGC8pQAEwABvfoE9lOmU8Qm7vABgwABv9QABBcAAb4uBPZb1lvuXMQGVSQADlxiXMQAAAAICApceAAAEmcJgvKUAlygAAAS7vGDAAG/1AABgwABvewE/AwgBwABvfYAAwDSV6wgBwABvfoEAwDSV9gkBlvvAAP0yAAAAAAgGwABvgIE9lPaU/pbwBAEAAAAAAQOVEpbwAAAABAMElSIAAACy+2C4MACVSAAAALGKYMAAai4AlWUAAACZwmC8pQCVfwAAALu8YMAAb/UBapWYYMAAb/XAAOdCAGDAAG97AT4CSZWoHJW8gZWswDSWW7KvAQABgpXNwDSWaADAAGo7PgI9ipZVwDSWaBaWaoCWW8A0llCxELiJPYuWicA0lnNqlqJgwABv9cAA50I/Spa1AR+WwMAAb4sCAAKClt7ANJZog5bjwDSWcwAGwABvgoE9lzaXO5d8AAC1PAAAAAEDl1SXfAAAAAICApdeAAAApN5gwABLSACXbgAAALVRYMAATQwAAGDAAPoKAUqXeAEpBsAAb4OBPZeBl4aX+wAAtVUAAAABA5eMl/sAAAADAwOXmgAAAJYgYLy3AJeoAAAAgL1gwABoZgCXuAAAALVRYMAATTkAAGDAAPoKAT4BSpfFARyX0oKXzMA0l3u7uwMAA4CX4MA0l2MWl+kumcLAAG99FpfuLru8wABvfgDAAE0+BsAAb4eBPZgAmAmYMwEAtQEAAAABA5gRmDMAAAAAAAAAYMAA+goBSpgUARyYHRaYFC67vMAAb35IAQABapguYMAAb/XAAOeRAMAA/SkGwABviIE9mDiYQZhzAQDAAEpDAAAAAQOYSJhzAAAAAAAAAGDAAPoKAUqYSwEcmFQWmEsuu7zAAG9+SAEAAWqYZWDAAG/1wADnqADAAP0pBsAAb4SBPZh4mJKZQAMASAFqmHlgwAD9HAIAAAEDmJSZQAAAAAEBAZicAAAAg9ZgwAD9HAAAYMAA+goBPgJJmKkemK3AAPWxAgACLoCYvcA0mIgASpjFASk/SpjWASIiJZjjgJjdwDSYiGDAAG97AByZChaZBi6ZwsAAb31IAQABFpkTFJkNwDSYiAABYMAAb3uZwsAAb30AwAD9KQAcmSsWmSIuu7zAAG9+SAEAARaZNBSZLsA0mIgAAWDAAG97u7zAAG9+AMAA/SkGwABviYE9mUWZWZl2AQCDwQFqmUZgwAD9HAIAAAEDmWKZdgAAAAAAAABgwAD70AFKmWUBHJlyFplpFpllLpnCwABvfYPBwAD9L4OIAQABNw0AwAD89wbAAG+FgT2Ze5mOmcIAACMBapl8YMAA/RwCAAABA5mWmcIAAAAAAAAAYMAA/bYBSpmcASSZwgUnwABNlhaZsy6ZwsAAb30ngKcWmbguu7zAAG9+J4MhAAA0ljEANJb9ADSXQwA0l8QANJgRADSYYAA0mSsANJmBADSZ1wAAAAgCwABvjIE9mqiat5vaB8AATZcAAAFgwAD9HAAAAAEFwABvkAAAAAAEAAADAAAAAAAAAAAAYMAAb4wBPwEJAQDAAP0yAAAAAAEGwABvjoE9m6ObvZvYAQK0kgAAAAEDm9ib2AAAAAAAAABdwAD8MgFgvKUAAAA0mkgANJpzAAAAAQLAAG+RgT2b3ZvsoUEHwABNmAAAAWDAAP0cAAADBMAAb5OBPZwinGIJu1kAXcAA/KUCYLyRXcAA/WcBYMAAYk8BMpxgYLyRXcAA/WcBYMAAYk8ABMAAb5SBPZyKnM0Ju1oAXcAA/KUCYMAAS0hdwAD9ZwFgwABiTwEynMtgwABLSF3AAP1nAWDAAGJPAATAAG+VgT2c7p0qCbtTAF3AAP1nAWDAAGKiAR6dE8AAwOIAAWDAAGKiAAABBcAAb54AAAAABAAAAwAAAAAAAAAAAGDAAG+RAT8BCQEAwAD9MgAAAAAFBsAAb5iBPZ0vnTSeDgAAwABNmcAAb1cAAAABA51Zng4AAAACAgKdaAAAAJYgYLyRAJ2AAAAAhRddwAD8dAFgwABiTwAAXAE+AT01nbQAAAEAXcAA/WcBYMAAYk8BHJ20Fp2VLrtZwABvk5kVAgACgJ3JwDSbiTSd0gOd0p3rAAAAAAAAAF3AAP1nAWDAAGJPAUqd2AEendzAAMDiAAFgwABiTwAAAMAA/MA1AAAAAQBbARyd9YKd88A0m66ApQEAAYGd/MA0m5QAwAD9dYIAwDSbrgbAAG+ZgT2eE54YnvgAAMAATZrAAG9XAAAAAQOePp74AAAAAgICnk8AAACk3mDAAEtIAJ5oAAAAhRddwAD8dAFgwABiTwAAXAE+AT01np0AAAEAXcAA/WcBYMAAYk8BHJ6dFp59LrtawABvlJkVAgACgJ6ywDScXDSevAOevJ7VAAAAAAAAAF3AAP1nAWDAAGJPAUqewgEensbAAMDiAAFgwABiTwAAAMAA/MA1AAAAAQBbARye34Ke3cA0nIOApQEAAYGe5sA0nGkAwAD9dYIAwDScgwbAAG+agT2e/Z8Cn/YAALs7AAAAAQOfGp/2AAAAAQEBnyUAAACvFWDAAGeQAABcAT4CSZ82IhyfUhafRICfOsA0nSuFF8AAZ5pIAQABKwDAAP0pARafdRafZ4CfXcA0nSuFF8AAZ5qBVcAA/FY+AUqfhgA/PRyfmC7AAE2ZwABvVwIAAhaf0YCfx8A0nSuWIMAAZ5MWn+SAn9rANJ0rhRfAAGeaAMAAb5gGwABvm4E9n/ugAKDCAAC7KwAAAAEDoBmgwgAAAAICAqAqAAAApN5gwABLSACgQwAAAIUXXcAA/HQBYMAAYk8AAFwBPgJJoFgWoGqBoFzANJ3hgVXAAPxWSqBzAD89HKB/LsAATZrAAG9XAgACgKCmwDSd1IGgsMA0neEAwABvmQbAAG+cgT2gx6DMoT8AALS0AAAAAQOg66E/AAAAAQEBoP0AAACti2DAAGKiAABcAT4BPRyhKhahES67U8AAb5VWAQABgKEuwDSeVADAAP10AAA0m2MANJw2ADSdCwA0nbQANJ40ADSehAAAAAUAAAGBPQA0nqMANIyyADSNmAA0jh8ANI8DADSRCQA0lYkANJoAADSagAA0nqEAAAAIADSeowAAAAAAAADAAG+fAIE+AAAGgNoAAKQwAACA8wAAuC8AAQEBsM2BKQAAt9AAAQECsIekfIFkAAC8kAAAgYgAAMAAQQwAAIGpAADAAFzVAAAAAAAGAsAAb6CBPohwiH+KawfAAE2bAAABYMAA/RwAAAABBcAAb6kAAAAABAAAAwAAAAAAAAAAAGDAAG+gAT8BCQEAwAD9MgAAAAAFBsAAb6KBPoi+iMOI+wACwABNnAAAAAEDiNeI+wAAAAEBAYjnAAAAwABNnWC8zAAAXAAGwABvo4E+iSqJL4k9AAK0hgAAAAEDiTuJPQAAAAAAAABcAAbAAG+mgT6JfomHiZ4BAsAATZ4AAAABA4meiZ4AAAAAAAAAYMAA+goABsAAb6eBPonfieiJ/gECwABNnwAAAAEDif6J/gAAAAAAAABgwAD6CgAGwABvpIE+ilGKYoppAAKCiAAAAAEDimeKaQAAAAAAAABgwABvwQAAADSfcQA0n6MANJ/GADSf7wA0oBgANKA/AAAABQLAAG+qgT6Kbop0mQcDwABNoAAAAWDAAP0cAAFgwABvoAgEwABvrIE+ixGLOQnAAE2hAF3AAP1nAWC8zAEeiyTAAMDiAAFgvMwAAATAAG+tgT6LnovHCcAATaIAXcAA/WcBYLzMAR6LssAAwOIAAWC8zAAABMAAb66BPoyEjLIJwABNowBdwAD9ZwFgvMwBHoydwADA4gABYLzMAAAEwABvr4E+jReNPQnAAE2kAF3AAP1nAWC8zAEejSjAAMDiAAFgvMwAAATAAG+xgT6Nmo3JCcAATaXAAG+fAF3AAP1nAWC8zAEejbTAAMDiAAFgvMwAAATAAG+0gT6OWI6JCcAATaYAXcAA/WcBYLzMAR6OdMAAwOIAAWC8zAAABMAAb7KBPo6jjrIJs7/AAG+fAGC4MAAEwABvs4E+jtGO2gnAAE2nwABvnwBgwABv6wABBcAAb8CBPo7fjt+PHQAAAAOO948dAAAAAgICjv0AAASzv2C4MACPEwAABMAATadgwABv6wAAYMAAb6oBPwMIAcAAb7KAAMA0ocYIAcAAb7OBAMA0odEJAY7fwAD9MgAAAAAHBsAAb7aBPo8ijzuPYgEAwABNqAAAAAEDj1aPYgAAAAAAAABgwABv6wFKj1kBFo9ZLsAATafAAG+fwABvswbAAG+3gT6PZ498j68BAMAATZ4Bao9oYMAA/RwCAAABA4+Uj68AAAAAAAAAYMAA+goBSo+XARaPpRaPly7AAE2iwABvrYOywAD8VwbAAG+4gT6Ps4/Ij/cBAMAATZ8Bao+0YMAA/RwCAAABA4/fj/cAAAAAAAAAYMAA+goBSo/iARaP7RaP4i7AAE2kwABvr4OywAD8VwbAAG+6gT6P/JANkHwAAMAATZwBao/9YMAA/RwCAAABA5AhkHwAAAABAQGQMQAAAMAATZ1gvMwAAFwBPgE9HJBgFpBMLsAATaXAAG+fwABvsVYBAAGAkGTANKMMAMAA/XQGwABvu4E+kIGQkpD4AAC0hgFqkIJgwAD9HAIAAAEDkJ6Q+AAAAAAAAABcAT4CPRyQuxaQpy7AAE2lwABvn8AAb7GD+AEAARaQwy7AAE2pwABvn8AAb70AwAD8Qj0ckO0WkNkuwABNpcAAb5/AAG+xgkIAAAAAwAD9gAbAAG+9gT6Q/ZEJmHcAAMAATanAAG+fAAAAAQORGJh3AAAAAQEBkSgAAACWIGC8zAAAYMAAb90BPghAHJFLFpFGgJE+wDSj4oC9vJNIAQABapFaYMAA/bbAAOLzAMAA/cWRPpFnAEAhFpF+gJF2wDSj4oQavMSRdZGIAEmRjxyRoBaRky7AAE2hwABvrIMXAQABgJGpwDSj4gDAAP1zPgFKkbsBapHOYMAAb93AATovP0mR4RyR8xaR5S7AAE2iwABvrYMXAQABgJH8wDSj4gDAAP1zPgFKkg4BapIhYMAAb93AATpIP0mSNRySRBaSOS7AAE2kwABvr4MXAQABgJJNwDSj4gDAAP1zPgFKkl8BapJyYMAAb93AATphP0mSgxySmhaShy7AAE2jwABvroMXAQABgJKjwDSj4gDAAP1zPgFKkrUBapLIYMAAb93AATp6P0mS4iEckv8akvG3/brnAQABgJMQwDSj4gDAAEtnPgI9HJM1FpMiLsAATaPAAG+uVgEAAYCTOcA0o+IAwAD9dEqTSQFqk1xgwABv3cABOno/SZN2HJOKFpN6LrO/wABvn8AAb7Kw8QEAAYCTrsA0o+IAuQo+Aj0ck80Wk8AuwABNocAAb6xWAQABgJPRwDSj4gDAAP10SpPhAWqT9GDAAG/dwAE6L0mUCByUFhaUDC7AAE2nwABvn8AAb7PAAE2uAQABgJQqwDSj4gDAAG/tPgU9HJRSFpQ8LsAATabAAG+0VgEAAYCUVsA0o+IAwAD9dE6U/5UJAADAAE2vYLzMARyVFRaVCy7AAE2nwABvn8AAb7PAAE2wAQABgJUqwDSj4gDAAG/vTpVGlU8AAMAAQ1JgwABv3QEclVEuwABNqcAAb58BAAGBlWHANKYAAMAAb71BR5VzgpV7wDSmNQQBlaBqlaBgwABv3cABOi8APgI9HJXAFpWzLsAATaHAAG+sVgEAAYCVxMA0o+IAwAD9dEKV2AABlfhqlfhgwABv3cABOkgAPgI9HJYaFpYMLsAATaLAAG+tVgEAAYCWHsA0o+IAwAD9dEKWMgABllJqllJgwABv3cABOmEAPgI9HJZuFpZjLsAATaTAAG+vVgEAAYCWcsA0o+IAwAD9dEKWhgABlqZqlqZgwABv3cABOnoAPgM9HJc/FpcyLsAATaHAAG+sVgEAAYCXQ8A0o+IAwAD9dD2Kl1fANKY1apduYMAAb93AATovQpeBAEqXlgGCl53ANKY1SZeyHJfAFpe2LsAATafAAG+fwABvs8AATbEBAAGAl9LANKPiAMAAb+4+Aj0cl/IWl+QuwABNosAAb61WAQABgJf2wDSj4gDAAP10SpgGAWqYGWDAAG/dwAE6SD4CPRyYQRaYNi7AAE2kwABvr1YBAAGAmEXANKPiAMAA/XRKmFUBaphoYMAAb93AATphBsAAb76BPph8mJmZBQAAgogBaph9YMAA/RwCAAABA5iemQUAAAAAAAAAYMAAb8EBPgFKmKcBH5iywABv3AMAAxaY0C7AAE2iwABvrRaY3y7AAE2kwABvrxaY6y7AAE2mwABvtAAAADSiDgA0oksANKKWADSi4QA0o0IANKO8ADSn8AA0qFUAAAAHAsAAb8GBPpmWmaWdFge76QAAAWDAAP0cAAABBMAAb8SBPpmlAASWQsAAb58AWwExAFsBGgDAAG/GAAUGwABvxoE+mfiaAJpmBEGuzgAAAAEDmiOaZgAAAAEBAZovAAAAg0RgwABdKgAAYMAAb8EBPTUAAAAAgm1bARoAwABv1RMAAAbAAG/IgT6an5qkmsIAAq7PAAAAAQOas5rCAAAAAQEBmr0AAACEO2DAAFzbAABcAAbAAG/JgT6bd5t8m50AAsAATbIAAAABA5uFm50AAAABAQGblQAAAJYgYLzMAABgwAD6CgAGwABvyoE+nE2cUpyWAAK2eAAAAAEDnHKclgAAAAEBAZyOAAAAtnZgwABBMgAAXAAGwABvy4E+nOSc6Z0UAAK3hAAAAAEDnPedFAAAAAEBAZ0LAAAApLpgtYcAAFwAAAA0qLUANKj8ADSpLAA0qWAANKmQADSpvgAAAAUCwABvzIE+nRmdH6j3A8AATbMAAAFgwAD9HAABYMAAb8EGBMAAb86BPp3PneoGg+cAYMAA/bYBap3VYMAA/bbAATqOBMAAb8+BPp5PnlwJwABNogBdwAD9ZwFgvMwABMAAb9CBPp7BnssJwABNpABdwAD9ZwFgvMwABMAAb9GBPp8fn08JwABNtQBdwAD9ZwFgvMwBHp86wADA4gABYLzMAAAEwABv0oE+n6Of1AnAAE22AF3AAP1nAWC8zAEen7/AAMDiAAFgvMwAAATAAG/TgT6f86AICcAATaYAXcAA/WcBYLzMAAEFwABv3IE+oA2gDaBpAAAAA6AhoGkAAAADAwOgLgAABMAATaJdwAD9ZwFgvMwAoEIAAATAAE2kXcAA/WcBYLzMAKBTAAAEwABNpl3AAP1nAWC8zAAAYMAAb8wBPwQIAcAAb8+AAMA0qt0IAcAAb9CBAMA0qvAIAcAAb9OCAMA0qwMJAaANwAD9MgAAAAAFBsAAb9WBPqBuoHajkwQBrs4AAAABA6Cdo5MAAAABAQGgqQAAAINEYMAAXSoAAGDAAG/MAT4IPRygvoCgt8A0q3CClAEAAWqgxGDAAP22wAE6jgDAAF0sTqDioPAAAMAATaJdwAD9ZwFgvMwBHKEfHKEBgKD6wDSrcK7vAAFgvMwAAMAAXWOVEwAAAADAAPxJTqFAoUsAAMAATaRdwAD9ZwFgvMwBHKF6HKFcgKFVwDSrcK7vAAFgvMwAAMAAXWOVEwAAAADAAPxJTqGbobEAAMAATaZdwAD9ZwFgvMwBHKHgHKHCgKG7wDSrcK7vAAFgvMwAAMAAXWOVEwAAAADAAPxJTqICohcAAMAATbVdwAD8dAFgvMwBHKIogKIhwDSrcK7vAAFgvMwAAMAAXWNOomCidgAAwABNtl3AAPx0AWC8zAEcooeAooDANKtwru8AAWC8zAAAwABdYz0corGAoqrANKtwgowBAAFqorVgwAD9tsABOo4AwABdLUqivwE1osoAAAEAYMAAb8wBH6LKwABv3AMAA4Gi6MA0q6iCovfANKvhg6MDwDSsGgA1AAAAAQBbARyjNxajIoajIMA0rNDAAE21wABv0YClAQABhKM+wDSsUwDAAP11NQAAAAEAWwEco3IWo1yGo1rANKzQwABNtsAAb9KApQEAAYWjecA0rH8AwAD9dYYAwDSs0AbAAG/XgT6jmKOppMYAAK7PAWqjmWDAAP0cAgAAAQOjuKTGAAAAAQEBo8IAAACEO2DAAFzbAABcAT4HPRyj04CjzsA0rYeClAEAAWqj2WDAAP22wAE6jgDAAFzgPRyj6ICj48A0rYeu9wEAARaj9S7AAE2iwABvzwDAAF0QPRykDoCkCcA0rYeu9wEAARakGy7AAE2kwABv0ADAAF0QPRykMYCkLMA0rYeu9wEAARakPi7AAE2mwABv0wDAAF0QPRykX4CkWsA0rYeu9wEAARakbC7AAE21wABv0QDAAF0QPRykjICkh8A0rYeu9wEAARakmS7AAE22wABv0gDAAF0QPRykuoCktcA0rYeCjAEAAWqkvmDAAP22wAE6jgDAAFzhBsAAb9iBPqTLpNymBwAAtngBaqTMYMAA/RwCAAABA6T8pgcAAAABAQGlGAAAALZ2YMAAQTIAAFwBPgE9HKUyFqUnLsAATaTAAG/Qg/gBAAE0pToDpTqmAgAAAAEBAaVKAAAAliBgvMwAAGDAAPzZAT4BSaVbFqV/HKVngKVfwDSuqbPtAQABgaV2wDSu3gDAAEE3tmPAAEEdPgE9HKWsFqWXLsAATbXAAG/RVgEAAYGlsMA0rt4AwAD9dD4BPRyl5xal0S7AAE22wABv0lYBAAGBpevANK7eAMAA/XQAwAD8QgbAAG/ZgT6mDKYdqFkAALeEAWqmDWDAAP0cAgAAAQOmK6hZAAAAAQEBpj8AAACkumC1hwAAXAE+Az0cpl0Wpk8uwABNosAAb8+D+AEAATSmZQOmZabyAAAAAQEBpmYAAACDTWC8zAAAYMAA/NkBPgFJpnEhHKaMFqZ2LsAATabAAG/TgxcBAAGBppXANK++AMAA/XM+AT0cpqyApqPANK+LrpUCAAKBpr7ANK++aqbNYKTkwAC9BgC1kz8AwAD8Qj0cpw4WpvkuwABNtcAAb9GD+AEAATSnFgOnFqeiAAAAAQEBpxcAAACDTWC8zAAAYMAA/NkBPgFJpyIhHKc9FqcnLsAATabAAG/TgxcBAAGBp0bANLBFAMAA/XM+AT0cp12Ap1TANK+LrpUCAAKBp2/ANLBFaqd+YKTkwAC8rAC1kz8AwAD8Qj0cp78Wp6kuwABNtsAAb9KD+AEAATSnxwOnx6hUAAAAAQEBp8gAAACDTWC8zAAAYMAA/NkBPgFJp9MhHKfuFqfYLsAATabAAG/TgxcBAAGBp/fANLDMAMAA/XM+AT0cqA6AqAXANK+LrpUCAAKBqCDANLDMaqgvYKTkwAC8mwC1kz8AwAD8QgbAAG/agT6oXqhvqPUAAMAATbIBaqhfYMAA/RwCAAABA6h4qPUAAAABAQGoiAAAAJYgYLzMAABgwAD6CgE+AkAcqKsWqKaAqJ7ANLFbgL28k0gBAAFqqLpgwAD9tsAA4vMAwAD9xaieqMcASqjOARyo4Bao1S7AAE2kwABv0IMXAQABgKjpwDSxWwDAAP1zAAA0q1AANK1eADSugAA0r2IANLEwADSxvwAAAAUCwABv3YE+qPqo/6k/C8AATbcAAAFgwAD9HAAABwTAAG/fgT6o/6j/CScAYMAA+9AABMAAb+GBPqj/qP8JKMAAb58AYMAA/bYABMAAb+KBPqj/qP8GKQBdwAD8dAFgwABv3QFqAF3AAPx0AWDAAG/dwAE6kwTAAG/jgT6pD6kPBp0bAGDAAG/dAWoAYMAAb93AATovBMAAb+SBPqkaqRoGwABNuABgwABv3QFqAGDAAG/dwAE6SATAAG/lgT6pJqkmBsAATbkAYMAAb90BagBgwABv3cABOnoEwABv5oE+qTipOAbAAE26AGDAAG/dAWoAYMAAb93AATphAQXAAG/qgT6o/6j/qT8BAAADqP+pPwAAAAICAqj/AAAEJ2DAAPvQAKj/AAAEKGDAAP22AABgwABv3QE/AwgAwABv34AAwDSy8ggAwABv4YEAwDSy/gkAAMAA/TIAAAAAAQbAAG/ogT6o/6j/qT8AACMAAAABA6j/qT8AAAAAAAAAYMAA/bYBSgABDwAuwABv4QAANLM3ADSzZwAAAAECwABv64E+qY2pnKuJB8AATbsAAAFgwAD9HAAAAAEFwABv8QAAAAAEAAADAAAAAAAAAAAAYMAAb+sBPwEJAQDAAP0yAAAAAAMGwABv7YE+qiSqKapdAALAAE2uAAAAAQOqPKpdAAAAAQEBqlYAAAiWQWC8zAAAYMAA+goABsAAb+6BPqrNqtKrBAACwABNsQAAAAEDquOrBAAAAAEBAar9AAAIlkFgvMwAAGDAAPoKAAbAAG/vgT6rQ6tSq4cAAsAATbAAAAABA6tmq4cAAAABAQGrgAAACJZBYLzMAABgvMwAAAA0s7wANLPwADS0JAA0tFYAAAADAAABgT4ANLRtADSfKQA0oFwANKh6ADSp2wA0sdwANLN0ADS0awAAAAYANLRtAAAAAAAAAMAAb/IAgT8AAAuA2gAAgi6CBgCBAgAAm5KCBgCBNgAAnEWCBgCBZQAAmqSCBgCBlgAAm0mCBgCBywAAt9AAAIHqAACB4AAAggYAAMAAmoUAAIIrAADAAIGIAACCQAAAwACOvwAAgmAAAMAAnCIAAAAAAAYCwABv9YE/gs2C0oQOC8AATbwAAAFgwAD9HAAABgTAAG/3gT+C0oLSCScAYMAA+9AABMAAb/mBP4LSgtIJKMAAb/IAYMAA/bYABMAAb/qBP4LSgtIGKQBdwAD8dAFgwABv9QFqAF3AAPx0AWDAAG/1wAE6qgTAAG/7gT+DGIMYBpreAGDAAG/1AWoAYMAAb/XAAOdCBMAAb/yBP4O6g7oGoXoAYMAAb/UBagBgwABv9cAA56gEwABv/YE/hAeEBwasqABgwABv9QFqAGDAAG/1wADnkQEFwABwAYE/gtKC0oQOAQAAA4LShA4AAAACAgKC0gAABCdgwAD70ACC0gAABChgwAD9tgAAYMAAb/UBPwMIAMAAb/eAAMA0tgIIAMAAb/mBAMA0tg4JAADAAP0yAAAAAAEGwABv/4E/gtKC0oQOAAAjAAAAAQOC0oQOAAAAAAAAAGDAAP22AUoAAQ8ALsAAb/kAADS2RwA0tncAAAABAsAAcAKBP4a8hsvAAMfIB8AATb0AAAFgwACO0wAADATAAHAFgT+HHoc3CcAATb7AAG/yAF3AAPylAmCEqWCIswEyhzVghKlgiLMABMAAcAaBP4dfh3YYwABNv8AAb/IAXcAA/KUCYIfRYIizASsEwABwD4E/h5aHqBjAAE3AAF3AAPylAmCEqWDAAHDSASsEwABwB4E/h9SH8xjAAE3BwABv8gBdwAD8pQJghNRgwACalQEyh/FghNRgwACalQAEwABwEIE/iBCIGQmHZQBgm54ABMAAcAiBP4gwiDkYhNrAAG/yAGDAAI7FASsEwABwCYE/i9qL6xjAAE3CwABv8gBdwAD9ZwFgiE4BKwTAAHAKgT+MC4xKGMAATcPAAG/yAF3AAP1nAWCITgEejC3AAMDiAAFgiE4AAATAAHALgT+MV4x1GMAATcTAAG/yAGDAAHDSAWqMbGDAAHDSwAE60gTAAHAMgT+MgYyRGMAATcXAAG/yAGDAAHDSASsEwABwDYE/jJ2MrhjAAE3GwABv8gBgwABw0gErBMAAcA6BP7mduaoYm+rAAG/yAGCD5QErAQXAAHCsgT+IPog+iKIAAAADiE+IogAAAAICAohjAAAAhsZgm0wAiHkAAASHZWCbngAAYMAAcAIBPwIIAcAAcBCBAMA0uFsJAIiMwACPAgEAAYCIksA0uFAAgJYGwABwEoE/iKeIt4kfAADAAE3HAAAAAQOIyYkfAAAAAAAAAGDAAJwjAT4BSojSAR+I3cAAnDACAAIWiO0uwABNvsAAb/LAAHAFFokDLsAATb/AAG/ywABwBgAGwABwnoE/iZuJpImuAQK3+gAAAAEDia6JrgAAAAAAAABgwAD6CgAGwABwn4E/ijCKOYpbAQK3+wAAAAEDiluKWwAAAAAAAABgwAD6CgAGwABwoIE/imCKd4qJAQK35wAAAAEDiomKiQAAAAAAAABgwACBkgAGwABwoYE/io6KsIryAQCEvAFqio9gwAD9HAIAAAEDirmK8gAAAAAAAABgwACOxQE+AkAhHIrQForGLoTawABv8sAAcAhIAQABKwCI/IrGitcASoreARaK5S6E2sAAb/LAAHAIBsAAcKeBP4r3iwCLbQIAhLwAAAABA4sIi20AAAABAQGLGwAAAICWYMAAjsUAAFwBPgJAIhyLNYCLL8A0ueNIAQABKwCI/AEci0oWi0AuhNrAAG/ywABwCEgBAAErAIj8iy+LUQA9F4tYLoTawABv8oCLZMA0uePAAHAIBsAAcBOBP4tyi3eLuQAAwABNyAAAAAEDi4CLuQAAAAEBAYuNAAAAgpBgiLMAAGDAAPoKAUqLlgEhHIubgIuWwDS6YEgBAAFqi6RgwACOwMABEmgAiLcGwABwooE/jTiNRI4BAQC1wgAAAAEDjUyOAQAAAAAAAABgwABw0gE+AkmNUhyNYxaNVi7AAE3EwABv8sAAcAtIAQABKwDAAP0pPgI9F410LsAATcTAAG/yHI2UFo2DLsAATcXAAG/ywABwDFgBAAEWjZkuwABNxsAAb/LAAHANAMAAcNjAAHALPReNsy7AAE3FwABv8heNxi7AAE3GwABv8ivAAHANwABwDD9KjeoBFo3xLsAATcTAAG/ywABwCwbAAHCogT+OiI6RjvcCALXCAAAAAQOOmI73AAAAAQEBjqEAAACAlmDAAHDSAABcAT4CPReOri7AAE3EwABv8oCOvcA0u3PAAHALPReOyC7AAE3FwABv8heO2y7AAE3GwABv8ivAAHANwABwDAbAAHCjgT+PcY99j7ABAMAATckAAAABA4+Nj7AAAAAAAAAAYMAAcNIBSo+QATUAAAABAGDAAHDSARaPkC7AAE3FwABv8sAAcAwjHI+hgADANLvtSAEAASsAABaPpC7AAE3EwABv8sAAcAuAAMA0u+0BYMAAcNIGwABwqYE/kCeQMJCKAgDAAE3JAAAAAQOQP5CKAAAAAQEBkEgAAACAlmDAAHDSAABcAT4CPReQVS7AAE3FwABv8oCQaMA0vFfAAHAMPReQcy7AAE3EwABv8ivAAHALBsAAcKSBP5EFkRGRRgEAwABNygAAAAEDkSKRRgAAAAAAAABgwABw0gFKkSUBNQAAAAEAYMAAcNIBFpElLsAATcbAAG/ywABwDSMckTeAAMA0vMFIAQABKwAAFpE6LsAATcTAAG/ywABwC4AAwDS8wQFgwABw0gbAAHCqgT+RvpHHkiMCAMAATcoAAAABA5HXkiMAAAABAQGR4AAAAICWYMAAcNIAAFwBPgI9F5HtLsAATcbAAG/ygJIBwDS9K8AAcA09F5IMLsAATcTAAG/yK8AAcAsGwABwFIE/kiiSQJKnAACXzwFqkilgwAD9HAIAAAEDkkuSpwAAAAEBAZJUAAAAg+5ggksAAGCIswFKkmMBMJJjH5JpwAD7YgEAASSSpgUnwABNy4CSi8A0vZAng0kWkpiAkpPANL2QhYDAAP0wJ4MhAAbAAHAVgT+SrJK9kwMAAIbeAWqSrWDAAP0cAgAAAQOSy5MDAAAAAQEBktkAAACD7mCKSAAAYMAA/NkBPgE9HJLlLsAATcwBAAEWkvWAkvDANL4BhtOKTADAAI7bBsAAcBaBP5MIkxmTlwAAhJoBapMJYMAA/RwCAAABA5Mlk5cAAAABAQGTMQAAAIPuYIKLAABgwAD82QE+Az0ckz0uwABNzAEAARaTTYCTSMA0vl2EgYKbAMAAjts9HJNbLsAATcwBAAEWk2uAk2bANL5dhIKCnADAAI7bPRyTfC7AAE3MAQABFpOMgJOHwDS+XYSDgp0AwACO2wbAAHAXgT+TnJOtlCwAAITuAWqTnWDAAP0cAgAAAQOTt5QsAAAAAQEBk8EAAACD7mCDFAAAYMAA/NkBPgM9HJPNLsAATcwBAAEWk92Ak9jANL73hNeDKADAAI7bPRyT8C7AAE3MAQABFpQAgJP7wDS+94SCgykAwACO2z0clBEuwABNzAEAARaUIYCUHMA0vveEg4MnAMAAjtsGwABwGIE/lDGUQpUMAADAAE3NAAAAAQOUVJUMAAAAAQEBlGEAAACCkGCIswAAYIjuAT4CQ5RtJZR5gJR0wDS/imCJOT4BPYiUmsA0v4oWlMoWlMAmlKcAgJSiwDS/imCJOYDtiT2FaYlPSpTbASMllOeAlOLANL+KYIjuFJT9wDS/igABYIjuKwFgiO4GwABwGYE/lxqXK5tVAACFbAAAAAEDlz6bVQAAAAICApdLAAAAgpBgiLMAl1oAAACE5mCDFAAAYIjuAT4FSZjNFpjrFpjcgZjRwDTAIIS4gyOBVcAA/FY+AUqY/AEWmQ6BmQPANMAghPSDQj9DmSElmS2AmSjANMAVYIk5PgE9iJlOwDTAFRaZfhaZdCaZWwCAmVbANMAVYIk5gO2JPYVpiU9JmY8cmZiAmZPANMAVSAEAARaZqxaZmy6GxsAAjv+FaptYAIi3PgFKmb0BFpnPgZnEwDTAIIT1g0Q/SZnlJZnugJnpwDTAFWCI7j4CTpocmicAAIVrYIjuARyaQxaaMy6GxsAAjv+FbAIAAhSaV8A0wBUAAWCI7oGaXcA0wCAAm3tJmnAhHJp/gpp0wDTA5EgBAAErAIj8SpqIAYKaj8A0wOQ/SZqmJZqvgJqqwDTAFWCI4j4BSprJARaa24Ga0MA0wCCE9YNEP0qbOAEWm0qBmz/ANMAghPSDQgbAAHAbgT+cQZxNn9oAAMAATc7AAG/yAAAAAQOcZJ/aAAAAAgICnHsAAACD7mCE1ACcjQAAAIV8YIizAABgiLMBPgZOnKucuwAAhXtgg1kBFpzCgJy9wDTBl4V7hNpJnNciHJzrgpzbwDTBtUgBAAErAMAA/SkAJZ0DgZz2wDTBomCI7j4BPYqdIMA0wbUXnTeAnTLANMGXhXscnV0WnVMuh2XAAHAQmwkCAAIWnX0UnXDANMGiAQFgiO6E4oj0Fp2NgJ2IwDTBl4C9hNcAm62E3D9JnZ4hHJ2ygp2iwDTBtUgBAAErAMAA/Sk+A06dzJ3XAACE5mCDFAEWnemCndnANMG1hPmDYT2Jnf/ANMGiHJ4OLoVsAgACgZ4iwDTBooOeMMA0wl8AwABwGUqeQwEcnoUenlqawgEAASaebAGBnmzANMGiYIjuAIV9AQABFp6kgp6UwDTBtYT9g2sAmsk/Tp7znv4AAIV+YMAA/bYBFp8KFp8FgJ8AwDTBl4C9hNeAvYiBSZ8UHJ8jg58YwDTC00gBAAEng8EAwAD9xT4BSp86ARafURafQS6GxsAAjv+Ff5taSZ9lHJ90g59pwDTC00gBAAEnhYAAwAD9xT4BSp+OARafpRaflS6GxsAAjv+FgZtfP0qfuQFqn8ZgiMqEeQbAAHAlgT+f35/koEUAAMAATc8AAAABA5/1oEUAAAADAwOgDAAAAIPuYITUAKAeAAAAhXxgiLMAoDgAAAC5jWCIswAAXAE+AAbAAHAmgT+gSqBPoM0AAMAATdAAAAABA6BjoM0AAAAEBASgcwAAAIPuYITUAKCMAAAAgmdgwACaiACgpAAAAIV8YIizAKC+AAAAwABKK2CIswAAXAE+AAbAAHAngT+g0qDqpwEAAIWCAWqg02DAAP0cAgAAAQOg+qcBAAAAAQEBoQoAAACD7mCE1AAAYIizAT4GTqEioS8AAIV8YIizARyhMS7AAEY5AQABFqFAgKE7wDTEK4V5hNYAwACO2k6hW6FmAAC5jWCIswE1AAAAAQBdwAD8pQJghKlgiLMBFqFoLsAATb7AAG/ywABwBTUAAAABAGCE1AGAoX3ANMQrNQAAAAEAYIizARyhjS7AAE3OwABv8gIAAoChpcA0xCuBoavANMQ+AMAAcBs1AAAAAQBcARyhfIKhfMA0xHaAvwIAAoOhfMA0xJmEAMA0xKoAwAD8uoQAwDTEqj2Job7ANMQ+HKHNLsAATdHAAG/yAgACFqHqgKHlwDTEK4V7hNqBofvANMQ+AMAAcB09HKIOLsAATc8DAAOAoiDANMQrgaImwDTEPoKiNMA0xGkAwABwJUmiRRyiWBaiUxaiToCiScA0xCuAvYTXgL2IgUgBAAFqomdgwAD9tsAA4vYAwAD9xT4DTqKQopUAABJgwACalQEeoqHAAJqHAgACFqK3LsAATcHAAG/ywABwB4Ci08A0xCsASaLgHKMDFqLpg6LkwDTFjsAATdLAAJqYSAEAAYCjBsA0xCsAwAD9KT4BPRejp4OjosA0xY6FfIGjtsA0xD7AAJqaPgJAHKSDFqRog6RjwDTFjsAATdPAAJqbSAEAAYCkhsA0xCsAwAD9KaRjpIoBJKTIBCfAAE3UgKS8wDTEKyeDVYOkw8A0xY49F6TYg6TTwDTFjsAASiuBpOfANMQ+wACanUmlAxalDIOlB8A0xY7AAE3VwACanz4DPRylwRalpi7AAE3BwABv8sAAcAeEWQEAARalzYOlyMA0xY7AAE3SwACamADAAPzCSaXxIRymFRal+oOl9cA0xY7AAE3TwACam0gBAAErAMAA/Sk+AT0cpkUWpiouwABNwcAAb/LAAHAHhFkBAAEWplGDpkzANMWOwABN08AAmpsAwAD8wj89HKaALsAATdAEAASApqLANMQrFqatg6aowDTFjoJnwACalxamuIOms8A0xY6FfMAAmpoWpsuDpsbANMWOwABKK8AAmp0AwABwJj8/SqbsAYKm88A0xGkGwABwKIE/pwanC6drAADAAE3WAAAAAQOnHKdrAAAAAwMDpzMAAACD7mCE5gCnRQAAAIV8YIizAKdfAAAAhcdgiLMAAFwBPgAGwABwKYE/p3CniK3sAACFhAFqp3FgwAD9HAIAAAEDp5it7AAAAAEBAaeoAAAAg+5ghOYAAGCIswE+B06nwKfNAACFfGCIswEcp88uwABGOQEAARan3oCn2cA0x8WFeYToAMAAjtpOp/moAwAAhcdgiLMBHagLhYQBAAGAqBzANMfFAMAAjutOqDGoQQAAhXtgg1kBFqhIgKhDwDTHxYV7hO1JqF0iHKhxg6hhwDTIJEgBAAErAMAA/SkAJaiJgah8wDTH2GCI7j4CPYuopsA0yCQcqM0WqLguh2XAAHAQmwkDAAIWqO0UqODANMfYAQFgiO6E4oj0Fqj9gKj4wDTHxYC9hOkBmwYpm61JqRghHKksg6kcwDTIJEgBAAErAMAA/Sk+BU6pSKlTAACE5mCDFAEWqWWDqVXANMgkhPmDYU6pjamiAADAAE3XYJq6AR6pwJrCAQABHKnjLoVsAgACFKn3wDTH2AEBYIjuhKoFwDTIwgDAAHAZAE6qJ6oyAACE/mCIswEcqlWFqkDANMjdhX0BAAEWqnSDqmTANMgkhP6DbACayUmqiSEcqp4Wqo4uhsbAAI7/mt8CAAKCqqrANMgDhqq1wDTJFgCbgD4ETquQq50AAMAASrxghl4BNauxAAABAGCGXgEfq7GGbwIAAharxoCrwcA0x8WAloTqhqvNwDTJFgA1AAAAAQBbARer64er6cA0yXuF1ymGZzUAAAABAFsBF6wQh6wOwDTJe4RSgKwZwDTHxYJYhwDANMl7PResLoCsKcA0x8WAloesNsA0yWyE6j0crLwuwABN2AIAAoesz8A0yWyCrN3ANMgDAMAAcFA9iqzzwDTIA4as/8A0yRY/PRetIoCtHcA0x8WFe4OtNMA0yCSE7z8/PYmtV8A0x9gcrWYuwABN0cAAb/ICAAKDrX7ANMgkga2PwDTH2ADAAHAdPRytoi7AAE3WAwADgK20wDTHxYGtusA0x9iCrcjANMgDAMAAcChKrdgBgq3fwDTIAwbAAHAqgT+t8a32rmIAAMAATdkAAAABA64NrmIAAAADAwOuIwAAAIPuYIT5AK47AAAAhXxgiLMArlUAAAC5jWCIswAAXAE+AAbAAHArgT+uZ65/sGUAAIWGAWquaGDAAP0cAgAAAQOulbBlAAAAAQEBrqsAAACD7mCE+QAAYIizAT4HTq7DrtAAAIV8YIizARyu0i7AAEY5AQABFq7hgK7cwDTLBoV5hPsAwACO2k6u+a8EAACE5mCDFAEWrxIWrwuArwbANMsGgkWE/oT5g2E9ia8mwDTLGRyvNS6FbAIAAoGvScA0yxmCr1fANMtEAMAAcBlOr3SvfwAAuY1giLMBHK+6Hq+RmsIBAAEmr6MBga+jwDTLGWCI7gCFfQEAARav1RavzoCvycA0ywaCRYT+hP2DawCayT0cr/oWr+YuwABNvsAAb/LAAHAFgL8CAAKAr/vANMsGg7ADwDTLigDAAPy6PRywEy7AAE3ZAwADgLArwDTLBoGwMcA0yxmDsD/ANMuKAMAAcCpKsFABg7BXwDTLigbAAHAsgT+warBvsRUAAMAATdoAAAABA7CLsRUAAAAEBASwrQAAAIPuYIUcALDFAAAAhXxgiLMAsOcAAADAAE3bYMAAcK0AsQgAAACFNGCIswAAXAE+AAbAAHAtgT+xGrEytUUAAIWKAWqxG2DAAP0cAgAAAQOxTbVFAAAAAQEBsWgAAACD7mCFHAAAYIizAT4HTrGAsY0AAIV8YIizARyxjy7AAEY5AQABFrGegLGZwDTMqoV5hR4AwACO2k6xu7HJAADAAE3bYMAAcK0BHLHLLsAATdzAAG/yAQABFrHggLHbwDTMqluFIADAAHAhTrH8AAAAhTRgiLMASbIMHLIgFrIQLobGwACO/4WLAQABFrJEgLI/wDTMqoJFhSIAm20+Ak6yYbJuAADAAEorYIizARyyiBayfoKycMA0zOiFjcAAcK9LAQABkwDAAPyDPYuyk8A0zRocsrAWsqAuhsbAAI7/hYwCAAKBstnANMy9hLLnwDTNTgCbbj4ETrMSsx0AAITmYIMUARazKxazJICzH8A0zKqCRYUihPmDYT2Js0HANMy9HLNQLoVsAgACgbNkwDTMvYSzcsA0zacAwABwGU6zkbOcAACFNGCIswEcs9kes66awgEAASazwAGBs8DANMy9YIjuAIV9AQABFrP9FrP0FrPtgLPowDTMqoJFhSKCaoPqhTSEhwCayT2NtBDANM3tHLSMHrQtmsQCAAIWtFsWtFIWtEuAtEbANMyqgkWFIoJqg+qEuISDFrR6FrRwgLRrwDTMqluFIIVnhXUAhX0BAAGFtJvANM3tAJrJPRy0xha0si7AAE2+wABv8sAAcAWAvwIAAoC0x8A0zKqDtM/ANM0aAMAA/Lo9HLTfLsAATdoEAASAtPzANMyqgbUCwDTMvYK1EMA0zOiDtR/ANM0aAMAAcCxKtTABg7U3wDTNGgbAAHAugT+1SrVPtboAAMAATd0AAAABA7VmtboAAAADAwO1fAAAAIPuYIUKALWUAAAAhXxgiLMAta4AAACFx2CIswAAXAE+AAbAAHAvgT+1v7XXttgAAIWIAWq1wGDAAP0cAgAAAQO17bbYAAAAAQEBtgMAAACD7mCFCgAAYIizAT4ETrYbtigAAIV8YIizARy2Ki7AAEY5AQABFrY5gLY0wDTPX4V5hQwAwACO2k62VLZeAACFx2CIswEdtmaFiAEAAYC2fcA0z18AwACO7D0ctoguwABN3QMAA4C2oMA0z1+BtqbANM9ygra0wDTPnQDAAHAuSrbEAYK2y8A0z50GwABwMIE/uAG4Bri5AADAAE3eAAAAAQO4Iri5AAAAAQEBuC0AAACFe2CDWQAAYMAA+goBPgFKuEQBIiW4W4C4S8A00BBgg+UAHLiGFrh2LobGwACO/4WLAQABFLilwDTQEAABYIPlAJttBsAAcByBP7i+uMi5iwAAwABN38AAb/IAAAABA7jSuYsAAAACAgK43AAAAJnCYIMUALjoAAAAgL1gwAD9tgAAYINZAT4CRrj0uRq5AwAAAIJmYINZABa5EYC5DcA00H6EiIM8PgFJuSIcuTcWuTIWuS2CuSbANNCigL2DXYC9iIFIAQABgbk6wDTQiQDAAP3FSrlAAYK5R8A00KI/PTC5WRy5Xy6BwgEAASS5hgQnqauBuW7ANNCJJ6cjgLmCwDTQfgDAAI7YBsAAcKWBP7muub+6HQEAnEEAAAABA7nMuh0AAAAAAAAAYIPlAUq51QEmudUBNQAAAAEAYIPlARa51S6b6sAAb/LAAHAOIxy544AAwDTRTEgBAAErAMAA/SkXudUum+rAAG/yJrnVARy55y7AAE3fwABv8gIAAha6DRa6Aha58i6GxsAAjv+GCptXhOKI9CdIAMAAcBxgg+XAAHAOgADANNFMAWCDWWCD5QbAAHAdgT+64rruu/AAAMAATdHAAG/yAAAAAQO7BbvwAAAAAgICuxcAAACFe2CDWQC7NAAAAIV8YIizAABgiLMBPgJJu0giIRy7XIC7TMA00e1IAQABKwDAAP0pABy7dIG7Z8A00fhIAQABart9YIjKhHkAiLc+AT2Ju5fANNH4FrvFFru2gLumwDTR7YT5g2GEvINDP0q72QGBu+DANNH4BsAAcB6BP7xNvFLAAEXGAADAAE3gwABv8gAAAAEDvF/AAEXGAAAAAgICvG0AAABbYIVzALyCAAAAgmZgg1kAAGDAAPoKAT4ET7ztvPIAAAHAAE3hYQRgwAD70GDAAPvQYMAA+9BhAF3AAPwyAWDAAP22YMAA+goAA70KwABAiAAAAAQEBL0YAAAAvU5gwAD70AC9OAAAAIUZYMAA+9AAvVwAAACo7GDAAPvQAL2aAAAAwABN4mEAXcAA/DIBYMAA/bYAAGDAAPoKAT4HSb22Iha9yha9xIC9usA00pKFZ4V1g7LAAPxXACEcvfkWvfIWveyAveLANNKShWeFdWHAAPyjSAEAAYO9/MA00u0AwAD88z4BSr4aASo/Sb42HL5WFr5PFr5EgL46wDTSkoWNhXZhwAD8o2MBAAGEvljANNL6AMAA/P0+AUq+egEqP0m+lhy+tha+rxa+pIC+msA00pKFjYV2YcAA/KOAlwEAAYW+uMA00wcAwAD8/z4BSr7cASo/Tr8JvxkAAIS7XcAA/DIBYMAA/bYBHL8thr8bwDTTFCAAAAAAAEm/Nxy/Uha/Sxa/RYC/O8A00pKFV4V3YcAA/KOAlwEAARa/ZIe/VMA00+xhwAD8VQDAAPz/PgFKv3YBKj9Jv5IWv6YWv6CAv5bANNKShVeFd4OywAD8Vz4BRr+8v/e/1AAAAKk7YIWBABa/8IC/5sA00pKFV4V3PgFJwABAAyEcwABAGIfAAEAIwDTT7IMXAQABFsAAQDAUwABAIcA01G4IAIC9hYMAwAD8QT4BSsAAQEUBKj8/SsAAQHcBKU/AAEDtwABA8gAAAcAATeNhAWCIs2DAAPoKAAPAAEECwABCtwAAAAEBAcAAQQ8AAACCkGCIswAAYMAA+goBPgRJwABBHSXAAEEmhMAAQSHANNT3YIjKSsAAQTkBKT9JwABBTBzAAEFVhMAAQVDANNT3SAEAARbAAEFoFsAAQVguhsbAAI7/ms6bYACIt0rAAEF5ASk/ScAAQYwlwABBlYTAAEGQwDTU92CJAD4BSsAAQbMBHMAAQdKCwABBusA00rMgBAAEFsAAQfQWwABB5RTAAEHgwDTU9wQBYIkAhLiJAmHAAPyjFsAAQg0UwABCCMA01PcEAWCJAIUZiQMWwABCSxbAAEI2FMAAQjHANNT3BAFgiQCEuokEYcAA/KM0wABCXwPAAEJfwABClAAAAAAAAABdwAD9ZwFgwAD9tgFKwABCZQEcwABCjRzAAEJ6FsAAQmoUwABCZcA01PcEAWCJAIS7iQWAqwEBYMAA/bYBNMAAQn4DwABCfsAAQosAAAABAQHAAEJ/AAAAgNRgiSwAAGDAAP22AUrAAEKFARbAAEKHhcAAQoXANNZRgL2JLgDAAPw9lRMAAAAAwAD8SQAAP0rAAEKlASpJwABCviXAAELJgcAAQsLANNKcYIPlPgFJwABC4iIcwABC8hbAAELtFMAAQubANNKcAQFgg+WCZ4PoSAEAAWrAAEMGYIQihKcAwAD9KQEcwABDJhbAAEMhFMAAQxrANNKcAQFgg+WCZ4PoSAEAAWrAAEM6YIQigc8AwAD9KT4BSsAAQ00BKknAAENoHMAAQ3gWwABDcxTAAENswDTSnAEBYIPlgmeD6EgBAAFqwABDjGCEIoSYAMAA/Sk+AUrAAEOeARzAAEO1g8AAQ6XANNTSIAEAARbAAEO9FMAAQ7bANNKcAQFgg+WE/YQJAABJwABD1yIcwABD5xbAAEPiFMAAQ9vANNKcAQFgg+WCZ4PoSAEAAWrAAEP7YIQihLYAwAD9KQEcwABEGxbAAEQWFMAARA/ANNKcAQFgg+WCZ4PoSAEAAWrAAEQvYIQihMUAwAD9KT4BSsAAREMBHMAARGKCwABESsA00rMgBAAEFsAARI8WwABEgBbAAER3FMAARHDANNKcAQFgg+WCaoPqhLiEg2HAAPyjFsAARLMWwABEqhTAAESjwDTSnAEBYIPlgmqD6oUZhIQWwABE/BbAAETnFsAARN4UwABE18A00pwBAWCD5YJqg+qEuoSFYcAA/KM0wABFEAPAAEUQwABFUAAAAAAAAABdwAD9ZwFgwAD9tgFKwABFFgEcwABFSRzAAEU2FsAARSYWwABFHRTAAEUWwDTSnAEBYIPlgmqD6oS7hIaAqwEBYMAA/bYBNMAARToDwABFOsAARUcAAAABAQHAAEU7AAAAgNRgiE4AAGDAAP22AUrAAEVBARbAAEVDhMAARUHANNjlgL2IUgDAAPw9lRMAAAAAwAD8SQAAP0nAAEVmJcAARXGBwABFasA00pxgg3c+AUrAAEWGARzAAEWdg8AARY3ANNTSIAEAARbAAEWlFMAARZ7ANNKcAQFgg3eCkIN5AAA/SsAARbYBKgbAAHAfgT/AAEa/wABGxMAAVj0AAMAATeTAAG/yAAAAAQPAAEbhwABWPQAAAAQEBMAARv0AAACD7mCFkwDAAEcXAAAAwABN22DAAHCtAMAARzgAAACFNWCIswDAAEdWAAAAhXtgg1kAAFwBPhJJwABHsCEcwABHyRbAAEe5gMAAR7TANNmkhXuFmkgBAAErAMAA/SlKwABH0gA/PRfAAEfjgMAAR97ANNmkhXuDwABH9cA02c+FnEnAAEgKISXAAEgbgsAASA7ANNnCYIkASsAASDAAP07AAEhMwABIWwAAs8JgiQABJsAASEwBgsAASF3ANNnCYIkATsAASIXAAEicAADAAE3lXcAA/KUCYMAA+9BgiLMBMsAASJ5gwAD70GCIswBFwABIpgHAAEivwABIsQAAYmDAAPvQAZMBHMAASLiGwABItsA02p5jAQABFsAASNQWwABIyRbAAEi/gMAASLrANNmkW4WXhY2FdmHAAPyjAMAA/P0BjsAASNzANNqeHMAASN2GwABI3MA02p5kAQABlADAAPz1PgNOwABI9cAASQIAAMAASitgiLMBHMAASRwWwABJEoHAAEkEwDTZsYWNwABwr0sBAAGGwABJHcA02p4AwAD8g07AAEkzwABJQQAAqfhgiLMBHMAASWYWwABJUoTAAElDwDTaSoS6iQRLAQABhsAASWfANNqeAMAA/INJwABJcSEcwABJhhbAAEl2LobGwACO/5rfAgACh8AASZLANNsRFMAASaDANNtPCAAAm4A+AT0cwABJ0IXAAEm6wDTabYC/AgAChsAASdHANNqeFMAASdbANNtPCAAAwAD8uj9OwABKDcAASh8AAMAATeZdwAD8pQJgwAD70GCIswEywABKIWDAAPvQYIizAEXAAEopAcAASjLAAEpAAADAAE3nYMAA+9ABkwEcwABKW4fAAEpNwDTcHWMBAAEWwABKchbAAEpsFsAASmKAwABKXcA02aRbhZeFV4V3YcAA/KMAwAD8/QGPwABKgsA03B0cwABKj4fAAEqCwDTcHWQBAAGUAMAA/PU+BE7AAEquwABKvAAAwABN6GCFgQEcwABK0hbAAErNFsAASsOAwABKvsA02aRbhZeFV4V3SwEAAYfAAErTwDTcHQDAAPyDTsAASvXAAEsCAADAAEorYIizARzAAEsXFsAASxKBwABLBMA02bGFV8AAcLBLAQABh8AASxjANNwdAMAA/INOwABLOsAAS0gAAKn4YIizARbAAEvAHMAAS3QWwABLWYTAAEtKwDTaSoS7iQWWPAEAATTAAEuAA8AAS4DAAEuzAAAAAQEBwABLgQAAAMAATelgiSwAAGDAAPoKAUrAAEuPARzAAEueFsAAS5kUwABLj8A03VoKAIC9iS5IAQABFsAAS68UwABLocA03JMIAIC9hYMAwAD9xQDAAPxQgpCJL0nAAEvMIRzAAEvhFsAAS9EuhsbAAI7/mt8CAAIUwABL7cA03NcJABTAAEv7wDTdFQoAAJuAPgE9HMAATCaGwABMFcA02+yAvwIAAofAAEwnwDTcHRTAAEw4wDTdFQoAAMAA/Lo/ScAATFkiFsAATHSFwABMXcA02m2BVcAA/MoAFsAATJGGwABMf8A02+yBVcAA/Mo+AUrAAEzEAD9OwABM9MAATQEAAMAATepdwAD8dAFgiE4BMcAATQNgiE4AT8AATaXAAE2zAAABwABN62EEYISpYIJSYIizYIizYISpAAPAAE3BwABSUQAAAAQEBMAATdAAAACCa2CEqQDAAE3oAAAAhFJgglIAwABOBAAAAMAASitgiLMAwABOHgAAAMAATexgiLMAAGCEqQE+Ck7AAE5TwABOXAAAgmxgiE4BH8AATmyIcgIAARTAAE6MwDTepQkAAYKQFMAATp7ANN6/CwA9HMAATuouwABN7QEAARTA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wABGOQEAARbAAKv5gMAAq/TANSjPg8yH1QDAAI7aTsAArBTAAKwhAADAAE4kYIizAWrAAKwpYIjKhHlJwACsPxbAAKxIgMAArEPANSjPhiqH1z4DTsAArGrAAKx+AADAAE4lYIjuARzAAKyALsAATc0BAAGBwACsk8A1KOYAwABwGE7AAKy5wACsxAAAmtdgiO4BHMAArNYWwACsxi6GxsAAjv+FbAIAAoPAAKz1wDUpURbAAK0kFsAArRoWwACtCi6GxsAAjv+HYZtOmticsQCbe0nAAK04IRzAAK1HhMAArTzANSl/SAEAASsAiPw+AT2KwACtWsA1KRsfwACtbYj+AgACFsAAraUWwACtmxbAAK2LLobGwACO/4dhm06cTpy0FsAArdGEwACtxsA1KX+FF4jyAD8+A07AAK4NwACuIwAAwABOJmCI7gEcwACuJS7AAE3NAQABgcAArjjANSjmAMAAcBhOwACuV8AArl4AAIJmYINZARzAAK5qFsAArmAuh2XAAHAQmwkCAAIWwACunoPAAK6IwDUqNoTiiPQewACurYiHAQABasAArsFgwAD9tsAA4usAAJutScAArtMhHMAArt6EwACu18A1KmRIAQABKwDAAP0pPgE9isAArvHANSkbHMAAr6gewACvEJrCAQABHMAAr0MWwACvMy6GxsAAjv+FbAIAAoPAAK9swDUqNhbAAK+KhMAAr4PANSpkhPmDYQCbewCFfQEAARbAAK++hMAAr7fANSpkhP2DawCayT89IxzAAK/1FsAAr90uwABNv8AAb/LAAHAGSAEAASsAwAD9KRfAAK/dLsAATb/AAG/yMsAAr/lgh9FgiLMAwABwBisBXcAA/KUCYIfRYIizPRzAALAYFsAAsAEuwABNv8AAb/LAAHAGgL8CAAKAwACwGcA1KM+CwACwIcA1KRsAwAD8uk7AALA7wACwRgAAwABOImDAAHDSARfAALBILrXCHMAAsGIWwACwWi61wsAAcKKEWQEAARbAALCOHMAAsHwWwACwaS6358AAcKDAAE4aAQABgMAAsIjANSjPAMAAgZTAAE4bwACBqgDAAHDZwABwqD0cwACwpi7AAEY5AQABFsAAsLWAwACwsMA1KM+CbIfUAMAAjto9HMAAsMQuwABGOQEAARbAALDTgMAAsM7ANSjPgmmH1gDAAI7aPRzAALDeLsAATiMDAAOAwACw88A1KM+BwACw+cA1KOaCwACxB8A1KRsAwABwez0XwACxGi61woPAALEkwDUrxcAAcKgGwABwfYE/wACxN8AAsUjAALI4AACGIwFqwACxOGDAAP0cAgAAAQPAALFYwACyOAAAAAEBAcAAsWgAAACD7mCHuQAAYMAA/NkBPgROwACxfMAAsYcAAMAATiJgwABw0gEXwACxiS61whzAALGjFsAAsZsutcLAAHCihFkBAAEWwACxzxzAALG9FsAAsaout+fAAHCgwABOGgEAAYDAALHJwDUs9gDAAIGUwABOG8AAgaoAwABw2cAAcKg9HMAAsecuwABGOQEAARbAALH2gMAAsfHANSz2gmmHuwDAAI7aPRzAALIBLsAARjkBAAEWwACyEIDAALILwDUs9oW0h7wAwACO2j0XwACyIC61woHAALIqwDUtDcAAcKgGwABwfoE/wACyPcAAsk7AALNjAACGIQFqwACyPmDAAP0cAgAAAQPAALJhwACzYwAAAAEBAcAAsnQAAACD7mCHrgAAYMAA/NkBPgVOwACyiMAAspMAAMAATiJgwABw0gEXwACylS61whzAALKvFsAAsqcutcLAAHCihFkBAAEWwACy2xzAALLJFsAAsrYut+fAAHCgwABOGgEAAYDAALLVwDUuEADAAIGUwABOG8AAgaoAwABw2cAAcKg9HMAAsvMuwABGOQEAARbAALMCgMAAsv3ANS4QhbSHsADAAI7aPRfAALMSLrXCFsAAsxwuwABNycAAcKPAAHCoPRzAALMxLsAARjkBAAEWwACzQIDAALM7wDUuEIJph7EAwACO2j0XwACzSy61woHAALNVwDUuJ8AAcKgGwABwf4E/wACzaMAAs23AALOdAADAAE4nAAAAAQPAALOCwACznQAAAAEBAcAAs5YAAACD7mCH3wAAXAE+AAbAAHCAgT/AALOiwACzs8AAtcgAAIYuAWrAALOjYMAA/RwCAAABA8AAs8fAALXIAAAAAQEBwACz2wAAAIPuYIffAABgwAD82QE+CD0cwACz5y7AAEY5AQABFsAAs/aAwACz8cA1L4OCa4fhAMAAjtpOwAC0D8AAtB8AAMAAQdhgwABw0gEWwAC0IS61wsAAcKJOwAC0PMAAtEIAAJ7CYMAAgagBHMAAtFcWwAC0RC6358AAcKDA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AE3CwABv8sAAcAlWAQABgMAAxWPANUF5AMAA/XROwADFesAAxX8AAIKQYIizARzAAMWBLsAARjkBAAEWwADFkIDAAMWLwDVBeYUBiFYAwACO2knAAMWiIiIhHMAAxbcWwADFq4DAAMWmwDVBeYUBiFZIAQABKwDAAP0pABzAAMXdFsAAxcout+fAAHCgwABM7wEAAYDAAMXwwDVBeQDAAIGVABbAAMYBLrf7wABwnz4BPRfAAMYygMAAxi3ANUF5gpCBwADGOcA1QbaIVD8GwABwmoE/wADGTMAAxl3AAMbdAACGUQFqwADGTWDAAP0cAgAAAQPAAMZ1wADG3QAAAAEBAcAAxo0AAACD7mCITgAAYMAA/NkBPgI9HMAAxpkuwABOCcAAb/IBAAGAwADGr8A1QpsAwABwJD0cwADGui7AAE3tAQABgMAAxtTANUKbAMAAcJkGwABwm4E/wADG4sAAxufAAMcdAADAAE42AAAAAQPAAMb/wADHHQAAAAEBAcAAxxYAAACD7mCHJQAAXAE+AAbAAHCcgT/AAMciwADHOsAAx8YAAIYAAWrAAMcjYMAA/RwCAAABA8AAx1HAAMfGAAAAAQEBwADHaAAAAIPuYIclAABgiLMBPgI9HMAAx3QuwABONgEAAYDAAMeNwDVDYADAAHCbSsAAx5gBHcAAx6WGAAEAAYDAAMe9wDVDYADAAI79AAA0uJAANLjqADS5EQA0uTgANLlfADS5wwA0uj4ANLqUADS7UwA0u78ANLw1ADS8kwA0vQkANL1nADS92AA0vjQANL7OADS/aAA0v/UANMFxADTDYwA0w6sANMQCADTHVAA0x5wANMqVADTK3QA0zCoANMyBADTO7gA0zzYANM/uADTQWAA00R4ANNHHADTSaAA02XQANOTfADTsMwA07xsANO+EADT0QAA09IsANPa4ADT3AwA0+KIANPjtADT5kwA0+d4ANPqEADT64AA0/GEANPy7ADT+XwA0/qoANQCsADUA9wA1AZ0ANQH5ADUEXgA1B1cANQhZADULGQA1C80ANQwLADUN7AA1DnwANQ8IADUPrQA1EAUANRE2ADUSfwA1EvQANRNBADUUBAA1FEIANRTqADUVKAA1FasANRXpADUWbAA1FqoANRctADUXawA1F+4ANRgsADUYrwA1GO0ANRlwADUZrgA1GlYANRqUADUbPAA1G3oANRwiADUctwA1HPUANR9QADUfjgA1IDYANSDLADUhKAA1IZgANSH1ADUiZQA1ItUANSMTADUjnwA1I+4ANSSaADUk6QA1JZUANSYFADUmdgA1JsEANShAADUomgA1LMEANS3bADUvEAA1L04ANTEtADUxrwA1MkoANTLfADUzHQA1M6kANTQ+ADU0fAA1NP8ANTU9ADU1wAA1Nf4ANTddADU3mwA1OcAANTn+ADU6pQA1OuMANTuZADU71wA1PXoANT24ADU/WAA1P5YANUELADVBSQA1QmYANULtADVDKwA1Q64AAACWAsAAcK2BP8AAx8vAAMfRwADIVwPAAE43AAABYMAA/RwAAAIEwABwr4E/wADH+8AAyAUJhY0AXcAA/HQBYIizAATAAHCwgT/AAMghwADIJgmFVwBdwAD8dAFgiLMAAQXAAHCygT/AAMgrwADIK8AAyFUAAAADwADIOMAAyFUAAAACAgLAAMg+AAAEhY1dwAD8dAFgiLMAwADITwAABIVXXcAA/HQBYIizAABgwABwrQE/AwgBwABwr4AAwDVGkggBwABwsIEAwDVGpQkBwADIK8AA/TIAAAAAAAAANUboAAAAAALAAHCzgT/AAMlfwADJZcAA1IMDwABOOAAAAWDAAP0cAAAEBMAAcLWBP8AAybXAAMnBCauCAGCIswAEwABwtoE/wADKJMAAyi0JwABOOQBdwAD9ZwFgiLMABMAAcLeBP8AAypbAAMqgCcAATjoAXcAA/WcBYIizAATAAHC5gT/AAMqpwADKshiGecAAb/IAYMAA+9ABKwEFwABww4E/wADKt8AAyrfAAMr1AAAAA8AAysHAAMr1AAAAAwMDwADKxwAABKuCYIizAMAAytoAAATAAE45XcAA/WcBYIizAMAAyuoAAATAAE46XcAA/WcBYIizAABgwABwswE/BAgBwABwtYAAwDVHrQgBwABwtoEAwDVHuggBwABwt4IAwDVHzwkBwADKt8AA/TIAAAAABQbAAHC7gT/AAMtywADLfsAAz7YAAMAATfMAAAABA8AAy4TAAM+2AAAAAQEBwADLmAAAAIbGYJtMAABgiLMBPgROwADLu8AAy8UAAIg3YIizARbAAMvHLquCwABwtUnAAMvZIRzAAMvoFsAAy90uwABOOsAAcLdIAQABKwDAAP0pPgFGwADMXcAAzILAAMxuAAAAgpBgiLMAFsAAzHYuwABOOsAAcLc+AUnAAMyMHMAAzKCAwADMkMA1SEya3wIAAhbAAMysLquCwABwtYLAAMy6wDVIqwCbgD4BSsAAzM0BFsAAzOSAwADM1MA1SEyFaptYPz9JwADNCiEcwADNGBbAAM0OLsAATjnAAHC2SAEAASsAwAD9KT4BRsAAzSnAAM1NwADNOgAAAIKQYIizABbAAM1CLsAATjnAAHC2PgJJwADNVxzAAM1ggsAAzVvANUlCSAEAARbAAM1zgMAAzWPANUhMhWqbWACItz4BSsAAzYkBgsAAzZDANUlCP0nAAM2oHMAAzbyAwADNrMA1SEya3wIAAoLAAM3IwDVJQoHAAM3OwDVIYQCbgD4BPYnAAM3mwDVIYYLAAM3ywDVJQknAAM4HIRzAAM4cgMAAzgzANUhMmt8CAAKBwADOKMA1SGGCwADOM8A1SUIAm4A+AUrAAM95ASs/P0rAAM+iAYHAAM+pwDVIYQbAAHDBgT/AAM+7wADPz8AA0IwBAIPBAWrAAM+8YMAA/RwCAAABA8AAz9jAANCMAAAAAAAAAGDAAPvQAT4CScAAz94cwADP7BbAAM/iLoZ5wABv8sAAcLlIAQABKwDAAPzzPgE9F8AAz/0uhnnAAG/yHsAA0BGB9AIBYIizAhbAANAZLsAATjrAAHC3HsAA0DeB9AIBYIizAhbAANA/LsAATjnAAHC2HsAA0FKB8QEAARbAANBdLquCwABwtQAAAMAAcLk/SsAA0HgBFsAA0H8uhnnAAG/ywABwuQbAAHC8gT/AANCRwADQq8AA0ZgDAEgBasAA0JJgwAD9HAIAAAEDwADQrcAA0ZgAAAABAQHAANCuAAAAg9ZbAABgwAD6CgE+AknAANC7HsAA0L/AAPWxAgACLoDAANDPwDVLNgBKwADQ1wEpP0rAANDoASIiIiXAAND1gMAA0O/ANUs2YMAAcLMAHMAA0RsWwADRDi6rgsAAcLVIAQABFsAA0SQUwADRHsA1SzYAAWDAAHCzq4LAAHC1AIi3AB7AANE8geUCAWCIswIWwADRRi7AAE45wABwthbAANFXFMAA0VHANUs2AAFgwABws8AATjnAAHC2AAAewADRbYHlAgFgiLMCFsAA0XcuwABOOsAAcLcWwADRiRTAANGDwDVLNgABYMAAcLPAAE46wABwtwAGwABwvoE/wADRncAA0aLAANMtAADAAE47wABv8gAAAAEDwADRqsAA0y0AAAACAgLAANG/AAAAg+RgwAD+AADAANHqAAAAwABOPGEBXcAA/DIBYIizYMAA/bYAAFwBPgU9HMAA0gCAwADR/cA1TGKCigEAASeZrgDAAP4UTsAA0hfAANIdAACio2DAAP22AScAScAA0ichHMAA0jUWwADSKy7AAE45wABwtkgBAAErAMAA/Sk+Az0cwADSSYDAANJGwDVMYoKKAQABJ8AATj0AwAD+FD0cwADSYoDAANJfwDVMYoKKAQABHMAA0nOBwADSaMA1THEgAQABFsAA0nQuwABOOcAAcLYAAADAAP4UPYrAANKHwDVMryeApz9JwADSniEcwADSrRbAANKiLsAATjrAAHC3SAEAASsAwAD9KT4DPRzAANLBgMAA0r7ANUxigooBAAGCwADSx8A1TK8AwAD+FD0cwADS2IDAANLVwDVMYoKKAQABJ8AATj4AwAD+FD0cwADS8oDAANLvwDVMYoKKAQABHMAA0wOBwADS+MA1THEgAQABFsAA0wQuwABOOsAAcLcAAADAAP4UPz0cwADTH4DAANMcwDVMYoKKAQABJ4bAAMAA/hQGwABwv4E/wADTMsAA00XAANSBAAAjAWrAANMzYMAA/RwCAAABA8AA003AANSBAAAAAAAAAGDAAP22AT4HTsAA02PAANNmAACD5GDAAP4AAR/AANNswAD+HwAAAAA9HMAA04OAwADTgMA1TkqCigEAASfAAE4/AMAA/hQ9HMAA06CAwADTncA1TkqCigEAASTAANO+AifAAE5AFsAA07Euq4LAAHC1AMAA/hRJwADTxSEcwADT0xbAANPJLsAATjnAAHC2SAEAASsAwAD9KT4BPRzAANPngMAA0+TANU5KgooBAAEkwADT/wInvK0WwADT9S7AAE45wABwtgDAAP4UP0nAANQMIRzAANQbFsAA1BAuwABOOsAAcLdIAQABKwDAAP0pPgE9HMAA1C+AwADULMA1TkqCigEAASTAANRJAie8rhbAANQ+LsAATjrAAHC3AMAA/hQ/PRzAANRZgMAA1FbANU5KgooBAAEngyEAwAD+FErAANRpARzAANRzgMAA1HDANU5KIwAAAADAAP4ZAAA1SCAANUonADVLAgA1TDIANU4MADVPnAAAAAUCwABwxIE/wADVjMAA1ZLAAPRxA8AATkEAAAFgwAD9HAAAAwTAAHDGgT/AANXiwADV7gmrggBgiLMABMAAcMeBP8AA1kPAANZOCcAATkIAXcAA/DIBYMAAcLMABMAAcMiBP8AA1qnAANa4CcAATkMAXcAA/DIBYIizAAEFwABw0YE/wADWvcAA1r3AANcCAAAAA8AA1sfAANcCAAAAAwMDwADWzQAABKuCYIizAMAA1uAAAATAAE5CXcAA/DIBYMAAcLMAwADW8gAABMAATkNdwAD8MgFgiLMAAGDAAHDEAT8ECAHAAHDGgADANVBZCAHAAHDHgQDANVBmCAHAAHDIggDANVB9CQHAANa9wAD9MgAAAAAFBsAAcMqBP8AA2B/AANgqwADfEQAAwABN8gAAAAEDwADYMcAA3xEAAAACAQHAANg+AAAAgpBgiLMAAcAA2EoAAAC6CmDAAPoKAWoAYMAA/Nl3YMAAcMQBPgdOwADYacAA2HgAAMAATkRdwAD9ZwFgwABwswEewADYfsAAwOIAAWDAAHCzAABPwADYlsAA2JsAAAHAAE5FYQFgwABws2DAAPoKAAPAANiowADcuwAAAAEBAcAA2LQAAADAAE5GYMAAcLMAAGDAAPoKAT4HTsAA2M3AANjVAACtkmDAAPoKASpPwADY5cAA2PYAAAHAAE5HYQJdwAD9ZwFgiLNgiLNdwAD9ZwFgiLMAA8AA2P/AANpaAAAAAgICwADZEQAAAJceXcAA/WcBYIizAMAA2SIAAACCkGCIswAAXcAA/WcBYIizAT4ETsAA2UMAAACBdl3AAP1nAWCIswBJwADZUxzAANlbh8AA2VfANVHlSAEAASsAwAD9KT4BPRXAANlwwDVSEwkewADZfcAAwOIAAWCIswAAScAA2aAcwADZqIfAANmkwDVR5YMXAQABFMAA2bHANVH4CAAAwAD9cz4BSsAA2cQBh8AA2cvANVHlPgE9FcAA2evANVITCR7AANnywADA5AEBYIizAYfAANoKwDVR5QA9jcAA2iLANVGbKUrAANo6ATXAANpBAAABAF3AAP1nAWCIswEUwADaQcA1UhMJADUAAAABAFsBHMAA2kkUwADaR8A1UtEKAFYBAAEUwADaTcA1UfgIAADAAP10FADANVLRCgBOwADadMAA2n4AAMAATjldwAD9ZwFgiLMBNQAAAAEAYMAAcLMBhMAA2oDANVGAIxzAANqMhwDANVM8SAEAASsAACsWwADajIcAwDVTPMAATjnAAHC2AV3AAP1nAWCIs07AANquwADauQAAwABOOl3AAP1nAWCIswE1AAAAAQBgwABwswGEwADau8A1UYAjHMAA2scUAMA1U5sIAEgBAAErAAArFsAA2scUAMA1U5sIAMAATjrAAHC3AV3AAP1nAWCIs0nAANrZgcAA2t3ANVEIPgE9j8AA2u/ANVMjHMAA2wSGwADa+8A1UbMgAgACh8AA2wXANVMjgMAA2xDANVD6AAA+AT0VwADbLsA1U4IIHMAA20SGwADbO8A1UbMgAgACFMAA20XANVOCCACAwADbUcA1UPoAAD0cwADca4LAANxcwDVRKFYBAAEfwADcb8AAcMMDAAMWwADcei6rgsAAcMaHwADciMA1UyMUwADck8A1U4IIAAAAwAD9dErAANynAYXAANyuwDVRm07AANzHwADczwAArZJgwAD6CgEqScAA3NwWwADc7BbAANzgLsAATkLAAHDHgVXAAPxWPgE9jMAA3P3ANVSuHMAA3QWEwADc/cA1VK6BBgEAARzAAN0Vg8AA3QjANVFZIAEAASsAAADAAPoTPgFGwADdMMAA3VvAAN1AAAAAwABORmDAAHCzABbAAN1OLsAATkLAAHDHPgE9jMAA3WXANVSuHMAA3W2EwADdZcA1VK6BBgEAARzAAN19g8AA3XDANVFZIAEAAYXAAN1+wDVVIwAAAMAA+hNOwADdswAAAMAATkhdwAD8MgFgiLMAScAA3cscwADd3xbAAN3PLsAATkPAAHDIgxcBAAGAwADd6MA1UPoAwAD8QT4BPY3AAN33wDVVhBbAAN4MLsAATkPAAHDIPgI9jcAA3jDANVWENcAA3kkAAAEAXcAA/WcBYIizAR7AAN5JwADA5AEBYIizARbAAN5fLsAATkPAAHDIADUAAAABAFsBHMAA3nqGwADeeMA1VetWAQABgMAA3n7ANVD6AMAA/XSGAMA1Ves9jMAA3ovANVSuKUrAAN6lASOEwADerMA1VK4fwADewsAAcNEDAAMWwADezS6rgsAAcMaCwADe28A1USiFwADe68A1VYQALgFgwABwxAbAAHDLgT/AAN+zwADfvsAA7WcAAFgAAAAB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/IVKwABBqQFqwABBvmDAAIfzwAE7Yz9KwABB4QFqwABB9mDAAIfzwAE7fADAAHEXSsAAQhABH8AAQhvAAHGWAQABhMAAQirANZVQAEnAAEI/HMAAQkqDwABCQ8A1kYdIAQABasAAQlhgwABxacAA6CUAwAD9KT4FScAAQmocwABCbi6a3wIAAoLAAEJ6wDWReoDAAEKAwDWRXgDAAHESPgFKwABC0QFqwABC52DAAHGIwAE7Nj9JwABDABzAAEMJgsAAQwTANZF6SAEAARbAAEMcFsAAQwwus7/AAHDgwABxBprEuDIAwAD9KT4BSsAAQ6gBasAAQ75gwABxiMABO5A/TsAARDLAAEQ6AACEgV3AAPx0AWC8pQExwABESWC8pQA9HMAARFMuwABOYAIAAoLAAERrwDWRejTAAERxA8AARHHAAEXSAAAAAQEBwABEfgAAAJsNYLylAABgwACH8wE+AknAAESSHMAARJYumt8CAAKFwABEosA1l0WAwABErMA1kV4AwABxEj4CPRzAAETHhMAARL/ANZb7VgEAAYXAAETLwDWXRQDAAPyFSsAARXQBasAARYlgwACH88ABO2M/SsAARawBasAARcFgwACH88ABO3wAwABxF0rAAEXbAR/AAEXmwABxlgEAAYTAAEX1wDWW+wA+BEnAAEYSIhzAAEYbgMAARhbANZFeSAEAAYLAAEYewDWRegDAAP0pARzAAEYmLprfAgACgMAARjLANZFegsAARjjANZF6AMAAcRI+AUrAAEaYAWrAAEauYMAAcYjAATuQScAARsUcwABGyS6a3wIAAoLAAEbVwDWReoDAAEbbwDWRXgDAAHESPgFKwABHOwFqwABHUWDAAHGIwAE7Sj9OwABJ18AASd8AAISBXcAA/HQBYLylATHAAEnuYLylAD0cwABJ+C7AAE5jAgACgMAASg/ANZFeNMAAShUDwABKFcAAS3YAAAABAQHAAEoiAAAAmw1gvKUAAGDAAIfzAT4CScAASjYcwABKOi6a3wIAAoXAAEpGwDWY2YLAAEpQwDWRegDAAHESPgI9HMAASmuEwABKY8A1mI9WAQABhcAASm/ANZjZAMAA/IVKwABLGAFqwABLLWDAAIfzwAE7Yz9KwABLUAFqwABLZWDAAIfzwAE7fADAAHEcSsAAS38BH8AAS4rAAHGWAQABhMAAS5nANZiPAAbAAHEjgUDAAEuwwABLz8AATCAAAMAATmoBasAAS7FgwAD9HAIAAAEDwABL5MAATCAAAAABAQHAAEvxAAAAmcJgvKUAAGDAAIdxAT4BSsAAS/wBHMAATBcWwABMAy7AAE5uwABw4MAAcQdLAQABgMAATBjANZm6AMAA/LkGwABxJIFAwABMJcAATDrAAEx3AADAAE5rAWrAAEwmYMAA/RwCAAABA8AATEXAAEx3AAAAAQEBwABMUgAAAJnCYLylAABgwACHnwE+AUrAAExdARzAAExuFsAATGQuwABOb8AAcODAAHEISwEAAYDAAExvwDWaNgDAAPy5BsAAcSWBQMAATHzAAEyPwABOHwAAs1MBasAATH1gwAD9HAIAAAEDwABMk8AATh8AAAABAAHAAEyhAAAAmcJgvKUBagBgwAD82XcAYMAA/bYBPgROwABMusAATL0AAIPkYMAA/gABH8AATMPAAP4fAAAAAEnAAEzXIRzAAEzfgMAATNvANZqwSAEAASsAwAD9KT4BPRzAAEzzgcAATPDANZrPgooBAAEkwABNKQMnwABOioDAAE0iwDWasCeDgADAAP4UPgE9HMAATUKBwABNP8A1ms+CigEAASfAAE6LAMAA/hQ9HMAATb4cwABNgi7AAE5qAQABFsAATagWwABNmC6zv8AAcODAAHEGmsS4MgDAAHEjhCwEAAKBwABNxsA1ms8ngNkCwABOjBzAAE3lgMAATeHANZqwSAEAASsAwAD9KcAATo2AwABN/cA1mrDAAIeNSsAATgcBHMAAThGBwABODsA1ms8jAAAAAMAA/hkAADV8yAA1fx0ANYERADWBqwA1gkUANYLfADWDeQA1hBcANYW1ADWGVgA1hxgANYffADWIgwA1iUoANYoZADWK4AA1i6oANYxOADWNFQA1jeQANY9SADWP9gA1kFoANZExADWZgwA1mf8ANZp7ADWb6wAAABsCwABxKIFAwABOJMAATirAAGY2A6O9AAABYMAA/RwAAAcEwABxK4FAwABO7MAATywJwABObsAAcOAAXcAA/KUCYLylYMAAh3EBMsAATypgvKVgwACHcQAEwABxLIFAwABPUcAAT3cJwABOb8AAcOAAXcAA/KUCYLylYMAAh58BMsAAT3VgvKVgwACHnwAEwABxMYFAwABPpMAAT94JtfwAXcAA/KUCYLylXcAA/WcBYLylAR7AAE+6wAD8rAACYLylXcAA/WcBYLylAAAEwABxLYFAwABP+MAAUAcJs7/AAHDgAGC4MAAEwABxLoFAwABQHsAAUCsJu53AAHDgAGDAAHFfAATAAHEvgUDAAGMXwABjPxjAAE6OwABw4ABdwAD8pQJgvKVgwABxQQEywABjPWC8pWDAAHFBAATAAHEwgUDAAGUswABlTBjAAE6PwABw4ABdwAD8pQJgvKVgwABxTAEywABlSmC8pWDAAHFMAAEFwABxQIFAwABQMMAAUDDAAFBvAAAAA8AAUEXAAFBvAAAAAgICwABQSwAABLO/YLgwAMAAUGEAAAS7nWDAAHFfAABgwABxKAE/AwgBwABxLYAAwDWd9ggBwABxLoEAwDWeAwkBwABQMMAA/TIAAAAACwbAAHEzgUDAAFB0wABQg8AAUaUAAIKIAAAAAQPAAFCIwABRpQAAAAAAAABgwABw4QE+AkAcwABQvRbAAFC2FsAAUKEuwABObsAAcODAAHErYcAA/MlIAQABFsAAUMsWwABQwC7AAE5vwABw4MAAcSxhwAD8yQDAAPzzwABQocAAUNEBJAAEJ8AATpAWwABRDy7AAE5uwABw4MAAcSsnwABDXBbAAFE1LsAATm/AAHDgwABxLErAAFFIAR/AAFFTwABxJwMAAxbAAFFvLrO/wABw4MAAcS0WwABRgC7AAE5uwABw4MAAcSsWwABRli7AAE5vwABw4MAAcSwABsAAcTSBQMAAUarAAFGvwABSCgAApOcAAAABA8AAUbzAAFIKAAAAAQEBwABRyQAAAJnCYLylAABcAT4BPRzAAFHULsAATpHAAHDgAQABHMAAUfIWwABR5C67ncAAcODAAHEuwABOkgEAAYDAAFIBwDWfZwDAAHFhAMAAcTcGwABxNoFAwABSD8AAUiLAAFPAAADAAE6TwABw4AAAAAEDwABSO8AAU8AAAAABAQHAAFJIAAAAmcJgvKUAAGDAAIdxAT4BSsAAUlMBHMAAUm8WwABSWi7AAE5uwABw4MAAcSuZFQIAAoDAAFJ7wDWf6jTAAFKAA8AAUoDAAFO7AAAAAAAAAGDAAIdxAT4ETsAAUp4AAADAAE6UYMAAh3EATsAAUrzAAFLHAACE5mC8pQEcwABS1xbAAFLJLrudwABw4MAAcS6ytAEAAYDAAFLlwDWf6gDAAHFlScAAUvEhHMAAUwCCwABS9cA1oFtIAQABKwDAAP0pPgE9icAAUxPANaBJHMAAUyAuwABOk8AAcOABAAGCwABTOsA1oFsAwABxNj9KwABTVQEfwABTYMAAh54DAAOBwABTfsA1oEkmwABTigGAwABTisA1n+pgwACONhzAAFOdFsAAU48uu53AAHDgwABxLsAATpUBAAGAwABTr8A1n+oAwABxYwAAwAD8wAbAAHE3gUDAAFPFwABTzsAAWCEAAMAATpHAAHDgAAAAAQPAAFPdwABYIQAAAAEBAcAAU+oAAACZwmC8pQAAYMAAh58BPgFKwABT9QEcwABUBxbAAFP8LsAATm/AAHDgwABxLJkVAgACgMAAVBPANaFsNMAAVBgDwABUGMAAWBwAAAAAAAAAYMAAh58BPgZOwABUNsAAVDsAAIPuYMAAh3EBHMAAVD0uwABOk8AAcOABAAGAwABUV8A1oWwAwABxNk7AAFRswABUdQAAwABOcmDAAIefAR/AAFR7wACHwQEAAYHAAFSEwDWhywBGwABUksAAVM/AAFSlAAAAgpBgwABidgAcwABUuxbAAFStLrudwABw4MAAcS67twEAAYDAAFTJwDWhbADAAHFmPgJOwABVP8AAVUoAAMAATpZgwACHnwEcwABVTC7AAE6RwABw4AEAARbAAFVhg8AAVVzANaIwliDAAGJ4AMAAcTc9HMAAVX6EwABVc8A1omrAAE6XAQABgcAAVYnANaHLAMAAh7ROwABVq8AAVbgAAMAATphgvKUBHMAAVcgWwABVui67ncAAcODAAHEuwABOmQEAAYDAAFXYwDWhbADAAHFiQ8AAVeQhHMAAVfiDwABV68A1os1IAQABKwDAAP0pPgQ9HMAAVk4uwABOmgIAAoDAAFZfwDWhbIPAAFZkwDWizQDAAHE7TsAAVoTAAFaNAADAAE6bYMAAh58BHMAAVo8uwABOkcAAcOABAAGDwABWn8A1os0AwABxNz0cwABWv4TAAFa2wDWjT63mAQABgcAAVtPANaHLAMAAh7U9i8AAV7zANaLNHMAAV9kWwABXyy67ncAAcODAAHEuwABOmQEAAYPAAFfpwDWizQDAAHFiSsAAWAYBgsAAWA3ANaH9AMAA/MAGwABxOIFAwABYJsAAWCvAAFpCAADAAE6cwABw4AAAAAEDwABYUcAAWkIAAAABAQHAAFhlAAAAg+5gwACHcQAAXAE+A07AAFjawABY3gAAmcJgvKUBFsAAWOWAwABY4MA1pByZwsAAh31JwABY7iIhHMAAWPaBwABY8sA1pDFIAQABFsAAWQkWwABY+S6zv8AAcODAAHEtms+4OADAAP0pABzAAFkwFsAAWSIuu53AAHDgwABxLsAATp0BAAGBwABZQ8A1pDEAwABxZD4CTsAAWVrAAFllAADAAE6WYMAAh58BHMAAWWcuwABOkcAAcOABAAEWwABZhxbAAFl3LrO/wABw4MAAcS2az7g4AMAAcTc9HMAAWaiCwABZncA1pLrAAE6XAQABgMAAWbPANaQcAMAAh7Q/ScAAWcQiIRbAAFnOgMAAWcnANaQcqPXAAIeXACEcwABZ8BbAAFnlgMAAWeDANaQcwABOlMAAh3dIAQABKwDAAP0pPgE9HMAAWgEuwABOnMAAcOABAAEWwABaLYDAAFoowDWkHMAATpTAAId3AMAAcTg/BsAAcTqBQMAAWkfAAFpMwABb3wAAu6cAAAABA8AAWmzAAFvfAAAAAwEBwABaeQAAAJnCYLylAALAAFqKAAAAu6hgwAD6CgFqwABaoGDAAPoKAMAAWqwAAAC7qWDAAPoKAWrAAFrEYMAA+goAXAE+BE7AAFrlwABa6gAAg+5gwACHcQEWwABbARzAAFrsLsAATpHAAHDgAQABgMAAWvzANaW+AMAAcTeD7sAAh6I9HMAAWwsuwABOnMAAcOABAAGDwABbMsA1pgUAwABxOEnAAFs9gcAAW0HANaXMPgE9F8AAW2SDwABbX8A1pgW7hynAAIeZP0nAAFuNgsAAW5HANaXmPgE9F8AAW7aDwABbscA1pgW7iCnAAIeaPwbAAHE7gUDAAFvkwABb6cAAXSEAAMAATpoAAAABA8AAW/nAAF0hAAAAAgICwABcBgAAAK4QYLylAMAAXCQAAACE6GC8pQAAXAE+Ak7AAFyywABcuAAAoNZdwAD9ZwFgvKUBHMAAXMwWwABcwi61/MAAcTGZFQIAAoHAAFzYwDWm6DTAAFzfA8AAXN/AAFz7AAAAAAAAAF3AAP1nAWC8pQFKwABc5QEewABc6cAAwOIAAWC8pQAAAMAA/MA9HMAAXQiCwABdAsA1pvtWAQABgMAAXQzANabbAMAA/XQGwABxOYFAwABdJsAAXSvAAF8fAADAAE6ewABw4AAAAAEDwABdN8AAXx8AAAACAgLAAF1EAAAAg3tgvKUAwABdUwAAALvuYLylAABgwAD6CgE+BkAcwABdbhbAAF1jLsAATm/AAHDgwABxLIdBAQABgMAAXXrANae7AMAA/LjAAF1jwABdfAEkwABdsgMnwABOn4DAAF2VwDWnuyfAAE6gTsAAXcLAAF3LAADAAE5yYMAAh58BHMAAXdcWwABdzS7AAE5vwABw4MAAcSxLAQABgcAAXdjANafIAMAA/LlAIRzAAF3wgsAAXefANagsSAEAASsAwAD9KcAAXefAAF33AR7AAF4BtacCAAKBwABeCsA1p8gkwABeQwYnwABOdIHAAF4fwDWnyCeDSRbAAF4mgcAAXiTANafIhYDAAP0wJ8AATnUWwABeNy7AAE5vwABw4MAAcSwATsAAXl7AAF5xAADAAE52YMAAh3EBHMAAXocWwABecy7AAE5uwABw4MAAcStLAQABgMAAXojANae7AMAA/LlAIRzAAF6qg8AAXpfANajjSAEAASsAwAD9KcAAXpfAAF6xAR7AAF67tacCAAKAwABexMA1p7skwABe5QInwABOd4DAAF7jwDWnuwBKwABe7QEcwABe/YLAAF70wDWoLMAATngBAAGDwABfCMA1qOMAwACHrAbAAHE8gUDAAF+owABfrcAAYuUAALu/AAAAAQPAAF/EwABi5QAAAAICAsAAX9gAAAC7vmC8pQDAAF/4AAAAwABOoWC8pQAAYMAA+goBPgZOwABgHcAAYCwAAMAATqJgwACHcQEcwABgQhbAAGAuLsAATm7AAHDgwABxK0sBAAGBwABgQ8A1qcsAwAD8uUnAAGBUIiEWwABgaILAAGBZwDWp5LuIwACHkgAhFsAAYJyCwABgjcA1qeS7h8AAh5E+AUrAAGDrASo/TsAAYQzAAGEiAADAAE6jYMAAh58BHMAAYS4WwABhJC7AAE5vwABw4MAAcSxLAQABgMAAYS/ANam+AMAA/LlJwABhSBzAAGFig8AAYUzANapdwABOeQEAAYLAAGFuwDWp5ADAAIerPgFKwABhvgEpP0bAAGHVwABiNsAAYe0AAACuEGDAAIdxABbAAGIfg8AAYgnANapdwABOpMAAh78+AUnAAGI+HMAAYlOEwABiQsA1qtXAAE55AQABgsAAYl/ANankAMAAh4g+AUrAAGK2ASk/SsAAYtUBKgbAAHE9gUDAAGO7wABjwMAAZPwAALvAAAAAAQPAAGPWwABk/AAAAAICAsAAY+oAAAC7vmC8pQDAAGQKAAAAwABOpWC8pQAAYMAA+goBPgJOwABkNsAAZDwAAJpRYMAAcUEBNQAAAAEAXcAA/KUCYLylYMAAcUEBFsAAZEYuwABOjsAAcODAAHEvNQAAAAEAYLylAYDAAGRkwDWrXzUAAAABAGDAAHFBARzAAGRjgsAAZGPANauYSwEAAYPAAGRjwDWrvwDAAPy5IxzAAGR4hADANavSSAEAASsAwAD9KTUAAAABAGDAAHFBAR/AAGSMwABxSwAAAAA1AAAAAQBcARzAAGRjgsAAZGPANauYgL8CAAKDwABkY8A1q7+FAMA1rBQAwAD8uoUAwDWsFIQAwDWr0gFgwABxQUrAAGSuARzAAGS7gsAAZLXANauFwABOpgMAAy6AwABk2sA1q1+BwABk7sA1q2wAwABxRwbAAHE+gUDAAGVRwABlVsAAZjQAALvBAAAAAQPAAGVswABmNAAAAAICAsAAZXkAAACDe2C8pQDAAGWIAAAAu+5gvKUAAGDAAPoKAT4CTsAAZarAAGWwAACaUWDAAHFMATUAAAABAF3AAPylAmC8pWDAAHFMARbAAGW6LsAATo/AAHDgwABxMDUAAAABAGC8pQGAwABl1sA1rMo1AAAAAQBgwABxTAEcwABl1YLAAGXVwDWtAUsBAAGDwABl1cA1rSgAwAD8uSMcwABl2YQAwDWtO0gBAAErAMAA/Sk1AAAAAQBgwABxTAEfwABl4cAAcVUAAAAANQAAAAEAXAEcwABl1YLAAGXVwDWtAYC/AgACg8AAZdXANa0ohQDANa19AMAA/LqFAMA1rX2EAMA1rTsBYMAAcUxKwABmAQEcwABmDoLAAGYIwDWs7rvBAwADLoDAAGYrwDWsyoHAAGYuwDWs1wDAAHFRAAA1nkIANZ89ADWfugA1oTwANaPsADWllAA1pq8ANaeLADWplAA1qzUANaygADWuBwAAAAsCwABxQYFAwABmwsAAZsjAAHG1A8AATqcAAAFgwAD9HAAAAgTAAHFEgUDAAGdCwABnVBjAAE6owABw4ABdwAD9ZwFgvKUBKwTAAHFFgUDAAGfEwABnyBipCMAAcOAAXcAA/KUCYLylYMAAcVYBKwEFwABxSwAAAAAEAAADAAAAAAAAAAAAYMAAcUEBPwEJAQDAAP0yAAAAAAIGwABxR4FAwABobMAAaHHAAGoLAADAAE6mAAAAAQPAAGiJwABqCwAAAAMDA8AAaKAAAACEIWDAAHEoAMAAaLsAAAC7vmC8pQDAAGjbAAAAwABOpWC8pQAAYMAA+goBPgROwABo9QAAAJceYMAAcVYAScAAaP4cwABpBxbAAGkCLqkIwABw4MAAcUVIAQABKwDAAP0pPgE9F8AAaRguqQjAAHDgMsAAaR9gvKVgwABxVgDAAHFFPgE9i8AAaTbANa82HMAAaUAWwABpPC6pCMAAcODAAHFFSwEAAYLAAGlBwDWvHQDAAPy5ScAAaVccwABpX4PAAGlbwDWvNkgBAAErAMAA/Sk+AT2LwABpcMA1rzY1AAAAAQBdwAD8pQJgvKVgwABxVgEWwABpdi6pCMAAcODAAHFFNQAAAAEAYLylAYLAAGl7wDWvHTUAAAABAGDAAHFWARzAAGmILsAATqnAAHDgAwADgMAAabTANa8BgcAAab3ANa8QgsAAadHANa8dAMAAcUk1AAAAAQBcARzAAGl6hMAAaXrANa/ngL8CAAKFwABpesA1sAyGAMA1sB8AwAD8uoYAwDWwHz9KwABp5wEcwABp8oPAAGnuwDWvNsAATqoBAAGAwABp/8A1rwEAwABxXAbAAHFJgUDAAGoQwABqGcAAcbMAAMAATqnAAHDgAAAAAQPAAGo5wABxswAAAAMDA8AAalAAAACEIWDAAHEoAMAAamsAAAC7vmC8pQDAAGqLAAAAwABOpWC8pQAAYMAAcVYBPghOwABqr8AAasYAAMAATqtgwACHcQEcwABq7BbAAGrYgMAAatDANbDqwABObsAAcODAAHErSwEAAYHAAGrtwDWw+QDAAPy5ScAAawccwABrHhbAAGsLLsAATqjAAHDgwABxREgBAAErAMAA/Sk+Az0XwABrLy7AAE6owABw4B7AAGtIwADA4gABYLylAADAAHFEPRzAAGt1FsAAa2IuwABOqMAAcODAAHFEgKUBAAEcwABrnoPAAGt8wDWxH8AATnoCAAEawABrwsAAh3YBwABOfCrAAIeJAMAA/XVGwABr3sAAbFLAAGv2AAAArhBgwACHcQAWwABsOxzAAGwmFsAAbByAwABsFMA1sOrAAE5vwABw4MAAcSxLAQABgcAAbCfANbD5AMAA/LnAAE6kwACHvz4BPRzAAGxvFsAAbFwuwABOqMAAcODAAHFEgKUBAAEcwABslITAAGx2wDWyAsAATnoCAAEawABsuMAAh3YBwABOfCrAAIeJAMAA/XU/TsAAbPLAAG0AAADAAE6sXcAA/WcBYLylAR7AAG0GwADA4gABYLylAABPwABtH8AAbSQAAAHAAE6tYQFgwACHcVwAA8AAbTTAAHCRAAAAAQEBwABtSAAAAMAATq5gwACHcQAAXAE+AUbAAG1bwABtk8AAbWwAAADAAE6vYLylABbAAG1/LsAATqjAAHDgwABxRD4DTsAAbbDAAG3EAADAAE6wYMAAh3EBHMAAbe4WwABt2oDAAG3SwDWw6sAATm7AAHDgwABxK0sBAAGHwABt78A1swwAwAD8uUnAAG4JIiEcwABuHITAAG4OwDWynYMXAQABFsAAbi+GwABuJcA1su2ZwsAAh30AwAD9cwAcwABuVxTAAG5DwDWzMAgAwABOeQEAAYbAAG5jwDWy7QDAAIeIPgE9HMAAbyaEwABvGMA1sp1WAQABFsAAbzSGwABvKsA1su2ZwsAAh30AwAD9dD9JwABvTBzAAG9ahsAAb1DANbLtwABOeQEAARTAAG9mwDWzMAgAAMAAh4g+AT0cwABwZYTAAHBXwDWynVYBAAGHwABwacA1swwAwAD9dD9OwABwocAAcK4AAMAATrFgwACHnwEcwABwwhbAAHC4gMAAcLDANbDqwABOb8AAcODAAHEsSwEAAYLAAHDDwDWxBgDAAPy5PRzAAHDkhcAAcNTANbLKIAEAARbAAHDyhsAAcOXANbRMg+7AAIeiAABGwABw/sAAcVbAAHEWAAAArhBgwACHcQAWwABxP4bAAHEywDW0TMAATqTAAIe/PgE9HMAAcW6FwABxXsA1ssogAQABh8AAcW/ANbTDAABKwABxjQEfwABxmMAAcV4BAAGEwABxocA1sp0AAAA1rtUANbC6ADW1JAAAAAICwABxTIFAwAByBMAAcgrAAHj3A8AATrIAAAFgwAD9HAAAAQTAAHFPgUDAAHJCwAByRhipCMAAcOAAXcAA/KUCYLylYMAAcVYBKwEFwABxVQAAAAAEAAADAAAAAAAAAAAAYMAAcUwBPwEJAQDAAP0yAAAAAAIGwABxUYFAwAByq8AAcrDAAHP6AAC7wQAAAAEDwAByxsAAc/oAAAADAwPAAHLkAAAAhCFgwABxKADAAHL5AAAAg3tgvKUAwABzCAAAALvuYLylAABgwAD6CgE+BE7AAHMaAAAAlx5gwABxVgBJwABzIxzAAHMsFsAAcycuqQjAAHDgwABxT0gBAAErAMAA/Sk+AT0XwABzPS6pCMAAcOAywABzRGC8pWDAAHFWAMAAcU8+AT2LwABzW8A1tgccwABzZRbAAHNhLqkIwABw4MAAcU9LAQABgsAAc2bANbXwAMAA/LlJwABzdBzAAHN8g8AAc3jANbYHSAEAASsAwAD9KT4BPYvAAHONwDW2BzUAAAABAF3AAPylAmC8pWDAAHFWARbAAHOTLqkIwABw4MAAcU81AAAAAQBgvKUBgsAAc5jANbXwNQAAAAEAYMAAcVYBHMAAc50uwABOs8AAcOADAAOAwABzvMA1tdSBwABzxcA1teOCwABzyMA1tfAAwABxUzUAAAABAFwBHMAAc5eEwABzl8A1triAvwIAAoXAAHOXwDW23YYAwDW28ADAAPy6hgDANbbwP0rAAHPWARzAAHPhg8AAc93ANbYHwABOqgEAAYDAAHPuwDW11ADAAHFcBsAAcVOBQMAAdG7AAHR3wAB49QAAwABOs8AAcOAAAAABA8AAdJXAAHj1AAAAAwMDwAB0swAAAIQhYMAAcSgAwAB0yAAAAIN7YLylAMAAdNcAAAC77mC8pQAAYMAAcVYBPghOwAB06cAAdPIAAMAATnJgwACHnwEcwAB1BhbAAHT8gMAAdPTANbe7wABOb8AAcODAAHEsSwEAAYHAAHUHwDW3ygDAAPy5QCEcwAB1KYPAAHUgwDW37kgBAAErAMAA/SnAAHUgwAB1MAEewAB1OrWnAgACgcAAdVDANbfKJMAAdZEGJ8AATnSBwAB1ZcA1t8ong0kWwAB1bIHAAHVqwDW3yoWAwAD9MCfAAE51FsAAdYWAwAB1fcA1t7vAAE5vwABw4MAAcSwATsAAdavAAHWzAACEgV3AAP1nAWC8pQEewAB1ucAAwOIAAWC8pQAAScAAddIcwAB13oDAAHXWwDW3u8AATp7AAHDgAgACgcAAdevANbfKgsAAde7ANbfXAMAAcTk+AT0cwAB2Q4TAAHY7wDW4tVYBAAGBwAB2R8A1t8oAwAD9dD9PwAB2i8AAdpAAAAHAAE60XgABAgFgwACHcQHAAE58YMAA+goAXAADwAB2osAAd5MAAAACAQHAAHa2AAAAg+5gwACHcQABwAB2wgAAAMAATnxgwAD6CgFqAGDAAPzZd1wBPgE9HMAAdtiGwAB208A1uWrAAE5zAwACNMAAdugDwAB26MAAd2QAAAABAQHAAHb1AAAAwABH8GC8pQAAYMAA/NkBPgJJwAB3AhzAAHcOgMAAdwbANbe7wABOnsAAcOACAAIUwAB3G8A1ucEIAILAAHcewDW31wDAAHE5PgE9HMAAdzaEwAB3LsA1uLVWAQABFMAAdzrANbnBCAAAwAD9dD9KwAB3UAErGsAAd3nAAId2AcAATnyHwAB3hsA1uXrAAIeLPRzAAHfbhcAAd8nANbk5IAIAARbAAHflg8AAd9zANbfug+7AAIeiAcAATnwpAEbAAHf/wAB4U8AAeBcAAACuEGDAAIdxABbAAHg8g8AAeDPANbfuwABOpMAAh78+AT0cwAB4p4XAAHiVwDW5OSACAAGGwAB4qMA1uo8BwABOfCoASsAAeNUBH8AAeODAAHFeAQABhMAAeOnANbi1AAAANbWqADW3iwA1uvUAAAACAsAAcVaBQMAAedPAAHnZwACAJQPAAE61AAABYMAA/RwAAAIEwABxWYFAwAB7RsAAe00YwABOtsAAcOAAYMAA+goABMAAcVqBQMAAe2LAAHtqGJu1wABw4ABdwAD9ZwFgvKUAAQXAAHFegUDAAHtvwAB7b8AAe/oAAAADwAB7d8AAe/oAAAABAQHAAHuJAAAAhIFdwAD9ZwFgvKUAAGDAAHFWAT8DCADAAHFZIxbAAHusgMAAe6TANbuPgVXAAPxWKisBYMAA+goIAMAAcVojFsAAe9+AwAB718A1u4+DssAA/FeAwAB77MA1u48rAV3AAP1nAWC8pQkBwAB7b8AA/TIAAAAAAQbAAHFcgUDAAH6BwAB+hsAAgCMAAMAATqoAAAABA8AAfpLAAIAjAAAAAQEBwAB+qQAAAIQhYMAAcSgAAGDAAPoKAT4DScAAfrghHMAAfsQWwAB+vC7AAE62wABw4MAAcVlIAQABKwDAAP0pSsAAfs0BFsAAftQuwABOtsAAcODAAHFZP0bAAH7hwAB/A8AAfvIAAACZwmC8pQAWwAB++S6btcAAcODAAHFaPgFJwAB/CxbAAH8xHMAAfysWwAB/F4DAAH8PwDW8OMAATm7AAHDgwABxK0sBAAGBwAB/LMA1vJkAwAD8uaj1wACHlz4DPRfAAH/DLsAATrbAAHDgKcAAcVk9F8AAf9sum7XAAHDgK8AAcVpKwAB/9AEpP0rAAIATASoAADW8DAA1vTAAAAABAsAAcV+BQMAAgCjAAIA3wACDvge7egAAAWDAAP0cAAAAAQXAAHFoAAAAAAQAAAMAAAAAAAAAAABgwABxXwE/AQkBAMAA/TIAAAAABgbAAHFhgUDAAIBwwACAfMAAgKUAAsAATpIAAAABA8AAgIrAAIClAAAAAQEBwACAoQAACJnCYLylAABgvKUABsAAcWKBQMAAgbPAAIG/wACB6QACwABOmQAAAAEDwACBzsAAgekAAAABAQHAAIHlAAAImcJgvKUAAGC8pQAGwABxY4FAwACCGsAAgh7AAIJKAALAAE6VAAAAAQPAAIIvwACCSgAAAAEBAcAAgkYAAAiZwmC8pQAAYMAA+9AABsAAcWSBQMAAgrfAAIK8wACC6QACwABOnQAAAAEDwACCzsAAgukAAAABAQHAAILlAAAImcJgvKUAAGDAAPoKAAbAAHFlgUDAAIMcwACDKMAAg1AAArK0AAAAAQPAAIM1wACDUAAAAAEBAcAAg0wAAAiZwmC8pQAAYLylAAbAAHFmgUDAAIN8wACDlMAAg7wAAru3AAAAAQPAAIOhwACDvAAAAAEBAcAAg7gAAAiZwmC8pQAAXcAA/DIBYMAAYnYAAAA1vYkANb3HADW+BQA1vkUANb6FADW+wQA1vwUAAAAGAsAAcWmBQMAAhAHAAIQGwACE/wvAAE63AAABYMAA/RwAAAYEwABxa4FAwACEBsAAhAYJJwBgwAD70AAEwABxbYFAwACEBsAAhAYJKMAAcOAAYMAA/bYABMAAcW6BQMAAhAbAAIQGBikAXcAA/HQBYMAAcWkBagBdwAD8dAFgwABxacABO6QEwABxb4FAwACEPsAAhD4Gtc0AYMAAcWkBagBgwABxacAA6A4EwABxcIFAwACEiMAAhIgGtc4AYMAAcWkBagBgwABxacAA6CUEwABxcYFAwACE9sAAhPYGtc8AYMAAcWkBagBgwABxacAA6DwBBcAAcXWBQMAAhAbAAIQGwACE/wEAAAPAAIQGwACE/wAAAAICAsAAhAYAAAQnYMAA+9AAwACEBgAABChgwAD9tgAAYMAAcWkBPwMIAMAAcWuAAMA1wD4IAMAAcW2BAMA1wEwJAADAAP0yAAAAAAEGwABxc4FAwACEBsAAhAbAAIT/AAAjAAAAAQPAAIQGwACE/wAAAAAAAABgwAD9tgFKAAEPAC7AAHFtAAA1wIcANcDBAAAAAQLAAHF2gUDAAIU5wACFPsAAhwgLwABOuAAAAWDAAP0cAAALBMAAcXiBQMAAhT7AAIU+CScAYMAA+9AABMAAcXqBQMAAhT7AAIU+CSjAAHDgAGDAAP22AATAAHF7gUDAAIU+wACFPgYpAF3AAPx0AWDAAHF2AWoAXcAA/HQBYMAAcXbAATu3BMAAcXyBQMAAhXHAAIVxBrXMAGDAAHF2AWoAYMAAcXbAAOhTBMAAcX2BQMAAhaTAAIWkBsAATrkAYMAAcXYBagBgwABxdsAA6GoEwABxfoFAwACF2cAAhdkGwABOugBgwABxdgFqAGDAAHF2wADogQTAAHF/gUDAAIYTwACGEwbAAE67AGDAAHF2AWoAYMAAcXbAAOiYBMAAcYCBQMAAhlHAAIZRBsAATrwAYMAAcXYBagBgwABxdsAA6K8EwABxgYFAwACGjMAAhowGwABOvQBgwABxdgFqAGDAAHF2wADoxwTAAHGCgUDAAIbHwACGxwbAAE6+AGDAAHF2AWoAYMAAcXbAAOjfBMAAcYOBQMAAhwTAAIcEBp1IAGDAAHF2AWoAYMAAcXbAAOj3AQXAAHGHgUDAAIU+wACFPsAAhwgBAAADwACFPsAAhwgAAAACAgLAAIU+AAAEJ2DAAPvQAMAAhT4AAAQoYMAA/bYAAGDAAHF2AT8DCADAAHF4gADANcKmCADAAHF6gQDANcK0CQAAwAD9MgAAAAABBsAAcYWBQMAAhT7AAIU+wACHCAAAIwAAAAEDwACFPsAAhwgAAAAAAAAAYMAA/bYBSgABDwAuwABxegAANcLvADXDKQAAAAECwABxiIFAwACHRcAAh0vAAItRA8AATr8AAAFgwAD9HAAACQTAAHGKgUDAAId3wACHewmCZwBgwABxdgAEwABxi4FAwACHl8AAh54JhIEAXcAA/HQBYLylAATAAHGMgUDAAIg+wACIgwa1zABgwABxiAFqwACIUmDAAHGIwAE65gTAAHGNgUDAAIijwACI6gbAAE65AGDAAHGIAWrAAIi4YMAAcYjAATr6BMAAcY6BQMAAiQrAAIlRBsAATroAYMAAcYgBasAAiR9gwABxiMABOw4EwABxj4FAwACJccAAib4GwABOuwBgwABxiAFqwACJiWDAAHGIwAE7IgTAAHGQgUDAAInewACKKwbAAE68AGDAAHGIAWrAAIn2YMAAcYjAATs2BMAAcZGBQMAAikvAAIqWBsAATr0AYMAAcYgBasAAimJgwABxiMABO5AEwABxkoFAwACKtsAAiwEGwABOvgBgwABxiAFqwACKzWDAAHGIwAE7SgIFwABxloFAwACHo8AAh6PAAIffAAAAA8AAh7HAAIffAAAAAQEBwACHtwAABISBXcAA/HQBYLylAABgwABxiAE/AwgBwABxi4AAwDXE0ggAwABximrAAIfcYMAAcXbAAOj3CQHAAIejwAD9MgAAAAAFwABxl4FAwACH5MAAh+rAAIgdAZVJAAPAAIgBwACIHQAAAAEBAcAAiAcAAASCZ2DAAHF2AABgwABxiAE/AwgBwABxioAAwDXFQggAwABxiysJAcAAh+rAAP0yAAAAAAEGwABxlIFAwACLBsAAixnAAItPAAAjAWrAAIsHYMAA/RwCAAABA8AAiyHAAItPAAAAAAAAAGDAAP22AUrAAIsnASTAAItPBSfAAE7AFsAAizgugmfAAHGKJ8AATsEWwACLRi6EgcAAcYsngyEAADXFfAA1xegAAAABAAABgUAANcX3ADV0xQA1e5MANZxgADWuPAA1tTUANbsGADW9PQA1vyYANcDOADXDNgA1xfUAAAAKADXF9wAAAAAAAADAAHGYwABOwoFBAAAMgPgAAMAAvZcAAQEBnv6BHgAAgi6CBgCBRgAAwACE3gAAgWAAAKQzAACBewAAvJAAAIGfAADAAEKhAACBygAAwAB0fwABAQHAAE7DggYAAMAATQsAAIIeAAC9sAAAgkMAAMAAcoAAAIJiAADAAJwxAACCggAAwABBDAAAAAAAAgLAAHGZgUGDdYN7hY8Ds3kAAAFgwAD9HAAAAQTAAHGbgUGDpoPKCbMoAF3AAMI2AWDAAJw2AR+DssAAwuIAAWDAAJw2AAABBcAAcaQAAAAABAAAAwAAAAAAAAAAAGDAAHGZAT8BCQEAwAD9MgAAAAAFBsAAcZ2BQYPPg9SEdAAAVgAAAAEDg9eEdAAAAAEBAYPoAAAAliBgwACcNgAAXAE+BEmD9xaEA4CD+8A1x1XAAE7EwACcQUqEEQA/SYQdFoQpgIQhwDXHVbdJwACcQEqEMgA/PRyERBaEPi6zKMAAcZuEIgEAAYCETMA1x1UAwADCRD0XhGKAhFrANcdVt0kpwACcQAbAAHGegUGEeYR+hL4AAIClAAAAAQOEhIS+AAAAAQEBhJ8AAACd6l3AAPwyAWDAAJw2AABcAT4BPRyEroCEqsA1x+qD+AEAARaEti5WwABxnQDAAPxCBsAAcZ+BQYTDhNOFRAAAhFkAAAABA4TZhUQAAAAAAAAAYMAAnDYBPgNOhPKE+gAAliBgwACcNgEchQIWhPwusyjAAHGbnxAAAAAAwADCQT0XhR2AhRXANchKt0kqwACcQEqFMgGAhTnANchKBsAAcaGBQYVJhVKFagEAgVUAAAABA4VahWoAAAAAAAAAYMAA+goBSoVdARaFYxaFXS6zKMAAcZuBVcAA/FYGwABxooFBhW+Fd4WNAQBhAAAAAQOFfoWNAAAAAAAAAGDAAPvQAUqFgQEWhYcWhYEusyjAAHGbYcAAzJAAADXHNgA1x8oANcggADXIjAA1yMoANckGAAAABQLAAHGlgUGFkoWYlpwDtVoAAAFgwAD9HAABYMAAQS0EBMAAcaeBQYXWhd4Yqj4AYMAAcoQBKwTAAHGogUGF9YYACaTMAGDAAE0PAATAAHGqgUGGFIYdCaUywABxmABgpDYABMAAcauBQYY7hk8JwABOxcAAcZgAYMAAQqwAAQXAAHG1gUGGVIZUhqkAAAADhmWGqQAAAAMDA4ZyAAAEpTJgpDYAhoIAAASkzGDAAE0PAIaUAAAEwABOxWDAAEKsAABgwABxpQE/BAgBwABxqoAAwDXJvAgBwABxqIEAwDXJxwgBwABxq4IAwDXJ1AkBhlTAAP0yAAAAAAYGwABxrYFBhq6GuYbRAQCAvQAAAAEDhr6G0QAAAAAAAABgwAD9tgFKhsEBJ8AATsYGwABxroFBhtaG7ocqAQCweAAAAAEDhwKHKgAAAAAAAABgvdYBSocLARaHFxaHCy6kzMAAcaiweMAATRgGwABxsIFBhy+HVofnAAC2bAFqhzBgwAD9HAIAAAEDh2GH5wAAAAEBAYdxAAAAgedgvMwAAGDAAEEyAT4DPReHfS6qPhyHiC7AAE7HAQABgIegwDXKsgDAAHGxwABxpz0ch7QWh6suqj7AAHGnwABOyAAAAADAAHKTSofOARyH1S7AAE7JAAAAAMAAcbMGwABxsYFBh+yH+4k/AADAAE7HAAAAAQOIEok/AAAAAQEBiCIAAACB52C8zAAAYMAAcoQBPgFKiC4BH4g5wABzAAgACBaIXxaIVS6lMsAAcZjAAHGqeqRCFoh6FohwLqUywABxmMAAcaqCzqRQFoiWFoiMLqUywABxmMAAcaqkuqRfFoiyFoioLqUywABxmMAAcaqBcqReJojKARaIyi6kzMAAcahgwAB+3BaI+haI6RaI3y6lMsAAcZjAAHGqpJukOLTHvaCAiRjANcs4FokmLsAATsXAAHGYwABxqwAGwABxsoFBiUSJW4nBAADAAE7KAAAAAQOJcYnBAAAAAQEBiX8AAACWIGC8twAAXcAA/DIBYLy3AT4BSomOARyJnhaJlS6qPsAAcafAAE7KAQABgIm1wDXMFgDAAHKdBsAAcbOBQYnGieGWmgAAwABOyQAAAAEDie2WmgAAAAAAAABgwABBMgE+Dj0cif8WifYuqj7AAHGngogAAAAAwABysU6KQIpOAAC2fl3AAPylAmC8t2DAAEENATKKh2C8t2DAAEENAE6KqYq6AAC2f13AAPylAmC88GC9ywEyitJgvPBgvcsAT4rbiuAAAAHAAE7LYQJgvLdgwACcklwAA4rzj1sAAAACAgKLCgAAAIJmYLy3AIsoAAAAwABOzGDAAJySAABcAT4ITotgi2UAABJgwABBHwEci48ci3oWi3Euqj7AAHGnwABOzQEAAYOLh8A1zPwAwABynrZqAAAAAMAAQSdOi6aLsgAAwABJ6GDAAPoKARyLyxaLwBaLtC6kzMAAcai3b8AATRPAAEt2AQABg4vdwDXM/ADAAGpOTov7AAAAhTRgvcsATowbAAAAgpBgvcsASYwohowswDXNVz4BPY+MQ8A1zZEVjFDANc2dCBaMaxaMVy6weMAAca6eYr3YSYyFJYyQg4yJwDXM/GC8zD4CPY+MrcA1zZEWjMqEjLrANc0HgpDAAJw8PRWM2MA1zZ0IFozzFozfLrB4wABxroU1vdo+Aj2PjRjANc2RFo05Fo0lLrB4wABxrp5ivdg9FY1OwDXNnQgWjWWEjVXANc0HgpDAAJw8To1/jYwAALZjYMAA+goBIiEcjfSHjenANc2RSAEAASsAwAD9KQAWjjUcjiEWjg0usHjAAHGugVUBAAGHjinANc2RAL4As/G9uU6OU45gAAC2YmDAAPoKARyOfISObMA1zQe2YgAAAADAAJyiPRyOvoCOscA1zJaAvwIAAoOOv8A1zPwfjs3AAEF6BQADhY78wDXNHIePAsA1zZEUjw7ANc2dCAACtmMUjyzANc5OCQC2YhSPSMA1zpcKAADAAPy6To9zj4EAAMAATs5dwAD9ZwFgvMkBHo+HwADA4gABYLzJAAA9HI+uFo+oFo+fLqo+wABxp4VnwAByjsAATs8BAAE0j8kDj8mRSQAAAAICAo/XAAAAgmZgvLcAj/UAAADAAE7MYMAAnJIAAGDAAPzZAT4CPRyQIYKQDsA1zNwgAgAChJAiwDXPXIWQKsA1z2cAAEmQQiWQTYSQRsA1z1xgwAB1cz4CTpCIkI0AAIFUYMAAhRUBJpCIARyQuRaQpxaQmy6kzMAAcai77MAATSDAAE7QAQABFJDGwDXPXAQBYMAAdXMAwACE52DAAIUVPRyQ3IaQ18A1z7PAAE7RAQABNJDwA5DwkTkAAAACAgKQ9wAAAJYoYLzwAJEJAAAAm0NgvMkAAGDAAPzZAT4BPRyRJ4ORGcA1zw5WAQABFJErwDXQJQgAAMAA/XQAwACFIz8AwACg9kaRUJF5kWEAAACEjmC8yQCDkWrANc8OPgFJkYEhHJGUgJGGwDXMlodBAQABhJGgwDXQZgDAAPy4PgNOkciR2AAAwABOzGDAAJySARyR9RaR7xaR5i6qPsAAcaeFZ8AAco7AAE7SAQABhJINwDXQZgDAAKD1PRySLYWSHcA10JzAAE7TAAAAAMAAnKc9HJJfgpJMwDXM3CACAAKEkmDANdBmhZJnwDXQnAAAPz0ckpsWkpUWkowuqj7AAHGnhWfAAHKOwABO1AEAATSSuQOSuZNXAAAAAgICksAAAACA7WC88ACS5AAAAMAATsxgwACc/wAAYMAA/NkBPgJOkwuTEAAAgpBgvcsBFpMihZMSwDXRQ4KQwACcPD0ckz6Bky7ANcy6gL8CAAKEkz/ANdE4hpNMwDXRXADAAPy6AMAAoPROk3+TjgAAtoZdwAD8pQJgglJgvcsBMpO0YIJSYL3LAE6TzZPlAAC2gF3AAP1nAWCCUgEek+vAAMDiAAFgglIAAD0clCoWlBIWlAwWlAMuqj7AAHGnhWfAAHKOtobAAKCsg/gBAAE0lDIDlDKVPgAAAAICApQ/AAAAg+5gglIAlFkAAADAAE7MYMAAnboAAGDAAPzZAT4DTpSGlIsAAIFUYMAAnboBHJSqFpScFpSWFpSNLqo+wABxp4VnwAByjraGwACgrEsBAAGGlKvANdIUAMAA/LlJlLgWlMEUlLzANdI4CADAAE7VwACdwD4BPRyU84WU28A10cFWAQABhpT3wDXSFADAAP10Pz0clRqElQzANdGhgL8CAAKGlRvANdIUFpUzh5UjwDXSH4KQwACcPADAAPy6AMAA/MROlWGVaQAAtnZgwABBMgEflW/AAEFmBwAHFpWXLqTMwABxqByVwRaVrC7AAE7FwABxmMAAcauCiAEAARaVxy6kzMAAcagAwABCtICV3cA1zJaBlfTANcy6hZYOwDXRwRaWOBaWLy6qPsAAcae2gcAAcoaEllvANdGhAD0clnoWlnEuqj7AAHGngkIAAAAAwAByskqWiAGGlo/ANdLcAAA1yh0ANcpNADXKiQA1yxYANcv0ADXMUgA103gAAAAGAAABgUEANdObADXGxQA1ySMANdOZAAAAAgA105sAAAAAAAAAwABxtsAATtaBQgAABID0AADAAGjOsMsAgTYAAMAAYIgAAIFcAADAAE0LAAEBAaSXgYkAAL7aAAAAAAABAsAAcbmBQoJmgmyRBwPAAE7XAAABXcAAYKUCYMAAQIpgwABNDwAAAAEFwABxzoFCgsCCxoLeAQAAA4Lcgt4AAAAAAAAAYMAAcbkBPwEJAYLGwABgugAAAAASBsAAcbuBQoLjgviELAAAvEsBaoLkYMAA/RwCAAABA4MIhCwAAAACAgKDKQAACIX/YMAAYgwAg0AAACikzGDAAE0PAABgwABAigE+AkmDUxyDcxaDY4GDV8A11Im3c8AATRS5swEAARaDlBaDj4CDhsA11HyCkMAAYYSWIMAAYngAwAB53T4BSoOmASaDpgEWg80Wg7mBg63ANdSJsHjAAE0YtOS942DAAECKP0qD5AEeg+/AAECWAgACFoQTFoQOgIQFwDXUfIKQwABhhJYgwABieIGEHMA11IkABsAAcbyBQoQxhEaE3wAAwABFgQFqhDJgwAD9HAIAAAEDhFmE3wAAAAICAoR9AAAIhf9gwABiLQCElAAAKKTMYMAATQ8AAGDAAECKAT4BSoSnASaEpwEchMIWhLeAhK7ANdVZwABEfMAAYi+ETQIAAi6BhM/ANdVmAMAAYNpgwABAigbAAHG9gUKE5IT5huEAALw0AWqE5WDAAP0cAgAAAQOFBIbhAAAAAgIChRkAAAiF/2DAAGEuAIUwAAAopMxgwABNDwAAYMAAQIoBPgJJhYMehYfAAGj6AQABgIWdwDXV2QA+AUmFsBaFvYCFtMA11dnAAEWGwABhNj4BSoXUASaF1AEWhfsWheeBhdvANdXmsHjAAE0YtOe952DAAECKPgJAIhaGLoCGJcA11dnAAEWIwABhOQEWhk2AhkTANdXZwABFicAAYTqGJYZfAEqGagEmhmoBFoaRFoZ9gYZxwDXV5rB4wABNGIV/vdxgwABAij9KhqwBJoasARaG0xaGv4GGs8A11eaweMAATRiF373dYMAAQIoGwABxvoFChuaG+4eBAADAAEV+AWqG52DAAP0cAgAAAQOHEIeBAAAAAgIChzYAAAiF/2DAAGHwAIdNAAAopMxgwABNDwAAYMAAQIoBPgFKh2ABJodgARaHcICHZ8A11vC038AAYfJgwABAigbAAHG/gUKHhoebiCoAAMAARX8BaoeHYMAA/RwCAAABA4eriCoAAAACAgKHzAAACIX/YMAAYgAAh+MAACikzGDAAE0PAABgwABAigE+AUqH9gEmh/YBFogdFogJgYf9wDXXaLB4wABNGLTtve1gwABAigbAAHHAgUKIL4hEiMMAAMAARYABaogwYMAA/RwCAAABA4hPiMMAAAACAgKIZAAACIX/YMAAYeAAiHsAACikzGDAAE0PAABgwABAigE+AUqIjgEmiI4BFoi1FoihgYiVwDXX2rB4wABNGIW6vd9gwABAigbAAHHBgUKIyIjdiVYAALwuAWqIyWDAAP0cAgAAAQOI5olWAAAAAgICiPkAAAiF/2DAAGFGAIkQAAAopMxgwABNDwAAYMAAQIoBPgFKiSMBJokjARaJShaJNoGJKsA12EqweMAATRiFn73bYMAAQIoGwABxwoFCiVuJcIn8AACz5wFqiVxgwAD9HAIAAAEDiX2J/AAAAAICAombAAAIhf9gwABg4ACJsgAAKKTMYMAATQ8AAGDAAECKAT4BSonFASaJxQEWiewWidiBiczANdi6sHjAAE0YhTW92mDAAECKBsAAccOBQooBihaKrAAAhaoBaooCYMAA/RwCAAABA4ooiqwAAAACAgKKSwAACIX/YMAAYh0AimIAACikzGDAAE0PAABgwABAigE+AUqKdQEminUBFoqcFoqIgYp8wDXZKrB4wABNGIU1vdpgwABAigbAAHHEgUKKsYrGjDkAALwxAWqKsmDAAP0cAgAAAQOKzow5AAAAAgICiuAAAAiF/2DAAGEUAIr3AAAopMxgwABNDwAAYMAAQIoBPgRJiwocixeAiw7ANdmNtREAAAAAwABhI0qLIwEmiyMBFotKFos2gYsqwDXZmrB4wABNGLTnvedgwABAij9Ji1oci2eAi17ANdmNtRAAAAAAwABhJEqLcwEmi3MBFouaFouGgYt6wDXZmrB4wABNGLTovehgwABAij9Ji6oci7eAi67ANdmNwABFmAAAAADAAGElSovLASaLywEWi/IWi96Bi9LANdmasHjAAE0YtOm96WDAAECKP0qMBwEmjAcBFowuFowagYwOwDXZmrB4wABNGIV/vdxgwABAigbAAHHFgUKMPoxTjOQAALhHAWqMP2DAAP0cAgAAAQOMY4zkAAAAAgICjIQAAAiF/2DAAGHQAIybAAAopMxgwABNDwAAYMAAQIoBPgFKjK4BJoyuARaM1RaMwYGMtcA12sCweMAATRi05L3jYMAAQIoGwABxxoFCjOmM/o18AACHLQFqjOpgwAD9HAIAAAEDjQeNfAAAAAICAo0aAAAIhf9gwABhnACNMQAAKKTMYMAATQ8AAGDAAECKAT4BSo1EASaNRAEWjWsWjVeBjUvANdswsHjAAE0YtOq96mDAAECKBsAAcceBQo2BjZaOEQAAvEIBao2CYMAA/RwCAAABA42ejhEAAAACAgKNsAAACIX/YMAAYawAjccAACikzGDAAE0PAABgwABAigE+AUqN2gEmjdoBFo4BFo3tgY3hwDXboLB4wABNGLTrvetgwABAigbAAHHIgUKOFo4rjqYAALxFAWqOF2DAAP0cAgAAAQOOM46mAAAAAgICjkUAAAiF/2DAAGG8AI5cAAAopMxgwABNDwAAYMAAQIoBPgFKjm8BJo5vARaOlhaOgoGOdsA13BCweMAATRi07L3sYMAA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AAEDwAC4j8AAuKUAAAABAQHAALiYAAAAg+5ggksAAGDAAPoKAUrAALihASkGwABzDoFEwAC4qsAAuLvAALkbAADAAE+cAWrAALirYMAA/RwCAAABA8AAuMfAALkbAAAAAQEBwAC40AAAAIPuYIJLAABgwAD6CgFKwAC43wEiIhzAALjkgMAAuN/ANoVrSAEAASsAwAD9KQElwAC49IDAALjvwDaFa2CIGAElwAC5C4DAALkGwDaFa2CIMAbAAHMPgUTAALkgwAC5McAAui4AALLYAWrAALkhYMAA/RwCAAABA8AAuUHAALouAAAAAgICwAC5UQAAAIJqYLzMAMAAuWAAAACBpmEBYLzwXAAAXAE+AT0ewAC5esAAaucEAAQWwAC5rxbAALmiLrVlwABygMAAcwSy2sAAfvUWwAC5zRbAALnALrVlwABygMAAcwSzVMAAfvGAwAC52cA2hfg0wAC56wPAALnrwAC6KQAAAAIBAcAAufIAAACA7WC88AABwAC6AwAAAMAASCJgwAD6CgFqAGDAAPzZd2DAAPzZAT4BPRzAALoXgcAAuhbANoYFIAEAAYLAALoYwDaGegAAAAbAAHMQgUTAALozwAC6WMAAwE8AAMAAT50BasAAujRgwAD9HAIAAAEDwAC6dsAAwE8AAAADAwPAALqSAAAAsHhgvdYAwAC6vgAACIDtYMAAa0sAwAC62gAAAIVnYMAAoKMAAGDAAJz/AT4JTsAAuvTAALr8AACCU2C8twEWwAC7CIHAALr+wDaHDLNYwABrTk7AALstwAC7NwAAwABLyWDAAHIRARzAALteFsAAu04WwAC7QS61ZcAAcoDAAHMEstrAAH71wABLywEAAYPAALtrwDaHNADAAGrxTsAAu4nAALuWAADAAEAMYIR+ARzAALuqhMAAu6DANodZwABL7QEAAYHAALvGwDaHDADAAHIXTsAAu9/AALvkAACCkGDAAGJPARzAALvwhMAAu+bANodZwABL7wIAAhbAALwKFsAAu/0utWXAAHKAwABzBLNUwAB+8YHAALwWwDaHDADAAHIYTsAAvDMAAACCZmC8twBOwAC8RMAAvE4AALRVYMAA+goBKknAALxbJcAAvHMWwAC8bIXAALxfwDaHo4RSglhgg1k+AT2PwAC8icA2iCocwAC8qhbAALyfFsAAvJIutWXAAHKA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xMAA1R0AAAABAQHAANTRAAAAg+5gglIAAGC9ywE+AknAANTdHMAA1OoWwADU4S7AAE+jwABygMAAcxhIAQABKwDAAP0pSsAA1PMBKz9KwADVBAEcwADVExbAANULLsAAT6PAAHKAwABzGEsBAAGAwADVFMA2misAwAD8uQbAAHMigUTAANUiwADVJ8AA1cIAAMAAT0MAAAABA8AA1TnAANXCAAAAAgICwADVTAAAAIPuYIfRAMAA1WAAAACrxWC9ywAAXAE+Aj0jHMAA1XgWwADVbC7AAE+lwABygMAAcxpIAQABKwDAAP0pF8AA1WwuwABPpcAAcoAywADVnmCH0WC9ywDAAHMaKwFdwAD8pQJgh9Fgvcs9HMAA1bEWwADVpi7AAE+lwABygMAAcxqAvwIAAoDAANWywDaayIHAANW6wDaa1QDAAPy6BsAAcyOBRMAA1cfAANXMwADWagAAwABPRAAAAAEDwADV38AA1moAAAACAgLAANXyAAAAg+5gh9EAwADWBgAAAKvFYL3LAABcAT4CPSMcwADWHxbAANYSLsAAT6bAAHKAwABzG0gBAAErAMAA/SkXwADWEi7AAE+mwABygDLAANZFYIfRYL3LAMAAcxsrAV3AAPylAmCH0WC9yz0cwADWWRbAANZNLsAAT6bAAHKAwABzG4C/AgACgMAA1lrANpuWgcAA1mLANpujAMAA/LoGwABzJIFEwADWb8AA1nTAANcSAADAAE9CAAAAAQPAANaHwADXEgAAAAICAsAA1poAAACD7mCH0QDAANauAAAAq8VgvcsAAFwBPgI9IxzAANbHFsAA1rouwABPpMAAcoDAAHMZSAEAASsAwAD9KRfAANa6LsAAT6TAAHKAMsAA1u1gh9FgvcsAwABzGSsBXcAA/KUCYIfRYL3LPRzAANcBFsAA1vUuwABPpMAAcoDAAHMZgL8CAAKAwADXAsA2nGSBwADXCsA2nHEAwAD8ugbAAHMlgUTAANcXwADXMcAA17UAALZoAWrAANcYYMAA/RwCAAABA8AA10bAANe1AAAAAQEBwADXYwAACIPuYIfRAABgvcsBPgJJwADXbxzAANd/FsAA13MuwABPpcAAcoDAAHMaSAEAASsAwAD9KUrAANeIASs/SsAA15kBHMAA16sWwADXoC7AAE+lwABygMAAcxpLAQABgMAA16zANp07AMAA/LkGwABzJoFEwADXusAA19TAANhbAAC2ZwFqwADXu2DAAP0cAgAAAQPAANfqwADYWwAAAAEBAcAA2AcAAAiD7mCH0QAAYL3LAT4CScAA2BMcwADYJBbAANgXLsAAT6bAAHKAwABzG0gBAAErAMAA/SlKwADYLQErP0rAANg+ARzAANhRFsAA2EUuwABPpsAAcoDAAHMbSwEAAYDAANhSwDad4QDAAPy5BsAAcyeBRMAA2GDAANh6wADY+QAAtmYBasAA2GFgwAD9HAIAAAEDwADYiMAA2PkAAAABAQHAANilAAAIg+5gh9EAAGC9ywE+AknAANixHMAA2MIWwADYtS7AAE+kwABygMAAcxlIAQABKwDAAP0pSsAA2MsBKz9KwADY3AEcwADY7xbAANjjLsAAT6TAAHKAwABzGUsBAAGAwADY8MA2nocAwAD8uQbAAHMogUTAANj+wADZA8AA2YUAAMAAT0AAAAABA8AA2Q7AANmFAAAAAgICwADZGwAAAIPuYIJSAMAA2S8AAACrxWC9ywAAXAE+Aj0jHMAA2UQWwADZOy7AAE+jwABygMAAcxhIAQABKwDAAP0pF8AA2TsuwABPo8AAcoAywADZZGCCUmC9ywDAAHMYKwFdwAD8pQJgglJgvcs9HMAA2XQWwADZbC7AAE+jwABygMAAcxiAvwIAAoDAANl1wDafJIHAANl9wDafMQDAAPy6BsAAcymBRMAA2YrAANmkwADaCQAAtmUBasAA2YtgwAD9HAIAAAEDwADZsMAA2gkAAAABAQHAANm9AAAAg+5gglIAAGC9ywE+AknAANnJHMAA2dYWwADZzS7AAE+jwABygMAAcxhIAQABKwDAAP0pSsAA2d8BKz9KwADZ8AEcwADZ/xbAANn3LsAAT6PAAHKAwABzGEsBAAGAwADaAMA2n/sAwAD8uQAANpCGADaTpgA2lqwANpn2ADaanAA2m2oANpw4ADadBgA2nawANp5SADae+AA2n8YANqBsAAAADAABBsAAcoOBRMAA2g7AANoTwADaVgABwABPq8AAcoAAAAABA8AA2h7AANpWAAAAAgICwADaKwAAAIPuYIJSAMAA2j8AAACAlmC9ywAAYMAA+goBSsAA2kkBHMAA2k+BwADaScA2oORIAQABKwDAAP0pAYFEADahFgA2DOkANhofADaC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AQO0qLT1AAAAAQEBtLEAAACD7mDAAJOsAABgwABBxQE+AUq0vQEctOYftMjAAHOdAQABFrTeLrghwABzoACahwEAAYC07MA2x+AAwABzlgAANseXADbHvgA2yCMAAAACAsAAc76BRcAAQV7AAEFkwABSoQPAAE/jAAABYMAAc7cAAAIEwABzwIFFwABBzcAAQdkJwABP0QBgwAB4hQAEwABzwYFFwABCB8AAQg0JuCEBasAAQd5gwAD9HAJgwAB4bgABBcAAc8WBRcAAQhLAAEISwABCRwAAAAPAAEInwABCRwAAAAICAsAAQi0AAATAAE/RYMAAeIUAwABCQAAABLghYMAAeG4AAGDAAHO+AT8DCAHAAHPAgADANsi8CAHAAHPBgQDANsjNCQHAAEISwABzvQAAAAABBsAAc8OBRcAASuzAAEr9wABSnwAAwABP2gFqwABK7WDAAP0cAgAAAQPAAEsDwABSnwAAAAMDA8AASwwAAACD7mDAAJOsAMAASxkAAACDXGDAAHPPAMAASyoAAACCZ2DAAHPpAABcAT4HTsAASzrAAEtHAAClLWDAAPvQARbAAEtQgcAAS0nANslSgJbAAHPVScAAS1scwABLbIPAAEtfwDbJdkgBAAErAMAA/PNKwABLdQA/ScAAS4IcwABLi4LAAEuGwDbJYUgBAAFqwABLl2DAAHPpwAE+4wDAAP0pPgI9HMAAS7UWwABLqC7AAE/RwABzwMAAS+oDAAOAwABLvsA2yUODwABLxMA2yXZqwABL2GDAAEJIwADprwDAAHiHSsAAS/kAP07AAEwewABMMAAApU5gwABBxQEcwABMMi7AAE/WAQABgMAATEvANslDAMAAc6JJwABMVhzAAExshMAATFrANso0SAEAASsAwAD9KUrAAEx1AD9PwABMgsAATIcAAAHAAE/lYQFgwABzbFwAA8AATJfAAE2eAAAAAQEBwABMqwAAAMAAT+ZgwABzbAAAXAE+Ak7AAEzWwABM5QAAtuFgwABCEQEewABM8cAAcy8CAAKEwABNA8A2yjSGwABNFsA2yq0AScAATTEhHMAATUSHwABNNcA2ysRIAQABKwDAAEIfPgE9HMAATWQWwABNVy7AAE/RwABzwMAAS+oDAAOAwABNbcA2yUODwABNc8A2yXaHwABNgcA2ysQAwAB4hz9BR8AATaWC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mgBgwAB4pwErBMAAeMGBUJH2kgAYwABSDcAAeJoAYMAAeKcBKwTAAHjCgVCTcZN+GMAAUg7AAHiaAGDAAHinASsEwAB4w4FQlHKUgBjAAFIPwAB4mgBgwAB4pwErBMAAeMSBUJXolf8YwABSEMAAeJoAYMAAeKcBKwTAAHjFgVCXE5cuGMAAUhHAAHiaAGDAAHinASsEwAB4xoFQmEmYWhjAAFISwAB4mgBgwAB4pwErBMAAeMeBUJkFmQ0YwABSE8AAeJoAYMAAeKcBKwTAAHjIgVCZ1JnmGMAAUhTAAHiaAGDAAHinASsEwAB4yYFQm9mb5hjAAFIVwAB4mgBgwAB4pwErBMAAeMqBUJyPnJkYwABSFsAAeJoAYMAAeKcBKwTAAHjLgVCeWJ5jGMAAUhfAAHiaAGDAAHinASsEwAB4zIFQnwafEBjAAFIYwAB4mgBgwAB4pwErBMAAeM2BUJ+xn7wYwABSGcAAeJoAYMAAeKcBKwTAAHjOgVChEKEiGMAAUhrAAHiaAGDAAHinASsEwAB4z4FQokiiXhjAAFIbwAB4mgBgwAB4pwErBMAAeNCBUKOPo6EYwABSHMAAeJoAYMAAeKcBKwTAAHjRgVCle6WOGMAAUh3AAHiaAGDAAHinASsEwAB40oFQptWm6BjAAFIewAB4mgBgwAB4pwErBMAAeNOBUKfZp+sYwABSH8AAeJoAYMAAeKcBKwTAAHjUgVCoo6ivGMAAUiDAAHiaAGDAAHinASsEwAB41YFQq+Wr+hjAAFIhwAB4mgBgwAB4pwErBMAAeNaBUKyprLsYwABSIsAAeJoAYMAAeKcBKwTAAHjXgVCtgK2LGMAAUiPAAHiaAGDAAHinASsEwAB42IFQrjSuSBjAAFIkwAB4mgBgwAB4pwErBMAAeNmBUK9tr4EYwABSJcAAeJoAYMAAeKcBKwTAAHjagVCxBLETGMAAUibAAHiaAGDAAHinASsEwAB424FQskeyVxjAAFInwAB4mgBgwAB4pwErBMAAeNyBULQotDIYwABSKMAAeJoAYMAAeKcBKwTAAHjdgVC00LTcGMAAUinAAHiaAGDAAHinASsEwAB43oFQtf22DxjAAFIqwAB4mgBgwAB4pwErBMAAeN+BULcFtw8YwABSK8AAeJoAYMAAeKcBKwTAAHjggVC4P7hWGMAAUizAAHiaAGDA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eKcBPgFKwABDowE1AAAAAQBgwAB4pwEWwABDqi7AAFI2wAB4msAAeOojHMAAQ7aAAMA479RIAQABKwDAAP0pF8AAQ6ouwABSNsAAeJofwABDvsAAeLgBAAABwABSADHAAERNYLzMARbAAEReFsAARE4us7/AAHiawAB4vLE9uLTAAHjqgADAOO/UAWDAAHinBsAAeTaBUMAARK3AAES/wABGKAEAwABSegAAAAEDwABE08AARigAAAAAAAAAYMAAeKcBPgFKwABE2QE1AAAAAQBgwAB4pwEWwABE4C7AAFI3wAB4msAAeOsjHMAARPWAAMA48JRIAQABKwDAAP0pF8AAROAuwABSN8AAeJofwABE/cAAeLgBAAABwABSADHAAEWnYLzMAhbAAEXDFsAARbMus7/AAHiawAB4vLE+uLUWwABF/BbAAEXsLrO/wAB4msAAeLyxPbi0wAB464AAwDjwlAFgwAB4pwbAAHk3gVDAAEZOwABGYMAARtoBAJrPAAAAAQPAAEZuwABG2gAAAAAAAABgwAB4pwE+AUrAAEZ0ATUAAAABAGDAAHinARbAAEZ7LpvhwAB4msAAeOwjHMAARoqAAMA48WtIAQABKwDAAP0pF8AARnsum+HAAHiaH8AARprAAHi4AQAAAcAAUgExwABGt2C8pQEWwABGyBbAAEa4LrO/wAB4msAAeLyxHriVwAB47IAAwDjxawFgwAB4pwbAAHk4gVDAAEb7wABHDcAASBoBAJrUAAAAAQPAAEcWwABIGgAAAAAAAABgwAB4pwE+AUrAAEccATUAAAABAGDAAHinARbAAEcjLpvcwAB4msAAeO0jHMAARy2AAMA48iVIAQABKwDAAP0pF8AARyMum9zAAHiaH8AARzXAAHi4AQAAAcAAUgExwABHu2C8pQIWwABH1xbAAEfHLrO/wAB4msAAeLya0rg+FsAAR/wWwABH7C6zv8AAeJrAAHi8sOa4YMAAeO2AAMA48iUBYMAAeKcGwAB5OYFQwABIO8AASE3AAEk+AQCa0wAAAAEDwABIVsAAST4AAAAAAAAAYMAAeKcBSsAASFkBNQAAAAEAYMAAeKcBFsAASFkum9vAAHiawAB47iMcwABIY4AAwDjy9kgBAAErAMAA/SkXwABIWS6b28AAeJofwABIa8AAeLgBAAABwABSATHAAEiIYLyl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AHi8sXa46hbAAGEgFsAAYRAus7/AAHiawAB4vLF3uOsWwABheRbAAGFpLrO/wAB4msAAeLyxeLjsFsAAYa4WwABhni6zv8AAeJrAAHi8sXm47RbAAGHmFsAAYdYus7/AAHiawAB4vLF6uO4WwABiEBbAAGIALrO/wAB4msAAeLyxe7jvFsAAYkIWwABiMi6zv8AAeJrAAHi8sXy48BbAAGJ3FsAAYmcus7/AAHiawAB4vLF9uPEWwABioRbAAGKRLrO/wAB4msAAeLyxfrjyFsAAYtMWwABiwy6zv8AAeJrAAHi8sX+48xbAAGMIFsAAYvgus7/AAHiawAB4vLGAuPQWwABjNRbAAGMlLrO/wAB4msAAeLyxgbj1FsAAY2oWwABjWi6zv8AAeJrAAHi8sYK49sAAUgAxwABjn2C8zAAGwAB5SoFQwABj0MAAY+LAAGSUAQDAAFKEAAAAAQPAAGPuwABklAAAAAAAAABgwAB4pwFKwABj8QE1AAAAAQBgwAB4pwEWwABj8S7AAFJFwAB4msAAeQAjHMAAY/6AAMA5BlpIAQABKwDAAP0pF8AAY/EuwABSRcAAeJofwABkAsAAeLgCAAACwABSADHAAGQjYLzMARbAAGQ0FsAAZCQus7/AAHiawAB4vLFxuOXAAFICMcAAZFxgwAB4pwEcwABkXS7AAFJOwAB4mgEAASfAAFKFAMAAeU/AAHkAgADAOQZaAWDAAHinAAA4yfEAOMrWADjL0gA4zIsAOM2WADjOZAA4z3EAONCgADjRagA40gwAONLJADjTtAA41FgAONVlADjVngA41dcAONZ7ADjXHQA42BcAONjSADjZjQA42p4AONuBADjcPAA43OAAON2iADjd7gA43joAON6GADjfKgA43+MAOOCHADjhYQA44fUAOOIsADjiZQA44p4AOOLXADjjEAA44+cAOOSeADjlQgA45mYAOOcoADjnzAA46NYAOOlzADjqZAA46wMAOOunADjsNgA47NoAOO2GADjuQgA475gAOPBYADjxMQA48esAOPK+ADjzjwA49EkAOPV6ADj2fwA494IAOPg8ADj5LgA4+e4AOPqsADj7agA4/JAAOP12ADj+YwA4/zoAOP/6ADkAuAA5AbMAOQNpADkGIAA5BwgAAABOAAABgVAAOQhLADi54QA4uzcAOMF4ADkISQAA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AAAAwAB6zYLAANdywDoScwAAwAB60z0cwADXjC7AAFNpwAB6gQAAAADAAHr+BsAAevWBV8AA1+fAANfswADaEQAAwABTXMAAeoEAAAABA8AA1//AANoRAAAAAgICwADYFgAAAIJqYMAAdTgAwADYMAAAAMAAQAxghH4AAFwBPgZOwADYU8AA2FkAAIPPYLzMARbAANhkgMAA2FvAOhd1gmrAAHU7PRzAANhyLsAAU2LAAHqBBAABgsAA2IDAOheZA8AAQAyBwADYncA6F4S0WxbAANjQgMAA2MfAOhd1tFvAAHTywABQ+hrAANkBwACiwcAAev09F8AA2RIWwADZDC6kCsAAepC4iynAAESCScAA2TAhFsAA2UoWwADZPoDAANk1wDoXdZrRwAB1PMAARdDAAGJdPgE9F8AA2aYWwADZoC6kCsAAepC4jBbAANnCgMAA2bnAOhd1mtHAAHU8wABEgz89HMAA2esWwADZ5oHAANnZwDoXhIJphJSETQEAAS4Ah2E9HMAA2f0uwABTacAAeoEAAAAAwAB6/gbAAHr2gVfAANoWwADaG8AA21sAAMAAU6/AAHqBAAAAAQPAANoxwADbWwAAAAAAAABgwAD6CgE+BE7AANpGwADaTAAAmfdgwABFKgEWwADaTi5ewAB6yUnAANqeIRzAANqrFsAA2qiAwADaosA6GO6zVcAARSxIAQABlADAAPzzSsAA2rEBKj9FwADawwHAANrVwADa2gAAg+5gwABFYQEWwADa4oDAANrcwDoY7oMZwABFHAEhHMAA2u6BwADa6cA6GUJIAQABKwDAAP0pAYnAANr3wDoZQhbAANsDgcAA2v7AOhlCg7DAAEVrQT4CScAA2xElwADbGoHAANsVwDoZQmDAAEfvQsAA2yQAP0rAANs0ASpKwADbTAEpBsAAeveBV8AA22DAANtlwADiuwAAwABTsMAAeoEAAAABA8AA24/AAOK7AAAAAgICwADbpwAAAIJqYIR+AMAA274AAADAAFOxYMAAor8AAFwBPgZJwADcqBbAANy5gcAA3KzAOhoNwABTssAAosk+AT0cwADc1i7AAFOzwAB6gQEAASbAANzvARbAANzvLsAAUxrAAHqxYLzMAMAAevg/TsAA3RvAAN0mAADAAEv+YMAAcjcBHMAA3TwWwADdMC63VMAAeoHAAHqdwABO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GgEAAR/AARAnwABoCQEAASbAARA8AYTAARA8wDo9fmDAAGItAAC2ST0cwAEQXBbAARBWLqDNwAB6rFYBAAEcwAEQZhbAARBgLqQKwAB6kLiYAwADJsABEIUBhMABEIXAOj1+YMAAYi2CwAEQl8A6PMAWwAEQqi6kzMAAerIAwABEkADAAPyFPgE9HMABENIWwAEQzC6gzcAAeqxWAQABHMABENwWwAEQ1i6kCsAAepCpeQMAAoHAARDowDo8gxbAARDvLqTMwAB6sgGlToLAAREZwDo8wMAARI8AwAD8hQbAAHtfgVfAARE7wAERTMABFsYAAIY5AWrAARE8YMAA/RwCAAABA8ABEWDAARbGAAAAAQEBwAERdAAAAIPuYIgOAABcAT4GTsABEZLAARGkAAClTmDAAEHFARzAARHIFsABEa4uwABTMMAAeoHAAHrBtroBAAGAwAER1MA6PtgAwABB7U7AARHsAAAAgJZgwABFYQBJwAER9xzAARILFsABEgCAwAER+8A6PtiCa4gQSAEAASsAwAD9KT4BPYrAARIcwDo/KBzAARIqFsABEiQupArAAHqQuJ8BAAEWwAESOi6kzMAAerIAwABElz4DPRzAARJrFsABEmCAwAESW8A6PtiCa4gQhE0BAAEuAIStPYrAARJ/wDo/KBzAARKHLqDCAAAAAMAAes1JwAESlBzAARKyFsABEqYWwAESmC7AAFMpwAB6gcAAeqWFTsAAeoZIAQABasABEsFgvNPAANneAMAA/Sk+AD4BPYrAARSgwDo/KBzAARS1FsABFKguwABTI8AAeoHAAHqfwABTaAMAAxbAART4FsABFOouwABTKcAAeoHAAHqlgmbAAHqFgsABFQDAOj8oFsABFQcuwABTJ8AAeoHAAHqjAMAAnq89HMABFScuwABTQ8AAeoEAAAAAwAB61knAARVEIhbAARVXFsABFUguwABTJcAAeoHAAHqhgVXAAPxWABbAARVwFsABFWIuwABTGsAAerGFL7zBPgFJwAEVgiXAARWSFsABFYuAwAEVhsA6PtiEUoJYYIR+PgFKwAEWgwA/Pz0cwAEWnS7AAFPUwAB6gQIAAoLAARapwDo/KIHAARawwDo+6wDAAHtIBsAAe2CBV8ABFsvAARbcwAEbMgAAhicBasABFsxgwAD9HAIAAAEDwAEW7cABGzIAAAABAQHAARb+AAAAg+5gh8QAAFwBPghAFsABFxEuwABTK8AAeoHAAHqpwAEXEcABFx0AQCEcwAEXNRbAARcwgMABFyvAOkFNgmmHyUgBAAErAMAA/SnAARcrwAEXPABPwAEXQ8ABF0gAAAHAAFPVYQBcAAPAARdYwAEXzgAAAAAAAABcAT4BRsABF2PAAReewAEXfwAAAJ6aYIhOABbAAReTgMABF47AOkFNhiWHxj4BPRzAARe0gsABF6jAOkHYhE0BAAEuAIhrT8ABF9XAARfiAAABwABT1mEAYMAARWEAA8ABF/DAARieAAAAAAAAAGDAAEVhAT4DScABF/scwAEYDhbAARgEgMABF//AOkFNhbSHx0gBAAErAMAA/Sk+AUrAARghARzAARguFsABGCgupArAAHqQuJ4CAAIpFsABGEQupMzAAHqyAMAARJY/PRzAARhvFsABGGWAwAEYYMA6QU2FtIfHhE0BAAEuAIStSsABGIMBHMABGIouwABTagAAAADAAHtXT8ABGKXAARiqAAABwABT12EAXAADwAEYtcABGasAAAAAAAAAXAE+AUbAARjAwAEY78ABGNMAAACCa2CEqQAWwAEY5oDAARjhwDpBTYYmh8g+Az0cwAEZBITAARj5wDpDAoRNAQABLgCErUAhHMABGSIuwABTOAAAAADAAHtQwAEZIcABGS0APRzAARmYLqDCAAAAAMAAes1PwAEZssABGbcAAAGfDmEAXAADwAEZwMABGecAAAAAAAAAXAE+AT0cwAEZ1RbAARnQgMABGcvAOkFNgmmHyYRNAQABLgCHYU7AARn5wAEaBAAAwABT2GDAAIVaARzAARoRFsABGgYuwABTMcAAeoHAAHq7wABL5gEAAYDAARolwDpBTQDAAHIgPRzAARo9FsABGjAuwABTIsAAeoHAAHqewABT2QgACIDAARpRwDpBTRzAARpyFsABGl8uwABTHMAAeoHAAHqWwABT2gEAAYDAARqHwDpBTQDAAITphcABGpbAOkOxgcABGqrAOkGsgsABGsTAOkIWg8ABGtzAOkLWhMABGvHAOkNuHMABGx4WwAEbBC7AAFMwwAB6gcAAesG2vAEAAYDAARsowDpBTQDAAEHvAMAAo24GwAB7YYFXwAEbN8ABG0jAARz2AACGKwFqwAEbOGDAAP0cAgAAAQPAARtb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1AAAwABUXcAAeoEAAAABA8ACJIbAAivUAAAABQUFwAIkngAAAIJFYIR+AMACJL8AAAC0W2C88wDAAiTmAAAAW2CFcwDAAiUGAAAAhRddwAD8dAFgwABiTwDAAiUtAAAApU5gwABBxQAAXcAA/HQBYMAARWEBPgVOwAIlpcACJawAACldwAD8dAFgwABFYQEcwAIlri7AAFRUwAB6gQEAAYLAAiXIwDrtxADAAHsRQ8ACJdkcwAIl7hbAAiXnhcACJeDAOu4EYcAA/KNjAQABFsACJgOBwAIl8MA67beEurz3AMAA/P0+Ak7AAiY4wAImQgAAgO1giE4BHMACJmkWwAImVYDAAiZOwDrtqoS6hIVLAQABFsACJnGFwAImasA67gRhwAD8owDAAPyDPRzAAiaHhcACJoDAOu4EVgEAARzAAiaLLsAAU8rAAHqBAQABhsACJqXAOu51AMAAexoAwAD8hUnAAia9FsACJuQWwAIm1IHAAibBwDrtt4S7vPiDssAA/Fc+BU7AAicSwAInHgAAwABUVl3AAPylAmDAAP22YMAARWEBMsACJyBgwAD9tmDAAEVhAEbAAicqwAInX8ACJ0IAAAAfYIWBABbAAidYgsACJ07AOu3EhVeFdz4CPRzAAid4FsACJ3KHwAInacA670yAloWEhE0BAAEuAIStPRzAAieZhsACJ47AOu8UgL8CAAIWwAIno4fAAieawDrvTIC9hYMcwAInqy6gwgAAAADAAHrNAMAA/LpOwAIpCcACKRkAAIS7XcAA/HQBYIhOATXAAimxAAABAF3AAPx0AWCITgEcwAIpsRzAAilkFsACKSKAwAIpG8A67aqEu4SGgaUBAAE0wAIpagPAAilqwAIppAAAAAEBAcACKWsAAACA1GCITgAAYMAA+goBSsACKXEBHMACKZQWwAIphIHAAilxwDrtt4S7vPiDFwEAARbAAimfh8ACKZ3AOvAngL2IUgDAAPxBAMAA/D6ArQAAAADAAPxINQAAAAEAWwEcwAIpyIfAAinGwDrv4ICuAQABasACKc1hAmCITmCITmDAAPvQwAE9LADAAPyHhwDAOu/gRsACKePAAiodwAIp/wAAAIDtYIhOAIfAAioMwDrvyT4CTsACKjTAAio6AACAlmDAAEVhARzAAipHhsACKjzAOu8USwEAARbAAipSFMACKkjA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eS7AAFM0wAB6gcAAesKeYr3YMcAChbVgwABFYQACrwQawAKF5MAAZsC50BzAAoYTFsAChgcut1TAAHqBwAB6ncAATt4BAAGFwAKGHcA7K5EAwABx4wDAAHrMSsAChjMBKT89i8AChk7AOytQJ8AAVK9KwAKGlAEqScAChq0lwAKGuYLAAoaxwDsrGmCFUj4CTsAChtzAAobpAADAAFRLYINZARbAAobzFMAChuvAOysaAgFghVKCRYVWScAChwElwAKHEoXAAocFwDstZWCD5T4BScAChy0cwAKHQxbAAoc+FMAChzHAOy1lBQFgg+WCZ4PoSAEAAWrAAodXYIQihLYAwAD9KT4BScACh2scwAKHe4TAAodvwDsrbCABAAEUwAKHfMA7LWUFAWCD5QAAPgFKwAKHmQA/Pz9JwAKHyiIlwAKH1oLAAofOwDsrGmCHJQAlwAKICxbAAogCFMACh/rAOysaAgFghyWF/4cnYIofPgJOwAKIPcACiEUAAKxkYIofASbAAog9ARbAAohPFMACiEfAOysaAgFghyWF/4cnYIofScACiF8cwAKIb4TAAohjwDsrbCABAAEWwAKIeIXAAohwwDsuSISQiiMAAD4BSsACiI4APz89HMACiLIWwAKIqS6kusAAerCulAMAAxzAAojaFsACiM4ut1TAAHqBwAB6ncAATukCAAIWwAKI5y7AAFMawAB6sYDAAoj2wDsqfwDAAHH3asACiRdgpOTAALv6MsACiShbWwEngbAkwAKJRAUng0KBwAKJNMA7Kowng0uDwAKJO8A7K1AngWoAtY89HMACiVIWwAKJTC6gzcAAeqxWAQABHMACiVwWwAKJVi6kCsAAepC4nwEAARbAAolsLqTMwAB6sgDAAESXAMAA/IVKwAKJnAAGwAB7I4FXwAKJq8ACibDAAoxkAADAAFR2wAB6gQAAAAEDwAKJzsACjGQAAAABAQHAAonjAAAAoS5ghbgAAFwBPgZJwAKJ9RzAAon5LsAAVJXAAHqBAwABgMACihXAOy+vAsAAVJaUwABUl5TAAHsfPgI9HMACin8WwAKKeS6gzcAAeqxWAQABHMACiokWwAKKgy6kCsAAepC4nwEAARbAAoqZLqTMwAB6sgDAAESXAMAA/IVKwAKKrgA/TsACitTAAorbAACCUV3AAPx0AWDAAEVhARzAAord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AAEcwAK33xbAArfZLqQKwAB6kLifAQABFsACt+8upMzAAHqyAMAARJcAwAD8hUrAArgEAD9OwAK4JsACuDUAAK8EYMAAZrQBHMACuEsWwAK4Py63VMAAeoHAAHqdwABO4QEAAYDAArhmwDtPowDAAHHrQCEcwAK4loHAAriHwDtQMkgBAAErAMAA/SnAAriHwAK4nQEewAK4p7WnAgACHMACuLwWwAK4sC63VMAAeoHAAHqdwABO6QIAAhbAArjJLsAAUxrAAHqxgMACuNjAO0+jAMAAcfckwAK5FAInwABUtoDAArkJwDtPowBOwAK5MMACuTcAAIJRXcAA/HQBYMAARWEBMcACuUdgwABFYQBGwAK5T8ACuZfAArliAAAAH2CEqQAcwAK5jhbAArmDFsACuXmAwAK5bsA7T6NbhbuFjYV2likBAAGVAMAA/Ew+Aj0cwAK5qIPAArmfwDtRFYRNAQABLgCErT0cwAK5w4LAArm8wDtQ6VYBAAEcwAK5xy6gwgAAAADAAHrNAMAA/IVJwAK52iEcwAK6EhbAArn6FsACue2BwAK53sA7UDK5zsAAZrq2+cAAmPRIAQABFsACuhyCwAK6FcA7UOlhwAD8owDAAPzzPgM9HMACujUWwAK6LC6kusAAerCulAMAAxzAArpfFsACulMut1TAAHqBwAB6ncAATukCAAIWwAK6bC7AAFMawAB6sYDAArp7wDtPowDAAHH3asACup5gpOTAALv6MsACuqdbWwEngbAkAAInwABU2yfAAFTcALWPPRzAArtEFsACuz4uoM3AAHqsVgEAARzAArtOFsACu0gupArAAHqQuJ8BAAEWwAK7Xi6kzMAAerIAwABElwDAAPyFSsACu3MAP0nAAruGHsACu6LAAJpSAQABFsACu8QWwAK7t4HAAruowDtQMrnOwABmurQpwACY8gA+AT0cwAK72xbAArvSLqS6wAB6sK6UAgACHMACvAUWwAK7+S63VMAAeoHAAHqdwABO6QIAAhbAArwSLsAAUxrAAHqxgMACvCHAO0+jAMAAcfdqwAK8RGCk5MAAwEAAtY8/TsACvHbAArx+AADAAFS3YL3LARzAAryaFsACvIguwABTM8AAeoHAAHrAt6gCAAKBwAK8scA7UDIWwAK8wS6kzMAAerIAwAByDk7AArzmwAK8+AAApU5gwABB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vMwAwABCpwA9HMACyHYuoL8BAAEmwALIewGGwALIe8A7WMVgwABFYQDAAHrMBsAAezOBV8ACyJDAAsiVwALXFgAAwABT58AAeoEAAAABA8ACyKvAAtcWAAAABwcHwALIuwAAAIPuYIJLAMACyNIAAADAAFTjYMAAe+YAwALI+gAAAIV8YL3LAMACyRcAAACk3mDAAEtIAMACyToAAABbXcAA/HQBYMAARWEAwALJWgAAAIUXXcAA/HQBYMAAYk8AwALJgQAAAKVOYMAAQcUAAFwBPg5OwALJqMACybIAAMAAVORgvcsBFsACyjMcwALJ0hbAAsm0LsAAUzTAAHqBwAB6wrTxAgACFsACygeBwALJ9MA7WvKCkMAAe+gWwALKIIHAAsoNwDta8ru8wAB76QC98rTfvdA9isACykbAO1sDIxzAAspigsACylXAO1sDSAEAASsAwAD9KYfAAsp0wDtbXRzAAsqdFsACyoguwABTNMAAeoHAAHrClv0CAAKCwALKqsA7WwOHwALKuMA7W10AviIBYL3LT8ACy53AAsuiAAABwABU5WECYMAAS0hgvLdgwAD6CgADwALLw8ACzcQAAAACAgLAAsvWAAAApN5gwABLSADAAsvtAAAAliBgvLcAAGDAAPoKAT4CTsACzAPAAswMAADAAFTmYMAA+goBIhbAAswXFMACzA7AO1xPCQCFLcAAS1gAHMACzDEWwALMLBTAAswjwDtcTwkAgL3AAEtWSAEAASdhAMAA/cVJwALMRCIUwALMSMA7XHULAAEWwALMXRTAAsxUwDtcTwkAtpLAAEtcPgFKwALMcAEcwALMkhbAAsyDFsACzHcupMzAAHqyqlvAAE0dmt8CAAIWwALMsxTAAsyrwDtcXgoAhPm8xRbAAszTFsACzMMus7/AAHqBwAB6vbERuIoAwABw70nAAszzFsACzQAUwALM98A7XE8JALaOwABLXT4BSsACzRYBHMACzTgWwALNKRbAAs0dLqTMwAB6sqpbwABNHZrfAgACFsACzVkUwALNUcA7XF4KAIT5vMUWwALNeRbAAs1pLrO/wAB6gcAAer2xEriLAMAAcO8+AUrAAs2qASpPwALNy8ACzdAAAAHAAFTnYQJgwABLSGC8t2DAAPoKAAPAAs3mwALQXgAAAAICAsACzfAAAACk3mDAAEtIAMACzgcA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XAEWwANpRi7AAFMgwAB6gcAAepojHMADaVUUAMA7x30PAEgBAAErAAArHMADaVUUAMA7x30PALQRAgACgMADaW7AO7ahIxbAA2mRFsADaYIuwABTJcAAeoHAAHqhgVXAAPxWFsADaakuwABTGsAAerEWwANp2xbAA2nWFsADaccuwABTJcAAeoHAAHqhgejAAPxZgmrAAHumAWC8twC8XgFcSsADaewBKT9KwANqBAEqBsAAe0CBV8ADalrAA2ptwANt0QAAwABVKsAAeoEAAAABA8ADaofAA23RAAAABAQEwANqngAAAIJqYLzMAMADarcAAACk3mDAAEtIAMADatoAAADAAFUSXcAA/HQBYMAARWEAwANq+wAAAMAAVRNggksAAF3AAPx0AWDAAEVhAT4DQCEcwANrJ4LAA2sVwDvIgUgBAAErAMAA/SnAA2sVwANrLgBOwANrO8ADa0wAAIT8YMAA+goBFsADa1eAwANrTsA7yGWE/Ly8ScADa/8iIiIiIYTAA2wEwDvI2gEcwANsLIPAA2wgwDvImEgBAAErAMAA/SkBHMADbG4uwABVLsAAeoEBAAGDwANsksA7yJgAwAB7RwElwANss4DAA2yqwDvIZWC86wEWwANs4IHAA2zXwDvIcoUtwABLWD4BSsADbUABgsADbUfAO8iBPgFKwANtbQEcwANtdC7AAFUvwAB6gQMAA4HAA22hwDvIcoDAA22rwDvIZYLAA221wDvIgQDAAHtBBsAAe0GBV8ADcL3AA3DQwAN/lAAAwABVL8AAeoEAAAABA8ADcPHAA3+UAAAAAwMDwANw+wAAAKTeYMAAS0gAwANxGgAAAIJqYLzMAMADcTcAAADAAFUSXcAA/HQBYMAARWEAAF3AAPx0AWDAAEVhAT4OQBzAA3FggMADcVfAO8nrsl4BAAGBwANxaMA7yfoAwABLaMADcVfAA3FxAE7AA3GGwANxlAAAtGlgwABolwEWwANxn4DAA3GWwDvJ67RpwABLTU7AA3HFwANx2AAAtFtgvPMBFsADceOBwANx2sA7yfq0W7zPTsADcgjAA3IeAADAAFUwXcAA/HQBYMAA/bYBHMADcj8WwANyMYDAA3IowDvJ67RpwABLTbb6AAAAAMAAaLNOwANycsADcoQAAMAAVSldwAD8dAFgwABFYQEewANyisAA9csBAWDAAEVhARzAA3L5HMADcskWwANyuYTAA3KmwDvKgLRovQNkAQABFsADcuqEwANy18A7yoCEuLz5AMAA/PVkAQABlADAAPz1AE7AA3MuwANzRAAAwABVMWDAAPvQAZM9HMADc3WGwANzZMA7yuGAvwIAAjUAAAABAGDAAPvQAYfAA3N2wDvLTzUAAAABAGDAAPvQAY/AA3N2wDvLTxzAA3OLFADAO8t5CABkAQABlADAAPz1FADAO8t5CAAcwANzooLAA3ORwDvKB0sBAAGTAMAA/IMAwAD8hE7AA3PvwAN0CAAAwABVMmDAAPvQAZROwAN0UMADdGQAAMAAVTNgwAD70AEcwAN0jBbAA3R0g8ADdGbAO8pZtvnAAGijZAEAAZQAwAD89U7AA3SawAN0sgAAwABVNGDAAPvQAZNOwAN0v8ADdNIAAMAAVTVgwAD70AGTPRzAA3TwFsADdNwurw3AAHqBwAB6vrLYAgACgcADdQHAO8n6NMADdRMDwAN1E8ADe5gAAAADAwPAA3UdAAAAgpBgwABiTwDAA3UqAAAAgL1gwAD9tgDAA3U+AAAAgyVgwABguwAAYMAA/NkBPgFJwAN1VBzAA3VwFMADdVjAO8wtCgBjAQABFsADdYWEwAN1csA7yoCEurz3AMAA/P0+AUnAA3WlHMADdcEUwAN1qcA7zC0KAGMBAAEWwAN10YPAA3XDwDvKWbb5wABoowDAAPz9PgE9HMADdgeGwAN19sA7yuGAvwIAAjUAAAABAGDAAPvQAYfAA3YIwDvLTzUAAAABAGDAAPvQAY/AA3YIwDvLTxzAA3YdFADAO81BDwBkAQABlADAAPz1FADAO81BDwAcwAN2NILAA3YjwDvKB0sBAAEcwAN2XRTAA3ZEwDvL3wgAZAEAATUAAAABAGDAAPvQARTAA3ZfwDvMLQoANQAAAAEAYMAA+9ABFcADdl/AO8wtChzAA3Z2FADAO82wDwBkAQABlADAAPz1FADAO82wDwAAwAD89QDAAPyDAMAA/IQ+AkAhHMADdqoUwAN2ncA7zK4OAEgBAAErAMAA/SnAA3adwAN2sQEewAN2wbWnAgACgcADdsrAO8n6JMADdv4CJ8AAVTYUwAN2+cA7zJ8NAAA9HMADdx2GwAN3DMA7yuGAvwIAAjUAAAABAGDAAPvQAYfAA3cewDvLTzUAAAABAGDAAPvQAY/AA3cewDvLTxzAA3czFADAO85wDwBkAQABlADAAPz1FADAO85wDwAcwAN3TRbAA3dHLqQKwAB6kKl5AgACFMADd1nAO8yuDgAWwAN3Zy6kzMAAerIAwABEjwDAAPyEPgFJwAN5QCIcwAN5VxTAA3lEwDvMQwsAYwEAARbAA3lvhcADeVnAO8qjYcAA/KMAwAD8/QAcwAN5ihTAA3mFwDvMnw0ASAEAARzAA3mihcADeY3AO8qjSwEAARTAA3mjwDvMQwsAAMAA/IMAwAD9xT4BPRzAA3oehsADeg3AO8rhgL8CAAI1AAAAAQBgwAD70AGHwAN6H8A7y081AAAAAQBgwAD70AGPwAN6H8A7y08cwAN6NBQAwDvPdg8AZAEAAZQAwAD89RQAwDvPdg8AHMADelmCwAN6SMA7ygdLAQABHMADem4UwAN6WsA7y/UJAGQBAAE1AAAAAQBgwAD70AEUwAN6cMA7zEMLADUAAAABAGDAAPvQARXAA3pwwDvMQwscwAN6ghQAwDvP5Q8AZAEAAZQAwAD89RQAwDvP5Q8AAMAA/PUAwAD8gwDAAPyEPgJAIRzAA3q2FMADeqnAO8yuDgBIAQABKwDAAP0pwAN6qcADer0BHsADes21pwIAAoHAA3rWwDvJ+iTAA3sKAifAAFU2FMADewXAO8yfDQAAPRzAA3sphsADexjAO8rhgL8CAAI1AAAAAQBgwAD70AGHwAN7KsA7y081AAAAAQBgwAD70AGPwAN7KsA7y08cwAN7PxQAwDvQpQ8AZAEAAZQAwAD89RQAwDvQpQ8AHMADe1kWwAN7Uy6kCsAAepCpeQIAAhTAA3tlwDvMrg4AFsADe3MupMzAAHqyAMAARI8AwAD8hAC7FEnAA3ufHMADe6wWwAN7oy7AAFD2wAB6gcAAesXAAFE2AQABgcADe8XAO8n6AMAAgrQ+AUnAA3vYHMADe/wWwAN76oPAA3vcwDvKWZViwABon0gBAAEWwAN8HITAA3wJwDvKgIS4vPkAwAD88z4CTsADfHfAA3yKAADAAFU3YMAA+9ABHMADfKgWwAN8moPAA3yMwDvKWbrVwABooGQBAAGUAMAA/PVFwAN83gHAA3znwAN8+QAAwABVOGDAAPvQAZMBHMADfRwUwAN9CsA70dMNAGMBAAEWwAN9LIPAA30ewDvKWZViwABonwDAAPz9ARXAA31LwDvR0w0cwAN9XBTAA31LwDvR0w0AZAEAAZQAwAD89T4BPRzAA319hsADfWzAO8rhgL8CAAI1AAAAAQBgwAD70AGHwAN9fsA7y081AAAAAQBgwAD70AGPwAN9fsA7y08cwAN9kxQAwDvSUg4AZAEAAZQAwAD89RQAwDvSUg4AHMADfbiCwAN9p8A7ygdLAQABHMADfcwUwAN9ucA70ZYMAGQBAAEUwAN9zsA70dMNAADAAPz1AMAA/IMAwAD8hD4CQBzAA34qFsADfhiDwAN+CsA7ylmVYsAAaJ9IAQABkwDAAPzzwAN+CsADfi4ARsADfnHAA37bwAN+hwAAAK2LYMAAYqIAHMADfrcWwAN+oy6vDcAAeoHAAHq+sr8BAAGBwAN+0MA7yfoAuvY+AT0cwAN++IbAA37nwDvK4YC/AgACNQAAAAEAYMAA+9ABh8ADfvnAO8tPNQAAAAEAYMAA+9ABj8ADfvnAO8tPHMADfw4UAMA7014NAGQBAAGUAMAA/PUUAMA7014NABzAA38iLsAAU3TAAHqBAgACgcADf0PAO8n6FMADf03AO9MSDAAAwAB7QgDAAPyEP0rAA394AYbAA39/wDvK4QbAAHtCgVfAA3+ZwAN/psADgcAAAMAAU3TAAHqBAAAAAQPAA3/GwAOBwAAAAAICAsADf90AAACCamC8zADAA3/4AAAArYtgwABiogAAYMAARWEBPgJOwAOAFcADgBsAAIVpYMAAYk8BHMADgDkWwAOAJS6vDcAAeoHAAHq+stMBAAEWwAOAYYHAA4BUwDvUIpYgwABipAC7D0nAA4BvFsADgHmCwAOAc8A71Du7psAAYlw+AUrAA4E9ARzAA4FKFsADgUQupArAAHqQuJkCAAIcwAOBWZWBxAAAAADAAPvzFsADgV0upMzAAHqyAMAARJE+AUrAA4F+ARzAA4GSFsADgYUuwABTI8AAeoHAAHqfwABThwIAAoLAA4GmwDvUO4DAA4GtwDvUFQDAAJ61BsAAe0OBV8ADgizAA4IxwAOEoAAAwABVK8AAeoEAAAABA8ADgkTAA4SgAAAAAwMDwAOCVAAAAIJqYLzMAMADgncAAADAAFUpXcAA/HQBYMAARWEAwAOCmAAAALFpYMAAYnYAAFwBPgNOwAOCwMADgsYAAIJOYMAAe6QBH8ADgszAAHuwBwAHgMADgunAO9VDFsADgvsuwABTJsAAeoHAAHqiFsADgxEuwABTJ8AAeoHAAHqjFsADgyYuoM3AAHqsFsADgzUuwABTF8AAeqsWwAODTC7AAFMWwAB6gcAAepIcwAODZS7AAFUcwAB6gQEAAYDAA4NzwDvVQwDAAHtNAD0cwAODkhbAA4ODLsAAUyXAAHqBwAB6oVYBAAGDwAODlsA71XwAwAD8hT0cwAOEWy7AAFU5wAB6gQMAA4DAA4RywDvVQ4HAA4R8wDvVUILAA4SPwDvVZwDAAHtEBsAAe0SBV8ADhl3AA4ZiwAOV3AAAwABVOcAAeoEAAAABA8ADhnjAA5XcAAAAAwMDwAOGiAAAAIJqYLzMAMADhqsAAADAAFUpXcAA/HQBYMAARWEAwAOGzAAAALFpYMAAYnYAAFwBPhQ9F8ADhuAuwABTFx/AA4b0wACjWAYABi6AwAOHGcA71p+AwAOHK8A71p81AAAAAQBgwABidgGCwAOHPcA71sMjHMADh0qDAMA71wJIAQABKwAAHMADh1kWwAOHTS63VMAAeoHAAHqdt5oBAAGAwAOHa8A71p8AwABx9IMAwDvXAgFgwABidhbAA4d+LsAAR5TAAHqBwAB6wxbAA4eTLsAAUuPAAHqBwAB6xADAAHqrPRfAA4e4FsADh6ouwABTF8AAeqvAAFOjHMADh9cWwAOHxC7AAFMcwAB6gcAAepbAAE7QAQABgMADh+TAO9afAMAAhOfAAKMsTsADiALAA4gMAADAAFODYMAAhQUBHMADiCEWwAOIDi7AAFMcwAB6gcAAepbAAFOEAQABgMADiDLAO9afAMAAhOpOwAOIRsADiGMAAMAAVTpgwAD6CgElwAOIboDAA4hlwDvWn2C86z0XwAOIjS7AAFMmwAB6gR/AA4igwACjZQMAAyeBdoDAA4i5wDvWn4DAA4jDwDvWnwDAAHqiPRzAA4jgFsADiNIuwABTF8AAeqvAAFOKAgACFsADiOwuwABTJsAAeoHAAHqiHMADiQAWwAOI+i6kCsAAepC4nwEAARbAA4kQLqTMwAB6sgDAAESXAMAAo0w9F8ADiSQuwABTFsAAeoEqwAB6kk7AA4ljwAOJcQAAwABN52DAAPvQAZNJwAOJehbAA4mHgMADiX7AO9afhPy8vD4BPRzAA4mvFsADiaEuwABTF8AAeqvAAFOKAgACFsADidMWwAOJyRbAA4m7LsAAUxfAAHqrwABTo8AAoyy5ssAAhQIcwAOJ+YHAA4nowDvWrEsBAAE1AAAAAQBgwAD70AGFwAOJ+sA72Ng1AAAAAQBgwAD70AGNwAOJ+sA72NgcwAOKB4YAwDvZWmQBAAGUAMAA/PWGAMA72VoAwAD8gwDAAKNMP07AA4odwAOKJAAAwABVO2DAAPoKASpOwAOKQ8ADik0AAMAAS8lgwAByEQEcwAOKcxbAA4pjFsADilcupMzAAHqystrAAE0fwABLywEAAYDAA4qAwDvWnwDAAGrxPR7AA4qPwABx1AMAAxbAA4qnLrdUwAB6gcAAep2AwAOKtMA71p80wAOKxgPAA4rGwAONHAAAAAIBAcADit4AAACCbGCITgABwAOK7gAAAMAASCJgwAD6CgFqAGDAAPzZd2DAAPzZAT4FTsADiwfAA4sNAACew2C88AEcwAOLGYfAA4sPwDvZwMAAS+kBAAEUwAOLKsA72j8IAADAAHIVScADizsUwAOLP8A72k0JAD4CPRzAA4thFsADi1MuwABTF8AAeqvAAFOKAgACFMADi23AO9pvCgAcwAOLdC7AAFPKwAB6gQEAARTAA4uOwDvaPwgAAMAAexoAwACjTErAA4uiAD9JwAOLuCKEwAOLvMA72BAAHMADi+aDwAOL3MA718/AAFO2AQABFMADi/bAO9pvCgAAwACFAD4CPY7AA4x8wDvZqilKwAOMkwA/TsADjLbAA4y/AAAfYMAARWEBHMADjNKBwAOMwcA71qxLAQABNQAAAAEAYMAA+9ABhcADjNPAO9jYNQAAAAEAYMAA+9ABjcADjNPAO9jYHMADjOAUAMA723cLAGQBAAGUAMAA/PUUAMA723cLAADAAPyDPRzAA4z5FsADjOsuwABTF8AAeqvAAFOKAgACFMADjQXAO9pvCgAUwAONDMA721MLAADAAKNMAEnAA40khsADjSjAO9mqPgNOwAONRcADjUkAAMAASJNgwABFYQEcwAONXIHAA41LwDvWrEsBAAE1AAAAAQBgwAD70AGFwAONXcA72Ng1AAAAAQBgwAD70AGNwAONXcA72NgcwAONahQAwDvcMwgAZAEAAZQAwAD89RQAwDvcMwgAAMAA/INAJcADjYAUwAONfMA73AwIAGDAAEZLwAONfMADjY0APRzAA444FsADjiouwABTF8AAequG9AQAAoPAA45DwDvXzysCwABVPBTAA45qwDvcDAgAwABVOoTAA46XwDvYEMAAo0A/TsADjs3AA47XAACs3GC8pQEWwAOO4oDAA47ZwDvWn4T5vMVJwAOO9iIiFsADjwSAwAOO+8A71p+Heby9ASXAA48egMADjxXAO9afYLzrABzAA49MFsADj0MuwABQ9sAAeoHAAHrFwABRBgEAARTAA49kwDvc5QgAAMAAgrM+Ak7AA4+GwAOPjwAAhLxgwABidgEcwAOPpRbAA4+RLq8NwAB6gcAAer6yugEAARTAA4+xwDvc5QgAALrwPRzAA4/aFsADj8wUwAOPw8A73WQJAIUXwABieYP4AQABNMADj+IDwAOP4sADkOQAAAABAQHAA4/jAAAAwABTbmDAAGJPAABgwAD82QE+A07AA5ANwAOQGgAArYtgwABiogEmwAOQDQEUwAOQHMA73dMKAGDAAGKiTsADkEDAA5BJAAAfYMAARWEBHMADkFyBwAOQS8A71qxLAQABNQAAAAEAYMAA+9ABhcADkF3AO9jYNQAAAAEAYMAA+9ABjcADkF3AO9jYHMADkGoUAMA73jsMAGQBAAGUAMAA/PUUAMA73jsMAADAAPyDPRzAA5CFFsADkHcuwABTF8AAeqvAAFOKAgACHMADkKwWwAOQni7AAFMXwAB6q8AAU3ABAAEUwAOQw8A73e4LAADAAKNLFMADkNLAO94XDAAAwACjTADAAPxCP0nAA5DxHMADkP4WwAOQ9S7AAFD2wAB6gcAAesXAAFE2AQABgMADkRfAO9afAMAAgrQ+Ak7AA5EvwAORRAAAwABVPWDAAPoKARzAA5F7FsADkWwWwAORWYDAA5FQwDvWn7RbvM+EuLz5SAEAAZMAwAD880bAA5GHwAOR78ADkZ0AAACti2DAAGKiABzAA5HLFsADkbcurw3AAHqBwAB6vrK/AQABgMADkeTAO9afALr2PgNOwAOSBgAAAB9gwABFYQBJwAOSGBTAA5IcwDvfFwkAPgE9FcADkmjAO9+WCxzAA5JzLsAAU3TAAHqBAgACgMADkpTAO9afFMADkp7AO99eCgAAwAB7Qj4BPRXAA5LIwDvflgscwAOS5IHAA5LTwDvWrEsBAAE1AAAAAQBgwAD70AGFwAOS5cA72Ng1AAAAAQBgwAD70AGNwAOS5cA72NgcwAOS8hQAwDvgCwwAZAEAAZQAwAD89RQAwDvgCwwAAMAA/IM9HMADkxcWwAOTCS7AAFMXwAB6q8AAU4oCAAIcwAOTPhbAA5MwLsAAUxfAAHqrwABTcAEAARTAA5NVwDvfXgoAAMAAo0sUwAOTZMA735YLAADAAKNMP0AiHMADk5+FwAOTkcA72NhIAQABFsADk7SBwAOTosA71qxhwAD8owDAAPzzASIhHMADk9QWwAOTyy7AAFD2wAB6gcAAesXAAFE2AQABgMADk+3AO9afAMAAgrQAHMADlDMcwAOUIxbAA5QcgcADlArAO9asYcAA/KOBjQEAAYXAA5QlwDvY2ADAAPz2SAEAARbAA5RmFsADlFOAwAOUSsA71p+0W7zPhLi8+QDAAPzzwAOTkcADlHQBHsADlH61pwIAAoDAA5SUwDvWnyQACifAAFU+hcADlLLAO9jYJ6PsFsADlNiBwAOUxsA71qxhwAD8oyeA2SfAAFU/gcADlRDAO9asJ8AAVUCAwAOVPcA71p8ngWoAPRfAA5VQLsAAUyfAAHqBFsADlYwcwAOVchbAA5VeLq8NwAB6gcAAer6yvgEAAYDAA5WCwDvWnwC69YU0wABi5MAAeqM9F8ADlZwuoM0xwAOVsmDAAEVhAMAAeqw9HMADlbsuwABTy8AAeoEBAAGAwAOVz8A71p8AwAB7TgbAAHtFgVfAA5XhwAOV5sADlq8AAMAAVS3AAHqBAAAAAQPAA5X5wAOWrwAAAAAAAABcAT4ETsADlg/AA5YWAACBdmDAAEVhARzAA5YmFsADlhguwABTF8AAeqvAAEPlAQABFsADljAuwABTJsAAeoHAAHqiAMAAo0hOwAOWV8ADll0AAIJOYMAAe6QBHMADlm4WwAOWXy7AAFMlwAB6gcAAeqGGEQAAAADAAPyTPRzAA5aALsAAVUHAAHqBAQABgcADlo7AO+K6AMAAe0Y9HMADlqAWwAOWmi6gzcAAeqxWAQABgMADlqTAO+J2AMAA/IUGwAB7RoFXwAOWtMADlrnAA5fFAADAAFVBwAB6gQAAAAEDwAOWxsADl8UAAAABAQHAA5bbAAAAgk5gwAB7pAAAXAE+Bj0XwAOW6C7AAFMXFsADlv6AwAOW+MA742HAAFVCwAB7qsAAeqs9F8ADlxQuwABTJsAAeoEWwAOXKYDAA5cjwDvjYcAAVUPAAHunwAB6oj0XwAOXPS7AAFMWwAB6gRbAA5dVgMADl0/AO+NhwABVRMAAe6vAAHqSPRfAA5dpLsAAUyfAAHqBFsADl32AwAOXd8A742HAAFVFwAB7qMAAeqNAFsADl50WwAOXly6gzcAAeqyBVcAA/FbAA5eXwAOXpAA9F8ADl6suoM0WwAOXuYDAA5ezwDvjYcAAVUbAAHupwAB6rAbAAHtHgVfAA5fKwAOXz8ADma0AAMAAVS7AAHqBAAAAAQPAA5fywAOZrQAAAAEBAcADl/sAAADAAFUTYIJLAABgwAD6CgE+AUrAA5mCASXAA5mVgMADmYnAO+SJYIfRBsAAe0iBV8ADmbLAA5m3wAOazAAAwABT1MAAeoEAAAABA8ADmcLAA5rMAAAAAgICwAOZ0AAAAICWYMAARWEAwAOZ6QAAAKVOYMAAQcUAAFwBPgFJwAOaAhbAA5oVFsADmgYuwABTJcAAeoHAAHqhgVXAAPxWPgE9HMADmiYuwABTN8AAeoEBAAEfwAOaR8AASLUDAAMWwAOaTy7AAFM0wAB6gcAAesKAwAOaZcA75OiBwAOabMA75PcAAMAAetM+AT0cwAOaohbAA5qULsAAUxfAAHqrwABTigIAAhbAA5quLsAAUybAAHqBwAB6ooDAA5q8wDvk6ADAAKNMBsAAe0mBV8ADmtHAA5rWwAObIgAAwABVLMAAeoEAAAABA8ADmt/AA5siAAAAAQEBwAOa7wAAAIJqYLzMAABcAT4BPRzAA5r/LsAAVUfAAHqBAQABgMADmxXAO+XkAMAAe0oGwAB7SoFXwAOba8ADm3DAA59sAADAAFVHwAB6gQAAAAEDwAObhcADn2wAAAABAQHAA5uVAAAAgmpgvMwAAFwBPgQ9HMADm6UuwABVSMAAeoEBAAGAwAObzMA75kYAwAB7S07AA5vtwAOb+AAAwABL/mDAAHI3ARzAA5wGFsADm/out1TAAHqBwAB6ncAATucBAAGAwAOcGsA75kYAwABx8kFHwAOcKRbAA5w8gcADnDHAO+Z5gmfAAHI5BQHAA5xaasADnFpgwAByJsABPAMAPgI9HMADnG8uwABTVcAAeoECAAImwAOcgQGAwAOcgcA75kZgvOQmwAOclgEWwAOcloHAA5yLwDvmeYPuwAByOmCDpADAAHrjSsADnKUAAcADnMNqwAOcw2DAAHImwAE8HAA+A07AA5zrwAOc9wAAmNVgg6QBJsADnOsBFsADnQSBwAOc+cA75nmD7sAAcjpgg6Q9HMADnSwWwAOdJxbAA50egsADnRLAO+dLgmqDqIJphJSETQEAAS4Ah2FKwAOdQgABwAOdYGrAA51gYMAAcibAATvqAD4DTsADnXnAA51+AACD7mCCSwEWwAOdi4HAA52AwDvmeYPuwAByOknAA52ZJcADnaKCwAOdncA7579gg6Q+Aj0cwAOd1BbAA53PFsADncYUwAOdwcA7578CAWCDpIJqg6iCaYSUhE0BAAEuAIdhSsADnewAScADngMlwAOeDILAA54HwDvnv2CD5T4CPRzAA548FsADnjcWwAOeLhTAA54pwDvnvwIBYIPlgmqD6oJphJSETQEAAS4Ah2FKwAOeVAA/QsADnm4AAcADnotqwAOei2DAAHImwAE8NQA+A07AA56xwAOetgAAg+5ghxUBJsADnrEBFsADnsOBwAOeuMA75nmD7sAAcjpghxU9HMADnuQWwAOe3xbAA57WgsADntHAO+ibgmqHF4JphJSETQEAAS4Ah2FKwAOe+gAAAT4BQsADnxkAPR7AA58qtacCAAKAwAOfM8A75kYkwAOfZwInwABVSYHAA59cwDvmeQAGwAB7S4FXwAOfuMADn73AA6UGAADAAFVIwAB6gQAAAAEDwAOf48ADpQYAAAABAQHAA5/zAAAAgmpgvMwAAFwBPgVOwAOglsADoJ4AAIMdYMAA+goBKknAA6CrIiIiFsADoLiAwAOgr8A76VuEGby7ARbAA6DVgMADoMzAO+lbh3q8ugEWwAOg9IDAA6DrwDvpW4d5vL0BJcADoRaAwAOhDcA76VtgvOs+AT2JwAOhuMA76W4pP0nAA6HTIYHAA6HYwDvpbj4BPRzAA6HpLsAAU7PAAHqBAQABgMADogLAO+lbAMAAevg/TsADoirAA6I0AADAAEvJYMAAchEBHMADoloWwAOiShbAA6I+LqTMwAB6srLawABNH8AAS8sBAAGAwAOiZ8A76VsAwABq8T0ewAOidsAAcdQDAAMWwAOiji63VMAAeoHAAHqdgMADopvAO+lbNMADoq0DwAOircADpQEAAAACAQHAA6LFAAAAgmxgiE4AAcADotUAAADAAEgiYMAA+goBagBgwAD82XdgwAD82QE+Bk7AA6LuwAOi+AAAgO1gvPABHMADowSCwAOi+sA76hTAAEvpAQABg8ADoxXAO+qTAMAAchVOwAOjM8ADozwAAB9gwABFYQEcwAOjTBbAA6M+LsAAUxfAAHqrwABD5QEAAYXAA6NWwDvqwwDAAKNITsADo3HAA6N2AACCkGDAAGJPARzAA6OCgsADo3jAO+oUwABL7wIAAhbAA6OPLrdUwAB6gcAAep2FwAOjnMA76sMAwAByGE7AA6O7AAAAwABVSmDAAEVhAEnAA6PTgcADo9fAO+luPgE9FcADo+rAO+t3CBzAA6QKFsADo/0uwABTI8AAeoHAAHqfwABTuwIAAobAA6QfwDvq94fAA6QpwDvrMQDAAJ6tPgE9FcADpEfAO+t3CBzAA6RnFsADpFouwABTI8AAeoHAAHqfwABTZAMAA4DAA6SbwDvpW4bAA6SlwDvq94fAA6SvwDvrMQDAAJ6uPRzAA6TSFsADpMQuwABTF8AAeqvAAFOKAgAChcADpN7AO+rDFMADpOnAO+t3CAAAwACjTAAGwAB6x4FXwAOlC8ADpRTAA6WIAQDAAFVLwAB6gQAAAAEDwAOlM8ADpYgAAAAAAAAAYMAA+goBPgFKwAOlOQEiFsADpU8WwAOlQC7AAFMlwAB6gcAAeqGBVcAA/FYBFsADpW4WwAOlaRbAA6VaLsAAUyXAAHqBwAB6oYHowAD8WcAAVUzAAHusBsAAe0yBV8ADpY3AA6WSwAOocgAAwABVJsAAeoEAAAABA8ADpafAA6hyAAAAAQEBwAOltwAAAJYgYLzMAABgwAD6CgE+AknAA6YKJcADphaAwAOmDsA77RBgvOs+A07AA6dRwAOnWAAAhIxgvKUBFsADp2IUwAOnWsA77RAAAWC864T5vMVJwAOneBzAA6eXFsADp4gWwAOnfC6kzMAAerKqW8AATR27hwEAAYHAA6euwDvtPwDAAHDqPgFKwAOnwQEhHMADp+QWwAOn1RbAA6fJLqTMwAB6sqpbwABNHcAATl4BAAGBwAOn/cA77T8AwABw7T9KwAOoFAEqP0rAA6gsARbAA6hiHMADqEoWwAOoMy6k/MAAerSz7QEAAYDAA6hZwDvtEADAAEE3tmLAAEEcBsAAe02BV8ADqHfAA6h8wAOo8wAAwABVHMAAeoEAAAABA8ADqInAA6jzAAAAAQEBwAOomQAAAJYgYLzMAABgwAD6CgE+AUrAA6ioASIWwAOory7AAFVLwAB6gcAAescAHMADqNEuwABVJsAAeoEBAAGAwAOo58A77kIAwAB7TAbAAHtOgVfAA6j4wAOo/cADq60AAMAAU8vAAHqBAAAAAQPAA6kQwAOrrQAAAAEBAcADqR4AAACWIGC8twAAXAE+B0nAA6ktIRbAA6k6FsADqTIuesAAeq+Cs4FVSsADqVkAP0nAA6llHMADqXGAwAOpacA77sFIAQABFsADqYQWwAOpdC6zv8AAeoHAAHq9sTq4sQDAAP0pSsADqZEAP07AA6ngwAOp6wAAwABVTWDAAEg2ARzAA6nzFsADqe0upArAAHqQuJkCAAIWwAOqCoDAA6oCwDvuwYPBwAD9LxbAA6oULqTMwAB6sgDAAESRT8ADqibAA6omAAABg6NhAVtbAAPAA6onwAOqRQAAAAEBAcADqigAAACDTVsAAFsBSsADqi4BIxzAA6owg8ADqi7AO++iSAEAASsAwAD9KScAFsADqkGDwAOqP8A776KAvQABW07AA6pSwAOqVwAAgL1gwAD9tgEkAAUcwAOqXYLAA6pcwDvvhSABAAEWwAOqZoDAA6pewDvuwYRDvMYAACeC5hzAA6pzgsADqnLAO++FIAEAARbAA6p8gMADqnTAO+7BhPm8xQAAJ4FqHMADqpuCwAOqmsA774UgAQABgMADqpzAO+7BAABOwAOqtsADqsMAAJk6YMAASDYBHMADqssWwAOqxS6kCsAAepC4nAIAAoPAA6rdwDvv5RbAA6rjLqTMwAB6sgDAAESUPRzAA6r1LlYBAAEfwAOq/cAARqgEAAQWwAOrJBbAA6sULrO/wAB6gcAAer2xOrixMcADq0dgwABFYQKBwAOrSMA77zGEwAOrVMA78GoWwAOrgBbAA6trLsAAUzTAAHqBwAB6wp5ivdhqwAOrlV3AAPx0AWDAAGJPwADsnwAAwAB7UgAAOanlADmqMQA5qoYAOarKADmrDgA5q1AAOaucADmr6AA5rCoAOaxuADmssgA5rPYAOa06ADmteAA5rd0AOa4hADmurwA5rucAOa9ZADmvswA5sB8AObChADmxUAA5sdsAObIgADmyvwA5sw0AObRsADm01wA5tUIAObWxADm3FQA5t+sAObjGADm5gQA5uj4AObqvADm8mQA5vO4AOcacADnHTwA5yXIAOc6AADnPFAA5z7sAOdKLADnVrwA555oAOehbADnpdgA56oYAOe2jADnxuAA58mIAOfhPADn+HgA5/zgAOgFOADoGSQA6CUcAOgriADoL+QA6EP4AOhG9ADoXRQA6GLQAOhnQADoeSAA6IVgAOiryADorjAA6LBMAOi0LADozNwA6M+kAOjRxADo0wwA6NwEAOjiQADo6LwA6OnYAOjw7ADo+owA6QRgAOkShADpFpgA6UdQAOliBADphwwA6Y+YAOmXiADpzjAA6dP8AOnZfADp6hAA6e5EAOnxfADp9LQA6gO8AOoIZADqE4AA6iRYAOophADqMCAA6jrgAOo8uADqPqwA6kPsAOpJRADqcCwA6pp4AOqfaADqpSwA6q6AAOqw7ADqs1gA6rXEAOq4MADqvEQA6r5oAOrLEADq2MAA6vT4AOsTTADrFNwA6yHQAOs5TADrRTgA60tsAOtSDADrWpAA62DoAOtiZADrY+AA628EAOtyoADrfeAA64ScAOuIsADritQA645wAOuXpADrpuQA66wwAOut+ADrsfAA67XoAOvJSADrzXQA69F4AOviqADsHdAA7DboAOxKfADsgQQA7J6kAOynVADsqTwA7L38AOzFwADsytgA7NVEAOzcRADs4LgA7OtEAOz9DADtAUAA7RlkAO0hqADtLngA7TXAAO09zADtWWwA7V78AO1q1ADtlTQA7cO4AO3OnADt0qgA7dRQAO3pHADt80AA7fc0AO35/ADuDiAA7huwAO4owADuOeQA7kS4AO5MhADuZAgA7mekAO6WWADuoRAA7qnwAO6u3ADusawA7rU4AO654ADuwbQA7sRoAO7IoADuy4wA7tCQAO7ZxADvINQA7ybsAO9PlADvVEwA71m8AO+JAADvjMQA75FkAO+S4ADvltAA75hYAO+krADvsWAA77OAAO+4SADvukQA78S4AAADdAsAAe52BV8ADq97AA6vkwAOtZgPAAFVOAAABYMAA/RwAAAMEwAB7n4FXwAOsN8ADrFwJwABTfgBdwAD8dAFgg6QBMcADrFpgg6QABMAAe6CBV8ADrLTAA6zlCYXNAF3AAPylAmC8yWDAAEVhATLAA6zjYLzJYMAARWEABMAAe6GBV8ADrTzAA61kCcAA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zgAAAcAAVshhAWDAAP43YMAAYk8AA8AAu9TAALwrAAAAAQEBwAC72QAAAICsYMAA/jcAAGDAAGJPAT4BSsAAu+gBHMAAu/yGwAC778A9ekYgAQABHMAAvBAWwAC7/S6k5cAAfi+yFgEAARTAALwewD17mAgAAMAAfmMAAE7AALzrAAAAgpBgwABiTwBJwAC89zUAAAABAGDAAPoKAYHAALz7wD15DiMcwAC9ERQAwD18BgkASAEAASsAwAD9KYnAALz7wD15DhzAAL0kgsAAvRXAPXkkIAAAAAAAFADAPXwGCQABYMAA+go+AT0jHMAAvTcUwAC9MsA9e/EIAEgBAAErAMAA/SkVwAC9MsA9e/EIHMAAvUiGwAC9O8A9ekYgAQABFsAAvVwWwAC9SS6k5cAAfi+yscAAfj8AACsBYMAAYk8/PSMcwAC9fRTAAL14wD178QgASAEAASsAwAD9KRXAAL14wD178QgcwAC9h4fAAL2BwD17cSABAAEawAC9jbgPAAArAWDAAGJPPSMcwAC9pBTAAL2fwD178QgASAEAASsAwAD9KRXAAL2fwD178QgcwAC9rofAAL2owD17cSABAAEawAC9tLgdAAArAWDAAGJPPSMcwAC90RTAAL3MwD178QgASAEAASsAwAD9KRXAAL3MwD178QgcwAC924fAAL3VwD17cSABAAEawAC94bgfAAArAWDAAGJPPSMcwAC+ARTAAL38wD178QgASAEAASsAwAD9KRXAAL38wD178QgcwAC+C4fAAL4FwD17cSABAAEawAC+EbgXAAArAWDAAGJPPSMcwAC+NhTAAL4xwD178QgASAEAASsAwAD9KRXAAL4xwD178QgcwAC+QIfAAL46wD17cSABAAEawAC+RrgOAAArAWDAAGJPPSMcwAC+YxTAAL5ewD178QgASAEAASsAwAD9KRXAAL5ewD178QgcwAC+bYfAAL5nwD17cSABAAEawAC+c7gUAAArAWDAAGJPPSMcwAC+ihTAAL6FwD178QgASAEAASsAwAD9KRXAAL6FwD178QgcwAC+lIfAAL6OwD17cSABAAEawAC+mrgQAAArAWDAAGJPPSMcwAC+sRTAAL6swD178QgASAEAASsAwAD9KRXAAL6swD178QgcwAC+u4fAAL61wD17cSABAAEawAC+wbgRAAArAWDAAGJPPSMcwAC+3xTAAL7awD178QgASAEAASsAwAD9KRXAAL7awD178QgcwAC+6YfAAL7jwD17cSABAAEawAC+77gZAAArAWDAAGJPPSMcwAC/BRTAAL8AwD178QgASAEAASsAwAD9KRXAAL8AwD178QgcwAC/D4fAAL8JwD17cSABAAEawAC/FbgaAAArAWDAAGJPPSMcwAC/MRTAAL8swD178QgASAEAASsAwAD9KRXAAL8swD178QgcwAC/O4fAAL81wD17cSABAAEawAC/QbgbAAArAWDAAGJPPSMcwAC/WhTAAL9VwD178QgASAEAASsAwAD9KRXAAL9VwD178QgcwAC/ZIfAAL9ewD17cSABAAEawAC/argcAAArAWDAAGJPPSMcwAC/hBTAAL9/wD178QgASAEAASsAwAD9KRXAAL9/wD178QgcwAC/jofAAL+IwD17cSABAAEawAC/lLgSAAArAWDAAGJPPSMcwAC/sRTAAL+swD178QgASAEAASsAwAD9KRXAAL+swD178QgcwAC/u4fAAL+1wD17cSABAAEawAC/wbgYAAArAWDAAGJPPSMcwAC/3hTAAL/ZwD178QgASAEAASsAwAD9KRXAAL/ZwD178QgcwAC/6IfAAL/iwD17cSABAAEawAC/7rgeAAArAWDAAGJPPSMcwADABRTAAMAAwD178QgASAEAASsAwAD9KRXAAMAAwD178QgcwADAD4fAAMAJwD17cSABAAEawADAFbgVAAArAWDAAGJPScAAwCoiHMAAwDMUwADALsA9e/EIAEgBAAErAMAA/SkAhcAAwD7APXoiPgE9HMAAwFsWwADAUi6kusAAfaCulAMAA2rAAMBuYLW5wAC8DmrAAMChYKTkwAC7+jLAAMCqW1sBJ4GwJMAAwNADJ5LChMAAwLvAPXoQJ5THALWPP0rAAMDiARTAAMDpwD178QgASsAAwPoBg8AAwQHAPXnfBsAAfdmBW8AAwRDAAMEXwADBmgAAwABWycAAfZAAAAABA8AAwSnAAMGaAAAAAgICwADBPgAAAIPuYIW4AMAAwUgAAAAnYMAA+9AAAGDAAP22AT4BSsAAwVUBJsAAwVUBHMAAwX0cwADBdRbAAMFrFsAAwWGAwADBXMA9ggdbhbuFjYV2SwEAAYHAAMF2wD2CFADAAPyDhE0BAAEfwADBiMAApj8A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Pz8/ScABE0QWwAETTYPAARNIwD24+MAAVdzAAIAcPgI9HMABE20uwABW+MAAfZAIAAgWwAEToIDAAROPwD24ybmywAB8t4DAARO1wD24yYLAARPRwD2454bAARPrwD25MibAARQqARbAARQqHMABFAAuwABO5QEAARbAARQagcABFBPAPbjahPm8xQDAAH4mg+7AAHJsYIJSKSqHwAEUW8A9uVAAwAB94T2PwAEUb8A9uVAcwAEUeofAARRvwD25UGQBAAGUAMAA/PU/RsABFInAARS2wAEUlgAAAIJsYIJLABbAARSng8ABFKLAPbj4wABOzsAAgBo+AUnAARVEJcABFVEUwAEVSMA9u5EIAGCITj4CTsABFXzAARWKAADAAFb1YLzwARzAARWWhMABFYzAPbkHwABL6QEAARTAARWnwD27kQgBYIhOAMAAchVJwAEVuiEcwAEVvy7AAFbswAB9kAIAAhTAARXLwD270QkAhcABFdrAPbkYAMAAfdw+Aj0cwAEWAy7AAFb4wAB9kAgACBTAARYpwD270QkAgMABFkbAPbjJgsABFmbAPbjnhsABFoTAPbkyFMABFp3APbuRCAFgiE4WwAEWvhTAARa1wD27kQgBYIhOhB2IXyqHwAEXIMA9uVAAwAB94T2PwAEXOMA9uVAcwAEXQ4fAARc4wD25UGQBAAGUAMAA/PU/ScABF14lwAEXaxTAARdiwD27kQgAYMAAgIE+Aj0cwAEXlS7AAFb4wAB9kAgACBzAARfDhMABF7nAPbkHwABL6wIAAhbAARfhFMABF9jAPbuRCAFgwACAgYKQwACAhC4AwAByFoDAARf6wD24yYLAARgYwD2454bAARg0wD25MhbAARhZFsABGFQUwAEYS8A9u5EIAWDAAICBgpDAAICEgO2JPSkqh8ABGJXAPblQAMAAfeE9j8ABGKvAPblQHMABGLaHwAEYq8A9uVBkAQABlADAAPz1PgE9MMABGNEfwAEY28AA+2IBAAEkwAEZEwInwABW+RTAARkKwD27kQgAAAbAAH3fgVvAARsbwAEbIMABIFEAAMAAVvfAAH2QAAAAAQPAARs/wAEgUQAAAAcHB8ABG00AAADAAFb1YLzwAMABG3kAAADAAFXkYMAAfLEAwAEbnwAAAMAAVhxgwABidgDAARvPAAAAs0xdwAD8pQJgwAD9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78AAfLgUwABFl8A+dHcKAADAAPy6PRzAAEWrFsAARaEuwABOb8AAfzbAAH9BgL8CAAIWwABFvRTAAEWswD5zlggAwABU78AAfLgfwABF18AAh8EBAAEUwABF4MA+dHcKAAAAwAD8uj0XwABF8BTAAEXrwD50dwoAu4cpwACHmUrAAEYUARTAAEYbwD5zlggABsAAf1KBXcAARjTAAEZDwABQSAAAwABXeMAAfzYAAAABA8AARlnAAFBIAAAAAwMDwABGbgAAAICrYMAAf4EAwABGiAAAABJgu8UAwABGmgAAALvsYMAAhN8AAGC7xQE+A0/AAEcvwABHTAAAAbOOYQJdwAD8pQJgvKVguxtdwAD8pQJgvPBguxtdwAD8pQJgvKVguxsAA8AAR1vAAEq8AAAAAgICwABHggAAALNLXcAA/KUCYLylYLsbAMAAR6sAAACzTV3AAPylAmC88GC7GwAAXcAA/KUCYLylYLsbAT4ETsAAR8nAAEfQAACBdl3AAPylAmC8pWC7GwEywABH62C8pWC7GwA9HMAAR/6EwABH9cA+dkWD+AEAATTAAEgGA8AASAbAAEktAAAAAgICwABIEwAAAKQQYLylAMAASCYAAACy+GC7GwAAYMAA/NkBPgJOwABIQsAASFAAAMAAV4lgvKUBHMAASFaAwABIUsA+ddDAAFdhAQABJsAASGUBh8AASGXAPnbPYMAAjjYAwAB/iUnAAEh2IRzAAEiIFMAASHrAPnbzCQBIAQABKwDAAP0pPgE9HMAASQSGwABI/sA+doKAvwIAAhTAAEkFwD528wkAFMAASRbAPnbcCAAAwAD8uj8AwAD8xD0cwABJR4XAAEk2wD52W4P4AQABNMAASU8DwABJT8AASqAAAAACAgLAAElWAAAApBBgvPAAwABJaQAAALL4YLsbAABgwAD82QE+AUnAAEnrJcAASfaHwABJ78A+d7JgwABsDj4CTsAAShnAAEolAACz/GDAAIUVARzAAEo5gsAASifAPnXrwABPngEAARbAAEpPFMAASkjAPneyBwFgwABsDoPuwABsEwDAAIToPRzAAEpmhsAASmDAPnaCgL8CAAIWwABKcxTAAEpnwD538AkAwABU78AAhRoUwABKicA+d78IAADAAPy6PwDAAPzESsAASqkBhsAASrDAPnaCT8AAS0DAAEteAAABs49hAl3AAPylAmC8t2C7G13AAPylAmC88GC7G13AAPylAmC8t2C7GwADwABLbsAAT0wAAAACAgLAAEuWAAAAs0xdwAD8pQJgvLdguxsAwABLwAAAALNNXcAA/KUCYLzwYLsbAABdwAD8pQJgvLdguxsBPgROwABL3sAAS+UAAIF2XcAA/KUCYLy3YLsbATLAAEwBYLy3YLsbAD0cwABMFYXAAEwLwD54zIP4AQABNMAATB0DwABMHcAATUcAAAACAgLAAEwrAAAApBBgvLcAwABMPgAAALL4YLsbAABgwAD82QE+Ak7AAExbwABMaQAAwABXiWC8twEcwABMb4DAAExrwD510MAATOQBAAEmwABMfwEUwABMf8A+eVYIAGDAAI48AMAAf4pJwABMkCEcwABMohTAAEyUwD55egoASAEAASsAwAD9KT4BPRzAAE0eh8AATRjAPnkJgL8CAAIUwABNH8A+eXoKABTAAE0wwD55YwkAAMAA/Lo/AMAA/MQ9HMAATWGGwABNUMA+eOKD+AEAATTAAE1pA8AATWnAAE8wAAAAAgICwABNcAAAAKQQYLzwAMAATYMAAACy+GC7GwAAYMAA/NkBPgFJwABOCiXAAE4VFMAATg7APno7CABgwABsDj4DTsAATjjAAE5EAACz/GDAAIUVARzAAE5YgsAATkbAPnXrwABPngEAARbAAE5uFMAATmfAPno7CAFgwABsDoPuwABsEwDAAIToPRzAAE6Fh8AATn/APnkJgL8CAAIWwABOkhTAAE6GwD56ewoAtAHAAIUbFMAATqDAPnpICQAAwAD8uknAAE6wIRzAAE7QFsAATsAUwABOtMA+ensKAMAAUGnAAIUcSAEAASsAwAD9KT4BPRzAAE7th8AATufAPnkJgL8CAAIWwABO+hTAAE7uwD56ewoAwABQacAAhRwUwABPDcA+ekgJAADAAPy6Pz8AwAD8xErAAE85AYfAAE9AwD55CUrAAE9TAR7AAE9eu9QFAAWBwABPe8A+dd8mwABPjQEWwABPjYDAAE+JwD510MAAV4bAAH+IYQFgvJZgvJaDwABPp8A+dgaEwABPwMA+eI00wABP2gPAAE/awABQQwAAAAEBAcAAT9sAAABFXcAA/KUCYMAAYLtguxsAAF3AAPylAmDAAGC7YLsbAUrAAE/hAR7AAE/hwAB/OwMD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BhbAAFX+LoSBwACDosAAS+4BAAGAwABWDsBAqsEAwACOdD0cwABWGC7AAFaNwACDiAIAAoDAAFYqwECqwYHAAFYvwECq/wDAAIPFSsAAVjoBFsAAVkaBwABWQcBAqv+E6cAApv4GwACDy4FswABWYcAAVmbAAFcIAADAAFatwACDiAAAAAEDwABWgMAAVwgAAAABAQHAAFaOAAAAmcJgwACONgAAYMAA+goBPgNAHMAAVqAuwABWhgEAAYDAAFaswECrqQDAAIQZwABWoMAAVrAATsAAVsHAAFbFAACWdWDAAKbIARzAAFbPFsAAVscuhIHAAIOiwABWYQEAAYDAAFbWwECrqQDAAI6ESsAAVuABFsAAVuuBwABW58BAq+eyvMAApssGwACDzIFswABXDcAAVxLAAFf2AADAAFavwACDiAAAAAEDwABXI8AAV/YAAAACAgLAAFcxAAAAmcJgwACONgDAAFc7AAAAgaZhAWDAAGJ2XAAAXAE+BEAcwABXZC7AAFaGAQABgMAAV3DAQKxpAMAAhBnAAFdkwABXdABOwABXhsAAV4sAABJgwACm8wEcwABXlRbAAFeNLoSBwACDosAAS+4BAAGAwABXncBArGkAwACOdD0cwABXpy7AAFaNwACDiAIAAoDAAFe5wECsaYLAAFe+wECstQDAAIPFPRzAAFfoFsAAV90WwABXzoLAAFfJwECstcAAVg/AAKb7m3bAAKV+g/gBAAGBwABX8MBArHgAkvcGwACDzYFswABX+8AAWADAAFlHAADAAFkzwACDiAAAAAEDwABYDcAAWUcAAAACAgLAAFgbAAAAmcJgwACONgDAAFglAAAAgaZhAWC8pVwAAFwBPgJAHMAAWEguwABWhgEAAYDAAFhUwECtfQDAAIQZwABYSMAAWFgAQ8AAWF8hHMAAWGqAwABYZsBArX1IAQABKwDAAP0pPgROwABYhsAAWIsAABJgwACm8wEcwABYlRbAAFiNLoSBwACDosAAS+4BAAGAwABYncBArX0AwACOdD0cwABYqS7AAFaNwACDiAIAAoDAAFi7wECtfYLAAFjAwECt5wDAAIPFScAAWM0hHMAAWOIWwABY1oLAAFjRwECt54TVwACm+UgBAAErAMAAYog+AT0cwABY9oHAAFj1wECtjCABAAEWwABZCBbAAFj8gsAAWPfAQK3n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wACEA07AALEqwACxMwAAhBlgwAD6CgEWwACxOoDAALE1wED6poQZg/dOwACxTcAAsVgAAIQfYMAA+goBFsAAsV+AwACxWsBA+qaEH4P5TsAAscPAALHOAACEGmDAAPoKASIWwACx1YDAALHQwED6poQag/gAIRbAALHpgMAAseTAQPqmhB+D+U7AALIFwACyEQAAhU5gvNMBHsAAshPAAJwDAQABFsAAsieAwACyIsBA+qaCaoPqAEFHwACyNhbAALJDgMAAsj7AQPqmgmeD6AQBwACyZ2rAALJnYIQigc8APgE9MMAAsngfwACygsAA+2IBAAEnwABZUQABwACy1mrAALLWYIQihJgAPgI9icAAsubAQPrzHMAAsvEuwABZUgcABILAALL+wED7AYPAALMHwED7D4TAALMXwED7wBTAALMdwED8eQgAA4QZhcAAs0DAQPv1hB+GwACzVsBA/BqEGofAALNuwED8P8AAhCxCwACzgwACwACzpmrAALOmYIQihLbAALPKasAAs8pghCKExQA+Aj2JwACz3MBA+vMcwACz5y7AAFlTCAAFgsAAs/TAQPsBg8AAs/3AQPsPhMAAtA3AQPvAHMAAtB8uwABZNgEAARbAALQ6gMAAtDXAQPqmgmqD6gDAAIQFFMAAtEXAQPx5CAADhBmFwAC0aMBA+/WEH4bAALR+wED8GoQah8AAtJbAQPw/wACELULAALSrAAHAALTOasAAtM5ghCKEpwA+A0AcwAC08RTAALTlwED8eQgASAEAAWrAALUAYLzTwADZvADAAP0pwAC05cAAtQQAPYnAALUPwED68xzAALUaLsAAWVQGAAOCwAC1J8BA+wGDwAC1MMBA+w8WwAC1RYTAALVAwED7wJsGwABobQOEGYXAALVjwED79YQfhsAAtXnAQPwahBqHwAC1kcBA/D/AAIQuQsAAtaYAPRzAALW/FsAAtbcuhIjAAIOjwABL6gICYMAAjkJgwACnMAImwAC18QGBwAC18cBA+vNgwACOQh/AALX/wACnWgIAAoDAALYRwED6phbAALYcgMAAthfAQPqmgmqD6gAAwACOej0cwAC2gRbAALZ4LsAAVlrAAIOsgL8CAAKAwAC2gsBA+qYmwAC2gQGBwAC2isBA+vNgwACOQgDAAPy6RsAAtpjAALbdwAC2rgAAAJ6yYIlKABbA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54DAARDiwEFQH4T8g4wAHMABESEWwAERAy63sMAAg4jAAISNsrABAAEcwAEROxbAAREvLrdUwACDiMAAhIycEgEAARbAARFJgMABEUTAQVAfhPmDYQDAAIPmAMAAajY+Aj0cwAESbi7AAFlswACDiAIAAoDAARJ9wEFQH4HAARKDwEFQLADAAISYSsABEpoBKT4CTsABEsHAARLGAACAvWDAAP22ARzAARLILsAAWW3AAIOIAgACgMABEuLAQVAfgcABEujAQVAsAMAAhJtJwAES/yEcwAETCILAARMDwEFQ5EgBAAErAMAA/cU+AT0ewAETG7WnAgACHsABEzHAAJwCAQABgMABE0/AQVAfACQAAyfAAFlugMABE6/AQVAfJ4FqAD9KwAETygEqBsAAhJeBbMABFGXAARRqwAEXFAAAwABZZcAAg4gAAAABA8ABFIPAARcUAAAAAgICwAEUlQAAAIPuYINZAMABFKwAAADAAFkGYMAAf+AAAGDAAPoKAT4CScABFMIcwAEUxi7AAFlvwACDiAIAAoDAARTWwEFRrIHAARTcwEFRuQDAAISfPgJJwAEU9SIhHMABFQ0WwAEU/oDAART5wEFRrIT5g2FIAQABKwDAAP0pACEWwAEVHoDAARUZwEFRrIT8g2g+AknAARU6IRzAARVdFsABFT8ut7DAAIOIwACEjbKwAQABHMABFXcWwAEVay63VMAAg4jAAISMnBIBAAEWwAEVhYDAARWAwEFRrIT5g2EAwACD5gDAAGo2PgI9HMABFbgWwAEVrxbAARWjLrdUwACDiMAAhIykusAAg5CulAIAAh7AARXawACcAgEAAYDAARX4wEFRrABqwAEWGWCk5MAAwHgAtY9KwAEWTQEqPz0cwAEWbS7AAFlwwACDiAIAAoDAARaLwEFRrIHAARaRwEFRuQDAAISZPgE9HMABFrkuwABZbMAAg4gCAAKAwAEWyMBBUayBwAEWzsBBUbkAwACEmErAARbtASk/SsABFwQBKgbAAISYgWzAAReDwAEXiMABGHsAAMAAWWzAAIOIAAAAAQPAAReWwAEYewAAAAICAsABF6EAAACD7mCDWQDAARe4AAAAwABZBmDAAH/gAABcAT4DTsABF9XAARfaAACAvWDAAP22ARzAARfcLsAAWW3AAIOIAgACgMABF/bAQVN+gcABF/zA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YsBBXYgAwAB/8j4DTsABJ5DAASeZAACG1V3AAPx0AWDAAGC7ASbAASeQARzAASe5FsABJ6Uurw3AAIOIwACEkbLLAQABgMABJ8vAQV1FALsFXcAA/HQBYMAAYLs9jMABJ9zAQV3BHsABJ/HAAGaOAwADFsABKB4WwAEoEi63VMAAg4jAAISMpLrAAIOQFsABKDQWwAEoKC63VMAAg4jAAISMsvvAAIOzhsABKETAQV5tAD2NwAEoVcBBXdkewAEoasAAZo8DAAMWwAEolxbAASiLLrdUwACDiMAAhIykusAAg5AWwAEorRbAASihLrdUwACDiMAAhIyy+8AAg7OGwAEovcBBXm0ASsABKNIBHMABKOUWwAEo2S63VMAAg4jAAISMwABLswQAA4PAASkJwEFdiITAASkPwEFdwYXAASkjwEFd2QHAAEnogsABKUzAQV1mwACEJQbAAISfgWzAASlhwAEpZsABLScAAMAAWW/AAIOIAAAAAQPAASl1wAEtJwAAAAICAsABKYAAAACD7mCDWQDAASmXAAAAwABZBmDAAH/gAABgwAD6CgE+BUnAASmtIR7AASmywABraAEAARbAASnaFsABKcmAwAEpxMBBX+eEpYNihHeCjQBKwAEp5gEqP07AASn9AAAAwABXumDAAPoKAEnAASoQIRzAASojgcABKhTAQV/0SAEAASsAwAD9KT4BPYrAASo0wEFgRRzAASpTgcABKkTAQV/0wABXugEAAYDAASphwEFf5wDAAH/vPgE9isABKnvAQWBFHMABKpwWwAEqkIDAASqLwEFf54Rjg1yB1AEAATTAASqgA8ABKqDAASt3AAAAAQEBwAEqrwAAAIJrYISpAABgwAD6CgE+AUrAASrFASIlwAEq14PAASrMwEFg32CFywAcwAErOxzAASsOFsABKwIut1TAAIOIwACEjMAATtsBAAEWwAErKhTAASsfwEFg3wMBYIXLhaeF0wDAAIPzSAEAARbAASteFsABK04us7/AAIOIwACEkrGFuPkAwABiiADAAPxHScABK4QiIiGCwAEricBBYEUAFsABK6eAwAErosBBX+eEH4NpACEcwAErzxbAASu+LrewwACDiMAAhI3AAEt2AQABHMABK+0WwAEr4S63VMAAg4jAAISMnAsBAAGAwAEr98BBX+cAwACD6gDAAGo8PgE9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AKDzYMAA/RwCAAABA8AAoR7AAKa0AAAABgYGwAChNQAAALiIYMAARl4AwAChTwAAAKQKYMAARHwAwAChdwAAALZ2YMAAQTIAwAChlgAAALL7YLkjAMAAobkAAACkzGDAAE0PAMAAoeAAAACWcmDAAKpGAABgwABFYQE+CE7AAKH4wACh/QAAha9gwABFYQEcwACiERbAAKILgMAAof/AQibfglHAAEVnSwEAAZQAwAD8g07AAKInwACiLQAAhbFgwABFYQEcwACiQRbAAKI7gMAAoi/AQibfglHAAEVnSwEAAZUAwAD8g07AAKJYwACiaAAAuStgvcsBFsAAom+GwACiasBCJ0G5K8AARaFJwACihCIcwACijofAAKKIwEInd7lMAAAAAMAARd4BFsAAovwcwACivIbAAKKqwEInQbUdAQABFsAAotqEwACizsBCJxmweMAATRgAwABFyrPxvbk+A07AAKMjwACjLQAAl1JgwABFYQEcwACjLy7AAFnNAgACgMAAo0HAQibfhMAAo07AQicZAMAAhlRJwACjYiEcwACjaoXAAKNmwEInKEgBAAErAMAA/Sk+AT0cwACjfS7AAFnKAwADhcAAo5LAQicogMAAo5fAQibfFMAAo6TAQigoCQAAwACGVT9KwACjvgEUwACjxcBCKCgJAD9JwACj2hzAAKPqhMAAo97AQicZtf4CAAIWwACkE4DAAKQHwEIm36TewABGYRTAAKQdwEInrQgAAMAATTI+AUrAAKQ3ASs/TsAApGXAAKRtAAC+MV3AAPwyAWC8twEcwACkg4TAAKR3wEInGbQfAgACFsAApJ2AwACkkcBCJt+k3sAARmEUwACkp8BCJ60IAADAAE00ScAApYEcwACllhTAAKWFwEIpCAkAljABAAEWwACltxbAAKWohMAApZzAQicZsvvAAE0XsZi5JwDAAPxFPgNOwACl7sAApfgAAJdSYMAARWEBHMAApfouwABZzQIAAoDAAKYMwEIm34TAAKYZwEInGQDAAIZUScAApi0hHMAApjWFwACmMcBCJyhIAQABKwDAAP0pPgE9HMAApkguwABZygMAA4XAAKZdwEInKIDAAKZiwEIm3xTAAKZvwEIplAoAAMAAhlU/SsAApokBFMAAppDAQimUCgA/SsAApqUBKwbAAIZTgXPAAKa5wACm5cAApxcA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aoZpYMAAhsLAAVS2AYaLaoaLYMAAhrXAAO7NAD4BSoabAWqGomDAAIbCwADu4QGGx2qGx2DAAIa1wADvAwA+AUqG2wFqhuJgwACGwsAA7xcAAEJnogBCZ+cAQmhKAEJohwBCaTcAQmngAAAABQLAAIbTgXaG+4cAh8cLwABaZQAAAWDAAP0cAAAZBMAAhtWBdocAhwAJJwBgwAD70AAEwACG14F2hwCHAAkowACGtABgwAD9tgAEwACG2IF2hwCHAAYpAF3AAPx0AWDAAIbTAWoAXcAA/HQBYMAAhtPAAVTSBMAAhtmBdocXhxcGnasAYMAAhtMBagBgwACG08AA9TcEwACG2oF2hx2HHQbAAFpmAGDAAIbTAWoAYMAAhtPAAPVOBMAAhtuBdocnhycGnbgAYMAAhtMBagBgwACG08AA9z4EwACG3IF2hzCHMAbAAFpnAGDAAIbTAWoAYMAAhtPAAPYvBMAAht2Bdoc3hzcGwABaaABgwACG0wFqAGDAAIbTwAD2RgTAAIbegXaHPoc+BsAAWmkAYMAAhtMBagBgwACG08AA9l4EwACG34F2h0WHRQbAAFpqAGDAAIbTAWoAYMAAhtPAAPZ2BMAAhuCBdodMh0wGwABaawBgwACG0wFqAGDAAIbTwAD2jgTAAIbhgXaHVIdUBsAAWmwAYMAAhtMBagBgwACG08AA9wwEwACG4oF2h1uHWwbAAFptAGDAAIbTAWoAYMAAhtPAAPXlBMAAhuOBdodih2IGwABabgBgwACG0wFqAGDAAIbTwAD1/QTAAIbkgXaHaYdpBsAAWm8AYMAAhtMBagBgwACG08AA9hUEwACG5YF2h3GHcQbAAFpwAGDAAIbTAWoAYMAAhtPAAPbYBMAAhuaBdod5h3kGna8AYMAAhtMBagBgwACG08AA9qYEwACG54F2h3+HfwbAAFpxAGDAAIbTAWoAYMAAhtPAAPbyBMAAhuiBdoeHh4cGnQYAYMAAhtMBagBgwACG08AA9r4EwACG6YF2h42HjQbAAFpyAGDAAIbTAWoAYMAAhtPAAPWzBMAAhuqBdoeUh5QGwABacwBgwACG0wFqAGDAAIbTwAD1ywTAAIbrgXaHmoeaBsAAWnQAYMAAhtMBagBgwACG08AA9ZkEwACG7IF2h6GHoQaaIgBgwACG0wFqAGDAAIbTwAD1ZQTAAIbtgXaHsIewBpohAGDAAIbTAWoAYMAAhtPAAPV/BMAAhu6Bdoe+h74GwABadQBgwACG0wFqAGDAAIbTwAD3JAEFwACG8oF2hwCHAIfHAQAAA4cAh8cAAAACAgKHAAAABCdgwAD70ACHAAAABChgwAD9tgAAYMAAhtMBPwMIAMAAhtWAAMBCbW0IAMAAhteBAMBCbXkJAADAAP0yAAAAAAEGwACG8IF2hwCHAIfHAAAjAAAAAQOHAIfHAAAAAAAAAGDAAP22AUoAAQ8ALsAAhtcAAEJtsgBCbeIAAAABAsAAhvOBdofKh9CdigPAAFp2AAABYMAA/RwAABgEwACG9YF2h/yIAAmCZwBgwACG0wAEwACG9oF2iBGIFQmAvQBgwAD9tgAEwACG94F2iU2JiwadqwBgwACG8wFqiV5gwACG88ABVTEEwACG+IF2icOJ5gbAAFpmAGDAAIbzAWqJ0mDAAIcYwAFVSATAAIb5gXaKHopiBp24AGDAAIbzAWqKMmDAAIbzwAFVXwTAAIb6gXaKoIrfBsAAWmcAYMAAhvMBaoqyYMAAhvPAAVV2BMAAhvuBdosdi1wGwABaaABgwACG8wFqiy9gwACG88ABVY0EwACG/IF2i5qL2QbAAFppAGDAAIbzAWqLrGDAAIbzwAFVpATAAIb9gXaMF4xWBsAAWmoAYMAAhvMBaowpYMAAhvPAAVW7BMAAhv6BdoyVjNcGwABaawBgwACG8wFqjKhgwACG88ABVdIEwACG/4F2jRWNVAbAAFpsAGDAAIbzAWqNJ2DAAIbzwAFV6QTAAIcAgXaNk43TBsAAWm0AYMAAhvMBao2lYMAAhvPAAVYABMAAhwGBdo4SjlIGwABabgBgwACG8wFqjiRgwACG88ABVhcEwACHAoF2jpKO1AbAAFpvAGDAAIbzAWqOpWDAAIbzwAFWLgTAAIcDgXaPE49VBsAAWnAAYMAAhvMBao8mYMAAhvPAAVZFBMAAhwSBdo+Tj9AGna8AYMAAhvMBao+kYMAAhvPAAVZcBMAAhwWBdpAPkFEGwABacQBgwACG8wFqkCJgwACG88ABVnMEwACHBoF2kI+QzAadBgBgwACG8wFqkKBgwACG88ABVooEwACHB4F2kQqRSQbAAFpyAGDAAIbzAWqRHGDAAIbzwAFWoQTAAIcIgXaRh5HEBsAAWnMAYMAAhvMBapGYYMAAhvPAAVa4BMAAhwmBdpICkkEGwABadABgwACG8wFqkhRgwACG88ABVs8EwACHCoF2koGS0QaaIgBgwACG8wFqkptgwACHHsABVuYEwACHC4F2kw+TXQaaIQBgwACG8wFqkyhgwACHHsABVv0EwACHDIF2k52T5AbAAFp1AGDAAIbzAWqTs2DAAIckwAFXFAEFwACHF4F2iBqIIIhGAYC1wACGtAADiDCIRgAAAAICAog2AAAEgmdgwACG0wCIQQAABIC9YMAA/bYAAGDAAIbzAT8DCAHAAIb1gADAQnFNCAHAAIb2gQDAQnFaCQGIIMAA/TIAAAAABgbAAIcOgXaIp4iwiMcBAMAAWmMAAAABA4jAiMcAAAAAAAAAYMAA+goBSojDASkGwACHD4F2iMyI14jrAQC62QAAAAEDiOSI6wAAAAAAAABgwAD9tgFKiOcBFojnLoC9wACG9gbAAIcRgXaI8IkDiRUAACMBaojxYMAA/RwCAAABA4kLiRUAAAAAAAAAYMAA/bYBSokRARaJES6AvcAAhvYGwACHEoF2k+mT/5TtAAGDBwAAAAEDlASU7QAAAAEBAZQMAAAAgJZgwAD9tgAAYMAAhvMBPgFHlBmAlCHAQnJVBAGUNWqUNWDAAP22wACR8wA+AUqUQwFqlEpgwACG88ABVuYBlGJqlGJgwAD9tsAAkfYAPgFKlHABapR3YMAAhvPAAVb9AZSOapSOYMAA/bbAAJJAAD4BSpScAWqUo2DAAIbzwAFXFAABPgFKlMMBHpTKwACHEwEAAYCU3cBCclUABsAAhxOBdpTylQiYJwABwABadwAAAAEDlRqYJwAAAAEBAZUiAAAAgJZgwAD9tgAAYMAAhvMBPgFHlS+AlTfAQnMYFAGVS2qVS2DAAP22wACSQwA+AUqVWQFqlWBgwACG88ABVTEBlW9qlW9gwAD9tsAAkkUAPgFKlX0BapWEYMAAhvPAAVVIAZWXapWXYMAA/bbAAK1NAD4BSpWlAWqVrGDAAIbzwAFVXwGVvmqVvmDAAP22wACSZwA+AUqVywFqldJgwACG88ABVaQBleJqleJgwAD9tsAAkm0APgFKle8BapX2YMAAhvPAAVW7AZYGapYGYMAA/bbAAJJqAD4BSpYTAWqWGmDAAIbzwAFV6QGWKmqWKmDAAP22wACSbwA+AUqWOAFqlj9gwACG88ABVdIBllBqllBgwAD9tsAAkmIAPgFKll0BapZkYMAAhvPAAVV2AZZ0apZ0YMAA/bbAAJJkAD4BSpaBAWqWiGDAAIbzwAFVjQGWmGqWmGDAAP22wACSXwA+AUqWpgFqlq1gwACG88ABVgABlr1qlr1gwAD9tsAAklwAPgFKlssBapbSYMAAhvPAAVYXAZbiapbiYMAA/bbAAKysAD4BSpbxAWqW+GDAAIbzwAFWLgGXCWqXCWDAAP22wACSSwA+AUqXFwFqlx5gwACG88ABVkUBly9qly9gwAD9tsAAkkgAPgFKlzwBapdDYMAAhvPAAVZcAZdSapdSYMAA/bbAAJJQAD4BSpdgAWqXZ2DAAIbzwAFWcwGXeGqXeGDAAP22wACSTgA+AUqXhQFql4xgwACG88ABVooBl5tql5tgwAD9tsAAklkAPgFKl6gBapevYMAAhvPAAVahAZe/ape/YMAA/bbAAJJWAD4BSpfMAWqX02DAAIbzwAFWzwGX42qX42DAAP22wACSUwA+AUqX8AFql/dgwACG88ABVrgAAT4BSpgSASsGwACHFIF2mEiYXp2IAAHAAFpkAAAAAQOYZp2IAAAAAQEBmHoAAACCZ2DAAIbTAABgwACG8wE+AUeYhoCYjsBCdeoWAZi0api0YMAAhtPAAPU3AD4BSpjAAWqYx2DAAIbzwAFVMQGY6WqY6WDAAIbTwAD1TgA+AUqY+QFqmQBgwACG88ABVUgBmSZqmSZgwACG08AA9z4APgFKmTUBapk8YMAAhvPAAVVfAZlhaplhYMAAhtPAAPZeAD4BSpluAWqZdWDAAIbzwAFVpAGZmGqZmGDAAIbTwAD2dgA+AUqZpQFqmaxgwACG88ABVbsBmc9qmc9gwACG08AA9wwAPgFKmdwBapnjYMAAhvPAAVXpAZoGapoGYMAAhtPAAPaOAD4BSpoUAWqaG2DAAIbzwAFV0gGaP2qaP2DAAIbTwAD2LwA+AUqaTAFqmlNgwACG88ABVXYBmnZqmnZgwACG08AA9kYAPgFKmoMBapqKYMAAhvPAAVWNAZqtapqtYMAAhtPAAPXlAD4BSpq6AWqawWDAAIbzwAFWAAGa5Gqa5GDAAIbTwAD1/QA+AUqa8QFqmvhgwACG88ABVhcBmxtqmxtgwACG08AA9hUAPgFKmykBapswYMAAhvPAAVYuAZtUaptUYMAAhtPAAPbYAD4BSptiAWqbaWDAAIbzwAFWRQGbjWqbjWDAAIbTwAD2pgA+AUqbmQFqm6BgwACG88ABVlwBm8Jqm8JgwACG08AA9vIAPgFKm9ABapvXYMAAhvPAAVZzAZv7apv7YMAAhtPAAPa+AD4BSpwHAWqcDmDAAIbzwAFWigGcMGqcMGDAAIbTwAD1swA+AUqcPQFqnERgwACG88ABVqEBnGdqnGdgwACG08AA9ZkAPgFKnHQBapx7YMAAhvPAAVbPAZyeapyeYMAAhtPAAPXLAD4BSpyqAWqcsWDAAIbzwAFWuAGc02qc02DAAIbTwAD1ZQA+AUqc6AFqnO9gwACG88ABVuYBnRpqnRpgwACG08AA9X8APgFKnS4Bap01YMAAhvPAAVb9AZ1fap1fYMAAhtPAAPckAD4BSp1wAWqdd2DAAIbzwAFXFAAAQnGVAEJxwwBCcfgAQnI1AEJy9gBCdcgAQnj3AAAABgLAAIcYgXaeFp4cnvMDwABaeAAAAWDAAIbzAAAAAQXAAIcdgXaeSp5Qno8BAAADnmKejwAAAAAAAABgwACHGAE/AQkAnm3AAIcXAgACap6CYMAAhtPAAPVOJ5nkAAIGwACHGoF2npSeqZ7BAQDAAFpjAWqelWDAAP0cAgAAAQOeuZ7BAAAAAAAAAGDAAPoKAUqevAEqBsAAhxuBdp7Gnt2e8QEAutkBap7HYMAA/RwCAAABA57qnvEAAAAAAAAAYMAA/bYBSp7tASdIAABCeXYAQnmtAEJ54wAAAAICwACHHoF2n1WfW6BDA8AAWnkAAAFgwACG8wAAAAEFwACHI4F2n4efjZ/fAQAAA5+dn98AAAACAgKfsQAAAIJnYMAAhtMAn74AAACAvWDAAP22AABgwACHHgE/AQkAn9LAAIcXAgACgJ/UwEJ6LYGf2sBCejoAAgbAAIcggXaf5J/5oBEBAMAAWmMBap/lYMAA/RwCAAABA6AJoBEAAAAAAAAAYMAA+goBSqAMASoGwACHIYF2oBagLaBBAQC62QFqoBdgwAD9HAIAAAEDoDqgQQAAAAAAAABgwAD9tgFKoD0BKwAAQnprAEJ6ogBCetcAAAACAsAAhySBdqByoHihXgPAAFp6AAABYMAAhvMAAAABBcAAhymBdqCjoKmg+gEAAAOguKD6AAAAAgICoMwAAACCZ2DAAIbTAKDZAAAAgL1gwAD9tgAAYMAAhyQBPwEJAKDtwACHFwIAAoCg78BCeyGBoPXAQnsuAAIGwACHJoF2oP+hFKEsAQDAAFpjAWqhAGDAAP0cAgAAAQOhJKEsAAAAAAAAAGDAAPoKAUqhJwEqBsAAhyeBdqExoUihXAEAutkBaqEyYMAA/RwCAAABA6FVoVwAAAAAAAAAYMAA/bYBSqFYASeZ4wAAQntfAEJ7lgBCe80AAAACAAABgXYAQnvgAEJk6ABCZmAAQmn9AEJt7wBCeRgAQnn0AEJ66ABCe94AAAAHAEJ74AAAAAAAAADAAIcqAIF3AAAAAAAAAAMEwACHLIF3gOSBAgbAAFp7AGDAAPvQAWqBAWDAAPvQCQTAAIctgXeBDoEsBsAAWnwAYMAA+9ABaoErYMAA+9AVBMAAhy6Bd4E4gVYGwABafQBgwAD70AFqgVVgwAD70CEAAYF3AEJ8hgBCfCQAAAAAAEJ8hgAAAAAAAADAAIcvAIF4AAARgNoAALfQAACA+QAAuC8AAIEbAAC8kAAAgT8AAMAAYkoAAIFgAADAAG4QAACBiQAAwABtowABAQG3rIHJAADAAIHFAACB9AAAwAB51AAAgiIAAMAAai0AAIJLAADAAG+fAACCgAAAwACCXAAAgrYAAID7AACC0AAAwABw4AAAgvsAAMAAbnIAAIMjAADAAEs2AACDRwAAwABNCwAAg2AAAMAAg4gAAAAAAAECwACHMIF4g4GDh5lKA8AAWn4AAAFgwAD9HAABYMAATVEeBMAAhzKBeIPRg9sJs1QAYMAAg40ABMAAhzOBeIQGhBgJpOUBaoPhYMAA/RwCYLr9AATAAIc0gXiEOYRCCbd3AWqEHmDAAP0cAmDAAGNiAATAAIc1gXiEaYR3CbL7AWqESGDAAP0cAmC5FAAEwACHNoF4hJmEowm3bwFqhH1gwAD9HAJgwABqPwAEwACHN4F4hMqE2Qm3cwFqhKlgwAD9HAJgwAB51QAEwACHOIF4hP2FCQmzRwFqhN9gwAD9HAJgwACBxgAEwACHOYF4hTGFQQm2dwFqhQ9gwAD9HAJgwABvwQAEwACHOoF4hXuFhAm1/AFqhUdgwAD9HAJdwAD8pQJgvKVdwAD9ZwFgvKUABMAAhzuBeIW+hdoJu7QBaoWKYMAA/RwCXcAA/KUCYLylXcAA/WcBYLylAATAAIc9gXiGNoZJCbsKwACHLwBdwAD9ZwFgvKUABMAAh0KBeIZ3hooJu8gBaoZPYMAA/RwCXcAA/DIBYLy3AATAAIdDgXiGuIbPCbu5AWqGkGDAAP0cAl3AAPwyAWC8twAEwACHRIF4hvSHAQmz9QFqhtRgwAD9HAJgwABtpAAEwACHRYF4hy6HPwm3eAFqhwdgwAD9HAJdwAD8MgFgvKUABMAAh0aBeId1h4QJt2gBaodFYMAA/RwCXcAA/KUCYLy3YMAAboQABMAAh0eBeIeqh7gJqlsBaoeKYMAA/RwCYMAAcOEABMAAh0iBeIffh+4JpPoBaoe+YMAA/RwCYMAAbjMABMAAhz6BeIgEiAwYwABQ9sAAhy8AYMAAgq4BKwTAAIdJgXiIMYg5CbtUAWqIEmDAAP0cAl3AAP1nAWDAAGJPAATAAIdKgXiIX4h9CbtZAF3AAPylAmC8kV3AAP1nAWDAAGJPAATAAIdLgXiIpYjECbtaAF3AAPylAmDAAEtIXcAA/WcBYMAAYk8ABMAAh0yBeIjxiQkJu1MBaojKYMAA/RwCXcAA/WcBYMAAYqIABMAAh02BeIkriUAJu2cBaokPYMAA/RwCXcAA/WcBYLzwAATAAIdOgXiJa4mRCbvJAWqJRmDAAP0cAl3AAP1nAWC8zAAEwACHT4F4ibiJxgmzEAFqiZdgwAD9HAJdwAD8MgFgvPAABMAAh1CBeIn1igYJuYQBaonMYMAA/RwCXcAA/DIBYMAAYnYABMAAhz+BeJMhkzgYu1/AAIcvAF3AAPx0AWC8zAErBMAAh0CBeJWulcUYu2DAAIcvAF3AAP1nAWC8zAErBMAAh0GBeJd0l4sYu2HAAIcvAF3AAP1nAWC8zAErAQXAAIdfgXiKRIpEjkEAAAADilSOQQAAABwBAYpaAAAEs1RgwACDjQAbin0AAAB6YIEUAWoAYMAA/Nl3ipEAAASk5WC6/QFqAGDAAPzZd4qwAAAEt3dgwABjYgFqAGDAAPzZd4rGAAAEsvtguRQBagBgwAD82XeK4QAABLdvYMAAaj8BagBgwAD82XeK+AAABLdzYMAAedUBagBgwAD82XeLFAAABLNHYMAAgcYBagBgwAD82XeLLQAABLZ3YMAAb8EBagBgwAD82XeLXQAAALfFYMAAgtoBagBgwAD82XeLeAAABLP1YMAAbaQBagBgwAD82XeLngAAALvHXcAA/WcBYLylAWoAYMAA/Nl3i70AAAS3eF3AAPwyAWC8pQFqAGDAAPzZd4vbAAAEu8hdwAD8MgFgvLcBagBgwAD82XeL+wAABLu5XcAA/DIBYLy3AWoAYMAA/Nl3jB8AAAS3aF3AAPylAmC8t2DAAG6EAWoAYMAA/Nl3jDsAAAS1/F3AAPylAmC8pV3AAP1nAWC8pQFqAGDAAPzZd4xRAAAEu7RdwAD8pQJgvKVdwAD9ZwFgvKUBagBgwAD82XeMegAABKpbYMAAcOEBagBgwAD82XeMlQAABKT6YMAAbjMBagBgwAD82XeMsQAABLtUXcAA/WcBYMAAYk8BagBgwAD82XeMxgAABLtZXcAA/KUCYLyRXcAA/WcBYMAAYk8BagBgwAD82XeM8QAABLtaXcAA/KUCYMAAS0hdwAD9ZwFgwABiTwFqAGDAAPzZd40dAAAEu1NdwAD9ZwFgwABiogFqAGDAAPzZd41CAAAEu2ddwAD9ZwFgvPABagBgwAD82XeNZAAABLvJXcAA/WcBYLzMAWoAYMAA/Nl3jZcAAASzEF3AAPwyAWC88AFqAGDAAPzZd42yAAAEuYRdwAD8MgFgwABidgFqAGDAAPzZd2DAAIcwAT4BPReN/S7AAFD2wACHLxyOFxSOCMBCghAJAMAAWOoCAAIugY41wEKBbwDAAILgwACHPhsIAcAAhzKAAMBCgWEIAcAAhzOCAMBCgYEIAcAAhzSDAMBCgZQIAcAAhzWEAMBCgakIAcAAhzaFAMBCgbwIAcAAhzeGAMBCgdEIAcAAhziHAMBCgeYIAcAAhzkUAMBCgfsIAAgBwACHRBQAwEKCJQoACAHAAIdFFADAQoJTDAAIAcAAh0IUAMBCgmwNAAgBwACHQxQAwEKChQ4ACAHAAIdGFADAQoKeDwAIAcAAhzoUAMBCgrwQAAgBwACHOxQAwEKC3hEACAHAAIdHFADAQoMAEgAIAcAAh0gUAMBCgxUTAAgBwACHSRQAwEKDKhQACAHAAIdKFADAQoNFFQAIAcAAh0sUAMBCg2kWAAgBwACHTBQAwEKDjxcACAHAAIdNFADAQoOqGAAIAcAAh04UAMBCg8MZAAgBwACHTxQAwEKD3BoACAHAAIdQFADAQoP1GwAIAMAAhz0UjeTAQoI6CwAJAYpEwAD9MgAAAAALBsAAh1KBeIoLiiyKPwEAt3ABaooMYMAA/RwCAAABA4o0ij8AAAAAAAAAYMAAgq4BSoo3ARaKNy7AAFD2wACHL8AAhz4GwACHWIF4jkaOV46oAAC1lQFqjkdgwAD9HAIAAAEDjmSOqAAAAAEBAY5xAAAAmcJgvKUAAGDAAPoKAT4BSo58ARyOlxaOgy67CsAAhy/AAIc9gxcBAAGAjqDAQoYjAMAA/XMGwACHU4F4jseO4o8KAQC0vQAAAAEDjvOPCgAAAAAAAABdwAD8MgFgvLcBSo72ARaPBhaO9i63aMAAh0aDYsAA/McGwACHWYF4jw+PII+qAAC7awFqjxBgwAD9HAIAAAEDjzmPqgAAAAEBAY9GAAAAgaZhAmC8kV3AAP1nAWDAAGJPXAAAXAE+AT0cj5wWj30uu1nAAIdKg/gBAAGAj6TAQobIAMAA/MQGwACHWoF4j6+PwJBOAAC7bAFqj7BgwAD9HAIAAAEDj9qQTgAAAAEBAY/nAAAAgaZhAmDAAEtIXcAA/WcBYMAAYk9cAABcAT4BPRyQQBaQIC67WsAAh0uD+AEAAYCQSMBChy4AwAD8xAbAAIdbgXiQU5BkkKwAALMBAWqQVGDAAP0cAgAAAQOQcJCsAAAAAQEBkH4AAACCZmC8twAAYMAA+goBSpCJARyQmRaQiS63aMAAh0aHQQEAAYCQpcBCh5YAwAD8uAbAAIdcgXiQsZDCkcMAALtjAWqQsmDAAP0cAgAAAQOQ1pHDAAAAAQEBkOAAAACBpmDAAPvGAABcAT4BPRyQ+RaQ6S63aMAAh0aD+AEAATSRAQORAZG+AAAAAgICkQ8AAACCZmC8twCRIwAAALspYMAAboQAAGDAAPzZAT4BSZEyIiWRPYGRNsBCiCZgvMwAFpGQHJFvFpFcLqTlwACHM7K/AQABFJGIwEKIJgEBYLzMALr2g7LAAPxXPgE9HJGngJGmwEKH8yABAAEUkajAQogmAQFgvMwAAD8AwAD8xAbAAIddgXiRyJHZkwcAALtkAWqRyWDAAP0cAgAAAQOR9ZMHAAAAAQEBkf8AAACBpmDAAPvGAABcAT4BPRySGBaSCC63aMAAh0aD+AEAATSSIAOSIJMCAAAAAgICki4AAACCZmC8twCSQgAAALspYMAAboQAAGDAAPzZAT4BSZJRIiIlklyBklXAQokEYLzMABaSghSSe8BCiQQBAWC8zIT8vLwAFpLUHJKzFpKgLqTlwACHM7K/AQABFJLMwEKJBAEBYLzMALr2g7LAAPxXPgE9HJLrgJLqwEKI0SABAAEUkuzAQokEAQFgvMwAAD8AwAD8xAbAAIdUgXiTPZNmlZUBALtlAWqTPmDAAP0cAgAAAQOTeJWVAAAAAAAAAF3AAPwyAWC8zAE+AkmTfhyTmhaTgi67X8AAhy/AAIc/SAEAASsAwAD9KT4CPReTqy67X8AAhy8xk9VgvMwAwACHPz0ck/AWk+Aut2jAAIdGg/gBAAE0k/gDk/iVZQAAAAICApQGAAAAgmZgvLcAlBoAAAC7ZmDAAG6EAABgwAD82QE+AUmUMSIllDyAlDXAQoooYLzMABaUXYGUUcBCijO7UsAAbn4+AUmUcSIiFpR8FJR1wEKKKAABYLzMhPy8vAAclKoWlKUUlJ7AQoooAAFgvMyAvbyTSAEAAWqUuWDAAP22wADi8wDAAP3FACEclOgWlNkusvvAAIc1sPEBAAEUlQzAQoooAAFgvMwAuQo+AT0clTsWlSMuu1/AAIcvwACHP1YBAAEUlT/AQoooAAFgvMwAwAD8hT8/AMAA/MQ/SpVzARaVei67X8AAhy/AAIc/BsAAh1WBeJXKlfOXWwEAu2gBapXLYMAA/RwCAAABA5YFl1sAAAAAAAAAXcAA/DIBYLzMAT4CSZYLHJYnFpYPLrtgwACHL8AAh0BIAQABKwDAAP0pPgI9F5Y4LrtgwACHLzUAAAABAF3AAP1nAWC8zAEeAMAAwOIAAWC8zAAAgADAQot5wACHQD0clmwWllwut2jAAIdGg/gBAAE0lnQDlnSXLAAAAAICApaCAAAAgmZgvLcAlpYAAAC7KWDAAG6EAABgwAD82QE+AUmWpyIiFpaygJarwEKLwLJ8vL8AFpbHgJbAwEKLwIT8vLwAFpbhgZbbwEKLy7tpwABujT4BPRyXDhaW9i67YMAAhy/AAIdAVgEAASaXEgGAlxLAQovAYLzMAMAA/XQ/AMAA/MQ/Spc5ARaXQC67YMAAhy/AAIdABsAAh1aBeJeQl7mZSAEAu2oBapeRYMAA/RwCAAABA5fLmUgAAAAAAAAAXcAA/DIBYLzMAT4CSZfRHJftFpfVLrthwACHL8AAh0FIAQABKwDAAP0pPgI9F5f+LrthwACHLzUAAAABAF3AAP1nAWC8zAEeAMAAwOIAAWC8zAAAgADAQoy6wACHQT0cmDIWmCIut2jAAIdGg/gBAAE0mDoDmDqZGQAAAAICAphIAAAAgmZgvLcAmFwAAAC7KWDAAG6EAABgwAD82QE+AUmYbSIiFph4gJhxwEKNAbJ8vL8AIhaYmoCYk8BCjQGEGby7ARaYrYCYpsBCjQGHery6ABaYzoGYyMBCjQy7acAAbo0+AT0cmPsWmOMuu2HAAIcvwACHQVYBAAEmmP8BgJj/wEKNAWC8zADAAP10PwDAAPzEP0qZJgEWmS0uu2HAAIcvwACHQQAAQoW2AEKF+gBChl0AQoafAEKHBQBCh20AQofKAEKIqABCiZsAQosXAEKMWABCjakAAAALAAABgXgAQo3gAEJ9VABCjd4AAAABAEKN4AAAAAAAAADAAIdgwABaf4FHAAAFgPwAAMAAvZcAAQEClkWXAYEyAAC8kAABAQG0VIFnAADAAI4pAAEBAcAAWoCBnAAAwABc1QAAgcoAAMAAaAoAAQEBwABKxwAAAcAAh2KBR8AAijjAAFqBAABeAAEBAWC8pQABV8AAh2IAYMAAh/MAAcAAilQAAACZwmC8pQAACgLAAIdjgUeCNYI6gqsLhagAAAFgwAD9HAAABwTAAIdlgUeCOoI6CScAYMAA+9AABMAAh2eBR4I6gjoJKMAAh2AAYMAA/bYABMAAh2iBR4I6gjoGKQBdwAD8dAFgwACHYwFqAF3AAPx0AWDAAIdjwAFXRATAAIdpgUeCTIJMBsAAWoMAYMAAh2MBagBgwACHY8AA8akEwACHaoFHgl6CXgbAAFqEAGDAAIdjAWoAYMAAh2PAAPF7BMAAh2uBR4J3gncGwABahQBgwACHYwFqAGDAAIdjwAFXMATAAIdsgUeCkoKSBsAAWoYAYMAAh2MBagBgwACHY8AA8ZIBBcAAh3CBR4I6gjqCqwEAAAOCOoKrAAAAAgICgjoAAAQnYMAA+9AAgjoAAAQoYMAA/bYAAGDAAIdjAT8DCADAAIdlgADAQo+gCADAAIdngQDAQo+sCQAAwAD9MgAAAAABBsAAh26BR4I6gjqCqwAAIwAAAAEDgjqCqwAAAAAAAABgwAD9tgFKAAEPAC7AAIdnAABCj+UAQpAVAAAAAQLAAIdxgUeEzITSu/8DvawAAAFgwAD9HAAACwTAAIdzgUeFZoWCBoPnAGDAAP22AWqFbGDAAP22wAFXWwTAAId0gUeGWIc6BcAATXYAXcAAaAsBYMAAh2MBHoZxwABoEwIBYMAAh2MBaoaTXcAA/HQBYMAAh2PAAVdgAcAASskpBMAAh3WBR4goiOkFwABaiABdwABoCwFgwACHYwEeiEzAAGgTAgFgwACHYwFqiG5dwAD8dAFgwACHY8ABV3MBwABKySkEwACHdoFHibaKCgWwnABdwABoCwFgwACHYwEeicbAAGgTAgFgwACHYwFqifZdwAD8dAFgwACHY8ABV0QBwABKySkEwACHd4FHjZ+NqQnAAE6UAGDAAIdxAATAAId5gUeNyo4zCcAAStrAAIdgAF3AAGgLAWDAAIdjAR6N1sAAaBMBAWDAAIdjAWqN/13AAPx0AWDAAIdjwAFXggAEwACHfYFHjkqOTQmZwgBgwACONgAEwACHfoFHjlyOagnAAFdiAGDAAPvQAATAAId6gUeOe46aGMAAWonAAIdgAGC8pQErBMAAh3uBR46ijsAYwABaisAAh2AAYMAA+9ABkwTAAId8gUebVZt/GMAAWovAAIdgAF3AAPx0AWDAAIdxATGbfWDAAIdxAAEFwACHnoFHm4SbhJwZAAAAA5uWnBkAAAADAwObnAAABMAATpRgwACHcQCbrQAABJnCYMAAjjYAm7cAAATAAFdiYMAA+9AAAGDAAIdxAT4BSZvNIRyb3Bab0S7AAE6UwACHd0gBAAErAMAA/Sk+AT0cm/gWm+0uwABOlMAAh3fAAFqMAQABLgDAAIeGPwQIAcAAh3eAAMBCkioIAcAAh32BAMBCkjkIAcAAh36CAMBCkkYJAZuEwAD9MgAAAAAZBsAAh4CBR4rHiuWNgQABtYUAAAABA4rvjYEAAAAEAAAEiv0AAADAAFqNYMAA+goBaosaYMAA+gp1iysAAADAAFqOYMAA+goBaotKYMAA+gp1i1sAAADAAFqPYMAA+goBaotyYMAA+gp1i4MAAADAAFqQYMAA+goBaouiYMAA+gp1XcAAaAsBYMAAh2MBPgZOi8aLywAAq8VdwABoCwFgwACHYwEfi9HAAGg8AAFgwACHYwAASYvvgIvzwEKS7j4BPRyMHYSMGMBCk11WAQABaowvYMAAh2PAAPF7AMAAaBw/SYxRgYxVwEKTBj4BPRyMgYSMfMBCk11WAQABaoyTYMAAh2PAAVcwAMAAaBw/SYy3goy7wEKTHj4BPRyM34SM2sBCk11WAQABaozxYMAAh2PAAPGpAMAAaBw/SY0Mg40QwEKTNj4BPRyNPISNN8BCk11WAQABao1OYMAAh2PAAPGSAMAAaBw/So1yAYSNecBCk10GwACHkYFHj3uPhI/XAQC7hwAAAAEDj5uP1wAAAAAAAABgwAD6CgFKj6QBHI+qFo+kLsAAStrAAIdgwACHeYMXAQABao/BYMAAh2PAAPF7AMAAaCQGwACHmYFHj9yP5ZCxAgC7hwAAAAEDj/uQsQAAAAEBAZABAAAAgJZgwAD6CgAAXAE+AUmQDiEckBiAkBLAQpS0SAEAARaQGy67h8AAh5EAwAD9KT4BPRyQOy7AAFqRwACHYAIAAWqQe2DAAIdjwADxewFWgJChwEKUtMAAh4I/BsAAh5KBR5LAksmTIAEAu4gAAAABA5LikyAAAAAAAAAAYMAA+goBSpLrARyS8RaS6y7AAErawACHYMAAh3mDFwEAAWqTCGDAAIdjwADxkgDAAGgkBsAAh5qBR5Mlky6UAAIAu4gAAAABA5NGlAAAAAABAQGTTAAAAICWYMAA+goAAFwBPgFJk1khHJNjgJNdwEKVh0gBAAEWk2Yuu4jAAIeSAMAA/Sk+AT0ck4guwABakcAAh2ACAAFqk8hgwACHY8AA8ZIBVoCT8MBClYfAAIeCPwbAAIeTgUeUSpRTlKcBALZMAAAAAQOUbJSnAAAAAAAAAGDAAPoKAUqUdQEiFpR1LruHwACHkQEWlI8uu4jAAIeSBsAAh4KBR5SslLGXIQAAwABakcAAh2AAAAABA5TXlyEAAAACAQGU5gAAAK71YMAAh2MAAZUBAAAAVmDAAPoKAWoAYMAA/Nl3XAE+Ak6VIJUnAACEUmDAAIdxARaVKS7AAE6UwACHd0mVOYGVPcBClls+Az0clVAWlUouwABK2sAAh2DAAId5hFkBAAFqlWVgwACHY8AA8akAwABoHj0clYIWlXwuwABK2sAAh2DAAId5VgEAAYCVhsBClk0AwABoHEOVnCEclaqClaPAQpZ0SAEAASsAwAD9KT4CPRyVxIKVvcBClnTAAFqSwACHYAEAAZQAwACHgz2KlfHAQpZ0FpYBgpX6wEKWdMAATpTAAId3PgM9HJYuFpYoLsAAStrAAIdgwACHeYRZAQABgJY1wEKWTQDAAGgeSZZLFpZVFpZPLsAAStrAAIdgwACHeYFVwABoFj4BPRyWbhaWaC7AAErawACHYMAAh3lWAQABapaAYMAAh2PAAPGpAMAAaBw/Q5afIRyWrYKWpsBClnRIAQABKwDAAP0pPgI9HJbHgpbAwEKWdMAAWpLAAIdgAQABHJbolIHEAAAAAMAA+/MAwACHgz2KlvXAQpZ0FpcFgpb+wEKWdMAATpTAAId3BsAAh5SBR5gWmB+YWQEAwABOXgAAAAEDmDiYWQAAAAAAAABgwAD6CgFKmDsBHJhWFpg7LsAAWorAAIdgwACHe4CXAQABkwDAAPz/BsAAh5WBR5i4mMCY9wEAwABOfQAAAAEDmNqY9wAAAAAAAABgwAD70AFKmN0BFpjdLsAAWorAAIdgwACHewbAAIeDgUeY/JkBmwMAAMAAWpLAAIdgAAAAAQOZIZsDAAAAAQEBmSYAAADAAFqTYMAA+9AAAFwBPgROmTmZQAAAmptgwAD6CgEWmUIuwABOXsAAh5Q9F5lgLsAAWorAAIdgHJl7FplgLsAAWorAAIdgwACHe2QBAAGAmX7AQpiyAMAA/PXAAId7TpmPmZUAAMAAWpRgwAD6CgEWmZcuwABOXsAAh5RJmbUhHJnAgZm5wEKYx0gBAAGCmcPAQpkWAMAA/Sk+AUmZ0oKZ1sBCmRY+Aj0cme0WmecuwABK2sAAh2DAAId5hFkBAAFqmgJgwACHY8AA8akAwABoHj0cmiEWmhsuwABK2sAAh2DAAId5VgEAAWqaM2DAAIdjwAFXMADAAGgcPgI9HJpqFppkLsAAStrAAIdgwACHeYRZAQABapp/YMAAh2PAAVcwAMAAaB5JmqEWmqsWmqUuwABK2sAAh2DAAId5gVXAAGgWPgE9HJrGFprALsAAStrAAIdgwACHeVYBAAFqmthgwACHY8AA8akAwABoHD8/BsAAh5yBR5xenGafYQQBrs4AAAABA5yLn2EAAAACAgKcngAAAINEYMAAXSoAnMsAAADAAFqVXcAA/KUCYLylYMAAh3EAAGDAAIdxAT4KPRyc4YCc2sBCmkaClAEAAWqc52DAAP22wAFXWwDAAF0sTpz+nQIAAJnCYMAAjjYBHJ0LgJ0EwEKaRpi/AAAAAMAAXVxOnS8AAADAAE6UYMAAh3EATp1MnVcAAITmYMAAjjYBHJ1ggJ1ZwEKaRrXYAAAAAMAAXV1JnXchHJ2GhJ17wEKayUgBAAErAMAA/Sk+Aj2LnZfAQpq5HJ2rgZ2kwEKaU0sBAAGEnazAQprJAMAA/LlAIRyd0YOdxsBCmrlIAQABKwDAAP0pncad2AEknhcDJ8AAWpaEngvAQprJJ4FqP06eKJ4yAADAAFqXYMAA+9ABHJ47gJ40wEKaRrB9AAAAAMAAXTlOnk6eXQAAwABXYmDAAPvQARyeZoCeX8BCmkawfQAAAADAAF05Tp55npMAAMAATn1gwAD70AEcnpyAnpXAQppGsH0AAAAAwABdOT0cnrKAnqvAQppGgowBAAFqnrZgwAD9tsABV1sAwABdLUqewAE1nssAAAEAYMAAh3EBH57LwACHngMAA4Oe3sBCmrmCnurAQpqWhp7vwEKbfAA1AAAAAQBbARefBxSfBcBCm+sIAMAAWorAAIdgh58kwEKbocAAh3s1AAAAAQBbARefTBafRhSfRMBCm+sIAMAAStrAAIdgwACHeYCWhZ9UwEKbV8AAaBoUAMBCm+sIAAbAAIeFgUefnJ+hoKQAAK7PAAAAAQOfsKCkAAAAAQEBn7oAAACEO2DAAFzbAABcAT4HPRyfy4CfxsBCnJaClAEAAWqf0WDAAP22wAFXWwDAAFzgPRyf4ICf28BCnJavdwEAARaf6y6ZwsAAh30AwABdCT0cn/qAn/XAQpyWtdoBAAE1AAAAAQBgwACHcQEWoAsuwABOlMAAh3cjHKAXgQDAQpz5SAEAASsAACsWoBeBAMBCnPmZwsAAh30BYMAAjjYAwABdCj0coCaAoCHAQpyWsIMBAAEWoDUWoC8uwABK2sAAh2DAAId5gJbAAGgVAMAAXOY9HKBGgKBBwEKclrCDAQABFqBPLsAAV2LAAId+AMAAXOY9HKBpgKBkwEKclrCDAQABFqByLsAAWorAAIdgwACHewDAAFzmPRygmICgk8BCnJaCjAEAAWqgnGDAAP22wAFXWwDAAFzhBsAAh4aBR6DeoOOhbgAAwABajAAAAAEDoPShbgAAAAEBAaEIAAAAmw1gwACHcQAAXAE+AkAhHKEyFqEgLsAAWovAAIdgwACHfIMXAQABgKE7wEKd8wDAAPxBoR+hRAA9HKFdFqFLLsAAWovAAIdgwACHfFYBAAGAoWHAQp3zAMAA/IUGwACHloFHoXOhlKG5AQDAAFqYAAAAAQOhpaG5AAAAAAAAAF3AAPwyAWDAAIdxAUqhqAEWoaguwABai8AAh2DAAId8BsAAh4eBR6JEokmjLQAAgxcAAAABA6JRoy0AAAABAQGiZQAAAIPWYMAAh3EAAGDAAPoKAT4CQ6JyIRyif4CiecBCnrdIAQABKwDAAP0pPgNJopAcopgWopQumcLAAId9SAEAARaioYCim8BCnreZwsAAh30AwAD9KUqipgEpP0miuRyizBaivS7AAFdiwACHfoFtAQABFqLVgKLPwEKet8AAV2LAAId+AMAA/QBKouUBKj89iKL5wEKetxajB4CjAcBCnrfAAE6UwACHd0qjHQEqBsAAh4iBR6Nuo3OjuQAAwABOeQAAAAEDo36juQAAAAEBAaOSAAAAg9ZgwACHcQAAYMAA+goBPgFKo58BHKOmLoMXAQABgKOvwEKfiwDAAIeHBsAAh5eBR6QPpBikZAEAqPUAAAABA6QnpGQAAAAAAAAAYMAA+goBSqQwASIWpDAutkzAAIeTARakTC7AAE5ewACHlAbAAIeJgUeliKWepjkAAMAATnoAAAABA6WupjkAAAACAQGlxgAAAKvFXcAAaAsBYMAAh2MAAaXYAAAAwABOfGDAAPoKAWql4GDAAPoKAF3AAPwyAWC8pQE+AUql7gEfpfnAAIfKAwACLoCmGsBCoB8BwABamSGBpi7AQqAzBsAAh4qBR6gLqBCpSgAAwABOfgAAAAEDqBupSgAAAAMCAqghAAAAqY1hAWC8pWDAAPoKAKhUAAAAq8VdwABoCwFgwACHYwABqGYAAADAAE58YMAA+goBaqhuYMAA+goAYMAA+goBPgJPqHyoigAAAcAAWpphAWC8pWDAAIfzAAOokaj0AAAAAQEBqJ4AAACZwmC8pQAAYMAAh/MBPgFKqKsBIxyou4CossBCoJwgAQABhKi8wEKhBAAAaqjRYMAAh/PAAU8JaqjmYMAAh/PAATt8AWDAAIfzSqj7ARypMRypAi7AAE5zAwACg6kSwEKg5YGpG8BCoK4BwABOfIKpKcBCoMLAAIeLSAEAAWqpQmDAAIfzwAFPCQDAAP0pBsAAh4uBR6x5rIevnwAAwABOcwAAAAEDrJavnwAAAAMCAqynAAAAgaZeAAEBAWC8pQABV8AAh2IAYMAAh/MArMEAAACrxV3AAGgLAWDAAIdjAAGs0wAAAMAATnxgwAD6CgFqrNtgwAD6CgBgwACH8wE+Bk6s9wAAAMAAWptgwACH8wBJrQUiIYKtCsBCoeoAHK0Zga0UwEKh1rWNAQABFq0kLsAAStrAAIdgwACHeQDAAGgmPgE9i600wEKiCxytQICtP8BCobkgAQABFq1BLpnCwACHfQAAPz0jHK2fg62WwEKiC0gBAAErAMAA/SmLrZbAQqILaq2xYMAAh/PAATt8KwFgwACH80mtwBytzYOtxMBCogtIAQABaq3eYMAAh/PAATt8AMAA/Sk+AUmt8CIcrfmBrfTAQqHWgxcBAAFqrhBgwACHY8AA8akAwABoJAEWriMuqPXAAIeXPgFGrj2udK5VAAAAmw1gwACHcQAWrmEuwABai8AAh2DAAId8PgJOro6umQAAwABanGDAAIfzARyupISum8BCovrAAE5zAgACgK60wEKhuYGut8BCodYAwACHi0muyByu14WuzMBCoxpIAQABaq7oYMAAh/PAAU8JAMAA/Sk+AUqu/AGFrwPAQqMaPz8/Sa83HK9Eg687wEKiC0gBAAFqr1VgwACH88ABTwkAwAD9KT4BSq9jAYOvasBCogs/Sq9+AWqvk2DAAIfzwAE7fAbAAIeMgUewfbCJsZUAALYlAAAAAQOwp7GVAAAAAAAAAGC8pQE+A0mwsCEWsLUuqPXAAIeXSrDFASs/SbDWHLD6FrDaLsAAWonAAIdgwACHekgBAAErAMAA/Sk+AT0XsQsuwABaicAAh2AcsTcuwABancAAh2AAAAAAwACHhMAAh3o/SrFrARaxci7AAFqJwACHYMAAh3oGwACHhIFHsZqxprOiAADAAFqdwACHYAAAAAEDscyzogAAAAAAAABgvKUBPgZJsdUWsdkutkzAAIeTPgFKsfsBFrICLpnCwACHfT9JshEhFrIWLqj1wACHlz4BSrIuASs/TrJYAAAAmw1gwACHcQBGsmaymbJ+AAAAg+5gwACHcQAWsoYuwABai8AAh2DAAId8PgFJsqEWsqqBsqXAQqTLqPXAAIeXPgFJssQcstGAssjAQqS5SAEAASsAwAD9KT4BPYiy5sBCpLmBsvHAQqTLPgFKsxIBFrMZLpnCwACHfT9JszohHLNHgLM+wEKkuUgBAAErAMAA/Sk+AUqzWAEcs2iAs1/AQqS5tiUAAAAAwACHjD9Ks5QBFrObLpnCwACHfQbAAIeNgUezp7OsuqIAAIQsAAAAAQOzs7qiAAAABQICs8EAAACD5GDAAP4AALPMAAAAg91gwAD9tgADs+UAAADAAE6MYMAA+goBarP3YMAA+goAtAkAAAC7c2DAAPoKAWq0EWDAAPoKdbQpAAAAwABOjWC8pQFqAGDAAPzZd1wBPglPtD+0RAAAAcAAWp5hAWC8pWDAAPoKAAO0T7UsAAAAAQEBtFwAAADAAFqfYLylAABgwAD6CgE+AUq0bwEpPRy1NoC1M8BCpZmCigEAAYG1PMBCpaYAwAD+FEm1Tha1Vha1Ui6ZwsAAh32EGrypPgE9HLVtgLVqwEKlmYKKAQABJ8AAWqAAwAD+FD89HLWOgLWLwEKlmYKKAQABJLWoAyet7xa1oRa1nS6ZwsAAh32AvbyTJ4LmAMAA/hRJta8WtbMuu4fAAIeRPgE9HLXWgLXTwEKlmYKKAQABJ7uAAMAA/hQ/SbX0FrX4LsAATl7AAIeUPgE9HLYdgLYawEKlmYKKAQABJ8AAWqEAwAD+FD9Jtj0WtkEuu4jAAIeSPgE9HLZmgLZjwEKlmYKKAQABJ7uCAMAA/hQ/PRy2iYC2hsBCpZmCigEAASfAAELVAMAA/hRJtpoWtrAWtp4uwABai8AAh2DAAId8gVXAAPxWPgE9HLbEgLbBwEKlmYKKAQABJ5mPAMAA/hQ+BU6267b2AADAAE57WwEWtvguwABai8AAh2DAAId8SbcRg7cVwEKlzD4BPY63J8BCp4Q1t0YAAAEAXcAA/HQBYMAAh3EBHLdGFrc0LsAAWovAAIdgwACHfICtAAAAAMAA/Eg1AAAAAQBbARy3W4e3WcBCp7WArgEAATS3YAO3YLepAAAAAgICt2EAAACB1WDAAIdxALdkAAAAgkpgwACHcQAAYMAA+9ABPgFKt3UBHLeHFreCFrd+FLd8wEKoCQgAmcLAAId9gL28k4JLAQABFreXFreTFLeRwEKoFgkAmcLAAId9gL28kwDAAP3GAMAA/IeHAMBCp7U/Tre/t8oAALuOYMAA+goBKka32QAAAAABAFsAJrf6AYa3+sBCp4RdwAD8MgFbPgJOt/EAAACEVmDAAIdxASa32QEUt/HAQqiPCABgwACHcUE+BUm4ECKCuBTAQqW0ACEWuC8UuCnAQqirCQCo9cAAh5c+AUK4SwA/SbhnIiEcuHmEuGvAQqXiSAEAASsAwAD9KQAhHLiXFLiRwEKoqwkAwABOfgIAAoW4o8BCpf4auMPAAId2AMAAh4o+AUK41QA/Sbjxh7j1wEKofD4BPRy5EIC5DcBCpZmCigEAASfAAFqiAMAA/hQ+AT0cuTyAuTnAQqWZgooBAAEngK8AwAD+FD0cuWEUuVvAQqirCQCELAUAAoC5acBCpZkkuX0CgblvwEKlpieD3APAAE6MgrmdwEKltLtzg7nDwEKlzMAATo2EuebAQqXiwACHjT2Puf7AQqh8KUm6H4e6I8BCqHw+Aj0cujyAujnAQqWZgooBAAEngK8AwAD+FD0culSAulHAQqWZgooBAAEkumkCgbpcwEKlpieZjwDAAP4UPgE9HLqGgLqDwEKlmYKKAQABJ5mPAMAA/hQGwACHjoFHuqe6rrvJAACzUwAAAAEDurK7yQAAAAMAAAO6wgAAAIPdYMAA/bYBarrPYMAA/baEBrreAAAAwABOjGDAAPoKAWq68GDAAPoKALsJAAAAwABOjWC8pQFqAGDAAPzZd2DAAP22AT4DTrssuy8AAIPkYMAA/gABH7s1wAD+HwAAAAA9HLtJLoQsBAACg7tRwEKqnoC7VcBCqlECwABOjIG7fMBCqmjAAE6NgrudwEKqgMAAh41Ku7EBHLu7g7u4wEKqniMAAAAAwAD+GQbAAIePgUe7zrvhu/0AACMBarvPYMAA/RwCAAABA7vpu/0AAAAAAAAAYMAA/bYBSrvvARy78xa77y6ZwsAAh30jAAAAAMAA/SoAAEKSzQBClEAAQpSUAEKVEwBClWcAQpXmAEKWJwBCmAQAQphPAEKYjABCmiYAQpx2AEKd0QBCnlQAQp6XAEKfaQBCn7oAQp/9AEKgegBCoZcAQqPAAEKkVwBCpXkAQqowAEKrAQBCq0oAAAAZAsAAh5+BR8AAQcjAAEHOwAB24gObtAAAAWDAAP0cAAAFBMAAh6GBR8AAQk7AAEJfBoPnAGDAAP22AWrAAEJUYMAA/bbAAVeNBMAAh6KBR8AAQn3AAEKBCYPuAGDAAIdxAATAAIekgUfAAEKRwABCrxjAAFqkwACHYABgvKUBKwTAAIelgUfAAEVMwABFVRjAAFqlwACHYABdwAD8dAFgwACHcQErBMAAh6aBR8AARy3AAEc/GMAAWqbAAIdgAF3AAPx0AWDAAIdxASsBBcAAh8GBR8AAR0TAAEdEwABHVwAAAAPAAEdMwABHVwAAAAEBAcAAR1IAAASD7mDAAIdxAABgwACHnwE/AggBwACHooAAwEKsqAkBwABHRMAA/TIAAAAAFQbAAIeogUfAAEeSwABHmsAASeEEAa7OAAAAAQPAAEe1wABJ4QAAAAICAsAAR8gAAACDRGDAAF0qAMAAR/UAAADAAFqVXcAA/KUCYLylYMAAh3EAAGDAAIefAT4GPRzAAEgLgMAASATAQq0FgpQBAAFqwABIEWDAAP22wAFXjQDAAF0sTsAASC7AAEgzAACD7mDAAIdxARzAAEg8gcAASDXAQq0USwEAARzAAEhEgMAASD3AQq0FmL8AAAAAwABdXADAAPy5TsAASG/AAEh4AACbQl3AAPx0AWDAAIdxARzAAEiBgMAASHrAQq0FrugCAWDAAIdxATTAAEiKA8AASIrAAEi+AAAAAAAAAGDAAIdxAT4BSsAASJUBHMAASKOBwABInMBCrRRLAQABHMAASKuAwABIpMBCrQWYvwAAAADAAF1cAMAA/LkBrukpwABdN07AAEjxwABJAwAAwABap13AAPx0AWDAAIdxARzAAEkMgMAASQXAQq0FrugCAWDAAIdxATTAAEkVA8AASRXAAElJAAAAAAAAAGDAAIdxAT4BSsAASSABHMAASS6BwABJJ8BCrRRLAQABHMAASTaAwABJL8BCrQWYvwAAAADAAF1cAMAA/LkBrukpwABdNz0cwABJaoDAAEljwEKtBYKMAQABasAASW5gwAD9tsABV40AwABdLUrAAEl4ATXAAEmDAAABAGDAAIefAR/AAEmDwACHwQEAAYLAAEmMwEKtXwA1AAAAAQBbARfAAEmahcAASZjAQq7mwABapcAAh2CDwABJpsBCraHAAIelNQAAAAEAWwEXwABJt4XAAEm1wEKu5sAAWqbAAIdghMAASczAQq4swACHpoUAwEKu5gbAAIeqgUfAAEoSwABKF8AAS3IAAK7PAAAAAQPAAEomwABLcgAAAAEBAcAASjAAAACEO2DAAFzbAABcAT4FPRzAAEpBgMAASjzAQq+QgpQBAAFqwABKR2DAAP22wAFXjQDAAFzgPRzAAEpWgMAASlHAQq+Qr3cBAAEWwABKZhbAAEphLoPuwACHopnCwACHfQDAAF0JPRzAAEp1gMAASnDAQq+QiD4DAWDAAIdxAhbAAEp/LsAAWqXAAIdgwACHpTTAAEqKA8AASorAAErMAAAAAQEBwABKngAAAIPuYMAAh3EAAGDAAPzZAT4BPRzAAEqxgMAASqzAQq+Qr3cBAAEWwABKwYHAAEq8wEKwOpnCwACHfQDAAF0JAZerKcAAXOQ9HMAASumAwABK5MBCr5CIPgMBYMAAh3ECFsAASvMuwABapsAAh2DAAIemNMAASwcDwABLB8AAS0kAAAABAQHAAEsbAAAAg+5gwACHcQAAYMAA/NkBPgE9HMAASy6AwABLKcBCr5CvdwEAARbAAEs+gcAASznAQrDGmcLAAId9AMAAXQkBl6spwABc5D0cwABLZoDAAEthwEKvkIKMAQABasAAS2pgwAD9tsABV40AwABc4QbAAIe7gUfAAEt3wABLh8AAS5YBAJnCAAAAAQPAAEuLwABLlgAAAAAAAABgvKUBSsAAS44BFsAAS5MWwABLji6D7sAAh6KZwsAAh30GwACHq4FHwABL18AAS9zAAEwcAADAAE55AAAAAQPAAEvnwABMHAAAAAEBAcAAS/sAAACD1mDAAIdxAABgwAD6CgFKwABMBQEcwABMChbAAEwFLoPuwACHosAATnkBAAGAwABMFsBCsbIAwACHiAbAAIesgUfAAExcwABMYcAATWMAAMAATngAAAABA8AATGvAAE1jAAAAAQEBwABMfwAAAIPWYMAAh3EAAGDAAPoKAT4DScAATIwcwABMkC7AAE55AQABgMAATJzAQrIgAMAAh6tKwABMpAEpP0nAAEy1IRzAAEzDFsAATLkuwABapcAAh2DAAIelSAEAASsAwAD9KT4BRsAATNTAAE0GwABM7AAAAMAAVzZgwACHcQAWwABM+y7AAFqlwACHYMAAh6U+AUnAAE0QHMAATSCBwABNFMBCspLAAE55AQABgMAATSzAQrIgAMAAh4hKwABNNAEpPz9KwABNUwEqBsAAh7yBR8AATa3AAE21wABPAgEAwABOgAAAAAEDwABNzsAATwIAAAAAAAAAYMAA+9ABPgNOwABN2MAATd4AAIDuYMAA+9ABFsAATeUWwABN4C6D7sAAh6LAAE59wACHlUnAAE4EIRzAAE4SFsAATgguwABa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CkgBAAErAAArHMAAidOCAMBERAqi8wIAAoDAAInowERD54HAAInvwERD9ADAAFfVAVwGwACKg4GBwACKAMAAihHAAIqIAACidwFqwACKAWDAAP0cAgAAAQPAAIomwACKiAAAAAICAsAAii0AAACieGCeqwDAAIo/AAAAnQRgnqsAAFwBPgE9NQAAAAEAYMAAVsoBFsAAik8uqG/AAIluIxzAAIpZggDARES0SAEAASsAACscwACKWYIAwEREtKJ3AgACgMAAim/ARESTgcAAinvARESgAMAAV3kBXAbAAIqEgYHAAIqNwACKnsAAiwcAAKJSAWrAAIqOYMAA/RwCAAABA8AAiqjAAIsHAAAAAgICwACKrwAAAJ9AYJ6rAMAAisEAAACiU2CeqwAAXAE+AT01AAAAAQBgwABWygEWwACK1S6ob8AAiW4jHMAAit+CAMBERV5IAQABKwAAKxzAAIrfggDAREVeolICAAKAwACK6sBERT2BwACK9sBERUoAwABXiQFcBsAAioWBgcAAiwzAAIsdwACLjAAAo3cBasAAiw1gwAD9HAIAAAEDwACLN8AAi4wAAAACAgLAAIs+AAAAkk5gnqsAwACLSQAAAIDuYMAA+9AAAFwBPgE9NQAAAAEAYMAAVsoBFsAAi1YuqG/AAIluIxzAAItgggDAREYKSAEAASsAACscwACLYIIAwERGCqN3AgACgMAAi3vAREXngcAAi4LAREX0AMAAV5YBXAbAAIqGgYHAAIuRwACLosAAjBcAAKK/AWrAAIuSYMAA/RwCAAABA8AAi8jAAIwXAAAAAQEBwACLzwAAAJJOYJ6rAABcAT4BPTUAAAABAGDAAFbKARbAAIvcLqhvwACJbiMcwACL5oEAwERGp0gBAAErAAArHMAAi+aBAMBERqeivwEAAYDAAIwNwERGkwDAAFfWAVwGwACKh4GBwACMHMAAjC3AAIygAACivAFqwACMHWDAAP0cAgAAAQPAAIxSwACMoAAAAAEBAcAAjFkAAACSTmCeqwAAXAE+AT01AAAAAQBgwABWygEWwACMZi6ob8AAiW4jHMAAjHCBAMBERztIAQABKwAAKxzAAIxwgQDAREc7orwBAAGAwACMlsBERycAwABX2AFcBsAAioiBgcAAjKXAAIy2wACNFQAAorgBasAAjKZgwAD9HAIAAAEDwACM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+MBExZsASsAARgcBgsAARg7ARMWyP0nAAEY1Ih7AAEY5wABZbgIAAoLAAEZGwETFsmrAAEZSXcAA/HQBYMAA/bbAAVq/AAEewABGesAAWQoBAAGCwABGksBExbIAPgE9isAARqfARMWyHMAARruBwABGtMBExZvAAEDHAwACgMAARtXARMWOLgEiHMAARxZqwABG+12RYAFhAWCeq2CRSbC7iAUBAAGCwABHJMBExbIAkWTAAFg/PgI9HMAAR0yBwABHRcBExZvAAEC3AgACgsAAR3fARMWyasAAR4ldkWABYQFgnqtgkUmwuwDAAFjGScAAR6whFsAAR7yCwABHscBExbKdZZ68PgE9isAASGfARMWyHMAASIQWwABIe4HAAEh0wETFm8AAQKrAAFf7wABAxwEAAYLAAEiewETFsgDAAIslP0rAAEi9AYLAAEjEwETFsgAARMVXAETHlAAAAAECwACLnYGIwABJBcAASQvAAE1nA8AAW5QAAAFgwABZCwAAAAEFwACLoYGIwABJS8AASVHAAEmrAQAAA8AASXLAAEmrAAAAAAAAAGDAAIudAT8BCQDAAEl9wABZRAIAASfAAEGVAaGXKQEGwACLn4GIwABJsMAAScLAAE1lAADAAEDZAWrAAEmxYMAA/RwCAAABA8AASdLAAE1lAAAAAgICwABJ2QAAAJJOYJ6rAMAASecAAAChQGDAAFfwAABgnqsBPgVOwABJ+8AASgYAAJ2NYJ6rARbAAEoOgMAASgjARMhBg7CexkAhHMAASi8WwABKKoLAAEofwETIZYJnnsNIAQABasAASjJgwAD70MAAkRMAwAD888AASh/AAEpCAEnAAEpJFsAASliCwABKTcBEyGWc6J66PgI9HsAASm7AAItOAgACgsAASo/ARMhlgcAASpvARMhOAErAAEqqAYLAAEqxwETIZT9JwABK2CIewABK3MAAWW4CAAKCwABK6cBEyGVqwABK9V3AAPx0AWDAAP22wAFa1gABHsAASw3AAFkKAQABgsAASyXARMhlAD4BPYrAAEs6wETIZRzAAEtOgcAAS0fARMhOwABAxwMAAoDAAEtowETIQS4BIhzAAEupasAAS45dkWABYQFgnqtgkUmwu4gFAQABgsAAS7fARMhlAJFkwABYPz4CPRzAAEvfgcAAS9jARMhOwABAtwIAAoLA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VIulAMAAWMVJwACNIh7AAI0mwABZZAIAAieaEYDAAI04wETsSgA+AT0cwACNVIHAAI1NwETsV8AAQMYCAAKAwACNa8BE7EpqwACNfWCRVMAAjVQAwABYxT8/BsAAi0+BiMAAjaXAAI2qwACOKAABwABbogAAAAEDwACNycAAjigAAAABAQHAAI3QAAAAkk5gnqsAAGDAAPoKAUrAAI3eASIWwACN5IDAAI3ewETtcp1cnr0BHsAAjfLAAFluAgACgMAAjf/ARO1yasAAjgZdwAD8dAFgwAD9tsABW6kABsAAi1CBiMAAjivAAI4wwACO1QABwABbowAAAAEDwACOV8AAjtUAAAABAQHAAI5eAAAAkk5gnqsAAGDAAPoKAUrAAI5sASIWwACOcoDAAI5swETt9p1dnsABHsAAjovAAFluAgACgMAAjpjARO32asAAjp9dwAD8dAFgwAD9tsABW8AAAYGIAETuTgBEpu8ARKj2AESraABErcYARLAHAESynABEtQ4ARLcFAES6DwBEvCIARL2vAES/+gBEwq0ARMSkAETHoQBEylQARMzsAETQ0ABE07MARNcmAETargBE3UkARODuAETkdQBE6NkAROwcAAAAGQBE7B4ARO1GAETtygBE7k4AAAADAAAAwACL38AAW6SBiQAAH4EHAADAAOn5AACBGQAAwADEwwABAQGIY4FBAACkMAAAgV0AALfQAAEBArCRpHyBlQAAwABgiAABAQKy3LPWgewAALgvAAEBArGVss2COwAAuxgAAQEDs8ey5KSBgpgAALyQAACCvwAAwABiSgAAguMAAMAAQcEAAIMOAADAAGN5goEAgy8AAMAAbaMAAQECwABNALvmg4kAAMAAgcUAAIO3AADAAHl3AACD8AAAwABCoQAAhB4AAMAAedQAAIRPAADAAGOuAAEBApkTwABJZoSSAADAAGotAACEvgAAwAB2AwABAQLAAFDhwABREoUdAADAAHdlAAEBAbdPhWIAAMAAglwAAQEBu+qFsQAAwAB0fwABAQLAAEZTwABQfYX+AADAAHpAAAEBAcAAUwmGPQAAgPsAAIZaAADAAEuBAACGjgAAwABLNgABAQGkk4bDAADAAG9XAAEBAcAATZKHCAAAwABNCwABAQGkl4c1AADAAHo/AAEBCcAAW6W3Uq7HwABbpsAAW6fAAFuo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AAGFwACt48BFWa0AwAD8uU7AAK3+wACuAwAAgpNgwACU4wEcwACuHYDAAK4PwEVWlMAAXFIBAAGGwACuOMBFWcYAwACiUErAAK5MAR/AAK5XwACN/QMAA4XAAK5owEVZrYLAAK5uwEVXgIfAAK52wEVZ+QAAwAD8PQbAAIwngYnAAK6MwACuncAAttMAAMAAXBDAAIvfAAAAAQPAAK6vwAC20wAAAAEBAcAArr8AAACWIGC8zAAAYMAAje4BPhNOwACu1sAArtsAAIC9YMAAlO0BHMAAruQWwACu3S63V8AAi9/AAIv2rzkBAAGAwACu98BFWpEAwABkO07AAK8MwACvEwAAwABRWWDAAP22ARzAAK8cFsAArxUut1fAAIvfwACL9q+FAQABgMAArzLARVqRAMAAZDxOwACvTsAAr1MAAIKTYMAAlOMBHMAAr2MWwACvVS7AAFu4wACL38AAi/VLAQABgMAAr2TARVqRAMAA/LlOwACveMAAr4YAAMAAXFNgwAD6CgEiIiEWwACvmYDAAK+RwEVakYd5vL0AIRbAAK+zgMAAr6vARVqRhS28wAAhFsAAr8iAwACvwMBFWpGFL7zBTsAAr9vAAK/oAADAAFw8YMAA+goBHMAAr+ouwABcNcAAi98BAAGAwACv/sBFWpEAwACMHE7AALASwACwHwAAwABcQmDAAPoKASKEwACwKcBFW1wAHMAAsFoWwACwSBbAALA6LsAAW7XAAIvfwACL6rtqwABNS4MXAQABgMAAsGPARVqRAMAA/EFOwACwesAAsIYAAMAAXDlgwACU7QEjhsAAsJDARVviHMAAsKYWwACwny63V8AAi9/AAIv2rzcBAAGAwACwuMBFWpEAwABkRSsBYMAAlO1OwACw1sAAsN8AAKBYYMAAlO0BK0nAALDrhsAAsO/ARVviPgJOwACxDsAAsRsAAMAASu9gwABLSAEcwACxSR7AALErwABLcQEAAYDAALFAwEVakQC67QAAAADAAEttPRXAALFhwEVchQgcwACxcxbAALFsLrdXwACL38AAi/avRQEAARTAALGCwEVcqQkAAMAAZCQ/TsAAsakAAACFNWDAAJTjAE7AALHEwACxyQAAgpBgwABiTwEcwACx3xbAALHLLq8NwACL38AAi+eyvgEAAYDAALHvwEVakQC69UnAALH9hsAAsgHARVviPgJOwACyIsAAsi0AALNFYLsbARzAALI/FsAAsi8us4PAAIvfwACL6bOIAQABgMAAslPARVqRALvaPRXAALJjwEVdGQkcwACyci7AAFw/wACL3wIAAibAALKIARTAALKIwEVdKQoAYMAAYuIUwACyjsBFXXILAADAAIwfP07AALK1wACyvAAAlkFgvMwBgMAAsr7ARVqRTsAAst7AALLxAAC0W2C88wEWwACy+hTAALLzwEVd7AsAtFu8z07AALMWwACzLQAAhRlgwAD70AEWwACzQhTAALMvwEVeBgwAtGW89k7AALNvAAAAwABcN1sATsAAs5fAALOiAADAAFxAYMAA+9ABk0nAALOrhcAAs6/ARVuuPgI9FcAAs8XARV5SDhzAALPmLsAAXDbAAIvfAQABFMAAtAXARV3sCwAAwACMHUnAALQUHMAAtDoWwAC0KxTAALQYwEVeBgwAhLi8+YCXAQABkwDAAPz/PgE9FcAAtEnARV5gD5Q/P0rAALTWAR/AALThwACN9g0ABoDAALT7wEVakYHAALUMwEVaqBzAALUkFsAAtRouwABIj8AAi9/AAIv9wABb+wEAAYLAALUzwEVa4wDAAIySg8AAtUTARVsgHMAAtVIuwABcQcAAi98DAAOAwAC1asBFWpGGwAC1c8BFW+KFwAC1gcBFW64AwACMIBTAALWYwEVchQgAB8AAXEKGwAC1uMBFW+LAAFw5h8AAtdvARVw3wABcPIXAALX+wEVbroUZFMAAtizARV4rDQDAAFw3FMAAtmzARV5SDgCFNRTAALaiwEVdGQkAwABcQBTAALbEwEVeYA8ABsAAjCiBicAAttjAALbdwAC5vwAAwABbyMAAi98AAAABA8AAtu/AALm/AAAAAgICwAC3AgAAALNFYLsbAMAAtyYAAADAAFv4XcAA/DIBYMAAYLsAAFwBPgJJwAC3jBzAALefgcAAt5DARWAcSAEAASsAwAD9KUrAALeoAD9GwAC3tMAAt+jAALfHAAAAwABMzmDAAGC7AIHAALfYwEVgHD4HPRzAALf6FsAAt/AuwABIj8AAi9/AAIv9wABcVAIAAoDAALgLwEVgD4LAALgXwEVgZQDAAIyRQCEcwAC4QBbAALg1LsAAW7zAAIvfwACMA4dBAQABgsAAuEzARWBlAMAA/LjAALg0wAC4WgBOwAC4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8B/AAFw8FMAATV7ARfA4CACFGRTAAE2QwEXwUQkAwABcNxTAAE3UwEXwaAoAhTUUwABODsBF8H0LAMAAXEAUwABONMBF8JQMAAIGwACN8oGPwABORMAATlnAAE5pAQCEGQFqwABORWDAAP0cAgAAAQPAAE5iwABOaQAAAAAAAABgwAD6CgFKwABOZQEpBsAAjfSBj8AATm7AAE6BwABO/QAAIwFqwABOb2DAAP0cAgAAAQPAAE6JwABO/QAAAAAAAABgwAD9tgE+AUrAAE6SASQAByfAAFzrFsAATrcWwABOsi6AvcAAjb+D0cAAlPQnwABcyxbAAE7GLpYgwACNvifAAFzjHsAATuHAAJmsAQABFsAATvEugpPAAI3AACeDIQAARfFeAEXxoQBF8jUAAAACAsAAjfeBj8AATwLAAE8IwABQVQPAAFzsAAABYMAAjd0AAWDAAI3pAQTAAI35gY/AAE9bwABPYRjAAFFZAWrAAE9JYMAA/RwCYMAAjSYAAQXAAI39gY/AAE9lwABPZcAAT74AAAADwABPdcAAT74AAAADAwPAAE9+AAAAgL1gwACU7QDAAE+JAAAEwABRWWDAAI0mAMAAT58AAACCk2DAAJTjAABgwACN9wE/AggBwACN+YEAwEXyyQkAwABPrcAAjeECAAKAwABPs8BF8rqCwABPucBF8toAAQbAAI37gY/AAE/DwABP1sAAUFMAACMBasAAT8RgwAD9HAIAAAEDwABP3sAAUFMAAAAAAAAAYMAA/bYBPgFKwABP5wEkAAgnwABc7RbAAFAMFsAAUAcugL3AAI2/g9HAAJT0J8AAXMsWwABQGy6WIMAAjb4nhsAnwABc4x7AAFA3wACZrAEAARbAAFBHLoKTwACNwAAngyEAAEXzHwBF87YAAAABAAABgY8ARfPFAEXDAwBFx3QARcjrAEXKvABFzFMARc33AEXPTQBFz9EARdGhAEXT9QBF3D4ARd7DAEXjjABF5GgARefYAEXrgABF7NAARe6cAEXvLwBF8kYARfPDAAAAFABF88UAAAAAAAAAwACN/sAAXO6BkAAADIEGAACkMAAAgR8AALgvAAEBArGVss2BawAAwABiSgABAQKGZoZ3gagAALyQAACBzAAAwABjebPYAIHtAADAAGN5AAEBAYKBgg0AAMAAedQAAII7AADAAGotAACC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WwAAWwE+B07AAESfwABErwAAwABde2DAAPvQARbAAESxLsAAXVXAAI8nTsAARNjAAETbAADAAEimYMAAlOMBHMAARN0uwABddgEAAYDAAETtwEZoaQDAAI9RScAARPkcwABE/S7AAF1vAQABgcAARQ3ARmh4AMAAj0w+AT2MwABFHcBGaMccwABFIi7AAF13wACPAwEAAYTAAEU0wEZoxwDAAI9TP07AAEVRwABFVAAAwABIp2DAAJTjARzAAEVWLsAAXXYBAAGBwABFZsBGaHgAwACPUU7AAEV2wABFfQAAgXZbARzAAEWBgsAARX/ARmiHIAIAAoTAAEWCwEZox4XAAEWGwEZpQwAAPRfAAEWPLsAAXVWDwABFpcBGaKTAAI8nSsAARboBhsAARcHARmlzBsAAj1iBlcAARyTAAEckwABKsgAAwABdfwAAAAEDwABHM8AASrIAAAACAgLAAEdIAAAAhyxdwAD8dAFgwACU4wDAAEdPAAAAliRhAV3AAPx0AWDAAJTjWwAAWwE+CE7AAEd6wABHigAAwABde2DAAPvQARbAAEeMLsAAXVXAAI8nTsAASCzAAEg/AADAAF2AYMAA+9ABk0FFwABISAHAAEhRwABIUwAAYmDAAPvQARzAAEhiFsAASFuAwABIVcBGafphwAD8o4GNAQABlADAAPz2ARzAAEhphMAASGfARmpsgW0BAAGTAMAA/QABjMAASHHARmpsHMAASG+EwABIccBGamyBjQEAAZQAwAD89kE+AknAAEh8HMAASIkcwABIhYDAAEiAwEZp+ksBAAGEwABIhsBGamwAwAD8g0gBAAErAMAA/SlCwABIkgE/ScAASKIcwABIpi7AAF1vAQABHMAASLuAwABItsBGafpLAQABhMAASLzARmpsAMAA/IMAwACPTD4CPYvAAEjLwEZqUITAAEjgwEZqbELAAEjrAD9OwABJEsAASRoAAK2lXcAA/HQBYMAAk6wBHMAASaYcwABJOxzAAEkigMAASRzARmn6lj4BAAGDwABJJ8BGalAAwAD8SoCrAQFgwACU4wE0wABJPwPAAEk/wABJpAAAAAEBAcAASUgAAACD7mDAAJOsAABgwACU4wE+AUrAAElWASMcwABJY4TAAElewEZr0EgBAAErAMAA/SkrHMAASXUuwABdd8AAjwMBAAEcwABJhy7AAF12AQABJsAASZcBhMAASZfARmvQYMAAlOMAwACPUQDAAI9TAWDAAJTjAMAA/D2ArQAAAADAAPxIPRzAAEm8hMAASbTARmtvgKUBAAEcwABJ6xzAAEnSgMAASczARmn6likBAAGDwABJ18BGalAAwAD8TICrAQFgwACU4wE0wABJ/gPAAEn+wABKUAAAAAEBAcAASgcAAACD7mDAAJOsAABgwACU4wE+AUrAAEoVASMcwABKIoXAAEodwEZssUgBAAErAMAA/SkrHMAASjQuwABddgEAASbAAEpEAYXAAEpEwEZssWDAAJTjAMAAj1EBYMAAlOMAwAD8PQDAAPyGTsAASlzAAEpjAACBdlsBHMAASmeBwABKZcBGag8gAQABJsAASmgBhMAASmjARmtvXcAA/HQBYMAAlOMAAD0XwABKdi7AAF1VgsAASozARmotwACPJ0rAAEqhAYXAAEqowEZtIAbAAI9ZgZXAAEtcwABLYcAAS5QAAsAAXYEAAAABA8AAS2/AAEuUAAAAAQEBwABLggAAAKVOYMAAQcUAAFwABsAAj1qBlcAATC/AAEw0wABMZQACwABdggAAAAEDwABMQMAATGUAAAABAQHAAExTAAAApU5gwABBxQAAXAAGwACPW4GVwABMasAATG/AAEz1AADAAF2DAAAAAQPAAEx/wABM9QAAAAEBAcAATJIAAAClTmDAAEHFAABcAT4CPRzAAEyrLsAAXYEBAAGAwABMusBGbisAwACPWT0cwABM0i7AAF2CAQABgMAATN/ARm4rAMAAj1oGwACPXIGVwABNIMAATSfAAE4/AAKhGwAAAAEDwABNNcAATj8AAAAGBgbAAE1QAAAAmoBdwAD8dAFgwACVwgDAAE11AAAAhLhdwAD8dAFgwACVwgDAAE2YAAAAwABdhGDAAJPMAMAATcgAAADAAF2FYMAAlRIAwABN9gAAAMAAXYZgwABBxQDAAE4pAAAAwABFTWDAAEHFAABgwACV4QAGwACPXYGVwABORMAATmjAAE6rAALAAF2HAAAAAQPAAE5/wABOqwAAAAEBAcAATpkAAAClTmDAAEHFAABdwAD8MgFgwACVQQAGwACPXoGVwABit8AAYsXAAG3vAADAAF1jAAAAAQPAAGLUwABt7wAAAAMDA8AAYuMAAACD7mDAAJXhAMAAYwEAAADAAEVN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wACpny7AAF0/wACPC4C/AgACgMAAqavARqqHgcAAqbPARqseAMAA/Lo9HMAAqdAWwACpxC7AAFMZwACPEFYBAAGAwACp1MBGqocAwAD8hT0cwACp3y7AAF10AQABFsAAqfOAwACp7sBGqoeCacAAlMAAwACPTz0cwACqChbAAKn+LsAAUxnAAI8QhhEAAAAAwAD8kz0cwACqHC7AAF1qAQABgcAAqifARqseAMAAj0YGwACPhIGVwACqO8AAqlXAAKqCAACwRAFqwACqPGDAAP0cAgAAAQPAAKplwACqggAAAAEBAcAAqnUAAACD7mDAAJY7AABgwACU4wFKwACqfgGAwACqfsBGrE0GwACPhYGVwACqh8AAqpPAAKrZAACwXAFqwACqiGDAAP0cAgAAAQPAAKqpwACq2QAAAAEBAcAAqr8AAACD7mDAAJUCAABbAUrAAKrIARzAAKrILpzAAQABgMAAqtTARqynAMAAj00GwACPhoGVwACq3sAAqvjAAKslAACwQQFqwACq32DAAP0cAgAAAQPAAKsIwACrJQAAAAEBAcAAqxgAAACD7mDAAJZFAABgwACU4wFKwACrIQGAwACrIcBGrQ0GwACPh4GVwACrKsAAq0TAAKt1AACwQgFqwACrK2DAAP0cAgAAAQPAAKtWwACrdQAAAAEBAcAAq2gAAACD7mDAAJZjAABgwACU4wFKwACrcQGAwACrccBGrWcGwACPiIGVwACresAAq4bAAKvKAACwXwFqwACre2DAAP0cAgAAAQPAAKubwACrygAAAAEBAcAAq7AAAACD7mDAAJTKAABbAUrAAKu5ARzAAKu5LpzAAQABgMAAq8XARq3BAMAAj00GwACPiYGVwACrz8AAq+nAAKwaAACwQwFqwACr0GDAAP0cAgAAAQPAAKv7wACsGgAAAAEBAcAArA0AAACD7mDAAJZNAABgwACU4wFKwACsFgGAwACsFsBGricGwACPioGVwACsH8AArDnAAKx2AACFuwFqwACsIGDAAP0cAgAAAQPAAKxRwACsdgAAAAEBAcAArGkAAACD7mDAAJZXAABgwACU4wFKwACscgGAwACscsBGroEGwACPi4GVwACse8AArI/AAKyuAACGWAFqwACsfGDAAP0cAgAAAQPAAKyYwACsrgAAAAEBAcAArKEAAACD7mDAAJTtAABgwACU7QFKwACsqgGAwACsqsBGrtsGwACPjIGVwACss8AArM7AAK0gAACwPgFqwACstGDAAP0cAgAAAQPAAKzewACtIAAAAAEBAcAArO4AAACD7mDAAJUhAABgwACVIQE+Aj0cwACs+i6cwAEAAYDAAK0GwEavNQDAAI9NSsAArREBKwbAAI+NgZXAAK0lwACtMcAArXYAALBLAWrAAK0mYMAA/RwCAAABA8AArUPAAK12AAAAAQEBwACtVQAAAIPuYMAAldIAAFsBPgE9HMAArWEunMABAAGAwACtbcBGr6MAwACPTQbAAI+OgZXAAK17wACtlcAArdAAALBJAWrAAK18YMAA/RwCAAABA8AArazAAK3QAAAAAQEBwACtwwAAAIPuYMAAlisAAGDAAJTjAUrAAK3MAYDAAK3MwEawBgbAAI+PgZXAAK3VwACt78AAriIAALBHAWrAAK3WYMAA/RwCAAABA8AArgLAAK4iAAAAAQEBwACuFQAAAIPuYMAAlhkAAGDAAJTjAUrAAK4eAYDAAK4ewEawYAbAAI+QgZXAAK4nwACuQcAArnQAALBFAWrAAK4oYMAA/RwCAAABA8AArlTAAK50AAAAAQEBwACuZwAAAIPuYMAAliIAAGDAAJTjAUrAAK5wAYDAAK5wwEawugbAAI+RgZXAAK55wACuk8AAr8gAALBUAWrAAK56YMAA/RwCAAABA8AArpvAAK/IAAAAAQEBwACuowAAAIPuYMAAlWoAAGDAAJTjAT4CTsAArrTAAK7AAADAAF2bYMAA+goBHMAArtEWwACux4DAAK7CwEaxFFvAAJVegdQBAAEWwACu1S7AAF1vwACPTADAAPxHSsAArusBJsAArusBHMAArvIuwABdfAMAAhbAAK8QgMAArwvARrEUgkXAAJVdNMAArxgDwACvGMAAr68AAAABAQHAAK8ZAAAAgkVgwACU4wAAWwE+AUrAAK8pARzAAK8wLsAAXX8CAAIWwACvRYDAAK9AwEaxFFvAAJVeNMAAr1ADwACvUMAAr6cAAAABAQHAAK9lAAAAW13AAPx0AWDAAJTjAABgwACVagE+AUrAAK96AR/AAK+FwACVcQIAAoLAAK+MwEaxsoPAAK+UwEayAAAAwACPWAHAAF16gcAAr7jARrEtwACPVmDAAJTjBsAAj5KBlcAAr83AAK/nwACxgwAAsDkBasAAr85gwAD9HAIAAAEDwACv/cAAsYMAAAABAQHAALATAAAAg+5gwACWiQAAYMAAlOMBPgFKwACwHwEmwACwHwEcwACwJi7AAF1/AgACHMAAsH0cwACwTxbAALBEgMAAsD/ARrKTsDrAAJaLgKsBAWDAAJTjATTAALBTA8AAsFPAALB7AAAAAQEBwACwYAAAAK/MYMAAlpgAAGDAAJTjAUrAALBtARbAALB2gcAAsG3ARrMAgJbAAJabAMAA/D2ArQAAAADAAPxINMAAsI8DwACwj8AAsX4AAAABAQHAALCeAAAAKV3AAPx0AWDAAJOsAABgwACWiQE+Ak7AALDAwACwywAAsDpdwAD8dAFgwACWmAEewACw0cAA/HwCAWDAAJaYAhbAALDmgcAAsN/ARrNTYcAA/KM0wACw7gPAALDuwACxQwAAAAEBAcAAsPMAAABiYMAA+9AAAGDAAJaYAT4BSsAAsQABH8AAsQvAAJakAgACFsAAsSocwACxJhbAALEcgMAAsRfARrKTsDrAAJaLSwEAAYLAALEnwEazwQDAAPyDgL3AAJaaJsAAsTYBHMAAsTaBwACxMMBGs1NLAQABgsAAsTfARrPBAMAA/INgwACU4wAASsAAsUwBH8AAsVfAAJaXAQABgsAAsWzARrNxAADAAI9YYMAAlOMGwACPk4GVwACxiMAAsZTAALHKAACwTQFqwACxiWDAAP0cAgAAAQPAALGiwACxygAAAAEBAcAAsbAAAACD7mDAAJXCAABbAUrAALG5ARzAALG5LsAASCUBAAGAwACxxcBGtKgAwACPTgbAAI+UgZXAALHPwACx6cAAtOEAALBQAWrAALHQYMAA/RwCAAABA8AAsfXAALThAAAAAQEBwACyAQAAAIPuYMAAlZIAAGDAAJTjAT4CScAAsg0iHMAAshkWwACyFoDAALIRwEa1EKlCwACVlEgBAAEnncwAwAD9xQEcwACyLBbAALIpgMAAsiTARrUQqULAAJWUSAEAASedwgDAAP3FPgJOwACyS8AAslQAAB9gwACU4wEWwACyW4DAALJWwEa1EB/AAJWVScAAsmslwACyeIHAALJvwEa1fGDAAJWuPgFKwACylQEfwACyoMAAlaACAAIWwACysIDAALKrwEa1EKlCwACVlBzAALK0LsAAXXYBAAEUwACyxMBG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APy6PRzAANZ4FsAA1mwuwABTGcAAjxBWAQABFsAA1oGAwADWfMBGz+iwZMAAlHAAwAD8hT0cwADWky7AAF3CAAAAAMAAj51OwADXX8AA12sAAMAAXctgwAD9tgEcwADXbS7AAEkyAQABFsAA15IWwADXhhbAANd8gMAA13fARs/osGTAAJRwnprAAJR9gL3AAJWjAMAAj0M9HMAA164WwADXny7AAF09wACPCVYBAAEfwADXtsAAlcEBAAGGwADXzcBG1eAAAMAA/IU9HMAA1/8WwADX4i7AAF1HwACPFFYBAAEfwADYB4IDAgJgwAD9tmDAAP22AhbAANgnFsAA2BsWwADYEYDAANgMwEbP6LBkwACUcJ6awACUfYC9wACVo4bAANgtwEbV4AAAwAD8hT0cwADYQi6GEwEAARzAANhVasAA2FJgwACXUcABE4mFSwIAAifAAF14McAA2GlgwAD9HAKGwADYasBG1eAWwADYdy7AAF1fwACPNwDAAJdUAMAAj0o9HMAA2I4uwABddAEAARbAANisFsAA2KKAwADYncBGz+iwZMAAlHCCacAAlH4AwACPTz0cwADYyxbAANi5LsAAXUfAAI8UhhEAAAAAwAD8k0nAANjfIRzAANj0FsAA2OiAwADY48BGz+iwZcAAlHFIAQABKwDAAP0pPgI9HMAA2WYuhhMBAAEcwADZhmrAANl2YMAAl1HAAROJhUsCAAInwABdyjHAANmeYMAAlOMCFsAA2Z8ug7DAAI81HsAA2aXAAJKIAQABhMAA2a/ARtJbAADAAJdUAMAAj0o9HMAA2c4uo3ICAAKDwADZ1sBG0jEmwADZ6QEWwADZ6YDAANnkwEbP6KVOwACTsWDAAEHFAMAAj0k+AT0cwADaFC6jcgIAAoTAANocwEbSWybAANo0ARbAANo0gMAA2i/ARs/opU7AAJOxYMAAQcUAwACPSU7AANpewADaYwAAgehgwACTrAEcwADacRbAANplLsAAUxnAAI8QhhEAAAAAwAD8k0AcwADakYfAANqMwEbYbUgBAAEWwADamYDAANqUwEbP6LBkwACUcADAAP0pwADajMAA2qIAPz0cwADbPC7AAF1qAQABgcAA20fARtGoAMAAj0ZOwADbZsAA23kAAMAAXcxdwAD8dAFgwAD70AEcwADbey7AAF3DwACPAwAAAADA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AJXCAMABETAAAACEuF3AAPx0AWDAAJXCAMABEVMAAADAAF2EYMAAk8wAwAERgwAAAMAAXYVgwACVEgDAARGxAAAAwABdhmDAAEHFAMABEeQAAADAAEVNYMAAQcUAAGDAAJXhAT4NTsABEuXAARLyAACtbF3AAPx0AWDAAJVBATHAARMXYMAAlUEATsABEzLAARNEAADAAF3zXcAA/HQBYMAAlcIBMcABE1RgwACVwgBGwAETXMABE4fAARNuAAAAgO1gwACVwgCAwAETe8BG/DM+BE7AAROWwAETmwAAgL1gwAD9tgEWwAETpxTAAROdwEb8/QgAgL3AAJWjTsABE7rAARPGAADAAF30YMAA/bYBHMABE8guwABJMgEAARTAARPSwEb9GAkAAMAAj0M9HMABE/GHwAET38BG/M9WAQABH8ABE/nAAJXJAQABFMABFAbARv1BCgAAAMAA/IU9HMABFCiGwAEUG8BG/KtWAQABH8ABFDDAAJVKAgACH8ABFFnAAJXBAQABFMABFHDARv0YCQAAH8ABFHvAAJW3AQABFMABFIrARv1BCgAAAADAAPyFTsABFL/AARTOAADAAF31YMAAlRIBH8ABFNzAAJUgAQABhsABFPfARvyrAE7AARUZwAEVKQAAwABd9mDAAJTjASbAARUZARzAARWZHMABFS1qwAEVLmDAAJdRwAETiSACAAInwABd9zLAARVMYMAA/bZgwAD9tgIngXYWwAEVXi7AAF1JwACPFyfAAF1fFsABFYAuwABdUMAAjx8AwACXU69YAQABhcABFa/ARvyQAMAAk7pgwACU407AARXZwAEV4QAAwABd+GDAAJTjASbAARXZARzAARY0HMABFeVqwAEV5mDAAJdRwAETiSACAAInwABd+TLAARX9YMAA/bZgwACVrgInue0WwAEWDS657cAAjzMnVRbAARYkLlXAAI80AMAAl1OvWAEAAYXAARZKwEb8kADAAJO6YMAAlONOwAEWc8ABFoIAAMAAXfpgwACTzAEmwAEWcwEcwAEXoxzAARaKasABFodgwACXUcABE4mFSwIAAifAAF37MsABFwdgwAD9tmDAAP0cBCeB9BbAARccLsAAXUrAAI8YJ5TwHsABFzrAAJKIAQABasABF1BgwAD70BUAJ8AAXfYUwAEXccBG/iMJACfAAF34FMABF5PARv6wCgAAwACXVK9YAQABhcABF7nARvyQAMAAk7pgwACTzE7AARfmwAEX+QAAwABd/GDAAJXSASbAARfmARzAARklHMABF/1qwAEX/mDAAJdRwAETiSACAAInwABd/TLAARh7YMAA/bZgwAD9HAUnwABd/oLAARiRwEb8XSeB9BbAARizLsAAXUrAAI8YJ4JpFsABGNAuwABFY8AAjxkngXYWwAEY6i7AAF1JwACPFyfAAF36FMABGQ7ARv81CwAAwACXU69YAQABhMABGTvARvx/AMAAk7pgwACV0k7AARllwAEZfgAAwABd/2DAAJRVASbAARllARzAARmrH8ABGYTAAJRgAQABFMABGY7ARv/rDAAAr1gBAAGFwAEZwcBG/JAAwACTumDAAJRVTsABGeTAARnyAADAAF3pYMAAleEBJsABGeQBHMABG3QcwAEZ9mrAARn3YMAAl1HAAROJIAIAAifAAF4AMsABGrJgwAD9tmDAAP0cBCfAAF4BFsABGtaAwAEay8BG/DODssAA/FcnwABd9RTAARr6wEb9+AgAJ8AAXgKDwAEbG8BG/G4nwABd/xTAARtTwEcApQ0AAMAAl1OvWAEAAYTAARuKwEb8fwDAAJO6YMAAleFOwAEbuMABG8wAAMAAXgNgwACU4wEmwAEbuAEcwAEcjBzAARvYasABG9lgwACXUcABE4kgAgACJ8AAXgQywAEcB2DAAP22YMAA/RwDJ8AARWUWwAEcIi7AAEVlwACPwSeCkBbAARxBLsAARWbAAI/CJ8AAXekUwAEcdsBHAPUOAADAAJdTr1gBAAGFwAEcosBG/JAAwACTumDAAJTjTsABHMvAARzlAADAAF4FYMAAk8wBJsABHMsBHMABHRMfwAEc68AAlGABAAEUwAEc9cBHAaUPAACvWAEAAYXAAR0pwEb8kADAAJO6YMAAk8xKwAEdRQEmwAEdRQEcwAEe6hzAAR1OasABHU9gwACXUcABE4kgAgACJ8AAXgYywAEeEGDAAP22YMAA/RwFJ8AAXfOHwAEeLcBG/M8nhLiBwAEeWMBG/EgnwABeBxbAAR6EFsABHnsuwABdSMAAjxWuJcAAj/MnmXgWwAEemy7AAF1SwACPISfAAF4FFMABHsjARwJCEAAAwACXU69YAQABhMABHwDARvx/AMAAk7pgwACV4QbAAI/LgZXAAR8jwAEfNMABIOQAAMAAXYIBasABHyRgwAD9HAIAAAEDwAEfQMABIOQAAAABAQHAAR9TAAAApU5gwABBxQAAXAE+BD0XwAEfbC7AAF1NKcAAjxw9HMABH7UuwABdagEAARbAAR/ALsAAXUPAAI8PAMAAj0ZOwAEf4cABH/0AAMAAXghgwACU4wEmwAEf4QEcwAEgSBzAASABasABIAJgwACXUcABE4kgAgACJ8AARVgxwAEgDWDAAJTjAhbAASAVLsAARWjAAI/FFsABIDQuwABdX8AAjzcAwACXU69YAQABgMABIF7ARwN7AMAAk7pgwACU4z0cwAEgdi6GEwEAASbAASC3ARzAASC3H8ABIIfAAJRgAQABgcABIJHARwPBAK9YAQABgMABIM3ARwN7AMAAk7pgwACTzADAAI9KBsAAj8yBlcABITPAASFEwAEi6QAAwABdgQFqwAEhNGDAAP0cAgAAAQPAASFSwAEi6QAAAAEBAcABIWUAAAClTmDAAEHFAABcAT4DScABIX4WwAEhixbAASGCLsAAXUjAAI8VwABdicAAj/I+AT0cwAEhpy7AAF1qAQABFsABIbIuwABdQsAAjw4AwACPRj4BPRzAASHRLoYTAQABH8ABIeLAAJdQAQABJ8AAXd0AAMAAj0pOwAEiGsABIi0AAMAAXglgwACU4wEmwAEiGgEcwAEiVhzAASI5asABIjpgwACXUcABE4kgAgACJ8AAXgoxwAEiRGDAAJTjARbAASJFLrD8wACPwwDAAJdTr1gBAAGAwAEibMBHBMEAwACTumDAAJTjPRzAASKELoYTAQABJsABIrwBHMABIrwfwAEilcAAlGABAAGBwAEin8BHBT4Ar1gBAAGAwAEi0sBHBMEAwACTumDAAJPMAMAAj0oGwACPzYGVwAEi7sABIx7AASPLAADAAF2HAWrAASLvYMAA/RwCAAABA8ABIzXAASPLAAAAAQEBwAEjTwAAAKVOYMAAQcUAAF3AAPwyAWDAAJVBAT4CTsABI4jAASOSAACGJV3AAPx0AWDAAJVBATHAASOvYMAAlUEASsABI7cBgcABI77ARwZNBsAAj86BlcABI9DAASPpwAEkpwAAwABdkgFqwAEj0WDAAP0cAgAAAQPAASP3wAEkpwAAAAICAsABJA0AAACAlmDAAJTjAMABJCYAAAClTmDAAEHFAABgwACTzAE+AT0wwAEkPxzAASROFsABJEUupLrAAI8jpU8CAAIWwAEkZS6lO8AAjzknwABeCwC1jQbAAI/PgZXAASSswAEkvcABJTIAAMAAXWIBasABJK1gwAD9HAIAAAEDwAEkzMABJTIAAAAAAAAAXAE+AT0XwAEk1S7AAEVmHMABJPwuwABdaAEAARbAASURLsAARWbAAI/CAMAAj0TAAI/CAABG+lYARvqbAEb7/gBHA0QARwSKAEcF9wBHBn8ARwcNAEcHeAAAAAgCwACP0oGVwAElN8ABJT3AAU5CA8AAXgwAAAFgwACPBwAACQTAAI/UgZXAASaJwAEmnRjAAF4NAGDAAP22ASsEwACP1YGVwAEm5sABJvQYwABeDgBgwAD9tgErBMAAj9aBlcABKSLAASkxCbD6AGDAAJTjAATAAI/XgZXAASm2wAEpwwnAAEVpAGDAAJTjAATAAI/YgZXAASnbwAEp9RjAAEVqAF3AAPx0AWDAAJTjAATAAI/ZgZXAASpTwAEqZQmw+wBgwACU4wAEwACP2oGVwAEq9sABKwUJwABFawBgwACU4wAEwACP24GVwAErncABK7AJwABFZwBgwACU4wAEwACP3IGVwAErycABK9EJsPYAYMAAlOMAAQXAAI/qgZXAASvWwAEr1sABLXMAAAADwAEr58ABLXMAAAALAgLAASv7AAAApLpgtYcAwAEsDwAAAKU7YLW5AAnAASwmAAAEsPpgwACU4wFqAGDAAPzZd8ABLEIAAASw+2DAAJTjAWoAYMAA/Nl3wAEsYQAABMAARWlgwACU4wFqAGDAAPzZd8ABLHsAAATAAEVqXcAA/HQBYMAAlOMBagBgwAD82XfAASyiAAAEwABFa2DAAJTjAWoAYMAA/Nl3wAEsvgAABMAARWdgwACU4wFqAGDAAPzZd8ABLN4AAASw9mDAAJTjAWoAYMAA/Nl3wAEs9QAAAMAARWFhAWDAAP22YMAA/bYBagBgwAD82XfAAS0qAAAAwABFY2DAAJTtAWoAYMAA/Nl3YMAAj9IBPwgIAcAAj9aCAMBHCPoIAcAAj9mDAMBHCREIAcAAj9eEAMBHCSgIAcAAj9iFAMBHCUEIAcAAj9qGAMBHCWAIAcAAj9uHAMBHCXkIAcAAj9wUAMBHCZIIAAkAwAEtPcAAj6cEAASAwAEtQ8BHCN+BwAEtTcBHCOwUwAEtWMBHCakJABTAAS1qwEcJyQoAAAoGwACP3oGVwAElbcABJYLAASWVAQDAAF1hAWrAASVuYMAA/RwCAAABA8ABJY7AASWVAAAAAAAAAGDAAPoKAUrAASWRASkGwACP34GVwAEmIMABJjPAASZ9AQDAAF4PAAAAAQPAASZEwAEmfQAAAAAAAABgwACVrgE+AUrAASZKAR/AASZVwACVtwEAARbAASZkLsAAXg3AAI/UAAbAAI/ggZXAASb4wAEnC8ABJzsBAMAAXhAAAAABA8ABJxbAASc7AAAAAAAAAGDAAJWuAUrAAScZAR/AAScdwACVtwEAARbAAScsLsAAXg7AAI/VAAbAAI/igZXAAS8kwAEvNcABNIEAAMAAXdQBasABLyVgwAD9HAIAAAEDwAEvPcABNIEAAAADAwPAAS9LAAAAg+5gwACU1gDAAS9fAAAAgmtgwACU4wDAAS+DAAAApU5gwABBxQAAXAE+Bk7AATBMwAEwYwAAwABeEV3AAPx0AWDAAPvQATHAATBqYMAA+9ABFsABMGsuwABdQsAAjw49HMABMJKDwAEwe8BHC9CApQEAARzAATDsHMABMK4WwAEwmS7AAFMZwACPEIGlAQABNMABMLQDwAEwtMABMOEAAAABAQHAATC9AAAAg+5gwACTrAAAYMAA+goBSsABMMYBIRzAATDaHMABMNMWwAEwxi7AAF1AwACPDEsBAAGEwAEw1MBHDEgAwAD8uUgBAAErAMAA/PMAwAD8PoCrAQFgwAD70AE0wAEw8APAATDwwAExFQAAAAEBAcABMPkAAACD7mDAAJOsAABgwAD70AFKwAExAgEcwAExDxbAATECLsAAXUDAAI8MSwEAAYTAATEQwEcMvADAAPy5AMAA/D0AwAD8hj0cwAExHS6GEwEAASbAATGzARzAATGzHMABMTBqwAExLWDAAJdRwAETiYVLAgACJ8AAXXgxwAExRGDAAJTjAhbAATFMLsAAXg/AAI/fH8ABMWjAAJZ8AQABHMABMaIcwAExk4PAATF8wEcL0ICrAQFgwACWYwFqwAExmmEBYMAA/OZgwACWY8ABXCMAwAD8PYCtAAAAAMAA/EgAAMAAl1SvWAEAAYLAATHJwEcLuwDAAJO6YMAAk8wAwACPSk7AATHwwAEyBAAAwABeEmDAAJTjASbAATHwARzAATKlHMABMghqwAEyCWDAAJdRwAETiSACAAInwABeEzLAATItYMAA/bZgwACU4wInwABFayMWwAEyTYDAATJIwEcLnbBewACU2RbAATJXLsAARWfAAI/bFsABMm0uwABFa8AAj9oBYMAAlOMngmuBwAEyksBHC6wAwACXU69YAQABgsABMrvARwu7AMAAk7pgwACU407AATLhwAEy9QAAwABeFGDAAJTjASbAATLhARzAATPtHMABMvlqwAEzA2DAAJdRwAETiSACAAInwABeFTLAATNIYMAA/bZgwAD9HAQnsPoWwAEzYy6w+sAAj9YnwABeEoTAATORwEcNxSfAAEVjFsABM7guwABFY8AAjxknwABeEBbAATPWLsAAXg7AAI/VAMAAl1OvWAEAAYLAATQDwEcLuwDAAJO6YMAAlOM9HMABNBsuhhMBAAEmwAE0VAEcwAE0VB/AATQswACUYAEAAYXAATQ2wEcOdgCvWAEAAYLAATRqwEcLuwDAAJO6YMAAk8wAwACPSgbAAI/jgZXAATSGwAE0mcABRJUAAKEbAWrAATSHYMAA/RwCAAABA8ABNKfAAUSVAAAABgYGwAE0wgAAAJqAXcAA/HQBYMAAlcIAwAE05wAAAIS4XcAA/HQBYMAAlcIAwAE1CgAAAMAAXYRgwACTzADAATU6AAAAwABdhWDAAJUSAMABNWgAAADAAF2GYMAAQcUAwAE1mwAAAMAARU1gwABBxQAAYMAAleEBPg9OwAE1xsABNdEAAMAAXhZgwACU4wEmwAE1xgEcwAE2PxzAATXVasABNdZgwACXUcABE4kgAgACJ8AAXhcywAE19mDAAP22YMAAla4CJ4OwFsABNgYug7DAAI81J8AAXg8WwAE2Ji7AAF4PwACP3wDAAJdTr1gBAAGFwAE2VcBHD/0AwACTumDAAJTjTsABNn/AATaHAADAAF4YYMAAlOMBJsABNn8BHMABNrscwAE2i2rAATaMYMAAl1HAAROJIAIAAifAAF4ZMsABNp5gwAD9tmDAAJWuASeDsBbAATauLoOwwACPNQDAAJdTr1gBAAGFwAE20cBHD/0AwACTumDAAJTjTsABNvvAATcJAADAAF4aYMAAlOMBJsABNvsBHMABN1wcwAE3DWrAATcOYMAAl1HAAROJIAIAAifAAF4bMsABNyVg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wEfKuwoAAMAA/LkAAD0cwADOR4XAAM44wEfFgIC/AgACFMAAzkjAR8q7CgCBwADOU8BHw2UAwAD8uj0cwADO0xTAAM7NwEfGEAgAVgEAARTAAM7XwEfKuwoAAMAA/IU/BsAAkLGBlsAAzvbAAM77wADQ8AAAwABekgAAAAEDwADPEcAA0PAAAAABAQHAAM8eAAAAg+5gwABFKgAAXAE+BE7AAM82wADPPgAAVWDAAK1sARzAAM9OFsAAz0AuwABeUcAAkGzAAF63AQABgMAAz13AR8w8AMAArYFJwADPaBzAAM90gcAAz2zAR8xRSAEAASsAwAD9KUrAAM99AD89HMAAz4ouwABergMAAxbAAM+vgcAAz6fAR8xRwABC/8AArW4cwADPxRbAAM+3LsAAXlHAAJBswABeuAAAAADAAK1/FsAAz9QuwABerMAAkK8AwACQsEbAAM/qwADQH8AA0AIAAACc613AAK1kAWDAAEVhABbAANASgcAA0ArAR8xRwABPSsAArW8+A07AANAuwADQMwAAgL1gwAD9tgEcwADQQxbAANA1LsAAXlHAAJBsmRQBAAEWwADQUILAANBLwEfNDcAAXq3AAK1nAMAArYA9HMAA0GQurvABAAEWwADQbYLAANBowEfNDYNEwACtZgDAAJCZPRzAANB8LsAAXoMDAAODwADQi8BHzTscwADQkS6gwgAAAADAAJCENQAAAAEAYMAAQcUBFsAA0K4WwADQp4LAANCiwEfNDYNEwACtZqVOwABFZCMcwADQwIQAwEfNzUgBAAErAAAWwADQ1BbAANDIgsAA0MPAR80NwABercAArWelTsAARWSEAMBHzc0BYMAAQcUAwACQlwbAAJCygZbAAND1wADQ+sAA0jgAAMAAXqsAAAABA8AA0QvAANI4AAAAAQEBwADRGAAAAIPuYMAARSoAAFwBPgROwADRMcAA0T0AALiIYMAARWEBFsAA0USAwADRP8BHzmiDGcAARRxDwADRTyEewADRV8AA9bECAAKBwADRYcBHzn0WwADRc4DAANFuwEfOaIHowABFHQA+AknAANGCIRzAANGHLsAAXlgBAAGBwADRm8BHzn0AwACQfD4BPRzAANGzLsAAXoQBAAGBwADRusBHzn0AwACQmD89icAA0dbAR859FsAA0fCBwADR5MBHzn2DsMAARWs9HMAA0gAuwABekgEAAYDAANIXwEfOaADAAJCxPRzAANIiLpqHAQABgcAA0ijAR859AMAAkJoGwACQs4GWwADSPcAA0kLAANNNAADAAF65AAAAAQPAANJUwADTTQAAAAMDA8AA0moAAACD7mDAAEdGAMAA0ncAAACpQmDAAP22AMAA0o0AAAClTmDAAEHFAABcAT4EPRzAANKmLq7wAQABFsAA0q+AwADSqsBHz5WFr8AAR0oAwACQmU7AANLIwADSzwAAwABeumDAAJTjARzAANLRLqDCAAAAAMAAkIQ9HMAA0twurvABAAEWwADS5YDAANLgwEfPlYWxwABHSwDAAJCZPRzAANLxLqC/AQABJsAA0yABHMAA0yAfwADS+sAAlYIDAAOBwADTBMBHz6SDwADTCMBHz+0cwADTEC6gwgAAAADAAJCEAK9YAQABgsAA0zbAR8+zAMAAk7pgwACU4wDAAJCDBsAAkLSBlsAA01LAANNewADTmAAAuFIBasAA01NgwAD9HAIAAAEDwADTbMAA05gAAAABAQHAANN4AAAAg+5gwABJbQAAWwE+AT0cwADThC6u8AEAARbAANONgMAA04jAR9DOgkXAAElvAMAAkJkGwACQtYGWwADTncAA053AANQMAAC4rwAAAAEDwADTrsAA1AwAAAACAgLAANO9AAAAg+5gwABHRgDAANPKAAAAqUJgwAD9tgAAWwE+AT0cwADT1C7AAF65AwADgMAA0+fAR9ExgcAA0+3AR9FAFsAA0/aAwADT8cBH0TGlTsAARWQAwACQswbAAJC2gZbAANQRwADUEcAA1HwAALi4AAAAAQPAANQgwADUfAAAAAICAsAA1C0AAACD7mDAAEh8AMAA1DoAAACpQmDAAP22AABbAT4BPRzAANRELsAAXrkDAAOAwADUV8BH0beBwADUXcBH0cYWwADUZoDAANRhwEfRt6VOwABFZADAAJCzBsAAkLeBlsAA1PXAANT1wADWBwAAwABeuwAAAAEDwADVCcAA1gcAAAACAgLAANUXAAAAg+5gwABHlQDAANUkAAAAqUJgwAD9tgAAWwE+Aj0cwADVLi64rwIAAoDAANVAwEfSP4HAANVGwEfSTgDAAJC1ScAA1U8iIRzAANVWgcAA1VPAR9JOSAEAASeVrwDAAP3FABzAANViLsAAXl8BAAGAwADVecBH0j8AwACQfz4BPRzAANWILqC/AQABJsAA1c8BHMAA1c8fwADVkcAAlYIDAAMnla8cwADVoi6gwgAAAADAAJCEH8AA1a3AAJZuAQABJ4QIAACvWAEAARbAANXqgMAA1eXAR9I/pU7AAEVkAMAAk7pgwACU4wDAAJCDPwbAAJC4gZbAANYMwADWDMAA1rEAALi0AAAAAQPAANYcwADWsQAAAAICAsAA1ioAAACD7mDAAEfFAMAA1jcAAACpQmDAAP22AABbAT4CPRzAANZBLq7wAQABFsAA1kqAwADWRcBH016FrMAAR8kAwACQmT0cwADWWC6gvwEAASbAANZ/ARzAANZ/H8AA1mrAAJWRAgACgcAA1nTAR9NtHMAA1nguoMIAAAAAwACQhACvWAEAARbAANaagMAA1pXAR9NepU7AAEVkAMAAk7pgwACU4wDAAJCDBsAAkLmBlsAA1yrAANcqwADYKwAAwABevAAAAAEDwADXPcAA2CsAAAACAgLAANdLAAAAg+5gwABHxQDAANdYAAAAqUJgwAD9tgAAWwE+Aj0cwADXYi64tAIAAoDAANdzwEfUN4HAANd5wEfURgDAAJC4ScAA14IcwADXhi7AAF5fAQABgMAA153AR9Q3AMAAkH8+AT0cwADXrC6gvwEAASbAANfzARzAANfzH8AA17XAAJWCAwADJ5WvHMAA18YuoMIAAAAAwACQhB/AANfRwACWbgEAASeECAAAr1gBAAEWwADYDoDAANgJwEfUN6VOwABFZADAAJO6YMAAlOMAwACQgz8GwACQuoGWwADYMMAA2DXAANxlAADAAF69AAAAAQPAANhLwADcZQAAAAMCAsAA2F0AAAC4iGDAAEiBAMAA2HwAAAClTmDAAEHFAAHAANibAAAAwABevmDAAPoKAWrAANikYMAA+goAXAE+BE7AANi5wADYvAAAqUJgwAD9tgEWwADYyoDAANi+wEfVO7ofwABIg07AANjvwADY9AAAha9gwABFYQEWwADZAoDAANj2wEfVO4WvwABHSk7AANkZwADZHwAAhbFgwABFYQEWwADZLYDAANkhwEfVO4WxwABHS0nAANk4IRzAANk/g8AA2TzAR9V7SAEAASsAwAD9xT4EPRzAANlQLq7wAQABhMAA2VTAR9WiAMAAkJlOwADZb8AA2XYAAMAAXrpgwACU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D+ABFsABD+CAwAEP28BH/9GWIMAARp5gvMwAwABlAE7AARACwAEQDAAAW13AAPx0AWDAAJTjARzAARAOLoWaAQABFsABECKAwAEQHcBH/9GCUcAARWcAwACQlD0cwAEQLy6gvwEAASbAARB1ARzAARB1HsABEDTAAJKLAwADgcABEE3ASAAagsABEFXASAA9g8ABEGHASACMAK9YAQABFsABEJCAwAEQi8BH/9GlTsAARWQAwACTumDAAJTjAMAAkIM9HMABELMWwAEQqS7AAEiPwACQO8AAkGKvFAEAAR7AARDJwABnrgIAAibAARD3ARbAARD3gMABEPLAR//RliDAAEaeYLzrH8ABEQTAAGi7AQABFsABESSDwAERGsBIAIxhwAD8owAAALZGBsAAkNuBlsABETbAARFHwAEUXwAAuE8BasABETdgwAD9HAIAAAEDwAERX8ABFF8AAAABAQHAARF1AAAAg+5gwABGvgAAXAE+A07AARGQwAERmAAAliBgwAB1OAEmwAERkAEWwAERn4DAARGawEgBzZYgwABGnmDAAHU4ScABEawWwAERuIHAARGwwEgB4oT8wAB06T4FPRzAARHSLq7wAQABHMABEeEWwAER24DAARHWwEgBzYJRwABFZ0sBAAGTAMAA/IMAwACQmU7AARH7wAESAgAAg8BgwACU4wEcwAESBC6gwgAAAADAAJCETsABEiXAARIvAABbXcAA/HQBYMAAlOMBHMABEjEuhZoBAAEWwAESRYDAARJAwEgBzYJRwABFZwDAAJCUTsABElzAARJnAACre2DAAJTtARzAARJwFsABEmkut1fAAJA7wACQX69BAQABgcABEoPASAHiAMAAZQA9HMABEpMuoL8BAAEmwAES3QEcwAES3R7AARKYwACSiwMAA4LAARKzwEgCY4TAARK7wEgCwoPAARLHwEgChgCvWAEAARbAARL4gMABEvPASAHNpU7AAEVkAMAAk7pgwACU4wDAAJCDPgM9HMABEyAuoL8BAAEcwAETLhbAARMlLsAAQ4jAAJA7wACQWsAAQ5cBAAGBwAETQ8BIAeIAwABcuwDAAJCDTsABE2jAARNyAABbXcAA/HQBYMAAlOMBHMABE3QuhZoCAAEWwAETiIDAARODwEgBzYJRwABFZwFqk8AAkJQ9HMABE6EuoL8BAAEfwAETqsAAlWkDAAIcwAETsi6gwgAAAADAAJCEgsABE7nASAOjAaVOFsABE+aAwAET4cBIAc2lTsAARWQAwACQgz0cwAEUGRbAARQGLsAASI/AAJA7wACQYq8UAQABHsABFC/AAGevAQABJsABFFIBFsABFFKAwAEUTcBIAc2WIMAARp5gvMwAALZGBsAAkNyBlsABFGTAARR1wAEXwAAAuF0BasABFGVgwAD9HAIAAAEDwAEUjMABF8AAAAABAQHAARShAAAAg+5gwABI9wAAXAE+CU7AARTBwAEUywAAW13AAPx0AWDAAJTjARzAARTNLoWaAQABFsABFOGAwAEU3MBIBKyCUcAARWcAwACQlE7AART8wAEVBAAAsKhgwACU4wEcwAEVFRbAARUOLrdXwACQO8AAkF+vVwEAARbAARVAFsABFTAus7/AAJA7wACQd7DSuEoAwABk9k7AARVjwAEVbAAApN5gwABLSAEWwAEVc4DAARVuwEgErKTewABGYU7AARWSwAEVmgAAhIFdwAD9ZwFgvKUBHMABFbUWwAEVpC7AAFLjwACQO8AAkHnAAFLQAgACFsABFdaDwAEVzcBIBUiAvcAAS1YWwAEV3C61ZcAAkDvAAJBhAMAAeeU9HMABFfkWwAEV7y7AAEiPwACQO8AAkGKvBgEAAYPAARYUwEgFSAC2Tk7AARYrwAEWNgAAq3tgwACU7QEcwAEWPxbAARY4LrdXwACQO8AAkF+vUwIAAoPAARZZwEgFSITAARZjwEgFbwDAAGUEPRzAARZxLqC/AQABJsABFrgBHMABFrgewAEWdsAAkosDAAOCwAEWj8BIBP2FwAEWmMBIBfaBwAEWpMBIBMEAr1gBAAEWwAEW04DAARbOwEgErKVOwABFZADAAJO6YMAAlOMAwACQg0nAARbsFsABFvmDwAEW8MBIBUiFLcAAS1g+AT0cwAEXCy7AAF7OAQABgMABFxrASASsAMAAkOBJwAEXLBbAARc5g8ABFzDASAVIhS/AAEtZPgE9HMABF0suwABezwEAAYDAARdawEgErADAAJDfPgE9HMABF3QuwABezQEAAYDAAReJwEgErADAAJDePRzAARekFsABF5ouwABIj8AAkDvAAJBirwAAAAAAtk8GwACQ3YGWwAEXxcABF9PAARvpAADAAF7QAAAAAQPAARfqwAEb6QAAAAMDA8ABGAEAAACD7mDAAEZeAMABGBAAAACk3mDAAEtIAMABGCgAAACrxWC9ywAAYL3LAT4CScABGDQhHMABGEUWwAEYPYDAARg4wEgHeJYgwABGZUgBAAErAMAA/Sk+Ak7AARljwAEZbQAArNxgvKUBFsABGXwWwAEZdIDAARlvwEgHeJYgwABGZYT5vMVJwAEZkhzAARmyFsABGaMWwAEZli61ZcAAkDvAAJBhqlvAAE0dqPUBAAGDwAEZwcBIB9YAwABw6T4BSsABGdcBHMABGfMWwAEZ3i7AAFM0wACQO8AAkHq09AEAAYPAARoGwEgH1gC98z4CQBzAARqwFsABGqMutWXAAJA7wACQYZsOAQABg8ABGr7ASAfWAMAATSnAARqjwAEayAEewAEa1rWnAgACgMABGvDASAd4JAAGJ8AAXtEWwAEbFoDAARsRwEgHeJYgwABGZSebjIPAARslwEgH1ie/2yfAAF7SAErAARtnARzAARuDFsABG24uwABTNMAAkDvAAJB6tPcBAAGDwAEbmMBIB9YAvfY/SsABG7YBNQAAAAEAYL3LAYLAARu9wEgHliMcwAEbwoMAwEgJGUgBAAErAAAWwAEb2hbAARvFLsAAUzTAAJA7wACQep5ivdiDAMBICRkBYL3LBsAAkN6BlsABG+7AARvzwAEjnQAAwABezQAAAAEDwAEcB8ABI50AAAABAQHAARwXAAAAg+5gwABGXgAAXAE+BE7AARwswAEcNQAApN5gwABLSAEWwAEcPIDAARw3wEgJj6TewABGYU7AAR0IwAEdDwAAgkVgvLcBFsABHRaAwAEdEcBICY+WIMAARmVJwAEdIyIiHMABHS+CwAEdKMBICctIAQABKwDAAP0pARbAAR1BgsABHTrASAnLhS28wAAhHMABHtuBwAEe0sBICaRIAQABGsABHui3/wDAAP0pPgJOwAEftsABH7sAACBgwABLSAEewAEfwcAAS3oBAAGBwAEf2sBICaQAPRzAASAAFsABH+suwABIj8AAkDvAAJBirxYBAAEfwAEgF8AAZ3EDAAODwAEgIsBICkQrFsABIDOAwAEgLsBICY+FF8AARmkAALZHP0nAASBOIRzAASBZgsABIFLASAnLSAEAASsAwAD9KT4DQBzAASF8gcABIXPASAmksl4BAAGCwAEhhMBICcsAwABLaMABIXPAASGLAR7AASGXtacCAAKAwAEhoMBICY8kwAEhywOBwAEhqMBICaQnwABe04LAASHEwEgJywBAIiEWwAEh5oHAASHdwEgJpIUtwABLWAAhFsABIfyBwAEh88BICaSFL8AAS1nAASHcwAEiBAEkwAEiQwMnwABe1IHAASI5wEgJpCeBaj0cwAEiVhbAASJMLsAASI/AAJA7wACQYq8UAQABHsABImzAAGewAwADJsABIo4BgsABIo7ASAnLYLzMFsABIp+BwAEilsBICaS0acAAS00WwAEis4DAASKuwEgJj4UXwABGaQAAtkY+Ak7AASLlwAEi6gAAq8VgvcsBHMABIvYuwABe0AMAA4DAASMOwEgJj4HAASMUwEgJpBbAASMjgMABIx7ASAmPhXzAAEZnAMAAkN09HMABI0IWwAEjOC7AAEiPwACQO8AAkGKvFgEAAR/AASNkwABncQMAA4HAASNvwEgJpIPAASN5wEgL6hbAASOEgMABI3/ASAmPhRfAAEZpAAC2RwbAAJDfgZbAASOiwAEjp8ABJmcAAMAAXs8AAAABA8ABI7XAASZnAAAAAgEBwAEjxQAAAIPuYMAARl4AAcABI9EAAAC5oWDAAPoKAWrAASPdYMAA+goAXAE+AUnAASPrIiXAASP8FsABI/SAwAEj78BIDLGWIMAARmVgvMkAIYHAASQPwEgMwT4BPRzAASUrFsABJSEuwABIj8AAkDvAAJBirxQBAAEewAElQcAAZ7IBAAEmwAElWgEWwAElWoDAASVVwEgMsZYgwABGZWC8yQAAtkY+A07AASWBwAEligAApN5gwABLSAEWwAElkYDAASWMwEgMsaTewABGYU7AASWvwAEltAAAq8VgvcsBHMABJcAuwABe0AMAA4DAASXYwEgMsYLAASXewEgNWxbAASXtgMABJejASAyxhXzAAEZnAMAAkN09HMABJgwWwAEmAi7AAEiPwACQO8AAkGKvFgEAAR/AASYuwABncQMAA4LAASY5wEgNW4PAASZDwEgNghbAASZOgMABJknASAyxhRfAAEZpAAC2RwbAAJDggZbAASZswAEmccABKcUAAMAAXs4AAAABA8ABJn/AASnFAAAAAQEBwAEmjwAAAIPuYMAARl4AAFwBPgFJwAEmmyIhHMABJqwWwAEmpIDAASafwEgOSZYgwABGZUgBAAErAMAA/SkAIhbAASbNFsABJsWAwAEmwMBIDkmWIMAARmWFLbzAARbAASbmFsABJt6AwAEm2cBIDkmWIMAARmWHdry+PgE9HMABKIkWwAEofy7AAEiPwACQO8AAkGKvFAEAAR7AASifwABnsQEAARbAASi4gMABKLPASA5JliDAAEZlAAC2Rj4DTsABKN/AASjoAACk3mDAAEtIARbAASjvgMABKOrASA5JpN7AAEZhTsABKQ3AASkSAACrxWC9ywEcwAEpHi7AAF7QAwADgMABKTbASA5JgcABKTzASA8KFsABKUuAwAEpRsBIDkmFfMAARmcAwACQ3T0cwAEpahbAASlgLsAASI/AAJA7wACQYq8WAQABH8ABKYzAAGdxAwADgcABKZfASA8KgsABKaHASA8xFsABKayAwAEpp8BIDkmFF8AARmkAALZHBsAAkOGBlsABKcrAASnWwAErGwAAuEsBasABKctgwAD9HAIAAAEDwAEp7sABKxsAAAABAQHAASoEAAAAg+5gwABGkgAAWwE+BD0cwAEqEC6u8AEAARbAASoZgMABKhTASBABhXnAAEZoAMAAkJlOwAEqMMABKjUAAIC9YMAAlO0BHMABKj4WwAEqNy63V8AAkDvAAJBfr0UBAAEWwAEqUoDAASpNwEgQAaTewABGYQDAAGUCPRzAASphLqC/AQABJsABKrIBHMABKrIewAEqZsAAkosDAAMcwAEqfy6gwgAAAADAAJCEgcABKobASBA7HMABKowuhZoBAAEWwAEqoIDAASqbwEgQAYJRwABFZwDAAJCUAK9YAQABFsABKs2AwAEqyMBIEAGlTsAARWQAwACTumDAAJTjAMAAkIM9HMABKuYuwABezwIAAYDAASr1wEgQAQG5oRbAASsMgMABKwfASBABuaHAAEaUwACQ3wbAAJDigZbAASsgwAErLMABLFQAALhJAWrAASshYMAA/RwCAAABA8ABK0TAASxUAAAAAQEBwAErWgAAAIPuYMAARogAAFsBPgQ9HMABK2YurvABAAEWwAErb4DAAStqwEgRcIV5wABGaADAAJCZTsABK4bAASuLAACAvWDAAJTtARzAASuUFsABK40ut1fAAJA7wACQX69FAQABFsABK6iAwAEro8BIEXCk3sAARmEAwABlAj0cwAErty6gvwEAASbAASwIARzAASwIHsABK7zAAJKLAwADHMABK9UuoMIAAAAAwACQhIHAASvcwEgRqhzAASviLoWaAQABFsABK/aAwAEr8cBIEXCCUcAARWcAwACQlACvWAEAARbAASwjgMABLB7ASBFwpU7AAEVkAMAAk7pgwACU4wDAAJCDPRzAASw8LsAAXs4BAAGAwAEsS8BIEXAAwACQ4AbAAJDjgZbAASxZwAEsZcABLpoAALhIAWrAASxaYMAA/RwCAAABA8ABLHfAAS6aAAAAAQEBwAEshwAAAIPuYMAARnQAAFsBPgROwAEsnMABLKEAACBgwABLSAEewAEsp8AAS3oBAAEWwAEsxYDAASzAwEgSyaTewABGYQA9HMABLNQurvABAAEWwAEs3YDAASzYwEgSyYV5wABGaADAAJCZPRzAASzsLqC/AQABJsABLWEBHMABLWEewAEs8cAAkosDAAMcwAEtFy6gwgAAAADAAJCEHMABLSUWwAEtHi63V8AAkDvAAJBfr0UBAAGBwAEtNMBIEt4AwABlAhzAAS07LoWaAQABFsABLU+AwAEtSsBIEsmCUcAARWcAwACQlACvWAEAARbAAS18gMABLXfASBLJpU7AAEVkAMAAk7pgwACU4wDAAJCDPRzAAS5UFsABLkEuwABIj8AAkDvAAJBirxYBAAEfwAEua8AAZ3EDAAOBwAEudsBIEt4rFsABLoeAwAEugsBIEsmFF8AARnYAALZHBsAAkOSBlsABLp/AAS6rwAE5RQAAuEwBasABLqBgwAD9HAIAAAEDwAEuvMABOUUAAAABAQHAAS7LAAAAg+5gwABGnAAAWwE+BE7AAS7kwAEu7AAAliBgvLcBFsABLvOAwAEu7sBIFF2WIMAARp49NQAAAAEAXcAA/HQBYMAAYnYBFsABLwWAwAEvAMBIFF25hMAARqEjHMABLxiCAMBIFJhIAQABKwAAKxzAAS8YggDASBSYg/gBAAEWwAEvKhbAAS8gLsAASI/AAJA7wACQYq8StlAAwAD8QgFcTsABL1vAAS9lAABbXcAA/HQBYMAAlOMBHMABL2cuhZoCAAEWwAEve4DAAS92wEgUXYJRwABFZwFqk8AAkJRJwAEvkxzAAS+fgcABL5fASBRySAEAARbAAS+yFsABL6Ius7/AAJA7wACQd7FEuLsAwAD9KT4FQBzAATFXFsABMVCCwAExRsBIFQRhwAD8o0gBAAGVAMAA/PPAATFGwAExWwBOwAExc8ABMYEAAMAAXtVgvMwBFsABMZ0WwAExjS6zv8AAkDvAAJB3sUW4vD0cwAExzxbAATHFLsAASI/AAJA7wACQYq8UAQABHsABMfDAAGejAgACg8ABMgfASBWlasABMiRgwABol8AA5EMAALZGTsABNIbAATSMAACFsWDAAJTjASbAATSGARzAATT3HMABNJBqwAE0kWDAAJdRwAETiSACAAInwABe1jHAATShYMAAlOMCHMABNLQWwAE0qy7AAEOIwACQO8AAkFrAAEOXAQABg8ABNMnASBWlAMAAXLscwAE06oLAATThwEgVBEsBAAGUAMAA/IMAwACXU69YAQABFsABNRKAwAE1DcBIFF2lTsAARWQAwACTumDAAJTjPRzAATUsLqC/AQABJsABNVgBHMABNVgcwAE1M2rAATU0YMAAl1HAAROJIAIAAifAAF7XMcABNUFgwACU4wIcwAE1S4LAATVCwEgVBEsBAAGTAMAA/IOEwAE1UMBIFhUAwACXU69YAQABFsABNX6AwAE1ecBIFF2lTsAARWQAwACTumDAAJTjAMAAkIM+BU7AATWwAAAArxVgwABnkABJwAE1wRbAATXNgcABNcXASBRyh3m8vT4CTsABNfTAATYCAAC0aWDAAGiXAR/AATYIwABouwIAAhbAATY1gsABNivASBUEYcAA/KMWwAE2UBbAATZCgMABNj3ASBRdhRfAAEafYcAA/KMAPYvAATZhwEgXVB7AATZxwABnswIAAibAATaNAYHAATaNwEgUcmC85ITAATaWwEgXfQBJwAE2sxbAATa/gcABNrfASBRyhS28wD4BPYvAATbTwEgXVB7AATbjwABnpQEAAYHAATb3wEgUcgBJwAE3DhbAATcagcABNxLASBRyhS+8wT4BPYvAATcuwEgXVB7AATc+wABnpgEAAYHAATdSwEgUcgA+A0AWwAE3goHAATd6wEgUcrJ8vL/AATd6wAE3jABOwAE3pcABN7MAALRpYMAAaJcBH8ABN7nAAGi7AgACFsABN+aCwAE33MBIFQRhwAD8oxbAATgBFsABN/OAwAE37sBIFF2FF8AARp9hwAD8owA9i8ABOBLASBdUHsABOCLAAGejAwADJsABOEYBgcABOEbASBRyYLzM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UbEAAGJgwAD70AGTARzAAVG4g8ABUbbASC4aYwEAARbAAVHBgcABUbrASCxOYcAA/KMAwAD8/QGLwAFRycBILhocwAFRyoPAAVHJwEguGmQBAAGUAMAA/PU+Aj0cwAFR2C6u8AEAARzAAVHigcABUdzASCxOSwEAAYPAAVHjwEguGgDAAPyDAMAAkJk9HMABUgiCwAFR8MBILe9WAQABHMABUgwuoMIAAAAAwACQhADAAPyFPRzAAVIiLqC/AQABJsABUnQBHMABUnQcwAFSRBbAAVIsgMABUifASCw5uc7AAEc0sJgBAAGCwAFSUMBILe8AwACY/K9YAQABFsABUo+AwAFSisBILDmlTsAARWQAwACTumDAAJTjAMAAkIM9HMABUvkuwABe3AEAAYDAAVMOwEgsOQDAAJDsScABUxohHMABUzMWwAFTI4DAAVMewEgsObnQwABHOEgBAAErAMAA/Sk+AT01AAAAAQBgtjsBFsABU0QuwABIj8AAkDvAAJBiIxzAAVNPggDASC+ISAEAASsAACscwAFTT4IAwEgviK8UAQABHsABU3DAAGe9AQABFsABU46AwAFTicBILDm50MAARzgAALZGAVw/BsAAkO6BlsABU67AAVO6wAFXUgAAuDgBasABU69gwAD9HAIAAAEDwAFTxcABV1IAAAABAQHAAVPOAAAAg+5gwABGPQAAWwE+Bk7AAVPowAFT+QAAwABe3mDAAJTjARzAAVQEFsABU/suwABDiMAAkDvAAJBawABDmwEAARbAAVQbgMABVBbASDAjliDAAEY/AMAAXL9OwAFUPcABVEcAAFtdwAD8dAFgwACU4wEcwAFUSS6FmgIAARbAAVRdgMABVFjASDAjglHAAEVnAWqTwACQlD0cwAFUdC6gvwEAASbAAVSqARzAAVSqH8ABVH3AAJVxAgACgcABVITASDA4gsABVJbASDCEAK9YAQABFsABVMWAwAFUwMBIMCOlTsAARWQAwACTumDAAJTjAMAAkINJwAFVoBbAAVWxFsABVamAwAFVpMBIMCOWIMAARj+0VbyoPgE9HMABVhUWwAFVxC7AAEiPwACQO8AAkGKvEQEAARbAAVY0gMABVi/ASDAjliDAAEY/ALZFPz01AAAAAQBdwAD8dAFgwABidgEWwAFWTYDAAVZIwEgwI7mEwABGQSMcwAFWYIMAwEgxekgBAAErAAArHMABVmCDAMBIMXqD+AEAARbAAVZyFsABVmguwABIj8AAkDvAAJBirxK2UADAAPxCAVxJwAFWjiEcwAFWohbAAVaXgMABVpLASDAjtAHAAEZCSAEAASsAwAD9KT4CPTUAAAABAGC2OwEWwAFWsy7AAEiPwACQO8AAkGIjHMABVsmDAMBIMhJIAQABKwAAKxzAAVbJgwDASDISrxQBAAEewAFW38AAZ70BAAEWwAFW/YDAAVb4wEgwI7QBwABGQgAAtkYBXD01AAAAAQBgtjsBFsABVxEuwABIj8AAkDvAAJBiIxzAAVccgwDASDJ5SAEAASsAACscwAFXHIMAwEgyea8cAQABFsABVz2AwAFXOMBIMCO0AcAARkIAtksBXD8GwACQ74GWwAFXV8ABV2PAAVe8AAC4OQFqwAFXWGDAAP0cAgAAAQPAAVdxwAFXvAAAAAEBAcABV30AAACD7mDAAEZLAABbAT4BPRzAAVeJLqC/AQABH8ABV5LAAJaXAQABMcABV7RgwACWmAAAAMAAkIMGwACQ8IGWwAFXwcABV8/AAVlLAADAAF6bAAAAAQPAAVfdwAFZSwAAAAICAsABV+oAAACAlmDAAPoKAMABWAMAAAClTmDAAEHFAABgwACU4wE+AUnAAVgcFsABWCkWwAFYIC6xrcAAkDvAAJBZgveBOD4BSsABWG0BJsABWG0BHMABWLsfwAFYeMAAlZECAAInmeEfwAFYi8AAlm4BAAEjgMABWJzASDNwJ4QIJ8AASs0BYMAA/bYAAK9YAQABgcABWNHASDN/AMAAk7pgwACU4z4BSsABWPgBJsABWPgBHMABWRkfwAFZA8AAlkQBAAGAwAFZEsBIM3AAr1gBAAGBwAFZL8BIM38AwACTumDAAJTjBsAAkPGBlsABWVDAAVlVwAFaxQAAwABe3wAAAAEDwAFZZcABWsUAAAACAgLAAVl7AAAAhf9gwABguwDAAVmXAAAApU5gwABBxQAAXAE+A07AAVm+wAFZyQAAgmtgwACU4wEcwAFZ1BbAAVnLLsAAQ4jAAJA7wACQWq9gAQABgMABWebASDSCAMAAXMRJwAFZ9SEWwAFaA4DAAVn6wEg0gsAARYXAAGDPPgE9isABWmXASDSmJsABWmUBHMABWn2CwAFacsBINKavWAEAAYHAAVqTwEg0kQDAAJO6YMAAlOM/PRzAAVqxLqC/AQABgsABWrbASDSmAMAAkIMGwACQ8oGWwAFaysABWtbAAVxsAACGAQFqwAFay2DAAP0cAgAAAQPAAVrjwAFcbAAAAAEBAcABWu4AAACD7mDAAEg2AABbAT4EQBzAAVsBLsAAXlgBAAGAwAFbFcBINYYAwACQfMABWwHAAVsaAD0cwAFbIS7AAF7fAgACFsABWzeAwAFbMsBINYaF/8AASDgWwAFbRoDAAVtBwEg1hqVOwABFZADAAJDxPRzAAVtpFsABW18uwABIj8AAkDvAAJBirxoBAAEfwAFbgcAAaAgBAAEWwAFbmoDAAVuVwEg1hoX/wABIOAAAtklJwAFbqhbAAVu8FsABW7OAwAFbrsBINYaF/8AASDjAAEWEwABgzT4CTsABW97AAVvrAADAAF7gYMAAYY0BJsABW94BFsABW/KAwAFb7cBINYaF/8AASDhgwABhjT0cwAFcDBbAAVwCLsAASI/AAJA7wACQYq8YAQABHsABXCvAAGfrAQABFsABXFGBwAFcRMBINmSzOcAAYY8AALZIPwbAAJDzgZbAAVxxwAFcfcABXPMAAIWtAWrAAVxyYMAA/RwCAAABA8ABXIXAAVzzAAAAAQEBwAFciwAAAIPuYMAASEwAAFsBPgJAHMABXLEWwAFcqhbAAVyjgMABXJ7ASDcOglHAAEVnYcAA/KNIAQABlADAAPzzwAFcnsABXLUAPRzAAVy8LsAAXskCAAIcwAFc0xbAAVzNgMABXMjASDcOglHAAEVnSwEAAZMAwAD8gxbAAVzdgMABXNjASDcOpU7AAEVkAMAAkPUGwACQ9IGWwAFc+MABXQbAAV5AAAHAAF7hAAAAAQPAAV0bwAFeQAAAAAICAsABXSMAAACpQmDAAP22AMABXSwAAADAAF6+YMAA+goAAGDAAP22AT4CTsABXU/AAV1fAADAAF7iXcAA/KUCYMAA/bZgwAD9tgFqwAFdYV3AAPylAmDAAP22YMAA/bbAAVxzSsABXhMBI4HAAV4awEg33hzAAV4zgsABXiTASDf5SwEAAYDAAV40wEg3zwDAAPy5gMABXjrASDfPAWDAAP22BsAAkPWBlsABXkXAAV5KwAFlGQAAwABeyQAAAAEDwAFeVcABZRkAAAACAgLAAV5jAAAAgXtgwABFYQDAAV58AAAApU5gwABBxQAAXAE+BE/AAV6VwAFemgAAAcAAXuNhAWDAAEVhYMAA+goAA8ABXrjAAWE9AAAAAQEBwAFexgAAALiIYMAARWEAAGDAAPoKAT4GScABXtshJcABXuuDwAFe38BIOOtgwABIfErAAV78ASo/TsABXx3AAV8oAADAAF7kYMAASHwBJsABXx0Bg8ABXyrASDjrYMAASHxOwAFfS8ABX1AAAIWvYMAARWEBFsABX12EwAFfUsBIOSWFr8AAR0pOwAFfdsABX3wAAIWxYMAARWEBFsABX4mEwAFffsBIOSWFscAAR0tJwAFfliIWwAFfxBzAAV+fhcABX5rASDlOtRwBAAEWwAFfri7AAFM0wACQO8AAkHoAwABFybPxvbkAFsABYA0cwAFf6IbAAV/iwEg5dbUcAQABFsABX/cuwABTNMAAkDvAAJB6AMAARcmz8b25PgFKwAFgKQEpP0rAAWC3ASIWwAFg4xzAAWDDhcABYL7ASDlOtQ8BAAEWwAFgzS7AAFM0wACQO8AAkHoAwABFvLPxvbkAFsABYSccwAFhB4bAAWEBwEg5dbUPAQABFsABYREuwABTNMAAkDvAAJB6AMAARbyz8b25TsABYUnAAWFeAADAAF7lYMAA+goBKknAAWFrHMABYW8uwABeWAEAAYDAAWGDwEg4nADAAJB8PgI9i8ABYZPASDqBKUnAAWG2JcABYcCAwAFhusBIOJxgwABJQz4BPRzAAWHSLsAAXuYDAAMUwAFh2cBIOJwAAWDAAElDJ52cgcABYefASDirAMAAkSVJwAFiCCXAAWISgMABYgzASDicYMAASWA+AT0cwAFiMi7AAF7nAwACFMABYkfASDicAAFgwABJYIHAAWJOwEg4qwGpRinAAJEmScABYn8lwAFiiYDAAWKDwEg4nGDAAEhMPgE9HMABYpwurvABAAEcwAFirBbAAWKmFMABYqDASDicAAFgwABITIJRwABFZ0sBAAGTAMAA/IMAwACQmUnAAWK/JcABYsmAwAFiw8BIOJxgwABIgT4BPRzAAWLhLsAAXr0DAAIUwAFi+MBIOJwAAWDAAEiBgcABYv/ASDirAcAAXr4pwACQuknAAWMvHMABY1GCwAFjM8BIOMQgAQABgMABY1LASDicAAA+BE7AAWNwwAFjewAAwABe5GDAAEh8ASbAAWNwAYDAAWN9wEg4nGDAAEh8TsABY6zAAWO2AACcwWDAAGkPARzAAWPDhMABY7jASDwanMEAAAAAwABHTU7AAWPfwAFj4gAAqUJgwAD9tgEewAFj5MAAkPQCAAIWwAFkBIXAAWP6wEg8Q4C9wABpBykAPRzAAWQZLsAAXrkDAAMmwAFkLAGAwAFkLMBIOJxgwABHRobAAWQzwEg8boHAAWQ3wEg4qwDAAJCzPgE9i8ABZGLASDqBKj9JwAFkkiGDwAFkl8BIOoE+Aj0cwAFktS6u8AEAAYDAAWS5wEg4nADAAJCZPRzAAWTHLqC/AQABJsABZOYBHMABZOYfwAFk0MAAlZECAAInmeEcwAFk3y6gwgAAAADAAJCEAK9YAQABgcABZPzASDirAMAAk7pgwACU4wDAAJCDPwbAAJD2gZbAAWUewAFlKsABZfkAALheAWrAAWUfYMAA/RwCAAABA8ABZT3AAWX5AAAAAQEBwAFlTgAAAIPuYMAASFoAAFsBPgRAIRzAAWViLsAAXlgBAAGAwAFldsBIPZ4AwACQfMABZWHAAWV7AE7AAWWJwAFljgAAgL1gwAD9tgEcwAFlnhbAAWWQLsAAXlHAAJBsmRQBAAGAwAFlpsBIPZ4AwACtgD0cwAFlvBbAAWWxLpqAwACQaFYBAAEfwAFlxMAAlckBAAGBwAFl0cBIPdkAAMAA/IU9HMABZewWwAFl3S7AAF5UwACQb1YBAAGBwAFl8MBIPdkAwAD9dAbAAJD3gZbAAWX+wAFmCsABZrQAALhZAWrAAWX/YMAA/RwCAAABA8ABZhnAAWa0AAAAAQEBwAFmJgAAAIPuYMAASFQAAFsBPgNAIRzAAWY6LsAAXlgBAAGAwAFmTsBIPp0AwACQfMABZjnAAWZTAE7AAWZhwAFmZgAAgL1gwAD9tgEcwAFmdhbAAWZoLsAAXlHAAJBsmRQBAAGAwAFmfsBIPp0AwACtgD0cwAFmpxbAAWaJLsAAXlPAAJBuVgEAAYHAAWarwEg+2ADAAP10BsAAkPiBlsABZrnAAWbFwAFq6gAAuF8BasABZrpgwAD9HAIAAAEDwAFmzcABauoAAAABAQHAAWbTAAAAg+5gwABIbQAAWwE+BE7AAWedwAFnpQAAwABe6GDAAEUqARbAAWeyFsABZ6yAwAFnp8BIP2uZ98AARWm40cAARThAHMABZ90WwAFnyC7AAF5KwACQZIMXAQABFsABZ+6BwAFn5sBIP4CB6MAARR0AwAD9c8ABZ8jAAWfzAE7AAWgHwAFoDQAAgXtgwABFYQEcwAFoIhbAAWgcFsABaBeBwAFoD8BIP4CB6MAARR2CUcAARWdLAQABkwDAAPyDScABaCscwAFoNYLAAWgvwEg/77lSAAAAAMAAReQ+AT0cwAFoUC6u8AEAARzAAWhfFsABaFmAwAFoVMBIP2uCUcAARWdLAQABlADAAPyDAMAAkJlJwAFocBzAAWh6gsABaHTASD/vuVMAAAAAwABF5T4BPRzAAWiULq7wAQABHMABaKMWwAFonYDAAWiYwEg/a4JRwABFZ0sBAAGTAMAA/IMAwACQmUnAAWi0HMABaMccwAFowxbAAWi9gMABaLjASD9rglHAAEVnSwEAAZQAwAD8g7lLAAAAAMAARd0+BU7AAWjrwAFo9QAAnMFgwAD9tgEjHMABaQYcwAFpAhbAAWj8gMABaPfASD9rglHAAEVnSwEAAZQAwAD8g7lSAAAAAMAAReQnl8Qnl8UBYMAA/bZJwAFpLRzAAWk7g8ABaTHASEEPSAEAASeXxQDAAP3FPgE9HMABaU4uwABeyQIAAoLAAWlawEg/7xbAAWlngsABaWHASD/vpU7AAEVkAMAAkPU+AT0cwAFpki6u8AEAAYLAAWmWwEg/7wDAAJCZTsABabrAAWm/AACFr2DAAJTjARzAAWnBLqDCAAAAAMAAkIQ9HMABac4urvABAAEcwAFp3RbAAWnXgMABadLASD9rglHAAEVnSwEAAZMAwAD8gwDAAJCZPRzAAWnpLqC/AQABH8ABafLAAJWCAwADg8ABafzASEEPhMABagfASEHOHMABag0uoMIAAAAAwACQhAAAwACQgz4GPRzAAWopLq7wAQABgsABai3ASD/vAMAAkJlOwAFqScABak4AAJb5YMAAlOMBHMABalAuoMIAAAAAwACQhD0cwAFqXS6u8AEAARzAAWpsFsABamaAwAFqYcBIP2uCUcAARWdLAQABkwDAAPyDAMAAkJlOwAFqhsABaosAAIGtYMAAlOMBHMABao0uoMIAAAAAwACQhD0cwAFqmi6u8AEAARzAAWqpFsABaqOAwAFqnsBIP2uCUcAARWdLAQABlADAAPyDAMAAkJk9HMABarUuoL8BAAEfwAFqvsAAlVoDAAODwAFqzcBIQoGEwAFq08BIQtgcwAFq2S6gwgAAAADAAJCEAADAAJCDBsAAkPmBlsABau/AAWr7wAFsegAAsGYBasABavBgwAD9HAIAAAEDwAFrBsABbHoAAAABAQHAAWsPAAAAg+5gwABIsAAAWwE+A0AcwAFrNRbAAWsuFsABayeAwAFrIsBIQ6OCUcAARWdhwAD8o0gBAAGUAMAA/PPAAWsiwAFrOQBOwAFrTcABa1MAAIF7YMAARWEBHMABa2AWwAFrWoDAAWtVwEhDo4JRwABFZ0sBAAGTAMAA/INJwAFraRzAAWtzgcABa23ASEPvuUwAAAAAwABF3j4BPRzAAWuNLsAAXmABAAEmwAFrtgEcwAFrth/AAWuqwACUYAAAAACvWAEAARbAAWvRgMABa8zASEOjpU7AAEVkAMAAk7pgwACTzADAAJCAPgI9HMABa/kurvABAAEcwAFsCBbAAWwCgMABa/3ASEOjglHAAEVnSwEAAZMAwAD8gwDAAJCZPRzAAWwULsAAXmABAAEmwAFsQgEcwAFsQh/AAWwxwACUYAEAARzAAWw7LqDCAAAAAMAAkIQAr1gBAAEWwAFsXYDAAWxYwEhDo6VOwABFZADAAJO6YMAAk8wAwACQgAbAAJD6gZbAAWx/wAFsi8ABbL4AALBOAWrAAWyAYMAA/RwCAAABA8ABbJTAAWy+AAAAAQEBwAFsmwAAAIPuYMAASGEAAFsBPgE9HMABbKcuoL8BAAEfwAFssMAAldEAAAAAAMAAkIMGwACQ+4GWwAFsw8ABbM/AAW4qAACF7wFqwAFsxGDAAP0cAgAAAQPAAWzZwAFuKgAAAAEBAcABbOEAAACD7mDAAEjQAABbAT4BScABbO0WwAFs9oDAAWzxwEhFwboqwABI0j4CPRzAAW0JLq7wAQABHMABbRgWwAFtEoDAAW0NwEhFwYJRwABFZ0sBAAGTAMAA/IMAwACQmT0cwAFtJC7AAF5gAQABJsABbVEBHMABbVEfwAFtQcAAlGwBAAEcwAFtSi6gwgAAAADAAJCEAK9YAQABFsABbWyAwAFtZ8BIRcGlTsAARWQAwACTumDAAJPMAMAAkIA+AT0cwAFtlC7AAF7pAwACFsABbccWwAFtty6zv8AAkDvAAJB3sUe4vhzAAW3nFsABbeGAwAFt3MBIRcGCUcAARWdLAQABkwDAAPyDAaVOFsABbg6AwAFuCcBIRcGlTsAARWTAAJEABsAAkPyBlsABbi/AAW47wAFuvQAAsDYBasABbjBgwAD9HAIAAAEDwAFuRcABbr0AAAABAQHAAW5NAAAAg+5gwABIvQAAWwE+Aj0cwAFuWS6u8AEAARzAAW5oFsABbmKAwAFuXcBIRx6CUcAARWdLAQABkwDAAPyDAMAAkJk9HMABbnIuoL8BAAEmwAFuiwEcwAFuix/AAW57wACXRAEAARzAAW6ELqDCAAAAAMAAkIQAr1gBAAEWwAFupoDAAW6hwEhHHqVOwABFZADAAJO6YMAAlOMAwACQgwbAAJD9gZbAAW7CwAFuzsABb3QAALhxAWrAAW7DYMAA/RwCAAABA8ABbtjAAW90AAAAAQEBwAFu4AAAAIPuYMAASMYAAFsBPgI9HMABbuwurvABAAEcwAFu+xbAAW71gMABbvDASEf3glHAAEVnSwEAAZMAwAD8gwDAAJCZPRzAAW8FLsAAXmABAAEmwAFvQgEcwAFvQh/AAW8XwACU4gIAAhzAAW8kLqDCAAAAAMAAkIQWwAFvMIDAAW8rwEhH97BewABIyACvWAEAARbAAW9dgMABb1jASEf3pU7AAEVkAMAAk7pgwACTzADAAJCABsAAkP6BlsABb3nAAW+FwAFwHQAAuGABasABb3pgwAD9HAIAAAEDwAFvmcABcB0AAAABAQHAAW+rAAAAg+5gwABJzQAAWwE+AUAqwAFwE8ABcBgABsAAkP+BlsABcCLAAXAuwAF4BgAAuDcBasABcCNgwAD9HAIAAAEDwAFwPsABeAYAAAABAQHAAXBMAAAAg+5gwABGGwAAWwE+AkAhHMABcVMWwAFxRoDAAXFBwEhJOrl8wABGIkgBAAFqwAFxY2DAAPvQgVUAwAD888ABcUHAAXFuAEnAAXF1IRzAAXGLFsABcX6AwAFxecBISTq5fMAARiJIAQABasABcZtgwAD70AkAwAD88z4NTsABcb8AAADAAF7qYMAAlOMATsABcdoAAADAAF7rYMAAlOMAScABceYhHMABcfwWwAFx74DAAXHqwEhJOrl8wABGIkgBAAFqwAFyDGDAAPvQIQDAAPzzPgI9HMABcikurvABAAEWwAFyMoDAAXItwEhJOifAAEYlAMAAkJlJwAFyQhbAAXJxHMABclEWwAFyS4DAAXJGwEhJOifAAEYltQ8BAAEWwAFyWy7AAFM0wACQO8AAkHoAwABFvLPxvbk+AT2JwAFyj8BISb0cwAFymWrAAXKaYMAAl1HAAROJIAIAAifAAF7sHMABcqYuoMIAAAAAwACQhADAAJdTPgJOwAFy18ABct8AAMAAXu1gwACU4wEcwAFy4S6gwgAAAADAAJCEPYnAAXLywEhJvRzAAXL8asABcv1gwACXUcABE4kgAgACJ8AAXu4xwAFzEWDAAJTjAoPAAXMSwEhKu4PAAXMbwEhKuwDAAJdTScABcz0WwAFzghzAAXNXFsABc0aAwAFzQcBISTonwABGJbUPAQABFsABc2EuwABTNMAAkDvAAJB6AMAARby01r28PgI9HMABc6Ausn0CAAIWwAFzroDAAXOpwEhJOifAAEYlJ52cAMAAkQw9icABc8XASEm9HMABc80uoMIAAAAAwACQhD9JwAFz4iEcwAFz+BbAAXPrgMABc+bASEk6uXzAAEYiSAEAAWrAAXQIYMAA+9BSAMAA/PM+BU7AAXQrwAF0MQAAJ2DAAEVhARbAAXQ4gMABdDPASEk6J8AARiU9HMABdEcurvABAAGDwAF0S8BIS+MAwACQmU7AAXRpwAF0cQAAwABe7WDAAJTjARzAAXRzLqDCAAAAAMAAkIQ9HMABdIIurvABAAEWwAF0i4DAAXSGwEhJOmHAAEYkAMAAkJk9isABdJzASEnPH8ABdKfAAJWCAwADJ4FthMABdLfASEwiHMABdMAuoMIAAAAAwACQhAA/QCIhHMABdOKCwAF03cBISc9IAQABKwDAAP0pASEcwAF084HAAXTtwEhJvUgBAAErAMAA/SnAAXTdwAF0+gBOwAF1EcABdRsAAMAAXu9gwACU4wEjHMABdSOBwAF1HcBISb1IAQABKwDAAP0pgsABdTfASEnPIxzAAXVNgsABdUjASEnPSAEAASsAwAD9KYHAAXVXwEhJvR/AAXVjwACVggMAAyeXxYHAAXVzwEhJvYLAAXV6wEhJzwABYMAAlOMBYMAAlONOwAF1lMABdZ0AAL5MYMAAk8wBH8ABdaPAAJPdAAAAAE7AAXXEwAF10QAAwABeemDAAJPRARbAAXXTLsAAXk7AAJBpPRfAAXXrLsAAXk4mwAF16wGEwAF1/sBITWRgwACT0cAAkGk9HMABdg4uwABe6QMAAhbAAXY2FsABdiYus7/AAJA7wACQd7E+uLUxwAF2X2DAAEVhAhbAAXZlgMABdmDASEk6n8jAAEYmFsABdnGAwAF2bMBISTq5fcAARicBpU4WwAF2o4DAAXaewEhJOqVOwABFZMAAkQA9F8ABdr0uwABeToXAAXbQwEhNhMAAkGk9jMABduTASE1kHMABdu8uwABeewEAASbAAXb/AYTAAXb/wEhNZGDAAJPRAMAAkJI9HMABdxAuwABeYAEAASbAAXdPARzAAXdPH8ABdyLAAJQEAgACg8ABdy/ASEzdhMABdzrASE1kAK9YAQABFsABd2qAwAF3ZcBISTqlTsAARWQAwACTumDAAJPMAMAAkIA+AT0cwAF3ki7AAF7pAgACFsABd7oWwAF3qi6zv8AAkDvAAJB3sT64tTHAAXfjYMAARWECFsABd+mAwAF35MBISTqfyMAARiYWwAF39YDAAXfwwEhJOifAAEYlAMAAkQAGwACRAIGWwAF4C8ABeBDAAXyJAADAAF7pAAAAAQPAAXgnwAF8iQAAAAMCAsABeDcAAACVVmC8zADAAXg/AAAAH1sAAcABeGIAAAClTmDAAEHFAWoAYMAA/Nl3XAE+Bk7AAXiKwAF4kwAAwABe8GDAAJTjARzAAXieFsABeJUuwABDiMAAkDvAAJBawABDlwEAAYDAAXizwEhPcgDAAFy7TsABeMXAAXjPAABbXcAA/HQBWwExwAF44GDAAJTjAEnAAXjoJcABePWBwAF47MBIT39dwAD8dAFbPgE9HMABeQ8UwAF5BsBIT38BAV3AAPx0AVuD+AEAATTAAXkXA8ABeRfAAXlmAAAAAQEBwAF5GAAAALiIWwAAYMAA/NkBPgI9HMABeS8urvABAAEmwAF5MwGFwAF5M8BIUFJgwABFYQDAAJCZPRzAAXlThMABeUnASE/nVgEAARzAAXlXLqDCAAAAAMAAkIQAwAD8hQDAAPxCPgI9HMABeXwurvABAAEmwAF5gAGBwAF5gMBIT39gwABFYQDAAJCZPRzAAXmbhMABeZHASE/nVgEAARzAAXmfLqDCAAAAAMAAkIQAwAD8hT0cwAF5uxbAAXmxLsAASI/AAJA7wACQYq8UAQABHsABedHAAGejAgACgMABefHASE9yH8ABef3AAGi7AQABFsABeh2EwAF6E8BIT+dhwAD8owAAALZGTsABejTAAXo6AACAlmDAAJVbAR/AAXpAwACVaQMAAoPAAXpIwEhPpibAAXpcARzAAXpchMABelLASE/ngK0BAAABhVgqwAD8SF3AAPx0AWDAAJTjAaVOgsABepDASE+KScABe4IcwAF7jYDAAXuGwEhPckgBAAEWwAF7oBbAAXuQLrO/wACQO8AAkHexR7i+AMAA/Sk+AT0cwAF7vS7AAF5gAQABJsABe+oBHMABe+ofwAF72sAAlGwBAAGFwAF748BIUV4Ar1gBAAGCwAF8AMBIT4oAwACTumDAAJPMAMAAkIA+AT0cwAF8KC7AAF5gAQABJsABfFYBHMABfFYfwAF8RcAAlGABAAGFwAF8T8BIUV4Ar1gBAAGCwAF8bMBIT4oAwACTumDAAJPMAMAAkIAGwACRAYGWwAF8jsABfJrAAX5zAAC4awFqwAF8j2DAAP0cAgAAAQPAAXyuwAF+cwAAAAEBAcABfMAAAACD7mDAAEi2AABbAT4HTsABfNnAAXziAAAfYMAARWEBHMABfO8WwAF86YDAAXzkwEhSw4JRwABFZ0sBAAGTAMAA/IM9HMABfPgurvABAAGBwAF8/MBIUtgAwACQmU7AAX0bwAF9IgAAlVZgvMwBFsABfTQWwAF9JC6zv8AAkDvAAJB3sUi4vz0cwAF9WRbAAX1PLsAASI/AAJA7wACQYq8UAQABHsABfXjAAGejAgACgsABfY/ASFMnasABfaVgwABol8AA5EMAALZGTsABfcPAAX3MAADAAF7wYMAAlOMBHMABfdcWwAF9zi7AAEOIwACQO8AAkFrAAEOXAQABgsABfezASFMnAMAAXLtOwAF+AcABfgcAAICWYMAAlVsBJsABfgEBHMABfjEfwAF+DcAAlWkCAAKDwAF+FcBIU5UxwAF+H2DAAJTjARzAAX4gLqDCAAAAAMAAkIQAr1gBAAEWwAF+TIDAAX5HwEhSw6VOwABFZADAAJO6YMAAlVs9HMABfmQuoL8BAAGEwAF+acBIU9YAwACQgwbAAJECgZbAAX54wAF+icABftwAALBiAWrAAX55YMAA/RwCAAABA8ABfpTAAX7cAAAAAQEBwAF+nQAAAIPuYMAAR4sAAFwBPgAGwACRA4GWwAF+4cABfvLAAYEXAAC4ZgFqwAF+4mDAAP0cAgAAAQPAAX79wAGBFwAAAAEBAcABfwYAAACD7mDAAEjYAABcAT4DTsABfx/AAX8nAACWIGC8twEWwAF/LoDAAX8pwEhU35YgwABI2kAiFsABf0qBwAF/QsBIVPSyfLy/ARbAAX9ggcABf1jASFT0h3a8vsABf0LAAX9nAEnAAX9uFsABf3qBwAF/csBIVPSyfLy/PgI9HMABf44uoL8BAAEmwAF/zwEcwAF/zxzAAX+nFsABf5MuwABDiMAAkDvAAJBawABDmgEAASbAAX+7AYHAAX+7wEhU9GC8zADAAFy+r1gBAAEWwAF/6oDAAX/lwEhU36VOwABFZADAAJO6YMAAlOMAwACQgz0cwAGADxbAAYAFLsAASI/AAJA7wACQYq8UAQABHsABgCXAAGekAQABJsABgD0BgcABgD3ASFT0YLzMAAC2Rj4CPRzAAYBbLqC/AQABJsABgJoBHMABgJocwAGAdBbAAYBgLsAAQ4jAAJA7wACQWsAAQ5gBAAEmwAGAhgGBwAGAhsBIVPRgvMkAwABcvK9YAQABFsABgLWAwAGAsMBIVN+lTsAARWQAwACTumDAAJTjAMAAkIM9HMABgNoWwAGA0C7AAEiPwACQO8AAkGKvFAEAAR7AAYDwwABnpQEAAYHAAYEEwEhU9AAAtkYGwACRBIGWwAGBHMABgS3AAYKQAAC4UwFqwAGBHWDAAP0cAgAAAQPAAYE8wAGCkAAAAAEBAcABgUkAAACD7mDAAEkBAABcAT4FTsABgWHAAYFpAACWIGC8yQEWwAGBcIDAAYFrwEhW9ZYgwABJAz0cwAGBhxbAAYF9LsAASI/AAJA7wACQYq8UAQABHsABgZ3AAGenAQABgcABgbLASFcKAAC2Rk7AAYHPwAGB2gAAwABe8WDAAJTjARzAAYHlFsABgdwuwABDiMAAkDvAAJBawABDmQEAAYHAAYICwEhXCgDAAFy9TsABghjAAYIdAAAgYMAAlVsBH8ABgiPAAJVpAwACgsABgivASFdlMcABgkZgwACU4wABpU4WwAGCaoDAAYJlwEhW9aVOwABFZD0cwAGCgi6gvwEAAYPAAYKHwEhXpgDAAJCDBsAAkQWBlsABgpXAAYKmwAGD1QAAuGcBasABgpZgwAD9HAIAAAEDwAGCtsABg9UAAAABAQHAAYLEAAAAg+5gwABJDAAAXAE+BD0cwAGC2hbAAYLQLsAASI/AAJA7wACQYq8UAQABHsABgvDAAGemAQABFsABgwmAwAGDBMBIWD2WIMAASQ4AALZGTsABgyDAAYMpAACCbGDAAJOsARzAAYM0FsABgysuwABDiMAAkDvAAJBawABDmAEAASbAAYNLARbAAYNLgMABg0bASFg9liDAAEkOYLzJAMAAXLw9HMABg1kurvABAAEcwAGDaBbAAYNigMABg13ASFg9glHAAEVnSwEAAZMAwAD8gwDAAJCZPRzAAYNyLqC/AQABJsABg6MBHMABg6MfwAGDe8AAlT8CAAKBwAGDicBIWJMcwAGDky6gwgAAAADAAJCEAK9YAQABFsABg76AwAGDucBIWD2lTsAARWQAwACTumDAAJTjAMAAkIMGwACRBoGWwAGD2sABg+vAAYTEAAC4aAFqwAGD22DAAP0cAgAAAQPAAYP8wAGExAAAAAEBAcABhAsAAACD7mDAAEnUAABcAT4EPRzAAYQXLq7wAQABFsABhCCAwAGEG8BIWbOFr8AASdYAwACQmU7AAYQ5wAGEQAAAwABeumDAAJTjARzAAYRCLqDCAAAAAMAAkIQ9HMABhE0urvABAAEWwAGEVoDAAYRRwEhZs4WxwABJ1wDAAJCZPRzAAYRiLqC/AQABJsABhJIBHMABhJIfwAGEa8AAlYIDAAMnZIHAAYR6wEhZ7RzAAYSCLqDCAAAAAMAAkIQAr1gBAAEWwAGErYDAAYSowEhZs6VOwABFZADAAJO6YMAAlOMAwACQgwbAAJEHgZbAAYTJwAGE2sABieEAALhpAWrAAYTKYMAA/RwCAAABA8ABhOjAAYnhAAAAAQEBwAGE9AAAAIPuYMAASd0AAFwBPgJOwAGFDcABhRMAAIF7YMAARWEBFsABhSEWwAGFGoDAAYUVwEha0oJRwABFZ4MZwAD8WEnAAYUsFsABhVUcwAGFNoHAAYUwwEha57UbAQABFsABhT8uwABTNMAAkDvAAJB6AMAARciz8b25PgE9HMABhW8urvABAAGBwAGFc8BIWucAwACQmUnAAYWGIhbAAYWwHMABhZCBwAGFisBIWue1DwEAARbAAYWaLsAAUzTAAJA7wACQegDAAEW8s/G9uQEWwAGF8hzAAYXSgcABhczASFrntRkBAAEWwAGF3C7AAFM0wACQO8AAkHoAwABFxrPxvbk+Aj0cwAGGqy6u8AEAAYHAAYavwEha5wDAAJCZScABhr0iIhzAAYbUFsABhs0WwAGGxoDAAYbBwEha0rjGwABFaGHAAPyjSAEAAZQAwAD88wAlwAGG9RzAAYbxFsABhuuAwAGG5sBIWtK4xsAARWhLAQABkwDAAPyDYMAASdQAHMABhywcwAGHKBbAAYciHMABhx4WwAGHGIDAAYcTwEha0rjGwABFaEsBAAGTAMAA/IOCUcAARWdLAQABlADAAPyDSAEAAYDAAYcvwEha0gDAAP0pPgA+AT0cwAGHui6gvwEAASbAAYf1ARzAAYf1H8ABh8PAAJWCAwADJ2QewAGH0sAAkoMBAAEnAAAcwAGH4S6gwgAAAADAAJCEAK9YAQABFsABiBCAwAGIC8BIWtKlTsAARWQAwACTumDAAJTjAMAAkIM+BU7AAYhPwAGIXwAApsBgvMwBFsABiHsWwAGIay6zv8AAkDvAAJB3sUa4vT0cwAGIphbAAYicLsAASI/AAJA7wACQYq8UAQABHsABiMfAAGejAgACgsABiN7ASF0gasABiP1gwABol8AA5EMAALZGTsABiRzAAYklAADAAF7wYMAAlOMBHMABiTAWwAGJJy7AAEOIwACQO8AAkFrAAEOXAQABgsABiUXASF0gAMAAXLs9HMABiV0urvABAAGBwAGJYcBIWucAwACQmT0cwAGJby6gvwEAAR/AAYl4wACVaQMAAoPAAYmAwEhdjjHAAYmZYMAAlOMBHMABiZouoMIAAAAAwACQhAGlThbAAYnEgMABib/ASFrSpU7AAEVkAMAAkIMGwACRCIGWwAGJ5sABiffAAYrGAAC4VgFqwAGJ52DAAP0cAgAAAQPAAYoHwAGKxgAAAAEBAcABihUAAACD7mDAAEkaAABcAT4CPRzAAYpuFsABiiEuwABIj8AAkDvAAJBirxEBAAEWwAGKmBbAAYqILrO/wACQO8AAkHea0rg+ALZFPRzAAYqoLsAAXvIBAAGAwAGKvcBIXnUAwACRCQbAAJEJgZbAAYrLwAGK0MABi+EAAMAAXvIAAAABA8ABiuTAAYvhAAAAAQEBwAGK8gAAAIPuYMAASRoAAFwBPgJOwAGLEsABixsAAIg/XcAA/HQBYMAAlOMBHMABi3EcwAGLKRbAAYsigMABix3ASF8KglHAAEVngKsBAWDAAJTjATTAAYstA8ABiy3AAYtvAAAAAQEBwAGLOwAAAIF7YMAARWEAAGDAAJTjAT4CPRzAAYtKLq7wAQABgcABi07ASF9zAMAAkJlKwAGLXAEcwAGLYy6gwgAAAADAAJCEAMAA/D2ArQAAAADAAPxIPRzAAYt/LqC/AQABJsABi68BHMABi68fwAGLiMAAlnwBAAGBwAGLnMBIXx8Ar1gBAAEWwAGLyoDAAYvFwEhfCqVOwABFZADAAJO6YMAAlOMAwACQgwbAAJEKgZbAAYvmwAGL98ABjM0AALhFAWrAAYvnYMAA/RwCAAABA8ABjAHAAYzNAAAAAQEBwAGMCQAAAIPuYMAASSEAAFwBPgQ9HMABjBUurvABAAEWwAGMHoDAAYwZwEhgVIV5wABJLgDAAJCZTsABjDvAAYxEAACFeWDAAJTjARzAAYxGLqDCAAAAAMAAkIQ9HMABjFEurvABAAEWwAGMWoDAAYxVwEhgVCfAAEkvAMAAkJk9HMABjGYuoL8BAAEmwAGMmwEcwAGMmx/AAYxvwACWDgIAAoHAAYyBwEhgjhzAAYyLLqDCAAAAAMAAkIQAr1gBAAEWwAGMtoDAAYyxwEhgVKVOwABFZADAAJO6YMAAlOMAwACQgwbAAJELgZbAAYzSwAGM48ABjhUAALhGAWrAAYzTYMAA/RwCAAABA8ABjPPAAY4VAAAAAQEBwAGNAQAAAIPuYMAASTMAAFwBPgY9HMABjQ0urvABAAEWwAGNFoDAAY0RwEhhboV5wABJPQDAAJCZTsABjTPAAY08AACFeWDAAJTjARzAAY0+LqDCAAAAAMAAkIQ9HMABjUkurvABAAEWwAGNUoDAAY1NwEhhbifAAEk+AMAAkJlOwAGNbMABjXIAACdgwACU4wEcwAGNdC6gwgAAAADAAJCEPRzAAY1/Lq7wAQABFsABjYiAwAGNg8BIYW6AlsAAST8AwACQmT0cwAGNlC6gvwEAASbAAY3jARzAAY3jH8ABjZ3AAJU/AgACH8ABja/AAJYOAgACgcABjcHASGGogsABjcvASGHvABzAAY3TLqDCAAAAAMAAkIQAr1gBAAEWwAGN/oDAAY35wEhhbqVOwABFZADAAJO6YMAAlOMAwACQgwbAAJEMgZbAAY4awAGOH8ABjwMAALJ9AAAAAQPAAY4nwAGPAwAAAAICAsABjjUAAACBe2DAAEVhAMABjkMAAACy6WDAAP22AABcAT4FPRzAAY5OLq7wAQABgMABjlLASGLaAMAAkJlOwAGObMABjnEAAIWvYMAAlOMBHMABjnMuoMIAAAAAwACQhD0cwAGOfi6u8AEAAYDAAY6CwEhi2gDAAJCZTsABjpzAAY6gAADAAF7zYMAAlOMBH8ABjqbAAJWCAwADJ4EGHMABjrUuoMIAAAAAwACQhB/AAY7AwACWbgEAASeECAAAPRzAAY7cLqC/AQABH8ABjuXAAJWCAwADgcABju/ASGLpgsABjvTASGMYg8ABjvrASGNVAADAAJCDBsAAkQ2BlsABjwjAAY8NwAGQ+wAAwABe9AAAAAEDwAGPGMABkPsAAAADAwPAAY8tAAAAgXtgwABFYQDAAY87AAAAsulgwAD9tgDAAY9SAAAApU5gwABBxQAAXAE+Bj0cwAGPay6u8AEAAYDAAY9vwEhj/gDAAJCZTsABj4nAAY+OAACFr2DAAJTjARzAAY+QLqDCAAAAAMAAkIQ9HMABj5survABAAGAwAGPn8BIY/4AwACQmU7AAY+5wAGPvwAAhbFgwACU4wEcwAGPwS6gwgAAAADAAJCETsABkArAAZAYAADAAF71YMAAlOMBJsABkAoBHMABkFAcwAGQHGrAAZAdYMAAl1HAAROJIAIAAifAAF72McABkEhgwACU4wGDwAGQScBIZEsAwACXU69YAQABgsABkGbASGQcAMAAk7pgwACU4z0cwAGQfi6gvwEAASbAAZDOARzAAZDOHMABkIVqwAGQhmDAAJdRwAETiSACAAIkwAGQkwMnnHOBwAGQjcBIZA0nwABe9zHAAZCkYMAAlOMChcABkKzASGSrhMABkMHASGSIAMAAl1OvWAEAAYLAAZDkwEhkHADAAJO6YMAAlOMAwACQgwbAAJEOgZbAAZEAwAGRBcABkikAAMAAXvgAAAABA8ABkRDAAZIpAAAABAQEwAGRHgAAAIF7YMAARWEAwAGRLAAAALLpYMAA/bYAwAGROAAAAMAAQCBgwAD9tgDAAZFaAAAApU5gwABBxQAAXAE+Az0cwAGRcy6u8AEAAYDAAZF3wEhlxwDAAJCZTsABkZHAAZGYAADAAE3zYMAAlOMBH8ABkZ7AAJWRAgACJ8AARlocwAGRsi6gwgAAAADAAJCEAD0cwAGRvi6gvwEAASbAAZH8ARzAAZH8H8ABkcfAAJWCAwADgcABkdHASGXWhMABkdbASGYlHsABkd7AAJKDAQABgsABkejASGXlAACvWAEAAYPAAZISwEhl9gDAAJO6YMAAlOMAwACQgwbAAJEPgZbAAZIuwAGSM8ABks0AALJ+AAAAAQPAAZI7wAGSzQAAAAMDA8ABklAAAACBe2DAAEVhAMABkl4AAACy6WDAAP22AMABknUAAAClTmDAAEHFAABcAT4BSsABko4BHMABkpUuwABe+AQABIDAAZKhwEhm7oHAAZKowEhm/SfAAFFNgsABkrfASGcMAMAAkQ4GwACREIGWwAGS0sABktfAAZNnAADAAF75AAAAAQPAAZLiwAGTZwAAAAMDA8ABkvcAAACBe2DAAEVhAMABkwUAAACy6WDAAP22AMABkxwAAAClTmDAAEHFAABcAT4BSsABkzUBHMABkzwusn4DAAOAwAGTRcBIZ4SBwAGTTMBIZ5OCwAGTUcBIZ6IAwACRDwbAAJERgZbAAZNswAGTccABlA4AALJ/AAAAAQPAAZN8wAGUDgAAAAMDA8ABk5EAAACBe2DAAEVhAMABk58AAACy6WDAAP22AMABk7YAAAClTmDAAEHFAABcAT4BSsABk88BHMABk9YuwABe+AQABIDAAZPiwEhoEYHAAZPpwEhoICeD7ILAAZP4wEhoLwDAAJEOBsAAkRKBlsABlBPAAZQYwAGUtAAAwABe+gAAAAEDwAGUIcABlLQAAAADAwPAAZQ2AAAAgXtgwABFYQDAAZREAAAAsulgwAD9tgDAAZRbAAAApU5gwABBxQAAXAE+AUrAAZR0ARzAAZR7LsAAXvgEAASAwAGUh8BIaKWBwAGUjsBIaLQnwABe+4LAAZSewEhowwDAAJEOBsAAkROBlsABlLnAAZS+wAGX3QAAwABe/AAAAAEDwAGUycABl90AAAADAwPAAZTeAAAAgXtgwABFYQDAAZTsAAAAsulgwAD9tgDAAZUDAAAApU5gwABBxQAAXAE+AkAcwAGVPGrAAZU1YMAA/bbAAJ3fSAEAASeEPADAAP3FwAGVI8ABlUUAScABlUwcwAGVVIHAAZVQwEhpSkgBAAEnna4AwAD9xT4FPRzAAZVmLsAAXvgEAASAwAGVcsBIaTsnna4ng8CCwAGVisBIaVkAwACRDk7AAZWywAGVtwAAha9gwACU4wEcwAGVuS6gwgAAAADAAJCEPRzAAZXGLq7wAQABgMABlcrASGk7AMAAkJlOwAGV5sABle4AAMAAXv1gwACU4wEfwAGV9MAAlYIDAAMnnZwcwAGWBS6gwgAAAADAAJCEH8ABlhDAAJZMAAAAAAA9HMABlikuoL8BAAEmwAGWXAEcwAGWXB/AAZYywACVggMAAyeXxIPAAZZCwEhp44TAAZZIwEhqIACvWAEAAYLAAZZywEhpWQDAAJO6YMAAlOMAwACQgz4GQBzAAZalgcABlqHASGlKSAEAASednADAAP3FwAGWocABlq0APRzAAZa2LsAAXvgEAASAwAGWwsBIaTsnnZwng8CCwAGW2sBIaVkAwACRDk7AAZcCwAGXBwAAha9gwACU4wEcwAGXCS6gwgAAAADAAJCEPRzAAZcWLq7wAQABgMABlxrASGk7AMAAkJlOwAGXNsABlz0AAMAAXv5gwACU4wEfwAGXQ8AAlYIDAAMnna4cwAGXVC6gwgAAAADAAJCEH8ABl1/AAJZMAAAAAAA9HMABl3guoL8BAAEmwAGXqgEcwAGXqh/AAZeBwACVggMAAyeXxYPAAZeRwEhrCYTAAZeXwEhrRgCvWAEAAYLAAZfAwEhpWQDAAJO6YMAAlOMAwACQgwbAAJEUgZbAAZfiwAGX58ABmM0AAMAAXv8AAAABA8ABl/HAAZjNAAAAAgICwAGX/wAAAIF7YMAARWEAwAGYDQAAALLpYMAA/bYAAFwBPgM9HMABmBgurvABAAGAwAGYHMBIbAkAwACQmU7AAZg6wAGYRgAAmNVgwACWAAEfwAGYVMAAlg8CAAIcwAGYbC6gwgAAAADAAJCEJ5jVAD0cwAGYhy6gvwEAAR/AAZiQwACVggMAA4HAAZiawEhsGILAAZifwEhsRx/AAZiwwACVtwEAASfAAEZqAAAAwACQgwbAAJEVgZbAAZjSwAGY18ABmdQAAMAAXwAAAAABA8ABmOfAAZnUAAAAAgICwAGY9QAAAIF7YMAARWEAwAGZAwAAAMAAR8pgwAD9tgAAXAE+Az0cwAGZFC6u8AEAAYDAAZkYwEhs5wDAAJCZTsABmTbAAZk8AACEjmDAAJYAAR/AAZlCwACWDwIAAhzAAZlaLqDCAAAAAMAAkISBwAGZYcBIbPYAPRzAAZmdLqC/AQABH8ABmabAAJWRAgACJ5nhH8ABmbnAAJWRAgACJ5nhgsABmcjASG0nAAAAwACQgwbAAJEWgZbAAZnZwAGZ3sABmqEAAMAAXwEAAAABA8ABmfTAAZqhAAAAAgICwAGaAgAAAIF7YMAARWEAwAGaEAAAAMAAR8pgwAD9tgAAXAE+Az0cwAGaIS6u8AEAAYDAAZolwEhtxQDAAJCZTsABmkPAAZpJAACEjmDAAJYAAR/AAZpPwACWDwIAAhzAAZpnLqDCAAAAAMAAkISBwAGabsBIbdQAPRzAAZp+LqC/AQABH8ABmofAAJWRAgACJ5nhgsABmpbASG4FAADAAJCDBsAAkReBlsABmqbAAZqrwAGbBwAAwABfAgAAAAEDwAGavsABmwcAAAABAQHAAZrMAAAAgXtgwABFYQAAXAE+AT0cwAGa2S7AAF8AAgACgMABmurASG6TJ8AAXwMAwACRFQbAAJEYgZbAAZsMwAGbEcABm3EAAMAAXwQAAAABA8ABmyLAAZtxAAAAAQEBwAGbMAAAAIF7YMAARWEAAFwBPgE9HMABmz0uwABfAQIAAoDAAZtUwEhu9CfAAF8DAMAAkRYGwACRGYGWwAGbdsABm3vAAZvcAADAAF8FAAAAAQPAAZuPwAGb3AAAAAEBAcABm50AAACBe2DAAEVhAABcAT4BPRzAAZuqLsAAXwECAAKAwAGbwcBIb1UnwABfBgDAAJEWBsAAkRqBlsABm+HAAZvmwAGcPAAAwABfBwAAAAEDwAGb9cABnDwAAAABAQHAAZwDAAAAgXtgwABFYQAAXAE+AT0cwAGcEC7AAF8AAgACgMABnCHASG+2J8AAXwYAwACRFQbAAJEbgZbAAZxBwAGcRsABnLQAAMAAXwgAAAABA8ABnE/AAZy0AAAAAQEBwAGcXQAAAIF7YMAARWEAAFwBPgI9HMABnGourvABAAGAwAGcbsBIcBcAwACQmT0cwAGcei6gvwEAAR/AAZyDwACVggMAAydIHMABnJMuoMIAAAAAwACQhB/AAZyewACWTAAAAAAAAMAAkIMGwACRHIGWwAGcucABnL7AAZ0vAADAAF8JAAAAAQPAAZzKwAGdLwAAAAEBAcABnNgAAACBe2DAAEVhAABcAT4CPRzAAZzlLq7wAQABgMABnOnASHCuAMAAkJk9HMABnPUuoL8BAAEfwAGc/sAAlYIDAAMnmeQcwAGdDi6gwgAAAADAAJCEH8ABnRnAAJZMAAAAAAAAwACQgwbAAJEdgZbAAZ00wAGdOcABovgAAK6HAAAAAQPAAZ1CwAGi+AAAAAUEBMABnVAAAACBe2DAAEVhAMABnWQAAAC6S2DAAEVhAMABnXoAAACCkGDAAGJPAMABnZgAAAClTmDAAEHFAAHAAZ23AAAAqUZgwAD6CgFqwAGdwWDAAPoKAFwBPgJJwAGdzxbAAZ3YgsABndPASHFisxfAAGJWPgNOwAGd/8ABng0AALlcYMAAYnYBJsABnf8BgsABng/ASHFiYMAAYnZOwAGeJ8ABni8AAJYgYLylARbAAZ4/hcABnjHASHG7liDAAGJ4ScABnk4cwAGeWobAAZ5SwEhx4kgBAAEWwAGebRbAAZ5dLrO/wACQO8AAkHexB7iAAMAA/Sk+Aj0cwAGehS7AAF7/AgACgMABnpDASHFEI4TAAZ6XwEhxgSednCedrgFgwAD9tgDAAJEUSsABnroAScABns8cwAGe24bAAZ7TwEhx4kgBAAEWwAGe7hbAAZ7eLrO/wACQO8AAkHexE7iMAMAA/Sk+AknAAZ8NhMABnxHASHGBPgE9HMABnycuwABfAgEAAYDAAZ87wEhxRADAAJEXPgE9HMABn14uwABfBAEAAYDAAZ9wwEhxRADAAJEYSsABn4oAScABn58cwAGfq4bAAZ+jwEhx4kgBAAEWwAGfvhbAAZ+uLrO/wACQO8AAkHexFbiOAMAA/Sk+AknAAZ/ghMABn+TASHGBPgE9HMABn/ouwABfBwEAAYDAAaAKwEhxRADAAJEaPgE9HMABoC0uwABfBQEAAYDAAaBCwEhxRADAAJEZSsABoFwAScABoHEcwAGgfYbAAaB1wEhx4kgBAAEWwAGgkBbAAaCALrO/wACQO8AAkHexFLiNAMAA/Sk+AknAAaCthMABoLHASHGBPgE9HMABoMcuwABfBQEAAYDAAaDcwEhxRADAAJEZPgE9HMABoP8uwABfBwEAAYDAAaEPwEhxRADAAJEaSsABoSkAScABoT4cwAGhSobAAaFCwEhx4kgBAAEWwAGhXRbAAaFNLrO/wACQO8AAkHexFriPAMAA/Sk+AknAAaGBhMABoYXASHGBPgE9HMABoZsuwABfBAEAAYDAAaGtwEhxRADAAJEYPgE9HMABodAuwABfAgEAAYDAAaHkwEhxRADAAJEXSsABof4APz9JwAGiGCEcwAGiKIHAAaIcwEhxU0gBAAErAMAA/Sk+AT0cwAGiOS7AAF8KBAADgcABok7ASHFTgsABolvASHFig8ABomHASHFxAalGhMABoojASHGBwACRHj4BPRzAAaKmLsAAXwoEAAOAwAGiu8BIcUSCwAGiwsBIcWKDwAGiyMBIcXEBqUaEwAGi5cBIcYHAAJEeBsAAkR6BlsABov3AAaMCwAGlqgAAwABfCgAAAAEDwAGjFsABpaoAAAAEAwPAAaMrAAAAgXtgwABFYQDAAaM7AAAAgpBgwABiTwDAAaNTAAAApU5gwABBxQABwAGjcgAAAKlGYMAA+goBasABo3xgwAD6CgBcAT4FPRzAAaOUFsABo4ouwABIj8AAkDvAAJBirxgBAAEewAGjqMAAZ+IBAAGBwAGjuMBIdWIAALZIPRzAAaPFLq7wAQABgMABo8nASHVTAMAAkJlOwAGj6MABo+4AAISOYMAAlgABJsABo+gBHMABpD8fwAGj/MAAlg4CAAIcwAGkDi6gwgAAAADAAJCEHMABpBwWwAGkFS63V8AAkDvAAJBfrz0BAAGBwAGkK8BIdWIAwABlCACvWAEAAYLAAaRVwEh1cQDAAJO6YMAAlgA9HMABpLQuoL8BAAEmwAGk0wEcwAGk0x/AAaS9wACVkQIAAieZ4YTAAaTMwEh18ACvWAEAAYLAAaTpwEh1cQDAAJO6YMAAlOMAwACQg0nAAaVBIYPAAaVGwEh1gT4BPRzAAaVYLqC/AQABJsABpXcBHMABpXcfwAGlYcAAlZECAAInmeEcwAGlcC6gwgAAAADAAJCEAK9YAQABgsABpY3ASHVxAMAAk7pgwACU4wDAAJCDPwbAAJEfgZbAAaWvwAGltMABp8AAAMAAXwsAAAABA8ABpcrAAafAAAAABAMDwAGl2AAAAIF7YMAARWEAwAGl7QAAAIKQYMAAYnYAwAGmCwAAAKVOYMAAQcUAAcABpioAAACpRmDAAPoKAWrAAaY0YMAA+goAXAE+BT0cwAGmTBbAAaZCLsAASI/AAJA7wACQYq8YAQABHsABpmDAAGfsAQABgcABpnzASHdYAAC2SD0cwAGmiS6u8AEAAYDAAaaNwEh3SQDAAJCZTsABpqjAAaa5AADAAF7eYMAAlOMBHMABpsQWwAGmuy7AAEOIwACQO8AAkFrAAEObAQABFsABptuBwAGm1sBId1iWIMAAYngAwABcvz0cwAGm6S6gvwEAASbAAacpARzAAacpHMABpvBqwAGm8WDAAJdRwAETiSACAAInwABfDDHAAacOYMAAlOMCHMABpw8uoMIAAAAAwACQhITAAacWwEh35gDAAJdTr1gBAAGCwAGnP8BId2cAwACTumDAAJTjAMAAkINJwAGnWIPAAadcwEh3dz4BPRzAAaduLqC/AQABJsABp40BHMABp40fwAGnd8AAlZECAAInmeEcwAGnhi6gwgAAAADAAJCEAK9YAQABgsABp6PASHdnAMAAk7pgwACU4wDAAJCDPwbAAJEggZbAAafFwAGnysABrIEAAMAAXw0AAAABA8ABp+zAAayBAAAABQQEwAGoAQAAAIF7YMAARWEAwAGoGwAAALpLYMAARWEAwAGoPAAAAIKQYMAAYnYAwAGoWgAAAKVOYMAAQcUAAcABqHkAAACpRmDAAPoKAWrAAaiDYMAA+goAXAE+DEAiIiEewAGomcAA9bECAAIWwAGoqILAAaijwEh5WZYgwABieBbAAajBFsABqLEus7/AAJA7wACQd5rSuD4AACEcwAGo6BbAAajYLrO/wACQO8AAkHew3gEAARbAAaj9gsABqPjASHlZliDAAGJ4ALkHACEcwAGpIhbAAakSLrO/wACQO8AAkHew3QEAARbAAak9gsABqTjASHlZliDAAGJ4ALkGwAGomMABqUUATsABqVPAAalcAAC7vGDAAP22ASOEwAGpXsBIeXgnnZwnna4BYMAA/bY9HMABqXwusn4DAAOAwAGphcBIeTuFwAGpjMBIekSDwAGplsBIeWgAwACRD07AAam8wAGpxwAAwABfDmDAAJTjARzAAanJLqDCAAAAAMAAkIQ9HMABqdQusn8DAAOAwAGp4MBIeTuFwAGp58BIekSDwAGp8cBIeWgAwACREU7AAaoXwAGqIgAAwABfD2DAAJTjARzAAaokLqDCAAAAAMAAkIQ9HMABqi8uwABe/AMAA4DAAao7wEh5O4XAAapCwEh6RIPAAapMwEh5aADAAJETTsABqnLAAap9AADAAF8QYMAAlOMBHMABqn8uoMIAAAAAwACQhD0cwAGqii6uhwUABIDAAaqUwEh5O4HAAaqbwEh5SoLAAaqowEh5WYPAAaquwEh5aAGpRoTAAarLwEh5eMAAkR1OwAGq4cABquoAAKowYMAA/bYBI4TAAarswEh5eCeXxCeXxQFgwAD9tk7AAasPwAGrGQAAwABfEWDAAP22ASOEwAGrG8BIeXgnl8Unl8QBYMAA/bY9HMABqzcuoL8BAAEmwAGsVAEcwAGsVB/AAatAwACVggMAAxTAAatXwEh7ogkAJsABq64BHMABq64fwAGrccAAlYIDAAMUwAGre8BIe6IJAIbAAauFwEh6mYfAAauRwEh66gCvWAEAAYPAAavEwEh5aADAAJO6YMAAlOMmwAGsIQEcwAGsIR/AAavowACVggMAAxTAAavywEh7ywoAFMABq/3ASHs9CAAcwAGsCS6gwgAAAADAAJCEAK9YAQABg8ABrDfASHloAMAAk7pgwACU4wCvWAEAAYPAAaxqwEh5aADAAJO6YMAAlOMAwACQgwbAAJEhgZbAAayGwAGsi8ABr8kAAMAAXxIAAAABA8ABrKXAAa/JAAAABQQEwAGsswAAAIF7YMAARWEAwAGsxwAAALpLYMAARWEAwAGs6AAAAIKQYMAAYnYAwAGtAAAAAKVOYMAAQcUAAcABrR8AAACpRmDAAPoKAWrAAa0pYMAA+goAXAE+CUAiIiEewAGtP8AA9bECAAIWwAGtToLAAa1JwEh9LpYgwABieBbAAa1nFsABrVcus7/AAJA7wACQd5rSuD4AACEcwAGtjhbAAa1+LrO/wACQO8AAkHew3gEAARbAAa2jgsABrZ7ASH0uliDAAGJ4ALkHACEcwAGtyBbAAa24LrO/wACQO8AAkHew3AEAARbAAa3ngsABreLASH0uliDAAGJ4ALkFwAGtPsABre8ATsABrf3AAa4GAAC7vGDAAP22ASOEwAGuCMBIfU0nnZwnna4BYMAA/bY9HMABriYusn8DAAOAwAGuMsBIfRCFwAGuOcBIfhmDwAGuQ8BIfT0AwACREU7AAa5pwAGudAAAwABfD2DAAJTjARzAAa52LqDCAAAAAMAAkIQ9HMABroEuwABe/AMAA4DAAa6NwEh9EIXAAa6UwEh+GYPAAa6ewEh9PQDAAJETTsABrsTAAa7PAADAAF8QYMAAlOMBHMABrtEuoMIAAAAAwACQhD0cwAGu3C6uhwUABIDAAa7mwEh9EIHAAa7twEh9H4LAAa76wEh9LoPAAa8AwEh9PQGpRoTAAa8dwEh9TcAAkR1OwAGvM8ABrzwAAKowYMAA/bYBI4TAAa8+wEh9TSeXxSeXxAFgwAD9tj0cwAGvWi6gvwEAAR/AAa9jwACVggMAAyOEwAGvbcBIfU0nl8Qnl8UBYMAA/baGwAGvhcBIfm4fwAGvncAAlYIDAAMUwAGvp8BIfyYIAIfAAa+xwEh+wRzAAa+9LqDCAAAAAMAAkIQAAADAAJCDBsAAkSKBlsABr87AAa/TwAGzOQAAwABfEwAAAAEDwAGv7cABszkAAAAFBATAAa/7AAAAgXtgwABFYQDAAbAPAAAAuktgwABFYQDAAbAwAAAAgpBgwABidgDAAbBIAAAApU5gwABBxQABwAGwZwAAAKlGYMAA+goBasABsHFgwAD6CgBcAT4JQCIiIR7AAbCHwAD1sQIAAhbAAbCWgsABsJHASIAGliDAAGJ4FsABsK8WwAGwny6zv8AAkDvAAJB3msu4NwAAIRzAAbDYFsABsMgus7/AAJA7wACQd7DdAQABFsABsPOCwAGw7sBIgAaWIMAAYngAuQYAIRzAAbEYFsABsQgus7/AAJA7wACQd7DcAQABFsABsTeCwAGxMsBIgAaWIMAAYngAuQXAAbCGwAGxPwBOwAGxTcABsVYAALu8YMAA/bYBI4TAAbFYwEiAJSednCedrgFgwAD9tj0cwAGxdi7AAF78AwADgMABsYLASH/ohcABsYnASIDxg8ABsZPASIAVAMAAkRNOwAGxucABscQAAMAAXxBgwACU4wEcwAGxxi6gwgAAAADAAJCEPRzAAbHRLsAAXv8CAAKAwAGx3MBIf+iFwAGx48BIgPEAwACRFE7AAbIAwAGyCgAAwABfFGDAAJTjARzAAbIMLqDCAAAAAMAAkIQ9HMABshcurocFAASAwAGyIcBIf+iBwAGyKMBIf/eCwAGyNcBIgAaDwAGyO8BIgBUBqUaEwAGyWMBIgCXAAJEdTsABsm7AAbJ3AACqMGDAAP22ASOEwAGyecBIgCUnl8Qnl8UBYMAA/bY9HMABspUuoL8BAAEmwAGzDAEcwAGzDB/AAbKewACVggMAAyOEwAGyqMBIgCUnl8Unl8QBYMAA/baGwAGywMBIgUgfwAGy3MAAlYIDAAMUwAGy5sBIgfcIAIfAAbLwwEiBkhzAAbL7LqDCAAAAAMAAkIQAAK9YAQABg8ABsyLASIAVAMAAk7pgwACU4wDAAJCDBsAAkSOBlsABsz7AAbNPwAGzlgAAuFABasABsz9gwAD9HAIAAAEDwAGzVsABs5YAAAABAQHAAbNbAAAAg+5gwABJQwAAXAE+AT0cwAGzZy7AAF7mAwADgMABs27ASILlJ52uFsABs4CAwAGze8BIguWlTsAARWQAwACRJQbAAJEkgZbAAbObwAGzrMABtCcAALhRAWrAAbOcYMAA/RwCAAABA8ABs8HAAbQnAAAAAQEBwAGz1AAAAIPuYMAASWAAAFwBPgE9HMABs+AuwABe5wMAAoDAAbP1wEiDYRbAAbQAgMABs/vASINhpU7AAEVkAalGKsAAkSYGwACRJYGWwAG0LMABtDHAAcLgAADAAF7mAAAAAQPAAbQ3wAHC4AAAAAMDA8ABtDwAAACD7mDAAElDAMABtEkAAAC7vGDAAP22AMABtGUAAAClTmDAAEHFAABcAT4GTsABtIfAAbSMAACCkGDAAGJPARbAAbSTgMABtI7ASIPUukbAAElIPRzAAbSxFsABtKcuwABIj8AAkDvAAJBirxgBAAEewAG0xcAAZ+IBAAGDwAG01cBIhAcAALZITsABtO7AAbT0AACBe2DAAEVhARbAAbT7gMABtPbASIPUgmvAAElOQCIcwAG1iIHAAbV/wEiD40gBAAEnna4AwAD9xQEcwAG1nYHAAbWUwEiD40gBAAEnnZwAwAD9xcABtX/AAbWlAE7AAbWxwAG1ugAAqUZgwAD6CgEcwAG1xYHAAbW8wEiD40gBAAEnnZwAwAD9xUnAAbXUIhbAAbXdgMABtdjASIPUuk/AAElSARbAAbX1gMABtfDASIPUulDAAElTPgI9HMABtg4urvABAAEWwAG2F4DAAbYSwEiD1LpNwABJUADAAJCZScABtimFwAG2LcBIhMs9HMABtjcuoL8BAAEfwAG2QMAAlZECAAInmeEcwAG2Ty6gwgAAAADAAJCEAADAAJCDPz4FQBbAAbZ3gMABtnLASIPUuk7AAElRwAG2csABtoEATsABtpfAAbajAAC6S2DAAEVhARbAAbaqgMABtqXASIPUukvAAElPTsABtsvAAbbZAAC5XGDAAGJ2ASbAAbbLAYPAAbbbwEiEB2DAAGJ2TsABtvPAAbb7AACWIGC8pQEWwAG3C4fAAbb9wEiF1ZYgwABieEnAAbcaHMABtyYUwAG3HsBIhfwIAEgBAAEWwAG3ORbAAbcpLrO/wACQO8AAkHeaxbg7AMAA/Sk+AUnAAbdOhcABt1LASITLPgE9HMABt2guwABfCQEAAYTAAbd1wEiEZADAAJEcPgE9HMABt5guwABfCAEAAYTAAbeiwEiEZADAAJEbScABt8EcwAG3zRTAAbfFwEiF/AgASAEAARbAAbfqFsABt9ous7/AAJA7wACQd5rEuDIAwAD9KT4BPRzAAbiZLqC/AQABHMABuJ4uwABemwIAAiGFwAG4rsBIhMuCwAG4uMBIg/IAwACQ8ADAAJCDScABuNocwAG45hTAAbjewEiF/AgASAEAARbAAbj5FsABuOkus7/AAJA7wACQd5rLuDcAwAD9KT4BPRzAAbkQLrJ/AwADhMABuRzASIRkgcABuSPASIPjgsABuS3ASIPyAMAAkRFJwAG5ThzAAblaFMABuVLASIX8CABIAQABFsABuW0WwAG5XS6zv8AAkDvAAJB3msq4NgDAAP0pPgE9HMABuYQuwABe+QMAA4TAAbmQwEiEZIHAAbmXwEiD44LAAbmhwEiD8gDAAJEQScABucIcwAG5zhTAAbnGwEiF/AgASAEAARbAAbnhFsABudEus7/AAJA7wACQd5rJuDQAwAD9KT4BPRzAAbn1LrJ+AwADhMABuf7ASIRkgcABugXASIPjgsABug/ASIPyAMAAkQ9JwAG6MBzAAbo8FMABujTASIX8CABIAQABFsABuk8WwAG6Py6zv8AAkDvAAJB3msa4MwDAAP0pPgE9HMABumQuwABe+gMAA4TAAbpuwEiEZIHAAbp1wEiD44LAAbp/wEiD8gDAAJESScABuqAcwAG6rBTAAbqkwEiF/AgASAEAARbAAbq/FsABuq8us7/AAJA7wACQd5rHuDUAwAD9KT4EPRzAAbubLrJ+AwADhMABu6TASIRkgcABu6vASIPjgsABu7XASIPyAMAAkQ9OwAG738ABu+cAAMAAXxVgwACU4wEcwAG76S6gwgAAAADAAJCEPRzAAbv4LsAAXvQDAAOEwAG8BMBIhGSBwAG8C8BIg+OCwAG8FcBIg/IAwACRDT0cwAG8MS6gvwEAASbAAbx5ARzAAbx5H8ABvDrAAJWCAwADI4XAAbxEwEiEyyeXxSeXxAFgwAD9thTAAbxcwEiJEAkAHMABvGUuoMIAAAAAwACQhACvWAEAAYLAAbyPwEiD8gDAAJO6YMAAlOMAwACQg0nAAbyxFsABvLqAwAG8tcBIg9S6R8AASUo+AkAcwAG85obAAbzawEiFrkgBAAErAMAA/SnAAbzawAG87QA9HMABvPguwABfCwQAA4TAAb0PwEiEZCbAAb0WAYPAAb0WwEiEB2DAAGJ2gsABvRzASIPyAalGhcABvUXASITLwACRH0nAAb1dHMABvXEWwAG9YS6zv8AAkDvAAJB3sNwBAAEUwAG9i8BIhfwIAAC5BT4BPRzAAb2fLsAAXw0FAASEwAG9z8BIhGSGwAG91sBIha4mwAG94wGDwAG948BIhAdgwABidoLAAb3pwEiD8gGpRoXAAb4SwEiEy8AAkSBJwAG+KhzAAb4+FsABvi4us7/AAJA7wACQd7DdAQABFMABvlTASIX8CAAAuQY+AT0cwAG+aC7AAF8SBQAEhMABvoPASIRkhsABvorASIWuJsABvpcBg8ABvpfASIQHYMAAYnaCwAG+ncBIg/IBqUaFwAG+xsBIhMvAAJEhScABvt4iHMABvuoUwAG+4sBIhfwIAEgBAAEWwAG+/RbAAb7tLrO/wACQO8AAkHea0rg+AMAA/SkBHMABvyQWwAG/FC6zv8AAkDvAAJB3sN4BAAEUwAG/NMBIhfwIAAC5Bz4BPRzAAb9ILsAAXxMFAASEwAG/Y8BIhGSGwAG/asBIha4mwAG/dwGDwAG/d8BIhAdgwABidoLAAb99wEiD8gGpRoXAAb+mwEiEy8AAkSJJwAG/vhbAAb/Hg8ABv8LASIQHuVfAAGJYPgE9HMABv+EurocFAASEwAG/68BIhGSGwAG/8sBIha6DwAG//8BIhAeCwAHABcBIg/IBqUaFwAHALsBIhMvAAJEdScABwEYiIhbAAcBzHMABwFGEwAHAS8BIhGSzWwEAARbAAcBdLsAAUzTAAJA7wACQegDAAEWxsmC9ugAWwAHAwxzAAcCchMABwJbASIRktQYBAAEWwAHArS7AAFM0wACQO8AAkHoAwABFtLTVvbsBFsABwQYcwAHA6YTAAcDjwEiEZKxpAQABFsABwPAuwABTNMAAkDvAAJB6AMAARa+yYL26PgQ9HMABwSMuwABe/AMAA4TAAcEvwEiEZIHAAcE2wEiD4xbAAcFFgMABwUDASIPUpU7AAEVkAMAAkRNOwAHBb8ABwXoAAMAAXxBgwACU4wEcwAHBfC6gwgAAAADAAJCEPRzAAcGLLq6HBQAEhMABwZXASIRkhsABwZzASIWug8ABwanASIQHgsABwa/ASIPyAalGhcABwdjASITLwACRHT0cwAHB6y6gvwEAASbAAcI2ARzAAcI2H8ABwfTAAJWCAwADI4XAAcH+wEiEyyeXxSeXxAFgwAD9thTAAcIWwEiNNgkAHMABwiIuoMIAAAAAwACQhACvWAEAAYLAAcJMwEiD8gDAAJO6YMAAlOMAwACQgz4BPRzAAcJ4Lq6HBQAEhMABwoLASIRkhsABwonASIWug8ABwpbASIQHgsABwpzASIPyAalGhcABwsXASITLwACRHQbAAJEmgZbAAcLlwAHC6sABw94AAMAAXucAAAABA8ABwv7AAcPeAAAAAwICwAHDGAAAAIPuYMAASWAAwAHDMAAAAKVOYMAAQcUAAcABw08AAACpRmDAAPoKAWrAAcNZYMAA+goAXAE+AT0cwAHDZy7AAF8KBAADFsABw4qAwAHDhcBIjnq6S8AASWQWwAHDnIDAAcOXwEiOerpGwABJYoHAAcOswEiOiQGpRoLAAcPRwEiOmcAAkR4GwACRJ4GWwAHD48ABw/TAAchJAAC4bQFqwAHD5GDAAP0cAgAAAQPAAcQHwAHISQAAAAEBAcABxBgAAACD7mDAAEl1AABcAT4PQCIWwAHEMIDAAcQrwEiPO7pdwABJgQEWwAHERIDAAcQ/wEiPO7pewABJgsABxCvAAcRPAE7AAcRfwAHEZAAAgpBgwABiTwEWwAHEa4DAAcRmwEiPO7pGwABJeUAhFsABxIyBwAHEh8BIj4S6WcAAYlfAAcSGwAHElQBAIRbAAcSpgcABxKTASI+Eh3jAAGJUwAHEo8ABxLIAQCEWwAHExoHAAcTBwEiPhLlYwABiVcABxMDAAcTMAEnAAcTTFsABxNyBwAHE18BIj4S5V8AAYlg+AT0cwAHFZBbAAcVPLsAASI/AAJA7wACQYq8YAQABHsABxXjAAGfiAQABFsABxZgWwAHFiC6zv8AAkDvAAJB3hTW4WQAAtkg/PRzAAcW8FsABxbIuwABIj8AAkDvAAJBirxgBAAEewAHF0MAAZ+IBAAGBwAHF4MBIj4QAALZITsABxf/AAcYGAACVVmDAAHXLARzAAcYcFsABxgguwABeSMAAkDvAAJBbwABQzgMAAoHAAcY6wEiPhBbAAcZNFsABxkAutWXAAJA7wACQYbL7wABNFwHAAFDPFsABxnSAwAHGb8BIjzu6XsAASYLAAHX9TsABxpHAAcabAACvFWDAAGeQARzAAcakgsABxp3ASJCgwABQogEAARbAAca+FsABxrEutWXAAJA7wACQYbL7wABNFwDAAHXPPRzAAcbdFsABxtMuwABIj8AAkDvAAJBirxQBAAGDwAHG78BIkRIAtkZOwAHHE8ABxx0AAFtdwAD8dAFgwACU4wExwAHHLmDAAJTjAD0cwAHHNi6u8AEAARbAAcc/gMABxzrASI87uOvAAEmAAMAAkJk9HMABx1yEwAHHUsBIkYNWAQABHMABx2AuoMIAAAAAwACQhADAAPyFPRzAAcdzgsABx2zASJCgwABQowQABC4WwAHHlS63V8AAkDvAAJBfgMABx53ASI87hMABx6PASJGDAMAAddA9HMABx7MuoL8BAAEmwAHIFwEcwAHIFx/AAcfFwACVaQIAAhzAAcfWFsABx80uwABDiMAAkDvAAJBawABDlwEAASbAAcf1ARbAAcf1g8ABx+vASJESliDAAGeTYLzMAMAAXLuEwAHH/8BIkYMAr1gBAAEWwAHIMoDAAcgtwEiPO6VOwABFZADAAJO6YMAAlOMAwACQgwbAAJEogZbAAchOwAHIX8ABzEgAALhuAWrAAchPYMAA/RwCAAABA8AByHLAAcxIAAAAAQEBwAHIgwAAAIPuYMAASZEAAFwBPghOwAHIncAByKIAAJb5YMAAlOMBHMAByKQuwABfFsAAkDsBAAGAwAHIyMBIkvoAwACQik7AAcjcwAHI6QAAwABeemDAAJPRARbAAcjrLsAAXk7AAJBpTsAByQ7AAckTAACCaWDAAJPMAR/AAckZwACT3QAAAAA9F8AByS8uwABeTibAAckvAYPAAclCwEiTZGDAAJPRwACQaUnAAclMFsAByVWAwAHJUMBIkvq6acAASaY+AT0cwAHJci7AAF7pAwACFsAByaUWwAHJlS6zv8AAkDvAAJB3sT24tBbAAcnJgMABycTASJL6uOvAAEYUAaVOFsAByfmAwAHJ9MBIkvqlTsAARWTAAJEAScAByhgWwAHKIYDAAcocwEiS+rpowABJpz4EPRzAAco+Lq7wAQABFsABykeAwAHKQsBIkvq468AARhQAwACQmU7AAcpkwAHKbwAAq3tgwACU7QEcwAHKghbAAcp7LrdXwACQO8AAkF+vRQEAARbAAcqWgMABypHASJL6umfAAEmXAMAAZQJOwAHKxsAByssAACBgwACU4wEmwAHKxgEcwAHK/x7AAcrNwACSiwMAAxzAAcroLqDCAAAAAMAAkISEwAHK78BIlFgxwAHK+2DAAJTjAACvWAEAARbAAcsagMAByxXASJL6pU7AAEVkAMAAk7pgwACU4z0cwAHLNC7AAF5gAQABJsABy2EBHMABy2EfwAHLUcAAlGABAAGFwAHLW8BIlJ4Ar1gBAAEWwAHLfIDAAct3wEiS+qVOwABFZADAAJO6YMAAk8wAwACQgD89F8ABy5suwABeToLAAcuuwEiTQcAAkGk9i8ABy8DASJNkHMABy8cuwABeewEAASbAAcvXAYPAAcvXwEiTZGDAAJPRAMAAkJI9HMABy+IuwABeYAEAASbAAcwWARzAAcwWH8ABy/TAAJQEAgACgcABzAHASJMPg8ABzAfASJNkAK9YAQABFsABzDGAwAHMLMBIkvqlTsAARWQAwACTumDAAJPMAMAAkIAGwACQioGWwAHMTcABzFvAAc/oAADAAF8WwACQOwAAAAEDwAHMfsABz+gAAAABAQHAAcyPAAAAg+5gwABJkQAAYMAAlOMBPgdOwAHMpMABzKkAAIKQYMAAYk8BFsABzLCAwAHMq8BIlj66RsAASZVOwAHM0cABzNcAAIF7YMAARWEBFsABzN6AwAHM2cBIlj6468AARhROwAHM/sABzQoAAKzeYL3LARbAAc0RgMABzQzASJY+rN7AAEmYQBbAAc2bHMABzYAWwAHNay7AAFM0wACQO8AAkHqxPAEAAYPAAc2OwEiWpQC+Q7TWvbzAAc1rwAHNrQBJwAHOihzAAc6TgcABzo7ASJZXSAEAARbAAc6mFsABzpYus7/AAJA7wACQd5rIuFQAwAD9KT4CPRzAAc7OLrJ+AwADgsABztfASJZ+J52cFsABzuuCwAHO5cBIln6lTsAARWQAwACRD0rAAc8FARzAAc8MLqDCAAAAAMAAkIQ/ScABzx0cwAHPJoHAAc8hwEiWV0gBAAEWwAHPORbAAc8pLrO/wACQO8AAkHeFn7hTAMAA/Sk+Aj0cwAHPYy7AAF76AwADgsABz23ASJZ+J52cFsABz4GCwAHPe8BIln6lTsAARWQAwACREkrAAc+bARzAAc+iLqDCAAAAAMAAkIQ/PTDAAc+zHsABz7m1pwIAAoLAAc/CwEiWfiTAAc/jAyfAAF8XgcABz93ASJZXJ4FqAAbAAJEpgZbAAc/twAHP/sAB0hYAALhvAWrAAc/uYMAA/RwCAAABA8AB0BHAAdIWAAAAAQEBwAHQIgAAAIPuYMAASaoAAFwBPgc9HMAB0DgWwAHQLi7AAEiPwACQO8AAkGKvGAEAAR7AAdBMwABn4gEAARbAAdBsFsAB0Fwus7/AAJA7wACQd4WfuFMAALZITsAB0I7AAdCVAACVVmDAAHXLAWrAAdCdYMAAdcvAAURuTsAB0NXAAdDfAACvFWDAAGeQARzAAdDogcAB0OHASJjFwABQogEAARbAAdD1LrO/wACQO8AAkHcAwAB1zz0cwAHRFRbAAdELLsAASI/AAJA7wACQYq8UAQABgsAB0SfASJjmALZGPRzAAdE3Lq7wAQABFsAB0UCAwAHRO8BImGq468AARhQAwACQmU7AAdFnwAHRcQAAW13AAPx0AWDAAJTjATHAAdFzYMAAlOMBHMAB0XQuoMIAAAAAwACQhD0cwAHRgC6gvwEAASbAAdHkARzAAdHkH8AB0ZLAAJVpAgACHMAB0aMWwAHRmi7AAEOIwACQO8AAkFrAAEOXAQABJsAB0cIBFsAB0cKCwAHRuMBImOaWIMAAZ5NgvMwAwABcu4PAAdHMwEiZcQCvWAEAARbAAdH/gMAB0frASJhqpU7AAEVkAMAAk7pgwACU4wDAAJCDBsAAkSqBlsAB0hvAAdIswAHSqAAAuHABasAB0hxgwAD9HAIAAAEDwAHSOsAB0qgAAAABAQHAAdJGAAAAg+5gwABJtgAAXAE+AUAqwAHSnsAB0qMABsAAkSuBlsAB0q3AAdK+wAHTZwAAuHIBasAB0q5gwAD9HAIAAAEDwAHS0sAB02cAAAABAQHAAdLkAAAAg+5gwABKlwAAXAE+Az0cwAHS8C6u8AEAARzAAdL/FsAB0vmAwAHS9MBImsGCUcAARWdLAQABkwDAAPyDAMAAkJlOwAHTF8AB0yAAAIV5YMAAlOMBHMAB0yIuoMIAAAAAwACQhD0cwAHTLS6gvwEAARzAAdM0asAB0zVgwACXUcABE4kgAgACJ8AAXxgxwAHTQGDAAJTjAoHAAdNBwEibChbAAdNSFsAB00sut1fAAJA7wACQX68wwABk8QDAAJdTAMAAkIMGwACRLIGWwAHTbMAB033AAdtMAAC4cwFqwAHTbWDAAP0cAgAAAQPAAdOWwAHbTAAAAAEBAcAB060AAACD7mDAAEqgAABcAT4ITsAB08zAAdPUAACWIGC8sQEWwAHT5BbAAdPbgMAB09bASJvCgmzAAEqiliDAAGKkTsAB0/XAAdP7AAAnYMAA+9ABFsAB1AWBwAHT/cBIm9cnvLROwAHUHwAAALpLYMAAlOMAScAB1DAWwAHUOYDAAdQ0wEibwrmTwABKoz4CPRzAAdRQLq7wAQABFsAB1FmAwAHUVMBIm8K6S8AASqUAwACQmT2LwAHUbcBInCocwAHUey6gwgAAAADAAJCEP07AAdSZwAHUoAAAg8BgwABFYQEWwAHUp4DAAdSiwEibwoPAwABKpj0cwAHUsy6u8AEAAYTAAdS3wEiclQDAAJCZTsAB1NLAAdTbAACFeWDAAJTjARzAAdTdLqDCAAAAAMAAkIRJwAHU6RzAAdTtLsAAXxkCAAKBwAHVEcBIm9cWwAHVIYTAAdUawEiclbkrwABFoQDAAJEuPgJOwAHVScAB1VIAAMAAQCBgwACU4wEewAHVXsAAkoQBAAEcwAHVchbAAdVrLrdXwACQO8AAkF+vMgEAARbAAdWKgcAB1YLASJvXtFi8swDAAGUFAEnAAdWjFsAB1ayAwAHVp8BIm8K5k8AASqM+BE7AAdXUwAHV4gAAwABFVWC8zAEWwAHWABbAAdXwLrO/wACQO8AAkHexUbjIPRzAAdY1FsAB1isuwABIj8AAkDvAAJBirxQBAAEewAHWWMAAZ6MCAAKHwAHWb8BInZ1qwAHWjGDAAGiXwAExHAAAtkZOwAHWr8AB1rYAAJVWYMAAlOMBHMAB1sEWwAHWuC7AAEOIwACQO8AAkFrAAEOXAQABh8AB1tbASJ2dAMAAXLs9HMAB1u4uoL8BAAEmwAHXhwEcwAHXhxzAAdb1asAB1vZgwACXUcABE4kgAgACJ8AAXxoxwAHXC2DAAJTjBRTAAdcXwEieDQgAg8AB1ynASJwqhcAB10DASJzWhsAB11TASJ0vHMAB125qwAHXa2DAAJdRwAETicAAUU0BAAGCwAHXdcBInAcAwACXZwDAAJdTr1gBAAEWwAHXooDAAdedwEibwqVOwABFZADAAJO6YMAAlOMAwACQgz4ETsAB193AAdfrAADAAEVVYLzMARbAAdf9FsAB1+0us7/AAJA7wACQd7FQuMc9HMAB2CcWwAHYHS7AAEiPwACQO8AAkGKvFAEAAR7AAdg9wABnowIAAofAAdhhwEifB2rAAdh+YMAAaJfAATELAAC2Rk7AAdiiwAHYqQAAlVZgwACU4wEcwAHYtBbAAdirLsAAQ4jAAJA7wACQWsAAQ5cBAAGHwAHYycBInwcAwABcuz0cwAHY4S6gvwEAASbAAdlgARzAAdlgHMAB2OhqwAHY6WDAAJdRwAETiSACAAInwABfGzHAAdj7YMAAlOMEFMAB2QfASJ93CACFwAHZGcBInNaGwAHZLcBInS8cwAHZR2rAAdlEYMAAl1HAAROJwABRTQEAAYLAAdlOwEicBwDAAJdnAMAAl1OvWAEAARbAAdl7gMAB2XbASJvCpU7AAEVkAMAAk7pgwACU4wDAAJCDPgROwAHZusAB2cgAAMAARVVgvMwBFsAB2doWwAHZyi6zv8AAkDvAAJB3sU24xD0cwAHaAhbAAdn4LsAASI/AAJA7wACQYq8UAQABHsAB2iPAAGejAgAChsAB2jrASKBoasAB2ldgwABol8AA7zYAALZGTsAB2nfAAdp+AACVVmDAAJTjARzAAdqJFsAB2oAuwABDiMAAkDvAAJBawABDlwEAAYbAAdqewEigaADAAFy7PRzAAdq0LqC/AQABJsAB2xQBHMAB2xQcwAHau2rAAdq8YMAAl1HAAROJIAIAAifAAF4wMcAB2stgwACU4wOHwAHa1cBIoNiFwAHa5cBInNYcwAHa/WrAAdr6YMAAl1HAAROJwABRTQEAAYLAAdsEwEicBwDAAJdnAMAAl1OvWAEAARbAAdsvgMAB2yrASJvCpU7AAEVkAMAAk7pgwACU4wDAAJCDBsAAkS2BlsAB21HAAdtiwAHgTQAAuHQBasAB21JgwAD9HAIAAAEDwAHbecAB4E0AAAABAQHAAduOAAAAg+5gwABKvQAAXAE+BU7AAdujwAHbqAAAgpBgwABiTwEWwAHbr4DAAduqwEih8LqvwABKwEnAAdu9FsAB28aAwAHbwcBIofC6sMAASsE+AT0cwAHb8xbAAdvpLsAASI/AAJA7wACQYq8YAQABHsAB3AfAAGftAQABgcAB3BzASKIFAAC2SD9OwAHcQ8AB3E0AAFtdwAD8dAFgwACU4wExwAHcXmDAAJTjAEbAAdxmwAHcjsAB3HgAAACBe2DAAEVhABbAAdyGgMAB3IHASKHwglHAAEVnPgI9HMAB3JYurvABAAGDwAHcmsBIoqkAwACQmT0cwAHcsoLAAdyowEiiflYBAAEcwAHcti6gwgAAAADAAJCEAMAA/IVHwAHcyRbAAdzWgMAB3NHASKHwgmfAAEq/AgHAAd0AasAB3QBgwABKscAA7ekAPgVOwAHdFsAB3RwAACdgwAD70AGTTsAB3TfAAd0+AACBdmDAAJTjARzAAd1MFsAB3UAuwABTHsAAkDvAAJBdwABFUwMAAxbAAd1vLsAAQ4jAAJA7wACQWoHAAd15wEiiBTTAAd1/A8AB3X/AAd2wAAAAAQEBwAHdkQAAAIJsYMAAYqIAAGDAAJTjAUrAAd2eARzAAd2ngsAB3Z7ASKJ+SwEAATUAAAABAGDAAPvQAYPAAd2owEijQTUAAAABAGDAAPvQAYvAAd2owEijQRzAAd2thQDASKPiZAEAAZQAwAD89YUAwEij4gDAAPyDAMAAdk9AHMAB3dWDwAHdz8BIo0FIAQABFsAB3eQWwAHd3YDAAd3YwEih8IJRwABFZ2HAAPyjAMAA/PPAAd3PwAHd6gEkAAcnwABfHIHAAd4awEiiBSeDVYPAAd4xwEijQSej7BbAAd5BgMAB3jzASKHwglHAAEVnJ4FqPRzAAd5VLqC/AQABhMAB3lrASKNUAMAAkINKwAHeawABwAHelmrAAd6WYMAASrHAAO4AAD4DQBzAAd8vFsAB3ygWwAHfGibAAd8IAIHAAd8DwEiiBWDAAGJ2hRfAAGJ5YcAA/KNIAQABFsAB3zyCwAHfMsBIon5hwAD8owDAAPzzwAHfAsAB30IAPRzAAd+iFsAB300uwABIj8AAkDvAAJBirxEBAAEWwAHfzBbAAd+8LrO/wACQO8AAkHea0rg+ALZFPRzAAd/gLqC/AQABJsAB4BUBHMAB4BUfwAHf6cAAlnwBAAGCwAHf/cBIon4Ar1gBAAEWwAHgMIDAAeArwEih8KVOwABFZADAAJO6YMAAlOMAwACQgwbAAJEugZbAAeBSwAHgV8AB464AAMAAXxkAAAABA8AB4HrAAeOuAAAAAgICwAHglQAAAJYgYLyxAMAB4KwAAADAAF8dYL3LAABgwAD6CgE+BU7AAeDMwAHg0AAAmcJgvKUBJsAB4MwBFsAB4NqAwAHg0sBIpeq0WLyzYLylTsAB4e3AAeH7AADAAFkCYLylARzAAeIaFsAB4gUuwABTNMAAkDvAAJB6tQMBAAGBwAHiKMBIpfcAvgNJwAHiOyEcwAHiTYPAAeI/wEimPEgBAAErAMAA/Sk+AUnAAeJeHMAB4nQWwAHiYi7AAFGFwACQO8AAkFzAAFD9AgACg8AB4orASKY8gsAB4pnASKYQAMAAd18+AUrAAeKpASo/P0nAAeLKHMAB4tsWwAHizi61ZcAAkDvAAJBhmw4BAAGCwAHi6cBIphAAwABNKUrAAeLvASk/SsAB4wEBHMAB4yQWwAHjFRbAAeMILrVlwACQO8AAkGGqW8AATR3AAE5hAgACgsAB4zjASKYQNMAB40UDwAHjRcAB46kAAAABAQHAAeNSAAAAmw1gvKUAAGDAAPoKAT4BSsAB42QBIRzAAeN+FsAB42wuwABRhcAAkDvAAJBcwABQ/QIAAoTAAeOUwEinWoLAAeOewEimEADAAHdfAMAAcPQGwACRL4GWwAHjs8AB48TAAePzAAC4YgFqwAHjtGDAAP0cAgAAAQPAAePMwAHj8wAAAAEBAcAB49IAAACD7mDAAEYGAABcAT4BPRzAAePeLpqHAQABFsAB4+mAwAHj5MBIp+aAlsAARggAwACQmgbAAJEwgZbAAeP4wAHkBMAB5bkAALh1AWrAAeP5YMAA/RwCAAABA8AB5A/AAeW5AAAAAQEBwAHkGAAAAIPuYMAASs0AAFsBPgg9HMAB5C4WwAHkJC7AAEiPwACQO8AAkGKvGAEAAR7AAeRCwABn4gEAARbAAeRXgMAB5FLASKhUuq/AAErPAAC2SD0cwAHkaC6u8AEAARbAAeRxgMAB5GzASKhUurXAAErRAMAAkJlOwAHkj8AB5JUAAIMZYMAAlOMBHMAB5JcuoMIAAAAAwACQhD0cwAHkoi6u8AEAARbAAeSrgMAB5KbASKhUuOvAAErSAMAAkJlOwAHkzMAB5NMAAJqDYMAAlOMBHMAB5NUuoMIAAAAAwACQhE7AAeTtwAHk8wAAhI5gvMkBFsAB5QUWwAHk9S6zv8AAkDvAAJB3sW644k7AAeUdwAHlIgAAgL1gwACU7QEcwAHlKxbAAeUkLrdXwACQO8AAkF+vQwEAAYPAAeVFwEipOgDAAGT/PRzAAeVSLqC/AQABJsAB5X4BHMAB5X4cwAHlWWrAAeVaYMAAl1HAAROJIAIAAifAAF7bMcAB5WdgwACU4wOBwAHlaMBIqM+EwAHlb8BIqWSCwAHldcBIqRcAwACXU69YAQABFsAB5aKAwAHlncBIqFSlTsAARWQAwACTumDAAJTjAMAAkIMGwACRMYGWwAHlvsAB5crAAefNAAC4dgFqwAHlv2DAAP0cAgAAAQPAAeXWwAHnzQAAAAEBAcAB5eAAAACD7mDAAErbAABbAT4IPRzAAeXsLq7wAQABFsAB5fWAwAHl8MBIqlm6tcAASuEAwACQmU7AAeYTwAHmGQAAgxlgwACU4wEcwAHmGy6gwgAAAADAAJCEPRzAAeYmLq7wAQABFsAB5i+AwAHmKsBIqlm468AASuIAwACQmU7AAeZQwAHmVwAAmoNgwACU4wEcwAHmWS6gwgAAAADAAJCEPRzAAeZvFsAB5mUuwABIj8AAkDvAAJBirxgBAAEewAHmh8AAZ+IBAAEWwAHmlIDAAeaPwEiqWbq4wABK3gAAtkhOwAHmvsAB5sQAAISOYLzJASMWwAHmy4DAAebGwEiqWYXXwABK3xbAAebxFsAB5uEus7/AAJA7wACQd7FtuOEWwAHnGRbAAecJLrO/wACQO8AAkHexbLjgAWC8yU7AAecxwAHnNgAAgL1gwACU7QEcwAHnPxbAAec4LrdXwACQO8AAkF+vQwEAAYPAAedZwEirPwDAAGT/PRzAAedmLqC/AQABJsAB55IBHMAB55IcwAHnbWrAAeduYMAAl1HAAROJIAIAAifAAF7bMcAB53tgwACU4wOBwAHnfMBIqpOEwAHng8BIq5uCwAHnicBIqtsAwACXU69YAQABFsAB57aAwAHnscBIqlmlTsAARWQAwACTumDAAJTjAMAAkIMGwACRMoGWwAHn0sAB597AAeleAAC4dwFqwAHn02DAAP0cAgAAAQPAAefwwAHpXgAAAAEBAcAB6AAAAACD7mDAAErtAABbAT4FPRzAAegMLq7wAQABFsAB6BWAwAHoEMBIrJC468AASvQAwACQmU7AAeg1wAHoPAAAlkFgvLcBFsAB6EOAwAHoPsBIrJCWQcAASvI9HMAB6FkWwAHoTy7AAEiPwACQO8AAkGKvFAEAAR7AAeh+wABnowIAAibAAeiLAYHAAeiLwEisymC8zGrAAeihYMAAaJfAAORDAAC2Rk7AAei+wAHoywAAwABfHmDAAJTjARzAAejWFsAB6M0uwABDiMAAkDvAAJBawABDlwEAASbAAejrAYHAAejrwEisymC8zADAAFy7PRzAAej4LqC/AQABJsAB6SMBHMAB6SMcwAHo/2rAAekAYMAAl1HAAROJIAIAAifAAEVYMcAB6QxgwACU4wKCwAHpDcBIrTwcwAHpGy6gwgAAAADAAJCEAMAAl1OvWAEAARbAAelHgMAB6ULASKyQpU7AAEVkAMAAk7pgwACU4wDAAJCDBsAAkTOBlsAB6WPAAelvwAHp5AAAuHgBasAB6WRgwAD9HAIAAAEDwAHpgMAB6eQAAAABAQHAAemPAAAAg+5gwABK/wAAWwE+AT0wwAHpmx/AAemhwAD7aQEAASTAAenfAifAAF8fgMAB6drASK4+AAbAAJE0gZbAAenpwAHp9cAB6+sAALh5AWrAAenqYMAA/RwCAAABA8AB6gLAAevrAAAAAQEBwAHqDQAAAIPuYMAASw0AAFsBPgVOwAHqKMAB6jYAAMAARVVgvMwBFsAB6kgWwAHqOC6zv8AAkDvAAJB3sWi43D0cwAHqYBbAAepWLsAASI/AAJA7wACQYq8UAQABHsAB6n/AAGejAgACgcAB6pbASK7DasAB6rNgwABol8AA5EMAALZGTsAB6tDAAerXAADAAEVWYMAAlOMBHMAB6usWwAHq2S7AAFu3wACQO8AAkF7AAEVXAgACFsAB6wcuwABDiMAAkDvAAJBaH8AB6xHAAIWMAQABFsAB6yuAwAHrJsBIrq66RsAASw8AAMAAd2lOwAHrT8AB61YAAJVWYMAAlOMBHMAB62EWwAHrWC7AAEOIwACQO8AAkFrAAEOXAQABgcAB63bASK7DAMAAXLs9HMAB64ouoL8BAAEmwAHrsAEcwAHrsBzAAeuRasAB65JgwACXUcABE4kgAgACJ8AARVgxwAHrnmDAAJTjAoPAAeufwEivnoLAAeunwEivMwDAAJdTr1gBAAEWwAHr1IDAAevPwEiurqVOwABFZADAAJO6YMAAlOMAwACQgwbAAJE1gZbAAevwwAHr/MAB7lwAALh6AWrAAevxYMAA/RwCAAABA8AB7BTAAe5cAAAAAQEBwAHsKgAAAIPuYMAASxgAAFsBPgY9HMAB7DYurvABAAEWwAHsRhbAAew/gMAB7DrASLCOglHAAEVngMPAAPxaAMAAkJlOwAHsYcAB7GoAAIV5YMAAlOMBHMAB7GwuoMIAAAAAwACQhE7AAe0SwAHtIAAAwABFVWC8zAEWwAHtMhbAAe0iLrO/wACQO8AAkHexabjdPRzAAe1OFsAB7UQuwABIj8AAkDvAAJBirxQBAAEewAHtbcAAZ6MCAAKCwAHthMBIsPZqwAHtoWDAAGiXwADkQwAAtkZOwAHtvsAB7cUAAJVWYMAAlOMBHMAB7dAWwAHtxy7AAEOIwACQO8AAkFrAAEOXAQABgsAB7eXASLD2AMAAXLs9HMAB7fkuoL8BAAEmwAHuIQEcwAHuIRzAAe4AasAB7gFgwACXUcABE4kgAgACJ8AARVgxwAHuDWDAAJTjAoPAAe4OwEixZoHAAe4WwEiw0wDAAJdTr1gBAAEWwAHuRYDAAe5AwEiwjqVOwABFZADAAJO6YMAAlOMAwACQgwbAAJE2gZbAAe5hwAHubcAB8QkAALh7AWrAAe5iYMAA/RwCAAABA8AB7nrAAfEJAAAAAQEBwAHuhQAAAIPuYMAASyEAAFsBPgg9HMAB7rQurvABAAEcwAHuwxbAAe69gMAB7rjASLJWglHAAEVnSwEAAZMAwAD8gwDAAJCZTsAB7tvAAe7nAACAiWDAAJTjARzAAe7pLqDCAAAAAMAAkIROwAHvAsAB7wkAAMAARVZgwACU4wEcwAHvHRbAAe8LLsAAW7fAAJA7wACQXsAAUYADAAMWwAHvMy7AAEOIwACQO8AAkFoWwAHvQoDAAe89wEiyVrrFwABLIxbAAe9VgMAB71DASLJWukbAAEskAMAAd2hOwAHveMAB738AAJZBYLy3ARbAAe+RFsAB74Eus7/AAJA7wACQd7FvuONOwAHvrcAB77YAAKTeYMAAS0gBHsAB78HAAEtxAQABg8AB783ASLM0AE7AAe/iwAHv8AAAwABezGDAAJTtARzAAe/5FsAB7/Iut1fAAJA7wACQX69FAQABhMAB8AjASLNeAMAAZQI9HMAB8BcuoL8BAAEmwAHwagEcwAHwahzAAfAeasAB8B9gwACXUcABE4kgAgACJ8AAXtsxwAHwLGDAAJTjA4HAAfA0wEiyn4XAAfBHwEizh4LAAfBcwEiywgDAAJdTr1gBAAEWwAHwhYDAAfCAwEiyVqVOwABFZADAAJO6YMAAlOMAwACQgz0cwAHwqRbAAfCfLsAASI/AAJA7wACQYq8UAQABHsAB8MjAAGewAwADJsAB8N8Bg8AB8N/ASLM0YLzMFsAB8PCEwAHw58BIs160acAAS00rAAC2RgbAAJE3gZbAAfEOwAHxGsAB86UAALh8AWrAAfEPYMAA/RwCAAABA8AB8SfAAfOlAAAAAQEBwAHxMgAAAIPuYMAASy0AAFsBPgpAHMAB8XgWwAHxcRbAAfFqgMAB8WXASLTSglHAAEVnYcAA/KNIAQABlQDAAPzzwAHxZcAB8XwAPRzAAfGDLq7wAQABHMAB8ZIWwAHxjIDAAfGHwEi00oJRwABFZ0sBAAGTAMAA/IMAwACQmU7AAfGqwAHxtgAAgIlgwACU4wEcwAHxuC6gwgAAAADAAJCEPRzAAfHDLq7wAQABHMAB8dIWwAHxzIDAAfHHwEi00oJRwABFZ0sBAAGUAMAA/IMAwACQmU7AAfHqwAHx9QAAwABfIGDAAJTjARzAAfH3LqDCAAAAAMAAkIROwAHyEMAB8hcAAJZBYLy3ARbAAfIpFsAB8hkus7/AAJA7wACQd7FwuOROwAHyRcAB8k4AAKTeYMAAS0gBHsAB8lnAAEtxAQABg8AB8mXASLXOAE7AAfJ6wAHyiAAAwABezGDAAJTtARzAAfKRFsAB8oout1fAAJA7wACQX69FAQABhMAB8qDASLX4AMAAZQI9HMAB8q8uoL8BAAEmwAHzBgEcwAHzBhzAAfK2asAB8rdgwACXUcABE4kgAgACJ8AAXtsxwAHyxGDAAJTjA4HAAfLMwEi1UoXAAfLfwEi2IYLAAfL0wEi1qQDAAJdTr1gBAAEWwAHzIYDAAfMcwEi00qVOwABFZADAAJO6YMAAlOMAwACQgz0cwAHzRRbAAfM7LsAASI/AAJA7wACQYq8UAQABHsAB82TAAGewAwADJsAB83sBg8AB83vASLXOYLzMFsAB84yEwAHzg8BItfi0acAAS00rAAC2RgAAR19QAEdfhwBHX8sAR2ATAEdgWwBHYKEAR2D9AEdiLQBHaFIAR2kaAEdpkgBHafEAR2pyAEdqxABHawoAR27fAEdy8QBHcz4AR3QeAEd1OABHeIEAR3j9AEd59ABHer8AR3uhAEd8/ABHf3IAR4FdAEeB9wBHheQAR4inAEeLlABHjVMAR42rAEeOUABHj2kAR4/zAEeQfQBHkQcAR5IYAEeSagBHmjgAR5qMAEebBwBHm1sAR5uvAEee8gBHoDQAR7UcAEe64QBHvn4AR8AdAEfByQBHwoEAR8McAEfMEABHzjwAR89pAEfQmQBH0QcAR9GNAEfSEwBH0zQAR9QLAEfVDwBH2MUAR9lDAEfZqwBH2hMAR9p8AEfa5QBH21AAR9u7AEfcJgBH3JEAR9z8AEfdZwBH33oAR9/lAEfgTgBH4SwAR+GUAEfh/QBH4mYAR+LPAEfjGABH5V0AR+YzAEfpQQBH7DsAR+yrAEftDgBH7ucAR/MWAEf1IABH+FYAR/utAEf/nABIAZgASAR3AEgHTABICWMASAyFAEgOHQBID8wASBE7AEgSlABIFCgASBniAEgiVwBIJDsASCYlAEgm8QBIKgwASCp6AEgrUABILAQASC/uAEgy0gBIM0QASDRWAEg1UQBINtkASDejAEg4cABIPWkASD5oAEg/NgBIQ24ASEUlAEhFjABIRukASEfCAEhIsQBISQUASE9GAEhSjgBIVGEASFSqAEhWwABIWAgASFl+AEhanQBIXkAASF7eAEhgHwBIYTkASGKwAEhj0gBIZZsASGbEAEhnWABIZ+cASGh5AEhpDwBIa90ASGy7AEhtmQBIbmcASG7IAEhvKQBIb4oASG/rAEhwggBIcRoASHUnAEh3HQBIeQ8ASHzkAEh/vABIgrAASIMsAEiDqABIjk4ASI8GAEiSxQBIlg4ASJg1AEiaOABImowASJuNAEihuwBIpb4ASKexAEioHwBIqiQASKxbAEiuCQBIrnkASLBZAEiyIQBItJ0ASLc3AAAAwAAAAYGWAEi6QgBHUHUAR1E3AEdZggBIukAAAAADAEi6QgAAAAAAAADAAJE6AIGXAAAfgNoAAKQwAACA8wAAtfwAAQEBrwyBKQAAt9AAAQEBpHyBVwAAo/UAAQEClmikSYGSAADAAGjOsMsAgdEAAMAAYIgAAIH0AAC4LwABAQGxlYIrAAC8kAAAgk8AAMAAYkoAAIJwAAC9sAAAgqEAAMAAQQwAAILCAADAAG2jAAEBAsAATQC75oMZAADAAEJfAAEBAaSNg1EAAMAAai0AAQEBu+iDigAAwAB3JAAAg70AAMAAhWgAAQEBuC6D9AAAwACttQAAhCQAAMAAZogAAIRGAACA+wAAhGAAAMAASzYAAQEBpJOEkgAAwAB3xAABAQG4L4TLAADAAGdQAAEBAa7KhPkAAIHgAACFFQAAwABNCwABAQGkl4U/AADAAK29AACFZQAAwACqRQAAhXwAAMAARAkAAIWRAADAAHxTAACFpgAAwACt2QAAhccAAMAArgkAAIXrAADAAK8AAAAAAAAPAsAAkT2Bl4YFhhSGXAfAAF8hAAABYMAA/RwAAAABBcAAkUMAAAAABAAAAwAAAAAAAAAAAGDAAJE9AT8BCQEAwAD9MgAAAAACBsAAkT+Bl4YqhjWGOQECgL0AAAABA4Y5hjkAAAAAAAAAYMAA/bYABsAAkUGBl4Y9hkKGWgACuKsAAAABA4ZMhloAAAABAQGGVAAAAKQKYMAARHwAAFwAAABIvBkASLxAAEi8cAAAAAICwACRRIGXhl+GZZvrA8AAXyIAAAFgo/YAAAMEwACRR4GXhqWGrQmxrcAAkToAYIEUAATAAJFIgZeGy4brGMAAXyMAXcAA/KUCYMAARWFgwACusAEyhulgwABFYWDAAK6wAATAAJFJgZeHF4coGMAAXyQAXcAA/KUCYLy3YMAAqkYBKwEFwACRT4GXhy2HLYdxAAAAA4c9h3EAAAACAgKHRwAAAJZqYKQcAIdWAAAEsa1ggRQAAGDAAJFEAT8CCAHAAJFHgQDASL0rCQCHYqQWAQABgIdowEi9IAACBsAAkUuBl4d2h42HpAEAgL0Baod3YMAA/RwCAAABA4eSh6QAAAAAAAAAYMAA/bYBSoeVASfAAF8lBsAAkU2Bl4eph66b6QAAwABFSQAAAAEDh7ab6QAAAAYGBofLAAAAgmZgvLcAh+AAAACkCmDAAER8AIf7AAAArsBgwABCiwCIFwAAAKTMYMAATQ8AiEUAAACk/GDAAEEyAIhzAAAAt5hgtjsAAFwBPghPiIOIiAAAAcAAXmRhAWDAAJE9XAADiJCJawAAAAEBAYijAAAApLBgwACRPQAAXAE+Az0ciLIuln4CAVwCFojHh4jBwEi+J4C9wACRPzSIzQOIzYjqAAAAAAAAAFwBSojTARyI2YeI08BIvie4qwEAAYGI5MBIvcMAwACRQQCkET0ciQIWiPuCiPPASL3Qtx7AAEKRwABQkgIAAhaJE4eJDcBIvieAvcAAkT+BiRnASL3DAMAAdbZAHIk0gYkuwEi9w7ipAAAAAMAARJyJLok9ASSJZAInwABeZRaJXoeJWMBIvieAvcAAkT9OiXeJhwAAgslgwAD6CgEWiZIWiYkusa3AAJE6wACRR4LJgUROibmJxwAAwABfJl3AAP1nAWDAAEVhAR6JzcAAwOIAAWDAAEVhAABOifQAAADAAF8nYMAAkgcATooXAAAAwABfKGDAAJIiAE6KQQAAAJZyYMAAqkYASYpKGopOpDI+Aj0jHIp+FopsLsAAXyTAAJFJSAEAASsAwAD9KReKbC7AAF8kMoqCYLy3YMAAqkYAwACRSSsBXcAA/KUCYLy3YMAAqkY9HIqdFoqMLsAAXyTAAJFJgL8CAAKAip7ASL24FYqowEi/XQsfirLAAKp0AAAAAADAAPy6Pz0citQulqgBAWDAAPzZATSK3AOK3JvkAAAAAAAAAGDAAPzZAT4HTor/iwYAAMAAXyldwAD8dAFgwACRPQExixtgwACRPRYfi6LAAJGYBgAGhIu7wEi96haL0y6xrcAAkTrAAJFHFovxgovpwEi90LcbwABCjoOMA8BIvd2FjBDASL33FIwawEi/XQsAAB+MLMAAkiEBAAGDjEbASL3dAB+MYMAAke4AAAAAH4yJwACR5wAAAAAfjK3AAK4IBAAEhIy/wEi96haM74OM48BIvd2y+8AATReDjP/ASL3dFI0MwEi/XQsAAB+NccAAkZgGAAaEjYrASL3qFo2iLrGtwACROsAAkUcWjcCCjbjASL3QtxvAAEKOg43SwEi93YWN38BIvfcUjenASL9dCwAAH437wACRqwMAA4eODMBIvvKDjh3ASL3dFI4qwEi/FggAAB+ORsAAkZgGAAaEjl/ASL3qFo53LrGtwACROsAAkUcWjpWCjo3ASL3QtxvAAEKOg46nwEi93YWOtMBIvfcUjr7ASL9dCwAAH47QwACRqwMAA4eO4cBIvvKDjvLASL3dFI7/wEi/FggAAB+PG8AArggEAASEjy3ASL3qFo9dg49RwEi93bL7wABNF4OPbcBIvd0Uj3rASL9dCwAAH5ATwACRzAIAAoOQKcBIvd0uAB+QScAAkgYBAAEWkGyDkGDASL3dsHjAAE0YAB+RDcAArggEAASEkR/ASL3qFpFPg5FDwEi93bL7wABNF4ORX8BIvd0UkWzASL9dCwAAFZF6wEi/PQkfkYvAAJISAQABFpGlg5GZwEi93bB4wABNGAAVkcPASL9NCh+R2cAAklIBAAGDkezASL3dAB+SBsAAke4AAAAAH5IvwACR5wAAAAAfkxjAAJIhAQABg5MywEi93QAfk0zAAK4IBAAEhJNewEi96haTjoOTgsBIvd2y+8AATReDk57ASL3dFJOrwEi/XQsAAB+TvcAArvACAAKDk9PASL3dLgAflGXAAJGYBgAGhJR+wEi96haUli6xrcAAkTrAAJFHFpS0gpSswEi90LcbwABCjoOUxsBIvd2FlNPASL33FJTdwEi/XQsAAB+U78AAkasDAAOHlQDASL7yg5URwEi93RSVHsBIvxYIAAA9HJVEFJU9wEjAEwwAg/gBAAGGlUzASL4KAMAA/EI9HJYphpYhwEi+CiABAAEfli7AAK3YAgACg5ZGwEi93RaWWoCWU8BIvbiE+bzFAAAATpaJlo0AAMAAXypgwACRrAEflpPAAJHMAgACg5apwEi93S4APRyWy4aWw8BIvgogAQABFJbMwEjDmg0AAABJltgiIhaW5xSW3MBIvz0JAMAAXyvAAJIMARaXAhSW/sBIw5oNAMAAXyzAAJG1ARaXNRSXJcBIv00KAMAAXy3AAJIrPgE9FZdRwEjAEwwxl21gwACRPQgfl33AAK4IBAAEhJePwEi96haXwYOXtcBIvd2y+8AATReDl9HASL3dFJfewEi/XQsAAB+X8sAAkgYBAAEWmBWDmAnASL3dsHjAAE0YAB+YOcAAkhIBAAEWmFODmEfASL3dsHjAAE0YAB+Yd8AArvACAAKDmI3ASL3dLgAfmK/AAJGYBgAGhJjIwEi96haY4C6xrcAAkTrAAJFHFpkAgpj4wEi90LcbwABCjoOZEsBIvd2FmR/ASL33FJkpwEi/XQsAAB+ZPcAAkasDAAOHmU7ASL7yg5lfwEi93RSZbMBIvxYIAAAfmYrAAK3YAgACg5miwEi93RaZtoCZr8BIvbiE+bzFAB+Z1cAAkcwCAAKDmevASL3dLgA+AT0VmiHASMATDDGaPWDAAJE9Ah+aTcAArggEAASEml/ASL3qFpqRg5qFwEi93bL7wABNF4OaocBIvd0Umq7ASL9dCwAAH5sswACRmAYABoSbRcBIveoWm10usa3AAJE6wACRRxabfYKbdcBIvdC3G8AAQo6Dm4/ASL3dhZucwEi99xSbpsBIv10LAAA9HJvMFJvFwEjAEwwAg/gBAAGGm9TASL4KAMAA/EIApAgAAEi9XQBIvZYASMXzAAAAAgLAAJFQgZef6J/uwAEcHgPAAF8uAAABYMAARKAAAWDAAJE9CQTAAJFSgZeg+qEoBsAAXy8AYMAA+9ABaqElYMAA+9DAANcpBMAAkVOBl6FGoWcJgL0BaqEuYMAA/RwCYMAA/bYBJ8AAXy4EwACRVYGXoYyhowmz2sAAkToAYMAAQTIABMAAkVaBl6G9ocUJsa3AAJE6AGCBFAAEwACRV4GXoemh+gnAAFGFwACROgBgwAB3XQAEwACRWIGXohGiHQm1ZcAAkToAYMAATQ8ABMAAkVmBl6I3okAJwABIj8AAkToAYLY7AATAAJFagZeiXqJiCcAAXzDAAJE6AGDAAKpGAATAAJFbgZeibaJzGMAAXzHAAJE6AGDAAER8ASsBBcAAkZiBl6J4onijCQAAAAOikKMJAAAABgYGopYAAASz2mDAAEEyAKK0AAAEsa1ggRQAoskAAATAAFGFYMAAd10AouEAAAS1ZWDAAE0PAKL0AAAEwABIj2C2OwCjBAAABMAAXzBgwACqRgAAYMAAkVABPwcIAcAAkVWAAMBIxz4IAcAAkVaBAMBIx0sIAcAAkVeCAMBIx1YIAcAAkViDAMBIx2UIAcAAkVmEAMBIx3IIAcAAkVqFAMBIx38JAaJ4wABFDAAAAAA3BsAAkV2Bl6MOoyKjTwEAsvsAAAABA6Mxo08AAAAAAAAAYLkjAUqjNAEWo0EWozQutWXAAJE6wACRWLL7wABNFwbAAJFfgZejVKNso6oBAMAAUzTAAJE6AAAAAQOjgaOqAAAAAAAAAGC91gFKo4oBFqOXFqOKLrVlwACROsAAkViweMAATRgGwACRYIGXo6+jvqPkAQDAAEeUwACROgAAAAEDo8qj5AAAAAAAAABgwABqPwFKo80BFqPaFqPNLrVlwACROsAAkVi3b8AATRMGwACRYoGXo+mj+qRQAAC4qwFqo+pgwAD9HAIAAAEDpASkUAAAAAEBAaQMAAAAwABaEWDAAER8AABcAT4CPRekGy7AAF8xwACROoCkJMBIyOPAAJFbPRykMS64fgEAAYCkRMBIyOMAwABEZwbAAJFjgZekVaRhrAcAALiAAWqkVmDAAP0cAgAAAQOkcKwHAAAAAQEBpH0AAACZ92DAAEUqAABbAT4DPRykii7AAF8yAQABgKSXwEjJTgDAAJFkTqSwpLwAALiIYMAARWEBFqTEgKS+wEjJToMZwABFHEOkzyEcpOKBpNbASMl5SAEAASsAwAD9KT4ETqUApQUAAIOwYMAARWEBFqUTgaUHwEjJeYOwwABFa06lLKU4AACEV2DAAEVhASalLAEcpUaBpTrASMl5hE0BAAEuAMAARdNgwABFYUmlWiEcpWqDpV7ASMnRSAEAAYGlbcBIyXkAwAD9KT4GPRylioClhMBIyU645wIAAoGlksBIyXmDpZ/ASMnRAMAARVNJpsshIhanJBym7oOm0cBIydG1FgEAARam/S7AAFM0wACROsAAkV8AwABFw7PxvbkAFqeXHKdhgadEwEjJebUWAQABFqdwLsAAUzTAAJE6wACRXwDAAEXDs/G9uT4CTqg9qEUAAK4KYL3LARyoXBaoRy7AAFM0wACROsAAkV+W/QIAAhaohIOoeMBIydG5K8AARaEWqKGBqJXASMl5uSvAAEWhAL4iPReoyYOovcBIydG5K4So28BIyp/AAEWhPz01AAAAAQBgwABFYQGDqYTASMnRIxypnhapkISpkMBIywGlTcAARWNIAQABKwDAAP0pF6mQhKmQwEjLAaVNFqmugamiwEjJeaVNwABFY8AARWMrAWC8kT01AAAAAQBgwABFYQGDqcXASMnRIxyp4xap0YSp0cBIy1ilTsAARWRIAQABKwDAAP0pF6nRhKnRwEjLWKVOFqnzgannwEjJeaVOwABFZMAARWQrAWDAAEHFSaoOIRyqH4OqE8BIydG4xQAAAADAAEXNPgI9HKr5gKrzwEjJTrjbAgACgasCwEjJeYOrD8BIydEAwABFTj2Kq5zASMmyg6ujwEjJ0T89HKvIgKvCwEjJToRZAQABgavPwEjJeQDAAEVQPz2Jq+vASMl5gqv5wEjJsgbAAJFkgZesR6xHugkAAMAAXzIAAAABA6xTugkAAAABAQGsYAAAAJn3YMAARSoAAFsBPhlJrMwWrNsWrNaArNDASMxKuMzAAEUxgVXAAEUfSqzkAD9OrPWs+QAAuOBgwABIbQEmrPUBFq0GFq0BgKz7wEjMSrjMwABFMYMZwABFHGDAAEhtSa0RIRytHhatGYGtFcBIzH6DsMAARWtIAQABKwDAAP0pSq0nAD9JrTMhHK1RFq1KFq09gK03wEjMSriiwABFNmHAAPyjSAEAAZUAwAD880qtVwA/QBytfBatdRatboGtasBIzH6CUcAARWdhwAD8o0gBAAGVAMAA/POtaq2AAE6tk62WAADAAF8zYMAARSoBHK2qFq2egK2YwEjMSriiwABFNksBAAGTAMAA/INOrb+twgAAwABfNGDAAEUqARyt1hatyoCtxMBIzEq4osAARTZLAQABlADAAPyDTq3rrfUAALjRYMAARSoBFq39gK33wEjMSrjRwABFOEmuDCEiHK4fFq4Vgq4SwEjNLrjRwABFOEgBAAGEriLASM2KAMAA/SkAHK48Fq4yg64vwEjNXLjRwABFOEgBAAGErj/ASM2KAMAA/SlKrksAP06uj66bAADAAF81YMAARWEBFq6nhK6dwEjNioHowABFHUmusSElrsGFrrXASM36YMAASCBKrsoAP06u467oAACW+WDAAEVhARau/Rau9oWu6sBIzfqCUcAARWeAw8AA/FpJrwkcryAWrxkWrxKGrw3ASM4zuMbAAEVoYcAA/KOAlwEAAZQAwAD8/0qvJQA/Tq83rz8AAKqKYMAA+goBKkOvTCWvWIavU8BIzjNgwABITD4DPY6vacBIzjMWr3wWr3WGr3DASM4zglHAAEVngMPAAPxaSa+KHK+hFq+aFq+Thq+OwEjOM7jGwABFaGHAAPyjgJcBAAGUAMAA/P9Kr6YAPz2Pr7TASM6JIYevv8BIzolJr9MhJa/chq/XwEjOM2DAAEiBSq/rAD9OsAQAAADAAF82YMAARWEASbAQFrBAHLAjHLAfFrAZhrAUwEjOM4JRwABFZ0sBAAGTAMAA/IOsaQEAARawKi7AAFM0wACROsAAkV8AwABFr7Pxvbk+AT0VsFrASM8kCBywbhawaIawY8BIzjOCUcAARWdLAQABlADAAPyDSbB+FrCuHLCRHLCNFrCHhrCCwEjOM4JRwABFZ0sBAAGUAMAA/IOsaQEAARawmC7AAFM0wACROsAAkV8AwABFr7Pxvbk+AT0VsMjASM8kCByw3Baw1oaw0cBIzjOCUcAARWdLAQABkwDAAPyDPgFKsPQATrEUsSIAAMAAXzdgwABFYQEcsS4WsSiBsSTASMx+glHAAEVnSwEAASOHsS/ASM6JlJMBYMAA+9AAwAD8g06xUrFjAADAAF84YMAARWEBHLFvFrFpgbFlwEjMfoJRwABFZ0sBAAEjh7FwwEjOiZOUAWDAAPvQAMAA/INOsZKxoAAAwABfOWDAAEUqARyxtBaxqICxosBIzEq4osAARTZLAQABI4extcBIzomUkwFgwAD70ADAAPyDTrHXsegAAMAAXzpgwABFKgEcsfwWsfCAserASMxKuKLAAEU2SwEAASOHsf3ASM6Jk5QBYMAA+9AAwAD8g0myryIiIiIcsrMuwABfO8AAkToCAAIUssfASM8kCAAUss/ASNBPCgAAwACRZwAcsuwuwABfPMAAkToCAAIUsvzASNASCQAqAMAAkWYAFrNuHLM7FLMdwEjQTwoAtRoBAAEWs0suwABTNMAAkTrAAJFfAMAARcez8b25AByzii7AAF89wACROgEAARSzl8BI0IwLAADAAJFoAByzsS7AAF89wACROgEAARSzvsBI0MkMAADAAJFoPgZOs+az8wAAqPpgwABFYQEcs/wWs/UuwABfMcAAkTrAAJFbuJ4CAAIpFrQSLrVlwACROsAAkVgAwABElk60NLRAAACEV2DAAEVhATW0RgAAAQBgwABIgQEftEbAAEiLBAAEFLRbwEjPJAgAFLRjwEjRvg0AKxa0jBa0dy7AAFM0wACROsAAkV+Fn73bADUAAAABAFsBF7SgFLSewEjSCA4ApU0WtLSBtLDASMx+pU3AAEVjwABFYzUAAAABAFsBF7TMFLTKwEjSCA4ApU4WtOSBtODASMx+pU7AAEVkwABFZBQAwEjSCA4APRy1A4C0/cBIzEq45wIAAoG1C8BIzH4UtRDASNH5DgAAwABFUz0ctSqAtSTASMxKuNwBAAEUtTXASNH5DgAAwABFSD0ctU+AtUnASMxKuOEBAAGBtVnASMx+AMAARU1KtWUAP0m2EyIiIiIcthcuwABfO8AAkToCAAIUtivASM8kCAAUtjPASNBPCgAAwACRZwActlAuwABfPMAAkToCAAIUtmDASNASCQApAMAAkWYAFrbRHLaeFLaAwEjQTwoAtRoBAAEWtq4uwABTNMAAkTrAAJFfAMAARcez8b25ABy27S7AAF89wACROgEAARS2+sBI0IwLAADAAJFoABy3FC7AAF89wACROgEAARS3IcBI0MkMAADAAJFoPghOt0m3VwAAqPtgwABFYQEct2AWt1kuwABfMcAAkTrAAJFbuJ4CAAIqFrd3LrVlwACROsAAkVgAwABElk63mbehAACbGWDAAEVhAR+3p8AASIsEAAQUt7zASM8kCAAUt8TASNPCDQArFrfuFrfZLsAAUzTAAJE6wACRX4WfvdsAPRy4BYC3/8BIzEq43AEAARS4EMBI0/0OAADAAEVITrgtuDkAAIRXYMAARWEBNbhJAAABAGDAAEhMAR+4ScAASFMCAAIUuE7ASNP9DgAWuGwWuFcuwABTNMAAkTrAAJFfhZ+92wA1AAAAAQBbARe4hBS4gsBI1G4PAKVNFriYgbiUwEjMfqVNwABFY8AARWM1AAAAAQBbARe4tBS4ssBI1G4PAKVOFrjMgbjIwEjMfqVOwABFZMAARWQUAMBI1G4PAD0cuOuAuOXASMxKuOcCAAKBuPPASMx+FLj4wEjUXw8AAMAARVM9HLkSgLkMwEjMSrjbAgACFLkbwEjT/Q4AFLkkwEjUXw8AAMAARU49HLk+gLk4wEjMSrjhAQABgblIwEjMfgDAAEVNSrlUAD9Kuf8ABsAAkWaBl7oOuhO68wAAwABfPMAAkToAAAABA7oiuvMAAAACAgK6MAAAAIPuYMAARWEAujsAAACAlmDAAPoKAABgwAD6CgE+Akm6SCW6UYC6TMBI1ZhgwABINj4CTrp1uncAAID1YMAAYLsBFrp+FLp5wEjVmAABYMAASDaF/8AASDhJuo4lupSCupLASNXQYMAAYUY+AUq6tAEcuscWur0UurvASNXQAgFgwABhRpznwABhS0gBAAGBusrASNWlAMAA/Sk/P0q64wEqBsAAkWeBl7r4uv27wQAAwABfO8AAkToAAAABA7sQu8EAAAACAgK7HgAAAJZRYMAARWEAuzEAAADAAF8+YMAARWEAAGDAAPoKAT4DSbs9HLtGgLtBwEjWZEgBAAGBu0nASNZxAMAA/SlKu08BKT9Ju2Alu2mBu2TASNZxYMAASbZKu3gBHLt/LsAAXzvAAJE6AgACgLuTwEjWZBa7nhS7mcBI1nEBAWDAAEm2uOvAAEYUAMAAkWc/SruxASoGwACRaIGXu8a7y7y0AADAAF89wACROgAAAAEDu9e8tAAAAAEBAbvkAAAAmfdgwABFKgAAYMAA+goBPgJFu/EBvAO8CAAAwABfPmDAAEVhARa8EIC8CsBI1yCDGcAARRwBIRy8HIG8F8BI1zpIAQABKwDAAP0pAYm8JcBI1zoWvDGBvCzASNc6g7DAAEVrQT4DSbw/JbxIgbxDwEjXOmDAAEm2QrxXAD9JvGclvHCBvGvASNc6YMAAR+9KvHoBKT9KvI0BKkq8pQEpBsAAkWqBl7y5vNK9CwAAuIYBary6YMAA/RwCAAABA7zivQsAAAABAQG88AAAAIPuYMAARWEAAGDAAEVhAT4BSrz8AYC9A8BI1+0GwACRa4GXvRC9Hr6vAADAAF8/AAAAAQO9Mb6vAAAAAQEBvT8AAACD7mDAAEVhAABgwABguwE+Akm9SyIcvVSAvU/ASNgwtZsBAAEWvVwuwABTNMAAkTrAAJFfAMAARa4AFr2fHL2CgL19wEjYMKxpAQABFr2JLsAAUzTAAJE6wACRXwDAAEWvtNW9uz4CTr3Ivc4AAICWYMAAYLsBHL3vFr3aLsAAUzTAAJE6wACRX7U6AQABFr4GgL4BwEjYMLkrwABFoQC+O0m+Hha+KIG+IsBI2J26BcAAYL8+AUq+OgGBvkHASNidPz9KvqABKwbAAJFsgZe+tL65wABAEgAAwABfQAAAAAEDvtXAAEASAAAAAQEBvuMAAACD7mDAAEVhAABcAT4DSb7vFr7/Fr74gL7zwEjZI7jGwABFaIFVwAD8Vkq/CAA/Tr8ivygAAICWYMAAYLsBHL8qLsAAXz8BAAGAvz7ASNkjAMAAkWtJv0khHL9Tgb9NwEjZV0gBAAErAMAA/Sk+Ak6/br93AACF/2DAAEg2ARy/gBa/eS7AAF8xwACROsAAkVupeQIAAoG/jMBI2VcWv5MutWXAAJE6wACRWADAAESPRr+ov9i/ugAAAKOoYMAARWEAHL/OFr/HgL/CwEjZI7jGwABFaICtAAAAAMAA/Eg+AT0cv+eDv+LASNncuUUCAAKAv/HASNkjgr/3wEjZlwDAAEXZPwbAAJFtgZfAAEAXwABAMMAAQ78AALheAWrAAEAYYMAA/RwCAAABA8AAQEPAAEO/AAAAAQEBwABAVAAAAIPuYMAASFoAAGDAAEVhAT4DScAAQjEcwABCOoDAAEI1wEjaYboPAAAAAMAASFw+AknAAEJUIRzAAEJlFsAAQl6AwABCWcBI2mG4xsAARWiWMAEAATTAAEJrA8AAQmvAAEKGAAAAAQEBwABCbAAAAKOoYMAARWEAAGDAAPoKAUrAAEJ1ASXAAEJ6gcAAQnXASNrQYMAARxoAwAD8RUrAAEKJAYDAAEKQwEjaYT9GwABC/cAAQyoAAAABAGDAAEVhABzAAEMgFsAAQxmAwABDFMBI2mG4xsAARWiArQAAAADAAPxIPgNOwABDDAAAAKOoYMAARxoBJsAAQv0BgcAAQwzASNsdYMAARxo9HMAAQz8WwABDOYLAAEM0wEjbTpn3wABFabjnAgACgsAAQ0fASNtOgMAAQ03ASNphAMAARVM9HMAAQ2cWwABDYYLAAENcwEjbTpn3wABFaYRZAQABgsAAQ27ASNtOAMAARVA/PRzAAEOILsAAX0ABAAGAwABDpcBI2mEAwACRbErAAEOwAYDAAEO3wEjaYQbAAJFugZfAAEPEwABD3cAARWUAAIWtAWrAAEPFYMAA/RwCAAABA8AAQ+XAAEVlAAAAAQEBwABD6wAAAIPuYMAASEwAAGDAAEVhAT4FTsAARArAAEQRAACCUV3AAPx0AWDAAEVhARbAAEQYgMAARBPASNw1glHAAEVnQBzAAEQ5FsAARDKBwABEK8BI3E5hwAD8o0gBAAGUAMAA/PPAAEQrwABEPQBOwABEUcAARFcAAIF7YMAARWEBHMAARF+BwABEWcBI3E5LAQABkwDAAPyDScAARGglwABEcoLAAERswEjcp2DAAEg2PgNOwABEksAARJsAAIX/YMAASDYBFMAARJ3ASNynAgFgwABINk7AAESvwABEtgAAugpgwAD6CgEWwABEyhbAAETBg8AARLjASNzshf/AAEg4ugrAAGDASsAARNgBHMAAROYWwABE3y7AAF8xwACROsAAkVu4ngIAAiGEwABE98BI3Q8WwABE/y61ZcAAkTrAAJFYAMAARJZJwABFGSXAAEUjgsAARR3ASNynYMAASEw+AUrAAEU0ARzAAEVHFsAARUEUwABFO8BI3KcCAWDAAEhMglHAAEVnSwEAAZMAwAD8gz9KwABFVgGAwABFXcBI3DUGwACRb4GXwABFasAARYPAAEYbAAC4tAFqwABFa2DAAP0cAgAAAQPAAEWTwABGGwAAAAEBAcAARaEAAACD7mDAAEfFAABgwABFYQE+Ak7AAEW6wABFwQAAwABfQWDAAEVhARzAAEXDLsAAX0ICAAIcwABF0oDAAEXNwEjeEJzBAAAAAMAAR8sWwABF5IDAAEXfwEjeEIWswABHyQDAAJFwSsAARfIBIyEcwABGAIHAAEX5wEjeKUgBAAErAMAA/SmBwABGCsBI3imAwABGE8BI3hABYMAARWEGwACRcIGXwABGIMAARi3AAEdoAADAAF9CAAAAAQPAAEY2wABHaAAAAAICAsAARl0AAACcwWDAAGkKAMAARnUAAACFrGDAAEVhAABgwABFYQE+AknAAEaEJcAARpCBwABGiMBI3u5gwABINj4DTsAARrDAAEa5AACFeWDAAEg2ARTAAEa7wEje7gEBYMAASDZOwABG2MAARt8AAMAAX0FgwABguwEcwABG64DAAEbhwEje34NZAQABFsAARvmCwABG8MBI3yGF/8AASDgAwABpDEnAAEcKIRzAAEcVg8AARw7ASN9ESAEAASsAwAD9KUrAAEceARzAAEcsFsAARyUuwABfMcAAkTrAAJFbqXkCAAKDwABHOMBI30QWwABHQC61ZcAAkTrAAJFYAMAARI8/P0rAAEdZASsGwACRcYGXwABHbcAAR3rAAE5DAADAAF9DAAAAAQPAAEecwABOQwAAAAEBAcAAR6wAAACD7mDAAEZeAABgwABFYQE+A07AAEfFwABH1AAAwABfRGDAAEVhARzAAEfhFsAAR9uAwABH1sBI4BeCUcAARWdLAQABlADAAPyDScAAR+oWwABIOhzAAEgGgcAAR+7ASOAwtQcBAAEWwABIGy7AAFM0wACROsAAkV8AwABFtbPxvbk+B0nAAEhUHMAASGeBwABIWMBI4DC5TwAAAADAAEXhPgNOwABIj8AASJ0AAMAAX0VgwABINgEmwABIjwGBwABIn8BI4DBgwABINk7AAEjLwABI1AAAhf9gwABhcQEmwABIywEWwABI5ILAAEjWwEjgwYX/wABIOGDAAGFxSsAASPYBHMAASQQWwABI/S7AAF8xwACROsAAkVu4mQIAAhbAAEkcg8AASRPASODqYcAAYXcWwABJJC61ZcAAkTrAAJFYAMAARJFJwABJQBzAAElTgcAASUTASOAwuVAAAAAAwABF4j4DTsAASXnAAEmHAADAAF9FYMAASDYBJsAASXkBgcAASYnASOAwYMAASDZOwABJs8AASbwAAIX/YMAAYZwBJsAASbMBFsAAScyCwABJvsBI4YWF/8AASDhgwABhnErAAEneARzAAEnsFsAASeUuwABfMcAAkTrAAJFbuJkCAAIWwABKBIPAAEn7wEjhrmHAAGGiFsAASgwutWXAAJE6wACRWADAAESRP07AAEouwABKNgAAwABT4GDAAPoKAR7AAEpCwACRPAIAAhbAAEpfgcAASlDASOAwuSvAAEWhFsAASnAutWXAAJE6wACRWABOwABKk8AASp4AAKxdYL3LARbAAEqlgMAASqDASOAXuSvAAEWhTsAASsrAAErVAAC5jWC9ywEWwABK7BbAAErXLsAAUzTAAJE6wACRX7TpvelJwABLThbAAEu6HMAAS3IWwABLUi7AAFM0wACROsAAkV+0/wIAAoPAAEuFwEjicRbAAEugFsAAS5EusvvAAJFdsRm4kgC9/rPxvbk+AT2MwABL1sBI4pYWwABL+BbAAEvjLsAAUzTAAJE6wACRX7TnvedJwABMERbAAEx9HMAATDUWwABMFS7AAFM0wACROsAAkV+0/wIAAoPAAExIwEjicRbAAExjFsAATFQusvvAAJFdsRi4kQC9/rPxvbk+AT2MwABMmcBI4pYWwABMuxbAAEymLsAAUzTAAJE6wACRX7Toveg/TsAATODAAEznAACBdmDAAEboAR/AAEz3wABG9wMAAoHAAE0CwEjgMITAAE0SwEjilgGrPiGCwABNLcBI4itKwABNPQGFwABNRMBI46dJwABNVxzAAE1qgcAATVvASOAwuVEAAAAAwABF4z4DTsAATY3AAE2bAADAAF9FYMAASDYBJsAATY0BgcAATZ3ASOAwYMAASDZOwABNxMAATc0AAIX/YMAAYbwBJsAATcQBFsAATd2CwABNz8BI5BOF/8AASDhgwABhvErAAE3tARzAAE37FsAATfQuwABfMcAAkTrAAJFbuJkCAAIWwABOE4PAAE4KwEjkPGHAAGHFFsAAThsutWXAAJE6wACRWADAAESRP0rAAE40ASsGwACRcoGXwABOSMAATlXAAF1/AADAAF9GAAAAAQPAAE5qwABdfwAAAAEBAcAATnoA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wABG2UrAAK2QAYDAAK2XwEkkCz9OwACtpcAAra4AAIV5YMAARWEBFsAArbWAwACtsMBJJAuFecAARshJwACuISXAAK4ugcAAriXASSRNYMAASDY+Ak7AAK5SwACuWwAAhf9gwABguwEWwACuZhTAAK5dwEkkTQEBYMAASDaF/8AASDhJwACudhbAAK6DgsAArnrASSSOwABFg8AAYMk+BE7AAK67wACuzwAAwABfY2DAAGIMASbAAK67AYLAAK7RwEkkjmDAAGIMTsAArwPAAK8KAACEg13AAPylAmC8yWDAAGC7ARbAAK8gg8AArwzASSTZhIPAAGIOTsAArz7AAK9EAACAlmDAAGC7ARzAAK9MhMAAr0bASSUCSwEAARbAAK9SgMAAr03ASSQLliDAAEbGAMAA/LlJwACvZCEcwACvboXAAK9owEklMkgBAAErAMAA/Sk+AUrAAK+DARzAAK+RFsAAr4ouwABfMcAAkTrAAJFbqXkCAAKFwACvncBJJTIWwACvpC61ZcAAkTrAAJFYAMAARI8/Pz9KwACv0AGAwACv18BJJAsGwACRh4GXwACv5MAAr/3AALfnAAC4QAFqwACv5WDAAP0cAgAAAQPAALALwAC35wAAAAEBAcAAsBcAAACD7mDAAEboAABgwABFYQE+BE7AALAwwACwOQAAhXlgwABFYQEWwACwQIDAALA7wEkmFoV5wABG7EnAALBOHMAAsG0WwACwWRbAALBSLsAAXzHAAJE6wACRW7iRwABEiIMXAQABgcAAsHbASSYvAMAA/XM+AUnAALGAFsAAsbccwACxlxzAALGTFsAAsY2BwACxhMBJJi+CUcAARWdLAQABkwDAAPyDtQ8BAAEWwACxoS7AAFM0wACROsAAkV8AwABFvLPxvbk+AUrAALHTARzAALHpFsAAseOBwACx2sBJJi+CUcAARWdLAQABkwDAAPyDP0nAALIBHMAAsg6BwACyBcBJJi+5UAAAAADAAEXiPgNOwACyMsAAskMAAMAAX2RgwABINgEmwACyMgGBwACyRcBJJi9gwABINk7AALJnwACycAAAhf9gwABhnAEmwACyZwEWwACyg4LAALJywEknL4X/wABIOGDAAGGcSsAAspMBHMAAsqEWwACymi7AAF8xwACROsAAkVu4mQIAAhbAALK5g8AAsrDASSdYYcAA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QCEWwADRcIDAANFrwEk7irmLwABGVsAA0WrAANGBAErAANGOATXAANGZAAABAGDAAEacAR/AANGZwABGqAQABIPAANGnwEk8QBzAANHDHMAA0bsWwADRtIDAANGvwEk7ioJRwABFZ5YpAQABlADAAPxMgK0AAAAAwAD8SBbAANHggMAA0dvASTuKuSvAAEWhFsAA0faAwADR8cBJO4qFF8AARnYANQAAAAEAWwEXwADSE4XAANIRwEk8+qVOFsAA0iyAwADSJ8BJO4qlTsAARWTAAEVkhQDASTz6Pz8/SsAA0lsBgMAA0mLASTuKBsAAkYyBl8AA0m/AANKIwADbyQAAuEwBasAA0nBgwAD9HAIAAAEDwADSmcAA28kAAAABAQHAANKoAAAAg+5gwABGnAAAYMAARWEBPgQ9HMAA0rQuwABfQAEAAYDAANLRwEk99gDAAJFsTsAA0unAANLxAACWIGC8twEWwADS+IDAANLzwEk99pYgwABGnknAANMGHMAA0xKBwADTCsBJPitIAQABFsAA0yQWwADTFS6y+8AAkV2w2bhQAMAA/Sk+AUnAANM/HMAA01YWwADTTxbAANNIgMAA00PAST32glHAAEVnYcAA/KNIAQABlQDAAPzzPgFKwADTZgE1wADTcQAAAQBgwABIgQEfwADTccAASIsEAAQcwADTkxbAANONgMAA04jAST32glHAAEVnSwEAAZMAwAD8gxzAANOjFsAA052AwADTmMBJPfaCUcAARWdLAQABlADAAPyDKxbAANPDFsAA064uwABTNMAAkTrAAJFfhZ+92wA1AAAAAQBbARfAANPZgsAA09fAST69pU4WwADT8oDAANPtwEk99qVOwABFZMAARWSCAMBJPr0/ScAA1BgcwADUJIHAANQcwEk+K0gBAAEWwADUNhbAANQnLrL7wACRXbFLuMIAwAD9KT4BScAA1FIcwADUaRbAANRiFsAA1FuAwADUVsBJPfaCUcAARWdhwAD8o0gBAAGVAMAA/PM+AUrAANR5ARzAANSALsAAX2oBAAGAwADUlMBJPfYAwACRjT9JwADUrhzAANS6gcAA1LLAST4rSAEAARbAANTMFsAA1L0usvvAAJFdsUS4uwDAAP0pPgFJwADU9hzAANUNFsAA1QYWwADU/4DAANT6wEk99oJRwABFZ2HAAPyjSAEAAZUAwAD88z4CTsAA1SrAANU4AADAAF9rYMAARWEBHMAA1UUWwADVP4DAANU6wEk99oJRwABFZ0sBAAGTAMAA/INJwADVUiXAANVkgsAA1VbASUBiYMAASDY+Ak7AANWIwADVkQAAhf9gwABINgEUwADVk8BJQGICAWDAAEg2ScAA1awWwADVwhbAANW5g8AA1bDASUC0hf/AAEg4ugrAAGDASsAA1coBg8AA1dHASUC0Pz8/ScAA1fgcwADWCxbAANX8LrL7wACRXbGiAQABgcAA1hbAST4rALkrPgFJwADWKBzAANY/FsAA1jgWwADWMYDAANYswEk99oJRwABFZ2HAAPyjSAEAAZQAwAD88z4CTsAA1lzAANZlAAAfYMAARWEBHMAA1nIWwADWbIDAANZnwEk99oJRwABFZ0sBAAGTAMAA/INJwADWfxbAANasHMAA1oyCwADWg8BJQWq1DwEAARbAANaWLsAAUzTAAJE6wACRXwDAAEW8s/G9uT4BSsAA1soBgsAA1tHASUFqPz9JwADW+BzAANcLFsAA1vwusvvAAJFdsaMBAAGBwADXFsBJPisAuSw+AUnAANcoHMAA1z8WwADXOBbAANcxgMAA1yzAST32glHAAEVnYcAA/KNIAQABlADAAPzzPgJOwADXXMAA12UAAB9gwABFYQEcwADXchbAANdsgMAA12fAST32glHAAEVnSwEAAZMAwAD8g0nAANd/FsAA16scwADXjILAANeDwElCR7UVAQABFsAA15UuwABTNMAAkTrAAJFfAMAARcKz8b25PgFKwADXyQGCwADX0MBJQkc/P0nAANf3HMAA2AoWwADX+y6y+8AAkV2xpAEAAYHAANgYwEk+KwC5LT4BScAA2CocwADYQRbAANg6FsAA2DOAwADYLsBJPfaCUcAARWdhwAD8o0gBAAGUAMAA/PM+Ak7AANhewADYZwAAH2DAAEVhARzAANh0FsAA2G6AwADYacBJPfaCUcAARWdLAQABkwDAAPyDScAA2IEWwADYrRzAANiOgsAA2IXASUMktRsBAAEWwADYly7AAFM0wACROsAAkV8AwABFyLPxvbk+AUrAANjLAYLAANjSwElDJD8/ScAA2PkiHMAA2QWBwADY/cBJPitIAQABFsAA2RcWwADZCC6y+8AAkV2xM7iqAMAA/SkBHMAA2TeBwADZL8BJPitIAQABFsAA2UkWwADZOi6y+8AAkV2xMbioAMAA/Sk+AUnAANldHMAA2XQWwADZbRbAANlmgMAA2WHAST32glHAAEVnYcAA/KNIAQABlADAAPzzPgJOwADZkcAA2ZoAAB9gwABFYQEcwADZpxbAANmhgMAA2ZzAST32glHAAEVnSwEAAZMAwAD8g0nAANm0JcAA2cGCwADZuMBJRDlgwABINj4CTsAA2enAANnyAACF/2DAAGC7ARbAANn9FMAA2fTASUQ5AgFgwABINoX/wABIOEnAANoRFsAA2h6DwADaFcBJRIi6BcAAYL8+A07AANo5wADaPwAAgJZgwAD6CgEWwADaSoPAANpBwElEiLoKwABgwEnAANpeHMAA2mqBwADaYsBJPitIAQABFsAA2nwWwADabS6y+8AAkV2xMbioAMAA/Sk+AUrAANriARzAANrwFsAA2ukuwABfMcAAkTrAAJFbuJ4CAAIhhMAA2wHASUTRFsAA2wgutWXAAJE6wACRWADAAESWP0nAANt1hMAA23nASUTRSsAA24ABFMAA24fASUQ5AgFgwABINj8/Pz8/SsAA27oBgMAA28HAST32BsAAkY2Bl8AA287AANvbwADg0gAAwABfagAAAAEDwADb7sAA4NIAAAABAQHAANv9AAAAg+5gwABGnAAAYMAARWEBPgVOwADcU8AA3FoAAINEYMAARWEBHMAA3GcWwADcYYDAANxcwElF0IJRwABFZ0sBAAGTAMAA/INJwADccCEcwADciRbAANyCFsAA3HuBwADcdMBJRem4xsAARWhhwAD8o0gBAAGUAMAA/PNKwADcjwGAwADclsBJRdA/ScAA3KAWwADcyRzAANyrgcAA3KTASUXptQwBAAEWwADcsy7AAFM0wACROsAAkV8AwABFurTWvbw+AUrAANzlAYDAANzswElF0D9GwADc/ADAAN0OAAAAo6hgwABFYQAWwADdG4DAAN0WwElF0LjGwABFaEE+B0nAAN0rJcAA3TSCwADdL8BJRrFgwABG6ELAAN1DAD9JwADdUyXAAN1cgsAA3VfASUaxYMAASSFCwADdZwA/ScAA3bMlwADdvILAAN23wElGsWDAAEYbQsAA3c0AP0nAAN48JcAA3kWCwADeQMBJRrFgwABI5ULAAN5WAD9JwADeZiXAAN5vgsAA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TiyCUcAARWdLAQABkwDAAPyDScAA56wWwADn1RzAAOe2gcAA57DASU5FtRsBAAEWwADnvy7AAFM0wACROsAAkV8AwABFyLPxvbk+AUrAAOfvAYHAAOf2wElORT9PwADoCMAA6BUAAAGeaGEBYMAA/bZgwABFYQADwADoHcAA6H4AAAABAQHAAOglAAAAg+xgwAD9tgAAYMAARWEBSsAA6DgBHMAA6D8WwADoOC7AAF8xwACROsAAkVupeQIAAh7AAOhLwABo9QEAAYPAAOhowElO7gAWwADocS61ZcAAkTrAAJFYAMAARI9PwADohcAA6JIAAAHAAF9uYQBgwABFYQADwADoncAA7JYAAAAAAAAAYMAARWEBPglJwADoqCEcwADos4HAAOitwElORbiWAAAAAMAARdxKwADowQErP07AAOjewADo5wAAhf9gwABINgEmwADo3gGBwADo6cBJTkVgwABINknAAOj2IRbAAOkNFsAA6QSEwADo+8BJT6iF/8AASDizW8AAYMtKwADpGgErP07AAOlEwADpSgAAgJZgwABg8QEmwADpRAEWwADpVYTAAOlMwElPqIX/wABIOGDAAGDxScAA6WUlwADpb4XAAOlpwElP/GDAAGEUPgJJwADqbCEcwADqdxTAAOpxwElP/AUBYMAAYRS1EAAAAADAAGEkSsAA6oMBKz9KwADqmAEcwADqp4LAAOqfwElOySABAAEkwADquwEWwADqsRTAAOqrwElP/AUBYMAAYRSpVMAAYRYAAD9JwADqzCXAAOrWhcAA6tDASU/8YMAAYUY+AUrAAOr2ARzAAOsFgsAA6v3ASU7JIAEAASMWwADrDBTAAOsGwElP/AUBYMAAYUac58AAYUsnlrMnnSgBYMAA/bYAAD9JwADrOSXAAOtDhcAA6z3ASU/8YMAAYPo+AUrAAOtjARzAAOtygsAA62rASU7JIAEAASeEPAAAP0nAAOuKJcAA65SFwADrjsBJT/xgwABhLj4BSsAA7E4BHMAA7F2CwADsVcBJTskgAQABJMAA7HQBFsAA7GcUwADsYcBJT/wFAWDAAGEuqovAAGEwAAA/SsAA7IUBK0/AAOydwADsqgAAAaVIYQBgwABFYQADwADstcAA8vkAAAAAAAAAYMAARWEBPgdJwADt+xbAAO4nHMAA7gWBwADt/8BJTkWzWwEA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SWKwBwFgwABKvYJRwABFZ0sBAAEUwAEREcBJY1UIAADAAPyDAAA/PgI9HMABEiWGwAESD8BJYfYgAAAAAABKwAESMQEcwAESSYXAARI4wEleDyACAAIWwAESXhTAARJXwElcMwMBYMAARj2WIMAARj80wAESwQPAARLBwAES8AAAAAEBAcABEsYAAABiYMAA+9AAAGDAAEg2AUrAARLMARzAARLTFsABEswuwABfMcAAkTrAAJFbuJ8BAAEWwAES4y61ZcAAkTrAAJFYAMAARJcAAD9JwAEURhbAARRPgMABFErASVu6uZPAAEqjPgJJwAEU1SEcwAEU2i7AAF9wAQABgsABFQHASVv6AMAAkZE+AUrAARUaAR/AARUlwABKsAMAA4HAARVWwElb04PAARVgwElcMxbAARVtgMABFWjASVu6uSvAAEWhAD9JwAEWuRbAARcOHMABFt0WwAEWvS7AAFM0wACROsAAkV+1DgEAARbAARbyg8ABFuvASVwzuSvAAEWhAL4QtNW9uz4BSsABFysBH8ABFzbAAEqwAwADgcABF2fASVvTg8ABF3HASVwzFsABF36AwAEXecBJW7q5K8AARaEAPz9KwAEXowGAwAEXqsBJW7oGwACRlIGXwAEXt8ABF9DAARhzAAC4ewFqwAEXuGDAAP0cAgAAAQPAARfdwAEYcwAAAAEBAcABF+gAAACD7mDAAEshAABgwABFYQE+AknAARf0HsABGAPAAIWCAgACFsABGBOAwAEYDsBJZY66RsAASyQWwAEYKIDAARgjwElljrrFwABLIwA+AUrAARg/ARbAARhSFsABGEuAwAEYRsBJZY6CUcAARWeAw8AA/Fo/SsABGGQBgMABGGvASWWOBsAAkZWBl8ABGHjAARiRwAEbfwAAuHYBasABGHlgwAD9HAIAAAEDwAEYncABG38AAAABAQHAARinAAAAg+5gwABK2wAAYMAARWEBPgRJwAEYsxzAARi8gMABGLfASWZMul8BAAEWwAEYyC61ZcAAkTrAAJFYAMAASulKwAEY1wEWwAEY44DAARjewElmTLjrwABK4j9OwAEZPMABGUYAALq1YMAARWEBFsABGU2AwAEZSMBJZky6tcAASuFJwAEZXCXAARlqgcABGWDASWatYMAASw0+A07AARmJwAEZkgAAuq9gwABiTwEWwAEZnhTAARmUwElmrQEBYMAASw26RsAASw9OwAEZwcABGdIAAMAAX3xgvLcBHsABGebAAK24AwADgsABGf3ASWbuFsABGgyAwAEaB8BJZkyF18AASt8WwAEaJhbAARoZLrVlwACROsAAkViy+8AATRcAScABGj0hHMABGlKDwAEaQcBJZxxIAQABKwDAAP0pPgJOwAEagMABGowAAKzeYL3OARzAARqvFsABGpouwABTNMAAkTrAAJFftPEBAAGCwAEaxMBJZu4AvfJKwAEa1wEfwAEa3sAASv4GAAYWwAEa8oDAARrtwElmTLjrwABK4oLAARsAwElm7oTAARsKwElnlBbAARsogMABGyPASWZMhdfAAErfg8ABGzXASWccFsABG0yAwAEbR8BJZky5K8AARaEAPz9KwAEbcAGAwAEbd8BJZkwGwACRloGXwAEbhMABG53AARwcAAC4dwFqwAEbhWDAAP0cAgAAAQPAARuvwAEcHAAAAAEBAcABG78AAACD7mDAAErtAABgwABFYQE+AknAARvLHMABG9SAwAEbz8BJaHy6XwEAARbAARvgLrVlwACROsAAkVgAwABK+ErAARvvARbAARv7gMABG/bASWh8uOvAAEr0P0rAARwNAYDAARwUwElofAAASMfsAEjILABIyHIASMi6AEjJJQBIzCgASNVyAEjWPgBI1voASNfEAEjYDgBI2P0ASNosAEjcAABI3dsASN6zAEjf6wBI5L8ASO3rAEjyqgBI/b0ASQOlAEkFLQBJBsQASQiYAEkKcABJC8AASQw2AEkSDwBJEtcASRPoAEkWxgBJHhcASSDMAEkhcABJIhQASSKzAEkj1gBJJeEASSqzAEktLwBJNAgASTXCAEk7VQBJPcEASUWkAElIkgBJTfcASVS4AElVJgBJVj4ASVuFAEllWQBJZhcASWhHAElo6wAAADcCwACRmYGXwAEcIcABHCfAASnCA8AAX30AAAFgwABEoAABYMAAkT0FBMAAkZuBl8ABHIbAARyTCcAAXyYAXcAA/WcBYMAARWEABMAAkZyBl8ABHKLAARyxCYLJAGDAAPoKAATAAJGdgZfAARzIwAEc0wmkzABgwABNDwAEwACRnoGXwAEc8MABHQkJgL0BasABHNhgwAD9HAJgwAD9tgEnwABffQTAAJGfgZfAAR0UwAEdGRikCgBgwABEfAErAQXAAJGrgZfAAR0ewAEdHsABHWoAAAADwAEdLsABHWoAAAADAwPAAR00AAAEgslgwAD6CgDAAR1KAAAEpMxgwABNDwDAAR1cAAAEwABfJl3AAP1nAWDAAEVhAABgwACRmQE/BAgBwACRnIAAwElqtAgBwACRnYEAwElqwwgBwACRm4IAwElq0gkBwAEdHsAARQwAAAAABwbAAJGigZfAAR1vwAEdh8ABHcQBAMAAUzTAAJE6AAAAAQPAAR2cwAEdxAAAAAAAAABgvdYBSsABHaUBFsABHbEWwAEdpS6kzMAAkZ2weMAATRgGwACRpIGXwAEdycABHdrAAR8JAAC4qwFqwAEdymDAAP0cAgAAAQPAAR3kwAEfCQAAAAEBAcABHewAAACkCmDAAER8AABcAT4DPRfAAR3+LqQKgMABHgbASWuswACRn0nAAR7KFsABHs4ugsnAAJGcSsABHt8APz0cwAEe7C64fgEAAYDAAR7/wElrrADAAERnBsAAkaWBl8ABHw7AAR8fwAEgDgAAuIABasABHw9gwAD9HAIAAAEDwAEfLsABIA4AAAABAQHAAR87AAAAmfdgwABFKgAAXAE+Ak7AAR9VwAEfYQAAuIhgwABFYQEWwAEfaYDAAR9jwElsPYMZwABFHEPAAR90IRzAAR+HgcABH3vASWxSSAEAASsAwAD9KT4DTsABH6XAAR+qAACDsGDAAEVhARbAAR+4gcABH6zASWxSg7DAAEVrPYnAAR/EwElsUibAAR/EARzAAR/egcABH9LASWxShE0BAAEuAMAARdNgwABFYT2JwAEf8sBJbFKCwAEgAMBJbJkGwACRpoGXwAEgE8ABICDAASW8AADAAF9+AAAAAQPAASAxwAElvAAAAAMDA8ABIEYAAADAAF9/YMAARWEAwAEgXgAAAJ/IYMAARWEAwAEgcgAAAMAAX4BgwABFYQAAYMAARhsBPghOwAEgksABIJkAAGFgwABG6AEfwAEgn8AARvcDAAKBwAEgs8BJbT0WwAEg2hbAASDGFsABILoupMzAAJGdsHjAAE0YtOm96QGrPiEewAEhAsAAkTwCAAIWwAEhFoHAASEQwEltPbkrwABFoRbAASEnLqTMwACRnQA9HMABIUoWwAEhRIDAASE6wEltLJn3wABFabjjAgACgMABIVTASW0sg8ABIV/ASW1nAMAARU9OwAEhe8ABIYAAAIKQYL3LASMWwAEhwBzAASGYgsABIYrASW1MtRIBAAEWwAEhqi7AAFM0wACROsAAkaIAwABFv7PxvbkWwAEh7YLAASHfwEltTLkrwABFoRbAASIrFsABIhcWwAEiCy6kzMAAkZ2weMAATRi06b3pAWC9y07AASJNwAEiUwAAo5lgwABGGwE1wAEiWQAAAQBgwABGGwEfwAEiWcAARi8EAASCwAEiZsBJbUyDwAEidcBJbWeBwAEifcBJbT2EwAEihMBJbhUANQAAAAEAWwEXwAEikoXAASKQwElupaVOFsABIrCAwAEipsBJbSylTsAARWTAAEVkhQDASW6lPRzAASLXFsABItGAwAEix8BJbSyZ98AARWm44wIAAoDAASLhwEltLIXAASLswElukgDAAEVPScABJPYWwAElKBzAASUIgsABJPrASW1MtQ8BAAEWwAElEi7AAFM0wACROsAAkaIAwABFvLTWvbw+AT0cwAElUoLAASVEwEltTLlIAgACgMABJW3ASW0shcABJXjASW6SAMAARdo/PRzAASWYFsABJYouwABfJsAAkZtWAQABgMABJZzASW0sAMAA/XRKwAElrAGFwAEls8BJbpIGwACRp4GXwAElwcABJdLAASZ8AAC4RQFqwAElwmDAAP0cAgAAAQPAASXcwAEmfAAAAAEBAcABJeQAAACD7mDAAEkhAABcAT4DScABJfAcwAEmAhbAASX0LsAAXybAAJGbgxcBAAGAwAEmC8BJcCAAwAD9c0rAASYSAD9OwAEmK8ABJjEAACdgwABFYQEWwAEmOIDAASYzwElwICfAAEkvPYnAASZDwElwZxzAASZLLsAAX34DAAOAwAEmXcBJcCAWwAEmaIDAASZjwElwIIV5wABJLoHAASZywElwZwDAAJGmBsAAkaiBl8ABJoHAASaSwAEnSAAAuEYBasABJoJgwAD9HAIAAAEDwAEmosABJ0gAAAABAQHAASawAAAAg+5gwABJMwAAXAE+A0nAASa8HMABJs4WwAEmwC7AAF8mwACRm4MXAQABgMABJtfASXECAMAA/XNKwAEm3gA/TsABJvfAASb9AAAnYMAARWEBFsABJwSAwAEm/8BJcQInwABJPj2JwAEnD8BJcUkcwAEnFy7AAF9+AwADgMABJynASXECFsABJzSAwAEnL8BJcQKFecAAST2BwAEnPsBJcUkAwACRpgbAAJGpgZfAASdNwAEnXsABKcAAALhKAWrAASdOYMAA/RwCAAABA8ABJ3bAASnAAAAAAQEBwAEnjAAAAIPuYMAARnsAAFwBPghOwAEnpcABJ60AAJYgYLy3ARbAASe0gMABJ6/ASXHkliDAAEZlScABJ8EWwAEnyoDAASfFwElx5LmLwABGVkrAASfdAD9JwAEn6SEcwAEn9YHAASftwElx+UgBAAEWwAEoExbAASgEFsABJ/gupMzAAJGdsvvAAE0XsZq5MgDAAP0pSsABKCYAP0nAASgyHMABKEQWwAEoNi7AAF8mwACRm4MXAQABgMABKE3ASXHkAMAA/XNKwAEoVAA/TsABKNzAASjiAACjmWDAAEYbARzAASjkLsAAX34DAAOAwAEo/8BJceQWwAEpCoDAASkFwElx5IV5wABGaBzAASkaFsABKRQupArAAJGfuJkCAAKTFsABKSwupMzAAJGdAMAARJEAwACRpk7AASlMwAEpVQAAwABfgWDAAEVhARzAASldFsABKVcupArAAJGfuJkCAAIcwAEpbJSBxAAAAADAAPvzFsABKXAupMzAAJGdAMAARJE9HMABKY8WwAEpiILAASmCwElytIJRwABFZ1YBAAGDwAEpk8BJcx4AwAD8hT0cwAEpshbAASmrg8ABKaLASXMeuMbAAEVoVgEAAYLAASm2wElytADAAPyFAABJayUASWt3AElsCABJbQAASW/rAElwzQBJca8ASXPBAAAABwLAAJGsgZfAASnFwAEpy8ABWWoDwABfggAAAWDAAERlAAFgwACRPQgEwACRroGXwAEqMcABKk8JgL0BasABKhlgwAD9HAJgwAD9tgEnwABfggTAAJGvgZfAASpnwAEqcgmkzABgwABNDwAEwACRsIGXwAEqjcABKpYJwABFRwBgwACRRAAEwACRsoGXwAEqocABKqcYwABfMcAAkToAYMAARHwBKwTAAJGzgZfAASrAwAEqyBic2wBgwACRzQErBMAAkbSBl8ABKuTAASsmGMAAX4MAXcAA/KUCYMAARWFgwAD6CgEfwAErCpRMAAJgwABFYWDAAPoKAAAEwACRtYGXwAErL8ABK0wYwABfLABgwAD6CgEqBMAAkbaBl8ABK/TAASwHGMAAX4QAYMAARWEBKwEFwACRzIGXwAErUcABK1HAASuIAAAAA8ABK2bAASuIAAAAAgICwAErbAAABKTMYMAATQ8AwAErfgAABMAARUdgwACRRAAAYMAAkawBPwMIAcAAka+AAMBJdT4IAcAAkbCBAMBJdU0JAcABK1HAAERrAAAAABEGwACRuYGXwAErjcABK6XAASviAQDAAFM0wACROgAAAAEDwAErusABK+IAAAAAAAAAYL3WAUrAASvDARbAASvPFsABK8MupMzAAJGvsHjAAE0YBsAAkbqBl8ABLAvAASwcwAEtUgEAwABfhQAAAAEDwAEsK8ABLVIAAAAAAAAAYMAARWEBPgJJwAEsMRzAASxJFsABLDUuwABfhMAAkbZIAQABKwDAAP0pPgJOwAEsrsABLLcAAIX/YMAAYLsBasABLL9gwABiAMAA7IA9F8ABLOEuwABfhBzAAS0GFsABLQAWwAEs9y6c28AAkbOkCsAAkc+peQIAAoDAAS0SwEl2OhbAAS0cLqTMwACRrwDAAESPwACRtj9KwAEtNAEWwAEtOy7AAF+EwACRtgbAAJG8gZfAAS3awAEt38ABLt4AAMAAX4YAAAABA8ABLfbAAS7eAAAAAgICwAEuBAAAAMAAVGtgwABHMgDAAS4aAAAAhXlgwABFYQAAYMAA+goBPgRJwAEuKhzAAS5EFsABLj0WwAEuNoDAAS4uwEl25YJRwABFZ2HAAPyjYwEAAZQAwAD8/UrAAS5JASo/ScABLlshHMABLnQWwAEubhbAAS5ngMABLl/ASXblglHAAEVngxnAAPxYSAEAAYHAAS53wEl29gDAAP0pSsABLoEBKj9JwAEukxbAAS6tFsABLp+AwAEul8BJduW5z8AARzfAAEmFwABmp0rAAS69ASk/SsABLs4BKgbAAJG9gZfAAS+VwAEvmsABNYQAAMAAX4cAAAABA8ABL7HAATWEAAAAAQEBwAEvvwAAALiIYMAARWEAAGDAAPoKAT4ETsABL9/AAS/oAACFeWDAAEVhARzAAS/2gMABL+rASXftuTgBAAEWwAEwBi6kzMAAka8AwABFy07AATAlwAEwLQAAXmDAAEVhARbAATA7gMABMC/ASXftg7DAAEVrRMABMEU+BknAATBQIhzAATB6HMABMF2CwAEwVcBJeD25OAEAARbAATBtLqTMwACRrwDAAEXLSAEAAYHAATB9wEl4BgDAAP0pABzAATCcgsABMJTASXg9uTMBAAEWwAEwpS7AAFM0wACROsAAkbkAwABFrD4BSsABMMYBKT9JwAEw4SIlwAEw7YLAATDlwEl4PWDAAEcyABzAATEKLsAAX4YCAAIUwAExIsBJeD0CAWDAAEcygcABMSvASXgGAMAAkbw+AUrAATFAASk/ScABMVsiHMABMWeCwAExX8BJeD25MwEAARbAATFwLsAAUzTAAJE6wACRuQDAAEWsARzAATGnFsABMZuCwAExk8BJeD20BcAARWy5MQAAAADAAHfdPgFKwAExwwEqP07AATHswAEx8QAAg7BgwABFYQEWwAEx+4LAATHzwEl4PYOwwABFa0nAATIHHMABMhCDwAEyC8BJeY1IAQABKwDAAP0pPgNOwAEyywAAAMAAVWNgwABFKgBJwAEy3iXAATLqgsABMuLASXg9YMAAR+8+AT2MwAEzAMBJedMWwAEzJRbAATMaFsABMxQUwAEzDMBJeD0CAWDAAEfvmffAAEVpuNDAAEU3gMPAAPxaScABMzwlwAEzSILAATNAwEl4PWDAAEggPgJOwAEzsMABM7oAAIW0YMAARWEBFsABM8sWwAEzxBTAATO8wEl4PQIBYMAASCCCUcAARWeDGcAA/FhJwAEz3CXAATPqhcABM+DASXpUYMAASDY+A07AATQLwAE0EgAAugpgwAD6CgEWwAE0JxbAATQeFMABNBTASXpUBQFgwABINoX/wABIOLoKwABgwD2MwAE0O8BJedMjhsABNEfASXqnFsABNFgUwAE0UMBJeD0CAWDAAEgguf3AAEgnFsABNGwUwAE0ZMBJeD0CAWDAAEgguf7AAEgoAWDAAEUqQCEcwAE0lBbAATSLLpzbwACRs8AAX4gBAAGEwAE0oMBJedMAwACR2cABNIrAATSqAD8/ScABNMsiIRzAATTZhMABNM/ASXnTSAEAASsAwAD9KQAcwAE08RbAATTuhMABNOTASXnTs1XAAEUsgJcBAAEWwAE1ARbAATT7gsABNPPASXg9mffAAEVps1XAAEUsAMAA/P8+AT2LwAE1EcBJeY0WwAE1IoTAATUYwEl504MZwABFHD8/PYrAATVBwEl4PYPAATVLwEl5jSEcwAE1ZoLAATVewEl4PUgBAAErAMAA/SlKwAE1dAEqBsAAkb6Bl8ABNYnAATWOwAE5ZwAAwABfiQAAAAEDwAE1qMABOWcAAAABAQHAATW2AAAAuIhgwABFYQAAYMAA+goBPgJPwAE2pMABNqkAAAHAAF+KYQFgwABFYWDAAPoKAAPAATaywAE4fQAAAAEBAcABNsAAAACu8GDAAEVhAABgwAD6CgE+AknAATbNJcABNtWCwAE20cBJfIlgwABG3D4BScABN4scwAE3sBzAATeTFMABN4/ASXyJAgFgwABG3Lk4AQABFsABN6MupMzAAJGvAMAARt9IAQABgMABN7PASXxFAMAA/SlKwAE3wAEpP0nAATfaJcABN+KCwAE33sBJfIlgwABGyz4CQBzAATgiHMABOAUUwAE4AcBJfIkCAWDAAEbLuTgBAAEWwAE4FS6kzMAAka8AwABG0UgBAAGAwAE4JcBJfEUAwAD9KcABOAHAATgwAEnAATg7HMABOD8uwABfiwEAARTAAThKwEl8iQIBYMAARssAwACRwErAAThQASk/P0rAAThrASpKwAE4hAEiIhzAATiXgMABOIvASXxFuTQBAAEWwAE4pC7AAFM0wACROsAAkbkAwABFqgAcwAE40YDAATjFwEl8RbkwAQABFsABONguwABTNMAAkTrAAJG5AMAARakAHMABORMWwAE4+S7AAF+DwACRtJkVAgACgMABOSzASXxFNMABOTkDwAE5OcABOWIAAAAAAAAAYMAA+goBSsABOT8BHMABOVIWwAE5S4DAATk/wEl8RbjGwABFaJYwAQABgcABOVjASXxiAMAA/EUAwAD8wAbAAJG/gZfAATlswAE5ccABOhcAAMAAX4wAAAABA8ABOYPAAToXAAAAAQEBwAE5kQAAALiIYMAARWEAAGDAAPoKAT4BSsABOaQBIiXAATm3gMABOavASX6kYMAARtwAHMABOc8uwABfiQEAARzAATn2FMABOerASX6kAAFgwABG3Lk4AQABFsABOgYupMzAAJGvAMAARt8AwACRvgbAAJHAgZfAATocwAE6IcABPN8AAMAAX4sAAAABA8ABOivAATzfAAAAAQEBwAE6OQAAALiIYMAARWEAAGDAAPoKAT4HScABOkwhFsABOmQWwAE6XYDAATpRwEl/QLjGwABFaIFVwAD8VkrAATptASo/ScABOn8cwAE6gy7AAF+MAQABgMABOpbASX9A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EfwDwAIR/MACEwcAAAACAgLAAhH9AAAAhXlgwABFYQDAAhIHAAAAgJZgwABFYQAAYMAA/NkBPgJOwAISJcACEjEAALiIYMAARWEBHMACEjMuwABf5gQABBTAAhJWwEoheAgAHMACEmiGwAISXcBKINNLAQABh8ACEmnASiFpAMAA/LmBwAISdMBKHB2CwAISe8BKHCwAwACSdknAAhKWIRzAAhKmFMACEprASiGRCQBIAQABKwDAAP0pPgE9HMACEsKDwAISu8BKHEfAAF/OAwADhMACEtXASiChh8ACEt7ASiFpFMACEujASiGRCQAAwACScD8AwAD8xADAAPzEPRzAAhMjFsACExcuwABf28AAkmKD+AEAATTAAhMrA8ACEyvAAhS8AAAAAgICwAITLAAAAIV5YMAARWEAwAITNgAAACldwAD8pQJgwABFYWDAAEVhAABgwAD82QE+A07AAhNKwAITVgAAwABf613AAPylAmDAAEVhYMAARWEBHMACE2kWwAITXoDAAhNYwEocDsAAX9vAAJJiSwEAAYTAAhNqwEoihADAAPy5ScACE3scwAITi4bAAhN/wEoitkgBAAErAMAA/SlKwAITlAA/PRzAAhOphcACE6LASiKTg/gBAAE0wAITsQPAAhOxwAIUtAAAAAICAsACE7IAAAAnYMAARWEAwAITuQAAAICWYMAARWEAAGDAAPzZAT4CTsACE9fAAhPjAAC4iGDAAEVhARzAAhPlLsAAX+YEAAQUwAIUCMBKI1wIABzAAhQahsACFA/ASiK2SwEAAYfAAhQbwEojTgDAAPy5gcACFCPAShwdgsACFCrAShwsAMAAknZJwAIURSEcwAIUVRTAAhRJwEojdQkASAEAASsAwAD9KT4BPRzAAhRxg8ACFGrAShxHwABf1wMAA4TAAhSEwEoihIfAAhSOwEojThTAAhSVwEojdQkAAMAAknQ/AMAA/MQAwAD8xD0cwAIU2RbAAhTELsAAX9zAAJJjg/gBAAE0wAIU4QPAAhThwAIVaQAAAAEBAcACFOIAAACFeWDAAEVhAABgwAD82QE+AUnAAhT0HMACFRMWwAIU/oDAAhT4wEocDsAAX9zAAJJjgxcBAAGEwAIVHMBKJGgAlHw+AT0cwAIVTRbAAhU4g8ACFTHAShxHwABf3MAAkmNWAQABhMACFVHASiRo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hy5dwACTHAJfAABfAQAAwABBtwAAAIVwXwEAAABcAAbAAJO5gKHAAEJLwABCUMAAQlgAAq+AwACSewAAAAEDwABCVsAAQlgAAAAAAAAAYMAAk6wABsAAk7qAocAAQsLAAELHwABEJAAAr1gAAAABA8AAQtzAAEQkAAAAAQEBwABDBAAAAKVOYMAAk6kAAGDAAJOsAT4EScAAQx0cwABDM4DAAEMhwEp9PkgBAAEWwABDNi7AAGABwACSe8AAk68AwAD9KT4BSsAAQ1IBLj9OwABDbsAAQ3QAAJ6rYMAAk6wBHMAAQ3Yur4DAAJJ7AAAAAMAAk7k9F8AAQ+iBwABD4sBKfY/AAGABwACSe4DAAEP9wEp9PsAAk69KwABEFAGBwABEG8BKfY8GwACTu4ChwABEKcAARDXAAERMAADAAGACAAAAAQPAAERCwABETAAAAAAAAABgwACVrgFKwABESAErBsAAk7KAocAARFHAAERawABEcgEAwABelwAAAAEDwABEasAARHIAAAAAAAAAYMAA+goBSsAARG0BKgbAAJO8gKHAAER3wABEgcAARMIAAMAAYAMAAAABA8AARIzAAETCAAAAAAAAAGDAAJPMAT4BPTDAAESVH8AARJ/AAPtiAQABJ8AAYAMABsAAk72AocAARMfAAETOwABE7gAArqoAAAABA8AARNjAAETuAAAAAAAAAGDAAP22AUrAAETeAR7AAETewACSjgEAAS4AAABKey4ASnt3AEp7xABKfA8ASnx3AEp83wBKfRQASn3oAEp+IgBKflwASn6pAEp+7gAAAAsCwACTwIChwABE88AARPnAAEcZA8AAXLcAAAFgwACTrAAAAQTAAJPCgKHAAEUowABFLAmCaQBdwAD8dAFgwACTzAABBcAAk8uAocAARTDAAEUwwABFQgAAAAPAAEU3wABFQgAAAAEBAcAART0AAASCaV3AAPx0AWDAAJPMAABgwACTwAE/AggBwACTwoAAwEp/iwkBwABFMMAAk78AAAAABQbAAJPEgKHAAEVHwABFScAARYgAAIRNAAAAAQPAAEVSwABFiAAAAQAAgnZgwAD9HAFbAQEBwABFYgAAAIcuXcAAko8BXwAAAABfAAABSsAARW4BHMAARXaAwABFbsBKf/mwbwEAAS4AwACSkQbAAJPFgKHAAEWNwABFj8AARegA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wABNOgAAhW8AAAABA8AATOfAAE06AAACAACW82DAAP0cAVsAAIPUYMAA/RwBWwICAsAATPsAAACHLl3AAJMcAl8AAF8BAADAAE0GAAAAhXBfAQAAAF8AAAFKwABNFAEcwABNHIDAAE0UwEqLAYYXAgACLoHAAE02wEqLFwDAAJMhBsAAk+6AocAATT/AAE1EwABNbgAAhE4AAAABA8AATVTAAE1uAAABAACCdmDAAP0cAVsBAQHAAE1kAAAAhy5dwACSjwFfAAAAAFwBPgAGwACT74ChwABNc8AATXjAAE2xAADAAGAAAAAAAQPAAE2MwABNsQAAAgAAlvNgwAD9HAFbAACD1GDAAP0cAVsCAgLAAE2gAAAAhy5dwACTHAJfAABfAQAAwABNqwAAAIVwXwEAAABcAT4ABsAAk/GAocAATbbAAE3FwABN5QAAr4DAAJJ7AAAAAQPAAE3LwABN5QAAAAAAAABgwACT6gFKwABN0QEfwABN1cAAk/MAAAAAAABKilUASorBAEqLUQBKi54ASowIAEqMUAAAAAUCwACT9IChwABN6sAATfDAAFEjA8AAYAQAAAFgwACTzAAAAwTAAJP2gKHAAE4awABOIwmFtABgwACU4wAEwACT94ChwABON8AATjsJga0AYMAAk8wABMAAk/iAocAATk/AAE5YCYW1AGDAAJPMAAIFwACUA4ChwABOXcAATl3AAE6KAAAAA8AATl/AAE6KAAAAAwMDwABOZQAABIW0YMAAlOMAwABOdQAABIGtYMAAk8wAwABOgAAABIW1YMAAk8wAAGDAAJP0AT8ECAHAAJP2gADASo0BCAHAAJP3gQDASo0QCAHAAJP4ggDASo0fCQHAAE5dwACT0AAAAAAFwACUBIChwABOj8AATo/AAE7bAMAAYAUAA8AATpjAAE7bAAAAAgICwABOngAABIW0YMAAlOMAwABOrgAABIGtYMAAk8wAAGDAAJP0AT8ECAHAAJP2gADASo2RCAHAAJP3gQDASo2gCADAAJP4H8AATsvAAJPzAAAAAAkBwABOj8AAk9AAAAAABgbAAJP6gKHAAE7gwABO6cAATxABAMAAYAYAAAABA8AATvHAAE8QAAAAAAAAAGDAAPoKAUrAAE70ASElwABO/hbAAE70LoW1wACT+GDAAJPqBsAAk/yAocAATxXAAE8XwABP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ocAArK3AAKy7wACs6AAAr4DAAJJ7AAAAAQPAAKzBwACs6AAAAAAAAABgwACV0gFKwACsxwEfwACsy8AAleACAAIWwACs2S6AvcAAldQWwACs3y6CasAAldUABsAAld6AocAArO3AAKz1wACtFgEAr4wAAAABA8AArQXAAK0WAAAAAAAAAGDAAPvQAUrAAK0IAWrAAK0IYMAA+9DAAIPBAABLDfcASw5jAEsO8wBLD5AASxBiAEsQwgBLEQcAAAAGAsAAleGAocAArRvAAK0hwACwJAPAAGAnAAABYMAAlOMAAAMEwACV44ChwACtUsAArVgJg+8AXcAA/HQBYMAAlcIABMAAleSAocAArWjAAK1sCYJpAGDAAJPRAATAAJXlgKHAAK2EwACtkQmhHABgwACV8QABBcAAlfCAocAArZbAAK2WwACt2wAAAAPAAK2ZwACt2wAAAAMCAsAArZ8AAASD713AAPx0AWDAAJXCAMAArawAAASCaWDAAJPRAAHAAK24AAAEoRxgwACV8QFqwACt1WDAAJXxwADiT2DAAJXhAT8ECAHAAJXjgADASxHCCAHAAJXkgQDASxHXCAHAAJXlggDASxHnCQHAAK2WwACU6QAAAAAGBsAAleeAocAAreDAAK3iwACuHQAAhE0AAAABA8AArevAAK4dAAABAACCdmDAAP0cAVsBAQHAAK37AAAAhy5dwACSjwFfAAAAAF8AAAFKwACuBwEcwACuD4DAAK4HwEsSdLBKAQABLgDAAJK3BsAAleiAocAAriLAAK4kwACueQAAhW8AAAABA8AArjHAAK55AAACAACW82DAAP0cAVsAAIPUYMAA/RwBWwICAsAArkUAAACHLl3AAJMcAl8AAF8BAADAAK5QAAAAhXBfAQAAAF8AAAFKwACuXgEcwACuZoDAAK5ewEsS67BKAgACLoHAAK51wEsTAQDAAJNEBsAAlemAocAArn7AAK6DwACvBQAAhE4AAAABA8AArpPAAK8FAAABAACCdmDAAP0cAVsBAQHAAK6jAAAAhy5dwACSjwFfAAAAAFwBPgJGwACusgDAAK7BAAAAmRFgwACVwgAWwACuyi6D78AAleM9HMAArtiBwACu0sBLE46ETQEBXwAAAYDAAK7fwEsTcADAAJXEPRzAAK7yFsAAru0ugmnAAJXkhE0BAV8AAAGAwACu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AAEDwADRisAA0c8AAAAAAAAAYMAAlokBSsAA0ZYBH8AA0ZrAAJaXAgABFsAA0awusDrAAJaLAbA7FsAA0cQusDvAAJaMBsAAlpWAocAA0dTAANHcwADR9gEAr4wAAAABA8AA0ezAANH2AAAAAAAAAGDAAPvQAUrAANHvAWrAANHvYMAA+9DAAIFyAABLODAASzicAEs5LABLOb8ASzp7AEs63QBLOyIAAAAGAsAAlpiAocAA0fvAANIBwADUfAPAAGA1AAABYMAAk6wAAAIEwACWmoChwADSLMAA0jAJgL0AYMAAlOMABMAAlpuAocAA0kXAANJKCYCWAGDAAJTjAAEFwACWpIChwADST8AA0k/AANKsAAAAA8AA0lfAANKsAAAAAgICwADSXQAABIC9YMAAlOMAwADSaAAABICWYMAAlOMAAGDAAJaYAT8ECAHAAJaagADASzu+CAHAAJabgQDASzvNDABAIiXAANKDgMAA0n7ASzu+YMAAljMBJcAA0paAwADSkcBLO75gwACWK8AA0n7AANKrAAkBwADST8AAk78AAAAABQbAAJadgKHAANKxwADSs8AA0vMAAIRNAAAAAQPAANK8wADS8wAAAQAAgnZgwAD9HAFbAQEBwADSzAAAAIcuXcAAko8BXwAAAABfAAABSsAA0tgBHMAA0uCAwADS2MBLPHWwOAEAAS4AwACSxQbAAJaegKHAANL4wADS+sAA01QAAIVvAAAAAQPAANMHwADTVAAAAgAAlvNgwAD9HAFbAACD1GDAAP0cAVsCAgLAANMbAAAAhy5dwACTHAJfAABfAQAAwADTJgAAAIVwXwEAAABfAAABSsAA0zQBHMAA0zyAwADTNMBLPOywOAIAAi6BwADTUMBLPQIAwACTUgbAAJafgKHAANNZwADTXsAA08AAAIROAAAAAQPAANNuwADTwAAAAQAAgnZgwAD9HAFbAQEBwADTfgAAAIcuXcAAko8BXwAAAABcAT4CPRzAANOSFsAA040ugL3AAJaahE0BAV8AAAGAwADTmcBLPXEAwACTtD0cwADTrRbAANOnLoCWwACWm4RNAQFfAAABgMAA07TASz1xAMAAk7QGwACWoIChwADTxcAA08rAANRHAADAAGAAAAAAAQPAANPewADURwAAAgAAlvNgwAD9HAFbAACD1GDAAP0cAVsCAgLAANPyAAAAhy5dwACTHAJfAABfAQAAwADT/QAAAIVwXwEAAABcAT4CPRzAANQNFsAA1AgugL3AAJaahW8CAl8AAF8BAAKAwADUFcBLPhuBwADUHsBLPjEAwACTtj0cwADULhbAANQoLoCWwACWm4VvAgJfAABfAQACgMAA1DbASz4bgcAA1D/ASz4xAMAAk7YGwACWooChwADUTMAA1FXAANR6AACvgMAAknsAAAABA8AA1FvAANR6AAAAAAAAAGDAAJaYAUrAANRhAR/AANRlwACWpAIAAhbAANRuLoC9wACWmhbAANR0LoCWwACWmwAAAEs8QABLPKwASz08AEs92QBLPqsASz8LAAAABQLAAJalgKHAANStwADUvMAA1VkHwABgNgAAAWDAAP0cAAFgwACTrAABBcAAlqsAAAAABAAAAwAAAAAAAAAAAGDAAJalAT8BCQEAwAD9MgAAAAADBsAAlqeAocAA1OHAANTlwADU8wECwABGTwAAAAEDwADU88AA1PMAAAAAAAAAWwAGwACWqIChwADU+MAA1QHAANUkAQCjrQAAAAEDwADVCcAA1SQAAAAAAAAAYMAA+goBSsAA1QwBJcAA1RsWwADVDC7AAEZPwACWp2DAAP22BsAAlqmAocAA1SnAANUywADVVwEAvp8AAAABA8AA1T/AANVXAAAAAAAAAGDAAPoKAUrAANVCASXAANVRFsAA1UIuwABGT8AAlqdgwAD70AAASz97AEs/qgBLP/kAS0BIAAAAAwLAAJasgKHAANVcwADVYsAA16Y3wABgNwAAAWDAAJTjAAFgwACWpQABBcAAlrIAAAAABAAAAwAAAAAAAAAAAGDAAJasAT8BCQAAwACU6QAAAAADBsAAlq6AocAA1OHAANTlwADU8wECwABGTwAAAAEDwADU88AA1PMAAAAAAAAAWwAGwACWr4ChwADU+MAA1QHAANUkAQCjrQAAAAEDwADVCcAA1SQAAAAAAAAAYMAA+goBSsAA1QwBJcAA1RsWwADVDC7AAEZPwACWp2DAAP22BsAAlrCAocAA1SnAANUywADVVwEAvp8AAAABA8AA1T/AANVXAAAAAAAAAGDAAPoKAUrAANVCASXAANVRFsAA1UIuwABGT8AAlqdgwAD70AAAS0CwAEtA3wBLQS4AS0F9AAAAAwLAAJazgKHAANVcwADVYsAA16YDwABgOAAAAWDAAJasAAABBMAAlrWAocAA1azAANW6CcAARk8AWwABBcAAlsCAocAA1b/AANW/wADV6gAAAAPAANXVwADV6gAAAAEBAcAA1dsAAATAAEZPWwAAYMAAlrMBPwIIAcAAlrWAAMBLQfIJAcAA1b/AAJayAAAAAAYGwACWt4ChwADV78AA1fHAANZFAACETQAAAAEDwADV+sAA1kUAAAEAAIJ2YMAA/RwBWwEBAcAA1goAAACHLl3AAJKPAV8AAAAAXwAAAUrAANYcARzAANYkgMAA1hzAS0JYsDMBAAEuAMAAkskGwACWuIChwADWSsAA1kzAANa0AACFbwAAAAEDwADWWcAA1rQAAAIAAJbzYMAA/RwBWwAAg9RgwAD9HAFbAgICwADWbQAAAIcuXcAAkxwCXwAAXwEAAMAA1ngAAACFcF8BAAAAXwAAAUrAANaGARzAANaOgMAA1obAS0LPsDMCAAIugcAA1rDAS0LlAMAAk1YGwACWuYChwADWucAA1r7AANboAACETgAAAAEDwADWzsAA1ugAAAEAAIJ2YMAA/RwBWwEBAcAA1t4AAACHLl3AAJKPAV8AAAAAXAE+AAbAAJa6gKHAANbtwADW8sAA1ysAAMAAYAAAAAABA8AA1wbAANcrAAACAACW82DAAP0cAVsAAIPUYMAA/RwBWwICAsAA1xoAAACHLl3AAJMcAl8AAF8BAADAANclAAAAhXBfAQAAAFwBPgAGwACWvIChwADXMMAA10fAANd9AACvgMAAknsAAAABA8AA103AANd9AAAAAAAAAGDAAJazAUrAANdTAR/AANdXwACWwAEAARbAANduLsAARk/AAJa1AAbAAJa+gKHAANeCwADXisAA16QBAK+MAAAAAQPAANeawADXpAAAAAAAAABgwAD70AFKwADXnQFqwADXnWDAAPvQwACBcgAAS0IjAEtCjwBLQx8AS0NsAEtD1gBLRCwAS0RxAAAABgLAAJbBgKHAANepwADXr8AA2bE3wABgOQAAAWDAAJYzAAFgwACWpQABBcAAlscAAAAABAAAAwAAAAAAAAAAAGDAAJbBAT8BCQAAwACWOgAAAAADBsAAlsOAocAA1OHAANTlwADU8wECwABGTwAAAAEDwADU88AA1PMAAAAAAAAAWwAGwACWxIChwADU+MAA1QHAANUkAQCjrQAAAAEDwADVCcAA1SQAAAAAAAAAYMAA+goBSsAA1QwBJcAA1RsWwADVDC7AAEZPwACWp2DAAP22BsAAlsWAocAA1SnAANUywADVVwEAvp8AAAABA8AA1T/AANVXAAAAAAAAAGDAAPoKAUrAANVCASXAANVRFsAA1UIuwABGT8AAlqdgwAD70AAAS0TlAEtFFABLRWMAS0WyAAAAAwLAAJbIgKHAANepwADXr8AA2bEDwABgOgAAAWDAAJbBAAABBMAAlsqAocAA1/PAANgBCcAARk8AWwABBcAAltOAocAA2AbAANgGwADYLgAAAAPAANgZwADYLgAAAAEBAcAA2B8AAATAAEZPWwAAYMAAlsgBPwIIAcAAlsqAAMBLRicJAcAA2AbAAJbHAAAAAAUGwACWzIChwADYM8AA2DXAANiAAACETQAAAAEDwADYPsAA2IAAAAEAAIJ2YMAA/RwBWwEBAcAA2E4AAACHLl3AAJKPAV8AAAAAXwAAAUrAANhaARzAANhigMAA2FrAS0aNsDEBAAEuAMAAksoGwACWzYChwADYhcAA2IfAANjsAACFbwAAAAEDwADYlMAA2OwAAAIAAJbzYMAA/RwBWwAAg9RgwAD9HAFbAgICwADYqAAAAIcuXcAAkxwCXwAAXwEAAMAA2LMAAACFcF8BAAAAXwAAAUrAANjBARzAANjJgMAA2MHAS0cEsDECAAIugcAA2OjAS0caAMAAk1cGwACWzoChwADY8cAA2PbAANkgAACETgAAAAEDwADZBsAA2SAAAAEAAIJ2YMAA/RwBWwEBAcAA2RYAAACHLl3AAJKPAV8AAAAAXAE+AAbAAJbPgKHAANklwADZKsAA2WMAAMAAYAAAAAABA8AA2T7AANljAAACAACW82DAAP0cAVsAAIPUYMAA/RwBWwICAsAA2VIAAACHLl3AAJMcAl8AAF8BAADAANldAAAAhXBfAQAAAFwBPgAGwACW0YChwADZaMAA2XzAANmvAACvgMAAknsAAAABA8AA2YLAANmvAAAAAAAAAGDAAJbIAUrAANmIAR/AANmMwACW0wEAARbAANmgLsAARk/AAJbKAAAAS0ZYAEtGxABLR1QAS0ehAEtICwBLSGEAAAAFAsAAltSAocAA2bTAANm6wADcjDfAAGA7AAABYMAAlOMAAWDAAJalAAEFwACW2gAAAAAEAAADAAAAAAAAAAAAYMAAltQBPwEJAADAAJTpAAAAAAMGwACW1oChwADU4cAA1OXAANTzAQLAAEZPAAAAAQPAANTzwADU8wAAAAAAAABbAAbAAJbXgKHAANT4wADVAcAA1SQBAKOtAAAAAQPAANUJwADVJAAAAAAAAABgwAD6CgFKwADVDAElwADVGxbAANUMLsAARk/AAJanYMAA/bYGwACW2IChwADVKcAA1TLAANVXAQC+nwAAAAEDwADVP8AA1VcAAAAAAAAAYMAA+goBSsAA1UIBJcAA1VEWwADVQi7AAEZPwACWp2DAAPvQAABLSNEAS0kAAEtJTwBLSZ4AAAADAsAAltuAocAA2bTAANm6wADcjAPAAGA8AAABYMAAltQAAWDAAJXCAQTAAJbdgKHAANogwADaLgnAAEZPAFsAAQXAAJbqgKHAANozwADaM8AA2l0AAAADwADaSMAA2l0AAAABAQHAANpOAAAEwABGT1sAAGDAAJbbAT8CCAHAAJbdgADAS0oYCQHAANozwACW2gAAAAAIBsAAlt+AocAA2mLAANptwADasgEAgL0AAAABA8AA2nLAANqyAAAAAAAAAGDAAP22AT4BPTDAANp4J8AAYD0GwACW4IChwADat8AA2sDAANrUAQCvewAAAAEDwADazMAA2tQAAAAAAAAAYMAA+goBSsAA2s8BKgbAAJbjgKHAANrZwADa28AA2y4AAIRNAAAAAQPAANrkwADbLgAAAQAAgnZgwAD9HAFbAQEBwADa9AAAAIcuXcAAko8BXwAAAABfAAABSsAA2wYBHMAA2w6AwADbBsBLSvSwLwEAAS4AwACSywbAAJbkgKHAANszwADbNcAA25wAAIVvAAAAAQPAANtCwADbnAAAAgAAlvNgwAD9HAFbAACD1GDAAP0cAVsCAgLAANtWAAAAhy5dwACTHAJfAABfAQAAwADbYQAAAIVwXwEAAABfAAABSsAA228BHMAA23eAwADbb8BLS2uwLwIAAi6BwADbmMBLS4EAwACTWAbAAJblgKHAANuhwADbpsAA29AAAIROAAAAAQPAANu2wADb0AAAAQAAgnZgwAD9HAFbAQEBwADbxgAAAIcuXcAAko8BXwAAAABcAT4ABsAAluaAocAA29XAANvawADcEwAAwABgAAAAAAEDwADb7sAA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HMAAaQMWwABpBS6BscAAl31kAQABlADAAPz1wACXfUnAAGkaHMAAaScWwABpHi6BscAAl31IAQABFsAAaS4WwABpKi7AAEjKwACXf2HAAP26AMAA/PM+BD0XwABpPi7AAGBzasAAaU1gwAD70IGcwACXej0XwABpWS7AAGB0K8AAl3s9F8AAaXEuwABgaxbAAGmALoGxwACXfcAAl3xKwABpkAA/TsAAaabAAGmrAACCk2DAAPvQARzAAGmxFsAAaa0uwABIysAAl3+ECwEAARbAAGm8LoGxwACXfQDAAP3EPRfAAGnLLsAAYGsWwABp2i6BscAAl33AAJd8ScAAaegiHMAAafGAwABp7MBLlqZIAQABasAAaf5gwAD70MAAWFgAwAD88wEcwABqCoDAAGoFwEuWpkgBAAFqwABqF2DAAPvQg+wAwAD88z4CPRfAAGo9LsAAYHNqwABqTGDAAPvQIcAAl3o9F8AAalouwABgdBzAAGpmLsAAYJABAAEWwABqcy6BscAAl30AwACXosAAl3tJwABqiSIiHMAAapKAwABqjcBLlqZIAQABasAAap9gwAD70LMMAMAA/PMAHMAAarocwABqthbAAGqtLoGxwACXfWQBAAGVAMAA/PVjAQABFsAAasAWwABqvC7AAEjKwACXf2HAAP26AMAA/P0AHMAAau8cwABq1hbAAGrSLsAASMrAAJd/hAsBAAEcwABq6hbAAGrhLoGxwACXfWQBAAGUAMAA/PUAwAD9xEgBAAFqwABq/GDAAPvQwACRWADAAPzzPgRBRcAAax4BAAAAAQBgwAD70AEXwABrIy6BsRzAAGssFsAAayMugbHAAJd9ZAEAAZUAwAD89cAAl30BHMAAazsWwABrMi6BscAAl31jAQABFsAAa0EWwABrPS7AAEjKwACXf2HAAP26AMAA/P0BF8AAa0kugbEcwABrURbAAGtJLoGxwACXfWQBAAGUAMAA/PXAAJd9PgJOwABrY8AAa2cAAMAAYIxgwAD70AEewABracAAl6EBAAEcwABrdhbAAGtyLsAASMrAAJd/hAsBAAEWwABrgS6BscAAl30AwAD9xABJwABrlSIhHMAAa52CwABrmcBLmO5IAQABasAAa6BgwAD70BUAwAD88wAhHMAAa6+CwABrq8BLmO5IAQABasAAa7JgwAD70AkAwAD8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AJTjARzAALE0LqFFAAAAAMAAl7g9HMAAsUsuwABgnAAAAADAAJemSsAAsWIBH8AAsW3AAJRgAQABgMAAsXTAS9G2AAbAAJfBgZvAALGIwACxksAAsj4AAMAAYM0AAAABA8AAsZzAALI+AAAAAAAAAGDAAJPMAT4ETsAAsarAALGyAACwXmDAAPoKARzAALG0LsAAYKABAAEng4gAwACXqE7AALHWwACx4QAAgmtgwACU4wEcwACx4y6hRQAAAADAAJe4PRzAALH6LsAAYJwAAAAAwACXpkrAALIRAR/AALIcwACU4gIAAoHAALImwEvSZYDAALIywEvSPQAGwACXwoGbwACyQ8AAsk3AALMOAADAAGDCAAAAAQPAALJXwACzDgAAAAAAAABgwACTzAE+BEnAALJgFsAAsmQuwABgdcAAl349HMAAsnQugcUBAAEnwABg0ADAAJepP07AALKzwACyvgAAgmtgwACU4wEcwACywC6hRQAAAADAAJe4PRzAALLXLsAAYJwAAAAAwACXpkrAALLuAR/AALL5wACUbAEAAYDAALL/wEvTHwAGwACXw4GbwACzE8AAsx3AALQRAADAAGDDAAAAAQPAALMxwAC0EQAAAAEBAcAAszIAAACY1VsAAGDAAJPMAT4ETsAAs0nAALNUAACdjWDAAP22ARbAALNWLsAAYHTAAJd7ScAAs2UiIRbAALNqLsAAYHXAAJd+ABzAALN8LsAAYJsBAAFqwACzi2DAAPvQCQDAAJelPgI9HMAAs5suwABgnAAAAADAAJemSsAAs7QBJsAAs7QBHMAAs8aAwACzu8BL05wgAQABgcAAs8fAS9OxAABgwACTzD89HMAAs94uwABgnAAAAADAAJemSsAAs/UBJsAAs/UBHMAAtAeAwACz/MBL05wgAQABKwAAYMAAk8wGwACXxIGbwAC0FsAAtCDAALXoAADAAGDEAAAAAQPAALQvwAC16AAAAAAAAABgwACTzAE+BT0cwAC0OC7AAGCaAQABasAAtEdgwAD70IQIAMAAl6ROwAC0X8AAtGkAAIW0YMAAlOMBHMAAtGsuoUUAAAAAwACXuD0cwAC0gi7AAGCaAQABasAAtJFgwAD70ITgAMAAl6ROwAC0qMAAtLYAAK1zYMAAk8wBHMAAtLguwABBewAAAADAAJe/ScAAtM4cwAC00i7A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mKmBmcAAoyLAAKMnwACjSgAAsGAAAAABA8AAozPAAKNKAAAAAQEBwACjPAAAAIPuYMAAlKYAAGDAAPoKAUrAAKNFASoGwACYqoGZwACjTsAAo1PAAKOOAACGUwAAAAEDwACja8AAo44AAAABAQHAAKOAAAAAg+5gwACUsAAAYMAA+goBSsAAo4kBKgbAAJirgZnAAKOSwACjl8AAo90AAIYdAAAAAQPAAKOswACj3QAAAAEBAcAAo74AAACD7mDAAJS9AABgwAD6CgFKwACjxwEcwACj0RbAAKPMgMAAo8fATG0pgmnAAJTAhE0BAWDAAPoKAS4AwACTtAbAAJisgZnAAKPhwACj5sAApBoAALBfAAAAAQPAAKP7wACkGgAAAAEBAcAApA0AAACD7mDAAJTKAABgwAD6CgFKwACkFgEpBsAAmK2BmcAApB/AAKQkwACkTQAAwABddgAAAAEDwACkM8AApE0AAAABAQHAAKQ/AAAAg+5gwACU4wAAYMAA+goBSsAApEgBKgAATGXLAExmEgBMZo0ATGbUAExnGwBMZ2IATGf3AExoZgBMaNUATGlEAExpiwBMadIATGoZAExqYABMaqcATGt0AExr4wBMbCoATGxxAExsuABMbP8ATG1uAExttQBMbf4AAAAXAsAAmLCBmcAApFLAAKRhwAClIAfAAGE1AAABYMAA/RwAAAABBcAAmLgAAAAABAAAAwAAAAAAAAAAAGDAAJiwAT8BCQEAwAD9MgAAAAAFBsAAmLKBmcAApHDAAKR3wACkjgACmRQAAAABA8AApH7AAKSOAAAAAQEBwACkhgAAAMAAYTZgwAD9tgAAYMAA/bYABsAAmLOBmcAApJLAAKSZwACkuAACoNsAAAABA8AApKjAAKS4AAAAAQEBwACksAAAAMAAYTZgwAD9tgAAYMAA/bYABsAAmLSBmcAApLzAAKTDwACk4wACwABhNwAAAAEDwACk08AApOMAAAABAQHAAKTbAAAAwABhNmDAAP22AABgwAD9tgAGwACYtYGZwACk58AApOzAAKUJAAKG9AAAAAEDwACk9sAApQkAAAABAQHAAKUEAAAAwABhDGDAAJh/AABcAAbAAJi2gZnAAKUNwAClEsAApR4AAob3AAAAAQPAAKUcwAClHgAAAAAAAABcAAAATG6xAExu8wBMbzUATG95AExv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wABhPcAAmMhkAQABFsAAsC4uwABhPMAAmMcAwAD89QDAAJjUPRfAALBKLsAAYTwcwACwWRbAALBKLsAAYTzAAJjHZAEAAZQAwAD89cAAmMdKwACwYQEmwACwYQGBwACwaMBMecpgwAD9tgbAAJjTgZnAALB4wACwfcAAscgAAMAAYUIAAAABA8AAsIrAALHIAAAAAQEBwACwkgAAAMAAYTZgwAD9tgAAYMAA+goBPgFKwACxiwEiHMAAsZqAwACxksBMexqB1gEAASed2wDAAP3IABzAALG2gMAAsa7ATHsaTwEAASed2wDAAP3HBsAAmNSBmcAAsc3AALHUwAC2xQAAwABhQwAAAAEDwACx4cAAtsUAAAACAgLAALHpAAAAwABhNmDAAP22AMAAsfYAAACDo2DAAPvQAABgwAD9tgE+BknAALH/FsAAsggWwACyAy6FyMAAmMSBVcAA/FZKwACyEQGAwACyGMBMe50/TsAAsi0AAADAAEfSYMAA/bYAScAAsjocwACyQIHAALI+wEx7rmMBAAFqwACyQmDAAPvQwABjNADAAPz9PgE9isAAspXATHvzHsAAsqPAAP3eAQABMcAAsrhgwAD70AEewACyucAAmNABAAGBwACyw8BMe64AAD4KPYnAALO8wEx7rhzAALO+gcAAs7zATHuugY0BAAFqwACzwWDAAPvQwABjNADAAPz2TsAAs9TAALPaAACsCmDAAPvQARzAALPegcAAs9zATHuula4BAAFqwACz4GDAAPvQg/IAwAD8+D2JwACz7sBMe64cwACz8IHAALPuwEx7roaBAQABasAAs/RgwAD70IPyAMAA/PpOwAC0BsAAtBEAAMAAYURgwAD70AGUTsAAtCDAALQuAADAAGFFYMAA+9ABasAAtDBgwAD70MAAYzRDwAC0whzAALTLgcAAtMnATHuugW0BAAGFwAC0zsBMfRYAwAD9AD4DPYnAALTnwEx7rhzAALTpgcAAtOfATHuugY0BAAGFwAC07MBMfRYAwAD89j2MwAC1A8BMfQAcwAC1DYTAALUDwEx9AGQBAAGUAMAA/PU9jcAAtRnATH0WHMAAtSeFwAC1GcBMfRaDiAEAAWrAALUqYMAA+9DAAGM0AMAA/PdOwAC1RcAAtUsAAMAASUddwAD8dAFgwAD70AExwAC1UmDAAPvQAEXAALVcAcAAtWXAALVnAABiYMAA+9ABkwEcwAC1bofAALVswEx+CWMBAAGEwAC1cMBMfQAAwAD8/QGPwAC1fMBMfgkcwAC1fYfAALV8wEx+CWQBAAGUAMAA/PU+Aj2NwAC1i8BMfRYcwAC1mYXAALWLwEx9FoaBAQABasAAtZ1gwAD70MAAYzQAwAD8+j0cwAC1tIbAALWuwEx93lYBAAEewAC1uMAAmNABAAEcwAC11xzAALXFgcAAtcPATHuuhoEBAAGFwAC1yMBMfRYAwAD8+pWuAQABasAAtdlgwAD70MAAYzQAwAD8+AAAwAD8hT0cwAC1+IbAALXywEx93lYBAAEcwAC2CWrAALYGYMAA+9CzDGQBAAGDwAC2C8BMfJsAwAD89QDAAPyFPYrAALYZwEx78x7AALYnwAD93gEAAYbAALY8wEx93gBAHMAAtnkewAC2WcAA/V8BAAEnwABhRgCpOQEAAYLAALaCwEx78wDAAP1TwAC2VcAAtooAPRzAALaaFsAAtpYWwAC2kS6FyMAAmMSB6MAA/FmAvwIAAoDAALabwEx7nYLAALamwEx78wDAAPy6SsAAtrMBgsAAtrrATHvzAABMc4QATHScAEx1PwBMdrAATHeNAEx5UwBMeu4ATHtxAEx/ygAAAAgCwACY14GZwAC3DsAAtxTAALogA8AAYUcAAAFgwAD9HAAABATAAJjZgZnAALc6wAC3QAmEUgBgwACY1wAEwACY2oGZwAC3T8AAt1MJg+4AYMAAk6wABMAAmNuBmcAAt1zAALdpGLamAGDAAPvQASsEwACY3IGZwAC3ccAAt4AYwABGMwBgwAD70AErAQXAAJjhgZnAALeFwAC3hcAAt6oAAAADwAC3ksAAt6oAAAACAgLAALeYAAAEhFJgwACY1wDAALelAAAEg+5gwACTrAAAYMAAmNcBPwMIAcAAmNmAAMBMgKQIAcAAmNqBAMBMgLMJAcAAt4XAAP0yAAAAAAIGwACY3oGZwAC3r8AAt7TAALksAADAAGD4AAAAAQPAALe9wAC5LAAAAAICAsAAt9gAAACCU2DAAJfuAMAAt+UAAACBsWDAAPvQAABcAT4BScAAt/UcwAC4BxbAALf5LramwACY20gBAAErAMAA/PM+A0nAALhNIRzAALhYFsAAuFEuhFLAAJjZSAEAASsAwAD9KT4BPRzAALi1FsAAuK4uhFLAAJjZwABg+AIAAoDAALi/wEyBHoHAALjIwEyBLQDAAJjePz0XwAC44S62poHAALjxwEyBLcAAmNs9HMAAuQmAwAC5AcBMgR60IwIAAhbAALkTLoPuwACY2oHAALkZwEyBLQDAAJfyPwbAAJjfgZnAALkxwAC5P8AAuh4AALQmAAAAAQPAALlHwAC6HgAAAAICAsAAuWIAAACCU2DAAJfuAMAAuW8AAACBsWDAAPvQAABgwACY1wE+Az0cwAC5pS7AAGD4AgACgMAAua/ATIImgcAAubjATII1AMAAmN49HMAAuc+AwAC5x8BMgia0JgQABBbAALnYLoPuwACY2hbAALneLramwACY24HAALntwEyCNRbAALn3LsAARjPAAJjcAMAAl/NKwAC6DQEWwAC6FC6EUsAAmNkAAEyA8gBMgfwATILMAAAAAgLAAJjigZqA64DxhDsDwABhSAAAAWDAAP0cAAACBMAAmOSBmoEbgUwYwABhSQBdwAD8pQJgwAD9tmDAAJjtAR6BNcAA/KwAAmDAAP22YMAAmO0AAATAAJjlgZqBZoGWGMAAYUoAXcAA/KUCYMAA/bZgwACY7QEegX/AAPysAAJgwAD9tmDAAJjtAAABBcAAmOyBmoGbgZuBrAAAAAOBqoGsAAAAAAAAAGDAAJjiAT8BCQGBm8AA/TIAAAAABAbAAJjngZqBsYG6gg4AAMAAYEsAAAABA4HSgg4AAAABAQGB2gAAAINEYMAA/bYAAGDAAJjtAT4BSoHoARyCAhaB7y7AAGFJwACY5EsBAAGAggPATIO8AMAA/LkGwACY6IGaghOCHIL0AADAAGBMAAAAAQOCNIL0AAAAAgICgjwAAACDRGDAAP22AIJJAAAAtClgwACTrAAAYMAAmO0BPgNOgl2CZgAAiKtgwACY7QEfgnTAAJj+BAACgIJ9wEyEF4GChcBMhCQCom0pwABgTyo9HILIFoK1LsAAYUnAAJjkgL8CAAKAgsnATIQXgoLTwEyEOwDAAPy6SoLhAYKC6MBMhDsGwACY6YGagvmDAoNUAADAAGBNAAAAAQODGYNUAAAAAQEBgyEAAACDRGDAAP22AABgwACY7QE+AUqDLwEcg0gWgzYuwABhSsAAmOVLAQABgINJwEyEvwDAAPy5BsAAmOqBmoNZg2KEOQAAwABgTgAAAAEDg3mEOQAAAAICAoOBAAAAg0RgwAD9tgCDjgAAALQpYMAAk6wAAGDAAJjtAT4DToOig6sAAIirYMAAmO0BH4O5wACY/gQAAoCDwsBMhRqBg8rATIUnAqJtKsAAYE8qPRyEDRaD+y7AAGFKwACY5YC/AgACgIQOwEyFGoKEGMBMhT4AwAD8ukqEJgGChC3ATIU+AABMg5oATIP1AEyEnQBMhPgATIWgAAAABALAAJjtgZqFOoVAj+YDiK4AAAFgwAD9HAAABwTAAJjvgZqFWoVgCYNEAGDAAP22AATAAJjwgZqFb4V7CaJtAGDAAPoKAATAAJjxgZqFioWTCcAAYE8AYMAA+goABMAAmPKBmoWihaUJtCkAYMAAk6wABMAAmPOBmoW3hcMYmqsAXgABAQFbAAFXwACSfgBbASsEwACY9IGahcyF6Bi2+QBgwAD70AEcheaUgcQAAAAAwAD78wTAAJj1gZqGI4YsGMAAYUsAXcAA/HQBYMAA/bYBKwMFwACY/oGahl+GX4cRAAAAA4ZnhxEAAAAEAgKGbQAABINEYMAA/bYAhnoAAAS0KWDAAJOsAAKGiwAABKJtYMAA+goBaoaZYMAA+gp1hqQAAATAAGBPYMAA+goBaoavYMAA+goAYMAAmO0BPgJAIxaGyS6ibcAAmPAlhtwWhtgutCnAAJjyYMAAlOMlhvAWhuwutCnAAJjyYMAAk8wBYMAA+gqGxIb8AD0chwMuwABhTMAAknsAAAAAwACY+wUIAcAAmO+AAMBMhqcIAcAAmPKBAMBMhrQIAcAAmPCCAMBMhsIIAcAAmPGDAMBMhtgJAYZfwAD9MgAAAAAFwACY/4GahxaHFogbAMAAYU0AA4cziBsAAAABAQGHOQAABLQpYMAAk6wAAGDAAJjtAT4EQCWHnRaHmS60KcAAmPJgwACU44eZh6oAQByHuC7AAGFOwACSewAAAADAAJj6h7iHzgA9F4fVLrb5k8AAmPQ9F4f2LpqrNIgFA4gFiBcAAAABAQGIBgAAAFtbAABgwACTrAFKiBQBFogULrQpwACY8sAAmPMFCAHAAJjygADATIejCADAAJjvKwgAwACY8CkIAMAAmPEqCQGHFsAA/TIAAAAABcAAmQCBmoggiCCJJADAAGFPAAOIPIkkAAAAAQEBiEIAAAS0KWDAAJOsAABgwACY7QE+BEAliKcWiKMutCnAAJjyYMAAk8yIo4izAEAciMEuwABhTsAAknsAAAAAwACY+ojBiNcAPReI3i62+ZPAAJj0PReI/y6aqzSJDgOJDokgAAAAAQEBiQ8AAABbWwAAYMAAk6wBSokdARaJHS60KcAAmPLAAJjzBQgBwACY8oAAwEyIeQgAwACY7ysIAMAAmPAqCADAAJjxKgkBiCDAAP0yAAAAAAQGwACY94GahjCGOYZaAQC+nwAAAAEDhkaGWgAAAAAAAABgwAD6CgFKhkkBHIZTFoZJLsAAYUvAAJj1SAEAASsAwAD9KQbAAJj6gZqJKYkuie0AAMAAYU7AAJJ7AAAAAQOJQontAAAAAAAAAGDAAPoKAT4DToloiXIAAKDrYMAAmQEBH4mAwACZVgEAASoAPRyJs4CJqcBMiaZnAQABFom7LrQpwACY8gDAAJkHSonFARyJ5RaJ3xaJ1oCJzMBMiabAAF1IwACZBIDuwACZW0gBAAGTAMAA/PMGwACY+4GaifKJ94swAADAAGFMwACSewAAAAEDif+LMAAAAAAAAABcAT4FToolii8AAKDrYMAAmQEBH4o9wACZVgEAARaKWi7AAGBPwACY8QA9F4pqLpqrHIqDgIp5wEyKNmcBAAEWiosutCnAAJjyAMAAmQfAAJjzPReKlS62+RaKwhaKuYCKr8BMijbAAF1IwACZBIDuwACZW8AAmPROitmK3wAAhLFdwAD9ZwFgwAD9tgEWivQWiuuAiuHATIo2wABdSMAAmQTAAGFLwACZWj0XiwMuwABhSxyLFYGLD8BMiqqArQEAAAGFWCrAAPxIwACY9QbAAJj8gZqL8Iv1j+QAALCYAAAAAQOMAI/kAAAAAQEBjAUAAABbWwAAYMAAk6wBPgVJjBYljCSAjBrATIsfXcAA/HQBWz4CSYw1IRyMShaMQxSMOcBMix8AAV3AAPx0AVthwAD8o0gBAAEWjE0utvnAAJj0AMAA/PM+AT0wjHAkAAgnwABhUBaMrRSMo8BMix8AAV3AAPx0AVthwAD8oyeBiyfAAFPxFozPLrb5wACY9CfAAGFRFo0BLoNEwACY7yeDrj9KjRkBJo0ZARyNIC6aqwEAARSNLcBMix8AAV3AAPx0AVsAwACY82DAAJOsP0AljVSAjUrATIsfXcAA/KUCW1uNSo1aAEmNYRyNdhaNbxaNZS7AAGFLwACY9WHAAPyjYwEAASaNggEWjYKAjXjATIsfYQBgwAD85gDAAPz9PgJOjhuOJwAAwABhUmDAAP22ASaOGwEcjm0cjkIWjj2AjjPATIsfg2IAgaUBAAE0jkgDjkiOawAAAAEBAY5JAAAAgL1bAABgwAD6CgFKjlIBIRyOXRaOUy7AAGFLwACY9YMXAQABgY5mwEyMfADAAPxBAABYAQABJ4GLAABgwAD9tj0wjn8kjrsCJ8AAYVOBjq/ATIxCP0mOxyEcjtYWjswuwABhS8AAmPWWMAEAATSO3AOO3I8IAAAAAQEBjuQAAACAvWDAAP22AABgwAD6CgFKju0BJo7tARyO94CO7cBMix+HQQEAAYGPA8BMjPwAAGDAAPoKAMAA/EU+Ak6PGo8jAACcYWDAAP22ARyPZxyPORaPLy7AAGFLwACY9YGlAQABNI8/A48/j2UAAAABAQGPQAAAAIC9YMAA/bYAAGDAAPoKAUqPSQEhJo9JARyPVICPSsBMix+HQQEAAYGPYMBMjXAAAGDAAPoKAMAA/D5YAQABJ4GLAMAA/EY9MI95JI+2AifAAGFUgY+twEyNPT9Kj8IBJo/CARyPyS6aqwEAAYCP1sBMix8AwACY82DAAJOsAABMiTIATIl2AEyKCgBMiv8ATI3yAAAABALAAJkBgZqRwZHHwABiIgPAAGFVAAABYMAA/RwAAV3AAJKPAV4AAQEBWwABV8AAkn4AWwMEwACZA4GakhiSIQnAAGBPAGDAAPoKAATAAJkEgZqSP5JoGMAAXUgAYMAAmVcBH5JOwACZYgAAAAAEwACZBYGaliWWXQTAAGFWAGDAAP1GAR6WOMAA/V8BAAEnwABgIQABBcAAmVaBmpKwkrCS3AAAAAOSzJLcAAAAAQEBktIAAATAAGBPYMAA+goAAGDAAJkBAT8CCAHAAJkDgADATI67CQGSsMAA/TIAAAAATgbAAJkHgZqS4ZLuk1kAAGcAAAABA5L1k1kAAAABAQGS+wAAAIPuYMAAk6wAAF4AAQEBWwABV8AAkn4AWwE+Az0ckxAWkwcuwABdSMAAmQSahwEAAYCTFsBMjwsAwACZXk6TLpM1AACBdl4AAQEBWwABV8AAkn4AWwEckzcumocBAAGAkz3ATI8LAMAAmQtKk0gBgZNPwEyPTQbAAJkIgZqTXpNlk5IAAYHFAAAAAQOTapOSAAAAAQEBk3IAAAAiYMAA/bYAAFsBPgE9MJOBgJOHwEyPpQbAAJkJgZqTl5Ork9EAAacBAAAAAQOTr5PRAAAAAQEBk7UAAACD7mDAAJOsAABeAAEBAVsAAVfAAJJ+AFsBSpO+ATSTvgOTvpPRAAAAAQEBk78AAABbWwAAYMAAk6wBSpPNAYCTzcBMj+EGwACZCoGak9WT4ZP8AAHAAGFXAAAAAQOT6ZP8AAAAAQEBk+oAAABbWwAAYMAAk6wBSpP4ASsGwACZC4GalAGUDpShAACahwAAAAEDlBOUoQAAAAEBAZQZAAAAg+5gwACTrAAAXgABAQFbAAFXwACSfgBbAT4CSZQlIhaUKS7AAGBPwACZAwEclD8WlDYuwABdSMAAmQTAAGFYAQABgJRZwEyQgQDAAJldPgFKlGgBHJR0gJRvwEyQgYRNAQFeAAEBAVsAAVfAAJJ+AFsBLgDAAJO0P0qUjAEelJPAAJkJAQABgJSYwEyQgQAGwACZDIGalKaUs5UPAADAAGFZAAAAAQOUwJUPAAAAAQEBlMYAAACD7mDAAJOsAABeAAEBAVsAAVfAAJJ+AFsBPgJJlNIclNuAlNbATJE3SAEAASsAwAD9KUqU5AFqlOthAVtgwACTrMABXbw/SpT5ARyVAC6ahwEAAYCVBsBMkTcAwACZCwbAAJkNgZqVFJUhlaUAAMAAYVoAAAABA5UvlaUAAAABAQGVNQAAAIPuYMAAk6wAAF4AAQEBWwABV8AAkn4AWwE+AUqVjwEclZYumocBAAGAlZzATJG9AMAAmQsGwACZDoGalaqVt5YSAADAAEY5AAAAAQOVwJYSAAAAAQEBlcYAAACD7mDAAJOsAABeAAEBAVsAAVfAAJJ+AFsBPgE9MJXSJJYOAifAAGFbgJYJwEySGAbAAJkPgZqWYpZ0lu4AAcAAYVwAAAABA5aOlu4AAAABAQGWlgAAAICWYMAA/bYAAGDAAJTjAT4CQByWtxqWqsAAmQWpOQEAAYCWwMBMkm4AwAD9U5aqlsYASpbNAR+W2MAAlbcBAAGAluTATJJuAAbAAJkQgZqW85cFl48AAcAAYV0AAAABA5cnl48AAAABAQGXLwAAAICWYMAA/bYAAGDAAJTjAT4CQByXUBqXQ8AAmQWpOQEAAYCXWcBMkt0AwAD9U5dDl18ASpdmAR+XccAAlcEBAAGAl4XATJLdAAbAAJkRgZqXlJehmS0AALAzAAAAAQOXvJktAAAAAQEBl9QAAACD7mDAAJazAABeAAEBAVsAAVfAAJJ+AFsBPgJOl+SX8wAAwABGT1sBFpf6gJf1wEyTSsAARk/AAJa1SpgOATSYFQOYFZkpAAAAAQEBmBYAAABbWwAAYMAAlOMBPgROmC2YMwAAgJZbARyYPoKYNcBMk5tLAQABgZg/wEyTawAASZhWJZhgg5hawEyTrWDAAJTjSphvARSYdsBMk60DAWDAAJTjP0mYgyWYjYOYh8BMk61gwAD9tkqYmAEemJ/AAJkPAQABFJi6wEyTrQMBYMAA/bYAPz0wmMgemM7AAJkIAQABJJkhBCfAAGFegZj1wEyTayfAAGFfg5kbwEyTrQAGwACZEoGamTKZP5rWAACwKgAAAAEDmVua1gAAAAEBAZl0AAAAg+5gwACXGgAAXgABAQFbAAFXwACSfgBbAT4CTpmEmZMAAMAARk9bARaZmoCZlcBMlG7AAEZPwACXHEqZrgE0mbUDmbWa0gAAAAEBAZm2AAAAW1sAAGDAAJTjAT4ETpnNmdMAAICWWwEcmd6CmdXATJS/SwEAAYGZ38BMlI8AAEmZ9iWaAIOZ+sBMlNFgwACU6kqaEAEUmhfATJTRAwFgwACU6j9JmiQlmi6DmijATJTRYMAA/bZKmjkBHppAwACZEAEAARSaY8BMlNEDAWDAAP22AD89MJpxHpp3wACZCAEAASSaygQnwABhXoGansBMlI8nwABhYIOaxMBMlNEABsAAmROBmprbmuidagAAwABhYQAAAAEDmwCdagAAAAEBAZsGAAAAg+5gwACTrAAAXgABAQFbAAFXwACSfgBbAT4CSZsSJZsbgJsWwEyVlGDAAJazPgJOm0KbUQAAwABGT1sBFptYFJtTwEyVlAABYMAAlrPAAEZPwACWtUqbbgE0m3UDm3WdSAAAAAEBAZt2AAAAW1sAAGDAAP0cAT4ETpuPm5UAAICWWwEcm6CCm5fATJYASwEAAYGbocBMlckAAE+bupvFAAABwABhYmEBW2DAAJTjAAOb0ZzbAAAAAQEBm9IAAACHIlsAAGDAAJTjAT4DSZvkJZvthZvowEyWU2DAAJTjSpv8ARScA8BMllMFAWDAAJTjP0mcEyWcHIWcF8BMllNgwAD9tkqcJwEenC7AAJkPAQABFJxJwEyWUwUBYMAA/bYAPz0wnFoenGDAAJkIAQABJAAFJ8AAYV6BnHzATJXJJ8AAYWMnwABhZIOcysBMlhIASZzmJZzwg5zqwEyWEl3AAPwyAVtKnP0BHJ0KFJ0EwEyWEgMBXcAA/DIBW4CrAQFgwACU4wGEnQ7ATJY2AMAA/D0/Sp0lARydOISdLMBMljYgAQABg505wEyWEgAAP0qdVAEcnVsumocBAAGAnWHATJWUAMAAmQsGwACZFIGanW+dfJ7EAACwMQAAAAEDnZSexAAAAAEBAZ2pAAAAg+5gwACWyAAAXgABAQFbAAFXwACSfgBbAT4CTp25ncgAAMAARk9bARadz4CdysBMl4DAAEZPwACWykqd4wE0neoDneqewAAAAAEBAZ3rAAAAW1sAAFsBPgNOngKeCAAAgJZbARyeE4KeCsBMl9FLAQABgZ4UwEyXoQAASZ4rIiWeNYOeL8BMl99gwACWMwElnkmDnkPATJffYMAAlitKnmABg55nwEyX3z89Hp50wACZCAEAASSeuAQnwABhXoGekMBMl6EnwABhZYOessBMl98ABsAAmRWBmp7Jntag9wAAsC8AAAABA57woPcAAAABAQGfBwAAAIPuYMAAltsAAF4AAQEBWwABV8AAkn4AWwE+Ak6fF58mAADAAEZPWwEWny2AnyjATJh3wABGT8AAlt1Kn0EBNJ9IA59IoPMAAAABAQGfSQAAAFtbAABgwAD9HAE+BE6fYJ9mAACAllsBHJ9xgp9owEyYyEsBAAGBn3LATJiYAABPn4qflAAAAcAAYWZhAVtgwACVwgADn5+gjgAAAAEBAZ+gAAAAhyJbAABgwACVwgE+A0mfsCWfuYWftMBMmRtgwACVwkqfxwEUn87ATJkbBQFgwACVwj9Jn9wln+WFn+DATJkbYMAA/bZKn/ABH5/7wACVyQEAARSgBcBMmRsFAWDAAP22AD89MKAUHqAawACZCAEAASQABSfAAGFegaA2wEyYmCfAAGFnJ8AAYWiDoH/ATJjaAEmglyWgoYOgm8BMmNpdwAD8MgFbSqCuARyguxSgtcBMmNoDAV3AAPwyAVuAqwEBYMAAlcIBhKC/wEyY/gDAAPw9P0qg0wEcoOWEoNrATJj+IAEAAYOg5sBMmNoAAAbAAJkWgZqg/KEJo04AALAuAAAAAQOhIqNOAAAAAQEBoTgAAACD7mDAAJbyAABeAAEBAVsAAVfAAJJ+AFsBPgJOogyiGwAAwABGT1sBFqIigKIdwEyaLsAARk/AAJb0SqI2ATSiPQOiPaNKAAAAAQEBoj4AAABbWwAAYMAAlOMBPgROolWiWwAAgJZbARyiZoKiXcBMmn9LAQABgaJnwEyaTwAASaJ+JaKIg6KCwEyakWDAAJTjSqKXARSinsBMmpEDAWDAAJTjP0miqyWitYOir8BMmpFgwAD9tkqiwAEfosvAAJZWAQABJKLjAyeDrhSi3MBMmpEDAWDAAP22J4OuAD89MKLsHqLywACZCAEAASSjQgQnwABhXoGjGcBMmk8nwABhaYOjPMBMmpEABsAAmReBmqNTo2CkqwAAsCwAAAABA6N6pKsAAAABAQGjkQAAAIPuYMAAlwcAAF4AAQEBWwABV8AAkn4AWwE+Ak6joaOwAADAAEZPWwEWo7eAo7LATJtcwABGT8AAlwlKo8sBNKPSA6PSpKcAAAABAQGj0wAAAFtbAABgwACTzAE+A06j6qPwAACAllsBHKP7gqPywEybrUsBAAGBo/zATJt9AABJpBMlpB2DpBfATJu/YMAAk6xKpCYBHKQzFKQtwEybvwMBYMAAk6zAAGADAAAAAMAAk7w/PTCkSB6kTsAAmQgBAAEkpJ8EJ8AAYV6BpHXATJt9J8AAYWqDpJnATJu/AAbAAJkYgZqksKS9pysAAMAAYWsAAAABA6TUpysAAAABAQGk2gAAAIPuYMAAk6wAAF4AAQEBWwABV8AAkn4AWwE+Akmk5iWk74Ck6sBMnGFgwACXBz4CTqUVpSQAAMAARk9bARalKxSlJsBMnGEAAWDAAJcHwABGT8AAlwlKpUEBNKVIA6VIpwkAAAABAQGlSQAAAFtbAABgwAD9HAE+BE6lYqVoAACAllsBHKVzgqVqwEyczUsBAAGBpXTATJyWAABPpY2llwAAAcAAYANhAVtgwACTzAADpaKmngAAAAEBAaWjAAAAhyJbAABgwACTzAE+A0mltSWlvoWlucBMnSBgwACTzEqlzAEUpdPATJ0gBQFgwACTzD9JpeMlpeyFpefATJ0gYMAAlONKpfsBHKYHFKYCwEydIAUBYMAAlOPAAGADAAAAAMAAlOc/PTCmIB6mJsAAmQgBAAEkAAUnwABhXoGmQsBMnJYnwABhYyfAAGFsg6aNwEyc3wBJpqklprODpq3ATJzfXcAA/DIBW0qmwAEcps0UpsfATJzfAwFdwAD8MgFbgKsBAWDAAJPMAYSm0cBMnQMAwAD8PT9KpucBHKb5hKbuwEydAyABAAGDpvrATJzfAAA/SqcVARynHC6ahwEAAYCnIsBMnGEAwACZCwbAAJkZgZqnMKc9qXMAALBvAAAAAQOnSalzAAAAAQEBp1IAAACD7mDAAJPAAABeAAEBAVsAAVfAAJJ+AFsBPgJOp3GnfwAAwABhbV3AAPx0AV4AAQEBWwABV8AAkn4AWwEcp7Acp5MWp46Ap4nATJ5RgmnAAJPCgKsBAV4AAQEBWwABV8AAkn4AWwEWp5cuwABha8AAmRgAwAD8PYCtAAAAAMAA/EhKp74BNKfFA6fFqW8AAAABAQGnxgAAAFtbAABgwACTwAE+BE6n6af0AACGEF3AAPx0AWDAAJPMATGoAWDAAJPMAE+oC6gQAAABVmEBW1wAA6gTqNoAAAABAQGoFAAAAIPuWwAAXAE+AkmoJCWoLYWoKMBMnzFgwACT6kqoQAA/SahQJahZhahUwEyfMV3AAPwyAVs+AT0cqH2DqHLATJ77gKUBAAEmqIQBFKiEwEyfMQUBXcAA/DIBW13AAPwyAWDAAJPMAMAA/IY+AT0cqLGDqKbATJ77VgEAASaougEcqLqFqLXATJ8xwABgAwAAAAAAYMAAk8wAwAD8hUao46kUqPUAAACaq14AAQEBWwABV8AAkn4AWwCBqQXATJ5yPgE9HKkhhKkewEyfGyABAAEcqS6FqSLATJ/XIAEAAYKpL8BMnukAAAAASqlKAR+pVcAAk8sBAAGDqV3ATJ77AAbAAJkagZqpeKmFrA0AAIYSAAAAAQOpj6wNAAAAAQEBqZYAAACD7mDAAJPRAABeAAEBAVsAAVfAAJJ+AFsBPgJOqbWpwwAAwABhbV3AAPx0AV4AAQEBWwABV8AAkn4AWwEcqfocqd0WqdKAqc3ATKBVhhDAAJPTgKsBAV4AAQEBWwABV8AAkn4AWwEWqeEuwABha8AAmRgAwAD8PYCtAAAAAMAA/EhKqggBNKoPA6oPrAkAAAABAQGqEAAAAFtbAABgwACT0QE+BE6qM6o+AACGEF3AAPx0AWDAAJPMATGqS2DAAJPMAE+qVapaAAABVmEBW1wAA6pdq3YAAAABAQGqXgAAAIPuWwAAXAE+AkmqbiWqd4WqcsBMoTVgwACT6kqqigA/SaqaJaqjhaqewEyhNV3AAPwyAVs+AT0cqseDqrzATKD/gKUBAAEmqs4BFKrOwEyhNQUBXcAA/DIBW13AAPwyAWDAAJPMAMAA/IZJquQlqu2FqujATKE1YMAAk9E+AT0cqw6DqwPATKD/gKUBAAEWqxoUqxXATKE1BQFgwACT0YYQwACT0wDAAPyGPgE9HKtNg6tCwEyg/1YBAAEmq1YBHKtWhatRwEyhNcAAYAMAAAAAAGDAAJPMAMAA/IVGq3+rsKuRAAAAmqteAAEBAVsAAVfAAJJ+AFsAgauhwEygdj4BPRyrvYSrusBMoR8gAQABHKvKhau+wEyiGyABAAGCq8vATKDtAAAAAEqr5gEfq/HAAJPcAQABg6v3wEyg/wAGwACZG4GarBKsH6zoAACGDgAAAAEDrDes6AAAAAEBAaxMAAAAg+5gwACT3gAAXgABAQFbAAFXwACSfgBbAT4CTqxlrHUAAKQiXgABAQFbAAFXwACSfgBbARysdy6ahwEAARasgoCsfcBMopmCa8AAk+AAwACZC0qskwE0rJoDrJqs5AAAAAEBAaybAAAAW1sAAFsBPgFKrK4BHKzQHKzEgay1wEyiuiABAAGCrMXATKMCAADAAGADAAAAAAAGwACZHIGarO2s+q1PAACGFwAAAAEDrQ2tTwAAAAEBAa0dAAAAg+5gwACT6gAAXgABAQFbAAFXwACSfgBbAUqtLAE0rSwDrSytTwAAAAEBAa0tAAAAW1sAAGDAAJPqAUqtOwEfrT/AAJPzAAAAAAbAAJkdgZqtVK1hrhEAALBuAAAAAQOtaK4RAAAAAQEBrWwAAACD7mDAAJP0AABeAAEBAVsAAVfAAJJ+AFsBPgFJrXglrYsWrYGArXzATKPEhbTAAJP2YMAAlrM+AUqtrgEcrbUuwABhbgEAAYCt08BMo8QAwACZHj4BSq3tARyt9C7AAGFvAQABgK4CwEyjxADAAJkfBsAAmR6Bmq4WriOyUAAAwABhbgAAAAEDrkCyUAAAAAEBAa5EAAAAg+5gwACT9AAAXgABAQFbAAFXwACSfgBbAT4FT66arpoAAAHAAGFwYQFgwACWs2EBW2DAAP0cAAOuqrBYAAAAAQEBrsIAAACD7mDAAJazAABhAVtgwAD9HAE+Ak6u1K7jAADAAEZPWwEWruqCruXATKSiwABGT8AAlrVKrwABNK8HA68HsFIAAAABAQGvCAAAAFtbAABgwAD9HAE+BU6vIa8nAACAllsBHK8yhK8pwEyk7EsBAAGDrzPATKS8AABJr0wlr1aFr1DATKT+YMAA+gpKr18BFK9mwEyk/gUBYMAA+go/Sa91Ja9/ha95wEyk/mDAAJTjSq+OARSvlcBMpP4FAWDAAJTjP0mvpCWvroWvqMBMpP5gwAD9tkqvuQEer8DAAJkPAQABFK/bwEyk/gUBYMAA/bYAPz0wr+ser/HAAJkIAQABJAAFJ8AAYV6DsA3ATKS8J4DZJ8AAYXGFsELATKT+AE6wY7BxAADAAGFyYQFbYMAA/RwBHLCDgbBzwEykfiABAAEmsIkBFrCJgLCEwEykW4W0wACT9mDAAJazAABOsKawrwAAwABhc14AAQEBWwABV8AAkn4AWwEcsLEumocBAAEWsLyAsLfATKRbga3AAJP3AMAAmQtOsNSw4gAAwABhdF4AAQEBWwABV8AAkn4AWwEcsOQumocBAAEWsO+AsOrATKRbhbXAAJP4AMAAmQtKsP8BNLEGA7EGskwAAAABAQGxBwAAAFtbAABbAT4DTrEesSgAAIW0YMAA/RwBHLE3grEqwEylxyABAAGFsTjATKaHAABJsUolsViGsU7ATKaVYMAA+go+AUmxaxyxeRSxb8BMppUGAWDAAPoKSAEAASkAwAD9KT4BSrGOARyxnYOxlcBMpgQgAQABhbGewEymhwAAPgFKscUBHLHZhLHMwEymPSABAAGFsdrATKaHAAA/SrH+AR+yCcAAlAMDAAMmsgwBhrIMwEymlWDAAJTjJrIfARyyH4OyF8BMpgQgAQABhbIgwEymhwAAYMAAk8wmsjkBHLI5hLIswEymPSABAAGFsjrATKaHAABgwACTzAAGwACZH4GaslWyYrOjAADAAGFvAAAAAQOyb7OjAAAAAQEBsnMAAACD7mDAAJP0AABeAAEBAVsAAVfAAJJ+AFsBPgROsoyymgAAwABhcl4AAQEBWwABV8AAkn4AWwEcspwumocBAAEWsqeAsqLATKeohbTAAJP2AMAAmQtOssSyzQAAwABhc14AAQEBWwABV8AAkn4AWwEcss8umocBAAEWstqAstXATKeoga3AAJP3AMAAmQtOsvKzAAAAwABhdF4AAQEBWwABV8AAkn4AWwEcswIumocBAAEWsw2AswjATKeohbXAAJP4AMAAmQtKsx0BNLMkA7Mks58AAAABAQGzJQAAAFtbAABgwACT9AE+AUqzOAEfs0PAAJQDAwADJrNTARyzU4GzRsBMp8kgAQABhLNUwEyohQAAYMAAlOMms2gBHLNogrNgwEyoAiABAAGEs2nATKiFAABgwACTzCazjAEcs4yDs3/ATKg7IAEAAYSzjcBMqIUAAGDAAJPMAAbAAJkggZqzqLO1tUUAALBtAAAAAQOzvbVFAAAAAQEBs8IAAACD7mDAAJQKAABeAAEBAVsAAVfAAJJ+AFsBPgVOs9uz5AAAwABhdV4AAQEBWwABV8AAkn4AWwEcs+YuwABhWQEAARaz+YCz9MBMqSWpPcAAlAwAwACZDE60EbQfAADAAGFyXgABAQFbAAFXwACSfgBbARy0IS7AAGFZAQABFrQ0gLQvwEypJYW0wACUDQDAAJkMTrRRtFwAAMAAYXZeAAEBAVsAAVfAAJJ+AFsBHLReLsAAYVkBAAEWtHGAtGzATKklqybAAJQOAMAAmQxOtIu0lAAAwABhd14AAQEBWwABV8AAkn4AWwEctJYumocBAAEWtKGAtJzATKklgmnAAJQHAMAAmQtKtKwBNLSzA7SztUEAAAABAQG0tAAAAFtbAABgwACUCgE+AUq0xwEftNLAAJQXBAAEJrTeARy03oG01sBMqUYgAQABhbTfwEyqQQAAYMAAlOMmtPgBHLT4grTrwEypgSABAAGFtPnATKpBAABgwACU4ya1GQEctRmDtQ/ATKm8IAEAAYW1GsBMqkEAAGDAAJTjJrUuARy1LoS1JsBMqfcgAQABhbUvwEyqQQAAYMAAk8wABsAAmSGBmrVKtVe2mwAAsGwAAAABA7VhtpsAAAABAQG1aAAAAIPuYMAAlBgAAF4AAQEBWwABV8AAkn4AWwE+BE61gbWSAADAAGF4XgABAQFbAAFXwACSfgBbARy1lC6ahwEAARa1n4C1msBMqwGwWMAAlBoAwACZC061v7XKAADAAGF5XgABAQFbAAFXwACSfgBbARy1zC6ahwEAARa114C10sBMqwGDwMAAlBsAwACZC0618bX6AADAAGF3XgABAQFbAAFXwACSfgBbARy1/C6ahwEAARa2B4C2AsBMqwGCacAAlAcAwACZC0q2EgE0thkDthm2lwAAAAEBAbYaAAAAW1sAAGDAAJQYAT4BSrYtAR+2OMAAlCQDAAMmtk4BHLZOgbY+wEyrIiABAAGEtk/ATKveAABgwACU4ya2ZQEctmWCtlvATKtbIAEAAYS2ZsBMq94AAGDAAJTjJraEARy2hIO2fMBMq5QgAQABhLaFwEyr3gAAYMAAk8wABsAAmSKBmragtqC25wAAwABhegAAAAEDtqS25wAAAAEBAbasAAAAgL1gwAD9tgAAWwE+AT0wtrgftsLAAPtpAQABJLbiAy4ngWqAtt3ATKyAAAbAAJkjgZq27Lb5t+EAALBrAAAAAQO3A7fhAAAAAQEBtwoAAACD7mDAAJQlAABeAAEBAVsAAVfAAJJ+AFsBPgNOtyO3MQAAwABhcl4AAQEBWwABV8AAkn4AWwEctzMumocBAAEWtz6AtznATKzQhbTAAJQnAMAAmQtOt1u3ZAAAwABhd14AAQEBWwABV8AAkn4AWwEct2YumocBAAEWt3GAt2zATKzQgmnAAJQHAMAAmQtKt3wBNLeDA7eDt90AAAABAQG3hAAAAFtbAABgwACUJQE+AUq3lwEft6LAAJQwAgACJre1ARy3tYG3qMBMrPEgAQABg7e2wEytdAAAYMAAk6wmt8oBHLfKgrfCwEytKiABAAGDt8vATK10AABgwACTzAAGwACZJIGat+a387jSAACwagAAAAEDt/q40gAAAAEBAbf+AAAAg+5gwACUMQAAXgABAQFbAAFXwACSfgBbAT4DTrgXuCAAAMAAYXdeAAEBAVsAAVfAAJJ+AFsBHLgiLpqHAQABFrgtgLgowEyt9IJpwACUBwDAAJkLTrhFuFMAAMAAYXJeAAEBAVsAAVfAAJJ+AFsBHLhVLpqHAQABFrhggLhbwEyt9IW0wACUMwDAAJkLSrhwATS4dwO4d7jOAAAAAQEBuHgAAABbWwAAYMAAlDEBPgFKuIsBH7iWwACUPAIAAia4oQEcuKGBuJnATK4VIAEAAYO4osBMrpgAAGDAAJPMJri7ARy4u4K4rsBMrk4gAQABg7i8wEyumAAAYMAAlOMABsAAmSWBmrjXuOS5NwAAsGkAAAABA7jxuTcAAAABAQG4+wAAAIPuYMAAlD0AAF4AAQEBWwABV8AAkn4AWwFKuQoBNLkKA7kKuTcAAAABAQG5CwAAAFtbAABgwACUPQFKuRkBH7kdwACUSAEAARa5K4C5JsBMrxiwaMAAlD8ABsAAmSaBmrk8uUm5kwAAsGcAAAABA7lTuZMAAAABAQG5WgAAAIPuYMAAlEkAAF4AAQEBWwABV8AAkn4AWwFKuWkBNLlpA7lpuZMAAAABAQG5agAAAFtbAABgwACUSQFKuXgBH7l8wACUVAEAARa5h4C5gsBMr5awaMAAlEsABsAAmSeBmrmYuaW6QAAAsGYAAAABA7mwukAAAAABAQG5uAAAAIPuYMAAlFUAAF4AAQEBWwABV8AAkn4AWwE+Ak650bngAADAAGF7XgABAQFbAAFXwACSfgBbARy54i7AAGFZAQABFrn1gLnwwEywFICWwACUVwDAAJkMSroBATS6CAO6CLo8AAAAAQEBugkAAABbWwAAYMAAlFUBSroXAR+6G8AAlGABAAEmujABHLowgboiwEywNSABAAGCujHATLCBAABgwACU4wAGwACZKIGaukW6UrsJAACwXQAAAAEDumC7CQAAAAEBAbprAAAAg+5gwACU1gAAXgABAQFbAAFXwACSfgBbAT4CTrqEupMAAMAAYXteAAEBAVsAAVfAAJJ+AFsBHLqVLpqHAQABFrqggLqbwEyw34JrwACU2ADAAJkLSrqxATS6uAO6uLsFAAAAAQEBurkAAABbWwAAYMAAlNYBSrrPAR+608AAlOICAAImuusBHLrrgbrdwEyxACABAAGCuuzATLFKAABgwACU4xa6/YC6+MBMsN+wXsAAlNkABsAAmSmBmrsOuxu7sAAAhe8AAAABA7slu7AAAAABAQG7LAAAAIPuYMAAlGEAAF4AAQEBWwABV8AAkn4AWwE+Ak67RbtUAADAAGF7XgABAQFbAAFXwACSfgBbARy7Vi6ahwEAARa7YYC7XMBMsbiCa8AAlGMAwACZC0q7cgE0u3kDu3m7rAAAAAEBAbt6AAAAW1sAAGDAAJRhAUq7iAEfu4zAAJRsAQABJrugARy7oIG7ksBMsdkgAQABgruhwEyyIwAAYMAAlOMABsAAmSqBmru1u8K88gAAsGMAAAABA7vKvPIAAAABAQG7zwAAAIPuYMAAlG0AAF4AAQEBWwABV8AAkn4AWwE+BE676LvxAADAAGF3XgABAQFbAAFXwACSfgBbARy78y6ahwEAARa7/oC7+cBMsoGCacAAlG8AwACZC068FrwgAADAAGF8XgABAQFbAAFXwACSfgBbARy8Ii7AAGFZAQABFrw1gLwwwEyygbBkwACUcADAAJkMTrxSvF4AAMAAYX1eAAEBAVsAAVfAAJJ+AFsBHLxgLsAAYVkBAAEWvHOAvG7ATLKBsGXAAJRxAMAAmQxKvIUBNLyMA7yMvO4AAAABAQG8jQAAAFtbAABgwACUbQFKvJsBH7yfwACUegMAAya8tAEcvLSBvKzATLKiIAEAAYS8tcBMs2IAAGDAAJPRJrzKARy8yoK8wcBMstsgAQABhLzLwEyzYgAAYMAAlHsmvOIBHLzig7zXwEyzFiABAAGEvOPATLNiAABgwACT0QAGwACZK4GavPe9BL3nAACGQAAAAAEDvQ695wAAAAEBAb0VAAAAg+5gwACUewAAXgABAQFbAAFXwACSfgBbAT4DTr0uvT4AAMAAYX5eAAEBAVsAAVfAAJJ+AFsBHL1ALpqHAQABFr1LgL1GwEy0AJ6awACUfQDAAJkLTr1qvXMAAMAAYXdeAAEBAVsAAVfAAJJ+AFsBHL11LpqHAQABFr2AgL17wEy0AIJpwACUfgDAAJkLSr2LATS9kgO9kr3jAAAAAQEBvZMAAABbWwAAYMAAlHsBSr2pAR+9rcAAlIcCAAImvcIBHL3Cgb2zwEy0ISABAAGDvcPATLSkAABgwACU6ia91wEcvdeCvc/ATLRaIAEAAYO92MBMtKQAAGDAAJPRAAbAAJksgZq97L35v1YAALBiAAAAAQO+BL9WAAAAAQEBvgwAAACD7mDAAJSIAABeAAEBAVsAAVfAAJJ+AFsBPgNOviW+LQAAwABhf14AAQEBWwABV8AAkn4AWwEcvi8umocBAAEWvjqAvjXATLUig9HAAJSKAMAAmQtOvlu+ZQAAwABhgF3AAPwyAV4AAQEBWwABV8AAkn4AWwEcvnIWvmyAvmfATLUihi3AAJSLgKsBAV4AAQEBWwABV8AAkn4AWwEWvnYumofAAJkLAMAA/D1KvoIBNL6JA76Jv1IAAAABAQG+igAAAFtbAABgwACUiAE+AUq+nQEfvqjAAJSUAgACJr7BARy+wYG+usBMtUMgAQABg77CwEy15AAAYMAAlOMcv0IcvvGCvtjATLV8gKsBAWDAAJSVATS/AwO/A78xAAAAAQEBvxEAAADAAGGBXgABAQFbAAFXwACSfgBbAABgwACUlQFKvx4BJr8eARy/JoS/HsBMtkggAQABg78nwEy15AAAYMAAlJUAwAD8PYCtAAAAAMAA/EgABsAAmS2Bmr9bv2jAAEBQAACwYQAAAAEDv3HAAEBQAAAAAQEBv3cAAACD7mDAAJSaAABeAAEBAVsAAVfAAJJ+AFsBPgNOv5C/nwAAwABhe14AAQEBWwABV8AAkn4AWwEcv6EumocBAAEWv6yAv6fATLbAgmvAAJScAMAAmQtOv8q/0wAAwABhd14AAQEBWwABV8AAkn4AWwEcv9UumocBAAEWv+CAv9vATLbAgmnAAJSXAMAAmQtKv+sBNL/yA7/ywABATAAAAAEBAb/zAAAAW1sAAGDAAJSaAT4BSsAAQAYBH8AAQBHAAJSlAgACJsAAQCQBHMAAQCSBwABAFsBMtuEgAQABg8AAQCXATLdmAABgwACU4ybAAEA5ARzAAEA5gsAAQDHATLcaIAEAAYPAAEA6wEy3ZgAAYMAAk9EABsAAmS6BmsAAQFXAAEBiwABA/gAAsGAAAAABA8AAQG7AAED+AAAAAQEBwABAdwAAAIPuYMAAlKYAAF4AAQEBWwABV8AAkn4AWwE+Ak7AAECQwABAmQAAwABhd14AAQEBWwABV8AAkn4AWwEcwABAmy6ahwEAARbAAECmgMAAQKHATLgEgmnAAJSXAMAAmQtKwABAsQE0wABAuAPAAEC4wABA+gAAAAEBAcAAQLkAAABbWwAAYMAAlKYBPgFKwABAzAEfwABA18AAlK8BAAEmwABA5wEcwABA54HAAEDfwEy4JyABAAGCwABA6MBMuIMAAGDAAJPRAAbAAJkvgZrAAEEDwABBEMAAQhQAAIZTAAAAAQPAAEEowABCFAAAAAEBAcAAQT0AAACD7mDAAJSwAABeAAEBAVsAAVfAAJJ+AFsBPgNOwABBVsAAQV8AAMAAYYJeAAEBAVsAAVfAAJJ+AFsBHMAAQWEumocBAAEWwABBbIDAAEFnwEy4+4C9wACUsgDAAJkLTsAAQYTAAEGRAADAAGGDXgABAQFbAAFXwACSfgBbARzAAEGTLpqHAQABFsAAQZ6AwABBmcBMuPuCasAAlLMAwACZC0rAAEGtATTAAEG0A8AAQbTAAEIQAAAAAQEBwABBtQAAAFtbAABgwACUsAFKwABBywEfwABBz8AAlLwCAAImwABB6wEcwABB64HAAEHjwEy5HiABAAGDwABB7MBMub0AAGDAAJTqJsAAQgQBHMAAQgSCwABB+MBMuWEgAQABg8AAQgXATLm9AABgwACV4QAGwACZMIGawABCGcAAQibAAELWAACGHQAAAAEDwABCO8AAQtYAAAABAQHAAEJNAAAAg+5gwACUvQAAXgABAQFbAAFXwACSfgBbAT4CTsAAQmbAAEJvAADAAGF3XgABAQFbAAFXwACSfgBbARzAAEJxLpqHAQABFsAAQnyAwABCd8BMuluCacAAlMAAwACZC0rAAEKHATTAAEKOA8AAQo7AAELSAAAAAQEBwABCjwAAAFtbAABgwACUvQFKwABCnQEfwABCocAAlMkCAAIWwABCt4DAAEKywEy6W5j7wACUvybAAELGARzAAELGgcAAQr7ATLp+IAEAAYLAAELHwEy62gAAYMAAk8wABsAAmTGBmsAAQtvAAELowABDOwAAsF8AAAABA8AAQv3AAEM7AAAAAQEBwABDDwAAAIPuYMAAlMoAAF4AAQEBWwABV8AAkn4AWwFKwABDHgEmwABDHgEcwABDHi7AAGF6AQABJ7BfAMAAmSJeAAEBAVsAAVfAAJJ+AFsGwACZMoGawABDP8AAQ0zAAEOiAACwXAAAAAEDwABDYsAAQ6IAAAABAQHAAEN1AAAAg+5gwACVAgAAXgABAQFbAAFXwACSfgBbAUrAAEOEASbAAEOEARzAAEOELsAAYXoBAAEnsFwAwACZIl4AAQEBWwABV8AAkn4AWwbAAJkzgZrAAEOnwABDtMAARYgAALBaAAAAAQPAAEPQwABFiAAAAAEBAcAAQ+kAAACD7mDAAJUSAABeAAEBAVsAAVfAAJJ+AFsBPgJOwABECMAARBoAAMAAYYRdwAD8dAFeAAEBAVsAAVfAAJJ+AFsBHMAAREEcwABENhbAAEQpgMAARCTATLxYrWzAAJUUgKsBAV4AAQEBWwABV8AAkn4AWwEWwABEOi6ah8AAmQsAwAD8PYCtAAAAAMAA/EhKwABETwE0wABEVgPAAERWwABFhAAAAAEBAcAARFcAAABbWwAAYMAAlRIBPgNOwABEh8AARJQAAK1sXcAA/HQBYMAAlUEBMcAARK5gwACVQQBGwABEuMAARO3AAETKAAAAmqteAAEBAVsAAVfAAJJ+AFsAgcAARNrATLx7PgJOwABE+8AARQIAAIF2WwEcwABFEITAAEUEwEy9RiABAAGCwABFEcBMvQYAAD0cwABFMoPAAEUlwEy9GlYBAAEmwABFNgGFwABFNsBMvWtgwACVQQDAAPyFSsAARU0BH8AARVjAAJUgAQABg8AARXDATL0aAAbAAJk0gZrAAEWNwABFmsAARtYAALBXAAAAAQPAAEWpwABG1gAAAAEBAcAARbUAAACD7mDAAJUvAABeAAEBAVsAAVfAAJJ+AFsBPgROwABFzsAARd8AAMAAYXheAAEBAVsAAVfAAJJ+AFsBHMAAReEumocBAAEWwABF7IDAAEXnwEy+CLBYwACVMQDAAJkLTsAARgbAAEYJAACpQmDAAP22ARbAAEYQgMAARgvATL4IqULAAJUyTsAARiXAAEYvAADAAGGFXgABAQFbAAFXwACSfgBbARzAAEYxLsAAYVkBAAEWwABGRIDAAEY/wEy+CICWwACVMwDAAJkMSsAARlABNMAARlcDwABGV8AARtIAAAABAQHAAEZYAAAAW1sAAGDAAJUvAT4BSsAARmsBH8AARnbAAJVAAwADJsAARqUBHMAARqWBwABGlcBMvisgAQABhMAARqbATL7zAABgwACU44LAAEaywEy+bibAAEa/ARzAAEa/g8AARrbATL6VIAEAAYTAAEbAwEy+8wAAYMAAlOMABsAAmTWBmsAARtvAAEbowABIHwAAsFYAAAABA8AARwPAAEgfAAAAAQEBwABHGwAAAIPuYMAAlUEAAF4AAQEBWwABV8AAkn4AWwE+A07AAEc0wABHRAAAwABhfl4AAQEBWwABV8AAkn4AWwEcwABHRi6ahwEAARbAAEdRgMAAR0zATL+cnprAAJVDAMAAmQtOwABHcMAAR3oAAMAAYYVeAAEBAVsAAVfAAJJ+AFsBHMAAR3wuwABhWQEAARbAAEePgMAAR4rATL+cgJbAAJUzAMAAmQxKwABHmwE0wABHogPAAEeiwABIGwAAAAEBAcAAR6MAAABbWwAAYMAAlUEBPgFKwABHtgEfwABHwcAAlUoCAAImwABH8gEcwABH8oHAAEfjwEy/vyABAAGDwABH88BMwGAAAGDAAJTqJsAASAgBHMAASAiCwABH/8BMwAIgAQABg8AASAnATMBgAABgwACU4wAGwACZNoGawABIJMAASDHAAElyAACwVQAAAAEDwABIQcAASXIAAAABAQHAAEhOAAAAwABf92DAAJVLAABeAAEBAVsAAVfAAJJ+AFsBPgROwABIZ8AASHUAAMAAYXJeAAEBAVsAAVfAAJJ+AFsBHMAASHcumocBAAEWwABIgoDAAEh9wEzBAIW0wACVTQDAAJkLTsAASJ/AAEioAADAAGFzXgABAQFbAAFXwACSfgBbARzAAEiqLpqHAQABFsAASLWAwABIsMBMwQCBrcAAlU4AwACZC07AAEjNwABI2wAAwABhdF4AAQEBWwABV8AAkn4AWwEcwABI3S6ahwEAARbAAEjogMAASOPATMEAhbXAAJVPAMAAmQtKwABI+AE0wABI/wPAAEj/wABJbgAAAAEBAcAASQAAAABbWwAAYMAAlUsBSsAASQ4BH8AASRLAAJVaAwADJsAASSsBHMAASSuBwABJHsBMwSUgAQABhMAASSzATMIHAABgwACU4ybAAElIARzAAElIgsAASUDATMFoIAEAAYTAAElJwEzCBwAAYMAAlOMmwABJYgEcwABJYoPAAElVwEzBqyABAAGEwABJY8BMwgcAAGDAAJTjAAbAAJk3gZrAAEl3wABJhMAASegAALBUAAAAAQPAAEmMwABJ6AAAAAEBAcAASZEAAACD7mDAAJVqAABeAAEBAVsAAVfAAJJ+AFsBSsAASaABHMAASaAuwABhhgIAAoDAAEmwwEzCzTTAAEm2A8AASbbAAEnnAAAAAgICwABJtwAAAIJFWwDAAEm/AAAAW1sAAGDAAJVqAUrAAEnNAR/AAEnRwACVcQIAAibAAEnVAYHAAEnVwEzDHWDAAJTjJsAASd0BgsAASd3ATMMoXcAA/HQBYMAAlOMAAMAAmTkGwACZOIGawABJ7cAASfrAAEphAACwUwAAAAEDwABKA8AASmEAAAABAQHAAEoJAAAAg+5gwACVWwAAXgABAQFbAAFXwACSfgBbAUrAAEoYARzAAEoYLsAAYYYCAAKAwABKKMBMw6k0wABKLgPAAEouwABKYAAAAAICAsAASi8AAACCRVsAwABKNwAAAFtbAABgwACVWwFKwABKRQEfwABKScAAlWkCAAImwABKTgGBwABKTsBMw/lgwACU4ybAAEpWAYLAAEpWwEzEBF3AAPx0AWDAAJTjAADAAJk5BsAAmTmBmsAASmbAAEpzwABNaAAAwABhhgAAAAEDwABKgsAATWgAAAACAgLAAEqIAAAAg+5gwACVWwDAAEqOAAAAhxhhAltbWwAAXgABAQFbAAFXwACSfgBbAT4DTsAASrzAAErHAADAAGGHXgABAQFbAAFXwACSfgBbARzAAErJLpqHAQABFsAAStSAwABKz8BMxIeCRcAAlV0AwACZC07AAEr4wABLBwAAwABhiF3AAPwyAV4AAQEBWwABV8AAkn4AWwEcwABLPhzAAEsgFsAASxaAwABLEcBMxIdbwACVXoCrAQFeAAEBAVsAAVfAAJJ+AFsBFsAASyQuwABhYcAAmRMAwAD8PYCtAAAAAMAA/EhKwABLqgE0wABLsQPAAEuxwABNZAAAAAEBAcAAS7IAAABbWwAAWwE+BE7AAEvKwABL0QAAgkVgwACTrAEmwABLygEcwABL3YLAAEvTwEzEuSABAAGEwABL3sBMxYgAAGDAAJOsTsAATAHAAEwPAADAAGGJXcAA/HQBYMAAlOMBMcAATB1gwACU4wBGwABMJ8AATFnAAEw5AAAAmqteAAEBAVsAAVfAAJJ+AFsAg8AATEnATMT8PgJOwABMZ8AATG4AAIF2WwEcwABMfIfAAExwwEzGASABAAGEwABMfcBMxYgAAEnAAEyRJcAATJwUwABMlcBMxiYIAF3AAPwyAVs+AT0cwABMw4bAAEy1wEzF04ClAQABJsAATMoBFMAATMrATMYmCAFdwAD8MgFbXcAA/DIBYMAAlOMAwAD8hj4BPRzAAEz8hsAATO7ATMXTVgEAASbAAE0AARTAAE0AwEzGJggAYMAAlOMAwAD8hUrAAE0hARzAAE0ugcAATSjATMSWIAIAAoXAAE0vwEzFmBzAAE1FhsAATTfATMXTgK0BAAABhVgqwAD8SAAABsAAmTqBmsAATW3AAE16wABOawAAsFIAAAABA8AATYXAAE5rAAAAAQEBwABNjQAAAIPuYMAAlXIAAF4AAQEBWwABV8AAkn4AWwE+BE7AAE2mwABNrwAAwABhil4AAQEBWwABV8AAkn4AWwEcwABNsS6ahwEAARbAAE28gMAATbfATMdDha/AAJV1AMAAmQtOwABN1MAATd4AAMAAYYteAAEBAVsAAVfAAJJ+AFsBHMAATeAumocBAAEWwABN64DAAE3mwEzHQ4WxwACVdgDAAJkLTsAATf7AAE4BAACpQmDAAP22ARbAAE4IgMAATgPATMdDqULAAJV0SsAAThABNMAAThcDwABOF8AATmcAAAABAQHAAE4YAAAAW1sAAGDAAJVyAUrAAE4uAR/AAE4ywACVggMAA4PAAE45wEzH7CbAAE5FARzAAE5FgcAATj3ATMdmIAEAAYTAAE5GwEzILAAAYMAAlOMmwABOWwEcwABOW4LAAE5SwEzHqSABAAGEwABOXMBMyCwAAGDAAJTjAAbAAJk7gZrAAE5wwABOfcAATyoAALBRAAAAAQPAAE6IwABPKgAAAAEBAcAATpAAAACD7mDAAJWDAABeAAEBAVsAAVfAAJJ+AFsBPgNOwABOqcAATrUAAMAAYYxeAAEBAVsAAVfAAJJ+AFsBHMAATrcumocBAAEWwABOwoDAAE69wEzI0x/AAJWGAMAAmQtOwABO2MAATtsAAKlCYMAA/bYBFsAATuKAwABO3cBMyNOpQsAAlYVKwABO6gE0wABO8QPAAE7xwABPJgAAAAEBAcAATvIAAABbWwAAYMAAlYMBSsAATwABH8AATwTAAJWRAgACgsAATwvATMk4JsAATxoBHMAATxqBwABPD8BMyPYgAQABg8AATxvATMl4AABgwACU4wAGwACZPIGawABPL8AATzzAAE/sAACwUAAAAAEDwABPSMAAT+wAAAABAQHAAE9RAAAAg+5gwACVkgAAXgABAQFbAAFXwACSfgBbAT4DTsAAT2rAAE92AADAAGGMXgABAQFbAAFXwACSfgBbARzAAE94LpqHAQABFsAAT4OAwABPfsBMyfcfwACVlQDAAJkLTsAAT5nAAE+cAACpQmDAAP22ARbAAE+jgMAAT57ATMn3qULAAJWUSsAAT6sBNMAAT7IDwABPssAAT+gAAAABAQHAAE+zAAAAW1sAAGDAAJWSAUrAAE/BAR/AAE/FwACVoAIAAoLAAE/NwEzKXCbAAE/cARzAAE/cgcAAT9HATMoaIAEAAYPAAE/dwEzKnAAAYMAAlOMABsAAmT2BmsAAT/HAAE/+wABQUwAAsE8AAAABA8AAUA7AAFBTAAAAAQEBwABQGwAAAIPuYMAAla4AAF4AAQEBWwABV8AAkn4AWwFKwABQKgE0wABQKgPAAFAqwABQUwAAAAEBAcAAUCsAAABbWwAAYMAAla4BSsAAUDkBH8AAUD3AAJW3AQABFsAAUE6AwABQScBMyxuAvcAAlaMABsAAmT6BmsAAUFjAAFBlwABQlgAAsE4AAAABA8AAUG7AAFCWAAAAAQEBwABQdAAAAIPuYMAAlcoAAF4AAQEBWwABV8AAkn4AWwFKwABQfQE0wABQfQPAAFB9wABQlgAAAAEBAcAAUH4AAABbWwAAYMAAlcoBSsAAUIwBH8AAUJDAAJXRAAAAAAbAAJk/gZrAAFCbwABQqMAAURUAAIZRAAAAAQPAAFDAwABRFQAAAAEBAcAAUNUAAACD7mDAAJW4AABeAAEBAVsAAVfAAJJ+AFsBSsAAUOQBNMAAUOQDwABQ5MAAURUAAAABAQHAAFDlAAAAW1sAAGDAAJW4AUrAAFDzAR/AAFD3wACVwQEAARbAAFEQgMAAUQvATMw/gL3AAJWjAAbAAJlAgZrAAFEawABRJ8AAUXYAALBNAAAAAQPAAFE1wABRdgAAAAEBAcAAUUAAAACD7mDAAJXCAABeAAEBAVsAAVfAAJJ+AFsBSsAAUU8BNMAAUU8DwABRT8AAUXYAAAABAQHAAFFQAAAAW1sAAGDAAJXCAUrAAFFeAR/AAFFiwACVyQEAARbAAFFxgMAAUWzATMzbgL3AAJWjAAbAAJlBgZrAAFF7wABRiMAAUoEAALBMAAAAAQPAAFGTwABSgQAAAAEBAcAAUaMAAACD7mDAAJYAAABeAAEBAVsAAVfAAJJ+AFsBPgNOwABRvMAAUckAAMAAYY1eAAEBAVsAAVfAAJJ+AFsBHMAAUcsumocBAAEWwABR1oDAAFHRwEzNd4V5wACWAgDAAJkLTsAAUfLAAFH/AADAAGGOXgABAQFbAAFXwACSfgBbARzAAFIBLpqHAQABFsAAUgyAwABSB8BMzXek3sAAlgMAwACZC0rAAFIbATTAAFIiA8AAUiLAAFJ9AAAAAQEBwABSIwAAAFtbAABgwACWAAFKwABSOQEfwABSPcAAlg4CAAImwABSWAEcwABSWIHAAFJMwEzNmiABAAGDwABSWcBMzjkAAGDAAJTjJsAAUnEBHMAAUnGCwABSZcBMzd0gAQABg8AAUnLATM45AABgwACU4wAGwACZQoGawABShsAAUpPAAFOTAACwSwAAAAEDwABSpcAAU5MAAAABAQHAAFK0AAAAg+5gwACV0gAAXgABAQFbAAFXwACSfgBbAT4DTsAAUs3AAFLdAADAAGF+XgABAQFbAAFXwACSfgBbARzAAFLfLpqHAQABFsAAUuqAwABS5cBMzteAvcAAldQAwACZC07AAFMCwABTDwAAwABhg14AAQEBWwABV8AAkn4AWwEcwABTES6ahwEAARbAAFMcgMAAUxfATM7XgmrAAJXVAMAAmQtKwABTKwE0wABTMgPAAFMywABTjwAAAAEBAcAAUzMAAABbWwAAYMAAldIBSsAAU0kBH8AAU03AAJXgAgACJsAAU2oBHMAAU2qBwABTW8BMzvogAQABg8AAU2vATM+ZAABgwACU6ibAAFODARzAAFODgsAAU3fATM89IAEAAYPAAFOEwEzPmQAAYMAAleEABsAAmUOBmsAAU5jAAFOlwABWDgAAsEoAAAABA8AAU63AAFYOAAAAAQEBwABTsgAAAIPuYMAAleEAAF4AAQEBWwABV8AAkn4AWwE+A07AAFPRwABT3QAAwABhj13AAPx0AV4AAQEBWwABV8AAkn4AWwEcwABT/xzAAFPrFsAAU+SAwABT38BM0DeD78AAleOAqwEBXgABAQFbAAFXwACSfgBbARbAAFPvLsAAYVrAAJkNAMAA/D2ArQAAAADAAPxITsAAVBrAAFQjAADAAGF3XgABAQFbAAFXwACSfgBbARzAAFQlLpqHAQABFsAAVDCAwABUK8BM0DeCacAAleQAwACZC0rAAFSJATTAAFSQA8AAVJDAAFYKAAAAAQEBwABUkQAAAFtbAABgwACV4QE+BE7AAFS0wABUuwAAg+9dwAD8dAFgwACVwgExwABUyGDAAJXCAEbAAFTSwABVAcAAVOQAAACaq14AAQEBWwABV8AAkn4AWwCBwABU9MBM0Fo+Ak7AAFUPwABVFgAAgXZbARzAAFUkhcAAVRjATNFqIAEAAYPAAFUlwEzRKgAAScAAVTklwABVRIbAAFU9wEzRj13AAPwyAVs+AT0cwABVZITAAFVdwEzRPoClAQABJsAAVWsBFMAAVWvATNGPBgFdwAD8MgFbXcAA/DIBYMAAlcIAwAD8hj4BPRzAAFWWhMAAVY/ATNE+VgEAASbAAFWaAYbAAFWawEzRj2DAAJXCAMAA/IVOwABVxcAAVcoAAIJpYMAAk8wBJsAAVcUBHMAAVdSCwABVzMBM0M4gAQABg8AAVdXATNEqAABgwACTzErAAFXnAR/AAFXywACV8AIAAoTAAFX2wEzRPibAAFX+AYXAAFX+wEzSQWDAAJPRAAbAAJlEgZrAAFYTwABWIMAAVl4AALBJAAAAAQPAAFY3wABWXgAAAAEBAcAAVksAAACD7mDAAJYrAABeAAEBAVsAAVfAAJJ+AFsBSsAAVlQBHsAAVlTAAJkJAQABgMAAVlnATNLVAAbAAJlFgZrAAFZjwABWcMAAVqYAALBHAAAAAQPAAFaDwABWpgAAAAEBAcAAVpMAAACD7mDAAJYZAABeAAEBAVsAAVfAAJJ+AFsBSsAAVpwBHsAAVpzAAJkJAQABgMAAVqHATNM7AAbAAJlGgZrAAFarwABWuMAAVvcAALBFAAAAAQPAAFbLwABW9wAAAAEBAcAAVtsAAACD7mDAAJYiAABeAAEBAVsAAVfAAJJ+AFsBSsAAVuQBNMAAVuQDwABW5MAAVvcAAAABAQHAAFblAAAAW1sAAGDAAJYiAUrAAFbzAYDAAFbzwEzToQbAAJlHgZrAAFb8wABXCcAAV18AALBEAAAAAQPAAFcZwABXXwAAAAEBAcAAVyYAAACD7mDAAJY7AABeAAEBAVsAAVfAAJJ+AFsBSsAAVzUBNMAAVzUDwABXNcAAV18AAAABAQHAAFc2AAAAW1sAAGDAAJY7AUrAAFdEAR/AAFdIwACWRAEAARbAAFdZgMAAV1TATNQlgJbAAJY9AAbAAJlIgZrAAFdkwABXccAAV80AALBDAAAAAQPAAFeDwABXzQAAAAEBAcAAV5IAAACD7mDAAJZNAABeAAEBAVsAAVfAAJJ+AFsBSsAAV6EBNMAAV6EDwABXocAAV80AAAABAQHAAFeiAAAAW1sAAGDAAJZNAUrAAFewAR/AAFe0wACWVgEAARbAAFfHgMAAV8LATNTBgJbAAJZPAAbAAJlJgZrAAFfSwABX38AAWDsAALBCAAAAAQPAAFfxwABYOwAAAAEBAcAAWAAAAACD7mDAAJZjAABeAAEBAVsAAVfAAJJ+AFsBSsAAWA8BNMAAWA8DwABYD8AAWDsAAAABAQHAAFgQAAAAW1sAAGDAAJZjAUrAAFgeAR/AAFgiwACWbgEAARbAAFg1gMAAWDDATNVdgJbAAJZlAAbAAJlKgZrAAFhAwABYTcAAWJkAALBBAAAAAQPAAFhdwABYmQAAAAEBAcAAWGoAAACD7mDAAJZFAABeAAEBAVsAAVfAAJJ+AFsBSsAAWHkBNMAAWHkDwABYecAAWJkAAAABAQHAAFh6AAAAW1sAAGDAAJZFAUrAAFiIAR/AAFiMwACWTAAAAAAGwACZS4GawABYnsAAWKvAAFocAACFuwAAAAEDwABYw8AAWhwAAAABAQHAAFjYAAAAg+5gwACWVwAAXgABAQFbAAFXwACSfgBbAT4CTsAAWPfAAFkCAADAAGGQXcAA/HQBXgABAQFbAAFXwACSfgBbARzAAFkiHMAAWRcWwABZEYDAAFkMwEzWgYR/wACWWYCrAQFeAAEBAVsAAVfAAJJ+AFsBFsAAWRsumofAAJkLAMAA/D2ArQEAAAGFWCrAAPxISsAAWT8BNMAAWUYDwABZRsAAWhgAAAABAQHAAFlHAAAAW1sAAGDAAJZXAT4CTsAAWWjAAFluAACEf13AAPx0AWDAAJYzASbAAFloARzAAFnNHMAAWYaBwABZcMBM1qSAqwEBWwE0wABZigPAAFmKwABZwAAAAAEBAcAAWZgAAACaq14AAQEBWwABV8AAkn4AWwAAWwFKwABZqQEcwABZtYPAAFmpwEzXkSABAAGCwABZtsBM1zIAAADAAPw9gK0BAAABhVgqwAD8SF3AAPx0AWDAAJYzSsAAWewBH8AAWffAAJZiAQABg8AAWgvATNdGAAbAAJlMgZrAAFohwABaLsAAWlAAAIZYAAAAAQPAAFo3wABaUAAAAAEBAcAAWj0AAACD7mDAAJTtAABeAAEBAVsAAVfAAJJ+AFsBSsAAWkYBHsAAWkbAAJkJAQABgMAAWkvATNgzAAbAAJlNgZrAAFpVwABaYsAAWzgAALA+AAAAAQPAAFpywABbOAAAAAEBAcAAWn8AAACD7mDAAJUhAABeAAEBAVsAAVfAAJJ+AFsBPgJOwABamMAAWqUAAMAAYZFeAAEBAVsAAVfAAJJ+AFsBHMAAWqcumocBAAEWwABasoDAAFqtwEzYmbA/wACVIwDAAJkLSsAAWsEBNMAAWsgDwABayMAAWzQAAAABAQHAAFrJAAAAW1sAAGDAAJUhAT4CTsAAWufAAFrwAACwP2DAAJTjASbAAFrnARzAAFr+gcAAWvLATNi8IAEAAYLAAFr/wEzZGAAAYMAAlONKwABbEQEfwABbGMAAlS4BAAGDwABbJMBM2SwABsAAmU6BmsAAWz3AAFtKwABdBQAAsD0AAAABA8AAW1/AAF0FAAAAAQEBwABbcQAAAIPuYMAAlm8AAF4AAQEBWwABV8AAkn4AWwE+Ak7AAFu2wABbxAAAwABhkl3AAPx0AV4AAQEBWwABV8AAkn4AWwEcwABb5xzAAFvcFsAAW9OAwABbzsBM2ayIP8AAlnGAqwEBXgABAQFbAAFXwACSfgBbARbAAFvgLpqHwACZCwDAAPw9gK0BAAABhVgqwAD8SErAAFwEATTAAFwLA8AAXAvAAF0BAAAAAQEBwABcDAAAAFtbAABgwACWbwE+Ak7AAFwwwABcOQAAiD9dwAD8dAFgwACU4wEcwABcthzAAFxUgcAAXDvATNnPgKsBAWDAAJTjATTAAFxzA8AAXHPAAFypAAAAAQEBwABcgQAAAJqrXgABAQFbAAFXwACSfgBbAABgwACU4wFKwABckgEmwABckgEcwABcnoPAAFySwEzauiABAAGCwABcn8BM2l0AAGDAAJTjAMAA/D2ArQEAAAGFWCrAAPxISsAAXNUBH8AAXODAAJZ8AQABg8AAXPHATNpxAAbAAJlPgZrAAF0KwABdF8AAXWUAALA8AAAAAQPAAF0lwABdZQAAAAEBAcAAXTAAAACD7mDAAJZ9AABeAAEBAVsAAVfAAJJ+AFsBPgFKwABdPAE0wABdQwPAAF1DwABdYQAAAAEBAcAAXUQAAABbWwAAYMAAln0BSsAAXVIBH8AAXVbAAJaIAAAAAAbAAJlQgZrAAF1qwABdd8AAX7sAALA5AAAAAQPAAF2NwABfuwAAAAEBAcAAXaAAAACD7mDAAJaJAABeAAEBAVsAAVfAAJJ+AFsBPgNOwABdv8AAXc4AAMAAYZNdwAD8dAFeAAEBAVsAAVfAAJJ+AFsBHMAAXfwcwABd6BbAAF3dgMAAXdjATNvqsDrAAJaLgKsBAV4AAQEBWwABV8AAkn4AWwEWwABd7C7AAGFawACZDQDAAPw9gK0AAAAAwAD8SE7AAF4PwABeGgAAsDtgwAD6CgEWwABeIYDAAF4cwEzb6rA7wACWjErAAF4xATTAAF44A8AAXjjAAF+3AAAAAQEBwABeOQAAAFtbAABgwACWiQE+A07AAF5bwABeZgAAsDpdwAD8dAFgwACWmAExwABecmDAAJaYAEbAAF58wABersAAXo4AAACaq14AAQEBWwABV8AAkn4AWwCBwABensBM3A0+Ak7AAF68wABewwAAgXZbARzAAF7RhcAAXsXATN0BIAEAAYPAAF7SwEzcwQAAScAAXuYlwABe8YbAAF7qwEzdJl3AAPwyAVs+AT0cwABfFYTAAF8KwEzc1YClAQABJsAAXxwBFMAAXxzATN0mBgFdwAD8MgFbXcAA/DIBYMAAlpgAwAD8hj4BPRzAAF9LhMAAX0DATNzVVgEAASbAAF9PAYbAAF9PwEzdJmDAAJaYAMAA/IVKwABfcAEfwABfe8AAlpcCAAGEwABfjcBM3NUBsDuCwABfpcBM3IEGwACZUYGawABfwMAAX83AAGCyAACwOAAAAAEDwABf2sAAYLIAAAABAQHAAF/kAAAAg+5gwACWmAAAXgABAQFbAAFXwACSfgBbAT4DTsAAX/3AAGAGAADAAGGCXgABAQFbAAFXwACSfgBbARzAAGAILpqHAQABFsAAYBOAwABgDsBM3iiAvcAAlpoAwACZC07AAGArwABgNQAAwABhhV4AAQEBWwABV8AAkn4AWwEcwABgNy6ahwEAARbAAGBCgMAAYD3ATN4ogJbAAJabAMAAmQtKwABgTgE0wABgVQPAAGBVwABgrgAAAAEBAcAAYFYAAABbWwAAYMAAlpgBPgFKwABgaQEfwABgdMAAlqQCAAImwABghQEcwABghYHAAGB9wEzeSyABAAGDwABghsBM3uoAAGDAAJTjJsAAYJsBHMAAYJuCwABgksBM3o4gAQABg8AAYJzATN7qAABgwACU4wAGwACZUoGawABgt8AAYMTAAGEiAACwNwAAAAEDwABg1sAAYSIAAAABAQHAAGDlAAAAg+5gwACXKQAAXgABAQFbAAFXwACSfgBbAUrAAGD0ATTAAGD0A8AAYPTAAGEiAAAAAQEBwABg9QAAAFtbAABgwACXKQFKwABhAwEfwABhB8AAlzYBAAEWwABhGoDAAGEVwEzfihvAAJcrAAbAAJlTgZrAAGEnwABhNMAAYWYAALA1AAAAAQPAAGFAwABhZgAAAAEBAcAAYUkAAACD7mDAAJdFAABeAAEBAVsAAVfAAJJ+AFsBSsAAYVIBJsAAYVIBHMAAYVIuwABhegEAASewNQDAAJkiXgABAQFbAAFXwACSfgBbBsAAmVSBmsAAYWvAAGF4wABiIAAAsDYAAAABA8AAYYLAAGIgAAAAAQEBwABhiQAAAIPuYMAAlzcAAF4AAQEBWwABV8AAkn4AWwE+Ak7AAGGiwABhsQAAwABhe14AAQEBWwABV8AAkn4AWwEcwABhsy6ahwEAARbAAGG+gMAAYbnATOCfgmvAAJc5AMAAmQtKwABhzwE0wABh1gPAAGHWwABiHAAAAAEBAcAAYdcAAABbWwAAYMAAlzcBPgFKwABh6gEfwABh9cAAl0QBAAEmwABiCQEcwABiCYHAAGH7wEzgwiABAAGCwABiCsBM4R4AAGDAAJTjAAAATI7sAEyPhQBMj8EATJArAEyQYQBMkRUATJGbAEyR9gBMkkwATJK7AEyTKgBMlE4ATJVyAEyXYABMmFcATJoOAEybPABMnD8ATJ4xAEygNQBMonkATKM2AEyjpABMpDkATKeGAEypBQBMquEATKxeAEyssABMrdQATK74AEyvdgBMr/QATLC/AEyxmABMsmEATLPgAEy1AgBMtpwATLfaAEy40QBMujEATLs6AEy7tABMvC4ATL3eAEy/cgBMwNYATMKjAEzDfwBMxFsATMcZAEzIqQBMyc0ATMrxAEzLjQBMzBUATMyxAEzNTQBMzq0ATNANAEzSqwBM0xEATNN3AEzT+wBM1JcATNUzAEzVzwBM1lcATNgJAEzYbwBM2YIATNs2AEzbwABM3f4ATN9gAEzf+wBM4HUATOFsAAAATgLAAJlXgZrAAGKzwABiucAAZVkDwABhlAAAAV3AAJLRAVsAAAMEwACZWYGawABi+sAAYyQJwABhlQBdwAD9ZwFgwACTrAEewABjGcAAwOIAAWDAAJOsAAAEwACZWoGawABjOsAAY1cJwABhSwBdwAD9ZwFgwAD9tgEewABjSsAAwOIAAWDAAP22AAAEwACZW4GawABjX8AAY2gYgO4AYMAA+9ABkwEFwACZYoGawABjbcAAY23AAGOHAAAAA8AAY4XAAGOHAAAAAAAAAGDAAJlXAT8BCQHAAGNtwACTGwAAAAAEBsAAmV2BmsAAY4zAAGORwABj5gAAwABhWAAAAAEDwABjqsAAY+YAAAABAQHAAGOwAAAAg+5gwACTrAAAYMAA+goBSsAAY78BHMAAY9gWwABjvy7AAGGVwACZWYMXAQABgMAAY+HATOO8AMAA/XMGwACZXoGawABj68AAY/DAAGQcAACahwAAAAEDwABj9cAAZBwAAAABAQHAAGP7AAAAg+5gwACTrAAAXAE+AT0cwABkDIDAAGQHwEzkKIRNAQFbAS4AwACTtAbAAJlfgZrAAGQhwABkJsAAZLIAAMAARjkAAAABA8AAZC/AAGSyAAAAAQEBwABkNQAAAIPuYMAAk6wAAFwBPgNOwABkRcAAZEwAAJqbYMAA+9ABFsAAZE4ugO7AAJlbPRzAAGRegMAAZFnATOSDhE4BAVsBLgDAAJO1ScAAZHchHMAAZIEWwABkey6A7sAAmVtIAQABgcAAZITATOSYAMAA/PM9HMAAZKUWwABkjC7AAGGVwACZWVYBAAGAwABkqcBM5IMAwAD9dD8GwACZYIGawABkt8AAZLfAAGVXAADAAF/9AAAAAQPAAGTMwABlVwAAAAEBAcAAZN4AAACD7mDAAJalAABbAT4DPRzAAGUDFsAAZOouwABhlcAAmVlWAQABgMAAZQfATOVNAMAA/XRJwABlEhbAAGUbgMAAZRbATOVNo63AAJaoPRzAAGUuFsAAZSQuwABhS8AAmVpWAQABJsAAZTcBFsAAZTeAwABlMsBM5U3AAEZPwACWp2DAAP22AMAA/XQ/PRfAAGVOLoDuHMAAZUwWwABlTi6A7sAAmVtkAQABlADAAPz1wACZWwAATOOQAEzj/gBM5FcATOUhAEzmBwAAAAQCwACZY4GcgTaBPMAAQCADwABhlgAAAWDAAP0cAAFdwACTHAJgwAD6CmDAAJOsAAEFwACZqYGcgXeBfYGRAQAAA4GPgZEAAAAAAAAAYMAAmWMBPwEJAYF9wAD9MgAAAABDBsAAmWWBnIImgiuCUgAAwABhlwAAAAEDgjGCUgAAAAICAoI3AAAAvRlgwACTrACCQwAAAL0aYMAAk6wAAGDAAPoKAUqCTQEqBsAAmWaBnIKngqyDBgAAwABhmAAAAAEDgraDBgAAAAQEBIK8AAAAvRlgwACTrACCygAAAIcbYMAA/RwAgtcAAAC9GmDAAJOsAILlAAAAhxxgwAD9HAAAYMAA+goBSoL2ARyC/YGC9sBM5vhIAQABg4MAwEznEgDAAP0pBsAAmWeBnINSg1eDsQAAwABhmQAAAAEDg2GDsQAAAAQEBINnAAAAvRlgwACTrACDdQAAAMAAYZpgwAD9tgCDggAAAL0aYMAAk6wAg5AAAADAAGGbYMAA/bYAAGDAAPoKAUqDoQEcg6iBg6HATOdzSAEAAYODq8BM548AwAD9xQbAAJlogZyDtoO7hHsAAMAAYZwAAAABA4PEhHsAAAACAgKDygAAAL0ZYMAAk6wAg9YAAAC9GmDAAJOsAABgwAD6CgE+A0mD4x6D58AA9bECAAKAg/HATOflgYP4wEzn8gBKhAABKT9JhBEiHIQbgIQVwEzn5UgBAAErAMAA/SkBHIQsgYQmwEzn8kgBAAErAMAA/SlKhDUBHIQ8LsAAYZcCAAKAhEPATOflgYRKwEzn8gDAAJllP0qEVgEchGOAhF3ATOflhW8CAmDAAPoKYMAAk6wCLoGEccBM5/IAwACTtgbAAJlpgZyEgISFhg4AAMAAYZ0AAAABA4SShg4AAAACAgKEngAAAMAAYZ5dwAD8dAFgwACTrACEsAAAAMAAYZ9dwAD8dAFgwACTrAAAYMAA+goBPgROhMGExwAAJ2DAAPvQAZNDhNAiHITdgoTXwEzo+mMBAAEWhOWAhN/ATOjGYcAA/KMAwAD8/QAchPWChO/ATOj6YwEAARaE/YGE98BM6NthwAD8owDAAPz9PgJJhQ0hHIUSLsAAYZwCAAIchSGAhRzATOjGSwEAAYKFIsBM6PoAwAD8gxyFL4GFKsBM6NtLAQABgoUwwEzo+gDAAPyDAMAAmWhKhTkBKj89ioVNwEzo+hyFUoKFTcBM6PpkAQABlADAAPz1SYVgHIVqgoVkwEzo+mMBAAEWhXKAhWzATOjGYcAA/KMAwAD8/T4BSoWCARyFiS7AAGGXAgACHIWVgIWQwEzoxksBAAGChZbATOj6AMAA/IMrAMAAmWVJhbAchbqChbTATOj6YwEAARaFwoGFvMBM6NthwAD8owDAAPz9PgFKhdIBHIXZLsAAYZcCAAIcheWBheDATOjbSwEAAYKF5sBM6PoAwAD8gysAwACZZT9Khf8BKQbAAJlqgZyGE4YkhsoAALBvAWqGFGDAAP0cAgAAAQOGMIbKAAAAAgIChjkAAACD7mDAAJPAAIZEAAAghXBgwACTrAAAYMAA+goBPgNJhk8hJYZXgYZTwEzqpWDAAJPASoZkARyGay7AAGGXAgACgIZywEzqmIGGeMBM6qUAwACZZT9OhoqGkAAAg9ZgwACTwAEmhooBgYaSwEzqpWDAAJPASoabARyGoi7AAGGdAgACFoa1gIawwEzqmIJpwACTwhaGwYKGu8BM6vKCacAAk8IAwACZaQbAAJlrgZyGz4bgh+QAALAqAWqG0GDAAP0cAgAAAQOG/IfkAAAAAgIChxUAAACD7mDAAJcaAIcgAAAghXBgwACTrAAAYMAA+goBPgNJhyshJYczgYcvwEzremDAAJcaSodQARyHVy7AAGGXAgACgIdewEzrbYGHZMBM63oAwACZZT9Oh4aHjAAAg9ZgwACXGgEmh4YBgYeOwEzremDAAJcaSoeXARyHni7AAGGYBAAEgIepwEzrbRaHtICHr8BM623AAEZPwACXHIKHxMBM68cWh9GCh8vATOvHwABGT8AAlxwAwACZZgbAAJlsgZyH6Yf6iPYAALAsAWqH6mDAAP0cAgAAAQOIFIj2AAAAAgICiCsAAACD7mDAAJcHAIg2AAAghXBgwACTrAAAYMAA+goBPgNJiEEhJYhJgYhFwEzsYWDAAJcHSohkARyIay7AAGGXAgACgIhywEzsVIGIeMBM7GEAwACZZT9OiJiIngAAg9ZgwACXBwEmiJgBgYigwEzsYWDAAJcHSoipARyIsC7AAGGYBAAEgIi7wEzsVBaIxoCIwcBM7FTAAEZPwACXCYKI1sBM7K4WiOOCiN3ATOyuwABGT8AAlwkAwACZZgbAAJltgZyI+4kMigQAALAuAWqI/GDAAP0cAgAAAQOJJYoEAAAAAgICiTsAAACD7mDAAJbyAIlGAAAghXBgwACTrAAAYMAA+goBPgNJiVEhJYlZgYlVwEztSGDAAJbySolzARyJei7AAGGXAgACgImBwEztO4GJh8BM7UgAwACZZT9OiaaJrAAAg9ZgwACW8gEmiaYBgYmuwEztSGDAAJbySom3ARyJvi7AAGGYBAAEgInJwEztOxaJ1ICJz8BM7TvAAEZPwACW9IKJ5MBM7ZUWifGCievATO2VwABGT8AAlvQAwACZZgbAAJlugZyKCYoaixYAALAvAWqKCmDAAP0cAgAAAQOKNIsWAAAAAgICiksAAACD7mDAAJbbAIpWAAAghXBgwACTrAAAYMAA+goBPgNJimEhJYppgYplwEzuL2DAAJbbSoqEARyKiy7AAGGXAgACgIqSwEzuIoGKmMBM7i8AwACZZT9OiriKvgAAg9ZgwACW2wEmirgBgYrAwEzuL2DAAJbbSorJARyK0C7AAGGYBAAEgIrbwEzuIhaK5oCK4cBM7iLAAEZPwACW3YKK9sBM7nwWiwOCiv3ATO58wABGT8AAlt0AwACZZgbAAJlvgZyLG4ssjCAAALAxAWqLHGDAAP0cAgAAAQOLRIwgAAAAAgICi1kAAACD7mDAAJbIAItkAAAghXBgwACTrAAAYMAA+goBPgNJi28hJYt3gYtzwEzvFmDAAJbISouQARyLly7AAGGXAgACgIuewEzvCYGLpMBM7xYAwACZZT9Oi8KLyAAAg9ZgwACWyAEmi8IBgYvKwEzvFmDAAJbISovTARyL2i7AAGGYBAAEgIvlwEzvCRaL8ICL68BM7wnAAEZPwACWyoKMAMBM72MWjA2CjAfATO9jwABGT8AAlsoAwACZZgbAAJlwgZyMJYw2jTYAALAzAWqMJmDAAP0cAgAAAQOMUY02AAAAAgICjGkAAACD7mDAAJazAIx0AAAghXBgwACTrAAAYMAA+goBPgNJjH8hJYyHgYyDwEzv/WDAAJazSoyjARyMqi7AAGGXAgACgIyxwEzv8IGMt8BM7/0AwACZZT9OjNiM3gAAg9ZgwACWswEmjNgBgYzgwEzv/WDAAJazSozpARyM8C7AAGGYBAAEgIz7wEzv8BaNBoCNAcBM7/DAAEZPwACWtYKNFsBM8EoWjSOCjR3ATPBKwABGT8AAlrUAwACZZgbAAJlxgZyNO41MjgIAALA1AWqNPGDAAP0cAgAAAQONWI4CAAAAAgICjWEAAACD7mDAAJdFAI1sAAAghXBgwACTrAAAYMAA+goBPgNJjXchJY1/gY17wEzw5GDAAJdFSo2MARyNky7AAGGXAgACgI2awEzw14GNoMBM8OQAwACZZT9OjbKNuAAAg9ZgwACXRQEmjbIBgY26wEzw5GDAAJdFSo3DARyNyi7AAGGYBAAEgI3VwEzw1xaN4ICN28BM8NeccMAAl0eCjenATPExFo32go3wwEzxMZxwwACXRwDAAJlmBsAAmXKBnI4HjhiOvgAAsDYBao4IYMAA/RwCAAABA44ijr4AAAACAgKOKQAAAIPuYMAAlzcAjjQAACCFcGDAAJOsAABgwAD6CgE+A0mOPyEljkeBjkPATPHHYMAAlzdKjlIBHI5ZLsAAYZcCAAKAjmDATPG6gY5mwEzxxwDAAJllP06Odo58AACD1mDAAJc3ASaOdgGBjn7ATPHHYMAAlzdKjocBHI6OLsAAYZwCAAIWjp2AjpjATPG6gmvAAJc5Fo6vgo6pwEzyFIJrwACXOQDAAJloBsAAmXOBnI7DjtSPogAAsDcBao7EYMAA/RwCAAABA47mj6IAAAACAgKO9QAAAIPuYMAAlykAjwAAACCFcGDAAJOsAABgwAD6CgE+A0mPCyEljxOBjw/ATPKcYMAAlylKjyYBHI8tLsAAYZcCAAKAjzTATPKPgY86wEzynADAAJllP06PUo9YAACD1mDAAJcpASaPUgGBj1rATPKcYMAAlylKj2MBHI9qLsAAYZgEAASAj3XATPKPFo+AgI97wEzyjxvAAJcrgo+JwEzy6RaPloKPkMBM8ukbwACXKwDAAJlmBsAAmXSBnI+nj7iQjAAAsDgBao+oYMAA/RwCAAABA4/FkIwAAAACAgKPzwAAAIPuYMAAlpgAj9oAACCFcGDAAJOsAABgwAD6CgE+A0mP5SElj+2Bj+nATPN9YMAAlphKj/sBHJACLsAAYZcCAAKAkAnATPNwgZAPwEzzfQDAAJllP06QIpAoAACD1mDAAJaYASaQIgGBkCrATPN9YMAAlphKkDMBIhyQOi7AAGGcAgACFpBJgJBEwEzzcIC9wACWmhaQVYKQT8BM88qAvcAAlpoAwACZaAAckGYuwABhnAIAAhaQdYCQcMBM83CAlsAAlpsWkIKCkHzATPPKgJbAAJabAMAAmWgGwACZdYGckJGQopF8AACwOQFqkJJgwAD9HAIAAAEDkLiRfAAAAAICApDLAAAAg+5gwACWiQCQ1gAAIIVwYMAAk6wAAGDAAPoKAT4DSZDhISWQ6YGQ5cBM9IRgwACWiUqRAAEckQcuwABhlwIAAoCRDsBM9HeBkRTATPSEAMAAmWU/TpEwkTYAAIPWYMAAlokBJpEwAYGROMBM9IRgwACWiUqRQQEckUguwABhnQIAAhaRW4CRVsBM9HewOsAAlosWkW2CkWfATPTRsDrAAJaLAMAAmWkGwACZdoGckYGRkpIFAACwPAFqkYJgwAD9HAIAAAEDkaCSBQAAAAICApGrAAAAg+5gwACWfQCRtgAAIIVwYMAAk6wAAGDAAPoKAT4CSZHBISWRyYGRxcBM9VlgwACWfUqR2AEckd8uwABhlwIAAoCR5sBM9UyBkezATPVZAMAAmWU/SpH2ASkGwACZd4GckgqSG5LtAACwPQFqkgtgwAD9HAIAAAEDkjCS7QAAAAICApJCAAAAg+5gwACWbwCSTQAAIIVwYMAAk6wAAGDAAPoKAT4DSZJYISWSYIGSXMBM9eBgwACWb0qSdgEckn0uwABhlwIAAoCShMBM9dOBkorATPXgAMAAmWU/TpKlkqsAAIPWYMAAlm8BJpKlAYGSrcBM9eBgwACWb0qStgEckr0uwABhnQIAAhaS0ICSy8BM9dOIP8AAlnEWkuCCktrATPYtiD/AAJZxAMAAmWkGwACZeIGckvKTA5OlAACGWAFqkvNgwAD9HAIAAAEDkwyTpQAAAAICApMSAAAAg+5gwACU7QCTHQAAIIVwYMAAk6wAAGDAAPoKAT4DSZMoISWTMIGTLMBM9rVgwACU7UqTOgEck0EuwABhlwIAAoCTSMBM9qiBk07ATPa1AMAAmWU/TpNdk2MAAIPWYMAAlO0BJpNdAYGTZcBM9rVgwACU7UqTbgEck3UuwABhmAQABICTgMBM9qgWk4uAk4bATPaog9HAAJT0gpOQwEz3AhaTnYKTl8BM9wKD0cAAlPQAwACZZgbAAJl5gZyTqpO7lIMAALA+AWqTq2DAAP0cAgAAAQOTy5SDAAAAAgICk9gAAACD7mDAAJUhAJPjAAAghXBgwACTrAAAYMAA+goBPgNJk+4hJZP2gZPywEz3mGDAAJUhSpQHARyUDi7AAGGXAgACgJQVwEz3i4GUG8BM95gAwACZZT9OlDGUNwAAg9ZgwACVIQEmlDEBgZQ5wEz3mGDAAJUhSpRCARyUSS7AAGGYBAAEgJRUwEz3ixaUX4CUWsBM94uwP8AAlSOClGnATPflFpR2gpRwwEz35bA/wACVIwDAAJlmBsAAmXqBnJSIlJmVcQAAhbsBapSJYMAA/RwCAAABA5SxlXEAAAACAgKUxgAAAIPuYMAAllcAlNEAACCFcGDAAJOsAABgwAD6CgE+A0mU3CEllOSBlODATPh7YMAAlldKlP0BHJUELsAAYZcCAAKAlQvATPhugZURwEz4ewDAAJllP06VL5U1AACD1mDAAJZXASaVLwGBlTfATPh7YMAAlldKlUABHJVHLsAAYZ0CAAIWlVqAlVXATPhuhH/AAJZZFpVngpVhwEz4yIR/wACWWQDAAJlpBsAAmXuBnJV2lYeWAAAAsEEBapV3YMAA/RwCAAABA5WXlgAAAAACAgKVpAAAAIPuYMAAlkUAla8AACCFcGDAAJOsAABgwAD6CgE+AkmVuiEllcKBlb7ATPlQYMAAlkVKldMBHJXaLsAAYZcCAAKAleHATPlDgZXnwEz5UADAAJllP0qV8QEpBsAAmXyBnJYFlhaW4AAAsEIBapYGYMAA/RwCAAABA5YoluAAAAACAgKWNwAAAIPuYMAAlmMAlkIAACCFcGDAAJOsAABgwAD6CgE+A0mWTSElllWBllHATPnXYMAAlmNKlmgBHJZvLsAAYZcCAAKAlnbATPnKgZZ8wEz51wDAAJllP06WlJaaAACD1mDAAJZjASaWlAGBlpzATPnXYMAAlmNKlqUBHJasLsAAYZgEAASAlrfATPnKFpbCgJa9wEz5yoCWwACWZYKWycBM+iQWltaCltDATPokgJbAAJZlAMAAmWYGwACZfYGcluWW9pfAAACwQwFqluZgwAD9HAIAAAEDlwiXwAAAAAICApcXAAAAg+5gwACWTQCXIgAAIIVwYMAAk6wAAGDAAPoKAT4DSZctISWXNYGXMcBM+rpgwACWTUqXSAEcl08uwABhlwIAAoCXVsBM+q2Bl1zATPq6AMAAmWU/Tpd0l3oAAIPWYMAAlk0BJpd0AYGXfMBM+rpgwACWTUqXhQEcl4wuwABhmAQABICXl8BM+q0Wl6KAl53ATPqtgJbAAJZPgpepwEz7BxaXtoKXsMBM+weAlsAAlk8AwACZZgbAAJl+gZyXxZfWmJgAALBEAWqXxmDAAP0cAgAAAQOX5piYAAAAAgICl/MAAACD7mDAAJY7AJf+AAAghXBgwACTrAAAYMAA+goBPgNJmAkhJZgRgZgNwEz7nWDAAJY7SpgiARyYKS7AAGGXAgACgJgwwEz7kIGYNsBM+50AwACZZT9OmEyYUgAAg9ZgwACWOwEmmEwBgZhUwEz7nWDAAJY7SphdARyYZC7AAGGYBAAEgJhvwEz7kBaYeoCYdcBM+5CAlsAAlj2CmIHATPvqFpiOgpiIwEz76oCWwACWPQDAAJlmBsAAmX+BnJidmK6ZfAAAsEUBapieYMAA/RwCAAABA5jBmXwAAAACAgKY0QAAAIPuYMAAliIAmNwAACCFcGDAAJOsAABgwAD6CgE+A0mY5yElmO+BmOvATPyAYMAAliJKmQMBHJkKLsAAYZcCAAKAmRHATPxzgZkXwEz8gADAAJllP06ZMJk2AACD1mDAAJYiASaZMAGBmTjATPyAYMAAliJKmUEBHJlILsAAYZgEAASAmVPATPxzFplegJlZwEz8c4CWwACWJ4KZZcBM/M0WmXKCmWzATPzNgJbAAJYnAMAAmWYGwACZgIGcmYGZkppgAACwRwFqmYJgwAD9HAIAAAEDmaWaYAAAAAICApm1AAAAg+5gwACWGQCZwAAAIIVwYMAAk6wAAGDAAPoKAT4DSZnLISWZ04GZz8BM/WNgwACWGUqZ5wEcme4uwABhlwIAAoCZ9cBM/VaBmfvATP1jAMAAmWU/TpoUmhoAAIPWYMAAlhkBJpoUAYGaHMBM/WNgwACWGUqaJQEcmiwuwABhmAQABICaN8BM/VYWmkKAmj3ATP1WgJbAAJYegppJwEz9sBaaVoKaUMBM/bCAlsAAlh4AwACZZgbAAJmBgZyaZZp2m0YAALBJAWqaZmDAAP0cAgAAAQOajZtGAAAAAgICmqEAAACD7mDAAJYrAJqsAAAghXBgwACTrAAAYMAA+goBPgNJmrchJZq/gZq7wEz+RmDAAJYrSprXARya3i7AAGGXAgACgJrlwEz+OYGa68BM/kYAwACZZT9OmwibDgAAg9ZgwACWKwEmmwgBgZsQwEz+RmDAAJYrSpsZARybIC7AAGGcAgACFpsvgJsqwEz+OYCWwACWMBabPIKbNsBM/pOAlsAAljAAwACZaAbAAJmCgZybS5tcnG4AALBKAWqbTGDAAP0cAgAAAQObZJxuAAAAAgICm2kAAACD7mDAAJXhAJt0AAAghXBgwACTrAAAYMAA+goBPgNJm38hJZuHgZuDwEz/G2DAAJXhSpuQARybly7AAGGXAgACgJuewEz/DoGbpMBM/xsAwACZZT9Om7KbuAAAg9ZgwACV4QEmm7IBgZu6wEz/G2DAAJXhSpvDASIiHJvKLsAAYZ0CAAIWm92Am9jATP8Og+/AAJXjFpvrgpvlwEz/aIPvwACV4wDAAJlpAByb/i7AAGGcAgACFpwNgJwIwEz/DoJpwACV5BacGYKcE8BM/2iCacAAleQAwACZaAAcnCouwABhmAQABICcNcBM/w4WnECAnDvATP8OoRzAAJXlgpxPwEz/aBacXIKcVsBM/2ihHMAAleUAwACZZgbAAJmDgZycc5yEnXIAALBLAWqcdGDAAP0cAgAAAQOclp1yAAAAAgICnKUAAACD7mDAAJXSAJywAAAghXBgwACTrAAAYMAA+goBPgNJnLshJZzDgZy/wE0AYmDAAJXSSpzWARyc3S7AAGGXAgACgJzkwE0AVYGc6sBNAGIAwACZZT9OnQKdCAAAg9ZgwACV0gEmnQIBgZ0KwE0AYmDAAJXSSp0TASIcnRouwABhnAIAAhadKYCdJMBNAFWAvcAAldQWnTWCnS/ATQCvgL3AAJXUAMAAmWgAHJ1GLsAAYZwCAAIWnVWAnVDATQBVgmrAAJXVFp1lgp1fwE0Ar4JqwACV1QDAAJloBsAAmYSBnJ13nYieegAAsEwBap14YMAA/RwCAAABA52TnnoAAAACAgKdowAAAIPuYMAAlgAAna4AACCFcGDAAJOsAABgwAD6CgE+A0mduSElncGBnb3ATQFpYMAAlgBKndUBHJ3cLsAAYZcCAAKAnePATQFcgZ3pwE0BaQDAAJllP06eAp4IAACD1mDAAJYAASaeAgGBngrATQFpYMAAlgBKnhMBIhyeGi7AAGGcAgACFp4pgJ4kwE0BXIV5wACWAhaeOYKeM8BNAbaFecAAlgIAwACZaAAcnk4uwABhnAIAAhaeXYCeWMBNAVyk3sAAlgMWnm2CnmfATQG2pN7AAJYDAMAAmWgGwACZhYGcnn+ekJ9IAACwTQFqnoBgwAD9HAIAAAEDnp6fSAAAAAICAp6pAAAAg+5gwACVwgCetAAAIIVwYMAAk6wAAGDAAPoKAT4DSZ6/ISWex4Gew8BNAnBgwACVwkqe1gEcnt0uwABhlwIAAoCe5MBNAmOBnurATQJwAMAAmWU/Tp7+nwQAAIPWYMAAlcIBJp7+AYGfBsBNAnBgwACVwkqfDwEcnxYuwABhmAQABICfIcBNAmMWnyyAnyfATQJjgL3AAJWjgp8ywE0CvRafP4KfOcBNAr2AvcAAlaMAwACZZgbAAJmGgZyfTZ9eoIYAAIZRAWqfTmDAAP0cAgAAAQOfdqCGAAAAAgICn4sAAACD7mDAAJW4AJ+WAAAghXBgwACTrAAAYMAA+goBPgNJn6EhJZ+pgZ+lwE0DU2DAAJW4Sp/CARyfyS7AAGGXAgACgJ/QwE0DRoGf1sBNA1MAwACZZT9On/Sf+gAAg9ZgwACVuAEmn/QBgZ/8wE0DU2DAAJW4SqAFASIcoAwuwABhmAQABICgF8BNA0YWoCKAoB3ATQNGgL3AAJWjgqAowE0DoBagNYKgL8BNA6CAvcAAlaMAwACZZgAcoEYuwABhmAQABICgUcBNA0YWoFyAoFfATQNGr3vAAJW6gqBpwE0DoBagdoKgcMBNA6Cve8AAlboAwACZZgbAAJmHgZygi6CcoQAAALBOAWqgjGDAAP0cAgAAAQOgpaEAAAAAAgICoKsAAACD7mDAAJXKAKC2AAAghXBgwACTrAAAYMAA+goBPgJJoMEhJaDJgaDFwE0EdmDAAJXKSqDTARyg2i7AAGGXAgACgKDhwE0EaYGg58BNBHYAwACZZT9KoPEBKQbAAJmIgZyhBaEWodYAALBPAWqhBmDAAP0cAgAAAQOhJqHWAAAAAgICoTMAAACD7mDAAJWuAKE+AAAghXBgwACTrAAAYMAA+goBPgNJoUkhJaFRgaFNwE0E/WDAAJWuSqFiARyhaS7AAGGXAgACgKFwwE0E8IGhdsBNBP0AwACZZT9OoYyhkgAAg9ZgwACVrgEmoYwBgaGUwE0E/WDAAJWuSqGdARyhpC7AAGGYBAAEgKGvwE0E8BahuoChtcBNBPCAvcAAlaOCocDATQVKFqHNgqHHwE0FSoC9wACVowDAAJlmBsAAmYmBnKHboeyizAAAsFABaqHcYMAA/RwCAAABA6H4oswAAAACAgKiAQAAAIPuYMAAlZIAogwAACCFcGDAAJOsAABgwAD6CgE+A0miFyEloh+BohvATQXgYMAAlZJKoiwBHKIzLsAAYZcCAAKAojrATQXTgaJAwE0F4ADAAJllP06iUqJYAACD1mDAAJWSASaiUgGBolrATQXgYMAAlZJKomMBIhyiai7AAGGYBAAEgKJ1wE0F0xaigICie8BNBdOpQsAAlZSCooTATQYtFqKRgqKLwE0GLalCwACVlADAAJlmAByioC7AAGGcAgACFqKvgKKqwE0F0x/AAJWVFqK/gqK5wE0GLR/AAJWVAMAAmWgGwACZioGcotGi4qO+AACwUQFqotJgwAD9HAIAAAEDou2jvgAAAAICAqL1AAAAg+5gwACVgwCjAAAAIIVwYMAAk6wAAGDAAPoKAT4DSaMLISWjE4GjD8BNBvNgwACVg0qjHwEcoyYuwABhlwIAAoCjLcBNBuaBozPATQbzAMAAmWU/TqNEo0oAAIPWYMAAlYMBJqNEAYGjTMBNBvNgwACVg0qjVQEiHKNcLsAAYZgEAASAo2fATQbmFqNygKNtwE0G5qlCwACVhYKjdsBNB0AWo4OCo33ATQdAqULAAJWFAMAAmWYAHKOSLsAAYZwCAAIWo6GAo5zATQbmH8AAlYYWo7GCo6vATQdAH8AAlYYAwACZaAbAAJmLgZyjw6PUpNYAALBSAWqjxGDAAP0cAgAAAQOj36TWAAAAAgICo+cAAACD7mDAAJVyAKPyAAAghXBgwACTrAAAYMAA+goBPgNJo/0hJaQFgaQBwE0IBmDAAJVySqQRARykGC7AAGGXAgACgKQfwE0H+YGkJcBNCAYAwACZZT9OpDakPAAAg9ZgwACVcgEmpDYBgaQ+wE0IBmDAAJVySqRHASIiHKROLsAAYZwCAAIWpF2ApFjATQf5ha/AAJV1FqRpgqRjwE0IU4WvwACVdQDAAJloABykei7AAGGYBAAEgKSFwE0H+RakkICki8BNB/mpQsAAlXSCpJTATQhTFqShgqSbwE0IU6lCwACVdADAAJlmAByksC7AAGGcAgACFqS/gKS6wE0H+YWxwACVdhakzIKkxsBNCFOFscAAlXYAwACZaAbAAJmMgZyk26TspcAAALBTAWqk3GDAAP0cAgAAAQOk9aXAAAAAAgICpPsAAACD7mDAAJVbAKUGAAAghXBgwACTrAAAYMAA+goBPgNJpREhJaUZgaUVwE0JTWDAAJVbSqUjARylKi7AAGGXAgACgKUxwE0JQIGlN8BNCU0AwACZZT9OpUalTAAAg9ZgwACVWwEmpUYBgaVOwE0JTWDAAJVbSqVXASIcpV4uwABhnAIAAhalbYClaMBNCUCCRcAAlV0WpXuCpXXATQmagkXAAJVdAMAAmWgAHKWOLsAAYZ0CAAIWpaGApZzATQlAW8AAlV4WpbKCpazATQmaW8AAlV4AwACZaQbAAJmNgZylxaXWpqYAALBUAWqlxmDAAP0cAgAAAQOl3qamAAAAAgICpeMAAACD7mDAAJVqAKXuAAAghXBgwACTrAAAYMAA+goBPgNJpfkhJaYBgaX9wE0KUmDAAJVqSqYKARymES7AAGGXAgACgKYYwE0KRYGmHsBNClIAwACZZT9OpiymMgAAg9ZgwACVagEmpiwBgaY0wE0KUmDAAJVqSqY9ASIcpkQuwABhnAIAAhamU4CmTsBNCkWCRcAAlV0WpmGCplvATQqfgkXAAJVdAMAAmWgAHKZ0LsAAYZ0CAAIWpoeApoLATQpFW8AAlV4WppiCppLATQqfW8AAlV4AwACZaQbAAJmOgZymq6a8p9oAALBVAWqmrGDAAP0cAgAAAQOmzKfaAAAAAgICptkAAACD7mDAAJVLAKbkAAAghXBgwACTrAAAYMAA+goBPgNJpu8hJab3gabzwE0LV2DAAJVLSqcIARynDy7AAGGXAgACgKcWwE0LSoGnHMBNC1cAwACZZT9OpzKnOAAAg9ZgwACVSwEmpzIBgac6wE0LV2DAAJVLSqdDASIiHKdKLsAAYZwCAAIWp1mAp1TATQtKhbTAAJVNFqdqgqdkwE0LpIW0wACVTQDAAJloAByngC7AAGGcAgACFqePgKeKwE0LSoGtwACVThanm4KnlcBNC6SBrcAAlU4AwACZaAAcp6wuwABhnAIAAhanu4CntsBNC0qFtcAAlU8Wp8yCp8bATQukhbXAAJVPAMAAmWgGwACZj4Gcp9+n8Kl8AACwVgFqp+BgwAD9HAIAAAEDqAupfAAAAAICAqgjAAAAg+5gwACVQQCoLgAAIIVwYMAAk6wAAGDAAPoKAT4DSag5ISWoQYGoPcBNDJBgwACVQUqoXQEcqGQuwABhlwIAAoCoa8BNDIOBqHHATQyQAMAAmWU/TqiSqJgAAIPWYMAAlUEBJqiSAYGomsBNDJBgwACVQUqoowEiIiIcqKouwABhnAIAAhaouYCotMBNDIOemsAAlUMWqMyCqMbATQzdnprAAJVDAMAAmWgAHKjkLsAAYZwCAAIWqPOAqO7ATQyDsFjAAJUxFqkHgqkBwE0M3bBYwACVMQDAAJloABypIC7AAGGYBAAEgKkrwE0MgxapNoCpMcBNDIOpQsAAlTKCqTrATQzdFqlHgqlBwE0M3alCwACVMgDAAJlmABypVi7AAGGcAgACFqllgKlgwE0Mg4CWwACVMxapcoKpbMBNDN2AlsAAlTMAwACZaAbAAJmQgZypgamSqrQAALBXAWqpgmDAAP0cAgAAAQOpoaq0AAAAAgICqa0AAACD7mDAAJUvAKm4AAAghXBgwACTrAAAYMAA+goBPgNJqcMhJanLganHwE0OCWDAAJUvSqnbARyp4i7AAGGXAgACgKnpwE0N/IGp78BNDgkAwACZZT9OqgSqCgAAg9ZgwACVLwEmqgQBgaoMwE0OCWDAAJUvSqoVASIiHKocLsAAYZwCAAIWqiuAqibATQ38sFjAAJUxFqo/gqo5wE0OVrBYwACVMQDAAJloAByqWC7AAGGYBAAEgKpjwE0N/BaqboCqacBNDfypQsAAlTKCqnLATQ5WFqp/gqp5wE0OVqlCwACVMgDAAJlmAByqji7AAGGcAgACFqqdgKqYwE0N/ICWwACVMxaqqoKqpMBNDlaAlsAAlTMAwACZaAbAAJmRgZyquarKq8AAALBaAWqqumDAAP0cAgAAAQOq5qvAAAAAAgICqv8AAACD7mDAAJUSAKsKAAAghXBgwACTrAAAYMAA+goBPgNJqxUhJasdgasZwE0PUGDAAJUSSqs6ARyrQS7AAGGXAgACgKtIwE0PQ4GrTsBND1AAwACZZT9Oq3CrdgAAg9ZgwACVEgEmq3ABgat4wE0PUGDAAJUSSquBARyriC7AAGGdAgACFqubgKuWwE0PQ61swACVFBarr4KrqcBND52tbMAAlRQAwACZaQbAAJmSgZyrxavWrOoAALBcAWqrxmDAAP0cAgAAAQOr7KzqAAAAAgICq/8AAACD7mDAAJUCAKwKAAAghXBgwACTrAAAYMAA+goBPgNJrBUhJawdgawZwE0QJWDAAJUCSqw0ARysOy7AAGGXAgACgKxCwE0QGIGsSMBNECUAwACZZT9OrGSsagAAg9ZgwACVAgEmrGQBgaxswE0QJWDAAJUCSqx1ASIcrHwuwABhmAQABICsh8BNEBgWrJKArI3ATRAYiKvAAJUEgqycwE0QchasqYKso8BNEHKIq8AAlQQAwACZZgAcrL4uwABhnQIAAhas0YCszMBNEBiCUcAAlQUWrN+CrNnATRByglHAAJUFAMAAmWkGwACZk4GcrO+tAK32AACwXQFqrPBgwAD9HAIAAAEDrQ6t9gAAAAICAq0ZAAAAg+5gwACU1gCtJAAAIIVwYMAAk6wAAGDAAPoKAT4DSa0vISWtN4GtM8BNETpgwACU1kqtRgEcrU0uwABhlwIAAoCtVMBNES2BrVrATRE6AMAAmWU/Tq1urXQAAIPWYMAAlNYBJq1uAYGtdsBNETpgwACU1kqtfwEiHK2GLsAAYZwCAAIWrZWArZDATREtgmvAAJTYFq2ngq2hwE0Rh4JrwACU2ADAAJloABytvi7AAGGYBAAEgK3JwE0RLRat1ICtz8BNES2wXsAAlNmCrd3ATRGHFq3qgq3kwE0Rh7BewACU2QDAAJlmBsAAmZSBnK37rgyu4AAAsF8Baq38YMAA/RwCAAABA64hruAAAAACAgKuMwAAAIPuYMAAlMoArj4AACCFcGDAAJOsAABgwAD6CgE+A0muSSElrlGBrk3ATRJPYMAAlMpKrmcBHK5uLsAAYZcCAAKArnXATRJCga57wE0STwDAAJllP06ulq6cAACD1mDAAJTKASaulgGBrp7ATRJPYMAAlMpKrqcBHK6uLsAAYZgEAASArrnATRJCFq7EgK6/wE0SQoKTwACUzIKuysBNEpwWrteCrtHATRKcgpPAAJTMAMAAmWYGwACZlYGcruWu9q/4AACGHQFqruZgwAD9HAIAAAEDrwuv+AAAAAICAq8dAAAAg+5gwACUvQCvKAAAIIVwYMAAk6wAAGDAAPoKAT4DSa8zISWvO4GvN8BNEzJgwACUvUqvUQEcr1guwABhlwIAAoCvX8BNEyWBr2XATRMyAMAAmWU/Tq+Ar4YAAIPWYMAAlL0BJq+AAYGviMBNEzJgwACUvUqvkQEiHK+YLsAAYZkEAASAr6PATRMlFq+ugK+pwE0TJZj7wACUv4KvtcBNE38Wr8KCr7zATRN/mPvAAJS/AMAAmWcAHK/ULsAAYZwCAAIWr+OAr97ATRMlgmnAAJTAFq/vgq/pwE0Tf4JpwACUwADAAJloBsAAmZaBnK/9sA6xFAAAhlMBaq/+YMAA/RwCAAABA7AmsRQAAAACAgKwOwAAAIPuYMAAlLAAsEYAACCFcGDAAJOsAABgwAD6CgE+A0mwUSElsFmBsFXATRRHYMAAlLBKsHIBHLB5LsAAYZcCAAKAsIDATRQ6gbCGwE0URwDAAJllP06wpLCqAACD1mDAAJSwASawpAGBsKzATRRHYMAAlLBKsLUBIhywvC7AAGGcAgACFrDLgLDGwE0UOoC9wACUshaw14Kw0cBNFJSAvcAAlLIAwACZaAAcsOguwABhnAIAAhaw94Cw8sBNFDqCasAAlLMWsQeCsQHATRSUgmrAAJSzAMAAmWgGwACZl4GcsRmxKrHMAACwYAFqsRpgwAD9HAIAAAEDsTaxzAAAAAICArE/AAAAg+5gwACUpgCxSgAAIIVwYMAAk6wAAGDAAPoKAT4DSbFVISWxXYGxWcBNFU5gwACUpkqxagEcsXEuwABhlwIAAoCxeMBNFUGBsX7ATRVOAMAAmWU/TrGQsZYAAIPWYMAAlKYBJrGQAYGxmMBNFU5gwACUpkqxoQEcsaguwABhnAIAAhaxt4CxssBNFUGCacAAlJcWscOCsb3ATRWbgmnAAJSXAMAAmWgGwACZmIGcsdGx4rKwAACwYQFqsdJgwAD9HAIAAAEDseuysAAAAAICArHxAAAAg+5gwACUmgCx/AAAIIVwYMAAk6wAAGDAAPoKAT4DSbIHISWyD4GyC8BNFiNgwACUmkqyGQEcsiAuwABhlwIAAoCyJ8BNFhaBsi3ATRYjAMAAmWU/TrI8skIAAIPWYMAAlJoBJrI8AYGyRMBNFiNgwACUmkqyTQEiHLJULsAAYZwCAAIWsmOAsl7ATRYWgmvAAJScFrJ1grJvwE0WcIJrwACUnADAAJloAByyjC7AAGGcAgACFrKbgLKWwE0WFoJpwACUlxayp4KyocBNFnCCacAAlJcAwACZaAbAAJmZgZyytbLGs5QAALBiAWqytmDAAP0cAgAAAQOy0bOUAAAAAgICstkAAACD7mDAAJSIALLkAAAghXBgwACTrAAAYMAA+goBPgNJsu8hJbL3gbLzwE0XKmDAAJSISrMDARyzCi7AAGGXAgACgLMRwE0XHYGzF8BNFyoAwACZZT9OsyizLgAAg9ZgwACUiAEmsygBgbMwwE0XKmDAAJSISrM5ASIcs0AuwABhnAIAAhazT4CzSsBNFx2D0cAAlIoWs1qCs1TATRd3g9HAAJSKAMAAmWgAHLNqLsAAYZ0CAAIWs32As3jATRcdhi3AAJSLFrOKgrOEwE0Xd4YtwACUiwDAAJlpBsAAmZqBnLOZs6q0fgAAhkABarOaYMAA/RwCAAABA7O0tH4AAAACAgKzuwAAAIPuYMAAlHsAs8YAACCFcGDAAJOsAABgwAD6CgE+A0mz0SEls9mBs9XATRgxYMAAlHtKs+QBHLPrLsAAYZcCAAKAs/LATRgkgbP4wE0YMQDAAJllP060CLQOAACD1mDAAJR7ASa0CAGBtBDATRgxYMAAlHtKtBkBIhy0IC7AAGGcAgACFrQvgLQqwE0YJJ6awACUfRa0QoK0PMBNGH6emsAAlH0AwACZaAActFouwABhnAIAAha0aYC0ZMBNGCSCacAAlH4WtHWCtG/ATRh+gmnAAJR+AMAAmWgGwACZm4GctIO0lLWWAACwYwFqtIRgwAD9HAIAAAEDtJy1lgAAAAICArShAAAAg+5gwACUbQC0rAAAIIVwYMAAk6wAAGDAAPoKAT4DSbS3ISW0v4G0u8BNGThgwACUbUq0yAEctM8uwABhlwIAAoC01sBNGSuBtNzATRk4AMAAmWU/TrTqtPAAAIPWYMAAlG0BJrTqAYG08sBNGThgwACUbUq0+wEiIhy1Ai7AAGGcAgACFrURgLUMwE0ZK4JpwACUbxa1HYK1F8BNGYWCacAAlG8AwACZaAActS4uwABhnAIAAha1PYC1OMBNGSuwZMAAlHAWtU6CtUjATRmFsGTAAJRwAMAAmWgAHLVkLsAAYZwCAAIWtXOAtW7ATRkrsGXAAJRxFrWGgrWAwE0ZhbBlwACUcQDAAJloBsAAmZyBnLWbtay2UgAAhe8BarWcYMAA/RwCAAABA7W2tlIAAAACAgK1vQAAAIPuYMAAlGEAtcgAACCFcGDAAJOsAABgwAD6CgE+A0m10yEltduBtdfATRpxYMAAlGFKteYBHLXtLsAAYZcCAAKAtfTATRpkgbX6wE0acQDAAJllP062CrYQAACD1mDAAJRhASa2CgGBthLATRpxYMAAlGFKthsBHLYiLsAAYZwCAAIWtjGAtizATRpkgmvAAJRjFrZDgrY9wE0avoJrwACUYwDAAJloBsAAmZ2BnLZXtmi3CAAAsGYBarZYYMAA/RwCAAABA7ZztwgAAAACAgK2ewAAAIPuYMAAlFUAtoYAACCFcGDAAJOsAABgwAD6CgE+A0m2kSEltpmBtpXATRtGYMAAlFVKtqUBHLasLsAAYZcCAAKAtrPATRs5gba5wE0bRgDAAJllP062yrbQAACD1mDAAJRVASa2ygGBttLATRtGYMAAlFVKttsBHLbiLsAAYZwCAAIWtvGAtuzATRs5gJbAAJRXFrb+grb4wE0bk4CWwACUVwDAAJloBsAAmZ6BnLcNtx631AAAsGcBarcOYMAA/RwCAAABA7cot9QAAAACAgK3LwAAAIPuYMAAlEkAtzoAACCFcGDAAJOsAABgwAD6CgE+A0m3RSElt02Bt0nATRwbYMAAlElKt1gBHLdfLsAAYZcCAAKAt2bATRwOgbdswE0cGwDAAJllP063fLeCAACD1mDAAJRJASa3fAGBt4TATRwbYMAAlElKt40BHLeULsAAYZkEAASAt5/ATRwOFreqgLelwE0cDrBowACUS4K3t8BNHGgWt8SCt77ATRxosGjAAJRLAMAAmWcGwACZn4Gct9m36risAACwaQFqt9pgwAD9HAIAAAEDt/e4rAAAAAICArgBAAAAg+5gwACUPQC4DAAAIIVwYMAAk6wAAGDAAPoKAT4DSbgXISW4H4G4G8BNHP5gwACUPUq4LQEcuDQuwABhlwIAAoC4O8BNHPGBuEHATRz+AMAAmWU/TrhUuFoAAIPWYMAAlD0BJrhUAYG4XMBNHP5gwACUPUq4ZQEcuGwuwABhmQQABIC4d8BNHPEWuIKAuH3ATRzxsGjAAJQ/griPwE0dSxa4nIK4lsBNHUuwaMAAlD8AwACZZwbAAJmggZy4sbjCuYYAALBqAWq4smDAAP0cAgAAAQO4ybmGAAAAAgICuM0AAACD7mDAAJQxALjYAAAghXBgwACTrAAAYMAA+goBPgNJuOMhJbjrgbjnwE0d4WDAAJQxSrjzARy4+i7AAGGXAgACgLkBwE0d1IG5B8BNHeEAwACZZT9OuRS5GgAAg9ZgwACUMQEmuRQBgbkcwE0d4WDAAJQxSrklASIcuSwuwABhnAIAAha5O4C5NsBNHdSFtMAAlDMWuUyCuUbATR4uhbTAAJQzAMAAmWgAHLliLsAAYZwCAAIWuXGAuWzATR3UgmnAAJQHFrl9grl3wE0eLoJpwACUBwDAAJloBsAAmaGBnLmLuZy6bAAAsGsBarmMYMAA/RwCAAABA7mmumwAAAACAgK5rQAAAIPuYMAAlCUAubgAACCFcGDAAJOsAABgwAD6CgE+A0m5wyElucuBucfATR7oYMAAlCVKudYBHLndLsAAYZcCAAKAueTATR7bgbnqwE0e6ADAAJllP065+roAAACD1mDAAJQlASa5+gGBugLATR7oYMAAlCVKugsBIhy6Ei7AAGGcAgACFrohgLocwE0e24W0wACUJxa6MoK6LMBNHzWFtMAAlCcAwACZaAAcukguwABhnAIAAha6V4C6UsBNHtuCacAAlAcWumOCul3ATR81gmnAAJQHAMAAmWgGwACZooGcunG6gruIAACwbAFqunJgwAD9HAIAAAEDuoy7iAAAAAICArqTAAAAg+5gwACUGAC6ngAAIIVwYMAAk6wAAGDAAPoKAT4DSbqpISW6sYG6rcBNH+9gwACUGEq6vAEcusMuwABhlwIAAoC6ysBNH+KButDATR/vAMAAmWU/TrrguuYAAIPWYMAAlBgBJrrgAYG66MBNH+9gwACUGEq68QEiIhy6+C7AAGGcAgACFrsHgLsCwE0f4rBYwACUGha7G4K7FcBNIDywWMAAlBoAwACZaAAcuzQuwABhnAIAAha7Q4C7PsBNH+KDwMAAlBsWu1GCu0vATSA8g8DAAJQbAMAAmWgAHLtkLsAAYZwCAAIWu3OAu27ATR/igmnAAJQHFrt/grt5wE0gPIJpwACUBwDAAJloBsAAmaOBnLuNu568wgAAsG0BaruOYMAA/RwCAAABA7umvMIAAAACAgK7qwAAAIPuYMAAlAoAu7YAACCFcGDAAJOsAABgwAD6CgE+A0m7wSElu8mBu8XATSEoYMAAlApKu9IBHLvZLsAAYZcCAAKAu+DATSEbgbvmwE0hKADAAJllP0679Lv6AACD1mDAAJQKASa79AGBu/zATSEoYMAAlApKvAUBIiIiHLwMLsAAYZwCAAIWvBuAvBbATSEbqT3AAJQMFrwngrwhwE0hdak9wACUDADAAJloABy8OC7AAGGcAgACFrxHgLxCwE0hG4W0wACUDRa8WIK8UsBNIXWFtMAAlA0AwACZaAAcvG4uwABhnAIAAha8fYC8eMBNIRurJsAAlA4WvIuCvIXATSF1qybAAJQOAMAAmWgAHLyeLsAAYZwCAAIWvK2AvKjATSEbgmnAAJQHFry5gryzwE0hdYJpwACUBwDAAJloBsAAmaSBnLzHvNi90gAAsG4BarzIYMAA/RwCAAABA7zfvdIAAAACAgK84wAAAIPuYMAAk/QAvO4AACCFcGDAAJOsAABgwAD6CgE+A0m8+SElvQGBvP3ATSKTYMAAk/RKvQkBHL0QLsAAYZcCAAKAvRfATSKGgb0dwE0ikwDAAJllP069Kr0wAACD1mDAAJP0ASa9KgGBvTLATSKTYMAAk/RKvTsBIiIcvUIuwABhnAIAAha9UYC9TMBNIoaFtMAAk/YWvWKCvVzATSLghbTAAJP2AMAAmWgAHL14LsAAYZwCAAIWvYeAvYLATSKGga3AAJP3Fr2Tgr2NwE0i4IGtwACT9wDAAJloABy9pC7AAGGcAgACFr2zgL2uwE0ihoW1wACT+Ba9xIK9vsBNIuCFtcAAk/gAwACZaAbAAJmlgZy9173ovmoAAIYXAWq92GDAAP0cAgAAAQO9+75qAAAAAgICvgsAAACD7mDAAJPqAL4WAAAghXBgwACTrAAAYMAA+goBPgJJviEhJb4pgb4lwE0jzGDAAJPqSr49ARy+RC7AAGGXAgACgL5LwE0jv4G+UcBNI8wAwACZZT9KvlsBKQbAAJmmgZy+b76Av14AAIYOAWq+cGDAAP0cAgAAAQO+mL9eAAAAAgICvq0AAACD7mDAAJPeAL64AAAghXBgwACTrAAAYMAA+goBPgNJvsMhJb7Lgb7HwE0kU2DAAJPeSr7kARy+6y7AAGGXAgACgL7ywE0kRoG++MBNJFMAwACZZT9Ovxa/HAAAg9ZgwACT3gEmvxYBgb8ewE0kU2DAAJPeSr8nARy/Li7AAGGcAgACFr89gL84wE0kRoJrwACT4Ba/T4K/ScBNJKCCa8AAk+AAwACZaAbAAJmngZy/Y790wABAHgAAhhIBar9kYMAA/RwCAAABA79+wABAHgAAAAICAr+FAAAAg+5gwACT0QC/kAAAIIVwYMAAk6wAAGDAAPoKAT4DSb+bISW/o4G/n8BNJSxgwACT0Uq/rgEcv7UuwABhlwIAAoC/vMBNJR+Bv8LATSUsAMAAmWU/Tr/Sv9gAAIPWYMAAk9EBJr/SAYG/2sBNJSxgwACT0Uq/4wEcv+ouwABhnQIAAha//YC/+MBNJR+GEMAAk9MWwABAD4LAAEAJwE0leYYQwACT0wDAAJlpAABM5oEATObJAEznRABM58MATOikAEzqbwBM60QATOwrAEztEgBM7fkATO7gAEzvxwBM8K4ATPGRAEzyZgBM80cATPROAEz1IwBM9aoATPZ/AEz3YgBM+EUATPkaAEz5oQBM+oQATPtnAEz8SgBM/S0ATP4QAEz+5QBNACwATQEzAE0COgBNAx0ATQRAAE0ExwBNBaoATQa9AE0H0ABNCRcATQocAE0LIQBNDFoATQ3TAE0PGgBND+8ATREEAE0SGQBNEvwATRQRAE0VGABNFe0ATRb0AE0X+wBNGQIATRo7AE0bEABNG+UATRzIAE0dqwBNHrIATR+5AE0g8gBNIl0ATSOWAE0kHQBNJPIATSXPAAAAQwIEwACSgIGbguKDCQTAAGGgAGDAAJjiAR+C+MAAmOwAAAAABMAAkoGBm5vZm+8GgoEAYMAAl1EBapvkYMAAl1HAAROJDAbAAJKDgZvAAEQ4wABERsAARG4AAYPsAAAAAQPAAERMwABEbgAAAAEBAcAARFQAAACAlmDAAP22AABgwACWTQFKwABEXgEcwABEYWrAAEReYMAAl1HAAROJg+wBAAGAwABEaMBNJ1MAwACXYgbAAJKEgZvAAERwwABEfsAARNwAAcAAUKYAAAABA8AARIfAAETcAAAAAgEBwABEjQAAAIC9YMAAlO0AAcAARJQAAACXq1sBasAARJ9gwAD6CgBgwACWTQE+AUrAAESrARzAAES1asAARLJgwACXUcABE4nAAFCmAgABgMAARL/ATSfBAZergcAARNDATSfRwACXZgbAAJKFgZvAAETfwABE7cAARR0AAcAAUZsAAAABA8AARPfAAEUdAAAAAQEBwABE/wAAAICWYMAA/bYAAGDAAJZNAUrAAEUJARzAAEUMasAARQlgwACXUcABE4nAAFGbAQABgMAARRfATShUAMAAl2MGwACShoGbwABFH8AARTHAAEWWAAHAAFGmAAAAAQPAAEU9wABFlgAAAAICAsAARVAAAACDW13AAPwyAWDAAJYzAMAARV4AAACBr2DAAJYzAABdwAD8MgFgwACWMwE+AUrAAEVtARzAAEV3asAARXRgwACXUcABE4nAAFGmAgACgMAARYTATSjEgcAARYrATSjZAMAAl2UGwACSh4GbwABFmcAARa3AAEYwAAHAAFGlAAAAAQPAAEW/wABGMAAAAAIBAcAARdIAAACEf13AAPwyAWDAAJYzAAHAAEXeAAAAwABgZVsBasAARelgwAD6CgBgwACWVwE+AUrAAEX1ARzAAEX/asAARfxgwACXUcABE4nAAFGlAgABgMAARhLATSlaAcAAYGWBwABGJMBNKXDAAJdkBsAAkoiBm8AARjPAAEZBwABGZgABwABRTQAAAAEDwABGR8AARmYAAAABAQHAAEZMAAAAgJZgwAD85gAAYMAAlmMBSsAARlYBHMAARllqwABGVmDAAJdRwAETicAAUU0BAAGAwABGYMBNKfcAwACXZwbAAJKJgZvAAEZowABGecAA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AAAAAQOBd4L5AAAAAAAAAGDAAP22AUoAAQ8ALsAAmowAAE1mAABNZjAAAAABAsAAmpWBoINbg2GJigPAAGIcAAABYMAA/RwAAAcEwACal4Ggg72DwQmCZwBgwACaiAAEwACamIGghCmEQgnAAE3SAGCE1AAEwACamYGghHqEggmFeQBghKkABMAAmpqBoITzhP8YhXwAYIizASsEwACam4GghY2FpwnAAE3TAGCE1AAEwACanIGghgiGEAkfAGCEqQAEwACanYGghoGGjRjAAEorAGCIswErAQXAAJqjgaCGkoaShxQAAAADhqSHFAAAAAUFBYaqAAAEgmdgwACaiACGtQAABMAATdJghNQAhtUAAASFeWCEqQCG6gAABMAATdNghNQAhwsAAAQfYISpAABgwACalQE/BggBwACal4AAwE1nBAgBwACamIEAwE1nEQgBwACamYIAwE1nHggBwACam4MAwE1nKQgBwACanIQAwE1nNgkBhpLAAP0yAAAAAAIGwACan4GghxmHIohoAQDAAE3VAAAAAQOHLYhoAAAAAAAAAGDAAPoKAT4CR4czFoc7LoJnwACalwICh2Fqh2FgwACaiMABMDyHiGqHiGDAAJqIwAEwCgA+AUqHmAEhHIesFoefLoV8wACamkgBAAErAIi3AYfTaofTYMAAmojAATAjAD4BSofjASIhHIf3FofqLoV8wACamkgBAAErAIi3ACEciA8WiAIuwABKK8AAmp1IAQABKwCItz0wiCIfiCzAAPtiAQABJIhjAyfAAGIdFohdLoJnwACalyeBagAGwACaoYGgiG2IgImIAAAjAWqIbmDAAP0cAgAAAQOIiImIAAAAAAAAAGDAAP22AT4BSoiRASQAEifAAGIeFoiyLoJnwACalyeApyfAAGIfFojPLsAATdLAAJqYJ8AASjMWiPMuhXnAAJqZJ4CnJ8AAYiAWiRUuhXzAAJqaJ8AAYiEWiS8uwABN08AAmpsngKcnwABiIhaJXy4fwACanCfAAGIjFol2LsAASivAAJqdJ4MhAABNZ5IATWhwAE1pIgAAAAIAAQbAAJqHgaCKYYp0uc0AAcAAYiQAAAABA4qJuc0AAAACAgKKtwAAAJpRXcAA/KUCYITUYMAAmpUAis0AAACD7mCE1AAAYMAAmpUBPhROiuqK9wAAwABiJWDAAJqVARyK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AUbAAErSwABK9MAASuMAAAC7KWDAAIBUABTAAErswE3oBwkAPgE9HMAASv4uwABiWMAAm1kCAAIUwABLEsBN5/YIABTAAEsmwE3oLgoAAMAAm4cAwAD8xEnAAEtCIhbAAEtGLsAAYkPAAJtZwACbawAWwABLaYXAAEtawE3mScAAVdzAAIAcPgE9F8AAS5sWwABLiS7AAGJIwACbWcAAm3DAAFXcKcAAgBw/ScAAS8QWwABLyC7AAGJDwACbWcAAm2s+AT0cwABMIBbAAEv0FsAAS+IuwABiSMAAm1nAAJtwwABV28AAgB2ApQEAARbAAEw2hcAATCfATeZJwABV28AAgB0AwAD9dT8GwACbiYGlwABMxcAATMrAAE5uAADAAGJbwACbWQAAAAEDwABM28AATm4AAAABAQHAAEzkAAAAgmxggksAAGDAAPoKAT4FQCIlwABNBIDAAEz7wE3pXmCITgElwABNMoDAAE0pwE3pXmDAAICBwABM+8AATVAAScAATVclwABNZIDAAE1bwE3pXmDAAICBPgFKwABNjAEcwABNpBbAAE2cFMAATZPATeleAAFgwACAgYJTwACAg0gBAAEWwABNpy7AAGJCwACbWcAAm2oAwAD9KT9OwABN0cAATdYAAIPuYIJSASbAAE3RAYDAAE3YwE3pXmCCUkPAAE3mIiEcwABN8oHAAE3twE3qAUgBAAEWwABN9S7AAGJEwACbWcAAm2wAwAD9KQAhHMAATgyBwABOB8BN6gFIAQABFsAATg8uwABiQsAAm1nAAJtqAMAA/Sk+AT2JwABOK8BN6gEWwABON4HAAE4ywE3qAYRSglhKwABOSQEcwABOVYHAAE5QwE3qAUgBAAEWwABOWC7AAGJCwACbWcAAm2oAwAD9KQbAAJuYgaXAAE5zwABOlcAAT5MAAIUOAWrAAE50YMAA/RwCAAABA8AATp/AAE+TAAAAAQEBwABOqQAAAIPuYIN3AABgwACb7AE+BT0XwABOtS7AAGJLwACbWWrAAE7VYMAAgFTAAVB9wACbc07AAE76AAAAwABMz2DAAJvsAD0cwABPCi7AAGJfAgACgMAATxnATesANMAATx8DwABPH8AAT1kAAAAAAAAAYMAA/NkBPgE9icAATyrATes4HMAATzcuwABGOQEAARbAAE9GgMAAT0HATesAhQGDewDA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asAAQw5gwAD9HAIAAAEDwABDOcAARjEAAAABAQHAAENJAAAAqj5gwAByhAAAYL3LAT4DScAAQ1kiIRzAAENngMAAQ17ATmbRwABPMgEAARbAAEOMLsAAYrHAAJwxwACcuQDAAHKzARzAAEOogMAAQ5/ATmbRt+4BAAEWwABDti7AAGKxwACcMcAAnLkAwABytT4CPRzAAERCLsAAT14BAAGAwABEScBOZtEAwACcVUrAAERaARzAAERhLsAAYpYBAAGAwABEasBOZtEAwACcqz9JwABEfxzAAESjFsAARJgWwABEjIDAAESDwE5m0aTMwAByibdvwABNE8AAS3cBAAEWwABEsi7AAGKxwACcMcAAnLkAwABqRz4CPRzAAEVsLsAAT14BAAGAwABFc8BOZtEAwACcVUrAAEWEARbAAEYSHMAARZ+AwABFi8BOZtHAAE8xAQABHMAAReMWwABFyRbAAEW9gMAARbTATmbRpMzAAHKJt2/AAE0TwABLeQEAARbAAEX+LsAAYrHAAJwxwACcuQDAAGpJAMAAcq6CkMAAnDw/SsAARiIBKwbAAJy9gajAAEY2wABGUMAARtoAAMAAYq7AAJwxAWrAAEY3YMAA/RwCAAABA8AARmbAAEbaAAAAAgICwABGfAAAAKvFYL3LAMAARpEAAACqPmDAAHKEAABgvcsBPgFKwABGoQEewABGqMAAnDUDAAMWwABGvYHAAEa0wE5op6TMwAByiYDAAEbKwE5omhbAAEbQLpImwACcMcAAnLYABsAAnL6BqMAARt/AAEbwwABH8wAAwABPiAFqwABG4GDAAP0cAgAAAQPAAEb9wABH8wAAAAEBAcAARw0AAACqPmDAAHKEAABgwAD6CgE+AknAAEeRIRbAAEedFsAAR5YuwABiscAAnDHAAJy5qz68wj4BSsAAR7MBKj9KwABHywEdwABH2MAAT4gBAAGAwABH5sBOaTQAwACcWQAATmZEAE5mmgBOaF8ATmj9AE5plwAAAAQCwACcwYGowABH+MAAR/7AAEpSA8AAYrIAAAFgwACckgAAAQTAAJzEgajAAEhywABIdwmSJsAAnDEAYMAAYuIAAQXAAJzNgajAAEh8wABIfMAASRoAAAADwABIkcAASRoAAAADAwPAAEimAAAAsHhgvdYAwABI0AAAAJYgYLzMAMAASN4AAASSJmDAAGLiAABgwACcwQE/AggBwACcxIIAwE5qMAkAwABI88AAnLICAAKAwABI/cBOahaBwABJEsBOaiMAAwbAAJzHgajAAEg2wABIScAASFsBAMAAYrPAAJwxAAAAAQPAAEhRwABIWwAAAAAAAABgvMwBSsAASFQBJsAASFQBFsAASFQuwABR1MAAnDHAAJyVYLzMBsAAnMmBqMAASR/AAEk5wABJnAAAwABiqwFqwABJIGDAAP0cAgAAAQPAAElLwABJnAAAAAEBAcAASVsAAACqPmDAAHKEAABgvcsBPgFKwABJawEcwABJci7AAGKswACcMQIAAhbAAEmGLsAAYrPAAJwxwACcx4DAAEmPwE5rAgDAAJylBsAAnMuBqMAASaHAAEm7wABKUAAAwABirsAAnDEBasAASaJgwAD9HAIAAAEDwABJ0cAASlAAAAACAgLAAEnnAAAAq8VgvcsAwABJ/AAAAKo+YMAAcoQAAGC9ywE+AUrAAEoMAR7AAEoTwACcNQMAAxbAAEoogcAASh/ATmuXpMzAAHKJgMAASjXATmuKFsAASkEWwABKOy6SJsAAnDHAAJzEhTTAAGLkAAAATmp1AE5qywBOa08ATmv4AAAAAwLAAJzOgajAAEpVwABKW8AATFMDwABitAAAAWDAAJySAAAAAQXAAJzXgajAAEq9wABKvcAAS1AAAAADwABK0sAAS1AAAAACAgLAAEruAAAAsHhgvdYAwABLEgAAAJYgYLzMAABgwACczgE/AQkAwABLKcAAnLICAAKAwABLM8BObFaBwABLSMBObGMAAwbAAJzRgajAAEqTwABKpsAASrgBAMAAYrXAAJwxAAAAAQPAAEquwABKuAAAAAAAAABgvMwBSsAASrEBJsAASrEBFsAASrEuwABR1MAAnDHAAJyVYLzMBsAAnNOBqMAAS1XAAEtvwABL0gAAwABiqwFqwABLVmDAAP0cAgAAAQPAAEuBwABL0gAAAAEBAcAAS5EAAACqPmDAAHKEAABgvcsBPgFKwABLoQEcwABLqC7AAGKswACcMQIAAhbAAEu8LsAAYrXAAJwxwACc0YDAAEvFwE5tJwDAAJylBsAAnNWBqMAAS9fAAEvxwABMUQAAwABirsAAnDEBasAAS9hgwAD9HAIAAAEDwABMB8AATFEAAAACAgLAAEwdAAAAq8VgvcsAwABMMgAAAKo+YMAAcoQAAGC9ywE+AUrAAExCAYDAAExJwE5trwAATmyaAE5s8ABObXQATm3hAAAAAwLAAJzYgajAAExWwABMXMAATvUDwABitgAAAWDAAJySAAABBMAAnNuBqMAATNDAAEzVCZImwACcMQBgwABi4gABBcAAnOWBqMAATNrAAEzawABNeAAAAAPAAEzvwABNeAAAAAMDA8AATQQAAACweGC91gDAAE0uAAAAliBgvMwAwABNPAAABJImYMAAYuIAAGDAAJzYAT8CCAHAAJzbggDATm52CQDAAE1RwACcsgIAAoDAAE1bwE5uXIHAAE1wwE5uaQAEBsAAnN6BqMAATJTAAEynwABMuQEAwABit8AAnDEAAAABA8AATK/AAEy5AAAAAAAAAGC8zAFKwABMsgEmwABMsgEWwABMsi7AAFHUwACcMcAAnJVgvMwGwACc4IGowABNfcAATZfAAE36AADAAGKrAWrAAE1+YMAA/RwCAAABA8AATanAAE36AAAAAQEBwABNuQAAAKo+YMAAcoQAAGC9ywE+AUrAAE3JARzAAE3QLsAAYqzAAJwxAgACFsAATeQuwABit8AAnDHAAJzegMAATe3ATm9IAMAAnKUGwACc4oGowABN/8AAThnAAE6uAADAAGKuwACcMQFqwABOAGDAAP0cAgAAAQPAAE4vwABOrgAAAAICAsAATkUAAACrxWC9ywDAAE5aAAAAqj5gwAByhAAAYL3LAT4BSsAATmoBHsAATnHAAJw1AwADFsAAToaBwABOfcBOb92kzMAAcomAwABOk8BOb9AWwABOnxbAAE6ZLpImwACcMcAAnNuFNMAAYuQABsAAnOOBqMAATrPAAE7EwABO8wAAwABPiAFqwABOtGDAAP0cAgAAAQPAAE7RwABO8wAAAAEBAcAATuEAAACqPmDAAHKEAABgwAD6CgFKwABO7gEqAABObrsATm8RAE5vlQBOcD4ATnCSAAAABALAAJzmgajAAE74wABO/sAAVLoDwABiuAAAAWDAAJySAAABBMAAnOmBqMAAT4bAAE+LCZImwACcMQBgwABi4gABBcAAnPOBqMAAT5DAAE+QwABQPQAAAAPAAE+xwABQPQAAAAMDA8AAT8YAAACweGC91gDAAE/zAAAAliBgvOQAwABQAQAABJImYMAAYuIAAGDAAJzmAT8CCAHAAJzpggDATnErCQDAAFAWwACcsgIAAoDAAFAgwE5xEYHAAFA1wE5xHgAEBsAAnOyBqMAAT0LAAE9YwABPbwEAwABiucAAnDEAAAABA8AAT2XAAE9vAAAAAAAAAGC85AFKwABPaAEmwABPaAEWwABPaC7AAFHUwACcMcAAnJVgvOQGwACc7oGowABQQsAAUFzAAFOZAADAAGKrAWrAAFBDYMAA/RwCAAABA8AAUG7AAFOZAAAAAQEBwABQfgAAAKo+YMAAcoQAAGC9ywE+A07AAFCiwABQtgAAsHhgvdYBFsAAUMGAwABQuMBOcf2weMAAcotJwABQ2hbAAFDrFsAAUN4uwABiucAAnDHAAJzssq286D4BScAAUREcwABRMRbAAFEiFsAAURUuwABiucAAnDHAAJzshPm8xUgBAAEWwABRTBbAAFE9gMAAUTTATnH9svvAAHKMmse4NQDAAP0pPgI9HMAAUWAuwABPXgEAAYDAAFFnwE5x/QDAAJxVSsAAUXoBHMAAUZWBwABRgcBOchS0/AEAARbAAFG1gcAAUaHATnIUhX+93AC9+0nAAFHMHMAAUewWwABR3RbAAFHQLsAAYrnAAJwxwACc7IT5vMVIAQABFsAAUhEWwABSAoDAAFH5wE5x/bL7wAByjJrGuDMAwAD9KT4CPRzAAFImLsAAT14BAAGAwABSLcBOcf0AwACcVUrAAFJAARzAAFJbgcAAUkfATnIUtPwBAAEWwABSe4HAAFJnwE5yFIWfvdsAvftJwABSkxzAAFKzFsAAUqQWwABSly7AAGK5wACcMcAAnOyE+bzFSAEAARbAAFLYFsAAUsmAwABSwMBOcf2y+8AAcoyay7g3AMAA/Sk+Aj0cwABS7y7AAE9eAQABgMAAUvbATnH9AMAAnFVKwABTCQEcwABTJIHAAFMQwE5yFLT8AQABFsAAU0SBwABTMMBOchSFur3fAL37Pz9KwABTYwEcwABTai7AAGKswACcMQIAAhbAAFN+LsAAYrnAAJwxwACc7IDAAFOMwE5x/QDAAJylBsAAnPCBqMAAU57AAFO4wABUTQAAwABirsAAnDEBasAAU59gwAD9HAIAAAEDwABTzsAAVE0AAAACAgLAAFPkAAAAq8VgvcsAwABT+QAAAKo+YMAAcoQAAGC9ywE+AUrAAFQJAR7AAFQQwACcNQMAAxbAAFQlgcAAVBzATnSgpMzAAHKJgMAAVDLATnSTFsAAVD4WwABUOC6SJsAAnDHAAJzphTTAAGLkAAbAAJzxgajAAFRSwABUY8AAVLgAAMAAT4gBasAAVFNgwAD9HAIAAAEDwABUcMAAVLgAAAABAQHAAFSAAAAAqj5gwAByhAAAYMAA+goBPgFKwABUkAEdwABUncAAT4gBAAGAwABUq8BOdTgAwACcWQAATnFwAE5xxgBOdFgATnUBAE51cAAAAAQCwACc9IGowABUvcAAVMPAAFdUA8AAYroAAAFgwACckgAAAAEFwACc/oGowABVPMAAVTzAAFXhAAAAA8AAVWDAAFXhAAAAAgICwABVfAAAALB4YL3WAMAAVaMAAACWIGC85AAAYMAAnPQBPwEJAMAAVbrAAJyyAgACgMAAVcTATnXSgcAAVdnATnXfAAQGwACc94GowABVCsAAVSDAAFU3AQDAAGK5wACcMQAAAAEDwABVLcAAVTcAAAAAAAAAYLzkAUrAAFUwASbAAFUwARbAAFUwLsAAUdTAAJwxwACclWC85AbAAJz5gajAAFXmwABWAMAAVmgAAMAAYqsBasAAVedgwAD9HAIAAAEDwABWEsAAVmgAAAABAQHAAFYiAAAAqj5gwAByhAAAYL3LAT4BSsAAVjIBHMAAVjkuwABirMAAnDECAAIWwABWTS7AAGK5wACcMcAAnPeAwABWW8BOdqMAwACcpQbAAJz7gajAAFZtwABWh8AAVucAAMAAYq7AAJwxAWrAAFZuYMAA/RwCAAABA8AAVp3AAFbnAAAAAgICwABWswAAAKvFYL3LAMAAVsgAAACqPmDAAHKEAABgvcsBPgFKwABW2AGAwABW38BOdysGwACc/IGowABW7MAAVv3AAFdSAADAAE+IAWrAAFbtYMAA/RwCAAABA8AAVwrAAFdSAAAAAQEBwABXGgAAAKo+YMAAcoQAAGDAAPoKAT4BSsAAVyoBHcAAVzfAAE+IAQABgMAAV0XATneUAMAAnFkAAE52FgBOdmwATnbwAE53XQBOd8wAAAAEAsAAnP+BqMAAWCPAAFgpwABx6QPAAGK7AAABYMAAnIAAAAcEwACdAoGowABYccAAWHsJwABivMAAnDEAYLzwAATAAJ0DgajAAFiOwABYkwmSJsAAnDEAYMAAYk8ABMAAnQSBqMAAWKzAAFizCcAAYrfAAJwxAGC8zAAEwACdBYGowABYwsAAWNwJwABivcAAnDEAYMAA+goABMAAnQaBqMAAWOvAAFj+CcAAYr7AAJwxAGDAAPoKAATAAJ0HgajAAFkNwABZIgnAAGK/wACcMQBgwAD6CgAEwACdCIGowABZK8AAWU0YwABiwMAAnDEAYMAA+goBKgMFwACdGYGowABZUsAAWVLAAFq3ALMPAAPAAFl4wABatwAAAAUFBcAAWZQAAACweGC91gDAAFnFAAAAglNgwACckgDAAFnZAAAEwABivGC88ADAAFnwAAAEkiZgwABiTwDAAFoCAAAEwABit2C8zAAAYMAAnP8BPwcIAcAAnQKCAMBOeR8IAcAAnQODAMBOeS4IAcAAnQSEAMBOeT0IAMAAnQUqCADAAJ0GKQgAwACdByoJAMAAWpDAAJyJAgACgMAAWprATnkDgcAAWq/ATnkQAAXAAJ0agajAAFq8wABavMAAXDsAhCMAA8AAWtvAAFw7AAAABgUFwABa8AAAALB4YL3WAMAAWyEAAACCU2DAAJySAMAAWy8AAATAAGK8YLzwAMAAW0AAAASSJmDAAGJPAMAAW0wAAATAAGK3YLzMAAHAAFthAAAAoQpgwAD6CgFqwABbd2DAAPoKAGDAAJz/AT8HCAHAAJ0CggDATnnwCAHAAJ0DgwDATnn/CAHAAJ0EhADATnoOCADAAJ0FKggAwACdBioIAMAAnQeFwABb8MBOeh4JAMAAXBTAAJyJAgACgMAAXB7ATnnUgcAAXDPATnnhAAXAAJ0bgajAAFxAwABcQMAAXeIAu7oAA8AAXGfAAF3iAAAABgYGwABcgwAAALB4YL3WAMAAXLQAAACCU2DAAJySAMAAXMgAAATAAGK8YLzwAMAAXN8AAASSJmDAAGJPAMAAXPEAAATAAGK3YLzMAMAAXRUAAADAAE9KYMAAnHIAAGDAAJz/AT8HCAHAAJ0CggDATnrjCAHAAJ0DgwDATnryCAHAAJ0EhADATnsBCADAAJ0FKQgAwACdBioIAMAAnQcqCQDAAF2nwACcigMAA4DAAF24wE56x4HAAF3NwE561IXAAF3WwE57EAANBsAAnQqBqMAAXefAAF36wABeCwEAlkEAAAABA8AAXgHAAF4LAAAAAAAAAGC8zAFKwABeBAEWwABeBC7AAGK3wACcMcAAnQQGwACdC4GowABeEMAAXhrAAF4xAQCA7QAAAAEDwABeJMAAXjEAAAAAAAAAYLzwAUrAAF4nARbAAF4nLsAAYrzAAJwxwACdAgbAAJ0MgajAAF42wABeP8AAXmsBAMAAS9cAAAABA8AAXlLAAF5rAAAAAAAAAGDAAPoKAUrAAF5VASEWwABeVi7AAGK/wACcMcAAnQcGwACdDYGowABecMAAXofAAF6gAQCjswFqwABecWDAAP0cAgAAAQPAAF6RwABeoAAAAAAAAABgwAD9tgFKwABelAEkwABeoAEWwABeli6A7cAAnQsGwACdD4GowABepcAAXqrAAGBQAADAAE+NAAAAAQPAAF7GwABgUAAAAAEBAcAAXtYAAACqPmDAAHKEAABcAT4EQCEWwABe7i7AAGK/wACcMcAAnQfAAF7twABfAwA9F8AAXwouwABiwMAAnDEpwACdCE7AAF/QwABf3AAAhpJgwACcNgEcwABf74DAAF/mwE5858AATxsBAAEWwABgCS7AAGK8wACcMcAAnQIAwABymknAAGAaIRzAAGAqgcAAYB7ATn0tSAEAASsAwAD9KT0cwABgP4HAAGAzwE59LcAAYpQBAAEuAMAAnEw/BsAAnRCBqMAAYIbAAGCUwABnRwAAwABiqwAAAAEDwABgpsAAZ0cAAAABAQHAAGC2AAAAqj5gwAByhAAAYL3LAT4HScAAYMYiIRzAAGDUgMAAYMvATn3SwABPMwEAARbAAGEGLsAAYrfAAJwxwACdBADAAHK0ARzAAGEjgMAAYRrATn3St+4BAAEWwABhMS7AAGK3wACcMcAAnQQAwABytT4CPRzAAGHHLsAAT14BAAGAwABhzsBOfdIAwACcVUrAAGHfARzAAGHmLsAAYpYBAAGAwABh78BOfdIAwACdEz9JwABiZxbAAGJrLsAAYr/AAJwxwACdB0rAAGKCASs/ScAAYpQiIhbAAGKZLsAAYsDAAJwxwACdCAEWwABity7AAGK+wACcMcAAnQYAFsAAYtcuwABioMAAnII+Aj0cwABjki7AAE9eAgABgMAAY5nATn3SAcAAT18qwACcVUrAAGPDARzAAGPKLsAAYpYBAAGAwABj08BOfdIAwACdEz9JwABj6CIWwABj7C7AAGK9wACcMcAAnQUAIhzAAGQgFsAAZBsWwABkEy7AAGK3wACcMcAAnQSAvbyTSAEAAWrAAGQvYMAA/bbAAOLzAMAA/cUBIhzAAGRaFsAAZFUWwABkTS7AAGK3wACcMcAAnQSAvbyTSAEAAWrAAGRpYMAA/bbAAOLkAMAA/cUAFsAAZIEuwABioMAAnII+Aj0cwABlCy7AAE9eAQABgMAAZRLATn3SAMAAnFVKwABlIwEcwABlKi7AAGKWAQABgMAAZTPATn3SAMAAnRM/ScAAZUgcwABlchbAAGVVgMAAZUzATn3SpPnAAHKQtysBAAEWwABlmC7AAGK3wACcMcAAnQQAwABCsT4CPRzAAGWqLsAAT14BAAGAwABlscBOfdIAwACcVUrAAGXCARzAAGXJLsAAYpYBAAGAwABl0sBOfdIAwACdEz9JwABl5xzAAGXzFsAAZesuwABit8AAnDHAAJ0ESAEAARbAAGX/gMAAZfbATn3StnXAAHKRAMAA/Sk+Aj0cwABm+i7AAE9eAQABgMAAZwHATn3SAMAAnFVKwABnEgEcwABnGS7AAGKWAQABgMAAZyLATn3SAMAAnRM/SsAAZzgBKwbAAJ0RgajAAGdMwABnWsAAbdMAAMAAYq0AAAABA8AAZ2/AAG3TAAAAAgICwABnhQAAAKvFYL3LAMAAZ5oAAACqPmDAAHKEAABgvcsBPgJJwABnqhbAAGgFHMAAZ9wWwABnwxbAAGe3gcAAZ67AToExpMzAAHKJpPrAAE0esyIBAAEWwABn9C6WQcAAnQoAwABuRoMbgWk+AUrAAG2DAR7AAG2KwACcNQMAAxbAAG2fgcAAbZbAToExpMzAAHKJgMAAbazAToEkFsAAbbIukibAAJwxwACdAwA/SsAAbcQBgMAAbcvAToEkBsAAnRKBqMAAbdjAAG3ywABu4AAAwABAmQFqwABt2WDAAP0cAgAAAQPAAG39wABu4AAAAAEBAcAAbg0AAACqPmDAAHKEAABgvcsBPgNOwABuK8AAbjMAALrQYL3LARzAAG41LsAAYqsBAAGAwABuSMBOghgAwACdEEnAAG5XIRzAAG5jgcAAblvAToIvSAEAASsAwAD9KUrAAG5sAYHAAG5zwE6CLz9KwABugAEcwABuhy7AAGKtAgACHMAAbrUWwABur4DAAG6mwE6CGIVnwAByjsAATtgBAAEWwABuxS7AAE9KwACcRwDAAKEIgMAAbtPAToIYAMAAnREGwACdE4GowABu5cAAbv/AAG9rAADAAGKWAWrAAG7mYMAA/RwCAAABA8AAbwfAAG9rAAAAAQEBwABvFwAAAKo+YMAAcoQAAGC9ywE+AUrAAG8nARzAAG8uLsAAYq0CAAIdwABvSsAAYpYBAAGAwABvU8BOgxMAwACcVIDAAG9ewE6DEwDAAJ0RBsAAnRSBqMAAb3DAAG+BwABwnAAAwABPiAFqwABvcWDAAP0cAgAAAQPAAG+OwABwnAAAAAEBAcAAb54AAACqPmDAAHKEAABgwAD6CgE+AknAAHA0FsAAcDguwABivcAAnDHAAJ0FPgFKwABwXAEqP0rAAHB0AR3AAHCBwABPiAEAAYDAAHCPwE6DmwDAAJxZBsAAnRWBqMAAcKHAAHCtwABxEAAAhE0BasAAcKJgwAD9HAIAAAEDwABws8AAcRAAAAABAQHAAHDLAAAAhy5dwACecQFbAABbAT4BSsAAcNoBHMAAcOmAwABw4cBOhCnAAGLBAQABLgDAAJ6DBsAAnRaBqMAAcRXAAHEowABxUwAAIwFqwABxFmDAAP0cAgAAAQPAAHEwwABxUwAAAAAAAABgwAD9tgFKwABxNgEkwABxUwQnwABiwhbAAHFCLsAAYrzAAJwxwACdAieA2RbAAHFOLoKQwACcPAbAAJ0XgajAAHFYwABxa8AAcecAAMAAT20BasAAcVlgwAD9HAIAAAEDwABxf8AAcecAAAABAQHAAHGLAAAAhWdgwACgowAAYMAA/bYBPgE9MMAAcZgfwABxosAA+2IBAAEnwABiwwAAAE57jQBOe9QATnwbAE58ZwBOfLsATn2mAE6A+ABOgeEAToLcAE6DZABOg/QAToRgAE6EzQBOhTQAAAANAsAAnRyBqMAAcezAAHHxwAByDwvAAGLEAAABYMAA/RwAAAUEwACdHoGowABx8cAAcfEJJwBgwAD70AAEwACdIIGowABx8cAAcfEJKMAAnDEAYMAA/bYABMAAnSGBqMAAcfHAAHHxBikAXcAA/HQBYMAAnRwBagBdwAD8dAFgwACdHMABXw4EwACdIoGowABx/sAAcf4Gr9kAYMAAnRwBagBgwACdHMABPdcEwACdI4GowAByCMAAcggGwABixQBgwACdHAFqAGDAAJ0cwAE98AEFwACdJ4GowABx8cAAcfHAAHIPAQAAA8AAcfHAAHIPAAAAAgICwABx8QAABCdgwAD70ADAAHHxAAAEKGDAAP22AABgwACdHAE/AwgAwACdHoAAwE6GZwgAwACdIIEAwE6GdQkAAMAA/TIAAAAAAQbAAJ0lgajAAHHxwABx8cAAcg8AACMAAAABA8AAcfHAAHIPAAAAAAAAAGDAAP22AUoAAQ8ALsAAnSAAAE6GsABOhuoAAAABAsAAnSiBqMAAdNHAAHTgwAB4TDfAAGLGAAABYMAAnDYAAWDAAJxmAQTAAJ0qgaifIp9GGMAAT2IAYMAA+goBKgQFwACdLAAAAAAEAAADAAAAAAACAgIAAAAAgpBbAAAAAACCU1sAAGDAAJ0oAT8BCQAAwACcYgIAAoAAwE6HTYEAwE6HVQAFwACdLQAAAAAEwABijwADAAAAAAACAgIAAAAAgpBbAAAAAACCU1sAAGDAAJ0oAT8BCQAAwACcYwIAAoAAwE6HlYEAwE6HnQAFwACdLgAAAAAEwABikAADAAAAAAABAQEAAAAAgpBbAABgwACdKAE/AQkAAMAAnGQBAAGAAMBOh90ABcAAnS8AAAAABMAAYpEAAwAAAAAAAwMDAAAAAIKQWwAAAAAAglNbAAAAAADAAGKLWwAAYMAAnSgBPwEJAADAAJxlAwADgADATogXgQDATogfggDATognAAAAAE6IWAAAAAACwACdMIGowAB00cAAdODAAHhMB8AAYscAAAFgwACdKAAABgTAAJ0zgajAAHVDwAB1SAnAAGLIwACcMQBgwAD9HAAEwACdNIGowAB1X8AAdWUJuagAYLy3AATAAJ01gajAAHV4wAB1gAmk3gBgwABLSAAEwACdNoGowAB1mMAAdZwJq8UAYL3LAATAAJ03gajAAHW1wAB1vglbAGDAAJ/rAATAAJ04gajAAHXNwAB10wnAAE8mAGDAAPoKAAEFwACdQIGowAB12MAAddjAAHcfAAAAA8AAde/AAHcfAAAACAgIwAB2CwAAALB4YL3WAMAAdjwAAACCU2DAAJySAMAAdlAAAATAAGLIYMAA/RwAwAB2YgAABLmoYLy3AMAAdnUAAASk3mDAAEtIAMAAdooAAASrxWC9ywDAAHabAAAEW2DAAJ/rAMAAdrEAAATAAE8mYMAA+goAAGDAAJ0wAT4BQCXAAHcQFsAAdwouwABiyMAAnDHAAJ0zYIJLwAB3CsAAdxoABwgBwACdM4IAwE6JXwgBwACdNIMAwE6JcAgBwACdNYQAwE6JfQgBwACdNoUAwE6JjAgBwACdN4YAwE6JmQgBwACdOIcAwE6JpwkAwAB2x8AAnS0CAAIWwAB26YDAAHbVwE6JQ7Ttve2BwAB29MBOiVAABAbAAJ06gajAAHckwAB3N8AAd2EAACMBasAAdyVgwAD9HAIAAAEDwAB3P8AAd2EAAAAAAAAAYMAA/bYBSsAAd0UBJMAAd2EEJ8AAYskWwAB3US6js8AAnT4ngNkWwAB3XC6CkMAAnDwGwACdO4GowAB3oMAAd6XAAHfGAALAAE+QAAAAAQPAAHevwAB3xgAAAAEBAcAAd78AAACq1WDAAHKEAABcAAbAAJ09gajAAHgDwAB4HsAAeCUBAsAAT2UAAAABA8AAeCXAAHglAAAAAAAAAF3AAPwyAWC8twAGwACdPoGowAB4KsAAeDXAAHhKAQCjswAAAAEDwAB4P8AAeEoAAAAAAAAAYMAA/bYBSsAAeEIBJMAAeEoBFsAAeEQuwABiyMAAnDHAAJ0zAABOilgAToq/AE6K/QBOizQATouDAAAABALAAJ1BgajAAHhPwAB4VcAAgi8DwABiygAAAWDAAJ0wAAABBMAAnUOBqMAAeKrAAHi3CcAAT2MAYLy3AAEFwACdUYGowAB4vMAAeLzAAHpLAAAAA8AAeNnAAHpLAAAACQkJwAB49QAAALB4YL3WAMAAeSYAAACCU2DAAJySAMAAeTwAAAAgYMAA/RwAwAB5VQAAAKzcYLy3AMAAeWsAAATAAE9jYLy3AMAAeYkAAACk3mDAAEtIAMAAeacAAACrxWC9ywDAAHnCAAAAW2DAAJ/rAMAAedgAAADAAE8mYMAA+goAAGDAAJ1BAT8CCAHAAJ1DhADATow1CQDAAHnowACdQAgACIDAAHnuwE6L/oHAAHoDwE6MC4LAAHoMwE6MGoPAAHoSwE6MKIXAAHodwE6MRIbAAHonwE6MU4fAAHo5wE6MYBTAAHpEwE6MbggAAAkGwACdRoGowAB6UMAAembAAHrYAADAAGLLwACcMQAAAAEDwAB6eMAAetgAAAABAQHAAHqIAAAAqj5gwAByhAAAYMAAnJIBPgFKwAB6mAEcwAB6rhbAAHqogMAAep/ATo0dhWfAAHKOwABO0gEAARbAAHrGLsAAT2PAAJ1DAMAAoPUGwACdSIGowAB63cAAeu7AAHx6AADAAE+QAWrAAHreYMAA/RwCAAABA8AAevjAAHx6AAAAAQEBwAB7CAAAAKo+YMAAcoQAAFwBPgVOwAB7LsAAezUAAMAATyhgwACckgEcwAB7Ny7AAGLLwACcMQEAAYDAAHtKwE6NpQDAAJ1GPRzAAHtggcAAe1nATo26wABipQIAAhbAAHtoLrmowACdNBbAAHtwLsAAYsjAAJwxwACdMwDAAJygPRzAAHuDgcAAe3zATo26wABilAEAAS4AwACcTEnAAHuWIRzAAHukFsAAe5ouW8AAnTdIAQABKwDAAJ/1PgE9HMAAe78WwAB7tS5bwACdN4P4AQABNMAAe8cDwAB7x8AAe+MAAAABAQHAAHvIAAAAgVRgwACcNgAAXAFKwAB70QEcwAB71oLAAHvRwE6OjsAAYpQBAAEuAMAAnEwAwACf9z89HMAAe/mAwAB78MBOjaXAAE8rBwAFLhbAAHwjLsAAT2PAAJ1DFsAAfDIuW8AAnTcWwAB8PS6k3sAAnTUWwAB8Ry6rxcAAnTYChFkqwABPLCrAAHKoBsAAnU6BqMAAfH/AAHyIwAB9mgEAwABizAAAAAEDwAB8lsAAfZoAAAAAAAAAYMAA+goBPgFKwAB9fwEcwAB9jxbAAH2GLqTewACdNUgBAAErAMAA/SkGwACdR4GowAB9n8AAfa/AAH4yAADAAGLNwACcMQAAAAEDwAB9zcAAfjIAAAABAQHAAH3dAAAAqj5gwAByhAAAYMAAnDYBPgFKwAB97QEcwAB9/YDAAH30wE6PoraRAgACFsAAfhYuwABPY8AAnUMWwAB+JS6k3sAAnTUAwAByqwbAAJ1JgajAAH43wAB+UcAAfzMAAMAAQJkBasAAfjhgwAD9HAIAAAEDwAB+XMAAfzMAAAABAQHAAH5sAAAAqj5gwAByhAAAYL3LAT4BScAAfnwWwAB+gC7AAGLMwACdTj4CQCEcwAB+qBbAAH6eLlvAAJ03SAEAASsAwACf9cAAfp7AAH6vAErAAH64ARbAAH7cHMAAfr8uwABiy8AAnDEBAAGAwAB+0sBOkCkAwACdRoKQwACcPD4BSsAAfvUBFsAAfyUcwAB+/C7AAGLNwACcMQEAAYDAAH8bwE6QKQDAAJ1HgpDAAJw8BsAAnU+BqMAAfzjAAH9fwAB/eQEAwABPZQFqwAB/OWDAAP0cAgAAAQPAAH9nwAB/eQAAAAAAAABdwAD8MgFgvLcBSsAAf2oBMcAAf2pgvLcBFsAAf2suwABPY8AAnUMGwACdSoGowAB/fsAAf4rAAH/yAACETQFqwAB/f2DAAP0cAgAAAQPAAH+QwAB/8gAAAAEBAcAAf6gAAACHLl3AAJ5xAVsAAFsBPgFKwAB/twEcwAB/xoDAAH++wE6Rb8AAYs4BAAEuAMAAnoAGwACdS4GowAB/98AAgAjAAID3AADAAE+IAWrAAH/4YMAA/RwCAAABA8AAgBXAAID3AAAAAQEBwACAJQAAAKo+YMAAcoQAAGDAAPoKAT4CTsAAgDrAAIBDAADAAGKMYMAA+goBFsAAgGIcwACARS7AAGLLwACcMQEAAYDAAIBYwE6R3QDAAJ1GwABijMAAnJ5KwACAcAEiIoHAAIB3wE6R9gAiHMAAgJYWwACAjC5bwACdN0gBAAErAMAAn/UBHMAAgKsWwACAoS5bwACdN5YwAQABNMAAgLEDwACAscAAgMgAAAABAQHAAICyAAAAgVRgwACcNgAAYMAA+goBSsAAgLsBFsAAgMCCwACAu8BOko3AAGKMwACcQgDAAJ/4AB3AAIDcwABPiAEAAYDAAIDqwE6R3QDAAJxZBsAAnUyBqMAAgPzAAIENwACCLQAAwABilwFqwACA/WDAAP0cAgAAAQPAAIElwACCLQAAAAEBAcAAgTUAAACqPmDAAHKEAABcAT4ETsAAgVzAAIFjAADAAE8oYMAAnIABHMAAgWUuwABiy8AAnDEBAAGAwACBeMBOkxYAwACdRj0cwACBjoHAAIGHwE6TK7lDAQABLgDAAJxOScAAgaQhHMAAgbIWwACBqC5bwACdN0gBAAErAMAAn/U+AT0cwACBzRbAAIHDLlvAAJ03g/gBAAE0wACB1QPAAIHVwACB9AAAAAEBAcAAgdYAAACBVGDAAJw2AABcAUrAAIHfARzAAIHkgsAAgd/ATpPEuUMBAAEuAMAAnE4AwACf9z89HcAAggfAAGKXAQABgMAAgiDATpMWAMAAnFoAAE6M7QBOjW4ATo8cAE6PcgBOj/IATpDbAE6ROgBOkaYATpLfAE6UFgAAAAkCwACdUoGowACCMsAAgjjAALD8A8AAYs8AAQAAgnZgwAD9HAFbAWDAAJ0wAAAFBMAAnVWBqMAAgo3AAIKWCcAAYtDAAJwxAGDAAJ0cAATAAJ1YgajAAIKwwACCuAmFeQBgwACcNgAEwACdWYGowACCx8AAgtQJwABPKgBgwAD6CgAEwACdVoGowACC3cAAgvMYwABi0cAAnDEAYMAA+goBKwTAAJ1XgajAAIM7wACDSxjAAGLSwACcMQBdwAD8MgFgvLcBKwEFwACdaoGowACDUMAAg1DAAIU4AAAAA8AAg27AAIU4AAAACwsLwACDigAAALB4YL3WAMAAg7sAAACCU2DAAJySAMAAg88AAATAAGLQYMAAnRwAwACD4gAAACBfAAAAwACD+wAAAKzcYLy3AMAAhBUAAACk3mDAAEtIAMAAhDMAAACrxWC9ywDAAIREAAAEhXlgwACcNgDAAIRjAAAAW2DAAJ/rAMAAhHkAAADAAE8mYMAA+goAwACEjAAABMAATypgwAD6CgAAXcAAnVIBXwAAAT4BQB7AAIUUwACcMwIAAhbAAIUiLsAAYtDAAJwxwACdVRbAAIUtLsAAYsjAAJwxwACdMwDAAIUUwACFMwAECAHAAJ1VggDATpVKCAHAAJ1YhwDATpWQCAHAAJ1ZFADATpW+CgAJAMAAhKPAAJ1ACAAIgMAAhKnATpUugcAAhL7ATpU7g8AAhMfATpVbhMAAhM3ATpVnhcAAhNjATpV0hsAAhOLATpWDFMAAhPTATpWfCAAUwACE/8BOla0JAAANBsAAnVuBqMAAhT3AAIVOwACIZQAAwABPkAFqwACFPmDAAP0cAgAAAQPAAIVYwACIZQAAAAEBAcAAhWgAAACqPmDAAHKEAABcAT4HQCEcwACFiBbAAIV/LoV5wACdWEgBAAErAMAA/SnAAIV/wACFjwBOwACFpMAAha0AALWQYL3LARzAAIWvLsAAYtMBAAGAwACFxMBOltAAwACdXD0XwACF0y7AAGLRwACcMRzAAIYJFsAAhf2AwACF9MBOltCkzMAAcom1/gIAAhbAAIYdLqTewACdNYHAAIYnwE6XCwDAAE0ywACdVj0XwACGNi7AAGLSwACcMRzAAIZeFsAAhlKAwACGScBOltCkzMAAcom0HwIAAhbAAIZsLqTewACdNYHAAIZ2wE6XCwDAAE00wACdVz0cwACGjhbAAIaFLoV5wACdWMAAYpQBAAEuAMAAnExJwACGoSEcwACGrxbAAIalLlvAAJ03SAEAASsAwACf9T4BPRzAAIbKFsAAhsAuW8AAnTeD+AEAATTAAIbSA8AAhtLAAIbuAAAAAQEBwACG0wAAAIFUYMAAnDYAAFwBSsAAhtwBHMAAhuGCwACG3MBOmDfAAGKUAQABLgDAAJxMAMAAn/c/RsAAhvvAAIcqwACHDQAAAJYgYLy3ABbAAIcYLsAAYtLAAJwxwACdVz4ETsAAh0jAAIdPAADAAE8oYMAAnJIBHMAAh2oWwACHZIDAAIdbwE6W0IVnwAByjsAATtIBAAGCwACHgsBOmHkAwACg9T0cwACHmYPAAIeSwE6Ym8AAYqUCAAIWwACHoS65qMAAnTQWwACHqS7AAGLIwACcMcAAnTMAwACcoD0cwACHvoPAAIe3wE6Ym8AAYpQBAAEuAMAAnEw9HMAAh9yAwACH08BOltDAAE8rBwAFLoLAAIgIwE6YeRbAAIgRLlvAAJ03FsAAiBwupN7AAJ01gcAAiCbATpcLAoRZKsAATywqwAByqAbAAJ1mgajAAIiwwACIucAAiOgBAMAAT24AAAABA8AAiM/AAIjoAAAAAAAAAGDAAPoKAUrAAIjSARbAAIjSLsAAYtHAAJwxwACdVgbAAJ1ngajAAImgwACJu8AAid4BAMAAT3AAAAABA8AAicvAAIneAAAAAAAAAF3AAPwyAWC8twFKwACJzgEWwACJzi7AAGLSwACcMcAAnVcGwACdaIGowACJ48AAigrAAIolAQDAAE9lAWrAAInkYMAA/RwCAAABA8AAihLAAIolAAAAAAAAAF3AAPwyAWC8twFKwACKFQEWwACKFS7AAGLSwACcMcAAnVcGwACdXIGowACKKsAAijjAAItSAADAAGLTAAAAAQPAAIpMwACLUgAAAAEBAcAAilwAAACqPmDAAHKEAABgvcsBPgJOwACKesAAiocAAIV8YL3LARbAAIqSFsAAiokuhXnAAJ1YgpDAAJw8ScAAip0hHMAAiqYWwACKoS6rxcAAnTZIAQABgcAAiqnATpq2AMAA/Sk+AUrAAIq/ASMcwACK04HAAIrGwE6atkgBAAEWwACK8xbAAIrfgMAAitbATpqfsHjAAHKLnmK92ADAAP0pK4HAAIscwE6atgFgvcs+AUrAAIs9ARbAAItELqvFwACdNgbAAJ1dgajAAItXwACLXMAAjHYAAMAAYtQAAAABA8AAi33AAIx2AAAAAQEBwACLjQAAAKo+YMAAcoQAAGDAAPoKAT4BSsAAi50BHMAAi7UWwACLpC7AAGLSwACcMcAAnVeB1AEAATTAAIu5A8AAi7nAAIxxAAAAAQEBwACLxwAAAINNYLy3AABgwAD6CgE+AUrAAIvSASIiIhbAAIvbgcAAi9nATpvfsny8vwAWwACL9YHAAIvzwE6b34T8vLwAHMAAjBoWwACMFYHAAIwTwE6b34C9vJNIAQABasAAjClgwAD9tsAA4vMAwAD9xQAcwACMXhbAAIxNgMAAjETATpuRtnfAAHKNwABNsgEAASbAAIxoAYHAAIxowE6b32C8zADAAG/JAMAA/EcGwACdXoGowACN6MAAjfjAAJlmAADAAGLVAAAAAQPAAI4RwACZZgAAAAMDA8AAjiIAAACk3mDAAEtIAMAAjjoAAACrxWC9ywDAAI5PAAAAqj5gwAByhAAAYMAAnDYBPg9OwACObMAAjngAAKTMYMAATQ8BFsAAjoOCwACOesBOnNekzMAAcolJwACOlBzAAI6dgcAAjpjATpzKSAEAASsAwAD9KUrAAI6mASs/ScAAjrcWwACO7hzAAI7YFsAAjsSCwACOu8BOnNeweMAAcou1FAEAAYHAAI7owE6cygC+FrTWvbw+AUrAAI8KASs/ScAAjyEiIRbAAI8vgMAAjybATpy7slvAAEtaACEWwACPQ4DAAI86wE6cu51uwABLXkrAAI9PASs/ScAAj2AhFsAAj3UWwACPbxbAAI9lLlvAAJ03hVfAAJ/ugVXAAPzKSsAAj34BKz9JwACPjxzAAI+vFsAAj6gWwACPnRbAAI+TLlvAAJ03hY3AAJ/tYcAA/KOAlwEAAZQAwAD8/0rAAI+0ASs/TsAAj9LAAI/nAADAAGLWYLylARbAAJAEFsAAj/WDwACP6cBOnPCy+8AATRexGbiST8AAkBfAAJAcAAABugdhAVtgwAD6CgADwACQIcAAkFEAAAABAQHAAJAiAAAAgVRbAABgwAD6CgFKwACQKwEmwACQKwEcwACQNRbAAJAwhsAAkCvATp54gpAAtaMBAAGDwACQRcBOnPAAAGDAAPoKT8AAkFfAAJBcAAABgVVhAVtgwAD6CgADwACQY8AAkH4AAAABAQHAAJBkAAAAgVRbAABgwAD6CgFKwACQbQEmwACQbQEWwACQdxbAAJByh8AAkG3ATp7ngpAAgVUAYMAA+gpPwACQhMAAkIkAAAG1EWEBW2DAAPoKAAPAAJCRwACQ4wAAAAEBAcAAkJIAAACBVFsAAGDAAPoKAT4BSsAAkKABJsAAkKABHMAAkLEWwACQrBTAAJCnwE6fSQgAgpAAtYwCAAKEwACQu8BOniODwACQ0cBOnPAAAGDAAPoKT8AAkOrAAJDvAAABwABi12EBW2DAAPoKAAPAAJD8wACRcgAAAAEBAcAAkP0AAACBVFsAAGDAAPoKAT4BSsAAkQsBJsAAkQsBHMAAkRwWwACRFxTAAJESwE6fxwkAgpAAtYwCAAIWwACRTBbAAJE9g8AAkTHATpzwsvvAAE0XsRe4kIPAAJFgwE6c8AAAYMAA+gpPwACRecAAkYkAAAHAAGLYYQBgwACcNgADwACRkcAAkbYAAAAAAAAAYMAAnDYBSsAAkZcBFsAAkaYWwACRoILAAJGXwE6c14VnwAByjsAAYtnAAKDKTsAAkc3AAJHWAAAfYMAAnDYBIxbAAJHqFsAAkeAuW8AAnTeBVcAAwLorFsAAkhAWwACSBRbAAJH7LlvAAJ03hY3AAJ/tgxnAAPxYAWDAAJw2TsAAkiPAAJIoAACAvWDAAP22ARbAAJIzgMAAkirATpy7gL3AAEtWR8AAkxIUwACTGsBOoNgLAAgFwACTLWrAAJMtYMAA/bbAAJJnwACTPWrAAJM9YMAA/bbAAJJiwACTTWrAAJNNYMAA/bbAAJJqwACTXWrAAJNdYMAA/bbAAOz9wACTdWrAAJN1YMAA/bbAAJJvAD4EScAAk4McwACTjobAAJOHwE6exiABAAEUwACTj8BOoIcKAAAASsAAk5oBHMAAk6kUwACTocBOoDYJACAAAAAAAD9JwACTtSIcwACTxhTAAJO5wE6fpAgAIAEAARbAAJPHLoV5wACdWAAAABzAAJPhFMAAk9TATp+kCAAgAQABFMAAk+LATqCHCgAAAD4CScAAlCAiIhzAAJQpFMAAlCTATqDYCwBIAQABJ2QAwAD9xQAcwACUO4fAAJQzwE6fKCABAAEWwACUPC6FecAAnVgAAAAcwACUUYfAAJRJwE6fKCABAAEUwACUUsBOoIcKAAAAPgFKwACUawEWwACUgRbAAJR7gsAAlHLATpzXhWfAAHKOtOjAAKDTP0rAAJSjARbAAJS5FsAAlLOCwACUqsBOnNeFZ8AAco606cAAoNU/ScAAlNwcwACU5YXAAJTgwE6eVyABAAEUwACU5sBOoIcKAAAAPgFKwACU/QEWwACVExbAAJUNgsAAlQTATpzXhWfAAHKOhX/AAKDSP0rAAJUuASsCwACVR2rAAJVHYMAA/bbAAJJTwACVV2rAAJVXYMAA/bbAAJJWAD4DScAAlWQcwACVb4bAAJVowE6exiABAAEUwACVcMBOoIcKAAAASsAAlXsBHMAAlYoUwACVgsBOoDYJACAAAAAAAD9JwACVliIcwACVoofAAJWawE6fKCABAAEWwACVoy6FecAAnVgAAAAcwACVuIfAAJWwwE6fKCABAAEUwACVucBOoIcKAAAAPgFKwACV0AEWwACV5hbAAJXggsAAldfATpzXhWfAAHKOtOfAAKDUP0rAAJYEASsBwACWHWrAAJYdYMAA/bbAAJJcAD4DScAAliscwACWNobAAJYvwE6exiABAAEUwACWN8BOoIcKAAAASsAAlkIBHMAAllEUwACWScBOoDYJACAAAAAAAD9JwACWXRzAAJZph8AAlmHATp8oIAEAARbAAJZqLoV5wACdWAAAPgFKwACWgQEWwACWlxbAAJaRgsAAlojATpzXhWfAAHKOtOfAAKDUP0rAAJa1ASsBwACWzmrAAJbOYMAA/bbAAJJZAD4DScAAltscwACW5obAAJbfwE6exiABAAEUwACW58BOoIcKAAAASsAAlvIBHMAAlwEUwACW+cBOoDYJACAAAAAAAD9JwACXDSIcwACXGYfAAJcRwE6fKCABAAEWwACXGi6FecAAnVgAAAEcwACXL4fAAJcnwE6fKCABAAEUwACXMMBOoIcKAAAAPgFKwACXRwEWwACXXRbAAJdXgsAAl07ATpzXhWfAAHKOtOfAAKDUP0rAAJd7ASsBwACXlGrAAJeUYMAA/bbAAJJkAD4DScAAl6EcwACXrIbAAJelwE6exiABAAEUwACXrcBOoIcKAAAASsAAl7gBHMAAl8cUwACXv8BOoDYJACAAAAAAAD9JwACX0xzAAJfchcAAl9fATp5XIAEAARTAAJfdwE6ghwoAAAA+AUrAAJf0ARbAAJgKFsAAmASCwACX+8BOnNeFZ8AAco6Ff8AAoNI/SsAAmCUBKwHAAJg+asAAmD5gwAD9tsAA1WIAPgFKwACYnAEWwACYshbAAJisgsAAmKPATpzXhWfAAHKOhX/AAKDSAcAAmMdqwACYx2DAAP22wADtbAA+AUrAAJjWASMcwACY5xbAAJjdLlvAAJ03wABi2gAAAADAAJ/2FsAAmRUWwACZD4LAAJkGwE6c14VnwAByjrTpwACg1SsBYMAAnDYAAT4BSsAAmVEBKwbAAJ1fgajAAJlrwACZhcAAqasAAMAAQJkBasAAmWxgwAD9HAIAAAEDwACZkMAAqasAAAABAQHAAJmgAAAAqj5gwAByhAAAYL3LAT4MTsAAmb3AAJnJAACkzGDAAE0PARbAAJnUgMAAmcvATqbZpMzAAHKJTsAAmfnAAJoNAACweGC91gEWwACaG4HAAJoPwE6m8LB4wABNGE7AAJpLwACaVgAAwABi213AAPwyAWC8twEWwACaWC7AAGLSwACcMcAAnVdOwACafMAAmoUAALWQYL3LARzAAJqHLsAAYtMBAAGAwACanMBOptkAwACdXD0cwACatIDAAJqrwE6m2cAATy0FAAUWwACa1C65qMAAnTQWwACa3C7AAGLQwACcMcAAnVUmwACa5wEWwACa5y7AAGLIwACcMcAAnTNggksWwACa7i6k3sAAnTWEwACa+MBOp2cAwAByqT0XwACbCC7AAGLRwACcMRzAAJs1gcAAmynATqbwtf4CAAIWwACbSS6k3sAAnTWEwACbU8BOp2cAwABNMsAAnVY9F8AAm2IuwABi0sAAnDEcwACbgYHAAJt1wE6m8LQfAgACFsAAm48upN7AAJ01hMAAm5nATqdnAMAATTTAAJ1XScAAm+khHsAAm+7AAPWxAgACFsAAm/guwABi0sAAnDHAAJ1Xg8AAnArATqc8AD4CPRzAAJymHMAAnGsWwACcTy7AAGLSwACcMcAAnVeBpQEAATTAAJxxA8AAnHHAAJyZAAAAAQEBwACccgAAAIJFYLy3AABgwAD6CgFKwACcfQEhHMAAnImDwACcfsBOpzyDFwEAAYXAAJySwE6o4QDAAPxBAMAA/D6D+AEAATTAAJyuA8AAnK7AAJ4MAAAAAQEBwACcvAAAAJYgYLy3AABgwAD82QE+BE7AAJzlwACc7AAAwABPKGDAAJySARzAAJ0JFsAAnQOAwACc+sBOptmFZ8AAco7AAE7SAQABhcAAnSHATqk7AMAAoPU9HMAAnTqGwACdM8BOqVLAAGKlAgACFsAAnUIuuajAAJ00FsAAnUouwABiyMAAnDHAAJ0zAMAAnKA9HMAAnWGGwACdWsBOqVLAAGKUAQABLgDAAJxMPRzAAJ2BgMAAnXjATqbZwABPKwcABS6FwACdr8BOqTsWwACduC5bwACdNxbAAJ3DLqTewACdNYTAAJ3NwE6nZwKEWSrAAE8sKcAAcqgAwAD8Qj0cwACevhzAAJ59g8AAnmfATqc8gaUBAAE0wACegwPAAJ6DwACesQAAAAEBAcAAnoQAAACCRWC8twAAYMAA+goBSsAAno8BIRzAAJ6hFsAAnpAuwABi0sAAnDHAAJ1XgxcBAAGFwACeqsBOqmgAwAD8QQDAAPw+g/gBAAE0wACexgPAAJ7GwACgKQAAAAEBAcAAntQAAACWIGC8twAAYMAA/NkBPgROwACe/cAAnwQAAMAATyhgwACckgEcwACfIRbAAJ8bgMAAnxLATqbZhWfAAHKOwABO0gEAAYXAAJ85wE6qywDAAKD1PRzAAJ9ShsAAn0vATqriwABipgIAAhbAAJ9dLrmowACdNBbAAJ9lLsAAYsjAAJwxwACdMwDAAJyhPRzAAJ98hsAAn3XATqriuUMBAAEuAMAAnE49HMAAn5+AwACflsBOptnAAE8rBwAFLoXAAJ/NwE6qyxbAAJ/WLlvAAJ03FsAAn+EupN7AAJ01hMAAn+vATqdnAoRZKcAATywpwAByqADAAPxCP07AAKCuAAAAgXZgvcsAScAAoLoWwACgvi7AAGLRwACcMcAAnVY+AT2NwACg3sBOq8sWwACg+4LAAKDnwE6nF55ivdg+AT2NwAChG8BOq8scwAChPhbAAKEtgMAAoSTATqbZhWfAAHKOwABi3AEAARzAAKFdFsAAoUwuwABi0sAAnDHAAJ1XgKsBAWC9ywE0wAChYQPAAKFhwACokgAAAAEBAcAAoW8AAACWIGC8twAAYL3LAT4BScAAoYIcwAChj4DAAKGGwE6m2baPAgACFsAAoaYupN7AAJ01hMAAobDATqdnAMAAcq8+AUrAAKHHARzAAKHigsAAoc7ATqcXtSYBAAEWwACiAxbAAKH6LoV5wACdWIKQwACcPAC+KEnAAKIZHMAAoiaAwACiHcBOptm2kAIAAhbAAKI6LqTewACdNYTAAKJEwE6nZwDAAHKwPgRJwACiWxzAAKJzgsAAol/ATqcXtS0BAAGEwACigMBOp2cAvjE+A07AAKKnwACiqwAAhXBgvcsBFsAAosUcwACiwRbAAKK3FsAAoq0uW8AAnTeFjcAAn+1LAQABkwDAAPyDgpDAAJw8TsAAouXAAKLrAACAlmDAAGC7ARzAAKMBgsAAou3ATqcXtToBAAGHwACjE8BOrUIAvjtJwACjJSXAAKMvFMAAoynATq2DCABgwABhcT4CTsAAo17AAKNiAACD0WDAAP22ARbAAKNqFMAAo2TATq2DCAFgwABhcZ1vwABhc0nAAKOFHMAAo52CwACjicBOpxe1MAIAAoTAAKOzwE6nZxTAAKO9wE6t0QkAAL4zPgJJwACj1WrAAKPfYMAA+goAPgE9HsAAo/zAAPWzAQABJAAFJ8AAYt0UwACkGsBOrdEJACfAAGLeHMAApFSCwACkQMBOpxe1MQIAAoTAAKRtwE6nZxTAAKR3wE6t0QkAAL40J4FqAD9KwACkowEcwACkvoLAAKSqwE6nF7UxAgAChMAApOzATqdnFMAApPbATq3RCQAAvjQ+AknAAKWlasAApa9gwAD6CgA+AT0ewAClzMAA9bMBAAEkwACl/QMnwABi3RTAAKXqwE6t0QkAJ8AAYt8AP0rAAKYiARbAAKZBFsAApjgWwACmMoDAAKYpwE6m2YVnwAByjoVqwACg0YKQwACcPD8/QBzAAKaWgsAApoLATqcXq1YBAAGEwACmnMBOp2cAvi3AAKaCwACmpQBJwACmsmrAAKa8YMAA+goAPgE9HsAAptPAAPWzAQABJAAFJ8AAYuAWwACm6i6k3sAAnTUnwABi3hzAAKcjgsAApw/ATqcXtSwBAAGEwACnM8BOp2cAvjAngWoAP0rAAKdYARzAAKdzgsAAp1/ATqcXtSwBAAGEwACng8BOp2cAvjA+A07AAKe5wACnvgAAgVRgwACcNgEcwACnzi7AAGLVAwADFsAAp+gupN7AAJ01hMAAp/LATqdngMAAp/zATqbZAMAAnV5JwACoESEcwACoGofAAKgVwE6v4kgBAAErAMAA/SlKwACoIwEWwACoL4fAAKgqwE6v4oKQwACcPD9KwACoPwEWwACoexzAAKhPgMAAqEbATqbZtpECAAKGwACoaMBOrGwWwACocS6k3sAAnTUAwAByq4KQwACcPADAAPw9AMAAoQlJwACooCIWwACopC7AAE8qwACdWQAWwACo5xzAAKjRgsAAqL3ATqcXrGkBAAEWwACo4RbAAKjYLoV5wACdWIKQwACcPAC+BLJgvbo+AT2NwACpXsBOq8scwACpe4LAAKlnwE6nF7T8AQABhcAAqYfATqvLAL37P0rAAKmaAYXAAKmhwE6rywbAAJ1ggajAAKmwwACpwcAArUQAAMAAT14BasAAqbFgwAD9HAIAAAEDwACpx8AArUQAAAACAQHAAKnXAAAAqj5gwAByhAABwACp5wAAAMAAT19gwAD6CgFqwACp+WDAAPoKdVwBPgJJwACqBiEWwACqCy7AAE+GwACcPj4FPRzAAKowgMAAqifATrFiwABPLQUABRbAAKpHLrmowACdNBbAAKpPLsAAYtDAAJwxwACdVSbAAKpaARbAAKpaLsAAYsjAAJwxwACdM2CCSxbAAKphLqTewACdNRbAAKprLqvFwACdNgDAAHKpTsAAqo/AAKqaAADAAGLbXcAA/DIBYLy3ARbAAKqcLsAAYtLAAJwxwACdVz0XwACqtC7AAGLRwACcMRzAAKrsFsAAquCAwACq18BOsWKkzMAAcom1/gIAAhbAAKsALqTewACdNRbAAKsKLqvFwACdNgDAAE0ywACdVj0XwACrFy7AAGLSwACcMRzAAKs/FsAAqzOAwACrKsBOsWKkzMAAcom0HwIAAhbAAKtNLqTewACdNRbAAKtXLqvFwACdNgDAAE00wACdV0bAAKtkwACrk8AAq3YAAACWIGC8twAWwACrgS7AAGLSwACcMcAAnVc+AUnAAKudIRzAAKutgsAAq6LATrIVgxcBAAGDwACrtsBOsuQAwAD8QT4DTsAAq+LAAKvpAADAAE8oYMAAnJIBHMAArAgWwACsAoDAAKv5wE6xYoVnwAByjsAATtIBAAGDwACsIMBOsuQAwACg9T0cwACsO4TAAKw0wE6zL8AAYqUCAAIWwACsQy65qMAAnTQWwACsSy7AAGLIwACcMcAAnTMAwACcoD0cwACsZoDAAKxdwE6xYsAATysHAAUug8AArJbATrLkFsAArJ8uW8AAnTcWwACsqi6k3sAAnTUWwACstC6rxcAAnTYChFkqwABPLCnAAHKoPz89HcAArQzAAE9eAgABgMAArRPATrFiAcAAT1+BwACtL8BOsXLAAJxVBsAAnWGBqMAArUnAAK1awACu1QAAwABilwFqwACtSmDAAP0cAgAAAQPAAK1ywACu1QAAAAEBAcAArYIAAACqPmDAAHKEAABcAT4DRsAArZLAAK3BwACtpAAAAJYgYLy3ABbAAK2vLsAAYtLAAJwxwACdVz4CTsAArd/AAK3mAADAAE8oYMAAnJIBHMAArgEWwACt+4DAAK3ywE60W4VnwAByjsAATtIBAAGBwACuGcBOtHgAwACg9T0cwACuMILAAK4pwE60mrlDAQABLgDAAJxOScAArkwhHMAArloWwACuUC5bwACdN0gBAAErAMAAn/U+AT0cwACudRbAAK5rLlvAAJ03g/gBAAE0wACufQPAAK59wACunAAAAAEBAcAArn4AAACBVGDAAJw2AABcAUrAAK6HARzAAK6MgcAArofATrVCuUMBAAEuAMAAnE4AwACf9z89HcAArq/AAGKXAQABgMAArsjATrRbAMAAnFoGwACdYoGowACu2sAAru3AAK8rAAAjAWrAAK7bYMAA/RwCAAABA8AArvXAAK8rAAAAAAAAAGDAAP22AUrAAK77ASTAAK8rBifAAGLJFsAArwcuo7PAAJ0+J8AAVt8WwACvHxbAAK8WLoV5wACdWIKQwACcPCeA2RbAAK8mLoKQwACcPAbAAJ1jgajAAK8wwACvPMAAr6UAAIRNAWrAAK8xYMAA/RwCAAABA8AAr0LAAK+lAAAAAQEBwACvWgAAAIcuXcAAnnEBWwAAWwE+AUrAAK9pARzAAK94gMAAr3DATrZMwABi4QEAAS4AwACegQbAAJ1kgajAAK+qwACvu8AAsPoAAMAAT4gBasAAr6tgwAD9HAIAAAEDwACvyMAAsPoAAAABAQHAAK/YAAAAqj5gwAByhAAAYMAA+goBPgFKwACv6AEiIiIWwACv+BbAAK/vLoV5wACdWMAAYozAAJxCABzAALAdFsAAsAwuwABi0sAAnDHAAJ1XljABAAE0wACwIwPAALAjwACwgQAAAAEBAcAAsDEAAACWIGC8twAAYMAA+goBSsAAsEkBFsAAsHkcwACwWBbAALBSgMAAsEnATra6hWfAAHKOwABO0gEAAYHAALBwwE63JQDAAKD1wABijMAAnJ4AwAD8RQAiHMAAsJkWwACwjy5bwACdN0gBAAErAMAAn/UBHMAAsK4WwACwpC5bwACdN5YwAQABNMAAsLQDwACwtMAAsMsAAAABAQHAALC1AAAAgVRgwACcNgAAYMAA+goBSsAAsL4BFsAAsMOBwACwvsBOt8XAAGKMwACcQgDAAJ/4AB3AALDfwABPiAEAAYDAALDtwE62ugDAAJxZAABOlpkATpl/AE6ZygBOmhkATppzAE6bZQBOnI8ATqaiAE6xKwBOtCQATrWUAE62FwBOtoMATrgXAAAADQLAAJ1rgajAALD/wACxBcAAtxMDwABi4gAAAWDAAJ0wAAABBMAAnW2BqMAAsV7AALFlCbQKAGDAAJw2AAEFwACdd4GowACxasAAsWrAALL0AAAAA8AAsYjAALL0AAAACQkJwACxpAAAALB4YL3WAMAAsdUAAACCU2DAAJySAMAAsesAAAAgYMAA/RwAwACyBAAAAKzcYLy3AMAAsh4AAACk3mDAAEtIAMAAsjwAAACrxWC9ywDAALJNAAAEtApgwACcNgDAALJrAAAAW2DAAJ/rAMAAsoEAAADAAE8mYMAA+goAAGDAAJ1rAT8CCAHAAJ1thgDATrkJCQDAALKRwACdQAgACIDAALKXwE64toHAALKswE64w4LAALK1wE640oPAALK7wE644ITAALLGwE647YXAALLQwE64/IfAALLiwE65GBTAALLtwE65JggAAAYGwACdb4GowACy+cAAswrAALOCAADAAE+QAWrAALL6YMAA/RwCAAABA8AAsxTAALOCAAAAAQEBwACzJAAAAKo+YMAAcoQAAFwBPgI9HMAAsz4WwACzNC5bwACdN4P4AQABNMAAs0YDwACzRsAAs2IAAAABAQHAALNHAAAAgVRgwACcNgAAXAFKwACzUAEcwACzVYHAALNQwE66GsAAYpQBAAEuAMAAnEwAwACf9z0cwACzcRbAALNpLrQKwACdbcAAYpQBAAEuAMAAnEwGwACdcIGowACzh8AAs6HAALPbAADAAECZAWrAALOIYMAA/RwCAAABA8AAs6zAALPbAAAAAQEBwACzvAAAAKo+YMAAcoQAAGC9ywFKwACzyQEcwACzyS7AAGKWAQABgMAAs9LATrqoAMAAnFQGwACddYGowACz4MAAtAfAALRgAQDAAE9lAWrAALPhYMAA/RwCAAABA8AAtA/AALRgAAAAAAAA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XsAA0HHAANCQAAAjAWrAANBfYMAA/RwCAAABA8AA0HnAANCQAAAAAAAAAGDAAP22AUrAANB/ASTAANCQAifAAGL9FsAA0IsugpDAAJw8BsAAncOBqMAA0JXAANChwADQ/wAAhE0BasAA0JZgwAD9HAIAAAEDwADQp8AA0P8AAAABAQHAANC/AAAAhy5dwACecQFbAABbAT4BSsAA0M4BHMAA0N2AwADQ1cBO0K/AAGL+AQABLgDAAJ55BsAAncSBqMAA0QTAANEVwADRggAAwABPiAFqwADRBWDAAP0cAgAAAQPAANEiwADRggAAAAEBAcAA0TIAAACqPmDAAHKEAABgwAD6CgE+AUrAANFCASIWwADRVRbAANFJLprRwACdvMAAYozAAJxCAB3AANFnwABPiAEAAYDAANF1wE7RHQDAAJxZBsAAncWBqMAA0YfAANGhwADURwAAwABAmQFqwADRiGDAAP0cAgAAAQPAANGswADURwAAAAEBAcAA0bwAAACqPmDAAHKEAABgvcsBPgROwADR4MAA0fQAALB4YL3WARbAANH/gMAA0fbATtGnsHjAAHKLTsAA0ibAANIrAACrxWC9ywEWwADSLS6CkMAAnDxJwADSNyIiIRzAANJQgcAA0jzATtG+tSEBAAEWwADSXC6CkMAAnDwAviYBIRzAANKfHMAA0oGBwADSbcBO0b61JgEAARbAANKZLoKQwACcPAC+KEgBAAEWwADSrhbAANKiLprRwACdvIKQwACcPADAAP0pASEcwADS6xzAANLSgcAA0r7ATtG+tScBAAEWwADS5S6CkMAAnDwAvilIAQABFsAA0u4uwABi/MAAnb8AwAD88z4BSsAA0wYBHMAA0yGBwADTDcBO0b61IgUABRzAANNVgcAA00HATtG+tTUBAAEWwADTZy7AAE9IwACdvQC+NhzAANOUgcAA04DATtG+tTYBAAEWwADTpi7AAE9IwACdvQC+NxzAANPTgcAA07/ATtG+tTcBAAEWwADT6C7AAE9IwACdvQC+OBbAANQNFsAA1AEumtHAAJ28gpDAAJw8FsAA1B0uwABi/MAAnb8Avic/SsAA1DgBgsAA1D/ATtHjBsAAncaBqMAA1EzAANRmwADUlwAAwABilgFqwADUTWDAAP0cAgAAAQPAANRuwADUlwAAAAEBAcAA1H4AAACq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wADZScBO2pbAAGMFAQABLgDAAJ56BsAAneaBqMAA2XfAANmRwADbwQAAwABAmQFqwADZeGDAAP0cAgAAAQPAANmcwADbwQAAAAEBAcAA2awAAACqPmDAAHKEAABgvcsBPgROwADZ0MAA2eQAALB4YL3WARbAANnvgMAA2ebATtsEsHjAAHKLTsAA2hbAANobAACrxWC9ywEWwADaHS6CkMAAnDxJwADaJyIhHMAA2kCBwADaLMBO2xuiOAEAARbAANpGLoKQwACcPAC+KgEhHMAA2oMcwADaa4HAANpXwE7bG7UpAQABFsAA2n0ugpDAAJw8AL4sSAEAARbAANqSFsAA2oYumtHAAJ3hgpDAAJw8AMAA/Sk+AUrAANqgARzAANq7gcAA2qfATtsbtSgEAAQcwADa6YHAANrVwE7bG7U1AQABFsAA2vsuwABPSMAAneIAvjYcwADbKIHAANsUwE7bG7U2AQABFsAA2zouwABPSMAAneIAvjccwADbZ4HAANtTwE7bG7U3AQABFsAA23wuwABPSMAAneIAvjgWwADboRbAANuVLprRwACd4YKQwACcPAC+Kz9KwADbsgGCwADbucBO20AGwACd54GowADbxsAA2+DAANwRAADAAGKWAWrAANvHYMAA/RwCAAABA8AA2+jAANwRAAAAAQEBwADb+AAAAKo+YMAAcoQAAGC9ywFKwADcBQEWwADcBS7AAE9IwACd4gbAAJ3ogajAANwWwADcJ8AA3JQAAMAAT4gBasAA3BdgwAD9HAIAAAEDwADcNMAA3JQAAAABAQHAANxEAAAAqj5gwAByhAAAYMAA+goBPgFKwADcVAEiFsAA3GcWwADcWy6a0cAAneHAAGKMwACcQgAdwADcecAAT4gBAAGAwADch8BO3RUAwACcWQbAAJ3pgajAANyZwADcqsAA3P8AALNPAWrAANyaYMAA/RwCAAABA8AA3LHAANz/AAAAAAAAAFwBPgM9HcAA3MCzTwAAAADAAJxdPRzAANzbFsAA3M8umtHAAJ3hs08AAAAAwACcXT0XwADc6i7AAGL4wACcMSvAAJ5SAABO2gkATtphAE7azQBO3H8ATtzeAE7daABO3eIAAAAGAsAAneyBqMAA3W7AAN10wADfGAPAAGMGAAABYMAAnaMAAAABBcAAnfGBqMAA3bTAAN20wADeYwAA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AAAApU5gwABBxQFqAGDAAPzZd2DAAEVhAT4EScAAQoQWwABCmBbAAEKQFsAAQoguhCHAAJ6hesAAeq+CtIFWPgFKwABCsgEcwABCuS7AAGNGBAACgMAAQsbATzXugcAAQtDATzX9AoXXHMAAQvKCwABC7cBPNgxIAQABasAAQwVgwAD70AkAwAD886VOg8AAQy7ATzYcwACeuD9JwABDTRzAAENWgcAAQ1HATzX9SAEAASsAwAD9KUrAAENfAYDAAENmwE817j89icAAQ3TATzX9FsAAQ4CBwABDe8BPNf2zwcAAYlFJwABDjyIWwABDmIHAAEOTwE81/bMXwABiVgAhFsAAQ7GBwABDrMBPNf2yJsAAYlI+BU7AAEPTwABD4QAAuVxgwABidgEmwABD0wGBwABD48BPNf1gwABidk7AAEP9wABEBQAAmt5gvcsBHMAARCYWwABEES7AAFM0wACekMAAnqW0+AEAARbAAERKhMAARDzATzc5liDAAGJ4AL33TsAARGfAAER3AADAAFUIYMAARWEBHMAARHkuwABVCQMAA4HAAESlwE81/RbAAESzFsAARKsuhCHAAJ6hpU3AAHrKg8AARMLATzYcAMAAnrQ9HMAAROQWwABE3C6EIcAAnqFWAQABhsAAROjATzekAMAAe1JKwABFAAE1wABFCwAAAQBgwABJdQEfwABFC8AASZAFAAWBwABFPcBPNf2CwABFQ8BPNgyFwABFScBPN2CAwABFUsBPNe6GwABFXMBPN6QANQAAAAEAWwEXwABFd4fAAEV1wE84HqVOg8AARYvATzYcwABFZIcAwE84HknAAEWpFsAARbKBwABFrcBPNf2jk8AAYlk+A07AAEXYwABF4AAAmt5gvcsBFsAAReuAwABF4sBPNe65K8AARaFOwABGD8AARhwAAK2LYMAARWEBHMAARiguwABVBgIAAibAAEZBAYHAAEZBwE81/WDAAGKiFsAARk8WwABGRy6EIcAAnqGlTcAAesoAwACeskrAAEZlATXAAEZwAAABAGDAAEl1AR/AAEZwwABJkAUABYHAAEaiwE81/YLAAEaowE82DITAAEauwE84rYDAAEa3wE817oXAAEbBwE840gA1AAAAAQBbARfAAEbZhsAARtfATzkopU6DwABG7cBPNhzAAEVkhgDATzkoScAARwsiFsAARxSBwABHD8BPNf25V8AAYlgBFsAARyuBwABHJsBPNf25WcAAYls+A07AAEdMwABHWAAAwABjR2DAAEVhARzAAEdkLsAAU4cCAAKBwABHeMBPNf0WwABHhhbAAEd+LoQhwACeoaVNwAB6ygDAAJ61TsAAR+zAAEf4AADAAGNIYL3LARbAAEgDgMAAR/rATzXuuSvAAEWhSsAASBoBNcAASCUAAAEAYMAASXUBH8AASCXAAEmQBQAFgcAASFfATzX9gsAASF3ATzYMhcAASGPATzoUgMAASHDATzXuhMAASHrATznNADUAAAABAFsBF8AASJGGwABIj8BPOkGlToPAAEilwE82HMAARWSGAMBPOkE+AUrAAEjLATXAAEjbAAABAGDAAEVhARzAAEjbgMAASNLATzXuuVYDAAMWwABI5y61ZcAAnpDAAJ6kgcAASPXATzX9gsAASPvATzYMAMAARes1AAAAAQBbARfAAEkLhMAASQnATzq9pU6DwABJH8BPNhzAAEVkhADATzq9BsAAnriBqsAASejAAEn1wABNVAAAwABjRgAAAAEDwABKAcAATVQAAAAEAgLAAEoPAAAAnq1gwABFYQDAAEoiAAAAgpBgwABiTwACwABKNAAAAIXXYMAA+goBagBgwAD82XfAAEpTAAAApU5gwABBxQFqAGDAAPzZd2DAAEVhAT4JScAASm0cwABKdoHAAEpxwE87a0gBAAErAMAA/SlKwABKfwGAwABKhsBPO1w/PYnAAEqUwE87axbAAEqggcAASpvATztrs8HAAGJRScAASrAWwABKuYHAAEq0wE87a4d4wABiVErAAErEAYDAAErLwE87XD9JwABK2RbAAErigcAASt3ATztruVjAAGJVSsAASuoBgMAASvHATztcP0nAAEr/HMAASwiBwABLA8BPO2tIAQABFsAASycWwABLGBbAAEsLLrVlwACekMAAnqSy+8AATReGCrhSAMAA/SlKwABLMwGAwABLOsBPO1w/TsAAS1bAAEtiAADAAGNHYMAARWEBHMAAS2QuwABTfAMAAoHAAEuHwE87axbAAEuVFsAAS40uhCHAAJ6hpU3AAHrKAaVOg8AAS7/ATzuSwACetk7AAEvywABL/gAArN5gvc4BHMAATB0WwABMCC7AAFM0wACekMAAnqW08QEAAYHAAEwywE87awC98k7AAExLwABMWwAAuStgvcsBHMAATHIWwABMXS7AAFM0wACekMAAnqWW/QIAAhbAAEyRgMAATIjATztcuSvAAEWhFsAATK6FwABMosBPPPG0373QAL4iSsAATMIBNcAATMkAAAEAYMAAStsBH8AATMnAAErsBgAGgMAATNvATztchMAATOXATzyfhcAATPLATzzxgcAATP/ATztrgsAATQXATzt7hsAATRLATz0qADUAAAABAFsBF8AATSuHwABNKcBPPYalToPAAE0/wE87ksAARWSHAMBPPYYAAE8XnABPF94ATxgkAE8ZewBPGkMATxvAAE8c9gBPHjEATx/IAE8gwABPIk8ATyKDAE8legBPJ2cATyk8AE8rugBPLc8ATzXCAE87MABPPgIAAAATAsAAnruBqsAATVnAAE1fwABOGAPAAGNJAAABYMAA/RwAAAIEwACevYGqwABNmcAATaMJgmsAYMAARWEABMAAnr6BqsAATcbAAE3PCcAAWbAAYMAAhWkAAQXAAJ7AgarAAE3TwABN08AAThYAAAADwABN9cAAThYAAAACAgLAAE37AAAEgmtgwABFYQDAAE4MAAAEwABZsGDAAIVpAABgwACeuwE/AwgBwACevYAAwE8+1AgBwACevoEAwE8+4wkBwABN08AA/TIAAAAAAAAATz8kAAAAAAAAAYGqAE8/LwBPFY0ATxcfAE8+VwBPPy0AAAADAE8/LwAAAAAAAADAAJ7BAIGrAAAbgNoAAIIuggYAgQMAAMAAhN4AAIEdAACkMAAAgTYAALfQAACBVQAAwABozrDLAIGUAADAAGCIAACBtwAAvJAAAIHbAADAAIVQAACB/AAAwABiSgAAgh0AAL2wAACCTgAAwABBDAAAgm8AAMAAjo4AAIKOAADAAJ6JAACCuAAAwACb/QAAgtIAAMAAbaMAAIL+AADAAHHPAACDJQAAwABq5QABAQHAAEvxg1gAAMAAftsAAIN8AADAAGaIAACDngAAgPsAAIO4AADAAEs2AACD3AAAwAB3xAAAhAQAAIHgAACEIAAAwABygAAAhD8AAMAAn8AAAIRdAADAAJwxAACEfQAAwACglQAAAAAABALAAJ7CgauFoYWnwAEKjQPAAGNKAAABXZnOAWDAAJw2AAAWBMAAnsWBq4X8hgQJsa3AAJ7BAGCBFAAEwACexoGr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AJw2ATTAARI2A8ABEjbAARJNAAAAAQEBwAESNwAAAINNYIluAABgwACcNgFKwAESPQEcwAESPS6GAQEAAYHAARJLwFAMrACZmwDAAPw9AYQdKcAAnxUGwACfbYGrwAESb8ABEovAARREAACGvQFqwAEScGDAAP0cAgAAAQPAARKgwAEURAAAAAEBAcABErUAAACD7mCJ/QAAYMAAnDYBPgI9HMABEtIWwAESxoDAARLBwFANH4XNigGD+AEAATTAARLaA8ABEtrAAROUAAAAAgICwAES6AAAAIReYIJ7AMABEv8AAACAlmCJbgAAYMAA/NkBPgE9HMABEyAWwAETFhbAARMOLoQhwACfYMAAY0vAAJ7BwACex8AATyICAAIcwAETURbAARNFFsABEz0uhCHAAJ9gt1TAAJ7BwACe4MAATMcBAAEWwAETZIHAARNawFANZoRugoUAwABx5RzAARN4LoYBAQABgsABE4bAUA1zAJmbAMAAcqIAwAD8xErAARObARzAAROxFsABE6oWwAEToi6EIcAAn2DAAFD1wACewcAAnsjAAGOUAQABHMABE/8WwAET4hbAARPVFsABE8QuhCHAAJ9gtWXAAJ7BwACexrB4wAB/GrT0AQABHMABFCYWwAEUGhbAARQSLoQhwACfYLdUwACewcAAnuCcEgEAARbAARQ0gMABFC/AUA0fhOKKBQDAAHHmAL3zAMAAoPcGwACfboGrwAEUScABFGXAARUdAACGwwFqwAEUSmDAAP0cAgAAAQPAARSGwAEVHQAAAAEBAcABFK4AAACD7mCKEAAAYMAAnDYBPgFKwAEUugEcwAEUyRbAARTBLoQhwACfYMAAY24BAAEcwAEU9S6GAQEAARbAARUIgMABFQPAUA7qhsKKEgCZmwDAAJ8EBsAAn2+Bq8ABFSLAARU+wAEVuQAAhsoBasABFSNgwAD9HAIAAAEDwAEVUsABFbkAAAABAQHAARVmAAAAg+5gih8AAGDAAJw2AT4BSsABFXIBHMABFYEWwAEVeS6EIcAAn2DAAGOzAgACgMABFaDAUA94FsABFauAwAEVpsBQD3iEkIojAMAAnzoGwACfcIGrwAEVvsABFdrAARZHAACGzQFqwAEVv2DAAP0cAgAAAQPAARXywAEWRwAAAAEBAcABFgoAAACD7mCKLwAAYMAAnDYBPgFK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XMAA+2IBAAEkwABCjwInwABnHYHAAEKKwFK4XgAGwACkpoFawABCyMAAQs3AAELrAAKuzwAAAAEDwABC3MAAQusAAAABAQHAAELmAAAAhDtgwABc2wAAXAAAAFK3dABSt50AUrfRAFK3+gBSuCMAUro9AFK6eQAAAAYCwACkq4FawABC8MAAQv/AAEUEB8AAZx4AAAFgwAD9HAABYMAApJ8DBMAApK2BWsAAQzrAAEM+CYPuAGCDWQAEwACkroFawABDZsAAQ3AJwABL/gFqwABDRGDAAP0cAmDAAHI3AATAAKSvgVrAAEOXwABDognAAFYdAWrAAEN2YMAA/RwCYMAAnCMAAQXAAKSzgVrAAEOnwABDp8AAQ+QAAAADwABDtsAAQ+QAAAADAwPAAEO8AAAEg+5gg1kAwABDxwAABMAAS/5gwAByNwDAAEPYAAAEwABWHWDAAJwjAABgwACkqwE/BAgBwACkrYAAwFK7SwgBwACkroEAwFK7WAgBwACkr4IAwFK7aQkBwABDp8AA/TIAAAAAAQbAAKSxgVrAAEPpwABEA8AARQIAALeaAWrAAEPqYMAA/RwCAAABA8AARBTAAEUCAAAAAQEBwABEJAAAALNUYMAAcdUAAGDAAGJ2AT4ETsAAREPAAERKAACCZmC8twEcwABEV4DAAERMwFK765wLAQABFsAARGEug+7AAKStAMAAceJOwABEeMAARHwAAJnCYLylARbAAESFgcAARH7AUrwEhPm8xUnAAESZIRzAAEShgsAARJ3AUrw5SAEAASsAwAD9KT4BSsAARLIBHMAARNcWwABExIDAAES5wFK766TlwABx2bK6AQABgsAAROPAUrw5ALrwP0rAAETzASsAAFK7tgBSvLMAAAABAsAApLSBWsAARQfAAEUWwABGkwfAAGcfAAABYMAA/RwAAWDAAKSfAAEFwACkugAAAAAEAAADAAAAAAAAAAAAYMAApLQBPwEJAQDAAP0yAAAAAAMGwACktoFawABFPsAARUvAAEV1AAKyvgAAAAEDwABFWsAARXUAAAABAQHAAEVqAAAAs1RgwACjvwAAYMAAYuIABsAApLeBWsAARXrAAEWRwABFxAACsr8AAAABA8AARanAAEXEAAAAAQEBwABFuQAAALNUYMAAo78AAF3AAPx0AWDAAGKiAAbAAKS4gVrAAEXJwABFzsAARpEAArLYAAAAAQPAAEXewABGkQAAAAQDA8AARfUAAACzVGDAAHHVAMAARhoAAAC0W2C88wDAAEY5AAAAgaZhA2DAAGJPYMAA/bZgwABgu1wAAcAARoAAAACGSGDAAPoKAWrAAEaKYMAA+goAXAAAAFK9EwBSvVMAUr2ZAFK+GAAAAAMCwACku4FawABGlsAARqXAAEpsB8AAZyAAAAFgwAD9HAABYMAApLQBBMAApL6BWsAARxvAAEcpGKlqwACj2gBdwAD8dAFgwABiogErAQXAAKTEAAAAAAQAAAMAAAAAAAAAAABgwACkuwE/AQkBAMAA/TIAAAAAAgbAAKTAgVrAAEbgwABG9MAARwABAsAAQAwAAAABA8AARwDAAEcAAAAAAAAAAGCEfgAGwACkwoFawABHLsAAR1HAAEpqAACyvwFqwABHL2DAAP0cAgAAAQPAAEdpwABKagAAAAEBAcAAR5AAAAizVGDAAH2RAABdwAD8dAFgwABiogE+AknAAEeiHMAAR7UWwABHpi6pasAAo9rAAKS+SAEAASsAwAD9KT4BScAAR8YWwABH5hbAAEfXFsAAR8ouwABADMAApMCEuISDgVXAAPxWPgE9F8AAR/kuqWrAAKPaasAASApdwAD8dAFgwABiosABTY/AAKS+PgJOwABIScAASFAAAIRSYIJSARbAAEhfFsAASFIuwABADMAApMCEUoJYScAASG8iJcAASHqBwABIc8BSv59gg6QBIiXAAEijgcAASJzAUr+fYIPlABzAAEjSFsAASM0UwABIxsBSv58BAWCD5YJng+hIAQABasAASOZghCKBzwDAAP0pPgE9F8AASPwuqWrAAKPaasAASQ1dwAD8dAFgwABiosABTY/AAKS+PgE9F8AASUQuqWrAAKPaHMAASiscwABJgBbAAEliFsAASVUuwABADMAApMCEuISDgKsBAWDAAGKiATTAAEmWA8AASZbAAEopAAAAAQEBwABJqAAAAJ6yYIlKAABgwABiogE+AUrAAEnFASbAAEnFARzAAEnogMAASczAUr8KwABL8AEAAR/AAEn4iUkBAAGCwABKDcBSwJUAAMAAffRgwABiogDAAPw9gK0AAAAAwAD8SMAApL4/SsAASlEBFsAASlguqWrAAKPawACkvgAAUr6kAFK+1QBSwRQAAAACAsAApMWBWsAASm/AAEp+wABOqQfAAGchAAABYMAA/RwAAWDAAKS0AAEFwACkywAAAAAEAAADAAAAAAAAAAAAYMAApMUBPwEJAQDAAP0yAAAAAAIGwACkx4FawABKvMAAStDAAErcAQLAAEAMAAAAAQPAAErcwABK3AAAAAAAAABghH4ABsAApMmBWsAASuHAAErywABOpwAAstgBasAASuJgwAD9HAIAAAEDwABLAsAATqcAAAAEAwPAAEsZAAAAs1RgwABx1QDAAEs+AAAAtFtgvPMAwABLXQAAAIGmYQNgwABiT2DAAP22YMAAYLtcAAHAAEukAAAAhkhgwAD6CgFqwABLrmDAAPoKAFwBPgJPwABLvMAAS8EAAAHAAE4xXgABAgFgiE4BoR5gwAD6CgBcAAPAAEvQwABNhwAAAAIBAcAAS+gAAACD7mCITgABwABL9AAAAKEeYMAA+goBasAATABgwAD6CnVcAT4FTsAATBjAAEwdAACCkGDAAGJPARzAAEwqgMAATB/AUsHewABL8AEAARbAAEw7hcAATDbAUsJngpCIVADAAHHbTsAATE/AAExUAACAvWDAAP22ARbAAExbhcAATFbAUsJngL2IUk7AAEx1AAAAgyVgwABguwBJwABMiYbAAEyNwFLCdT4BScAATKMhHMAATLgWwABMrIXAAEynwFLCZ4UBiFZIAQABKwDAAP0pPgE9FcAATM3AUsL4CRzAAEzngMAATNzAUsHewABMyAEAARbAAEz9hcAATPjAUsJnhQGIVgDAAHHuPgE9FcAATSbAUsL4CR/AAE05wABhDQAAAAA/PRzAAE1ngsAATWbAUsH6IAMAA4fAAE1owFLClBTAAE1uwFLC0wgAFMAATXTAUsL4CQAAAD0ewABNjsAAcdMEAAMWwABNtC7AAEAMwACkx4HAAE3CwFLB7TTAAE3eA8AATd7AAE6FAAAAAwEBwABN9gAAAIDtYIhOAALAAE4YAAAAwABIImDAAPoKAWoAYMAA/Nl3wABOBwAAAKEeYMAA+goBagBgwAD82XdgwAD82QE+AUnAAE4rIYbAAE4wwFLEDD4BPRzAAE5ThMAATkTAUsI6IAIAAYXAAE5UwFLD/gGhHofAAE5rwFLEJQA/AcAATxCDwABOmsBSwhcAAFLBeABSwakAUsSNAAAAAgLAAKTMgVrAAE6swABOssAAVfM3wABnIgAAAWDAAKSrAAFgwACkuwEEwACkz4FawABHG8AARykYqWrAAKPaAF3AAPx0AWDAAGKiASsBBcAApNUAAAAABAAAAwAAAAAAAwMDAAAAAIPuWwAAAAAAwABL/lsAAAAAAMAAVh1bAABgwACkzAE/AQkAAMAApLMDAAOAAMBSxQCBAMBSxQiCAMBSxRIAAgbAAKTRgVrAAEbgwABG9MAARwABAsAAQAwAAAABA8AARwDAAEcAAAAAAAAAAGCEfgAGwACk04FawABHLsAAR1HAAEpqAACyvwFqwABHL2DAAP0cAgAAAQPAAEdpwABKagAAAAEBAcAAR5AAAAizVGDAAH2RAABdwAD8dAFgwABiogE+AknAAEeiHMAAR7UWwABHpi6pasAAo9rAAKS+SAEAASsAwAD9KT4BScAAR8YWwABH5hbAAEfXFsAAR8ouwABADMAApMCEuISDgVXAAPxWPgE9F8AAR/kuqWrAAKPaasAASApdwAD8dAFgwABiosABTY/AAKS+PgJOwABIScAASFAAAIRSYIJSARbAAEhfFsAASFIuwABADMAApMCEUoJYScAASG8iJcAASHqBwABIc8BSxj5gg6QBIiXAAEijgcAASJzAUsY+YIPlABzAAEjSFsAASM0UwABIxsBSxj4BAWCD5YJng+hIAQABasAASOZghCKBzwDAAP0pPgE9F8AASPwuqWrAAKPaasAASQ1dwAD8dAFgwABiosABTY/AAKS+PgE9F8AASUQuqWrAAKPaHMAASiscwABJgBbAAEliFsAASVUuwABADMAApMCEuISDgKsBAWDAAGKiATTAAEmWA8AASZbAAEopAAAAAQEBwABJqAAAAJ6yYIlKAABgwABiogE+AUrAAEnFASbAAEnFARzAAEnogMAASczAUsWpwABL8AEAAR/AAEn4iUkBAAGCwABKDcBSxzQAAMAAffRgwABiogDAAPw9gK0AAAAAwAD8SMAApL4/SsAASlEBFsAASlguqWrAAKPawACkvgAAUsVDAFLFdABSx7MAAAACAsAApNaBWsAATqzAAE6ywABV8zfAAGcjAAABYMAApMwAAWDAAKTFAAEFwACk3QAAAAAEAAADAAAAAAADAwMAAAAAg+5bAAAAAADAAEv+WwAAAAAAwABWHVsAAGDAAKTWAT8BCQAAwACk1QMAA4AAwFLIAoEAwFLICoIAwFLIFAADBsAApNiBWsAATrLAAE6yAAASsr8AAMAApLcBAwAAAAAAAQEBAAAACLNUYMAAo78AAF3AAPx0AWDAAGKiAAbAAKTbgVrAAEq8wABK0MAAStwBAsAAQAwAAAABA8AAStzAAErcAAAAAAAAAGCEfgAGwACk2YFawABK4cAASvLAAE6nAACy2AFqwABK4mDAAP0cAgAAAQPAAEsCwABOpwAAAAQDA8AASxkAAACzVGDAAHHVAMAASz4AAAC0W2C88wDAAEtdAAAAgaZhA2DAAGJPYMAA/bZgwABgu1wAAcAAS6QAAACGSGDAAPoKAWrAAEuuYMAA+goAXAE+Ak/AAEu8wABLwQAAAcAATjFeAAECAWCITgGhHmDAAPoKAFwAA8AAS9DAAE2HAAAAAgEBwABL6AAAAIPuYIhOAAHAAEv0AAAAoR5gwAD6CgFqwABMAGDAAPoKdVwBPgVOwABMGMAATB0AAIKQYMAAYk8BHMAATCqAwABMH8BSyOjAAEvwAQABFsAATDuFwABMNsBSyXGCkIhUAMAAcdtOwABMT8AATFQAAIC9YMAA/bYBFsAATFuFwABMVsBSyXGAvYhSTsAATHUAAACDJWDAAGC7AEnAAEyJhsAATI3AUsl/PgFJwABMoyEcwABMuBbAAEyshcAATKfAUslxhQGIVkgBAAErAMAA/Sk+AT0VwABMzcBSygIJHMAATOeAwABM3MBSyOjAAEzIAQABFsAATP2FwABM+MBSyXGFAYhWAMAAce4+AT0VwABNJsBSygIJH8AATTnAAGENAAAAAD89HMAATWeCwABNZsBSyQQgAwADh8AATWjAUsmeFMAATW7AUsndCAAUwABNdMBSygIJAAAAPR7AAE2OwABx0wQAAxbAAE20LsAAQAzAAKTHgcAATcLAUsj3NMAATd4DwABN3sAAToUAAAADAQHAAE32AAAAgO1giE4AAsAAThgAAADAAEgiYMAA+goBagBgwAD82XfAAE4HAAAAoR5gwAD6CgFqAGDAAPzZd2DAAPzZAT4BScAATishhsAATjDAUssWPgE9HMAATlOEwABORMBSyUQgAgABhcAATlTAUssIAaEeh8AATmvAUssvAD8BwABPEIPAAE6awFLJIQAAUshFAFLIggBSyLMAUsuXAAAAAwLAAKTegVrAAE6swABOssAAVfMDwABnJAAAAWDAAKTWAAFgwACktAMEwACk4IFawABPwcAAT9YGg+cAYMAA/bYBasAAT8dgwAD9tsABZDUEwACk4YFawABP/cAAUAkJwABADAFqwABP3GDAAP0cAmCEfgAEwACk44FawABQGsAAUB8YkibAAKPaAGDAAGLiASsBBcAApO2BWsAAUCTAAFAkwABQxAAAAAPAAFA0wABQxAAAAAQEBMAAUD8AAACD7mCDWQDAAFBKAAAEwABADGCEfgDAAFBvAAAAwABL/mDAAHI3AMAAUIsAAADAAFYdYMAAnCMAAGDAAKTeAT8CCAHAAKThgQDAUsxwCQDAAFCgwACk3QMAA4DAAFCmwFLMY4LAAFCswFLMf4PAAFC4wFLMkAAFBsAApOWBWsAAUMnAAFDRwABTmQQBrs4AAAABA8AAUPTAAFOZAAAAAQEBwABRAAAAAINEYMAAXSoAAGDAAKTeAT4IPRzAAFEVgMAAUQ7AUs0KgpQBAAFqwABRG2DAAP22wAFkNQDAAF0sTsAAUS/AAFE0AACD7mCDWQEcwABRPYDAAFE2wFLNCsAAQ9QAAAAAwABdRE7AAFFjAAAAwABADGCEfgBJwABRdSXAAFF+gcAAUXnAUs1KYIPlPgE9isAAUZfAUs11FsAAUasUwABRpsBSzUoBAWCD5YJqg+pJwABRwCXAAFHJgcAAUcTAUs1KYIOkPgE9isAAUeTAUs11FsAAUfgUwABR88BSzUoBAWCDpIJqg6g+AT0wwABSFR/AAFIfwAD7YgEAASTAAFJwBSfAAGcmgcAAUlTAUs1KJ4NJFsAAUmGBwABSXMBSzUqFgMAA/TAnmDgATsAAUo7AAFKZAADAAEv+YMAAcjcBHsAAUqfAAHI9AQABgMAAUsvAUs0KAE7AAFLowABS9AAAwABWHWDAAJwjAR7AAFMCwACcKgIAAoDAAFMlwFLNCoHAAFMtwFLNSgA9HMAAUz+AwABTOMBSzQqCjAEAAWrAAFNDYMAA/bbAAWQ1AMAAXS1KwABTTQEfwABTWMAApO0EAASBwABTacBSzUqCwABTb8BSzXWDwABTfcBSzjqEwABTicBSzmUABsAApOeBWsAAU57AAFOvwABUmwAArs8BasAAU59gwAD9HAIAAAEDwABTvsAAVJsAAAABAQHAAFPIAAAAhDtgwABc2wAAXAE+Bj0cwABT2YDAAFPUwFLPK692AQABasAAU/NgwACkjcABY3sAwABc7D0cwABUB4DAAFQCwFLPK4KUAQABasAAVA1gwAD9tsABZDUAwABc4D0cwABUHIDAAFQXwFLPK8AAQ7IBAAEWwABULC6D7sAApK0AwABc8T0cwABUQhbAAFQ3LsAAS/7AAKSurs8BAAGAwABUUsBSzysAwAByPz0cwABUaRbAAFRdLsAAVh3AAKSvrs8CAAKAwABUecBSzysWwABUfy6D7sAApK0AwACcLD0cwABUj4DAAFSKwFLPK4KMAQABasAAVJNgwAD9tsABZDUAwABc4QbAAKTogVrAAFSgwABUucAAVTcAALK+AWrAAFShYMAA/RwCAAABA8AAVMjAAFU3AAAAAQEBwABU6AAACLNUYMAAfZEAAGDAAGLiAT4BSsAAVPoBNQAAAAEAYMAAYuIBFsAAVQEukibAAKPawACk4yMcwABVB4EAwFLQiUgBAAErAMAAYvcXwABVAS6SJsAAo9ocwABVFoDAAFULwFLQarK+AQABFsAAVSYuwABADMAApOEAwAB9+MAApOOBAMBS0IkBYMAAYuIGwACk64FawABVPMAAVWTAAFXxAQDAAFYjAWrAAFU9YMAA/RwCAAABA8AAVXzAAFXxAAAAAAAAAGDAAJ6RAT4CScAAVYIWwABVixbAAFWGLoPuwACkrYT8g2hKwABVnQFqwABVvGDAAJ6RwAFNuT9KwABVygFqwABV6WDAAJ6RwAFNoAbAAKTpgVrAAE6ywABOsgAAErK/AADAAKS3AQMAAAAAAAEBAQAAAAizVGDAAKO/AABdwAD8dAFgwABiogAAAFLM4ABSzvYAUtA1AFLQ/ABS0X8AUtG8AAAABQLAAKTugVrAAFX2wABV/MAAX0gDwABnJwAAAWDAAP0cAAFgwACktAUEwACk8IFawABWrsAAVs0Gg+cAYMAA/bYBasAAVrRgwAD9tsABZDoEwACk8YFawABW9cAAVv8JwABL/gFqwABW02DAAP0cAmDAAHI3AATAAKTygVrAAFcXwABXJQnAAFYcAGDAAGJ2AATAAKTzgVrAAFdTwABXagnAAFYjAWrAAFcqYMAA/RwCYMAAnpEABMAApPSBWsAAV4vAAFeZCYS4AF3AAPx0AWCJSgABBcAApQCBWsAAV57AAFeewABYEgAAAAPAAFezwABYEgAAAAQEBMAAV7kAAATAAEv+YMAAcjcAwABXygAABMAAVhxgwABidgDAAFflAAAEhLhdwAD8dAFgiUoAwABX+gAABMAAViNgwACekQAAYMAApO4BPwUIAcAApPGAAMBS0tIIAcAApPKBAMBS0uMIAcAApPSCAMBS0vQIAcAApPODAMBS0wcJAcAAV57AAP0yAAAAAAcGwACk9oFawABYF8AAWB/AAFpfBAGuzgAAAAEDwABYR8AAWl8AAAABAQHAAFhTAAAAg0RgwABdKgAAYMAApO4BPgc9HMAAWGiAwABYYcBS04qClAEAAWrAAFhuYMAA/bbAAWQ6AMAAXSxOwABYicAAWJQAAMAAS/5gwAByNwEewABYosAAcj0BAAGAwABYxsBS04oATsAAWOHAAFjwAADAAFYcYMAAYnYBJsAAWOEBHMAAWPmAwABY8sBS04qHAgEAAAGXqynAAF1UYMAAYnZOwABZM8AAWUIAAIS4XcAA/HQBYIlKARzAAFlLgMAAWUTAUtOKwABD3wAAAADAAF1TTsAAWYHAAFmZAADAAFYjYMAAnpEBHMAAWaqAwABZo8BS04qvcgEBYMAAnpEBasAAWctdwAD8dAFgwACekcABTf8AwABdPz0cwABZ34DAAFnYwFLTioKMAQABasAAWeNgwAD9tsABZDoAwABdLUrAAFntAR/AAFn4wAClAAQABIHAAFoXwFLTyoLAAFojwFLT9YPAAFozwFLUMITAAFpDwFLUYQAGwACk+IFawABaZMAAWnXAAFutAACuzwFqwABaZWDAAP0cAgAAAQPAAFqEwABbrQAAAAEBAcAAWo4AAACEO2DAAFzbAABcAT4HPRzAAFqfgMAAWprAUtU5r3YBAAFqwABauWDAAKSNwAFj3wDAAFzsPRzAAFrOgMAAWsnAUtU5gpQBAAFqwABa1GDAAP22wAFkOgDAAFzgPRzAAFrpFsAAWt4uwABL/sAApPGuzwEAAYDAAFr5wFLVOQDAAHI/PRzAAFsJgMAAWwTAUtU5hvICAAEWwABbFy7AAFYcwACk8gGXqynAAF0BPRzAAFtCgMAAWz3AUtU5wABDvQEAARbAAFtaLoS4wACk9ADAAF0APRzAAFt0gMAAW2/AUtU5r3YBAAEWwABbfi7AAFYjwACk8wDAAFzsPRzAAFuhgMAAW5zAUtU5gowBAAFqwABbpWDAAP22wAFkOgDAAFzhBsAApP6BWsAAW7LAAFvSwABb+AEAwABWHQFqwABbs2DAAP0cAgAAAQPAAFvewABb+AAAAAAAAABgwACcIwFKwABb4QFqwABb52DAAJwjwAFOqgbAAKT5gVrAAFv9wABcFsAAXJ4AALK+AWrAAFv+YMAA/RwCAAABA8AAXCXAAFyeAAAAAQEBwABcRQAACLNUYMAAfZEAAGDAAGLiAT4BPTDAAFxXH8AAXGHAAPtiAQABJ8AAZykABsAApPqBWsAAXKPAAFzGwABduQAAsr8BasAAXKRgwAD9HAIAAAEDwABc3sAAXbkAAAABAQHAAFzuAAAAs1RgwACjvwAAXcAA/HQBYMAAYqIBPgFKwABdAAEcwABdrRzAAF0fFsAAXQcuhLjAAKT0gKsBAWDAAGKiATTAAF01A8AAXTXAAF2rAAAAAQEBwABdRwAAAJ6yYIlKAABgwABiogE+AUrAAF1eASbAAF1eARzAAF1wgMAAXWXAUtdNwABL8AEAAR/AAF2AiUkBAAGBwABdlcBS16UAAMAAo8FgwABiogDAAPw9gK0AAAAAwAD8SAbAAKT7gVrAAF2+wABdz8AAXtsAALLYAWrAAF2/YMAA/RwCAAABA8AAXd/AAF7bAAAABAMDwABd9gAAALNUYMAAcdUAwABeGwAAALRbYLzzAMAAXjoAAACBpmEDYMAAYk9gwAD9tmDAAGC7XAABwABegQAAAIZIYMAA+goBasAAXotgwAD6CgBcAT4BPTDAAF6ZH8AAXqPAAPtpAQABJ8AAZyoABsAApPyBWsAAXuDAAF76wABfRgAAt5oBasAAXuFgwAD9HAIAAAEDwABfC8AAX0YAAAABAQHAAF8bAAAAs1RgwABx1QAAYMAAYnYBPgFKwABfLQEWwABfNC7AAFYcwACk8gAAUtNgAFLVBABS1mEAUtazAFLXGABS2AkAUtitAFLZDgAAAAcCwAClAYFawABfS8AAX1rAAGMuB8AAZysAAAFgwAD9HAABYMAApLQBBMAApQOBWsAAX5/AAF+nCcAAZywAYMAApLQAAQXAAKUMgVrAAF+swABfrMAAX9AAAAADwABfwcAAX9AAAAABAQHAAF/HAAAEwABnLGDAAKS0AABgwAClAQE/AggBwAClA4AAwFLZnAkBwABfrMAA/TIAAAAABQbAAKUFgVrAAF/VwABf7sAAYF4AALK+AWrAAF/WYMAA/RwCAAABA8AAX/3AAGBeAAAAAQEBwABgHQAACLNUYMAAfZEAAGDAAGLiAT4BSsAAYC8BHMAAYD8WwABgNi7AAGcswAClA7K+AQABgMAAYE/AUtoGAMAApLYGwAClBoFawABgY8AAYIbAAGD4AACyvwFqwABgZGDAAP0cAgAAAQPAAGCewABg+AAAAAEBAcAAYK4AAACzVGDAAKO/AABdwAD8dAFgwABiogE+AUrAAGDAARzAAGDQFsAAYMcuwABnLMAApQOyvwEAAYDAAGDpwFLafwDAAKS3BsAApQeBWsAAYP3AAGEOwABiOwAAstgBasAAYP5gwAD9HAIAAAEDwABhHsAAYjsAAAAEAwPAAGE1AAAAs1RgwABx1QDAAGFaAAAAtFtgvPMAwABheQAAAIGmYQNgwABiT2DAAP22YMAAYLtcAAHAAGHAAAAAhkhgwAD6CgFqwABhymDAAPoKAFwBPgFKwABh2AEcwABh6BbAAGHfLsAAZyzAAKUDstgEAAOAwABh+cBS2v6BwABiBcBS2w2CwABiGcBS2xoBhkiDwABiLsBS2zfAAKS4BsAApQiBWsAAYkDAAGJawABivgAAt5oBasAAYkFgwAD9HAIAAAEDwABia8AAYr4AAAABAQHAAGJ7AAAAs1RgwABx1QAAYMAAYnYBPgFKwABijQEcwABinRbAAGKULsAAZyzAAKUDt5oBAAGAwABir8BS29MAwACkpQbAAKUKgVrAAGLDwABi68AAYywBAMAAViMBasAAYsRgwAD9HAIAAAEDwABjA8AAYywAAAAAAAAAYMAAnpEBSsAAYwwBFsAAYxUWwABjDC7AAGcswAClA8AAViPAAKSiAABS2dEAUtpKAFLayQBS254AUtwXAFLcdgAAAAUCwAClDYFawABjMcAAYzfAAGd6A8AAZy0AAAFgwAClAQAAAgTAAKUPgVrAAGP3wABkEgaD5wBgwAD9tgFqwABj/WDAAP22wAFkPwTAAKUQgVrAAGQ6wABkRAnAAEv+AWrAAGQYYMAA/RwCYMAAcjcAAQXAAKUYgVrAAGRJwABkScAAZKIAAAADwABkYsAAZKIAAAACAgLAAGRwAAAAwABnLGDAAKS0AMAAZH8AAATAAEv+YMAAcjcAAGDAAKUNAT8CCAHAAKUQgQDAUt06CQDAAGSTwAClDAEAAYDAAGSZwFLdKQADBsAApRKBWsAAZKfAAGSvwABmTwQBrs4AAAABA8AAZNvAAGZPAAAAAQEBwABk5wAAAINEYMAAXSoAAGDAAKUNAT4FPRzAAGT8gMAAZPXAUt2igpQBAAFqwABlAmDAAP22wAFkPwDAAF0sTsAAZWbAAGVvAADAAGcsYMAApLQBJsAAZWYBHsAAZXXAAKSoAQABgMAAZZTAUt2iAGDAAKS0TsAAZbLAAGW9AADAAEv+YMAAcjcBHsAAZcvAAHI9AQABgMAAZe/AUt2iAD0cwABmA4DAAGX8wFLdooKMAQABasAAZgdgwAD9tsABZD8AwABdLUrAAGYRAR/AAGYcwAClGAIAAoHAAGY2wFLd4oLAAGZAwFLeGAAGwAClFIFawABmVMAAZmXAAGctAACuzwFqwABmVWDAAP0cAgAAAQPAAGZ0wABnLQAAAAEBAcAAZn4AAACEO2DAAFzbAABcAT4FPRzAAGaPgMAAZorAUt7Dr3YBAAFqwABmqWDAAKSNwAFj+QDAAFzsPRzAAGbCgMAAZr3AUt7DgpQBAAFqwABmyGDAAP22wAFkPwDAAFzgPRzAAGbbFsAAZtIuwABnLMAApQOuzwEAAYDAAGbrwFLewwDAAKSmPRzAAGcBFsAAZvYuwABL/sAApRCuzwEAAYDAAGcRwFLewwDAAHI/PRzAAGchgMAAZxzAUt7DgowBAAFqwABnJWDAAP22wAFkPwDAAFzhBsAApRaBWsAAZzLAAGdSwABneAEAwABWHQFqwABnM2DAAP0cAgAAAQPAAGdewABneAAAAAAAAABgwACcIwFKwABnYQFqwABnZ2DAAJwjwAFOqgAAUt14AFLejgBS35oAUt/sAAAAAwLAAKUZgVrAAGd9wABnjMAAaCkHwABnLwAAAWDAAKS0AAAAAQXAAKUdAAAAAAQAAAMAAAAAAAAAAABgwAClGQE/AQkBAMAApLoAAAAAAQbAAKUbgVrAAGe2wABnysAAaCcAArxSAAAAAQPAAGfgwABoJwAAAAICAsAAZ/0AAACzVGDAAH2RAMAAaBsAAACY1WC85AAAYMAAiDMAAABS4E8AUuCcAAAAAQLAAKUegVrAAGgswABoMsAAcN8DwABnMAAAAWDAAKTeAAFgwAClGQMEwAClIIFawABpA8AAaRsGg+cAYMAA/bYBasAAaQlgwAD9tsABZEQEwAClIoFawABpNMAAaUgYwABnMsAAo9oAYMAAiDMBKwTAAKUjgVrAAGldwABpbBjAAE74AGDAAHUdASsBBcAApS6BWsAAaXHAAGlxwABqLgAAAAPAAGmFwABqLgAAAAQEBMAAaZAAAACD7mCDWQDAAGmmAAAAwABADGCEfgDAAGnLAAAAwABL/mDAAHI3AMAAaecAAADAAFYdYMAAnCMAAGDAAKUeAT8BCQDAAGn8wACk7QQABIDAAGoCwFLhWoHAAGoIwFLhZ4LAAGoWwFLhdoPAAGoiwFLhhwAGBsAApSWBWsAAajPAAGo7wABtFAQBrs4AAAABA8AAamLAAG0UAAAAAQEBwABqbgAAAINEYMAAXSoAAGDAAKUeAT4IPRzAAGqDgMAAanzAUuH+gpQBAAFqwABqiWDAAP22wAFkRADAAF0sTsAAap3AAGqiAACD7mCDWQEcwABqq4DAAGqkwFLh/sAAQ9QAAAAAwABdRE7AAGrRAAAAwABADGCEfgBJwABq4yXAAGrsgcAAaufAUuI+YIPlPgE9isAAawXAUuJpFsAAaxkUwABrFMBS4j4BAWCD5YJqg+pJwABrLiXAAGs3gcAAazLAUuI+YIOkPgE9isAAa1LAUuJpFsAAa2YUwABrYcBS4j4BAWCDpIJqg6g+AT0wwABrgx/AAGuNwAD7YgEAASTAAGveBSfAAGcmgcAAa8LAUuI+J4NJFsAAa8+BwABrysBS4j6FgMAA/TAnmDgATsAAa/zAAGwHAADAAEv+YMAAcjcBHsAAbBXAAHI9AQABgMAAbDnAUuH+AE7AAGxWwABsYgAAwABWHWDAAJwjAR7AAGxwwACcKgIAAoDAAGyTwFLh/oHAAGybwFLiPgA9HMAAbK2AwABspsBS4f6CjAEAAWrAAGyxYMAA/bbAAWREAMAAXS1KwABsuwEfwABsxsAApS4EAASBwABs5MBS4j6CwABs6sBS4mmDwABs+MBS4y6EwABtBMBS41kABsAApSeBWsAAbRnAAG0qwABuPgAArs8BasAAbRpgwAD9HAIAAAEDwABtOcAAbj4AAAABAQHAAG1DAAAAhDtgwABc2wAAXAE+Bz0cwABtVIDAAG1PwFLkH692AQABasAAbW5gwACkjcABY60AwABc7D0cwABthYDAAG2AwFLkH4KUAQABasAAbYtgwAD9tsABZEQAwABc4D0cwABtmoDAAG2VwFLkH8AAQ7IBAAEWwABtqi6D7sAApK0AwABc8T0cwABtwBbAAG21LsAAS/7AAKSurs8BAAGAwABt0MBS5B8AwAByP0AcwABt8hbAAG3iLsAATvjAAKUjSAEAASsAwAD9KcAAbeLAAG35AD0cwABuDBbAAG4ALsAAVh3AAKSvrs8CAAKAwABuHMBS5B8WwABuIi6D7sAApK0AwACcLD0cwABuMoDAAG4twFLkH4KMAQABasAAbjZgwAD9tsABZEQAwABc4QbAAKUogVrAAG5DwABuY8AAcG4AALxSAWrAAG5EYMAA/RwCAAABA8AAbnnAAHBuAAAAAgICwABulgAAALNUYMAAfZEAwAButAAAAJjVYLzkAABgwACIMwE+AknAAG7HHMAAbuAWwABuyy7AAGcywACj2sAApSJIAQABKwDAAP0pPgFJwABu8SIlwABu+hbAAG71LoPuwACkrWCDpAAWwABvG4HAAG8PwFLllIQdvMM+AT0XwABvLi7AAGcywACj2hzAAG9vH8AAb1XAAKZrAQABgMAAb2PAUuWFAMAAZzMBAAEmwABvigEWwABvii6D7sAApK1gg6QAwACmacAApSI+AT0ewABvqLWnAgACgcAAb77AUuWUJAAEJ8AAZzSBwABv8MBS5ZQngZ4nwABnNQA/SsAAcE8BFsAAcFYuwABnMsAAo9rAAKUiBsAApSyBWsAAcHPAAHCbwABw3QEAwABWIwFqwABwdGDAAP0cAgAAAQPAAHCzwABw3QAAAAAAAABgwACekQFKwABwvAFqwABw1GDAAJ6RwAFN0gbAAKUpgVrAAGgywABoMgAAErK+AADAAKS2AQMAAAAAAAEBAQAAAAizVGDAAKO/AABgwABi4gAGwAClKoFawABoMsAAaDIAABKyvwAAwACktwEDAAAAAAABAQEAAAAIs1RgwACjvwAAXcAA/HQBYMAAYqIAAABS4dQAUuPqAFLlUABS5pkAUubrAFLnIgBS518AAAAGAsAApS+BWsAAcOLAAHDowAB3SgPAAGc2AAABYMAApN4AAAEEwAClMYFawABxn8AAcbwGg+cAYMAA/bYBasAAcaVgwAD9tsABZEkBBcAApTqBWsAA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wFO6gwDAAKPCAAAAwAD8QgbAAKbrgcvAAEV4wABFlsAARnQAAKFNAWrAAEV5YMAA/RwCAAABA8AARafAAEZ0AAAAAgICwABFtwAAALNUYMAAo78AwABFygAAAIC9YMAA/bYAAGC85AE+Az0cwABF1i7AAEUiwACmlAEAASbAAEXiAYDAAEXiwFO7CWDAAIONAMAApudOwABF/cAARgkAAJjVYINZARzAAEYaFsAARgsuwABnCMAAppTAAKbbSwEAAYHAAEYbwFO7GADAAPy5SsAARiYBIyEcwABGOYLAAEYtwFO7WkgBAAErAMAA/SkcwABGToDAAEZDwFO7CafIAQABgsAARl3AU7taAMAAo8QrAWC85AbAAKbsgcvAAEZ5wABGisAAR30AALK3AWrAAEZ6YMAA/RwCAAABA8AARpzAAEd9AAAAAgICwABGswAAALNUYMAAo78AwABGxAAAAIGmYQFgvORcAABcAT4CPRzAAEbsLsAARSLAAKaUAQABJsAARvgBgMAARvjAU7wOYMAAg40AwACm5z0cwABHIBbAAEcZFsAARwkuwABnCMAAppTAAKbbKcAA/MiD+AEAATTAAEcoA8AARyjAAEd4AAAAAQEBwABHMwAAAJjVYINZAABgwAD82QE+AT0cwABHSYHAAEdIwFO8HSABAAEcwABHVYDAAEdKwFO8DqfIAQABgsAAR2TAU7yYAMAAo8QAAADAAPxCBsAApu2By8AAR4LAAEeHwABILAAAwABW4wAAAAEDwABHmcAASCwAAAABAQHAAEewAAAAwABO+GC86wAAXAE+Aj0jHMAAR9wWwABHxy7AAGcJwACmlMAApuBIAQABKwDAAP0pF8AAR8cuwABnCcAAppQxwABH92C86wDAAKbgKwFdwAD8dAFgvOs9HMAASBQWwABH/y7AAGcJwACmlMAApuBWAQABgMAASBjAU70VAMAA/IUGwACm7oHLwABIMcAASELAAEiuAACyzwFqwABIMmDAAP0cAgAAAQPAAEhYwABIrgAAAAEBAcAASF4AAACBpmEBYLzrXAAAXAE+AT01AAAAAQBdwAD8dAFgvOsBFsAASIouwABnCcAAppTAAKbgIxzAAEiggQDAU73oSAEAASsAACscwABIoIEAwFO96IP4AQABgMAASKjAU73RAMAA/EIBXAbAAKbvgcvAAEiz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tC7AAGffwACphgEAAYPAAEbGwFTzIgDAAKoHScAARtohHMAARuWEwABG3sBU8ztIAQABKwDAAP0pPgE9HMAARwQWwABG9i60yMAAqgGvFAEAAR7AAEcawABnqAMAA4TAAEc7wFTzOx7AAEdRwABorQMAAxzAAEdzgcAAR1/AVPL+ZAEAARbAAEeEgsAAR3XAVPMNYcAA/KMAwAD89YLAAEeawFTzDRbAAEe4g8AAR6rAVPMiYcAA/KMAhcAAR8vAVPOKAADAAEy5PgI9HMAASAEWwABH8y60yMAAqgGvFAEAAR7AAEgXwABnqAIAAhzAAEhDFsAASDgus1TAAKn/wABNsAEAARbAAEhmFsAASFguqZ/AAKoAhPm8xQDAAINjasAASI9gwABol8AA5EMAAMAATLk9HMAASK4WwABIoC60yMAAqgHAAGfgAQABasAASMZgwABm7cABLqkAwACzkgbAAKmzgc7AAEjqwABI+8AAS2gAAMAAWCcBasAASOtgwAD9HAIAAAEDwABJC8AAS2gAAAABAQHAAEkUAAAAgL1giH4AAFwBPgJOwABJLcAASTQAAIJmYLy3ARzAAElJFsAAST4us1TAAKn/wABO4AMAAhbAAElYLqmfwACqAIDAAElnwFT1PwGbBirAAINiScAASYEhHMAASYyBwABJhcBU9VJIAQABKwDAAP0pPgFJwABJnRbAAEmogcAASaHAVPVSsny8vz4BPRzAAEnMFsAASb4utMjAAKoBrxQBAAEewABJ4sAAZ6wBAAEmwABJ+QGBwABJ+cBU9VJgvMwAAMAATLk+AT0cwABKKBbAAEoaLrTIwACqAa8UAQABHsAASj7AAGepAQABgcAASlHAVPVSAADAAEy5PgI9HMAASoQWwABKdi60yMAAqgGvFAEAAR7AAEqawABnqAIAAhzAAErGFsAASrsus1TAAKn/wABNsAEAARbAAErpFsAAStsuqZ/AAKoAhPm8xQDAAINjasAASxJgwABol8AA5EMAAMAATLk9HMAASzEWwABLIy60yMAAqgHAAGfgAQABasAAS0lgwABm7cABLqkAwACzkgbAAKm0gc7AAEttwABLfsAATe4AAMAAWCgBasAAS25gwAD9HAIAAAEDwABLjsAATe4AAAABAQHAAEuXAAAAgL1giH4AAFwBPgJOwABLsMAAS7cAAIJm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q1BIAQABKwDAAP0pwABBwcAAQcwASsAAQdMBLgbAAKtegdHAAEJmwABCb8AAQ3IAAMAAW38AAAABA8AAQn3AAENyAAAAAQEBwABCgwAAAJ1FYMAA+goAAGDAAIs0AT4GQB7AAEKawABZZAIAAieaFxbAAEKrLmrAAKtNAMAAQprAAEKxAEAewABCv8AAWWQCAAInm8wWwABC2hbAAELULmrAAKtNg7CexgDAAEK/wABC3wA9HMAAQucuwABoNgIAAhbAAELzLmrAAKtNgMAAQvrAVcbgAMAAq2RJwABDCRzAAEMeFsAAQw0uwABoMcAAq1JIAQABKwDAAP0pPgFKwABDLwFqwABDNmDAAIs0wAFZYz9AIRzAAENVFsAAQ1EugozAAKtQSAEAASsAwAD9KcAAQ1HAAENcAErAAENjAS4GwACrX4HRwABD/MAARAXAAEUUAADAAFuCAAAAAQPAAEQZwABFFAAAAAEBAcAARB8AAACdRWDAAPoKAABgwACLNAE+BkAewABENsAAizABAAEWwABESy5qwACrTQDAAEQ2wABEUQBAHsAARF/AAFlkAgACJ5vMFsAARHoWwABEdC5qwACrTYOwnsYAwABEX8AARH8APRzAAESHLsAAaDYCAAIWwABEky5qwACrTYDAAESawFXIBADAAKtkScAARKkcwABEvhbAAEStLsAAaDHAAKtSSAEAASsAwAD9KT4BSsAARM8BasAARNZgwACLNMABWZ8/QCEcwABE9xbAAETzLoKMwACrUEgBAAErAMAA/SnAAETzwABE/gBKwABFBQEuBsAAq2CB0cAARaLAAEWrwABG9gAAwABbgwAAAAEDwABFx8AARvYAAAABAQHAAEXNAAAAnUVgwAD6CgAAYMAAizQBPgdAHsAAReTAAIswAQABFsAARfkuasAAq00AwABF5MAARf8AQB7AAEYNwABZZAIAAieA9BbAAEYhFsAARhsuasAAq02DsJ7GAMAARg3AAEYmAEAewABGNMAAWWQCAAInm8wWwABGVBbAAEZPFsAARkkuasAAq02DsJ7Gg7CexgDAAEY0wABGWQA9HMAARmEuwABoNgIAAhbAAEZtLmrAAKtNgMAARnTAVcklAMAAq2RJwABGgxzAAEaYFsAARocuwABoMcAAq1JIAQABKwDAAP0pPgFKwABGqQFqwABGsGDA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AELtAAAAgJZgwACU4wAAYMAAlOMBPgNJwABDGCEcwABDKRbAAEMhgcAAQxzAVjAAliDAAGJ4SAEAARbAAEM8FsAAQywus7/AAKuewACrxLEHuIAAwAD9KT4BPYnAAENSwFYwAB/AAENZwABiiwIAAhbAAEN3FsAAQ2cus7/AAKuewACrxLEHuIAWwABDioHAAEOFwFYwAIUXwABieQA/ScAAQ6QcwABDsRbAAEOoLsAAUPbAAKuewACrxsAAUQYBAAEWwABDzoHAAEPJwFYwAJYgwABieADAAIKzPgFKwABD4AEfwABD68AAlWkCAAIcwABEAS7AAGiFAQABFsAARCMWwABEEy6zv8AAq57AAKvEsUu4wgDAAKvRMcAAREJgwACU4wKCwABEQ8BWMA8cwABESi7AAGh7wACrngEAAYHAAERdwFYwAADAAKvbAD9KwABEcAGCwABEd8BWMA8GwACr2oHSwABEhcAARJbAAEcGAADAAGh8wACrngAAAAEDwABEq8AARwYAAAACAgLAAETBAAAAhf9gwABguwDAAETaAAAAhRddwAD8dAFgwABiTwAAYMAAlOMBPgRPwABE78AARQAAAAGcvWEBYMAAYqJgwACU4wADwABFCsAARfoAAAABAQHAAEUcAAAAwABohmDAAGKiAABgwACU4wE+Ak7AAEVAwABFSQAAgmxgwABiogGDwABFS8BWMfU9MMAARVwewABFYrWnAgACasAARXZgtbnAALu1JAAGJ8AAaIeEwABFtMBWMhAng0InwABoiBzAAEXkgMAARdvAVjGepsEAAAAAwABg2yeDQgBOwABGGMAARiIAAFtdwAD8dAFgwACU4wExwABGNmDAAJTjAEbAAEY+wABGZ8AARkwAAAAfYMAAYk8AgcAARljAVjGtPgE9HMAARnmDwABGb8BWMn1WAQABHMAARpQWwABGiC7AAFMewACrnsAAq8fAAEVTAwADFsAARqouwABDiMAAq57AAKvKhMAARrTAVjKogsAARr7AVjHQAMAAdk8AwAD8hUrAAEbWAR/AAEbhwACWfAEAAYPAAEb4wFYyfQAGwACr24HSwABHC8AARxzAAEhUAADAAGh7wACrngAAAAEDwABHLsAASFQAAAABAQHAAEc4AAAAgpBgwABiTwAAYMAAlOMBPgRAFsAAR1QWwABHSy6xrcAA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wABkL0rAAKykAR/AAKyvwACN4QIAAoPAAKy6wFaVvYLAAKzGwFaUawAGwACsMYHUwACtGcAArSrAAK6BAADAAGkyAAAAAQPAAK1AwACugQAAAAEBAcAArUcAAACZwmDAAI11AABdwAD8MgFgwACNvAE+A07AAK1jwACtawAAwABpP13AAPwyAWDAAI28ARzAAK20HMAArYEWwACtcYDAAK1twFaWWYSDwACNfoGlAQABNMAArYcDwACth8AArakAAAABAQHAAK2OAAAAhI5gwACNpAAAYMAA+goBSsAArZgBFsAArZ6BwACtmMBWlsnAAFuxwACNsADAAPw+gKsBAWDAAI28ARbAAK24LsAAZcjAAKwvAMAA/D1OwACt38AArecAAJsIXcAA/DIBYMAAjbwBHMAArjkcwACt/RbAAK3tgMAArenAVpZZhIPAAI1+gaUBAAE0wACuAwPAAK4DwACuLgAAAAEBAcAArgoAAACEjmDAAI2kAABgwAD6CgFKwACuFAEWwACuGoLAAK4UwFaXbcAAXC7AAI2xAMAA/D6AqwEBYMAAjbwBFsAArj0uwABlysAArDAAwAD8PUrAAK5TARzAAK5tMcAArlpdwAD8MgFgwACNvAKBwACuW8BWlniCwACuZMBWlx6EiQEBYMAAjbwBNMAArnQDwACudMAArnwAAAABAQHAAK51AAAAg3tdwAD8MgFgwACNvAAAXcAA/DIBYMAAjbwBSsAArnsBg8AArnvAVpgNAMAA/EAGwACsMoHUwACwGsAAsDzAALdZAADAAGk0AAAAAQPAALBOwAC3WQAAAAEBAcAAsFYAAACWQWDAAI28AABdwAD8pQJgwACU42DAAJTjAT4ETsAAsGjAALBzAACwOl3AAPylAmDAAJTjYMAAlOMBMsAAsJNgwACU42DAAJTjAD0cwACwpoHAALCcwFaYk4C/AgACFsAAsK6AwACwp8BWmG+AvcAAjb8WwACwvYDAALC2wFaYb4KTwACNwADAAPy6ScAAsMclwACw0oDAALDLwFaYb2DAAI3SPgJGwACw7cAAsSvAALEGAAAAwABpQGDAAI3iABbAALEbFMAAsRTAVphvAAFgwACN0sAAXODAAI3HPgE9HMAAsT+BwACxNcBWmJOAvwIAAhbAALFLgsAAsUDAVpkkgL3AAI2/FsAAsV6CwACxU8BW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wABh/8AArF/AAGmIAQABHsABD3fAAJKKAQABhcABD4bAVtGKAADAAKxnBsAArD+B1MABEHDAARB8wAET8wAAwABpiQAAAAEDwAEQksABE/MAAAAAAAAAYMAAlpgBPgVOwAEQrcABELMAAISxXcAA/HQBYMAAlpgBMcABELVgwACWmABOwAEQzcABENwAALL7YLgwARbAARDrFsABEN4utWXAAKvfwACsE7L7wABNF07AARGCwAERpAAAwABpil3AAPx0AWC8pQExwAERpmC8pQcWwAERvYHAARGuwFbV0JrHuDUWwAER3IHAARHNwFbV0JrKuDYWwAER/oHAARHvwFbV0JrJuDQWwAESHYHAARIOwFbV0JrLuDcWwAESP4HAARIwwFbV0JrGuDMWwAESX4HAARJQwFbV0JrFuDsWwAESf4HAARJwwFbV0JrSuD49HMABEv6CwAES3MBW1fyD+AEAATTAARMGA8ABEwbAAROGAAAAAQEBwAETBwAAAJYgYLylAABgwAD82QE+AT0cwAETHoDAARMYwFbVrFYBAAEfwAETJsAAlqQCAAIewAETPcAAkoQBAAEcwAETURbAARNKLrdXwACr38AArA+GdAEAAYPAARNbwFbWwwDAAGQ5AB7AARNmwACSgwEAARbAARN4g8ABE3DAVtbDgL28kwAAAMAA/IUAwAD8QkrAAROOAR/AAROZwACWpAIAAh7AAROuwACSgwEAAWrAARO4YMAA/bbAAV3aAB/AARPTwACWlwEAAYDAARPowFbVrAAABsAArECB1MABFL7AARTKwAEVYgAAwABpiwAAAAEDwAEU3cABFWIAAAAAAAAAYMAAlpgBPgJOwAEU9MABFP0AAIJqYMAAlOMBHMABFQFqwAEVAmDAAJdRwAETiSABAAEnwABpjADAAJdTSsABFR8BH8ABFSrAAJakAgACHsABFTbAAJKDAQABasABFUBgwAD9tsABXdUAgMABFVXAVtfRAAbAAKxBgdTAARX7wAEWDcABGDMAAMAAaY0AAAABA8ABFhnAARgzAAAAAQEBwAEWIgAAAK/qYMAAjREAAF3AAPx0AWDAAJaYAT4ITsABFkPAARZTAADAAGmOXcAA/HQBYMAAlpgBMcABFlVgwACWmABPwAEWXsABFmoAAAHAAGmPYQJgwACU42DAAP22YMAAlpgAA8AB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AJaYATHAASR3YMAAlpgAT8ABJH/AASSEAAABwABpl2ECYMAA/bZgwAD9tlwAA8ABJI3AAST1AAAAAgICwAEklQAAAIC9YMAA/bYAwAEkogAAAICWYMAA/bYAAFwBPgE9HMABJMCAwAEkscBW40ZWAQABH8ABJMfAAJakAgACHsABJNDAAJKDAQABgsABJNrAVuOYABzAASTjasABJORgwACXUcABE4kgAQABg8ABJOfAVuOnAMAAl1MAAMAA/IU9HMABJQWBwAEk/MBW43AgAgACGsABJRzAAJpHJ8AAaZgAAD0cwAElQoHAASU5wFbjcCACAAIawAElWcAAmkgnma0AAD0cwAEleIHAASVvwFbjcCACAAIawAElj8AAmkknSwAASsABJa0BH8ABJbfAAJaXAQABgMABJcnAVuNGAAbAAKxGgdTAASdhwAEnbsABMM0AAMAAaQIAAAABA8ABJ3/AATDNAAAAAQEBwAEniQAAAJZZYMAAjTAAAGDAAJPMAT4KTsABJ6zAASe3AACGEF3AAPx0AWDAAJPMATHAASe5YMAAk8wAScABKA0iFsABKBqAwAEoEcBW5MfAAFzCwACNOQAewAEoRMAAol0BAAEWwAEohBbAASh3LrVlwACr38AArBOzR8AATRIAPgE9HMABKKaBwAEom8BW5OBWAQABHsABKLrAAKJeAwADFsABKPsWwAEo7i61ZcAAq9/AAKwTs0fAAE0SFsABKQkur2LAAKwiHMABKSlqwAEpKmDAAJdRwAETiSACAAInwABpmTHAASp3WwAAwACXUwAAwAD8hT9OwAEqpMABKrYAAMAAYe9dwAD8pQJgwAD9tmDAAJTjATLAASq4YMAA/bZgwACU4wBOwAEq28ABKuQAAMAAXPddwAD8pQJgwAD9tmDAAJTjATLAASrmYMAA/bZgwACU4wBOwAErAcABKxUAAMAAaZpdwAD8dAFgwACTzAExwAErF2DAAJPMAEbAASsgwAErTMABKy0AAACEQ2DAAI1cABbAAStBgMABKzjAVuTHhtPAAI0zPgFGwAErVMABK3fAAStfAAAAmcJgwACNdQAWwAErboXAAStmwFbmToSBwACNYT4CScABK4EhHMABK5gWwAEriYbAASuFwFbmfMAAXNDAAI2OSAEAASsAwAD9KT4BRsABK63AASvUwAEruQAAAIPn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hMAAQvHAVx4+PYvAAEMHwFcd+RbAAEMchMAAQxHAVx4+g7DAAEVrQsAAQywBP0nAAENNJcAAQ1mDwABDUcBXHflgwABJDD4CTsAAQ4HAAEOLAADAAGnDYMAASQwBFMAAQ43AVx35AwFgwABJDEnAAEOeHMAAQ7IWwABDrITAAEOiwFcfaYCWwABJF0gBAAGBwABDtcBXHUkAwAD9KT4FPRzAAEPShMAAQ8jAVx9puUUCAAKBwABD3MBXHUmCwABD48BXHa4AwABF2T0XwABD/4TAAEP1wFcfabkrFsAARBeBwABEEcBXHUm5K8AARaHAAEWhPYrAAEQywFcdroTAAEQ6wFcfaT2LwABET8BXHfkWwABEY4TAAERZwFcfaYOwwABFa0LAAERzAT9JwABElCXAAESgg8AARJjAVx35YMAASLA+AUnAAES2HMAARNAWwABEyRbAAETCFMAARLrAVx35AwFgwABIsIJRwABFZ4DDwAD8WkgBAAGBwABE08BXHUkAwAD9KT4CPRzAAETuFMAARObAVx35AwFgwABIsLlFAgACgcAARPjAVx1JgsAARP/AVx2uAMAARdlKwABFEQEWwABFIBTAAEUYwFcd+QMBYMAASLCDsMAARWs/P0LAAEU+AE7AAEVjwABFaAABg7BgwABFYQEWwABFcILAAEVqwFcdroOwwABFa0nAAEV7HMAARZMWwABFjBbAAEWFgcAARX/AVx1JuMbAAEVoYcAA/KOBawEAAZQAwAD8/krAAEWZAYPAAEWgwFchBT9OwABF7sAARfMAAK2YYMAARfABHsAARgPAAEX3AwACgcAARgbAVx1JgsAARg3AVx2uAbljKUnAAEYyFsAARjuEwABGNsBXIW+BVcAARf1KwABGRAGDwABGS8BXIQU/TsAARlvAAEZoAADAAGnEYMAA+goBIiXAAEZwgcAARmrAVx1JYMAASDYBJcAARoaBwABGgMBXHUlgwABIWknAAEafFsAARqiEwABGo8BXIW+5a8AARgA+A07AAEbBwABGxQAArvBgwABFYQEWwABGzITAAEbHwFchb4DDwABGAUnAAEbaJcAARuKGwABG3sBXIiVgwABIbT4EScAAR7gcwABHyRbAAEfGFsAAR8AUwABHvMBXIiUGAWDAAEhtmffAAEVps1XAAEUsYwEAARbAAEfXFsAAR9GC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AABcAT4FScAApYwcwACloxbAAKWcFsAApZWAwAClkMBXU864xsAARWhhwAD8o4FrAQABlADAAPz+SsAApakAP07AAKXDwAClzAAAhf9gwABguwEWwACl04DAAKXOwFdTzoX/wABIOEnAAKXiFsAApe+BwACl5sBXVB2sacAAYL4+Aj0cwACl/y7AAGnnwACscgEAAYDAAKYLwFdTzgDAAK0YSsAAphgAP0nAAKYrFsAApjiBwACmL8BXVB26B8AAYMI+Aj0cwACmRy7AAGnowACscgIAAoDAAKZSwFdTzibAAKZYAYHAAKZYwFdUHWDAAGEUAMAArRlKwACmaQA/ScAApnwWwACmiYHAAKaAwFdUHbUbwABgxT4CPRzAAKabLsAAaenAAKxyAgACgMAApqnAV1POJsAApq8BgcAApq/AV1QdYMAAYXEAwACtGkrAAKbAAD8GwACtGIHWwACm1cAAptrAAKpcAADAAGnnwACscgAAAAEDwACm5cAAqlwAAAABAQHAAKbwAAAAg+5gwABINgAAXAE+Bk7AAKcAwACnBQAAmIBgwAD70AGXT8AApw/AAKcUAAABwABp6mEBYMAARWFgwAD6CgADwACnI8AAqaQAAAABAQHAAKcxAAAAuIhgwABFYQAAYMAA+goBPgdJwACniSXAAKeZg8AAp43AV1W1YMAASPdKwACnsQEqP0nAAKfGJcAAp9aDwACnysBXVbVgwABGUkrAAKfiASk/ScAAp/UlwACoBYPAAKf5wFdVtWDAAEY9SsAAqBEBKT9JwACoJCXAAKg0g8AAqCjAV1W1YMAASG1KwACoPQEpP0nAAKibJcAAqKuDwACon8BXVbVgwABIsErAAKi3ASo/ScAAqRElwACpIYPAAKkVwFdVtWDAAEiBSsAAqS8BKj9KwACpkgEqTsAAqa/AAKm4AADAAGnlYMAA+9ABHMAAqbouwABp48AArHICAAKAwACpzsBXVWGCwACp1MBXVY4AwACtFknAAKnqHMAAqf4cwACp94PAAKnuwFdWlYOIAQABgcAAqfnAV1V2AMAA/PeBawEAARzAAKoKHMAAqgM3B2QBAAGBwACqBcBXVXYAwAD89WQBAAEcwACqFYPAAKoMwFdWlYOIAQABlADAAPz3AMAA/PUAwAD8/krAAKoaAD89HMAAqiYuwABFBMAArHIDAAOAwACqLcBXVWGCwACqM8BXVY4nwABp6wDAAK0XSsAAqlIABsAArRmB1sAAqmHAAKpmwACuOQAAwABp6MAArHIAAAABA8AAqnDAAK45AAAAAgICwACqewAAAIPuYMAASDYAwACqkgAAAMAASvtgwABhFAAAXAE+CE7AAKqswACqsgAAgJZgwAD53AEWwACqwIHAAKq0wFdXwKlUwABhFk7AAKrVwACq2gAAgbBgwAD9tgEcwACq4oLAAKrcwFdX1yMAAAAAwAD6Bk7AAKr2wACq+wAAmIBgwAD70AEWwACrAoPAAKr9wFdX/mHAAP26ScAAqw4cwACrF4TAAKsSwFdYKIFrAQABlgDAAPz+SsAAqx0AP0/AAKsqwACrLwAAAcAAaephAWDAAEVhYMAA+goAA8AAqz7AAK1zAAAAAQEBwACrTAAAALiIYMAARWEAAGDAAPoKAT4HScAAq2ElwACrcYbAAKtlwFdYnmDAAEZSSsAAq30BKT9JwACrkCXAAKughsAAq5TAV1ieYMAARj1KwACrrAEpP0nAAKu/JcAAq8+GwACrw8BXWJ5gwABIsErAAKvbASk/ScAAq+4lwACr/obAAKvywFdYnmDAAEhtSsAArAcBKT9JwACsXCXAAKxshsAArGDAV1ieYMAASIFKwACsegEqP0nAAKzdJcAArO2GwACs4cBXWJ5gwABHMkrAAKz+ASo/SsAArWEBKk7AAK1+wACthwAAwABp5WDAAPvQARzAAK2JLsAAaePAAKxyAgACgMAArZ3AV1exhcAAraPAV1h3AMAArRZJwACtuRzAAK3NHMAArcaGwACtvcBXWX6DiAEAAYTAAK3IwFdYKADAAPz3gWsBAAEcwACt2RzAAK3SNwdkAQABhMAArdTAV1goAMAA/PVkAQABHMAAreSGwACt28BXWX6DiAEAAZQAwAD89wDAAPz1AMAA/P5KwACt6QA/PRzAAK31LsAARQTAAKxyAwADgMAArfzAV1exhcAArgLAV1h3JMAArjQCJ4C1HMAArhyDwACuF8BXV/7AAEK8AgACJ4GNJ4C1AMAA/dQAwACtFwbAAK0agdbAAK4+wACuQ8AAsoQAAMAAaenAAKxyAAAAAQPAAK5QwACyhAAAAAICAsAArlsAAACD7mDAAEg2AMAArnUAAADAAEswYMAAYXEAAFwBPghOwACuksAArpgAAICWYMAA/bYBFsAArqmBwACumsBXWsedb8AAYXNOwACuvsAArsUAAGFgwAD70AEWwACuzYLAAK7HwFda3mHAAP26TsAArt3AAK7iAACYgGDAAPvQARzAAK7rg8AAruTAV1sFZAEAAZUAwAD89UnAAK8HHMAArxCEwACvC8BXWyqBawEAAZUAwAD8/krAAK8WAD9PwACvI8AArygAAAHAAGnqYQFgwABFYWDAAPoKAAPAAK83wACx0QAAAAEBAcAAr0UAAAC4iGDAAEVhAABgwAD6CgE+CEnAAK+oJcAAr7iGwACvrMBXW6VgwABHMkrAAK/JASo/ScAAsBEcwACwHIPAALAVwFdbBYFtAQABNxAAwAD9AErAALAjASk/ScAAsDclwACwR4bAALA7wFdbpWDAAEZSSsAAsFMBKT9JwACwZiXAALB2hsAAsGrAV1ulYMAARj1KwACwggEpP0nAALCVJcAAsKWGwACwmcBXW6VgwABIsErAALCxASk/ScAAsMQlwACw1IbAALDIwFdbpWDAAEhtSsAAsN0BKT9JwACxPyXAALFPhsAAsUPAV1ulYMAARtxKwACxXQEpP0rAALG/ASpOwACx3MAAseUAAMAAaeVgwAD70AEcwACx5y7AAGnjwACscgIAAoDAALH7wFdauIXAALIBwFdbfgDAAK0WScAAshccwACyKxzAALIkhsAAshvAV1ysg4gBAAGEwACyJsBXWyoAwAD894FrAQABHMAAsjccwACyMDcHZAEAAYTAALIywFdbKgDAAPz1ZAEAARzAALJChsAAsjnAV1ysg4gBAAGUAMAA/PcAwAD89QDAAPz+SsAAskcAPz0cwACyUy7AAEUEwACscgMAA4DAALJawFdauIXAALJgwFdbfiTAALJ/AyfAAGnsg8AAsnbAV1sFJ4C1AMAArRcAAFdOXABXTuoAV0/OAFdQagBXUjcAV1OZAFdVMQBXV4EAV1qIAFddpAAAAAkCwACtH4HWwACy68AAsvHAALNUA8AAae0AAAFgwAD9HAABYLyRAQTAAK0hgdbAALMwwACzNAmAvQFqwACzGGDAAP0cAmDAAP22AAEFwACtI4HWwACzOMAAszjAALNSAAAAA8AAs0fAALNSAAAAAQEBwACzTQAABIC9YMAA/bYAAGDAAK0fAT8CCAHAAK0hgADAV15BCQHA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wABC/8AArW5WAQABH7a9wACtawIBYMAARWECgLbQwFd944G22MBXffAAAMAA/IUGwACtcoHXtu6287d2AADAAE9LAAAAAQO3ALd2AAAAAgICtw4AAACDRGDAAEVhALcjAAAAwABerWDAAEVhAABcAT4BPRy3Qha3Ni7AAE9KwACtb1YBAAEft0rAAK1rAgFgwABFYQKAt13AV35dgbdlwFd+agAAwAD8hQbAAK1zgde3e7eOt8gAACMBard8YMAA/RwCAAABA7eWt8gAAAAAAAAAYMAA/bYBSrecASS3yAQnwABqDxa3pi7AAEL/wACtbifAAGoQFre8LsAAT0rAAK1vBsAArXWB17fNt9a4BgEAgVUAAAABA7feuAYAAAAAAAAAYMAA+goBSrfhASIWt+gWt+EuwABC/8AArW6BVcAA/FYAFrf/FrfzLsAAT0rAAK1vgVXAAPxWAABXfcEAV347AFd+tQBXfw4AV39lAAAABALAAK14gde4lbibvpsDwABqEQAAAWDAAP0cAAAEBMAArXqB17jNuNQJwABqEgBdwAD8pQJgwABFYWDAAP22AATAAK17gde4/LkICcAAahMAXcAA/KUCYMAARSpgwACtbAAEwACtfIHXuXC5fAnAAGoUAF3AAP1nAWDAAP22AATAAK19gde6ULpYCcAAahUAYMAA/bYAAQXAAK2Jgde6sLqwu3AAAAADur27cAAAAAAAAABgwACteAE/BQgAwACteh661sAA/KwAAmDAAEVhYMAA/bYAAAgAwACtex67DsAA/KwAAmDAAEUqYMAArWwAAAgAwACtfB67SsAAwOIAAWDAAP22AAAIAMAArX0nwABqFgkBurDAAP0yAAAAAAgGwACtf4HXul26ZLqrAADAAF64AAAAAQO6b7qrAAAAAAAAAGDAAP22AT4CPRy6hRa6eC7AAGoUwACtfFYBAAEWuokuwABqFcAArX0AwAD9dEq6mAEWup8uwABqFcAArX0GwACth4HXu3W7fbulAQCYDQAAAAEDu4+7pQAAAAAAAABgwAD70AFKu5IBFrufFruSLsAAahTAAK18YcAAzJAGwACtgIHXu6q7sbv4AACZFAAAAAEDu7i7+AAAAAEBAbvGAAAAuIhgwABFYQAAYMAA/bYBPgFKu9kBHLvnFrvgLsAAahLAAK16SwEAAYC76MBXgVsAwAD8uQbAAK2Bgde7/bwJvE8AAMAAXrcAAAABA7wXvE8AAAABAQG8JAAAAJn3YMAARSoAAGDAAK1sAT4BSrwxARy8RBa8OC7AAGoTwACte0sBAAGAvEXAV4G2AMAA/LkGwACtgoHXvFS8WbySAADAAGoXAAAAAQO8ZLySAAAAAQEBvGwAAACAvWDAAP22AABcAT4BPRy8hRa8eC7AAGoUwACtfFYBAAGAvInAV4IRAMAA/XQGwACtg4HXvJe8nLzhAAChugAAAAEDvKO84QAAAAEBAbyxAAAAuIhgwABFYQAAYMAA+goBSrzBARy8yRa8wS7AAGoSwACteodBAQABgLzVwFeCYwDAAPy4BsAArYSB17zmvOu9twAAwABqDgAAAAEDvPK9twAAAAMDA7z/AAAAmfdgwABFKgC9EwAAAINEYMAARWEAvSAAAADAAF6tYMAASG0AAFwBPgJOvT+9RwAAVWDAAK1sARy9Xha9US7AAGoTwACte5kVAgACgL1qwFeCvTS9cQO9cb2IAAAAAAAAAGDAAK1sAUq9dwEfvXvAAK13AAAAAADAAPzAPRy9l4O9j8BXguzAAGoOAgACgb2fwFeCyoK9p8BXgtcAwACtcQbAAK2Fgde9vL3BvpkAAMAAT0sAAAABA73OvpkAAAADAwO92wAAAJn3YMAARSoAve8AAACDRGDAAEVhAL38AAAAwABerWDAAEhtAABcAT4CTr4bviMAAFVgwACtbAEcvjoWvi0uwABqE8AArXuZFQIAAoC+RsBXg4Q0vk0Dvk2+ZAAAAAAAAABgwACtbAFKvlMBH75XwACtdwAAAAAAwAD8wD0cvnODvmvAV4OzwABPSwIAAoG+gcBXg5GCvonAV4OeAMAArXIAAFeAnABXgPwAV4E7AFeBlABXge8AV4JDAFeCmwBXg2IAV4QpAAAACALAAK2Kgde+7b7zwABNHAPAAGoYAAABYMAA/RwAAAYEwACtjIHXvxm/HgmEsQBgwACteAAEwACtjoHXvzW/Owm3V8AArSQAYMAAZOcABMAArY+B179Rv1oJhDAAXcAA/WcBYMAA/bYABMAArZCB179xv4MJwABqGQBdwAD8dAFgwAD9tgAEwACtkYHXv4u/nRjAAGoaAGDAAPvQAZMEwACtkoHXv7W/0wXAAGCmAGDAAP1GAR6/wsAA/V8BAAEnwABqGwABBcAArZuB17/Yv9jAAEJ0AAAAA7/lwABCdAAAAAMDA7/2AAAAgIlgwACtOQDAAEAIAAAEhLFgwACteADAAEAUAAAEt1dgwABk5wAAYMAArYoBPgI9HMAAQQIWwABA+C6EMMAArY9WAQABFsAAQQwWwABBBi6EscAArYzAAGoVwACtfQDAAP10PRzAAEGqFsAAQZmAwABBjcBXhTbAAF5owACtPoP4AQABNMAAQbIDwABBssAAQm8AAAACAgLAAEHAAAAAuIhgwABFYQDAAEHRAAAAJ2DAAPvQAABgwAD82QE+Ak7AAEHnwABB7AAAgL1gwAD9tgEcwABB9BbAAEHuLoSxwACtjJkUAQABg8AAQfzAV4XTAMAArYBJwABCECEcwABCGYXAAEIUwFeF+kgBAAErAMAA/cU+Aj0cwABCNhbAAEIsLoQwwACtj1YBAAGFwABCOsBXhfoAwAD9dD0cwABCTxbAAEJJLoSxwACtjMAAahcBAAGFwABCW8BXhfoAwACtgj8AwAD8xAUIAcAArYyBAMBXhUMIAcAArY6CAMBXhVIIAMAArY8ewABANMAAwOIAAWDAAP22AAAIAMAArZAewABAZMAA924BAWDAAP22AZMACQG/2MAA/TIAAAAABgbAAK2UgdfAAEJ5wABCgMAAQ20AAMAAahwAAAABA8AAQpDAAENtAAAAAQEBwABCmAAAAMAAR45gwAD9tgAAYMAA/bYBPgROwABCsMAAQrIAAGJgwAD70AGTTsAAQsLAAELHAACAvWDAAP22ARzAAELQFsAAQskut1fAAK0kwACtjsAARWEBAAGAwABC4cBXhyQAwABlE0PAAEL0HMAAQwUWwABC+y6EMMAArY+DFwEAAYLAAEMOwFeHUgDAAP1zPgE9isAAQx3AV4dSHMAAQysWwABDJC63V8AArSTAAK2OwABFYQEAASTAAENRAoDAAEM+wFeHJDUAAAABAGDAAPvQAYHAAENMwFeHPzUAAAABAGDAAPvQAYnAAENMwFeHPxzAAENNgwDAV4fvZAEAAZQAwAD89YMAwFeH7wDAAGUTSsAAQ14BgsAAQ2XAV4dSBsAArZWB18AAQ3LAAEN5wABEpwAAwABqHQAAAAEDwABDisAARKcAAAAAAAAAYMAA/bYBPgRDwABDkyEWwABDrhbAAEObLsAAahnAAK2QgVXAAPxWPgJOwABDxsAAQ8sAAIC9YMAA/bYBHMAAQ+AWwABDzS7AAGoZwACtkIYRAAAAAMAA/JNJwABD9CEcwABEAxbAAEP5LoQwwACtj4MXAQABgMAARAzAV4ieAMAA/XNKwABEEwGAwABEGsBXiJ4/TsAARDHAAEQ2AACAvWDAAP22ASTAAEROAieDpjUAAAABAGDAAPvQARbAAEQ8LsAAahrAAK2RNQAAAAEAYMAA+9ABF8AARDwuwABqGhzAAERKgADAV4kkZAEAAZQAwAD89cAArZGAAMBXiSRDwABEVBzAAERlFsAARFsuhDDAAK2PgxcBAAGAwABEbsBXiQgAwAD9cz2IwABEdcBXiQgkwABEkgIng6Y1AAAAAQBgwAD70AEWwABEgC7AAGoawACtkTUAAAABAGDAAPvQARfAAESALsAAahocwABEjoEAwFeJr2QBAAGUAMAA/PXAAK2RgQDAV4mvSsAARJgBgMAARJ/AV4kIBsAArZaB18AARKzAAESxwABFhwAAwABqHgAAAAEDwABEyMAARYcAAAABAQHAAETWAAAAuIhgwABFYQAAYMAASG0BPgJGwABE6cAARRfAAET7AAAAo6hgwABFYQAWwABFD4DAAEUDwFeKOLjGwABFaD4BScAARR8iJcAARSiBwABFI8BXillgwABIbQAhHMAARUYWwABFOBTAAEUzwFeKWQEBYMAASG2lTcAARWNIAQABKwDAAP0pPgFKwABFWQEUwABFYMBXilkBAWDAAEhtP0rAAEV4ASsGwACtl4HXwABFjMAARZPAAEomAADAAGofAAAAAQPAAEWfwABKJgAAAAEBAcAARa0AAAC4iGDAAEVhAABgwAD9tgE+BE7AAEXHAAAAgL1gwAD9tgBJwABF0SXAAEXhgMAARdXAV4sPYMAARhI+A07AAEZdwABGYgAAvlBgwABFYQEUwABGZMBXiw8AAWDAAEYSRMAARnc+Aj2KwABGhMBXi1IWwABGnCbAAEaRAILAAEaMwFeLUmDAAEYSuOvAAEYUPYnAAEaywFeLKBzAAEbGFsAARr8WwABGuS6EscAArYzAAGoSwACteksBAAGCwABGx8BXi1IAwAD8uSIcwABG4oHAAEbdwFeLKEgBAAErAMAA/cUAJcAARvKCwABG7cBXi1JgwABGEknAAEcEIRzAAEcNgcAARwjAV4soSAEAASsAwAD9xUrAAEcWARzAAEcdLsAAaiACAAIUwABHLsBXiw8AAWDAAEYSgcAARzvAV4soAMAArZg/P0nAAEdNIRzAAEdrFsAAR12AwABHUcBXiw+lTcAARWNIAQABKwDAAP0pPgFJwABHfCEcwABHnxbAAEeaFsAAR4yAwABHgMBXiw+lTcAARWOAvbyTSAEAASsAwAD9xT4BPYnAAEeywFeLKBzAAEe5LsAAahwBAAEWwABH5BbAAEfWgMAAR8rAV4sPpU3AAEVjgL28kwDAAK2UPgE9icAASDzAV4soHMAASEMuwABqHQAAAADAAK2VPgJOwABJNcAASTkAALjgYMAASG0BHMAASTsuwABqHgEAAYDAAElTwFeLDwDAAK2WScAASWchHMAASW+CwABJa8BXjRVIAQABKwDAAP0pPgE9icAASYLAV4soHMAASYkuwABqHAEAARbAAEmsFsAASZ6CwABJmsBXjRWlTcAARWOAvbyTAMAArZQ+AT2JwABJysBXiygcwABJ0S7AAGodAAAAAMAArZVKwABJ+AEcwABJ/y7AAGogAgACgMAAShDAV4sPgcAASh3AV4soAMAArZgGwACtmIHXwABKK8AASjLAAErcAADAAGogAAAAAQPAAEpCwABK3AAAAAICAsAASlAAAAC4iGDAAEVhAMAASmQAAACAvWDAAP22AABgwAD9tgE+BD0cwABKehbAAEpwLoQwwACtj1YBAAGBwABKfsBXjh4AwAD9dD0cwABKjxbAAEqJLoSxwACtjMAAahcBAAGBwABKm8BXjh4AwACtgj0cwABKsxbAAEqsFsAASqYuhLHAAK2MwABqEsAArXqAvwIAAoDAAEq0wFeOD4HAAErDwFeOHgDAAPy6SsAASs0BgcAAStTAV44eBsAArZmB18AASyzAAEsxwABNGgAAwABqIQAAAAEDwABLOcAATRoAAAABAQHAAEtHAAAAuIhgwABFYQAAXAE+Ak7AAEthwABLaQAAwABqEmDAAP22ARzAAEt4FsAAS3EWwABLay6EscAArYzAAGoSwACteksBAAGAwABLecBXjvcAwAD8uUnAAEuLIRzAAEuXgcAAS4/AV48MSAEAASsAwAD9xT4CScAATIkiIRzAAEycFsAATI0uwABqGsAArZFIAQABkwDAAPzzABzAAEyrGsAATKTA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vgDAV7xWCQAAAD8/Sr4oASoGwACt1YHZvj2+QsAARV0AAMAAajYAAAABA75cwABFXQAAAAEBAb5qAAAAg+5gwABI5QAAXAE+A06+g76MAACFeWDAAEVhARa+k4C+jsBXvYuFecAASPBPv9G/0QAAAcAAajphAmDAAEZSYMAAS0hgwAD82QADv93AAEG6AAAAAgICv+YAAAC7LWDAAEZSAL/3AAAApN5gwABLSAAAYMAA/NkBPgJOwABAFsAAQCMAAMAAajtgwABFYQEcwABALIPAAEAlwFe957k4AQABFsAAQDwutWXAAK29wACtwgDAAEXLScAAQFEcwABAaRzAAEBegcAAQFXAV72euTUAAAAAwABFq0gBAAEcwABAeYXAAEBswFe+C7k1AAAAAMAARasAwAD9KT4CTsAAQKDAAECzAAC6L13AAP1nAWC8pQEcwABA0xbAAEC1LsAAUuPAAK29wACtyMAAUtACAAIWwABA9ITAAEDrwFe99IC9wABLVhbAAED6LrVlwACtvcAArcIAwAB55UnAAEESHMAAQRYuwABqMgIAAYXAAEEvwFe+CwG6L4bAAEFdwFe+jcAArc8+AT0cwABBhYPAAEF+wFe957lFAgACgMAAQY/AV72LhcAAQZXAV74LAMAARdk/P0bAAEHBwABB8cAAQdMAAACjqGDAAEVhABzAAEHnFsAAQeCAwABB28BXvYu4xsAARWiArQAAAADAAPxIPgFJwABB+SXAAEICg8AAQf3AV79NYMAASUM+AUnAAEIUHMAAQikWwABCHRTAAEIYwFe/TQMBYMAASUO6S8AASU9IAQABgMAAQizAV72LAMAA/Sk+Ak7AAEJLwABCVgAAgmtgwABFYQEWwABCXRTAAEJYwFe/TQMBYMAASUOCa8AASU5JwABCcxzAAEJ3LsAAajIBAAGEwABCkMBXv9UAwACtzz4BPRzAAEKwFMAAQqvAV79NAwFgwABJQ7lFAgACgMAAQrrAV72LhMAAQsDAV7/VAMAARdk/P0nAAELwJcAAQvmDwABC9MBXv01gwABGXj4BScAAQxYiIhzAAEMfFMAAQxrAV79NAwFgwABGXrmXAQABFsAAQzMutWXAAK29wACtwgDAAEZuABzAAENVgMAAQ1DAV72LSAEAARzAAENjFsAAQ10UwABDWMBXv00DAWDAAEZeglHAAEVnSwEAAZMAwAD8gwDAAP0pABzAAEOLHsAAQ3bAAK3TAgACFMAAQ3/AV79NAwFgwABGXoDAAEOFwFe9iwBIAQABlADAAPzzPgE9HMAAQ6mCwABDncBXvb8gAgACFMAAQ6rAV79NAwFgwABGXhbAAEO1FMAAQ7DAV79NAwFgwABGXqTewABGYQAAP0nAAEPXJcAAQ+CDwABD28BXv01gwABGqT4BScAAQ/siIhzAAEQEFMAAQ//AV79NAwFgwABGqbmXAQABFsAARBgutWXAAK29wACtwgDAAEazABzAAEQ6gMAARDXAV72LSAEAARzAAERIFsAAREIUwABEPcBXv00DAWDAAEapglHAAEVnSwEAAZMAwAD8gwDAAP0pABzAAERwHsAARFvAAK3TAgACFMAARGTAV79NAwFgwABGqYDAAERqwFe9iwBIAQABlADAAPzzPgE9HMAARI6CwABEgsBXvb8gAgACFMAARI/AV79NAwFgwABGqRbAAESaFMAARJXAV79NAwFgwABGqaTewABGrQAAPz4ABsAArdaB2cAARWLAAEVzwABLDwAAuF0BasAARWNgwAD9HAIAAAEDwABFisAASw8AAAABAQHAAEWfAAAAg+5gwABI9wAAYMAA+goBPgpOwABGFcAARh4AAIX/YMAARWEBHMAARiguwABqMQIAAhzAAEZRFsAARkuAwABGRsBXwqWCUcAARWdLAQABlADAAPyDFsAARluAwABGVsBXwqW6L8AASPoAwACt0EnAAEZ1HMAARoKBwABGecBXwr5IAQABKwDAAP0pSsAARosBKj9OwABGp8AARrAAAKTeYMAAS0gBFsAARreAwABGssBXwqWk3sAARmFOwABG08AARuAAAIV8YL3LARbAAEbngMAARuLAV8KlhXzAAEZnTsAARwYAAAC4iGDAAEVhAEnAAEcXFsAARySCwABHG8BXwz+FLcAAS1g+AT2MwABHNsBXw4sfwABHSMAARpEHAAeCwABHaMBXwz+DwABHfMBXw2YWwABHmYDAAEeUwFfCpZYgwABGZTHAAEe6YMAARWECgcAAR7vAV8K+HMAAR9AWwABHyoDAAEfFwFfCpYJRwABFZ0sBAAGUAMAA/IMpFsAAR/WAwABH8MBXwqW5K8AARaEWwABIFYDAAEgQwFfCpaVOwABFZABJwABINBbAAEhB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ScEuwABqQgEAARTAAEnkwFfp4wQBYMAASbYAwACuAz9JwABKAhbAAEovHMAAShoWwABKBi6weMAAreasaQEAAYLAAEohwFfpMgC+BLJgvbo+Ak7AAEpawABKXwAArZhgwABF8AEewABKe8AARfcDAAKBwABKfsBX6PuAwABKiMBX5j0BuWMpScAASrYWwABKv4XAAEq6wFfrW4OywABF/j4FTsAAS3rAAEuCAACuCmC9ywEcwABLmBbAAEuELrB4wACt5rT7AQABgsAAS6TAV+kyAL36TsAAS8jAAEvSAACXUmDAAEm2AR/AAEvmwABJzAMAA4bAAEv7wFfrq4HAAEwEwFfo+4DAAEwOwFfmPQA9HMAATDgWwABMMoDAAEwmwFfmPZn3wABFabjjAgACFsAATE6AwABMQsBX5j2DsMAARWuHwABMVMBX694AwABFTz0cwABMb4XAAExqwFfrW4RYAQABh8AATHvAV+veAMAARfg9HMAATJEuwABqQgEAAYfAAEy0wFfr3gDAAK4DPz8/SsAATN0BHMAATQUWwABM8IDAAEzkwFfmPbmQwABGYMAAWbsDAAOAwABNH8BX5j0WwABNLC62dsAArd8WwABNNS6kzMAAreEAwACFpgbAAK4GgdrAAE1KwABNZMAAUKQAALh2AWrAAE1LYMAA/RwCAAABA8AATXDAAFCkAAAAAQEBwABNegAAALiIYMAAStsAAGC9ywE+B07AAE2awABNoAAAgXtgwABFYQEWwABNroDAAE2iwFftG7jrwABK4k7AAE3OwABN2AAAulhgvcsBFsAATeCBwABN2sBX7TK5K8AARaFOwABOA8AATg8AAKzeYL3LARbAAE4pFsAATh2AwABOEcBX7Rus3sAASt20373QTsAATkrAAE5VAADAAGpFYL3LARzAAE5zFsAATl8usHjAAK3mlv0CAAKDwABOgMBX7X6CwABOjcBX7VkAviI9jMAATp3AV+2sHMAATqouwABqRsAArdkDAAOEwABOuMBX7ayCwABOxMBX7VmDwABOz8BX7X4AwACt+0nAAE7hIRzAAE7vgsAATuXAV+1ZSAEAAYTAAE7ywFftrADAAP0pPgFJwABP9yEiJcAAUAOBwABP/cBX7TJgwABIWgAcwABQHxTAAFAZwFftMgEBYMAASFq6DwAAAADAAEhcPgE9HMAA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riNIAQABFsAARNIuhn7AAK6yAMAA/SkGwACuxIHbwABE4MAAROnAAEUHAQCpRwAAAAEDwABE9MAARQcAAAAAAAAAYMAA+goBSsAARPcBFsAARP0WwABE9y6Gf8AArrOpR8AAriUGwACuxYHbwABFC8AARRTAAEUyAQDAAEWYAAAAAQPAAEUfwABFMgAAAAAAAABgwAD6CgFKwABFIgEWwABFKBbAAEUiLoZ+wACussAARZjAAK4mBsAArsaB28AARTbAAEU/wABFXgEAwABqcQAAAAEDwABFTcAARV4AAAAAAAAAYMAA+goBSsAARVABHMAARVYWwABFUC6GfsAArrJIAQABFsAARVkuhn/AAK6zAMAA/SkGwACuwYHbwABFY8AARXbAAEWWAAAjAWrAAEVkYMAA/RwCAAABA8AARX7AAEWWAAAAAAAAAGDAAP22AUrAAEWEASTAAEWWBSeZjhbAAEWHLoZ+wACusieBixbAAEWPLoZ/wACusyeZjwAAWCYEAFgmpwBYKJoAWCk4AFgp2QBYKk0AWC2mAFgubQBYLsYAWC+HAFgwSwBYMNwAWDFvAFgxvQBYMg8AWDJuAFgy1gAAABACwACuy4HbwABGhsAARozAAJGPA8AAanMAAAFgwABEoAABYMAAkT0GBMAArs2B28AAR77AAEfgCcAAanQAXcAA/HQBYMAASc0BMcAAR95gwABJzQAEwACuzoHbwABIbMAASJMJwABfIwBdwAD8pQJgwABFYWDAAK6wAR7AAEh5wAD8rAACYMAARWFgwACusAAABMAArs+B28AASKvAAEi2CaTMAGDAAE0PAATAAK7QgdvAAEjPwABI0wmBVABgwACuCgAEwACu0YHbwABI7sAASPcJwABFRwBgwACRRAAEwACu0oHbwABJA8AASQgYpAoAYMAARHwBKwEFwACu8IHbwABJDcAASQ3AAEmYAAAAA8AASSLAAEmYAAAAAgICwABJMAAAAKTMYMAATQ8AwABJQgAABMAARUdgwACRRAAAYMAArssBPwQIAcAArtGBAMBYNEwIAMAArtAfwABJYMAArhkAAAAACADAAK7PgMAASY3AWDQ9CQHAAEkNwABFDAAAAAAaBsAArtSB28AARtjAAEbvwABHEAEAgL0BasAARtlgwAD9HAIAAAEDwABG9MAARxAAAAAAAAAAYMAA/bYBSsAARvcBJ8AAanUGwACu1oHbwABJncAASa7AAEsqAAC4qwFqwABJnmDAAP0cAgAAAQPAAEm4wABLKgAAAAEBAcAAScAAAACkCmDAAER8AABcAT4EPRfAAEnSLqQKgMAASdrAWDUfwACu0j0cwABJ5S64fgEAAYDAAEn4wFg1HwDAAERnPRzAAEqxLsAAanYAAAAAwACu1z0XwABLFxbAAEsNLsAARUfAAK7RwABfIxbAAEsgLsAAXyPAAK7OwACRSAbAAK7XgdvAAEsvwABLNMAATAMAAMAAanYAAAABA8AAS0nAAEwDAAAAAAAAAFwBPgE9HMAAS14WwABLUi7AAGp0wACuzYP4AQABNMAAS2YDwABLZsAAS/4AAAABAQHAAEt4AAAAuIhgwABJzQAAYMAA/NkBPgI9HMAAS58WwABLmYDAAEuNwFg1/pn3wABFabjnAgACgMAAS6fAWDX+HMAAS8YWwABLwIDAAEu0wFg1/oJRwABFZ0sBAAGTAMAA/IMAwABFUz0cwABL5BbAAEvegMAAS9LAWDX+mffAAEVphFkBAAGAwABL68BYNf4AwABFUADAAPxCBsAArtiB28AATAjAAEwZwABNmQAAuIABasAATAlgwAD9HAIAAAEDwABMKMAATZkAAAABAQHAAEw1AAAAmfdgwABFKgAAXAE+A0/AAExCwABMRwAAAZqHYQFgwABFYVwAA8AATEzAAE1SAAAAAQEBwABMWgAAALiIYMAARWEAAFwBPgJOwABMdcAATHsAAMAAafRgwACusAEmwABMdQEcwABMiYLAAEx9wFg3B4RNAQABLgDAAEXTYMAArrBJwABMnRbAAEzuHMAATLiCwABMocBYNwe1DwEAARbAAEzOFsAATMIupMzAAK7PsHjAAE0YAMAARbyz8b25PgJAIRzAAE0Xg8AATRHAWDccSAEAASsAwACuvMAATRHAAE0eAD0cwABNLxbAAE0pLsAAXyPAAK7OgL8CAAKCwABNMMBYNweDwABNP8BYNxwAwAD8uj89HMAATV+AwABNWcBYNs248wEAAYHAAE1qwFg25gDAAEVZPRzAAE18gMAATXbAWDbNuPUBAAGBwABNj8BYNuYAwABFWgbAAK7ZgdvAAE2ewABNsMAAT80AALiGAWrAAE2fYMAA/RwCAAABA8AATcDAAE/NAAAAAQEBwABNzgAAALiIYMAARWEAAGDAAK6wAT4BScAATeEWwABONhzAAE36gMAATeXAWDhgtRIBAAEWwABOGBbAAE4MLqTMwACuz7B4wABNGADAAEW/s/G9uT4BSsAATlABHMAATlwWwABOVy6BVMAArtDAAGpXAgACFsAATn8WwABOei6BVMAArtDAAGpOwACuDBzAAE6NFsAATogugVTAAK7QwABqUgEAAYDAAE6ewFg4YADAAK4RAMAArhZJwABOuBbAAE8FHMAATtGAwABOvMBYOGC1DwEAARbAAE7nFsAATtsupMzAAK7PsHjAAE0YAMAARbyz8b25PgJOwABPMMAATzYAAICWYMAArmwBJsAATzABHMAATz0WwABPOC6BVMAArtDAAGpRAQABgMAAT1HAWDhgAMAArhBgwACubErAAE9lARzAAE9xFsAAT2wugVTAAK7QwABqVwIAAoHAAE+EwFg5WYHAAE+LwFg5WQDAAK4WPgFKwABPpgEcwABPshbAAE+tLoFUwACu0MAAalYAAAAAwACuFQbAAK7agdvAAE/SwABP5MAAU40AALhfAWrAAE/TYMAA/RwCAAABA8AAT+zAAFONAAAAAQEBwABP8gAAALjgYMAASG0AAGDAAK6wAT4GScAAT/0WwABQMBzAAFAFgMAAUAHAWDortQ8BAAEWwABQGxbAAFAPLqTMwACuz7B4wABNGADAAEW8tNa9vErAAFBKARzAAFBWFsAAUFEugVTAAK7QwABqVgAAAADAAK4VP0nAAFGCHMAAUZEWwABRioDAAFGGwFg6K4JRwABFZ4HUAQABNMAAUZUDwABRlcAAUeMAAAABAQHAAFGWAAAAYmDAAEVhAABgwAD6CgFKwABRpAEWwABR0RzAAFGmgcAAUaTAWDrbtQ8BAAEWwABRvBbAAFGwLqTMwACuz7B4wABNGADAAEW8tNa9vADAAPxHPgFKwABR7gEcwABR+hbAAFH1LoFUwACu0MAAalYAAAAAwACuFT9JwABSFxzAAFIlFsAAUh+AwABSG8BYOiuZ98AARWm4owAAAADAAEVDPgNOwABSQ8AAUkkAAMAAafRgwACusAEcwABSiR/AAFJZwACu/wMAAxbAAFJuLqTMwACuzxbAAFJ7LsAAXyPAAK7OFsAAUoMugVTAAK7QAIKbAQABgMAAUo3AWDorAMAArvdJ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wABIfErAAIenARzAAIezFsAAh64ugVTAAK7QwABqVgAAAADAAK4VP0nAAIfKJcAAh9iBwACHzsBYZd1gwABIgUrAAIfmARzAAIfyFsAAh+0ugVTAAK7QwABqVgAAAADAAK4VP07AAIgWwACIHAAAhbFgwABFYQEmwACIFgEWwACIKIHAAIgewFhl3YWxAGDAAEVhTsAAiEDAAIhFAACFr2DAAEVhASbAAIhAARbAAIhRgcAAiEfAWGXdha8AYMAARWFJwACIWxbAAIiPHMAAiGSDwACIX8BYZqi1DwEAARbAAIh6FsAAiG4upMzAAK7PsHjAAE0YAMAARby01r28PgFKwACIqwEcwACItxbAAIiyLoFUwACu0MAAalYAAAAAwACuFT9JwACI1BbAAIkJHMAAiN6CwACI2MBYZnm1DwEAARbAAIj0FsAAiOgupMzAAK7PsHjAAE0YAMAARby01r28PgFKwACJJQEcwACJMRbAAIksLoFUwACu0MAAalYAAAAAwACuFT9OwACJVcAAiWAAAMAAan5gwACusAEcwACJaBbAAIliLsAAXyPAAK7OSwEAAYLAAIlpwFhmeQDAAPy5TsAAiXvAAImFAADAAGp/YMAArrABHMAAiY0WwACJhy7AAF8jwACuzksBAAGDwACJjsBYZqgAwAD8uU7AAImzwACJvQAAnMFgwABpBQEmwACJswEcwACJyYHAAIm/wFhl3ZzBAAAAAABgwABpBU7AAIn0wACJ/QAAwABqiWDAAGkFAR7AAIn/wACu6wEAASbAAIoNAYbAAIoNwFhoEWDAAGkPAEnAAIpuHMAAipgWwACKkRbAAIqEFsAAinmAwACKcsBYZcK5f8AARjO4osAARTZhwAD8o0gBAAGUAMAA/PM+BUAcwACKzxzAAIrLFsAAir8WwACKtIDAAIqtwFhlwrl/wABGM7iiwABFNksBAAGTAMAA/INIAQABFsAAitmAwACK0sBYZcKZ98AARWkAwAD9KcAAiq3AAIreAE7AAItFwACLSwAAwABp9GDAAK6wARzAAItNLsAAaogDAAMmwACLZQGGwACLZcBYaBFgwABpD4XAAItwwFhn14TAAIt7wFhnnQDAAK7sScAAi44hHMAAi5yFwACLksBYZ9dIAQABFMAAi5/AWGkTCAAAwACuvD4CTsAAi73AAIvJAAC4iGDA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PgRJwACYFBzAAJgiFsAAmByAwACYGMBYdA6Z98AARWm4owAAAADAAEVDSsAAmDIBKz9OwACYSQAAAMAAao9gwACusABGwACYV8AAmH7AAJhpAAAAgXtgwABFYQAWwACYdoDAAJhywFh0DoJRwABFZz4DTsAAmIzAAJiXAADAAGqQYMAArrABHMAAmJkumocBAAGCwACYn8BYdHEAwACu+EnAAJitHMAAmLyDwACYscBYdJdIAQABKwDAAK68SsAAmMUBKz9JwACY2BzAAJjlgcAAmNzAWHRXSAEAASsAwACuvD4BPYnAAJj4wFh0V4PAAJkDwFh0lz4BPYnAAJkmwFh0VxzAAJk6gcAAmTHAWHRXlvwBAAGDwACZQMBYdJcAwACutkrAAJlfAYHAAJlmwFh0VwbAAK76gdvAAJl3wACZicAAmdgAALi5AWrAAJl4YMAA/RwCAAABA8AAmZPAAJnYAAAAAQEBwACZmwAAALiIYMAARhIAAGDAAK6wAT4BSsAAma4BHMAAmbUumocBAAEWwACZx4DAAJm7wFh1jLjrwABGFADAAK74BsAArvuB28AAmd3AAJnvwACaOQAAuDIBasAAmd5gwAD9HAIAAAEDwACZ98AAmjkAAAABAQHAAJn9AAAAnMFgwABHVQAAYMAArrABPgFKwACaDgEcwACaFS7AAGqEAQABgMAAmivAWHYDAMAArv0GwACu/IHbwACaPsAAmlDAAJqkAAC4agFqwACaP2DAAP0cAgAAAQPAAJpdwACapAAAAAEBAcAAmmgAAACcwWDAAEdwAABgwACusAE+AUrAAJp5ARzAAJqALsAAaoQBAAGAwACalsBYdnEAwACu/QbAAK79gdvAAJqpwACar8AAnAIAAMAAaoQAAAABA8AAmsTAAJwCAAAAAQEBwACa1wAAALiIYMAAR1AAAGDAAK6wAT4FTsAAmvDAAJr6AADAAGp/YMAArrABHMAAmvwumocBAAEWwACbDoDAAJsCwFh21oWvwABHSgDAAK74TsAAmx/AAJsqAADAAGp+YMAArrABHMAAmywumocBAAEWwACbPoDAAJsywFh21oWxwABHSwDAAK74ScAAm0oiHMAAm1iBwACbTsBYdu9IAQABKwDAAK68ARzAAJtugsAAm2PAWHcoSAEAASsAwACuvErAAJt3ASs/TsAAm6jAAJuy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AAAAAF3AAPwyAV8BAAFKwABF2wEWwABF5BbAAEXbLsAAa3bAALH+wACyzinAAPzIBsAAsteB78AARe/AAEX2wABGZgAAljIAAAABA8AARf3AAEZmAAABAACCdmDAAP0cAVsAAAAAXcAA/WcBXwIAAT4CScAARgYlwABGDy5dwAD9ZwFfAgA+AUrAAEYiASbAAEYuAC5dwAD9ZwFfAgA/SsAARkMBHsAARk7AAP1xAQJfAQBfAgABLgAGwACy2IHvwABGa8AARnDAAEcWAACDFwAAAAEDwABGeMAARxYAAAABAQHAAEaAAAAAliBgwAD9HAAAYMAA+goBPgNJwABGjyIhHMAARpuAwABGk8BZ/sdIAQABKwDAAP0pACElwABGroDAAEamwFn+x18BAErAAEa1ASo/TsAARsvAAEbPAACD0V8AAAEcwABG0S7AAGt5wACx/gEAASbAAEbmAIDAAEbewFn+x18BAADAALLPSsAARvIBHMAARwIWwABG+S7AAGt2wACx/sAAss6HQQEAAYHAAEcOwFn/GgDAAPy4BsAAstOB78AARxvAAEckwABHPwEAgVUAAAABA8AARyzAAEc/AAAAAAAAAGDAAPoKAUrAAEcvARbAAEc4FsAARy8uwABrdsAAsf7AALLOgVXAAPzKBsAAstSB78AAR0TAAEdNwABHbgEAg7IAAAABA8AAR1jAAEduAAAAAAAAAGDAAPoKAUrAAEdbARbAAEdkFsAAR1suwABrdsAAsf7AALLOg7LAAPzLBsAAstWB78AAR3PAAEd7wABHlAEAYQAAAAEDwABHgsAAR5QAAAAAAAAAYMAA+9ABSsAAR4UBFsAAR44WwABHhS7AAGt2wACx/sAAss5hwAD8yQbAALLZge/AAEeZwABHoMAAR8AAACMAAAABA8AAR6jAAEfAAAAAAAAAAGDAAP22AUrAAEeuARzAAEe2HMAAR64ulRMAAAAAwACyIiMAAAAAwAD8UgbAALLage/AAEfFwABHysAASHwAAFYAAAABA8AAR83AAEh8AAAAAQEBwABH0AAAIICWXwEAAABgwAD6CgE+BE7AAEffwABH4wAAg9FfAAABHMAAR+UuwABrecAAsf4BAAGAwABH8sBaAPkAwACyz07AAEgDwABICgAAgXZgwAD6CgEqPRzAAEggFsAASBcuwABrdsAAsf7AALLOmRUCAAKBwABILMBaARA0wABIMQPAAEgxwABIZAAAAAAAAABfAQABPgI9isAASDzAWgFAKUrAAEhRAYDAAEhYwFoA+QDAAPzASsAASGsBgsAASHLAWgFABsAAstuB78AASIHAAEiGwABIuwAAgKUAAAABA8AASIzAAEi7AAAAAQEBwABImQAAIIg/XcAA/DIBXwEAAABcAUrAAEimARzAAEivgMAASKbAWgHsg/gBAAEWwABIty5WwACy2gDAAPxCBsAAstyB78AASMDAAEjFwABI4AAAgkIAAAABA8AASMrAAEjgAAAAAAAAAFwBSsAASNABHMAASNkWwABI0C7AAGt2wACx/sAAss6CQgAAAADAAPzDBsAAst2B78AASOXAAEjqwABJJgAAhAIAAAABA8AASPXAAEkmAAAAAQEBwABJBwAAAIPWXcAA/DIBYMAA/RwAAGDAAPoKAUrAAEkRARzAAEkXgMAASRHAWgKpljABAAEWwABJHS6DF8AAstgAwAD8RQbAALLege/AAEqmwABKrcAASwgAAJb+AAAAAQPAAEq3wABLCAAAAAEBAcAASsQAAACD1l3AAP1nAWDAAP0cAABdwAD9ZwFfAQABSsAAStQBHMAASwEcwABK1C6BpQEAATTAAEraA8AAStrAAEr/AAAAAQEBwABK2wAAAJYgXwEAAABgwAD6CgFKwABK5wEhHMAASu6AwABK6MBaAxmDFwEAAYHAAEr3wFoDYwDAAP1zAMAAsiOVEwAAAADAAPxJBsAAst+B78AATIbAAEyNwABMzQAAlv0AAAABA8AATJnAAEzNAAAAAQEBwABMpgAAAIPWXcAA/WcBYMAA/RwAAF3AAP1nAV8BAAFKwABMsAEcwABMxhzAAEywLoGlAQABFsAATLyAwABMtsBaA9iDF8AA/XMAwACyI5UTAAAAAMAA/EkGwACy4IHvwABM0sAATNTAAE1rAACW9gAAAAEDwABM2sAATWsAAAABAQHAAEziAAAAliBgwAD9HAAAXwEAAT4DScAATPEiIRzAAEz9gMAATPXAWgRbSAEAASsAwAD9KQAhJcAATRCAwABNCMBaBFtfAQBKwABNFwErP07AAE0swABNMAAAg9FfAAABHMAATTIuwABrecAAsf4BAAEmwABNRwCAwABNP8BaBFtfAQAAwACyz0rAAE1TARzAAE1iFsAATVouwABrdsAAsf7AALLOSwEAAYHAAE1jwFoErADAAPy5BsAAsuGB78AATXDAAE11wABOUAAAhFkAAAABA8AATXvAAE5QAAAAAQEBwABNgwAAAJYgYMAA/RwAAGDAAPoKAT4FScAATZIiIRzAAE2egMAATZbAWgU9SAEAASsAwAD9KQAhJcAATbGAwABNqcBaBT1fAQBKwABNuAEqP07AAE3OwABN0gAAg9FfAAABHMAATdQuwABrecAAsf4BAAEmwABN6QCAwABN4cBaBT1fAQAAwACyz0nAAE31IRzAAE4DFsAATfouwABrdsAAsf7AALLOh0EBAAGBwABOD8BaBZAAwAD8uErAAE4VASo/PRzAAE4wFsAATicuwABrdsAAsf7AALLOhFkBAAGBwABON8BaBZAAwAD8wkrAAE5BASkGwACy4oHvwABOVcAATlrAAE6aAACW9wAAAAEDwABOY8AATpoAAAABAQHAAE51AAAAiD9dwAD8MgFgwAD9HAAAXAFKwABOggEcwABOi4DAAE6CwFoGXIP4AQABFsAATpMuhFnAALLhAMAA/EIGwACy44HvwABOn8AATqTAAE9eAACW+AAAAAEDwABOr8AAT14AAAABAQHAAE61AAAAlvlhAV8BAGDAAPoKAABcAT4DTsAATtDAAE7ZAADAAGt7XcAA/HQBWwExwABO21sAPRzAAE7sFsAATuMuwABrdsAAsf7AALLOg/gBAAE0wABO9APAAE70wABPMgAAAAICAsAATvUAAACD0V8AAADAAE76AAAAgJZfAQAAAGDAAPzZAT4BScAATwkcwABPEYDAAE8NwFoGyCABAAGDwABPEsBaBz0AAD0cwABPI4HAAE8awFoG4lYBAAGCwABPJ8BaBzAAwAD8hT8AwAD8xD0cwABPQoHAAE85wFoG4oP4AQABFsAAT1MWwABPSi7AAGt2wACx/sAAss6EWcAA/MIAwAD8QgbAALLkge/AAE9jwABPaMAAUVAAAJb6AAAAAQPAAE9xwABRUAAAAAEBAcAAT4MAAACIP13AAPwyAWDAAP0cAABcAT4FTsAAT5fAAE+mAADAAGt8XcAA/WcBXwEAAR7AAE+swADA4wABXwEAAABGwABPwwDAAE/MAAAAliBgwAD9HACAwABP18BaB/xBPgRJwABP6SIhHMAAT/WCwABP7cBaCEVIAQABKwDAAP0pACElwABQCILAAFAAwFoIRV8BAELAAFAPAD9OwABQI8AAUCcAAIPRXwAAARzAAFApLsAAa3nAALH+AQABJsAAUD4AgsAAUDbAWghFXwEAAMAAss9JwABQTCEcwABQWhbAAFBRLsAAa3bAALH+wACyzodBAQABg8AAUGbAWgiaAMAA/LhCwABQbAA/PRzAAFCLgcAAUHzAWggXVgEAARzAAFCXFsAAUI8uwABrdsAAsf7AALLOSwEAAYPAAFCYwFoImgDAAPy5AMAA/XROwABQrsAAULsAAMAAa31dwAD8dAFbATHAAFC9WwA9HMAAUM4WwABQxS7AAGt2wACx/sAAss6D+AEAATTAAFDWA8AAUNbAAFEgAAAAAgICwABQ1wAAAIP5XwAAAMAAUNoAAACA8l8BAAAAYMAA/NkBPgFJwABQ5SEcwABQ+YHAAFDqwFoIF4MXAQABhMAAUQLAWgmmAMAA/XM9HMAAUROCwABRBsBaCUtWAQABg8AAURfAWgmZAMAA/IU/AMAA/MQ9HMAAUTSCwABRJ8BaCUuD+AEAARbAAFFFFsAAUTwuwABrdsAAsf7AALLOhFnAAPzCAMAA/EIGwACy5YHvwABRVcAAUVrAAFGtAACW+wAAAAEDwABRZcAAUa0AAAABAQHAAFFrAAAAlvlhAV8BAGDAAPoKAABcAUrAAFGFARzAAFGFLpb4AQABNMAAUZEDwABRkcAAUawAAAABAQHAAFGSAAAAliBfAQAAAGDAAPoKAUrAAFGeASEcwABRo4DAAFGfwFoKaiABAAGBwABRpMBaCqYAAADAALLjBsAAsuaB78AAUbLAAFHHwABR7gAAljsBasAAUbNgwAD5vYXSAAABA8AAUdDAAFHuAAABAACCdmDAAP0cAVsAAAAAXcAA/WcBXwIAAUrAAFHWAR7AAFHawAD9cQECXwEAXwIAAS4ABsAAsueB78AAU03AAFNUwABTgQAAlvwAAAABA8AAU1nAAFOBAAAAAQEBwABTYQAAIIPWXcAA/WcBXwEAAABdwAD9ZwFfAQABSsAAU2sBNcAAU2sAAAEAXcAA/WcBXwEAARzAAFNrLpUTAAAAAMAAsiI1AAAAAQBbARzAAFN0gcAAU3LAWguYgKUBAAGAwABTe8BaC3MAwAD9dYEAwFoLmAAAWf23AFn+FABZ/p0AWf+CAFn/1gBaACoAWgB8AFoA0ABaAcIAWgIrAFoCfwBaAu8AWgOuAFoEMQBaBRMAWgYyAFoGngBaB9IAWgpAAFoK4wBaC0kAWgvpAAAAFQAAAYHvAFoMSABZwCkAWczyAFnOCgBZ3Q0AWeRYAFnpyABZ874AWfbmAFn8iwBaDEYAAAAJAFoMSAAAAAAAAADAALLqwABrfoHwAAABgnwAAMAAz9WDMQAAAAAFAsAAsuuB8IKZgqiOHwethQABAACD42DAAP0cAVsBYMAA/RwAAAABBcAAsvoAAAAABAAAAwAAAAAAAAAAAF3AALLrAV8AAAE/AQkBAMAA/TIAAAAACwbAALLtgfCCtYLFgsoBAocsAAAAAQOCyoLKAAAAAAAAAF3AAPwyAV8AAAAGwACy7oHwgs6C14LeAQKBVQAAAAEDgt6C3gAAAAAAAABgwAD6CgAGwACy74HwguKC6oLzAQLAAGt/AAAAAQOC84LzAAAAAAAAAGDAAPvQAAbAALLxgfCC94MDgxYAAsAAa4AAAAABA4MMgxYAAAABAQGDDwAAIINEXwAAAABdwAD8MgFfAAAABsAAsvKB8IMagyaDOQACwABrgQAAAAEDgy+DOQAAAAEBAYMyAAAgg0RfAAAAAF3AAPwyAV8AAAAGwACy84HwhHWEg4UAAADAAGuCAAAAAQOEmYUAAAAAAAAAAF3AAPx0AV3AAPx0AV8AAAE+Ak6EsIS3AADAAGuDXcAAsxcBXwAAAR+EvcAAsycBAV8AAAEuAEqE1gEchOSAhN3AWg4YwABrggAAAADAALMlBsAAsvSB8IU9hUKGRgAAwABrhAAAAAEDhU6GRgAAAAICAoVRAAAgg0RfAAAAhVsAACCCRV8AAAAAYMAA+goBPgNOhXCFdQAAqYBdwAD9ZwFfAAABHoV7wADA4gABXwAAAABPhYmFjgAAAZVWYQFfAABgwAD6CgADhZSGJgAAAAEBAYWXAAAAg+5fAAAAAGDAAPoKAT4DSYWlHoWpwAD1sQIAAoSFs8BaDteBhbnAWg6CAEqFwgEpP0mF1SEchd+ChdrAWg6XVgEAAYSF48BaDtcAwAD9dEqF6gEqP0qF/gEchhUchgUuwABrgAEAAYSGD8BaDtcAwACy8YHUAQABg4YZwFoOugDAAPxHSoYtARyGOoOGNMBaDrogAQABgIY7wFoOdwAABsAAsvWB8IaIhpSHhgAAwABrhQAAAAEDhp2HhgABAAEBAYagAAAghtJfAAAAAF3AAPwyAV8AAAE+BE4AAAAAgc1bAZNOAAAAAIHOWwBPhpQAAAAAiLNbAAOGnYeGBAAAAQEBAAAAAIi0XcAA9bwBXwAAAABgwAD6CgE+Aj4DToa2hrsAAKmAXcAA/WcBXwAAAR6GwcAAwOIAAV8AAAAAT4bPhtsAAAGVVmEBXwAAXcAA/DIBXwAAAAOG4YdoAAEAAQEBhuQAAACDo18AAAAAXcAA/DIBXwAAAT4ETgAAAACBzVsBk04AAAAAgc5bAE+GzwAAAACIs1sAA4bhh2gEAAABAQEAAAAAiLRdwAD1vAFfAAAAAGDAAPoKAT4CPgNJhvUhHIb/hYb6wFoP+lYBAAGHhwPAWhA+AMAA/XRKhwcBKj9GhxWHMYceAAAAg3tfAAAAHIcjLsAAa4ABAAGHhy3AWhA+AMAAsvE+AT4CPRcAFADAWhB/CwCcWcAA9XMch0iGh0LAWhAdIAEAARSHScBaEMMMAAAAwAD1wk2HOwIpPgI9FwAUAMBaEH8LAIi1wAD1c4eHYcBaED7AAPXBTYdbAilKh2gBKkoAAR8AwAD1uwEBXwAAARQAwFoQbAoAAD4CPRcAhADAWg/enFnAAPVzHId8hod2wFoQHSABAAGAh33AWg+dAADAAPXCTYdvAilKh4YBKkoAAR8AwAD1uwEBXwAAAYMAwFoPywAGwACy9oHwh9WH4Yj7AADAAFzxAAAAAQOH6Yj7AAEAAQEBh+wAACCG0l8AAAAAXcAA/DIBXwAAAT4ETgAAAACBzVsBk04AAAAAgc5bAE+H4QAAAACIs1sAA4fpiPsEAAABAQEAAAAAiLRdwAD1vAFfAAAAAGDAAPoKAT4CPgNOiAKIBwAAqYBdwAD9ZwFfAAABHogNwADA4gABXwAAAABOiB+IJQAAoM1dwAD8dAFfAAABMYgqXwAAAYCIK8BaEcpDiDYWiEOGiD3AWhJIg7LAAPxXPgJOiFuIYAAAg7BfAAABHIhohohiwFoSSIYRAAAAAMAA/JNJiHwhHIiGhYiBwFoSJ4MXAQABh4iPwFoSfgDAAP1zPgM9HIilhYigwFoSJ1YBAAGHiKnAWhJ+AMAA/XQ+Aj0XAIQAwFoSC4i1wAD1c4eIvsBaEn7AAPXBTYi4Aik9HIjShojMwFoSSIClAQABHIjZLsAAa4ABAAGHiOPAWhJ+AMAAsvEAwAD8hj9KiPsBKkoAAR8AwAD1uwEBXwAAAYMAwFoR+AAGwACy94HwiceJz4prAADAAGuGAAAAAQOJ4oprAAAAAQEBieUAACCD7l8AAAAAXcAA/HQBXwAAAT4DQCEcif2AifjAWhNlSAEAASsAwAD9KYn4igQATooZiiAAAMAAa4NdwACzFwFfAAABH4omwACzJwEBXwAAAS4ASoo/ARyKTYGKRsBaE5nAAGuHwACy6gEAAYCKYsBaE2UAwACzIQbAALL4gfCNFY0ejh0AAMAAa4gAAAABA40rjh0AAAABAQGNLgAAIIbSXwAAAABdwACy6wFfAAABPgROjT6NQwAAwABriV3AAPylAl8AAF8AAAEWjW01jUoAAAEAXcAAsygBXwAAAR+NSsAAszMBAV8AAAEuADUAAAABAFsBHI1igY1gwFoUN4KbAQABgI1mwFoUAwDAALMvgQDAWhQ3wABrisAAsyxOjYqNkAAApApdwACy+wFfAAABH42WwACzDgABXwAAAABGja6NyI21AAAAg+5fAAAAFo3CgY29wFoUHINiwAD8xz4BSY3QIRyN2YON1MBaFK1IAQABgI3cwFoUAwDAAP0pPRyN6IKN4sBaFIjAAGI1AgACHI30gY3wwFoUHEsBAAGDjfXAWhStAMAA/LmDjfzAWhStAMAAswg/So4NAYKOFMBaFIgAAFoM9wBaDSIAWg1JAFoNcgBaDaoAWg3iAFoOVQBaD3sAWhGoAFoTQwBaE+EAWhUsAAAACwLAALL7gfCOIo4olRgDwABriwABAACD42DAAP0cAVsBXcAAsusBXwAAAAADBMAAsv6B8I53jpRYwABrjMAAsuoAXcAA/KUCXwAAXcAA/WcBXwAAAR6OhMAA/KwAAl8AAF3AAP1nAV8AAAAABMAAsv+B8I7FjuVYwABrjcAAsuoAXcAA/KUCXwAAXcAA/WcBXwAAAR6O1cAA/KwAAl8AAF3AAP1nAV8AAAAABMAAswCB8I9lj3pJsivAALLqAF3AAP1nAV8AAAEej3LAAMDiAAFfAAAAAAEFwACzDgAAAAAEAAADAAAAAAAAAAAAXcAAsvsBXwAAAT8BCQEAwACy+gAAAAAKBsAAswKB8I7qjvqPDgEAhywAAAABA48Ajw4AAAAAAAAAXcAA/DIBXwAAAUqPAwEWjwoWjwMuwABrjMAAsurAALL+g2LAAPzHBsAAswOB8I8SjxuPNAEAgVUAAAABA48jjzQAAAAAAAAAYMAA+goBSo8mARaPLRaPJi7AAGuMwACy6sAAsv6BVcAA/MoGwACzBIHwjziPQI9aAQDAAGt/AAAAAQOPSo9aAAAAAAAAAGDAAPvQAUqPTQEWj1QWj00uwABrjMAAsurAALL+YcAA/MkGwACzBoHwj3+Pi4+6AADAAGuAAAAAAQOPlI+6AAAAAQEBj5cAACCDRF8AAAAAXcAA/DIBXwAAAUqPogE1AAAAAQBdwAD9ZwFfAAABHI+oFo+iLsAAa4zAALLqwACy/ksBAAGAj6nAWhdYAMAA/LkjHI+xgQDAWhdzSAEAASsAABaPtC6yK8AAsurAALMAgQDAWhdzAV3AAP1nAV8AAAbAALMHgfCPvo/Kj/wAAMAAa4EAAAABA4/Tj/wAAAABAQGP1gAAIINEXwAAAABdwAD8MgFfAAABSo/hATUAAAABAF3AAP1nAV8AAAEcj+oWj+EuwABrjcAAsurAALL/SwEAAYCP68BaF/YAwAD8uSMcj/OBAMBaGBFIAQABKwAAFo/2LrIrwACy6sAAswCBAMBaGBEBXcAA/WcBXwAABsAAswiB8JABkAaQywAAwABiNQAAAAEDkA2QywAAAAICApAQAAAgg0RfAAAAkBoAACCCRV8AAAAAXAE+BkAhHJA2gJAvwFoYlEgBAAErAMAA/SmQL5A9AEAhHJBSgZBLwFoYn0gBAAErAMAA/SmQS5BZAD0ckGAuwABY2wEAAYCQaMBaGJQAwACzCT0ckHUuwABY2wEAAYGQfcBaGJ8AwACzCT0ckJkckJAWkIouwABrjMAAsurAALL+SwEAAYCQkcBaGJQAwAD8uVYBAAGBkJ3AWhifAMAA/XQ9HJC8HJCzFpCqLsAAa43AALLqwACy/0sBAAGBkLTAWhifAMAA/LlWAQABgJDAwFoYlADAAP10BsAAswmB8JDQkNWRagAAwABY2wAAAAEDkNyRagAAAAEBAZDfAAAgg+5fAAAAAFwBPgNAIRyQ94CQ8sBaGaVIAQABKwDAAP0pkPKQ/gA9HJEMFpEFLsAAa4zAALLqwACy/pkVAgACgJEYwFoZpTSRHgORHpEwAAAAAAAAAF3AAP1nAV8AAAFKkSQBHpEowADA4gABXwAAAAAAwAD8wD0ckUEWkTcuwABrjcAAsurAALL/mRUCAAKAkU3AWhmlNJFTA5FTkWUAAAAAAAAAXcAA/WcBXwAAAUqRWQEekV3AAMDiAAFfAAAAAADAAPzABsAAswqB8JKIko2S1AAAwABrjgAAAAEDkpeS1AAAAAICApKaAAAgg0RfAAAAkqQAACCCRV8AAAAAXAE+AT01AAAAAQBdwAD9ZwFfAAABHJK4FpKyLsAAa4zAALLqwACy/ksBAAGAkrnAWhqSAMAA/LkjHJLCggDAWhqvSAEAASsAACscksKCAMBaGq+EWQEAAYGSycBaGp0AwAD9dgFgwAD6CgbAALMLgfCTbpNzlDIAAMAAa48AAAABA5N9lDIAAAABAQGTgAAAIIPuXwAAAABcAT4EPRyTkxaTjC7AAGuMwACy6sAAsv6EWQEAAYCTmsBaGzUAwAD8wk6TqZOxAACVbl3AAP1nAV8AAAEck7wWk7MuwABrjcAAsurAALL/SwEAAYCTvcBaGzUAwAD8uUmTyByT1IGTzMBaG2tIAQABKwDAAP0pSpPdAD9Gk+mUBZPyAAAAg0RfAAAAgZP8wFobaz4BPRyUHByUExaUDS7AAGuMwACy6sAAsv5LAQABgpQUwFobwQDAAPy5hFkBAAGAlCPAWhs1AMAA/XYGwACzDIHwlNeU3JUWAADAAGuQAAAAAQOU6pUWAAAAAQEBlPMAACCHLF3AAPx0AV8AAAAAXAFKlP0BHJUDgJT9wFocL4P4AQABFpULLsAAa4/AALMLAMAA/EIAAFoWZQBaFq0AWhbxAFoXNgBaF9QAWhhyAFoZgwBaGnAAWhsTAFocDQBaHGcAAAAKAsAAsw+B8JW2lbyXwAPAAGuRAAEAAIPjYMAA/RwBWwFgwAD9HAAABATAALMRgfCWBZYOGCcAYMAA+9ABkwTAALMSgfCWQZZMGMAAa5IAYMAA+9ABkwTAALMTgfCXApcRGMAAax8AYMAA+goBKgTAALMUgfCXVJddWIJVAF3AAPx0AV8AAAErAQXAALMWgfCXYpdil74AAAADl2uXvgAAAAEBAZdwAAAAmp5gwAD70AAAXcAAsw8BXwAAAT8ECADAALMRgJeHwFodOwgAwACzEoCXoMBaHTsIAMAAsxMqCQGXYsAA/TIAAAAAAAAAWh2DAAAAAALAALMXgfCYI5gpou4DwABrkwABAACD42DAAP0cAVsBYMAA/RwAAAUEwACzGoHwmGaYbAnAAF8xwACy6gBdwACy6wFfAAAABMAAsxuB8JizmL0YlxbAALLqAGDAAPvQAZMEwACzHIHwmQ6ZJFi0GcAAsuoAXcAA/HQBXwAAAR6ZG8AA924BAV8AAAGTAATAALMdgfCZa5mGWMAAT2nAALLqAF3AAPylAl8AAF3AALMPAV8AAAEymYRfAABdwACzDwFfAAAABMAAsx6B8JpsmpBYwABrlMAAsuoAXcAA/HQBXcAA/HQBXwAAAR6agcAA924BAV3AAPx0AV8AAAGTAAEFwACzJ4HwmpWalZqsAAAAA5qfmqwAAAABAQGapQAABMAAXzFdwACy6wFfAAAAAF3AALMXAV8AAAE/AggBwACzGoAAwFoepwkBmpXAAP0yAAAAAAUGwACzIYHwmzCbOJt2AADAAGuHwACy6gAAAAEDm0ybdgAAAAEBAZtPAAAgg+5fAAAAAF3AAPx0AV8AAAFKm1gBFpttHJtYLsAAa5XAALLqAQABgJtnwFofBgDAALMkglXAALMUBsAAsyWB8JyOnJydUQAAwABrggAAAAEDnLKdUQAAAAAAAABdwAD8dAFdwAD8dAFfAAABPgJGnLuc2JzCAAAAg+5fAAAAFpzRFpzKLsAAXzHAALLqwACzGocswACy7T4CTpzknO0AAMAAa5ZdwACzDwFfAAABHJz0FpzvLsAAT2nAALLqwACzHUsBAAGAnPXAWh9+AMAA/LlJnQIcnQ+BnQbAWh+lSAEAASsAwAD9KT0cnRguwABrlcAAsuoBAAGAnSfAWh9+AMAAsyQ/Sp04ARadPy7AAGuUwACy6sAAsx4GwACzIoHwnZOdlZ4DAADAAGuXwACy6gAAAAEDnZmeAwAAAAAAAABfAAABPgNOnaSdqQAAg+5fAAABHJ2yFp2rLrQZwACy6sAAsxyfwwEAARydyRadwhaduy60GcAAsurAALMcYcAA/KOBjQEAAZQAwAD89gDAAPySPRed3xyd2Bad0y7AAE9pwACy6sAAsx1LAQABgJ3ZwFogUgDAAPy5wABrHyrAALMTSp30AYCd+8BaIFIGwACzI4Hwni+eNJ58AADAAGuYwACy6gAAAAEDnjmefAAAAAEBAZ48AAAgg+5fAAAAAFwBPgI9F55UHJ5NFp5ILsAAT2nAALLqwACzHUsBAAGAnk7AWiD+AMAA/LnAAGsfKcAAsxM9HJ5vFp5oLrQZwACy6sAAsxxWAQABgJ5zwFog/gDAAPyFBsAAsySB8J8xnz6i7AAAwABrlcAAsuoAAAABA59MouwAAAABAQGfTwAAIIDyXwAAAABdwACzDwFfAAABPgZOn5qfoAAAwABrmV3AALMPAV8AAAEfn6bAALMWAQFfAAABNQAAAAEAYMAA+9ABFp+zLpcWwACy6sAAsxs1AAAAAQBgwAD70AEXn7MulxbAALLqHJ+5gQDAWiHBZAEAAZQAwAD89cAAsxuBAMBaIcEAPRyfxxafwi7AAE9pwACy6sAAsx2AvwIAAoCfyMBaIYaBn83AWiGfAMAA/Lo9HJ/YLsAAa5jAALLqAQABgJ/ewFohhgDAALMjRp/noAif7gAAAMAAa5pfAAAAHJ/6Fp/zLsAAXzHAALLqwACzGsAAa4ABAAGAoATAWiGGAMAAsvE+Ak6gFKAaAADAAGubXcAAsw8BXwAAARygIRagHC7AAE9pwACy6sAAsx1LAQABgqAiwFoiWwDAAPy5SaAsHKA2g6AwwFoikUgBAAErAMAA/Sk+Aj2LoIjAWiKRHKCQLsAAa5XAALLqAQABgqCfwFoiWwDAALMkPRegsYGgq8BaIZ/AAGuSHqC7wADP7wIBYMAA+9ACFqDKgaDEwFohn8AAa5LAALMSFqDZg6DTwFoikcAAa5LAALMSAMAAsxJJoPAWoPqDoPTAWiKRwABrH8AAsxM+AT0XoVWBoU/AWiGfwABrkh6hX8AAz+8CAWDAAPvQAhahboGhaMBaIZ/AAGuSwACzEhahfYOhd8BaIpEnwACzEQDAALMSP0mh1hyh6Bah4IGh2sBaIZ/AAGuSwACzEkgBAAEWofGBoevAWiGfJ8AAsxEAwAD88z4ETqIEog4AAIJVXcAA/HQBXwAAAR6iFMAA924BAV8AAAGTAE6iJwAAAMAAa5pfAAAARKIwPgM9i6I9wFoj/ByiQS7AAGuXwACy6gAAAADAALMiPRyiW4KiUcBaI9pWAQABg6JfwFoj/ADAAPyFPReidByicBaiay7AAE9pwACy6sAAsx1LAQABg6JxwFoj/ADAAPy5glWCooDAWiPawACzFCEeopvAAPWxAgACg6KlwFoj/ICiqMBaIYYAPRyiwhaisy7AAGuUwACy6sAAsx5WAQABgqLGwFoj2gDAAPyFP0qi3AGBouPAWiGfAABaHuAAWh9EAFogJABaINgAWiFgAFokwwAAAAUCwACzKIHwo2ujcajdA8AAa5wAAQAAg+NgwAD9HAFbAWDAAP0cAAADBMAAsyuB8KOYo54JwABfMcAAsuoAXcAAsusBXwAAAATAALMsgfCjrKPEWMAAa4oAXcAA/KUCXwAAXwAAATKjwl8AAF8AAAAEwACzLYHwo9Sj5FjAAGudAF3AAPylAl8AAGDAAPvQATKj4l8AAGDAAPvQAAEFwACzM4Hwo+ij6KQFAAAAA6P4pAUAAAABAQGj/gAABMAAXzFdwACy6wFfAAAAAF3AALMoAV8AAAE/AggBwACzK4AAwFollwkBo+jAAP0yAAAAAAIGwACzL4HwpAqkCqdqAACCmwAAAAEDpA2nagAAAAEBAaQQAAAghtJfAAAAAFsBPgc9HKQvFqQcLsAAa4rAALMsgL8CAAKApDDAWiXwgKQ4wFol8ADAAPy6TqRHpE8AAK2SYMAA+goBKU6kX6RhAABiYMAA+9ABk06kbqR/AADAAGueXcAA/HQBXwAAARykmBykiBakgS7AAF8xwACy6sAAsyvAAGuFAQABgKSSwFol8ADAALL1gK0AAAAAwAD8SEakpqTGpK8AAACDo18AAACDpLTAWiZIPgE9HKTZFqTOLsAAa53AALMtgL8CAAKEpNrAWiaUNQAAAAEAYMAA+9ABgqTfwFomOTUAAAABAGDAAPvQAYqk38BaJjkcpOCFAMBaJsVkAQABlADAAPz1hQDAWibFAMAA/LpOpPKlCwAAwABrn13AAPwyAV8AAAEWpR6DpQ3AWiZImILAAPykQ6UsgaUzwFomKT4CPYmlRMBaJikqRqVbAKVkAAAAg6NfAAAAhKVpwFonCUE+BUmljRylk4WlkcBaJ0ZIAQABgKWWwFol8ADAAP0pQqWcAD9OpbOluQAAgxlgwAD6CgEpTqXLAAAAwABroF8AAABGpdml/KXiAAAAgNRfAAAAHKXuFqXnLsAAXzHAALLqwACzK8AAa4EBAAGFpfjAWidGAMAAsvI+AUmmCCEcpiMcph8WpgwuwABrisAAsyxLAQABFKYgwFonoAgAAMAA/LlIAQABKwDAAP0pPgFJpjqGpj7AWid+PgI9j6ZVwFonjhSmXMBaJ6AIAD2Opm3AWid+Kj4BPY+mn8BaJ44cpqYuwABrocAAsuoCAAIUprHAWiegCACHprTAWieOAMAAszE/SabnIRynAhym/ham6y7AAGuKwACzLEsBAAGFpv/AWidGAMAA/LlIAQABh6cFwFonjgDAAP0pPgI9HKcqFqcXLsAAa4rAALMsgL8CAAKFpyvAWidGh6cwwFonjgDAAPy6PYmnQMBaJikpPwbAALMxgfCnb6dxqNsAAMAAa6HAALLqAAAAAQOne6jbAAAAAgICp34AACDAAF8zXwAAAKeEAAAgwABfNF8AAAAAXwAAAT4ETqeSp5oAAMAAa6JfAAABgKecwFoo7E6nqKewAADAAGujXwAAAYGnssBaKPlDp7ohHKfJgqfBwFopDkgBAAGDp8zAWikkAMAA/Sk+AkOn3Ryn+Ryn7xan5C7AAGudwACzLUsBAAGCp/DAWikOAMAA/LljAQABHKgGFqf7LsAAa53AALMtSwEAAYOoB8BaKSQAwAD8uQDAAPz9PgE9iqgbwFopDhyoOBaoJS7AAGuKwACzLEsBAAGCqDnAWikOAMAA/LlDqFEcqG0cqGMWqFguwABrncAAsy1LAQABg6hkwFopJADAAPy5YwEAARyoehaoby7AAGudwACzLUsBAAGCqHvAWikOAMAA/LkAwAD8/T4BPYuoj8BaKSQcqKwWqJkuwABrisAAsyxLAQABg6itwFopJADAAPy5SqjJAYKo0MBaKQ4AAFol0ABaKMYAWipQAAAAAgAAAYHwAFoqYwBaDKIAWhVhAFocmABaHYwAWiTgAFoqYQAAAAUAWipjAAAAAAAAAMAAszTAAGukgfEAAAeBBgAAt9AAAQEBsIeBNgAAvJAAAIFaAACB4AABAQGXGYGCAAC9sAAAgacAAMAAn7mChgCBxQAAwABygAAAgeQAAMAAnDEAAAAAAAECwACzOYHxh3KHgcAARjIHwABrpQAAAWDAAP0cAAFdwACecQFbCwTAALM7gfGHy4fVCcAAT2EAYMAAnDYABMAAszyB8Yfuh/YJqj4AYMAAcoQABMAAsz2B8YgMiGsGwABrpgBgwAD70AFqiC1gwAD70IMrBMAAsz6B8YiKiLcJwABPNgBdlHEBYLy3AR+IoZSRAAFgvLcAAATAALM/gfGJbYmLCaQuAF3AAPx0AWDAAJw2ATGJiWDAAJw2AATAALNAgfGKfYqlCcAAa6cAXcAA/HQBYMAAnboBMYqjYMAAnboABMAAs0GB8YuTi7kJwABrqABdwAD8dAFgwACd3wExi7dgwACd3wAEwACzQoHxjKeMzQnAAGupAF3AAPx0AWDAAJ4BATGMy2DAAJ4BAATAALNDgfGM8I0ZCcAAYvkAXZRxAWDAAJw2AR+NAJSRAAFgwACcNgAABMAAs0SB8Y1ijW0YwABj9wBgwACcNgErBMAAs0WB8Y12jY4YwABPWwBgwAD6CgEpAQXAALNsgfGIvIi8iOkAAAADiMmI6QAAAAICAojPAAAEwABPYWDAAJw2AIjgAAAEqj5gwAByhAAAYMAAszkBPwMIAcAAszuAAMBaLIwIAcAAszyBAMBaLJsJAYi8wAD9MgAAAAAjBsAAs0eB8Y2TjZiOJQAAwABkAAAAAAEDja+OJQAAAAEBAY3AAAAAgVRgwACcNgAAXAE+A0mNzByN2haN0C7AAGL5wACzQ4MXAQABgI3jwFos+ACUfEqN6gA/PRyOABaN9i7AAGL5wACzQ1YBAAGAjgTAWiz4AJR9PRyOGBaODy6kLsAAsz9WAQABgI4cwFos+ADAAPyFBsAAs0mB8Y4qji+PuAAAwABrqsAAszQAAAABA45Dj7gAAAABAQGOSAAAAKDWXcAA/WcBWwAAYMAA+goBPgVOjlmOYwAAwABrq2DAAPvQARaOdhaOZS7AAE82wACzPmGUjkmOghyOnxyOkIGOhsBaLatkAQABFo6YgI6SwFotkmHAAMyQAMAA/PWBawEAAWqOomDAAPvQgysAwAD8/kqOtgEqP06OzI7XAADAAGusYMAA+9ABk0aO4I8EAAAAAQBbAICO/cBaLZI+Ak6O9QAAAKOoYMAAnDYBJo7gAYOO9cBaLiZgwACcNkmPDCEcjyIWjxEuwABPNsAAsz6DFwEAARaPMISPK8BaLjet98AAnEoAlHw+Aj2Kj0LAWi4QHI9Mgo9CwFouEGQBAAGUAMAA/PVJj1gcj2eCj1zAWi4QgJcBAAEcj3xqj2lgwAD70IMrgY0BAAGBj37AWi2rAMAA/PYAwAD8/0qPiQEpPz9Kj6gBKgbAALNKgfGPvY/CkysAAMAASd0AAAABA4/JkysAAAAAAAAAXAE+Aj0ckFouwABkAAEAARaQci7AAE9hwACzOwDAALNHQUOQgyEWkJQWkIsupC7AALM/gVXAAPxWPgc9F5ClLsAAY/cckLwWkLMupC7AALM/hhEAAAAAwAD8k8AAs0RJkNAckNQuwABrqsAAszQBAAEWkPUWkOkuwABj98AAs0Sg1sAAnDgAwACzST4CPRyRBy7AAGP4AQABJ8AAa60AwACzS0KRKgA/RpE/kW+RVAAAAIFUYMAAnDYAFpFoFpFcLsAAY/fAALNEoNbAAJw4PgI9HJGKFpF5LsAATzbAALM+VgEAARaRk4CRjsBaL66t98AAnEoAlH09HJGogJGjwFovroRNAQABLgDAAJxYQ5HEIRaR2xaRzC7AAGunwACzQIFVwAD8Vj4BPRyR7i7AAGuuAQABHJITFpIELsAAa6fAALNAhhEAAAAAwAD8kwDAALNdQ5IwFpJFFpI3LsAAa6jAALNBg7LAAPxXPgE9HJJbLsAAa68BAAEckn4WknAuwABrqMAAs0GGEQAAAADAAPyTAMAAs15DkpshFpKxFpKjLsAAa6nAALNCgVXAAPxWPgE9HJLELsAAa7ABAAEckucWktkuwABrqcAAs0KGEQAAAADAAPyTAMAAs19JkwQhFpMJLsAAT1vAALNFQpMcAD8GwACzS4HxkzCTNZPKAADAAGP4AAAAAQOTPJPKAAAAAQEBk0QAAAClUGDAAP22AABcAT4CSZNSapNcYMAA+goAPgE9HpNtwAD1swEAASSToAQnwABrsRaThC7AAE9hwACzOyfAAGuygJOZwFoxFAA/PReTrS7AAE9bKsAAs0UGwACzTIHxk8+T4JQ+AADAAGMrAWqT0GDAAP0cAgAAAQOT+ZQ+AAAAAQEBlA8AAACBVGDAAJ5ZAABcAT4BPRyUGy7AAGP4AQABJ8AAa7MAwACzSwbAALNNgfGUQ5RUlcoAAMAAYy4BapREYMAA/RwCAAABA5RtlcoAAAABAQGUgwAAAIFUYMAAnmUAAFwBPgE9HJWnLsAAY/gBAAEnwABrtADAALNLBsAAs06B8ZXPleCWPgAAwABi9AFqldBgwAD9HAIAAAEDlfqWPgAAAAEBAZYRAAAAgVRgwACdmQAAXAE+AT0clh0uwABkAAEAAYCWNcBaMkEAwACzRwbAALNPgfGWQ5ZUlroAAMAAYyMBapZEYMAA/RwCAAABA5ZylroAAAABAQGWjQAAAIFUYMAAnigAAFwBPgE9HJaZLsAAZAABAAGAlrHAWjKWAMAAs0cGwACzUIHxlr+W0JdNAADAAGMBAWqWwGDAAP0cAgAAAQOW9pdNAAAAAQEBlyAAAACBVGDAAJ3KAABcAT4BPRyXLC7AAGQAAQABgJdEwFoy6wDAALNHBsAAs1GB8ZdSl2OXzQAAwABjCAFql1NgwAD9HAIAAAEDl4OXzQAAAAEBAZegAAAAgVRgwACd7AAAXAE+AT0cl6wuwABkAAEAAYCXxMBaM0AAwACzRwbAALNSgfGX0pfjmIwAAMAAYxkBapfTYMAA/RwCAAABA5f/mIwAAAABAQGYGAAAAIFUYMAAnhkAAFwBPgE9HJhrLsAAY/gBAAEnwABrtQDAALNLBsAAs1OB8ZiRmKKZCAAAwABjHAFqmJJgwAD9HAIAAAEDmMCZCAAAAAEBAZjbAAAAgVRgwACeHwAAXAE+AT0cmOcuwABkAAEAAYCY/8BaM+gAwACzRwbAALNUgfGZDZkemXMAAMAAYv4BapkOYMAA/RwCAAABA5k2mXMAAAABAQGZSwAAAIFUYMAAnboAAFwBPgE9HJlmFplXLsAAa6fAALNAVgEAAYCZasBaND0AwAD8hQbAALNVgfGZeJmJmdsAAMAAYwUBapl5YMAA/RwCAAABA5mgmdsAAAABAQGZtAAAAIFUYMAAnd8AAFwBPgE9HJnOFpnALsAAa6jAALNBVgEAAYCZ0sBaNJoAwAD8hQbAALNWgfGZ4JnxmkMAAMAAYxIBapnhYMAA/RwCAAABA5oImkMAAAABAQGaHAAAAIFUYMAAngEAAFwBPgE9HJo2FpooLsAAa6nAALNCVgEAAYCaOsBaNPcAwAD8hQbAALNXgfGaSJpZmpUAAMAAYugBappJYMAA/RwCAAABA5p1mpUAAAABAQGajgAAAIFUYMAAnXgAAFwBPgAGwACzWIHxmpqaq5rxAADAAGLrAWqam2DAAP0cAgAAAQOazJrxAAAAAQEBmuoAAACBVGDAAJ2IAABcAT4ABsAAs1mB8Zr2mwebSQAAwABi7QFqmvdgwAD9HAIAAAEDmyabSQAAAAEBAZtCAAAAgVRgwACdkQAAXAE+AAbAALNagfGbTptfm5kAAMAAYycBaptPYMAA/RwCAAABA5t6m5kAAAABAQGbkgAAAIFUYMAAnj0AAFwBPgAGwACzW4Hxm56br5wAAADAAGLlAWqbn2DAAP0cAgAAAQOb0pwAAAAAAQEBm/kAAACBVGDAAJ1rAABcAT4ABsAAs1yB8ZwFnBGdJwAAwABizgFqnAZgwAD9HAIAAAEDnDOdJwAAAAEBAZxSAAAAgVRgwACdQQAAWwE+A06ca5xyAADAAGP6YLy3ARaceYCcdMBaNoXAAE9jwACdQ06cnJylAACrFWDAAJw2ARycthacsBacpy6qPsAAszyFZ8AAco7AAE7SAQABgZzOwFo2mADAAKD1SZzbHJzogpzfwFo2uUgBAAEWnOsuwABj98AAs0QAwAD9KT4BPRydAC7AAGQAAQABgJ0YwFo2hQDAALNHPwbAALNdgfGdLJ0xoAEAAMAAa64AAAABA51GoAEAAAABAQGdWwAAAINbYMAAnboAAFwBPgI9HJ1wFp1nLqo+wACzPMAATxUBAAGAnYbAWjdPAMAAcpVJnZEWnZqAnZXAWjdPwABPR8AAnk8+AT0cna0uwABj+AEAASfAAGu2AMAAs0s+AT0cnfwWnfKAne3AWjdPwABi+cAAnlSD+AEAATSeBAOeBJ/2AAAAAQEBnhUAAADAAGu3YMAAnDYAAGDAAPzZAT4BPRyeMBaeKoGeJcBaN9qg1sAAnDiD+AEAATSeOAOeOJ/sAAAAAQEBnkkAAACjqGDAAJw2AABgwAD82QE+AUmeWyWeZIKeX8BaOBldwACdUgFbPgJJnpUhHJ6nFp6eFJ6ZwFo4GQIBXcAAnVIBW4V5wACdWEgBAAGBnqrAWjfaAMAA/SlKnrAAP0mexBye6xae0RaeyC6qPsAAszy2gcAAcoaDFwEAARae+RSe9MBaOBkCAV3AAJ1SAVuk3sAAnTUAwAD9cz4BPRyfFC7AAGQAAQABFJ8swFo4GQIBXcAAnVIBWwDAALNHSZ9GIRyfYBqfS8AAszaDFwEAARafdxafbhSfacBaOBkCAV3AAJ1SAVuk3sAAnTWAvcAAS1YAwAD9cz4BPRyfji7AAGP4AQABJJ/GAyfAAGu4Fp+/Fp+2FJ+xwFo4GQIBXcAAnVIBW6TewACdNYC9wABLVieZjwDAALNLPz8AwAD8QgDAAPxCBsAAs16B8aAGoAuirAAAwABrrwAAAAEDoB+irAAAAAEBAaAzAAAAlx5gwACd3wAAXAE+Aj0coEcWoD4uqj7AALM8wABPFgEAAYCgXMBaOYIAwABylkmgZhagboCgasBaOYLAAE9HwACeTz4BPRyggS7AAGP4AQABJ8AAa7kAwACzSz4BPRygzhagxICgwMBaOYLAAGL5wACeVIP4AQABNKDWA6DWoqEAAAABAQGg5wAAAMAAa7dgwACcNgAAYMAA/NkBPgE9HKECFqD8gaD3wFo6DaDWwACcOIP4AQABNKEKA6EKopcAAAABAQGhGwAAAKOoYMAAnDYAAGDAAPzZAT4BSaEtJaE2gqExwFo6TF3AAJ1SAVs+AkmhZyEcoXkWoXAUoWvAWjpMAgFdwACdUgFbhXnAAJ1YSAEAAYGhfMBaOg0AwAD9KUqhggA/SaGWFqGoFqGfFKGawFo6TAIBXcAAnVIBW6TewACdNbaSwABLXD4BPRyhwS7AAGQAAQABFKHZwFo6TAIBXcAAnVIBWwDAALNHSaHzIRyiDBqh+MAAszeDFwEAARaiIxaiGhSiFcBaOkwCAV3AAJ1SAVuk3sAAnTWAvcAAS1YAwAD9cz4BPRyiOi7AAGP4AQABJKJxAyfAAGu6FqJqFqJhFKJcwFo6TAIBXcAAnVIBW6TewACdNYC9wABLVieZjwDAALNLPz8AwAD8QgDAAPxCBsAAs1+B8aKxoralVwAAwABrsAAAAAEDosqlVwAAAAEBAaLeAAAAgKtgwACeAQAAXAE+Aj0covIWoukuqj7AALM8wABPFwEAAYCjB8BaO54AwAByl0mjERajGYCjFcBaO57AAE9HwACeTz4BPRyjLC7AAGP4AQABJ8AAa7sAwACzSz4BPRyjeRajb4Cja8BaO57AAGL5wACeVIP4AQABNKOBA6OBpUwAAAABAQGjkgAAAMAAa7dgwACcNgAAYMAA/NkBPgE9HKOtFqOngaOiwFo8KaDWwACcOIP4AQABNKO1A6O1pUIAAAABAQGjxgAAAKOoYMAAnDYAAGDAAPzZAT4BSaPYJaPhgqPcwFo8aF3AAJ1SAVs+AkmkEiEcpCQWpBsUpBbAWjxoAgFdwACdUgFbhXnAAJ1YSAEAAYGkJ8BaPCkAwAD9KUqkLQA/SaRBFqRTFqRKFKRFwFo8aAIBXcAAnVIBW6TewACdNbaSwABLXD4BPRykbC7AAGQAAQABFKSEwFo8aAIBXcAAnVIBWwDAALNHSaSeIRyktxqko8AAsziDFwEAARakzhakxRSkwMBaPGgCAV3AAJ1SAVuk3sAAnTWAvcAAS1YAwAD9cz4BPRyk5S7AAGP4AQABJKUcAyfAAGu8FqUVFqUMFKUHwFo8aAIBXcAAnVIBW6TewACdNYC9wABLVieZjwDAALNLPz8AwAD8QgDAAPxCBsAAs2CB8aYIpg2oDAAAwABrvQAAAAEDpiCoDAAAAAEBAaZAAAAAgVRdwACdUgFbAABgwAD6CgE+BkmmTBymXxamVYCmUMBaPbpbwACdN0gBAAErAMAAn/VKpmgBKj9JpnoWppMWpo0WpoOApn7AWj26W8AAnTeFV8AAn+6DssAA/MtKpp8BKj9OprimxQAAutlgwAD9tgEWptUWpsyApsfAWj26pN7AAJ01gL3AAEtWTqb1pv8AAFtdwAD8dAFgwACcNgEWpxAWpwaApwHAWj26W8AAnTeFjcAAn+1JpyAcpzUWpy6CpyTAWj5KYcAA/KNIAQABlADAAPzzPgFKp0MBIhynWIGnS8BaPiJIAQABJ1YAwAD9xQAcp3AWp2QuwABj98AAs0RIAQABHKd8gqdzwFo+SksBAAGTAMAA/IMAwAD9KUmnjRynohanm4KnkcBaPkphwAD8o0gBAAGVAMAA/PM+AUqnsAEiHKfFgae4wFo+IkgBAAEnnsoAwAD9xQAcp+AWp9QuwABj98AAs0RIAQABHKfsgqfjwFo+SksBAAGUAMAA/IMAwAD9KT9Kp/wBKgbAALNhgfGoEagWqU0AAMAAa74AAAABA6goqU0AAAACAgKoSAAAAIFUXcAAnVIBWwCoUgAAACdgwAD70AAAYMAA+goBPgVOqGaocwAAutlgwAD9tgEWqIMWqHqAqHXAWj9upN7AAJ01gL3AAEtWSaiNIRyonoKokcBaP5NIAQABJ4C/AMAA/cVKqKgBKj9AHKjXFqjQFqjGgKjBwFo/blvAAJ03YcAAn/BIAQABlQDAAPzzqMGo2wBOqPipAgAAW13AAPx0AWDAAJw2ARapExapCYCpBMBaP25bwACdN4WNwACf7UqpIwEcqTYWqSouwABj98AAs0RIAQABHKlCg6k5wFpABUsBAAGBqUPAWj99AMAA/IMAwAD9KQbAALNigfGqAaoGqmUAAMAAa78AAAABA6oTqmUAAAABAQGqMwAAAIFUXcAAnVIBWwAAYMAA+goBPgFKqj8BHKpGLsAAa74CAAKAqlnAWkCIkwDAALNhBsAAs2OB8as/q0SrpQAAwABrwAAAAAEDq1OrpQAAAAEBAatzAAAAgVRdwACdUgFbAABgwAD6CgE+AUqrfwEcq4YuwABrvgIAAoCrmcBaQN6UAMAAs2EGwACzZIHxq6qrr6zcAADAAGvBAAAAAQOrv6zcAAAAAQEBq8UAAACpjWEBYMAAnP9gwAD6CgAAXAE+AUFGq/KsFqv7AAAAo6hgwACcNgAWrA8WrAMuwABj98AAs0Sg1sAAnDg+AUmsHiWsJ4GsIsBaQVNgwACc/z4BSaxOHKxbgKxSwFpBNCABAAEUrFzAWkFTAQFgwACc/wAAPgI9HKxvLsAAY/gBAAEnwABrwgDAALNLQqy7AD8/BsAAs2WB8azhrPK7LQAAwABi4QFqrOJgwAD9HAIAAAEDrRW7LQAAAAEBAa08AAAAgVRdwACdUgFbAABcAT4JT61IrU0AAAHAAGvDYQFgvctcAAOtXK9QAAAAAQEBrWsAAACrxWC9ywAAXAE+Ak6tgK2PAAC1JGDAAP0cARytuBatpBatmy6qPsAAszyweMAAcou1NgEAAYKtysBaQicAvjdJrdchHK3qg63bwFpCOEgBAAErAMAA/Sk+Ak6uEa4WAACDW2DAAJ26ARyuQRauMxauLRauJC6qPsAAszyFZ8AAco62hsAAoKxLAQABg65CwFpCOADAAPy5PRyuahauWy7AAGunwACzQFYBAAGErm7AWkKGAMAA/IU+AT0crxouwABj+AEAASfAAGvEAMAAs0tPr1evXAAAAcAAa8VhAWC9y1wAA69qsPkAAAABAQGveQAAAKvFYL3LAABcAT4CTq+Or50AALUkYMAA/RwBHK/GFq+yFq+pLqo+wACzPLB4wAByi7U2AQABg6/YwFpDGQC+N0mv5SEcr/iEr+nAWkMqSAEAASsAwAD9KT4CTrAesCIAAICrYMAAngEBJrAeARywQBawMxawLRawJC6qPsAAszyFZ8AAco7AAE9YwACgrksBAAGEsEHAWkMqAMAA/LlgwACeAT0csGgWsFouwABrqcAAs0JWAQABhbBswFpDeADAAPyFPgE9HLDJLsAAY/gBAAEnwABrxgDAALNLT7EAsQUAAAHAAGvHYQFgvctcAAOxEbGaAAAAAQEBsSAAAACrxWC9ywAAXAE+AT0csXcuwABj+AEAASfAAGu1AMAAs0tJseQcseguwABrwAEAAYCx+MBaQfUAwACzYz4CTrILshgAAIV8YL3LARayKBayH4CyGsBaQfWFecAAnViCkMAAnDxJsjQcslUWskEWsjguqj7AALM8sHjAAHKLtSEBAAGEsmHAWkRZAL4mPgE9HLKJgbJ6wFpCDCABAAGEsorAWkRZAABJsqYcsscWsrMWsqouqj7AALM8sHjAAHKLq1YBAAGEss3AWkRZAL4tPgE9HLL0grLmwFpC/iABAAGEsvXAWkRZAAA+Aj0ctjsuwABrwQEAARa2TC7AAGvIwACzZgDAALNkPRy2dC7AAGvBAQABFraFLsAAa8nAALNnAMAAs2Q/SbbVHLbZLsAAa78BAAGAtufAWkH1AMAAs2I+Ak62+rcHAACFfGC9ywEWtxcWtw6AtwnAWkH1hXnAAJ1YgpDAAJw8SbcjHLdEFrcwFrcnLqo+wACzPLB4wAByi6tWAQABhLdKwFpFXAC+LT4BPRy3b4O3Y8BaQ/sgAQABhLdwwFpFXAAAPgI9HLeWLsAAa8EBAAEWt6cuwABryMAAs2YAwACzZD0ct88uwABrwQEAARa34C7AAGvJwACzZwDAALNkP0m4Ehy4Fi7AAGu9AQABgLgqwFpB9QDAALNgPgJOuD24SgAAhXxgvcsBFrhaFrhRgLhMwFpB9YV5wACdWIKQwACcPEm4Zhy4hxa4cxa4ai6qPsAAszyweMAAcou1IQEAAYS4k8BaRh0AviY+AT0cuLuBuKzAWkIMIAEAAYS4vMBaRh0AAD4BPRy5Di7AAGvBAQABFrkfLsAAa8jAALNmAMAAs2Q/SblSIiIcuVuAuVbAWkH1wABi1AEAARa5fS6qPsAAszwAwACdXQAhHLmhFrmXgLmSwFpB9VvAAJ03SAEAASsAwACf9QAcucMWubmAubTAWkH1W8AAnTeDFwEAARa5zC7AAGP3wACzRADAAJ/5PgE9HLniLsAAY/gBAAEnwABrygDAALNLP066Kro+AADAAGvLXcAA/DIBYMAAnDYBHLpdFrpNgLpIwFpB9cAAT3DAAJ1ngKsBAWDAAJw2ATS6YQO6Ybq7AAAAAQEBum8AAACkEGC8twAAYMAAnJIBPgFKun8BHLqVFrqPFrqGLqo+wACzPIVnwAByjsAATtIBAAGEuq3AWkdtAMAAoPUAwAD8PUm6why62oS6xsBaRyqB1AEAATS63gO63rr7AAAAAQEBut8AAACjqGDAAJw2AABgwAD6CgFKuugBHLrthbrowFpH00gBAAEWuvAuwABj98AAs0QAwAD9KQDAAPxHPgE9HLsGLsAAZAABAAGAux7AWkH1AMAAs0c/BsAAs2aB8bvju+i9YgAAwABryAAAAAEDvAW9YgAAAAEBAbwfAAAAwABrzGDAAJz/AABgwAD6CgE+BEm8NCEWvEeAvDnAWkhMwABL18AAnQxKvFsBKj9JvG0hHLyVFryGFrx/gLxxwFpITJZBwACdCoT5vMVIAQABFrzEFry1FrypFrygLqo+wACzPKTMwAByibL7wABNF7EHuIAAwAD9KT4BSrzaASo/Trz5vP4AAIC9YMAA/bYBFr0VFr0OgL0AwFpITJZBwACdCoC9vJNKvR8BIiIcvSyBvSfAWkjTSAEAASeAvwDAAP3FARy9P4G9OsBaSNNIAQABJ1YAwAD9xQEcvVKBvU3AWkjTSAEAASeeygDAAP3FBsAAs2eB8b4ovi2/gAAAwABryQAAAAEDvkm/gAAAAAEBAb5jAAAAwABrzGDAAJz/AABgwAD6CgE+BEm+eCEWvouAvn3AWkljwABL18AAnQxKvp8BKj9JvrEhHL7ZFr7KFr7DgL61wFpJY5ZBwACdCoT5vMVIAQABFr8IFr75Fr7tFr7kLqo+wACzPKTMwAByibL7wABNF7DmuGAAwAD9KT4BSr8hASo/Tr9Av0UAAIC9YMAA/bYBFr9cFr9VgL9HwFpJY5ZBwACdCoC9vJNKv2YBHL9zgb9uwFpJ6kgBAAEngL8AwAD9xQbAALNogfG/hb+KwABB+wAAtFUAAAABA7+TwABB+wAAAAEBAb+hAAAAliBgvLcAAGDAAPoKAT4ESb+wIRa/vYC/tcBaSk2yfLy/Sr/JASo/ScAAQUUiFsAAQVGAwABBScBaSk2E/Ly8ABzAAEFyFsAAQW2AwABBZcBaSk2AvbyTSAEAAWrAAEGBYMAA/bbAAOLkAMAA/cU+AUrAAEGPASk/TsAAQbLAAEG2AACZwmC8pQEWwABBwIDAAEG4wFpKTYT5vMVKwABB1AEiIRzAAEHfgcAAQdvAWkrLSAEAASsAwAD9KQAWwABB7oHAAEHqwFpKy7RVvKgGwACzaYHxwABCAMAAQhHAAEPIAADAAGKvAWrAAEIBYMAA/RwCAAABA8AAQivAAEPIAAAAAQEBwABCQgAAAIFUYMAAnJIAAFwBPgRJwABCThbAAEJXgMAAQlLAWktXwABiqsAAnJ0+AT0cwABCbS7AAGP4AQABJ8AAa80AwACzSz9JwABCpRzAAEKpLrRVAQABFsAAQriAwABCs8BaS1eCZsAAnJoAwACzaD4BPRzAAELJLsAAY/gBAAEnwABrzgDAALNLP0nAAEL3IhbAAEMHFsAAQwCAwABC+8BaS1eCZsAAnJqHdry+ACEcwABDJBbAAEMbLqo+wACzPMAATzIBAAEmwABDTgEWwABDToDAAENJwFpLV4JmwACcmmC8yQDAAHKzPgE9HMAAQ18uwABj+AEAASfAAGvPAMAAs0s/PRzAAEOnLsAAZAABAAGAwABDv8BaS1cAwACzRwbAALNqgfHAAEPNwABD3sAARjAAAMAAYsEBasAAQ85gwAD9HAIAAAEDwABD+8AARjAAAAABAQHAAEQVAAAAgVRgwACc/wAAXAE+BEnAAEQhHMAAREUWwABEOhbAAEQuFsAARCUuqj7AALM8pMzAAHKJt2/AAE0TwABLdwEAARbAAERZgMAARFTAWkyylkHAAJ0KAMAAakc+AT0cwABEai7AAGP4AQABJ8AAa9AAwACzSz9JwABEmiEcwABEsRbAAESfLqo+wACzPMAATzMBAAEWwABE6IDAAETjwFpMspZBwACdCgDAAHK0PgE9HMAARPkuwABj+AEAASfAAGvPAMAAs0s/ScAARUEiHMAARUUuwABryAEAAYDAAEVjwFpMsgDAALNmARzAAEV0LsAAa8kBAAGAwABFkcBaTLIAwACzZz4BSsAARf0APz0cwABGDy7AAGQAAQABgMAARifAWkyyAMAAs0cAAFos1gBaLWwAWi7eAFow8gBaMXAAWjHDAFoyFgBaMmsAWjLAAFozFQBaM2oAWjO9AFo0EgBaNG8AWjTMAFo1KQBaNWYAWjWjAFo14ABaNh0AWjZaAFo3LQBaOWAAWjt8AFo9mABaP0wAWkBmAFpAvABaQRIAWkHKAFpIKgBaSUEAWkopAFpLIABaTHsAWk3hAAAAIwMEwACzNoHxgl6EXATAAGvRAF3AAP1nAWDAAP22AR6CecAAwOQBAWDAAP22AWqCil3AAPx0AWDAAP22wAFnbgAEwACzN4HxhGuFwgTAAGvSAF3AAP1nAWDAAP22AR6EhcAAwOQBAWDAAP22AWqEll3AAPx0AWDAAP22wAFn4QAEwACzOIHxhdGHJQTAAGvTAF3AAP1nAWDAAP22AR6F68AAwOQBAWDAAP22AWqF/F3AAPx0AWDAAP22wAFoLAAAAYHxAFpPNQBaKukAWk52AAAAAQBaTzUAAAAAAAAAwACzbcAAa9SB8gAACIFdAADAAGJKAACBfgAAwABjebPYAIGfAADAAGN5AAEBAYKBgb8AAMAASzYAAQEBpJOB8QAAwABLgQAAgiIAAMAAb1cAAQEBwABNkoJkAADAAGOuAACCeQAAwABqLQAAAAAAAAACBsAAs2+B8oKVgqWG5wABwABr1QAAAAEDgryG5wAAAAMDA4LPAAAApQBgwABLiACC7QAAALGKYMAAai4AgwQAAACvLWDAAGOxAABgwACTzAE+BEmDDyEWgySBgxTAWk/0wABLdMAAaj5KgzUBKz9Og1qDZQAAhhBdwAD8dAFgwACTzAExg3hgwACTzAA9HIOLgIN+wFpP57r7AQABNIOlA4Olhr4AAAACAgKDrQAAAIC9YMAA/bYAg9YAAAC7H13AAPylAmDAAEtIYMAAb1gAAGDAAPzZAT4BPRyD8YWD58BaUHyD+AEAATSD+QOD+Ya4AAAAAgIChAMAAACk3mDAAEtIAIQhAAAAhOFgwABvWAAAYMAA/NkBPgFJhDYWhEOGhDrAWlC7to3AAEtbPgZJhI4chK4WhJuGhJLAWlC7utbAAEtSgJcBAAGTAMAA/P9KhLMAP06Ex4TVAAC61WDAAPvQARaE4IaE18BaULu61cAAS1FOhP6FFgAAwABr1mDAAP22ASfAAGvXToVxhXwAAJqAXcAA/HQBYMAA/bYBHoWCwAD8fAIBYMAA/bYCFIWlwFpRGggANIW0A4W0hdUAAAABAQGFtQAAAGJgwAD70AAAYMAA/bYBSoW7ARyF0hSFu8BaUTkJAEsBAAEUhdPAWlGJCgAAwAD9wwBOheyF8QAAgL1gwACU7QEchfmChfPAWlABr0UBAAGGhgjAWlC7AMAAZCQ9HIYmg4YbwFpQNFYBAAEchi1qhipgwACXUcABE4mFSwIAAifAAGvYMYaJYMAA/RwDFIaKwFpRwAsAFIaQwFpRTwoAFIacwFpRTwoAAMAAl1QAwAD8hT8AwAD8xADAAEuQSobDAR+GzsAAk9wBAAGDhtrAWlA0AAbAALNwgfKG6ob3iKIAAcAAa9kAAAABA4cKiKIAAAAAAAAAYMAAYuIBPgFKh8EBH4fMwABi+gYABmqH5mDAAGLVwAEQ7WqH+13AAPx0AWDAAGJPwADsnx6IGcAA/HkCAWDAAGJPAjcQaog5YMAAYtXAARDtAGqIT13AAPx0AWDAAP22gxtqiGddwAD8dAFgwABiT8AA7J9qiIFdwAD8dAFgwABitMABFD8AAYHyAFpTCgBaT8MAAAAAAFpPxQBaUmAAWlMKAAAAAgAAAMAAs3HAAGvagfMAAAeBAAAAwAB/xAABAQHAAFKtgToAAMAATW4AAIFiAAC8kAABAQK0VLDJgaUAAMAAZuwAAIHIAADAAEyOAAEBAqSVpJaCGQAAwABoCgABAQHAAErHgkUAAIHgAAEBAZcZAAAAAQLAALNygfOCboJ0lokDwABn2wAAAWDAAEyoAAFgwAB/xQsEwACzdIHzgvOC+QmCZgFqgtVgwAD9HAJgvLcABMAAs3aB84MOgxcYwABSA8AAs3EAXcAAaAsBYMAAZu0BKwTAALN3gfODMYM9GMAAWF/AALNxAF2UcQFgwABnDwErBMAAs3iB84NXg2MYwABYYcAAs3EAXZRxAWDAAGcbASsEwACzeYHzg36DixjAAFhgwACzcQBdlHEBYMAAZycBKwTAALN6gfODnoOvGMAAa9vAALNxAF2UcQFgwAD9tgErBMAAs3uB84POg98YwABr3MAAs3EAXZRxAWDAAE2WASsEwACzfIHzg/OD/hjAAEeUwACzcQBdlHEBWwErBMAAs32B84QWhCIYwABr3cAAs3EAXZRxAWC8pQErBMAAs36B84Q6hEoYwABYaMAAs3EAXcAA/WcBYMAAZzMBKwTAALN/gfOEaIR+GK7gwACzcQBdwAD9ZwFgwABnQAErAQXAALOZgfOEg4SDhKwAAAADhJ+ErAAAAAEBAYSlAAAEgmZgvLcAAGDAALNyAT8CCAHAALN0gADAWlUzCQGEg8AATLwAAAAAFgbAALOBgfOEsYTGhNYBAIFVAWqEsmDAAP0cAgAAAQOEzoTWAAAAAAAAAGDAAPoKAUqE0QEqBsAAs42B84TbhOCFjgAAwABYAgAAAAEDhPKFjgAAAAEBAYUBAAAAwABSt2DAAGcPAABcAT4DQCEchSuAhR3AWlW3SAEAASsAwABnF4UdhTIAPSMchUYWhTkuwABYX8AAs3HAALN3SAEAASsAwAD9KReFOS7AAFhfwACzcR+FTpSRAAFgwABnDwAAwACzdysBXZRxAWDAAGcPPRyFeBaFay7AAFhfwACzccAAs3dWAQABgIV8wFpVtwCUfQbAALOCgfOFk4W7hhUBAMAAUrgBaoWUYMAA/RwCAAABA4XHhhUAAAAAAAAAXcAA/DIBYMAAZw8BPgFKhc0BIyEcheEWhdQuwABYX8AAs3HAALN3SAEAASsAwAD9KRaF6y7AAFhfwACzccAAs3dqhfpdwAD8dAFgwABnD8ABTzoBXcAAzI4BYMAAZw8GwACzjoHzhhqGH4bNAADAAFgBAAAAAQOGMYbNAAAAAQEBhkAAAADAAFK5YMAAZxsAAFwBPgNAIRyGaoCGXMBaVv1IAQABKwDAAGcjhlyGcQA9IxyGhRaGeC7AAFhhwACzccAAs3hIAQABKwDAAP0pF4Z4LsAAWGHAALNxH4aNlJEAAWDAAGcbAADAALN4KwFdlHEBYMAAZxs9HIa3FoaqLsAAWGHAALNxwACzeFYBAAGAhrvAWlb9AJR9BsAAs4OB84bShvqHNgEAwABSugFqhtNgwAD9HAIAAAEDhwaHNgAAAAAAAABdwAD8MgFgwABnGwFKhw8BNQAAAAEAXZRxAWDAAGcbARaHDy7AAFhhwACzccAAs3gjHIccgADAWlfTSAEAASsAAGqHH13AAPx0AWDAAGcbwAFPQYAAwFpX0wFdwADMjgFgwABnGwbAALOPgfOHO4dAh/YAAMAAWAAAAAABA4dTh/YAAAABAQGHYwAAAMAAUrtgwABnJwAAXAE+A0AhHIePgIeAwFpYSUgBAAErAMAAZy+HgIeWAD0jHIerFoedLsAAWGDAALNxwACzeUgBAAErAMAA/SkXh50uwABYYMAAs3Efh7OUkQABYMAAZycAAMAAs3krAV2UcQFgwABnJz0ch98Wh9EuwABYYMAAs3HAALN5VgEAAYCH48BaWEkAlH0GwACzhIHzh/uIJIiCAQDAAFK8AWqH/GDAAP0cAgAAAQOIMYiCAAAAAAAAAF3AAPwyAWDAAGcnAT4BSog3ASMhHIhMFog+LsAAWGDAALNxwACzeUgBAAErAMAA/SkWiFYuwABYYMAAs3HAALN5aohmXcAA/HQBYMAAZyfAAU9IAV3AAMyOAWDAAGcnBsAAs5CB84iHiIyJSwAAwABSvwAAAAEDiKKJSwAAAAEBAYiyAAAAwABSvWDAAGczAABcAT4DQCEciN6AiM/AWlmPSAEAASsAwABnPIjPiOUAPSMciP0WiOwuwABYaMAAs3HAALN+SAEAASsAwAD9KReI7C7AAFhowACzcR+JBZSRAAFgwABnMwAAwACzfisBXcAA/WcBYMAAZzM9HIk0FokjLsAAWGjAALNxwACzflYBAAGAiTjAWlmPAMAA/XQGwACzhYHziVCJeYnwAQDAAFK+AWqJUWDAAP0cAgAAAQOJiYnwAAAAAAAAAF3AAPwyAWDAAGczAT4BSomPASMhHImnFomWLsAAWGjAALNxwACzfkgBAAErAMAA/SkWibkuwABYaMAAs3HAALN+aonUXcAA/HQBYMAAZzPAAU9WAV3AAMyOAWDAAGczBsAAs5GB84n1ifqKdAAAwABn4wAAAAEDihGKdAAAAAEBAYoZAAAAgL1gwAD9tgAAXAE+Aj0jHIo3FoolLsAAa9vAALNxwACzekgBAAErAMAA/SkXiiUuwABr28AAs3Efij+UkQABYMAA/bYAAMAAs3orAV2UcQFgwAD9tj0cimcWilUuwABr28AAs3HAALN6VgEAAYCKa8BaWtkAlH0GwACzhoHzinmKmor8AQDAAFLAAWqKemDAAP0cAgAAAQOKq4r8AAAAAAAAAF3AAPwyAWDAAP22AT4BSoqxASMhHIrKFoq4LsAAa9vAALNxwACzekgBAAErAMAA/SkWitQuwABr28AAs3HAALN6aoroXcAA/HQBYMAA/baDGwFdwADMjgFgwAD9tgbAALOSgfOLAYsGi3EAAMAAZ+AAAAABA4sVi3EAAAABAQGLHgAAAMAAUrBgwABm7QAAXAE+Aj0jHIs3FostLsAAUgPAALNxwACzdkgBAAErAMAAaCgXiy0uwABSA8AAs3Efiz/AAGg8AAFgwABm7QAAwACzdisBXcAAaAsBYMAAZu09HIthFotXLsAAUgPAALNxwACzdlYBAAGAi2XAWlwAAMAAaBwGwACzh4Hzi3aLmIwMAQDAAFIEAWqLd2DAAP0cAgAAAQOLoYwMAAAAAAAAAF3AAPwyAWDAAGbtAT4BSounASMhHIu4FouuLsAAUgPAALNxwACzdkgBAAErAMAAaCgci9QWi8ouwABSA8AAs3HAALN2g8wBAAFqi+VdwAD8dAFgwABm7cABL54AwABoJWqL913AAPx0AWDAAGbtwAFPMwFdwAD8MgFgwABm7QbAALOTgfOMEYwWjLAAAMAAZ+IAAAABA4wtjLAAAAABAQGMQQAAAIX/YMAATZYAAFwBPgI9IxyMYxaMUS7AAGvcwACzccAAs3tIAQABKwDAAP0pF4xRLsAAa9zAALNxH4xrlJEAAWDAAE2WAADAALN7KwFdlHEBYMAATZY9HIyfFoyNLsAAa9zAALNxwACze1YBAAGAjKPAWl1QAJR9BsAAs4iB84y1jOKNYAEAwABSwQFqjLZgwAD9HAIAAAEDjPONYAAAAAAAAABdwAD8MgFgwABNlgE+AUqM+QEjIRyNEhaNAC7AAGvcwACzccAAs3tIAQABKwDAAP0pFo0kLsAAa9zAALNxwACze2qNQF3AAPx0AWDAAE2WwAFPTwFdwADMjgFgwABNlgbAALOUgfONZY1qjgEAAMAAZ+EAAAABA418jgEAAAABAQGNhQAAALdvWwAAXAE+A0AhHI2pgI2ewFpeeUgBAAErAMAA/SmNno2wAD0jHI3DFo23LsAAR5TAALNxwACzfEgBAAErAMAA/SkXjbcuwABHlMAAs3EfjcuUkQABWwAAwACzfCsBXZRxAVs9HI3uFo3iLsAAR5TAALNxwACzfFYBAAGAjfLAWl55AJR9BsAAs4mB844GjiiOeQEAt28Bao4HYMAA/RwCAAABA44zjnkAAAAAAAAAXcAA/DIBWwE+AUqOOQEjIRyOTBaOQC7AAEeUwACzccAAs3xIAQABKwDAAP0pFo5WLsAAR5TAALNxwACzfGqOZF3AAPx0AVuCYgFdwADMjgFbBsAAs5WB845+joOPAQAAwABr3gAAAAEDjpSPAQAAAAEBAY6hAAAAwABr32C8pQAAXAE+Aj0jHI6/Fo6yLsAAa93AALNxwACzfUgBAAErAMAA/SkXjrIuwABr3cAAs3EfjseUkQABYLylAADAALN9KwFdlHEBYLylPRyO7xaO4i7AAGvdwACzccAAs31WAQABgI7zwFpfoQCUfQbAALOKgfOPBo8sj24BAMAAUsQBao8HYMAA/RwCAAABA484j24AAAAAAAAAXcAA/DIBYLylAT4BSo8+ATUAAAABAF2UcQFgvKUBFo9FLsAAa93AALNxwACzfSMcj1KAAMBaYFZIAQABKwAAao9VXcAA/HQBYLylwADxvYAAwFpgVgFdwADMjgFgvKUGwACzloHzj3OPeJAlAACvEgAAAAEDj42QJQAAAAEBAY+jAAAArvVgwABnQAAAXAE+Aj0jHI/PFo+4Lq7gwACzccAAs39IAQABKwDAAP0pF4+4Lq7gwACzcR6P18AAwOIAAWDAAGdAAADAALN/KwFdwAD9ZwFgwABnQD0ckA8Wj/guruDAALNxwACzf1YBAAGAkBPAWmDEAMAA/XQGwACzi4HzkCqQWZC4AQCu1gFqkCtgwAD9HAIAAAEDkG+QuAAAAAAAAABdwAD8MgFgwABnQAE+AUqQdQE1AAAAAQBdwAD9ZwFgwABnQAEWkHwuruDAALNxwACzfyMckJOAAMBaYX1IAQABKwAAapCWXcAA/HQBYMAAZ0DAANmfgADAWmF9AV3AAMyOAWDAAGdABsAAs5eB85C9kNCWhwAAIwFqkL5gwAD9HAIAAAEDkNiWhwAAAAAAAABgwAD9tgE+DE6Q7pDxAACD5GDAAP4AAR+Q98AA/h8AAAAAPRyRDoCRC8BaYgOCigEAASSROwMnwABr4BaRMy6CZsAAs3QngyEAwAD+FD0ekU7AAEydAgACgJFWwFpiAy4ASZFlIRyRcxaRaS7AAFIDwACzccAAs3ZIAQABKwDAAGgoPgI9HJGHgJGEwFpiA4KKAQABJ8AAa+EAwAD+FEaRpJHgkbEAAADAAFKwYMAAZu0AHJHGFpG8LsAAUgPAALNxwACzdoPMAQABapHXXcAA/HQBYMAAZu3AAS+eAMAAaCU+AT0cke2AkerAWmIDgooBAAEkkgECJ68KgZH5wFpinQDAAP4UP0mSFiEckicWkhouwABYX8AAs3HAALN3SAEAASsAwAD9KT4CPRySO4CSOMBaYgOCigEAASfAAGviAMAA/hRGklyShJJvAAAArvBgwABnDwAWknYuwABYX8AAs3HAALN3PgE9HJKRgJKOwFpiA4KKAQABJJKhAievCoGSncBaY0MAwAD+FD9JkrYhHJLHFpK6LsAAWGHAALNxwACzeEgBAAErAMAA/Sk+Aj0cktuAktjAWmIDgooBAAEnwABr4wDAAP4URpL8kySTDwAAAK7wYMAAZxsAFpMWLsAAWGHAALNxwACzeD4BPRyTMYCTLsBaYgOCigEAASSTQQInrwqBkz3AWmPIAMAA/hQ/SZNWIRyTaBaTWi7AAFhgwACzccAAs3lIAQABKwDAAP0pPgI9HJN8gJN5wFpiA4KKAQABJ8AAa+QAwAD+FEaTnpPIk7IAAACu8GDAAGcnABaTuS7AAFhgwACzccAAs3k+AT0ck9WAk9LAWmIDgooBAAEkk+UCJ68KgZPhwFpkTQDAAP4UP0mT+iEclBAWk/4uwABr3MAAs3HAALN7SAEAASsAwAD9KT4CPRyUJICUIcBaYgOCigEAASfAAGvlAMAA/hRGlEeUfpRfAAAAhf9gwABNlgAWlGsuwABr3MAAs3HAALN7PgE9HJSLgJSIwFpiA4KKAQABJJSvAievChyUoYGUmMBaZNKmwQAAAADAAE2lAMAA/hQ/SZTEIRyU2haUyC7AAGvbwACzccAAs3pIAQABKwDAAP0pPgE9HJTugJTrwFpiA4KKAQABJJUfAifAAGvmFpUNLsAAa9vAALNxwACzegDAAP4UP0mVLCEclTwWlTAuwABHlMAAs3HAALN8SAEAASsAwAD9KT4CPRyVUICVTcBaYgOCigEAASfAAGvnAMAA/hRGlXCVjpV5AAAAElsAFpWBLsAAR5TAALNxwACzfD4BPRyVm4CVmMBaYgOCigEAASSVrAInrwqBlafAWmW2AMAA/hQ/SZXBIRyV3BaVxS6u4MAAs3HAALN/SAEAASsAwAD9KT4CPRyV8ICV7cBaYgOCigEAASfAAGvoAMAA/hRGlhOWPJYcAAAAEmDAAGdAABaWJC6u4MAAs3HAALN/PgE9HJZJgJZGwFpiA4KKAQABJJZaAievCoGWVcBaZjQAwAD+FD9Klm8BHJZ5gJZ2wFpiAyMAAAAAwAD+GQAAWlVgAFpVlQBaVlAAWlbbAFpXlgBaWCcAWljiAFpZbQBaWiwAWlq3AFpbVQBaW94AWlyEAFpdLgBaXcwAWl5XAFpfBABaX38AWmAZAFpgpABaYUAAWmHRAFpmiwAAABYAAAGB8wBaZu4AWlObAFpm7AAAAAEAWmbuAAAAAAAAAMAAs5oAgfQAAAGA2gAAwAC0kAAAAAAAAgLAALObgfSBPYFDliEDwABr6QAAAWDAAP0cAAACBMAAs56B9IFkgXIYwABSA8AAs5oAXcAA/KUCYMAA/bZgwAD9HAEygXBgwAD9tmDAAP0cAATAALOfgfSBgoGfGMAAa+rAALOaAF3AAP1nAWDAAP22AR6BksAAwOIAAWDAAP22AAABBcAAs7AAAAAABAAAAwAAAAAAAAAAAGDAALObAT8BCQEAwAD9MgAAAAANBsAAs6GB9IIZgh6CagAAVgAAAAEDgiGCagAAAAIBAYIpAAAAg9FgwAD9tgABgjMAAACAllsBaoI6YMAA/baEBlwBPgE9HIJOFoJFLsAAUgPAALOawACznoC/AgACgIJPwFpn8ByCXIGCVsBaZ/4jAAAAAMAA/SoAwAD8ugbAALOigfSCtIK5g2gAAMAAa+sAAAABA4LDg2gAAAACAQKCywAAAIPRYMAA/bYAgtUAAACAllsBagBgwAD82XcAXAE+Ak6C8IL1AACDW13AAPx0AWDAAP22ASaC8AEcgwEWgvcuwABSA8AAs5rAALOemRUCAAKAgw3AWmhvNIMSA4MSgyIAAAAAAAAAXcAA/HQBYMAA/bYBSoMYATGDIGDAAP22AADAAPzAXcAA/HQBYMAA/bZJgykhHIMzgYMtwFpofEgBAAErAMAA/Sk+AT0cg0mCg0TAWmiTVgEAARyDU4GDTcBaaHwjAAAAAMAA/SoAwAD8hT8GwACzo4H0g/OD+IQvAADAAGvsAAAAAQOEBoQvAAAAAQEBhA4AAACD0WDAAP22AABcAT4BPRyEIxaEGS7AAGvqwACzmsAAs59WAQABgIQnwFppZgDAAP10BsAAs6SB9IRihGeEqgAAh0EAAAABA4RyhKoAAAABAQGEegAAAIPRYMAA/bYAAGDAAPoKAT4BSoSFARyElhaEjC7AAFIDwACzmsAAs56HQQEAAYCEosBaabwAwAD8uAbAALOlgfSE5oT0hTIDAIC/AAAAAQOE94UyAAAAAgIChP8AAACD0WDAAP22AIULAAAAgJZgwAD9tgAAXAE+AT0chSEWhRguwABSA8AAs5rAALOegL8CAAKAhSLAWmoagYUpwFpqJwDAAPy6BsAAs6aB9IVmhXaFlgMASwAAAAEDhXiFlgAAAAEBAYWAAAAAg9FgwAD9tgAAYMAA/RwBSoWIARyFkRaFiC7AAFIDwACzmsAAs55LAQABgIWSwFpqhADAAPy5BsAAs6eB9IXmhe2GGAAAhFkAAAABA4XzhhgAAAABAQGF+wAAAIPRYMAA/bYAAGDAAP0cAUqGAwEchg0WhgMuwABSA8AAs5rAALOehFkBAAGAhhTAWmrfAMAA/MIGwACzrYH0hlCGWYZ1AQCBVQAAAAEDhmGGdQAAAAAAAABgwAD6CgFKhmQBFoZuFoZkLsAAUgPAALOawACznoFVwAD8ygbAALOugfSGsYa6htwBAIOyAAAAAQOGxYbcAAAAAAAAAGDAAPoKAUqGyAEWhtIWhsguwABSA8AAs5rAALOeg7LAAPzLBsAAs6iB9Ic5hz6HhQAAg/gAAAABA4dFh4UAAAABAQGHZAAAAIGmYQJgwAD9tmDAAP0cXAAAXAE+AT0ch3cWh20uwABSA8AAs5rAALOeg/gBAAGAh3/AWmvDAMAA/MQGwACzqYH0h/KH+YqWAAC8+wAAAAEDiACKlgAAAAAAAABgwAD9tgE+BE6IFogZAACD5GDAAP4AAR+IH8AA/h8AAAAATog4iEMAALuOYMAA+goBKkaIUIiFiFwAAACAvWDAAP22ADWIcwAAAQBdwAD8dAFgwAD9tgEciHMWiG4WiGQuwABSA8AAs5rAALOeg2LAAPzHgK0AAAAAwAD8SDUAAAABAFsBHIh9g4h7wFpsaICuAAAAAMAA/IeDAMBabGg+Ak6IlYibAACAllsBHIimFoidLsAAUgPAALOawACznksBAAGCiKfAWmxaAMAA/LlJiLQhHIi+g4i4wFpsxUgBAAErAMAA/Sk+BUmI0YGI1cBabEY+AT0ciPCAiO3AWmwsgooBAAEngKcAwAD+FD89HIkRgIkOwFpsLIKKAQABgokXwFpsWgDAAP4USYkmJYkwg4kqwFpsxV3AAPx0AWDAAP22PgFJiU0ciVsWiVEuwABr6sAAs5rAALOfgxcBAAGCiWTAWmxaAMAA/XM+AT2LiXnAWmzFJImXAyeZjhyJi4OJhcBabMVYAQABJ4CnAAAnmY8+AT2LibjAWmzFJIngAyeZjhyJ1DWJxQAAAQBbAYOJxcBabMU1AAAAAQBbARyJzISJysBabcqArgAAAAAAhADAWm3KWAEAASeApwAAJ5mPP0mKACEcigqDigTAWmzFSAEAAScAAMAA/Sk+Aj0ciiCAih3AWmwsgooBAAEngLwAwAD+FD0cijmAijbAWmwsgooBAAGDij/AWmzFAMAA/hQ/PYmKWcBabEYpP0qKfgEcioiAioXAWmwsIwAAAADAAP4ZBsAAs6qB9Iqbiq6K1AAAIwFqipxgwAD9HAIAAAEDiraK1AAAAAAAAABgwAD9tgFKirwBJIrUAyfAAGvtHIrILrz7AAAAAMAAs6kngyEGwACzq4H0i6iLuJYfAAHAAGvuAAAAAQOLwJYfAAAAAQEBi8gAAACBsGDAAP22AABgwACzmwE+BU6L3YvmAADAAFIEYMAAs5sBH4vswACzsAAAAABJi/wcjAWAjADAWm7lSAEAASsAwAD9xUqMDgGBjBXAWm78P06MJ4wtAAAnYMAA+9ABk0OMNhyMQ4KMPcBabztjAQABFoxKgIxFwFpu5WHAAP26AMAA/P0+Bk6MXoxkAADAAGvvYMAA+9ABHIxrgIxmwFpu5YC7AgACJ4C8gox4wFpvOwDAAP3JToyKjJMAAMAAa/BgwAD70AEcjJqAjJXAWm7lgLsCAAIngKeCjKfAWm87AMAA/clOjLwAAACAvWDAAP22AE6MzYzWAACwcmDAAPoKASpJjOUiIRyM74OM6cBab3FIAQABHIzylIHEAAAAAMAA+/MAwAD88wAhHI0BhIz4wFpvoEgBAAEcjQSUgcQAAAAAwAD78wDAAPzzPgFJjRIcjRyDjRbAWm9xYwEAAYSNHsBab6AAwAD8/T4DPY2NNMBab88cjUCAjTvAWm7lgL4CAAKCjUrAWm87g41RwFpvcQDAAP3MPY6NY8Bab90pPYqNfsBabzscjYyDjYbAWm9xZAEAAZQAwAD89T4CPY2NrMBab88cjbiAjbPAWm7lgL4CAAKCjcLAWm87hI3JwFpvoADAAP3MPYqN3sBabzscje+EjebAWm+gZAEAAZQAwAD89UmOCyEcjhWDjg/AWm9xSAEAARyOGJSBxAAAAADAAPvzAMAA/PM+Az2NjibAWm/PHI4ygI4twFpu5YC+AgACgo48wFpvO4OOQ8Bab3EAwAD9zD2OjlPAWm/dKT2KjmzAWm87HI56g450wFpvcWQBAAGUAMAA/PVJjowhHI6ZhI6QwFpvoEgBAAEcjpyUgcQAAAAAwAD78wDAAPzzPgI9jY6qwFpvzxyOtoCOscBabuWAvgIAAoKOwMBabzuEjsfAWm+gAMAA/cw9io7awFpvOxyO64SO4sBab6BkAQABlADAAPz1PgI9jY8HwFpvzxyPE4CPDsBabuWAvgEAAYKPHcBabzsAwAD9zD2Kjy3AWm87Fo86gI81wFpu5WHAAP26SY9Qho9UwFpv3T4HTpAGkBQAAMAAa/FdwAD8dAFgwAD9tgExkB5gwAD9tgBOkC+QNgAAughgwAD6CgEiHJA+gpA4wFpvO2MBAAEWkEWAkEDAWm7lYcAA/boAwAD8/QAckFSAkE/AWm7lgdYCAAInmY6CkGTAWm87AMAA/chJkHQUkHjAWnI5CAA+Az0ckJWBkIzAWm78wABr6wEAAYWQoMBab88AwACzoj0ckL+HkLHAWnIZVgEAASeZjwDAAPyFPYqQ08BabzsckNiCkNPAWm87ZAEAAZQAwAD89T9OkPKQ/QAAwABr8mDAAPvQAYKQ/8BabztBQ5EOHJEbgpEVwFpvO2MBAAEWkSKAkR3AWm7lYcAA/boAwAD8/T4CTpE9kUIAAJxoYMAA/bYBHJFJgJFEwFpu5YC+AgACgpFTwFpvOxyRYIKRWsBabztkAQABlADAAPz1AMAA/cxJkXAiFpGCh5F0wFpyGYOywAD8VwAckaMWkZ6HkZDAWnIZgejAAPxZSAEAARSRpsBacyoKAADAAP3FPgI9HJHIh5G6wFpyGYYRAAAAAMAA/JM9ipHiwFpvOxyR54KR4sBabztkAQABlADAAPz1PgJOkhGSHgAAwABr82DAAP22ARySKmqSIF3AAPylAmDAAP22YMAA/bbAAWiKSwEAARSSK8BacyoKAADAAPy5SZI+IRySTxSSQsBac9cLAEgBAAErAMAA/cU+Aj0cknaHkmjAWnIZVgEAARSSesBac9cLAADAAPyFPYqSl8BabzsckpyCkpfAWm87ZAEAAZQAwAD89UmSsxySvBSSt8BacyoKAEgBAAEngKcAwAD9xT4BSZLUFpLmh5LYwFpyGYFVwAD8Vj4BQpMBAEmTHSIckzYWky+HkyHAWnIZYcAA/KNIAQABlADAAPzzABSTPsBacjkIAD4ETpNfk2UAAICWYMAA/bYBHJNsgJNnwFpu5YC+AgACFJN2wFpy6gkAgpOCwFpvOwDAAP3MPRyTo4GTmsBabvzAAGvrAgAChZOuwFpvzxSTtMBadMsMAADAALOiPYqTzMBabzsck9GCk8zAWm87ZAEAAZQAwAD89T0Vk+XAWnLqCYKT8sBabzs+AT2KlCDAWm87HJQlgpQgwFpvO2QBAAGUAMAA/PU+AT2KlFzAWm87HJRhgpRcwFpvO2QBAAGUAMAA/PVJlJEUlJXAWnI5CAA+Ak6UsJS2AACAlmDAAP22ARyUvYCUuMBabuWAvgIAAhSUx8BacuoJAByU2YKU08BabzuBjQEAAZQAwAD89gDAAP3MSZTpFpTzFJTtwFp1mwoAg7LAAP29PgE9HJUWgZUNwFpu/MAAa+sCAAKFlSHAWm/PFJUnwFp1mwoAAMAAs6I/PgJOlV2VYwAAgJZgwAD9tgEclWqAlWXAWm7lgL4CAAIUlXTAWnLqCQCClYDAWm87AMAA/cw9HJWbgZWSwFpu/FYCAAGFlZ/AWm/PAYCWFJWswFp2HQoAwACzoT2KlcbAWm87HJXLgpXGwFpvO2QBAAGUAMAA/PU+AT0cle+BlebAWm78VgEAAYWV88Bab88AwACzoUqWDAGBlhPAWm78AABaZ9EAWmhNAFppRABaaZwAWmn6AFpqZQBaar8AWmsbAFprXwBaa6MAWmwCAFpudgBabsMAWna5AAAADQLAALOxgfSWJJYqpJcDwABr9AAAAWDAAP0cAAFdwAC0ywFgwACzmwABBcAAs7eB9JZrlnGWigEAAAOWiJaKAAAAAAAAAGDAALOxAT8BCQGWccAA/TIAAAAAAwbAALOzgfSWj5aio88AAMAAa/UBapaQYMAA/RwCAAABA5auo88AAAACAgKWuAAAIMAAa/ZgwACzmwCWzwAAAMAAa/dgwAD9tgAAYMAA/bYBPgFJluMclvSBlufAWneKSAEAASeDiADAAP3FPgFKlwQBK0mXHByXLYGXIMBad4pIAQABJwAAwAD9xT4BSpc8ASMWl1KAl0PAWnd7g7LAALOuJ8AAa/grAWDAAP22PgZOl56XqgAAwABr+V3AAPx0AWDAAP22ATGXrGDAAP22AE6Xv5fQAADAAGv6YMAAs5sBHpfbwACzqwEAAYGX5MBad4oATpgFmBcAAMAAa/tdwAD9ZwFgwAD9tgEemB3AAMDiAAFgwAD9tgAAPRyYQ4OYMsBaeCCD+AEAATSYSwOYS6JPAAAAAgICmFMAAACD0WDAAP22AJhfAAAAwABBW2DAAP0cAABgwAD82QE+BU6YfZiJAADAAGv8YMAA+goBKUmYmRyYoYWYncBaeIeB1gEAASeZ4QDAAP3IPgI9jZi+wFp4hxyYyIWYxMBaeIeAvgEAAZQAwAD9zD2PmODAWnitKj89HJkZhJkHwFp4Q1YBAAGFmR3AWniHAMAA/XROmTKZPgAAwABr/WDAAP0cARyZToCZQMBad3tLAQABhZlPwFp4hwDAALOmSZldIYeZYsBaeK0+AUmZexyZjoCZf8Bad3uHQQEAAYWZmsBaeIcAwACzpD4BPRyZuoKZrsBaeABWAQABJJnrBCfAAGv+hZnawFp4hyeAvBSZ38BaeR0IAADAAPyFP0maCSEcmh2Amg7AWnd7h0EBAAGFminAWniHAMAAs6Q+AT0cmkeCmjvAWngAVgEAASSaYwInwABr/4WaX8BaeIcAwAD8hUmadRyah4aaecBaeJRIAQABJwAAwAD9KT4BSZqaIRyaqhSansBaeR0IAEgBAAEnAADAAP0pPgE9HJrLgpq/wFp4AFYBAAEkmu4CJ8AAbACFmurAWniHAMAA/IU/SZsMHJsehpsQwFp4lEgBAAEng4gAwAD9KT4BSpsyAEmbSSWbW4abTcBaeJRdwAD8dAFbPgFJm3Alm4AUm3TAWnkdCABdwAD8dAFbPgNOm5ybpwAAwABsAV3AAPx0AVsBHJu1FJupwFp5HQgBXcAA/HQBW4CtAAAAAMAA/EhGm8ub+JvXAAAAwABsAmDAAP0cABSb6cBaeJQGAV3AAPx0AVs+BE6cD5wcAADAAGwDYMAA/bYBJJwvARScIMBaesgKAE6cRJxPAACfqWDAAPoKASpJnGYcnHcUnGrAWnrqCwBPAQABJ4OIAMAA/cc+BE6cxJzLAACDJGDAAP22ARyc7hSc4cBaeuoLAIC+AgACkxydCBSc+8BaeuoLAIC7AQABJ4OIAMAA/ckAwAD9zE6dLJ00AAC+MV3AAPx0AVsBMZ02WwBGnUqdcp1WAAAAwABsBGDAAP0cABSdZsBaepQJAD4BSZ2GHJ2aJJ2ZARSdjMBae44PAIHWAQABFJ2lwFp7NQ0AAMAA/cg+Aj0cncwUncTAWnt0DgBWAQABFJ3QwFp7jg8AAMAA/IU9FZ3zwFp7CAwpP0aePJ5ankgAAABfYMAA/RwAFJ5RwFp7dA4APgE9HJ55FJ5uwFp6lAkAhFkBAAEUnoDAWnv/DwAAwAD8kT4BQUaewZ7pns0AAADAAGwEYMAA/RwAFJ7dwFp6lAkAPgFJnv0cnw4UnwHAWnrqCwBIAQABJJ8gARSfE8BafD4NAADAAP3FPgM9HJ9DFJ84wFp6lAkAhFkBAAEUn0rAWnw+DQAAwAD8kT0Vn23AWnsIDClCn5QAP0mf3yEUn+TAWnsIDAA+AT0coA6CoALAWngAVgEAASSgOwUnwABsBYWgJ8BaeIcnwABsBhSgLcBaeuoLACeZjwDAAPyFP0mgaBagdxSgbMBaepQJAIOywAD8Vz4BPRygsoKgk8BaeABWAQABJKDnBSfAAGwHhaDJwFp4hyfAAGwGHKDbFKDQwFp6lAkAWAEAASeApwDAAPxGJ5mPAMAA/IU/PgE9HKEjgqEXwFp4AFYBAAEkAAgnwABsCIWhQMBaeIcng1UnwABsCRShY8BaeJQGAV3AAPx0AVsnwABsChShfMBaeR0IACeDQgDAAPyFSaGoIRyhuoahrMBaeJRIAQABFKG9wFp5HQgAAMAA/Sk+AT0coeKCodbAWngAVgEAASSiOwcnwABsC4WiBMBaeIcnwABsDIaiFMBaeJQnwABsChSiLcBaeR0IACeDQgDAAPyFPwDAALOoPRyiZ4CiWMBad3uD+AEAATSibwOib6N+AAAAAgIConcAAACD0WDAAP22AKKDAAAAgJZgwAD9HAAAYMAA/NkBPgFJopQhHKKrhKKZwFp4Q4MXAQABhaK0wFp+JADAAP1zPgFJosYcotCGosrAWn4xSAEAAScAAMAA/Sk+AT0covGCouXAWngAVgEAASSjDgMnwABsDYWjCcBafiQng0IAwAD8hT4BPRyjPIKjMMBaeABWAQABJKNeBCfAAGwHhaNTwFp+JCeAvIajWMBafjEAwAD8hT8AwACzqEqjhwEjFqOagqOOwFp4AIOywAD8Vxyjs4Kjp8BaeABYAQABJ68JAMAA/EYrAWDAAP22BsAAs7SB9KPUo+ekKQAAvPsBaqPVYMAA/RwCAAABA6PupCkAAAABAQGj+AAAIMAAbA5gwACzmwAAYMAA/bYBPgFKpAoBHKQcgKQRwFp/Orz7AAAAAMAAs6kGwACztYH0pC6kP6SVAACBVQFqpC9gwAD9HAIAAAEDpEaklQAAAAEBAaRQAAAgwABsDmDAALObAABgwAD6CgE+AUqkYgEiHKR0gKRpwFp/k0gBAAErAMAA/SkBFqSKgKR/wFp/k4FVwACzrQAAWndQAFp/EQBaf2oAWn/VAAAAAwAAAYH0AFp/7ABaZyQAWnb2AFp/6gAAAAIAWn/sAAAAAAAAAMAAs7gAgfUAAAOA2gAAwADEwwAAgPIAAMAAtOkAAIEYAADAAE/eAAEBAabFAAAAAgLAALO5gfWBUoFYg/8DwABojQAAAWDAAP0cAAFgwABP3wIEwACzvIH1gZOBngnAAGwPwACzuABgwACzxwAEwACzvYH1gbWBvhjAAGwQwACzuABgwADG5gABBcAAs8aB9YHDgcOCGgCAtcAAs7gAA4HLghoAAAABAQGB0QAABMAAbA9gwACzxwAAYMAAs7kBPwMIAcAAs7yAAMBagLcIAMAAs70cgfcagfLAALXZtC8BAAGAgg7AWoC3AMAAtd4JAYHDwAD9MgAAAAAEBsAAs7+B9YIfgieCSgQBAAAAAAEDgi2CSgAAAAAAAABgwACzuQFKgjMBH4I6wACzxgEAAR+CPMAAs9EAAAAAAAbAALPBgfWCT4JggooAAIOJAWqCUGDAAP0cAgAAAQOCZoKKAAAAAQEBgmsAAABhYMAA+9AAAFwBPgAGwACzwoH1go+CoIMDAACmyAFqgpBgwAD9HAIAAAEDgqaDAwAAAAEBAYKuAAAAgbBgwAD9tgAAXAE+AUmCuiEcgsgWgr4uwABsEMAAs7jAALO9SAEAASsAwAD9KT4BPRyC4xaC2S7AAGwQwACzuMAAs71WAQABHILsaoLnYMAAySiBh5VEAQABgILzwFqBrADAAMcxAMAAxxY/BsAAs8OB9YNhg2iD/QAAwABIHgAAAAEDg2+D/QAAAAAAAABgwAD9tgE+AkmDeCEcg4YWg3wuwABsEMAAs7jAALO9SAEAASsAwAD9KT4CPRyDoRaDly7AAGwQwACzuMAAs72CiAAAAADAAMcXPReDsC7AAGwQwACzuCvAALO9P0qDzAEcg9pqg9NgwADGZcABaK+VRAEAARaD8xaD7RaD4S7AAGwPwACzuMAAs7yAlsAAs8yENMAAtZkAwADHMQAAWoEJAFqBSQBagYMAWoIdAFqC2wAAAAQCwACzx4H1hE6EVIXzA8AAbBEAAAFdwAD9hAFgwAC1lwAAAQTAALPKgfWEgISGGJcGwACzuABgwAC1lwErAQXAALPRAAAAAAQAAAMAAAAAAAAAAABgwACzxwE/AQkBAMAA/YkAAAAAAwbAALPMgfWEtoTBhPoBAICWAAAAAQOEx4T6AAAAAAAAAGDAALWXAT4CQCEchNsWhNQulwbAALO4wACzykgBAAErAMAAtZuE1ITiAEqE6QEWhPAulwbAALO4wACzygbAALPOgfWFXIVthbMAAFYBaoVdYMAA/RwCAAABA4VwhbMAAAABAQGFeAAAIICWYMAAtZcAAFwBPgJAHIWTFoWMLpcGwACzuMAAs8pIAQABKwDAALWbhYyFmgA9F4WhLpcGwACzuICFqsBag+HAALPKBsAAs8+B9YW4hcmF8QAAgogBaoW5YMAA/RwCAAABA4XOhfEAAAAAAAAAXAE+AUAhHIXlFoXeLpcGwACzuMAAs8pIAQABKwDAALWbhd6F7AAAAFqDXABag7kAWoQqAFqEegAAAAMAAAGB9QBahJEAWoA+AFqC9ABahI8AAAACAFqEkQAAAAAAAADAALPSwABsEoH2AAAHgP8AAFINAIE/AACCLgABAQGG4oFvAABaAAEBA4KNgoeCeoG9AACB4AAAgdkAAKVvAACB+gAAwABP3gABAQK887zmgkMAAMAAQcEAAQECttu28QAAAAUCwACz04H2goaCjKssA8AAaI4AAAFgwAD9HAAACATAALPVgfaCroK1CYHjAGDAAP22AATAALPWgfaC6oL2CYL9AGDAAP43AATAALPXgfaDMIM9CcAAbBMAYMAA/jcABMAAs9iB9oNZg2kJwABsFABgpXAABMAAs9mB9oOIg6wJg9AAXcAA/HQBYMAAs/kBHoOWwAD3bgEBYMAAs/kBkwAEwACz2oH2hBGEJAnAAGwVAF3AAPylAmDAAP22YMAA/bYABMAAs9uB9oRChFcJwABsFgBdwAD8pQJgwAD9tmDAAP22AATAALPcgfaEt4S9CbzxAF3AAPylAmDAAPvQXcAA/HQBYMAAQlQAAQXAALPpgfaEwoTChYwAAAADhNKFjAAAAAcHB4TfAAAEgeNgwAD9tgCE8wAABIL9YMAA/jcAhQwAAATAAGwTYMAA/jcAhSYAAATAAGwUYKVwAIVDAAAEwABsFV3AAPylAmDAAP22YMAA/bYAhWMAAATAAGwWXcAA/KUCYMAA/bZgwAD9tgCFhQAABLzxXcAA/KUCYMAA+9BdwAD8dAFgwABCVAAAYMAAs9MBPwgIAcAAs9WAAMBahjsIAcAAs9aBAMBahkgIAcAAs9eCAMBahlUIAcAAs9iDAMBahmQIAcAAs9qEAMBahnEIAcAAs9uFAMBahosIAcAAs9yGAMBahqUJAYTCwAD9MgAAAAAJBsAAs96B9oWRhZaGGQAAwABsFwAAAAEDhaCGGQAAAAICAoWlAAAAvOhgwAD70ACFwgAAALbhYMAAQhEAAFwBPgE9HIXgFoXYLoPQwACz2VYBAAEfhejAALP+AgACgYX3wFqHXICGB8Bah08AAMAA/IUGwACz34H2hh6GI4dzAADAAGwYAAAAAQOGNIdzAAAAAgIChkYAAACXVV3AAPwyAWDAAP22AIZcAAAAgotgwAD+AAAAXAE+BE6Gb4Z1AACDGWDAAPoKASk9HIaIgYaBwFqH04KKAQABJ5mOAMAA/hRGhpiGt4akAAAAg+xgwAD9tgCAhq7AWofAPgVJhr8hgobEwFqH5j0chtKBhsvAWofTgooBAAEngKcAwAD+FD89HIbrgYbkwFqH04KKAQABJ4OuAMAA/hQ9Hob9gecCAAKDhxXAWogSgYcdwFqH0wA9HIczgYcswFqH04KKAQABJ4OuAMAA/hQ9iodFwFqH5io9HIdlgYdewFqH04KKAQABJ5mPAMAA/hQGwACz4IH2h3iHf4tvAACihgAAAAEDh4SLbwAAAAAAAABgwAD9tgE+BE6Hq4e5AADAAGwZXcAAs/8BYMAAs/kBH4fHwAC0DgABYMAAs/kAAE6IFIgmAADAAGwaXcAA/KUCYMAA/jddwACz/wFgwACz+QEyiFRgwAD+N13AALP/AWDAALP5AD0ciGQWiFwug9DAALPZg/gBAAE0iGwDiGyLRwAAAAEBAYh8AAAAwABsG2DAALP5AABgwAD82QE+Bk6InYisAADAAGwcYIphARyIyRaIuC7AAGwUwACz2IbfAQABFojkgojVwFqJXLzowACz/AClck6I/YkCAACB+mDAAPvQARyJGBaJE4OJBMBaiXWB+opkgY0BAAGUAMAA/PZOiSeJLgAAhuNgwAD70AEciUYWiT+DiTDAWol1huOKZYGNAQABlADAAPz2PRyJX4CJUcBaiN9WAwADhIljwFqJq4WJacBaidaCiXHAWolcAMAAtAZOiZiJoQAAhFtgwABCEQEWibKCiaPAWolctuHAALP7SYnIIRyJ1YaJzMBaiipIAQABKwDAAEIfPgFJieghHIn/Fon1honswFqKKrbdwABCFUgBAAErAMAA/l4+Ak6KMopGAADAAGwdXcAAs/8BYMAAs/kBHIpogYpWwFqJBpkVAgACFop9hop0wFqKKrbdwABCFTSKmgOKmorDAAAAAAAAAF3AALP/AWDAALP5AUqKoAEfiqTAALQOAAFgwACz+QAAAMAA/MA9HIrkh4rQwFqKhlYDAAMciwUWiwCGivfAWooqgfrAAEIXgY0BAAGUAMAA/PYcixoWixOGiwrAWooqhuPAAEIYgY0BAAGUAMAA/PaCix/AWolcAMAAtAY/PwDAAPxCSotPARyLVi7AAGwewACz0gEAAYCLXcBaiN8AwACz4gbAALPigfaLdIt7lUwAAMAAbB7AALPSAAAAAQOLgZVMAAAAAQEBi6AAAADAAGwZXcAAs/8BYMAAs/kAAGDAAP22AT4mTovDi8oAAMAAbB9dwAC0DwFgwAD+NwEfi9DAALQYAAFgwAD+NwAATov2i/4AAJ4LXcAAtA8BYMAA/bYBH4wEwAC0GAABYMAA/bYAAE+MHYwiAAABwABsIGEBYMAAQhFcAAOMMo1rAAAAAQEBjEIAAAC24WDAAEIRAABcAT4BSYxaIRyMbYSMXsBajBxIAQABKwDAAEIfPgFJjIAhHIydFoyThIyEwFqMHLbdwABCFUgBAAErAMAA/l4+Aj0cjLmBjLLAWouxwABL6gEAARaM0YSMwsBajBy23cAAQhUAwAC0E0mM5yEcjQUWjPqEjOvAWowctt7AAEIZSAEAASsAwAD9xT4BPRyNJIKNHMBai9jAAEvqAQABFo08hI0twFqMHLbewABCGQDAALQTPz8/PRyNgICNcsBai5LAAGwhAQABNI2PA42PjdsAAAABAQGNnwAAAIPPYMAAs/kAAGDAAPzZAT4BPRyNvoONrsBai/8gAQABFo3FhI2/wFqM/7bhwACz+wAAAMAAtAw9HI3+Fo33Fo3jLsAAbBXAALPaKcAA/MiD+AEAARaODoKOBsBai9jAAEvqwAC0EwDAAPxCPRyOOhaOMxaOHS7AAGwWwACz2ynAAPzIg/gBAAEWjkqCjkLAWovYwABL6sAAtBMAwAD8QkaOWY6Jjm8AAACD0F3AAPx0AWDAAEJUABaOgRaOei688cAAs9wpwAD8yD4BRo6RjqyOmgAAALh/YMAAQlQAhI6jwFqNqD4CPRyOxoOOtsBai/8gAQABFo7NhY7HwFqN1LbywABCVgAASY7kIRyPABaO7oWO6MBajdS2rsAAQldIAQABKwDAAP3FPgE9HI8dgo8VwFqL2MAAS+oBAAEWjyyFjybAWo3Utq7AAEJXAMAAtBM/To9qj3kAAMAAbCJgwAD+AAEfj3/AAP4fAAAAAD0cj5MuwABsIwQABICPoMBai5KBj6/AWouxgo+3wFqL2ISPwMBajlcAwACz406P44/qAACCi2DAAP4AAR+P8MAA/h8AAAAAPRyQC4WQBMBajqCCigEAASfAAGwkAMAA/hQ9HJAkhZAdwFqOoIKKAQABJ8AAbCUAwAD+FD0ckEuFkETAWo6ggooBAAEkkGwDJ8AAbCYWkGAugePAALPVJ8AAbCcAwAD+FEmQcyIhHJCEFpB3LoL9wACz1kgBAAErAMAA/l4AIRyQnRaQjy7AAGwTwACz10gBAAErAMAA/l4+AT0ckLWFkK7AWo6ggooBAAEkAAQnwABsKCeDrh6Q1pNqAwADFpDnLoL9wACz1haQ9S7AAGwTwACz1yoAJ8AAbCcAwAD+FD89HJEkhZEdwFqOoIKKAQABJ8AAbCkAwAD+FD0ckU+FkUjAWo6ggooBAAEnwABsKgDAAP4UTpF8kZIAAMAAbCtdwAD8MgFgwAD9tgFqkZRdwAD8dAFgwAD9toMbSZGqIRyRuxaRri6C/cAAs9ZIAQABKwDAAP5ePgE9jpHMwFqPzhyR/haR9YGR7sBai7GIP8AAtBaAqwEBYMAA/bYBNJICA5ICkjEAAAABAQGSAwAAALsuYMAA/jcAAGDAAP22AUqSCQEekgmTagMAAxaSGi6C/cAAs9aHkijAWpBEKgAAwAD8PT89HJI+LsAAbBgCAAKGklDAWo/OhZJnwFqOoADAALPfPRySe4WSdMBajqCCigEAASfAAFqiAMAA/hQ9HJKUhZKNwFqOoIKKAQABJ8AAbCwAwAD+FD0ckq4uwABsGAIAAhaSyIKSwMBai9iIP8AAtBaFktLAWo6gAMAAs989HJLmhZLfwFqOoIKKAQABJ8AAWqIAwAD+FD0ckv+FkvjAWo6ggooBAAEnwABsLQDAAP4UPRyTJIWTHcBajqCCigEAAYSTKsBajlcAwAD+FD0ck0aFkz/AWo6ggooBAAEnwABsJwDAAP4UPRyTYIWTWcBajqCCigEAASfAAGwuAMAA/hQ9HJOVhZOOwFqOoIKKAQABJ8AAbC8AwAD+FD0ck8SFk73AWo6ggooBAAEnwABsMADAAP4UPRyT4y7AAGwxAwADFpP2LsAAbBXAALPagpQLwFqL2IWUFMBajqAAwACz5D0clCiFlCHAWo6ggooBAAEnwABaogDAAP4UPRyUQYWUOsBajqCCigEAASfAAGwyAMAA/hQ9HJRiLsAAbDEDAAMWlHUuwABsFsAAs9uClIzAWovYhZSVwFqOoADAALPkPRyUqYWUosBajqCCigEAASfAAGwzAMAA/hQ9HJTJhZTCwFqOoIKKAQABJ8AAbDQAwAD+FD0clOYuwABsNQMAA4GU8sBai7GClPrAWovYhZUDwFqOoADAALPlPRyVF4WVEMBajqCCigEAASfAAGw2AMAA/hRKlTABHJU+hZU3wFqOoCMAAAAAwAD+GQbAALPjgfaVUZVWnFMAAMAAbCMAAAABA5VinFMAAAAEBASVgQAAAIPQXcAAs/8BYMAAs/kAlZgAAADAAGwfXcAAtA8BYMAA/jcAlbcAAACeC13AALQPAWDAAP22AJXNAAAAgZNgwAD+AAAAXAE+CU6V6gAAAMAAbDdgwABCEQBOlgqWHQAAwABsOGDAAPvQAZNOljOWRwAAwABsOWDAALPqAR+WTcAAs/gAAAAATpZmlncAAMAAbDpgwAD6CgEpTpaQlqYAAMAAbDtgwACz6gEflqzAALP4AAAAAE6WzZbfAADAAGw8YMAAs+oBH5blwACz+AAAAABOlwaXGgAAwABsPWDAALPqAR+XIMAAs/gAAAAATpdBl1gAAMAAbD5gwACz6gEfl17AALP4AAAAAD0cl3uAl3PAWpLng/gBAAE0l4MDl4OcTgAAAAMDA5eIAAAAwABsP2DAAPvQAJeYAAAAwABsQGDAAPvQAJe1AAAAg89gwACz+QAAYMAA/NkBPgxOl9OX4gAAtuFgwABCEQEWl+oUl+TAWpQwDgC24cAAs/tJmAAcmBMUmATAWpRHDwBIAQABhJgWwFqTNQDAAEIfPgFKmDgAP0mYTxyYXhSYU8BalBIMAICXAQABhZhgwFqTRQDAAPz/PgVFmH4BmIeYiQAAYmDAAPvQAYWYi8Bak0UBHJihFJifwFqUsxAAYwEAARSYo8BalBIMAADAAPz9ARWYscBalLMQHJivFJixwFqUsxAAZAEAAZQAwAD89T4BPRyYx4OYwMBakyKCigEAASeWngDAAP4UPY2Y5cBak0UUmPrAWpQSDAA9jJkOwFqTNSs9HJlJhpk1wFqTV5zIAAAAAMAAs/Q9j5lawFqTcyk/SZmCIYeZh8Bak3M+AT0cmaqDmaPAWpMigooBAAEngKcAwAD+FD89j5nEwFqTcyo9HJn5hpnlwFqTV5VEAgACg5oAwFqTIhSaCMBalCENAADAALP1SZoeHJoxFJoiwFqURw8ASAEAASsAwABCHz4BSppEAD9Oml+aaQAAtt1gwAD+NwEWmnoUmmvAWpRHDwC23cAAQhVJmoshHJqZFJqPwFqVzRAASAEAASsAwAD+Xj4DPRyawhSarMBak4UIAJVEAgACg5rJwFqTIhya14Ga0cBakvpLAQABFJrYwFqVzRAAAMAAtBQAwACz9T0cmv8Umu3AWpOhCQCVRAIAAoObBsBakyIcmyIWmx0Umw7AWpRHDwCB+sAAQheBjQEAAZQAwAD89gDAALP1PRybRBSbMMBak70KAJVEAgACg5tLwFqTIhybaRabYhSbU8BalEcPAIbjwABCGIGNAQABlADAAPz2AMAAs/U/TpuFm5AAALbeYMAA/bYBFpuhFJuSwFqURw8Att7AAEIZSZuzIRybwhSbt8BalsERAEgBAAErAMAA/cU+AT0cm+wUm9XAWpPZCwCVRAIAAoOb88BakyIcnAKCm/vAWpMPSwEAARScA8BalsERAADAALQUAMAAs/U/PYycIMBakzUUnDnAWpRHDwAAwAC0CwbAALPkgfacWJxdnkEAAMAAbDEAAAABA5xvnkEAAAADAwOchAAAAMAAbEFdwAD8pQJgwAD9tmDAAP22AJyqAAAAngtdwAC0DwFgwAD9tgCcwAAAAIKLYMAA/gAAAFwBPgROnNOc2QAAgxlgwAD6CgEpPRyc7IKc5cBal52CigEAASeDrgDAAP4UPRydCoCc/MBal3CD+AEAATSdEgOdEp4lAAAAAgICnRoAAADAAGxCYMAA/bYAnS8AAACAvWDAAP22AABgwAD82QE+BUmdPSGDnULAWpewPRydUIKdScBal52CigEAASeApwDAAP4UPz0cnbqCnbPAWpedgooBAAGEncDAWpf1AMAA/hQ9HJ3cgp3VwFqXnYKKAQABJ4CnAMAA/hQ9HJ31gp3uwFqXnYKKAQABHJ4CgZ37wFqXiksBAAGFngPAWpgEAMAAtBQAwAD+FD2LnhHAWpewKgDAAPzEPRyeM4KeLMBal52CigEAASeDrgDAAP4UBsAAs+WB9p5GnkuigwAAwABsNQAAAAEDnlaigwAAAAMDA55sAAAAwABsH13AALQPAWDAAP43AJ6FAAAAngtdwAC0DwFgwAD9tgCemwAAAIKLYMAA/gAAAFwBPghOnq2euwAAwABsQ2DAALPqAR+evcAAs/gAAAAATp7VnuAAAMAAbERgwACz6gEfnuLAALP4AAAAAE6e+p8GAADAAGxFYMAAs+oBH58IwACz+AAAAABOnyCfLgAAwABsRmDAALPqAR+fMMAAs/gAAAAATp9In1QAAMAAbEdgwACz6gEfn1bAALP4AAAAAD0cn3GCn2rAWpkRgooBAAEng64AwAD+FD0cn4gWn4EuvPHAALPcg/gBAAE0n5ADn5CiZwAAAAICAp+VAAAAg1xgwAD70ACfrgAAAIPQXcAA/HQBYMAAQlQAAGDAAPzZAT4BRp+/n9qfyAAAAIPPYMAAQlQAFJ/RwFqZ9QkAPgI9HJ/yg5/kwFqZJJVEAgACgp/5wFqZERSgAcBamegIAADAALP1SaASFqAcFKAWwFqaFgoAtvTAAEJaPgVOoD+gSAAAhFtgwABCEQEWoFAUoErAWpoWCgC28sAAQlY9HKBzhKBowFqZQJVEAgACgqB6wFqZERygiICggsBamOlLAQABFqCSFKCJwFqaawsAtt3AAEIVAMAAtBQAwACz9T0coLWFoKnAWplclUQCAAKCoLzAWpkRHKDSFqDNFKDEwFqaawsAgfrAAEIXgY0BAAGUAMAA/PYAwACz9T0coPCGoOLAWpl4lUQCAAKCoPfAWpkRHKEPFqEIFKD/wFqaawsAhuPAAEIYgY0BAAGUAMAA/PYAwACz9T0coSuHoR/AWpmUlUQCAAKCoTLAWpkRHKFBgaE6wFqY/ksBAAEWoUgUoULAWpoWCgC2rsAAQlcAwAC0FADAALP1PgE9HKIrgqIkwFqZEYKKAQABIxaiNxSiMcBamhYKALbzwABCWCeWnieApwFgwAD9tgDAAP4UAMAA/MQ9HKJ1gqJuwFqZEYKKAQABJ4OuAMAA/hQGwACz5oH2oxSjIqQyAAHAAGxIAAAAAQOjNqQyAAAAAgICozsAAACC/WDAAP43AKNNAAAAhGFgwAD+NwAAYMAA/bYBPgJJo1wiIRyjbYCjYMBam/pIAQABKwDAAP5eACEco4CBo3jAWpwHSAEAASsAwAD+Xj4CTqOYo6oAAMAAbElgwAD9tgEeo6yTagMAA4GjvcBanAeAo8bAWpv6KgBKo+IBJKQZAyfAAGxKgqQEwFqcTyeArz9KpCUBJwAGwACz54H2pY+lm6sqAAHAAGxLAAAAAQOlqqsqAAAACAgIpcoAAADAAGxMYMAAT/8ApfoAAADAAGwUYKVwAKYmAAAAwABsFV3AAPylAmDAAP22YMAA/bYAplUAAADAAGwWXcAA/KUCYMAA/bZgwAD9tgCmeQAAAIC9YMAA/bYApokAAACC/WDAAP43AKahAAAAhGFgwAD+NwCmvwAAABlggJEAAFwBPgJOp3KneAAAJ2DAAPvQAZM9HKeyFqeZgKeBwFqct7apwABQA4P4AQABNKe6A6e6qyUAAAABAQGnywAAALapYMAAT+UAAGDAAPzZAT4HTqf1qAYAAMAAbE1gwACz0wEfqAzAALPpBwAHFqg4FKgowFqdcwkAgL3AAE/nhahIwFqdFIaoYMBanSGBqHPAWpzGgqiPwFqc04OorsBanO0WqN8UqM/AWp1zCQC87sAAT+gAPRypBBSo9MBanXMJALztAQABFqkrFKkawFqdigoAwABsF8AAs94AwABP7U6pRalPAACCg2DAAP22ARypYhSpUcBanYoKAKKGAAAAAMAAs+BOqXipggAAgo9gwAD9tgEnwABsTkmplBypnhSpmMBanT4IAICXAQABkwDAAPz/PgFJqa0cqbaEqbHAWp0HSAEAAScAAMAA/cU+Aj2MqcnAWp0HIyEcqdiGqdDAWp0hSAEAASsAwAD+Xhap9xap6oap4sBanSGDGMAA/kWB6MAA/FkngV4BYMAA/bY9FaoSwFqePQwkqjsCJ8AAbE8WqjUUqiXAWp1zCQCAvcAAT+c+AT0VqljAWp49DCSqhAInwABsUBaqfhSqbsBanXMJAIC9wABP5z89NaqtAAABAGCAhQEcqq2Hqp7AWp0ugo4DAAOEqr7AWp0HFKrEwFqePQwAaqraYHWCGgCAkzUAAAABAFsBHKrvFKrtwFqfEw0AVgEAARSq88BanhgLAACAhzUAAAABAFsBHKsIFKsGwFqfEw0AgogAAAAAgIgUAMBanxMNAD0VqxfAWp0+CByrHBSrF8BanT4IAGQBAAGUAMAA/PUAwAD8QgAAWoctAFqHngBaiLUAWotsAFqSxQBal04AWpjHAFqb2ABanJUAWp+yAAAACQLAALPqgfarW6thsF8DwABsUQAAAWDAAP0cAAAGBMAAs+2B9qujq60YlwbAALPSAGDAAPvQAZMEwACz7oH2rQutHQbAAGxSAGDAAPvQAWqtHGDAAPvQgjwEwACz74H2rTKtTgbAAGxTAGDAAPvQAWqtS2DAAPvQwABgHQTAALPwgfatY62ABsAAbFQAYMAA+9ABaq18YMAA+9CDKwTAALPxgfatla2zBsAAbFUAYMAA+9ABaq2vYMAA+9CDKwTAALPygfaty64mBsAAbFYAYMAA/bYBagBgwAD9tsABaL4BBcAAs/gAAAAABAAAAwAAAAAAAAAAAGDAALPqAT8BCQEAwAD9MgAAAAADBsAAs/SB9qvgq+WsAQAAnMgAAAABA6vqrAEAAAAAAAAAXAE+AT0Xq/MulwbAALPSk8AAs+0GwACz9YH2rJasm6z1AACVRAAAAAEDrKGs9QAAAAICAqyvAAAAgZNgwAD+AACsuwAAAICWYMAA+9AAAFwBPgE9F6zILpcGwACz0h6s0cAAs/YDAAOArNvAWqE+gazjwFqhSxas6i6XBsAAs9LAALPtAMAAs+0GwACz9oH2ro6umbBdAAHAAGxYAAAAAQOuorBdAAAAAwMDrrAAAACBk2DAAP4AAK68AAAAgJZgwAD70ACuxwAAAINcYMAA+9AAAGDAAPvQAT4GTq7Zrt8AAJsoYMAA+9ABHK7nga7hwFqhwoGNAQABgq7pwFqhzwDAAPz2Tq75rwEAAMAAbFlgwAD70AGTSa8KHK8Ug68OwFqh5mMBAAGTAMAA/P0+Aj2MryHAWqIQlD2LrzTAWqHmHK88g689wFqh5oHEAAAAAMAA+/M/PYuvTsBaoeYcr2Mcr12Dr1fAWqHmg7oBAAGUAMAA++yBBgEAAYSvZcBaohAAwAD76USvcj4ETq+Br4cAAKwKYMAA+9ABHK+Pg6+JwFqh5oN3AQABaq+RYMAA+9DAAGAdAMAA++g9i6+mwFqh5hyvrIOvpsBaoeaDvAEAAWqvsGDAAPvQgjwAwAD77Umvxhyv0IOvysBaoeaAlwEAAZMAwAD8/z4BPY2v38Baopccr+WFr9/AWqKXgQYBAAFqr+hgwAD70IMrAMAA++k/PRywE4CwDMBaobWCigEAARywJmqwGWDAAP22wAFovksBAAGFsCfAWqKXAMAA/cMAwAD+FBywQ4OwPcBaoeaAlwEAAZMAwAD8/0qwTQGBsFTAWqHCAABaoOkAWqEeAFqhkwBao4AAAAADAsAAs/mB9rBisGiw6QPAAGxaAAABYMAA/RwAAAIEwACz+4H2sIqwmBi24QBgwABCEQAEwACz/IH2sKCwrBi86ABgwAD70AABBcAAs/6B9rCxsLGw5wAAAAOwv7DnAAAAAgICsMUAAAS24WDAAEIRALDaAAAEvOhgwAD70AAAYMAAs/kBPwMIAcAAs/uAAMBao/gIAcAAs/yBAMBapAUJAbCxwAD9MgAAAAAAAABapEAAAAAAAsAAs/+B9rElsSu6cgPAAGxbAAEAAIJ2YMAA/RwBWwFgwAD9HAAAAQTAALQCgfaxXLF9WKkIwACz0gBdwAD8pQJgwAD70F3AAPylAmDAAPvQXcAA/HQBXwAAATKxe2DAAPvQXcAA/KUCYMAA+9BdwAD8dAFfAAAAAQXAALQOAAAAAAQAAAMAAAAAAAAAAABdwACz/wFfAAABPwEJAQDAAP0yAAAAAAgGwAC0BYH2scix0LJaAADAAGxcwACz0gAAAAEDsdiyWgAAAAICArHdAAAAgfpgwAD70ACx5wAAAIbjYMAA+9AAAF3AAPx0AV8AAAE+Ak6yB7IPAADAAGxdXcAA/KUCYMAA+9BdwAD8dAFfAAABNQAAAAEAXcAA/KUCYMAA+9BdwAD8pQJgwAD70F3AAPx0AV8AAAEWshEuqQjAALPSwAC0AjUAAAABAGDAAPvQAYCyFsBapRY1AAAAAQBdwAD8pQJgwAD70F3AAPx0AV8AAAEcshWCshXAWqVeSwEAAYOyFcBapZIAwAD8uSMcshyEAMBapaVIAQABKwDAAP0pNQAAAAEAXcAA/KUCYMAA+9BdwAD8dAFfAAABMrIuYMAA+9BdwAD8dAFfAAAANQAAAAEAXAEcshWCshXAWqVegL8CAAKDshXAWqWShQDAWqXuAMAA/LqFAMBape6EAMBapaUBXcAA/KUCYMAA+9BdwAD8dAFfAABKsjYBNQAAAAEAXcAA/KUCYMAA+9BdwAD8dAFfAAABgrI9wFqlPjUAAAABAGDAAPvQAYGyRcBapSM1AAAAAQBdwAD8dAFfAAABHLJEg7JEwFqmaUsBAAGEskTAWqaLAMAA/LkjHLJNhQDAWqaeSAEAASsAwAD9KTUAAAABAF3AAPx0AV8AAAExslRfAAAANQAAAAEAXAEcskSDskTAWqZpgL8CAAKEskTAWqaLhgDAWqbcAMAA/LqGAMBaptyFAMBapp4BXcAA/HQBXwAABsAAtAaB9rLAssWzFwAAVgAAAAEDssizFwAAAAMDA7LNAAAAgfpgwAD70ACy1wAAAIbjYMAA+9AAsuEAACCWIF8AAAAAXAE+AT0cswccsvAuwABsXMAAs9ICAAKAsvnAWqdQgbL/wFqnXQDAALQFVgEAAYKzC8Bap2oAwAD8hQbAALQHgfazg7OIs+UAAMAAa0MAAAABA7OQs+UAAAADAwOzlQAAAIH6YMAA+9AAs58AAACG42DAAPvQALOpAAAgliBfAAAAAFwBPgE9HLPPHLO4LsAAbFzAALPSAgACgLPBwFqn0oGzx8Bap98AwAC0BZ7KAgACk4Kz2cBap+wAwAD8jgbAALQIgfa0a7RwtNUAAMAAbF4AAAABA7R7tNUAAAABAQG0fAAAAIGmYQFgwAD70FsAAFwBPgJOtJm0nwAAluZdwAD8dAFgwAD70AE1tKsAAAEAXcAA/HQBYMAA+9ABHLSrFrSmFrShLqkIwACz0sAAtAKDYsAA/MeArQAAAADAAPxINQAAAAEAWwEctLWBtLPAWqiBgK4AAAAAwAD8h4EAwFqogT0ctMeBtMHAWqhsg/gBAAGAtM/AWqhWAMAA/EIGwAC0CYH2tTy1RLYVAADAAGxfAAAAAQO1WrYVAAAAAQEBtV8AAACB+mDAAPvQAABdwAD8dAFfAAABPgROtX21hQAAwABsXV3AAPylAmDAAPvQXcAA/HQBXwAAARy1ixa1hy6pCMAAs9LAALQCSwEAAYC1jMBaqRcAwAD8uUm1lxy1o4G1m8BaqTJIAQABKwDAAP0pSrWsASs/TrXHtc8AAMAAbGBdwAD8dAFgwAD70AE1td4AAAEAXcAA/HQBYMAA+9ABHLXeFrXZgbXRwFqpMoNiwAD8x4CtAAAAAMAA/Eg1AAAAAQBbARy16IK15sBaqaeArgAAAADAAPyHggDAWqmnSrX0ARy2AoG1+8BaqTJLAQABFrYLgrYDwFqpkIMZwAD8WADAAPy5BsAAtAqB9raUtpm3rwAAwABsYQAAAAEDtqa3rwAAAAICArarAAAAgfpgwAD70AC2sQAAAIGmYQJgwAD70F3AAPx0AV8AAFsAAFwBPgJOtuq28gAAwABsXV3AAPylAmDAAPvQXcAA/HQBXwAAARy2+Ba29C6pCMAAs9LAALQCSwEAAYC2+cBaqkEAwAD8uUm3BCEctxCCtwjAWqptSAEAASsAwAD9KT4CTrcrtzMAAMAAbGBdwAD8dAFgwAD70AE1t0IAAAEAXcAA/HQBYMAA+9ABHLdCFrc9grc1wFqqbYNiwAD8x4CtAAAAAMAA/Eg1AAAAAQBbARy3TIO3SsBaqt+ArgAAAADAAPyHgwDAWqrfPRy3YoO3WsBaqsiD+AEAATS3agO3arekAAAAAQEBt28AAACG42DAAPvQAABgwAD82QE+AT0ct4KBt4HAWqpOIAIAAoS3g8Baq04ct5KCt4vAWqptSwEAAYS3k8Baq04AwAD8uQAAAMAA/EI/BsAAtAuB9rg6uD+5lAAAg/gAAAABA7hGuZQAAAABAQG4RwAAAIGmYQNgwAD70GDAAPvQXwAAWwAAXAE+Ak64e7iBAACW5l3AAPx0AWDAAPvQATW4jQAAAQBdwAD8dAFgwAD70AEcuI0WuIgWuIMuqQjAALPSwAC0AoNiwAD8x4CtAAAAAMAA/Eg1AAAAAQBbARy4l4G4lcBaq++ArgAAAADAAPyHgQDAWqvvRrijuLu4rAAAAIH6YMAA+9AAgbi0wFqr2j4DTrjVuN0AAMAAbF1dwAD8pQJgwAD70F3AAPx0AV8AAAEcuOMWuN8uqQjAALPSwAC0AksBAAGCuOTAWqxMAMAA/LlOuPu5AwAAwABsYF3AAPx0AWDAAPvQATW5EgAAAQBdwAD8dAFgwAD70AEcuRIWuQ2DuQXAWqxjg2LAAPzHgK0AAAAAwAD8SDUAAAABAFsBHLkchLkawFqsu4CuAAAAAMAA/IeEAMBarLtGuSq5RrkzAAAAhuNgwAD70ACEuT3AWqykPgE9HLlgHLlXg7lQwFqsY0sBAAGFuVjAWq0RAMAA/LmD+AEAATS5aAO5aLmBAAAAAQEBuWkAAACDTV8AAAAAWwFKuW8BHLlwgLlvwFqrvCADAAOCuXHAWqxMhbl3wFqtEYa5f8BarVgAAADAAPxCBsAAtAyB9roWuhu6cAAAwABsIQAAAAEDuim6cAAAAAEBAboqAAAAgaZhAV8AAFsAAFwBPgE9HLo+LoP4AQABNLpGA7pGumsAAAADAwO6RwAAAIH6YMAA+9AAuk0AAACG42DAAPvQALpVAAAAliBfAAAAAFsBSrphARy6YoC6YcBarbYgAQABg7pjwFqt+wAAAMAAtAsAAFqk8ABapzEAWqewAFqoNABaqPUAWqofAFqrnABarZQAWq4pAAAACALAALQPgfa6pLqqvAIDwABsYgABAACCdmDAAP0cAVsBYMAA/RwAAAEEwAC0EYH2usa61liAqwBdwAD8pQJfAABgwAD70AEyutRfAABgwAD70AABBcAAtBgAAAAABAAAAwAAAAAAAAAAAF3AALQPAV8AAAE/AQkBAMAA/TIAAAAAAwbAALQTgfa7C7sPu14AAMAAS+oAAAABA7sXu14AAAABAQG7GgAAIJYgXwAAAABgwAD70AE+AUq7KQEcuzQWuzAugKvAALQRmRUCAAKAu0DAWq71NLtJA7tJu1kAAAAAAAAAYMAA+9ABSrtPARa7Uxa7Ty6Aq8AAtBFhwAD8yQDAAPzABsAAtBSB9ruJu5a7swMASwAAAAEDu5i7swAAAAEBAbubAAAgliBfAAAAAGDAAPvQAUq7pwEcu6oWu6cugKvAALQRSwEAAYC7q8Bar3UAwAD8uQbAALQWgfa73LvsvAABAIg/AAAAAQO79bwAAAAAAAAAAF3AAPwyAV8AAAFKu/gBFrv8Frv4LoCrwAC0EYNiwAD8xwAAWq7TAFqvVgBar6gAWq/qAAAAAwAAAYH2AFqwAQBahRYAWp/fAFqjlQBapEkAWq5SAFqv/wAAAAUAWrABAAAAAAAAAMAAtBnAAGxjgfcAAAaA7wEAwABCXwAAgQYBAMAAdcoAAIEqAQDAAKueAACBSgEAwAB5dwAAgXIBAMAAY64AAIGHAQDAAG+fAAArwABCYMAAQmjAAEKAwABCi8AAQpbAAGOxwABjsMAAZFHAAGSAwABkqsAAZLnAAGTIwABk2sAAZOfAAGUXwABlisAAZZ3AAGW+wABmEMAAZi/AAGY4wABmQcAAZkvAAGZgwABvoMAAb6rAAG/BwABvzMAAb93AAG/rwAB1y8AAddXAAHXcwAB148AAderAAHXxwAB1+MAAeXjAAHmGwAB5jcAAeZjAAKuiwACrwAAAAAAAAYH3AFqxKgBasSgAAAAAAFqxKgAAAAAAAADAALQawABsZIH4AAAEgQkAAMAAYIgAAIEsAAC8kAABAQS0VLRZsMm0VoGPAADAAGJKAACBsAAAwACIEQABAQHAAFrCAAAABALAALQbgfiCR4JWgtoHwABojwAAAWDAAP0cAAABBMAAtB6B+IJWAASWQsAAtBoAWwExAFsBGgDAALQgAAIGwAC0IIH4gmuCc4KmBEEAAAAAAQOCg4KmAAAAAQEBgosAAAC77WDAAIgSAABgwAC0GwE9NQAAAACCbVsBGgDAALREEwAABsAAtCKB+IKrgq+C2AACmxkAAAABA4K2gtgAAAACAgKCxQAAAIHVYMAAYLsAgtYAAACCSmDAAGC7AABgwAD70AAAAFqxyABasg4AWrJPAAAAAgLAALQjgfiC3YLjlzYDwABsZQAAAWDAAP0cAAJgwAC0G13AAGClAmDAAPvQYMAAYLsCBMAAtCaB+INQg1cJwABXK8AAtBoAYMAAiBIABMAAtCeB+INtg34YwABsZsAAtBoAYMAAtFABKwEFwAC0RIH4g4KDgoPbAAAAA4OTg9sAAAABAQGDmQAABMAAVytgwACIEgAAYMAAtCMBPgE9F4OoLsAAbGbAALQaH4PAwAC0YAEAAS4AwAC0JwIIAcAAtCaAAMBasuUJAYOCwAD9MgAAAAAaBsAAtCmB+IPgg/CEMAAAmxkBaoPhYMAA/RwCAAABA4P3hDAAAAACAgKEBgAAAIHVYMAAYLsAhBcAAACCSmDAAGC7AABgwAD70AFKhB0BHIQdLsAAbGcCAAKAhCvAWrNdgYQuwFqzagDAALQqBsAAtCqB+IQ1hDmE+gAAwABsZwAAAAEDhEaE+gAAAAICAoRVAAAAgdVgwABguwCEZgAAAIJKYMAAYLsAAGDAAPvQAT4ESYRvHoRzwAD1sQIAAoCEfcBas8KBhIDAWrPPAEqEhAGTP06EloSYAACDpGDAAPvQARyEpxaEoRaEnICEmsBas8KCZ8AAYNYnwABgi4JLAQABFoS4FoSzgYSxwFqzz4JnwABg1ifAAGCLAMAA/PRJhMQhHITKgoTIwFq0CEgBAAGTAMAA/PNKhNABgoTXwFq0CD9KhN4BJoTeARyE54CE5cBas8KETQIAAi6BhPTAWrPPAMAAYNpgwAD70AbAALQrgfiE/4UKhcEAAcAAbGgAAAABA4UchcEAAAEAAIJ2YMAA/RwBWwMDA4UhAAAAmxlhAl8AAF8AAGDAAPvQAIU2AAAAgdVfAAAAhTsAAACCSl8AAAAAYMAA+9ABPgRJhUQiHIVKgYVIwFq04kgBAAErAMAA/SkAHIVXgoVVwFq07UgBAAErAMAA/SlKhWABkz9JhW4chXSBhXLAWrTiSAEAASsAwAD9KUqFfQEchYSUgcQAAAAAwAD78z9JhYwchZKChZDAWrTtSAEAASsAwAD9KUqFmwGUP0qFqQEchbeAhbDAWrTNIAIAAoGFuMBatOKChbvAWrTtAAAGwAC0LIH4hcaF0YbRAAHAAGxpAAAAAQOF44bRAAACAACWR2DAAP0cAVsAAIJ2YMAA/RwBWwMDA4XoAAAAmxlhAl8AAF8BAGDAAPvQAIYDAAAAgdVdwAD8dAFfAAAAhg4AAACCSl3AAPx0AV8BAAAAYMAA+9ABPgROhhuGHQAAg6RgwAD70AEchigWhiGBhh/AWrXqYcAA/KOCSwEAARaGNIKGMsBatfthwAD8owDAAPz0SYZBIRyGR4OGRcBathZIAQABkwDAAPzzSoZNAYOGVMBathY/RYZbAYZkhmYAAGJgwAD70AGTARyGbYSGa8BatndjAQABFoZxgYZvwFq16mHAAPyjAMAA/P0BjIZ5wFq2dxyGeoSGecBatndkAQABlADAAPz1PgI9i4aGwFq2FhyGkYCGisBatdUgAgACHIaTgYaSwFq16ksBAAGEhpTAWrZ3AMAA/IMchpmChpjAWrX7SwEAAYSGmsBatncAwAD8gwAASYalIRyGq4OGqcBathZIAQABkwDAAPzzSoaxAYOGuMBathY/SobFAZMGwAC0LYH4htaG2od+AADAAGxqAAAAAQOG6Id+AAAAAgIChvUAAACB1WC8pQCHBAAAAIJKYLylAABgwAD70AE+A06HEYcTAACDpGDAAPvQARyHHBaHF4CHFcBat12AvbyTgksBAAEWhyiBhybAWrdogL28kwDAAP3GSYczIRyHOYKHN8Bat31IAQABkwDAAPzzSoc/AYKHRsBat30/SodNARyHXBaHVC7AAFcrwAC0GsAAtCbAAFdQAgACgId1wFq3XYGHeMBat2gAwACIGQbAALQugfiHg4eHiC0AAJsaAAAAAQOHlYgtAAAAAgICh6MAAACB1WC8twCHswAAAIJKYLy3AABgwAD70AE+A06HwIfCAACDpGDAAPvQARyHyxaHxoCHxMBauCmAvbyTgksBAAEWh9eBh9XAWrg0gL28kwDAAP3GSYfiIRyH6IKH5sBauElIAQABkwDAAPzzSofuAYKH9cBauEk/Sof8ARyICxaIAy7AAFcrwAC0GsAAtCbAAFdMAgACgIgkwFq4KYGIJ8BauDQAwACIGwbAALQvgfiIMog2iOAAAMAAbGsAAAABA4hFiOAAAAACAgKIVAAAAIHVYLysAIhlAAAAgkpgvKwAAGDAAPvQAT4DTohyiHQAAIOkYMAA+9ABHIh9Foh4gIh2wFq494C9vJOCSwEAARaIiYGIh8BauQKAvbyTAMAA/cZJiJQhHIiagoiYwFq5F0gBAAGTAMAA/PNKiKABgoinwFq5Fz9KiK4BHIi9Foi1LsAAVyvAALQawAC0JsAAV1YCAAKAiNfAWrj3gYjawFq5AgDAAIgaBsAAtDCB+IjliOmJQgAAwABsbAAAAAEDiPmJQgAAAAICAokDAAAAgdVgwABiTwCJDwAAAIJKYMAAYk8AAGDAAPvQAT4BSokYARyJMRaJHy7AAGxmwAC0GsAAtCebGQIAAoCJOcBaucWBiTzAWrnSAMAAtFYGwAC0MYH4iUeJV4nMAACz5wFqiUhgwAD9HAIAAAEDiWSJzAAAAAICAol7AAAIgdVgwABg4ACJlAAAKIJKYMAAYOAAAGDAAPvQAT4BSomdARyJpC6bGgIAAhaJtYCJs8BaukCWIMAAYOIWicCBib7AWrpNliDAAGDiAMAAtC4GwAC0MoH4idGJ4YonAAC8OgFqidJgwAD9HAIAAAEDieqKJwAAAAICAon9AAAIgdVgwABg+gCKEgAAKIJKYMAAYPoAAGDAAPvQAT4BSoobAZMGwAC0M4H4iiyKPIqHAADAAEWCAWqKLWDAAP0cAgAAAQOKTIqHAAAAAgICil4AAAiB1WDAAGI+AIpyAAAogkpgwABiPgAAYMAA+9ABPgFKinsBkwbAALQ0gfiKjIqciv4AALwxAWqKjWDAAP0cAgAAAQOKpIr+AAAAAgICirYAAAiB1WDAAGEUAIrKAAAogkpgwABhFAAAYMAA+9ABPgFKitMBHIrlForcgIrawFq7YqlUwABhFoJLAQABForxgYrvwFq7b6lUwABhFgDAAPn9BsAAtDWB+IsDixOLhAAAvDQBaosEYMAA/RwCAAABA4sei4QAAAACAgKLMwAACIHVYMAAYS4Ai0oAACiCSmDAAGEuAABgwAD70AE+AUqLUwEci2gWi1yAi1rAWrvfqovAAGEwgksBAAEWi3SBi3LAWrvsqovAAGEwAMAA/PQGwAC0NoH4i4mLmYw6AAC8LgFqi4pgwAD9HAIAAAEDi6KMOgAAAAICAou1AAAIgdVgwABhRgCLygAAKIJKYMAAYUYAAGDAAPvQAT4DTovXi9wAAMAAbG1gwAD70AEjFovggIvewFq8XJznwABhS5STAWDAAPvQTov7jAAAAMAAbG5gwAD70AEjFowEgYwCwFq8aZznwABhS5STAWDAAPvQSowbARyMJ4KMIsBavICCSwEAAYOMMcBavKoAwAD89AbAALQ3gfiMP4xPjPwAALw3AWqMQGDAAP0cAgAAAQOMWoz8AAAAAgICjG8AAAiB1WDAAGFxAIyGAAAogkpgwABhcQAAYMAA+9ABPgNOjJaMngAAwABsb2DAAP22ARaMooCMoMBavRudb8AAYXNOjLqMwgAAwABscGDAAP22ARaMxoGMxMBavSidb8AAYXNKjNcBHIzmgozewFq9P4JLAQABg4zwwFq9YADAAP3GBsAAtDiB+I0BjRGNzwAAhy0Bao0CYMAA/RwCAAABA40ajc8AAAACAgKNLQAACIHVYMAAYZwAjUIAACiCSmDAAGGcAABgwAD70AE+A06NT41RAACDpGDAAPvQAR6NU8AAtCwDAmDAAGC7YMAAYLsDFo1gLsAAbGfAALQqFo1xgI1vwFq9yIPQwABhnhaNfIGNesBavdWD0MAAYZ4ASY2KIRyNkIKNjsBavexIAQABkwDAAPzzSo2WAYKNncBavew/So2kARyNqy7AAGxsAgACFo2+gI28wFq9yIKQwABhhBaNxoGNxMBavdWCkMAAYYQAwAC0MAbAALQ5gfiN1I3kjp0AALxCAWqN1WDAAP0cAgAAAQON7I6dAAAAAgICjf4AAAiB1WDAAGGsAI4SAAAogkpgwABhrAAAYMAA+9ABPgNOjh+OIQAAg6RgwAD70AEejiPAALQsAwJgwABgu2DAAGC7AxaOMC7AAGxnwAC0KhaOQYCOP8BavrwpwABhrhaOS4GOScBavskpwABhrgBJjlghHI5ego5cwFq+4EgBAAGTAMAA/PNKjmQBgo5rwFq+4D9KjnIBHI55LsAAbGwCAAIWjoyAjorAWr68gpDAAGGEFo6UgY6SwFq+yYKQwABhhADAALQwBsAAtDqB+I6ijrKPugAAvEUBao6jYMAA/RwCAAABA466j7oAAAACAgKOzAAACIHVYMAAYbwAjuAAACiCSmDAAGG8AABgwAD70AE+BU6O7Y7vAACDpGDAAPvQAR6O8cAAtCwDAmDAAGC7YMAAYLsDFo7+LsAAbGfAALQqFo8PgI8NwFq/roNiwABhvhaPF4GPFcBav7uDYsAAYb4ASY8iIRyPKIKPJsBav9JIAQABkwDAAPzzSo8uAYKPNcBav9I/PYqPPMBav9Iej0DAALQsAwJgwABgu2DAAGC7AxaPTS7AAGxnwAC0KhaPXoCPXMBav64pwABhvxaPaIGPZsBav7spwABhvwBJj3UhHI97go95wFq/0kgBAAGTAMAA/PNKj4EBgo+IwFq/0j9Kj48BHI+WLsAAbGwCAAIWj6mAj6fAWr+ugpDAAGGEFo+xgY+vwFq/u4KQwABhhADAALQwBsAAtDuB+I+/j8+SJwAAvEsBao/AYMAA/RwCAAABA4/fkicAAAACAgKP+QAACIHVYMAAYgwAkBUAACiCSmDAAGIMAABgwAD70AE+B06QIpAkAACDpGDAAPvQARyQJi7AAGxsAgACFpA5gJA3wFrBDYKQwABhhBaQQYGQP8BawRqCkMAAYYQAwAC0MEmQTCEckFKCkFDAWsExSAEAAZMAwAD880qQWAGCkF/AWsExP06QppCuAADAAGxxXcAA/HQBYLzJATWQvgAAAQBdwAD8dAFgvMkBHJC+FpC5FpCygJCwwFrBDYSDwABiDoNiwAD8x4CtAAAAAMAA/Eg1AAAAAQBbARyQyIOQxsBawamArgEAARaQzS6bGsAAtC4AwAD8h4MAwFrBqU6Q9JD8AADAAGxyXcAA/HQBYLzJATWRDAAAAQBdwAD8dAFgvMkBHJEMFpEHFpEAgZD+wFrBGoSDwABiDoNiwAD8x4CtAAAAAMAA/Eg1AAAAAQBbARyRFoSRFMBawiGArgEAARaRGy6bGsAAtC4AwAD8h4QAwFrCIT2KkTHAWsExHpE1wAC0LAMCYLzJYLzJAxaRQi6bGsAAtC6DkVLAWsGUhJFbwFrCDABJkWkhHJFvgpFtwFrBMUgBAAGTAMAA/PNKkXUBgpF8wFrBMT9KkYQBHpGLwAC0LAMCYMAAYLtgwABguwMWkaEuwABsZ8AAtCockeAckcCDkbjAWsGUgKsBAWDAAGC7ATSRxAORxJHeAAAAAQEBkcUAAACEjmC8yQAAYMAAYLsBSpHPARyR1xaR0YCRz8BawQ2Eg8AAYg5LAQABhZHYwFrDIQDAAPy5AMAA/D2ArQAAAADAAPxIHJIaHJH6g5HywFrBlICrAQFgwABguwE0kf4Dkf6SGAAAAAEBAZH/AAAAhI5gvMkAAGDAAGC7AUqSCQEckhEWkguBkgnAWsEahIPAAGIOSwEAAYWSEsBaw44AwAD8uQDAAPw9gK0AAAAAwAD8SAAGwAC0PIH4kiySPJL/AACe5AFqki1gwAD9HAIAAAEDkkWS/wAAAAICApJYAAAIgdVgwABhjQCSbQAAKIJKYMAAYY0AAGDAAPvQAT4DTpJ6knwAAIOkYMAA+9ABHJJ+LsAAbGwCAAIWkpGAko/AWsQAsznAAGGPFpKkgZKiwFrEDbM5wABhjwDAALQwSZK6IRySwIKSvsBaxCRIAQABkwDAAPzzSpLGAYKSzcBaxCQ/SpLUARyS2y7AAGxsAgACFpLugJLswFrEAIKQwABhhBaS9oGS9MBaxA2CkMAAYYQAwAC0MAbAALQ9gfiTBJMUk4oAALhHAWqTBWDAAP0cAgAAAQOTJJOKAAAAAgICkz4AAAiB1WDAAGHQAJNaAAAogkpgwABh0AAAYMAA+9ABPgFKk2MBHJNqLsAAbGoCAAIWk3uAk3nAWsTjmcLAAGHSFpOCgZOAwFrE8JnCwABh0gDAALQtBsAAtD6B+JOPk5+UJgAAwABFfgFqk5BgwAD9HAIAAAEDk7SUJgAAAAICApPaAAAIgdVgwABh8ACT+wAAKIJKYMAAYfAAAGDAAPvQAT4BSpQaAZMGwAC0P4H4lCuUO5SsAADAAEV/AWqULGDAAP0cAgAAAQOUS5SsAAAAAgIClGUAAAiB1WDAAGIAAJSBAAAogkpgwABiAAAAYMAA+9ABPgFKlKABkwbAALRAgfiUsZTBlUMAAMAARYABapSyYMAA/RwCAAABA5TMlUMAAAACAgKU4QAACIHVYMAAYeAAlPgAACiCSmDAAGHgAABgwAD70AE+AUqVNwGTBsAAtEGB+JVIlViWKwAAwABFgQFqlUlgwAD9HAIAAAEDlWuWKwAAAAICApWPAAAIgdVgwABiLQCVrgAAKIJKYMAAYi0AAGDAAPvQAT4DTpW7lb0AAIOkYMAA+9ABHJW/LsAAbGcCAAIWlc+Alc3AWsZewABEfMAAYi8Wld2BldvAWsZrwABEfMAAYi8AwAC0KkmV7iEclfSClfLAWsaCSAEAAZMAwAD880qV+gGClgHAWsaCP0qWCAEclhYWlhGAlg/AWsZesvjAAGIwgksBAAEWliKBliDAWsZrsvjAAGIwALsiBsAAtEKB+JYwlkCXNAAAhaoBapYxYMAA/RwCAAABA5ZSlzQAAAACAgKWdQAACIHVYMAAYh0AlpMAACiCSmDAAGIdAABgwAD70AE+A06WoJaiAACDpGDAAPvQARyWpC7AAGxnAgACFpa0gJaywFrHQIJqwABiIBaWwIGWvsBax02CasAAYiAAwAC0KkmWzyEcltWCltPAWsdkSAEAAZMAwAD880qW2wGCluLAWsdkP0qW6QEelvDAALQsAwJgwABiT2DAAGJPAxaW/S7AAGxswAC0MBaXEYCXD8Bax0CFF8AAYh8WlyKBlyDAWsdNhRfAAGIfAAAAWrM0AFqzoABatKAAWrWdAFq3OwBauAkAWrjVAFq5owBauhcAWrqVAFq65gBauzkAWru2AFq8MwBavPIAWr2fAFq+kwBav4UAWsDkAFrD1wBaxLoAWsU6AFrFjQBaxeAAWsYzAFrHFwBayAsAAAAaAsAAtEWB+Jdnl22Z5gPAAGxzAAABXcAAYw4CYMAA+9BgwAD82QAAAAEFwAC0T4H4l6mXr5fFAQAAA5fDl8UAAAAAAAAAYMAAtEUBPwEJAZevwABjGgAAAAAHBsAAtEeB+JfKl9WYKQABgmcAAAABA5fZmCkAAAABAQGX4wAAAIKQYMAAYk8AAGDAAPvQAT4BSpfvARyX+4CX9sBayPaETQICYMAA+9BgwAD82QJqmAhgwAC0RcABaMMrAMAAYmIGwAC0SIH4mC6YPphsAACGcAFqmC9gwAD9HAIAAAEDmEuYbAAAAAICAphfAAAIgpBgwABiyQCYZQAAIIC1YMAA/NkAAGDAAPvQAUqYawE3BgbAALRJgfiYcJiAmL4AALPGAWqYcWDAAP0cAgAAAQOYlZi+AAAAAgICmLEAAAiCkGDAAGKiAJi3AAAggLVgwAD82QAAYMAA+9ABSpi9AZYGwAC0SoH4mMKY0pkIAACGfAFqmMNgwAD9HAIAAAEDmOOZCAAAAAICApj7AAAIgpBgwABi4gCZAQAAIIC1YMAA/NkAAGDAAPvQAUqZBwGTBsAAtEuB+JkMmRyZVAAAhnYBapkNYMAA/RwCAAABA5kumVQAAAACAgKZRwAACIKQYMAAYnYAmU0AACCAtWDAAPzZAABgwAD70AFKmVMBlAbAALRMgfiZWJlomZwAAIaGAWqZWWDAAP0cAgAAAQOZeJmcAAAAAgICmY8AAAiCkGDAAGKMAJmVAAAggLVgwAD82QAAYMAA+9ABSpmbAZUGwAC0TYH4maCZsJnkAACGbgFqmaFgwAD9HAIAAAEDmcCZ5AAAAAICApnXAAAIgpBgwABi1QCZ3QAAIIC1YMAA/NkAAGDAAPvQAUqZ4wE3BQAAWsjWAFrJOwBayYsAWsnaAFrKKQBayngAWsrHAFrLFwAAAAcCwAC0UIH4memZ76MqA8AAbHQAAAFdwABjDgJgwAD70GDAAGJPAAACBMAAtFOB+JpEmlUJwABok8AAtBoAYMAAtCMABMAAtFSB+JpimmcYwABsdcAAtBoAYMAAYk8BKwEFwAC0YIH4mmuaa5qUAAAAA5p8mpQAAAABAQGaggAABMAAaJNgwAC0IwAAYMAAtFABPwIIAcAAtFOAAMBay7cJAZprwABjGgAAAAAIBsAAtFaB+JqZmp2bmQAAmxkAAAABA5qkm5kAAAACAgKargAAAIHVYMAAYk8AmroAAACCSmDAAGJPAABgwAD70AE+B0mawxyayYCax8BazAhIAQABgZrMwFrMFQDAAP0pSprPAZM/TprhmuMAAIOkYMAA+9ABHJsKHpsCwAC0RwEAAYCbB8BazAgAgksBAAEemynAALRHAQABgZsuwFrMFQAAwAD89EmbNyEcmz2CmzvAWsxPSAEAAZMAwAD880qbQwGCm0rAWsxPPz0Xm1EuwABsdcAAtBqAm1nAWswIwAC0VD2Km2DAWsxPHJtmgJtkwFrMCIRNAgJgwAD70GDAAGJPAi6Bm3PAWswVAMAAYmI9F5t7LsAAbHXAALQaK8AAtFRKm40BgpuUwFrMTwbAALRXgfibnpuunCIAAIZwAWqbn2DAAP0cAgAAAQObu5wiAAAAAgICm88AAAiCkGDAAGLJAJvoAAAog9ZgwABiyQAAYMAA+9ABPgE9MJv1H5v/wAD7YgEAASfAAGEkAAbAALRYgficJ5w3nQkAALPGAWqcKGDAAP0cAgAAAQOcTJ0JAAAAAgICnG8AAAiCkGDAAGKiAJyQAAAog9ZgwABiogAAYMAA+9ABPgE9MJydH5ynwAD7YgEAASSdBAUnwABsdoCc8sBazZ4nk8QWnP0uwABsdcAAtBrAALRUJ4NCAAbAALRZgfidDp0en6gAAIZ8AWqdD2DAAP0cAgAAAQOdL5+oAAAAAgICnU4AAAiCkGDAAGLiAJ1rAAAog9ZgwABi4gAAYMAA+9ABPglOnXydfgAAg6RgwAD70AEcnYAuwABsd8AAtBoCAAIWnZuAnZbAWs4fs8LAAGLlFp2xgZ2rwFrOLLPCwABi5QDAALReSZ3GIRydzIKdysBazkNIAQABkwDAAPzzSp3SAYKd2cBazkM/PYqd4MBazkMcneQuwABsd8AAtBoCAAIWngiAngPAWs4fs8PAAGLmFp4mgZ4gwFrOLLPDwABi5gDAALReSZ5DIRyeSYKeR8BazkNIAQABkwDAAPzzSp5PAYKeVsBazkM/PYqeXcBazkMennPAALQsAwJgwAD9tmDAAP22AzSegAOegJ6mAAAAAgICnogAAACB1WDAAP22AJ6SAAAAgkpgwAD9tgAAYMAA+9ABSp6YARyemoOemMBazzOCSwEAAYSepMBaz0AAwAD9xhaetYCesMBazh+Eu8AAYucWnsyBnsbAWs4shLvAAGLnAEme4iEcnuiCnubAWs5DSAEAAZMAwAD880qe7gGCnvXAWs5DPz2KnvzAWs5DHJ8ALsAAbHfAALQaAgACFp8kgJ8fwFrOH7PEwABi6BafP4GfOcBaziyzxMAAYugAwAC0XkmfWSEcn1+Cn13AWs5DSAEAAZMAwAD880qfZQGCn2zAWs5DP0qfcwEcn3oumxkCAAIWn4eAn4LAWs4fhTTAAGLkFp+ZgZ+TwFrOLIU0wABi5ADAALRWBsAAtFqB+J+tn72gyAAAhnYBap+uYMAA/RwCAAABA5/PoMgAAAACAgKf7wAACIKQYMAAYnYAoA0AACiD1mDAAGJ2AABgwAD70AE+A06gHqAgAACDpGDAAPvQARygNBagIi7AAGiTwAC0GsAAtFPAAGxqAgACFqBIgKBDwFrQc5YgwABieBagV4GgUcBa0ICWIMAAYngAwAC0LUmgZSEcoGuCoGnAWtCXSAEAAZMAwAD880qgcQGCoHjAWtCXP0qgfwEcoIYuwABsd8AAtBoCAAIWoKGAoJzAWtBzhRfAAGJ5FqC2gaCwwFrQgIUXwABieQDAALReBsAAtFuB+KDNoN2h4wAAhoYBaqDOYMAA/RwCAAABA6DtoeMAAAACAgKhCwAACIKQYMAAYowAoScAACiD1mDAAGKMAABgwAD70AE+A06hOKE6AACDpGDAAPvQARyhThahPC7AAGiTwAC0GsAAtFPAAGxrAgACFqFjgKFewFrRaZYgwABijhahcoGhbMBa0XaWIMAAYo4AwAC0L0mhgCEcoYaCoYTAWtGNSAEAAZMAwAD880qhjAGCoZPAWtGNP0qhmgEcoaEuwABsd8AAtBoCAAIWobyAobfAWtFphRfAAGKPFqHRgaHLwFrRdoUXwABijwDAALReBsAAtFyB+KHoofiifAAAhm4BaqHpYMAA/RwCAAABA6IIonwAAAACAgKiJgAACIKQYMAAYtUAokIAACiD1mDAAGLVAABgwAD70AE+AT0wok8folnAAPtiAQABJ8AAYSQABsAAtF6B+KKBooWjKAAAwABsd8AAtBoAAAABA6KaoygAAAACAgKisQAAAMAAbHhdwAD8dAFgwABiTwCizAAAAMAAbHldwAD8dAFgwABiTwAAYMAA+9ABPgFKot4BHqL3wAC0LAMCYMAAYk9gwABiTwMWowQumxnAALRWgKMNwFrSvIGjGcBa0tEAAABay+gAWs0VAFrNdQBazfYAWtBKAFrRQABa0jYAWtKWAFrTIAAAAAgAAAGB+ABa00sAWrGLAFqyYABayHwAWss8AFrTSQAAAAQAWtNLAAAAAAAAAMAAtGHAAGx6gfkAAAGA/wAAgPsAAAAAAAABBMAAtGOB+YJYhhkGwABsewBgwAD9tgFqgmpgwAD9tsABZoEBBsAAtGWB+YEagSGCSAABwABsfAAAAAEDgSyCSAAAAAIBAYE9AAAAemCBFAABgU4AAADAAGitYMAA/bYBaoFWYMAA/baEBmDAAP22AT4EToFmgW0AAJ+kYMAA/bYBJwBJgXUWgYGAgXnAWtPVgwaBXT4BPYqBk8Ba1AIkgboCJ8AAbH0WgbGAganAWtPVgvGBJj9JgcIhHIHNgYHGwFrT4EgBAAEnAADAAP3FPYmB1MBa0+AkgekDJ4NJgYHhwFrT4CeDIT9Kge0BJAAGJ8AAbH6Bgg3AWtPgJ4GLJ8AAbH+Cgj7AWtQCJ4FqAYH5AFrUnQBa044AAAAAAFrTswBa1J0AAAABAAAAwAC0ZgCB+gAAAAAAAAECwAC0aYH6gPCA9oE4A4PTAAIAAIPLYMAA/RwBWwAAwABHR2DAAP0cAVsBYMAA/RwAAAIEwAC0a4H6gQeBDFiDGQBfAAAABMAAtGyB+oESgRZYgegAXwEAAAEFwAC0boH6gRuBG4E2AAAAA4EfgTYAAAACAgKBJQAABIMZXwAAAIExAAAEgehfAQAAAF3AALRpAl8AAF8BAAE/AwgBwAC0a4AAwFrVPggBwAC0bIEAwFrVSQkBgRvAAP0yAAAAAAAAAFrViQAAAAAAAQbAALRogfqBioGYge8AAcAAbIAAAAABA4Gpge8AAAEAAIJ2YMAA/RwBWwAAAABeAAICAl8AAF8AAAABV8AA9XcBXwAAYMAA+9ABSoGzATSBswOBs4HvAAAAAgICgbQAAACHG18AAACBvAAAAIccXwAAAABgwAD70AFKgccBHIHeJoHPAICByMBa1fBdwAD6FgFbgksBAAGBgejAWtX7AMAA+hgBgfoAWtY3AFrUyQBa1ZIAAAABAFrVlABa1jcAAAABAAAAwAC0bwCB+wAAAoDaAADAAL2XAACA9QAAwACxoAAAAAAAAQLAALRwgfuBwIHGhywDwABsgQABAACDy2DAAP0cAVsBXcAAwMEBXwAAAAFdwACx2gFfAAAAAQXAALSPgfuC24LhgvcBAAADgvWC9wAAAAAAAABdwAC0cAFfAAABPwEJAYLhwADAxgAAAAAZBsAAtHOB+4IggimCfgABwABqwcAAtG8AAAABA4Iygn4AAAEAAIJ2YMAA/RwBWwAAAABfAQABPgE9MII7H4JFwAD7YgEAASfAAGtSAAbAALSJgfuCg4KTgr8BAFwAAAABA4Kcgr8AAAAAAAAAXcAA/G0BXwAAAUqCnwEWgrcfgqPAAM2vAAFfAAAAAFzAAPxUBsAAtIqB+4LDgsuC1gEAYQAAAAEDgtKC1gAAAAAAAABgwAD70AFKgtUBkwbAALR0gfuC/IMUgz4AAJYyAAAAAQODG4M+AAABAACCdmDAAP0cAVsAAAAAXcAAtHABXwEAAUqDIQEfgyXAALSPAAFfAQAAAAbAALR1gfuDQoNHg2gAAIMXAAAAAQODT4NoAAAAAQEBg1cAAACWIGDAAP0cAABgwAD6CgFKg2MBKgbAALR2gfuDbINxg6UAAIQCAAAAAQODfIOlAAAAAQEBg44AAACD1l3AAPwyAWDAAP0cAABgwAD6CgFKg5gBFoOegIOYwFrYQoFVwAD8VgbAALR3gfuDqYO1g+kAAJY3AAAAAQODv4PpAAAAAQEBg8wAACCD1l3AAPwyAV8AAAAAXcAA/DIBXwAAAUqD1gEeg9rAAMDkAQFfAAABgIPjwFrYkAAGwAC0eIH7g+2D74QNAACW9gAAAAEDg/WEDQAAAAEBAYP9AAAAliBgwAD9HAAAXwAAAUqECQErBsAAtHmB+4QRhDeEYwAAljsBaoQSYMAA+b2F0gAAAQOEQIRjAAABAACCdmDAAP0cAVsAAAAAXcAAtHABXwEAAUqERgEfhErAALSPAAFfAQAAAAbAALR6gfuEZ4RphLMAAJY8AAAAAQOEdISzAAAAAgEBhHoAAACW+WEBXwAAYMAA+goAAYSOAAAgljVhAF8AAAFqAGDAAPzZd18AAAFKhJwBHYSiljwBAAGAhK7AWtluAMAA/FAGwAC0e4H7hLeEw4TyAACWQAAAAAEDhM+E8gAAAQAAgnZgwAD9HAFbAAAAAF3AAPwyAV8BAAFKhNUBH4TZwAC0jwABXwEAAAAGwAC0fIH7hPaE/YURAACVEwAAAAEDhQKFEQAAAAAAAABdwAD9ZwFfAAABSoUIAR6FDMAAwOIAAV8AAAAABsAAtH2B+4UVhRyFRgAAlvwAAAABA4UhhUYAAAABAQGFKQAAIIPWXcAA/WcBXwAAAABdwAD9ZwFfAAABSoUzAR6FN8AAwOQBAV8AAAGAhUDAWtpXAAbAALR+gfuFSoVRhX0AAJb9AAAAAQOFXYV9AAAAAQEBhWoAAACD1l3AAP1nAWDAAP0cAABdwAD9ZwFfAAABSoV0AR6FeMAAwOIAAV8AAAAABsAAtH+B+4WBhYiFsgAAlv4AAAABA4WShbIAAAABAQGFnwAAAIPWXcAA/WcBYMAA/RwAAF3AAP1nAV8AAAFKhakBHoWtwADA4gABXwAAAAAGwAC0gIH7hbeFvIXUAABWAAAAAQOFv4XUAAAAAQEBhcIAACCAll8AAAAAYMAA+goBSoXMAR6FzMAAtHMAAWDAAPoKAAAGwAC0gYH7hdiF3YYFAACApQAAAAEDheOGBQAAAAEBAYXwAAAgiD9dwAD8MgFfAAAAAFwBSoX9AR6F/cAAtHMAAVwAAAbAALSCgfuGCYYOhiEAAIJCAAAAAQOGE4YhAAAAAAAAAFwBSoYZAR6GGcAAtHMAAVwAAAbAALSDgfuGJYYqhkwAAIRZAAAAAQOGMIZMAAAAAQEBhjgAAACWIGDAAP0cAABgwAD6CgFKhkQBHoZEwAC0cwABYMAA+goAAAbAALSEgfuGUIZVhoUAAJb3AAAAAQOGXoaFAAAAAQEBhnAAAACIP13AAPwyAWDAAP0cAABcAUqGfQEehn3AALRzAAFcAAAGwAC0hYH7homGjoa7AACW+AAAAAEDhpmGuwAAAAEBAYafAAAAlvlhAV8AAGDAAPoKAABcAUqGswEehrPAALRzAAFcAAAGwAC0hoH7hr+GxIbxAACW+wAAAAEDhs+G8QAAAAEBAYbVAAAAlvlhAV8AAGDAAPoKAABcAUqG6QEehunAALRzAAFcAAAGwAC0h4H7hvWG+ocqAACW+gAAAAEDhwOHKgAAAAEBAYcVAAAAiD9dwAD8MgFgwAD9HAAAXAFKhyIBHociwAC0cwABXAAABsAAtIyB7wCLYAABgMAAarbAALH+AAAAAQMAAAAAAAAAAABdwAD8MgFfAAABSotgASaLYAEci2AunO0BAAEfAMAA+H8FAAVqi2BgwAD+KMABaMqUagBdwAD8dAFgwAD+NMAAk1xqAF3AAPx0AVuCYh6LYMAA/K8BAmDAAP4oWwFqAF3AAPylAmDAAP4oW8AAk2MAAADAAP0rXcAA/DIBXwAABsAAtI2B76BPoFqgawGAwABrbsAAsf4AAAABA6BjoGsAAAAAAAAAXcAA/WcBXwAAAUqgWgEmoFoBHKBaLpztAQABHwDAAPh/BQAFaqBaYMAA/ijAAWjTlGoAXcAA/HQBYMAA/jTAAJNcagBdwAD8dAFbgmIeoFrAAPyvAQJgwAD+KFsBagBdwAD8pQJgwAD+KFvAAJNjAAAAwAD9K13AAP1nAV8AAAAAWtbmAFrXMgBa13YAWtehAFrX6QBa2CIAWthwAFrYxQBa2PwAWtlOAFrZsgBa2foAWto3AFrajABa2twAWtssAFrbcQBa27UAWtvoAFrcMABa3HYAWty7AFrdAABa3UYAWt3oAFrejgAAABkAAAGB+wBa3v0AWtZ7AFre+wAAAAEAWt79AAAAAAAAAMAAtJAAgfwAAASA2gAAwADp+QAAgOwAAMAAtOoAAIERAADAALUPAACBIwAAnaiDMgAAAAHAALSSgfzAAFBPwABsggAAXgABBQFgwAC0swTAAGyDYMAA+grAAGyEYMAA+grAAGyFYMAA+gqAgWDAAPoKAVfAALSSAF3AALipAWDAAPoKAAHAAFBoAAAAwABshmDAALSzAATAAFB8AAAAwABshWDAAPoKAMAAUJQAAACAgWDAAPoKAMAAUKIAAADAAGyEYMAA+goAwABQsQAAAMAAbINgwAD6CgAGAsAAtKeB/ItRi1eRQQPAAGyHAAEAAMAAbIhgwAD9HAFbAWDAAP0cAAACBMAAtKqB/IwBjEMJwABsicAAtJAAXcAA/KUCYMAA/jddwAD8pQJgwAC1JV8AAAEejCbAAPysAAJgwAD+N13AAPylAmDAALUlXwAAAAAEwAC0q4H8jK2MygnAAGyKAF3AAPylAmDAALUlXwAAATKMyGDAALUlXwAAAAEFwAC0sgAAAAAEAAADAAAAAAAAAAAAXcAAtKcBXwAAAT8BCQEAwAD9MgAAAAAEBsAAtK2B/IzPjN2NQgMAgL8AAAABA4zgjUIAAAACAgKM5QAAAIG7YMAA/jcAjP0AACDAAGyLXcAA/KUCYMAAtSVfAAAAAFwBPgE9HI0pFo0RLsAAbInAALSQwAC0qoC/AgACgI0qwFrg54GNMsBa4PQAwAD8ugbAALSugfyNR41MjbMAAIP4AAAAAQONU42zAAAAAQEBjVkAAACBpmECYMAA/jddwAD8pQJgwAC1JV8AAFwAAFwBPgE9HI2lFo2MLsAAbInAALSQwAC0qoP4AQABgI2twFrhXQDAAPzEBsAAtK+B/I24jdOOhQMASwAAAAEDjdWOhQAAAAEBAY3aAAAAgbtgwAD+NwAAXcAA/KUCYMAAtSVfAAABPgJJjeYhHI4EFo3rLsAAbInAALSQwAC0qodBAQABgI4QwFrhxADAAPy4PgE9HI43Fo4fLsAAbInAALSQwAC0qoC/AgACgI44wFrhxDKOTmDAALUlXwAAAADAAPy6P0qOXAEcjnsWjmMuwABsicAAtJDAALSqSwEAAYCOfMBa4cQAwAD8uQbAALSwgfyOio6dkT8AACMBao6LYMAA/RwCAAABA46lkT8AAAAAAAAAYMAA/bYBPgdOjruOvgAAg+RgwAD+AAEfjsTAAP4fAAAAAD0cjtuAjtjAWuKYgooBAAEnwABsjADAAP4UTo8DjwkAAKKjYMAA/bYBJwBJjxMiFo8wFo8XLsAAbInAALSQwAC0qoOywAD8ywAiHI9nFo9gFo9HLsAAbInAALSQwAC0qmHAAPzJgJcBAAGUAMAA/P8BFo+hFo+aFo+TFo96LsAAbInAALSQwAC0qinAAPzIgMPAAPxag7LAAPzLPgM9HI+5gI+2wFrimIKKAQABJ8AAbI0AwAD+FD0cj+kWj9AuwABsicAAtJDAALSqg/gBAAE0j/EDj/GQfQAAAAICAo/2AAAAgKxgwAD+NwCQDQAAABJdwAD8pQJgwAC1JV8AAAAAYMAA/NkBPgQ9HJAggJAdwFrimIKKAQABgZAmwFrizADAAP4UPRyQOYCQNsBa4piCigEAASSQRgKCkEHAWuOPJ4LmAMAA/hQ9HJBUgJBRwFrimIKKAQABg5BawFrjnADAAP4UPYmQacBa4swngKcAwAD8xD0ckImAkIbAWuKYgooBAAEnhsAAwAD+FD9JkJ8WkK4WkKMuwABsisAAtKuDssAA/Ms+Az0ckMWAkMLAWuKYgooBAAGBkMvAWuLMAMAA/hQ9HJDcgJDZwFrimIKKAQABJ8AAbI4AwAD+FD0ckPeAkPTAWuKYgooBAAEWkP0uwABsisAAtKsAwAD+FD89HJEXgJEUwFrimIKKAQABJ4MhAMAA/hRKkScBHJExgJEuwFrimCMAAAAAwAD+GQAAWuDHAFrhPQBa4aUAWuJmAFrk3wAAAAQCwAC0s4H8pEWkS6XxA8AAbI8AAAFgwAD9HAAABgTAALS1gfykYqRtCcAAbJAAYMAA/jcABMAAtLaB/KR7pIUJgawAYMAA/jcABMAAtLeB/KSjpLQJwABskQBdwAD8pQJgwAD9tmDAAP22AATAALS4gfyk1qTaCYKTAF3AAPylAmDAAP43YMAAtP8ABMAAtLmB/KUMpRgJwABskgBdwAD8pQJgwAD9tl3AALSnAWDAALUsAATAALS6gfylL6U7CcAAbJMAXcAA/HQBYMAA/bYAAQXAALS+gfylQKVApboAAAADpUilugAAAAYGBqVOAAAEwABskGDAAP43AKVgAAAEgaxgwAD+NwClcQAABMAAbJFdwAD8pQJgwAD9tmDAAP22AKWJAAAEgpNdwAD8pQJgwAD+N2DAALT/AKWaAAAEwABskl3AAPylAmDAAP22XcAAtKcBYMAAtSwApa0AAATAAGyTXcAA/HQBYMAA/bYAAGDAALSzAT8HCAHAALS1gADAWuXkCAHAALS2gQDAWuXzCAHAALS3ggDAWuYACAHAALS4gwDAWuYaCAHAALS5hADAWuYyCAHAALS6hQDAWuZSCQGlQMAA/TIAAAAAAQbAALS8gfylv6XKpe8BAIC9AAAAAQOlz6XvAAAAAAAAAGDAAP22AUql0gEWpesWpd4WpdIuwABskMAAtLWDGMAA/kWB6MAA/FkAAFrmxQBa5w4AAAABAsAAtL+B/KYqpjmuqAfAAGyUAAEAAIJ2YMAA/RwBWwFgwAD9HAAAAwTAALTBgfymV6ZeCcAAVsYAYMAA/jcABMAAtMKB/Kb6pwQJwABslQBdwAD8pQJgwAD+N13AAPylAmDAALUlXcAAtX4BXwAAAATAALTDgfyny6fVCcAAbIoAXcAA/KUCYMAAtSVdwAC1fgFfAAAAAQXAALTKgfyn2qfaqBYAAAADp+aoFgAAAAMDA6fsAAAEwABWxmDAAP43AKf6AAAEwABslV3AAPylAmDAAP43XcAA/KUCYMAAtSVdwAC1fgFfAAAAqAsAAATAAGyKXcAA/KUCYMAAtSVdwAC1fgFfAAAAAF3AALS/AV8AAAE/BAgBwAC0wYAAwFrnzQgBwAC0woEAwFrn3AgBwAC0w4IAwFroBQkBp9rAAP0yAAAAAAQGwAC0xYH8qBuoMqmtAADAAGyWAAAAAQOoRKmtAAAAAQEBqEkAAACArGDAAP43AABdwAD8pQJgwAD70F3AAPx0AWDAAP22AT4ETqhrqHUAAMAAbJddwAD8pQJgwAC1JV3AALV+AV8AAAEcqIEWqHcuwABslcAAtMJLAQABgKiCwFrogwDAAPy5TqijqK8AAIRjXcAA/KUCYMAA+9BdwAD8dAFgwAD9tgEyqMRgwAD70F3AAPx0AWDAAP22AD0cqNaBqMzAWuirg/gBAAE0qN4DqN6pkAAAAAICAqjiAAAAs1VgwAC1JQCo9AAAABJdwAC1fgFfAAAAAGDAAPzZAT4CTqkJqRAAAIcbYMAA/bYBJKkhARapGoSpFcBa6UiAlsAAtYE9HKluHKlAgqkpwFro6pkVAgACFqlRhKlMwFrpSINcwAC1hzSpWQOpWalhAAAAAAAAAF3AAPx0AWDAAP22AUqpXwExqV9gwAD9tgAAwAD8wFYBAAEeqXLAALSdAQABhamBwFrpYgAAwAD8hQDAAPzESqmXAYKpnsBa6OoGwAC0xoH8qbKpya4sAADAAGyYAAAAAQOp5q4sAAAABAMDqgUAACDAAGyZXcAA/KUCYMAAtSVdwAC1fgFfAAAAqiUAACDAAEW2XcAA/KUCYMAAtSVdwAC1fgFfAAAAqjMAAACArGDAAP43AAGqRAAAAMAAbJpgwAD6CgFqqlRgwAD6CgBdwAD8pQJgwAD70F3AAPx0AWDAAP22AT4ETqp5qoUAAIRjXcAA/KUCYMAA+9BdwAD8dAFgwAD9tgEyqppgwAD70F3AAPx0AWDAAP22AD0cqqqAqqLAWuohg/gBAAE0qrIDqrKsxgAAAAICAqq2AAAAs1VgwAC1JQCqyAAAAMAAbJtdwAC1fgFfAAAAAGDAAPzZAT4DTqroqvIAAMAATPtdwAC1fgFfAAABHKr8gar0wFrqP0sBAAGFqv3AWuruAMAA/LlOqw+rGQAAwABmvWDAAP22ASSrLgEWqyeGqx7AWur7gJbAALWBSas2IRyrSRarQ4arOsBa6vuAlsAAtYFIAQABNQAAAAEAXcAAtX4BXwAAAYerTMBa6xgjHKtXFADAWuuHCQBIAQABKwAAKxarVxQAwFrrhwkAgJbAALWBAV8AAADAAP0pPgJOq2+regAAqUNgwAD9tgEkq5oBNQAAAAEAXwAAATUAAAABAF3AALV+AV8AAAGHq3/AWusYIxyrihQAwFrr6wkASAEAASsAACsWq4oUAMBa6+sJAICWwAC1gQFfAAAjHKuQFADAWuvhCQBIAQABKwAAJ8AAQmoUAMBa6+EJAAFgwAD9HD0cq/Ecq72Eq6TAWuqdmRUCAAIWq9KGq8nAWur7g1zAALWHNKvaA6vaq+IAAAAAAAAAXcAA/HQBYMAA/bYBSqvgATGr4GDAAP22AADAAPzAVgEAAR6r9cAAtKADAAMUrALAWutHCAAntmEUrBTAWuvOCQAAAMAA/IVJrC+DrDPAWuprPgE9HKyaHKxmhKxNwFrqnZkVAgACFqx7hqxywFrq+4NcwAC1hzSsgwOsg6yLAAAAAAAAAF3AAPx0AWDAAP22AUqsiQExrIlgwAD9tgAAwAD8wFYBAAEerJ7AALSbAQABFKyswFrrRwgAAADAAPyFPwDAAPzEPRys1oGszcBa6j+D+AEAATSs3gOs3q4PAAAAAgICrOIAAACzVWDAALUlAKz0AAAAwABM+13AALV+AV8AAAAAYMAA/NkBPgFJrQchHK0UgK0MwFrqIYdBAQABha0gwFrtZgDAAPy4PgNOrTatQAAAwABmvWDAAP22ASfAAEJqTq1YrWMAAKlDYMAA/bYBJK15ARatcoataMBa7XOAlsAAtYE9HK3RHK2chK2DwFrqnZkVAgACFq2yhq2owFrtc4NcwAC1hzStugOtuq3CAAAAAAAAAF3AAPx0AWDAAP22AUqtwAExrcBgwAD9tgAAwAD8wFYBAAEerdXAALSgAwADh63iwFrtsSe2YRSt9MBa7ccIAAAAwAD8hT8AwAD8xEquFgGErh3AWuqdBsAAtMeB/K4xrjWuVAACwABsnAAAAAEDrkSuVAAAAAICAq5IAAAAs1VgwAC1JQCuUAAAAICsYMAA/jcAAGDAAPvQAAbAALTIgfyuWa5erqYAAqU+AAAAAQOuaa6mAAAABAMDrm4AAACArGDAAP43AK53AAAAg1xgwAD70ACuhgAAACJgwAD9tgABrpUAAADAAGyEYMAA+goBaq6fYMAA+goAXAAAAFroYQBa6f8AWu5xAFrutABa7xUAAAAEAsAAtMuB/K7cruuwnwfAAGydAAEAAIJ2YMAA/RwBWwFgwAD9HAAAAAEFwAC00QAAAAAEAAADAAAAAAAAAAAAXcAAtMsBXwAAAT8BCQEAwAD9MgAAAAADBsAAtM2B/K+vr7av5QACwABr9QAAAAEDr8Kv5QAAAAICAq/FAAAgwABsDl8AAACv2AAAAMAAa/dgwAD9tgAAYMAA/bYABsAAtM6B/LAqsC+wRAACgVUAAAABA7A2sEQAAAABAQGwOQAAIMAAbA5fAAAAAGDAAPoKAAbAALTPgfywgbCIsJ0AArz7AAAAAQOwj7CdAAAAAQEBsJIAACDAAGwOXwAAAABgwAD9tgAAAFrvhQBa78oAWu/+AFrwMgAAAAMCwAC00oH8sNCw1rLKA8AAbJ4AAAFgwAD9HAABXcAAtMsBYMAA/bYAAQXAALTYgfyxE7EZsTABAAADsS6xMAAAAAAAAABgwAC00gE/AQkBsRnAAP0yAAAAAAMGwAC01IH8sTWxSLIoAADAAGv1AWqxNmDAAP0cAgAAAQOxVLIoAAAAAgICsVwAACDAAGwOYMAA/bYAsW8AAADAAGv3YMAA/bYAAGDAAP22AT4EPSMcsY6AsYPAWvDMSAEAASsAwAD9xYixg8Ba8MwnACsBYMAA/bY9Ixyxp4GxmsBa8NtIAQABKwDAAP3FibGawFrw2ycAKwFgwAD9tkmxsyEcscKAsbfAWvDMSAEAAYGxxcBa8NsAwAD9xT4BSrHbASSyDQQnlMKBse3AWvDbJ8AARBqAsgLAWvDMP0qyGQErBsAAtNWB/LItsj6yegAAgVUBarIuYMAA/RwCAAABA7JFsnoAAAABAQGyTQAAIMAAbA5gwAD9tgAAYMAA+goBPgFKsl8BHLJxgLJmwFrxrEgBAAEnAADAAP3FBsAAtNaB/LJ/spKyyAAAvPsBarKAYMAA/RwCAAABA7KZssgAAAABAQGyoQAAIMAAbA5gwAD9tgAAYMAA/bYBPgFKsrMBgLK6wFryBgAAWvChAFrxgwBa8d0AWvIpAAAAAwLAALTZgfy1trW8vsgDwABsnwABAACCdmDAAP0cAVsBYMAA/RwAAAQEwAC024H8tei17AmCkwBdwAD8pQJgwAD+N2DAALT/AATAALTcgfy2EbYdCcAAbJIAXcAAtKcBYMAAtSwABMAAtN6B/LY3tkQJwABsoMAAtJAAXcAAtL8BXwAAAATAALTfgfy2b7aUCcAAbKHAALSQAF3AALSnAV3AALV+AV8AAAEftoHAALSyAAFdwAC1fgFfAAAAAAEFwAC06IH8tpm2mbeLAAAAA7aft4sAAAADAwO2pQAABIKTXcAA/KUCYMAA/jdgwAC0/wC2sAAABMAAbJJdwAC0pwFgwAC1LAC2wwAABMAAbKBdwAC0vwFfAAAAAF3AALTZAV8AAAE+Aka22LbztuEAAACArGDAAP43ABa27Ra26C6Ck8AAtNuDYsAA/Mc+AT0ctwYWtvsuwABsocAAtJDAALTfgL8CAAKDtwfAWvNpNQAAAAEAXcAA/KUCYMAAtSVdwAC1fgFfAAABHLcmFrccFrcOLsAAbKDAALSQwAC03sAAbJXAALTCSwEAAYO3J8Ba82kAwAD8uSMctyyEAMBa86xIAQABKwAAMrdCYMAAtSVdwAC1fgFfAAAAhADAWvOsAV3AAPylAmDAALUlXcAAtX4BXwAAAMAAtK09HLdnFrdcFrdQLsAAbKHAALSQwAC038AAbIrAALSrgKUBAAEWt3wWt24uwABsoMAAtJDAALTewABsisAAtMMAwAD8wQQIAcAAtNuAAMBa8xcIAcAAtNyBAMBa8y8IAcAAtN6CAMBa80QJAbaZwAD9MgAAAAAFBsAAtOGB/LeQt5i3uAEAwABWxgAAAAEDt6C3uAAAAAAAAABgwAD+NwFKt6MBFrexFrejLsAAbKDAALSQwAC03sAAVsbAALTBBsAAtOKB/Le8t+G3+gEAwABslQAAAAEDt+y3+gAAAAAAAABdwAC0pwFdwAC1fgFfAAABSrfvARa37y7AAGyhwAC0kMAAtN8GwAC05IH8t/+4BrkqAADAAGyiAAAAAQO4ELkqAAAAAQEBuBUAAACArGDAAP43AABgwAD9tgE+A064N7hDAACEY13AAPylAmDAAPvQXcAA/HQBYMAA/bYBMrhYYMAA+9BdwAD8dAFgwAD9tgA9HLhwHLhqFrhgLsAAbJXAALTiSwEAAYC4a8Ba9V4AwAC0r4P4AQABNLh4A7h4uOYAAAACAgK4fAAAALNVYMAAtSUAuI4AAAASXcAAtX4BXwAAAABgwAD82QE+AT0cuMscuKiBuJzAWvV1mRUCAAIWuLmDuLTAWvXrg1zAALWHNLjBA7jBuMkAAAAAAAAAXcAA/HQBYMAA/bYBSrjHATG4x2DAAP22AADAAPzAVgEAASS43gEWuNeDuNLAWvXrgJbAALWBAMAA/IUAwAD8xEq47QEeuPTAALSkAgACFrkOHLkIFrkELoKTwAC020sBAAGAuQnAWvVeAMAA/LmYr8AAtQGBuRrAWvV1AAbAALTlgfy5L7k2vmYAAMAAbKMAAAABA7k+vmYAAAACAgK5QwAAAICsYMAA/jcAuVsAACDAAGykXcAAtMsBXwAAAABgwAD9tgE+BE65h7mTAACEY13AAPylAmDAAPvQXcAA/HQBYMAA/bYBMrmoYMAA+9BdwAD8dAFgwAD9tgA9HLnAHLm6FrmwLsAAbJXAALTiSwEAAYC5u8Ba9tQAwAC0r4P4AQABNLnIA7nIvI0AAAACAgK5zAAAALNVYMAAtSUAud4AAAASXcAAtX4BXwAAAABgwAD82QE+BE659LoCAADAAEFbYMAAtSwBHLoVHLoQFroELsAAbJLAALTcSwEAAYC6EcBa9tQAwAC0r0sBAAGDuhbAWvdnAMAA/LlOuiO6LwAAwABr/V8AAAEWujaEujHAWvd0gJbAALWBTrpKulwAAMAAbKVgwAD9tgEcunaBumjAWvbhwABr9QIAAoa6g8Ba99E1AAAAAQBgwAC1LAGFupDAWveOIxy6n4cAwFr4GUgBAAErAAArFrqfhwDAWvgZgJbAALUvAWDAAP22AMAAtM1Juq0hHLrDh7qxwFr38EgBAAErAMAA/cU+BE663brmAACcvmDAAP22ATUAAAABAGDAAP22ATUAAAABAGDAALUsAYW66MBa944jHLr3FADAWviNCABIAQABKwAAKxy69xQAwFr4jQgAIwAAAADAALU/AWDAAP22Ixy7AhQAwFr4gQgASAEAASsAACcAFADAWviBCAABYMAA/bZOuxi7HwAAnL9gwAD9tgEcuy+BuyHAWvbhvPsBAAGGuzfAWvfRAMAAtM9Ou1G7WAAAg1xgwAD70AEcu1ouwABsnAIAAoO7asBa92eAu27AWvbUAMAAtOZJu3whHLuHFLuAwFr5GwoASAEAASsAwAD88z4DTruju6oAAIcbYMAA/bYBJLu5ARS7r8Ba+HIIAE67zLvTAACHHGDAAP22AR673cAAtUACAAKDu+jAWvdnJLv3ARS778Ba+PEJAAA9HLxMHLwfgrwEwFr2/pkVAgACFLwrwFr5GwoANLwzA7wzvDsAAAAAAAAAXcAA/HQBYMAA/bYBSrw5ATG8OWDAAP22AADAAPzAVgEAAR68UMAAtKADAAMUvF3AWvlkCwAntmEUvGzAWvmADAAAAMAA/IU/PwDAAPzEPRy8phy8oBa8lC7AAGySwAC03EsBAAGAvKHAWvbUAMAAtK+D+AEAATS8rgO8rr4iAAAAAgICvLIAAACzVWDAALUlALy+AAAAnL5gwAC1LAAAYMAA/NkBPgFJvNAhHLzlHLzfFrzVLsAAbJXAALTiSwEAAYC84MBa9tQAwAC0r4dBAQABg7zxwFr6XADAAPy4PgJOvQS9CwAAg1xgwAD70AEcvQ0uwABsnAIAAoO9HcBa+lyAvSHAWvbUAMAAtOZJvS8hHL06hb0zwFr6uUgBAAErAMAA/PM+A069Vr1dAACHG2DAAP22ASS9bAGEvWLAWvppTr1/vYYAAIccYMAA/bYBJ8AAQmo9HL3hHL20gr2ZwFr2/pkVAgAChb3AwFr6uTS9yAO9yL3QAAAAAAAAAF3AAPx0AWDAAP22AUq9zgExvc5gwAD9tgAAwAD8wFYBAAEeveXAALSgAwADhr3ywFr7ACe2YYe+AcBa+xoAAMAA/IU/PwDAAPzESr4pAR6+MMAAtKQCAAIWvkocvkQWvkAugpPAALTbSwEAAYC+RcBa9tQAwAD8uZivwAC1AYK+VsBa9v4ABsAAtOaB/L5rvm++xgAAwABsnAAAAAEDvn6+xgAAAAICAr6CAAAAs1VgwAC1JQC+igAAAICsYMAA/jcAAGDAAPvQAT4BSr6VARy+qha+nC7AAGygwAC0kMAAtN7AAGycAgACgL66wFr7/oG+vsBa/AsAwAC0xwAAWvStAFr09QBa9TwAWvayAFr73ABa/FIAAAAFBQTAALSUgfyBWoFrBsAAbKYAYMAA/bYBaoFmYMAA/bbAAWjcBMAAtJWB/IF6gZMGwABsqABgwAD9tgFqgYpgwAD9tsABMegEwAC0loH8gaKBvQbAAGypAGDAAP22AWqBs2DAAP22wAFo4QTAALSXgfyCG4JeBsAAbKoAXcAA/HQBYMAA/bYBaoIrXcAA/HQBYMAA/bbAAWjkBMAAtJiB/IKZgr8EwABsqwBgwAD6CgEWgqwagqXAAOo9nJTAAPTbDQbAALSagfyC/4MGg5sAAcAAbKwAAAABA4MVg5sAAAABAQGDHQAAAIGwYMAA/bYAAGDAAP22AT4BSYMnGoMrwAC0mD4BSoM8ASSDeQNqg01gwAD9tsAAkaiAg1zAWv1SaoNqYMAA/bbAAJOvPgFKg4oBgIORwFr9UgbAALSbgfyD54PuhH8AAcAAbK0AAAABA4P7hH8AAAABAQGEAwAAAIGwYMAA/bYAAGDAAP22AT4BSYQNGoQRwAC0mD4BSoQiASSEXQNqhDNgwAD9tsAAkauAhEDAWv3KaoROYMAA/bbAAJOvPgFKhG4BgIR1wFr9ygbAALScgfyEyYTQhWMAAcAAbK4AAAABA4TehWMAAAABAQGE5gAAAIGwYMAA/bYAAGDAAP22AT4BSYTwGoT0wAC0mD4BSoUFASSFQQNqhRZgwAD9tsAAkaWAhSTAWv5CaoUyYMAA/bbAAJOvPgFKhVIBgIVZwFr+QgbAALSdgfyFr4W2hkcAAcAAbK8AAAABA4XEhkcAAAABAQGFzAAAAIGwYMAA/bYAAGDAAP22AT4BSYXWGoXawAC0mD4BSoXrASSGJQNqhfxgwAD9tsAAkaKAhgjAWv66aoYWYMAA/bbAAJOvPgFKhjYBgIY9wFr+ugbAALSegfyGlIabhzAAAcAAbLAAAAABA4arhzAAAAABAQGGswAAAIGwYMAA/bYAAGDAAP22AT4BSYa9GobBwAC0mD4BSobSASSHDgNqhuNgwAD9tsAAkaWAhvHAWv8yaob/YMAA/bbAAJOvPgFKhx8BgIcmwFr/MgbAALSfgfyHcId3iA4AAcAAbLEAAAABA4eIiA4AAAABAQGHkAAAAIGwYMAA/bYAAGDAAP22AT4BSYeaGoeewAC0mD4BSoevASSH7ANqh8BgwAD9tsAAkaiAh8/AWv+qaofdYMAA/bbAAJOvPgFKh/0BgIgEwFr/qgbAALSggfyIb4h2iSIAAcAAbLIAAAABA4iCiSIAAAADAwOIigAAAJy+YMAA/bYAiJsAAAC8P2DAAP22AIitAAAAnL9gwAD9tgAAYMAA/bYBPgFKiLkBJAADHojDwAC0ngEAAYCI1MBbACIAHojpwAC0nwEAAYGI+8BbAC8AHokIwAC0nQEAAYKJF8BbADwABsAAtKGB/ImQiZeKGQABwABsswAAAAEDiamKGQAAAAMDA4mxAAAAamDAAP22AIm/AAAAgbBgwAD9tgCJzAAAAIKMYMAA/bYAAGDAAP22AT4BSonVASSKFwMeid/AALSfAQABgInxwFsAsQCBifnAWwC9Hon/wAC0nwEAAYKKEcBbAMoABsAAtKKB/JKXkpyYDAABwABstAAAAAEDkq6YDAAAAAUEBJKzAAAAtt1gwAD+NwCSxQAAAILjYMAA/bYAkt0AAACCk2DAALT/AJMPAAAAhchdwAD8pQJgwAD9tl3AALSnAWDAALUsAAGTHwAAAIF0YQFgwAD9tlwBagBgwAD82XdcAT4DTpNMk1QAAMAAbLVdwAD8dAFgwAD9tgEck2AWk1uDk1bAWwFcg2LAAPzHgK0AAAAAwAD8SE6Th5ONAACApl3AAPylAmDAAP22YMAAtP8BHpOPwAC09AIAAoKTn8BbAU+Fk6XAWwGYAD0ck7iGk7LAWwHMg/gBAAE0k8ADk8CYCQAAAAICApPIAAAAmaZgwAD9tgCT3gAAAIKTYMAAtP8AAGDAAPzZAT4ETpQFlBUAAMAAbLZdwAC0pwFgwAC1LAEclBuDlBfAWwFcSwEAAYeUHMBbAhwAwAD8uUAhHJRAFJQwwFsCQAkASAEAASsAwAD9KZQwlEcBJJRuBCfAAGy3h5RewFsCHCeBnoOUacBbAVxOlIaUlQAAwABsuF3AAPylAmDAALUlYMAAtSwBHJSmFJSXwFsCQAkASwEAAYCUp8BbATUAwAC0r0aUt5TnlMcAAACEqmDAALT1ABaU2hSU1cBbAikIAIRjwAC1Aj4DTpT2lPsAAIGwYMAA/bYBFpUIFJT9wFsC5AsAgbDAALT6TpUclSQAAMAAbLlgwAC1LAEelS7AALVBAwADgJU1wFsBNRaVSxSVQMBbAuQLAINcwAC0+RSVU8BbAwYMAABJlWAWlW8WlWwUlWTAWwMnDQCzVcAAtS60fsAAtSg+AkmVgxyVohaVlxSVh8BbAkAJAMAAbIrAALSrh0EBAAEWlbYUla7AWwMnDQCzVcAAtS4AwAD8uD4BPRyV0ISVx8BbAXsgAQABJAAMJ8AAbLqBleLAWwFCJ5JkJ8AAbLsWliIUlhrAWwMnDQCzVcAAtS4ngZ6HlirAWwIcJ4NVFJZFwFsDJw0AJ4GJHJZuFpZkFJZUwFsCQAkAwABsisAAtKtLAQABFpZ3FJZvwFsDJw0As1XAALUuAMAA/LkngWoAAD89HJasFpaiFJaSwFsCQAkAwABsisAAtKuAvwIAAhaWtRSWrcBbAycNALNVwAC1LhSWu8BbAycNAADAAPy6PgJJltsclu4Ult/AWwKoCgCHQQEAARaXAhSW+sBbAycNALNVwAC1LgDAAPy4PgE9HJcchJcTwFsBeyABAAEkAAwnwABsuoGXLsBbAUInkmQnwABsuxaXbhSXZsBbAycNALNVwAC1LieBnoeXdsBbAhwng1UUl5HAWwMnDQAngYkcl64Ul6DAWwKoCgBLAQABFpe3FJevwFsDJw0As1XAALUuAMAA/LkngWoAAD89HJfgFJfSwFsCqAoAgL8CAAIWl+kUl+HAWwMnDQCzVcAAtS4Ul+/AWwMnDQAAwAD8ugDAAPzEBsAAtKOB/JlHmVCkIgABwABsvAAAAAEDmV+kIgAAAAUCAplxAAAAwABsvWDAAO+8AJmFAAAAwABsvmDAAO3zAAOZrQAAAMAAbL9dwAD8MgFgwAD9tgFqAGDAAPzZd5nHAAAAwABswF4AAQIBYMAA/bYBwABswWDAAPoKAGDAAP43AWoAYMAA/Nl3mgUAAACBdGEBYMAA/bZcAWoAYMAA/Nl3YMAAtLMBPg9OmimaNAAAgaxgwAD+NwEcmkqDmjbAWwXEIAIAASfAAGzCAcAAbMEqAE6abwAAAMAAbMNgwADujwBOmpEAAADAAGzEXcAA/KUCYMAA/bZgwADujwBJmqQlmrGAmqjAWwWIYMAA7o8+AT2OmsDAWwY6FJrPwFsFiAABYMAA7o9JmuIlmu+AmubAWwWIYMAA7fM+Aj2PmwPAWwZKHpsZwAD8rAACYMAA/bZgwADujwAARpsyAJtIAAAAg89gwADvvAAcm1oUm1HAWwWIAAFgwADt88AAbMUBAAABwABsxinAAO4KQT4CSZt9ISWbhxSbgcBbBsMIAGDAAO6PQpuRAD9Jm6Ecm8EWm7wWm68Wm6sUm6XAWwbDCACArMAA78WDGMAA/kWB6MAA/FlIAQABJ8AAbMIAwAD9xT4BPY6b28BbBjomm9sBFJvqwFsGwwgAYMAA7o8+AT0cnBeHnAjAWwZKgL8CAAIcnCcWnCIWnB4UnBjAWwbDCACArMAA78VOwAD+QoC+AQABFpxDFpw+Fpw6FJwxwFsFiAABYMAA7fOArMAA7fdOwAD+QmHAAP26AMAA/cwmnBcBFJxawFsGwwgAYMAA7o8AwAD8uj9OnH2ciwAAwABsx2DAAP22ARycsB6ckcAA7pIBAAEWnKuGnJ7AWwY6gKzAAO/FAMAAW+wAAAAAwADurE6c3pzjAACCk13AAPylAmDAAP43YMAAtP8BMpzlYMAA/jdgwAC0/wGFnOvAWwYRHp0DwAC1BgMAAxSdGsBbB9wIABqdKcAAtPEanTfAALTyAE6dcp1/AADAAGySXcAA/KUCYMAA/bZdwAC0pwFgwAC1LAEynYFgwAD9tl3AALSnAWDAALUsAEadh52znZMAAADAAGzIYMAA/bYAgp2hwFsFpz4BPRydxRSducBbCGgKAIC/AgACFJ3GwFsIogsAH53YwAC0sgABYMAAtSwAAADAAPy6PR6d/MAAtKIFAASFng/AWwYRFp41Fp4oFp4kgJ4bwFsFiICswADvxYMYwAD+RYHowAD8WRyeRRSeQcBbCBcJAEsBAAGFnkbAWwYRAMAA/LkUnlPAWwhoCgABgXSEnnLAWwXwTp6UnqYAAMAAbJFdwAD8pQJgwAD9tmDAAP22ATKeqGDAAP22YMAA/bYBFp65hZ6uwFsGEU7AAP5CFp7QHJ7DFJ6/wFsIFwkASwEAAYWexMBbBhEAwAD8uZivwAC1AU6e8AAAAMAAbJNdwAD8dAFgwAD9tgBPnwGfAQAAAcAAbMlhA2DAAP22YMAA7o9gwAD6CmDAAPzZAAOfEqFGAAAAAwMDnxoAAADAAGzKYMAA/bYAnywAAADAAGzLYMAA7o8AnzwAAADAAGzBYMAA+goAAGDAAPzZAT4IPSMcn1YUn0nAWwmsDABIAQABKwDAAP0pFZ9JwFsJrAwxn1pgwAD9tgArAV3AAPx0AWDAAP22PRyfbxSfYsBbCawMAFYBAAEUn3PAWwnvDgAAwAD8hU6fiZ+UAADAAGzMYMAA/jcBHJ+qg5+WwFsFxCACAAEUn6vAWwnvDgABwABswRSfv8BbCg0QAABOn9Kf2gAAwABszWDAAP22ARyf5hSf3MBbCf4PAMAAW+wAAAAAwADurE6gDKAdAADAAGzOYMAAtP8BHqArwAC1BgMAAxSgQsBbCrISABqgS8AAtPEaoFnAALTyAD0coHsUoGrAWwlOCwCAvwIAAhaghxSgfMBbCnsRAE7AAP5CFqCgFKCPwFsK2xMAmK/AALUBAMAA/Lo9HKC0FKCwwFsIFwkAgL8CAAIUoLXAWwp7EQAUoMPAWwrbEwAAwAD8uj0eoNnAALSiBQAEFKDswFsKexEAFKD4wFsJ7w4AFKEFwFsK2xMAFKEXwFsIaAoAAYF0hKE4wFsF8EmhSyEcoWCBoU/AWwWXSAEAASsAwAD9KT4DTqF2oXsAAIC9YMAA/bYBFqGXFqGKFqGGgKF9wFsFiICswADvxYMYwAD+RYHowAD8WU6hqKGzAADAAEK4YMAA/bYBHKG6FKG1wFsLxA4AgL4CAAKTHKHMFKHHwFsLxA4AlloBAAEngWoAwAD9ygDAAP3MRqHjoiOh+QAAAMAAbMtgwADvvAAcoheBogbAWwWXwABsxQAAAADAAO4KPgJOojKiPgAAwABsymDAAP22ARaiWxaiThaiShSiQMBbDDoQAICswADvxYMYwAD+RYHowAD8WUmiZxyidxSia8BbDGIRAIHWAQABFKKCwFsL9Q8AAMAA/cg+AT0coqoUopnAWwnEDQAgAwADFKKrwFsMYhEAJqK4ARSiuMBbDDoQAGDAAO6PKQAAPz9Jot4hHKLyh6LiwFsGSkgBAAErAMAA/Sk+AUajAaNMox0AAADAAGzPXcAA/MwCYMAA/bZgwADujwAWo0OHozPAWwZKg9DAAPzGPgE9HKNlFKNUwFsJxA0AIAMAAxajhBSjccBbDQoOAIPRwAD8zhajnBSjicBbDQoOAICWwAD8zyoAAD9Ko7gBH6PDwAC0vgYABhaj1YCjzMBbBYiArMAA78WFo9rAWwYRFKPmwFsJTgsAFKP5wFsIFwkAFKQFwFsIaAoAFKQTwFsJrAwAAAbAALSkgfyyzbLUtTIAAcAAbNAAAAABA7LjtTIAAAACAgKy6wAAAJivYMAA/bYAsw4AAACEY13AAPylAmDAAPvQXcAA/HQBYMAA/bYAAGDAAP22AT4FTrMssy8AAIPkYMAA/gABH7M1wAD+HwAAAABOs0uzTwAAgoxgwAD70AGTRrNWs4yzXwAAAINcYMAA+9AANbN6AAABAF3AAPx0AWDAAPvQARyzehazdYGzacBbDeiDYsAA/MeArQAAAADAAPxINQAAAAEAWwEcs4SFs4LAWw5MgK4AAAAAwAD8h4UAwFsOTD4ESbOSHLOdhLOWwFsOPoFtAQABFrOrgLOgwFsN22HAAP26AMAA/QA+Aj0cs76Cs7vAWw4QgooBAAEnnLIAwAD+FEqz0gEcs9yCs9nAWw4QIwAAAADAAP4ZP0mz8hyz/YSz9sBbDj6AlwEAAYOz/8BbDioAwAD8/z4BPRy0D4K0DMBbDhCCigEAARy0IIC0FcBbDduAvgIAAoO0KsBbDiqEtC/AWw4+AMAA/cwAwAD+FD9GtEO0crRPAAAAhKpgwAD9tgActGiBtF3AWw3oSwEAAYS0acBbDj4AwAD8uT4BPRy0fYK0esBbDhCCigEAAR60g8AAtKEDAAMnnhyFtJzAWw9UJ5mkAADAAP4UPYu0usBbDiqEtMDAWw4+SbTOHLTWg7TSwFsOKmMBAAEWtOOAtNjAWw3bYcAA/boAwAD8/T4BPRy09IK08cBbDhCCigEAARy1BYC0+sBbDduAvgEAAYO1D8BbDioAwAD9zADAAP4UP0q1HAEctSaCtSPAWw4QIwAAAADAAP4ZBsAAtKWB/L8qvzfAAFA3AAHAAGzRAAAAAQO/Q8AAUDcAAgEAAIJ2YMAA/RwBWwoGBr9QAAAAwABs0mDAAP22AL9iAAAAwABs02DAAP43AL+LAAAAgpNdwAD8pQJgwAD+N2DAALT/AL+wAAAAwABskl3AALSnAWDAALUsAL/SAAAAwABs1F3AALS/AV8AAAC/9wAAAMAAbKRdwAC0ywFfAAAABMAAQBAAAADAAGzVYQJgwAC1LF3AALV+AV8AAGDAAPoKAWoAYMAA/Nl3wABAVwAAAMAAbNZgwAD6CgFqwABAZGDAAPoKdcAAQHMAAADAAGyEYMAA+goBasAAQH1gwAD6CgDAAECNAAAAgXRhAWDAAP22XAFqAGDAAPzZd13AALipAWDAAPoKAT4NTgAAAAGByF3AALfvAWDAAPoKAR/AAECvwAC3/AABYMAA+goAAE4AAAAAgcldwAC4pQFgwAD6CgBOAAAAAIHKWwBOAAAAAIHLWwBOAAAAAIHMWwBOAAAAAIHNWwGTTgAAAACBzlsAT783AAAAAIHQWwADv0PAAFA3BAAAAwADAAAAAIHRWwAAAAAAgdJbAAAAAACB01sAAFsBSz4DQT4PTsAAQL3AAEDCAAASXcAAtNkBXwAAAR/AAEDIwAC06AMBXwAAA4LAAEDSwFsQd4PAAEDYwFsQj4TAAEDmwFsQpABOwABA/MAAQQcAAMAAbNdgwAD6CgEqTsAAQRvAAEEnAADAAGzYXcAA/WcBYMAA/jcBHsAAQS3AAMDiAAFgwAD+NwAAT8AAQTzAAEFBAAABwABs2V4AAgMDXcAA/KUCYMAAtSVdwAC1fgFfAABdwAD8pQJgwAC1JWDAALUsYMAA/jcAAFwAA8AAQU/AAEn4AAAAAwIDwABBbgAAAMAAbJddwAD8pQJgwAC1JV3AALV+AV8AAADAAEGKAAAAwABs2l3AAPylAmDAALUlYMAAtSwAwABBogAAAICsYMAA/jcBagBgwAD82XcAXAE+A07AAEGzwABBwwAAwABs22DAAPoKASo9HMAAQdoUwABB0MBbEsgZAIP4AQABNMAAQeIDwABB4sAASXoAAAACAgLAAEHmAAAAs1VgwAC1JQDAAEH4AAAAwABsDl3AALV+AV8AAAAAYMAA/NkBPgNOwABCDsAAQhUAAJy/XwAAARbAAEIiFMAAQhfAWxNvHgCAlsAAtYFOwABCNsAAQkEAAMAAbNxgwAD9tgEcwABCUYXAAEJDwFsQt7z7AQABFMAAQlnAWxOOHwAAwAC0z0nAAEJpIRzAAEJ6FMAAQm7AWxLoGgCHQQEAARTAAEKGwFsTYB0AAMAA/Lg+AUnAAEKVIRzAAEKohcAAQprAWxC3gVUBAAEUwABCsMBbE44fAADAALTOPgNOwABCzMAAQtwAAMAAbN1gwAD9tgEewABC5sAAtUACAAIUwABC8cBbE2AdABTAAEL1wFsTtSAAAD0cwABDGYTAAEMMwFsQpKU+BAADFsAAQz8UwABDNMBbE28eAICswAC1ghbAAENdFMAAQ1LAWxNvHgCDXMAAtYcjFMAAQ3PAWxEQCAAkwABDzgQnwABs3oDAAEOYwFsQWSfAAGzfFsAAQ68UwABDrMBbE2AdAMAAbODAALUpJAANJ8AAbN6AwABD2MBbEFknwABs3xbAAEPvFMAAQ+zAWxNgHQDAAGzgwAC1KSfAAGzhJ8AAbOIWwABELxTAAEQkwFsTbx4AwABs48AAtYgnrwknwABs5B7AAERjwAC0nQEAARTAAERywFsURSEAACevCSfAAGzlFsAARM4UwABEwsBbEugaAINiwAD8xwFgwAD9tgHAAGyEFMAARO7AWxEQCADAALTIScAARQMiHMAARRiGwABFB8BbEMtIAQABKwDAAP0pARzAAEUzhsAARSPAWxDLIAIAAisUwABFOsBbE28eAAAAPgE9FcAARVXAWxMhHCk/Pz4DTsAARaLAAEWrAACcvmDAALUsARzAAEW4FMAARa3AWxLoGgBLAQABFMAARbnAWxNgHQAAwAD8uU7AAEXNwABF3wAAwABspWDAAP22ARzAAEX7hcAARe3AWxC3wABr9QIAAhTAAEYIwFsTjh8AFsAARhkUwABGEMBbFfMhAICWwAC1LwDAALTNScAARikhHMAARj8UwABGLcBbFioiAEgBAAErAMAA/cU+A07AAEZbwABGawAAwABs3WDAAP22AR7AAEZ1wAC1QAIAAhTAAEaAwFsTYB0AFMAARoTAWxO1IAAAPRzAAEaohMAARpvAWxCkpT4EAAMWwABGzhTAAEbDwFsTbx4AgKzAALWCFsAARuwUwABG4cBbE28eAINcwAC1hyMUwABHAsBbERAIACTAAEdiBCfAAGzmgMAARyzAWxBZJ8AAbN8WwABHQxTAAEdAwFsTYB0AwABs4MAAtSkkABAnwABs5oDAAEdxwFsQWSfAAGzfFsAAR4gUwABHhcBbE2AdAMAAbODAALUpJ8AAbOEnwABs5x7AAEe8wAC0mgEAARTAAEfMwFsWKiIAACevCSfAAGzoFsAASBIUwABIB8BbE28eAMAAbOPAALWIJ68JJ8AAbOkewABIRcAAtJ4BAAEkwABIYQEUwABIWMBbFfMhAAAnrwknwABs6h7AAEiLwAC0nQEAARTAAEiawFsWnCMAAAFgwAD9tgHAAGyEFMAASMbAWxEQCADAALTIScAASNsiHMAASPCGwABI38BbEMtIAQABKwDAAP0pARzAAEkZhsAASQnAWxDLIAIAAhTAAEkawFsV8yEAFMAASSTAWxNvHgAAAD4BPRXAAEk/wFsTIRwpPz8AwAD8xEnAAEmBFMAASYXAWxMhHAA+Aj0VwABJnsBbEjUWKUnAAEm3IRzAAEm/FMAASbvAWxMEGwBIAQABKwDAAP5ePgE9HMAASd4UwABJ0sBbEksXAFYBAAEUwABJ4sBbEwQbAADAAP10Pz89HMAASg0WwABKAhTAAEn9wFsR9BUAwABslcAAtOKD+AEAATTAAEoVA8AAShXAAEqCAAAAAgICwABKGgAAAICsYMAA/jcAwABKNgAAAMAAbJddwAD8pQJgwAC1JV3AALV+AV8AAAAAYMAA/NkBPgE9HMAASlUUwABKR8BbEnwYACADAAMUwABKVsBbGSsaABzAAEpyFsAASmYUwABKYcBbEfQVAMAAbJLAALTcSwEAARTAAEpzwFsZHBkAAMAAtK8UwABKecBbGRwZAAAAAMAAtK49HMAASpUUwABKh8BbEnwYACACAAIWwABKphbAAEqbFMAASpbAWxH0FQDAAGyVwAC04sAAbIrAALSrFsAASsQWwABKtxTAAEqywFsR9BUAwABsksAAtNzAAGyKwAC0qwAATsAAStzAAErnAADAAGzrXcAA/WcBYMAAtSUBHsAASu3AAMDiAAFgwAC1JQAAT8AASvrAAEr/AAABwABs7F4AAgMDXcAA/KUCYMAAtSVgwAC1LF3AAPylAmDAALUlXcAAtX4BXwAAYMAA/jcAAFwAA8AASwvAAE2eAAAAAwIDwABLJAAAAMAAbNpdwAD8pQJgwAC1JWDAALUsAMAAS0gAAADAAGyXXcAA/KUCYMAAtSVdwAC1fgFfAAAAwABLXgAAAICsYMAA/jcBagBgwAD82XcAXAE+Aj0cwABLdhTAAEtqwFsalhsAg/gBAAE0wABLfgPAAEt+wABNRwAAAAICAsAAS4IAAACzVWDAALUlAMAAS44AAACcvmDAALUsAABgwAD82QE+AUnAAEugIRzAAEuvFMAAS6XAWxqyHACHQQEAARTAAEu7wFsbGB4AAMAA/Lg+Az0cwABL1RTAAEvKwFsaGRkAVgEAARTAAEvZwFsbGB4AAMAA/XROwABL7cAAS/UAACJgwAD9tgEkAAcnwABs7YDAAEwBwFsQWSfAAGzfFsAATBgUwABMFcBbGxgeAMAAbODAALUpJ4NVJ5TCHsAATD/AALSeAQABJMAATFsBFMAATFLAWxsnHwAAScAATGghHMAATHAUwABMbMBbGtIdAEgBAAErAMAA/l4+AT0cwABMkoTAAEyFwFsQpKU+BAADFMAATK3AWxrSHQAcwABMv4TAAEyywFsQpMAAbJwCAAIUwABMz8BbGxgeABTAAEzTwFsa0h0AAMAAtMcUwABM2cBbG5IgAAHAAGyEFMAATPrAWxEQCADAALTIPgE9HsAATSDAAPWzAQABFMAATSbAWxuSIAAAPwDAAPzEScAATU4iFsAATV0UwABNUsBbGhkZAIOywAD8VwAhHMAATW8UwABNa8BbGtIdAEgBAAErAMAA/l4+AT0cwABNjBTAAE2AwFsSSxcAVgEAARTAAE2QwFsa0h0AAMAA/XQ/PRzAAE21FsAATagUwABNo8BbEfQVAMAAbJLAALTcg/gBAAE0wABNvQPAAE29wABOJAAAAAICAsAATcIAAACArGDAAP43AMAATdgAAADAAGzaXcAA/KUCYMAAtSVgwAC1LAAAYMAA/NkBPgE9HMAATfcUwABN68BbGkoaACADAAMUwABN+MBbHUwcABzAAE4UFsAATgoUwABOBcBbEfQVAMAAbJXAALTiSwEAARTAAE4VwFsdPRsAAMAAtK8UwABOG8BbHT0bAAAAAMAAtK49HMAATjUUwABOKcBbGkoaACACAAIWwABOSBbAAE47FMAATjbAWxH0FQDAAGySwAC03MAAbIrAALSrFsAATmQWwABOWRTAAE5UwFsR9BUAwABslcAAtOLAAGyKwAC0qwAAScAATnMhFMAATnjAWxEQCAA+AUbAAE6IwABOpcAATpEAAACArGDAAP43ABTAAE6YwFsSSxcAPgM9HsAATq3AAPWzAQABJMAATu8DJ8AAbO4WwABO2xbAAE7OFMAATsrAWx5RGwCDGMAA/kWB6MAA/FknwABs7wA9HsAATvjAAPWzAQABHMAATwMUwABO/sBbEfQVAMAAbKMCAAIUwABPDMBbHlEbAIXAAE8RwFsQtwDAALTlAD0ewABPKMAA9bMBAAEnwABs8AA/ScAAT3kWwABPiBTAAE99wFsaGRkAg7LAAPxXPgI9HsAAT5rAAPWzAQABJMAAT70DJ8AAbPEUwABPsMBbGhkZACeBagA9FcAAT8TAWxI1Fik/ScAAT90iFMAAT+HAWxI1FgAAh8AAT+/AWxD0PgE9HMAAUAsUwABQAsBbESwJACABAAEnwABs8gAAPz0VwABQJMBbEXoLFMAAUCvAWxI1FgBCAAA9HgDAALfCAgACFADAWxFVCgAUAMBbEXoLAABKwABQNwADAQBbAQAAAACB0lsAAQAAAACB01sAPgE9HAAUAMBbEVUKAIHbAgACFADAWx/IFQAUAMBbH9EWAADAALjSPRUAwFsRjQweAMAAt8MBAAEUAMBbEb0RAAA9FQDAWxGWDR4AwAC3vQEAARQAwFsRvREAAD0VAMBbEZ8OHgDAALe+AQABFADAWxG9EQAAPRy/QxQAwFsRVQoAagEAARQAwFsRvREAAABKAAEWABQAwFsRVQoAgdzAALjOBsAAtKaB/MAAU13AAFNkwABcIAABwABs8wAAAAEDwABTbMAAXCAAAgAKAQHAAFN3AAAAwABs9GDAAO3zAAnAAFOSAAAAgfxdwAD8dAFgwAD9tgFqwABTmF3AAPx0AWDAAP22gxvAAFO4AAAAwABs9WDAAO3zAWrAAFPGYMAA/Nl3wABT1AAAALgcYMAA+9ABasAAU9xgwAD70BXAAFPnAAAAwABs9mDAAPvQAWrAAFPzYMAA+9AJwABT/wAAAMAAbPdhAWDAAP43XAFqAGDAAPzZd8AAVCUAAADAAGy/XcAA/DIBYMAA/bYBagBgwAD82XfAAFQ/AAAAwABswF4AAQIBYMAA/bYBwABswWDAAPoKAGDAAP43AWoAYMAA/Nl3wABUfQAAAIF0YQFgwAD9tlwBagBgwAD82XfAAFSsAAAAwABs+F4AAQUBYMAAtLMEwABsg2DAAPoKwABshGDAAPoKwABshWDAAPoKgIFgwAD6CgFXwAC0kgBdwAC4qQFgwAD6CgFqAGDAAPzZd13AALipAVsBPg5OAAAAAYHIXcAAt+8BWwEfwABUvMAAt/wAAVsAAE4AAAAAgcldwAC4pQFbAE4AAAAAgcpbAE4AAAAAgctbAE4AAAAAgcxbAE4AAAAAgc1bAZNOAAAAAIHOWwBOAAAAAIHPWwBPwABTZAAAAACB0FsAA8AAU2zAAFwgBAAAAwADAAAAAIHRWwAAAAAAgdJbAAAAAACB01sAAFsBSz4DQT4QPYnAAFULwFsguRzAAFUXgcAAVRLAWyC5gK0AAAAAwAD8SE7AAFUowABVMAAAgIFgwAD6CgEcwABVN4HAAFUywFsguYRZAQABJ8AAbPkAwAD8kU7AAFVMwABVVQAAwABshGDAAPoKARzAAFVcgcAAVVfAWyC5hFkBAAEnwABs+gDAAPyRTsAAVXHAAFWAAADAAGz7YMAA+goBHMAAVYeBwABVgsBbILmEWQEAASecmADAAPyRTsAAVZzAAFWuAADAAGyFYMAA+goBHMAAVbWBwABVsMBbILmEWQEAASfAAGz8AMAA/JFOwABVysAAVdQAAMAAbINgwAD6CgEcwABV24HAAFXWwFsguYRZAQABJ8AAbP0AwAD8kU7AAFXwwABV+gAAwABs/mDAAPoKASpOwABWCsAAVhYAAMAAbP9gwAD6CgEqTsAAVibAAFYyAADAAG0AYMAA/bYBHMAAVkUWwABWQBbAAFY8gMAAVjTAWyCngKzAAO33TsAA/kKC5AIAAhbAAFZZGsAAVlTAAP48TsAA/kInAADAAP3WPR7AAFZmwAD1swEAASTAAFaGAifAAG0BFMAAVnnAWyP3HQAATsAAVqLAAFarAAC0Tl3AAPx0AWDAAO+8ARzAAFa1gMAAVq3AWyCnwABsxQAAAADAAO4KScAAVsMcwABWzoPAAFbHwFsg/ICXAQABlADAAPz/PgNOwABW3cAAVuMAAGpgwAD70AEcwABXAhzAAFb1FsAAVu4UwABW5cBbJHIeAGHAAPyjg4gBAAGEwABW98BbIRYAwAD894aBAQABg8AAVwXAWyD8AMAA/PpOwABXFcAAVxkAAIKMYMAA+9ABHMAAVz4cwABXKxbAAFckFMAAVxvAWyRyHgBhwAD8o4OIAQABHMAAVzmEwABXLsBbIRZkAQABlADAAPz1AMAA/PeGgQEAAYPAAFdBwFsg/ADAAPz6PRXAAFdNwFskch4cwABXYRTAAFdYwFskch4AgVgCAAIUwABXacBbJMUfABTAAFdwwFslHCAAAMAA/Jc/TsAAV4DAAFeKAADAAG0CYMAA+9ABk0bAAFeRAMAAV6cAAACkEGDAAO+8ABTAAFexwFskch4AQT4LTsAAV8jAAFfNAACAvWDAAP22ARbAAFfnFsAAV9oWwABX1hTAAFfPwFsl2iAAgKzAAO/FgxjAAP5FgejAAPxZScAAV/EiIhbAAFf6gcAAV/XAWyC5g7LAAPxXACEcwABYDoHAAFgJwFsguYMXAQABFMAAWBfAWyX4IQAAwAD8QQAhFMAAWCHAWyPLGwBCwABYLAE/ScAAWDoUwABYPsBbIzcYAD0VwABYTsBbI8sbKT89FcAAWGTAWyW/HxzAAFhtFMAAWGTAWyW/HwBkAQABlADAAPz1ScAAWHYhHMAAWIGFwABYesBbITJIAQABKwDAAP0pPgE9HMAAWJiFwABYksBbITIgAQABFsAAWKAUwABYmcBbJdogAICswADvxQAAPz0ewABYsMAA9bMBAAEnwABtAwBOwABZCcAAWRIAAMAAbIZgwAC0swEewABZFMAAtKMFAAIUwABZLcBbJdogACMlwABZPBTAAFk1wFsl2iAAYMAA7o+CwABZRsBbIOArAWDAAO3zA8AAbL+GwABZdcBbIU7AAGzAh8AAWaXAWyFtgXQUwABZzsBbIZsIAD0ewABZ3sAA9bMBAAEkwABaCAInwABtBBbAAFn7FMAAWfLAWycsIgDAAGyQwAC0tQBJwABaDyIhFMAAWhTAWyMFFwAAIRzAAFo2FsAAWikUwABaIMBbJywiAMAAbJPAALS6SAEAASsAwAD9KT4CPR7AAFpHwAD1swEAASfAAG0FAEbAAFptwABan8AAWnkAAADAAGzKYMAA/bYAFsAAWpEUwABaiMBbJywiAMAAbJPAALS6PgE9HsAAWqnAAPWzAQABJMAAWsgCJ8AAbQYUwABavMBbKC8jAAA/TcAAWuICNQAAAAAAWwEewABa4sAAt78EAAQcwABa7xTAAFrowFshtQkAIAUAARTAAFrwwFsnLCIABMAAbIUUwABbFcBbI2cZAICBFMAAWznAWyLVFgDAAGyEFMAAW1TAWyMFFwDAAGyDFMAAW3HAWyOZGgAAFADAWyJIDQAUAMBbIlEOABQAwFsiehIAACtJwABa3hQAwFsikRMAPgE9FcAAW4XAWyPhHCk/ScAAW6UUwABbqcBbI+EcAD4BPRzAAFvFFMAAW7zAWyGbCAAgAQABJ8AAbPIAAD9JwABb3hzAAFvsFMAAW+LAWyW/HwBIAQABkwDAAPzzPgE9HMAAXAEUwABb+MBbIZsIACABAAEnwABtBwAAPz0eAMAAt8ICAAIUAMBbIhMKABQAwFsiMAsAAErAAFwgAAMBAFsBAAAAAIHSWwABAAAAAIHTWwA+AT0cABQAwFsiEwoAgdsCAAIUAMBbKb0WABQAwFspxhcAAMAAuNI9FQDAWyI/DB4AwAC3wwEAARQAwFsiehIAAD0VAMBbIkgNHgDAALe9AQABFADAWyJ6EgAAPRUAwFsiUQ4eAMAAt74BAAEUAMBbInoSAAA9HMAAU2wUAMBbIhMKAGoBAAEUAMBbInoSAAAASgABFgAUAMBbIhMKAIHcwAC4zgGB/ABbKnIAWt/1AFrk+ABa5xsAWu8uAFrwRwBa8j4AWvxvAAAABgBa/TAAWv2oAFr+IABa/pgAWv8QAFr/iABbAAAAWwCPAFsBEwBbBWYAWw25AFsQKABbIHsAWypyAAAADQAAAMAAtOkAgf0AAAaA2gEAwAC1lgAAgPQBAMAAtaEAAIEMAQDAALWqAACBJAEAwAC1wgAAgTsBAMAAtdcAAIFTAQDAALXrAAAJwAC1l8AAtaLAALWrwAC1xMAAtcjAALXZwAC12sAAte3AALXwAAAAAAABgf0AWytIAFsrRgAAAAAAWytIAAAAAAAAAMAAtOoAgf4AAAAAAAACAsAAtPWB/oGtgbODigPAAG0IAAABYMAA/RwAAAQEwAC094H+gfmB/wnAAELCAGDAAPvQAATAALT4gf6CPYJFCcAAQsMAYMAA+9AABMAAtPmB/oKegqQJg1wAYMAA+9AABMAAtPqB/oLYgtwJgbAAYMAA/bYAAQXAALT+gf6C4YLhgx8AAAADguuDHwAAAAQEBILxAAAEwABCwmDAAPvQAIL+AAAEwABCw2DAAPvQAIMNAAAEg1xgwAD70ACDGgAABIGwYMAA/bYAAGDAALT1AT8FCAHAALT3gADAWywBCAHAALT4gQDAWywQCAHAALT5ggDAWywfCAHAALT6gwDAWywsCQGC4cAA/TIAAAAAAQbAALT8gf6DJIMrg4gAACMAAAABA4Mzg4gAAAAAAAAAYMAA/bYBSoM/ASSDiAknwABtCRaDUy7AAELCwAC09yfAAG0KFoNkLsAAQsPAALT4J8AAbQsWg3Uug1zAALT5J8AAbQwWg4IugbDAALT6J4MhAABbLH8AWyzwAAAAAQLAALT/gf6Fu4XBlIMDwABtDQAAAWDAAP0cAAADBMAAtQGB/oYLhhUJmK8AYMAA/bYABMAAtQKB/oZchmcJhGMAXcAA/HQBYMAAtPUABMAAtQSB/oZ2hoEYwABtDsAAtOoAXcAA/HQBYMAA+9AAAgXAALUNgf6GhoaGhrYAAAADhpOGtgAAAAICAoaZAAAEmK9gwAD9tgCGqgAABIRjXcAA/HQBYMAAtPUAAGDAALT/AT8ECAHAALUEKwgBwAC1AYAAwFsthwgBwAC1AoEAwFstlAkBhobAAP0yAAAAAAXAALUOgf6Gu4a7hwYAlUkAA4bRhwYAAAADAwOG1wAABJivYMAA/bYAhugAAASEY13AAPx0AWDAALT1AIb6AAAEwABtDl3AAPx0AWDAAPvQAABgwAC0/wE/BAgBwAC1AYAAwFst9wgBwAC1AoEAwFsuBAgBwAC1BIIAwFsuFwkBhrvAAP0yAAAAAAQGwAC1BoH+h+OH6478BAHAAGvuAAAAAQOIAY78AAAAAwEDiAkAAADAAGzHYMAA/bYAiCcAAABqYMAA/TMBaogvYMAA/TPAAWj3iEUAAACCjGDAAP0zAWqIS2DAAP0zwACqdgBgwAC0/wE+C06IaYh0AADAAG0QYMAA/gABH4h6wAD+HwAAAABOiJ+IqwAAhGNdwAD8dAFgwAC09QExiLlgwAC09QBOiMWIywAAJ2DAAPvQAZNOiNiI3wAAg1xgwAD70AGTTojsiPMAAMAAQsJgwAD70AGUTokAiQkAAMAAQsNgwAD70AGUTokciScAAIcHXcAA/HQBYMAA+9ABMYkuYMAA+9AAPRyJQRSJNsBbL08JAFYBAAGGiUXAWy8bAMAA/IVDiVIciV+FiVnAWy8MYwEAARaJb4CJYcBbLohhwAD9ugDAAPz9QT4FTomFiZAAAMAAbRFgwAD9OQEciZiBiZLAWy6XwABtEgIAAoCJpsBbLoiFibXAWy8MAMAA/TZJicMhHInSFInHwFsvsgoASAEAASsAwAD9KT4DTonpifQAAMAAQnVgwAD70AEWigEUifbAWy+yCgCCjMAA/TxOih6KKQAAwABtE13AAPwyAWDAAP05ARyKO4KKN8BbLq/AAG0UAgACgIpGwFsuiBaKYBSKVcBbL7IKAIKMwAD9PADAAP01SYpuIRaKfhSKc8BbMCYMAIFVwAD8Vj4GToqZiqIAAMAAbRVgwAD9OQEWiq8UiqTAWzAmDACDGcAA/Fg9HIrOgIrAwFsuiIC7AgACgorWwFsurxSK28BbMAMLAADAAP3JTor5iv4AAIGwYMAA/bYBHIsOgIsAwFsuiIC+AgACFosjFIsYwFsvsgoAgozAAP08FosxFIsowFswhA0AasAA/TsAwAD9zD0ci0+Ei0PAWy7uVgEAAR+LV8AAtP4EAASHi2LAWy8rFItqwFsvPQgAhot0wFsvGxSLfMBbMMwOAAAAwAD8hT2Ni47AWy8MFoufFIuWwFswhA0AgozAAP08QouuAD8/TovVi94AAMAAYR5gwAD70AEci+6Ai+DAWy6IhAsBAAGFi/nAWy8MAMAA/cRBR4wHFIwPwFsxcQsAAwGMKGqMKGDAAPvQg/IAPgY9HIxCg4w3wFsu0oKKAQABJ4CvAMAA/hQ9joxZwFsvGxyMX4aMWcBbLxtkAQABlADAAPz1PRyMeBSMbcBbL08JAFYBAAGGjHzAWy8bAMAA/IU9j4yPwFsvKxyMlYeMj8BbLytkAQABlADAAPz1PRWMo8BbLz0IlEKMuwEBjM9qjM9gwAD70IP1AD4HSYzeIhyM7ByM6IWM4sBbLwxkAQABlADAAPz1YwEAARaM/ICM7sBbLohhwAD9ugDAAPz9AByNOByNIoCNFMBbLoiECwEAARyNM4WNLcBbLwxkAQABlADAAPz1AMAA/cRIAQABao07YMAA+9CD8gDAAPzzPgE9jY1OwFsvDByNU4WNTsBbLwxkAQABlADAAPz1Pz0cjXiDjW3AWy7SgooBAAEngK8AwAD+FD2OjY/AWy8bHI2Vho2PwFsvG2QBAAGUAMAA/PU9HI2uFI2jwFsvTwkAVgEAAYaNssBbLxsAwAD8hT2PjcXAWy8rHI3Lh43FwFsvK2QBAAGUAMAA/PU9FY3ZwFsvPQiUQo3xAQABPgM9HI4eg44TwFsu0oQRAQABFI4swFsxcQsAAMAA/hU9jo5BwFsvGxyOR4aOQcBbLxtkAQABlADAAPz1PRWOVcBbLz0IHI5dFI5VwFsvPQgAZAEAAZQAwAD89T2Njm/AWy8MHI50hY5vwFsvDGQBAAGUAMAA/PU9HI6NFI6CwFsvTwkAVgEAAYaOkcBbLxsAwAD8hUqOngEfjqnAALUOAwADHI7Ug47JwFsu0iMAAAAAwAD+GYSO4MBbLu4Uju3AWy9PCQAABsAAtQmB/o8BjwaR5QAAwABtFsAAtOoAAAABA48XkeUAAAAAAAAAXAE+AUmPIByPMBaPJC7AAG0OwAC06sAAtQRIAQABKwDAAP0pPgZOj0WPSwAAJ2DAAPvQAZNOj1qPYQAAg1xgwAD70AGTPRePbC7AAG0OwAC06jGPf2DAAPvQAMAAtQQ9HI+VFo+JLsAAbQ7AALTqwAC1BFYBAAGBj5nAWzR2AMAA/IVDj6gcj7WAj6/AWzRnYwEAARaPwhaPty6Yr8AAtQFhwAD9ugDAAPz9PgNOj9iP4QAAwABhHmDAAPvQARyP7haP4y6Yr8AAtQGECwEAAYCP+cBbNGcAwAD9xEFHkAmCkBHAWzTuAwGQLGqQLGDAAPvQg/IAPgM9iZA9wFs0dhyQQ4GQPcBbNHZkAQABlADAAPz1PRyQXxaQUy7AAG0OwAC06sAAtQRWAQABgZBjwFs0dgDAAPyFQpB4AAGQjmqQjmDAAPvQg/UAPgRJkJ8iHJCtHJCpgJCjwFs0Z2QBAAGUAMAA/PVjAQABFpC6FpCvLpivwAC1AWHAAP26AMAA/P0AHJD1HJDfFpDULpivwAC1AYQLAQABHJDwgJDqwFs0Z2QBAAGUAMAA/PUAwAD9xEgBAAFqkPhgwAD70IPyAMAA/PM+AT2IkQ3AWzRnHJESgJENwFs0Z2QBAAGUAMAA/PU/PYmRMMBbNHYckTaBkTDAWzR2ZAEAAZQAwAD89T0ckVIWkUYuwABtDsAAtOrAALUEVgEAAYGRVsBbNHYAwAD8hUKRawAAAT4BPYmRkcBbNHYckZeBkZHAWzR2ZAEAAZQAwAD89T2Ika3AWzRnHJGygJGtwFs0Z2QBAAGUAMAA/PU9HJHQFpHELsAAbQ7AALTqwAC1BFYBAAGBkdTAWzR2AMAA/IU/BsAAtQqB/pHqke+SwQAAhGQAAAABA5H8ksEAAAADAwOSAQAAAMAAQsJgwAD70ACSDQAAAMAAQsNgwAD70ACSHgAAAIGwYMAA/bYAAFwBPgM9HJIqLsAAbRbAALTqAAAAAMAAtQlOkkeSTgAAg1xgwAD70AEckmgcklsWklAuwABtDsAAtOrAALUESwEAARySY4CSXMBbNuiBjQEAAZQAwAD89gDAAPyDZAEAARySdIGSa8BbNveBjQEAAZQAwAD89gDAAPz1PRySihaSfi6EY8AAtQJWAQABH5KSwAC0/gQABICSncBbNuiBkqXAWzb3g5KvwFs3LoKSt8BbNwYAAMAA/IUGwAC1C4H+ksaSzZSBAADAAG0XAAAAAQOS05SBAAAAAAAAAGDAAP22AT4GTpLpkuwAAIPkYMAA/gABH5LywAD+HwAAAABOkxeTHAAAg1tdwAD8dAFgwAC09QE1kyoAAAEAXcAA/HQBYMAAtPUBHJMqFpMeLoRjwAC1AoCtAAAAAMAA/Eg1AAAAAQBbARyTO4GTOcBbOCeArgEAATSTQAOTQJNmAAAAAgICk0EAAACB1WDAALT1AJNEAAAAgkpgwAC09QAAYMAA+9ABSpNKARyTUxaTTIKTSsBbOHWDXMAAtPmCSwEAARaTX4OTXcBbOIKDXMAAtPkAwAD89ADAAPyHgQDAWzgnTpNxk3gAAINcYMAA+9ABk0aTgZOlk5EAAACEqmDAALT1AIGTn8BbOBI+Az0ck7CAk63AWzf4gooBAAEck8EWk7YumK/AALUBgL4CAAKCk8vAWzjTFpPeg5PTwFs454NcwAC0+QDAAP3MAMAA/hQ9HJPxgJPuwFs3+IKKAQABJJQOAyfAAG0PFpQHg5P8wFs454GwwAC0+ieGwADAAP4UPYqUF8BbONMWlCuDlCDAWzjng1zAALT5PRyUQICUPcBbN/iCigEAARyUURaURi6Yr8AAtQGAvgEAAYKUW8BbONMAwAD9zADAAP4USpRpARyUc4CUcMBbN/gjAAAAAMAA/hkAAFsuZgBbNBkAWzbIAFs3zABbOdMAAAAEBgTAALTtgf6A5IDuBsAAbRjAALTqAGDAAPvQAWqA6mDAAPvQg/IEwAC07oH+gPqBBAbAAG0ZwAC06gBgwAD70AFqgQBgwAD70IP1BMAAtO+B/oEVgSgGwABtGgBgwAD9MwFqgSRgwAD9tsABaPcEwAC08IH+gTiBRgbAAG0bAGDAAP0zAWqBQ2DAAP22wACqdgTAALTxgf6BV4F4BcAAbRwAYMAA/TMBHoFqwAD9XwEAASfAAG0dAATAALTygf6BiIGqBcAAbR4AYMAA/TMBHoGZwAD9XwEAASfAAG0fAAEGwAC09IH+liyWR5rnAAHAAG0gAAAAAQOWVprnAAAAAgIClmoAAADAAGzHYMAAtP8AlooAAACZLl3AAPwyAWDAAP22AABdwAD8pQJgwAD9tmDAALT/AT4HTpaklq4AAMAAbSFdwAD9ZwFgwAD9tgEclrmBlrDAWzr9lRMAAAAAwAD8SU6W4pbmAACAq13AAPylAmDAAP22XcAA/HQBYMAAtPUBMpcCYMAA/bZdwAD8dAFgwAC09QBGlwiXKZcUAAAAgyRgwAD9tgCClx7AWzslPgE9HJcyg5cvwFs7UIC/AgAChJczwFs7iDGXSWDAALT1AADAAPy6RpdcAJdsAAAAhKpgwAC09QAWl4iAl3rAWzruhGPAALUCQT4DTpefl6YAAMAAbSJgwAD70AEcl7gWl7OEl6jAWzvHgbDAALT6gLsBAAEngWoAwAD9yUmXyiEcl9WFl87AWzvoSAEAARyX2JSBxAAAAADAAPvzAMAA/PM+BE6X65f8AADAAG0jYMAA/bYBHJgOFpgJhJf+wFs7x4GwwAC0+oC+AgACk4WYG8BbO+gAwAD9zE6YMZhAAADAAG0kYMAA/bYBHJhSFphNhJhCwFs7x4GwwAC0+oC+AQABHJhjhZhcwFs76GQBAAGUAMAA/PUAwAD9zE6YfJiEAAC88F3AAPx0AWDAAP22ARyYohyYl4aYhsBbPECApgEAASeBBgDAAP3ZgK0AAAAAwAD8SEmYshyYwIKYtsBbOyWEAgEAARSYzMBbPLgIAADAAP18PgJGmOCY/ZjsAAAAmepgwAD9tgAUmPTAWzy4CAA+AT0cmRMcmQyDmQnAWztQSwEAARSZDcBbPRcJAADAAPy5VgEAAR+ZG8AAtP4EAAQWmTGEmSbAWzvHwABCwsAAtPcWmUSEmTnAWzvHwABCw8AAtPgWmWeEmVzAWzvHg1zAALT5h5lvwFs8dgAAwAD8hUKZkwA/P0aZtZnWmcEAAACDJGDAAP22AIKZy8BbOyU+AT0cmeocmeGDmd7AWztQSwEAAYaZ4sBbPakAwAD8uVYBAAGEme7AWzvHAMAA/IVOmiKaKAAAgKZdwAD8pQJgwAD9tmDAALT/ATKaQWDAAP22YMAAtP8APRyaS4OaR8BbO1CD+AEAATSaUwOaU5rUAAAAAgICmlsAAACDJGDAAP22AJp0AAAAhGNdwAD8dAFgwAC09QAAYMAA/NkBPgE9HJqMhJqHwFs97oC/AgAChZqNwFs+Mx+am8AAtQ0CAAIWmreAmqnAWzrumK/AALUBhprDwFs+QAAAwAD8ugDAAPzESprZAYSa4MBbPe4Bgf4AWz6qAFsrcABbLP0AWznsAAAAAgBbOswAWz6qAAAAAQAAAMAAtQ8Agf8AAAAAAAAJAsAAtRCB/4DagN+FTwvAAG0lAAABYMAA/RwAAA4EwAC1EoH/gN+A3wknAGDAAPvQAATAALUUgf+A34DfCSjAALUPAGDAAP22AATAALUVgf+A34DfBikAXcAA/HQBYMAAtRABagBdwAD8dAFgwAC1EMABahYEwAC1FoH/gTSBNAaCZgBgwAC1EAFqAGDAALUQwAFpAQTAALUXgf+BdYF1BpnCAGDAALUQAWoAYMAAtRDAAWkaBMAAtRiB/4G3gbcGhEMAYMAAtRABagBgwAC1EMABaTMEwAC1GYH/gl+CXwaD7gBgwAC1EAFqAGDAALUQwAFpTATAALUagf+CtYK1BrstAGDAALUQAWoAYMAAtRDAAWllBMAAtRuB/4MNgw0GqyYAYMAAtRABagBgwAC1EMABaX8EwAC1HIH/g4GDgQZcAGDAALUQAWoAYMAAtRDAAWmZBMAAtR2B/4QHhAcGXgBgwAC1EAFqAGDAALUQwAFpswTAALUegf+EjYSNBl0AYMAAtRABagBgwAC1EMABac0EwAC1H4H/hOeE5wbAAG0xAGDAALUQAWoAYMAAtRDAAWnnBMAAtSCB/4VIhUgGgcUAYMAAtRABagBgwAC1EMABagEBBcAAtSSB/4DfgN+FTwEAAAOA34VPAAAAAgICgN8AAAQnYMAA+9AAgN8AAAQoYMAA/bYAAGDAALUQAT8DCADAALUSgADAW0DNCADAALUUgQDAW0DZCQAAwAD9MgAAAAABBsAAtSKB/4DfgN+FTwAAIwAAAAEDgN+FTwAAAAAAAABgwAD9tgFKAAEPAC7AALUUAABbQRIAW0FCAAAAAQLAALUlgf+FdoWFhqMHwABMnAAAAWDAAP0cAAAAAQXAALUrAAAAAAQAAAMAAAAAAAAAAABgwAC1JQE/AQkBAMAA/TIAAAAAAwbAALUngf+FjIWXhZsBAoJnAAAAAQOFm4WbAAAAAAAAAGDAALUQAAbAALUogf+GVoZfhmcBArR+AAAAAQOGZ4ZnAAAAAAAAAGDAAPoKAAbAALUpgf+GjIaXhqEBAsAAbOAAAAABA4ahhqEAAAAAAAAAYMAA/bYAAABbQZcAW0G+AFtB5QBbQg4AAAADAsAAtSyB/4amhqyXngPAAG0yAAABYMAA/RwAAA0EwAC1LoH/hsGGwwmzVQBgwAC1JQAEwAC1L4H/htSG2QmAlgBgwAD9tgAEwAC1MIH/i/yMFAbAAG0zAGDAAP22AWqMC2DAAP22wAFqSQTAALUxgf+MLIxFBsAAbTUAYMAA/bYBaow7YMAA/bbAAWpOBMAAtTKB/4xdjHQGwABtNgBgwAD9tgFqjGtgwAD9tsABalEEwAC1M4H/jIyMpwbAAEfeAGDAAP22AWqMnGDAAP22wAFqVgTAALU0gf+Mv4zYBsAAbTkAYMAA/bYBaozOYMAA/bbAAWpbBMAAtTWB/4zwjQkGwABtOwBgwAD9tgFqjP9gwAD9tsABamAEwAC1NoH/jSGNPgbAAG09AGDAAP22AWqNMmDAAP22wAFqZQTAALU3gf+NVo1xBsAAbT8AYMAA/bYBao1mYMAA/bbAAWpqBMAAtTiB/42JjaYGwABtQQBgwAD9tgFqjZpgwAD9tsABam8EwAC1OYH/jb6N0wbAAG1DAGDAAP22AWqNy2DAAP22wAFqdATAALU6gf+N644CBsAAbUUAYMAA/bYBao35YMAA/bbAAWp5AQXAALVDgf+G3obkhwABAAADhuuHAAAAAAICAobxAAAEs1VgwAC1JQCG+gAABICWYMAA/bYAAGDAALUsAT8DCAHAALUugADAW0QHCAHAALUvgQDAW0QUCQGG5MAA/TIAAAAABQbAALU8gf+HBYcZh0sBAIPBAWqHBmDAAP0cAgAAAQOHIodLAAAAAAAAAGDAAPvQAUqHJQEchzYchzEWhygWhyUus1XAALUug8HAAP0vg4gBAAE3DQDAAPz3ZAEAARyHRxaHPhaHOC6AlsAAtS+DwcAA/buDiAEAATcRAMAA/PcAwAD89QbAALU+gf+HUIdqiAEDAEgBaodRYMAA/RwCAAABA4dsiAEAAAABAQGHbQAAAIPWWwAAYMAA+goBPgNJh3oeh37AAPWxAgACLoCHjsBbRPsASoeWASk/SYenISWHsYCHq8BbRPtgwAC1LEqHvgEqP0qH0AEiHIfaFofXLrNVwAC1LkgBAAEWh+OAh93AW0T7s1UAAMAA/SkAHIfvFofpLoCWwAC1L0gBAAEWh/iAh/LAW0T7gJYAAMAA/cUGwAC1P4H/iAaIGYg8AAAjAWqIB2DAAP0cAgAAAQOIIYg8AAAAAAAAAGDAAP22AUqIJwEeiCfAALVAAgACFogyLrNVwAC1LhaINi6AlsAAtS8ABsAAtUCB/4hBiE+L4wABwABtRwAAAAEDiFmL4wAAAAICAohdAAAAs1VgwAC1JQCIaAAAAICWYMAA/bYAAGDAAP22AT4CR4h1FoiAgIh9wFtGAoJnwAC1JwsBiJpqiJpgwAC1EMABaQEAPgJOiLOIvQAAwABtSGDAALVEASaIswGAiL/AW0YCYMAAtURKiMsBJIj5BGqI1GDAAP22wAFqThaI7IKI4sBbRkyAvcAAtU4nguaBiPPAW0YPAYkNaokNYMAAtRDAAWkaAD4CTokiiSoAAMAAbUlgwAC1VQEmiSIBgIkswFtGAmDAALVVSok4ASSJYwRqiUFgwAD9tsABalEWiVaCiU7AW0atgL3AALVcJ4LmgYldwFtGDwGJd2qJd2DAALUQwAFpMwA+AUqJiAEkiaUCaomRYMAA/bbAAWpWgYmfwFtGDwGJuWqJuWDAALUQwAFpTAA+AUqJxwGBic7AW0YPAYnnaonnYMAAtRDAAWllAD4BSon3ASSKEwJqigBgwAD9tsABaluBig3AW0YPAYonaoonYMAAtRDAAWl/AD4BSoo3ASSKUwJqikBgwAD9tsABamCBik3AW0YPAYpnaopnYMAAtRDAAWmZAD4BSop5ASSKlwJqioJgwAD9tsABamWBipHAW0YPAYqraoqrYMAAtRDAAWmzAD4BSoq8ASSK2QJqisVgwAD9tsABamqBitPAW0YPAYrtaortYMAAtRDAAWnNAD4BSor/ASSLHQJqiwhgwAD9tsABam+BixfAW0YPAYsxaosxYMAAtRDAAWnnAD4BSos/ASSLWQJqi0hgwAD9tsABanSBi1PAW0YPAYttaottYMAAtRDAAWoBAD4BSot8ASSLlwJqi4VgwAD9tsABanmBi5HAW0YPPTCLox+LrcAA+2IBAAEki94CJ8AAbUoWi9iAi9XAW0YCgmfAALUnAAbAALVBgf+OB44Wl5wAAYcKAAAAAQOOHJecAAAAAwMDjiEAAAC23WDAAP43AI4wAAAAg1xgwAD70ACOPwAAAIGwYMAA/bYAAGDAALUsAT4FTo5OAAAAs1VgwAC1JQBOjl0AAACcvmDAAP22AEmOaxyOdIKOb8BbSOKB1gEAAWqOf2DAAP22wAFqTgDAAP3IPgg9io6WwFtI4hyOooKOncBbSOKAvgEAARaOuWqOrGDAAP22wAFqTmHAAP26AMAA/cxOjsyO1QAAwABtS2DAAPvQARyO3IKO18BbSOKAuwEAASeC5gDAAP3JSY7wHI79hY70wFtJakgBAAEcjwCUgcQAAAAAwAD78wDAAPzzPTCPBCSPJgMnwABtTIKPIMBbSOIng0I/To81jzoAAIC9YMAA/bYBHI9Bgo88wFtI4oC+AgACk4WPTsBbSWoAwAD9zE6PZI9tAAC0fmDAAPoKARyPdIaPb8BbSc6B1gEAAWqPf2DAAP22wAFqSQDAAP3ISY+Uh4+YwFtJ+T4BPY6PrMBbSc4cj7iGj7PAW0nOgL4BAAEWj89qj8JgwAD9tsABaklhwAD9ugDAAP3MPz2Lj+bAW0j5Ho/vwAC1SgIAAYaP+MBbSc4BtH6HkAjAW0n5PYyQGcBbSQcckCmCkCTAW0jigL4BAAEckDyFkDPAW0lqZAEAAZQAwAD89QDAAP3MSZBNHJBWgpBRwFtI4oHWAQABapBhYMAA/bbAAWpRAMAA/cg+CD2KkHfAW0jiHJCDgpB+wFtI4oC+AQABFpCZapCNYMAA/bbAAWpRYcAA/boAwAD9zE6QrJC1AADAAG1LYMAA+9ABHJC8gpC3wFtI4oC7AQABJ4LmAMAA/clJkNAckN2FkNTAW0sNSAEAARyQ4JSBxAAAAADAAPvzAMAA/PM9MJDkJJEFAyfAAG1NgpD/wFtI4ieDQj9OkRSRGQAAgL1gwAD9tgEckSCCkRvAW0jigL4CAAKThZEtwFtLDQDAAP3MTpFDkUwAALR+YMAA+goBHJFThpFOwFtLcYHWAQABapFeYMAA/bbAAWpJAMAA/chJkXOHkXfAW0ucPgE9jpGLwFtLcRyRl4aRksBbS3GAvgEAARaRrmqRoWDAAP22wAFqSWHAAP26AMAA/cw/PYuRxcBbSPkfkc7AALViAgABhpHWwFtLcQG0foeR5sBbS5w9jJH3wFtJBxySB4KSAsBbSOKAvgEAARySGoWSEcBbSw1kAQABlADAAPz1AMAA/cxJkisckjSCki/AW0jigdYBAAFqkj9gwAD9tsABalYAwAD9yD4CPYuSV8BbSPkfkmDAALVwAQABgJJqwFtIyAA9jJJ8wFtJBxySjIKSh8BbSOKAvgEAARaSpGqSlmDAAP22wAFqVmHAAP26AMAA/cxJkrgcksGCkrzAW0jigdYBAAFqksxgwAD9tsABalsAwAD9yD4CPYuS48BbSPkfkuzAALV9AgACgZLzwFtI1WqTAmDAALUQwAFpZQA9jJMRwFtJBxyTIYKTHMBbSOKAvgEAARaTOGqTK2DAAP22wAFqW2HAAP26AMAA/cxJk0wck1WCk1DAW0jigdYBAAFqk2BgwAD9tsABamAAwAD9yD4CPYuTd8BbSPkfk4DAALV9AgACgZOHwFtI1WqTlmDAALUQwAFpfwA9jJOlwFtJBxyTtYKTsMBbSOKAvgEAARaTzGqTv2DAAP22wAFqYGHAAP26AMAA/cxJk+Ack+mCk+TAW0jigdYBAAFqk/RgwAD9tsABamUAwAD9yD4CPYuUDcBbSPkflBbAALV9AgACgZQdwFtI1WqULGDAALUQwAFpmQA9jJQ9wFtJBxyUTYKUSMBbSOKAvgEAARaUZmqUV2DAAP22wAFqZWHAAP26AMAA/cxJlHoclIOClH7AW0jigdYBAAFqlI5gwAD9tsABamoAwAD9yD4CPYuUpsBbSPkflK/AALV9AgACgZS2wFtI1WqUxWDAALUQwAFpswA9jJTVwFtJBxyU5YKU4MBbSOKAvgEAARaU/WqU72DAAP22wAFqamHAAP26AMAA/cxJlREclRqClRXAW0jigdYBAAFqlSVgwAD9tsABam8AwAD9yD4CPYuVPsBbSPkflUfAALV9AgACgZVOwFtI1WqVXWDAALUQwAFpzQA9jJVuwFtJBxyVfoKVecBbSOKAvgEAARaVl2qViGDAAP22wAFqb2HAAP26AMAA/cxJlasclbSCla/AW0jigdYBAAFqlb9gwAD9tsABanQAwAD9yD4CPYuV1MBbSPkfld3AALV9AgACgZXkwFtI1WqV82DAALUQwAFp5wA9jJYAwFtJBxyWEIKWC8BbSOKAvgEAARaWJWqWGmDAAP22wAFqdGHAAP26AMAA/cxJljkclkKClj3AW0jigdYBAAFqlk1gwAD9tsABankAwAD9yD4CPYuWY8BbSPkflmzAALV9AgACgZZzwFtI1WqWgmDAALUQwAFqAQA9jJaQwFtJBxyWoIKWm8BbSOKAvgEAARaWtmqWqmDAAP22wAFqeWHAAP26AMAA/cw+Aj2LltLAW0j5H5bbwAC1fQIAAoGW4sBbSNVqlvFgwAC1EMABaUwAPYyW/sBbSQeClwnAW0jiPYyXMcBbSQccl0WElzzAW0kHguQCAAIel1TAAP1fAQABJ8AAbU4AJwAAwAD91kqXeAEfl4PAALVDAgACg5eLwFtI+YSXj8BbSQcAAABbRE8AW0TTAFtFjgBbReAAW0ioAFtQqAAAAAUCwAC1RIH/l7+XxZvpA8AAbU8AAAFgwAD9HAABYMAAtSUDBMAAtUaB/5ftl/YJhnQAYMAA/bYABMAAtUeB/5gHmBEJpxsAYMAA/bYABMAAtUiB/5gsmDQJtH4BapgWYMAA/RwCYMAA+goAAQXAALVUgf+ZiZmJmdMAlUkAA5mamdMAAAADAQGZoAAABKcbYMAA/bYAApmyAAAEhnRgwAD9tgFqAGDAAPzZd5nCAAAEtH5gwAD6CgFqmcxgwAD6CgBgwAC1RAE/BAgBwAC1R4AAwFtRTAgBwAC1RoEAwFtRWggBwAC1SIIAwFtRbwkBmYnAAP0yAAAAAAcGwAC1SoH/mDmYQZmEBAEAAAAAAQOYSZmEAAAAAgEBmFEAAACBsGDAAP22AAGYXQAAALR+YMAA+goBaphnYMAA+goAYMAAtUQBPgJOmHmYgAAAwABtImDAAPvQARyYh4CYgsBbUd2AuwEAASeBagDAAP3JSZiZIRyYpIKYncBbUgpIAQABHJinlIHEAAAAAMAA+/MAwAD88z4BSpizAR+YvsAAtVQDAAEcmNWAmNDAW1HdgL4BAAEcmOaCmN/AW1IKZAEAAZQAwAD89QDAAP3MAoZ0HJkGgJkBwFtR3YC+AgACk4KZE8BbUgoAwAD9zLR+gZkmwFtR6z4BSplEAR+ZT8AAtVQCAAGAmWHAW1HdAbR+gZlxwFtR6wbAALVMgf+Z2JnsmioBAIPBAWqZ2WDAAP0cAgAAAQOZ9ZoqAAAAAAAAAGDAAPvQAUqZ+AEcmhAcmgsWmgIWmfguhnTAALVGg8HAAP27g4gBAAE3DQDAAPz3ZAEAARyaJhaaHRaaEi6nG8AAtUeDwcAA/buDiAEAATcRAMAA/PcAwAD89QbAALVRgf+aL5pJmvkDAEgBapowYMAA/RwCAAABA5pLmvkAAAABAQGaTAAAAIPWWwAAYMAA+goBPgNJmlkeml3AAPWxAgACLoCabcBbU4MASpp1ASk/SZqGISWakICaisBbU4NgwAC1REqangEqP0qasAEiHJrBFpq3LoZ0wAC1RkgBAAEWmsqAmsTAW1ODhnQAAMAA/cUAHJriFprXLqcbwAC1R0gBAAEWmuuAmuXAW1ODpxsAAMAA/cUGwAC1TYH/mv6bFZsqAQCCZwFqmv9gwAD9HAIAAAEDmxqbKgAAAAAAAABgwAC1EAFKmx0BapskYMAAtRDAAWkBBsAAtU6B/5svmzqbewEAgL0AAAABA5s/m3sAAAAAAAAAYMAA/bYBSptCASMhHJtMFptCLoZ0wAC1RkgBAAErAMAA/cUkm28DFptYLoZ0wAC1RieBahabYy6nG8AAtUcWm3EupxvAALVHAWDAAP22BsAAtU+B/5uAm5ebswEAwABs4AFqm4FgwAD9HAIAAAEDm6KbswAAAAAAAABgwAD9tgFKm6UBJJuzAifAAG1QFpuuLoC9wAC1TgbAALVSgf+buJvLm+cAACMBapu5YMAA/RwCAAABA5vTm+cAAAAAAAAAYMAA/bYBSpvZASSb5wInwABtURab4i6AvcAAtU4AAFtRvgBbUtcAW1NbAFtUFgBbVFYAW1TFAFtVDgBbVVQAAAAHAsAAtVWB/5wAnAaeMAPAAG1SAAABYMAA/RwAAWDAALUlAgTAALVXgf+cLZw2CYZ0AGDAAP22AATAALVYgf+cUZxZCbR+AWqcO2DAAP0cAmDAAPoKAAEFwAC1YoH/nF6cXpyNAAAAA5xlnI0AAAACAQGcawAABIZ0YMAA/bYAAZx8AAAEtH5gwAD6CgFqnIZgwAD6CgBgwAC1VQE/AwgBwAC1V4AAwFtV6ggBwAC1WIEAwFtV+AkBnF7AAP0yAAAAAAYGwAC1WoH/nJKcppzJAQCDwQFqnJNgwAD9HAIAAAEDnK+cyQAAAAAAAABgwAD70AFKnLIBHJzFFpy8FpyyLoZ0wAC1V4PBwAD9u4OIAQABNw0AwAD89wbAALVfgf+czpzonXUDAEgBapzPYMAA/RwCAAABA5zqnXUAAAABAQGc6wAAAIPWWwAAYMAA+goBPgNJnPgenPzAAPWxAgACLoCdDMBbVrkASp0UASk/SZ0lISWdL4CdKcBbVrlgwAC1VUqdPAEqP0qdTgEcnV8WnVUuhnTAALVXSAEAARadaICdYsBbVrmGdAAAwAD9xQbAALVbgf+dep2RnaMBAIJnAWqde2DAAP0cAgAAAQOdlp2jAAAAAAAAAGDAALUQAUqdmQFqnaBgwAC1EMABaRoGwAC1XIH/naids53EAQCAvQAAAAEDnbidxAAAAAAAAABgwAD9tgFKnbsBFp27LoZ0wAC1VwbAALVdgf+dyZ3gnfsBAMAAbOABap3KYMAA/RwCAAABA53rnfsAAAAAAAAAYMAA/bYBSp3uASSd+wInre8WnfYugL3AALVcBsAAtWCB/54AnhOeLgAAIwFqngFgwAD9HAIAAAEDnhueLgAAAAAAAABgwAD9tgFKniEBJJ4uAifAAG1TFp4pLoC9wAC1XAAAW1Y7AFtWkQBbVycAW1dnAFtXnABbV+MAW1gpAAAABgLAALVjgf+eSZ5PoJkDwABtVAAAAWDAAP0cAAFgwAC1JQEEwAC1ZYH/nnWeeAmArABgwAD+NwABBcAAtXCB/559nn2ekAAAAAOehp6QAAAAAQEBnowAAASArGDAAP43AABgwAC1YwE/AggBwAC1ZYAAwFtYnQkBnn3AAP0yAAAAAAcGwAC1Z4H/ntOe6J75AQC0fgFqntRgwAD9HAIAAAEDnvGe+QAAAAAAAABgwAD6CgFKnvQBKgbAALVogf+e/p8Sny8BAIPBAWqe/2DAAP0cAgAAAQOfG58vAAAAAAAAAGDAAPvQAUqfHgEcnysWnyIWnx4ugKzAALVlg8HAAP5Sg4gBAAE3DQDAAPz3BsAAtW2B/580n06f0QMASAFqnzVgwAD9HAIAAAEDn1Cf0QAAAAEBAZ9RAAAAg9ZbAABgwAD6CgE+A0mfXh6fYsAA9bECAAIugJ9ywFtZfwBKn3oBKT9Jn4shJZ+VgJ+PwFtZf2DAALVjSp+kASo/Sp+2ARyfwRafvS6ArMAAtWVIAQABFp/KgJ/EwFtZf4CsAADAAP5eBsAAtWmB/5/Wn+2gAwEAgmcBap/XYMAA/RwCAAABA5/yoAMAAAAAAAAAYMAAtRABSp/1AWqf/GDAALUQwAFpMwbAALVqgf+gCKAToCkBAIC9AAAAAQOgGKApAAAAAAAAAGDAAP22AUqgGwEcoB8WoBsugKzAALVlIwAAAADAAP5fBsAAtWuB/6AuoEWgYgEAwABs4AFqoC9gwAD9HAIAAAEDoFCgYgAAAAAAAABgwAD9tgFKoFMBJKBiAifAAG1VFqBdLoC9wAC1agbAALVugf+gZ6B6oJcAACMBaqBoYMAA/RwCAAABA6CCoJcAAAAAAAAAYMAA/bYBSqCIASSglwInwABtVhagki6AvcAAtWoAAFtYzABbWQEAW1lXAFtZ7QBbWi0AW1puAFtatwBbWv0AAAAHAsAAtXGB/6DZoN+i+APAAG1XAAABYMAA/RwAAWDAALUlAgTAALVzgf+hAqEHCYCWAGDAAPvQAATAALV0gf+hJKEoCYJnAWqhDGDAAP0cAmDAALUQAAEFwAC1fYH/oS2hM6FQAQAAA6E5oVAAAAACAgKhPwAABICWYMAA+9AAoUsAAASCZ2DAALUQAABgwAC1cQE/AwgBwAC1c4AAwFtbkwgBwAC1dIEAwFtboAkBoTPAAP0yAAAAAAUGwAC1doH/oVWhaqF7AQC0fgFqoVZgwAD9HAIAAAEDoXOhewAAAAAAAABgwAD6CgFKoXYBKgbAALV3gf+hgKGUocgBAIPBAWqhgWDAAP0cAgAAAQOhnaHIAAAAAAAAAGDAAPvQAUqhoAEcobQcoa8WoaYWoaAugJbAALVzg8HAAP0Ug4gBAAE3DQDAAPz3ZAEAARyhxBahuxahti6CZ8AAtXSDwcAA/S+DiAEAATcRAMAA/PcAwAD89QbAALV6gf+hzaHnooEDAEgBaqHOYMAA/RwCAAABA6HpooEAAAABAQGh6gAAAIPWWwAAYMAA+goBPgNJofceofvAAPWxAgACLoCiC8BbXLwASqITASk/SaIkISWiLoCiKMBbXLxgwAC1cUqiOgEqP0qiTAEiHKJZFqJTLoCWwAC1c0gBAAEWomKAolzAW1y8gJYAAMAA/PMAHKJwFqJrLoJnwAC1dEgBAAEWonmAonPAW1y8gmcAAMAA/SkGwAC1eIH/ooainaLCAQDAAGzgAWqih2DAAP0cAgAAAQOiqKLCAAAAAAAAAGDAAP22AUqiqwEkosIFJ8AAbVgWorQugJbAALVzJ4NJFqK8LoJnwAC1dCeDIQbAALV7gf+ix6LaovYAACMBaqLIYMAA/RwCAAABA6LiovYAAAAAAAAAYMAA/bYBSqLoASSi9gMWouougmfAALV0J4LmFqLwLoCWwAC1cwAAW1vbAFtcEABbXJQAW11PAFtdqABbXfYAAAAFAsAAtX6B/6L7owGlMAPAAG1ZAAEAAIJ2YMAA/RwBWwFgwAD9HAAABQTAALWAgf+jHKMeCbNVAGDAALUlAATAALWBgf+jKqMvCYCWAF8AAAAEwAC1goH/oz2jQAmArABgwAD+NwAEwAC1hIH/o06jVQnAAG1awAC1DwBgwAD70AAEwAC1hYH/o2ajbAmDwABgwAD9HAABBcAAtYyB/6Nxo3GjtQAAAAOje6O1AAAABQUFo4EAAASzVWDAALUlAKOKAAAEgJZfAAAAo5YAAASArGDAAP43AKOgAAAEwABtWmDAAPvQAKOuAAAEg8BgwAD9HAAAXcAAtX4BXwAAAT8GCAHAALWAgADAW17ECAHAALWBgQDAW17RCAHAALWCggDAW17cCAHAALWEgwDAW17pCAHAALWFhADAW174CQGjccAA/TIAAAAAAwbAALWHgf+juqPCpEMBAINcAAAAAQOjyaRDAAAAAAAAAGDAAPvQAT4BSaPPJaPWFqPTLrNVwAC1gGDAALVxPgJOo/Cj9wAAwABkXWDAALVxASaj8AEWo/kus1XAALWAYMAAtXFKpAMBFqQRgKQKwFtfnICWwAC1cz4BSqQrARakMi7AAG1awAC1D8AAtYQGwAC1iIH/pEikU6SzAQDAAGzjAAAAAQOkXqSzAAAAAAAAAGDAAP22AT4BSqRkASSkrwUnwABtWxykgCSkfwEWpHgug8DAALWFguQCAAIngK8nAADAAP3WJ8AAbVwWpKEWpJoug8DAALWFhYDAAP0wJ4MhBsAAtYqB/6S4pMulLgAAIwFqpLlgwAD9HAIAAAEDpNOlLgAAAAAAAABgwAD9tgFKpNkBJAAMJ8AAbV0WpOkus1XAALWAJ6+QFqTzLoCWwAC1gSfAAG1eFqT+LoCswAC1gieApye26RalEy6DXMAAtYcnwABtXxalIi7AAGzjwAC1iCeDIQAAW19bAFtf6QBbYFwAW2DhAAAAAwLAALWNgf+lM6VCqLAHwABtYAABAACCdmDAAP0cAVsBYMAA/RwAAAABBcAAtZUAAAAABAAAAwAAAAAAAAAAAF3AALWNAV8AAAE/AQkBAMAA/TIAAAAABAbAALWPgf+lVqVxpXoBAsAAbJcAAAABA6V6pXoAAAAAAAAAXcAA/KUCYMAAtSVdwAC1fgFfAAAABsAAtZGB/6Xhpean+gAAwABtYQAAAAEDpfOn+gAAAAUFBaX4AAAAgKxgwAD+NwCmAQAAAINcYMAA+9AApgwAAACzVWDAALUlAKYSAAAggJZfAAAApiAAAACDwGDAAP0cAABcAT4CSaYuHKY8FqYyLsAAbJfAALWPh0EBAAGCpkjAW2HBAMAA/Lg+BE6mY6ZwAADAAG1iXcAAtX4BXwAAARymexamci7AAGyXwAC1j0sBAAGCpnzAW2HBAMAA/Lk9HKaHLoHDAwADgKaOwFthp4Gmk8BbYbQkps0GJ8AAbWOCpqvAW2HBJ69/g6a3wFthzifAAG1khKbGwFth2QDAALWSPRym1i6BwwMAA4Cm6MBbYaeBpvfAW2G0JAAHJ8AAbWOCpxnAW2HBJ69/FqczhacmwFtiEYCWwAC1gSeBiyfAAG1lFqdehadRwFtiEYPAwAC1hQDAALWSPRynby6BwgEAASSnhwMnwABtY4Kng8BbYcEngWoAwAC1kz9Jp5QhHKeeg6eYwFthzkgBAAErAMAA/Sk+AT0cp7gWp68uwABsl8AAtY+AvwIAAoKnucBbYcEfp8PAALWMBQFfAAAFgqfRwFthwYOn1cBbYc6Ap9zAW2GngafhwFthtISn6cBbYdkAAMAA/Lo/BsAAtZKB/6goqC2oWAACgcMAAAABA6gzqFgAAAADAwOoOAAAAICsYMAA/jcAqEEAAACDXGDAAPvQAKhQAAAAImDAAP22AABcAAbAALWTgf+olaiaqK4AAoHCAAAAAQOonqiuAAAAAQEBqKYAAAAiYMAA/bYAAFwAAABbYU0AW2GFAFtjbgBbY7cAW2PmAAAABAAAAYH/AFtkAQBbPt4AW0FPAFtCIwBbUMUAW1V5AFtYSgBbWyIAW14TAFtg9gBbY/8AAAAJAFtkAQAAAAAAAADAALWWAIIAAAACgNoAAMAAmqQAAIEHAADAALYKAAAAAAABAsAAtZeCAIFwgXaDtQPAAG1mAAABYMAA/RwAAAEEwAC1mYIAgcCBxQmENABdwAD8dAFgwAD70AABBcAAtaCCAIHKgcqB3AAAAAOB0IHcAAAAAQEBgdYAAASENF3AAPx0AWDAAPvQAABgwAC1lwE/AggBwAC1mYAAwFtktQkBgcrAAP0yAAAAAAMGwAC1m4IAgoWCn4L7AwBIAWqChmDAAP0cAgAAAQOCoYL7AAAAAQEBgqkAAACD1mDAAP0cAABgwAD6CgFKgrkBIiWCv4CCucBbZRJgwAC1lwAcguFqgtJdwACwTQFbwAFqfpWgAgACFoLoLoQ0wAC1mRaC9RSC78BbZRIAAWDAALWXhDTAALWZAMAAsFIGwAC1noIAgwCDFINAAQCDwQFqgwFgwAD9HAIAAAEDgx2DQAAAAAAAAABgwAD70AFKgyABHIM1aoMmXcAAsE0BW8ABan6DyAEAARaDOi6ENMAAtZkAwACwUwbAALWcggCDgYOUg7MAACMBaoOCYMAA/RwCAAABA4Ocg7MAAAAAAAAAYMAA/bYBSoOiARyDpmqDomDAALZZwAFqjpVEAQABFoOtLoQ0wAC1mQDAAMcxAABbZOoAW2V3AFtl0ABbZiYAAAADAAABggAAW2Y9AFtkYQBbZjsAAAABAFtmPQAAAAAAAADAALWhAIIBAAADgNoAAMAAxMMAAIDyAADAALWWAACBCAAAwAC2CwAAAAAAAQLAALWiggGCCYIYhEIHwABtZwAAAV3AAMdOAl3AAPx0AWDAAPvQYMAAtZcAAAABBcAAtamCAYMKgxCDFgEAAAODFIMWAAAAAAAAAGDAALWiAT8BCQGDEMAAx1cAAAAAAwbAALWkggGC9IL8gwUBAsAAbWgAAAABA4MFgwUAAAAAAAAAYMAA+9AABsAAtaaCAYMbgy6D8wAAiLgBaoMcYMAA/RwCAAABA4M1g/MAAAABAQGDQAAAIBJdwAD8dAFgwAD70AAAYMAAtZcBPgVOg1CDWgAAwABtaWDAALYMAR+DYMAAthYAAAAAToN2g4AAAMAAbWpgwADG5gEcg4IutC8BAAGBg5nAW2dVAMAAtac9HIOzgoOpwFtncVYBAAGAg7fAW2c5AMAAxxY9HIPMgoPCwFtncYKIAAAAAMAAxxdKg9kBFoPqgYPgwFtnVYCWwAC2EQbAALWnggGD+IQXhEAAArQvAWqD+WDAAP0cAgAAAQOELYRAAAAAAQEBhDsAACCEO13AAP2EAWDAALWXAABgwADG5gAAAFtm5wBbZxAAW2faAFtoHQAAAAMAAAGCAQBbaDQAW2aHAFtoMgAAAAEAW2g0AAAAAAAAAMAAtaoAggIAAAWA2gAAwADEwwAAgPEAAMAA03YAAIEMAADAALWWAACBIgAAwAC2CwAAgT0AAMAAtaEAAAAAAAICwAC1q4ICgkSCSoaRA8AAbWsAAAFdwADHTgJdwAD8dAFgwAD70GDAALWXAAACBMAAta6CAoLGgssJwABlgcAAtaoAYMAAtaIABMAAta+CAoMcgyAJlwXAALWqAGDAAOLzAAEFwAC1tIICg8eDx4U7AAAAA4PLhTsAAAACAgKD0QAAAIPIYMAAtaIAg+EAAACD0V3AAPx0AWDAAPvQAABgwAC1qwE+AkmEcxyEghaEe4GEd8BbaR1hwAD8o4CXAQABFoSKFoSELsAAZYHAALWqwAC1rsAAbWjAALWkAMAA/P89iYSVwFtpHRaErhyEoRaEmy7AAGWBwAC1qsAAta6IuAEAAYGEqcBbaR0AwAC1poQ0wAC1mT89HIUbFoUWLpcFwAC1qsAAta+DXgMAA5MWhSuBhSfAW2kdYcAA/KOBhTPAW2kdAMAA/JkDCADAALWugIP2wFtpEAgAwAC1rx6ED8AA4vcBAAEWhB6AhBnAW2kQwABtaMAAtaQACQGDx8AAx1cAAAAAAgbAALWxggKFQIVThhgAAIi4AWqFQWDAAP0cAgAAAQOFWoYYAAAAAQEBhWUAACASXcAA/HQBYMAA+9AAAGDAALWXAT4FToV1hX8AAMAAbWlgwAC2DAEfhYXAALYWAAAAAE6Fm4WlAADAAG1qYMAAxuYBHIWnLrQvAQABgYW+wFtqXwDAALWyPRyF2IKFzsBbantWAQABgIXcwFtqQwDAAMcWPRyF8YKF58BbanuCiAAAAADAAMcXSoX+ARaGD4GGBcBbal+AlsAAthEGwAC1soIChh2GPIaPAAC0LwFqhh5gwAD9HAIAAAEDhlKGjwAAAAEBAYZgAAAghDtdwAD9hAFgwAC1lwAAYMAAxuYBSoZvAR+Gc8AAtcEDAAOAhn3AW2sNFoaDLsAAZYHAALWqwAC1rhaGii6XBcAAtarAALWvAAAAW2oaAFtq5ABba1sAAAACAsAAtbWCAobLhtGMZAPAAG1sAAABYMAAxuYAAAQEwAC1uIICh0KHTAnAAG1twAC1qgBgwADG5gAEwAC1uYICh6eHygnAAG1uwAC1qgBgwAC2DAEfh77AALYWAAAAAATAALW6ggKIEYgbGMAAbW/AALWqAGDAAMbmASsEwAC1u4ICiEyIXRjAAG1wwAC1qgBgwAD6CgEqAQXAALXBggKIYohiimcAAAADiGuKZwAAAAMDA4h5AAAAhDtdwAD9hAFgwAC1lwCIhAAAAIPIYMAAtaIAiJQAAACD0V3AAPx0AWDAAPvQAABgwAC1tQE+Bj0XiNYuwABtb8AAtaociOiBiOPAW2wxtC8BAAEWiP8uwABtbsAAtarAALW5AMAAtafAALW6Tok5iUEAAJaYYMAA4vMBHolHwADi9wEAARaJVYKJUcBbbD5hwAD8owBFiWIBiWuJbQAAYmDAAPvQAZMBHIl0hIlywFtsvGMBAAEWiX6DiXbAW2yQYcAA/KMAwAD8/QGMiYbAW2y8HImHhImGwFtsvGQBAAGUAMAA/PU+AT0ciZqDiZPAW2yQgL8CAAKEiZvAW2y8HImlN1yDuwEAARyJqoKJp8BbbD5LAQABhImrwFtsvADAAPyDAMAA++oAwAD8hD0cicQWibkuwABtbcAAtarAALW4VgEAAYOJyMBbbJAAwADHFkWJ9QGJ/ooAAABiYMAA+9ABkwEcigeEigXAW214YwEAARaKEYOKCcBbbJBhwAD8owDAAPz9AYyKGcBbbXgcihqEihnAW214ZAEAAZQAwAD89T4BPRyKLYOKJsBbbJCAvwIAAoSKLsBbbXgcijg3NoO7AQABHIo9goo6wFtsPksBAAGEij7AW214AMAA/IMAwAD76gDAAPyEPRyKVxaKTC7AAG1vwAC1qsAAtbpWAQABg4pbwFtskADAAMcWAggAwAC1uByIs4GIrsBbbDG0LwEAAYCIysBbbB4AwAC1pwkBiGLAAMbwAAAAAAMGwAC1vYICimyKfYrqAABWAWqKbWDAAP0cAgAAAQOKgIrqAAAAAQEBiosAACASXcAA/HQBYMAA+9AAAFwBPgJJipcWipsuwABtcMAAtarAALW7PTCKph+KsMAA+3ABAAEnwABtcQA/PRyK3RaK0i7AAG1vwAC1qsAAtbpWAQABgIrhwFtuhwDAAMcWBsAAtb6CAorviwCLrAAAwABtcgFqivBgwAD9HAIAAAEDiwiLrAAAAAQEBIsTAAAAEl3AAPx0AWDAAPvQAIsdAAAAamDAAPvQAIsoAAAAgoxgwAD70ACLMgAAAMAAbXNgwAD6CgAAXAE+AkmLQBaLRC7AAG1wwAC1qsAAtbs9MItPH4tZwAD7cAEAASfAAG1xAD89HIuGFot7LsAAbW/AALWqwAC1usAAbXIEAASAi4/AW28VgYuVwFtvJ4KLnMBbbzODi6HAW29AAMAAxu4GwAC1v4ICi7GLwoxiAACCiAFqi7JgwAD9HAIAAAEDi8eMYgAAAAAAAABcAT4FSYvQFovULsAAbXDAALWqwAC1u0qL3wA/PReL6y7AAG1wwAC1qinAALW7PRyMDRaMAi7AAG1vwAC1qsAAtbqCiAAAAADAAMcXPRyMJRaMGi7AAG1twAC1qsAAtbhWAQABFoxAFow6FowpLsAAbW7AALWqwAC1uYCWwAC2EYQ0wAC1mQDAAMcWPRyMVxaMTC7AAG1twAC1qsAAtbiCiAAAAADAAMcXAABbbl8AW27qAFtvuABbcIsAAAADAAABggIAW3CiAFtokgBba2wAW3CgAAAAAgBbcKIAAAAAAAAAwAC1wgCCAwAABoDaAADAAMTDAACA8QAAwADTdgAAgQwAAMAAtZYAAIEiAADAALWhAACBNgAAwAC2FwAAgU8AAMAAti8AAAAAAAICwAC1yIIDg9SD2oS2A8AAbXQAAAFgwAC1ogAAAQTAALXKggOEBYQiCcAAbWgBaoPwYMAA/RwCYMAA+9ABHIQUNxCDiAEAAWqEFmDAAPvQgVUAwAD89wEFwAC1z4IDhCeEJ4QuAIC1wAC1wgADhCyELgAAAAAAAABgwAC1yAE/AQkBhCfAALWpAAAAAAEGwAC1zIIDhDOEUoS0AAC0LwFqhDRgwAD9HAIAAAEDhGiEtAAAAAEBAYR2AAAghDtdwAD9hAFgwAC1lwAAYMAAxuYBSoSFAR+EicAAxwABAAEfhKXAALXWAQABgISuwFtxxAAAAABbcZsAW3H/AAAAAQLAALXQggOKI4opjtkDwABtdQAAAWDAALYYAAABBMAAtdKCA4pZinMJlWgBaopIYMAA/RwCYMAA4yEBHopmwADjJQEAAZcAAQXAALXWggOKeIp4izEAAAADioCLMQAAAAEBAYqOAAAAhDtdwAD9hAFgwAC1lwAAYMAAtdABPgQ9HIrJForDLpVowAC10oC/AgACkznAAG12AMAA/IQ9HIrlForfLpVowAC10oC/AgAClDnAAG13AMAA/IQ9HIsBFor7LpVowAC10oC/AgAClTnAAG14AMAA/IQ9HIsdFosXLpVowAC10oC/AgACljfQMlR2AMAA/IQBCQCKlsAAti4DAAKAipzAW3JvNxABwABteWqKtWDAAOLFwAFqlQEGwAC11IIDizaLR47XAADAAG16AWqLN2DAAP0cAgAAAQOLUY7XAAAAAQEBi10AAACrq2DAAOMhAABcAT4MQByLfhaLd4CLccBbc1VhwAD8o0gBAAE3EADAAPzzi3GLgwBOi4+LkQAAgdVgwAD70AEci5kWi5MulWjAALXSSwEAAZMAwAD8g06LpouoAACCSmDAAPvQARyLsBaLqi6VaMAAtdJLAQABlADAAPyDTou9i78AAID1YMAA+9ABHIvHFovBLpVowAC10ksBAAGVAMAA/INOi9SL1gAAlpZgwAD70AEci94Wi9gulWjAALXSSwEAAZYAwAD8g06L7AAAAINNYMAA+9AATov3AAAAgaZgwAD70ABFi/8BjAiMCgAAYmDAAPvQAZMBHIwRh4wPwFt0QmMBAAE3QADAAPz9AY+MF8BbdEIcjBiHjBfAW3RCZAEAAZQAwAD89T4GSYwkHIwqh4wowFt0QmMBAAE3EADAAPz9PgI9jYw6wFt0IxyMRhyMQYKMP8Bbc7GDdwEAAYOMQ8Bbc9cAwAD76IEGAQABHIxXHIxNHIxKgoxLwFtzsYSGAAAAAMAA++uDdwEAAWqMT2DAAPvQwAFqoQDAAPvog3cBAAGEjFnAW3P9AMAA++gAwAD76T2OjGXAW3Qxh4xpwFt0QkmMeRyMf4eMfcBbdEJjAQABNyAAwAD8/T4CPY2Mj8BbdCMcjJscjJaEjJTAW3P9g3cBAAGCjJjAW3OxAMAA++iBBgEAARyMrByMohyMn4SMoMBbc/2EhgAAAADAAPvrg3cBAAFqjKRgwAD70MABaqEAwAD76IN3AQABg4yuwFtz1wDAAPvoAMAA++k9joy6wFt0MRyMzByMxxyMwjcFg4gBAAGHjMTAW3RCAMAA/PdkAQABlADAAPz1la4BAAE3EADAAPz4SYzfHIzlh4zjwFt0QmMBAAE3MADAAPz9PgI9jYz1wFt0IxyM/xyM+4KM+cBbc7GDuwEAAYOM/cBbc9cAwAD76oO7AQABhI0BwFtz/QDAAPvqPY6NDMBbdDEcjR4cjRkcjRSWg4gBAAGHjRbAW3RCAMAA/PdkAQABNwUAwAD89ZWuAQABNxAAwAD8+D4CPY2NO8BbdCMcjUGDjT/AW3PXg7sBAAEcjUaCjUTAW3OxgQYBAAEcjUwcjUmEjUrAW3P9hIYAAAAAwAD764N3AQABao1OYMAA+9DAAWqhAMAA++gAwAD76QDAAPvqPY6NYMBbdDEcjWwcjWc3B4OIAQABh41pwFt0QgDAAPz3la4BAAE3EADAAPz4To2FjYoAAL5QYMAA+9ABhI2MwFtz/T2MjZXAW3P9g42ZwFtz1z2LjaLAW3PXgo2mwFtzsT2Kja/AW3OxHo2zwAC2NQIAAoKNxMBbc7EejdHAALY2AgACHo3YwAC2NQIAAh6N3sAAtjUCAAKBjeTAW3OLhY3nwFt0IwAejevAALY1AgACHI33ao3xXcAA/HQBYMAA+9DAAWwnSwEAAYeN+MBbdEIAwAD8gxyOAYCN/MBbc1VLAQABho4CwFt0MQDAAPyDAAAcjiNqjhZdwAD8dAFgwAD70MABbS5LAQABh44kwFt0QgDAAPyDAAA9iY4wwFtzixSONMBbdvsIAD0cjksWjkUulWjAALXSgL8CAAKTHo5RwAC2NQIAAoGOV8Bbc4scjmAWjloulWjAALXSSwEAAZMAwAD8gwAAwAD8hD0cjnAWjmoulWjAALXSgL8CAAKUHo52wAC2NQIAAoKOfMBbc7EcjoUWjn8ulWjAALXSSwEAAZQAwAD8gwAAwAD8hD0cjpUWjo8ulWjAALXSgL8CAAKVHo6bwAC2NQIAAoOOocBbc9ccjqoWjqQulWjAALXSSwEAAZUAwAD8gwAAwAD8hD0cjroWjrQulWjAALXSgL8CAAKWHo7AwAC2NQIAAoSOxsBbc/0cjs8WjskulWjAALXSSwEAAZYAwAD8gwAAwAD8hAAAW3MqAFt4/wAAAAEDBMAAtcSCA4J/gpAFwABtswBgwAC1yAEfgonAALXPAAAAAATAALXGggOFGohEBsAAbbTAALXCAF3AAPx0AWDAAPvQAWqFI13AAPx0AWDAAPvQwAFsJwTAALXHggOIaomNBsAAbbXAALXCAF3AAPx0AWDAAPvQAWqIel3AAPx0AWDAAPvQwAFtLgABggMAW3mWAFtxDgBbcgwAW3kMAAAAAgBbeZYAAAAAAAAAwAC11wCCBAAABoDaAADAAMTDAACA8QAAwADTdgAAgQwAAMAAtZYAAIEiAADAALWhAACBNgAAwAC2FwAAgU8AAMAAti8AAAAAAAICwAC12oIEgo2Ck4NyA8AAbbYAAAFgwAC1ogAAAQTAALXcggSCv4LcCcAAbWgBaoKqYMAA/RwCYMAA+9ABHILONxCDiAEAAWqC0GDAAPvQgVUAwAD89wEFwAC14YIEguGC4YLpAIC1wAC11wADgueC6QAAAAAAAABgwAC12gE/AQkBguHAALWpAAAAAAEGwAC13oIEgu6DDYNwAAC0LwFqgu9gwAD9HAIAAAEDgyODcAAAAAEBAYMxAAAghDtdwAD9hAFgwAC1lwAAYMAAxuYBSoNAAR+DRMAAxwABAAEfg2DAALXqAQABgINqwFt6uAAAAABbeo8AW3rzAAAAAQLAALXiggSECoQQiuoDwABttwAAAWDAALYYAAACBMAAteSCBIRBhFsJlWgBaoQwYMAA/RwCYMAA4yEBHoROwADjJQEAATcFAATAALXmggSFO4VECcAAbbjAALXXAGDAAOMhAAEFwAC16oIEhUmFSYY2AAAAA4VShjYAAAABAQGFYAAAAIQ7XcAA/YQBYMAAtZcAAGDAALXiAT4FPRyFshaFrC6VaMAAteSAvwIAApM5wABtdgDAAPyEPRyFzhaFyC6VaMAAteSAvwIAApQ5wABtdwDAAPyEPRyF6haF5C6VaMAAteSAvwIAApU5wABteADAAPyEPRyGBhaGAC6VaMAAteSAvwIAApY30DJUdgDAAPyEPRyGIhaGHC6VaMAAteSAvwIAApc5wABtuQDAAPyEAggAwAC15h6FfsAA4yUBAAE3UAAJAIWWwAC2LgIAAoCFnMBbe383EAABBsAAteiCBIY7hkyK6AAAwABtegFqhjxgwAD9HAIAAAEDhlaK6AAAAAEBAYZiAAAAq6tgwADjIQAAXAE+DEAchoMWhnyAhnbAW3yGYcAA/KNIAQABNxAAwAD884Z2hogAToaUhpYAAIHVYMAA+9ABHIaeFoaYLpVowAC15EsBAAGTAMAA/INOhquGrQAAgkpgwAD70AEchrUWhq8ulWjAALXkSwEAAZQAwAD8g06GwobEAACA9WDAAPvQARyGzBaGxi6VaMAAteRLAQABlQDAAPyDTobZhtsAAJaWYMAA+9ABHIbjFobdLpVowAC15EsBAAGWAMAA/INOhvCG8gAAg01gwAD70AEchvoWhvQulWjAALXkSwEAAZcAwAD8g0WHBAGHDYcPAABiYMAA+9ABkwEchxaGhxTAW319YwEAATdQAMAA/P0BjoccwFt9fRyHHYaHHMBbfX1kAQABlADAAPz1PghJhykchy+Ghy3AW319YwEAATcQAMAA/P0+AT0ch0gWhz8uwABtuMAAtdfAALXmgL8CAAKGh0nAW319HIdTgIdOwFt8hksBAAGGh1TAW319AMAA/IMAwAD8hD4BPRyHeBaHby7AAG24wAC118AAteaAvwIAAoaHecBbfX0eh37AALY2AgACHIfqHIfGHIejHIebFoeSLsAAbbjAALXXwAC15ksBAAEch56Gh5zAW319gY0BAAGWAMAA/PYAwAD8g4O7AQABHIe+Foe1LsAAbbjAALXXwAC15ksBAAEch8GGh7/AW319gY0BAAE3CADAAPz2AMAA/IMAwAD76oO7AQABHIfhFofYLsAAbbjAALXXwAC15ksBAAEch+SGh+LAW319gY0BAAE3DgDAAPz2AMAA/IMAwAD76oO7AQABHIgFFof8LsAAbbjAALXXwAC15ksBAAEciAiGiAbAW319gY0BAAE3EADAAPz2AMAA/IMAwAD76pQAAMAA/IROiDKINwAAwABtumDAAPvQAR6IOcAAtjUCAAIeiD/AALY1AgACHohFwAC2NgIAAoGITMBbfLw3BQCFiFPAW31UAByIYBaIVy7AAG24wAC118AAteZLAQABhohhwFt9fQDAAPyDAEmIbByIcoaIcMBbfX1jAQABNxQAwAD8/T4BPY+IgsBbfzoeiInAALY1AgACHoiPwAC2NQIAAoeIlcBbfzociKMciJ6CiJzAW3zig3cBAAGDiKDAW30IAMAA++iBBgEAARyIqRyIpoKIp8BbfOKEhgAAAADAAPvrg3cBAAGEiKvAW30uAMAA++gAwAD76QA5wABtuwBJiMociNCGiM7AW319YwEAATcoAMAA/P0+AT2PiODAW386HojnwAC2NQIAAh6I7cAAtjUCAAKHiPPAW386HIkAHIj8goj6wFt84oO7AQABg4j+wFt9CADAAPvqg7sBAAGEiQLAW30uAMAA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AESgwFycnAABXcAAuRQBXwAALgAAwAC8/j4BPR7AAETRwAC5OQIAAhTAAETiwFycnAABXcAAuRQBXwAALgBKwABE/gA/PR7AAEVawAC5OAIAAoDAAEVuwFycnC4ABsAAuT+CF8AARYPAAEWIwABGRgAAwABvJMAAt4gAAAABA8AARZvAAEZGAAAAAgICwABFnAAAAIHFWwDAAEWuAAAAhj9gwAD9igAAXAE+A0AhFsAARcguwABvZ8AAt4jAALkmwABFx8AARdMAPRzAAEXbLsAAb27AALeIAAAAAMAAuS49HMAARfwWwABF9i7AAG9KwAC3iMAAuR7AAG91AQABNMAARg4DwABGDsAARkEAAAAAAAAAYMAA/NkBPgE9HMAARhkuwABvLMAAt4gCAAKAwABGKMBcne2BwABGL8BcnfgAwAC5PADAALz+BsAAuUCCF8AARsDAAEbMwABfbQABwABvfcAAt4gAAAABA8AARuHAAF9tAAAAAgICwABG6gAAAINEXcAAuRQBWwDAAEcCAAAAwABQIV3AALjtAltbAABcAT4BQ8AARxMpQT4NQBbAAEc2gMAARy/AXJ7awABvZ8AAt4jAALkmwABHL8AAR0EATsAAR0/AAEdYAADAAG9+YMAA+goBFsAAR2GAwABHWsBcntrAAG9owAC3iMAAuSdJwABHchzAAEeAgcAAR3bAXJ7rSAEAASsAwAD9KT4CScAAR5OCwABHl8BcnzI+Ak7AAEe4wABHwwAAwABvV2DAALyWARbAAEfMgMAAR8XAXJ7awABvcMAAt4jAALkoPRzAAEf6FsAAR+WAwABH3sBcntrAAG9KwAC3iMAAuR7AAG9/AgACFsAASBmDwABIDsBcn5CBxcAAvJgWwABIK4PAAEggwFyfkIY/wAC8mQDAALzrP0rAAEhKAD9DwABJJyEcwABJRhbAAEk4gcAASS7AXJ7rwABvScAAt4jAALj6SAEAASsAwAD9KT4ETsAASWnAAElyAACob13AALjtAltbAYHAAEl0wFye6z2JwABJh8BcnusWwABJnIPAAEmTwFygTMAAb0nAALeIwAC4+j0XwABJvIPAAEmzwFygTMAAb0nAALeIK8AAuPo9HsAASdrAALlAAgACgMAASfDAXJ7ag8AASfjAXKBMAE7AAEohwABKKgAAqG9dwAC47QJbWwGBwABK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wFzvAMAAbyLAALeIwAC5OhbAAM3UgsAAzc3AXO8AwABvLMAAt4jAALk8AErAAM3zAD89MMAAzhUewADOMMAAzfIAAAAAAQHAAM5JWwHAAM5QAAABg01bAAHAAM5TAAABiEFgwAD9igA+AT0ewADOZMAAt8oDAAOCwADOf8Bc7wCGwADOh8Bc8g2HwADOisBc8hkAwABurinAALloSsAAzscBgsAAzs7AXO8ABsAAuYSCGcAA0TLAANE8wADT5QAAljMAAAABA8AA0UXAANPlAAAAAQEBwADRSgAAACdgwAD70AAAXcAAuKkBXwAAAT4HPR7AANFlwAD6/AIAAoDAANFywFzylScnAD0ewADRksAA+xICAAKAwADRo8Bc8pUnJwBOwADRw8AA0coAAIHcXcAAuRQBXwAAAR/AANHQwAC5RwABXwAAAABOwADR9QAAAIH4XcAAuZEBWwBOwADSC8AA0hgAAMAAb6pgwAD70AGTPYrAANIhwFzzChzAANI1LoH5BAABNMAA0kUDwADSRcAA0vgAAAABAQHAANJIAAAAgJZfAAAAAGDAAPzZAT4CScAA0lscwADSZYDAANJfwFzylUgBAAGDwADSaMBc8xwAwAD88z4CPR7AANKEwAC32gMAA4LAANKUwFzzCoHAANKiwFzy44TAANKqwFzzWgBKwADSvgA/PYvAANLcwFzzHBzAANLpg8AA0tzAXPMcZAEAAZQAwAD89QOB6xbAANMSgcAA0wvAXPLjwABvLMAAt4jAALk8g4k0wADTMgPAANMywADTsAAAAAAAAABgwAD82QE+AT0cwADTSIHAANNBwFzy48AAbyzAALeIAQABH8AA02rAAPsmBQAFgMAA03vAXPKVLicnK4PAANOXwFzzHAAAwAC5PMAAbq4pwAC5aErAANPUAYHAANPbwFzy4wbAALmFghnAANkJwADZE8AA400AAMAAbzYAAAABA8AA2RrAAONNAAAAAgEBwADZJAAAAMAAbzdgwAD6pgABwADZNQAAAMAAbzhhAV3AALmeAV8AAFwBagBgwAD82XddwAC5WAFfAAABPgxOwADZcwAAAMAAXhBdwAC6CAFfAAAATsAA2csAAACB+F3AALmRAV8AAABOwADZ4wAAAMAAb4lgwAC8iQBOwADZ8wAAAKRiYMAAvOEATsAA2gwAAADAAG82XgAA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A7zTvP8AAAABAQG86gAAIIH4XcAAuZEBXwAAAABdwAC4qQFbAUq8+wErAABdE+0AXRRVAF0UkQBdFM0AXRUSAAAABALAALoIghq9PL1LvekHwABvygABAACCdmDAAP0cAVsBYMAA/RwABF3AALngAV8AAF3AALn/AV8AAF3AALqdAV8AAF3AALqlAV8AAAABBcAAugoAAAAABAAAAwAAAAAAAAAAAF3AALoIAV8AAAE/AQkBAMAA/TIAAAAAAAAAXRWmAAAAAALAALoLghq+Zb50wABrqwfAAG/LAAEAAIJ2YMAA/RwBWwFgwAD9HAABXcAAuggBXwAADQTAALoOghrAAEDxwABBAwbAAG7rwAC3iABgwAD70AFqwABBAmDAAPvQCQTAALoPghrAAEFowABBfQbAAG/MwAC3iABgwAD70AFqwABBfGDAAPvQFQTAALoQghrAAEG5wABBzAbAAG/NwAC3iABgwAD70AFqwABBy2DAAPvQIQTAALoRghrAAEILwABCJwbAAG/OwAC3iABgwAD70AFqwABCJmDAAPvQUgTAALoSghrAAEPHwABD2AbAAG7swAC3iABgwAD70AFqwABD12DAAPvQgVUEwAC6E4IawABEpMAARLgGwABu7cAAt4gAYMAA+9ABasAARLdgwAD70IM+BMAAuhSCGsAARlvAAEZjGMAAb8/AALeIAFsBKwTAALoVghrAAEaWwABGrRjAAGNawAC3iABgwAD70AFqwABGn2DAAPvQCQTAALoWghrAAEgTwABIHhjAAG7xwAC3iABdwAC5FAFbASsEwAC6F4IawABINsAASD4YwABuygBeAAAAAAABV8AAt5EAXAAEwAC6GIIawABIVcAASFwYwABu8gBeAAAAAAABV8AAt5EAXAAEwAC6GYIawABIc8AASHsYwABuywBeAAAAAAABV8AAt5EAXAAEwAC6GoIawABImMAASKAYwABuzABeAAAAAAABV8AAt5IAWwABBcAAujuCGsAASKXAAEilwABI8QAAAAPAAEi2wABI8QAAAAQEBMAASLwAAATAAG7KXgAAAAAAAVfAALeRAFwAwABIywAABMAAbvJeAAAAAAABV8AAt5EAXADAAEjZAAAEwABuy14AAAAAAAFXwAC3kQBcAMAASOgAAATAAG7MXgAAAAAAAVfAALeSAFsAAF3AALoL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R26AwABHZcBddzrAAG8HwAC3iAEAARbAAEd4LoCWwAC7EADAALqoAABddw4AXXd/AAAAAQLAALsVghvAAEelwABHq8AASIgDwABwFwAAAV3AALsHAVsAAAIEwAC7F4IbwABH2cAAR94JgcUAWwAEwAC7GIIbwABH88AAR/0Jhj8AYMAA/YoAAQXAALscghvAAEgCwABIAsAASCwAAAADwABID8AASCwAAAACAgLAAEgVAAAEgcVbAMAASCEAAASGP2DAAP2KAABgwAC7FQE/AwgBwAC7F4AAwF14BQgBwAC7GIEAwF14EAkBwABIAsAAuw0AAAAAAQbAALsaghvAAEgwwABINcAASIYAAMAAcBUAAAABA8AASDzAAEiGAAAAAQEBwABITAAAIMAAcBJdwAC6pQFbAABcAT4BPRzAAEhlgMAASFzAXXh7wABvCcAAt4gCAAIWwABIcC6BxcAAuxcWwABIdy6GP8AAuxgAwAC6qQAAXXhPAF14ygAAAAECwAC7HYIbwABIqMAASK7AAEm2A8AAcBgAAAFgwAD9HAABXcAAuwcBWwABBcAAuyWCG8AASNjAAEjewABI7AEAAAPAAEjqwABI7AAAAAAAAABgwAC7HQE/AQkBwABI3sAA/TIAAAAAAwbAALsfghvAAEjwwABI9cAASTQAAMAAcBUAAAABA8AASPzAAEk0AAAAAQEBwABJDAAAIMAAcBJdwAC6pQFbAABcAT4BPRzAAEklgMAASRzAXXlrwABvC8AAt4gAAAAAwAC6qgbAALshghvAAEk5wABJS8AASVcBAIOwAAAAAQPAAElQwABJVwAAAAAAAABdwAC7BwFbAUrAAElTASsGwAC7I4IbwABJXMAASWXAAEm0AgCDsAAAAAEDwABJacAASbQAAAABAQHAAEl4AAAAgLVdwAC7BwFbAABcAT4BPTDAAEmBH8AASYvAAPtwAQABJ8AAcBkAAABdeT8AXXmiAF153ABdejQAAAADAsAAuyaCG8AASevAAEn6wABRYwfAAHAaAAEAAIJ2YMAA/RwBWwFgwAD9HAAABATAALspghvAAEpJwABKXwbAAHAbwAC3iABgwAD70AFqwABKXmDAAPvQCQTAALsqghvAAEquwABKwgbAAHAcwAC3iABgwAD70AFqwABKwWDAAPvQFQTAALsrghvAAEtKwABLXQbA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ScAAphwcwACmLhrAAKYlwAC85UgBAAGCwACmMcBel3sAwAD9KUrAAKY3ARzAAKY/g8AApj7AXpeKIAAAAAAAP07AAKZLwACmTwAAg1pgwAC84QEewACmVsAAvQMBAAGCwACmXcBel3sATD4BSsAApnABHMAApniDwACmd8Bel4ogAAAAAAA+AT0ewACmk8AAvQQBAAGEwACmmsBel+EABsAAt+CCHsAApqfAAKapwACnkgABwABww8AAt4gAAAABA8AAprzAAKeSAAACAACW82DAAP0cAVsAAIJ2YMAA/RwBWwUFBcAApscAAACZeGDAALzhAMAAptoAAACEUmDAALzQAMAApucAAACkYmDAALzhAMAApu8AAACBpmEBXwEAXwAAAMAApvsAAACFcF8BAAAAXwAAAT4DScAApwQcwACnFhrAAKcNwAC85UgBAAGCwACnGcBemKMAwAD9KUrAAKcfARzAAKcng8AApybAXpiyIAEAAYTAAKcowF6YxAAAP07AAKc2wACnOgAAg1pgwAC84QEewACnQcAAvQMBAAGCwACnSMBemKMATD4BSsAAp1sBHMAAp2ODwACnYsBemLIgAQABhMAAp2TAXpjEAAA+AT0ewACngcAAvQQBAAGFwACniMBemSIABsAAt+GCHsAAp5XAAKeXwACoqQABwABwxMAAt4gAAAABA8AAp7DAAKipAAADAACW82DAAP0cAVsAAKRjYMAA/RwBWwAApGRgwAD9HAFbBgYGwACntgAAAJl4YMAAvOEAwACnyQAAAIRSYMAAvNAAwACn1gAAAKRiYMAAvOEAwACn4gAAAIGmYQJfAQBfAgBfAAAAwACn+gAAAMAAQuJfAQAAwACoAwAAAMAAQuNfAgAAAF8AAAE+A0nAAKgNHMAAqB8awACoFsAAvOVIAQABgsAAqCLAXpn4AMAA/SlKwACoKAEcwACoMIPAAKgvwF6aByACAAKEwACoMcBemhyFwACoN8BemisAAD9OwACoRsAAqEoAAINaYMAAvOEBHsAAqFHAAL0DAQABgsAAqFjAXpn4AEw+AUrAAKhrARzAAKhzg8AAqHLAXpoHIAIAAoTAAKh0wF6aHIXAAKh6wF6aKwAAPgE9HsAAqJjAAL0EAQABhsAAqJ/AXpqUAAbAALfigh7AAKiswACovMAAqRoAAcAAcMXAALeIAAAA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ANDfH8AA0OnAAPsDAQABJAACJ8AAcNUnwABv+ABOwADRkMAA0Z0AAJrCXgAFBQVgwAC84WDAALzQYMAAvOFgwAD9HGDAAP2KAAFXwAC3pQBcATTAANGfA8AA0Z/AANOSAAAABQUFwADRpQAAAJl4YMAAvOEAwADRuAAAAIRSYMAAvNAAwADRywAAAKRiYMAAvOEAwADR0QAAAIHFYMAA/RwAwADR4wAAAIY/YMAA/YoAAGDAAPzZAT4BSz4BScAA0gEhHMAA0hOFwADSBcBepRRIAQABKwDAAP0pPgE9HMAA0jIWwADSK4bAANImwF6mFoRSwAC86KRgAwNcYMAA/RxgwAD9igOFwADSPMBepRQUwADSS8BepkMJABTAANJSwF6mUgoAAMAAvPA+AkAhHMAA0oqEwADSfcBepP9IAQABKwDAAP0pwADSfcAA0pEAPRzAANKoFsAA0qGGwADSnMBephaEUsAAvOikXgICXGDAAP0cAoTAANKxwF6k/xTAANK/wF6mQwkAAMAAvO8BAcAA0tVbAcAA0twAAAGDTVsAAcAA0t8AAAGIQWDAAP2KAD4BScAA0uoewADS7sAA9bECAAIUwADS+MBep0YLABTAANL7wF6mQwkAAD4BPRzAANMUh8AA0w3AXqYlwABvfwMAAxTAANMowF6mNAgAFMAA0y7AXqZDCQAUwADTNcBeplIKAADAALzSPgE9HMAA02CHwADTWcBepiXAAG9/AwADFMAA03TAXqY0CAAUwADTesBep0YLABTAANN9wF6nUgwAAMAAvNJJwADTlhzAANOsgsAA05rAXqR5SAEAASsAwAD9KT4BPYrAANO7wF6keR/AANPbwAC8zwEAAAHAAG9/hsAA1ALAXqXOPgE9isAA1CDAXqR5HsAA1DjAALywAgABgsAA1E/AXqR5AcAAb3+GwADUf8Bepc5LPgFKwADUngEewADUpcAAt+wDAV8AAAOAwADUssBepE+BwADUuMBepF+CwADUxMBepHkAAQHAANTcWwHAANTjAAABg01bAAHAANTmAAABhj9gwAD9igA+AUnAANT4IRzAANUKhcAA1PzAXqUUSAEAASsAwAD9KT4BPRzAANUohcAA1RvAXqUUIAIAAofAANUpwF6otRTAANUswF6owQgAAAA+AkAhHMAA1WCEwADVU8BepP9IAQABKwDA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68AAvZcDAAOAwABECcBe8aaBwABEEsBe8b2CwABEHMBe8e0AwAC+KErAAEQoASkGwAC+L4IswABEPMAAREHAAESaAACApQAAAAEDwABER8AARJoAAAABAQHAAERUAAAgwABDBV3AAPwyAV8AAAAAXAE+AUbAAERjwABEfcAARGoAAACDwF8AAACAwABEdMBe82E+AT0cwABEhS5WAQABgcAARInAXvOEAMAAvi4GwAC+JoIswABEn8AARKTAAEckAADAAHEEwAC9lwAAAAEDwABEq8AARyQAAAACAgLAAESzAAAAg8BgwAD9HADAAES/AAAAg8FgwAD70AAAYMAA+goBPgVOwABE1cAARNsAASdgwAD70AEcwABE5oHAAETdwF7z9IN3AQABHMAARPkWwABE8hbAAETpLsAAcOjAAL2XwAC+HmHAAPyjgY0BAAGUAMAA/PYAwAD76E7AAEUUwABFGgAAg89dwAC+WgFfAAABHMAARSQWwABFHC7AAHDowAC9l8AAvh5LAQABgsAARSXAXvQNAMAA/INOwABFQsAARUsAAJzyXcAAvloBXwAAAStDwABFVyEcwABFZIPAAEVewF70Y0gBAAErAMAA/Sk+A0nAAEV1HMAARXkuvCXAAL2XAgACFsAARYeDwABFgcBe9GOD0cAAvlyAwABFjMBe8+UAwAC+Iz4FTsAARbDAAEW1AACDsF3AAL5aAV8AAAEcwABFvYPAAEW3wF70Y4RZAAAAAMAAvmBJwABFzxzAAEXchMAARdPAXvSjSAEAASsAwAD9KT4BPRzAAEX5FsAARfEuwABw6MAAvZfAAL4egL8CAAKCwABF+sBe9A2FwABGA8Be9RMAwAD8hD4BPRfAAEYthMAARiTAXvSjg7CFwABGNMBe9RPAAL5ePRfAAEZMLsAAcOfAAL2XHMAARlkWwABGTC7AAHDnwAC9l8AAvh+BjQEAAZQAwAD89sAAvh89F8AARmUuwABw6cAAvZccwABGnxzAAEaaFsAARocuwABw6cAAvZfAAL4gZAEAAZQAwAD89YN3AQABasAARqFgwAD70IPcAMAA++jAAL4gSsAARsMBKT89jMAARt7AXvSjg8AARunAXvRjPYvAAEb2wF70YxbAAEcEg8AARv7AXvRjg7DAAL5eSsAARxQBKgbAAL4wgizAAEcpwABHLsAAR2kA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AEeyASkGwADAT4ItwABIBMAASAvAAErMAADAAHFjwAC9lwAAAAEDwABIGMAASswAAAABAQHAAEggAAAAg9FgwAD9HAAAYMAA/RwBPglOwABINcAASDoAAZiAYMAA+9ABFsAASEMWwABIPC6XFsAAvZfAAL50YcAA/KNOwABIWcAASGIAAcAAcTBgwAD70AEcwABIaYHAAEhkwF/7AoGNAQABlADAAPz2TsAASHzAAEiHAAHAAHFHYMAA+9ABHMAASI6BwABIicBf+wKDvAEAAZQAwAD77U7AAEiiwABIqwABwABxLGDAAPvQARzAAEitLoZ5wAC9lwEAAYDAAEi3wF/66QDAAL6lTsAASMvAAEjXAAHAAHFFYMAA+9ABHsAASOPAAL6WAwADhMAASPDAX/uLFsAASPouwABxEMAAvZfAAL51gcAASQXAX/sCAE7AAEkUwABJFgAAYmDAAPvQAR7AAEkiwAC+lwIAAoTAAEkuwF/7i4LAAEk4wF/7LwBOwABJS8AASVAAAKlgYMAA+9ABHMAASVgWwABJUi6XFsAAvZfAAL50SwEAAYbAAElZwF/8AwDAAPyDQ8AASWEhHMAASW2HwABJaMBf/DRIAQABasAASXpgwAD70AkAwAD88z4DScAASZAhHMAASZmHwABJlMBf/DRIAQABasAASaZgwAD70BUAwAD88z4CTsAAScnAAEnLAAGWlmDAAPvQARzAAEnZhcAASc3AX/u9g7sBAAGHwABJ28Bf/DQAwAD76knAAEnpIhzAAEnvFMAASe3AX/zCCABjAQABg8AASfHAX/tdAMAA/P0AHMAASf8uvCXAAL2XAgACgMAASgfAX/rpHMAAShEWwABKDC62l8AAvZfAAL52SwEAARTAAEoSwF/8wggAAMAA/IMAwAC+pj4BSsAASiMBHMAASi8WwABKKi62l8AAvZfAAL52SwEAARTAAEowwF/8wggAAMAA/IM/Pz2OwABKc8Bf/AMewABKgcAAvpgCAAKGwABKjMBf/AOCwABKj8Bf+y8APY/AAEqgwF/8NBzAAEqtFsAASqculxbAAL2XwAC+dEsBAAGGwABKrsBf/AMAwAD8g0rAAEq8ARbAAErDLraXwAC9l8AAvnYGwADAVIItwABK0cAAStPAAEs1AACW9gAAAAEDwABK2cAASzUAAAABAQHAAErhAAAAg9FgwAD9HAAAXwAAAT4CTsAASvDAAEryAACD+WDAAP0cARzAAEr0LsAAcWPAAL2XAQABgMAASwLAX/4xAMAAwE9KwABLDAEmwABLDAEjHsAASxPAAPWxAgACFsAASx0utpfAAL2XwAC+doHAAEskwF/+SAArgcAASzDAX/5IAWDAAP0cXwAABsAAwFWCLcAASzrAAEs/wABLfAAAgxcAAAABA8AAS0fAAEt8AAAAAQEBwABLTwAAAIPRYMAA/RwAAGDAAPoKAUrAAEtXASEewABLWMAA9bECAAIWwABLYi62l8AAvZfAAL52HMAAS2kuwABxY8AAvZcBAAGAwABLd8Bf/ukAwADATwAGwADAVoItwABLgcAAS4bAAE6LAACEWQAAAAEDwABLjMAATosAAAABAQHAAEuUAAAAg9FgwAD9HAAAYMAA+goBPglOwABLqcAAS64AAZiAYMAA+9ABFsAAS7cWwABLsC6XFsAAvZfAAL50YcAA/KNOwABLzcAAS9YAAcAAcTBgwAD70AEcwABL3YHAAEvYwF//hYGNAQABlADAAPz2TsAAS/DAAEv7AAHAAHFHYMAA+9ABHMAATAKBwABL/cBf/4WDvAEAAZQAwAD77U7AAEwWwABMHwABwABxLGDAAPvQARzAAEwhLoZ5wAC9lwEAAYDAAEwrwF//bADAAL6lTsAATD/AAExLAAHAAHFFYMAA+9ABHsAATFfAAL6WAwADhMAATGTAYAAOFsAATG4uwABxEMAAvZfAAL51gcAATHnAX/+FAE7AAEyIwABMigAAYmDAAPvQAR7AAEyWwAC+lwIAAoTAAEyiwGAADoLAAEyswF//sgBOwABMv8AATMQAAKlgYMAA+9ABHMAATMwWwABMxi6XFsAAvZfAAL50SwEAAYbAAEzNwGAAhgDAAPyDQ8AATNUhHMAATOGHwABM3MBgALdIAQABasAATO5gwAD70AkAwAD88z4DScAATQQhHMAATQ2HwABNCMBgALdIAQABasAATRpgwAD70BUAwAD88z4CTsAATT3AAE0/AAGWlmDAAPvQARzAAE1NhcAATUHAYABAg7sBAAGHwABNT8BgALcAwAD76knAAE1dIhzAAE1jFMAATWHAYAFFCABjAQABg8AATWXAX//gAMAA/P0AHMAATXMuvCXAAL2XAgACgMAATXvAX/9sHMAATYUWwABNgC62l8AAvZfAAL52SwEAARTAAE2GwGABRQgAAMAA/IMAwAC+pj4EPRzAAE2dFsAATZculxbAAL2XwAC+dIC/AgAChsAATZ7AYACGasAATa1gwAD70BUAwAD8hD0ewABN0MAAvpoCAAIWwABN3i62l8AAvZfAAL52FMAATeXAYAFFCAAAPRfAAE31LsAAcRLAAL2XHMAATfMWwABN9S7AAHESwAC9l8AAvnhkAQABlADAAPz1wAC+eErAAE4NASk/Pz2OwABOMsBgAIYewABOQMAAvpgCAAKGwABOS8BgAIaCwABOTsBf/7IAPY/AAE5fwGAAtxzAAE5sFsAATmYulxbAAL2XwAC+dEsBAAGGwABObcBgAIYAwAD8g0rAAE57ASoGwADAXIItwABOkMAATqDAAE7oAQBcAAAAAQPAAE6pwABO6AAAAAAAAABdwAD8bQFfAAABSsAATrIBH8AATrbAAL/6BQFfAAAFLhbAAE7QLraXwAC9l8AAvnYWwABO1y7AAHERwAC9l8AAvnccwABO4pSBxAAAAADAAPvzlAAGwADAV4ItwABPpcAAT6zAAE/jAACVEwAAAAEDwABPscAAT+MAAAAAAAAAXcAA/WcBXwAAAUrAAE+3ATXAAE+7AAABAF3AAMBJAV8AAAEfwABPu8AAwF4AAV8AAAAANQAAAAEAWwEcwABP14DAAE/VwGADnoClAQABLgDAAML8gADAYAOeBsAAwFCCLcAAUCTAAFApwABQTwAAwABxQsAAvZcAAAABA8AAUDnAAFBPAAAAAAAAAFwBPgE9HMAAUEIuwABxP8AAvZcAAAAAwADATQAAX+4OAF/uXABf7swAX+8jAF/wFgBf8S8AX/KaAF/zFQBf9SgAX/q5AF/+BwBf/r8AX/9CAGAC5ABgA2IAYAPnAGAEMwAAABACwADAX4ItwABQVMAAUFrAAFGeN8AAcWQAAQAAg8tgwAD9HAFbAV3AAMBJAV8AAAABYMAAvqkAAQXAAMBhAAAAAAQAAAMAAAAAAAAAAABdwADAXwFfAAABPwEJAADAAMBeAAAAAAIGwADAZIItlj2WQZZkAACGecAAvZcAAAABA5ZKlmQAAAABAQGWSwAAAINNWwAAYMAA+9ABSpZRAR6WUcAA9bIBAAGAlmLAYAUGAAbAAMBlgi2WaJZtlpEAALwlwAC9lwAAAAEDlnSWkQAAAAICApZ1AAAAwABq41sAlnkAAADAAGrkWwAAYMAA+goBSpaAAR6WgMAA9bECAAKAlorAYAVQgZaOwGAFWwAAAGAE4gBgBSwAYAWKAAAAAgLAAMBmgi3AAFBUwABQWsAAUZ4DwABxZQABAACDy2DAAP0cAVsBXcAAwF8BXwAAAAAAAQXAAMBtAAAAAAQAAAMAAAAAAAAAAABdwADAZgFfAAABPwEJAQDAAMBhAAAAAAMGwADAaIItwABQx8AAUM7AAFENAACVEwAAAAEDwABQ08AAUQ0AAAAAAAAAXcAA/WcBXwAAAUrAAFDZATXAAFDdAAABAF3AAMBmAV8AAAEfwABQ3cAAwG0AAV8AAAAANQAAAAEAWwEcwABRAYDAAFD/wGAGOIClAQABLgDAAML8gADAYAY4BsAAwGqCLcAAURLAAFEgwABRWAABwABxA8AAvZcAAAABA8AAUSzAAFFYAAABAACW82DAAP0cAVsAAAAAXcAA/WcBXwEAAUrAAFEyAR/AAFE2wADAbQABXwEAAAAGwADAa4ItwABRXcAAUWTAAFGcAACWMgAAAAEDwABRa8AAUZwAAAEAAJbzYMAA/RwBWwAAAABdwAD9ZwFfAQABSsAAUXEBHsAAUXXAAP1xAgJfAABfAQABLgGXHGrAAFGSXgEAAJbzYMAA/RwBWwAAAAAAXcAA/WcBXwIAwAF1/wAAYAX8AGAGgQBgBt0AYAddAAAAAwLAAMBugi3AAFGhwABRp8AAVHMDwABxZgABAACDy2DAAP0cAVsBXcAAwEkBXwAAAAADBMAAwHGCLcAAUfHAAFH6CcAAcQzAAL2XAFsABMAAwHKCLcAAUgTAAFILCcAASBbAAL2XAFsABMAAwHOCLcAAUhXAAFIeCcAAcPbAAL2XAFsAAQXAAMB+gi3AAFM9wABTPcAAU8wAAAADwABTWMAAU8wAAAADAwPAAFNeAAAEwABxDFsAwABTbgAABMAASBZbAMAAU3cAAADAAHD3WwAAXcAAwG4BXwAAAT8ECAHAAMBxgADAYAgbCAHAAMBygQDAYAgoCADAAMBzIyEcwABTn4LAAFOWwGAINUgBAAErAMAA/SmCwABTqsBgCDUWwABTyB/AAFO5wADDyQABXwAAAACW+cAAw8cBWwkBwABTPcAAwF4AAAAABwbAAMB2gi3AAFIjwABSJ8AAUkEAAIZ5wAC9lwAAAAEDwABSMMAAUkEAAAABAQHAAFIxAAAAg01bAABgwAD70AFKwABSNwEmwABSNwEcwABSNy7AAEgWwAC9lwEAAYDAAFI/wGAI6gDAAMByYMAA+9AGwADAd4ItwABSRcAAUkrAAFJuAAC8JcAAvZcAAAABA8AAUlHAAFJuAAAAAgICwABSUgAAAMAAauNbAMAAUlYAAADAAGrkWwAAYMAA+goBSsAAUl0BJsAAUl0BHMAAUl0uwABxDMAAvZcCAAKAwABSZ8BgCVqBwABSa8BgCWcAwADAcWDAAPoKBsAAwHiCLcAAUnPAAFJ4wABStgAAgxcAAAABA8AAUoDAAFK2AAAAAQEBwABSiAAAAK19YMAA/RwAAGDAAPoKAUrAAFKOASMmwABSjgEcwABSji7AAHD2wAC9lwEAAYDAAFKYwGAJ3gDAAMBzYMAA+godwABSo4MXAQABgMAAUqzAYAneAMAAwFUqAWDAAPoKBsAAwHmCLcAAUrrAAFK8wABS9QAAlvYAAAABA8AAUsLAAFL1AAAAAQEBwABSygAAAK19YMAA/RwAAF8AAAFKwABS0AEjJsAAUtABHMAAUtAuwABw9sAAvZcBAAGAwABS2sBgCm4AwADAc2DAAPoKHcAAUuWW9gEAAYDAAFLswGAKbgDAAMBUKwFfAAAGwADAeoItwABS+cAAUv7AAFM4AACEWQAAAAEDwABTBMAAUzgAAAABAQHAAFMMAAAArX1gwAD9HAAAYMAA+goBSsAAUxIBIybAAFMSARzAAFMSLsAAcPbAAL2XAQABgMAAUxzAYAr6AMAAwHNgwAD6Ch3AAFMnhFkBAAGAwABTLsBgCvoAwADAVioBYMAA+goGwADAe4ItwABT0cAAU9jAAFP9AACWMgAAAAEDwABT38AAU/0AAAEAAJbzYMAA/RwBWwAAAABdwAD9ZwFfAQABSsAAU+UBHsAAU+nAAP1xAQJfAABfAQABLgAGwADAfIItwABUAcAAVAjAAFRxAACVEwAAAAEDwABUDcAAVHEAAAAAAAAAXcAA/WcBXwAAAUrAAFQZATXAAFQdAAABAF3AAMBuAV8AAAEfwABUHcAAwH4DAV8AAAMWwABUPC7AAHEMwAC9l8AAwHEWwABURy7AAEgWwAC9l8AAwHIWwABUUC7AAHD2wAC9l8AAwHMANQAAAAEAWwEcwABUZYDAAFRjwGAL9oClAQABLgDAAML8gADAYAv2AABgCLwAYAksAGAJtABgCkQAYArQAGALYABgC7oAYAx1AAAABwLAAMB/geKBqYGvg6cDwABrWQABAACDy2DAAP0cAVsBXcAAzjUBXwAAAAABBMAAwIKB4oH9ggQJuWDAAL2XAF3AAPwyAV8AAAABBcAAwImB4oLMgsyDBwAAAAOC4IMHAAAAAQEBgu0AAACDRF3AAPwyAV8AAAAAXcAAwH8BXwAAAT8CCADAAMCCgIMBwGAM/wkBgszAAM43AAAAAAMGwADAhIHigwyDFINIAACWMgAAAAEDgxuDSAAAAQAAlvNgwAD9HAFbAAAAAF3AAPx0AV8BAAFKgyEBH4MhwADAiQEBXwEAARyDPhaDNi65YMAAvZfAAMCCljIAAV8BAAAAwAD8OwAGwADAh4Hig0yDVINsAQBhAAAAAQODW4NsAAAAAAAAAGDAAPvQAUqDXgEWg2YWg14uuWDAAL2XwADAgmHAAPxVBsAAwIWB4oNxg3yDpQMASwAAAAEDg36DpQAAAAEBAYODAAAAJ2DAAPvQAABfAAABSoONARyDlRaDjS65YMAAvZfAAMCCljMBAAGAg5/AYA38AMAA/FEAAGANNwBgDZ0AYA3dAGAOMwAAAAMCwADAioIqhXqFiZkyB8AARlEBaoWJYMAAyvjAAXDeAgAAhANgwAD9HAFbAACEBGDAAP0cAVsBYMAA/RwAAV3AAPylAl8AAF8BAAAACAbAAMCNgiyF4YXohfQAAsAAcPTAAL2XAAAAAQOF8oX0AAAAAAAAAF3AAP1nAV8AAAAGwADAj4IsgvqDAoWUBAEAAWqDAmDAAMr4wAFw3gAAAQODCYWUAAACAACEA2DAAP0cAVsAAIQEYMAA/RwBWwMAAAODFwAAAJWgYQJfAgBfAgBgwAD6CgFqAGDAAPzZd4M5AAAAg8FhAV8CAGDAAPvQAWoAYMAA/Nl3g1UAAADAAENqYQFbYMAA+goBagBgwAD82XddwADAigJfAgBfAwABPgJJg3Ycg4WCg3rAYA8/SAEAASsAwAD9KT4BSYOWHIOjgYOawGAPJUgBAAErAMAA/Sk+AkmDthyDwYCDusBgDwhIAQABKwDAAP0pPgFKg9YBH4PhwAC9xgACXwIAXwMAAAA/PYmEBcBgDyVqhBBhAVtgwAD70MABdgQ+AkmEOSIehD3AAPWxAgACaoRHYQFgwAD9HGDAAPvQwAF2CYGEWcBgDyUAAB6EcsAA9bECAAJqhHxhAmDAAP0cYMAA/RxgwAD6CsABdg6AhIfAYA8IAD4BSoScAR+Ep8AAveEAAl8CAF8DAAAAPz0jHITagITTwGAPCEgBAAErAMAA/SmIhNPAYA8IaoTeYQJbW2DAAPoKwAF2EysBYQJfAgBfAgBgwAD6Cj4CPSMchRKBhQnAYA8lSAEAASsAwAD9KYmFCcBgDyVqhRZhAVtgwAD70MABdgQrAWEBXwIAYMAA+9A9IxyFNYCFLsBgDwhIAQABKwDAAP0piIUuwGAPCGqFOWECW1tgwAD6CsABdhMrAWECXwIAXwIAYMAA+gpKhVMBH4VewAC91gMCXwIAXwMAA4CFc8BgDwiBhXvAYA8lgoWFwGAPPwAGwADAkIIshaKFqoXcBAHAAEtVAWqFqmDAAMr4wAFw3gAAAQOFuoXcAAACAACEA2DAAP0cAVsAAIQEYMAA/RwBWwAAAABdwADAigJfAgBfAwABSoXAAR+FxMAAveEAAl8CAF8DAAAABsAAwJGCKpFbkWOR8gQBligAAAABA5FvkfIAAAIAAIQDYMAA/RwBWwAAhARgwAD9HAFbAQEBkXQAAACD1l3AAPylAltbAABdwADAigJfAgBfAwABPgNOkYuRkgAAgXZdwAD8pQJfAgBfAwABHpGUwADAjwACXwIAXwMAAAA9HJGvgJGpwGARx4P4AQABNJG3A5G3kdoAAAACAgKRuAAAAIP5WwCRuwAAAIDyWwAAYMAA/NkBPgE9HJHMgZHGwGAR6IC/AgACJpHMAYKRzcBgEixfAgAmkcwBg5HSwGASNV8DAADAAPy6AMAA/MRKkeEBJpHhAYGR6MBgEehdwADAigJfAgBfAwAGwADAkoIqkj+SR5KEBAGaMQAAAAEDklGShAAAAgAAhANgwAD9HAFbAACEBGDAAP0cAVsBAQGSXAAAAIPWXcAA/KUCXwIAXwMAAABdwADAigJfAgBfAwABSpJmATWSZgAAAQBdwADAigJfAgBfAwABHpJmwADAjwACXwIAXwMAAAA1AAAAAQBbARySd4GSdcBgEvWApQEAAYCSfsBgEs4AwAD8wYEAwGAS9QbAAMCTgiqUbpR2lUQEAcAAb5MAAAABA5SKlUQAAAIAAIQDYMAA/RwBWwAAhARgwAD9HAFbAwEBlJQAAACDzF3AAPwyAVsAApSnAAAAg9FhAVtfAgABagBgwAD82XeUtwAAAICWYQFbXwMAAWoAYMAA/Nl3XcAAwIoCXwIAXwMAAT4DTpTYlNwAAICrXcAA/KUCXwIAXwMAAR6U3sAAwI8AAl8CAF8DAAAAPR6U+8AAwbMEAASDlRbAYBPGgJUbwGATeoGVJcBgE4qClSrAYBOgAEqVNgEmlTYBg5U9wGATxl3AAMCKAl8CAF8DAAbAAMCUgiqW4pbql5UEAcAAcWcAAAABA5b/l5UAAAIAAIQDYMAA/RwBWwAAhARgwAD9HAFbAgIClwwAAACDYl3AAPwyAV8CAACXHgAAACldwAD8MgFfAwAAAF3AAMCKAl8CAF8DAAE+A06XNpc6AACAq13AAPylAl8CAF8DAAEelzzAAMCPAAJfAgBfAwAAAD0el1nAAMG0AwADgpdvwGAUmYCXdMBgFGeBl3rAYBR4AEqXhwEml4cBgpeOwGAUmV3AAMCKAl8CAF8DAAbAAMCVgiqYxZjNmTAEAcAAcWgBapi2YMAAywvAAXEeAAABA5jgmTAAAAIAAIQDYMAA/RwBWwAAhARgwAD9HAFbAQEBmPoAAACD0F3AAPwyAV3AAPzMAl8CAF8DAAAAXcAAwIoCXwIAXwMAAUqZDAE1mQwAAAEAXcAAwIoCXwIAXwMAAR6ZDMAAwI8AAl8CAF8DAAAANQAAAAEAWwEcmR2BmRvAYBVswABC7QEAAYCZKMBgFT8AwAD8vIEAwGAVbAAAYA6VAGAOxgBgESoAYBGRAGASmABgE0IAYBQvAGAU+wBgFbsAAAAIAsAAwJaCMISdhKyTegfAAHFpAWqErGDAAMr4wAFw3gEAAIPLYMAA/RwBWwFgwAD9HAABXcAA/WcBXwAAAAAFBsAAwJiCLLmguai8KwQBAAFquahgwADK+MABcN4AAAEDua+8KwAAAQAAg8tgwAD9HAFbAwAAA7m9AAAAlaBhAl8BAF8BAGDAAPoKAWoAYMAA/Nl3udsAAACDwWEBXwEAYMAA+9ABagBgwAD82Xe59QAAAMAAQ2phAVtgwAD6CgFqAGDAAPzZd13AAMCWAV8BAAE+Akm6Fhy6JYK6GsBgFpFIAQABKwDAAP0pPgFJujYcukOBujrAYBZ3SAEAASsAwAD9KT4CSbpWHLphgLpawGAWWkgBAAErAMAA/Sk+AUq6dgEfuoHAAL49AAFfAQAAAD89ibqiwGAWd2q6rWEBW2DAAPvQwAF2BD4CSbrWIh662sAA9bECAAJquuRhAWDAAP0cYMAA+9DAAXYJgbr2wGAWdwAAHrsPwAD1sQIAAmq7GWECYMAA/RxgwAD9HGDAAPoKwAF2DoC7JMBgFloAPgFKuzkBH7tEwAC+RgABXwEAAAA/PSMcu3SAu23AYBZaSAEAASsAwAD9KYi7bcBgFlpqu3hhAltbYMAA+grAAXYTKwFhAl8BAF8BAGDAAPoKPgI9Ixy7rIG7o8BgFndIAQABKwDAAP0pibujwGAWd2q7sGEBW2DAAPvQwAF2BCsBYQFfAQBgwAD70D0jHLvPgLvIwGAWWkgBAAErAMAA/SmIu8jAYBZaarvTYQJbW2DAAPoKwAF2EysBYQJfAQBfAQBgwAD6Ckq77QEfu/jAAL5ZAwFfAQADgLwKwGAWWoG8EsBgFneCvBzAYBaRAAbAAMCZgiy8ObxBvHAEAcAAS1UBarxBYMAAyvjAAXDeAAABA7xRvHAAAAEAAIPLYMAA/RwBWwAAAABdwADAlgFfAQABSrxXAR+8W8AAvkYAAV8BAAAABsAAwJqCMJB+kIaRHgQBligAAAABA5CSkR4AAAEAAIPLYMAA/RwBWwEBAZCcAAAAiD9dwAD8MgFbAABdwADAlgFfAQABPgNOkLeQvgAAgXZdwADAlgFfAQABHpDAwADAmAABXwEAAABGkNKQ7JDdAAABg01bAICQ4sBgGPE+AT0ckPuBkPTAYBkOVgEAASaQ/wGCkP/AYBkzXwEAAMAA/XRKkQ0BgZEUwGAZDgbAAMCbgjCSZZJtkq8EAZoxAAAAAQOSd5KvAAABAACDy2DAAP0cAVsBAQGShAAAAIg/XcAA/DIBXwEAAABdwADAlgFfAQABSpKRATWSkQAAAQBdwADAlgFfAQABHpKRwADAmAABXwEAAAA1AAAAAQBbARySn4GSncBgGb6ApQEAAYCSpsBgGZ0AwAD9dYEAwGAZvgbAAMCdgjCTYJNwk3gBAlwAAAABA5N4k3gAAAAAAAAAXcAA/G0BXwAAAAAAYBYjAGAYcABgGMYAYBlyAGAaBQBgGi8AAAAFAsAAwJ6CMYGFgZSVqgfAAGQKAAEAAIPLYMAA/RwBWwFgwAD9HAABXcAA/DIBXwAAAAEFwADAwAAAAAAEAAADAAAAAAAAAAAAXcAAwJ4BXwAAAT8BCQEAwAD9MgAAAAAeBsAAwKCCMYJVgmGCiwAAljIAAAABA4JogosAAAEAAJbzYMAA/RwBWwAAAABdwAD8MgFfAQABSoJuAR6Cd8AA/DoBAl8AAF8BAAEuAAbAAMChgjGCj4KbgtIAAICrAAAAAQOCoYLSAAABAACCdmDAAP0cAVsBAQGCpAAAAIGmYQFfAABfAQAAAF3AAPwyAV8BAAFKgrUBHoK1wADM1gICXwAAXwEAAi6AgtDAYBsjAAbAAMCigjGC14LjgxgAAIGlAAAAAQOC6IMYAAAAAQEBgu4AAACBpmEBXwAAYMAA+goAAF3AAPwyAV8AAAFKgv8BH4L/wADNBwIBXwAAAi6AgxbAYBt7AAbAAMCjgjGDHYMpg1UAAJZAAAAAAQODNYNVAAABAACCdmDAAP0cAVsAAAAAXcAA/DIBXwEAAUqDOwEfgzvAAM3lAQFfAQABLgAGwADApIIxg1qDZoOwAACEiQAAAAEDg2+DsAAAAQAAgnZgwAD9HAFbAQEBg3wAAACBpmEBXwAAXcAA/DIBXwEAAABdwAD8MgFfAQABSoOTAR+Dk8AAzRsCAl8AAF8BAAIugIOuwGAcJgAGwADApYIxg7WDwYUJAACWNwAAAAEDg8uFCQAAAAEBAYPYAAAgg9ZdwAD8MgFfAAAAAF3AAPwyAV8AAAE+A06EV4RcAACZeF3AAPwyAV8AAAEuSYRoJYRxgYRswGAco13AAMyOAV8AAD4BSoSYAR6EmMAAzb0CAV8AAAIUhMTAYByjAQFdwADMjgFfAACAhMrAYByEAD9KhNwBH4TjwADNyAIBXwAAAi6AhP/AYByEAAbAAMCmgjGFDoUThYUAAIMXAAAAAQOFG4WFAAAAAQEBhSMAAACWIGDAAP0cAABgwAD6CgE+AkaFMoVEhTkAAACDTV8AAAAuPgFJhUwchVKBhVDAYB1PSAEAAYCFVcBgHTQAwAD9KUqFXgEpP0qFdQEqBsAAwKeCMYWKhY+F1gAAg/gAAAABA4WWhdYAAAABAQGFnAAAAIGmYQFfAABcAABcAT4BRoWwAIW3AAAAliBfAAAALj0chcmAhcjAYB2lIAEAAYGFysBgHbwAAAbAAMCogjGF24Xdhw8AAJY6AAAAAQOF44cPAAAAAQEBheYAACCHF2ECXwAAXwAAXwAAAABfAAABPgVOhhWGHgAAXF3AAPxtAV8AAAEWhiUuXMAA/FRJhjMhHIZBgYY4wGAeG10AAAAAwAD8bz4BPTCGVR6GcMAAzfIAAAAAP06GiYaPAACAll8AAAEWhpqBhpHAYB4bXsAA/HFDhqcchreBhq7AYB4bXQAAAADAAPxvPgE9iobLwGAeXxyG2oCG08BgHgAgAgACgobbwGAeXxaG64GG4sBgHhtewAD8cQAASob/AYKHBsBgHl8GwADAqYIxhxSHFofGAACDWQAAAAEDhx2HxgAAAQAAgnZgwAD9HAFbAgIChyAAAACWNl8BAACHMAAAAIcXYQJfAQBfAABfAQAAAF8BAAE+A06HX4dlAACAll8BAAGAh2fAYB72Rod5AIeAAAAAliBfAAAALj2Kh5HAYB8cHIeggYeZwGAfASACAAKCh6HAYB8cg4eowGAfMwAASoe2AYKHvcBgHxwGwADAqoIxh8uH0IhHAACWMAAAAAEDh9WIRwAAAAEBAYfbAAAAgaZhAV8AAGDAAPoKAABgwAD6CgE+AkaH74gHh/YAAACWIF8AAAAuPgFJiA8hHIgVgIgUwGAfkCABAAGBiBbAYB+wAABKiCABKj9KiDgBKQbAAMCrgjGITIhTilUAAFgAAAABA4hXilUAAAABAAGIYAAAAIGvYMAA/bYBaohsYMAA/baEBgBgwAD9tgE+BU6Ig4iMAABcXcAA/G0BXwAAARaIky5cwAD8VEmIoSEciK+BiKbAYCAkXQAAAADAAPxvSoi7AScAP06I14jeAACCi2DAAP4AAR+I4MAA/h8AAAAASYj0IhyJAoCI+MBgIANIAQABKwDAAP3FARyJF4CJDcBgIANIAQABJwAAwAD9xT4BRIkmPgE9HIk6gokzwGAgXYKKAQABJIlVARaJTIGJQ8BgICRewAD8cQDAAP4UHIlwgYlnwGAgJF0AAAAAwAD8bz4CPRyJl4KJkMBgIF2CigEAASSJsgEWiamBiaDAYCAkXsAA/HEAwAD+FEOJuxyJy4GJwsBgICRdAAAAAMAA/G8+Aj0cieiCieHAYCBdgooBAAGAie7AYCADAMAA/hQ9HIoJgooCwGAgXYKKAQABJIokARaKG4GKEsBgICRewAD8cQDAAP4USoo5ARyKR4KKQMBgIF0jAAAAAMAA/hkGwADArIIxilqKX4rZAACB1AAAAAEDimKK2QAAAAEBAYpoAAAAlvlhAV8AAGDAAPoKAABgwAD6CgE+AkaKf4qXioYAAACWIF8AAAAuPgFJip8ciqeAiqPAYCGjIAEAAYGKqMBgIcMAAEqKsgEpP0qKyQEqBsAAwK2CMYreiuaLNAAAgK0AAAABA4rsizQAAAABAAABivMAAACFWGDAAPoKAWqK/mDAAPoKdV3AAPx0AV8AAAFKiw4BHosFwAD8egIBXwAAAS4BhViAiyvAYCIXBsAAwK6CMYs5i0CLXAAAlRMAAAABA4tFi1wAAAAAAAAAXcAA/WcBXwAAAUqLSwEei0jAAMDkAQFfAAABLgAGwADAuYIxi2GLaYwUAQBhAAAAAQOLcIwUAAAAAAAAAGDAAPvQAT4FQCEli4IuXcAAzI4BW4t9i50ATouoi64AAIDuYMAA+9ABk06LwIvDAADAAHFgXcAA/G0BWwEWi8UuXMAA/FRDi9Mci92Bi9rAYCLcXQAAAADAAPxvPgE9iIvxwGAizByL9oCL8cBgIsxkAQABlADAAPz1SowEAYCMC8BgIswGwADAuoIxjBmMIoxBAQCBVQAAAAEDjCqMQQAAAAAAAABgwAD6CgFKjC0BIRyMNxaMLi5cwAD8VF0AAAAAwAD8bwbAAMC7gjGMRoxPjGUBAIOyAAAAAQOMWoxlAAAAAAAAAGDAAPoKAUqMXQEhFoxeLoFVwADAugbAAMCvgjGMaox2jLMAAJY+AAAAAQOMeoyzAAAAAQEBjH8AAACA7mDAAPvQAABdwAD8MgFfAAABPgFKjIwBHoyTwADNLwIBXwAAAi6AjKnAYCPNAAbAAMCwgjGMuIzEjRMAAJY/AAAAAQOMzY0TAAAAAQEBjNMAAACW+WEBXwAAYMAA+goAAF3AAPwyAV8AAAE+AUqM6AEfjO/AAM1NAgFfAAACLoCNCsBgJCEABsAAwLGCMY0YjSSNYQAAlikAAAABA40ojWEAAAABAQGNLQAAAIDuYMAA+9AAAF3AAPwyAV8AAAE+AUqNOgEejUHAAM1gAgFfAAACLoCNV8BgJHoABsAAwLKCMY1mjXKNwQAAlj0AAAABA417jcEAAAABAQGNgQAAAJb5YQFfAABgwAD6CgAAXcAA/DIBXwAAAT4BSo2WAR+NncAAzYUCAV8AAAIugI24wGAkzgAGwADAvIIxjcaNzI5aAQCDGQAAAAEDjdKOWgAAAAAAAABfAAABPgNOjeSN5wAAwABxYF3AAPxtAV8AAAEWjekuXMAA/FRJjfchHI3/gI38wGAlL10AAAAAwAD8bz4BPTCOEx6OLsAAzfIAAAAAP0qORQEWjk+AjkzAYCUvXsAA/HEGwADAvYIxjl+OZY89AQCB6AAAAAEDjmqPPQAAAAAAAABfAAABPgVOjnyOfwAAwABxYF3AAPxtAV8AAAEWjoEuXMAA/FRJjo8hHI6XgI6UwGAlsF0AAAAAwAD8bz4BPTCOqx6OxsAAzfIAAAAAP06O3wAAAIF2XwAAAESO6z4BPYmO9sBgJfcWjwKAjv/AYCWwXsAA/HEcjxuAjxjAYCWwXQAAAADAAPxvSo8sAYGPM8BgJfcGwADAvoIxj0KPSJAdAQCAwwAAAAEDj0+QHQAAAAAAAABfAAABPgVOj2GPZAAAwABxYF3AAPxtAV8AAAEWj2YuXMAA/FRJj3QhHI98gI95wGAmZF0AAAAAwAD8bz0wj4gej6PAAM3yAAAAAD9Oj7aPvQAAgXZfAAABFo/CgI+/wGAmZF7AAPxxSY/PHI/WgI/TwGAmZF0AAAAAwAD8bz0wj+Iej/3AAM3zAAAAAD9KkAwBgZATwGAmqQbAAMCzgjGQIpAkkPcAAJY0AAAAAQOQLpD3AAAAAgEBkDQAAACW+WEBXwAAYMAA+goAAZBGAAAgljVhAF8AAAFqAGDAAPzZd18AAAE+A0aQV5BvkF4AAACWIF8AAAAuPgFJkHcckH+AkHvAYCcVIAEAAYKQgMBgJ0gAAEqQigGCkJHAYCdIP0mQpCEckK+BkKjAYCcoSAEAASsAwAD9KUqQuAEckMWBkL/AYCcoIAAAAAAAPz0wkM0ekOjAAM3yAAAAAAbAAMC0gjGQ/JD+klYAAJY5AAAAAQORB5JWAAAAAgEBkQ0AAACW+WEBXwAAYMAA+goAAZEfAAAgljVhAF8AAAFqAGDAAPzZd18AAAE+Bk6RMgAAAIF2XwAAAE6RQ5FRAADAAHFhYMAA+goBKkaRXpF2kWUAAACWIF8AAAAuPgFJkX4ckYaAkYLAYCfYIAEAAYSRh8BgKCkAAD4CPYqRm8BgKAeEkaTAYCgpPYuRtcBgKBMpP0mR3YOR4cBgKBNKkfABgpH3wGAoBz9JkgMhHJIOgZIHwGAn60gBAAErAMAA/SlKkhcBHJIkgZIewGAn6yAAAAAAAD89MJIsHpJHwADN8gAAAAAGwADAtYIxkluSXZQQAACWPAAAAAEDkmiUEAAAAAIBAZJuAAAAlvlhAV8AAGDAAPoKAAGSggAAIJY1YQBfAAABagBgwAD82XdfAAABPgZOkpUAAACBdl8AAABOkqaStAAAwABxYWDAAPoKASpGksGS2ZLIAAAAliBfAAAALj4BSZLhHJLpgJLlwGAo3iABAAGEkurAYCkvAAA+A0mS/oOTAsBgKRk+AT0wkx0ekzjAAM3zAAAAAD89ipNVwGApDYSTXsBgKS89i5NvwGApGSk/SZOXg5ObwGApGUqTqgGCk7HAYCkNP0mTvSEck8iBk8HAYCjxSAEAASsAwAD9KUqT0QEck96Bk9jAYCjxIAAAAAAAPz0wk+YelAHAAM3yAAAAAAbAAMC2gjGUFZQXlVwAAJYzAAAAAQOUIJVcAAAAAQEBlCUAAAAnYMAA+9AAAF8AAAE+BT0elEDAAPr8AgACgJRNwGAqACcnAD0elG3AAPsSAgACgJR+wGAqACcnAE6Ul5SkAADAAG+qYMAA+9ABk0aUrZTFlLQAAACWIF8AAAAuPgJJlM0clNeAlNHAYCoASAEAAYGU2sBgKj4AwAD880qU6AGClO/AYCpUPz2JlP7AYCo+HJUKgZT+wGAqPmQBAAGUAMAA/PU9MJUYH5UpwAD7JgUABYCVL8BgKgAuJycrgZVLwGAqPgAGwADAt4IxlWGVaJWoAAAjAAAAAQOVcJWoAAAAAAAAAGDAAP22AUqVdgEelYPAAMDDAwADLieD1yeDIQAAAGAarABgGvgAYBtbAGAbsgBgG/sAYBxkAGAdFABgHYUAYB3gAGAeywBgH3AAYB/kAGAhgwBgIfYAYCJTAGAikQBgIzYAYCN3AGAjrQBgJAEAYCRaAGAkrgBgJQcAYCWIAGAmPABgJvUAYCe4AGAovgBgKeAAYCrIAGArBAAAAB4CwADAwYIxlkqWWZ6eB5ZFAAEAAIPLYMAA/RwBWwFdwAD8MgFfAAAAAAABBcAAwMaCMZaBloeWlQEAAAOWk5aVAAAAAAAAAF3AAMDBAV8AAAE/AQkBlofAAPxcAAAAAAIGwADAw4Ixl6yXupqdAAHAAHFqAAAAAQOXz5qdAAAAAwEDl9kAAACDzF3AAPwyAVsAl/EAAADAAHFrYMAA/bYBapgBYMAA/bbAAJQSmA0AAADAAHFsYMAA/bYBapgeYMAA/bbAAKqoAGDAAP22AT4FSZgqHpguwAC9pQEAAYCYQsBgLAcAPgJJmFUiHJhngZhZwGAsFkgBAAEng9cAwAD9xQAcmICCmHHAYCwxSAEAASeDIQDAAP3FPgFKmM8BJ8AAcW0/SpjtASSZFgOBmPbAYCwWJ5yygpkHwGAsMT9OmS+ZNQAAhH9dwAD8dAFgwAD9tgExmT9gwAD9tgA9HJlZGplHwAC9n1YBAAGAmV3AYCwHAMAA/IVMPgE9Hpl4wAC9pgIAAoCZkMBgLAeDmZrAYCzEAD4CQB6Zv8AA9bECAAIWmdsamcnAAL2fgejAAPxZgJnhwGAsBwCZv5nqAD0cmgUamfPAAL2fhhEAAAAAwAD8k0qaHQEcmo81miUAAAEAYMAA/gABH5olwAD+HwEAAYGaMsBgLBYANQAAAAEAWwEcmk2EmkvAYC1gn6oCAAKDmlbAYCzEJ4GLAMAA/hY1AAAAAQBbARyab4SabcBgLWCCigEAAYKadcBgLDEAwAD+FIQAwGAtYCMAAAAAwAD+GQbAAMDEgjGcfZyLnpwAAcAAcW4AAAABA5yfnpwAAAADAQOcqQAAAIPMXcAA/DIBWwCcwQAAAMAAcWtgwAD9tgFqnNFgwAD9tsAAlBKc3QAAAMAAcWxgwAD9tgFqnO5gwAD9tsAAqqgAYMAA/bYBPgZJnPoenP7AAL2lAQABgJ0SwGAt+AA+AUqdJQEknU4DgZ0uwGAuByecsoKdP8BgLiI/Tp1nnW4AAIKLYMAA/gABH51wwAD+HwEAAYGdfcBgLgcAPRydoxqdkcAAvZ9WAQABgJ2nwGAt+ADAAPyFTD4BPRydyYOdwsBgLnifqgIAAoCd0sBgLfgngYsAwAD+Fj4CQB6eAMAA9bECAAIWnhwangrAAL2fgejAAPxZgJ4iwGAt+ACeAJ4rAD0cnkYanjTAAL2fhhEAAAAAwAD8kz0cnmWDnl7AYC54gooBAAGCnmvAYC4iAMAA/hRKnoABHJ6Og56HwGAueCMAAAAAwAD+GQAAYCvlAGAt1gBgL0cAAAACAsAAwMeCMoHBgceE+QPAAHFvAAEAAIPLYMAA/RwBWwFgwAD9HAAABQTAAMDKgjKB74IQBsAAcXDAAL2XAGDAAPvQAWqCD2DAAPvQCQTAAMDLgjKCJYIxBsAAcXHAAL2XAGDAAPvQAWqCMGDAAPvQFQTAAMDMgjKCRoJYBsAAcXLAAL2XAGDAAPvQAWqCV2DAAPvQIQTAAMDNgjKCaYJyWMAAcBHAAL2XAF3AAPxtAV8AAAAEwADAzoIygnqCkRjAAGNawAC9lwBgwAD70AFqgoNgwAD70CEBBcAAwNaCMoKWgpaCtQAAAAOCpYK1AAAAAQEBgqsAAATAAHARXcAA/G0BXwAAAABdwADAxwFfAAABPwIIAcAAwM2AAMBgMEsJAYKWwAD9MgAAAAADBsAAwNCCMoK6gsODLgEAwABq8gAAAAEDgsuDLgAAAAAAAABgwAD6CgE+AkmC0RyC3BaC1S7AAGNawAC9l8AAwM5IAQABaoLfYMAA+9AhAMAA/PM9HILvLsAAcXPAAL2XAAAAAMAAwNQ/SoL8ARyDChaDAy7AAGNawAC9l8AAwM5IAQABaoMNYMAA+9AJAMAA/PMGwADA0oIygzODNYRnAACDsAAAAAEDgzmEZwAAAAAAAABfAAABPgVJg7ohFoO/LsAAavLAAMDQPTCDyB+DzsAA+3ABAAEnwABxdAA/QByEABaD+S7AAGNawAC9l8AAwM5IAQABaoQDYMAA+9AJAMAA/POD+YQgAE6EKYQwAACBdl8AAAEWhDwWhDIuwABwEcAAvZfAAMDNXsAA/HE9HIRJLsAAcXPAAL2XAAAAAMAAwNRKhFYBgIRdwGAxjgbAAMDUgjKEbIRxhPcAAMAAcXPAAL2XAAAAAQOEdoT3AAAAAAAAAFwBPgFJhH8chI0WhIMuwABwEcAAvZfAAMDNXQAAAADAAPxvPgE9F4ShLsAAY1rAAL2XaoSqYMAA+9AJwADAzj4BPReE3C7AAGNawAC9l2qE5WDAAPvQFcAAwM4AAGAwhABgMRYAYDHSAGAyVAAAAAMCwADA14IzhDKEQZfKB7IoAWqEQWDAAMr4wAFw3gIAAIQDYMAA/RwBWwAAhARgwAD9HAFbAWDAAP0cAAFdwAD8pQJfAABfAQAAAAcGwADA2YIswABc/8AAXQfAAF/HBAEAAWrAAF0HYMAAyvjAAXDeAAABA8AAXRTAAF/HAAACAACEA2DAAP0cAVsAAIQEYMAA/RwBWwMAAAPAAF0iAAAAlaBhAl8CAF8CAGDAAPoKAWoAYMAA/Nl3wABdRAAAAIPBYQFfAgBgwAD70AFqAGDAAPzZd8AAXWAAAADAAENqYQFbYMAA+goBagBgwAD82XddwADA1wJfAgBfAwABPgJJwABdgRzAAF2QgsAAXYXAYDM9SAEAASsAwAD9KT4BScAAXaEcwABdroHAAF2lwGAzIUgBAAErAMAA/Sk+AknAAF3BHMAAXcyAwABdxcBgMwJIAQABKwDAAP0pPgFKwABd4QEfwABd7MAAvwgAAl8CAF8DAAAAPz2JwABeHsBgMyFqwABeKWEBW2DAAPvQwAF2BD4CScAAXlIiHsAAXlbAAPWxAgACasAAXmBhAWDAAP0cYMAA+9DAAXYJgcAAXnLAYDMhAAAewABei8AA9bECAAJqwABelWECYMAA/RxgwAD9HGDAAPoKwAF2DoDAAF6gwGAzAgA+AUrAAF61AR/AAF7AwAC/fwACXwIAXwMAAAA/PSMcwABfAIDAAF75wGAzAkgBAAErAMAA/SmIwABe+cBgMwJqwABfBGECW1tgwAD6CsABdhMrAWECXwIAXwIAYMAA+go+Aj0jHMAAXziBwABfL8BgMyFIAQABKwDAAP0picAAXy/AYDMhasAAXzxhAVtgwAD70MABdgQrAWEBXwIAYMAA+9A9IxzAAF9bgMAAX1TAYDMCSAEAASsAwAD9KYjAAF9UwGAzAmrAAF9fYQJbW2DAAPoKwAF2EysBYQJfAgBfAgBgwAD6CkrAAF95AR/AAF+EwAC/3QMCXwIAXwMAA4DAAF+mwGAzAoHAAF+uwGAzIYLAAF+4wGAzPQAGwADA2oIswABf1cAAX93AAGAiBAHAAEtVAWrAAF/dYMAAyvjAAXDeAAABA8AAX/PAAGAiAAACAACEA2DAAP0cAVsAAIQEYMAA/RwBWwAAAABdwADA1wJfAgBfAwABSsAAX/kBH8AAX/3AAL9/AAJfAgBfAwAAAAbAAMDbgjOPgo+KkC8EAZYoAAAAAQOPnJAvAAACAACEA2DAAP0cAVsAAIQEYMAA/RwBWwEBAY+hAAAAg9ZdwAD8pQJbWwAAXcAAwNcCXwIAXwMAAT4DTo/Cj8kAAIF2XcAAwNcCXwIAXwMAAR6Py8AAwNkAAl8CAF8DAAAAPRyP7ICP5sBgNiWD+AEAATSP9AOP9JAXAAAAAgICj/UAAACD+VsAj/gAAACA8lsAAGDAAPzZAT4BPRyQCYGQA8BgNkaAvwIAAiaQCQGCkArAYDaKXwIAJpAJAYOQD8BgNpNfAwAAwAD8ugDAAPzESpAeAYGQJcBgNkYGwADA3IIzkIKQipDZBAGaMQAAAAEDkJqQ2QAAAgAAhANgwAD9HAFbAACEBGDAAP0cAVsBAQGQpQAAAIPWXcAA/KUCXwIAXwMAAABdwADA1wJfAgBfAwABSpC1ATWQtQAAAQBdwADA1wJfAgBfAwABHpC1wADA2QACXwIAXwMAAAA1AAAAAQBbARyQzIGQysBgN0OApQEAAYCQ08BgNxwAwAD8wYEAwGA3QwbAAMDdgjOSyZLRk7UEAcAAb5MAAAABA5Lrk7UAAAIAAIQDYMAA/RwBWwAAhARgwAD9HAFbAwEBkvUAAACDzF3AAPwyAVsAApMIAAAAg9FhAVtfAgABagBgwAD82XeTGAAAAICWYQFbXwMAAWoAYMAA/Nl3XcAAwNcCXwIAXwMAAT4DTpNDk0cAAICrXcAAwNcCXwIAXwMAAR6TScAAwNkAAl8CAF8DAAAAPR6TbMAAwbMEAASDk4fAYDgUgJOMwGA3yIGTlsBgN9iCk5vAYDfuAEqTpwGDk67AYDgUBsAAwN6CM5VZlWGWIgQBwABxZwAAAAEDlXyWIgAAAgAAhANgwAD9HAFbAACEBGDAAP0cAVsCAgKViQAAAINiXcAA/DIBXwIAAJWbAAAAKV3AAPwyAV8DAAAAXcAAwNcCXwIAXwMAAT4DTpW9lcEAAICrXcAAwNcCXwIAXwMAAR6Vw8AAwNkAAl8CAF8DAAAAPR6V5sAAwbQDAAOClfzAYDjXgJYBwGA4pYGWB8BgOLYASpYUAYKWG8BgONcGwADA34Izl16XZpfIBAHAAHFoAWqXT2DAAMsLwAFxHgAAAQOXf5fIAAACAACEA2DAAP0cAVsAAIQEYMAA/RwBWwEBAZeZAAAAg9BdwAD8MgFdwAD8zAJfAgBfAwAAAF3AAMDXAl8CAF8DAAFKl6sBJperATWXsQAAAQBdwAD8pQJfAgBfAwABMpexXwIAXwMAADUAAAABAFsBHJe1gZezwGA5nsAAQu0BAAGAl8DAYDltAMAA/LyBAMBgOZ5dwADA1wJfAgBfAwAAAGAytABgNXgAYDXvAGA25gBgN5AAYDhtAGA5KQBgOfIAAAAHAsAAwOCCNIWThaKU0AeyLgFqhaJgwADK+MABcN4BAACDy2DAAP0cAVsBYMAA/RwAAV3AAP1nAV8AAAAABgbAAMDigizAAGBSwABgWsAAYwoEAQABasAAYFpgwADK+MABcN4AAAEDwABgZ8AAYwoAAAEAAIPLYMAA/RwBWwMAAAPAAGB1AAAAlaBhAl8BAF8BAGDAAPoKAWoAYMAA/Nl3wABgkwAAAIPBYQFfAQBgwAD70AFqAGDAAPzZd8AAYK0AAADAAENqYQFbYMAA+goBagBgwAD82XddwADA4AFfAQABPgJJwABgzhzAAGDdgsAAYNLAYDrSSAEAASsAwAD9KT4BScAAYO4cwABg+4HAAGDywGA6tkgBAAErAMAA/Sk+AknAAGEOHMAAYRmAwABhEsBgOpdIAQABKwDAAP0pPgFKwABhLgEfwABhOcAAwF4AAV8BAAAAPz2JwABhZ8BgOrZqwABhcmEBW2DAAPvQwAF2BD4CScAAYZsiHsAAYZ/AAPWxAgACasAAYalhAWDAAP0cYMAA+9DAAXYJgcAAYbvAYDq2AAAewABh1MAA9bECAAJqwABh3mECYMAA/RxgwAD9HGDAAPoKwAF2DoDAAGHpwGA6lwA+AUrAAGH+AR/AAGIJwADAbQABXwEAAAA/PSMcwABiRoDAAGI/wGA6l0gBAAErAMAA/SmIwABiP8BgOpdqwABiSmECW1tgwAD6CsABdhMrAWECXwEAXwEAYMAA+go+Aj0jHMAAYn6BwABidcBgOrZIAQABKwDAAP0picAAYnXAYDq2asAAYoJhAVtgwAD70MABdgQrAWEBXwEAYMAA+9A9IxzAAGKhgMAAYprAYDqXSAEAASsAwAD9KYjAAGKawGA6l2rAAGKlYQJbW2DAAPoKwAF2EysBYQJfAQBfAQBgwAD6CkrAAGK/AR/AAGLKwADAfgMBXwEAA4DAAGLpwGA6l4HAAGLxwGA6toLAAGL7wGA60gAGwADA44IswABjGMAAYyDAAGNiBAHAAEtVAWrAAGMgYMAAyvjAAXDeAAABA8AAYzbAAGNiAAABAACDy2DAAP0cAVsAAAAAXcAAwOABXwEAAUrAAGM8AR/AAGNAwADAbQABXwEAAAAGwADA5II0kd+R55KdBAGWKAAAAAEDkfmSnQAAAQAAg8tgwAD9HAFbAQEBkgMAAACIP13AAPwyAVsAAF3AAMDgAV8BAAE+A06SJJIrAACBdl3AAMDgAV8BAAEeki3AAMDiAAFfAQAAAEaSRZJlklAAAAGWIFsAgJJbwGA9kj4BPRySdIGSbcBgPa9WAQABJpJ4AYKSeMBgPdRfAQAAwAD9dEqSjAGBkpPAYD2vBsAAwOWCNJNtk3WTyQQBmjEAAAABA5OFk8kAAAEAAIPLYMAA/RwBWwEBAZOSAAAAiD9dwAD8MgFfAQAAAF3AAMDgAV8BAAFKk6UBNZOlAAABAF3AAMDgAV8BAAEek6XAAMDiAAFfAQAAADUAAAABAFsBHJO5gZO3wGA+X4ClAQABgJPAwGA+PgDAAP11gQDAYD5fBsAAwOeCNJQ+lEOUYgACg/gAAAABA5RKlGIAAAABAQGUUAAAAIihYQFfAABcAABcAAbAAMDpgjSUtpTGlM4BAlwAAAABA5TOlM4AAAAAAAAAXcAA/G0BXwAAAAAAYDpUAGA9AQBgPWcAYD4TAGA+pgBgPtcAYD8BAAAABgLAAMDqgjWFT4VVkykDwABxdQABAACDy13AAMERAV8AAAFdwADBEQFbAV3AAPwyAV8AAAAAAwTAAMDtgjWFmoWwGMAAcOnAAL2XAGDAAPvQAZMEwADA7oI1hbiFwxic8MAAvZcAYMAA+9ABkwTAAMDvgjWFyYXPWMAAcXbAAL2XAF8AAAErAQXAAMECgjWF/YX9hgkAAAADhgeGCQAAAAAAAABdwADA6gFfAAABPwEJAYX9wAD8XAAAAAAOBsAAwPGCNYZFhkqGqQAAwABrQwAAAAEDhlKGqQAAAAEBAYZVAAAgg89fAAAAAFwBPgI9HIZiLsAAcXfAAL2XAwACFoZwLsAAcXbAAL2XwADA74CGeMBgQAABwABxeCnAAMD4PReGly7AAHF2wAC9l4CGoMBgQADAAMDvBsAAwPKCNYbfhuSHKwAAVgAAAAEDhueHKwAAAAEBAYbqAAAgg89fAAAAAFwBPgE9HIb3LsAAcXfAAL2XAwACFocFLsAAcXbAAL2XwADA74CHDcBgQHgBwABxeCrAAMD4BsAAwPOCNYdjh2iHogAAgKUAAAABA4duh6IAAAABAQGHewAAIIPQXcAA/DIBXwAAAABcAT4BPRyHkoCHisBgQNmD+AEAARaHmi5WwADA8gDAAPxCBsAAwPSCNYiDiIiJDQAAhFkAAAABA4iOiQ0AAAABAQGIkQAAIIPPXwAAAABgwAD6CgE+A0mIniEciK4WiKiAiKLAYEEtlxTAAL2XwADBFEgBAAEuAMAA/SlKiLcBKj89HIjJLsAAcXnAAL2XAQABgIjRwGBBLQDAAMD5Soj+ASkGwADA+4I1iRKJIolKAQBcAAAAAQOJK4lKAAAAAAAAAF3AAPxtAV8AAAFKiS4BH4kuwADBEAEBXwAAAS4ABsAAwPyCNYlPiVeJaAEAYQAAAAEDiV6JaAAAAAAAAABgwAD70AFKiWEBFolhLpzwwAC9l8AAwO4GwADA9YI1iZ6Jo4q4AACCQgAAAAEDiaiKuAAAAAAAAABcAT4GPReJsS7AAHDpwAC9lxyJwxaJsS7AAHDpwAC9l8AAwO1kAQABlADAAPz1wADA7UmJyxaJzy6BVcAAwQBKidgAP06J54nsAACDsF8AAAEWie4uwABxdsAAvZfAAMDvRIn6PgNOigeKDQAAg89fAAABgIoPwGBCaD2IihvAYEJoFooogYoiwGBCisAAbt/AAL2XwADBFT0XijuBijXAYEKKwABu38AAvZcXikmBikPAYEKKwABu4MAAvZcXiluBilXAYEKKlxTAAL2XK8AAwRTAAMEWwADBFSEeinfAAPWxAgACgIqBwGBCaBaKhy7AAHF2wAC9l8AAwO8APReKli7AAHF2wAC9lyvAAMDvPReKqS6c8MAAvZeTwADA7gbAAMD9gjWKvYrDiyQBAIMZAAAAAQOKyYskAAAAAAAAAF8AAAE+AkmKzxaK0y6BVcAAwQA+AT0wiuQfiurAAPtwAQABJ8AAaykAP0qLEwEWixouwABxdsAAvZfAAMDvBsAAwP6CNYspiy+LmQEAgegAAAABA4s0i5kAAAAAAAAAXwAAAT4CSYs6Fos+LoFVwADBAD4BPTCLTx+LVcAA+3ABAAEnwABrKQA/Sot+ARaLjBaLhS7AAHF2wAC9l8AAwO/AAG7gwAC9l8AAwRYGwADA/4I1i56LpIxQAQCAwwAAAAEDi6uMUAAAAAAAAABfAAABPgNJi7EWi7UugVXAAMEAPgE9MIvGH4vMwAD7cAEAASfAAGspAD9Ji/UcjAEWi/kunPDAAL2XwADA7oCXAQABlADAAPz/PgE9MIwOH4wUwAD7cAEAASfAAHF6AD9KjD8BFoxGLsAAcXbAAL2XwADA7wbAAMD2gjWMzIzRji0AAIP4AAAAAQOM2I4tAAAAAQEBjN4AAACIoWEBXwAAXAAAXAE+BE6M+Y0LAADAAHEHYMAA+9ABFo0NLsAAcOnAAL2XwADA7UmNJRaNKS6BVcAAwQBKjTIAP06NQY1JAABeXwAAARaNSy7AAHF2wAC9l8AAwO9EjVc+Az0cjWiAjWLAYETEIAEAAYKNacBgRQsAAEmNeSEcjY+BjX3AYETYSAEAARaNki7AAHDpwAC9l8AAwO0AwAD88z4BPTCNsB+NtsAA+3cBAAEuAD89io3nwGBFCxaN+YKN8cBgRQvAAG7fwAC9l8AAwRUhHo4OwAD1sQIAAoKOGMBgRQsWjiEuwABxdsAAvZfAAMDvAAbAAMEAgjWOMo47jlIBAIFVAAAAAQOOQ45SAAAAAAAAAGDAAPoKAUqORgEcjk4WjkYunPDAAL2XwADA7kgBAAGTAMAA/PMGwADA+II1jyiPLZHaAADAAHF3wAC9lwAAAAEDjzqR2gAAAAMCAo89AAAgg89fAAAAj0YAACDAAHCwXwAAAAGPVgAAAMAAcXhgwAD6CgFqAGDAAPzZd1wBPgxJj2ohHI98Fo93gY9uwGBGNYNbwADBGEgBAAErAMAA/Sk+AT0wj40fj5PAAPtwAQABJ8AAcXsAPz0Xj9cuwABw6cAAvZccj+kWj9cuwABw6cAAvZfAAMDtZAEAAZQAwAD89cAAwO09F4/7gY/ywGBGNZcUwAC9ly7AAMEUSZANFpARLoFVwADBAD4FQByQL4CQKcBgRipIAQABKwDAAP0pkCmQNgA9F5BIgZA/wGBGNcAAbuDAAL2XF5BdgZBUwGBGNcAAbt/AAL2XgZBlwGBGNcAAwRXAAMEWPReQdS7AAHF2wAC9l4GQfsBgRjXAAMDvPReQji6c8MAAvZcckJUWkI4unPDAAL2XwADA7mQBAAGUAMAA/PXAAMDuSpCfAD9OkLOQvwAAuPBfAAABFpDHgJDBwGBGKsAAbuDAAL2XwADBFk6Q2JDiAADAAFVjXwAAAYCQ5MBgRio9F5D4gZDvwGBGNcAAbuDAAL2Xg5EEwGBHf8AAwRY9F5EegZEVwGBGNcAAbt/AAL2XhJEmwGBHosAAwRU9F5FBg5E1wGBHf8AAbt/AAL2XgZFJwGBGNcAAwRU9F5FhhJFXwGBHosAAbuDAAL2XgZFtwGBGNcAAwRZJkXsigpF/wGBGQwAekY7AAPWxAgACgJGYwGBGKhaRny7AAHF2wAC9l8AAwO8APgE9F5GwLsAAcXbAAL2XgZG5wGBGNcAAwO8/PReRzS6c8MAAvZcckdQWkc0unPDAAL2XwADA7mQBAAGUAMAA/PXAAMDuBsAAwPmCNZHfkeSTJwAAwABxecAAvZcAAAABA5HrkycAAAABAQGR7gAAIIPPXwAAAABcAT4GPReR+y7AAHDpwAC9lxySDRaR+y7AAHDpwAC9l8AAwO1kAQABlADAAPz1wADA7T0XkiEWkhuAkhXAYEjIwABu38AAvZfAAMEVwABu4MAAvZcWkjOAki3AYEjIwABu4MAAvZfAAMEWwADBFk6SRJJJAACDsF8AAAEXklsWklGAkkvAYEjIwABu4MAAvZfAAMEWwABu38AAvZcWkmmAkmPAYEjIwABu38AAvZfAAMEVwADBFT0XknQunPDAAL2XHJJ7FpJ0LpzwwAC9l8AAwO6BjQEAAZQAwAD89sAAwO49F5KJgJKDwGBIyJcUwAC9lxeSl4CSkcBgSMjAAG7fwAC9lxeSpYCSn8BgSMjAAG7gwAC9lyvAAMEWwADBFcAAwRRJkrsWkr8ugVXAAMEAPgE9F5LQLsAAcXbAAL2XK8AAwO9Jkuoeku7AAPWxAgACgJL4wGBIyBaS/y7AAHF2wAC9l8AAwO8APgE9F5MQLsAAcXbAAL2XgZMZwGBJQ8AAwO8/AABgP94AYEBZAGBAuQBgQQ0AYEGNAGBBygBgQgIAYENCAGBDoQBgRA8AYESkAGBFvgBgRgQAYEiiAGBKWAAAAA4CwADBA4I1kyyTMpYrA8AAcXwAAQAAg8tdwADBEQFfAAABXcAAwREBWwFgwAD9HAABXcAA/G0BXwAABQTAAMEGgjWTk5OYCZcUwAC9lwBdwADA6gFfAAAABMAAwQeCNZOmk7gJwABw6cAAvZcAYMAA+9AABMAAwQiCNZO+k8ZYiLXAAL2XAF8AAAErBMAAwQmCNZPdk+JYwABu38AAvZcAXcAAwREBXwAAAATAAMEKgjWT65P4GMAAcX3AAL2XAGDAAPoKAAEFwADBEII1k/2T/ZSrAAAAA5QQlKsAAAABAQGUHwAAAINbXcAAwOoBXwAAAABdwADBAwFfAAABPwUIAMAAwQaAlDXAYEt6CADAAMEHFpRdgJRYwGBLesAAcOnAAL2XwADA7QgAwADBCRaUhoCUgcBgS3rAAHF2wAC9l8AAwO8IAMAAwQoqCQGT/cAA/TIAAAAAAgbAAMEMgjWUsJS2lMkBAF4AAAABA5S+lMkAAAAAAAAAXwAAAUqUwQEWlMEuiLXAAL2XwADBCAbAAMEOgjWUzpTTlikAAF0AAAABA5TblikAAAAAAAAAYMAA+goBPgZJlOQhHJT7FpToLsAAcOnAAL2XwADBB0gBAAEWlQQWlP4ulxTAAL2XwADBBsAAcOnAAL2XwADA7QDAAPzzPgE9MJUgH5UmwAD7dwEAAS4AP0mVUyIWlV0WlVculxTAAL2XwADBBoFVwADBAAEiFpVpLsAAcX3AAL2XwADBCgAelXrAAPWxAgACFpWELsAAbt/AAL2XwADBCRaVkRaViy6XFMAAvZfAAMEGgxnAAMD9AD4CPReVoi6ItcAAvZcrwADBCEqVuQEqPz0XldEuwABxfcAAvZcpwADBCj0XlesuiLXAAL2XJpXrARaV9i7AAG7fwAC9l8AAwQlfAADAAMEIPReWAS7AAG7fwAC9lxaWDxaWCS7AAG7fwAC9l8AAwQnAAG7fwAC9l8AAwRXAAMEJSpYaASkAAGBL8QBgTCcAYE2EAAAAAgLAAMERgjWYWZhonrwHwABxfgABAACDy13AAMERAV8AAAFdwADBEQFbAWDAAP0cAAADBMAAwRSCNZiomK1YlxTAAL2XAF3AAMDqAV8AAAErBMAAwRWCNZizmLhYwABu38AAvZcAXwAAASsEwADBFoI1mL6Yx1jAAG7gwAC9lwBfAAABKwEFwADBIAAAAAAEAAADAAAAAAAAAAAAXcAAwREBXwAAAT8BCQEAwAD9MgAAAAAGBsAAwRiCNZlGmViZZQEAg1sAAAABA5ldmWUAAAAAAAAAXcAAwOoBXwAAAUqZYAEWmWAulxTAAL2XwADBFAbAAMEcgjWZ7pnzmhkAAMAAcX8AAAABA5n5mhkAAAAAAAAAXAE+AT0cmggWmgIulxTAAL2XwADBFMAAcXnAAL2XAQABJpoQAS5fAAAAwADA+QbAAMEZgjWa2prgm0ABAIOwAAAAAQOa5ZtAAAAAAAAAAF8AAAE+Akma6yIcmvUWmu8ulxTAAL2XwADBFEgBAAErAMAA/SkBHpsAwAD1sQIAAhabEBabCi6XFMAAvZfAAMEUgxnAAMD9FpsXLsAAbt/AAL2XwADBFQBKmx8BKz9KmzABFps3LsAAbt/AAL2XwADBFQbAAMEagjWcBZwLnHIBAJzyAAAAAQOcFJxyAAAAAAAAAF8AAAE+AkmcGiIcnCQWnB4ulxTAAL2XwADBFEgBAAErAMAA/SkBHpwvwAD1sQIAAi4WnEUWnD8ulxTAAL2XwADBFIMZwADA/QBKnE0BKz9KnF4BFpxlLsAAbuDAAL2XwADBFgbAAMEdgjWdPZ1CnZYAAMAAcYAAAAABA51NnZYAAAABAQGdUAAAIIPPXwAAAABcAT4BPRydYxadXS6XFMAAvZfAAMEUwABxd8AAvZcDAAIWnXEuwABu38AAvZfAAMEVgJ14wGBQDwHAAHF4KsAAwPgGwADBHoI1nmKeZ566AADAAHGBAAAAAQOec566AAAAAQEBnnYAACCDz18AAAAAXAE+AT0cnokWnoMulxTAAL2XwADBFMAAcXfAAL2XAwACJp6XAS5fAACAnp3AYFB/AcAAcXgpwADA+AAAYE5IAGBOhQBgTtYAYE9pAGBP7QBgUF0AYFDFAAAABgLAAMEhToRAhE+FszfAAHGCAAEAAIPLYMAA/RwBWwFgwAD9HAABXcAAwWoBXwAAAAEFwADBIwAAAAAFAAADAAAAAAAAAAAAXcAAwSEBXwAAAT8BCQAAwAD9MgAAAAA9BsAAwSVOie6J/oofAQBcAAAAAQOKB4ofAAAAAAAAAF3AAPxtAV8AAAFKigoBH4oKwADMzwEBXwAAAS4ABsAAwS1OiiSKJopJAACWMwAAAAEDii+KSQAAAAEBAYo0AAAAJ2DAAPvQAABfAAABSoo+ARyKQi5LAQABgIpDwGBRoADAAPyDBsAAwS5Oik6KWoqyAACWNwAAAAEDimSKsgAAAAEBAYpxAAAgg9ZdwAD8MgFfAAAAAF3AAPwyAV8AAAFKioEBHop4wADNvQIBXwAAAi6AiqzAYFHoAAbAAMEvToq3iryLngAAg/gAAAABA4rDi54AAAABAQGKyQAAAIihYQFfAABcAABcAT4CTormiu0AAGFgwAD70AEWivQuYcAA/KNFiwABiwmLCwAAYmDAAPvQAZMBHIsSgosQwGBSa2MBAAGBixTAYFJRAMAA/P0BioscwGBSaxyLHYKLHMBgUmtkAQABlADAAPz1PgI9HIsvgIspwGBSPSABAAEcizQuSwEAAYKLNcBgUmsAwAD8gwAASYtAIRyLS4GLRMBgUlFIAQABFotTLmHAAPyjAMAA/PM+AT0wi2Ufi2vAAPt3AQABLgA/BsAAwSZOi6OLyovgAQCBVQFqi6RgwAD50cAAtcUAAAEDi9KL4AAAAAAAAABgwAD6CgFKi9UBHIvcFovVLmHAAPyjSAEAAZMAwAD88wbAAMEnTovli+6MBAEAg7IAAAABA4v5jAQAAAAAAAAAYMAA+goBSov8ASEWi/0ugVXAAMFtBsAAwShOjAmMD4xqAQCDGQAAAAEDjBWMagAAAAAAAABfAAABPgJJjBscjCYWjB8uYcAA/KNIAQABkwDAAPzzPTCMLB6MR8AAzfIAAAAAP0qMWAEcjGMuSwEAAZMAwAD8gwbAAMFjToxvjHiM3QIAgxkAAAABA4x9jN0AAAABAQGMgAAAIICWXwAAAABcAT4CSYyNHIyYFoyRLmHAAPyjSAEAAZMAwAD88z0wjJ4ejLnAAM3yAAAAAD89HIzOLoC/AgACk4CM1MBgVAsAwAD8hAbAAMEpTozijOiNSwEAgegAAAABA4ztjUsAAAAAAAAAXwAAAT4CSYzzHIz+Foz3LmHAAPyjSAEAAZMAwAD88z0wjQQejR/AAM3yAAAAAD9KjTABHI07LksBAAEcjUMWjTwuYcAA/KOBjQEAAZQAwAD89gDAAPyDBsAAwWROjVCNWY3GAgCB6AAAAAEDjV2NxgAAAAEBAY1gAAAggJZfAAAAAFwBPgJJjW0cjXgWjXEuYcAA/KNIAQABkwDAAPzzPTCNfh6NmcAAzfIAAAAAPz0cja4ugL8CAAIcjbYWja8uYcAA/KOBjQEAAZQAwAD89oCNvcBgVPEAwAD8hAbAAMEqTo3LjdGOZwEAgMMAAAABA43YjmcAAAAAAAAAXwAAAT4DSY3eHI3pFo3iLmHAAPyjSAEAAZMAwAD88z0wje8ejgrAAM3yAAAAAD9JjhscjiYWjh8uYcAA/KOAlwEAAZQAwAD8/z0wjisejkbAAM3zAAAAAD9KjlUBHI5gLksBAAGTAMAA/IMGwADBME6ObI5xj3IAAIMXAAAAAQOOeY9yAAAAAQEBjoEAAACWIGDAAP0cAABgwAD6CgE+A06OlI6bAABhYMAA+9ABFo6iLmHAAPyjRY6uAY63jrkAAGJgwAD70AGTARyOwIKOvsBgVjJjAQABgY7CwGBWGADAAPz9AYqOysBgVjIcjsuCjsrAYFYyZAEAAZQAwAD89T4CSY7XHI7jHI7fLksBAAGCjuDAYFYyAMAA/INIAQABgI7mwGBWAQDAAP0pSo7vASk/SY8CIRyPDYGPBsBgVhhIAQABFo8VLmHAAPyjAMAA/PM+AT0wjycfjy3AAPt3AQABLgA/So9iASoGwADBMU6Pd498kHwAAJYwAAAAAQOPgZB8AAAAAQEBj4cAAACW+WEBXwAAYMAA+goAAGDAAPoKAT4DTo+ij6kAAGFgwAD70AEWj7AuYcAA/KNFj7wBj8WPxwAAYmDAAPvQAZMBHI/Ogo/MwGBXNmMBAAGBj9DAYFccAMAA/P0Bio/YwGBXNhyP2YKP2MBgVzZkAQABlADAAPz1PgJJj+UhHI/ugI/qwGBXACABAAEcj/MuSwEAAYKP9MBgVzYAwAD8gwAASo/5ASo/SZANIRyQGIGQEcBgVxxIAQABFpAgLmHAAPyjAMAA/PM+AT0wkDIfkDjAAPt3AQABLgA/SpBtASkGwADBMk6QgZCGkYMAAIHUAAAAAQOQiZGDAAAAAQEBkI8AAACW+WEBXwAAYMAA+goAAGDAAPoKAT4DTpCqkLEAAGFgwAD70AEWkLguYcAA/KNFkMQBkM2QzwAAYmDAAPvQAZMBHJDWgpDUwGBYOGMBAAGBkNjAYFgeAMAA/P0BipDgwGBYOByQ4YKQ4MBgWDhkAQABlADAAPz1PgJJkO0ckPWAkPHAYFgCIAEAARyQ+i5LAQABgpD7wGBYOADAAPyDAABKkQABKT9JkRMhHJEegZEXwGBYHkgBAAEWkSYuYcAA/KMAwAD88z4BPTCROB+RPsAA+3cBAAEuAD9KkXMBKgbAAMEzTpGIkYqS/QAAljQAAAABA5GUkv0AAAACAQGRmgAAAJb5YQFfAABgwAD6CgABka4AACCWNWEAXwAAAWoAYMAA/Nl3XwAAAT4ETpHDkcoAAGFgwAD70AEWkdEuYcAA/KNFkd0BkeaR6AAAYmDAAPvQAZMBHJHvg5HtwGBZTGMBAAGCkfHAYFkyAMAA/P0Bi5H5wGBZTByR+oOR+cBgWUxkAQABlADAAPz1PgNOkgiSEAAAliBfAAABHJIWLksBAAGDkhfAYFlMAMAA/INJkiEckimAkiXAYFkDIAEAAYSSKsBgWZQAAEqSNAGEkjvAYFmUP0mSSiEcklWCkk7AYFkySAEAARaSXS5hwAD8owDAAPzzPgE9MJJvH5J1wAD7dwEAAS4AP0mSqiEckrWBkq7AYFkWSAEAASsAwAD9KUqSvgEcksuBksXAYFkWIAAAAAAAPz0wktMeku7AAM3yAAAAAAbAAME0TpMCkwSUewAAljkAAAABA5MNlHsAAAACAQGTEwAAAJb5YQFfAABgwAD6CgABkycAACCWNWEAXwAAAWoAYMAA/Nl3XwAAAT4ETpM8k0MAAGFgwAD70AEWk0ouYcAA/KNFk1YBk1+TYQAAYmDAAPvQARyTaoKTY8BgWpeBjQEAAZQAwAD89gEck3GDk2/AYFqxgW0BAAGTAMAA/QABi5N3wGBasRyTeIOTd8BgWrGBjQEAAZQAwAD89j4DTpOGk44AAJYgXwAAARyTlC5LAQABg5OVwGBasQDAAPyDSZOfHJOngJOjwGBaaCABAAGEk6jAYFsJAABKk7IBhJO5wGBbCT9Jk8ghHJPTgpPMwGBal0gBAAEWk9suYcAA/KMAwAD88z4BPTCT7R+T88AA+3cBAAEuAD9JlCghHJQzgZQswGBae0gBAAErAMAA/SlKlDwBHJRJgZRDwGBaeyAAAAAAAD89MJRRHpRswADN8gAAAAAGwADBNU6UgJSClsQAAJY8AAAAAQOUjZbEAAAAAgEBlJMAAACW+WEBXwAAYMAA+goAAZSnAAAgljVhAF8AAAFqAGDAAPzZd18AAAE+B06UvJTDAABhYMAA+9ABFpTKLmHAAPyjTpTYAAAAX18AAABOlOiU8wAAn6lgwAD6CgEqRZUAAZUJlQsAAGJgwAD70AGTARyVEoWVEMBgXEFjAQABgpUUwGBcDADAAPz9AY2VHMBgXEEclR2FlRzAYFxBZAEAAZQAwAD89T4DTpUrlTMAAJYgXwAAARyVOS5LAQABhZU6wGBcQQDAAPyDSZVEHJVMgJVIwGBb3SABAAGGlU3AYFyJAAA+A0mVYYSVZcBgXC4+AT0wlX0elZjAAM3zAAAAAD89jJW1wGBcLik9i5XQwGBcI4aV2MBgXIk/SZXvIRyV+oKV88BgXAxIAQABFpYCLmHAAPyjAMAA/PM+AT0wlhQflhrAAPt3AQABLgA/SZZPhJZTwGBcLkqWXwGDlmbAYFwjP0mWcSEclnyBlnXAYFvwSAEAASsAwAD9KUqWhQEclpKBlozAYFvwIAAAAAAAPz0wlpoelrXAAM3yAAAAAAbAAME2TpbJltCXdQAAWAAAAAEDltSXdQAAAAEAAZbdAAAAga9gwAD9tgFqlulgwAD9toQGAGDAAP22AT4DSZb0HJb/Fpb4LmHAAPyjSAEAAZMAwAD880qXBQEnAD9OlyGXKAAAgotgwAD+AAE1lyoAAAEAYMAA/gABH5cqwAD+HwAAAAA1AAAAAQBbARyXOoGXOMBgXe2fqgIAAi6Al0nAYF2dAMAA/haBAMBgXe1Kl1kBHJdngZdgwGBd3iMAAAAAwAD+GQbAAME3Tpd6l4aXwQAAgaUAAAABA5eLl8EAAAABAQGXkQAAAJb5YQFfAABgwAD6CgAAXcAA/DIBXwAAAUqXpQEfl6XAAM0HAgFfAAACLoCXvMBgXmQABsAAwThOl8aX0pf+AACWQAAAAAEDl96X/gAAAQAAgnZgwAD9HAFbAAAAAF3AAPwyAV8BAAFKl+QBH5fkwADN5QEBXwEAAS4ABsAAwTlOmAOYD5hKAACAqwAAAAEDmBWYSgAAAQAAgnZgwAD9HAFbAQEBmBgAAACBpmEBXwAAXwEAAABdwAD8MgFfAQABSpgpAR+YKcAAzPwCAl8AAF8BAAIugJhIwGBfDQAGwADBOk6YT5hbmKUAAISJAAAAAQOYZJilAAABAACCdmDAAP0cAVsBAQGYcQAAAIGmYQFfAABdwAD8MgFfAQAAAF3AAPwyAV8BAAFKmIgBH5iIwADNGwICXwAAXwEAAi6AmKPAYF9vAAbAAME7TpiqmKyaEgAAljoAAAABA5iymhIAAAABAQGYtQAAIIcXYQJfAABfAABfAAAAAF8AAAE+BU6Y5JjrAABhYMAA+9ABFpjyLmHAAPyjSZj+HJkJgZkCwGBf50gBAAGTAMAA/PM9MJkPHpkqwADN8gAAAAA/Tpk9mUMAAICWXwAAARyZSS5LAQABkwDAAPyDRZlSAZlbmV0AAGJgwAD70AGUARyZZIOZYsBgYENjAQABgZlmwGBf5wDAAPz9AYuZbsBgYEMcmW+DmW7AYGBDZAEAAZQAwAD89T4CPYqZe8BgYCUcmYqAmYPAYF/MIAIAAoKZi8BgYCUcmZYuSwEAAYOZl8BgYEMAwAD8gwAASZmiIRyZrYGZpsBgX+dIAQABFpm1LmHAAPyjAMAA/PM+AT0wmccfmc3AAPt3AQABLgA/SpoCAYKaCcBgYCUGwADBPE6aF5oZm1oAAINZAAAAAQOaIJtaAAABAACCdmDAAP0cAVsCAgKaIwAAAJY2XwEAAJozAAAAhxdhAl8BAF8AAF8BAAAAXwEAAT4ETppimmgAAICWXwEAAYCaasBgYSVOmoCahwAAYWDAAPvQARaaji5hwAD8o0WamgGao5qlAABiYMAA+9ABkwEcmqyEmqrAYGF5YwEAAYOarsBgYV8AwAD8/QGMmrbAYGF5HJq3hJq2wGBheWQBAAGUAMAA/PU+Aj2KmsPAYGFLHJrSgZrLwGBhMCACAAKCmtPAYGFLHJreLksBAAGEmt/AYGF5AMAA/IMAAEma6iEcmvWDmu7AYGFfSAEAARaa/S5hwAD8owDAAPzzPgE9MJsPH5sVwAD7dwEAAS4AP0qbSgGCm1HAYGFLBsAAwT1Om1+ba5ujAACWKQAAAAEDm2+bowAAAAEBAZt0AAAAgO5gwAD70AAAXcAA/DIBXwAAAUqbfgEfm37AAMzCAwFfAAADLoCbl8BgYlArAAbAAME+Tpuom7ScBQAAlj0AAAABA5u9nAUAAAABAQGbwwAAAJb5YQFfAABgwAD6CgAAXcAA/DIBXwAAAT4BSpvaAR+b4cAAzYUCAV8AAAIugJv8wGBiogAGwADBP06cCpwWnEsAAJY+AAAAAQOcGpxLAAAAAQEBnB8AAACA7mDAAPvQAABdwAD8MgFfAAABSpwpAR+cKcAAzMIDAV8AAAMuk4CcRcBgYvoABsAAwUBOnFCcXJytAACWPwAAAAEDnGWcrQAAAAEBAZxrAAAAlvlhAV8AAGDAAPoKAABdwAD8MgFfAAABPgFKnIIBH5yJwADNTQIBXwAAAi6AnKTAYGNMAAbAAMFBTpyynLqdugAAgK0AAAABA5zAnboAAAABAAABnMcAAACFWGDAAPoKAWqc0mDAAPoKdV3AAPx0AV8AAAE+BE6c5wAAAIF2XcAA/HQBXwAAAEmc84Cc98BgY6U+AT2JnQnAYGPINZ0VAAABAF3AAPx0AV8AAAExnRVfAAAANQAAAAEAWwEXnRmCnRfAYGPuYRadIi5hwAD8o8AA/KGCAMBgY+4+AT2JnT3AYGPIHp1GwAD1ywEBXwAAARadTi5hwAD8owBFnWEBnWqdbAAAYmDAAPvQAZMBHJ1zgp1xwGBkUGMBAAEWnXUuYcAA/KMAwAD8/QGKnX3AYGRQHJ1+gp19wGBkUGQBAAGUAMAA/PU+AT0cnZCBnYrAYGPIgL8CAAKCnZHAYGRQHJ2aLksBAAGCnZvAYGRQAMAA/IMAwAD8hEqdqQGBnbDAYGPIBsAAwUJOnb+dxp5LAACVEwAAAAEDncueSwAAAAAAAABdwAD9ZwFfAAABPgNOndud4gAAgXZdwAD9ZwFfAAABHp3kwADA4gABXwAAAABFnfIBnfud/QAAYmDAAPvQAZMBHJ4EgZ4CwGBlJWMBAAEWngYuYcAA/KMAwAD8/QGJng7AYGUlHJ4PgZ4OwGBlJWQBAAGUAMAA/PU+AT0cniKAnhvAYGUBVgEAARyeKi5LAQABgZ4rwGBlJQDAAPyDAMAA/XRKnjoBgJ5BwGBlAQbAAMFDTp5lnmqeoAAAVgAAAAEDnm2eoAAAAAEBAZ5wAAAgliBfAAAAAFwBPgE9HJ6DLoC/AgACNQAAAAEAYMAA+9ABFp6JLmHAAPyjNQAAAAEAYMAA+9ABF56JLmEcno+BAMBgZdpkAQABlADAAPz1wAD8oYEAwGBl2oCelcBgZb8AwAD8hAbAAMFETp6lnqqfmAAAgKUAAAABA56wn5gAAAABAQGevQAAIIPMXcAA/DIBXwAAAABcAT4CTp7RntMAAGJgwAD70AEWntouYcAA/KNGnuYAnu0AAACWIF8AAACAnvjAYGZHPgRAIhyfHRafFi5hwAD8o0gBAAGBnyDAYGZeAMAA/PMBMJ8mH58swAD7dwEAAS4AnxGfTgA9F59cLmEcn2eBn2XAYGZeZAEAAZQAwAD89cAA/KE9HJ92LoC/AgACgZ93wGBmXoKffMBgZngAwAD8hD2Jn4vAYGZeHJ+MgZ+LwGBmXmQBAAGUAMAA/PUGwADBRU6fnZ+ioGAAAIRZAAAAAQOfqKBgAAAAAQEBn7AAAACWIGDAAP0cAABgwAD6CgE+AkWfvwGfyJ/KAABiYMAA+9ABkwEcn9GBn8/AYGdPYwEAARaf2C5hwAD8owDAAPz9AYmf4MBgZ08cn+GBn+DAYGdPZAEAAZQAwAD89T4BSZ/tHJ/5HJ/1LksBAAGBn/bAYGdPAMAA/INIAQABgJ/8wGBnNQDAAP0pPgI9HKAULp+rwAC9lwIAAoGgHsBgZ08coCOBoCHAYGdPZAEAAZQAwAD89QDAAMGOSqAxASk/SqBQASoGwADBR06g4aDmof4AAJ+rwAC9lwAAAAEDoO+h/gAAAAICAqD0AAAAamDAAPvQAKD/AAAAgoxgwAD70AAAXAE+B06hDqEVAABhYMAA+9ABFqEcLmHAAPyjQByhMZOBawEAAYChNMBgaCAAwAD8/qEvoTkAQByhTYChR8BgaCBjAQABgaFPwGBoLADAAPz9oUehUgBAHKFkgaFgwGBoLIFrAQABgqFnwGBoPwDAAPz+oWChbQBOoXihfQAAmIBgwAD70AEcoYOBoX/AYGgsgY0BAAGAoYXAYGggAMAA/PZFoZABoZmhmwAAYmDAAPvQAYGhncBgaCwBHKGkhKGiwGBo32MBAAGCoabAYGg/AMAA/P0BjKGuwGBo3xyhr4ShrsBgaN9kAQABlADAAPz1PgE9HKG/LoC/AgACHKHChKHAwGBo34GNAQABg6HEwGBosgDAAPz2HKHQLksBAAGEodHAYGjfAMAA/IMAwAD8hD0XoeQuYRyh9IKh7cBgaD+BjQEAAYOh9sBgaLIAwAD89sAA/KEGwADBSk6iA6IIokgAAJb4AAAAAQOiE6JIAAAAAQEBohkAAACW+WEBXwAAYMAA+goAAFwBPgE9HKIwLp+swAC9lwIAAoCiOMBgaa4qAMAAwY8GwADBS06iTaJSopEAAJb7AAAAAQOiXaKRAAAAAQEBomMAAACW+WEBXwAAYMAA+goAAFwBPgE9HKJ6Lp+swAC9lwIAAoCigsBgaf8pAMAAwY8GwADBSE6ilqKbpJAAAJ+swAC9lwAAAAEDoqKkkAAAAAICAqKoAAAAlvlhAV8AAGDAAPoKAKK+AAAAn61gwAD6CgAAXAE+BE6i3KLlAACfrl3AAPx0AV8AAAExoupfAAAATqL2ov0AAGFgwAD70AEWowQuYcAA/KNFoxABoxmjGwAAYmDAAPvQAZMBHKMihKMgwGBqrWMBAAGDoyTAYGqTAMAA/P0BjKMswGBqrRyjLYSjLMBgaq1kAQABlADAAPz1PgNOoz2jRQAAliBfAAABHKNLLksBAAGEo0zAYGqtAMAA/INJo1Yco2gco16Ao1rAYGpUIAEAAYWjX8BgavUAAEgBAAGBo2vAYGpmAMAA/Sk+AT0co46Co4XAYGp5VgEAAYWjksBgavUAwAD8hT9Jo6ohHKO1g6OuwGBqk0gBAAEWo70uYcAA/KMAwAD88z4BPTCjzx+j1cAA+3cBAAEuAD9JpAohHKQeFqQXgqQOwGBqeWHAAPyjSAEAARakJi5hwAD8owDAAPzzPgI9HKQ7LoNeAwADkxakUIKkR8BganlhwAD8o4KkWMBgankAwADBnj0XpG4uYRakgIKkd8BganlhwAD8o8AA/KE/BsAAwUxOpJWkmqS7AACCQgAAAAEDpJ+kuwAAAAAAAABcAT4BPRekrS5hk8AA/KEGwADBTU6kwKTIpO4AAJYyAAAAAQOkz6TuAAABAACW82DAAP0cAVsAAAAAXcAA/HQBXwEAAUqk1QEepNrAAPx/AQJfAABfAQABLgAGwADBTk6k8qT0pZIAAIYRAAAAAQOk/qWSAAAAAAAAAF8AAAE+BEmlBxylEhalCy5hwAD8o0gBAAGTAMAA/PM+AT0wpSAepTvAAM3yAAAAAD9OpVSlWwAAgXZfAAABHKVhLksBAAEcpWkWpWIuYcAA/KOBjQEAAZQAwAD89gDAAPyDPRelcy5hHKV5FqVzLmHAAPyjgY0BAAGUAMAA/PbAAPyhSqWBAYCliMBgbMkGwADBT06ll6WcpesAAICuAAAAAQOloKXrAAAAAQABpaYAAACbGWECXwAAXwAAYMAA+9ABagBgwAD82XcAXAE+AT0epcXAAM6IAgFfAAACLjUAAAABAGECXwAAXwAAYMAA+9ABgKXQwGBtRCMcpdiBAMBgbXZIAQABKwAAaqXbYQJbW2DAAPvQwAC12YEAwGBtdgFhAl8AAF8AAGDAAPvQAAbAAMFJTqXwpfumpgABn6/AAL2XAAAAAQOmBqamAAAAAgICpgcAAACB1VsApgoAAACCSlsAAGDAAPvQAT4BSqaDAR6mlcAA+hkCAAImpp0BgKadwGBt6V3AAPoWAVsmpqABgaagwGBt8l3AAPoWAVsABsAAwVBOpqumsKezAACfsAAAAAEDprenswAAAAEAAabAAAAAn7FgwADQOAFqAGDAAPzZdwBcAT4DPSMcptaAps/AYG5WSAEAASsAwAD9KYimz8BgblYeptrAANA6AAAAACsBYMAA0DhOpuym8wAAYWDAAPvQARam+i5hwAD8o0OnBhynFIGnDcBgbqCAlwEAAZQAwAD8/z4FTqclpykAAJ+yYMAA+9ABHKcygKcrwGBuVp+zAQABgac6wGBuoADAANA9PYmnScBgbqAcp1CBp0nAYG6ggY0BAAGUAMAA/PZOp2CnZAAAn7RfAAABHKdqLksBAAGBp2vAYG6gAMAA/IM9HKd+LoC/AgACgad/wGBuoBynjS5LAQABgqeOwGBu0QDAAPyDAMAA/IQ9HKeeLoC/AgACgqefwGBu0YOnpsBgbxgAwAD8hAbAAMFRTqe4p8Sn8QAAnGIAAAABA6fJp/EAAAAAAAAAXcAA/KUCYMAA+9BfAAABPgFKp9IBH6fZwADOaQEBXwAAAS4ABsAAwVJOp/aoB6jRAwBkAAAAAQOoCKjRAAAAAQEBqBEAACCD1l3AAPx0AV8AAAAAXcAA/HQBXwAAAT4ETqgiqCkAAIF2XcAA/HQBXwAAATWoLgAAAQBdwAD8dAFfAAABMaguXwAAADUAAAABAFsBF6gygagwwGBwE2EcqEgWqEEuYcAA/KNkAQABFqhQgKhKwGBv4WHAAPyjAMAA/PXAAPyhgQDAYHATPRyoZIGoXcBgcACDXgMAA5MWqHUuYcAA/KMuAMAA/Jk9HKiPgaiIwGBwAINeAwADFqidLmHAAPyjFqisgailwGBwAGHAAPyjgKi0wGBv4QDAAPyZSqjAAYGox8BgcAAGwADBU06o1qjeqiAAAIFYAAAAAQOo5aogAAAAAgECqOoAAABqYMAA+9AAqPYAAACCjGDAAPvQAWoAYMAA/Nl3AF3AAPx0AV8AAAE+B06pBqkRAACftWDAAPvQARapGC5hwAD8oz0jHKkogakkwGBw9UgBAAErAMAA/POJqSTAYHD1gqkswGBxGCsBYMAA+9A9HqlHwAD7EQMAA4CpV8BgcOmBqV7AYHD1gqljwGBxGABOqXipfwAAYWDAAPvQARyphYGpgcBgcPWBjQEAAYCph8BgcOkAwAD89k6pmqmhAACBdl3AAPx0AV8AAAE1qaYAAAEAXcAA/HQBXwAAATGppl8AAAA1AAAAAQBbARepqoSpqMBgcbhhg6mzwGBxfMAA/KGEAMBgcbhFqb8BqcipygAAYmDAAPvQAZMBHKnRhanPwGBx92MBAAGDqdPAYHF8AMAA/P0BjanbwGBx9xyp3IWp28BgcfdkAQABlADAAPz1PgE9HKnuhKnowGBxpYC/AgAChanvwGBx9xyp+C5LAQABHKn/gKn5wGBw6WQBAAGFqgHAYHH3AMAA/PUAwAD8gwDAAPyESqoPAYSqFsBgcaUGwADBVE6qJaoxqrwAAJ+2AAAAAQOqOaq8AAAAAgICqj4AAABqYMAA+9AAqkkAAACCjGDAAPvQAABdwAD8MgFfAAABPgI9HqpfwAD7EQMAA4Cqb8BgcquBqnbAYHK3FqqALmHAAPyjAEqqjQEfqpTAAMzCAwFfAAADLoCqrcBgcquBqrTAYHK3AAbAAMFVTqrBqsarXQAAn7cAAAABA6rRq10AAAACAgKq1gAAAGpgwAD70ACq4QAAAIKMYMAA+9AAAFwBPgI9Hqr3wAD7EQMAA4CrB8BgczSBqw7AYHNAFqsYLmHAAPyjAEmrJRyrLYGrKcBgc0CAlwEAAYCrL8BgczQAwAD8/z4BPRyrPi6fq8AAvZcCAAKAq0jAYHM0gatPwGBzQADAAMGOPwbAAMFWTqtiq2esEAAAm6kAAAABA6twrBAAAAADAgOrdQAAAGpgwAD70ACrgAAAAIKMYMAA+9AAq4gAACCfuF8AAAFqAGDAAPzZdwBcAT4CPR6roMAA+xEDAAOAq7DAYHPWgau3wGBz4harwS5hwAD8owBFq84Bq9er2QAAYmDAAPvQAYCr28Bgc9YBHKvkg6viwGB0LmMBAAGBq+bAYHPiAMAA/P0Bi6vrwGB0Lhyr7IOr68BgdC5kAQABlADAAPz1PgE9HKv8LoC/AgACg6v9wGB0LoKsAsBgc+8AwAD8hAbAAMFXTqwVrBqv2gAAg14AAAABA6wir9oAAAAEAwSsJwAAAGpgwAD70ACsMgAAAIKMYMAA+9AArEMAACCDzF3AAPwyAV8AAACsUgAAAJ+5YMAA+9ABaqxeYMAA+9AJAFwBPgk9HqxzwAD7EQMAA4Csg8BgdLeBrIrAYHTDFqyULmHAAPyjAE6spaysAABhYMAA+9ABHKyygayuwGB0w4GNAQABgKy0wGB0twDAAPz2Say/HKzKhKzDwGB1IEgBAAGTAMAA/PNKrNAAPz0erOfAAPsSAgACg6z4wGB04SefuQBOrR4AAACful3AAPx0AV8AAABOrTEAAACfu2DAAPvQAEmtbyWtfIKtc8BgdNBdwAD8dAFfAAA+Aj2NrZDAYHV7FK2cwGB00AIBXcAA/HQBXwAAPY6trMBgdY2DrbnAYHThPgI9ja3XwGB1exyt/Byt7IKt48BgdNCWKQEAAYOt8cBgdOEAwAD8TICtAQAAAYVYKsAA/Eg9jq4bwGB1jZNJrjUcrk0crkSGrjnAYHWNZAEAAYSuRsBgdSAAwAD89YCXAQABFq5Zha5PwGB1e2HAAPyjAMAA/P8+AT0wrmkeroTAAM30AAAAAD9JrpgcrqeGrpzAYHWNYwEAAYCuqcBgdLcAwAD8/T4BRa76Aa8DrwUAAGJgwAD70AEcrw6ErwfAYHUggY0BAAGUAMAA/PYBHK8Vh68TwGB2h4FtAQABkwDAAP0AAY+vG8BgdoccrxyHrxvAYHaHgY0BAAGUAMAA/PY+AT0cry4ugL8CAAIcrzWAry/AYHS3ZAEAAYevN8BgdocAwAD89RyvRYWvPMBgdXtLAQABHK9Rhq9GwGB1jWQBAAGHr1PAYHaHAMAA/PUAwAD8gwDAAPyEPgFFr3IBr3uvfQAAYmDAAPvQAZMBHK+Eh6+CwGB3OmMBAAGEr4bAYHUgAMAA/P0Bj6+OwGB3Ohyvj4evjsBgdzpkAQABlADAAPz1PgE9HK+hLoC/AgACHK+ogK+iwGB0t2QBAAGHr6rAYHc6AMAA/PUcr7iFr6/AYHV7SwEAARyvxIavucBgdY1kAQABh6/GwGB3OgDAAPz1AMAA/IMAwAD8hAbAAMFYTq/fr+SzIAAAn7wAAAABA6/wsyAAAAADAwOv9QAAAGpgwAD70ACwAAAAAIKMYMAA+9AAsBEAACCfvV3AAPwyAV8AAAAAXAE+BT0esC/AAPsRAwADgLA/wGB39oGwRsBgeAIWsFAuYcAA/KMASbBdISWwbYKwYcBgeA9dwADMjgFbPgE9irCSwGB4DxywrIKwoMBgeA+ArQAAAADAAPxIP06wxLDRAACfvmDAAPvQARyw14Gw08BgeAKBjQEAAYCw2cBgd/YAwAD89k6w6LD1AACfv2DAAPvQARaxA4Kw98BgeA9hwAD8VUmxDxyxIIOxE8BgeH2BbQEAAYSxI8BgeKcAwAD9AD4DTrE9sUcAAJ/AYMAA+9ABHLFPgLFJwGB39mQBAAGEsVHAYHinAMAA/PU9HLFqLoNeAwADgLFzwGB39oWxesBgeOWCsYXAYHgPAMAAwZ5JsZkcsaqDsZ3AYHh9gJcBAAGEsazAYHinAMAA/P8+AT0cscQun6vAAL2XAgAChbHOwGB45YGx2cBgeAIAwADBjj8+Bk6x/rIEAACbKGDAAPvQARyyE4SyBsBgeKeBjQEAAYOyFcBgeH0AwAD89k6yLbI3AACXUWDAAPvQARyyRRayPi5hwAD8o2QBAAGFskfAYHl2AMAA/PVOsliyYgAAn8BgwAD70AEcsmqAsmTAYHf2ZAEAAYSybMBgeKcAwAD89T0XspouYYayo8BgeaDAAPyhPRyyuS6DXgQABIeywsBgecuGss3AYHmgLoGy3sBgeAIAwADBnj0csu8ug14DAAOAsvjAYHf2h7L/wGB5y4KzCsBgeA8AwADBngbAAMFZTrMlsymz4QAAgLsAAAABA7Mws+EAAAACAQKzOAAAIJYgYMAA/RwAs0YAAABqYMAA+9ABarNOYMAA+9AJAGDAAPvQAT4DSbNYHLNigbNcwGB6eWMBAAGTAMAA/P09ibNnwGB6eZM/RbN2AbN/s4EAAGJgwAD70AGBs4PAYHp5ARyzjIKzisBgerxjAQABFrOTLmHAAPyjAMAA/P0BirObwGB6vByznIKzm8BgerxkAQABlADAAPz1PgFJs6gcs7Qcs7AuSwEAAYKzscBgerwAwAD8g0gBAAGAs7fAYHpsAMAA/SlKs8ABgrPHwGB6vD9Ks9QBHLPblIHEAAAAAMAA+/MGwADBWk6z5rPqtKYAAJ/BAAAAAQOz9LSmAAAAAgECs/oAAACW+WEBXwAAYMAA+goAtBAAAABqYMAA+9ABarQYYMAA+9AJAGDAAPvQAT4DSbQiHLQsgbQmwGB7hGMBAAGTAMAA/P09ibQxwGB7hJM/RbRAAbRJtEsAAGJgwAD70AGBtE3AYHuEARy0VoK0VMBge8djAQABFrRdLmHAAPyjAMAA/P0BirRlwGB7xxy0ZoK0ZcBge8dkAQABlADAAPz1PgFJtHIctHqAtHbAYHtyIAEAARy0fy5LAQABgrSAwGB7xwDAAPyDAABKtIUBgrSMwGB7xz9KtJkBHLSglIHEAAAAAMAA+/MGwADBW060q7SvtYgAAJZaAAAAAQO0urWIAAAAAgECtMIAACCWIGDAAP0cALTQAAAAamDAAPvQAWoAYMAA/Nl3AGDAAPvQAT4DSbTeIhy06IG04sBgfIdIAQABKwDAAPzzARy0+YG088BgfIeBbQEAARa1AS5hwAD8owDAAP0APYm1CcBgfIcctR0WtRYuYcAA/KOBjQEAAZQAwAD89j9FtSYBtS+1MQAAYmDAAPvQAYG1M8BgfIcBHLU8grU6wGB8/oFtAQABkwDAAP0AAYq1QsBgfP4ctUOCtULAYHz+gY0BAAGUAMAA/PY+AUm1Txy1Wxy1Vy5LAQABgrVYwGB8/gDAAPyDSAEAAYC1XsBgfHoAwAD9KUq1ZwGCtW7AYHz+P0q1ewEctYKUgcQAAAAAwAD78wbAAMFcTrWNtZG2bgAAn8IAAAABA7Wftm4AAAACAQK1pQAAAJb5YQFfAABgwAD6CgC1uwAAAGpgwAD70AFqAGDAAPzZdwBgwAD70AE+A0m1ySIctdOBtc3AYH3ASAEAASsAwAD88wEcteSBtd7AYH3AgW0BAAEWtewuYcAA/KMAwAD9AD2JtfTAYH3AHLYIFrYBLmHAAPyjgY0BAAGUAMAA/PY/RbYRAbYathwAAGJgwAD70AGBth7AYH3AARy2J4K2JcBgfjeBbQEAAZMAwAD9AAGKti3AYH43HLYugrYtwGB+N4GNAQABlADAAPz2PgFJtjoctkKAtj7AYH2uIAEAARy2Ry5LAQABgrZIwGB+NwDAAPyDAABKtk0BgrZUwGB+Nz9KtmEBHLZolIHEAAAAAMAA+/MGwADBXU62c7Z4t7IAAJ7KAAAAAQO2freyAAAAAgICtoMAAAAnYMAA+9AAtowAACCWIF8AAAAAXAE+Bj0etqnAAPr8AgACgLa2wGB+5CcnAD0ettbAAPsPBAAEgLbrwGB+5JMWtvUuYcAA/KMnJwBJtwsctxWAtw/AYH7kSAEAARa3HS5hwAD8owDAAPzzPgI9HLctLlYBAAGBtzHAYH7wAMAAwYpKt0EAPz0Xt1guYRy3Xha3WC5hwAD8o2QBAAGUAMAA/PXAAPyhPRy3Zi6DXgQABBy3dYC3b8BgfuRkAQABlADAAPz1Frd/LmHAAPyjLoC3jcBgfuQAwADBnj0ct50ugL8CAAKAt57AYH7kgbenwGB+8ADAAPyEBsAAwV5Ot7e3ubghAACfwwAAAAEDt8G4IQAAAAEBAbfGAAAAJ2DAAPvQAABfAAABPgNOt9W33AAAgXZfAAABHLfiLksBAAGAt+PAYH//AMAA/IM9HLfvLp+rwAC9lwIAAoC3+cBgf/8cuAaAuADAYH//ZAEAAZQAwAD89QDAAMGOSrgQAYG4F8BggBMGwADBX064Jrgru5oAAJ/EAAAAAQO4NLuaAAAAAgICuDkAAAAnYMAA+9AAuEwAACCDzF3AAPwyAV8AAAAAXAE+Bz0euGfAAPsPBAAEgLh8wGCAi5MWuIYuYcAA/KMnJwBJuJwiISW4qYG4oMBggJddwADMjgFbAR64yMAA9bECAAKBuNLAYICXLgA+AT2JuOvAYICXHLj/gbj2wGCAl4CtAAAAAMAA/Eg/TrkXuScAAJ/FYMAA+9ABFrkygbkpwGCAl2HAAPxVPRe6HC5hHLojFrocLmHAAPyjZAEAAYK6JsBggRYAwAD89cAA/KFJujshHLpPFrpIgbo/wGCAl2HAAPxVSAEAAYK6UsBggRYAwAD88z4CPRe65i5hHLrtFrrmLmHAAPyjgY0BAAGCuvDAYIEWAMAA/PbAAPyhPTC7Bx+7DcAA+3cBAAGBuynAYICXAD89HLs+LoNeBAAEHLtNgLtHwGCAi2QBAAGCu0/AYIEWAMAA/PUWu2UuYcAA/KMugLtzwGCAiwDAAMGePRy7fy6fxgIAAoC7hsBggIuBu43AYICXAMAAwacGwADBYE67n7ukvIYAAJ/GAAAAAQO7qryGAAAAAgICu68AAAAnYMAA+9AAu8IAACCDzF3AAPwyAV8AAAAAXAE+AUm70iW734G71sBggkFdwAD8dAFbPgE9HLvwLoNeAwADgLv5wGCCNRy8BoC8AMBggjVkAQABFrwRgbwIwGCCQWHAAPxVAMAA/PWBvBnAYIJBAMAAwZ4+AUa8NwC8PgAAAJYgXwAAAIG8ScBggkE+AT0cvGEugL8CAAI1AAAAAQBgwAD70AGAvGLAYII1NQAAAAEAYMAA+9ABiLxiwGCCNRy8Z4MAwGCC0WQBAAGUAMAA/PWDAMBggtGCvG3AYIKyAMAA/IQGwADBK068i7ybvMQBAJiCAAAAAQO8pLzEAAAAAAAAAF3AAPwyAV8AAAFKvKcBH7ynwADOcwEBXwAAAS4ABsAAwWFOvMm80L0PAAAjAAAAAQO82L0PAAAAAAAAAGDAAP22AUq83gEevOvAAMDEAwADLieZjieZjwAAAGBRRQBgUYEAYFHJAGBSHgBgUwoAYFNWAGBTiwBgU+wAYFRbAGBU0gBgVVcAYFXiAGBW4QBgV+MAYFjkAGBaSQBgW74AYF1/AGBeRQBgXpsAYF7jAGBfRQBgX60AYGD7AGBiMQBgYoMAYGLbAGBjLQBgY4UAYGTUAGBloQBgZigAYGcWAGBn/QBgaY8AYGngAGBqMQBga/0AYGwsAGBsdwBgbSUAYG3GAGBuNwBgb38AYG/DAGBwygBgcowAYHMVAGBztwBgdJgAYHfXAGB6TQBge1MAYHxbAGB9jwBgfsUAYH/gAGCAbABgghYAYIMbAGCDWABgg5MAAAA9AsAAwWVOhECET4WzB8AAblsAAQAAg8tgwAD9HAFbAV3AAMEhAV8AAAAAAAEFwADBaQAAAAAEAAADAAAAAAAAAAAAXcAAwWUBXwAAAT8BCQEAwADBIwAAAAABBsAAwWdOhVGFX4WxAAHAAHGDAAAAAQOFa4WxAAAAAQEBhXEAAACDW13AAPx0AVsAAGDAAP22AUqFgAEehY3AAMDEAwADgIWiwGCFCyeZjieZjwAAAGCE6gBghT0AAAABAsAAwWpOiTeJRr0RB58lAAEAAIPLYMAA/RwBWwFgwAD9HAABXcAA/HQBXwAAAAEFwADBrQAAAAAEAAADAAAAAAAAAAAAXcAAwWoBXwAAAT8BCQEAwAD9MgAAAAA9BsAAwWxOie6J/oofAQBcAAAAAQOKB4ofAAAAAAAAAF3AAPxtAV8AAAFKigoBH4oKwADMzwEBXwAAAS4ABsAAwXROiiSKJopJAACWMwAAAAEDii+KSQAAAAEBAYo0AAAAJ2DAAPvQAABfAAABSoo+ARyKQi5LAQABgIpDwGCGAgDAAPyDBsAAwXVOik6KWoqyAACWNwAAAAEDimSKsgAAAAEBAYpxAAAgg9ZdwAD8MgFfAAAAAF3AAPwyAV8AAAFKioEBHop4wADNvQIBXwAAAi6AiqzAYIZKAAbAAMF2Toq3iryLngAAg/gAAAABA4rDi54AAAABAQGKyQAAAIihYQFfAABcAABcAT4CTormiu0AAGFgwAD70AEWivQuYcAA/KNFiwABiwmLCwAAYmDAAPvQAZMBHIsSgosQwGCGzWMBAAGBixTAYIazAMAA/P0BioscwGCGzRyLHYKLHMBghs1kAQABlADAAPz1PgI9HIsvgIspwGCGnyABAAEcizQuSwEAAYKLNcBghs0AwAD8gwAASYtAIRyLS4GLRMBghrNIAQABFotTLmHAAPyjAMAA/PM+AT0wi2Ufi2vAAPt3AQABLgA/BsAAwW1Oi6OLyovgAQCBVQFqi6RgwAD50cAAtcUAAAEDi9KL4AAAAAAAAABgwAD6CgFKi9UBHIvcFovVLmHAAPyjSAEAAZMAwAD88wbAAMFuTovli+6MBAEAg7IAAAABA4v5jAQAAAAAAAAAYMAA+goBSov8ASEWi/0ugVXAAMFtBsAAwW9OjAmMD4xqAQCDGQAAAAEDjBWMagAAAAAAAABfAAABPgJJjBscjCYWjB8uYcAA/KNIAQABkwDAAPzzPTCMLB6MR8AAzfIAAAAAP0qMWAEcjGMuSwEAAZMAwAD8gwbAAMGqToxvjHiM3QIAgxkAAAABA4x9jN0AAAABAQGMgAAAIICWXwAAAABcAT4CSYyNHIyYFoyRLmHAAPyjSAEAAZMAwAD88z0wjJ4ejLnAAM3yAAAAAD89HIzOLoC/AgACk4CM1MBgiG0AwAD8hAbAAMFwTozijOiNSwEAgegAAAABA4ztjUsAAAAAAAAAXwAAAT4CSYzzHIz+Foz3LmHAAPyjSAEAAZMAwAD88z0wjQQejR/AAM3yAAAAAD9KjTABHI07LksBAAEcjUMWjTwuYcAA/KOBjQEAAZQAwAD89gDAAPyDBsAAwatOjVCNWY3GAgCB6AAAAAEDjV2NxgAAAAEBAY1gAAAggJZfAAAAAFwBPgJJjW0cjXgWjXEuYcAA/KNIAQABkwDAAPzzPTCNfh6NmcAAzfIAAAAAPz0cja4ugL8CAAIcjbYWja8uYcAA/KOBjQEAAZQAwAD89oCNvcBgiVMAwAD8hAbAAMFxTo3LjdGOZwEAgMMAAAABA43YjmcAAAAAAAAAXwAAAT4DSY3eHI3pFo3iLmHAAPyjSAEAAZMAwAD88z0wje8ejgrAAM3yAAAAAD9JjhscjiYWjh8uYcAA/KOAlwEAAZQAwAD8/z0wjisejkbAAM3zAAAAAD9KjlUBHI5gLksBAAGTAMAA/IMGwADBd06ObI5xj3IAAIMXAAAAAQOOeY9yAAAAAQEBjoEAAACWIGDAAP0cAABgwAD6CgE+A06OlI6bAABhYMAA+9ABFo6iLmHAAPyjRY6uAY63jrkAAGJgwAD70AGTARyOwIKOvsBgipRjAQABgY7CwGCKegDAAPz9AYqOysBgipQcjsuCjsrAYIqUZAEAAZQAwAD89T4CSY7XHI7jHI7fLksBAAGCjuDAYIqUAMAA/INIAQABgI7mwGCKYwDAAP0pSo7vASk/SY8CIRyPDYGPBsBginpIAQABFo8VLmHAAPyjAMAA/PM+AT0wjycfjy3AAPt3AQABLgA/So9iASoGwADBeE6Pd498kHwAAJYwAAAAAQOPgZB8AAAAAQEBj4cAAACW+WEBXwAAYMAA+goAAGDAAPoKAT4DTo+ij6kAAGFgwAD70AEWj7AuYcAA/KNFj7wBj8WPxwAAYmDAAPvQAZMBHI/Ogo/MwGCLmGMBAAGBj9DAYIt+AMAA/P0Bio/YwGCLmByP2YKP2MBgi5hkAQABlADAAPz1PgJJj+UhHI/ugI/qwGCLYiABAAEcj/MuSwEAAYKP9MBgi5gAwAD8gwAASo/5ASo/SZANIRyQGIGQEcBgi35IAQABFpAgLmHAAPyjAMAA/PM+AT0wkDIfkDjAAPt3AQABLgA/SpBtASkGwADBeU6QgZCGkYMAAIHUAAAAAQOQiZGDAAAAAQEBkI8AAACW+WEBXwAAYMAA+goAAGDAAPoKAT4DTpCqkLEAAGFgwAD70AEWkLguYcAA/KNFkMQBkM2QzwAAYmDAAPvQAZMBHJDWgpDUwGCMmmMBAAGBkNjAYIyAAMAA/P0BipDgwGCMmhyQ4YKQ4MBgjJpkAQABlADAAPz1PgJJkO0ckPWAkPHAYIxkIAEAARyQ+i5LAQABgpD7wGCMmgDAAPyDAABKkQABKT9JkRMhHJEegZEXwGCMgEgBAAEWkSYuYcAA/KMAwAD88z4BPTCROB+RPsAA+3cBAAEuAD9KkXMBKgbAAMF6TpGIkYqS/QAAljQAAAABA5GUkv0AAAACAQGRmgAAAJb5YQFfAABgwAD6CgABka4AACCWNWEAXwAAAWoAYMAA/Nl3XwAAAT4ETpHDkcoAAGFgwAD70AEWkdEuYcAA/KNFkd0BkeaR6AAAYmDAAPvQAZMBHJHvg5HtwGCNrmMBAAGCkfHAYI2UAMAA/P0Bi5H5wGCNrhyR+oOR+cBgja5kAQABlADAAPz1PgNOkgiSEAAAliBfAAABHJIWLksBAAGDkhfAYI2uAMAA/INJkiEckimAkiXAYI1lIAEAAYSSKsBgjfYAAEqSNAGEkjvAYI32P0mSSiEcklWCkk7AYI2USAEAARaSXS5hwAD8owDAAPzzPgE9MJJvH5J1wAD7dwEAAS4AP0mSqiEckrWBkq7AYI14SAEAASsAwAD9KUqSvgEcksuBksXAYI14IAAAAAAAPz0wktMeku7AAM3yAAAAAAbAAMF7TpMCkwSUewAAljkAAAABA5MNlHsAAAACAQGTEwAAAJb5YQFfAABgwAD6CgABkycAACCWNWEAXwAAAWoAYMAA/Nl3XwAAAT4ETpM8k0MAAGFgwAD70AEWk0ouYcAA/KNFk1YBk1+TYQAAYmDAAPvQARyTaoKTY8BgjvmBjQEAAZQAwAD89gEck3GDk2/AYI8TgW0BAAGTAMAA/QABi5N3wGCPExyTeIOTd8BgjxOBjQEAAZQAwAD89j4DTpOGk44AAJYgXwAAARyTlC5LAQABg5OVwGCPEwDAAPyDSZOfHJOngJOjwGCOyiABAAGEk6jAYI9rAABKk7IBhJO5wGCPaz9Jk8ghHJPTgpPMwGCO+UgBAAEWk9suYcAA/KMAwAD88z4BPTCT7R+T88AA+3cBAAEuAD9JlCghHJQzgZQswGCO3UgBAAErAMAA/SlKlDwBHJRJgZRDwGCO3SAAAAAAAD89MJRRHpRswADN8gAAAAAGwADBfE6UgJSClsQAAJY8AAAAAQOUjZbEAAAAAgEBlJMAAACW+WEBXwAAYMAA+goAAZSnAAAgljVhAF8AAAFqAGDAAPzZd18AAAE+B06UvJTDAABhYMAA+9ABFpTKLmHAAPyjTpTYAAAAX18AAABOlOiU8wAAn6lgwAD6CgEqRZUAAZUJlQsAAGJgwAD70AGTARyVEoWVEMBgkKNjAQABgpUUwGCQbgDAAPz9AY2VHMBgkKMclR2FlRzAYJCjZAEAAZQAwAD89T4DTpUrlTMAAJYgXwAAARyVOS5LAQABhZU6wGCQowDAAPyDSZVEHJVMgJVIwGCQPyABAAGGlU3AYJDrAAA+A0mVYYSVZcBgkJA+AT0wlX0elZjAAM3zAAAAAD89jJW1wGCQkCk9i5XQwGCQhYaV2MBgkOs/SZXvIRyV+oKV88BgkG5IAQABFpYCLmHAAPyjAMAA/PM+AT0wlhQflhrAAPt3AQABLgA/SZZPhJZTwGCQkEqWXwGDlmbAYJCFP0mWcSEclnyBlnXAYJBSSAEAASsAwAD9KUqWhQEclpKBlozAYJBSIAAAAAAAPz0wlpoelrXAAM3yAAAAAAbAAMF9TpbJltCXdQAAWAAAAAEDltSXdQAAAAEAAZbdAAAAga9gwAD9tgFqlulgwAD9toQGAGDAAP22AT4DSZb0HJb/Fpb4LmHAAPyjSAEAAZMAwAD880qXBQEnAD9OlyGXKAAAgotgwAD+AAE1lyoAAAEAYMAA/gABH5cqwAD+HwAAAAA1AAAAAQBbARyXOoGXOMBgkk+fqgIAAi6Al0nAYJH/AMAA/haBAMBgkk9Kl1kBHJdngZdgwGCSQCMAAAAAwAD+GQbAAMF+Tpd6l4aXwQAAgaUAAAABA5eLl8EAAAABAQGXkQAAAJb5YQFfAABgwAD6CgAAXcAA/DIBXwAAAUqXpQEfl6XAAM0HAgFfAAACLoCXvMBgksYABsAAwX9Ol8aX0pf+AACWQAAAAAEDl96X/gAAAQAAgnZgwAD9HAFbAAAAAF3AAPwyAV8BAAFKl+QBH5fkwADN5QEBXwEAAS4ABsAAwYBOmAOYD5hKAACAqwAAAAEDmBWYSgAAAQAAgnZgwAD9HAFbAQEBmBgAAACBpmEBXwAAXwEAAABdwAD8MgFfAQABSpgpAR+YKcAAzPwCAl8AAF8BAAIugJhIwGCTbwAGwADBgU6YT5hbmKUAAISJAAAAAQOYZJilAAABAACCdmDAAP0cAVsBAQGYcQAAAIGmYQFfAABdwAD8MgFfAQAAAF3AAPwyAV8BAAFKmIgBH5iIwADNGwICXwAAXwEAAi6AmKPAYJPRAAbAAMGCTpiqmKyaEgAAljoAAAABA5iymhIAAAABAQGYtQAAIIcXYQJfAABfAABfAAAAAF8AAAE+BU6Y5JjrAABhYMAA+9ABFpjyLmHAAPyjSZj+HJkJgZkCwGCUSUgBAAGTAMAA/PM9MJkPHpkqwADN8gAAAAA/Tpk9mUMAAICWXwAAARyZSS5LAQABkwDAAPyDRZlSAZlbmV0AAGJgwAD70AGUARyZZIOZYsBglKVjAQABgZlmwGCUSQDAAPz9AYuZbsBglKUcmW+DmW7AYJSlZAEAAZQAwAD89T4CPYqZe8BglIccmYqAmYPAYJQuIAIAAoKZi8BglIccmZYuSwEAAYOZl8BglKUAwAD8gwAASZmiIRyZrYGZpsBglElIAQABFpm1LmHAAPyjAMAA/PM+AT0wmccfmc3AAPt3AQABLgA/SpoCAYKaCcBglIcGwADBg06aF5oZm1oAAINZAAAAAQOaIJtaAAABAACCdmDAAP0cAVsCAgKaIwAAAJY2XwEAAJozAAAAhxdhAl8BAF8AAF8BAAAAXwEAAT4ETppimmgAAICWXwEAAYCaasBglYdOmoCahwAAYWDAAPvQARaaji5hwAD8o0WamgGao5qlAABiYMAA+9ABkwEcmqyEmqrAYJXbYwEAAYOarsBglcEAwAD8/QGMmrbAYJXbHJq3hJq2wGCV22QBAAGUAMAA/PU+Aj2KmsPAYJWtHJrSgZrLwGCVkiACAAKCmtPAYJWtHJreLksBAAGEmt/AYJXbAMAA/IMAAEma6iEcmvWDmu7AYJXBSAEAARaa/S5hwAD8owDAAPzzPgE9MJsPH5sVwAD7dwEAAS4AP0qbSgGCm1HAYJWtBsAAwYROm1+ba5ujAACWKQAAAAEDm2+bowAAAAEBAZt0AAAAgO5gwAD70AAAXcAA/DIBXwAAAUqbfgEfm37AAMzCAwFfAAADLoCbl8BglrIrAAbAAMGFTpuom7ScBQAAlj0AAAABA5u9nAUAAAABAQGbwwAAAJb5YQFfAABgwAD6CgAAXcAA/DIBXwAAAT4BSpvaAR+b4cAAzYUCAV8AAAIugJv8wGCXBAAGwADBhk6cCpwWnEsAAJY+AAAAAQOcGpxLAAAAAQEBnB8AAACA7mDAAPvQAABdwAD8MgFfAAABSpwpAR+cKcAAzMIDAV8AAAMuk4CcRcBgl1wABsAAwYdOnFCcXJytAACWPwAAAAEDnGWcrQAAAAEBAZxrAAAAlvlhAV8AAGDAAPoKAABdwAD8MgFfAAABPgFKnIIBH5yJwADNTQIBXwAAAi6AnKTAYJeuAAbAAMGITpyynLqdugAAgK0AAAABA5zAnboAAAABAAABnMcAAACFWGDAAPoKAWqc0mDAAPoKdV3AAPx0AV8AAAE+BE6c5wAAAIF2XcAA/HQBXwAAAEmc84Cc98BgmAc+AT2JnQnAYJgqNZ0VAAABAF3AAPx0AV8AAAExnRVfAAAANQAAAAEAWwEXnRmCnRfAYJhQYRadIi5hwAD8o8AA/KGCAMBgmFA+AT2JnT3AYJgqHp1GwAD1ywEBXwAAARadTi5hwAD8owBFnWEBnWqdbAAAYmDAAPvQAZMBHJ1zgp1xwGCYsmMBAAEWnXUuYcAA/KMAwAD8/QGKnX3AYJiyHJ1+gp19wGCYsmQBAAGUAMAA/PU+AT0cnZCBnYrAYJgqgL8CAAKCnZHAYJiyHJ2aLksBAAGCnZvAYJiyAMAA/IMAwAD8hEqdqQGBnbDAYJgqBsAAwYlOnb+dxp5LAACVEwAAAAEDncueSwAAAAAAAABdwAD9ZwFfAAABPgNOndud4gAAgXZdwAD9ZwFfAAABHp3kwADA4gABXwAAAABFnfIBnfud/QAAYmDAAPvQAZMBHJ4EgZ4CwGCZh2MBAAEWngYuYcAA/KMAwAD8/QGJng7AYJmHHJ4PgZ4OwGCZh2QBAAGUAMAA/PU+AT0cniKAnhvAYJljVgEAARyeKi5LAQABgZ4rwGCZhwDAAPyDAMAA/XRKnjoBgJ5BwGCZYwbAAMGKTp5lnmqeoAAAVgAAAAEDnm2eoAAAAAEBAZ5wAAAgliBfAAAAAFwBPgE9HJ6DLoC/AgACNQAAAAEAYMAA+9ABFp6JLmHAAPyjNQAAAAEAYMAA+9ABF56JLmEcno+BAMBgmjxkAQABlADAAPz1wAD8oYEAwGCaPICelcBgmiEAwAD8hAbAAMGLTp6lnqqfmAAAgKUAAAABA56wn5gAAAABAQGevQAAIIPMXcAA/DIBXwAAAABcAT4CTp7RntMAAGJgwAD70AEWntouYcAA/KNGnuafAp7tAAAAliBfAAAAgJ74wGCaqT4EQCIcnx0WnxYuYcAA/KNIAQABgZ8gwGCawADAAPzzATCfJh+fLMAA+3cBAAEuAJ8Rn04APRefXC5hHJ9ngZ9lwGCawGQBAAGUAMAA/PXAAPyhPRyfdi6AvwIAAoGfd8BgmsCCn3zAYJrbAMAA/IQ9iZ+LwGCawByfjIGfi8BgmsBkAQABlADAAPz1BsAAwYxOn52foqBgAACEWQAAAAEDn6igYAAAAAEBAZ+wAAAAliBgwAD9HAAAYMAA+goBPgJFn78Bn8ifygAAYmDAAPvQAZMBHJ/RgZ/PwGCbsmMBAAEWn9guYcAA/KMAwAD8/QGJn+DAYJuyHJ/hgZ/gwGCbsmQBAAGUAMAA/PU+AUmf7Ryf+Ryf9S5LAQABgZ/2wGCbsgDAAPyDSAEAAYCf/MBgm5gAwAD9KT4CPRygFC6fq8AAvZcCAAKBoB7AYJuyHKAjgaAhwGCbsmQBAAGUAMAA/PUAwADBjkqgMQEpP0qgUAEqBsAAwY5OoOGg5qH+AACfq8AAvZcAAAABA6Dvof4AAAACAgKg9AAAAGpgwAD70ACg/wAAAIKMYMAA+9AAAFwBPgdOoQ6hFQAAYWDAAPvQARahHC5hwAD8o0AcoTGTgWsBAAGAoTTAYJyDAMAA/P6hL6E5AEAcoU2AoUfAYJyDYwEAAYGhT8BgnI8AwAD8/aFHoVIAQByhZIGhYMBgnI+BawEAAYKhZ8BgnKIAwAD8/qFgoW0ATqF4oX0AAJiAYMAA+9ABHKGDgaF/wGCcj4GNAQABgKGFwGCcgwDAAPz2RaGQAaGZoZsAAGJgwAD70AGBoZ3AYJyPARyhpIShosBgnUJjAQABgqGmwGCcogDAAPz9AYyhrsBgnUIcoa+Eoa7AYJ1CZAEAAZQAwAD89T4BPRyhvy6AvwIAAhyhwoShwMBgnUKBjQEAAYOhxMBgnRUAwAD89hyh0C5LAQABhKHRwGCdQgDAAPyDAMAA/IQ9F6HkLmEcofSCoe3AYJyigY0BAAGDofbAYJ0VAMAA/PbAAPyhBsAAwZFOogOiCKJIAACW+AAAAAEDohOiSAAAAAEBAaIZAAAAlvlhAV8AAGDAAPoKAABcAT4BPRyiMC6frMAAvZcCAAKAojjAYJ4RKgDAAMGPBsAAwZJOok2iUqKRAACW+wAAAAEDol2ikQAAAAEBAaJjAAAAlvlhAV8AAGDAAPoKAABcAT4BPRyiei6frMAAvZcCAAKAooLAYJ5iKQDAAMGPBsAAwY9Oopaim6SQAACfrMAAvZcAAAABA6KipJAAAAACAgKiqAAAAJb5YQFfAABgwAD6CgCivgAAAJ+tYMAA+goAAFwBPgROotyi5QAAn65dwAD8dAFfAAABMaLqXwAAAE6i9qL9AABhYMAA+9ABFqMELmHAAPyjRaMQAaMZoxsAAGJgwAD70AGTARyjIoSjIMBgnxBjAQABg6MkwGCe9gDAAPz9AYyjLMBgnxAcoy2EoyzAYJ8QZAEAAZQAwAD89T4DTqM9o0UAAJYgXwAAARyjSy5LAQABhKNMwGCfEADAAPyDSaNWHKNoHKNegKNawGCetyABAAGFo1/AYJ9YAABIAQABgaNrwGCeyQDAAP0pPgE9HKOOgqOFwGCe3FYBAAGFo5LAYJ9YAMAA/IU/SaOqIRyjtYOjrsBgnvZIAQABFqO9LmHAAPyjAMAA/PM+AT0wo88fo9XAAPt3AQABLgA/SaQKIRykHhakF4KkDsBgntxhwAD8o0gBAAEWpCYuYcAA/KMAwAD88z4CPRykOy6DXgMAA5MWpFCCpEfAYJ7cYcAA/KOCpFjAYJ7cAMAAwZ49F6RuLmEWpICCpHfAYJ7cYcAA/KPAAPyhPwbAAMGTTqSVpJqkuwAAgkIAAAABA6SfpLsAAAAAAAAAXAE+AT0XpK0uYZPAAPyhBsAAwZROpMCkyKTuAACWMgAAAAEDpM+k7gAAAQAAlvNgwAD9HAFbAAAAAF3AAPx0AV8BAAFKpNUBHqTawAD8fwECXwAAXwEAAS4ABsAAwZVOpPKk9KWSAACGEQAAAAEDpP6lkgAAAAAAAABfAAABPgRJpQccpRIWpQsuYcAA/KNIAQABkwDAAPzzPgE9MKUgHqU7wADN8gAAAAA/TqVUpVsAAIF2XwAAARylYS5LAQABHKVpFqViLmHAAPyjgY0BAAGUAMAA/PYAwAD8gz0XpXMuYRyleRalcy5hwAD8o4GNAQABlADAAPz2wAD8oUqlgQGApYjAYKEsBsAAwZZOpZelnKXrAACArgAAAAEDpaCl6wAAAAEAAaWmAAAAmxlhAl8AAF8AAGDAAPvQAWoAYMAA/Nl3AFwBPgE9HqXFwADOiAIBXwAAAi41AAAAAQBhAl8AAF8AAGDAAPvQAYCl0MBgoacjHKXYgQDAYKHZSAEAASsAAGql22ECW1tgwAD70MAAtdmBAMBgodkBYQJfAABfAABgwAD70AAGwADBkE6l8KX7pqYAAZ+vwAC9lwAAAAEDpgampgAAAAICAqYHAAAAgdVbAKYKAAAAgkpbAABgwAD70AE+AUqmgwEeppXAAPoZAgACJqadAYCmncBgokxdwAD6FgFbJqagAYGmoMBgolVdwAD6FgFbAAbAAMGXTqarprCnswAAn7AAAAABA6a3p7MAAAABAAGmwAAAAJ+xYMAA0DgBagBgwAD82XcAXAE+Az0jHKbWgKbPwGCiuUgBAAErAMAA/SmIps/AYKK5HqbawADQOgAAAAArAWDAANA4TqbspvMAAGFgwAD70AEWpvouYcAA/KNDpwYcpxSBpw3AYKMDgJcBAAGUAMAA/P8+BU6nJacpAACfsmDAAPvQARynMoCnK8BgormfswEAAYGnOsBgowMAwADQPT2Jp0nAYKMDHKdQgadJwGCjA4GNAQABlADAAPz2Tqdgp2QAAJ+0XwAAARynai5LAQABgadrwGCjAwDAAPyDPRynfi6AvwIAAoGnf8BgowMcp40uSwEAAYKnjsBgozQAwAD8gwDAAPyEPRynni6AvwIAAoKnn8BgozSDp6bAYKN7AMAA/IQGwADBmE6nuKfEp/EAAJxiAAAAAQOnyafxAAAAAAAAAF3AAPylAmDAAPvQXwAAAT4BSqfSAR+n2cAAzmkBAV8AAAEuAAbAAMGZTqf2qAeo0QMAZAAAAAEDqAio0QAAAAEBAagRAAAgg9ZdwAD8dAFfAAAAAF3AAPx0AV8AAAE+BE6oIqgpAACBdl3AAPx0AV8AAAE1qC4AAAEAXcAA/HQBXwAAATGoLl8AAAA1AAAAAQBbAReoMoGoMMBgpHZhHKhIFqhBLmHAAPyjZAEAARaoUICoSsBgpERhwAD8owDAAPz1wAD8oYEAwGCkdj0cqGSBqF3AYKRjg14DAAOTFqh1LmHAAPyjLgDAAPyZPRyoj4GoiMBgpGODXgMAAxaonS5hwAD8oxaorIGopcBgpGNhwAD8o4CotMBgpEQAwAD8mUqowAGBqMfAYKRjBsAAwZpOqNao3qogAACBWAAAAAEDqOWqIAAAAAIBAqjqAAAAamDAAPvQAKj2AAAAgoxgwAD70AFqAGDAAPzZdwBdwAD8dAFfAAABPgdOqQapEQAAn7VgwAD70AEWqRguYcAA/KM9IxypKIGpJMBgpVhIAQABKwDAAPzziakkwGClWIKpLMBgpXsrAWDAAPvQPR6pR8AA+xEDAAOAqVfAYKVMgalewGClWIKpY8BgpXsATql4qX8AAGFgwAD70AEcqYWBqYHAYKVYgY0BAAGAqYfAYKVMAMAA/PZOqZqpoQAAgXZdwAD8dAFfAAABNammAAABAF3AAPx0AV8AAAExqaZfAAAANQAAAAEAWwEXqaqEqajAYKYbYYOps8Bgpd/AAPyhhADAYKYbRam/AanIqcoAAGJgwAD70AGTARyp0YWpz8BgplpjAQABg6nTwGCl3wDAAPz9AY2p28BgplocqdyFqdvAYKZaZAEAAZQAwAD89T4BPRyp7oSp6MBgpgiAvwIAAoWp78BgplocqfguSwEAARyp/4Cp+cBgpUxkAQABhaoBwGCmWgDAAPz1AMAA/IMAwAD8hEqqDwGEqhbAYKYIBsAAwZtOqiWqMaq8AACftgAAAAEDqjmqvAAAAAICAqo+AAAAamDAAPvQAKpJAAAAgoxgwAD70AAAXcAA/DIBXwAAAT4CPR6qX8AA+xEDAAOAqm/AYKcOgap2wGCnGhaqgC5hwAD8owBKqo0BH6qUwADMwgMBXwAAAy6Aqq3AYKcOgaq0wGCnGgAGwADBnE6qwarGq10AAJ+3AAAAAQOq0atdAAAAAgICqtYAAABqYMAA+9AAquEAAACCjGDAAPvQAABcAT4CPR6q98AA+xEDAAOAqwfAYKeXgasOwGCnoxarGC5hwAD8owBJqyUcqy2BqynAYKejgJcBAAGAqy/AYKeXAMAA/P8+AT0cqz4un6vAAL2XAgACgKtIwGCnl4GrT8Bgp6MAwADBjj8GwADBnU6rYqtnrBAAAJupAAAAAQOrcKwQAAAAAwIDq3UAAABqYMAA+9AAq4AAAACCjGDAAPvQAKuIAAAgn7hfAAABagBgwAD82XcAXAE+Aj0eq6DAAPsRAwADgKuwwGCoOYGrt8BgqEUWq8EuYcAA/KMARavOAavXq9kAAGJgwAD70AGAq9vAYKg5ARyr5IOr4sBgqJFjAQABgavmwGCoRQDAAPz9AYur68BgqJEcq+yDq+vAYKiRZAEAAZQAwAD89T4BPRyr/C6AvwIAAoOr/cBgqJGCrALAYKhSAMAA/IQGwADBnk6sFawar9oAAINeAAAAAQOsIq/aAAAABAMErCcAAABqYMAA+9AArDIAAACCjGDAAPvQAKxDAAAgg8xdwAD8MgFfAAAArFIAAACfuWDAAPvQAWqsXmDAAPvQCQBcAT4JPR6sc8AA+xEDAAOArIPAYKkagayKwGCpJhaslC5hwAD8owBOrKWsrAAAYWDAAPvQARyssoGsrsBgqSaBjQEAAYCstMBgqRoAwAD89kmsvxysyoSsw8BgqYNIAQABkwDAAPzzSqzQAD89HqznwAD7EgIAAoOs+MBgqUQnn7kATq0eAAAAn7pdwAD8dAFfAAAATq0xAAAAn7tgwAD70ABJrW8lrXyCrXPAYKkzXcAA/HQBXwAAPgI9ja2QwGCp3hStnMBgqTMCAV3AAPx0AV8AAD2OrazAYKnwg625wGCpRD4CPY2t18Bgqd4crfwcreyCrePAYKkzlikBAAGDrfHAYKlEAMAA/EyArQEAAAGFWCrAAPxIPY6uG8BgqfCTSa41HK5NHK5Ehq45wGCp8GQBAAGErkbAYKmDAMAA/PWAlwEAARauWYWuT8Bgqd5hwAD8owDAAPz/PgE9MK5pHq6EwADN9AAAAAA/Sa6YHK6nhq6cwGCp8GMBAAGArqnAYKkaAMAA/P0+AUWu+gGvA68FAABiYMAA+9ABHK8OhK8HwGCpg4GNAQABlADAAPz2ARyvFYevE8BgquqBbQEAAZMAwAD9AAGPrxvAYKrqHK8ch68bwGCq6oGNAQABlADAAPz2PgE9HK8uLoC/AgACHK81gK8vwGCpGmQBAAGHrzfAYKrqAMAA/PUcr0WFrzzAYKneSwEAARyvUYavRsBgqfBkAQABh69TwGCq6gDAAPz1AMAA/IMAwAD8hD4BRa9yAa97r30AAGJgwAD70AGTARyvhIevgsBgq51jAQABhK+GwGCpgwDAAPz9AY+vjsBgq50cr4+Hr47AYKudZAEAAZQAwAD89T4BPRyvoS6AvwIAAhyvqICvosBgqRpkAQABh6+qwGCrnQDAAPz1HK+4ha+vwGCp3ksBAAEcr8SGr7nAYKnwZAEAAYevxsBgq50AwAD89QDAAPyDAMAA/IQGwADBn06v36/ksyAAAJ+8AAAAAQOv8LMgAAAAAwMDr/UAAABqYMAA+9AAsAAAAACCjGDAAPvQALARAAAgn71dwAD8MgFfAAAAAFwBPgU9HrAvwAD7EQMAA4CwP8BgrFmBsEbAYKxlFrBQLmHAAPyjAEmwXSElsG2CsGHAYKxyXcAAzI4BWz4BPYqwksBgrHIcsKyCsKDAYKxygK0AAAAAwAD8SD9OsMSw0QAAn75gwAD70AEcsNeBsNPAYKxlgY0BAAGAsNnAYKxZAMAA/PZOsOiw9QAAn79gwAD70AEWsQOCsPfAYKxyYcAA/FVJsQ8csSCDsRPAYKzggW0BAAGEsSPAYK0KAMAA/QA+A06xPbFHAACfwGDAAPvQARyxT4CxScBgrFlkAQABhLFRwGCtCgDAAPz1PRyxai6DXgMAA4Cxc8BgrFmFsXrAYK1IgrGFwGCscgDAAMGeSbGZHLGqg7GdwGCs4ICXAQABhLGswGCtCgDAAPz/PgE9HLHELp+rwAC9lwIAAoWxzsBgrUiBsdnAYKxlAMAAwY4/PgZOsf6yBAAAmyhgwAD70AEcshOEsgbAYK0KgY0BAAGDshXAYKzgAMAA/PZOsi2yNwAAl1FgwAD70AEcskUWsj4uYcAA/KNkAQABhbJHwGCt2QDAAPz1TrJYsmIAAJ/AYMAA+9ABHLJqgLJkwGCsWWQBAAGEsmzAYK0KAMAA/PU9F7KaLmGGsqPAYK4DwAD8oT0csrkug14EAASHssLAYK4uhrLNwGCuAy6Bst7AYKxlAMAAwZ49HLLvLoNeAwADgLL4wGCsWYey/8Bgri6CswrAYKxyAMAAwZ4GwADBoE6zJbMps+EAAIC7AAAAAQOzMLPhAAAAAgECszgAACCWIGDAAP0cALNGAAAAamDAAPvQAWqzTmDAAPvQCQBgwAD70AE+A0mzWByzYoGzXMBgrtxjAQABkwDAAPz9PYmzZ8BgrtyTP0WzdgGzf7OBAABiYMAA+9ABgbODwGCu3AEcs4yCs4rAYK8fYwEAARazky5hwAD8owDAAPz9AYqzm8Bgrx8cs5yCs5vAYK8fZAEAAZQAwAD89T4BSbOoHLO0HLOwLksBAAGCs7HAYK8fAMAA/INIAQABgLO3wGCuzwDAAP0pSrPAAYKzx8Bgrx8/SrPUARyz25SBxAAAAADAAPvzBsAAwaFOs+az6rSmAACfwQAAAAEDs/S0pgAAAAIBArP6AAAAlvlhAV8AAGDAAPoKALQQAAAAamDAAPvQAWq0GGDAAPvQCQBgwAD70AE+A0m0Ihy0LIG0JsBgr+djAQABkwDAAPz9PYm0McBgr+eTP0W0QAG0SbRLAABiYMAA+9ABgbRNwGCv5wEctFaCtFTAYLAqYwEAARa0XS5hwAD8owDAAPz9AYq0ZcBgsCoctGaCtGXAYLAqZAEAAZQAwAD89T4BSbRyHLR6gLR2wGCv1SABAAEctH8uSwEAAYK0gMBgsCoAwAD8gwAASrSFAYK0jMBgsCo/SrSZARy0oJSBxAAAAADAAPvzBsAAwaJOtKu0r7WIAACWWgAAAAEDtLq1iAAAAAIBArTCAAAgliBgwAD9HAC00AAAAGpgwAD70AFqAGDAAPzZdwBgwAD70AE+A0m03iIctOiBtOLAYLDqSAEAASsAwAD88wEctPmBtPPAYLDqgW0BAAEWtQEuYcAA/KMAwAD9AD2JtQnAYLDqHLUdFrUWLmHAAPyjgY0BAAGUAMAA/PY/RbUmAbUvtTEAAGJgwAD70AGBtTPAYLDqARy1PIK1OsBgsWGBbQEAAZMAwAD9AAGKtULAYLFhHLVDgrVCwGCxYYGNAQABlADAAPz2PgFJtU8ctVsctVcuSwEAAYK1WMBgsWEAwAD8g0gBAAGAtV7AYLDdAMAA/SlKtWcBgrVuwGCxYT9KtXsBHLWClIHEAAAAAMAA+/MGwADBo061jbWRtm4AAJ/CAAAAAQO1n7ZuAAAAAgECtaUAAACW+WEBXwAAYMAA+goAtbsAAABqYMAA+9ABagBgwAD82XcAYMAA+9ABPgNJtckiHLXTgbXNwGCyI0gBAAErAMAA/PMBHLXkgbXewGCyI4FtAQABFrXsLmHAAPyjAMAA/QA9ibX0wGCyIxy2CBa2AS5hwAD8o4GNAQABlADAAPz2P0W2EQG2GrYcAABiYMAA+9ABgbYewGCyIwEctieCtiXAYLKagW0BAAGTAMAA/QABirYtwGCymhy2LoK2LcBgspqBjQEAAZQAwAD89j4BSbY6HLZCgLY+wGCyESABAAEctkcuSwEAAYK2SMBgspoAwAD8gwAASrZNAYK2VMBgspo/SrZhARy2aJSBxAAAAADAAPvzBsAAwaROtnO2eLeyAACeygAAAAEDtn63sgAAAAICAraDAAAAJ2DAAPvQALaMAAAgliBfAAAAAFwBPgY9HrapwAD6/AIAAoC2tsBgs0cnJwA9HrbWwAD7DwQABIC268Bgs0eTFrb1LmHAAPyjJycASbcLHLcVgLcPwGCzR0gBAAEWtx0uYcAA/KMAwAD88z4CPRy3LS5WAQABgbcxwGCzUwDAAMGKSrdBAD89F7dYLmEct14Wt1guYcAA/KNkAQABlADAAPz1wAD8oT0ct2Yug14EAAQct3WAt2/AYLNHZAEAAZQAwAD89Ra3fy5hwAD8oy6At43AYLNHAMAAwZ49HLedLoC/AgACgLeewGCzR4G3p8Bgs1MAwAD8hAbAAMGlTre3t7m4IQAAn8MAAAABA7fBuCEAAAABAQG3xgAAACdgwAD70AAAXwAAAT4DTrfVt9wAAIF2XwAAARy34i5LAQABgLfjwGC0YgDAAPyDPRy37y6fq8AAvZcCAAKAt/nAYLRiHLgGgLgAwGC0YmQBAAGUAMAA/PUAwADBjkq4EAGBuBfAYLR2BsAAwaZOuCa4K7uaAACfxAAAAAEDuDS7mgAAAAICArg5AAAAJ2DAAPvQALhMAAAgg8xdwAD8MgFfAAAAAFwBPgc9HrhnwAD7DwQABIC4fMBgtO6TFriGLmHAAPyjJycASbicIiEluKmBuKDAYLT6XcAAzI4BWwEeuMjAAPWxAgACgbjSwGC0+i4APgE9ibjrwGC0+hy4/4G49sBgtPqArQAAAADAAPxIP065F7knAACfxWDAAPvQARa5MoG5KcBgtPphwAD8VT0XuhwuYRy6Ixa6HC5hwAD8o2QBAAGCuibAYLV5AMAA/PXAAPyhSbo7IRy6Txa6SIG6P8BgtPphwAD8VUgBAAGCulLAYLV5AMAA/PM+Aj0XuuYuYRy67Ra65i5hwAD8o4GNAQABgrrwwGC1eQDAAPz2wAD8oT0wuwcfuw3AAPt3AQABgbspwGC0+gA/PRy7Pi6DXgQABBy7TYC7R8BgtO5kAQABgrtPwGC1eQDAAPz1FrtlLmHAAPyjLoC7c8BgtO4AwADBnj0cu38un8YCAAKAu4bAYLTugbuNwGC0+gDAAMGnBsAAwadOu5+7pLyGAACfxgAAAAEDu6q8hgAAAAICAruvAAAAJ2DAAPvQALvCAAAgg8xdwAD8MgFfAAAAAFwBPgFJu9Ilu9+Bu9bAYLakXcAA/HQBWz4BPRy78C6DXgMAA4C7+cBgtpgcvAaAvADAYLaYZAEAARa8EYG8CMBgtqRhwAD8VQDAAPz1gbwZwGC2pADAAMGePgFGvDe8U7w+AAAAliBfAAAAgbxJwGC2pD4BPRy8YS6AvwIAAjUAAAABAGDAAPvQAYC8YsBgtpg1AAAAAQBgwAD70AGIvGLAYLaYHLxngwDAYLc1ZAEAAZQAwAD89YMAwGC3NYK8bcBgtxYAwAD8hAbAAMFyTryLvJu8xAEAmIIAAAABA7ykvMQAAAAAAAAAXcAA/DIBXwAAAUq8pwEfvKfAAM5zAQFfAAABLgAGwADBqE68ybzQvQ8AACMAAAABA7zYvQ8AAAAAAAAAYMAA/bYBSrzeAR6868AAwMQDAAMuJ5mOJ5mPAAAAYIWnAGCF4wBghisAYIaAAGCHbABgh7gAYIftAGCITgBgiL0AYIk0AGCJuQBgikQAYItDAGCMRQBgjUYAYI6rAGCQIABgkeEAYJKnAGCS/QBgk0UAYJOnAGCUDwBglV0AYJaTAGCW5QBglz0AYJePAGCX5wBgmTYAYJoDAGCaigBgm3kAYJxgAGCd8gBgnkMAYJ6UAGCgYABgoI8AYKDaAGChiABgoikAYKKaAGCj4gBgpCYAYKUtAGCm7wBgp3gAYKgaAGCo+wBgrDoAYK6wAGCvtgBgsL4AYLHyAGCzKABgtEMAYLTPAGC2eQBgt38AYLe8AGC39wAAAD0CwADBroIug3uDiorFB5cBAAIAAIQDYMAA/RwBWwAAhARgwAD9HAFbAV3AAMG3Al8AAF8BAAAAAAEFwADBtgAAAAAEAAADAAAAAAAAAAAAXcAAwa4CXwAAXwEAAT8BCQEAwADB0QAAAAAEBsAAwbCCLoOzg8GGSAABwABxhAAAAAEDg8yGSAAAAAEBAYPRAAAARV3AAPylAltbAABgwAD9tgE+BEmEIB6EJMAAvaUBAAGAhDjAYLmAAD4BSoREASfAAGq4P06EY4RqAACBdmDAAP4AAR+EbMAA/h8AAAAATD4FPRyEnhqEjMAAvZ9WAQABgISiwGC5gADAAPyFPRyEs4GErMBgubqCigEAASeZrgDAAP4UToTKhNAAAIMZYMAA+goBKT0chOCAhN7AYLmAg/gBAAE0hOgDhOiFmwAAAAICAoTpAAAAg/lbAITsAAAAgPJbAABgwAD82QE+BUmE+SGChP7AYLoKPgE9HIUYgYURwGC5uoKKAQABJ4GLAMAA/hQ/PYqFN8BgugoqPRyFVYGFTsBgubqCigEAAYOFW8BgujcAwAD+FD0chW6BhWfAYLm6gooBAAEng1UAwAD+FD0chYqBhYPAYLm6gooBAAGEhZDAYLpAAMAA/hQAwAD8xD0chauBhaTAYLm6gooBAAEnhsAAwAD+FD4CQB6F1MAA9bECAAIWhfAahd7AAL2fgejAAPxZgIX2wGC5gACF1IX4AD0chhMahgHAAL2fhhEAAAAAwAD8k0qGLAEchjqBhjPAYLm6IwAAAADAAP4ZBsAAwbKCLoZNhlSGXwABwABxhcAAvZcAAAABA4ZXhl8AAAABAQGGWAAAAIN7WwAAWwFKhl4BgIZewGC7agbAAMGzgi6HB4cTh+wAAcAAcYbAAL2XAAAAAQOHLYfsAAAABAQEhzkAAACAq13AAPylAltbAIdHAAAAg8xdwAD8MgFbAIdRAAAAg9FhAVtbAIdfAAAAgJZhAVtbAABcAT4DPSMch3mCh3XAYLvGSAEAASsAwAD9KYqHdcBgu8Zqh31hAVtbwAF2GCsBYQFbWz0jHIeMg4eGwGC70kgBAAErAMAA/SmLh4bAYLvSaoeQYQFbW8ABdhgrAWEBW1tGh5qHuIejAAAAliBbAIGHrsBgu7c+AT0ch8OAh8DAYLungL8CAAIch8eCh8TAYLvGIAEAAYSHyMBgvEQAAByH2YOH1MBgu9IgAQABhIfawGC8RAAAAMAA/LoGwADBtIIuiIuIl4rDAAHAAHGHwAC9lwAAAAEDiKyKwwAAAAMDA4ixAAAAgKtdwAD8pQJbWwCIvwAAAINiXcAA/DIBWwCIzgAAACldwAD8MgFbAABcAT4GTojliPEAAMAAcYhdwAD8bQFbARaI+IGI88BgvM9cwAD8VE6JD4kdAADAAHGJXcAA/G0BWwEWiSaCiR/AYLzeXMAA/FROiTqJRQAAwABximDAAPoKARyJU4OJR8BgvPJdAAAAAMAA/G9OiWiJdQAAwABxi2DAAPoKARyJhYSJd8BgvRRdAAAAAMAA/G9DiZYihYmdwGC9NgCGiavAYL1aPgM9HInEgInBwGC8v4C/AgACFonRg4nFwGC88l7AAPxxFonqhIncwGC9FF7AAPxxAMAA/Lo9jYn5wGC9NhyKEoOKBsBgvPJdAAAAAMAA/G89jookwGC9WhyKQYSKM8BgvRRdAAAAAMAA/G9JilgihYpcwGC9NgGGimrAYL1aPgE9MIqAH4qGwAD7AwEAASfAAHGMAD8AAGC5XgBgu0QAYLuBAGC8mQBgviUAAAAEAsAAwbeCLo1FjVSWOwfAAHGNAAIAAIQDYMAA/RwBWwAAhARgwAD9HAFbAWDAAP0cAAFdwAD8pQJfAABfAQAAAQXAAMHRAAAAAAQAAAMAAAAAAAAAAABdwADBtwJfAABfAQABPwEJAQDAAP0yAAAAABYGwADBuYIujXyNjI2QAQKDYgAAAAEDjZCNkAAAAAAAAABdwAD8MgFfAAAABsAAwcCCLo2UjZ+NrQMCSwAAAAEDjaGNrQAAAAEBAY2pAAAAg9FgwAD9HAAAXwEAAAbAAMHBgi6NsY26jc0DAoC/AAAAAQONvY3NAAAAAgICjcAAACCD0V8AAACNxwAAIICWXwEAAABcAAbAAMHCgi6N0Y3TjeUAAoRZAAAAAQON2Y3lAAAAAQEBjeEAAACD0WDAAP0cAABfAQAABsAAwcOCLo5xjnaOfQACgkIAAAABA457jn0AAAAAAAAAXAAGwADBxIIujoKOjo7AAACWMgAAAAEDjpqOwAAAAgAAwABC6WDAAP0cAVsAAMAAQupgwAD9HAFbAAAAAF3AAPylAl8CAF8DAAFKjqABHo6kwAD8tQEEXwAAXwEAXwIAXwMAAS4ABsAAwcWCLo7EjsmPMAAAg/gAAAABA47QjzAAAAABAQGO1gAAAIihYQJfAABfAQBcAABcAT4BRo70jwiO+wAAAIPRXwAAABaPAi6DYsAAwbk+AT0cjxaAjxDAYMAdIAIAAoGPF8BgwDgcjyAuSwEAAYGPIcBgwDgAwADBwAAABsAAwcaCLo81jzqPmgAAgKUAAAABA49Aj5oAAAABAQGPSwAAIIPWXcAA/KUCXwAAXwEAAABcAT4BRo9Yj3KPXwAAAIPRXwAAABaPbICPZsBgwJuDYsAA/Mc+AT0cj34ugL8CAAKBj3/AYMC5HI+LgI+GwGDAm0sBAAGBj4zAYMC5AMAA/LkAwADBwQbAAMHHgi6Pn4+kkCEAAMAAQusAAAABA4+xkCEAAAABAQGPuQAAAICWYMAA/RwAAGDAAPoKAT4CRo/Gj9qPzQAAAIPRXwAAABaP1C6DYsAAwbk+AUmP4hyP8ByP6i5LAQABgY/rwGDBQwDAAMHASAEAAYCP88BgwSgAwAD9KUqP+gEpP0qQEQEqBsAAwciCLpAmkCiQqgAAmRUAAAABA5AzkKoAAAACAgKQNgAAIIPRXwAAAJA9AAAgwABC7GEAXwEAAABfAQABPgJJkE8ckFMuh0EBAAGAkF/AYMGvAMAAwc4+AUqQbQEckHguSwEAAYCQecBgwa8AwADBwD9KkIkBNQAAAAEAXwAAAYCQlcBgwa81AAAAAQBfAQABHJCkgZCcwGDBuiAAAAAAADUAAAABAFwBHJCULoC/AgACggDAYMIIgwDAYMIZAMAAwcGDAMBgwhkGwADByYIukK+QsZG+AACrJgAAAAEDkLeRvgAAAAMCApC6AAAgg9FfAAAAkMEAACCrJmEBXwEAXwEAAAGQ1QAAIMAAQuxhAF8BAAFqAGDAAPzZd18BAAE+A0mQ6ByQ8S6HQQEAAYCQ/cBgwnoAwADBzj4BSpELATUAAAABAF8AAAGAkRfAYMJ6NQAAAAEAXwEAARyRJIGRHsBgwoUgAQABHJEpLksBAAGAkSrAYMJ6AMAAwcAAADUAAAABAFwBHJEWLoC/AgACgwDAYMLShADAYMLjAMAAwcGEAMBgwuM/SZE7IRyRSIKRP8BgwpZIAQABKwDAAP0pPgFKkVkBNQAAAAEAXwAAAYCRZcBgwno1AAAAAQBfAQABHJF0gpFswGDCliAAAAAAADUAAAABAFwBHJFkLoC/AgACgwDAYMNYhADAYMNpAMAAwcGEAMBgw2k/PTCRgh+RlsAA+wQDAAOAkZzAYMJ6J4PRJ8AAcTwABsAAwcqCLpHDkciSQQAAwABC8AAAAAEDkdGSQQAAAAEBAZHUAAAgqyZhAl8AAF8BAF8BAAAAXAE+AUaR8pINkfsAAACD0V8AAAAWkgcug2LAAMG5PgE9HJIZLoC/AgACgZIawGDECBySJ4CSIcBgw+sgAgACgZIowGDECBySMS5LAQABgZIywGDECADAAMHAAAAAwADBwQbAAMG6gi6SRpJjkq8BAIPQAAAAAQOSa5KvAAAAAAAAAF3AAPwyAV3AAPzMAl8AAF8BAAE+AUqScQEckn0Wkngug2LAAMG5gKsBAV3AAPzMAl8AAF8BAAE0koEDkoGSqgAAAAEBAZKEAAAAg9FfAAAAAF3AAPzMAl8AAF8BAAFKkowBH5KMwAD82AICXwAAXwEAAoCSm8BgxMYckqQuSwEAAYCSpcBgxMYAwADBwAAAwAD8PQbAAMHLgi6StJLAk6cAAICrAAAAAQOSy5OnAAACAADAAELuYMAA/RwBWwAAwABC72DAAP0cAVsBAQGS3QAAAIH2YQJfAABfAQBdwAD8zAJfAgBfAwAAAF3AAPylAl8CAF8DAAE+A06TApMJAACBdl3AAPylAl8CAF8DAAEykxNfAgBfAwAARpMbkzaTJAAAAIPRXwAAABaTMC6DYsAAwbk+Ak6TQpNIAACDz13AAPzMAl8CAF8DAAEck1OAk0rAYMVOIAIAAoKTVMBgxZ8ck10uSwEAAYKTXsBgxZ8AwADBwAAAPRyTcYGTa8BgxXuAvwIAAhaTeIOTcsBgxbeD0cAA/M4Wk4WDk3/AYMW3gJbAAPzPAMAA/LpKk5YBgZOdwGDFewbAAMHMgi6TrJOxlDQAAMAAQu0AAAABA5O7lDQAAAABAQGT1QAAIMAAcT1dwAD8MgFdwAD8zAJfAABfAQAAAFwBPgFGk+eUBZPwAAAAg89dwAD8zAJfAABfAQAAgJP5wGDGWT4BPRyUES6AvwIAAhaUGIGUEsBgxn+D0cAA/M4WlCWBlB/AYMZ/gJbAAPzPAMAAwcEGwADBzYIulDmUPpUiAACW+AAAAAEDlEmVIgAAAAEBAZRPAAAAlvlhAl8AAF8BAGDAAPoKAABcAT4DTpRvlHwAAMAAa31dwAD8dAFfAAABMZSBXwAAAEaUiZSflJIAAACD0V8AAAAWlJkug2LAAMG5PgFJlKcclK+AlKvAYMbrIAIAAoKUsMBgxyYclLkuSwEAAYKUusBgxyYAwADBwAAAPRyUzoGUwcBgxwZWAQABgpTSwGDHJgDAAPyFP0aU4pUAlOsAAACD0V8AAACBlPLAYMcGPgE9HJUNLoRZAQABgpUUwGDHjADAAMHCBsAAwc6CLpUnlSyVWQAAh0EAAAABA5U3lVkAAAABAQGVPwAAAIPRYMAA/RwAAGDAAPoKAUqVRwEclUwWlUcug2LAAMG5gxcBAAGAlVXAYMfWAMAA/EEGwADBu4IulV2VZZV6AQBhAAAAAQOVbJV6AAAAAAAAAGDAAPvQAUqVbwEWlXQWlW8ug2LAAMG5YcAA/FUGwADBvIIulX6Vh5WeAQCBVQAAAAEDlY+VngAAAAAAAABgwAD6CgFKlZIBFpWXFpWSLoNiwADBuYFVwAD8VgbAAMG9gi6VopWrlcgBAIOyAAAAAQOVtpXIAAAAAAAAAGDAAPoKAUqVuQEWlb4Wlbkug2LAAMG5g7LAAPxXBsAAwb6CLpXMldyWBwEAKQAAAAEDleOWBwAAAAAAAABdwAD8MgFfAQABSpXmAR+V5sAAwewBAl8AAF8BAAEuAAbAAMHPgi6WC5YSljkAACMAAAABA5YaljkAAAAAAAAAYMAA/bYBSpYgAR6WKMAAwbABAAEuAAAAYL6vAGC+2gBgvwsAYL9EAGC/dgBgv5kAYL/9AGDAewBgwQYAYMGPAGDCWgBgw8kAYMRgAGDFFABgxjcAYMbLAGDHtgBgyAwAYMhIAGDIhgBgyMQAYMkEAGDJOgAAABYCwADB0oIumRaZJZlzJ8AAcY4AAgAAhANgwAD9HAFbAACEBGDAAP0cAVsBXcAAwa4CXwAAXwEAAAFdwADB+QJfAABfAQAAAQXAAMHUAAAAAAQAAAMAAAAAAAAAAABdwADB0gJfAABfAQABPwEJAADAAMG2AAAAAAkGwADB1oIunyufOZ+PAwCAvwAAAAEDnzyfjwAAAAICAp8/AAAgg9FfAAAAn0YAACCAll8BAAAAXAE+AT0wn1Mfn1nAAPtiAQABJ8AAcY8ABsAAwdeCLp/Sn9egMQAAgKUAAAABA5/doDEAAAABAQGf6AAAIIPWXcAA/KUCXwAAXwEAAABcAT4BPTCf9R+f+8AA+2IBAAEnwABxjwAGwADB2IIuoHSgeaDoAADAAELtAAAAAQOgg6DoAAAAAQEBoJ0AACCD0F3AAPwyAV3AAPzMAl8AAF8BAAAAXAE+AT0woKwfoLLAAPtiAQABJ8AAcY8ABsAAwdmCLqEroTChegAAgkIAAAABA6E1oXoAAAAAAAAAXAE+AT0woT4foUTAAPtiAQABJ8AAcY8ABsAAwdqCLqG9ob+iFAAAhFkAAAABA6HFohQAAAABAQGhzQAAAIPRYMAA/RwAAF8BAAE+AT0wodgfod7AAPtiAQABJ8AAcY8ABsAAwduCLqJXolyixQAAlvgAAAABA6JnosUAAAABAQGibQAAAJb5YQJfAABfAQBgwAD6CgAAXAE+AT0wookfoo/AAPtiAQABJ8AAcY8ABsAAwdyCLqMIowqjbQAAmRUAAAABA6MVo20AAAACAgKjGAAAIIPRXwAAAKMfAAAgwABC7GEAXwEAAABfAQABPgE9MKMxH6M3wAD7YgEAASfAAHGPAAbAAMHdgi6jsKOypCUAAKsmAAAAAQOjuKQlAAAAAwICo7sAACCD0V8AAACjwgAAIKsmYQFfAQBfAQAAAaPWAAAgwABC7GEAXwEAAWoAYMAA/Nl3XwEAAT4BPTCj6R+j78AA+2IBAAEnwABxjwAGwADB3oIupGikbaTTAADAAELwAAAAAQOkdqTTAAAAAQEBpHkAACCrJmECXwAAXwEAXwEAAABcAT4BPTCklx+kncAA+2IBAAEnwABxjwAAAGDKEwBgymIAYMqvAGDLBABgyz0AYMuFAGDL0wBgzCgAYMyVAGDM4wAAAAkCwADB34Iumn2ag5wqA8AAcZAAAgAAhANgwAD9HAFbAACEBGDAAP0cAVsBXcAAzI4BXwEAAAABBMAAweKCLprWmtoJqQjAAL2XAF3AAPylAl8AAF8BAAABBcAAweyCLpremt6a/gAAAAOa85r+AAAAAQEBmvkAAASpCF3AAPylAl8AAF8BAAAAXcAAwd8CXwAAXwEAAT8CCAHAAMHigADAYM2DCQGa3sAAzJIAAAAABwbAAMHkgi6bA5sLmyABAGEAAAABA5sSmyAAAAAAAAAAYMAA+9ABSpsVARabGhabFS6pCMAAvZfAAMHiYcAA/MkGwADB5YIumySbLZtEAQCBVQAAAAEDmzWbRAAAAAAAAABgwAD6CgFKmzgBFps9Fps4LqkIwAC9l8AAweKBVcAA/MoGwADB5oIum0ibUZtuAQCDsgAAAAEDm1ybbgAAAAAAAABgwAD6CgFKm18BFptkFptfLqkIwAC9l8AAweKDssAA/MsGwADB54Ium3KbeJuWAQCDGQAAAAEDm36blgAAAAAAAABfAQABSpuBARybhRabgS6pCMAAvZfAAMHiSwEAARabkBabixabhi6pCMAAvZfAAMHig2LAAPzHgxnAAPxYAMAA/LkGwADB6IIum5qboJvAAQCAwwAAAAEDm6ebwAAAAAAAAABfAQABSpuqARybrhabqi6pCMAAvZfAAMHiSwEAARabuRabtBabry6pCMAAvZfAAMHig2LAAPzHgMPAAPxaAMAA/LkGwADB6YIum8SbypvmAQCB6AAAAAEDm8+b5gAAAAAAAABfAQABSpvSARyb1hab0i6pCMAAvZfAAMHiSwEAARab4Rab3Bab1y6pCMAAvZfAAMHig2LAAPzHgejAAPxZAMAA/LkGwADB6oIum+ub+5woAQBcAAAAAQOcBJwoAAAAAAAAAF3AAPxtAV8BAAFKnAcBH5wHwADB+AECXwAAXwEAARacIy6pCMAAvZfAAMHiAAAAYM3AAGDOAABgzkIAYM6EAGDO5wBgz0oAYM+tAGDP+gAAAAcCwADB7YIunLycwp5QA8AAcZEAAgAAhANgwAD9HAFbAACEBGDAAP0cAVsBYMAA/RwAAV3AAPxtAV8BAAMEwADB8IIunQudEAnAAEtHwAC9lwBdwAD8bQFfAAAABMAAwfGCLp0knSgJqQjAAL2XAF3AAPylAl8AAF8BAAAEwADB8oIunS6dNliItcAAvZcAXwEAASsBBcAAwfiCLp07nTudlQAAAAOdUJ2VAAAAAQEBnVsAAACAq13AAPylAl8AAF8BAAAAXcAAwe0CXwAAXwEAAT8DCADAAMHxgJ1vwGDQzggAwADB8BadjRadiICdhMBg0M6DYsAA/MdcwAD8VAkBnTvAAP0yAAAAAAIGwADB9IIunZqdn54wAABdAAAAAQOdp54wAAAAAAAAAGDAAPoKAT4DSZ2wHJ26Fp20LsAAS0fAAL2XwADB8F0AAAAAwAD8bz4CPRedzi6ItcAAvZccnd0WndkuqQjAAL2XwADB8UsBAAEWneQWnd4uwABLR8AAvZfAAMHwXsAA/HEAwAD8ucAAwfJKnfQBKT89F54LLoi1wAC9lyvAAMHySp4gASoGwADB9oIunjWeO55OAQBeAAAAAQOeQ55OAAAAAAAAAF8BAAFKnkYBFp5GLoi1wAC9l8AAwfIAAGDRKgBg0c8AYNIFAAAAAgLAAMH5gi6eqZ64pNUHwABxkgACAACEA2DAAP0cAVsAAIQEYMAA/RwBWwFgwAD9HAABXcAA/KUCXwAAXwEAAAEFwADCBQAAAAAEAAADAAAAAAAAAAAAXcAAwfkCXwAAXwEAAT8BCQEAwAD9MgAAAAAJBsAAwfuCLp8rnzmfjwMAgL8AAAABA588n48AAAACAgKfPwAAIIPRXwAAAJ9GAAAggJZfAQAAAFwBPgE9MJ9TH59ZwAD7YgEAASfAAHGPAAbAAMH8gi6f0p/XoDEAAIClAAAAAQOf3aAxAAAAAQEBn+gAACCD1l3AAPylAl8AAF8BAAAAXAE+AT0wn/Ufn/vAAPtiAQABJ8AAcY8ABsAAwf2CLqB0oHmg6AAAwABC7QAAAAEDoIOg6AAAAAEBAaCdAAAgg9BdwAD8MgFdwAD8zAJfAABfAQAAAFwBPgE9MKCsH6CywAD7YgEAASfAAHGPAAbAAMH+gi6hK6EwoXoAAIJCAAAAAQOhNaF6AAAAAAAAAFwBPgE9MKE+H6FEwAD7YgEAASfAAHGPAAbAAMH/gi6hvaG/ohQAAIRZAAAAAQOhxaIUAAAAAQEBoc0AAACD0WDAAP0cAABfAQABPgE9MKHYH6HewAD7YgEAASfAAHGPAAbAAMIAgi6iV6JcosUAAJb4AAAAAQOiZ6LFAAAAAQEBom0AAACW+WECXwAAXwEAYMAA+goAAFwBPgE9MKKJH6KPwAD7YgEAASfAAHGPAAbAAMIBgi6jCKMKo20AAJkVAAAAAQOjFaNtAAAAAgICoxgAACCD0V8AAACjHwAAIMAAQuxhAF8BAAAAXwEAAT4BPTCjMR+jN8AA+2IBAAEnwABxjwAGwADCAoIuo7CjsqQlAACrJgAAAAEDo7ikJQAAAAMCAqO7AAAgg9FfAAAAo8IAACCrJmEBXwEAXwEAAAGj1gAAIMAAQuxhAF8BAAFqAGDAAPzZd18BAAE+AT0wo+kfo+/AAPtiAQABJ8AAcY8ABsAAwgOCLqRopG2k0wAAwABC8AAAAAEDpHak0wAAAAEBAaR5AAAgqyZhAl8AAF8BAF8BAAAAXAE+AT0wpJcfpJ3AAPtiAQABJ8AAcY8AAABg0ocAYNLWAGDTIwBg03gAYNOxAGDT+QBg1EcAYNScAGDVCQBg1VcAAAAJAsAAwgaCLqXgpearhAPAAHGTAAIAAIQDYMAA/RwBWwAAhARgwAD9HAFbAWDAAP0cAAFdwAD8pQJfAABfAQABBMAAwgmCLqYdpiEJqQjAAL2XAF3AAPylAl8AAF8BAAABBcAAwiOCLqYlpiumTgEAAAOmMqZOAAAAAQEBpj0AAACAq13AAPylAl8AAF8BAAAAXcAAwgYCXwAAXwEAAT8CCADAAMIJgKZLwGDV/wkBpivAAP0yAAAAABYGwADCC4IuplOmX6aEAACWMgAAAAEDpmumhAAAAgAAwABC6WDAAP0cAVsAAMAAQupgwAD9HAFbAAAAAF3AAPylAl8CAF8DAAFKpnEBHKZ2FqZxLqkIwAC9l8AAwgmWMgACXwIAXwMAAADAAPy2BsAAwgyCLqaIppOmrgMASwAAAAEDppWmrgAAAAEBAaadAAAAg9FgwAD9HAAAXwEAAUqmpQEcpqkWpqUuqQjAAL2XwADCCUsBAAGApqrAYNbJAMAA/LkGwADCDYIuprKmwKbvAwCAvwAAAAEDpsOm7wAAAAICAqbGAAAgg9FfAAAAps0AACCAll8BAAAAXAE+AT0cpt4WptouqQjAAL2XwADCCYC/AgACgKbfwGDXIIGm5sBg1ysAwAD8ugbAAMIOgi6m9Kb5py0AAIClAAAAAQOm/6ctAAAAAQEBpwoAACCD1l3AAPylAl8AAF8BAAAAXAE+AT0cpxwWpxcuqQjAAL2XwADCCYClAQABgKcjwGDXhQDAAPzBBsAAwg+CLqcypzenVQAAgkIAAAABA6c8p1UAAAAAAAAAXAE+AT0cp0oWp0UuqQjAAL2XwADCCYJCAAAAAMAA/MMGwADCEIIup1qnXKefAACZFQAAAAEDp2ennwAAAAICAqdqAAAgg9FfAAAAp3EAACDAAELsYQBfAQAAAF8BAAFKp4ABHKeFFqeALqkIwAC9l8AAwgmZFQIAAoCnkcBg2CKBp5bAYNgtAMAA/MAGwADCEYIup6OnqKfYAACHQQAAAAEDp7On2AAAAAEBAae7AAAAg9FgwAD9HAAAYMAA+goBSqfDARynyBanwy6pCMAAvZfAAMIJh0EBAAGAp9TAYNiOAMAA/LgGwADCEoIup9yn4agZAADAAELrAAAAAQOn7qgZAAAAAQEBp/YAAACAlmDAAP0cAABgwAD6CgFKqAABHKgFFqgALqkIwAC9l8AAwgnAAELrAQABgKgTwGDY6gDAAPy3BsAAwhOCLqgdqCKoZQAAg/gAAAABA6gpqGUAAAABAQGoLwAAAIihYQJfAABfAQBcAABcAT4BPRyoUhaoTS6pCMAAvZfAAMIJg/gBAAGAqFrAYNlGAMAA/MQGwADCHIIuqGqoc6iKAQCBVQAAAAEDqHuoigAAAAAAAABgwAD6CgFKqH4BFqiDFqh+LqkIwAC9l8AAwgmBVcAA/MoGwADCHYIuqI6ol6i0AQCDsgAAAAEDqKKotAAAAAAAAABgwAD6CgFKqKUBFqiqFqilLqkIwAC9l8AAwgmDssAA/MsGwADCHoIuqLiowKjVAQBhAAAAAQOox6jVAAAAAAAAAGDAAPvQAUqoygEWqM8WqMouqQjAAL2XwADCCWHAAPzJBsAAwh+CLqjZqOmo+gEAg2IAAAABA6juqPoAAAAAAAAAXcAA/DIBXwAAAUqo8QEWqPYWqPEuqQjAAL2XwADCCYNiwAD8xwbAAMIUgi6o/qkAqSYAAIRZAAAAAQOpBqkmAAAAAQEBqQ4AAACD0WDAAP0cAABfAQABSqkWARypGxapFi6pCMAAvZfAAMIJhFkBAAGAqSLAYNqpAMAA/MIGwADCFYIuqSqpMalOAAAjAAAAAQOpOalOAAAAAAAAAGDAAP22AUqpPwEcqUQWqT8uqQjAAL2XwADCCSMAAAAAwAD9KgbAAMIggi6pUqliqXcBACkAAAABA6lpqXcAAAAAAAAAXcAA/DIBXwEAAUqpbAEWqXEWqWwuqQjAAL2XwADCCSnAAPzIBsAAwiGCLql8qZmpsAEAg9AAAAABA6mhqbAAAAAAAAAAXcAA/DIBXcAA/MwCXwAAXwEAAUqppAEWqakWqaQuqQjAAL2XwADCCYPQwAD8xgbAAMIWgi6ptam6qgkAAMAAQu0AAAABA6nEqgkAAAABAQGp3gAAIIPQXcAA/DIBXcAA/MwCXwAAXwEAAABcAT4BPRyp8hap7S6pCMAAvZfAAMIJwABC7QEAAYCp/cBg29oAwAD8vAbAAMIXgi6qDqoaqnYAAICrAAAAAQOqJap2AAACAADAAELuYMAA/RwBWwAAwABC72DAAP0cAVsBAQGqNwAAAIH2YQJfAABfAQBdwAD8zAJfAgBfAwAAAF3AAPylAl8CAF8DAAFKqlsBHKpgFqpbLqkIwAC9l8AAwgmAqwECXwIAXwMAAYCqbMBg3FgAwAD8uwbAAMIYgi6qe6p9quMAAKsmAAAAAQOqg6rjAAAAAwICqoYAACCD0V8AAACqjQAAIKsmYQFfAQBfAQAAAaqhAAAgwABC7GEAXwEAAWoAYMAA/Nl3XwEAAUqqtwEcqrwWqrcuqQjAAL2XwADCCasmAwACgKrDwGDczoGqyMBg3NkBwABC7IKq2sBg3OrAAPy9BsAAwhmCLqroqu2rMQAAwABC8AAAAAEDqvarMQAAAAEBAar5AAAgqyZhAl8AAF8BAF8BAAAAXAE+AT0cqxwWqxcuqQjAAL2XwADCCcAAQvABAAGAqybAYN1fAMAA/L4GwADCGoIuqzarO6uCAACW+AAAAAEDq0arggAAAAEBAatMAAAAlvlhAl8AAF8BAGDAAPoKAABcAT4BPRyrbRaraC6pCMAAvZfAAMIJlvgBAAGAq3nAYN28AMAA/L8AAGDWPQBg1qoAYNcAAGDXZQBg18EAYNgCAGDYbgBg2MgAYNkmAGDZfwBg2cEAYNoDAGDaQwBg2okAYNrhAGDbJQBg22kAYNu4AGDcHgBg3K4AYN09AGDdnABg3fkAAAAWAsAAwiSCLqx2rHytXzfAAHGUAAIAAIQDYMAA/RwBWwAAhARgwAD9HAFbAV3AAMIGAl8AAF8BAAABXcAAwfkCXwAAXwEAAAEFwADCJgAAAAAFAAADAAAAAAABAQEAAAAAgKtdwAD8pQJfAABfAQAAAF3AAMIkAl8AAF8BAAE/AQkAAMAAwiMBAAGAAMBg3rYACQbAAMIogi6fK585n48DAIC/AAAAAQOfPJ+PAAAAAgICnz8AACCD0V8AAACfRgAAIICWXwEAAABcAT4BPTCfUx+fWcAA+2IBAAEnwABxjwAGwADCKYIun9Kf16AxAACApQAAAAEDn92gMQAAAAEBAZ/oAAAgg9ZdwAD8pQJfAABfAQAAAFwBPgE9MJ/1H5/7wAD7YgEAASfAAHGPAAbAAMIqgi6gdKB5oOgAAMAAQu0AAAABA6CDoOgAAAABAQGgnQAAIIPQXcAA/DIBXcAA/MwCXwAAXwEAAABcAT4BPTCgrB+gssAA+2IBAAEnwABxjwAGwADCK4IuoSuhMKF6AACCQgAAAAEDoTWhegAAAAAAAABcAT4BPTChPh+hRMAA+2IBAAEnwABxjwAGwADCLIIuob2hv6IUAACEWQAAAAEDocWiFAAAAAEBAaHNAAAAg9FgwAD9HAAAXwEAAT4BPTCh2B+h3sAA+2IBAAEnwABxjwAGwADCLYIuoleiXKLFAACW+AAAAAEDomeixQAAAAEBAaJtAAAAlvlhAl8AAF8BAGDAAPoKAABcAT4BPTCiiR+ij8AA+2IBAAEnwABxjwAGwADCLoIuowijCqNtAACZFQAAAAEDoxWjbQAAAAICAqMYAAAgg9FfAAAAox8AACDAAELsYQBfAQAAAF8BAAE+AT0wozEfozfAAPtiAQABJ8AAcY8ABsAAwi+CLqOwo7KkJQAAqyYAAAABA6O4pCUAAAADAgKjuwAAIIPRXwAAAKPCAAAgqyZhAV8BAF8BAAABo9YAACDAAELsYQBfAQABagBgwAD82XdfAQABPgE9MKPpH6PvwAD7YgEAASfAAHGPAAbAAMIwgi6kaKRtpNMAAMAAQvAAAAABA6R2pNMAAAABAQGkeQAAIKsmYQJfAABfAQBfAQAAAFwBPgE9MKSXH6SdwAD7YgEAASfAAHGPAAAAYN7rAGDfOgBg34cAYN/cAGDgFQBg4F0AYOCrAGDhAABg4W0AYOG7AAAACQLAAMIxgi6sdqx8rV8DnH4AAgAAhANgwAD9HAFbAACEBGDAAP0cAVsBXcAAwiQCXwAAXwEAAAAAAQXAAMI1gi6s1azVrQQAAAADrOitBAAAAAEBAazzAAAAgKtdwAD8pQJfAABfAQAAAF3AAMIxAl8AAF8BAAE/AQkArPrAAMImAQABgK0AwGDiPAABBsAAwjOCLq0JrRWtXQAAljIAAAABA60hrV0AAAIAAMAAQulgwAD9HAFbAADAAELqYMAA/RwBWwAAAABdwAD8pQJfAgBfAwABSq0tAR+tLcAAwjUBAl8CAF8DAAEcrU4WrUkuqQjAAL2XwADCCZYyAAJfAgBfAwAAAMAA/LYAAABg4nQAYOLyAAAAAQLAAMI2gjaDLIM7kNAHnv4AAQAAg8tgwAD9HAFbAWDAAP0cAAFdwADMjgFfAAABBMAAwjmCNoM7AASWQsAAvZcAWwExAFsDGgDAAMI7GgDAAMI8GgDAAMI9AA8GwADCO4I2g4WDjYOjBEEAAAAAAQODkoOjAAABAACDy2DAAP0cAVsAAAAAXcAAwjYBXwEAAT01AAAAAIJtWwEaAMAAwuI1AAAAAJZDXwEAASsTAAAGwADCPII2hdWF3YYOBEGWKAAAAAEDheeGDgAAAQAAg8tgwAD9HAFbAQEBhfEAAACIP13AAPwyAVsAAF3AAMI2AV8BAAE9NQAAAACCbVsBGgDAAMK+NQAAAACWQ18BAAErEwAABsAAwj2CNobKhtKHAgRBmjEAAAABA4bahwIAAAEAAIPLYMAA/RwBWwEBAYbnAAAAiD9dwAD8MgFfAQAAAF3AAMI2AV8BAAE9NQAAAACCbVsBGgDAAMK/NQAAAACWQ18BAAErEwAABsAAwj+CNokeiS6JaAABwABvmwAAAAEDiTyJaAAAAgAAlkdgwAD9HAFbAACCdmDAAP0cAVsBAQGJRgAAAINEXcAAwjYBXwEAAABdwADCNgFfAgABSolRAR+JUcAAzI0BAl8BAF8CAAGAiWHAYOSwAAbAAMJAgjaLjouXi6AAApYyAAAAAQOLnougAAABAACW82DAAP0cAVsAAAAAXcAAwjYBXwEAAAbAAMJBgjaMJIwmjDMAAp8QAAAAAQOMMYwzAAAAAAAAAF8AAAAGwADCQoI2jLWMt4zDAAKGEQAAAAEDjMGMwwAAAAAAAABfAAAABsAAwkOCNoz6jP+NEAACwABrQwAAAAEDjQeNEAAAAAEBAY0KAAAggJZfAAAAAFwABsAAwkSCNo1BjUaNVgAChCIAAAABA41NjVYAAAABAQGNUAAAIICWXwAAAABcAAbAAMJFgjaNh42MjZgAAlYAAAABA42PjZgAAAABAQGNkgAAIICWXwAAAABcAAbAAMJGgjaOT45UjmgAAoRZAAAAAQOOWo5oAAAAAQEBjmIAAACAlmDAAP0cAABgwAD6CgAGwADCR4I2jvOO+I8UAAKApQAAAAEDjv6PFAAAAAEBAY8LAAAgg8xdwAD8MgFfAAAAAFwABsAAwkiCNo+aj5+PwAAClvgAAAABA4+qj8AAAAABAQGPsAAAAJb5YQFfAABgwAD6CgAAXAAGwADCSYI2kEqQT5BwAAKW+wAAAAEDkFqQcAAAAAEBAZBgAAAAlvlhAV8AAGDAAPoKAABcAAbAAMJKgjaQwpDHkM4AAoJCAAAAAQOQzJDOAAAAAAAAAFwAAABg41oAYOOuAGDkEgBg5HgAYOToAGDlHgBg5UMAYOVoAGDlmABg5cYAYOXzAGDmJwBg5lsAYOaQAGDmxQBg5ugAAAAPAsAAwkuCNpDTkNmSxwPAAHGVAAEAAII9XcAAwksBXwAAAV3AAMJLAVsBYMAA/RwAAAIEwADCToI2kQ6RG1jAAHGWwAC9lwBfAAABKwTAAMJPgjaRJJEtWMAAcZfAAL2XAF8AAAErAQXAAMJVAAAAAAQAAAMAAAAAAAAAAABdwADCSwFfAAABPwEJAQDAAP0yAAAAAAIGwADCUoI2kTKRN5H1AACWSMAAvZcAAAABA5E8kfUAAAACAgKRQgAAIJzyXwAAAJFRAAAgg7BfAAAAAFwBPgQ9F5FdLsAAcZfAAL2XgZFpwGDn8cAAwk89F5FzLsAAcZbAAL2XgJGDwGDn5sAAwk5JkZEhHJGegJGVwGDn5kgBAAErAMAA/Sk9F5GwgJGnwGDn5sAAcZfAAL2XJpGwAS5fAADAAMJPP0mRxiEckc+BkcrAYOfxSAEAASsAwAD9KT0Xkd2BkdjAYOfxwABxlsAAvZcmkd0BLl8AAMAAwk4/BsAAwlOCNpH6kf+SxQAAwABxecAAvZcAAAABA5IGksUAAAAAAAAAXAE+BEmSDyEckiEWkhMuwABxlsAAvZfAAMJOSAEAASsAwAD9KT0XkjgWkiouwABxlsAAvZfAAMJOwABxl8AAvZcWkkQuwABxl8AAvZfAAMJPwADCTz9JklMhHJJhFpJXLsAAcZfAAL2XwADCT0gBAAErAMAA/Sk9F5J0FpJqLsAAcZfAAL2XwADCT8AAcZbAAL2XFpKELsAAcZbAAL2XwADCTsAAwk4/PReSly7AAHGXwAC9lyvAAMJPPReSrS7AAHGWwAC9lyvAAMJOAABg58IAYOihAGDplAAAAAICwADCVoI2k0iTTpY3A8AAcZgAAQAAg8tgwAD9HAFbAV3AAMJLAV3AAMJWAV8AAAAAAQTAAMJYgjaTvZPEWJYgAF8AAAABBcAAwmCCNpPJk8mT7QAAAAOT35PtAAAAAQEBk+UAAASWIF8AAAAAXcAAwlYBXwAAAT8CCAHAAMJYgADAYOoGCQGTycAAwlUAAAAABQbAAMJagjaULpQzlHwAAMAAZG8AAAABA5Q5lHwAAAABAQGUPAAAIINNXwAAAABcAT4BPRyUYh+URcAAwmABAV8AAAGAlF/AYOpZAJZIwAC9lwIAAi4WlG4uwABxl8AAvZfAAMJPAMAAwlIGwADCW4I2lL+UxJUSAACD6AAAAAEDlMuVEgAAAAEBAZTOAAAgg01fAAAAAFwBPgE9HJT0H5TXwADCYAEBXwAAAYCU8cBg6sEAlkjAAL2XAgACFpT6LsAAcZbAAL2XwADCTi4AwADCUgbAAMJcgjaVF5UZlUkAAIRZAAAAAQOVH5VJAAAAAAAAAF8AAAE+Aj0clSguwABxecAAvZcAAAAAwADCU0qVNwEWlT4uliDAAMJYBsAAwl2CNpWLlaWVxQAAwABxmQAAAAEDlbKVxQAAAAAAAABdwADCVgFfAAABSpW4ARaVuC7AAHGWwAC9l8AAwk4GwADCXoI2lgOWHZY1AADAAHGaAAAAAQOWJpY1AAAAAAAAAF3AAMJWAV8AAAFKliwBFpYsLsAAcZfAAL2XwADCTwAAYOo3AGDqoQBg6wkAYOtTAGDrlABg69UAAAAFAsAAwmGCNpdkl3OaVAfAAHGbAAEAAIPLYMAA/RwBWwFdwADCVgFfAAAAAAEEwADCZII2l8mXz1i0mcAAvZcAXcAAwoYBXwAAAAEFwADCcYI2l9OX05gTAAAAA5fqmBMAAAACAgKX7QAAAJYgXwAAAJf7AAAEtJldwADChgFfAAAAAF3AAMJhAV8AAAE/AggBwADCZIEAwGDsYgkAmAXAAMJgAQABgJgLwGDsVwAHBsAAwmeCNpgYmDKYRwACwABxnMAAvZcAAAABA5hFmEcAAAAAAAAAXcAAwlYBXwAAAAbAAMJogjaYTJhRmKYAAMAAcZ3AAL2XAAAAAQOYWJimAAAAAQEBmFsAACCDTV8AAAAAXAE+AT0cmIwfmGTAAMJ7AgFfAAACgJiBwGDs9xaYhC60mcAAvZfAAMJkAJZIwAC9lwIAAi4WmJguwABxl8AAvZfAAMJPAMAAwlIGwADCaYI2mKuYsJkKAADAAHGewAC9lwAAAAEDmLiZCgAAAAEBAZi7AAAgg01fAAAAAFwBPgE9HJjsH5jEwADCewIBXwAAAoCY4cBg7XMWmOQutJnAAL2XwADCZACWSMAAvZcCAAIWmPIuwABxlsAAvZfAAMJOLgDAAMJSBsAAwmqCNpkPmRGZGgACwABxBMAAvZcAAAABA5kYmRoAAAAAAAAAXwAAAAbAAMJvgjaZH5klmTgBAJcSwAC9lwAAAAEDmS6ZOAAAAAAAAABfAAABSpkxARaZMS6WIMAAwlgGwADCa4I2mT2ZV5nBAADAAHGaAAAAAQOZYJnBAAAAAAAAAF3AAMJWAV8AAAE+Ak6ZhJmKAACDz13AAMJhAV8AAAEmmYQBFpmMLsAAcZfAAL2XwADCT13AAMJhAV8AAEqZmwEcmaiAmaLAYO5bwABxnMAAvZcAAAAAwADCZwbAAMJsgjaZxpngmlIAAMAAcZkAAAABA5ntmlIAAAAAAAAAXcAAwlYBXwAAAT4CTpoRmhcAAIPPXcAAwmEBXwAAASaaEQEWmhkuwABxlsAAvZfAAMJOXcAAwmEBXwAASposARyaOYCaM8Bg7tjAAHGcwAC9lwAAAADAAMJnAABg7KAAYOzRAGDtTQBg7ckAYO30AGDuKwBg7qgAYO8lAAAABwLAAMJygjabApsInVQDwABxnwABAACDy2DAAP0cAVsBXcAAwmEBXwAAAAAAAQXAAMJ7gjabTJtMm6oAAAADm2WbqgAAAAICAptoAAAAliBfAAAAm4YAAACzKF3AAMKGAV8AAAAAXcAAwnIBXwAAAT8BCQCblcAAwnECAAKAm5vAYO+SgZukwGDvnQAFBsAAwnSCNpuvm7ScBAAAwABkbwAAAAEDm7qcBAAAAAEBAZu9AAAgg01fAAAAAFwBPgI9HJvGLsAAcZ3AAL2XAQABgJvOwGDv+ADAAMJoSZvWIRyb4Rab2i60mcAAvZfAAMJkSAEAASsAwAD9KT01AAAAAQBdwADChgFfAAABFpvqLrSZwAC9l8AAwmQXm/GBm/HAYPBFwABw58AAvZccm/4Wm/GBm/HAYPBFwABw58AAvZfAAMKKZAEAAZQAwAD89cAAwoo/BsAAwnWCNpwJnA6cYAAAg+gAAAABA5wVnGAAAAABAQGcGAAAIINNXwAAAABcAT4CPRycIS7AAHGewAC9lwEAAYCcKsBg8LwAwADCaUmcMiEcnD0WnDYutJnAAL2XwADCZEgBAAErAMAA/Sk9NQAAAAEAXcAAwoYBXwAAARacRi60mcAAvZfAAMJkF5xNgZxNwGDxCcAAcOfAAL2XHJxaFpxNgZxNwGDxCcAAcOfAAL2XwADCimQBAAGUAMAA/PXAAMKKPwbAAMJ3gjacZZxnnKsAAMAAcQTAAL2XAAAAAQOcbpyrAAAAAAAAAF8AAAE+Az0XnHcutJnAAL2XK8AAwmQ9HJyKLsAAcXnAAL2XAAAAAMAAwlNKnJkBFpygLpYgwADCWAbAAMJ5gjacsJyynQUAAIRZAAAAAQOcuJ0FAAAAAAAAAF8AAAE+AkmcwSEcnMwWnMUutJnAAL2XwADCZEgBAAErAMAA/Sk9NQAAAAEAXcAAwoYBXwAAARac1S60mcAAvZfAAMJkF5zcgJzcwGDyCMAAcOfAAL2XHJzpFpzcgJzcwGDyCMAAcOfAAL2XwADCioGNAQABlADAAPz2wADCij9KnPEBHJz4LsAAcQTAAL2XAAAAAMAAwncGwADCeII2nQqdJ51SAADAAHGcwAC9lwAAAAEDnTqdUgAAAAAAAABdwADCcgFfAAABPgFKnUMBLgAAYO/WAGDwnABg8WAAYPHAAGDyeABg8rAAAAAFAsAAwnyCNp6VnpugwQPAAHGgAAEAAIPLYMAA/RwBWwFdwADCYQFfAAAAAAABBcAAwoWCNp7gnuCfYAAAAAOe+p9gAAAAAQEBnxAAAACzKF3AAMKGAV8AAAAAXcAAwnwBXwAAAT4CPRefMi7AAHGWwAC9ly7AAMJOPRefTC7AAHGXwAC9ly7AAMJPAQkAnxnAAMJxAgACK4CfJcBg8xUAAwbAAMJ/gjafZZ9/n6oAAMAAcZzAAL2XAAAAAQOfkp+qAAAAAAAAAF3AAMJWAV8AAAE+AUqfmwErBsAAwoCCNp/6n/ygNgAAwABxBMAAvZcAAAABA6ADoDYAAAAAAAAAXwAAAT4BPTCgDB6gJ8AAzfIAAAAABsAAwoOCNqCAoIagvwEAlxLAAL2XAAAAAQOgj6C/AAAAAAAAAF8AAAE+AT0woJUeoLDAAM3yAAAAAAAAYPNtAGDzpQBg8+EAYPQbAAAAAwLAAMKGgjahRqFMvCQDwABxoQABAACDy2DAAP0cAVsBXcAA/DIBXwAAAAFdwADCNgFfAAACBMAAwomCNqGrobRYwABxosAAvZcAXcAAwnwBXwAAASsEwADCioI2obyhzRjAAHDnwAC9lwBgwAD70AGTAQXAAMKogjah0qHSoh8AAAADoeOiHwAAAAAAAABdwADChgFfAAABPgE9F6HsLsAAcaLAAL2XH6H4wADChQEBXwAAAS4AwADCiQEJAaHSwAD8XAAAAAAYBsAAwoyCNqRtpHWlHQQBligAAAABA6SLpR0AAAEAAIPLYMAA/RwBWwEBAaSVAAAAiD9dwAD8MgFbAABdwADChgFfAQABPgNOpK6kswAAg1tdwADCNgFfAQABH6S1wADCqAABXwEAAABGpNGk66TcAAABg01bAICk4cBg9SM+AT0cpPiBpPPAYPVAhCIBAAEmpQABgqUAwGD1ZV8BAADAAMJESqUOASalDgGBpRXAYPVAXcAAwoYBXwEABsAAwo2CNqXnpe+mSwQBmjEAAAABA6YDpksAAAEAAIPLYMAA/RwBWwEBAaYQAAAAiD9dwAD8MgFfAQAAAF3AAMKGAV8BAAFKpiMBNaYjAAABAF3AAMKGAV8BAAEfpiPAAMKoAAFfAQAAADUAAAABAFsBHKY7gaY5wGD1/oClAQABgKZCwGD13QDAAMKTgQDAYPX+BsAAwo+CNqZQplmmgAAAljIAAAABA6ZgpoAAAAEAAJbzYMAA/RwBWwAAAABdwADCNgFfAQABSqZmAR6mbMAAwj8BAl8AAF8BAAEuAAbAAMKhgjamhKaMpqMBAGEAAAABA6aTpqMAAAAAAAAAYMAA+9ABSqaWARamli7AAHDnwAC9l8AAwooGwADCkII2pqimrab2AACEIgAAAAEDprSm9gAAAAEBAaa3AAAggJZfAAAAAFwBPgI9HKbOFqbELsAAcaLAAL2XwADCicAAcZ7AAL2XAQABgKbXwGD26wDAAMJpPRem4y7AAHDnwAC9lxym8Bam4y7AAHDnwAC9l8AAwopkAQABlADAAPz1wADCigbAAMKRgjam+6cAp0kAAMAAa0MAAAABA6cIp0kAAAABAQGnCwAAIICWXwAAAABcAT4CPRynIhanGC7AAHGiwAC9l8AAwonAAHGdwAC9lwEAAYCnKsBg93YAwADCaD0XpzYuwABw58AAvZccp0MWpzYuwABw58AAvZfAAMKKZAEAAZQAwAD89cAAwooGwADCkoI2p06nU6eYAABWAAAAAQOnVqeYAAAAAQEBp1kAACCAll8AAAAAXAE+Aj0cp3AWp2YuwABxosAAvZfAAMKJwABxnsAAvZcBAAGAp3nAYPf+AMAAwmk9F6eFLsAAcOfAAL2XHKeSFqeFLsAAcOfAAL2XwADCimQBAAGUAMAA/PXAAMKKBsAAwpOCNqedp6KoJwAAgKUAAAABA6eoqCcAAAABAQGntQAAIIPMXcAA/DIBXwAAAABcAT4BRqfFp+Wn0gAAAYCWXwAAAICn28Bg+Ic+Aj0cp/cWp+0uwABxosAAvZfAAMKJwABxnsAAvZcBAAGBqADAYPiiAMAAwmk9F6gOLsAAcOfAAL2XHKgbFqgOLsAAcOfAAL2XwADCimQBAAGUAMAA/PXAAMKKBsAAwpSCNqgsqC6ozwAAhhEAAAABA6g4qM8AAAAAAAAAXwAAAT4ETqhcqGYAAMAAcaNdwADCYQFfAAABJqhcARaochaoaC7AAHGiwAC9l8AAwonAAHGWwAC9l8AAwk5dwADCYQFfAABOqIeojgAAgXZfAAABHKiagKiQwGD5N8AAcQTAAL2XAAAAAMAAwmo9F6ipLsAAcOfAAL2XHKi2FqipLsAAcOfAAL2XwADCioGNAQABlADAAPz2wADCikqovgGBqMXAYPl4BsAAwpWCNqjUqNapdgAAnxAAAAABA6jhqXYAAAAAAAAAXwAAAT4ETqkFqRAAAMAAcaRdwADCYQFfAAABJqkFARapHBapEi7AAHGiwAC9l8AAwonAAHGXwAC9l8AAwk9dwADCYQFfAABOqS2pNAAAgXZfAAABHKlBgKk2wGD6AMAAcQTAAL2XAAAAAMAAwmo9F6lQLsAAcOfAAL2XHKldFqlQLsAAcOfAAL2XwADCioGNAQABlADAAPz2wADCikqpZQGBqWzAYPpBBsAAwpaCNql7qYCrUwAAhFkAAAABA6mGq1MAAAABAQGpjgAAAK19YMAA/RwAAGDAAPoKAT4DTqmyqbgAAIPPXcAAwmEBXwAAASapsgEWqcQWqbouwABxosAAvZfAAMKJwABxl8AAvZfAAMJPXcAAwmEBXwAAQ6nTIR6p28AA9bECAAKBqeXAYPrYFqnsLsAAcaLAAL2XwADCiQA+BE6qBaoMAACVoGDAAPoKARyqHhaqFYGqD8Bg+tiXEsAAvZfAAMJvSAEAAYCqIcBg+sEAwAD9KUmqKyEeqjDAAPWxAgACLhaqRoGqQMBg+ti0mcAAvZfAAMJkAD4BPTCqhh+qjMAA+3cBAAEuAD9Jqr2CqsHAYPs/PgM9HKrZgarTwGD62MAAcQTAAL2XAAAAAMAAwmo9F6rsLsAAcOfAAL2XHKr5FqrsLsAAcOfAAL2XwADCioGNAQABlADAAPz2wADCikqrBQEpPz2JqyDAYPrYJqsgARarLoGrKMBg+tjAAHGXwAC9l8AAwk9dwADCYQFfAABKq0MBKgbAAMKYgjarWKtdrYgAAJ+swAC9lwAAAAEDq2StiAAAAAICAqtqAAAAlvlhAV8AAGDAAPoKAKuAAAAAwABxBmDAAPoKAABcAT4CTquxq7cAAIPPXcAAwmEBXwAAASarsQEWq8MWq7kuwABxosAAvZfAAMKJwABxl8AAvZfAAMJPXcAAwmEBXwAAQ6vSIR6r2sAA9bECAAKCq+TAYPyCFqvrLsAAcaLAAL2XwADCiQA+BU6sBKwMAAC+MWDAAPoKARysEoCsDsBg/FsgAQABFqwZgqwTwGD8gpcSwAC9l8AAwm8AAEmsKiEerC/AAPWxAgACLhasRYKsP8Bg/IK0mcAAvZfAAMJkAD4BPTCshR+si8AA+3cBAAEuAD9OrNes3AAAg7BdwADCYQFfAAABJqzXARas5IKs3sBg/ILAAHGXwAC9l8AAwk9dwADCYQFfAABJrQgerQzAAPWxAgACga0WwGD8bYOtJsBg/OkAPgI9HK1Agq06wGD8gsAAcQTAAL2XAAAAAMAAwmo9F61TLsAAcOfAAL2XHK1gFq1TLsAAcOfAAL2XwADCioGNAQABlADAAPz2wADCij89iq1ywGD8goStesBg/VMGwADCmYI2rY2tkq3RAACW+AAAAAEDrZ2t0QAAAAEBAa2jAAAAlvlhAV8AAGDAAPoKAABcAT4BPRytui6frMAAvZcCAAKArcLAYP4gKQDAAMKYBsAAwpqCNq3WrduuGwAAlvsAAAABA63mrhsAAAABAQGt7AAAAJb5YQFfAABgwAD6CgAAXAE+AT0crgMun6zAAL2XAgACgK4LwGD+cioAwADCmAbAAMKigjauIK4mrpEBAIMZAAAAAQOuLK6RAAAAAAAAAF8AAAE+Ak6uTa5YAADAAHGkXcAAwmEBXwAAASauTQEWrmQWrlouwABxosAAvZfAAMKJwABxl8AAvZfAAMJPXcAAwmEBXwAASq5zARauhYCuesBg/syXEsAAvZfAAMJvBsAAwqOCNq6WrpyvCAEAgegAAAABA66hrwgAAAAAAAAAXwAAAT4CTq7CrswAAMAAcaNdwADCYQFfAAABJq7CARau2Bauzi7AAHGiwAC9l8AAwonAAHGWwAC9l8AAwk5dwADCYQFfAABKrusBFq78gK7ywGD/TJcSwAC9l8AAwm8GwADCpII2rw2vE7BkAQCAwwAAAAEDrxqwZAAAAAAAAABfAAABPgJJr5ger5zAAPWxAgACFq+wFq+mLsAAcaLAAL2XwADCicAAcZfAAL2XwADCTxavxRavuy7AAHGiwAC9l8AAwonAAHGWwAC9l8AAwk4APgJOr/iv/gAAg89dwADCYQFfAAABJq/4ARawChawAC7AAHGiwAC9l8AAwonAAHGXwAC9l8AAwk9dwADCYQFfAABKsBsBFrAogLAiwGEAGpcSwAC9l8AAwm8/PTCwPB6wV8AAzfMAAAAABsAAwpuCNrIJsiOyVgAAwABxpAAAAAEDsi2yVgAAAAAAAABdwADCVgFfAAABPgFKsjYBHLJHFrI9LsAAcaLAAL2XwADCicAAcZoAAAAAwADCawbAAMKcgjaz+rQUtEoAAMAAcaMAAAABA7QdtEoAAAAAAAAAXcAAwlYBXwAAAT4BSrQmARy0Nxa0LS7AAHGiwAC9l8AAwonAAHGZAAAAAMAAwmwGwADCpYI2tE+0WLScAQCBVQAAAAEDtGC0nAAAAAAAAABgwAD6CgE+AUq0ZgEetG7AAPWxAgACFrSCFrR4LsAAcaLAAL2XwADCicAAcZfAAL2XwADCTxa0jS7AAHGiwAC9l8AAwokABsAAwp2CNrShtKa1FwAAgkIAAAABA7SrtRcAAAAAAAAAXAE+Az0XtL4WtLQuwABxosAAvZfAAMKJwABxl8AAvZcWtMouwABxosAAvZfAAMKJwADCTz0XtOMWtNkuwABxosAAvZfAAMKJwABxlsAAvZcWtPMuwABxosAAvZfAAMKJwADCTj0XtQIuwABw58AAvZeTwADCigbAAMKegja4lribu24AAMAAcaUAAAABA7inu24AAAABAQG4rQAAAIihYQFdwADCVgFfAABcAABcAT4CTrj5uP8AAIPPXcAAwmEBXwAAASa4+QEWuQsWuQEuwABxosAAvZfAAMKJwABxl8AAvZfAAMJPXcAAwmEBXwAAQ7kaIR65IsAA9bECAAKBuSzAYQJeFrkzLsAAcaLAAL2XwADCiQA+BU65ZLlsAACWIF3AAMJyAV8AAAEmuWQBgbluwGECXl3AAMJyAV8AAE65lrmbAACDsF3AAMJhAV8AAAEmuZYBFrmlgrmdwGECxcAAcZfAAL2XwADCT13AAMJhAV8AAD0cupGAuovAYQJEIAEAAYK6ksBhAsUAAEm6oh66psAA9bECAAIuFrq8gbq2wGECXrSZwAC9l8AAwmQAPgE9i7rPwGEC7Ca6zwEWutyButbAYQJewABxl8AAvZfAAMJPXcAAwmEBXwAASbr0IR66+cAA9bECAAIuFrsOg7sJwGEC7LSZwAC9l8AAwmQAPgE9MLshH7snwAD7dwEAAS4APz2Ju1jAYQJeg7tgwGEC7AbAAMKmgja7c7uVu9cBAFwAAAABA7ueu9cAAAAAAAAAXcAAwqkBXwAAAT4BSrukAR+7q8AAwrQBAV8AAAEWu8kuwABxosAAvZfAAMKJAAbAAMKfgja73LvjvCIAACMAAAABA7vrvCIAAAAAAAAAYMAA/bYBSrvxAR67/sAAwMQDAAMuJ5muJ4bAAAAAYPT4AGD1sgBg9kUAYPaRAGD2ywBg91QAYPffAGD4ZwBg+Q8AYPnYAGD6oQBg/DcAYP4AAGD+UgBg/qQAYP8kAGD/pABhAIAAYQDSAGEBJABhAYsAYQIiAGEDzwBhBB0AYQRZAAAAGALAAMKpgja8J7wtvzIDwABxpgABAACDy2DAAP0cAVsBYMAA/RwAAV3AAPxtAV8AAAMEwADCrII2vIS8jVjAAHGiwAC9lwBdwADCfAFfAAAABMAAwq2CNrysvLZYwABxp8AAvZcAXcAAwmEBXwAAAATAAMKugja8vLzEWIi1wAC9lwBfAAABKwEFwADCtII2vMm8yb1RAAAAA7zjvVEAAAABAQG9AgAAAL8ZXcAAwnwBXwAAAABdwADCqQFfAAABPwMIAMAAwqyAvSDAYQVlCADAAMKtJr09ARa9SIC9P8BhBWXAAHGXwAC9l8AAwk9dwADCYQFfAAAJAbzJwAD9MgAAAAACBsAAwrCCNr1WvVu/EgAAXQAAAAEDvWO/EgAAAAAAAABgwAD6CgE+Bkm9bB69cMAA9bECAAIWvXouwABxp8AAvZfAAMKtFr2GLsAAcaLAAL2XwADCrAA+BD0XvZouiLXAAL2XK8AAwq49F72xLsAAcafAAL2XK8AAwq09F73KLsAAcaLAAL2XK8AAwqxKveIBKj9Ovhe+JAAAwABxqF3AAMJyAV8AAAEmvhcBFr4mLsAAcafAAL2XwADCrV3AAMJyAV8AAEm+NiEevjvAAPWxAgACFr5PFr5FLsAAcaLAAL2XwADCrLSZwAC9l8AAwmQWvmSAvlfAYQZZtJnAAL2XwADCZAA+AT0wvnUfvnvAAPt3AQABFr6hFr6XLsAAcaLAAL2XwADCrLSZwAC9l8AAwmQAPz0XvrQuiLXAAL2XFr7MgL6/wGEGWZcSwAC9l8AAwm/AAMKuPRe+2i7AAHGnwAC9lya+2gEWvvSAvufAYQZZwABxl8AAvZfAAMJPXcAAwmEBXwAAwADCrUq/AwEpBsAAwrKCNr8Xvx2/MAEAXgAAAAEDvyW/MAAAAAAAAABfAAABSr8oARa/KC6ItcAAvZfAAMKuAABhBcYAYQdVAGEHiwAAAAICwADCtYI2wABAVsAAQFzAAGePA8AAcakAAQAAg8tgwAD9HAFbAV3AAMyTAV8AAAABXcAAwjYBXwAABQTAAMK4gjbAAECqwABAvwbAAGsnwAC9lwBgwAD70AFqwABAvmDAAPvQgz4EwADCuYI2wABAy8AAQNFYwABrOcAAvZcAXcAA/HQBXwAAASsEwADCuoI2wABA2cAAQN4YwABrOsAAvZcAYMAA+9AABMAAwruCNsAAQObAAEDrGMAAazvAAL2XAGDAAPvQAATAAMK8gjbAAEDzwABBCRjAAHDpwAC9lwBgwAD70AGTAQXAAMLigjbAAEGPwABBj8AAQw0AAAADwABBmMAAQw0AAAABAAHAAEGeAAAAwABrPGDAAPvQAWoAYMAA/Nl3AF3AAMK1AV8AAAE+A0nAAEHbIhzAAEHvgMAAQd/AYQiqSAEAASsAwAD88wEcwABCCoDAAEH6wGEIqmMBAAFqwABCDGDAAPvQgz4AwAD8/T4BPYjAAEInwGEIqmrAAEI5YMAA+9CDPknAAEJXIR7AAEJcwADCygEAAYDAAEJowGEIqgA+AT2IwABCgsBhCKoewABClMAAwssBAAGAwABCosBhCKoAP0AewABCxcAAwsoBAAGAwABC0cBhCKoAwABCxcAAQuEAPRfAAELoLsAAaznAAL2XHsAAQvHAAPXLAQFfAAABgMAAQvnAYQiqAMAAwrkDCADAAMK6kwgAwADCu5MJAcAAQY/AAMywAAAAACAGwADCvoI2wABFLcAARTXAAEe2BAGWKAAAAAEDwABFQ8AAR7YAAAEAAIPLYMAA/RwBWwEBAcAARU0AAACIP13AAPwyAVsAAF3AAMK1AV8BAAE+AUnAAEVdJcAARWqAwABFYcBhCghdwAD8dAFbPgZOwABFf8AARYYAAGFgwAD70AEWwABFkRTAAEWIwGEKCAABXcAA/HQBW2HAAPyjTsAARazAAEWyAACzKF3AAMK1AV8BAAEfwABFtMAAwuIBAV8BAAEcwABFyIHAAEXBwGEKQ2QBAAGUAMAA/PUAQBzAAEXvFsAARegWwABF4YLAAEXbwGEKccAAaznAAL2XwADCuWHAAPyjgJcBAAGBwABF8cBhCkMAwAD8/8AARdvAAEX3AEXAAEYAAcAARgnAAEYLAABiYMAA+9ABkwEcwABGEoPAAEYQwGEK+2MBAAGBwABGFMBhCkMAwAD8/QGLwABGHMBhCvscwABGHYPAAEYcwGEK+2QBAAGUAMAA/PU+AT0cwABGNxbAAEYxgsAARivAYQpxwABrOcAAvZfAAMK5gL8CAAKDwABGOMBhCvsmwABGNwEcwABGRRTAAEY9wGEKCAABXcAA/HQBW0sBAAGDwABGRsBhCvsAwAD8g18BAADAAPyEPRfAAEZegsAARljAYQpxwABrO8AAvZeBwABGZsBhCkPAAMK7SsAARnQBgsAARnvAYQpxPgVOwABGmcAARqIAAMAAapNgwAD70AFqwABGpGDAAPvQgz5JwABGvSXAAEbKgMAARsHAYQoIXcAAzI4BWz4BPYnAAEbwwGEL7RbAAEcEFMAARvvAYQoIAAFdwADMjgFbYcAAzJA/TsAARyfAAEcuAACBdl3AAMK1AV8BAAEfwABHMMAAwuIBAV8BAAGBwABHPcBhC+0ARsAAR07AAEduwABHWQAAAZYgWwCAwABHZMBhCgg+AT0cwABHf4LAAEd4wGEMUYQiAQABJsAAR4cBg8AAR4fAYQyJXwEAAMAAwtZKwABHnwGCwABHpsBhDFEGwADCv4I2wABIWsAASGLAAEiuBAGaMQAAAAEDwABIbsAASK4AAAEAAIPLYMAA/RwBWwEBAcAASHsAAACIP13AAPwyAV8BAAAAXcAAwrUBXwEAAUrAAEiOATXAAEiOAAABAF3AAMK1AV8BAAEfwABIjsAAwuIAAV8BAAAANQAAAAEAWwEcwABInoHAAEicwGENM4ClAQABgMAASKXAYQ0OAMAAwsaBAMBhDTMGwADCwYI2wABIzcAASNbAAEj9AACWMgAAAAEDwABI3cAASP0AAAEAAJbzYMAA/RwBWwAAAABdwADCNgFfAQABSsAASOMBHsAASOnAAMI/AQJfAABfAQABLgAGwADC24I2wABJAcAASRHAAEk4AQBcAAAAAQPAAEkawABJOAAAAAAAAABdwAD8bQFfAAABSsAASR0BH8AASR3AAMLwAQFfAAABLgAGwADCwoI2wABJPcAASULAAEohAACD+AAAAAEDwABJScAASiEAAAABAQHAAElPAAAAgaZhAV8AAFwAAFwBPgJOwABJZ8AASXkAAMAAcQdgwAD70AEWwABJey7AAHDpwAC9l8AAwrxFwABJkwHAAEmcwABJngAAYmDAAPvQARbAAEmgLsAAazrAAL2XwADCugEhHMAASamCwABJp8BhDpVIAQABFsAASawuwABrO8AAvZfAAMK7AMAA/PMBisAASbPAYQ6VHMAASb8cwABJuoLAAEm4wGEOlWQBAAGUAMAA/PWDdwEAARzAAEnQFsAASckWwABJwi7AAGs5wAC9l8AAwrlhwAD8o4GNAQABlADAAPz2AMAA++g+Aj0cwABJ34DAAEnewGEOUyABAAEcwABJ5hbAAEngLsAAaznAAL2XwADCuUsBAAGCwABJ58BhDpUAwAD8gwAAPRzAAEnyLsAAcarAAL2XAQABgcAASgXAYQ5pAMAAwswGwADC3II2wABKJsAASi/AAEpIAQCBVQAAAAEDwABKN8AASkgAAAAAAAAAYMAA+goBSsAASjoBHMAASkAWwABKOi7AAGs6wAC9l8AAwrpIAQABFsAASkMuwABrO8AAvZfAAMK7AMAA/PMGwADC3YI2wABKTcAASlXAAEqEAQBhAAAAAQPAAEpcwABKhAAAAAAAAABgwAD70AFKwABKXwEcwABKbxzAAEpmFsAASmAuwABrO8AAvZfAAMK7gY0BAAEWwABKaC7AAGs6wAC9l8AAwroAwAD89oN3AQABHMAASoAWwABKeRbAAEpyLsAAaznAAL2XwADCuWHAAPyjgY0BAAGUAMAA/PYAwAD76AbAAMLegjbAAEqJwABKj8AASvMBAIMZAAAAAQPAAEqVwABK8wAAAAAAAABfAAABPgJJwABKmxzAAEqlFsAASp8uwABrOsAAvZfAAMK6SAEAARbAAEqoLsAAazvAAL2XwADCuwDAAPzzPTDAAEqvHsAASsrAAM3yAAAAAD9KwABK2wEcwABK6BbAAEriLsAAaznAAL2XwADCuUsBAAEWwABK6S7AAGs6wAC9l8AAwroAwAD8gwbAAMLfgjbAAEr4wABK/sAAS30BAIHoAAAAAQPAAEsDwABLfQAAAAAAAABfAAABPgJJwABLCRzAAEsTFsAASw0uwABrOsAAvZfAAMK6SAEAARbAAEsWLsAAazvAAL2XwADCuwDAAPzzPTDAAEsdHsAASzjAAM3yAAAAAD9KwABLSQEcwABLVhbAAEtQLsAAaznAAL2XwADCuUsBAAEcwABLYxzAAEteFsAAS1guwABrO8AAvZfAAMK7gY0BAAGUAMAA/PaDdwEAARzAAEt0FsAAS20WwABLZi7AAGs5wAC9l8AAwrlhwAD8o4GNAQABlADAAPz2AMAA++gAwAD8gwbAAMLggjbAAEuCwABLiMAATCcBAIDDAAAAAQPAAEuPwABMJwAAAAAAAABfAAABPgNJwABLlRzAAEufFsAAS5kuwABrOsAAvZfAAMK6SAEAARbAAEuiLsAAazvAAL2XwADCuwDAAPzzPTDAAEupHsAAS8TAAM3yAAAAAD9JwABL1RzAAEvgFsAAS9kuYcAAwt2AlwEAAZQAwAD8/z0wwABL5R7AAEwAwADN8wAAAAA/SsAATA8BHMAATBwWwABMFi7AAGs5wAC9l8AAwrlLAQABFsAATB0uwABrOsAAvZfAAMK6AMAA/IMGwADCw4I2wABMLMAATC7AAEyuAACWMwAAAAEDwABMN8AATK4AAAABAQHAAEw8AAAAJ2DAAPvQAABfAAABPgI9HsAATFTAAPsQAgACgMAATGTAYRNyLgBKwABMdgEcwABMgxbAAEx9LsAAaznAAL2XwADCuUsBAAEcwABMlBzAAEyLFsAATIUuwABrOsAAvZfAAMK6ZAEAAYDAAEyNwGETcgDAAPz1g3cBAAEcwABMpRbAAEyeFsAATJcuwABrOcAAvZfAAMK5YcAA/KOBjQEAAZQAwAD89gDAAPvoAMAA/IMGwADCxII2wABMs8AATLvAAE2DAACArQAAAAEDwABMwcAATYMAAAABAAABwABMyAAAAIVYYMAA+goBasAATNNgwAD6CnVdwAD8dAFfAAABPgROwABM6AAAAINbXcAA/HQBXwAAAEnAAEzygMAATPbAYRRUPgE9icAATQjAYRR7NcAATRIAAAEAXcAA/HQBXwAAATHAAE0SXwAAADUAAAABAFsBF8AATRaCwABNFMBhFKlhFsAATR8uYcAAwt3AAPyhggDAYRSpPgE9icAATTrAYRR7HsAATUHAAPXLAQFfAAABFsAATUkuYcAAwt0APRzAAE1cLsAAa03AAL2XAQABgcAATWnAYRR7AMAAwtBKwABNdAGBwABNe8BhFHsGwADCxYI2wABNpMAATanAAE3LAABWAAAAAQPAAE2swABNywAAAAEBAcAATa8AACCAll8AAAAAXAE+AT0cwABNvC6zbsAAvZcBAAGAwABNwcBhFW8AwADCzQbAAMLGgjbAAE3QwABN1cAAUZsAAIClAAAAAQPAAE3bwABRmwAAAAEBAcAATegAACCIP13AAPwyAV8AAAAAXAE+AUnAAE34JcAATgWAwABN/MBhFcldwAD8dAFfAAA+BU7AAE4hwABOJgAAg1tdwAD8dAFfAAABFMAATijAYRXJAAFdwAD8dAFfAABOwABOPMAATkUAAMAAaz9gwAD70AEWwABOTIHAAE5HwGEWAGHAAPyjTsAATl7AAE5lAABhYMAA+9ABFsAATmwuYcAAwt1JwABOehzAAE6QHMAAToWDwABOfsBhFlNkAQABgsAATofAYRYrAMAA/PWBbQEAARbAAE6aFsAATpMuwABrOcAAvZfAAMK5YcAA/KMAwAD9AD4DPRzAAE6sLsAAa0DAAL2XAQABHMAATryDwABOtcBhFlNkAQABgsAATr7AYRYrAMAA/PUAwADC0T0cwABPHRbAAE8WLsAAaznAAL2XwADCuYNeBAAEg8AATybAYRZTHMAATzWDwABPLsBhFlNkAQABgsAATzfAYRYrAMAA/PWBwABPQcBhFgCTAMAA/Jk9F8AAT1MuwABrO8AAvZccwABPWRbAAE9TLsAAazvAAL2XwADCu2QBAAGC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Si6BwgEAARbAAENPLsAAcgHAAMW0AMAAxbE/BsAAxbOCOMAARDHAAEQ8wABEYwEAgXYAAAABA8AAREPAAERjAAAAAAAAAGDAAP0cAT4BSsAAREkBFsAARFkWwABEUC6ob8AAxYuBdsAAxQIGwADFt4I4wABEkMAARJnAAESoAgKrqwAAAAEDwABEnsAARKgAAAABAQHAAEShAAAgg0RfAAAAAFwABsAAxbSCOMAARRvAAEUjwABFKwECwAByAQAAAAEDwABFK8AARSsAAAAAAAAAYMAA+9AABsAAxbWCOMAARa/AAEW1wABFugECq6sAAAABA8AARbrAAEW6AAAAAAAAAF8AAAAGwADFlII4wABGn8AARqPAAEa1AALAAHJoAAAAAQPAAEaqwABGtQAAAAEBAcAARq8AAAAnYMAA+9AAAGDAAPvQAAbAAMWVgjjAAEdfwABHZMAAR6UAAsAAcmkAAAABA8AAR3PAAEelAAAABAQEwABHeAAAAGpgwAD70ADAAEeDAAAAgoxgwAD70ADAAEeSAAAAgkVdwAD8dAFgwAD70ADAAEeeAAAAg1xgwAD70AAAXAAGwADFloI4wABI1sAASNvAAEjoAALAAHJqAAAAAQPAAEjmwABI6AAAAAAAAABcAAbAAMWXgjjAAElcwABJYcAASX4AAsAAcmsAAAABA8AASXDAAEl+AAAAAQEBwABJdQAAAMAAYR5gwAD70AAAXAAGwADFmII4wABKCcAASg7AAEoyAALAAHJsAAAAAQPAAEoewABKMgAAAAICAsAASiMAAABqYMAA+9AAwABKLgAAAIKMYMAA+9AAAFwABsAAxZmCOMAASn3AAEqEwABKjwACwABybQAAAAEDwABKjcAASo8AAAAAAAAAYMAA/bYABsAAxZqCOMAATNvAAEziwABNCQACwABfbAAAAAEDwABM68AATQkAAAADAwPAAEzwAAAAamDAAPvQAMAATPsAAACCjGDAAPvQAMAATQQAAADAAEmMYMAA+9AAAGDAAP22AAbAAMWbgjjAAE5KwABOTsAATuoAAMAAchcAAAABA8AATlbAAE7qAAAAAgICwABOWwAAAGpgwAD70ADAAE5mAAAAgoxgwAD70AAAYMAA/OYBPgFKwABOtAEewABOv8AA/REBAAEcwABOxS7AAF9sAwADgMAATs/AYjdvgcAA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AcAAsVEAAACBsWDAAPvQAABgwAD70AFKwACxXgEcwACxZBbAALFeLqurwADFvIQLAQABgMAAsW/AYo+lAMAA/cQGwADFwII4wACxfcAAsYTAALHYAADAAF9sAAAAAQPAALGNwACx2AAAAAMDA8AAsZIAAABqYMAA+9AAwACxnQAAAIKMYMAA+9AAwACxpgAAAMAASYxgwAD70AAAYMAA/bYBPgFKwACxsgEcwACxvxbAALG5LqurwADFvIC+AgACgMAAscnAYpARgcAAsdDAYpAfAMAA/cwGwADFwYI4wACx3cAAseLAALIaAADAAHJqAAAAAQPAALHtwACyGgAAAAAAAABcAT4BPRfAALH7LoKLH8AAsgjAAP4fAAAAAMAAxY8GwADFwoI4wACyH8AAsiTAALKjAADAAHJsAAAAAQPAALI0wACyowAAAAICAsAAsjkAAABqYMAA+9AAwACyRAAAAIKMYMAA+9AAAFwBPgJOwACyXMAAsmMAAIKLYMAA/gABJsAAslwBFsAAsmougovAAMWPYMAA/gA9HMAAsn2CwACydsBikRWCigEAARzAALKJFsAAsoMuq6vAAMW8gL4CAAKAwACyk8BikPKBwACymsBikQAAwAD9zADAAP4UBsAAxcOCOMAAsqjAALKtwACzGgAAwAByawAAAAEDwACyvMAAsxoAAAABAQHAALLBAAAAwABhHmDAAPvQAABcAT4CTsAAst7AALLlAACCi2DAAP4AASbAALLeARbAALLsLoKLwADFj2DAAP4APRzAALL/gcAAsvjAYpHHhBEBAAGAwACzDcBikbAAwAD+FQbAAMXEgjjAALMfwACzJsAAs5MAAMAAcm0AAAABA8AAsy/AALOTAAAAAAAAAGDAAP22AT4DTsAAs0XAALNMAACCi2DAAP4AASbAALNFARbAALNTLoKLwADFj2DAAP4APRfAALNkLoKLK8AAxY9KwACzdwEcwACzhYDAALN+wGKSSCMAAAAAwAD+GQbAAMXFgjjAALOYwACzncAAtGEAAMAAcmkAAAABA8AAs6zAALRhAAAABAQEwACzsQAAAGpgwAD70ADAALO8AAAAgoxgwAD70ADAALPGAAAAgkVdwAD8dAFbAMAAs9IAAACDXGDAAPvQAABcAT4CTsAAs+TAALPrAABhYMAA+9ABHMAAs/GBwACz7cBi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hoJWwABE/sAARQTAAEaxA8AAdecAAQAAg8tgwAD9HAFbAV3AAPxtAV8AAAAAAwTAAM2JglbAAEVDwABFTAnAAHARwADKtQBdwAD8bQFfAAAABMAAzYqCVsAARWvAAEVtCcAAddDAAMq1AF4AAQEBXwAAAAFXwADKuQFfAABgwAD6CgAEwADNi4JWwABFdsAARYkYwAB16MAAyrUAYMAA+goBKgEFwADNkYJWwABFjsAARY7AAEW4AAAAA8AARZ/AAEW4AAAAAgICwABFpQAABMAAcBFdwAD8bQFfAAAAwABFtQAABMAAddBeAAEBAV8AAAABV8AAyrkBXwAAYMAA+goAAF3AAM2GAV8AAAE/AwgBwADNiYAAwGVPjQgBwADNioEAwGVPogkBwABFjsAA/HMAAAAAAgbAAM2NglbAAEW9wABFwsAARogAAF0AAAABA8AARcrAAEaIAAAAAAAAAGDAAPoKAT4CScAARdMhFsAARdguwAB16MAAyrXAAM2LPgI9F8AARe0uwAB16MAAyrUpwADNi0PAAEYHHMAARhgWwABGDi7AAHARwADKtcAAzYldAAAAAMAA/G8+AUnAAEYuIRzAAEYzLsAAddDAAMq1AQABFsAARkAWwABGNi7AAHARwADKtcAAzYlewAD8cQDAAM2KSsAARkoBKT8/SsAARmkBHMAARnoWwABGcC7AAHARwADKtcAAzYldAAAAAMAA/G8GwADNj4JWwABGjcAARpPAAEavAQBeAAAAAQPAAEabwABGrwAAAAAAAABfAAABSsAARp4BFsAARqgWwABGni7AAHARwADKtcAAzYlewAD8cQAAZU/6AGVQ6ABlUTgAAAACAsAAzZKCVsAARtzAAEbiwABOJQPAAHXpAAEAAIPLYMAA/RwBWwFdwADMjgFfAAAAAAABBcAAza+CVsAARxrAAEcgwABHLwEAAAPAAEctwABHLwAAAAAAAABdwADNkgFfAAABPwEJAcAARyDAAMySAAAAABkGwADNlIJWwABHNMAAR0TAAEdlAQBcAAAAAQPAAEdNwABHZQAAAAAAAABdwAD8bQFfAAABSsAAR1ABasAAR1ZdwADNsAFgwAD82cABcTcGwADNm4JWwABHasAAR2/AAEeQAACD+AAAAAEDwABHdsAAR5AAAAABAQHAAEd8AAAAiKFhAV8AAFwAAFwB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wADTKQAWwABGPy6iWsAA0VA+AT0cwABGW4DAAEZWwGavnIC/AgACFsAARmmEwABGXMBmsc7AAHeUwADSxYTAAEZ3wGaxzgDAAPy6SsAARpABF8AARpcuwAB3v8AA0HIfwABGs8AAwjUBAmDAAP4oYMAA0sMBgMAARuLAZq+cAMAA0TgGwADRSYJuwABHQcAAR0rAAEe9AQDAAHfRwADQcgAAAAEDwABHZ8AAR70AAAAAAAAAYMAA+goBPgJJwABHbRzAAEd3FsAAR3EuhOjAANFMSAEAAS4AwADTHkrAAEeAASo/SsAAR64BKQbAANFQgm7AAEftwABICsAASrgBAKJaAAAAAQPAAEgYwABKuAAAAAAAAABdwAD8dAFgwADTKQE+AknAAEgeHMAASDEWwABIIi6pasAA0HLAANE5SAEAASsAwAD9KT4HScAASEIiIRbAAEhHLsAAd7fAANBywADRLwAWwABIaS7AAHfRwADQcsAA0Uk+AUrAAEiRARfAAEiYLqlqwADQcmrAAEipXcAA/HQBYMAA0ynAAYXgwADROT89F8AASNUuqWrAANByHsAASOrAAPduAQFgwADTKQGTAMAA0TlOwABJEsAASRkAAIPvXcAA/HQBWwEewABJG8AA0WsBAAEWwABJNy7AAHeawADQcsAA0PAATsAASVbAAElcAACt92DAANMSARbAAEleLsAAd9LAANFTTsAASX0AAADAAHfTWwBFwABJiwHAAEmUwABJlgAAYmDAAPvQAZMBHMAASZ2DwABJm8BmtAhjAQABFsAASaaAwABJn8Bms6BhwAD8owDAAPz9AYvAAEmuwGa0CBzAAEmwg8AASa7AZrQIZAEAAZUAwAD89T4CPYrAAEnAwGaz9R/AAEnNwADRvQMAAxzAAEnugMAASejAZrOgSwEAARzAAEnxg8AASe/AZrQIZAEAAZQAwAD89QDAAPyDJsAASf0BHMAASf2AwABJ98Bms6BLAQABg8AASf7AZrQIAMAA/INgwAD9toHAAEoCwGaz1AA9HMAASiEWwABKEi6pasAA0HLAANE5VgEAASbAAEolAYLAAEolwGaz9WDAANMpAMAA/IU9F8AASjwuqWrAANByH8AASlvAAMCJAQFgwADTKQEWwABKhC6pasAA0HLAANE5AMAA0Tk/SsAASp8BFsAASqYuqWrAANBywADROQbAANFRgm7AAErgwABK9cAATIgBAIUXAAAAAQPAAEsDwABMiAAAAAAAAABdwAD8dAFgwADTBQE+AknAAEsJHMAASxwWwABLDS7AAEo9wADQcsAA0TpIAQABKwDAAP0pPgFJwABLLSIWwABLMS7AAHe4wADQcsAA0TABIiEWwABLVi7AAHe3wADQcsAA0S8AFsAAS3guwAB30cAA0HLAANFJPgE9F8AAS6EuwABKPcAA0HJqwABLsl3AAPx0AWDAANMFwAGF58AA0To+AT0XwABL3y7AAEo9wADQch/AAEv0wADAiQEBYMAA0wUBHMAATEgewABMIsAA0WwBAAEWwABMOC7AAHeywADQcsAA0SsAljIAAWDAANMFAADAAPyCAMAA0To/SsAATG8BFsAATHYuwABKPcAA0HLAANE6BsAA0VKCbsAATI3AAEyWwABM0wEAwAB3xQAAAAEDwABMrMAATNMAAAAAAAAAYMAA+goBSsAATK8BIiEWwABMsC7AAHe2wADQcsAA0S4BFsAATL4uwAB3uMAA0HLAANEwBsAA0VOCbsAATNjAAEzowABNcgEAwAB30gAAAAEDwABM/MAATXIAAAAAAAAAYMAA0xIBPgFJwABNAhbAAE0GLsAAd8XAANFSPgFKwABNJQEuPgFKwABNRQEewABNTMAA0IIBAAEWwABNWS7AAHeywADQcsAA0SsABsAA0VeCbsAATXfAAE1+wABNwgAAIwAAAAEDwABNhsAATcIAAAAAAAAAYMAA/bYBSsAATYwBJMAATcIDJ8AAd9QewABNrMAA0q0BAAEWwABNtC7AAHeUwADRQAAng0IGwADRWIJuwABNx8AATdbAAFG1AADAAFRtAAAAAQPAAE3hwABRtQAAAAMCA8AATekAAACuFGDAAP4oAMAATf8AAACpOl3AAPx0AVsAwABOMAAAAKk7XcAA/KUCYMAA/ihbAWoAYMAA/Nl3AGDAANLWAT4KTsAATtvAAE7yAADAAHefYMAA+9ABFsAATwiBwABO9MBmuA9hwAD8o07AAE8YwABPKgAAwAB3oGDAAPvQASMhHMAATzuCwABPLMBmuCBIAQABKwDAAP0pFsAAT1SCwABPRcBmuCBhwAD8yZMBYMAA+9BOwABPaMAAT3UAAJkHYMAA+9ABHMAAT46DwABPd8BmuEhkAQABhMAAT5DAZrhwAMAA/PVOwABPrMAAT7YAAFtdwAD8dAFbAR7AAE+8wAD1ywEBWwGFwABPwcBmuLkAPRzAAE/ehsAAT9TAZrjsg14DAAOTg8AAT+rAZrhIgcAAUALAZrgPAMAA/JlOwABQIcAAUCcAAISxXcAA/HQBWwEewABQLcAA9csBAVsBhMAAUDLAZrhwAE7AAFBOwABQXAAAwABN52DAAPvQAYPAAFBewGa4SE7AAFB+wABQiAAAwABK8WDAAPvQAZNJwABQkRzAAFCnhMAAUJXAZrhwgJcBAAGTAMAA/P8+AT0cwABQw4LAAFC0wGa4IIP4AQABNMAAUMsDwABQy8AAUTUAAAACAgLAAFDMAAAAgL1gwAD+KADAAFDSAAAAgJZbAABgwAD82QE+Aj0cwABQ7IbAAFDjwGa47IC/AgACNQAAAAEAYMAA+9ABFMAAUO3AZrlvCAA1AAAAAQBgwAD70AEVwABQ7cBmuW8IHMAAUPoUAMBmuiIMAGQBAAGUAMAA/PUUAMBmuiIMABTAAFEAwGa5+QsAAMAA/IQ9HMAAURSHwABRD8BmuUOAvwIAAjUAAAABAGDAAPvQARTAAFEVwGa5jQkANQAAAAEAYMAA+9ABFcAAURXAZrmNCRzAAFEeFADAZrqSDABkAQABlADAAPz1FADAZrqSDAAewABRJMAA0HgBAAEUwABRJ8BmueoKAAAAwAD8hADAAPzEP0rAAFFDAR7AAFFKwADQgQEAAR7AAFFSwADRagUABRbAAFFuLsAAd5rAANBywADQ8BbAAFF6LsAAd7LAANBywADRKx7AAFGKwADQeAEAAYDAAFGNwGa4AACGwABRn8BmuOyHwABRqsBmuUMAAAbAANFUgm7AAFG6wABR08AAUsEBAIbVAAAAAQPAAFHcwABSwQAAAAAAAABdwAD8dAFgwADS1gE+AUrAAFJhAR/AAFJswADAiQEBYMAA0tYBHMAAUrAewABSmsAA0H0BAAEWwABSpC7AAHeawADQcsAA0PAAgKsBAWDAANLWAWrAAFK0YQFgwAD9HGDAANLWwAGF7gDAAPw9AAbAANFZgm7AAFLGwABS1MAAU78DAEgAAAABA8AAUtbAAFO/AAAAAQEBwABS1wAAAIPWWwAAYMAA+goBPgFKwABS5AEiIiIcwABS/BbAAFLwLoWAwAD9MEgBAAEWwABTBYDAAFL/wGa8LoWAwAD9MADAAP0pABzAAFMsFsAAUyEuwAB3msAA0HLAANDwSAEAARbAAFM1gMAAUy/AZrwuwAB3msAA0HIAAMAA/SkAHMAAU18WwABTUC7AAHeywADQcsAA0StIAQABFsAAU2iAwABTYsBmvC7AAHeywADQcgAAwAD9KQAcwABTnRbAAFOHLsAAd7jAANBywADRMEgBAAEWwABTpoDAAFOgwGa8LsAAd7jAANByAADAAP0pBsAA0VWCbsAAU8TAAFPMwABT6wEAg8EAAAABA8AAU9XAAFPrAAAAAAAAAGDAAPvQAUrAAFPYARbAAFPjFsAAU9guwAB3lMAA0UCDwcAA/jEGwADRWoJuwABT8MAAU/XAAFT1AACa3wAAAAEDwABUAMAAVPUAAAABAQHAAFQMAAAAg9ZgwADTBQAAYMAA+goBPgNJwABUGRzAAFQjgMAAVB3AZr2bSAEAARbAAFQ8HsAAVCbAANCAAAAAAJ5iwADSsgDAAP0pSsAAVEkBKT9JwABUWhzAAFRkgMAAVF7AZr2bSAEAARbAAFR9HsAAVGfAANCAAAAAAMAARPbAANKzAMAA/SlKwABUhwEqP0rAAFSZAR7AAFSgwADQfgIAAhbAAFS2LsAAd7LAANBywADRKxbAAFTiJsAAVM0AgMAAVMfAZr2bYMAA0SLAAHeywADQcsAA0SUABsAA0VuCbsAAVPrAAFT/wABWaAAAwAB31QAAAAEDwABVDcAAVmgAAAABAQHAAFUZAAAAg9ZgwADTBQAAYMAA+goBPgRJwABVJhzAAFUwgMAAVSrAZr6jSAEAARbAAFVJHsAAVTPAANCAAAAAAJ5iwADSsgDAAP0pSsAAVVYBKT9JwABVZxzAAFVxgMAAVWvAZr6jSAEAARbAAFWKHsAAVXTAANCAAAAAAMAARPbAANKzAMAA/SlKwABVlAEqP07AAFWswABVvwABwAB31mDAAP40ARbAAFXdJsAAVcgAgMAAVcLAZr6jYMAA0SLAAHeywADQcsAA0SVKwABV8QEiHsAAVfjAANB+AgACFsAAVgUuwAB3ssAA0HLAANErgcAAVhXAZr82AAEewABWNMAA0H4CAAKBwABWQcBmvzYWwABWVS7AAHeywADQcsAA0SsABsAA0VyCbsAAVm3AAFZywABXxAAAmwwAAAABA8AAVn7AAFfEAAAAAQEBwABWiwAAAIPWYMAA0xIAAGDAAPoKAT4FScAAVpghJcAAVqKAwABWnMBmv/FgwADTEj0wwABWsx/AAFa9wAD7AwEAAYDAAFbLwGa/8QA/TsAAVuPAAFb0AADAAHfXYMAA0xIBJsAAVuMBFsAAVvyAwABW9sBmv/HAAHfSwADTDGDAANMSTsAAVyHAAFcjAACA9WDAANMSAS5DwABXLyEcwABXOILAAFc2wGbAdkgBAAErAMAA0x4+Az2KwABXScBmwHYmwABXSQEWwABXT4LAAFdNwGbAdsAAd9LAANMMYMAA0xJJwABXahzAAFdwgsAAV27AZsB2SAEAAYHAAFdzwGbAQADAANMeSsAAV4UBKT89isAAV5jAZsB2FsAAV56CwABXnMBmwHaE5sAA0xRKwABXtAEqBsAA0V6CbsAAV8nAAFfXwABYDQAFwAB32MAA0HIBagBgwADLBsABhfgAAAEDwABX4sAAWA0AAAABAQHAAFfjAAAAwAB3nFsAAGDAAP22AAbAANFfgm7AAFgSwABYHsAAWFYABcAAd9rAANByAWoAYMAAywbAAYYMAAABA8AAWCjAAFhWAAAAAQEBwABYKQAAAMAAd8BbAABgwAD+NAAGwADRYIJuwABYW8AAWGfAAFi+AAXAAHfcwADQcgFqAGDAAMsGwAGGIAAAAQPAAFh9wABYvgAAAAEBAcAAWH4AAADAAHfAWwAAYMAA/jQABsAA0WGCbsAAWMPAAFjYwABZHgAFwAB33sAA0HIBagBgwADLBsABhjQAAAEDwABY6cAAWR4AAAABAQHAAFjqAAAAwAB3wFsAAF3AAPx0AVsABsAA0WKCbsAAWSPAAFk4wABZlwAFwAB34MAA0HIBagBgwADLBsABhkgAAAEDwABZVcAAWZcAAAABAQHAAFlWAAAAwAB3wFsAAF3AAPx0AVsABsAA0WOCbsAAWZzAAFmowABZ3gAFwAB34sAA0HIBagBgwADLBsABhlwAAAEDwABZtMAAWd4AAAABAQHAAFm1AAAAwAB3wFsAAGDAAP40AAbAANFkgm7AAFnjwABZ78AAWlIABcAAd+TAANByAWoAYMAAywbAAYZwAAABA8AAWgfAAFpSAAAAAgICwABaCAAAAMAAd8BbAMAAWhcAAACaq1sAAGDAAP40AAbAANFlgm7AAFpXwABaZcAAWrAABMAAd83AANByAWoAYMAAywbAAYaEAAABA8AAWnTAAFqwAAAAAgICwABadQAAAMAAd5xbAMAAWoAAAACaq1sAAF3AAPx0AVsABsAA0WaCbsAAWrXAAFrDwABbGAAEwAB3zsAA0HIBagBgwADLBsABhpgAAAEDwABa18AAWxgAAAACAgLAAFrYAAAAwAB3nFsAwABa4wAAAJqrWwAAXcAA/HQBWwAGwADRZ4JuwABbHcAAWx3AAFt3AATAAHebwADQcgFqAGDAAMsGwAGGrAAAAQPAAFskwABbdwAAAAQEBMAAWyUAAADAAHecWwDAAFswAAAApxtbAMAAWzwAAABbWwDAAFtHAAAAwABUj1sAAFsABsAA0WiCbsAAW3zAAFt8wABbwgAEwAB3ncAA0HIBagBgwADLBsABhsAAAAEDwABbicAAW8IAAAACAgLAAFuKAAAAwAB3nFsAwABblQAAAMAAR5BbAABbAAbAANFpgm7AAFvHwABbx8AAXBQABMAAd57AANByAWoAYMAAywbAAYbUAAABA8AAW9TAAFwUAAAAAwMDwABb1QAAAMAAd5xbAMAAW+AAAADAAEeRWwDAAFvsAAAAgJZbAABbAAbAANFqgm7AAFwZwABcIMAAXJsABcAAd+vAANByAWoAYMAAywbAAYboAAABA8AAXDLAAFybAAAABQUFwABcMwAAAMAAd5xbAMAAXD4AAACCkFsAwABcRAAAAK4UWwDAAFxVAAAAW1sAwABcZgAAAMAAVI9bAABbAAbAANFrgm7AAFygwABctcAAXQUABcAAd+3AANByAWoAYMAAywbAAYb8AAABA8AAXNDAAF0FAAAAAQEBwABc0QAAAMAAd5xbAABdwAD8dAFbAAbAANFsgm7AAF0KwABdH8AAXWkABcAAd+/AANByAWoAYMAAywbAAYcQAAABA8AAXTTAAF1pAAAAAQEBwABdNQAAAMAAd5xbAABdwAD8dAFbAAAAZp9ZAGaflwBmn/0AZqCJAGahHQBmoeoAZqI8AGaiaABmorAAZqPpAGakJgBmpeoAZqd+AGaocwBmq1YAZq8dAGayWwBmssMAZrVgAGa2nQBmtv0AZrd1AGa31ABmu2wAZrwFAGa9IQBmvXEAZr53AGa/xwBmwSYAZsF1AGbBxABmwhMAZsJkAGbCtQBmwwQAZsNeAGbDugBmxBYAZsSDAGbE2wBmxT4AZsW2AGbGBwBmxlgAAAAsAsAA0XCCbsAAXW7AAF10wABlVAPAAHfxAAABYMAA0SgAAWDAANMiBQTAANFzgm7AAF3TwABd5QnAAHfywADQcgBbAATAANF0gm7AAF8lwABfMBjAAHe0wADQcgBgwAD+KAErBMAA0XWCbsAAX+PAAF/uGMAAd/PAANByAGDAANM2ASsEwADRdoJuwABgqMAAYLMYwABTJ8AA0HIAYMAA0wUBKwTAANF3gm7AAGGNwABhmBjAAHf0wADQcgBdwAD8dAFgwADTVgErAQXAANGNgm7AAF3pwABd6cAAXpsAgLXAANByAAPAAF4DwABemwAAAAMDA8AAXgQAAADAAHecWwDAAF4UAAAEwAB38lsAwABeKAAAAMAAd8BbAABgwADRcAE/AggBwADRc4EAwGbIEgkAwABeRcAA0W8JAAmAwABeR8BmyAWCwABeUsBmyB8rKyoqKioqAA8GwADReoJuwABeoMAAXqnAAF7OAQDAAHfRwADQcgAAAAEDwABexsAAXs4AAAAAAAAAYMAA+goBSsAAXskBKgbAANF7gm7AAF80wABfP8AAX9EBAMAAd5QAAAABA8AAX0rAAF/RAAAAAAAAAGDAAP4oAT4CScAAX1AcwABfYBbAAF9ULsAAd7TAANBywADRdEgBAAErAMAA/jM+AT0XwABfcS7AAHe0wADQch7AAF9/wADQeQEAAR7AAF+CwADQewIAAhbAAF+XLoU0wADRfRbAAF+jLpqAwADRfgAAwADRdD9KwABfuwEWwABfwi7AAHe0wADQcsAA0XQGwADRfIJuwABf8sAAYAPAAGCYAQC0AQAAAAEDwABgDsAAYJgAAAAAAAAAYMAA0zYBPgJJwABgFBzAAGAkFsAAYBguwAB388AA0HLAANF1SAEAASsAwADTST4BPRfAAGA1LsAAd/PAANByHMAAYEMuwAB39cAA0HIBAAEWwABgYy7AAHfywADQcsAA0XMAwADRiMAA0XU/SsAAYIIBFsAAYIkuwAB388AA0HLAANF1BsAA0X2CbsAAYLfAAGDGwABhcgEAhTQAAAABA8AAYNHAAGFyAAAAAAAAAGDAANMFAT4CScAAYNccwABg5xbAAGDbLsAAUyfAANBywADRdkgBAAErAMAA/Sk+AT0XwABg+C7AAFMnwADQch7AAGEQwADQgwEAAR7AAGEcwADRiQEAARbAAGE8LsAAd/LAANBywADRcwAAwADRdj9KwABhXAEWwABhYy7AAFMnwADQcsAA0XYGwADRfoJuwABhnMAAYbbAAGK5AQCagAAAAAEDwABhwcAAYrkAAAAAAAAAXcAA/HQBYMAA01YBPgJJwABhxxzAAGHXFsAAYcsuwAB39MAA0HLAANF3SAEAASsAwAD9KT4CPRfAAGHoLsAAd/TAANByHMAAYjQcwABh9i7AAHf2wADQcgEAARbAAGIVLsAAd/LAANBywADRcwDAANGKljIAAWDAANNWAADAAPyCwADRdz0XwABiUy7AAHf0wADQch/AAGJlwADAiQEBYMAA01YBFsAAYosuwAB39MAA0HLAANF3AMAA0Xc/SsAAYqMBFsAAYqouwAB39MAA0HLAANF3BsAA0X+CbsAAYr7AAGLHwABi5AEAwAB3xQAAAAEDwABi3cAAYuQAAAAAAAAAYMAA+goBSsAAYuABKQbAANGAgm7AAGLowABi+MAAYxMBAMAAd9IAAAABA8AAYwzAAGMTAAAAAAAAAGDAANMSAUrAAGMPAS4GwADRgYJuwABjF8AAYxvAAGNIAQCiWgAAAAEDwABjKcAAY0gAAAAAAAAAXcAA/HQBYMAA0ykBSsAAYywBasAAYyxdwAD8dAFgwADTKcABheAGwADRgoJuwABjTMAAY1DAAGN1AQCFFwAAAAEDwABjXsAAY3UAAAAAAAAAXcAA/HQBYMAA0wUBSsAAY2EBasAAY2FdwAD8dAFgwADTBcABhecGwADRg4JuwABjecAAY33AAGOhAQCG1QAAAAEDwABjhsAAY6EAAAAAAAAAXcAA/HQBYMAA0tYBSsAAY4kBasAAY4ldwAD8dAFgwADS1sABhXIGwADRhIJuwABjpcAAY6nAAGO5AQCEWwAAAAEDwABjssAAY7kAAAAAAAAAYMAA018BSsAAY7UBKwbAANGGgm7AAGO+wABjxcAAY/4AACMAAAABA8AAY83AAGP+AAAAAAAAAGDAAP22AUrAAGPTASTAAGP+AyfAAHf3HsAAY+3AANB4AQABFsAAY/AuwAB3lMAA0XsAJ4NCBsAA0YiCbsAAZAPAAGQQwABkcAAEwAB39cAA0HIBagBgwADLBsABhyQAAAEDwABkL8AAZHAAAAABAQHAAGQwAAAAwAB3+VsAAGDAANM2AAbAANGJgm7AAGR1wABkgcAAZOEABcAAd/rAANByAWoAYMAAywbAAYc4AAABA8AAZKDAAGThAAAAAQEBwABkoQAAAMAAd/lbAABgwAD+NAAGwADRioJuwABk5sAAZPTAAGVSAATAAHf2wADQcgFqAGDAAMsGwAGHTAAAAQPAAGUSwABlUgAAAAEBAcAAZRMAAADAAHf5WwAAXcAA/HQBWwAAAGbIaQBmyKcAZsliAGbKEQBmysQAZsvEAGbL/gBmzDgAZsyJAGbM2gBmzSsAZs1jAGbNwgBmzhEAZs5gAGbOsQAAAA8CwADRjoJuwABlV8AAZWbAAGlDB8AAd/0AAAFgwADQpwABYMAA0sMDBMAA0ZGCbsAAZb7AAGXICcAAd5rAANByAFsABMAA0ZKCbsAAZdPAAGXeGMAAd7TAANByAGDAAP4oAATAANGTgm7AAGZUwABmYhjAAHe6wADQcgBgwAD+KAErAQXAANGfgm7AAGXjwABl48AAZh8AgLXAANByAAPAAGX8wABmHwAAAAICAsAAZgIAAATAAHeaWwDAAGYTAAAEwAB3tGDAAP4oAABgwADRjgE/AwgBwADRkYAAwGbPowgBwADRkoEAwGbPsAkBwABl48AA0KkAAAAABwbAANGVgm7AAGYkwABmL8AAZkgBAMAAd5QAAAABA8AAZjrAAGZIAAAAAAAAAGDAAP4oAUrAAGY9ARbAAGY9LsAAd7TAANBywADRkgbAANGWgm7AAGZmwABmccAAZwcBAMAAaSIAAAABA8AAZn/AAGcHAAAAAAAAAGDAAP4oAT4CScAAZoUcwABmmBbAAGaJLsAAd7rAANBywADRk0gBAAErAMAA/jM+AT0XwABmqS7AAHe6wADQch7AAGa6wADQegIAAhbAAGbQLq33wADSxxbAAGbXLsAAd5TAANGVAMAA0ZM/SsAAZu4BFsAAZvUuwAB3usAA0HLAANGTBsAA0ZeCbsAAZwzAAGcVwABnQAEAhlcAAAABA8AAZx/AAGdAAAAAAAAAAGDAAPoKAUrAAGciARzAAGcxHsAAZyLAANB4AQABFsAAZyUuwAB3lMAA0ZUAgdYBAAEngLUAwAD9yAbAANGYgm7AAGdFwABnWMAAZ4cBAIRbAAAAAQPAAGdhwABnhwAAAAAAAABgwADTXwE+AUrAAGdnAR7AAGduwADQfAEAARbAAGd4LsAAd5rAANBywADRkQAGwADRmYJuwABnjMAAZ6XAAGiTAQCG1QAAAAEDwABnrsAAaJMAAAAAAAAAXcAA/HQBYMAA0tYBPgFKwABoMwEfwABoPsAAwIkBAWDAANLWARzAAGiCHsAAaGzAANB9AQABFsAAaHYuwAB3msAA0HLAANGRAICrAQFgwADS1gFqwABohmEBYMAA/RxgwADS1sABhe4AwAD8PQAGwADRnIJuwABomMAAaKbAAGkVAwBIAAAAAQPAAGiowABpFQAAAAEBAcAAaKkAAACD1lsAAGDAAPoKAT4BSsAAaLYBIhzAAGjOFsAAaMIuhYDAAP0wSAEAARbAAGjXgMAAaNHAZtJqhYDAAP0wAMAA/SkAHMAAaP4WwABo8y7AAHeawADQcsAA0ZFIAQABFsAAaQeAwABpAcBm0mrAAHeawADQcgAAwAD9KQbAANGagm7AAGkawABpIsAAaUEBAIPBAAAAAQPAAGkrwABpQQAAAAAAAABgwAD70AFKwABpLgEWwABpORbAAGkuLsAAd5TAANGVg8HAAP4xAABmz/EAZtA8AGbQ7ABm0VAAZtGoAGbSQQBm0usAZtM7AAAABwLAANGggm7AAGlGwABpTMAAcf0DwAB3/gAAAWDAANGOAAJgwADTKWDAANEiAgTAANGjgm7AAGpEwABqShjAAHe1wADQcgBgwADSwwAEwADRpIJuwABrVcAAa2AYwAB3/8AA0HIAYMAA0wUBKwEFwADRvYJuwABpvcAAab3AAGotAIC1wADQcgADwABp18AAai0AAAADAwPAAGnYAAAAwAB3nFsAwABp6gAAAMAAd5RgwAD9tgDAAGn7AAAEwAB3tWDAANLDAABgwADRoAE/AggBwADRo4IAwGbUFQkAwABqEcAA0Z8CAAKAwABqE8Bm0/cewABqHsAA0HkBAAGBwABqIcBm1AQAABIGwADRpoJuwABqTsAAamTAAGsGAQCt9wAAAAEDwABqasAAawYAAAAAAAAAYMAA0sMBPgJJwABqcBzAAGp7FsAAanQuwAB3tcAA0HLAANGjSAEAASsAwAD9KT4BPRfAAGqMLsAAd7XAANByFsAAatYmwABqvAAewABqlsAA0bkBAAEWwABqsC7AAHeawADQcsAA0ZEAYMAA0wXAAHfSwADTDMAA0aM/SsAAavUBFsAAavwuwAB3tcAA0HLAANGjBsAA0aeCbsAAawvAAGsUwABrJQEAhBkAAAABA8AAax3AAGslAAAAAAAAAGDAAPoKAUrAAGsgASoGwADRqIJuwABrKcAAazLAAGtFAQCHegAAAAEDwABrPcAAa0UAAAAAAAAAYMAA+goBSsAAa0ABKgbAANGpgm7AAGtkwABrc8AAbA0BAJqFAAAAAQPAAGt+wABsDQAAAAAAAABgwADTBQE+AknAAGuEHMAAa5QWwABriC7AAHf/wADQcsAA0aRIAQABKwDAAP0pPgE9F8AAa6UuwAB3/8AA0HIewABrs8AA0IMBAAEewABrv8AA0boBAAEWwABr3y7AAHeawADQcsAA0ZEAAMAA0aQ/SsAAa/cBFsAAa/4uwAB3/8AA0HLAANGkBsAA0aqCbsAAbBLAAGwbwABsNAEAwAB3wQAAAAEDwABsLMAAbDQAAAAAAAAAYMAA+goBSsAAbC8BKgbAANGrgm7AAGw4wABsQcAAbJwBAMAAd8AAAAABA8AAbE/AAGycAAAAAAAAAGDAAP40AT4BPTDAAGxVH8AAbF/AAPtiAQABJ8AAeAAABsAA0a2CbsAAbKHAAGyqwABsxgEAwAB3ssAA0HIAAAABA8AAbLnAAGzGAAAAAAAAAGDAAP40AUrAAGy8ASbAAGy8ARbAAGy8LsAAd5rAANBywADRkWDAAP40BsAA0a6CbsAAbMvAAGzowABtFQEAoloAAAABA8AAbPbAAG0VAAAAAAAAAF3AAPx0AWDAANMpAUrAAGz5AWrAAGz5XcAA/HQBYMAA0ynAAYXgBsAA0a+CbsAAbRnAAG0uwABtUwEAhRcAAAABA8AAbTzAAG1TAAAAAAAAAF3AAPx0AWDAANMFAUrAAG0/AWrAAG0/XcAA/HQBYMAA0wXAAYXnBsAA0bCCbsAAbVjAAG1hwABtfgEAwAB3xQAAAAEDwABtd8AAbX4AAAAAAAAAYMAA+goBSsAAbXoBKQbAANGxgm7AAG2CwABtkcAAbawBAMAAd9IAAAABA8AAbaXAAG2sAAAAAAAAAGDAANMFAUrAAG2oAS4GwADRtIJuwABtscAAbbjAAG3xAAAjAAAAAQPAAG3AwABt8QAAAAAAAABgwAD9tgFKwABtxgEkwABt8QMnwAB4AR7AAG3gwADQeAEAARbAAG3jLsAAd5TAANGVACeDQgbAANG1gm7AAG32wABt/8AAbn8DAEgAAAABA8AAbgHAAG5/AAAAAQEBwABuAgAAAIPWWwAAYMAA+goBPgFKwABuDwEiIiXAAG4cgMAAbhbAZtjJYMAA0ykAHMAAbkgWwABuPS7AAHeUwADRlUgBAAEWwABuURTAAG5LwGbYyQABYMAA0ynAAHeUwADSxQDAAP4zABzAAG5tFsAAbmcurffAANGmSAEAARbAAG52FMAAbnDAZtjJAAFgwADTKa33wADSxwDAAP0pBsAA0bKCbsAAboTAAG6MwABuqwEAg8EAAAABA8AAbpXAAG6rAAAAAAAAAGDAAPvQAUrAAG6YARbAAG6jFsAAbpguwAB3lMAA0ZWDwcAA/jEGwADRtoJuwABusMAAbrXAAG+1AACa3wAAAAEDwABuwMAAb7UAAAABAQHAAG7MAAAAg9ZgwADTBQAAYMAA+goBPgNJwABu2RzAAG7jgMAAbt3AZtniSAEAARbAAG78HsAAbubAANCAAAAAAJ5iwADSsgDAAP0pSsAAbwkBKT9JwABvGhzAAG8kgMAAbx7AZtniSAEAARbAAG89HsAAbyfAANCAAAAAAMAARPbAANKzAMAA/SlKwABvRwEqP0rAAG9ZAR7AAG9gwADQfgIAAhbAAG92LsAAd7LAANBywADRrRbAAG+iJsAAb40AgMAAb4fAZtniYMAA0SLAAHeywADQcsAA0SUABsAA0beCbsAAb7rAAG+/wABxKAAAwAB31QAAAAEDwABvzcAAcSgAAAABAQHAAG/ZAAAAg9ZgwADTBQAAYMAA+goBPgRJwABv5hzAAG/wgMAAb+rAZtrqSAEAARbAAHAJHsAAb/PAANCAAAAAAJ5iwADSsgDAAP0pSsAAcBYBKT9JwABwJxzAAHAxgMAAcCvAZtrqSAEAARbAAHBKHsAAcDTAANCAAAAAAMAARPbAANKzAMAA/SlKwABwVAEqP07AAHBswABwfwABwAB31mDAAP40ARbAAHCdJsAAcIgAgMAAcILAZtrqYMAA0SLAAHeywADQcsAA0SVKwABwsQEiHsAAcLjAANB+AgACFsAAcMUuwAB3ssAA0HLAANGtgcAAcNXAZtt9AAEewABw9MAA0H4CAAKBwABxAcBm230WwABxFS7AAHeywADQcsAA0a0ABsAA0bmCbsAAcS3AAHFGwABxkgAFwAB4AsAA0HIBagBgwADLBsABh2AAAAEDwABxX8AAcZIAAAABAQHAAHFgAAAAwAB3nFsAAGDAANLDAAbAANG6gm7AAHGXwABxo8AAcfsABcAAeATAANByAWoAYMAAywbAAYd0AAABA8AAccLAAHH7AAAAAQEBwABxwwAAAMAAd5xbAABgwAD+NAAAAGbUaQBm1ScAZtVfAGbVlwBm1koAZtaEAGbW0QBm1ysAZtd8AGbXzQBm2AcAZthBAGbYoABm2WgAZtm4AGbavgBm3A4AZtxdAGbcrAAAABICwADRvoJuwAByAMAAcgbAAH6cA8AAeAYAAAFgwADRjgACYMAA0zFgwADRIgcEwADRwYJuwAByeMAAcoYJwAB3ssAA0HIAYMAA/jQABMAA0cKCbsAAcpXAAHKfCcAAd7bAANByAGDAAPoKAATAANHDgm7AAHKuwABywwnAAHe4wADQcgBgwAD6CgAEwADRxIJuwABzsMAAc7YYwAB3tcAA0HIAYMAA0sMABMAA0cWCbsAAdKbAAHSvGMAAeAfAANByAGDAANFwASsEwADRxoJuwAB3eMAAd4YYqWrAANByAF3AAPx0AWDAANMpASsEwADRx4JuwAB5jMAAeZoYwABKPcAA0HIAXcAA/HQBYMAA0wUBKwEFwADR2oJuwAByyMAAcsjAAHN5AAAAA8AActvAAHN5AAAABgYGwABy3AAAAMAAd5xbAMAAcuwAAATAAHeyYMAA/jQAwABzAwAAAMAAd5RgwAD9tgDAAHMaAAAEwAB3tmDAAPoKAMAAcysAAATAAHe4YMAA+goAwABzRwAABMAAd7VgwADSwwAAYMAA0b4BPwUIAcAA0cGBAMBm3kMIAcAA0cKDAMBm3mUIAcAA0cOEAMBm3nYIAcAA0cSFAMBm3ocJAMAAc13AANGfAgACgMAAc1/AZt42HsAAc2rAANB5AQABgsAAc23AZt5UAAAOBsAA0cmCbsAAc37AAHOHwABzmQEAh3oAAAABA8AAc5LAAHOZAAAAAAAAAGDAAPoKAUrAAHOVASkGwADRyoJuwABzusAAc9DAAHSIAQCt9wAAAAEDwABz1sAAdIgAAAAAAAAAYMAA0sMBPgJJwABz3BzAAHPnFsAAc+AuwAB3tcAA0HLAANHESAEAASsAwAD9KT4CTsAAc/zAAHQAAACArGDAAP22AR7AAHQUwADRXgEAARbAAHQgLsAAd5rAANBywADRkQA9F8AAdDMuwAB3tcAA0HIcwAB0WxbAAHRSHsAAdDzAANCAAAAAAIbTwADSsEsBAAEewAB0YMAA/mUBAAGAwAB0ZsBm35MAAMAA/LnAANHEP0rAAHR3ARbAAHR+LsAAd7XAANBywADRxAbAANHLgm7AAHSzwAB0ysAAdXMBAMAAeAgAAAABA8AAdNPAAHVzAAAAAAAAAGDAANMiAT4CScAAdNkcwAB05xbAAHTdLsAAeAfAANBywADRxUgBAAErAMAA0Vk+Aj0XwAB0+C7AAHgHwADQcibAAHT4AR7AAHUEwADR1wEAARbAAHUULsAAd7LAANBywADRwQBgwADRcMAA0cU9F8AAdTUWwAB1Ky7AAHgHwADQcsAA0cXAAHe5wADQchbAAHVFLsAAd7LAANBywADRwcAA0TE/SsAAdV8BFsAAdWYuwAB4B8AA0HLAANHFBsAA0cyCbsAAdXjAAHWBwAB1qwEAwAB3wQAAAAEDwAB1ksAAdasAAAAAAAAAYMAA+goBSsAAdZUBIRbAAHWWLsAAd7jAANBywADRwwbAANHNgm7AAHWvwAB1uMAAdmgBAMAAd8AAAAABA8AAdcbAAHZoAAAAAAAAAGDAAP40AT4CScAAdcwhFsAAddEuwAB3wcAA0cw+AT0wwAB16x/AAHX1wAD7YgEAASfAAHfCAD9KwAB2TwEWwAB2Vi7AAHeywADQcsAA0cEGwADRzoJuwAB2bcAAdnbAAHazAQDAAHfFAAAAAQPAAHaMwAB2swAAAAAAAABgwAD6CgFKwAB2jwEiIRbAAHaQLsAAd7bAANBywADRwgEWwAB2ni7AAHe4wADQcsAA0cMGwADRz4JuwAB2uMAAdsrAAHdaAQDAAHfSAAAAAQPAAHbewAB3WgAAAAAAAABgwADTMQE+AUnAAHbkFsAAduguwAB3xcAA0c4+AUrAAHcHAS4+AUrAAHcnAR7AAHcuwADR2AEAARbAAHdBLsAAd7LAANBywADRwQAGwADR0IJuwAB3isAAd6fAAHl2AQCiWgAAAAEDwAB3tcAAeXYAAAAAAAAAXcAA/HQBYMAA0ykBPgJJwAB3uxzAAHfOFsAAd78uqWrAANBywADRxkgBAAErAMAA/Sk+BT0XwAB33y6pasAA0HIewAB39MAA924BAWDAANMpAZMAwADRxk7AAHgbwAB4IgAAg+9dwAD8dAFbAR7AAHg2wADRawEAARbAAHhSLsAAd5rAANBywADRkQBOwAB4c8AAeHkAAK33YMAA0zEBFsAAeHsuwAB30sAA0c9OwAB4mgAAAMAAd9NbAEXAAHioAcAAeLHAAHizAABiYMAA+9ABkwEcwAB4uoPAAHi4wGbjoWMBAAEWwAB4w4DAAHi8wGbjOWHAAPyjAMAA/P0Bi8AAeMvAZuOhHMAAeM2DwAB4y8Bm46FkAQABlQDAAPz1PgI9isAAeN3AZuOOH8AAeOrAANG9AwADHMAAeQuAwAB5BcBm4zlLAQABHMAAeQ6DwAB5DMBm46FkAQABlADAAPz1AMAA/IMmwAB5GgEcwAB5GoDAAHkUwGbjOUsBAAGDwAB5G8Bm46EAwAD8g2DAAP22gcAAeR/AZuNtAD0cwAB5PhbAAHkvLqlqwADQcsAA0cZWAQABJsAAeUIBgsAAeULAZuOOYMAA0ykAwAD8hT9KwAB5XQEWwAB5ZC6pasAA0HLAANHGBsAA0dGCbsAAeZ7AAHmzwAB7FgEAhRcAAAABA8AAecHAAHsWAAAAAAAAAF3AAPx0AWDAANMFAT4CScAAecccwAB52hbAAHnLLsAASj3AANBywADRx0gBAAErAMAA/Sk+AUnAAHnrFsAAee8uwAB3uMAA0HLAANHDPgE9F8AAehAuwABKPcAA0HJqwAB6IV3AAPx0AWDAANMFwAGF58AA0cc+AT0XwAB6Ti7AAEo9wADQch/AAHpjwADAiQEBYMAA0wUBHMAAetYewAB6o8AA0WwBAAEWwAB6uS7AAHeywADQcsAA0cEAljIAAWDAANMFAADAAPyCAMAA0cc/SsAAev0BFsAAewQuwABKPcAA0HLAANHHBsAA0dOCbsAAexvAAHsiwAB7VgAAIwAAAAEDwAB7KsAAe1YAAAAAAAAAYMAA/bYBSsAAezABJMAAe1YDJ8AAeAkewAB7RcAA0HgBAAEWwAB7SC7AAHeUwADRlQAng0IGwADR1IJuwAB7W8AAe2DAAHxgAACa3wAAAAEDwAB7a8AAfGAAAAABAQHAAHt3AAAAg9ZgwADTBQAAYMAA+goBPgNJwAB7hBzAAHuOgMAAe4jAZuZjSAEAARbAAHunHsAAe5HAANCAAAAAAJ5iwADSsgDAAP0pSsAAe7QBKT9JwAB7xRzAAHvPgMAAe8nAZuZjSAEAARbAAHvoHsAAe9LAANCAAAAAAMAARPbAANKzAMAA/SlKwAB78gEqP0rAAHwEAR7AAHwLwADQfgIAAhbAAHwhLsAAd7LAANBywADRwRbAAHxNJsAAfDgAgMAAfDLAZuZjYMAA0SLAAHeywADQcsAA0SUABsAA0dWCbsAAfGXAAHxqwAB90wAAwAB31QAAAAEDwAB8eMAAfdMAAAABAQHAAHyEAAAAg9ZgwADTBQAAYMAA+goBPgRJwAB8kRzAAHybgMAAfJXAZudrSAEAARbAAHy0HsAAfJ7AANCAAAAAAJ5iwADSsgDAAP0pSsAAfMEBKT9JwAB80hzAAHzcgMAAfNbAZudrSAEAARbAAHz1HsAAfN/AANCAAAAAAMAARPbAANKzAMAA/SlKwAB8/wEqP07AAH0XwAB9KgABwAB31mDAAP40ARbAAH1IJsAAfTMAgMAAfS3AZudrYMAA0SLAAHeywADQcsAA0SVKwAB9XAEiHsAAfWPAANB+AgACFsAAfXAuwAB3ssAA0HLAANHBgcAAfYDAZuf+AAEewAB9n8AA0H4CAAKBwAB9rMBm5/4WwAB9wC7AAHeywADQcsAA0cEABsAA0deCbsAAfdjAAH3ywAB+NgAFwAB4CsAA0HIBagBgwADLBsABh4gAAAEDwAB+AcAAfjYAAAABAQHAAH4CAAAAwAB3wFsAAGDAANMiAAbAANHYgm7AAH47wAB+UMAAfpoABcAAeAzAANByAWoAYMAAywbAAYecAAABA8AAfmLAAH6aAAAAAQEBwAB+YwAAAMAAd8BbAABgwADTMQAAAGbe/wBm3zcAZuAsAGbhFQBm4WEAZuHdAGbiPQBm4rUAZuTGAGbl2gBm5jkAZuc/AGbojwBm6N4AZuktAAAADgLAANHbgm7AAH9GwAB/TMAAiGcDwAB4DgAAAWDAANDtAAFgwADS5gQEwADR3YJuwAB/pcAAf68JwAB3lABgwAD+KAAEwADR3oJuwAB/vcAAf8AJgKwAYMAA/jcABMAA0eCCbsAAgY7AAIGbGMAAd7/AANByAF3AAPylAmDAAP4oYMAA0sMBKwTAANHhgm7AAIVowACFghjAAHgPwADQcgBbASsBBcAA0fmCbsAAf8XAAH/FwACAbACAtcAA0HIAA8AAf9rAAIBsAAAAAwMDwAB/2wAAAMAAd5xbAMAAf+0AAADAAHeUYMAA/bYAwACAAAAAAMAASMxgwAD9tgAAYMAA0dsBPwMIAMAA0d0ewACAH8AA0HkBAAGBwACAIsBm6kkACADAANHeHsAAgEbAAP5lAQABgsAAgEzAZupaAAkAwACAYMAA0PwBAAGAwACAYsBm6jwAEQbAANHjgm7AAIC5wACAxMAAgN8BAMAAaSIAAAABA8AAgNLAAIDfAAAAAAAAAGDAAP4oAUrAAIDVARbAAIDVLsAAd5TAANHdBsAA0eSCbsAAgOTAAID6wACBBwEArfcAAAABA8AAgQDAAIEHAAAAAAAAAGDAANLDAUrAAIEDASsGwADR5YJuwACBDMAAgRXAAIEnAQCGVwAAAAEDwACBH8AAgScAAAAAAAAAYMAA+goBSsAAgSIBKgbAANHmgm7AAIErwACBNMAAgUcBAId6AAAAAQPAAIE/wACBRwAAAAAAAABgwAD6CgFKwACBQgEqBsAA0eiCbsAAgUzAAIFVwACBagEAwAB3ucAA0HIAAAABA8AAgWPAAIFqAAAAAAAAAGDAAP40AUrAAIFmASsGwADR6YJuwACBn8AAgcLAAIMeAQCtbAAAAAEDwACBz8AAgx4AAAAAAAAAXcAA/KUCYMAA/ihgwADSwwE+BUnAAIHVIRzAAIHnFsAAgdkuwAB3v8AA0HLAANHgSAEAASsAwAD9KUrAAIHwARbAAIH3LsAAd7/AANBywADR4D9OwACCD8AAghUAAMAAd8xdwAD8pQJgwAD+KGDAANLDAR7AAIIbwAD8rAACYMAA/ihgwADSwwAATsAAgkXAAIJNAACEiF3AAPx0AVsBHMAAgk8uwAB3zcAA0HIBAAEWwACCXy7AAHeawADQcsAA0PAAwADR9kbAAIJwwACCjMAAgnkAAACCZlsAgcAAgoPAZuynPgE9HMAAgpmAwACClMBm7HCAvwIAAibAAIKZARbAAIKhgsAAgprAZuzswAB3lABgwAD+KCbAAIKZAYLAAIKvwGbs7GDAANLDAMAA/LpKwACCwgEXwACCyS7AAHe/wADQch/AAILlwADCNQECYMAA/ihgwADSwwGAwACDFMBm7HAAwADR4AbAANHqgm7AAIMjwACDNsAAg2UBAIRbAAAAAQPAAIM/wACDZQAAAAAAAABgwADTXwE+AUrAAINFAR7AAINMwADQfAEAARbAAINWLsAAd5rAANBywADQ8AAGwADR64JuwACDasAAg4PAAIRxAQCG1QAAAAEDwACDjMAAhHEAAAAAAAAAXcAA/HQBYMAA0tYBPgFKwACEEQEfwACEHMAAwIkBAWDAANLWARzAAIRgHsAAhErAANB9AQABFsAAhFQuwAB3msAA0HLAANDwAICrAQFgwADS1gFqwACEZGEBYMAA/RxgwADS1sABhe4AwAD8PQAGwADR74JuwACEdsAAhITAAITzAwBIAAAAAQPAAISGwACE8wAAAAEBAcAAhIcAAACD1lsAAGDAAPoKAT4BSsAAhJQBIhzAAISsFsAAhKAuhYDAAP0wSAEAARbAAIS1gMAAhK/AZu6fhYDAAP0wAMAA/SkAHMAAhNwWwACE0S7AAHeawADQcsAA0PBIAQABFsAAhOWAwACE38Bm7p/AAHeawADQcgAAwAD9KQbAANHsgm7AAIT4wACFAMAAhR8BAIPBAAAAAQPAAIUJwACFHwAAAAAAAABgwAD70AFKwACFDAEWwACFFxbAAIUMLsAAd5TAANHdg8HAAP4xBsAA0fCCbsAAhSTAAIUrwACFXwAAIwAAAAEDwACFM8AAhV8AAAAAAAAAYMAA/bYBSsAAhTkBJMAAhV8DJ8AAeBAewACFTsAA0HgBAAEWwACFUS7AAHeUwADR3QAng0IGwADR7YJuwACFhsAAhYrAAIauAQDAAHgRAAAAAQPAAIWewACGrgAAAAAAAABdwAD8dAFgwADS7wE+AknAAIWkHMAAhcMWwACFqC7AAHgPwADQcsAA0eFIAQABKwDAAP0pPgE9F8AAhdQuwAB4D8AA0HIfwACF/8AAwIkBAWDAANLvARzAAIZdHMAAhjwuwAB4EsAA0HIBAAEWwACGUS7AAHeawADQcsAA0PAAwADR8pYyAAFgwADS7wAAwAD8ggDAANHhP0rAAIaJASbAAIaJARbAAIaQLsAAeA/AANBywADR4V3AAPx0AWDAANLvBsAA0fKCbsAAhrPAAIbBwACHEQAEwAB4EsAA0HIBagBgwADLBsABh7AAAAEDwACG1cAAhxEAAAABAQHAAIbWAAAAwAB3nFsAAF3AAPx0AVsABsAA0fOCbsAAhxbAAIcWwACHcgAEwAB3m8AA0HIBagBgwADLBsABh8QAAAEDwACHHcAAh3IAAAAEBATAAIceAAAAwAB3nFsAwACHKQAAAKcbWwDAAIc1AAAAW1sAwACHQAAAAMAAVI9bAABbAAbAANH0gm7AAId3wACHd8AAh78ABMAAd53AANByAWoAYMAAywbAAYfYAAABA8AAh4TAAIe/AAAAAgICwACHhQAAAMAAd5xbAMAAh5AAAADAAEeQWwAAWwAGwADR9YJuwACHxMAAh8TAAIgZAATAAHeewADQcgFqAGDAAMsGwAGH7AAAAQPAAIfRwACIGQAAAAMDA8AAh9IAAADAAHecWwDAAIfdAAAAwABHkVsAwACH6QAAAICWWwAAWwAGwADR9oJuwACIHsAAiCzAAIhlAATAAHfNwADQcgFqAGDAAMsGwAGIAAAAAQPAAIg7wACIZQAAAAEBAcAAiDwAAADAAHecWwAAXcAA/HQBWwAAAGbqxABm6wsAZutDAGbrewBm67MAZuvxAGbthQBm7d0AZu52AGbvIABm73AAZu/PAGbwvQBm8Q4AZvF7AGbx0wBm8jYAZvKHAAAAEQLAANH6gm7AAIhqwACIcMAAjrcDwAB4GAAAAWDAANCnAAFgwADS7wcEwADR/IJuwACI4sAAiO8JqH8AYMAA0uYABMAA0f6CbsAAiPfAAIkMGMAAeBnAANByAFsABMAA0f+CbsAAiS3AAIk4CYSdAF3AAPx0AWDAANL+AATAANIAgm7AAIlJwACJTwmDJABgwAD+KAAEwADSAYJuwACJXsAAiWYJhKgAYMAA+goABMAA0gKCbsAAiXXAAIl/CYSpAGDAAPoKAATAANIDgm7AAImewACJpgmG1QBdwAD8dAFgwADS1gABBcAA0g6CbsAAiavAAImrwACLngCAtcAA0HIAA8AAicrAAIueAAAABwcHwACJ1wAABKh/YMAA0uYAwACJ8QAABMAAeBlbAMAAihwAAADAAHgaXcAA/HQBWwDAAIo2AAAAwAB4G1sAwACKTwAABISoYMAA+goAwACKZAAABISpYMAA+goAwACKhAAAAMAAeBxdwAD8dAFbAABgwADR+gE/CAgBwADR/IAAwGbz5AgBwADR/oEAwGbz8wgBwADSAYQAwGb0IAgBwADSAoUAwGb0LwgAwADSAB7AAIqowADQeQEAASbAAIqrAYPAAIqrwGb0E2DAAP22AAgAwADR/x/AAIrUwADAiQEBYMAA0v4BHMAAixuCwACLCMBm9ACWMgABYMAA0v4AAMAA/IIACADAANIDH8AAi03AAMCJAQFgwADS1gEcwACLkYbAAIt/wGb0PoCrAQFgwADS1gFqwACLlWEBYMAA/RxgwADS1sABhe4AwAD8PQAJAcAAiavAANCpAAAAAAUGwADSBYJuwACLo8AAi6zAAIvBAQCEpwAAAAEDwACLtcAAi8EAAAAAAAAAYMAA+goBSsAAi7gBIRbAAIu5LoSowADSAQbAANIGgm7AAIvGwACL2MAAjPgBAISmAAAAAQPAAIvmwACM+AAAAAAAAABgwADS5gE+BEnAAIvsJcAAjAYWwACL8C7AAHgZwADQcsAA0f5gwADR2z4BSsAAjCYBJsAAjCYBFsAAjC0uwAB4GcAA0HLAANH+YMAA0uY/TsAAjFLAAIxfAADAAHgdYMAA0uYBHsAAjGHAANILAQABFsAAjHMuwAB4GcAA0HLAANH+AEnAAIyPIRzAAIyggMAAjJPAZvX+SAEAASsAwADS7D4BPRfAAIyxLsAAeBnAANBygMAAjMnAZvX+wADR/j9KwACM4QGAwACM6MBm9f4GwADSCYJuwACM/cAAjRPAAI4rAACtMwAAAAEDwACNHsAAjisAAAAAAAAAXcAAuKkBYMAA0uYBPgNJwACNJyXAAI1BFsAAjSsuwAB4GcAA0HLAANH+YMAA0ds+AUrAAI1hAR7AAI1swAC4sgEBYMAA0uYBJsAAjXkBFsAAjXkuwAB4GcAA0HLAANH+XcAAuKUBYMAA0uYAP07AAI2fwACNqwAAwAB4HlsBFsAAja0uwAB4GcAA0HLAANH+SsAAjcgBJsAAjcgBHMAAjekcwACN24DAAI3PwGb3Fq0zAAAAAACBrQEAATTAAI3uA8AAje7AAI4mAAAAAQEBwACN7wAAAIC1WwAAYMAA0uYBPgFKwACN+gEewACOAcAA0gsBAAGAwACOE8Bm9xYAAABdwAC4qQFgwADS5gbAANILgm7AAI4wwACORcAAjo0ABcAAeB/AANByAWoAYMAAywbAAYgUAAABA8AAjlbAAI6NAAAAAQEBwACOVwAAAMAAR95bAABgwADS5gAGwADSB4JuwACOksAAjqXAAI61AQCEWwAAAAEDwACOrsAAjrUAAAAAAAAAYMAA018BSsAAjrEBKwAAZvU/AGb1gwBm9n0AZve0AGb4AwBm+DsAAAAFAsAA0g+CbsAAjrrAAI7AwACQBAPAAHghAAABYMAA0KcAAWDAANL+AgTAANIRgm7AAI8fwACPKgnAAHgiAF3AAPx0AWDAAP4oAATAANISgm7AAI85wACPPwmEsABgwAD6CgABBcAA0heCbsAAj0TAAI9EwACP4wCAtcAA0HIAA8AAj1zAAI/jAAAAAgICwACPXQAAAMAAeCNbAMAAj3QAAASEsGDAAPoKAABgwADSDwE/AwgBwADSEoEAwGb48ggAwADSER/AAI+nwADAiQEBYMAA/igBMcAAj8xgwAD+KAEewACPzcAA0HkBAAEmwACP0AGAwACP0MBm+OVgwAD9tgAACQHAAI9EwADQqQAAAAABBsAA0hSCbsAAj+jAAI/xwACQAgEAhLUAAAABA8AAj/jAAJACAAAAAAAAAGDAAPoKAUrAAI/7ASEWwACP/C6EsMAA0hIAAGb5aQBm+a0AAAABAsAA0hiCbsAAkAfAAJANwACgVQPAAHgkAAABYMAA0Y4AAWDAANM2EgTAANIbgm7AAJBrwACQeAnAAHe5wADQcgBgwAD+NAAEwADSIoJuwACQh8AAkI8JhBkAYMAA+goABMAA0hyCbsAAkJ3AAJCnCcAAeCXAANByAGDAAPvQAATAANIjgm7AAJFiwACRbwbAAHgmAGDAAPvQAWrAAJFuYMAA+9AJBMAA0iSCbsAAkYDAAJGLBsAAeCcAYMAA+9ABasAAkYpgwAD70BUEwADSJYJuwACRnMAAkacGwAB4KABgwAD70AFqwACRpmDAAPvQIQTAANImgm7AAJG4wACRyAbAAHgpAGDAAPvQAWrAAJHHYMAA+9BSBMAA0ieCbsAAkdnAAJHnBsAAeCoAYMAA+9ABasAAkeZgwAD70IFVBMAA0iiCbsAAkfjAAJILBsAAeCsAYMAA+9ABasAAkgpgwAD70II8BMAA0imCbsAAkhzAAJIwBsAAeCwAYMAA+9ABasAAki9gwAD70IQIBMAA0iqCbsAAkkHAAJJRBsAAeC0AYMAA+9ABasAAklBgwAD70ITgBMAA0iuCbsAAkmLAAJJvBsAAeC4AYMAA+9ABasAAkm5gwAD70IM+BMAA0iyCbsAAkoDAAJKOBsAAeC8AYMAA+9ABasAAko1gwAD70IPvBMAA0h2CbsAAlaLAAJY7BsAAeDDAANByAF3AAPx0AWDAAP22AWrAAJWvXcAA/HQBYMAA/bbAAYgjBMAA0h6CbsAAlpDAAJaWGMAAd7XAANByAGDAANLDAATAANIfgm7AAJg+wACYSRjAAFMnwADQcgBgwADTBQErBMAA0iCCbsAAmXfAAJmCGMAAd/TAANByAF3AAPx0AWDAANNWASsEwADSIYJuwACaycAAmtkYwAB4McAA0HIAYMAA/igBKwEFwADSS4JuwACQrMAAkKzAAJFQAIC1wADQcgADwACQwMAAkVAAAAAGBgbAAJDBAAAAwAB3nFsAwACQ0wAAAMAAd5RgwAD9tgDAAJDkAAAEwAB3tWDAANLDAMAAkPcAAATAAHe5YMAA/jQAwACRCwAABIQZYMAA+goAwACRGgAABMAAeCVgwAD70AAAYMAA0hgBPwUIAcAA0h6CAMBm/MIIAcAA0huDAMBm/NMIAcAA0iKEAMBm/OQIAcAA0hyFAMBm/PMJAMAAkTTAANGfAgACgMAAkTbAZvykHsAAkUHAANB5AQABgcAAkUTAZvyxAAAZBsAA0i6CbsAAktTAAJLdwACTDwEAhBoAAAABA8AAkujAAJMPAAAAAAAAAGDAAPoKAUrAAJLrASEcwACS7ZNIAQABHMAAkvwWwACS8S7AAHglwADQcsAA0hyDdwEAARzAAJMBlIO6AQABasAAkwRgwAD70AkAwAD77ADAAPvoAMAA/PMGwADSL4JuwACTE8AAkxzAAJNKAQCFLQAAAAEDwACTJcAAk0oAAAAAAAAAYMAA+goBSsAAkygBIRzAAJMqk0gBAAEcwACTORbAAJMuLsAAeCXAANBywADSHIN3AQABHMAAkz6Ug7oBAAFqwACTQWDAAPvQFQDAAPvsAMAA++gAwAD88wbAANIwgm7AAJNOwACTV8AAk4UBAIUvAAAAAQPAAJNgwACThQAAAAAAAABgwAD6CgFKwACTYwEhHMAAk2WTSAEAARzAAJN0FsAAk2kuwAB4JcAA0HLAANIcg3cBAAEcwACTeZSDugEAAWrAAJN8YMAA+9AhAMAA++wAwAD76ADAAPzzBsAA0jGCbsAAk4nAAJOSwACTygEAh3kAAAABA8AAk6DAAJPKAAAAAAAAAGDAAPoKAUrAAJOjASEcwACTpZNIAQABHMAAk7QWwACTqS7AAHglwADQcsAA0hyDdwEAARzAAJO5lIO6AQABasAAk7xgwAD70FIAwAD77ADAAPvoAMAA/PMGwADSMoJuwACTzsAAk9fAAJQSAQDAAHeVAAAAAQPAAJPqwACUEgAAAAAAAABgwAD6CgFKwACT7QEhHMAAk++TSAEAARzAAJP+FsAAk/MuwAB4JcAA0HLAANIcg3cBAAEcwACUA5SDugEAAWrAAJQGYMAA+9CBVQDAAPvsAMAA++gAwAD88wbAANIzgm7AAJQWwACUH8AAlGoBALMIAAAAAQPAAJQ3wACUagAAAAAAAABgwAD6CgFKwACUQAEhHMAAlEKTSAEAARzAAJRRFsAAlEYuwAB4JcAA0HLAANIcg3cBAAEcwACUVpSDugEAAWrAAJRZYMAA+9CCPADAAPvsAMAA++gAwAD88wbAANI0gm7AAJRuwACUd8AAlMQBAMAAd5YAAAABA8AAlJDAAJTEAAAAAAAAAGDAAPoKAUrAAJSZASEcwACUm5NIAQABHMAAlKoWwACUny7AAHglwADQcsAA0hyDdwEAARzAAJSvlIO6AQABasAAlLJgwAD70IQIAMAA++wAwAD76ADAAPzzBsAA0jWCbsAAlMjAAJTRwACVEAEAtAIAAAABA8AAlObAAJUQAAAAAAAAAGDAAPoKAUrAAJTpASEcwACU65NIAQABHMAAlPoWwACU7y7AAHglwADQcsAA0hyDdwEAARzAAJT/lIO6AQABasAAlQJgwAD70ITgAMAA++wAwAD76ADAAPzzBsAA0jaCbsAAlRTAAJUdwACVTwEAhB8AAAABA8AAlSjAAJVPAAAAAAAAAGDAAPoKAUrAAJUrASEcwACVLZNIAQABHMAAlTwWwACVMS7AAHglwADQcsAA0hyDdwEAARzAAJVBlIO6AQABasAAlURgwAD70IM+AMAA++wAwAD76ADAAPzzBsAA0jeCbsAAlVPAAJVcwACVkAEAhIcAAAABA8AAlWjAAJWQAAAAAAAAAGDAAPoKAUrAAJVrASEcwACVbZNIAQABHMAAlXwWwACVcS7AAHglwADQcsAA0hyDdwEAARzAAJWBlIO6AQABasAAlYRgwAD70IPvAMAA++wAwAD76ADAAPzzBsAA0jiCbsAAlj/AAJZIwACWeQEAnW4AAAABA8AAllPAAJZ5AAAAAAAAAGDAAPoKAUrAAJZWARzAAJZhasAAllZdwAD8dAFgwAD9tsABiCODFwEAAR7AAJZqwADQeAEAARbAAJZtLsAAd5TAANGVAADAAPxBBsAA0jmCbsAAlprAAJawwACXlgEArfcAAAABA8AAlrbAAJeWAAAAAAAAAGDAANLDAT4CScAAlyYcwACXMRbAAJcqLsAAd7XAANBywADSHkgBAAErAMAA/Sk+AT0XwACXQi7AAHe1wADQcibAAJdCAR7AAJdLwADSRAIAAhbAAJdfLsAAd5rAANBywADRkRbAAJdrLsAAd7nAANBywADSGwBgwADSw8AA0h4/SsAAl4UBFsAAl4wuwAB3tcAA0HLAANIeBsAA0jqCbsAAl5vAAJekwACX/AEAhlcAAAABA8AAl67AAJf8AAAAAAAAAGDAAPoKAUrAAJe3ASIcwACXxh7AAJe3wADQeAEAARbAAJe6LsAAd5TAANGVAIHWAQABJ4C1AMAA/cgBHMAAl+0ewACX2cAA0HgBAAEWwACX3C6uFMAA0j8AgdYBAAEngLUAwAD9yAbAANI7gm7AAJgBwACYCsAAmC4BAId6AAAAAQPAAJgVwACYLgAAAAAAAABgwAD6CgFKwACYGAElwACYHhbAAJgYLq33wADSOWDAANLmBsAA0jyCbsAAmE3AAJhcwACZXAEAhTQAAAABA8AAmGfAAJlcAAAAAAAAAGDAANMFAT4CScAAmG0cwACYfRbAAJhxLsAAUyfAANBywADSH0gBAAErAMAA/Sk+AUnAAJiOFsAAmJIuh3nAANIxPgE9F8AAmKsuwABTJ8AA0HImwACYqwEWwACYuS6t98AA0jlgwADTBcAA0h8+AT0XwACY1y7AAFMnwADQch7AAJjxwADQgwEAASbAAJj9AR7AAJj9wADSRQIAAhbAAJkXLsAAd5rAANBywADRkRbAAJkjLsAAd7nAANBywADSGwBgwAD+NADAANIfP0rAAJlGARbAAJlNLsAAUyfAANBywADSHwbAANI9gm7AAJmGwACZoMAAmnQBAJqAAAAAAQPAAJmrwACadAAAAAAAAABdwAD8dAFgwADTVgE+AknAAJmxHMAAmcEWwACZtS7AAHf0wADQcsAA0iBIAQABKwDAAP0pPgE9F8AAmdIuwAB39MAA0HIfwACZ5MAAwIkBAWDAANNWARzAAJo6HMAAmhUuwAB4MsAA0HIBAAEWwACaLi7AAHeawADQcsAA0ZEAwADSRpYyAAFgwADTVgAAwAD8ggDAANIgP0rAAJpeARbAAJplLsAAd/TAANBywADSIAbAANI+gm7AAJp5wACagsAAmr0BAKGoAAAAAQPAAJqSwACavQAAAAAAAABgwAD6CgFKwACalQEiIiEWwACali6FLcAA0i8AIRbAAJqjLoUvwADSMAAhFsAAmrAuh3nAANIxBsAA0j+CbsAAmt3AAJrowACdgwEArhQAAAABA8AAmvjAAJ2DAAAAAAAAAGDAAP4oAT4CScAAmv4cwACbExbAAJsCLsAAeDHAANBywADSIUgBAAErAMAA/jM+AUnAAJskIRbAAJspLod5wADSMT4BPRfAAJtCLsAAeDHAANByHsAAm1XAANB5AQABJwAAwADSIT4CTsAAm3jAAJt+AACEf13AAPx0AWDAAP22ARzAAJuhHsAAm43AANKtAQABFsAAm5UuwAB3lMAA0ZUAgKYBAAEngWoAwAD92UnAAJu1HMAAm8YWwACbv4DAAJu5wGcHiWHAAPyjgJcBAAGVAMAA/P8+AT0wwACb1x/AAJvhwADQiwEAASQABCfAAHgzJ8AAeDQWwACcWC7AAHeUwADRlSeAlwBJwACcdhzAAJyHFsAAnICAwACcesBnB4lhwAD8o0gBAAGVAMAA/PM+Ak7AAJynwACctwAAwAB4NWDAANLmASbAAJynARbAAJy/FsAAnLkurffAANI5rffAANLHYMAA0uY9F8AAnNAuwAB4McAA0HIewACc8MAA0q4CAAIcwACc/4DAAJz6wGcHiUsBAAGUAMAA/IOBwACdBMBnCFMAwADSIT4BPRfAAJ0xLsAAeDHAANByHsAAnUTAANB5AQABJwAAwADSIT9KwACdaAEWwACdby7AAHgxwADQcsAA0iEGwADSQIJuwACdiMAAnZPAAJ29AQCDRAAAAAEDwACdmsAAnb0AAAAAAAAAYMAA/bYBSsAAnZ0BHsAAnZ3AANJHAQABFsAAnbIuwAB3msAA0HLAANGRAAbAANJDgm7AAJ3CwACdx8AAnoYAAMAAd9DAANByAAAAAQPAAJ3cwACehgAAAAEBAcAAnd0AAADAAHg2WwAAXAE+Ak7AAJ3ywACd9QAAwAB4N2DAAP22AR7AAJ33wADQeAEAARbAAJ36Lq4UwADSPwBJwACeEBzAAJ4XgcAAnhTAZwmgSAEAAScAAMAA/cU+AT0XwACeJi7AAHe0wADQch7AAJ40wADQeQEAASbAAJ43AYDAAJ43wGcJjWDAAP22AMAA0ZI+AT0XwACeVi7AAHe0wADQch7AAJ5kwADQeQEAASbAAJ53ARzAAJ53HMAAnnGAwACeZ8BnCY1kAQABJ4FqAABkAQABgcAAnnnAZwmgAABgwAD9tgDAANGSBsAA0kiCbsAAnovAAJ6SwACe1wAAIwAAAAEDwACemsAAntcAAAAAAAAAYMAA/bYBSsAAnqABJMAAntcDJ8AAeDgewACewcAA0q0BAAEWwACeyS7AAHeUwADRlQAng0IGwADSRIJuwACe3MAAnuvAAJ85AAXAAHg5wADQcgFqAGDAAMsGwAGIfwAAAQPAAJ7+wACfOQAAAAICAsAAnv8AAADAAHecWwDAAJ8KAAAAmqtbAABbAAbAANJFgm7AAJ8+wACfTcAAn6cABcAAeDvAANByAWoAYMAAywbAAYiTAAABA8AAn2bAAJ+nAAAAAgICwACfZwAAAMAAd5xbAMAAn3IAAACaq1sAAFsABsAA0kaCbsAAn6zAAJ+6wACgBAAEwAB4MsAA0HIBagBgwADLBsABiKcAAAEDwACf0sAAoAQAAAABAQHAAJ/TAAAAwAB3nFsAAF3AAPx0AVsABsAA0keCbsAAoAnAAKAXwACgUwAFwAB4PsAA0HIBagBgwADLBsABiLsAAAEDwACgK8AAoFMAAAABAQHAAKAsAAAAwAB3nFsAAGDAAP22AAAAZv1rAGb97gBm/nEAZv70AGb/dwBm//0AZwCBAGcBBwBnAYsAZwIPAGcCkwBnAwgAZwPLAGcEXABnBKkAZwW4AGcGkwBnBvUAZwkHAGcJXQBnCnkAZwrYAGcLLgBnC4QAZwvVAGcMJAAAABkCwADSTIJuwACgWMAAoF7AAKTnA8AAeEAAAAFgwADRjgABYMAA00wFBMAA0k6CbsAAoM3AAKDSCa33AGDAANLDAATAANJPgm7AAKDhwACg6QmEGQBgwAD6CgAEwADSUIJuwACg+MAAoP8JhBsAYMAA+goABMAA0lGCbsAAoQ7AAKEVCYQdAGDAAPoKAATAANJTgm7AAKOSwACjlxiSJsAA0HIAYMAA0wUAAQXAANJfgm7AAKEawAChGsAAocIAgLXAANByAAPAAKEwwAChwgAAAAcHB8AAoTEAAADAAHecWwDAAKFDAAAAwAB3lGDAAP22AMAAoVQAAASt92DAANLDAMAAoWAAAASSJmDAANMFAMAAoXIAAASEGWDAAPoKAMAAoYEAAASEG2DAAPoKAMAAoY8AAASEHWDAAPoKAABgwADSTAE/BggBwADSToIAwGcNgwgBwADSU4MAwGcNkggBwADST4QAwGcNoQgBwADSUIUAwGcNsAgBwADSUYYAwGcNvwkAwAChpsAA0Z8CAAKAwAChqMBnDWUewAChs8AA0HkBAAGBwAChtsBnDXIAAAUGwADSVYJuwAChx8AAodDAAKH0AQCHegAAAAEDwACh28AAofQAAAAAAAAAYMAA+goBSsAAod4BJcAAoeQWwACh3i6t98AA0k5gwADS5gbAANJXgm7AAKH5wACiAsAAo4IBAMAAd7nAANByAAAAAQPAAKIQwACjggAAAAAAAABgwAD+NAE+Ak7AAKIcwACiHgABrX1gwADSwwEWwACiIC6t98AA0k5JwACiYSXAAKJngMAAomXAZw7IYMAA0Sg+AUrAAKKFARbAAKKOFMAAoozAZw7IAAFgwADRKMAAd7nAANBywADRMUnAAKKoJcAAoq6AwACirMBnDshgwADSGD4BSsAAos0BFsAAotYUwACi1MBnDsgAAWDAANIYwAB3ucAA0HLAANIbScAAovAlwACi9oDAAKL0wGcOyGDAANHbPgFKwACjFgEWwACjHxTAAKMdwGcOyAABYMAA0dvAAHe5wADQcsAA0eg+AT0wwACjQR/AAKNLwAD7YgEAASTAAKN3AifAAHhBFsAAo3AurffAANJOAAbAANJYgm7AAKObwACjqsAApDABAIKQAAAAAQPAAKOvwACkMAAAAAAAAABgwADTBQE+AknAAKO1HMAAo78WwACjuS6SJsAA0HLAANJTSAEAASsAwAD9KT4BPRfAAKPQLpImwADQch7AAKPYwADQgwEAASbAAKPkAR7AAKPkwADSXAIAAhbAAKP5LsAAd5rAANBywADRkRbAAKQFLsAAd7nAANBywADSVwBgwAD+NADAANJTP0rAAKQgARbAAKQnLpImwADQcsAA0lMGwADSWoJuwACkNcAApDzAAKSJAAAjAAAAAQPAAKREwACkiQAAAAAAAABgwAD9tgFKwACkUAEkwACkiQMnwAB4Qh7AAKRzwADSrQEAARbAAKR7LsAAd5TAANGVACeDQgbAANJcgm7AAKSOwACklcAApOUABcAAeEPAANByAWoAYMAAywbAAYjPAAABA8AApKnAAKTlAAAAAgICwACkqgAAAMAAd5xbAMAApLUAAACaq1sAAFsAAABnDkEAZw6OAGcP1QBnEJ8AZxD+AGcRVAAAAAUCwADSYIJuwACk6sAApPDAAKuhA8AAeEUAAAFgwADSTAABYMAA01YHBMAA0mOCbsAApVDAAKVZCcAAcbDAANByAGDAAPvQAATAANJogm7AAKVowAClcgmhHgBgwAD6CgAEwADSaYJuwAClgcAApYgJo60AYMAA+goABMAA0mSCbsAApZfAAKWqCcAAeEbAANByAF3AAPx0AVsABMAA0mWCbsAAp6TAAKe6GMAAeEfAANByAGDAAP0cAATAANJmgm7AAKfNwACn2hjAAG5fwADQcgBgwADS1gErBMAA0meCbsAAqjnAAKo+GJImwADQcgBgwADTBQErAQXAANJ2gm7AAKWvwAClr8AAp5gAgLXAANByAAPAAKXGwACnmAAAAAkJCcAApc4AAADAAHecWwDAAKXmAAAAwAB3lGDAAP22AMAApgoAAACt92DAANLDAMAAphwAAATAAHGwYMAA+9AAwACmMgAABKEeYMAA+goAwACmSQAABKOtYMAA+goAwACmXQAAAIQbYMAA+goAwACmcQAABMAAeEdgwAD9HADAAKaUAAAEwAB4Rl3AAPx0AVsAAGDAANJgAT8GCAHAANJjgwDAZxLACAHAANJohADAZxLRCAHAANJphQDAZxLgCAHAANJlhwDAZxL+CAHAANJkFADAZxMPCAAJAMAAprfAANJfBwAHgMAApsbAZxKTgcAApt3AZxKggsAApvXAZxKxKyqGwACnYsBnEu8qAAcGwADSa4JuwACn3sAAp/HAAKiqAQCDJQAAAAEDwACn/sAAqKoAAAAAAAAAYMAA0tYBPgNJwACoBCEWwACoCS6hHsAA0mg+AUrAAKgdASs/ScAAqDQcwACoRhbAAKg4LsAAbl/AANBywADSZkgBAAErAMAA0tw+AT0XwACoVy7AAG5fwADQch7AAKhnwADQgQEAARbAAKhvLsAAeEfAANBywADSZQDAANJmP0rAAKiSARbAAKiZLsAAbl/AANBywADSZgbAANJsgm7AAKivwACouMAAqOkBAMAAd5gAAAABA8AAqMjAAKjpAAAAAAAAAGDAAPoKAUrAAKjLASEcwACo4hbAAKjLLsAAeEfAANBywADSZUgBAAErAMAA/SkGwADSbYJuwACo7sAAqQHAAKlYAQCEWwAAAAEDwACpCsAAqVgAAAAAAAAAYMAA018BPgE9MMAAqRAfwACpGsAA+2IBAAEnwAB4SAAGwADSboJuwACpXcAAqXbAAKopAQCG1QAAAAEDwACpf8AAqikAAAAAAAAAXcAA/HQBYMAA0tYBPgJJwACphRzAAKmdFsAAqYkuwAB4RsAA0HLAANJkSAEAASsAwAD9KUrAAKmmAWrAAKmtXcAA/HQBYMAA0tbAAYVyP0rAAKnLAR/AAKnWwADAiQEBYMAA0tYBHMAAqhgWwACqBC7AAHhGwADQcsAA0mSAqwEBYMAA0tYBasAAqhxhAWDAAP0cYMAA0tbAAYXuAMAA/D0ABsAA0m+CbsAAqkLAAKpRwACq7gEAgpAAAAABA8AAqlbAAKruAAAAAAAAAGDAANMFAT4CScAAqlwcwACqZhbAAKpgLpImwADQcsAA0mdIAQABKwDAAP0pPgE9F8AAqncukibAANByHsAAqn/AANCDAQABHsAAqpbAANJzAwADFsAAqqwuwAB3msAA0HLAANGRFsAAqrguwABxsMAA0HLAANJjFsAAqsMuwAB3ucAA0HLAANJXAADAANJnP0rAAKreARbAAKrlLpImwADQcsAA0mcGwADScYJuwACq88AAqvrAAKswAAAjAAAAAQPAAKsCwACrMAAAAAAAAABgwAD9tgFKwACrCAEkwACrMAMnwAB4SR7AAKsfwADQeAEAARbAAKsiLsAAd5TAANGVACeDQgbAANJzgm7AAKs1wACrQcAAq58ABcAAeErAANByAWoAYMAAywbAAYjjAAABA8AAq1bAAKufAAAAAwMDwACrVwAAAMAAd5pbAMAAq2MAAADAAHGwWwDAAKtuAAAAmqtbAABgwAD+NAAAAGcTnwBnFGEAZxS8AGcVBwBnFdQAZxalAGcXBABnF2sAAAAHAsAA0neCbsAAq6TAAKuqwACw2wPAAHhMAAABYMAA0KcAAmDAANMFYMAA0sMBBMAA0nmCbsAArBDAAKwaCcAAd5QAYMAA/igAAQXAANKPgm7AAKwfwACsH8AArFgAgLXAANByAAPAAKwzwACsWAAAAAEBAcAArDsAAACAvWDAAP22AABgwADSdwE/AggAwADSeR7AAKxQwADQeQEAAYDAAKxTwGcYAwAJAcAArB/AANCpAAAAABEGwADSe4JuwACsXcAArGbAAKx4AQCGVwAAAAEDwACscMAArHgAAAAAAAAAYMAA+goBSsAArHMBKgbAANJ8gm7AAKx8wACshcAArJcBAId6AAAAAQPAAKyQwACslwAAAAAAAABgwAD6CgFKwACskwEpBsAA0n2CbsAArJzAAKyywACsvwEArfcAAAABA8AArLjAAKy/AAAAAAAAAGDAANLDAUrAAKy7ASsGwADSfoJuwACsxMAArNfAAKznAQCEWwAAAAEDwACs4MAArOcAAAAAAAAAYMAA018BSsAArOMBKwbAANJ/gm7AAKzrwACtBMAArSgBAIbVAAAAAQPAAK0NwACtKAAAAAAAAABdwAD8dAFgwADS1gFKwACtEAFqwACtEF3AAPx0AWDAANLWwAGFcgbAANKAgm7AAK0twACtNsAArWABAMAAd8EAAAABA8AArUfAAK1gAAAAAAAAAGDAAPoKAUrAAK1KARzAAK1VFsAArUouwAB3lMAA0nlIAQABasAArVhgwAD+KMABiPIAwAD+MwbAANKBgm7AAK1kwACtbcAAre0BAMAAd8AAAAABA8AArXvAAK3tAAAAAAAAAGDAAP40AT4CScAArYEcwACtkBbAAK2FLsAAd5TAANJ5SAEAAWrAAK2TYMAA/ijAAYjyAMAA/jNKwACtnQEtWz89MMAArbEfwACtu8AA+2IBAAEnwAB4TQAGwADSgoJuwACt8sAArg/AAK48AQCiWgAAAAEDwACuHcAArjwAAAAAAAAAXcAA/HQBYMAA0ykBSsAAriABasAAriBdwAD8dAFgwADTKcABheAGwADSg4JuwACuQMAArlXAAK56AQCFFwAAAAEDwACuY8AArnoAAAAAAAAAXcAA/HQBYMAA0wUBSsAArmYBasAArmZdwAD8dAFgwADTBcABhecGwADShIJuwACuf8AArojAAK6lAQDAAHfFAAAAAQPAAK6ewACupQAAAAAAAABgwAD6CgFKwACuoQEpBsAA0oWCbsAArqnAAK64wACu0wEA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wADU7wABBcAA1O6Cc8AA1MPAANTDwADU2gAAAAPAANTOwADU2gAAAAEBAcAA1NQAAAS2l2DAANTvAABgwADU0gE/AggBwADU1YAAwGg4PwkBwADUw8AA/TIAAAAAEwbAANTYgnPAANT7wADVA8AA1TIEAcAAeKfAANN2AWrAANTgYMAA+dHAAXC+AAABA8AA1RPAANUyAAAAAQEBwADVFAAAABJbAABgwADU0gFKwADVHQEfwADVIcAA1O4BAAEmwADVLQGAwADVLcBoOLBgwADU7wAGwADU2oJzwADVVMAA1VzAANWAAQDAAG4QAAAAAQPAANVqwADVgAAAAAAAAABgwAD70AFKwADVbQEWwADVcxbAANVtLraXwADTdsAA1NXAAG4QwADU8wbAANTbgnPAANWEwADVjMAA1aYBAIPBAAAAAQPAANWVwADVpgAAAAAAAABgwAD70AFKwADVmAEWwADVnhbAANWYLraXwADTdsAA1NWDwcAA/S8GwADU3YJzwADVqsAA1bjAANYJAwBIAAAAAQPAANW6wADWCQAAAAEBAcAA1cIAAACD1mDAAP0cAABgwAD6CgFKwADV0gEiJcAA1dmAwADV08BoOblgwADU0gAewADV7MAA9bECAAIWwADV9i62l8AA03bAANTVFsAA1gMUwADV/cBoObkAAWDAANTStpfAANN2wADU1QAGwADU3oJzwADWDsAA1hfAANcDAADAAG4SAAAAAQPAANYhwADXAwAAAAIAAsAA1icAAACobmDAAPvQAWrAANY3YMAA+9AJwADWPgAAAGFgwAD70AFqAGDAAPzZdwBgwADizwE+Az0jHMAA1lSBwADWTcBoOmxIAQABKwDAAPzzicAA1k3AaDpsHMAA1msWwADWXS7AAG4QwADU2oGNAQABgMAA1m3AaDpSAMAA/PYrAWDAAPvQPR7AANaAwADTigMAAxbAANaXFsAA1pEutpfAANN2wADU1cAAbhDAANTzgMAA1qbAaDpSgcAA1rXAaDpsAErAANbCAR7AANbNwADifgMAAxbAANbiLraXwADTdsAA1NWAwADW6cBoOlKBwADW+MBoOmwABsAA1N+Cc8AA1wjAANcRwADYOgAAwAB4qAAAAAEDwADXG8AA2DoAAAACAALAANchAAAAqG5gwAD70AFqwADXMWDAAPvQCcAA1zgAAABhYMAA+9ABagBgwAD82XcAYMAA4uoBPgM9IxzAANdOgcAA10fAaDuTSAEAASsAwAD884nAANdHwGg7kxzAANd3HMAA12YWwADXWC7AAG4QwADU2oGNAQABgMAA12jAaDt5AMAA/PaGgQEAAWrAANeDYMAA+9AVAMAA/PorAWDAAPvQPR7AANeYwADTigMAAxbAANeyLsAAbhDAANTagMAA18HAaDt5HMAA19eBwADX0MBoO5ODiAEAAWrAANfiYMAA+9AVAMAA/PcASsAA1/gBHsAA2APAAN58AwADFsAA2BkutpfAANN2wADU1YDAANggwGg7eYHAANgvwGg7kwAGwADU4IJzwADYP8AA2EnAANl+AACYJAAAAAEDwADYVMAA2X4AAAACAALAANhaAAAAqG5gwAD70AFqwADYamDAAPvQCcAA2HEAAABhYMAA+9ABagBgwAD82XcAYMAA4vMBPgM9IxzAANiHgcAA2IDAaDzdSAEAASsAwAD884nAANiAwGg83RzAANi4HMAA2KcWwADYmS7AAG4QwADU2oGNAQABgMAA2KnAaDzDAMAA/PaGgQEAAWrAANjFYMAA+9AVAMAA/PorAWDAAPvQPR7AANjawADTigMAAxbAANj0LsAAbhDAANTagMAA2QPAaDzDHMAA2RmBwADZEsBoPN2DiAEAAWrAANklYMAA+9AVAMAA/PcASsAA2TsBHsAA2UbAAN7LAwADFsAA2V0utpfAANN2wADU1YDAANlkwGg8w4HAANlzwGg83QAGwADU4YJzwADZg8AA2ZTAANrkAADAAHipAAAAAQPAANmmwADa5AAAAAIAAsAA2awAAACobmDAAPvQAWrAANm8YMAA+9AJwADZwwAAAGFgwAD70AFqAGDAAPzZdwBgwADi/QE+Az0jHMAA2dmBwADZ0sBoPilIAQABKwDAAPzzicAA2dLAaD4pHMAA2gIcwADZ8RbAANnjLsAAbhDAANTagY0BAAGAwADZ88BoPg8AwAD89oaBAQABasAA2h5gwAD70BUAwAD8+isBYMAA+9A9HsAA2jPAANOKAwADFsAA2kQuwABuEMAA1NqAwADaU8BoPg8cwADacYHAANpqwGg+KYOIAQABasAA2oRgwAD70BUAwAD89wBKwADamgEewADapcAA3xoDAAMWwADawy62l8AA03bAANTV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AO1WwADU7gEAAS4ABsAA1PWCc8AA7aHAAO37wADuGwEEYQNqwADtomDAAPnRwAF1J2rAAO3WYMAA+dHAALXFagBgwADLBsABidcAAAEDwADuAsAA7hsAAAAAAAAAYMAA+9AABsAA1PiCc8AA7kDAAO54wADurgAEwAB4t8AA03YCasAA7kFgwAD50cABdSdqAGDAAMsGwAGJ6wAAAQPAAO6AwADurgAAAAEBAcAA7oUAAACobmDAAPvQAABgwAD70AAGwADU+YJzwADussAA7rfAAO74AATAAHi5wADTdgFqAGDAAMsGwAGJ/wAAAQPAAO6/wADu+AAAAAICAsAA7sQAAACobmDAAPvQAMAA7tcAAACAlmDAAPvQAABcAAbAANT6gnPAAO79wADvNcAA720ABMAAeLvAANN2AmrAAO7+YMAA+dHAAXUnagBgwADLBsABihMAAAEDwADvPsAA720AAAABAQHAAO9DAAAAqG5gwAD70AAAYMAA+9AABsAA1PuCc8AA73HAAO92wADvuQAEwAB4vcAA03YBagBgwADLBsABiicAAAEDwADvf8AA77kAAAACAgLAAO+EAAAAqG5gwAD70ADAAO+XAAAAgJZgwAD70AAAXAAGwADU/IJzwADvvsAA7/bAAPAuAATAAHi/wADTdgJqwADvv2DAAPnRwAF1J2oAYMAAywbAAYo7AAABA8AA7//AAPAuAAAAAQEBwADwBAAAAKhuYMAA+9AAAGDAAPvQAAbAANT9gnPAAPAywADwN8AA8HoABMAAeMHAANN2AWoAYMAAywbAAYpPAAABA8AA8EDAAPB6AAAAAgICwADwRQAAAKhuYMAA+9AAwADwWAAAAICWYMAA+9AAAFwABsAA1P6Cc8AA8H/AAPC3wADw8QAEwAB4w8AA03YCasAA8IBgwAD50cABdSdqAGDAAMsGwAGKYwAAAQPAAPDBwADw8QAAAAEBAcAA8MYAAACobmDAAPvQAABgwAD70AAGwADU/4JzwADw9cAA8PrAAPE/AATAAHjFwADTdgFqAGDAAMsGwAGKdwAAAQPAAPEEwADxPwAAAAICAsAA8QkAAACobmDAAPvQAMAA8RwAAACAlmDAAPvQAABcAAbAANUAgnPAAPFEwADxSMAA8YAABMAAeMfAANN2AWoAYMAAywbAAYqLAAABA8AA8VHAAPGA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ncABKjgAAAABAQHAASmiAAAAJ2DAAPvQAABgwAD70AE+AknAASmvIhzAASm5gMABKbPAaewPYwEAAZMAwAD8/QEcwAEpxoDAASnAwGnsD4FtAQABFsABKckuYcAA1PUAwAD9AD4BPTDAASnZH8ABKePAAPsmAwADgMABKfTAaewPLicnAD9KwAEqFQEcwAEqHC7AAHkTwADTdgEAAYDAASouwGnsDwDAANflBsAA1+KCc8ABKj3AASpLwAEq9AMAgL8AAAABA8ABKk7AASr0AAAAAgICwAEqUwAAACdgwAD70ADAASpeAAAggJZgwAD70AAAXAE+AknAASprIhzAASp1gMABKm/AaezZYwEAAZMAwAD8/QEcwAEqgoDAASp8wGns2YFtAQABFsABKoUuYcAA1PUAwAD9AD4BPTDAASqVH8ABKp/AAPsmAwADgMABKrDAaezZLicnAD89HMABKtEuwAB5FMAA03YCAAKAwAEq48Bp7NmBwAEq6sBp7OcAwADX5gbAANfpgnPAASsuwAErNsABK3QBAMAAbmsAAAABA8ABK0nAASt0AAAAAAAAAGDAAPvQAT4BSsABK08BasABK2FgwAD70IM+BsAA1+SCc8ABK5jAASujwAEr4gAAwAB4nMAA03YAAAABA8ABK67AASviAAAAAQEBwAErswAAAGFgwAD70AAAYMAA4zMBPgFKwAErwQEewAErzMAA4zcBAAGAwAEr18Bp7f8ABsAA1+WCc8ABK+fAASvrwAEsRwAAwAB5E8AA03YAAAABA8ABK/zAASxHAAAAAQEBwAEsAQAAACdgwAD70AAAYMAA+9ABPgFKwAEsDgEcwAEsFS7AAHjTwADTdgEAARzAASwmgMABLCDAae5ig4gBAAFqwAEsM2DAAPvQgz4AwAD89wDAANUGBsAA1+aCc8ABLEzAASxRwAEsuAAAwAB5FMAA03YAAAABA8ABLGLAASy4AAAAAgICwAEsZwAAACdgwAD70ADAASxyAAAAgJZgwAD70AAAXAE+AT0cwAEsfy7AAHjVwADTdgIAAhzAASyQgMABLIrAae7pg4gBAAFqwAEsnWDAAPvQgz4AwAD894HAASyuwGnu9wDAANUHBsAA1+eCc8ABKKLAASiiAAAQn7wAwADTmcAA05kBAwAAAAAAAwMDAAAAAGpgwAD70AAAAAAAgoxg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ScAARGQcwABEbIDAAERowGo0+iABAAGEwABEbcBqNa4AAErAAER3AYTAAER+wGo1rj9JwABEkSEcwABEnIHAAESVwGo1EUgBAAErAMAA/SlKwABEpQEcwABEsoHAAESswGo1ESAAAAAAAD89MMAARLoewABE1cAAzfIAAAAABsAA2FeCc8AAROnAAETwwABGIwAAljkAAAABA8AARPnAAEYjAAAAAgEBwABE/wAAAJb5YQFgwAD6gmDAAPoKAAHAAEUdAAAgljVhAGDAAPqCAWoAYMAA/Nl3YMAA+oIBPgROwABFMsAARTYAAJdmYMAA+9ABFsAART0uYcAA/KNFwABFSQHAAEVSwABFVAAAYmDAAPvQARzAAEVagsAARVbAaja5gY0BAAGUAMAA/PYBHMAARWGDwABFX8BqNtyBbQEAAZMAwAD9AAGLwABFacBqNtwcwABFZ4PAAEVpwGo23IGNAQABlADAAPz2PgJOwABFeMAARYAAAJYgYMAA+oIBHMAARYYuSwEAAYPAAEWHwGo23ADAAPyDScAARZEcwABFmYDAAEWVwGo2gCABAAGEwABFmsBqN0YAAD4BSsAARa4BhMAARbXAajdGP0nAAEXQIRzAAEXbgcAARdTAajaXSAEAASsAwAD9KUrAAEXkARzAAEXxgcAARevAajaXIAAAAAAAPz0wwABF+R7AAEYUwADN8gAAAAAGwADYWIJzwABGKMAARi/AAEgzAACWPAAAAAEDwABGOsAASDMAAAACAQHAAEZAAAAAlvlhAWDAAPqCYMAA+goAAcAARl4AACCWNWEAYMAA+oIBagBgwAD82XdgwAD6ggE+B07AAEZzwABGegAAgXZbAStOwABGi8AARpkAAMAAcWFgwAD6CgEqTsAARqrAAEauAACXZmDAAPvQARbAAEa1LmHAAPyjRcAARsEBwABGysAARswAAGJgwAD70AGTARzAAEbThcAARtHAajicYwEAAYTAAEbVwGo4eQDAAPz9AY3AAEbcwGo4nBzAAEbahcAARtzAajicZAEAAZQAwAD89T4CTsAARuvAAEbzAACWIGDAAPqCARzAAEb5LksBAAGFwABG+sBqOJwAwAD8g0nAAEcEHMAARwyAwABHCMBqOBogAQABhsAARw3Aajj0AAA+A0nAAEchg8AARyXAajhjPgE9MMAAR0AewABHW8AAzfMAAAAAPz2KwABHeMBqOFOGwABHgcBqOPQ9i8AAR5LAajhjKT9JwABHuoPAAEe+wGo4Y0rAAEfNASbAAEfNAYLAAEfUwGo4U2DAAPqCP0nAAEfgIRzAAEfrgcAAR+TAajgxSAEAASsAwAD9KUrAAEf0ARzAAEgBgcAAR/vAajgxIAAAAAAAPz0wwABICR7AAEgkwADN8gAAAAAGwADYWYJzwABIOMAASD/AAEhwAACWMwAAAAEDwABISMAASHAAAAABAQHAAEhNAAAAJ2DAAPvQAABgwAD6ggE+AUrAAEhaARzAAEhlLksBAAGAwABIZsBqOiQAwAD8gwbAANhagnPAAEh1wABIesAASNUAAFYAAAABA8AASH3AAEjVAAAAAQEBwABIhQAAIICWYMAA+oIAAFwBPgE9MMAASJIfwABInMAA+2IBAAEnwAB19QAGwADYW4JzwABI2sAASN/AAElHAACApQAAAAEDwABI5cAASUcAAAABAQHAAEj3AAAggJZdwAD8MgFgwAD6ggAAXAE+AT0wwABJBB/AAEkOwAD7YgEAASfAAHX1AAbAANhcgnPAAElMwABJUcAASb8AAJ7KAAAAAQPAAElXwABJvwAAAAICAsAASVwAAAAnYMAA+9AAwABJagAAIICWYMAA+oIAAFwBPgE9MMAASXcfwABJgcAA+2IBAAEnwAB4mQAGwADYXYJzwABJxMAAScnAAEpFAACfxAAAAAEDwABJ0sAASkUAAAACAgLAAEnXAAAAJ2DAAPvQAMAASe8AACApXcAA/DIBYMAA+oIAAFwBPgE9MMAASf0fwABKB8AA+2IBAAEnwAB4mQAGwADYXoJzwABKSsAASk/AAEqvAACArgAAAAEDwABKU8AASq8AAAABAAHAAEpZAAAAmxlhAmDAAPqCYMAA+oJgwAD70AFqAGDAAPzZdwBcAT4BPR7AAEqCwADOiAIBYMAA+oICLjUAAAABAGECYMAA+oJgwAD6gmDAAPvQAYDAAEqNwGo8ASMcwABKlYEAwGo8PUgBAAErAABqwABKo2ECXcAA+hYBW13AAPoWAVtgwAD70MABdh2BAMBqPD0BYQJgwAD6gmDAAPqCYMAA+9AABsAA2F+Cc8AASrTAAEq4wABLtgAAgLsAAAABA8AASr/AAEu2AAAAAgECwABKxwAAIJYgYMAA+oIAwABK1QAAAGpgwAD70AFqwABK3WDAAPvQCQBgwAD70AE+A0nAAErnHMAASvGBwABK68BqPOCBbQEAARbAAEr5LmHAAPyjAMAA/QA+AUrAAEsJARzAAEsQlIHEAAAAAMAA+/NJwABLHxzAAEspgcAASyPAajzgYwEAAZMAwAD8/T4BPYnAAEs2wGo84JM/RcAAS0sBwABLVMAAS1YAAGJgwAD70AGBwABLWMBqPOABHMAAS2GCwABLX8BqPXNjAQABFsAAS2guYcAA/KMAwAD8/QGKwABLcMBqPXMcwABLcYLAAEtwwGo9c2QBAAGUAMAA/PU+AUnAAEt9HMAAS4kcwABLhS5LAQABgsAAS4bAaj1zAMAA/INIAQABgMAAS4zAajzRAMAA/PNKwABLlQGCwABLnMBqPXM/SsAAS6kBHMAAS7CUgcQAAAAAwAD78wbAANhggnPAAEu7wABLv8AATNoAAJZaAAAAAQPAAEvKwABM2gAAAAIBAsAAS9IAACCWIGDAAPqCAMAAS+AAAABqYMAA+9ABasAAS+hgwAD82XcAYMAA+9ABPgNJwABL9SIcwABL/4HAAEv5wGo+Z0gBAAErAMAA/PMBHMAATBCBwABMCsBqPmeBbQEAARbAAEwYLmHAAPyjAMAA/QA+AT2JwABMKMBqPmccwABMPBbAAEw1LmHAAPyjgY0BAAGUAMAA/PZJwABMTBzAAExWgcAATFDAaj5nYwEAAZMAwAD8/T4BSsAATGMBHMAATGqUgcQAAAAAwAD78z9FwABMeAHAAEyBwABMgwAAYmDAAPvQAYHAAEyFwGo+ZwEcwABMjoLAAEyMwGo/LoFtAQABkwDAAP0AAYrAAEyUwGo/LhzAAEyVgsAATJTAaj8ugY0BAAGUAMAA/PY+AUnAAEyhHMAATK0cwABMqS5LAQABgsAATKrAaj8uAMAA/INIAQABgMAATLDAaj5YAMAA/PNKwABMuQGCwABMwMBqPy4/SsAATM0BHMAATNSUgcQAAAAAwAD78wbAANhhgnPAAEzfwABM5sAATUEAAIYRAAAAAQPAAEzwwABNQQAAAAAAAABgwAD6ggE+AT0wwABM+R/AAE0DwAD7YgEAASfAAHX2AAbAANhignPAAE1GwABNTcAATa8AAJ/DAAAAAQPAAE1VwABNrwAAAAEBAcAATVoAAAAnYMAA+9AAAGDAAPqCAT4BPTDAAE1nH8AATXHAAPtiAQABJ8AAdfYABsAA2GOCc8AATbTAAE25wABOLgAAlvgAAAABA8AATcTAAE4uAAAAAQEBwABNygAAAJb5YQFgwAD6gmDAAPoKAABcAT4BPTDAAE3mH8AATfDAAPtiAQABJ8AAdfYABsAA2GSCc8AATjPAAE44wABOrQAAlvsAAAABA8AATkPAAE6tAAAAAQEBwABOSQAAAJb5YQFgwAD6gmDAAPoKAABcAT4BPTDAAE5lH8AATm/AAPtiAQABJ8AAdfYABsAA2G+Cc8AATrLAAE69wABPFwEAgxkAAAABA8AATsPAAE8XAAAAAAAAAGDAAPqCAT4CScAATskcwABO1BbAAE7NLmHAAPyjgJcBAAGTAMAA/P9KwABO2QEcwABO5C5LAQABkwDAAPyDPz0wwABO7R7AAE8IwADN8gAAAAAGwADYcIJzwABPHMAATyfAAE+JAQCB6AAAAAEDwABPLMAAT4kAAAAAAAAAYMAA+oIBPgJJwABPMhzAAE89FsAATzYuYcAA/KOAlwEAAZMAwAD8/0rAAE9CARzAAE9NLksBAAEcwABPVRbAAE9OLmHAAPyjgY0BAAGUAMAA/PYAwAD8gz89MMAAT18ewABPesAAzfIAAAAABsAA2HGCc8AAT47AAE+ZwABQMAEAgMMAAAABA8AAT6DAAFAwAAAAAAAAAGDAAPqCAT4DScAAT6YcwABPsRbAAE+qLmHAAPyjSAEAAZQAwAD880rAAE+3ARzAAE/CLksBAAGTAMAA/IM/ScAAT8scwABP1hbAAE/PLmHAAPyjSAEAAZMAwAD88z0wwABP3B7AAE/3wADN8gAAAAA/PTDAAFAIHsAAUCPAAM3zAAAAAAbAANhlgnPAAFA1wABQOsAAULgAAJ/GAAAAAQPAAFBAwABQuAAAAAICAsAAUEUAAAAnYMAA+9AAwABQXQAAIIPMXcAA/DIBYMAA+oIAAFwBPgJOwABQc8AAUHcAAYKMYMAA+9ABHMAAUIkWwABQgoHAAFB5wGpDOmHAAPxVZAEAAYDAAFCLwGpDLADAAPz1PRzAAFCWLoNeAwADgMAAUJ/AakMsgsAAUKbAakNVgcAAUKvAakM6AMAA/JkGwADYZoJzwABQvcAAUMLAAFF6AACbqQAAAAEDwABQy8AAUXoAAAADAgPAAFDQAAAAamDAAPvQAMAAUNsAAACCjGDAAPvQAMAAUOgAACDAAEL0YMAA+oIBagBgwAD82XcAXAE+Aj0ewABRBcAA+xEDAAOAwABRFcBqQ+eBwABRHMBqQ/UWwABRJi5hwAD8owBFwABRMwHAAFE8wABRPgAAYmDAAPvQAYDAAFFAwGpD5wEcwABRSYPAAFFHwGpEU2MBAAGBwABRS8BqQ/UAwAD8/QGLwABRUsBqRFMcwABRUIPAAFFSwGpEU2QBAAGUAMAA/PU+AT0cwABRYS6AvwIAAoPAAFFiwGpEU4LAAFFnwGpEBADAAPyEAABqInUAaiLlAGojDgBqIzUAaiNcAGojpQBqJAEAaiRPAGokwwBqJU0AaiZYAGonkQBqKKMAailxAGoqvABqKxkAaitwAGorzQBqLCQAaiyBAGoswwBqLQoAai2gAGot4QBqLkQAai6IAGovRQBqMKYAajHPAGoySABqMscAajPMAGo00ABqNlYAajfwAGo5+gBqOlkAajquAGo7CgBqO24AajvXAGo8pwBqPi4Aaj/hAGpALABqQIUAakDiAGpBPwBqQbwAakJTAGpDAgBqQ70AakTVAAAANALAANh1gnPAATPQwAEz8MABOGA3wAB5GwAAAWDAANg7AAFdwADUFQFgwADjRQABBcAA2H0AAAAABAAAAwAAAAAAAAAAAGDAANh1AT8BCQAAwADYaAAAAAAEBsAA2HeCc8ABM/DAATPwAAAQn7wAwADTmcAA05kBAwAAAAAAAwMDAAAAAGpgwAD70AAAAAAAgoxgwAD70AAAAAAgg8xdwAD8MgFbAABcAUoAAR0An7wDAAOAAMBqRi6BAMBqRjmCAMBqRkUAwADTmQbAANh5gnPAAFHxwABR/cAAUhQAAsAAeJzAANN2AAAAAQPAAFIIwABSFAAAAAEBAcAAUg0AAABhYMAA+9AAAGDAAONFAAbAANh6gnPAAFIZwABSHsAAWvgAAINeAAAAAQPAAFImwABa+AAAAAQDBMAAUisAAABqYMAA+9AAwABSNgAAAIKMYMAA+9AAwABSTAAAIJYoXcAA/DIBYMAA+oIAwABSXQAAAJ+5YMAA+9ABasAAUmlgwAD70AkAXAE+C0nAAFKIIiIcwABSjpOAlwEAAYDAAFKQwGpG5gDAAPz/ARzAAFKfgMAAUpnAakbmgJcBAAGBwABSocBqRvQAwAD8/wEcwABSrIHAAFKowGpG9ICXAQABFsAAUq4uYcAA/KMAwAD8/z4CPR7AAFLJwAD7EQMAA4DAAFLZwGpG5oHAAFLgwGpG9BbAAFLlLmHAAPyjAEAqwABTDcAAUxIAP0nAAFMfHMAAUy2DwABTI8BqRxhjAQABkwDAAPz9PgE9MMAAUzofwABTS8AA+xoEAASDwABTUcBqRxiTKyefuQA/TsAAU4TAAFOKAAGA7mDAAPvQARzAAFOQgcAAU4zAakb0gY0BAAGAwABTksBqRuYAwAD89knAAFOdHMAAU7scwABTrhbAAFOngsAAU6LAakcDYcAA/FWBjQEAAYPAAFOwwGpHGADAAPz2YwEAAYTAAFO9wGpIGADAAPz9PgE9MMAAU8wewABT58AAzfQAAAAAP0nAAFP8HMAAVAaEwABUAMBqSBhIAQABkwDAAPzzSsAAVAwAP0nAAFQZJcAAVCKCwABUHcBqRwNgwADTjD4CTsAAVKzAAFS8AAHAAHidYMAA04wBJsAAVMMAgsAAVL7AakcDYMAA04xJwABU3BzAAFT4FsAAVOUuwABua8AA0+BIAQABFsAAVQuFwABU+8BqSOfAAG5rwADTjwDAAPzzPgFJwABVKSIcwABVNITAAFUuwGpIGGMBAAE3CgDAAPz9ACEcwABVVRbAAFVOhcAAVT7AakjngovAANORSAEAARbAAFVdLoKLwADT4gDAANTdPgI9HsAAVXjAAMroBQAFJsAAVYIAgsAAVX3AakcDXcAA/HQBYMAA+oKDwABVk8BqRxgugMAAVaTAakbmhMAAVavAakgYAErAAFW9AEnAAFXUHMAAVeoWwABV5BbAAFXdLoKLwADT4raXwADTdsAA1NXAAG5qwADTdgYABhzAAFYcHMAAVgeAwABWAcBqRuaDiAEAARbAAFYJLsAAbmvAANPgAMAA/PdkAQABFsAAViMuqG7AANPhAMAA/PUcwABWRITAAFY+wGpIGIOIAQABFsAAVkYuwABua8AA0+AAwAD89xbAAFZ9FsAAVnaFwABWZsBqSOeCi8AA05G2l8AA03bAANTVHMAAVq8cwABWmoPAAFaQwGpHGIOIAQABFsAAVpwuwABua8AA0+AAwAD892QBAAEWwABWwYXAAFaxwGpI56huwADTkADAAPz1HsAAVuTAAMr1AQABLgAewABXBcAAyvUBAAGCwABXC8BqRwMAAMAA05w+AUrAAFcfAD9JwABXPhzAAFdZFsAAV1KFwABXQsBqSOeCi8AA05FIAQABFsAAV2EugovAANPiAMAA1N0+BU7AAFg3wABYQgABwAB4nl3AAPx0AWDAAPqCASbAAFhJAILAAFhEwGpHA13AAPx0AWDAAPqCTsAAWGjAAFhzAAHAAHifYMAA40UBHMAAWHUuwAB4nMAA03YBAAGEwABYgcBqSBgAwADUGEXAAFiRAcAAWJrAAFicAABiYMAA+9ABkwEcwABYoxTAAFihwGpLuggAYwEAAYTAAFilwGpIGADAAPz9ARXAAFiswGpLuggcwABYrRTAAFiswGpLuggAZAEAAZQAwAD89T4BPRzAAFjHh8AAWL3AakuBgL8CAAIUwABYyMBqS7oIABzAAFjXhsAAWM3AaktMSwEAARzAAFjig8AAWNjAakcYZAEAARTAAFjkwGpLuggAAMAA/PUAwAD8gwDAAPyERcAAWPoBwABZA8AAWQUAAGJgwAD70AGAwABZB8BqRuYBHMAAWRAUwABZDsBqTHkIAGMBAAGBwABZEsBqRvQAwAD8/QEVwABZF8BqTHkIHMAAWRgUwABZF8BqTHkIAGQBAAGUAMAA/PU+AT0cwABZLC6AvwIAAhTAAFktwGpMeQgAHMAAWTyHwABZMsBqS4FLAQABHMAAWT8UwABZPcBqTHkIAIGNAQABgMAAWUHAakbmAMAA/PYAwAD8gwDAAPyESsAAWVsAPz9OwABZewAAAJ+6XcAA/HQBWwBOwABZjgAAAJ+7YMAA+9AAScAAWZ4lwABZp4LAAFmiwGpHA13AAPx0AWDAAPqCPgI9jcAAWcDAak08FMAAWczAakcDAgFdwAD8dAFgwAD6gj2OwABZ2MBqTU6DwABZ5cBqRxg+Aj2NwABaA8BqTTwcwABaJBzAAFoUgsAAWg/AakcDlikBAAGDwABaGcBqRxgAwAD8TICtAQAAAYVYKsAA/Eg9jsAAWkPAak1Ok0nAAFpdHMAAWnQcwABabIbAAFphwGpNTmQBAAGEwABabsBqSBgAwAD89YCXAQABFsAAWoCFwABadsBqTTxhwAD8owDAAPz/PgE9MMAAWpAewABaq8AAzfQAAAAAPz0ewABaxcAAyugFAAWFwABaysBqTTyGwABa1cBqTU4ugMAAWufAakbmhMAAWu7AakgYAAbAANh7gnPAAFr9wABbCcAAW/YAAIFYAAAAAQPAAFsQwABb9gAAAAIBAsAAWxUAAABqYMAA+9AAwABbIQAAAIKMYMAA+9ABagBgwAD82XcAYMAA40UBPgU9icAAWy3Aak7CHsAAWz7AAPsRAwADgMAAW07Aak60gcAAW1XAak7CFsAAW18uYcAA/KMATsAAW3DAAFt3AABhYMAA+9ABHMAAW32BwABbecBqTsKBjQEAAYDAAFt/wGpOtADAAPz2TsAAW5bAAFudAACBdmDAAONFARzAAFufLsAAeJzAANN2AQABgsAAW6vAak8XAMAA1Bg9HMAAW7+DwABbuMBqT0qDXgQABJOCwABby8BqTxcugMAAW9nAak60AMAA/JlKwABb5QGDwABb7MBqT0oAAGpGBwBqRncAaka8AGpOigBqT7cAAAAEAsAA2H6Cc8ABM9DAATPwwAE4YAPAAHkcAWrAATPRYMAA+dHAAXC+AAFgwADYdQABYMAA40UAAAgGwADYgYJzwAE0bcABNHXAATSxBAHAAHZ7wADTdgAAAAEDwAE0kcABNLEAAAAAAAAAYMAA2H4BPgE9MMABNJonwABhJAbAANiDgnPAATTmwAE1LcABNcsDAEsBasABNOdgwAD50cABhCAAAAEDwAE1L8ABNcsAAAABAQHAATU0AAAAJ2DAAPvQAABgwAD6ggE+AknAATVBIhzAATVLgMABNUXAalCDYwEAAZMAwAD8/QEcwAE1WIDAATVSwGpQg4FtAQABFsABNVsuYcAA1PUAwAD9AD4BPTDAATVrH8ABNXXAAPsmAwADgMABNYbAalCDLicnAD9KwAE1pwEcwAE1ri7AAHkdwADTdgEAAYDAATXBwGpQgwDAANiHBsAA2ISCc8ABNdDAATXewAE2iwMAgL8AAAABA8ABNeHAATaLAAAAAgICwAE15gAAACdgwAD70ADAATX0AAAggJZgwAD6ggAAXAE+AknAATYBIhzAATYLgMABNgXAalFNYwEAAZMAwAD8/QEcwAE2GIDAATYSwGpRTYFtAQABFsABNhsuYcAA1PUAwAD9AD4BPTDAATYrH8ABNjXAAPsmAwADgMABNkbAalFNLicnAD89HMABNmcuwAB5HsAA03YCAAKAwAE2esBqUU2BwAE2gcBqUVsAwADYiAbAANiLgnPAATbFwAE2zcABNwwBAMAAbmsAAAABA8ABNuDAATcMAAAAAAAAAGDAAPvQAT4BSsABNuYBasABNvlgwAD70IM+BsAA2IaCc8ABNzDAATc8wAE3fAAAwAB4nMAA03YAAAABA8ABN0fAATd8AAAAAQEBwAE3TAAAAGFgwAD70AAAYMAA40UBPgFKwAE3WgEewAE3ZcAA40kBAAGAwAE3ccBqUnMABsAA2IeCc8ABN4HAATeIwAE35wAAwAB5HcAA03YAAAABA8ABN5rAATfnAAAAAQEBwAE3nwAAACdgwAD70AAAYMAA+oIBPgFKwAE3rAEcwAE3sy7AAHjbwADTdgEAARzAATfFgMABN7/AalLWg4gBAAFqwAE302DAAPvQgz4AwAD89wDAANUKBsAA2IiCc8ABN+zAATfxwAE4XgAAwAB5HsAA03YAAAABA8ABOAPAATheAAAAAgICwAE4CAAAACdgwAD70ADAATgWAAAAgJZgwAD6ggAAXAE+AT0cwAE4Iy7AAHjdwADTdgIAAhzAATg1gMABOC/AalNdg4gBAAFqwAE4Q2DAAPvQgz4AwAD894HAAThUwGpTawDAANULBsAA2ImCc8ABM/DAATPwAAAQn7wAwADTmcAA05kBAwAAAAAAAwMDAAAAAGpgwAD70AAAAAAAgoxgwAD70AAAAAAgg8xdwAD8MgFbAABcAUoAAR0An7wDAAOAAMBqU+qBAMBqU/WCAMBqVAEAwADTmQAAalAIAGpQTABqUSMAalH8AGpSQwBqUqYAalMtAGpTwwBqVDMAAAAIAsAA2IyCc8ABObLAATnSwAE+EDfAAHkfAAABYMAA1O8AAWDAANQbAAEFwADYvQAAAAAEAAADAAAAAAAAAAAAYMAA2IwBPwEJAADAANUUAAAAADcGwADYjoJzwAE50sABOdIAABCfvADAANOZwADTmQEDAAAAAAADAwMAAAAAamDAAPvQAAAAAACCjGDAAPvQAAAAACCDzF3AAPwyAVsAAFwBSgABHQCfvAMAA4AAwGpU1oEAwGpU4YIAwGpU7QDAANOZBsAA2L+Cc8AAXD3AAFxFwABcVwECwABuawAAAAEDwABcV8AAXFcAAAAAAAAAYMAA+9AABsAA2MCCc8AAXFvAAFxjwABccAECqG4AAAABA8AAXHDAAFxwAAAAAAAAAGDAAPvQAAbAANjBgnPAAFx0wABchMAAXIoBAoKLAAAAAQPAAFyKwABcigAAAAAAAABgwADU0gAGwADYkIJzwABcj8AAXJ3AAFy0AALAAHicwADTdgAAAAEDwABcqMAAXLQAAAABAQHAAFytAAAAYWDAAPvQAABgwADjTgAGwADYkYJzwABcucAAXMXAAFz1AACWQAAAAAEDwABc0cAAXPUAAAEAAIJ2YMAA/RwBWwAAAABdwAD8MgFfAAABSsAAXNcBH8AAXNvAAM3lAQFfAAABLgAGwADYkoJzwABc+sAAXQ7AAF16AACWNwAAAAEDwABdGMAAXXoAAAABAQHAAF0tAAAgg9ZdwAD8MgFgwADjbAAAXcAA/DIBYMAA42wBSsAAXT0BHsAAXUHAAM29AgFgwADjbAIugMAAXXTAalZ6AAbAANiTgnPAAF1/wABdh8AAXbUAAJYyAAAAAQPAAF2OwABdtQAAAQAAlvNgwAD9HAFbAAAAAF3AAPx0AV8AAAFKwABdlAEewABdmcAA/H8BAmDAAONsXwAAAS4ABsAA2MiCc8AAXbnAAF3CwABeMQIAgxkAAAABA8AAXcfAAF4xAAAAAQEBwABd0gAAIICWYMAA42wAAFwBPgJJwABd3xzAAF3vFsAAXeguYcAA/KNIAQABkwDAAPzzPTDAAF31H8AAXf/AAPsmAgACky4APz0cwABeIi6AvwIAApOAwABeKMBqV0QAwAD8hAbAANjJgnPAAF42wABeP8AAXrsCAIHoAAAAAQPAAF5DwABeuwAAAAEBAcAAXk4AACCAlmDAAONsAABcAT4CScAAXlscwABeaxbAAF5kLmHAAPyjSAEAAZMAwAD88z0wwABecR/AAF57wAD7JgIAApMuAD89HMAAXp4ugL8CAAIcwABeqxbAAF6kLmHAAPyjgY0BAAGUAMAA/PaAwABessBqV9IAwAD8hAbAANiUgnPAAF7AwABexMAAX4MAAJ/BAAAAAQPAAF7OwABfgwAAAAIBAsAAXtQAAACW+WEBYMAA42xgwAD6CgDAAF7yAAAAamDAAPvQAWrAAF76YMAA+9AJAGDAAPvQAT4DScAAXwQcwABfDoHAAF8IwGpYkGMBAAGTAMAA/P09icAAXxPAaliQkz9FwABfIgHAAF8rwABfLQAAYmDAAPvQAYHAAF8vwGpYkAEcwABfOILAAF82wGpY4WMBAAEWwABfOi5hwAD8owDAAPz9AYrAAF9CwGpY4RzAAF9DgsAAX0LAaljhZAEAAZQAwAD89T4BScAAX08cwABfV4DAAF9TwGpYeiABAAEcwABfXC5LAQABgsAAX13AaljhAMAA/IMAAErAAF9iAYLAAF9pwGpY4T9KwABfdgEcwABffZSBxAAAAADAAPvzBsAA2JWCc8AAX4jAAF+MwABgcQAAn8IAAAABA8AAX5rAAGBxAAAAAgECwABfoAAAAJb5YQFgwADjbGDAAPoKAMAAX74AAABqYMAA+9ABagBgwAD82XcAYMAA+9ABPgNJwABfzCIcwABf1oHAAF/QwGpZ2UgBAAErAMAA/PMBHMAAX+eBwABf4cBqWdmBbQEAARbAAF/vLmHAAPyjAMAA/QA9icAAX/fAalnZHMAAYAsWwABgBC5hwAD8o4GNAQABlADAAPz2P0XAAGAUAcAAYB3AAGAfAABiYMAA+9ABgcAAYCHAalnZARzAAGAqgsAAYCjAalpmgW0BAAGTAMAA/QABisAAYDDAalpmHMAAYDGCwABgMMBqWmaBjQEAAZQAwAD89j4BScAAYD0cwABgRYDAAGBBwGpZwyABAAEcwABgSi5LAQABgsAAYEvAalpmAMAA/IMAAErAAGBQAYLAAGBXwGpaZj9KwABgZAEcwABga5SBxAAAAADAAPvzBsAA2JaCc8AAYHbAAGCPwABhbgMAZAAAAAEDwABgkMAAYW4AAAABAQHAAGChAAAgg9ZdwAD8dAFgwADjbAAAXcAA/HQBYMAA42wBPgJOwABgssAAYL4AAINYYMAA+9ABHMAAYMwWwABgxS5hwAD8o2QBAAEWwABg1IDAAGDOwGpbP2HAAPyjAMAA/PVKwABg4AE1wABg8gAAAQBdwAD8dAFgwADjbAExwABg8mDAAONsADUAAAABAFsBF8AAYP2CwABg+8BqW6lhgcAAYQbAaltkwAD8oTUAAAABAFsBHMAAYRqCwABhGMBqW6mDXgMAA5MWwABhKy5hwAD8oy4AwAD8mTUAAAABAFsBHMAAYUGCwABhP8BqW6mDXgMAAxbAAGFPLmHAAPyjgcAAYVfAaltkgMAAYWTAals/AMAA/JmCAMBqW6kGwADYl4JzwABhc8AAYXjAAGIXAACDFwAAAAEDwABhgMAAYhcAAAABAQHAAGGIAAAAliBgwAD9HAAAYMAA+goBPgNOwABhm8AAYZ8AAJdmYMAA+9ABFsAAYaYuYcAA/KNFwABhsgHAAGG7wABhvQAAYmDAAPvQAZMBHMAAYcSCwABhwsBqXMJjAQABgcAAYcbAalyfAMAA/P0BisAAYc3AalzCHMAAYcuCwABhzcBqXMJkAQABlADAAPz1PgFJwABh2BzAAGHkHMAAYeAuSwEAAYLAAGHhwGpcwgDAAPyDSAEAAYDAAGHnwGpchgDAAP0pSsAAYfABKT9KwABiBwEqBsAA2JiCc8AAYhzAAGIhwABjCgAAn7AAAAABA8AAYijAAGMKAAAAAQABwABiMQAAAJ+xYMAA0DgBagBgwAD82XcAXAE+Az0jHMAAYkeAwABiQMBqXYZIAQABKwDAAP0piMAAYkDAal2GHsAAYk/AANA6AAAAACsBYMAA0DhOwABiYcAAYmMAAGJgwAD70AEWwABiai5hwAD8o0PAAGJ2HMAAYn+BwABifcBqXdqAlwEAAZQAwAD8/z4FTsAAYpDAAGKUAACfsmDAAPvQARzAAGKdgMAAYpbAal2Gn7MBAAGBwABipcBqXdoAwADQPT2JwABir8BqXdocwABisYHAAGKvwGpd2oGNAQABlADAAPz2TsAAYsHAAGLFAACftGDAAONsARzAAGLLLksBAAGBwABizMBqXdoAwAD8gz0cwABi2i6AvwIAAoHAAGLbwGpd2hzAAGLkLksBAAGCwABi5cBqXhcAwAD8gwDAAPyEPRzAAGL1LoC/AgACgsAAYvbAal4Xg8AAYv3Aal5uAMAA/IQGwADYmYJzwABjD8AAYxTAAGv9AACDXgAAAAEDwABjHMAAa/0AAAAEAwTAAGMhAAAAamDAAPvQAMAAYywAAACCjGDAAPvQAMAAY0UAACCWKF3AAPwyAWDAAONsAMAAY1YAAACfuWDAAPvQAWrAAGNiYMAA+9AJAFwBPgtJwABjgSIiHMAAY4eTgJcBAAGAwABjicBqXxcAwAD8/wEcwABjmIDAAGOSwGpfF4CXAQABgcAAY5rAal8lAMAA/P8BHMAAY6WBwABjocBqXyWAlwEAARbAAGOnLmHAAPyjAMAA/P8+Aj0ewABjwsAA+xEDAAOAwABj0sBqXxeBwABj2cBqXyUWwABj3i5hwAD8owBAKsAAZAbAAGQLAD9JwABkGBzAAGQmg8AAZBzAal9JYwEAAZMAwAD8/T4BPTDAAGQzH8AAZETAAPsaBAAEg8AAZErAal9Jkysnn7kAP07AAGR9wABkgwABgO5gwAD70AEcwABkiYHAAGSFwGpfJYGNAQABgMAAZIvAal8XAMAA/PZJwABklhzAAGS0HMAAZKcWwABkoILAAGSbwGpfNGHAAPxVgY0BAAGDwABkqcBqX0kAwAD89mMBAAGEwABktsBqYEkAwAD8/T4BPTDAAGTFHsAAZODAAM30AAAAAD9JwABk9RzAAGT/hMAAZPnAamBJSAEAAZMAwAD880rAAGUFAD9JwABlEiXAAGUbgsAAZRbAal80YMAA04w+Ak7AAGWowABluAABwAB4nWDAANOMASbAAGW/AILAAGW6wGpfNGDAANOMScAAZdgcwABl9BbAAGXhLsAAbmvAANQdSAEAARbAAGYHhcAAZffAamEYwABua8AA048AwAD88z4BScAAZiUiHMAAZjCEwABmKsBqYEljAQABNwoAwAD8/QAhHMAAZlEWwABmSoXAAGY6wGphGIKLwADTkUgBAAEWwABmWS6Ci8AA1B8AwADU3T4CPR7AAGZ0wADK6AUABSbAAGZ+AILAAGZ5wGpfNF3AAPx0AWDAAONsg8AAZpLAal9JLoDAAGajwGpfF4TAAGaqwGpgSQBKwABmvABJwABm0xzAAGbpFsAAZuMWwABm3C6Ci8AA1B+2l8AA03bAANTVwABuasAA03YGAAYcwABnGxzAAGcGgMAAZwDAal8Xg4gBAAEWwABnCC7AAG5rwADUHQDAAPz3ZAEAARbAAGciLqhuwADUHgDAAPz1HMAAZ0OEwABnPcBqYEmDiAEAARbAAGdFLsAAbmvAANQdAMAA/PcWwABnfBbAAGd1hcAAZ2XAamEYgovAANORtpfAANN2wADU1RzAAGeuHMAAZ5mDwABnj8BqX0mDiAEAARbAAGebLsAAbmvAANQdAMAA/PdkAQABFsAAZ8CFwABnsMBqYRiobsAA05AAwAD89R7AAGfjwADK9QEAAS4AHsAAaATAAMr1AQABgsAAaArAal80AADAANOcPgFKwABoHgA/ScAAaD0cwABoWBbAAGhRhcAAaEHAamEYgovAANORSAEAARbAAGhgLoKLwADUHwDAANTdPgVOwABpNsAAaUEAAcAAeJ5dwAD8dAFgwADjbAEmwABpSACCwABpQ8BqXzRdwAD8dAFgwADjbE7AAGlqwABpdQABwAB4n2DAAONOARzAAGl3LsAAeJzAANN2AQABhMAAaYPAamBJAMAA1CdFwABpkwHAAGmcwABpngAAYmDAAPvQAZMBHMAAaaUUwABpo8BqY+sIAGMBAAGEwABpp8BqYEkAwAD8/QEVwABprsBqY+sIHMAAaa8UwABprsBqY+sIAGQBAAGUAMAA/PU+AT0cwABpyYfAAGm/wGpjsoC/AgACFMAAacrAamPrCAAcwABp2YbAAGnPwGpjfUsBAAEcwABp5IPAAGnawGpfSWQBAAEUwABp5sBqY+sIAADAAPz1AMAA/IMAwAD8hEXAAGn8AcAAagXAAGoHAABiYMAA+9ABgMAAagnAal8XARzAAGoSFMAAahDAamSqCABjAQABgcAAahTAal8lAMAA/P0BFcAAahnAamSqCBzAAGoaFMAAahnAamSqCABkAQABlADAAPz1PgE9HMAAai4ugL8CAAIUwABqL8BqZKoIABzAAGo+h8AAajTAamOySwEAARzAAGpBFMAAaj/AamSqCACBjQEAAYDAAGpDwGpfFwDAAPz2AMAA/IMAwAD8hErAAGpdAD8/TsAAan0AAACful3AAPx0AVsATsAAapAAAACfu2DAAPvQAEnAAGqgJcAAaqmCwABqpMBqXzRdwAD8dAFgwADjbD4CPY3AAGrFwGplbRTAAGrRwGpfNAIBXcAA/HQBYMAA42w9jsAAat3AamV/g8AAaurAal9JPgI9jcAAawjAamVtHMAAaykcwABrGYLAAGsUwGpfNJYpAQABg8AAax7Aal9JAMAA/EyArQEAAAGFWCrAAPxIPY7AAGtIwGplf5NJwABrYhzAAGt5HMAAa3GGwABrZsBqZX9kAQABhMAAa3PAamBJAMAA/PWAlwEAARbAAGuFhcAAa3vAamVtYcAA/KMAwAD8/z4BPTDAAGuVHsAAa7DAAM30AAAAAD89HsAAa8rAAMroBQAFhcAAa8/AamVthsAAa9rAamV/LoDAAGvswGpfF4TAAGvzwGpgSQAGwADYmoJzwABsAsAAbBbAAGxlAACBpQAAAAEDwABsG8AAbGUAAAABAQHAAGwhAAAAgaZhAWDAAONsYMAA+goAAF3AAPwyAWDAAONsAUrAAGxAAR/AAGxEwADNBwIBYMAA42wCLoDAAGxjwGpm5QAGwADYm4JzwABsasAAbH7AAGy3AACWPgAAAAEDwABsgsAAbLcAAAABAQHAAGyHAAAAg6NgwAD70AAAXcAA/DIBYMAA42wBSsAAbI0BH8AAbJHAAMzCAwFgwADjbAMuk4DAAGy1wGpnVAAGwADYnIJzwABsvMAAbNDAAG0tAACWPwAAAAEDwABs2cAAbS0AAAABAQHAAGzfAAAAlvlhAWDAAONsYMAA+goAAF3AAPwyAWDAAONsAUrAAG0BAR/AAG0FwADNTQIBYMAA42wCLoDAAG0owGpnvQAGwADYnYJzwABtMsAAbUbAAG2IAACWKQAAAAEDwABtSsAAbYgAAAABAQHAAG1PAAAAg6NgwAD70AAAXcAA/DIBYMAA42wBSsAAbVsBH8AAbV/AAMzCAwFgwADjbAMugMAAbYDAamgsKwAGwADYnoJzwABtjcAAbaHAAG3+AACWPQAAAAEDwABtqsAAbf4AAAABAQHAAG2wAAAAlvlhAWDAAONsYMAA+goAAF3AAPwyAWDAAONsAUrAAG3SAR/AAG3WwADNhQIBYMAA42wCLoDAAG35wGpolQAGwADYwoJzwABuA8AAbhvAAG5QAQCYggAAAAEDwABuJMAAblAAAAAAAAAAXcAA/DIBYMAA42wBSsAAbicBH8AAbivAAM5zAQFgwADjbAEuAAbAANifgnPAAG5VwABuacAAbpQAAJxiAAAAAQPAAG5uwABulAAAAAAAAABdwAD8pQJgwAD70GDAAONsAUrAAG50AR/AAG54wADOaQEBYMAA42wBLgAGwADYoIJzwABumcAAbq3AAG9GAACftgAAAAEDwAButcAAb0YAAAACAQLAAG66AAAAamDAAPvQAMAAbsYAAACCjGDAAPvQAWoAYMAA/Nl3AF3AAPwyAWDAAONsAT4CPR7AAG7dwAD7EQMAA4DAAG7twGppqYHAAG70wGpptxbAAG7+LmHAAPyjAErAAG8LAR/AAG8WwADMwgMBYMAA42wDLoDAAG83wGppqYHAAG8+wGpptwAGwADYw4JzwABvS8AAb2PAAG+WAQBcAAAAAQPAAG9swABvlgAAAAAAAABdwAD8bQFgwADjbAFKwABvbwEfwABvc8AA3isBAWDAAONsAS4ABsAA2KGCc8AAb5vAAG+rwABwDAAAgK0AAAABA8AAb7HAAHAMAAAAAQAAAcAAb7gAAACFWGDAAPoKAWrAAG/CYMAA+gp1XcAA/HQBYMAA42wBPgFKwABvzwEewABv2sAA/HoCAWDAAONsAS4BhViAwABv/8Bqaq0GwADYooJzwABwEcAAcCDAAHBWAACVEwAAAAEDwABwJcAAcFYAAAAAAAAAXcAA/WcBYMAA42wBPgFKwABwLgEewABwOcAAwOQBAWDAAONsAS4ABsAA2KOCc8AAcFvAAHBgwABw3gAAg/gAAAABA8AAcGfAAHDeAAAAAQEBwABwbQAAAIGmYQFgwADjbFwAAFwBPgJOwABwjcAAcJEAAJdmYMAA+9ABFsAAcJguYcAA/KNFwABwpAHAAHCtwABwrwAAYmDAAPvQAZMBHMAAcLaCwABwtMBqa7BjAQABgcAAcLjAamuNAMAA/P0BisAAcL3AamuwHMAAcL6CwABwvcBqa7BkAQABlADAAPz1PgE9HMAAcMuAwABwysBqa3UgAQABHMAAcNAuSwEAAYLAAHDRwGprsADAAPyDAAAGwADYpIJzwABw48AAcO3AAHIAAACWOgAAAAEDwABw88AAcgAAAAABAQHAAHD+AAAghxdhAmDAAONsYMAA42xgwADjbAAAYMAA42wBPgVOwABxNcAAcTkAAJdmYMAA+9ABFsAAcUAuYcAA/KNJwABxTBzAAHFUgcAAcVDAamyDSAEAAZMAwAD88z0wwABxWh7AAHF1wADN8gAAAAA/TsAAcYrAAHGQAACAlmDAAONsARzAAHGWLksBAAGTAMAA/INFwABxnwHAAHGowABxqgAAYmDAAPvQAZQBHMAAcbGDwABxr8BqbPpjAQABgcAAcbPAamyDAMAA/P0Bi8AAcbrAamz6HMAAcbiDwABxusBqbPpkAQABlADAAPz1PgE9isAAccXAamzSHMAAcdSAwABxzcBqbF4gAgACgsAAcdXAamzSHMAAceAuSwEAAYPAAHHhwGps+gDAAPyDAABKwABx8AGCwABx98BqbNIGwADYpYJzwAByBcAAcgfAAHLkAACDWQAAAAEDwAByDsAAcuQAAAEAAIJ2YMAA/RwBWwICAsAAchEAAACWNl8AAADAAHIhAAAAhxdhAl8AAGDAAONsXwAAAABfAAABPgNOwAByV8AAclsAAJdmYMAA+9ABFsAAcmIuYcAA/KNFwABybgHAAHJ3wAByeQAAYmDAAPvQAZMBHMAAcoCDwAByfsBqbiNjAQABgsAAcoLAam4AAMAA/P0Bi8AAconAam4jHMAAcoeDwAByicBqbiNkAQABlADAAPz1PgE9iMAAcpTAam3UHMAAcqqBwAByo8BqbeEgAgACgMAAcqvAam3UHMAAcr0uSwEAAYPAAHK+wGpuIwDAAPyDAABKwAByzQGAwABy1MBqbdQGwADYpoJzwABy6cAAcvXAAHNGAACAqwAAAAEDwABy+8AAc0YAAAEAAIJ2YMAA/RwBWwEBAcAAcv4AAACBpmEBYMAA42xfAAAAAF3AAPwyAV8AAAFKwABzHQEewABzIcAAzNYCAmDAAONsXwAAAi6AwABzRMBqbv0ABsAA2KeCc8AAc0vAAHNXwABztQAAhIkAAAABA8AAc2DAAHO1AAABAACCdmDAAP0cAVsBAQHAAHNtAAAAgaZhAWDAAONsXcAA/DIBXwAAAABdwAD8MgFfAAABSsAAc4wBH8AAc5DAAM0bAgJgwADjbF8AAAIugMAAc7PAam92AAbAANiognPAAHO6wABzv8AAdF8AAJYwAAAAAQPAAHPEwAB0XwAAAAEBAcAAc8oAAACBpmEBYMAA42xgwAD6CgAAYMAA+goBPgNOwABz6sAAc+4AAJdmYMAA+9ABFsAAc/UuYcAA/KNFwAB0AQHAAHQKwAB0DAAAYmDAAPvQAZMBHMAAdBOCwAB0EcBqcC1jAQABgcAAdBXAanAKAMAA/P0BisAAdBzAanAtHMAAdBqCwAB0HMBqcC1kAQABlADAAPz1PgFJwAB0JyEcwAB0LYDAAHQswGpv6iABAAEcwAB0Mi5LAQABgsAAdDPAanAtAMAA/IMAAErAAHQ4ASo/SsAAdFABKQbAANipgnPAAHRkwAB0acAAdQYAAIHUAAAAAQPAAHRswAB1BgAAAAEBAcAAdHIAAACBpmEBYMAA42xgwAD6CgAAYMAA+goBPgNOwAB0ksAAdJYAAJdmYMAA+9ABFsAAdJ0uYcAA/KNFwAB0qQHAAHSywAB0tAAAYmDAAPvQAZMBHMAAdLuCwAB0ucBqcTJjAQABgcAAdL3AanEPAMAA/P0BisAAdMTAanEyHMAAdMKCwAB0xMBqcTJkAQABlADAAPz1PgFJwAB0zxzAAHTUgMAAdNPAanDvIAEAARzAAHTZLksBAAGCwAB02sBqcTIAwAD8gwAASsAAdN8BKT9KwAB09gEqBsAA2KqCc8AAdQvAAHUVwAB2OAAAljQAAAABA8AAdR/AAHY4AAAAAgEBwAB1JQAAAJb5YQFgwADjbGDAAPoKAAHAAHVJAAAgljVhAGDAAONsAWoAYMAA/Nl3YMAA42wBPgROwAB1XsAAdWIAAJdmYMAA+9ABFsAAdWkuYcAA/KNFwAB1dQHAAHV+wAB1gAAAYmDAAPvQAZMBHMAAdYeDwAB1hcBqck9jAQABgsAAdYnAanIsAMAA/P0Bi8AAdZDAanJPHMAAdY6DwAB1kMBqck9kAQABlADAAPz1PgJOwAB1n8AAdacAAJYgYMAA42wBHMAAda0uSwEAAYPAAHWuwGpyTwDAAPyDScAAdbgcwAB1wIDAAHW8wGpx8yABAAGEwAB1wcBqcqcAAErAAHXLAYTAAHXSwGpypz9JwAB15SEcwAB18IHAAHXpwGpyCkgBAAErAMAA/SlKwAB1+QEcwAB2BoHAAHYAwGpyCiAAAAAAAD89MMAAdg4ewAB2KcAAzfIAAAAABsAA2KuCc8AAdj3AAHZHwAB3gAAAljkAAAABA8AAdlDAAHeAAAAAAgEBwAB2VgAAAJb5YQFgwADjbGDAAPoKAAHAAHZ6AAAgljVhAGDAAONsAWoAYMAA/Nl3YMAA42wBPgROwAB2j8AAdpMAAJdmYMAA+9ABFsAAdpouYcAA/KNFwAB2pgHAAHavwAB2sQAAYmDAAPvQARzAAHa3gsAAdrPAanOygY0BAAGUAMAA/PYBHMAAdr6DwAB2vMBqc9WBbQEAAZMAwAD9AAGLwAB2xsBqc9UcwAB2xIPAAHbGwGpz1YGNAQABlADAAPz2PgJOwAB21cAAdt0AAJYgYMAA42wBHMAAduMuSwEAAYPAAHbkwGpz1QDAAPyDScAAdu4cwAB29oDAAHbywGpzeSABAAGEwAB298BqdD8AAD4BSsAAdwsBhMAAdxLAanQ/P0nAAHctIRzAAHc4gcAAdzHAanOQSAEAASsAwAD9KUrAAHdBARzAAHdOgcAAd0jAanOQIAAAAAAAPz0wwAB3Vh7AAHdxwADN8gAAAAAGwADYrIJzwAB3hcAAd4/AAHmZAACWPAAAAAEDwAB3msAAeZkAAAACAQHAAHegAAAAlvlhAWDAAONsYMAA+goAAcAAd8QAACCWNWEAYMAA42wBagBgwAD82XdgwADjbAE+B07AAHfZwAB34AAAgXZbAStOwAB38cAAd/8AAMAAcWFgwAD6CgEqTsAAeBDAAHgUAACXZmDAAPvQARbAAHgbLmHAAPyjRcAAeCcBwAB4MMAAeDIAAGJgwAD70AGTARzAAHg5hcAAeDfAanWVYwEAAYTAAHg7wGp1cgDAAPz9AY3AAHhCwGp1lRzAAHhAhcAAeELAanWVZAEAAZQAwAD89T4CTsAAeFHAAHhZAACWIGDAAONsARzAAHhfLksBAAGFwAB4YMBqdZUAwAD8g0nAAHhqHMAAeHKAwAB4bsBqdRMgAQABhsAAeHPAanXtAAA+A0nAAHiHg8AAeIvAanVcPgE9MMAAeKYewAB4wcAAzfMAAAAAPz2KwAB43sBqdUyGwAB458Bqde09i8AAePjAanVcKT9JwAB5IIPAAHkkwGp1XErAAHkzASbAAHkzAYLAAHk6wGp1TGDAAONsP0nAAHlGIRzAAHlRgcAAeUrAanUqSAEAASsAwAD9KUrAAHlaARzAAHlngcAAeWHAanUqIAAAAAAAPz0wwAB5bx7AAHmKwADN8gAAAAAGwADYrYJzwAB5nsAAeajAAHnZAACWMwAAAAEDwAB5scAAedkAAAABAQHAAHm2AAAAJ2DAAPvQAABgwADjbAE+AUrAAHnDARzAAHnOLksBAAGAwAB5z8Bqdx0AwAD8gwbAANiugnPAAHnewAB548AAekEAAFYAAAABA8AAeebAAHpBAAAAAQEBwAB58QAAIICWYMAA42wAAFwBPgE9MMAAef4fwAB6CMAA+2IBAAEnwAB19QAGwADYr4JzwAB6RsAAekvAAHq2AACApQAAAAEDwAB6UcAAerYAAAABAQHAAHpmAAAggJZdwAD8MgFgwADjbAAAXAE+AT0wwAB6cx/AAHp9wAD7YgEAASfAAHX1AAbAANiwgnPAAHq7wAB6wMAAezEAAJ7KAAAAAQPAAHrGwAB7MQAAAAICAsAAessAAAAnYMAA+9AAwAB63AAAIICWYMAA42wAAFwBPgE9MMAAeukfwAB688AA+2IBAAEnwAB4mQAGwADYsYJzwAB7NsAAezvAAHu6AACfxAAAAAEDwAB7RMAAe7oAAAACAgLAAHtJAAAAJ2DAAPvQAMAAe2QAACApXcAA/DIBYMAA42wAAFwBPgE9MMAAe3IfwAB7fMAA+2IBAAEnwAB4mQAGwADYsoJzwAB7v8AAe8TAAHxlAACArgAAAAEDwAB7yMAAfGUAAAABAAHAAHvOAAAAmxlhAmDAAONsYMAA42xgwAD70AFqAGDAAPzZdwBcAT4CScAAe/gcwAB8BIDAAHv8wGp4+kgBAAErAMAA/Sk+AT0wwAB8FSfAAHijPz0ewAB8TsAAzogCAWDAAONsAi6AwAB8WcBqePoABsAA2LOCc8AAfGrAAHxuwAB9bwAAgLsAAAABA8AAfHXAAH1vAAAAAgECwAB8gAAAIJYgYMAA42wAwAB8jgAAAGpgwAD70AFqwAB8lmDAAPvQCQBgwAD70AE+A0nAAHygHMAAfKqBwAB8pMBqeaOBbQEAARbAAHyyLmHAAPyjAMAA/QA+AUrAAHzCARzAAHzJlIHEAAAAAMAA+/NJwAB82BzAAHzigcAAfNzAanmjYwEAAZMAwAD8/T4BPYnAAHzvwGp5o5M/RcAAfQQBwAB9DcAAfQ8AAGJgwAD70AGBwAB9EcBqeaMBHMAAfRqCwAB9GMBqejZjAQABFsAAfSEuYcAA/KMAwAD8/QGKwAB9KcBqejYcwAB9KoLAAH0pwGp6NmQBAAGUAMAA/PU+AUnAAH02HMAAfUIcwAB9Pi5LAQABgsAAfT/Aano2AMAA/INIAQABgMAAfUXAanmUAMAA/SlKwAB9TgGCwAB9VcBqejY/SsAAfWIBHMAAfWmUgcQAAAAAwAD78wbAANi0gnPAAH10wAB9eMAAfpYAAJZaAAAAAQPAAH2DwAB+lgAAAAIBAsAAfY4AACCWIGDAAONsAMAAfZwAAABqYMAA+9ABasAAfaRgwAD82XcAYMAA+9ABPgNJwAB9sSIcwAB9u4HAAH21wGp7KkgBAAErAMAA/PMBHMAAfcyBwAB9xsBqeyqBbQEAARbAAH3ULmHAAPyjAMAA/QA+AT2JwAB95MBqeyocwAB9+BbAAH3xLmHAAPyjgY0BAAGUAMAA/PZJwAB+CBzAAH4SgcAAfgzAansqYwEAAZMAwAD8/T4BSsAAfh8BHMAAfiaUgcQAAAAAwAD78z9FwAB+NAHAAH49wAB+PwAAYmDAAPvQAYHAAH5BwGp7KgEcwAB+SoLAAH5IwGp78YFtAQABkwDAAP0AAYrAAH5QwGp78RzAAH5RgsAAflDAanvxgY0BAAGUAMAA/PY+AUnAAH5dHMAAfmkcwAB+ZS5LAQABgsAAfmbAanvxAMAA/INIAQABgMAAfmzAansbAMAA/SlKwAB+dQGCwAB+fMBqe/E/SsAAfokBHMAAfpCUgcQAAAAAwAD78wbAANi1gnPAAH6bwAB+pcAAfwAAAIYRAAAAAQPAAH6vwAB/AAAAAAAAAABgwADjbAE+AT0wwAB+uB/AAH7CwAD7YgEAASfAAHX2AAbAANi2gnPAAH8FwAB/D8AAf3EAAJ/DAAAAAQPAAH8XwAB/cQAAAAEBAcAAfxwAAAAnYMAA+9AAAGDAAONsAT4BPTDAAH8pH8AAfzPAAPtiAQABJ8AAdfYABsAA2LeCc8AAf3bAAH97wAB/8wAAlvgAAAABA8AAf4bAAH/zAAAAAQEBwAB/jAAAAJb5YQFgwADjbGDAAPoKAABcAT4BPTDAAH+rH8AAf7XAAPtiAQABJ8AAdfYABsAA2LiCc8AAf/jAAH/9wACAdQAAlvsAAAABA8AAgAjAAIB1AAAAAQEBwACADgAAAJb5YQFgwADjbGDAAPoKAABcAT4BPTDAAIAtH8AAgDfAAPtiAQABJ8AAdfYABsAA2MSCc8AAgHrAAICIwACA4gEAgxkAAAABA8AAgI7AAIDiAAAAAAAAAGDAAONsAT4CScAAgJQcwACAnxbAAICYLmHAAPyjgJcBAAGTAMAA/P9KwACApAEcwACAry5LAQABkwDAAPyDPz0wwACAuB7AAIDTwADN8gAAAAAGwADYxYJzwACA58AAgPXAAIFXAQCB6AAAAAEDwACA+sAAgVcAAAAAAAAAYMAA42wBPgJJwACBABzAAIELFsAAgQQuYcAA/KOAlwEAAZMAwAD8/0rAAIEQARzAAIEbLksBAAEcwACBIxbAAIEcLmHAAPyjgY0BAAGUAMAA/PYAwAD8gz89MMAAgS0ewACBSMAAzfIAAAAABsAA2MaCc8AAgVzAAIFqwACCAQEAgMMAAAABA8AAgXHAAIIBAAAAAAAAAGDAAONsAT4DScAAgXccwACBghbAAIF7LmHAAPyjSAEAAZQAwAD880rAAIGIARzAAIGTLksBAAGTAMAA/IM/ScAAgZwcwACBpxbAAIGgLmHAAPyjSAEAAZMAwAD88z0wwACBrR7AAIHIwADN8gAAAAA/PTDAAIHZHsAAgfTAAM3zAAAAAAbAANi5gnPAAIIGwACCFMAAgwMAAIFYAAAAAQPAAIIbwACDAwAAAAIBAsAAgiAAAABqYMAA+9AAwACCLAAAAIKMYMAA+9ABagBgwAD82XcAYMAA404BPgU9icAAgjjAan/9HsAAgknAAPsRAwADgMAAglnAan/vgcAAgmDAan/9FsAAgmouYcAA/KMATsAAgnvAAIKCAABhYMAA+9ABHMAAgoiBwACChMBqf/2BjQEAAYDAAIKKwGp/7wDAAPz2TsAAgqPAAIKqAACBdmDAAONOARzAAIKsLsAAeJzAANN2AQABgsAAgrjAaoBSAMAA1Cc9HMAAgsyDwACCxcBqgIWDXgQABJOCwACC2MBqgFIugMAAgubAan/vAMAA/JlKwACC8gGDwACC+cBqgIUGwADYuoJzwACDCMAAgw3AAIOOAACfxgAAAAEDwACDE8AAg44AAAACAgLAAIMYAAAAJ2DAAPvQAMAAgzMAACCDzF3AAPwyAWDAAONsAABcAT4CTsAAg0nAAINNAAGCjGDAAPvQARzAAINfFsAAg1iBwACDT8BqgSphwAD8VWQBAAGAwACDYcBqgRwAwAD89T0cwACDbC6DXgMAA4DAAIN1wGqBHILAAIN8wGqBRYHAAIOBwGqBKgDAANQwBsAA2LuCc8AAg5PAAIOYwACEUwAAm6kAAAABA8AAg6HAAIRTAAAAAwIDwACDpgAAAGpgwAD70ADAAIOxAAAAgoxgwAD70ADAAIPBAAAgwABC9GDAAONsAWoAYMAA/Nl3AFwBPgI9HsAAg97AAPsRAwADgMAAg+7AaoHXgcAAg/XAaoHlFsAAg/8uYcAA/KMARcAAhAwBwACEFcAAhBcAAGJgwAD70AGAwACEGcBqgdcBHMAAhCKDwACEIMBqgkNjAQABgcAAhCTAaoHlAMAA/P0Bi8AAhCvAaoJDHMAAhCmDwACEK8BqgkNkAQABlADAAPz1PgE9HMAAhDougL8CAAKDwACEO8BqgkOCwACEQMBqgfQAwAD8hAAAalSvAGpVHwBqVVIAalWDAGpVtABqVfkAalZQAGpWvgBqVxoAaleoAGpYUABqWZkAalsWAGpcXABqXVwAal7tAGpmuwBqZyoAameTAGpoAgBqaGsAamjaAGppKgBqaX8AamozAGpqggBqavkAamtLAGpsNABqbZ8Aam7IAGpvQQBqb8AAanDFAGpxyQBqc08AanTpAGp28wBqd1IAanenAGp4AwBqeGcAanjQAGp5agBqevEAanykAGp87wBqfUgAan2lAGp+AgBqfn8Aan8WAGp/xQBqgPIAaoGtAGqCxQAAADcCwADYyoJzwAE5ssABOdLAAT4QA8AAeSABasABObNgwAD50cABcL4AAWDAANiMAAFgwADjTgAACAbAANjNgnPAAToywAE6OsABOngEAcAAdnvAANN2AAAAAQPAATpYwAE6eAAAAAAAAABgwADYygE+AT0wwAE6YSfAAGEkBsAA2M+Cc8ABOn3AATq+wAE7XgMASwFqwAE6fmDAAPnRwAGLfAAAAQPAATrAwAE7XgAAAAEBAcABOsUAAAAnYMAA+9AAAGDAAONsAT4CScABOtIiHMABOtyAwAE61sBqhF1jAQABkwDAAPz9ARzAATrpgMABOuPAaoRdgW0BAAEWwAE67C5hwADU9QDAAP0APgE9MMABOvwfwAE7BsAA+yYDAAOAwAE7F8BqhF0uJycAP0rAATs4ARzAATs/LsAAeSHAANN2AQABgMABO1TAaoRdAMAA2NMGwADY0IJzwAE7Y8ABO3HAATwjAwCAvwAAAAEDwAE7dMABPCMAAAACAgLAATt5AAAAJ2DAAPvQAMABO4oAACCAlmDAAONsAABcAT4CScABO5ciHMABO6GAwAE7m8BqhSdjAQABkwDAAPz9ARzAATuugMABO6jAaoUngW0BAAEWwAE7sS5hwADU9QDAAP0APgE9MMABO8EfwAE7y8AA+yYDAAOAwAE73MBqhScuJycAPz0cwAE7/S7AAHkiwADTdgIAAoDAATwSwGqFJ4HAATwZwGqFNQDAANjUBsAA2NeCc8ABPF3AATxlwAE8pgEAwABuawAAAAEDwAE8eMABPKYAAAAAAAAAYMAA+9ABPgFKwAE8fgFqwAE8k2DAAPvQg1EGwADY0oJzwAE8ysABPNjAAT0aAADAAHicwADTdgAAAAEDwAE848ABPRoAAAABAQHAATzoAAAAYWDAAPvQAABgwADjTgE+AUrAATz2AR7AAT0BwADjUgEAAYDAAT0PwGqGTQAGwADY04JzwAE9H8ABPSnAAT2OAADAAHkhwADTdgAAAAEDwAE9PcABPY4AAAABAQHAAT1CAAAAJ2DAAPvQAABgwADjbAE+AUrAAT1PARzAAT1WLsAAeN/AANN2AQABHMABPWqAwAE9ZMBqhrCDiAEAAWrAAT16YMAA+9CDUQDAAPz3AMAA1QwGwADY1IJzwAE9k8ABPZjAAT4OAADAAHkiwADTdgAAAAEDwAE9rMABPg4AAAACAgLAAT2xAAAAJ2DAAPvQAMABPcIAAACAlmDAAONsAABcAT4BPRzAAT3PLsAAeOHAANN2AgACHMABPeOAwAE93cBqhzeDiAEAAWrAAT3zYMAA+9CDUQDAAPz3gcABPgTAaodFAMAA1Q0GwADY1YJzwAE50sABOdIAABCfvADAANOZwADTmQEDAAAAAAADAwMAAAAAamDAAPvQAAAAAACCjGDAAPvQAAAAACCDzF3AAPwyAVsAAFwBSgABHQCfvAMAA4AAwGqHxIEAwGqHz4IAwGqH2wDAANOZAABqg+IAaoQmAGqE/QBqhdYAaoYdAGqGgABqhwcAaoedAGqIDQAAAAgCwADY2IJzwAE/VMABP3TAAUOKN8AAeSMAAAFgwADU7wABYMAA1FgAAQXAANkJAAAAAAQAAAMAAAAAAAAAAABgwADY2AE/AQkAAMAA1RQAAAAANwbAANjagnPAAT90wAE/dAAAEJ+8AMAA05nAANOZAQMAAAAAAAMDAwAAAABqYMAA+9AAAAAAAIKMYMAA+9AAAAAAIIPMXcAA/DIBWwAAXAFKAAEdAJ+8AwADgADAaoiwgQDAaoi7ggDAaojHAMAA05kGwADZC4JzwACElsAAhJ7AAISwAQLAAG5rAAAAAQPAAISwwACEsAAAAAAAAABgwAD70AAGwADZDIJzwACEtMAAhLzAAITJAQKobgAAAAEDwACEycAAhMkAAAAAAAAAYMAA+9AABsAA2Q2Cc8AAhM3AAITdwACE4wECgosAAAABA8AAhOPAAITjAAAAAAAAAGDAANTSAAbAANjcgnPAAITowACE9MAAhQsAAsAAeJzAANN2AAAAAQPAAIT/wACFCwAAAAEBAcAAhQQAAABhYMAA+9AAAGDAAONYAAbAANjdgnPAAIUQwACFHMAAhUwAAJZAAAAAAQPAAIUowACFTAAAAQAAgnZgwAD9HAFbAAAAAF3AAPwyAV8AAAFKwACFLgEfwACFMsAAzeUBAV8AAAEuAAbAANjegnPAAIVRwACFY8AAhcsAAJY3AAAAAQPAAIVtwACFywAAAAEBAcAAhYAAACCD1l3AAPwyAWDAAOSUAABdwAD8MgFgwADklAFKwACFkAEewACFlMAAzb0CAWDAAOSUAi6AwACFxcBqilQABsAA2N+Cc8AAhdDAAIXYwACGBAAAljIAAAABA8AAhd/AAIYEAAABAACW82DAAP0cAVsAAAAAXcAA/HQBXwAAAUrAAIXlAR7AAIXqwAD8fwECYMAA5JRfAAABLgAGwADZFIJzwACGCMAAhhHAAIZ+AgCDGQAAAAEDwACGFsAAhn4AAAABAQHAAIYfAAAggJZgwADklAAAXAE+AknAAIYsHMAAhjwWwACGNS5hwAD8o0gBAAGTAMAA/PM9MMAAhkIfwACGTMAA+yYCAAKTLgA/PRzAAIZvLoC/AgACk4DAAIZ1wGqLHgDAAPyEBsAA2RWCc8AAhoPAAIaMwACHBgIAgegAAAABA8AAhpDAAIcGAAAAAQEBwACGmQAAIICWYMAA5JQAAFwBPgJJwACGphzAAIa2FsAAhq8uYcAA/KNIAQABkwDAAPzzPTDAAIa8H8AAhsbAAPsmAgACky4APz0cwACG6S6AvwIAAhzAAIb2FsAAhu8uYcAA/KOBjQEAAZQAwAD89oDAAIb9wGqLrADAAPyEBsAA2OCCc8AAhwvAAIcPwACHzAAAn8EAAAABA8AAhxnAAIfMAAAAAgECwACHHwAAAJb5YQFgwADklGDAAPoKAMAAhzsAAABqYMAA+9ABasAAh0NgwAD70AkAYMAA+9ABPgNJwACHTRzAAIdXgcAAh1HAaoxqYwEAAZMAwAD8/T2JwACHXMBqjGqTP0XAAIdrAcAAh3TAAId2AABiYMAA+9ABgcAAh3jAaoxqARzAAIeBgsAAh3/Aaoy7YwEAARbAAIeDLmHAAPyjAMAA/P0BisAAh4vAaoy7HMAAh4yCwACHi8BqjLtkAQABlADAAPz1PgFJwACHmBzAAIeggMAAh5zAaoxUIAEAARzAAIelLksBAAGCwACHpsBqjLsAwAD8gwAASsAAh6sBgsAAh7LAaoy7P0rAAIe/ARzAAIfGlIHEAAAAAMAA+/MGwADY4YJzwACH0cAAh9XAAIi4AACfwgAAAAEDwACH48AAiLgAAAACAQLAAIfpAAAAlvlhAWDAAOSUYMAA+goAwACIBQAAAGpgwAD70AFqAGDAAPzZdwBgwAD70AE+A0nAAIgTIhzAAIgdgcAAiBfAao2zSAEAASsAwAD88wEcwACILoHAAIgowGqNs4FtAQABFsAAiDYuYcAA/KMAwAD9AD2JwACIPsBqjbMcwACIUhbAAIhLLmHAAPyjgY0BAAGUAMAA/PY/RcAAiFsBwACIZMAAiGYAAGJgwAD70AGBwACIaMBqjbMBHMAAiHGCwACIb8BqjkCBbQEAAZMAwAD9AAGKwACId8BqjkAcwACIeILAAIh3wGqOQIGNAQABlADAAPz2PgFJwACIhBzAAIiMgMAAiIjAao2dIAEAARzAAIiRLksBAAGCwACIksBqjkAAwAD8gwAASsAAiJcBgsAAiJ7Aao5AP0rAAIirARzAAIiylIHEAAAAAMAA+/MGwADY4oJzwACIvcAAiNTAAImvAwBkAAAAAQPAAIjVwACJrwAAAAEBAcAAiOQAACCD1l3AAPx0AWDAAOSUAABdwAD8dAFgwADklAE+Ak7AAIj1wACJAQAAg1hgwAD70AEcwACJDxbAAIkILmHAAPyjZAEAARbAAIkXgMAAiRHAao8ZYcAA/KMAwAD89UrAAIkjATXAAIkzAAABAF3AAPx0AWDAAOSUATHAAIkzYMAA5JQANQAAAAEAWwEXwACJPoLAAIk8wGqPg2GBwACJR8Bqjz7AAPyhNQAAAAEAWwEcwACJW4LAAIlZwGqPg4NeAwADkxbAAIlsLmHAAPyjLgDAAPyZNQAAAAEAWwEcwACJgoLAAImAwGqPg4NeAwADFsAAiZAuYcAA/KOBwACJmMBqjz6AwACJpcBqjxkAwAD8mYIAwGqPgwbAANjjgnPAAIm0wACJucAAilgAAIMXAAAAAQPAAInBwACKWAAAAAEBAcAAickAAACWIGDAAP0cAABgwAD6CgE+A07AAIncwACJ4AAAl2ZgwAD70AEWwACJ5y5hwAD8o0XAAInzAcAAifzAAIn+AABiYMAA+9ABkwEcwACKBYLAAIoDwGqQnGMBAAGBwACKB8BqkHkAwAD8/QGKwACKDsBqkJwcwACKDILAAIoOwGqQnGQBAAGUAMAA/PU+AUnAAIoZHMAAiiUcwACKIS5LAQABgsAAiiLAapCcAMAA/INIAQABgMAAiijAapBgAMAA/SlKwACKMQEpP0rAAIpIASoGwADY5IJzwACKXcAAimLAAItLAACfsAAAAAEDwACKacAAi0sAAAABAAHAAIpyAAAAn7FgwADQOAFqAGDAAPzZdwBcAT4DPSMcwACKiIDAAIqBwGqRYEgBAAErAMAA/SmIwACKgcBqkWAewACKkMAA0DoAAAAAKwFgwADQOE7AAIqiwACKpAAAYmDAAPvQARbAAIqrLmHAAPyjQ8AAirccwACKwIHAAIq+wGqRtICXAQABlADAAPz/PgVOwACK0cAAitUAAJ+yYMAA+9ABHMAAit6AwACK18BqkWCfswEAAYHAAIrmwGqRtADAANA9PYnAAIrwwGqRtBzAAIrygcAAivDAapG0gY0BAAGUAMAA/PZOwACLAsAAiwYAAJ+0YMAA5JQBHMAAiwwuSwEAAYHAAIsNwGqRtADAAPyDPRzAAIsbLoC/AgACgcAAixzAapG0HMAAiyUuSwEAAYLAAIsmwGqR8QDAAPyDAMAA/IQ9HMAAizYugL8CAAKCwACLN8BqkfGDwACLPsBqkkgAwAD8hAbAANjlgnPAAItQwACLVcAAlDQAAINeAAAAAQPAAItdwACUNAAAAAQDBMAAi2IAAABqYMAA+9AAwACLbQAAAIKMYMAA+9AAwACLhAAAIJYoXcAA/DIBYMAA5JQAwACLlQAAAJ+5YMAA+9ABasAAi6FgwAD70AkAXAE+C0nAAIvAIiIcwACLxpOAlwEAAYDAAIvIwGqS8QDAAPz/ARzAAIvXgMAAi9HAapLxgJcBAAGBwACL2cBqkv8AwAD8/wEcwACL5IHAAIvgwGqS/4CXAQABFsAAi+YuYcAA/KMAwAD8/z4CPR7AAIwBwAD7EQMAA4DAAIwRwGqS8YHAAIwYwGqS/xbAAIwdLmHAAPyjAEAqwACMRcAAjEoAP0nAAIxXHMAAjGWDwACMW8BqkyNjAQABkwDAAPz9PgE9MMAAjHIfwACMg8AA+xoEAASDwACMicBqkyOTKyefuQA/TsAAjLzAAIzCAAGA7mDAAPvQARzAAIzIgcAAjMTAapL/gY0BAAGAwACMysBqkvEAwAD89knAAIzVHMAAjPMcwACM5hbAAIzfgsAAjNrAapMOYcAA/FWBjQEAAYPAAIzowGqTIwDAAPz2YwEAAYTAAIz1wGqUIwDAAPz9PgE9MMAAjQQewACNH8AAzfQAAAAAP0nAAI00HMAAjT6EwACNOMBqlCNIAQABkwDAAPzzSsAAjUQAP0nAAI1RJcAAjVqCwACNVcBqkw5gwADTjD4CTsAAjeXAAI31AAHAAHidYMAA04wBJsAAjfwAgsAAjffAapMOYMAA04xJwACOFRzAAI4xFsAAjh4uwABua8AA1FpIAQABFsAAjkSFwACONMBqlPLAAG5rwADTjwDAAPzzPgFJwACOYiIcwACObYTAAI5nwGqUI2MBAAE3CgDAAPz9ACEcwACOjhbAAI6HhcAAjnfAapTygovAANORSAEAARbAAI6WLoKLwADUXADAANTdPgI9HsAAjrHAAMroBQAFJsAAjrsAgsAAjrbAapMOXcAA/HQBYMAA5JSDwACOzcBqkyMugMAAjt7AapLxhMAAjuXAapQjAErAAI73AEnAAI8OHMAAjyQWwACPHhbAAI8XLoKLwADUXLaXwADTdsAA1NXAAG5qwADTdgYABhzAAI9WHMAAj0GAwACPO8BqkvGDiAEAARbAAI9DLsAAbmvAANRaAMAA/PdkAQABFsAAj10uqG7AANRbAMAA/PUcwACPfoTAAI94wGqUI4OIAQABFsAAj4AuwABua8AA1FoAwAD89xbAAI+3FsAAj7CFwACPoMBqlPKCi8AA05G2l8AA03bAANTVHMAAj+kcwACP1IPAAI/KwGqTI4OIAQABFsAAj9YuwABua8AA1FoAwAD892QBAAEWwACP+4XAAI/rwGqU8qhuwADTkADAAPz1HsAAkB7AAMr1AQABLgAewACQP8AAyvUBAAGCwACQRcBqkw4AAMAA05w+AUrAAJBZAD9JwACQeBzAAJCTFsAAkIyFwACQfMBqlPKCi8AA05FIAQABFsAAkJsugovAANRcAMAA1N0+BU7AAJFxwACRfAABwAB4nl3AAPx0AWDAAOSUASbAAJGDAILAAJF+wGqTDl3AAPx0AWDAAOSUTsAAkaPAAJGuAAHAAHifYMAA41gBHMAAkbAuwAB4nMAA03YBAAGEwACRvMBqlCMAwADUZEXAAJHMAcAAkdXAAJHXAABiYMAA+9ABkwEcwACR3hTAAJHcwGqXxQgAYwEAAYTAAJHgwGqUIwDAAPz9ARXAAJHnwGqXxQgcwACR6BTAAJHnwGqXxQgAZAEAAZQAwAD89T4BPRzAAJICh8AAkfjAapeMgL8CAAIUwACSA8Bql8UIABzAAJIShsAAkgjAapdXSwEAARzAAJIdg8AAkhPAapMjZAEAARTAAJIfwGqXxQgAAMAA/PUAwAD8gwDAAPyERcAAkjUBwACSPsAAkkAAAGJgwAD70AGAwACSQsBqkvEBHMAAkksUwACSScBqmIQIAGMBAAGBwACSTcBqkv8AwAD8/QEVwACSUsBqmIQIHMAAklMUwACSUsBqmIQIAGQBAAGUAMAA/PU+AT0cwACSZy6AvwIAAhTAAJJowGqYhAgAHMAAkneHwACSbcBql4xLAQABHMAAknoUwACSeMBqmIQIAIGNAQABgMAAknzAapLxAMAA/PYAwAD8gwDAAPyESsAAkpYAPz9OwACStgAAAJ+6XcAA/HQBWwBOwACSyQAAAJ+7YMAA+9AAScAAktklwACS4oLAAJLdwGqTDl3AAPx0AWDAAOSUPgI9jcAAkvzAaplHFMAAkwjAapMOAgFdwAD8dAFgwADklD2OwACTFMBqmVmDwACTIcBqkyM+Aj2NwACTP8BqmUccwACTYBzAAJNQgsAAk0vAapMOlikBAAGDwACTVcBqkyMAwAD8TICtAQAAAYVYKsAA/Eg9jsAAk3/AaplZk0nAAJOZHMAAk7AcwACTqIbAAJOdwGqZWWQBAAGEwACTqsBqlCMAwAD89YCXAQABFsAAk7yFwACTssBqmUdhwAD8owDAAPz/PgE9MMAAk8wewACT58AAzfQAAAAAPz0ewACUAcAAyugFAAWFwACUBsBqmUeGwACUEcBqmVkugMAAlCPAapLxhMAAlCrAapQjAAbAANjmgnPAAJQ5wACUS8AAlJYAAIGlAAAAAQPAAJRQwACUlgAAAAEBAcAAlFYAAACBpmEBYMAA5JRgwAD6CgAAXcAA/DIBYMAA5JQBSsAAlHMBH8AAlHfAAM0HAgFgwADklAIugMAAlJTAapq/AAbAANjngnPAAJSbwACUrcAAlOQAAJY+AAAAAQPAAJSxwACU5AAAAAEBAcAAlLYAAACDo2DAAPvQAABdwAD8MgFgwADklAFKwACUvAEfwACUwMAAzMIDAWDAAOSUAy6TgMAAlOLAapsuAAbAANjognPAAJTpwACU+8AAlVQAAJY/AAAAAQPAAJUEwACVVAAAAAEBAcAAlQoAAACW+WEBYMAA5JRgwAD6CgAAXcAA/DIBYMAA5JQBSsAAlSoBH8AAlS7AAM1NAgFgwADklAIugMAAlU/AapuXAAbAANjpgnPAAJVZwACVa8AAlaUAAJYpAAAAAQPAAJVvwACVpQAAAAEBAcAAlXQAAACDo2DAAPvQAABdwAD8MgFgwADklAFKwACVegEfwACVfsAAzMIDAWDAAOSUAy6AwACVncBqnAYrAAbAANjqgnPAAJWqwACVvMAAlhUAAJY9AAAAAQPAAJXFwACWFQAAAAEBAcAAlcsAAACW+WEBYMAA5JRgwAD6CgAAXcAA/DIBYMAA5JQBSsAAlesBH8AAle/AAM2FAgFgwADklAIugMAAlhDAapxvAAbAANkOgnPAAJYawACWMMAAlmMBAJiCAAAAAQPAAJY5wACWYwAAAAAAAABdwAD8MgFgwADklAFKwACWPAEfwACWQMAAznMBAWDAAOSUAS4ABsAA2OuCc8AAlmjAAJZ6wACWowAAnGIAAAABA8AAln/AAJajAAAAAAAAAF3AAPylAmDAAPvQYMAA5JQBSsAAloUBH8AAlonAAM5pAQFgwADklAEuAAbAANjsgnPAAJaowACWusAAl1EAAJ+2AAAAAQPAAJbCwACXUQAAAAIBAsAAlscAAABqYMAA+9AAwACW0wAAAIKMYMAA+9ABagBgwAD82XcAXcAA/DIBYMAA5JQBPgI9HsAAlurAAPsRAwADgMAAlvrAap2DgcAAlwHAap2RFsAAlwsuYcAA/KMASsAAlxgBH8AAlyPAAMzCAwFgwADklAMugMAAl0LAap2DgcAAl0nAap2RAAbAANkPgnPAAJdWwACXbMAAl50BAFwAAAABA8AAl3XAAJedAAAAAAAAAF3AAPxtAWDAAOSUAUrAAJd4AR/AAJd8wADeKwEBYMAA5JQBLgAGwADY7YJzwACXosAAl7DAAJgPAACArQAAAAEDwACXtsAAmA8AAAABAAABwACXvQAAAIVYYMAA+goBasAAl8dgwAD6CnVdwAD8dAFgwADklAE+AUrAAJfUAR7AAJffwAD8egIBYMAA5JQBLgGFWIDAAJgCwGqehwbAANjugnPAAJgUwACYIcAAmFUAAJUTAAAAAQPAAJgmwACYVQAAAAAAAABdwAD9ZwFgwADklAE+AUrAAJgvAR7AAJg6wADA5AEBYMAA5JQBLgAGwADY74JzwACYWsAAmF/AAJjbAACD+AAAAAEDwACYZsAAmNsAAAABAQHAAJhsAAAAgaZhAWDAAOSUXAAAXAE+Ak7AAJiKwACYjgAAl2ZgwAD70AEWwACYlS5hwAD8o0XAAJihAcAAmKrAAJisAABiYMAA+9ABkwEcwACYs4LAAJixwGqfimMBAAGBwACYtcBqn2cAwAD8/QGKwACYusBqn4ocwACYu4LAAJi6wGqfimQBAAGUAMAA/PU+AT0cwACYyIDAAJjHwGqfTyABAAEcwACYzS5LAQABgsAAmM7Aap+KAMAA/IMAAAbAANjwgnPAAJjgwACY6MAAmfUAAJY6AAAAAQPAAJjuwACZ9QAAAAEBAcAAmPcAACCHF2ECYMAA5JRgwADklGDAAOSUAABgwADklAE+BU7AAJkqwACZLgAAl2ZgwAD70AEWwACZNS5hwAD8o0nAAJlBHMAAmUmBwACZRcBqoF1IAQABkwDAAPzzPTDAAJlPHsAAmWrAAM3yAAAAAD9OwACZf8AAmYUAAICWYMAA5JQBHMAAmYsuSwEAAZMAwAD8g0XAAJmUAcAAmZ3AAJmfAABiYMAA+9ABlAEcwACZpoPAAJmkwGqg1GMBAAGBwACZqMBqoF0AwAD8/QGLwACZr8BqoNQcwACZrYPAAJmvwGqg1GQBAAGUAMAA/PU+AT2KwACZusBqoKwcwACZyYDAAJnCwGqgOCACAAKCwACZysBqoKwcwACZ1S5LAQABg8AAmdbAaqDUAMAA/IMAAErAAJnlAYLAAJnswGqgrAbAANjxgnPAAJn6wACZ/MAAmtcAAINZAAAAAQPAAJoDwACa1wAAAQAAgnZgwAD9HAFbAgICwACaBgAAAJY2XwAAAMAAmhYAAACHF2ECXwAAYMAA5JRfAAAAAF8AAAE+A07AAJpKwACaTgAAl2ZgwAD70AEWwACaVS5hwAD8o0XAAJphAcAAmmrAAJpsAABiYMAA+9ABkwEcwACac4PAAJpxwGqh/WMBAAGCwACadcBqodoAwAD8/QGLwACafMBqof0cwACaeoPAAJp8wGqh/WQBAAGUAMAA/PU+AT2IwACah8Bqoa4cwACanYHAAJqWwGqhuyACAAKAwACansBqoa4cwACasC5LAQABg8AAmrHAaqH9AMAA/IMAAErAAJrAAYDAAJrHwGqhrgbAANjygnPAAJrcwACa6MAAmzUAAICrAAAAAQPAAJruwACbNQAAAQAAgnZgwAD9HAFbAQEBwACa8QAAAIGmYQFgwADklF8AAAAAXcAA/DIBXwAAAUrAAJsOAR7AAJsSwADM1gICYMAA5JRfAAACLoDAAJszwGqi1wAGwADY84JzwACbOsAAm0bAAJugAACEiQAAAAEDwACbT8AAm6AAAAEAAIJ2YMAA/RwBWwEBAcAAm1wAAACBpmEBYMAA5JRdwAD8MgFfAAAAAF3AAPwyAV8AAAFKwACbeQEfwACbfcAAzRsCAmDAAOSUXwAAAi6AwACbnsBqo1AABsAA2PSCc8AAm6XAAJuqwACcSAAAljAAAAABA8AAm6/AAJxIAAAAAQEBwACbtQAAAIGmYQFgwADklGDAAPoKAABgwAD6CgE+A07AAJvTwACb1wAAl2ZgwAD70AEWwACb3i5hwAD8o0XAAJvqAcAAm/PAAJv1AABiYMAA+9ABkwEcwACb/ILAAJv6wGqkB2MBAAGBwACb/sBqo+QAwAD8/QGKwACcBcBqpAccwACcA4LAAJwFwGqkB2QBAAGUAMAA/PU+AUnAAJwQIRzAAJwWgMAAnBXAaqPEIAEAARzAAJwbLksBAAGCwACcHMBqpAcAwAD8gwAASsAAnCEBKj9KwACcOQEpBsAA2PWCc8AAnE3AAJxSwACc7QAAgdQAAAABA8AAnFXAAJztAAAAAQEBwACcWwAAAIGmYQFgwADklGDAAPoKAABgwAD6CgE+A07AAJx5wACcfQAAl2ZgwAD70AEWwACchC5hwAD8o0XAAJyQAcAAnJnAAJybAABiYMAA+9ABkwEcwACcooLAAJygwGqlDGMBAAGBwACcpMBqpOkAwAD8/QGKwACcq8BqpQwcwACcqYLAAJyrwGqlDGQBAAGUAMAA/PU+AUnAAJy2HMAAnLuAwACcusBqpMkgAQABHMAAnMAuSwEAAYLAAJzBwGqlDADAAPyDAABKwACcxgEpP0rAAJzdASoGwADY9oJzwACc8sAAnPrAAJ4ZAACWNAAAAAEDwACdBMAAnhkAAAACAQHAAJ0KAAAAlvlhAWDAAOSUYMAA+goAAcAAnSoAACCWNWEAYMAA5JQBagBgwAD82XdgwADklAE+BE7AAJ0/wACdQwAAl2ZgwAD70AEWwACdSi5hwAD8o0XAAJ1WAcAAnV/AAJ1hAABiYMAA+9ABkwEcwACdaIPAAJ1mwGqmKWMBAAGCwACdasBqpgYAwAD8/QGLwACdccBqpikcwACdb4PAAJ1xwGqmKWQBAAGUAMAA/PU+Ak7AAJ2AwACdiAAAliBgwADklAEcwACdji5LAQABg8AAnY/AaqYpAMAA/INJwACdmRzAAJ2hgMAAnZ3AaqXNIAEAAYTAAJ2iwGqmgQAASsAAnawBhMAAnbPAaqaBP0nAAJ3GIRzAAJ3RgcAAncrAaqXkSAEAASsAwAD9KUrAAJ3aARzAAJ3ngcAAneHAaqXkIAAAAAAAPz0wwACd7x7AAJ4KwADN8gAAAAAGwADY94JzwACeHsAAnibAAJ9bAACWOQAAAAEDwACeL8AAn1sAAAACAQHAAJ41AAAAlvlhAWDAAOSUYMAA+goAAcAAnlUAACCWNWEAYMAA5JQBagBgwAD82XdgwADklAE+BE7AAJ5qwACebgAAl2ZgwAD70AEWwACedS5hwAD8o0XAAJ6BAcAAnorAAJ6MAABiYMAA+9ABHMAAnpKCwACejsBqp4yBjQEAAZQAwAD89gEcwACemYPAAJ6XwGqnr4FtAQABkwDAAP0AAYvAAJ6hwGqnrxzAAJ6fg8AAnqHAaqevgY0BAAGUAMAA/PY+Ak7AAJ6wwACeuAAAliBgwADklAEcwACevi5LAQABg8AAnr/AaqevAMAA/INJwACeyRzAAJ7RgMAAns3AaqdTIAEAAYTAAJ7SwGqoGQAAPgFKwACe5gGEwACe7cBqqBk/ScAAnwghHMAAnxOBwACfDMBqp2pIAQABKwDAAP0pSsAAnxwBHMAAnymBwACfI8Bqp2ogAAAAAAA/PTDAAJ8xHsAAn0zAAM3yAAAAAAbAANj4gnPAAJ9gwACfaMAAoW4AAJY8AAAAAQPAAJ9zwAChbgAAAAIBAcAAn3kAAACW+WEBYMAA5JRgwAD6CgABwACfmQAAIJY1YQBgwADklAFqAGDAAPzZd2DAAOSUAT4HTsAAn67AAJ+1AACBdlsBK07AAJ/GwACf1AAAwABxYWDAAPoKASpOwACf5cAAn+kAAJdmYMAA+9ABFsAAn/AuYcAA/KNFwACf/AHAAKAFwACgBwAAYmDAAPvQAZMBHMAAoA6FwACgDMBqqW9jAQABhMAAoBDAaqlMAMAA/P0BjcAAoBfAaqlvHMAAoBWFwACgF8BqqW9kAQABlADAAPz1PgJOwACgJsAAoC4AAJYgYMAA5JQBHMAAoDQuSwEAAYXAAKA1wGqpbwDAAPyDScAAoD8cwACgR4DAAKBDwGqo7SABAAGGwACgSMBqqccAAD4DScAAoFyDwACgYMBqqTY+AT0wwACgex7AAKCWwADN8wAAAAA/PYrAAKCzwGqpJobAAKC8wGqpxz2LwACgzcBqqTYpP0nAAKD1g8AAoPnAaqk2SsAAoQgBJsAAoQgBgsAAoQ/AaqkmYMAA5JQ/ScAAoRshHMAAoSaBwAChH8BqqQRIAQABKwDAAP0pSsAAoS8BHMAAoTyBwAChNsBqqQQgAAAAAAA/PTDAAKFEHsAAoV/AAM3yAAAAAAbAANj5gnPAAKFzwAChe8AAoawAAJYzAAAAAQPAAKGEwAChrAAAAAEBAcAAoYkAAAAnYMAA+9AAAGDAAOSUAT4BSsAAoZYBHMAAoaEuSwEAAYDAAKGiwGqq9wDAAPyDBsAA2PqCc8AAobHAAKG2wACiEgAAVgAAAAEDwAChucAAohIAAAABAQHAAKHCAAAggJZgwADklAAAXAE+AT0wwAChzx/AAKHZwAD7YgEAASfAAHX1AAbAANj7gnPAAKIXwACiHMAAooUAAIClAAAAAQPAAKIiwACihQAAAAEBAcAAojUAACCAll3AAPwyAWDAAOSUAABcAT4BPTDAAKJCH8AAokzAAPtiAQABJ8AAdfUABsAA2PyCc8AAoorAAKKPwACi/gAAnsoAAAABA8AAopXAAKL+AAAAAgICwACimgAAACdgwAD70ADAAKKpAAAggJZgwADklAAAXAE+AT0wwACith/AAKLAwAD7YgEAASfAAHiZAAbAANj9gnPAAKMDwACjCMAAo4UAAJ/EAAAAAQPAAKMRwACjhQAAAAICAsAAoxYAAAAnYMAA+9AAwACjLwAAICldwAD8MgFgwADklAAAXAE+AT0wwACjPR/AAKNHwAD7YgEAASfAAHiZAAbAANj+gnPAAKOKwACjj8AApCwAAICuAAAAAQPAAKOTwACkLAAAAAEAAcAAo5kAAACbGWECYMAA5JRgwADklGDAAPvQAWoAYMAA/Nl3AFwBPgJJwACjvxzAAKPLgMAAo8PAaqzUSAEAASsAwAD9KT4BPTDAAKPcJ8AAeKM/PR7AAKQVwADOiAIBYMAA5JQCLoDAAKQgwGqs1AAGwADY/4JzwACkMcAApDXAAKU0AACAuwAAAAEDwACkPMAApTQAAAACAQLAAKRFAAAgliBgwADklADAAKRTAAAAamDAAPvQAWrAAKRbYMAA+9AJAGDAAPvQAT4DScAApGUcwACkb4HAAKRpwGqtfYFtAQABFsAApHcuYcAA/KMAwAD9AD4BSsAApIcBHMAApI6UgcQAAAAAwAD780nAAKSdHMAApKeBwACkocBqrX1jAQABkwDAAPz9PgE9icAApLTAaq19kz9FwACkyQHAAKTSwACk1AAAYmDAAPvQAYHAAKTWwGqtfQEcwACk34LAAKTdwGquEGMBAAEWwACk5i5hwAD8owDAAPz9AYrAAKTuwGquEBzAAKTvgsAApO7Aaq4QZAEAAZQAwAD89T4BScAApPscwAClBxzAAKUDLksBAAGCwAClBMBqrhAAwAD8g0gBAAGAwAClCsBqrW4AwAD9KUrAAKUTAYLAAKUawGquED9KwAClJwEcwAClLpSBxAAAAADAAPvzBsAA2QCCc8AApTnAAKU9wACmWQAAlloAAAABA8AApUjAAKZZAAAAAgECwAClUQAAIJYgYMAA5JQAwAClXwAAAGpgwAD70AFqwAClZ2DAAPzZdwBgwAD70AE+A0nAAKV0IhzAAKV+gcAApXjAaq8ESAEAASsAwAD88wEcwAClj4HAAKWJwGqvBIFtAQABFsAApZcuYcAA/KMAwAD9AD4BPYnAAKWnwGqvBBzAAKW7FsAApbQuYcAA/KOBjQEAAZQAwAD89knAAKXLHMAApdWBwAClz8BqrwRjAQABkwDAAPz9PgFKwACl4gEcwACl6ZSBxAAAAADAAPvzP0XAAKX3AcAApgDAAKYCAABiYMAA+9ABgcAApgTAaq8EARzAAKYNgsAApgvAaq/LgW0BAAGTAMAA/QABisAAphPAaq/LHMAAphSCwACmE8Bqr8uBjQEAAZQAwAD89j4BScAApiAcwACmLBzAAKYoLksBAAGCwACmKcBqr8sAwAD8g0gBAAGAwACmL8BqrvUAwAD9KUrAAKY4AYLAAKY/wGqvyz9KwACmTAEcwACmU5SBxAAAAADAAPvzBsAA2QGCc8AApl7AAKZmwACmwQAAhhEAAAABA8AApnDAAKbBAAAAAAAAAGDAAOSUAT4BPTDAAKZ5H8AApoPAAPtiAQABJ8AAdfYABsAA2QKCc8AApsbAAKbOwACnMAAAn8MAAAABA8AAptbAAKcwAAAAAQEBwACm2wAAACdgwAD70AAAYMAA5JQBPgE9MMAApugfwACm8sAA+2IBAAEnwAB19gAGwADZA4JzwACnNcAApzrAAKewAACW+AAAAAEDwACnRcAAp7AAAAABAQHAAKdLAAAAlvlhAWDAAOSUYMAA+goAAFwBPgE9MMAAp2gfwACncsAA+2IBAAEnwAB19gAGwADZBIJzwACntcAAp7rAAKgwAACW+wAAAAEDwACnxcAAqDAAAAABAQHAAKfLAAAAlvlhAWDAAOSUYMAA+goAAFwBPgE9MMAAp+gfwACn8sAA+2IBAAEnwAB19gAGwADZEIJzwACoNcAAqEHAAKibAQCDGQAAAAEDwACoR8AAqJsAAAAAAAAAYMAA5JQBPgJJwACoTRzAAKhYFsAAqFEuYcAA/KOAlwEAAZMAwAD8/0rAAKhdARzAAKhoLksBAAGTAMAA/IM/PTDAAKhxHsAAqIzAAM3yAAAAAAbAANkRgnPAAKigwACorMAAqQ4BAIHoAAAAAQPAAKixwACpDgAAAAAAAABgwADklAE+AknAAKi3HMAAqMIWwACouy5hwAD8o4CXAQABkwDAAPz/SsAAqMcBHMAAqNIuSwEAARzAAKjaFsAAqNMuYcAA/KOBjQEAAZQAwAD89gDAAPyDPz0wwACo5B7AAKj/wADN8gAAAAAGwADZEoJzwACpE8AAqR/AAKm2AQCAwwAAAAEDwACpJsAAqbYAAAAAAAAAYMAA5JQBPgNJwACpLBzAAKk3FsAAqTAuYcAA/KNIAQABlADAAPzzSsAAqT0BHMAAqUguSwEAAZMAwAD8gz9JwACpURzAAKlcFsAAqVUuYcAA/KNIAQABkwDAAPzzPTDAAKliHsAAqX3AAM3yAAAAAD89MMAAqY4ewACpqcAAzfMAAAAABsAA2QWCc8AAqbvAAKnHwACqtAAAgVgAAAABA8AAqc7AAKq0AAAAAgECwACp0wAAAGpgwAD70ADAAKnfAAAAgoxgwAD70AFqAGDAAPzZdwBgwADjWAE+BT2JwACp68Bqs9cewACp/MAA+xEDAAOAwACqDMBqs8mBwACqE8Bqs9cWwACqHS5hwAD8owBOwACqLsAAqjUAAGFgwAD70AEcwACqO4HAAKo3wGqz14GNAQABgMAAqj3AarPJAMAA/PZOwACqVMAAqlsAAIF2YMAA41gBHMAAql0uwAB4nMAA03YBAAGCwACqacBqtCwAwADUZD0cwACqfYPAAKp2wGq0X4NeBAAEk4LAAKqJwGq0LC6AwACql8Bqs8kAwAD8mUrAAKqjAYPAAKqqwGq0XwbAANkGgnPAAKq5wACqvsAAqz0AAJ/GAAAAAQPAAKrEwACrPQAAAAICAsAAqskAAAAnYMAA+9AAwACq4gAAIIPMXcAA/DIBYMAA5JQAAFwBPgJOwACq+MAAqvwAAYKMYMAA+9ABHMAAqw4WwACrB4HAAKr+wGq1BGHAAPxVZAEAAYDAAKsQwGq09gDAAPz1PRzAAKsbLoNeAwADgMAAqyTAarT2gsAAqyvAarUfgcAAqzDAarUEAMAA1G0GwADZB4JzwACrQsAAq0fAAKwAAACbqQAAAAEDwACrUMAArAAAAAADAgPAAKtVAAAAamDAAPvQAMAAq2AAAACCjGDAAPvQAMAAq24AACDAAEL0YMAA5JQBagBgwAD82XcAXAE+Aj0ewACri8AA+xEDAAOAwACrm8BqtbGBwACrosBqtb8WwACrrC5hwAD8owBFwACruQHAAKvCwACrxAAAYmDAAPvQAYDAAKvGwGq1sQEcwACrz4PAAKvNwGq2HWMBAAGBwACr0cBqtb8AwAD8/QGLwACr2MBqth0cwACr1oPAAKvYwGq2HWQBAAGUAMAA/PU+AT0cwACr5y6AvwIAAoPAAKvowGq2HYLAAKvtwGq1zgDAAPyEAABqiIkAaoj5AGqJLABqiV0AaomOAGqJ0wBqiioAaoqYAGqK9ABqi4IAaowqAGqNcwBqjvAAapA2AGqRNgBqkscAapqVAGqbBABqm20AapvcAGqcRQBqnLQAap0EAGqdWQBqng0Aap5cAGqe0wBqnyUAaqAOAGqheQBqoqIAaqMbAGqjmgBqpJ8AaqWjAGqnKQBqqMMAaqrNAGqrLABqq4EAaqvdAGqsQQBqrKoAaq1EAGquywBqsH4AarDJAGqxIgBqsX8AarHcAGqyWQBqsvAAarOfAGq0zABqtYcAarafAAAANwLAANkWgnPAAT9UwAE/dMABQ4oDwAB5JAFqwAE/VWDAAPnRwAFwvgABYMAA2NgAAWDAAONYAAAIBsAA2RmCc8ABP87AAT/WwAFAEgQBwAB2e8AA03YAAAABA8ABP/LAAUASAAAAAAAAAGDAANkWAT4BPTDAAT/7J8AAYSQGwADZG4JzwAFAF8ABQFTAAUDyAwBLAWrAAUAYYMAA+dHAAYvBAAABA8ABQFbAAUDyAAAAAQEBwAFAWwAAACdgwAD70AAAYMAA5JQBPgJJwAFAaCIcwAFAcoDAAUBswGq4N2MBAAGTAMAA/P0BHMABQH+AwAFAecBquDeBbQEAARbAAUCCLmHAANT1AMAA/QA+AT0wwAFAkh/AAUCcwAD7JgMAA4DAAUCtwGq4Ny4nJwA/SsABQM4BHMABQNUuwAB5JcAA03YBAAGAwAFA6MBquDcAwADZHwbAANkcgnPAAUD3wAFBBcABQbMDAIC/AAAAAQPAAUEIwAFBswAAAAICAsABQQ0AAAAnYMAA+9AAwAFBHAAAIICWYMAA5JQAAFwBPgJJwAFBKSIcwAFBM4DAAUEtwGq5AWMBAAGTAMAA/P0BHMABQUCAwAFBOsBquQGBbQEAARbAAUFDLmHAANT1AMAA/QA+AT0wwAFBUx/AAUFdwAD7JgMAA4DAAUFuwGq5AS4nJwA/PRzAAUGPLsAAeSbAANN2AgACgMABQaLAarkBgcABQanAarkPAMAA2SAGwADZI4JzwAFB7cABQfXAAUI0AQDAAG5rAAAAAQPAAUIIwAFCNAAAAAAAAABgwAD70AE+AUrAAUIOAWrAAUIhYMAA+9CDUQbAANkegnPAAUJYwAFCZMABQqQAAMAAeJzAANN2AAAAAQPAAUJvwAFCpAAAAAEBAcABQnQAAABhYMAA+9AAAGDAAONYAT4BSsABQoIBHsABQo3AAONcAQABgMABQpnAaronAAbAANkfgnPAAUKpwAFCscABQxAAAMAAeSXAANN2AAAAAQPAAULDwAFDEAAAAAEBAcABQsgAAAAnYMAA+9AAAGDAAOSUAT4BSsABQtUBHMABQtwuwAB448AA03YBAAEcwAFC7oDAAULowGq6ioOIAQABasABQvxgwAD70INRAMAA/PcAwADVDgbAANkggnPAAUMVwAFDGsABQ4gAAMAAeSbAANN2AAAAAQPAAUMswAFDiAAAAAICAsABQzEAAAAnYMAA+9AAwAFDQAAAAICWYMAA5JQAAFwBPgE9HMABQ00uwAB45cAA03YCAAIcwAFDX4DAAUNZwGq7EYOIAQABasABQ21gwAD70INRAMAA/PeBwAFDfsBqux8AwADVDwbAANkhgnPAAT90wAE/dAAAEJ+8AMAA05nAANOZAQMAAAAAAAMDAwAAAABqYMAA+9AAAAAAAIKMYMAA+9AAAAAAIIPMXcAA/DIBWwAAXAFKAAEdAJ+8AwADgADAaruegQDAarupggDAaru1AMAA05kAAGq3vABquAAAarjXAGq5sABqufcAarpaAGq64QBqu3cAarvnAAAACALAANkkgnPAAUTcwAFE/MABSTo3wAB5JwAAAWDAANTvAAFgwADUlQABBcAA2VUAAAAABAAAAwAAAAAAAAAAAGDAANkkAT8BCQAAwADVFAAAAAA3BsAA2SaCc8ABRPzAAUT8AAAQn7wAwADTmcAA05kBAwAAAAAAAwMDAAAAAGpgwAD70AAAAAAAgoxgwAD70AAAAAAgg8xdwAD8MgFbAABcAUoAAR0An7wDAAOAAMBqvIqBAMBqvJWCAMBqvKEAwADTmQbAANlXgnPAAKxHwACsT8AArGEBAsAAbmsAAAABA8AArGHAAKxhAAAAAAAAAGDAAPvQAAbAANlYgnPAAKxlwACsbcAArHoBAqhuAAAAAQPAAKx6wACsegAAAAAAAABgwAD70AAGwADZWYJzwACsfsAArI7AAKyUAQKCiwAAAAEDwACslMAArJQAAAAAAAAAYMAA1NIABsAA2SiCc8AArJnAAKynwACsvgACwAB4nMAA03YAAAABA8AArLLAAKy+AAAAAQEBwACstwAAAGFgwAD70AAAYMAA42IABsAA2SmCc8AArMPAAKzPwACs/wAAlkAAAAABA8AArNvAAKz/AAABAACCdmDAAP0cAVsAAAAAXcAA/DIBXwAAAUrAAKzhAR/AAKzlwADN5QEBXwAAAS4ABsAA2SqCc8AArQTAAK0YwACthAAAljcAAAABA8AArSLAAK2EAAAAAQEBwACtNwAAIIPWXcAA/DIBYMAA5bUAAF3AAPwyAWDAAOW1AUrAAK1HAR7AAK1LwADNvQIBYMAA5bUCLoDAAK1+wGq+LgAGwADZK4JzwACticAArZHAAK2/AACWMgAAAAEDwACtmMAArb8AAAEAAJbzYMAA/RwBWwAAAABdwAD8dAFfAAABSsAArZ4BHsAAraPAAPx/AQJgwADltV8AAAEuAAbAANlggnPAAK3DwACtzMAArjsCAIMZAAAAAQPAAK3RwACuOwAAAAEBAcAArdwAACCAlmDAAOW1AABcAT4CScAArekcwACt+RbAAK3yLmHAAPyjSAEAAZMAwAD88z0wwACt/x/AAK4JwAD7JgIAApMuAD89HMAAriwugL8CAAKTgMAArjLAar74AMAA/IQGwADZYYJzwACuQMAArknAAK7FAgCB6AAAAAEDwACuTcAArsUAAAABAQHAAK5YAAAggJZgwADltQAAXAE+AknAAK5lHMAArnUWwACubi5hwAD8o0gBAAGTAMAA/PM9MMAArnsfwACuhcAA+yYCAAKTLgA/PRzAAK6oLoC/AgACHMAArrUWwACuri5hwAD8o4GNAQABlADAAPz2gMAArrzAar+GAMAA/IQGwADZLIJzwACuysAArs7AAK+NAACfwQAAAAEDwACu2MAAr40AAAACAQLAAK7eAAAAlvlhAWDAAOW1YMAA+goAwACu/AAAAGpgwAD70AFqwACvBGDAAPvQCQBgwAD70AE+A0nAAK8OHMAArxiBwACvEsBqwERjAQABkwDAAPz9PYnAAK8dwGrARJM/RcAArywBwACvNcAArzcAAGJgwAD70AGBwACvOcBqwEQBHMAAr0KCwACvQMBqwJVjAQABFsAAr0QuYcAA/KMAwAD8/QGKwACvTMBqwJUcwACvTYLAAK9MwGrAlWQBAAGUAMAA/PU+AUnAAK9ZHMAAr2GAwACvXcBqwC4gAQABHMAAr2YuSwEAAYLAAK9nwGrAlQDAAPyDAABKwACvbAGCwACvc8BqwJU/SsAAr4ABHMAAr4eUgcQAAAAAwAD78wbAANktgnPAAK+SwACvlsAAsHsAAJ/CAAAAAQPAAK+kwACwewAAAAIBAsAAr6oAAACW+WEBYMAA5bVgwAD6CgDAAK/IAAAAamDAAPvQAWoAYMAA/Nl3AGDAAPvQAT4DScAAr9YiHMAAr+CBwACv2sBqwY1IAQABKwDAAPzzARzAAK/xgcAAr+vAasGNgW0BAAEWwACv+S5hwAD8owDAAP0APYnAALABwGrBjRzAALAVFsAAsA4uYcAA/KOBjQEAAZQAwAD89j9FwACwHgHAALAnwACwKQAAYmDAAPvQAYHAALArwGrBjQEcwACwNILAALAywGrCGoFtAQABkwDAAP0AAYrAALA6wGrCGhzAALA7gsAAsDrAasIagY0BAAGUAMAA/PY+AUnAALBHHMAAsE+AwACwS8BqwXcgAQABHMAAsFQuSwEAAYLAALBVwGrCGgDAAPyDAABKwACwWgGCwACwYcBqwho/SsAAsG4BHMAAsHWUgcQAAAAAwAD78wbAANkugnPAALCAwACwmcAAsXgDAGQAAAABA8AAsJrAALF4AAAAAQEBwACwqwAAIIPWXcAA/HQBYMAA5bUAAF3AAPx0AWDAAOW1AT4CTsAAsLzAALDIAACDWGDAAPvQARzAALDWFsAAsM8uYcAA/KNkAQABFsAAsN6AwACw2MBqwvNhwAD8owDAAPz1SsAAsOoBNcAAsPwAAAEAXcAA/HQBYMAA5bUBMcAAsPxgwADltQA1AAAAAQBbARfAALEHgsAAsQXAasNdYYHAALEQwGrDGMAA/KE1AAAAAQBbARzAALEkgsAAsSLAasNdg14DAAOTFsAAsTUuYcAA/KMuAMAA/Jk1AAAAAQBbARzAALFLgsAAsUnAasNdg14DAAMWwACxWS5hwAD8o4HAALFhwGrDGIDAALFuwGrC8wDAAPyZggDAasNdBsAA2S+Cc8AAsX3AALGCwACyIQAAgxcAAAABA8AAsYrAALIhAAAAAQEBwACxkgAAAJYgYMAA/RwAAGDAAPoKAT4DTsAAsaXAALGpAACXZmDAAPvQARbAALGwLmHAAPyjRcAAsbwBwACxxcAAsccAAGJgwAD70AGTARzAALHOgsAAsczAasR2YwEAAYHAALHQwGrEUwDAAPz9AYrAALHXwGrEdhzAALHVgsAAsdfAasR2ZAEAAZQAwAD89T4BScAAseIcwACx7hzAALHqLksBAAGCwACx68BqxHYAwAD8g0gBAAGAwACx8cBqxDoAwAD9KUrAALH6ASk/SsAAshEBKgbAANkwgnPAALImwACyK8AAsxQAAJ+wAAAAAQPAALIywACzFAAAAAEAAcAAsjsAAACfsWDAANA4AWoAYMAA/Nl3AFwBPgM9IxzAALJRgMAAskrAasU6SAEAASsAwAD9KYjAALJKwGrFOh7AALJZwADQOgAAAAArAWDAANA4TsAAsmvAALJtAABiYMAA+9ABFsAAsnQuYcAA/KNDwACygBzAALKJgcAAsofAasWOgJcBAAGUAMAA/P8+BU7AALKawACyngAAn7JgwAD70AEcwACyp4DAALKgwGrFOp+zAQABgcAAsq/AasWOAMAA0D09icAAsrnAasWOHMAAsruBwACyucBqxY6BjQEAAZQAwAD89k7AALLLwACyzwAAn7RgwADltQEcwACy1S5LAQABgcAAstbAasWOAMAA/IM9HMAAsuQugL8CAAKBwACy5cBqxY4cwACy7i5LAQABgsAAsu/AasXLAMAA/IMAwAD8hD0cwACy/y6AvwIAAoLAALMAwGrFy4PAALMHwGrGIgDAAPyEBsAA2TGCc8AAsxnAALMewAC8BwAAg14AAAABA8AAsybAALwHAAAABAMEwACzKwAAAGpgwAD70ADAALM2AAAAgoxgwAD70ADAALNPAAAglihdwAD8MgFgwADltQDAALNgAAAAn7lgwAD70AFqwACzbGDAAPvQCQBcAT4LScAAs4siIhzAALORk4CXAQABgMAAs5PAasbLAMAA/P8BHMAAs6KAwACznMBqxsuAlwEAAYHAALOkwGrG2QDAAPz/ARzAALOvgcAAs6vAasbZgJcBAAEWwACzsS5hwAD8owDAAPz/PgI9HsAAs8zAAPsRAwADgMAAs9zAasbLgcAAs+PAasbZFsAAs+guYcAA/KMAQCrAALQQwAC0FQA/ScAAtCIcwAC0MIPAALQmwGrG/WMBAAGTAMAA/P0+AT0wwAC0PR/AALROwAD7GgQABIPAALRUwGrG/ZMrJ5+5AD9OwAC0h8AAtI0AAYDuYMAA+9ABHMAAtJOBwAC0j8BqxtmBjQEAAYDAALSVwGrGywDAAPz2ScAAtKAcwAC0vhzAALSxFsAAtKqCwAC0pcBqxuhhwAD8VYGNAQABg8AAtLPAasb9AMAA/PZjAQABhMAAtMDAasf9AMAA/P0+AT0wwAC0zx7AALTqwADN9AAAAAA/ScAAtP8cwAC1CYTAALUDwGrH/UgBAAGTAMAA/PNKwAC1DwA/ScAAtRwlwAC1JYLAALUgwGrG6GDAANOMPgJOwAC1ssAAtcIAAcAAeJ1gwADTjAEmwAC1yQCCwAC1xMBqxuhgwADTjEnAALXiHMAAtf4WwAC16y7AAG5rwADUl0gBAAEWwAC2EYXAALYBwGrIzMAAbmvAANOPAMAA/PM+AUnAALYvIhzAALY6hMAAtjTAasf9YwEAATcKAMAA/P0AIRzAALZbFsAAtlSFwAC2RMBqyMyCi8AA05FIAQABFsAAtmMugovAANSZAMAA1N0+Aj0ewAC2fsAAyugFAAUmwAC2iACCwAC2g8BqxuhdwAD8dAFgwADltYPAALacwGrG/S6AwAC2rcBqxsuEwAC2tMBqx/0ASsAAtsYAScAAtt0cwAC28xbAALbtFsAAtuYugovAANSZtpfAANN2wADU1cAAbmrAANN2BgAGHMAAtyUcwAC3EIDAALcKwGrGy4OIAQABFsAAtxIuwABua8AA1JcAwAD892QBAAEWwAC3LC6obsAA1JgAwAD89RzAALdNhMAAt0fAasf9g4gBAAEWwAC3Ty7AAG5rwADUlwDAAPz3FsAAt4YWwAC3f4XAALdvwGrIzIKLwADTkbaXwADTdsAA1NUcwAC3uBzAALejg8AAt5nAasb9g4gBAAEWwAC3pS7AAG5rwADUlwDAAPz3ZAEAARbAALfKhcAAt7rAasjMqG7AANOQAMAA/PUewAC37cAAyvUBAAEuAB7AALgOwADK9QEAAYLAALgUwGrG6AAAwADTnD4BSsAAuCgAP0nAALhHHMAAuGIWwAC4W4XAALhLwGrIzIKLwADTkUgBAAEWwAC4ai6Ci8AA1JkAwADU3T4FTsAAuUDAALlLAAHAAHieXcAA/HQBYMAA5bUBJsAAuVIAgsAAuU3AasboXcAA/HQBYMAA5bVOwAC5dMAAuX8AAcAAeJ9gwADjYgEcwAC5gS7AAHicwADTdgEAAYTAALmNwGrH/QDAANShRcAAuZ0BwAC5psAAuagAAGJgwAD70AGTARzAALmvFMAAua3AasufCABjAQABhMAAubHAasf9AMAA/P0BFcAAubjAasufCBzAALm5FMAAubjAasufCABkAQABlADAAPz1PgE9HMAAudOHwAC5ycBqy2aAvwIAAhTAALnUwGrLnwgAHMAAueOGwAC52cBqyzFLAQABHMAAue6DwAC55MBqxv1kAQABFMAAufDAasufCAAAwAD89QDAAPyDAMAA/IRFwAC6BgHAALoPwAC6EQAAYmDAAPvQAYDAALoTwGrGywEcwAC6HBTAALoawGrMXggAYwEAAYHAALoewGrG2QDAAPz9ARXAALojwGrMXggcwAC6JBTAALojwGrMXggAZAEAAZQAwAD89T4BPRzAALo4LoC/AgACFMAAujnAasxeCAAcwAC6SIfAALo+wGrLZksBAAEcwAC6SxTAALpJwGrMXggAgY0BAAGAwAC6TcBqxssAwAD89gDAAPyDAMAA/IRKwAC6ZwA/P07AALqHAAAAn7pdwAD8dAFbAE7AALqaAAAAn7tgwAD70ABJwAC6qiXAALqzgsAAuq7AasboXcAA/HQBYMAA5bU+Aj2NwAC6z8BqzSEUwAC628BqxugCAV3AAPx0AWDAAOW1PY7AALrnwGrNM4PAALr0wGrG/T4CPY3AALsSwGrNIRzAALszHMAAuyOCwAC7HsBqxuiWKQEAAYPAALsowGrG/QDAAPxMgK0BAAABhVgqwAD8SD2OwAC7UsBqzTOTScAAu2wcwAC7gxzAALt7hsAAu3DAas0zZAEAAYTAALt9wGrH/QDAAPz1gJcBAAEWwAC7j4XAALuFwGrNIWHAAPyjAMAA/P8+AT0wwAC7nx7AALu6wADN9AAAAAA/PR7AALvUwADK6AUABYXAALvZwGrNIYbAALvkwGrNMy6AwAC79sBqxsuEwAC7/cBqx/0ABsAA2TKCc8AAvAzAALwgwAC8bwAAgaUAAAABA8AAvCXAALxvAAAAAQEBwAC8KwAAAIGmYQFgwADltWDAAPoKAABdwAD8MgFgwADltQFKwAC8SgEfwAC8TsAAzQcCAWDAAOW1Ai6AwAC8bcBqzpkABsAA2TOCc8AAvHTAALyIwAC8wQAAlj4AAAABA8AAvIzAALzBAAAAAQEBwAC8kQAAAIOjYMAA+9AAAF3AAPwyAWDAAOW1AUrAALyXAR/AALybwADMwgMBYMAA5bUDLpOAwAC8v8BqzwgABsAA2TSCc8AAvMbAALzawAC9NwAAlj8AAAABA8AAvOPAAL03AAAAAQEBwAC86QAAAJb5YQFgwADltWDAAPoKAABdwAD8MgFgwADltQFKwAC9CwEfwAC9D8AAzU0CAWDAAOW1Ai6AwAC9MsBqz3EABsAA2TWCc8AAvTzAAL1QwAC9kgAAlikAAAABA8AAvVTAAL2SAAAAAQEBwAC9WQAAAIOjYMAA+9AAAF3AAPwyAWDAAOW1AUrAAL1lAR/AAL1pwADMwgMBYMAA5bUDLoDAAL2KwGrP4CsABsAA2TaCc8AAvZfAAL2rwAC+CAAAlj0AAAABA8AAvbTAAL4IAAAAAQEBwAC9ugAAAJb5YQFgwADltWDAAPoKAABdwAD8MgFgwADltQFKwAC93AEfwAC94MAAzYUCAWDAAOW1Ai6AwAC+A8Bq0EkABsAA2VqCc8AAvg3AAL4lwAC+WgEAmIIAAAABA8AAvi7AAL5aAAAAAAAAAF3AAPwyAWDAAOW1AUrAAL4xAR/AAL41wADOcwEBYMAA5bUBLgAGwADZN4JzwAC+X8AAvnPAAL6eAACcYgAAAAEDwAC+eMAAvp4AAAAAAAAAXcAA/KUCYMAA+9BgwADltQFKwAC+fgEfwAC+gsAAzmkBAWDAAOW1AS4ABsAA2TiCc8AAvqPAAL63wAC/UAAAn7YAAAABA8AAvr/AAL9QAAAAAgECwAC+xAAAAGpgwAD70ADAAL7QAAAAgoxgwAD70AFqAGDAAPzZdwBdwAD8MgFgwADltQE+Aj0ewAC+58AA+xEDAAOAwAC+98Bq0V2BwAC+/sBq0WsWwAC/CC5hwAD8owBKwAC/FQEfwAC/IMAAzMIDAWDAAOW1Ay6AwAC/QcBq0V2BwAC/SMBq0WsABsAA2VuCc8AAv1XAAL9twAC/oAEAXAAAAAEDwAC/dsAAv6AAAAAAAAAAXcAA/G0BYMAA5bUBSsAAv3kBH8AAv33AAN4rAQFgwADltQEuAAbAANk5gnPAAL+lwAC/tcAAwBYAAICtAAAAAQPAAL+7wADAFgAAAAEAAAHAAL/CAAAAhVhgwAD6CgFqwAC/zGDAAPoKdV3AAPx0AWDAAOW1AT4BSsAAv9kBHsAAv+TAAPx6AgFgwADltQEuAYVYgMAAwAnAatJhBsAA2TqCc8AAwBvAAMAqwADAYAAAlRMAAAABA8AAwC/AAMBgAAAAAAAAAF3AAP1nAWDAAOW1AT4BSsAAwDgBHsAAwEPAAMDkAQFgwADltQEuAAbAANk7gnPAAMBlwADAasAAwOgAAIP4AAAAAQPAAMBxwADA6AAAAAEBAcAAwHcAAACBpmEBYMAA5bVcAABcAT4CTsAAwJfAAMCbAACXZmDAAPvQARbAAMCiLmHAAPyjRcAAwK4BwADAt8AAwLkAAGJgwAD70AGTARzAAMDAgsAAwL7AatNkYwEAAYHAAMDCwGrTQQDAAPz9AYrAAMDHwGrTZBzAAMDIgsAAwMfAatNkZAEAAZQAwAD89T4BPRzAAMDVgMAAwNTAatMpIAEAARzAAMDaLksBAAGCwADA28Bq02QAwAD8gwAABsAA2TyCc8AAwO3AAMD3wADCCgAAljoAAAABA8AAwP3AAMIKAAAAAQEBwADBCAAAIIcXYQJgwADltWDAAOW1YMAA5bUAAGDAAOW1AT4FTsAAwT/AAMFDAACXZmDAAPvQARbAAMFKLmHAAPyjScAAwVYcwADBXoHAAMFawGrUN0gBAAGTAMAA/PM9MMAAwWQewADBf8AAzfIAAAAAP07AAMGUwADBmgAAgJZgwADltQEcwADBoC5LAQABkwDAAPyDRcAAwakBwADBssAAwbQAAGJgwAD70AGUARzAAMG7g8AAwbnAatSuYwEAAYHAAMG9wGrUNwDAAPz9AYvAAMHEwGrUrhzAAMHCg8AAwcTAatSuZAEAAZQAwAD89T4BPYrAAMHPwGrUhhzAAMHegMAAwdfAatQSIAIAAoLAAMHfwGrUhhzAAMHqLksBAAGDwADB68Bq1K4AwAD8gwAASsAAwfoBgsAAwgHAatSGBsAA2T2Cc8AAwg/AAMIRwADC7gAAg1kAAAABA8AAwhjAAMLuAAABAACCdmDAAP0cAVsCAgLAAMIbAAAAljZfAAAAwADCKwAAAIcXYQJfAABgwADltV8AAAAAXwAAAT4DTsAAwmHAAMJlAACXZmDAAPvQARbAAMJsLmHAAPyjRcAAwngBwADCgcAAwoMAAGJgwAD70AGTARzAAMKKg8AAwojAatXXYwEAAYLAAMKMwGrVtADAAPz9AYvAAMKTwGrV1xzAAMKRg8AAwpPAatXXZAEAAZQAwAD89T4BPYjAAMKewGrViBzAAMK0gcAAwq3AatWVIAIAAoDAAMK1wGrViBzAAMLHLksBAAGDwADCyMBq1dcAwAD8gwAASsAAwtcBgMAAwt7AatWIBsAA2T6Cc8AAwvPAAML/wADDUAAAgKsAAAABA8AAwwXAAMNQAAABAACCdmDAAP0cAVsBAQHAAMMIAAAAgaZhAWDAAOW1XwAAAABdwAD8MgFfAAABSsAAwycBHsAAwyvAAMzWAgJgwADltV8AAAIugMAAw07AataxAAbAANk/gnPAAMNVwADDYcAAw78AAISJAAAAAQPAAMNqwADDvwAAAQAAgnZgwAD9HAFbAQEBwADDdwAAAIGmYQFgwADltV3AAPwyAV8AAAAAXcAA/DIBXwAAAUrAAMOWAR/AAMOawADNGwICYMAA5bVfAAACLoDAAMO9wGrXKgAGwADZQIJzwADDxMAAw8nAAMRpAACWMAAAAAEDwADDzsAAxGkAAAABAQHAAMPUAAAAgaZhAWDAAOW1YMAA+goAAGDAAPoKAT4DTsAAw/TAAMP4AACXZmDAAPvQARbAAMP/LmHAAPyjRcAAxAsBwADEFMAAxBYAAGJgwAD70AGTARzAAMQdgsAAxBvAatfhYwEAAYHAAMQfwGrXvgDAAPz9AYrAAMQmwGrX4RzAAMQkgsAAxCbAatfhZAEAAZQAwAD89T4BScAAxDEhHMAAxDeAwADENsBq154gAQABHMAAxDwuSwEAAYLAAMQ9wGrX4QDAAPyDAABKwADEQgEqP0rAAMRaASkGwADZQYJzwADEbsAAxHPAAMUQAACB1AAAAAEDwADEdsAAxRAAAAABAQHAAMR8AAAAgaZhAWDAAOW1YMAA+goAAGDAAPoKAT4DTsAAxJzAAMSgAACXZmDAAPvQARbAAMSnLmHAAPyjRcAAxLMBwADEvMAAxL4AAGJgwAD70AGTARzAAMTFgsAAxMPAatjmYwEAAYHAAMTHwGrYwwDAAPz9AYrAAMTOwGrY5hzAAMTMgsAAxM7AatjmZAEAAZQAwAD89T4BScAAxNkcwADE3oDAAMTdwGrYoyABAAEcwADE4y5LAQABgsAAxOTAatjmAMAA/IMAAErAAMTpASk/SsAAxQABKgbAANlCgnPAAMUVwADFH8AAxkIAAJY0AAAAAQPAAMUpwADGQgAAAAIBAcAAxS8AAACW+WEBYMAA5bVgwAD6CgABwADFUwAAIJY1YQBgwADltQFqAGDAAPzZd2DAAOW1AT4ETsAAxWjAAMVsAACXZmDAAPvQARbAAMVzLmHAAPyjRcAAxX8BwADFiMAAxYoAAGJgwAD70AGTARzAAMWRg8AAxY/AatoDYwEAAYLAAMWTwGrZ4ADAAPz9AYvAAMWawGraAxzAAMWYg8AAxZrAatoDZAEAAZQAwAD89T4CTsAAxanAAMWxAACWIGDAAOW1ARzAAMW3LksBAAGDwADFuMBq2gMAwAD8g0nAAMXCHMAAxcqAwADFxsBq2acgAQABhMAAxcvAatpbAABKwADF1QGEwADF3MBq2ls/ScAAxe8hHMAAxfqBwADF88Bq2b5IAQABKwDAAP0pSsAAxgMBHMAAxhCBwADGCsBq2b4gAAAAAAA/PTDAAMYYHsAAxjPAAM3yAAAAAAbAANlDgnPAAMZHwADGUcAAx4oAAJY5AAAAAQPAAMZawADHigAAAAIBAcAAxmAAAACW+WEBYMAA5bVgwAD6CgABwADGhAAAIJY1YQBgwADltQFqAGDAAPzZd2DAAOW1AT4ETsAAxpnAAMadAACXZmDAAPvQARbAAMakLmHAAPyjRcAAxrABwADGucAAxrsAAGJgwAD70AEcwADGwYLAAMa9wGrbZoGNAQABlADAAPz2ARzAAMbIg8AAxsbAatuJgW0BAAGTAMAA/QABi8AAxtDAatuJHMAAxs6DwADG0MBq24mBjQEAAZQAwAD89j4CTsAAxt/AAMbnAACWIGDAAOW1ARzAAMbtLksBAAGDwADG7sBq24kAwAD8g0nAAMb4HMAAxwCAwADG/MBq2y0gAQABhMAAxwHAatvzAAA+AUrAAMcVAYTAAMccwGrb8z9JwADHNyEcwADHQoHAAMc7wGrbREgBAAErAMAA/SlKwADHSwEcwADHWIHAAMdSwGrbRCAAAAAAAD89MMAAx2AewADHe8AAzfIAAAAABsAA2USCc8AAx4/AAMeZwADJowAAljwAAAABA8AAx6TAAMmjAAAAAgEBwADHqgAAAJb5YQFgwADltWDAAPoKAAHAAMfOAAAgljVhAGDAAOW1AWoAYMAA/Nl3YMAA5bUBPgdOwADH48AAx+oAAIF2WwErTsAAx/vAAMgJAADAAHFhYMAA+goBKk7AAMgawADIHgAAl2ZgwAD70AEWwADIJS5hwAD8o0XAAMgxAcAAyDrAAMg8AABiYMAA+9ABkwEcwADIQ4XAAMhBwGrdSWMBAAGEwADIRcBq3SYAwAD8/QGNwADITMBq3UkcwADISoXAAMhMwGrdSWQBAAGUAMAA/PU+Ak7AAMhbwADIYwAAliBgwADltQEcwADIaS5LAQABhcAAyGrAat1JAMAA/INJwADIdBzAAMh8gMAAyHjAatzHIAEAAYbAAMh9wGrdoQAAPgNJwADIkYPAAMiVwGrdED4BPTDAAMiwHsAAyMvAAM3zAAAAAD89isAAyOjAat0AhsAAyPHAat2hPYvAAMkCwGrdECk/ScAAySqDwADJLsBq3RBKwADJPQEmwADJPQGCwADJRMBq3QBgwADltT9JwADJUCEcwADJW4HAAMlUwGrc3kgBAAErAMAA/SlKwADJZAEcwADJcYHAAMlrwGrc3iAAAAAAAD89MMAAyXkewADJlMAAzfIAAAAABsAA2UWCc8AAyajAAMmywADJ4wAAljMAAAABA8AAybvAAMnjAAAAAQEBwADJwAAAACdgwAD70AAAYMAA5bUBPgFKwADJzQEcwADJ2C5LAQABgMAAydnAat7RAMAA/IMGwADZRoJzwADJ6MAAye3AAMpLAABWAAAAAQPAAMnwwADKSwAAAAEBAcAAyfsAACCAlmDAAOW1AABcAT4BPTDAAMoIH8AAyhLAAPtiAQABJ8AAdfUABsAA2UeCc8AAylDAAMpVwADKwAAAgKUAAAABA8AAylvAAMrAAAAAAQEBwADKcAAAIICWXcAA/DIBYMAA5bUAAFwBPgE9MMAAyn0fwADKh8AA+2IBAAEnwAB19QAGwADZSIJzwADKxcAAysrAAMs7AACeygAAAAEDwADK0MAAyzsAAAACAgLAAMrVAAAAJ2DAAPvQAMAAyuYAACCAlmDAAOW1AABcAT4BPTDAAMrzH8AAyv3AAPtiAQABJ8AAeJkABsAA2UmCc8AAy0DAAMtFwADLxAAAn8QAAAABA8AAy07AAMvEAAAAAgICwADLUwAAACdgwAD70ADAAMtuAAAgKV3AAPwyAWDAAOW1AABcAT4BPTDAAMt8H8AAy4bAAPtiAQABJ8AAeJkABsAA2UqCc8AAy8nAAMvOwADMbwAAgK4AAAABA8AAy9LAAMxvAAAAAQABwADL2AAAAJsZYQJgwADltWDAAOW1YMAA+9ABagBgwAD82XcAXAE+AknAAMwCHMAAzA6AwADMBsBq4K5IAQABKwDAAP0pPgE9MMAAzB8nwAB4oz89HsAAzFjAAM6IAgFgwADltQIugMAAzGPAauCuAAbAANlLgnPAAMx0wADMeMAAzXkAAIC7AAAAAQPAAMx/wADNeQAAAAIBAsAAzIoAACCWIGDAAOW1AMAAzJgAAABqYMAA+9ABasAAzKBgwAD70AkAYMAA+9ABPgNJwADMqhzAAMy0gcAAzK7AauFXgW0BAAEWwADMvC5hwAD8owDAAP0APgFKwADMzAEcwADM05SBxAAAAADAAPvzScAAzOIcwADM7IHAAMzmwGrhV2MBAAGTAMAA/P0+AT2JwADM+cBq4VeTP0XAAM0OAcAAzRfAAM0ZAABiYMAA+9ABgcAAzRvAauFXARzAAM0kgsAAzSLAauHqYwEAARbAAM0rLmHAAPyjAMAA/P0BisAAzTPAauHqHMAAzTSCwADNM8Bq4epkAQABlADAAPz1PgFJwADNQBzAAM1MHMAAzUguSwEAAYLAAM1JwGrh6gDAAPyDSAEAAYDAAM1PwGrhSADAAP0pSsAAzVgBgsAAzV/AauHqP0rAAM1sARzAAM1zlIHEAAAAAMAA+/MGwADZTIJzwADNfsAAzYLAAM6gAACWWgAAAAEDwADNjcAAzqAAAAACAQLAAM2YAAAgliBgwADltQDAAM2mAAAAamDAAPvQAWrAAM2uYMAA/Nl3AGDAAPvQAT4DScAAzbsiHMAAzcWBwADNv8Bq4t5IAQABKwDAAPzzARzAAM3WgcAAzdDAauLegW0BAAEWwADN3i5hwAD8owDAAP0APgE9icAAze7AauLeHMAAzgIWwADN+y5hwAD8o4GNAQABlADAAPz2ScAAzhIcwADOHIHAAM4WwGri3mMBAAGTAMAA/P0+AUrAAM4pARzAAM4wlIHEAAAAAMAA+/M/RcAAzj4BwADOR8AAzkkAAGJgwAD70AGBwADOS8Bq4t4BHMAAzlSCwADOUsBq46WBbQEAAZMAwAD9AAGKwADOWsBq46UcwADOW4LAAM5awGrjpYGNAQABlADAAPz2PgFJwADOZxzAAM5zHMAAzm8uSwEAAYLAAM5wwGrjpQDAAPyDSAEAAYDAAM52wGrizwDAAP0pSsAAzn8BgsAAzobAauOlP0rAAM6TARzAAM6alIHEAAAAAMAA+/MGwADZTYJzwADOpcAAzq/AAM8KAACGEQAAAAEDwADOucAAzwoAAAAAAAAAYMAA5bUBPgE9MMAAzsIfwADOzMAA+2IBAAEnwAB19gAGwADZToJzwADPD8AAzxnAAM97AACfwwAAAAEDwADPIcAAz3sAAAABAQHAAM8mAAAAJ2DAAPvQAABgwADltQE+AT0wwADPMx/AAM89wAD7YgEAASfAAHX2AAbAANlPgnPAAM+AwADPhcAAz/0AAJb4AAAAAQPAAM+QwADP/QAAAAEBAcAAz5YAAACW+WEBYMAA5bVgwAD6CgAAXAE+AT0wwADPtR/AAM+/wAD7YgEAASfAAHX2AAbAANlQgnPAANACwADQB8AA0H8AAJb7AAAAAQPAANASwADQfwAAAAEBAcAA0BgAAACW+WEBYMAA5bVgwAD6CgAAXAE+AT0wwADQNx/AANBBwAD7YgEAASfAAHX2AAbAANlcgnPAANCEwADQksAA0OwBAIMZAAAAAQPAANCYwADQ7AAAAAAAAABgwADltQE+AknAANCeHMAA0KkWwADQoi5hwAD8o4CXAQABkwDAAPz/SsAA0K4BHMAA0LkuSwEAAZMAwAD8gz89MMAA0MIewADQ3cAAzfIAAAAABsAA2V2Cc8AA0PHAAND/wADRYQEAgegAAAABA8AA0QTAANFhAAAAAAAAAGDAAOW1AT4CScAA0QocwADRFRbAANEOLmHAAPyjgJcBAAGTAMAA/P9KwADRGgEcwADRJS5LAQABHMAA0S0WwADRJi5hwAD8o4GNAQABlADAAPz2AMAA/IM/PTDAANE3HsAA0VLAAM3yAAAAAAbAANlegnPAANFmwADRdMAA0gsBAIDDAAAAAQPAANF7wADSCwAAAAAAAABgwADltQE+A0nAANGBHMAA0YwWwADRhS5hwAD8o0gBAAGUAMAA/PNKwADRkgEcwADRnS5LAQABkwDAAPyDP0nAANGmHMAA0bEWwADRqi5hwAD8o0gBAAGTAMAA/PM9MMAA0bcewADR0sAAzfIAAAAAPz0wwADR4x7AANH+wADN8wAAAAAGwADZUYJzwADSEMAA0h7AANMNAACBWAAAAAEDwADSJcAA0w0AAAACAQLAANIqAAAAamDAAPvQAMAA0jYAAACCjGDAAPvQAWoAYMAA/Nl3AGDAAONiAT4FPYnAANJCwGrnsR7AANJTwAD7EQMAA4DAANJjwGrno4HAANJqwGrnsRbAANJ0LmHAAPyjAE7AANKFwADSjAAAYWDAAPvQARzAANKSgcAA0o7AauexgY0BAAGAwADSlMBq56MAwAD89k7AANKtwADStAAAgXZgwADjYgEcwADSti7AAHicwADTdgEAAYLAANLCwGroBgDAANShPRzAANLWg8AA0s/Aaug5g14EAASTgsAA0uLAaugGLoDAANLwwGrnowDAAPyZSsAA0vwBg8AA0wPAaug5BsAA2VKCc8AA0xLAANMXwADTmAAAn8YAAAABA8AA0x3AANOYAAAAAgICwADTIgAAACdgwAD70ADAANM9AAAgg8xdwAD8MgFgwADltQAAXAE+Ak7AANNTwADTVwABgoxgwAD70AEcwADTaRbAANNigcAA01nAaujeYcAA/FVk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AsAAbhMAAAABA8AAWsTAAFr9AAAAAwIDwABayQAAAJhXYMAA+9AAwABa2QAAAICWYMAA+9AAwABa6AAAAMAAbXlgwADixQFqwABa+GDAAOLFwAFwigBcAAbAAOLignLAAFyVwABcmcAAXM8AAsAAefkAAAABA8AAXKHAAFzPAAAAAgECwABcpgAAAJhXYMAA+9AAwABcugAAAMAAbXlgwADixQFqwABcymDAAOLFwAFwigBgwAD70AAGwADi44JywABei8AAXpDAAF7RAALAAHn6AAAAAQPAAF6YwABe0QAAAAMCA8AAXp0AAACYV2DAAPvQAMAAXq0AAACAlmDAAPvQAMAAXrwAAADAAG15YMAA4sUBasAAXsxgwADixcABcIoAXAAGwADi5IJywABgTcAAYFHAAGCIAALAAHn7AAAAAQPAAGBawABgiAAAAAIBAsAAYF8AAACYV2DAAPvQAMAAYHMAAADAAG15YMAA4sUBasAAYINgwADixcABcIoAYMAA+9AABsAA4uWCcsAAYi3AAGIywABidAACwAB5/AAAAAEDwABiO8AAYnQAAAADAgPAAGJAAAAAmFdgwAD70ADAAGJQAAAAgJZgwAD70ADAAGJfAAAAwABteWDAAOLFAWrAAGJvYMAA4sXAAXCKAFwABsAA4uaCcsAAY8fAAGPOwABkBgACwAB5/QAAAAEDwABj2MAAZAYAAAACAQLAAGPdAAAAmFdgwAD70ADAAGPxAAAAwABteWDAAOLFAWrAAGQBYMAA4sXAAXCKAGDAAPqCAAbAAOLngnLAAGeXwABnnMAAZ+IAAsAAef4AAAABA8AAZ6bAAGfiAAAAAwIDwABnqwAAAJhXYMAA+9AAwABnvgAAAICWYMAA+oIAwABnzQAAAMAAbXlgwADixQFqwABn3WDAAOLFwAFwigBcAAbAAOLognLAAGk2wABpPcAAaXUAAsAARMQAAAABA8AAaUfAAGl1AAAAAgECwABpTAAAAJhXYMAA+9AAwABpYAAAAMAAbXlgwADixQFqwABpcGDAAOLFwAFwigBgwAD6ggAGwADi6YJywABqysAAas/AAGsVAALAAERmAAAAAQPAAGrZwABrFQAAAAMCA8AAat4AAACYV2DAAPvQAMAAavEAAACAlmDAAPqCAMAAawAAAADAAG15YMAA4sUBasAAaxBgwADi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AAADAQPAAPpAAAAAgotgwADingDAAPpTAAAAqG5gwAD70AFqwAD6Y2DAAPvQCcAA+moAAABhYMAA+9ABagBgwAD82XcAYMAA42IBPgFKwAD6eQEcwAD6h4DAAPqAwHCOFcAAeLQCAAKBwAD6l8BwjiSCwAD6psBwjj4AwADirwbAAONrgnLAAP3iwAD98MAA/g0AAoFYAAAAAQPAAP33wAD+DQAAAAIBAsAA/fwAAABqYMAA+9AAwAD+CAAAAIKMYMAA+9ABagBgwAD82XcAYMAA42IAAABwjGYAcIzOAHCNngBwjekAcI6PAHCO5QAAAAUCwADjbIJywAD+7sAA/v3AASr+B8AAeiMBasAA/v1gwADK+MABcN4AAWDAAP0cAACBAATAAONugnLAAQaTwAEGnQbAAHokAGDAAPvQAWrAAQaaYMAA+9AJBMAA42+CcsABBrLAAQa9BsAAeiUAYMAA+9ABasABBrlgwAD70IRrBMAA43CCcsABBtLAAQbdBsAAeiYAYMAA+9ABasABBtlgwAD70ISRBMAA43GCcsABBvLAAQb9BsAAeicAYMAA+9ABasABBvlgwAD70MABd38EwADjcoJywAEHEsABBx0GwAB6KABgwAD70AFqwAEHGWDAAPvQg1EEwADjc4JywAEHMsABBz0GwAB6KQBgwAD70AFqwAEHOWDAAPvQuokEwADjdIJywAEHUsABB10GwAB6KgBgwAD70AFqwAEHWWDAAPvQwACR+QTAAON1gnLAAQdywAEHfQbAAHorAGDAAPvQAWrAAQd5YMAA+9DAAXzABMAA43aCcsABB5LAAQedBsAAeiwAYMAA+9ABasABB5lgwAD70IMrBMAA43eCcsABB7LAAQe9BsAAei0AYMAA+9ABasABB7lgwAD70MAAkRAEwADjeIJywAEH0sABB90GwAB6LgBgwAD70AFqwAEH2WDAAPvQwACRbQTAAON5gnLAAQfywAEH/QbAAHovAGDAAPvQAWrAAQf5YMAA+9DAAZezBMAA43qCcsABCBLAAQgdBsAAejAAYMAA+9ABasABCBlgwAD70LMMBMAA43uCcsABCDLAAQg9BsAAejEAYMAA+9ABasABCDlgwAD70MAAkUAEwADjfIJywAEIUsABCF0GwAB6MgBgwAD70AFqwAEIWWDAAPvQwAGXtwTAAON9gnLA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+9Cl2ATAAOPAgnLAARDNwAEQ2AbAAHp2AGDAAPvQAWrAARDUYMAA+9DAAK+JBMAA48GCcsABEO3AARD4BsAAencAYMAA+9ABasABEPRgwAD70MABmAcEwADjwoJywAERDcABERgGwAB6eABgwAD70AFqwAERFGDAAPvQwAB1lwTAAOPDgnLAAREtwAEROAbAAHp5AGDAAPvQAWrAARE0YMAA+9C1MgTAAOPEgnLAARFNwAERWAbAAHp6AGDAAPvQAWrAARFUYMAA+9DAAKl/BMAA48WCcsABEW3AARF4BsAAensAYMAA+9ABasABEXRgwAD70MABmAsEwADjxoJywAERjcABEZgGwAB6fABgwAD70AFqwAERlGDAAPvQwABaxwTAAOPHgnLAARGtwAERuAbAAHp9AGDAAPvQAWrAARG0YMAA+9DAAJEfBMAA48iCcsABEc3AARHYBsAAen4AYMAA+9ABasABEdRgwAD70MAAt18EwADjyYJywAER7cABEfgGwAB6fwBgwAD70AFqwAER9GDAAPvQwAGYDwTAAOPKgnLAARINwAESGAbAAHqAAGDAAPvQAWrAARIUYMAA+9CSWATAAOPLgnLAARItwAESOAbAAHqBAGDAAPvQAWrAARI0YMAA+9DAAJFPBMAA48yCcsABEk3AARJYBsAAeoIAYMAA+9ABasABElRgwAD70MABmBMEwADjzYJywAESbcABEngGwAB6gwBgwAD70AFqwAESdGDAAPvQwAGYFwTAAOPOgnLAARKNwAESlwbAAHqEAGDAAPvQAWrAARKUYMAA+9CD7wTAAOPPgnLAARKswAEStwbAAHqFAGDAAPvQAWrAARKzYMAA+9CmegTAAOPQgnLAARLMwAES1wbAAHqGAGDAAPvQAWrAARLTYMAA+9DAAK3rBMAA49GCcsABEuzAARL3BsAAeocAYMAA+9ABasABEvNgwAD70MABfKQEwADj0oJywAETDMABExcGwAB6iABgwAD70AFqwAETE2DAAPvQwABwzwTAAOPTgnLAARMswAETNwbAAHqJAGDAAPvQAWrAARMzYMAA+9DAAIP0BMAA49SCcsABE0zAARNXBsAAeooAYMAA+9ABasABE1NgwAD70MAArrcEwADj1YJywAETbMABE3cGwAB6iwBgwAD70AFqwAETc2DAAPvQwAGYGwTA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YMAA+9ABasABGRBgwAD70MAAdQwEwADkA4JywAEZKcABGTQGwAB6uQBgwAD70AFqwAEZMGDAAPvQtV0EwADkBIJywAEZScABGVQGwAB6ugBgwAD70AFqwAEZUGDAAPvQwACx8gTAAOQFgnLAARlpwAEZdAbAAHq7AGDAAPvQAWrAARlwYMAA+9DAAZhPBMAA5AaCcsABGYnAARmUBsAAerwAYMAA+9ABasABGZBgwAD70MAAWXcEwADkB4JywAEZqcABGbQGwAB6vQBgwAD70AFqwAEZsGDAAPvQwACRIgTAAOQIgnLAARnJwAEZ1AbAAHq+AGDAAPvQAWrAARnQYMAA+9DAALdjBMAA5AmCcsABGenAARn0BsAAer8AYMAA+9ABasABGfBgwAD70MABmFMEwADkCoJywAEaCcABGhQGwAB6wABgwAD70AFqwAEaEGDAAPvQkoMEwADkC4JywAEaKcABGjQGwAB6wQBgwAD70AFqwAEaMGDAAPvQwACRUgTAAOQMgnLAARpJwAEaVAbAAHrCAGDAAPvQAWrAARpQYMAA+9DAAZhXBMAA5A2CcsABGmnAARp0BsAAesMAYMAA+9ABasABGnBgwAD70MABmFsEwADkDoJywAEaicABGpMGwAB6xABgwAD70AFqwAEakGDAAPvQg/IEwADkD4JywAEaqMABGrMGwAB6xQBgwAD70AFqwAEar2DAAPvQrS0EwADkEIJywAEayMABGtMGwAB6xgBgwAD70AFqwAEaz2DAAPvQwACsCATAAOQRgnLAARrowAEa8wbAAHrHAGDAAPvQAWrAARrvYMAA+9DAAXyoBMAA5BKCcsABGwjAARsTBsAAesgAYMAA+9ABasABGw9gwAD70MAAYzQEwADkE4JywAEbKMABGzMGwAB6yQBgwAD70AFqwAEbL2DAAPvQwACRAQTAAOQUgnLAARtIwAEbUwbAAHrKAGDAAPvQAWrAARtPYMAA+9DAAK6BBMAA5BWCcsABG2jAARtzBsAAessAYMAA+9ABasABG29gwAD70MABmF8EwADkFoJywAEbiMABG5MGwAB6zABgwAD70AFqwAEbj2DAAPvQwABCIgTAAOQXgnLAARuowAEbswbAAHrNAGDAAPvQAWrAARuvYMAA+9DAAJEuBMAA5BiCcsABG8jAARvTBsAAes4AYMAA+9ABasABG89gwAD70MAAlHwEwADkGYJywAEb6MABG/MGwAB6zwBgwAD70AFqwAEb72DAAPvQwAGYYwTAAOQagnLAARwIwAEcEwbAAHrQAGDAAPvQAWrAARwPYMAA+9CVjwTAAOQbgnLAARwowAEcMwbAAHrRAGDAAPvQAWrAARwvYMAA+9DAAJFeBMAA5ByCcsABHEjAARxTBsAAetIAYMAA+9ABasABHE9gwAD70MABmGcEwADkHYJywAEcaMABHHMGwAB60wBgwAD70AFqwAEcb2DAAPvQwAGYawTAAOQegnLAARyIwAEckgbAAHrUAGDAAPvQAWrAARyPYMAA+9DAAIPBBMAA5B+CcsABHKfAARyyBsAAetUAYMAA+9ABasABHK5gwAD70LZ4BMAA5CCCcsABHMfAARzSBsAAetYAYMAA+9ABasABHM5gwAD70MAAqK4EwADkIYJywAEc58ABHPIGwAB61wBgwAD70AFqwAEc7mDAAPvQwAF8uATAAOQignLAAR0HwAEdEgbAAHrYAGDAAPvQAWrAAR0OYMAA+9DAAGCuBMAA5COCcsABHSfAAR0yBsAAetkAYMAA+9ABasABHS5gwAD70MAAkQoEwADkJIJywAEdR8ABHVIGwAB62gBgwAD70AFqwAEdTmDAAPvQwACsPATAAOQlgnLAAR1nwAEdcgbAAHrbAGDAAPvQAWrAAR1uYMAA+9DAAZhvBMAA5CaCcsABHYfAAR2SBsAAetwAYMAA+9ABasABHY5gwAD70K/PBMAA5CeCcsABHafAAR2yBsAAet0AYMAA+9ABasABHa5gwAD70MAAkToEwADkKIJywAEdx8ABHdIGwAB63gBgwAD70AFqwAEdzmDAAPvQwAGYcwTAAOQpgnLAAR3nwAEd8gbAAHrfAGDAAPvQAWrAAR3uYMAA+9DAAZh3BMAA5CqCcsABHgfAAR4SBsAAeuAAYMAA+9ABasABHg5gwAD70J3FBMAA5CuCcsABHifAAR4yBsAAeuEAYMAA+9ABasABHi5gwAD70MAAkWoEwADkLIJywAEeR8ABHlIGwAB64gBgwAD70AFqwAEeTmDAAPvQwAGYewTAAOQtgnLAAR5nwAEecgbAAHrjAGDAAPvQAWrAAR5uYMAA+9DAAZh/BMAA5C6CcsABHofAAR6RBsAAeuQAYMAA+9ABasABHo5gwAD70FIEwADkL4JywAEepsABHrEGwAB65QBgwAD70AFqwAEerWDAAPvQodoEwADkMIJywAEexsABHtEGwAB65gBgwAD70AFqwAEezWDAAPvQwACxigTAAOQxgnLAAR7mwAEe8QbAAHrnAGDAAPvQAWrAAR7tYMAA+9DAAZiDBMAA5DKCcsABHwbAAR8RBsAAeugAYMAA+9ABasABHw1gwAD70MAAe7sEwADkM4JywAEfJsABHzEGwAB66QBgwAD70AFqwAEfLWDAAPvQki0EwADkNIJywAEfRsABH1EGwAB66gBgwAD70AFqwAEfTWDAAPvQwACpFQTAAOQ1gnLAAR9mwAEfcQbAAHrrAGDAAPvQAWrAAR9tYMAA+9DAAZiHBMAA5DaCcsABH4bAAR+RBsAAeuwAYMAA+9ABasABH41gwAD70MAAXY0EwADkN4JywAEfpsABH7EGwAB67QBgwAD70AFqwAEfrWDAAPvQwACRGQTAAOQ4gnLAAR/GwAEf0QbAAHruAGDAAPvQAWrAAR/NYMAA+9DAALC+BMAA5DmCcsABH+bAAR/xBsAAeu8AYMAA+9ABasABH+1gwAD70MABmIsEwADkOoJywAEgBsABIBEGwAB68ABgwAD70AFqwAEgDWDAAPvQiQMEwADkO4JywAEgJsABIDEGwAB68QBgwAD70AFqwAEgLWDAAPvQwACRSQTAAOQ8gnLAASBGwAEgUQbAAHryAGDAAPvQAWrAASBNYMAA+9DAAZiPBMAA5D2CcsABIGbAASBxBsAAevMAYMAA+9ABasABIG1gwAD70MABmJMEwADkPoJywAEghsABIJAGwAB69ABgwAD70AFqwAEgjWDAAPvQhOAEwADkP4JywAEgpcABILAGwAB69QBgwAD70AFqwAEgrGDAAPvQpgMEwADkQIJywAEgxcABINAGwAB69gBgwAD70AFqwAEgzGDAAPvQwACrPATAAORBgnLAASDlwAEg8AbAAHr3AGDAAPvQAWrAASDsYMAA+9DAAZiXBMAA5EKCcsABIQXAASEQBsAAevgAYMAA+9ABasABIQxgwAD70MAAZCAEwADkQ4JywAEhJcABITAGwAB6+QBgwAD70AFqwAEhLGDAAPvQtK0EwADkRIJywAEhRcABIVAGwAB6+gBgwAD70AFqwAEhTGDAAPvQwACwJQTAAORFgnLAASFlwAEhcAbAAHr7AGDAAPvQAWrAASFsYMAA+9DAAZibBMAA5EaCcsABIYXAASGQBsAAevwAYMAA+9ABasABIYxgwAD70MAAWFgEwADkR4JywAEhpcABIbAGwAB6/QBgwAD70AFqwAEhrGDAAPvQwACRJQTAAORIgnLAASHFwAEh0AbAAHr+AGDAAPvQAWrAASHMYMAA+9DAAKyoBMAA5EmCcsABIeXAASHwBsAAev8AYMAA+9ABasABIexgwAD70MABmJ8EwADkSoJywAEiBcABIhAGwAB7AABgwAD70AFqwAEiDGDAAPvQn5MEwADkS4JywAEiJcABIjAGwAB7AQBgwAD70AFqwAEiLGDAAPvQwACRVQTAAORMgnLAASJFwAEiUAbAAHsCAGDAAPvQAWrAASJMYMAA+9DAAZijBMAA5E2CcsABImXAASJwBsAAewMAYMAA+9ABasABImxgwAD70MABmKcEwADkToJywAEihcABIo8GwAB7BABgwAD70AFqwAEijGDAAPvQwACNJATAAORPgnLAASKkwAEirwbAAHsFAGDAAPvQAWrAASKrYMAA+9CzOgTAAORQgnLAASLEwAEizwbAAHsGAGDAAPvQAWrAASLLYMAA+9DAAKxyBMAA5FGCcsABIuTAASLvBsAAewcAYMAA+9ABasABIutgwAD70MABfKwEwADkUoJywAEjBMABIw8GwAB7CABgwAD70AFqwAEjC2DAAPvQwABjAQTAAORTgnLAASMkwAEjLwbAAHsJAGDAAPvQAWrAASMrYMAA+9DAAJEEBMAA5FSCcsABI0TAASNPBsAAewoAYMAA+9ABasABI0tgwAD70MAAsskEwADkVYJywAEjZMABI28GwAB7CwBgwAD70AFqwAEja2DAAPvQwAGYqwTAAORWgnLAASOEwAEjjwbAAHsMAGDAAPvQAWrAASOLYMAA+9DAAEHvBMAA5FeCcsABI6TAASOvBsAAew0AYMAA+9ABasABI6tgwAD70MAAkTEEwADkWIJywAEjxMABI88GwAB7DgBgwAD70AFqwAEjy2DAAPvQwAGYrwTAAORZgnLAASPkwAEj7wbAAHsPAGDAAPvQAWrAASPrYMAA+9DAAZizBMAA5FqCcsABJATAASQPBsAAexAAYMAA+9ABasABJAtgwAD70JMxBMAA5FuCcsABJCTAASQvBsAAexEAYMAA+9ABasABJCtgwAD70MAAkWEEwADkXIJywAEkRMABJE8GwAB7EgBgwAD70AFqwAEkS2DAAPvQwAC2OgTAAORdgnLAASRkwAEkbwbAAHsTAGDAAPvQAWrAASRrYMAA+9DAAZi3BMAA5F6CcsABJITAASSOBsAAexQAYMAA+9ABasABJItgwAD70MAAgXIEwADkX4JywAEko8ABJK4GwAB7FQBgwAD70AFqwAEkqmDAAPvQul4EwADkYIJywAEkw8ABJM4GwAB7FgBgwAD70AFqwAEkymDAAPvQwACoegTAAORhgnLAASTjwAEk7gbAAHsXAGDAAPvQAWrAASTqYMAA+9DAAXy8BMAA5GKCcsABJQPAASUOBsAAexgAYMAA+9ABasABJQpgwAD70MAAYB0EwADkY4JywAElI8ABJS4GwAB7GQBgwAD70AFqwAElKmDAAPvQwACRDQTAAORkgnLAASVDwAElTgbAAHsaAGDAAPvQAWrAASVKYMAA+9DAAKpABMAA5GWCcsABJWPAASVuBsAAexsAYMAA+9ABasABJWpgwAD70MABmLsEwADkZoJywAElg8ABJY4GwAB7HABgwAD70AFqwAElimDAAPvQwABY3gTAAORngnLAASWjwAElrgbAAHsdAGDAAPvQAWrAASWqYMAA+9DAAJE9BMAA5GiCcsABJcPAASXOBsAAex4AYMAA+9ABasABJcpgwAD70MABmL8EwADkaYJywAEl48ABJe4GwAB7HwBgwAD70AFqwAEl6mDAAPvQwAC2NgTAAORqgnLAASYDwAEmDgbAAHsgAGDAAPvQAWrAASYKYMAA+9CesATAAORrgnLAASYjwAEmLgbAAHshAGDAAPvQAWrAASYqYMAA+9CD+ATAAORsgnLAASZDwAEmTgbAAHsiAGDAAPvQAWrAASZKYMAA+9DAALY+BMAA5G2CcsABJmPAASZuBsAAeyMAYMAA+9ABasABJmpgwAD70MABeAEAIwbAAORvgnPAAYQzwAGEO8ABhJEEBQADasABhDtgwADK+MABcN5qwAGEO2DAAPnRwAGLfGrAAYQ7YMAAywbAAZjIAAABA8ABhETAAYSRAAAABAQEwAGETAAAAIN7YMAA+oIAwAGEVgAAALvuYMAA+oIAwAGEYAAAAMAAR/BgwAD6ggDAAYRq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csABKHjAASiCwAEokQACwAB5cgAAAAEDwAEoh8ABKJEAAAABAQHAASiPAAAAu+5gwAD6ggAAYMAA42wABsAA5IeCcsABKN3AASjnwAEo9gACwAB5dAAAAAEDwAEo7MABKPYAAAABAQHAASj0AAAAwABH8GDAAPqCAABgwADjbAAGwADkiIJywAEpQsABKUzAASlbAALAAHl2AAAAAQPAASlRwAEpWwAAAAEBAcABKVkAAADAAGuaYMAA+oIAAGDAAONsAAbAAOSJgnLAASmgwAEpqsABKb4AApynAAAAAQPAASmtwAEpvgAAAAEBAcABKbgAAACD1mDAAONsAABgwADjbAAGwADkioJywAEqA8ABKg3AASohAALAAEjDAAAAAQPAASoQwAEqIQAAAAEBAcABKhsAAACD1mDAAONsAABgwADjbAAGwADki4JywAEqT8ABKlnAASpfAALAAHd9AAAAAQPAASpdwAEqXwAAAAAAAABgwADjbAAGwADkjIJywAEqjMABKpbAASqiAALAAHl7AAAAAQPAASqgwAEqogAAAAAAAABgwADjbAAGwADkjYJywAEq4sABKuzAASr8AALAAHl9AAAAAQPAASr6wAEq/AAAAAAAAABgwADjbAAAAHC3ugBwuFQAcLjAAHC5HQBwuYkAcLn1AHC6NABwumUAcLqlAHC65QBwuyQAcLtkAHC7pgBwu+YAcLwoAHC8agBwvKwAcLzuAHC9HwBwvXQAcL2lAHC91gBwvgkAcL48AHC+bwBwvq8AcL8AAHC/QgBwv4QAcL/IAHDADABwwEwAcMCOAHDAwQBwwPQAcMEnAAAAIwLAAOSUgnLAASuOwAErncABVicHwAB7LQFqwAErnWDAAMr4wAFw3gABYMAA/RwAAIEABMAA5JaCcsABL4vAAS+VBsAAeiQAYMAA+9ABasABL5JgwAD70AkEwADkl4JywAEvqsABL7UGwAB6JQBgwAD70AFqwAEvsWDAAPvQhGsEwADkmIJywAEvysABL9UGwAB6JgBgwAD70AFqwAEv0WDAAPvQhJEEwADkmYJywAEv6sABL/UGwAB6JwBgwAD70AFqwAEv8WDAAPvQwAF3fwTAAOSagnLAATAKwAEwFQbAAHooAGDAAPvQAWrAATARYMAA+9CDUQTAAOSbgnLAATAqwAEwNQbAAHopAGDAAPvQAWrAATAxYMAA+9C6iQTAAOScgnLAATBKwAEwVQbAAHoqAGDAAPvQAWrAATBRYMAA+9DAAJH5BMAA5J2CcsABMGrAATB1BsAAeisAYMAA+9ABasABMHFgwAD70MABfMAEwADknoJywAEwisABMJUGwAB6LABgwAD70AFqwAEwkWDAAPvQgysEwADkn4JywAEwqsABMLUGwAB6LQBgwAD70AFqwAEwsWDAAPvQwACREATAAOSggnLAATDKwAEw1QbAAHouAGDAAPvQAWrAATDRYMAA+9DAAJFtBMAA5KGCcsABMOrAATD1BsAAei8AYMAA+9ABasABMPFgwAD70MABl7MEwADkooJywAExCsABMRUGwAB6MABgwAD70AFqwAExEWDAAPvQswwEwADko4JywAExKsABMTUGwAB6MQBgwAD70AFqwAExMWDAAPvQwACRQATAAOSkgnLAATFKwAExVQbAAHoyAGDAAPvQAWrAATFRYMAA+9DAAZe3BMAA5KWCcsABMWrAATF1BsAAejMAYMAA+9ABasABMXFgwAD70MABl7sEwADkpoJywAExisABMZQGwAB6NABgwAD70AFqwAExkWDAAPvQgVUEwADkp4JywAExqcABMbQGwAB6NQBgwAD70AFqwAExsGDAAPvQpAYEwADkqIJywAExycABMdQGwAB6NgBgwAD70AFqwAEx0GDAAPvQwACzWgTAAOSpgnLAATHpwAEx9AbAAHo3AGDAAPvQAWrAATHwYMAA+9DAAZe/BMAA5KqCcsABMgnAATIUBsAAejgAYMAA+9ABasABMhBgwAD70MAAaa0EwADkq4JywAEyKcABMjQGwAB6OQBgwAD70AFqwAEyMGDAAPvQkggEwADkrIJywAEyScABMlQGwAB6OgBgwAD70AFqwAEyUGDAAPvQwACpSQTAAOStgnLAATJpwAEydAbAAHo7AGDAAPvQAWrAATJwYMAA+9DAAZfDBMAA5K6CcsABMonAATKUBsAAejwAYMAA+9ABasABMpBgwAD70K3/BMAA5K+CcsABMqnAATK0BsAAej0AYMAA+9ABasABMrBgwAD70MAAkRwEwADksIJywAEyycABMtQGwAB6PgBgwAD70AFqwAEy0GDAAPvQwACw8gTAAOSxgnLAATLpwAEy9AbAAHo/AGDAAPvQAWrAATLwYMAA+9DAAZfHBMAA5LKCcsABMwnAATMUBsAAekAAYMAA+9ABasABMxBgwAD70I1zBMAA5LOCcsABMynAATM0BsAAekEAYMAA+9ABasABMzBgwAD70MAAkUwEwADktIJywAEzScABM1QGwAB6QgBgwAD70AFqwAEzUGDAAPvQwAGXywTAAOS1gnLAATNpwAEzdAbAAHpDAGDAAPvQAWrAATNwYMAA+9DAAZfPBMAA5LaCcsABM4nAATOTBsAAekQAYMAA+9ABasABM5BgwAD70IM+BMAA5LeCcsABM6jAATOzBsAAekUAYMAA+9ABasABM69gwAD70KZMBMAA5LiCcsABM8jAATPTBsAAekYAYMAA+9ABasABM89gwAD70MAAke8EwADkuYJywAEz6MABM/MGwAB6RwBgwAD70AFqwAEz72DAAPvQgycEwADkuoJywAE0CMABNBMGwAB6SABgwAD70AFqwAE0D2DAAPvQwABjZwTAAOS7gnLAATQowAE0MwbAAHpJAGDAAPvQAWrAATQvYMAA+9C6MwTAAOS8gnLAATRIwAE0UwbAAHpKAGDAAPvQAWrAATRPYMAA+9DAAK/vBMAA5L2CcsABNGjAATRzBsAAeksAYMAA+9ABasABNG9gwAD70MABl9MEwADkvoJywAE0iMABNJMGwAB6TABgwAD70AFqwAE0j2DAAPvQwABXnwTAAOS/gnLAATSowAE0swbAAHpNAGDAAPvQAWrAATSvYMAA+9DAAJEoBMAA5MCCcsABNMjAATTTBsAAek4AYMAA+9ABasABNM9gwAD70MAAs5AEwADkwYJywAE06MABNPMGwAB6TwBgwAD70AFqwAE072DAAPvQwAGX1wTAAOTCgnLAATUIwAE1EwbAAHpQAGDAAPvQAWrAATUPYMAA+9DAAGIdBMAA5MOCcsABNSjAATUzBsAAelEAYMAA+9ABasABNS9gwAD70MAAkVgEwADkxIJywAE1SMABNVMGwAB6UgBgwAD70AFqwAE1T2DAAPvQwAGX2wTAAOTFgnLAATVowAE1cwbAAHpTAGDAAPvQAWrAATVvYMAA+9DAAJIZBMAA5MaCcsABNYjAATWSBsAAelQAYMAA+9ABasABNY9gwAD70MAAjFsEwADkx4JywAE1p8ABNbIGwAB6VQBgwAD70AFqwAE1rmDAAPvQtdQEwADkyIJywAE1x8ABNdIGwAB6VgBgwAD70AFqwAE1zmDAAPvQwACtgQTAAOTJgnLAATXnwAE18gbAAHpXAGDAAPvQAWrAATXuYMAA+9DAAXywBMAA5MqCcsABNgfAATYSBsAAelgAYMAA+9ABasABNg5gwAD70MAAYo8EwADky4JywAE2J8ABNjIGwAB6WQBgwAD70AFqwAE2LmDAAPvQhAMEwADkzIJywAE2R8ABNlIGwAB6WgBgwAD70AFqwAE2TmDAAPvQwACykwTAAOTNgnLAATZnwAE2cgbAAHpbAGDAAPvQAWrAATZuYMAA+9DAAZffBMAA5M6CcsABNofAATaSBsAAelwAYMAA+9ABasABNo5gwAD70MAAQbwEwADkz4JywAE2p8ABNrIGwAB6XQBgwAD70AFqwAE2rmDAAPvQwACRNATAAOTQgnLAATbHwAE20gbAAHpeAGDAAPvQAWrAATbOYMAA+9DAAZfjBMAA5NGCcsABNufAATbyBsAAel8AYMAA+9ABasABNu5gwAD70MABl+cEwADk0oJywAE3B8ABNxIGwAB6YABgwAD70AFqwAE3DmDAAPvQlboEwADk04JywAE3J8ABNzIGwAB6YQBgwAD70AFqwAE3LmDAAPvQwACRZATAAOTUgnLAATdHwAE3UgbAAHpiAGDAAPvQAWrAATdOYMAA+9DAAZfrBMAA5NWCcsABN2fAATdyBsAAemMAYMAA+9ABasABN25gwAD70MABl+8EwADk1oJywAE3h8ABN5EGwAB6ZABgwAD70AFqwAE3jmDAAPvQFQTAAOTXgnLAATemwAE3sQbAAHplAGDAAPvQAWrAATetYMAA+9DAAFlKBMAA5NiCcsABN8bAATfRBsAAemYAYMAA+9ABasABN81gwAD70MAArbcEwADk2YJywAE35sABN/EGwAB6ZwBgwAD70AFqwAE37WDAAPvQwAGX8wTAAOTagnLAATgGwAE4EQbAAHpoAGDAAPvQAWrAATgNYMAA+9DAAHx6BMAA5NuCcsABOCbAATgxBsAAemkAYMAA+9ABasABOC1gwAD70Lq0BMAA5NyCcsABOEbAAThRBsAAemoAYMAA+9ABasABOE1gwAD70MAAp6kEwADk3YJywAE4ZsABOHEGwAB6awBgwAD70AFqwAE4bWDAAPvQwAGX9wTAAOTegnLAATiGwAE4kQbAAHpsAGDAAPvQAWrAATiNYMAA+9DAAF3rBMAA5N+CcsABOKbAATixBsAAem0AYMAA+9ABasABOK1gwAD70MAAkRMEwADk4IJywAE4xsABONEGwAB6bgBgwAD70AFqwAE4zWDAAPvQwACyKATAAOThgnLAATjmwAE48QbAAHpvAGDAAPvQAWrAATjtYMAA+9DAAZf7BMAA5OKCcsABOQbAATkRBsAAenAAYMAA+9ABasABOQ1gwAD70LWtBMAA5OOCcsABOSbAATkxBsAAenEAYMAA+9ABasABOS1gwAD70MAAkUMEwADk5IJywAE5RsABOVEGwAB6cgBgwAD70AFqwAE5TWDAAPvQwAGX/wTAAOTlgnLAATlmwAE5cQbAAHpzAGDAAPvQAWrAATltYMAA+9DAAZgDBMAA5OaCcsABOYbAATmQBsAAenQAYMAA+9ABasABOY1gwAD70II8BMAA5OeCcsABOaXAATmwBsAAenUAYMAA+9ABasABOaxgwAD70KXYBMAA5OiCcsABOcXAATnQBsAAenYAYMAA+9ABasABOcxgwAD70MAAr4kEwADk6YJywAE55cABOfAGwAB6dwBgwAD70AFqwAE57GDAAPvQwAGYBwTAAOTqgnLAAToFwAE6EAbAAHp4AGDAAPvQAWrAAToMYMAA+9DAAHWXBMAA5OuCcsABOiXAATowBsAAenkAYMAA+9ABasABOixgwAD70LUyBMAA5OyCcsABOkXAATpQBsAAenoAYMAA+9ABasABOkxgwAD70MAAqX8EwADk7YJywAE6ZcABOnAGwAB6ewBgwAD70AFqwAE6bGDAAPvQwAGYCwTAAOTugnLAATqFwAE6kAbAAHp8AGDAAPvQAWrAATqMYMAA+9DAAFrHBMAA5O+CcsABOqXAATqwBsAAen0AYMAA+9ABasABOqxgwAD70MAAkR8EwADk8IJywAE6xcABOtAGwAB6fgBgwAD70AFqwAE6zGDAAPvQwAC3XwTAAOTxgnLAATrlwAE68AbAAHp/AGDAAPvQAWrAATrsYMAA+9DAAZgPBMAA5PKCcsABOwXAATsQBsAAeoAAYMAA+9ABasABOwxgwAD70JJYBMAA5POCcsABOyXAATswBsAAeoEAYMAA+9ABasABOyxgwAD70MAAkU8EwADk9IJywAE7RcABO1AGwAB6ggBg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AGDAAP22AADAALi9PYrAAEgqwHJSVB7AAEgxwADoiAEAAYDAAEg/wHJSEQBCAAA9HgDAALfCAgACgQDAclIvggDAclJUAErAAEhLAAMBAFsBAAAAAIHSWwABAAAAAIHTWwA+AT0cAIEAwHJSL4HbAgACFADAcldpDAAUAMByV3INAADAALjSPYsAwHJSZx4AwAC3wwEAARQAwHJSmQgAAD2MAMByUnAeAMAAt70BAAEUAMByUpkIAAA9jQDAclJ5HgDAALe+AQABFADAclKZCAAAPRzAAEP9gQDAclIvagEAARQAwHJSmQgAAABKAAEWAIEAwHJSL4HcwAC4zgbAAOjEgnjAAEhQwABIYcAASaIAAMAAfP0AAAABA8AASG3AAEmiAAIAAgICwABIeAAAAIC1YMAA6KEAwABIgwAAACJgwADpQwAAXcAAuKkBYMAA6XwBPg5OAAAAAYHIXcAAt+8BYMAA6XwBH8AASJLAALf8AAFgwADpfAAATgAAAACByV3AALilAWDAAOl8AE4AAAAAgcpbAE4AAAAAgctbAE4AAAAAgcxbAE4AAAAAgc1bAZNOAAAAAIHOWwBOAAAAAIHPWwBPwABIYQAAAACB0FsAA8AASG3AAEmiBAAAAwADAAAAAIHRWwAAAAAAgdJbAAAAAACB01sAAFsBSz4DQT4FTcAASKkCNQAAAAAAWwEewABIqcAAt78EAAQcwABIry7AAH0VwADoQwEAAYHAAEjBwHJYUADAAOjChQDAclivhgDAcli4FADAcljhCgAAK07AAEiewABIpwABg1FbARQAwHJY+AsAScAASM8cwABI3BTAAEjTwHJZaQ4ASAEAASsAwAD9KT4DQBzAAElBFsAASTyBwABJNMByWFCCkMAA6UhIAQABasAASVBgwADpNsABmeEAwAD9KcAASTTAAElcAD2LwABJZcByWJMrQgAAPz2LwABJfMByWJMewABJh8AA6YIBAAEUwABJlcByWWkOAABCAAA9HgDAALfCAgACggDAclhugwDAcliTAErAAEmiAAMBAFsBAAAAAIHSWwABAAAAAIHTWwA+AT0cAIIAwHJYboHbAgACFADAclowDgAUAMByWjkPAADAALjSPYwAwHJYph4AwAC3wwEAARQAwHJY4QoAAD2NAMByWK8eAMAAt70BAAEUAMByWOEKAAA9jgDAcli4HgDAALe+AQABFADAcljhCgAAPRzAAEhtggDAclhuagEAARQAwHJY4QoAAABKAAEWAIIAwHJYboHcwAC4zgbAAOjCgnjAAEmnwABJrsAATbcAAMAAfRXAAOhDAAAAAQPAAEm/wABNtwACAAEBAcAAScgAAAAiYMAA6UMAAF3AALipAVsBPg9OAAAAAYHIXcAAt+8BWwEfwABJ18AAt/wAAVsAAE4AAAAAgcldwAC4pQFbAE4AAAAAgcpbAE4AAAAAgctbAE4AAAAAgcxbAE4AAAAAgc1bAZNOAAAAAIHOWwBOAAAAAIHPWwBOAAAAAIgjWwBPwABJrgAAAACB0FsAA8AASb/AAE23BAAAAwADAAAAAIHRWwAAAAAAgdJbAAAAAACB01sAAFsBSz4DQT4BSz4LScAASekWwABJ9YDAAEntwHJbDMAAfRbAAOlPPgNNwABKEQI1AAAAAABbAR7AAEoRwAC3vwQABBbAAEofgMAAShfAclsMg1HAAOlQhADAcltbhQDAcltkFADAcluWCgAAKz2KwABKCsByW0MUAMByW60LAEIAAD9JwABKNxzAAEpKFsAASkOAwABKO8ByWwyWQcAA6UpIAQABJ8AAfRcAwAD9xT4DTcAASm4CNQAAAAAAWwEewABKbsAAt78EAAQcwABKdC7AAH0DwADoQwEAAYDAAEqCwHJbDADAAOi5hADAcltbhQDAcltkFADAcluWCgAAKz2KwABKZ8ByW0MUAMByW60LAEIAAD9JwABKmhzAAEqtFsAASqaAwABKnsByWwyWQcAA6UpIAQABJ8AAfRgAwAD9xT4DTcAAStECNQAAAAAAWwEewABK0cAAt78EAAQcwABK1y7AAH0GwADoQwEAAYDAAErlwHJbDADAAOi6hADAcltbhQDAcltkFADAcluWCgAAKz2KwABKysByW0MUAMByW60LAEIAAD9JwABK/RzAAEsQFsAASwmAwABLAcByWwyWQcAA6UpIAQABJ8AAfRkAwAD9xT4DTcAASzcCNQAAAAAAWwEewABLN8AAt78EAAQcwABLPS7AAH0KwADoQwEAAYDAAEtOwHJbDADAAOi+hADAcltbhQDAcltkFADAcluWCgAAKz2KwABLMMByW0MUAMByW60LAEIAAD9JwABLZhzAAEt5FsAAS3KAwABLasByWwyWQcAA6UpIAQABJ8AAdtMAwAD9xT4DTcAAS5oCNQAAAAAAWwEewABLmsAAt78EAAQcwABLoC7AAHbTwADoQwEAAYDAAEuqwHJbDADAAOjBhADAcltbhQDAcltkFADAcluWCgAAKz2KwABLk8ByW0MUAMByW60LAEIAAD9JwABLwhzAAEvMFsAAS8YuwAB8A8AA6KvAAH0aAQABgMAAS+DAclsMAMAA6Pg+A03AAEv7AjUAAAAAAFsBHsAAS/vAALe/BAAEHMAATAcWwABMAS7AAHwDwADoq8AAfRsBAAGAwABMFcByWwwAwADo+YQAwHJbW4UAwHJbZBQAwHJblgoAACs9isAAS/TAcltDFADAclutCwBCAAA/ScAATC0ewABMMcAA6LsBAAEWwABMR4DAAEw/wHJbDJZBwADpSgA+A03AAExhAjUAAAAAAFsBHsAATGHAALe/BAAEHMAATGcuwAB9DsAA6EMBAAGAwABMdsByWwwAwADowIQAwHJbW4UAwHJbZBQAwHJblgoAACs9isAATFrAcltDFADAclutCwBCAAA/ScAATI4hHMAATK4cwABMoBbAAEyagMAATJLAclsMg+/AAOlLSwEAASfAAHuEAMAA/LlIAQABKwDAAP0pPgNNwABMyAI1AAAAAABbAR7AAEzIwAC3vwQABBzAAEzeFsAATM4uwAB848AA6KjAAHz9AgACLoDAAEzxwHJbDADAAOkjhADAcltbhQDAcltkFADAcluWCgAAKz2KwABMwcByW0MUAMByW60LAEIAAD9NwABNEAI1AAAAAABbAR7AAE0QwAC3vwQABBzAAE0egMAATRbAclsMwAB9HAAAAADAAOldhADAcltbhQDAcltkFADAcluWCgAAKz2KwABNCcByW0MUAMByW60LAEIAAAEBwABNMFsBwABNNwAAAYNNWwABwABNOgAAAaPdYMAA/YoAPgM9HMAATU6AwABNRsByWwzAAH0dAgACasAATV9gwAD70MABm9YkwABNjQQnwAB9HhTAAE2GwHJg0g4AJ4CvFMAATYrAcmDeDwAAwADpXz2KwABNlsByW0MWwABNpYDAAE2dwHJbDINRwADpUEIAAD0eAMAAt8ICAAKBAMByWyaCAMByW0MASsAATbcAAwEAWwEAAAAAgdJbAAEAAAAAgdNbAD4BPRwAgQDAclsmgdsCAAIUAMBy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ARbAAGmnLrjVwADraT0wwABpsWrAAGm9YMAA9J3AAaCHP07AAGnfwABp5gAAgXZgwAD70AEcwABp6C7AAH9qAAAAAMAA67NJwABp/SXAAGoIgMAAagHAc7NHYMAA7V89MMAAahSAwABqGsBzs0c/SsAAaiYBF8AAai0uwAB/G4DAAGo5wHOzR8AA63MGwADryIKLwABqSMAAalDAAGsLAQCeOgAAAAEDwABqW8AAawsAAAAAAAAAYMAA+9ABPgRJwABqYSIWwABqZS7AAH8TwADragEWwABqci641cAA62k9MMAAanxqwABqiGDAAPSdwAGghz9OwABqqsAAarEAAIF2XcAA/HQBWwEcwABqsy7AAH9rAAAAAMAA67RJwABqziXAAGrZgMAAatLAc7QaYMAA7V89MMAAauWAwABq68BztBo/SsAAavcBJsAAavcBHMAAawSAwABq/sBztBpLAQABlADAAPyDYMAA+9AGwADryYKLwABrEMAAayTAAGs7AQDAAHTKAAAAAQPAAGsswABrOwAAAAAAAABgwADzwgFKwABrLwEWwABrLy7AAH8cwADrdAbAAOvKgovAAGtAwABrVMAAbIYBAJ45AAAAAQPAAGtiwABshgAAAAAAAABgwADzwgE+BknAAGtoIhbAAGtsLsAAfxPAAOtqARbAAGt5LrjVwADraT0wwABrg2rAAGuPYMAA9J3AAaCHP07AAGuxwABruAAAgXZdwAD8dAFbARzAAGu6LsAAf2sAAAAAwADrtEnAAGvVJcAAa+CAwABr2cBztUJgwADtXz0wwABr7IDAAGvywHO1Qj9OwABsAsAAbAcAAMAAfytbARzAAGwPgMAAbAnAc7VCSwEAAZMAwAD8g07AAGwcwABsIQAAgpBgwADzrgEewABsJ8AA87oBAAEmwABsRQEcwABsRYHAAGxBwHO1kUsBAAGTAABgwAD70ABKwABsTwEfwABsWsAA6yIDAAMmwABsbwEcwABsb4HAAGxrwHO1kUsBAAGUAABgwAD9tismwABsfgEcwABsfoHAAGx6wHO1kUsBAAGVAABgwADi8wAGwADrkIKLwABsi8AAbJDAAG9sAADAAH9sAAAAAQPAAGyewABvbAAAAAAAAABcAT4FScAAbKcWwABsqy7AAH8VwADrbErAAGzAAD9JwABszBbAAGzQLsAAfx/AAOt4SsAAbOEAPz0XwABs7S7AAH8fKcAA63hPwABtCcAAbQ4AAAGuTGEAXAADwABtE8AAb0kAAAAAAAAAXAE+CT0XwABtHi7AAH8fKsAA63hJwABtPRbAAG1BLsAAfxPAAOtqSsAAbUwAP0nAAG1aIRbAAG1fLsAAfx7AAOt3SsAAbW8AP0nAAG19HMAAbYsWwABtgS7AAH8dwADrdUgBAAGTAMAA/PM+AknAAG2bIhbAAG2fLsAAfxTAAOtrACEWwABtsC7AAH8VwADrbD4FScAAbdEWwABt1S7AAH8WwADrbT0cwABt5C6CiAAAAADAAOuWP07AAG37wABuAwAAVVsBHMAAbhIWwABuBS7AAH8YwADrb0sBAAFqwABuE2DAAPvQUgDAAPyDScAAbiscwABuN4HAAG4vwHO3nUgBAAErAMAA/SlKwABuQAA/PRfAAG5SLsAAfxUpwADrbD0cwABuf4HAAG54wHO3nSAAAAAAAD9KwABulQA/TsAAbq/AAG63AABVWwEcwABuxhbAAG65LsAAfxjAAOtvSwEAAWrAAG7HYMAA+9AJAMAA/INJwABu2RzAAG7lgcAAbt3Ac7gjSAEAASsAwAD9KUrAAG7uAD89F8AAbvwuwAB/HynAAOt4PRzAAG8hgcAAbxrAc7gjIAAAAAAAPR7AAG8rwAC37QEAAYDAAG89wHO2xwA9HsAAb1DAALftAQABgMAAb2LAc7bHAAbAAOuRgovAAG9xwABvdsAAcXcAAMAAf20AAAABA8AAb4XAAHF3AAAAAQAAAcAAb4wAAADAAG8lYMAA+goBasAAb5VgwAD6CnVcAT4EScAAb6IWwABvpi7AAH8hwADrekrAAG+4AD9JwABvxCEWwABvyS7AAH8iwADre0rAAG/ZAD9PwABv5cAAb+oAAAGuTGEAXAADwABv78AAcP4AAAAAAAAAXAE+CD0XwABv+i7AAH8hKsAA63pJwABwGiEWwABwHy7AAH8iwADre0rAAHAvAD9JwABwPRbAAHBBLsAAfxPAAOtqSsAAcEwAP0nAAHBaIRbAAHBfLsAAfyDAAOt5SsAAcHAAPz0XwABwfi7AAH8gKsAA63lOwABwocAAcKkAAFVbARzAAHC4FsAAcKsuwAB/GMAA629LAQABasAAcLlgwAD70BUAwAD8g0nAAHDMHMAAcNiCwABw0MBzuedIAQABKwDAAP0pSsAAcOEAPz0cwABw9oLAAHDvwHO55yAAAAAAAEnAAHEFgMAAcQnAc7j7PgI9F8AAcRouwAB/ISnAAOt6PR7AAHE5wAC37QEAAYHAAHFLwHO5VQA+AT0cwABxa4HAAHFmwHO5VSAAAAAAAAbAAOuSgovAAHGzwABxuMAAeW0AAMAAf24AAAABA8AAccHAAHltAAAAAQEBwABxyQAAAMAAf29gwAD9HAAAXAE+A07AAHJmwABybQAAm69gwAD70AEmwAByZgGAwAByb8Bzus5gwAD70EXAAHJ+AcAAcofAAHKJAABiYMAA+9ABasAAcotgwAD70AkBHMAAcpmCwAByl8BzuxGBawEAAWrAAHKcYMAA+9CBVQDAAPz+AYrAAHKnwHO7ERzAAHKogsAAcqfAc7sRZAEAAZQAwAD89UE+AUnAAHK0IRzAAHLNHMAAcsGBwAByusBzuuWDdwEAARzAAHLGlIO6AQABgsAAcsnAc7sRAMAA++wAwAD76EgBAAGTAMAA/PM+CEnAAHLeIiIcwABy5YLAAHLjwHO7EUgBAAFqwABy6GDAAPvQUgDAAPzzARzAAHL5gsAAcvfAc7sRSAEAAWrAAHL8YMAA+9AJAMAA/PMAFsAAcwouwAB/FMAA62tCwABzGAA/ScAAcyoiFsAAcy4uwAB/E8AA62oAIRzAAHM9gsAAczvAc7sRSAEAAWrAAHNAYMAA+9CBVQDAAPzzQsAAc1AAP0nAAHNiIiIiHMAAc2iCwABzZsBzuxFIAQABasAAc2tgwAD70FIAwAD88wAhFsAAc3suwAB/UMAA674AIRbAAHOLLsAAfxPAAOtqACEWwABzmS641cAA62k+Az0XwABzry7AAH8UKcAA62s9HMAAc84uwAB/bAAAAADAAOuQQsAAc+oAP0nAAHQHHMAAdA2CwAB0C8BzuxFIAQABasAAdBBgwAD70BUAwAD88z4DPRfAAHQoLsAAfyIpwADrez0cwAB0SS7AAH9tAQAAAcAAbyUqwADrkULAAHR0AD9JwAB0kRzAAHSXgsAAdJXAc7sRSAEAAWrAAHSaYMAA+9AJAMAA/PM+AUnAAHSxFsAAdLUuwAB/UMAA674+AT0XwAB00C7AAH8dHMAAdNkWwAB00C7AAH8dwADrdWQBAAGUAMAA/PXAAOt1PgM9F8AAdPwuwAB/HSbAAHT8ARzAAHUILsAAf14AAAAAwADrqGDAAPvQwADrdT0cwAB1Jy7AAH9sAAAAAMAA65BCwAB1RQA/TsAAdXLAAHV6AABVWwEcwAB1iRbAAHV8LsAAfxjAAOtvSwEAAYLAAHWKwHO7EQDAAPyDScAAdZYcwAB1nILAAHWawHO7EUgBAAFqwAB1n2DAAPvQgVUAwAD88z4JQBbAAHXCLsAAfxPAAOtqwAB1wsAAdcsAQCEWwAB14C641cAA62nAAHXfwAB16ABAIiIiIRzAAHZmFsAAdlkuwAB/I8AA631IAQABKwDAAP0pARbAAHZxLsAAf1HAAOu/ARbAAHZ7LsAAf1LAAOvAARbAAHaJLsAAf1PAAOvBwAB2WcAAdpkAScAAdqYhHMAAdrcWwAB2qi7AAH8jwADrfUgBAAErAMAA/Sk+AT0ewAB24sAA8KQBAAEmwAB27wEWwAB27y7AAH8jwADrfWDAAPCUAD89F8AAdxQuuNUpwADraT0cwAB3PhbAAHcvLsAAfxfAAOtuwABuwgAAAADAALjRPRzAAHdULsAAf3AAAAAAwADrnEnAAHd8IRzAAHeIg8AAd4DAc73wSAEAASsAwAD9KT0cwAB3mIPAAHeRwHO98CAAAAAAAD9CwAB3pgA/ScAAd8McwAB3yYLAAHfHwHO7EUgBAAFqwAB3zGDAAPvQIQDAAPzzPgFJwAB35CEWwAB36S7AAH8TwADraj4BPRzAAHgCLqU+AgACHMAAeA4uwAB/OwAAAADAAOu2JwAAwADrnz9JwAB4QCEWwAB4RS641cAA62k+AUnAAHjbIRzAAHjng8AAeN/Ac73wSAEAASsAwAD9KT0cwAB494PAAHjwwHO98CAAAAAAAD8/P0nAAHkXIRbAAHkcLsAAf1DAAOu+PgI9F8AAeTEulTQcwAB5NxbAAHkxLpU0wADrdmQBAAGUAMAA/PXAAOt2PRzAAHlBLsAAf2YBAAFqwAB5TmDAAPvQgz4AwADrkz8GwADrk4KLwAB5csAAeXfAAHqyAADAAH9mAAAAAQPAAHmDwAB6sgAAAAEBAcAAeYgAAADAAH9xYMAA+9AAAFwBPgFJwAB5niIhFsAAeaMuwAB/E8AA62oAIRbAAHmxLrjVwADraT4CQCEcwAB51BbAAHnKLsAAfOTAAOtwSAEAASsAwAD9KcAAecrAAHnbAEnAAHoAHMAAegsWwAB6BC6VNMAA63ZIAQABgMAAeg7Ac8DVAMAA/PM+A0AcwAB6NhbAAHovLpU0wADrdmMBAAEcwAB6O5SDugEAAWrAAHo+YMAA+9CDPgDAAPvsAMAA/P3AAHovwAB6SwA9HMAAelYuwAB/cgEAARzAAHqDHMAAemyUg7oBAAFqwAB6b2DAAPvQwACNJADAAPvsgQYBAAEWwAB6hS6VNMAA63YAwAD76QDAAOuaPRfAAHqWLpU0k8AA63Y/PwbAAOuUgovAAHq3wAB6vMAAe8AAAMAAfzoAAAABA8AAesfAAHvAAAAABQAABcAAeskAAACea1sBagBgwAD82XfAAHrPAAAAgopbAWoAYMAA/Nl3wAB61gAAAIHFWwFqAGDAAPzZd8AAet0AAADAAEZ2WwFqAGDAAPzZd8AAeuUAAADAAH9zWwFqAGDAAPzZd1wBPgU9HMAAewQWwAB69y7AAH8YwADrb4C/AgACasAAewVgwAD70AmAwAB7EsBzwisAwAD8hD0cwAB7KRbAAHscLsAAfxjAAOtvgL8CAAJqwAB7KmDAAPvQFYHAAHs4wHPCPgDAAPyEPRzAAHtQFsAAe0MuwAB/GMAA62+AvwIAAmrAAHtRYMAA+9AhgsAAe1/Ac8JRAMAA/IQ9HMAAe3cWwAB7ai7AAH8YwADrb4C/AgACasAAe3hgwAD70FKDwAB7h8BzwmQAwAD8hD0cwAB7oBbAAHuTLsAAfxjAAOtvgL8CAAJqwAB7oWDAAPvQgVWEwAB7s8BzwnkAwAD8hAbAAOuVgovAAHvFwAB7ysAAfWUAAMAAfzwAAAABA8AAe9bAAH1lAAAAAgAAAsAAe9gAAACea1sBasAAe95gwAD6CnXAAHvkAAAAgopbAWrAAHvrYMAA+gp1XAE+BT0XwAB7+C7AAH8eJsAAe/gBgMAAfAnAc8O6YMAA+grAAOt3PRfAAHwTLsAAfyAmwAB8EwGBwAB8JcBzw9BgwAD6CsAA63lJwAB8MCbAAHw0AYDAAHw0wHPDumDAAPoKPRzAAHw6LsAAf2wAAAAAwADrkD9JwAB8UCbAAHxUAYHAAHxUwHPD0GDAAPoKPRzAAHxbLsAAf20AAAAAwADrkT9JwAB8ciIhFsAAfHcuwAB/GcAA63EAIRbAAHyFLsAAfxPAAOtqPgU9F8AAfJguwAB/GSnAAOtxTsAAfLTAAHy6AACEfGDAAPvQARzAAHy+lIO6AQABasAAfMFgwAD70MAAjFsAwAD77EnAAHzcIRbAAHzhLsAAfxTAAOtrPYrAAHzvwHPEwhzAAHz1gsAAfO/Ac8TCgQYBAAEcwAB8+pSDugEAAWrAAHz9YMAA+9AJAMAA++wAwAD76T9JwAB9DiEWwAB9Ey7AAH8WwADrbT2KwAB9IsBzxMIcwAB9KILAAH0iwHPEwoEGAQABHMAAfS2Ug7oBAAFqwAB9MGDAAPvQFQDAAPvsAMAA++k/PRzAAH1CLsAAf3IBAAGCwAB9VcBzxMIAwADrmj8GwADrloKLwAB9asAAfXHAAH4NAACCiAAAAAEDwAB9dsAAfg0AAAAAAAAAXcAAuKkBWwE+AknAAH1/IiEWwAB9hC7AAH8TwADragAhFsAAfZIuuNXAAOtpPgI9HMAAfaQuwAB/cgEAARzAAH25lIO6AQABasAAfbxgwAD70IM+AMAA++wAwADrmj0XwAB90S7AAH8TKcAA62o/SsAAfe0BFsAAfgMWwAB99C7AAH8XwADrboHcwAC4zgbAAOuXgovAAH4SwAB+F8AAf7EAAMAAcCsAAAABA8AAfh/AAH+xAAAAAQEBwAB+MAAAAMAAf3RgwADz+AAAXAE+AUnAAH5BIiEWwAB+Ri7AAH8TwADragAhFsAAflQuuNXAAOtpPgFBR8AAfmaAwAB+bsBzxpgEAcAAfphqwAB+mGDAAPP4wAGgpQA+Aj0cwAB+qy7AAH91AAAAAMAA65lCwAB+xQABwAB+6WrAAH7pYMAA8/jAAaCxAD4CPRzAAH75LsAAf3YAAAAAwADrmELAAH8UAAHAAH84asAAfzhgwADz+MABoL0APgI9HMAAf0gugogAAAAAwADrlkLAAH9bAAABPgE9MMAAf30fwAB/h8AA+wMBAAGAwAB/lcBzxpgAPwbAAOuYgovAAH+2wAB/u8AAgJQAAMAAf3YAAAABA8AAf8jAAICUAAAAAAAAAFwBPgFJwAB/0SIhFsAAf9YuwAB/E8AA62oAIRbAAH/kLrjVwADraT4CScAAf/YWwAB/+i7AAH8VwADrbD4BPRzAAIAZLoKIAAAAAMAA65Y+AT0cwACAOS7AAH9yAQABHMAAgE6Ug7oBAAFqwACAUWDAAPvQg/IAwAD77ADAAOuaPRfAAIB2LsAAfxYpwADrbT8GwADrmYKLwACAmcAAgJ7AAIFuAADAAH91AAAAAQPAAICqwACBbgAAAAAAAABcAT4BScAAgLMiIRbAAIC4LsAAfxPAAOtqACEWwACAxi641cAA62k+AknAAIDYFsAAgNwuwAB/FsAA620+AT0cwACA9S6CiAAAAADAAOuWPgE9HMAAgRUuwAB/cgEAARzAAIEqlIO6AQABasAAgS1gwAD70IPvAMAA++wAwADrmj0XwACBUS7AAH8UKcAA62s/BsAA65qCi8AAgXPAAIF4wACCRQAAwAB/cgAAAAEDwACBisAAgkUAAAABAQHAAIGPAAAAEmDAAPvQAABcAT4ETsAAgZ/AAIGoAADAAH93YMAA+9ABHMAAgcUcwACBtRbAAIGrLsAAfxrAAOtyg3cBAAFqwACBt2DAAPvQwAGgJwDAAPvogQYBAAGAwACBx8BzyTcAwAD76UAhFsAAgdkuwAB/E8AA62rAAIHYwACB4gA9HMAAgekuwAB/SAAAAADAAOubPR7AAIIUwADubAMAAy4WwACCLhbAAIIkLsAAfOTAAOtwwAB0VcAAz72BwACCOMBzyUsABsAA65uCi8AAgkrAAIJPwACD+QAAwAB/SAAAAAEDwACCZMAAg/kAAAAAAAAAXAE+A0AhFsAAgnUuuNXAAOtpwACCdMAAgn0AScAAgoQcwACCkhbAAIKILsAAfOTAAOtwSAEAASsAwAD9KT4BPRfAAIKjLsAAfOQewACCs8AAz7cBAAEWwACCwi7AAH9uwADrkgDAAOtwP0nAAILYIRrAAILdwADrfD4DPR7AAIL/wADJoAIAAifAAH94asAAg05hAltbXcAAuKkBYMAAyarAAaDJAD0ewACDZcAAyaACAAInwAB/eWrAAIOyYQJgwAD9tl3AAPylAmDAAP22YMAA/bZdwAC4qQFgwADJqsABoM4APRvAAIPQwADrfCk/BsAA65yCi8AAg/7AAIQDwACE2wAAwAB/cAAAAAEDwACEHcAAhNsAAAAAAAAAXAE+BEAhHMAAhDcWwACELS7AAHzkwADrcEgBAAErAMAA/SnAAIQtwACEPgA9HMAAhE8WwACERS7AAHzkwADrcIKIAAAAAMAAz7s9F8AAhFwuwAB85CvAAOtwPRfAAITLLq33K8AA634GwADrnYKLwACFJsAAhTLAAIWQAAHAAH96AAAAAQPAAIVBwACFkAAAAAEBAcAAhUIAAACDUVsAAGDAAPoKAT4BSsAAhVIBIiXAAIVigMAAhVnAc8vfXcAA/HQBWwAhHMAAhXkcwACFdRTAAIVtwHPL3wABXcAA/HQBW0sBAAGTAMAA/INIAQABasAAhXxgwAD70AkAwAD9KQbAAOuegovAAIXtwACF9MAAiNgAAcAAf3sAAAABA8AAhf/AAIjYAAAABAIEwACGAAAAAIHFWwDAAIYOAAAAImDAAP22AMAAhi4AAADAAHTKYMAA88IBagBgwAD82XfAAIY7AAAAlldgwAD70AFqAGDAAPzZdwBbAT4BScAAhkglwACGUoDAAIZMwHPMd2DAAO1fPgFKwACGZgEfwACGccAA9KYEAAGBwACGgcBzzIIDg0cUwACGncBzzHcAAWDAAO1fwAB0yoLAAIatwHPMkJZXg8AAhrzAc8ypScAAhs4lwACG2IDAAIbSwHPMd13AAPx0AVs+AkAewACG8MAA650BAAEUwACHAMBzzHcAAV3AAPx0AVsAwACG8MAAhwYAR8AAhw8cwACHHBTAAIcXwHPMdwABXcAA/HQBW0sBAAGTAMAA/IMDAcAAhzBqwACHMGDAAPvQFQA+AUrAAIdUAR/AAIdfwAD7AwAAAAABwACHfWrAAId9YMAA+9AhAD4BSsAAh5kBH8AAh6TAAPSmBAABgcAAh7TAc8yCA4NHH8AAh9jAAO1nAgACJsAAh+UBHMAAh+UUwACH4MBzzHcAAV3AAPx0AVtLAQABlQDAAPyDYMAA/bYmwACH7wEcwACH7xTAAIfqwHPMdwABXcAA/HQBW0sBAAGUAMAA/INgwAD70ADAAHTKgsAAiAzAc8yQlleDwACIKcBzzKkAAT4BSsAAiEsBHsAAiFbAAPubAQABJ8AAf3wAPgFKwACIjQEfwACImMAA9KYDAAGBwACIqMBzzIICwAB0yoLAAIi6wHPMkJZXg8AAiMnAc8ypBsAA65+Ci8AAiN3AAIjiwACJ/AAApT4AAAABA8AAiO3AAIn8AAAAAgICwACI7gAAAIHFWwDAAIj8AAAAImDAAP22AABcAT4DTsAAiQ/AAIkRAACDTVsBHsAAiRPAAOueBAAEgMAAiR/Ac87hgcAAiSbAc87sFsAAiS8uwAB0ysAA68kWwACJOC7AAH8bwADrcwBJwACJcCEcwACJjhzAAImBFsAAiXQuwAB/GMAA629LAQABasAAiYJgwAD70CEAwAD8g0gBAAErAMAA/Sk+AT0cwACJuBzAAImsFsAAiZ8uwAB/GMAA629LAQABasAAia1gwAD70CEAwAD8gyABAAGCwACJucBzzwAAAD89HMAAifEugogAAAAAwADrlgbAAOuggovAAIoBwACKAcAAiukAAMAAf30AAAABA8AAigrAAIrpAAAAAQEBwACKGAAAAIMmYMAA9AUAAFsBPgRJwACKJhzAAIoxgMAAiirAc9ABSAEAASsAwAD9KT0wwACKOh/AAIpEwAD7BQEAASeDJgA/TsAAim3AAIp0AACBdlsBHMAAinYuwAB/fgIAAibAAIqNARbAAIqNgMAAiobAc9ABlwbAAOn5wAD0DmDAAPvQFsAAiqIWwACKnRbAAIqVLsAAdMrAAOvJgpDAAPPMlwbAAOn5wADztwDAAOu3ScAAiq8lwACKuoHAAIqzwHPQSmDAAO1fPTDAAIrGFMAAiszAc9BKAQFgwADtXz9KwACK2AGBwACK38Bz0EoGwADroYKLwACK7sAAivPAAIvkAADAAH9/AAAAAQPAAIr8wACL5AAAAAICAsAAiwoAAACDJmDAAPQFAMAAixIAAACAllsAAGDAAPoKAT4EScAAix8cwACLKoDAAIsjwHPRH0gBAAErAMAA/Sk9MMAAizMfwACLPcAA+wUBAAEngyYAP07AAItmwACLbQAAgXZgwADtXwEcwACLby7AAH+AAwADJsAAi4YBFsAAi4aAwACLf8Bz0R+XBsAA6fnAAPQOYMAA+9AWwACLmxbAAIuWFsAAi44uwAB0ysAA68mCkMAA88yXBsAA6fnAAPO3gcAAi6PAc9EuAMAA67lJwACLryEcwACLuoLAAIuzwHPRd0gBAAErAMAA/Sk9MMAAi8OCwACLycBz0Xc/SsAAi9UBKQbAAOuigovAAIvpwACL88AAjT4AAMAAf4EAAAABA8AAi//AAI0+AAAAAQEBwACMEAAAAIMmYMAA9CMAAGDAAOLzAT4FScAAjB4cwACMKYDAAIwiwHPSUEgBAAErAMAA/Sk9MMAAjDIfwACMPMAA+wUBAAEngyYAP0nAAIxhHMAAjHIWwACMbIDAAIxlwHPSUICWwAD0KUgBAAErAMAA/Sk9MMAAjHsfwACMhcAA+wUBAAEnwAB/ggA/TsAAjLXAAIy8AACBdmDAAO1fARzAAIy+LsAAf4MDAAMWwACM2IDAAIzRwHPSUITNwAD0JxbAAIzmgMAAjN/Ac9JQgybAAPQoFsAAjPWAwACM7sBz0lCAlsAA9CkAwADruEnAAI0BIRzAAI0MgcAAjQXAc9LeSAEAASsAwAD9KT0wwACNFYHAAI0bwHPS3j9KwACNJwEWwACNNYDAAI0uwHPSUICWwAD0KQbAAOujgovAAI1DwACNSMAAjnoAAMAAf4QAAAABA8AAjVTAAI56AAAAAQEBwACNZQAAAIMmYMAA9CMAAFwBPgRJwACNcxzAAI1+gMAAjXfAc9OySAEAASsAwAD9KT0wwACNhx/AAI2RwAD7BQEAASeDJgA/ScAAjbYcwACNxxbAAI3BgMAAjbrAc9OygJbAAPQpSAEAASsAwAD9KT0wwACN0B/AAI3awAD7BQEAASfAAH+CAD9OwACOCsAAjhEAAIF2YMAA7V8BHMAAjhMuwAB/hQMAAxbAAI4tgMAAjibAc9OyhM3AAPQnFsAAjjuAwACONMBz07KDJsAA9CgWwACOSoDAAI5DwHPTsoCWwAD0KQDAAOu6ScAAjlYhHMAAjmGBwACOWsBz1DxIAQABKwDAAP0pPTDAAI5qgcAAjnDAc9Q8PwbAAOukgovAAI5/wACOj8AAkhkAAMAAf4YAAAABA8AAjp/AAJIZAAAAAgICwACOtwAAAMAAfytgwADzwgDAAI7OAAAAnTRgwADz2gAAYMAA88IBPgFJwACPdSIawACPgsAA8aQAHMAAj5cWwACPkoDAAI+NwHPU9oKQwADzzEgBAAFqwACPrmDAAPOuwAGakgDAAP0pPgFJwACPvCEcwACPyoHAAI/AwHPVB0gBAAErAMAA/Sk+AkXAAI/dAcAAj+bAAI/oAABiYMAA+9ABkwEcwACP74LAAI/twHPVh2MBAAEWwACQBRbAAI/7gcAAj/HAc9UHwAB8EMAA8+JhwAD8owDAAPz9AYrAAJANwHPVhxzAAJAOgsAAkA3Ac9WHZAEAAZQAwAD89T4BScAAkB4cwACQPhbAAJA5HMAAkDUWwACQLIHAAJAiwHPVB8AAfBDAAPPiSwEAAYLAAJA2wHPVhwDAAPyDgpDAAPPMSAEAAWrAAJBVYMAA867AAZqSAMAA/Sk+AUrAAJBpARzAAJCDFsAAkHqBwACQcMBz1QfAAHwQwADz4ksBAAGCwACQhMBz1YcAwAD8gz89MMAAkNkfwACQ48AA9KYBAAEkAAInwAB/hyfAAH+IAD4BSsAAkckBGsAAkeDAAPPIPgFKwACSBAErBsAA66WCi8AAkh7AAJIjwACTlgAAwAB/iQAAAAEDwACSMMAAk5YAAAACAgLAAJJBAAAAwAB/K2DAAPPCAMAAklgAAACdNGDAAPPaAABcAT4ETsAAknrAAJKIAADAAH+KYMAA6v8BJsAAknoBHMAAkoouwAB/hgIAAoDAAJKbwHPW6oHAAJKhwHPW+wDAAOukYMAA6v9OwACStcAAksQAAMAAf4tgwAD70AEjHMAAktCBwACSxsBz1vtIAQABKwDAAP0pkxbAAJLogcAAkt7Ac9b7J8AA8+EBYMAA+9BOwACS98AAkv4AAIF2YMAA7V8BHMAAkwAuwAB/jAMAAxbAAJMvJsAAkxoAgMAAkxXAc9bqYMAA6v/AAH7VwADp+cAA6wk1AAAAAQBgwADq/wGCwACTQcBz1xAjHMAAk1CEAMBz1+FIAQABKwAAKxbAAJNQhADAc9fhwAB+1cAA6fnAAOsJAWDAAOLzg8AAk1rAc9dUAMAA67tJwACTbyXAAJN6hMAAk3PAc9ecYMAA7V89MMAAk4YUwACTjMBz15wEAWDAAO1fPwbAAOumgovAAJObwACToMAAlRUAAMAAf40AAAABA8AAk67AAJUVAAAAAgICwACTvwAAAMAAfytgwADzwgDAAJPWAAAAnTRgwADz2gAAXAE+BE7AAJP4wACUBgAAwAB/imDAAOr/ASbAAJP4ARzAAJQILsAAf4YCAAKAwACUGcBz2I+BwACUH8Bz2KAAwADrpGDAAOr/TsAAlDPAAJRCAADAAH+LYMAA+9ABIxzAAJROgcAAlETAc9igSAEAASsAwAD9KZMWwACUZoHAAJRcwHPYoCfAAPPhAWDAAPvQTsAAlHXAAJR8AACBdmDAAPoKARzAAJR+LsAAf44DAAMWwACUribAAJSZAIDAAJSUwHPYj2DAAOr/wAB+1cAA6fnAAOsJNQAAAAEAYMAA6v8BgsAAlMDAc9i1IxzAAJTPhADAc9mGSAEAASsAACsWwACUz4QAwHPZhsAAftXAAOn5wADrCQFgwADi84PAAJTZwHPY+QDAAOu8ScAAlO4lwACU+YTAAJTywHPZQWDAAO1fPTDAAJUFhMAAlQvAc9lBPwbAAOungovAAJUawACVH8AAlWMABMAAfycBagBgwADLBsABoNgAAAEDwACVMMAAlWMAAAACAgLAAJU1AAAAs1VgwAD70ADAAJU9AAAAwAB/GmDAAPvQAABcAAbAAOuogovAAJVnwACVZ8AAlZIABMAAf14BagBgwADLBsABoOwAAAEDwACVdsAAlZIAAAAAAAAAWwAGwADrqYKLwACVlsAAlZbAAJW+AATAAH9XAWoAYMAAywbAAaEAAAABA8AAlaDAAJW+AAAAAQEBwACVpQAAAJdmYMAA+9AAAFsABsAA66qCi8AAlcLAAJXCwACV6wAEwAB/XAFqAGDAAMsGwAGhFAAAAQPAAJXQwACV6wAAAAAAAABbAAbAAOurgovAAJXvwACV78AAlkMABMAAf2EBagBgwADLBsABoSgAAAEDwACV+sAAlkMAAAADAwPAAJYFAAAAgotdwAD8dAFgwAD70ADAAJYRAAAAg1xgwAD70ADAAJYdAAAAhDRgwAD70AAAWwAGwADrrIKLwACWR8AAlkfAAJa2AATAAH9kAWoAYMAAywbAAaE8AAABA8AAllPAAJa2AAAABQUFwACWXgAAAIKLXcAA/HQBYMAA+9AAwACWagAAAINcYMAA+9AAwACWdgAAAIQ0YMAA+9AAwACWhwAAAMAAdMpgwADi8wDAAJaaAAAAlldgwAD70AAAWwAGwADrrYKLwACWusAAlrrAAJcFAATAAH81AWoAYMAAywbAAaFQAAABA8AAls3AAJcFAAAAAgICwACW2AAAAMAAfytgwADi8wDAAJbiAAAAlldgwAD70AAAWwAGwADrroKLwACXCcAAlwnAAJd4AATAAH82AWoAYMAAywbAAaFkAAABA8AAlyDAAJd4AAAAAwMDwACXKwAAAMAAfytgwADi8wDAAJc1AAAAlldgwAD70ADAAJdFAAAAwAB/l2DAAOLzAABbAAbAAOuvgovAAJd8wACXgcAAl70ABMAAfzcBagBgwADLBsABoXgAAAEDwACXjMAAl70AAAABAQHAAJeRAAAAwAB/mWDAAPvQAABgwAD6CgAGwADrsIKLwACXwcAAl8HAAJhFAATAAH9GAWoAYMAAywbAAaGMAAABA8AAl9fAAJhFAAAABQUFwACX4gAAAMAAfytgwADi8wDAAJfsAAAAlldgwAD70ADAAJf2AAAAwAB/Q2DAAPvQAMAAmAQAAADAAH9EYMAA+goAwACYFwAAAMAAf0VgwAD6CgAAWwAGwADrsYKLwACYScAAmEnAAJjQAATAAH9OAWoAYMAAywbAAaGgAAABA8AAmGHAAJjQAAAABQUFwACYbAAAAMAAfytgwADi8wDAAJh2AAAAlldgwAD70ADAAJiBAAAAwAB/S2DAAPoKAMAAmJoAAADAAH9MYMAA+goAwACYqQAAAMAAf01gwAD70AAAWwAGwADrsoKLwACY1MAAmNTAAJkTAATAAH9nAWoAYMAAywbAAaG0AAABA8AAmODAAJkTAAAAAQEBwACY7wAAAMAAe8JgwADrPwAAWwAGwADrs4KLwACZF8AAmRvAAJlCAATAAH9qAWoAYMAAywbAAaHIAAABA8AAmSjAAJlCAAAAAAAAAGDAAPvQAAbAAOu0govAAJlGwACZS8AAmX4ABMAAf2sBagBgwADLBsABodwAAAEDwACZXsAAmX4AAAAAAAAAXcAA/HQBWwAGwADrtYKLwACZgsAAmYbAAJm1AATAAH+fAWoAYMAAywbAAaHwAAABA8AAmZfAAJm1AAAAAAAAAGDAAPvQAAbAAOu2govAAJm5wACZwcAAmeoABMAAfzsBagBgwADLBsABogQAAAEDwACZz8AAmeoAAAAAAAAAYMAA7V8ABsAA67eCi8AAme7AAJnuwACaMQAEwAB/fgFqAGDAAMsGwAGiGAAAAQPAAJn9wACaMQAAAAICAsAAmgIAAACDJmDAAPvQAMAAmg4AAADAAH+jYMAA+9AAAFsABsAA67iCi8AAmjXAAJo9wACamQAEwAB/gwFqAGDAAMsGwAGiLAAAAQPAAJpPwACamQAAAAMDA8AAmlQAAACEzWDAAPvQAMAAml8AAACDJmDAAPvQAMAAmnEAAAASYMAA4vMAAGDAAO1fAAbAAOu5govAAJqdwACapcAAmvUABMAAf4ABagBgwADLBsABokAAAAEDwACatMAAmvUAAAADAwPAAJq5AAAAgyZgwAD70ADAAJrFAAAAwAB/o2DAAPvQAMAAms8AAACAllsAAGDAAO1fAAbAAOu6govAAJr5wACbAcAAm10ABMAAf4UBagBgwADLBsABolQAAAEDwACbE8AAm10AAAADAwPAAJsYAAAAhM1gwAD70ADAAJsjAAAAgyZgwAD70ADAAJs1AAAAEmDAAOLzAABgwADtXwAGwADru4KLwACbYcAAm2nAAJvdAATAAH+MAWoAYMAAywbAAaJoAAABA8AAm3zAAJvdAAAAAwMDwACbhwAAAMAAfytgwADi8wDAAJuXAAAAwAB/imDAAOLzAMAAm7AAAADAAH+LYMAA+9AAAGDAAO1fAAbAAOu8govAAJvhwACb5sAAnFwABMAAf44BagBgwADLBsABonwAAAEDwACb+sAAnFwAAAADAwPAAJwFAAAAwAB/K2DAAOLzAMAAnBUAAADAAH+KYMAA4vMAwACcLgAAAMAAf4tgwAD70AAAYMAA+goAAABzfRIAc38QAHOAMwBzg6AAc4/2AHOR4QBzlMcAc5joAHOZVwBznVsAc53PAHOeQwBznrcAc58rAHOfnwBzoBMAc6B0AHOgwwBzoRIAc6T7AHOnxwBzrWEAc7BFAHOypQBzs7AAc7SRAHO02ABztk0Ac7jOAHO6ogBzwKkAc8H+AHPDjQBzxbMAc8ZsAHPHjwBzyE0Ac8kLAHPKAQBzyx4Ac8uzAHPMSwBzzrcAc8/VAHPQ8wBz0iQAc9OGAHPUygBz1r4Ac9hjAHPaAQBz2lsAc9qVAHPa3gBz2xgAc9uFAHPcEgBz3GwAc9zXAHPdJgBz3bMAc95AAHPeiwBz3skAc98JAHPfRwBz34UAc9/fAHPgSQBz4LIAc+EcAHPhjQBz4f4AAABIAsAA69SCi8AAnGHAAJxnwACmSQPAAH+pAAABXcAAuVgBYMAA9FYAAWDAAPPmBATAAOvXgovAAJzFwACczAnAAH+qwADp+QBgwADrPwAEwADr2IKLwACc7MAAnPcYwABu/sAA6fkAXcAAueABYMAA9FYBKwTAAOvZgovAAJ0HwACdFRjAAH+rwADp+QBgwADPrAErBMAA69qCi8AAnR7AAJ0lGMAAf6zAAOn5AGDAAPoKAAEFwADr64KLwACehcAAnoXAAJ6xAAAAA8AAnpXAAJ6xAAAAAgICwACemwAABMAAf6pgwADrPwDAAJ6pAAAEwAB/rGDAAPoKAABgwADr1AE/AwgBwADr14AAwHPj/wgBwADr2oEAwHPkEAkBwACehcAAuY4AAAAACgbAAOvcgovAAJ0qwACdSsAAnoAAAZ5wAAAAAQPAAJ1OwACegAAAAAUFBcAAnVYAAADAAHTKWwDAAJ1jAAAAlldgwAD70ADAAJ1tAAAAwAB/Q2DAAPvQAMAAnXsAAADAAH9EYMAA+goAwACdiAAAAMAAf0VgwAD6CgAAXcAAuKkBYMAA69QBPgM9HsAAnZbAAOonAQABgcAAnabAc+SIAEnAAJ2xHMAAnb2CwACdtcBz5JdjAQABkwDAAPz9PTDAAJ3CH8AAnczAAPsDAQABJMAAnfQCJ8AAf62CwACd7MBz5JcAP0rAAJ37ARzAAJ5GHsAAnhDAAOuIBQAFgMAAnhXAc+R7gcAAnh7Ac+SIgsAAniTAc+SXg8AAni3Ac+SohMAAnjXAc+S5AIGtAQFgwADr1AE0wACeSwPAAJ5LwACeewAAAAEBAcAAnkwAAADAAHvCYMAA6z8AAGDAAOvUAUrAAJ5XAR/AAJ5bwADr6wIAAoXAAJ5swHPlmIPAAJ50wHPkqAAAwAC4vAbAAOvdgovAAJ62wACe1MAAozkAAIH5AAAAAQPAAJ7awACjOQAAAAQBAcAAnuAAAADAAG7hYQFgwAD0VlwAA8AAnwkAAACB62DAAPvGAWoAYMAA/Nl3wACfFwAAAIOJYQBcAWoAYMAA/Nl3wACfJgAAAMAAbq5gwAD6CgFqAGDAAPzZd13AALmRAWDAAPRWAT4FScAAnzwhHMAAn0wWwACfQC7AAG7+wADp+cAA69hIAQABKwDAAP0pPgE9MMAAn10fwACfZ8AA+3ABAAEnwAB/rgA/TsAAn6PAAJ+oAACkYmDAALzhARrAAJ+vwAC85z0XwACfvC7AAG7+wADp+R7AAJ/OwAC57AUBYMAA9FYABZmnKcAAbsoWwACgBi7AAH+vwADp+cAA6+LAAG7MFsAAoDQuwAB/r8AA6fnAAOviwABu8hbAAKBhLsAAf7DAAOn5wADr48AAbssWwACgiC7AAH+wwADp+cAA6+PAAOvYPRzAAKCqFsAAoKIuwAB/qsAA6fnAAOvXwAB/OgMAAAOeaxzAAKDBhMAAoLzAc+avwABwZQEAATTAAKDVA8AAoNXAAKGzAAAAAAAAAGDAAPzZAT4BQ8AAoOAcwACg+RbAAKDvFsAAoOcuwAB/qsAA6fnAAOvXwAB/HcAA63WAlwEAAZMAwAD8/z4ETsAAoQzAAKETAADAAHvCYMAA6z8BHMAAoR0WwAChFS7AAH+qwADp+cAA69eETQAAAADAAOuPScAAoS8cwAChOoXAAKEzwHPn1UgBAAErAMAA/SlKwAChQwA/PRzAAKFfFsAAoVMuwABu/sAA6fnAAOvYVgEAAR/AAKFnwADsFgEAAYXAAKFywHPn1QAAwAC59EnAAKGEFsAAoZQWwAChiC7AAG7+wADp+cAA69jAAG7QwAC56UrAAKGeAD8AwAC8+oHFHMAAocKEwAChvcBz5q/AAG8zAQFbATTAAKHbA8AAodvAAKIgAAAAAQEBwACh3AAAAINNWwAAYMAA/NkBPgI9HMAAofMWwACh5y7AAG7+wADp+cAA69icDgEAAYXAAKH8wHPowQDAALn1PRzAAKISFsAAogYuwABu/sAA6fnAAOvYgogAAAAAwAC59gDAALz7wAB/czTAAKIuA8AAoi7AAKK+AAAAAAAAAGDAAPzZAT4CPRzAAKJFFsAAojkuwABu/sAA6fnAAOvYgogAAAAAwAC59knAAKJUIRzAAKJnFsAAolguwAB/q8AA6fnAAOvZSAEAASsAwAD9KT4CPRzAAKKJFsAAonouwAB/q8AA6fnAAOvZgogAAAAAwADPsj0XwACimi7AAH+rwADp+SvAAOvZP8AA65RKwACixQEcwACi3xbAAKLYFsAAoswuwABu/sAA6fnAAOvYgfXAALnigfkEAAGAwACi5sBz5gQDgeuBwACi/8Bz5hmDiYLAAKMQwHPmMMAAbq6DwACjJ8Bz5kXAALloBsAA6+WCi8AAoz7AAKNGwACjWgEAllcAAAABA8AAo0vAAKNaAAAAAAAAAGDAAPvQAUrAAKNOARbAAKNWFsAAo04uwAB/qsAA6fnAAOvXllfAAOvHBsAA6+aCi8AAo1/AAKNzwACjjQEAwAB0ygAAAAEDwACje8AAo40AAAAAAAAAYMAA88IBSsAAo34BFsAAo4YWwACjfi7AAH+qwADp+cAA69fAAHTKwADryQbAAOvegovAAKOSwACjqsAApHMAAIKIAAAAAQPAAKOvwACkcwAAAAAAAABdwAC4qQFgwADz5gE+AUrAAKO4ARzAAKPPHMAAo8cWwACjvy7AAH+qwADp+cAA69eCiAAAAADAAOuWga0BAWDAAPPmATTAAKPlA8AAo+XAAKRuAAAAAQEBwACj5gAAAIC1WwAAYMAA69QBPgJJwACj8SEcwACkBBbAAKP1LsAAf6vAAOn5wADr2UgBAAErAMAA/Sk+Aj0cwACkJhbAAKQXLsAAf6vAAOn5wADr2YKIAAAAAMAAz7I9F8AApDcuwAB/q8AA6fkrwADr2T9KwACkXAEuAMAAuLwGwADr4IKLwACkeMAApH3AAKS/AADAAHbzwADp+QAAAAEDwACkg8AApL8AAAAAAAAAXAE+AT0cwACklBbAAKSMLsAAf6rAAOn5wADr18AAfzwCAAACnmsqgooqwADrlQbAAOvhgovAAKTEwACkycAApQsAAMAAf7HAAOn5AAAAAQPAAKTQwAClCwAAAAAAAABcAT4BPRzAAKThFsAApNkuwAB/qsAA6fnAAOvXwAB/PAIAAAKeaymCiirAAOuVBsAA6+KCi8AApRDAAKUVwACllAAAwAB/r8AA6fkAAAABA8AApS/AAKWUAAAAAAAAAFwBPgFJwAClOBbAAKVIFsAApTwuwABu/sAA6fnAAOvYwABu08AAueo+AT0cwAClXS7AAH+xwADp+QAAAADAAOvhPgE9HMAApYMWwACley7AAH+qwADp+cAA69eCiAAAAADAAOuWBsAA6+OCi8AApZnAAKWewACmDAAAwAB/sMAA6fkAAAABA8AApbHAAKYMAAAAAAAAAFwBPgFJwACluhbAAKXKFsAApb4uwABu/sAA6fnAAOvYwABu0MAAuek+AT0cwACl3C7AAHbzwADp+QAAAADAAOvgPgE9HMAApfkuwAB/scAA6fkAAAAAwADr4QbAAOvpgovAAKYRwACmGsAApkcCAMAAd7XAAOn5AAAAAQPAAKYgwACmRwAAAAEBAcAApiEAAACt91sAAFwBPgE9F8AApjYWwACmLi7AAH+qwADp+cAA69et94DAAKY+wHPt6sAA634AAHPkUQBz5doAc+osAHPqgABz6tgAc+vbAHPsOgBz7JkAc+0vAHPtugBz7iEAAAAKAsAA6+yCi8AApkzAAKZSwAC56APAAH+yAAABXcAAuVgBYMAA9DsAAWDAAPRWBQTAAOvvgovAAKapwACmsAnAAH+qwADp+QBgwADrPwAEwADr8IKLwACm1cAApuAYwABu/sAA6fkAXcAAueABYMAA9DsBKwTAAOvxgovAAKbpwACnAhjAAH+zwADp+QBgwAD6CgEpBMAA6/KCi8AApwvAAKclGMAAf7TAAOn5AGDAAPoKASkEwADr84KLwACnZsAAp4MYwAB/tcAA6fkAYMAA+goBKgEFwADsFoKLwACqOcAAqjnAAK3GAAAAA8AAqkPAAK3GAAAAAQEBwACqSQAABMAAf6pgwADrPwAAYMAA6+wBPgNOwACqXMAAqmEAAKRiYMAAvOEBGsAAqmjAALznPRfAAKp1LsAAbv7AAOn5HsAAqofAALnsBQFgwAD0OwAFmacpwABuyhbAAKq/LsAAf6/AAOn5wADsBMAAbswWwACq7S7AAH+vwADp+cAA7ATAAG7yFsAAqxouwAB/sMAA6fnAAOwDwABuyxbAAKtBLsAAf7DAAOn5wADsA8AA6/A9HMAAq2MWwACrWy7AAH+qwADp+cAA6+/AAH86BQAABZ5rNMAAq34DwACrfsAAq6gAAAAAAAAAXAFKwACrhAEcwACrkBbAAKuELsAAbv7AAOn5wADr8FYBAAFqwACro2DAAPQ7wAGfRADAALn0goo0wACruQPAAKu5wACsjgAAAAAAAABgwAD82QE+Aj0XwACsOC7AAH+2KsAA7BI9HMAArGoWwACsXi7AAG7+wADp+cAA6/BWAQABasAArH1gwAD0O8ABoosAwAC59MAARnY0wACsoAPAAKygwACs0AAAAAAAAABcAUrAAKymARzAAKyyFsAArKYuwABu/sAA6fnAAOvwVgEAAWrAAKzFYMAA9DvAAaKXAMAAufTAAH9zNMAArOUDwACs5cAArUQAAAAAAAAAYMAA/NkBPgI9HMAArQAWwACs9C7AAG7+wADp+cAA6/BWAQABasAArRNgwAD0O8ABoqMAwAC59D0cwACtMhbAAK0mLsAAbv7AAOn5wADr8IKIAAAAAMAAufaBxRzAAK1agcAArVXAc+9mwABvMwEBWwE0wACtcwPAAK1zwACtwAAAAAEBAcAArXQAAACDTVsAAGDAAPzZAT4CPRzAAK2PFsAArYMuwABu/sAA6fnAAOvwnA4BAAGCwACtmMBz8bkAwAC59T0cwACtrhbAAK2mLsAAf6rAAOn5wADr74KIAAAAAMAA65YAwAC8+8AA65QCCAHAAOvvgADAc+9LCQHAAKo5wAC5jgAAAAAaBsAA6/WCi8AAp4jAAKehwACoXQABwAB/PwAAAAEDwACnqMAAqF0AAAAEBATAAKewAAAAllZbAMAAp7oAAACWV2DAAPvQAMAAp8AAAADAAH8yWwDAAKfYAAAAwABvNmDAAPqmAABdwAC4qQFgwAD0VgE+AUrAAKfnARzAAKgxHsAAp/zAAOuEBAAEgMAAqATAc/JrgcAAqArAc/J2gsAAqBDAc/KFg8AAqB/Ac/KSAIGtAQFgwAD0VgE0wACoNgPAAKg2wACoWAAAAAEBAcAAqDcAAADAAHvCYMAA6z8AAGDAAOvsAUrAAKhCAR/AAKhGwADsFgEAAYTAAKhRwHPzDAAAwAC4vAbAAOv2govAAKhiwACojMAAqjQAAcAAfzEAAAABA8AAqJjAAKo0AAAAAwMDwACooAAAAJZWWwDAAKiqAAAAlldgwAD70ADAAKiwAAAAwAB/MlsAAF3AALipAV3AAPRMAWDAAOvsAT4BSsAAqMUBHMAAqQsewACo2sAA64MDAAOAwACo58Bz83GBwACo7cBz83yCwACo88Bz84sAga0BAV3AAPRMAWDAAOvsATTAAKkQA8AAqRDAAKovAAAAAQEBwACpLwAAAMAAf7ddwAD0TAFgwADrPwAAXcAA9EwBYMAA6+wBPgJOwACpXMAAqWAAAZ+TXcAAuKkBYMAA6+wBHMAAqX8WwACpbYPAAKliwHP0BMAAe8LAAPROga0BAWDAAOvsATTAAKmEA8AAqYTAAKnAAAAAAQEBwACpkwAAAMAAf7hgwADrPwAAYMAA6+wBSsAAqaQBH8AAqajAAOwWAQABhMAAqbPAc/R8AADAALi8SsAAqckBH8AAqdTAAPRVAgFgwADr7AACwAB7woTAAKoEwHP0K8AAbswWwACqHoPAAKoTwHP0BMAAb+PAAOn5wAD0UADAALi8BsAA7AeCi8AArcvAAK3TwACuhAQBwAB/ucAA6fkAAAABA8AArejAAK6EAAAAAAAAAGDAAOvsAT4ETsAArfXAAK38AACdO2DAAOs/AR/AAK4CwADrzwAAAAA9F8AAriOAwACuHMBz9TfAAH8UKcAA62s9F8AArkOAwACuPMBz9TfAAH8VKcAA62xKwACuYwEfwACubsAA7BYBAAGAwACuecBz9TcABsAA7AiCi8AAronAAK6RwACwOAQBwAB/usAA6fkAAAABA8AArqXAALA4AAAAAQEBwACuqgAAAMAAf7tgwAD70AAAYMAA6+wBPgZOwACuuMAArr8AAJ07YMAA6z8BH8AArsXAAOvPAAAAAD0XwACu5oHAAK7fwHP17cAAfxYpwADrbUnAAK8AIRzAAK8HgMAArwTAc/XSSAEAASsAwAD88z0ewACvEMAA6ioCAAKBwACvIMBz9e2AwACvKMBz9dIAP07AAK81wACvPAAAgXZgwADr7AEfwACvQsAA7BYBAAGBwACvTcBz9e0AScAAr1ohHMAAr2GAwACvXsBz9dJIAQABKwDAAPzzPgJOwACvdsAAr4EAAMAAf7xgwAD70AEewACvj8AA9SEBAAEWwACvqILAAK+hwHP2ZMAAf6rAAOn5wADr7wA9F8AAr7+CwACvuMBz9mTAAH+1wADp+SIawACv6sAA8aQAHMAAsACDwACv9cBz9q1IAQABasAAsANgwAD70AkAwAD888AA6/M/SsAAsCcBgsAAsC7Ac/ZkBsAA6/eCi8AAsD3AALBgwACxQQAAgfkAAAABA8AAsGbAALFBAAAABAEBwACwbAAAAMAAbuFhAWDAAPQ7XAADwACwmgAAAIHrYMAA+8YBagBgwAD82XfAALCoAAAAg4lhAFwBagBgwAD82XfAALC3AAAAwABurmDAAPoKAWoAYMAA/Nl3XcAAuZEBYMAA9DsBPgFKwACwzQEcwACw5xbAALDgFsAAsNQuwABu/sAA6fnAAOvwgfXAALnigfkEAAGAwACw7sBz92oDgeuBwACxB8Bz93+DiYLAALEYwHP3lsAAbq6DwACxL8Bz96vAALloBsAA6/iCi8AAsUbAALFKwACxagAAwAB/HQAAAAEDwACxU8AAsWoAAAAAAAAAYMAA+9ABSsAAsVkBFsAAsWEWwACxWS7AAH+qwADp+cAA6+/AAH8dwADrdQbAAOv5govAALFvwACxecAAs28AAJ5rAAAAAQPAALF9wACzbwAAAAEAAcAAsYMAAACXZmDAAPvQAWoAYMAA/Nl3AGDAAOLzAT4BScAAsY8WwACxky7AAH+1wADp+cAA6/M+BU7AALG2wACxwAAAwAB/HWDAAPvQARzAALHHLsAAfx0AAAAAwADr+EnAALHaHMAAseiBwACx3sBz+OxIAQABkwDAAPzzSsAAse4BKz9OwACyBcAAsgoAABJgwADi8wEcwACyFBbAALIMLsAAf6rAAOn5wADr755rAQABgMAAshnAc/iyAMAA64tJwACyJSIcwACyLoLAALIpwHP5OEgBAAErAMAA/SkBHMAAskUWwACyPoLAALI5wHP5OGHAAPyjYwEAAYHAALJHwHP47ADAAPz9PgE9HsAAstrAALftAQABNMAAsuwDwACy7MAAsxwAAAAAAAAAXAFKwACy8gEcwACy/hbAALLyLsAAbv7AAOn5wADr8FYBAAFqwACzEWDAAPQ7wAGilwDAALn0AD9KwACzLQGCwACzNMBz+Tg+AUrAALNNARzAALNcFsAAs1QuwAB/qsAA6fnAAOvvnmsBAAGAwACzYcBz+LIAwADriwbAAOv6govAALN0wACzeMAAs9YAAIKKAAAAAQPAALN9wACz1gAAAAMBA8AAs4gAAACCi13AAPx0AWDAAPvQAMAAs5UAAACDXGDAAPvQAWoAYMAA/Nl3wACzoQAAAIDuYMAA+9ABagBgwAD82XcAYMAA+9ABSsAAs7IBHMAAs7oWwACzsi7AAH+qwADp+cAA6++CigMAA4DAALPAwHP6g4HAALPIwHP6mILAALPQwHP6rwDAAOuNBsAA6/uCi8AAs9vAALPtwAC0JAAAgogAAAABA8AAs/LAALQkAAAAAAAAAF3AALipAWDAAPRWAUrAALP4ARzAALQIHMAAtAAWwACz+C7AAH+qwADp+cAA6++CiAAAAADAAOuWga0BAWDAAPRWATTAALQYA8AAtBjAALQjAAAAAQEBwAC0GQAAAIC1WwAAYMAA6+wBSsAAtB8BLgDAALi8BsAA6/yCi8AAtCnAALQuwAC0cAAAwABwKwAAAAEDwAC0NsAAtHAAAAABAQHAALRHAAAAwAB/dGDAAPP4AABcAUrAALRVARzAALRdFsAAtFUuwAB/qsAA6fnAAOvvwABwKwEAAYDAALRmwHP72gDAAOuXBsAA7AqCi8AAtHXAALR9wAC0kQEAllcAAAABA8AAtILAALSRAAAAAAAAAGDAAPvQAUrAALSFARbAALSNFsAAtIUuwAB/qsAA6fnAAOvvllfAAOvHBsAA7AuCi8AAtJbAALSewAC0vgEAnjoAAAABA8AAtKnAALS+AAAAAAAAAGDAAPvQAUrAALSsARbAALS0FsAAtKwuwAB/qsAA6fnAAOvvnjrAAOvIBsAA7AyCi8AAtMPAALTXwAC08QEAwAB0ygAAAAEDwAC038AAtPEAAAAAAAAAYMAA88IBSsAAtOIBFsAAtOoWwAC04i7AAH+qwADp+cAA6+/AAHTKwADryQbAAOwNgovAALT2wAC1CsAAtTABAJ45AAAAAQPAALUYwAC1MAAAAAAAAABgwADzwgFKwAC1GwEWwAC1IxbAALUbLsAAf6rAAOn5wADr7545wADrygbAAOwOgovAALU1wAC1PsAAtWUBAMAAf70AAAABA8AAtVDAALVlAAAAAAAAAGDAAPoKAUrAALVTARbAALVTLsAAf7PAAOn5wADr8QbAAOwRgovAALVpwAC1csAAtg8CAMAAf70AAAABA8AAtYPAALYPAAAAAQEBwAC1iQAAAICWYMAA+goAAFwBPgFJwAC1liEcwAC1oIDAALWawHP960gBAAEWwAC1oy7AAH+zwADp+cAA6/EAwAD9KT4CPRfAALW/LsAAf7PAAOn5gMAAtdTAc/3rwADr8UnAALXhIRbAALXyFsAAteYuwABu/sAA6fnAAOvwwABu0MAAuek9HMAAtfwuwAB/scAA6fkAAAAAwADsAj8/BsAA7A+Ci8AAthTAALYdwAC2RgEAwAB/tgAAAAEDwAC2MMAAtkYAAAAAAAAAYMAA+goBSsAAtjMBFsAAtjMuwAB/tMAA6fnAAOvyBsAA7BKCi8AAtkrAALZTwAC28wIAwAB/tgAAAAEDwAC2ZcAAtvMAAAABAQHAALZrAAAAgJZgwAD6CgAAXAE+AUnAALZ4IRzAALaCgMAAtnzAc/8BSAEAARbAALaFLsAAf7TAAOn5wADr8gDAAP0pPgI9F8AAtqIuwAB/tMAA6fmAwAC2uMBz/wHAAOvyScAAtsUhFsAAttYWwAC2yi7AAG7+wADp+cAA6/DAAG7QwAC56T0cwAC24C7AAH+xwADp+QAAAADAAOwCPz8GwADr/YKLwAC2+MAAtv3AALdVAADAAH9/AAAAAQPAALcGwAC3VQAAAAICAsAAtxQAAACDJmDAAPQFAMAAtyEAAADAAH++YMAA+goAAGDAAPoKAUrAALczARzAALc7FsAAtzMuwAB/qsAA6fnAAOvvwAB/fwIAAoDAALdFwHP/zIHAALdNwHP/2wDAAOuhBsAA6/6Ci8AAt1rAALdkwAC3rgAAwAB/gQAAAAEDwAC3cMAAt64AAAABAQHAALeBAAAAgyZgwAD0IwAAYMAA4vMBSsAAt5IBHMAAt5oWwAC3ki7AAH+qwADp+cAA6+/AAH+BAQABgMAAt6fAdABaAMAA66IGwADr/4KLwAC3ssAAt7fAALf7AADAAH+EAAAAAQPAALfDwAC3+wAAAAEBAcAAt9QAAACDJmDAAPQjAABcAUrAALffARzAALfnFsAAt98uwAB/qsAA6fnAAOvvwAB/hAEAAYDAALf0wHQAzgDAAOujBsAA7AGCi8AAuADAALgAwAC4QgAAwAB288AA6fkAAAABA8AAuAbAALhCAAAAAAAAAFsBPgE9HMAAuBcWwAC4Dy7AAH+qwADp+cAA6+/AAH88AgAAAp5rKoKKKsAA65UGwADsAoKLwAC4R8AAuEzAALiqAADAAH+xwADp+QAAAAEDwAC4U8AAuKoAAAAAAAAAXAE+AT0cwAC4ZBbAALhcLsAAf6rAAOn5wADr78AAfzwCAAACnmsWwAC4dy7AAH+zwADp+cAA6/GCihbAALiSLsAAf7TAAOn5wADr8sAA65UGwADsA4KLwAC4r8AAuLTAALkiAADAAH+wwADp+QAAAAEDwAC4x8AAuSIAAAAAAAAAXAE+AUnAALjQFsAAuOAWwAC41C7AAG7+wADp+cAA6/DAAG7QwAC56T4BPRzAALjyLsAAdvPAAOn5AAAAAMAA7AE+AT0cwAC5Dy7AAH+xwADp+QAAAADAAOwCBsAA7ASCi8AAuSfAALkswAC5qwAAwAB/r8AA6fkAAAABA8AAuUbAALmrAAAAAAAAAFwBPgFJwAC5TxbAALlfFsAAuVMuwABu/sAA6fnAAOvwwABu08AAueo+AT0cwAC5dC7AAH+xwADp+QAAAADAAOwCPgE9HMAAuZoWwAC5ki7AAH+qwADp+cAA6++CiAAAAADAAOuWBsAA7BSCi8AAubDAALm5wAC55gIAwAB3tcAA6fkAAAABA8AAub/AALnmAAAAAQEBwAC5wAAAAK33WwAAXAE+AT0XwAC51RbAALnNLsAAf6rAAOn5wADr7633gMAAud3AdANDwADrfgAAc/I/AHPzRQBz9P0Ac/WiAHP3QABz+DAAc/iIAHP6WQBz+w8Ac/uuAHP8IABz/HQAc/zIAHP9IABz/XQAc/2/AHP+igBz/tUAc/+gAHQALgB0AKIAdAESAHQBcQB0AfIAdAJ9AHQDEwB0A3oAAAAaAsAA7BeCi8AAutbAALrcwAC+WwPAAH+/AAABXcAAuVgBYMAA9GwAAWDAAPPvAQTAAOwagovAALsjwAC7KgnAAH+qwADp+QBbAAEFwADsJoKLwAC8GsAAvBrAALw1AAAAA8AAvCfAALw1AAAAAQEBwAC8LQAABMAAf6pbAABgwADsFwE/AggBwADsGoAAwHQEWgkBwAC8GsAAuY4AAAAABgbAAOwcgovAALsvwAC7TMAAvBUAAZ5wAAAAAQPAALtQwAC8FQAAAAUFBcAAu1gAAADAAHTKWwDAALtlAAAAlldgwAD70ADAALtvAAAAwAB/Q2DAAPvQAMAAu30AAADAAH9EYMAA+goAwAC7igAAAMAAf0VgwAD6CgAAXcAAuKkBYMAA7BcBPgFKwAC7mAEcwAC75h7AALuwwADr3AUABYDAALu1wHQEtYHAALu+wHQEwoLAALvEwHQE0YPAALvNwHQE4oTAALvVwHQE8wCBrQEBYMAA7BcBNMAAu+sDwAC768AAvBAAAAABAQHAALvsAAAAwAB7wmDAAOvUAABgwADsFwFKwAC79wEfwAC7+8AA7CYBAAGFwAC8CcB0BXYAAMAAuLwGwADsHYKLwAC8OsAAvFXAAL1vAACB+QAAAAEDwAC8W8AAvW8AAAAEAQHAALxhAAAAwABu4WEBYMAA9GxcAAPAALyHAAAAgetgwAD7xgFqAGDAAPzZd8AAvJUAAACDiWEAXAFqAGDAAPzZd8AAvKQAAADAAG6uYMAA+goBagBgwAD82XddwAC5kQFgwAD0bAE+AUrAALy6ASbAALy6ARzAALz8HMAAvMkWwAC8wS7AAH+qwADp+cAA7BqAqwEBYMAA9GwBNMAAvNUDwAC81cAAvPoAAAABAQHAALzWAAAAwAB/wFsAAGDAAOw3AUrAALzkAR/AALzowADscAEAASbAALzwAYTAALzwwHQGh2DAAPRWAAAAgfkEAAGAwAC9DMB0BdkDgeuBwAC9JcB0Be6DiYLAAL0+wHQGBcAAbq6DwAC9XcB0BhoAXcAAuZEBYMAA9GwGwADsIIKLwAC9dMAAvXzAAL2QAQCWVwAAAAEDwAC9gcAAvZAAAAAAAAAAYMAA+9ABSsAAvYQBJsAAvYQBFsAAvYwWwAC9hC7AAH+qwADp+cAA7BqWVwBgwAD70AbAAOwhgovAAL2VwAC9qcAAvcMBAMAAdMoAAAABA8AAvbHAAL3DAAAAAAAAAGDAAPPCAUrAAL20ASbAAL20ARbAAL28FsAAvbQuwAB/qsAA6fnAAOwawAB0ygBgwADzwgbAAOwegovAAL3IwAC93cAAvh0AAIKIAAAAAQPAAL3iwAC+HQAAAAAAAABdwAC4qQFgwADz7wFKwAC97gEmwAC97gEcwAC9/hzAAL32FsAAve4uwAB/qsAA6fnAAOwagogAAAAAAIGtAQFgwADz7wE0wAC+EQPAAL4RwAC+HAAAAAEBAcAAvhIAAACAtVsAAGDAAOwXAUrAAL4YAS4AAF3AALipAWDAAPPvBsAA7CSCi8AAviLAAL4rwAC+WQIAwAB3tcAA6fkAAAABA8AAvjHAAL5ZAAAAAQEBwAC+MgAAAK33WwAAXAE+AT0XwAC+RxbAAL4/LsAAf6rAAOn5wADsGsAAd7XAAOn5gMAAvlDAdAiYAAAAdASLAHQFrwB0BwIAdAdeAHQHvgB0CGgAdAjSAAAABgLAAOwngovAAMEXwADBHcAAyIMDwAB/wQAAAV3AALmwAV3AAPx0AWDAAPvQAAAGBMAA7CmCi8AAwWzAAMF4GIH4AF3AALmRAVsBKwTAAOwqgovAAMGKwADBkAnAAHvCAGDAAOw3AATAAOwrgovAAMGYwADBnhiDXABgwAD70AErBMAA7CyCi8AAwazAAMGyGIKLAF3AAPx0AWDAAPvQASsEwADsLYKLwADBu8AAwckYwAB20ABgwAD6CgEqBMAA7C6Ci8AAwdfAAMHmGMAAf8IAXcAAuMkBWwErAQXAAOw2govAAMHrwADB68AAwg0AAAADwADCAMAAwg0AAAABAQHAAMIGAAAEwAB7wmDAAOw3AABgwADsJwE/AggBwADsKoAAwHQJ8wkBwADB68AAubUAAAAABQbAAOwwgovAAMISwADCIcAAxKcAAJwQAAAAAQPAAMIqwADEpwAAAAEBAcAAwj0AACCB9V3AALlYAV3AAPx0AWDAAPvQAABdwAC4qQFgwAD0bAE+BD0cwADCUhbAAMJLLsAAe8LAAOwqwAB/w8AA6fkAAAAAwADsYD0XwADCdi7AAH/CHsAAwozAALjLAAFgwAD0bAAAwADsLknAAMKlIRzAAMK1FsAAwrAWwADCqS7AAHvCwADsKofewADp+cAA7DpIAQABKwDAAP0pPgE9F8AAwsYugfgcwADC3IDAAMLVwHQKUoH5BAABNMAAwuMDwADC48AAw9kAAAABAQHAAMLkAAAAEl3AAPx0AWDAAPvQAABgwAD82QE+BUAhFsAAwvwuwAB20MAA7C3AAML7wADDAgBAHMAAwxsWwADDFC6Ci8AA7CxIAQABKwDAAP0pwADDFMAAwyIAPRfAAMMtLoKLgcAAwzbAdAslwADsLD0XwADDRC6DXJPAAOwrSz4BPRzAAMNoLoKKAAAAAMAA7DIAAcAAw3tbAcAAw4IAAAGDTVsAAD4DPRzAAMOYFsAAw5EuwAB7wsAA7CrAAH68AAAAAMAA7Fo9HMAAw60upFgAAAAAwADsND0cwADDvy6ffgEAAYLAAMPEwHQLwADAAOwzA4HrNMAAw+QDwADD5MAAxD4AAAACAQLAAMPlAAAAgcVbAMAAw+0AAACGP1sBagBgwAD82XcAYMAA/NkBPgI9HMAAxAsWwADEBC7AAHvCwADsKsAAfrwAAAAAwADsWj0cwADEHi6ffgIAAoHAAMQjwHQMMILAAMQqwHQMOwDAAOwzg4k0wADESAPAAMRIwADEZAAAAAAAAABgwAD82QE+AT0cwADEVS6ffgAAAADAAOwzwABurinAALlowADsKT9KwADEhgEmwADEhgEWwADEnRbAAMSNLsAAf8LAAOwugdzAALjOXcAAuKkBYMAA9GwGwADsMYKLwADErMAAxLvAAMUIAACCiAAAAAEDwADEwMAAxQgAAAAAAAAAXcAAuKkBYMAA9GwBPgI9HMAAxNAWwADEyS7AAHvCwADsKsAAf8TAAOn5AAAAAMAA7GpKwADE5QEewADE8MAAuLIBAWDAAPRsARbAAMT9LsAAe8LAAOwqAAbAAOwygovAAMUNwADFEsAAxtgAAIKKAAAAAQPAAMUXwADG2AAAAAAAAABcAT4EScAAxSAcwADFMRbAAMUkLoH4wADsKUgBAAErAMAA/SlKwADFOgA/QCEcwADFVBbAAMVNLoKLwADsLEgBAAErAMAA/SnAAMVNwADFWwA9F8AAxYQug1wcwADFixbAAMWELoNcwADsK2QBAAEcwADFlRbAAMWOLsAAe8LAAOwqwAB/xcAA6fkDAAMWwADFnC6Ci8AA7CwWwADFpC6DXMAA7CscwADFuhbAAMWzFsAAxawugovAAOwsYcAA/KOBjQEAARbAAMW8LoNcwADsKwDAAPz2AMAA7GcAwAD89cAA7CtJwADFyRzAAMXUFsAAxc0ug1zAAOwrYwEAARbAAMXdFsAAxdYugovAAOwsYcAA/KMAwAD8/T4CScAAxe0hFsAAxfIuwAB20MAA7C0+Aj0XwADGBC7AAHbQKcAA7C09HMAAxigWwADGGy6B+MAA7CmB+wAAAADAALmXPz0cwADGRhbAAMY/LsAAe8LAAOwqwAB/xsAA6fkAAAAAwADsaD4CPRfAAMZuLoKLK8AA7CxJwADGgxbAAMaHLsAAdtDAAOwtPgI9F8AAxpkuwAB20CrAAOwtPRzAAMa+FsAAxrEugfjAAOwpggQAAAAAwAC5mD8GwADsM4KLwADG3cAAxuLAAMfdAACffgAAAAEDwADG5sAAx90AAAACAALAAMboAAAAgcVbAWoAYMAA/Nl3wADG7wAAAIY/WwFqAGDAAPzZdwBcAT4BScAAxwIhHMAAxxYWwADHBi7AAH/CwADsLkgBAAErAMAA/Sk+AknAAMcnIRzAAMcxgMAAxyvAdA+0SAEAASsAwAD9KT4BPRzAAMdUFsAAx0QuwAB/wsAA7C6B2wIAAoDAAMdiwHQPtCbAAMdpAYHAAMdpwHQPx2DAAP2KAMAAuNI+AT0cwADHnRbAAMeNLsAAf8LAAOwuwABuwgEAARbAAMemLsAAe8LAAOwqAMAAuNE9F8AAx70uwAB/wivAAOwuPwbAAOw0govAAMfiwADH58AAyIEAAKRYAAAAAQPAAMfrwADIgQAAAAAAAABcAT4FScAAx/QcwADIBRbAAMf4LoH4wADsKUgBAAErAMAA/SlKwADIDgA/PRzAAMgnFsAAyBougfjAAOwpnE0AAAAAwAC5kz0XwADINS6B+CvAAOwpPRfAAMhOLsAAdtAqwADsLT0cwADIaRbAAMhiLsAAe8LAAOwqwAB/x8AA6fkAAAAAwADsaQAAdAooAHQNCAB0DYsAdA+KAHQQoAB0EVQAAAAFAsAA7DeCi8AAyIbAAMiMwADhBwPAAH/IAAABXcAAuVgBYMAA4vMAAWDAAPRsCATAAOw6govAAMjOwADI0hiH3sAA6fkAYMAA9FYABMAA7DuCi8AAyQnAAMkYGLuewADp+QBgwAD6CgEqBMAA7DyCi8AAyWbAAMlxGMAAbv7AAOn5AF3AALngAWDAAOLzASsEwADsPYKLwADJesAAyZMYwAB/ycAA6fkAYMAA+goBKgTAAOw+govAAMmtwADJthjAAH/KwADp+QBgwADsJwErBMAA7D+Ci8AAycHAAMnGGJc2wADp+QBgwADwpwErBMAA7ECCi8AAyc7AAMnbGJxLwADp+QBbASsEwADsQYKLwADJ48AAye8YwAB/y8AA6fkAWwErAQXAAOxwgovAAMn0wADJ9MAAzCEAAAADwADJ+8AAzCEAAAABAQHAAMoBAAAEh95gwAD0VgAAYMAA7DcBPgU9F8AAyg0uwABu/sAA6fkewADKH8AAuewFAWDAAOLzAAWZpynAAG7KFsAAymIuwAB/r8AA6fnAAOxiwABuzBbAAMqQLsAAf6/AAOn5wADsYsAAbvIWwADKvS7AAH+wwADp+cAA7GPAAG7LFsAAyuQuwAB/sMAA6fnAAOxjwADsPD0XwADK/i7AAH/KwADp+R/AAMsOwADsNgEAAS4AwADsPj0XwADLLy6XNsAA6fkewADLO8AA8KsBAAEWwADLQi7AAH/KwADp+cAA7D4AwADsPz0XwADLkhbAAMuNLofewADp+cAA7DrAAH+9KsAA9Fg9F8AAzAMWwADL/i6H3sAA6fnAAOw6wAB/tirAAPRZAggBwADsOoAAwHQSugkBwADJ9MAAuY4AAAAAJQbAAOxEgovAAMwmwADMLsAAzHwEAcAAf7nAAOn5AAAAAQPAAMxAwADMfAAAAAAAAABgwADsNwE+AUrAAMxJAR/AAMxUwADscAEAAR7AAMxgwADsBwAAAAAABsAA7EWCi8AAzIHAAMyJwADM3wQBwAB/usAA6fkAAAABA8AAzJrAAMzfAAAAAQABwADMoAAAAMAAf7tgwAD70AFqAGDAAPzZdwBgwADsNwE+AUrAAMyrAR/AAMy2wADscAEAAR7AAMzCwADsCAEAAYDAAMzXwHQUhgAABsAA7EiCi8AAzerAAM38wADOKQEAwAB+pcAA6fkAAAABA8AAzgrAAM4pAAAAAAAAAGDAAOs/AUrAAM4NARbAAM4iJsAAzhMAFsAAzg4uh97AAOn5wADsOmDAAOvswAB/qsAA6fnAAOvvBsAA7FCCi8AAzi7AAM5MwADPKAAAgfkAAAABA8AAzlLAAM8oAAAABAEBwADOWAAAAMAAbuFhAWDAAOLzXAADwADOgQAAAIHrYMAA+8YBagBgwAD82XfAAM6PAAAAg4lhAFwBagBgwAD82XfAAM6eAAAAwABurmDAAPoKAWoAYMAA/Nl3XcAAuZEBYMAA4vMBPgFKwADOtAEcwADOzhbAAM7HFsAAzrsuwABu/sAA6fnAAOw8gfXAALnigfkEAAGAwADO1cB0FWQDgeuBwADO7sB0FXmDiYLAAM7/wHQVkMAAbq6DwADPFsB0FaXAALloBsAA7EmCi8AAzy3AAM86wADPVAEAwABROwAAAAEDwADPQ8AAz1QAAAAAAAAAYMAAx2IBSsAAz0YBFsAAz0wWwADPRi6XNsAA6fnAAOw/wABRO8AA8KkGwADsbIKLwADPWcAAz2LAAM+bAgDAAFE7AAAAAQPAAM9qwADPmwAAAAEBAcAAz3QAAACAlmDAAMdiAABcAT4BPRfAAM+HFsAAz4EulzbAAOn5wADsP8AAUTuAwADPksB0FqzAAPCpBsAA7FGCi8AAz6DAAM+lwADPygAAgooAAAABA8AAz6rAAM/KAAAAAQEBwADPsgAAAMAAZJdgwAD9HAAAXAFKwADPugEcwADPwBbAAM+6Lpc2wADp+cAA7D+CigEAAYDAAM/GwHQXEQDAAPCuBsAA7FKCi8AAz8/AAM/UwADQBAAAggIAAAABA8AAz9vAANAEAAAAAQABwADP5AAAAMAAZJdgwAD9HAFqwADP6mDAAP22hAYAXAFKwADP8gEcwADP+BbAAM/yLpc2wADp+cAA7D+CAgEAAYDAANAAwHQXfQDAAPCwBsAA7FOCi8AA0AnAANAOwADQSgAAhBEAAAABA8AA0BvAANBKAAAAAQEBwADQIAAAAMAAYR5gwAD70AAAXAFKwADQLQEcwADQMxbAANAtLpc2wADp+cAA7D+EEQEAAYDAANBBwHQX9QDAAPCxBsAA7FSCi8AA0E/AANBUwADQmgAAn6oAAAABA8AA0FzAANCaAAAAAgECwADQZgAAAMAAQwVdwAD8MgFbAMAA0HAAAADAAH/MYMAA/bYBasAA0HZgwAD9toQGAFwBSsAA0H4BHMAA0IQWwADQfi6XNsAA6fnAAOw/n6oCAAKAwADQjcB0GGGBwADQlsB0GHQAwADwrwbAAOxVgovAANCfwADQpMAA0MwAAFYAAAABA8AA0KfAANDMAAAAAQEBwADQsgAAIIQ0XcAA/HQBYMAA+9AAAFwBSsAA0LwBHMAA0MIWwADQvC6XNsAA6fnAAOw/VgEAAYDAANDGwHQY9ADAAPCtBsAA7FaCi8AA0NHAANDWwADRSwAAnA4AAAABA8AA0N7AANFLAAAAAgECwADQ5gAAAIHFYMAA/RwAwADQ+QAAAIY/YMAA/YoBagBgwAD82XcAXAE+AT0wwADRDB/AANEWwAD7YgEAASfAAH/NAAbAAOxXgovAANFQwADRV8AA0aMAAJwQAAAAAQPAANFgwADRowAAAAEBAcAA0XMAACCB9V3AALlYAV3AAPx0AWDAAPvQAABdwAC4qQFbAT4BSsAA0YEBHMAA0Y4WwADRiC6XNsAA6fnAAOw/nBABAAGAwADRmMB0GdAAwADwswbAAOxYgovAANGowADRr8AA0ccAAIRBAAAAAQPAANG0wADRxwAAAAAAAABdwAC4qQFbAUrAANG6ARzAANHAFsAA0boulzbAAOn5wADsP4RBAAAAAMAA8LQGwADsWYKLwADRzMAA0dPAANHrAACCiAAAAAEDwADR2MAA0esAAAAAAAAAXcAAuKkBWwFKwADR3gEcwADR5BbAANHeLpc2wADp+cAA7D+CiAAAAADAAPC1BsAA7EqCi8AA0fDAANH7wADSDQEAn34AAAABA8AA0gDAANINAAAAAAAAAF3AALipAVsBSsAA0gMBFsAA0gkWwADSAy6XNsAA6fnAAOw/n37AAPC3BsAA7FqCi8AA0hLAANIXwADS4wAAwAB+vAAAAAEDwADSHsAA0uMAAAAAAAAAXAE+BUnAANJjHMAA0mwWwADSZy6H3sAA6fnAAOw6SAEAASsAwAD9KUrAANJ1AD89HMAA0osWwADSgS7AAH/KwADp+cAA7D6kWAAAAADAAOw0PRzAANKXLsAAf87AAOn5AAAAAMAA7GE9F8AA0q4uwAB/ycAA6fkpwADsPT0cwADS2BbAANLMLsAAbv7AAOn5wADsPIKIAAAAAMAAufYGwADsW4KLwADS6MAA0u3AANNuAADAAH9/AAAAAQPAANL2wADTbgAAAAICAsAA0wQAAACDJmDAAPQFAMAA0xEAAADAAH++YMAA+goAAGDAAPoKAT4CScAA0yAcwADTKRbAANMkLofewADp+cAA7DpIAQABKwDAAP0pSsAA0zIBKj9KwADTRAEcwADTUBbAANNLLofewADp+cAA7DrAAH9/AgACgMAA01rAdBwfgcAA02LAdBwuAMAA9GIGwADsXIKLwADTc8AA033AANPvAADAAH+BAAAAAQPAANOJwADT7wAAAAEBAcAA05oAAACDJmDAAPQjAABgwADi8wE+AknAANOoHMAA07EWwADTrC6H3sAA6fnAAOw6SAEAASsAwAD9KUrAANO6ASs/SsAA08sBHMAA09cWwADT0i6H3sAA6fnAAOw6wAB/gQEAAYDAANPkwHQc2QDAAPRjBsAA7F2Ci8AA0/TAANP5wADUQgAAwAB/hAAAAAEDwADUBcAA1EIAAAABAQHAANQWAAAAgyZgwAD0IwAAXAE+AT01AAAAAQBgwAD0VgEWwADUJC6H3sAA6fnAAOw6IxzAANQqgQDAdB2PSAEAASsAACscwADUKoEAwHQdj8AAf4QBAAGAwADUN8B0HXkAwAD0ZAFcBsAA7EuCi8AA1EfAANRPwADUsAEAllcAAAABA8AA1FTAANSwAAAAAAAAAGDAAPvQAT4DScAA1FocwADUYxbAANReLofewADp+cAA7DpIAQABKwDAAP0pPTDAANRsasAA1HhgwAD0ncABoIc/P0rAANScARbAANSoFsAA1KMuh97AAOn5wADsOpZXwAD0ZgbAAOxMgovAANS1wADUycAA1TABAMAAdMoAAAABA8AA1NHAANUwAAAAAAAAAGDAAPPCAT4DScAA1NccwADU4BbAANTbLofewADp+cAA7DpIAQABKwDAAP0pPTDAANTpasAA1PVgwAD0ncABoIc/P0rAANUZARbAANUlFsAA1SAuh97AAOn5wADsOsAAdMrAAPRoBsAA7E2Ci8AA1TXAANU9wADVqgEAnjoAAAABA8AA1UjAANWqAAAAAAAAAGDAAPvQAT4DScAA1U4cwADVVxbAANVSLofewADp+cAA7DpIAQABKwDAAP0pPTDAANVgasAA1WxgwAD0ncABoIc/P0rAANWQARbAANWcFsAA1Zcuh97AAOn5wADsOp46wAD0ZwbAAOxOgovAANWvwADVw8AA1jYBAJ45AAAAAQPAANXRwADWNgAAAAAAAABgwADzwgE+A0nAANXXHMAA1eAWwADV2y6H3sAA6fnAAOw6SAEAASsAwAD9KT0wwADV6WrAANX1YMAA9J3AAaCHPz9KwADWGQEWwADWJRbAANYgLofewADp+cAA7DqeOcAA9GkGwADsX4KLwADWO8AA1kLAANcwAADAAH/PwADp+QAAAAEDwADWTMAA1zAAAAAAAAAAXcAAuKkBWwE+Az0XwADWVS7AAH/LwADp+R7AANZowAC4ywABWwAAwADsQT0cwADWfxbAANZ5Lpc2wADp+cAA7D+CiAAAAADAAPC1SsAA1owBJsAA1owBHMAA1qcWwADWoBbAANaTLsAAf8vAAOn5wADsQYHcAIGtAQABNMAA1qwDwADWrMAA1ysAAAABAQHAANatAAAAgLVbAABdwAD8dAFbAT4EQBzAANbQFsAA1skWwADWvy7AAH/KwADp+cAA7D6Ci8AA7CxIAQABKwDAAP0pwADWv8AA1tcATsAA1uTAANboAACfk2DAAPRWARbAANbqLofewADp+cAA7Do9F8AA1vYuh97AAOn5K8AA7DpKwADXCQExwADXEFsCgcAA1xHAdCEpFsAA1xYunEvAAOn5wADsQAAAXcAAuKkBWwbAAOxggovAANfgwADX5cAA2K4AAMAAf8PAAOn5AAAAAQPAANgBwADYrgAAAAAAAABcAT4BScAA2AoiHMAA2BwWwADYDi6cS8AA6fnAAOxASAEAASsAwAD9KQAhHMAA2CwWwADYJy6H3sAA6fnAAOw6SAEAASsAwAD9KT4BPRfAANg9LpxLwADp+RzAANhSFsAA2E0uh97AAOn5wADsOoH5BAABFsAA2FkuwABv8sAA6fnAAOxkA4HrFsAA2HUuwABvUMAA6fnAAOxmg4kWwADYhy7AAG/zwADp+cAA7GXAAG6uKcAAuWjAAOxAPwbAAOxhgovAANizwADYs8AA2RMAAMAAf87AAOn5AAAAAQPAANjCwADZEwAAAAAAAABbAT4ETsAA2M/AANjTAACftGDAAPRWARbAANjVLofewADp+cAA7Do9F8AA2N8uh97AAOn5K8AA7Do9F8AA2PAuu57AAOn5KcAA7Ds9HMAA2QiAwADZBMB0Iq+CiAAAAADAAPRgBsAA7GKCi8AA2RjAANkdwADalQAAwAB/r8AA6fkAAAABA8AA2TfAANqVAAAAAAAAAFwBPgFJwADZQBbAANlQFsAA2UQuwABu/sAA6fnAAOw8wABu08AAueo+Aj0cwADZZS7AAH/DwADp+QAAAADAAOxgScAA2cshHMAA2dQWwADZzy6H3sAA6fnAAOw6SAEAASsAwAD9KT4BPRfAANnsFsAA2ecuh97AAOn5wADsOsAAf70pwAD0WD8+Aj0XwADaIS7AAH/JwADp+SnAAOw9ScAA2kEhHMAA2koWwADaRS6H3sAA6fnAAOw6SAEAASsAwAD9KT4BPRzAANpiFsAA2l0uh97AAOn5wADsOsAAcCsBAAFqwADae2DAAPP4wAGgpQDAAPRhPwbAAOxjgovAANqawADan8AA2w0AAMAAf7DAAOn5AAAAAQPAANqywADbDQAAAAAAAABcAT4BScAA2rshHMAA2sQWwADavy6H3sAA6fnAAOw6SAEAASsAwAD9KT4BPRfAANraFsAA2tUuh97AAOn5wADsOsAAf70hFsAA2vsWwADa7y7AAG7+wADp+cAA7DzAAG7QwAC56cAA9Fg/BsAA7GSCi8AA2xLAANsXwADcqwAAwABv8sAA6fkAAAABA8AA2x7AANyrAAAAAQEBwADbHwAAAJuyWwAAXAE+AUFHwADbLIDAANs0wHQlAAMBwADbV2rAANtXYMAA9DvAAZ9EAD4EScAA22UcwADbbhbAANtpLofewADp+cAA7DpIAQABKwDAAP0pQsAA23cAP07AANuKwADbkQAAgotgwADi8wEcwADbmBbAANuTLofewADp+cAA7DqeawAAAADAAPReScAA26ghHMAA27OBwADbrMB0JWJIAQABKwDAAP0pPRzAANvIFsAA27wuwABu/sAA6fnAAOw8VgEAAYHAANvMwHQlYgDAALn0P0LAANvdAAHAANv+asAA2/5gwAD0O8ABoosAPgI9HMAA3BcWwADcDS7AAH/KwADp+cAA7D6CigAAAADAAOwyQsAA3CgAAcAA3ElqwADcSWDAAPQ7wAGilwA+Az0XwADcXS7AAH/JwADp+SnAAOw9PRzAANyLFsAA3H8uwABu/sAA6fnAAOw8gogAAAAAwAC59kLAANycAAbAAOxlgovAANywwADctcAA3TgAAMAAb/PAAOn5AAAAAQPAANy8wADdOAAAAAAAAABcAT4CScAA3MUhFsAA3MouwAB/ycAA6fnAAOw9PgI9F8AA3OUuwAB/ycAA6fkpwADsPT0cwADdERbAAN0FLsAAbv7AAOn5wADsPIKIAAAAAMAAufY/PRzAAN0uFsAA3SQuwAB/ysAA6fnAAOw+n34AAAAAwADsMwbAAOxmgovAAN09wADd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S9fAAFGWA8AAgJgAAAFgwADG5gAABATAAO3pgpLAAEwWwABMHQmfrMAA6fkAYMAA7csABMAA7eqCksAATDrAAEw/CZc2wADp+QBgwADG5gAEwADt64KSwABMSMAATFcYu57AAOn5AGDAAPoKASoEwADt7IKSwABMYMAATG0YsivAAOn5AGDAAPoKASkBBcAA7fKCksAATHLAAExywABMlwAAAAPAAEx9wABMlwAAAAICAsAATIMAAASXNmDAAMbmAMAATI8AAASfrGDAAO3LAABgwADt5gE/AwgBwADt6oAAwHSi5ggBwADt6YEAwHSi9QkBwABMcsAAxvAAAAAAAwbAAO3ugpLAAEycwABMocAATOQAAFYAAAABA8AATKTAAEzkAAAAAQEBwABMrwAAIBJdwAD8dAFgwAD70AAAXAE+AT0cwABMuy7AAG1yBAAEgMAATMTAdKNdkxbAAEzSgMAATM3AdKNdYcAA/KMqAMAA7e8GwADt74KSwABM6cAATO7AAE+CAADAAG1yAAAAAQPAAEz2wABPggAAAAQEBMAATQEAAAASXcAA/HQBYMAA+9AAwABNCwAAAGpgwAD70ADAAE0WAAAAgoxgwAD70ADAAE0gAAAAwABtc2DAAPoKAABcAT4FScAATS4WwABNMi67nsAA6fnAAO3rSsAATTsAP0nAAE1HHMAATU+CwABNS8B0o/VIAQABKwDAAPzzPTDAAE1YH8AATWLAAPsFAQABJ4KMAD89HsAATY/AAPsRAwADgcAATZ/AdKPngsAATabAdKP1FsAATbCAwABNq8B0o9NhwAD8owBLPgU9F8AATckusivAAOn5KsAA7exOwABN78AATf4AAMAAf2BgwADtaAEewABOCsAA6i4DAAOAwABOLcB0o9OBwABOM8B0o+eCwABOOsB0o/UAPRzAAE5OFsAATkYun6zAAOn5wADt6cAARksDAAMWwABOZYTAAE5WwHSks4KLwADtahbAAE58hMAATm3AdKSzasAA7WscwABOkYLAAE6NwHSj9YGNAQABHMAATpqBwABOlMB0o+eBjQEAARbAAE6rhMAATpzAdKSzasAA7WsAwAD89gDAAPz2AMAA7dBOwABOxAAAAG9dwAD8dAFgwAD70ABDwABOzyEcwABO/o3AAE7XwHSlfBzAAE7lFsAATt0un6zAAOn5wADt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AF3AALilAWDAAP22AT4BSz4BSsAARHQBHMAARHsuwACBY8AA6fkCAAKCwABEhsB1LsWAwABEjcB1LkUAwADvIwABwABEoFsBwABEpwAAAYNNWwAAPgFKwABEtAEewABEv8AAuLMCAWDAAP22AoPAAETMwHUvHIHAAETPwHUucQAAwAC4vAbAAO89gpnAAETuwABE9cAARVEAAMAAW+wAAAABA8AARQXAAEVRAAAAAQAAAcAARRAAAADAAFE7YMAAx2IBasAARRpgwADJKIGHYMAA/bYBSsAARSoBHMAARSouwACBY8AA6fkCAAIcwABFNS6ENQAAAADAAO87gMAARUjAdS+GAMAA7yMGwADvPoKZwABFVsAARWvAAEXeAADAAIEPAAAAAQPAAEV2wABF3gAAAAEAAAHAAEWBAAAAwABRO2DAAMdiAWrAAEWLYMAAySiBh13AALipAV3AAPx0AWDAAP22AUrAAEWbARzAAEW8HMAARZsuh8EBAAABwABRO4DAAEWywHUwC8AA7zyBrQEBXcAA/HQBYMAA/bYBFsAARdZqwABFx2DAAMiUwAGqBYi4wADIlwDAALi8BsAA7z+CmcAARePAAEXwwABGZgAAwACBEAAAAAEDwABF/8AARmYAAAABAAABwABGCgAAAMAAUTtgwADHYgFqwABGFGDAAMkogYddwAD8dAFgwAD9tgFKwABGJAEcwABGOWrAAEYqYMAAyJTAAaoFiLgBAAEcwABGQS7AAFvsAQAAAcAAUTuAwABGXMB1ML3AAO89AMAAyJcGwADvQIKZwABGa8AARnjAAEe9AADAAHt3AAAAAQPAAEaEwABHvQAAAAMBAcAARo8AAACENF3AAPx0AWDAAPvQAALAAEamAAAAgb9gwADubwFqwABGtWDAAO5vgWzAAEbBAAAAhEFgwAD6CgFqwABGyGDAAPoKAF3AALipAWDAAO6PAT4BSsAARtYBHMAARu4cwABG3S6lFwEAAAGBv4HAAEbowHUxasAA7yyBrQEBYMAA7o8BNMAARvMDwABG88AAR7gAAAABAQHAAEb0AAAAgbtgwADutgAAXcAAuKkBYMAA7o8BPgFKwABHAgEcwABHmRzAAEcwHMAARw6DwABHCcB1MfHAAH5LAwADgMAARxjAdTFUkxbAAEcogMAARyLAdTFUYcAA/KMAwADuwoGt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HrBZwADqLQMAA4CwfcB1f30nwACBsxawqC5OwADvxAA/SrC9ASawvQGAsMTAdX99XcAAuKUBYMAA/bYAwAC4vAbAAO/Tgpq1zrXVtpIAAMAAgKAAAAABA7XttpIAAAAAAAAAYMAA/bYBPgNOtfq2AQAAgXZbAR62A8AA7+UCAAIatiTAAPFPFrYwLsAAgKfAAOn5wADvwAA9HrY/wADv6gMAA4C2TcB1gBwnwACBsxa2di5OwADvxABKtoEBJraBAYC2iMB1gBxgwAD9tgbAAO/Ugpq4PbhOuGsAAMAASPwAAAABA7hSuGsAAAAAAAAAXcAAuKkBYMAA758BSrhYAR64YcAA77UBAAEWuGYuTsAA78QABsAA79WCmroCugu6MAAAwACBmQAAAAEDuhO6MAAAAAAAAABgwADvnwFKuhkBHroiwADvtAEAARa6Ky5OwADvxAAGwADv1oKavZa9r731AADAAEZcAAAAAQO9tb31AAAAAQAAAb28AAAAwABsxmDAAPoKAWq9x2DAAPoKAF3AALipAWDAAO+8AUq92AEcvdguwACAyMAA6fkBAAABwABsxoC968B1gSjAAO/aBsAA79eCmsAAQOHAAEDmwABBLgAAwAB8HgAAAAEDwABA8MAAQS4AAAABAAABwABA9wAAAMAAbMZgwAD6CgFqwABBAmDAAPoKAFwBSsAAQQ0BHMAAQQ0uwACAysAA6fkBAAABwABsxoDAAEEkwHWBnMAA79sGwADv2IKawABG1cAARu3AAEiaAADAAG+WAAAAAQPAAEbywABImgAAAAIAAALAAEb/AAAAm69gwAD70AFqwABHF2DAAPvQwACBcsAARyEAAADAAGzGYMAA+goBasAARyxgwAD6CgBdwAC5WAFgwADv+gE+BE7AAEeHwABHkwABwACBtGDAAP22AR7AAEeVwADv6wEAARbAAEexLk7AAO/EAE7AAEfOwABH2AABwACAmWDAAPFWARrAAEfmwADxW0nAAEfzHMAASAGDwABH98B1goVIAQABKwDAAP0pPgFKwABIEgEewABILMAA8EcDAAOCwABIM8B1gliAwABIQMB1ghCBwABISMB1gi0AP0rAAEheARzAAEhvg8AASGXAdYKFwACBtQMAA4LAAEh3wHWCWIDAAEiEwHWCEIHAAEiMwHWCLQDAAPFsBsAA79qCmsAASJ/AAEi4wABI2AACwACAyMAA6fkAAAABA8AASL/AAEjYAAAAAQAAAcAASMYAAADAAGzGYMAA+goBasAASNFgwAD6CgBdwAC4qQFgwADvvAAGwADv24KawABI3MAASOHAAEkFAALAAIDKwADp+QAAAAEDwABI7MAASQUAAAABAAABwABI8wAAAMAAbMZgwAD6CgFqwABI/mDAAPoKAFwABsAA79yCmsAASQrAAEkewABKggABwACBtsAA6fkAAAABA8AASSjAAEqCAAAAAgICwABJMAAAAMAAgbdgwAD9tgDAAEk+AAAAwACBuGDAAP22AABdwAC4qQFgwAD6CgE+AUrAAElLARzAAEmoHsAASVjAAO8PAgACasAASYNgwAD70MAAYo8xwABJklsDK4DAAEmZwHWEA4HAAEmgwHWEFACBrQEBYMAA+goBNMAASa0DwABJrcAASn0AAAABAQHAAEmuAAAAg1FbAABdwAC4pQFgwAD6CgE+AknAAEnAHsAAScTAAOosAQABgsAASdXAdYSSAD4BPTDAAEnqHsAASfDAAOotAwADgsAASgfAdYSSJMAASlIFJ8AAgbmAwABKQ8B1hAMngYuBwABKS8B1hBQngyEnAAA/SsAASmcBJsAASmcBgsAASm7AdYSSXcAAuKUBYMAA+goAwAC4vAbAAO/tgprAAEzJwABM3cAATbMAAZwuAAAAAQPAAEzmwABNswAAAAICAsAATO4AAADAAIG3YMAA/bYAwABM/AAAAMAAgbhgwAD9tgAAXcAAuKkBYMAA+goBPgNOwABNFcAATR8AAMAAgJlgwADxVgEawABNLcAA8VtJwABNOhzAAE1IgsAATT7AdYWMSAEAASsAwAD9KT4BSsAATVkBHsAATWDAAO/cAgACgMAATWvAdYVagcAATXLAdYVrAD9KwABNhAEcwABNlYLAAE2LwHWFjMAAgboCAAKAwABNosB1hVqBwABNqcB1hWsAwADxaAbAAO/GgprAAE9AwABPScAAT+cBAIM7AAAAAQPAAE9UwABP5wAAAAAAAABgwAD6CgE+AUnAAE9aGsAAT2fAAPGlPgFKwABPegEcwABPhhbAAE+BLk7AAO/EgdYBAAEawABPkcAA78EAwAD9yD4BSsAAT8IBHMAAT84WwABPyS5OwADvxIHWAQABJ1AAwAD9yAbAAO/HgprA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APvQAABgwAD70AE+BE7AAJ9swACfdAAAwACDomDAAPvQAZNOwACfgcAAn4kAAMAAg79gwAD70AEWwACfiy7AAIO7wADzY0FDwACf0hzAAJ/hgsAAn9nAduZsgJcBAAGTAMAA/P8+B07AAKBBwACgSwAAwACDvl3AAPx0AWDAAPvQARzAAKBUgMAAoE3AduYuIAEAAYLAAKBVwHbmbAAAScAAoGUiHMAAoHODwACgacB25rBIAQABKwDAAP0pARzAAKCPFsAAoIiDwACgfsB25rBhwAD8o0gBAAGTAMAA/PNCwACglQA/TsAAoKbAAKCqAACXZmDAAPvQARbAAKC2g8AAoKzAduawYcAA/KM9HMAAoMkWwACgxC4SwADzU4NeAwADFsAAoNIugozAAPNVHMAAoNsWwACg1y6CjMAA81VkAQABhMAAoN3AducwAMAA/PWDwACg4sB25rAAwAD8mT0cwACg9C7AAIO5AQABhMAAoP/AducwAMAA81k9icAAoQvAduZWHMAAoROBwAChC8B25lZkAQABhMAAoRbAducwAMAA/PU9isAAoSHAduZsFsAAoSsuwACDu8AA82NKwAChQQGBwAChSMB25lYGwADzXYKnwAChWMAAoV3AAKLiAADAAIOwAAAAAQPAAKFpwACi4gAAAAEBAcAAoXQAAADAAHvCYMAA9FYAAGDAAPoKAT4BQ8AAobkpPgVOwACh0sAAodoAAMAAg79gwAD70AEWwACh3C7AAIO6wADzYUnAAKHwHMAAofyBwACh9MB26GRIAQABkwDAAPzzSsAAogIBKj9OwACiGsAAoiAAAIQ0YMAA+9ABHMAAoimAwACiIsB26EGCigMAAxbAAKIvLhLAAPNTFsAAojUuasAA81SBwACiPMB26GQAwAD0Xz0cwACiTC7AAIO4AQABgsAAolnAduisAMAA81hJwACiZxzAAKJxgsAAomvAduisYwEAAYHAAKJzwHboZADAAPz9PgFKwACixQEpPwAAdtn1AHbbvQB23YoAdt3mAHbesAB232YAduBQAHbhhAB247oAduYCAHboFQB26UAAAAALAsAA82aCp8AAoufAAKL2wACmqgfAAIPAAWrAAKL2YMAAyvjAAXDeAAFgwAD9HAAAAAAOBsAA82mCjYGmga6B3AQBgLXAAOn5AWqBrmDAAMr4wAFw3gAA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AAEDwADY48AA2+8AAAAAAAAAYMAA+9ABPgZPwADZlMAA2ZgAAAGHF2ECYMAA+9BgwAD70GDAAPvQAAPAANmfwADaRgAAAAICAsAA2aQAAACDyGDAAPvQAMAA2a4AAACAlmDAAPvQAABgwAD70AE+Az2JwADZvcB4V7UcwADZzzff////g3cBAAEcwADZ14HAANnSwHhXtWQBAAGCwADZ2cB4V8QAwAD89QDAAPvoPYnAANnnwHhXtRzAANn5N9////+DdwEAARzAANoBgcAA2fzAeFe1ZAEAARzAANoYHMAA2hA3wAf//4N3AQABgcAA2hLAeFe1AMAA++iDugEAATcKAMAA++wAwAD89QDAAPvoSsAA2icBHMAA2jOBwADaLsB4V7WDuwEAARzAANo7gcAA2jbAeFe1g7wBAAE3BgDAAPvtAMAA++pPwADaTcAA2lEAAAGHGGEBYMAA+9BgwAD70AADwADaV8AA2wkAAAABAQHAANpcAAAAg8hgwAD70AAAYMAA+9ABPgM9isAA2mrAeFjfHMAA2nw33////4N3AQABHMAA2oSCwADaf8B4WN9kAQABHMAA2pscwADakzfD////g3cBAAGCwADalcB4WN8AwAD76IO6AQABlgDAAPvsAMAA/PUAwAD76D2KwADaqcB4WN8cwADatYLAANqwwHhY34O7AQABHMAA2r2CwADauMB4WN+DvAEAATcLAMAA++0AwAD76krAANrLARzAANrdN9////+DdwEAARzAANrlgsAA2uDAeFjfZAEAARzAANr8HMAA2vQ3v/+DdwEAAYLAANr2wHhY3wDAAPvog7oBAAE3DwDAAPvsAMAA/PUAwAD76EnAANsQFsAA2xQuwACFMcAA9XPAAPZlSsAA2x0BN5ozP07AANtLwADbUAAAg8hgwAD70AEjFsAA21IuwACFEMAA9XPAAPYRN8ABRoE3wAaOeQFgwAD70EXAANuEAcAA243AANuPAABiYMAA+9ABkwEcwADbloPAANuUwHhaT2MBAAEWwADbmC7AAHaGwAD1c8AA9hMAwAD8/QGLwADbn8B4Wk8cwADboIPAANufwHhaT2QBAAGUAMAA/PU+AT2KwADbrMB4WhQcwADbuoDAANuzwHhXiyACAAKCwADbu8B4WhQcwADbyBbAANvBLsAAhRHAAPVzwAD2EksBAAGDwADbycB4Wk8AwAD8gwAASsAA29gBHMAA2+WBwADb38B4WLogAQABgsAA2+bAeFoUAAAGwAD2UIK2wADc3MAA3OrAAN0xAwBIAAAAAQPAANzswADdMQAAAAEBAcAA3PQAAACD1mDAAP0cAABgwAD6CgFKwADdBAEiJcAA3QqAwADdBMB4W0tgwAD1+wAcwADdLRzAAN0cLoJLAQABFMAA3SbAeFtLAAFgwAD1+wDAAPZISAEAAZMAwAD88wbAAPZngrbAAODqwADg8sAA4ZEBAMAASswAAAABA8AA4PzAAOGRAAAAAAAAAGDAAPvQAT4DScAA4QIcwADhDBbAAOEGLsAAdobAAPVzwAD2E0gBAAGTAMAA/PNKwADhEgGTP0nAAOEgFsAA4SQuwACFEMAA9XPAAPYRSsAA4TEBFsAA4UAcwADhOS6EhgAAAADAAPZMwABKzMAA9mc/SsAA4U8BHMAA4W8cwADhYWrAAOFWYMAA+9CDK4OIAQABHMAA4WoWwADhZC7AAHaGwAD1c8AA9hOBjQEAAZQAwAD89gDAAPz3ZAEAARbAAOGEHMAA4XgWwADhcS7AAIURwAD1c8AA9hJLAQABHMAA4X8WwADheS7AAHaGwAD1c8AA9hOBjQEAAZQAwAD89gDAAPyDwABKzMAA/AYAwAD89QbAAPZRgrbAAOOqwADjv8AA5GMDAIaBAAAAAQPAAOPBwADkYwAAAAEBAcAA48kAAADAAIVQYMAA+dwAAGDAAPX7AT4DTsAA4+PAAOPpAACD1mDAAPX7ASbAAOPjAYDAAOPrwHhdE2DAAPX7ScAA4/ccwADkBxbAAOQBgcAA4/vAeF0uwAB2hsAA9XPAAPYTSAEAAZMAwAD88z4BPTDAAOQVasAA5CFgwAD7rMABuXQ/SsAA5E0BHMAA5FQuwACFcMAA9XMBAAGBwADkWcB4XS4AwAD2PQbAAPZSgrbAAOVzwADlf8AA5ioAAJgqAAAAAQPAAOWIwADmKgAAAAEBAcAA5ZAAAADAAIVQYMAA+dwAAGDAAPX7AT4DTsAA5arAAOWwAACD1mDAAPX7ASbAAOWqAYDAAOWywHhd6GDAAPX7ScAA5b4cwADlzhbAAOXIgcAA5cLAeF4DwAB2hsAA9XPAAPYTSAEAAZMAwAD88z4BPTDAAOXcasAA5ehgwAD7rMABuXQ/SsAA5hQBHMAA5hsuwACFdcAA9XMBAAGBwADmIMB4XgMAwAD2PgbAAPZTgrbAAOZIwADmWMAA5o0DAFAAAAABA8AA5lnAAOaNAAAAAQEBwADmYQAAAIPWYMAA+dwAAGDAAPqCAUrAAOZrARzAAOZ7HMAA5nAuqN4AAAAAwAD2YFABAAEcwADmg4DAAOZ9wHhevKjeAAAAAMAA+gUAwAD6kwbAAPZUgrbAAOa6wADmyMAA5u8DAGMAAAABA8AA5snAAObvAAAAAQEBwADm0QAAAIPWYMAA+dwAAGDAAPoKAUrAAObbARzAAObsHMAA5tsugksBAAGAwADm5cB4XzcAwAD2SGMBAAGTAMAA/P0GwAD2VYK2wADnJcAA5zPAAOdcAwCBawAAAAEDwADnNcAA51wAAAABAQHAAOc9AAAAg9ZgwAD53AAAYMAA+goBSsAA50cBHMAA51gcwADnRy6CSwEAAYDAAOdRwHhfpQDAAPZIgWsBAAGTAMAA/P4GwAD2VoK2wADnjMAA55rAAOfBAwCAlwAAAAEDwADnm8AA58EAAAABAQHAAOejAAAAg9ZgwAD53AAAYMAA+goBSsAA560BHMAA574cwADnrS6CSwEAAYDAAOe3wHhgFADAAPZIgJcBAAGTAMAA/P8GwAD2V4K2wADn+sAA6AjAAOgxAwCBbQAAAAEDwADoCsAA6DEAAAABAQHAAOgSAAAAg9ZgwAD53AAAYMAA+goBSsAA6BwBHMAA6C0cwADoHC6CSwEAAYDAAOgmwHhggwDAAPZIgW0BAAGTAMAA/QAGwAD2WIK2wADptsAA6cvAAOsjAwCVrgAAAAEDwADpzMAA6yMAAAABAQHAAOnUAAAAwACFUGDAAPncAABgwAD1+wE+BU7AAOnuwADp9AAAg9ZgwAD1+wEmwADp7gGAwADp9sB4YPJgwAD1+0nAAOoCHMAA6hIWwADqDIHAAOoGwHhhDcAAdobAAPVzwAD2E0gBAAGTAMAA/PM+AT0wwADqIGrAAOosYMAA+6zAAbl0P07AAOpcwADqYwAAgXZgwAD1+wEcwADqZS7AAIV1wAD1cwEAAYHAAOpqwHhhDQDAAPY+ScAA6nYWwADqgYLAAOp6wHhhecAAhRDAAPVzwAD2ET4BScAA6pYWwADqoIHAAOqawHhhDcAAhRDAAPVzwAD2ET4BPYrAAOq3wHhheRzAAOrHgsAA6sDAeGF5gY0BAAGBwADqycB4YQ0AwAD2Tj4BPYrAAOrnwHhheRzAAOr3gsAA6vDAeGF5ZAEAAYHAAOr5wHhhDQDAAPZNP0rAAOsSAYLAAOsZwHhheQbAAPZogrbAAOvEwADrzMAA7BQBAMAASDQAAAABA8AA69HAAOwUAAAAAAAAAGDAAPvQAT4CScAA69ccwADr4RbAAOvbLsAAdobAAPVzwAD2E0gBAAGTAMAA/PNKwADr5wGTP0rAAOv1ASMWwADr/C7AAIUQwAD1c8AA9hEcwADsCpSBxAAAAADAAPvzlAFgwAD70AbAAPZpgrbAAOxBwADsSsAA7HcBAMAAbjwAAAABA8AA7FHAAOx3AAAAAAAAAGDAAPoKAUrAAOxUASIcwADsWhbAAOxULsAAdobAAPVzwAD2E0gBAAGTAMAA/PMBHMAA7HMcwADsbhzAAOxqFsAA7GMuwACFEcAA9XPAAPYSSwEAAZMAwAD8g4N3AQABlADAAPvoSAEAAZMAwAD88wbAAPZqgrbAAOyjwADsrMAA7LwBAL2lAAAAAQPAAOyywADsvAAAAAAAAABgwAD6CgFKwADstQEhFsAA7LYuwABuPMAA9mkGwAD2a4K2wADs6MAA7PHAAO0KAQCpRwAAAAEDwADs/MAA7QoAAAAAAAAAYMAA+goBSsAA7P8BFsAA7P8uwACFEMAA9XPAAPYRBsAA9lmCtsAA7Q/AAO0bwADu9gAAwAB3dQAAAAEDwADtHsAA7vYAAAABAQHAAO0jAAAAwABoaGDAAPvQAABgwAD1+wE+BknAAO0zHMAA7UCAwADtN8B4ZD1jAQABkwDAAPz9PgE9MMAA7U0fwADtV8AA+wMBAAEkwADtjwInwACFgYDAAO2GwHhkPQA/ScAA7ZwcwADtqYDAAO2gwHhkPUgBAAGTAMAA/PNKwADtrwEawADttsAA9ho/TsAA7efAAO3uAACBdmDAAPX7ARrAAO3wwAD2Gk7AAO39wADuAgAAllFgwAD1+wEuQ8AA7g4hHMAA7h6AwADuFcB4ZD1IAQABkwDAAPzzPgNJwADuLBzAAO4/HMAA7jqAwADuMcB4ZD2DdwEAAZQAwAD76EgBAAGUAMAA/PM+AT2JwADuT8B4ZMwcwADuVoHAAO5PwHhkzIOIAQABgsAA7lnAeGToAMAA9k8/PYjAAO5twHhkPRzAAO52gMAA7m3AeGQ9g7wBAAGUAMAA++1JwADuqCEcwADutYDAAO6swHhkPUgBAAGTAMAA/PM+AT2KwADuxcB4ZOgcwADuyoLAAO7FwHhk6IOIAQABgsAA7s3AeGToAMAA9k8/SsAA7uUBgcAA7uzAeGTMBsAA9lqCtsAA76HAAO+twAEDcwAAwACFggAAAAEDwADvs8ABA3MAAAACAgLAAO+7AAAAwACFg2DAAPncAMAA788AAADAAIWEYMAA+dwAAGDAAPX7AT4gTsAA7+3AAO/2AADAAGhoYMAA9fsBJsAA7+0BgMAA7/jAeGYgYMAA9ftOwADwFcAA8B0AAMAAhYVgwAD1+wEmwADwFQGBwADwH8B4ZjFgwAD1+0nAAPAvFsAA8DyCwADwM8B4ZkzAAIUQwAD1c8AA9hE+AT0wwADwUR/AAPBbwAD7AwEAASTAAPCPAifAAIWGgsAA8IbAeGZMAD9JwADwnBzAAPCog8AA8KDAeGZ1gWsBAAEawADwq8AA9hkAwAD2VT4BPTDAAPC5H8AA8MPAAPsDAQABJMAA8P4CJ8AAhYeDwADw9sB4ZnUAP0nAAPELFsAA8RiCwADxD8B4ZkzAAIUxwAD1c8AA9mVKwADxIQEawADxKMAA9ho/TsAA8TjAAPFHAAHAAIWIYMAA+9ABFsAA8VKCwADxScB4ZkzAAErMwAD2Z0nAAPFhHMAA8XSEwADxZcB4Z2aBawEAAZMAwAD8/krAAPF6ARrAAPGBwAD2Gj9OwADxlcAA8akAAcAAhYlgwAD6CgEiFsAA8bODwADxq8B4ZnXAAG48wAD2aQEcwADxwxzAAPG9LpfIAAAAAMAA9kWBbQEAAYPAAPHGwHhmdQDAAPZXScAA8dMihcAA8dfAeGe/ARzAAPH9hMAA8e7AeGdmYwEAATdAAMAA/P0+Ck7AAPIcwADyHgAAwABH8GDAAPZ2ASMihcAA8iHAeGe/ARzAAPJHhMAA8jjAeGdmYwEAATcIAMAA/P0fwADyXMAA9q8BAAGDwADydMB4ZnUAH8AA8o3AAPabAQABg8AA8qjAeGZ1AAFgwAD2dk7AAPK8wADyyQAAwACFM2DAAOMhAR7AAPLLwAD1pQEAARzAAPLtHMAA8tiVg4gBAAEWwADy3IbAAPLawHhoP8AAhYrAAPVzwAD2eQDAAPz3ZAEAAZUAwAD89QBOwADy/cAA8wsAAMAAhYtgwADjIQEewADzDcAA9aUBAAEcwADzLxzAAPMalYOIAQABFsAA8x6GwADzHMB4aD/AAIWKwAD1c8AA9nkAwAD892QBAAGVAMAA/PUATsAA8z/AAPNHAADAAIWMYMAA4yEBHsAA80nAAPWlAQABFsAA81aGwADzVMB4aD/AAIWKwAD1c8AA9nkATsAA83PAAPN5AADAAIWNYMAA+9ABHMAA832GwADze8B4aD/AAG41wAD1cwIAAi4UwADzjMB4aWEJAADAAPZ8RcAA8+IBwADz68AA8+0AAJegYMAA+9ABHMAA9AMcwADz9RTAAPPvwHhpnQoAZAEAARzAAPP+FMAA8/jAeGmdCgCDdwEAAZQAwAD76ADAAPz1gY0BAAGUAMAA/PYBHMAA9AoUwAD0CMB4aeELAIFtAQABkwDAAP0AARXAAPQQwHhp4QscwAD0ERTAAPQQwHhp4QsAgY0BAAGUAMAA/PY+AT0cwAD0K4fAAPQfwHhoq4C/AgACFMAA9CzAeGnhCwAcwAD0OBTAAPQxwHhpYQkASwEAARTAAPQ5wHhp4QsAAMAA/IMAwAD8hE7AAPRPwAD0WgAAwACFPWDAAPvQARTAAPRcwHhpnQoATsAA9G0AAADAAIWOWwBFwAD0gAHAAPSJwAD0iwAAYmDAAPvQARzAAPSchMAA9I3AeGdmgY0BAAGVAMAA/PYBHMAA9KMUwAD0ocB4avcNAIFtAQABkwDAAP0AARXAAPSpwHhq9w0cwAD0qhTAAPSpwHhq9w0AgY0BAAGUAMAA/PY+Aj0VwAD0uMB4auQMHMAA9MiGwAD0xsB4aD/AAIWPwAD1cwMAA4fAAPTNwHhoqxTAAPTbwHhqxAsAFMAA9OfAeGkGCAAAwAD2fknAAPT/IRzAAPU/HMAA9SUcwAD1ExbAAPUMgsAA9QPAeGZMwACFEcAA9XPAAPYSSwEAARzAAPUWFMAA9RTAeGr3DQCGgQEAAWrAAPUZYMAA+9CDKwDAAPz6AMAA/IODdwEAARzAAPUqlIO6AQABHMAA9TAUwAD1LsB4avcNAJWuAQABasAA9TJgwAD70IMrAMAA/PgAwAD77ADAAPvoSAEAAZMAwAD88z4BPRXAAPVRwHhqxAscwAD1bobAAPVswHhoP8AAhZDAAPVzBQAFFMAA9XPAeGkGCAAmwAD1ggEUwAD1gsB4auQMAGDAAPvQFMAA9Y/AeGlhCQAUwAD1mMB4aZ0KAIfAAPWfwHhoqwDAAPZ9PgZOwAD188AA9f0AAMAAhXxgwADjIQGHwAD1/8B4aKtOwAD2G8AA9iMAAMAAcUNgwAD70AEUwAD2JcB4asQLAD2PwAD2O8B4aKsUwAD2SsB4aQYIAD0VwAD2Y8B4asQLJsAA9mMBFMAA9nDAeGrkDABgwAD70D0VwAD2h8B4aQYIFMAA9pfAeGzDDgA9FcAA9qzAeGrkDBTAAPa6wHhs4Q8ASsAA9tsBHMAA9uSGwAD24sB4aD/AAIWRwAD1cwIAAofAAPbswHhoqxTAAPb6wHhqxAsAAMAA9n8/TsAA9xUAAACD+VsAScAA9xwcwAD3L4TAAPcgwHhnZmMBAAE3EgDAAPz9PY7AAPc7wHhtnJRJwAD3SxzAAPdehMAA90/AeGdmYwEAATcwAMAA/P09jsAA92rAeG2clknAAPd6HMAA942EwAD3fsB4Z2ZjAQABN4CQAMAA/P09jsAA95rAeG2cl0nAAPeqHMAA972EwAD3rsB4Z2ZjAQABN4MAAMAA/P09jsAA98rAeG2cNwU9jsAA9+DAeG2cNwZOwAD3/MAA9/4AAMAAR/BgwAD2dgEfwAD4BMAA9psBAAGDwAD4H8B4ZnUATsAA+DHAAPgzAACDo2DAAPvQAZZOwAD4QsAA+EUAAcAASKJbARzAAPhJhsAA+EfAeG2cgY0BAAGUAABOwAD4WMAA+FsAAcAAhZJgwAD70AEcwAD4ZhzAAPhglIO6AQABJsAA+GMBhsAA+GPAeG2cYMAA+9AAwAD77IGNAQABlADAAPz2TsAA+HTAAPh8AADAAIWMXcAA/HQBWwEewAD4gsAA9csBAVsBHMAA+IoUwAD4h8B4bsEKAGQBAAGUAMAA/PUATsAA+JnAAPifAADAAIWNXcAA/HQBWwEewAD4pcAA9csBAVsBHMAA+K0UwAD4qsB4bsEKAGQBAAGUAMAA/PUAPRzAAPi+FMAA+LfAeG8KCwCAvwIAApQewAD4xMAA9aUBAAEWwAD40YfAAPjPwHhuW8AAhYrAAPVzwAD2eQAAwAD8hD0cwAD47RTAAPjowHhvSQwAgL8CAAKUHMAA+PWHwAD488B4blvAAG41wAD1cwIAAi4mwAD5CwEcwAD5CxTAAPkEwHhvCgsASwEAAZQAwAD8g2DAAOMhAMAA9nwAwAD8hEnAAPkVJsAA+RsBHMAA+RuGwAD5GcB4bZyAlwEAAZQAAGDAAPoKPgNOwAD5LMAA+TUAAMAAhZNgwADjIQEewAD5N8AA9aUBAAEcwAD5WRzAAPlElYOIAQABFsAA+UiHwAD5RsB4blvAAIWKwAD1c8AA9nkAwAD892QBAAGVAMAA/PUATsAA+WnAAPlwAADAAIWUYMAA+9ABHMAA+XSHwAD5csB4blvAAIWPwAD1cwMAAybAAPmAARzAAPmAFMAA+XnAeG8KCwBLAQABlADAAPyDYMAA4yEmwAD5igEcwAD5ihTAAPmFwHhvSQwASwEAAZQAwAD8g2DAAPvQFMAA+Y/AeHBTDQAAwAD2fkPAAPmgHMAA+akUwAD5p8B4boYIAIFrAQABFMAA+azAeG7BCgAAwAD8/j4DPRzAAPnBFMAA+brAeG8KCwCAvwIAAhTAAPnCwHhuhggAHsAA+cfAAPWlAQABHMAA+ekcwAD51JWDiAEAARbAAPnYh8AA+dbAeG5bwACFisAA9XPAAPZ5AMAA/PdkAQABlQDAAPz1AADAAPyEPRzAAPn8FMAA+ffAeG9JDACAvwIAAhTAAPn9wHhuhggAHMAA+hCHwAD6DsB4blvAAIWQwAD1cwUABRTAAPoVwHhwUw0AFMAA+h/AeHCuDgAmwAD6LgEcwAD6LhTAAPonwHhvCgsASwEAARzAAPoxFMAA+i/AeG6GCACBjQEAAZUAwAD89gDAAPyDYMAA4yEmwAD6PAEcwAD6PBTAAPo3wHhvSQwASwEAARzAAPo/FMAA+j3AeG6GCACBjQEAAZUAwAD89gDAAPyDYMAA+9AmwAD6TAEcwAD6TBTAAPpFwHhvCgsASwEAARTAAPpNwHhuhggAAMAA/INgwADjIQDAAPZ9AMAA/IQ9FcAA+lrAeG6GCBzAAPpcFMAA+lrAeG6GCABkAQABlQDAAPz1P07AAPp4AAAAwABrmlsATsAA+oPAAPqJAADAAEWHYMAA+goBKU7AAPqZwAD6pgAAwACFM2DAAOMhARbAAPqsGsAA+qjAAPYawACFEcAA9XPAAPYSTsAA+r3AAPrIAADAAIU9YMAA+9ABFsAA+s4awAD6ysAA9hrAAHaGwAD1c8AA9hNOwAD63cAA+usAAMAAhYtgwADjIQEewAD67cAA9aUBAAEcwAD7DxzAAPr6lYOIAQABFsAA+v6HwAD6/MB4blvAAIWKwAD1c8AA9nkAwAD892QBAAGVAMAA/PUATsAA+x0AAADAAIWOWwBOwAD7MsAA+0EAAMAAhZVgwADjIQEWwAD7TILAAPtDwHhmTMAAhRHAAPVzwAD2Ek7AAPtdwAD7XwAAl6BgwAD70AEcwAD7cBbAAPtqgsAA+2HAeGZMwAB2hsAA9XPAAPYTgY0BAAGUAMAA/PZOwAD7fcAA+38AAGJgwAD70AEcwAD7nRbAAPuTHMAA+48UwAD7gcB4c+YTAEsBAAEUwAD7kMB4dBUUAADAAPyDwABKzMAA/AaBjQEAAZQAwAD89kPAAPumHMAA+68UwAD7rcB4dBUUAIFtAQABkwDAAP0APgZJwAD7vRzAAPvDFMAA+8HAeHRSFQCBbQEAASbAAPvGARTAAPvGwHhumgkAYMAA/OYAwAD9AD4BPRXAAPvUwHhy+w0cwAD7+BzAAPvrHMAA++cUwAD72cB4c+YTAEsBAAEUwAD76MB4dBUUAADAAPyDg7wBAAEmwAD78QEcwAD78RTAAPvvwHh0UhUAgY0BAAEmwAD78wEUwAD788B4bpoJAGDAAPzmAMAA/PZgwAD70ADAAPvtg3cBAAEUwAD7+sB4bsEKAADAAPvoPgI9FcAA/BXAeHL7DRzAAPxEHMAA/CwcwAD8KBTAAPwawHhz5hMASwEAARTAAPwpwHh0FRQAAMAA/IODdwEAARzAAPw+HMAA/DKUg7oBAAEcwAD8OBTAAPw2wHh0UhUAZAEAAZQAwAD89QDAAPvsgY0BAAGUAMAA/PYAwAD76IO6AQABJsAA/EsBHMAA/EsUwAD8SMB4bpoJAIGNAQABFMAA/E3AeHRSFQAAAGDAAPvQAMAA++xJwAD8WRzAAPxfFMAA/F3AeHQVFACAlwEAAZMAwAD8/z4BPRXAAPxwwHhy+w0cwAD8chTAAPxwwHhy+w0AgQYBAAEcwAD8ixzAAPyDFMAA/HXAeHPmEwBLAQABHMAA/IYUwAD8hMB4dBUUAIGNAQABlADAAPz2AMAA/IODvAEAASbAAPyeARzAAPyeHMAA/JpqwAD8j2DAAPvQgytkAQABFMAA/JzAeHRSFQAAwAD89YGNAQABJsAA/KABFMAA/KDAeG6aCQBgwAD85gDAAPz2YMAA+9AAwAD77QAAPz0VwAD8vcB4boYIJsAA/L0BhsAA/MHAeG2cYMAA+9BDwAD8yhzAAPzZHMAA/NQUwAD80sB4cvsNAIN3AQABlAAASAEAAZMAwAD9KT4CPRXAAPzpwHhy+w0cwAD86xTAAPzpwHhy+w0Ag7wBAAGUAAA9FcAA/PzAeG6GCBzAAPz6FMAA/PzAeG6GCACBjQEAAZQAwAD89knAAP0NHMAA/RoVwAD9EsB4dFIVHMAA/RQUwAD9EsB4dFIVAIGNAQABFMAA/RfAeG6GCAAAwAD89mMBAAGTAMAA/P0+Aj0VwAD9KcB4dFIVHMAA/SsUwAD9KcB4dFIVAGQBAAFqwAD9LmDAAPvQgysAwAD89T0VwAD9RMB4dBUUHMAA/UIUwAD9RMB4dBUUAIGNAQABlADAAPz2P0nAAP1VFMAA/VnAeHMJDgA+Bj0VwAD9psB4cx8PHsAA/bXAAPWlAQABHMAA/dccwAD9wpWDiAEAARbAAP3Gh8AA/cTAeG5bwACFisAA9XPAAPZ5AMAA/PdkAQABlQDAAPz1AD0VwAD95cB4c04QJsAA/eUBHMAA/fcUwAD98sB4b0kMAEsBAAEmwAD9+AEUwAD9+MB4cvsNAGDAAPvQAMAA/INgwAD70E7AAP4IwAD+EQAAwACFllsBHMAA/hoUwAD+E8B4bwoLAEsBAAEmwAD+GwEUwAD+G8B4cvsNAGDAAPvQAMAA/INOwAD+K8AA/i4AAMAAfVxgwAD70AEcwAD+OxTAAP4wwHhzThAAZAEAARzAAP5JFMAA/j7AeHNOEACDdwEAAZQAwAD76ADAAPz1Q8AA/nQcwAD+gBXAAP59wHh5PhccwAD+exTAAP59wHh5PhcAgY0BAAGUAMAA/PaBbQEAAZMAwAD9AD4BPRzAAP6eFMAA/pLAeHMfDwCAvwIAAhTAAP6fwHh5PhcAJsAA/p4BHMAA/q0UwAD+pcB4eP4WAEsBAAEUwAD+rsB4eT4XAAAAYMAA+9AAwAD8hD0VwAD+xcB4cwkOKj4DQ8AA/uscwAD+9BTAAP7ywHhuhggAgJcBAAGUAMAA/P8+Az0VwAD/BcB4c9gSHMAA/xWHwAD/E8B4blvAAIWPwAD1cwMAAxTAAP8awHhzHw8AFMAA/yjAeHNOEAAUwAD/NMB4c30RAADAAPZ+PRXAAP9OwHhzThAcwAD/XYfAAP9bwHhuW8AAhY/AAPVzAwADFMAA/2LAeHN9EQAmwAD/cQEUwAD/ccB4c9gSAGDAAPvQFMAA/37AeHMfDwAAwAD2fj0VwAD/l8B4boYIHMAA/5kUwAD/l8B4boYIAIGNAQABlQDAAPz2ScAA/7EcwAD/txTAAP+1wHhuhggAgJcBAAGTAMAA/P8+AT0VwAD/yMB4c9gSHMAA/9iHwAD/1sB4blvAAIWPwAD1cwMAAxTAAP/dwHhzHw8AFMAA/+vAeHNOEAAUwAD/98B4c30RAADAAPZ+PgZOwAEAJsABADEAAMAAhZdgwADjIQEUwAEAM8B4cx8PAE7AAQBPwAEAWAAAwACFmGDAAPvQARTAAQBawHhzThAAPRXAAQBwwHhzHw8UwAEAf8B4c30RAD0VwAEAmMB4c04QJsABAJgBFMABAKXAeHPYEgBgwAD70D0VwAEAvMB4c30RFMABAMzAeHt4FgA9FcABAOLAeHPYEhTAAQDwwHh7mBcAPRXAAQEMwHhzThAcwAEBG4fAAQEZwHhuW8AAhZDAAPVzBQAFFMABAS3AeHN9EQAmwAEBPAEUwAEBPMB4c9gSAGDAAPvQJsABAVABHMABAVAUwAEBScB4bwoLAEsBAAEmwAEBUQEUwAEBUcB4cvsNAGDAAPvQAMAA/INgwADjISbAAQFaARzAAQFaFMABAVXAeG9JDABLAQABJsABAVsBFMABAVvAeHL7DQBgwAD70ADAAPyDYMAA+9AUwAEBX8B4cx8PAADAAPZ9Q8ABAXwiHMABAYUUwAEBg8B4dBUUAIFtAQABkwDAAP0AABzAAQGsHMABAaAcwAEBnBTAAQGOwHhz5hMASwEAARTAAQGdwHh0FRQAAMAA/IODdwEAARzAAQGllIO6AQABFMABAajAeHRSFQAAwAD77ADAAPvoSAEAAZMAwAD88z4IPRXAAQG8wHhz2BIcwAEBzIfAAQHKwHhuW8AAhY/AAPVzAwADFMABAdHAeHMfDwAUwAEB38B4c04QABTAAQHrwHhzfREAAMAA9n5OwAECB8ABAhIAAMAAhZdgwADjIQEUwAECFMB4cx8PAE7AAQIuwAECNwAAwACFmGDAAPvQARTAAQI5wHhzThAAPRXAAQJNwHhzHw8UwAECXMB4c30RAD0VwAECc8B4c04QJsABAnMBFMABAoDAeHPYEgBgwAD70D0VwAEClcB4c30RFMABAqXAeH2vFgA9FcABArnAeHPYEhTAAQLHwHh9zxcAScABAtkcwAEC4RXAAQLfwHh0UhUcwAEC3RTAAQLfwHh0UhUAgY0BAAGUAMAA/PZjAQABkwDAAPz9PgI9FcABAvLAeHRSFRzAAQMBasABAvZgwAD70IMrgY0BAAGUAMAA/PY9FcABAxLAeHQVFBzAAQMQFMABAxLAeHQVFACBjQEAAZQAwAD89j9AIRTAAQM5wHhzCQ4AwAEDOMABAz4ASsABA0UBHMABA06HwAEDTMB4blvAAIWRwAD1cwIAAhTAAQNWwHhzHw8AFMABA2TAeHNOEAAAwAD2fwbAAPZBgrbAAQQzwAEERsABKCMAAcAAhZnAAPVzAAAAAQPAAQRQwAEoIwAAAAMDA8ABBF0AAACDe2DAAPX7AMABBGwAAAC77mDAAPX7AMABBHQAAADAAIWaYMAA+goAAGDAAPX7AT4kTsABBIPAAQSLAADAAIU/YMAA4yEBFsABBI+AwAEEjcB4f1rAAIURwAD1c8AA9hJOwAEEoMABBKgAAMAAhXlgwADjIQEWwAEErIHAAQSqwHh/acAAhRHAAPVzwAD2Ek7AAQS9wAEEwwAAwACFQGDAAPvQARbAAQTHgMABBMXAeH9awAB2hsAA9XPAAPYTTsABBNbAAQTcAADAAIV6YMAA+9ABFsABBOCBwAEE3sB4f2nAAHaGwAD1c8AA9hNOwAEE78ABBPcAAMAAhZtgwAD70AEewAEE+cAA9aMCAAKFwAEE/sB4f/GGwAEFBcB4gCAATsABBRfAAQUeAAHAAIWcYMAA+9ABHMABBSiHwAEFIMB4gE9kAQABHMABBTOHwAEFK8B4gE+DdwEAAZQAwAD76ADAAPz1PYvAAQU9wHh/kx7AAQVHwAD2JQQABIPAAQVUwHh/k5OFwAEFYMB4f/EUwAEFZ8B4gIMIAAA9jMABBXTAeH/CHsABBX7AAPYlBAAEhMABBYvAeH/Ck4bAAQWXwHiAIBTAAQWewHiAgwgAAE7AAQWvwAEFuwAAwACFSWDAAPvQAZNJwAEFxILAAQXIwHh/eD4CScABBdUiHMABBeCGwAEF2sB4gCBIAQABlADAAPzzABzAAQX1HMABBfGEwAEF6sB4f8JLAQABkwDAAPyDSAEAAZQAwAD880rAAQX8ARrAAQYDwAD2Gj9JwAEGDiIcwAEGGYbAAQYTwHiAIEgBAAGTAMAA/PMBIhbAAQYuHMABBiqEwAEGI8B4f8JLAQABkwDAAPyDwABuPMAA/AQAFsABBkMcwAEGP4PAAQY4wHh/k0sBAAGTAMAA/IPAAG48wAD8BD4BPTDAAQZWHsABBmDAAPubAQABJ8AAhZ0APz4GScABBpUWwAEGm4DAAQaZwHh/WsAAhTHAAPVzwAD2ZT4BPTDAAQauH8ABBrjAAPsEAwADkyeZ8SfAAIWeAD9JwAEG+hbAAQcAgcABBv7AeH9pwACFMcAA9XPAAPZlPgE9MMABBxMfwAEHHcAA+wQDAAOTJ4PWJ8AAhZ4AP0nAAQdgIiIcwAEHbIXAAQdmwHh/8UgBAAGUAMAA/PMAHMABB4EcwAEHfYPAAQd2wHh/k0sBAAGTAMAA/INIAQABlADAAPzzASIcwAEHnYbAAQeXwHiAIEgBAAGUAMAA/PMAHMABB7IcwAEHroTAAQenwHh/wksBAAGTAMAA/INIAQABlADAAPzzSsABB7oBGsABB8HAAPYaP0PAAQfMIhzAAQflHMABB+AcwAEH3IPAAQfVwHh/k0sBAAGTAMAA/IODdwEAAZQAwAD76EgBAAGTAMAA/PMAHMABCAAcwAEH+xzAAQf3hMABB/DAeH/CSwEAAZMAwAD8g4N3AQABlADAAPvoSAEAAZMAwAD88z4DPR7AAQgRwAD2LAQABIPAAQgWwHh/k4XAAQgfwHh/8ZSDwAEIKcB4f5MAPR7AAQg7wAD2LAQABITAAQhAwHh/wobAAQhJwHiAIJSEwAEIU8B4f8IAPRXAAQhlwHiBMgkcwAEIcBTAAQhlwHiBMgkAZAEAAZQAwAD89UnAAQiCHMABCJIUwAEIhsB4gTIJAIFtAQABasABCJVgwAD70IMrAMAA/QA+BE7AAQivwAEIwAAAwACFn2DAAPvQARzAAQjOFMABCMLAeIEyCQCGgQEAAWrAAQjRYMAA+9CDKwDAAPz6PY3AAQjlwHh/8RzAAQjrhcABCOXAeH/xgY0BAAEUwAEI7sB4hGgKAADAAPz2PY7AAQkIwHiAIBzAAQkOhsABCQjAeIAggY0BAAEUwAEJEcB4hGgKAADAAPz2PY/AAQkrwHiATxzAAQkzh8ABCSvAeIBPgY0BAAEUwAEJNsB4hGgKAADAAPz2P0nAAQlWHMABCWscwAEJZhzAAQlihMABCVvAeH/CSwEAAZMAwAD8g4N3AQABlADAAPvoSAEAAZQAwAD88z4GTsABCZjAAQmiAADAAIV8YMAA4yEBg8ABCaTAeH+TTsABCbnAAQnBAADAAHFDYMAA+9ABhcABCcPAeH/xPYvAAQnSwHh/k4TAAQncwHh/wj2NwAEJ7cB4f/GGwAEJ9cB4gCA9jMABCgTAeH/CFMABCg7AeIVpCgA9jsABCiHAeIAgFMABCinAeIWHCwA/TsABCkjAAQpQAADAAIWgYMAA4yEBHsABClLAAPYlBAAEg8ABCl/AeH+Tk4XAAQprwHh/8RTAAQpywHiAgwgAAE7AAQqDwAEKiwAAwACFoWDAAOMhAR7AAQqNwAD2JQQABITAAQqawHh/wpOGwAEKpsB4gCAcwAEKtBTAAQqtwHiAgwgAZAEAAZUAwAD89QBOwAEK2MABCtsAAcAAhaJgwAD6CgEcwAEK7hzAAQrpHMABCuWDwAEK3sB4f5NLAQABkwDAAPyDg3cBAAGUAMAA++hIAQABkwDAAPzzTsABCzfAAQtAAAHAAIWjYMAA+9ABHMABC0qHwAELQsB4gE9kAQABlADAAPz1TsABC1nAAQthAAHAAIWkYMAA+9ABHMABC30cwAELbBTAAQtjwHiG0Q0AZAEAARzAAQt4FMABC2/AeIbRDQCDdwEAAZQAwAD76ADAAPz1ZAEAAZUAwAD89U7AAQukAAAAwACFpVsATsABC60AAADAAIWmWwBOwAELtgAAAMAAhadbAE7AAQu/AAAAwACFqFsATsABC9EAAADAAIWpYMAA+goATsABC94AAADAAIWqYMAA+goATsABC+sAAADAAIWrYMAA+goATsABC/gAAADAAIWsYMAA+goAScABDAkUwAEMDcB4hoUMAD4FPRXAAQwZwHiHVg8ewAEMI8AA9aUBAAEUwAEMLsB4hv4OAAA9FcABDD7AeIeOEyo9HMABDGAUwAEMWcB4h1YPAIC/AgACk5QAAD0VwAEMb8B4h3IRHsABDHnAAPWlAQABFMABDITAeIb+DgAAPRXAAQyUwHiHshUqPz0VwAEMs8B4h2QQHsABDL3AAPWlAQABFMABDMjAeIb+DgAAPRXAAQzWwHiHoBQqPRXAAQzvwHiHgBIewAEM+cAA9aUBAAEUwAENBMB4hv4OAAA9FcABDRLAeIfEFio9HMABDTIUwAENK8B4h4ASAIC/AgACk5QAAEFDwAENQCk+BkPAAQ1VHMABDW0cwAENaBzAAQ1kFMABDV3AeIX2CgBLAQABkwDAAPyDg3cBAAGUAMAA++hIAQABkwDAAPzzPgM9HsABDX3AAPYsBAAEFMABDYLAeIX2CgCHwAENi8B4gE+UFMABDZfAeIX2CgAAScABDakUwAENrcB4hoUMAD4CScABDb0iHMABDdMcwAENzhzAAQ3KFMABDcPAeIdWDwBLAQABkwAAg3cBAAGUAABIAQABlADAAP0pARzAAQ3uHMABDekcwAEN5RTAAQ3ewHiHZBAASwEAAZMAAIN3AQABlAAASAEAAZQAwAD9KT4CScABDhkUwAEOHcB4h44TAD4BScABDjoiIRzAAQ5QHMABDkYUwAEOP8B4h1YPAEsBAAGHwAEOR8B4gE8AAEgBAAGTAMAA/SkBHMABDqAewAEObMAA9i8EAAQmwAEOewEUwAEOe8B4h1YPAGDAAOMhh8ABDoTAeIBPhMABDo3AeH/Ch8ABDpbAeIBPAICXAQABkwDAAPz/PgE9HsABDrfAAPYxBQAFJsABDr8BFMABDr/AeIdWDwBgwADjIRTAAQ7IwHiG0Q0AhMABDtLAeH/Ch8ABDtvAeIBPJsABDuQBFMABDuTAeIdWDwBgwADjIQA+Aj0ewAEPFcAA9jEFAAWEwAEPHcB4f8KHwAEPJsB4gE8mwAEPLwEUwAEPL8B4h1YPAGDAAOMhh8ABDzjAeIBPJsABD0EBFMABD0HAeIdWDwBgwADjIQA9FcABD1vAeIeOEyo+AT0ewAEPo8AA9jAFAAUmwAEPqwEUwAEPq8B4h1YPAGDAAOMhFMABD7TAeIbRDQCEwAEPvsB4f8KHwAEPx8B4gE8mwAEP0AEUwAEP0MB4h1YPAGDAAOMhAEnAARAKFMABEA7AeIegFAA+AT0ewAEQK8AA9jAFAAUmwAEQMwEUwAEQM8B4h2QQAGDAAOMhFMABEDzAeIbRDQCDwAEQRsB4f5OHwAEQT8B4gE8mwAEQWAEUwAEQWMB4h2QQAGDAAOMhAEnAARB1IiEcwAEQixzAARCBFMABEHrAeIdkEABLAQABh8ABEILAeIBPAABIAQABkwDAAP0pARzAARDYHsABEKXAAPYvBAAEJsABELQBFMABELTAeIdkEABgwADjIYfAARC9wHiAT4PAARDGwHh/k4fAARDPwHiATwCAlwEAAZMAwAD8/z4BPR7AARDuwAD2MQUABSbAARD2ARTAARD2wHiHZBAAYMAA4yEUwAEQ/8B4htENAIPAAREJwHh/k4fAARESwHiATybAAREbARTAAREbwHiHZBAAYMAA4yEAPgI9HsABEUjAAPYxBQAFg8ABEVDAeH+Th8ABEVnAeIBPJsABEWIBFMABEWLAeIdkEABgwADjIYfAARFrwHiATybAARF0ARTAARF0wHiHZBAAYMAA4yEAPRXAARGMwHiHoBQpPz0ewAERxMAA9iwEAAQmwAERyQEUwAERycB4h1YPAGDAAOMhFMABEdLAeIbRDQCUJsABEd8BFMABEd/AeIdWDwBgwADjIQBJwAER+BzAARINHMABEggcwAESBBTAARH9wHiHZBAASwEAAZMAAIN3AQABlAAASAEAAZQAwAD9KT4BScABEjMUwAESN8B4h6AUAD4BPR7AARJSwAD2MAUABSbAARJaARTAARJawHiHZBAAYMAA4yEUwAESY8B4htENAIPAARJtwHh/k4fAARJ2wHiATybAARJ/ARTAARJ/wHiHZBAAYMAA4yEAScABEpoiIRzAARKwHMABEqYUwAESn8B4h2QQAEsBAAGHwAESp8B4gE8AAEgBAAGTAMAA/SkBHMABEvsewAESyMAA9i8EAAQmwAES1wEUwAES18B4h2QQAGDAAOMhh8ABEuDAeIBPg8ABEunAeH+Th8ABEvLAeIBPAICXAQABkwDAAPz/PgE9HsABEw/AAPYxBQAFJsABExcBFMABExfAeIdkEABgwADjIRTAARMgwHiG0Q0Ag8ABEyrAeH+Th8ABEzPAeIBPJsABEzwBFMABEzzAeIdkEABgwADjIQA+Aj0ewAETZcAA9jEFAAWDwAETbcB4f5OHwAETdsB4gE8mwAETfwEUwAETf8B4h2QQAGDAAOMhh8ABE4jAeIBPJsABE5EBFMABE5HAeIdkEABgwADjIQA9FcABE6fAeIegFCk/PR7AARPZwAD2LAQABCbAARPeARTAARPewHiHZBAAYMAA4yEUwAET58B4htENAJQmwAET9AEUwAET9MB4h2QQAGDAAOMhAEPAARQMHMABFCQcwAEUHxzAARQbFMAB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AifAAGEZgsAARUrAevnBQsAARWEAAcAARY9qwABFj2DAAPvQgVUAPgE+Aj0cwABFtxTAAEWvwHr9VggAggIBAAEkAAgnwACJO4fAAEXOwHr85yekaoLAAEXZwHr5wSeDQobAAEXlwHr8wSeA2SfAAIk8AMAA/hdCwABGGgBJwABGNhzAAEZAgMAARjrAevk/SAEAAWrAAEZVYMAA+9CBVQDAAPzzPgE9HMAARnEUwABGacB6/VYIAIICAQABJ8AAiT0AwAD+Fz4BPRzAAEasFMAARqTAev1WCACCAgEAASTAAEbgAifAAIk+HsAARsfAAPraAQABFsAARtQuwABnucAA9XPAAPtJAADAAP4XScAARu4cwABG94HAAEbywHr5i0gBAAFqwABHDGDAAPvQCQDAAPzzPgJOwABHJMAARyYAAEVgwAD9tgEjFMAARyjAev13CQAkwABHRAEWwABHOS7AAGe5wAD1c8AA+0kkwABHUwGCwABHSMB6+cEBYMAA/bY9HMAAR2MUwABHW8B6/VYIAIKKAQABJMAAR4gFJ8AAiT8UwABHesB7AqwKACeD14PAAEd9wHr6VCeDIQDAAP4UScAAR5YcwABHqITAAEeawHr6bUgBAAGTAMAA/PM+AT0cwABHvhTAAEe2wHr9VggAgooBAAEkwABH4AInwACJP4LAAEfVwHr5wQDAAP4UScAAR+4cwABH94HAAEfywHr5i0gBAAFqwABIDGDAAPvQIQDAAPzzPgE9HMAASCUUwABIHcB6/VYIAIKKAQABJMAASFEDJ8AAiT+CwABIPMB6+cGDwABIR8B6+lQAwAD+FD4BPRzAAEhvFMAASGfAev1WCACCigEAASTAAEieBCfAAIk/gsAASIbAevnBJ8AAU8WDwABIlMB6+lQAwAD+FEnAAEishcAASLDAevySPgNOwABI1MAASOUAAMAAiUBgwAD+AAEfwABI68AA/h8AAAAARcAASQEBwABJCsAASQwAAGJgwAD70AGTARzAAEkTFMAASRHAewRcCwBjAQABFsAASSwWwABJFS7AAIkQwAD1c8AA+0hhwAD8owDAAPz9ARXAAEk0wHsEXAscwABJNRTAAEk0wHsEXAsAZAEAAZQAwAD89T4CScAASUMcwABJSRTAAElHwHsEXAsAgJcBAAGTAMAA/P8+AT0cwABJaxTAAEla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BAAEgMABL9/AfJ/igcABL+nAfJ/xgsABL/DAfJ//asABL/VdwAD8dAFgwAD70MAB1A8ABsAA/sSC7MABMA3AATAbwAEzugABwACKnsAA9XMAAAABA8ABMCTAATO6AAAABgYGwAEwLAAAAE5gwAD9tgDAATA2AAAAamDAAPvQAMABMEEAAACCjGDAAPvQAMABMF0AAACDGF3AAPwyAWDAAP22AMABMHIAAACBumDAAP22AMABMH8AAACcemDAAPoKAABgwAD9tgE+CU7AATCYwAEwnwAAwACByWDAAPoKARzAATCphMABMKLAfKDvSAEAASeBuwDAAP3FTsABML7AATDRAADAAIqfYMAA+goBIobAATDTwHyhFwGFwAEw3cB8oP5JwAEw7yIcwAEw+IDAATDzwHygr0gBAAErAMAA/cUAHMABMRCDwAExA8B8oNpIAQABKwDAAP0pSsABMRkBI4bAATEgwHyhFydQJwABYMAA/bY/ScABMTciIRzAATFAgMABMTvAfKCvSAEAASsAwAD9xQAhHMABMViDwAExS8B8oNpIAQABKwDAAP0pPgE9MMABMWkfwAExb8AA+wMBAAEnwACKoAA/TsABMbcAAACBdmDAAP22AEnAATHDIRzAATHMgMABMcfAfKCvSAEAASsAwAD9xT4BPRXAATHdwHyiFQgewAEx5sAA/soFAASAwAEx/MB8oK+BwAEyAsB8oL2CwAEyCcB8oMtqwAEyDl3AAPx0AWDAAPvQwAHUfgHAAIqhKT4BPRXAATJbwHyiFQgcwAEyvhzAATJ8g8ABMmTAfKDagKsBAWDAAP22ATTAATKAA8ABMoDAATKxAAAAAQEBwAEygQAAAIhBYMAA/bYAAGDAAP22AUrAATKHAR7AATKHwAD+2QQABGrAATKSXcAA/HQBYMAA+9DAAdRXFMABMqLAfKLOCQBqwAEypWDAAMkogYcqAADAAPw9WAEAASdQAMAA/EZJwAEy0xbAATLeFMABMtfAfKIVCACBVcAA/bw+AUnAATLvhsABMvPAfKEXSsABMvsBJ1A/ScABMxIih8ABMxbAfKFGACEcwAEzNBTAATMtwHyiFQgAgdYBAAEnUADAAP3IPgE9FcABM03AfKIVCBzAATNaJ1BkAQABFMABM1zAfKIVCAAAwAD9yz89FcABM27AfKIVCB7AATN3wAD+xQMAAxTAATOGwHyiFQgAhMABM47AfKDvhcABM5bAfKD+AErAATOpARTAATOwwHyiFQgABsAA/sWC7MABNN7AATTswAE16wABwACKosAA9XMAAAABA8ABNPrAATXrAAAAAwMDwAE1AgAAAE5gwAD9tgDAATUPAAAAgbpgwAD9tgDAATUcAAAAnHpgwAD6CgAAYMAA/bYBPgJJwAE1MCIiFsABNTuBwAE1NMB8pEGBVcAA/bwAIYLAATVHwHykUAAhHMABNV2AwAE1WMB8pDOB1gEAASdQAMAA/cg+AUrAATV2AR7AATV9wAD+0QIAAoDAATWUwHykMyIWwAE1oYHAATWawHykQYOywAD9vQGCwAE1r8B8pFAAP0rAATXIAR7AATXPwAD+0AEAAYDAATXiwHykMwAGwAD+xoLswAE18MABNf7AATo/AAHAAIqjwAD1cwAAAAEDwAE2CMABOj8AAAAEBATAATYQAAAAllhgwAD9tgDAATYbAAAAamDAAPvQAMABNiYAAACCjGDAAPvQAMABNmMAAADAAHwLXcAA/KUCYMAA/bZbAABgwAD9tgE+B0nAATZ6IRzAATaEgMABNn7AfKU0SAEAASsAwAD9xT4CScABNpUhHMABNqmDwAE2mcB8pWBIAQABKwDAAP0pPgE9MMABNrwfwAE2wsAA+wMBAAEnwACKpAA/SsABNwsBHsABNxLAAP7KBQAEgMABNyjAfKU0gcABNy/AfKVDgsABNzbAfKVRasABNztdwAD8dAFgwAD70MAB1J8BwACKoSk/ScABN3kcwAE3jYPAATd9wHylYEgBAAErAMAA/SlKwAE3lgErP07AATeswAE3swAAgXZgwAD+AAEfwAE3tcAA/h8AAAAATsABN83AATfXAACBr2DAAP22AScAT8ABN+LAATfnAAABwACKpWECYMAA/bZgwAD9tlwAA8ABN/XAATkIAAAAAgICwAE3/QAAAIPRYMAA/bYAwAE4CQAAAICWYMAA/bYAAFwBPgQ9HMABOB+EwAE4GMB8pkiCigEAAYXAATglwHymaADAAP4UPY3AATg3wHymaCeDdz0cwAE4VYTAAThOwHymSIKKAQABHsABOF/AAP5oAQABh8ABOHTAfKapAADAAP4UScABOIEiIRzAATiLFMABOIXAfKa4CABIAQABKwDAAP3FABbAATicFMAB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T8AA9csBAWDAAPvQAYeMWcB99HsAToyLjI0AAJegYMAA+9ABk06MkoyUAABiYMAA+9ABk06MmYybAACA9WDAAPvQAZNDjKQcjK0UjKvAffV2CgBjAQABhoyvwH30TwDAAPz9PgZOjMiMygAAg3tgwAD70AEcjRccjOwcjOAcjNkcjNOAjM7AffNgSwEAATUAAAABAGDAAPvQARSM1MB99XYKADUAAAABAGDAAPvQARWM1MB99XYKHIzVFADAffXfDABkAQABlADAAPz1FADAffXfDAAAwAD8g4O6AQABNxAAwAD77IN3AQABN8D///8AwAD76IEGAQABHI0LHI0FHIz/gIz6wH3zYEsBAAE1AAAAAQBgwAD70AEUjQDAffV2CgA1AAAAAQBgwAD70AEVjQDAffV2ChyNARQAwH32XgwAZAEAAZQAwAD89RQAwH32XgwAAMAA/IODugEAATcIAMAA++yDdwEAATfA////AMAA++gAwAD76YEGAQABHI0ogI0jwH3zYEsBAAE1AAAAAQBgwAD70AEUjSnAffV2CgA1AAAAAQBgwAD70AEVjSnAffV2ChyNKhQAwH323AwAZAEAAZQAwAD89RQAwH323AwAAMAA/IMAwAD76T0cjTgUjTXAffU7CACAvwIAAjUAAAABAGDAAPvQARSNOcB99WYJADUAAAABAGDAAPvQARWNOcB99WYJHI06FADAffc+DQBkAQABlADAAPz1FADAffc+DQAcjUeEjUDAffPrhAsBAAEcjVQUjVLAffW2DACDvAEAATcSAMAA++0AwAD9xADAAPyEPRyNZRSNYsB99TsIAIC/AgACNQAAAAEAYMAA+9ABFI1mwH31ZgkANQAAAAEAYMAA+9ABFY1mwH31ZgkcjWcUAMB998cNAGQBAAGUAMAA/PUUAMB998cNAByNdISNbcB98+uECwEAARyNiRyNghSNgMB99bYMAIO8AQABNwwAwAD77YN3AQABNz8AwAD76ADAAP3EAMAA/IQ9HI2bFI2YwH31OwgAgL8CAAI1AAAAAQBgwAD70AEUjZzAffVmCQA1AAAAAQBgwAD70AEVjZzAffVmCRyNnRQAwH34Xw0AZAEAAZQAwAD89RQAwH34Xw0AHI2qhI2jwH3z64QLAQABHI2+HI24FI22wH31tgwAg7wBAAE3BgDAAPvtg3cBAAE3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a8AARMoAAAAAAAAAXAE+AUnAAER0HMAARIQWwABEeC7AAHf0wAD/UMABAXFIAQABKwDAAP0pPgE9F8AARJUuwAB39MAA/1AewABEp8AAwI8AAmDAAP22YMAA/bYAAMABAXE/BsABAXuC9cAARM/AAETnwABFqgEAmoAAAAABA8AARPLAAEWqAAAAAAAAAF3AAPylAmDAAP22YMAA/bYBPgM9HMAARPguwACNJcAA/1AAAAAAwAEBdknAAEURHMAARS0WwABFFS7AAI0kwAD/UMABAXJIAQABKwDAAP0pPgE9F8AART4uwACNJMAA/1AfwABFXMAAwjUBAmDAAP22YMAA/bYBFsAARXAuwAB39MAA/1DAAQFxAMABAXI/SsAARYgBFsAARY8uwACNJMAA/1DAAQFyBsABAXiC9cAARa/AAEW2wABG3gAAIwAAAAEDwABFvsAARt4AAAAAAAAAYMAA/bYBPgROwABF1MAARdcAAIPkYMAA/gABH8AARd3AAP4fAAAAAD0cwABF9IDAAEXxwH6G3IKKAQABFsAARfoulwbAAP9QwAEBcADAAP4UScAARgciIRzAAEYWFsAARgsumoDAAQF7SAEAASsAwAD9KQAcwABGMxbAAEYsFsAARiEumoDAAQF7YcAA/MmAlwEAAZMAwAD8/z4BPRzAAEZMFsAARkAuwAB39MAA/1DAAQFxg/gBAAE0wABGVAPAAEZUwABGuQAAAAICAsAARlwAAACAvWDAAP22AMAARmkAAACAlmDAAP22AABgwAD82QE+AT01wABGegAAAQBgwAD+AAGAwABGesB+htw1AAAAAQBbARzAAEZ+g8AARnzAfofJgooBAAEnq7AAwAD+FDUAAAABAFsBHMAARouDwABGicB+h8mCigEAAYHAAEaRwH6HoADAAP4UNQAAAAEAWwEcwABGmIPAAEaWwH6HyYKKAQABJ4C8AMAA/hQ1AAAAAQBbARzAAEakg8AARqLAfofJgooBAAGCwABGqsB+h68AwAD+FIMAwH6HyQDAAPzEP0rAAEbGARzAAEbQgMAARs3AfobcIwAAAADAAP4ZBsABAXeC9cAARuPAAEbowABTbgAAwAB+38AA/1AAAAABA8AARu7AAFNuAAAABAQEwABG9gAAAIhBYMAA/bYAwABHAAAAAMAAjDhgwAD9tgDAAEcbAAAA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J8B+7qwAAAB+7iAAfu6CAH7u8gAAAAICwAECMYLxwABENcAARDvAAEU7A8AAjYEAAAFgwAD9HAABXcAA/YQBXcAA/HQBYMAA+9ABBMABAjSC8cAARLrAAETBCYfrwAD/UABdwAD9hAFgwADi8wABBcABAjmC8cAARHPAAER5wABEnwEAAAPAAESRwABEnwAAAAEBAcAARJcAAASH613AAP2EAWDAAOLzAABgwAECMQE/AggBwAECNIAAwH7vgAkBwABEecAA/TIAAAAAAgbAAQI2gvHAAETGwABEy8AARQ4AAFYAAAABA8AARM7AAEUOAAAAAQEBwABE2QAAIBJdwAD8dAFgwAD70AAAXAE+AT0cwABE7RbAAETlLofrwAD/UMABAjRWAQABHsAARPvAAOL4AQABgMAARQTAfu/iAADAAP2GBsABAjeC8cAARRPAAEUYwABFOQAAgogAAAABA8AARR3AAEU5AAAAAAAAAFwBPgE9HMAARS4WwABFJi6H68AA/1DAAQI0gogAAAAAwAD9hwAAfu+5AH7wMAB+8H8AAAACAsABAjqC8cAART7AAEVEwABTjwPAAIJLAAEAAIJ2YMAA/RwBWwFgwAD9HAABXcAAubYBXwAABwTAAQI9gvHAAEWMwABFkwmH68AA/1AAXcAAubABXwAAAATAAQI+gvHAAEWnwABFxwnAAIJMwAD/UABdwAC4yQFbAR7AAEW8wAC4ywABWwAABMABAj+C8cAARd/AAEXyWMAAgk3AAP9QAF3AALngAV8AAAErBMABAkCC8cAARgDAAEYUGMAAgk7AAP9QAF3AALjJAVsBKwTAAQJBgvHAAEYdwABGLhjAAG1wwAD/UABgwAD6CgEqBMABAkKC8cAARjfAAEZHGMAAgk/AAP9QAGDAAPoKASoEwAECQ4LxwABGUMAARmEYwABvaMAA/1AAYMAA+goBKgEFwAECU4LxwABGZsAARmbAAEaDAAAAA8AARnXAAEaDAAAAAQEBwABGewAABIfrXcAAubABXwAAAABdwAECOgFfAAABPwIIAcABAj2AAMB+8eMJAcAARmbAAP0yAAAAAAoGwAECRYLxwABGiMAARo3AAEcDAABWAAAAAQPAAEaQwABHAwAAAAEBAcAARpMAACASXwAAAABcAT4CScAARp8WwABGoy7AAG1wwAD/UMABAkE+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/1DAAQLJgdsCAAKBwACxVMB/TaUmwACxWwGCwACxW8B/TbBgwAD9igDAALjSScAAsXAcwACxdC7AAI3nwAD/UAEAAYHAALGBwH9NpQDAAQLhPgFKwACxlQEWwACxnC7AAI2IwAEC2j4BPTDAALHBgcAAscfAf02lwAC4vE7AALHxwACx+AAAgdxdwAC4qQFbARzAALH6LsAAjFMAAAAAwAEC3EnAALIOIRzAALIZgcAAshLAf05VSAEAASsAwAD9KT4BSsAAsioBF8AAsjEuwACN18AA/1AcwACyR4HAALJAwH9OVYH+AQABgMAAslTAf0rAAMAAuL7AAQLMP0rAALJpARfAALJwLsAAjdfAAP9QHMAAsoeAwACyf8B/SsAgAAAAAADAAQLMBsABAuaC8cAAspLAALKlwACywgEAn34AAAABA8AAsqrAALLCAAAAAAAAAF3AALipAWDAAPRsAUrAALKtARbAALK8FsAAsq0uwACCTMAA/1DAAQLJgdzAALjOBsABAt+C8cAAssfAALLMwACzOgAAwACNmwAAAAEDwACy1cAAszoAAAACAgLAALLgAAAAEl3AAPx0AWDAAPvQAMAAsuoAAABhYMAA+9AAAFwBPgNAHMAAswcWwACy/y6c8MAA/1DAAQLLSAEAAZMAwAD888AAsv/AALMLAD0XwACzEi6YIMAA/1AmwACzEgGAwACzHMB/T4dgwADi88ABAso9F8AAsyYunPDAAP9QgcAAszDAf0+bwAECywbAAQLogvHAALM/wACzSMAAtUICAMAAfmkAAAABA8AAs0zAALVCAAAAAQEBwACzUgAAAICWYMAA+goAAFwBPgI9F8AAs18uwACN2sAA/1CAwACzZ8B/UELAAQLPScAAs3IWwACzdi7AAI3awAD/UMABAs8+Az0XwACzhS7AAI3dwAD/UB7AALOXwADi9wEAAWrAALOhYMAA+9DAALcjAMABAtJAHMAAs9AWwACzxi7AAI3bwAD/UMABAtBIAQABKwDAAP0pwACzxsAAs9cAPRfAALPgLsAAjdvAAP9QHMAAtBMfwACz8MAA7cABAAABwAB+aSm0LwEAAR/AALQuwAECwwEAATTAALQ8A8AAtDzAALU2AAAAAQEBwAC0PQAAABJdwAD8dAFgwAD70AAAYMAA/NkBPgRJwAC0kxzAALSgFsAAtJcu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AqzAAQK3NQAAAAEAWwEXwAEPhIXAAQ+CwH+o+8AAjG0WwAEPnILAAQ+TwH+oM8AAjG3AAQKrwAECtoUAwH+o+0bAAQ/HwAEP+sABD9AAAACZaGDAAP22ABbAAQ/0FsABD+sWwAEP44LAAQ/awH+oM547wAECa8AAjPbAAP9QwAEBLYNiwAD8xz4BScABEAQcwAEQIBzAARAXFsABEBCEwAEQCMB/qOGeO8ABAmtLAQABhcABEBjAf6mJAMABAThIAQABKwDAAP0pPgE9HMABEEUWwAEQPYTAARA1wH+o4Z47wAECa5ceAgAChcABEEnAf6mJHMABEGEWwAEQWoLAARBRwH+oM547wAECa0sBAAGFwAEQYsB/qYkAwAEBOADAAQFQP0rAARCEATXAARCLAAABAGDAAQKbAYTAARCLwH+o4TUAAAABAFsBF8ABEKUWwAEQnYXAARCbwH+qa547wAECa8AAjDUqwAEBZDUAAAABAFsBF8ABEM+FwAEQzcB/qmvAAIw0k8ABAnSFAMB/qmsAwAC4vAbAAQNagvHAAREhwAERJsABEb4AAMAAjgHAAP9QAAAAAQPAARE3wAERvgAAAAEBAcABEU4AAADAAINjYMABAusAAFwBPgI9HMABEYMcwAERchbAARFgLsAAjibAAP9QwAEDL0sBAAEWwAERfoDAARFzwH+rBoPRwAEC7QDAAPy5wACOGQEAAYDAARGUwH+rBgDAAQMkPRzAARGlLsAAjh3AAP9QAAAAAMABA1wGwAEDW4LxwAER+MABEf3AARNtAADAAI1pwAD/UAAAAAEDwAESDsABE20AAAABAQHAARIlAAAAwACDY2DAAQLrAABcAT4DPRzAARJCgMABEjfAf6uywACODQAAAADAAQMCTsABElfAARJoAADAAI4zYMABAw4BHMABEnwWwAESai7AAI4mwAD/UMABAy9LAQABFsABEoiAwAESfcB/q7KD0cABAu0AwAD8uUnAARKSIRzAARKngcABEpbAf6vkSAEAASsAwAD9KT4DPRzAARLJgcABErjAf6vkwACOGgEAAYDAARLawH+rsgDAAQMlScABEu0WwAETAoHAARLxwH+r5IFVwAEDHD4BPRzAARMoFsABExUuwACOJsAA/1DAAQMvhFkBAAEWwAETOoDAARMvwH+rsoPRwAEC7QDAAPzCPz0cwAETTi7AAI4dwAD/UAAAAADAAQNcPwbAAQNcgvHAARNywAETd8ABE9gAAMAAjh3AAP9QAAAAAQPAAROKwAET2AAAAAAAAABcAT4BScABE5MWwAETly7AAI4kwAD/UMABAy0+AT0cwAETqS7AAI4swAD/UAEAARbAARO7LsAAjiXAAP9QwAEDLgDAAQNdPwbAAQNdgvHAARPdwAET4sABFHYAAMAAjizAAP9QAAAAAQPAARPzwAEUdgAAAAEBAcABE/kAAACeNGDAAPoKAABcAT4BRsABFAbAARRHwAEUDwAAAMAAjjNgwAEDDgAcwAEUPRbAARQ2FsABFCMuwACOJsAA/1DAAQMvKcAA/MiArQAAAADAAPxIPgE9HMABFGCBwAEUT8B/rZ+CiAEAAYDAARRmwH+tggDAAQMmBsABA16C8cABFHvAARSNwAEVlwAAwACOIsAA/1AAAAABA8ABFKHAARWXAAAAAwMDwAEUqQAAAJZWYMAA/bYAwAEUswAAAJZXYMAA+9AAwAEUvgAAAMAAjgtgwAD6CgAAYMABAw4BPgJOwAEU1cABFNkAAIPRYMAA/bYBJsABFNUBHsABFPHAAQMBAwADgsABFPnAf65NgMABFQPAf64vgcABFQnAf64+AGDAAP22SsABFRQBHMABFS4WwAEVGy7AAI4mwAD/UMABAy+ZFQIAAoPAARU6wH+uaDTAARU/A8ABFT/AARWSAAAAAAAAAGDAAQMOAT4BSsABFUoBH8ABFVXAAQMpBQAFg8ABFWfAf65ogMABFWzAf64vgcABFXLAf64+gsABFXjAf65NFsABFYIuwACDYsAA/1DAAQMyAADAAPzABsABA1+C8cABFefAARX/wAEYoQAAwACOMsAA/1AAAAABA8ABFg3AARihAAAABAQEwAEWFQAAAMAAjhtgwAD9tgDAARYiAAAAwACOHGDAAPvQAMABFkUAAADAAI4xYMABA9cAwAEWVQAAAMAAjgtgwAD6CgAAXcAAuKkBYMABAwgBPgNOwAEWdsABFn4AAMAAjjRdwAD8bQFgwAED3wEWwAEWkhbAARaKgsABFoDAf6+VwACONMABA9tcwAD8VE/AARahwAEWuQAAAcAAfz9hAVtdwAC4qQFgwAEDCAADwAEWwMABGGEAAAABAQHAARbBAAAAgcVbAABdwAC4qQFgwAEDCAE+BUnAARbQIRzAARbdhMABFtXAf6/HXQAAAADAAPxvSsABFukBHsABFvTAALizAQFgwAEDCAGGwAEXAcB/sC8AP07AARcWwAEXHAAAwACLI2DAAQPfARbAARcmhMABFx7Af6/HXsAA/HFOwAEXPMABF0EAAJZWYMAA/bYBIxbAARdJh8ABF0PAf7CJwACNzsABA+WAwAEXVMB/r3MWwAEXZIfAARdewH+wiZZWwAED4QFgwAD9tk7AARd0wAEXeQAAlldgwAD70AEjFsABF4GHwAEXe8B/sInAAI3OwAED5YHAAReMwH+vhBbAARech8ABF5bAf7CJllfAAQPiAWDAAPvQSsABF6gBHMABGEgcwAEX5RzAARevLsAAjiLAAP9QAwADFMABF8TAf7CxCAAUwAEXysB/sP4JAIPAARfQwH+vpgDAAQNewAB/PwQABIDAARftwH+vc4HAARf2wH+vhIfAARf/wH+wiS4AwAEDJ4HxAQABhcABGFPAf7AGAMAAuL1KwAEYaAEcwAEYdoXAARhvwH+wBiABAAEfwAEYe8ABANMBAAEnwACONQAAAAbAAQNggvHAARimwAEYt8ABGrkAAMAAjXTAAP9QAAAAAQPAARjHwAEauQAAAAIBAsABGMwAAADAAEjMYMAA/jcAwAEY6AAAAIG6YMABBBUBagBgwAD82XcAYMABBDIBPgJOwAEZJcABGSgAAMAAi2NgwAEEMgEcwAEZPxbAARkyLsAAjifAAP9QwAEDMINZAgFgwAEEMgIrNMABGUoDwAEZSsABGqUAAAACAgLAARlcAAAAwABnV2DAAQQyAMABGWIAAACAlmDAAQQiAABgwAEEMgE+Ak7AARl1wAEZhQAAwACONmDAAQQyASbAARmNAIPAARmHwH+ys2DAAQQyScABGagcwAEZvITAARmswH+yzLJeAgACgMABGcTAf7ImgcABGcnAf7I3AMABBDY+AknAARncHMABGeWCwAEZ4MB/sqJIAQABKwDAAP0pSsABGe4BJsABGe4Bg8ABGfXAf7KzYMABBDI/SsABGgQBIxzAARorFsABGiQWwAEaHxbAARobhMABGgvAf7LMgKzAAQQ0TsAA/kJhwAD9uoCXAQABFsABGjsWwAEaNhbAARoygsABGi3Af7KigKzAAQQ0TsAA/kJhwAD9ugDAAPz/hMABGlDAf7LMgsABGm7Af7KiAWDAAQQyPgFKwAEaiwGCwAEaksB/sqIAwAD8RErAARqsAYLAARqzwH+yWAbAAQNhgvHAARq+wAEa0MABG+kAAMAAjXLAAP9QAAAAAQPAARrlwAEb6QAAAAIBAsABGu0AAADAAIsjYMABA98AwAEbEQAAAIG6YMABBBUBagBgwAD82XcAYMABBDoBPgNOwAEbQcABG0QAAMAAcWBdwAD8bQFgwAEEOgEWwAEbWBbAARtGLsAAjf3AAP9QwAEDMVzAAPxUQ8ABG2YcwAEbcILAARttwH+0Yl0AAAAAwAD8bz4BScABG4QcwAEbkxbAARuLgsABG4jAf7RiXsAA/HGyXgIAAoDAARubwH+0MIHAARuiwH+0QQDAAQQ/PgFKwAEbtQEWwAEbv4LAARu8wH+0Yl7AAPxxP0rAARvaASsGwAEDYoLxwAEb7sABG/PAARyGAADAAI13wAD/UAAAAAEDwAEcBcABHIYAAAABAQHAARwTAAAAwACLY2DAAQQiAABcAT4CTsABHCHAARwnAAAnYMAA+9ABHMABHDYWwAEcKS7AAI4nwAD/UMABAzCAuwEAAYDAARw+wH+1QgDAAPyJScABHEchHMABHFGBwAEcS8B/tVlIAQABHMABHFSUgcQAAAAAwAD78wDAAPzzPgE9HMABHG0WwAEcYC7AAI4nwAD/UMABAzCfwwEAAYHAARx2wH+1WQDAAPySPwbAAQNjgvHAARyLwAEckMABHTIAAMAAjXbAAP9QAAAAAQPAARynwAEdMgAAAAEBAcABHLUAAADAAItjYMABBCIAAFwBPgJOwAEcw8ABHMkAACdgwAD70AEcwAEc3RbAARzLLsAAjf3AAP9QwAEDMYC7AQABJsABHOUBgMABHOXAf7YfYMABBDoAwAD8iUnAARzuIRzAARz4gcABHPLAf7Y2SAEAARzAARz7lIHEAAAAAMAA+/MAwAD88z4BPRzAAR0ZFsABHQcuwACN/cAA/1DAAQMxn8MBAAGBwAEdIsB/tjYAwAD8kj8GwAEDZILxwAEdN8ABHUXAASVKAAHAAI43wAD/UAAAAAEDwAEdXsABJUoAAAACAgLAAR1qAAAAwABIzGDAAP43AMABHYMAAACAiV3AAPylAmDAAP22YMAA/bYAAGDAAP22AT4JT8ABHZbAAR2WAAABwACOOGEBYMAA/bZgwAD9tgADwAEdosABH2UAAAABAQHAAR2qAAAAgyZgwAD9tgAAYMAA/bYBPgRJwAEduhzAAR3Fg8ABHb7Af7dnSAEAASsAwAD9xUrAAR3OASs/TsABHfLAAR34AACEsV3AAPxtAWDAAP22ARbAAR4hHMABHgwcwAEeAYPAAR36wH+3Z4CmAQABJ4CnAMAA/dmAqwEBYMAA/bYBNMABHhADwAEeEMABHh8AAAABAQHAAR4RAAAAiEFgwAD9tgAAYMAA/bYBSsABHhcBHMABHhmEwAEeF8B/uACB4QAAAADAAP3NAMAA/D1cwAD8VEPAAR4xHMABHj6EwAEeOMB/t6VdAAAAAMAA/G8+Ak7AAR5YwAEeXQAAgL1gwAD9tgEWwAEeZYTAAR5fwH+3pV7AAPxxScABHnYiIiIcwAEegIXAAR57wH+4XYHWAQABJ5mOAMAA/cgAHMABHqiFwAEeo8B/uF1PAQABJ5mPAMAA/ccAHMABHtkkwAEe2QMnmY4WwAEe0YDAAR7NwH+3B5ZWwAD+QCeZj0gBAAGFwAEe3MB/uF0AwAD9xQEiFsABHveFwAEe8sB/uF2DssAA/b0AHMABHw4WwAEfCYDAAR8FwH+3B5ZWwAD+QE8BAAGFwAEfF8B/uF0AwAD9xz4BSsABHysBJ8AAjjk/SsABH1QBK0/AAR9swAEfbAAAAcAAjjphAWDAAP22YMAA/bYAA8ABH3bAASIKAAAAAQEBwAEffgAAAIMmYMAA/bYAAGDAAP22AT4JScABH44cwAEfmYTAAR+SwH+5e0gBAAErAMAA/cVKwAEfogErPz2MwAEftcB/uXscwAEfxYTAAR++wH+5e4HhAAAAAMAA/c1JwAEf0xbAAR/ehMABH9fAf7l7gVXAAP28SsABH+cBKz9OwAEf/sABIAIAAJ+yYMAA+9ABHMABIAuEwAEgBMB/uXuAuwEAASfAAIrGAMAA/clJwAEgIRzAASAphcABICXAf7n8gW0BAAGTAMAA/QA+AT2MwAEgOcB/uXscwAEgSYTAASBCwH+5e4C+AQABHMABIFeFwAEgU8B/ufxkAQABlgDAAPz1AMAA/cw/PY3AASBrwH+5/BzAASB4hMABIHHAf7l7gLsBAAEnUADAAP3JScABIIwcwAEglIXAASCQwH+5/IFtAQABkwDAAP0APgE9jMABIKTAf7l7HMABILSEwAEgrcB/uXuAvgIAApOFwAEgwcB/ufwAwAD9zD9JwAEhBhzAASEeHMABIRGEwAEhCsB/uXuAuwEAASeZjgDAAP3JSAEAAZMAwAD88z4CTsABITLAASE2AACfsmDAAPvQARzAASE/hMABITjAf7l7lloBAAEnguYAwAD9yknAASFZHMABIXEcwAEhZITAASFdwH+5e4C7AQABJ5mPAMAA/cmAlwEAAYbAASFzwH+7KQDAAPz/PYzAASF4wH+5eyTAASGPAoTAASGDwH+5eyfAAI47Pz4BScABIagcwAEhwBzAASGzhMABIazAf7l7gLsBAAEnguYAwAD9yUgBAAEcwAEhw5SBxAAAAADAAPvzAMAA/PM9jMABIcfAf7l7JMABId4ChMABIdLAf7l7J8AAjjs/SsABIe4BJMABIgQCJ8AAjjyEwAEh/cB/uXtJwAEiShzAASJagcABIk7Af7cYSAEAASsAwAD9KT2JwAEiY8B/txgawAEiccABAzg/TsABIpgAAADAAI49YMAA/bYATsABIq7AASK2AADAAI4+YMAA/bYBHMABIsOBwAEiuMB/txhLAQABJ8AAjj8AwAD8uUnAASLVHMABIuGFwAEi2cB/vGpIAQABKwDAAP3FPY3AASLqwH+8ahzAASL/gcABIvTAf7cYSwEAASfAAI5AAMAA/Lk/ScABIxEhHMABIziMwAEjFsB/vFgcwAEjLYLAASMhwH+3QCABAAGFwAEjLsB/vGoAAEgBAAErAMAA/cU+AUrAASNJAYTAASNQwH+8WD9JwAEjZRzAASN0FsABI22AwAEjacB/tweBusAA/j1IAQABJ4M+AMAA/cU+A07AASOOwAEjlAAAwACLI2DAAP22ARzAASOhgcABI5bAf7cYSwEAASfAAI5BAMAA/LlJwAEjtxzAASPBhsABI7vAf71YSAEAASsAwAD9xT2OwAEjysB/vVgcwAEj3YHAASPSwH+3GEsBAAEnwACOQgDAAPy5P0nAASPzIRzAASQWjMABI/jAf7xYHMABJA2DwAEkA8B/uVQgAQABhsABJA7Af71YAABIAQABKwDAAP3FPgFKwAEkKQGEwAEkMMB/vFg/ScABJE0cwAEkXBbAASRVgMABJFHAf7cHgbrAAP49SAEAASeDPwDAAP3FPgNOwAEkd8ABJH0AAMAAiyNgwAD9tgEcwAEkioHAASR/wH+3GEsBAAEnwACOQwDAAPy5ScABJKEcwAEkq4bAASSlwH++RkgBAAErAMAA/cU9jsABJLTAf75GHMABJMeBwAEkvMB/txhLAQABJ8AAjkQAwAD8uT9JwAEk3iEcwAElAYzAASTjwH+8WBzAAST4g8ABJO7Af7lUIAEAAYbAAST5wH++RgAASAEAASsAwAD9xT4BSsABJRQBhMABJRvAf7xYPz9KwAElNwEnwACOOQAAf5IyAH+SfQB/k30Af5PqAH+XFAB/l5sAf5gyAH+YogB/mT0Af5mvAH+aRgB/mrgAf5tTAH+bxwB/nF4Af5zQAH+dZwB/ndkAf5+OAH+gAQB/oLkAf6ExAH+h/wB/omUAf6flAH+q1gB/q4IAf6zaAH+tUgB/rf8Af69DAH+x9gB/tAAAf7USAH+17wB/ttcAf78TAAAAJALAAQNngvHAASWfwAElpcABN2w3wACORQAAAV3AAMERAWDAAQN3AAFgwAEBqAEEwAEDbILxgWeBdhjAAH7lwAD/UABgwAD70AGTAQXAAQNpAAAAAAQAAAMAAAAAAAAAAABgwAEDZwE/AQkAAMAAwSAAAAAABgbAAQNvgvGBeoGCgeMBAMAAfubAAP9QAAAAAQOBjYHjAAAAAAAAAGDAAPvQAT4CSYGTHIGjFoGXLsAAfuXAAP9QwAEBq0gBAAGTAMAA/PM9F4GpLsAAfuXAAP9QNQAAAAEAYMAA+9ABGoG3wAD/WzUAAAABAGDAAPvQARuBt8AA/1scgcWAAMB/wH5kAQABlADAAPz1gADAf8B+wAEBqz9Kgc0BFoHULsAAfuXAAP9QwAEBqwbAAQN1gvGB6IHsgf0AAsAAdD/AAP9QAAAAAQOB84H9AAAAAQEBgfkAAACXt2DAAPoKAABdwAD8pQJbWwAGwAEDcILxggKCDYI8AQDAAH7nwAD/UAAAAAEDghqCPAAAAAAAAABgwAD9tgFKgh0BJII8AxaCHy7AAH7owAD/UMABAbAnUBaCMS7AAH7mwAD/UMABAa4GwAEDcYLxgkGCTIJcAQLAAH7owAD/UAAAAAEDglyCXAAAAAAAAABgwAD9tgAGwAEDcoLxgmGCbIJ8AQLAAH7pwAD/UAAAAAEDgnyCfAAAAAAAAABgwAD9tgAGwAEDdoLxgoGCiILqAADAAH7qwAD/UAAAAAEDgpSC6gAAAAEBAYKaAAAAl7dgwAD6CgAAYMAA/bYBPgJJgqWAgqnAf8HpSoKuASSCyQIng38WgrguwAB+6cAA/1DAAQGxP0qCzwEWgtYuwAB+6cAA/1DAAQGxAAB/wCEAf8DVAH/BEgB/wWkAf8GWAH/BwwB/wjkAAAAGAsABA3eC8cABJZ/AASWlwAE3bAPAAI5GAAABYMABA2cAAAwEwAEDeoLxwAEmB8ABJhIGwACOR8AA/1AAYMAA+9ABasABJhFgwAD70AkEwAEDe4LxwAEmI8ABJiwGwACOSMAA/1AAYMAA+9ABasABJitgwAD70BUEwAEDfILxwAEmPcABJkkGwACOScAA/1AAYMAA+9ABasABJkhgwAD70CEEwAEDfYLxwAEmWsABJmcGwACOSsAA/1AAYMAA+9ABasABJmZgwAD70FIEwAEDfoLxwAEmv8ABJvcEwACOS8AA/1AAXcAA/KUCYMAA+9BgwAEDdwEewAEm2MAAwI8AAmDAAPvQYMABA3cAAATAAQN/gvHAAScUwAEnGwnAAH+qwAD/UABbAATAAQOAgvHAAScxwAEnPAnAAI1OwAD/UABgwAEDqgAEwAEDgYLxwAEnUsABJ10JwACN7sAA/1AAYMABBNQABMABA4KC8cABJ2XAASdzGMAAY1rAAP9QAGDAAPvQAWrAASduYMAA+9AVBMABA4OC8cABJ4rAASeXGJxLwAD/UABdwAC5kQFbASsEwAEDhILxwAEnoMABJ7EYwACOTMAA/1AAYMAA+goBKgTAAQOFgvHAASe8wAEnyRjAAI3zwAD/UABdwAC4qQFbASsBBcABA5eC8cABJ87AASfOwAEvkAAAAAPAASfdwAEvkAAAAAICAsABJ+MAAATAAH+qWwDAASfxAAAEwACNTmDAAQOqAABgwAEDdwE+Az0cwAEoRhrAASg6wAEDfoC/AgACFsABKEcuwAB+5sAA/1DAAQGuLgDAAPy6PRzAAShrFsABKF8uwACN7sAA/1DAAQOBwACN9AEAASbAASh6ARbAASh6LsAAf6rAAP9QwAEDf13AALlYAWDAAOLzAMABBPc9F8ABKIgunEvAAP9QHMABKKQWwAEomC7AAI3uwAD/UMABA4GB+QMAATTAASirA8ABKKvAAS7uAAAAAQEBwAEorAAAAMAAjcpgwAEBzgAAYMAA/NkBPgs9HMABKMoWwAEovi7AAI1OwAD/UMABA4DAAI5NwAD/UAEAAS4AwAEDwz0cwAEpMBbAASkngsABKR7Af8VIwACNSMABAd6BrQEBWwE0wAEpNQPAASk1wAEpaAAAAAEBAcABKTYAAAC0J1sAAGDAAPzZAT4BScABKUkmwAEpTQGDwAEpTcB/xcFgwAD6Cj0cwAEpVi7AAH68AAAAAMABA4g/AMAAuLw9HMABKfcWwAEp6S6cS8AA/1DAAQODgfsAAAAAwAC5lz0XwAEqBi7AAGNawAD/UGrAASoPYMAA+9AJwAEDgk7AASoiwAEqKwAAwACNh2DAAQLEAR/AASoxwAEC6gEAASbAASo/ARbAASo/LsAAf6rAAP9QwAEDf2DAAPRsAE7AASpTwAEqXAAAg1FgwAECfgEfwAEqYsABApoFAAUWwAEqhILAASp7wH/FSICswAEB2hbAASqkFsABKpyCwAEqk8B/xUieO8ABAdXAAIxPwAEBNoPAASq/wH/GRhbAASrfFsABKtMuwACNTsAA/1DAAQOAwACLacABA7cWwAErDRbAASsBLsAAjU7AAP9QwAEDgMAAi2bAAQO2AE7AASsmwAErLgAAg1BgwAEB/gEfwAErNMABAhAEAASEwAErQcB/xoWCwAErS8B/xUgWwAErVS7AAI1OwAD/UMABA4AuAD0XwAErby7AAI3zwAD/UBzAASuNFsABK4iDwAErf8B/xkaffsABAuaBrQIBWwE0wAErkgPAASuSwAEuMwAAAAEBAcABK5MAAACAtWDAAPRsAABgwAD82QE+Az0XwAErqYTAASugwH/GhcAAjFErwAECkknAASvCHMABK80WwAErxi7AAGNawAD/UMABA4JIAQABasABK9BgwAD70FIAwAD880rAASvbAD9JwAEr6yIiIiIWwAEr+ITAASvvwH/GhZ42wAECbgAWwAEsJIXAASwcwH/HIZ42wAEB+wAWwAEsUYLAASxIwH/FSMAAjUTAAQHUACEWwAEsehbAASxuLsAAje7AAP9QwAEDgcAAi7nAAQURACEWwAEsnhbAASySLsAAjU7AAP9QwAEDgMAARnbAAQO5PgQ9F8ABLLIuwABjWsAA/1BqwAEsu2DAAPvQFcABA4I9F8ABLMwuwACOTMAA/1AqwAEDhD0cwAEs9RbAASzpLsAAjU7AAP9QwAEDgMAAjk7AAP9QAQABLgDAAQPCPRzAAS2HFsABLXkunEvAAP9QwAEDg4IEAAAAAMAAuZg+AT0cwAEuFy7AAH68AAAAAMABA4gBges0wAEuPgPAAS4+wAEuXgAAAAEBAcABLj8AAACAtVsAAGDAAPzZAT4BPRzAAS5MLsAAfrwAAAAAwAEDiMAAuLzAAQOFPRfAAS5wg8ABLmfAf8ZGwACN1hzAAS6MFsABLoWFwAEufcB/xyGWQcABAgtIAQABJ8AAjWQAwAD9xcABAtY9F8ABLqaEwAEuncB/xoXAAI1fwAD/UIXAAS61wH/HIcABAoQ9HMABLtAWwAEuxC7AAI1OwAD/UMABA4DAAI5PwAD/UAEAAYXAAS7fwH/HIQDAAQPAAoOJNMABLvgDwAEu+MABLxMAAAAAAAAAYMAA/NkBPgE9HMABLwMuwAB+vAAAAADAAQOIges0wAEvHgPAAS8ewAEviwAAAAEBAcABLx8AAACBxVsAAGDAAPzZAT4BPRzAAS97LsAAfrwAAAAAwAEDiMABBPbAAQODBAgBwAEDf4AAwH/EcQgBwAEDgIEAwH/EfggAwAEDgR7AASgYwAEE8wAAAAAJAcABJ87AAQNpAAAAAAwGwAEDh4LxwAEvlcABL5rAAS+/AADAAI5QAAAAAQPAAS+iwAEvvwAAAAAAAABcAT4BPRfAAS+rLsAAjkzAAP9QKcABA4QGwAEDjYLxwAEvxMABL83AAS/mAQDAAI5RAAAAAQPAAS/awAEv5gAAAAAAAABgwAD6CgFKwAEv3QEWwAEv3S7AAI5MwAD/UMABA4QGwAEDiILxwAEv68ABL/DAATC1AADAAH68AAAAAQPAAS/3wAEwtQAAAAAAAABcAT4FScABMAAiHMABMAsWwAEwBC7AAGNawAD/UMABA4JIAQABasABMA5gwAD70CEAwAD88wEcwAEwIRbAATAaLsAAY1rAAP9QwAEDgkgBAAFqwAEwJGDAAPvQUgDAAPzzSsABMC8APz0XwAEwOy7AAGNawAD/UGrAATBEYMAA+9AhwAEDgj0cwAEwWhbAATBSLsAAf6rAAP9QwAEDf8AAfrwAAAAAAD0cwAEwdRbAATBpLsAAjU7AAP9QwAEDgMAAjWnAAP9QAQABLgDAAQPBPRzAATCfGsABMJLAAQN+hFkBAAEWwAEwpi7AAH7mwAD/UMABAa4AwAD8wgbAAQOJgvHAATC6wAEwycABMiAAAMAAjFIAAAABA8ABMNXAATIgAAAAAAAAAF3AALipAWDAAPRsAT4EPRfAATDeLsAAY1rAAP9QasABMOdgwAD70FLAAQOCPRzAATEoFsABMRwuwACNTsAA/1DAAQOAwACNacAA/1ABAAEuAMABA8FOwAExXMABMW0AAMAAjlJgwAEEzAEcwAExexbAATFvLsAAje7AAP9QwAEDgcAAjgcAAAAAwAEFC0rAATGSARzAATGnFsABMZkuwACN88AA/1DAAQOFga0BAWDAAPRsATTAATGsA8ABMazAATIbAAAAAQEBwAExrQAAAIC1WwAAYMABA/QBPgI9HMABMcUawAExuMABA36EWQEAARbAATHMLsAAfubAAP9QwAEBrgDAAPzCSsABMd8BH8ABMerAAQQUAgACJsABMfoBFsABMfouwAB/qsAA/1DAAQN/YMAA9GyAwAEyA8B/zPIAAMAAuLwGwAEDjoLxwAEyJcABMjzAATJxAQCeOAAAAAEDwAEyS8ABMnEAAAAAAAAAYMABALgBSsABMk4BHsABMmLAAQPxAQABJsABMmkBFsABMmkuwAB/qsAA/1DAAQN/YMAA9GwABsABA5CC8cABMnbAATJ/wAEynQEAwACOU8AA/1AAAAABA8ABMonAATKdAAAAAAAAAGDAAPoKAUrAATKMARzAATKTFsABMowuwABjWsAA/1DAAQOCSAEAAWrAATKWYMAA+9AJAMAA/PMGwAEDkYLxwAEyocABMqrAATLEAQDAAI5UwAD/UAAAAAEDwAEyssABMsQAAAAAAAAAYMAA+goBSsABMrUBHMABMrwWwAEytS7AAGNawAD/UMABA4JIAQABasABMr9gwAD70BUAwAD88wbAAQOSgvHAATLIwAEy0cABMvEBAMAAjZPAAP9QAAAAAQPAATLcwAEy8QAAAAAAAABgwAD6CgFKwAEy3wEcwAEy5hbAATLfLsAAY1rAAP9QwAEDgkgBAAFqwAEy6WDAAPvQIQDAAPzzBsABA5OC8cABMvXAATL+wAEzIAEAwACOVcAA/1AAAAABA8ABMwrAATMgAAAAAAAAAGDAAPoKAUrAATMNARzAATMUFsABMw0uwABjWsAA/1DAAQOCSAEAAWrAATMXYMAA+9BSAMAA/PMGwAEDlILxwAEzJcABMzDAATNfAQDAAH7owAD/UAAAAAEDwAEzQcABM18AAAAAAAAAYMAA/bYBSsABM0QBJ8AAjlYGwAEDlYLxwAEzY8ABM27AATOYAQDAAH7pwAD/UAAAAAEDwAEzf8ABM5gAAAAAAAAAYMAA/bYBSsABM4IBJ8AAjlcGwAEDi4LxwAEzncABM6HAATdqAADAAHQ/wAD/UAAAAAEDwAEzqMABN2oAAAABAQHAATOuAAAAl7dgwAD6CgAAXcAA/KUCW1sBPgdOwAEzvcABM8IAAIC9YMAA/bYBJAAHFsABM9cWwAEzzxbAATPHLsAAf6rAAP9QwAEDf8AAdMoAllYAJ4LmFsABM+cWwAEz3y7AAH+qwAD/UMABA3+WVwAnwACOWBbAATQUFsABNAYWwAEz/i7AAH+qwAD/UMABA3+eOQCWVgAnguYWwAE0JBbAATQcLsAAf6rAAP9QwAEDf546AE7AATQ6wAE0PAAAg6RdwAD8pQJgwAD9tlsBMsABNE9gwAD9tlsEJ7NVFsABNF0uwAB+58AA/1DAAQGvJ4KQHMABNHkuwAB+6sAA/1ABAAGAwAE0hsB/0JYAwAEBtSeAvYHAATSawH/QsifAAI5ZgcABNLPAf9CyScABNMSAwAE0yMB/0JY+AUrAATTVAYLAATTcwH/RTT89HMABNOqCwAE06cB/0U2AvwIAAifAAHwnHMABNQMWwAE09y7AAI1OwAD/UMABA4DAAHQ/wAD/UAEAASkAwAEDxADAAPy6Sz4BPRzAATUjgsABNSLAf9FNgL8CAAInwAB7whzAATU4FsABNTAuwAB/qsAA/1DAAQN/wAB0P8AA/1ABAAEpAAAAwAD8ugABwAE1TVsBwAE1VAAAAYC1WwAAPgE9HMABNWCCwAE1X8B/0U2AvwIAAifAAHvCMsABNW1gwAD9tmDAAP22BCezVRbAATV9LsAAfufAAP9QwAEBryeCkCfAAI5aJ4C9J8AAjlsnwACOWSfAAI5bAMAA/LpBR8ABNfoWwAE2Ai7AAGNawAD/UMABA4IFAcABNhdqwAE2F2DAAPvQCQA+Aj0cwAE2KYLAATYowH/RTYC/AgACJ4JOJ8AAjlwAwAD8ukLAATZHAAHAATZZasABNllgwAD70BUAPgI9HMABNmmCwAE2aMB/0U2AvwIAAieCTifAAI5dAMAA/LpCwAE2hQABwAE2l2rAATaXYMAA+9AhAD4CPRzAATaqgsABNqnAf9FNgL8CAAIngk4nwACOXgDAAPy6QsABNskAAcABNttqwAE222DAAPvQUgA+Aj0cwAE274LAATbuwH/RTYC/AgACJ4JOJ8AAjl8AwAD8ukLAATcPAAABPgI9HMABNy6CwAE3LcB/0U2AvwIAAieCTifAAFtMAMAA/LpCwAE3TQBKwAE3XgGCwAE3ZcB/0U0AAH/KtwB/yvwAf8tHAH/MbwB/zeEAf85CAH/OqgB/zxIAf896AH/P4gB/0CQAf9BmAH/UHQAAAAwCwAEDmILxwAE3nsABN6TAAVQsN8AAjmAAAAFdwAC5WAFgwAEAOAABYMABAagBBMABA5+C8YFngXYYwAB+5cAA/1AAYMAA+9ABkwIFwAEDmgAAAAAEAAADAAAAAAAAAAAAYMABA5gBPwEJAADAALmOAAAAAAXAAQOcAAAAAASGVcAAt4gAAwAAAAAAAAAAAGDAAQOYAT8BCQAAwAC5kAAAAAAGBsABA6KC8YF6gYKB4wEAwAB+5sAA/1AAAAABA4GNgeMAAAAAAAAAYMAA+9ABPgJJgZMcgaMWgZcuwAB+5cAA/1DAAQGrSAEAAZMAwAD88z0XgakuwAB+5cAA/1A1AAAAAQBgwAD70AEagbfAAP9bNQAAAAEAYMAA+9ABG4G3wAD/WxyBxYAAwH/VVmQBAAGUAMAA/PWAAMB/1VbAAQGrP0qBzQEWgdQuwAB+5cAA/1DAAQGrBsABA6iC8YHogeyB/QACwAB0P8AA/1AAAAABA4Hzgf0AAAABAQGB+QAAAJe3YMAA+goAAF3AAPylAltbAAbAAQOjgvGCAoINgjwBAMAAfufAAP9QAAAAAQOCGoI8AAAAAAAAAGDAAP22AUqCHQEkgjwDFoIfLsAAfujAAP9QwAEBsCdQFoIxLsAAfubAAP9QwAEBrgbAAQOkgvGCQYJMglwBAsAAfujAAP9QAAAAAQOCXIJcAAAAAAAAAGDAAP22AAbAAQOlgvGCYYJsgnwBAsAAfunAAP9QAAAAAQOCfIJ8AAAAAAAAAGDAAP22AAbAAQOpgvGCgYKIguoAAMAAfurAAP9QAAAAAQOClILqAAAAAQEBgpoAAACXt2DAAPoKAABgwAD9tgE+AkmCpYCCqcB/1sFKgq4BJILJAieDfxaCuC7AAH7pwAD/UMABAbE/SoLPARaC1i7AAH7pwAD/UMABAbEAAH/U+QB/1a0Af9XqAH/WQQB/1m4Af9abAH/XEQAAAAYCwAEDqoLxwAE3nsABN6TAAVQsA8AAjmEAAAFgwAEDmAABYMAA/2gNBMABA62C8cABOEbAAThsBMAAjmLAAP9QAF3AAPylAmDAAPvQYMABA6oBHsABOFXAAPysAAJgwAD70GDAAQOqAAAEwAEDtoLxwAE4eMABOIQYwACLZgBgwAD9tgErBMABA7eC8cABOJrAATjQCcAAi2kAYMAA/4IBHsABOLPAAQO+AAAAAATAAQO4gvHAATjZwAE47RjAAItnAGDAAPoKASoEwAEDroLxwAE4+8ABOQcYwACOKcAA/1AAYMAA+qYBKwTAAQOvgvHAATkRwAE5GxjAAI3wwAD/UABgwAC8iQErBMABA7CC8cABUe3AAVIEGMAAjVLAAP9QAGDAAQVFASsEwAEDuYLxwAFSQcABUk8YwABGdgBgwAD6CgEqBMABA7GC8cABUunAAVL2CcAAjmPAAP9QAFsABMABA7KC8cABUwXAAVMRCcAAjmTAAP9QAGDAAPoKAATAAQOzgvHAAVNhwAFTnQnAAI5lwAD/UABdwADA6gFgwAEDdwEfwAFTgMAAwQIAAWDAAQN3AAAEwAEDtILxwAFTw8ABU/0JwACOZsAA/1AAXcAAwOoBYMABA3cBH8ABU+DAAMECAAFgwAEDdwAABMABA7WC8cABVB/AAVQqGMAAbv7AAP9QAF3AALngAWDAAQA4ASsCBcABA9WC8cABPEXAATxFwAE9KQCAtcAA/1AAA8ABPFLAAT0pAAAAAgICwAE8WAAABMAAjmNbAMABPGwAAATAAI5kYMAA+goAAGDAAQOqAT4DPRfAATyALsAAbv7AAP9QHsABPJrAALnsAgFgwAEAOAACmacpwABuzBbAATzOLoKIwAEDxsABA7U9F8ABPNouwACLaGrAATzuYMAA+qbAAeK1wAED0T0cwAE9EhrAAT0KwAEDrYC/AgACFsABPRMuwAB+5sAA/1DAAQGuLgDAAPy6AwgBwAEDsYAAwH/ZcAgBwAEDsoEAwH/ZfQkBwAE8RcABA5oAAAAABcABA9aC8cABPS7AAT0uwAE+HQDAAItrAAPAAT1CwAE+HQAAAAEBAcABPUgAAATAAI5jWwAAYMABA6oBPgM9F8ABPXQuwABu/sAA/1AewAE9jsAAuewCAWDAAQA4AAKZpynAAG7MFsABPcIugojAAQPGwAEDtT0XwAE9zi7AAItoasABPeJgwAD6psAB4rXAAQPRPRzAAT4GGsABPf7AAQOtgL8CAAIWwAE+By7AAH7mwAD/UMABAa4uAMAA/LoDCAHAAQOxgADAf9pnCADAAQOyKgkBwAE9LsABA5oAAAAAFAbAAQO7gvHAATkgwAE5OsABOkkAAZ5wAAAAAQPAATk+wAE6SQAAAAUFBcABOUYAAADAAHTKWwDAATlTAAAAlldgwAD70ADAATldAAAAwAB/Q2DAAPvQAMABOWsAAADAAH9EYMAA+goAwAE5eAAAAMAAf0VgwAD6CgAAXcAAuKkBYMAA/2gBPgFKwAE5hgEcwAE59R7AATmawADz8QUAAoDAATmfwH/bS4HAATmowH/bWAPAAH9DgsABOcPAf9tnwAB/RIPAATnUwH/beMAAf0WEwAE55MB/24mBrQEBYMAA/2gBNMABOgYDwAE6BsABOkQAAAABAQHAAToHAAAAwAB7wmDAAPPvAABgwAEDqgE+AUrAAToXAR/AAToiwAED1QIAAoXAATowwH/cGCkAAMAAuLwGwAEDvILxwAE6TsABOmjAATxAAAHAAItqAAAAAQPAATpywAE8QAAAAAcHB8ABOnoAAADAAHTKWwDAATqNAAAAlldgwAD70ADAATqpAAAAglNgwADziwDAATq8AAAAwAB/Q2DAAPvQAMABOtAAAADAAH9EYMAA+goAwAE64wAAAMAAf9hgwAD6CgDAATsIAAAAwAB/RWDAAPoKAABdwAC4qQFgwAD/aAE+AUrAATsWARzAATvsHsABOzDAAPKdBwADgMABOzXAf9yAgcABOz7Af9yNgsABO0TAf9ycBMAAf0ODwAE7YsB/3KvAAH9EhMABO3/Af9y8wAB/2IXAATutwH/czcAAf0WGwAE728B/3N6BrQEBYMAA/2gBNMABO/0DwAE7/cABPDsAAAABAQHAATv+AAAAwAB7wmDAAPKYAABgwAEDqgE+AUrAATwOAR/AATwZwAED1QIAAofAATwnwH/dgykAAMAAuLwGwAEDvoLxwAE+IsABPjXAAT+6AAHAAI5nwAD/UAAAAAEDwAE+UMABP7oAAAAAAAAAYMAA/4IBPgZOwAE+XcABPnQAAMAAi2lgwAEBKgEfwAE+esABAWwBAAEnwACNAgA9F8ABPqqAwAE+k8B/3fmePBrAAT7EwAEAGMABAWo9HMABPuWAwAE+zsB/3fmXHgIAAifAAI5oJ8AAjmkAwAEBUD0cwAE/JoDAAT8PwH/d+ZceAgACJ8AAjmonwACOawDAAQFQPRzAAT9rgMABP1TAf935lx4CAAInwACObCfAAI5tAMABAVBKwAE/mQGAwAE/oMB/3fkGwAEDyYLxwAE/v8ABP8zAAT/nAQDAAItoAAAAAQPAAT/YwAE/5wAAAAAAAABgwAD6pgFKwAE/2wEWwAE/2y7AAI4pwAD/UMABA64GwAED0YLxwAE/7MABP/XAAUGyAgDAAItoAAAAAQPAAUAAwAFBsgAAAAEBAcABQAoAAACBs2DAAPqmAABcAT4DScABQBohHMABQCkWwAFAHi7AAI3wwAD/UMABA69IAQABKwDAAP0pPgI9HMABQEUWwAFAOi7AAI3wwAD/UMABA6+cTQAAAADAALyPPRfAAUBVLsAAjfDAAP9QK8ABA68/PRfAAUByLsAAjinAAP9QgMABQIHAf98swAEDrknAAUCPIRzAAUCgFsABQJMuwACOKcAA/1DAAQOuSAEAASsAwAD6wz4BPRfAAUCxLsAAjfDAAP9QHsABQMLAALyMAgACFsABQNEuwACOKcAA/1DAAQOuNMABQN8DwAFA38ABQacAAAABAQHAAUDgAAAAgLVgwAC8iQAAYMAA/NkBPgFGwAFA7cABQRnAAUD2AAAAwACLb2DAAQN3ABzAAUEPFsABQP4uwACOZsAA/1DAAQO0gK0AAAAAwAD8SD4BScABQSUWwAFBLoLAAUEpwH/gR8AAjlHAAQONPgE9HMABQU+CwAFBSsB/4EfAAH68AAAAAMABA4g+AT0cwAFBfoLAAUF5wH/gR8AAjlAAAAAAwAEDhwDAAQOvPwbAAQPFgvHAAUG3wAFB18ABRM4AAIH5AAAAAQPAAUHdwAFEzgAAAAQBAcABQeMAAADAAG7hYQFgwAEAOFwAA8ABQg4AAACB62DAAPvGAWoAYMAA/Nl3wAFCHAAAAIOJYQBcAWoAYMAA/Nl3wAFCKwAAAMAAbq5gwAD6CgFqAGDAAPzZd13AALmRAWDAAQA4AT4CPRzAAUJPFsABQkEuwACOY8AA/1DAAQOxgfkDAAE0wAFCVgPAAUJWwAFDOQAAAAEBAcABQl4AAADAAHvCYMAA9GwAAGDAAPzZAT4DPRzAAUJ1hMABQm7Af+GZwAB/fwIAAmrAAUKMYMAA9AXAAbSxKQDAAPR0TsABQtzAAULnAADAAINjYMABA3cBH8ABQu3AAQOXAgAChMABQv3Af+GZLgA9HMABQyMWwAFDEi7AAI5mwAD/UMABA7RWAQABhcABQyfAf+HeAMAAwPICges0wAFDRAPAAUNEwAFEOAAAAAICAsABQ0UAAACBxVsAwAFDTAAAAIY/WwAAYMAA/NkBPgFJwAFD1iElwAFD4ITAAUPawH/iSmDAAPOFPgE9HMABRA4WwAFEAi7AAG7+wAD/UMABA7WcDgIAAoTAAUQXwH/iSibAAUQeAYXAAUQewH/iVWDAAP2KAMAAufU/g4kWwAFEThbAAURCLsAAbv7AAP9QwAEDtYKIwAC59gBKwAFEWgEcwAFEdBbAAURtFsABRGEuwABu/sAA/1DAAQO1gfXAALnigfkEAAGAwAFEe8B/4QADgeuBwAFElMB/4RWDiYLAAUSlwH/hLMAAbq6DwAFEvMB/4UHAALloBsABA8aC8cABRNPAAUTawAFGzAAAgogAAAABA8ABRN/AAUbMAAAAAQAAAcABROYAAACeNGDAAPoKAWrAAUTtYMAA+goAXcAAuKkBWwE+CD0XwAFE+y7AAEZ2KcABA7lOwAFFFQAAAIF2XcAAuKkBWwBJwAFFISIhHMABRTMWwAFFJS7AAI5jwAD/UMABA7FIAQABKwDAAP0pABbAAUU+LsAAjmTAAP9QwAEDsj4BPYnAAUVUwH/joibAAUVUARzAAUVrFsABRV0uwACOY8AA/1DAAQOxgogAAAAAAF3AALipAVs+AT2JwAFFh8B/46IewAFFlMAAuLIAAVsAAD0XwAFFri7AAItoK8ABA9FJwAFFxoDAAUXKwH/jbT4CRsABRdnAAUYEwAFF4gAAAID1YMABA3cAHMABRfoWwAFF5y7AAI5lwAD/UMABA7OArQAAAADAAPxIPgE9HMABRhCCwAFGDsB/5GjAAH68AAAAAMABA4hAFsABRkMWwAFGMC7AAI5lwAD/UMABA7OBVcAAwQDAAUYwwAFGSgA/RsABRlfAAUaAwAFGYAAAAID1YMABA3cAHMABRnYWwAFGZS7AAI5mwAD/UMABA7SArQAAAADAAPxIPgE9HMABRoqCwAFGiMB/5ObAAH68AAAAAMABA4g9HMABRp8uwACBbsAA/1AAAAAAwAEDv0rAAUa7AYHAAUbCwH/jogbAAQO/gvHAAUbRwAFG1sABR+4AAMAAgW7AAP9QAAAAAQPAAUbqwAFH7gAAAAAAAABcAT4BScABRvMiIiIWwAFG9y7AAEZ2wAEDuQAWwAFHGhbAAUcJLsAAjmbAAP9QwAEDtIFVwADBAAAWwAFHQBbAAUctLsAAjmXAAP9QwAEDs4FVwADBAAAhHMABR2sWwAFHUy7AAI1SwAD/UMABA7BIAQABKwDAAP0pPgM9HMABR5QWwAFHfC7AAI1SwAD/UMABA7CCiAAAAADAAQVRPRfAAUejLsAAjVLAAP9QK8ABA7A9HMABR9IawAFHycABA62EWQEAARbAAUfZLsAAfubAAP9QwAEBrgDAAPzCPwbAAQPKgvHAAUfzwAFH+8ABSHMBAJZXAAAAAQPAAUgAwAFIcwAAAAAAAABgwAD70AE+AknAAUgGFsABSAouwABGdsABA7k9MMABSBIfwAFIHMABANMBAAEnwACObgA/SsABSFYBJsABSFYBFsABSGsWwAFIXS7AAI5jwAD/UMABA7GWVwBgwAD70AbAAQPLgvHAAUh4wAFIjMABSQoBAMAAdMoAAAABA8ABSJTAAUkKAAAAAAAAAGDAAPPCAT4CScABSJoWwAFIni7AAEZ2wAEDuT0wwAFIph/AAUiwwAEA0wEAASfAAI5uAD9KwAFI6gEmwAFI6gEWwAFI/xbAAUjxLsAAjmPAAP9QwAEDscAAdMoAYMAA88IGwAED0oLxwAFJD8ABSRPAAUlhAgDAAItsAAAAAQPAAUkhwAFJYQAAAAEBAcABSSYAAADAAG82YMAA+9AAAFwBPgE9F8ABSUUWwAFJNS7AAI1WwAD/UMABA83AAItsgMABSVbAf+erwAEFWgbAAQPAgvHAAUlmwAFJa8ABSgMAAMAAjk/AAP9QAAAAAQPAAUl5wAFKAwAAAAEBAcABSYcAAACDUGDAAQH+AABcAT4BScABSZYhFsABSZsuwABGdsABA7k+AT0cwAFJtxbAAUmrLsAAbv7AAP9QwAEDtVYBAAGAwAFJu8B/6BoAwAC59D4BPRzAAUnwFsABSeCAwAFJ2MB/6BrAAI1PwAD/UMABAgPAAH68AAAAAMABA4gGwAEDwYLxwAFKCMABSg3AAUqxAADAAI1pwAD/UAAAAAEDwAFKHsABSrEAAAABAQHAAUovAAAAwACDY2DAAQN3AABcAT4CPRzAAUqJgMABSn7Af+jMwABxfwAAAADAAMEcPRzAAUqXLsAAgW7AAP9QAAAAAMABA78GwAEDwoLxwAFKtsABSrvAAUs2AADAAI5OwAD/UAAAAAEDwAFKxMABSzYAAAABAQHAAUrVAAAAwACDY2DAAQN3AABcAT4CPRzAAUr6FsABSucuwACOZcAA/1DAAQOzhFkBAAGAwAFLAcB/6UQAwADA9D0cwAFLIxbAAUsSLsAAjmbAAP9QwAEDtFYBAAGAwAFLJ8B/6UQAwADA8gbAAQPDgvHAAUs7wAFLQMABS70AAMAAjk3AAP9QAAAAAQPAAUtLwAFLvQAAAAEBAcABS1wAAADAAINjYMABA3cAAFwBPgI9HMABS38WwAFLbi7AAI5mwAD/UMABA7SEWQEAAYDAAUuGwH/p3wDAAMD0PRzAAUuqFsABS5cuwACOZcAA/1DAAQOzVgEAAYDAAUuuwH/p3wDAAMDyBsABA82C8cABS8LAAUvawAFMkAEAwACNVsAA/1AAAAABA8ABS+rAAUyQAAAAAAAAAGDAAQVFAT4CScABTAIcwAFMHhbAAUwGLsAAjVLAAP9QwAEDsEgBAAErAMAA/Sk+AT0XwAFMLy7AAI1SwAD/UB/AAUxNwAEFXAAAAADAAQOwP0rAAUxuARbAAUx1LsAAjVLAAP9QwAEDsAbAAQPHgvHAAUyVwAFMqcABTowAAMAAi20AAAABA8ABTLjAAU6MAAAAAAAAAGDAAP96AT4FTsABTNXAAUzcAACBdmDAAP96AR/AAUziwAD/gQAAAAA9F8ABTQSAwAFM/cB/6xqkUxzAAU0mFsABTR8WwAFNDC7AAI5lwAD/UMABA7NhwADA/GQBAAEWwAFNORbAAU0oLsAAjmbAAP9QwAEDtGHAAMD8AMAA/PXAAP98PRzAAU1YFsABTUUuwACOZcAA/1DAAQOzg/gBAAE0wAFNYAPAAU1gwAFOBQAAAAEBAcABTXEAAADAAI5vYMABA3cAAGDAAPzZAT4BScABTX8WwAFNiIHAAU2DwH/rxcAAjlPAAP9QwAEDkD4BPTUAAAABAGDAAP96AYDAAU2dwH/rGhfAAU2kgsABTaTAf+wCwABQIxzAAU2qFsABTaSCwAFNpMB/7ALAAFAjwAD/fWQBAAGUAMAA/PXAAP99PgJAFsABTdGBwAFNzMB/68XAAI2TwAD/UMABA5LAAU3MwAFN2wA9NQAAAAEAYMAA/3oBgMABTebAf+saF8ABTe2CwAFN7cB/7Hm0JxzAAU30FsABTe2CwAFN7cB/7Hm0J8AA/39kAQABlADAAPz1wAD/fwDAAMD2PRzAAU4dFsABTgwuwACOZsAA/1DAAQO0g/gBAAE0wAFOJQPAAU4lwAFOdAAAAAEBAcABTjYAAADAAI5vYMABA3cAAGDAAPzZAT4CPTUAAAABAGDAAP96AYDAAU5EwH/rGhfAAU5LgsABTkvAf+0WwACLbxzAAU5PFsABTkuCwAFOS8B/7RbAAItvwAD/fmQBAAGUAMAA/PXAAP9+QBbAAU5lgcABTmDAf+z6wACOVMAA/1DAAQORwAFOYMABTmwAAMAAwPZKwAFOewGAwAFOgsB/6xoGwAEDzoLxwAFOkcABTpzAAU7BAQDAAH7owAD/UAAAAAEDwAFOrcABTsEAAAAAAAAAYMAA/bYBSsABTrABJ8AAjnAGwAEDz4LxwAFOxcABTtDAAU7wAQDAAH7pwAD/UAAAAAEDwAFO4cABTvAAAAAAAAAAYMAA/bYBSsABTuQBJ8AAi2UGwAEDxILxwAFO9cABTwrAAVHUAADAAHQ/wAD/UAAAAAEDwAFPEcABUdQAAAABAQHAAU8XAAAAl7dgwAD6CgAAXcAA/KUCYMAA/bZbAT4JTsABTybAAU8oAACDpF3AAPylAmDAAP22WwEywAFPO2DAAP22WwQns1UWwAFPSS7AAH7nwAD/UMABAa8ngpAcwAFPZS7AAH7qwAD/UAEAAYDAAU9ywH/uUQDAAQG1J4C9JMABT50DFsABT5EWwAFPiS7AAHTKwAEDy5ZWwADzzieC5hbAAU+YLpZXwAEDyifAAI5ZJMABT8kDFsABT70WwAFPtS7AAHTKwAEDy5ZWwADzzieC5hbAAU/ELpZXwAEDyknAAU/WgMABT9rAf+5RPgFKwAFP5wGBwAFP7sB/7nE/Sz4BPRzAAVAIgcABUAfAf+5xgL8CAAInwAB7whzAAVAjFsABUBUuwACOY8AA/1DAAQOxwAB0P8AA/1ABAAEpAAAAwAD8ugABwAFQOFsBwAFQPwAAAYC1WwAAPgE9HMABUEuBwAFQSsB/7nGAvwIAAifAAHvCMsABUFhgwAD9tmDAAP22BCezVRbAAVBoLsAAfufAAP9QwAEBryeCkCfAAI5aJ4C9J8AAjlsnwACOWSfAAI5bAMAA/Lo9HMABUOaBwAFQ5cB/7nGAvwIAAieWVxbAAVDxLpZXwAEDygDAAPy6PRzAAVD8gcABUPvAf+5xgL8CAAInwAB0yhbAAVESFsABUQouwAB0ysABA8uWVsAA884AwAD8uj0cwAFRHYHAAVEcwH/ucYC/AgACJ8AAUCMcwAFRWRzAAVE9FsABUSouwACOZcAA/1DAAQOzgKsBAV3AAPylAltbATTAAVFBA8ABUUHAAVFXAAAAAQEBwAFRQgAAAID1YMABA3cAAF3AAPylAltbAUrAAVFIARzAAVFKgsABUUjAf/C/wAB0P8AA/1ABAAEpAMABA4sAwAD8PYCtAAAAAMAA/EgAwAD8uj0cwAFRaIHAAVFnwH/ucYC/AgACJ8AAi28cwAFRoBzAAVGEFsABUXMuwACOZsAA/1DAAQO0gKsBAV3AAPylAltbATTAAVGIA8ABUYjAAVGeAAAAAQEBwAFRiQAAAID1YMABA3cAAF3AAPylAltbAUrAAVGPARzAAVGRgsABUY/Af/FnwAB0P8AA/1ABAAEpAMABA4sAwAD8PYCtAAAAAMAA/EgAwAD8uj0cwAFRr4HAAVGuwH/ucYC/AgACJ8AARnYWwAFRvC7AAEZ2wAEDuQDAAPy6SsABUcgBgcABUc/Af+5xAAB/2yEAf9xUAH/dvwB/3rUAf98AAH/g1gB/40IAf+VZAH/mZwB/5vEAf+d/AH/n6gB/6JwAf+kUAH/prwB/6koAf+rkAH/tnQB/7d8Af+4hAH/x9AAAABQCwAED14LxwAFUL8ABVDXAAV3KA8AAjnEAAAFgwAD9HAAAAwTAAQPZgvHAAVRhwAFUeAbAAI5yAGDAAP22AWrAAVRwYMAA/bbAAeLEBMABA9qC8cABVJDAAVSoBsAAjnMAYMAA/bYBasABVKBgwAD9tsAB4skEwAED24LxwAFdwcABXcgJwACONABdwAD8dAFgwAED3wACBcABA92C8cABVK3AAVStwAFdWAAAAAPAAVTAwAFdWAAAAAEBAcABVMgAAACVN2DAAP22AABgwAED1wE+A0nAAVT8HMABVQ6AwAFVAMB/8wlIAQABKwDAAP3FPgE9MMABVR8fwAFVKcABANMBAAEkwAFVYwInwACOdIDAAVVVwH/zCQA/TsABVX3AAVWCAACDW13AAPx0AWDAAP22ARzAAVWSgMABVYTAf/MJgKYBAAEnlp4AwAD92T0cwAFVp4HAAVWiwH/zaYP4AQABNMABVa8DwAFVr8ABXVMAAAABAQHAAVW3AAAAwACLI2DAAP22AABgwAD82QE+Aj2KwAFVxsB/88QcwAFV1ILAAVXOwH/zxIHhAAAAAMAA/c1JwAFV4iEWwAFV7YLAAVXnwH/zxIFVwAD9vD4BScABVgAcwAFWCoLAAVYEwH/zxIHWAQABasABVhVgwAD9tsAB4sQAwAD9yD4NTsABVjcAAADAAIx8YMAA/bYATsABVlIAAADAAH/9YMAA/bYAPYrAAVaNwH/zxBzAAVa6HMABVpuCwAFWlcB/88SAvgEAARbAAVayasABVqVgwAD9tsAB4sRhwAD9ugDAAP3MgeEAAAAAwAD9zU7AAVb8wAFW/wAAwABp92DAAPvQARzAAVcHgsABVwHAf/PEgLsBAAEng38AwAD9yUnAAVcfIRzAAVcmhcABVyPAf/S3SAEAARzAAVcplIHEAAAAAMAA+/MAwAD88z4GTsABV0LAAVdLAADAAI51YMAA/bYBHMABV2QcwAFXU4LAAVdNwH/zxIC+AgACk4XAAVdgwH/0twDAAP3MgeEAAAAAwAD9zT2KwAFXeMB/88QcwAFXmBzAAVeGgsABV4DAf/PEgL4BAAEcwAFXk4XAAVeQwH/0t2QBAAGUAMAA/PUAwAD9zIHhAAAAAMAA/c1OwAFXsMABV7YAAKFvYMAA+9ABHMABV8GGwAFXuMB/9RaAuwEAASeC5gDAAP3JScABV9siIhzAAVflh8ABV9/Af/WlSAEAARzAAVfolIHEAAAAAMAA+/MAwAD88wEcwAFX9IfAAVfuwH/1pUgBAAGTAMAA/PMBHMABWAKHwAFX/MB/9aVIAQABHMABWBIWwAFYC4LAAVgFwH/zxGHAAP26gY0BAAGUAMAA/PYAwAD88z4BPTDAAVgnH8ABWDHAAQDTAQABJMABWH4CJ8AAjnSAwAFYcMB/8wkAPz2LwAFYm8B/9EocwAFYwxzAAVivhsABWKbAf/UWgL4CAAKTh8ABWLzAf/WlAMAA/cyB4QAAAADAAP3NPYzAAVjXwH/0XBzAAVkAHMABWOuGwAFY4sB/9RaAvgEAARzAAVj7h8ABWPXAf/WlZAEAAZQAwAD89QDAAP3MgeEAAAAAwAD9zT9OwAFZTcABWVMAAKFvYMAA+9ABHMABWVuCwAFZVcB/88SWWgEAASeC5gDAAP3KScABWXciIhzAAVmBhsABWXvAf/cESAEAARzAAVmElIHEAAAAAMAA+/MAwAD88wEcwAFZkIbAAVmKwH/3BEgBAAGTAMAA/PMBHMABWZ6GwAFZmMB/9wRIAQABHMABWa4WwAFZp4LAAVmhwH/zxGHAAP26gY0BAAGUAMAA/PYAwAD88z4BPTDAAVnBH8ABWcvAAQDTAQABJMABWhYCJ8AAjnSAwAFaCMB/8wkAP07AAVo2wAFaOwAAllZgwAD9tgEcwAFaVxzAAVpDgsABWj3Af/PEgL4CAAKThsABWlDAf/cEAMAA/cyB4QAAAADAAP3NScABWmkiHMABWnKHwAFabcB/996B1gEAASeZjgDAAP3IABzAAVqKh8ABWoXAf/feTwEAASeZjwDAAP3HPgE9j8ABWqfAf/feHMABWrOHwAFarsB/996AvgIAApQcwAFazBbAAVrFh8ABWsDAf/feYcAA/bqBjQEAAZQAwAD89gDAAP3MP07AAVrvwAFa+gAAwACKcWDAAP22ARzAAVsXHMABWwKCwAFa/MB/88SAvgEAARzAAVsShsABWwzAf/cEZAEAAZQAwAD89QDAAP3MgeEAAAAAwAD9zU7AAVstAAAAlldgwAD70ABLPgE9FcABW0/Af/j7CR7AAVtawAD7/wEAARTAAVtgwH/4pwgAAAABwAFbeWDAAPujAcABW5MAAAGDTWDAAPujAAA+AT0wwAFbpB/AAVuuwAEA0wEAASQABifAAI50gMABW+vAf/MJJ4GLJ8AAjnYUwAFcHMB/+KcIACeDQgA9HMABXEkWwAFcQS7AAI40wAED21YBAAEfwAFcUcABA+kEAASHwAFcWMB/994UwAFcXsB/+PsJAIPAAVxkwH/0SoTAAVxuwH/0XAAAwAD8hUnAAVyJHMABXJocwAFck4LAAVyNwH/zxIHhAAAAAMAA/c1IAQABasABXJ1gwAD9tsAB4skAwAD9xT4BPRzAAVzAFsABXLguwACONMABA9tWAQABH8ABXMjAAQPqAAAAAADAAPyFPgE9MMABXPUfwAFc/8ABANMBAAEkwAFdOQInwACOdIDAAV0rwH/zCQA/AMAA/EICCADAAQPbHsABVOfAAPduAQFgwAED3wGTAAkBwAFUrcAA/TIAAAAABcABA96C8cABXV3AAV1jwAFdqQG6SAADwAFdfcABXakAAAAAAAAAYMABA9cBPwIIAMABA9tqwAFdjF3AAPx0AWDAAQPfwAHilQkBwAFdY8AA/TIAAAAAAAAAf/rsAAAAAALAAQPfgvHAAV3NwAFd08ABX2gDwACIMgAAAWDAAP0cAAAFBMABA+GC8cABXevAAV3vCZZWAGDAAP22AATAAQPigvHAAV39wAFeAQmWVwBgwAD70AAEwAED44LxwAFeEsABXhoJwACMfABgwAD9tgAEwAED5ILxwAFeK8ABXjMJwAB//QBgwAD9tgAEwAED5YLxwAFeQsABXkoJwACNzgBgwAD6CgACBcABA+mC8cABXk/AAV5VwAFeqAEAAAPAAV5bwAFeqAAAAAQEBMABXmEAAASWVmDAAP22AMABXmwAAASWV2DAAPvQAMABXncAAATAAIx8YMAA/bYAwAFehgAABMAAf/1gwAD9tgAAYMABA98BPwYIAcABA+GAAMB/+8EIAcABA+KBAMB/+9AIAcABA+OCAMB/+98IAcABA+SDAMB/+/AIAMABA+UqCQHAAV5VwAD9MgAAAAAFwAED6oLxwAFerMABXrLAAV81AbpIAAPAAV6/wAFfNQAAAAAAAABgwAED3wE/BggAwAED4SsIAMABA+IrCADAAQPjKwgAwAED5CsIAMABA+UpCQHAAV6ywAD9MgAAAAABBsABA+eC8cABXzrAAV9DwAFfZgEAwACN+gAAAAEDwAFfU8ABX2YAAAAAAAAAYMAA+goBSsABX1YBIRzAAV9fFsABX1YuwACMfMABA+NIAQABKwDAAP3FAAB//LAAf/0HAAAAAQLAAQPrgvHAAV9rwAFfccABYT8DwACOdwAAAWDAAP0cAAFgwAEAuAMEwAED7YLxwAFft8ABX8QYnjkAYMAA88IBKwTAAQPugvHAAV/MwAFf1hieOgBgwAD70AErBMABA++C8cABX97AAV/nGMAAfxsAYMAA+9ABKwEFwAED8wAAAAAEAAADAAAAAAAAAAAAYMABA+sBPwEJAQDAAP0yAAAAAAEGwAED8YLxwAFf7MABYAfAAWE9AAHAAHt2AAAAAQPAAWANwAFhPQAAAAEBAcABYBUAAADAAHvCYMAA9GwAAGDAAQPrAT4DScABYCMcwAFgLoDAAWAnwH/940gBAAErAMAA/SlKwAFgNwErP0s+Ak7AAWBowAFgbQAAgVRgwAED6wEfwAFgc8ABA/MAAAAASsABYJABNcABYJcAAAEAYMABA+sBgcABYJfAf/4mNQAAAAEAWwEXwAFgpoLAAWCkwH/+TJ45FsABYL2AwAFgtsB//eOeOcAA9HzAAQPtNQAAAAEAWwEXwAFg1YLAAWDTwH/+TJ46FsABYOmAwAFg4sB//eOeOsAA9HrAAQPuNQAAAAEAWwEXwAFg/oLAAWD8wH/+TMAAfxsWwAFhEYDAAWEKwH/945ZXwAD0ecABA++CAMB//kwAAcABYR1bAcABYSQAAAGDTVsAAD4ASsABYS4BKwAAf/23AH//GAAAAAECwAED9ILxwAFhQsABYUjAAWhYA8AAjngAAAFdwAC5WAFgwADi8wABYMAA9GwCBMABA/eC8cABYaDAAWGpCcAAjUrAAP9QAF3AALlYAWDAAOLzAATAAQP4gvHAAWG6wAFhwQnAAH+qwAD/UABgwAD0bAABBcABBBSC8cABYcbAAWHGwAFh8wAAAAPAAWHVwAFh8wAAAAICAsABYdsAAATAAH+qYMAA9GwAwAFh6QAABMAAjUpdwAC5WAFgwADi8wAAYMABA/QBPwMIAcABA/iAAMB//70IAcABA/eBAMB//84JAcABYcbAALmOAAAAABYGwAED+oLxwAFh+MABYhbAAWLpAACB+QAAAAEDwAFiHMABYukAAAAEAQHAAWIiAAAAwABu4WEBYMAA4vNcAAPAAWJLAAAAgetgwAD7xgFqAGDAAPzZd8ABYlkAAACDiWEAXAFqAGDAAPzZd8ABYmgAAADAAG6uYMAA+goBagBgwAD82XddwAC5kQFgwADi8wE+AUrAAWJ+ARzAAWKPFsABYoUuwACNSsAA/1DAAQP3gfkEAAGAwAFilsCAAD8DgeuBwAFir8CAAFSDiYLAAWLAwIAAa8AAbq6DwAFi18CAAIDAALloBsABBAuC8cABYu7AAWL7wAFjFwEAwABROwAAAAEDwAFjBMABYxcAAAAAAAAAYMAAx2IBSsABYwcBFsABYw8WwAFjBy7AAH+qwAD/UMABA/jAAFE7wADwqQbAAQQSgvHAAWMcwAFjJcABY2ACAMAAUTsAAAABA8ABYy3AAWNgAAAAAQEBwAFjNwAAAICWYMAAx2IAAFwBPgE9F8ABY0wWwAFjRC7AAH+qwAD/UMABA/jAAFE7gMABY1fAgAF+wADwqQbAAQP7gvHAAWNlwAFjasABY5gAAIKKAAAAAQPAAWNvwAFjmAAAAAEBAcABY3cAAADAAGSXYMAA/RwAAFwBPgE9HMABY4oWwAFjgi7AAH+qwAD/UMABA/iCigEAAYDAAWOQwIAB5QDAAPCuBsABA/yC8cABY53AAWOiwAFj2wAAggIAAAABA8ABY6nAAWPbAAAAAQABwAFjsgAAAMAAZJdgwAD9HAFqwAFjuGDAAP22hAYAXAE+AT0cwAFjyxbAAWPDLsAAf6rAAP9QwAED+IICAQABgMABY9PAgAJQAMAA8LAGwAED/YLxwAFj4MABY+XAAWQqAACEEQAAAAEDwAFj8sABZCoAAAABAQHAAWP3AAAAwABhHmDAAPvQAABcAT4BPRzAAWQPFsABZAcuwAB/qsAA/1DAAQP4hBEBAAGAwAFkHcCAAscAwADwsQbAAQP+gvHAAWQvwAFkNMABZJYAAJ+qAAAAAQPAAWQ8wAFklgAAAAIBAsABZEYAAADAAEMFXcAA/DIBWwDAAWRXAAAAga9gwAD9tgFqwAFkY2DAAP22hAYAXAE+AT0cwAFkdhbAAWRuLsAAf6rAAP9QwAED+J+qAgACgMABZH/AgAMygcABZIjAgANFAMAA8K8GwAED/4LxwAFkm8ABZKDAAWTRAABWAAAAAQPAAWSjwAFk0QAAAAEBAcABZK4AACCENF3AAPx0AWDAAPvQAABcAT4BPRzAAWTDFsABZLsuwAB/qsAA/1DAAQP4VgEAAYDAAWTHwIADwgDAAPCtBsABBACC8cABZNbAAWTbwAFlMAAAnA4AAAABA8ABZOPAAWUwAAAAAgECwAFk5AAAAIHFYMAA/RwAwAFk9wAAAIY/YMAA/YoBagBgwAD82XcAXAFKwAFlDQEcwAFlFRbAAWUNLsAAf6rAAP9QwAED+JwOAgACgMABZR7AgAQwgcABZSXAgAQ/AMAA8LIGwAEEAYLxwAFlNcABZTzAAWWKAACcEAAAAAEDwAFlRcABZYoAAAABAQHAAWVYAAAggfVdwAC5WAFdwAD8dAFgwAD70AAAXcAAuKkBWwE+AUrAAWVmARzAAWV1FsABZW0uwAB/qsAA/1DAAQP4nBABAAGAwAFlf8CABLwAwADwswbAAQQCgvHAAWWPwAFllMABZbkAAMAAfrwAAAABA8ABZZvAAWW5AAAAAAAAAFwBPgE9HMABZawWwAFlpC7AAH+qwAD/UMABA/jAAH68AAAAAMAA9HMGwAEEA4LxwAFlvsABZcXAAWXfAACEQQAAAAEDwAFlysABZd8AAAAAAAAAXcAAuKkBWwFKwAFl0AEcwAFl2BbAAWXQLsAAf6rAAP9QwAED+IRBAAAAAMAA8LQGwAEEBILxwAFl5MABZevAAWYFAACCiAAAAAEDwAFl8MABZgUAAAAAAAAAXcAAuKkBWwFKwAFl9gEcwAFl/hbAAWX2LsAAf6rAAP9QwAED+IKIAAAAAMAA9HcGwAEEDILxwAFmCsABZhXAAWYpAQCffgAAAAEDwAFmGsABZikAAAAAAAAAXcAAuKkBWwFKwAFmHQEWwAFmJRbAAWYdLsAAf6rAAP9QwAED+J9+wAD0fQbAAQQNgvHAAWYuwAFmNsABZkoBAJZXAAAAAQPAAWY7wAFmSgAAAAAAAABgwAD70AFKwAFmPgEWwAFmRhbAAWY+LsAAf6rAAP9QwAED+JZXwAD0eQbAAQQOgvHAAWZPwAFmY8ABZn0BAMAAdMoAAAABA8ABZmvAAWZ9AAAAAAAAAGDAAPPCAUrAAWZuARbAAWZ2FsABZm4uwAB/qsAA/1DAAQP4wAB0ysAA9HsGwAEED4LxwAFmgsABZpbAAWa8AQCeOQAAAAEDwAFmpMABZrwAAAAAAAAAYMAA88IBSsABZqcBFsABZq8WwAFmpy7AAH+qwAD/UMABA/ieOcAA9HwGwAEEEILxwAFmwcABZsnAAWbpAQCeOgAAAAEDwAFm1MABZukAAAAAAAAAYMAA+9ABSsABZtcBFsABZt8WwAFm1y7AAH+qwAD/UMABA/ieOsAA9HoGwAEEBYLxwAFm7sABZvPAAWdTAADAAH9/AAAAAQPAAWb8wAFnUwAAAAICAsABZwoAAACDJmDAAPQFAMABZxcAAADAAH++YMAA+goAAGDAAPoKAT4BSsABZyYBHMABZzUWwAFnLS7AAH+qwAD/UMABA/jAAH9/AgACgMABZz/AgAfxgcABZ0fAgAgAAMAA9HQGwAEEBoLxwAFnWMABZ2LAAWe0AADAAH+BAAAAAQPAAWduwAFntAAAAAEBAcABZ38AAACDJmDAAPQjAABgwADi8wE+AUrAAWeNARzAAWecFsABZ5QuwAB/qsAA/1DAAQP4wAB/gQEAAYDAAWepwIAIgQDAAPR1BsABBAeC8cABZ7nAAWe+wAFoCQAAwAB/hAAAAAEDwAFnysABaAkAAAABAQHAAWfbAAAAgyZgwAD0IwAAXAE+AT0cwAFn8RbAAWfpLsAAf6rAAP9QwAED+MAAf4QBAAGAwAFn/sCACPcAwAD0dgbAAQQJgvHAAWgOwAFoEsABaFYAAMAAdD/AAP9QAAAAAQPAAWgZwAFoVgAAAAEBAcABaB8AAACXt2DAAPoKAABdwAD8pQJbWwE+AUrAAWgqASbAAWgqARzAAWhGJsABaDoAFsABaDIuwAB/qsAA/1DAAQP4W8AAdD/AAP9QAQABgMABaE7AgAloAABdwAD8pQJbWwAAgAAVAIAA+gCAAVIAgAG7AIACJgCAAp0AgAMIAIADmQCABAYAgASSAIAFEgCABWcAgAXBAIAGGwCABnEAgAbFAIAHHQCAB3EAgAfFAIAIVQCACMsAgAk4AIAJywAAABYCwAEEFYLxwAFoW8ABaGHAAWqsA8AAjnkAAAFgwAD9HAAABATAAQQYgvHAAWiFwAFojAnAAI56wAD/UABgwAD70AAEwAEEGYLxwAFonsABaMcGwACOewBgwAEEFQFqwAFormDAAQQVwAHizgTAAQQagvHAAWjYwAFo/gbAAI58AGDAAQQVAWrAAWjmYMABBBXAAeG+BMABBBuC8cABaQ/AAWk2BsAAjn0AYMABBBUBasABaR5gwAEEFcAB4coBBcABBCGC8cABaTvAAWlBwAFpZAEAAAPAAWlWwAFpZAAAAAEBAcABaVwAAATAAI56YMAA+9AAAGDAAQQVAT8CCAHAAQQYgADAgAsPCQHAAWlBwAD9MgAAAAACBsABBB2C8cABaWnAAWlxwAFqKQQBnOEAAAABA8ABaZHAAWopAAAAAQEBwAFpmQAAAIG6YMAA/bYAAGDAAQQVAT4DScABaaccwAFpwBzAAWmygMABaavAgAtullMAAAAAwAD920gBAAEnwACOfgDAAP3FSsABacwBasABadNgwAEEFcAB4b4/ScABad4cwAFp9xzAAWnpgMABaeLAgAtullMAAAAAwAD920gBAAEnlWgAwAD9xUrAAWoEAWrAAWoLYMABBBXAAeHKP0rAAWoXAWrAAWoeYMABBBXAAeLOBsABBB+C8cABai7AAWo1wAFqqgAAIwAAAAEDwAFqPcABaqoAAAAAAAAAYMAA/bYBPgNJwAFqRhzAAWpPLkgBAAFqwAFqUmDAAQQVwAHhvgDAAP0pSsABalkBJ8AAjn8/ScABam0cwAFqdi5IAQABasABanlgwAEEFcAB4coAwAD9KUrAAWqBASfAAG1mP0rAAWqWASfAAFtMAACAC0QAgAwiAIAMuwAAAAICwAEEIoLxwAFqr8ABar7AAW8vB8AAjoAAAAFgwAD9HAAACATAAQQkgvHAAWrmwAFq8RjAAIxmAGDAAQRDAATAAQQlgvHAAWr8wAFrARjAAIxlAGDAAP22AATAAQQmgvHAAWsKwAFrFhibTQBgwAD6CgEqBMABBCeC8cABaz/AAWtCGMAAjoEAYMAA/bYBKwTAAQQogvHAAWtNwAFrUhjAAI17AGDAAP22ASsEwAEEKYLxwAFrXcABa2YYwACNegBgwAD9tgErBMABBCqC8cABa3HAAWt0GMAAjXwAYMAA/bYBKwTAAQQrgvHAAWt8wAFrhhjAAI19AGDAAPvQASsBBcABBDGC8cABa4vAAWuLwAFuxAAAAAPAAWuXwAFuxAAAAAICAsABa50AAATAAIxmYMABBEMAwAFrrwAABMAAjGVgwAD9tgAAYMABBCIBPgFJwAFrvBzAAWvTFsABa8wWwAFrwC7AAIxmwAEEJIG6wAEERUgBAAFqwAFr7GDAAQQVwAHhygDAAP0pPgNOwAFtnMABbaIAAMAAjflgwAEEVwEmwAFtnAEWwAFtpC7AAIxmwAEEJGDAAQRXTsABbbvAAW3CAADAAGjBYMABAQ0BNcABbcgAAAEAYMABAQ0BH8ABbcjAAQEXAAAAADUAAAABAFsBHMABbdmDwAFt18CADpxWAQABHMABbeJqwAFt3WDAAMkogYeVRAEAARbAAW3vgsABbenAgA5ZwACMfMABBFkAwADHMQDAAQD8NQAAAAEAWwEcwAFuBIPAAW4CwIAOnFYBAAExwAFuCGDAAPvQAWrAAW4TYMAA+9CVjwDAAQD8NQAAAAEAWwEcwAFuJYPAAW4jwIAOnFYBAAEWwAFuLxbAAW4pLsAAjGXAAQQln6PAAP2+AMABAPw1AAAAAQBbARzAAW5Eg8ABbkLAgA6cVgEAATHAAW5IYMAA+9ABasABblNgwAD70JWPAMABAPw1AAAAAQBbARzAAW5lg8ABbmPAgA6cVgEAARzAAW5uasABbmlgwADJKIGHlUQBAAEWwAFue4LAAW51wIAOWcAAf/3AAQRaAMAAxzEAwAEA/IMAwIAOnD0XwAFujS7AAI6BHsABbqDAAQDrAQABHMABbrKDwAFuq8CADoeCiAAAAADAAQD9AMABBCc/AwgBwAEEJIAAwIAN8QgBwAEEJYEAwIAOAgkBwAFri8AA/TIAAAAAAgbAAQQtgvHAAW7JwAFu48ABbv8BAIG6AAAAAQPAAW7qwAFu/wAAAAAAAABgwAEEFQFKwAFu7QEWwAFu+RbAAW7tLsAAjGbAAQQkgbrAAQRFBsABBC+C8cABbwTAAW8JwAFvLQACwACN/gAAAAEDwAFvEsABby0AAAABAQHAAW8lAAAAg1BgwAEAfgAAXAAAAIAQXgCAEK4AgBDsAAAAAgLAAQQygvHAAW8ywAFvOMABcqQDwACOggAAAWDAAQQiAAABBMABBDSC8cABb2bAAW9pGICsAGDAAP43AAEFwAEEOYLxwAFvbsABb27AAW/JAAAAA8ABb37AAW/JAAAAAwMDwAFvhAAABICsYMAA/jcAwAFviQAAAMAAjGVbAMABb6cAAADAAI35YMABBEMAAGDAAQQyAT8CCAHAAQQ0gADAgBFfCQDAAW+2wAEEMQIAAoLAAW+8wIAReybAAW/DAYHAAW/DwIARbmDAAP22AAIGwAEENoLxwAFvzsABb9PAAXGAAACyXgAAAAEDwAFv2sABcYAAAAACAgLAAW/fAAAAgKxgwAD+NwDAAW/6AAAAgbpgwAEEFQAAYMAA+goBPgZJwAFwCCIhHMABcBOBwAFwDMCAEgZIAQABKwDAAP0pACEcwAFwMRbAAXAqFsABcB4uwACMZsABBCSBusABBEVIAQABgcABcDTAgBIGAMAA/SlKwAFwPAEqP0nAAXBOIRzAAXBbFsABcFaAwAFwUsCAEfeWVsAA/kBIAQABFsABcGcWwAFwYy6ArMABBDSWVsAA/kAAwAD9xUrAAXBtASo/TsABcIPAAXCMAADAAI6DYMAA+9ABIxzAAXCkFsABcJ8WwAFwmy6ArMABBDSWV8AA/kFIAQABkwDAAPzzasABcLZgwAD70LqJFsABcNEWwAFwzS6ArMABBDSWV8AA/kEBYMAA+9BOwAFw38ABcOkAAMAAjoRgwAD70AEjHMABcPQWwAFw74DAAXDrwIAR95ZXwAD+QUgBAAGTAMAA/PNqwAFxBmDAAPvQuokWwAFxHIDAAXEYwIAR95ZXwAD+QQFgwAD70EnAAXEmIRzAAXE0g8ABcSrAgBMkSAEAAYLAAXE3wIASvwDAAPzzSsABcUEBKj9KwAFxUwEcwAFxYxbAAXFegMABcVrAgBH3TsAA/kKB1gEAARbAAXF3FsABcXMugKzAAQQ0TsAA/kIAwAD9yAbAAQQ3gvHAAXGFwAFxisABcqIAAMAAjf4AAAABA8ABcZPAAXKiAAAAAQEBwAFxpgAAAINQYMABAH4AAFwBPgNJwAFyBiIcwAFyHRbAAXIWFsABcgouwACMZsABBCSBusABBEVIAQABasABcjZgwAEEFcAB4coAwAD9KQAcwAFyRhbAAXJALsAAjXvAAQQoSAEAASsAwAD9xT4BSsABclcAPz0cwAFydRbAAXJpLsAAjGbAAQQkwACN/gIAAi6AwAFyhcCAFBoAwAEERz0XwAFyky6bTSnAAQQmAACAEc0AgBPuAIAUyAAAAAICwAEEOoLxwAFyp8ABcq3AAXUxA8AAjoUAAAFgwAEEIgAAAgTAAQQ8gvHAAXLfwAFy4xiWVgBgwAD9tgAEwAEEPYLxwAFy68ABcu8YllcAYMAA+9AAAQXAAQRCgvHAAXL0wAFy9MABc1wAAAADwAFzBcABc1wAAAAEBATAAXMLAAAEllZgwAD9tgDAAXMWAAAElldgwAD70ADAAXMcAAAAwACMZVsAwAFzOgAAAMAAjflgwAEEQwAAYMABBDoBPwMIAcABBDyAAMCAFVQIAcABBD2BAMCAFWMJAMABc0nAAQQxAgACg8ABc0/AgBV/JsABc1YBgsABc1bAgBVyYMAA/bYAAgbAAQQ/gvHAAXNhwAFzZsABdBkAALJeAAAAAQPAAXNtwAF0GQAAAAICAsABc3UAAADAAIsjYMABA98AwAFzkgAAAIG6YMABBBUAAGDAAPoKAT4CScABc6AiIRzAAXOrgcABc6TAgBYYSAEAASsAwAD9KQAhHMABc8kWwAFzwhbAAXO2LsAAjGbAAQQkgbrAAQRFSAEAAYHAAXPMwIAWGADAAP0pSsABc9QBKj9KwAFz5gEiHMABc/gWwAFz84DAAXPtwIAWB5ZWwAED4UgBAAEWwAFz+y6WVsABBDwAwAD9xQAcwAF0DhbAAXQJgMABdAPAgBYHllfAAQPiSAEAARbAAXQRLpZXwAEEPQDAAPzzBsABBECC8cABdB7AAXQjwAF1LwAAwACN/gAAAAEDwAF0LMABdS8AAAABAQHAAXQ/AAAAg1BgwAEAfgAAXAE+AknAAXSfIhzAAXS2FsABdK8WwAF0oy7AAIxmwAEEJIG6wAEERUgBAAFqwAF0z2DAAQQVwAHhygDAAP0pABzAAXTfFsABdNkuwACNe8ABBChIAQABKwDAAP3FPgFKwAF08AA/PRzAAXUOFsABdQIuwACMZsABBCTAAI6GAgACLoDAAXUjwIAXGQDAAQRIAACAFd0AgBbtAIAXuQAAAAICwAEEQ4LxwAF1NMABdUPAAXY5B8AAjocAAAFgwAD9HAABYMABAK8AAQXAAQRKAAAAAAQAAAMAAAAAAAAAAABgwAEEQwE/AQkBAMAA/TIAAAAAAwbAAQRFgvHAAXV/wAF1mcABdZ8BAoG6AAAAAQPAAXWfwAF1nwAAAAAAAABgwAEEFQAGwAEER4LxwAF1o8ABdajAAXXmAALAAI3+AAAAAQPAAXWxwAF15gAAAAICAsABdb8AAADAAIxmYMABBCIAwAF13gAAAINQYMABAH4AAFwABsABBEiC8cABderAAXXvwAF2NwACwACOhgAAAAEDwAF1/cABdjcAAAACAgLAAXYQAAAAwACMZmDAAQQ6AMABdi8AAACDUGDAAQB+AABcAAAAgBgdAIAYTgCAGJ0AgBjsAAAAAwLAAQRLgvHAAXY8wAF2QsABemcDwACOiAAAAWDAAQRDAAFgwAEAsgIEwAEETYLxwAF2ssABdroYwACMfABgwAD9tgAEwAEEToLxwAF2xcABds0YwAB//QBgwAD9tgABBcABBFaC8cABdtLAAXbSwAF3CwAAAAPAAXbtwAF3CwAAAAICAsABdvMAAATAAIx8YMAA/bYAwAF3AgAABMAAf/1gwAD9tgAAYMABBEsBPwMIAcABBE2AAMCAGYUIAcABBE6BAMCAGZYJAcABdtLAAQRKAAAAAAQGwAEEUILxwAF3EMABdyrAAXdPAQCBugAAAAEDwAF3McABd08AAAAAAAAAYMABBBUBSsABdzQBasABd0pgwAEEFcAB4b4GwAEEUoLxwAF3VMABd1vAAXk6AADAAIt/AAAAAQPAAXdowAF5OgAAAAAAAABgwAD9tgE+Ak7AAXjPwAF41AAAwACN+2DAAP22AR7AAXjrwAEA7AEAARzAAXj+asABePlgwADJKIGHlUQBAAEkwAF5GgMWwAF5By7AAIx8wAEETSeC5hbAAXkRLsAAf/3AAQROAMAAxzEASsABeSIBJMABeTYCJ8AAjfyAwAF5McCAGlIGwAEEU4LxwAF5P8ABeUTAAXnIAADAAI3+AAAAAQPAAXlNwAF5yAAAAAICAsABeVsAAACAtWDAAQQiAMABeXAAAACDUGDAAQB+AABcAT4BPRzAAXmPFsABeYeBwAF5f8CAGwieO8ABAIiXHgIAAmrAAXmfYMAA/bbAAdXIHMABebQuwACLfwAAAADAAQRSAMAA//sGwAEEVILxwAF5zcABedLAAXplAADAAI6GAAAAAQPAAXngwAF6ZQAAAAICAsABefMAAACAtWDAAQQ6AMABeggAAACDUGDAAQB+AABcAT4BPRzAAXonFsABeh+BwAF6F8CAG5ueO8ABAIiXHgIAAmrAAXo3YMAA/bbAAdY8HMABelEuwACLfwAAAADAAQRSAMAA//sAAIAZ1wCAGhwAgBrNAIAbYACAG/MAAAAEAsABBFeC8cABemrAAXpwwAGD9gPAAI6JAAABYMABBEMAAWDAAQC1AgTAAQRZgvHAAXriwAF66hjAAIx8AGDAAP22AATAAQRagvHAAXr1wAF6/RjAAH/9AGDAAP22AAEFwAEEYoLxwAF7AsABewLAAXs8AAAAA8ABex7AAXs8AAAAAgICwAF7JAAABMAAjHxgwAD9tgDAAXszAAAEwAB//WDAAP22AABgwAEEVwE/AwgBwAEEWYAAwIAckAgBwAEEWoEAwIAcoQkBwAF7AsABBEoAAAAABAbAAQRcgvHAAXtBwAF7W8ABe4EBAIG6AAAAAQPAAXtiwAF7gQAAAAAAAABgwAEEFQFKwAF7ZQFqwAF7e2DAAQQVwAHhygbAAQRegvHAAXuGwAF7jcABgnUAAMAAi38AAAABA8ABe5rAAYJ1AAAAAgICwAF7qAAAAMAAjGZgwAEEIgDAAXvIAAAAg1BgwAECmwAAYMAA/bYBPg5OwAF73sABe+kAAMAAe/FgwAD9tgEcwAF784HAAXvrwIAdZMAAjczAAP9QAAAAAMABArNOwAF8C8ABfBIAAMAAaMFgwAEBDQE1wAF8GAAAAQBgwAEBDQEfwAF8GMABARcAAAAANQAAAAEAWwEcwAF8J4PAAXwlwIAdxVYBAAEWwAF8OhbAAXwzgcABfCvAgB1klkHAAQKdn6PAAP2+AMABAPw1AAAAAQBbARzAAXxNg8ABfEvAgB3FVgEAATHAAXxRYMAA+9ABasABfFxgwAD70JWPAMABAPw1AAAAAQBbARzAAXxsg8ABfGrAgB3FVgEAARbAAXx7gsABfHDAgB19n6PAAP2+AMABAPyDAMCAHcVOwAF8j8ABfJMAAMAAjopgwAD9tgEewAF8osABAOsBAAEcwAF8tIPAAXytwIAdsIKIAAAAAMABAP0ATsABfMoAAADAAI18YMAA/bYATsABfNoAAADAAI6LYMAA/bYATsABfO0AAADAAI6MYMAA/bYATsABfPkAAACDe1sAPYvAAX0AwIAdsDXAAX0NAAABAGDAAQENAR/AAX0NwAEBFwAAAAA1AAAAAQBbARzAAX0VFMABfRPAgB8UCQBWAQABFsABfSkWwAF9JYDAAX0ZwIAdU8AAjoHAAQQnn6PAAP2+AMABAPw1AAAAAQBbARzAAX01FMABfTPAgB8UCQBWAQABMcABfTlgwAD70AFqwAF9RGDAAPvQlY8AwAEA/BQAwIAfFAkAScABfVEcwAF9ZRbAAX1hgMABfVXAgB1TwACNfMABBCpIAQABJ8AAjfsAwAD9xT4GPY3AAX14wIAeyBbAAX2KgMABfX7AgB1TwACNfMABBCo9jsABfZXAgB7aHsABfavAAQDrAQABHsABfcPAAQDqAQABlwAAPTUAAAABAGDAAQQiAYDAAX3fwIAdUxfAAX3rFMABfevAgCAoCQDAAI19HMABfd0WwAF96xTAAX3rwIAgKAkAwACNfcABBCtkAQABlADAAPz1wAEEKz2PwAF9/cCAHuwcwAF+GRbAAX4OgMABfgLAgB1TwACNfcABBCuECQEAATcQAMAA+/49j8ABfjLAgB7sHMABfmIcwAF+QifAAIW/gL4CAAKTHMABfl0cwAF+UTcIgY0BAAEWwAF+VofAAX5TwIAe7GHAAP26AMAA/PZkAQABlADAAPz1AMAA/cxkAQABh8ABfmTAgB7sAMAA/cs9NcABfm4AAAEAYMABAQ0Bg8ABfm7AgB2wNQAAAAEAWwEcwAF+fxTAAX59wIAhFwkAVgEAARbAAX6VFsABfo+AwAF+g8CAHVPAAI17wAEEKJ+jwAD9vgDAAQD8NQAAAAEAWwEcwAF+qhTAAX6owIAhFwkAVgEAATHAAX6uYMAA+9ABasABfrlgwAD70JWPAMABAPw1AAAAAQBbARzAAX7LFMABfsnAgCEXCQBWAQABFsABftKHwAF+z8CAHuyfo8AA/b4AwAEA/DUAAAABAFsBHMABfucUwAF+5cCAIRcJAFYBAAExwAF+62DAAPvQAWrAAX72YMAA+9CVjwDAAQD8NQAAAAEAWwEcwAF/CBTAAX8GwIAhFwkAVgEAARbAAX8ThsABfwzAgB7an6PAAP2+AMABAPw1AAAAAQBbARzAAX8oFMABfybAgCEXCQBWAQABMcABfyxgwAD70AFqwAF/N2DAAPvQlY8AwAEA/DUAAAABAFsBHMABf0kUwAF/R8CAIRcJAFYBAAEWwAF/XRbAAX9ZgMABf03AgB1TwACNfMABBCqfo8AA/b4AwAEA/DUAAAABAFsBHMABf3IUwAF/cMCAIRcJAFYBAAExwAF/dmDAAPvQAWrAAX+BYMAA+9CVjwDAAQD8NQAAAAEAWwEcwAF/kxTAAX+RwIAhFwkAVgEAARbAAX+bhMABf5fAgB6On6PAAP2+AMABAPwUAMCAIRcJAD4BPTXAAX+6AAABAGDAAQENAYPAAX+6wIAdsDUAAAABAFsBHMABf8sUwAF/ycCAIz0JAFYBAAEWwAF/4RbAAX/bgMABf8/AgB1TwACNe8ABBCifo8AA/b4AwAEA/DUAAAABAFsBHMABf/YUwAF/9MCAIz0JAFYBAAExwAF/+mDAAPvQAWrAAYAFYMAA+9CVjwDAAQD8NQAAAAEAWwEcwAGAFxTAAYAVwIAjPQkAVgEAARbAAYAfhMABgBvAgB6On6PAAP2+AMABAPwUAMCAIz0JAE7AAYA5wAGAQgAAg1FgwAD9tgEewAGAUcABAOsBAAEcwAGAY4PAAYBcwIAdsIKIAAAAAMABAP0ATsABgH/AAYCGAACCi2DAAP4AATXAAYCMAAABAGDAAP4AAR/AAYCMwAD+HwAAAAA1AAAAAQBbARzAAYCjFMABgKHAgCRXCgCCigEAASfAAI6NAMAA/hQ1AAAAAQBbARzAAYC8FMABgLrAgCRXCgCCigEAASTAAYDYAyfAAI6OFsABgM4uwACMfMABBFkng64AwAD+FDUAAAABAFsBHMABgOIUwAGA4MCAJFcKAIKKAQABJMABgQgDJ8AAjo8WwAGBAIDAAYD0wIAdU8AAjGXAAQQlJ4OuAMAA/hQ1AAAAAQBbARzAAYESFMABgRDAgCRXCgCCigEAASTAAYE4AyfAAI6QFsABgTCAwAGBJMCAHVPAAI17wAEEKCeDrgDAAP4UNQAAAAEAWwEcwAGBQhTAAYFAwIAkVwoAgooBAAEkwAGBXQMnwACOkYLAAYFRwIAdfSeDrgDAAP4UNQAAAAEAWwEcwAGBZxTAAYFlwIAkVwoAgooBAAEkwAGBlQMnwACOkhbAAYGJgMABgX3AgB1TwACNesABBCkng64AwAD+FBQAwIAkVwoAScABgZwcwAGBpIXAAYGgwIAeyEgBAAEnwACN+wDAAP3FPgE9NcABgbcAAAEAYMAA/gABFMABgbfAgCRECgA1AAAAAQBbARzAAYHIFMABgcbAgCYPCwCCigEAASTAAYHcAyfAAI6ThcABgdfAgB7IJ4OuAMAA/hQ1AAAAAQBbARzAAYHoFMABgebAgCYPCwCCigEAASTAAYICAyfAAI6UhsABgfrAgB7aJ4OuAMAA/hQ1AAAAAQBbARzAAYIOFMABggzAgCYPCwCCigEAASTAAYIgAyfAAI6Vh8ABghzAgB7sJ4OuAMAA/hQUAMCAJg8LAD89HMABgjQUwAGCLcCAJEQKAIKKAQABJMABglIDJ8AAjpYUwAGCSMCAJAwJACeDrgDAAP4USsABglkBHMABgmcUwAGCYMCAJEQKACMAAAAAwAD+GQbAAQRfgvHAAYJ6wAGCf8ABgyoAAMAAjf4AAAABA8ABgojAAYMqAAAAAgICwAGClgAAAMAAjGZgwAEEIgDAAYK1AAAAg1BgwAEAfgAAXAE+AT0cwAGC1BbAAYLMgcABgsTAgCdsnjvAAQCIlx4CAAJqwAGC7WDAAP22wAHVyBzAAYMCLsAAi38CAAKAwAGDEMCAJ1smwAGDHQGBwAGDHcCAJ2xgwAECmwDAAQReAMAA//sGwAEEYILxwAGDL8ABgzTAAYP0AADAAI6GAAAAAQPAAYNCwAGD9AAAAAICAsABg1wAAADAAIxmYMABBDoAwAGDewAAAINQYMABAH4AAFwBPgE9HMABg5oWwAGDkoHAAYOKwIAoHp47wAEAiJceAgACasABg6pgwAD9tsAB1jwcwAGDzC7AAIt/AgACgMABg9rAgCgNJsABg+cBgcABg+fAgCgeYMABApsAwAEEXgDAAP/7AACAHOIAgB0nAIAnLwCAJ+EAgCiTAAAABALAAQRjgvHAAYP5wAGD/8ABhLADwACOlwAAAWDAAP0cAAFgwAEAvwMEwAEEZYLxwAGEM8ABhD0Jg1IAYMAA+9AABMABBGaC8cABhE7AAYRUCZZBAGDAAP22AATAAQRngvHAAYRiwAGEagmEWwBgwAD+NwABBcABBGmC8cABhG7AAYR0wAGErgEAAAPAAYSBwAGErgAAAAMDA8ABhIcAAASDUmDAAPvQAMABhJgAAASWQWDAAP22AMABhKUAAASEW2DAAP43AABgwAEEYwE/BAgBwAEEZYAAwIApRQgBwAEEZoEAwIApVAgBwAEEZ4IAwIApYwkBwAGEdMAA/TIAAAAAAAAAgCmuAAAAAALAAQRqgvaBBIEKhmADwACOmAAAAWDAAP0cAAAHBMABBGyC9oE5gVYGwACOmQBdwAD8dAFgwAD70AFqgUBdwAD8dAFgwAD70MAB4tsEwAEEbYL2gYGBrgbAAI6aAF3AAPx0AWDAAPvQAWqBjF3AAPx0AWDAAPvQwAHi6gTAAQRugvaB2oIJBsAAjpsAXcAA/HQBYMAA+9ABaoHjXcAA/HQBYMAA+9DAAeHvBMABBG+C9oI1gmQGwACOnABdwAD8dAFgwAD70AFqgj5dwAD8dAFgwAD70MAB4dYEwAEEcIL2gnuCgwaCdgBgwAD6CgFqgn9gwAD6CnUEwAEEcYL2gpmCogbAAEdHAGDAAPoKAWqCnWDAAPoKAATAAQRygvaC+oZeBsAAjp0AXcAA/HQBYMAA+goBaoMKXcAA/HQBYMAA+grAAeMBAQXAAQR0AAAAAAQAAAMAAAAAAAAAAABgwAEEagE/AQkBAMAA/TIAAAAAAAAAgCsoAAAAAALAAQR1gvaGh4aNiCQDwACOngAAAWDAAP0cAAANBMABBHeC9oashrIGwACOnwBgwAD70AFqhrFgwAD70IPvBMABBHiC9obHhs4GwACMigBgwAD70AFqhsxgwAD70IPyBMABBHmC9objhuoGwACMiQBgwAD70AFqhuhgwAD70IP1BMABBHqC9ob/hwYGwACMzgBgwAD70AFqhwRgwAD70IMrBMABBHuC9ocbhykGnZIAYMAA+9ABaocnYMAA+9DAAFl3BMABBHyC9oc+h0gGnaQAYMAA+9ABaodGYMAA+9DAAEG8BMABBH2C9oddh2YGwACOoABgwAD70AFqh2RgwAD70L9ZBMABBH6C9od7h4UGndQAYMAA+9ABaoeDYMAA+9DAAFjeBMABBH+C9oeah6MGwABJAABgwAD70AFqh6FgwAD70LMMBMABBICC9oe4h8AGwABIxQBgwAD70AFqh75gwAD70LWtBMABBIGC9ofVh98GnaMAYMAA+9ABaofdYMAA+9CVjwTAAQSCgvaH9IgDBsAAjqEAYMAA+9ABaogBYMAA+9CTMQTAAQSDgvaIGIgiBsAAjqIAYMAA+9ABaoggYMAA+9DAAIwrAQXAAQSFAAAAAAQAAAMAAAAAAAAAAABgwAEEdQE/AQkBAMAA/TIAAAAAAAAAgC0mAAAAAALAAQSGgvaIU4hZjVUDwACOowAAAWDAAP0cAAAdBMABBIiC9oh1iH4GwABPxQBgwAD70AFqiH1gwAD70AkEwAEEiYL2iJOItgbAAI6kAGDAAPvQAWqItWDAAPvQFQTAAQSKgvaIy4jkBsAAjqUAYMAA+9ABaojjYMAA+9AhBMABBIuC9oj5iRAGwACOpgBgwAD70AFqiQ9gwAD70FIEwAEEjIL2iSWJOQbAAI6nAGDAAPvQAWqJOGDAAPvQgVUEwAEEjYL2iU6JawbAAI6oAGDAAPvQAWqJamDAAPvQgjwEwAEEjoL2iYCJlwbAAI6pAGDAAPvQAWqJlmDAAPvQhAgEwAEEj4L2iayJyQbAAI6qAGDAAPvQAWqJyGDAAPvQhOAEwAEEkIL2id6J/QbAAI6rAGDAAPvQAWqJ/GDAAPvQgz4EwAEEkYL2ihKKKgbAAI6sAGDAAPvQAWqKKWDAAPvQg+8EwAEEkoL2ij+KUAbAAI6tAGDAAPvQAWqKTmDAAPvQg/IEwAEEk4L2imWKdgbAAI6uAGDAAPvQAWqKdGDAAPvQwACNJATAAQSUgvaKi4qiBsAAjq8AYMAA+9ABaoqgYMAA+9DAAIxbBMABBJWC9oq3isgGwACOsABgwAD70AFqisZgwAD70IP1BMABBJaC9ordiwAGwACOsQBgwAD70AFqiv5gwAD70MAAg8EEwAEEl4L2ixWLMgbAAI6yAGDAAPvQAWqLMGDAAPvQwACBcgTAAQSYgvaLR4tZBsAAjrMAYMAA+9ABaotXYMAA+9CDUQTAAQSZgvaLb4uKBsAAjrQAYMAA+9ABaouIYMAA+9DAAHx6BMABBJqC9oufi7oGwACOtQBgwAD70AFqi7hgwAD70MAAfVAEwAEEm4L2i8+L3gbAAI62AGDAAPvQAWqL3GDAAPvQwAB7uwTAAQScgvaL84wMBsAAjrcAYMAA+9ABaowKYMAA+9DAAGmtBMABBJ2C9owhjDcGwACOuABgwAD70AFqjDVgwAD70MAAdZcEwAEEnoL2jEyMZQbAAI65AGDAAPvQAWqMY2DAAPvQwAB1DATAAQSfgvaMeoyTBsAAjroAYMAA+9ABaoyRYMAA+9DAAGQgBMABBKCC9oyojLEGwACOuwBgwAD70AFqjK9gwAD70MAAY2cEwAEEoYL2jMaM0QbAAIQcAGDAAPvQAWqMz2DAAPvQwABwzwTAAQSigvaM5ozzBsAAjrwAYMAA+9ABaozxYMAA+9DAAGM0BMABBKOC9o0IjRQGwACOvQBgwAD70AFqjRJgwAD70MAAYwEEwAEEpIL2jSqNUwbAAI6+AGDAAPvQAWqNPWDAAPvQwAB8egEFwAEEpgAAAAAEAAADAAAAAAAAAAAAYMABBIYBPwEJAQDAAP0yAAAAAAAAAIAxUAAAAAACwAEEp4L2jZGNl44JA8AAjr8AAAFgwAD9HAAAAwTAAQSpgvaNuY3JBsAAjsAAYMAA+9ABao3IYMAA+9AJBMABBKqC9o3ejegGwACOmwBgwAD70AFqjedgwAD70BUEwAEEq4L2jf2OBwbAAI6cAGDAAPvQAWqOBmDAAPvQIQEFwAEErQAAAAAEAAADAAAAAAAAAAAAYMABBKcBPwEJAQDAAP0yAAAAAAAAAIAyAQAAAAACwAEEroL2jjiOPo6zA8AAjsEAAAFgwAD9HAAAAwTAAQSwgvaOYI5wBsAAjsAAYMAA+9ABao5vYMAA+9AJBMABBLGC9o6FjpAGwACOwgBgwAD70AFqjo9gwAD70BUEwAEEsoL2jqWOsQbAAI7DAGDAAPvQAWqOsGDAAPvQCQEFwAEEtAAAAAAEAAADAAAAAAAAAAAAYMABBK4BPwEJAQDAAP0yAAAAAAAAAIAysgAAAAACwAEEtYL2kCmQL5c5A8AAjsQAAAFgwAD9HAABXcAAuZEBYMAA4vMGBMABBLiC9pCakKcYnEvAAP9QAF3AALmRAWDAAOLzAATAAQS5gvaQtZDAGMAAjsXAAP9QAGDAAOLzAATAAQS6gvaQyZDcGMAAb9DAAP9QAGDAAPoKASoEwAEEu4L2kOSQ8xjAAIOCwAD/UABgwAD70AGUBMABBLyC9pEAkQsYwACOxsAA/1AAYMAA+8YABMABBL2C9pEUkSYYwACOx8AA/1AAYMAA+goBKgEFwAEEy4L2kSuRK5GJAAAAA5FKkYkAAAADAwORVwAABJxLXcAAuZEBYMAA4vMAkWsAAATAAI7FYMAA4vMAkX0AAATAAI7GYMAA+8YAAGDAAQS1AT8ECAHAAQS4gADAgDOoCAHAAQS5gQDAgDO7CAHAAQS8ggDAgDPKCQGRK8AA/TIAAAAACQbAAQS/gvaRjpGXkbkBAMAAbtAAAAABA5GgkbkAAAAAAAAAYMAA+goBSpGjARaRsRaRoy6cS8AA/1DAAQS4wABu0MAAuZsGwAEEwYL2kb6RyJIUAADAAG+nAAAAAQOR05IUAAABAACCdmDAAP0cAVsBAAGR1wAAAMAAb6ZfAAABagBgwAD82XcAXcAAuKkBXwAAAUqR7gEckfwWke4unEvAAP9QwAEEuMAAb6cBAV8AAAGAkgjAgDSGAMAAuZkGwAEEwoL2khmSIJKAAACcTQAAAAEDkiaSgAAAAAAAAABdwAC4qQFbAT4DPReSLy7AAG/QwAD/UCnAAQS6PReSRy7AAI7FwAD/UCvAAQS5SpJfARySdBaSZi6cS8AA/1DAAQS4nE0AAAAAwAC5kwbAAQTDgvaShZKKkvoAAMAAbuEAAAABA5KQkvoAAAABAQGSlgAAAMAAb7BhAWDAAOLzXAAAXAE+Aj0XkrguwACOxsAA/1CAksbAgDVhwAEEvD0ckuQWktYunEvAAP9QwAEEuMAAbuEBAAGAkuvAgDVhAMAAuZQGwAEExIL2kv+TBJNIAACDiQAAAAEDkwqTSAAAAAEBAZMQAAAAwABvsWEAXAAAXAE+AT0ckzIWkyQunEvAAP9QwAEEuIOJAQABgJM5wIA11QDAALmWBsABBMWC9pNNk1KTnAAAgesAAAABA5NZk5wAAAABAQGTYwAAAMAAbylgwAD7xgAAXAE+AT0ck4QWk3YunEvAAP9QwAEEuIHrAQABgJOMwIA2KgDAALmVBsABBMaC9pOhk6aUjAAAgfsAAAABA5OrlIwAAAABAAGTtAAAAMAAb7JdwAC4qQFbAWoAYMAA/Nl3AFwBPgFJk8kck9kWk80uwACOxcAA/1DAAQS5SAEAASsAwAD9KT4BPRyT+BaT6i6cS8AA/1DAAQS4gfsBAAGAk/7AgDaBAMAAuZc+Aj0XlCAuwACDgsAA/1AclCsWlCAuwACDgsAA/1DAAQS7ZAEAAZQAwAD89cABBLtJlDUhHJRGgJQ5wIA2gUgBAAErAMAA/Sk+AT0clGaAlFnAgDaBgf4BAAEWlHMuggTAAQTHAMAAuL4/BsABBMeC9pSRlJaVJAAAggQAAAABA5SclSQAAAAAAAAAXAE+AUmUpRyUtRaUqS7AAI7FwAD/UMABBLlIAQABKwDAAP0pPgE9HJTUFpTGLpxLwAD/UMABBLiCBAAAAADAALmYPgI9F5TxLsAAg4LAAP9QHJT8FpTxLsAAg4LAAP9QwAEEu4GNAQABlADAAPz2wAEEuz0clQYuwACOyMAA/1AAAAAAwAEEyQbAAQTJgvaVKZUulzcAAMAAjsjAAP9QAAAAAQOVQJc3AAAAAAAAAFwBPgRJlUkWlU0uwACOx8AA/1DAAQS9SpVZAD9JlWUhHJV1FpVpLsAAg4LAAP9QwAEEu0gBAAGTAMAA/PNKlXsAPz0XlYcuwACOx8AA/1ApwAEEvT0elZ7AALftAQABNJWwA5WwlzIAAAAAAAAAYMAA/NkBPgY9F5W7LsAAjsfAAP9QKsABBL1JldUiHJXlFpXZLsAAg4LAAP9QwAEEu4CXAQABkwDAAPz/ARaV7C7AAG/QwAD/UMABBLpKlfkAP06WC5YQAAASYMAA4vMBFpYSLsAAjsXAAP9QwAEEuT0XliUuwACOxcAA/1ArwAEEuT0clt8WltEunEvAAP9QwAEEuIIEAAAAAMAAuZhJlu8hHJb/FpbzLsAAjsbAAP9QwAEEvEgBAAErAMAA+8s+AT0clxIuwACOxsAA/1ABAAGAlx7AgDjfAMABBLw/AAAAgDQTAIA0WQCANNEAgDU/AIA1tQCANgoAgDZhAIA3TgCAN/cAgDlrAAAACQLAAQTMgvaXPJdCmrQDwACOyQAAAV3AALlYAWDAAOLzAAACBMABBM6C9peal6YJgfgAXcAAuZEBYMAA4vMABMABBM+C9pe6l8YJwACDagBgwADi8wABBcABBNOC9pfLl8uYBgAAAAOX4JgGAAAAAgICl+YAAASB+F3AALmRAWDAAOLzAJf5AAAEwACDamDAAOLzAABgwAEEzAE/AwgBwAEEzoAAwIA6CQgBwAEEz4EAwIA6HAkBl8vAALmOAAAAAAEGwAEE0YL2mAuYKZqyAACB+QAAAAEDmC+asgAAAAQBAZg1AAAAwABu4WEBYMAA4vNcAAOYXgAAAIHrYMAA+8YBagBgwAD82XeYbAAAAIOJYQBcAWoAYMAA/Nl3mHsAAADAAG6uYMAA+goBagBgwAD82XddwAC5kQFgwADi8wE+AUmYkSEcmKIWmJUugfjAAQTOSAEAASsAwAD9KT4DPTWYswAAAQBdwAC5kQFgwADi8wEWmLMugfjAAQTONQAAAAEAWwEcmMqEmMjAgDr4wABu4QEAAYCY0cCAOnkAwAC5lDUAAAABAFsBHJjjhJjhwIA6+IHrAQABgZjrwIA6jADAALmVNQAAAAEAWwEcmP6EmPzAgDr4g4kBAAGCmQXAgDqhAMAAuZaEAMCAOvhJmRQcmSUWmRguwACDasABBM9IAQABKwDAAP0pPgFKmTgBNZk/AAABAF3AALmRAWDAAOLzARaZPy6B+MABBM41AAAAAQBbARyZTYSZS8CAO6iCBAAAAADAALmYhADAgDuoP0qZZQE1mXAAAAEAYMABBLUBH5lwwAEEywMAAxaZmy6B+MABBM4WmakuwACDasABBM+AmbfAgDp5ADUAAAABAFsBHJnJhJnHwIA77IIEAAAAAMABBMeEAMCAO+w+AUqaFgEcmlAemiHAALliAQFgwADi8wExmkBgwADi8wEWmkEuwACDasABBM8AgfkEAAGAmlfAgDp5A4HrgZpywIA6jIOJgpqDwIA6ocAAbq6DmprAgDq0wAC5aAAAgDpZAIA8ngAAAAECwAEE1IL2nq2es8AAhcQDwACOygAAAV3AALlYAWDAAQHOAAAbBMABBNeC9p7ynwcYwACOy8AA/1AAYMAA+goBKgTAAQTYgvafRJ9LGJggwAD/UABgwADi8wErBMABBNmC9p9Tn1kYlxbAAP9QAGDAAPvQASsEwAEE2oL2n2mfdwnAAI7MwAD/UABgwAD6CgAEwAEE24L2n3+fhRjAAGNawAD/UABgwAD70AErBMABBNyC9p+Nn54YwACOzcAA/1AAYMAA+9ABKwTAAQTdgvafpp+yGMAAjs7AAP9QAGDAAPvQASsEwAEE3oL2n7qfyRjAAI2OwAD/UABgwAD70AGTBMABBN+C9p/Rn+YYwACOz8AA/1AAYMAA+9ABkwTAAQTggvaf+qAGCcAAYrfAAP9QAF3AAPx0AWDAAPvQATGgBGDAAPvQAATAAQThgvagGqA0CcAAjtDAAP9QAF3AAPx0AWDAAPvQATGgMmDAAPvQAATAAQTigvagSKBZCcAAjtHAAP9QAF3AAPx0AWDAAPvQATGgV2DAAPvQAATAAQTjgvagbaB+CcAAjtLAAP9QAF3AAPx0AWDAAPvQATGgfGDAAPvQAATAAQTkgvagh6CTGMAAjtPAAP9QAGDAAPvQASsEwAEE5YL2oJugrxjAAI1CwAD/UABgwAD70AEcoK2UgcQAAAAAwAD78wTAAQTmgvaguKDNGMAAjPrAAP9QAGDAAPoKASsEwAEE54L2oNag6BjAAI7UwAD/UABgwAD6CgErBMABBOiC9qDxoPkYwACO1cAA/1AAYMAA+goBKwTAAQTpgvahA6EZGMAAjtbAAP9QAGDAAPoKASoEwAEE6oL2oSGhNxjAAI7XwAD/UABgwAD70AEcoTWUgcQAAAAAwAD78wTAAQTrgvahSaFRGMAAjPbAAP9QAGDAAQEqASsEwAEE7IL2oYqhkxjAAI1KwAD/UABgwAEBzgErBMABBO2C9qG1ocgYwACDfsAA/1AAXcAAuZEBYMAA4vMBKwTAAQTugvah0aHfGMAAjtjAAP9QAGDAAPoKASkEwAEE74L2oeih+xjAAI7ZwAD/UABgwAD6CgEqBMABBPCC9qIfoioYwABu/sAA/1AAXcAAueABYMABAc4BKwTAAQTxgvaiSqJZGMAAjtrAAP9QAF3AALngAWDAAOLzASsBBcABBReC9qMCowKk/QCAtcAA/1AAA6MPpP0AAAABAQGjFQAABMAAjsxgwAD6CgAAYMABBNQBPgI9F6MrLsAAbv7AAP9QHqM9wAC57AUBYMABAc4ABZmnKcAAbso0o4QDo4SjrQAAAAAAAABgwAD82QE+AT0Xo5MuwACO2MAA/1AqwAEE7sAAbvI0o8ADo8CkCAAAAAAAAABgwAD82QE+Aj0Xo88uwACO2MAA/1ApwAEE7j0co+kuwACO28AA/1AAAAAAwAEFCcAAbss0pBwDpBykZQAAAAAAAABgwAD82QE+Aj0XpCsuwACO2MAA/1AqwAEE7j0cpEYuwACO28AA/1AAAAAAwAEFCcAAbsw0pHkDpHmk6gAAAAAAAABgwAD82QE+AUmkiCEcpKAWpIwuwACDfsAA/1DAAQTtSAEAASsAwAD9KT4BPRykyxakty7AAIN+wAD/UMABBO2cTQAAAADAALmTP8ABBPA9HKTxLsAAjtzAAP9QAAAAAMABBP4CCAHAAQTagADAgEBECQGjAsAAuY4AAAAAHgbAAQTzgvaiXqJmoqoEAcAAjt0AAAABA6J/oqoAAAAAAAAAYMABBNQBPgFKoogBH6KTwAEFFwEAASkABsABBPSC9qKvorei/QQBwACO3gAAAAEDotGi/QAAAAAAAABgwAEE1AE+AUqi2gEfouXAAQUXAQABKgAGwAEE9oL2pQKlJKYEAACB+QAAAAEDpSqmBAAAAAQBAaUwAAAAwABu4WEBYMABAc5cAAOlXQAAAIHrYMAA+8YBagBgwAD82XelawAAAIOJYQBcAWoAYMAA/Nl3pXoAAADAAG6uYMAA+goBagBgwAD82XddwAC5kQFgwAEBzgE+AUqlkAEcpaoWpaMWpZcuwABu/sAA/1DAAQTwgfXAALnigfkEAAGApbHAgEJTA4HrgaXKwIBCZoOJgqXbwIBCe8AAbq6DpfLAgEKOwAC5aAbAAQT3gvamCaYOp+cAAMAAjfQAAAABA6Ycp+cAAAABAQGmLwAAAIH1XcAAuVgBYMAA4vMAAFwBPgE9F6d/LsAAg37AAP9QHKekgKedwIBDI4H5AwABFqerLsAAb/LAAP9QwAEE/AKB6xanyRanvS7AAG7+wAD/UMABBPCcDsAAufWDiRan2y7AAG/zwAD/UMABBP3AALlowAEE7QbAAQT5gvan7KfxqG4AAMAAft/AAP9QAAAAAQOn96huAAAAAAAAAFwBPgFLPgE9HKgMLsAAjt/AAP9QAAAAAMABBPsBAageWwGoJQAAAYNNWwABqCgAAAGIQWDAAP2KAD4CPReoMy7AAGNawAD/UGqoQ2DAAPvQwABjAcABBNs9HKhSLoiFwAD/UAIAAoCoX8CAQ+aBqGLAgEPwAMABBQoGwAEE+oL2qTSpObB5AADAAI7gwAD/UAAAAAEDqUSweQAAAAAAAABgwAD6CgE+Dj0XqVYWqU0uwACM9sAA/1DAAQTrwACM98AA/1AqwAEBLj0XqW0uwACNQsAA/1AWqYgWqX8uwACM9sAA/1DAAQTrwACMNMABAVnAAQTlSaoBFqoFLsAAjtXAAP9QwAEE6D0Xqg8uwACNQsAA/1AcqiGUgcQAAAAAwAD788ABBOU/Saq+IiIcqs8WqsIuwACOzsAA/1DAAQTdSAEAAWqq32DAAPvQFQDAAPzzAByrAhaq8i7AAI1CwAD/UMABBOVjAQABkwDAAPz9AByrGharES7AAI7VwAD/UMABBOhIAQABKgDAAP0pPgE9F6ssLsAAjULAAP9Qk8ABBOU/SatLFqtPLsAAjtTAAP9QwAEE5z4CPReray7AAGNawAD/UGqre2DAAPvQwABjNMABBNs9F6uLLsAAjULAAP9Qk8ABBOU/PRyrqi7AAI7hwAD/UAEAARarui7AAI1CwAD/UMABBOUAwAEFB0mr0Bar1C7AAI7MwAD/UMABBNo+Aj0Xq/YWq+wuwACNSsAA/1DAAQTslkEerAPAAP3eAQABFqwYLsAAYrfAAP9QwAEE4ADAAQHZPResMhasKC7AAI1KwAD/UMABBOyArB6sRsAA/mUBAAEerFDAAP3eAQABFqxlLsAAjtDAAP9QwAEE4QAAwAEB2j4CPResmxaskS7AAI1KwAD/UMABBOyDUhasqC7AAI2OwAD/UMABBN7AAQHXPResxRasuy7AAI1KwAD/UMABBOyDVh6s2MAA/d4BAAEWrO0uwACO0MAA/1DAAQThAMABAdg9HK0XFq0PLsAAYrfAAP9QwAEE4IJCAAAAAMAA/I09HK06Fq0kLsAAjtDAAP9QwAEE4YJCAAAAAMAA/I1JrUcWrUsuwACO1MAA/1DAAQTnPgY9F61xFq1nLsAAjUrAAP9QwAEE7MAAjUUpwAEB1j0XrYguwACOy8AA/1AqwAEE106tqa2tAACftGDAAQHOARatry7AAI1KwAD/UMABBOw9HK3ALsAAjuLAAP9QAAAAAMABBQg9HK3kFq3YLsAAbv7AAP9QwAEE8FYBAAGArejAgEc9AMAAufRKrfQBKT9JrgsiHK4fFq4PLsAAjULAAP9QwAEE5UgBAAGTAMAA/PMBIhyuPRauMC7AAI7OwAD/UMABBN1IAQABaq5NYMAA+9AJAMAA/PMAFq5ZLsAAjtbAAP9QwAEE6T4FPRyuci7AAI7cwAD/UAAAAADAAQT+Tq6GrooAAJ+0YMABAc4BFq6MLsAAjUrAAP9QwAEE7D0crp0uwACO4sAA/1AAAAAAwAEFCD0crsEWrrUuwABu/sAA/1DAAQTwVgEAAYCuxcCASAsAwAC59Equ0QEqSa7qFq7uLsAAjtXAAP9QwAEE6D4CPRevAC7AAGNawAD/UGqvEGDAAPvQwAB7u8ABBNs9F68iLsAAjtfAAP9Qk8ABBOpJr0Qcr1gWr0guwACNQsAA/1DAAQTlgJcBAAGTAMAA/P8+Aj0Xr2UuwACO18AA/1AWr3kuwACNQsAA/1DAAQTlwAEE6j0Xr5AuwABjWsAA/1Bqr6BgwAD70MAAY2fAAQTbPgE9F7APLsAAY1rAAP9QarAfYMAA+9DAAGNnwAEE2z0XsC8uwACOy8AA/1AqwAEE1z0csFYWsEouwABu/sAA/1DAAQTwVgEAARawWi7AAI1KwAD/UMABBOwAwAC59EqwagEpBsABBPuC9rIZsh7AAGoqAADAAI7fwAD/UAAAAAEDsibAAGoqAAAAAAAAAFwBPgdAIRayNy7AAI7LwAD/UMABBNeyNrJEAD0XsksuwACOy8AA/1ApwAEE10myZRyycBayaS7AAGNawAD/UMABBNtIAQABarJ6YMAA+9DAAHDPAMAA/PM+AT0wsoofspTAAQDTAQABJ8AAjuMAP0myyhyy1Rayzi7AAGNawAD/UMABBNtIAQABarLfYMAA+9DAAGMBAMAA/PM+AT0wsvAfsvrAAQDTAQABJ8AAjuQAP0OzMCIiIiEcsz8WszcumCDAAP9QwAEE2EgBAAErAMAA/SkAHLNZFrNSLpcWwAD/UMABBNljAQABFrNjFrNbLpggwAD/UMABBNhhwAD8owDAAPz9ACEcs3wWs3UuwABjWsAA/1DAAQTbSAEAAWqzhmDAAPvQwABjAQDAAPzzACEcs6AWs5kuwABjWsAA/1DAAQTbSAEAAWqzqmDAAPvQwABjNADAAPzzPgNJtAgiIiEctBcWtA0uwACNSsAA/1DAAQTsSAEAASsAwAD9KQAWtCIuwACO2cAA/1DAAQTvASIctEcWtD0uwACNSsAA/1DAAQTsSAEAASsAwAD9KQAWtFIuwACO2MAA/1DAAQTuPgI9F7RmLsAAjsvAAP9QKsABBNdKtIUAP060n7SkAACG6mDAAPvQARy0rRa0pi6YIMAA/1DAAQTYSwEAATUAAAABAGDAAPvQARa0ri6XFsAA/1DAAQTZNQAAAAEAYMAA+9ABF7SuLpcWwAD/UBy0tIAAwIBLlmQBAAGUAMAA/PXAAQTZgADAgEuWAMAA/INBR7S/FrTHLsAAY1rAAP9QwAEE2xsBtOVqtOVgwAD70AkAPgJJtPYctP+AtPrAgEtySAEAARy1DWq1CV3AAPx0AWDAAPvQwAHi20sBAAGTAMAA/IMAwAD88z4CPRe1VS7AAI7NwAD/UJTAAQTcPRe1eC7AAGNawAD/UGq1iGDAAPvQFcABBNs+BEm17SEetfLAAQUAAQABgLX/wIBLcgA+AT0wthYftiDAAQDTAQABJ8AAjuUAPz0ctmsWtmMuwABit8AA/1DAAQTgVgEAAYC2b8CAS3IAwAD8hUm2giEWtocuwACOzMAA/1DAAQTaPgE9MLanH7axwAEA0wEAASfAAI7mAD89F7bzLsAAY1rAAP9QarcDYMAA+9BSwAEE20K3LgABt0pqt0pgwAD70BUAPgJJt3UiHLeLFrd5LsAAjs3AAP9QwAEE3GMBAAEWt5lqt5RdwAD8dAFgwAD70MAB4tthwAD8owDAAPz9ABy3toC3scCAS3JIAQABHLfEarfAXcAA/HQBYMAA+9DAAeLbSwEAARa3xS7AAI7NwAD/UMABBNwAwAD8gwDAAPzzPgE9F7gVLsAAjs3AAP9QHLgmFrgVLsAAjs3AAP9QwAEE3GQBAAGUAMAA/PXAAQTcSbg7Ihy4URa4Py7AAI7NwAD/UMABBNxIAQABFrhgarhbXcAA/HQBYMAA+9DAAeLbYcAA/KMAwAD88wAcuH2AuHjAgEtySAEAAWq4imDAAPvQwABY3gDAAPzzPgM9F7kBLsAAjs3AAP9QHLkSFrkBLsAAjs3AAP9QwAEE3GQBAAGUAMAA/PXAAQTcSbkiFrkmLsAAjszAAP9QwAEE2j4BPTC5Rh+5UMABANMBAAEnwACO5wA/PRe5kS7AAGNawAD/UGq5oWDAAPvQIcABBNs+AkW6GQG6IrokAABiYMAA+9ABkwEcuiuBuinAgE6ZYwEAARa6LS7AAI7NwAD/UMABBNwAwAD8/QGJukDAgE6ZHLpBgbpAwIBOmWQBAAGUAMAA/PU+AT0cul0WulUuwABit8AA/1DAAQTgVgEAARy6bGq6aF3AAPx0AWDAAPvQwAHi20sBAAGBum3AgE6ZAMAA/IMAwAD8hUm6jBy6lYC6kMCAS3JIAQABarqiYMAA+9CDKwDAAPzzPgE9F7q2LsAAY1rAAP9QarrGYMAA+9CBVcABBNs+BD0cuwMWuvsuwABit8AA/1DAAQTgVgEAAYC7B8CAS3IAwAD8hT0XuxwuwACO08AA/1BquzhgwAD70AnAAQTkSbtUIRa7WS7AAI7MwAD/UMABBNo+AT0wu3sfu4XAAQDTAQABJ8AAjuYAPz0Xu8suwABjWsAA/1Bqu9tgwAD70FLAAQTbQrwUAAG8MGq8MGDAAPvQIQA+Akm8URy8Zxa8VS7AAI7NwAD/UMABBNxjAQABFrx5arxwXcAA/HQBYMAA+9DAAeLqYcAA/KMAwAD8/T4CPRy8vS7AAI7owAD/UAIAAoC8xcCAS3IcvNpqvNJdwAD8dAFgwAD70MAB4upLAQABFrzbLsAAjs3AAP9QwAEE3ADAAPyDAMABBQU9F7z8LsAAjs3AAP9QHL0NFrz8LsAAjs3AAP9QwAEE3GQBAAGUAMAA/PXAAQTcSb0iIhy9OBa9Ji7AAI7NwAD/UMABBNxIAQABFr1Lar1CXcAA/HQBYMAA+9DAAeLqYcAA/KMAwAD88wAcvWiAvWPAgEtySAEAAWq9dWDAAPvQta0AwAD88z4DPRe9qC7AAI7TwAD/UGq9xGDAAPvQIcABBOQ9F73YLsAAjPrAAP9QKcABBOY9F74CLsAAjs3AAP9QHL4TFr4CLsAAjs3AAP9QwAEE3GQBAAGUAMAA/PXAAQTcSb4oIhy+Pha+LC7AAI7NwAD/UMABBNxIAQABFr5Rar5IXcAA/HQBYMAA+9DAAeLqYcAA/KMAwAD88wAcvm6AvmnAgEtySAEAAWq+e2DAAPvQswwAwAD88z4DPRe+ry7AAI7TwAD/UGq+y2DAAPvQFcABBOQ9F77fLsAAjPrAAP9QKsABBOY9F78KLsAAjs3AAP9QHL8bFr8KLsAAjs3AAP9QwAEE3GQBAAGUAMAA/PXAAQTcSb8wHL9GFr80LsAAjs3AAP9QwAEE3EgBAAEcv2AWv1lqv1BdwAD8dAFgwAD70MAB4uphwAD8o2QBAAGUAMAA/PUAwAD88z4CPRy/cy7AAI7owAD/UAIAAoC/e8CAS3Jqv4tgwAD70IMrAMABBQU9F7/ALsAAY1rAAP9Qar/QYMAA+9CE4MABBNs+AT0wwABACh/AAEAUwAEA0wEAASfAAI7mAELAAEBSAAHAAEBuasAAQG5gwAD70FIAPgJJwABAjRzAAECWgMAAQJHAgEtySAEAAWrAAECjYMAA+9CDKwDAAPzzPgE9F8AAQLUuwABjWsAA/1BqwABAxWDAAPvQgVXAAQTbPgJJwABA9iIiHMAAQQ5qwABBAV3AAPx0AWDAAPoKwAHjAUsBAAGAwABBD8CAS3IAwAD8gwEcwABBLYDAAEEowIBLckgBAAFqwABBOmDAAPvQg/UAwAD88wEcwABBVYDAAEFQwIBLckgBAAFqwABBYmDAAPvQg/IAwAD88z4BPTDAAEF2H8AAQYDAAQDTAQABJ8AAjuUAPz0cwABByxbAAEHDLsAAYrfAAP9QwAEE4FYBAAGAwABBz8CAS3IAwAD8hULAAEHsAAHAAEIIasAAQghgwAD70IFVAD4CScAAQiQcwABCLYDAAEIowIBLckgBAAFqwABCOmDAAPvQgysAwAD88z4DScAAQkwcwABCbRbAAEJmFsAAQlAuwACO0MAA/1DAAQThYcAA/KNIAQABkwDAAPzzPgE9MMAAQoMfwABCjcABANMBAAEnwACO6QA/PRfAAELNLsAAY1rAAP9QasAAQt1gwAD70II8wAEE2z0XwABDBC7AAI7NwAD/UJPAAQTcPgJJwABDOiIcwABDQ4DAAEM+wIBLckgBAAFqwABDUGDAAPvQg/UAwAD88wEcwABDW4DAAENWwIBLckgBAAFqwABDaGDAAPvQg/IAwAD88z4BPTDAAEN8H8AAQ4bAAQDTAQABJ8AAjukAPz0cwABD3BbAAEPGLsAAjtDAAP9QwAEE4VYBAAGAwABD4MCAS3IAwAD8hULAAEP9AAHAAEQZasAARBlgwAD70II8AD4CScAARD4cwABEVBbAAERCLsAAjs3AAP9QwAEE3GMBAAEWwABEZmrAAERdXcAA/HQBYMAA+9DAAeLqYcAA/KMAwAD8/T4CPRzAAER8LsAAjujAAP9QAgACgMAARITAgEtyHMAARJdqwABEkV3AAPx0AWDAAPvQwAHh1ksBAAEWwABEmC7AAI7NwAD/UMABBNwAwAD8gwDAAQUFPRfAAES5LsAAjs3AAP9QHMAARMoWwABEuS7AAI7NwAD/UMABBNxkAQABlADAAPz1wAEE3EnAAETfHMAARPUWwABE4y7AAI7NwAD/UMABBNxIAQABFsAARQhqwABE/13AAPx0AWDAAPvQwAHi6mHAAPyjAMAA/PM+AUnAAEUeHMAARSeAwABFIsCAS3JIAQABasAARTRgwAD70LWtAMAA/PM+Az0XwABFay7AAI7TwAD/UGrAAEWHYMAA+9AhwAEE5D0XwABFnS7AAIz6wAD/UCnAAQTmPRfAAEXJLsAAjs3AAP9QHMAARdoWwABFyS7AAI7NwAD/UMABBNxkAQABlADAAPz1wAEE3EnAAEXxHMAARfqAwABF9cCAS3JIAQABasAARgdgwAD70LMMAMAA/PM+Az0XwABGPy7AAI7TwAD/UGrAAEZbYMAA+9AVwAEE5D0XwABGcS7AAIz6wAD/UCrAAQTmPRfAAEaeLsAAjs3AAP9QHMAARq8WwABGni7AAI7NwAD/UMABBNxkAQABlADAAPz1wAEE3D4BPTDAAEbWH8AARuDAAQDTAQABJ8AAjuYAPgFJwABHNRzAAEc+gMAARznAgEtySAEAAWrAAEdLYMAA+9CD9QDAAPzzPgE9F8AAR18uwABjWsAA/1BqwABHb2DAAPvQhAjAAQTbPgM9HMAAR6cuwACO6MAA/1ACAAKAwABHr8CAS3JqwABHv2DAAPvQg/IAwAEFBT0XwABH0i7AAI7OwAD/UGrAAEfuYMAA+9AVwAEE3T0XwABIBS7AAGNawAD/UGrAAEgVYMAA+9CD8sABBNtCwABIRwABwABIY2rAAEhjYMAA+9CECAA+BD0cwABIgi7AAI7owAD/UAIAAoDAAEiKwIBLcmrAAEiaYMAA+9CD8gDAAQUFPRfAAEipLsAAjs7AAP9QasAASMVgwAD70BXAAQTdPRfAAEjYLsAAY1rAAP9QasAASOhgwAD70IPywAEE20LAAEkAAAHAAEkcasAASRxgwAD70ITgAD4CScAASUEcwABJSoDAAElFwIBLckgBAAFqwABJV2DAAPvQgysAwAD88z4BPRfAAElpLsAAY1rAAP9QasAASXlgwAD70IM+wAEE20nAAEmnHMAASbCAwABJq8CAS3JIAQABasAASb1gwAD70IP1AMAA/PM+AT0XwABKRC7AAGNawAD/UGrAAEpUYMAA+9CD78ABBNs+Aj0XwABKiS7AAI7PwAD/UBzAAEqaFsAASokuwACOz8AA/1DAAQTfZAEAAZQAwAD89cABBN9JwABKqiIiHMAASrSAwABKr8CAS3JjAQABNzAAwAD8/QAcwABKwzc5YwEAAYDAAErFwIBLcgDAAPz9ARzAAErgFsAASs4uwACOz8AA/1DAAQTfgJcBAAGWAMAA/P8+AT0wwABK9R/AAEr/wAEA0wEAASfAAI7qAD4BPRfAAEtRLsAAjY7AAP9QHMAAS3ccwABLcBzAAEtrFsAAS18uwACNjsAA/1DAAQTeg4gBAAE3CgDAAPz3ZAEAAYDAAEtywIBLcgDAAPz1gY0BAAE3MADAAPz2wAEE3kLAAEujAAHAAEu/asAAS79gwAD70IM+AD4CScAAS+YcwABL74DAAEvqwIBLckgBAAFqwABL/GDAAPvQg/UAwAD88z4BPRfAAEwOLsAAY1rAAP9QasAATB5gwAD70IPvwAEE2z4CScAATFMiHMAATFyAwABMV8CAS3JIAQABasAATGlgwAD70IP1AMAA/PMBHMAATHSAwABMb8CAS3JIAQABasAATIFgwAD70IPyAMAA/PM+AT0wwABMlR/AAEyfwAEA0wEAASfAAI7rAD89HMAATQAWwABM6i7AAI7QwAD/UMABBOFWAQABgMAATQTAgEtyAMAA/IVCwABNIQABwABNPWrAAE09YMAA+9CD7wA+BT0cwABNXS7AAI7owAD/UAIAAoDAAE1lwIBLcmrAAE11YMAA+9CD8gDAAQUFPRzAAE2RFsAATYQuwACOzsAA/1DAAQTdSAEAAWrAAE2hYMAA+9AJAMAA/PNJwABNtSIcwABNxRbAAE25LsAAjY7AAP9QwAEE3mMBAAE3ZADAAPz9ARzAAE3aFsAATc4uwACNjsAA/1DAAQTegJcBAAE3glcAwAD8/z4BPTDAAE3vH8AATfnAAQDTAQABJ8AAjuoAPgFJwABOiiIiHMAATpoWwABOji7AAI2OwAD/UMABBN6BawEAATeAxwDAAPz+ARzAAE7AFsAATrQuwACNjsAA/1DAAQTeSAEAATeAzADAAPzzARzAAE7mFsAATtouwACNjsAA/1DAAQTeSAEAATeBMADAAPzzPgE9F8AATv4uwACO1sAA/1ApwAEE6T89F8AATzkuwABjWsAA/1BqwABPSWDAAPvQg/LAAQTbQsAAT2EAAcAAT31qwABPfWDAAPvQg/IAPgM9F8AAT5UuwACM9sAA/1AfwABPpMABAWwBAAEWwABPsS6B48ABBQ4AwAEE60nAAE/FHMAAT86AwABPycCAS3JIAQABasAAT9tgwAD70IP1AMAA/PM+AT0XwABP7S7AAGNawAD/UGrAAE/9YMAA+9CDUcABBNtJwABQHRzAAFAmgMAAUCHAgEtySAEAAWrAAFAzYMAA+9CD8gDAAPzzPgI9F8AAUEUuwABjWsAA/1BqwABQVWDAAPvQg1HAAQTbPRfAAFBwLpcWwAD/UBzAAFB2FsAAUHAulxbAAP9QwAEE2YGNAQABlADAAPz2wAEE2T4CPRzAAFD4FsAAUOsuwACO0cAA/1DAAQTiVgEAAR7AAFD8wAEFAwEAAYDAAFENwIBLcgAAwAD8hT0XwABRIS7AAGNawAD/UGrAAFExYMAA+9DAAI0kwAEE20LAAFFVAAHAAFFxasAAUXFgwAD70MAAjSQAPgJJwABRiRzAAFGSgMAAUY3AgEtySAEAAWrAAFGfYMAA+9CVjwDAAPzzPgE9F8AAUbQuwABjWsAA/1BqwABRxGDAAPvQwACMW8ABBNs+AknAAFH3IR7AAFH8wAEFAAEAAYDAAFIJwIBLcgA+AT0wwABSIB/AAFIqwAEA0wEAASfAAI7sAD89HMAAUn0WwABScC7AAI7RwAD/UMABBOJWAQABHsAAUoHAAQUDAQABgMAAUpLAgEtyAADAAPyFQsAAUrAAAcAAUsxqwABSzGDAAPvQwACMWwA+AknAAFLqHMAAUvOAwABS7sCAS3JIAQABasAAUwBgwAD70IP1AMAA/PM+AT0XwABTEi7AAGNawAD/UGrAAFMiYMAA+9DAAIPBwAEE20nAAFNTHMAAU1yAwABTV8CAS3JIAQABasAAU2lgwAD70IPyAMAA/PM+AT0XwABTey7AAGNawAD/UGrAAFOLYMAA+9DAAIFywAEE20nAAFO2IiEcwABTv4DAAFO6wIBLckgBAAFqwABTzGDAAPvQgysAwAD88wAhHMAAU9eAwABT0sCAS3JIAQABasAAU+RgwAD70IPvAMAA/PM+Aj0cwABULRbAAFQgLsAAjtLAAP9QwAEE41YBAAGAwABUMcCAS3IAwAD8hT0XwABURC7AAGNawAD/UGrAAFRUYMAA+9CD9cABBNs/QsAAVHgAAcAAVJRqwABUlGDAAPvQg/UAPgJJwABUrBzAAFS1gMAAVLDAgEtySAEAAWrAAFTCYMAA+9CD9QDAAPzzPgE9F8AAVNQuwABjWsAA/1BqwABU5GDAAPvQwACDwcABBNtJwABVFRzAAFUegMAAVRnAgEtySAEAAWrAAFUrYMAA+9CD8gDAAPzzPgE9F8AAVT0uwABjWsAA/1BqwABVTWDAAPvQwACBcsABBNs+AT0cwABVkxbAAFWGLsAAjtLAAP9QwAEE41YBAAGAwABVl8CAS3IAwAD8hULAAFW0AAHAAFXQasAAVdBgwAD70MAAg8EAPgM9HMAAVfouwACO6MAA/1ACAAKAwABWAsCAS3JqwABWEmDAAPvQg/IAwAEFBT0XwABWIS7AAGNawAD/UGrAAFYxYMAA+9DAAIFywAEE20LAAFZVAAHAAFZxasAAVnFgwAD70MAAgXIAPgJJwABWlSIcwABWnoDAAFaZwIBLckgBAAFqwABWq2DAAPvQgysAwAD88wEcwABWtoDAAFaxwIBLckgBAAFqwABWw2DAAPvQg+8AwAD88z4BPRfAAFbVLsAAY1rAAP9QasAAVuVgwAD70MAAjFvAAQTbPgdOwABXH8AAVysAAMAAju1gwAD9tgEewABXMcAA/d4BAAEWwABXRi7AAI7RwAD/UMABBOIATsAAV2jAAFd0AADAAI0eYMAA/bYBHsAAV3rAAP3eAQABFsAAV48uwACO0sAA/1DAAQTjAEnAAFeqIhzAAFe6gcAAV67AgGJlSAEAASfAAIu3AMAA/cUAHMAAV+QuwACO7sAA/1ACAAIWwABYBifAAI0Bn6PAAP2+FsAAWBEuwACO0sAA/1DAAQTjAMABBQQ+AT0XwABYMC7AAI7VwAD/UCnAAQToP0nAAFhbHMAAWGuBwABYX8CAYmVIAQABJ8AAg2MAwAD9xT4ETsAAWJnAAFigAACVNF3AAPx0AWDAAP22AR7AAFiiwAEFAgEAAYLAAFi2wIBimQBOwABY3cAAWOgAAcAAju9gwAD6CgEcwABY9xbAAFjqLsAAjs7AAP9QwAEE3UgBAAFqwABZB2DAAPvQCQDAAPzzTsAAWSrAAFk4AAHAAI7wYMAA+goBIhzAAFlZFsAAWU0uwACNjsAA/1DAAQTeSAEAAWrAAFlnYMAA+9DAAX1AAMAA/PMBHMAAWZ4WwABZki7AAI2OwAD/UMABBN5IAQABasAAWaxgwAD70MAAkR8AwAD880XAAFnPAcAAWdjAAFnaAABiYMAA+9ABkwEcwABZ4YbAAFnfwIBkSWMBAAEWwABZ6oPAAFnjwIBjYmHAAPyjAMAA/P0BjsAAWfLAgGRJHMAAWfOGwABZ8sCAZElkAQABlADAAPz1PgNOwABaFMAAWh4AAcAAjvFgwAD6CgEcwABaIC7AAI7uwAD/UAIAAhbAAFpXJ8AAi7mfo8AA/b4WwABabBzAAFpog8AAWmLAgGNiSwEAAYbAAFppwIBkSQDAAPyDn6PAAP2+AMABBQRJwABaiCIih8AAWo3AgGSrACGEwABam8CAY5EBIiKHwABav8CAZKsAhMAAWszAgGORAIXAAFrawIBj0T4BPRfAAFr+LsAAjtTAAP9QKcABBOc/PRzAAFtEFsAAWzsuwACM9sAA/1DAAQTrs27AAP9QAgACgcAAW0nAgGJlHMAAW1yDwABbVsCAY2JLAQABhsAAW13AgGRJAMAA/IMAwAEBPT4BPRzAAFueFsAAW5UuwACM9sAA/1DAAQTrs27AAP9QAgACgcAAW6PAgGJlgsAAW7DAgGKZAMABAT09HMAAW+UWwABb2C7AAI7RwAD/UMABBOKCQgAAAADAAPyNPRzAAFwHFsAAW/ouwACO0sAA/1DAAQTjgkIAAAAAwAD8jUnAAFwdHMAAXCaAwABcIcCAS3JIAQABasAAXDNgwAD70IP1AMAA/PM+AT0XwABcRy7AAGNawAD/UGrAAFxXYMAA+9CDUcABBNtJwABceRzAAFyCgMAAXH3AgEtySAEAAWrAAFyPYMAA+9CD8gDAAPzzPgI9F8AAXKMuwABjWsAA/1BqwABcs2DAAPvQg1HAAQTbPRfAAFzQLpcWwAD/UBzAAFzWFsAAXNAulxbAAP9QwAEE2YGNAQABlADAAPz2wAEE2T4CPRzAAF1eFsAAXVEuwACO0cAA/1DAAQTiVgEAAR7AAF1iwAEFAwEAAYDAAF1zwIBLcgAAwAD8hT0XwABdiS7AAGNawAD/UGrAAF2ZYMAA+9DAAI0kwAEE20LAAF3LAAHAAF3nasAAXedgwAD70INRAD4DPRzAAF4ALsAAjujAAP9QAgACgMAAXgjAgEtyasAAXhhgwAD70IPyAMABBQVJwABeJxzAAF4rLsAAjuDAAP9QAAAAAMABBPo+AUrAAF5IAD4BQsAAXm8ASsAAXowAAcAAXqlqwABeqWDAAPvQwAB8egA+Az0cwABeyy7AAI7owAD/UAIAAoDAAF7TwIBLcmrAAF7jYMAA+9CD9QDAAQUFPRfAAF7yLsAAY1rAAP9QasAAXwJgwAD70MAAfVDAAQTbQsAAXyQAAcAAX0BqwABfQGDAAPvQwAB9UAA+Az0cwABfYi7AAI7owAD/UAIAAoDAAF9qwIBLcmrAAF96YMAA+9CD8gDAAQUFPRfAAF+JLsAAY1rAAP9QasAAX5lgwAD70MAAe7vAAQTbQsAAX68AAcAAX8tqwABfy2DAAPvQwAB7uwA+AknAAF/hHMAAX+qAwABf5cCAS3JIAQABasAAX/dgwAD70IP1AMAA/PM+AT0XwABgCS7AAGNawAD/UGrAAGAZYMAA+9DAAHWXwAEE20nAAGA9HMAAYEaAwABgQcCAS3JIAQABasAAYFNgwAD70JMxAMAA/PM+AT0XwABgbS7AAGNawAD/UGrAAGB9YMAA+9DAAGmtwAEE2z4CTsAAYLbAAGC8AACAlmDAAPvQARzAAGC+LsAAjvLAAP9QAQABgMAAYM7AgEtyAMABBQY9F8AAYOEuwACO18AA/1AcwABhDBzAAGEHFsAAYPUuwACO18AA/1DAAQTqg4gBAAE3EADAAPz3ZAEAAYHAAGEOwIBpRADAAPz1wAEE6kLAAGErAAHAAGFHasAAYUdgwAD70MAAaa0APgJJwABhZxzAAGFwgMAAYWvAgEtySAEAAWrAAGF9YMAA+9CD9QDAAPzzPgE9F8AAYY8uwABjWsAA/1BqwABhn2DAAPvQwAB1l8ABBNs/QsAAYcgAAcAAYeRqwABh5GDAAPvQwAB1lwA+Az0cwABiAS7AAI7owAD/UAIAAoDAAGIJwIBLcmrAAGIZYMAA+9CD8gDAAQUFScAAYigcwABiPhbAAGIsLsAAjtfAAP9QwAEE6oCXAQABkwDAAPz/PgE9F8AAYlEuwABjWsAA/1BqwABiYWDAAPvQwABjZ8ABBNs+AT0XwABihi7AAGNawAD/UGrAAGKWYMAA+9DAAHUMwAEE20LAAGLCAAHAAGLeasAAYt5gwAD70MAAdQwAPgM9HMAAYv4uwACO6MAA/1ACAAKAwABjBsCAS3JqwABjFmDAAPvQg/UAwAEFBT0XwABjJS7AAGNawAD/UGrAAGM1YMAA+9DAAGQgwAEE20LAAGNVAAHAAGNxasAAY3FgwAD70MAAZCAAPgQ9HMAAY5EuwACO6MAA/1ACAAKAwABjmcCAS3JqwABjqWDAAPvQg/IAwAEFBT0cwABjuC7AAI7cwAD/UAAAAADAAQT+PRzAAGPMLsAAjuLAAP9QAAAAAMABBQhCwABj6AABwABkBGrAAGQEYMAA+9DAAGNnAD4JPRfAAGRbLpcWwAD/UBzAAGRhFsAAZFsulxbAAP9QwAEE2YGNAQABlADAAPz2wAEE2U7AAGRzwABkgQAAwACO82DAAPvQARzAAGSSFsAAZIsWwABkgy6YIMAA/1DAAQTYYcAA/KOBjQEAARbAAGSULpcWwAD/UMABBNkAwAD89knAAGSmIhzAAGS8FsAAZKouwACO18AA/1DAAQTqgW0BAAGTAMAA/QAAHMAAZNKBwABkxMCAbAyAlwEAARbAAGTULsAAjtfAAP9QwAEE6gDAAPz/PgE9icAAZPXAgGwMFsAAZQUuwACO18AA/1DAAQTqP07AAGYRwABmFgAAEmDAAOLzAR7AAGYcwADi+QMAAxbAAGZCFsAAZjoumCDAAP9QwAEE2IKLwADiuBzAAGZgFsAAZlIWwABmSi6YIMAA/1DAAQTYqG7AAOK2ZAEAARbAAGZiLpcWwAD/UMABBNkAwAD89YHAAGZqwIBsDAA9HMAAZpQWwABmhC7AAI7awAD/UMABBPFWAQABgsAAZpjAgGzMAMAAufRJwABmqSEcwABmvxbAAGatLsAAjtfAAP9QwAEE6kgBAAEcwABmwpSBxAAAAADAAPvzAMAA/PM+AT0XwABm1C7AAI7XwAD/UBzAAGbmFsAAZtQuwACO18AA/1DAAQTqgY0BAAEWwABm7oLAAGbpwIBszGHAAPyjAMAA/PbAAQTqPz0XwABnDC6XFsAA/1AcwABnExbAAGcMLpcWwAD/UMABBNlkAQABFsAAZxuCwABnFsCAbMxhwAD8owDAAPz1wAEE2UnAAGctHMAAZ0MWwABnMS7AAI7XwAD/UMABBOpIAQABkwDAAPzzPgFJwABnVyEWwABnXC7AAI7VwAD/UMABBOg+Aj0cwABndi7AAI7cwAD/UAAAAADAAQT+PRzAAGeOLsAAjuLAAP9QAAAAAMABBQg+AT0XwABnwy7AAGNawAD/UGrAAGfTYMAA+9DAAHx6wAEE2z9CwABoDwABwABoK2rAAGgrYMAA+9DAAGMBAD4CQCrAAGhpwABobgBCwABoewAAAT4CQCrAAGjJwABozgBCwABo2wA9F8AAaPUuwACOy8AA/1AqwAEE10nAAGkQIiEcwABpHBbAAGkULpggwAD/UMABBNhIAQABKwDAAP0pABzAAGkuFsAAaSculxbAAP9QwAEE2UgBAAEWwABpORbAAGkxLpggwAD/UMABBNhhwAD8owDAAPzzPgI9HMAAaZ8uwACO9MAA/1AAAAAAwAEE/0nAAGm3IiEcwABpwhbAAGm7LsAAY1rAAP9QwAEE20gBAAFqwABpzGDAAPvQwABjNADAAPzzACEcwABp3xbAAGnYLsAAY1rAAP9QwAEE20gBAAFqwABp6WDAAPvQwABjAQDAAPzzPgE9HMAAahAWwABp/C7AAIN+wAD/UMABBO2CBAAAAADAALmYPz8GwAEE/IL2wABqL8AAajTAAGrEAADAAG/ywAD/UAAAAAEDwABqO8AAasQAAAABAQHAAGpGAAAAgotgwADi8wAAXAE+BT0cwABqaBbAAGpULsAAg37AAP9QwAEE7YH7AAAAAMAAuZdAHMAAaoQWwABqfC6YIMAA/1DAAQTYSAEAASsAwAD9KcAAanzAAGqLAD0XwABqki6YIMAA/1CAwABqnMCAcFDAAQTYPRfAAGqoLpcWwAD/UJPAAQTZPRzAAGq4LsAAft/AAP9QAAAAAMABBPkGwAEE/YL2wABqycAAas7AAHEGAADAAG/zwAD/UAAAAAEDwABq1cAAcQYAAAAAAAAAXAE+CD0XwABrBi7AAIN+wAD/UCvAAQTtScAAayYiHMAAazEWwABrKi7AAGNawAD/UMABBNtIAQABasAAaztgwAD70MAAcM8AwAD88wEcwABrTBbAAGtFLsAAY1rAAP9QwAEE20gBAAFqwABrVmDAAPvQwABjAQDAAPzzSsAAa18AP0nAAGtsIRzAAGt6FsAAa3AuwACNSsAA/1DAAQTsSAEAASsAwAD9KT4EScAAa4siIiEcwABrlhbAAGuPLsAAY1rAAP9QwAEE20gBAAFqwABroGDAAPvQwABjNADAAPzzACEiHMAAa78WwABruC7AAGNawAD/UMABBNtIAQABasAAa8lgwAD70AkAwAD88wAhFsAAa9MuwACOzMAA/1DAAQTaACEiIhzAAGv5FsAAa/IuwABjWsAA/1DAAQTbSAEAAWrAAGwDYMAA+9DAAGNnAMAA/PMAIRbAAGwMLsAAjtXAAP9QwAEE6AAcwABsKBbAAGwYLsAAjULAAP9QwAEE5UgBAAEcwABsK5SBxAAAAADAAPvzAMAA/PM+AT0cwABsShbAAGw6LsAAjtrAAP9QwAEE8ZwOAQABH8AAbGTAAQDTAQABJ8AAjvUAAMAAufU/PRzAAGysLsAAjuLAAP9QAQABKQDAAQUIPRzAAGzUFsAAbMguwABu/sAA/1DAAQTwgogAAAAAwAC59krAAGzjAD9JwABtMRzAAG08FsAAbTUuwABjWsAA/1DAAQTbSAEAAWrAAG1GYMAA+9AJAMAA/PM+A0nAAG1VIRbAAG1aLsAAjszAAP9QwAEE2j4BPRzAAG10LoiFwAD/UAEAAR/AAG2FwAEA0wEAASfAAI72AADAAQUKPz0cwABt8RbAAG3lLsAAbv7AAP9QwAEE8IKIAAAAAMAAufZKwABuAAA/ScAAbhMcwABuHhbAAG4XLsAAY1rAAP9QwAEE20gBAAFqwABuKGDAAPvQwABjNADAAPzzPgI9HMAAbkYWwABuOi7AAG7+wAD/UMABBPCCiAAAAADAALn2SsAAblUAP0nAAG5oHMAAbnMWwABubC7AAGNawAD/UMABBNtjAQABasAAbnxgwAD70MAAfHoAwAD8/T4EPRfAAG6WLsAAY1rAAP9QasAAbqZgwAD70MAAYwHAAQTbPRzAAG8WLoiFwAD/UAEAAR/AAG8nwAEA0wEAASfAAI72AADAAQUKPRzAAG+JFsAAb30uwABu/sAA/1DAAQTwgogAAAAAwAC59krAAG+YAD9JwABvqyIhFsAAb7AuwACO1cAA/1DAAQToABzAAG/MFsAAb7wuwACNQsAA/1DAAQTlSAEAARzAAG/PlIHEAAAAAMAA+/MAwAD88z4BPRfAAG/bLsAAY1rAAP9QasAAb+tgwAD70MAAcM/AAQTbPgI9F8AAcAYuwABjWsAA/1BqwABwFmDAAPvQwABjAcABBNs9HMAAcIYuiIXAAP9QAQABH8AAcKLAAQDTAQABJ8AAjvcAAMABBQo9HMAAcPsWwABw7y7AAG7+wAD/UMABBPCCiAAAAADAALn2BsABBQ6C9sAAcQvAAHEWwABxwQEAgeMAAAABA8AAcR7AAHHBAAAAAAAAAGDAAP22AT4CR8AAcSQWwABxLC7AAI7TwAD/UMABBOQCAcAAcVRqwABxVGDAAPvQFQA+AUrAAHFkASfAAEWgAcAAcYpqwABximDAAPvQIQA+AUrAAHGaASfAAI0CSsAAcbIBKwbAAQUPgvbAAHHGwABxzsAAcekBAMAAjvgAAAABA8AAcdrAAHHpAAAAAAAAAGDAAPvQAUrAAHHdARbAAHHdLsAAjs7AAP9QwAEE3QbAAQUQgvbAAHHtwABx9cAAchYBAMAAjUcAAAABA8AAcgTAAHIWAAAAAAAAAGDAAPvQAUrAAHIHARbAAHIHLsAAjULAAP9QwAEE5QbAAQURgvbAAHIawAByI8AAcl0BAMAAi7kAAAABA8AAcivAAHJdAAAAAAAAAGDAAPoKAUrAAHIuASIWwAByLi7AAI7UwAD/UMABBOcAHMAAcksWwAByRC7AAGNawAD/UMABBNtIAQABasAAclVgwAD70MAAYzQAwAD88wbAAQUSgvbAAHJhwAByasAAcpcBAJ42AAAAAQPAAHJ/wABylwAAAAAAAABgwAD6CgFKwAByggEWwABygi7AAIz6wAD/UMABBOYGwAEFFIL2wABynMAAcqXAAHLiAgDAAI3/AAAAAQPAAHKrwABy4gAAAAEBAcAAcrEAAACAlmDAAPoKAABcAT4BScAAcr6AwABywsCAd8M9F8AAcskuwACO1sAA/1ApwAEE6T8GwAEFC4L2wABy58AAcv3AAHOwAADAAI4HAAAAAQPAAHMLwABzsAAAAAAAAABgwAEEzAE+Aj0XwABzRS7AAGNawAD/UGrAAHNVYMAA+9DAAGM0wAEE20rAAHNjAR/AAHNuwAEE0wIAAhbAAHOELsAAg37AAP9QwAEE7RzAAHOZLsAAjvkAAAAAwAEFDAAGwAEFDIL2wABztcAAc7/AAHR+AADAAI75AAAAAQPAAHPPwAB0fgAAAAAAAABgwADi8wE+BUnAAHPYHMAAc+QWwABz3C6YIMAA/1DAAQTYSAEAASsAwAD9KUrAAHPtASs/ScAAc/4cwAB0CRbAAHQCLpcWwAD/UMABBNlIAQABFsAAdBQWwAB0DC6YIMAA/1DAAQTYYcAA/KMAwAD880rAAHQcASs/TsAAdDHAAHQ4AACBdmDAAOLzARzAAHRCFsAAdDoumCDAAP9QwAEE2IFYAQABFsAAdEoulxbAAP9QwAEE2QDAAOL8PRzAAHRXLsAAjvTAAP9QAAAAAMABBP9KwAB0bQGAwAB0dMCAeS4GwAEE/oL2wAB0g8AAdIjAAHaXAADAAI7cwAD/UAAAAAEDwAB0jsAAdpcAAAAAAAAAXAE+EUnAAHSXHMAAdKIWwAB0my7AAGNawAD/UMABBNtIAQABasAAdKxgwAD70MAAYzQAwAD880rAAHS2AD89F8AAdMIuwABjWsAA/1BqwAB00mDAAPvQCcABBNs9F8AAdN0uwACOzsAA/1BqwAB0+WDAAPvQCcABBN09HMAAdRgWwAB1Cy7AAI7RwAD/UMABBOKCQgAAAADAAPyNPRzAAHUyFsAAdSUuwACO0sAA/1DAAQTjgkIAAAAAwAD8jT0cwAB1RxbAAHU/LsAAYrfAAP9QwAEE4IJCAAAAAMAA/I09HMAAdWoWwAB1VC7AAI7QwAD/UMABBOGCQgAAAADAAPyNPRfAAHV4LsAAjY7AAP9Qk8ABBN49F8AAdY0uwACOz8AA/1CTwAEE3z0XwAB1qS7AAI7TwAD/UGrAAHXFYMAA+9AJwAEE5D0XwAB11y7AAI1CwAD/UBzAAHXplIHEAAAAAMAA+/PAAQTlPRfAAHXxLsAAjPrAAP9QKsABBOY9F8AAdhQuwACO1MAA/1AqwAEE5z0XwAB2NC7AAI7VwAD/UCrAAQToPRfAAHZLLsAAjtbAAP9QKsABBOk9F8AAdmcuwACO18AA/1AcwAB2e5SBxAAAAADAAPvzwAEE6j0XwAB2hC7AAIz2wAD/UCvAAQTrBsABBP+C9sAAdpzAAHahwAB23QAAwACO9MAA/1AAAAABA8AAdq/AAHbdAAAAAAAAAFwBPgI9F8AAdrgumCDAAP9QK8ABBNg9F8AAdswulxbAAP9QK8ABBNkGwAEFAIL2wAB24sAAdu7AAHdMAAHAAI76wAD/UAAAAAEDwAB2+sAAd0wAAAABAQHAAHb/AAAAhupgwAD70AAAYMAA+goBPgFKwAB3CwEiIhzAAHcXgMAAdxLAgHxBgJcBAAE3HwDAAPz/ABzAAHckgMAAdx/AgHxBYwEAATeAgADAAPz9ACEcwAB3QmrAAHc1XcAA/HQBYMAA+grAAeMBSwEAAYDAAHdDwIB8QQDAAPyDBsABBQGC9sAAd1HAAHddwAB34gABwACO+8AA/1AAAAABA8AAd2nAAHfiAAAAAQEBwAB3bgAAAIbqYMAA+9AAAGDAAPoKAT4BSsAAd3oBIiIiHMAAd4eAwAB3gsCAfPOAlwEAATcfAMAA/P8AHMAAd5SAwAB3j8CAfPNjAQABN4CAAMAA/P0BHMAAd6yAwAB3p8CAfPNIAQABasAAd7lgwAD70IMrAMAA/PMBHMAAd86AwAB3ycCAfPNIAQABasAAd9tgwAD70IPvAMAA/PMGwAEFAoL2wAB358AAd/vAAHnhAAHAAI78wAD/UAAAAAEDwAB4DsAAeeEAAAABAQHAAHgWAAAAwACNHmDAAP22AABdwAD8dAFgwAD9tgE+Bk7AAHg2wAB4PQAAlTRdwAD8dAFgwAD9tgEewAB4Q8AA924BAWDAAP22AZMATsAAeFvAAHhhAABqYMAA+9ABk07AAHhuwAB4dAAAJ2DAAPvQAZNDwAB4fRzAAHiKg8AAeITAgH4hYwEAARbAAHiYgMAAeIzAgH3BYcAA/boAwAD8/T4CScAAeKgcwAB4vxzAAHi3gMAAeKzAgH3BSwEAAYPAAHi4wIB+IQDAAP3DSAEAASeApwDAAP3FPgI9HMAAeNiBwAB40cCAfeJWAQABHMAAeOiAwAB43MCAfcGAvgIAAoLAAHjywIB+DoPAAHj5wIB+IQDAAP3MAMAA/IU9isAAeQrAgH4OHMAAeRiDwAB5EsCAfiFkAQABlADAAPz1ScAAeSoiHMAAeUEcwAB5OYDAAHkuwIB9wUsBAAGDwAB5OsCAfiEAwAD9w0gBAAEngNkAwAD9xQEcwAB5XhzAAHlWgMAAeUvAgH3BSwEAAYPAAHlXwIB+IQDAAP3DSAEAASeDpwDAAP3FPgE9isAAeXHAgH4OHMAAeXaCwAB5ccCAfg5kAQABlADAAPz1Pz2LwAB5iMCAfiEcwAB5jYPAAHmIwIB+IWQBAAGUAMAA/PU9HMAAeaKBwAB5m8CAfeJWAQABHMAAebKAwAB5psCAfcGAvgIAAoLAAHm8wIB+DoPAAHnDwIB+IQDAAP3MAMAA/IVKwAB50AGBwAB518CAfeIGwAEFA4L2wAB55sAAefHAAHsBAAHAAI79wAD/UAAAAAEDwAB6AcAAewEAAAABAQHAAHoGAAAAg3tgwAD70AAAYMAA+9ABPgFKwAB6ywEjHMAAeuccwAB63xzAAHrXgMAAetXAgIAxgY0BAAE3QQDAAPz2g3cBAAE3fwDAAPvoYwEAATcaAMAA/P0cwAB68oDAAHrwwICAMYEGAQABNyAAwAD76YDAAHr8wICAMQFgwAD70AbAAQUEgvbAAHsxwAB7NsAAfDgAAMAAju7AAP9QAAAAAQPAAHtNwAB8OAAAAAICAsAAe1gAAACcvl3AAPx0AWDAAPvQAMAAe2wAAACAll3AAPx0AWDAAPvQAABgwAD6CgE+A0nAAHt5IRzAAHuNFsAAe4aAwAB7fcCAgORhwAD8o0gBAAEWwAB7loHAAHuQwICA+WHAAPyjAMAA/PNKwAB7ngEqP0XAAHuwAcAAe7nAAHu7AABiYMAA+9ABkwEcwAB7woLAAHvAwICBX2MBAAEWwAB7zYDAAHvEwICA5GHAAPyjAMAA/P0BisAAe9XAgIFfHMAAe9aCwAB71cCAgV9kAQABlADAAPz1PgFJwAB74iEcwAB78hzAAHvugMAAe+bAgIDkSwEAAYLAAHvvwICBXwDAAPyDSAEAAR7AAHv1wAEFAwEAARzAAHwLgcAAfAbAgID5SwEAAYLAAHwMwICBXwDAAPyDAADAAPzzSsAAfBEBKj9KwAB8KQEpBsABBQWC9sAAfD3AAHxBwAB8tgAAwACO6MAA/1AAAAABA8AAfEjAAHy2AAAAAgICwAB8TQAAAMAAjv5gwAD70ADAAHxXAAAAwACO/2DAAPvQAABgwAD70AE+AUnAAHxjIRzAAHxsgMAAfGfAgIJgSAEAAYHAAHxvwICCcQDAAPzzPgE9MMAAfH0fwAB8h8ABANMBAAEnwACPAAA/BsABBQaC9sAAfLvAAHy/wAB+IAAAwACO8sAA/1AAAAABA8AAfM7AAH4gAAAAAQEBwAB80wAAAIbqYMAA+9AAAGDAAPvQAT4BScAAfN8iHMAAfOg3MIFrAQABgMAAfOvAgIL8AMAA/P4AHMAAfPiAwAB888CAgvyBawEAATc5AMAA/P4+AUrAAH0JARzAAH0VgMAAfRDAgIL8gY0BAAE3MADAAPz2ScAAfTEiHMAAfTo3QYFrAQABgMAAfT3AgIL8AMAA/P4AHMAAfUqAwAB9RcCAgvyBawEAATdGAMAA/P4+AUrAAH1bARzAAH1uHMAAfWeAwAB9YsCAgvyBjQEAATdBAMAA/PZkAQABNwoAwAD89UnAAH2IIhzAAH2RN2GBawEAAYDAAH2UwICC/ADAAPz+ABzAAH2hgMAAfZzAgIL8gWsBAAE3ZgDAAPz+PgFKwAB9sgEcwAB9xRzAAH2+gMAAfbnAgIL8gY0BAAE3YQDAAPz2ZAEAATcKAMAA/PU+AT0wwAB95x/AAH3xwAEA0wEAASfAAI8AAAbAAQUHgvbAAH4lwAB+KsAAgp8AAMAAjuHAAP9QAAAAAQPAAH45wACCnwAAAAEBAcAAfj4AAADAAI1HYMAA+9AAAFwBPghAHMAAfmUWwAB+Wy7AAI1KwAD/UMABBOxIAQABKwDAAP0pwAB+W8AAfmwAQBzAAH6KFsAAfnouwACO2sAA/1DAAQTxSAEAASsAwAD9KcAAfnrAAH6RAEAhFsAAfqAuwACO2cAA/1DAAQTvwAB+n8AAfqsATsAAfrYAAADAAI3KWwA9F8AAfsQuwACO2sAA/1AewAB+2sAAuewFAWDAAOLzAAWZpynAAG7KNMAAfx0DwAB/HcAAf7YAAAAAAAAAYMAA/NkBPgRJwAB/LCEcwAB/OYHAAH8wwICFH0gBAAEWwAB/PC7AAI1KwAD/UMABBOwAwAD9KUrAAH9HAD9AFsAAf2AuwACO2cAA/1DAAQTvwAB/YMAAf2sAPRfAAH94LsAAjtnAAP9QKsABBO89HMAAf5cuwACO28AA/1AAAAAAwAEFCcAAbvI0wAB/yQPAAH/JwACAYgAAAAAAAABgwAD82QE+BEnAAH/YIRzAAH/lgcAAf9zAgIUfSAEAARbAAH/oLsAAjUrAAP9QwAEE7ADAAP0pSsAAf/MAP0AhFsAAgA0uwACO2cAA/1DAAQTvwACADMAAgBgAPRfAAIAlLsAAjtnAAP9QKcABBO89HMAAgEMuwACO28AA/1AAAAAAwAEFCcAAbss0wACAdgPAAIB2wACBDwAAAAAAAABgwAD82QE+BEnAAICFIRzAAICSgcAAgInAgIUfSAEAARbAAICVLsAAjUrAAP9QwAEE7ADAAP0pSsAAgKAAP0AWwACAuS7AAI7ZwAD/UMABBO/AAIC5wACAxAA9F8AAgNEuwACO2cAA/1AqwAEE7z0cwACA8C7AAI7bwAD/UAAAAADAAQUJwABuzDTAAIEjA8AAgSPAAIIAAAAAAAAAAGDAAPzZAT4EScAAgTIhHMAAgT+BwACBNsCAhR9IAQABFsAAgUIuwACNSsAA/1DAAQTsAMAA/SlKwACBTQA/ScAAgV8hHMAAgXcWwACBYy7AAIN+wAD/UMABBO1IAQABKwDAAP0pPgE9HMAAgaIWwACBji7AAIN+wAD/UMABBO2cTQAAAADAALmTPz0cwACBwi7AAI7iwAD/UAEAASkAwAEFCD0cwACB7hbAAIHiLsAAbv7AAP9QwAEE8IKIAAAAAMAAufbAAQTxPYnAAIIHwICFHxfAAIISLsAAjUrAAP9QH8AAgirAAQHjAwADFsAAgjguwACM9sAA/1DAAQTrgMAAgkLAgISVFsAAgmIWwACCUi7AAI7awAD/UMABBPGB9cAAueIAwAEE7D0XwACCby7AAI7ZwAD/UCnAAQTvPRzAAIKHLsAAjtvAAP9QAAAAAMABBQkGwAEFCIL2wACCpMAAgqnAAIQRAADAAI7iwAD/UAAAAAEDwACCt8AAhBEAAAABAAHAAIK+AAAAtCdgwAD6CgFqwACCyGDAAPoKAABcAT4HScAAgxAcwACDHhbAAIMULsAAjUrAAP9QwAEE7EgBAAErAMAA/SlKwACDJwA/TsAAgzfAAIM7AACftGDAAQHOARbAAIM9LsAAjUrAAP9QwAEE7D0cwACDUIHAAINMwICJFYKIAQABgMAAg1bAgIjIAMABAeE9F8AAg2QuwACNSsAA/1ArwAEE7EnAAIN6IRzAAIOOFsAAg34uwACO2sAA/1DAAQTxSAEAASsAwAD9KT4CPRzAAIOvFsAAg58uwACO2sAA/1DAAQTxgogAAAAAwAC59j0XwACDvi7AAI7awAD/UCvAAQTxPz0XwACD4C7AAI7ZwAD/UCrAAQTvPRzAAIP5LsAAjtvAAP9QAAAAAMABBQkGwAEFCYL2wACEFsAAhBvAAITsAADAAI7bwAD/UAAAAAEDwACELcAAhOwAAAAAAAAAXAE+AUnAAIQ2IRzAAIREFsAAhDouwACNSsAA/1DAAQTsSAEAASsAwAD9KT4BScAAhFUiIRbAAIRaLsAAjtnAAP9QwAEE7wAhFsAAhGouwACOy8AA/1DAAQTXPgE9HMAAhIMuwAB+38AA/1AAAAAAwAEE+T8+AUnAAISoIiEWwACErS7AAI7YwAD/UMABBO4AIRbAAIS5LsAAjsvAAP9QwAEE1z4BPRzAAITSLsAAft/AAP9QAAAAAMABBPk/BsABBQqC9sAAhPHAAIT2wACFwgAAiIXAAP9QAAAAAQPAAIUCwACFwgAAAAIBAsAAhQMAAACBxVsAwACFCwAAAIY/WwFqAGDAAPzZdwBcAT4EScAAhR4hHMAAhTYWwACFIi7AAIN+wAD/UMABBO1IAQABKwDAAP0pPRzAAIVTFsAAhT8uwACDfsAA/1DAAQTtnE0AAAAAwAC5kz89F8AAhWEuwABjWsAA/1BqwACFcWDAAPvQwABjAcABBNs9HMAAhYoWwACFfi7AAG7+wAD/UMABBPCcDgIAAoDAAIWTwICLFibAAIWaAYHAAIWawICLIWDAAP2KAMAAufU9HMAAhbcWwACFqy7AAG7+wAD/UMABBPCCiAAAAADAALn2AACAQb0AgEH4AIBCMwCAQwEAgEOdAIBEPQCASW8AgHAgAIBw8gCAda8AgHY9AIB2iACAdtMAgHdOAIB3lwCAd/oAgHiHAIB5lQCAe7gAgHwRAIB8wwCAfZEAgIABAICAtACAgjAAgILMAICEZQCAiJgAgIn6AICK6ACAjAUAAAAeAsABBRiC94GRgZeKRgPAAI8BAAABYMAA/RwAAWDAAQAMCQTAAQUbgveCFYInGMAAjVzAAP9QAGDAAPoKASoEwAEFHIL3gjCCPRjAAI2ZwAD/UABgwAD6CgEpBMABBR2C94JKglMYwACPAsAA/1AAYMAA+hwABMABBR6C94JggnAYwACPA8AA/1AAYMAA+8YBKwTAAQUfgveCiIKXGMAAjVbAAP9QAGDAAQVFAATAAQUggveCyILNGMAAjwTAAP9QAGDAAQUYASsEwAEFIYL3gt6C4xjAAG7fwAD/UABgwAEFGAErBMABBSOC94L0gvYJs1UAYMAA/bYABMABBSKC94MFgxoJtpfAAP9QAF3AAPylAltbAR6DEcAAwI8AAltbAAABBcABBUSC94Mfgx+DawAAAAODK4NrAAAAAgICgzEAAATAAI1WYMABBUUAg0cAAASzVWDAAP22AABgwAEFGAE/BAgBwAEFH4AAwICNxAgBwAEFI4EAwICN0wgAwAEFHR+DXcAA+nsAAAAACQGDH8AA/TIAAAAAGwbAAQUlgveDcIN1g/cAAMAAfrwAAAABA4N8g/cAAAAAAAAAXAE+Az0Xg4UuwACNXMAA/1ApwAEFGz0cg6wWg5wuwACNVsAA/1DAAQUfwACPBcAA/1ABAAEuAMABBVU9HIPpFoPfFoPPLsAAjVbAAP9QwAEFH8AAjwbAAP9QwAEFSIRZAQABFoPwLrNVwAEFIwDAAPzCBsABBSeC94RvhHSEzgAAwACNWMAA/1AAAAABA4R9hM4AAAAAAAAAXAE+Aj0XhIYuwACPAsAA/1AfhJbAAPp7AAAAAMABBR09HIS6FoSqLsAAjVbAAP9QwAEFH8AAjwfAAP9QAQABLgDAAQVTBsABBTmC94TThOCE9QEAwACPCAAAAAEDhOmE9QAAAAAAAABgwAD6HAFKhOwBFoTsLsAAjwLAAP9QwAEFHQbAAQU6gveE+oUDhRIBALjTAAAAAQOFCYUSAAAAAAAAAGDAAPoKAUqFDAEWhQwuwACNmcAA/1DAAQUcBsABBUKC94UXhSCFYAIAwABvOAAAAAEDhSmFYAAAAAEBAYUvAAAAmblhAFwAAFwBPgE9F4VBLsAAjwPAAP9QgIVUwICPusABBR4GwAEFKIL3hX6Fg4W1AADAAELrAAAAAQOFkIW1AAAAAQEBhZEAAACAlmDAAP0cAABgwAD6CgFKhZsBHIWhFoWbLraXwAD/UMABBSLAAELrAQABgIWvwICQBADAAPy3BsABBSmC94W5hb6F6AAAh0EAAAABA4XJhegAAAABAQGFygAAAIPRYMAA/RwAAGDAAPoKAUqF0gEchdgWhdIutpfAAP9QwAEFIodBAQABgIXkwICQYADAAPy4BsABBSqC94XshfWGCgMASwAAAAEDhfeGCgAAAAEBAYX4AAAAg9FgwAD9HAAAWwFKhgABHIYFFoYALraXwAD/UMABBSJLAQABgIYGwICQuQDAAPy5BsABBSuC94YOhhyGSAMAgL8AAAABA4YfhkgAAAACAgKGIAAAIIPRWwCGJQAAIICWWwAAXAE+AT0chjcWhjIutpfAAP9QwAEFIoC/AgACgIY4wICRDoGGP8CAkRcAwAD8ugbAAQUsgveGTYZNhosAAJkVAAAAAQOGWIaLAAAAAgIChlkAACCD0VsAhl4AACDAAELsYQBbAABbAUqGawEchnEWhmsutpfAAP9QwAEFIpkVAgACgIZ9wICRb4GGgsCAkXgAwAD8wAbAAQUtgveGj4aPhrcAAIClAAAAAQOGlYa3AAAAAQEBhpoAACCD1l3AAPylAltbAABcAUqGpAEchqoWhqQutpfAAP9QwAEFIoClAQABgIaxwICR1QDAAPzBBsABBS6C94a7hruG2wAAhFkAAAABA4bBhtsAAAABAQGGwgAAAIPRYMAA/RwAAFsBSobKARyG0BaGyi62l8AA/1DAAQUihFkBAAGAhtfAgJIuAMAA/MIGwAEFL4L3ht+G5IcDAACCQgAAAAEDhumHAwAAAAAAAABcAT4BPRyG+BaG8i62l8AA/1DAAQUigkIAAAAAwAD8wwbAAQUwgveHCIcNh0MAAIP4AAAAAQOHFIdDAAAAAQEBhxoAAACBpmECW1tcAABcAT4BPRyHNRaHLy62l8AA/1DAAQUig/gBAAGAhz3AgJLFAMAA/MQGwAEFO4L3h0iHX4d3AQCD0AAAAAEDh2eHdwAAAAAAAABdwAD8MgFdwAD8zAJbWwFKh2oBFodwFodqLraXwAD/UMABBSKD0MAA/MYGwAEFMYL3h3yHgYfLAADAAELtAAAAAQOHi4fLAAAAAQEBh58AACCD0F3AAPwyAV3AAPzMAltbAABcAT4BPRyHtBaHri62l8AA/1DAAQUiwABC7QEAAYCHv8CAk2cAwAD8vAbAAQUygveH0IfaiCcAAICrAAAAAQOH44gnAAACAACEA2DAAP0cAVsAAIQEYMAA/RwBWwEBAYfzAAAAgfZhAltbXcAA/MwCXwAAXwEAAABdwAD8pQJfAABfAQABSogTARyIGRaIEy62l8AA/1DAAQUigKsBAl8AAF8BAAGAiB3AgJPdAMAA/LsGwAEFM4L3iCyIMYh1AACW+AAAAAEDiDyIdQAAAAEBAYhCAAAAlvlhAltbYMAA+goAAFwBPgE9HIhgFohaLraXwAD/UMABBSKW+AEAAYCIbMCAlE8AwAD8vwbAAQU0gveIeoiEiKYAAJYyAAAAAQOIjoimAAACAACEA2DAAP0cAVsAAIQEYMAA/RwBWwAAAABdwAD8pQJfAABfAQABSoiUARyImhaIlC62l8AA/1DAAQUiljIAAl8AAF8BAAAAwAD8tgbAAQU1gveIqoiqiQkAAKsmAAAAAQOIsIkJAAAAAwICiLEAACCD0VsAiLYAACCrJmEBW1sAAYjGAAAgwABC7GEAWwFqAGDAAPzZd1sBSojcARyI4haI3C62l8AA/1DAAQUiqyYDAAKAiOnAgJURgYjuwICVGgHAAELsgokAwICVJ8AA/L0GwAEFNoL3iQ6JE4lSAADAAELwAAAAAQOJHIlSAAAAAQEBiR0AACCrJmECW1tbAABcAT4BPRyJPRaJNy62l8AA/1DAAQUiwABC8AEAAYCJR8CAlZgAwAD8vgbAAQU8gveJV4lkiXYBAINiAAAAAQOJaYl2AAAAAAAAAF3AAPwyAVsBSolsARaJchaJbC62l8AA/1DAAQUig2LAAPzHBsABBT2C94l6iYeJnQEAKQAAAAEDiY6JnQAAAAAAAABdwAD8MgFbAUqJkQEWiZcWiZEutpfAAP9QwAEFIinAAPzIBsABBT6C94mhiamJvwEAYQAAAAEDibCJvwAAAAAAAABgwAD70AFKibMBFom5FomzLraXwAD/UMABBSJhwAD8yQbAAQU/gveJw4nMieQBAIFVAAAAAQOJ1InkAAAAAAAAAGDAAPoKAUqJ1wEWid0WidcutpfAAP9QwAEFIoFVwAD8ygbAAQVAgveJ6Inxig8BAIOyAAAAAQOJ/IoPAAAAAAAAAGDAAPoKAUqJ/wEWigUWif8utpfAAP9QwAEFIoOywAD8ywbAAQU3gveKFIobikQAACMAAAABA4ojikQAAAAAAAAAYMAA/bYBSoopASSKRAQnwACPCRaKOi6zVcABBSMngNkWij4utpfAAP9QwAEFIgAAgI4fAICOtACAjyAAgI9dAICPmACAj+IAgJBAAICQmgCAkO4AgJFPAICRtQCAkg4AgJJkAICSpQCAkvoAgJNFAICTpwCAlC8AgJSIAICU8QCAlXYAgJXPAICWEwCAllUAgJaVAICW1wCAlxkAgJdnAAAAGwLAAQVFgveLDosUlRoDwACPCgAAAWDAAP0cAAAFBMABBUiC94tGi08YwACPBsAA/1AAXcAA/KUCYMAA/bZgwAEFGAAEwAEFSYL3i1eLcBjAAI8LwAD/UABgwAD70AEci2w3FIOIAQABNzwAwAD89wTAAQVKgveLjYuSGMAAazrAAP9QAGDAAQUYASsEwAEFS4L3i6OLqBjAAGs7wAD/UABgwAEFGAErBMABBUyC94uyi7gYwACPDMAA/1AAYMAAvIkBKwEFwAEFXIL3i72LvYvjAAAAA4vQi+MAAAAAAAAAYMABBUUBPwIIAMABBUgyi+FgwAD9tmDAAQUYAAkBi73AAP0yAAAAAAsGwAEFToL3i+iL74yVAADAAI8NAAAAAQOL/oyVAAAAAAAAAGDAAP22AT4CTow4jD0AABJgwADi8wEejEzAAQDqAQABaoxbYMAA+9CDUQBKjG0BHoyBwAEA6wEAAYCMjMCAmREABsABBU+C94yajKeMzQAAwACNVwAAAAEDjLGMzQAAAAEBAYy5AAAAs1VgwAD9tgAAYMABBRgBSozAARyMyRaMwC7AAI8GwAD/UMABBUhLAQABgIzKwICZawDAAPy5BsABBVCC94zSjN+ORAAAwACNXQAAAAEDjOyORAAAAAAAAABgwAEFGAE+BU6M+Yz8AACzVWDAAP22ARyM/i7AAI8NAAAAAMABBU5DjYccjZgWjY4uwACPBsAA/1DAAQVIh0EBAAGAjaTAgJnSAMAA/Lg+AT2IjbHAgJnSHI22LsAAjw0AAAAAwAEFTk6N143fAADAAIxOYMABBRgBNQAAAAEAXcAA/KUCYMAA/bZgwAEFGAEWjeEuwACPBsAA/1DAAQVINQAAAAEAYMAA/bYBgI3rwICZ0jUAAAABAGDAAQUYAR+N9cABBUQCAAIugI4IwICZ0gA1AAAAAQBcARyN6oGN6sCAmkOAvwIAAoKN6sCAmmqDAMCAmn0AwAD8uoMAwICafT0cjhEuwACPDsAA/1ABAAGBjiTAgJoyAMABBVRKjjIBgY45wICaMgbAAQVagveOSY5SjrYCAMAAi2wAAAABA45gjrYAAAABAQGOZQAAAMAAbzZgwAD70AAAXAE+Az0XjnQuwACPC8AA/1CAjobAgJsTwAEFST0cjpMuwACPD8AA/1AAAAAAwAEFWD0cjqUuwACPEMAA/1AAAAAAwAEFVwbAAQVRgveOu47Ajt4AAIKIAAAAAQOOxY7eAAAAAAAAAFwBPgE9HI7OLsAAjw/AAP9QAAAAAMABBVgGwAEFU4L3juOO6I9UAADAAI8HwAD/UAAAAAEDjvKPVAAAAAEBAY8AAAAAwACMTmDAAQUYAABcAT4CPRyPDy7AAI8FwAD/UAEAAYCPJ8CAm8kAwAEFVT0cjzUuwACPDsAA/1ABAAGAj0jAgJvJAMABBVQGwAEFVIL3j1mPXpCpAADAAI8OwAD/UAAAAAEDj3CQqQAAAAEBAY9+AAAAwACMTmDAAQUYAABcAT4BSY+NHI+XFo+RLsAAazrAAP9QwAEFSkgBAAErAMAA/Sk+A0Acj7UWj68uwABrO8AA/1DAAQVLSAEAASsAwAD9KY+vj7wAPRePxS7AAGs7wAD/UBePzS7AAGs6wAD/UICP1cCAnDvAAQVKwAEFSz0cj+QuwACPEMAA/1AAAAAAwAEFVz4FQCEckBQWkA0uwACPDMAA/1DAAQVMSAEAASsAwAD9KZANkBsAQCEckDEWkCsuwABrO8AA/1DAAQVLSAEAASsAwAD9KZArkDgAPReQXBaQVi7AAGs7wAD/UMABBUvAAG7fwAD/UICQZMCAnDvAAQUhPReQe4CQc8CAnDvAAI8EwAD/UBaQgy7AAGs7wAD/UMABBUvAAQUgPReQkC7AAGs7wAD/UICQmMCAnDvAAQVLBsABBVWC95CukLOSkQAAwACPBcAA/1AAAAABA5DKkpEAAAABAQGQ2AAAAMAAjE5gwAEFGAAAXAE+BUmQ5yEckPkWkPOAkOvAgJ2nwABu38AA/1DAAQUhSAEAASsAwAD9KT4BPReRGBaREoCRCsCAnafAAG7fwAD/UMABBSHAAI8EwAD/UBaRKICRIMCAnafAAI8EwAD/UMABBSDAAQUgP0mROSEckUsWkUWAkT3AgJ2nwACPBMAA/1DAAQUgSAEAASsAwAD9KT4BPReRahaRZICRXMCAnafAAI8EwAD/UMABBSDAAG7fwAD/UBaReoCRcsCAnafAAG7fwAD/UMABBSHAAQUhP0mRixyRlRaRjy7AAGs6wAD/UMABBUpIAQABgJGYwICdpwDAAP0pPgM9F5HgLsAAazrAAP9QFpHwgJHowICdp8AAbt/AAP9QwAEFIcABBUo9HJH9LsAAjw/AAP9QAAAAAMABBVg9HJIRLsAAjxDAAP9QAAAAAMABBVc/SZIqHJI0FpIuLsAAazvAAP9QwAEFS0gBAAGAkjfAgJ2nAMAA/Sk+AT0XkkguwABrO8AA/1AWkliAklDAgJ2nwACPBMAA/1DAAQUgwAEFSz89F5JxgJJpwICdp8AAbt/AAP9QF5KBgJJ5wICdp8AAjwTAAP9QK8ABBSDAAQUhBsABBVaC95KWkpuTpwAAwACPEcAA/1AAAAABA5Kok6cAAAAAAAAAXAE+BT0ckrEuwACPD8AA/1AAAAAAwAEFWEAhHJLgFpLaLsAAazrAAP9QwAEFSkgBAAErAMAA/SmS2pLnAE6S8pL6AADAAIxOYMABBRgBFpL8LsAAazrAAP9QwAEFSj0ckw+AkwfAgJ/kwAB+vAAAAADAAQUlSZNVIRyTchaTYYCTWcCAn+TAAI8DwAD/UMABBR5IAQABKwDAAPvLPgE9HJOLgJODwICf5MAAjwPAAP9QAAAAAMABBR4/BsABBVeC95Osk7GUsQAAwACPEMAA/1AAAAABA5O8lLEAAAAAAAAAXAE+AkAck9MWk8wuwACPDMAA/1DAAQVMSAEAASsAwAD9KZPMk9oASZPhIRyT6xaT5S7AAGs6wAD/UMABBUpIAQABKwDAAP0pPgJOlACUCAAAgbVgwAD70AEWlDgclB0flA7AAPp7AAAAAJb+AQABFpQuFpQoLsAAazrAAP9QwAEFSsAAjwjAAQU5AMAA+mXAAIjdwAD6zD0XlEkuwACPDMAA/1AelFbAALyLAgACH5RrwAD60gEAAAGBtRyUjRaUfS7AAI8LwAD/UMABBUmBjQEAAYCUj8CAoNIAwAD89haUmS7AAI8RwAD/UMABBVYAwAEFTD8GwAEFWIL3lLaUu5UYAADAAI8PwAD/UAAAAAEDlMWVGAAAAAAAAABcAT4BSZTOIRyU2RaU0i7AAI8MwAD/UMABBUxIAQABKwDAAP0pPgI9HJTxFpTqLsAAjwzAAP9QwAEFTJxNAAAAAMAAvI89F5UBLsAAjwzAAP9QK8ABBUw/AACAmOUAgJlJAICZpgCAmvEAgJtpAICbowCAnBUAgJ2BAICffwCAoGAAgKF8AICh+wAAAAsCwAEFXYL4hBiEJ4yuB8AAjxIAAAFgwAD9HAAAAQTAAQVggviEToRVBMAAgpvAAP9QAGDAAQVdASsBBcABBWsAAAAABAAAAwAAAAAAAAAAAGDAAQVdAT8BCQEAwAD9MgAAAAAGBsABBWKC+IRahHOEuAEBXgAAAAEDhHuEuAAAAAAAAABgwAEFXQE+AUqEgQEmhIEBNQAAAAEAWwEchJQahI3AALznSwEAARqElcAA/14AwAC9BSMchKqAAMCAosVIAQABKwAAGoStwAEFYIAAwICixQFbYMABBV0GwAEFZIL4hb6FyYYGAgHAAEOfAAAAAQOFz4YGAAAAAQEBhd4AAADAAICZYMABBV0AAFwBPgE9G4XvwAEFYICF+cCAoy0GwAEFZoL4hk2GVohjAAGIjwAAAAEDhmGIYwAAAQAAlvNgwAD9HAFbBQEBhmQAAACCaWEAXwAAAASGmAAAAMAAjF1hAWDAAPOLYMABAFkBagBgwAD82XeG9AAAAMAAjGhhAmDAAP43XcAA/KUCYMAA/bZgwAD9tmDAAP22AWoAYMAA/Nl3hyYAAACkXGDAALyqAWoAYMAA/Nl3h0gAAACB62DAAPvGAWoAYMAA/Nl3XwAAAT4CTodmh3AAAMAAgJlgwAEFXQEfh37AAQV2AgACgYeSwICjiYKHpMCAo6cASofDARyH2GqHyl4BAACW82DAAP0cAVsBBAFhAF8BAAOB62DAAPvGpFxgwAC8qoiiXcAA/KUCW1sAXwEAwAGseyAEAV8AAAGAh9zAgKN7A4iiMof2W1sBGof3wAD/XoWIDMCApAakXIOIM8CAo9WB64SIV8CAo+oABsABBWeC+IkdiSaKRgABwACPEwAAAAEDiT2KRgAAAQAAlvNgwAD9HAFbBAICiUAAAACCaWEAXwAAAIlWAAAAwACAmWDAAQVdAAKJegAAAKRcYMAAvKoBagBgwAD82XeJlgAAAIHrYMAA+8YBagBgwAD82XdfAAABPgFKiaYBHIm7aomtXgEAAJbzYMAA/RwBWwEEAWEAXwEAA4HrYMAA+8akXGDAALyqiKJdwAD8pQJbWwBfAQDAAax7IAQBXwAAAYCJv8CApNQDiKIyidlbWwEaidrAAP9egYnvwICk4aRcgooWwICk8YHrg4o6wIClBgAGwAEFaIL4ivSK/4tSAADAAIxdAAAAAQOLD4tSAAAAAQEBiyAAAACCU2DAAPOLAABgwAEAWQE+AUqLLwEfizrAAQNmAQABgItGwICluwAGwAEFaYL4jBqMIYysAADAAIxoAAAAAQOMOYysAAAAAgICjD4AAADAAEjMYMAA/jcAjFcAAACAiV3AAPylAmDAAP22YMAA/bYAAGDAAP22AT4BSoxqAR6MfcABA2QCAAKAjJfAgKYJgYycwICmGAAAAICilACAowsAgKNQAICkpwCApZkAgKXnAICmVgAAAAYCwAEFbIL4jLGMt5CCA8AAjxQAAAFgwAEFXQAAAwTAAQVvgviM+Y0aCcAAbuDAAP9QAGDAAQVdARqNE8ABBWIEwAEFcIL4jUqNWwnAAI8VwAD/UABhAWDAAPOLYMABAFkABMABBXGC+I2ljb4JwACON8AA/1AAYQJgwAD+N13AAPylAmDAAP22YMAA/bZgwAD9tgABBcABBXaC+I3DjcOODgAAAAON1o4OAAAAAgICjdwAAATAAI8VYQFgwADzi2DAAQBZAI30AAAEwACON2ECYMAA/jddwAD8pQJgwAD9tmDAAP22YMAA/bYAAGDAAQVsAT8DCAHAAQVwgADAgKcmCAHAAQVxgQDAgKc8CQGNw8ABBWsAAAAAAgbAAQVzgviOE44qjxEAAMAAjF0Bao4UYMAA/RwCAAABA446jxEAAAABAQGOSwAAAIJTYMAA84sAAGDAAQBZAT4DSY5aIRyOcBaOXi7AAI8VwAD/UMABBXBIAQABKwDAAP0pSo55ARyOgC7AAI8VwAD/UAEAAYCOksCAp7sAwAEFcD9JjqAhHI6uFo6kLsAAbuDAAP9QwAEFb0gBAAErAMAA/SlKjrcBHI7IFo6+LsAAbuDAAP9QwAEFb8AAjF0BAAGAjtnAgKe7AMABBWg/So7nAR2O9MAAjF0BAAGAjwXAgKe7AMABBWgGwAEFdIL4jxaPKZCAAADAAIxoAWqPF2DAAP0cAgAAAQOPQZCAAAAAAgICj0YAAADAAEjMYMAA/jcAj18AAACAiV3AAPylAmDAAP22YMAA/bYAAGDAAP22AT4DSY9yIRyPkBaPdi7AAI43wAD/UMABBXFIAQABKwDAAP0pPgFKj6EBHI+oLsAAjjfAAP9QAgACgI/CwICoo4GPx8CAqLIAwAEFcT9Jj98hHI/tFo/jLsAAbuDAAP9QwAEFb0gBAAErAMAA/Sk+AUqP/gEckA8WkAUuwABu4MAA/1DAAQVvwACMaAIAAoCQKMCAqKOBkC3AgKiyAMABBWk/SpBFAR2QUsAAjGgCAAKAkGvAgKijgZBwwICosgDAAQVpAACAp5AAgKh4AICpkwAAAAICwAEFd4L5gTuBSoi6B8AAjxYAAAFgwAD9HAAAGgTAAQV5gvmBb4GDBsAAjxcAYMAA+9ABaoF/YMAA+9DAALWoBMABBXqC+YGYgagGwACPGABgwAD70AFqgaRgwAD70MABnFMEwAEFe4L5gb2B0QbAAI8ZAGDAAPvQAWqBzWDAAPvQwAGcVwTAAQV8gvmB5oH8BsAAjxoAYMAA+9ABaoH4YMAA+9DAAZwYBMABBX2C+YIRgiQGwACPGwBgwAD70AFqgiBgwAD70MAB5AkEwAEFfoL5gjmCUAbAAI8cAGDAAPvQAWqCTGDAAPvQwAHkDQTAAQV/gvmCZYJ7BsAAjx0AYMAA+9ABaoJ3YMAA+9DAAeQRBMABBYCC+YKQgq4GwACPHgBgwAD70AFqgqpgwAD70MAB5BUEwAEFgYL5gsOC2QbAAI8fAGDAAPvQAWqC1WDAAPvQwAHkGQTAAQWCgvmC7oMCBsAAjyAAYMAA+9ABaoL+YMAA+9DAAeQdBMABBYOC+YMXgzcGwACPIQBgwAD70AFqgzNgwAD70MAB5CEEwAEFhIL5g0yDZgbAAHVUAGDAAPvQAWqDYmDAAPvQwAHkJQTAAQWFgvmDe4OOBsAAjyIAYMAA+9ABaoOKYMAA+9DAAeQpBMABBYaC+YPPg+0GwACPIwFqg5RgwAD5vcAB5DJgwAD70AFqg+BgwAD70MAAtagEwAEFh4L5hCmEPwbAAI8lAWqD8mDAAPm9wAHkRmDAAPvQAWqENmDAAPvQwAGcUwTAAQWIgvmEf4SdBsAAjycBaoREYMAA+b3AAeRaYMAA+9ABaoSQYMAA+9DAAZxXBMABBYmC+YTfhQEGwACPKQFqhKJgwAD5vcAB5G5gwAD70AFqhPJgwAD70MABnBgEwAEFioL5hUCFXAbAAI8rAWqFBmDAAPm9wAHkgmDAAPvQAWqFUGDAAPvQwAHkCQTAAQWLgvmFn4XEBsAAjy0BaoVhYMAA+b3AAeSWYMAA+9ABaoW0YMAA+9DAAeQNBMABBYyC+YYGhigGwACPLwFqhclgwAD5vcAB5KpgwAD70AFqhhlgwAD70MAB5BEEwAEFjYL5hnKGpgbAAI8xAWqGLWDAAPm9wAHkvmDAAPvQAWqGj2DAAPvQwAHkFQTAAQWOgvmG6IcKBsAAjzMBaoarYMAA+b3AAeTSYMAA+9ABaob7YMAA+9DAAeQZBMABBY+C+YdKh2kGwACPNQFqhw9gwAD5vcAB5OZgwAD70AFqh1xgwAD70MAB5B0EwAEFkIL5h7WH7AbAAI83AWqHbmDAAPm9wAHk+mDAAPvQAWqH02DAAPvQwAHkIQTAAQWRgvmIMohdBsAAdacBaofxYMAA+b3AAYBhYMAA+9ABaohKYMAA+9DAAeQlBMABBZKC+YiciLgGwACPOQFqiGJgwAD5vcAB5Q5gwAD70AFqiKxgwAD70MAB5CkBBcABBZQAAAAABAAAAwAAAAAAAAAAAGDAAQV3AT8BCQEAwAD9MgAAAAAAAACArhYAAAAAAsABBZWC+Ypoim6h9QPAAI87AAABYMAA/RwAAAkEwAEFl4L5jICMtQbAAI88AGDAAQWVAWqMoWDAAQWVwAHlHQTAAQWYgvmNCY0lBp0bAWqMumDAAPm9wAHlQmDAAQWVAWqNE2DAAQWVwAHlHQTAAQWZgvmNz44OBsAAjz4AYMABBZUBao3sYMABBZXAAeVRBMABBZqC+Y5ejnIGwACPPwFqjhNgwAD5vcAB5XZgwAEFlQFqjmRgwAEFlcAB5VEEwAEFm4L5jsGO2AnAAI9BAGDAAPoKAATAAQWcgvmPJ48+CcAAj0IAYMAA+goABMABBZ2C+ZDWkOkJwACPQwBgwAD70AAEwAEFnoL5koGSlAnAAI9EAGDAAPvQAATAAQWfgvmTnJOjCcAAf74AYMAA+goAAQXAAQWmgvmTqJOulHYBAAADk8CUdgAAAAUAAAWTzgAABMAAj0FgwAD6CgFqk+hgwAD6CgCT+gAABMAAj0JgwAD6CgFqlBRgwAD6CgCUJgAABMAAj0NgwAD70AFqAGDAAPzZd5RGAAAEwACPRGDAAPvQAWoAYMAA/Nl3lGYAAATAAH++YMAA+goBapRwYMAA+gp1YMABBZUBPwYIAcABBZuAAMCAr24IAcABBZyBAMCAr4YIAcABBZ2CAMCAr54IAcABBZ6DAMCAr7UIAcABBZ+EAMCAr8wJAZOuwAD9MgAAAAADBsABBaKC+ZX1lg+ZNgAAwACPRcAA/1AAAAABA5YqmTYAAAABAQGWNwAAAMAAj0ZgwAEAAwAAYMABBfIBPgZOlkyWUQAAgVRgwAEF8gEfllfAAQX5AAAAAE6WfQAAAMAAj0dgwAD70ABOlo0AAACZ6mDAAP22AEmWlyEclrE1AAAAAQBgwAEAAwGAlpvAgLBbIxyWpoQAwICws0gBAAErAAArFpamhADAgLCzmoDAAQALAV3AAPylAmDAAP22YMAA/bZIAQABKwDAAP0pPgE9i5bCwICwnhyW3RaW04CWycCAsFuagMABAAtLAQABapbeYMAA/bbAAeWFAMAA/Lk/SZb/IRyXCIOXA8CAsJ5IAQABKwDAAP3FPgFJlxkiHJcpFpcig5cdwICwnmHAAP26gW0BAAGVAMAA/QAAHJc2g5cxwICwnoHWAQABJ4QIAMAA/cg+AT0wl1Efl1vAAPsDAQABJ8AAj0kAPgM9ipegwICwjiMcl7oWl6YuwACPRMABBZ5IAQABKwDAAPzzHpfUwAD7/wIAAYOX2sCAsJ4Bges0l/kDl/mYJwAAAAEBAZf6AAAAg0RgwAD9tgAAYMAA+9ABSpgFAWqYFGDAAPvQwACBchaYNy7AAI9EwAEFngFgwAD70D0XmFmBmFTAgLB0wACNHiSYiAInwACPSoKYg8CAsI7AAQX0PReYl4GYksCAsHTAAIBlgpinwICwjsABBfU+Aj0XmMyBmMfAgLB0wACNHicAwAEF9D0XmOmBmOTAgLB0wACAZWqZCGDAAPvQwACBcsABBfVKmScBgZkuwICwdAbAAQWjgvmZgJmHm8gAAMAAj0vAAP9QAAAAAQOZoZvIAAAAAgICma4AAADAAI9GYMABAAMAmb0AAACYgGDAAPvQAABgwAD9tgE+A06ZzZnSAACBVGDAAP22AScASZoTIRyaIYCaF8CAsr1IAQABKwDAAP0pPgE9ipoywICy4ySaWQInwACPTIGaVMCAssw+Akmalxyarxaamy7AAI9DwAEFnUgBAAErAMAA/PM+AT2KmsLAgLLjJ8AAj00+AT2KmvzAgLLjJJsyAifAAI9MFpseLsAAj0PAAQWdSZtCIRybWhabRi7AAI9EwAEFnkgBAAErAMAA/PM+AT2Km23AgLLjHJtygpttwICy42QBAAEkm6QCJ8AAj0oWm5AuwACPRMABBZ4AwAD9yz9Km7kBgpvAwICy4wbAAQWkgvmeGZ4zofMAAMAAj07AAP9QAAAAAQOeQKHzAAAAAQABnk4AAADAAI9GYMABAAMBagBgwAD82XcAYMABBfIBPgpOnmSeaQAAgVRgwAEF8gEfnm/AAQX5AgACJwCTAEmelSEWnpouwAB/vsABBZ8+AUqeqwGBnrLAgLQTPz0XnsiBnsPAgLQTwACNHmqe5WDAAP22wAHlisABBfRJnv8iFp8DLsAAj0HAAQWbACIcnzGAnyfAgLPySAEAASsAwAD9KQEiIRyfU4CfScCAs/JIAQABKwDAAP0pAByfgxafeICfbsCAs/KagMABAAuHQQEAAWqfj2DAAP22wAHljwDAAPy4PgE9NQAAAAEAYMABBfIBgZ+0wIC0ExefuYKfucCAtNfAAI0eHJ/FFp+5gp+5wIC018AAjR7AAQX0ZAEAASfAAI9RAMAA/cvAAQX0P0mf8yIWn/cuwACPQsABBZwAIhygJYCgG8CAs/JIAQABKwDAAP0pASIhHKBHgKA9wICz8kgBAAErAMAA/SkAHKB3FqBsgKBiwICz8pqAwAEAC4dBAQABaqCDYMAA/bbAAeWUAMAA/Lg+AT01AAAAAQBgwAEF8gGBoKjAgLQTF6CtgqCtwIC1isAAjR4coLkWoK2CoK3AgLWKwACNHsABBfRkAQABJ8AAj1MAwAD9y8ABBfQ/TqDroPYAAMAAj1RgwAEF8gEcoPguwACPRcAA/1ABAAGAoRTAgLPyAMABBaI9NQAAAAEAYMABBfIBgaEkwIC0ExehKYOhKcCAtgDAAI0eHKE1FqEpg6EpwIC2AMAAjR7AAQX0ZAEAARahQ4KhOMCAtdPAAI0ewAEF9ADAAP3LwAEF9D0XoVmBoVTAgLQTwACAZRahdIKhacCAtdPAAIBlwAEF9cABBfU9NQAAAAEAYMABBfIBgaGIwIC0ExehjYOhjcCAtnvAAI0eHKGZFqGNg6GNwIC2e8AAjR7AAQX0ZAEAARyhpC7AAI9LwAD/UAIAAoChv8CAs/IWoc+BocrAgLQTwACAZcABBfUAwAEFowDAAP3LwAEF9Eqh5AGBoevAgLQTAACAsDUAgLKXAICzzACAtvUAAAADAsABBaeC+aXKpdmu3wfAAI9VAAABYMAA/RwAAV3AALm9AmDAAQA4YMABBa0AAAMGwAEFqYL5qI6olqmSBAEAAAAAAQOoqqmSAAAAAgAAAqjNAAAAwACPVmEBXcAA/HQBYMAA/bZbAWoAYMAA/Nl3qRAAAADAAI9XYMABBZUBaqkwYMABBZXAAeUdYMABBacBPgFKqUsBH6lWwAEGQwIAAoCpcMCAt1mBqYLAgLd5AAbAAQWrgvms9q0Prg8AAcAAi7kAAAABA60Wrg8AAAADAQGtIwAAAINQYMABADgAAq0zAAAAwACPVmEBXcAA/HQBYMAA/bZbAWoAYMAA/Nl3rXYAAADAAI9XYMABBZUBaq2WYMABBZXAAeUdXcAAuKkBYMABBa0BPgFKrbEBHq3SwAEGPwMAA4Ct5MCAt9uBre3AgLfpgq3/wIC4CQAGwAEFrIL5rmaucq7dAAHAAI9YAAAAAQOugq7dAAAAAQEBro8AAACDUGDAAQA4AABgwAD6CgE+AUqungEerr/AAQZBAQABgK7RwIC4eAAAAIC3OQCAt7kAgLhWAIC4pAAAAAMCwAEFrYL5r8Gv0MAASG8HwACPWQAAAWDAAP0cAAJdwAC5WAFbXcAAubYBWwkEwAEFr4L5sJOwoQbAAH8zAGDAAPvQAWqwoGDAAPvQCQTAAQWwgvmwtrC+BqUXAGDAAPvQAWqwvWDAAPvQFQTAAQWxgvmw07DeBrQnAGDAAPvQAWqw3WDAAPvQIQTAAQWygvmw87D9BsAARnYAYMAA+9ABarD8YMAA+9BSBMABBbOC+bE7sVIGwACPWgFqsQNgwAD5vcAB5Z5gwAD70AFqsUhgwAD70AkEwAEFtIL5sYmxlAbAAEjvAWqxV2DAAPm9wAHlsmDAAPvQAWqxkGDAAPvQFQTAAQW1gvmxzrHfBsAAT8gBarGZYMAA+b3AAeXGYMAA+9ABarHYYMAA+9AhBMABBbaC+bIYsicGwACEHAFqseRgwAD5vcABtd9gwAD70AFqsiFgwAD70FIEwAEFt4L5tJC0nBjAAI9eAGDAAPqmASsBBcABBcqC+bnAulO6XgAAAWq5wWDAAPm9wAHl2gO6XLpeAAAAAAAAAGDAAQWtAT8BCQG6U8AA/TIAAAAADQbAAQW5gvm4jbimubsAAcAAfz8AAAABA7itubsAAAAEAQG4tQAAAMAASMxgwAD9tgADuNYAAADAAH/kXcAA/DIBYMAA/bYBagBgwAD82Xe5AAAAAJ47XcAA/KUCYMAA/bZbAWoAYMAA/Nl3uSYAAADAAI9XYMABBZUBarlUYMABBZXAAeUdXcAAuKkBYMABBa0BSrlyAR65gcABBqgEAAOAuYnAgLqKgbmOwIC6moK5mcCAurcBwACPV4O5r8CAutMGwAEFv4L5vha+Hr/QBAHAAI9gAAAAAQO+Or/QAAAABAEBvkIAAADAAHvCYMAA9GwAA75YAAAAwAB/o2DAAP22AWoAYMAA/Nl3vm0AAADAAI9hYMAA+goBagBgwAD82Xe+kgAAAMAAj1dgwAEFlQFqvrJgwAEFlcAB5R1gwAEFrQE+Akm+zRy+3IK+0cCAu3JIAQABKwDAAP0pPgE9ML7tH773wAD7AwEAASQAAifAAI9iJ8AAj2MAP0q/cwEfv37AAQbEBAAEgL+iwIC7S4G/qsCAu1uDv7TAgLuJgr/BwIC7cgAGwAEFwYL5wABAE8AAQBvAAEAlAQLAAI9kAAAAAQPAAEAlwABAJQAAAAAAAABgwAD70AAGwAEFwoL5wABA4sAAQO3AAED3AQLAAF8gAAAAAQPAAED3wABA9wAAAAAAAABgwAD9tgAGwAEFw4L5wABB9MAAQf/AAEIHAQLAAH+jAAAAAQPAAEIHwABCBwAAAAAAAABgwAD9tgAGwAEFxIL5wABCocAAQqnAAEKyAQLAAI9lAAAAAQPAAEKywABCsgAAAAAAAABgwAD70AAGwAEFxYL5wABDUMAAQ1vAAENmAQLAAI9mAAAAAQPAAENmwABDZgAAAAAAAABgwAD9tgAGwAEFuoL5wABEasAARHHAAESRAAKCiAAAAAEDwABEdsAARJEAAAACAALAAER8AAAAgpNgwAD70AFqAGDAAPzZd8AARIkAAAClUGDAAP22AWoAYMAA/Nl3AF3AALipAVsABsABBbuC+cAARSLAAEUnwABFRQACVgAAAAEDwABFKsAARUUAAAABAQHAAEVAAAAgElsAAFwABsABBbyC+cAARi/AAEY2wABGTgACnBAAAAABA8AARj/AAEZOAAAAAQEBwABGRwAAIIH1XcAAuVgBWwAAXcAAuKkBWwAGwAEFvYL5wABHKsAARy/AAEdLAALAAHvUAAAAAQPAAEc6wABHSwAAAAEBAcAAR0UAAACENF3AAPx0AWDAAPvQAABcAAbAAQXGgvnAAEeVwABHp8AAR8wBAcAAjFwAAAABA8AAR7HAAEfMAAAAAAAAAGDAAP22AUrAAEe0ARrAAEfDwAEGuwbAAQXIgvnAAEgYwABII8AASG0CAcAAjFwAAAABA8AASCzAAEhtAAAAAQEBwABINAAAAMAAjFxgwAD9tgAAXAE+AT0bwABIVMABBsGAwABIYMCAvpkAAIC6aACAuykAgLwNAIC8QACAvHMAgLymAIC82QCAvQwAgL1tAIC9owCAvecAgL4rAIC+bQCAvsIAAAANAsABBcuC+cAASHLAAEh4wABJJgPAAI9nAAABYMAA/RwAAWDAAO1aAQTAAQXNgvnAAEizwABIugkiAGDAAP22AAEFwAEF0YL5wABIv8AASMXAAEjsAQAAA8AASNfAAEjsAAAAAQABwABI3gAABCJgwAD9tgFqwABI6GDAAP22hAYAYMABBcsBPwIIAcABBc2AAMCAv2UJAcAASMXAAP0yAAAAAAEGwAEFz4L5wABI8cAASPjAAEkkAAAjAAAAAQPAAEkAwABJJAAAAAAAAABgwAD9tgFKwABJBgEkwABJJAInwACPaBbAAEkcLiLAAQXNAACAv6MAgL/vAAAAAQLAAQXSgvKCW4JhgtIDwACPaQAAAWDAAP0cAAADBMABBdSC8oKMgpQGwABI7QBgwAD70AFqgpNgwAD70AkEwAEF1YLygqmCsQbAAIw9AGDAAPvQAWqCsGDAAPvQFQTAAQXWgvKCxoLQBrwQAGDAAPvQAWqCz2DAAPvQIQEFwAEF2AAAAAAEAAADAAAAAAAAAAAAYMABBdIBPwEJAQDAAP0yAAAAAAAAAIDAogAAAAACwAEF2YLygtWC24ULA8AAj2oAAAFgwAD9HAAAEATAAQXbgvKDAYMRBsAAj2sAYMAA+9ABaoMQYMAA+9AJBMABBdyC8oMmgy4GwACMPQBgwAD70AFqgy1gwAD70BUEwAEF3YLyg0ODTQa8EABgwAD70AFqg0xgwAD70CEEwAEF3oLyg2KDcAbAAI9sAGDAAPvQAWqDb2DAAPvQUgTAAQXfgvKDhYOTBsAAj20AYMAA+9ABaoOSYMAA+9CBVQTAAQXggvKDqIO2BsAAj24AYMAA+9ABaoO1YMAA+9CCPATAAQXhgvKDy4PZBsAAj28AYMAA+9ABaoPYYMAA+9CECATAAQXigvKD7oP8BsAAj3AAYMAA+9ABaoP7YMAA+9CE4ATAAQXjgvKEEYQaBsAAj3EAYMAA+9ABaoQZYMAA+9CDPgTAAQXkgvKEL4Q3BsAAj3IAYMAA+9ABaoQ2YMAA+9CD7wTAAQXlgvKETIRVBsAAj3MAYMAA+9ABaoRTYMAA+9CD8gTAAQXmgvKEaoR5BsAAj3QAYMAA+9ABaoR3YMAA+9DAAI0kBMABBeeC8oSOhJ0GwACPdQBgwAD70AFqhJtgwAD70MAAjFsEwAEF6ILyhLKEwQbAAI92AGDAAPvQAWqEv2DAAPvQg/UEwAEF6YLyhNaE5QbAAI93AGDAAPvQAWqE42DAAPvQwACDwQTAAQXqgvKE+oUJBsAAj3gAYMAA+9ABaoUHYMAA+9DAAIFyAQXAAQXsAAAAAAQAAAMAAAAAAAAAAABgwAEF2QE/AQkBAMAA/TIAAAAAAAAAgMMFAAAAAALAAQXtgvKFDoUUhVwDwACPeQAAAWDAAP0cAAABBMABBe+C8oU3hTwJhDQAXcAA/HQBYMAA+9AAAQXAAQXxgvKFQIVAhVoAAAADhU6FWgAAAAEBAYVUAAAEhDRdwAD8dAFgwAD70AAAYMABBe0BPwIIAcABBe+AAMCAw2IJAYVAwAD9MgAAAAAAAACAw5cAAAAAAsABBfKC8oYhhieG1wPAAI96AAABYMAA/RwAAAIEwAEF9ILyhkyGVxjAAI0eAGDAAP22AATAAQX1gvKGX4ZsGMAAgGUAYMAA+9AAAQXAAQX5gvKGcIZwhrEAAAADhomGsQAAAAIAAoaQAAAEwACNHmDAAP22AWoAYMAA/Nl3hqIAAATAAIBlYMAA+9ABagBgwAD82XcAYMABBfIBPwMIAcABBfSAAMCAxAcIAcABBfWBAMCAxB4JAYZwwAD9MgAAAAABBsABBfeC8oa1hryG1QAAIwAAAAEDhsSG1QAAAAAAAABgwAD9tgFKhsoBFobKLsAAjR7AAQX0AACAxGMAgMSZAAAAAQLAAQX6gvKIdIh6sJwDwACPewAAAV3AALnJAl3AAPx0AWDAAPvQWwABXcAAuZ4BXcAA/HQBYMAA+9AeBMABBfyC8ok4iUEGwABPxQBgwAD70AFqiUBgwAD70AkEwAEF/YLyiVaJYwbAAI98AGDAAPvQAWqJYmDAAPvQFQTAAQX+gvKJeImEBsAAj30AYMAA+9ABaomDYMAA+9AhBMABBf+C8omZiaEGp6MAYMAA+9ABaomgYMAA+9BSBMABBgCC8om2icEGwACPfgBgwAD70AFqicBgwAD70IFVBMABBgGC8onWieAGwACEHABgwAD70AFqid9gwAD70II8BMABBgKC8on1igAGwACOvQBgwAD70AFqif9gwAD70IQIBMABBgOC8ooVih8GwACPfwBgwAD70AFqihtgwAD70ISRBMABBgSC8oo0ij8GwACPgABgwAD70AFqijtgwAD70IRrBMABBgWC8opUil8GwACPgQBgwAD70AFqiltgwAD70IMrBMABBgaC8op0in8GwACPggBgwAD70AFqintgwAD70INRBMABBgeC8oqUiqAGwACPgwBgwAD70AFqip1gwAD70MAAgXIEwAEGCYLyiqmKtxjAAGNawAD/UABgwAD70AFqirJgwAD70AkEwAEGCoLyisCKzBjAAI+EwAD/UABgwAD6CgEqBMABBguC8orViugYwACPhcAA/1AAYMAA+goBKgTAAQYMgvKK8Ir8GMAAj4bAAP9QAGDAAPvQARyK+pSBxAAAAADAAPvzBMABBg2C8osEiw0YwABxWsAA/1AAYMAA+9ABHIsLlIHEAAAAAMAA+/MEwAEGDoLyixaLJRjAAI+HwAD/UABgwAD6CgEqBMABBg+C8osti0QYwACPiMAA/1AAYMAA+9ABHItClIHEAAAAAMAA+/MEwAEGEILyi0yLaRjAAI+JwAD/UABgwAD70AGXBMABBhGC8otxi4wYwACPisAA/1AAYMAA+9ABHIuKlIHEAAAAAMAA+/MEwAEGEoLyi5SLpxjAAI+LwAD/UABgwAD70AGTBMABBhOC8ouvi98YwACPjMAA/1AAYMAA+9ABaovbYMAA+9AJBMABBhmC8ovnjBUYwACPZQBgwAD70AFqjANgwAD70MAB5A0EwAEGGoLyjCCMMBjAAI9mAGDAAP22AScABMABBhSC8ox1jH8YwABzRsAA/1AAXcAAuZ4BWwErBMABBhWC8oyPjJoJwACPjcAA/1AAYMAA+goABMABBhaC8oypjMQJwACPjsAA/1AAXcAA/HQBWwEejL3AAPXLAQFbAZcABMABBheC8ozbjQMJwACPj8AA/1AAYMAA7SYBHozqwADtKAEAAAGc6yoEwAEGGILyjSSNLBjAAI+QwAD/UABgwAEGRAABBcABBiqC8o0wjTCNeAAAAAONTY14AAAAAgACjVQAAATAAI+NYMAA+goBao1iYMAA+goAjW4AAATAAI+QYMABBkQBagBgwAD82XcAYMABBfoBPwMIAcABBhWAAMCAyOAIAcABBhiBAMCAyPgJAY0wwAC5zQAAAAAMBsABBhyC8o19jbqO0QAAnnAAAAABA42+jtEAAAABAQGN2AAAIIH1XcAAuVgBXcAA/HQBYMAA+9AAAF3AALlYAVsBPgFKjeYBHo3xwAC5ZAIBWwKAjgnAgMldNI4RA44RjswAAAABAQGOHAAAAMAAcFZdwAC5ngFbAABgwAEF+gE+A0mOLyEcjj4WjjMuwABzRsAA/1DAAQYUSAEAASsAwAD9KT4BPTCOUR+OW8AA+3ABAAEnwACPkQA/PReOnC7AAHNGwAD/UIGOqcCAyaXAAQYUSo66AS4ABsABBh2C8o7WjtuPOwAAnA4AAAABA47jjzsAAAACAQKO6wAAAIHFYMAA/RwAjv4AAACGP2DAAP2KAWoAYMAA/Nl3AFwBPgE9HI8cFo8RLsAAc0bAAP9QwAEGFJwOAgACgI8lwIDKNYGPLMCAykIAwAC5oQbAAQYegvKPQI9Fj2kAAIKIAAAAAQOPSo9pAAAAAAAAAFwBPgE9HI9eFo9TLsAAc0bAAP9QwAEGFIKIAAAAAMAAuaIGwAEGH4Lyj8CPxZ+CAABWAAAAAQOPyJ+CAAAAAQEBj9MAACCENF3AAPx0AWDAAPvQAABcAT4GTo/kj+sAAIKLYMAA4vMBIyWP84CP7cCAyupgwADi8xSQAsCAyuoAAWDAAOLzHpAOwADi+AEAAYCQIcCAyuoAAWDAAOLzTpAxkDcAACdgwAD70AGTTpBEkE4AAMAAj5JgwAD70AEWkFeBkFDAgMsDYcAA/KNJkGMckG4WkGcuwABjWsAA/1DAAQYJSAEAAWqQcWDAAPvQgjwAwAD88z4BPTCQgR+Qi8ABBdEBAAEnwACO4wA/SZDGHJDRFpDKLsAAY1rAAP9QwAEGCUgBAAFqkNRgwAD70IQIAMAA/PM+AT0wkOUfkO/AAQXRAQABJ8AAjuQAP0ORKiIiHJE4gpEywIDLSGMBAAGDkTrAgMtXAMAA/P0AIRyRTxaRSC7AAGNawAD/UMABBglIAQABapFSYMAA+9CCPADAAPzzACEckWMWkVwuwABjWsAA/1DAAQYJSAEAAWqRZmDAAPvQhAgAwAD88z4DTpF7kYAAAIbqYMAA+9ABHJGIgZGCwIDLA0sBAAGCkYnAgMtIAMAA/INJkZcckaIWkZsuwABjWsAA/1DAAQYJgWsBAAFqkaVgwAD70CEAwAD8/j4BSZG5HJHEFpG9LsAAY1rAAP9QwAEGCUgBAAFqkcdgwAD70AkAwAD88z4GPReR2i7AAI+EwAD/UCEcke4ckeeEkeLAgMxog3cBAAFqkelgwAD70ISRAMAA++hIAQABkwDAAPzzwAEGCkmR/yEckhockgmEkgTAgMxog3cBAAEckhFqkgxgwAD70IMrgQYBAAFqkhNgwAD70INRAMAA++kAwAD76EgBAAGTAMAA/PM+AT0wkmQfkm7AAQXRAQABJ8AAj5MAPz0XkqsuwACPhsAA/1AckruEkrbAgMxog3cBAAFqkr1gwAD70MAAgXIAwAD76MABBgxJktEhHJLdFpLVLsAAj4bAAP9QwAEGDEgBAAFqkvFgwAD70AkAwAD88z4BSZMNIRyTHxyTF4STEsCAzGiDdwEAAWqTGWDAAPvQhGsAwAD76EgBAAGTAMAA/PM+AT0XkzUuwACPhcAA/1ApwAEGCz4BPReTbC7AAI+FwAD/UCrAAQYLP0mTphyTshaTqi7AAI+GwAD/UMABBgyBawEAAWqTxmDAAPvQIQDAAPz+PgFJk9wck+gWk+AuwACPhsAA/1DAAQYMSAEAAWqT/GDAAPvQCQDAAPzzPgFJlBoclDIWlB4uwACPjMAA/1DAAQYTSAEAAWqUS2DAAPvQCQDAAPzzPgE9MJRjH5RtwAEF0QEAASfAAI+TAD8+A0AiHJTVFpTNLsAAj4bAAP9QwAEGDEgBAAFqlOlgwAD70BUAwAD88wEclQsWlQMuwACPhsAA/1DAAQYMSAEAAWqVH2DAAPvQIQDAAPzzlM2VJQBJlTYhHJVOFpU6LsAAj4zAAP9QwAEGE0gBAAFqlWdgwAD70AkAwAD88z4BPTCVfx+VicABBdEBAAEnwACPkwA/PReVzS7AAI+MwAD/UBaV4y7AAI+GwAD/UMABBgzAAQYTSZYLIhyWFxaWDy7AAI+GwAD/UMABBgyBbQEAAWqWK2DAAPvQgz4AwAD9AAAclkoWlkIuwACPhsAA/1DAAQYMgWsBAAFqll5gwAD70IPyAMAA/P4+AUmWpiEWlqsuwACPhMAA/1DAAQYKPTCWsR+Wu8ABBdEBAAEnwACPkwA/PgE9MJcAH5cKwAEF0QEAASfAAI+TAD0Xl0YuwABjWsAA/1Bql09gwAD70BXAAQYJSZdpHJd0FpdtLsAAY1rAAP9QwAEGCUgBAAFql3dgwAD70BUAwAD88z4EPReXji7AAI+HwAD/UCEcl6Ycl56El5nAgMxog3cBAAE3gIAAwAD76EgBAAGTAMAA/PPAAQYOPReXti7AAHFawAD/UByXwoSXvcCAzGiDdwEAATd/AMAA++jAAQYNSZfUIhyX2C7AAI+UwAD/UAAAAADAAQYnAByX8haX7S7AAHFawAD/UMABBg2AlwEAATd9AMAA/P8+AT0wmAcfmBHAAQXRAQABJ8AAj5MAP0mYTRyYVhaYUS7AAHFawAD/UMABBg1IAQABN34AwAD88z4DPReYbC7AAHFawAD/UJPAAQYNPReYgi7AAI+IwAD/UJXAAQYPPReYpi7AAGNawAD/UGqYr2DAAPvQIcABBglJmMocmNMWmM4uwABxWsAA/1DAAQYNSAEAATd/AMAA/PM+Az0XmOkuwABxWsAA/1CTwAEGDT0XmP8uwACPiMAA/1A3CMABBg89F5kjLsAAY1rAAP9QapksYMAA+9AhwAEGCT4CQByZYRaZXC7AAHFawAD/UMABBg1jAQABN34AwAD8/ZlcmWYAPRyZdS7AAI+VwAD/UAAAAADAAQYiPgRAHJm5FpmyLsAAY1rAAP9QwAEGCUgBAAFqmbxgwAD70CEAwAD885mymcQAPReZ0S7AAHFawAD/UByZ4hyZ3RaZ2C7AAHFawAD/UMABBg2DugEAATcIAMAA++yBBgEAAYSZ5MCAzGgAwAD76cABBg09F5n0LsAAj4jAAP9QHJoGFpn0LsAAj4jAAP9QwAEGD4GNAQABlADAAPz2wAEGD0maFByaKxaaGC7AAI+IwAD/UMABBg9IAQABkwDAAPzzPgE9HJo/LsAAj5XAAP9QAAAAAMABBiI/PgFJmnscmoYWmn8uwABjWsAA/1DAAQYJSAEAAWqaiWDAAPvQUgDAAPzzPgI9HJqoFpqbLsAAj47AAP9QwAEGFoC/AgACHJqrl4GNAQABNQAAAAEAYMAA+9ABFpqtLsAAj4nAAP9QwAEGEDUAAAABAGDAAPvQARearS7AAI+JwAD/UByaxoUAwIDTJYGNAQABlADAAPz2wAEGEIUAwIDTJQDAAPz2hJrMwIDMaADAAPyESZrcHJr6FprgLsAAj4nAAP9QwAEGEEgBAAGTAMAA/PM+AT0cmw4uwACPlsAA/1AAAAAAwAEGIz8+CEAcm1AWm0kuwABjWsAA/1DAAQYJSAEAAWqbU2DAAPvQgVUAwAD885tJm1oATpu1m8MAAMAAj5dgwAD70AEem8XAAM/vAgFgwAD70AIcm9ODm8nAgMtXgY0BAAGCm9XAgMtIAMAA/PYWm9wuwACPisAA/1DAAQYRAD0Xm/8uwACPisAA/1AcnBYWm/8uwACPisAA/1DAAQYRgY0BAAGFnBnAgNPuAMAA/PbAAQYRSZxZFpxdLsAAj4fAAP9QwAEGDj4BPRycdC7AAI+YwAD/UAMAA4KcfMCAy0iFnIPAgNPugZySwIDLAwDAAQYhPz0cnPUWnOwuwACPj8AA/1DAAQYXVgEAAR6c/cAA4vkDAAMWnROBnQzAgMsDgovAAOK4gp0bwIDLSIWdIsCA0+4AAMAA7So9ip09wIDLSBydQ4KdPcCAy0hkAQABhZ1GwIDT7gDAAPz1SZ1fHJ1jLsAAj5TAAP9QAAAAAMABBic+AUmdhBydnxadiC7AAI+KwAD/UMABBhFIAQABkwDAAPzzPRydpS7AAI+ZwAD/UAAAAADAAQYmPz4CSZ3YIiEcnfAWndwuwACPjMAA/1DAAQYTSAEAAWqeCWDAAPvQFQDAAPzzACEcnjUWniEuwACPjMAA/1DAAQYTSAEAAWqeTmDAAPvQIQDAAPzzPgE9MJ5mH55wwAEF0QEAASfAAI+TAD9JnrAcnssWnrQuwACPisAA/1DAAQYRSAEAAZMAwAD88z0cntEuwACPmsAA/1AAAAAAwAEGJT89ip8vwIDLSByfNIKfL8CAy0iBjQEAAZQAwAD89j2Kn3HAgMtIHJ92gp9xwIDLSGQBAAGUAMAA/PUGwAEGIYLyn4efjKR/AADAAI+YwAD/UAAAAAEDn5OkfwAAAAMDA5+YAAAAJ2DAAPvQAJ+jAAAAYWDAAPvQAJ+1AAAAgotgwADi8wAAXAE+A0mgExygHoGgF8CA1nCBbQEAAWqgIWDAAPvQg1EAwAD9AD4HTqBnoHMAAZhiYMAA+9ABHKCAaqB1YMAA+9CDUYGNAQABHKCJgKCDwIDWZIN3AQABNw8AwAD76ADAAPz2TqCgoKQAAYKMYMAA+9ABHKCsgKCmwIDWZGQBAAGDoK7AgNayAMAA/PVFoMEBoMqgzAAAYmDAAPvQAYCgzsCA1mQBHKDXhaDVwIDXGmMBAAGEoNnAgNbuAMAA/P0BjaDewIDXGhyg34Wg3sCA1xpkAQABlADAAPz1PgE9NQAAAAEAYMAA4vMBgqDtwIDWfDUAAAABAGDAAPvQAYWg9MCA1xocoPOGoPPAgNdpgL8CAAKHoPPAgNd8HKD3HKDzhqDzwIDXaUsBAAGHoPPAgNd8AMAA/IODuwEAASag9wEcoQcWoPouwACPjsAA/1DAAQYWSwEAARyhGjUAAAABAGDAAPvQARahCC7AAI+LwAD/UMABBhI1AAAAAQBgwAD70AEXoQguwACPi8AA/1AcoRcUAMCA1+UIAGQBAAGUAMAA/PXAAQYSFADAgNflCACDdwEAAZYAwAD76ADAAPyDYMAA+9AAwAD76gDAAPyEPYihLsCA1mQcoTSAoS7AgNZkZAEAAYOhN8CA1rIAwAD89T2JoUrAgNZwHKFRgaFKwIDWcIGNAQABg6FUwIDWsgDAAPz2TqFxoXwAAcAAj5tgwAD70AEcoYWBoX7AgNZwhoEBAAFqoYhgwAD70INRAMAA/PpJoZocoamFoZ7AgNiegJcBAAGTAMAA/P8+CE6h2qHfAACrxWDAAPvQAZNFoewBofWh9wAAYmDAAPvQAZYBHKH+h6H8wIDY+oFtAQABkwDAAP0AAY+iBMCA2PocogWHogTAgNj6gY0BAAGUAMAA/PY+AT2OohXAgNjnHKIoHKIihqIdwIDY54O6AQABNwgAwAD77IEGAQABJqI3ARyiNxaiKi7AAI+OwAD/UMABBhZLAQABHKJOHKJJFqI5LsAAj4vAAP9QwAEGEmQBAAGHokvAgNj6AMAA/PWDdwEAAZYAwAD76ADAAPyDYMAA+9AAwAD76U6ibqJ4AADAAI+cYMAA5JQBHqJ+wADllwQABIaihsCA2OeGoozAgNjnhqKSwIDY54aimMCA2OcATqKzor8AAMAAj51gwADjWAEeotHAAONeAwADFqLpgqLiwIDWfIKLwADiuICi8cCA1mSFovjAgNieAEWjDQGjFqMYAABiYMAA+9ABkwEcox8Uox3AgNo0CQBjAQABFqMtFKMhwIDZ9wgAYcAA/KMAwAD8/QEVozXAgNo0CRyjNhSjNcCA2jQJAGQBAAGUAMAA/PU+AT01AAAAAQBgwADjWAEUo0bAgNn3CAA1AAAAAQBgwAD70AEUo1LAgNo0CQAco1EUo1HAgNqMCgCAvwIAAhSjUcCA2qELAByjVRyjURSjUcCA2owKAEsBAAEUo1HAgNqhCwAAwAD8g4O7AQABh6NYwIDZvwDAAOWdAMAA/IROo3+jhQABhDRgwAD70AEco5KFo4fAgNieg4gBAAFqo5RgwAD70INRAMAA/Pc9iKOowIDWZByjroCjqMCA1mRkAQABFKOxwIDbBwkAAMAA/PU9iaPAwIDWcByjx4GjwMCA1nCBjQEAARSjysCA2wcJAADAAPz2Pz9OpACkBAABgoxgwAD70AEcpAyApAbAgNZkZAEAAYGkDsCA1nAAwAD89UWkGgGkI6QlAABiYMAA+9ABgKQnwIDWZAEcpDCEpC7AgNurYwEAAYOkMsCA238AwAD8/QGMpDfAgNurHKQ4hKQ3wIDbq2QBAAGUAMAA/PU+AT01AAAAAQBgwADi8wGCpETAgNZ8NQAAAAEAYMAA+9ABhKRLwIDbqxykSoWkSsCA2/qAvwIAAoakSsCA3A0cpE4cpEqFpErAgNv6SwEAAYakSsCA3A0AwAD8g4O7AQABJqROARykXhakUS7AAI+OwAD/UMABBhZLAQABHKRxNQAAAAEAYMAA+9ABFqRfLsAAj4vAAP9QwAEGEjUAAAABAGDAAPvQARekXy7AAI+LwAD/UBykbocAwIDcdmQBAAGUAMAA/PXAAQYShwDAgNx2g3cBAAGWAMAA++gAwAD8g2DAAPvQAMAA++oAwAD8hAbAAQYigvKkhKSJpe0AAMAAj5XAAP9QAAAAAQOklKXtAAAAAAAAAFwBPgFJpJ0WpKEuwACPh8AA/1DAAQYOPgJJpLIhFqS3LsAAj43AAP9QwAEGFT4BPTCkzh+k2MABBdEBAAEnwACPngA/PRelHy7AAGNawAD/UGqlKGDAAPvQUsABBgk+A0mlQRalRS7AAI+NwAD/UMABBhU+AT0wpVwfpWbAAQXRAQABJ8AAj58APz0Xpa8uwACPisAA/1AWpcguwABxWsAA/1DAAQYNwAEGET0cpdQuwACPoMAA/1AAAAAAwAEGJAbAAQYjgvKl8qX3pj8AAMAAj5bAAP9QAAAAAQOmAKY/AAAAAAAAAFwBPgI9F6YJLsAAj4rAAP9QFqYiLsAAcVrAAP9QwAEGDcABBhE9HKYsLsAAj6DAAP9QAAAAAMABBiQGwAEGJILypkSmSakCAADAAI+gwAD/UAAAAAEDplapAgAAAAAAAABcAT4BSabOHKbpFqbSLsAAj4rAAP9QwAEGEUgBAAGTAMAA/PM+AUmm9xym+y7AAI+UwAD/UAAAAADAAQYnPgJBR6cYFqcgLsAAj4bAAP9QwAEGDAMBp0tqp0tgwAD70IM+AD4DPRenXi7AAGNawAD/UGqnZ2DAAPvQgjzAAQYJPRynhhaney7AAHNGwAD/UMABBhSCiAAAAADAALmiQqebAAGnwmqnwmDAAPvQg+8APgI9HKffFqfULsAAc0bAAP9QwAEGFFYBAAEfp+fAAQYvAAAAAADAALmgQqgGAAGoLWqoLWDAAPvQg/IAPgI9HKhKFqg/LsAAc0bAAP9QwAEGFFYBAAEfqFLAAQY0AAAAAADAALmgQqhxAD0cqIouwACPocAA/1AAAAAAwAEGKD4BPRyouS7AAI+awAD/UAAAAADAAQYlPgE9F6joLsAAY1rAAP9QaqjxYMAA+9CBVcABBgkGwAEGJYLyqQepDKsVAADAAI+awAD/UAAAAAEDqRyrFQAAAAAAAABcAT4CSaklFqkpLsAAj4TAAP9QwAEGCj4ETqk7qUEAAIQ0YMAA4vMBHKlMFqlDLsAAj4/AAP9QwAEGF5dYAAAAAMAA7SxJqV8iIRypbBapYy7AAI+QwAD/UMABBhhIAQABKwDAAP0pABapdy7AAI+FwAD/UMABBgs+AT2IqY7AgN/3HKmfFqmWLsAAj5DAAP9QwAEGGMAAj6IBAAGAqbbAgN/3AMABBlE/QUepzRap1S7AAI+MwAD/UMABBhMCAaoPaqoPYMAA+9AVAD4CPRyqKhaqHy7AAHNGwAD/UMABBhRWAQABHKozaqouYMAAySiBh4cKAQABgKo6wIDf9wDAAMkxAMAAuaBCqk0AAap3aqp3YMAA+9AhAD4CPRyqlBaqiS7AAHNGwAD/UMABBhRWAQABgKqYwIDf9wDAALmgQqqqAD0Xqr8uwACPjMAA/1BqqutgwAD70AnAAQYTPz0cqvsuwACPocAA/1AAAAAAwAEGKAbAAQYmgvKrGqsfruMAAMAAj5nAAP9QAAAAAQOrL67jAAAAAAAAAFwBPgJBR6s4FqtALsAAj4bAAP9QwAEGDAMBq2dqq2dgwAD70IM+AD4GPRerdi7AAI9laquSYMAA+9DAAeQNwAEGGU6rsqu6AACnoWDAAOLzARyrxRarvC7AAI+PwAD/UMABBheXWAAAAADAAO0sSavaHKvtFqvmgKvewIDhumHAAPyjgJcBAAGTAMAA/P8+BEmr/hysERasCoCsAsCA4bphwAD8o0gBAAGUAMAA/PM+AT0wrCUfrC/AAQXRAQABJ8AAj5MAPz0XrGsuwACPZRyshxysghysfoCsd8CA4bpLAQABkwDAAPyDg7oBAAE3CADAAPvsgQYBAAEcrJCArInAgOG6SwEAAZQAwAD8gwDAAPvpwAEGGUmsnxysrRasoy7AAI9lwAEGGUgBAAFqrMBgwAD70MAB5A0AwAD88z4BPTCs4h+s7MABBdEBAAEnwACPkwA/Sa0oHK07Fq00gK0swIDhumHAAPyjgJcBAAGVAMAA/P8+AT0XrU4uwACPZhytYWqtXGDAAMkogYeHCgEAARytcICtaMCA4bqBWAEAAZUAwADi/ADAAMkxwAEGGj8/PRetmy7AAGNawAD/UGqtpGDAAPvQgjzAAQYJPRytvxattC7AAHNGwAD/UMABBhSCiAAAAADAALmiQq3QAAGt9Gqt9GDAAPvQg+8APgI9HK4NFq4CLsAAc0bAAP9QwAEGFFYBAAEfrhXAAQYvAQABHK4tFq4kLsAAj4/AAP9QwAEGF5dYAAAAAMAA7SwAAMAAuaBCrkQAAa5oaq5oYMAA+9CD8gA+Aj0croEWrnYuwABzRsAA/1DAAQYUVgEAAR+uicABBjQBAAEcrqEWrpguwACPj8AA/1DAAQYXl1gAAAAAwADtLAAAwAC5oEKuuAA9HK7JLsAAj6HAAP9QAAAAAMABBigGwAEGJ4Lyruiu7a+JAADAAI+UwAD/UAAAAAEDrvyviQAAAAAAAABgwAD6CgE+AUqvBQEiIhyvFBavDC7AAI+GwAD/UMABBgxIAQABaq8oYMAA+9CDPgDAAPzzARyvQRavOS7AAI+GwAD/UMABBgxIAQABaq9VYMAA+9CD7wDAAPzzARyvbRavZS7AAI+GwAD/UMABBgxIAQABaq+BYMAA+9CD8gDAAPzzBsABBiiC8q+Or5OwmgAAwACPocAA/1AAAAABA6+nsJoAAAAAAAAAXAE+CEmvsCIhHK+7Fq+0LsAAY1rAAP9QwAEGCUgBAAFqr75gwAD70II8AMAA/PMAIRyvzxavyC7AAGNawAD/UMABBglIAQABaq/SYMAA+9CECADAAPzzPRev2y7AAGNawAD/UGqv5GDAAPvQCcABBgk/PRev7y7AAI+EwAD/UCrAAQYKPRewAS7AAI+GwAD/UBywC5SBxAAAAADAAPvzwAEGDD0XsBMuwABxWsAA/1AcsBqUgcQAAAAAwAD788ABBg09F7AiLsAAj4jAAP9QHLA3lIHEAAAAAMAA+/PAAQYPPRewPy7AAI+JwAD/UJfAAQYQPRewYi7AAI+KwAD/UBywe5SBxAAAAADAAPvzwAEGET0XsIMuwACPi8AA/1CTwAEGEgAAgMk9AIDKFQCAyogAgMrLAIDWPgCA3OUAgN3MAIDeLQCA37YAgOFQAIDkLQCA5NYAgOYhAAAADALAAQYrgvKwn7ClsPoDwACPowAAAWDAAP0cAAABBMABBi2C8rDIsM8Jp6EAXcAA/HQBYMAA+9AAAQXAAQYvgvKw07DTsPgAAAADsOGw+AAAAAEAAbDoAAAEp6FdwAD8dAFgwAD70AFqsPJgwAD82XcAYMABBisBPwIIAcABBi2AAMCA5q4JAbDTwAD9MgAAAAAAAACA5uwAAAAAAsABBjCC8rD9sQOxWAPAAI+kAAABYMAA/RwAAAEEwAEGMoLysSaxLQmnoQBdwAD8dAFgwAD70AABBcABBjSC8rExsTGxVgAAAAOxP7FWAAAAAQABsUYAAASnoV3AAPx0AWDAAPvQAWqxUGDAAPzZdwBgwAEGMAE/AggBwAEGMoAAwIDnSQkBsTHAAP0yAAAAAAAAAIDnhwAAAAACwAEGNYLysamxr8AAR3IDwACPpQAAAV3AALnJAmDAAQA4YMABBa0AAWDAAQWnAwTAAQY4gvKyTbKMCcAAbv7AAP9QAF3AALngAWDAAQWtAR6yZcAAuewBAWDAAQWtAAGZpykEwAEGOYLysqiyuQnAAI+mwAD/UABeAAEBAV3AAPx0AWDAAP22AAFXwAD/VABbAATAAQY6gvKy1rLiCcAAj6fAAP9QAGDAAQWVAAEFwAEGQ4Lysuey57MrAAAAA7MAsysAAAACAgKzBgAABMAAj6ZeAAEBAV3AAPx0AWDAAP22AAFXwAD/VABbALMeAAAEwACPp2DAAQWVAABgwAEGNQE/AwgBwAEGOYAAwIDoWQgBwAEGOoEAwIDofAkBsufAALnNAAAAAAUGwAEGPILyszCzQrSHAACecAAAAAEDs0a0hwAAAAEBAbNbAAAggfVdwAC5WAFgwAEAOAAAXcAAuVgBYMABBa0BPgI9HLNwgLNpwIDo2YH5AgABNLN3A7N3tDMAAAABAQGzeAAAAINQYMABADgAAGDAAPzZAT4BPRy0DByzxx6zicABBj8DAAOBs5LAgOkZFrObLsAAj6bAAP9QwAEGORazri7AAI+nwAD/UMABBjoAga0BAVwBNLPMA7PMs/8AAAABAQGz1wAAAMAAfAdgwAEFrQAAXAFKs+UBHLPxFrPlLsAAbv7AAP9QwAEGOFYBAAGCs/XAgOl8AMAAufQAwAC4vIHxAQABFrQjFrQXLsAAbv7AAP9QwAEGOJwOwAC59QDAALi9AYOJNLQ9A7Q9tGIAAAAAAAAAYMAA/NkBPgE9HLRUFrRILsAAbv7AAP9QwAEGOIKIAAAAAMAAufbAALloSrRqARa0fRa0cS7AAG7+wAD/UMABBjiB9cAAueIGwAEGPoLytIy0oLaGAAHAAI78wAD/UAAAAAEDtLO2hgAAAAEBAbS7AAAAwACNHmDAAP22AABdwAD8dAFgwAD9tgE+Bk6027TiAACVNF3AAPx0AWDAAP22AR606MAA924BAWDAAP22AZMATrUAtQYAAGpgwAD70AGTTrUTtRkAACdgwAD70AGTQ7UiHLUvg7UpwIDqsGMBAAEWtT2AtTHAgOpcYcAA/boAwAD8/T4CSbVNHLVkHLVcgLVRwIDqXEsBAAGDtV3AgOqwAMAA/cNIAQABJ4CnAMAA/cU+Aj0ctX2BtXbAgOp7VgEAARy1jYC1gcCA6lyAvgIAAoK1l8CA6qGDtZ7AgOqwAMAA/cwAwAD8hT2Kta/AgOqhHLW9g7W3wIDqsGQBAAGUAMAA/PVJtc8iHLXmHLXegLXTwIDqXEsBAAGDtd/AgOqwAMAA/cNIAQABJ4DZAMAA/cUBHLYDHLX7gLXwwIDqXEsBAAGDtfzAgOqwAMAA/cNIAQABJ4OnAMAA/cU+AT2KthbAgOqhHLYbgrYWwIDqoWQBAAGUAMAA/PU/PYu2LcCA6rActjKDti3AgOqwZAEAAZQAwAD89T0ctkeBtkDAgOp7VgEAARy2V4C2S8CA6lyAvgIAAoK2YcCA6qGDtmjAgOqwAMAA/cwAwAD8hUq2dQGBtnzAgOp7BsABBj+C8raLtqS/eQABwACPqMAA/1AAAAABA7asv3kAAAADAwO2uQAAAINQYMABADgAttoAAADAAI+mXgABAQFdwAD8dAFgwAD9tgABV8AA/1QAWwC3AAAAAMAAj1dgwAEFlQAAXcAAuKkBYMABBa0BPgVOtxe3IAAAg1FgwAEASAEWtyqAtyLAgOxeg1HAAQBFSbc4IR63PcABBkEBAAGAt0/AgOxeAD4CPTW3fwAAAQBgwAEASAGDt3/AgOytNQAAAAEAWwEXt5KEt5DAgOzlg1Jqt6pgwAD70MABfOjAAQBLNQAAAAEAWwEct7+Et73AgOzlgogAAAAAwADwtYQAwIDs5Uq3zgEet9nAALizAQFgwAEFrQEft/XAAQXRAQABJ8AAj6kAAD9PuDq4TAAAAcAAi7lhAWDAAP22XcAAuKkBYMABBa0AA7hTu+UAAAABAQG4WwAAAMAAf6NgwAD9tgAAXcAAuKkBYMABBa0BPgo9NbiRAAABAGDAAQBIAYO4kcCA7K01AAAAAQBbARe4pIa4osCA7a2DUmq4vGDAAPvQwACRH8ABAEs1AAAAAQBbARy44Ra42Ya418CA7a2eO8ABAFFWAgACarjxYMAA/bbAAdXSJ8AAj6oAwAD/+jUAAAABAFsBHLkgFrkYhrkWwIDtrZ47wAEAUVYCAAJquTBgwAD9tsAB1mQnwACPqwDAAP/6hgDAgO2tTrlauV4AAIPRYMAA/bYBHLlwFrlogLlgwIDsXp47wAEAPoCWAQABJ8AAj6wAwAD/+U65mLmdAADAAG2/YMABARgBH7mjwAEBIQAAAAA9HLm3h7mywIDuhlYBAAEWudEkudAChrm9wIDuVWq5wWDAAP22wAHl6Z+jwAD9vgDAAQD8TrnqufEAAIRNYMAA/bYBHroAwAEA7AEAARy6E4e6DsCA7oaCiAAAAADAAQD9AD0cujQWuiyDuiPAgOytnjvAAQBRVgIAAifAAI+uFLpQwIDu1ggAAMAA//pJul8hHLpshbpjwIDtjUgBAAErAMAA/cU+AT0cupAWuoiDun/AgOytnjvAAQBRVgIAAifAAI+vhbquwIDtjQDAAP/6P066zLrUAADAAI+wYMABBkQBHrrWwAEGQAMAA4C67MCA7F6DuvXAgOytgrr/wIDsjgA9F7slFrsdg7sUwIDsrZ47wAEAUcAAjDSTwAD/9Eq7PgEcu10cu06Du0XAgOytwACMUgAAAADAAQBWga0BAWDAAQWtATS7bQO7bbveAAAAAQEBu24AAADAAHvCYMAA9GwAAGDAAQaPAUq7gwEfu4fAAQbEBQAFFLuxwIDv9QoAhbu5wIDtjYK7w8CA7I4pFLvWwIDvcwkAAADAALi8Trvwu/oAAMAAf+RdwAD8dAFgwAD9tgEcvAsWvASAu/zAgOxenjvAAQA+SwEAASfAAI+vAMAA//hJvCsiIRy8OYW8L8CA8EFIAQABKwDAAP0pACEcvFaBvETAgOxrSAEAASsAwAD9KT4CPY29LMCA8EEevTjAAQY+AQABHL1Whb1MwIDwQVgBAAEngYsAwAD8RgBKvWkBHL8uHL6dHL2yHr10wAC4rwEBYMAA/bYBNL2DA72DvaUAAAAAAAAAXcAAuKUBYMAA/bYBSr2JASa9iQEcvZqBvYnAgOxrIAEAAYW9m8CA8EEAAF3AALilAWDAAP22AIGtAQFgwAD9tgE0vb8Dvb++mwAAAAEBAb3AAAAAwAB/o2DAAP22AABgwAD9tgE+Akm91By99By94oW92MCA8EGAuwEAAYa96sCA8UwAwAD8iWMBAAGTAMAA/P0+AT0wvgUfvg/AAQXRAQABJ8AAj7EAP0q+gwGGvorAgPFMAMAAuLyB8QEAATS+qAO+qL8sAAAAAQEBvqkAAACBxVsAAGDAAPzZAT4CPTW+ugAAAQBgwAEASAGDvrrAgOytNQAAAAEAWwEXvs+Hvs3AgPHdg1JqvudgwAD70MABfVzAAQBLNQAAAAEAWwEcvweHvwXAgPHdgogAAAAAwADwtYcAwIDx3T0wvxiGvx7AgPHJAMAAuL2BrQEBYMABBa0BhL8+wIDtZgDAALi8PgFKv1sBHL9phL9iwIDtZiABAAErAAAGwAEGQILyv36/ocAARB0AAcAAj7LAAP9QAAAAAQO/tsAARB0AAAADAwO/wwAAAINQYMABADgAv98AAACDUWDAAQBIAL/8AAAAwACPV2DAAQWVAABgwAEGRAE+BU7AAEATwABAIwAAwACPs2DAAP22ARzAAEA1FsAAQC2AwABAJcCA8p2eO8ABAD6AlgEAASfAAI+0AMAA//k9IxzAAEBtg8AAQF3AgPLQSAEAASsAwAD9xYvAAEBdwIDy0CcAKwFgwAD9tk7AAEB+wABAgQAAwACPtWDAAQADAR7AAECPwAEABwIAAYPAAECVwIDy0AHAAIw5J4CnScAAQMAiFsAAQNCCwABAxMCA8rfAAH++wAEFnwAcwABA5BbAAEDehMAAQNvAgPM5gJbAAQAKSAEAAWrAAED2YMAA/bbAAeWKAMAA/cU+Bk7AAEEXwABBHAAAgVRgwAEF8gEcwABBKoLAAEEewIDyt8AAj07AAP9QAQABhMAAQTjAgPM5AMABBaQ9HMAAQVUWwABBTYHAAEFEwIDyqp47wAEAUVYCAAInwACPtBbAAEF6hcAAQXXAgPO6wACNHsABBfQAwAD/+k7AAEGSwABBqgAAwACPQmDAAPoKASIcwABBxRbAAEG6hMAAQbfAgPM5moDAAQALh0EBAAFqwABB0WDAAP22wAHllADAAPy4ABbAAEIIgsAAQfzAgPK3wACPQsABBZxOwABCLMAAQkQAAMAAj0FgwAD6CgEiHMAAQl8WwABCVITAAEJRwIDzOZqAwAEAC4dBAQABasAAQmtgwAD9tsAB5Y8AwAD8uAAWwABCooLAAEKWwIDyt8AAj0HAAQWbTsAAQsbAAELOAADAAI+wYMABBkQBH8AAQtTAAQZUBQAABcAAj0KGwABDFMCA9DLAAI9Bh8AAQ1DAgPSQwACPRBbAAEONhcAAQ4jAgPO6wACAZcABBfXAAI9DFsAAQ8CFwABDu8CA87rAAIBlwAEF9cAAj2EpSsAAQ/MBFMAAQ/rAgPTuCAA/SsAARA4BKwbAAQZBgvLAAEQiwABELsAAR3AAAcAAj7bAAP9QAAAAAQPAAEQ/wABHcAAAAAEBAcAAREwAAACDUGDAAQA4AABgwAD6CgE+DEnAAERbIRzAAERuFsAARGeAwABEX8CA9auWQcABADtIAQABJ50tAMAA/cU+AUrAAESAASo/ScAARJgcwABEyhzAAESrFsAARKSAwABEnMCA9aueO8ABAD5LAQABasAARLhgwAD9tsAB1dIAwAD/+EgBAAErAMAA/Sk+AUrAAETbASo/TsAARPjAAEUCAADAAI7xYMAA+goBKj0cwABFPRzAAEUeFsAARReAwABFD8CA9aueO8ABAD5LAQABasAARStgwAD9tsAB1dIAwAD/+IP4AQABNMAARUUDwABFRcAARZkAAAABAQHAAEVNAAAAgJZgwAD9tgAAYMAA/NkBPgFJwABFXBzAAEV0HMAARWaCwABFYMCA9quWUwAAAADAAP3bSAEAASfAAIu5AMAA/cU9icAARYLAgPZHKT8AwAD8QknAAEWgIYHAAEWlwID2R0rAAEWwASo/TsAARcnAAEXRAADAAIu5YMAA/bYBHMAAReMWwABF24DAAEXTwID1q547wAEAPoCWAQABasAARfVgwAD9tsAB1mQAwAD/+UnAAEYJIhzAAEYVgsAARg3AgPccSAEAASsAwAD9xQEhHMAARjYcwABGKILAAEYgwID3HJZTAAAAAMAA/dtIAQABJ8AAj6sAwAD9xT4BSsAARk4BKj9OwABGbcAARnUAAIHjYMAA/bYBHMAARocWwABGf4DAAEZ3wID1q547wAEAPoCWAQABJ8AAj7cAwAD/+UnAAEarIhzAAEa3g8AARq/AgPe3SAEAASsAwAD9xQEhHMAARsqDwABGwsCA97dIAQABJ8AAhvcAwAD9xT4BSsAARtsBKj9OwABG+sAARv4AAIPRYMAA/bYBHMAARxAWwABHCIDAAEcAwID1q547wAEAPoCWAQABJ8AAj6wAwAD/+UnAAEcwHMAARziEwABHNMCA+DhIAQABKwDAAP3FPgFKwABHSQEqP0rAAEdhASkAAIDouQCA6jYAgOw4AIDycwCA9XsAgPigAAAABQLAAQZEgvLAAEd1wABHe8AAUjkDwACPuAAAAWDAAP0cAAAHBMABBkaC8sAAR6DAAEe3GMAAj0IAYMAA+goABMABBkeC8sAAR8DAAEfXGMAAj0EAYMAA+goABMABBkiC8sAAR9/AAEfyGMAAj0MAYMAA+9AABMABBkmC8sAAR/rAAEgNGMAAj0QAYMAA+9AABMABBkqC8sAASBbAAEggGMAAj2EAYMAA+goABMABBkuC8sAASDPAAEg6GIH3AGDAAO3LASsEwAEGTILywABITMAASFMYiLcAYMAA7csBKwEFwAEGVILywABIWMAASFjAAElyAAAAA8AASHPAAElyAAAABQAABcAASIEAAATAAI9DYMAA+9ABasAASKVgwAD70MAAgXLAAEjFAAAEwACPRGDAAPvQAWrAAEjpYMAA+9DAAIFywABJCQAABMAAj0JgwAD6CgFqwABJImDAAPoKAMAASTQAAATAAI9BYMAA+goBasAASU1gwAD6CgDAAElfAAAEwACPYWDAAPoKAWrAAElrYMAA+goAYMABBkQBPwYIAcABBkiAAMCA+cIIAcABBkmBAMCA+eEIAcABBkaCAMCA+gAIAcABBkeDAMCA+hwIAcABBkqEAMCA+jgJAcAASFjAAP0yAAAAAAQGwAEGT4LywABJd8AASXzAAEpHAADAAI+5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AIA8qwCAjIYAgJfcAICiMACApncAgKmkAICuHwCAtwoAgLi5AIC+/wCAv/wAgMCrAIDDDgCAw6AAgMSmAIDmWgCA5vUAgOeQAID4vQCBAgMAgRkCAIEmWwCBKTMAgVUKAAAAYACBV3gAgVhvAAAAAQAAAvoAAAAAJnNka3Jvb3Q6L3BrZy9jb21waWxlci9iaW4vZGFydDJqcy5kYXJ0gpMvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEVudHJ5cG9pbnQgdG8gcnVuIHRoZSBjb21waWxlci4gVGhpcyBlbnRyeXBvaW50IGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkKLy8vIGRhcnQyanMgZGV2ZWxvcGVycy4gVG8gcnVuIHRoZSBjb21waWxlciB5b3Ugbm93IGNhbjoKLy8vICAgKiBjYWxsIGBwdWIgZ2V0YCBpbiB0aGUgcGtnL2NvbXBpbGVyIGZvbGRlci4KLy8vICAgKiBzaW1wbHkgY2FsbCBgZGFydCBwYXRoLXRvLXBrZy9jb21waWxlci9iaW4vZGFydDJqcy5kYXJ0IGZvby5kYXJ0YAovLyBUT0RPKHNpZ211bmQpOiBtb3ZlIGBtYWluYCBoZXJlLCBhbmQgY2hhbmdlIG91ciBzZGsgYnVpbGQgdG9vbHMgdG8ganVzdCB1c2UKLy8gdGhpcyBlbnRyeXBvaW50IGluc3RlYWQuCmxpYnJhcnkgY29tcGlsZXIuYmluLmRhcnQyanM7CgpleHBvcnQgJ3BhY2thZ2U6Y29tcGlsZXIvc3JjL2RhcnQyanMuZGFydCc7Cg8ATk48AU45M0pPHB4BLAEmc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2Jpbi9kYXJ0MmpzLmRhcnQqc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvZGFydDJqcy5kYXJ0wACjMy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuY21kbGluZTsKCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmU7CmltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IHV0ZjgsIExpbmVTcGxpdHRlcjsKaW1wb3J0ICdkYXJ0OmlvJyBzaG93IGV4aXQsIEZpbGUsIEZpbGVNb2RlLCBQbGF0Zm9ybSwgc3RkaW4sIHN0ZGVycjsKaW1wb3J0ICdkYXJ0Omlzb2xhdGUnIHNob3cgSXNvbGF0ZTsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9kYXJ0MmpzLmRhcnQnIGFzIGZlOwoKaW1wb3J0ICcuLi9jb21waWxlcl9uZXcuZGFydCcgYXMgYXBpOwppbXBvcnQgJ2NvbW1hbmRsaW5lX29wdGlvbnMuZGFydCc7CmltcG9ydCAnZmlsZW5hbWVzLmRhcnQnOwppbXBvcnQgJ29wdGlvbnMuZGFydCcgc2hvdyBDb21waWxlck9wdGlvbnM7CmltcG9ydCAnc291cmNlX2ZpbGVfcHJvdmlkZXIuZGFydCc7CmltcG9ydCAndXRpbC9jb21tYW5kX2xpbmUuZGFydCc7CmltcG9ydCAndXRpbC91dGlsLmRhcnQnIHNob3cgc3RhY2tUcmFjZUZpbGVQcmVmaXg7Cgpjb25zdCBTdHJpbmcgX2RlZmF1bHRTcGVjaWZpY2F0aW9uVXJpID0gJy4uLy4uLy4uLy4uL3Nkay9saWIvbGlicmFyaWVzLmpzb24nOwpjb25zdCBTdHJpbmcgT1VUUFVUX0xBTkdVQUdFX0RBUlQgPSAnRGFydCc7CgovLy8gQSBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIHJldmlzaW9uIG9yIGJ1aWxkLgovLy8KLy8vIFRoaXMgSUQgaXMgZGlzcGxheWVkIGlmIHRoZSBjb21waWxlciBjcmFzaGVzIGFuZCBpbiB2ZXJib3NlIG1vZGUsIGFuZCBpcwovLy8gYW4gYWlkIGluIHJlcHJvZHVjaW5nIGJ1ZyByZXBvcnRzLgovLy8KLy8vIFRoZSBhY3R1YWwgc3RyaW5nIGlzIHJld3JpdHRlbiBieSBhIHdyYXBwZXIgc2NyaXB0IHdoZW4gaW5jbHVkZWQgaW4gdGhlIHNkay4KU3RyaW5nIEJVSUxEX0lEID0gbnVsbDsKCi8vLyBUaGUgZGF0YSBwYXNzZWQgdG8gdGhlIFtIYW5kbGVPcHRpb25dIGNhbGxiYWNrIGlzIGVpdGhlciBhIHNpbmdsZQovLy8gc3RyaW5nIGFyZ3VtZW50LCBvciB0aGUgYXJndW1lbnRzIGl0ZXJhdG9yIGZvciBtdWx0aXBsZSBhcmd1bWVudHMKLy8vIGhhbmRsZXJzLgp0eXBlZGVmIHZvaWQgSGFuZGxlT3B0aW9uKE51bGwgZGF0YSk7CgpjbGFzcyBPcHRpb25IYW5kbGVyIHsKICBmaW5hbCBTdHJpbmcgcGF0dGVybjsKICBmaW5hbCBIYW5kbGVPcHRpb24gX2hhbmRsZTsKICBmaW5hbCBib29sIG11bHRpcGxlQXJndW1lbnRzOwoKICB2b2lkIGhhbmRsZShhcmd1bWVudCkgewogICAgKF9oYW5kbGUgYXMgZHluYW1pYykoYXJndW1lbnQpOwogIH0KCiAgT3B0aW9uSGFuZGxlcih0aGlzLnBhdHRlcm4sIHRoaXMuX2hhbmRsZSwge3RoaXMubXVsdGlwbGVBcmd1bWVudHM6IGZhbHNlfSk7Cn0KCi8vLyBFeHRyYWN0IHRoZSBwYXJhbWV0ZXIgb2YgYW4gb3B0aW9uLgovLy8KLy8vIEZvciBleGFtcGxlLCBpbiBbJy0tb3V0PWZpc2suanMnXSBhbmQgWyctb2hlc3QuanMnXSwgdGhlIHBhcmFtZXRlcnMKLy8vIGFyZSBbJ2Zpc2suanMnXSBhbmQgWydoZXN0LmpzJ10sIHJlc3BlY3RpdmVseS4KU3RyaW5nIGV4dHJhY3RQYXJhbWV0ZXIoU3RyaW5nIGFyZ3VtZW50LCB7Ym9vbCBpc09wdGlvbmFsQXJndW1lbnQ6IGZhbHNlfSkgewogIC8vIG1bMF0gaXMgdGhlIGVudGlyZSBtYXRjaCAod2hpY2ggd2lsbCBiZSBlcXVhbCB0byBhcmd1bWVudCkuIG1bMV0KICAvLyBpcyBzb21ldGhpbmcgbGlrZSAiLW8iIG9yICItLW91dD0iLCBhbmQgbVsyXSBpcyB0aGUgcGFyYW1ldGVyLgogIE1hdGNoIG0gPSBuZXcgUmVnRXhwKCdeKC1bYS16QS1aXXwtLS4rPSkoLiopJykuZmlyc3RNYXRjaChhcmd1bWVudCk7CiAgaWYgKG0gPT0gbnVsbCkgewogICAgaWYgKGlzT3B0aW9uYWxBcmd1bWVudCkgcmV0dXJuIG51bGw7CiAgICBoZWxwQW5kRmFpbCgnVW5rbm93biBvcHRpb24gIiRhcmd1bWVudCIuJyk7CiAgfQogIHJldHVybiBtWzJdOwp9CgpTdHJpbmcgZXh0cmFjdFBhdGgoU3RyaW5nIGFyZ3VtZW50LCB7Ym9vbCBpc0RpcmVjdG9yeTogdHJ1ZX0pIHsKICBTdHJpbmcgcGF0aCA9IG5hdGl2ZVRvVXJpUGF0aChleHRyYWN0UGFyYW1ldGVyKGFyZ3VtZW50KSk7CiAgcmV0dXJuICFwYXRoLmVuZHNXaXRoKCIvIikgJiYgaXNEaXJlY3RvcnkgPyAiJHBhdGgvIiA6IHBhdGg7Cn0KCnZvaWQgcGFyc2VDb21tYW5kTGluZShMaXN0PE9wdGlvbkhhbmRsZXI+IGhhbmRsZXJzLCBMaXN0PFN0cmluZz4gYXJndikgewogIC8vIFRPRE8oYWhlKTogVXNlIC4uLy4uL2FyZ3MvYXJncy5kYXJ0IGZvciBwYXJzaW5nIG9wdGlvbnMgaW5zdGVhZC4KICB2YXIgcGF0dGVybnMgPSA8U3RyaW5nPltdOwogIGZvciAoT3B0aW9uSGFuZGxlciBoYW5kbGVyIGluIGhhbmRsZXJzKSB7CiAgICBwYXR0ZXJucy5hZGQoaGFuZGxlci5wYXR0ZXJuKTsKICB9CiAgdmFyIHBhdHRlcm4gPSBuZXcgUmVnRXhwKCdeKCR7cGF0dGVybnMuam9pbigiKVwkfF4oIil9KVwkJyk7CgogIEl0ZXJhdG9yPFN0cmluZz4gYXJndW1lbnRzID0gYXJndi5pdGVyYXRvcjsKICBPVVRFUjoKICB3aGlsZSAoYXJndW1lbnRzLm1vdmVOZXh0KCkpIHsKICAgIFN0cmluZyBhcmd1bWVudCA9IGFyZ3VtZW50cy5jdXJyZW50OwogICAgTWF0Y2ggbWF0Y2ggPSBwYXR0ZXJuLmZpcnN0TWF0Y2goYXJndW1lbnQpOwogICAgYXNzZXJ0KG1hdGNoLmdyb3VwQ291bnQgPT0gaGFuZGxlcnMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKG1hdGNoW2kgKyAxXSAhPSBudWxsKSB7CiAgICAgICAgT3B0aW9uSGFuZGxlciBoYW5kbGVyID0gaGFuZGxlcnNbaV07CiAgICAgICAgaWYgKGhhbmRsZXIubXVsdGlwbGVBcmd1bWVudHMpIHsKICAgICAgICAgIGhhbmRsZXIuaGFuZGxlKGFyZ3VtZW50cyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhhbmRsZXIuaGFuZGxlKGFyZ3VtZW50KTsKICAgICAgICB9CiAgICAgICAgY29udGludWUgT1VURVI7CiAgICAgIH0KICAgIH0KICAgIHRocm93ICdJbnRlcm5hbCBlcnJvcjogIiRhcmd1bWVudCIgZGlkIG5vdCBtYXRjaCc7CiAgfQp9CgpGb3JtYXR0aW5nRGlhZ25vc3RpY0hhbmRsZXIgZGlhZ25vc3RpY0hhbmRsZXI7CgpGdXR1cmU8YXBpLkNvbXBpbGF0aW9uUmVzdWx0PiBjb21waWxlKExpc3Q8U3RyaW5nPiBhcmd2LAogICAge2ZlLkluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSBrZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGV9KSB7CiAgU3RvcHdhdGNoIHdhbGxjbG9jayA9IG5ldyBTdG9wd2F0Y2goKS4uc3RhcnQoKTsKICBzdGFja1RyYWNlRmlsZVByZWZpeCA9ICckY3VycmVudERpcmVjdG9yeSc7CiAgVXJpIGxpYnJhcmllc1NwZWNpZmljYXRpb25VcmkgPQogICAgICBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmUoJ2xpYi9saWJyYXJpZXMuanNvbicpOwogIGJvb2wgb3V0cHV0U3BlY2lmaWVkID0gZmFsc2U7CiAgVXJpIG91dDsKICBVcmkgc291cmNlTWFwT3V0OwogIFVyaSByZWFkRGF0YVVyaTsKICBVcmkgd3JpdGVEYXRhVXJpOwogIFVyaSByZWFkQ29kZWdlblVyaTsKICBVcmkgd3JpdGVDb2RlZ2VuVXJpOwogIGludCBjb2RlZ2VuU2hhcmQ7CiAgaW50IGNvZGVnZW5TaGFyZHM7CiAgTGlzdDxTdHJpbmc+IGJhemVsUGF0aHM7CiAgVXJpIHBhY2thZ2VDb25maWcgPSBudWxsOwogIFVyaSBwYWNrYWdlUm9vdCA9IG51bGw7CiAgTGlzdDxTdHJpbmc+IG9wdGlvbnMgPSBuZXcgTGlzdDxTdHJpbmc+KCk7CiAgYm9vbCB3YW50SGVscCA9IGZhbHNlOwogIGJvb2wgd2FudFZlcnNpb24gPSBmYWxzZTsKICBib29sIHRydXN0VHlwZUFubm90YXRpb25zID0gZmFsc2U7CiAgYm9vbCBjaGVja2VkTW9kZSA9IGZhbHNlOwogIGJvb2wgc3Ryb25nTW9kZSA9IHRydWU7CiAgTGlzdDxTdHJpbmc+IGhpbnRzID0gPFN0cmluZz5bXTsKICBib29sIHZlcmJvc2U7CiAgYm9vbCB0aHJvd09uRXJyb3I7CiAgaW50IHRocm93T25FcnJvckNvdW50OwogIGJvb2wgc2hvd1dhcm5pbmdzOwogIGJvb2wgc2hvd0hpbnRzOwogIGJvb2wgZW5hYmxlQ29sb3JzOwogIGludCBvcHRpbWl6YXRpb25MZXZlbCA9IG51bGw7CiAgVXJpIHBsYXRmb3JtQmluYXJpZXM7CiAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCA9IG5ldyBNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAgUmVhZFN0cmF0ZWd5IHJlYWRTdHJhdGVneSA9IFJlYWRTdHJhdGVneS5mcm9tRGFydDsKICBXcml0ZVN0cmF0ZWd5IHdyaXRlU3RyYXRlZ3kgPSBXcml0ZVN0cmF0ZWd5LnRvSnM7CgogIHZvaWQgcGFzc1Rocm91Z2goU3RyaW5nIGFyZ3VtZW50KSA9PiBvcHRpb25zLmFkZChhcmd1bWVudCk7CiAgdm9pZCBpZ25vcmVPcHRpb24oU3RyaW5nIGFyZ3VtZW50KSB7fQoKICBpZiAoQlVJTERfSUQgIT0gbnVsbCkgewogICAgcGFzc1Rocm91Z2goIi0tYnVpbGQtaWQ9JEJVSUxEX0lEIik7CiAgfQoKICB2b2lkIHNldExpYnJhcnlTcGVjaWZpY2F0aW9uVXJpKFN0cmluZyBhcmd1bWVudCkgewogICAgbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSA9CiAgICAgICAgY3VycmVudERpcmVjdG9yeS5yZXNvbHZlKGV4dHJhY3RQYXRoKGFyZ3VtZW50LCBpc0RpcmVjdG9yeTogZmFsc2UpKTsKICB9CgogIHZvaWQgc2V0UGFja2FnZVJvb3QoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICBwYWNrYWdlUm9vdCA9IGN1cnJlbnREaXJlY3RvcnkucmVzb2x2ZShleHRyYWN0UGF0aChhcmd1bWVudCkpOwogIH0KCiAgdm9pZCBzZXRQYWNrYWdlQ29uZmlnKFN0cmluZyBhcmd1bWVudCkgewogICAgcGFja2FnZUNvbmZpZyA9CiAgICAgICAgY3VycmVudERpcmVjdG9yeS5yZXNvbHZlKGV4dHJhY3RQYXRoKGFyZ3VtZW50LCBpc0RpcmVjdG9yeTogZmFsc2UpKTsKICB9CgogIHZvaWQgc2V0T3V0cHV0KEl0ZXJhdG9yPFN0cmluZz4gYXJndW1lbnRzKSB7CiAgICBvdXRwdXRTcGVjaWZpZWQgPSB0cnVlOwogICAgU3RyaW5nIHBhdGg7CiAgICBpZiAoYXJndW1lbnRzLmN1cnJlbnQgPT0gJy1vJykgewogICAgICBpZiAoIWFyZ3VtZW50cy5tb3ZlTmV4dCgpKSB7CiAgICAgICAgaGVscEFuZEZhaWwoJ0Vycm9yOiBNaXNzaW5nIGZpbGUgYWZ0ZXIgLW8gb3B0aW9uLicpOwogICAgICB9CiAgICAgIHBhdGggPSBhcmd1bWVudHMuY3VycmVudDsKICAgIH0gZWxzZSB7CiAgICAgIHBhdGggPSBleHRyYWN0UGFyYW1ldGVyKGFyZ3VtZW50cy5jdXJyZW50KTsKICAgIH0KICAgIG91dCA9IGN1cnJlbnREaXJlY3RvcnkucmVzb2x2ZShuYXRpdmVUb1VyaVBhdGgocGF0aCkpOwogIH0KCiAgdm9pZCBzZXRPcHRpbWl6YXRpb25MZXZlbChTdHJpbmcgYXJndW1lbnQpIHsKICAgIGludCB2YWx1ZSA9IGludC50cnlQYXJzZShleHRyYWN0UGFyYW1ldGVyKGFyZ3VtZW50KSk7CiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA8IDAgfHwgdmFsdWUgPiA0KSB7CiAgICAgIGhlbHBBbmRGYWlsKCJFcnJvcjogVW5zdXBwb3J0ZWQgb3B0aW1pemF0aW9uIGxldmVsICckYXJndW1lbnQnLCAiCiAgICAgICAgICAic3VwcG9ydGVkIGxldmVscyBhcmU6IDAsIDEsIDIsIDMsIDQiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgb3B0aW1pemF0aW9uTGV2ZWwgPSB2YWx1ZTsKICB9CgogIHZvaWQgc2V0T3V0cHV0VHlwZShTdHJpbmcgYXJndW1lbnQpIHsKICAgIGlmIChhcmd1bWVudCA9PSAnLS1vdXRwdXQtdHlwZT1kYXJ0JyB8fAogICAgICAgIGFyZ3VtZW50ID09ICctLW91dHB1dC10eXBlPWRhcnQtbXVsdGknKSB7CiAgICAgIGhlbHBBbmRGYWlsKAogICAgICAgICAgIi0tb3V0cHV0LXR5cGU9ZGFydCBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiBJdCB3YXMgZGVwcmVjYXRlZCAiCiAgICAgICAgICAic2luY2UgRGFydCAxLjExIGFuZCByZW1vdmVkIGluIERhcnQgMS4xOS4iKTsKICAgIH0KICB9CgogIHNldFN0cmlwKFN0cmluZyBhcmd1bWVudCkgewogICAgaGVscEFuZEZhaWwoIk9wdGlvbiAnLS1mb3JjZS1zdHJpcCcgaXMgbm90IGluIHVzZSBub3cgdGhhdCIKICAgICAgICAiLS1vdXRwdXQtdHlwZT1kYXJ0IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIik7CiAgfQoKICB2b2lkIHNldEJhemVsUGF0aHMoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICBTdHJpbmcgcGF0aHMgPSBleHRyYWN0UGFyYW1ldGVyKGFyZ3VtZW50KTsKICAgIGJhemVsUGF0aHMgPSA8U3RyaW5nPltdLi5hZGRBbGwocGF0aHMuc3BsaXQoJywnKSk7CiAgfQoKICBTdHJpbmcgZ2V0RGVwc091dHB1dChJdGVyYWJsZTxVcmk+IHNvdXJjZUZpbGVzKSB7CiAgICB2YXIgZmlsZW5hbWVzID0gc291cmNlRmlsZXMubWFwKCh1cmkpID0+ICckdXJpJykudG9MaXN0KCk7CiAgICBmaWxlbmFtZXMuc29ydCgpOwogICAgcmV0dXJuIGZpbGVuYW1lcy5qb2luKCJcbiIpOwogIH0KCiAgdm9pZCBzZXRBbGxvd05hdGl2ZUV4dGVuc2lvbnMoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICBoZWxwQW5kRmFpbCgiT3B0aW9uICcke0ZsYWdzLmFsbG93TmF0aXZlRXh0ZW5zaW9uc30nIGlzIG5vdCBzdXBwb3J0ZWQuIik7CiAgfQoKICB2b2lkIHNldFZlcmJvc2UoXykgewogICAgdmVyYm9zZSA9IHRydWU7CiAgICBwYXNzVGhyb3VnaCgnLS12ZXJib3NlJyk7CiAgfQoKICB2b2lkIHNldFRydXN0VHlwZUFubm90YXRpb25zKFN0cmluZyBhcmd1bWVudCkgewogICAgdHJ1c3RUeXBlQW5ub3RhdGlvbnMgPSB0cnVlOwogIH0KCiAgdm9pZCBzZXRDaGVja2VkTW9kZShTdHJpbmcgYXJndW1lbnQpIHsKICAgIGNoZWNrZWRNb2RlID0gdHJ1ZTsKICAgIHBhc3NUaHJvdWdoKGFyZ3VtZW50KTsKICB9CgogIHZvaWQgYWRkSW5FbnZpcm9ubWVudChTdHJpbmcgYXJndW1lbnQpIHsKICAgIGludCBlcUluZGV4ID0gYXJndW1lbnQuaW5kZXhPZignPScpOwogICAgU3RyaW5nIG5hbWUgPSBhcmd1bWVudC5zdWJzdHJpbmcoMiwgZXFJbmRleCk7CiAgICBTdHJpbmcgdmFsdWUgPSBhcmd1bWVudC5zdWJzdHJpbmcoZXFJbmRleCArIDEpOwogICAgZW52aXJvbm1lbnRbbmFtZV0gPSB2YWx1ZTsKICB9CgogIHZvaWQgc2V0Q2F0ZWdvcmllcyhTdHJpbmcgYXJndW1lbnQpIHsKICAgIExpc3Q8U3RyaW5nPiBjYXRlZ29yaWVzID0gZXh0cmFjdFBhcmFtZXRlcihhcmd1bWVudCkuc3BsaXQoJywnKTsKICAgIGJvb2wgaXNTZXJ2ZXJNb2RlID0gY2F0ZWdvcmllcy5sZW5ndGggPT0gMSAmJiBjYXRlZ29yaWVzLnNpbmdsZSA9PSAiU2VydmVyIjsKICAgIGlmIChpc1NlcnZlck1vZGUpIHsKICAgICAgaGludHMuYWRkKCJUaGUgLS1jYXRlZ29yaWVzIGZsYWcgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSBkZWxldGVkIGluIGEgIgogICAgICAgICAgImZ1dHVyZSByZWxlYXNlLCBwbGVhc2UgdXNlICcke0ZsYWdzLnNlcnZlck1vZGV9JyBpbnN0ZWFkIG9mICIKICAgICAgICAgICInLS1jYXRlZ29yaWVzPVNlcnZlcicuIik7CiAgICAgIHBhc3NUaHJvdWdoKEZsYWdzLnNlcnZlck1vZGUpOwogICAgfSBlbHNlIHsKICAgICAgaGludHMuYWRkKAogICAgICAgICAgIlRoZSAtLWNhdGVnb3JpZXMgZmxhZyBpcyBkZXByZWNhdGVkLCBzZWUgdGhlIHVzYWdlIGZvciBkZXRhaWxzLiIpOwogICAgfQogIH0KCiAgdm9pZCBzZXRQbGF0Zm9ybUJpbmFyaWVzKFN0cmluZyBhcmd1bWVudCkgewogICAgcGxhdGZvcm1CaW5hcmllcyA9CiAgICAgICAgY3VycmVudERpcmVjdG9yeS5yZXNvbHZlKGV4dHJhY3RQYXRoKGFyZ3VtZW50LCBpc0RpcmVjdG9yeTogdHJ1ZSkpOwogIH0KCiAgdm9pZCBzZXRSZWFkRGF0YShTdHJpbmcgYXJndW1lbnQpIHsKICAgIGlmIChhcmd1bWVudCAhPSBGbGFncy5yZWFkRGF0YSkgewogICAgICByZWFkRGF0YVVyaSA9IG5hdGl2ZVRvVXJpKGV4dHJhY3RQYXRoKGFyZ3VtZW50LCBpc0RpcmVjdG9yeTogZmFsc2UpKTsKICAgIH0KICAgIGlmIChyZWFkU3RyYXRlZ3kgIT0gUmVhZFN0cmF0ZWd5LmZyb21Db2RlZ2VuKSB7CiAgICAgIHJlYWRTdHJhdGVneSA9IFJlYWRTdHJhdGVneS5mcm9tRGF0YTsKICAgIH0KICB9CgogIHZvaWQgc2V0RGlsbERlcGVuZGVuY2llcyhTdHJpbmcgYXJndW1lbnQpIHsKICAgIFN0cmluZyBkZXBlbmRlbmNpZXMgPSBleHRyYWN0UGFyYW1ldGVyKGFyZ3VtZW50KTsKICAgIFN0cmluZyB1cmlEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuc3BsaXRNYXBKb2luKCcsJywKICAgICAgICBvbk1hdGNoOiAoXykgPT4gJywnLCBvbk5vbk1hdGNoOiAocCkgPT4gJyR7bmF0aXZlVG9VcmkocCl9Jyk7CiAgICBvcHRpb25zLmFkZCgnJHtGbGFncy5kaWxsRGVwZW5kZW5jaWVzfT0ke3VyaURlcGVuZGVuY2llc30nKTsKICB9CgogIHZvaWQgc2V0Q2ZlT25seShTdHJpbmcgYXJndW1lbnQpIHsKICAgIGlmICh3cml0ZVN0cmF0ZWd5ID09IFdyaXRlU3RyYXRlZ3kudG9EYXRhKSB7CiAgICAgIGZhaWwoIkNhbm5vdCB1c2UgJHtGbGFncy5jZmVPbmx5fSAiCiAgICAgICAgICAiYW5kIHdyaXRlIHNlcmlhbGl6ZWQgZGF0YSBzaW11bHRhbmVvdXNseS4iKTsKICAgIH0KICAgIGlmICh3cml0ZVN0cmF0ZWd5ID09IFdyaXRlU3RyYXRlZ3kudG9Db2RlZ2VuKSB7CiAgICAgIGZhaWwoIkNhbm5vdCB1c2UgJHtGbGFncy5jZmVPbmx5fSAiCiAgICAgICAgICAiYW5kIHdyaXRlIHNlcmlhbGl6ZWQgY29kZWdlbiBzaW11bHRhbmVvdXNseS4iKTsKICAgIH0KICAgIHdyaXRlU3RyYXRlZ3kgPSBXcml0ZVN0cmF0ZWd5LnRvS2VybmVsOwogIH0KCiAgdm9pZCBzZXRSZWFkQ29kZWdlbihTdHJpbmcgYXJndW1lbnQpIHsKICAgIGlmIChhcmd1bWVudCAhPSBGbGFncy5yZWFkQ29kZWdlbikgewogICAgICByZWFkQ29kZWdlblVyaSA9IG5hdGl2ZVRvVXJpKGV4dHJhY3RQYXRoKGFyZ3VtZW50LCBpc0RpcmVjdG9yeTogZmFsc2UpKTsKICAgIH0KICAgIHJlYWRTdHJhdGVneSA9IFJlYWRTdHJhdGVneS5mcm9tQ29kZWdlbjsKICB9CgogIHZvaWQgc2V0V3JpdGVEYXRhKFN0cmluZyBhcmd1bWVudCkgewogICAgaWYgKHdyaXRlU3RyYXRlZ3kgPT0gV3JpdGVTdHJhdGVneS50b0tlcm5lbCkgewogICAgICBmYWlsKCJDYW5ub3QgdXNlICR7RmxhZ3MuY2ZlT25seX0gIgogICAgICAgICAgImFuZCB3cml0ZSBzZXJpYWxpemVkIGRhdGEgc2ltdWx0YW5lb3VzbHkuIik7CiAgICB9CiAgICBpZiAod3JpdGVTdHJhdGVneSA9PSBXcml0ZVN0cmF0ZWd5LnRvQ29kZWdlbikgewogICAgICBmYWlsKCJDYW5ub3Qgd3JpdGUgc2VyaWFsaXplZCBkYXRhIGFuZCBjb2RlZ2VuIHNpbXVsdGFuZW91c2x5LiIpOwogICAgfQogICAgaWYgKGFyZ3VtZW50ICE9IEZsYWdzLndyaXRlRGF0YSkgewogICAgICB3cml0ZURhdGFVcmkgPSBuYXRpdmVUb1VyaShleHRyYWN0UGF0aChhcmd1bWVudCwgaXNEaXJlY3Rvcnk6IGZhbHNlKSk7CiAgICB9CiAgICB3cml0ZVN0cmF0ZWd5ID0gV3JpdGVTdHJhdGVneS50b0RhdGE7CiAgfQoKICB2b2lkIHNldFdyaXRlQ29kZWdlbihTdHJpbmcgYXJndW1lbnQpIHsKICAgIGlmICh3cml0ZVN0cmF0ZWd5ID09IFdyaXRlU3RyYXRlZ3kudG9LZXJuZWwpIHsKICAgICAgZmFpbCgiQ2Fubm90IHVzZSAke0ZsYWdzLmNmZU9ubHl9ICIKICAgICAgICAgICJhbmQgd3JpdGUgc2VyaWFsaXplZCBjb2RlZ2VuIHNpbXVsdGFuZW91c2x5LiIpOwogICAgfQogICAgaWYgKHdyaXRlU3RyYXRlZ3kgPT0gV3JpdGVTdHJhdGVneS50b0RhdGEpIHsKICAgICAgZmFpbCgiQ2Fubm90IHdyaXRlIHNlcmlhbGl6ZWQgZGF0YSBhbmQgY29kZWdlbiBkYXRhIHNpbXVsdGFuZW91c2x5LiIpOwogICAgfQogICAgaWYgKGFyZ3VtZW50ICE9IEZsYWdzLndyaXRlQ29kZWdlbikgewogICAgICB3cml0ZUNvZGVnZW5VcmkgPSBuYXRpdmVUb1VyaShleHRyYWN0UGF0aChhcmd1bWVudCwgaXNEaXJlY3Rvcnk6IGZhbHNlKSk7CiAgICB9CiAgICB3cml0ZVN0cmF0ZWd5ID0gV3JpdGVTdHJhdGVneS50b0NvZGVnZW47CiAgfQoKICB2b2lkIHNldENvZGVnZW5TaGFyZChTdHJpbmcgYXJndW1lbnQpIHsKICAgIGNvZGVnZW5TaGFyZCA9IGludC5wYXJzZShleHRyYWN0UGFyYW1ldGVyKGFyZ3VtZW50KSk7CiAgfQoKICB2b2lkIHNldENvZGVnZW5TaGFyZHMoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICBjb2RlZ2VuU2hhcmRzID0gaW50LnBhcnNlKGV4dHJhY3RQYXJhbWV0ZXIoYXJndW1lbnQpKTsKICB9CgogIHZvaWQgc2V0RHVtcEluZm8oU3RyaW5nIGFyZ3VtZW50KSB7CiAgICBwYXNzVGhyb3VnaChGbGFncy5kdW1wSW5mbyk7CiAgICBpZiAoYXJndW1lbnQgPT0gRmxhZ3MuZHVtcEluZm8gfHwgYXJndW1lbnQgPT0gIiR7RmxhZ3MuZHVtcEluZm99PWpzb24iKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChhcmd1bWVudCA9PSAiJHtGbGFncy5kdW1wSW5mb309YmluYXJ5IikgewogICAgICBwYXNzVGhyb3VnaChhcmd1bWVudCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGhlbHBBbmRGYWlsKCJFcnJvcjogVW5zdXBwb3J0ZWQgZHVtcC1pbmZvIGZvcm1hdCAnJGFyZ3VtZW50JywgIgogICAgICAgICJzdXBwb3J0ZWQgZm9ybWF0cyBhcmU6IGpzb24gb3IgYmluYXJ5Iik7CiAgfQoKICB2b2lkIGhhbmRsZVRocm93T25FcnJvcihTdHJpbmcgYXJndW1lbnQpIHsKICAgIHRocm93T25FcnJvciA9IHRydWU7CiAgICBTdHJpbmcgcGFyYW1ldGVyID0gZXh0cmFjdFBhcmFtZXRlcihhcmd1bWVudCwgaXNPcHRpb25hbEFyZ3VtZW50OiB0cnVlKTsKICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgewogICAgICB2YXIgY291bnQgPSBpbnQucGFyc2UocGFyYW1ldGVyKTsKICAgICAgdGhyb3dPbkVycm9yQ291bnQgPSBjb3VudDsKICAgIH0KICB9CgogIHZvaWQgaGFuZGxlU2hvcnRPcHRpb25zKFN0cmluZyBhcmd1bWVudCkgewogICAgdmFyIHNob3J0T3B0aW9ucyA9IGFyZ3VtZW50LnN1YnN0cmluZygxKS5zcGxpdCgiIik7CiAgICBmb3IgKHZhciBzaG9ydE9wdGlvbiBpbiBzaG9ydE9wdGlvbnMpIHsKICAgICAgc3dpdGNoIChzaG9ydE9wdGlvbikgewogICAgICAgIGNhc2UgJ3YnOgogICAgICAgICAgc2V0VmVyYm9zZShudWxsKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2gnOgogICAgICAgIGNhc2UgJz8nOgogICAgICAgICAgd2FudEhlbHAgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYyc6CiAgICAgICAgICBzZXRDaGVja2VkTW9kZShGbGFncy5lbmFibGVDaGVja2VkTW9kZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdtJzoKICAgICAgICAgIHBhc3NUaHJvdWdoKEZsYWdzLm1pbmlmeSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgJ0ludGVybmFsIGVycm9yOiAiJHNob3J0T3B0aW9uIiBkaWQgbm90IG1hdGNoJzsKICAgICAgfQogICAgfQogIH0KCiAgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cyA9IDxTdHJpbmc+W107CiAgTGlzdDxPcHRpb25IYW5kbGVyPiBoYW5kbGVycyA9IDxPcHRpb25IYW5kbGVyPlsKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctW2Nodm0/XSsnLCBoYW5kbGVTaG9ydE9wdGlvbnMpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0tdGhyb3ctb24tZXJyb3IoPzo9WzAtOV0rKT8nLCBoYW5kbGVUaHJvd09uRXJyb3IpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3Muc3VwcHJlc3NXYXJuaW5ncywgKFN0cmluZyBhcmd1bWVudCkgewogICAgICBzaG93V2FybmluZ3MgPSBmYWxzZTsKICAgICAgcGFzc1Rocm91Z2goYXJndW1lbnQpOwogICAgfSksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5mYXRhbFdhcm5pbmdzLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5zdXBwcmVzc0hpbnRzLCAoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICAgIHNob3dIaW50cyA9IGZhbHNlOwogICAgICBwYXNzVGhyb3VnaChhcmd1bWVudCk7CiAgICB9KSwKICAgIC8vIFRPRE8oc2lnbXVuZCk6IHJlbW92ZSBlbnRpcmVseSBhZnRlciBEYXJ0IDEuMjAKICAgIG5ldyBPcHRpb25IYW5kbGVyKAogICAgICAgICctLW91dHB1dC10eXBlPWRhcnR8LS1vdXRwdXQtdHlwZT1kYXJ0LW11bHRpfC0tb3V0cHV0LXR5cGU9anMnLAogICAgICAgIHNldE91dHB1dFR5cGUpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0tdXNlLWtlcm5lbCcsIGlnbm9yZU9wdGlvbiksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5wbGF0Zm9ybUJpbmFyaWVzLCBzZXRQbGF0Zm9ybUJpbmFyaWVzKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLm5vRnJlcXVlbmN5QmFzZWRNaW5pZmljYXRpb24sIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnZlcmJvc2UsIHNldFZlcmJvc2UpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MucHJvZ3Jlc3MsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnZlcnNpb24sIChfKSA9PiB3YW50VmVyc2lvbiA9IHRydWUpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0tbGlicmFyeS1yb290PS4rJywgaWdub3JlT3B0aW9uKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLWxpYnJhcmllcy1zcGVjPS4rJywgc2V0TGlicmFyeVNwZWNpZmljYXRpb25VcmkpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJyR7RmxhZ3MuZGlsbERlcGVuZGVuY2llc309LisnLCBzZXREaWxsRGVwZW5kZW5jaWVzKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCcke0ZsYWdzLnJlYWREYXRhfXwke0ZsYWdzLnJlYWREYXRhfT0uKycsIHNldFJlYWREYXRhKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCcke0ZsYWdzLndyaXRlRGF0YX18JHtGbGFncy53cml0ZURhdGF9PS4rJywgc2V0V3JpdGVEYXRhKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKAogICAgICAgICcke0ZsYWdzLnJlYWRDb2RlZ2VufXwke0ZsYWdzLnJlYWRDb2RlZ2VufT0uKycsIHNldFJlYWRDb2RlZ2VuKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKAogICAgICAgICcke0ZsYWdzLndyaXRlQ29kZWdlbn18JHtGbGFncy53cml0ZUNvZGVnZW59PS4rJywgc2V0V3JpdGVDb2RlZ2VuKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCcke0ZsYWdzLmNvZGVnZW5TaGFyZH09LisnLCBzZXRDb2RlZ2VuU2hhcmQpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJyR7RmxhZ3MuY29kZWdlblNoYXJkc309LisnLCBzZXRDb2RlZ2VuU2hhcmRzKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLmNmZU9ubHksIHNldENmZU9ubHkpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuZGVidWdHbG9iYWxJbmZlcmVuY2UsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLW91dD0uK3wtby4qJywgc2V0T3V0cHV0LCBtdWx0aXBsZUFyZ3VtZW50czogdHJ1ZSksCiAgICBuZXcgT3B0aW9uSGFuZGxlcignLU8uKicsIHNldE9wdGltaXphdGlvbkxldmVsKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLmFsbG93TW9ja0NvbXBpbGF0aW9uLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuZmFzdFN0YXJ0dXAsIGlnbm9yZU9wdGlvbiksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5nZW5lcmljTWV0aG9kU3ludGF4LCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuaW5pdGlhbGl6aW5nRm9ybWFsQWNjZXNzLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MubWluaWZ5LCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5ub01pbmlmeSwgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MucHJlc2VydmVVcmlzLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0tZm9yY2Utc3RyaXA9LionLCBzZXRTdHJpcCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5kaXNhYmxlRGlhZ25vc3RpY0NvbG9ycywgKF8pIHsKICAgICAgZW5hYmxlQ29sb3JzID0gZmFsc2U7CiAgICB9KSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLmVuYWJsZURpYWdub3N0aWNDb2xvcnMsIChfKSB7CiAgICAgIGVuYWJsZUNvbG9ycyA9IHRydWU7CiAgICB9KSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLWVuYWJsZVtfLV1jaGVja2VkW18tXW1vZGV8LS1jaGVja2VkJywKICAgICAgICAoXykgPT4gc2V0Q2hlY2tlZE1vZGUoRmxhZ3MuZW5hYmxlQ2hlY2tlZE1vZGUpKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLmVuYWJsZUFzc2VydHMsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnRydXN0VHlwZUFubm90YXRpb25zLCBzZXRUcnVzdFR5cGVBbm5vdGF0aW9ucyksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy50cnVzdFByaW1pdGl2ZXMsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnRydXN0SlNJbnRlcm9wVHlwZUFubm90YXRpb25zLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihyJy0taGVscHwvXD98L2gnLCAoXykgPT4gd2FudEhlbHAgPSB0cnVlKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLXBhY2thZ2VzPS4rJywgc2V0UGFja2FnZUNvbmZpZyksCiAgICBuZXcgT3B0aW9uSGFuZGxlcignLS1wYWNrYWdlLXJvb3Q9Lit8LXAuKycsIHNldFBhY2thZ2VSb290KSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLm5vU291cmNlTWFwcywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoT3B0aW9uLnJlc29sdXRpb25JbnB1dCwgaWdub3JlT3B0aW9uKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKE9wdGlvbi5iYXplbFBhdGhzLCBzZXRCYXplbFBhdGhzKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnJlc29sdmVPbmx5LCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuZGlzYWJsZU5hdGl2ZUxpdmVUeXBlQW5hbHlzaXMsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLWNhdGVnb3JpZXM9LionLCBzZXRDYXRlZ29yaWVzKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnNlcnZlck1vZGUsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLmRpc2FibGVJbmxpbmluZywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuZGlzYWJsZVByb2dyYW1TcGxpdCwgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuZGlzYWJsZVR5cGVJbmZlcmVuY2UsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnVzZVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5kaXNhYmxlUnRpT3B0aW1pemF0aW9uLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy50ZXJzZSwgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0tZGVmZXJyZWQtbWFwPS4rJywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MubmV3RGVmZXJyZWRTcGxpdCwgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MucmVwb3J0SW52YWxpZEluZmVycmVkRGVmZXJyZWRUeXBlcywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJyR7RmxhZ3MuZHVtcEluZm99fCR7RmxhZ3MuZHVtcEluZm99PS4rJywgc2V0RHVtcEluZm8pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0tZGlzYWxsb3ctdW5zYWZlLWV2YWwnLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoT3B0aW9uLnNob3dQYWNrYWdlV2FybmluZ3MsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKE9wdGlvbi5lbmFibGVMYW5ndWFnZUV4cGVyaW1lbnRzLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy51c2VDb250ZW50U2VjdXJpdHlQb2xpY3ksIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLWVuYWJsZS1leHBlcmltZW50YWwtbWlycm9ycycsIGlnbm9yZU9wdGlvbiksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5lbmFibGVBc3NlcnRNZXNzYWdlLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcignLS1zdHJvbmcnLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MucHJldmlld0RhcnQyLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3Mub21pdEltcGxpY2l0Q2hlY2tzLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5vbWl0QXNDYXN0cywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MubGF4UnVudGltZVR5cGVUb1N0cmluZywgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuYmVuY2htYXJraW5nUHJvZHVjdGlvbiwgcGFzc1Rocm91Z2gpLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuYmVuY2htYXJraW5nRXhwZXJpbWVudCwgcGFzc1Rocm91Z2gpLAoKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiByZW1vdmUgY29uZGl0aW9uYWwgZGlyZWN0aXZlcyBmbGFnLgogICAgLy8gV2UgZG9uJ3QgcHJvdmlkZSB0aGUgaW5mby1tZXNzYWdlIHlldCwgc2luY2Ugd2UgaGF2ZW4ndCBwdWJsaWNseQogICAgLy8gbGF1bmNoZWQgdGhlIGZlYXR1cmUgeWV0LgogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuY29uZGl0aW9uYWxEaXJlY3RpdmVzLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy0tZW5hYmxlLWFzeW5jJywgaWdub3JlT3B0aW9uKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLWVuYWJsZS1udWxsLWF3YXJlLW9wZXJhdG9ycycsIGlnbm9yZU9wdGlvbiksCiAgICBuZXcgT3B0aW9uSGFuZGxlcignLS1lbmFibGUtZW51bScsIGlnbm9yZU9wdGlvbiksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5hbGxvd05hdGl2ZUV4dGVuc2lvbnMsIHNldEFsbG93TmF0aXZlRXh0ZW5zaW9ucyksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5nZW5lcmF0ZUNvZGVXaXRoQ29tcGlsZVRpbWVFcnJvcnMsIGlnbm9yZU9wdGlvbiksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy51c2VNdWx0aVNvdXJjZUluZm8sIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnVzZU5ld1NvdXJjZUluZm8sIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLnRlc3RNb2RlLCBwYXNzVGhyb3VnaCksCgogICAgLy8gRXhwZXJpbWVudGFsIGZlYXR1cmVzLgogICAgLy8gV2UgZG9uJ3QgcHJvdmlkZSBkb2N1bWVudGF0aW9uIGZvciB0aGVzZSB5ZXQuCiAgICAvLyBUT0RPKDI5NTc0KTogcHJvdmlkZSBkb2N1bWVudGF0aW9uIHdoZW4gdGhpcyBmZWF0dXJlIGlzIHN1cHBvcnRlZC4KICAgIC8vIFRPRE8oMjk1NzQpOiBwcm92aWRlIGEgd2FybmluZy9oaW50L2Vycm9yLCB3aGVuIHByb2ZpbGUtYmFzZWQgZGF0YSBpcwogICAgLy8gdXNlZCB3aXRob3V0IGAtLWZhc3Qtc3RhcnR1cGAuCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5leHBlcmltZW50YWxUcmFja0FsbG9jYXRpb25zLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcigiJHtGbGFncy5leHBlcmltZW50YWxBbGxvY2F0aW9uc1BhdGh9PS4rIiwgcGFzc1Rocm91Z2gpLAoKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLmV4cGVyaW1lbnRMb2NhbE5hbWVzLCBpZ25vcmVPcHRpb24pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoRmxhZ3MuZXhwZXJpbWVudFN0YXJ0dXBGdW5jdGlvbnMsIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLmV4cGVyaW1lbnRUb0Jvb2xlYW4sIHBhc3NUaHJvdWdoKSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKEZsYWdzLmV4cGVyaW1lbnRDYWxsSW5zdHJ1bWVudGF0aW9uLCBwYXNzVGhyb3VnaCksCiAgICBuZXcgT3B0aW9uSGFuZGxlcihGbGFncy5leHBlcmltZW50TmV3UnRpLCBwYXNzVGhyb3VnaCksCgogICAgLy8gVGhlIGZvbGxvd2luZyB0aHJlZSBvcHRpb25zIG11c3QgY29tZSBsYXN0LgogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy1ELis9LionLCBhZGRJbkVudmlyb25tZW50KSwKICAgIG5ldyBPcHRpb25IYW5kbGVyKCctLionLCAoU3RyaW5nIGFyZ3VtZW50KSB7CiAgICAgIGhlbHBBbmRGYWlsKCJVbmtub3duIG9wdGlvbiAnJGFyZ3VtZW50Jy4iKTsKICAgIH0pLAogICAgbmV3IE9wdGlvbkhhbmRsZXIoJy4qJywgKFN0cmluZyBhcmd1bWVudCkgewogICAgICBhcmd1bWVudHMuYWRkKG5hdGl2ZVRvVXJpUGF0aChhcmd1bWVudCkpOwogICAgfSkKICBdOwoKICBwYXJzZUNvbW1hbmRMaW5lKGhhbmRsZXJzLCBhcmd2KTsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWVhc3VyZSB0aW1lIGZvciByZWFkaW5nIGZpbGVzLgogIFNvdXJjZUZpbGVQcm92aWRlciBpbnB1dFByb3ZpZGVyOwogIGlmIChiYXplbFBhdGhzICE9IG51bGwpIHsKICAgIGlucHV0UHJvdmlkZXIgPSBuZXcgQmF6ZWxJbnB1dFByb3ZpZGVyKGJhemVsUGF0aHMpOwogIH0gZWxzZSB7CiAgICBpbnB1dFByb3ZpZGVyID0gbmV3IENvbXBpbGVyU291cmNlRmlsZVByb3ZpZGVyKCk7CiAgfQoKICBkaWFnbm9zdGljSGFuZGxlciA9IG5ldyBGb3JtYXR0aW5nRGlhZ25vc3RpY0hhbmRsZXIoaW5wdXRQcm92aWRlcik7CiAgaWYgKHZlcmJvc2UgIT0gbnVsbCkgewogICAgZGlhZ25vc3RpY0hhbmRsZXIudmVyYm9zZSA9IHZlcmJvc2U7CiAgfQogIGlmICh0aHJvd09uRXJyb3IgIT0gbnVsbCkgewogICAgZGlhZ25vc3RpY0hhbmRsZXIudGhyb3dPbkVycm9yID0gdGhyb3dPbkVycm9yOwogIH0KICBpZiAodGhyb3dPbkVycm9yQ291bnQgIT0gbnVsbCkgewogICAgZGlhZ25vc3RpY0hhbmRsZXIudGhyb3dPbkVycm9yQ291bnQgPSB0aHJvd09uRXJyb3JDb3VudDsKICB9CiAgaWYgKHNob3dXYXJuaW5ncyAhPSBudWxsKSB7CiAgICBkaWFnbm9zdGljSGFuZGxlci5zaG93V2FybmluZ3MgPSBzaG93V2FybmluZ3M7CiAgfQogIGlmIChzaG93SGludHMgIT0gbnVsbCkgewogICAgZGlhZ25vc3RpY0hhbmRsZXIuc2hvd0hpbnRzID0gc2hvd0hpbnRzOwogIH0KICBpZiAoZW5hYmxlQ29sb3JzICE9IG51bGwpIHsKICAgIGRpYWdub3N0aWNIYW5kbGVyLmVuYWJsZUNvbG9ycyA9IGVuYWJsZUNvbG9yczsKICB9CgogIGlmIChjaGVja2VkTW9kZSAmJiBzdHJvbmdNb2RlKSB7CiAgICBjaGVja2VkTW9kZSA9IGZhbHNlOwogICAgaGludHMuYWRkKCJPcHRpb24gJyR7RmxhZ3MuZW5hYmxlQ2hlY2tlZE1vZGV9JyBpcyBub3QgbmVlZGVkIGluIERhcnQgMi4wLiAiCiAgICAgICAgIlRvIGVuYWJsZSBhc3NlcnRpb25zIHVzZSAnJHtGbGFncy5lbmFibGVBc3NlcnRzfScgaW5zdGVhZC4iKTsKICB9CgogIGlmICh0cnVzdFR5cGVBbm5vdGF0aW9ucyAmJiBzdHJvbmdNb2RlKSB7CiAgICBoaW50cy5hZGQoIk9wdGlvbiAnJHtGbGFncy50cnVzdFR5cGVBbm5vdGF0aW9uc30nIGlzIG5vdCBhdmFpbGFibGUgIgogICAgICAgICJpbiBEYXJ0IDIuMC4gVHJ5IHVzaW5nICcke0ZsYWdzLm9taXRJbXBsaWNpdENoZWNrc30nIGluc3RlYWQuIik7CiAgfQoKICBmb3IgKFN0cmluZyBoaW50IGluIGhpbnRzKSB7CiAgICBkaWFnbm9zdGljSGFuZGxlci5pbmZvKGhpbnQsIGFwaS5EaWFnbm9zdGljLkhJTlQpOwogIH0KCiAgaWYgKHdhbnRIZWxwIHx8IHdhbnRWZXJzaW9uKSB7CiAgICBoZWxwQW5kRXhpdCh3YW50SGVscCwgd2FudFZlcnNpb24sIGRpYWdub3N0aWNIYW5kbGVyLnZlcmJvc2UpOwogIH0KCiAgaWYgKGFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICBoZWxwQW5kRmFpbCgnTm8gRGFydCBmaWxlIHNwZWNpZmllZC4nKTsKICB9CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CiAgICB2YXIgZXh0cmEgPSBhcmd1bWVudHMuc3VibGlzdCgxKTsKICAgIGhlbHBBbmRGYWlsKCdFeHRyYSBhcmd1bWVudHM6ICR7ZXh0cmEuam9pbigiICIpfScpOwogIH0KCiAgaWYgKHRydXN0VHlwZUFubm90YXRpb25zICYmIGNoZWNrZWRNb2RlKSB7CiAgICBoZWxwQW5kRmFpbCgiT3B0aW9uICcke0ZsYWdzLnRydXN0VHlwZUFubm90YXRpb25zfScgbWF5IG5vdCBiZSB1c2VkIGluICIKICAgICAgICAiY2hlY2tlZCBtb2RlLiIpOwogIH0KCiAgaWYgKHBhY2thZ2VSb290ICE9IG51bGwgJiYgcGFja2FnZUNvbmZpZyAhPSBudWxsKSB7CiAgICBoZWxwQW5kRmFpbCgiQ2Fubm90IHNwZWNpZnkgYm90aCAnLS1wYWNrYWdlLXJvb3QnIGFuZCAnLS1wYWNrYWdlcy4iKTsKICB9CgogIFN0cmluZyBzY3JpcHROYW1lID0gYXJndW1lbnRzWzBdOwoKICBzd2l0Y2ggKHdyaXRlU3RyYXRlZ3kpIHsKICAgIGNhc2UgV3JpdGVTdHJhdGVneS50b0pzOgogICAgICBvdXQgPz89IGN1cnJlbnREaXJlY3RvcnkucmVzb2x2ZSgnb3V0LmpzJyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBXcml0ZVN0cmF0ZWd5LnRvS2VybmVsOgogICAgICBvdXQgPz89IGN1cnJlbnREaXJlY3RvcnkucmVzb2x2ZSgnb3V0LmRpbGwnKTsKICAgICAgb3B0aW9ucy5hZGQoRmxhZ3MuY2ZlT25seSk7CiAgICAgIGlmIChyZWFkU3RyYXRlZ3kgPT0gUmVhZFN0cmF0ZWd5LmZyb21EYXRhKSB7CiAgICAgICAgZmFpbCgiQ2Fubm90IHVzZSAke0ZsYWdzLmNmZU9ubHl9ICIKICAgICAgICAgICAgImFuZCByZWFkIHNlcmlhbGl6ZWQgZGF0YSBzaW11bHRhbmVvdXNseS4iKTsKICAgICAgfSBlbHNlIGlmIChyZWFkU3RyYXRlZ3kgPT0gUmVhZFN0cmF0ZWd5LmZyb21Db2RlZ2VuKSB7CiAgICAgICAgZmFpbCgiQ2Fubm90IHVzZSAke0ZsYWdzLmNmZU9ubHl9ICIKICAgICAgICAgICAgImFuZCByZWFkIHNlcmlhbGl6ZWQgY29kZWdlbiBzaW11bHRhbmVvdXNseS4iKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgV3JpdGVTdHJhdGVneS50b0RhdGE6CiAgICAgIG91dCA/Pz0gY3VycmVudERpcmVjdG9yeS5yZXNvbHZlKCdvdXQuZGlsbCcpOwogICAgICB3cml0ZURhdGFVcmkgPz89IGN1cnJlbnREaXJlY3RvcnkucmVzb2x2ZSgnJG91dC5kYXRhJyk7CiAgICAgIG9wdGlvbnMuYWRkKCcke0ZsYWdzLndyaXRlRGF0YX09JHt3cml0ZURhdGFVcml9Jyk7CiAgICAgIGlmIChyZWFkU3RyYXRlZ3kgPT0gUmVhZFN0cmF0ZWd5LmZyb21EYXRhKSB7CiAgICAgICAgZmFpbCgiQ2Fubm90IHJlYWQgYW5kIHdyaXRlIHNlcmlhbGl6ZWQgZGF0YSBzaW11bHRhbmVvdXNseS4iKTsKICAgICAgfSBlbHNlIGlmIChyZWFkU3RyYXRlZ3kgPT0gUmVhZFN0cmF0ZWd5LmZyb21Db2RlZ2VuKSB7CiAgICAgICAgZmFpbCgiQ2Fubm90IHJlYWQgc2VyaWFsaXplZCBjb2RlZ2VuIGFuZCAiCiAgICAgICAgICAgICJ3cml0ZSBzZXJpYWxpemVkIGRhdGEgc2ltdWx0YW5lb3VzbHkuIik7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIFdyaXRlU3RyYXRlZ3kudG9Db2RlZ2VuOgogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB0aGUgbmVlZCBmb3IgYW4gW291dF0gdmFsdWUgaW4gdGhpcyBjYXNlIG9yCiAgICAgIC8vIHVzZSBbb3V0XSB0byBwYXNzIFt3cml0ZUNvZGVnZW5VcmldLgogICAgICBvdXQgPz89IGN1cnJlbnREaXJlY3RvcnkucmVzb2x2ZSgnb3V0Jyk7CiAgICAgIHdyaXRlQ29kZWdlblVyaSA/Pz0gY3VycmVudERpcmVjdG9yeS5yZXNvbHZlKCckb3V0LmNvZGUnKTsKICAgICAgb3B0aW9ucy5hZGQoJyR7RmxhZ3Mud3JpdGVDb2RlZ2VufT0ke3dyaXRlQ29kZWdlblVyaX0nKTsKICAgICAgaWYgKHJlYWRTdHJhdGVneSA9PSBSZWFkU3RyYXRlZ3kuZnJvbUNvZGVnZW4pIHsKICAgICAgICBmYWlsKCJDYW5ub3QgcmVhZCBhbmQgd3JpdGUgc2VyaWFsaXplZCBjb2RlZ2VuIHNpbXVsdGFuZW91c2x5LiIpOwogICAgICB9CiAgICAgIGlmIChyZWFkU3RyYXRlZ3kgIT0gUmVhZFN0cmF0ZWd5LmZyb21EYXRhKSB7CiAgICAgICAgZmFpbCgiQ2FuIG9ubHkgd3JpdGUgc2VyaWFsaXplZCBjb2RlZ2VuIGZyb20gc2VyaWFsaXplZCBkYXRhLiIpOwogICAgICB9CiAgICAgIGlmIChjb2RlZ2VuU2hhcmRzID09IG51bGwpIHsKICAgICAgICBmYWlsKCJDYW5ub3Qgd3JpdGUgc2VyaWFsaXplZCBjb2RlZ2VuIHdpdGhvdXQgc2V0dGluZyAiCiAgICAgICAgICAgICIke0ZsYWdzLmNvZGVnZW5TaGFyZHN9LiIpOwogICAgICB9IGVsc2UgaWYgKGNvZGVnZW5TaGFyZHMgPD0gMCkgewogICAgICAgIGZhaWwoIiR7RmxhZ3MuY29kZWdlblNoYXJkc30gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuIik7CiAgICAgIH0KICAgICAgaWYgKGNvZGVnZW5TaGFyZCA9PSBudWxsKSB7CiAgICAgICAgZmFpbCgiQ2Fubm90IHdyaXRlIHNlcmlhbGl6ZWQgY29kZWdlbiB3aXRob3V0IHNldHRpbmcgIgogICAgICAgICAgICAiJHtGbGFncy5jb2RlZ2VuU2hhcmR9LiIpOwogICAgICB9IGVsc2UgaWYgKGNvZGVnZW5TaGFyZCA8IDAgfHwgY29kZWdlblNoYXJkID49IGNvZGVnZW5TaGFyZHMpIHsKICAgICAgICBmYWlsKCIke0ZsYWdzLmNvZGVnZW5TaGFyZH0gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICIKICAgICAgICAgICAgIiR7RmxhZ3MuY29kZWdlblNoYXJkc30uIik7CiAgICAgIH0KICAgICAgb3B0aW9ucy5hZGQoJyR7RmxhZ3MuY29kZWdlblNoYXJkfT0kY29kZWdlblNoYXJkJyk7CiAgICAgIG9wdGlvbnMuYWRkKCcke0ZsYWdzLmNvZGVnZW5TaGFyZHN9PSRjb2RlZ2VuU2hhcmRzJyk7CiAgICAgIGJyZWFrOwogIH0KICBzd2l0Y2ggKHJlYWRTdHJhdGVneSkgewogICAgY2FzZSBSZWFkU3RyYXRlZ3kuZnJvbURhcnQ6CiAgICAgIGJyZWFrOwogICAgY2FzZSBSZWFkU3RyYXRlZ3kuZnJvbURhdGE6CiAgICAgIHJlYWREYXRhVXJpID8/PSBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmUoJyRzY3JpcHROYW1lLmRhdGEnKTsKICAgICAgb3B0aW9ucy5hZGQoJyR7RmxhZ3MucmVhZERhdGF9PSR7cmVhZERhdGFVcml9Jyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBSZWFkU3RyYXRlZ3kuZnJvbUNvZGVnZW46CiAgICAgIHJlYWREYXRhVXJpID8/PSBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmUoJyRzY3JpcHROYW1lLmRhdGEnKTsKICAgICAgb3B0aW9ucy5hZGQoJyR7RmxhZ3MucmVhZERhdGF9PSR7cmVhZERhdGFVcml9Jyk7CiAgICAgIHJlYWRDb2RlZ2VuVXJpID8/PSBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmUoJyRzY3JpcHROYW1lLmNvZGUnKTsKICAgICAgb3B0aW9ucy5hZGQoJyR7RmxhZ3MucmVhZENvZGVnZW59PSR7cmVhZENvZGVnZW5Vcml9Jyk7CiAgICAgIGlmIChjb2RlZ2VuU2hhcmRzID09IG51bGwpIHsKICAgICAgICBmYWlsKCJDYW5ub3Qgd3JpdGUgc2VyaWFsaXplZCBjb2RlZ2VuIHdpdGhvdXQgc2V0dGluZyAiCiAgICAgICAgICAgICIke0ZsYWdzLmNvZGVnZW5TaGFyZHN9LiIpOwogICAgICB9IGVsc2UgaWYgKGNvZGVnZW5TaGFyZHMgPD0gMCkgewogICAgICAgIGZhaWwoIiR7RmxhZ3MuY29kZWdlblNoYXJkc30gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuIik7CiAgICAgIH0KICAgICAgb3B0aW9ucy5hZGQoJyR7RmxhZ3MuY29kZWdlblNoYXJkc309JGNvZGVnZW5TaGFyZHMnKTsKICB9CiAgb3B0aW9ucy5hZGQoJy0tb3V0PSRvdXQnKTsKICBpZiAod3JpdGVTdHJhdGVneSA9PSBXcml0ZVN0cmF0ZWd5LnRvSnMpIHsKICAgIHNvdXJjZU1hcE91dCA9IFVyaS5wYXJzZSgnJG91dC5tYXAnKTsKICAgIG9wdGlvbnMuYWRkKCctLXNvdXJjZS1tYXA9JHtzb3VyY2VNYXBPdXR9Jyk7CiAgfQoKICBSYW5kb21BY2Nlc3NGaWxlT3V0cHV0UHJvdmlkZXIgb3V0cHV0UHJvdmlkZXIgPQogICAgICBuZXcgUmFuZG9tQWNjZXNzRmlsZU91dHB1dFByb3ZpZGVyKG91dCwgc291cmNlTWFwT3V0LAogICAgICAgICAgb25JbmZvOiBkaWFnbm9zdGljSGFuZGxlci5pbmZvLCBvbkZhaWx1cmU6IGZhaWwpOwoKICBhcGkuQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25Eb25lKGFwaS5Db21waWxhdGlvblJlc3VsdCByZXN1bHQpIHsKICAgIGlmICghcmVzdWx0LmlzU3VjY2VzcykgewogICAgICBmYWlsKCdDb21waWxhdGlvbiBmYWlsZWQuJyk7CiAgICB9CiAgICB3cml0ZVN0cmluZygKICAgICAgICBVcmkucGFyc2UoJyRvdXQuZGVwcycpLCBnZXREZXBzT3V0cHV0KGlucHV0UHJvdmlkZXIuZ2V0U291cmNlVXJpcygpKSk7CgogICAgU3RyaW5nIGlucHV0ID0gdXJpUGF0aFRvTmF0aXZlKHNjcmlwdE5hbWUpOwogICAgaW50IGlucHV0U2l6ZTsKICAgIFN0cmluZyBwcm9jZXNzTmFtZTsKICAgIFN0cmluZyBpbnB1dE5hbWU7CgogICAgaW50IG91dHB1dFNpemU7CiAgICBpbnQgcHJpbWFyeU91dHB1dFNpemU7CiAgICBTdHJpbmcgb3V0cHV0TmFtZTsKCiAgICBTdHJpbmcgc3VtbWFyeTsKICAgIHN3aXRjaCAocmVhZFN0cmF0ZWd5KSB7CiAgICAgIGNhc2UgUmVhZFN0cmF0ZWd5LmZyb21EYXJ0OgogICAgICAgIGlucHV0TmFtZSA9ICdjaGFyYWN0ZXJzIERhcnQnOwogICAgICAgIGlucHV0U2l6ZSA9IGlucHV0UHJvdmlkZXIuZGFydENoYXJhY3RlcnNSZWFkOwogICAgICAgIHN1bW1hcnkgPSAnRGFydCBmaWxlICRpbnB1dCAnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFJlYWRTdHJhdGVneS5mcm9tRGF0YToKICAgICAgICBpbnB1dE5hbWUgPSAnYnl0ZXMgZGF0YSc7CiAgICAgICAgaW5wdXRTaXplID0gaW5wdXRQcm92aWRlci5kYXJ0Q2hhcmFjdGVyc1JlYWQ7CiAgICAgICAgU3RyaW5nIGRhdGFJbnB1dCA9CiAgICAgICAgICAgIGZlLnJlbGF0aXZpemVVcmkoY3VycmVudERpcmVjdG9yeSwgcmVhZERhdGFVcmksIFBsYXRmb3JtLmlzV2luZG93cyk7CiAgICAgICAgc3VtbWFyeSA9ICdEYXRhIGZpbGVzICRpbnB1dCBhbmQgJGRhdGFJbnB1dCAnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFJlYWRTdHJhdGVneS5mcm9tQ29kZWdlbjoKICAgICAgICBpbnB1dE5hbWUgPSAnYnl0ZXMgZGF0YSc7CiAgICAgICAgaW5wdXRTaXplID0gaW5wdXRQcm92aWRlci5kYXJ0Q2hhcmFjdGVyc1JlYWQ7CiAgICAgICAgU3RyaW5nIGRhdGFJbnB1dCA9CiAgICAgICAgICAgIGZlLnJlbGF0aXZpemVVcmkoY3VycmVudERpcmVjdG9yeSwgcmVhZERhdGFVcmksIFBsYXRmb3JtLmlzV2luZG93cyk7CiAgICAgICAgU3RyaW5nIGNvZGVJbnB1dCA9IGZlLnJlbGF0aXZpemVVcmkoCiAgICAgICAgICAgIGN1cnJlbnREaXJlY3RvcnksIHJlYWRDb2RlZ2VuVXJpLCBQbGF0Zm9ybS5pc1dpbmRvd3MpOwogICAgICAgIHN1bW1hcnkgPSAnRGF0YSBmaWxlcyAkaW5wdXQsICRkYXRhSW5wdXQgYW5kICcKICAgICAgICAgICAgJyR7Y29kZUlucHV0fVswLSR7Y29kZWdlblNoYXJkcyAtIDF9XSAnOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHN3aXRjaCAod3JpdGVTdHJhdGVneSkgewogICAgICBjYXNlIFdyaXRlU3RyYXRlZ3kudG9KczoKICAgICAgICBwcm9jZXNzTmFtZSA9ICdDb21waWxlZCc7CiAgICAgICAgb3V0cHV0TmFtZSA9ICdjaGFyYWN0ZXJzIEphdmFTY3JpcHQnOwogICAgICAgIG91dHB1dFNpemUgPSBvdXRwdXRQcm92aWRlci50b3RhbENoYXJhY3RlcnNXcml0dGVuSmF2YVNjcmlwdDsKICAgICAgICBwcmltYXJ5T3V0cHV0U2l6ZSA9IG91dHB1dFByb3ZpZGVyLnRvdGFsQ2hhcmFjdGVyc1dyaXR0ZW5QcmltYXJ5OwogICAgICAgIFN0cmluZyBvdXRwdXQgPQogICAgICAgICAgICBmZS5yZWxhdGl2aXplVXJpKGN1cnJlbnREaXJlY3RvcnksIG91dCwgUGxhdGZvcm0uaXNXaW5kb3dzKTsKICAgICAgICBzdW1tYXJ5ICs9ICdjb21waWxlZCB0byBKYXZhU2NyaXB0OiAke291dHB1dH0nOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFdyaXRlU3RyYXRlZ3kudG9LZXJuZWw6CiAgICAgICAgcHJvY2Vzc05hbWUgPSAnQ29tcGlsZWQnOwogICAgICAgIG91dHB1dE5hbWUgPSAna2VybmVsIGJ5dGVzJzsKICAgICAgICBvdXRwdXRTaXplID0gb3V0cHV0UHJvdmlkZXIudG90YWxEYXRhV3JpdHRlbjsKICAgICAgICBTdHJpbmcgb3V0cHV0ID0KICAgICAgICAgICAgZmUucmVsYXRpdml6ZVVyaShjdXJyZW50RGlyZWN0b3J5LCBvdXQsIFBsYXRmb3JtLmlzV2luZG93cyk7CiAgICAgICAgc3VtbWFyeSArPSAnY29tcGlsZWQgdG8gZGlsbDogJHtvdXRwdXR9Lic7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgV3JpdGVTdHJhdGVneS50b0RhdGE6CiAgICAgICAgcHJvY2Vzc05hbWUgPSAnU2VyaWFsaXplZCc7CiAgICAgICAgb3V0cHV0TmFtZSA9ICdieXRlcyBkYXRhJzsKICAgICAgICBvdXRwdXRTaXplID0gb3V0cHV0UHJvdmlkZXIudG90YWxEYXRhV3JpdHRlbjsKICAgICAgICBTdHJpbmcgb3V0cHV0ID0KICAgICAgICAgICAgZmUucmVsYXRpdml6ZVVyaShjdXJyZW50RGlyZWN0b3J5LCBvdXQsIFBsYXRmb3JtLmlzV2luZG93cyk7CiAgICAgICAgU3RyaW5nIGRhdGFPdXRwdXQgPSBmZS5yZWxhdGl2aXplVXJpKAogICAgICAgICAgICBjdXJyZW50RGlyZWN0b3J5LCB3cml0ZURhdGFVcmksIFBsYXRmb3JtLmlzV2luZG93cyk7CiAgICAgICAgc3VtbWFyeSArPSAnc2VyaWFsaXplZCB0byBkaWxsIGFuZCBkYXRhOiAke291dHB1dH0gYW5kICR7ZGF0YU91dHB1dH0uJzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBXcml0ZVN0cmF0ZWd5LnRvQ29kZWdlbjoKICAgICAgICBwcm9jZXNzTmFtZSA9ICdTZXJpYWxpemVkJzsKICAgICAgICBvdXRwdXROYW1lID0gJ2J5dGVzIGRhdGEnOwogICAgICAgIG91dHB1dFNpemUgPSBvdXRwdXRQcm92aWRlci50b3RhbERhdGFXcml0dGVuOwogICAgICAgIFN0cmluZyBjb2RlT3V0cHV0ID0gZmUucmVsYXRpdml6ZVVyaSgKICAgICAgICAgICAgY3VycmVudERpcmVjdG9yeSwgd3JpdGVDb2RlZ2VuVXJpLCBQbGF0Zm9ybS5pc1dpbmRvd3MpOwogICAgICAgIHN1bW1hcnkgKz0gJ3NlcmlhbGl6ZWQgdG8gY29kZWdlbiBkYXRhOiAnCiAgICAgICAgICAgICcke2NvZGVPdXRwdXR9JHtjb2RlZ2VuU2hhcmR9Lic7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcHJpbnQoJyRwcm9jZXNzTmFtZSAnCiAgICAgICAgJyR7X2Zvcm1hdENoYXJhY3RlckNvdW50KGlucHV0U2l6ZSl9ICRpbnB1dE5hbWUgdG8gJwogICAgICAgICcke19mb3JtYXRDaGFyYWN0ZXJDb3VudChvdXRwdXRTaXplKX0gJG91dHB1dE5hbWUgaW4gJwogICAgICAgICcke19mb3JtYXREdXJhdGlvbkFzU2Vjb25kcyh3YWxsY2xvY2suZWxhcHNlZCl9IHNlY29uZHMnKTsKICAgIGlmIChwcmltYXJ5T3V0cHV0U2l6ZSAhPSBudWxsKSB7CiAgICAgIGRpYWdub3N0aWNIYW5kbGVyLmluZm8oCiAgICAgICAgICAnJHtfZm9ybWF0Q2hhcmFjdGVyQ291bnQocHJpbWFyeU91dHB1dFNpemUpfSAkb3V0cHV0TmFtZSAnCiAgICAgICAgICAnaW4gJHtmZS5yZWxhdGl2aXplVXJpKGN1cnJlbnREaXJlY3RvcnksIG91dCwgUGxhdGZvcm0uaXNXaW5kb3dzKX0nKTsKICAgIH0KICAgIGlmICh3cml0ZVN0cmF0ZWd5ID09IFdyaXRlU3RyYXRlZ3kudG9KcykgewogICAgICBpZiAob3V0cHV0U3BlY2lmaWVkIHx8IGRpYWdub3N0aWNIYW5kbGVyLnZlcmJvc2UpIHsKICAgICAgICBwcmludChzdW1tYXJ5KTsKICAgICAgICBpZiAoZGlhZ25vc3RpY0hhbmRsZXIudmVyYm9zZSkgewogICAgICAgICAgdmFyIGZpbGVzID0gb3V0cHV0UHJvdmlkZXIuYWxsT3V0cHV0RmlsZXM7CiAgICAgICAgICBpbnQganNDb3VudCA9IGZpbGVzLndoZXJlKChmKSA9PiBmLmVuZHNXaXRoKCcuanMnKSkubGVuZ3RoOwogICAgICAgICAgcHJpbnQoJ0VtaXR0ZWQgZmlsZSAkanNDb3VudCBKYXZhU2NyaXB0IGZpbGVzLicpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcHJpbnQoc3VtbWFyeSk7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFVyaSBzY3JpcHQgPSBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmUoc2NyaXB0TmFtZSk7CgogIGRpYWdub3N0aWNIYW5kbGVyLmF1dG9SZWFkRmlsZVVyaSA9IHRydWU7CiAgQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IENvbXBpbGVyT3B0aW9ucy5wYXJzZShvcHRpb25zLAogICAgICBsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpOiBsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpLAogICAgICBwbGF0Zm9ybUJpbmFyaWVzOiBwbGF0Zm9ybUJpbmFyaWVzKQogICAgLi5lbnRyeVBvaW50ID0gc2NyaXB0CiAgICAuLnBhY2thZ2VSb290ID0gcGFja2FnZVJvb3QKICAgIC4ucGFja2FnZUNvbmZpZyA9IHBhY2thZ2VDb25maWcKICAgIC4uZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudAogICAgLi5rZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGUgPSBrZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGUKICAgIC4ub3B0aW1pemF0aW9uTGV2ZWwgPSBvcHRpbWl6YXRpb25MZXZlbDsKICByZXR1cm4gY29tcGlsZUZ1bmMoCiAgICAgICAgICBjb21waWxlck9wdGlvbnMsIGlucHV0UHJvdmlkZXIsIGRpYWdub3N0aWNIYW5kbGVyLCBvdXRwdXRQcm92aWRlcikKICAgICAgLnRoZW4oY29tcGlsYXRpb25Eb25lKTsKfQoKLy8vIFJldHVybnMgdGhlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGZvcm1hdHRlZCB3aXRoIGEgdGhvdXNhbmRzIHNlcGFyYXRvci4KU3RyaW5nIF9mb3JtYXRDaGFyYWN0ZXJDb3VudChpbnQgdmFsdWUsIFtTdHJpbmcgc2VwYXJhdG9yID0gJywnXSkgewogIFN0cmluZyB0ZXh0ID0gJyR2YWx1ZSc7CiAgLy8gJ0luc2VydCcgc2VwYXJhdG9ycyByaWdodC10by1sZWZ0LiBJbmVmZmljaWVudCwgYnV0IHVzZWQganVzdCBhIGZldyB0aW1lcy4KICBmb3IgKGludCBwb3NpdGlvbiA9IHRleHQubGVuZ3RoIC0gMzsgcG9zaXRpb24gPiAwOyBwb3NpdGlvbiAtPSAzKSB7CiAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgcG9zaXRpb24pICsgc2VwYXJhdG9yICsgdGV4dC5zdWJzdHJpbmcocG9zaXRpb24pOwogIH0KICByZXR1cm4gdGV4dDsKfQoKLy8vIEZvcm1hdHMgW2R1cmF0aW9uXSBpbiBzZWNvbmRzIGluIGZpeGVkLXBvaW50IGZvcm1hdCwgcHJlZmVycmluZyB0byBrZWVwIHRoZQovLy8gcmVzdWx0IGF0IHRvIGJlbG93IFt3aWR0aF0gY2hhcmFjdGVycy4KU3RyaW5nIF9mb3JtYXREdXJhdGlvbkFzU2Vjb25kcyhEdXJhdGlvbiBkdXJhdGlvbiwgW2ludCB3aWR0aCA9IDRdKSB7CiAgbnVtIHNlY29uZHMgPSBkdXJhdGlvbi5pbk1pbGxpc2Vjb25kcyAvIDEwMDAuMDsKICBTdHJpbmcgdGV4dDsKICBmb3IgKGludCBkaWdpdHMgPSAzOyBkaWdpdHMgPj0gMDsgZGlnaXRzLS0pIHsKICAgIHRleHQgPSBzZWNvbmRzLnRvU3RyaW5nQXNGaXhlZChkaWdpdHMpOwogICAgaWYgKHRleHQubGVuZ3RoIDw9IHdpZHRoKSByZXR1cm4gdGV4dDsKICB9CiAgcmV0dXJuIHRleHQ7Cn0KCmNsYXNzIEFib3J0TGVnIHsKICBmaW5hbCBtZXNzYWdlOwogIEFib3J0TGVnKHRoaXMubWVzc2FnZSk7CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnQWJvcnRlZCBkdWUgdG8gLS10aHJvdy1vbi1lcnJvcjogJG1lc3NhZ2UnOwp9Cgp2b2lkIHdyaXRlU3RyaW5nKFVyaSB1cmksIFN0cmluZyB0ZXh0KSB7CiAgaWYgKCFlbmFibGVXcml0ZVN0cmluZykgcmV0dXJuOwogIGlmICh1cmkuc2NoZW1lICE9ICdmaWxlJykgewogICAgZmFpbCgnVW5oYW5kbGVkIHNjaGVtZSAke3VyaS5zY2hlbWV9LicpOwogIH0KICB2YXIgZmlsZSA9IG5ldyBGaWxlKHVyaS50b0ZpbGVQYXRoKCkpLm9wZW5TeW5jKG1vZGU6IEZpbGVNb2RlLndyaXRlKTsKICBmaWxlLndyaXRlU3RyaW5nU3luYyh0ZXh0KTsKICBmaWxlLmNsb3NlU3luYygpOwp9Cgp2b2lkIGZhaWwoU3RyaW5nIG1lc3NhZ2UpIHsKICBpZiAoZGlhZ25vc3RpY0hhbmRsZXIgIT0gbnVsbCkgewogICAgZGlhZ25vc3RpY0hhbmRsZXIucmVwb3J0KG51bGwsIG51bGwsIC0xLCAtMSwgbWVzc2FnZSwgYXBpLkRpYWdub3N0aWMuRVJST1IpOwogIH0gZWxzZSB7CiAgICBwcmludCgnRXJyb3I6ICRtZXNzYWdlJyk7CiAgfQogIGV4aXRGdW5jKDEpOwp9CgpGdXR1cmU8YXBpLkNvbXBpbGF0aW9uUmVzdWx0PiBjb21waWxlck1haW4oTGlzdDxTdHJpbmc+IGFyZ3VtZW50cywKICAgIHtmZS5Jbml0aWFsaXplZENvbXBpbGVyU3RhdGUga2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlfSkgYXN5bmMgewogIGlmICghYXJndW1lbnRzLmFueSgoYSkgPT4gYS5zdGFydHNXaXRoKCctLWxpYnJhcmllcy1zcGVjPScpKSkgewogICAgVXJpIHNjcmlwdCA9IFBsYXRmb3JtLnNjcmlwdDsKICAgIGlmIChzY3JpcHQuaXNTY2hlbWUoInBhY2thZ2UiKSkgewogICAgICBzY3JpcHQgPSBhd2FpdCBJc29sYXRlLnJlc29sdmVQYWNrYWdlVXJpKHNjcmlwdCk7CiAgICB9CiAgICBVcmkgbGlicmFyaWVzSnNvbiA9IHNjcmlwdC5yZXNvbHZlKF9kZWZhdWx0U3BlY2lmaWNhdGlvblVyaSk7CiAgICBhcmd1bWVudHMgPSA8U3RyaW5nPlsnLS1saWJyYXJpZXMtc3BlYz0ke2xpYnJhcmllc0pzb24udG9GaWxlUGF0aCgpfSddCiAgICAgIC4uYWRkQWxsKGFyZ3VtZW50cyk7CiAgfQogIHJldHVybiBjb21waWxlKGFyZ3VtZW50cywKICAgICAga2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlOiBrZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGUpOwp9Cgp2b2lkIGhlbHAoKSB7CiAgLy8gVGhpcyBtZXNzYWdlIHNob3VsZCBiZSBubyBsb25nZXIgdGhhbiAyMCBsaW5lcy4gVGhlIGRlZmF1bHQKICAvLyB0ZXJtaW5hbCBzaXplIG5vcm1hbGx5IDgweDI0LiBUd28gbGluZXMgYXJlIHVzZWQgZm9yIHRoZSBwcm9tcHRzCiAgLy8gYmVmb3JlIGFuZCBhZnRlciBydW5uaW5nIHRoZSBjb21waWxlci4gQW5vdGhlciB0d28gbGluZXMgbWF5IGJlCiAgLy8gdXNlZCB0byBwcmludCBhbiBlcnJvciBtZXNzYWdlLgogIHByaW50KCcnJwpVc2FnZTogZGFydDJqcyBbb3B0aW9uc10gZGFydGZpbGUKCkNvbXBpbGVzIERhcnQgdG8gSmF2YVNjcmlwdC4KCkNvbW1vbiBvcHRpb25zOgogIC1vIDxmaWxlPiBHZW5lcmF0ZSB0aGUgb3V0cHV0IGludG8gPGZpbGU+LgogIC1tICAgICAgICBHZW5lcmF0ZSBtaW5pZmllZCBvdXRwdXQuCiAgLWggICAgICAgIERpc3BsYXkgdGhpcyBtZXNzYWdlIChhZGQgLXYgZm9yIGluZm9ybWF0aW9uIGFib3V0IGFsbCBvcHRpb25zKS4nJycpOwp9Cgp2b2lkIHZlcmJvc2VIZWxwKCkgewogIHByaW50KHInJycKVXNhZ2U6IGRhcnQyanMgW29wdGlvbnNdIGRhcnRmaWxlCgpDb21waWxlcyBEYXJ0IHRvIEphdmFTY3JpcHQuCgpTdXBwb3J0ZWQgb3B0aW9uczoKICAtaCwgL2gsIC8/LCAtLWhlbHAKICAgIERpc3BsYXkgdGhpcyBtZXNzYWdlIChhZGQgLXYgZm9yIGluZm9ybWF0aW9uIGFib3V0IGFsbCBvcHRpb25zKS4KCiAgLW8gPGZpbGU+LCAtLW91dD08ZmlsZT4KICAgIEdlbmVyYXRlIHRoZSBvdXRwdXQgaW50byA8ZmlsZT4uCgogIC1tLCAtLW1pbmlmeQogICAgR2VuZXJhdGUgbWluaWZpZWQgb3V0cHV0LgoKICAtLWVuYWJsZS1hc3NlcnRzCiAgICBFbmFibGUgYXNzZXJ0aW9ucy4KCiAgLXYsIC0tdmVyYm9zZQogICAgRGlzcGxheSB2ZXJib3NlIGluZm9ybWF0aW9uLgoKICAtRDxuYW1lPj08dmFsdWU+CiAgICBEZWZpbmUgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCgogIC0tdmVyc2lvbgogICAgRGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uLgoKICAtLXBhY2thZ2VzPTxwYXRoPgogICAgUGF0aCB0byB0aGUgcGFja2FnZSByZXNvbHV0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZSwgd2hpY2ggc3VwcGxpZXMgYSBtYXBwaW5nCiAgICBvZiBwYWNrYWdlIG5hbWVzIHRvIHBhdGhzLgoKICAtLXN1cHByZXNzLXdhcm5pbmdzCiAgICBEbyBub3QgZGlzcGxheSBhbnkgd2FybmluZ3MuCgogIC0tZmF0YWwtd2FybmluZ3MKICAgIFRyZWF0IHdhcm5pbmdzIGFzIGNvbXBpbGF0aW9uIGVycm9ycy4KCiAgLS1zdXBwcmVzcy1oaW50cwogICAgRG8gbm90IGRpc3BsYXkgYW55IGhpbnRzLgoKICAtLWVuYWJsZS1kaWFnbm9zdGljLWNvbG9ycwogICAgQWRkIGNvbG9ycyB0byBkaWFnbm9zdGljIG1lc3NhZ2VzLgoKICAtLXRlcnNlCiAgICBFbWl0IGRpYWdub3N0aWNzIHdpdGhvdXQgc3VnZ2VzdGlvbnMgZm9yIGhvdyB0byBnZXQgcmlkIG9mIHRoZSBkaWFnbm9zZWQKICAgIHByb2JsZW1zLgoKICAtLXNob3ctcGFja2FnZS13YXJuaW5ncwogICAgU2hvdyB3YXJuaW5ncyBhbmQgaGludHMgZ2VuZXJhdGVkIGZyb20gcGFja2FnZXMuCgogIC0tY3NwCiAgICBEaXNhYmxlIGR5bmFtaWMgZ2VuZXJhdGlvbiBvZiBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LiBUaGlzIGlzCiAgICBuZWNlc3NhcnkgdG8gc2F0aXNmeSBDU1AgcmVzdHJpY3Rpb25zIChzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvQ1NQLykuCgogIC0tbm8tc291cmNlLW1hcHMKICAgIERvIG5vdCBnZW5lcmF0ZSBhIHNvdXJjZSBtYXAgZmlsZS4KCiAgLU88MCwxLDIsMyw0PgogICAgQ29udHJvbHMgb3B0aW1pemF0aW9ucyB0aGF0IGNhbiBoZWxwIHJlZHVjZSBjb2RlLXNpemUgYW5kIGltcHJvdmUKICAgIHBlcmZvcm1hbmNlIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSBmb3IgZGVwbG95bWVudC4KCiAgICAtTzAKICAgICAgIERpc2FibGVzIGFsbCBvcHRpbWl6YXRpb25zLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgZGFydDJqcyB3aXRoIHRoZXNlCiAgICAgICBleHRyYSBmbGFnczoKICAgICAgICAtLWRpc2FibGUtaW5saW5pbmcKICAgICAgICAtLWRpc2FibGUtdHlwZS1pbmZlcmVuY2UKICAgICAgICAtLWRpc2FibGUtcnRpLW9wdGltaXphdGlvbnMKCgogICAgICAgU29tZSBvcHRpbWl6YXRpb25zIGNhbm5vdCBiZSBkaXNzYWJsZWQgYXQgdGhpcyB0aW1lLCBhcyB3ZSBhZGQgdGhlIG9wdGlvbgogICAgICAgdG8gZGlzYWJsZSB0aGVtLCB0aGV5IHdpbGwgYmUgYWRkZWQgaGVyZSBhcyB3ZWxsLgoKICAgIC1PMQogICAgICAgRW5hYmxlcyBkZWZhdWx0IG9wdGltaXphdGlvbnMuIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBkYXJ0MmpzIHdpdGggbm8KICAgICAgIGV4dHJhIGZsYWdzLgoKICAgIC1PMgogICAgICAgRW5hYmxlcyBvcHRpbWl6YXRpb25zIHRoYXQgcmVzcGVjdCB0aGUgbGFuZ3VhZ2Ugc2VtYW50aWNzIGFuZCBhcmUgc2FmZQogICAgICAgZm9yIGFsbCBwcm9ncmFtcy4gSXQgaG93ZXZlciBjaGFuZ2VzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdHlwZXMsCiAgICAgICB3aGljaCB3aWxsIG5vIGxvbmdlciBiZSBjb25zaXN0ZW50IHdpdGggdGhlIERhcnQgVk0gb3IgRERDLgoKICAgICAgIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBkYXJ0MmpzIHdpdGggdGhlc2UgZXh0cmEgZmxhZ3M6CiAgICAgICAgLS1taW5pZnkKICAgICAgICAtLWxheC1ydW50aW1lLXR5cGUtdG8tc3RyaW5nCgogICAgLU8zCiAgICAgICBFbmFibGVzIG9wdGltaXphdGlvbnMgdGhhdCByZXNwZWN0IHRoZSBsYW5ndWFnZSBzZW1hbnRpY3Mgb25seSBvbgogICAgICAgcHJvZ3JhbXMgdGhhdCBkb24ndCBldmVyIHRocm93IGFueSBzdWJ0eXBlIG9mIGBFcnJvcmAuICBUaGVzZQogICAgICAgb3B0aW1pemF0aW9ucyBpbXByb3ZlIHRoZSBnZW5lcmF0ZWQgY29kZSwgYnV0IHRoZXkgbWF5IGNhdXNlIHByb2dyYW1zIHRvCiAgICAgICBiZWhhdmUgdW5leHBlY3RlZGx5IGlmIHRoaXMgYXNzdW1wdGlvbiBpcyBub3QgbWV0LiAgVG8gdXNlIHRoaXMKICAgICAgIG9wdGlvbiwgd2UgcmVjb21tZW5kIHRoYXQgeW91IHByb3Blcmx5IHRlc3QgeW91ciBhcHBsaWNhdGlvbiBmaXJzdAogICAgICAgd2l0aG91dCBpdCwgYW5kIGVuc3VyZSB0aGF0IG5vIHN1YnR5cGUgb2YgYEVycm9yYCAoc3VjaCBhcyBgVHlwZUVycm9yYCkKICAgICAgIGlzIGV2ZXIgdGhyb3duLgoKICAgICAgIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBkYXJ0MmpzIHdpdGggdGhlc2UgZXh0cmEgZmxhZ3M6CiAgICAgICAgIC1PMgogICAgICAgICAtLW9taXQtaW1wbGljaXQtY2hlY2tzCgogICAgLU80CiAgICAgICBFbmFibGVzIG1vcmUgYWdncmVzc2l2ZSBvcHRpbWl6YXRpb25zIHRoYW4gLU8zLCBidXQgd2l0aCB0aGUgc2FtZQogICAgICAgYXNzdW1wdGlvbnMuIFRoZXNlIG9wdGltaXphdGlvbnMgYXJlIG9uIGEgc2VwYXJhdGUgZ3JvdXAgYmVjYXVzZSB0aGV5CiAgICAgICBhcmUgbW9yZSBzdXNjZXB0aWJsZSB0byB2YXJpYXRpb25zIGluIGlucHV0IGRhdGEuIFRvIHVzZSB0aGlzIG9wdGlvbiB3ZQogICAgICAgcmVjb21tZW5kIHRvIHBheSBzcGVjaWFsIGF0dGVudGlvbiB0byB0ZXN0IGVkZ2UgY2FzZXMgaW4gdXNlciBpbnB1dC4KCiAgICAgICBFcXVpdmFsZW50IHRvIGNhbGxpbmcgZGFydDJqcyB3aXRoIHRoZXNlIGV4dHJhIGZsYWdzOgogICAgICAgICAtTzMKICAgICAgICAgLS10cnVzdC1wcmltaXRpdmVzCgogICAgV2hpbGUgc29tZSBvZiB0aGUgaW5kaXZpZHVhbCBvcHRpbWl6YXRpb25zIGFuZCBmbGFncyBtYXkgY2hhbmdlIHdpdGggdGltZSwKICAgIHdlIGludGVuZCB0byBrZWVwIHRoZSAtTyogZmxhZ3Mgc3RhYmxlLiBOZXcgc2FmZSBvcHRpbWl6YXRpb25zIG1heSBiZSBhZGRlZAogICAgb24gYW55IGxldmVsLCBhbmQgb3B0aW1pemF0aW9ucyB0aGF0IG9ubHkgd29yayBvbiBzb21lIHByb2dyYW1zIG1heSBtb3ZlIHVwCiAgICBmcm9tIG9uZSBsZXZlbCB0byB0aGUgbmV4dCAoZm9yIGluc3RhbmNlLCBvbmNlIGFsdGVybmF0aXZlIHNhZmUKICAgIG9wdGltaXphdGlvbnMgYXJlIGltcGxlbWVudGVkLCBgb21pdC1pbXBsaWNpdC1jaGVja3NgIG1heSBiZSByZW1vdmVkIG9yIG1heQogICAgbW92ZSB0byB0aGUgTzQgbGV2ZWwpLgoKVGhlIGZvbGxvd2luZyBpbmRpdmlkdWFsIG9wdGlvbnMgYXJlIGluY2x1ZGVkIGluIHNvbWUgb2YgdGhlIC1PIG9wdGltaXphdGlvbgpsZXZlbHMgYWJvdmUuIFRoZXkgaGVscCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlLCBidXQgdGhleSBtYXkKY2F1c2UgcHJvZ3JhbXMgdG8gYmVoYXZlIHVuZXhwZWN0ZWRseSBpZiBhc3N1bXB0aW9ucyBhcmUgbm90IG1ldC4gT25seSB0dXJuIG9uCnRoZXNlIGZsYWdzIGlmIHlvdSBoYXZlIGVub3VnaCB0ZXN0IGNvdmVyYWdlIHRvIGVuc3VyZSB0aGV5IGFyZSBzYWZlIHRvIHVzZToKCiAgLS1vbWl0LWltcGxpY2l0LWNoZWNrcwogICAgT21pdCBpbXBsaWNpdCBydW50aW1lIGNoZWNrcywgc3VjaCBhcyBwYXJhbWV0ZXIgY2hlY2tzIGFuZCBpbXBsaWNpdAogICAgZG93bmNhc3RzLiBUaGVzZSBjaGVja3MgYXJlIGluY2x1ZGVkIGJ5IGRlZmF1bHQgaW4gRGFydCAyLjAuIEJ5CiAgICB1c2luZyB0aGlzIGZsYWcgdGhlIGNoZWNrcyBhcmUgcmVtb3ZlZCwgaG93ZXZlciB0aGUgY29tcGlsZXIgd2lsbCBhc3N1bWUKICAgIHRoYXQgYWxsIHN1Y2ggY2hlY2tzIHdlcmUgdmFsaWQgYW5kIG1heSB1c2UgdGhpcyBpbmZvcm1hdGlvbiBmb3IKICAgIG9wdGltaXphdGlvbnMuIFVzZSB0aGlzIG9wdGlvbiBvbmx5IGlmIHlvdSBoYXZlIGVub3VnaCB0ZXN0aW5nIHRvIGVuc3VyZQogICAgdGhhdCB5b3VyIHByb2dyYW0gd29ya3Mgd2l0aCB0aGUgY2hlY2tzLgoKICAtLXRydXN0LXByaW1pdGl2ZXMKICAgIEFzc3VtZSB0aGF0IG9wZXJhdGlvbnMgb24gbnVtYmVycywgc3RyaW5ncywgYW5kIGxpc3RzIGhhdmUgdmFsaWQgaW5wdXRzLgogICAgVGhpcyBvcHRpb24gYWxsb3dzIHRoZSBjb21waWxlciB0byBkcm9wIHJ1bnRpbWUgY2hlY2tzIGZvciB0aG9zZSBvcGVyYXRpb25zLgogICAgTm90ZTogYSB3ZWxsLXR5cGVkIHByb2dyYW0gaXMgbm90IGd1YXJhbnRlZWQgdG8gaGF2ZSB2YWxpZCBpbnB1dHMuIEZvcgogICAgZXhhbXBsZSwgYW4gaW50IGluZGV4IGFyZ3VtZW50IG1heSBiZSBudWxsIG9yIG91dCBvZiByYW5nZS4KCiAgLS1sYXgtcnVudGltZS10eXBlLXRvLXN0cmluZwogICAgT21pdHMgcmVpZmllZCBjbGFzcyB0eXBlIGFyZ3VtZW50cyB3aGVuIHRoZXNlIGFyZSBvbmx5IG5lZWRlZCBmb3IgYHRvU3RyaW5nYAogICAgb24gYHJ1bnRpbWVUeXBlYC4gVGhpcyBpcyB1c2VmdWwgaWYgYHJ1bnRpbWVUeXBlLnRvU3RyaW5nKClgIGlzIG9ubHkgdXNlZAogICAgZm9yIGRlYnVnZ2luZy4gTm90ZSB0aGF0IHNlbWFudGljcyBvZiBvdGhlciB1c2VzIG9mIGAucnVudGltZVR5cGVgLCBmb3IKICAgIGluc3RhbmNlIGBhLnJ1bnRpbWVUeXBlID09IGIucnVudGltZVR5cGVgLCBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyBmbGFnLgoKVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBvbmx5IHVzZWQgZm9yIGNvbXBpbGVyIGRldmVsb3BtZW50IGFuZCBtYXkKYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uOgoKICAtLXRocm93LW9uLWVycm9yCiAgICBUaHJvdyBhbiBleGNlcHRpb24gaWYgYSBjb21waWxlLXRpbWUgZXJyb3IgaXMgZGV0ZWN0ZWQuCgogIC0tbGlicmFyaWVzLXNwZWM9PGZpbGU+CiAgICBBIC5qc29uIGZpbGUgY29udGFpbmluZyB0aGUgbGlicmFyaWVzIHNwZWNpZmljYXRpb24gZm9yIGRhcnQyanMuCgogIC0tYWxsb3ctbW9jay1jb21waWxhdGlvbgogICAgRG8gbm90IGdlbmVyYXRlIGEgY2FsbCB0byBtYWluIGlmIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nCiAgICBsaWJyYXJpZXMgYXJlIHVzZWQ6IGRhcnQ6ZG9tLCBkYXJ0Omh0bWwgZGFydDppby4KCiAgLS1kaXNhYmxlLW5hdGl2ZS1saXZlLXR5cGUtYW5hbHlzaXMKICAgIERpc2FibGUgdGhlIG9wdGltaXphdGlvbiB0aGF0IHJlbW92ZXMgdW51c2VkIG5hdGl2ZSB0eXBlcyBmcm9tIGRhcnQ6aHRtbAogICAgYW5kIHJlbGF0ZWQgbGlicmFyaWVzLgoKICAtLXNlcnZlci1tb2RlCiAgICBDb21waWxlIHdpdGggc2VydmVyIHN1cHBvcnQuIFRoZSBjb21waWxlciB3aWxsIHVzZSBhIGxpYnJhcnkgc3BlY2lmaWNhdGlvbgogICAgdGhhdCBkaXNhYmxlcyBkYXJ0Omh0bWwgYnV0IHN1cHBvcnRzIGRhcnQ6anMgaW4gY29uZGl0aW9uYWwgaW1wb3J0cy4KCiAgLS1jYXRlZ29yaWVzPTxjYXRlZ29yaWVzPgogICAgKGRlcHJlY2F0ZWQpCiAgICBVc2UgJy0tc2VydmVyLW1vZGUnIGluc3RlYWQgb2YgJy0tY2F0ZWdvcmllcz1TZXJ2ZXInLiBBbGwgb3RoZXIgY2F0ZWdvcnkKICAgIHZhbHVlcyBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgY29tcGlsZXIgYmVoYXZpb3IuCgogIC0tZGVmZXJyZWQtbWFwPTxmaWxlPgogICAgR2VuZXJhdGVzIGEganNvbiBmaWxlIHdpdGggYSBtYXBwaW5nIGZyb20gZWFjaCBkZWZlcnJlZCBpbXBvcnQgdG8gYSBsaXN0IG9mCiAgICB0aGUgcGFydC5qcyBmaWxlcyB0aGF0IHdpbGwgYmUgbG9hZGVkLgoKICAtLWR1bXAtaW5mb1s9PGZvcm1hdD5dCiAgICBHZW5lcmF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdlbmVyYXRlZCBjb2RlLiAnZm9ybWF0JyBjYW4gYmUgZWl0aGVyCiAgICAnanNvbicgb3IgJ2JpbmFyeScuCiAgICBZb3UgY2FuIGluc3BlY3QgdGhlIGdlbmVyYXRlZCBkYXRhIHVzaW5nIHRvb2xzIGZyb20gJ3BhY2thZ2U6ZGFydDJqc19pbmZvJy4KCiAgLS1nZW5lcmF0ZS1jb2RlLXdpdGgtY29tcGlsZS10aW1lLWVycm9ycwogICAgR2VuZXJhdGVzIG91dHB1dCBldmVuIGlmIHRoZSBwcm9ncmFtIGNvbnRhaW5zIGNvbXBpbGUtdGltZSBlcnJvcnMuIFVzZSB0aGUKICAgIGV4aXQgY29kZSB0byBkZXRlcm1pbmUgaWYgY29tcGlsYXRpb24gZmFpbGVkLgoKICAtLW5vLWZyZXF1ZW5jeS1iYXNlZC1taW5pZmljYXRpb24KICAgIEV4cGVyaW1lbnRhbC4gIERpc2FibGVkIHRoZSBuZXcgZnJlcXVlbmN5IGJhc2VkIG1pbmlmeWluZyBuYW1lciBhbmQgdXNlIHRoZQogICAgb2xkIG5hbWVyIGluc3RlYWQuCicnJwogICAgICAudHJpbSgpKTsKfQoKdm9pZCBoZWxwQW5kRXhpdChib29sIHdhbnRIZWxwLCBib29sIHdhbnRWZXJzaW9uLCBib29sIHZlcmJvc2UpIHsKICBpZiAod2FudFZlcnNpb24pIHsKICAgIHZhciB2ZXJzaW9uID0gKEJVSUxEX0lEID09IG51bGwpID8gJzxub24tU0RLIGJ1aWxkPicgOiBCVUlMRF9JRDsKICAgIHByaW50KCdEYXJ0LXRvLUphdmFTY3JpcHQgY29tcGlsZXIgKGRhcnQyanMpIHZlcnNpb246ICR2ZXJzaW9uJyk7CiAgfQogIGlmICh3YW50SGVscCkgewogICAgaWYgKHZlcmJvc2UpIHsKICAgICAgdmVyYm9zZUhlbHAoKTsKICAgIH0gZWxzZSB7CiAgICAgIGhlbHAoKTsKICAgIH0KICB9CiAgZXhpdEZ1bmMoMCk7Cn0KCnZvaWQgaGVscEFuZEZhaWwoU3RyaW5nIG1lc3NhZ2UpIHsKICBoZWxwKCk7CiAgcHJpbnQoJycpOwogIGZhaWwobWVzc2FnZSk7Cn0KCnZvaWQgbWFpbihMaXN0PFN0cmluZz4gYXJndW1lbnRzKSB7CiAgLy8gU2luY2UgdGhlIHNkay9iaW4vZGFydDJqcyBzY3JpcHQgYWRkcyBpdHMgb3duIGFyZ3VtZW50cyBpbiBmcm9udCBvZgogIC8vIHVzZXItc3VwcGxpZWQgYXJndW1lbnRzIHdlIHNlYXJjaCBmb3IgJy0tYmF0Y2gnIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50cy5sYXN0ID09ICItLWJhdGNoIikgewogICAgYmF0Y2hNYWluKGFyZ3VtZW50cy5zdWJsaXN0KDAsIGFyZ3VtZW50cy5sZW5ndGggLSAxKSk7CiAgICByZXR1cm47CiAgfQogIGludGVybmFsTWFpbihhcmd1bWVudHMpOwp9Cgp0eXBlZGVmIHZvaWQgRXhpdEZ1bmMoaW50IGV4aXRDb2RlKTsKdHlwZWRlZiBGdXR1cmU8YXBpLkNvbXBpbGF0aW9uUmVzdWx0PiBDb21waWxlRnVuYygKICAgIENvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMsCiAgICBhcGkuQ29tcGlsZXJJbnB1dCBjb21waWxlcklucHV0LAogICAgYXBpLkNvbXBpbGVyRGlhZ25vc3RpY3MgY29tcGlsZXJEaWFnbm9zdGljcywKICAgIGFwaS5Db21waWxlck91dHB1dCBjb21waWxlck91dHB1dCk7CgpFeGl0RnVuYyBleGl0RnVuYyA9IGV4aXQ7CkNvbXBpbGVGdW5jIGNvbXBpbGVGdW5jID0gYXBpLmNvbXBpbGU7CgovLy8gSWYgYHRydWVgIGEgJy5kZXBzJyBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIGFmdGVyIGNvbXBpbGF0aW9uLgovLy8KLy8vIFNldCB0aGlzIHRvIGBmYWxzZWAgaW4gZW5kLXRvLWVuZCB0ZXN0cyB0byBhdm9pZCBnZW5lcmF0aW5nICcuZGVwcycgZmlsZXMuCmJvb2wgZW5hYmxlV3JpdGVTdHJpbmcgPSB0cnVlOwoKRnV0dXJlPGFwaS5Db21waWxhdGlvblJlc3VsdD4gaW50ZXJuYWxNYWluKExpc3Q8U3RyaW5nPiBhcmd1bWVudHMsCiAgICB7ZmUuSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlIGtlcm5lbEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZX0pIHsKICBGdXR1cmU8YXBpLkNvbXBpbGF0aW9uUmVzdWx0PiBvbkVycm9yKGV4Y2VwdGlvbiwgdHJhY2UpIHsKICAgIC8vIElmIHdlIGFyZSBhbHJlYWR5IHRyeWluZyB0byBleGl0LCBqdXN0IGNvbnRpbnVlIGV4aXRpbmcuCiAgICBpZiAoZXhjZXB0aW9uID09IF9FWElUX1NJR05BTCkgdGhyb3cgZXhjZXB0aW9uOwoKICAgIHRyeSB7CiAgICAgIHByaW50KCdUaGUgY29tcGlsZXIgY3Jhc2hlZDogJGV4Y2VwdGlvbicpOwogICAgfSBjYXRjaCAoaWdub3JlZCkgewogICAgICBwcmludCgnVGhlIGNvbXBpbGVyIGNyYXNoZWQ6IGVycm9yIHdoaWxlIHByaW50aW5nIGV4Y2VwdGlvbicpOwogICAgfQoKICAgIHRyeSB7CiAgICAgIGlmICh0cmFjZSAhPSBudWxsKSB7CiAgICAgICAgcHJpbnQodHJhY2UpOwogICAgICB9CiAgICB9IGZpbmFsbHkgewogICAgICBleGl0RnVuYygyNTMpOyAvLyAyNTMgaXMgcmVjb2duaXplZCBhcyBhIGNyYXNoIGJ5IG91ciB0ZXN0IHNjcmlwdHMuCiAgICB9CiAgICByZXR1cm4gbmV3IEZ1dHVyZS5lcnJvcihleGNlcHRpb24sIHRyYWNlKTsKICB9CgogIHRyeSB7CiAgICByZXR1cm4gY29tcGlsZXJNYWluKGFyZ3VtZW50cywKICAgICAgICAgICAga2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlOiBrZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGUpCiAgICAgICAgLmNhdGNoRXJyb3Iob25FcnJvcik7CiAgfSBjYXRjaCAoZXhjZXB0aW9uLCB0cmFjZSkgewogICAgcmV0dXJuIG9uRXJyb3IoZXhjZXB0aW9uLCB0cmFjZSk7CiAgfQp9CgpjbGFzcyBfRXhpdFNpZ25hbCB7CiAgY29uc3QgX0V4aXRTaWduYWwoKTsKfQoKY29uc3QgX0VYSVRfU0lHTkFMID0gY29uc3QgX0V4aXRTaWduYWwoKTsKCnZvaWQgYmF0Y2hNYWluKExpc3Q8U3RyaW5nPiBiYXRjaEFyZ3VtZW50cykgewogIGludCBleGl0Q29kZTsKICBleGl0RnVuYyA9IChlcnJvckNvZGUpIHsKICAgIC8vIFNpbmNlIHdlIG9ubHkgdGhyb3cgYW5vdGhlciBwYXJ0IG9mIHRoZSBjb21waWxlciBtaWdodCBpbnRlcmNlcHQgb3VyCiAgICAvLyBleGNlcHRpb24gYW5kIHRyeSB0byBleGl0IHdpdGggYSBkaWZmZXJlbnQgY29kZS4KICAgIGlmIChleGl0Q29kZSA9PSAwKSB7CiAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlOwogICAgfQogICAgdGhyb3cgX0VYSVRfU0lHTkFMOwogIH07CgogIHZhciBzdHJlYW0gPSBzdGRpbi50cmFuc2Zvcm0odXRmOC5kZWNvZGVyKS50cmFuc2Zvcm0obmV3IExpbmVTcGxpdHRlcigpKTsKICB2YXIgc3Vic2NyaXB0aW9uOwogIGZlLkluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSBrZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGU7CiAgc3Vic2NyaXB0aW9uID0gc3RyZWFtLmxpc3RlbigobGluZSkgewogICAgbmV3IEZ1dHVyZS5zeW5jKCgpIHsKICAgICAgc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICAgIGV4aXRDb2RlID0gMDsKICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgZXhpdCgwKTsKICAgICAgTGlzdDxTdHJpbmc+IGFyZ3MgPSA8U3RyaW5nPltdOwogICAgICBhcmdzLmFkZEFsbChiYXRjaEFyZ3VtZW50cyk7CiAgICAgIGFyZ3MuYWRkQWxsKHNwbGl0TGluZShsaW5lLCB3aW5kb3dzOiBQbGF0Zm9ybS5pc1dpbmRvd3MpKTsKICAgICAgcmV0dXJuIGludGVybmFsTWFpbihhcmdzLAogICAgICAgICAga2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlOiBrZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGUpOwogICAgfSkuY2F0Y2hFcnJvcigoZXhjZXB0aW9uLCB0cmFjZSkgewogICAgICBpZiAoIWlkZW50aWNhbChleGNlcHRpb24sIF9FWElUX1NJR05BTCkpIHsKICAgICAgICBleGl0Q29kZSA9IDI1MzsKICAgICAgfQogICAgfSkudGhlbigoYXBpLkNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCkgewogICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgICBrZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGUgPSByZXN1bHQua2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlOwogICAgICB9CiAgICB9KS53aGVuQ29tcGxldGUoKCkgewogICAgICAvLyBUaGUgdGVzdGluZyBmcmFtZXdvcmsgd2FpdHMgZm9yIGEgc3RhdHVzIGxpbmUgb24gc3Rkb3V0IGFuZAogICAgICAvLyBzdGRlcnIgYmVmb3JlIG1v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Y2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydCcgc2hvdyBDb21wb25lbnQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCcgc2hvdyBUYXJnZXQ7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvY29tcGlsZXJfb3B0aW9ucy5kYXJ0JyBzaG93IENvbXBpbGVyT3B0aW9uczsKCmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9kaWFnbm9zdGljX21lc3NhZ2UuZGFydCcgc2hvdyBEaWFnbm9zdGljTWVzc2FnZUhhbmRsZXI7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZXhwZXJpbWVudGFsX2ZsYWdzLmRhcnQnIHNob3cgRXhwZXJpbWVudGFsRmxhZzsKCmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9maWxlX3N5c3RlbS5kYXJ0JyBzaG93IEZpbGVTeXN0ZW07CgppbXBvcnQgJy4uL2Jhc2UvcHJvY2Vzc2VkX29wdGlvbnMuZGFydCcgc2hvdyBQcm9jZXNzZWRPcHRpb25zOwoKaW1wb3J0ICcuLi9iYXNlL2xpYnJhcmllc19zcGVjaWZpY2F0aW9uLmRhcnQnIHNob3cgTGlicmFyaWVzU3BlY2lmaWNhdGlvbjsKCmltcG9ydCAnLi4vZmFzdGEvY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnLi4vZmFzdGEvZmFzdGFfY29kZXMuZGFydCcgc2hvdyBtZXNzYWdlTWlzc2luZ01haW47CgppbXBvcnQgJy4uL2Zhc3RhL3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJy4uL2tlcm5lbF9nZW5lcmF0b3JfaW1wbC5kYXJ0JyBzaG93IGdlbmVyYXRlS2VybmVsSW50ZXJuYWw7CgppbXBvcnQgJy4uL2Zhc3RhL3NjYW5uZXIuZGFydCcgc2hvdyBFcnJvclRva2VuLCBTdHJpbmdUb2tlbiwgVG9rZW47CgppbXBvcnQgJy4uL2Zhc3RhL2tlcm5lbC9yZWRpcmVjdGluZ19mYWN0b3J5X2JvZHkuZGFydCcgYXMgcmVkaXJlY3Rpbmc7CgppbXBvcnQgJ2NvbXBpbGVyX3N0YXRlLmRhcnQnIHNob3cgSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlOwoKaW1wb3J0ICd1dGlsLmRhcnQnIHNob3cgZXF1YWxMaXN0cywgZXF1YWxNYXBzOwoKZXhwb3J0ICcuLi9hcGlfcHJvdG90eXBlL2NvbXBpbGVyX29wdGlvbnMuZGFydCcKICAgIHNob3cgQ29tcGlsZXJPcHRpb25zLCBwYXJzZUV4cGVyaW1lbnRhbEZsYWdzOwoKZXhwb3J0ICcuLi9hcGlfcHJvdG90eXBlL2RpYWdub3N0aWNfbWVzc2FnZS5kYXJ0JwogICAgc2hvdwogICAgICAgIERpYWdub3N0aWNNZXNzYWdlLAogICAgICAgIGdldE1lc3NhZ2VDaGFyT2Zmc2V0LAogICAgICAgIGdldE1lc3NhZ2VIZWFkZXJUZXh0LAogICAgICAgIGdldE1lc3NhZ2VMZW5ndGgsCiAgICAgICAgZ2V0TWVzc2FnZVJlbGF0ZWRJbmZvcm1hdGlvbiwKICAgICAgICBnZXRNZXNzYWdlVXJpOwoKZXhwb3J0ICcuLi9hcGlfcHJvdG90eXBlL2V4cGVyaW1lbnRhbF9mbGFncy5kYXJ0JwogICAgc2hvdyBkZWZhdWx0RXhwZXJpbWVudGFsRmxhZ3MsIEV4cGVyaW1lbnRhbEZsYWc7CgpleHBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydCcKICAgIHNob3cgRmlsZVN5c3RlbSwgRmlsZVN5c3RlbUVudGl0eSwgRmlsZVN5c3RlbUV4Y2VwdGlvbjsKCmV4cG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9rZXJuZWxfZ2VuZXJhdG9yLmRhcnQnIHNob3cga2VybmVsRm9yUHJvZ3JhbTsKCmV4cG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9zdGFuZGFyZF9maWxlX3N5c3RlbS5kYXJ0JyBzaG93IERhdGFGaWxlU3lzdGVtRW50aXR5OwoKZXhwb3J0ICcuLi9jb21wdXRlX3BsYXRmb3JtX2JpbmFyaWVzX2xvY2F0aW9uLmRhcnQnCiAgICBzaG93IGNvbXB1dGVQbGF0Zm9ybUJpbmFyaWVzTG9jYXRpb247CgpleHBvcnQgJy4uL2Zhc3RhL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgTG9jYXRlZE1lc3NhZ2U7CgpleHBvcnQgJy4uL2Zhc3RhL29wZXJhdG9yLmRhcnQnIHNob3cgb3BlcmF0b3JGcm9tU3RyaW5nOwoKZXhwb3J0ICcuLi9mYXN0YS9wYXJzZXIvYXN5bmNfbW9kaWZpZXIuZGFydCcgc2hvdyBBc3luY01vZGlmaWVyOwoKZXhwb3J0ICcuLi9mYXN0YS9zY2FubmVyLmRhcnQnIHNob3cgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3IsIGlzTWludXNPcGVyYXRvcjsKCmV4cG9ydCAnLi4vZmFzdGEvc2Nhbm5lci9jaGFyYWN0ZXJzLmRhcnQnCiAgICBzaG93CiAgICAgICAgJCQsCiAgICAgICAgJDAsCiAgICAgICAgJDksCiAgICAgICAgJEEsCiAgICAgICAgJEJBQ0tTTEFTSCwKICAgICAgICAkQ1IsCiAgICAgICAgJERFTCwKICAgICAgICAkRFEsCiAgICAgICAgJEhBU0gsCiAgICAgICAgJExGLAogICAgICAgICRMUywKICAgICAgICAkUFMsCiAgICAgICAgJFRBQiwKICAgICAgICAkWiwKICAgICAgICAkXywKICAgICAgICAkYSwKICAgICAgICAkZywKICAgICAgICAkcywKICAgICAgICAkejsKCmV4cG9ydCAnLi4vZmFzdGEvc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eTsKCmV4cG9ydCAnLi4vZmFzdGEvdXRpbC9saW5rLmRhcnQnIHNob3cgTGluaywgTGlua0J1aWxkZXI7CgpleHBvcnQgJy4uL2Zhc3RhL3V0aWwvbGlua19pbXBsZW1lbnRhdGlvbi5kYXJ0JyBzaG93IExpbmtFbnRyeTsKCmV4cG9ydCAnLi4vZmFzdGEvdXRpbC9yZWxhdGl2aXplLmRhcnQnIHNob3cgcmVsYXRpdml6ZVVyaTsKCmV4cG9ydCAnY29tcGlsZXJfc3RhdGUuZGFydCcgc2hvdyBJbml0aWFsaXplZENvbXBpbGVyU3RhdGU7Cgp2b2lkIGNsZWFyU3RyaW5nVG9rZW5DYW5vbmljYWxpemVyKCkgewogIC8vIFRPRE8oYWhlKTogV2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMuIEZhc3RhIHNob3VsZCB0YWtlIGNhcmUgb2YKICAvLyBjbGVhcmluZyB0aGUgY2FjaGUgd2hlbi4KICBTdHJpbmdUb2tlbi5jYW5vbmljYWxpemVyLmNsZWFyKCk7Cn0KCkluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSBpbml0aWFsaXplQ29tcGlsZXIoCiAgICBJbml0aWFsaXplZENvbXBpbGVyU3RhdGUgb2xkU3RhdGUsCiAgICBUYXJnZXQgdGFyZ2V0LAogICAgVXJpIGxpYnJhcmllc1NwZWNpZmljYXRpb25VcmksCiAgICBMaXN0PFVyaT4gbGlua2VkRGVwZW5kZW5jaWVzLAogICAgVXJpIHBhY2thZ2VzRmlsZVVyaSwKICAgIHtMaXN0PFVyaT4gZGVwZW5kZW5jaWVzLAogICAgTWFwPEV4cGVyaW1lbnRhbEZsYWcsIGJvb2w+IGV4cGVyaW1lbnRhbEZsYWdzLAogICAgYm9vbCB2ZXJpZnk6IGZhbHNlfSkgewogIGxpbmtlZERlcGVuZGVuY2llcy5zb3J0KChhLCBiKSA9PiBhLnRvU3RyaW5nKCkuY29tcGFyZVRvKGIudG9TdHJpbmcoKSkpOwoKICBpZiAob2xkU3RhdGUgIT0gbnVsbCAmJgogICAgICBvbGRTdGF0ZS5vcHRpb25zLnBhY2thZ2VzRmlsZVVyaSA9PSBwYWNrYWdlc0ZpbGVVcmkgJiYKICAgICAgb2xkU3RhdGUub3B0aW9ucy5saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpID09IGxpYnJhcmllc1NwZWNpZmljYXRpb25VcmkgJiYKICAgICAgZXF1YWxMaXN0cyhvbGRTdGF0ZS5vcHRpb25zLmxpbmtlZERlcGVuZGVuY2llcywgbGlua2VkRGVwZW5kZW5jaWVzKSAmJgogICAgICBlcXVhbE1hcHMob2xkU3RhdGUub3B0aW9ucy5leHBlcmltZW50YWxGbGFncywgZXhwZXJpbWVudGFsRmxhZ3MpKSB7CiAgICByZXR1cm4gb2xkU3RhdGU7CiAgfQoKICBDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoKQogICAgLi50YXJnZXQgPSB0YXJnZXQKICAgIC4ubGVnYWN5TW9kZSA9IHRhcmdldC5sZWdhY3lNb2RlCiAgICAuLmxpbmtlZERlcGVuZGVuY2llcyA9IGxpbmtlZERlcGVuZGVuY2llcwogICAgLi5saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpID0gbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaQogICAgLi5wYWNrYWdlc0ZpbGVVcmkgPSBwYWNrYWdlc0ZpbGVVcmkKICAgIC4uZXhwZXJpbWVudGFsRmxhZ3MgPSBleHBlcmltZW50YWxGbGFncwogICAgLi52ZXJpZnkgPSB2ZXJpZnk7CgogIFByb2Nlc3NlZE9wdGlvbnMgcHJvY2Vzc2VkT3B0cyA9IG5ldyBQcm9jZXNzZWRPcHRpb25zKG9wdGlvbnM6IG9wdGlvbnMpOwoKICByZXR1cm4gbmV3IEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZShvcHRpb25zLCBwcm9jZXNzZWRPcHRzKTsKfQoKRnV0dXJlPENvbXBvbmVudD4gY29tcGlsZSgKICAgIEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSBzdGF0ZSwKICAgIGJvb2wgdmVyYm9zZSwKICAgIEZpbGVTeXN0ZW0gZmlsZVN5c3RlbSwKICAgIERpYWdub3N0aWNNZXNzYWdlSGFuZGxlciBvbkRpYWdub3N0aWMsCiAgICBVcmkgaW5wdXQpIGFzeW5jIHsKICBDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IHN0YXRlLm9wdGlvbnM7CiAgb3B0aW9ucwogICAgLi5vbkRpYWdub3N0aWMgPSBvbkRpYWdub3N0aWMKICAgIC4udmVyYm9zZSA9IHZlcmJvc2UKICAgIC4uZmlsZVN5c3RlbSA9IGZpbGVTeXN0ZW07CgogIFByb2Nlc3NlZE9wdGlvbnMgcHJvY2Vzc2VkT3B0cyA9IHN0YXRlLnByb2Nlc3NlZE9wdHM7CiAgcHJvY2Vzc2VkT3B0cy5pbnB1dHMuY2xlYXIoKTsKICBwcm9jZXNzZWRPcHRzLmlucHV0cy5hZGQoaW5wdXQpOwogIHByb2Nlc3NlZE9wdHMuY2xlYXJGaWxlU3lzdGVtQ2FjaGUoKTsKCiAgdmFyIGNvbXBpbGVyUmVzdWx0ID0gYXdhaXQgQ29tcGlsZXJDb250ZXh0LnJ1bldpdGhPcHRpb25zKHByb2Nlc3NlZE9wdHMsCiAgICAgIChDb21waWxlckNvbnRleHQgY29udGV4dCkgYXN5bmMgewogICAgdmFyIGNvbXBpbGVyUmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVLZXJuZWxJbnRlcm5hbCgpOwogICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvbXBpbGVyUmVzdWx0Py5jb21wb25lbnQ7CiAgICBpZiAoY29tcG9uZW50ID09IG51bGwpIHJldHVybiBudWxsOwogICAgaWYgKGNvbXBvbmVudC5tYWluTWV0aG9kID09IG51bGwpIHsKICAgICAgY29udGV4dC5vcHRpb25zLnJlcG9ydCgKICAgICAgICAgIG1lc3NhZ2VNaXNzaW5nTWFpbi53aXRoTG9jYXRpb24oaW5wdXQsIC0xLCAwKSwgU2V2ZXJpdHkuZXJyb3IpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBjb21waWxlclJlc3VsdDsKICB9KTsKCiAgLy8gUmVtb3ZlIHRoZXNlIHBhcmFtZXRlcnMgZnJvbSBbb3B0aW9uc10gLSB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkIGFuZAogIC8vIHJldGFpbiBzdGF0ZSBmcm9tIHRoZSBwcmV2aW91cyBjb21waWxlLiAoaHR0cDovL2RhcnRidWcuY29tLzMzNzA4KQogIG9wdGlvbnMub25EaWFnbm9zdGljID0gbnVsbDsKICBvcHRpb25zLmZpbGVTeXN0ZW0gPSBudWxsOwogIHJldHVybiBjb21waWxlclJlc3VsdD8uY29tcG9uZW50Owp9CgpPYmplY3QgdG9rZW5Ub1N0cmluZyhPYmplY3QgdmFsdWUpIHsKICAvLyBUT0RPKGFoZSk6IFRoaXMgbWV0aG9kIGlzIG1vc3QgbGlrZWx5IHVubmVjZXNzYXJ5LiBEYXJ0MmpzIGRvZXNuJ3Qgc2VlCiAgLy8gdG9rZW5zIGFueW1vcmUuCiAgaWYgKHZhbHVlIGlzIEVycm9yVG9rZW4pIHsKICAgIC8vIFNob3VsZG4ndCBoYXBwZW4uCiAgICByZXR1cm4gdmFsdWUuYXNzZXJ0aW9uTWVzc2FnZS5tZXNzYWdlOwogIH0gZWxzZSBpZiAodmFsdWUgaXMgVG9rZW4pIHsKICAgIHJldHVybiB2YWx1ZS5sZXhlbWU7CiAgfSBlbHNlIHsKICAgIHJldHVybiB2YWx1ZTsKICB9Cn0KCi8vLyBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgbGlicmFyaWVzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBbdGFyZ2V0XSBhY2NvcmRpbmcKLy8vIHRvIHRoZSBsaWJyYXJpZXMgc3BlY2lmaWNhdGlvbiBbanNvbl0gZmlsZS4KLy8vCi8vLyBEYXJ0MmpzIHVzZXMgdGhlc2UgbmFtZXMgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZSBvZiBsaWJyYXJ5IGVudmlyb25tZW50Ci8vLyBjb25zdGFudHMsIHN1Y2ggYXMgYGNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCJkYXJ0LmxpYnJhcnkuaW8iKWAuCi8vIFRPRE8oc2lnbXVuZCk6IHJlZmFjdG9yIGRhcnQyanMgc28gdGhhdCB3ZSBjYW4gcmV0cmlldmUgdGhpcyBkYXRhIGxhdGVyIGluCi8vIHRoZSBjb21waWxhdGlvbiBwaXBlbGluZS4gQXQgdGhhdCBwb2ludCB3ZSBjYW4gZ2V0IGl0IGZyb20gdGhlIENGRQovLyByZXN1bHRzIGRpcmVjdGx5IGFuZCBjb21wbGV0ZWx5IGhpZGUgdGhlIGxpYnJhcmllcyBzcGVjaWZpY2F0aW9uIGZpbGUgZnJvbQovLyBkYXJ0MmpzLgovLyBUT0RPKHNpZ211bmQpOiBkZWxldGUgYWZ0ZXIgYWxsIGNvbnN0YW50IGV2YWx1YXRpb24gaXMgZG9uZSBpbiB0aGUgQ0ZFLCBhcwovLyB0aGlzIGRhdGEgd2lsbCBubyBsb25nZXIgYmUgbmVlZGVkIG9uIHRoZSBkYXJ0MmpzIHNpZGUuCkl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGVkTGlicmFyeU5hbWVzKAogICAgVXJpIGxpYnJhcmllc1NwZWNpZmljYXRpb25VcmksIFN0cmluZyBqc29uLCBTdHJpbmcgdGFyZ2V0KSB7CiAgcmV0dXJuIExpYnJhcmllc1NwZWNpZmljYXRpb24ucGFyc2UobGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSwganNvbikKICAgICAgLnNwZWNpZmljYXRpb25Gb3IodGFyZ2V0KQogICAgICAuYWxsTGlicmFyaWVzCiAgICAgIC53aGVyZSgobCkgPT4gbC5pc1N1cHBvcnRlZCkKICAgICAgLm1hcCgobCkgPT4gbC5uYW1lKTsKfQoKLy8vIERlc3VnYXIgQVBJIHRvIGRldGVybWluZSB3aGV0aGVyIFttZW1iZXJdIGlzIGEgcmVkaXJlY3RpbmcgZmFjdG9yeQovLy8gY29uc3RydWN0b3IuCi8vIFRPRE8oc2lnbXVuZCk6IERlbGV0ZSB0aGlzIEFQSSBvbmNlIGBtZW1iZXIuaXNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcmAKLy8gaXMgaW1wbGVtZW50ZWQgY29ycmVjdGx5IGZvciBwYXRjaCBmaWxlcyAoSXNzdWUgIzMzNDk1KS4KYm9vbCBpc1JlZGlyZWN0aW5nRmFjdG9yeShpci5Qcm9jZWR1cmUgbWVtYmVyKSB7CiAgaWYgKG1lbWJlci5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuRmFjdG9yeSkgewogICAgdmFyIGJvZHkgPSBtZW1iZXIuZnVuY3Rpb24uYm9keTsKICAgIGlmIChib2R5IGlzIHJlZGlyZWN0aW5nLlJlZGlyZWN0aW5nRmFjdG9yeUJvZHkpIHJldHVybiB0cnVlOwogICAgaWYgKGJvZHkgaXMgaXIuRXhwcmVzc2lvblN0YXRlbWVudCkgewogICAgICBpci5FeHByZXNzaW9uIGV4cHJlc3Npb24gPSBib2R5LmV4cHJlc3Npb247CiAgICAgIGlmIChleHByZXNzaW9uIGlzIGlyLkxldCkgewogICAgICAgIGlmIChleHByZXNzaW9uLnZhcmlhYmxlLm5hbWUgPT0gcmVkaXJlY3RpbmcubGV0TmFtZSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQqA6wBOTjwBIQE0ASgBOQFGAVEBSQE8AT8BSwE+ATwBLwFEAUQBRwE8AS8BMDIBMgkbHh4aJhcBMjUBKzwBRwFPATQqATgBOQFBAU4BKgkMDAwMFA0ODQ8NDQ0ODAwMDAwMAS8BOQFAATsBPAEnTB4lAgEtJxMjIhkdMxtLARo9UU1KFQQBMhYlLjwoLBcBSwE/AgEbJBIbKxcrCiIYHwE4ICMoAUsoOTUoKB5KEwYbBgFMSB8dJAIBJUwVHRkrHxkLEgQCAVAwBEtITkZODE47K0FHIBQjGwIBRxFQPDExJUEqMiI/FwoIBgQQAgEvcGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9kYXJ0MmpzLmRhcnQrc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9jb21waWxlcl9uZXcuZGFydJriLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBOZXcgQ29tcGlsZXIgQVBJLiBUaGlzIEFQSSBpcyB1bmRlciBjb25zdHJ1Y3Rpb24sIHVzZSBvbmx5IGludGVybmFsbHkgb3IKLy8vIGluIHVuaXR0ZXN0cy4KCmxpYnJhcnkgY29tcGlsZXJfbmV3OwoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9kYXJ0MmpzLmRhcnQnIGFzIGZlOwoKaW1wb3J0ICdjb21waWxlci5kYXJ0JyBzaG93IERpYWdub3N0aWM7CmltcG9ydCAnc3JjL2FwaWltcGwuZGFydCc7CmltcG9ydCAnc3JjL29wdGlvbnMuZGFydCcgc2hvdyBDb21waWxlck9wdGlvbnM7CgpleHBvcnQgJ2NvbXBpbGVyLmRhcnQnIHNob3cgRGlhZ25vc3RpYzsKCi8vIFVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWQsIHBhc3NpbmcgYG51bGxgIGZvciBhbnkgYXJndW1lbnQgdG8gdGhlCi8vIG1ldGhvZHMgb2YgbGlicmFyeSB3aWxsIHJlc3VsdCBpbiBhbiBFcnJvciBiZWluZyB0aHJvd24uCgovLy8gSW5wdXQga2luZHMgdXNlZCBieSBbQ29tcGlsZXJJbnB1dC5yZWFkRnJvbVVyaV0uCmVudW0gSW5wdXRLaW5kIHsKICAvLy8gRGF0YSBpcyByZWFkIGFzIFVURjggZWl0aGVyIGFzIGEgW1N0cmluZ10gb3IgYSB6ZXJvLXRlcm1pbmF0ZWQKICAvLy8gYExpc3Q8aW50PmAuCiAgVVRGOCwKCiAgLy8vIERhdGEgaXMgcmVhZCBhcyBieXRlcyBpbiBhIGBMaXN0PGludD5gLgogIGJpbmFyeSwKfQoKLy8vIEludGVyZmFjZSBmb3IgZGF0YSByZWFkIHRocm91Z2ggW0NvbXBpbGVySW5wdXQucmVhZEZyb21VcmldLgphYnN0cmFjdCBjbGFzcyBJbnB1dDxUPiB7CiAgLy8vIFRoZSBVUkkgZnJvbSB3aGljaCBkYXRhIHdhcyByZWFkLgogIFVyaSBnZXQgdXJpOwoKICAvLy8gVGhlIGZvcm1hdCBvZiB0aGUgcmVhZCBbZGF0YV0uCiAgSW5wdXRLaW5kIGdldCBpbnB1dEtpbmQ7CgogIC8vLyBUaGUgcmF3IGRhdGEgcmVhZCBmcm9tIFt1cmldLgogIFQgZ2V0IGRhdGE7Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIHByb3ZpZGluZyB0aGUgY29tcGlsZXIgd2l0aCBpbnB1dC4gVGhhdCBpcywgRGFydCBzb3VyY2UgZmlsZXMsCi8vLyBwYWNrYWdlIGNvbmZpZyBmaWxlcywgZXRjLgphYnN0cmFjdCBjbGFzcyBDb21waWxlcklucHV0IHsKICAvLy8gUmV0dXJucyBhIGZ1dHVyZSB0aGF0IGNvbXBsZXRlcyB0byB0aGUgc291cmNlIGNvcnJlc3BvbmRpbmcgdG8gW3VyaV0uCiAgLy8vIElmIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGggdGhpcyBleGNlcHRpb24uCiAgLy8vCiAgLy8vIElmIFtpbnB1dEtpbmRdIGlzIGBJbnB1dEtpbmQuVVRGOGAgdGhlIHNvdXJjZSBjYW4gYmUgcmVwcmVzZW50ZWQgZWl0aGVyIGFzCiAgLy8vIGEgemVyby10ZXJtaW5hdGVkIGBMaXN0PGludD5gIG9mIFVURi04IGJ5dGVzIG9yIGFzIGEgW1N0cmluZ10uIElmCiAgLy8vIFtpbnB1dEtpbmRdIGlzIGBJbnB1dEtpbmQuYmluYXJ5YCB0aGUgc291cmNlIGlzIGEgcmVhZCBhIGBMaXN0PGludD5gLgogIC8vLwogIC8vLyBUaGUgZm9sbG93aW5nIHRleHQgaXMgbm9uLW5vcm1hdGl2ZToKICAvLy8KICAvLy8gSXQgaXMgcmVjb21tZW5kZWQgdG8gcmV0dXJuIGEgVVRGLTggZW5jb2RlZCBsaXN0IG9mIGJ5dGVzIGJlY2F1c2UgdGhlCiAgLy8vIHNjYW5uZXIgaXMgbW9yZSBlZmZpY2llbnQgaW4gdGhpcyBjYXNlLiBJbiBlaXRoZXIgY2FzZSwgdGhlIGRhdGEgc3RydWN0dXJlCiAgLy8vIGlzIGV4cGVjdGVkIHRvIGhvbGQgYSB6ZXJvIGVsZW1lbnQgYXQgdGhlIGxhc3QgcG9zaXRpb24uIElmIHRoaXMgaXMgbm90CiAgLy8vIHRoZSBjYXNlLCB0aGUgZW50aXJlIGRhdGEgc3RydWN0dXJlIGlzIGNvcGllZCBiZWZvcmUgc2Nhbm5pbmcuCiAgRnV0dXJlPElucHV0PiByZWFkRnJvbVVyaShVcmkgdXJpLCB7SW5wdXRLaW5kIGlucHV0S2luZDogSW5wdXRLaW5kLlVURjh9KTsKfQoKLy8vIE91dHB1dCB0eXBlcyB1c2VkIGluIGBDb21waWxlck91dHB1dC5jcmVhdGVPdXRwdXRTaW5rYC4KZW51bSBPdXRwdXRUeXBlIHsKICAvLy8gVGhlIG1haW4gSmF2YVNjcmlwdCBvdXRwdXQuCiAganMsCgogIC8vLyBBIGRlZmVycmVkIEphdmFTY3JpcHQgb3V0cHV0IHBhcnQuCiAganNQYXJ0LAoKICAvLy8gQSBzb3VyY2UgbWFwIGZvciBhIEphdmFTY3JpcHQgb3V0cHV0LgogIHNvdXJjZU1hcCwKCiAgLy8vIER1bXAgaW5mbyBvdXRwdXQuCiAgZHVtcEluZm8sCgogIC8vLyBEZWZlcnJlZCBtYXAgb3V0cHV0LgogIGRlZmVycmVkTWFwLAoKICAvLy8gSW1wbGVtZW50YXRpb24gc3BlY2lmaWMgb3V0cHV0IHVzZWQgZm9yIGRlYnVnZ2luZyB0aGUgY29tcGlsZXIuCiAgZGVidWcsCn0KCi8vLyBTaW5rIGludGVyZmFjZSB1c2VkIGZvciBnZW5lcmF0aW5nIG91dHB1dCBmcm9tIHRoZSBjb21waWxlci4KYWJzdHJhY3QgY2xhc3MgT3V0cHV0U2luayB7CiAgLy8vIEFkZHMgW3RleHRdIHRvIHRoZSBzaW5rLgogIHZvaWQgYWRkKFN0cmluZyB0ZXh0KTsKCiAgLy8vIENsb3NlcyB0aGUgc2luay4KICB2b2lkIGNsb3NlKCk7Cn0KCi8vLyBTaW5rIGludGVyZmFjZSB1c2VkIGZvciBnZW5lcmF0aW5nIGJpbmFyeSBkYXRhIGZyb20gdGhlIGNvbXBpbGVyLgphYnN0cmFjdCBjbGFzcyBCaW5hcnlPdXRwdXRTaW5rIHsKICAvLy8gV3JpdGVzIGluZGljZXMgW3N0YXJ0XSB0byBbZW5kXSBvZiBbYnVmZmVyXSB0byB0aGUgc2luay4KICB2b2lkIHdyaXRlKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSk7CgogIC8vLyBDbG9zZXMgdGhlIHNpbmsuCiAgdm9pZCBjbG9zZSgpOwp9CgovLy8gSW50ZXJmYWNlIGZvciBwcm9kdWNpbmcgb3V0cHV0IGZyb20gdGhlIGNvbXBpbGVyLiBUaGF0IGlzLCBKYXZhU2NyaXB0IHRhcmdldAovLy8gZmlsZXMsIHNvdXJjZSBtYXAgZmlsZXMsIGR1bXAgaW5mbyBmaWxlcywgZXRjLgphYnN0cmFjdCBjbGFzcyBDb21waWxlck91dHB1dCB7CiAgLy8vIFJldHVybnMgYW4gW091dHB1dFNpbmtdIHRoYXQgd2lsbCBzZXJ2ZSBhcyBjb21waWxlciBvdXRwdXQgZm9yIHRoZSBnaXZlbgogIC8vLyBjb21wb25lbnQuCiAgLy8vCiAgLy8vIENvbXBvbmVudHMgYXJlIGlkZW50aWZpZWQgYnkgW25hbWVdLCBbZXh0ZW5zaW9uXSwgYW5kIFt0eXBlXS4gQnkKICAvLy8gY29udmVudGlvbiwgdGhlIGVtcHR5IHN0cmluZyBgIiJgIHdpbGwgcmVwcmVzZW50IHRoZSBtYWluIG91dHB1dCBvZiB0aGUKICAvLy8gcHJvdmlkZWQgW3R5cGVdLiBbbmFtZV0gYW5kIFtleHRlbnNpb25dIGFyZSBvdGhlcndpc2Ugc3VnZ2VzdGl2ZS4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZXBsYWNlIFtuYW1lXSBhbmQgW2V4dGVuc2lvbl0gd2l0aCBzb21ldGhpbmcgbGlrZQogIC8vIFtpZF0gYW5kIFt1cmldLgogIE91dHB1dFNpbmsgY3JlYXRlT3V0cHV0U2luayhTdHJpbmcgbmFtZSwgU3RyaW5nIGV4dGVuc2lvbiwgT3V0cHV0VHlwZSB0eXBlKTsKCiAgLy8vIFJldHVybnMgYW4gW0JpbmFyeU91dHB1dFNpbmtdIHRoYXQgd2lsbCBzZXJ2ZSBhcyBjb21waWxlciBvdXRwdXQgZm9yIHRoZQogIC8vLyBnaXZlbiBVUkkuCiAgQmluYXJ5T3V0cHV0U2luayBjcmVhdGVCaW5hcnlTaW5rKFVyaSB1cmkpOwp9CgovLy8gSW50ZXJmYWNlIGZvciByZWNlaXZpbmcgZGlhZ25vc3RpYyBtZXNzYWdlIGZyb20gdGhlIGNvbXBpbGVyLiBUaGF0IGlzLAovLy8gZXJyb3JzLCB3YXJuaW5ncywgaGludHMsIGV0Yy4KYWJzdHJhY3QgY2xhc3MgQ29tcGlsZXJEaWFnbm9zdGljcyB7CiAgLy8vIEludm9rZWQgYnkgdGhlIGNvbXBpbGVyIHRvIHJlcG9ydCBkaWFnbm9zdGljcy4gSWYgW3VyaV0gaXMgYG51bGxgLCBzbyBhcmUKICAvLy8gW2JlZ2luXSBhbmQgW2VuZF0uIE5vIG90aGVyIGFyZ3VtZW50cyBtYXkgYmUgYG51bGxgLiBJZiBbdXJpXSBpcyBub3QKICAvLy8gYG51bGxgLCBuZWl0aGVyIGFyZSBbYmVnaW5dIGFuZCBbZW5kXS4gW3VyaV0gaW5kaWNhdGVzIHRoZSBjb21waWxhdGlvbgogIC8vLyB1bml0IGZyb20gd2hlcmUgdGhlIGRpYWdub3N0aWMgb3JpZ2luYXRlcy4gW2JlZ2luXSBhbmQgW2VuZF0gYXJlCiAgLy8vIHplcm8tYmFzZWQgY2hhcmFjdGVyIG9mZnNldHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LgogIC8vLyBbbWVzc2FnZV0gaXMgdGhlIGRpYWdub3N0aWMgbWVzc2FnZSwgYW5kIFtraW5kXSBpbmRpY2F0ZXMgaW5kaWNhdGVzIHdoYXQKICAvLy8ga2luZCBvZiBkaWFnbm9zdGljIGl0IGlzLgogIC8vLwogIC8vLyBFeHBlcmltZW50YWw6IFtjb2RlXSBnaXZlcyBhY2Nlc3MgdG8gYW4gaWQgZm9yIHRoZSBtZXNzYWdlcy4gQ3VycmVudGx5IGl0CiAgLy8vIGlzIHRoZSBbTWVzc2FnZV0gdXNlZCB0byBjcmVhdGUgdGhlIGRpYWdub3N0aWMsIGlmIGF2YWlsYWJsZSwgZnJvbSB3aGljaAogIC8vLyB0aGUgW01lc3NhZ2VLaW5kXSBpcyBhY2Nlc3NpYmxlLgogIHZvaWQgcmVwb3J0KAogICAgICB2YXIgY29kZSwgVXJpIHVyaSwgaW50IGJlZ2luLCBpbnQgZW5kLCBTdHJpbmcgdGV4dCwgRGlhZ25vc3RpYyBraW5kKTsKfQoKLy8vIEluZm9ybWF0aW9uIHJlc3VsdGluZyBmcm9tIHRoZSBjb21waWxhdGlvbi4KY2xhc3MgQ29tcGlsYXRpb25SZXN1bHQgewogIC8vLyBgdHJ1ZWAgaWYgdGhlIGNvbXBpbGF0aW9uIHN1Y2NlZWRlZCwgdGhhdCBpcywgY29tcGlsYXRpb24gZGlkbid0IGZhaWwgZHVlCiAgLy8vIHRvIGNvbXBpbGUtdGltZSBlcnJvcnMgYW5kL29yIGludGVybmFsIGVycm9ycy4KICBmaW5hbCBib29sIGlzU3VjY2VzczsKCiAgLy8vIFRoZSBjb21waWxlciBvYmplY3QgdXNlZCBmb3IgdGhlIGNvbXBpbGF0aW9uLgogIC8vLwogIC8vLyBOb3RlOiBUaGUgdHlwZSBvZiBbY29tcGlsZXJdIGlzIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBhbmQgbWF5IHZhcnkuCiAgLy8vIFVzZSBvbmx5IGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmcuCiAgZmluYWwgY29tcGlsZXI7CgogIC8vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBjb21waWxhdGlvbnMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCB0byBzcGVlZCB1cCBiYXRjaCBtb2RlLgogIGZpbmFsIGZlLkluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSBrZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGU7CgogIENvbXBpbGF0aW9uUmVzdWx0KHRoaXMuY29tcGlsZXIsCiAgICAgIHt0aGlzLmlzU3VjY2VzczogdHJ1ZSwgdGhpcy5rZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGU6IG51bGx9KTsKfQoKLy8vIFJldHVybnMgYSBmdXR1cmUgdGhhdCBjb21wbGV0ZXMgdG8gYSBbQ29tcGlsYXRpb25SZXN1bHRdIHdoZW4gdGhlIERhcnQKLy8vIHNvdXJjZXMgaW4gW29wdGlvbnNdIGhhdmUgYmVlbiBjb21waWxlZC4KLy8vCi8vLyBUaGUgZ2VuZXJhdGVkIGNvbXBpbGVyIG91dHB1dCBpcyBvYnRhaW5lZCBieSBwcm92aWRpbmcgYSBbY29tcGlsZXJPdXRwdXRdLgovLy8KLy8vIElmIHRoZSBjb21waWxhdGlvbiBmYWlscywgdGhlIGZ1dHVyZSdzIGBDb21waWxhdGlvblJlc3VsdC5pc1N1Y2Nlc3NgIGlzCi8vLyBgZmFsc2VgIGFuZCBbQ29tcGlsZXJEaWFnbm9zdGljcy5yZXBvcnRdIG9uIFtjb21waWxlckRpYWdub3N0aWNzXQovLy8gaXMgaW52b2tlZCBhdCBsZWFzdCBvbmNlIHdpdGggYGtpbmQgPT0gRGlhZ25vc3RpYy5FUlJPUmAgb3IKLy8vIGBraW5kID09IERpYWdub3N0aWMuQ1JBU0hgLgpGdXR1cmU8Q29tcGlsYXRpb25SZXN1bHQ+IGNvbXBpbGUoCiAgICBDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zLAogICAgQ29tcGlsZXJJbnB1dCBjb21waWxlcklucHV0LAogICAgQ29tcGlsZXJEaWFnbm9zdGljcyBjb21waWxlckRpYWdub3N0aWNzLAogICAgQ29tcGlsZXJPdXRwdXQgY29tcGlsZXJPdXRwdXQpIHsKICBpZiAoY29tcGlsZXJPcHRpb25zID09IG51bGwpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJjb21waWxlck9wdGlvbnMgbXVzdCBiZSBub24tbnVsbCIpOwogIH0KICBpZiAoY29tcGlsZXJJbnB1dCA9PSBudWxsKSB7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiY29tcGlsZXJJbnB1dCBtdXN0IGJlIG5vbi1udWxsIik7CiAgfQogIGlmIChjb21waWxlckRpYWdub3N0aWNzID09IG51bGwpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJjb21waWxlckRpYWdub3N0aWNzIG11c3QgYmUgbm9uLW51bGwiKTsKICB9CiAgaWYgKGNvbXBpbGVyT3V0cHV0ID09IG51bGwpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJjb21waWxlck91dHB1dCBtdXN0IGJlIG5vbi1udWxsIik7CiAgfQoKICBDb21waWxlckltcGwgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXJJbXBsKAogICAgICBjb21waWxlcklucHV0LCBjb21waWxlck91dHB1dCwgY29tcGlsZXJEaWFnbm9zdGljcywgY29tcGlsZXJPcHRpb25zKTsKICByZXR1cm4gY29tcGlsZXIucnVuKGNvbXBpbGVyT3B0aW9ucy5lbnRyeVBvaW50KS50aGVuKChib29sIHN1Y2Nlc3MpIHsKICAgIHJldHVybiBuZXcgQ29tcGlsYXRpb25SZXN1bHQoY29tcGlsZXIsCiAgICAgICAgaXNTdWNjZXNzOiBzdWNjZXNzLAogICAgICAgIGtlcm5lbEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZToKICAgICAgICAgICAgY29tcGlsZXIua2VybmVsTG9hZGVyLmluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSk7CiAgfSk7Cn0KgMUATk48AU0SARYBFQFAASgbMAEoAUU8ATURRRMIAS4KAgFBGigPASUbASQOAgFRHx9MSAZRSEwGKwZMUU5FTQIBPBIiBgEpCgEsDQEYDAEbDwFGCQIBQRwfGQEXEAIBRiI/OgEXEAIBUTMgTxEGR05ITRVPAU8RLgIBSyIlUEtNR09PIAZQTycPTAIBMBpQNRgBNAZNKhIBKQYrRAEjSgIBSy0ETwRMRkAgIyUhLSUhQQQfPwQlRQQgQAQBLExIKxwoPQYCASJwYWNrYWdlOmNvbXBpbGVyL2NvbXBpbGVyX25ldy5kYXJ0NnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbW1hbmRsaW5lX29wdGlvbnMuZGFydJxZLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5jbWRsaW5lLm9wdGlvbnM7CgovLy8gQ29tbWFuZGxpbmUgZmxhZ3MgdXNlZCBpbiBgZGFydDJqcy5kYXJ0YCBhbmQvb3IgYGFwaWltcGwuZGFydGAuCmNsYXNzIEZsYWdzIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGFsbG93TW9ja0NvbXBpbGF0aW9uID0gJy0tYWxsb3ctbW9jay1jb21waWxhdGlvbic7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBhbGxvd05hdGl2ZUV4dGVuc2lvbnMgPSAnLS1hbGxvdy1uYXRpdmUtZXh0ZW5zaW9ucyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBkaXNhYmxlSW5saW5pbmcgPSAnLS1kaXNhYmxlLWlubGluaW5nJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGRpc2FibGVQcm9ncmFtU3BsaXQgPSAnLS1kaXNhYmxlLXByb2dyYW0tc3BsaXQnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZGlzYWJsZURpYWdub3N0aWNDb2xvcnMgPSAnLS1kaXNhYmxlLWRpYWdub3N0aWMtY29sb3JzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGRpc2FibGVOYXRpdmVMaXZlVHlwZUFuYWx5c2lzID0KICAgICAgJy0tZGlzYWJsZS1uYXRpdmUtbGl2ZS10eXBlLWFuYWx5c2lzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHVzZVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluID0KICAgICAgJy0tdXNlLXRyaXZpYWwtYWJzdHJhY3QtdmFsdWUtZG9tYWluJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGRpc2FibGVUeXBlSW5mZXJlbmNlID0gJy0tZGlzYWJsZS10eXBlLWluZmVyZW5jZSc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBkaXNhYmxlUnRpT3B0aW1pemF0aW9uID0gJy0tZGlzYWJsZS1ydGktb3B0aW1pemF0aW9uJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGR1bXBJbmZvID0gJy0tZHVtcC1pbmZvJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGVuYWJsZUFzc2VydE1lc3NhZ2UgPSAnLS1hc3NlcnQtbWVzc2FnZSc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBlbmFibGVDaGVja2VkTW9kZSA9ICctLWVuYWJsZS1jaGVja2VkLW1vZGUnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZW5hYmxlQXNzZXJ0cyA9ICctLWVuYWJsZS1hc3NlcnRzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGVuYWJsZURpYWdub3N0aWNDb2xvcnMgPSAnLS1lbmFibGUtZGlhZ25vc3RpYy1jb2xvcnMnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZXhwZXJpbWVudGFsVHJhY2tBbGxvY2F0aW9ucyA9CiAgICAgICctLWV4cGVyaW1lbnRhbC10cmFjay1hbGxvY2F0aW9ucyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBleHBlcmltZW50YWxBbGxvY2F0aW9uc1BhdGggPQogICAgICAnLS1leHBlcmltZW50YWwtYWxsb2NhdGlvbnMtcGF0aCc7CgogIC8vIFRlbXBvcmFyeSBleHBlcmltZW50IGZvciBjb2RlIGdlbmVyYXRpb24gb2YgbG9jYWxzIGZvciBmcmVxdWVudGx5IHVzZWQKICAvLyAndGhpcycgYW5kIGNvbnN0YW50cy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGV4cGVyaW1lbnRMb2NhbE5hbWVzID0gJy0tZXhwZXJpbWVudC1jb2RlLTEnOwoKICAvLyBFeHBlcmltZW50YWxseSB0cnkgdG8gZm9yY2UgcGFydC1maWxlIGZ1bmN0aW9ucyB0byBiZSBzZWVuIGFzIElJRkVzLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgZXhwZXJpbWVudFN0YXJ0dXBGdW5jdGlvbnMgPSAnLS1leHBlcmltZW50LWNvZGUtMic7CgogIC8vIEV4cGVyaW1lbnRhbGx5IHJlbHkgb24gSmF2YVNjcmlwdCBUb0Jvb2xlYW4gY29udmVyc2lvbnMuCiAgc3RhdGljIGNvbnN0IFN0cmluZyBleHBlcmltZW50VG9Cb29sZWFuID0gJy0tZXhwZXJpbWVudC1jb2RlLTMnOwoKICAvLyBBZGQgaW5zdHJ1bWVudGF0aW9uIHRvIGxvZyBldmVyeSBtZXRob2QgY2FsbC4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGV4cGVyaW1lbnRDYWxsSW5zdHJ1bWVudGF0aW9uID0KICAgICAgJy0tZXhwZXJpbWVudC1jYWxsLWluc3RydW1lbnRhdGlvbic7CgogIHN0YXRpYyBjb25zdCBTdHJpbmcgZXhwZXJpbWVudE5ld1J0aSA9ICctLWV4cGVyaW1lbnQtbmV3LXJ0aSc7CgogIHN0YXRpYyBjb25zdCBTdHJpbmcgZW5hYmxlTGFuZ3VhZ2VFeHBlcmltZW50cyA9ICctLWVuYWJsZS1leHBlcmltZW50JzsKCiAgc3RhdGljIGNvbnN0IFN0cmluZyBmYXN0U3RhcnR1cCA9ICctLWZhc3Qtc3RhcnR1cCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBmYXRhbFdhcm5pbmdzID0gJy0tZmF0YWwtd2FybmluZ3MnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZ2VuZXJhdGVDb2RlV2l0aENvbXBpbGVUaW1lRXJyb3JzID0KICAgICAgJy0tZ2VuZXJhdGUtY29kZS13aXRoLWNvbXBpbGUtdGltZS1lcnJvcnMnOwoKICBzdGF0aWMgY29uc3QgU3RyaW5nIHByZXZpZXdEYXJ0MiA9ICctLXByZXZpZXctZGFydC0yJzsKCiAgc3RhdGljIGNvbnN0IFN0cmluZyBvbWl0SW1wbGljaXRDaGVja3MgPSAnLS1vbWl0LWltcGxpY2l0LWNoZWNrcyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBvbWl0QXNDYXN0cyA9ICctLW9taXQtYXMtY2FzdHMnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgbGF4UnVudGltZVR5cGVUb1N0cmluZyA9ICctLWxheC1ydW50aW1lLXR5cGUtdG8tc3RyaW5nJzsKCiAgc3RhdGljIGNvbnN0IFN0cmluZyBwbGF0Zm9ybUJpbmFyaWVzID0gJy0tcGxhdGZvcm0tYmluYXJpZXM9LisnOwoKICBzdGF0aWMgY29uc3QgU3RyaW5nIG1pbmlmeSA9ICctLW1pbmlmeSc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBub0ZyZXF1ZW5jeUJhc2VkTWluaWZpY2F0aW9uID0KICAgICAgJy0tbm8tZnJlcXVlbmN5LWJhc2VkLW1pbmlmaWNhdGlvbic7CiAgLy8gRGlzYWJsZXMgbWluaWZpY2F0aW9uIGV2ZW4gaWYgZW5hYmxlZCBieSBvdGhlciBvcHRpb25zLCBlLmcuICctTzInLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgbm9NaW5pZnkgPSAnLS1uby1taW5pZnknOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgbm9Tb3VyY2VNYXBzID0gJy0tbm8tc291cmNlLW1hcHMnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgcHJlc2VydmVVcmlzID0gJy0tcHJlc2VydmUtdXJpcyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBzaG93UGFja2FnZVdhcm5pbmdzID0gJy0tc2hvdy1wYWNrYWdlLXdhcm5pbmdzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHN1cHByZXNzSGludHMgPSAnLS1zdXBwcmVzcy1oaW50cyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBzdXBwcmVzc1dhcm5pbmdzID0gJy0tc3VwcHJlc3Mtd2FybmluZ3MnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGVyc2UgPSAnLS10ZXJzZSc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0ZXN0TW9kZSA9ICctLXRlc3QtbW9kZSc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0cnVzdFByaW1pdGl2ZXMgPSAnLS10cnVzdC1wcmltaXRpdmVzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRydXN0VHlwZUFubm90YXRpb25zID0gJy0tdHJ1c3QtdHlwZS1hbm5vdGF0aW9ucyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0cnVzdEpTSW50ZXJvcFR5cGVBbm5vdGF0aW9ucyA9CiAgICAgICctLWV4cGVyaW1lbnRhbC10cnVzdC1qcy1pbnRlcm9wLXR5cGUtYW5ub3RhdGlvbnMnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgdXNlQ29udGVudFNlY3VyaXR5UG9saWN5ID0gJy0tY3NwJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHVzZU11bHRpU291cmNlSW5mbyA9ICctLXVzZS1tdWx0aS1zb3VyY2UtaW5mbyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB1c2VOZXdTb3VyY2VJbmZvID0gJy0tdXNlLW5ldy1zb3VyY2UtaW5mbyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB2ZXJib3NlID0gJy0tdmVyYm9zZSc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBwcm9ncmVzcyA9ICctLXNob3ctaW50ZXJuYWwtcHJvZ3Jlc3MnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgdmVyc2lvbiA9ICctLXZlcnNpb24nOwoKICBzdGF0aWMgY29uc3QgU3RyaW5nIGRpbGxEZXBlbmRlbmNpZXMgPSAnLS1kaWxsLWRlcGVuZGVuY2llcyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyByZWFkRGF0YSA9ICctLXJlYWQtZGF0YSc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB3cml0ZURhdGEgPSAnLS13cml0ZS1kYXRhJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHJlYWRDb2RlZ2VuID0gJy0tcmVhZC1jb2RlZ2VuJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHdyaXRlQ29kZWdlbiA9ICctLXdyaXRlLWNvZGVnZW4nOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgY29kZWdlblNoYXJkID0gJy0tY29kZWdlbi1zaGFyZCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBjb2RlZ2VuU2hhcmRzID0gJy0tY29kZWdlbi1zaGFyZHMnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgY2ZlT25seSA9ICctLWNmZS1vbmx5JzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGRlYnVnR2xvYmFsSW5mZXJlbmNlID0gJy0tZGVidWctZ2xvYmFsLWluZmVyZW5jZSc7CgogIHN0YXRpYyBjb25zdCBTdHJpbmcgc2VydmVyTW9kZSA9ICctLXNlcnZlci1tb2RlJzsKCiAgc3RhdGljIGNvbnN0IFN0cmluZyBuZXdEZWZlcnJlZFNwbGl0ID0gJy0tbmV3LWRlZmVycmVkLXNwbGl0JzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHJlcG9ydEludmFsaWRJbmZlcnJlZERlZmVycmVkVHlwZXMgPQogICAgICAnLS1yZXBvcnQtaW52YWxpZC1kZWZlcnJlZC10eXBlcyc7CgogIC8vLyBGbGFnIGZvciBhIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGZvciAncHJvZHVjdGlvbicgbW9kZS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGJlbmNobWFya2luZ1Byb2R1Y3Rpb24gPSAnLS1iZW5jaG1hcmtpbmctcHJvZHVjdGlvbic7CgogIC8vLyBGbGFnIGZvciBhIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGZvciBiZW5jaG1hcmtpbmcgJ2V4cGVyaW1lbnQnIG1vZGUuCiAgc3RhdGljIGNvbnN0IFN0cmluZyBiZW5jaG1hcmtpbmdFeHBlcmltZW50ID0gJy0tYmVuY2htYXJraW5nLXgnOwoKICBzdGF0aWMgY29uc3QgU3RyaW5nIGNvbmRpdGlvbmFsRGlyZWN0aXZlcyA9ICctLWNvbmRpdGlvbmFsLWRpcmVjdGl2ZXMnOwoKICAvLyBUaGUgc3ludGF4LW9ubHkgbGV2ZWwgb2Ygc3VwcG9ydCBmb3IgZ2VuZXJpYyBtZXRob2RzIGlzIGluY2x1ZGVkIGluIHRoZQogIC8vIDEuNTAgbWlsZXN0b25lIGZvciBEYXJ0LiBJdCBpcyBub3QgZXhwZXJpbWVudGFsLCBidXQgYWxzbyBub3QgcGVybWFuZW50OgogIC8vIGEgZnVsbCBpbXBsZW1lbnRhdGlvbiBpcyBleHBlY3RlZCBpbiB0aGUgZnV0dXJlLiBIZW5jZSwgdGhlCiAgLy8gJ0dFTkVSSUNfTUVUSE9EUycgY29tbWVudHMgd2hpY2ggd2VyZSBhZGRlZCB3aGVuIHRoaXMgZmVhdHVyZSB3YXMKICAvLyBleHBlcmltZW50YWwgaGF2ZSBiZWVuIHByZXNlcnZlZCwgc3VjaCB0aGF0IGl0IHdpbGwgYmUgZWFzeSB0byBmaW5kIHRoZQogIC8vIHJlbGV2YW50IGxvY2F0aW9ucyB0byB1cGRhdGUgd2hlbiBnZW5lcmljIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGZ1bGx5LgogIC8vCiAgLy8gVGhlIG9wdGlvbiBpcyBzdGlsbCBhY2NlcHRlZCwgYnV0IGl0IGhhcyBubyBlZmZlY3Q6IFRoZSBmZWF0dXJlIGlzIGVuYWJsZWQKICAvLyBieSBkZWZhdWx0IGFuZCBpdCBjYW5ub3QgYmUgZGlzYWJsZWQuCiAgLy8KICAvLyBUaGUgYXBwcm9hY2ggdGFrZW4gaW4gdGhlIGltcGxlbWVudGF0aW9uIGlzIHRvIHBhcnNlIGdlbmVyaWMgbWV0aG9kcywKICAvLyBpbnRyb2R1Y2UgQVNUIG5vZGVzIGZvciB0aGVtLCBnZW5lcmF0ZSBjb3JyZXNwb25kaW5nIHR5cGVzIChzdWNoIHRoYXQKICAvLyBmcm9udCBlbmQgdHJlYXRtZW50IGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgY29kZSB0aGF0IHByb2dyYW1tZXJzIHdyb3RlKSwKICAvLyBidXQgY29uc2lkZXJpbmcgYWxsIG1ldGhvZCB0eXBlIHZhcmlhYmxlcyB0byBoYXZlIGJvdW5kIGBkeW5hbWljYCBubwogIC8vIG1hdHRlciB3aGljaCBib3VuZCB0aGV5IGhhdmUgc3ludGFjdGljYWxseSAoc3VjaCB0aGF0IHRoZWlyIHZhbHVlIGFzIHR5cGVzCiAgLy8gaXMgdW5jaGVja2VkKSwgYW5kIHRoZW4gcmVwbGFjaW5nIG1ldGhvZCB0eXBlIHZhcmlhYmxlcyBieSBhIGBEeW5hbWljVHlwZWAKICAvLyAoc3VjaCB0aGF0IHRoZSBiYWNrZW5kIGRvZXMgbm90IG5lZWQgdG8gdGFrZSBtZXRob2QgdHlwZSBhcmd1bWVudHMgaW50bwogIC8vIGFjY291bnQpLgogIC8vCiAgLy8gVGhlIGZlYXR1cmUgaGFzIGFuIGluZm9ybWFsIHNwZWNpZmljYXRpb24gd2hpY2ggaXMgYXZhaWxhYmxlIGF0CiAgLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZWVybnN0Zy80MzUzZDdiNGY2Njk3NDViZWQzYTU0MjNlMDRhNDUzYy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGdlbmVyaWNNZXRob2RTeW50YXggPSAnLS1nZW5lcmljLW1ldGhvZC1zeW50YXgnOwoKICAvLyBJbml0aWFsaXppbmctZm9ybWFsIGFjY2VzcyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbm5vdCBiZSBkaXNhYmxlZC4KICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0aGUgb3B0aW9uIGlzIHN0aWxsIGFjY2VwdGVkLCBidXQgaXQgaXMgaWdub3JlZC4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGluaXRpYWxpemluZ0Zvcm1hbEFjY2VzcyA9ICctLWluaXRpYWxpemluZy1mb3JtYWwtYWNjZXNzJzsKCiAgLy8gRXhwZXJpbWVudGFsIGZsYWdzLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgcmVzb2x2ZU9ubHkgPSAnLS1yZXNvbHZlLW9ubHknOwp9CgpjbGFzcyBPcHRpb24gewogIHN0YXRpYyBjb25zdCBTdHJpbmcgc2hvd1BhY2thZ2VXYXJuaW5ncyA9CiAgICAgICcke0ZsYWdzLnNob3dQYWNrYWdlV2FybmluZ3N9fCR7RmxhZ3Muc2hvd1BhY2thZ2VXYXJuaW5nc309LionOwoKICBzdGF0aWMgY29uc3QgU3RyaW5nIGVuYWJsZUxhbmd1YWdlRXhwZXJpbWVudHMgPQogICAgICAnJHtGbGFncy5lbmFibGVMYW5ndWFnZUV4cGVyaW1lbnRzfXwnCiAgICAgICcke0ZsYWdzLmVuYWJsZUxhbmd1YWdlRXhwZXJpbWVudHN9PS4qJzsKCiAgLy8gRXhwZXJpbWVudGFsIG9wdGlvbnMuCiAgc3RhdGljIGNvbnN0IFN0cmluZyByZXNvbHV0aW9uSW5wdXQgPSAnLS1yZXNvbHV0aW9uLWlucHV0PS4rJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGJhemVsUGF0aHMgPSAnLS1iYXplbC1wYXRocz0uKyc7Cn0KgJgATk48ASEBRA5JSz5HTzYtNi1JTTBAQzpNNSo0KQFMG0QBSkoBPkMBMzYrAUEBSQE2OjoyATkBRTdPAUMBKzUrSTA5OEc6QCkwPkk2OjpGQi09LQFAMDI2ODg6LkkBNAFBOykBPUwBSkMBSgFNTkFHTU4FUCsFS0tOSlBQTQ8FRUdHAU5RUQEZNgIBDyxGATIsLwEbQTcCAS1wYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21tYW5kbGluZV9vcHRpb25zLmRhcnQsc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvZmlsZW5hbWVzLmRhcnSE0i8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZpbGVuYW1lczsKCmltcG9ydCAnZGFydDppbycgc2hvdyBQbGF0Zm9ybTsKCi8vIEZvciBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gY29udmVydCBXaW5kb3dzIGZpbGUgbmFtZXMgdG8gVVJJczoKLy8gaHR0cDovL2Jsb2dzLm1zZG4uY29tL2IvaWUvYXJjaGl2ZS8yMDA2LzEyLzA2L2ZpbGUtdXJpcy1pbi13aW5kb3dzLmFzcHgKClN0cmluZyBuYXRpdmVUb1VyaVBhdGgoU3RyaW5nIGZpbGVuYW1lKSB7CiAgLy8gVE9ETyhhaGUpOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHVzZSBhIERhcnQgbGlicmFyeSBpbnN0ZWFkLgogIGlmICghUGxhdGZvcm0uaXNXaW5kb3dzKSByZXR1cm4gZmlsZW5hbWU7CiAgZmlsZW5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlQWxsKCdcXCcsICcvJyk7CiAgaWYgKGZpbGVuYW1lLmxlbmd0aCA+IDIgJiYgZmlsZW5hbWVbMV0gPT0gJzonKSB7CiAgICBmaWxlbmFtZSA9ICIvJGZpbGVuYW1lIjsKICB9CiAgcmV0dXJuIGZpbGVuYW1lOwp9CgpTdHJpbmcgdXJpUGF0aFRvTmF0aXZlKFN0cmluZyBwYXRoKSB7CiAgLy8gVE9ETyhhaGUpOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHVzZSBhIERhcnQgbGlicmFyeSBpbnN0ZWFkLgogIGlmICghUGxhdGZvcm0uaXNXaW5kb3dzKSByZXR1cm4gcGF0aDsKICBpZiAocGF0aC5sZW5ndGggPiAzICYmIHBhdGhbMF0gPT0gJy8nICYmIHBhdGhbMl0gPT0gJzonKSB7CiAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMSkucmVwbGFjZUFsbCgnLycsICdcXCcpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gcGF0aC5yZXBsYWNlQWxsKCcvJywgJ1xcJyk7CiAgfQp9CgpmaW5hbCBVcmkgY3VycmVudERpcmVjdG9yeSA9IFVyaS5iYXNlOwoKVXJpIG5hdGl2ZVRvVXJpKFN0cmluZyBmaWxlbmFtZSkgPT4KICAgIGN1cnJlbnREaXJlY3RvcnkucmVzb2x2ZShuYXRpdmVUb1VyaVBhdGgoZmlsZW5hbWUpKTsKClN0cmluZyBhcHBlbmRTbGFzaChTdHJpbmcgcGF0aCkgPT4gcGF0aC5lbmRzV2l0aCgnLycpID8gcGF0aCA6ICckcGF0aC8nOwonAE5OPAETASABREsBKkAsLTMdBBMCASZAKD00CycEAgEnASQ5AUkBI3BhY2thZ2U6Y29tcGlsZXIvc3JjL2ZpbGVuYW1lcy5kYXJ0KnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL29wdGlvbnMuZGFydMAAXLEvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLnNyYy5vcHRpb25zOwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgYXMgZmU7CgppbXBvcnQgJ2NvbW1hbmRsaW5lX29wdGlvbnMuZGFydCcgc2hvdyBGbGFnczsKaW1wb3J0ICd1dGlsL3V0aWwuZGFydCc7CgovLy8gT3B0aW9ucyB1c2VkIGZvciBjb250cm9sbGluZyBkaWFnbm9zdGljIG1lc3NhZ2VzLgphYnN0cmFjdCBjbGFzcyBEaWFnbm9zdGljT3B0aW9ucyB7CiAgY29uc3QgRGlhZ25vc3RpY09wdGlvbnMoKTsKCiAgLy8vIElmIGB0cnVlYCwgd2FybmluZ3MgY2F1c2UgdGhlIGNvbXBpbGF0aW9uIHRvIGZhaWwuCiAgYm9vbCBnZXQgZmF0YWxXYXJuaW5nczsKCiAgLy8vIEVtaXQgdGVyc2UgZGlhZ25vc3RpY3Mgd2l0aG91dCBob3dUb0ZpeC4KICBib29sIGdldCB0ZXJzZURpYWdub3N0aWNzOwoKICAvLy8gSWYgYHRydWVgLCB3YXJuaW5ncyBhcmUgbm90IHJlcG9ydGVkLgogIGJvb2wgZ2V0IHN1cHByZXNzV2FybmluZ3M7CgogIC8vLyBJZiBgdHJ1ZWAsIGhpbnRzIGFyZSBub3QgcmVwb3J0ZWQuCiAgYm9vbCBnZXQgc3VwcHJlc3NIaW50czsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHdhcm5pbmdzIGFuZCBoaW50cyBhcmUgc2hvd24gZm9yIGFsbCBwYWNrYWdlcy4KICBib29sIGdldCBzaG93QWxsUGFja2FnZVdhcm5pbmdzOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgd2FybmluZ3MgYW5kIGhpbnRzIGFyZSBoaWRkZW4gZm9yIGFsbCBwYWNrYWdlcy4KICBib29sIGdldCBoaWRlUGFja2FnZVdhcm5pbmdzOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgd2FybmluZ3Mgc2hvdWxkIGJlIHNob3VsZCBmb3IgW3VyaV0uCiAgYm9vbCBzaG93UGFja2FnZVdhcm5pbmdzRm9yKFVyaSB1cmkpOwp9CgovLy8gT2JqZWN0IGZvciBwYXNzaW5nIG9wdGlvbnMgdG8gdGhlIGNvbXBpbGVyLiBTdXBlcmNsYXNzZXMgYXJlIHVzZWQgdG8gc2VsZWN0Ci8vLyBzdWJzZXRzIG9mIHRoZXNlIG9wdGlvbnMsIGVuYWJsaW5nIGVhY2ggcGFydCBvZiB0aGUgY29tcGlsZXIgdG8gZGVwZW5kIG9uCi8vLyBhcyBmZXcgYXMgcG9zc2libGUuCmNsYXNzIENvbXBpbGVyT3B0aW9ucyBpbXBsZW1lbnRzIERpYWdub3N0aWNPcHRpb25zIHsKICAvLy8gVGhlIGVudHJ5IHBvaW50IG9mIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGlzIGJlaW5nIGNvbXBpbGVkLgogIFVyaSBlbnRyeVBvaW50OwoKICAvLy8gUGFja2FnZSByb290IGxvY2F0aW9uLgogIC8vLwogIC8vLyBJZiBub3QgbnVsbCB0aGVuIFtwYWNrYWdlQ29uZmlnXSBzaG91bGQgYmUgbnVsbC4KICBVcmkgcGFja2FnZVJvb3Q7CgogIC8vLyBMb2NhdGlvbiBvZiB0aGUgcGFja2FnZSBjb25maWd1cmF0aW9uIGZpbGUuCiAgLy8vCiAgLy8vIElmIG5vdCBudWxsIHRoZW4gW3BhY2thZ2VSb290XSBzaG91bGQgYmUgbnVsbC4KICBVcmkgcGFja2FnZUNvbmZpZzsKCiAgLy8vIExpc3Qgb2Yga2VybmVsIGZpbGVzIHRvIGxvYWQuCiAgLy8vCiAgLy8vIFdoZW4gY29tcGlsaW5nIG1vZHVsYXJseSwgdGhpcyBjb250YWlucyBrZXJuZWwgZmlsZXMgdGhhdCBhcmUgbmVlZGVkCiAgLy8vIHRvIGNvbXBpbGUgYSBzaW5nbGUgbW9kdWxlLgogIC8vLwogIC8vLyBXaGVuIGxpbmtpbmcsIHRoaXMgY29udGFpbnMgYWxsIGtlcm5lbCBmaWxlcyB0aGF0IGZvcm0gcGFydCBvZiB0aGUgZmluYWwKICAvLy8gcHJvZ3JhbS4KICAvLy8KICAvLy8gQXQgdGhpcyB0aW1lLCB0aGlzIGxpc3QgcG9pbnRzIHRvIGZ1bGwga2VybmVsIGZpbGVzLiBJbiB0aGUgZnV0dXJlLCB3ZSBtYXkKICAvLy8gdXNlIGEgbGlzdCBvZiBvdXRsaW5lIGZpbGVzIGZvciBtb2R1bGFyIGNvbXBpbGVzLCBhbmQgb25seSB1c2UgZnVsbCBrZXJuZWwKICAvLy8gZmlsZXMgZm9yIGxpbmtpbmcuCiAgTGlzdDxVcmk+IGRpbGxEZXBlbmRlbmNpZXM7CgogIC8vLyBMb2NhdGlvbiBmcm9tIHdoaWNoIHNlcmlhbGl6ZWQgaW5mZXJlbmNlIGRhdGEgaXMgcmVhZC4KICAvLy8KICAvLy8gSWYgdGhpcyBpcyBzZXQsIHRoZSBbZW50cnlQb2ludF0gaXMgZXhwZWN0ZWQgdG8gYmUgYSAuZGlsbCBmaWxlIGFuZCB0aGUKICAvLy8gZnJvbnRlbmQgd29yayBpcyBza2lwcGVkLgogIFVyaSByZWFkRGF0YVVyaTsKCiAgLy8vIExvY2F0aW9uIHRvIHdoaWNoIGluZmVyZW5jZSBkYXRhIGlzIHNlcmlhbGl6ZWQuCiAgLy8vCiAgLy8vIElmIHRoaXMgaXMgc2V0LCB0aGUgY29tcGlsYXRpb24gc3RvcHMgYWZ0ZXIgdHlwZSBpbmZlcmVuY2UuCiAgVXJpIHdyaXRlRGF0YVVyaTsKCiAgLy8vIExvY2F0aW9uIGZyb20gd2hpY2ggY29kZWdlbiBkYXRhIGlzIHJlYWQuCiAgLy8vCiAgLy8vIElmIHRoaXMgaXMgc2V0LCB0aGUgY29tcGlsYXRpb24gc3RhcnRzIGF0IGNvZGVnZW4gZW5xdWV1ZWluZy4KICBVcmkgcmVhZENvZGVnZW5Vcmk7CgogIC8vLyBMb2NhdGlvbiB0byB3aGljaCBjb2RlZ2VuIGRhdGEgaXMgc2VyaWFsaXplZC4KICAvLy8KICAvLy8gSWYgdGhpcyBpcyBzZXQsIHRoZSBjb21waWxhdGlvbiBzdG9wcyBhZnRlciBjb2RlIGdlbmVyYXRpb24uCiAgVXJpIHdyaXRlQ29kZWdlblVyaTsKCiAgLy8vIFdoZXRoZXIgdG8gcnVuIG9ubHkgdGhlIENGRSBhbmQgZW1pdCB0aGUgZ2VuZXJhdGVkIGtlcm5lbCBmaWxlIGluCiAgLy8vIFtvdXRwdXRVcmldLgogIGJvb2wgY2ZlT25seSA9IGZhbHNlOwoKICAvLy8gRmxhZyBvbmx5IG1lYW50IGZvciBkYXJ0MmpzIGRldmVsb3BlcnMgdG8gaXRlcmF0ZSBvbiBnbG9iYWwgaW5mZXJlbmNlCiAgLy8vIGNoYW5nZXMuCiAgLy8vCiAgLy8vIFdoZW4gd29ya2luZyBvbiBsYXJnZSBhcHBzIHRoaXMgZmxhZyBhbGxvd3MgdG8gbG9hZCBzZXJpYWxpemVkIGRhdGEgZm9yCiAgLy8vIHRoZSBhcHAgKHZpYSAtLXJlYWQtZGF0YSksIHJldXNlIGl0cyBjbG9zZWQgd29ybGQsIGFuZCByZXJ1biB0aGUgZ2xvYmFsCiAgLy8vIGluZmVyZW5jZSBwaGFzZSAoZXZlbiB0aG91Z2ggdGhlIHNlcmlhbGl6ZWQgZGF0YSBhbHJlYWR5IGNvbnRhaW5zIGEgZ2xvYmFsCiAgLy8vIGluZmVyZW5jZSByZXN1bHQpLgogIGJvb2wgZGVidWdHbG9iYWxJbmZlcmVuY2UgPSBmYWxzZTsKCiAgLy8vIFJlc29sdmVkIGNvbnN0YW50ICJlbnZpcm9ubWVudCIgdmFsdWVzIHBhc3NlZCB0byB0aGUgY29tcGlsZXIgdmlhIHRoZSBgLURgCiAgLy8vIGZsYWdzLgogIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQgPSBjb25zdCA8U3RyaW5nLCBTdHJpbmc+e307CgogIC8vLyBGbGFncyBlbmFibGluZyBsYW5ndWFnZSBleHBlcmltZW50cy4KICBNYXA8ZmUuRXhwZXJpbWVudGFsRmxhZywgYm9vbD4gbGFuZ3VhZ2VFeHBlcmltZW50cyA9IHt9OwoKICAvLy8gYHRydWVgIGlmIENGRSBwZXJmb3JtcyBjb25zdGFudCBldmFsdWF0aW9uLgogIGJvb2wgZ2V0IHVzZUNGRUNvbnN0YW50cyA9PgogICAgICBsYW5ndWFnZUV4cGVyaW1lbnRzW2ZlLkV4cGVyaW1lbnRhbEZsYWcuY29uc3RhbnRVcGRhdGUyMDE4XTsKCiAgLy8vIEEgcG9zc2libHkgbnVsbCBzdGF0ZSBvYmplY3QgZm9yIGtlcm5lbCBjb21waWxhdGlvbi4KICBmZS5Jbml0aWFsaXplZENvbXBpbGVyU3RhdGUga2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlOwoKICAvLy8gV2hldGhlciB3ZSBhbGxvdyBtb2NraW5nIGNvbXBpbGF0aW9uIG9mIGxpYnJhcmllcyBzdWNoIGFzIGRhcnQ6aW8gYW5kCiAgLy8vIGRhcnQ6aHRtbCBmb3IgdW5pdCB0ZXN0aW5nIHB1cnBvc2VzLgogIGJvb2wgYWxsb3dNb2NrQ29tcGlsYXRpb24gPSBmYWxzZTsKCiAgLy8vIFNldHMgYSBjb21iaW5hdGlvbiBvZiBmbGFncyBmb3IgYmVuY2htYXJraW5nICdwcm9kdWN0aW9uJyBtb2RlLgogIGJvb2wgYmVuY2htYXJraW5nUHJvZHVjdGlvbiA9IGZhbHNlOwoKICAvLy8gU2V0cyBhIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGZvciBiZW5jaG1hcmtpbmcgJ2V4cGVyaW1lbnQnIG1vZGUuCiAgYm9vbCBiZW5jaG1hcmtpbmdFeHBlcmltZW50ID0gZmFsc2U7CgogIC8vLyBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZGsgYnVpbGQuCiAgU3RyaW5nIGJ1aWxkSWQgPSBfVU5ERVRFUk1JTkVEX0JVSUxEX0lEOwoKICAvLy8gV2hldGhlciB0aGVyZSBpcyBhIGJ1aWxkLWlkIGF2YWlsYWJsZSBzbyB3ZSBjYW4gdXNlIGl0IG9uIGVycm9yIG1lc3NhZ2VzCiAgLy8vIGFuZCBpbiB0aGUgZW1pdHRlZCBvdXRwdXQgb2YgdGhlIGNvbXBpbGVyLgogIGJvb2wgZ2V0IGhhc0J1aWxkSWQgPT4gYnVpbGRJZCAhPSBfVU5ERVRFUk1JTkVEX0JVSUxEX0lEOwoKICAvLy8gV2hldGhlciB0byBjb21waWxlIGZvciB0aGUgc2VydmVyIGNhdGVnb3J5LiBUaGlzIGlzIHVzZWQgdG8gY29tcGlsZSB0byBKUwogIC8vLyB0aGF0IGlzIGludGVuZGVkIHRvIGJlIHJ1biBvbiBzZXJ2ZXItc2lkZSBWTXMgbGlrZSBub2RlanMuCiAgYm9vbCBjb21waWxlRm9yU2VydmVyID0gZmFsc2U7CgogIC8vLyBMb2NhdGlvbiB3aGVyZSB0byBnZW5lcmF0ZSBhIG1hcCBjb250YWluaW5nIGRldGFpbHMgb2YgaG93IGRlZmVycmVkCiAgLy8vIGxpYnJhcmllcyBhcmUgc3ViZGl2aWRlZC4KICBVcmkgZGVmZXJyZWRNYXBVcmk7CgogIC8vLyBXaGV0aGVyIHRvIGFwcGx5IHRoZSBuZXcgZGVmZXJyZWQgc3BsaXQgZml4ZXMuIFRoZSBmaXhlcyBpbXByb3ZlIG9uCiAgLy8vIHBlcmZvcm1hbmNlIGFuZCBmaXggYSBzb3VuZG5lc3MgaXNzdWUgd2l0aCBpbmZlcnJlZCB0eXBlcy4gVGhlIGxhdHRlciB3aWxsCiAgLy8vIG1vdmUgbW9yZSBjb2RlIHRvIHRoZSBtYWluIG91dHB1dCB1bml0LCBiZWNhdXNlIG9mIHRoYXQgd2UgYXJlIG5vdAogIC8vLyBlbmFibGluZyB0aGUgZmVhdHVyZSBieSBkZWZhdWx0IHJpZ2h0IGF3YXkuCiAgLy8vCiAgLy8vIFdoZW4gW3JlcG9ydEludmFsaWRJbmZlcnJlZERlZmVycmVkVHlwZXNdIHNob3dzIG5vIGVycm9ycywgd2UgZXhwZWN0IHRoaXMKICAvLy8gZmxhZyB0byBwcm9kdWNlIHRoZSBzYW1lIG9yIGJldHRlciByZXN1bHRzIHRoYW4gdGhlIGN1cnJlbnQgdW5zb3VuZAogIC8vLyBpbXBsZW1lbnRhdGlvbi4KICBib29sIG5ld0RlZmVycmVkU3BsaXQgPSBmYWxzZTsKCiAgLy8vIFNob3cgZXJyb3JzIHdoZW4gYSBkZWZlcnJlZCB0eXBlIGlzIGluZmVycmVkIGFzIGEgcmV0dXJuIHR5cGUgb2YgYSBjbG9zdXJlCiAgLy8vIG9yIGluIGEgdHlwZSBwYXJhbWV0ZXIuIFRob3NlIGNhc2VzIGNhdXNlIHRoZSBjb21waWxlciB0b2RheSB0byBiZWhhdmUKICAvLy8gdW5zb3VuZGx5IGJ5IHB1dHRpbmcgdGhlIGNvZGUgaW4gYSBkZWZlcnJlZCBvdXRwdXQgdW5pdC4gSW4gdGhlIGZ1dHVyZQogIC8vLyB3aGVuIFtuZXdEZWZlcnJlZFNwbGl0XSBpcyBvbiBieSBkZWZhdWx0LCB0aG9zZSBjYXNlcyB3aWxsIGJlIHRyZWF0ZWQKICAvLy8gc291bmRseSBhbmQgd2lsbCBjYXVzZSBtb3JlIGNvZGUgdG8gYmUgbW92ZWQgdG8gdGhlIG1haW4gb3V0cHV0IHVuaXQuCiAgLy8vCiAgLy8vIFRoaXMgZmxhZyBpcyBwcmVzZW50ZWQgdG8gaGVscCBkZXZlbG9wZXJzIGZpbmQgYW5kIGZpeCB0aGUgYWZmZWN0ZWQgY29kZS4KICBib29sIHJlcG9ydEludmFsaWRJbmZlcnJlZERlZmVycmVkVHlwZXMgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gZGlzYWJsZSBpbmxpbmluZyBkdXJpbmcgdGhlIGJhY2tlbmQgb3B0aW1pemF0aW9ucy4KICAvLyBUT0RPKHNpZ211bmQpOiBuZWdhdGUsIHNvIGFsbCBmbGFncyBhcmUgcG9zaXRpdmUKICBib29sIGRpc2FibGVJbmxpbmluZyA9IGZhbHNlOwoKICAvLy8gRGlzYWJsZSBkZWZlcnJlZCBsb2FkaW5nLCBpbnN0ZWFkIGdlbmVyYXRlIGV2ZXJ5dGhpbmcgaW4gb25lIG91dHB1dCB1bml0LgogIC8vLyBOb3RlOiB0aGUgcmVzdWx0aW5nIHByb2dyYW0gc3RpbGwgY29ycmVjdGx5IGNoZWNrcyB0aGF0IGxvYWRMaWJyYXJ5ICYKICAvLy8gY2hlY2tMaWJyYXJ5IGNhbGxzIGFyZSBjb3JyZWN0LgogIGJvb2wgZGlzYWJsZVByb2dyYW1TcGxpdCA9IGZhbHNlOwoKICAvLy8gRGlhZ25vc3RpYyBvcHRpb246IElmIGB0cnVlYCwgd2FybmluZ3MgY2F1c2UgdGhlIGNvbXBpbGF0aW9uIHRvIGZhaWwuCiAgQG92ZXJyaWRlCiAgYm9vbCBmYXRhbFdhcm5pbmdzID0gZmFsc2U7CgogIC8vLyBEaWFnbm9zdGljIG9wdGlvbjogRW1pdCB0ZXJzZSBkaWFnbm9zdGljcyB3aXRob3V0IGhvd1RvRml4LgogIEBvdmVycmlkZQogIGJvb2wgdGVyc2VEaWFnbm9zdGljcyA9IGZhbHNlOwoKICAvLy8gRGlhZ25vc3RpYyBvcHRpb246IElmIGB0cnVlYCwgd2FybmluZ3MgYXJlIG5vdCByZXBvcnRlZC4KICBAb3ZlcnJpZGUKICBib29sIHN1cHByZXNzV2FybmluZ3MgPSBmYWxzZTsKCiAgLy8vIERpYWdub3N0aWMgb3B0aW9uOiBJZiBgdHJ1ZWAsIGhpbnRzIGFyZSBub3QgcmVwb3J0ZWQuCiAgQG92ZXJyaWRlCiAgYm9vbCBzdXBwcmVzc0hpbnRzID0gZmFsc2U7CgogIC8vLyBEaWFnbm9zdGljIG9wdGlvbjogTGlzdCBvZiBwYWNrYWdlcyBmb3Igd2hpY2ggd2FybmluZ3MgYW5kIGhpbnRzIGFyZQogIC8vLyByZXBvcnRlZC4gSWYgYG51bGxgLCBubyBwYWNrYWdlIHdhcm5pbmdzIG9yIGhpbnRzIGFyZSByZXBvcnRlZC4gSWYKICAvLy8gZW1wdHksIGFsbCB3YXJuaW5ncyBhbmQgaGludHMgYXJlIHJlcG9ydGVkLgogIExpc3Q8U3RyaW5nPiBzaG93blBhY2thZ2VXYXJuaW5nczsgLy8gJiYmJiYKCiAgLy8vIFdoZXRoZXIgdG8gZGlzYWJsZSBnbG9iYWwgdHlwZSBpbmZlcmVuY2UuCiAgYm9vbCBkaXNhYmxlVHlwZUluZmVyZW5jZSA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byB1c2UgdGhlIHRyaXZpYWwgYWJzdHJhY3QgdmFsdWUgZG9tYWluLgogIGJvb2wgdXNlVHJpdmlhbEFic3RyYWN0VmFsdWVEb21haW4gPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gZGlzYWJsZSBvcHRpbWl6YXRpb24gZm9yIG5lZWQgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uLgogIGJvb2wgZGlzYWJsZVJ0aU9wdGltaXphdGlvbiA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byBlbWl0IGEgc3VtbWFyeSBvZiB0aGUgaW5mb3JtYXRpb24gdXNlZCBieSB0aGUgY29tcGlsZXIgZHVyaW5nCiAgLy8vIG9wdGltaXphdGlvbi4gVGhpcyBpbmNsdWRlcyByZXNvbHV0aW9uIGRldGFpbHMsIGRlcGVuZGVuY2llcyBiZXR3ZWVuCiAgLy8vIGVsZW1lbnRzLCByZXN1bHRzIG9mIHR5cGUgaW5mZXJlbmNlLCBhbmQgZGF0YSBhYm91dCBnZW5lcmF0ZWQgY29kZS4KICBib29sIGR1bXBJbmZvID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIHVzZSB0aGUgbmV3IGR1bXAtaW5mbyBiaW5hcnkgZm9ybWF0LiBUaGlzIHdpbGwgYmUgdGhlIGRlZmF1bHQKICAvLy8gYWZ0ZXIgYSB0cmFuc2l0aW9uYWwgcGVyaW9kLgogIGJvb2wgdXNlRHVtcEluZm9CaW5hcnlGb3JtYXQgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgd2UgYWxsb3cgcGFzc2luZyBhbiBleHRyYSBhcmd1bWVudCB0byBgYXNzZXJ0YCwgY29udGFpbmluZyBhCiAgLy8vIHJlYXNvbiBmb3Igd2h5IGFuIGFzc2VydGlvbiBmYWlscy4gKGV4cGVyaW1lbnRhbCkKICAvLy8KICAvLy8gVGhpcyBpcyBvbmx5IGluY2x1ZGVkIHNvIHRoYXQgdGVzdHMgY2FuIHBhc3MgdGhlIC0tYXNzZXJ0LW1lc3NhZ2UgZmxhZwogIC8vLyB3aXRob3V0IGNhdXNpbmcgZGFydDJqcyB0byBjcmFzaC4gVGhlIGZsYWcgaGFzIG5vIGVmZmVjdC4KICBib29sIGVuYWJsZUFzc2VydE1lc3NhZ2UgPSB0cnVlOwoKICAvLy8gV2hldGhlciB0byBlbmFibGUgbWluaWZpY2F0aW9uCiAgLy8gVE9ETyhzaWdtdW5kKTogcmVuYW1lIHRvIG1pbmlmeQogIGJvb2wgZW5hYmxlTWluaWZpY2F0aW9uID0gZmFsc2U7CgogIC8vLyBGbGFnIHRvIHR1cm4gb2ZmIG1pbmlmaWNhdGlvbiBldmVuIGlmIGVuYWJsZWQgZWxzZXdoZXJlLCBlLmcuIHZpYQogIC8vLyAtTzIuIEJvdGggW2VuYWJsZU1pbmlmaWNhdGlvbl0gYW5kIFtfZGlzYWJsZU1pbmlmaWNhdGlvbl0gY2FuIGJlIHRydWUsIGluCiAgLy8vIHdoaWNoIGNhc2UgW19kaXNhYmxlTWluaWZpY2F0aW9uXSB3aW5zLgogIGJvb2wgX2Rpc2FibGVNaW5pZmljYXRpb24gPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gbW9kZWwgd2hpY2ggbmF0aXZlIGNsYXNzZXMgYXJlIGxpdmUgYmFzZWQgb24gYW5ub3RhdGlvbnMgb24gdGhlCiAgLy8vIGNvcmUgbGlicmFyaWVzLiBJZiBmYWxzZSwgYWxsIG5hdGl2ZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgYnkgZGVmYXVsdC4KICBib29sIGVuYWJsZU5hdGl2ZUxpdmVUeXBlQW5hbHlzaXMgPSB0cnVlOwoKICAvLy8gV2hldGhlciB0byBnZW5lcmF0ZSBjb2RlIGNvbnRhaW5pbmcgdXNlcidzIGBhc3NlcnRgIHN0YXRlbWVudHMuCiAgYm9vbCBlbmFibGVVc2VyQXNzZXJ0aW9ucyA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byBnZW5lcmF0ZSBhIHNvdXJjZS1tYXAgZmlsZSB0b2dldGhlciB3aXRoIHRoZSBvdXRwdXQgcHJvZ3JhbS4KICBib29sIGdlbmVyYXRlU291cmNlTWFwID0gdHJ1ZTsKCiAgLy8vIFVSSSBvZiB0aGUgbWFpbiBvdXRwdXQgb2YgdGhlIGNvbXBpbGVyLgogIFVyaSBvdXRwdXRVcmk7CgogIC8vLyBMb2NhdGlvbiBvZiB0aGUgbGlicmFyaWVzIHNwZWNpZmljYXRpb24gZmlsZS4KICBVcmkgbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaTsKCiAgLy8vIExvY2F0aW9uIG9mIHRoZSBrZXJuZWwgcGxhdGZvcm0gYC5kaWxsYCBmaWxlcy4KICBVcmkgcGxhdGZvcm1CaW5hcmllczsKCiAgLy8vIFVSSSB3aGVyZSB0aGUgY29tcGlsZXIgc2hvdWxkIGdlbmVyYXRlIHRoZSBvdXRwdXQgc291cmNlIG1hcCBmaWxlLgogIFVyaSBzb3VyY2VNYXBVcmk7CgogIC8vLyBUaGUgY29tcGlsZXIgaXMgcnVuIGZyb20gdGhlIGJ1aWxkIGJvdC4KICBib29sIHRlc3RNb2RlID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIHRydXN0IEpTLWludGVyb3AgYW5ub3RhdGlvbnMuIChleHBlcmltZW50YWwpCiAgYm9vbCB0cnVzdEpTSW50ZXJvcFR5cGVBbm5vdGF0aW9ucyA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byB0cnVzdCBwcmltaXRpdmUgdHlwZXMgZHVyaW5nIGluZmVyZW5jZSBhbmQgb3B0aW1pemF0aW9ucy4KICBib29sIHRydXN0UHJpbWl0aXZlcyA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byBvbWl0IGltcGxpY2l0IHN0cm9uZyBtb2RlIGNoZWNrcy4KICBib29sIG9taXRJbXBsaWNpdENoZWNrcyA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byBvbWl0IGFzIGNhc3RzIGJ5IGRlZmF1bHQuCiAgYm9vbCBvbWl0QXNDYXN0cyA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byBvbWl0IGNsYXNzIHR5cGUgYXJndW1lbnRzIG9ubHkgbmVlZGVkIGZvciBgdG9TdHJpbmdgIG9uCiAgLy8vIGBPYmplY3QucnVudGltZVR5cGVgLgogIGJvb2wgbGF4UnVudGltZVR5cGVUb1N0cmluZyA9IGZhbHNlOwoKICAvLy8gV2hhdCBzaG91bGQgdGhlIGNvbXBpbGVyIGRvIHdpdGggcGFyYW1ldGVyIHR5cGUgYXNzZXJ0aW9ucy4KICAvLy8KICAvLy8gVGhpcyBpcyBhbiBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9wdGlvbiBkZXJpdmVkIGZyb20gb3RoZXIgZmxhZ3MuCiAgQ2hlY2tQb2xpY3kgZGVmYXVsdFBhcmFtZXRlckNoZWNrUG9saWN5OwoKICAvLy8gV2hhdCBzaG91bGQgdGhlIGNvbXBpbGVyIGRvIHdpdGggaW1wbGljaXQgZG93bmNhc3RzLgogIC8vLwogIC8vLyBUaGlzIGlzIGFuIGludGVybmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGRlcml2ZWQgZnJvbSBvdGhlciBmbGFncy4KICBDaGVja1BvbGljeSBkZWZhdWx0SW1wbGljaXREb3duY2FzdENoZWNrUG9saWN5OwoKICAvLy8gV2hhdCB0aGUgY29tcGlsZXIgc2hvdWxkIGRvIHdpdGggYSBib29sZWFuIHZhbHVlIGluIGEgY29uZGl0aW9uIGNvbnRleHQKICAvLy8gd2hlbiB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWNhdGlvbiBzYXlzIGl0IGlzIGEgcnVudGltZSBlcnJvciBmb3IgaXQgdG8gYmUKICAvLy8gbnVsbC4KICAvLy8KICAvLy8gVGhpcyBpcyBhbiBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9wdGlvbiBkZXJpdmVkIGZyb20gb3RoZXIgZmxhZ3MuCiAgQ2hlY2tQb2xpY3kgZGVmYXVsdENvbmRpdGlvbkNoZWNrUG9saWN5OwoKICAvLy8gV2hhdCBzaG91bGQgdGhlIGNvbXBpbGVyIGRvIHdpdGggZXhwbGljaXQgY2FzdHMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYW4gaW50ZXJuYWwgY29uZmlndXJhdGlvbiBvcHRpb24gZGVyaXZlZCBmcm9tIG90aGVyIGZsYWdzLgogIENoZWNrUG9saWN5IGRlZmF1bHRFeHBsaWNpdENhc3RDaGVja1BvbGljeTsKCiAgLy8vIFdoZXRoZXIgdG8gZ2VuZXJhdGUgY29kZSBjb21wbGlhbnQgd2l0aCBjb250ZW50IHNlY3VyaXR5IHBvbGljeSAoQ1NQKS4KICBib29sIHVzZUNvbnRlbnRTZWN1cml0eVBvbGljeSA9IGZhbHNlOwoKICAvLy8gV2hlbiBvYmZ1c2NhdGluZyBmb3IgbWluaWZpY2F0aW9uLCB3aGV0aGVyIHRvIHVzZSB0aGUgZnJlcXVlbmN5IG9mIGEgbmFtZQogIC8vLyBhcyBhbiBoZXVyaXN0aWMgdG8gcGljayBzaG9ydGVyIG5hbWVzLgogIGJvb2wgdXNlRnJlcXVlbmN5TmFtZXIgPSB0cnVlOwoKICAvLy8gV2hldGhlciB0byBnZW5lcmF0ZSBzb3VyY2UtaW5mb3JtYXRpb24gZnJvbSBib3RoIHRoZSBvbGQgYW5kIHRoZSBuZXcKICAvLy8gc291cmNlLWluZm9ybWF0aW9uIGVuZ2luZXMuIChleHBlcmltZW50YWwpCiAgYm9vbCB1c2VNdWx0aVNvdXJjZUluZm8gPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gdXNlIHRoZSBuZXcgc291cmNlLWluZm9ybWF0aW9uIGltcGxlbWVudGF0aW9uIGZvciBzb3VyY2UtbWFwcy4KICAvLy8gKGV4cGVyaW1lbnRhbCkKICBib29sIHVzZU5ld1NvdXJjZUluZm8gPSBmYWxzZTsKCiAgLy8vIEVuYWJsZSB2ZXJib3NlIHByaW50aW5nIGR1cmluZyBjb21waWxhdGlvbi4gSW5jbHVkZXMgYSB0aW1lLWJyZWFrZG93bgogIC8vLyBiZXR3ZWVuIHBoYXNlcyBhdCB0aGUgZW5kLgogIGJvb2wgdmVyYm9zZSA9IGZhbHNlOwoKICAvLy8gT24gdG9wIG9mIC0tdmVyYm9zZSwgZW5hYmxlIG1vcmUgdmVyYm9zZSBwcmludGluZywgbGlrZSBwcm9ncmVzcyBtZXNzYWdlcwogIC8vLyBkdXJpbmcgZWFjaCBwaGFzZSBvZiBjb21waWxhdGlvbi4KICBib29sIHNob3dJbnRlcm5hbFByb2dyZXNzID0gZmFsc2U7CgogIC8vLyBUcmFjayBhbGxvY2F0aW9ucyBpbiB0aGUgSlMgb3V0cHV0LgogIC8vLwogIC8vLyBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLgogIGJvb2wgZXhwZXJpbWVudGFsVHJhY2tBbGxvY2F0aW9ucyA9IGZhbHNlOwoKICAvLy8gRXhwZXJpbWVudGFsIHBhcnQgZmlsZSBmdW5jdGlvbiBnZW5lcmF0aW9uLgogIGJvb2wgZXhwZXJpbWVudFN0YXJ0dXBGdW5jdGlvbnMgPSBmYWxzZTsKCiAgLy8vIEV4cGVyaW1lbnRhbCByZWxpYW5jZSBvbiBKYXZhU2NyaXB0IFRvQm9vbGVhbiBjb252ZXJzaW9ucy4KICBib29sIGV4cGVyaW1lbnRUb0Jvb2xlYW4gPSBmYWxzZTsKCiAgLy8vIEV4cGVyaW1lbnRhbCBpbnN0cnVtZW50YXRpb24gdG8gaW52ZXN0aWdhdGUgY29kZSBibG9hdC4KICAvLy8KICAvLy8gSWYgW3RydWVdLCB0aGUgY29tcGlsZXIgd2lsbCBlbWl0IGNvZGUgdGhhdCBsb2dzIHdoZW5ldmVyIGEgbWV0aG9kIGlzCiAgLy8vIGNhbGxlZC4KICBib29sIGV4cGVyaW1lbnRDYWxsSW5zdHJ1bWVudGF0aW9uID0gZmFsc2U7CgogIC8vLyBFeHBlcmltZW50YWwgdXNlIG9mIHRoZSBuZXcgKFEyIDIwMTkpIFJUSSBzeXN0ZW0uCiAgYm9vbCBleHBlcmltZW50TmV3UnRpID0gZmFsc2U7CgogIC8vLyBUaGUgcGF0aCB0byB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBwcm9maWxlZCBhbGxvY2F0aW9ucy4KICAvLy8KICAvLy8gVGhlIGZpbGUgbXVzdCBjb250YWluIHRoZSBNYXAgdGhhdCB3YXMgcHJvZHVjZWQgYnkgdXNpbmcKICAvLy8gW2V4cGVyaW1lbnRhbFRyYWNrQWxsb2NhdGlvbnNdIGVuY29kZWQgYXMgYSBKU09OIG1hcC4KICAvLy8KICAvLy8gVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4KICBTdHJpbmcgZXhwZXJpbWVudGFsQWxsb2NhdGlvbnNQYXRoOwoKICAvLy8gSWYgc3BlY2lmaWVkLCBhIGJ1bmRsZSBvZiBvcHRpbWl6YXRpb25zIHRvIGVuYWJsZSAob3IgZGlzYWJsZSkuCiAgaW50IG9wdGltaXphdGlvbkxldmVsID0gbnVsbDsKCiAgLy8vIFRoZSBzaGFyZCB0byBzZXJpYWxpemUgd2hlbiB1c2luZyBbd3JpdGVDb2RlZ2VuVXJpXS4KICBpbnQgY29kZWdlblNoYXJkOwoKICAvLy8gVGhlIG51bWJlciBvZiBzaGFyZHMgdG8gc2VyaWFsaXplIHdoZW4gdXNpbmcgW3dyaXRlQ29kZWdlblVyaV0gb3IgdG8KICAvLy8gZGVzZXJpYWxpemUgd2hlbiB1c2luZyBbcmVhZENvZGVnZW5VcmldLgogIGludCBjb2RlZ2VuU2hhcmRzOwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gT3B0aW9ucyBmb3IgZGVwcmVjYXRlZCBmZWF0dXJlcwogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8vIENyZWF0ZSBhbiBvcHRpb25zIG9iamVjdCBieSBwYXJzaW5nIGZsYWdzIGZyb20gW29wdGlvbnNdLgogIHN0YXRpYyBDb21waWxlck9wdGlvbnMgcGFyc2UoTGlzdDxTdHJpbmc+IG9wdGlvbnMsCiAgICAgIHtVcmkgbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSwgVXJpIHBsYXRmb3JtQmluYXJpZXN9KSB7CiAgICBNYXA8ZmUuRXhwZXJpbWVudGFsRmxhZywgYm9vbD4gbGFuZ3VhZ2VFeHBlcmltZW50cyA9CiAgICAgICAgX2V4dHJhY3RFeHBlcmltZW50cyhvcHRpb25zKTsKICAgIGlmIChlcXVhbE1hcHMobGFuZ3VhZ2VFeHBlcmltZW50cywgZmUuZGVmYXVsdEV4cGVyaW1lbnRhbEZsYWdzKSkgewogICAgICBwbGF0Zm9ybUJpbmFyaWVzID8/PSBmZS5jb21wdXRlUGxhdGZvcm1CaW5hcmllc0xvY2F0aW9uKCk7CiAgICB9CiAgICByZXR1cm4gbmV3IENvbXBpbGVyT3B0aW9ucygpCiAgICAgIC4ubGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSA9IGxpYnJhcmllc1NwZWNpZmljYXRpb25VcmkKICAgICAgLi5hbGxvd01vY2tDb21waWxhdGlvbiA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuYWxsb3dNb2NrQ29tcGlsYXRpb24pCiAgICAgIC4uYmVuY2htYXJraW5nUHJvZHVjdGlvbiA9CiAgICAgICAgICBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLmJlbmNobWFya2luZ1Byb2R1Y3Rpb24pCiAgICAgIC4uYmVuY2htYXJraW5nRXhwZXJpbWVudCA9CiAgICAgICAgICBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLmJlbmNobWFya2luZ0V4cGVyaW1lbnQpCiAgICAgIC4uYnVpbGRJZCA9CiAgICAgICAgICBfZXh0cmFjdFN0cmluZ09wdGlvbihvcHRpb25zLCAnLS1idWlsZC1pZD0nLCBfVU5ERVRFUk1JTkVEX0JVSUxEX0lEKQogICAgICAuLmNvbXBpbGVGb3JTZXJ2ZXIgPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLnNlcnZlck1vZGUpCiAgICAgIC4uZGVmZXJyZWRNYXBVcmkgPSBfZXh0cmFjdFVyaU9wdGlvbihvcHRpb25zLCAnLS1kZWZlcnJlZC1tYXA9JykKICAgICAgLi5uZXdEZWZlcnJlZFNwbGl0ID0gX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5uZXdEZWZlcnJlZFNwbGl0KQogICAgICAuLnJlcG9ydEludmFsaWRJbmZlcnJlZERlZmVycmVkVHlwZXMgPQogICAgICAgICAgX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5yZXBvcnRJbnZhbGlkSW5mZXJyZWREZWZlcnJlZFR5cGVzKQogICAgICAuLmZhdGFsV2FybmluZ3MgPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLmZhdGFsV2FybmluZ3MpCiAgICAgIC4udGVyc2VEaWFnbm9zdGljcyA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MudGVyc2UpCiAgICAgIC4uc3VwcHJlc3NXYXJuaW5ncyA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3Muc3VwcHJlc3NXYXJuaW5ncykKICAgICAgLi5zdXBwcmVzc0hpbnRzID0gX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5zdXBwcmVzc0hpbnRzKQogICAgICAuLnNob3duUGFja2FnZVdhcm5pbmdzID0KICAgICAgICAgIF9leHRyYWN0T3B0aW9uYWxDc3ZPcHRpb24ob3B0aW9ucywgRmxhZ3Muc2hvd1BhY2thZ2VXYXJuaW5ncykKICAgICAgLi5sYW5ndWFnZUV4cGVyaW1lbnRzID0gbGFuZ3VhZ2VFeHBlcmltZW50cwogICAgICAuLmRpc2FibGVJbmxpbmluZyA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuZGlzYWJsZUlubGluaW5nKQogICAgICAuLmRpc2FibGVQcm9ncmFtU3BsaXQgPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLmRpc2FibGVQcm9ncmFtU3BsaXQpCiAgICAgIC4uZGlzYWJsZVR5cGVJbmZlcmVuY2UgPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLmRpc2FibGVUeXBlSW5mZXJlbmNlKQogICAgICAuLnVzZVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluID0KICAgICAgICAgIF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MudXNlVHJpdmlhbEFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgIC4uZGlzYWJsZVJ0aU9wdGltaXphdGlvbiA9CiAgICAgICAgICBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLmRpc2FibGVSdGlPcHRpbWl6YXRpb24pCiAgICAgIC4uZHVtcEluZm8gPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLmR1bXBJbmZvKQogICAgICAuLnVzZUR1bXBJbmZvQmluYXJ5Rm9ybWF0ID0KICAgICAgICAgIF9oYXNPcHRpb24ob3B0aW9ucywgIiR7RmxhZ3MuZHVtcEluZm99PWJpbmFyeSIpCiAgICAgIC4uZW5hYmxlTWluaWZpY2F0aW9uID0gX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5taW5pZnkpCiAgICAgIC4uX2Rpc2FibGVNaW5pZmljYXRpb24gPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLm5vTWluaWZ5KQogICAgICAuLmVuYWJsZU5hdGl2ZUxpdmVUeXBlQW5hbHlzaXMgPQogICAgICAgICAgIV9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuZGlzYWJsZU5hdGl2ZUxpdmVUeXBlQW5hbHlzaXMpCiAgICAgIC4uZW5hYmxlVXNlckFzc2VydGlvbnMgPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLmVuYWJsZUNoZWNrZWRNb2RlKSB8fAogICAgICAgICAgX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5lbmFibGVBc3NlcnRzKQogICAgICAuLmV4cGVyaW1lbnRhbFRyYWNrQWxsb2NhdGlvbnMgPQogICAgICAgICAgX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5leHBlcmltZW50YWxUcmFja0FsbG9jYXRpb25zKQogICAgICAuLmV4cGVyaW1lbnRhbEFsbG9jYXRpb25zUGF0aCA9IF9leHRyYWN0U3RyaW5nT3B0aW9uKAogICAgICAgICAgb3B0aW9ucywgIiR7RmxhZ3MuZXhwZXJpbWVudGFsQWxsb2NhdGlvbnNQYXRofT0iLCBudWxsKQogICAgICAuLmV4cGVyaW1lbnRTdGFydHVwRnVuY3Rpb25zID0KICAgICAgICAgIF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuZXhwZXJpbWVudFN0YXJ0dXBGdW5jdGlvbnMpCiAgICAgIC4uZXhwZXJpbWVudFRvQm9vbGVhbiA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuZXhwZXJpbWVudFRvQm9vbGVhbikKICAgICAgLi5leHBlcmltZW50Q2FsbEluc3RydW1lbnRhdGlvbiA9CiAgICAgICAgICBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLmV4cGVyaW1lbnRDYWxsSW5zdHJ1bWVudGF0aW9uKQogICAgICAuLmV4cGVyaW1lbnROZXdSdGkgPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLmV4cGVyaW1lbnROZXdSdGkpCiAgICAgIC4uZ2VuZXJhdGVTb3VyY2VNYXAgPSAhX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5ub1NvdXJjZU1hcHMpCiAgICAgIC4ub3V0cHV0VXJpID0gX2V4dHJhY3RVcmlPcHRpb24ob3B0aW9ucywgJy0tb3V0PScpCiAgICAgIC4ucGxhdGZvcm1CaW5hcmllcyA9CiAgICAgICAgICBwbGF0Zm9ybUJpbmFyaWVzID8/IF9leHRyYWN0VXJpT3B0aW9uKG9wdGlvbnMsICctLXBsYXRmb3JtLWJpbmFyaWVzPScpCiAgICAgIC4uc291cmNlTWFwVXJpID0gX2V4dHJhY3RVcmlPcHRpb24ob3B0aW9ucywgJy0tc291cmNlLW1hcD0nKQogICAgICAuLm9taXRJbXBsaWNpdENoZWNrcyA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3Mub21pdEltcGxpY2l0Q2hlY2tzKQogICAgICAuLm9taXRBc0Nhc3RzID0gX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy5vbWl0QXNDYXN0cykKICAgICAgLi5sYXhSdW50aW1lVHlwZVRvU3RyaW5nID0KICAgICAgICAgIF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MubGF4UnVudGltZVR5cGVUb1N0cmluZykKICAgICAgLi50ZXN0TW9kZSA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MudGVzdE1vZGUpCiAgICAgIC4udHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnMgPQogICAgICAgICAgX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy50cnVzdEpTSW50ZXJvcFR5cGVBbm5vdGF0aW9ucykKICAgICAgLi50cnVzdFByaW1pdGl2ZXMgPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLnRydXN0UHJpbWl0aXZlcykKICAgICAgLi51c2VDb250ZW50U2VjdXJpdHlQb2xpY3kgPQogICAgICAgICAgX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy51c2VDb250ZW50U2VjdXJpdHlQb2xpY3kpCiAgICAgIC4udXNlRnJlcXVlbmN5TmFtZXIgPQogICAgICAgICAgIV9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3Mubm9GcmVxdWVuY3lCYXNlZE1pbmlmaWNhdGlvbikKICAgICAgLi51c2VNdWx0aVNvdXJjZUluZm8gPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLnVzZU11bHRpU291cmNlSW5mbykKICAgICAgLi51c2VOZXdTb3VyY2VJbmZvID0gX2hhc09wdGlvbihvcHRpb25zLCBGbGFncy51c2VOZXdTb3VyY2VJbmZvKQogICAgICAuLnZlcmJvc2UgPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLnZlcmJvc2UpCiAgICAgIC4uc2hvd0ludGVybmFsUHJvZ3Jlc3MgPSBfaGFzT3B0aW9uKG9wdGlvbnMsIEZsYWdzLnByb2dyZXNzKQogICAgICAuLmRpbGxEZXBlbmRlbmNpZXMgPQogICAgICAgICAgX2V4dHJhY3RVcmlMaXN0T3B0aW9uKG9wdGlvbnMsICcke0ZsYWdzLmRpbGxEZXBlbmRlbmNpZXN9JykKICAgICAgLi5yZWFkRGF0YVVyaSA9IF9leHRyYWN0VXJpT3B0aW9uKG9wdGlvbnMsICcke0ZsYWdzLnJlYWREYXRhfT0nKQogICAgICAuLndyaXRlRGF0YVVyaSA9IF9leHRyYWN0VXJpT3B0aW9uKG9wdGlvbnMsICcke0ZsYWdzLndyaXRlRGF0YX09JykKICAgICAgLi5yZWFkQ29kZWdlblVyaSA9IF9leHRyYWN0VXJpT3B0aW9uKG9wdGlvbnMsICcke0ZsYWdzLnJlYWRDb2RlZ2VufT0nKQogICAgICAuLndyaXRlQ29kZWdlblVyaSA9IF9leHRyYWN0VXJpT3B0aW9uKG9wdGlvbnMsICcke0ZsYWdzLndyaXRlQ29kZWdlbn09JykKICAgICAgLi5jb2RlZ2VuU2hhcmQgPSBfZXh0cmFjdEludE9wdGlvbihvcHRpb25zLCAnJHtGbGFncy5jb2RlZ2VuU2hhcmR9PScpCiAgICAgIC4uY29kZWdlblNoYXJkcyA9IF9leHRyYWN0SW50T3B0aW9uKG9wdGlvbnMsICcke0ZsYWdzLmNvZGVnZW5TaGFyZHN9PScpCiAgICAgIC4uY2ZlT25seSA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuY2ZlT25seSkKICAgICAgLi5kZWJ1Z0dsb2JhbEluZmVyZW5jZSA9IF9oYXNPcHRpb24ob3B0aW9ucywgRmxhZ3MuZGVidWdHbG9iYWxJbmZlcmVuY2UpOwogIH0KCiAgdm9pZCB2YWxpZGF0ZSgpIHsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IHNob3VsZCBlbnRyeXBvaW50IGJlIGhlcmU/IHNob3VsZCB3ZSB2YWxpZGF0ZSBpdCBpcyBub3QKICAgIC8vIG51bGw/IEluIHVuaXR0ZXN0cyB3ZSB1c2UgdGhlIHNhbWUgY29tcGlsZXIgdG8gYW5hbHl6ZSBvciBidWlsZCBtdWx0aXBsZQogICAgLy8gZW50cnlwb2ludHMuCiAgICBpZiAobGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJbbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaV0gaXMgbnVsbC4iKTsKICAgIH0KICAgIGlmIChsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpLnBhdGguZW5kc1dpdGgoJy8nKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICJbbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaV0gc2hvdWxkIGJlIGEgZmlsZTogJGxpYnJhcmllc1NwZWNpZmljYXRpb25VcmkiKTsKICAgIH0KICAgIGlmIChwYWNrYWdlUm9vdCAhPSBudWxsICYmIHBhY2thZ2VDb25maWcgIT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiT25seSBvbmUgb2YgW3BhY2thZ2VSb290XSBvciBbcGFja2FnZUNvbmZpZ10gIgogICAgICAgICAgIm1heSBiZSBnaXZlbi4iKTsKICAgIH0KICAgIGlmIChwYWNrYWdlUm9vdCAhPSBudWxsICYmICFwYWNrYWdlUm9vdC5wYXRoLmVuZHNXaXRoKCIvIikpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIltwYWNrYWdlUm9vdF0gbXVzdCBlbmQgd2l0aCBhIC8iKTsKICAgIH0KICAgIGlmIChwbGF0Zm9ybUJpbmFyaWVzID09IG51bGwgJiYKICAgICAgICBlcXVhbE1hcHMobGFuZ3VhZ2VFeHBlcmltZW50cywgZmUuZGVmYXVsdEV4cGVyaW1lbnRhbEZsYWdzKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiTWlzc2luZyByZXF1aXJlZCAke0ZsYWdzLnBsYXRmb3JtQmluYXJpZXN9Iik7CiAgICB9CiAgfQoKICB2b2lkIGRlcml2ZU9wdGlvbnMoKSB7CiAgICBpZiAoYmVuY2htYXJraW5nUHJvZHVjdGlvbikgewogICAgICB0cnVzdFByaW1pdGl2ZXMgPSB0cnVlOwogICAgICBvbWl0SW1wbGljaXRDaGVja3MgPSB0cnVlOwogICAgfQoKICAgIGlmIChiZW5jaG1hcmtpbmdFeHBlcmltZW50KSB7CiAgICAgIC8vIFRPRE8oc3JhKTogU2V0IGZsYWdzIGltcGxpZWQgYnkgJy0tYmVuY2htYXJraW5nLXgnLiBJbml0aWFsbHkgdGhpcyB3aWxsCiAgICAgIC8vIGJlIC0tZXhwZXJpbWVudC1uZXctcnRpLCBhbmQgbGF0ZXIgTk5CRC4KICAgICAgZXhwZXJpbWVudE5ld1J0aSA9IHRydWU7CiAgICB9CgogICAgaWYgKG9wdGltaXphdGlvbkxldmVsICE9IG51bGwpIHsKICAgICAgaWYgKG9wdGltaXphdGlvbkxldmVsID09IDApIHsKICAgICAgICBkaXNhYmxlSW5saW5pbmcgPSB0cnVlOwogICAgICAgIGRpc2FibGVUeXBlSW5mZXJlbmNlID0gdHJ1ZTsKICAgICAgICBkaXNhYmxlUnRpT3B0aW1pemF0aW9uID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAob3B0aW1pemF0aW9uTGV2ZWwgPj0gMikgewogICAgICAgIGVuYWJsZU1pbmlmaWNhdGlvbiA9IHRydWU7CiAgICAgICAgbGF4UnVudGltZVR5cGVUb1N0cmluZyA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKG9wdGltaXphdGlvbkxldmVsID49IDMpIHsKICAgICAgICBvbWl0SW1wbGljaXRDaGVja3MgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChvcHRpbWl6YXRpb25MZXZlbCA9PSA0KSB7CiAgICAgICAgdHJ1c3RQcmltaXRpdmVzID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIC8vIFN0cm9uZyBtb2RlIGFsd2F5cyB0cnVzdHMgdHlwZSBhbm5vdGF0aW9ucyAoaW5mZXJyZWQgb3IgZXhwbGljaXQpLCBzbwogICAgLy8gYXNzaWdubWVudHMgY2hlY2tzIHNob3VsZCBiZSB0cnVzdGVkLgogICAgaWYgKG9taXRJbXBsaWNpdENoZWNrcykgewogICAgICBkZWZhdWx0UGFyYW1ldGVyQ2hlY2tQb2xpY3kgPSBDaGVja1BvbGljeS50cnVzdGVkOwogICAgICBkZWZhdWx0SW1wbGljaXREb3duY2FzdENoZWNrUG9saWN5ID0gQ2hlY2tQb2xpY3kudHJ1c3RlZDsKICAgICAgZGVmYXVsdENvbmRpdGlvbkNoZWNrUG9saWN5ID0gQ2hlY2tQb2xpY3kudHJ1c3RlZDsKICAgIH0gZWxzZSB7CiAgICAgIGRlZmF1bHRQYXJhbWV0ZXJDaGVja1BvbGljeSA9IENoZWNrUG9saWN5LmNoZWNrZWQ7CiAgICAgIGRlZmF1bHRJbXBsaWNpdERvd25jYXN0Q2hlY2tQb2xpY3kgPSBDaGVja1BvbGljeS5jaGVja2VkOwogICAgICBkZWZhdWx0Q29uZGl0aW9uQ2hlY2tQb2xpY3kgPSBDaGVja1BvbGljeS5jaGVja2VkOwogICAgfQogICAgaWYgKG9taXRBc0Nhc3RzKSB7CiAgICAgIGRlZmF1bHRFeHBsaWNpdENhc3RDaGVja1BvbGljeSA9IENoZWNrUG9saWN5LnRydXN0ZWQ7CiAgICB9IGVsc2UgewogICAgICBkZWZhdWx0RXhwbGljaXRDYXN0Q2hlY2tQb2xpY3kgPSBDaGVja1BvbGljeS5jaGVja2VkOwogICAgfQoKICAgIGlmIChfZGlzYWJsZU1pbmlmaWNhdGlvbikgewogICAgICBlbmFibGVNaW5pZmljYXRpb24gPSBmYWxzZTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB3YXJuaW5ncyBhbmQgaGludHMgYXJlIHNob3duIGZvciBhbGwgcGFja2FnZXMuCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgc2hvd0FsbFBhY2thZ2VXYXJuaW5ncyB7CiAgICByZXR1cm4gc2hvd25QYWNrYWdlV2FybmluZ3MgIT0gbnVsbCAmJiBzaG93blBhY2thZ2VXYXJuaW5ncy5pc0VtcHR5OwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHdhcm5pbmdzIGFuZCBoaW50cyBhcmUgaGlkZGVuIGZvciBhbGwgcGFja2FnZXMuCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaGlkZVBhY2thZ2VXYXJuaW5ncyA9PiBzaG93blBhY2thZ2VXYXJuaW5ncyA9PSBudWxsOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgd2FybmluZ3Mgc2hvdWxkIGJlIHNob3VsZCBmb3IgW3VyaV0uCiAgQG92ZXJyaWRlCiAgYm9vbCBzaG93UGFja2FnZVdhcm5pbmdzRm9yKFVyaSB1cmkpIHsKICAgIGlmIChzaG93QWxsUGFja2FnZVdhcm5pbmdzKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKHNob3duUGFja2FnZVdhcm5pbmdzICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHVyaS5zY2hlbWUgPT0gJ3BhY2thZ2UnICYmCiAgICAgICAgICBzaG93blBhY2thZ2VXYXJuaW5ncy5jb250YWlucyh1cmkucGF0aFNlZ21lbnRzLmZpcnN0KTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9Cn0KCi8vLyBQb2xpY3kgZm9yIHdoYXQgdG8gZG8gd2l0aCBhIHR5cGUgYXNzZXJ0aW9uIGNoZWNrLgovLy8KLy8vIFRoaXMgZW51bS1saWtlIGNsYXNzIGlzIHVzZWQgdG8gY29uZmlndXJlIGhvdyB0aGUgY29tcGlsZXIgdHJlYXRzIHR5cGUKLy8vIGFzc2VydGlvbnMgZHVyaW5nIGdsb2JhbCB0eXBlIGluZmVyZW5jZSBhbmQgY29kZWdlbi4KY2xhc3MgQ2hlY2tQb2xpY3kgewogIC8vLyBXaGV0aGVyIHRoZSB0eXBlIGFzc2VydGlvbiBzaG91bGQgYmUgdHJ1c3RlZC4KICBmaW5hbCBib29sIGlzVHJ1c3RlZDsKCiAgLy8vIFdoZXRoZXIgdGhlIHR5cGUgYXNzZXJ0aW9uIHNob3VsZCBiZSBlbWl0dGVkIGFuZCBjaGVja2VkLgogIGZpbmFsIGJvb2wgaXNFbWl0dGVkOwoKICBjb25zdCBDaGVja1BvbGljeSh7dGhpcy5pc1RydXN0ZWQ6IGZhbHNlLCB0aGlzLmlzRW1pdHRlZDogZmFsc2V9KTsKCiAgc3RhdGljIGNvbnN0IHRydXN0ZWQgPSBjb25zdCBDaGVja1BvbGljeShpc1RydXN0ZWQ6IHRydWUpOwogIHN0YXRpYyBjb25zdCBjaGVja2VkID0gY29uc3QgQ2hlY2tQb2xpY3koaXNFbWl0dGVkOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0NoZWNrUG9saWN5KGlzVHJ1c3RlZD0kaXNUcnVzdGVkLCcKICAgICAgJ2lzRW1pdHRlZD0kaXNFbWl0dGVkKSc7Cn0KClN0cmluZyBfZXh0cmFjdFN0cmluZ09wdGlvbigKICAgIExpc3Q8U3RyaW5nPiBvcHRpb25zLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CiAgZm9yIChTdHJpbmcgb3B0aW9uIGluIG9wdGlvbnMpIHsKICAgIGlmIChvcHRpb24uc3RhcnRzV2l0aChwcmVmaXgpKSB7CiAgICAgIHJldHVybiBvcHRpb24uc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpOwogICAgfQogIH0KICByZXR1cm4gZGVmYXVsdFZhbHVlOwp9CgpVcmkgX2V4dHJhY3RVcmlPcHRpb24oTGlzdDxTdHJpbmc+IG9wdGlvbnMsIFN0cmluZyBwcmVmaXgpIHsKICBTdHJpbmcgb3B0aW9uID0gX2V4dHJhY3RTdHJpbmdPcHRpb24ob3B0aW9ucywgcHJlZml4LCBudWxsKTsKICByZXR1cm4gKG9wdGlvbiA9PSBudWxsKSA/IG51bGwgOiBVcmkucGFyc2Uob3B0aW9uKTsKfQoKaW50IF9leHRyYWN0SW50T3B0aW9uKExpc3Q8U3RyaW5nPiBvcHRpb25zLCBTdHJpbmcgcHJlZml4KSB7CiAgU3RyaW5nIG9wdGlvbiA9IF9leHRyYWN0U3RyaW5nT3B0aW9uKG9wdGlvbnMsIHByZWZpeCwgbnVsbCk7CiAgcmV0dXJuIChvcHRpb24gPT0gbnVsbCkgPyBudWxsIDogaW50LnBhcnNlKG9wdGlvbik7Cn0KCmJvb2wgX2hhc09wdGlvbihMaXN0PFN0cmluZz4gb3B0aW9ucywgU3RyaW5nIG9wdGlvbikgewogIHJldHVybiBvcHRpb25zLmluZGV4T2Yob3B0aW9uKSA+PSAwOwp9CgovLy8gRXh0cmFjdCBsaXN0IG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgcHJvdmlkZWQgZm9yIFtmbGFnXS4gUmV0dXJucyBhbgovLy8gZW1wdHkgbGlzdCBpZiBbb3B0aW9uXSBjb250YWluIFtmbGFnXSB3aXRob3V0IGFyZ3VtZW50cy4gUmV0dXJucyBgbnVsbGAgaWYKLy8vIFtvcHRpb25dIGRvZXNuJ3QgY29udGFpbiBbZmxhZ10gd2l0aCBvciB3aXRob3V0IGFyZ3VtZW50cy4KTGlzdDxTdHJpbmc+IF9leHRyYWN0T3B0aW9uYWxDc3ZPcHRpb24oTGlzdDxTdHJpbmc+IG9wdGlvbnMsIFN0cmluZyBmbGFnKSB7CiAgU3RyaW5nIHByZWZpeCA9ICckZmxhZz0nOwogIGZvciAoU3RyaW5nIG9wdGlvbiBpbiBvcHRpb25zKSB7CiAgICBpZiAob3B0aW9uID09IGZsYWcpIHsKICAgICAgcmV0dXJuIGNvbnN0IDxTdHJpbmc+W107CiAgICB9CiAgICBpZiAob3B0aW9uLnN0YXJ0c1dpdGgoZmxhZykpIHsKICAgICAgcmV0dXJuIG9wdGlvbi5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkuc3BsaXQoJywnKTsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KCi8vLyBFeHRyYWN0IGxpc3Qgb2YgY29tbWEgc2VwYXJhdGVkIFVyaXMgcHJvdmlkZWQgZm9yIFtmbGFnXS4gUmV0dXJucyBhbgovLy8gZW1wdHkgbGlzdCBpZiBbb3B0aW9uXSBjb250YWluIFtmbGFnXSB3aXRob3V0IGFyZ3VtZW50cy4gUmV0dXJucyBgbnVsbGAgaWYKLy8vIFtvcHRpb25dIGRvZXNuJ3QgY29udGFpbiBbZmxhZ10gd2l0aCBvciB3aXRob3V0IGFyZ3VtZW50cy4KTGlzdDxVcmk+IF9leHRyYWN0VXJpTGlzdE9wdGlvbihMaXN0PFN0cmluZz4gb3B0aW9ucywgU3RyaW5nIGZsYWcpIHsKICBMaXN0PFN0cmluZz4gc3RyaW5nVXJpcyA9IF9leHRyYWN0T3B0aW9uYWxDc3ZPcHRpb24ob3B0aW9ucywgZmxhZyk7CiAgaWYgKHN0cmluZ1VyaXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgcmV0dXJuIHN0cmluZ1VyaXMubWFwKFVyaS5wYXJzZSkudG9MaXN0KCk7Cn0KCk1hcDxmZS5FeHBlcmltZW50YWxGbGFnLCBib29sPiBfZXh0cmFjdEV4cGVyaW1lbnRzKExpc3Q8U3RyaW5nPiBvcHRpb25zKSB7CiAgTGlzdDxTdHJpbmc+IGV4cGVyaW1lbnRzID0KICAgICAgX2V4dHJhY3RPcHRpb25hbENzdk9wdGlvbihvcHRpb25zLCBGbGFncy5lbmFibGVMYW5ndWFnZUV4cGVyaW1lbnRzKTsKICByZXR1cm4gZmUucGFyc2VFeHBlcmltZW50YWxGbGFncygKICAgICAgZXhwZXJpbWVudHMsIChTdHJpbmcgZXJyb3IpID0+IHRocm93IG5ldyBBcmd1bWVudEVycm9yKGVycm9yKSk7Cn0KCmNvbnN0IFN0cmluZyBfVU5ERVRFUk1JTkVEX0JVSUxEX0lEID0gImJ1aWxkIG51bWJlciBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCI7CoJrAE5OPAEdAUABLhkBNiMdATkaAS8dASwdASkaAUcjAUggAT0oAgFQThg1QRIBHQY3EwEyBjUVASQGSyIGTw8GUVEZHgE9Bk4gEwE2BkIUATAGRBYBNAZDFwFIExgBTA8GTk5RGSUBUQ0+ASs7ATIeQwE7PgFMKyUBRicBRicBKSsBTzE8AVBBIQFKIBYBSlFJMgZQShYhAVFNTUxMBlAzAUQ2IAFQTCYkAUwMHgFCDCEBPwwhATwMHgFLSTIuATAlATguAUknAU9LShkBTyMoAUs4Bk1AIwElJSMBSFAuJQFRUCwBRiUBTiEBLhEBNCEBNRgBSRQBLhkBPi4BSyABMyMBKxwBSRwnAUIGSSsBOwZJMgFOTgwGSSsBNwZJLgFNKQFQLSEBSzEjAVAVIQFMIRgBUCglASoGJy0BMisBQSQBPgZMDi4BOCEBQwY/PAYnJgFGIAE7FAFLLxUBNyU3AUA1PzkmR0EGIT5PITwhPBJPQUdHLUhBPEdBH0gyRU1PKEMhPDciOj9DJ0RPMydCPEIlQE0oQ0dFORtRQ0s9ITw3KENFIz4cQ0tHNUMbRkdJTU9MTjVQBAEUTlAULUcGOB9XBjhOHAZCQgYkR00GBAEZIh4hBgEiUTIfBgElJCAlJwgkIycIJCMIJCAIBgFNLR45QDkNOUA5Bhc8DTwGASAiBgQBRwwkSQQBSAxAAT0MKSITBigoQQYSBAIBNwRLORQ0GAFAGAFFAT09AQw7HwIBHUAjJS4GBBcCAT0/NgIBPT82AgE3JwIBS08/TBwjGh8GIzkGBA8CAUlPP0VGJy0CAUsdSyRGAgFOASFwYWNrYWdlOmNvbXBpbGVyL3NyYy9vcHRpb25zLmRhcnQ3c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc291cmNlX2ZpbGVfcHJvdmlkZXIuZGFydMAASG0vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBzb3VyY2VfZmlsZV9wcm92aWRlcjsKCmltcG9ydCAnZGFydDphc3luYyc7CmltcG9ydCAnZGFydDppbyc7CmltcG9ydCAnZGFydDptYXRoJyBhcyBtYXRoOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JyBhcyBmZTsKCmltcG9ydCAnLi4vY29tcGlsZXIuZGFydCcgYXMgYXBpIHNob3cgRGlhZ25vc3RpYzsKaW1wb3J0ICcuLi9jb21waWxlcl9uZXcuZGFydCcgYXMgYXBpOwppbXBvcnQgJy4uL2NvbXBpbGVyX25ldy5kYXJ0JzsKaW1wb3J0ICdjb2xvcnMuZGFydCcgYXMgY29sb3JzOwppbXBvcnQgJ2RhcnQyanMuZGFydCcgc2hvdyBBYm9ydExlZzsKaW1wb3J0ICdmaWxlbmFtZXMuZGFydCc7CmltcG9ydCAnaW8vc291cmNlX2ZpbGUuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBTb3VyY2VGaWxlUHJvdmlkZXIgaW1wbGVtZW50cyBDb21waWxlcklucHV0IHsKICBib29sIGlzV2luZG93cyA9IChQbGF0Zm9ybS5vcGVyYXRpbmdTeXN0ZW0gPT0gJ3dpbmRvd3MnKTsKICBVcmkgY3dkID0gY3VycmVudERpcmVjdG9yeTsKICBNYXA8VXJpLCBhcGkuSW5wdXQ+IHV0ZjhTb3VyY2VGaWxlcyA9IDxVcmksIGFwaS5JbnB1dD57fTsKICBNYXA8VXJpLCBhcGkuSW5wdXQ+IGJpbmFyeVNvdXJjZUZpbGVzID0gPFVyaSwgYXBpLklucHV0Pnt9OwogIGludCBkYXJ0Q2hhcmFjdGVyc1JlYWQgPSAwOwoKICBGdXR1cmU8YXBpLklucHV0PExpc3Q8aW50Pj4+IHJlYWRCeXRlc0Zyb21VcmkoCiAgICAgIFVyaSByZXNvdXJjZVVyaSwgYXBpLklucHV0S2luZCBpbnB1dEtpbmQpIHsKICAgIGlmICghcmVzb3VyY2VVcmkuaXNBYnNvbHV0ZSkgewogICAgICByZXNvdXJjZVVyaSA9IGN3ZC5yZXNvbHZlVXJpKHJlc291cmNlVXJpKTsKICAgIH0KICAgIGFwaS5JbnB1dDxMaXN0PGludD4+IGlucHV0OwogICAgc3dpdGNoIChpbnB1dEtpbmQpIHsKICAgICAgY2FzZSBhcGkuSW5wdXRLaW5kLlVURjg6CiAgICAgICAgaW5wdXQgPSB1dGY4U291cmNlRmlsZXNbcmVzb3VyY2VVcmldOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIGFwaS5JbnB1dEtpbmQuYmluYXJ5OgogICAgICAgIGlucHV0ID0gYmluYXJ5U291cmNlRmlsZXNbcmVzb3VyY2VVcmldOwogICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGlucHV0ICE9IG51bGwpIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKGlucHV0KTsKCiAgICBpZiAocmVzb3VyY2VVcmkuc2NoZW1lID09ICdmaWxlJykgewogICAgICByZXR1cm4gX3JlYWRGcm9tRmlsZShyZXNvdXJjZVVyaSwgaW5wdXRLaW5kKTsKICAgIH0gZWxzZSBpZiAocmVzb3VyY2VVcmkuc2NoZW1lID09ICdodHRwJyB8fCByZXNvdXJjZVVyaS5zY2hlbWUgPT0gJ2h0dHBzJykgewogICAgICByZXR1cm4gX3JlYWRGcm9tSHR0cChyZXNvdXJjZVVyaSwgaW5wdXRLaW5kKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJVbmtub3duIHNjaGVtZSBpbiB1cmkgJyRyZXNvdXJjZVVyaSciKTsKICAgIH0KICB9CgogIGFwaS5JbnB1dCBfcmVhZEZyb21GaWxlU3luYyhVcmkgcmVzb3VyY2VVcmksIGFwaS5JbnB1dEtpbmQgaW5wdXRLaW5kKSB7CiAgICBhc3NlcnQocmVzb3VyY2VVcmkuc2NoZW1lID09ICdmaWxlJyk7CiAgICBMaXN0PGludD4gc291cmNlOwogICAgdHJ5IHsKICAgICAgc291cmNlID0gcmVhZEFsbChyZXNvdXJjZVVyaS50b0ZpbGVQYXRoKCksCiAgICAgICAgICB6ZXJvVGVybWluYXRlZDogaW5wdXRLaW5kID09IGFwaS5JbnB1dEtpbmQuVVRGOCk7CiAgICB9IG9uIEZpbGVTeXN0ZW1FeGNlcHRpb24gY2F0Y2ggKGV4KSB7CiAgICAgIFN0cmluZyBtZXNzYWdlID0gZXgub3NFcnJvcj8ubWVzc2FnZTsKICAgICAgU3RyaW5nIGRldGFpbCA9IG1lc3NhZ2UgIT0gbnVsbCA/ICcgKCRtZXNzYWdlKScgOiAnJzsKICAgICAgdGhyb3cgIkVycm9yIHJlYWRpbmcgJyR7cmVsYXRpdml6ZVVyaShyZXNvdXJjZVVyaSl9JyAkZGV0YWlsIjsKICAgIH0KICAgIGRhcnRDaGFyYWN0ZXJzUmVhZCArPSBzb3VyY2UubGVuZ3RoOwogICAgYXBpLklucHV0IGlucHV0OwogICAgc3dpdGNoIChpbnB1dEtpbmQpIHsKICAgICAgY2FzZSBhcGkuSW5wdXRLaW5kLlVURjg6CiAgICAgICAgaW5wdXQgPSB1dGY4U291cmNlRmlsZXNbcmVzb3VyY2VVcmldID0gbmV3IENhY2hpbmdVdGY4Qnl0ZXNTb3VyY2VGaWxlKAogICAgICAgICAgICByZXNvdXJjZVVyaSwgcmVsYXRpdml6ZVVyaShyZXNvdXJjZVVyaSksIHNvdXJjZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgYXBpLklucHV0S2luZC5iaW5hcnk6CiAgICAgICAgaW5wdXQgPQogICAgICAgICAgICBiaW5hcnlTb3VyY2VGaWxlc1tyZXNvdXJjZVVyaV0gPSBuZXcgQmluYXJ5KHJlc291cmNlVXJpLCBzb3VyY2UpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIGlucHV0OwogIH0KCiAgLy8vIFJlYWQgW3Jlc291cmNlVXJpXSBkaXJlY3RseSBhcyBhIFVURi04IGZpbGUuIElmIHJlYWRpbmcgZmFpbHMsIGBudWxsYCBpcwogIC8vLyByZXR1cm5lZC4KICBhcGkuSW5wdXQgYXV0b1JlYWRGcm9tRmlsZShVcmkgcmVzb3VyY2VVcmkpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiBfcmVhZEZyb21GaWxlU3luYyhyZXNvdXJjZVVyaSwgSW5wdXRLaW5kLlVURjgpOwogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBTaWxlbmNlIHRoZSBlcnJvci4gVGhlIFtyZXNvdXJjZVVyaV0gd2FzIG5vdCByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIgYW5kCiAgICAgIC8vIHdhcyBvbmx5IG5lZWRlZCB0byBnaXZlIGJldHRlciBlcnJvciBtZXNzYWdlcy4KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgRnV0dXJlPGFwaS5JbnB1dDxMaXN0PGludD4+PiBfcmVhZEZyb21GaWxlKAogICAgICBVcmkgcmVzb3VyY2VVcmksIGFwaS5JbnB1dEtpbmQgaW5wdXRLaW5kKSB7CiAgICBhcGkuSW5wdXQ8TGlzdDxpbnQ+PiBpbnB1dDsKICAgIHRyeSB7CiAgICAgIGlucHV0ID0gX3JlYWRGcm9tRmlsZVN5bmMocmVzb3VyY2VVcmksIGlucHV0S2luZCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBuZXcgRnV0dXJlLmVycm9yKGUpOwogICAgfQogICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUoaW5wdXQpOwogIH0KCiAgRnV0dXJlPGFwaS5JbnB1dDxMaXN0PGludD4+PiBfcmVhZEZyb21IdHRwKAogICAgICBVcmkgcmVzb3VyY2VVcmksIGFwaS5JbnB1dEtpbmQgaW5wdXRLaW5kKSB7CiAgICBhc3NlcnQocmVzb3VyY2VVcmkuc2NoZW1lID09ICdodHRwJyk7CiAgICBIdHRwQ2xpZW50IGNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7CiAgICByZXR1cm4gY2xpZW50CiAgICAgICAgLmdldFVybChyZXNvdXJjZVVyaSkKICAgICAgICAudGhlbigoSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCkgPT4gcmVxdWVzdC5jbG9zZSgpKQogICAgICAgIC50aGVuKChIdHRwQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UpIHsKICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT0gSHR0cFN0YXR1cy5vaykgewogICAgICAgIFN0cmluZyBtc2cgPSAnRmFpbHVyZSBnZXR0aW5nICRyZXNvdXJjZVVyaTogJwogICAgICAgICAgICAnJHtyZXNwb25zZS5zdGF0dXNDb2RlfSAke3Jlc3BvbnNlLnJlYXNvblBocmFzZX0nOwogICAgICAgIHRocm93IG1zZzsKICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2UudG9MaXN0KCk7CiAgICB9KS50aGVuKChMaXN0PExpc3Q8aW50Pj4gc3BsaXRDb250ZW50KSB7CiAgICAgIGludCB0b3RhbExlbmd0aCA9IHNwbGl0Q29udGVudC5mb2xkKDAsIChpbnQgb2xkLCBMaXN0IGxpc3QpIHsKICAgICAgICByZXR1cm4gb2xkICsgbGlzdC5sZW5ndGg7CiAgICAgIH0pOwogICAgICBVaW50OExpc3QgcmVzdWx0ID0gbmV3IFVpbnQ4TGlzdCh0b3RhbExlbmd0aCk7CiAgICAgIGludCBvZmZzZXQgPSAwOwogICAgICBmb3IgKExpc3Q8aW50PiBjb250ZW50UGFydCBpbiBzcGxpdENvbnRlbnQpIHsKICAgICAgICByZXN1bHQuc2V0UmFuZ2Uob2Zmc2V0LCBvZmZzZXQgKyBjb250ZW50UGFydC5sZW5ndGgsIGNvbnRlbnRQYXJ0KTsKICAgICAgICBvZmZzZXQgKz0gY29udGVudFBhcnQubGVuZ3RoOwogICAgICB9CiAgICAgIGRhcnRDaGFyYWN0ZXJzUmVhZCArPSB0b3RhbExlbmd0aDsKICAgICAgYXBpLklucHV0PExpc3Q8aW50Pj4gaW5wdXQ7CiAgICAgIHN3aXRjaCAoaW5wdXRLaW5kKSB7CiAgICAgICAgY2FzZSBhcGkuSW5wdXRLaW5kLlVURjg6CiAgICAgICAgICBpbnB1dCA9IHV0ZjhTb3VyY2VGaWxlc1tyZXNvdXJjZVVyaV0gPSBuZXcgQ2FjaGluZ1V0ZjhCeXRlc1NvdXJjZUZpbGUoCiAgICAgICAgICAgICAgcmVzb3VyY2VVcmksIHJlc291cmNlVXJpLnRvU3RyaW5nKCksIHJlc3VsdCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIGFwaS5JbnB1dEtpbmQuYmluYXJ5OgogICAgICAgICAgaW5wdXQgPQogICAgICAgICAgICAgIGJpbmFyeVNvdXJjZUZpbGVzW3Jlc291cmNlVXJpXSA9IG5ldyBCaW5hcnkocmVzb3VyY2VVcmksIHJlc3VsdCk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICByZXR1cm4gaW5wdXQ7CiAgICB9KTsKICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZCBmb3IgdGhlIG9sZCBjb21waWxlcgogIC8vIEFQSS4KICBGdXR1cmUgLyogPExpc3Q8aW50PiB8IFN0cmluZz4gKi8gY2FsbChVcmkgcmVzb3VyY2VVcmkpIHsKICAgIHRocm93ICJ1bmltcGxlbWVudGVkIjsKICB9CgogIHJlbGF0aXZpemVVcmkoVXJpIHVyaSkgPT4gZmUucmVsYXRpdml6ZVVyaShjd2QsIHVyaSwgaXNXaW5kb3dzKTsKCiAgU291cmNlRmlsZTxMaXN0PGludD4+IGdldFV0ZjhTb3VyY2VGaWxlKFVyaSByZXNvdXJjZVVyaSkgewogICAgcmV0dXJuIHV0ZjhTb3VyY2VGaWxlc1tyZXNvdXJjZVVyaV07CiAgfQoKICBJdGVyYWJsZTxVcmk+IGdldFNvdXJjZVVyaXMoKSB7CiAgICBTZXQ8VXJpPiB1cmlzID0gbmV3IFNldDxVcmk+KCk7CiAgICB1cmlzLmFkZEFsbCh1dGY4U291cmNlRmlsZXMua2V5cyk7CiAgICB1cmlzLmFkZEFsbChiaW5hcnlTb3VyY2VGaWxlcy5rZXlzKTsKICAgIHJldHVybiB1cmlzOwogIH0KfQoKTGlzdDxpbnQ+IHJlYWRBbGwoU3RyaW5nIGZpbGVuYW1lLCB7Ym9vbCB6ZXJvVGVybWluYXRlZDogdHJ1ZX0pIHsKICBSYW5kb21BY2Nlc3NGaWxlIGZpbGUgPSAobmV3IEZpbGUoZmlsZW5hbWUpKS5vcGVuU3luYygpOwogIGludCBsZW5ndGggPSBmaWxlLmxlbmd0aFN5bmMoKTsKICBpbnQgYnVmZmVyTGVuZ3RoID0gbGVuZ3RoOwogIGlmICh6ZXJvVGVybWluYXRlZCkgewogICAgLy8gKzEgdG8gaGF2ZSBhIDAgdGVybWluYXRlZCBsaXN0LCBzZWUgW1NjYW5uZXJdLgogICAgYnVmZmVyTGVuZ3RoKys7CiAgfQogIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KGJ1ZmZlckxlbmd0aCk7CiAgZmlsZS5yZWFkSW50b1N5bmMoYnVmZmVyLCAwLCBsZW5ndGgpOwogIGZpbGUuY2xvc2VTeW5jKCk7CiAgcmV0dXJuIGJ1ZmZlcjsKfQoKY2xhc3MgQ29tcGlsZXJTb3VyY2VGaWxlUHJvdmlkZXIgZXh0ZW5kcyBTb3VyY2VGaWxlUHJvdmlkZXIgewogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZCBmb3IgdGhlIG9sZCBjb21waWxlcgogIC8vIEFQSS4KICBAb3ZlcnJpZGUKICBGdXR1cmU8TGlzdDxpbnQ+PiBjYWxsKFVyaSByZXNvdXJjZVVyaSkgPT4KICAgICAgcmVhZEZyb21VcmkocmVzb3VyY2VVcmkpLnRoZW4oKGlucHV0KSA9PiBpbnB1dC5kYXRhKTsKCiAgQG92ZXJyaWRlCiAgRnV0dXJlPGFwaS5JbnB1dDxMaXN0PGludD4+PiByZWFkRnJvbVVyaShVcmkgdXJpLAogICAgICAgICAge0lucHV0S2luZCBpbnB1dEtpbmQ6IElucHV0S2luZC5VVEY4fSkgPT4KICAgICAgcmVhZEJ5dGVzRnJvbVVyaSh1cmksIGlucHV0S2luZCk7Cn0KCmNsYXNzIEZvcm1hdHRpbmdEaWFnbm9zdGljSGFuZGxlciBpbXBsZW1lbnRzIENvbXBpbGVyRGlhZ25vc3RpY3MgewogIGZpbmFsIFNvdXJjZUZpbGVQcm92aWRlciBwcm92aWRlcjsKICBib29sIHNob3dXYXJuaW5ncyA9IHRydWU7CiAgYm9vbCBzaG93SGludHMgPSB0cnVlOwogIGJvb2wgdmVyYm9zZSA9IGZhbHNlOwogIGJvb2wgaXNBYm9ydGluZyA9IGZhbHNlOwogIGJvb2wgZW5hYmxlQ29sb3JzID0gZmFsc2U7CiAgYm9vbCB0aHJvd09uRXJyb3IgPSBmYWxzZTsKICBib29sIGF1dG9SZWFkRmlsZVVyaSA9IGZhbHNlOwogIGludCB0aHJvd09uRXJyb3JDb3VudCA9IDA7CiAgYXBpLkRpYWdub3N0aWMgbGFzdEtpbmQgPSBudWxsOwogIGludCBmYXRhbENvdW50ID0gMDsKCiAgZmluYWwgaW50IEZBVEFMID0gYXBpLkRpYWdub3N0aWMuQ1JBU0gub3JkaW5hbCB8IGFwaS5EaWFnbm9zdGljLkVSUk9SLm9yZGluYWw7CiAgZmluYWwgaW50IElORk8gPQogICAgICBhcGkuRGlhZ25vc3RpYy5JTkZPLm9yZGluYWwgfCBhcGkuRGlhZ25vc3RpYy5WRVJCT1NFX0lORk8ub3JkaW5hbDsKCiAgRm9ybWF0dGluZ0RpYWdub3N0aWNIYW5kbGVyKFtTb3VyY2VGaWxlUHJvdmlkZXIgcHJvdmlkZXJdKQogICAgICA6IHRoaXMucHJvdmlkZXIgPQogICAgICAgICAgICAocHJvdmlkZXIgPT0gbnVsbCkgPyBuZXcgQ29tcGlsZXJTb3VyY2VGaWxlUHJvdmlkZXIoKSA6IHByb3ZpZGVyOwoKICB2b2lkIGluZm8odmFyIG1lc3NhZ2UsIFthcGkuRGlhZ25vc3RpYyBraW5kID0gYXBpLkRpYWdub3N0aWMuVkVSQk9TRV9JTkZPXSkgewogICAgaWYgKCF2ZXJib3NlICYmIGtpbmQgPT0gYXBpLkRpYWdub3N0aWMuVkVSQk9TRV9JTkZPKSByZXR1cm47CiAgICBpZiAoZW5hYmxlQ29sb3JzKSB7CiAgICAgIHByaW50KCcke2NvbG9ycy5ncmVlbigiSW5mbzoiKX0gJG1lc3NhZ2UnKTsKICAgIH0gZWxzZSB7CiAgICAgIHByaW50KCdJbmZvOiAkbWVzc2FnZScpOwogICAgfQogIH0KCiAgLy8vIEFkZHMgW2tpbmRdIHNwZWNpZmljIHByZWZpeCB0byBbbWVzc2FnZV0uCiAgU3RyaW5nIHByZWZpeE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGFwaS5EaWFnbm9zdGljIGtpbmQpIHsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIGFwaS5EaWFnbm9zdGljLkVSUk9SOgogICAgICAgIHJldHVybiAnRXJyb3I6ICRtZXNzYWdlJzsKICAgICAgY2FzZSBhcGkuRGlhZ25vc3RpYy5XQVJOSU5HOgogICAgICAgIHJldHVybiAnV2FybmluZzogJG1lc3NhZ2UnOwogICAgICBjYXNlIGFwaS5EaWFnbm9zdGljLkhJTlQ6CiAgICAgICAgcmV0dXJuICdIaW50OiAkbWVzc2FnZSc7CiAgICAgIGNhc2UgYXBpLkRpYWdub3N0aWMuQ1JBU0g6CiAgICAgICAgcmV0dXJuICdJbnRlcm5hbCBFcnJvcjogJG1lc3NhZ2UnOwogICAgICBjYXNlIGFwaS5EaWFnbm9zdGljLklORk86CiAgICAgIGNhc2UgYXBpLkRpYWdub3N0aWMuVkVSQk9TRV9JTkZPOgogICAgICAgIHJldHVybiAnSW5mbzogJG1lc3NhZ2UnOwogICAgfQogICAgdGhyb3cgJ1VuZXhwZWN0ZWQgZGlhZ25vc3RpYyBraW5kOiAka2luZCAoJHtraW5kLm9yZGluYWx9KSc7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlcG9ydCh2YXIgY29kZSwgVXJpIHVyaSwgaW50IGJlZ2luLCBpbnQgZW5kLCBTdHJpbmcgbWVzc2FnZSwKICAgICAgYXBpLkRpYWdub3N0aWMga2luZCkgewogICAgaWYgKGlzQWJvcnRpbmcpIHJldHVybjsKICAgIGlzQWJvcnRpbmcgPSAoa2luZCA9PSBhcGkuRGlhZ25vc3RpYy5DUkFTSCk7CgogICAgYm9vbCBmYXRhbCA9IChraW5kLm9yZGluYWwgJiBGQVRBTCkgIT0gMDsKICAgIGJvb2wgaXNJbmZvID0gKGtpbmQub3JkaW5hbCAmIElORk8pICE9IDA7CiAgICBpZiAoaXNJbmZvICYmIHVyaSA9PSBudWxsICYmIGtpbmQgIT0gYXBpLkRpYWdub3N0aWMuSU5GTykgewogICAgICBpbmZvKG1lc3NhZ2UsIGtpbmQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgbWVzc2FnZSA9IHByZWZpeE1lc3NhZ2UobWVzc2FnZSwga2luZCk7CgogICAgLy8gW2xhc3RLaW5kXSByZWNvcmRzIHRoZSBwcmV2aW91cyBub24tSU5GTyBraW5kIHdlIHNhdy4KICAgIC8vIFRoaXMgaXMgdXNlZCB0byBzdXBwcmVzcyBpbmZvIGFib3V0IGEgd2FybmluZyB3aGVuIHdhcm5pbmdzIGFyZQogICAgLy8gc3VwcHJlc3NlZCwgYW5kIHNpbWlsYXIgZm9yIGhpbnRzLgogICAgaWYgKGtpbmQgIT0gYXBpLkRpYWdub3N0aWMuSU5GTykgewogICAgICBsYXN0S2luZCA9IGtpbmQ7CiAgICB9CiAgICB2YXIgY29sb3I7CiAgICBpZiAoa2luZCA9PSBhcGkuRGlhZ25vc3RpYy5FUlJPUikgewogICAgICBjb2xvciA9IGNvbG9ycy5yZWQ7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gYXBpLkRpYWdub3N0aWMuV0FSTklORykgewogICAgICBpZiAoIXNob3dXYXJuaW5ncykgcmV0dXJuOwogICAgICBjb2xvciA9IGNvbG9ycy5tYWdlbnRhOwogICAgfSBlbHNlIGlmIChraW5kID09IGFwaS5EaWFnbm9zdGljLkhJTlQpIHsKICAgICAgaWYgKCFzaG93SGludHMpIHJldHVybjsKICAgICAgY29sb3IgPSBjb2xvcnMuY3lhbjsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBhcGkuRGlhZ25vc3RpYy5DUkFTSCkgewogICAgICBjb2xvciA9IGNvbG9ycy5yZWQ7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gYXBpLkRpYWdub3N0aWMuSU5GTykgewogICAgICBpZiAobGFzdEtpbmQgPT0gYXBpLkRpYWdub3N0aWMuV0FSTklORyAmJiAhc2hvd1dhcm5pbmdzKSByZXR1cm47CiAgICAgIGlmIChsYXN0S2luZCA9PSBhcGkuRGlhZ25vc3RpYy5ISU5UICYmICFzaG93SGludHMpIHJldHVybjsKICAgICAgY29sb3IgPSBjb2xvcnMuZ3JlZW47CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAnVW5rbm93biBraW5kOiAka2luZCAoJHtraW5kLm9yZGluYWx9KSc7CiAgICB9CiAgICBpZiAoIWVuYWJsZUNvbG9ycykgewogICAgICBjb2xvciA9IChTdHJpbmcgeCkgPT4geDsKICAgIH0KICAgIGlmICh1cmkgPT0gbnVsbCkgewogICAgICBwcmludCgnJHtjb2xvcihtZXNzYWdlKX0nKTsKICAgIH0gZWxzZSB7CiAgICAgIGFwaS5JbnB1dCBmaWxlID0gcHJvdmlkZXIuZ2V0VXRmOFNvdXJjZUZpbGUodXJpKTsKICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJgogICAgICAgICAgYXV0b1JlYWRGaWxlVXJpICYmCiAgICAgICAgICAodXJpLnNjaGVtZSA9PSAnZmlsZScgfHwgIXVyaS5pc0Fic29sdXRlKSAmJgogICAgICAgICAgdXJpLnBhdGguZW5kc1dpdGgoJy5kYXJ0JykpIHsKICAgICAgICBpZiAoIXVyaS5pc0Fic29sdXRlKSB7CiAgICAgICAgICB1cmkgPSBwcm92aWRlci5jd2QucmVzb2x2ZVVyaSh1cmkpOwogICAgICAgIH0KICAgICAgICAvLyBXaGVuIHJlYWRpbmcgZnJvbSAuZGlsbCBmaWxlcywgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcyBoYXZlbid0IGJlZW4KICAgICAgICAvLyBsb2FkZWQuIExvYWQgdGhlIGZpbGUgaWYgcG9zc2libGUgdG8gcHJvdmlkZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLgogICAgICAgIGZpbGUgPSBwcm92aWRlci5hdXRvUmVhZEZyb21GaWxlKHVyaSk7CiAgICAgIH0KICAgICAgaWYgKGZpbGUgaXMgU291cmNlRmlsZSkgewogICAgICAgIHByaW50KGZpbGUuZ2V0TG9jYXRpb25NZXNzYWdlKGNvbG9yKG1lc3NhZ2UpLCBiZWdpbiwgZW5kLAogICAgICAgICAgICBjb2xvcml6ZTogY29sb3IpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBTdHJpbmcgcG9zaXRpb24gPSBlbmQgLSBiZWdpbiA+IDAgPyAnQCRiZWdpbiske2VuZCAtIGJlZ2lufScgOiAnJzsKICAgICAgICBwcmludCgnJHtwcm92aWRlci5yZWxhdGl2aXplVXJpKHVyaSl9JHBvc2l0aW9uOlxuJwogICAgICAgICAgICAnJHtjb2xvcihtZXNzYWdlKX0nKTsKICAgICAgfQogICAgfQogICAgaWYgKGZhdGFsICYmICsrZmF0YWxDb3VudCA+PSB0aHJvd09uRXJyb3JDb3VudCAmJiB0aHJvd09uRXJyb3IpIHsKICAgICAgaXNBYm9ydGluZyA9IHRydWU7CiAgICAgIHRocm93IG5ldyBBYm9ydExlZyhtZXNzYWdlKTsKICAgIH0KICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZCBmb3IgdGhlIG9sZCBjb21waWxlcgogIC8vIEFQSS4KICB2b2lkIGNhbGwoVXJpIHVyaSwgaW50IGJlZ2luLCBpbnQgZW5kLCBTdHJpbmcgbWVzc2FnZSwgYXBpLkRpYWdub3N0aWMga2luZCkgewogICAgcmV0dXJuIHJlcG9ydChudWxsLCB1cmksIGJlZ2luLCBlbmQsIG1lc3NhZ2UsIGtpbmQpOwogIH0KfQoKdHlwZWRlZiB2b2lkIE1lc3NhZ2VDYWxsYmFjayhTdHJpbmcgbWVzc2FnZSk7CgpjbGFzcyBSYW5kb21BY2Nlc3NGaWxlT3V0cHV0UHJvdmlkZXIgaW1wbGVtZW50cyBDb21waWxlck91dHB1dCB7CiAgZmluYWwgVXJpIG91dDsKICBmaW5hbCBVcmkgc291cmNlTWFwT3V0OwogIGZpbmFsIE1lc3NhZ2VDYWxsYmFjayBvbkluZm87CiAgZmluYWwgTWVzc2FnZUNhbGxiYWNrIG9uRmFpbHVyZTsKCiAgaW50IHRvdGFsQ2hhcmFjdGVyc1dyaXR0ZW4gPSAwOwogIGludCB0b3RhbENoYXJhY3RlcnNXcml0dGVuUHJpbWFyeSA9IDA7CiAgaW50IHRvdGFsQ2hhcmFjdGVyc1dyaXR0ZW5KYXZhU2NyaXB0ID0gMDsKICBpbnQgdG90YWxEYXRhV3JpdHRlbiA9IDA7CgogIExpc3Q8U3RyaW5nPiBhbGxPdXRwdXRGaWxlcyA9IDxTdHJpbmc+W107CgogIFJhbmRvbUFjY2Vzc0ZpbGVPdXRwdXRQcm92aWRlcih0aGlzLm91dCwgdGhpcy5zb3VyY2VNYXBPdXQsCiAgICAgIHt0aGlzLm9uSW5mbywgdGhpcy5vbkZhaWx1cmV9KTsKCiAgVXJpIGNyZWF0ZVVyaShTdHJpbmcgbmFtZSwgU3RyaW5nIGV4dGVuc2lvbiwgT3V0cHV0VHlwZSB0eXBlKSB7CiAgICBVcmkgdXJpOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVW5pZnkgaGFuZGxlIG9mIFtuYW1lXSBhbmQgW2V4dGVuc2lvbl0gdG8gcHJlcGFyZQogICAgLy8gZm9yIHVzaW5nIGEgc2luZ2xlLCBwb3NzaWJseSByZWxhdGl2ZSwgW3VyaV0gYXMgaW5wdXQuCiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgY2FzZSBPdXRwdXRUeXBlLmpzOgogICAgICAgIGlmIChuYW1lID09ICcnKSB7CiAgICAgICAgICB1cmkgPSBvdXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVyaSA9IG91dC5yZXNvbHZlKCckbmFtZS4kZXh0ZW5zaW9uJyk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE91dHB1dFR5cGUuc291cmNlTWFwOgogICAgICAgIGlmIChuYW1lID09ICcnKSB7CiAgICAgICAgICB1cmkgPSBzb3VyY2VNYXBPdXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVyaSA9IG91dC5yZXNvbHZlKCckbmFtZS4kZXh0ZW5zaW9uJyk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE91dHB1dFR5cGUuanNQYXJ0OgogICAgICAgIHVyaSA9IG91dC5yZXNvbHZlKCckbmFtZS4kZXh0ZW5zaW9uJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgT3V0cHV0VHlwZS5kdW1wSW5mbzoKICAgICAgY2FzZSBPdXRwdXRUeXBlLmRlZmVycmVkTWFwOgogICAgICAgIGlmIChuYW1lID09ICcnKSB7CiAgICAgICAgICBuYW1lID0gb3V0LnBhdGhTZWdtZW50cy5sYXN0OwogICAgICAgIH0KICAgICAgICBpZiAoZXh0ZW5zaW9uID09ICcnKSB7CiAgICAgICAgICB1cmkgPSBvdXQucmVzb2x2ZShuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdXJpID0gb3V0LnJlc29sdmUoJyRuYW1lLiRleHRlbnNpb24nKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgT3V0cHV0VHlwZS5kZWJ1ZzoKICAgICAgICB1cmkgPSBvdXQucmVzb2x2ZSgnJG5hbWUuJGV4dGVuc2lvbicpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIG9uRmFpbHVyZSgnVW5rbm93biBvdXRwdXQgdHlwZTogJHR5cGUnKTsKICAgIH0KICAgIHJldHVybiB1cmk7CiAgfQoKICBAb3ZlcnJpZGUKICBPdXRwdXRTaW5rIGNyZWF0ZU91dHB1dFNpbmsoU3RyaW5nIG5hbWUsIFN0cmluZyBleHRlbnNpb24sIE91dHB1dFR5cGUgdHlwZSkgewogICAgVXJpIHVyaSA9IGNyZWF0ZVVyaShuYW1lLCBleHRlbnNpb24sIHR5cGUpOwogICAgYm9vbCBpc1ByaW1hcnlPdXRwdXQgPSB1cmkgPT0gb3V0OwoKICAgIGlmICh1cmkuc2NoZW1lICE9ICdmaWxlJykgewogICAgICBvbkZhaWx1cmUoJ1VuaGFuZGxlZCBzY2hlbWUgJHt1cmkuc2NoZW1lfSBpbiAkdXJpLicpOwogICAgfQoKICAgIFJhbmRvbUFjY2Vzc0ZpbGUgb3V0cHV0OwogICAgdHJ5IHsKICAgICAgb3V0cHV0ID0gbmV3IEZpbGUodXJpLnRvRmlsZVBhdGgoKSkub3BlblN5bmMobW9kZTogRmlsZU1vZGUud3JpdGUpOwogICAgfSBvbiBGaWxlU3lzdGVtRXhjZXB0aW9uIGNhdGNoIChlKSB7CiAgICAgIG9uRmFpbHVyZSgnJGUnKTsKICAgIH0KCiAgICBhbGxPdXRwdXRGaWxlcwogICAgICAgIC5hZGQoZmUucmVsYXRpdml6ZVVyaShjdXJyZW50RGlyZWN0b3J5LCB1cmksIFBsYXRmb3JtLmlzV2luZG93cykpOwoKICAgIGludCBjaGFyYWN0ZXJzV3JpdHRlbiA9IDA7CgogICAgdm9pZCB3cml0ZVN0cmluZ1N5bmMoU3RyaW5nIGRhdGEpIHsKICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgaW4gY2h1bmtzIG9mIDhrYiwgb3RoZXJ3aXNlIHdlIHJpc2sgcnVubmluZyBPT00uCiAgICAgIGludCBjaHVua1NpemUgPSA4ICogMTAyNDsKCiAgICAgIGludCBvZmZzZXQgPSAwOwogICAgICB3aGlsZSAob2Zmc2V0IDwgZGF0YS5sZW5ndGgpIHsKICAgICAgICBvdXRwdXQud3JpdGVTdHJpbmdTeW5jKAogICAgICAgICAgICBkYXRhLnN1YnN0cmluZyhvZmZzZXQsIG1hdGgubWluKG9mZnNldCArIGNodW5rU2l6ZSwgZGF0YS5sZW5ndGgpKSk7CiAgICAgICAgb2Zmc2V0ICs9IGNodW5rU2l6ZTsKICAgICAgfQogICAgICBjaGFyYWN0ZXJzV3JpdHRlbiArPSBkYXRhLmxlbmd0aDsKICAgIH0KCiAgICB2b2lkIG9uRG9uZSgpIHsKICAgICAgb3V0cHV0LmNsb3NlU3luYygpOwogICAgICB0b3RhbENoYXJhY3RlcnNXcml0dGVuICs9IGNoYXJhY3RlcnNXcml0dGVuOwogICAgICBpZiAoaXNQcmltYXJ5T3V0cHV0KSB7CiAgICAgICAgdG90YWxDaGFyYWN0ZXJzV3JpdHRlblByaW1hcnkgKz0gY2hhcmFjdGVyc1dyaXR0ZW47CiAgICAgIH0KICAgICAgaWYgKHR5cGUgPT0gT3V0cHV0VHlwZS5qcyB8fCB0eXBlID09IE91dHB1dFR5cGUuanNQYXJ0KSB7CiAgICAgICAgdG90YWxDaGFyYWN0ZXJzV3JpdHRlbkphdmFTY3JpcHQgKz0gY2hhcmFjdGVyc1dyaXR0ZW47CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbmV3IF9PdXRwdXRTaW5rV3JhcHBlcih3cml0ZVN0cmluZ1N5bmMsIG9uRG9uZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBCaW5hcnlPdXRwdXRTaW5rIGNyZWF0ZUJpbmFyeVNpbmsoVXJpIHVyaSkgewogICAgdXJpID0gY3VycmVudERpcmVjdG9yeS5yZXNvbHZlVXJpKHVyaSk7CgogICAgYWxsT3V0cHV0RmlsZXMKICAgICAgICAuYWRkKGZlLnJlbGF0aXZpemVVcmkoY3VycmVudERpcmVjdG9yeSwgdXJpLCBQbGF0Zm9ybS5pc1dpbmRvd3MpKTsKCiAgICBpZiAodXJpLnNjaGVtZSAhPSAnZmlsZScpIHsKICAgICAgb25GYWlsdXJlKCdVbmhhbmRsZWQgc2NoZW1lICR7dXJpLnNjaGVtZX0gaW4gJHVyaS4nKTsKICAgIH0KCiAgICBSYW5kb21BY2Nlc3NGaWxlIG91dHB1dDsKICAgIHRyeSB7CiAgICAgIG91dHB1dCA9IG5ldyBGaWxlKHVyaS50b0ZpbGVQYXRoKCkpLm9wZW5TeW5jKG1vZGU6IEZpbGVNb2RlLndyaXRlKTsKICAgIH0gb24gRmlsZVN5c3RlbUV4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICBvbkZhaWx1cmUoJyRlJyk7CiAgICB9CgogICAgaW50IGJ5dGVzV3JpdHRlbiA9IDA7CgogICAgdm9pZCB3cml0ZUJ5dGVzU3luYyhMaXN0PGludD4gZGF0YSwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICAgIG91dHB1dC53cml0ZUZyb21TeW5jKGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgICBieXRlc1dyaXR0ZW4gKz0gKGVuZCA/PyBkYXRhLmxlbmd0aCkgLSBzdGFydDsKICAgIH0KCiAgICB2b2lkIG9uRG9uZSgpIHsKICAgICAgb3V0cHV0LmNsb3NlU3luYygpOwogICAgICB0b3RhbERhdGFXcml0dGVuICs9IGJ5dGVzV3JpdHRlbjsKICAgIH0KCiAgICByZXR1cm4gbmV3IF9CaW5hcnlPdXRwdXRTaW5rV3JhcHBlcih3cml0ZUJ5dGVzU3luYywgb25Eb25lKTsKICB9Cn0KCmNsYXNzIFJhbmRvbUFjY2Vzc0JpbmFyeU91dHB1dFNpbmsgaW1wbGVtZW50cyBhcGkuQmluYXJ5T3V0cHV0U2luayB7CiAgZmluYWwgUmFuZG9tQWNjZXNzRmlsZSBvdXRwdXQ7CgogIFJhbmRvbUFjY2Vzc0JpbmFyeU91dHB1dFNpbmsoVXJpIHVyaSkKICAgICAgOiBvdXRwdXQgPSBuZXcgRmlsZS5mcm9tVXJpKHVyaSkub3BlblN5bmMobW9kZTogRmlsZU1vZGUud3JpdGUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgb3V0cHV0LndyaXRlRnJvbVN5bmMoYnVmZmVyLCBzdGFydCwgZW5kKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSB7CiAgICBvdXRwdXQuY2xvc2VTeW5jKCk7CiAgfQp9CgpjbGFzcyBfT3V0cHV0U2lua1dyYXBwZXIgZXh0ZW5kcyBPdXRwdXRTaW5rIHsKICB2b2lkIEZ1bmN0aW9uKFN0cmluZykgb25BZGQ7CiAgdm9pZCBGdW5jdGlvbigpIG9uQ2xvc2U7CgogIF9PdXRwdXRTaW5rV3JhcHBlcih0aGlzLm9uQWRkLCB0aGlzLm9uQ2xvc2UpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZChTdHJpbmcgZGF0YSkgPT4gb25BZGQoZGF0YSk7CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSA9PiBvbkNsb3NlKCk7Cn0KCmNsYXNzIF9CaW5hcnlPdXRwdXRTaW5rV3JhcHBlciBleHRlbmRzIEJpbmFyeU91dHB1dFNpbmsgewogIHZvaWQgRnVuY3Rpb24oTGlzdDxpbnQ+LCBbaW50LCBpbnRdKSBvbldyaXRlOwogIHZvaWQgRnVuY3Rpb24oKSBvbkNsb3NlOwoKICBfQmluYXJ5T3V0cHV0U2lua1dyYXBwZXIodGhpcy5vbldyaXRlLCB0aGlzLm9uQ2xvc2UpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlKExpc3Q8aW50PiBkYXRhLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pID0+CiAgICAgIG9uV3JpdGUoZGF0YSwgc3RhcnQsIGVuZCk7CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSA9PiBvbkNsb3NlKCk7Cn0KCi8vLyBBZGFwdGVyIHRvIGludGVncmF0ZSBkYXJ0MmpzIGluIGJhemVsLgovLy8KLy8vIFRvIGhhbmRsZSBiYXplbCdzIHNwZWNpYWwgbGF5b3V0OgovLy8KLy8vICAqIFdlIHNwZWNpZnkgYSAucGFja2FnZXMgY29uZmlndXJhdGlvbiBmaWxlIHRoYXQgZXhwYW5kcyBwYWNrYWdlcyB0byB0aGVpcgovLy8gICAgY29ycmVzcG9uZGluZyBiYXplbCBsb2NhdGlvbi4gVGhpcyB3YXkgdGhlcmUgaXMgbm8gbmVlZCB0byBjcmVhdGUgYSBwdWIKLy8vICAgIGNhY2hlIHByaW9yIHRvIGludm9raW5nIGRhcnQyanMuCi8vLwovLy8gICogV2UgcHJvdmlkZSBhbiBpbXBsaWNpdCBtYXBwaW5nIHRoYXQgY2FuIG1ha2UgYWxsIHVybHMgcmVsYXRpdmUgdG8gdGhlCi8vLyAgYmF6ZWwgcm9vdC4KLy8vICAgIFRvIHRoZSBjb21waWxlciwgVVJJcyBsb29rIGxpa2U6Ci8vLyAgICAgIGZpbGU6Ly8vYmF6ZWwtcm9vdC9hL2IvYy5kYXJ0Ci8vLwovLy8gICAgZXZlbiB0aG91Z2ggaW4gdGhlIGZpbGUgc3lzdGVtIHRoZSBmaWxlIGlzIGxvY2F0ZWQgYXQ6Ci8vLyAgICAgIGZpbGU6Ly8vcGF0aC90by90aGUvYWN0dWFsL2JhemVsL3Jvb3QvYS9iL2MuZGFydAovLy8KLy8vICAgIFRoaXMgbWFwcGluZyBzZXJ2ZXMgdHdvIHB1cnBvc2VzOgovLy8gICAgICAtIEl0IG1ha2VzIGNvbXBpbGVyIHJlc3VsdHMgaW5kZXBlbmRlbnQgb2YgdGhlIG1hY2hpbmUgbGF5b3V0LCB3aGljaAovLy8gICAgICAgIGVuYWJsZXMgdXMgdG8gc2hhcmUgcmVzdWx0cyBhY3Jvc3MgYmF6ZWwgcnVucyBhbmQgYWNyb3NzIG1hY2hpbmVzLgovLy8KLy8vICAgICAgLSBJdCBoaWRlcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBnZW5lcmF0ZWQgYW5kIHNvdXJjZSBmaWxlcy4gVGhhdCB3YXkKLy8vICAgICAgd2UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgcGFja2FnZS1yZXNvbHV0aW9uIG1lY2hhbmlzbSBhbmQgaWdub3JlIHRoZQovLy8gICAgICBpbnRlcm5hbHMgb2YgaG93IGZpbGVzIGFyZSBvcmdhbml6ZWQgd2l0aGluIGJhemVsLgovLy8KLy8vIFdoZW4gaW52b2tpbmcgdGhlIGNvbXBpbGVyLCBiYXplbCB3aWxsIHVzZSBgcGFja2FnZTpgIGFuZAovLy8gYGZpbGU6Ly8vYmF6ZWwtcm9vdC9gIFVSSXMgdG8gc3BlY2lmeSBlbnRyeXBvaW50cy4KLy8vCi8vLyBUaGUgbWFwcGluZyBpcyBzcGVjaWZpZWQgdXNpbmcgc2VhcmNoIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50Ci8vLyBkaXJlY3RvcnkuIFdoZW4gdGhpcyBwcm92aWRlciBsb29rcyB1cCBhIGZpbGUsIHRoZSBiYXplbC1yb290IGZvbGRlciBpcwovLy8gcmVwbGFjZWQgYnkgdGhlIGZpcnN0IGRpcmVjdG9yeSBpbiB0aGUgc2VhcmNoIHBhdGggY29udGFpbmluZyB0aGUgZmlsZSwgaWYKLy8vIGFueS4gRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBzZWFyY2ggcGF0aCAiLixiYXplbC1iaW4vIiwgYW5kIGEgVVJMCi8vLyBvZiB0aGUgZm9ybSBgZmlsZTovLy9iYXplbC1yb290L2EvYi5kYXJ0YCwgdGhpcyBwcm92aWRlciB3aWxsIGNoZWNrIGlmIHRoZQovLy8gZmlsZSBleGlzdHMgdW5kZXIgIi4vYS9iLmRhcnQiLCB0aGVuIGNoZWNrIHVuZGVyICJiYXplbC1iaW4vYS9iLmRhcnQiLiAgSWYKLy8vIG5vbmUgb2YgdGhlIHBhdGhzIG1hdGNoZXMsIGl0IHdpbGwgYXR0ZW1wdCB0byBsb2FkIHRoZSBmaWxlIGZyb20KLy8vIGAvYmF6ZWwtcm9vdC9hL2IuZGFydGAgd2hpY2ggd2lsbCBsaWtlbHkgZmFpbC4KY2xhc3MgQmF6ZWxJbnB1dFByb3ZpZGVyIGV4dGVuZHMgU291cmNlRmlsZVByb3ZpZGVyIHsKICBmaW5hbCBMaXN0PFVyaT4gZGlyczsKCiAgQmF6ZWxJbnB1dFByb3ZpZGVyKExpc3Q8U3RyaW5nPiBzZWFyY2hQYXRocykKICAgICAgOiBkaXJzID0gc2VhcmNoUGF0aHMubWFwKF9yZXNvbHZlKS50b0xpc3QoKTsKCiAgc3RhdGljIFVyaSBfcmVzb2x2ZShTdHJpbmcgcGF0aCkgPT4gY3VycmVudERpcmVjdG9yeS5yZXNvbHZlKHBhdGgpOwoKICBAb3ZlcnJpZGUKICBGdXR1cmU8YXBpLklucHV0PExpc3Q8aW50Pj4+IHJlYWRGcm9tVXJpKFVyaSB1cmksCiAgICAgIHtJbnB1dEtpbmQgaW5wdXRLaW5kOiBJbnB1dEtpbmQuVVRGOH0pIGFzeW5jIHsKICAgIHZhciByZXNvbHZlZFVyaSA9IHVyaTsKICAgIHZhciBwYXRoID0gdXJpLnBhdGg7CiAgICBpZiAocGF0aC5zdGFydHNXaXRoKCcvYmF6ZWwtcm9vdCcpKSB7CiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygnL2JhemVsLXJvb3QvJy5sZW5ndGgpOwogICAgICBmb3IgKHZhciBkaXIgaW4gZGlycykgewogICAgICAgIHZhciBmaWxlID0gZGlyLnJlc29sdmUocGF0aCk7CiAgICAgICAgaWYgKGF3YWl0IG5ldyBGaWxlLmZyb21VcmkoZmlsZSkuZXhpc3RzKCkpIHsKICAgICAgICAgIHJlc29sdmVkVXJpID0gZmlsZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXBpLklucHV0PExpc3Q8aW50Pj4gcmVzdWx0ID0KICAgICAgICBhd2FpdCByZWFkQnl0ZXNGcm9tVXJpKHJlc29sdmVkVXJpLCBpbnB1dEtpbmQpOwogICAgc3dpdGNoIChpbnB1dEtpbmQpIHsKICAgICAgY2FzZSBJbnB1dEtpbmQuVVRGODoKICAgICAgICB1dGY4U291cmNlRmlsZXNbdXJpXSA9IHV0ZjhTb3VyY2VGaWxlc1tyZXNvbHZlZFVyaV07CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSW5wdXRLaW5kLmJpbmFyeToKICAgICAgICBiaW5hcnlTb3VyY2VGaWxlc1t1cmldID0gYmluYXJ5U291cmNlRmlsZXNbcmVzb2x2ZWRVcmldOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIGFwaS5JbnB1dCBhdXRvUmVhZEZyb21GaWxlKFVyaSByZXNvdXJjZVVyaSkgewogICAgdmFyIHBhdGggPSByZXNvdXJjZVVyaS5wYXRoOwogICAgaWYgKHBhdGguc3RhcnRzV2l0aCgnL2JhemVsLXJvb3QnKSkgewogICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoJy9iYXplbC1yb290LycubGVuZ3RoKTsKICAgICAgZm9yICh2YXIgZGlyIGluIGRpcnMpIHsKICAgICAgICB2YXIgZmlsZSA9IGRpci5yZXNvbHZlKHBhdGgpOwogICAgICAgIGlmIChuZXcgRmlsZS5mcm9tVXJpKGZpbGUpLmV4aXN0c1N5bmMoKSkgewogICAgICAgICAgcmV0dXJuIHN1cGVyLmF1dG9SZWFkRnJvbUZpbGUoZmlsZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0Kgk4ATk48AR4BFRIcGgFAATImHyAlGR4BPTwePD4eATEyIzEGIBkfLg8hMA8GNwEoNFA0DUcGBAFKKhYKMTwqLDxFBikVGR9PPg8hEE4PBhIEAU8QMAo9ElA4BhEEAS4yIAo5EiIGJAQBLjIqKhIdPi4yNj8TCCAtRCIKNRY0SyYIKSIbIVE8ESMSUBEIFAgEAVEKPBsEAUMBPSkEASIkJykRBAIBQjsiHRg2FAQsKBQRAgE+UQoMLTwBDDQ0KAIBQyUcGRgbHR0gHSIWAVETSQE9GE4BUEEYMg0fBgQBMD4UISIjJCAhISsgKCEGQQQBDEUdHDEBLi5AGw4GASwBPUcqJxcGDygaMSEeLh4bLxouR0EcDTUGGR8GFyINOBodNygfLgpRUC8IIEIfD0s7IggGRhkjBgQBUQpQOQQCAS4BQREaICMBIiksHAEsAT4mAUINTj4UGhoVETEKDyEaHhExCg8eLw8gIxooCh8jETEKDx0vDw8xBhAEAQxQMCcBIDwGAR0KSikXBgETSwEfAShJIAEWJSBQHQgoBgEUGjMdPAhAPwgGATwEAQwvLAETSwEgPAYBHQpKKRcGARoBRC40BgEUGigGAUEEAgFFIQEoRwEMOy4EAQwRGAQCAS4fGwEwAQwoAQwdAgE6MBsBOAEMOiEBDB0CASsEJgRQTygETREoJwQ+OgQpTk4EUU08BD43BEhMT0ZPT0UzNhgBLzMBRgEMNDUbGSo0HiY1HhEKCAYiOBkbPQ8dQQ8GEwQBDDAhKjQeJjMvCggGEQQCAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9zb3VyY2VfZmlsZV9wcm92aWRlci5kYXJ0NHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3V0aWwvY29tbWFuZF9saW5lLmRhcnSIPy8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMudXRpbC5jb21tYW5kX2xpbmU7CgovLy8gVGhlIGFjY2VwdGVkIGVzY2FwZXMgaW4gdGhlIGlucHV0IG9mIHRoZSAtLWJhdGNoIHByb2Nlc3Nvci4KLy8vCi8vLyBDb250cmFyeSB0byBEYXJ0IHN0cmluZ3MgaXQgZG9lcyBub3QgY29udGFpbiBoZXggZXNjYXBlcyAoXHUgb3IgXHgpLgpNYXA8U3RyaW5nLCBTdHJpbmc+IEVTQ0FQRV9NQVBQSU5HID0gY29uc3QgewogICJuIjogIlxuIiwKICAiciI6ICJcciIsCiAgInQiOiAiXHQiLAogICJiIjogIlxiIiwKICAiZiI6ICJcZiIsCiAgInYiOiAiXHYiLAogICJcXCI6ICJcXCIsCn07CgovLy8gU3BsaXRzIHRoZSBsaW5lIHNpbWlsYXIgdG8gaG93IGEgc2hlbGwgd291bGQgc3BsaXQgYXJndW1lbnRzLiBJZiBbd2luZG93c10KLy8vIGlzIGB0cnVlYCBlc2NhcGVzIHdpbGwgYmUgaGFuZGxlZCBsaWtlIG9uIHRoZSBXaW5kb3dzIGNvbW1hbmQtbGluZS4KLy8vCi8vLyBFeGFtcGxlOgovLy8KLy8vICAgICBzcGxpdGxpbmUoIiIiLS1hcmdzICJhYiJjICd3aXRoICIgXCdzcGFjZXMnIiIiKS5mb3JFYWNoKHByaW50KTsKLy8vICAgICAvLyAtLWFyZ3MKLy8vICAgICAvLyBhYmMKLy8vICAgICAvLyB3aXRoICIgJ3NwYWNlcwpMaXN0PFN0cmluZz4gc3BsaXRMaW5lKFN0cmluZyBsaW5lLCB7Ym9vbCB3aW5kb3dzOiBmYWxzZX0pIHsKICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gPFN0cmluZz5bXTsKICBib29sIGluUXVvdGVzID0gZmFsc2U7CiAgU3RyaW5nIG9wZW5pbmdRdW90ZTsKICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykgewogICAgU3RyaW5nIGMgPSBsaW5lW2ldOwogICAgaWYgKGluUXVvdGVzICYmIGMgPT0gb3BlbmluZ1F1b3RlKSB7CiAgICAgIGluUXVvdGVzID0gZmFsc2U7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKCFpblF1b3RlcyAmJiAoYyA9PSAnIicgfHwgKGMgPT0gIiciICYmICF3aW5kb3dzKSkpIHsKICAgICAgaW5RdW90ZXMgPSB0cnVlOwogICAgICBvcGVuaW5nUXVvdGUgPSBjOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmIChjID09ICdcXCcpIHsKICAgICAgaWYgKGkgPT0gbGluZS5sZW5ndGggLSAxKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiVW5maW5pc2hlZCBlc2NhcGU6ICRsaW5lIik7CiAgICAgIH0KICAgICAgaWYgKHdpbmRvd3MpIHsKICAgICAgICBTdHJpbmcgbmV4dCA9IGxpbmVbaSArIDFdOwogICAgICAgIGlmIChuZXh0ID09ICciJyB8fCBuZXh0ID09IHInXCcpIHsKICAgICAgICAgIGJ1ZmZlci53cml0ZShuZXh0KTsKICAgICAgICAgIGkrKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpKys7CgogICAgICAgIGMgPSBsaW5lW2ldOwogICAgICAgIFN0cmluZyBtYXBwZWQgPSBFU0NBUEVfTUFQUElOR1tjXTsKICAgICAgICBpZiAobWFwcGVkID09IG51bGwpIG1hcHBlZCA9IGM7CiAgICAgICAgYnVmZmVyLndyaXRlKG1hcHBlZCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgIH0KICAgIGlmICghaW5RdW90ZXMgJiYgYyA9PSAiICIpIHsKICAgICAgaWYgKGJ1ZmZlci5pc05vdEVtcHR5KSByZXN1bHQuYWRkKGJ1ZmZlci50b1N0cmluZygpKTsKICAgICAgYnVmZmVyLmNsZWFyKCk7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgYnVmZmVyLndyaXRlKGMpOwogIH0KICBpZiAoaW5RdW90ZXMpIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oIlVuY2xvc2VkIHF1b3RlczogJGxpbmUiKTsKICBpZiAoYnVmZmVyLmlzTm90RW1wdHkpIHJlc3VsdC5hZGQoYnVmZmVyLnRvU3RyaW5nKCkpOwogIHJldHVybiByZXN1bHQ7Cn0KTgBOTjwBIwFABEktDQ0NDQ0NDgMBT0gEDQRIEg8aPSQZFywqGCkYEAY9FxgQBhUiPwgVIyseDxQKDw0BFSsoHhIIBiE8FhAGFQRFOBECAStwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL2NvbW1hbmRfbGluZS5kYXJ0LHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3V0aWwvdXRpbC5kYXJ0o1EvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLnV0aWw7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JwogICAgc2hvdyAkQkFDS1NMQVNILCAkQ1IsICRERUwsICREUSwgJExGLCAkTFMsICRQUywgJFRBQiwgTGluaywgTGlua0J1aWxkZXI7CgpleHBvcnQgJ2VtcHR5c2V0LmRhcnQnOwpleHBvcnQgJ21hcGxldC5kYXJ0JzsKZXhwb3J0ICdzZXRsZXQuZGFydCc7CgpwYXJ0ICdpbmRlbnRhdGlvbi5kYXJ0JzsKCi8vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBoYXNoIGNvZGVzLgpjbGFzcyBIYXNoaW5nIHsKICAvLy8gSWYgYW4gaW50ZWdlciBpcyBtYXNrZWQgYnkgdGhpcyBjb25zdGFudCwgdGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlCiAgLy8vIGluIFNtaSByYW5nZS4KICBzdGF0aWMgY29uc3QgaW50IFNNSV9NQVNLID0gMHgzZmZmZmZmZjsKCiAgLy8vIE1peCB0aGUgYml0cyBvZiBbdmFsdWVdIGFuZCBtZXJnZSB0aGVtIHdpdGggW2V4aXN0aW5nXS4KICBzdGF0aWMgaW50IG1peEhhc2hDb2RlQml0cyhpbnQgZXhpc3RpbmcsIGludCB2YWx1ZSkgewogICAgLy8gU3ByZWFkIHRoZSBiaXRzIG9mIHZhbHVlLiBUcnkgdG8gc3RheSBpbiB0aGUgMzAtYml0IHJhbmdlIHRvCiAgICAvLyBhdm9pZCBvdmVyZmxvd2luZyBpbnRvIGEgbW9yZSBleHBlbnNpdmUgaW50ZWdlciByZXByZXNlbnRhdGlvbi4KICAgIGludCBoID0gdmFsdWUgJiAweDFmZmZmZmZmOwogICAgaCArPSAoKGggJiAweDNmZmYpIDw8IDE1KSBeIDB4MWZmZmNkN2Q7CiAgICBoIF49IChoID4+IDEwKTsKICAgIGggKz0gKChoICYgMHgzZmZmZmZmKSA8PCAzKTsKICAgIGggXj0gKGggPj4gNik7CiAgICBoICs9ICgoaCAmIDB4N2ZmZmZmZikgPDwgMikgKyAoKGggJiAweDdmZmYpIDw8IDE0KTsKICAgIGggXj0gKGggPj4gMTYpOwogICAgLy8gQ29tYmluZSB0aGUgdHdvIGhhc2ggdmFsdWVzLgogICAgaW50IGhpZ2ggPSBleGlzdGluZyA+PiAxNTsKICAgIGludCBsb3cgPSBleGlzdGluZyAmIDB4N2ZmZjsKICAgIHJldHVybiAoKGhpZ2ggKiAxMykgXiAobG93ICogOTk3KSBeIGgpICYgU01JX01BU0s7CiAgfQoKICAvLy8gTWl4IHRoZSBiaXRzIG9mIGBvYmplY3QuaGFzaENvZGVgIHdpdGggW2V4aXN0aW5nXS4KICBzdGF0aWMgaW50IG9iamVjdEhhc2goT2JqZWN0IG9iamVjdCwgW2ludCBleGlzdGluZyA9IDBdKSB7CiAgICByZXR1cm4gbWl4SGFzaENvZGVCaXRzKGV4aXN0aW5nLCBvYmplY3QuaGFzaENvZGUpOwogIH0KCiAgLy8vIE1peCB0aGUgYml0cyBvZiBgLmhhc2hDb2RlYCBhbGwgbm9uLW51bGwgb2JqZWN0cy4KICBzdGF0aWMgaW50IG9iamVjdHNIYXNoKE9iamVjdCBvYmoxLAogICAgICBbT2JqZWN0IG9iajIsIE9iamVjdCBvYmozLCBPYmplY3Qgb2JqNCwgT2JqZWN0IG9iajVdKSB7CiAgICBpbnQgaGFzaCA9IDA7CiAgICBpZiAob2JqNSAhPSBudWxsKSBoYXNoID0gb2JqZWN0SGFzaChvYmo1LCBoYXNoKTsKICAgIGlmIChvYmo0ICE9IG51bGwpIGhhc2ggPSBvYmplY3RIYXNoKG9iajQsIGhhc2gpOwogICAgaWYgKG9iajMgIT0gbnVsbCkgaGFzaCA9IG9iamVjdEhhc2gob2JqMywgaGFzaCk7CiAgICBpZiAob2JqMiAhPSBudWxsKSBoYXNoID0gb2JqZWN0SGFzaChvYmoyLCBoYXNoKTsKICAgIHJldHVybiBvYmplY3RIYXNoKG9iajEsIGhhc2gpOwogIH0KCiAgLy8vIE1peCB0aGUgYml0cyBvZiB0aGUgZWxlbWVudCBoYXNoIGNvZGVzIG9mIFtsaXN0XSB3aXRoIFtleGlzdGluZ10uCiAgc3RhdGljIGludCBsaXN0SGFzaChMaXN0IGxpc3QsIFtpbnQgZXhpc3RpbmcgPSAwXSkgewogICAgaW50IGggPSBleGlzdGluZzsKICAgIGlmIChsaXN0ICE9IG51bGwpIHsKICAgICAgaW50IGxlbmd0aCA9IGxpc3QubGVuZ3RoOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgaCA9IG1peEhhc2hDb2RlQml0cyhoLCBsaXN0W2ldLmhhc2hDb2RlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGg7CiAgfQoKICAvLy8gTWl4IHRoZSBiaXRzIG9mIHRoZSBlbGVtZW50IGhhc2ggY29kZXMgb2YgW2l0ZXJhYmxlXSB3aXRoIFtleGlzdGluZ10uCiAgc3RhdGljIGludCBzZXRIYXNoPEU+KEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBbaW50IGV4aXN0aW5nID0gMF0pIHsKICAgIGludCBoID0gZXhpc3Rpbmc7CiAgICBpZiAoaXRlcmFibGUgIT0gbnVsbCkgewogICAgICBmb3IgKEUgZSBpbiBpdGVyYWJsZSkgewogICAgICAgIGggKz0gb2JqZWN0c0hhc2goZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBoICYgU01JX01BU0s7CiAgfQoKICAvLy8gTWl4IHRoZSBiaXRzIG9mIHRoZSBoYXNoIGNvZGVzIG9mIHRoZSB1bm9yZGVyZWQga2V5L3ZhbHVlIGZyb20gW21hcF0gd2l0aAogIC8vLyBbZXhpc3RpbmddLgogIHN0YXRpYyBpbnQgdW5vcmRlcmVkTWFwSGFzaChNYXAgbWFwLCBbaW50IGV4aXN0aW5nID0gMF0pIHsKICAgIGlmIChtYXAubGVuZ3RoID09IDApIHJldHVybiBleGlzdGluZzsKICAgIExpc3Q8aW50PiBoYXNoQ29kZXMgPSBMaXN0KG1hcC5sZW5ndGgpOwogICAgaW50IGkgPSAwOwogICAgZm9yICh2YXIgZW50cnkgaW4gbWFwLmVudHJpZXMpIHsKICAgICAgaGFzaENvZGVzW2krK10gPSBvYmplY3RIYXNoKGVudHJ5LmtleSwgb2JqZWN0SGFzaChlbnRyeS52YWx1ZSkpOwogICAgfQogICAgaGFzaENvZGVzLnNvcnQoKTsKICAgIGludCBoID0gZXhpc3Rpbmc7CiAgICBmb3IgKGludCBoYXNoQ29kZSBpbiBoYXNoQ29kZXMpIHsKICAgICAgaCA9IG1peEhhc2hDb2RlQml0cyhoLCBoYXNoQ29kZSk7CiAgICB9CiAgICByZXR1cm4gaDsKICB9CgogIC8vLyBNaXggdGhlIGJpdHMgb2YgdGhlIGtleS92YWx1ZSBoYXNoIGNvZGVzIGZyb20gW21hcF0gd2l0aCBbZXhpc3RpbmddLgogIHN0YXRpYyBpbnQgbWFwSGFzaChNYXAgbWFwLCBbaW50IGV4aXN0aW5nID0gMF0pIHsKICAgIGludCBoID0gZXhpc3Rpbmc7CiAgICBmb3IgKHZhciBrZXkgaW4gbWFwLmtleXMpIHsKICAgICAgaCA9IG1peEhhc2hDb2RlQml0cyhoLCBrZXkuaGFzaENvZGUpOwogICAgICBoID0gbWl4SGFzaENvZGVCaXRzKGgsIG1hcFtrZXldLmhhc2hDb2RlKTsKICAgIH0KICAgIHJldHVybiBoOwogIH0KfQoKYm9vbCBlcXVhbEVsZW1lbnRzPEU+KExpc3Q8RT4gYSwgTGlzdDxFPiBiKSB7CiAgaWYgKGlkZW50aWNhbChhLCBiKSkgcmV0dXJuIHRydWU7CiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTsKICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTsKICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgYS5sZW5ndGg7IGluZGV4KyspIHsKICAgIGlmIChhW2luZGV4XSAhPSBiW2luZGV4XSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9Cgpib29sIGVxdWFsU2V0czxFPihTZXQ8RT4gYSwgU2V0PEU+IGIpIHsKICBpZiAoaWRlbnRpY2FsKGEsIGIpKSByZXR1cm4gdHJ1ZTsKICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogIHJldHVybiBhLmxlbmd0aCA9PSBiLmxlbmd0aCAmJiBhLmNvbnRhaW5zQWxsKGIpICYmIGIuY29udGFpbnNBbGwoYSk7Cn0KCmJvb2wgZXF1YWxNYXBzPEssIFY+KE1hcDxLLCBWPiBhLCBNYXA8SywgVj4gYikgewogIGlmIChpZGVudGljYWwoYSwgYikpIHJldHVybiB0cnVlOwogIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgZm9yIChLIGtleSBpbiBhLmtleXMpIHsKICAgIGlmIChhW2tleV0gIT0gYltrZXldKSByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB0cnVlOwp9CgovLy8gRmlsZSBuYW1lIHByZWZpeCB1c2VkIHRvIHNob3J0ZW4gdGhlIGZpbGUgbmFtZSBpbiBzdGFjayB0cmFjZXMgcHJpbnRlZCBieQovLy8gW3RyYWNlXS4KU3RyaW5nIHN0YWNrVHJhY2VGaWxlUHJlZml4ID0gbnVsbDsKCi8vLyBXcml0ZXMgdGhlIGNoYXJhY3RlcnMgb2YgW3N0cmluZ10gb24gW2J1ZmZlcl0uICBUaGUgY2hhcmFjdGVycwovLy8gYXJlIGVzY2FwZWQgYXMgc3VpdGFibGUgZm9yIEphdmFTY3JpcHQgYW5kIEpTT04uICBbYnVmZmVyXSBpcwovLy8gYW55dGhpbmcgd2hpY2ggc3VwcG9ydHMgWzp3cml0ZTpdIGFuZCBbOndyaXRlQ2hhckNvZGU6XSwgZm9yIGV4YW1wbGUsCi8vLyBbU3RyaW5nQnVmZmVyXS4gIE5vdGUgdGhhdCBKUyBzdXBwb3J0cyBceG5uIGFuZCBcdW5ubm4gd2hlcmVhcyBKU09OIG9ubHkKLy8vIHN1cHBvcnRzIHRoZSBcdW5ubm4gbm90YXRpb24uICBUaGVyZWZvcmUgd2UgdXNlIHRoZSBcdW5ubm4gbm90YXRpb24uCnZvaWQgd3JpdGVKc29uRXNjYXBlZENoYXJzT24oU3RyaW5nIHN0cmluZywgYnVmZmVyKSB7CiAgdm9pZCBhZGRDb2RlVW5pdEVzY2FwZWQodmFyIGJ1ZmZlciwgaW50IGNvZGUpIHsKICAgIGFzc2VydChjb2RlIDwgMHgxMDAwMCk7CiAgICBidWZmZXIud3JpdGUocidcdScpOwogICAgaWYgKGNvZGUgPCAweDEwMDApIHsKICAgICAgYnVmZmVyLndyaXRlKCcwJyk7CiAgICAgIGlmIChjb2RlIDwgMHgxMDApIHsKICAgICAgICBidWZmZXIud3JpdGUoJzAnKTsKICAgICAgICBpZiAoY29kZSA8IDB4MTApIHsKICAgICAgICAgIGJ1ZmZlci53cml0ZSgnMCcpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYnVmZmVyLndyaXRlKGNvZGUudG9SYWRpeFN0cmluZygxNikpOwogIH0KCiAgdm9pZCB3cml0ZUVzY2FwZWRPbihTdHJpbmcgc3RyaW5nLCB2YXIgYnVmZmVyKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykgewogICAgICBpbnQgY29kZSA9IHN0cmluZy5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY29kZSA9PSAkRFEpIHsKICAgICAgICBidWZmZXIud3JpdGUocidcIicpOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJFRBQikgewogICAgICAgIGJ1ZmZlci53cml0ZShyJ1x0Jyk7CiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAkTEYpIHsKICAgICAgICBidWZmZXIud3JpdGUocidcbicpOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJENSKSB7CiAgICAgICAgYnVmZmVyLndyaXRlKHInXHInKTsKICAgICAgfSBlbHNlIGlmIChjb2RlID09ICRERUwpIHsKICAgICAgICBhZGRDb2RlVW5pdEVzY2FwZWQoYnVmZmVyLCAkREVMKTsKICAgICAgfSBlbHNlIGlmIChjb2RlID09ICRMUykgewogICAgICAgIC8vIFRoaXMgVW5pY29kZSBsaW5lIHRlcm1pbmF0b3IgYW5kICRQUyBhcmUgaW52YWxpZCBpbiBKUyBzdHJpbmcKICAgICAgICAvLyBsaXRlcmFscy4KICAgICAgICBhZGRDb2RlVW5pdEVzY2FwZWQoYnVmZmVyLCAkTFMpOyAvLyAweDIwMjguCiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAkUFMpIHsKICAgICAgICBhZGRDb2RlVW5pdEVzY2FwZWQoYnVmZmVyLCAkUFMpOyAvLyAweDIwMjkuCiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAkQkFDS1NMQVNIKSB7CiAgICAgICAgYnVmZmVyLndyaXRlKHInXFwnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoY29kZSA8IDB4MjApIHsKICAgICAgICAgIGFkZENvZGVVbml0RXNjYXBlZChidWZmZXIsIGNvZGUpOwogICAgICAgICAgLy8gV2UgZW1pdCBERUwgKEFTQ0lJIDB4N2YpIGFzIGFuIGVzY2FwZSBiZWNhdXNlIGl0IHdvdWxkIGJlIGNvbmZ1c2luZwogICAgICAgICAgLy8gdG8gaGF2ZSBpdCB1bmVzY2FwZWQgaW4gYSBzdHJpbmcgbGl0ZXJhbC4gIFdlIGFsc28gZXNjYXBlCiAgICAgICAgICAvLyBldmVyeXRoaW5nIGFib3ZlIDB4N2YgYmVjYXVzZSB0aGF0IG1lYW5zIHdlIGRvbid0IGhhdmUgdG8gd29ycnkKICAgICAgICAgIC8vIGFib3V0IHdoZXRoZXIgdGhlIHdlYiBzZXJ2ZXIgc2VydmVzIGl0IHVwIGFzIExhdGluMSBvciBVVEYtOC4KICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPCAweDdmKSB7CiAgICAgICAgICBidWZmZXIud3JpdGVDaGFyQ29kZShjb2RlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gVGhpcyB3aWxsIG91dHB1dCBzdXJyb2dhdGUgcGFpcnMgaW4gdGhlIGZvcm0gXHVkeHh4XHVkeXl5LCByYXRoZXIKICAgICAgICAgIC8vIHRoYW4gdGhlIG1vcmUgbG9naWNhbCBcdXt6enp6enp9LiAgVGhpcyBzaG91bGQgd29yayBpbiBKYXZhU2NyaXB0CiAgICAgICAgICAvLyAoZXNwZWNpYWxseSBvbGQgVUNTLTIgYmFzZWQgaW1wbGVtZW50YXRpb25zKSBhbmQgaXMgdGhlIG9ubHkKICAgICAgICAgIC8vIGZvcm1hdCB0aGF0IGlzIGFsbG93ZWQgaW4gSlNPTi4KICAgICAgICAgIGFkZENvZGVVbml0RXNjYXBlZChidWZmZXIsIGNvZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHsKICAgIGludCBjb2RlID0gc3RyaW5nLmNvZGVVbml0QXQoaSk7CiAgICBpZiAoY29kZSA8IDB4MjAgfHwKICAgICAgICBjb2RlID09ICRERUwgfHwKICAgICAgICBjb2RlID09ICREUSB8fAogICAgICAgIGNvZGUgPT0gJExTIHx8CiAgICAgICAgY29kZSA9PSAkUFMgfHwKICAgICAgICBjb2RlID09ICRCQUNLU0xBU0ggfHwKICAgICAgICBjb2RlID49IDB4ODApIHsKICAgICAgd3JpdGVFc2NhcGVkT24oc3RyaW5nLCBidWZmZXIpOwogICAgICByZXR1cm47CiAgICB9CiAgfQogIGJ1ZmZlci53cml0ZShzdHJpbmcpOwp9CgppbnQgY29tcHV0ZUhhc2hDb2RlKHBhcnQxLCBbcGFydDIsIHBhcnQzLCBwYXJ0NCwgcGFydDVdKSB7CiAgcmV0dXJuIChwYXJ0MS5oYXNoQ29kZSBeCiAgICAgICAgICBwYXJ0Mi5oYXNoQ29kZSBeCiAgICAgICAgICBwYXJ0My5oYXNoQ29kZSBeCiAgICAgICAgICBwYXJ0NC5oYXNoQ29kZSBeCiAgICAgICAgICBwYXJ0NS5oYXNoQ29kZSkgJgogICAgICAweDNmZmZmZmZmOwp9CgpTdHJpbmcgbW9kaWZpZXJzVG9TdHJpbmcoCiAgICB7Ym9vbCBpc1N0YXRpYzogZmFsc2UsCiAgICBib29sIGlzQWJzdHJhY3Q6IGZhbHNlLAogICAgYm9vbCBpc0ZpbmFsOiBmYWxzZSwKICAgIGJvb2wgaXNWYXI6IGZhbHNlLAogICAgYm9vbCBpc0NvbnN0OiBmYWxzZSwKICAgIGJvb2wgaXNGYWN0b3J5OiBmYWxzZSwKICAgIGJvb2wgaXNFeHRlcm5hbDogZmFsc2UsCiAgICBib29sIGlzQ292YXJpYW50OiBmYWxzZX0pIHsKICBMaW5rQnVpbGRlcjxTdHJpbmc+IGJ1aWxkZXIgPSBuZXcgTGlua0J1aWxkZXI8U3RyaW5nPigpOwogIGlmIChpc1N0YXRpYykgYnVpbGRlci5hZGRMYXN0KCdzdGF0aWMnKTsKICBpZiAoaXNBYnN0cmFjdCkgYnVpbGRlci5hZGRMYXN0KCdhYnN0cmFjdCcpOwogIGlmIChpc0ZpbmFsKSBidWlsZGVyLmFkZExhc3QoJ2ZpbmFsJyk7CiAgaWYgKGlzVmFyKSBidWlsZGVyLmFkZExhc3QoJ3ZhcicpOwogIGlmIChpc0NvbnN0KSBidWlsZGVyLmFkZExhc3QoJ2NvbnN0Jyk7CiAgaWYgKGlzRmFjdG9yeSkgYnVpbGRlci5hZGRMYXN0KCdmYWN0b3J5Jyk7CiAgaWYgKGlzRXh0ZXJuYWwpIGJ1aWxkZXIuYWRkTGFzdCgnZXh0ZXJuYWwnKTsKICBpZiAoaXNDb3ZhcmlhbnQpIGJ1aWxkZXIuYWRkTGFzdCgnY292YXJpYW50Jyk7CiAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBidWlsZGVyLnRvTGluayhjb25zdCBMaW5rPFN0cmluZz4oKSkucHJpbnRPbihidWZmZXIsICcsICcpOwogIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKfQoKY2xhc3MgUGFpcjxBLCBCPiB7CiAgZmluYWwgQSBhOwogIGZpbmFsIEIgYjsKCiAgUGFpcih0aGlzLmEsIHRoaXMuYik7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gMTMgKiBhLmhhc2hDb2RlICsgMTcgKiBiLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KHZhciBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBQYWlyKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gYSA9PSBvdGhlci5hICYmIGIgPT0gb3RoZXIuYjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICcoJGEsJGIpJzsKfQoKaW50IGxvbmdlc3RDb21tb25QcmVmaXhMZW5ndGgoTGlzdCBhLCBMaXN0IGIpIHsKICBpbnQgaW5kZXggPSAwOwogIGZvciAoOyBpbmRleCA8IGEubGVuZ3RoICYmIGluZGV4IDwgYi5sZW5ndGg7IGluZGV4KyspIHsKICAgIGlmIChhW2luZGV4XSAhPSBiW2luZGV4XSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgcmV0dXJuIGluZGV4Owp9CgovLy8gUmV0dXJucyBbc3VnZ2VzdGVkTmFtZV0gaWYgaXQgaXMgbm90IGluIFt1c2VkTmFtZXNdLiBPdGhlcndpc2UgY29uY2F0ZW5hdGVzCi8vLyB0aGUgc21hbGxlc3QgbnVtYmVyIHRoYXQgbWFrZXMgaXQgbm90IGFwcGVhciBpbiBbdXNlZE5hbWVzXS4KLy8vCi8vLyBBZGRzIHRoZSByZXN1bHQgdG8gW3VzZWROYW1lc10uClN0cmluZyBtYWtlVW5pcXVlKFN0cmluZyBzdWdnZXN0ZWROYW1lLCBTZXQ8U3RyaW5nPiB1c2VkTmFtZXMsCiAgICBbU3RyaW5nIHNlcGFyYXRvciA9ICcnXSkgewogIFN0cmluZyByZXN1bHQgPSBzdWdnZXN0ZWROYW1lOwogIGlmICh1c2VkTmFtZXMuY29udGFpbnMoc3VnZ2VzdGVkTmFtZSkpIHsKICAgIGludCBjb3VudGVyID0gMDsKICAgIHdoaWxlICh1c2VkTmFtZXMuY29udGFpbnMocmVzdWx0KSkgewogICAgICBjb3VudGVyKys7CiAgICAgIHJlc3VsdCA9ICIkc3VnZ2VzdGVkTmFtZSRzZXBhcmF0b3IkY291bnRlciI7CiAgICB9CiAgfQogIHVzZWROYW1lcy5hZGQocmVzdWx0KTsKICByZXR1cm4gcmVzdWx0Owp9CoEoAE5OPAEWATlNARgWFgEZAS4QTxQqAT44REcgLBQhEzgUJB8hNwQBOT03BAE4Jj4SNTU1NSMEAUg3FhggKTIIBg4EAUxEFhweHQgGGQQBUBI9KiwPJUcGFhYmKAYOBAFLNBYgLDEGDgQCAS4kLCozIBQGBA8CASgkLEcCATEkLCoaKAQPAgFODSQBQ0JKTUk2MhwZGRkaGxsdCggGKgQBMy4nGR0hHSAdIB0hKiBJFTQgNCcdDxssUUdNSyImEU9PSi0sCggGBAEsJRcYFxcXHhgmDgYEGAIBOxsbGxscEgIBGhscGRcZGxwgOysvKSUpLS8xLD4cAgETDQ0BGAEMOQEMIC0mKQQBDCICATAROiANBgQQAgFQQQQkPx8hKxUpETMGBBkRAgEjcGFja2FnZTpjb21waWxlci9zcmMvdXRpbC91dGlsLmRhcnQzc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdXRpbC9pbmRlbnRhdGlvbi5kYXJ0jnQvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0MmpzLnV0aWw7CgovLy8gSW5kZW50YXRpb24gdXRpbGl0eSBjbGFzcy4gU2hvdWxkIGJlIHVzZWQgYXMgYSBtaXhpbiBpbiBtb3N0IGNhc2VzLgpjbGFzcyBJbmRlbnRhdGlvbiB7CiAgLy8vIFRoZSBjdXJyZW50IGluZGVudGF0aW9uIHN0cmluZy4KICBTdHJpbmcgZ2V0IGluZGVudGF0aW9uIHsKICAgIC8vIExhemlseSBhZGQgbmV3IGluZGVudGF0aW9uIHN0cmluZ3MgYXMgcmVxdWlyZWQuCiAgICBmb3IgKGludCBpID0gX2luZGVudExpc3QubGVuZ3RoOyBpIDw9IF9pbmRlbnRMZXZlbDsgaSsrKSB7CiAgICAgIF9pbmRlbnRMaXN0LmFkZChfaW5kZW50TGlzdFtpIC0gMV0gKyBpbmRlbnRhdGlvblVuaXQpOwogICAgfQogICAgcmV0dXJuIF9pbmRlbnRMaXN0W19pbmRlbnRMZXZlbF07CiAgfQoKICAvLy8gVGhlIGN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWwuCiAgaW50IF9pbmRlbnRMZXZlbCA9IDA7CgogIC8vLyBBIGNhY2hlIG9mIGFsbCBpbmRlbnRhdGlvbiBzdHJpbmdzIHVzZWQgc28gZmFyLgogIC8vLyBBbHdheXMgYXQgbGVhc3Qgb2YgbGVuZ3RoIDEuCiAgTGlzdDxTdHJpbmc+IF9pbmRlbnRMaXN0ID0gPFN0cmluZz5bIiJdOwoKICAvLy8gVGhlIGluZGVudGF0aW9uIHVuaXQsIGRlZmF1bHRpbmcgdG8gdHdvIHNwYWNlcy4gTWF5IGJlIG92ZXJ3cml0dGVuLgogIFN0cmluZyBfaW5kZW50YXRpb25Vbml0ID0gIiAgIjsKICBTdHJpbmcgZ2V0IGluZGVudGF0aW9uVW5pdCA9PiBfaW5kZW50YXRpb25Vbml0OwogIHNldCBpbmRlbnRhdGlvblVuaXQoU3RyaW5nIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgIT0gX2luZGVudGF0aW9uVW5pdCkgewogICAgICBfaW5kZW50YXRpb25Vbml0ID0gdmFsdWU7CiAgICAgIF9pbmRlbnRMaXN0ID0gPFN0cmluZz5bIiJdOwogICAgfQogIH0KCiAgLy8vIEluY3JlYXNlcyB0aGUgY3VycmVudCBsZXZlbCBvZiBpbmRlbnRhdGlvbi4KICB2b2lkIGluZGVudE1vcmUoKSB7CiAgICBfaW5kZW50TGV2ZWwrKzsKICB9CgogIC8vLyBEZWNyZWFzZXMgdGhlIGN1cnJlbnQgbGV2ZWwgb2YgaW5kZW50YXRpb24uCiAgdm9pZCBpbmRlbnRMZXNzKCkgewogICAgX2luZGVudExldmVsLS07CiAgfQoKICAvLy8gQ2FsbHMgW2ZdIHdpdGggb25lIG1vcmUgaW5kZW50YXRpb24gbGV2ZWwsIHJlc3RvcmluZyBpbmRlbnRhdGlvbiBjb250ZXh0CiAgLy8vIHVwb24gcmV0dXJuIG9mIFtmXSBhbmQgcmV0dXJuaW5nIGl0cyByZXN1bHQuCiAgaW5kZW50QmxvY2soRnVuY3Rpb24gZikgewogICAgaW5kZW50TW9yZSgpOwogICAgdmFyIHJlc3VsdCA9IGYoKTsKICAgIGluZGVudExlc3MoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBUYWdnaW5nPE4+IGltcGxlbWVudHMgSW5kZW50YXRpb24gewogIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBMaW5rPFN0cmluZz4gdGFnU3RhY2sgPSBjb25zdCBMaW5rPFN0cmluZz4oKTsKCiAgdm9pZCBwdXNoVGFnKFN0cmluZyB0YWcpIHsKICAgIHRhZ1N0YWNrID0gdGFnU3RhY2sucHJlcGVuZCh0YWcpOwogICAgaW5kZW50TW9yZSgpOwogIH0KCiAgU3RyaW5nIHBvcFRhZygpIHsKICAgIGFzc2VydCghdGFnU3RhY2suaXNFbXB0eSk7CiAgICBTdHJpbmcgdGFnID0gdGFnU3RhY2suaGVhZDsKICAgIHRhZ1N0YWNrID0gdGFnU3RhY2sudGFpbDsKICAgIGluZGVudExlc3MoKTsKICAgIHJldHVybiB0YWc7CiAgfQoKICAvLy8gQWRkcyBnaXZlbiBzdHJpbmcgdG8gcmVzdWx0IHN0cmluZy4KICB2b2lkIGFkZChTdHJpbmcgc3RyaW5nKSB7CiAgICBzYi53cml0ZShzdHJpbmcpOwogIH0KCiAgLy8vIEFkZHMgZGVmYXVsdCBwYXJhbWV0ZXJzIGZvciBbbm9kZV0gaW50byBbcGFyYW1zXS4KICB2b2lkIGFkZERlZmF1bHRQYXJhbWV0ZXJzKE4gbm9kZSwgTWFwIHBhcmFtcykge30KCiAgLy8vIEFkZHMgZ2l2ZW4gbm9kZSB0eXBlIHRvIHJlc3VsdCBzdHJpbmcuCiAgLy8vIFRoZSBtZXRob2QgIm9wZW5zIiB0aGUgbm9kZSwgbWVhbmluZyB0aGF0IGFsbCBvdXRwdXQgYWZ0ZXIgY2FsbGluZwogIC8vLyB0aGlzIG1ldGhvZCBhbmQgYmVmb3JlIGNhbGxpbmcgY2xvc2VOb2RlKCkgd2lsbCByZXByZXNlbnQgY29udGVudHMKICAvLy8gb2YgZ2l2ZW4gbm9kZS4KICB2b2lkIG9wZW5Ob2RlKE4gbm9kZSwgU3RyaW5nIHR5cGUsIFtNYXAgcGFyYW1zXSkgewogICAgaWYgKHBhcmFtcyA9PSBudWxsKSBwYXJhbXMgPSBuZXcgTWFwKCk7CiAgICBhZGRDdXJyZW50SW5kZW50KCk7CiAgICBzYi53cml0ZSgiPCIpOwogICAgYWRkRGVmYXVsdFBhcmFtZXRlcnMobm9kZSwgcGFyYW1zKTsKICAgIGFkZFR5cGVXaXRoUGFyYW1zKHR5cGUsIHBhcmFtcyk7CiAgICBzYi53cml0ZSgiPlxuIik7CiAgICBwdXNoVGFnKHR5cGUpOwogIH0KCiAgLy8vIEFkZHMgZ2l2ZW4gbm9kZSB0byByZXN1bHQgc3RyaW5nLgogIHZvaWQgb3BlbkFuZENsb3NlTm9kZShOIG5vZGUsIFN0cmluZyB0eXBlLCBbTWFwIHBhcmFtc10pIHsKICAgIGlmIChwYXJhbXMgPT0gbnVsbCkgcGFyYW1zID0ge307CiAgICBhZGRDdXJyZW50SW5kZW50KCk7CiAgICBzYi53cml0ZSgiPCIpOwogICAgYWRkRGVmYXVsdFBhcmFtZXRlcnMobm9kZSwgcGFyYW1zKTsKICAgIGFkZFR5cGVXaXRoUGFyYW1zKHR5cGUsIHBhcmFtcyk7CiAgICBzYi53cml0ZSgiLz5cbiIpOwogIH0KCiAgLy8vIENsb3NlcyBjdXJyZW50IG5vZGUgdHlwZS4KICB2b2lkIGNsb3NlTm9kZSgpIHsKICAgIFN0cmluZyB0YWcgPSBwb3BUYWcoKTsKICAgIGFkZEN1cnJlbnRJbmRlbnQoKTsKICAgIHNiLndyaXRlKCI8LyIpOwogICAgYWRkVHlwZVdpdGhQYXJhbXModGFnKTsKICAgIHNiLndyaXRlKCI+XG4iKTsKICB9CgogIHZvaWQgYWRkVHlwZVdpdGhQYXJhbXMoU3RyaW5nIHR5cGUsIFtNYXAgcGFyYW1zXSkgewogICAgaWYgKHBhcmFtcyA9PSBudWxsKSBwYXJhbXMgPSBuZXcgTWFwKCk7CiAgICBzYi53cml0ZSgiJHt0eXBlfSIpOwogICAgcGFyYW1zLmZvckVhY2goKGssIHYpIHsKICAgICAgU3RyaW5nIHZhbHVlOwogICAgICBpZiAodiAhPSBudWxsKSB7CiAgICAgICAgU3RyaW5nIHN0ciA9IHZhbHVlVG9TdHJpbmcodik7CiAgICAgICAgdmFsdWUgPSBzdHIKICAgICAgICAgICAgLnJlcGxhY2VBbGwoIjwiLCAiJmx0OyIpCiAgICAgICAgICAgIC5yZXBsYWNlQWxsKCI+IiwgIiZndDsiKQogICAgICAgICAgICAucmVwbGFjZUFsbCgnIicsICInIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFsdWUgPSAiW251bGxdIjsKICAgICAgfQogICAgICBzYi53cml0ZSgnICRrPSIkdmFsdWUiJyk7CiAgICB9KTsKICB9CgogIHZvaWQgYWRkQ3VycmVudEluZGVudCgpIHsKICAgIHNiLndyaXRlKGluZGVudGF0aW9uKTsKICB9CgogIC8vLyBDb252ZXJ0cyBhIHBhcmFtZXRlciB2YWx1ZSBpbnRvIGEgc3RyaW5nLgogIFN0cmluZyB2YWx1ZVRvU3RyaW5nKHZhciB2YWx1ZSkgPT4gdmFsdWU7Cn0KgIsATk48ARYBSBQmGzc/PQYmBAElGAE2IysBSiIyJiUgIgYEATIWFAQBMhYUBAFPMxwSFhITBAIBMygwAR0mEgQBFB8gHhIQBAEqHBYEATgzAS1JSRU1LBgTKCUVEwQBKD0lGBMoJRYEASAVGxgUHBUEATYsGRwUFycUJSUjDxoIIAgEARwbBAEwLAIBKnBhY2thZ2U6Y29tcGlsZXIvc3JjL3V0aWwvaW5kZW50YXRpb24uZGFydCNzZGtyb290Oi9wa2cva2VybmVsL2xpYi9rZXJuZWwuZGFydIpALy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBDb252ZW50aW9ucyBmb3IgcGF0aHM6Ci8vLwovLy8gLSBVc2UgdGhlIFtVcmldIGNsYXNzIGZvciBwYXRocyB0aGF0IG1heSBoYXZlIHRoZSBgZmlsZWAsIGBkYXJ0YCBvcgovLy8gICBgcGFja2FnZWAgc2NoZW1lLiAgTmV2ZXIgdXNlIFtVcmldIGZvciByZWxhdGl2ZSBwYXRocy4KLy8vIC0gVXNlIFtTdHJpbmddcyBmb3IgYWxsIGZpbGVuYW1lcyBhbmQgcGF0aHMgdGhhdCBoYXZlIG5vIHNjaGVtZSBwcmVmaXguCi8vLyAtIE5ldmVyIHRyYW5zbGF0ZSBhIGBkYXJ0OmAgb3IgYHBhY2thZ2U6YCBVUkkgaW50byBhIGBmaWxlOmAgVVJJLCBpbnN0ZWFkCi8vLyAgIHRyYW5zbGF0ZSBpdCB0byBhIFtTdHJpbmddIGlmIHRoZSBmaWxlIHN5c3RlbSBwYXRoIGlzIG5lZWRlZC4KLy8vIC0gT25seSB1c2UgW0ZpbGVdIGZyb20gZGFydDppbyBhdCB0aGUgbGFzdCBtb21lbnQgd2hlbiBpdCBpcyBuZWVkZWQuCi8vLwpsaWJyYXJ5IGtlcm5lbDsKCmltcG9ydCAnYXN0LmRhcnQnOwppbXBvcnQgJ2JpbmFyeS9hc3RfdG9fYmluYXJ5LmRhcnQnOwppbXBvcnQgJ2JpbmFyeS9hc3RfZnJvbV9iaW5hcnkuZGFydCc7CmltcG9ydCAnZGFydDphc3luYyc7CmltcG9ydCAnZGFydDppbyc7CmltcG9ydCAndGV4dC9hc3RfdG9fdGV4dC5kYXJ0JzsKCmV4cG9ydCAnYXN0LmRhcnQnOwoKQ29tcG9uZW50IGxvYWRDb21wb25lbnRGcm9tQmluYXJ5KFN0cmluZyBwYXRoLCBbQ29tcG9uZW50IGNvbXBvbmVudF0pIHsKICBMaXN0PGludD4gYnl0ZXMgPSBuZXcgRmlsZShwYXRoKS5yZWFkQXNCeXRlc1N5bmMoKTsKICByZXR1cm4gbG9hZENvbXBvbmVudEZyb21CeXRlcyhieXRlcywgY29tcG9uZW50KTsKfQoKQ29tcG9uZW50IGxvYWRDb21wb25lbnRGcm9tQnl0ZXMoTGlzdDxpbnQ+IGJ5dGVzLCBbQ29tcG9uZW50IGNvbXBvbmVudF0pIHsKICBjb21wb25lbnQgPz89IG5ldyBDb21wb25lbnQoKTsKICBuZXcgQmluYXJ5QnVpbGRlcihieXRlcykucmVhZENvbXBvbmVudChjb21wb25lbnQpOwogIHJldHVybiBjb21wb25lbnQ7Cn0KCkNvbXBvbmVudCBsb2FkQ29tcG9uZW50U291cmNlRnJvbUJ5dGVzKExpc3Q8aW50PiBieXRlcywgW0NvbXBvbmVudCBjb21wb25lbnRdKSB7CiAgY29tcG9uZW50ID8/PSBuZXcgQ29tcG9uZW50KCk7CiAgbmV3IEJpbmFyeUJ1aWxkZXIoYnl0ZXMpLnJlYWRDb21wb25lbnRTb3VyY2UoY29tcG9uZW50KTsKICByZXR1cm4gY29tcG9uZW50Owp9CgpGdXR1cmUgd3JpdGVDb21wb25lbnRUb0JpbmFyeShDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgcGF0aCkgewogIHZhciBzaW5rOwogIGlmIChwYXRoID09ICdudWxsJyB8fCBwYXRoID09ICdzdGRvdXQnKSB7CiAgICBzaW5rID0gc3Rkb3V0Lm5vbkJsb2NraW5nOwogIH0gZWxzZSB7CiAgICBzaW5rID0gbmV3IEZpbGUocGF0aCkub3BlbldyaXRlKCk7CiAgfQoKICB2YXIgZnV0dXJlOwogIHRyeSB7CiAgICBuZXcgQmluYXJ5UHJpbnRlcihzaW5rKS53cml0ZUNvbXBvbmVudEZpbGUoY29tcG9uZW50KTsKICB9IGZpbmFsbHkgewogICAgaWYgKHNpbmsgPT0gc3Rkb3V0Lm5vbkJsb2NraW5nKSB7CiAgICAgIGZ1dHVyZSA9IHNpbmsuZmx1c2goKTsKICAgIH0gZWxzZSB7CiAgICAgIGZ1dHVyZSA9IHNpbmsuY2xvc2UoKTsKICAgIH0KICB9CgogIHJldHVybiBmdXR1cmU7Cn0KCnZvaWQgd3JpdGVMaWJyYXJ5VG9UZXh0KExpYnJhcnkgbGlicmFyeSwge1N0cmluZyBwYXRofSkgewogIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgbmV3IFByaW50ZXIoYnVmZmVyKS53cml0ZUxpYnJhcnlGaWxlKGxpYnJhcnkpOwogIGlmIChwYXRoID09IG51bGwpIHsKICAgIHByaW50KGJ1ZmZlcik7CiAgfSBlbHNlIHsKICAgIG5ldyBGaWxlKHBhdGgpLndyaXRlQXNTdHJpbmdTeW5jKCckYnVmZmVyJyk7CiAgfQp9Cgp2b2lkIHdyaXRlQ29tcG9uZW50VG9UZXh0KENvbXBvbmVudCBjb21wb25lbnQsCiAgICB7U3RyaW5nIHBhdGgsCiAgICBib29sIHNob3dFeHRlcm5hbDogZmFsc2UsCiAgICBib29sIHNob3dPZmZzZXRzOiBmYWxzZSwKICAgIGJvb2wgc2hvd01ldGFkYXRhOiBmYWxzZX0pIHsKICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogIG5ldyBQcmludGVyKGJ1ZmZlciwKICAgICAgICAgIHNob3dFeHRlcm5hbDogc2hvd0V4dGVybmFsLAogICAgICAgICAgc2hvd09mZnNldHM6IHNob3dPZmZzZXRzLAogICAgICAgICAgc2hvd01ldGFkYXRhOiBzaG93TWV0YWRhdGEpCiAgICAgIC53cml0ZUNvbXBvbmVudEZpbGUoY29tcG9uZW50KTsKICBpZiAocGF0aCA9PSBudWxsKSB7CiAgICBwcmludChidWZmZXIpOwogIH0gZWxzZSB7CiAgICBuZXcgRmlsZShwYXRoKS53cml0ZUFzU3RyaW5nU3luYygnJGJ1ZmZlcicpOwogIH0KfQpcAE5OPAEbBEg9TE5ESQQQARMkJhUSIAETAUg2MwIBSyE1FAIBUSE7FAIBQgwsHwsnBAEOCDsOJh0NHQYEARECATosMRYTCzEEAgEvEh4dISwWJiQmJhYTCzEEAgEacGFja2FnZTprZXJuZWwva2VybmVsLmRhcnQgc2Rrcm9vdDovcGtnL2tlcm5lbC9saWIvYXN0LmRhcnTAAwSrLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ0hBTkdJTkcgVEhJUyBGSUxFOgovLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vCi8vLyBJZiB5b3UgYXJlIGFkZGluZy9yZW1vdmluZy9tb2RpZnlpbmcgZmllbGRzL2NsYXNzZXMgb2YgdGhlIEFTVCwgeW91IG11c3QKLy8vIGFsc28gdXBkYXRlIHRoZSBmb2xsb3dpbmcgZmlsZXM6Ci8vLwovLy8gICAtIGJpbmFyeS9hc3RfdG9fYmluYXJ5LmRhcnQKLy8vICAgLSBiaW5hcnkvYXN0X2Zyb21fYmluYXJ5LmRhcnQKLy8vICAgLSB0ZXh0L2FzdF90b190ZXh0LmRhcnQKLy8vICAgLSBjbG9uZS5kYXJ0Ci8vLyAgIC0gYmluYXJ5Lm1kCi8vLyAgIC0gdHlwZV9jaGVja2VyLmRhcnQgKGlmIHJlbGV2YW50KQovLy8KLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk9SIEhBTkRMSU5HCi8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8KLy8vIEFzIGEgcnVsZSBvZiB0aHVtYiwgZXJyb3JzIHRoYXQgY2FuIGJlIGRldGVjdGVkIHN0YXRpY2FsbHkgYXJlIGhhbmRsZWQgYnkKLy8vIHRoZSBmcm9udGVuZCwgdHlwaWNhbGx5IGJ5IHRyYW5zbGF0aW5nIHRoZSBlcnJvbmVvdXMgY29kZSBpbnRvIGEgJ3Rocm93JyBvcgovLy8gYSBjYWxsIHRvICdub1N1Y2hNZXRob2QnLgovLy8KLy8vIEZvciBleGFtcGxlLCB0aGVyZSBhcmUgbm8gYXJpdHkgbWlzbWF0Y2hlcyBpbiBzdGF0aWMgaW52b2NhdGlvbnMsIGFuZAovLy8gdGhlcmUgYXJlIG5vIGRpcmVjdCBpbnZvY2F0aW9ucyBvZiBhIGNvbnN0cnVjdG9yIG9uIGEgYWJzdHJhY3QgY2xhc3MuCi8vLwovLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVElDIHZzIFRPUC1MRVZFTAovLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vCi8vLyBUaGUgdGVybSBgc3RhdGljYCBpbmNsdWRlcyBib3RoIHN0YXRpYyBjbGFzcyBtZW1iZXJzIGFuZCB0b3AtbGV2ZWwgbWVtYmVycy4KLy8vCi8vLyAiU3RhdGljIGNsYXNzIG1lbWJlciIgaXMgdGhlIHByZWZlcnJlZCB0ZXJtIGZvciBub24tdG9wIGxldmVsIHN0YXRpY3MuCi8vLwovLy8gU3RhdGljIGNsYXNzIG1lbWJlcnMgYXJlIG5vdCBsaWZ0ZWQgdG8gdGhlIGxpYnJhcnkgbGV2ZWwgYmVjYXVzZSBtaXJyb3JzCi8vLyBhbmQgc3RhY2sgdHJhY2VzIGNhbiBvYnNlcnZlIHRoYXQgdGhleSBhcmUgY2xhc3MgbWVtYmVycy4KLy8vCi8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRURVUkVTCi8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8KLy8vICJQcm9jZWR1cmUiIGlzIGFuIHVtYnJlbGxhIHRlcm0gZm9yIG1ldGhvZCwgZ2V0dGVyLCBzZXR0ZXIsIGluZGV4LWdldHRlciwKLy8vIGluZGV4LXNldHRlciwgb3BlcmF0b3Igb3ZlcmxvYWRlciwgYW5kIGZhY3RvcnkgY29uc3RydWN0b3IuCi8vLwovLy8gR2VuZXJhdGl2ZSBjb25zdHJ1Y3RvcnMsIGZpZWxkIGluaXRpYWxpemVycywgbG9jYWwgZnVuY3Rpb25zIGFyZSBOT1QKLy8vIHByb2NlZHVyZXMuCi8vLwovLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TRk9STUFUSU9OUwovLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vCi8vLyBBU1QgdHJhbnNmb3JtYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQgdXNpbmcgW1RyZWVOb2RlLnJlcGxhY2VXaXRoXSBvciB0aGUKLy8vIFtUcmFuc2Zvcm1lcl0gdmlzaXRvciBjbGFzcy4KLy8vCi8vLyBVc2UgW1RyYW5zZm9ybWVyXSBmb3IgYnVsayB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBhcmUgbGlrZWx5IHRvIHRyYW5zZm9ybSBsb3RzCi8vLyBvZiBub2RlcywgYW5kIFtUcmVlTm9kZS5yZXBsYWNlV2l0aF0gZm9yIHNwYXJzZSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBtdXRhdGUKLy8vIHJlbGF0aXZlbHkgZmV3IG5vZGVzLiAgT3IgdXNlIHdoaWNoZXZlciBpcyBtb3JlIGNvbnZlbmllbnQuCi8vLwovLy8gVGhlIEFTVCBjYW4gYWxzbyBiZSBtdXRhdGVkIGJ5IGRpcmVjdCBmaWVsZCBtYW5pcHVsYXRpb24sIGJ1dCB0aGUgdXNlciB0aGVuCi8vLyBoYXMgdG8gdXBkYXRlIHBhcmVudCBwb2ludGVycyBtYW51YWxseS4KLy8vCmxpYnJhcnkga2VybmVsLmFzdDsKCmltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IHV0Zjg7CgppbXBvcnQgJ3Zpc2l0b3IuZGFydCc7CmV4cG9ydCAndmlzaXRvci5kYXJ0JzsKCmltcG9ydCAnY2Fub25pY2FsX25hbWUuZGFydCcgc2hvdyBDYW5vbmljYWxOYW1lOwpleHBvcnQgJ2Nhbm9uaWNhbF9uYW1lLmRhcnQnIHNob3cgQ2Fub25pY2FsTmFtZTsKCmltcG9ydCAndHJhbnNmb3JtYXRpb25zL2ZsYWdzLmRhcnQnOwppbXBvcnQgJ3RleHQvYXN0X3RvX3RleHQuZGFydCc7CmltcG9ydCAndHlwZV9hbGdlYnJhLmRhcnQnOwppbXBvcnQgJ3R5cGVfZW52aXJvbm1lbnQuZGFydCc7CmltcG9ydCAnY29xX2Fubm90LmRhcnQnOwoKLy8vIEFueSB0eXBlIG9mIG5vZGUgaW4gdGhlIElSLgphYnN0cmFjdCBjbGFzcyBOb2RlIHsKICBjb25zdCBOb2RlKCk7CgogIGFjY2VwdChWaXNpdG9yIHYpOwogIHZvaWQgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpOwoKICAvLy8gUmV0dXJucyB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUgZm9yIHVzZSBpbiBkZWJ1Z2dpbmcuCiAgLy8vCiAgLy8vIFt0b1N0cmluZ10gc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGVidWdnaW5nIGFuZCBzaG9ydC1ydW5uaW5nIHRlc3QgdG9vbHMKICAvLy8gYXMgaXQgY2FuIGNhdXNlIHNlcmlvdXMgbWVtb3J5IGxlYWtzLgogIC8vLwogIC8vLyBTeW50aGV0aWMgbmFtZXMgYXJlIGNhY2hlZCBnbG9iYWxseSB0byByZXRhaW4gY29uc2lzdGVuY3kgYWNyb3NzIGRpZmZlcmVudAogIC8vLyBbdG9TdHJpbmddIGNhbGxzIChoZW5jZSB0aGUgbWVtb3J5IGxlYWspLgogIC8vLwogIC8vLyBOb2RlcyB0aGF0IGFyZSBuYW1lZCwgc3VjaCBhcyBbQ2xhc3NdIGFuZCBbTWVtYmVyXSwgcmV0dXJuIHRoZWlyCiAgLy8vIChwb3NzaWJseSBzeW50aGVzaXplZCkgbmFtZSwgd2hlcmVhcyBvdGhlciBBU1Qgbm9kZXMgcmV0dXJuIHRoZSBjb21wbGV0ZQogIC8vLyB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZWlyIHN1YnRyZWUuCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gZGVidWdOb2RlVG9TdHJpbmcodGhpcyk7Cn0KCi8vLyBBIG11dGFibGUgQVNUIG5vZGUgd2l0aCBhIHBhcmVudCBwb2ludGVyLgovLy8KLy8vIFRoaXMgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiBbTmFtZV0gYW5kIFtEYXJ0VHlwZV0gbm9kZXMuCmFic3RyYWN0IGNsYXNzIFRyZWVOb2RlIGV4dGVuZHMgTm9kZSB7CiAgc3RhdGljIGludCBfaGFzaENvdW50ZXIgPSAwOwogIGZpbmFsIGludCBoYXNoQ29kZSA9IF9oYXNoQ291bnRlciA9IChfaGFzaENvdW50ZXIgKyAxKSAmIDB4M2ZmZmZmZmY7CiAgc3RhdGljIGNvbnN0IGludCBub09mZnNldCA9IC0xOwoKICBUcmVlTm9kZSBwYXJlbnQ7CgogIC8vLyBPZmZzZXQgaW4gdGhlIHNvdXJjZSBmaWxlIGl0IGNvbWVzIGZyb20uCiAgLy8vCiAgLy8vIFZhbGlkIHZhbHVlcyBhcmUgZnJvbSAwIGFuZCB1cCwgb3IgLTEgKFtub09mZnNldF0pIGlmIHRoZSBmaWxlIG9mZnNldCBpcwogIC8vLyBub3QgYXZhaWxhYmxlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIG5vbmUgaXMgc3BlY2lmaWNhbGx5IHNldCkuCiAgaW50IGZpbGVPZmZzZXQgPSBub09mZnNldDsKCiAgYWNjZXB0KFRyZWVWaXNpdG9yIHYpOwogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KTsKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KTsKCiAgLy8vIFJlcGxhY2VzIFtjaGlsZF0gd2l0aCBbcmVwbGFjZW1lbnRdLgogIC8vLwogIC8vLyBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBBU1QgcmVtYWlucyBhIHRyZWUuICBJbgogIC8vLyBwYXJ0aWN1bGFyLCBbcmVwbGFjZW1lbnRdIHNob3VsZCBiZSBhbiBvcnBoYW4gb3IgYmUgcGFydCBvZiBhbiBvcnBoYW5lZAogIC8vLyBzdWJ0cmVlLgogIC8vLwogIC8vLyBIYXMgbm8gZWZmZWN0IGlmIFtjaGlsZF0gaXMgbm90IGFjdHVhbGx5IGEgY2hpbGQgb2YgdGhpcyBub2RlLgogIC8vLwogIC8vLyBJZiBbcmVwbGFjZW1lbnRdIGlzIGBudWxsYCwgdGhpcyB3aWxsIFtyZW1vdmVdIHRoZSBbY2hpbGRdIG5vZGUuCiAgdm9pZCByZXBsYWNlQ2hpbGQoVHJlZU5vZGUgY2hpbGQsIFRyZWVOb2RlIHJlcGxhY2VtZW50KSB7CiAgICB0cmFuc2Zvcm1DaGlsZHJlbihuZXcgX0NoaWxkUmVwbGFjZXIoY2hpbGQsIHJlcGxhY2VtZW50KSk7CiAgfQoKICAvLy8gSW5zZXJ0cyBhbm90aGVyIG5vZGUgaW4gcGxhY2Ugb2YgdGhpcyBvbmUuCiAgLy8vCiAgLy8vIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIEFTVCByZW1haW5zIGEgdHJlZS4gIEluCiAgLy8vIHBhcnRpY3VsYXIsIFtyZXBsYWNlbWVudF0gc2hvdWxkIGJlIGFuIG9ycGhhbiBvciBiZSBwYXJ0IG9mIGFuIG9ycGhhbmVkCiAgLy8vIHN1YnRyZWUuCiAgLy8vCiAgLy8vIElmIFtyZXBsYWNlbWVudF0gaXMgYG51bGxgLCB0aGlzIHdpbGwgW3JlbW92ZV0gdGhlIG5vZGUuCiAgdm9pZCByZXBsYWNlV2l0aChUcmVlTm9kZSByZXBsYWNlbWVudCkgewogICAgcGFyZW50LnJlcGxhY2VDaGlsZCh0aGlzLCByZXBsYWNlbWVudCk7CiAgICBwYXJlbnQgPSBudWxsOwogIH0KCiAgLy8vIFJlbW92ZXMgdGhpcyBub2RlIGZyb20gdGhlIFtMaXN0XSBpdCBpcyBjdXJyZW50bHkgc3RvcmVkIGluLCBvciBhc3NpZ25zCiAgLy8vIGBudWxsYCB0byB0aGUgZmllbGQgb24gdGhlIHBhcmVudCBjdXJyZW50bHkgcG9pbnRpbmcgdG8gdGhlIG5vZGUuCiAgLy8vCiAgLy8vIEhhcyBubyBlZmZlY3QgaWYgdGhlIG5vZGUgaXMgb3JwaGFuZWQgb3IgaWYgdGhlIHBhcmVudCBwb2ludGVyIGlzIHN0YWxlLgogIHZvaWQgcmVtb3ZlKCkgewogICAgcGFyZW50Py5yZXBsYWNlQ2hpbGQodGhpcywgbnVsbCk7CiAgICBwYXJlbnQgPSBudWxsOwogIH0KCiAgQ29tcG9uZW50IGdldCBlbmNsb3NpbmdDb21wb25lbnQgPT4gcGFyZW50Py5lbmNsb3NpbmdDb21wb25lbnQ7CgogIC8vLyBSZXR1cm5zIHRoZSBiZXN0IGtub3duIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gQVNUIG5vZGUsIG9yIGBudWxsYCBpZgogIC8vLyB0aGUgbm9kZSBpcyBvcnBoYW5lZC4KICAvLy8KICAvLy8gVGhpcyBnZXR0ZXIgaXMgaW50ZW5kZWQgZm9yIGRpYWdub3N0aWNzIGFuZCBkZWJ1Z2dpbmcsIGFuZCBzaG91bGQgYmUKICAvLy8gYXZvaWRlZCBpbiBwcm9kdWN0aW9uIGNvZGUuCiAgTG9jYXRpb24gZ2V0IGxvY2F0aW9uIHsKICAgIGlmIChmaWxlT2Zmc2V0ID09IG5vT2Zmc2V0KSByZXR1cm4gcGFyZW50Py5sb2NhdGlvbjsKICAgIHJldHVybiBfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGUoZmlsZU9mZnNldCk7CiAgfQoKICBMb2NhdGlvbiBfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGUoaW50IG9mZnNldCkgewogICAgcmV0dXJuIHBhcmVudD8uX2dldExvY2F0aW9uSW5FbmNsb3NpbmdGaWxlKG9mZnNldCk7CiAgfQp9CgovLy8gQW4gQVNUIG5vZGUgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBieSBvdGhlciBub2Rlcy4KLy8vCi8vLyBUaGVyZSBpcyBhIHNpbmdsZSBbcmVmZXJlbmNlXSBiZWxvbmdpbmcgdG8gdGhpcyBub2RlLCBwcm92aWRpbmcgYSBsZXZlbCBvZgovLy8gaW5kaXJlY3Rpb24gdGhhdCBpcyBuZWVkZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24uCkBjb3EKYWJzdHJhY3QgY2xhc3MgTmFtZWROb2RlIGV4dGVuZHMgVHJlZU5vZGUgewogIEBjb3FkZWYKICBmaW5hbCBSZWZlcmVuY2UgcmVmZXJlbmNlOwoKICBOYW1lZE5vZGUoUmVmZXJlbmNlIHJlZmVyZW5jZSkKICAgICAgOiB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZSA/PyBuZXcgUmVmZXJlbmNlKCkgewogICAgdGhpcy5yZWZlcmVuY2Uubm9kZSA9IHRoaXM7CiAgfQoKICBDYW5vbmljYWxOYW1lIGdldCBjYW5vbmljYWxOYW1lID0+IHJlZmVyZW5jZT8uY2Fub25pY2FsTmFtZTsKfQoKYWJzdHJhY3QgY2xhc3MgRmlsZVVyaU5vZGUgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgLy8vIFRoZSBVUkkgb2YgdGhlIHNvdXJjZSBmaWxlIHRoaXMgbm9kZSB3YXMgbG9hZGVkIGZyb20uCiAgVXJpIGdldCBmaWxlVXJpOwp9CgphYnN0cmFjdCBjbGFzcyBBbm5vdGF0YWJsZSB7CiAgTGlzdDxFeHByZXNzaW9uPiBnZXQgYW5ub3RhdGlvbnM7CiAgdm9pZCBhZGRBbm5vdGF0aW9uKEV4cHJlc3Npb24gbm9kZSk7Cn0KCi8vLyBJbmRpcmVjdGlvbiBiZXR3ZWVuIGEgcmVmZXJlbmNlIGFuZCBpdHMgZGVmaW5pdGlvbi4KLy8vCi8vLyBUaGVyZSBpcyBvbmx5IG9uZSByZWZlcmVuY2Ugb2JqZWN0IHBlciBbTmFtZWROb2RlXS4KQGNvcXJlZgpjbGFzcyBSZWZlcmVuY2UgewogIENhbm9uaWNhbE5hbWUgY2Fub25pY2FsTmFtZTsKCiAgQG5vY29xCiAgTmFtZWROb2RlIG5vZGU7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmIChjYW5vbmljYWxOYW1lICE9IG51bGwpIHsKICAgICAgcmV0dXJuICdSZWZlcmVuY2UgdG8gJGNhbm9uaWNhbE5hbWUnOwogICAgfQogICAgaWYgKG5vZGUgIT0gbnVsbCkgewogICAgICByZXR1cm4gJ1JlZmVyZW5jZSB0byAkbm9kZSc7CiAgICB9CiAgICByZXR1cm4gJ1VuYm91bmQgcmVmZXJlbmNlJzsKICB9CgogIExpYnJhcnkgZ2V0IGFzTGlicmFyeSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIHRocm93ICckdGhpcyBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgbGlicmFyeSB3YXMgZXhwZWN0ZWQnOwogICAgfQogICAgcmV0dXJuIG5vZGUgYXMgTGlicmFyeTsKICB9CgogIENsYXNzIGdldCBhc0NsYXNzIHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgdGhyb3cgJyR0aGlzIGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBjbGFzcyB3YXMgZXhwZWN0ZWQnOwogICAgfQogICAgcmV0dXJuIG5vZGUgYXMgQ2xhc3M7CiAgfQoKICBNZW1iZXIgZ2V0IGFzTWVtYmVyIHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgdGhyb3cgJyR0aGlzIGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBtZW1iZXIgd2FzIGV4cGVjdGVkJzsKICAgIH0KICAgIHJldHVybiBub2RlIGFzIE1lbWJlcjsKICB9CgogIEZpZWxkIGdldCBhc0ZpZWxkIHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgdGhyb3cgJyR0aGlzIGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBmaWVsZCB3YXMgZXhwZWN0ZWQnOwogICAgfQogICAgcmV0dXJuIG5vZGUgYXMgRmllbGQ7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgYXNDb25zdHJ1Y3RvciB7CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIHRocm93ICckdGhpcyBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgY29uc3RydWN0b3Igd2FzIGV4cGVjdGVkJzsKICAgIH0KICAgIHJldHVybiBub2RlIGFzIENvbnN0cnVjdG9yOwogIH0KCiAgUHJvY2VkdXJlIGdldCBhc1Byb2NlZHVyZSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIHRocm93ICckdGhpcyBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgcHJvY2VkdXJlIHdhcyBleHBlY3RlZCc7CiAgICB9CiAgICByZXR1cm4gbm9kZSBhcyBQcm9jZWR1cmU7CiAgfQoKICBUeXBlZGVmIGdldCBhc1R5cGVkZWYgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICB0aHJvdyAnJHRoaXMgaXMgbm90IGJvdW5kIHRvIGFuIEFTVCBub2RlLiBBIHR5cGVkZWYgd2FzIGV4cGVjdGVkJzsKICAgIH0KICAgIHJldHVybiBub2RlIGFzIFR5cGVkZWY7CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgTElCUkFSSUVTIGFuZCBDTEFTU0VTCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQGNvcQpjbGFzcyBMaWJyYXJ5IGV4dGVuZHMgTmFtZWROb2RlCiAgICBpbXBsZW1lbnRzIEFubm90YXRhYmxlLCBDb21wYXJhYmxlPExpYnJhcnk+LCBGaWxlVXJpTm9kZSB7CiAgLy8vIEFuIGltcG9ydCBwYXRoIHRvIHRoaXMgbGlicmFyeS4KICAvLy8KICAvLy8gVGhlIFtVcmldIHNob3VsZCBoYXZlIHRoZSBgZGFydGAsIGBwYWNrYWdlYCwgYGFwcGAsIG9yIGBmaWxlYCBzY2hlbWUuCiAgLy8vCiAgLy8vIElmIHRoZSBVUkkgaGFzIHRoZSBgYXBwYCBzY2hlbWUsIGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbiByb290LgogIFVyaSBpbXBvcnRVcmk7CgogIC8vLyBUaGUgVVJJIG9mIHRoZSBzb3VyY2UgZmlsZSB0aGlzIGxpYnJhcnkgd2FzIGxvYWRlZCBmcm9tLgogIFVyaSBmaWxlVXJpOwoKICBpbnQgbGFuZ3VhZ2VWZXJzaW9uTWFqb3I7CiAgaW50IGxhbmd1YWdlVmVyc2lvbk1pbm9yOwoKICBzdGF0aWMgY29uc3QgaW50IEV4dGVybmFsRmxhZyA9IDEgPDwgMDsKICBzdGF0aWMgY29uc3QgaW50IFN5bnRoZXRpY0ZsYWcgPSAxIDw8IDE7CgogIGludCBmbGFncyA9IDA7CgogIC8vLyBJZiB0cnVlLCB0aGUgbGlicmFyeSBpcyBwYXJ0IG9mIGFub3RoZXIgYnVpbGQgdW5pdCBhbmQgaXRzIGNvbnRlbnRzCiAgLy8vIGFyZSBvbmx5IHBhcnRpYWxseSBsb2FkZWQuCiAgLy8vCiAgLy8vIENsYXNzZXMgb2YgYW4gZXh0ZXJuYWwgbGlicmFyeSBhcmUgbG9hZGVkIGF0IG9uZSBvZiB0aGUgW0NsYXNzTGV2ZWxdcwogIC8vLyBvdGhlciB0aGFuIFtDbGFzc0xldmVsLkJvZHldLiAgTWVtYmVycyBpbiBhbiBleHRlcm5hbCBsaWJyYXJ5IGhhdmUgbm8KICAvLy8gYm9keSwgYnV0IGhhdmUgdGhlaXIgdHlwZWQgaW50ZXJmYWNlIHByZXNlbnQuCiAgLy8vCiAgLy8vIElmIHRoZSBsaWJyYXJ5IGlzIG5vbi1leHRlcm5hbCwgdGhlbiBpdHMgY2xhc3NlcyBhcmUgYXQgW0NsYXNzTGV2ZWwuQm9keV0KICAvLy8gYW5kIGFsbCBtZW1iZXJzIGFyZSBsb2FkZWQuCiAgYm9vbCBnZXQgaXNFeHRlcm5hbCA9PiAoZmxhZ3MgJiBFeHRlcm5hbEZsYWcpICE9IDA7CiAgdm9pZCBzZXQgaXNFeHRlcm5hbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRXh0ZXJuYWxGbGFnKSA6IChmbGFncyAmIH5FeHRlcm5hbEZsYWcpOwogIH0KCiAgLy8vIElmIHRydWUsIHRoZSBsaWJyYXJ5IGlzIHN5bnRoZXRpYywgZm9yIGluc3RhbmNlIGxpYnJhcnkgdGhhdCBkb2Vzbid0CiAgLy8vIHJlcHJlc2VudHMgYW4gYWN0dWFsIGZpbGUgYW5kIGlzIGNyZWF0ZWQgYXMgdGhlIHJlc3VsdCBvZiBlcnJvciByZWNvdmVyeS4KICBib29sIGdldCBpc1N5bnRoZXRpYyA9PiBmbGFncyAmIFN5bnRoZXRpY0ZsYWcgIT0gMDsKICB2b2lkIHNldCBpc1N5bnRoZXRpYyhib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgU3ludGhldGljRmxhZykgOiAoZmxhZ3MgJiB+U3ludGhldGljRmxhZyk7CiAgfQoKICBTdHJpbmcgbmFtZTsKCiAgLy8vIFByb2JsZW1zIGluIHRoaXMgW0xpYnJhcnldIGVuY29kZWQgYXMganNvbiBvYmplY3RzLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhpcyBmaWVsZCBjYW4gYmUgbnVsbCwgYW5kIGJ5IGNvbnZlbnRpb24gc2hvdWxkIGJlIG51bGwgaWYgdGhlCiAgLy8vIGxpc3QgaXMgZW1wdHkuCiAgTGlzdDxTdHJpbmc+IHByb2JsZW1zQXNKc29uOwoKICBAbm9jb3EKICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zOwoKICBmaW5hbCBMaXN0PExpYnJhcnlEZXBlbmRlbmN5PiBkZXBlbmRlbmNpZXM7CgogIC8vLyBSZWZlcmVuY2VzIHRvIG5vZGVzIGV4cG9ydGVkIGJ5IGBleHBvcnRgIGRlY2xhcmF0aW9ucyB0aGF0OgogIC8vLyAtIGFyZW4ndCBhbWJpZ3VvdXMsIG9yCiAgLy8vIC0gYXJlbid0IGhpZGRlbiBieSBsb2NhbCBkZWNsYXJhdGlvbnMuCiAgQG5vY29xCiAgZmluYWwgTGlzdDxSZWZlcmVuY2U+IGFkZGl0aW9uYWxFeHBvcnRzID0gPFJlZmVyZW5jZT5bXTsKCiAgQGluZm9ybWF0aXZlCiAgZmluYWwgTGlzdDxMaWJyYXJ5UGFydD4gcGFydHM7CgogIGZpbmFsIExpc3Q8VHlwZWRlZj4gdHlwZWRlZnM7CiAgZmluYWwgTGlzdDxDbGFzcz4gY2xhc3NlczsKICBmaW5hbCBMaXN0PFByb2NlZHVyZT4gcHJvY2VkdXJlczsKICBmaW5hbCBMaXN0PEZpZWxkPiBmaWVsZHM7CgogIExpYnJhcnkodGhpcy5pbXBvcnRVcmksCiAgICAgIHt0aGlzLm5hbWUsCiAgICAgIGJvb2wgaXNFeHRlcm5hbDogZmFsc2UsCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMsCiAgICAgIExpc3Q8TGlicmFyeURlcGVuZGVuY3k+IGRlcGVuZGVuY2llcywKICAgICAgTGlzdDxMaWJyYXJ5UGFydD4gcGFydHMsCiAgICAgIExpc3Q8VHlwZWRlZj4gdHlwZWRlZnMsCiAgICAgIExpc3Q8Q2xhc3M+IGNsYXNzZXMsCiAgICAgIExpc3Q8UHJvY2VkdXJlPiBwcm9jZWR1cmVzLAogICAgICBMaXN0PEZpZWxkPiBmaWVsZHMsCiAgICAgIHRoaXMuZmlsZVVyaSwKICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZX0pCiAgICAgIDogdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zID8/IDxFeHByZXNzaW9uPltdLAogICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzID8/IDxMaWJyYXJ5RGVwZW5kZW5jeT5bXSwKICAgICAgICB0aGlzLnBhcnRzID0gcGFydHMgPz8gPExpYnJhcnlQYXJ0PltdLAogICAgICAgIHRoaXMudHlwZWRlZnMgPSB0eXBlZGVmcyA/PyA8VHlwZWRlZj5bXSwKICAgICAgICB0aGlzLmNsYXNzZXMgPSBjbGFzc2VzID8/IDxDbGFzcz5bXSwKICAgICAgICB0aGlzLnByb2NlZHVyZXMgPSBwcm9jZWR1cmVzID8/IDxQcm9jZWR1cmU+W10sCiAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHMgPz8gPEZpZWxkPltdLAogICAgICAgIHN1cGVyKHJlZmVyZW5jZSkgewogICAgdGhpcy5pc0V4dGVybmFsID0gaXNFeHRlcm5hbDsKICAgIHNldFBhcmVudHModGhpcy5kZXBlbmRlbmNpZXMsIHRoaXMpOwogICAgc2V0UGFyZW50cyh0aGlzLnBhcnRzLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy50eXBlZGVmcywgdGhpcyk7CiAgICBzZXRQYXJlbnRzKHRoaXMuY2xhc3NlcywgdGhpcyk7CiAgICBzZXRQYXJlbnRzKHRoaXMucHJvY2VkdXJlcywgdGhpcyk7CiAgICBzZXRQYXJlbnRzKHRoaXMuZmllbGRzLCB0aGlzKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSB0b3AtbGV2ZWwgZmllbGRzIGFuZCBwcm9jZWR1cmVzIGRlZmluZWQgaW4gdGhpcyBsaWJyYXJ5LgogIC8vLwogIC8vLyBUaGlzIGdldHRlciBpcyBmb3IgY29udmVuaWVuY2UsIG5vdCBlZmZpY2llbmN5LiAgQ29uc2lkZXIgbWFudWFsbHkKICAvLy8gaXRlcmF0aW5nIHRoZSBtZW1iZXJzIHRvIHNwZWVkIHVwIGNvZGUgaW4gcHJvZHVjdGlvbi4KICBJdGVyYWJsZTxNZW1iZXI+IGdldCBtZW1iZXJzID0+CiAgICAgIDxJdGVyYWJsZTxNZW1iZXI+PltmaWVsZHMsIHByb2NlZHVyZXNdLmV4cGFuZCgoeCkgPT4geCk7CgogIHZvaWQgYWRkTWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKICAgIG1lbWJlci5wYXJlbnQgPSB0aGlzOwogICAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgcHJvY2VkdXJlcy5hZGQobWVtYmVyKTsKICAgIH0gZWxzZSBpZiAobWVtYmVyIGlzIEZpZWxkKSB7CiAgICAgIGZpZWxkcy5hZGQobWVtYmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKG1lbWJlcik7CiAgICB9CiAgfQoKICB2b2lkIGFkZEFubm90YXRpb24oRXhwcmVzc2lvbiBub2RlKSB7CiAgICBub2RlLnBhcmVudCA9IHRoaXM7CiAgICBhbm5vdGF0aW9ucy5hZGQobm9kZSk7CiAgfQoKICB2b2lkIGFkZENsYXNzKENsYXNzIGNsYXNzXykgewogICAgY2xhc3NfLnBhcmVudCA9IHRoaXM7CiAgICBjbGFzc2VzLmFkZChjbGFzc18pOwogIH0KCiAgdm9pZCBhZGRGaWVsZChGaWVsZCBmaWVsZCkgewogICAgZmllbGQucGFyZW50ID0gdGhpczsKICAgIGZpZWxkcy5hZGQoZmllbGQpOwogIH0KCiAgdm9pZCBhZGRQcm9jZWR1cmUoUHJvY2VkdXJlIHByb2NlZHVyZSkgewogICAgcHJvY2VkdXJlLnBhcmVudCA9IHRoaXM7CiAgICBwcm9jZWR1cmVzLmFkZChwcm9jZWR1cmUpOwogIH0KCiAgdm9pZCBhZGRUeXBlZGVmKFR5cGVkZWYgdHlwZWRlZl8pIHsKICAgIHR5cGVkZWZfLnBhcmVudCA9IHRoaXM7CiAgICB0eXBlZGVmcy5hZGQodHlwZWRlZl8pOwogIH0KCiAgdm9pZCBjb21wdXRlQ2Fub25pY2FsTmFtZXMoKSB7CiAgICBhc3NlcnQoY2Fub25pY2FsTmFtZSAhPSBudWxsKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZWRlZnMubGVuZ3RoOyArK2kpIHsKICAgICAgVHlwZWRlZiB0eXBlZGVmXyA9IHR5cGVkZWZzW2ldOwogICAgICBjYW5vbmljYWxOYW1lLmdldENoaWxkRnJvbVR5cGVkZWYodHlwZWRlZl8pLmJpbmRUbyh0eXBlZGVmXy5yZWZlcmVuY2UpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyArK2kpIHsKICAgICAgRmllbGQgZmllbGQgPSBmaWVsZHNbaV07CiAgICAgIGNhbm9uaWNhbE5hbWUuZ2V0Q2hpbGRGcm9tTWVtYmVyKGZpZWxkKS5iaW5kVG8oZmllbGQucmVmZXJlbmNlKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2VkdXJlcy5sZW5ndGg7ICsraSkgewogICAgICBQcm9jZWR1cmUgbWVtYmVyID0gcHJvY2VkdXJlc1tpXTsKICAgICAgY2Fub25pY2FsTmFtZS5nZXRDaGlsZEZyb21NZW1iZXIobWVtYmVyKS5iaW5kVG8obWVtYmVyLnJlZmVyZW5jZSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyArK2kpIHsKICAgICAgQ2xhc3MgY2xhc3NfID0gY2xhc3Nlc1tpXTsKICAgICAgY2Fub25pY2FsTmFtZS5nZXRDaGlsZChjbGFzc18ubmFtZSkuYmluZFRvKGNsYXNzXy5yZWZlcmVuY2UpOwogICAgICBjbGFzc18uY29tcHV0ZUNhbm9uaWNhbE5hbWVzKCk7CiAgICB9CiAgfQoKICB2b2lkIGFkZERlcGVuZGVuY3koTGlicmFyeURlcGVuZGVuY3kgbm9kZSkgewogICAgZGVwZW5kZW5jaWVzLmFkZChub2RlLi5wYXJlbnQgPSB0aGlzKTsKICB9CgogIHZvaWQgYWRkUGFydChMaWJyYXJ5UGFydCBub2RlKSB7CiAgICBwYXJ0cy5hZGQobm9kZS4ucGFyZW50ID0gdGhpcyk7CiAgfQoKICBhY2NlcHQoVHJlZVZpc2l0b3IgdikgPT4gdi52aXNpdExpYnJhcnkodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QoYW5ub3RhdGlvbnMsIHYpOwogICAgdmlzaXRMaXN0KGRlcGVuZGVuY2llcywgdik7CiAgICB2aXNpdExpc3QocGFydHMsIHYpOwogICAgdmlzaXRMaXN0KHR5cGVkZWZzLCB2KTsKICAgIHZpc2l0TGlzdChjbGFzc2VzLCB2KTsKICAgIHZpc2l0TGlzdChwcm9jZWR1cmVzLCB2KTsKICAgIHZpc2l0TGlzdChmaWVsZHMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KGRlcGVuZGVuY2llcywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KHBhcnRzLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QodHlwZWRlZnMsIHYsIHRoaXMpOwogICAgdHJhbnNmb3JtTGlzdChjbGFzc2VzLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QocHJvY2VkdXJlcywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KGZpZWxkcywgdiwgdGhpcyk7CiAgfQoKICBzdGF0aWMgaW50IF9saWJyYXJ5SWRDb3VudGVyID0gMDsKICBpbnQgX2xpYnJhcnlJZCA9ICsrX2xpYnJhcnlJZENvdW50ZXI7CgogIGludCBjb21wYXJlVG8oTGlicmFyeSBvdGhlcikgPT4gX2xpYnJhcnlJZCAtIG90aGVyLl9saWJyYXJ5SWQ7CgogIC8vLyBSZXR1cm5zIGEgcG9zc2libHkgc3ludGhlc2l6ZWQgbmFtZSBmb3IgdGhpcyBsaWJyYXJ5LCBjb25zaXN0ZW50IHdpdGgKICAvLy8gdGhlIG5hbWVzIGFjcm9zcyBhbGwgW3RvU3RyaW5nXSBjYWxscy4KICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBkZWJ1Z0xpYnJhcnlOYW1lKHRoaXMpOwoKICBMb2NhdGlvbiBfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGUoaW50IG9mZnNldCkgewogICAgcmV0dXJuIF9nZXRMb2NhdGlvbkluQ29tcG9uZW50KGVuY2xvc2luZ0NvbXBvbmVudCwgZmlsZVVyaSwgb2Zmc2V0KTsKICB9Cn0KCi8vLyBBbiBpbXBvcnQgb3IgZXhwb3J0IGRlY2xhcmF0aW9uIGluIGEgbGlicmFyeS4KLy8vCi8vLyBJdCBjYW4gcmVwcmVzZW50IGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zLAovLy8KLy8vICAgICBpbXBvcnQgPHVybD47Ci8vLyAgICAgaW1wb3J0IDx1cmw+IGFzIDxuYW1lPjsKLy8vICAgICBpbXBvcnQgPHVybD4gZGVmZXJyZWQgYXMgPG5hbWU+OwovLy8gICAgIGV4cG9ydCA8dXJsPjsKLy8vCi8vLyBvcHRpb25hbGx5IHdpdGggbWV0YWRhdGEgYW5kIFtDb21iaW5hdG9yc10uCmNsYXNzIExpYnJhcnlEZXBlbmRlbmN5IGV4dGVuZHMgVHJlZU5vZGUgewogIGludCBmbGFnczsKCiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9uczsKCiAgUmVmZXJlbmNlIGltcG9ydGVkTGlicmFyeVJlZmVyZW5jZTsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBpbXBvcnQgcHJlZml4LCBpZiBhbnksIG9yIGBudWxsYCBpZiB0aGlzIGlzIG5vdCBhbiBpbXBvcnQKICAvLy8gd2l0aCBhIHByZWZpeC4KICAvLy8KICAvLy8gTXVzdCBiZSBub24tbnVsbCBmb3IgZGVmZXJyZWQgaW1wb3J0cywgYW5kIG11c3QgYmUgbnVsbCBmb3IgZXhwb3J0cy4KICBTdHJpbmcgbmFtZTsKCiAgZmluYWwgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9yczsKCiAgTGlicmFyeURlcGVuZGVuY3koaW50IGZsYWdzLCBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zLAogICAgICBMaWJyYXJ5IGltcG9ydGVkTGlicmFyeSwgU3RyaW5nIG5hbWUsIExpc3Q8Q29tYmluYXRvcj4gY29tYmluYXRvcnMpCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgZmxhZ3MsIGFubm90YXRpb25zLCBpbXBvcnRlZExpYnJhcnkucmVmZXJlbmNlLCBuYW1lLCBjb21iaW5hdG9ycyk7CgogIExpYnJhcnlEZXBlbmRlbmN5LmRlZmVycmVkSW1wb3J0KExpYnJhcnkgaW1wb3J0ZWRMaWJyYXJ5LCBTdHJpbmcgbmFtZSwKICAgICAge0xpc3Q8Q29tYmluYXRvcj4gY29tYmluYXRvcnMsIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnN9KQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UoRGVmZXJyZWRGbGFnLCBhbm5vdGF0aW9ucyA/PyA8RXhwcmVzc2lvbj5bXSwKICAgICAgICAgICAgaW1wb3J0ZWRMaWJyYXJ5LnJlZmVyZW5jZSwgbmFtZSwgY29tYmluYXRvcnMgPz8gPENvbWJpbmF0b3I+W10pOwoKICBMaWJyYXJ5RGVwZW5kZW5jeS5pbXBvcnQoTGlicmFyeSBpbXBvcnRlZExpYnJhcnksCiAgICAgIHtTdHJpbmcgbmFtZSwgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9ycywgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9uc30pCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZSgwLCBhbm5vdGF0aW9ucyA/PyA8RXhwcmVzc2lvbj5bXSwKICAgICAgICAgICAgaW1wb3J0ZWRMaWJyYXJ5LnJlZmVyZW5jZSwgbmFtZSwgY29tYmluYXRvcnMgPz8gPENvbWJpbmF0b3I+W10pOwoKICBMaWJyYXJ5RGVwZW5kZW5jeS5leHBvcnQoTGlicmFyeSBpbXBvcnRlZExpYnJhcnksCiAgICAgIHtMaXN0PENvbWJpbmF0b3I+IGNvbWJpbmF0b3JzLCBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zfSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKEV4cG9ydEZsYWcsIGFubm90YXRpb25zID8/IDxFeHByZXNzaW9uPltdLAogICAgICAgICAgICBpbXBvcnRlZExpYnJhcnkucmVmZXJlbmNlLCBudWxsLCBjb21iaW5hdG9ycyA/PyA8Q29tYmluYXRvcj5bXSk7CgogIExpYnJhcnlEZXBlbmRlbmN5LmJ5UmVmZXJlbmNlKHRoaXMuZmxhZ3MsIHRoaXMuYW5ub3RhdGlvbnMsCiAgICAgIHRoaXMuaW1wb3J0ZWRMaWJyYXJ5UmVmZXJlbmNlLCB0aGlzLm5hbWUsIHRoaXMuY29tYmluYXRvcnMpIHsKICAgIHNldFBhcmVudHMoYW5ub3RhdGlvbnMsIHRoaXMpOwogICAgc2V0UGFyZW50cyhjb21iaW5hdG9ycywgdGhpcyk7CiAgfQoKICBMaWJyYXJ5IGdldCBlbmNsb3NpbmdMaWJyYXJ5ID0+IHBhcmVudDsKICBMaWJyYXJ5IGdldCB0YXJnZXRMaWJyYXJ5ID0+IGltcG9ydGVkTGlicmFyeVJlZmVyZW5jZS5hc0xpYnJhcnk7CgogIHN0YXRpYyBjb25zdCBpbnQgRXhwb3J0RmxhZyA9IDEgPDwgMDsKICBzdGF0aWMgY29uc3QgaW50IERlZmVycmVkRmxhZyA9IDEgPDwgMTsKCiAgYm9vbCBnZXQgaXNFeHBvcnQgPT4gZmxhZ3MgJiBFeHBvcnRGbGFnICE9IDA7CiAgYm9vbCBnZXQgaXNJbXBvcnQgPT4gIWlzRXhwb3J0OwogIGJvb2wgZ2V0IGlzRGVmZXJyZWQgPT4gZmxhZ3MgJiBEZWZlcnJlZEZsYWcgIT0gMDsKCiAgdm9pZCBhZGRBbm5vdGF0aW9uKEV4cHJlc3Npb24gYW5ub3RhdGlvbikgewogICAgYW5ub3RhdGlvbnMuYWRkKGFubm90YXRpb24uLnBhcmVudCA9IHRoaXMpOwogIH0KCiAgYWNjZXB0KFRyZWVWaXNpdG9yIHYpID0+IHYudmlzaXRMaWJyYXJ5RGVwZW5kZW5jeSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChhbm5vdGF0aW9ucywgdik7CiAgICB2aXNpdExpc3QoY29tYmluYXRvcnMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KGNvbWJpbmF0b3JzLCB2LCB0aGlzKTsKICB9Cn0KCi8vLyBBIHBhcnQgZGVjbGFyYXRpb24gaW4gYSBsaWJyYXJ5LgovLy8KLy8vICAgICBwYXJ0IDx1cmw+OwovLy8KLy8vIG9wdGlvbmFsbHkgd2l0aCBtZXRhZGF0YS4KY2xhc3MgTGlicmFyeVBhcnQgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9uczsKICBmaW5hbCBTdHJpbmcgcGFydFVyaTsKCiAgTGlicmFyeVBhcnQodGhpcy5hbm5vdGF0aW9ucywgdGhpcy5wYXJ0VXJpKSB7CiAgICBzZXRQYXJlbnRzKGFubm90YXRpb25zLCB0aGlzKTsKICB9CgogIHZvaWQgYWRkQW5ub3RhdGlvbihFeHByZXNzaW9uIGFubm90YXRpb24pIHsKICAgIGFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uLi5wYXJlbnQgPSB0aGlzKTsKICB9CgogIGFjY2VwdChUcmVlVmlzaXRvciB2KSA9PiB2LnZpc2l0TGlicmFyeVBhcnQodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QoYW5ub3RhdGlvbnMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgfQp9CgovLy8gQSBgc2hvd2Agb3IgYGhpZGVgIGNsYXVzZSBmb3IgYW4gaW1wb3J0IG9yIGV4cG9ydC4KY2xhc3MgQ29tYmluYXRvciBleHRlbmRzIFRyZWVOb2RlIHsKICBib29sIGlzU2hvdzsKCiAgZmluYWwgTGlzdDxTdHJpbmc+IG5hbWVzOwoKICBMaWJyYXJ5RGVwZW5kZW5jeSBnZXQgZGVwZW5kZW5jeSA9PiBwYXJlbnQ7CgogIENvbWJpbmF0b3IodGhpcy5pc1Nob3csIHRoaXMubmFtZXMpOwogIENvbWJpbmF0b3Iuc2hvdyh0aGlzLm5hbWVzKSA6IGlzU2hvdyA9IHRydWU7CiAgQ29tYmluYXRvci5oaWRlKHRoaXMubmFtZXMpIDogaXNTaG93ID0gZmFsc2U7CgogIGJvb2wgZ2V0IGlzSGlkZSA9PiAhaXNTaG93OwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHJlZVZpc2l0b3IgdikgPT4gdi52aXNpdENvbWJpbmF0b3IodGhpcyk7CgogIEBvdmVycmlkZQogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQoKICBAb3ZlcnJpZGUKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgovLy8gRGVjbGFyYXRpb24gb2YgYSB0eXBlIGFsaWFzLgpjbGFzcyBUeXBlZGVmIGV4dGVuZHMgTmFtZWROb2RlIGltcGxlbWVudHMgRmlsZVVyaU5vZGUgewogIC8vLyBUaGUgVVJJIG9mIHRoZSBzb3VyY2UgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGlzIHR5cGVkZWYuCiAgVXJpIGZpbGVVcmk7CiAgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9ucyA9IGNvbnN0IDxFeHByZXNzaW9uPltdOwogIFN0cmluZyBuYW1lOwogIGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CiAgRGFydFR5cGUgdHlwZTsKCiAgLy8gVGhlIGZvbGxvd2luZyB0d28gZmllbGRzIGRlc2NyaWJlIHBhcmFtZXRlcnMgb2YgdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24KICAvLyB0eXBlLiAgVGhleSBhcmUgbmVlZGVkIHRvIGtlZXAgc3VjaCBhdHRyaWJ1dGVzIGFzIG5hbWVzIGFuZCBhbm5vdGF0aW9ucy4KICBmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGU7CiAgZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsUGFyYW1ldGVyczsKICBmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVyczsKCiAgVHlwZWRlZih0aGlzLm5hbWUsIHRoaXMudHlwZSwKICAgICAge1JlZmVyZW5jZSByZWZlcmVuY2UsCiAgICAgIHRoaXMuZmlsZVVyaSwKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyc09mRnVuY3Rpb25UeXBlLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVyc30pCiAgICAgIDogdGhpcy50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzID8/IDxUeXBlUGFyYW1ldGVyPltdLAogICAgICAgIHRoaXMudHlwZVBhcmFtZXRlcnNPZkZ1bmN0aW9uVHlwZSA9CiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGUgPz8gPFR5cGVQYXJhbWV0ZXI+W10sCiAgICAgICAgdGhpcy5wb3NpdGlvbmFsUGFyYW1ldGVycyA9CiAgICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzID8/IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdLAogICAgICAgIHRoaXMubmFtZWRQYXJhbWV0ZXJzID0gbmFtZWRQYXJhbWV0ZXJzID8/IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdLAogICAgICAgIHN1cGVyKHJlZmVyZW5jZSkgewogICAgc2V0UGFyZW50cyh0aGlzLnR5cGVQYXJhbWV0ZXJzLCB0aGlzKTsKICB9CgogIExpYnJhcnkgZ2V0IGVuY2xvc2luZ0xpYnJhcnkgPT4gcGFyZW50OwoKICBUeXBlZGVmVHlwZSBnZXQgdGhpc1R5cGUgewogICAgcmV0dXJuIG5ldyBUeXBlZGVmVHlwZSh0aGlzLCBfZ2V0QXNUeXBlQXJndW1lbnRzKHR5cGVQYXJhbWV0ZXJzKSk7CiAgfQoKICBhY2NlcHQoVHJlZVZpc2l0b3IgdikgewogICAgcmV0dXJuIHYudmlzaXRUeXBlZGVmKHRoaXMpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KHR5cGVQYXJhbWV0ZXJzLCB2LCB0aGlzKTsKICAgIGlmICh0eXBlICE9IG51bGwpIHsKICAgICAgdHlwZSA9IHYudmlzaXREYXJ0VHlwZSh0eXBlKTsKICAgIH0KICB9CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QoYW5ub3RhdGlvbnMsIHYpOwogICAgdmlzaXRMaXN0KHR5cGVQYXJhbWV0ZXJzLCB2KTsKICAgIHR5cGU/LmFjY2VwdCh2KTsKICB9CgogIHZvaWQgYWRkQW5ub3RhdGlvbihFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlmIChhbm5vdGF0aW9ucy5pc0VtcHR5KSB7CiAgICAgIGFubm90YXRpb25zID0gPEV4cHJlc3Npb24+W107CiAgICB9CiAgICBhbm5vdGF0aW9ucy5hZGQobm9kZSk7CiAgICBub2RlLnBhcmVudCA9IHRoaXM7CiAgfQoKICBMb2NhdGlvbiBfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGUoaW50IG9mZnNldCkgewogICAgcmV0dXJuIF9nZXRMb2NhdGlvbkluQ29tcG9uZW50KGVuY2xvc2luZ0NvbXBvbmVudCwgZmlsZVVyaSwgb2Zmc2V0KTsKICB9Cn0KCi8vLyBUaGUgZGVncmVlIHRvIHdoaWNoIHRoZSBjb250ZW50cyBvZiBhIGNsYXNzIGhhdmUgYmVlbiBsb2FkZWQgaW50byBtZW1vcnkuCi8vLwovLy8gRWFjaCBsZXZlbCBpbXBseSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBwcmV2aW91cyBvbmVzLgplbnVtIENsYXNzTGV2ZWwgewogIC8vLyBUZW1wb3JhcnkgbG9hZGluZyBsZXZlbCBmb3IgaW50ZXJuYWwgdXNlIGJ5IElSIHByb2R1Y2Vycy4gIENvbnN1bWVycyBvZgogIC8vLyBrZXJuZWwgY29kZSBzaG91bGQgbm90IGV4cGVjdCB0byBzZWUgY2xhc3NlcyBhdCB0aGlzIGxldmVsLgogIFRlbXBvcmFyeSwKCiAgLy8vIFRoZSBjbGFzcyBtYXkgYmUgdXNlZCBhcyBhIHR5cGUsIGFuZCBpdCBtYXkgY29udGFpbiBtZW1iZXJzIHRoYXQgYXJlCiAgLy8vIHJlZmVyZW5jZWQgZnJvbSB0aGlzIGJ1aWxkIHVuaXQuCiAgLy8vCiAgLy8vIFRoZSB0eXBlIHBhcmFtZXRlcnMgYW5kIHRoZWlyIGJvdW5kcyBhcmUgcHJlc2VudC4KICAvLy8KICAvLy8gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYWxsIG1lbWJlcnMgYXJlIHByZXNlbnQuCiAgLy8vCiAgLy8vIEFsbCBzdXBlcnR5cGVzIG9mIHRoaXMgY2xhc3MgYXJlIGF0IFtUeXBlXSBsZXZlbCBvciBoaWdoZXIuCiAgVHlwZSwKCiAgLy8vIEFsbCBpbnN0YW5jZSBtZW1iZXJzIG9mIHRoZSBjbGFzcyBhcmUgcHJlc2VudC4KICAvLy8KICAvLy8gQWxsIHN1cGVydHlwZXMgb2YgdGhpcyBjbGFzcyBhcmUgYXQgW0hpZXJhcmNoeV0gbGV2ZWwgb3IgaGlnaGVyLgogIC8vLwogIC8vLyBUaGlzIGxldmVsIGV4aXN0cyBzbyBzdXBlcnR5cGVzIG9mIGEgZnVsbHkgbG9hZGVkIGNsYXNzIGNvbnRhaW4gYWxsIHRoZQogIC8vLyBtZW1iZXJzIG5lZWRlZCB0byBkZXRlY3Qgb3ZlcnJpZGUgY29uc3RyYWludHMuCiAgSGllcmFyY2h5LAoKICAvLy8gQWxsIGluc3RhbmNlIG1lbWJlcnMgb2YgdGhlIGNsYXNzIGhhdmUgdGhlaXIgYm9keSBsb2FkZWQsIGFuZCB0aGVpcgogIC8vLyBhbm5vdGF0aW9ucyBhcmUgcHJlc2VudC4KICAvLy8KICAvLy8gQWxsIHN1cGVydHlwZXMgb2YgdGhpcyBjbGFzcyBhcmUgYXQgW0hpZXJhcmNoeV0gbGV2ZWwgb3IgaGlnaGVyLgogIC8vLwogIC8vLyBJZiB0aGlzIGNsYXNzIGlzIGEgbWl4aW4gYXBwbGljYXRpb24sIHRoZW4gaXRzIG1peGluIGlzIGxvYWRlZCBhdCBbTWl4aW5dCiAgLy8vIGxldmVsIG9yIGhpZ2hlci4KICAvLy8KICAvLy8gVGhpcyBsZXZlbCBleGlzdHMgc28gdGhlIGNvbnRlbnRzIG9mIGEgbWl4aW4gY2FuIGJlIGNsb25lZCBpbnRvIGEKICAvLy8gbWl4aW4gYXBwbGljYXRpb24uCiAgTWl4aW4sCgogIC8vLyBBbGwgbWVtYmVycyBvZiB0aGUgY2xhc3MgYXJlIGZ1bGx5IGxvYWRlZCBhbmQgYXJlIGluIHRoZSBjb3JyZWN0IG9yZGVyLgogIC8vLwogIC8vLyBBbm5vdGF0aW9ucyBhcmUgcHJlc2VudCBvbiBjbGFzc2VzIGFuZCBtZW1iZXJzLgogIC8vLwogIC8vLyBBbGwgc3VwZXJ0eXBlcyBvZiB0aGlzIGNsYXNzIGFyZSBhdCBbSGllcmFyY2h5XSBsZXZlbCBvciBoaWdoZXIsCiAgLy8vIG5vdCBuZWNlc3NhcmlseSBhdCBbQm9keV0gbGV2ZWwuCiAgQm9keSwKfQoKLy8vIERlY2xhcmF0aW9uIG9mIGEgcmVndWxhciBjbGFzcyBvciBhIG1peGluIGFwcGxpY2F0aW9uLgovLy8KLy8vIE1peGluIGFwcGxpY2F0aW9ucyBtYXkgbm90IGNvbnRhaW4gZmllbGRzIG9yIHByb2NlZHVyZXMsIGFzIHRoZXkgaW1wbGljaXRseQovLy8gdXNlIHRob3NlIGZyb20gaXRzIG1peGVkLWluIHR5cGUuICBIb3dldmVyLCB0aGUgSVIgZG9lcyBub3QgZW5mb3JjZSB0aGlzCi8vLyBydWxlIGRpcmVjdGx5LCBhcyBkb2luZyBzbyBjYW4gb2JzdHJ1Y3QgdHJhbnNmb3JtYXRpb25zLiAgSXQgaXMgcG9zc2libGUgdG8KLy8vIHRyYW5zZm9ybSBhIG1peGluIGFwcGxpY2F0aW9uIHRvIGJlY29tZSBhIHJlZ3VsYXIgY2xhc3MsIGFuZCB2aWNlIHZlcnNhLgpAY29xCmNsYXNzIENsYXNzIGV4dGVuZHMgTmFtZWROb2RlIGltcGxlbWVudHMgQW5ub3RhdGFibGUsIEZpbGVVcmlOb2RlIHsKICAvLy8gU3RhcnQgb2Zmc2V0IG9mIHRoZSBjbGFzcyBpbiB0aGUgc291cmNlIGZpbGUgaXQgY29tZXMgZnJvbS4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoaXMgaW5jbHVkZXMgYW5ub3RhdGlvbnMgaWYgYW55LgogIC8vLwogIC8vLyBWYWxpZCB2YWx1ZXMgYXJlIGZyb20gMCBhbmQgdXAsIG9yIC0xIChbVHJlZU5vZGUubm9PZmZzZXRdKSBpZiB0aGUgZmlsZQogIC8vLyBzdGFydCBvZmZzZXQgaXMgbm90IGF2YWlsYWJsZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBpZiBub25lIGlzIHNwZWNpZmljYWxseQogIC8vLyBzZXQpLgogIGludCBzdGFydEZpbGVPZmZzZXQgPSBUcmVlTm9kZS5ub09mZnNldDsKCiAgLy8vIEVuZCBvZmZzZXQgaW4gdGhlIHNvdXJjZSBmaWxlIGl0IGNvbWVzIGZyb20uIFZhbGlkIHZhbHVlcyBhcmUgZnJvbSAwIGFuZAogIC8vLyB1cCwgb3IgLTEgKFtUcmVlTm9kZS5ub09mZnNldF0pIGlmIHRoZSBmaWxlIGVuZCBvZmZzZXQgaXMgbm90IGF2YWlsYWJsZQogIC8vLyAodGhpcyBpcyB0aGUgZGVmYXVsdCBpZiBub25lIGlzIHNwZWNpZmljYWxseSBzZXQpLgogIGludCBmaWxlRW5kT2Zmc2V0ID0gVHJlZU5vZGUubm9PZmZzZXQ7CgogIC8vLyBUaGUgZGVncmVlIHRvIHdoaWNoIHRoZSBjb250ZW50cyBvZiB0aGUgY2xhc3MgaGF2ZSBiZWVuIGxvYWRlZC4KICBDbGFzc0xldmVsIGxldmVsID0gQ2xhc3NMZXZlbC5Cb2R5OwoKICAvLy8gTGlzdCBvZiBtZXRhZGF0YSBhbm5vdGF0aW9ucyBvbiB0aGUgY2xhc3MuCiAgLy8vCiAgLy8vIFRoaXMgZGVmYXVsdHMgdG8gYW4gaW1tdXRhYmxlIGVtcHR5IGxpc3QuIFVzZSBbYWRkQW5ub3RhdGlvbl0gdG8gYWRkCiAgLy8vIGFubm90YXRpb25zIGlmIG5lZWRlZC4KICBAbm9jb3EKICBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zID0gY29uc3QgPEV4cHJlc3Npb24+W107CgogIC8vLyBOYW1lIG9mIHRoZSBjbGFzcy4KICAvLy8KICAvLy8gTXVzdCBiZSBub24tbnVsbCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBsaWJyYXJ5LgogIC8vLwogIC8vLyBUaGUgbmFtZSBtYXkgY29udGFpbiBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCB2YWxpZCBpbiBhIERhcnQgaWRlbnRpZmllciwKICAvLy8gaW4gcGFydGljdWxhciwgdGhlIHN5bWJvbCAnJicgaXMgdXNlZCBpbiBjbGFzcyBuYW1lcyBnZW5lcmF0ZWQgZm9yIG1peGluCiAgLy8vIGFwcGxpY2F0aW9ucy4KICBAY29xCiAgU3RyaW5nIG5hbWU7CgogIC8vIE11c3QgbWF0Y2ggc2VyaWFsaXplZCBiaXQgcG9zaXRpb25zLgogIHN0YXRpYyBjb25zdCBpbnQgTGV2ZWxNYXNrID0gMHgzOyAvLyBCaXRzIDAgYW5kIDEuCiAgc3RhdGljIGNvbnN0IGludCBGbGFnQWJzdHJhY3QgPSAxIDw8IDI7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnRW51bSA9IDEgPDwgMzsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdBbm9ueW1vdXNNaXhpbiA9IDEgPDwgNDsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdFbGltaW5hdGVkTWl4aW4gPSAxIDw8IDU7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnTWl4aW5EZWNsYXJhdGlvbiA9IDEgPDwgNjsKCiAgaW50IGZsYWdzID0gMDsKCiAgYm9vbCBnZXQgaXNBYnN0cmFjdCA9PiBmbGFncyAmIEZsYWdBYnN0cmFjdCAhPSAwOwoKICB2b2lkIHNldCBpc0Fic3RyYWN0KGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnQWJzdHJhY3QpIDogKGZsYWdzICYgfkZsYWdBYnN0cmFjdCk7CiAgfQoKICAvLy8gV2hldGhlciB0aGlzIGNsYXNzIGlzIGFuIGVudW0uCiAgYm9vbCBnZXQgaXNFbnVtID0+IGZsYWdzICYgRmxhZ0VudW0gIT0gMDsKCiAgdm9pZCBzZXQgaXNFbnVtKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnRW51bSkgOiAoZmxhZ3MgJiB+RmxhZ0VudW0pOwogIH0KCiAgLy8vIFdoZXRoZXIgdGhpcyBjbGFzcyBpcyBhIHN5bnRoZXRpYyBpbXBsZW1lbnRhdGlvbiBjcmVhdGVkIGZvciBlYWNoCiAgLy8vIG1peGVkLWluIGNsYXNzLiBGb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIGNvZGU6CiAgLy8vIGNsYXNzIFogZXh0ZW5kcyBBIHdpdGggQiwgQywgRCB7fQogIC8vLyBjbGFzcyBBIHt9CiAgLy8vIGNsYXNzIEIge30KICAvLy8gY2xhc3MgQyB7fQogIC8vLyBjbGFzcyBEIHt9CiAgLy8vIC4uLmNyZWF0ZXM6CiAgLy8vIGFic3RyYWN0IGNsYXNzIF9aJkEmQiBleHRlbmRzIEEgbWl4ZWRJbiBCIHt9CiAgLy8vIGFic3RyYWN0IGNsYXNzIF9aJkEmQiZDIGV4dGVuZHMgQSZCIG1peGVkSW4gQyB7fQogIC8vLyBhYnN0cmFjdCBjbGFzcyBfWiZBJkImQyZEIGV4dGVuZHMgQSZCJkMgbWl4ZWRJbiBEIHt9CiAgLy8vIGNsYXNzIFogZXh0ZW5kcyBfWiZBJkImQyZEIHt9CiAgLy8vIEFsbCBYJlkgY2xhc3NlcyBhcmUgbWFya2VkIGFzIHN5bnRoZXRpYy4KICBib29sIGdldCBpc0Fub255bW91c01peGluID0+IGZsYWdzICYgRmxhZ0Fub255bW91c01peGluICE9IDA7CgogIHZvaWQgc2V0IGlzQW5vbnltb3VzTWl4aW4oYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPQogICAgICAgIHZhbHVlID8gKGZsYWdzIHwgRmxhZ0Fub255bW91c01peGluKSA6IChmbGFncyAmIH5GbGFnQW5vbnltb3VzTWl4aW4pOwogIH0KCiAgLy8vIFdoZXRoZXIgdGhpcyBjbGFzcyB3YXMgdHJhbnNmb3JtZWQgZnJvbSBhIG1peGluIGFwcGxpY2F0aW9uLgogIC8vLyBJbiBzdWNoIGNhc2UsIGl0cyBtaXhlZC1pbiB0eXBlIHdhcyBwdWxsZWQgaW50byB0aGUgZW5kIG9mIGltcGxlbWVudGVkCiAgLy8vIHR5cGVzIGxpc3QuCiAgYm9vbCBnZXQgaXNFbGltaW5hdGVkTWl4aW4gPT4gZmxhZ3MgJiBGbGFnRWxpbWluYXRlZE1peGluICE9IDA7CgogIHZvaWQgc2V0IGlzRWxpbWluYXRlZE1peGluKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0KICAgICAgICB2YWx1ZSA/IChmbGFncyB8IEZsYWdFbGltaW5hdGVkTWl4aW4pIDogKGZsYWdzICYgfkZsYWdFbGltaW5hdGVkTWl4aW4pOwogIH0KCiAgLy8vIFRydWUgaWYgdGhpcyBjbGFzcyB3YXMgYSBtaXhpbiBkZWNsYXJhdGlvbiBpbiBEYXJ0LgogIC8vLwogIC8vLyBNaXhpbnMgYXJlIGRlY2xhcmVkIGluIERhcnQgd2l0aCB0aGUgYG1peGluYCBrZXl3b3JkLiAgVGhleSBhcmUgY29tcGlsZWQKICAvLy8gdG8gS2VybmVsIGNsYXNzZXMuCiAgYm9vbCBnZXQgaXNNaXhpbkRlY2xhcmF0aW9uID0+IGZsYWdzICYgRmxhZ01peGluRGVjbGFyYXRpb24gIT0gMDsKCiAgdm9pZCBzZXQgaXNNaXhpbkRlY2xhcmF0aW9uKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IEZsYWdNaXhpbkRlY2xhcmF0aW9uKQogICAgICAgIDogKGZsYWdzICYgfkZsYWdNaXhpbkRlY2xhcmF0aW9uKTsKICB9CgogIExpc3Q8U3VwZXJ0eXBlPiBzdXBlcmNsYXNzQ29uc3RyYWludHMoKSB7CiAgICB2YXIgY29uc3RyYWludHMgPSA8U3VwZXJ0eXBlPltdOwoKICAgIC8vIE5vdCBhIG1peGluIGRlY2xhcmF0aW9uLgogICAgaWYgKCFpc01peGluRGVjbGFyYXRpb24pIHJldHVybiBjb25zdHJhaW50czsKCiAgICAvLyBPdGhlcndpc2Ugd2UgaGF2ZSBhIGxlZnQtbGluZWFyIGJpbmFyeSB0cmVlIChzdWJ0cmVlcyBhcmUgc3VwZXJ0eXBlIGFuZAogICAgLy8gbWl4ZWRJblR5cGUpIG9mIGNvbnN0cmFpbnRzLCB3aGVyZSBhbGwgdGhlIGludGVyaW9yIG5vZGVzIGFyZSBhbm9ueW1vdXMKICAgIC8vIG1peGluIGFwcGxpY2F0aW9ucy4KICAgIFN1cGVydHlwZSBjdXJyZW50ID0gc3VwZXJ0eXBlOwogICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50LmNsYXNzTm9kZS5pc0Fub255bW91c01peGluKSB7CiAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnQuY2xhc3NOb2RlOwogICAgICBhc3NlcnQoY3VycmVudENsYXNzLmltcGxlbWVudGVkVHlwZXMubGVuZ3RoID09IDIpOwogICAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21TdXBlcnR5cGUoY3VycmVudCk7CiAgICAgIGNvbnN0cmFpbnRzLmFkZCgKICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlU3VwZXJ0eXBlKGN1cnJlbnRDbGFzcy5pbXBsZW1lbnRlZFR5cGVzWzFdKSk7CiAgICAgIGN1cnJlbnQgPQogICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVTdXBlcnR5cGUoY3VycmVudENsYXNzLmltcGxlbWVudGVkVHlwZXNbMF0pOwogICAgfQogICAgcmV0dXJuIGNvbnN0cmFpbnRzLi5hZGQoY3VycmVudCk7CiAgfQoKICAvLy8gVGhlIFVSSSBvZiB0aGUgc291cmNlIGZpbGUgdGhpcyBjbGFzcyB3YXMgbG9hZGVkIGZyb20uCiAgVXJpIGZpbGVVcmk7CgogIGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CgogIC8vLyBUaGUgaW1tZWRpYXRlIHN1cGVyIHR5cGUsIG9yIGBudWxsYCBpZiB0aGlzIGlzIHRoZSByb290IGNsYXNzLgogIFN1cGVydHlwZSBzdXBlcnR5cGU7CgogIC8vLyBUaGUgbWl4ZWQtaW4gdHlwZSBpZiB0aGlzIGlzIGEgbWl4aW4gYXBwbGljYXRpb24sIG90aGVyd2lzZSBgbnVsbGAuCiAgU3VwZXJ0eXBlIG1peGVkSW5UeXBlOwoKICAvLy8gVGhlIHR5cGVzIGZyb20gdGhlIGBpbXBsZW1lbnRzYCBjbGF1c2UuCiAgZmluYWwgTGlzdDxTdXBlcnR5cGU+IGltcGxlbWVudGVkVHlwZXM7CgogIC8vLyBGaWVsZHMgZGVjbGFyZWQgaW4gdGhlIGNsYXNzLgogIC8vLwogIC8vLyBGb3IgbWl4aW4gYXBwbGljYXRpb25zIHRoaXMgc2hvdWxkIGJlIGVtcHR5LgogIGZpbmFsIExpc3Q8RmllbGQ+IGZpZWxkczsKCiAgLy8vIENvbnN0cnVjdG9ycyBkZWNsYXJlZCBpbiB0aGUgY2xhc3MuCiAgZmluYWwgTGlzdDxDb25zdHJ1Y3Rvcj4gY29uc3RydWN0b3JzOwoKICAvLy8gUHJvY2VkdXJlcyBkZWNsYXJlZCBpbiB0aGUgY2xhc3MuCiAgLy8vCiAgLy8vIEZvciBtaXhpbiBhcHBsaWNhdGlvbnMgdGhpcyBzaG91bGQgb25seSBjb250YWluIGZvcndhcmRpbmcgc3R1YnMuCiAgZmluYWwgTGlzdDxQcm9jZWR1cmU+IHByb2NlZHVyZXM7CgogIC8vLyBSZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9ycyBkZWNsYXJlZCBpbiB0aGUgY2xhc3MuCiAgLy8vCiAgLy8vIEZvciBtaXhpbiBhcHBsaWNhdGlvbnMgdGhpcyBzaG91bGQgYmUgZW1wdHkuCiAgZmluYWwgTGlzdDxSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcj4gcmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzOwoKICBDbGFzcygKICAgICAge3RoaXMubmFtZSwKICAgICAgYm9vbCBpc0Fic3RyYWN0OiBmYWxzZSwKICAgICAgYm9vbCBpc0Fub255bW91c01peGluOiBmYWxzZSwKICAgICAgdGhpcy5zdXBlcnR5cGUsCiAgICAgIHRoaXMubWl4ZWRJblR5cGUsCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsCiAgICAgIExpc3Q8U3VwZXJ0eXBlPiBpbXBsZW1lbnRlZFR5cGVzLAogICAgICBMaXN0PENvbnN0cnVjdG9yPiBjb25zdHJ1Y3RvcnMsCiAgICAgIExpc3Q8UHJvY2VkdXJlPiBwcm9jZWR1cmVzLAogICAgICBMaXN0PEZpZWxkPiBmaWVsZHMsCiAgICAgIExpc3Q8UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3I+IHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycywKICAgICAgdGhpcy5maWxlVXJpLAogICAgICBSZWZlcmVuY2UgcmVmZXJlbmNlfSkKICAgICAgOiB0aGlzLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnMgPz8gPFR5cGVQYXJhbWV0ZXI+W10sCiAgICAgICAgdGhpcy5pbXBsZW1lbnRlZFR5cGVzID0gaW1wbGVtZW50ZWRUeXBlcyA/PyA8U3VwZXJ0eXBlPltdLAogICAgICAgIHRoaXMuZmllbGRzID0gZmllbGRzID8/IDxGaWVsZD5bXSwKICAgICAgICB0aGlzLmNvbnN0cnVjdG9ycyA9IGNvbnN0cnVjdG9ycyA/PyA8Q29uc3RydWN0b3I+W10sCiAgICAgICAgdGhpcy5wcm9jZWR1cmVzID0gcHJvY2VkdXJlcyA/PyA8UHJvY2VkdXJlPltdLAogICAgICAgIHRoaXMucmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzID0KICAgICAgICAgICAgcmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzID8/IDxSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcj5bXSwKICAgICAgICBzdXBlcihyZWZlcmVuY2UpIHsKICAgIHNldFBhcmVudHModGhpcy50eXBlUGFyYW1ldGVycywgdGhpcyk7CiAgICBzZXRQYXJlbnRzKHRoaXMuY29uc3RydWN0b3JzLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy5wcm9jZWR1cmVzLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy5maWVsZHMsIHRoaXMpOwogICAgc2V0UGFyZW50cyh0aGlzLnJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycywgdGhpcyk7CiAgICB0aGlzLmlzQWJzdHJhY3QgPSBpc0Fic3RyYWN0OwogICAgdGhpcy5pc0Fub255bW91c01peGluID0gaXNBbm9ueW1vdXNNaXhpbjsKICB9CgogIHZvaWQgY29tcHV0ZUNhbm9uaWNhbE5hbWVzKCkgewogICAgYXNzZXJ0KGNhbm9uaWNhbE5hbWUgIT0gbnVsbCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7ICsraSkgewogICAgICBGaWVsZCBtZW1iZXIgPSBmaWVsZHNbaV07CiAgICAgIGNhbm9uaWNhbE5hbWUuZ2V0Q2hpbGRGcm9tTWVtYmVyKG1lbWJlcikuYmluZFRvKG1lbWJlci5yZWZlcmVuY2UpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZWR1cmVzLmxlbmd0aDsgKytpKSB7CiAgICAgIFByb2NlZHVyZSBtZW1iZXIgPSBwcm9jZWR1cmVzW2ldOwogICAgICBjYW5vbmljYWxOYW1lLmdldENoaWxkRnJvbU1lbWJlcihtZW1iZXIpLmJpbmRUbyhtZW1iZXIucmVmZXJlbmNlKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RydWN0b3JzLmxlbmd0aDsgKytpKSB7CiAgICAgIENvbnN0cnVjdG9yIG1lbWJlciA9IGNvbnN0cnVjdG9yc1tpXTsKICAgICAgY2Fub25pY2FsTmFtZS5nZXRDaGlsZEZyb21NZW1iZXIobWVtYmVyKS5iaW5kVG8obWVtYmVyLnJlZmVyZW5jZSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycy5sZW5ndGg7ICsraSkgewogICAgICBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciBtZW1iZXIgPSByZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnNbaV07CiAgICAgIGNhbm9uaWNhbE5hbWUuZ2V0Q2hpbGRGcm9tTWVtYmVyKG1lbWJlcikuYmluZFRvKG1lbWJlci5yZWZlcmVuY2UpOwogICAgfQogIH0KCiAgLy8vIFRoZSBpbW1lZGlhdGUgc3VwZXIgY2xhc3MsIG9yIGBudWxsYCBpZiB0aGlzIGlzIHRoZSByb290IGNsYXNzLgogIENsYXNzIGdldCBzdXBlcmNsYXNzID0+IHN1cGVydHlwZT8uY2xhc3NOb2RlOwoKICAvLy8gVGhlIG1peGVkLWluIGNsYXNzIGlmIHRoaXMgaXMgYSBtaXhpbiBhcHBsaWNhdGlvbiwgb3RoZXJ3aXNlIGBudWxsYC4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGl0c2VsZiBiZSBhIG1peGluIGFwcGxpY2F0aW9uLiAgVXNlIFttaXhpbl0gdG8gZ2V0IHRoZQogIC8vLyBjbGFzcyB0aGF0IGhhcyB0aGUgZmllbGRzIGFuZCBwcm9jZWR1cmVzLgogIENsYXNzIGdldCBtaXhlZEluQ2xhc3MgPT4gbWl4ZWRJblR5cGU/LmNsYXNzTm9kZTsKCiAgLy8vIFRoZSBjbGFzcyB0aGF0IGRlY2xhcmVzIHRoZSBmaWVsZCBhbmQgcHJvY2VkdXJlcyBvZiB0aGlzIGNsYXNzLgogIENsYXNzIGdldCBtaXhpbiA9PiBtaXhlZEluQ2xhc3M/Lm1peGluID8/IHRoaXM7CgogIGJvb2wgZ2V0IGlzTWl4aW5BcHBsaWNhdGlvbiA9PiBtaXhlZEluVHlwZSAhPSBudWxsOwoKICBTdHJpbmcgZ2V0IGRlbWFuZ2xlZE5hbWUgewogICAgaWYgKGlzQW5vbnltb3VzTWl4aW4pIHJldHVybiBuYW1lQXNNaXhpbkFwcGxpY2F0aW9uOwogICAgYXNzZXJ0KCFuYW1lLmNvbnRhaW5zKCcmJykpOwogICAgcmV0dXJuIG5hbWU7CiAgfQoKICBTdHJpbmcgZ2V0IG5hbWVBc01peGluQXBwbGljYXRpb24gewogICAgYXNzZXJ0KGlzQW5vbnltb3VzTWl4aW4pOwogICAgcmV0dXJuIGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgfQoKICBTdHJpbmcgZ2V0IG5hbWVBc01peGluQXBwbGljYXRpb25TdWJjbGFzcyB7CiAgICBhc3NlcnQoaXNBbm9ueW1vdXNNaXhpbik7CiAgICByZXR1cm4gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uU3ViY2xhc3NOYW1lKG5hbWUpOwogIH0KCiAgLy8vIE1lbWJlcnMgZGVjbGFyZWQgaW4gdGhpcyBjbGFzcy4KICAvLy8KICAvLy8gVGhpcyBnZXR0ZXIgaXMgZm9yIGNvbnZlbmllbmNlLCBub3QgZWZmaWNpZW5jeS4gIENvbnNpZGVyIG1hbnVhbGx5CiAgLy8vIGl0ZXJhdGluZyB0aGUgbWVtYmVycyB0byBzcGVlZCB1cCBjb2RlIGluIHByb2R1Y3Rpb24uCiAgSXRlcmFibGU8TWVtYmVyPiBnZXQgbWVtYmVycyA9PiA8SXRlcmFibGU8TWVtYmVyPj5bCiAgICAgICAgZmllbGRzLAogICAgICAgIGNvbnN0cnVjdG9ycywKICAgICAgICBwcm9jZWR1cmVzLAogICAgICAgIHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycwogICAgICBdLmV4cGFuZCgoeCkgPT4geCk7CgogIC8vLyBUaGUgaW1tZWRpYXRlbHkgZXh0ZW5kZWQsIG1peGVkLWluLCBhbmQgaW1wbGVtZW50ZWQgdHlwZXMuCiAgLy8vCiAgLy8vIFRoaXMgZ2V0dGVyIGlzIGZvciBjb252ZW5pZW5jZSwgbm90IGVmZmljaWVuY3kuICBDb25zaWRlciBtYW51YWxseQogIC8vLyBpdGVyYXRpbmcgdGhlIHN1cGVyIHR5cGVzIHRvIHNwZWVkIHVwIGNvZGUgaW4gcHJvZHVjdGlvbi4KICBJdGVyYWJsZTxTdXBlcnR5cGU+IGdldCBzdXBlcnMgPT4gPEl0ZXJhYmxlPFN1cGVydHlwZT4+WwogICAgICAgIHN1cGVydHlwZSA9PSBudWxsID8gY29uc3QgW10gOiBbc3VwZXJ0eXBlXSwKICAgICAgICBtaXhlZEluVHlwZSA9PSBudWxsID8gY29uc3QgW10gOiBbbWl4ZWRJblR5cGVdLAogICAgICAgIGltcGxlbWVudGVkVHlwZXMKICAgICAgXS5leHBhbmQoKHgpID0+IHgpOwoKICAvLy8gVGhlIGxpYnJhcnkgY29udGFpbmluZyB0aGlzIGNsYXNzLgogIExpYnJhcnkgZ2V0IGVuY2xvc2luZ0xpYnJhcnkgPT4gcGFyZW50OwoKICAvLy8gQWRkcyBhIG1lbWJlciB0byB0aGlzIGNsYXNzLgogIC8vLwogIC8vLyBUaHJvd3MgYW4gZXJyb3IgaWYgYXR0ZW1wdGluZyB0byBhZGQgYSBmaWVsZCBvciBwcm9jZWR1cmUgdG8gYSBtaXhpbgogIC8vLyBhcHBsaWNhdGlvbi4KICB2b2lkIGFkZE1lbWJlcihNZW1iZXIgbWVtYmVyKSB7CiAgICBtZW1iZXIucGFyZW50ID0gdGhpczsKICAgIGlmIChtZW1iZXIgaXMgQ29uc3RydWN0b3IpIHsKICAgICAgY29uc3RydWN0b3JzLmFkZChtZW1iZXIpOwogICAgfSBlbHNlIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgIHByb2NlZHVyZXMuYWRkKG1lbWJlcik7CiAgICB9IGVsc2UgaWYgKG1lbWJlciBpcyBGaWVsZCkgewogICAgICBmaWVsZHMuYWRkKG1lbWJlcik7CiAgICB9IGVsc2UgaWYgKG1lbWJlciBpcyBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcikgewogICAgICByZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMuYWRkKG1lbWJlcik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihtZW1iZXIpOwogICAgfQogIH0KCiAgdm9pZCBhZGRBbm5vdGF0aW9uKEV4cHJlc3Npb24gbm9kZSkgewogICAgaWYgKGFubm90YXRpb25zLmlzRW1wdHkpIHsKICAgICAgYW5ub3RhdGlvbnMgPSA8RXhwcmVzc2lvbj5bXTsKICAgIH0KICAgIGFubm90YXRpb25zLmFkZChub2RlKTsKICAgIG5vZGUucGFyZW50ID0gdGhpczsKICB9CgogIGFjY2VwdChUcmVlVmlzaXRvciB2KSA9PiB2LnZpc2l0Q2xhc3ModGhpcyk7CiAgYWNjZXB0UmVmZXJlbmNlKFZpc2l0b3IgdikgPT4gdi52aXNpdENsYXNzUmVmZXJlbmNlKHRoaXMpOwoKICAvLy8gSWYgdHJ1ZSwgdGhlIGNsYXNzIGlzIHBhcnQgb2YgYW4gZXh0ZXJuYWwgbGlicmFyeSwgdGhhdCBpcywgaXQgaXMgZGVmaW5lZAogIC8vLyBpbiBhbm90aGVyIGJ1aWxkIHVuaXQuICBPbmx5IGEgc3Vic2V0IG9mIGl0cyBtZW1iZXJzIGFyZSBwcmVzZW50LgogIC8vLwogIC8vLyBUaGVzZSBjbGFzc2VzIHNob3VsZCBiZSBsb2FkZWQgYXQgZWl0aGVyIFtDbGFzc0xldmVsLlR5cGVdIG9yCiAgLy8vIFtDbGFzc0xldmVsLkhpZXJhcmNoeV0gbGV2ZWwuCiAgYm9vbCBnZXQgaXNJbkV4dGVybmFsTGlicmFyeSA9PiBlbmNsb3NpbmdMaWJyYXJ5LmlzRXh0ZXJuYWw7CgogIFN1cGVydHlwZSBnZXQgYXNSYXdTdXBlcnR5cGUgewogICAgcmV0dXJuIG5ldyBTdXBlcnR5cGUodGhpcywKICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgRHluYW1pY1R5cGUoKSkpOwogIH0KCiAgU3VwZXJ0eXBlIGdldCBhc1RoaXNTdXBlcnR5cGUgewogICAgcmV0dXJuIG5ldyBTdXBlcnR5cGUodGhpcywgX2dldEFzVHlwZUFyZ3VtZW50cyh0eXBlUGFyYW1ldGVycykpOwogIH0KCiAgQG5vY29xCiAgSW50ZXJmYWNlVHlwZSBfcmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCByYXdUeXBlID0+IF9yYXdUeXBlID8/PSBuZXcgSW50ZXJmYWNlVHlwZSh0aGlzKTsKCiAgQG5vY29xCiAgSW50ZXJmYWNlVHlwZSBfdGhpc1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgdGhpc1R5cGUgewogICAgcmV0dXJuIF90aGlzVHlwZSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZSh0aGlzLCBfZ2V0QXNUeXBlQXJndW1lbnRzKHR5cGVQYXJhbWV0ZXJzKSk7CiAgfQoKICBAbm9jb3EKICBJbnRlcmZhY2VUeXBlIF9ib3R0b21UeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IGJvdHRvbVR5cGUgewogICAgcmV0dXJuIF9ib3R0b21UeXBlID8/PSBuZXcgSW50ZXJmYWNlVHlwZSh0aGlzLAogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQodHlwZVBhcmFtZXRlcnMubGVuZ3RoLCBjb25zdCBCb3R0b21UeXBlKCkpKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgcG9zc2libHkgc3ludGhlc2l6ZWQgbmFtZSBmb3IgdGhpcyBjbGFzcywgY29uc2lzdGVudCB3aXRoCiAgLy8vIHRoZSBuYW1lcyB1c2VkIGFjcm9zcyBhbGwgW3RvU3RyaW5nXSBjYWxscy4KICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBkZWJ1Z1F1YWxpZmllZENsYXNzTmFtZSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChhbm5vdGF0aW9ucywgdik7CiAgICB2aXNpdExpc3QodHlwZVBhcmFtZXRlcnMsIHYpOwogICAgc3VwZXJ0eXBlPy5hY2NlcHQodik7CiAgICBtaXhlZEluVHlwZT8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KGltcGxlbWVudGVkVHlwZXMsIHYpOwogICAgdmlzaXRMaXN0KGNvbnN0cnVjdG9ycywgdik7CiAgICB2aXNpdExpc3QocHJvY2VkdXJlcywgdik7CiAgICB2aXNpdExpc3QoZmllbGRzLCB2KTsKICAgIHZpc2l0TGlzdChyZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KHR5cGVQYXJhbWV0ZXJzLCB2LCB0aGlzKTsKICAgIGlmIChzdXBlcnR5cGUgIT0gbnVsbCkgewogICAgICBzdXBlcnR5cGUgPSB2LnZpc2l0U3VwZXJ0eXBlKHN1cGVydHlwZSk7CiAgICB9CiAgICBpZiAobWl4ZWRJblR5cGUgIT0gbnVsbCkgewogICAgICBtaXhlZEluVHlwZSA9IHYudmlzaXRTdXBlcnR5cGUobWl4ZWRJblR5cGUpOwogICAgfQogICAgdHJhbnNmb3JtU3VwZXJ0eXBlTGlzdChpbXBsZW1lbnRlZFR5cGVzLCB2KTsKICAgIHRyYW5zZm9ybUxpc3QoY29uc3RydWN0b3JzLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QocHJvY2VkdXJlcywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KGZpZWxkcywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycywgdiwgdGhpcyk7CiAgfQoKICBMb2NhdGlvbiBfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGUoaW50IG9mZnNldCkgewogICAgcmV0dXJuIF9nZXRMb2NhdGlvbkluQ29tcG9uZW50KGVuY2xvc2luZ0NvbXBvbmVudCwgZmlsZVVyaSwgb2Zmc2V0KTsKICB9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1CRVJTCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQGNvcQphYnN0cmFjdCBjbGFzcyBNZW1iZXIgZXh0ZW5kcyBOYW1lZE5vZGUgaW1wbGVtZW50cyBBbm5vdGF0YWJsZSwgRmlsZVVyaU5vZGUgewogIC8vLyBFbmQgb2Zmc2V0IGluIHRoZSBzb3VyY2UgZmlsZSBpdCBjb21lcyBmcm9tLgogIC8vLwogIC8vLyBWYWxpZCB2YWx1ZXMgYXJlIGZyb20gMCBhbmQgdXAsIG9yIC0xIChbVHJlZU5vZGUubm9PZmZzZXRdKSBpZiB0aGUgZmlsZQogIC8vLyBlbmQgb2Zmc2V0IGlzIG5vdCBhdmFpbGFibGUgKHRoaXMgaXMgdGhlIGRlZmF1bHQgaWYgbm9uZSBpcyBzcGVjaWZpY2FsbHkKICAvLy8gc2V0KS4KICBpbnQgZmlsZUVuZE9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0OwoKICAvLy8gTGlzdCBvZiBtZXRhZGF0YSBhbm5vdGF0aW9ucyBvbiB0aGUgbWVtYmVyLgogIC8vLwogIC8vLyBUaGlzIGRlZmF1bHRzIHRvIGFuIGltbXV0YWJsZSBlbXB0eSBsaXN0LiBVc2UgW2FkZEFubm90YXRpb25dIHRvIGFkZAogIC8vLyBhbm5vdGF0aW9ucyBpZiBuZWVkZWQuCiAgQG5vY29xCiAgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9ucyA9IGNvbnN0IDxFeHByZXNzaW9uPltdOwoKICBOYW1lIG5hbWU7CgogIC8vLyBUaGUgVVJJIG9mIHRoZSBzb3VyY2UgZmlsZSB0aGlzIG1lbWJlciB3YXMgbG9hZGVkIGZyb20uCiAgVXJpIGZpbGVVcmk7CgogIC8vLyBGbGFncyBzdW1tYXJpemluZyB0aGUga2luZHMgb2YgQVNUIG5vZGVzIGNvbnRhaW5lZCBpbiB0aGlzIG1lbWJlciwgZm9yCiAgLy8vIHNwZWVkaW5nIHVwIHRyYW5zZm9ybWF0aW9ucyB0aGF0IG9ubHkgYWZmZWN0IGNlcnRhaW4gdHlwZXMgb2Ygbm9kZXMuCiAgLy8vCiAgLy8vIFNlZSBbVHJhbnNmb3JtZXJGbGFnXSBmb3IgdGhlIG1lYW5pbmcgb2YgZWFjaCBiaXQuCiAgLy8vCiAgLy8vIFRoZXNlIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2Ugb3RoZXIgdGhhbiBza2lwcGluZyBjZXJ0YWluCiAgLy8vIG1lbWJlcnMgaWYgaXQgY2FuIGJlIGRldGVybWluZWQgdGhhdCBubyB3b3JrIGlzIG5lZWRlZCBpbiB0aGVyZS4KICAvLy8KICAvLy8gSXQgaXMgdmFsaWQgZm9yIHRoZXNlIGZsYWdzIHRvIGJlIGZhbHNlIHBvc2l0aXZlcyBpbiByYXJlIGNhc2VzLCBzbwogIC8vLyB0cmFuc2Zvcm1lcnMgbXVzdCB0b2xlcmF0ZSB0aGUgY2FzZSB3aGVyZSBhIGZsYWcgaXMgc3B1cmlvdXNseSBzZXQuCiAgLy8vCiAgLy8vIFRoaXMgdmFsdWUgaXMgbm90IHNlcmlhbGl6ZWQ7IGl0IGlzIHBvcHVsYXRlZCBieSB0aGUgZnJvbnRlbmQgYW5kIHRoZQogIC8vLyBkZXNlcmlhbGl6ZXIuCiAgLy8KICAvLyBUT0RPKGFzZ2VyZik6IEl0IG1pZ2h0IGJlIHdvcnRod2hpbGUgdG8gcHV0IHRoaXMgb24gY2xhc3NlcyBhcyB3ZWxsLgogIGludCB0cmFuc2Zvcm1lckZsYWdzID0gMDsKCiAgTWVtYmVyKHRoaXMubmFtZSwgdGhpcy5maWxlVXJpLCBSZWZlcmVuY2UgcmVmZXJlbmNlKSA6IHN1cGVyKHJlZmVyZW5jZSk7CgogIENsYXNzIGdldCBlbmNsb3NpbmdDbGFzcyA9PiBwYXJlbnQgaXMgQ2xhc3MgPyBwYXJlbnQgOiBudWxsOwogIExpYnJhcnkgZ2V0IGVuY2xvc2luZ0xpYnJhcnkgPT4gcGFyZW50IGlzIENsYXNzID8gcGFyZW50LnBhcmVudCA6IHBhcmVudDsKCiAgYWNjZXB0KE1lbWJlclZpc2l0b3Igdik7CiAgYWNjZXB0UmVmZXJlbmNlKE1lbWJlclJlZmVyZW5jZVZpc2l0b3Igdik7CgogIC8vLyBJZiB0cnVlLCB0aGUgbWVtYmVyIGlzIHBhcnQgb2YgYW4gZXh0ZXJuYWwgbGlicmFyeSwgdGhhdCBpcywgaXQgaXMgZGVmaW5lZAogIC8vLyBpbiBhbm90aGVyIGJ1aWxkIHVuaXQuICBTdWNoIG1lbWJlcnMgaGF2ZSBubyBib2R5IG9yIGluaXRpYWxpemVyIHByZXNlbnQKICAvLy8gaW4gdGhlIElSLgogIGJvb2wgZ2V0IGlzSW5FeHRlcm5hbExpYnJhcnkgPT4gZW5jbG9zaW5nTGlicmFyeS5pc0V4dGVybmFsOwoKICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYW4gYWJzdHJhY3QgcHJvY2VkdXJlLgogIGJvb2wgZ2V0IGlzQWJzdHJhY3QgPT4gZmFsc2U7CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1lbWJlciBoYXMgdGhlICdjb25zdCcgbW9kaWZpZXIuCiAgYm9vbCBnZXQgaXNDb25zdDsKCiAgLy8vIFRydWUgaWYgdGhpcyBpcyBhIGZpZWxkIG9yIG5vbi1zZXR0ZXIgcHJvY2VkdXJlLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgb3BlcmF0b3JzIGFuZCBmYWN0b3JpZXMgcmV0dXJuIGB0cnVlYCwgZXZlbiB0aG91Z2ggdGhlcmUgYXJlCiAgLy8vIG5vcm1hbGx5IG5vIGNhbGxzIHRvIHRoZWlyIGdldHRlci4KICBib29sIGdldCBoYXNHZXR0ZXI7CgogIC8vLyBUcnVlIGlmIHRoaXMgaXMgYSBzZXR0ZXIgb3IgYSBtdXRhYmxlIGZpZWxkLgogIGJvb2wgZ2V0IGhhc1NldHRlcjsKCiAgLy8vIFRydWUgaWYgdGhpcyBpcyBhIG5vbi1zdGF0aWMgZmllbGQgb3IgcHJvY2VkdXJlLgogIGJvb2wgZ2V0IGlzSW5zdGFuY2VNZW1iZXI7CgogIC8vLyBUcnVlIGlmIHRoZSBtZW1iZXIgaGFzIHRoZSBgZXh0ZXJuYWxgIG1vZGlmaWVyLCBpbXBseWluZyB0aGF0IHRoZQogIC8vLyBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCBieSB0aGUgYmFja2VuZCwgYW5kIGlzIG5vdCBuZWNlc3NhcmlseSB3cml0dGVuCiAgLy8vIGluIERhcnQuCiAgLy8vCiAgLy8vIE1lbWJlcnMgY2FuIGhhdmUgdGhpcyBtb2RpZmllciBpbmRlcGVuZGVudGx5IG9mIHdoZXRoZXIgdGhlIGVuY2xvc2luZwogIC8vLyBsaWJyYXJ5IGlzIGV4dGVybmFsLgogIGJvb2wgZ2V0IGlzRXh0ZXJuYWw7CiAgdm9pZCBzZXQgaXNFeHRlcm5hbChib29sIHZhbHVlKTsKCiAgLy8vIFRoZSBib2R5IG9mIHRoZSBwcm9jZWR1cmUgb3IgY29uc3RydWN0b3IsIG9yIGBudWxsYCBpZiB0aGlzIGlzIGEgZmllbGQuCiAgRnVuY3Rpb25Ob2RlIGdldCBmdW5jdGlvbiA9PiBudWxsOwoKICAvLy8gUmV0dXJucyBhIHBvc3NpYmx5IHN5bnRoZXNpemVkIG5hbWUgZm9yIHRoaXMgbWVtYmVyLCBjb25zaXN0ZW50IHdpdGgKICAvLy8gdGhlIG5hbWVzIHVzZWQgYWNyb3NzIGFsbCBbdG9TdHJpbmddIGNhbGxzLgogIFN0cmluZyB0b1N0cmluZygpID0+IGRlYnVnUXVhbGlmaWVkTWVtYmVyTmFtZSh0aGlzKTsKCiAgdm9pZCBhZGRBbm5vdGF0aW9uKEV4cHJlc3Npb24gbm9kZSkgewogICAgaWYgKGFubm90YXRpb25zLmlzRW1wdHkpIHsKICAgICAgYW5ub3RhdGlvbnMgPSA8RXhwcmVzc2lvbj5bXTsKICAgIH0KICAgIGFubm90YXRpb25zLmFkZChub2RlKTsKICAgIG5vZGUucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldCBnZXR0ZXJUeXBlOwogIERhcnRUeXBlIGdldCBzZXR0ZXJUeXBlOwoKICBib29sIGdldCBjb250YWluc1N1cGVyQ2FsbHMgewogICAgcmV0dXJuIHRyYW5zZm9ybWVyRmxhZ3MgJiBUcmFuc2Zvcm1lckZsYWcuc3VwZXJDYWxscyAhPSAwOwogIH0KfQoKLy8vIEEgZmllbGQgZGVjbGFyYXRpb24uCi8vLwovLy8gVGhlIGltcGxpZWQgZ2V0dGVyIGFuZCBzZXR0ZXIgZm9yIHRoZSBmaWVsZCBhcmUgbm90IHJlcHJlc2VudGVkIGV4cGxpY2l0bHksCi8vLyBidXQgY2FuIGJlIG1hZGUgZXhwbGljaXQgaWYgbmVlZGVkLgpjbGFzcyBGaWVsZCBleHRlbmRzIE1lbWJlciB7CiAgRGFydFR5cGUgdHlwZTsgLy8gTm90IG51bGwuIERlZmF1bHRzIHRvIER5bmFtaWNUeXBlLgogIGludCBmbGFncyA9IDA7CiAgRXhwcmVzc2lvbiBpbml0aWFsaXplcjsgLy8gTWF5IGJlIG51bGwuCgogIEZpZWxkKE5hbWUgbmFtZSwKICAgICAge3RoaXMudHlwZTogY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgdGhpcy5pbml0aWFsaXplciwKICAgICAgYm9vbCBpc0NvdmFyaWFudDogZmFsc2UsCiAgICAgIGJvb2wgaXNGaW5hbDogZmFsc2UsCiAgICAgIGJvb2wgaXNDb25zdDogZmFsc2UsCiAgICAgIGJvb2wgaXNTdGF0aWM6IGZhbHNlLAogICAgICBib29sIGhhc0ltcGxpY2l0R2V0dGVyLAogICAgICBib29sIGhhc0ltcGxpY2l0U2V0dGVyLAogICAgICBpbnQgdHJhbnNmb3JtZXJGbGFnczogMCwKICAgICAgVXJpIGZpbGVVcmksCiAgICAgIFJlZmVyZW5jZSByZWZlcmVuY2V9KQogICAgICA6IHN1cGVyKG5hbWUsIGZpbGVVcmksIHJlZmVyZW5jZSkgewogICAgYXNzZXJ0KHR5cGUgIT0gbnVsbCk7CiAgICBpbml0aWFsaXplcj8ucGFyZW50ID0gdGhpczsKICAgIHRoaXMuaXNDb3ZhcmlhbnQgPSBpc0NvdmFyaWFudDsKICAgIHRoaXMuaXNGaW5hbCA9IGlzRmluYWw7CiAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0OwogICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljOwogICAgdGhpcy5oYXNJbXBsaWNpdEdldHRlciA9IGhhc0ltcGxpY2l0R2V0dGVyID8/ICFpc1N0YXRpYzsKICAgIHRoaXMuaGFzSW1wbGljaXRTZXR0ZXIgPSBoYXNJbXBsaWNpdFNldHRlciA/PyAoIWlzU3RhdGljICYmICFpc0ZpbmFsKTsKICAgIHRoaXMudHJhbnNmb3JtZXJGbGFncyA9IHRyYW5zZm9ybWVyRmxhZ3M7CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IEZsYWdGaW5hbCA9IDEgPDwgMDsgLy8gTXVzdCBtYXRjaCBzZXJpYWxpemVkIGJpdCBwb3NpdGlvbnMuCiAgc3RhdGljIGNvbnN0IGludCBGbGFnQ29uc3QgPSAxIDw8IDE7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnU3RhdGljID0gMSA8PCAyOwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0hhc0ltcGxpY2l0R2V0dGVyID0gMSA8PCAzOwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0hhc0ltcGxpY2l0U2V0dGVyID0gMSA8PCA0OwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0NvdmFyaWFudCA9IDEgPDwgNTsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdHZW5lcmljQ292YXJpYW50SW1wbCA9IDEgPDwgNjsKCiAgLy8vIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGRlY2xhcmVkIHdpdGggdGhlIGBjb3ZhcmlhbnRgIGtleXdvcmQuCiAgYm9vbCBnZXQgaXNDb3ZhcmlhbnQgPT4gZmxhZ3MgJiBGbGFnQ292YXJpYW50ICE9IDA7CgogIGJvb2wgZ2V0IGlzRmluYWwgPT4gZmxhZ3MgJiBGbGFnRmluYWwgIT0gMDsKICBib29sIGdldCBpc0NvbnN0ID0+IGZsYWdzICYgRmxhZ0NvbnN0ICE9IDA7CiAgYm9vbCBnZXQgaXNTdGF0aWMgPT4gZmxhZ3MgJiBGbGFnU3RhdGljICE9IDA7CgogIC8vLyBJZiB0cnVlLCBhIGdldHRlciBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGlzIGZpZWxkLgogIC8vLwogIC8vLyBJZiBmYWxzZSwgdGhlcmUgbWF5IG9yIG1heSBub3QgZXhpc3QgYW4gZXhwbGljaXQgZ2V0dGVyIGluIHRoZSBzYW1lIGNsYXNzCiAgLy8vIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZmllbGQuCiAgLy8vCiAgLy8vIEJ5IGRlZmF1bHQsIGFsbCBub24tc3RhdGljIGZpZWxkcyBoYXZlIGltcGxpY2l0IGdldHRlcnMuCiAgYm9vbCBnZXQgaGFzSW1wbGljaXRHZXR0ZXIgPT4gZmxhZ3MgJiBGbGFnSGFzSW1wbGljaXRHZXR0ZXIgIT0gMDsKCiAgLy8vIElmIHRydWUsIGEgc2V0dGVyIHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgZmllbGQuCiAgLy8vCiAgLy8vIElmIGZhbHNlLCB0aGVyZSBtYXkgb3IgbWF5IG5vdCBleGlzdCBhbiBleHBsaWNpdCBzZXR0ZXIgaW4gdGhlIHNhbWUgY2xhc3MKICAvLy8gd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBmaWVsZC4KICAvLy8KICAvLy8gRmluYWwgZmllbGRzIG5ldmVyIGhhdmUgaW1wbGljaXQgc2V0dGVycywgYnV0IGEgZmllbGQgd2l0aG91dCBhbiBpbXBsaWNpdAogIC8vLyBzZXR0ZXIgaXMgbm90IG5lY2Vzc2FyaWx5IGZpbmFsLCBhcyBpdCBtYXkgYmUgbXV0YXRlZCBieSBkaXJlY3QgZmllbGQKICAvLy8gYWNjZXNzLgogIC8vLwogIC8vLyBCeSBkZWZhdWx0LCBhbGwgbm9uLXN0YXRpYywgbm9uLWZpbmFsIGZpZWxkcyBoYXZlIGltcGxpY2l0IHNldHRlcnMuCiAgYm9vbCBnZXQgaGFzSW1wbGljaXRTZXR0ZXIgPT4gZmxhZ3MgJiBGbGFnSGFzSW1wbGljaXRTZXR0ZXIgIT0gMDsKCiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbXBsaWNpdCBzZXR0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmllbGQgbmVlZHMgdG8KICAvLy8gY29udGFpbiBhIHJ1bnRpbWUgdHlwZSBjaGVjayB0byBkZWFsIHdpdGggZ2VuZXJpYyBjb3ZhcmlhbmNlLgogIC8vLwogIC8vLyBXaGVuIGB0cnVlYCwgcnVudGltZSBjaGVja3MgbWF5IG5lZWQgdG8gYmUgcGVyZm9ybWVkOyBzZWUKICAvLy8gW0Rpc3BhdGNoQ2F0ZWdvcnldIGZvciBkZXRhaWxzLgogIGJvb2wgZ2V0IGlzR2VuZXJpY0NvdmFyaWFudEltcGwgPT4gZmxhZ3MgJiBGbGFnR2VuZXJpY0NvdmFyaWFudEltcGwgIT0gMDsKCiAgdm9pZCBzZXQgaXNDb3ZhcmlhbnQoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdDb3ZhcmlhbnQpIDogKGZsYWdzICYgfkZsYWdDb3ZhcmlhbnQpOwogIH0KCiAgdm9pZCBzZXQgaXNGaW5hbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0ZpbmFsKSA6IChmbGFncyAmIH5GbGFnRmluYWwpOwogIH0KCiAgdm9pZCBzZXQgaXNDb25zdChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0NvbnN0KSA6IChmbGFncyAmIH5GbGFnQ29uc3QpOwogIH0KCiAgdm9pZCBzZXQgaXNTdGF0aWMoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdTdGF0aWMpIDogKGZsYWdzICYgfkZsYWdTdGF0aWMpOwogIH0KCiAgdm9pZCBzZXQgaGFzSW1wbGljaXRHZXR0ZXIoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZQogICAgICAgID8gKGZsYWdzIHwgRmxhZ0hhc0ltcGxpY2l0R2V0dGVyKQogICAgICAgIDogKGZsYWdzICYgfkZsYWdIYXNJbXBsaWNpdEdldHRlcik7CiAgfQoKICB2b2lkIHNldCBoYXNJbXBsaWNpdFNldHRlcihib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlCiAgICAgICAgPyAoZmxhZ3MgfCBGbGFnSGFzSW1wbGljaXRTZXR0ZXIpCiAgICAgICAgOiAoZmxhZ3MgJiB+RmxhZ0hhc0ltcGxpY2l0U2V0dGVyKTsKICB9CgogIHZvaWQgc2V0IGlzR2VuZXJpY0NvdmFyaWFudEltcGwoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZQogICAgICAgID8gKGZsYWdzIHwgRmxhZ0dlbmVyaWNDb3ZhcmlhbnRJbXBsKQogICAgICAgIDogKGZsYWdzICYgfkZsYWdHZW5lcmljQ292YXJpYW50SW1wbCk7CiAgfQoKICAvLy8gVHJ1ZSBpZiB0aGUgZmllbGQgaXMgbmVpdGhlciBmaW5hbCBub3IgY29uc3QuCiAgYm9vbCBnZXQgaXNNdXRhYmxlID0+IGZsYWdzICYgKEZsYWdGaW5hbCB8IEZsYWdDb25zdCkgPT0gMDsKICBib29sIGdldCBpc0luc3RhbmNlTWVtYmVyID0+ICFpc1N0YXRpYzsKICBib29sIGdldCBoYXNHZXR0ZXIgPT4gdHJ1ZTsKICBib29sIGdldCBoYXNTZXR0ZXIgPT4gaXNNdXRhYmxlOwoKICBib29sIGdldCBpc0V4dGVybmFsID0+IGZhbHNlOwogIHZvaWQgc2V0IGlzRXh0ZXJuYWwoYm9vbCB2YWx1ZSkgewogICAgaWYgKHZhbHVlKSB0aHJvdyAnRmllbGRzIGNhbm5vdCBiZSBleHRlcm5hbCc7CiAgfQoKICBhY2NlcHQoTWVtYmVyVmlzaXRvciB2KSA9PiB2LnZpc2l0RmllbGQodGhpcyk7CgogIGFjY2VwdFJlZmVyZW5jZShNZW1iZXJSZWZlcmVuY2VWaXNpdG9yIHYpID0+IHYudmlzaXRGaWVsZFJlZmVyZW5jZSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChhbm5vdGF0aW9ucywgdik7CiAgICB0eXBlPy5hY2NlcHQodik7CiAgICBuYW1lPy5hY2NlcHQodik7CiAgICBpbml0aWFsaXplcj8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHlwZSA9IHYudmlzaXREYXJ0VHlwZSh0eXBlKTsKICAgIHRyYW5zZm9ybUxpc3QoYW5ub3RhdGlvbnMsIHYsIHRoaXMpOwogICAgaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplci5hY2NlcHQodik7CiAgICAgIGluaXRpYWxpemVyPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KCiAgRGFydFR5cGUgZ2V0IGdldHRlclR5cGUgPT4gdHlwZTsKICBEYXJ0VHlwZSBnZXQgc2V0dGVyVHlwZSA9PiBpc011dGFibGUgPyB0eXBlIDogY29uc3QgQm90dG9tVHlwZSgpOwoKICBMb2NhdGlvbiBfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGUoaW50IG9mZnNldCkgewogICAgcmV0dXJuIF9nZXRMb2NhdGlvbkluQ29tcG9uZW50KGVuY2xvc2luZ0NvbXBvbmVudCwgZmlsZVVyaSwgb2Zmc2V0KTsKICB9Cn0KCi8vLyBBIGdlbmVyYXRpdmUgY29uc3RydWN0b3IsIHBvc3NpYmx5IHJlZGlyZWN0aW5nLgovLy8KLy8vIE5vdGUgdGhhdCBmYWN0b3J5IGNvbnN0cnVjdG9ycyBhcmUgdHJlYXRlZCBhcyBbUHJvY2VkdXJlXXMuCi8vLwovLy8gQ29uc3RydWN0b3JzIGRvIG5vdCB0YWtlIHR5cGUgcGFyYW1ldGVycy4gIFR5cGUgYXJndW1lbnRzIGZyb20gYSBjb25zdHJ1Y3RvcgovLy8gaW52b2NhdGlvbiBzaG91bGQgYmUgbWF0Y2hlZCB3aXRoIHRoZSB0eXBlIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4gdGhlIGNsYXNzLgovLy8KLy8vIEZvciB1bm5hbWVkIGNvbnN0cnVjdG9ycywgdGhlIG5hbWUgaXMgYW4gZW1wdHkgc3RyaW5nIChpbiBhIFtOYW1lXSkuCmNsYXNzIENvbnN0cnVjdG9yIGV4dGVuZHMgTWVtYmVyIHsKICAvLy8gU3RhcnQgb2Zmc2V0IG9mIHRoZSBjb25zdHJ1Y3RvciBpbiB0aGUgc291cmNlIGZpbGUgaXQgY29tZXMgZnJvbS4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoaXMgaW5jbHVkZXMgYW5ub3RhdGlvbnMgaWYgYW55LgogIC8vLwogIC8vLyBWYWxpZCB2YWx1ZXMgYXJlIGZyb20gMCBhbmQgdXAsIG9yIC0xIChbVHJlZU5vZGUubm9PZmZzZXRdKSBpZiB0aGUgZmlsZQogIC8vLyBzdGFydCBvZmZzZXQgaXMgbm90IGF2YWlsYWJsZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBpZiBub25lIGlzIHNwZWNpZmljYWxseQogIC8vLyBzZXQpLgogIGludCBzdGFydEZpbGVPZmZzZXQgPSBUcmVlTm9kZS5ub09mZnNldDsKCiAgaW50IGZsYWdzID0gMDsKICBGdW5jdGlvbk5vZGUgZnVuY3Rpb247CiAgTGlzdDxJbml0aWFsaXplcj4gaW5pdGlhbGl6ZXJzOwoKICBDb25zdHJ1Y3Rvcih0aGlzLmZ1bmN0aW9uLAogICAgICB7TmFtZSBuYW1lLAogICAgICBib29sIGlzQ29uc3Q6IGZhbHNlLAogICAgICBib29sIGlzRXh0ZXJuYWw6IGZhbHNlLAogICAgICBib29sIGlzU3ludGhldGljOiBmYWxzZSwKICAgICAgTGlzdDxJbml0aWFsaXplcj4gaW5pdGlhbGl6ZXJzLAogICAgICBpbnQgdHJhbnNmb3JtZXJGbGFnczogMCwKICAgICAgVXJpIGZpbGVVcmksCiAgICAgIFJlZmVyZW5jZSByZWZlcmVuY2V9KQogICAgICA6IHRoaXMuaW5pdGlhbGl6ZXJzID0gaW5pdGlhbGl6ZXJzID8/IDxJbml0aWFsaXplcj5bXSwKICAgICAgICBzdXBlcihuYW1lLCBmaWxlVXJpLCByZWZlcmVuY2UpIHsKICAgIGZ1bmN0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgc2V0UGFyZW50cyh0aGlzLmluaXRpYWxpemVycywgdGhpcyk7CiAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0OwogICAgdGhpcy5pc0V4dGVybmFsID0gaXNFeHRlcm5hbDsKICAgIHRoaXMuaXNTeW50aGV0aWMgPSBpc1N5bnRoZXRpYzsKICAgIHRoaXMudHJhbnNmb3JtZXJGbGFncyA9IHRyYW5zZm9ybWVyRmxhZ3M7CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IEZsYWdDb25zdCA9IDEgPDwgMDsgLy8gTXVzdCBtYXRjaCBzZXJpYWxpemVkIGJpdCBwb3NpdGlvbnMuCiAgc3RhdGljIGNvbnN0IGludCBGbGFnRXh0ZXJuYWwgPSAxIDw8IDE7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnU3ludGhldGljID0gMSA8PCAyOwoKICBib29sIGdldCBpc0NvbnN0ID0+IGZsYWdzICYgRmxhZ0NvbnN0ICE9IDA7CiAgYm9vbCBnZXQgaXNFeHRlcm5hbCA9PiBmbGFncyAmIEZsYWdFeHRlcm5hbCAhPSAwOwoKICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgc3ludGhldGljIGNvbnN0cnVjdG9yIGluc2VydGVkIGluIGEgY2xhc3MgdGhhdAogIC8vLyBkb2VzIG5vdCBvdGhlcndpc2UgZGVjbGFyZSBhbnkgY29uc3RydWN0b3JzLgogIGJvb2wgZ2V0IGlzU3ludGhldGljID0+IGZsYWdzICYgRmxhZ1N5bnRoZXRpYyAhPSAwOwoKICB2b2lkIHNldCBpc0NvbnN0KGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnQ29uc3QpIDogKGZsYWdzICYgfkZsYWdDb25zdCk7CiAgfQoKICB2b2lkIHNldCBpc0V4dGVybmFsKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnRXh0ZXJuYWwpIDogKGZsYWdzICYgfkZsYWdFeHRlcm5hbCk7CiAgfQoKICB2b2lkIHNldCBpc1N5bnRoZXRpYyhib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ1N5bnRoZXRpYykgOiAoZmxhZ3MgJiB+RmxhZ1N5bnRoZXRpYyk7CiAgfQoKICBib29sIGdldCBpc0luc3RhbmNlTWVtYmVyID0+IGZhbHNlOwogIGJvb2wgZ2V0IGhhc0dldHRlciA9PiBmYWxzZTsKICBib29sIGdldCBoYXNTZXR0ZXIgPT4gZmFsc2U7CgogIGFjY2VwdChNZW1iZXJWaXNpdG9yIHYpID0+IHYudmlzaXRDb25zdHJ1Y3Rvcih0aGlzKTsKCiAgYWNjZXB0UmVmZXJlbmNlKE1lbWJlclJlZmVyZW5jZVZpc2l0b3IgdikgPT4KICAgICAgdi52aXNpdENvbnN0cnVjdG9yUmVmZXJlbmNlKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmlzaXRMaXN0KGFubm90YXRpb25zLCB2KTsKICAgIG5hbWU/LmFjY2VwdCh2KTsKICAgIHZpc2l0TGlzdChpbml0aWFsaXplcnMsIHYpOwogICAgZnVuY3Rpb24/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHRyYW5zZm9ybUxpc3QoYW5ub3RhdGlvbnMsIHYsIHRoaXMpOwogICAgdHJhbnNmb3JtTGlzdChpbml0aWFsaXplcnMsIHYsIHRoaXMpOwogICAgaWYgKGZ1bmN0aW9uICE9IG51bGwpIHsKICAgICAgZnVuY3Rpb24gPSBmdW5jdGlvbi5hY2NlcHQodik7CiAgICAgIGZ1bmN0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KCiAgRGFydFR5cGUgZ2V0IGdldHRlclR5cGUgPT4gY29uc3QgQm90dG9tVHlwZSgpOwogIERhcnRUeXBlIGdldCBzZXR0ZXJUeXBlID0+IGNvbnN0IEJvdHRvbVR5cGUoKTsKCiAgTG9jYXRpb24gX2dldExvY2F0aW9uSW5FbmNsb3NpbmdGaWxlKGludCBvZmZzZXQpIHsKICAgIHJldHVybiBfZ2V0TG9jYXRpb25JbkNvbXBvbmVudChlbmNsb3NpbmdDb21wb25lbnQsIGZpbGVVcmksIG9mZnNldCk7CiAgfQp9CgovLy8gUmVzaWR1ZSBvZiBhIHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3IgZm9yIHRoZSBsaW5raW5nIHBoYXNlLgovLy8KLy8vIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgYGJhcmAgaXMgYSByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9yLgovLy8KLy8vICAgICBjbGFzcyBBIHsKLy8vICAgICAgIEEuZm9vKCk7Ci8vLyAgICAgICBmYWN0b3J5IEEuYmFyKCkgPSBBLmZvbzsKLy8vICAgICB9Ci8vLwovLy8gQW4gaW52b2NhdGlvbiBvZiBgbmV3IEEuYmFyKClgIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgYW4gaW52b2NhdGlvbiBvZgovLy8gYG5ldyBBLmZvbygpYC4gIEluIEtlcm5lbCwgdGhlIGludm9jYXRpb25zIG9mIGBiYXJgIGFyZSByZXBsYWNlZCB3aXRoCi8vLyBpbnZvY2F0aW9ucyBvZiBgZm9vYCwgYW5kIGFmdGVyIGl0IGlzIGRvbmUsIHRoZSByZWRpcmVjdGluZyBjb25zdHJ1Y3RvciBjYW4KLy8vIGJlIHJlbW92ZWQgZnJvbSB0aGUgY2xhc3MuICBIb3dldmVyLCBpdCBpcyBuZWVkZWQgZHVyaW5nIHRoZSBsaW5raW5nIHBoYXNlLAovLy8gYmVjYXVzZSBvdGhlciBtb2R1bGVzIGNhbiByZWZlciB0byB0aGF0IGNvbnN0cnVjdG9yLgovLy8KLy8vIFtSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcl1zIGNvbnRhaW4gdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IKLy8vIGxpbmtpbmcgYW5kIGFyZSB0cmVhdGVkIGFzIG5vbi1ydW5uYWJsZSBtZW1iZXJzIG9mIGNsYXNzZXMgdGhhdCBtZXJlbHkgc2VydmUKLy8vIGFzIGNvbnRhaW5lcnMgZm9yIHRoYXQgaW5mb3JtYXRpb24uCi8vLwovLy8gUmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvcnMgY2FuIGJlIHVubmFtZWQuICBJbiB0aGlzIGNhc2UsIHRoZSBuYW1lIGlzCi8vLyBhbiBlbXB0eSBzdHJpbmcgKGluIGEgW05hbWVdKS4KY2xhc3MgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgZXh0ZW5kcyBNZW1iZXIgewogIGludCBmbGFncyA9IDA7CgogIC8vLyBbUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JdcyBtYXkgcmVkaXJlY3QgdG8gY29uc3RydWN0b3JzIG9yIGZhY3RvcmllcwogIC8vLyBvZiBpbnN0YW50aWF0ZWQgZ2VuZXJpYyB0eXBlcywgdGhhdCBpcywgZ2VuZXJpYyB0eXBlcyB3aXRoIHN1cHBsaWVkIHR5cGUKICAvLy8gYXJndW1lbnRzLiAgVGhlIHN1cHBsaWVkIHR5cGUgYXJndW1lbnRzIGFyZSBzdG9yZWQgaW4gdGhpcyBmaWVsZC4KICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwoKICAvLy8gUmVmZXJlbmNlIHRvIHRoZSBjb25zdHJ1Y3RvciBvciB0aGUgZmFjdG9yeSB0aGF0IHRoaXMKICAvLy8gW1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yXSByZWRpcmVjdHMgdG8uCiAgUmVmZXJlbmNlIHRhcmdldFJlZmVyZW5jZTsKCiAgLy8vIFt0eXBlUGFyYW1ldGVyc10gYXJlIGR1cGxpY2F0ZXMgb2YgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUgZW5jbG9zaW5nCiAgLy8vIGNsYXNzLiAgQmVjYXVzZSBbUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JdcyBhcmVuJ3QgaW5zdGFuY2UgbWVtYmVycywKICAvLy8gcmVmZXJlbmNlcyB0byB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MgaW4gdGhlCiAgLy8vIHJlZGlyZWN0aW9uIHRhcmdldCBkZXNjcmlwdGlvbiBhcmUgZW5jb2RlZCB3aXRoIHJlZmVyZW5jZXMgdG8gdGhlIGVsZW1lbnRzCiAgLy8vIG9mIFt0eXBlUGFyYW1ldGVyc10uCiAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKCiAgLy8vIFBvc2l0aW9uYWwgcGFyYW1ldGVycyBvZiBbUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JdcyBzaG91bGQgYmUKICAvLy8gY29tcGF0aWJsZSB3aXRoIHRoYXQgb2YgdGhlIHRhcmdldCBjb25zdHJ1Y3Rvci4KICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50OwoKICAvLy8gTmFtZWQgcGFyYW1ldGVycyBvZiBbUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JdcyBzaG91bGQgYmUgY29tcGF0aWJsZQogIC8vLyB3aXRoIHRoYXQgb2YgdGhlIHRhcmdldCBjb25zdHJ1Y3Rvci4KICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVyczsKCiAgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IodGhpcy50YXJnZXRSZWZlcmVuY2UsCiAgICAgIHtOYW1lIG5hbWUsCiAgICAgIGJvb2wgaXNDb25zdDogZmFsc2UsCiAgICAgIGJvb2wgaXNFeHRlcm5hbDogZmFsc2UsCiAgICAgIGludCB0cmFuc2Zvcm1lckZsYWdzOiAwLAogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycywKICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgIFVyaSBmaWxlVXJpLAogICAgICBSZWZlcmVuY2UgcmVmZXJlbmNlfSkKICAgICAgOiB0aGlzLnR5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1lbnRzID8/IDxEYXJ0VHlwZT5bXSwKICAgICAgICB0aGlzLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnMgPz8gPFR5cGVQYXJhbWV0ZXI+W10sCiAgICAgICAgdGhpcy5wb3NpdGlvbmFsUGFyYW1ldGVycyA9CiAgICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzID8/IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdLAogICAgICAgIHRoaXMubmFtZWRQYXJhbWV0ZXJzID0gbmFtZWRQYXJhbWV0ZXJzID8/IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdLAogICAgICAgIHRoaXMucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9CiAgICAgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPz8gcG9zaXRpb25hbFBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwLAogICAgICAgIHN1cGVyKG5hbWUsIGZpbGVVcmksIHJlZmVyZW5jZSkgewogICAgc2V0UGFyZW50cyh0aGlzLnR5cGVQYXJhbWV0ZXJzLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy5wb3NpdGlvbmFsUGFyYW1ldGVycywgdGhpcyk7CiAgICBzZXRQYXJlbnRzKHRoaXMubmFtZWRQYXJhbWV0ZXJzLCB0aGlzKTsKICAgIHRoaXMuaXNDb25zdCA9IGlzQ29uc3Q7CiAgICB0aGlzLmlzRXh0ZXJuYWwgPSBpc0V4dGVybmFsOwogICAgdGhpcy50cmFuc2Zvcm1lckZsYWdzID0gdHJhbnNmb3JtZXJGbGFnczsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0NvbnN0ID0gMSA8PCAwOyAvLyBNdXN0IG1hdGNoIHNlcmlhbGl6ZWQgYml0IHBvc2l0aW9ucy4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdFeHRlcm5hbCA9IDEgPDwgMTsKCiAgYm9vbCBnZXQgaXNDb25zdCA9PiBmbGFncyAmIEZsYWdDb25zdCAhPSAwOwogIGJvb2wgZ2V0IGlzRXh0ZXJuYWwgPT4gZmxhZ3MgJiBGbGFnRXh0ZXJuYWwgIT0gMDsKCiAgdm9pZCBzZXQgaXNDb25zdChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0NvbnN0KSA6IChmbGFncyAmIH5GbGFnQ29uc3QpOwogIH0KCiAgdm9pZCBzZXQgaXNFeHRlcm5hbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0V4dGVybmFsKSA6IChmbGFncyAmIH5GbGFnRXh0ZXJuYWwpOwogIH0KCiAgYm9vbCBnZXQgaXNJbnN0YW5jZU1lbWJlciA9PiBmYWxzZTsKICBib29sIGdldCBoYXNHZXR0ZXIgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaGFzU2V0dGVyID0+IGZhbHNlOwoKICBib29sIGdldCBpc1VucmVzb2x2ZWQgPT4gdGFyZ2V0UmVmZXJlbmNlID09IG51bGw7CgogIE1lbWJlciBnZXQgdGFyZ2V0ID0+IHRhcmdldFJlZmVyZW5jZT8uYXNNZW1iZXI7CgogIHZvaWQgc2V0IHRhcmdldChNZW1iZXIgbWVtYmVyKSB7CiAgICBhc3NlcnQobWVtYmVyIGlzIENvbnN0cnVjdG9yIHx8CiAgICAgICAgKG1lbWJlciBpcyBQcm9jZWR1cmUgJiYgbWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5GYWN0b3J5KSk7CiAgICB0YXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UobWVtYmVyKTsKICB9CgogIGFjY2VwdChNZW1iZXJWaXNpdG9yIHYpID0+IHYudmlzaXRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcih0aGlzKTsKCiAgYWNjZXB0UmVmZXJlbmNlKE1lbWJlclJlZmVyZW5jZVZpc2l0b3IgdikgPT4KICAgICAgdi52aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yUmVmZXJlbmNlKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmlzaXRMaXN0KGFubm90YXRpb25zLCB2KTsKICAgIHRhcmdldD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgdmlzaXRMaXN0KHR5cGVBcmd1bWVudHMsIHYpOwogICAgbmFtZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1UeXBlTGlzdCh0eXBlQXJndW1lbnRzLCB2KTsKICB9CgogIERhcnRUeXBlIGdldCBnZXR0ZXJUeXBlID0+IGNvbnN0IEJvdHRvbVR5cGUoKTsKICBEYXJ0VHlwZSBnZXQgc2V0dGVyVHlwZSA9PiBjb25zdCBCb3R0b21UeXBlKCk7CgogIExvY2F0aW9uIF9nZXRMb2NhdGlvbkluRW5jbG9zaW5nRmlsZShpbnQgb2Zmc2V0KSB7CiAgICByZXR1cm4gX2dldExvY2F0aW9uSW5Db21wb25lbnQoZW5jbG9zaW5nQ29tcG9uZW50LCBmaWxlVXJpLCBvZmZzZXQpOwogIH0KfQoKLy8vIEEgbWV0aG9kLCBnZXR0ZXIsIHNldHRlciwgaW5kZXgtZ2V0dGVyLCBpbmRleC1zZXR0ZXIsIG9wZXJhdG9yIG92ZXJsb2FkZXIsCi8vLyBvciBmYWN0b3J5LgovLy8KLy8vIFByb2NlZHVyZXMgY2FuIGhhdmUgdGhlIHN0YXRpYywgYWJzdHJhY3QsIGFuZC9vciBleHRlcm5hbCBtb2RpZmllciwgYWx0aG91Z2gKLy8vIG9ubHkgdGhlIHN0YXRpYyBhbmQgZXh0ZXJuYWwgbW9kaWZpZXJzIG1heSBiZSB1c2VkIHRvZ2V0aGVyLgovLy8KLy8vIEZvciBub24tc3RhdGljIHByb2NlZHVyZXMgdGhlIG5hbWUgaXMgcmVxdWlyZWQgZm9yIGR5bmFtaWMgZGlzcGF0Y2guCi8vLyBGb3IgZXh0ZXJuYWwgcHJvY2VkdXJlcyB0aGUgbmFtZSBpcyByZXF1aXJlZCBmb3IgaWRlbnRpZnlpbmcgdGhlIGV4dGVybmFsCi8vLyBpbXBsZW1lbnRhdGlvbi4KLy8vCi8vLyBGb3IgbWV0aG9kcywgZ2V0dGVycywgYW5kIHNldHRlcnMgdGhlIG5hbWUgaXMganVzdCBhcyBpdCB3YXMgZGVjbGFyZWQuCi8vLyBGb3Igc2V0dGVycyB0aGlzIGRvZXMgbm90IGluY2x1ZGUgYSB0cmFpbGluZyBgPWAuCi8vLyBGb3IgaW5kZXgtZ2V0dGVycy9zZXR0ZXJzLCB0aGlzIGlzIGBbXWAgYW5kIGBbXT1gLgovLy8gRm9yIG9wZXJhdG9ycywgdGhpcyBpcyB0aGUgdG9rZW4gZm9yIHRoZSBvcGVyYXRvciwgZS5nLiBgK2Agb3IgYD09YCwKLy8vIGV4Y2VwdCBmb3IgdGhlIHVuYXJ5IG1pbnVzIG9wZXJhdG9yLCB3aG9zZSBuYW1lIGlzIGB1bmFyeS1gLgpAY29xCmNsYXNzIFByb2NlZHVyZSBleHRlbmRzIE1lbWJlciB7CiAgLy8vIFN0YXJ0IG9mZnNldCBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIHNvdXJjZSBmaWxlIGl0IGNvbWVzIGZyb20uCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGlzIGluY2x1ZGVzIGFubm90YXRpb25zIGlmIGFueS4KICAvLy8KICAvLy8gVmFsaWQgdmFsdWVzIGFyZSBmcm9tIDAgYW5kIHVwLCBvciAtMSAoW1RyZWVOb2RlLm5vT2Zmc2V0XSkgaWYgdGhlIGZpbGUKICAvLy8gc3RhcnQgb2Zmc2V0IGlzIG5vdCBhdmFpbGFibGUgKHRoaXMgaXMgdGhlIGRlZmF1bHQgaWYgbm9uZSBpcyBzcGVjaWZpY2FsbHkKICAvLy8gc2V0KS4KICBpbnQgc3RhcnRGaWxlT2Zmc2V0ID0gVHJlZU5vZGUubm9PZmZzZXQ7CgogIFByb2NlZHVyZUtpbmQga2luZDsKICBpbnQgZmxhZ3MgPSAwOwogIC8vIGZ1bmN0aW9uIGlzIG51bGwgaWYgYW5kIG9ubHkgaWYgYWJzdHJhY3QsIGV4dGVybmFsLgogIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbjsKCiAgLy8gVGhlIGZ1bmN0aW9uIG5vZGUncyBib2R5IG1pZ2h0IGJlIGxhemlseSBsb2FkZWQsIG1lYW5pbmcgdGhhdCB0aGlzIHZhbHVlCiAgLy8gbWlnaHQgbm90IGJlIHNldCBjb3JyZWN0bHkgeWV0LiBNYWtlIHN1cmUgdGhlIGJvZHkgaXMgbG9hZGVkIGJlZm9yZQogIC8vIHJldHVybmluZyBhbnl0aGluZy4KICBpbnQgZ2V0IHRyYW5zZm9ybWVyRmxhZ3MgewogICAgZnVuY3Rpb24/LmJvZHk7CiAgICByZXR1cm4gc3VwZXIudHJhbnNmb3JtZXJGbGFnczsKICB9CgogIC8vIFRoZSBmdW5jdGlvbiBub2RlJ3MgYm9keSBtaWdodCBiZSBsYXppbHkgbG9hZGVkLCBtZWFuaW5nIHRoYXQgdGhpcyB2YWx1ZQogIC8vIG1pZ2h0IGdldCBvdmVyd3JpdHRlbiBsYXRlciAod2hlbiB0aGUgYm9keSBpcyByZWFkKS4gVG8gYXZvaWQgdGhhdCByZWFkIHRoZQogIC8vIGJvZHkgbm93IGFuZCBvbmx5IHNldCB0aGUgdmFsdWUgYWZ0ZXJ3YXJkcy4KICB2b2lkIHNldCB0cmFuc2Zvcm1lckZsYWdzKGludCBuZXdWYWx1ZSkgewogICAgZnVuY3Rpb24/LmJvZHk7CiAgICBzdXBlci50cmFuc2Zvcm1lckZsYWdzID0gbmV3VmFsdWU7CiAgfQoKICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgc2V0IHRoZSB0cmFuc2Zvcm1lciBmbGFncyB3aXRob3V0IGxvYWRpbmcgdGhlIGJvZHkuCiAgLy8gVXNlZCB3aGVuIHJlYWRpbmcgdGhlIGJpbmFyeS4gRm9yIG90aGVyIGNhc2VzIG9uZSBzaG91bGQgcHJvYmFibHkgdXNlCiAgLy8gYHRyYW5zZm9ybWVyRmxhZ3MgPSB2YWx1ZTtgLgogIHZvaWQgc2V0VHJhbnNmb3JtZXJGbGFnc1dpdGhvdXRMYXp5TG9hZGluZyhpbnQgbmV3VmFsdWUpIHsKICAgIHN1cGVyLnRyYW5zZm9ybWVyRmxhZ3MgPSBuZXdWYWx1ZTsKICB9CgogIFJlZmVyZW5jZSBmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlOwogIFJlZmVyZW5jZSBmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldFJlZmVyZW5jZTsKCiAgUHJvY2VkdXJlKE5hbWUgbmFtZSwgUHJvY2VkdXJlS2luZCBraW5kLCBGdW5jdGlvbk5vZGUgZnVuY3Rpb24sCiAgICAgIHtib29sIGlzQWJzdHJhY3Q6IGZhbHNlLAogICAgICBib29sIGlzU3RhdGljOiBmYWxzZSwKICAgICAgYm9vbCBpc0V4dGVybmFsOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvbnN0OiBmYWxzZSwKICAgICAgYm9vbCBpc0ZvcndhcmRpbmdTdHViOiBmYWxzZSwKICAgICAgYm9vbCBpc0ZvcndhcmRpbmdTZW1pU3R1YjogZmFsc2UsCiAgICAgIGludCB0cmFuc2Zvcm1lckZsYWdzOiAwLAogICAgICBVcmkgZmlsZVVyaSwKICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZSwKICAgICAgTWVtYmVyIGZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXQsCiAgICAgIE1lbWJlciBmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldH0pCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShuYW1lLCBraW5kLCBmdW5jdGlvbiwKICAgICAgICAgICAgaXNBYnN0cmFjdDogaXNBYnN0cmFjdCwKICAgICAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLAogICAgICAgICAgICBpc0V4dGVybmFsOiBpc0V4dGVybmFsLAogICAgICAgICAgICBpc0NvbnN0OiBpc0NvbnN0LAogICAgICAgICAgICBpc0ZvcndhcmRpbmdTdHViOiBpc0ZvcndhcmRpbmdTdHViLAogICAgICAgICAgICBpc0ZvcndhcmRpbmdTZW1pU3R1YjogaXNGb3J3YXJkaW5nU2VtaVN0dWIsCiAgICAgICAgICAgIHRyYW5zZm9ybWVyRmxhZ3M6IHRyYW5zZm9ybWVyRmxhZ3MsCiAgICAgICAgICAgIGZpbGVVcmk6IGZpbGVVcmksCiAgICAgICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlLAogICAgICAgICAgICBmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlOgogICAgICAgICAgICAgICAgZ2V0TWVtYmVyUmVmZXJlbmNlKGZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXQpLAogICAgICAgICAgICBmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldFJlZmVyZW5jZToKICAgICAgICAgICAgICAgIGdldE1lbWJlclJlZmVyZW5jZShmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldCkpOwoKICBQcm9jZWR1cmUuYnlSZWZlcmVuY2UoTmFtZSBuYW1lLCB0aGlzLmtpbmQsIHRoaXMuZnVuY3Rpb24sCiAgICAgIHtib29sIGlzQWJzdHJhY3Q6IGZhbHNlLAogICAgICBib29sIGlzU3RhdGljOiBmYWxzZSwKICAgICAgYm9vbCBpc0V4dGVybmFsOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvbnN0OiBmYWxzZSwKICAgICAgYm9vbCBpc0ZvcndhcmRpbmdTdHViOiBmYWxzZSwKICAgICAgYm9vbCBpc0ZvcndhcmRpbmdTZW1pU3R1YjogZmFsc2UsCiAgICAgIGludCB0cmFuc2Zvcm1lckZsYWdzOiAwLAogICAgICBVcmkgZmlsZVVyaSwKICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZSwKICAgICAgdGhpcy5mb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlLAogICAgICB0aGlzLmZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlfSkKICAgICAgOiBzdXBlcihuYW1lLCBmaWxlVXJpLCByZWZlcmVuY2UpIHsKICAgIGZ1bmN0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgdGhpcy5pc0Fic3RyYWN0ID0gaXNBYnN0cmFjdDsKICAgIHRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpYzsKICAgIHRoaXMuaXNFeHRlcm5hbCA9IGlzRXh0ZXJuYWw7CiAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0OwogICAgdGhpcy5pc0ZvcndhcmRpbmdTdHViID0gaXNGb3J3YXJkaW5nU3R1YjsKICAgIHRoaXMuaXNGb3J3YXJkaW5nU2VtaVN0dWIgPSBpc0ZvcndhcmRpbmdTZW1pU3R1YjsKICAgIHRoaXMudHJhbnNmb3JtZXJGbGFncyA9IHRyYW5zZm9ybWVyRmxhZ3M7CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IEZsYWdTdGF0aWMgPSAxIDw8IDA7IC8vIE11c3QgbWF0Y2ggc2VyaWFsaXplZCBiaXQgcG9zaXRpb25zLgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0Fic3RyYWN0ID0gMSA8PCAxOwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0V4dGVybmFsID0gMSA8PCAyOwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0NvbnN0ID0gMSA8PCAzOyAvLyBPbmx5IGZvciBleHRlcm5hbCBjb25zdCBmYWN0b3JpZXMuCiAgc3RhdGljIGNvbnN0IGludCBGbGFnRm9yd2FyZGluZ1N0dWIgPSAxIDw8IDQ7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnRm9yd2FyZGluZ1NlbWlTdHViID0gMSA8PCA1OwogIC8vIFRPRE8oMjk4NDEpOiBSZW1vdmUgdGhpcyBmbGFnIGFmdGVyIHRoZSBpc3N1ZSBpcyByZXNvbHZlZC4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciA9IDEgPDwgNjsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdOb1N1Y2hNZXRob2RGb3J3YXJkZXIgPSAxIDw8IDc7CgogIGJvb2wgZ2V0IGlzU3RhdGljID0+IGZsYWdzICYgRmxhZ1N0YXRpYyAhPSAwOwogIGJvb2wgZ2V0IGlzQWJzdHJhY3QgPT4gZmxhZ3MgJiBGbGFnQWJzdHJhY3QgIT0gMDsKICBib29sIGdldCBpc0V4dGVybmFsID0+IGZsYWdzICYgRmxhZ0V4dGVybmFsICE9IDA7CgogIC8vLyBUcnVlIGlmIHRoaXMgaGFzIHRoZSBgY29uc3RgIG1vZGlmaWVyLiAgVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGZvciBleHRlcm5hbAogIC8vLyBjb25zdGFudCBmYWN0b3JpZXMsIHN1Y2ggYXMgYFN0cmluZy5mcm9tRW52aXJvbm1lbnRgLgogIGJvb2wgZ2V0IGlzQ29uc3QgPT4gZmxhZ3MgJiBGbGFnQ29uc3QgIT0gMDsKCiAgLy8vIElmIHNldCwgdGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoaXMgZnVuY3Rpb24ncyBpbXBsZW1lbnRhdGlvbiBleGlzdHMKICAvLy8gc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiB0eXBlIGNoZWNraW5nIGFyZ3VtZW50cyBhbmQgZm9yd2FyZGluZyB0bwogIC8vLyBbZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldF0uCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCBqdXN0IGJlY2F1c2UgdGhpcyBiaXQgaXMgc2V0IGRvZXNuJ3QgbWVhbiB0aGF0IHRoZSBmdW5jdGlvbiB3YXMKICAvLy8gbm90IGRlY2xhcmVkIGluIHRoZSBzb3VyY2U7IGl0J3MgcG9zc2libGUgdGhhdCB0aGlzIGlzIGEgZm9yd2FyZGluZwogIC8vLyBzZW1pLXN0dWIgKHNlZSBpc0ZvcndhcmRpbmdTZW1pU3R1YikuICBUbyBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGZ1bmN0aW9uCiAgLy8vIHdhcyBwcmVzZW50IGluIHRoZSBzb3VyY2UsIGNvbnN1bHQgW2lzU3ludGhldGljRm9yd2FyZGVyXS4KICBib29sIGdldCBpc0ZvcndhcmRpbmdTdHViID0+IGZsYWdzICYgRmxhZ0ZvcndhcmRpbmdTdHViICE9IDA7CgogIC8vLyBJZiBzZXQsIHRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCBhbHRob3VnaCB0aGlzIGZ1bmN0aW9uIGlzIGEgZm9yd2FyZGluZwogIC8vLyBzdHViLCBpdCB3YXMgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgc291cmNlIGFzIGFuIGFic3RyYWN0IG1ldGhvZC4KICBib29sIGdldCBpc0ZvcndhcmRpbmdTZW1pU3R1YiA9PiBmbGFncyAmIEZsYWdGb3J3YXJkaW5nU2VtaVN0dWIgIT0gMDsKCiAgLy8gSW5kaWNhdGVzIGlmIHRoaXMgW1Byb2NlZHVyZV0gcmVwcmVzZW50cyBhIHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3IKICAvLyBhbmQgZG9lc24ndCBoYXZlIGEgcnVubmFibGUgYm9keS4KICBib29sIGdldCBpc1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIHsKICAgIHJldHVybiBmbGFncyAmIEZsYWdSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciAhPSAwOwogIH0KCiAgLy8vIElmIHNldCwgdGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoaXMgZnVuY3Rpb24gd2FzIG5vdCBwcmVzZW50IGluIHRoZQogIC8vLyBzb3VyY2UsIGFuZCBpdCBleGlzdHMgc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiB0eXBlIGNoZWNraW5nIGFyZ3VtZW50cwogIC8vLyBhbmQgZm9yd2FyZGluZyB0byBbZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldF0uCiAgYm9vbCBnZXQgaXNTeW50aGV0aWNGb3J3YXJkZXIgPT4gaXNGb3J3YXJkaW5nU3R1YiAmJiAhaXNGb3J3YXJkaW5nU2VtaVN0dWI7CgogIGJvb2wgZ2V0IGlzTm9TdWNoTWV0aG9kRm9yd2FyZGVyID0+IGZsYWdzICYgRmxhZ05vU3VjaE1ldGhvZEZvcndhcmRlciAhPSAwOwoKICB2b2lkIHNldCBpc1N0YXRpYyhib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ1N0YXRpYykgOiAoZmxhZ3MgJiB+RmxhZ1N0YXRpYyk7CiAgfQoKICB2b2lkIHNldCBpc0Fic3RyYWN0KGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnQWJzdHJhY3QpIDogKGZsYWdzICYgfkZsYWdBYnN0cmFjdCk7CiAgfQoKICB2b2lkIHNldCBpc0V4dGVybmFsKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnRXh0ZXJuYWwpIDogKGZsYWdzICYgfkZsYWdFeHRlcm5hbCk7CiAgfQoKICB2b2lkIHNldCBpc0NvbnN0KGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnQ29uc3QpIDogKGZsYWdzICYgfkZsYWdDb25zdCk7CiAgfQoKICB2b2lkIHNldCBpc0ZvcndhcmRpbmdTdHViKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0KICAgICAgICB2YWx1ZSA/IChmbGFncyB8IEZsYWdGb3J3YXJkaW5nU3R1YikgOiAoZmxhZ3MgJiB+RmxhZ0ZvcndhcmRpbmdTdHViKTsKICB9CgogIHZvaWQgc2V0IGlzRm9yd2FyZGluZ1NlbWlTdHViKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IEZsYWdGb3J3YXJkaW5nU2VtaVN0dWIpCiAgICAgICAgOiAoZmxhZ3MgJiB+RmxhZ0ZvcndhcmRpbmdTZW1pU3R1Yik7CiAgfQoKICB2b2lkIHNldCBpc1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IEZsYWdSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcikKICAgICAgICA6IChmbGFncyAmIH5GbGFnUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IpOwogIH0KCiAgdm9pZCBzZXQgaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXIoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZQogICAgICAgID8gKGZsYWdzIHwgRmxhZ05vU3VjaE1ldGhvZEZvcndhcmRlcikKICAgICAgICA6IChmbGFncyAmIH5GbGFnTm9TdWNoTWV0aG9kRm9yd2FyZGVyKTsKICB9CgogIGJvb2wgZ2V0IGlzSW5zdGFuY2VNZW1iZXIgPT4gIWlzU3RhdGljOwogIGJvb2wgZ2V0IGlzR2V0dGVyID0+IGtpbmQgPT0gUHJvY2VkdXJlS2luZC5HZXR0ZXI7CiAgYm9vbCBnZXQgaXNTZXR0ZXIgPT4ga2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcjsKICBib29sIGdldCBpc0FjY2Vzc29yID0+IGlzR2V0dGVyIHx8IGlzU2V0dGVyOwogIGJvb2wgZ2V0IGhhc0dldHRlciA9PiBraW5kICE9IFByb2NlZHVyZUtpbmQuU2V0dGVyOwogIGJvb2wgZ2V0IGhhc1NldHRlciA9PiBraW5kID09IFByb2NlZHVyZUtpbmQuU2V0dGVyOwogIGJvb2wgZ2V0IGlzRmFjdG9yeSA9PiBraW5kID09IFByb2NlZHVyZUtpbmQuRmFjdG9yeTsKCiAgTWVtYmVyIGdldCBmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0ID0+CiAgICAgIGZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRSZWZlcmVuY2U/LmFzTWVtYmVyOwoKICB2b2lkIHNldCBmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0KE1lbWJlciB0YXJnZXQpIHsKICAgIGZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIE1lbWJlciBnZXQgZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXQgPT4KICAgICAgZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U/LmFzTWVtYmVyOwoKICB2b2lkIHNldCBmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldChNZW1iZXIgdGFyZ2V0KSB7CiAgICBmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldFJlZmVyZW5jZSA9IGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpOwogIH0KCiAgYWNjZXB0KE1lbWJlclZpc2l0b3IgdikgPT4gdi52aXNpdFByb2NlZHVyZSh0aGlzKTsKCiAgYWNjZXB0UmVmZXJlbmNlKE1lbWJlclJlZmVyZW5jZVZpc2l0b3IgdikgPT4gdi52aXNpdFByb2NlZHVyZVJlZmVyZW5jZSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChhbm5vdGF0aW9ucywgdik7CiAgICBuYW1lPy5hY2NlcHQodik7CiAgICBmdW5jdGlvbj8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICBpZiAoZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICBmdW5jdGlvbiA9IGZ1bmN0aW9uLmFjY2VwdCh2KTsKICAgICAgZnVuY3Rpb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQoKICBEYXJ0VHlwZSBnZXQgZ2V0dGVyVHlwZSB7CiAgICByZXR1cm4gaXNHZXR0ZXIgPyBmdW5jdGlvbi5yZXR1cm5UeXBlIDogZnVuY3Rpb24uZnVuY3Rpb25UeXBlOwogIH0KCiAgRGFydFR5cGUgZ2V0IHNldHRlclR5cGUgewogICAgcmV0dXJuIGlzU2V0dGVyCiAgICAgICAgPyBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1swXS50eXBlCiAgICAgICAgOiBjb25zdCBCb3R0b21UeXBlKCk7CiAgfQoKICBMb2NhdGlvbiBfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGUoaW50IG9mZnNldCkgewogICAgcmV0dXJuIF9nZXRMb2NhdGlvbkluQ29tcG9uZW50KGVuY2xvc2luZ0NvbXBvbmVudCwgZmlsZVVyaSwgb2Zmc2V0KTsKICB9Cn0KCmVudW0gUHJvY2VkdXJlS2luZCB7CiAgTWV0aG9kLAogIEdldHRlciwKICBTZXR0ZXIsCiAgT3BlcmF0b3IsCiAgRmFjdG9yeSwKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNUT1IgSU5JVElBTElaRVJTCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8vIFBhcnQgb2YgYW4gaW5pdGlhbGl6ZXIgbGlzdCBpbiBhIGNvbnN0cnVjdG9yLgphYnN0cmFjdCBjbGFzcyBJbml0aWFsaXplciBleHRlbmRzIFRyZWVOb2RlIHsKICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgc3ludGhldGljIGNvbnN0cnVjdG9yIGluaXRpYWxpemVyLgogIEBpbmZvcm1hdGl2ZQogIGJvb2wgaXNTeW50aGV0aWMgPSBmYWxzZTsKCiAgYWNjZXB0KEluaXRpYWxpemVyVmlzaXRvciB2KTsKfQoKLy8vIEFuIGluaXRpYWxpemVyIHdpdGggYSBjb21waWxlLXRpbWUgZXJyb3IuCi8vLwovLy8gU2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBhdCBydW50aW1lLgovLwovLyBERVNJR04gVE9ETzogVGhlIGZyb250ZW5kIHNob3VsZCB1c2UgdGhpcyBpbiBhIGxvdCBtb3JlIGNhc2VzIHRvIGNhdGNoCi8vIGludmFsaWQgY2FzZXMuCmNsYXNzIEludmFsaWRJbml0aWFsaXplciBleHRlbmRzIEluaXRpYWxpemVyIHsKICBhY2NlcHQoSW5pdGlhbGl6ZXJWaXNpdG9yIHYpID0+IHYudmlzaXRJbnZhbGlkSW5pdGlhbGl6ZXIodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCi8vLyBBIGZpZWxkIGFzc2lnbm1lbnQgYGZpZWxkID0gdmFsdWVgIG9jY3VycmluZyBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBvZgovLy8gYSBjb25zdHJ1Y3Rvci4KLy8vCi8vLyBUaGlzIG5vZGUgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBkZWNsYXJhdGlvbi1zaXRlIGZpZWxkIGluaXRpYWxpemVyczsgdGhvc2UKLy8vIGFyZSBbRXhwcmVzc2lvbl1zIHN0b3JlZCBpbiBbRmllbGQuaW5pdGlhbGl6ZXJdLgovLwovLyBUT0RPOiBUaGUgZnJvbnRlbmQgc2hvdWxkIGNoZWNrIHRoYXQgYWxsIGZpbmFsIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQKLy8gIGV4YWN0bHkgb25jZSwgYW5kIHRoYXQgbm8gZmllbGRzIGFyZSBhc3NpZ25lZCB0d2ljZSBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdC4KY2xhc3MgRmllbGRJbml0aWFsaXplciBleHRlbmRzIEluaXRpYWxpemVyIHsKICAvLy8gUmVmZXJlbmNlIHRvIHRoZSBmaWVsZCBiZWluZyBpbml0aWFsaXplZC4gIE5vdCBudWxsLgogIFJlZmVyZW5jZSBmaWVsZFJlZmVyZW5jZTsKICBFeHByZXNzaW9uIHZhbHVlOwoKICBGaWVsZEluaXRpYWxpemVyKEZpZWxkIGZpZWxkLCBFeHByZXNzaW9uIHZhbHVlKQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UoZmllbGQ/LnJlZmVyZW5jZSwgdmFsdWUpOwoKICBGaWVsZEluaXRpYWxpemVyLmJ5UmVmZXJlbmNlKHRoaXMuZmllbGRSZWZlcmVuY2UsIHRoaXMudmFsdWUpIHsKICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgRmllbGQgZ2V0IGZpZWxkID0+IGZpZWxkUmVmZXJlbmNlPy5ub2RlOwoKICB2b2lkIHNldCBmaWVsZChGaWVsZCBmaWVsZCkgewogICAgZmllbGRSZWZlcmVuY2UgPSBmaWVsZD8ucmVmZXJlbmNlOwogIH0KCiAgYWNjZXB0KEluaXRpYWxpemVyVmlzaXRvciB2KSA9PiB2LnZpc2l0RmllbGRJbml0aWFsaXplcih0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGZpZWxkPy5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQodik7CiAgICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEEgc3VwZXIgY2FsbCBgc3VwZXIoeCx5KWAgb2NjdXJyaW5nIGluIHRoZSBpbml0aWFsaXplciBsaXN0IG9mIGEKLy8vIGNvbnN0cnVjdG9yLgovLy8KLy8vIFRoZXJlIGFyZSBubyB0eXBlIGFyZ3VtZW50cyBvbiB0aGlzIGNhbGwuCi8vCi8vIFRPRE86IFRoZSBmcm9udGVuZCBzaG91bGQgY2hlY2sgdGhhdCB0aGVyZSBpcyBubyBtb3JlIHRoYW4gb25lIHN1cGVyIGNhbGwuCi8vCi8vIERFU0lHTiBUT0RPOiBDb25zaWRlciBpZiB0aGUgZnJvbnRlbmQgc2hvdWxkIGluc2VydCB0eXBlIGFyZ3VtZW50cyBkZXJpdmVkCi8vIGZyb20gdGhlIGV4dGVuZHMgY2xhdXNlLgpjbGFzcyBTdXBlckluaXRpYWxpemVyIGV4dGVuZHMgSW5pdGlhbGl6ZXIgewogIC8vLyBSZWZlcmVuY2UgdG8gdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGludm9rZWQgaW4gdGhlIHN1cGVyIGNsYXNzLiBOb3QgbnVsbC4KICBSZWZlcmVuY2UgdGFyZ2V0UmVmZXJlbmNlOwogIEFyZ3VtZW50cyBhcmd1bWVudHM7CgogIFN1cGVySW5pdGlhbGl6ZXIoQ29uc3RydWN0b3IgdGFyZ2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UoZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCksIGFyZ3VtZW50cyk7CgogIFN1cGVySW5pdGlhbGl6ZXIuYnlSZWZlcmVuY2UodGhpcy50YXJnZXRSZWZlcmVuY2UsIHRoaXMuYXJndW1lbnRzKSB7CiAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgdGFyZ2V0ID0+IHRhcmdldFJlZmVyZW5jZT8uYXNDb25zdHJ1Y3RvcjsKCiAgdm9pZCBzZXQgdGFyZ2V0KENvbnN0cnVjdG9yIHRhcmdldCkgewogICAgdGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCk7CiAgfQoKICBhY2NlcHQoSW5pdGlhbGl6ZXJWaXNpdG9yIHYpID0+IHYudmlzaXRTdXBlckluaXRpYWxpemVyKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdGFyZ2V0Py5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICBhcmd1bWVudHM/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudHMgPSBhcmd1bWVudHMuYWNjZXB0KHYpOwogICAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQSByZWRpcmVjdGluZyBjYWxsIGB0aGlzKHgseSlgIG9jY3VycmluZyBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBvZgovLy8gYSBjb25zdHJ1Y3Rvci4KLy8KLy8gVE9ETzogVGhlIGZyb250ZW5kIHNob3VsZCBjaGVjayB0aGF0IHRoaXMgaXMgdGhlIG9ubHkgaW5pdGlhbGl6ZXIgYW5kIGlmIHRoZQovLyBjb25zdHJ1Y3RvciBoYXMgYSBib2R5IG9yIGlmIHRoZXJlIGlzIGEgY3ljbGUgaW4gdGhlIGluaXRpYWxpemVyIGNhbGxzLgpjbGFzcyBSZWRpcmVjdGluZ0luaXRpYWxpemVyIGV4dGVuZHMgSW5pdGlhbGl6ZXIgewogIC8vLyBSZWZlcmVuY2UgdG8gdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGludm9rZWQgaW4gdGhlIHNhbWUgY2xhc3MuIE5vdCBudWxsLgogIFJlZmVyZW5jZSB0YXJnZXRSZWZlcmVuY2U7CiAgQXJndW1lbnRzIGFyZ3VtZW50czsKCiAgUmVkaXJlY3RpbmdJbml0aWFsaXplcihDb25zdHJ1Y3RvciB0YXJnZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KSwgYXJndW1lbnRzKTsKCiAgUmVkaXJlY3RpbmdJbml0aWFsaXplci5ieVJlZmVyZW5jZSh0aGlzLnRhcmdldFJlZmVyZW5jZSwgdGhpcy5hcmd1bWVudHMpIHsKICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICB9CgogIENvbnN0cnVjdG9yIGdldCB0YXJnZXQgPT4gdGFyZ2V0UmVmZXJlbmNlPy5hc0NvbnN0cnVjdG9yOwoKICB2b2lkIHNldCB0YXJnZXQoQ29uc3RydWN0b3IgdGFyZ2V0KSB7CiAgICB0YXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIGFjY2VwdChJbml0aWFsaXplclZpc2l0b3IgdikgPT4gdi52aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB0YXJnZXQ/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIGFyZ3VtZW50cz8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFyZ3VtZW50cyA9IGFyZ3VtZW50cy5hY2NlcHQodik7CiAgICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBCaW5kaW5nIG9mIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGluIHRoZSBpbml0aWFsaXplciBsaXN0IG9mIGEgY29uc3RydWN0b3IuCi8vLwovLy8gVGhlIHZhcmlhYmxlIGlzIGluIHNjb3BlIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBpbml0aWFsaXplciBsaXN0LCBidXQgaXMKLy8vIG5vdCBpbiBzY29wZSBpbiB0aGUgY29uc3RydWN0b3IgYm9keS4KY2xhc3MgTG9jYWxJbml0aWFsaXplciBleHRlbmRzIEluaXRpYWxpemVyIHsKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOwoKICBMb2NhbEluaXRpYWxpemVyKHRoaXMudmFyaWFibGUpIHsKICAgIHZhcmlhYmxlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgYWNjZXB0KEluaXRpYWxpemVyVmlzaXRvciB2KSA9PiB2LnZpc2l0TG9jYWxJbml0aWFsaXplcih0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZhcmlhYmxlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAodmFyaWFibGUgIT0gbnVsbCkgewogICAgICB2YXJpYWJsZSA9IHZhcmlhYmxlLmFjY2VwdCh2KTsKICAgICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpjbGFzcyBBc3NlcnRJbml0aWFsaXplciBleHRlbmRzIEluaXRpYWxpemVyIHsKICBBc3NlcnRTdGF0ZW1lbnQgc3RhdGVtZW50OwoKICBBc3NlcnRJbml0aWFsaXplcih0aGlzLnN0YXRlbWVudCkgewogICAgc3RhdGVtZW50LnBhcmVudCA9IHRoaXM7CiAgfQoKICBhY2NlcHQoSW5pdGlhbGl6ZXJWaXNpdG9yIHYpID0+IHYudmlzaXRBc3NlcnRJbml0aWFsaXplcih0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHN0YXRlbWVudC5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnQuYWNjZXB0KHYpOwogICAgc3RhdGVtZW50LnBhcmVudCA9IHRoaXM7CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOQ1RJT05TCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8vIEEgZnVuY3Rpb24gZGVjbGFyZXMgcGFyYW1ldGVycyBhbmQgaGFzIGEgYm9keS4KLy8vCi8vLyBUaGlzIG1heSBvY2N1ciBpbiBhIHByb2NlZHVyZSwgY29uc3RydWN0b3IsIGZ1bmN0aW9uIGV4cHJlc3Npb24sIG9yIGxvY2FsCi8vLyBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KQGNvcQpjbGFzcyBGdW5jdGlvbk5vZGUgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgLy8vIEVuZCBvZmZzZXQgaW4gdGhlIHNvdXJjZSBmaWxlIGl0IGNvbWVzIGZyb20uIFZhbGlkIHZhbHVlcyBhcmUgZnJvbSAwIGFuZAogIC8vLyB1cCwgb3IgLTEgKFtUcmVlTm9kZS5ub09mZnNldF0pIGlmIHRoZSBmaWxlIGVuZCBvZmZzZXQgaXMgbm90IGF2YWlsYWJsZQogIC8vLyAodGhpcyBpcyB0aGUgZGVmYXVsdCBpZiBub25lIGlzIHNwZWNpZmljYWxseSBzZXQpLgogIGludCBmaWxlRW5kT2Zmc2V0ID0gVHJlZU5vZGUubm9PZmZzZXQ7CgogIC8vLyBLZXJuZWwgYXN5bmMgbWFya2VyIGZvciB0aGUgZnVuY3Rpb24uCiAgLy8vCiAgLy8vIFNlZSBhbHNvIFtkYXJ0QXN5bmNNYXJrZXJdLgogIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyOwoKICAvLy8gRGFydCBhc3luYyBtYXJrZXIgZm9yIHRoZSBmdW5jdGlvbi4KICAvLy8KICAvLy8gU2VlIGFsc28gW2FzeW5jTWFya2VyXS4KICAvLy8KICAvLy8gQSBLZXJuZWwgZnVuY3Rpb24gY2FuIHJlcHJlc2VudCBhIERhcnQgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCBhc3luYwogIC8vLyBtYXJrZXIuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlLCB3aGVuIGFzeW5jL2F3YWl0IGlzIHRyYW5zbGF0ZWQgYXdheSwKICAvLy8gYSBEYXJ0IGFzeW5jIGZ1bmN0aW9uIG1pZ2h0IGJlIHJlcHJlc2VudGVkIGJ5IGEgS2VybmVsIHN5bmMgZnVuY3Rpb24uCiAgQXN5bmNNYXJrZXIgZGFydEFzeW5jTWFya2VyOwoKICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzOwogIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50OwogIEBjb3FzaW5nbGVkZWYKICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogIEBub2NvcQogIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gbmFtZWRQYXJhbWV0ZXJzOwogIERhcnRUeXBlIHJldHVyblR5cGU7IC8vIE5vdCBudWxsLgogIFN0YXRlbWVudCBfYm9keTsKCiAgdm9pZCBGdW5jdGlvbigpIGxhenlCdWlsZGVyOwoKICB2b2lkIF9idWlsZExhenkoKSB7CiAgICBpZiAobGF6eUJ1aWxkZXIgIT0gbnVsbCkgewogICAgICB2YXIgbGF6eUJ1aWxkZXJMb2NhbCA9IGxhenlCdWlsZGVyOwogICAgICBsYXp5QnVpbGRlciA9IG51bGw7CiAgICAgIGxhenlCdWlsZGVyTG9jYWwoKTsKICAgIH0KICB9CgogIFN0YXRlbWVudCBnZXQgYm9keSB7CiAgICBfYnVpbGRMYXp5KCk7CiAgICByZXR1cm4gX2JvZHk7CiAgfQoKICB2b2lkIHNldCBib2R5KFN0YXRlbWVudCBib2R5KSB7CiAgICBfYnVpbGRMYXp5KCk7CiAgICBfYm9keSA9IGJvZHk7CiAgfQoKICBGdW5jdGlvbk5vZGUodGhpcy5fYm9keSwKICAgICAge0xpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsCiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gcG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gbmFtZWRQYXJhbWV0ZXJzLAogICAgICBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgdGhpcy5yZXR1cm5UeXBlOiBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICB0aGlzLmFzeW5jTWFya2VyOiBBc3luY01hcmtlci5TeW5jLAogICAgICB0aGlzLmRhcnRBc3luY01hcmtlcn0pCiAgICAgIDogdGhpcy5wb3NpdGlvbmFsUGFyYW1ldGVycyA9CiAgICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzID8/IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdLAogICAgICAgIHRoaXMucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9CiAgICAgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPz8gcG9zaXRpb25hbFBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwLAogICAgICAgIHRoaXMubmFtZWRQYXJhbWV0ZXJzID0gbmFtZWRQYXJhbWV0ZXJzID8/IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdLAogICAgICAgIHRoaXMudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycyA/PyA8VHlwZVBhcmFtZXRlcj5bXSB7CiAgICBhc3NlcnQocmV0dXJuVHlwZSAhPSBudWxsKTsKICAgIHNldFBhcmVudHModGhpcy50eXBlUGFyYW1ldGVycywgdGhpcyk7CiAgICBzZXRQYXJlbnRzKHRoaXMucG9zaXRpb25hbFBhcmFtZXRlcnMsIHRoaXMpOwogICAgc2V0UGFyZW50cyh0aGlzLm5hbWVkUGFyYW1ldGVycywgdGhpcyk7CiAgICBfYm9keT8ucGFyZW50ID0gdGhpczsKICAgIGRhcnRBc3luY01hcmtlciA/Pz0gYXN5bmNNYXJrZXI7CiAgfQoKICBzdGF0aWMgRGFydFR5cGUgX2dldFR5cGVPZlZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgPT4gbm9kZS50eXBlOwoKICBzdGF0aWMgTmFtZWRUeXBlIF9nZXROYW1lZFR5cGVPZlZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBOYW1lZFR5cGUobm9kZS5uYW1lLCBub2RlLnR5cGUpOwogIH0KCiAgRnVuY3Rpb25UeXBlIGdldCBmdW5jdGlvblR5cGUgewogICAgVHJlZU5vZGUgcGFyZW50ID0gdGhpcy5wYXJlbnQ7CiAgICBMaXN0PE5hbWVkVHlwZT4gbmFtZWQgPQogICAgICAgIG5hbWVkUGFyYW1ldGVycy5tYXAoX2dldE5hbWVkVHlwZU9mVmFyaWFibGUpLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgbmFtZWQuc29ydCgpOwogICAgLy8gV2UgbmVlZCBjcmVhdGUgYSBjb3B5IG9mIHRoZSBsaXN0IG9mIHR5cGUgcGFyYW1ldGVycywgb3RoZXJ3aXNlCiAgICAvLyB0cmFuc2Zvcm1hdGlvbnMgbGlrZSBlcmFzdXJlIGRvbid0IHdvcmsuCiAgICB2YXIgdHlwZVBhcmFtZXRlcnNDb3B5ID0gbmV3IExpc3Q8VHlwZVBhcmFtZXRlcj4uZnJvbShwYXJlbnQgaXMgQ29uc3RydWN0b3IKICAgICAgICA/IHBhcmVudC5lbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycwogICAgICAgIDogdHlwZVBhcmFtZXRlcnMpOwogICAgcmV0dXJuIG5ldyBGdW5jdGlvblR5cGUoCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnMubWFwKF9nZXRUeXBlT2ZWYXJpYWJsZSkudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSksCiAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5hbWVkLAogICAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0eXBlUGFyYW1ldGVyc0NvcHksCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCk7CiAgfQoKICBhY2NlcHQoVHJlZVZpc2l0b3IgdikgPT4gdi52aXNpdEZ1bmN0aW9uTm9kZSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdCh0eXBlUGFyYW1ldGVycywgdik7CiAgICB2aXNpdExpc3QocG9zaXRpb25hbFBhcmFtZXRlcnMsIHYpOwogICAgdmlzaXRMaXN0KG5hbWVkUGFyYW1ldGVycywgdik7CiAgICByZXR1cm5UeXBlPy5hY2NlcHQodik7CiAgICBib2R5Py5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KHR5cGVQYXJhbWV0ZXJzLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QocG9zaXRpb25hbFBhcmFtZXRlcnMsIHYsIHRoaXMpOwogICAgdHJhbnNmb3JtTGlzdChuYW1lZFBhcmFtZXRlcnMsIHYsIHRoaXMpOwogICAgcmV0dXJuVHlwZSA9IHYudmlzaXREYXJ0VHlwZShyZXR1cm5UeXBlKTsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKZW51bSBBc3luY01hcmtlciB7CiAgLy8gRG8gbm90IGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlc2UsIHRoZSBmcm9udGVuZHMgZGVwZW5kIG9uIGl0LgogIFN5bmMsCiAgU3luY1N0YXIsCiAgQXN5bmMsCiAgQXN5bmNTdGFyLAoKICAvLyBgU3luY1lpZWxkaW5nYCBpcyBhIG1hcmtlciB0aGF0IHRlbGxzIERhcnQgVk0gdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGFuCiAgLy8gYXJ0aWZpY2lhbCBjbG9zdXJlIGludHJvZHVjZWQgYnkgYW4gYXN5bmMgdHJhbnNmb3JtZXIgd2hpY2ggZGVzdWdhcmVkIGFsbAogIC8vIGFzeW5jIHN5bnRheCBpbnRvIGEgY29tYmluYXRpb24gb2YgbmF0aXZlIHlpZWxkcyBhbmQgaGVscGVyIG1ldGhvZCBjYWxscy4KICAvLwogIC8vIE5hdGl2ZSB5aWVsZHMgKGZvcm1hdHRlZCBhcyBgW3lpZWxkXWApIGFyZSBzZW1hbnRpY2FsbHkgY2xvc2UgdG8KICAvLyBgeWllbGQgeGAgc3RhdGVtZW50OiB0aGV5IGRlbm90ZSBhIHlpZWxkL3Jlc3VtZSBwb2ludCB3aXRoaW4gYSBmdW5jdGlvbgogIC8vIGJ1dCBhcmUgY29tcGxldGVseSBkZWNvdXBsZWQgZnJvbSB0aGUgbm90aW9uIG9mIGl0ZXJhdG9ycy4gV2hlbgogIC8vIGV4ZWN1dGlvbiBvZiB0aGUgY2xvc3VyZSByZWFjaGVzIGBbeWllbGRdIHhgIGl0IHN0b3BzIGFuZCByZXR1cm4gdGhlCiAgLy8gdmFsdWUgb2YgYHhgIHRvIHRoZSBjYWxsZXIuIElmIGNsb3N1cmUgaXMgY2FsbGVkIGFnYWluIGl0IGNvbnRpbnVlcwogIC8vIHRvIHRoZSBuZXh0IHN0YXRlbWVudCBhZnRlciB0aGlzIHlpZWxkIGFzIGlmIGl0IHdhcyBzdXNwZW5kZWQgYW5kIHJlc3VtZWQuCiAgLy8KICAvLyBDb25zaWRlciB0aGlzIGV4YW1wbGU6CiAgLy8KICAvLyAgIGcoKSB7CiAgLy8gICAgIHZhciA6YXdhaXRfanVtcF92YXIgPSAwOwogIC8vICAgICB2YXIgOmF3YWl0X2N0eF92YXI7CiAgLy8KICAvLyAgICAgZih4KSB5aWVsZGluZyB7CiAgLy8gICAgICAgW3lpZWxkXSAnJHt4fTowJzsKICAvLyAgICAgICBbeWllbGRdICcke3h9OjEnOwogIC8vICAgICAgIFt5aWVsZF0gJyR7eH06Mic7CiAgLy8gICAgIH0KICAvLwogIC8vICAgICByZXR1cm4gZjsKICAvLyAgIH0KICAvLwogIC8vICAgcHJpbnQoZignYScpKTsgIC8qIHByaW50cyAnYTowJywgOmF3YWl0X2p1bXBfdmFyID0gMSAgKi8KICAvLyAgIHByaW50KGYoJ2InKSk7ICAvKiBwcmludHMgJ2I6MScsIDphd2FpdF9qdW1wX3ZhciA9IDIgICovCiAgLy8gICBwcmludChmKCdjJykpOyAgLyogcHJpbnRzICdjOjInLCA6YXdhaXRfanVtcF92YXIgPSAzICAqLwogIC8vCiAgLy8gTm90ZTogY3VycmVudGx5IERhcnQgVk0gaW1wbGljaXRseSByZWxpZXMgb24gYXN5bmMgdHJhbnNmb3JtZXIgdG8KICAvLyBpbmplY3QgY2VydGFpbiBhcnRpZmljaWFsIHZhcmlhYmxlcyBpbnRvIGcgKGxpa2UgYDphd2FpdF9qdW1wX3ZhcmApLgogIC8vIEFzIHN1Y2ggU3luY1lpZWxkaW5nIGFuZCBuYXRpdmUgeWllbGQgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIHRoZWlyCiAgLy8gb3duLCBidXQgYXJlIHJhdGhlciBhbiBpbXBsZW1lbnRhdGlvbiBhcnRpZmFjdCBvZiB0aGUgYXN5bmMgdHJhbnNmb3JtZXIKICAvLyBpdHNlbGYuCiAgU3luY1lpZWxkaW5nLAp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUFJFU1NJT05TCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQGNvcQphYnN0cmFjdCBjbGFzcyBFeHByZXNzaW9uIGV4dGVuZHMgVHJlZU5vZGUgewogIC8vLyBSZXR1cm5zIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbi4KICAvLy8KICAvLy8gU2hvdWxkbid0IGJlIHVzZWQgb24gY29kZSBjb21waWxlZCBpbiBsZWdhY3kgbW9kZSwgYXMgdGhpcyBtZXRob2QgYXNzdW1lcwogIC8vLyB0aGUgSVIgaXMgc3Ryb25nbHkgdHlwZWQuCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpOwoKICAvLy8gUmV0dXJucyB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gYXMgYW4gaW5zdGFudGlhdGlvbiBvZgogIC8vLyBbc3VwZXJjbGFzc10uCiAgLy8vCiAgLy8vIFNob3VsZG4ndCBiZSB1c2VkIG9uIGNvZGUgY29tcGlsZWQgaW4gbGVnYWN5IG1vZGUsIGFzIHRoaXMgbWV0aG9kIGFzc3VtZXMKICAvLy8gdGhlIElSIGlzIHN0cm9uZ2x5IHR5cGVkLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBmdXJ0aGVybW9yZSBhc3N1bWVzIHRoYXQgdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gYWN0dWFsbHkKICAvLy8gaXMgYSBzdWJ0eXBlIG9mIChzb21lIGluc3RhbnRpYXRpb24gb2YpIHRoZSBnaXZlbiBbc3VwZXJjbGFzc10uCiAgLy8vIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBlaXRoZXIgYW4gZXhjZXB0aW9uIGlzIHRocm93biBvciB0aGUgcmF3IHR5cGUgb2YKICAvLy8gW3N1cGVyY2xhc3NdIGlzIHJldHVybmVkLgogIEludGVyZmFjZVR5cGUgZ2V0U3RhdGljVHlwZUFzSW5zdGFuY2VPZigKICAgICAgQ2xhc3Mgc3VwZXJjbGFzcywgVHlwZUVudmlyb25tZW50IHR5cGVzKSB7CiAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZSBwcm9ncmFtIGlzIGNvcnJlY3RseSB0eXBlZCwgc28gaWYgdGhlIHN1cGVyY2xhc3MKICAgIC8vIGlzIG5vdCBnZW5lcmljLCB3ZSBjYW4ganVzdCByZXR1cm4gaXRzIHJhdyB0eXBlIHdpdGhvdXQgY29tcHV0aW5nIHRoZQogICAgLy8gdHlwZSBvZiB0aGlzIGV4cHJlc3Npb24uICBJdCBhbHNvIGVuc3VyZXMgdGhhdCBhbGwgdHlwZXMgYXJlIGNvbnNpZGVyZWQKICAgIC8vIHN1YnR5cGVzIG9mIE9iamVjdCAobm90IGp1c3QgaW50ZXJmYWNlIHR5cGVzKSwgYW5kIGZ1bmN0aW9uIHR5cGVzIGFyZQogICAgLy8gY29uc2lkZXJlZCBzdWJ0eXBlcyBvZiBGdW5jdGlvbi4KICAgIGlmIChzdXBlcmNsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIHN1cGVyY2xhc3MucmF3VHlwZTsKICAgIH0KICAgIHZhciB0eXBlID0gZ2V0U3RhdGljVHlwZSh0eXBlcyk7CiAgICB3aGlsZSAodHlwZSBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICB0eXBlID0gKHR5cGUgYXMgVHlwZVBhcmFtZXRlclR5cGUpLnBhcmFtZXRlci5ib3VuZDsKICAgIH0KICAgIGlmICh0eXBlID09IHR5cGVzLm51bGxUeXBlKSB7CiAgICAgIHJldHVybiBzdXBlcmNsYXNzLmJvdHRvbVR5cGU7CiAgICB9CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIHZhciB1cGNhc3RUeXBlID0gdHlwZXMuZ2V0VHlwZUFzSW5zdGFuY2VPZih0eXBlLCBzdXBlcmNsYXNzKTsKICAgICAgaWYgKHVwY2FzdFR5cGUgIT0gbnVsbCkgcmV0dXJuIHVwY2FzdFR5cGU7CiAgICB9IGVsc2UgaWYgKHR5cGUgaXMgQm90dG9tVHlwZSkgewogICAgICByZXR1cm4gc3VwZXJjbGFzcy5ib3R0b21UeXBlOwogICAgfQogICAgdHlwZXMudHlwZUVycm9yKHRoaXMsICckdHlwZSBpcyBub3QgYSBzdWJ0eXBlIG9mICRzdXBlcmNsYXNzJyk7CiAgICByZXR1cm4gc3VwZXJjbGFzcy5yYXdUeXBlOwogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZyk7Cn0KCi8vLyBBbiBleHByZXNzaW9uIGNvbnRhaW5pbmcgY29tcGlsZS10aW1lIGVycm9ycy4KLy8vCi8vLyBTaG91bGQgdGhyb3cgYSBydW50aW1lIGVycm9yIHdoZW4gZXZhbHVhdGVkLgpjbGFzcyBJbnZhbGlkRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIFN0cmluZyBtZXNzYWdlOwoKICBJbnZhbGlkRXhwcmVzc2lvbih0aGlzLm1lc3NhZ2UpOwoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gY29uc3QgQm90dG9tVHlwZSgpOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdEludmFsaWRFeHByZXNzaW9uKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdEludmFsaWRFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCi8vLyBSZWFkIGEgbG9jYWwgdmFyaWFibGUsIGEgbG9jYWwgZnVuY3Rpb24sIG9yIGEgZnVuY3Rpb24gcGFyYW1ldGVyLgpAY29xCmNsYXNzIFZhcmlhYmxlR2V0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKICBAbm9jb3EKICBEYXJ0VHlwZSBwcm9tb3RlZFR5cGU7IC8vIE51bGwgaWYgbm90IHByb21vdGVkLgoKICBWYXJpYWJsZUdldCh0aGlzLnZhcmlhYmxlLCBbdGhpcy5wcm9tb3RlZFR5cGVdKTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIHJldHVybiBwcm9tb3RlZFR5cGUgPz8gdmFyaWFibGUudHlwZTsKICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0VmFyaWFibGVHZXQodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0VmFyaWFibGVHZXQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHByb21vdGVkVHlwZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHByb21vdGVkVHlwZSAhPSBudWxsKSB7CiAgICAgIHByb21vdGVkVHlwZSA9IHYudmlzaXREYXJ0VHlwZShwcm9tb3RlZFR5cGUpOwogICAgfQogIH0KfQoKLy8vIEFzc2lnbiBhIGxvY2FsIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIHBhcmFtZXRlci4KLy8vCi8vLyBFdmFsdWF0ZXMgdG8gdGhlIHZhbHVlIG9mIFt2YWx1ZV0uCmNsYXNzIFZhcmlhYmxlU2V0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKICBFeHByZXNzaW9uIHZhbHVlOwoKICBWYXJpYWJsZVNldCh0aGlzLnZhcmlhYmxlLCB0aGlzLnZhbHVlKSB7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB2YWx1ZS5nZXRTdGF0aWNUeXBlKHR5cGVzKTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRWYXJpYWJsZVNldCh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRWYXJpYWJsZVNldCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmFsdWU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHZhbHVlID0gdmFsdWUuYWNjZXB0KHYpOwogICAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBFeHByZXNzaW9uIG9mIGZvcm0gYHguZmllbGRgLgovLy8KLy8vIFRoaXMgbWF5IGludm9rZSBhIGdldHRlciwgcmVhZCBhIGZpZWxkLCBvciB0ZWFyIG9mZiBhIG1ldGhvZC4KQGNvcQpjbGFzcyBQcm9wZXJ0eUdldCBleHRlbmRzIEV4cHJlc3Npb24gewogIEV4cHJlc3Npb24gcmVjZWl2ZXI7CiAgQGNvcQogIE5hbWUgbmFtZTsKCiAgQG5vY29xCiAgUmVmZXJlbmNlIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZTsKCiAgUHJvcGVydHlHZXQoRXhwcmVzc2lvbiByZWNlaXZlciwgTmFtZSBuYW1lLCBbTWVtYmVyIGludGVyZmFjZVRhcmdldF0pCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShyZWNlaXZlciwgbmFtZSwgZ2V0TWVtYmVyUmVmZXJlbmNlKGludGVyZmFjZVRhcmdldCkpOwoKICBQcm9wZXJ0eUdldC5ieVJlZmVyZW5jZSgKICAgICAgdGhpcy5yZWNlaXZlciwgdGhpcy5uYW1lLCB0aGlzLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSkgewogICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBNZW1iZXIgZ2V0IGludGVyZmFjZVRhcmdldCA9PiBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U/LmFzTWVtYmVyOwoKICB2b2lkIHNldCBpbnRlcmZhY2VUYXJnZXQoTWVtYmVyIG1lbWJlcikgewogICAgaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKG1lbWJlcik7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgewogICAgdmFyIGludGVyZmFjZVRhcmdldCA9IHRoaXMuaW50ZXJmYWNlVGFyZ2V0OwogICAgaWYgKGludGVyZmFjZVRhcmdldCAhPSBudWxsKSB7CiAgICAgIENsYXNzIHN1cGVyY2xhc3MgPSBpbnRlcmZhY2VUYXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIHZhciByZWNlaXZlclR5cGUgPSByZWNlaXZlci5nZXRTdGF0aWNUeXBlQXNJbnN0YW5jZU9mKHN1cGVyY2xhc3MsIHR5cGVzKTsKICAgICAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZShyZWNlaXZlclR5cGUpCiAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUoaW50ZXJmYWNlVGFyZ2V0LmdldHRlclR5cGUpOwogICAgfQogICAgLy8gVHJlYXQgdGhlIHByb3BlcnRpZXMgb2YgT2JqZWN0IHNwZWNpYWxseS4KICAgIFN0cmluZyBuYW1lU3RyaW5nID0gbmFtZS5uYW1lOwogICAgaWYgKG5hbWVTdHJpbmcgPT0gJ2hhc2hDb2RlJykgewogICAgICByZXR1cm4gdHlwZXMuaW50VHlwZTsKICAgIH0gZWxzZSBpZiAobmFtZVN0cmluZyA9PSAncnVudGltZVR5cGUnKSB7CiAgICAgIHJldHVybiB0eXBlcy50eXBlVHlwZTsKICAgIH0KICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRQcm9wZXJ0eUdldCh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRQcm9wZXJ0eUdldCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgcmVjZWl2ZXI/LmFjY2VwdCh2KTsKICAgIG5hbWU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSB7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXIuYWNjZXB0KHYpOwogICAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBFeHByZXNzaW9uIG9mIGZvcm0gYHguZmllbGQgPSB2YWx1ZWAuCi8vLwovLy8gVGhpcyBtYXkgaW52b2tlIGEgc2V0dGVyIG9yIGFzc2lnbiBhIGZpZWxkLgovLy8KLy8vIEV2YWx1YXRlcyB0byB0aGUgdmFsdWUgb2YgW3ZhbHVlXS4KY2xhc3MgUHJvcGVydHlTZXQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIHJlY2VpdmVyOwogIE5hbWUgbmFtZTsKICBFeHByZXNzaW9uIHZhbHVlOwoKICBSZWZlcmVuY2UgaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlOwoKICBQcm9wZXJ0eVNldChFeHByZXNzaW9uIHJlY2VpdmVyLCBOYW1lIG5hbWUsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIFtNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0XSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWNlaXZlciwgbmFtZSwgdmFsdWUsIGdldE1lbWJlclJlZmVyZW5jZShpbnRlcmZhY2VUYXJnZXQpKTsKCiAgUHJvcGVydHlTZXQuYnlSZWZlcmVuY2UoCiAgICAgIHRoaXMucmVjZWl2ZXIsIHRoaXMubmFtZSwgdGhpcy52YWx1ZSwgdGhpcy5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpIHsKICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBNZW1iZXIgZ2V0IGludGVyZmFjZVRhcmdldCA9PiBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U/LmFzTWVtYmVyOwoKICB2b2lkIHNldCBpbnRlcmZhY2VUYXJnZXQoTWVtYmVyIG1lbWJlcikgewogICAgaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKG1lbWJlcik7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdmFsdWUuZ2V0U3RhdGljVHlwZSh0eXBlcyk7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0UHJvcGVydHlTZXQodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0UHJvcGVydHlTZXQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHJlY2VpdmVyPy5hY2NlcHQodik7CiAgICBuYW1lPy5hY2NlcHQodik7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHJlY2VpdmVyICE9IG51bGwpIHsKICAgICAgcmVjZWl2ZXIgPSByZWNlaXZlci5hY2NlcHQodik7CiAgICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQodik7CiAgICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIERpcmVjdGx5IHJlYWQgYSBmaWVsZCwgY2FsbCBhIGdldHRlciwgb3IgdGVhciBvZmYgYSBtZXRob2QuCmNsYXNzIERpcmVjdFByb3BlcnR5R2V0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgRXhwcmVzc2lvbiByZWNlaXZlcjsKICBSZWZlcmVuY2UgdGFyZ2V0UmVmZXJlbmNlOwoKICBEaXJlY3RQcm9wZXJ0eUdldChFeHByZXNzaW9uIHJlY2VpdmVyLCBNZW1iZXIgdGFyZ2V0KQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UocmVjZWl2ZXIsIGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpKTsKCiAgRGlyZWN0UHJvcGVydHlHZXQuYnlSZWZlcmVuY2UodGhpcy5yZWNlaXZlciwgdGhpcy50YXJnZXRSZWZlcmVuY2UpIHsKICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgTWVtYmVyIGdldCB0YXJnZXQgPT4gdGFyZ2V0UmVmZXJlbmNlPy5hc01lbWJlcjsKCiAgdm9pZCBzZXQgdGFyZ2V0KE1lbWJlciB0YXJnZXQpIHsKICAgIHRhcmdldFJlZmVyZW5jZSA9IGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpOwogIH0KCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHJlY2VpdmVyPy5hY2NlcHQodik7CiAgICB0YXJnZXQ/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSB7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXIuYWNjZXB0KHYpOwogICAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0RGlyZWN0UHJvcGVydHlHZXQodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0RGlyZWN0UHJvcGVydHlHZXQodGhpcywgYXJnKTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIENsYXNzIHN1cGVyY2xhc3MgPSB0YXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICB2YXIgcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXIuZ2V0U3RhdGljVHlwZUFzSW5zdGFuY2VPZihzdXBlcmNsYXNzLCB0eXBlcyk7CiAgICByZXR1cm4gU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKHJlY2VpdmVyVHlwZSkKICAgICAgICAuc3Vic3RpdHV0ZVR5cGUodGFyZ2V0LmdldHRlclR5cGUpOwogIH0KfQoKLy8vIERpcmVjdGx5IGFzc2lnbiBhIGZpZWxkLCBvciBjYWxsIGEgc2V0dGVyLgovLy8KLy8vIEV2YWx1YXRlcyB0byB0aGUgdmFsdWUgb2YgW3ZhbHVlXS4KY2xhc3MgRGlyZWN0UHJvcGVydHlTZXQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIHJlY2VpdmVyOwogIFJlZmVyZW5jZSB0YXJnZXRSZWZlcmVuY2U7CiAgRXhwcmVzc2lvbiB2YWx1ZTsKCiAgRGlyZWN0UHJvcGVydHlTZXQoRXhwcmVzc2lvbiByZWNlaXZlciwgTWVtYmVyIHRhcmdldCwgRXhwcmVzc2lvbiB2YWx1ZSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKHJlY2VpdmVyLCBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KSwgdmFsdWUpOwoKICBEaXJlY3RQcm9wZXJ0eVNldC5ieVJlZmVyZW5jZSgKICAgICAgdGhpcy5yZWNlaXZlciwgdGhpcy50YXJnZXRSZWZlcmVuY2UsIHRoaXMudmFsdWUpIHsKICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBNZW1iZXIgZ2V0IHRhcmdldCA9PiB0YXJnZXRSZWZlcmVuY2U/LmFzTWVtYmVyOwoKICB2b2lkIHNldCB0YXJnZXQoTWVtYmVyIHRhcmdldCkgewogICAgdGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCk7CiAgfQoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgcmVjZWl2ZXI/LmFjY2VwdCh2KTsKICAgIHRhcmdldD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgdmFsdWU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSB7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXIuYWNjZXB0KHYpOwogICAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHZhbHVlID0gdmFsdWUuYWNjZXB0KHYpOwogICAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0RGlyZWN0UHJvcGVydHlTZXQodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0RGlyZWN0UHJvcGVydHlTZXQodGhpcywgYXJnKTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHZhbHVlLmdldFN0YXRpY1R5cGUodHlwZXMpOwp9CgovLy8gRGlyZWN0bHkgY2FsbCBhbiBpbnN0YW5jZSBtZXRob2QsIGJ5cGFzc2luZyBvcmRpbmFyeSBkaXNwYXRjaC4KY2xhc3MgRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBleHRlbmRzIEludm9jYXRpb25FeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIHJlY2VpdmVyOwogIFJlZmVyZW5jZSB0YXJnZXRSZWZlcmVuY2U7CiAgQXJndW1lbnRzIGFyZ3VtZW50czsKCiAgRGlyZWN0TWV0aG9kSW52b2NhdGlvbigKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwgUHJvY2VkdXJlIHRhcmdldCwgQXJndW1lbnRzIGFyZ3VtZW50cykKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKHJlY2VpdmVyLCBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KSwgYXJndW1lbnRzKTsKCiAgRGlyZWN0TWV0aG9kSW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgdGhpcy5yZWNlaXZlciwgdGhpcy50YXJnZXRSZWZlcmVuY2UsIHRoaXMuYXJndW1lbnRzKSB7CiAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICB9CgogIFByb2NlZHVyZSBnZXQgdGFyZ2V0ID0+IHRhcmdldFJlZmVyZW5jZT8uYXNQcm9jZWR1cmU7CgogIHZvaWQgc2V0IHRhcmdldChQcm9jZWR1cmUgdGFyZ2V0KSB7CiAgICB0YXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIE5hbWUgZ2V0IG5hbWUgPT4gdGFyZ2V0Py5uYW1lOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgcmVjZWl2ZXI/LmFjY2VwdCh2KTsKICAgIHRhcmdldD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgYXJndW1lbnRzPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyLmFjY2VwdCh2KTsKICAgICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgYXJndW1lbnRzID0gYXJndW1lbnRzLmFjY2VwdCh2KTsKICAgICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4KICAgICAgdi52aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24odGhpcywgYXJnKTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIGlmICh0eXBlcy5pc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3IodGFyZ2V0KSkgewogICAgICByZXR1cm4gdHlwZXMuZ2V0VHlwZU9mT3ZlcmxvYWRlZEFyaXRobWV0aWMocmVjZWl2ZXIuZ2V0U3RhdGljVHlwZSh0eXBlcyksCiAgICAgICAgICBhcmd1bWVudHMucG9zaXRpb25hbFswXS5nZXRTdGF0aWNUeXBlKHR5cGVzKSk7CiAgICB9CiAgICBDbGFzcyBzdXBlcmNsYXNzID0gdGFyZ2V0LmVuY2xvc2luZ0NsYXNzOwogICAgdmFyIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyLmdldFN0YXRpY1R5cGVBc0luc3RhbmNlT2Yoc3VwZXJjbGFzcywgdHlwZXMpOwogICAgdmFyIHJldHVyblR5cGUgPSBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUocmVjZWl2ZXJUeXBlKQogICAgICAgIC5zdWJzdGl0dXRlVHlwZSh0YXJnZXQuZnVuY3Rpb24ucmV0dXJuVHlwZSk7CiAgICByZXR1cm4gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLCBhcmd1bWVudHMudHlwZXMpCiAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHJldHVyblR5cGUpOwogIH0KfQoKLy8vIEV4cHJlc3Npb24gb2YgZm9ybSBgc3VwZXIuZmllbGRgLgovLy8KLy8vIFRoaXMgbWF5IGludm9rZSBhIGdldHRlciwgcmVhZCBhIGZpZWxkLCBvciB0ZWFyIG9mZiBhIG1ldGhvZC4KY2xhc3MgU3VwZXJQcm9wZXJ0eUdldCBleHRlbmRzIEV4cHJlc3Npb24gewogIE5hbWUgbmFtZTsKCiAgUmVmZXJlbmNlIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZTsKCiAgU3VwZXJQcm9wZXJ0eUdldChOYW1lIG5hbWUsIFtNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0XSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKG5hbWUsIGdldE1lbWJlclJlZmVyZW5jZShpbnRlcmZhY2VUYXJnZXQpKTsKCiAgU3VwZXJQcm9wZXJ0eUdldC5ieVJlZmVyZW5jZSh0aGlzLm5hbWUsIHRoaXMuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKCiAgTWVtYmVyIGdldCBpbnRlcmZhY2VUYXJnZXQgPT4gaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlPy5hc01lbWJlcjsKCiAgdm9pZCBzZXQgaW50ZXJmYWNlVGFyZ2V0KE1lbWJlciBtZW1iZXIpIHsKICAgIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZSA9IGdldE1lbWJlclJlZmVyZW5jZShtZW1iZXIpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIENsYXNzIGRlY2xhcmluZ0NsYXNzID0gaW50ZXJmYWNlVGFyZ2V0LmVuY2xvc2luZ0NsYXNzOwogICAgaWYgKGRlY2xhcmluZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIGludGVyZmFjZVRhcmdldC5nZXR0ZXJUeXBlOwogICAgfQogICAgdmFyIHJlY2VpdmVyID0gdHlwZXMuZ2V0VHlwZUFzSW5zdGFuY2VPZih0eXBlcy50aGlzVHlwZSwgZGVjbGFyaW5nQ2xhc3MpOwogICAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZShyZWNlaXZlcikKICAgICAgICAuc3Vic3RpdHV0ZVR5cGUoaW50ZXJmYWNlVGFyZ2V0LmdldHRlclR5cGUpOwogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRTdXBlclByb3BlcnR5R2V0KHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFN1cGVyUHJvcGVydHlHZXQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIG5hbWU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCi8vLyBFeHByZXNzaW9uIG9mIGZvcm0gYHN1cGVyLmZpZWxkID0gdmFsdWVgLgovLy8KLy8vIFRoaXMgbWF5IGludm9rZSBhIHNldHRlciBvciBhc3NpZ24gYSBmaWVsZC4KLy8vCi8vLyBFdmFsdWF0ZXMgdG8gdGhlIHZhbHVlIG9mIFt2YWx1ZV0uCmNsYXNzIFN1cGVyUHJvcGVydHlTZXQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBOYW1lIG5hbWU7CiAgRXhwcmVzc2lvbiB2YWx1ZTsKCiAgUmVmZXJlbmNlIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZTsKCiAgU3VwZXJQcm9wZXJ0eVNldChOYW1lIG5hbWUsIEV4cHJlc3Npb24gdmFsdWUsIE1lbWJlciBpbnRlcmZhY2VUYXJnZXQpCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShuYW1lLCB2YWx1ZSwgZ2V0TWVtYmVyUmVmZXJlbmNlKGludGVyZmFjZVRhcmdldCkpOwoKICBTdXBlclByb3BlcnR5U2V0LmJ5UmVmZXJlbmNlKAogICAgICB0aGlzLm5hbWUsIHRoaXMudmFsdWUsIHRoaXMuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKSB7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIE1lbWJlciBnZXQgaW50ZXJmYWNlVGFyZ2V0ID0+IGludGVyZmFjZVRhcmdldFJlZmVyZW5jZT8uYXNNZW1iZXI7CgogIHZvaWQgc2V0IGludGVyZmFjZVRhcmdldChNZW1iZXIgbWVtYmVyKSB7CiAgICBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UobWVtYmVyKTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB2YWx1ZS5nZXRTdGF0aWNUeXBlKHR5cGVzKTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRTdXBlclByb3BlcnR5U2V0KHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFN1cGVyUHJvcGVydHlTZXQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIG5hbWU/LmFjY2VwdCh2KTsKICAgIHZhbHVlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB2YWx1ZSA9IHZhbHVlLmFjY2VwdCh2KTsKICAgICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gUmVhZCBhIHN0YXRpYyBmaWVsZCwgY2FsbCBhIHN0YXRpYyBnZXR0ZXIsIG9yIHRlYXIgb2ZmIGEgc3RhdGljIG1ldGhvZC4KY2xhc3MgU3RhdGljR2V0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgLy8vIEEgc3RhdGljIGZpZWxkLCBnZXR0ZXIsIG9yIG1ldGhvZCAoZm9yIHRlYXItb2ZmKS4KICBSZWZlcmVuY2UgdGFyZ2V0UmVmZXJlbmNlOwoKICBTdGF0aWNHZXQoTWVtYmVyIHRhcmdldCkgOiB0aGlzLmJ5UmVmZXJlbmNlKGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpKTsKCiAgU3RhdGljR2V0LmJ5UmVmZXJlbmNlKHRoaXMudGFyZ2V0UmVmZXJlbmNlKTsKCiAgTWVtYmVyIGdldCB0YXJnZXQgPT4gdGFyZ2V0UmVmZXJlbmNlPy5hc01lbWJlcjsKCiAgdm9pZCBzZXQgdGFyZ2V0KE1lbWJlciB0YXJnZXQpIHsKICAgIHRhcmdldFJlZmVyZW5jZSA9IGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHRhcmdldC5nZXR0ZXJUeXBlOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdFN0YXRpY0dldCh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRTdGF0aWNHZXQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHRhcmdldD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikge30KfQoKLy8vIEFzc2lnbiBhIHN0YXRpYyBmaWVsZCBvciBjYWxsIGEgc3RhdGljIHNldHRlci4KLy8vCi8vLyBFdmFsdWF0ZXMgdG8gdGhlIHZhbHVlIG9mIFt2YWx1ZV0uCmNsYXNzIFN0YXRpY1NldCBleHRlbmRzIEV4cHJlc3Npb24gewogIC8vLyBBIG11dGFibGUgc3RhdGljIGZpZWxkIG9yIGEgc3RhdGljIHNldHRlci4KICBSZWZlcmVuY2UgdGFyZ2V0UmVmZXJlbmNlOwogIEV4cHJlc3Npb24gdmFsdWU7CgogIFN0YXRpY1NldChNZW1iZXIgdGFyZ2V0LCBFeHByZXNzaW9uIHZhbHVlKQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UoZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCksIHZhbHVlKTsKCiAgU3RhdGljU2V0LmJ5UmVmZXJlbmNlKHRoaXMudGFyZ2V0UmVmZXJlbmNlLCB0aGlzLnZhbHVlKSB7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIE1lbWJlciBnZXQgdGFyZ2V0ID0+IHRhcmdldFJlZmVyZW5jZT8uYXNNZW1iZXI7CgogIHZvaWQgc2V0IHRhcmdldChNZW1iZXIgdGFyZ2V0KSB7CiAgICB0YXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB2YWx1ZS5nZXRTdGF0aWNUeXBlKHR5cGVzKTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRTdGF0aWNTZXQodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0U3RhdGljU2V0KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB0YXJnZXQ/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIHZhbHVlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB2YWx1ZSA9IHZhbHVlLmFjY2VwdCh2KTsKICAgICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gVGhlIGFyZ3VtZW50cyB0byBhIGZ1bmN0aW9uIGNhbGwsIGRpdmlkZWQgaW50byB0eXBlIGFyZ3VtZW50cywKLy8vIHBvc2l0aW9uYWwgYXJndW1lbnRzLCBhbmQgbmFtZWQgYXJndW1lbnRzLgpAY29xCmNsYXNzIEFyZ3VtZW50cyBleHRlbmRzIFRyZWVOb2RlIHsKICBAbm9jb3EKICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlczsKICBAY29xc2luZ2xlCiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBwb3NpdGlvbmFsOwogIExpc3Q8TmFtZWRFeHByZXNzaW9uPiBuYW1lZDsKCiAgQXJndW1lbnRzKHRoaXMucG9zaXRpb25hbCwKICAgICAge0xpc3Q8RGFydFR5cGU+IHR5cGVzLCBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gbmFtZWR9KQogICAgICA6IHRoaXMudHlwZXMgPSB0eXBlcyA/PyA8RGFydFR5cGU+W10sCiAgICAgICAgdGhpcy5uYW1lZCA9IG5hbWVkID8/IDxOYW1lZEV4cHJlc3Npb24+W10gewogICAgc2V0UGFyZW50cyh0aGlzLnBvc2l0aW9uYWwsIHRoaXMpOwogICAgc2V0UGFyZW50cyh0aGlzLm5hbWVkLCB0aGlzKTsKICB9CgogIEFyZ3VtZW50cy5lbXB0eSgpCiAgICAgIDogdHlwZXMgPSA8RGFydFR5cGU+W10sCiAgICAgICAgcG9zaXRpb25hbCA9IDxFeHByZXNzaW9uPltdLAogICAgICAgIG5hbWVkID0gPE5hbWVkRXhwcmVzc2lvbj5bXTsKCiAgZmFjdG9yeSBBcmd1bWVudHMuZm9yd2FyZGVkKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbikgewogICAgcmV0dXJuIG5ldyBBcmd1bWVudHMoCiAgICAgICAgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubWFwKChwKSA9PiBuZXcgVmFyaWFibGVHZXQocCkpLnRvTGlzdCgpLAogICAgICAgIG5hbWVkOiBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMKICAgICAgICAgICAgLm1hcCgocCkgPT4gbmV3IE5hbWVkRXhwcmVzc2lvbihwLm5hbWUsIG5ldyBWYXJpYWJsZUdldChwKSkpCiAgICAgICAgICAgIC50b0xpc3QoKSwKICAgICAgICB0eXBlczogZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMKICAgICAgICAgICAgLm1hcCgocCkgPT4gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKHApKQogICAgICAgICAgICAudG9MaXN0KCkpOwogIH0KCiAgYWNjZXB0KFRyZWVWaXNpdG9yIHYpID0+IHYudmlzaXRBcmd1bWVudHModGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QodHlwZXMsIHYpOwogICAgdmlzaXRMaXN0KHBvc2l0aW9uYWwsIHYpOwogICAgdmlzaXRMaXN0KG5hbWVkLCB2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHRyYW5zZm9ybVR5cGVMaXN0KHR5cGVzLCB2KTsKICAgIHRyYW5zZm9ybUxpc3QocG9zaXRpb25hbCwgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KG5hbWVkLCB2LCB0aGlzKTsKICB9Cn0KCi8vLyBBIG5hbWVkIGFyZ3VtZW50LCBgbmFtZTogdmFsdWVgLgpjbGFzcyBOYW1lZEV4cHJlc3Npb24gZXh0ZW5kcyBUcmVlTm9kZSB7CiAgU3RyaW5nIG5hbWU7CiAgRXhwcmVzc2lvbiB2YWx1ZTsKCiAgTmFtZWRFeHByZXNzaW9uKHRoaXMubmFtZSwgdGhpcy52YWx1ZSkgewogICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBhY2NlcHQoVHJlZVZpc2l0b3IgdikgPT4gdi52aXNpdE5hbWVkRXhwcmVzc2lvbih0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZhbHVlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB2YWx1ZSA9IHZhbHVlLmFjY2VwdCh2KTsKICAgICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQ29tbW9uIHN1cGVyIGNsYXNzIGZvciBbRGlyZWN0TWV0aG9kSW52b2NhdGlvbl0sIFtNZXRob2RJbnZvY2F0aW9uXSwKLy8vIFtTdXBlck1ldGhvZEludm9jYXRpb25dLCBbU3RhdGljSW52b2NhdGlvbl0sIGFuZCBbQ29uc3RydWN0b3JJbnZvY2F0aW9uXS4KQGNvcQphYnN0cmFjdCBjbGFzcyBJbnZvY2F0aW9uRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIEFyZ3VtZW50cyBnZXQgYXJndW1lbnRzOwogIHNldCBhcmd1bWVudHMoQXJndW1lbnRzIHZhbHVlKTsKCiAgLy8vIE5hbWUgb2YgdGhlIGludm9rZWQgbWV0aG9kLgogIC8vLwogIC8vLyBNYXkgYmUgYG51bGxgIGlmIHRoZSB0YXJnZXQgaXMgYSBzeW50aGV0aWMgc3RhdGljIG1lbWJlciB3aXRob3V0IGEgbmFtZS4KICBOYW1lIGdldCBuYW1lOwp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGB4LmZvbyh5KWAuCkBjb3EKY2xhc3MgTWV0aG9kSW52b2NhdGlvbiBleHRlbmRzIEludm9jYXRpb25FeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIHJlY2VpdmVyOwogIE5hbWUgbmFtZTsKICBBcmd1bWVudHMgYXJndW1lbnRzOwoKICBSZWZlcmVuY2UgaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlOwoKICBNZXRob2RJbnZvY2F0aW9uKEV4cHJlc3Npb24gcmVjZWl2ZXIsIE5hbWUgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgW01lbWJlciBpbnRlcmZhY2VUYXJnZXRdKQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UoCiAgICAgICAgICAgIHJlY2VpdmVyLCBuYW1lLCBhcmd1bWVudHMsIGdldE1lbWJlclJlZmVyZW5jZShpbnRlcmZhY2VUYXJnZXQpKTsKCiAgTWV0aG9kSW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgdGhpcy5yZWNlaXZlciwgdGhpcy5uYW1lLCB0aGlzLmFyZ3VtZW50cywgdGhpcy5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpIHsKICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgTWVtYmVyIGdldCBpbnRlcmZhY2VUYXJnZXQgPT4gaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlPy5hc01lbWJlcjsKCiAgdm9pZCBzZXQgaW50ZXJmYWNlVGFyZ2V0KE1lbWJlciB0YXJnZXQpIHsKICAgIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZSA9IGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIHZhciBpbnRlcmZhY2VUYXJnZXQgPSB0aGlzLmludGVyZmFjZVRhcmdldDsKICAgIGlmIChpbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCkgewogICAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0IGlzIFByb2NlZHVyZSAmJgogICAgICAgICAgdHlwZXMuaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yKGludGVyZmFjZVRhcmdldCkpIHsKICAgICAgICByZXR1cm4gdHlwZXMuZ2V0VHlwZU9mT3ZlcmxvYWRlZEFyaXRobWV0aWMoCiAgICAgICAgICAgIHJlY2VpdmVyLmdldFN0YXRpY1R5cGUodHlwZXMpLAogICAgICAgICAgICBhcmd1bWVudHMucG9zaXRpb25hbFswXS5nZXRTdGF0aWNUeXBlKHR5cGVzKSk7CiAgICAgIH0KICAgICAgQ2xhc3Mgc3VwZXJjbGFzcyA9IGludGVyZmFjZVRhcmdldC5lbmNsb3NpbmdDbGFzczsKICAgICAgdmFyIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyLmdldFN0YXRpY1R5cGVBc0luc3RhbmNlT2Yoc3VwZXJjbGFzcywgdHlwZXMpOwogICAgICB2YXIgZ2V0dGVyVHlwZSA9IFN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZShyZWNlaXZlclR5cGUpCiAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUoaW50ZXJmYWNlVGFyZ2V0LmdldHRlclR5cGUpOwogICAgICBpZiAoZ2V0dGVyVHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICByZXR1cm4gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgICAgICAgIGdldHRlclR5cGUudHlwZVBhcmFtZXRlcnMsIGFyZ3VtZW50cy50eXBlcykKICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKGdldHRlclR5cGUucmV0dXJuVHlwZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChuYW1lLm5hbWUgPT0gJ2NhbGwnKSB7CiAgICAgIHZhciByZWNlaXZlclR5cGUgPSByZWNlaXZlci5nZXRTdGF0aWNUeXBlKHR5cGVzKTsKICAgICAgaWYgKHJlY2VpdmVyVHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICBpZiAocmVjZWl2ZXJUeXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAhPSBhcmd1bWVudHMudHlwZXMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gY29uc3QgQm90dG9tVHlwZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgICAgICAgIHJlY2VpdmVyVHlwZS50eXBlUGFyYW1ldGVycywgYXJndW1lbnRzLnR5cGVzKQogICAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUocmVjZWl2ZXJUeXBlLnJldHVyblR5cGUpOwogICAgICB9CiAgICB9CiAgICBpZiAobmFtZS5uYW1lID09ICc9PScpIHsKICAgICAgLy8gV2UgdXNlIHRoaXMgc3BlY2lhbCBjYXNlIHRvIHNpbXBsaWZ5IGdlbmVyYXRpb24gb2YgJz09JyBjaGVja3MuCiAgICAgIHJldHVybiB0eXBlcy5ib29sVHlwZTsKICAgIH0KICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRNZXRob2RJbnZvY2F0aW9uKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdE1ldGhvZEludm9jYXRpb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHJlY2VpdmVyPy5hY2NlcHQodik7CiAgICBuYW1lPy5hY2NlcHQodik7CiAgICBhcmd1bWVudHM/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSB7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXIuYWNjZXB0KHYpOwogICAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudHMgPSBhcmd1bWVudHMuYWNjZXB0KHYpOwogICAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGBzdXBlci5mb28oeClgLgovLy8KLy8vIFRoZSBwcm92aWRlZCBhcmd1bWVudHMgbWlnaHQgbm90IG1hdGNoIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSB0YXJnZXQuCmNsYXNzIFN1cGVyTWV0aG9kSW52b2NhdGlvbiBleHRlbmRzIEludm9jYXRpb25FeHByZXNzaW9uIHsKICBOYW1lIG5hbWU7CiAgQXJndW1lbnRzIGFyZ3VtZW50czsKCiAgUmVmZXJlbmNlIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZTsKCiAgU3VwZXJNZXRob2RJbnZvY2F0aW9uKE5hbWUgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgW1Byb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXRdKQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UobmFtZSwgYXJndW1lbnRzLCBnZXRNZW1iZXJSZWZlcmVuY2UoaW50ZXJmYWNlVGFyZ2V0KSk7CgogIFN1cGVyTWV0aG9kSW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgdGhpcy5uYW1lLCB0aGlzLmFyZ3VtZW50cywgdGhpcy5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpIHsKICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICB9CgogIFByb2NlZHVyZSBnZXQgaW50ZXJmYWNlVGFyZ2V0ID0+IGludGVyZmFjZVRhcmdldFJlZmVyZW5jZT8uYXNQcm9jZWR1cmU7CgogIHZvaWQgc2V0IGludGVyZmFjZVRhcmdldChQcm9jZWR1cmUgdGFyZ2V0KSB7CiAgICBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSB7CiAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0ID09IG51bGwpIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgQ2xhc3Mgc3VwZXJjbGFzcyA9IGludGVyZmFjZVRhcmdldC5lbmNsb3NpbmdDbGFzczsKICAgIHZhciByZWNlaXZlclR5cGUgPSB0eXBlcy5nZXRUeXBlQXNJbnN0YW5jZU9mKHR5cGVzLnRoaXNUeXBlLCBzdXBlcmNsYXNzKTsKICAgIHZhciByZXR1cm5UeXBlID0gU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKHJlY2VpdmVyVHlwZSkKICAgICAgICAuc3Vic3RpdHV0ZVR5cGUoaW50ZXJmYWNlVGFyZ2V0LmZ1bmN0aW9uLnJldHVyblR5cGUpOwogICAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgIGludGVyZmFjZVRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVycywgYXJndW1lbnRzLnR5cGVzKQogICAgICAgIC5zdWJzdGl0dXRlVHlwZShyZXR1cm5UeXBlKTsKICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgbmFtZT8uYWNjZXB0KHYpOwogICAgYXJndW1lbnRzPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgYXJndW1lbnRzID0gYXJndW1lbnRzLmFjY2VwdCh2KTsKICAgICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEV4cHJlc3Npb24gb2YgZm9ybSBgZm9vKHgpYCwgb3IgYGNvbnN0IGZvbyh4KWAgaWYgdGhlIHRhcmdldCBpcyBhbgovLy8gZXh0ZXJuYWwgY29uc3RhbnQgZmFjdG9yeS4KLy8vCi8vLyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzIG1pZ2h0IG5vdCBtYXRjaCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgdGFyZ2V0LgpjbGFzcyBTdGF0aWNJbnZvY2F0aW9uIGV4dGVuZHMgSW52b2NhdGlvbkV4cHJlc3Npb24gewogIFJlZmVyZW5jZSB0YXJnZXRSZWZlcmVuY2U7CiAgQXJndW1lbnRzIGFyZ3VtZW50czsKCiAgLy8vIFRydWUgaWYgdGhpcyBpcyBhIGNvbnN0YW50IGNhbGwgdG8gYW4gZXh0ZXJuYWwgY29uc3RhbnQgZmFjdG9yeS4KICBib29sIGlzQ29uc3Q7CgogIE5hbWUgZ2V0IG5hbWUgPT4gdGFyZ2V0Py5uYW1lOwoKICBTdGF0aWNJbnZvY2F0aW9uKFByb2NlZHVyZSB0YXJnZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMsIHtib29sIGlzQ29uc3Q6IGZhbHNlfSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpLCBhcmd1bWVudHMsCiAgICAgICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBTdGF0aWNJbnZvY2F0aW9uLmJ5UmVmZXJlbmNlKHRoaXMudGFyZ2V0UmVmZXJlbmNlLCB0aGlzLmFyZ3VtZW50cywKICAgICAge3RoaXMuaXNDb25zdDogZmFsc2V9KSB7CiAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBQcm9jZWR1cmUgZ2V0IHRhcmdldCA9PiB0YXJnZXRSZWZlcmVuY2U/LmFzUHJvY2VkdXJlOwoKICB2b2lkIHNldCB0YXJnZXQoUHJvY2VkdXJlIHRhcmdldCkgewogICAgdGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgewogICAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgIHRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVycywgYXJndW1lbnRzLnR5cGVzKQogICAgICAgIC5zdWJzdGl0dXRlVHlwZSh0YXJnZXQuZnVuY3Rpb24ucmV0dXJuVHlwZSk7CiAgfQoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdFN0YXRpY0ludm9jYXRpb24odGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0U3RhdGljSW52b2NhdGlvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdGFyZ2V0Py5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICBhcmd1bWVudHM/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudHMgPSBhcmd1bWVudHMuYWNjZXB0KHYpOwogICAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGBuZXcgRm9vKHgpYCBvciBgY29uc3QgRm9vKHgpYC4KLy8vCi8vLyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzIG1pZ2h0IG5vdCBtYXRjaCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgdGFyZ2V0LgovLwovLyBERVNJR04gVE9ETzogU2hvdWxkIHdlIHBhc3MgdHlwZSBhcmd1bWVudHMgaW4gYSBzZXBhcmF0ZSBmaWVsZAovLyBgY2xhc3NUeXBlQXJndW1lbnRzYD8gVGhleSBhcmUgcXVpdGUgZGlmZmVyZW50IGZyb20gdHlwZSBhcmd1bWVudHMgdG8KLy8gZ2VuZXJpYyBmdW5jdGlvbnMuCkBjb3EKY2xhc3MgQ29uc3RydWN0b3JJbnZvY2F0aW9uIGV4dGVuZHMgSW52b2NhdGlvbkV4cHJlc3Npb24gewogIFJlZmVyZW5jZSB0YXJnZXRSZWZlcmVuY2U7CiAgQG5vY29xCiAgQXJndW1lbnRzIGFyZ3VtZW50czsKICBib29sIGlzQ29uc3Q7CgogIE5hbWUgZ2V0IG5hbWUgPT4gdGFyZ2V0Py5uYW1lOwoKICBDb25zdHJ1Y3Rvckludm9jYXRpb24oQ29uc3RydWN0b3IgdGFyZ2V0LCBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICB7Ym9vbCBpc0NvbnN0OiBmYWxzZX0pCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KSwgYXJndW1lbnRzLAogICAgICAgICAgICBpc0NvbnN0OiBpc0NvbnN0KTsKCiAgQ29uc3RydWN0b3JJbnZvY2F0aW9uLmJ5UmVmZXJlbmNlKHRoaXMudGFyZ2V0UmVmZXJlbmNlLCB0aGlzLmFyZ3VtZW50cywKICAgICAge3RoaXMuaXNDb25zdDogZmFsc2V9KSB7CiAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgdGFyZ2V0ID0+IHRhcmdldFJlZmVyZW5jZT8uYXNDb25zdHJ1Y3RvcjsKCiAgdm9pZCBzZXQgdGFyZ2V0KENvbnN0cnVjdG9yIHRhcmdldCkgewogICAgdGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgewogICAgcmV0dXJuIGFyZ3VtZW50cy50eXBlcy5pc0VtcHR5CiAgICAgICAgPyB0YXJnZXQuZW5jbG9zaW5nQ2xhc3MucmF3VHlwZQogICAgICAgIDogbmV3IEludGVyZmFjZVR5cGUodGFyZ2V0LmVuY2xvc2luZ0NsYXNzLCBhcmd1bWVudHMudHlwZXMpOwogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24odGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB0YXJnZXQ/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIGFyZ3VtZW50cz8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFyZ3VtZW50cyA9IGFyZ3VtZW50cy5hY2NlcHQodik7CiAgICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IGNvbnN0cnVjdGVkVHlwZSB7CiAgICByZXR1cm4gYXJndW1lbnRzLnR5cGVzLmlzRW1wdHkKICAgICAgICA/IHRhcmdldC5lbmNsb3NpbmdDbGFzcy5yYXdUeXBlCiAgICAgICAgOiBuZXcgSW50ZXJmYWNlVHlwZSh0YXJnZXQuZW5jbG9zaW5nQ2xhc3MsIGFyZ3VtZW50cy50eXBlcyk7CiAgfQp9CgovLy8gQW4gZXhwbGljaXQgdHlwZSBpbnN0YW50aWF0aW9uIG9mIGEgZ2VuZXJpYyBmdW5jdGlvbi4KY2xhc3MgSW5zdGFudGlhdGlvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwoKICBJbnN0YW50aWF0aW9uKHRoaXMuZXhwcmVzc2lvbiwgdGhpcy50eXBlQXJndW1lbnRzKSB7CiAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIEZ1bmN0aW9uVHlwZSB0eXBlID0gZXhwcmVzc2lvbi5nZXRTdGF0aWNUeXBlKHR5cGVzKTsKICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKHR5cGUudHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1bWVudHMpCiAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHR5cGUud2l0aG91dFR5cGVQYXJhbWV0ZXJzKTsKICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0SW5zdGFudGlhdGlvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRJbnN0YW50aWF0aW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBleHByZXNzaW9uPy5hY2NlcHQodik7CiAgICB2aXNpdExpc3QodHlwZUFyZ3VtZW50cywgdik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLmFjY2VwdCh2KTsKICAgICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHRyYW5zZm9ybVR5cGVMaXN0KHR5cGVBcmd1bWVudHMsIHYpOwogIH0KfQoKLy8vIEV4cHJlc3Npb24gb2YgZm9ybSBgIXhgLgovLy8KLy8vIFRoZSBgaXMhYCBhbmQgYCE9YCBvcGVyYXRvcnMgYXJlIGRlc3VnYXJlZCBpbnRvIFtOb3RdIG5vZGVzIHdpdGggYGlzYCBhbmQKLy8vIGA9PWAgZXhwcmVzc2lvbnMgaW5zaWRlLCByZXNwZWN0aXZlbHkuCmNsYXNzIE5vdCBleHRlbmRzIEV4cHJlc3Npb24gewogIEV4cHJlc3Npb24gb3BlcmFuZDsKCiAgTm90KHRoaXMub3BlcmFuZCkgewogICAgb3BlcmFuZD8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0eXBlcy5ib29sVHlwZTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXROb3QodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0Tm90KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBvcGVyYW5kPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAob3BlcmFuZCAhPSBudWxsKSB7CiAgICAgIG9wZXJhbmQgPSBvcGVyYW5kLmFjY2VwdCh2KTsKICAgICAgb3BlcmFuZD8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBFeHByZXNzaW9uIG9mIGZvcm0gYHggJiYgeWAgb3IgYHggfHwgeWAKY2xhc3MgTG9naWNhbEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIGxlZnQ7CiAgU3RyaW5nIG9wZXJhdG9yOyAvLyAmJiBvciB8fCBvciA/PwogIEV4cHJlc3Npb24gcmlnaHQ7CgogIExvZ2ljYWxFeHByZXNzaW9uKHRoaXMubGVmdCwgdGhpcy5vcGVyYXRvciwgdGhpcy5yaWdodCkgewogICAgbGVmdD8ucGFyZW50ID0gdGhpczsKICAgIHJpZ2h0Py5wYXJlbnQgPSB0aGlzOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLmJvb2xUeXBlOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdExvZ2ljYWxFeHByZXNzaW9uKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdExvZ2ljYWxFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBsZWZ0Py5hY2NlcHQodik7CiAgICByaWdodD8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGxlZnQgIT0gbnVsbCkgewogICAgICBsZWZ0ID0gbGVmdC5hY2NlcHQodik7CiAgICAgIGxlZnQ/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAocmlnaHQgIT0gbnVsbCkgewogICAgICByaWdodCA9IHJpZ2h0LmFjY2VwdCh2KTsKICAgICAgcmlnaHQ/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGB4ID8geSA6IHpgLgpjbGFzcyBDb25kaXRpb25hbEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBFeHByZXNzaW9uIHRoZW47CiAgRXhwcmVzc2lvbiBvdGhlcndpc2U7CgogIC8vLyBUaGUgc3RhdGljIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uIFNob3VsZCBub3QgYmUgYG51bGxgLgogIERhcnRUeXBlIHN0YXRpY1R5cGU7CgogIENvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgdGhpcy5jb25kaXRpb24sIHRoaXMudGhlbiwgdGhpcy5vdGhlcndpc2UsIHRoaXMuc3RhdGljVHlwZSkgewogICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgdGhlbj8ucGFyZW50ID0gdGhpczsKICAgIG90aGVyd2lzZT8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiBzdGF0aWNUeXBlOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGNvbmRpdGlvbj8uYWNjZXB0KHYpOwogICAgdGhlbj8uYWNjZXB0KHYpOwogICAgb3RoZXJ3aXNlPy5hY2NlcHQodik7CiAgICBzdGF0aWNUeXBlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFjY2VwdCh2KTsKICAgICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHRoZW4gIT0gbnVsbCkgewogICAgICB0aGVuID0gdGhlbi5hY2NlcHQodik7CiAgICAgIHRoZW4/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAob3RoZXJ3aXNlICE9IG51bGwpIHsKICAgICAgb3RoZXJ3aXNlID0gb3RoZXJ3aXNlLmFjY2VwdCh2KTsKICAgICAgb3RoZXJ3aXNlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHN0YXRpY1R5cGUgIT0gbnVsbCkgewogICAgICBzdGF0aWNUeXBlID0gdi52aXNpdERhcnRUeXBlKHN0YXRpY1R5cGUpOwogICAgfQogIH0KfQoKLy8vIENvbnZlcnQgZXhwcmVzc2lvbnMgdG8gc3RyaW5ncyBhbmQgY29uY2F0ZW5hdGUgdGhlbS4gIFNlbWFudGljYWxseSwgY2FsbHMKLy8vIGB0b1N0cmluZ2Agb24gZXZlcnkgYXJndW1lbnQsIGNoZWNrcyB0aGF0IGEgc3RyaW5nIGlzIHJldHVybmVkLCBhbmQgcmV0dXJucwovLy8gdGhlIGNvbmNhdGVuYXRpb24gb2YgYWxsIHRoZSBzdHJpbmdzLgovLy8KLy8vIElmIFtleHByZXNzaW9uc10gaXMgZW1wdHkgdGhlbiBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCi8vLwovLy8gVGhlc2UgYXJpc2UgZnJvbSBzdHJpbmcgaW50ZXJwb2xhdGlvbnMgYW5kIGFkamFjZW50IHN0cmluZyBsaXRlcmFscy4KY2xhc3MgU3RyaW5nQ29uY2F0ZW5hdGlvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnM7CgogIFN0cmluZ0NvbmNhdGVuYXRpb24odGhpcy5leHByZXNzaW9ucykgewogICAgc2V0UGFyZW50cyhleHByZXNzaW9ucywgdGhpcyk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZXMuc3RyaW5nVHlwZTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChleHByZXNzaW9ucywgdik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KGV4cHJlc3Npb25zLCB2LCB0aGlzKTsKICB9Cn0KCi8vLyBDb25jYXRlbmF0ZSBsaXN0cyBpbnRvIGEgc2luZ2xlIGxpc3QuCi8vLwovLy8gSWYgW2xpc3RzXSBpcyBlbXB0eSB0aGVuIGFuIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQuCi8vLwovLy8gVGhlc2UgYXJpc2UgZnJvbSBzcHJlYWQgYW5kIGNvbnRyb2wtZmxvdyBlbGVtZW50cyBpbiBjb25zdCBsaXN0IGxpdGVyYWxzLgovLy8gVGhleSBhcmUgb25seSBwcmVzZW50IGJlZm9yZSBjb25zdGFudCBldmFsdWF0aW9uLCBvciB3aXRoaW4gdW5ldmFsdWF0ZWQKLy8vIGNvbnN0YW50cyBpbiBjb25zdGFudCBleHByZXNzaW9ucy4KY2xhc3MgTGlzdENvbmNhdGVuYXRpb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQ7CiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBsaXN0czsKCiAgTGlzdENvbmNhdGVuYXRpb24odGhpcy5saXN0cywge3RoaXMudHlwZUFyZ3VtZW50OiBjb25zdCBEeW5hbWljVHlwZSgpfSkgewogICAgc2V0UGFyZW50cyhsaXN0cywgdGhpcyk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLmxpdGVyYWxMaXN0VHlwZSh0eXBlQXJndW1lbnQpOwogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRMaXN0Q29uY2F0ZW5hdGlvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRMaXN0Q29uY2F0ZW5hdGlvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdHlwZUFyZ3VtZW50Py5hY2NlcHQodik7CiAgICB2aXNpdExpc3QobGlzdHMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHlwZUFyZ3VtZW50ID0gdi52aXNpdERhcnRUeXBlKHR5cGVBcmd1bWVudCk7CiAgICB0cmFuc2Zvcm1MaXN0KGxpc3RzLCB2LCB0aGlzKTsKICB9Cn0KCi8vLyBDb25jYXRlbmF0ZSBzZXRzIGludG8gYSBzaW5nbGUgc2V0LgovLy8KLy8vIElmIFtzZXRzXSBpcyBlbXB0eSB0aGVuIGFuIGVtcHR5IHNldCBpcyByZXR1cm5lZC4KLy8vCi8vLyBUaGVzZSBhcmlzZSBmcm9tIHNwcmVhZCBhbmQgY29udHJvbC1mbG93IGVsZW1lbnRzIGluIGNvbnN0IHNldCBsaXRlcmFscy4KLy8vIFRoZXkgYXJlIG9ubHkgcHJlc2VudCBiZWZvcmUgY29uc3RhbnQgZXZhbHVhdGlvbiwgb3Igd2l0aGluIHVuZXZhbHVhdGVkCi8vLyBjb25zdGFudHMgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuCi8vLwovLy8gRHVwbGljYXRlZCB2YWx1ZXMgaW4gb3IgYWNyb3NzIHRoZSBzZXRzIHdpbGwgcmVzdWx0IGluIGEgY29tcGlsZS10aW1lIGVycm9yCi8vLyBkdXJpbmcgY29uc3RhbnQgZXZhbHVhdGlvbi4KY2xhc3MgU2V0Q29uY2F0ZW5hdGlvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIERhcnRUeXBlIHR5cGVBcmd1bWVudDsKICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IHNldHM7CgogIFNldENvbmNhdGVuYXRpb24odGhpcy5zZXRzLCB7dGhpcy50eXBlQXJndW1lbnQ6IGNvbnN0IER5bmFtaWNUeXBlKCl9KSB7CiAgICBzZXRQYXJlbnRzKHNldHMsIHRoaXMpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5saXRlcmFsU2V0VHlwZSh0eXBlQXJndW1lbnQpOwogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRTZXRDb25jYXRlbmF0aW9uKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFNldENvbmNhdGVuYXRpb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHR5cGVBcmd1bWVudD8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KHNldHMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHlwZUFyZ3VtZW50ID0gdi52aXNpdERhcnRUeXBlKHR5cGVBcmd1bWVudCk7CiAgICB0cmFuc2Zvcm1MaXN0KHNldHMsIHYsIHRoaXMpOwogIH0KfQoKLy8vIENvbmNhdGVuYXRlIG1hcHMgaW50byBhIHNpbmdsZSBtYXAuCi8vLwovLy8gSWYgW21hcHNdIGlzIGVtcHR5IHRoZW4gYW4gZW1wdHkgbWFwIGlzIHJldHVybmVkLgovLy8KLy8vIFRoZXNlIGFyaXNlIGZyb20gc3ByZWFkIGFuZCBjb250cm9sLWZsb3cgZWxlbWVudHMgaW4gY29uc3QgbWFwIGxpdGVyYWxzLgovLy8gVGhleSBhcmUgb25seSBwcmVzZW50IGJlZm9yZSBjb25zdGFudCBldmFsdWF0aW9uLCBvciB3aXRoaW4gdW5ldmFsdWF0ZWQKLy8vIGNvbnN0YW50cyBpbiBjb25zdGFudCBleHByZXNzaW9ucy4KLy8vCi8vLyBEdXBsaWNhdGVkIGtleXMgaW4gb3IgYWNyb3NzIHRoZSBtYXBzIHdpbGwgcmVzdWx0IGluIGEgY29tcGlsZS10aW1lIGVycm9yCi8vLyBkdXJpbmcgY29uc3RhbnQgZXZhbHVhdGlvbi4KY2xhc3MgTWFwQ29uY2F0ZW5hdGlvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIERhcnRUeXBlIGtleVR5cGU7CiAgRGFydFR5cGUgdmFsdWVUeXBlOwogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gbWFwczsKCiAgTWFwQ29uY2F0ZW5hdGlvbih0aGlzLm1hcHMsCiAgICAgIHt0aGlzLmtleVR5cGU6IGNvbnN0IER5bmFtaWNUeXBlKCksCiAgICAgIHRoaXMudmFsdWVUeXBlOiBjb25zdCBEeW5hbWljVHlwZSgpfSkgewogICAgc2V0UGFyZW50cyhtYXBzLCB0aGlzKTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMubGl0ZXJhbE1hcFR5cGUoa2V5VHlwZSwgdmFsdWVUeXBlKTsKICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0TWFwQ29uY2F0ZW5hdGlvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRNYXBDb25jYXRlbmF0aW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBrZXlUeXBlPy5hY2NlcHQodik7CiAgICB2YWx1ZVR5cGU/LmFjY2VwdCh2KTsKICAgIHZpc2l0TGlzdChtYXBzLCB2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGtleVR5cGUgPSB2LnZpc2l0RGFydFR5cGUoa2V5VHlwZSk7CiAgICB2YWx1ZVR5cGUgPSB2LnZpc2l0RGFydFR5cGUodmFsdWVUeXBlKTsKICAgIHRyYW5zZm9ybUxpc3QobWFwcywgdiwgdGhpcyk7CiAgfQp9CgovLy8gQ3JlYXRlIGFuIGluc3RhbmNlIGRpcmVjdGx5IGZyb20gdGhlIGZpZWxkIHZhbHVlcy4KLy8vCi8vLyBUaGlzIGV4cHJlc3Npb24gYXJpc2VzIGZyb20gY29uc3QgY29uc3RydWN0b3IgY2FsbHMgd2hlbiBvbmUgb3IgbW9yZSBmaWVsZAovLy8gaW5pdGlhbGl6aW5nIGV4cHJlc3Npb25zLCBmaWVsZCBpbml0aWFsaXplcnMsIGFzc2VydCBpbml0aWFsaXplcnMgb3IgdW51c2VkCi8vLyBhcmd1bWVudHMgY29udGFpbiB1bmV2YWx1YXRlZCBleHByZXNzaW9ucy4gVGhleSBvbmx5IGV2ZXIgb2NjdXIgd2l0aGluCi8vLyB1bmV2YWx1YXRlZCBjb25zdGFudHMgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuCmNsYXNzIEluc3RhbmNlQ3JlYXRpb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBSZWZlcmVuY2UgY2xhc3NSZWZlcmVuY2U7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKICBmaW5hbCBNYXA8UmVmZXJlbmNlLCBFeHByZXNzaW9uPiBmaWVsZFZhbHVlczsKICBmaW5hbCBMaXN0PEFzc2VydFN0YXRlbWVudD4gYXNzZXJ0czsKICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IHVudXNlZEFyZ3VtZW50czsKCiAgSW5zdGFuY2VDcmVhdGlvbih0aGlzLmNsYXNzUmVmZXJlbmNlLCB0aGlzLnR5cGVBcmd1bWVudHMsIHRoaXMuZmllbGRWYWx1ZXMsCiAgICAgIHRoaXMuYXNzZXJ0cywgdGhpcy51bnVzZWRBcmd1bWVudHMpOwoKICBDbGFzcyBnZXQgY2xhc3NOb2RlID0+IGNsYXNzUmVmZXJlbmNlLmFzQ2xhc3M7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZUFyZ3VtZW50cy5pc0VtcHR5CiAgICAgICAgPyBjbGFzc05vZGUucmF3VHlwZQogICAgICAgIDogbmV3IEludGVyZmFjZVR5cGUoY2xhc3NOb2RlLCB0eXBlQXJndW1lbnRzKTsKICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0SW5zdGFuY2VDcmVhdGlvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRJbnN0YW5jZUNyZWF0aW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBjbGFzc1JlZmVyZW5jZS5hc0NsYXNzLmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIHZpc2l0TGlzdCh0eXBlQXJndW1lbnRzLCB2KTsKICAgIGZvciAoZmluYWwgUmVmZXJlbmNlIHJlZmVyZW5jZSBpbiBmaWVsZFZhbHVlcy5rZXlzKSB7CiAgICAgIHJlZmVyZW5jZS5hc0ZpZWxkLmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIH0KICAgIGZvciAoZmluYWwgRXhwcmVzc2lvbiB2YWx1ZSBpbiBmaWVsZFZhbHVlcy52YWx1ZXMpIHsKICAgICAgdmFsdWUuYWNjZXB0KHYpOwogICAgfQogICAgdmlzaXRMaXN0KGFzc2VydHMsIHYpOwogICAgdmlzaXRMaXN0KHVudXNlZEFyZ3VtZW50cywgdik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBmaWVsZFZhbHVlcy5mb3JFYWNoKChSZWZlcmVuY2UgZmllbGRSZWYsIEV4cHJlc3Npb24gdmFsdWUpIHsKICAgICAgRXhwcmVzc2lvbiB0cmFuc2Zvcm1lZCA9IHZhbHVlLmFjY2VwdCh2KTsKICAgICAgaWYgKHRyYW5zZm9ybWVkICE9IG51bGwgJiYgIWlkZW50aWNhbCh2YWx1ZSwgdHJhbnNmb3JtZWQpKSB7CiAgICAgICAgZmllbGRWYWx1ZXNbZmllbGRSZWZdID0gdHJhbnNmb3JtZWQ7CiAgICAgICAgdHJhbnNmb3JtZWQucGFyZW50ID0gdGhpczsKICAgICAgfQogICAgfSk7CiAgICB0cmFuc2Zvcm1MaXN0KGFzc2VydHMsIHYsIHRoaXMpOwogICAgdHJhbnNmb3JtTGlzdCh1bnVzZWRBcmd1bWVudHMsIHYsIHRoaXMpOwogIH0KfQoKLy8vIEV4cHJlc3Npb24gb2YgZm9ybSBgeCBpcyBUYC4KY2xhc3MgSXNFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgRXhwcmVzc2lvbiBvcGVyYW5kOwogIERhcnRUeXBlIHR5cGU7CgogIElzRXhwcmVzc2lvbih0aGlzLm9wZXJhbmQsIHRoaXMudHlwZSkgewogICAgb3BlcmFuZD8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0eXBlcy5ib29sVHlwZTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRJc0V4cHJlc3Npb24odGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0SXNFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBvcGVyYW5kPy5hY2NlcHQodik7CiAgICB0eXBlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAob3BlcmFuZCAhPSBudWxsKSB7CiAgICAgIG9wZXJhbmQgPSBvcGVyYW5kLmFjY2VwdCh2KTsKICAgICAgb3BlcmFuZD8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHR5cGUgPSB2LnZpc2l0RGFydFR5cGUodHlwZSk7CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGB4IGFzIFRgLgpjbGFzcyBBc0V4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBpbnQgZmxhZ3MgPSAwOwogIEV4cHJlc3Npb24gb3BlcmFuZDsKICBEYXJ0VHlwZSB0eXBlOwoKICBBc0V4cHJlc3Npb24odGhpcy5vcGVyYW5kLCB0aGlzLnR5cGUpIHsKICAgIG9wZXJhbmQ/LnBhcmVudCA9IHRoaXM7CiAgfQoKICAvLyBNdXN0IG1hdGNoIHNlcmlhbGl6ZWQgYml0IHBvc2l0aW9ucy4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdUeXBlRXJyb3IgPSAxIDw8IDA7CgogIC8vLyBJbmRpY2F0ZXMgdGhlIHR5cGUgb2YgZXJyb3IgdGhhdCBzaG91bGQgYmUgdGhyb3duIGlmIHRoZSBjaGVjayBmYWlscy4KICAvLy8KICAvLy8gYHRydWVgIG1lYW5zIHRoYXQgYSBUeXBlRXJyb3Igc2hvdWxkIGJlIHRocm93bi4gIGBmYWxzZWAgbWVhbnMgdGhhdCBhCiAgLy8vIENhc3RFcnJvciBzaG91bGQgYmUgdGhyb3duLgogIGJvb2wgZ2V0IGlzVHlwZUVycm9yID0+IGZsYWdzICYgRmxhZ1R5cGVFcnJvciAhPSAwOwoKICB2b2lkIHNldCBpc1R5cGVFcnJvcihib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ1R5cGVFcnJvcikgOiAoZmxhZ3MgJiB+RmxhZ1R5cGVFcnJvcik7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRBc0V4cHJlc3Npb24odGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0QXNFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBvcGVyYW5kPy5hY2NlcHQodik7CiAgICB0eXBlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAob3BlcmFuZCAhPSBudWxsKSB7CiAgICAgIG9wZXJhbmQgPSBvcGVyYW5kLmFjY2VwdCh2KTsKICAgICAgb3BlcmFuZD8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHR5cGUgPSB2LnZpc2l0RGFydFR5cGUodHlwZSk7CiAgfQp9CgovLy8gQW4gaW50ZWdlciwgZG91YmxlLCBib29sZWFuLCBzdHJpbmcsIG9yIG51bGwgY29uc3RhbnQuCmFic3RyYWN0IGNsYXNzIEJhc2ljTGl0ZXJhbCBleHRlbmRzIEV4cHJlc3Npb24gewogIE9iamVjdCBnZXQgdmFsdWU7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCmNsYXNzIFN0cmluZ0xpdGVyYWwgZXh0ZW5kcyBCYXNpY0xpdGVyYWwgewogIFN0cmluZyB2YWx1ZTsKCiAgU3RyaW5nTGl0ZXJhbCh0aGlzLnZhbHVlKTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLnN0cmluZ1R5cGU7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0U3RyaW5nTGl0ZXJhbCh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRTdHJpbmdMaXRlcmFsKHRoaXMsIGFyZyk7Cn0KCmNsYXNzIEludExpdGVyYWwgZXh0ZW5kcyBCYXNpY0xpdGVyYWwgewogIC8vLyBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBob2xkcyBhIHVpbnQ2NCB2YWx1ZS4KICAvLy8gRS5nLiAiMHg4MDAwMDAwMDAwMDAwMDAwIiB3aWxsIGJlIHNhdmVkIGFzICItOTIyMzM3MjAzNjg1NDc3NTgwOCIgZGVzcGl0ZQogIC8vLyB0ZWNobmljYWxseSAob24gc29tZSBwbGF0Zm9ybXMsIHBhcnRpY3VsYXJseSBKYXZhc2NyaXB0KSBiZWluZyBwb3NpdGl2ZS4KICAvLy8gSWYgdGhlIG51bWJlciBpcyBtZWFudCB0byBiZSBuZWdhdGl2ZSBpdCB3aWxsIGJlIHdyYXBwZWQgaW4gYSAidW5hcnktIi4KICBpbnQgdmFsdWU7CgogIEludExpdGVyYWwodGhpcy52YWx1ZSk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0eXBlcy5pbnRUeXBlOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdEludExpdGVyYWwodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0SW50TGl0ZXJhbCh0aGlzLCBhcmcpOwp9CgpjbGFzcyBEb3VibGVMaXRlcmFsIGV4dGVuZHMgQmFzaWNMaXRlcmFsIHsKICBkb3VibGUgdmFsdWU7CgogIERvdWJsZUxpdGVyYWwodGhpcy52YWx1ZSk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0eXBlcy5kb3VibGVUeXBlOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdERvdWJsZUxpdGVyYWwodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0RG91YmxlTGl0ZXJhbCh0aGlzLCBhcmcpOwp9CgpjbGFzcyBCb29sTGl0ZXJhbCBleHRlbmRzIEJhc2ljTGl0ZXJhbCB7CiAgYm9vbCB2YWx1ZTsKCiAgQm9vbExpdGVyYWwodGhpcy52YWx1ZSk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0eXBlcy5ib29sVHlwZTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRCb29sTGl0ZXJhbCh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRCb29sTGl0ZXJhbCh0aGlzLCBhcmcpOwp9CgpjbGFzcyBOdWxsTGl0ZXJhbCBleHRlbmRzIEJhc2ljTGl0ZXJhbCB7CiAgT2JqZWN0IGdldCB2YWx1ZSA9PiBudWxsOwoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZXMubnVsbFR5cGU7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0TnVsbExpdGVyYWwodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0TnVsbExpdGVyYWwodGhpcywgYXJnKTsKfQoKY2xhc3MgU3ltYm9sTGl0ZXJhbCBleHRlbmRzIEV4cHJlc3Npb24gewogIFN0cmluZyB2YWx1ZTsgLy8gRXZlcnl0aGluZyBzdHJpY3RseSBhZnRlciB0aGUgJyMnLgoKICBTeW1ib2xMaXRlcmFsKHRoaXMudmFsdWUpOwoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZXMuc3ltYm9sVHlwZTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRTeW1ib2xMaXRlcmFsKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFN5bWJvbExpdGVyYWwodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikge30KfQoKY2xhc3MgVHlwZUxpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBEYXJ0VHlwZSB0eXBlOwoKICBUeXBlTGl0ZXJhbCh0aGlzLnR5cGUpOwoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZXMudHlwZVR5cGU7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0VHlwZUxpdGVyYWwodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0VHlwZUxpdGVyYWwodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHR5cGU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHR5cGUgPSB2LnZpc2l0RGFydFR5cGUodHlwZSk7CiAgfQp9CgpjbGFzcyBUaGlzRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0eXBlcy50aGlzVHlwZTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRUaGlzRXhwcmVzc2lvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRUaGlzRXhwcmVzc2lvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgpjbGFzcyBSZXRocm93IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IGNvbnN0IEJvdHRvbVR5cGUoKTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRSZXRocm93KHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFJldGhyb3codGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikge30KfQoKY2xhc3MgVGhyb3cgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIGV4cHJlc3Npb247CgogIFRocm93KHRoaXMuZXhwcmVzc2lvbikgewogICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiBjb25zdCBCb3R0b21UeXBlKCk7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0VGhyb3codGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0VGhyb3codGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGV4cHJlc3Npb24/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uYWNjZXB0KHYpOwogICAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKY2xhc3MgTGlzdExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBib29sIGlzQ29uc3Q7CiAgRGFydFR5cGUgdHlwZUFyZ3VtZW50OyAvLyBOb3QgbnVsbCwgZGVmYXVsdHMgdG8gRHluYW1pY1R5cGUuCiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9uczsKCiAgTGlzdExpdGVyYWwodGhpcy5leHByZXNzaW9ucywKICAgICAge3RoaXMudHlwZUFyZ3VtZW50OiBjb25zdCBEeW5hbWljVHlwZSgpLCB0aGlzLmlzQ29uc3Q6IGZhbHNlfSkgewogICAgYXNzZXJ0KHR5cGVBcmd1bWVudCAhPSBudWxsKTsKICAgIHNldFBhcmVudHMoZXhwcmVzc2lvbnMsIHRoaXMpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5saXRlcmFsTGlzdFR5cGUodHlwZUFyZ3VtZW50KTsKICB9CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0TGlzdExpdGVyYWwodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0TGlzdExpdGVyYWwodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHR5cGVBcmd1bWVudD8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KGV4cHJlc3Npb25zLCB2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHR5cGVBcmd1bWVudCA9IHYudmlzaXREYXJ0VHlwZSh0eXBlQXJndW1lbnQpOwogICAgdHJhbnNmb3JtTGlzdChleHByZXNzaW9ucywgdiwgdGhpcyk7CiAgfQp9CgpjbGFzcyBTZXRMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgYm9vbCBpc0NvbnN0OwogIERhcnRUeXBlIHR5cGVBcmd1bWVudDsgLy8gTm90IG51bGwsIGRlZmF1bHRzIHRvIER5bmFtaWNUeXBlLgogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnM7CgogIFNldExpdGVyYWwodGhpcy5leHByZXNzaW9ucywKICAgICAge3RoaXMudHlwZUFyZ3VtZW50OiBjb25zdCBEeW5hbWljVHlwZSgpLCB0aGlzLmlzQ29uc3Q6IGZhbHNlfSkgewogICAgYXNzZXJ0KHR5cGVBcmd1bWVudCAhPSBudWxsKTsKICAgIHNldFBhcmVudHMoZXhwcmVzc2lvbnMsIHRoaXMpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5saXRlcmFsU2V0VHlwZSh0eXBlQXJndW1lbnQpOwogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRTZXRMaXRlcmFsKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFNldExpdGVyYWwodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHR5cGVBcmd1bWVudD8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KGV4cHJlc3Npb25zLCB2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHR5cGVBcmd1bWVudCA9IHYudmlzaXREYXJ0VHlwZSh0eXBlQXJndW1lbnQpOwogICAgdHJhbnNmb3JtTGlzdChleHByZXNzaW9ucywgdiwgdGhpcyk7CiAgfQp9CgpjbGFzcyBNYXBMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgYm9vbCBpc0NvbnN0OwogIERhcnRUeXBlIGtleVR5cGU7IC8vIE5vdCBudWxsLCBkZWZhdWx0cyB0byBEeW5hbWljVHlwZS4KICBEYXJ0VHlwZSB2YWx1ZVR5cGU7IC8vIE5vdCBudWxsLCBkZWZhdWx0cyB0byBEeW5hbWljVHlwZS4KICBmaW5hbCBMaXN0PE1hcEVudHJ5PiBlbnRyaWVzOwoKICBNYXBMaXRlcmFsKHRoaXMuZW50cmllcywKICAgICAge3RoaXMua2V5VHlwZTogY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgdGhpcy52YWx1ZVR5cGU6IGNvbnN0IER5bmFtaWNUeXBlKCksCiAgICAgIHRoaXMuaXNDb25zdDogZmFsc2V9KSB7CiAgICBhc3NlcnQoa2V5VHlwZSAhPSBudWxsKTsKICAgIGFzc2VydCh2YWx1ZVR5cGUgIT0gbnVsbCk7CiAgICBzZXRQYXJlbnRzKGVudHJpZXMsIHRoaXMpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5saXRlcmFsTWFwVHlwZShrZXlUeXBlLCB2YWx1ZVR5cGUpOwogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRNYXBMaXRlcmFsKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdE1hcExpdGVyYWwodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGtleVR5cGU/LmFjY2VwdCh2KTsKICAgIHZhbHVlVHlwZT8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KGVudHJpZXMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAga2V5VHlwZSA9IHYudmlzaXREYXJ0VHlwZShrZXlUeXBlKTsKICAgIHZhbHVlVHlwZSA9IHYudmlzaXREYXJ0VHlwZSh2YWx1ZVR5cGUpOwogICAgdHJhbnNmb3JtTGlzdChlbnRyaWVzLCB2LCB0aGlzKTsKICB9Cn0KCmNsYXNzIE1hcEVudHJ5IGV4dGVuZHMgVHJlZU5vZGUgewogIEV4cHJlc3Npb24ga2V5OwogIEV4cHJlc3Npb24gdmFsdWU7CgogIE1hcEVudHJ5KHRoaXMua2V5LCB0aGlzLnZhbHVlKSB7CiAgICBrZXk/LnBhcmVudCA9IHRoaXM7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIGFjY2VwdChUcmVlVmlzaXRvciB2KSA9PiB2LnZpc2l0TWFwRW50cnkodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBrZXk/LmFjY2VwdCh2KTsKICAgIHZhbHVlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoa2V5ICE9IG51bGwpIHsKICAgICAga2V5ID0ga2V5LmFjY2VwdCh2KTsKICAgICAga2V5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQodik7CiAgICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEV4cHJlc3Npb24gb2YgZm9ybSBgYXdhaXQgeGAuCmNsYXNzIEF3YWl0RXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIEV4cHJlc3Npb24gb3BlcmFuZDsKCiAgQXdhaXRFeHByZXNzaW9uKHRoaXMub3BlcmFuZCkgewogICAgb3BlcmFuZD8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMudW5mdXR1cmVUeXBlKG9wZXJhbmQuZ2V0U3RhdGljVHlwZSh0eXBlcykpOwogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRBd2FpdEV4cHJlc3Npb24odGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0QXdhaXRFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBvcGVyYW5kPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAob3BlcmFuZCAhPSBudWxsKSB7CiAgICAgIG9wZXJhbmQgPSBvcGVyYW5kLmFjY2VwdCh2KTsKICAgICAgb3BlcmFuZD8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBDb21tb24gc3VwZXItaW50ZXJmYWNlIGZvciBbRnVuY3Rpb25FeHByZXNzaW9uXSBhbmQgW0Z1bmN0aW9uRGVjbGFyYXRpb25dLgphYnN0cmFjdCBjbGFzcyBMb2NhbEZ1bmN0aW9uIGltcGxlbWVudHMgVHJlZU5vZGUgewogIEZ1bmN0aW9uTm9kZSBnZXQgZnVuY3Rpb247Cn0KCi8vLyBFeHByZXNzaW9uIG9mIGZvcm0gYCh4LHkpID0+IC4uLmAgb3IgYCh4LHkpIHsgLi4uIH1gCi8vLwovLy8gVGhlIGFycm93LWJvZHkgZm9ybSBgPT4gZWAgaXMgZGVzdWdhcmVkIGludG8gYHJldHVybiBlO2AuCmNsYXNzIEZ1bmN0aW9uRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBMb2NhbEZ1bmN0aW9uIHsKICBGdW5jdGlvbk5vZGUgZnVuY3Rpb247CgogIEZ1bmN0aW9uRXhwcmVzc2lvbih0aGlzLmZ1bmN0aW9uKSB7CiAgICBmdW5jdGlvbj8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiBmdW5jdGlvbi5mdW5jdGlvblR5cGU7CgogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciB2KSA9PiB2LnZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgZnVuY3Rpb24/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChmdW5jdGlvbiAhPSBudWxsKSB7CiAgICAgIGZ1bmN0aW9uID0gZnVuY3Rpb24uYWNjZXB0KHYpOwogICAgICBmdW5jdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCmNsYXNzIENvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIENvbnN0YW50IGNvbnN0YW50OwogIERhcnRUeXBlIHR5cGU7CgogIENvbnN0YW50RXhwcmVzc2lvbih0aGlzLmNvbnN0YW50LCBbdGhpcy50eXBlID0gY29uc3QgRHluYW1pY1R5cGUoKV0pIHsKICAgIGFzc2VydChjb25zdGFudCAhPSBudWxsKTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0eXBlOwoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdENvbnN0YW50RXhwcmVzc2lvbih0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRDb25zdGFudEV4cHJlc3Npb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGNvbnN0YW50Py5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB0eXBlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBjb25zdGFudCA9IHYudmlzaXRDb25zdGFudChjb25zdGFudCk7CiAgICB0eXBlID0gdi52aXNpdERhcnRUeXBlKHR5cGUpOwogIH0KfQoKLy8vIFN5bnRoZXRpYyBleHByZXNzaW9uIG9mIGZvcm0gYGxldCB2ID0geCBpbiB5YApjbGFzcyBMZXQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOyAvLyBNdXN0IGhhdmUgYW4gaW5pdGlhbGl6ZXIuCiAgRXhwcmVzc2lvbiBib2R5OwoKICBMZXQodGhpcy52YXJpYWJsZSwgdGhpcy5ib2R5KSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gYm9keS5nZXRTdGF0aWNUeXBlKHR5cGVzKTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRMZXQodGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0TGV0KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogICAgYm9keT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgdmFyaWFibGUgPSB2YXJpYWJsZS5hY2NlcHQodik7CiAgICAgIHZhcmlhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICBib2R5ID0gYm9keS5hY2NlcHQodik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpjbGFzcyBCbG9ja0V4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBCbG9jayBib2R5OwogIEV4cHJlc3Npb24gdmFsdWU7CgogIEJsb2NrRXhwcmVzc2lvbih0aGlzLmJvZHksIHRoaXMudmFsdWUpIHsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB2YWx1ZS5nZXRTdGF0aWNUeXBlKHR5cGVzKTsKCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRCbG9ja0V4cHJlc3Npb24odGhpcyk7CiAgYWNjZXB0MShFeHByZXNzaW9uVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0QmxvY2tFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBib2R5Py5hY2NlcHQodik7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICBib2R5ID0gYm9keS5hY2NlcHQodik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB2YWx1ZSA9IHZhbHVlLmFjY2VwdCh2KTsKICAgICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBsaWJyYXJ5IHJlZmVycmVkIHRvIGJ5IGEgZGVmZXJyZWQgaW1wb3J0LgovLy8KLy8vIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgY29uY2VybmVkIHdpdGg6Ci8vLyAtIGtlZXBpbmcgdHJhY2sgd2hldGhlciB0aGUgZGVmZXJyZWQgaW1wb3J0IGlzIG1hcmtlZCBhcyAnbG9hZGVkJwovLy8gLSBrZWVwaW5nIHRyYWNrIG9mIHdoZXRoZXIgdGhlIGxpYnJhcnkgY29kZSBoYXMgYWxyZWFkeSBiZWVuIGRvd25sb2FkZWQKLy8vIC0gYWN0dWFsbHkgZG93bmxvYWRpbmcgYW5kIGxpbmtpbmcgdGhlIGxpYnJhcnkKLy8vCi8vLyBTaG91bGQgcmV0dXJuIGEgZnV0dXJlLiAgVGhlIHZhbHVlIGluIHRoaXMgZnV0dXJlIHdpbGwgYmUgdGhlIHNhbWUgdmFsdWUKLy8vIHNlZW4gYnkgY2FsbGVycyBvZiBgbG9hZExpYnJhcnlgIGZ1bmN0aW9ucy4KLy8vCi8vLyBPbiBiYWNrZW5kcyB0aGF0IGxpbmsgdGhlIGVudGlyZSBwcm9ncmFtIGVhZ2VybHksIHRoaXMgaW5zdHJ1Y3Rpb24gbmVlZHMKLy8vIHRvIG1hcmsgdGhlIGRlZmVycmVkIGltcG9ydCBhcyAnbG9hZGVkJyBhbmQgcmV0dXJuIGEgZnV0dXJlLgpjbGFzcyBMb2FkTGlicmFyeSBleHRlbmRzIEV4cHJlc3Npb24gewogIC8vLyBSZWZlcmVuY2UgdG8gYSBkZWZlcnJlZCBpbXBvcnQgaW4gdGhlIGVuY2xvc2luZyBsaWJyYXJ5LgogIExpYnJhcnlEZXBlbmRlbmN5IGltcG9ydDsKCiAgTG9hZExpYnJhcnkodGhpcy5pbXBvcnQpOwoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLmZ1dHVyZVR5cGUoY29uc3QgRHluYW1pY1R5cGUoKSk7CiAgfQoKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgdikgPT4gdi52aXNpdExvYWRMaWJyYXJ5KHRoaXMpOwogIGFjY2VwdDEoRXhwcmVzc2lvblZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdExvYWRMaWJyYXJ5KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCi8vLyBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gZGVmZXJyZWQgaW1wb3J0IGhhcyBiZWVuIG1hcmtlZCBhcyAnbG9hZGVkJy4KY2xhc3MgQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICAvLy8gUmVmZXJlbmNlIHRvIGEgZGVmZXJyZWQgaW1wb3J0IGluIHRoZSBlbmNsb3NpbmcgbGlicmFyeS4KICBMaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQ7CgogIENoZWNrTGlicmFyeUlzTG9hZGVkKHRoaXMuaW1wb3J0KTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5vYmplY3RUeXBlOwogIH0KCiAgYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yIHYpID0+IHYudmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZCh0aGlzKTsKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURU1FTlRTCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQGNvcQphYnN0cmFjdCBjbGFzcyBTdGF0ZW1lbnQgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3Igdik7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpOwp9CgpAY29xCmNsYXNzIEV4cHJlc3Npb25TdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgRXhwcmVzc2lvblN0YXRlbWVudCh0aGlzLmV4cHJlc3Npb24pIHsKICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2KSA9PiB2LnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudCh0aGlzKTsKICBhY2NlcHQxKFN0YXRlbWVudFZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGV4cHJlc3Npb24/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uYWNjZXB0KHYpOwogICAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKQGNvcQpjbGFzcyBCbG9jayBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHM7CgogIEJsb2NrKHRoaXMuc3RhdGVtZW50cykgewogICAgLy8gRW5zdXJlIHN0YXRlbWVudHMgaXMgbXV0YWJsZS4KICAgIGFzc2VydCgoc3RhdGVtZW50cwogICAgICAgICAgLi5hZGQobnVsbCkKICAgICAgICAgIC4ucmVtb3ZlTGFzdCgpKSAhPQogICAgICAgIG51bGwpOwogICAgc2V0UGFyZW50cyhzdGF0ZW1lbnRzLCB0aGlzKTsKICB9CgogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpID0+IHYudmlzaXRCbG9jayh0aGlzKTsKICBhY2NlcHQxKFN0YXRlbWVudFZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdEJsb2NrKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3Qoc3RhdGVtZW50cywgdik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KHN0YXRlbWVudHMsIHYsIHRoaXMpOwogIH0KCiAgdm9pZCBhZGRTdGF0ZW1lbnQoU3RhdGVtZW50IG5vZGUpIHsKICAgIHN0YXRlbWVudHMuYWRkKG5vZGUpOwogICAgbm9kZS5wYXJlbnQgPSB0aGlzOwogIH0KfQoKLy8vIEEgYmxvY2sgdGhhdCBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gYXNzZXJ0cyBhcmUgZW5hYmxlZC4KLy8vCi8vLyBTb21ldGltZXMgYXJiaXRyYXJ5IHN0YXRlbWVudHMgbXVzdCBiZSBndWFyZGVkIGJ5IHdoZXRoZXIgYXNzZXJ0cyBhcmUKLy8vIGVuYWJsZWQuICBGb3IgZXhhbXBsZSwgd2hlbiBhIHN1YmV4cHJlc3Npb24gb2YgYW4gYXNzZXJ0IGluIGFzeW5jIGNvZGUgaXMKLy8vIGxpbmVhcml6ZWQgYW5kIG5hbWVkLCBpdCBjYW4gcHJvZHVjZSBzdWNoIGEgYmxvY2sgb2Ygc3RhdGVtZW50cy4KY2xhc3MgQXNzZXJ0QmxvY2sgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIGZpbmFsIExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzOwoKICBBc3NlcnRCbG9jayh0aGlzLnN0YXRlbWVudHMpIHsKICAgIC8vIEVuc3VyZSBzdGF0ZW1lbnRzIGlzIG11dGFibGUuCiAgICBhc3NlcnQoKHN0YXRlbWVudHMKICAgICAgICAgIC4uYWRkKG51bGwpCiAgICAgICAgICAuLnJlbW92ZUxhc3QoKSkgIT0KICAgICAgICBudWxsKTsKICAgIHNldFBhcmVudHMoc3RhdGVtZW50cywgdGhpcyk7CiAgfQoKICBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2KSA9PiB2LnZpc2l0QXNzZXJ0QmxvY2sodGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRBc3NlcnRCbG9jayh0aGlzLCBhcmcpOwoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KHN0YXRlbWVudHMsIHYsIHRoaXMpOwogIH0KCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChzdGF0ZW1lbnRzLCB2KTsKICB9CgogIHZvaWQgYWRkU3RhdGVtZW50KFN0YXRlbWVudCBub2RlKSB7CiAgICBzdGF0ZW1lbnRzLmFkZChub2RlKTsKICAgIG5vZGUucGFyZW50ID0gdGhpczsKICB9Cn0KCmNsYXNzIEVtcHR5U3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2KSA9PiB2LnZpc2l0RW1wdHlTdGF0ZW1lbnQodGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRFbXB0eVN0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgpjbGFzcyBBc3NlcnRTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIEV4cHJlc3Npb24gY29uZGl0aW9uOwogIEV4cHJlc3Npb24gbWVzc2FnZTsgLy8gTWF5IGJlIG51bGwuCiAgaW50IGNvbmRpdGlvblN0YXJ0T2Zmc2V0OwogIGludCBjb25kaXRpb25FbmRPZmZzZXQ7CgogIEFzc2VydFN0YXRlbWVudCh0aGlzLmNvbmRpdGlvbiwKICAgICAge3RoaXMubWVzc2FnZSwgdGhpcy5jb25kaXRpb25TdGFydE9mZnNldCwgdGhpcy5jb25kaXRpb25FbmRPZmZzZXR9KSB7CiAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICBtZXNzYWdlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdikgPT4gdi52aXNpdEFzc2VydFN0YXRlbWVudCh0aGlzKTsKICBhY2NlcHQxKFN0YXRlbWVudFZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdEFzc2VydFN0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgY29uZGl0aW9uPy5hY2NlcHQodik7CiAgICBtZXNzYWdlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFjY2VwdCh2KTsKICAgICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewogICAgICBtZXNzYWdlID0gbWVzc2FnZS5hY2NlcHQodik7CiAgICAgIG1lc3NhZ2U/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQSB0YXJnZXQgb2YgYSBbQnJlYWtdIHN0YXRlbWVudC4KLy8vCi8vLyBUaGUgbGFiZWwgaXRzZWxmIGhhcyBubyBuYW1lOyBicmVha3MgcmVmZXJlbmNlIHRoZSBzdGF0ZW1lbnQgZGlyZWN0bHkuCi8vLwovLy8gVGhlIGZyb250ZW5kIGRvZXMgbm90IGdlbmVyYXRlIGxhYmVsZWQgc3RhdGVtZW50cyB3aXRob3V0IHVzZXMuCmNsYXNzIExhYmVsZWRTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIFN0YXRlbWVudCBib2R5OwoKICBMYWJlbGVkU3RhdGVtZW50KHRoaXMuYm9keSkgewogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICB9CgogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpID0+IHYudmlzaXRMYWJlbGVkU3RhdGVtZW50KHRoaXMpOwogIGFjY2VwdDEoU3RhdGVtZW50VmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0TGFiZWxlZFN0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgYm9keT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICBib2R5ID0gYm9keS5hY2NlcHQodik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQnJlYWtzIG91dCBvZiBhbiBlbmNsb3NpbmcgW0xhYmVsZWRTdGF0ZW1lbnRdLgovLy8KLy8vIEJvdGggYGJyZWFrYCBhbmQgbG9vcCBgY29udGludWVgIHN0YXRlbWVudHMgYXJlIHRyYW5zbGF0ZWQgaW50byB0aGlzIG5vZGUuCi8vLwovLy8gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgbG9vcCB3aXRoIGEgYGNvbnRpbnVlYCB3aWxsIGJlIGRlc3VnYXJlZDoKLy8vCi8vLyAgICAgd2hpbGUoeCkgewovLy8gICAgICAgaWYgKHkpIGNvbnRpbnVlOwovLy8gICAgICAgQk9EWScKLy8vICAgICB9Ci8vLwovLy8gICAgID09PgovLy8KLy8vICAgICB3aGlsZSh4KSB7Ci8vLyAgICAgICBMOiB7Ci8vLyAgICAgICAgIGlmICh5KSBicmVhayBMOwovLy8gICAgICAgICBCT0RZJwovLy8gICAgICAgfQovLy8gICAgIH0KLy8KY2xhc3MgQnJlYWtTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIExhYmVsZWRTdGF0ZW1lbnQgdGFyZ2V0OwoKICBCcmVha1N0YXRlbWVudCh0aGlzLnRhcmdldCk7CgogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpID0+IHYudmlzaXRCcmVha1N0YXRlbWVudCh0aGlzKTsKICBhY2NlcHQxKFN0YXRlbWVudFZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdEJyZWFrU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCmNsYXNzIFdoaWxlU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBTdGF0ZW1lbnQgYm9keTsKCiAgV2hpbGVTdGF0ZW1lbnQodGhpcy5jb25kaXRpb24sIHRoaXMuYm9keSkgewogICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICB9CgogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpID0+IHYudmlzaXRXaGlsZVN0YXRlbWVudCh0aGlzKTsKICBhY2NlcHQxKFN0YXRlbWVudFZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFdoaWxlU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBjb25kaXRpb24/LmFjY2VwdCh2KTsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkgewogICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uYWNjZXB0KHYpOwogICAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdCh2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCmNsYXNzIERvU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBTdGF0ZW1lbnQgYm9keTsKICBFeHByZXNzaW9uIGNvbmRpdGlvbjsKCiAgRG9TdGF0ZW1lbnQodGhpcy5ib2R5LCB0aGlzLmNvbmRpdGlvbikgewogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICB9CgogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpID0+IHYudmlzaXREb1N0YXRlbWVudCh0aGlzKTsKICBhY2NlcHQxKFN0YXRlbWVudFZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdERvU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBib2R5Py5hY2NlcHQodik7CiAgICBjb25kaXRpb24/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5hY2NlcHQodik7CiAgICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCmNsYXNzIEZvclN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXM7IC8vIE1heSBiZSBlbXB0eSwgYnV0IG5vdCBudWxsLgogIEV4cHJlc3Npb24gY29uZGl0aW9uOyAvLyBNYXkgYmUgbnVsbC4KICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZXM7IC8vIE1heSBiZSBlbXB0eSwgYnV0IG5vdCBudWxsLgogIFN0YXRlbWVudCBib2R5OwoKICBGb3JTdGF0ZW1lbnQodGhpcy52YXJpYWJsZXMsIHRoaXMuY29uZGl0aW9uLCB0aGlzLnVwZGF0ZXMsIHRoaXMuYm9keSkgewogICAgc2V0UGFyZW50cyh2YXJpYWJsZXMsIHRoaXMpOwogICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgc2V0UGFyZW50cyh1cGRhdGVzLCB0aGlzKTsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2KSA9PiB2LnZpc2l0Rm9yU3RhdGVtZW50KHRoaXMpOwogIGFjY2VwdDEoU3RhdGVtZW50VmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0Rm9yU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QodmFyaWFibGVzLCB2KTsKICAgIGNvbmRpdGlvbj8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KHVwZGF0ZXMsIHYpOwogICAgYm9keT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdCh2YXJpYWJsZXMsIHYsIHRoaXMpOwogICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5hY2NlcHQodik7CiAgICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHRyYW5zZm9ybUxpc3QodXBkYXRlcywgdiwgdGhpcyk7CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdCh2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCmNsYXNzIEZvckluU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICAvLy8gT2Zmc2V0IGluIHRoZSBzb3VyY2UgZmlsZSBpdCBjb21lcyBmcm9tLgogIC8vLwogIC8vLyBWYWxpZCB2YWx1ZXMgYXJlIGZyb20gMCBhbmQgdXAsIG9yIC0xIChbVHJlZU5vZGUubm9PZmZzZXRdKSBpZiB0aGUgZmlsZQogIC8vLyBvZmZzZXQgaXMgbm90IGF2YWlsYWJsZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBpZiBub25lIGlzIHNwZWNpZmljYWxseSBzZXQpLgogIGludCBib2R5T2Zmc2V0ID0gVHJlZU5vZGUubm9PZmZzZXQ7CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGU7IC8vIEhhcyBubyBpbml0aWFsaXplci4KICBFeHByZXNzaW9uIGl0ZXJhYmxlOwogIFN0YXRlbWVudCBib2R5OwogIGJvb2wgaXNBc3luYzsgLy8gVHJ1ZSBpZiB0aGlzIGlzIGFuICdhd2FpdCBmb3InIGxvb3AuCgogIEZvckluU3RhdGVtZW50KHRoaXMudmFyaWFibGUsIHRoaXMuaXRlcmFibGUsIHRoaXMuYm9keSwKICAgICAge3RoaXMuaXNBc3luYzogZmFsc2V9KSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIGl0ZXJhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICB9CgogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpID0+IHYudmlzaXRGb3JJblN0YXRlbWVudCh0aGlzKTsKICBhY2NlcHQxKFN0YXRlbWVudFZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdEZvckluU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogICAgaXRlcmFibGU/LmFjY2VwdCh2KTsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmICh2YXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIHZhcmlhYmxlID0gdmFyaWFibGUuYWNjZXB0KHYpOwogICAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChpdGVyYWJsZSAhPSBudWxsKSB7CiAgICAgIGl0ZXJhYmxlID0gaXRlcmFibGUuYWNjZXB0KHYpOwogICAgICBpdGVyYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIFN0YXRlbWVudCBvZiBmb3JtIGBzd2l0Y2ggKGUpIHsgY2FzZSB4OiAuLi4gfWAuCi8vLwovLy8gQWRqYWNlbnQgY2FzZSBjbGF1c2VzIGhhdmUgYmVlbiBtZXJnZWQgaW50byBhIHNpbmdsZSBbU3dpdGNoQ2FzZV0uIEEgcnVudGltZQovLy8gZXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIGlmIG9uZSBbU3dpdGNoQ2FzZV0gZmFsbHMgdGhyb3VnaCB0byBhbm90aGVyIGNhc2UuCmNsYXNzIFN3aXRjaFN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAgRXhwcmVzc2lvbiBleHByZXNzaW9uOwogIGZpbmFsIExpc3Q8U3dpdGNoQ2FzZT4gY2FzZXM7CgogIFN3aXRjaFN0YXRlbWVudCh0aGlzLmV4cHJlc3Npb24sIHRoaXMuY2FzZXMpIHsKICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgICBzZXRQYXJlbnRzKGNhc2VzLCB0aGlzKTsKICB9CgogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpID0+IHYudmlzaXRTd2l0Y2hTdGF0ZW1lbnQodGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRTd2l0Y2hTdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGV4cHJlc3Npb24/LmFjY2VwdCh2KTsKICAgIHZpc2l0TGlzdChjYXNlcywgdik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLmFjY2VwdCh2KTsKICAgICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHRyYW5zZm9ybUxpc3QoY2FzZXMsIHYsIHRoaXMpOwogIH0KfQoKLy8vIEEgZ3JvdXAgb2YgYGNhc2VgIGNsYXVzZXMgYW5kL29yIGEgYGRlZmF1bHRgIGNsYXVzZS4KLy8vCi8vLyBUaGlzIGlzIGEgcG90ZW50aWFsIHRhcmdldCBvZiBbQ29udGludWVTd2l0Y2hTdGF0ZW1lbnRdLgpjbGFzcyBTd2l0Y2hDYXNlIGV4dGVuZHMgVHJlZU5vZGUgewogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnM7CiAgZmluYWwgTGlzdDxpbnQ+IGV4cHJlc3Npb25PZmZzZXRzOwogIFN0YXRlbWVudCBib2R5OwogIGJvb2wgaXNEZWZhdWx0OwoKICBTd2l0Y2hDYXNlKHRoaXMuZXhwcmVzc2lvbnMsIHRoaXMuZXhwcmVzc2lvbk9mZnNldHMsIHRoaXMuYm9keSwKICAgICAge3RoaXMuaXNEZWZhdWx0OiBmYWxzZX0pIHsKICAgIHNldFBhcmVudHMoZXhwcmVzc2lvbnMsIHRoaXMpOwogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICB9CgogIFN3aXRjaENhc2UuZGVmYXVsdENhc2UodGhpcy5ib2R5KQogICAgICA6IGlzRGVmYXVsdCA9IHRydWUsCiAgICAgICAgZXhwcmVzc2lvbnMgPSA8RXhwcmVzc2lvbj5bXSwKICAgICAgICBleHByZXNzaW9uT2Zmc2V0cyA9IDxpbnQ+W10gewogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICB9CgogIFN3aXRjaENhc2UuZW1wdHkoKQogICAgICA6IGV4cHJlc3Npb25zID0gPEV4cHJlc3Npb24+W10sCiAgICAgICAgZXhwcmVzc2lvbk9mZnNldHMgPSA8aW50PltdLAogICAgICAgIGJvZHkgPSBudWxsLAogICAgICAgIGlzRGVmYXVsdCA9IGZhbHNlOwoKICBhY2NlcHQoVHJlZVZpc2l0b3IgdikgPT4gdi52aXNpdFN3aXRjaENhc2UodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QoZXhwcmVzc2lvbnMsIHYpOwogICAgYm9keT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChleHByZXNzaW9ucywgdiwgdGhpcyk7CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdCh2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBKdW1wIHRvIGEgY2FzZSBpbiBhbiBlbmNsb3Npbmcgc3dpdGNoLgpjbGFzcyBDb250aW51ZVN3aXRjaFN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAgU3dpdGNoQ2FzZSB0YXJnZXQ7CgogIENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KHRoaXMudGFyZ2V0KTsKCiAgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdikgPT4gdi52aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KHRoaXMpOwogIGFjY2VwdDEoU3RhdGVtZW50VmlzaXRvcjEgdiwgYXJnKSA9PgogICAgICB2LnZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikge30KfQoKY2xhc3MgSWZTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIEV4cHJlc3Npb24gY29uZGl0aW9uOwogIFN0YXRlbWVudCB0aGVuOwogIFN0YXRlbWVudCBvdGhlcndpc2U7CgogIElmU3RhdGVtZW50KHRoaXMuY29uZGl0aW9uLCB0aGlzLnRoZW4sIHRoaXMub3RoZXJ3aXNlKSB7CiAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICB0aGVuPy5wYXJlbnQgPSB0aGlzOwogICAgb3RoZXJ3aXNlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdikgPT4gdi52aXNpdElmU3RhdGVtZW50KHRoaXMpOwogIGFjY2VwdDEoU3RhdGVtZW50VmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0SWZTdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGNvbmRpdGlvbj8uYWNjZXB0KHYpOwogICAgdGhlbj8uYWNjZXB0KHYpOwogICAgb3RoZXJ3aXNlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFjY2VwdCh2KTsKICAgICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHRoZW4gIT0gbnVsbCkgewogICAgICB0aGVuID0gdGhlbi5hY2NlcHQodik7CiAgICAgIHRoZW4/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAob3RoZXJ3aXNlICE9IG51bGwpIHsKICAgICAgb3RoZXJ3aXNlID0gb3RoZXJ3aXNlLmFjY2VwdCh2KTsKICAgICAgb3RoZXJ3aXNlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKQGNvcQpjbGFzcyBSZXR1cm5TdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsgLy8gTWF5IGJlIG51bGwuCgogIFJldHVyblN0YXRlbWVudChbdGhpcy5leHByZXNzaW9uXSkgewogICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICB9CgogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpID0+IHYudmlzaXRSZXR1cm5TdGF0ZW1lbnQodGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRSZXR1cm5TdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGV4cHJlc3Npb24/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uYWNjZXB0KHYpOwogICAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKY2xhc3MgVHJ5Q2F0Y2ggZXh0ZW5kcyBTdGF0ZW1lbnQgewogIFN0YXRlbWVudCBib2R5OwogIExpc3Q8Q2F0Y2g+IGNhdGNoZXM7CiAgYm9vbCBpc1N5bnRoZXRpYzsKCiAgVHJ5Q2F0Y2godGhpcy5ib2R5LCB0aGlzLmNhdGNoZXMsIHt0aGlzLmlzU3ludGhldGljOiBmYWxzZX0pIHsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICBzZXRQYXJlbnRzKGNhdGNoZXMsIHRoaXMpOwogIH0KCiAgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdikgPT4gdi52aXNpdFRyeUNhdGNoKHRoaXMpOwogIGFjY2VwdDEoU3RhdGVtZW50VmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0VHJ5Q2F0Y2godGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICAgIHZpc2l0TGlzdChjYXRjaGVzLCB2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgdHJhbnNmb3JtTGlzdChjYXRjaGVzLCB2LCB0aGlzKTsKICB9Cn0KCmNsYXNzIENhdGNoIGV4dGVuZHMgVHJlZU5vZGUgewogIERhcnRUeXBlIGd1YXJkOyAvLyBOb3QgbnVsbCwgZGVmYXVsdHMgdG8gZHluYW1pYy4KICBWYXJpYWJsZURlY2xhcmF0aW9uIGV4Y2VwdGlvbjsgLy8gTWF5IGJlIG51bGwuCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBzdGFja1RyYWNlOyAvLyBNYXkgYmUgbnVsbC4KICBTdGF0ZW1lbnQgYm9keTsKCiAgQ2F0Y2godGhpcy5leGNlcHRpb24sIHRoaXMuYm9keSwKICAgICAge3RoaXMuZ3VhcmQ6IGNvbnN0IER5bmFtaWNUeXBlKCksIHRoaXMuc3RhY2tUcmFjZX0pIHsKICAgIGFzc2VydChndWFyZCAhPSBudWxsKTsKICAgIGV4Y2VwdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIHN0YWNrVHJhY2U/LnBhcmVudCA9IHRoaXM7CiAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogIH0KCiAgYWNjZXB0KFRyZWVWaXNpdG9yIHYpID0+IHYudmlzaXRDYXRjaCh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGd1YXJkPy5hY2NlcHQodik7CiAgICBleGNlcHRpb24/LmFjY2VwdCh2KTsKICAgIHN0YWNrVHJhY2U/LmFjY2VwdCh2KTsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGd1YXJkID0gdi52aXNpdERhcnRUeXBlKGd1YXJkKTsKICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkgewogICAgICBleGNlcHRpb24gPSBleGNlcHRpb24uYWNjZXB0KHYpOwogICAgICBleGNlcHRpb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoc3RhY2tUcmFjZSAhPSBudWxsKSB7CiAgICAgIHN0YWNrVHJhY2UgPSBzdGFja1RyYWNlLmFjY2VwdCh2KTsKICAgICAgc3RhY2tUcmFjZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKY2xhc3MgVHJ5RmluYWxseSBleHRlbmRzIFN0YXRlbWVudCB7CiAgU3RhdGVtZW50IGJvZHk7CiAgU3RhdGVtZW50IGZpbmFsaXplcjsKCiAgVHJ5RmluYWxseSh0aGlzLmJvZHksIHRoaXMuZmluYWxpemVyKSB7CiAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgZmluYWxpemVyPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdikgPT4gdi52aXNpdFRyeUZpbmFsbHkodGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRUcnlGaW5hbGx5KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBib2R5Py5hY2NlcHQodik7CiAgICBmaW5hbGl6ZXI/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGZpbmFsaXplciAhPSBudWxsKSB7CiAgICAgIGZpbmFsaXplciA9IGZpbmFsaXplci5hY2NlcHQodik7CiAgICAgIGZpbmFsaXplcj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBTdGF0ZW1lbnQgb2YgZm9ybSBgeWllbGQgeGAgb3IgYHlpZWxkKiB4YC4KLy8vCi8vLyBGb3IgbmF0aXZlIHlpZWxkIHNlbWFudGljcyBzZWUgYEFzeW5jTWFya2VyLlN5bmNZaWVsZGluZ2AuCmNsYXNzIFlpZWxkU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBFeHByZXNzaW9uIGV4cHJlc3Npb247CiAgaW50IGZsYWdzID0gMDsKCiAgWWllbGRTdGF0ZW1lbnQodGhpcy5leHByZXNzaW9uLAogICAgICB7Ym9vbCBpc1lpZWxkU3RhcjogZmFsc2UsIGJvb2wgaXNOYXRpdmU6IGZhbHNlfSkgewogICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIHRoaXMuaXNZaWVsZFN0YXIgPSBpc1lpZWxkU3RhcjsKICAgIHRoaXMuaXNOYXRpdmUgPSBpc05hdGl2ZTsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ1lpZWxkU3RhciA9IDEgPDwgMDsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdOYXRpdmUgPSAxIDw8IDE7CgogIGJvb2wgZ2V0IGlzWWllbGRTdGFyID0+IGZsYWdzICYgRmxhZ1lpZWxkU3RhciAhPSAwOwogIGJvb2wgZ2V0IGlzTmF0aXZlID0+IGZsYWdzICYgRmxhZ05hdGl2ZSAhPSAwOwoKICB2b2lkIHNldCBpc1lpZWxkU3Rhcihib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ1lpZWxkU3RhcikgOiAoZmxhZ3MgJiB+RmxhZ1lpZWxkU3Rhcik7CiAgfQoKICB2b2lkIHNldCBpc05hdGl2ZShib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ05hdGl2ZSkgOiAoZmxhZ3MgJiB+RmxhZ05hdGl2ZSk7CiAgfQoKICBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2KSA9PiB2LnZpc2l0WWllbGRTdGF0ZW1lbnQodGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRZaWVsZFN0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgZXhwcmVzc2lvbj8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgewogICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5hY2NlcHQodik7CiAgICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gRGVjbGFyYXRpb24gb2YgYSBsb2NhbCB2YXJpYWJsZS4KLy8vCi8vLyBUaGlzIG1heSBvY2N1ciBhcyBhIHN0YXRlbWVudCwgYnV0IGlzIGFsc28gdXNlZCBpbiBzZXZlcmFsIG5vbi1zdGF0ZW1lbnQKLy8vIGNvbnRleHRzLCBzdWNoIGFzIGluIFtGb3JTdGF0ZW1lbnRdLCBbQ2F0Y2hdLCBhbmQgW0Z1bmN0aW9uTm9kZV0uCi8vLwovLy8gV2hlbiB0aGlzIG9jY3VycyBhcyBhIHN0YXRlbWVudCwgaXQgbXVzdCBiZSBhIGRpcmVjdCBjaGlsZCBvZiBhIFtCbG9ja10uCi8vCi8vIERFU0lHTiBUT0RPOiBTaG91bGQgd2UgcmVtb3ZlIHRoZSAnZmluYWwnIG1vZGlmaWVyIGZyb20gdmFyaWFibGVzPwpAY29xcmVmCmNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBTdGF0ZW1lbnQgewogIC8vLyBPZmZzZXQgb2YgdGhlIGVxdWFscyBzaWduIGluIHRoZSBzb3VyY2UgZmlsZSBpdCBjb21lcyBmcm9tLgogIC8vLwogIC8vLyBWYWxpZCB2YWx1ZXMgYXJlIGZyb20gMCBhbmQgdXAsIG9yIC0xIChbVHJlZU5vZGUubm9PZmZzZXRdKQogIC8vLyBpZiB0aGUgZXF1YWxzIHNpZ24gb2Zmc2V0IGlzIG5vdCBhdmFpbGFibGUgKGUuZy4gaWYgbm90IGluaXRpYWxpemVkKQogIC8vLyAodGhpcyBpcyB0aGUgZGVmYXVsdCBpZiBub25lIGlzIHNwZWNpZmljYWxseSBzZXQpLgogIGludCBmaWxlRXF1YWxzT2Zmc2V0ID0gVHJlZU5vZGUubm9PZmZzZXQ7CgogIC8vLyBMaXN0IG9mIG1ldGFkYXRhIGFubm90YXRpb25zIG9uIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KICAvLy8KICAvLy8gVGhpcyBkZWZhdWx0cyB0byBhbiBpbW11dGFibGUgZW1wdHkgbGlzdC4gVXNlIFthZGRBbm5vdGF0aW9uXSB0byBhZGQKICAvLy8gYW5ub3RhdGlvbnMgaWYgbmVlZGVkLgogIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSBjb25zdCA8RXhwcmVzc2lvbj5bXTsKCiAgLy8vIEZvciBuYW1lZCBwYXJhbWV0ZXJzLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuIE5vIHR3byBuYW1lZAogIC8vLyBwYXJhbWV0ZXJzIChpbiB0aGUgc2FtZSBwYXJhbWV0ZXIgbGlzdCkgY2FuIGhhdmUgdGhlIHNhbWUgbmFtZS4KICAvLy8KICAvLy8gSW4gYWxsIG90aGVyIGNhc2VzLCB0aGUgbmFtZSBpcyBjb3NtZXRpYywgbWF5IGJlIGVtcHR5IG9yIG51bGwsCiAgLy8vIGFuZCBpcyBub3QgbmVjZXNzYXJpbHkgdW5pcXVlLgogIFN0cmluZyBuYW1lOwogIGludCBmbGFncyA9IDA7CiAgRGFydFR5cGUgdHlwZTsgLy8gTm90IG51bGwsIGRlZmF1bHRzIHRvIGR5bmFtaWMuCgogIC8vLyBPZmZzZXQgb2YgdGhlIGRlY2xhcmF0aW9uLCBzZXQgYW5kIHVzZWQgd2hlbiB3cml0aW5nIHRoZSBiaW5hcnkuCiAgaW50IGJpbmFyeU9mZnNldE5vVGFnID0gLTE7CgogIC8vLyBGb3IgbG9jYWxzLCB0aGlzIGlzIHRoZSBpbml0aWFsIHZhbHVlLgogIC8vLyBGb3IgcGFyYW1ldGVycywgdGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KICAvLy8KICAvLy8gU2hvdWxkIGJlIG51bGwgaW4gb3RoZXIgY2FzZXMuCiAgQGNvcW9wdAogIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXI7IC8vIE1heSBiZSBudWxsLgoKICBWYXJpYWJsZURlY2xhcmF0aW9uKHRoaXMubmFtZSwKICAgICAge3RoaXMuaW5pdGlhbGl6ZXIsCiAgICAgIHRoaXMudHlwZTogY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgaW50IGZsYWdzOiAtMSwKICAgICAgYm9vbCBpc0ZpbmFsOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvbnN0OiBmYWxzZSwKICAgICAgYm9vbCBpc0ZpZWxkRm9ybWFsOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvdmFyaWFudDogZmFsc2V9KSB7CiAgICBhc3NlcnQodHlwZSAhPSBudWxsKTsKICAgIGluaXRpYWxpemVyPy5wYXJlbnQgPSB0aGlzOwogICAgaWYgKGZsYWdzICE9IC0xKSB7CiAgICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaXNGaW5hbCA9IGlzRmluYWw7CiAgICAgIHRoaXMuaXNDb25zdCA9IGlzQ29uc3Q7CiAgICAgIHRoaXMuaXNGaWVsZEZvcm1hbCA9IGlzRmllbGRGb3JtYWw7CiAgICAgIHRoaXMuaXNDb3ZhcmlhbnQgPSBpc0NvdmFyaWFudDsKICAgIH0KICB9CgogIC8vLyBDcmVhdGVzIGEgc3ludGhldGljIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIGV4cHJlc3Npb24gYXMgaW5pdGlhbGl6ZXIuCiAgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZSh0aGlzLmluaXRpYWxpemVyLAogICAgICB7Ym9vbCBpc0ZpbmFsOiB0cnVlLAogICAgICBib29sIGlzQ29uc3Q6IGZhbHNlLAogICAgICBib29sIGlzRmllbGRGb3JtYWw6IGZhbHNlLAogICAgICB0aGlzLnR5cGU6IGNvbnN0IER5bmFtaWNUeXBlKCl9KSB7CiAgICBhc3NlcnQodHlwZSAhPSBudWxsKTsKICAgIGluaXRpYWxpemVyPy5wYXJlbnQgPSB0aGlzOwogICAgdGhpcy5pc0ZpbmFsID0gaXNGaW5hbDsKICAgIHRoaXMuaXNDb25zdCA9IGlzQ29uc3Q7CiAgICB0aGlzLmlzRmllbGRGb3JtYWwgPSBpc0ZpZWxkRm9ybWFsOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBGbGFnRmluYWwgPSAxIDw8IDA7IC8vIE11c3QgbWF0Y2ggc2VyaWFsaXplZCBiaXQgcG9zaXRpb25zLgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0NvbnN0ID0gMSA8PCAxOwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0ZpZWxkRm9ybWFsID0gMSA8PCAyOwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0NvdmFyaWFudCA9IDEgPDwgMzsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdJblNjb3BlID0gMSA8PCA0OyAvLyBUZW1wb3JhcnkgZmxhZyB1c2VkIGJ5IHZlcmlmaWVyLgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gMSA8PCA1OwoKICBib29sIGdldCBpc0ZpbmFsID0+IGZsYWdzICYgRmxhZ0ZpbmFsICE9IDA7CiAgYm9vbCBnZXQgaXNDb25zdCA9PiBmbGFncyAmIEZsYWdDb25zdCAhPSAwOwoKICAvLy8gV2hldGhlciB0aGUgcGFyYW1ldGVyIGlzIGRlY2xhcmVkIHdpdGggdGhlIGBjb3ZhcmlhbnRgIGtleXdvcmQuCiAgYm9vbCBnZXQgaXNDb3ZhcmlhbnQgPT4gZmxhZ3MgJiBGbGFnQ292YXJpYW50ICE9IDA7CgogIC8vLyBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBkZWNsYXJlZCBhcyBhIGZpZWxkIGZvcm1hbCBwYXJhbWV0ZXIgb2YKICAvLy8gYSBjb25zdHJ1Y3Rvci4KICBAaW5mb3JtYXRpdmUKICBib29sIGdldCBpc0ZpZWxkRm9ybWFsID0+IGZsYWdzICYgRmxhZ0ZpZWxkRm9ybWFsICE9IDA7CgogIC8vLyBJZiB0aGlzIFtWYXJpYWJsZURlY2xhcmF0aW9uXSBpcyBhIHBhcmFtZXRlciBvZiBhIG1ldGhvZCwgaW5kaWNhdGVzCiAgLy8vIHdoZXRoZXIgdGhlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBjb250YWluIGEgcnVudGltZSB0eXBlIGNoZWNrIHRvCiAgLy8vIGRlYWwgd2l0aCBnZW5lcmljIGNvdmFyaWFuY2UuCiAgLy8vCiAgLy8vIFdoZW4gYHRydWVgLCBydW50aW1lIGNoZWNrcyBtYXkgbmVlZCB0byBiZSBwZXJmb3JtZWQ7IHNlZQogIC8vLyBbRGlzcGF0Y2hDYXRlZ29yeV0gZm9yIGRldGFpbHMuCiAgYm9vbCBnZXQgaXNHZW5lcmljQ292YXJpYW50SW1wbCA9PiBmbGFncyAmIEZsYWdHZW5lcmljQ292YXJpYW50SW1wbCAhPSAwOwoKICB2b2lkIHNldCBpc0ZpbmFsKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnRmluYWwpIDogKGZsYWdzICYgfkZsYWdGaW5hbCk7CiAgfQoKICB2b2lkIHNldCBpc0NvbnN0KGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnQ29uc3QpIDogKGZsYWdzICYgfkZsYWdDb25zdCk7CiAgfQoKICB2b2lkIHNldCBpc0NvdmFyaWFudChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0NvdmFyaWFudCkgOiAoZmxhZ3MgJiB+RmxhZ0NvdmFyaWFudCk7CiAgfQoKICBAaW5mb3JtYXRpdmUKICB2b2lkIHNldCBpc0ZpZWxkRm9ybWFsKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnRmllbGRGb3JtYWwpIDogKGZsYWdzICYgfkZsYWdGaWVsZEZvcm1hbCk7CiAgfQoKICB2b2lkIHNldCBpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IEZsYWdHZW5lcmljQ292YXJpYW50SW1wbCkKICAgICAgICA6IChmbGFncyAmIH5GbGFnR2VuZXJpY0NvdmFyaWFudEltcGwpOwogIH0KCiAgdm9pZCBhZGRBbm5vdGF0aW9uKEV4cHJlc3Npb24gYW5ub3RhdGlvbikgewogICAgaWYgKGFubm90YXRpb25zLmlzRW1wdHkpIHsKICAgICAgYW5ub3RhdGlvbnMgPSA8RXhwcmVzc2lvbj5bXTsKICAgIH0KICAgIGFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uLi5wYXJlbnQgPSB0aGlzKTsKICB9CgogIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHYpID0+IHYudmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKHRoaXMpOwogIGFjY2VwdDEoU3RhdGVtZW50VmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmlzaXRMaXN0KGFubm90YXRpb25zLCB2KTsKICAgIHR5cGU/LmFjY2VwdCh2KTsKICAgIGluaXRpYWxpemVyPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KGFubm90YXRpb25zLCB2LCB0aGlzKTsKICAgIHR5cGUgPSB2LnZpc2l0RGFydFR5cGUodHlwZSk7CiAgICBpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICBpbml0aWFsaXplciA9IGluaXRpYWxpemVyLmFjY2VwdCh2KTsKICAgICAgaW5pdGlhbGl6ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyBhIHBvc3NpYmx5IHN5bnRoZXNpemVkIG5hbWUgZm9yIHRoaXMgdmFyaWFibGUsIGNvbnNpc3RlbnQgd2l0aAogIC8vLyB0aGUgbmFtZXMgdXNlZCBhY3Jvc3MgYWxsIFt0b1N0cmluZ10gY2FsbHMuCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gZGVidWdWYXJpYWJsZURlY2xhcmF0aW9uTmFtZSh0aGlzKTsKfQoKLy8vIERlY2xhcmF0aW9uIGEgbG9jYWwgZnVuY3Rpb24uCi8vLwovLy8gVGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uIG1heSB1c2UgW3ZhcmlhYmxlXSBhcyBpdHMgc2VsZi1yZWZlcmVuY2UuCmNsYXNzIEZ1bmN0aW9uRGVjbGFyYXRpb24gZXh0ZW5kcyBTdGF0ZW1lbnQgaW1wbGVtZW50cyBMb2NhbEZ1bmN0aW9uIHsKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOyAvLyBJcyBmaW5hbCBhbmQgaGFzIG5vIGluaXRpYWxpemVyLgogIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbjsKCiAgRnVuY3Rpb25EZWNsYXJhdGlvbih0aGlzLnZhcmlhYmxlLCB0aGlzLmZ1bmN0aW9uKSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIGZ1bmN0aW9uPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdikgPT4gdi52aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24odGhpcyk7CiAgYWNjZXB0MShTdGF0ZW1lbnRWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogICAgZnVuY3Rpb24/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmICh2YXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIHZhcmlhYmxlID0gdmFyaWFibGUuYWNjZXB0KHYpOwogICAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChmdW5jdGlvbiAhPSBudWxsKSB7CiAgICAgIGZ1bmN0aW9uID0gZnVuY3Rpb24uYWNjZXB0KHYpOwogICAgICBmdW5jdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFNRVMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy8gQSBwdWJsaWMgbmFtZSwgb3IgYSBwcml2YXRlIG5hbWUgcXVhbGlmaWVkIGJ5IGEgbGlicmFyeS4KLy8vCi8vLyBOYW1lcyBhcmUgb25seSB1c2VkIGZvciBleHByZXNzaW9ucyB3aXRoIGR5bmFtaWMgZGlzcGF0Y2gsIGFzIGFsbAovLy8gc3RhdGljYWxseSByZXNvbHZlZCByZWZlcmVuY2VzIGFyZSByZXByZXNlbnRlZCBpbiBuYW1lbGVzcyBmb3JtLgovLy8KLy8vIFtOYW1lXXMgYXJlIGltbXV0YWJsZSBhbmQgY29tcGFyZSBiYXNlZCBvbiBzdHJ1Y3R1cmFsIGVxdWFsaXR5LCBhbmQgdGhleQovLy8gYXJlIG5vdCBBU1Qgbm9kZXMuCi8vLwovLy8gVGhlIFt0b1N0cmluZ10gbWV0aG9kIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgdGhhdCBpbmNsdWRlcyB0aGUKLy8vIGxpYnJhcnkgbmFtZSBmb3IgcHJpdmF0ZSBuYW1lczsgdW5pcXVlbmVzcyBpcyBub3QgZ3VhcmFudGVlZC4KQGNvcQphYnN0cmFjdCBjbGFzcyBOYW1lIGltcGxlbWVudHMgTm9kZSB7CiAgZmluYWwgaW50IGhhc2hDb2RlOwogIEBjb3EKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBAbm9jb3EKICBSZWZlcmVuY2UgZ2V0IGxpYnJhcnlOYW1lOwogIEBub2NvcQogIExpYnJhcnkgZ2V0IGxpYnJhcnk7CiAgYm9vbCBnZXQgaXNQcml2YXRlOwoKICBOYW1lLl9pbnRlcm5hbCh0aGlzLmhhc2hDb2RlLCB0aGlzLm5hbWUpOwoKICBmYWN0b3J5IE5hbWUoU3RyaW5nIG5hbWUsIFtMaWJyYXJ5IGxpYnJhcnldKSA9PgogICAgICBuZXcgTmFtZS5ieVJlZmVyZW5jZShuYW1lLCBsaWJyYXJ5Py5yZWZlcmVuY2UpOwoKICBmYWN0b3J5IE5hbWUuYnlSZWZlcmVuY2UoU3RyaW5nIG5hbWUsIFJlZmVyZW5jZSBsaWJyYXJ5TmFtZSkgewogICAgLy8vIFVzZSBzZXBhcmF0ZSBzdWJjbGFzc2VzIGZvciB0aGUgcHVibGljIGFuZCBwcml2YXRlIGNhc2UgdG8gc2F2ZSBtZW1vcnkKICAgIC8vLyBmb3IgcHVibGljIG5hbWVzLgogICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnXycpKSB7CiAgICAgIGFzc2VydChsaWJyYXJ5TmFtZSAhPSBudWxsKTsKICAgICAgcmV0dXJuIG5ldyBfUHJpdmF0ZU5hbWUobmFtZSwgbGlicmFyeU5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBfUHVibGljTmFtZShuYW1lKTsKICAgIH0KICB9CgogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIHJldHVybiBvdGhlciBpcyBOYW1lICYmIG5hbWUgPT0gb3RoZXIubmFtZSAmJiBsaWJyYXJ5ID09IG90aGVyLmxpYnJhcnk7CiAgfQoKICBhY2NlcHQoVmlzaXRvciB2KSA9PiB2LnZpc2l0TmFtZSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIC8vIERFU0lHTiBUT0RPOiBTaG91bGQgd2UgdmlzaXQgdGhlIGxpYnJhcnkgYXMgYSBsaWJyYXJ5IHJlZmVyZW5jZT8KICB9Cn0KCmNsYXNzIF9Qcml2YXRlTmFtZSBleHRlbmRzIE5hbWUgewogIGZpbmFsIFJlZmVyZW5jZSBsaWJyYXJ5TmFtZTsKICBib29sIGdldCBpc1ByaXZhdGUgPT4gdHJ1ZTsKCiAgX1ByaXZhdGVOYW1lKFN0cmluZyBuYW1lLCBSZWZlcmVuY2UgbGlicmFyeU5hbWUpCiAgICAgIDogdGhpcy5saWJyYXJ5TmFtZSA9IGxpYnJhcnlOYW1lLAogICAgICAgIHN1cGVyLl9pbnRlcm5hbChfY29tcHV0ZUhhc2hDb2RlKG5hbWUsIGxpYnJhcnlOYW1lKSwgbmFtZSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+IGxpYnJhcnkgIT0gbnVsbCA/ICckbGlicmFyeTo6JG5hbWUnIDogbmFtZTsKCiAgTGlicmFyeSBnZXQgbGlicmFyeSA9PiBsaWJyYXJ5TmFtZS5hc0xpYnJhcnk7CgogIHN0YXRpYyBpbnQgX2NvbXB1dGVIYXNoQ29kZShTdHJpbmcgbmFtZSwgUmVmZXJlbmNlIGxpYnJhcnlOYW1lKSB7CiAgICAvLyBUT0RPKGRtaXRyeWFzKTogRmFjdG9yIGluIFtsaWJyYXJ5TmFtZV0gaW4gYSBub24tZGV0ZXJtaW5pc3RpYyB3YXkgaW50bwogICAgLy8gdGhlIHJlc3VsdC4gIE5vdGUsIHRoZSBwcmV2aW91cyBjb2RlIGhlcmUgd2FzIHRoZSBmb2xsb3dpbmc6CiAgICAvLyAgICAgcmV0dXJuIDEzMSAqIG5hbWUuaGFzaENvZGUgKyAxNyAqIGxpYnJhcnlOYW1lLmFzTGlicmFyeS5fbGlicmFyeUlkOwogICAgcmV0dXJuIG5hbWUuaGFzaENvZGU7CiAgfQp9CgpjbGFzcyBfUHVibGljTmFtZSBleHRlbmRzIE5hbWUgewogIFJlZmVyZW5jZSBnZXQgbGlicmFyeU5hbWUgPT4gbnVsbDsKICBMaWJyYXJ5IGdldCBsaWJyYXJ5ID0+IG51bGw7CiAgYm9vbCBnZXQgaXNQcml2YXRlID0+IGZhbHNlOwoKICBfUHVibGljTmFtZShTdHJpbmcgbmFtZSkgOiBzdXBlci5faW50ZXJuYWwobmFtZS5oYXNoQ29kZSwgbmFtZSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRVMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy8gUmVwcmVzZW50cyBudWxsYWJpbGl0eSBvZiBhIHR5cGUuCmVudW0gTnVsbGFiaWxpdHkgewogIC8vLyBUeXBlcyBpbiBvcHQtb3V0IGxpYnJhcmllcyBhcmUgJ2xlZ2FjeScgdHlwZXMuCiAgLy8vCiAgLy8vIFRoZXkgYXJlIGJvdGggc3VidHlwZXMgYW5kIHN1cGVydHlwZXMgb2YgdGhlIG51bGxhYmxlIGFuZCBub24tbnVsbGFibGUKICAvLy8gdmVyc2lvbnMgb2YgdGhlIHR5cGUuCiAgbGVnYWN5LAoKICAvLy8gTnVsbGFibGUgdHlwZXMgYXJlIG1hcmtlZCB3aXRoIHRoZSAnPycgbW9kaWZpZXIuCiAgLy8vCiAgLy8vIE51bGwsIGR5bmFtaWMsIGFuZCB2b2lkIGFyZSBudWxsYWJsZSBieSBkZWZhdWx0LgogIG51bGxhYmxlLAoKICAvLy8gTm9uLW51bGxhYmxlIHR5cGVzIGFyZSB0eXBlcyB0aGF0IGFyZW4ndCBtYXJrZWQgd2l0aCB0aGUgJz8nIG1vZGlmaWVyLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgTnVsbCwgZHluYW1pYywgYW5kIHZvaWQgdGhhdCBhcmUgbnVsbGFibGUgYnkgZGVmYXVsdC4gIE5vdGUgYWxzbwogIC8vLyB0aGF0IHNvbWUgdHlwZXMgZGVub3RlZCBieSBhIHR5cGUgcGFyYW1ldGVyIHdpdGhvdXQgdGhlICc/JyBtb2RpZmllciBjYW4KICAvLy8gYmUgc29tZXRoaW5nIGVsc2UgcmF0aGVyIHRoYW4gbm9uLW51bGxhYmxlLgogIG5vbk51bGxhYmxlLAoKICAvLy8gTm9uLWxlZ2FjeSB0eXBlcyB0aGF0IGFyZSBuZWl0aGVyIG51bGxhYmxlLCBub3Igbm9uLW51bGxhYmxlLgogIC8vLwogIC8vLyBBbiBleGFtcGxlIG9mIHN1Y2ggdHlwZSBpcyB0eXBlIFQgaW4gdGhlIGV4YW1wbGUgYmVsb3cuICBOb3RlIHRoYXQgYm90aAogIC8vLyBpbnQgYW5kIGludD8gY2FuIGJlIHBhc3NlZCBpbiBmb3IgVCwgc28gYW4gYXR0ZW1wdCB0byBhc3NpZ24gbnVsbCB0byB4IGlzCiAgLy8vIGEgY29tcGlsZS10aW1lIGVycm9yIGFzIHdlbGwgYXMgYXNzaWduaW5nIHggdG8geS4KICAvLy8KICAvLy8gICBjbGFzcyBBPFQgZXh0ZW5kcyBPYmplY3Q/PiB7CiAgLy8vICAgICBmb28oVCB4KSB7CiAgLy8vICAgICAgIHggPSBudWxsOyAgICAgIC8vIENvbXBpbGUtdGltZSBlcnJvci4KICAvLy8gICAgICAgT2JqZWN0IHkgPSB4OyAgLy8gQ29tcGlsZS10aW1lIGVycm9yLgogIC8vLyAgICAgfQogIC8vLyAgIH0KICBuZWl0aGVyCn0KCi8vLyBBIHN5bnRheC1pbmRlcGVuZGVudCBub3Rpb24gb2YgYSB0eXBlLgovLy8KLy8vIFtEYXJ0VHlwZV1zIGFyZSBub3QgQVNUIG5vZGVzIGFuZCBtYXkgYmUgc2hhcmVkIGJldHdlZW4gZGlmZmVyZW50IHBhcmVudHMuCi8vLwovLy8gW0RhcnRUeXBlXSBvYmplY3RzIHNob3VsZCBiZSB0cmVhdGVkIGFzIHVubW9kaWZpYWJsZSBvYmplY3RzLCBhbHRob3VnaAovLy8gaW1tdXRhYmlsaXR5IGlzIG5vdCBlbmZvcmNlZCBmb3IgTGlzdCBmaWVsZHMsIGFuZCBbVHlwZVBhcmFtZXRlcl1zIGFyZQovLy8gY3ljbGljIHN0cnVjdHVyZXMgdGhhdCBhcmUgY29uc3RydWN0ZWQgYnkgbXV0YXRpb24uCi8vLwovLy8gVGhlIGA9PWAgb3BlcmF0b3Igb24gW0RhcnRUeXBlXXMgY29tcGFyZSBiYXNlZCBvbiB0eXBlIGVxdWFsaXR5LCBub3QKLy8vIG9iamVjdCBpZGVudGl0eS4KQGNvcQphYnN0cmFjdCBjbGFzcyBEYXJ0VHlwZSBleHRlbmRzIE5vZGUgewogIGNvbnN0IERhcnRUeXBlKCk7CgogIGFjY2VwdChEYXJ0VHlwZVZpc2l0b3Igdik7CiAgYWNjZXB0MShEYXJ0VHlwZVZpc2l0b3IxIHYsIGFyZyk7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKTsKCiAgTnVsbGFiaWxpdHkgZ2V0IG51bGxhYmlsaXR5OwoKICAvLy8gSWYgdGhpcyBpcyBhIHR5cGVkZWYgdHlwZSwgcmVwZWF0ZWRseSB1bmZvbGRzIGl0cyB0eXBlIGRlZmluaXRpb24gdW50aWwKICAvLy8gdGhlIHJvb3QgdGVybSBpcyBub3QgYSB0eXBlZGVmIHR5cGUsIG90aGVyd2lzZSByZXR1cm5zIHRoZSB0eXBlIGl0c2VsZi4KICAvLy8KICAvLy8gV2lsbCBuZXZlciByZXR1cm4gYSB0eXBlZGVmIHR5cGUuCiAgRGFydFR5cGUgZ2V0IHVuYWxpYXMgPT4gdGhpczsKCiAgLy8vIElmIHRoaXMgaXMgYSB0eXBlZGVmIHR5cGUsIHVuZm9sZHMgaXRzIHR5cGUgZGVmaW5pdGlvbiBvbmNlLCBvdGhlcndpc2UKICAvLy8gcmV0dXJucyB0aGUgdHlwZSBpdHNlbGYuCiAgRGFydFR5cGUgZ2V0IHVuYWxpYXNPbmNlID0+IHRoaXM7Cn0KCi8vLyBUaGUgdHlwZSBhcmlzaW5nIGZyb20gaW52YWxpZCB0eXBlIGFubm90YXRpb25zLgovLy8KLy8vIENhbiB1c3VhbGx5IGJlIHRyZWF0ZWQgYXMgJ2R5bmFtaWMnLCBidXQgc2hvdWxkIG9jY2FzaW9uYWxseSBiZSBoYW5kbGVkCi8vLyBkaWZmZXJlbnRseSwgZS5nLiBgeCBpcyBFUlJPUmAgc2hvdWxkIGV2YWx1YXRlIHRvIGZhbHNlLgpjbGFzcyBJbnZhbGlkVHlwZSBleHRlbmRzIERhcnRUeXBlIHsKICBmaW5hbCBpbnQgaGFzaENvZGUgPSAxMjM0NTsKCiAgY29uc3QgSW52YWxpZFR5cGUoKTsKCiAgYWNjZXB0KERhcnRUeXBlVmlzaXRvciB2KSA9PiB2LnZpc2l0SW52YWxpZFR5cGUodGhpcyk7CiAgYWNjZXB0MShEYXJ0VHlwZVZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdEludmFsaWRUeXBlKHRoaXMsIGFyZyk7CiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PiBvdGhlciBpcyBJbnZhbGlkVHlwZTsKCiAgTnVsbGFiaWxpdHkgZ2V0IG51bGxhYmlsaXR5ID0+IHRocm93ICJJbnZhbGlkVHlwZSBkb2Vzbid0IGhhdmUgbnVsbGFiaWxpaXR5IjsKfQoKY2xhc3MgRHluYW1pY1R5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgZmluYWwgaW50IGhhc2hDb2RlID0gNTQzMjE7CgogIGNvbnN0IER5bmFtaWNUeXBlKCk7CgogIGFjY2VwdChEYXJ0VHlwZVZpc2l0b3IgdikgPT4gdi52aXNpdER5bmFtaWNUeXBlKHRoaXMpOwogIGFjY2VwdDEoRGFydFR5cGVWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXREeW5hbWljVHlwZSh0aGlzLCBhcmcpOwogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgPT4gb3RoZXIgaXMgRHluYW1pY1R5cGU7CgogIE51bGxhYmlsaXR5IGdldCBudWxsYWJpbGl0eSA9PiBOdWxsYWJpbGl0eS5udWxsYWJsZTsKfQoKY2xhc3MgVm9pZFR5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgZmluYWwgaW50IGhhc2hDb2RlID0gMTIzMTIxOwoKICBjb25zdCBWb2lkVHlwZSgpOwoKICBhY2NlcHQoRGFydFR5cGVWaXNpdG9yIHYpID0+IHYudmlzaXRWb2lkVHlwZSh0aGlzKTsKICBhY2NlcHQxKERhcnRUeXBlVmlzaXRvcjEgdiwgYXJnKSA9PiB2LnZpc2l0Vm9pZFR5cGUodGhpcywgYXJnKTsKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+IG90aGVyIGlzIFZvaWRUeXBlOwoKICBOdWxsYWJpbGl0eSBnZXQgbnVsbGFiaWxpdHkgPT4gTnVsbGFiaWxpdHkubnVsbGFibGU7Cn0KCmNsYXNzIEJvdHRvbVR5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgZmluYWwgaW50IGhhc2hDb2RlID0gNTE0MjEzOwoKICBjb25zdCBCb3R0b21UeXBlKCk7CgogIGFjY2VwdChEYXJ0VHlwZVZpc2l0b3IgdikgPT4gdi52aXNpdEJvdHRvbVR5cGUodGhpcyk7CiAgYWNjZXB0MShEYXJ0VHlwZVZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdEJvdHRvbVR5cGUodGhpcywgYXJnKTsKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+IG90aGVyIGlzIEJvdHRvbVR5cGU7CgogIE51bGxhYmlsaXR5IGdldCBudWxsYWJpbGl0eSA9PiBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZTsKfQoKQGNvcQpjbGFzcyBJbnRlcmZhY2VUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIFJlZmVyZW5jZSBjbGFzc05hbWU7CgogIGZpbmFsIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5OwoKICBAbm9jb3EKICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwoKICAvLy8gVGhlIFt0eXBlQXJndW1lbnRzXSBsaXN0IG11c3Qgbm90IGJlIG1vZGlmaWVkIGFmdGVyIHRoaXMgY2FsbC4gSWYgdGhlCiAgLy8vIGxpc3QgaXMgb21pdHRlZCwgJ2R5bmFtaWMnIHR5cGUgYXJndW1lbnRzIGFyZSBmaWxsZWQgaW4uCiAgSW50ZXJmYWNlVHlwZShDbGFzcyBjbGFzc05vZGUsCiAgICAgIFtMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSA9IE51bGxhYmlsaXR5LmxlZ2FjeV0pCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShnZXRDbGFzc1JlZmVyZW5jZShjbGFzc05vZGUpLAogICAgICAgICAgICB0eXBlQXJndW1lbnRzID8/IF9kZWZhdWx0VHlwZUFyZ3VtZW50cyhjbGFzc05vZGUpLCBudWxsYWJpbGl0eSk7CgogIEludGVyZmFjZVR5cGUuYnlSZWZlcmVuY2UodGhpcy5jbGFzc05hbWUsIHRoaXMudHlwZUFyZ3VtZW50cywKICAgICAgW3RoaXMubnVsbGFiaWxpdHkgPSBOdWxsYWJpbGl0eS5sZWdhY3ldKTsKCiAgQ2xhc3MgZ2V0IGNsYXNzTm9kZSA9PiBjbGFzc05hbWUuYXNDbGFzczsKCiAgc3RhdGljIExpc3Q8RGFydFR5cGU+IF9kZWZhdWx0VHlwZUFyZ3VtZW50cyhDbGFzcyBjbGFzc05vZGUpIHsKICAgIGlmIChjbGFzc05vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoID09IDApIHsKICAgICAgLy8gQXZvaWQgYWxsb2NhdGluZyBhIGxpc3QgaW4gdGhpcyB2ZXJ5IGNvbW1vbiBjYXNlLgogICAgICByZXR1cm4gY29uc3QgPERhcnRUeXBlPltdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICBjbGFzc05vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoLCBjb25zdCBEeW5hbWljVHlwZSgpKTsKICAgIH0KICB9CgogIGFjY2VwdChEYXJ0VHlwZVZpc2l0b3IgdikgPT4gdi52aXNpdEludGVyZmFjZVR5cGUodGhpcyk7CiAgYWNjZXB0MShEYXJ0VHlwZVZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdEludGVyZmFjZVR5cGUodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGNsYXNzTm9kZS5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB2aXNpdExpc3QodHlwZUFyZ3VtZW50cywgdik7CiAgfQoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgaWYgKGNsYXNzTmFtZSAhPSBvdGhlci5jbGFzc05hbWUpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG90aGVyLnR5cGVBcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICAgIGlmICh0eXBlQXJndW1lbnRzW2ldICE9IG90aGVyLnR5cGVBcmd1bWVudHNbaV0pIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGludCBnZXQgaGFzaENvZGUgewogICAgaW50IGhhc2ggPSAweDNmZmZmZmZmICYgY2xhc3NOYW1lLmhhc2hDb2RlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIGhhc2ggPSAweDNmZmZmZmZmICYgKGhhc2ggKiAzMSArIChoYXNoIF4gdHlwZUFyZ3VtZW50c1tpXS5oYXNoQ29kZSkpOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQp9CgovLy8gQSBwb3NzaWJseSBnZW5lcmljIGZ1bmN0aW9uIHR5cGUuCkBjb3EKY2xhc3MgRnVuY3Rpb25UeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CiAgZmluYWwgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ7CiAgQGNvcXNpbmdsZQogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogIGZpbmFsIExpc3Q8TmFtZWRUeXBlPiBuYW1lZFBhcmFtZXRlcnM7IC8vIE11c3QgYmUgc29ydGVkLgogIGZpbmFsIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5OwoKICAvLy8gVGhlIFtUeXBlZGVmXSB0aGlzIGZ1bmN0aW9uIHR5cGUgaXMgY3JlYXRlZCBmb3IuCiAgZmluYWwgVHlwZWRlZlR5cGUgdHlwZWRlZlR5cGU7CgogIGZpbmFsIERhcnRUeXBlIHJldHVyblR5cGU7CiAgaW50IF9oYXNoQ29kZTsKCiAgRnVuY3Rpb25UeXBlKExpc3Q8RGFydFR5cGU+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCB0aGlzLnJldHVyblR5cGUsCiAgICAgIHt0aGlzLm5hbWVkUGFyYW1ldGVyczogY29uc3QgPE5hbWVkVHlwZT5bXSwKICAgICAgdGhpcy50eXBlUGFyYW1ldGVyczogY29uc3QgPFR5cGVQYXJhbWV0ZXI+W10sCiAgICAgIHRoaXMubnVsbGFiaWxpdHk6IE51bGxhYmlsaXR5LmxlZ2FjeSwKICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgIHRoaXMudHlwZWRlZlR5cGV9KQogICAgICA6IHRoaXMucG9zaXRpb25hbFBhcmFtZXRlcnMgPSBwb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgICB0aGlzLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPQogICAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50ID8/IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsKCiAgQG5vY29xCiAgUmVmZXJlbmNlIGdldCB0eXBlZGVmUmVmZXJlbmNlID0+IHR5cGVkZWZUeXBlPy50eXBlZGVmUmVmZXJlbmNlOwoKICBUeXBlZGVmIGdldCB0eXBlZGVmID0+IHR5cGVkZWZSZWZlcmVuY2U/LmFzVHlwZWRlZjsKCiAgYWNjZXB0KERhcnRUeXBlVmlzaXRvciB2KSA9PiB2LnZpc2l0RnVuY3Rpb25UeXBlKHRoaXMpOwogIGFjY2VwdDEoRGFydFR5cGVWaXNpdG9yMSB2LCBhcmcpID0+IHYudmlzaXRGdW5jdGlvblR5cGUodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdCh0eXBlUGFyYW1ldGVycywgdik7CiAgICB2aXNpdExpc3QocG9zaXRpb25hbFBhcmFtZXRlcnMsIHYpOwogICAgdmlzaXRMaXN0KG5hbWVkUGFyYW1ldGVycywgdik7CiAgICB0eXBlZGVmVHlwZT8uYWNjZXB0KHYpOwogICAgcmV0dXJuVHlwZS5hY2NlcHQodik7CiAgfQoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICBpZiAodHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9IG90aGVyLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCB8fAogICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCAhPSBvdGhlci5yZXF1aXJlZFBhcmFtZXRlckNvdW50IHx8CiAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggIT0gb3RoZXIucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoIHx8CiAgICAgICAgICBuYW1lZFBhcmFtZXRlcnMubGVuZ3RoICE9IG90aGVyLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBpZiAocG9zaXRpb25hbFBhcmFtZXRlcnNbaV0gIT0gb3RoZXIucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0pIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVkUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgICAgaWYgKG5hbWVkUGFyYW1ldGVyc1tpXSAhPSBvdGhlci5uYW1lZFBhcmFtZXRlcnNbaV0pIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0dXJuVHlwZSA9PSBvdGhlci5yZXR1cm5UeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFN0cnVjdHVyYWwgZXF1YWxpdHkgZG9lcyBub3QgdGVsbCB1cyBpZiB0d28gZ2VuZXJpYyBmdW5jdGlvbiB0eXBlcwogICAgICAgIC8vIGFyZSB0aGUgc2FtZSB0eXBlLiAgSWYgdGhleSBhcmUgdW5pZmlhYmxlIHdpdGhvdXQgc3Vic3RpdHV0aW5nIGFueQogICAgICAgIC8vIHR5cGUgdmFyaWFibGVzLCB0aGV5IGFyZSBlcXVhbC4KICAgICAgICByZXR1cm4gdW5pZnlUeXBlcyh0aGlzLCBvdGhlciwgbmV3IFNldDxUeXBlUGFyYW1ldGVyPigpKSAhPSBudWxsOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyBhIHZhcmlhbnQgb2YgdGhpcyBmdW5jdGlvbiB0eXBlIHRoYXQgZG9lcyBub3QgZGVjbGFyZSBhbnkgdHlwZQogIC8vLyBwYXJhbWV0ZXJzLgogIC8vLwogIC8vLyBBbnkgdXNlcyBvZiBpdHMgdHlwZSBwYXJhbWV0ZXJzIGJlY29tZSBmcmVlIHZhcmlhYmxlcyBpbiB0aGUgcmV0dXJuZWQKICAvLy8gdHlwZS4KICBGdW5jdGlvblR5cGUgZ2V0IHdpdGhvdXRUeXBlUGFyYW1ldGVycyB7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZShwb3NpdGlvbmFsUGFyYW1ldGVycywgcmV0dXJuVHlwZSwKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHR5cGVkZWZUeXBlOiB0eXBlZGVmVHlwZSk7CiAgfQoKICAvLy8gTG9va3MgdXAgdGhlIHR5cGUgb2YgdGhlIG5hbWVkIHBhcmFtZXRlciB3aXRoIHRoZSBnaXZlbiBuYW1lLgogIC8vLwogIC8vLyBSZXR1cm5zIGBudWxsYCBpZiB0aGVyZSBpcyBubyBuYW1lZCBwYXJhbWV0ZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KICBEYXJ0VHlwZSBnZXROYW1lZFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewogICAgaW50IGxvd2VyID0gMDsKICAgIGludCB1cHBlciA9IG5hbWVkUGFyYW1ldGVycy5sZW5ndGggLSAxOwogICAgd2hpbGUgKGxvd2VyIDw9IHVwcGVyKSB7CiAgICAgIGludCBwaXZvdCA9IChsb3dlciArIHVwcGVyKSB+LyAyOwogICAgICB2YXIgbmFtZWRQYXJhbWV0ZXIgPSBuYW1lZFBhcmFtZXRlcnNbcGl2b3RdOwogICAgICBpbnQgY29tcGFyaXNvbiA9IG5hbWUuY29tcGFyZVRvKG5hbWVkUGFyYW1ldGVyLm5hbWUpOwogICAgICBpZiAoY29tcGFyaXNvbiA9PSAwKSB7CiAgICAgICAgcmV0dXJuIG5hbWVkUGFyYW1ldGVyLnR5cGU7CiAgICAgIH0gZWxzZSBpZiAoY29tcGFyaXNvbiA8IDApIHsKICAgICAgICB1cHBlciA9IHBpdm90IC0gMTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsb3dlciA9IHBpdm90ICsgMTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9oYXNoQ29kZSA/Pz0gX2NvbXB1dGVIYXNoQ29kZSgpOwoKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpIHsKICAgIGludCBoYXNoID0gMTIzNzsKICAgIGhhc2ggPSAweDNmZmZmZmZmICYgKGhhc2ggKiAzMSArIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICBUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciA9IHR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICBfdGVtcG9yYXJ5SGFzaENvZGVUYWJsZVtwYXJhbWV0ZXJdID0gX3RlbXBvcmFyeUhhc2hDb2RlVGFibGUubGVuZ3RoOwogICAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyBwYXJhbWV0ZXIuYm91bmQuaGFzaENvZGUpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS5oYXNoQ29kZSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVkUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyBuYW1lZFBhcmFtZXRlcnNbaV0uaGFzaENvZGUpOwogICAgfQogICAgaGFzaCA9IDB4M2ZmZmZmZmYgJiAoaGFzaCAqIDMxICsgcmV0dXJuVHlwZS5oYXNoQ29kZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIC8vIFJlbW92ZSB0aGUgdHlwZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHNjb3BlIGFnYWluLgogICAgICBfdGVtcG9yYXJ5SGFzaENvZGVUYWJsZS5yZW1vdmUodHlwZVBhcmFtZXRlcnNbaV0pOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQp9CgovLy8gQSB1c2Ugb2YgYSBbVHlwZWRlZl0gYXMgYSB0eXBlLgovLy8KLy8vIFRoZSB1bmRlcmx5aW5nIHR5cGUgY2FuIGJlIGV4dHJhY3RlZCB1c2luZyBbdW5hbGlhc10uCmNsYXNzIFR5cGVkZWZUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIGZpbmFsIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5OwogIGZpbmFsIFJlZmVyZW5jZSB0eXBlZGVmUmVmZXJlbmNlOwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CgogIFR5cGVkZWZUeXBlKFR5cGVkZWYgdHlwZWRlZk5vZGUsCiAgICAgIFtMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSA9IE51bGxhYmlsaXR5LmxlZ2FjeV0pCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZSh0eXBlZGVmTm9kZS5yZWZlcmVuY2UsCiAgICAgICAgICAgIHR5cGVBcmd1bWVudHMgPz8gY29uc3QgPERhcnRUeXBlPltdLCBudWxsYWJpbGl0eSk7CgogIFR5cGVkZWZUeXBlLmJ5UmVmZXJlbmNlKHRoaXMudHlwZWRlZlJlZmVyZW5jZSwgdGhpcy50eXBlQXJndW1lbnRzLAogICAgICBbdGhpcy5udWxsYWJpbGl0eSA9IE51bGxhYmlsaXR5LmxlZ2FjeV0pOwoKICBUeXBlZGVmIGdldCB0eXBlZGVmTm9kZSA9PiB0eXBlZGVmUmVmZXJlbmNlLmFzVHlwZWRlZjsKCiAgYWNjZXB0KERhcnRUeXBlVmlzaXRvciB2KSA9PiB2LnZpc2l0VHlwZWRlZlR5cGUodGhpcyk7CiAgYWNjZXB0MShEYXJ0VHlwZVZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFR5cGVkZWZUeXBlKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QodHlwZUFyZ3VtZW50cywgdik7CiAgICB2LnZpc2l0VHlwZWRlZlJlZmVyZW5jZSh0eXBlZGVmTm9kZSk7CiAgfQoKICBEYXJ0VHlwZSBnZXQgdW5hbGlhc09uY2UgewogICAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tVHlwZWRlZlR5cGUodGhpcykuc3Vic3RpdHV0ZVR5cGUodHlwZWRlZk5vZGUudHlwZSk7CiAgfQoKICBEYXJ0VHlwZSBnZXQgdW5hbGlhcyB7CiAgICByZXR1cm4gdW5hbGlhc09uY2UudW5hbGlhczsKICB9CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMgVHlwZWRlZlR5cGUpIHsKICAgICAgaWYgKHR5cGVkZWZSZWZlcmVuY2UgIT0gb3RoZXIudHlwZWRlZlJlZmVyZW5jZSB8fAogICAgICAgICAgdHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKHR5cGVBcmd1bWVudHNbaV0gIT0gb3RoZXIudHlwZUFyZ3VtZW50c1tpXSkgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICBpbnQgaGFzaCA9IDB4M2ZmZmZmZmYgJiB0eXBlZGVmTm9kZS5oYXNoQ29kZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyAoaGFzaCBeIHR5cGVBcmd1bWVudHNbaV0uaGFzaENvZGUpKTsKICAgIH0KICAgIHJldHVybiBoYXNoOwogIH0KfQoKLy8vIEEgbmFtZWQgcGFyYW1ldGVyIGluIFtGdW5jdGlvblR5cGVdLgpjbGFzcyBOYW1lZFR5cGUgZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgQ29tcGFyYWJsZTxOYW1lZFR5cGU+IHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBEYXJ0VHlwZSB0eXBlOwoKICBOYW1lZFR5cGUodGhpcy5uYW1lLCB0aGlzLnR5cGUpOwoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIE5hbWVkVHlwZSAmJiBuYW1lID09IG90aGVyLm5hbWUgJiYgdHlwZSA9PSBvdGhlci50eXBlOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gbmFtZS5oYXNoQ29kZSAqIDMxICsgdHlwZS5oYXNoQ29kZSAqIDM3OwogIH0KCiAgaW50IGNvbXBhcmVUbyhOYW1lZFR5cGUgb3RoZXIpID0+IG5hbWUuY29tcGFyZVRvKG90aGVyLm5hbWUpOwoKICBhY2NlcHQoVmlzaXRvciB2KSA9PiB2LnZpc2l0TmFtZWRUeXBlKHRoaXMpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB0eXBlLmFjY2VwdCh2KTsKICB9Cn0KCi8vLyBTdG9yZXMgdGhlIGhhc2ggY29kZSBvZiBmdW5jdGlvbiB0eXBlIHBhcmFtZXRlcnMgd2hpbGUgY29tcHV0aW5nIHRoZSBoYXNoCi8vLyBjb2RlIG9mIGEgW0Z1bmN0aW9uVHlwZV0gb2JqZWN0LgovLy8KLy8vIFRoaXMgZW5zdXJlcyB0aGF0IGRpc3RpbmN0IFtGdW5jdGlvblR5cGVdIG9iamVjdHMgZ2V0IHRoZSBzYW1lIGhhc2ggY29kZQovLy8gaWYgdGhleSByZXByZXNlbnQgdGhlIHNhbWUgdHlwZSwgZXZlbiB0aG91Z2ggdGhlaXIgdHlwZSBwYXJhbWV0ZXJzIGFyZQovLy8gcmVwcmVzZW50ZWQgYnkgZGlmZmVyZW50IG9iamVjdHMuCmZpbmFsIE1hcDxUeXBlUGFyYW1ldGVyLCBpbnQ+IF90ZW1wb3JhcnlIYXNoQ29kZVRhYmxlID0gPFR5cGVQYXJhbWV0ZXIsIGludD57fTsKCi8vLyBSZWZlcmVuY2UgdG8gYSB0eXBlIHZhcmlhYmxlLgovLy8KLy8vIEEgdHlwZSB2YXJpYWJsZSBoYXMgYW4gb3B0aW9uYWwgYm91bmQgYmVjYXVzZSB0eXBlIHByb21vdGlvbiBjYW4gY2hhbmdlIHRoZQovLy8gYm91bmQuICBBIGJvdW5kIG9mIGBudWxsYCBpbmRpY2F0ZXMgdGhhdCB0aGUgYm91bmQgaGFzIG5vdCBiZWVuIHByb21vdGVkIGFuZAovLy8gaXMgdGhlIHNhbWUgYXMgdGhlIFtUeXBlUGFyYW1ldGVyXSdzIGJvdW5kLiAgVGhpcyBhbGxvd3Mgb25lIHRvIGRldGVjdAovLy8gd2hldGhlciB0aGUgYm91bmQgaGFzIGJlZW4gcHJvbW90ZWQuCmNsYXNzIFR5cGVQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIC8vLyBEZWNsYXJlZCBieSB0aGUgcHJvZ3JhbW1lciBvbiB0aGUgdHlwZS4KICBmaW5hbCBOdWxsYWJpbGl0eSBkZWNsYXJlZE51bGxhYmlsaXR5OwoKICAvLy8gQWN0dWFsIG51bGxhYmlsaXR5IG9mIHRoZSB0eXBlLCBjYWxjdWxhdGVkIGZyb20gaXRzIHBhcnRzLgogIC8vLwogIC8vLyBbbnVsbGFiaWxpdHldIGlzIGNhbGN1bGF0ZWQgZnJvbSBbZGVjbGFyZWROdWxsYWJpbGl0eV0gYW5kIHRoZQogIC8vLyBudWxsYWJpbGl0aWVzIG9mIFtwcm9tb3RlZEJvdW5kXSBhbmQgdGhlIGJvdW5kIG9mIFtwYXJhbWV0ZXJdLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSwgaW4gdGhlIGZvbGxvd2luZyBwcm9ncmFtIFtkZWNsYXJlZE51bGxhYmlsaXR5XSBib3RoIGB4YCBhbmQKICAvLy8gYHlgIGlzIFtOdWxsYWJpbGl0eS5udWxsYWJsZV0sIGJlY2F1c2UgaXQncyBjb3BpZWQgZnJvbSB0aGF0IG9mIGBiYXJgLgogIC8vLyBIb3dldmVyLCBkZXNwaXRlIFtudWxsYWJpbGl0eV0gb2YgYHhgIGlzIFtOdWxsYWJpbGl0eS5udWxsYWJsZV0sCiAgLy8vIFtudWxsYWJpbGl0eV0gb2YgYHlgIGlzIFtOdWxsYWJpbGl0eS5ub25OdWxsYWJsZV0gYmVjYXVzZSBvZiBpdHMKICAvLy8gW3Byb21vdGVkQm91bmRdLgogIC8vLwogIC8vLyAgICAgY2xhc3MgQTxUIGV4dGVuZHMgT2JqZWN0Pz4gewogIC8vLyAgICAgICBmb28oVD8gYmFyKSB7CiAgLy8vICAgICAgICAgdmFyIHggPSBiYXI7CiAgLy8vICAgICAgICAgaWYgKGJhciBpcyBpbnQpIHsKICAvLy8gICAgICAgICAgIHZhciB5ID0gYmFyOwogIC8vLyAgICAgICAgIH0KICAvLy8gICAgICAgfQogIC8vLyAgICAgfQogIGZpbmFsIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5OwoKICBUeXBlUGFyYW1ldGVyIHBhcmFtZXRlcjsKCiAgLy8vIEFuIG9wdGlvbmFsIHByb21vdGVkIGJvdW5kIG9uIHRoZSB0eXBlIHBhcmFtZXRlci4KICAvLy8KICAvLy8gJ251bGwnIGluZGljYXRlcyB0aGF0IHRoZSB0eXBlIHBhcmFtZXRlcidzIGJvdW5kIGhhcyBub3QgYmVlbiBwcm9tb3RlZCBhbmQKICAvLy8gaXMgdGhlcmVmb3JlIHRoZSBzYW1lIGFzIHRoZSBib3VuZCBvZiBbcGFyYW1ldGVyXS4KICBEYXJ0VHlwZSBwcm9tb3RlZEJvdW5kOwoKICBUeXBlUGFyYW1ldGVyVHlwZSh0aGlzLnBhcmFtZXRlciwKICAgICAgW3RoaXMucHJvbW90ZWRCb3VuZCwgdGhpcy5kZWNsYXJlZE51bGxhYmlsaXR5XSkKICAgICAgOiB0aGlzLm51bGxhYmlsaXR5ID0KICAgICAgICAgICAgZ2V0TnVsbGFiaWxpdHkocGFyYW1ldGVyLCBwcm9tb3RlZEJvdW5kLCBkZWNsYXJlZE51bGxhYmlsaXR5KTsKCiAgYWNjZXB0KERhcnRUeXBlVmlzaXRvciB2KSA9PiB2LnZpc2l0VHlwZVBhcmFtZXRlclR5cGUodGhpcyk7CiAgYWNjZXB0MShEYXJ0VHlwZVZpc2l0b3IxIHYsIGFyZykgPT4gdi52aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIFR5cGVQYXJhbWV0ZXJUeXBlICYmIHBhcmFtZXRlciA9PSBvdGhlci5wYXJhbWV0ZXI7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF90ZW1wb3JhcnlIYXNoQ29kZVRhYmxlW3BhcmFtZXRlcl0gPz8gcGFyYW1ldGVyLmhhc2hDb2RlOwoKICAvLy8gUmV0dXJucyB0aGUgYm91bmQgb2YgdGhlIHR5cGUgcGFyYW1ldGVyLCBhY2NvdW50aW5nIGZvciBwcm9tb3Rpb25zLgogIERhcnRUeXBlIGdldCBib3VuZCA9PiBwcm9tb3RlZEJvdW5kID8/IHBhcmFtZXRlci5ib3VuZDsKCiAgLy8vIEdldCBudWxsYWJpbGl0eSBvZiBbVHlwZVBhcmFtZXRlclR5cGVdIGZyb20gYXJndW1lbnRzIHRvIGl0cyBjb25zdHJ1Y3Rvci4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBvbmx5IGluIHRoZSBjb25zdHJ1Y3RvciBvZgogIC8vLyBbVHlwZVBhcmFtZXRlclR5cGVdIHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9mCiAgLy8vIFtUeXBlUGFyYW1ldGVyVHlwZS5udWxsYWJpbGl0eV0gZnJvbSB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCiAgc3RhdGljIE51bGxhYmlsaXR5IGdldE51bGxhYmlsaXR5KFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyLAogICAgICBEYXJ0VHlwZSBwcm9tb3RlZEJvdW5kLCBOdWxsYWJpbGl0eSBkZWNsYXJlZE51bGxhYmlsaXR5KSB7CiAgICAvLyBJZiBwcm9tb3RlZEJvdW5kIGlzIG51bGwsIGdldE51bGxhYmlsaXR5IHJldHVybnMgdGhlIG51bGxhYmlsaXR5IG9mCiAgICAvLyBlaXRoZXIgVCBvciBUPyB3aGVyZSBUIGlzIHBhcmFtZXRlciBhbmQgdGhlIHByZXNlbmNlIG9mICc/JyBpcyBkZXRlcm1pbmVkCiAgICAvLyBieSBudWxsYWJpbGl0eS4KCiAgICAvLyBJZiBwcm9tb3RlZEJvdW5kIGlzbid0IG51bGwsIGdldE51bGxhYmlsaXR5IHJldHVybnMgdGhlIG51bGxhYmlsaXR5IG9mIGFuCiAgICAvLyBpbnN0ZXNlY3Rpb24gb2YgdGhlIGxlZnQtaGFuZCBzaWRlIChyZWZlcnJlZCB0byBhcyBMSFMgYmVsb3cpIGFuZCB0aGUKICAgIC8vIHJpZ2h0LWhhbmQgc2lkZSAocmVmZXJyZWQgdG8gYXMgUkhTIGJlbG93KS4gIExIUyBpcyBwYXJhbWV0ZXIgZm9sbG93ZWQgYnkKICAgIC8vIG51bGxhYmlsaXR5LCBhbmQgUkhTIGlzIHByb21vdGVkQm91bmQuICBUaGF0IGlzLCBnZXROdWxsYWJpbGl0eSByZXR1cm5zCiAgICAvLyB0aGUgbnVsbGFiaWxpdHkgb2YgZWl0aGVyIFQgJiBQIG9yIFQ/ICYgUCB3aGVyZSBUIGlzIHBhcmFtZXRlciwgUCBpcwogICAgLy8gcHJvbW90ZWRCb3VuZCwgYW5kIHRoZSBwcmVzZW5jZSBvZiAnPycgaXMgZGV0ZXJtaW5lZCBieSBudWxsYWJpbGl0eS4KICAgIC8vIE5vdGUgdGhhdCBSSFMgaXMgYWx3YXlzIGEgc3VidHlwZSBvZiB0aGUgYm91bmQgb2YgdGhlIHR5cGUgcGFyYW1ldGVyLgoKICAgIE51bGxhYmlsaXR5IGxoc051bGxhYmlsaXR5OwoKICAgIC8vIElmIHRoZSBudWxsYWJpbGl0eSBpcyBleHBsaWNpdGx5IG51bGxhYmxlLCB0aGF0IGlzLCBpZiB0aGUgdHlwZSBwYXJhbWV0ZXIKICAgIC8vIHR5cGUgaXMgZm9sbG93ZWQgYnkgJz8nIGluIHRoZSBjb2RlLCB0aGUgbnVsbGFiaWxpdHkgb2YgdGhlIHR5cGUgaXMKICAgIC8vICdudWxsYWJsZS4nCiAgICBpZiAoZGVjbGFyZWROdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSkgewogICAgICBsaHNOdWxsYWJpbGl0eSA9IE51bGxhYmlsaXR5Lm51bGxhYmxlOwogICAgfSBlbHNlIHsKICAgICAgLy8gSWYgdGhlIGJvdW5kIGlzIG51bGxhYmxlLCBib3RoIG51bGxhYmxlIGFuZCBub24tbnVsbGFibGUgdHlwZXMgY2FuIGJlCiAgICAgIC8vIHBhc3NlZCBpbiBmb3IgdGhlIHR5cGUgcGFyYW1ldGVyLCBtYWtpbmcgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZQogICAgICAvLyBwYXJhbWV0ZXIgdHlwZXMgJ25laXRoZXIuJyAgT3RoZXJ3aXNlLCB0aGUgbnVsbGFiaWxpdHkgbWF0Y2hlcyB0aGF0IG9mCiAgICAgIC8vIHRoZSBib3VuZC4KICAgICAgRGFydFR5cGUgYm91bmQgPSBwYXJhbWV0ZXIuYm91bmQgPz8gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgICAgTnVsbGFiaWxpdHkgYm91bmROdWxsYWJpbGl0eSA9CiAgICAgICAgICBib3VuZCBpcyBJbnZhbGlkVHlwZSA/IE51bGxhYmlsaXR5Lm5laXRoZXIgOiBib3VuZC5udWxsYWJpbGl0eTsKICAgICAgbGhzTnVsbGFiaWxpdHkgPSBib3VuZE51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlCiAgICAgICAgICA/IE51bGxhYmlsaXR5Lm5laXRoZXIKICAgICAgICAgIDogYm91bmROdWxsYWJpbGl0eTsKICAgIH0KICAgIGlmIChwcm9tb3RlZEJvdW5kID09IG51bGwpIHsKICAgICAgcmV0dXJuIGxoc051bGxhYmlsaXR5OwogICAgfQoKICAgIC8vIEluIHByYWN0aWNlIGEgdHlwZSBwYXJhbWV0ZXIgb2YgbGVnYWN5IHR5cGUgY2FuIG9ubHkgYmUgdXNlZCBpbiB0eXBlCiAgICAvLyBhbm5vdGF0aW9ucyB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3MgZGVjbGFyYXRpb24uICBJZiBpdCdzIGxlZ2FjeSwKICAgIC8vIHRoZW4gdGhlIGVudGlyZSBsaWJyYXJ5IGNvbnRhaW5pbmcgdGhlIGNsYXNzIGlzIG9wdC1vdXQsIGFuZCBhbnkgUkhTIGlzCiAgICAvLyBkZWVtZWQgdG8gYmUgbGVnYWN5IHRvby4gIFNvLCBpdCdzIG5lY2Vzc2FyeSB0byBvbmx5IGNoZWNrIExIUyBmb3IgYmVpbmcKICAgIC8vIGxlZ2FjeS4KICAgIGlmIChsaHNOdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kpIHsKICAgICAgcmV0dXJuIE51bGxhYmlsaXR5LmxlZ2FjeTsKICAgIH0KCiAgICAvLyBJbnRlcnNlY3Rpb24gaXMgbm9uLW51bGxhYmxlIGlmIGFuZCBvbmx5IGlmIFJIUyBpcyBub24tbnVsbGFibGUuCiAgICAvLwogICAgLy8gVGhlIHByb29mIGlzIGFzIGZvbGxvd3MuICBJbnRlcnNlY3Rpb24gaXMgbm9uLW51bGxhYmxlIGlmIGF0IGxlYXN0IG9uZSBvZgogICAgLy8gTEhTIG9yIFJIUyBpcyBub24tbnVsbGFibGUuICBUaGUgY2FzZSBvZiBub24tbnVsbGFibGUgUkhTIGlzIHRyaXZpYWwuICBJbgogICAgLy8gdGhlIGNhc2Ugb2Ygbm9uLW51bGxhYmxlIExIUywgaXRzIGJvdW5kIHNob3VsZCBiZSBub24tbnVsbGFibGUuICBSSFMgaXMKICAgIC8vIGtub3duIHRvIGFsd2F5cyBiZSBhIHN1YnR5cGUgb2YgdGhlIGJvdW5kIG9mIExIUzsgdGhlcmVmb3JlLCBSSFMgaXMKICAgIC8vIG5vbi1udWxsYWJsZS4KICAgIC8vCiAgICAvLyBOb3RlIHRoYXQgaXQgYWxzbyBmb2xsb3dzIGZyb20gdGhlIGFib3ZlIHRoYXQgbm9uLW51bGxhYmxlIFJIUyBpbXBsaWVzCiAgICAvLyBub24tbnVsbGFibGUgTEhTLCBzbyB0aGUgY2hlY2sgYmVsb3cgY292ZXJzIHRoZSBjYXNlIGxoc051bGxhYmlsaXR5ID09CiAgICAvLyBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZS4KICAgIGlmIChwcm9tb3RlZEJvdW5kLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKSB7CiAgICAgIHJldHVybiBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZTsKICAgIH0KCiAgICAvLyBJZiB0aGUgbnVsbGFiaWxpdHkgb2YgTEhTIGlzICduZWl0aGVyLCcgdGhlIG51bGxhYmlsaXR5IG9mIHRoZQogICAgLy8gaW50ZXJzZWN0aW9uIGlzIGFsc28gJ25laXRoZXInIGlmIFJIUyBpcyAnbmVpdGhlcicgb3IgbnVsbGFibGUuCiAgICAvLwogICAgLy8gQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlOgogICAgLy8KICAgIC8vICAgICBjbGFzcyBBPFggZXh0ZW5kcyBPYmplY3Q/LCBZIGV4dGVuZHMgWD4gewogICAgLy8gICAgICAgZm9vKFggeCkgewogICAgLy8gICAgICAgICBpZiAoeCBpcyBZKSB7CiAgICAvLyAgICAgICAgICAgeCA9IG51bGw7ICAgICAvLyBDb21waWxlLXRpbWUgZXJyb3IuICBDb25zaWRlciBYID0gWSA9IGludC4KICAgIC8vICAgICAgICAgICBPYmplY3QgYSA9IHg7IC8vIENvbXBpbGUtdGltZSBlcnJvci4gIENvbnNpZGVyIFggPSBZID0gaW50Py4KICAgIC8vICAgICAgICAgfQogICAgLy8gICAgICAgICBpZiAoeCBpcyBpbnQ/KSB7CiAgICAvLyAgICAgICAgICAgeCA9IG51bGw7ICAgICAvLyBDb21waWxlLXRpbWUgZXJyb3IuICBDb25zaWRlciBYID0gaW50LgogICAgLy8gICAgICAgICAgIE9iamVjdCBiID0geDsgLy8gQ29tcGlsZS10aW1lIGVycm9yLiAgQ29uc2lkZXIgWCA9IGludD8uCiAgICAvLyAgICAgICAgIH0KICAgIC8vICAgICAgIH0KICAgIC8vICAgICB9CiAgICAvLwogICAgLy8gTm90ZSB0aGF0IFJIUyBjYW4ndCBiZSAnbGVnYWN5JyBvciBub24tbnVsbGFibGUgYXQgdGhpcyBwb2ludCBkdWUgdG8gdGhlCiAgICAvLyBjaGVja3MgYWJvdmUuCiAgICBpZiAobGhzTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubmVpdGhlcikgewogICAgICByZXR1cm4gTnVsbGFiaWxpdHkubmVpdGhlcjsKICAgIH0KCiAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBvbmx5IHBvc3NpYmlsaXR5IGZvciBMSFMgaXMgdG8gYmUgbnVsbGFibGUsIGFuZCBmb3IgUkhTCiAgICAvLyBpcyB0byBiZSBlaXRoZXIgbnVsbGFibGUgb3IgbGVnYWN5LiAgQm90aCBjb21iaW5hdGlvbnMgZm9yIExIUyBhbmQgUkhTCiAgICAvLyBzaG91bGQgeWllbGQgdGhlIG51bGxhYmlsaXR5IG9mIFJIUyBhcyB0aGUgbnVsbGFiaWxpdHkgZm9yIHRoZQogICAgLy8gaW50ZXJzZWN0aW9uLiAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBjb2RlIGZvciBjbGFyaWZpY2F0aW9uOgogICAgLy8KICAgIC8vICAgY2xhc3MgQTxYIGV4dGVuZHMgT2JqZWN0PywgWSBleHRlbmRzIFg+IHsKICAgIC8vICAgICBmb28oWD8geCkgewogICAgLy8gICAgICAgaWYgKHggaXMgWSkgewogICAgLy8gICAgICAgICB4ID0gbnVsbDsgICAgIC8vIENvbXBpbGUtdGltZSBlcnJvci4gIENvbnNpZGVyIFggPSBZID0gaW50LgogICAgLy8gICAgICAgICBPYmplY3QgYSA9IHg7IC8vIENvbXBpbGUtdGltZSBlcnJvci4gIENvbnNpZGVyIFggPSBZID0gaW50Py4KICAgIC8vICAgICAgIH0KICAgIC8vICAgICAgIGlmICh4IGlzIGludD8pIHsKICAgIC8vICAgICAgICAgeCA9IG51bGw7ICAgICAvLyBPay4gIEJvdGggWD8gYW5kIGludD8gYXJlIG51bGxhYmxlLgogICAgLy8gICAgICAgfQogICAgLy8gICAgIH0KICAgIC8vICAgfQogICAgcmV0dXJuIHByb21vdGVkQm91bmQubnVsbGFiaWxpdHk7CiAgfQp9CgovLy8gRGVjbGFyYXRpb24gb2YgYSB0eXBlIHZhcmlhYmxlLgovLy8KLy8vIFR5cGUgcGFyYW1ldGVycyBkZWNsYXJlZCBpbiBhIFtDbGFzc10gb3IgW0Z1bmN0aW9uTm9kZV0gYXJlIHBhcnQgb2YgdGhlIEFTVCwKLy8vIGhhdmUgYSBwYXJlbnQgcG9pbnRlciB0byBpdHMgZGVjbGFyaW5nIGNsYXNzIG9yIGZ1bmN0aW9uLCBhbmQgd2lsbCBiZSBzZWVuCi8vLyBieSB0cmVlIHZpc2l0b3JzLgovLy8KLy8vIFR5cGUgcGFyYW1ldGVycyBkZWNsYXJlZCBieSBhIFtGdW5jdGlvblR5cGVdIGFyZSBvcnBoYW5zIGFuZCBoYXZlIGEgYG51bGxgCi8vLyBwYXJlbnQgcG9pbnRlci4gIFtUeXBlUGFyYW1ldGVyXSBvYmplY3RzIHNob3VsZCBub3QgYmUgc2hhcmVkIGJldHdlZW4KLy8vIGRpZmZlcmVudCBbRnVuY3Rpb25UeXBlXSBvYmplY3RzLgpjbGFzcyBUeXBlUGFyYW1ldGVyIGV4dGVuZHMgVHJlZU5vZGUgewogIGludCBmbGFncyA9IDA7CgogIC8vLyBMaXN0IG9mIG1ldGFkYXRhIGFubm90YXRpb25zIG9uIHRoZSB0eXBlIHBhcmFtZXRlci4KICAvLy8KICAvLy8gVGhpcyBkZWZhdWx0cyB0byBhbiBpbW11dGFibGUgZW1wdHkgbGlzdC4gVXNlIFthZGRBbm5vdGF0aW9uXSB0byBhZGQKICAvLy8gYW5ub3RhdGlvbnMgaWYgbmVlZGVkLgogIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSBjb25zdCA8RXhwcmVzc2lvbj5bXTsKCiAgU3RyaW5nIG5hbWU7IC8vIENvc21ldGljIG5hbWUuCgogIC8vLyBUaGUgYm91bmQgb24gdGhlIHR5cGUgdmFyaWFibGUuCiAgLy8vCiAgLy8vIFNob3VsZCBub3QgYmUgbnVsbCBleGNlcHQgdGVtcG9yYXJpbHkgZHVyaW5nIElSIGNvbnN0cnVjdGlvbi4gIFNob3VsZAogIC8vLyBiZSBzZXQgdG8gdGhlIHJvb3QgY2xhc3MgZm9yIHR5cGUgcGFyYW1ldGVycyB3aXRob3V0IGFuIGV4cGxpY2l0IGJvdW5kLgogIERhcnRUeXBlIGJvdW5kOwoKICAvLy8gVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHR5cGUgdmFyaWFibGUuIEl0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUKICAvLy8gY29ycmVzcG9uZGluZyBtaXNzaW5nIHR5cGUgYXJndW1lbnQgaW4gdHlwZSBhbm5vdGF0aW9ucyBhbmQgYXMgdGhlCiAgLy8vIGZhbGwtYmFjayB0eXBlIHZhbHVlIGluIHR5cGUgaW5mZXJlbmNlIGF0IGNvbXBpbGUgdGltZS4gQXQgcnVuIHRpbWUsCiAgLy8vIFtkZWZhdWx0VHlwZV0gaXMgdXNlZCBieSB0aGUgYmFja2VuZHMgaW4gcGxhY2Ugb2YgdGhlIG1pc3NpbmcgdHlwZQogIC8vLyBhcmd1bWVudCBvZiBhIGR5bmFtaWMgaW52b2NhdGlvbiBvZiBhIGdlbmVyaWMgZnVuY3Rpb24uCiAgRGFydFR5cGUgZGVmYXVsdFR5cGU7CgogIFR5cGVQYXJhbWV0ZXIoW3RoaXMubmFtZSwgdGhpcy5ib3VuZCwgdGhpcy5kZWZhdWx0VHlwZV0pOwoKICAvLyBNdXN0IG1hdGNoIHNlcmlhbGl6ZWQgYml0IHBvc2l0aW9ucy4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdHZW5lcmljQ292YXJpYW50SW1wbCA9IDEgPDwgMDsKCiAgLy8vIElmIHRoaXMgW1R5cGVQYXJhbWV0ZXJdIGlzIGEgdHlwZSBwYXJhbWV0ZXIgb2YgYSBnZW5lcmljIG1ldGhvZCwgaW5kaWNhdGVzCiAgLy8vIHdoZXRoZXIgdGhlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBjb250YWluIGEgcnVudGltZSB0eXBlIGNoZWNrIHRvCiAgLy8vIGRlYWwgd2l0aCBnZW5lcmljIGNvdmFyaWFuY2UuCiAgLy8vCiAgLy8vIFdoZW4gYHRydWVgLCBydW50aW1lIGNoZWNrcyBtYXkgbmVlZCB0byBiZSBwZXJmb3JtZWQ7IHNlZQogIC8vLyBbRGlzcGF0Y2hDYXRlZ29yeV0gZm9yIGRldGFpbHMuCiAgYm9vbCBnZXQgaXNHZW5lcmljQ292YXJpYW50SW1wbCA9PiBmbGFncyAmIEZsYWdHZW5lcmljQ292YXJpYW50SW1wbCAhPSAwOwoKICB2b2lkIHNldCBpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IEZsYWdHZW5lcmljQ292YXJpYW50SW1wbCkKICAgICAgICA6IChmbGFncyAmIH5GbGFnR2VuZXJpY0NvdmFyaWFudEltcGwpOwogIH0KCiAgdm9pZCBhZGRBbm5vdGF0aW9uKEV4cHJlc3Npb24gYW5ub3RhdGlvbikgewogICAgaWYgKGFubm90YXRpb25zLmlzRW1wdHkpIHsKICAgICAgYW5ub3RhdGlvbnMgPSA8RXhwcmVzc2lvbj5bXTsKICAgIH0KICAgIGFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uLi5wYXJlbnQgPSB0aGlzKTsKICB9CgogIGFjY2VwdChUcmVlVmlzaXRvciB2KSA9PiB2LnZpc2l0VHlwZVBhcmFtZXRlcih0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChhbm5vdGF0aW9ucywgdik7CiAgICBib3VuZC5hY2NlcHQodik7CiAgICBkZWZhdWx0VHlwZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICBib3VuZCA9IHYudmlzaXREYXJ0VHlwZShib3VuZCk7CiAgICBpZiAoZGVmYXVsdFR5cGUgIT0gbnVsbCkgewogICAgICBkZWZhdWx0VHlwZSA9IHYudmlzaXREYXJ0VHlwZShkZWZhdWx0VHlwZSk7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyBhIHBvc3NpYmx5IHN5bnRoZXNpemVkIG5hbWUgZm9yIHRoaXMgdHlwZSBwYXJhbWV0ZXIsIGNvbnNpc3RlbnQKICAvLy8gd2l0aCB0aGUgbmFtZXMgdXNlZCBhY3Jvc3MgYWxsIFt0b1N0cmluZ10gY2FsbHMuCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gZGVidWdRdWFsaWZpZWRUeXBlUGFyYW1ldGVyTmFtZSh0aGlzKTsKCiAgYm9vbCBnZXQgaXNGdW5jdGlvblR5cGVUeXBlUGFyYW1ldGVyID0+IHBhcmVudCA9PSBudWxsOwp9CgpjbGFzcyBTdXBlcnR5cGUgZXh0ZW5kcyBOb2RlIHsKICBSZWZlcmVuY2UgY2xhc3NOYW1lOwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CgogIFN1cGVydHlwZShDbGFzcyBjbGFzc05vZGUsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShnZXRDbGFzc1JlZmVyZW5jZShjbGFzc05vZGUpLCB0eXBlQXJndW1lbnRzKTsKCiAgU3VwZXJ0eXBlLmJ5UmVmZXJlbmNlKHRoaXMuY2xhc3NOYW1lLCB0aGlzLnR5cGVBcmd1bWVudHMpOwoKICBDbGFzcyBnZXQgY2xhc3NOb2RlID0+IGNsYXNzTmFtZS5hc0NsYXNzOwoKICBhY2NlcHQoVmlzaXRvciB2KSA9PiB2LnZpc2l0U3VwZXJ0eXBlKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgY2xhc3NOb2RlLmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIHZpc2l0TGlzdCh0eXBlQXJndW1lbnRzLCB2KTsKICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IGFzSW50ZXJmYWNlVHlwZSB7CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoY2xhc3NOb2RlLCB0eXBlQXJndW1lbnRzKTsKICB9CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMgU3VwZXJ0eXBlKSB7CiAgICAgIGlmIChjbGFzc05hbWUgIT0gb3RoZXIuY2xhc3NOYW1lKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCAhPSBvdGhlci50eXBlQXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAodHlwZUFyZ3VtZW50c1tpXSAhPSBvdGhlci50eXBlQXJndW1lbnRzW2ldKSByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIGludCBoYXNoID0gMHgzZmZmZmZmZiAmIGNsYXNzTmFtZS5oYXNoQ29kZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyAoaGFzaCBeIHR5cGVBcmd1bWVudHNbaV0uaGFzaENvZGUpKTsKICAgIH0KICAgIHJldHVybiBoYXNoOwogIH0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVEFOVFMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphYnN0cmFjdCBjbGFzcyBDb25zdGFudCBleHRlbmRzIE5vZGUgewogIC8vLyBDYWxscyB0aGUgYHZpc2l0KkNvbnN0YW50UmVmZXJlbmNlKClgIG1ldGhvZCBvbiB2aXNpdG9yIFt2XSBmb3IgYWxsCiAgLy8vIGNvbnN0YW50cyByZWZlcmVuY2VkIGluIHRoaXMgY29uc3RhbnQuCiAgLy8vCiAgLy8vIChOb3RlIHRoYXQgYSBjb25zdGFudCBjYW4gYmUgc2VlbiBhcyBhIERBRyAoZGlyZWN0ZWQgYWN5Y2xpYyBncmFwaCkgYW5kCiAgLy8vICBub3QgYSB0cmVlISkKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdik7CgogIC8vLyBDYWxscyB0aGUgYHZpc2l0KkNvbnN0YW50KClgIG1ldGhvZCBvbiB0aGUgdmlzaXRvciBbdl0uCiAgYWNjZXB0KENvbnN0YW50VmlzaXRvciB2KTsKCiAgLy8vIENhbGxzIHRoZSBgdmlzaXQqQ29uc3RhbnRSZWZlcmVuY2UoKWAgbWV0aG9kIG9uIHRoZSB2aXNpdG9yIFt2XS4KICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KTsKCiAgLy8vIFRoZSBLZXJuZWwgQVNUIHdpbGwgcmVmZXJlbmNlIFtDb25zdGFudF1zIHZpYSBbQ29uc3RhbnRFeHByZXNzaW9uXXMuICBUaGUKICAvLy8gY29uc3RhbnRzIGFyZSBub3QgcmVxdWlyZWQgdG8gYmUgY2Fub25pY2FsaXplZCwgYnV0IHRoZXkgaGF2ZSB0byBiZSBkZWVwbHkKICAvLy8gY29tcGFyYWJsZSB2aWEgaGFzaENvZGUvPT0hCiAgaW50IGdldCBoYXNoQ29kZTsKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcik7CgogIC8vLyBHZXRzIHRoZSB0eXBlIG9mIHRoaXMgY29uc3RhbnQuCiAgRGFydFR5cGUgZ2V0VHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpOwoKICBFeHByZXNzaW9uIGFzRXhwcmVzc2lvbigpIHsKICAgIHJldHVybiBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKHRoaXMpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgUHJpbWl0aXZlQ29uc3RhbnQ8VD4gZXh0ZW5kcyBDb25zdGFudCB7CiAgZmluYWwgVCB2YWx1ZTsKCiAgUHJpbWl0aXZlQ29uc3RhbnQodGhpcy52YWx1ZSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICckdmFsdWUnOwoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHZhbHVlLmhhc2hDb2RlOwoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgUHJpbWl0aXZlQ29uc3RhbnQ8VD4gJiYgb3RoZXIudmFsdWUgPT0gdmFsdWU7Cn0KCmNsYXNzIE51bGxDb25zdGFudCBleHRlbmRzIFByaW1pdGl2ZUNvbnN0YW50PE51bGw+IHsKICBOdWxsQ29uc3RhbnQoKSA6IHN1cGVyKG51bGwpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICBhY2NlcHQoQ29uc3RhbnRWaXNpdG9yIHYpID0+IHYudmlzaXROdWxsQ29uc3RhbnQodGhpcyk7CiAgYWNjZXB0UmVmZXJlbmNlKFZpc2l0b3IgdikgPT4gdi52aXNpdE51bGxDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgRGFydFR5cGUgZ2V0VHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLm51bGxUeXBlOwp9CgpjbGFzcyBCb29sQ29uc3RhbnQgZXh0ZW5kcyBQcmltaXRpdmVDb25zdGFudDxib29sPiB7CiAgQm9vbENvbnN0YW50KGJvb2wgdmFsdWUpIDogc3VwZXIodmFsdWUpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICBhY2NlcHQoQ29uc3RhbnRWaXNpdG9yIHYpID0+IHYudmlzaXRCb29sQ29uc3RhbnQodGhpcyk7CiAgYWNjZXB0UmVmZXJlbmNlKFZpc2l0b3IgdikgPT4gdi52aXNpdEJvb2xDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgRGFydFR5cGUgZ2V0VHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLmJvb2xUeXBlOwp9CgpjbGFzcyBJbnRDb25zdGFudCBleHRlbmRzIFByaW1pdGl2ZUNvbnN0YW50PGludD4gewogIEludENvbnN0YW50KGludCB2YWx1ZSkgOiBzdXBlcih2YWx1ZSk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIGFjY2VwdChDb25zdGFudFZpc2l0b3IgdikgPT4gdi52aXNpdEludENvbnN0YW50KHRoaXMpOwogIGFjY2VwdFJlZmVyZW5jZShWaXNpdG9yIHYpID0+IHYudmlzaXRJbnRDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgRGFydFR5cGUgZ2V0VHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLmludFR5cGU7Cn0KCmNsYXNzIERvdWJsZUNvbnN0YW50IGV4dGVuZHMgUHJpbWl0aXZlQ29uc3RhbnQ8ZG91YmxlPiB7CiAgRG91YmxlQ29uc3RhbnQoZG91YmxlIHZhbHVlKSA6IHN1cGVyKHZhbHVlKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CiAgYWNjZXB0KENvbnN0YW50VmlzaXRvciB2KSA9PiB2LnZpc2l0RG91YmxlQ29uc3RhbnQodGhpcyk7CiAgYWNjZXB0UmVmZXJlbmNlKFZpc2l0b3IgdikgPT4gdi52aXNpdERvdWJsZUNvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHZhbHVlLmlzTmFOID8gMTk5IDogc3VwZXIuaGFzaENvZGU7CiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIG90aGVyIGlzIERvdWJsZUNvbnN0YW50ICYmIGlkZW50aWNhbCh2YWx1ZSwgb3RoZXIudmFsdWUpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZXMuZG91YmxlVHlwZTsKfQoKY2xhc3MgU3RyaW5nQ29uc3RhbnQgZXh0ZW5kcyBQcmltaXRpdmVDb25zdGFudDxTdHJpbmc+IHsKICBTdHJpbmdDb25zdGFudChTdHJpbmcgdmFsdWUpIDogc3VwZXIodmFsdWUpIHsKICAgIGFzc2VydCh2YWx1ZSAhPSBudWxsKTsKICB9CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIGFjY2VwdChDb25zdGFudFZpc2l0b3IgdikgPT4gdi52aXNpdFN0cmluZ0NvbnN0YW50KHRoaXMpOwogIGFjY2VwdFJlZmVyZW5jZShWaXNpdG9yIHYpID0+IHYudmlzaXRTdHJpbmdDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgRGFydFR5cGUgZ2V0VHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLnN0cmluZ1R5cGU7Cn0KCmNsYXNzIFN5bWJvbENvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIFJlZmVyZW5jZSBsaWJyYXJ5UmVmZXJlbmNlOwoKICBTeW1ib2xDb25zdGFudCh0aGlzLm5hbWUsIHRoaXMubGlicmFyeVJlZmVyZW5jZSk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQoKICBhY2NlcHQoQ29uc3RhbnRWaXNpdG9yIHYpID0+IHYudmlzaXRTeW1ib2xDb25zdGFudCh0aGlzKTsKICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KSA9PiB2LnZpc2l0U3ltYm9sQ29uc3RhbnRSZWZlcmVuY2UodGhpcyk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiBsaWJyYXJ5UmVmZXJlbmNlICE9IG51bGwKICAgICAgICA/ICcjJHtsaWJyYXJ5UmVmZXJlbmNlLmFzTGlicmFyeS5pbXBvcnRVcml9OjokbmFtZScKICAgICAgICA6ICcjJG5hbWUnOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfSGFzaC5oYXNoMihuYW1lLCBsaWJyYXJ5UmVmZXJlbmNlKTsKCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIGlkZW50aWNhbCh0aGlzLCBvdGhlcikgfHwKICAgICAgKG90aGVyIGlzIFN5bWJvbENvbnN0YW50ICYmCiAgICAgICAgICBvdGhlci5uYW1lID09IG5hbWUgJiYKICAgICAgICAgIG90aGVyLmxpYnJhcnlSZWZlcmVuY2UgPT0gbGlicmFyeVJlZmVyZW5jZSk7CgogIERhcnRUeXBlIGdldFR5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PiB0eXBlcy5zeW1ib2xUeXBlOwp9CgpjbGFzcyBNYXBDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKICBmaW5hbCBEYXJ0VHlwZSBrZXlUeXBlOwogIGZpbmFsIERhcnRUeXBlIHZhbHVlVHlwZTsKICBmaW5hbCBMaXN0PENvbnN0YW50TWFwRW50cnk+IGVudHJpZXM7CgogIE1hcENvbnN0YW50KHRoaXMua2V5VHlwZSwgdGhpcy52YWx1ZVR5cGUsIHRoaXMuZW50cmllcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBrZXlUeXBlLmFjY2VwdCh2KTsKICAgIHZhbHVlVHlwZS5hY2NlcHQodik7CiAgICBmb3IgKGZpbmFsIENvbnN0YW50TWFwRW50cnkgZW50cnkgaW4gZW50cmllcykgewogICAgICBlbnRyeS5rZXkuYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgICBlbnRyeS52YWx1ZS5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB9CiAgfQoKICBhY2NlcHQoQ29uc3RhbnRWaXNpdG9yIHYpID0+IHYudmlzaXRNYXBDb25zdGFudCh0aGlzKTsKICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KSA9PiB2LnZpc2l0TWFwQ29uc3RhbnRSZWZlcmVuY2UodGhpcyk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICcke3RoaXMucnVudGltZVR5cGV9PCRrZXlUeXBlLCAkdmFsdWVUeXBlPigkZW50cmllcyknOwoKICBpbnQgX2NhY2hlZEhhc2hDb2RlOwogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIF9jYWNoZWRIYXNoQ29kZSA/Pz0gX0hhc2guY29tYmluZTJGaW5pc2goCiAgICAgICAga2V5VHlwZS5oYXNoQ29kZSwgdmFsdWVUeXBlLmhhc2hDb2RlLCBfSGFzaC5jb21iaW5lTGlzdEhhc2goZW50cmllcykpOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIGlkZW50aWNhbCh0aGlzLCBvdGhlcikgfHwKICAgICAgKG90aGVyIGlzIE1hcENvbnN0YW50ICYmCiAgICAgICAgICBvdGhlci5rZXlUeXBlID09IGtleVR5cGUgJiYKICAgICAgICAgIG90aGVyLnZhbHVlVHlwZSA9PSB2YWx1ZVR5cGUgJiYKICAgICAgICAgIGxpc3RFcXVhbHMob3RoZXIuZW50cmllcywgZW50cmllcykpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4KICAgICAgdHlwZXMubGl0ZXJhbE1hcFR5cGUoa2V5VHlwZSwgdmFsdWVUeXBlKTsKfQoKY2xhc3MgQ29uc3RhbnRNYXBFbnRyeSB7CiAgZmluYWwgQ29uc3RhbnQga2V5OwogIGZpbmFsIENvbnN0YW50IHZhbHVlOwogIENvbnN0YW50TWFwRW50cnkodGhpcy5rZXksIHRoaXMudmFsdWUpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJGtleTogJHZhbHVlJzsKCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfSGFzaC5oYXNoMihrZXksIHZhbHVlKTsKCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIG90aGVyIGlzIENvbnN0YW50TWFwRW50cnkgJiYgb3RoZXIua2V5ID09IGtleSAmJiBvdGhlci52YWx1ZSA9PSB2YWx1ZTsKfQoKY2xhc3MgTGlzdENvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewogIGZpbmFsIERhcnRUeXBlIHR5cGVBcmd1bWVudDsKICBmaW5hbCBMaXN0PENvbnN0YW50PiBlbnRyaWVzOwoKICBMaXN0Q29uc3RhbnQodGhpcy50eXBlQXJndW1lbnQsIHRoaXMuZW50cmllcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB0eXBlQXJndW1lbnQuYWNjZXB0KHYpOwogICAgZm9yIChmaW5hbCBDb25zdGFudCBjb25zdGFudCBpbiBlbnRyaWVzKSB7CiAgICAgIGNvbnN0YW50LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIH0KICB9CgogIGFjY2VwdChDb25zdGFudFZpc2l0b3IgdikgPT4gdi52aXNpdExpc3RDb25zdGFudCh0aGlzKTsKICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KSA9PiB2LnZpc2l0TGlzdENvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHt0aGlzLnJ1bnRpbWVUeXBlfTwkdHlwZUFyZ3VtZW50PigkZW50cmllcyknOwoKICBpbnQgX2NhY2hlZEhhc2hDb2RlOwogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIF9jYWNoZWRIYXNoQ29kZSA/Pz0gX0hhc2guY29tYmluZUZpbmlzaCgKICAgICAgICB0eXBlQXJndW1lbnQuaGFzaENvZGUsIF9IYXNoLmNvbWJpbmVMaXN0SGFzaChlbnRyaWVzKSk7CiAgfQoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgPT4KICAgICAgaWRlbnRpY2FsKHRoaXMsIG90aGVyKSB8fAogICAgICAob3RoZXIgaXMgTGlzdENvbnN0YW50ICYmCiAgICAgICAgICBvdGhlci50eXBlQXJndW1lbnQgPT0gdHlwZUFyZ3VtZW50ICYmCiAgICAgICAgICBsaXN0RXF1YWxzKG90aGVyLmVudHJpZXMsIGVudHJpZXMpKTsKCiAgRGFydFR5cGUgZ2V0VHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+CiAgICAgIHR5cGVzLmxpdGVyYWxMaXN0VHlwZSh0eXBlQXJndW1lbnQpOwp9CgpjbGFzcyBTZXRDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKICBmaW5hbCBEYXJ0VHlwZSB0eXBlQXJndW1lbnQ7CiAgZmluYWwgTGlzdDxDb25zdGFudD4gZW50cmllczsKCiAgU2V0Q29uc3RhbnQodGhpcy50eXBlQXJndW1lbnQsIHRoaXMuZW50cmllcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB0eXBlQXJndW1lbnQuYWNjZXB0KHYpOwogICAgZm9yIChmaW5hbCBDb25zdGFudCBjb25zdGFudCBpbiBlbnRyaWVzKSB7CiAgICAgIGNvbnN0YW50LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIH0KICB9CgogIGFjY2VwdChDb25zdGFudFZpc2l0b3IgdikgPT4gdi52aXNpdFNldENvbnN0YW50KHRoaXMpOwogIGFjY2VwdFJlZmVyZW5jZShWaXNpdG9yIHYpID0+IHYudmlzaXRTZXRDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7dGhpcy5ydW50aW1lVHlwZX08JHR5cGVBcmd1bWVudD4oJGVudHJpZXMpJzsKCiAgaW50IF9jYWNoZWRIYXNoQ29kZTsKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBfY2FjaGVkSGFzaENvZGUgPz89IF9IYXNoLmNvbWJpbmVGaW5pc2goCiAgICAgICAgdHlwZUFyZ3VtZW50Lmhhc2hDb2RlLCBfSGFzaC5jb21iaW5lTGlzdEhhc2goZW50cmllcykpOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIGlkZW50aWNhbCh0aGlzLCBvdGhlcikgfHwKICAgICAgKG90aGVyIGlzIFNldENvbnN0YW50ICYmCiAgICAgICAgICBvdGhlci50eXBlQXJndW1lbnQgPT0gdHlwZUFyZ3VtZW50ICYmCiAgICAgICAgICBsaXN0RXF1YWxzKG90aGVyLmVudHJpZXMsIGVudHJpZXMpKTsKCiAgRGFydFR5cGUgZ2V0VHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLmxpdGVyYWxTZXRUeXBlKHR5cGVBcmd1bWVudCk7Cn0KCmNsYXNzIEluc3RhbmNlQ29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7CiAgZmluYWwgUmVmZXJlbmNlIGNsYXNzUmVmZXJlbmNlOwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CiAgZmluYWwgTWFwPFJlZmVyZW5jZSwgQ29uc3RhbnQ+IGZpZWxkVmFsdWVzOwoKICBJbnN0YW5jZUNvbnN0YW50KHRoaXMuY2xhc3NSZWZlcmVuY2UsIHRoaXMudHlwZUFyZ3VtZW50cywgdGhpcy5maWVsZFZhbHVlcyk7CgogIENsYXNzIGdldCBjbGFzc05vZGUgPT4gY2xhc3NSZWZlcmVuY2UuYXNDbGFzczsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGNsYXNzUmVmZXJlbmNlLmFzQ2xhc3MuYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgdmlzaXRMaXN0KHR5cGVBcmd1bWVudHMsIHYpOwogICAgZm9yIChmaW5hbCBSZWZlcmVuY2UgcmVmZXJlbmNlIGluIGZpZWxkVmFsdWVzLmtleXMpIHsKICAgICAgcmVmZXJlbmNlLmFzRmllbGQuYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgfQogICAgZm9yIChmaW5hbCBDb25zdGFudCBjb25zdGFudCBpbiBmaWVsZFZhbHVlcy52YWx1ZXMpIHsKICAgICAgY29uc3RhbnQuYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgfQogIH0KCiAgYWNjZXB0KENvbnN0YW50VmlzaXRvciB2KSA9PiB2LnZpc2l0SW5zdGFuY2VDb25zdGFudCh0aGlzKTsKICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KSA9PiB2LnZpc2l0SW5zdGFuY2VDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgZmluYWwgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnJHtjbGFzc1JlZmVyZW5jZS5hc0NsYXNzfScpOwogICAgaWYgKCFjbGFzc1JlZmVyZW5jZS5hc0NsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgc2Iud3JpdGUoJzwnKTsKICAgICAgc2Iud3JpdGUodHlwZUFyZ3VtZW50cy5tYXAoKHR5cGUpID0+IHR5cGUudG9TdHJpbmcoKSkuam9pbignLCAnKSk7CiAgICAgIHNiLndyaXRlKCc+Jyk7CiAgICB9CiAgICBzYi53cml0ZSgnIHsnKTsKICAgIGZpZWxkVmFsdWVzLmZvckVhY2goKFJlZmVyZW5jZSBmaWVsZFJlZiwgQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgICAgc2Iud3JpdGUoJyR7ZmllbGRSZWYuYXNGaWVsZC5uYW1lfTogJGNvbnN0YW50LCAnKTsKICAgIH0pOwogICAgc2Iud3JpdGUoJ30nKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgaW50IF9jYWNoZWRIYXNoQ29kZTsKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBfY2FjaGVkSGFzaENvZGUgPz89IF9IYXNoLmNvbWJpbmUyRmluaXNoKAogICAgICAgIGNsYXNzUmVmZXJlbmNlLmhhc2hDb2RlLAogICAgICAgIGxpc3RIYXNoQ29kZSh0eXBlQXJndW1lbnRzKSwKICAgICAgICBfSGFzaC5jb21iaW5lTWFwSGFzaFVub3JkZXJlZChmaWVsZFZhbHVlcykpOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIHJldHVybiBpZGVudGljYWwodGhpcywgb3RoZXIpIHx8CiAgICAgICAgKG90aGVyIGlzIEluc3RhbmNlQ29uc3RhbnQgJiYKICAgICAgICAgICAgb3RoZXIuY2xhc3NSZWZlcmVuY2UgPT0gY2xhc3NSZWZlcmVuY2UgJiYKICAgICAgICAgICAgbGlzdEVxdWFscyhvdGhlci50eXBlQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKSAmJgogICAgICAgICAgICBtYXBFcXVhbHMob3RoZXIuZmllbGRWYWx1ZXMsIGZpZWxkVmFsdWVzKSk7CiAgfQoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4KICAgICAgbmV3IEludGVyZmFjZVR5cGUoY2xhc3NOb2RlLCB0eXBlQXJndW1lbnRzKTsKfQoKY2xhc3MgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKICBmaW5hbCBUZWFyT2ZmQ29uc3RhbnQgdGVhck9mZkNvbnN0YW50OwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVzOwoKICBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KHRoaXMudGVhck9mZkNvbnN0YW50LCB0aGlzLnR5cGVzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHRlYXJPZmZDb25zdGFudC5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB2aXNpdExpc3QodHlwZXMsIHYpOwogIH0KCiAgYWNjZXB0KENvbnN0YW50VmlzaXRvciB2KSA9PiB2LnZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCh0aGlzKTsKICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KSA9PgogICAgICB2LnZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICcke3J1bnRpbWVUeXBlfSgke3RlYXJPZmZDb25zdGFudC5wcm9jZWR1cmV9PCR7dHlwZXMuam9pbignLCAnKX0+KSc7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9IYXNoLmNvbWJpbmVGaW5pc2goCiAgICAgIHRlYXJPZmZDb25zdGFudC5oYXNoQ29kZSwgX0hhc2guY29tYmluZUxpc3RIYXNoKHR5cGVzKSk7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIgaXMgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCAmJgogICAgICAgIG90aGVyLnRlYXJPZmZDb25zdGFudCA9PSB0ZWFyT2ZmQ29uc3RhbnQgJiYKICAgICAgICBsaXN0RXF1YWxzKG90aGVyLnR5cGVzLCB0eXBlcyk7CiAgfQoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpIHsKICAgIGZpbmFsIEZ1bmN0aW9uVHlwZSB0eXBlID0gdGVhck9mZkNvbnN0YW50LmdldFR5cGUodHlwZUVudmlyb25tZW50KTsKICAgIGZpbmFsIG1hcHBpbmcgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICBmb3IgKGZpbmFsIHBhcmFtZXRlciBpbiB0eXBlLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIG1hcHBpbmdbcGFyYW1ldGVyXSA9IHR5cGVzW21hcHBpbmcubGVuZ3RoXTsKICAgIH0KICAgIHJldHVybiBzdWJzdGl0dXRlKHR5cGUud2l0aG91dFR5cGVQYXJhbWV0ZXJzLCBtYXBwaW5nKTsKICB9Cn0KCmNsYXNzIFRlYXJPZmZDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKICBmaW5hbCBSZWZlcmVuY2UgcHJvY2VkdXJlUmVmZXJlbmNlOwoKICBUZWFyT2ZmQ29uc3RhbnQoUHJvY2VkdXJlIHByb2NlZHVyZSkKICAgICAgOiBwcm9jZWR1cmVSZWZlcmVuY2UgPSBwcm9jZWR1cmUucmVmZXJlbmNlIHsKICAgIGFzc2VydChwcm9jZWR1cmUuaXNTdGF0aWMpOwogIH0KCiAgVGVhck9mZkNvbnN0YW50LmJ5UmVmZXJlbmNlKHRoaXMucHJvY2VkdXJlUmVmZXJlbmNlKTsKCiAgUHJvY2VkdXJlIGdldCBwcm9jZWR1cmUgPT4gcHJvY2VkdXJlUmVmZXJlbmNlPy5hc1Byb2NlZHVyZTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHByb2NlZHVyZVJlZmVyZW5jZS5hc1Byb2NlZHVyZS5hY2NlcHRSZWZlcmVuY2Uodik7CiAgfQoKICBhY2NlcHQoQ29uc3RhbnRWaXNpdG9yIHYpID0+IHYudmlzaXRUZWFyT2ZmQ29uc3RhbnQodGhpcyk7CiAgYWNjZXB0UmVmZXJlbmNlKFZpc2l0b3IgdikgPT4gdi52aXNpdFRlYXJPZmZDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICcke3J1bnRpbWVUeXBlfSgke3Byb2NlZHVyZX0pJzsKICB9CgogIGludCBnZXQgaGFzaENvZGUgPT4gcHJvY2VkdXJlLmhhc2hDb2RlOwoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIFRlYXJPZmZDb25zdGFudCAmJiBvdGhlci5wcm9jZWR1cmUgPT0gcHJvY2VkdXJlOwogIH0KCiAgRnVuY3Rpb25UeXBlIGdldFR5cGUoVHlwZUVudmlyb25tZW50IHR5cGVzKSA9PgogICAgICBwcm9jZWR1cmUuZnVuY3Rpb24uZnVuY3Rpb25UeXBlOwp9CgpjbGFzcyBUeXBlTGl0ZXJhbENvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewogIGZpbmFsIERhcnRUeXBlIHR5cGU7CgogIFR5cGVMaXRlcmFsQ29uc3RhbnQodGhpcy50eXBlKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHR5cGUuYWNjZXB0KHYpOwogIH0KCiAgYWNjZXB0KENvbnN0YW50VmlzaXRvciB2KSA9PiB2LnZpc2l0VHlwZUxpdGVyYWxDb25zdGFudCh0aGlzKTsKICBhY2NlcHRSZWZlcmVuY2UoVmlzaXRvciB2KSA9PiB2LnZpc2l0VHlwZUxpdGVyYWxDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7cnVudGltZVR5cGV9KCR7dHlwZX0pJzsKCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0eXBlLmhhc2hDb2RlOwoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIFR5cGVMaXRlcmFsQ29uc3RhbnQgJiYgb3RoZXIudHlwZSA9PSB0eXBlOwogIH0KCiAgRGFydFR5cGUgZ2V0VHlwZShUeXBlRW52aXJvbm1lbnQgdHlwZXMpID0+IHR5cGVzLnR5cGVUeXBlOwp9CgpjbGFzcyBVbmV2YWx1YXRlZENvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewogIGZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgVW5ldmFsdWF0ZWRDb25zdGFudCh0aGlzLmV4cHJlc3Npb24pIHsKICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IG51bGw7CiAgfQoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgZXhwcmVzc2lvbi5hY2NlcHQodik7CiAgfQoKICBhY2NlcHQoQ29uc3RhbnRWaXNpdG9yIHYpID0+IHYudmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KHRoaXMpOwogIGFjY2VwdFJlZmVyZW5jZShWaXNpdG9yIHYpID0+IHYudmlzaXRVbmV2YWx1YXRlZENvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gZXhwcmVzc2lvbi5nZXRTdGF0aWNUeXBlKHR5cGVzKTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBhc0V4cHJlc3Npb24oKSA9PiBleHByZXNzaW9uOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVAovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBBIHdheSB0byBidW5kbGUgdXAgbGlicmFyaWVzIGluIGEgY29tcG9uZW50LgpjbGFzcyBDb21wb25lbnQgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgZmluYWwgQ2Fub25pY2FsTmFtZSByb290OwoKICAvLy8gUHJvYmxlbXMgaW4gdGhpcyBbQ29tcG9uZW50XSBlbmNvZGVkIGFzIGpzb24gb2JqZWN0cy4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoaXMgZmllbGQgY2FuIGJlIG51bGwsIGFuZCBieSBjb252ZW50aW9uIHNob3VsZCBiZSBudWxsIGlmIHRoZQogIC8vLyBsaXN0IGlzIGVtcHR5LgogIExpc3Q8U3RyaW5nPiBwcm9ibGVtc0FzSnNvbjsKCiAgZmluYWwgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXM7CgogIC8vLyBNYXAgZnJvbSBhIHNvdXJjZSBmaWxlIFVSSSB0byBhIGxpbmUtc3RhcnRzIHRhYmxlIGFuZCBzb3VyY2UgY29kZS4KICAvLy8gR2l2ZW4gYSBzb3VyY2UgZmlsZSBVUkkgYW5kIGEgb2Zmc2V0IGluIHRoYXQgZmlsZSBvbmUgY2FuIHRyYW5zbGF0ZQogIC8vLyBpdCB0byBhIGxpbmU6Y29sdW1uIHBvc2l0aW9uIGluIHRoYXQgZmlsZS4KICBmaW5hbCBNYXA8VXJpLCBTb3VyY2U+IHVyaVRvU291cmNlOwoKICAvLy8gTWFwcGluZyBiZXR3ZWVuIHN0cmluZyB0YWdzIGFuZCBbTWV0YWRhdGFSZXBvc2l0b3J5XSBjb3JyZXNwb25kaW5nIHRvCiAgLy8vIHRob3NlIHRhZ3MuCiAgZmluYWwgTWFwPFN0cmluZywgTWV0YWRhdGFSZXBvc2l0b3J5PGR5bmFtaWM+PiBtZXRhZGF0YSA9CiAgICAgIDxTdHJpbmcsIE1ldGFkYXRhUmVwb3NpdG9yeTxkeW5hbWljPj57fTsKCiAgLy8vIFJlZmVyZW5jZSB0byB0aGUgbWFpbiBtZXRob2QgaW4gb25lIG9mIHRoZSBsaWJyYXJpZXMuCiAgUmVmZXJlbmNlIG1haW5NZXRob2ROYW1lOwoKICBDb21wb25lbnQoCiAgICAgIHtDYW5vbmljYWxOYW1lIG5hbWVSb290LAogICAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgICAgTWFwPFVyaSwgU291cmNlPiB1cmlUb1NvdXJjZX0pCiAgICAgIDogcm9vdCA9IG5hbWVSb290ID8/IG5ldyBDYW5vbmljYWxOYW1lLnJvb3QoKSwKICAgICAgICBsaWJyYXJpZXMgPSBsaWJyYXJpZXMgPz8gPExpYnJhcnk+W10sCiAgICAgICAgdXJpVG9Tb3VyY2UgPSB1cmlUb1NvdXJjZSA/PyA8VXJpLCBTb3VyY2U+e30gewogICAgYWRvcHRDaGlsZHJlbigpOwogIH0KCiAgdm9pZCBhZG9wdENoaWxkcmVuKCkgewogICAgaWYgKGxpYnJhcmllcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgLy8gVGhlIGxpYnJhcmllcyBhcmUgb3duZWQgYnkgdGhpcyBjb21wb25lbnQsIGFuZCBzbyBhcmUgdGhlaXIgY2Fub25pY2FsCiAgICAgICAgLy8gbmFtZXMgaWYgdGhleSBleGlzdC4KICAgICAgICBMaWJyYXJ5IGxpYnJhcnkgPSBsaWJyYXJpZXNbaV07CiAgICAgICAgbGlicmFyeS5wYXJlbnQgPSB0aGlzOwogICAgICAgIENhbm9uaWNhbE5hbWUgbmFtZSA9IGxpYnJhcnkucmVmZXJlbmNlLmNhbm9uaWNhbE5hbWU7CiAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLnBhcmVudCAhPSByb290KSB7CiAgICAgICAgICByb290LmFkb3B0Q2hpbGQobmFtZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGNvbXB1dGVDYW5vbmljYWxOYW1lcygpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgIGNvbXB1dGVDYW5vbmljYWxOYW1lc0ZvckxpYnJhcnkobGlicmFyaWVzW2ldKTsKICAgIH0KICB9CgogIHZvaWQgY29tcHV0ZUNhbm9uaWNhbE5hbWVzRm9yTGlicmFyeShMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIHJvb3QuZ2V0Q2hpbGRGcm9tVXJpKGxpYnJhcnkuaW1wb3J0VXJpKS5iaW5kVG8obGlicmFyeS5yZWZlcmVuY2UpOwogICAgbGlicmFyeS5jb21wdXRlQ2Fub25pY2FsTmFtZXMoKTsKICB9CgogIHZvaWQgdW5iaW5kQ2Fub25pY2FsTmFtZXMoKSB7CiAgICByb290LnVuYmluZEFsbCgpOwogIH0KCiAgUHJvY2VkdXJlIGdldCBtYWluTWV0aG9kID0+IG1haW5NZXRob2ROYW1lPy5hc1Byb2NlZHVyZTsKCiAgdm9pZCBzZXQgbWFpbk1ldGhvZChQcm9jZWR1cmUgbWFpbikgewogICAgbWFpbk1ldGhvZE5hbWUgPSBnZXRNZW1iZXJSZWZlcmVuY2UobWFpbik7CiAgfQoKICBhY2NlcHQoVHJlZVZpc2l0b3IgdikgPT4gdi52aXNpdENvbXBvbmVudCh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChsaWJyYXJpZXMsIHYpOwogICAgbWFpbk1ldGhvZD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChsaWJyYXJpZXMsIHYsIHRoaXMpOwogIH0KCiAgQ29tcG9uZW50IGdldCBlbmNsb3NpbmdDb21wb25lbnQgPT4gdGhpczsKCiAgLy8vIFRyYW5zbGF0ZXMgYW4gb2Zmc2V0IHRvIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIGluIHRoZSBnaXZlbiBmaWxlLgogIExvY2F0aW9uIGdldExvY2F0aW9uKFVyaSBmaWxlLCBpbnQgb2Zmc2V0KSB7CiAgICByZXR1cm4gdXJpVG9Tb3VyY2VbZmlsZV0/LmdldExvY2F0aW9uKGZpbGUsIG9mZnNldCk7CiAgfQoKICB2b2lkIGFkZE1ldGFkYXRhUmVwb3NpdG9yeShNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewogICAgbWV0YWRhdGFbcmVwb3NpdG9yeS50YWddID0gcmVwb3NpdG9yeTsKICB9Cn0KCi8vLyBBIHR1cGxlIHdpdGggZmlsZSwgbGluZSwgYW5kIGNvbHVtbiBudW1iZXIsIGZvciBkaXNwbGF5aW5nIGh1bWFuLXJlYWRhYmxlCi8vLyBsb2NhdGlvbnMuCmNsYXNzIExvY2F0aW9uIHsKICBmaW5hbCBVcmkgZmlsZTsKICBmaW5hbCBpbnQgbGluZTsgLy8gMS1iYXNlZC4KICBmaW5hbCBpbnQgY29sdW1uOyAvLyAxLWJhc2VkLgoKICBMb2NhdGlvbih0aGlzLmZpbGUsIHRoaXMubGluZSwgdGhpcy5jb2x1bW4pOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJGZpbGU6JGxpbmU6JGNvbHVtbic7Cn0KCmFic3RyYWN0IGNsYXNzIE1ldGFkYXRhUmVwb3NpdG9yeTxUPiB7CiAgLy8vIFVuaXF1ZSBzdHJpbmcgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcG9zaXRvcnkuCiAgU3RyaW5nIGdldCB0YWc7CgogIC8vLyBNdXRhYmxlIG1hcHBpbmcgYmV0d2VlbiBub2RlcyBhbmQgdGhlaXIgbWV0YWRhdGEuCiAgTWFwPFRyZWVOb2RlLCBUPiBnZXQgbWFwcGluZzsKCiAgLy8vIFdyaXRlIFttZXRhZGF0YV0gb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFtOb2RlXSBpbnRvCiAgLy8vIHRoZSBnaXZlbiBbQmluYXJ5U2lua10uCiAgLy8vCiAgLy8vIE1ldGFkYXRhIGlzIHNlcmlhbGl6ZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHNlcmlhbGl6aW5nIFtub2RlXSwKICAvLy8gc28gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgY2FuIHVzZSBzZXJpYWxpemF0aW9uIGNvbnRleHQgb2YKICAvLy8gW25vZGVdJ3MgcGFyZW50cyAoc3VjaCBhcyBkZWNsYXJlZCB0eXBlIHBhcmFtZXRlcnMgYW5kIHZhcmlhYmxlcykuCiAgLy8vIEluIG9yZGVyIHRvIHVzZSBzY29wZSBkZWNsYXJlZCBieSB0aGUgW25vZGVdIGl0c2VsZiwgaW1wbGVtZW50YXRpb24gb2YKICAvLy8gdGhpcyBtZXRob2QgY2FuIHVzZSBbQmluYXJ5U2luay5lbnRlclNjb3BlXSBhbmQgW0JpbmFyeVNpbmsubGVhdmVTY29wZV0KICAvLy8gbWV0aG9kcy4KICAvLy8KICAvLy8gW21ldGFkYXRhXSBtdXN0IGJlIGFuIG9iamVjdCBvd25lZCBieSB0aGlzIHJlcG9zaXRvcnkuCiAgdm9pZCB3cml0ZVRvQmluYXJ5KFQgbWV0YWRhdGEsIE5vZGUgbm9kZSwgQmluYXJ5U2luayBzaW5rKTsKCiAgLy8vIENvbnN0cnVjdCBhIG1ldGFkYXRhIG9iamVjdCBmcm9tIGl0cyBiaW5hcnkgcGF5bG9hZCByZWFkIGZyb20gdGhlCiAgLy8vIGdpdmVuIFtCaW5hcnlTb3VyY2VdLgogIC8vLwogIC8vLyBNZXRhZGF0YSBpcyBkZXNlcmlhbGl6ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVzZXJpYWxpemluZyBbbm9kZV0sCiAgLy8vIHNvIGl0IGNhbiB1c2UgZGVzZXJpYWxpemF0aW9uIGNvbnRleHQgb2YgW25vZGVdJ3MgcGFyZW50cy4KICAvLy8gSW4gb3JkZXIgdG8gdXNlIHNjb3BlIGRlY2xhcmVkIGJ5IHRoZSBbbm9kZV0gaXRzZWxmLCBpbXBsZW1lbnRhdGlvbiBvZgogIC8vLyB0aGlzIG1ldGhvZCBjYW4gdXNlIFtCaW5hcnlTb3VyY2UuZW50ZXJTY29wZV0gYW5kCiAgLy8vIFtCaW5hcnlTb3VyY2UubGVhdmVTY29wZV0gbWV0aG9kcy4KICBUIHJlYWRGcm9tQmluYXJ5KE5vZGUgbm9kZSwgQmluYXJ5U291cmNlIHNvdXJjZSk7CgogIC8vLyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBhIG5vZGUgY2FuIGhhdmUgbWV0YWRhdGEgYXR0YWNoZWQgdG8gaXQKICAvLy8gb3IgcmVmZXJlbmNlZCBmcm9tIHRoZSBtZXRhZGF0YSBwYXlsb2FkLgogIC8vLwogIC8vLyBDdXJyZW50bHkgZHVlIHRvIGJpbmFyeSBmb3JtYXQgc3BlY2lmaWNzIENhdGNoIGFuZCBNYXBFbnRyeSBub2RlcwogIC8vLyBjYW4ndCBoYXZlIG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoZW0uCiAgc3RhdGljIGJvb2wgaXNTdXBwb3J0ZWQoVHJlZU5vZGUgbm9kZSkgewogICAgcmV0dXJuICEobm9kZSBpcyBNYXBFbnRyeSB8fCBub2RlIGlzIENhdGNoKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEJpbmFyeVNpbmsgewogIGludCBnZXRCdWZmZXJPZmZzZXQoKTsKCiAgdm9pZCB3cml0ZUJ5dGUoaW50IGJ5dGUpOwogIHZvaWQgd3JpdGVCeXRlcyhMaXN0PGludD4gYnl0ZXMpOwogIHZvaWQgd3JpdGVVSW50MzIoaW50IHZhbHVlKTsKICB2b2lkIHdyaXRlVUludDMwKGludCB2YWx1ZSk7CgogIC8vLyBXcml0ZSBMaXN0PEJ5dGU+IGludG8gdGhlIHNpbmsuCiAgdm9pZCB3cml0ZUJ5dGVMaXN0KExpc3Q8aW50PiBieXRlcyk7CgogIHZvaWQgd3JpdGVOdWxsQWxsb3dlZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoQ2Fub25pY2FsTmFtZSBuYW1lKTsKICB2b2lkIHdyaXRlU3RyaW5nUmVmZXJlbmNlKFN0cmluZyBzdHIpOwogIHZvaWQgd3JpdGVOYW1lKE5hbWUgbm9kZSk7CiAgdm9pZCB3cml0ZURhcnRUeXBlKERhcnRUeXBlIHR5cGUpOwogIHZvaWQgd3JpdGVOb2RlKE5vZGUgbm9kZSk7CgogIHZvaWQgZW50ZXJTY29wZSgKICAgICAge0xpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsCiAgICAgIGJvb2wgbWVtYmVyU2NvcGU6IGZhbHNlLAogICAgICBib29sIHZhcmlhYmxlU2NvcGU6IGZhbHNlfSk7CiAgdm9pZCBsZWF2ZVNjb3BlKAogICAgICB7TGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywKICAgICAgYm9vbCBtZW1iZXJTY29wZTogZmFsc2UsCiAgICAgIGJvb2wgdmFyaWFibGVTY29wZTogZmFsc2V9KTsKfQoKYWJzdHJhY3QgY2xhc3MgQmluYXJ5U291cmNlIHsKICBpbnQgZ2V0IGN1cnJlbnRPZmZzZXQ7CiAgTGlzdDxpbnQ+IGdldCBieXRlczsKCiAgaW50IHJlYWRCeXRlKCk7CiAgTGlzdDxpbnQ+IHJlYWRCeXRlcyhpbnQgbGVuZ3RoKTsKICBpbnQgcmVhZFVJbnQoKTsKICBpbnQgcmVhZFVpbnQzMigpOwoKICAvLy8gUmVhZCBMaXN0PEJ5dGU+IGZyb20gdGhlIHNvdXJjZS4KICBMaXN0PGludD4gcmVhZEJ5dGVMaXN0KCk7CgogIENhbm9uaWNhbE5hbWUgcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKTsKICBTdHJpbmcgcmVhZFN0cmluZ1JlZmVyZW5jZSgpOwogIE5hbWUgcmVhZE5hbWUoKTsKICBEYXJ0VHlwZSByZWFkRGFydFR5cGUoKTsKICBGdW5jdGlvbk5vZGUgcmVhZEZ1bmN0aW9uTm9kZSgpOwoKICB2b2lkIGVudGVyU2NvcGUoe0xpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnN9KTsKICB2b2lkIGxlYXZlU2NvcGUoe0xpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnN9KTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFUk5BTCBGVU5DVElPTlMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp2b2lkIHNldFBhcmVudHMoTGlzdDxUcmVlTm9kZT4gbm9kZXMsIFRyZWVOb2RlIHBhcmVudCkgewogIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyArK2kpIHsKICAgIG5vZGVzW2ldLnBhcmVudCA9IHBhcmVudDsKICB9Cn0KCnZvaWQgdmlzaXRMaXN0KExpc3Q8Tm9kZT4gbm9kZXMsIFZpc2l0b3IgdmlzaXRvcikgewogIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyArK2kpIHsKICAgIG5vZGVzW2ldLmFjY2VwdCh2aXNpdG9yKTsKICB9Cn0KCnZvaWQgdmlzaXRJdGVyYWJsZShJdGVyYWJsZTxOb2RlPiBub2RlcywgVmlzaXRvciB2aXNpdG9yKSB7CiAgZm9yICh2YXIgbm9kZSBpbiBub2RlcykgewogICAgbm9kZS5hY2NlcHQodmlzaXRvcik7CiAgfQp9Cgp2b2lkIHRyYW5zZm9ybVR5cGVMaXN0KExpc3Q8RGFydFR5cGU+IG5vZGVzLCBUcmFuc2Zvcm1lciB2aXNpdG9yKSB7CiAgaW50IHN0b3JlSW5kZXggPSAwOwogIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyArK2kpIHsKICAgIHZhciByZXN1bHQgPSB2aXNpdG9yLnZpc2l0RGFydFR5cGUobm9kZXNbaV0pOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgIG5vZGVzW3N0b3JlSW5kZXhdID0gcmVzdWx0OwogICAgICArK3N0b3JlSW5kZXg7CiAgICB9CiAgfQogIGlmIChzdG9yZUluZGV4IDwgbm9kZXMubGVuZ3RoKSB7CiAgICBub2Rlcy5sZW5ndGggPSBzdG9yZUluZGV4OwogIH0KfQoKdm9pZCB0cmFuc2Zvcm1TdXBlcnR5cGVMaXN0KExpc3Q8U3VwZXJ0eXBlPiBub2RlcywgVHJhbnNmb3JtZXIgdmlzaXRvcikgewogIGludCBzdG9yZUluZGV4ID0gMDsKICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgKytpKSB7CiAgICB2YXIgcmVzdWx0ID0gdmlzaXRvci52aXNpdFN1cGVydHlwZShub2Rlc1tpXSk7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgbm9kZXNbc3RvcmVJbmRleF0gPSByZXN1bHQ7CiAgICAgICsrc3RvcmVJbmRleDsKICAgIH0KICB9CiAgaWYgKHN0b3JlSW5kZXggPCBub2Rlcy5sZW5ndGgpIHsKICAgIG5vZGVzLmxlbmd0aCA9IHN0b3JlSW5kZXg7CiAgfQp9Cgp2b2lkIHRyYW5zZm9ybUxpc3QoTGlzdDxUcmVlTm9kZT4gbm9kZXMsIFRyYW5zZm9ybWVyIHZpc2l0b3IsIFRyZWVOb2RlIHBhcmVudCkgewogIGludCBzdG9yZUluZGV4ID0gMDsKICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgKytpKSB7CiAgICB2YXIgcmVzdWx0ID0gbm9kZXNbaV0uYWNjZXB0KHZpc2l0b3IpOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgIG5vZGVzW3N0b3JlSW5kZXhdID0gcmVzdWx0OwogICAgICByZXN1bHQucGFyZW50ID0gcGFyZW50OwogICAgICArK3N0b3JlSW5kZXg7CiAgICB9CiAgfQogIGlmIChzdG9yZUluZGV4IDwgbm9kZXMubGVuZ3RoKSB7CiAgICBub2Rlcy5sZW5ndGggPSBzdG9yZUluZGV4OwogIH0KfQoKTGlzdDxEYXJ0VHlwZT4gX2dldEFzVHlwZUFyZ3VtZW50cyhMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CiAgaWYgKHR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybiBjb25zdCA8RGFydFR5cGU+W107CiAgcmV0dXJuIG5ldyBMaXN0PERhcnRUeXBlPi5nZW5lcmF0ZSgKICAgICAgdHlwZVBhcmFtZXRlcnMubGVuZ3RoLCAoaSkgPT4gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKHR5cGVQYXJhbWV0ZXJzW2ldKSwKICAgICAgZ3Jvd2FibGU6IGZhbHNlKTsKfQoKY2xhc3MgX0NoaWxkUmVwbGFjZXIgZXh0ZW5kcyBUcmFuc2Zvcm1lciB7CiAgZmluYWwgVHJlZU5vZGUgY2hpbGQ7CiAgZmluYWwgVHJlZU5vZGUgcmVwbGFjZW1lbnQ7CgogIF9DaGlsZFJlcGxhY2VyKHRoaXMuY2hpbGQsIHRoaXMucmVwbGFjZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBkZWZhdWx0VHJlZU5vZGUoVHJlZU5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gY2hpbGQpIHsKICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQp9CgpjbGFzcyBTb3VyY2UgewogIGZpbmFsIExpc3Q8aW50PiBsaW5lU3RhcnRzOwoKICBmaW5hbCBMaXN0PGludD4gc291cmNlOwoKICBmaW5hbCBVcmkgaW1wb3J0VXJpOwoKICBmaW5hbCBVcmkgZmlsZVVyaTsKCiAgU3RyaW5nIGNhY2hlZFRleHQ7CgogIFNvdXJjZSh0aGlzLmxpbmVTdGFydHMsIHRoaXMuc291cmNlLCB0aGlzLmltcG9ydFVyaSwgdGhpcy5maWxlVXJpKTsKCiAgLy8vIFJldHVybiB0aGUgdGV4dCBjb3JyZXNwb25kaW5nIHRvIFtsaW5lXSB3aGljaCBpcyBhIDEtYmFzZWQgbGluZQogIC8vLyBudW1iZXIuIFRoZSByZXR1cm5lZCBsaW5lIGNvbnRhaW5zIG5vIGxpbmUgc2VwYXJhdG9ycy4KICBTdHJpbmcgZ2V0VGV4dExpbmUoaW50IGxpbmUpIHsKICAgIGlmIChzb3VyY2UgPT0gbnVsbCB8fAogICAgICAgIHNvdXJjZS5pc0VtcHR5IHx8CiAgICAgICAgbGluZVN0YXJ0cyA9PSBudWxsIHx8CiAgICAgICAgbGluZVN0YXJ0cy5pc0VtcHR5KSByZXR1cm4gbnVsbDsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWx1ZUluSW50ZXJ2YWwobGluZSwgMSwgbGluZVN0YXJ0cy5sZW5ndGgsICdsaW5lJyk7CgogICAgY2FjaGVkVGV4dCA/Pz0gdXRmOC5kZWNvZGUoc291cmNlLCBhbGxvd01hbGZvcm1lZDogdHJ1ZSk7CiAgICAvLyAtMSBhcyBsaW5lIG51bWJlcnMgc3RhcnQgYXQgMS4KICAgIGludCBpbmRleCA9IGxpbmUgLSAxOwogICAgaWYgKGluZGV4ICsgMSA9PSBsaW5lU3RhcnRzLmxlbmd0aCkgewogICAgICAvLyBMYXN0IGxpbmUuCiAgICAgIHJldHVybiBjYWNoZWRUZXh0LnN1YnN0cmluZyhsaW5lU3RhcnRzW2luZGV4XSk7CiAgICB9IGVsc2UgaWYgKGluZGV4IDwgbGluZVN0YXJ0cy5sZW5ndGgpIHsKICAgICAgLy8gV2Ugc3VidHJhY3QgMSBmcm9tIHRoZSBuZXh0IGxpbmUgZm9yIHR3byByZWFzb25zOgogICAgICAvLyAxLiBJZiB0aGUgZmlsZSBpc24ndCB0ZXJtaW5hdGVkIGJ5IGEgbmV3bGluZSwgdGhhdCBpbmRleCBpcyBpbnZhbGlkLgogICAgICAvLyAyLiBUbyByZW1vdmUgdGhlIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4KICAgICAgaW50IGVuZE9mTGluZSA9IGxpbmVTdGFydHNbaW5kZXggKyAxXSAtIDE7CiAgICAgIGlmIChlbmRPZkxpbmUgPiBpbmRleCAmJiBjYWNoZWRUZXh0W2VuZE9mTGluZSAtIDFdID09ICJcciIpIHsKICAgICAgICAtLWVuZE9mTGluZTsgLy8gV2luZG93cyBsaW5lIGVuZGluZ3MuCiAgICAgIH0KICAgICAgcmV0dXJuIGNhY2hlZFRleHQuc3Vic3RyaW5nKGxpbmVTdGFydHNbaW5kZXhdLCBlbmRPZkxpbmUpOwogICAgfQogICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuOiBzaG91bGQgaGF2ZSBiZWVuIGNhdWdodCBieSB0aGUgcmFuZ2UgY2hlY2sgYWJvdmUuCiAgICB0aHJvdyAiSW50ZXJuYWwgZXJyb3IiOwogIH0KCiAgLy8vIFRyYW5zbGF0ZXMgYW4gb2Zmc2V0IHRvIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIGluIHRoZSBnaXZlbiBmaWxlLgogIExvY2F0aW9uIGdldExvY2F0aW9uKFVyaSBmaWxlLCBpbnQgb2Zmc2V0KSB7CiAgICBpZiAobGluZVN0YXJ0cyA9PSBudWxsIHx8IGxpbmVTdGFydHMuaXNFbXB0eSkgewogICAgICByZXR1cm4gbmV3IExvY2F0aW9uKGZpbGUsIFRyZWVOb2RlLm5vT2Zmc2V0LCBUcmVlTm9kZS5ub09mZnNldCk7CiAgICB9CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsdWVJbkludGVydmFsKG9mZnNldCwgMCwgbGluZVN0YXJ0cy5sYXN0LCAnb2Zmc2V0Jyk7CiAgICBpbnQgbG93ID0gMCwgaGlnaCA9IGxpbmVTdGFydHMubGVuZ3RoIC0gMTsKICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7CiAgICAgIGludCBtaWQgPSBoaWdoIC0gKChoaWdoIC0gbG93KSA+PiAxKTsgLy8gR2V0IG1pZGRsZSwgcm91bmRpbmcgdXAuCiAgICAgIGludCBwaXZvdCA9IGxpbmVTdGFydHNbbWlkXTsKICAgICAgaWYgKHBpdm90IDw9IG9mZnNldCkgewogICAgICAgIGxvdyA9IG1pZDsKICAgICAgfSBlbHNlIHsKICAgICAgICBoaWdoID0gbWlkIC0gMTsKICAgICAgfQogICAgfQogICAgaW50IGxpbmVJbmRleCA9IGxvdzsKICAgIGludCBsaW5lU3RhcnQgPSBsaW5lU3RhcnRzW2xpbmVJbmRleF07CiAgICBpbnQgbGluZU51bWJlciA9IDEgKyBsaW5lSW5kZXg7CiAgICBpbnQgY29sdW1uTnVtYmVyID0gMSArIG9mZnNldCAtIGxpbmVTdGFydDsKICAgIHJldHVybiBuZXcgTG9jYXRpb24oZmlsZSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyKTsKICB9Cn0KCi8vLyBSZXR1cm5zIHRoZSBbUmVmZXJlbmNlXSBvYmplY3QgZm9yIHRoZSBnaXZlbiBtZW1iZXIuCi8vLwovLy8gUmV0dXJucyBgbnVsbGAgaWYgdGhlIG1lbWJlciBpcyBgbnVsbGAuClJlZmVyZW5jZSBnZXRNZW1iZXJSZWZlcmVuY2UoTWVtYmVyIG1lbWJlcikgewogIHJldHVybiBtZW1iZXI/LnJlZmVyZW5jZTsKfQoKLy8vIFJldHVybnMgdGhlIFtSZWZlcmVuY2VdIG9iamVjdCBmb3IgdGhlIGdpdmVuIGNsYXNzLgovLy8KLy8vIFJldHVybnMgYG51bGxgIGlmIHRoZSBjbGFzcyBpcyBgbnVsbGAuClJlZmVyZW5jZSBnZXRDbGFzc1JlZmVyZW5jZShDbGFzcyBjbGFzc18pIHsKICByZXR1cm4gY2xhc3NfPy5yZWZlcmVuY2U7Cn0KCi8vLyBSZXR1cm5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBbbWVtYmVyXSwgb3IgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUKLy8vIG1lbWJlciBoYXMgbm90IGJlZW4gYXNzaWduZWQgYSBjYW5vbmljYWwgbmFtZSB5ZXQuCi8vLwovLy8gUmV0dXJucyBgbnVsbGAgaWYgdGhlIG1lbWJlciBpcyBgbnVsbGAuCkNhbm9uaWNhbE5hbWUgZ2V0Q2Fub25pY2FsTmFtZU9mTWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKICBpZiAobWVtYmVyID09IG51bGwpIHJldHVybiBudWxsOwogIGlmIChtZW1iZXIuY2Fub25pY2FsTmFtZSA9PSBudWxsKSB7CiAgICB0aHJvdyAnJG1lbWJlciBoYXMgbm8gY2Fub25pY2FsIG5hbWUnOwogIH0KICByZXR1cm4gbWVtYmVyLmNhbm9uaWNhbE5hbWU7Cn0KCi8vLyBSZXR1cm5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBbY2xhc3NfXSwgb3IgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUKLy8vIGNsYXNzIGhhcyBub3QgYmVlbiBhc3NpZ25lZCBhIGNhbm9uaWNhbCBuYW1lIHlldC4KLy8vCi8vLyBSZXR1cm5zIGBudWxsYCBpZiB0aGUgY2xhc3MgaXMgYG51bGxgLgpDYW5vbmljYWxOYW1lIGdldENhbm9uaWNhbE5hbWVPZkNsYXNzKENsYXNzIGNsYXNzXykgewogIGlmIChjbGFzc18gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgaWYgKGNsYXNzXy5jYW5vbmljYWxOYW1lID09IG51bGwpIHsKICAgIHRocm93ICckY2xhc3NfIGhhcyBubyBjYW5vbmljYWwgbmFtZSc7CiAgfQogIHJldHVybiBjbGFzc18uY2Fub25pY2FsTmFtZTsKfQoKLy8vIFJldHVybnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIFtsaWJyYXJ5XSwgb3IgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUKLy8vIGxpYnJhcnkgaGFzIG5vdCBiZWVuIGFzc2lnbmVkIGEgY2Fub25pY2FsIG5hbWUgeWV0LgovLy8KLy8vIFJldHVybnMgYG51bGxgIGlmIHRoZSBsaWJyYXJ5IGlzIGBudWxsYC4KQ2Fub25pY2FsTmFtZSBnZXRDYW5vbmljYWxOYW1lT2ZMaWJyYXJ5KExpYnJhcnkgbGlicmFyeSkgewogIGlmIChsaWJyYXJ5ID09IG51bGwpIHJldHVybiBudWxsOwogIGlmIChsaWJyYXJ5LmNhbm9uaWNhbE5hbWUgPT0gbnVsbCkgewogICAgdGhyb3cgJyRsaWJyYXJ5IGhhcyBubyBjYW5vbmljYWwgbmFtZSc7CiAgfQogIHJldHVybiBsaWJyYXJ5LmNhbm9uaWNhbE5hbWU7Cn0KCi8vLyBNdXJtdXItaW5zcGlyZWQgaGFzaGluZywgd2l0aCBhIGZhbGwtYmFjayB0byBKZW5raW5zLWluc3BpcmVkIGhhc2hpbmcgd2hlbgovLy8gY29tcGlsZWQgdG8gSmF2YVNjcmlwdC4KLy8vCi8vLyBBIGhhc2ggZnVuY3Rpb24gc2hvdWxkIGJlIGNvbnN0cnVjdGVkIG9mIHNldmVyYWwgW2NvbWJpbmVdIGNhbGxzIGZvbGxvd2VkIGJ5Ci8vLyBhIFtmaW5pc2hdIGNhbGwuCmNsYXNzIF9IYXNoIHsKICBzdGF0aWMgY29uc3QgaW50IE0gPSAweDlkZGZlYTA4ZWIzODIwMDAgKyAweGQ2OTsKICBzdGF0aWMgY29uc3QgYm9vbCBpbnRJczY0Qml0ID0gKDEgPDwgNjMpICE9IDA7CgogIC8vLyBQcmltaXRpdmUgaGFzaCBjb21iaW5pbmcgc3RlcC4KICBzdGF0aWMgaW50IGNvbWJpbmUoaW50IHZhbHVlLCBpbnQgaGFzaCkgewogICAgaWYgKGludElzNjRCaXQpIHsKICAgICAgdmFsdWUgKj0gTTsKICAgICAgdmFsdWUgXj0gX3NocnUodmFsdWUsIDQ3KTsKICAgICAgdmFsdWUgKj0gTTsKICAgICAgaGFzaCBePSB2YWx1ZTsKICAgICAgaGFzaCAqPSBNOwogICAgfSBlbHNlIHsKICAgICAgLy8gRmFsbCBiYWNrIHRvIEplbmtpbnMtaW5zcGlyZWQgaGFzaGluZyBvbiBKYXZhU2NyaXB0IHBsYXRmb3Jtcy4KICAgICAgaGFzaCA9IDB4MWZmZmZmZmYgJiAoaGFzaCArIHZhbHVlKTsKICAgICAgaGFzaCA9IDB4MWZmZmZmZmYgJiAoaGFzaCArICgoMHgwMDA3ZmZmZiAmIGhhc2gpIDw8IDEwKSk7CiAgICAgIGhhc2ggPSBoYXNoIF4gKGhhc2ggPj4gNik7CiAgICB9CiAgICByZXR1cm4gaGFzaDsKICB9CgogIC8vLyBQcmltaXRpdmUgaGFzaCBmaW5hbGl6YXRpb24gc3RlcC4KICBzdGF0aWMgaW50IGZpbmlzaChpbnQgaGFzaCkgewogICAgaWYgKGludElzNjRCaXQpIHsKICAgICAgaGFzaCBePSBfc2hydShoYXNoLCA0NCk7CiAgICAgIGhhc2ggKj0gTTsKICAgICAgaGFzaCBePSBfc2hydShoYXNoLCA0MSk7CiAgICB9IGVsc2UgewogICAgICAvLyBGYWxsIGJhY2sgdG8gSmVua2lucy1pbnNwaXJlZCBoYXNoaW5nIG9uIEphdmFTY3JpcHQgcGxhdGZvcm1zLgogICAgICBoYXNoID0gMHgxZmZmZmZmZiAmIChoYXNoICsgKCgweDAzZmZmZmZmICYgaGFzaCkgPDwgMykpOwogICAgICBoYXNoID0gaGFzaCBeIChoYXNoID4+IDExKTsKICAgICAgaGFzaCA9IDB4MWZmZmZmZmYgJiAoaGFzaCArICgoMHgwMDAwM2ZmZiAmIGhhc2gpIDw8IDE1KSk7CiAgICB9CiAgICByZXR1cm4gaGFzaDsKICB9CgogIHN0YXRpYyBpbnQgY29tYmluZUZpbmlzaChpbnQgdmFsdWUsIGludCBoYXNoKSB7CiAgICByZXR1cm4gZmluaXNoKGNvbWJpbmUodmFsdWUsIGhhc2gpKTsKICB9CgogIHN0YXRpYyBpbnQgY29tYmluZTIoaW50IHZhbHVlMSwgaW50IHZhbHVlMiwgaW50IGhhc2gpIHsKICAgIHJldHVybiBjb21iaW5lKHZhbHVlMiwgY29tYmluZSh2YWx1ZTEsIGhhc2gpKTsKICB9CgogIHN0YXRpYyBpbnQgY29tYmluZTJGaW5pc2goaW50IHZhbHVlMSwgaW50IHZhbHVlMiwgaW50IGhhc2gpIHsKICAgIHJldHVybiBmaW5pc2goY29tYmluZTIodmFsdWUxLCB2YWx1ZTIsIGhhc2gpKTsKICB9CgogIHN0YXRpYyBpbnQgaGFzaDIoT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyKSB7CiAgICByZXR1cm4gY29tYmluZTJGaW5pc2gob2JqZWN0Mi5oYXNoQ29kZSwgb2JqZWN0Mi5oYXNoQ29kZSwgMCk7CiAgfQoKICBzdGF0aWMgaW50IGNvbWJpbmVMaXN0SGFzaChMaXN0IGxpc3QsIFtpbnQgaGFzaCA9IDFdKSB7CiAgICBmb3IgKHZhciBpdGVtIGluIGxpc3QpIHsKICAgICAgaGFzaCA9IF9IYXNoLmNvbWJpbmUoaXRlbS5oYXNoQ29kZSwgaGFzaCk7CiAgICB9CiAgICByZXR1cm4gaGFzaDsKICB9CgogIHN0YXRpYyBpbnQgY29tYmluZUxpc3QoTGlzdDxpbnQ+IGhhc2hlcywgaW50IGhhc2gpIHsKICAgIGZvciAodmFyIGl0ZW0gaW4gaGFzaGVzKSB7CiAgICAgIGhhc2ggPSBjb21iaW5lKGl0ZW0sIGhhc2gpOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBzdGF0aWMgaW50IGNvbWJpbmVNYXBIYXNoVW5vcmRlcmVkKE1hcCBtYXAsIFtpbnQgaGFzaCA9IDJdKSB7CiAgICBpZiAobWFwID09IG51bGwgfHwgbWFwLmlzRW1wdHkpIHJldHVybiBoYXNoOwogICAgTGlzdDxpbnQ+IGVudHJ5SGFzaGVzID0gTGlzdChtYXAubGVuZ3RoKTsKICAgIGludCBpID0gMDsKICAgIGZvciAodmFyIGVudHJ5IGluIG1hcC5lbnRyaWVzKSB7CiAgICAgIGVudHJ5SGFzaGVzW2krK10gPSBjb21iaW5lKGVudHJ5LmtleS5oYXNoQ29kZSwgZW50cnkudmFsdWUuaGFzaENvZGUpOwogICAgfQogICAgZW50cnlIYXNoZXMuc29ydCgpOwogICAgcmV0dXJuIGNvbWJpbmVMaXN0KGVudHJ5SGFzaGVzLCBoYXNoKTsKICB9CgogIC8vIFRPRE8oc3JhKTogUmVwbGFjZSB3aXRoICc+Pj4nLgogIHN0YXRpYyBpbnQgX3NocnUoaW50IHYsIGludCBuKSB7CiAgICBhc3NlcnQobiA+PSAxKTsKICAgIGFzc2VydChpbnRJczY0Qml0KTsKICAgIHJldHVybiAoKHYgPj4gMSkgJiAoMHg3ZmZmRkZGRmZmZmZGMDAwICsgMHhGRkYpKSA+PiAobiAtIDEpOwogIH0KfQoKaW50IGxpc3RIYXNoQ29kZShMaXN0IGxpc3QpIHsKICByZXR1cm4gX0hhc2guZmluaXNoKF9IYXNoLmNvbWJpbmVMaXN0SGFzaChsaXN0KSk7Cn0KCmludCBtYXBIYXNoQ29kZShNYXAgbWFwKSB7CiAgcmV0dXJuIG1hcEhhc2hDb2RlVW5vcmRlcmVkKG1hcCk7Cn0KCmludCBtYXBIYXNoQ29kZU9yZGVyZWQoTWFwIG1hcCwgW2ludCBoYXNoID0gMl0pIHsKICBmb3IgKGZpbmFsIE9iamVjdCB4IGluIG1hcC5rZXlzKSBoYXNoID0gX0hhc2guY29tYmluZSh4Lmhhc2hDb2RlLCBoYXNoKTsKICBmb3IgKGZpbmFsIE9iamVjdCB4IGluIG1hcC52YWx1ZXMpIGhhc2ggPSBfSGFzaC5jb21iaW5lKHguaGFzaENvZGUsIGhhc2gpOwogIHJldHVybiBfSGFzaC5maW5pc2goaGFzaCk7Cn0KCmludCBtYXBIYXNoQ29kZVVub3JkZXJlZChNYXAgbWFwKSB7CiAgcmV0dXJuIF9IYXNoLmZpbmlzaChfSGFzaC5jb21iaW5lTWFwSGFzaFVub3JkZXJlZChtYXApKTsKfQoKYm9vbCBsaXN0RXF1YWxzKExpc3QgYSwgTGlzdCBiKSB7CiAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoYVtpXSAhPSBiW2ldKSByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB0cnVlOwp9Cgpib29sIG1hcEVxdWFscyhNYXAgYSwgTWFwIGIpIHsKICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTsKICBmb3IgKGZpbmFsIE9iamVjdCBrZXkgaW4gYS5rZXlzKSB7CiAgICBpZiAoIWIuY29udGFpbnNLZXkoa2V5KSB8fCBhW2tleV0gIT0gYltrZXldKSByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB0cnVlOwp9CgovLy8gUmV0dXJucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgW3R5cGVkZWZfXSwgb3IgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUKLy8vIHR5cGVkZWYgaGFzIG5vdCBiZWVuIGFzc2lnbmVkIGEgY2Fub25pY2FsIG5hbWUgeWV0LgovLy8KLy8vIFJldHVybnMgYG51bGxgIGlmIHRoZSB0eXBlZGVmIGlzIGBudWxsYC4KQ2Fub25pY2FsTmFtZSBnZXRDYW5vbmljYWxOYW1lT2ZUeXBlZGVmKFR5cGVkZWYgdHlwZWRlZl8pIHsKICBpZiAodHlwZWRlZl8gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgaWYgKHR5cGVkZWZfLmNhbm9uaWNhbE5hbWUgPT0gbnVsbCkgewogICAgdGhyb3cgJyR0eXBlZGVmXyBoYXMgbm8gY2Fub25pY2FsIG5hbWUnOwogIH0KICByZXR1cm4gdHlwZWRlZl8uY2Fub25pY2FsTmFtZTsKfQoKLy8vIEFubm90YXRpb24gZGVzY3JpYmluZyBpbmZvcm1hdGlvbiB3aGljaCBpcyBub3QgcGFydCBvZiBEYXJ0IHNlbWFudGljczsgaW4KLy8vIG90aGVyIHdvcmRzLCBpZiB0aGlzIGluZm9ybWF0aW9uIChvciBhbnkgaW5mb3JtYXRpb24gaXQgcmVmZXJzIHRvKSBjaGFuZ2VzLAovLy8gc3RhdGljIGFuYWx5c2lzIGFuZCBydW50aW1lIGJlaGF2aW9yIG9mIHRoZSBsaWJyYXJ5IGFyZSB1bmFmZmVjdGVkLgpjb25zdCBpbmZvcm1hdGl2ZSA9IG51bGw7CgpMb2NhdGlvbiBfZ2V0TG9jYXRpb25JbkNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50LCBVcmkgZmlsZVVyaSwgaW50IG9mZnNldCkgewogIGlmIChjb21wb25lbnQgIT0gbnVsbCkgewogICAgcmV0dXJuIGNvbXBvbmVudC5nZXRMb2NhdGlvbihmaWxlVXJpLCBvZmZzZXQpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gbmV3IExvY2F0aW9uKGZpbGVVcmksIFRyZWVOb2RlLm5vT2Zmc2V0LCBUcmVlTm9kZS5ub09mZnNldCk7CiAgfQp9CgovLy8gQ29udmVydCB0aGUgc3ludGhldGljIG5hbWUgb2YgYW4gaW1wbGljaXQgbWl4aW4gYXBwbGljYXRpb24gY2xhc3MKLy8vIGludG8gYSBuYW1lIHN1aXRhYmxlIGZvciB1c2VyLWZhY2VkIHN0cmluZ3MuCi8vLwovLy8gRm9yIGV4YW1wbGUsIHdoZW4gY29tcGlsaW5nICJjbGFzcyBBIGV4dGVuZHMgUyB3aXRoIE0xLCBNMiIsIHRoZQovLy8gdHdvIHN5bnRoZXRpYyBjbGFzc2VzIHdpbGwgYmUgbmFtZWQgIl9BJlMmTTEiIGFuZCAiX0EmUyZNMSZNMiIuCi8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuICJTIHdpdGggTTEiIGFuZCAiUyB3aXRoIE0xLCBNMiIsIHJlc3BlY3RpdmVseS4KU3RyaW5nIGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUoU3RyaW5nIG5hbWUpIHsKICBMaXN0PFN0cmluZz4gbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgnJicpOwogIGlmIChuYW1lUGFydHMubGVuZ3RoIDwgMiB8fCBuYW1lID09ICImIikgcmV0dXJuIG5hbWU7CiAgU3RyaW5nIGRlbWFuZ2xlZE5hbWUgPSBuYW1lUGFydHNbMV07CiAgZm9yIChpbnQgaSA9IDI7IGkgPCBuYW1lUGFydHMubGVuZ3RoOyBpKyspIHsKICAgIGRlbWFuZ2xlZE5hbWUgKz0gKGkgPT0gMiA/ICIgd2l0aCAiIDogIiwgIikgKyBuYW1lUGFydHNbaV07CiAgfQogIHJldHVybiBkZW1hbmdsZWROYW1lOwp9CgovLy8gRXh0cmFjdCBmcm9tIHRoZSBzeW50aGV0aWMgbmFtZSBvZiBhbiBpbXBsaWNpdCBtaXhpbiBhcHBsaWNhdGlvbiBjbGFzcwovLy8gdGhlIG5hbWUgb2YgdGhlIGZpbmFsIHN1YmNsYXNzIG9mIHRoZSBtaXhpbiBhcHBsaWNhdGlvbi4KLy8vCi8vLyBGb3IgZXhhbXBsZSwgd2hlbiBjb21waWxpbmcgImNsYXNzIEEgZXh0ZW5kcyBTIHdpdGggTTEsIE0yIiwgdGhlCi8vLyB0d28gc3ludGhldGljIGNsYXNzZXMgd2lsbCBiZSBuYW1lZCAiX0EmUyZNMSIgYW5kICJfQSZTJk0xJk0yIi4KLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gIkEiIGZvciBib3RoIGNsYXNzZXMuClN0cmluZyBkZW1hbmdsZU1peGluQXBwbGljYXRpb25TdWJjbGFzc05hbWUoU3RyaW5nIG5hbWUpIHsKICBMaXN0PFN0cmluZz4gbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgnJicpOwogIGlmIChuYW1lUGFydHMubGVuZ3RoIDwgMikgcmV0dXJuIG5hbWU7CiAgYXNzZXJ0KG5hbWVQYXJ0c1swXS5zdGFydHNXaXRoKCdfJykpOwogIHJldHVybiBuYW1lUGFydHNbMF0uc3Vic3RyaW5nKDEpOwp9CplzAE5OPAFMNkwETSUEIiQeExIoBEwtTAROUB4ESkoETDJMBFAESwRNPgRML0wETkAESRAETDJMBE0hBFFQQARQLAQUASEBFxcBMTEBJSAcIBkBIBYQARUhAUwGUCwGUTAGR08vMAIBLgQ9Jx9HIgETAS8GT0cdARkcJAErBk5ODwZFBkc8PwQBMQZOTg8GPyssEwQBTkgGTxImEwQBQgFRHAZLIho5NAQBNTgEAgE3BE81BSwKHQEhOCAEAT8CAS48EwIBHSQnAgE4BDgIEh8BCRIBFiEsBhgjBiAEARoYSQYcBAEWGEcGGgQBGBhIBhsEARYYRwYaBAEiGE0GIAQBHhhLBh4EARoYSQYcBAIBTC5MAQUgPyYGTAZPEQE/DwEcHAEqKwERAUohBkxMNAZQIjYkRgQBS1A2JUgEAQ8BOgZQFR8BCSYBLgFCHS0JOwEPIQEgHSQcARoSHiQsHx4bIhoUHDpDLzEtNysbIikiJSQnIwQBSwZJPCI/ASIaHx4iGg0nBgQBKBgbBAEgGhkEAR8ZFwQBKx0fBAEmHBwEASEjMCZOBi4fRwYyKEkGLyFEJgYEAS8rBAEjJAQBMQEdHyAZHBseGgQBJSkqIyYlKCQEASQoAUEBTC0vATVJBAIBMgQxBBYgKRYEMCsNASYBJgFQFQZLDwEmAT1KGk8BSURGTQE0UTtNATRERE0BPkQjIwQBKkMBKCoBMCI0AS4wBAE7AR0fHwQBJSkpBAIBJQQUBB4lJhgBMCMEAS4wBAE1AR0fBAElKQQCATckDwEcAS4BJy8wAR4BDDQBDB4BDCYCASE5UA83DywRAU1OOjgzASAcFCo4NjJDLD8kPUsbKwQBKgEdRwQBGiEEASUpLBgkBgQBHR8iFQQBKB8kBhsYBAE1SQQCAU4EPBJOQg0BSycGOAY6BkIIATUGRwZONQ0BSh8GRwZQFwZIGQkBTgY2BkcnCAIBOwRQTVBNBURCBjIGTlEMKwFPTjkpAUYmATEGSx0JNwEZBj4GT08UBw8BKjUqJjAxMgERATQBJEYEASUsASA+BAFINigREREREjM3OyQvQAEqDE4EAUNNEkIBKwxQBAE6Bk8ZRAEsEikrBAEsJQEgMQFPTxsjRC45RxdPEE4GJgQBPQ8BLAFFFwFKGQEuKgEkBjMcASooASgGSCQBPgYzTAEJEh4kFhgqKCYiGkoUHENDKz03LlEbKyknIzsiLgQBISMuIEkGMihJBjQsSQZGUEkGBAFGMAFLBlAwNAFGMgE2AR05IREEASYeLwQBLh43BAEmBkk8NhAWFCcaAUEGSUA7NDgZGgEpKgEjBksTIhohICYeIho6Mg0nBgQBKB8kBhsYBAEvPQFQSAZEJD8BIR9QBAEiRQQBCRpFAQkbHxlGBAEJHSEzTwQBSjI2AR0fIhocJCAeGjIEASUpLB0vBh8zBjEqKCQ8BAE1SQQCAUwmTAEFTjMGTk8MKQEyBksdCTcBDQE+DwFNSwY5BktHBkpKBkwUBUocAUsBP0wBGy0BUU8RPwE1IAE7FAE3Bk0pFgEzFgE3HQFIUA8GTBsXIwFOJQFLMjcBKB8kBhsYBAEbGwEgPwQCARkEUCgdNxEqARMnGB8bGxweHh8THCoaICQcHB49Sy4EAU8nKDMzKzYBQjYBLi4wATwGUCcGP0QBPAZQJwZQTA4GSkQBUEQGQCZMASVIBAEhQAQBIUAEASJCBAErEiosBAErEiosBAEwEi0vBAE0PioeIwEgJDIEATEBTAEdHxUVHAQBJSIpHysiBgQBI0QBNUkEAgE0BEAEUVEESSNIBjIGTlEMKwERGSIBHRIbHh8mHxMcPSodKRwiJC4EAU8qKwEuNAFHMzYBIUAEASRGBAElSAQBJh8fATcBLykBHR8VIBkEASUpKhwlHwYEATExATVJBAIBSARKBBITIwoES0pQUDkES1EoBFAjNREBUU9IJgE8NB0BTlBGURsmAUo2Mh4BUCstATYSGx4fJCo2MSITHDxDJD1LJkkqKzEsHCIuBAFPKgEuNAEhQAQBJEYEASYfHwE0ATIBIyRIMgQBSQEvOwEdHyAhFQQBJSkpBAExMQE1SQQCAU8QBFFBBElOFARLNjdJQQUhRQYyBk5RDCsBFhE5GQFOSRkdFCMEAU5RMSwUJwQBTEsiPScEATA0AUIfHB4bJCgfExsoLS8kICQeMDgwHiIwPzREAT0fHB4bJCgfExsvNCodIh4iHC42LgQBUCoqTTA0QD83ATA0NAFRPC4BTUojBlBKUEFAAU5JSAFQJy07BAFMTjVOAU4BIkIEASRGBAEkRgQBIUAEASoMTgQBLhIrLQQBORI2OAQBMRIuMAQBKjU1LzY2NwEqNAE2RQQBLjgBOkkEATUBUAEdHxUZBAElKRwlHwYEARxDBAEcFDAeBAE1SQQCARUKCgoMCwIBTDBMATIuOw8cASACAS4EKgNKEi9DAR4mAgFMEwRQNQNJUS07HBQBMjMBQhoEASsBICcEAUEBHR8WBAElGR8cBgQCAUURBC4DTgNOHC1PHRcBPEEBRx4EATwBKDIEAUEBHSAaBAElHScgBgQCAUgTA1BLM04dFwFCQQFNHgQBPAEoMgQBRwEdIBoEASUdJyAGBAIBTgRPKi0gASQdBAFBAR0ZBAElHCUfBgQCAS4dASYdBAFCAR0ZBAElJR0EAgFMKEwBMwROGgUmT045KQEsBiIbASoGHgZNDgY4TB8BJh4QMgktJBMBHwEWHyoaGgYEARcSEgQBIhISBAEbKzYxIiwqHSQ9JklLRCArMSwaJQQBTQFHMAQBIiMcThJHMFAvGx1OFCAsOQQBNgEdIigjGxUEASUsMi0uGB0bBgQCARNDCAwJDQFMT08FRk1FSklQBRwFDSIdBRkdHR0LBRMJBUBAQAVHSlBNDRACAUwuTAEFLTEGUCAxAUcUBlAgBk9GUCArMVBNT00oLSEGJSg6BiIkBiFEMSUkBkQfBAEfJgIBMgQxLRIBIwFHAUFNAR4mAgFGBScgCTIBMwEyKgQBO0cBHR0EASUgNAYEAgEzBCcnIBQBKxoEAU8BO0cBHRYEASUZHxwGBAIBIgRCBScXBw0BCSYBSE8BG0EdBAFEASw7BAEyMCM5UDo3BjEjJBwuHQYgBAE7RwEdGRUEASUcJR8GBAIBKgQwBCcnFw0UASYBQCAaSQEbTR0aBAFEASw7BAFPATtHAR0ZFRYEASUcJR8GGR8cBgQCAUAtFx0BOEABRx0EATIBIzIEAR0ZIAQBJRwlHwYEAUFNATIuTjgsBAIBLwQnLRcdFAFKRwEhOR0aBAEyASMyBAEdGSAWBAElHCUfBhkfHAYEAUFNAU8CAUM8Fx0XARpCSwEmPR0eBAE4ASYyBAEhAR0ZIBoEASUcJR8GHScgBgQBRigwATI4UDkGLk5CNSM9JQQCASYEQiwNASYBOEUBSgFEASw7BAEyOzEpBk40NQQBQEwBHRUEASYCAS4EMAQnLA0UASYBSEwBID4aBAFEASw7BAFPAUBMAR0VFgQBJRkfHAYEAgFMJTgdAUsBLwEyASMyBAFGATlFAR0gBAEmAgEzBCclMR0UAS09ATwaBAEyASMyBAFPATlFAR0gFgQBJRkfHAYEAgFDLwUjCR4NJR8BHTssNCciBAEUHiUlATcaTyhJFycyGAQBMwEdGR4ZBAElISgjBAIBJSkPFAErGgQBOQEdFgQBJRkfHAYEAgFJTgU5GyIBIgZPEQIBIwU2Fw0XASYBSCAaTQEgUR0eBAFEASw7BAEyMCMqQzQrOwg5UEQ3KCc8NA8kCAYfOCpMJQonPjYIBh1JHQYgBAFATAEdGRUaBAElHCUfBh0nIAYEAgEnBEk7DRcBJgE4I1ABJUIeBAFKAS87BAEyPTdOQj4jRiUEAUVRAR0VGgQBJR0nIAYEAgFHHwRJNh0XAUcQASEBUUAfAUUfHgQBOAEmMgQBMiM9NQQBQEwBHSAaBAElHScgBgQCATcESQNCSRYFOx0JFxABIQFBHUAfAUofHgQBPAEoMgQBMiMoRQQBRVEBHSAaBAElHScgBgQBJiMoRQQCATopGSYBNx8EATI5RjUEAT1JAR0bIQQBJR4pIQYpBAIBHQROKx8WARYcBAFDATM/AR0YBAElGyMeBgQCASwtEyUUATwZGgQBQwFBTQEdFRYEASUYHRsGGR8cBgQCASQxGBMYAT8XARlEHhkeBAE/AUVRAR0aFRobBAElHScgBhgdGwYdJyAGHjAGBAIBTlAqBEAESS8mASojBAFFAUNPAR0fBAElKQQCASoEOAROTCctGSABTB0EATIwBAFBTQEdHRkEASUyIwQCASgENgRNTCcEUCAsGR8BShwEATIvBAFATAEdHRgEASUyIgQCASgENgRNTCcETiAsFBYfAR4qLhwEATI1BAFATAEdGBoYBAElKCwiBAIBNwRPUEszLCImMCcqAU4rATEBMiEcNwQBQEwBHS8hOiwGORcGGyMEASVBMEMtIwgIJS0EAgEhKBYRASocBAFDATxIAR0YFQQBJRsjHgYiBAIBISgRFhEBKhwEASorAUwGTCI2ASVIBAE5ATxIAR0YFQQBJRsjHgYiBAIBOzEUAR4mAgErEAEdAUUBPUkCASgxUE9ODQEaAUIBOkYCASsQAR0BRQE9SQIBKQ4BGwFDATtHAgEpHAFDATtHAgEpNgEdAUUBPUkBHiYCAScRARoBQwE7RwEdFQQBJSIEAgEqQwE+SgEeJgIBI0cBN0MBHiYCASEZARsfBAFHATVBAR0bBAElHikhBgQCAScQPyYBIEciIwQBMjAEATtHAR0dHwQBJTIpBAIBJhA/JgEfRyIjBAEyLwQBOkYBHR0fBAElMikEAgEmEDo8IAEbKiseHR8fBAEyNQQBOkYBHRgaGwQBJSgsJQQCASISFAEjGBoEATIBHRQWBAElFxsaBhkfHAYEAgEiKxYBIhwEATI9BAE/SwEdGAQBJRsjHgYEAgFPMx0CATkEPkcZASYdBAFKAUJOAR0ZBAElHCUfBgQCAS4VEQFJHgQBOQFCTgEdIhUEASUqIgQCATIfPRMBIh0ZBAFOATM/AR0ZFQQBJRwlHwYYHRsGBAIBKw4UASsZGgQBTwE/SwEdFRYEASUYHRsGGR8cBgQCAUIEKEZMMwRNMARNQSc/HAEcATIyBAE7RwEeJgIBRzA/HAElATIdBAFEUAEeJgIBTCtMAQUsHiUCAQUuGQEpHwQBQk4BHRsEASUeKSEGBAIBBSAkARslFxYdDyIEATRAAR0eBAElKAQBJhoYBAIBPARKTkUmJAEhJRcWHQ8iBAE6RgElKAQBHR4EASYaGAQCASk9SQEeJgIBKhgmHBoBIkweHAQBPkoBHRoYBAElHScgBhsjHgYEAgElBEsERCsSASAZBAE/SwEdFQQBJRgdGwYEAgEzBE8ESQQTGxAKBAwEEw8cEgwKAykbAR8BPUkBHiYCASkYEgEuHhkEAT1JAR0aFQQBJR0nIAYYHRsGBAIBJhIYASsZHgQBOkYBHRUaBAElGB0bBh0nIAYEAgEnTChBEgFKIR4fGQQBO0cBHR0aGxUEASUnHScgBiUYHRsGBAIBKS8GTlEmATcXEjgBOh8dHRkEAT1JAR0ZGRUEASUcJR8GHCUfBhgdGwYEAgE0BFFQKhkgATEfHQQBPkoBHRsZBAElHikhBiMEAgE5BD0kJiUSEgFCISMZBAEkGiYmGQQBFSYlFRsBNAEdHxUEASUpGB0bBgQCASsyFQEoAUYnMQEeJgIBJhgSFwE7HhkeBAE6RgEdGhUaBAElHScgBhgdGwYdJyAGBAIBBSopAScfBAE+SgEdGwQBJR4pIQYEAgEjEhcUAUEZHwQBN0MBHRUbBAElGB0bBiUEAgEfNDEyEgEjPBseHxkEAS8BHRYaGxUEASUkHScgBh4pIQYYHRsGBAIBJRIXASoZHgQBOUUBHRUaBAElGB0bBh0nIAYEAgEvBD8pGREBIjkfJB4EASsoATYwASVIBAEiQgQBPUkBHRsEASUeKSEGBAIBJQRNRgRNA0YILkIGQks5LAFABksdNwFMRgZGJQ8RMwFHHgEtMQYlCioBIRkmFRsbISIaIBcaDR4eKiYGBAFNMRsbISkaIBwcKAQBTyctK002AS4uAUY2AUYVDzoBSlEkBkAmTAEhQAQBIUAEASVIBAEPJ0wEATASLS8EAS4fJAYwBAFCTgEdHxUcBAElKSIfKyIGBAFNMjsCASIER0dEGQE2HR0EAUJOAR0ZGQQBJRwlHwYcJR8GBAIBTChMAT0ERkUETRcETEIFJhYHFQkdCRcWASwBMjYBQU8aICMyDSQGBAEcTAQBKgEdSAQCASIfHgEzKEQBQwEwAURPRE8aBAIBISUfHwFDAR0CAUwlTAEmEzUGTRwKATcGNwwBTQZRTzIPAUQGTlA4BiUVMjIMCgoCASsETwRLSzgESRUFJxQBHSQBIgEfAU5OBiggAU0fJAIBNARMPSUeARcBOUUeAToBUAIBJR4BFwE5RR4BOgE3AgEiHwEUATZCHgE3ATcCASQfARYBOEQeATkBOgIBBScXASEBCSYBTD8hJTU3TQFAMAEsAUEwOyENKEEGBAE7RwEdIiEEASMtIjZMN0YIEw0UBgQBFTA1TAYRBAIBJgUmLCQNLTwhATchAR0RAUUyNCwiGTomQwEJQwE2ATpGAR0iKCMcGgQBIy0hQkRORBYIJEBKGgwKO0AaDAovD05OK0oIDRQGBAFNEgZMDCstPjgqIwQBRAZJLBMsHSgzPB0kIxsPGwgGEQQBOAEbFT42M0tCBjxKBjdFBjs2OjkGEQQCASQEOiUhJCYBIyU1MD8BRTABOQE5RQEdISoEAR1QBAEZIAQBIy0gOEAWCDdGCBMGEgQBFTI1TAYRBAIBKUAVFwEjASNLBAEVNAQBQAEvASIUBAIBTiUETUsmUAEiBFBRSykrLikBQQZFRQZPTUdHFwYnGhsgHRAODCEBGwE4BlE5GgEkNhtLAT9LAR4BI0cEAVABSjoBUAZEMlQ9QUtRFwFRTVFPTExNASABUUsTNy0NT0lQFD8lSkAgHgYhHQYBTFBPUA8wIQYBSAdRUU9LFQdOTiBAJgYBRkcHJwc1GB1NThEgSUoRDw0HUBUxIgYBUU5GRQczFxtLTA8eRA8NCyYEAgEkBFFPFgRPSiYnEQE6BksdNwEhASYGTE4SAUhJS0k+GAE8ASo2AVFRJAZAJkwBMBItLwQBLh8kBjAEATcBHR8VHAQBJSkkHzIGBAFONz4BOgIBHxcmATtHAT0BLAEvAR0iIQQBJjgEASMtHjZMN0YIEw0UBgQBFTA1TAYRBAIBTClMASdKLQZOFBwBPh0BRx4BUFEiFCIBJisBHikEAgE3EQEhASEBJgEkPQIBNSABHjpEAT0CATUrAR46RAE9AgEzKQEeOUMBPAIBOS8BHjxGATokQAE/AgE5MBsEAR48RgE/AgEoFSQBNAEeATxGARYkPBQEATsBJCAiIDcBPwIBJRocKAE7AR0XGTQkJgYEATlDAU4BFxU1TwQBJCAfJiovAS0wAgEZFhgqAScBLwEkTQIBJh8gATEBHRwvIwYEATpEAUcBFxU0QAQBJCAgMC8BLSsCASUfIAEwAR0cLyMGBAE5QwFHARcVNEAEASQgHzAvAVECASoiJi4BTwExAR0vITosBjojBgQBPkgBFiMrOhVJFQYUQjkIExoEARcVNSElNQQBIyUmNj44BAEtMwIBNikeAUIBHSgZBAFKIDoBFlAEASs/ASM0NCgEATZIMTMyBjwEAgEpJgEnMyAEATgBPgEdNwQBPUcBFisEASoBI0UEATEnAgEtFwEiAR0UBAFBSwEyASUBIz8EAT0CAS0fASkfBAEdGgQBQUsBTgEMKwIBTCxMATEjHAE8BlAVHwEhAUlKMSYBTBI8LwE8HAENHx8lNS43FQQBGR0zUSAoHz4zIQoIBgQBITE1BgQBOkclBAEgFgQBOwEoLwQBMwEdHSQEASUnBAEsAUkvOQQBPisEAgFODxESHiABLwEuAgEnORIBOCABRR4GREhJTU4PBj0+AUgcBkdBTTgpNAFGLwZILCsxBAIBHBkBHCQfHwEmJwFDKR0lHQETKx8jEysfIwIBHhkXARIjEhQBJxwBLiATGyMBOTkCAUwyTAE5Kx4EAgE0Kx4EAgE8HBoEAgFEFisyGiIUBgQjHwQCAUoWKzMaIhQGBCMfBAIBURYrKxoiHhQGBCMfBAIBSTkmThgCASsYHgEwAQwjGRoNEwYEAgEPHgEaARcBFQEVAUYBRj0hGhoeKUkBPiYaKhQ2LDtOOjFELghBBlAcBAFJLzRHBksvGUgjHRMPGAgGGSskLzkEAgE5BCwuHAIBOAQrLBwCAUo3BCw4IyYrBB8CAUo2BCs2IyYrBB8CAUs4BC07JCcsBCACAU8cBFEVDjMxASUsFhIhEhURDUgqQCEGEQQBKCAWHxEfDUg/IkAGEQQBMikEATozBAFAMwQBNUIEATodMQYRBAE3HyIGEQQBQDEuDyVMBhgrBAEkIxQYQQQCAR40AgEbJAIBMktNHQIBJDsCASIqJyQEDwIBHyolPwQPAgFMOAQtPCUoLQQhAgFOUEgaAVEbMwtIBAIBRjEERURNMyw4Jy9ABBgCAUs9BEVENDssKSgkAgEXcGFja2FnZTprZXJuZWwvYXN0LmRhcnQrc2Rrcm9vdDovcGtnL2tlcm5lbC9saWIvdGFyZ2V0L3RhcmdldHMuZGFydK11Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwudGFyZ2V0LnRhcmdldHM7CgppbXBvcnQgJy4uL2FzdC5kYXJ0JzsKaW1wb3J0ICcuLi9jbGFzc19oaWVyYXJjaHkuZGFydCc7CmltcG9ydCAnLi4vY29yZV90eXBlcy5kYXJ0JzsKCmZpbmFsIExpc3Q8U3RyaW5nPiB0YXJnZXROYW1lcyA9IHRhcmdldHMua2V5cy50b0xpc3QoKTsKCmNsYXNzIFRhcmdldEZsYWdzIHsKICBmaW5hbCBib29sIGxlZ2FjeU1vZGU7CiAgZmluYWwgYm9vbCB0cmFja1dpZGdldENyZWF0aW9uOwoKICBUYXJnZXRGbGFncyh7dGhpcy5sZWdhY3lNb2RlID0gZmFsc2UsIHRoaXMudHJhY2tXaWRnZXRDcmVhdGlvbiA9IGZhbHNlfSk7Cn0KCnR5cGVkZWYgVGFyZ2V0IF9UYXJnZXRCdWlsZGVyKFRhcmdldEZsYWdzIGZsYWdzKTsKCmZpbmFsIE1hcDxTdHJpbmcsIF9UYXJnZXRCdWlsZGVyPiB0YXJnZXRzID0gPFN0cmluZywgX1RhcmdldEJ1aWxkZXI+ewogICdub25lJzogKFRhcmdldEZsYWdzIGZsYWdzKSA9PiBuZXcgTm9uZVRhcmdldChmbGFncyksCn07CgpUYXJnZXQgZ2V0VGFyZ2V0KFN0cmluZyBuYW1lLCBUYXJnZXRGbGFncyBmbGFncykgewogIHZhciBidWlsZGVyID0gdGFyZ2V0c1tuYW1lXTsKICBpZiAoYnVpbGRlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKICByZXR1cm4gYnVpbGRlcihmbGFncyk7Cn0KCmFic3RyYWN0IGNsYXNzIERpYWdub3N0aWNSZXBvcnRlcjxNLCBDPiB7CiAgdm9pZCByZXBvcnQoTSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwgVXJpIGZpbGVVcmksCiAgICAgIHtMaXN0PEM+IGNvbnRleHR9KTsKfQoKLy8vIFRoZSBkaWZmZXJlbnQga2luZHMgb2YgbnVtYmVyIHNlbWFudGljcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbnN0YW50IGV2YWx1YXRvci4KZW51bSBOdW1iZXJTZW1hbnRpY3MgewogIC8vLyBEYXJ0IFZNIG51bWJlciBzZW1hbnRpY3MuCiAgdm0sCgogIC8vLyBKYXZhU2NyaXB0IChEYXJ0MmpzIGFuZCBEREMpIG51bWJlciBzZW1hbnRpY3MuCiAganMsCn0KCi8vIEJhY2tlbmQgc3BlY2lmaWMgY29uc3RhbnQgZXZhbHVhdGlvbiBiZWhhdmlvcgpjbGFzcyBDb25zdGFudHNCYWNrZW5kIHsKICBjb25zdCBDb25zdGFudHNCYWNrZW5kKCk7CgogIC8vLyBMb3dlcmluZyBvZiBhIGxpc3QgY29uc3RhbnQgdG8gYSBiYWNrZW5kLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uLgogIENvbnN0YW50IGxvd2VyTGlzdENvbnN0YW50KExpc3RDb25zdGFudCBjb25zdGFudCkgPT4gY29uc3RhbnQ7CgogIC8vLyBMb3dlcmluZyBvZiBhIHNldCBjb25zdGFudCB0byBhIGJhY2tlbmQtc3BlY2lmaWMgcmVwcmVzZW50YXRpb24uCiAgQ29uc3RhbnQgbG93ZXJTZXRDb25zdGFudChTZXRDb25zdGFudCBjb25zdGFudCkgPT4gY29uc3RhbnQ7CgogIC8vLyBMb3dlcmluZyBvZiBhIG1hcCBjb25zdGFudCB0byBhIGJhY2tlbmQtc3BlY2lmaWMgcmVwcmVzZW50YXRpb24uCiAgQ29uc3RhbnQgbG93ZXJNYXBDb25zdGFudChNYXBDb25zdGFudCBjb25zdGFudCkgPT4gY29uc3RhbnQ7CgogIC8vLyBOdW1iZXIgc2VtYW50aWNzIHRvIHVzZSBmb3IgdGhpcyBiYWNrZW5kLgogIE51bWJlclNlbWFudGljcyBnZXQgbnVtYmVyU2VtYW50aWNzID0+IE51bWJlclNlbWFudGljcy52bTsKCiAgLy8vIElubGluZSBjb250cm9sIG9mIGNvbnN0YW50IHZhcmlhYmxlcy4gVGhlIGdpdmVuIGNvbnN0YW50IGV4cHJlc3Npb24KICAvLy8gaXMgdGhlIGluaXRpYWxpemVyIG9mIGEgW0ZpZWxkXSBvciBbVmFyaWFibGVEZWNsYXJhdGlvbl0gbm9kZS4KICAvLy8gSWYgdGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAsIHRoZSB2YXJpYWJsZSB3aWxsIGJlIGlubGluZWQgYXQgYWxsCiAgLy8vIHBvaW50cyBvZiByZWZlcmVuY2UgYW5kIHRoZSB2YXJpYWJsZSBpdHNlbGYgcmVtb3ZlZCAodW5sZXNzIG92ZXJyaWRkZW4KICAvLy8gYnkgdGhlIGBrZWVwRmllbGRzYCBvciBga2VlcFZhcmlhYmxlc2AgZmxhZyB0byB0aGUgY29uc3RhbnQgdHJhbnNmb3JtZXIpLgogIC8vLyBUaGlzIG1ldGhvZCBtdXN0IGJlIGRldGVybWluaXN0aWMsIGkuZS4gaXQgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lCiAgLy8vIHZhbHVlIGZvciB0aGUgc2FtZSBjb25zdGFudCB2YWx1ZSBhbmQgcGxhY2UgaW4gdGhlIEFTVC4KICBib29sIHNob3VsZElubGluZUNvbnN0YW50KENvbnN0YW50RXhwcmVzc2lvbiBpbml0aWFsaXplcikgPT4gdHJ1ZTsKCiAgLy8vIFdoZXRoZXIgdGhpcyB0YXJnZXQgc3VwcG9ydHMgdW5ldmFsdWF0ZWQgY29uc3RhbnRzLgogIC8vLwogIC8vLyBJZiBub3QsIHRoZW4gdHJ5aW5nIHRvIHBlcmZvcm0gY29uc3RhbnQgZXZhbHVhdGlvbiB3aXRob3V0IGFuIGVudmlyb25tZW50CiAgLy8vIHJhaXNlcyBhbiBleGNlcHRpb24uCiAgLy8vCiAgLy8vIFRoaXMgZGVmYXVsdHMgdG8gYGZhbHNlYCBzaW5jZSBpdCByZXF1aXJlcyBhZGRpdGlvbmFsIHdvcmsgZm9yIGEgYmFja2VuZAogIC8vLyB0byBzdXBwb3J0IHVuZXZhbHVhdGVkIGNvbnN0YW50cy4KICBib29sIGdldCBzdXBwb3J0c1VuZXZhbHVhdGVkQ29uc3RhbnRzID0+IGZhbHNlOwp9CgovLy8gQSB0YXJnZXQgcHJvdmlkZXMgYmFja2VuZC1zcGVjaWZpYyBvcHRpb25zIGZvciBnZW5lcmF0aW5nIGtlcm5lbCBJUi4KYWJzdHJhY3QgY2xhc3MgVGFyZ2V0IHsKICBTdHJpbmcgZ2V0IG5hbWU7CgogIC8vLyBBIGxpc3Qgb2YgVVJJcyBvZiByZXF1aXJlZCBsaWJyYXJpZXMsIG5vdCBpbmNsdWRpbmcgZGFydDpjb3JlLgogIC8vLwogIC8vLyBMaWJyYXJpZXMgd2lsbCBiZSBsb2FkZWQgaW4gb3JkZXIuCiAgTGlzdDxTdHJpbmc+IGdldCBleHRyYVJlcXVpcmVkTGlicmFyaWVzID0+IDxTdHJpbmc+W107CgogIC8vLyBBZGRpdGlvbmFsIGRlY2xhcmVkIHZhcmlhYmxlcyBpbXBsaWVkIGJ5IHRoaXMgdGFyZ2V0LgogIC8vLwogIC8vLyBUaGVzZSBjYW4gYWxzbyBiZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQtbGluZSBvZiBmb3JtIGAtRDxuYW1lPj08dmFsdWU+YCwKICAvLy8gYW5kIHRob3NlIHByb3ZpZGVkIG9uIHRoZSBjb21tYW5kLWxpbmUgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhvc2UgZGVmaW5lZAogIC8vLyBieSB0aGUgdGFyZ2V0LgogIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0IGV4dHJhRGVjbGFyZWRWYXJpYWJsZXMgPT4gY29uc3QgPFN0cmluZywgU3RyaW5nPnt9OwoKICAvLy8gQ2xhc3NlcyBmcm9tIHRoZSBTREsgd2hvc2UgaW50ZXJmYWNlIGlzIHJlcXVpcmVkIGZvciB0aGUgbW9kdWxhcgogIC8vLyB0cmFuc2Zvcm1hdGlvbnMuCiAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXQgcmVxdWlyZWRTZGtDbGFzc2VzID0+IENvcmVUeXBlcy5yZXF1aXJlZENsYXNzZXM7CgogIGJvb2wgZ2V0IGxlZ2FjeU1vZGU7CgogIC8vLyBBIGRlcml2ZWQgY2xhc3MgbWF5IGNoYW5nZSB0aGlzIHRvIGB0cnVlYCB0byBlbmFibGUgZm9yd2FyZGVycyB0bwogIC8vLyB1c2VyLWRlZmluZWQgYG5vU3VjaE1ldGhvZGAgdGhhdCBhcmUgZ2VuZXJhdGVkIGZvciBlYWNoIGFic3RyYWN0IG1lbWJlcgogIC8vLyBpZiBzdWNoIGBub1N1Y2hNZXRob2RgIGlzIHByZXNlbnQuCiAgLy8vCiAgLy8vIFRoZSBmb3J3YXJkZXJzIGFyZSBhYnN0cmFjdCBbUHJvY2VkdXJlXXMgd2l0aCBbaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXJdCiAgLy8vIGJpdCBzZXQuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJlaGF2aW9yIG9mIHN1Y2ggZm9yd2FyZGVycyBpcyB1cAogIC8vLyBmb3IgdGhlIHRhcmdldCBiYWNrZW5kLgogIGJvb2wgZ2V0IGVuYWJsZU5vU3VjaE1ldGhvZEZvcndhcmRlcnMgPT4gZmFsc2U7CgogIC8vLyBBIGRlcml2ZWQgY2xhc3MgbWF5IGNoYW5nZSB0aGlzIHRvIGB0cnVlYCB0byBlbmFibGUgRmx1dHRlciBzcGVjaWZpYwogIC8vLyAic3VwZXItbWl4aW5zIiBzZW1hbnRpY3MuCiAgLy8vCiAgLy8vIFRoaXMgc2VtYW50aWNzIHJlbGF4ZXMgYSBudW1iZXIgb2YgY29uc3RyYWludCBwcmV2aW91c2x5IGltcG9zZWQgb24KICAvLy8gbWl4aW5zLiBJbXBvcnRhbnRseSBpdCBpbXBvc2VzIHRoZSBmb2xsb3dpbmcgY2hhbmdlOgogIC8vLwogIC8vLyAgICAgQW4gYWJzdHJhY3QgY2xhc3MgbWF5IGNvbnRhaW4gYSBtZW1iZXIgd2l0aCBhIHN1cGVyLWludm9jYXRpb24gdGhhdAogIC8vLyAgICAgY29ycmVzcG9uZHMgdG8gYSBtZW1iZXIgb2YgdGhlIHN1cGVyY2xhc3MgaW50ZXJmYWNlLCBidXQgd2hlcmUgdGhlCiAgLy8vICAgICBhY3R1YWwgc3VwZXJjbGFzcyBkb2VzIG5vdCBkZWNsYXJlIG9yIGluaGVyaXQgYSBtYXRjaGluZyBtZXRob2QuCiAgLy8vICAgICBTaW5jZSBubyBhbW91bnQgb2Ygb3ZlcnJpZGluZyBjYW4gY2hhbmdlIHRoaXMgcHJvcGVydHksIHN1Y2ggYSBjbGFzcwogIC8vLyAgICAgY2Fubm90IGJlIGV4dGVuZGVkIHRvIGEgY2xhc3MgdGhhdCBpcyBub3QgYWJzdHJhY3QsIGl0IGNhbiBvbmx5IGJlCiAgLy8vICAgICB1c2VkIHRvIGRlcml2ZSBhIG1peGluIGZyb20uCiAgLy8vCiAgLy8vIFNlZSBkYXJ0YnVnLmNvbS8zMTU0MiBmb3IgZGV0YWlscyBvZiB0aGUgc2VtYW50aWNzLgogIGJvb2wgZ2V0IGVuYWJsZVN1cGVyTWl4aW5zID0+IGZhbHNlOwoKICAvLy8gUGVyZm9ybSB0YXJnZXQtc3BlY2lmaWMgdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBvdXRsaW5lcyBzdG9yZWQgaW4KICAvLy8gW0NvbXBvbmVudF0gd2hlbiBnZW5lcmF0aW5nIHN1bW1hcmllcy4KICAvLy8KICAvLy8gVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyB1c2VkIHRvIGFkZCBtZXRhZGF0YSBvbiBvdXRsaW5lcyBhbmQgdG8gZmlsdGVyCiAgLy8vIHVubmVjZXNzYXJ5IGluZm9ybWF0aW9uIGJlZm9yZSBnZW5lcmF0aW5nIHByb2dyYW0gc3VtbWFyaWVzLiBUaGlzCiAgLy8vIHRyYW5zZm9ybWF0aW9uIGlzIG5vdCBhcHBsaWVkIHdoZW4gY29tcGlsaW5nIGZ1bGwga2VybmVsIHByb2dyYW1zIHRvCiAgLy8vIHByZXZlbnQgYWZmZWN0aW5nIHRoZSBpbnRlcm5hbCBpbnZhcmlhbnRzIG9mIHRoZSBjb21waWxlciBhbmQgYWNjaWRlbnRhbGx5CiAgLy8vIHNsb3dpbmcgZG93biBjb21waWxhdGlvbi4KICB2b2lkIHBlcmZvcm1PdXRsaW5lVHJhbnNmb3JtYXRpb25zKENvbXBvbmVudCBjb21wb25lbnQpIHt9CgogIC8vLyBQZXJmb3JtIHRhcmdldC1zcGVjaWZpYyB0cmFuc2Zvcm1hdGlvbnMgb24gdGhlIGdpdmVuIGxpYnJhcmllcyB0aGF0IG11c3QKICAvLy8gcnVuIGJlZm9yZSBjb25zdGFudCBldmFsdWF0aW9uLgogIHZvaWQgcGVyZm9ybVByZUNvbnN0YW50RXZhbHVhdGlvblRyYW5zZm9ybWF0aW9ucygKICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgICAgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMsCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciBkaWFnbm9zdGljUmVwb3J0ZXIsCiAgICAgIHt2b2lkIGxvZ2dlcihTdHJpbmcgbXNnKX0pIHt9CgogIC8vLyBQZXJmb3JtIHRhcmdldC1zcGVjaWZpYyBtb2R1bGFyIHRyYW5zZm9ybWF0aW9ucyBvbiB0aGUgZ2l2ZW4gbGlicmFyaWVzLgogIHZvaWQgcGVyZm9ybU1vZHVsYXJUcmFuc2Zvcm1hdGlvbnNPbkxpYnJhcmllcygKICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgICAgRGlhZ25vc3RpY1JlcG9ydGVyIGRpYWdub3N0aWNSZXBvcnRlciwKICAgICAge3ZvaWQgbG9nZ2VyKFN0cmluZyBtc2cpfSk7CgogIC8vLyBQZXJmb3JtIHRhcmdldC1zcGVjaWZpYyBtb2R1bGFyIHRyYW5zZm9ybWF0aW9ucyBvbiB0aGUgZ2l2ZW4gcHJvZ3JhbS4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIHdoZW4gYW4gaW5kaXZpZHVhbCBleHByZXNzaW9uIGlzIGNvbXBpbGVkLCBlLmcuIGZvciBkZWJ1Z2dpbmcKICAvLy8gcHVycG9zZXMuIEl0IGlzIGlsbGVnYWwgdG8gbW9kaWZ5IGFueSBvZiB0aGUgZW5jbG9zaW5nIG5vZGVzIG9mIHRoZQogIC8vLyBwcm9jZWR1cmUuCiAgdm9pZCBwZXJmb3JtVHJhbnNmb3JtYXRpb25zT25Qcm9jZWR1cmUoCiAgICAgIENvcmVUeXBlcyBjb3JlVHlwZXMsIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwgUHJvY2VkdXJlIHByb2NlZHVyZSwKICAgICAge3ZvaWQgbG9nZ2VyKFN0cmluZyBtc2cpfSkge30KCiAgLy8vIFdoZXRoZXIgYSBwbGF0Zm9ybSBsaWJyYXJ5IG1heSBkZWZpbmUgYSByZXN0cmljdGVkIHR5cGUsIHN1Y2ggYXMgYGJvb2xgLAogIC8vLyBgaW50YCwgYGRvdWJsZWAsIGBudW1gLCBhbmQgYFN0cmluZ2AuCiAgLy8vCiAgLy8vIEJ5IGRlZmF1bHQgb25seSBgZGFydDpjb3JlYCBtYXkgZGVmaW5lIHJlc3RyaWN0ZWQgdHlwZXMsIGJ1dCBzb21lIHRhcmdldAogIC8vLyBpbXBsZW1lbnRhdGlvbnMgb3ZlcnJpZGUgdGhpcy4KICBib29sIG1heURlZmluZVJlc3RyaWN0ZWRUeXBlKFVyaSB1cmkpID0+CiAgICAgIHVyaS5zY2hlbWUgPT0gJ2RhcnQnICYmIHVyaS5wYXRoID09ICdjb3JlJzsKCiAgLy8vIFdoZXRoZXIgYSBsaWJyYXJ5IGlzIGFsbG93ZWQgdG8gaW1wb3J0IGEgcGxhdGZvcm0gcHJpdmF0ZSBsaWJyYXJ5LgogIC8vLwogIC8vLyBCeSBkZWZhdWx0IG9ubHkgYGRhcnQ6KmAgbGlicmFyaWVzIGFyZSBhbGxvd2VkLiBNYXkgYmUgb3ZlcnJpZGRlbiBmb3IKICAvLy8gdGVzdGluZyBwdXJwb3Nlcy4KICBib29sIGFsbG93UGxhdGZvcm1Qcml2YXRlTGlicmFyeUFjY2VzcyhVcmkgaW1wb3J0ZXIsIFVyaSBpbXBvcnRlZCkgPT4KICAgICAgaW1wb3J0ZWQuc2NoZW1lICE9ICJkYXJ0IiB8fAogICAgICAhaW1wb3J0ZWQucGF0aC5zdGFydHNXaXRoKCJfIikgfHwKICAgICAgaW1wb3J0ZXIuc2NoZW1lID09ICJkYXJ0IiB8fAogICAgICAoaW1wb3J0ZXIuc2NoZW1lID09ICJwYWNrYWdlIiAmJgogICAgICAgICAgaW1wb3J0ZXIucGF0aC5zdGFydHNXaXRoKCJkYXJ0X2ludGVybmFsLyIpKTsKCiAgLy8vIFdoZXRoZXIgdGhlIGBuYXRpdmVgIGxhbmd1YWdlIGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQgd2l0aGluIFtsaWJyYXJ5XS4KICAvLy8KICAvLy8gVGhlIGBuYXRpdmVgIGxhbmd1YWdlIGV4dGVuc2lvbiBpcyBub3QgcGFydCBvZiB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWNhdGlvbiwKICAvLy8gaXQgbWVhbnMgc29tZXRoaW5nIGVsc2UgdG8gZWFjaCB0YXJnZXQsIGFuZCBpdCBpcyBlbmFibGVkIHVuZGVyIGRpZmZlcmVudAogIC8vLyBjaXJjdW1zdGFuY2VzIGZvciBlYWNoIHRhcmdldCBpbXBsZW1lbnRhdGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBWTSB0YXJnZXQKICAvLy8gZW5hYmxlcyBpdCBldmVyeXdoZXJlIGJlY2F1c2Ugb2YgZXhpc3Rpbmcgc3VwcG9ydCBmb3IgImRhcnQtZXh0OiIgbmF0aXZlCiAgLy8vIGV4dGVuc2lvbnMsIGJ1dCB0YXJnZXRzIGxpa2UgZGFydDJqcyBvbmx5IGVuYWJsZSBpdCBvbiB0aGUgY29yZSBsaWJyYXJpZXMuCiAgYm9vbCBlbmFibGVOYXRpdmUoVXJpIHVyaSkgPT4gZmFsc2U7CgogIC8vLyBUaGVyZSBhcmUgdHdvIHZhcmlhbnRzIG9mIHRoZSBgbmF0aXZlYCBsYW5ndWFnZSBleHRlbnNpb24uIFRoZSBWTSBleHBlY3RzCiAgLy8vIHRoZSBuYXRpdmUgdG9rZW4gdG8gYmUgZm9sbG93ZWQgYnkgc3RyaW5nLCB3aGVyZWFzIGRhcnQyanMgYW5kIEREQyBkbyBub3QuCiAgLy8gVE9ETyhzaWdtdW5kLCBhaGUpOiBpZGVhbGx5IHdlIHNob3VsZCByZW1vdmUgdGhlIGBuYXRpdmVgIHN5bnRheCwgaWYgbm90LAogIC8vIHdlIHNob3VsZCBhdCBsZWFzdCB1bmlmeSB0aGUgVk0gYW5kIG5vbi1WTSB2YXJpYW50cy4KICBib29sIGdldCBuYXRpdmVFeHRlbnNpb25FeHBlY3RzU3RyaW5nID0+IGZhbHNlOwoKICAvLy8gV2hldGhlciBpbnRlZ2VyIGxpdGVyYWxzIHRoYXQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgb24gdGhlIHdlYgogIC8vLyAoaS5lLiBpbiBKYXZhc2NyaXB0KSBzaG91bGQgY2F1c2UgYW4gZXJyb3IgdG8gYmUgaXNzdWVkLgogIC8vLyBBbiBleGFtcGxlIG9mIHN1Y2ggYSBudW1iZXIgaXMgYDJeNTMgKyAxYCB3aGVyZSBpbiBKYXZhc2NyaXB0IC0gYmVjYXVzZQogIC8vLyBpbnRlZ2VycyBhcmUgcmVwcmVzZW50ZWQgYXMgZG91YmxlcwogIC8vLyBgTWF0aC5wb3coMiwgNTMpID0gTWF0aC5wb3coMiwgNTMpICsgMWAuCiAgYm9vbCBnZXQgZXJyb3JPblVuZXhhY3RXZWJJbnRMaXRlcmFscyA9PiBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgc2V0IGxpdGVyYWxzIGFyZSBuYXRpdmVseSBzdXBwb3J0ZWQgYnkgdGhpcyB0YXJnZXQuIElmIHNldAogIC8vLyBsaXRlcmFscyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0LCB0aGV5IHdpbGwgYmUgZGVzdWdhcmVkIGludG8KICAvLy8gZXhwbGljaXQgYFNldGAgY3JlYXRpb24gKGZvciBub24tY29uc3Qgc2V0IGxpdGVyYWxzKSBvciB3cmFwcGVkIG1hcAogIC8vLyBsaXRlcmFscyAoZm9yIGNvbnN0IHNldCBsaXRlcmFscykuCiAgYm9vbCBnZXQgc3VwcG9ydHNTZXRMaXRlcmFscyA9PiB0cnVlOwoKICAvLy8gQnVpbGRzIGFuIGV4cHJlc3Npb24gdGhhdCBpbnN0YW50aWF0ZXMgYW4gW0ludm9jYXRpb25dIHRoYXQgY2FuIGJlIHBhc3NlZAogIC8vLyB0byBbbm9TdWNoTWV0aG9kXS4KICBFeHByZXNzaW9uIGluc3RhbnRpYXRlSW52b2NhdGlvbihDb3JlVHlwZXMgY29yZVR5cGVzLCBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBTdHJpbmcgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCwgYm9vbCBpc1N1cGVyKTsKCiAgRXhwcmVzc2lvbiBpbnN0YW50aWF0ZU5vU3VjaE1ldGhvZEVycm9yKENvcmVUeXBlcyBjb3JlVHlwZXMsCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsIFN0cmluZyBuYW1lLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCBpc01ldGhvZDogZmFsc2UsCiAgICAgIGJvb2wgaXNHZXR0ZXI6IGZhbHNlLAogICAgICBib29sIGlzU2V0dGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc0ZpZWxkOiBmYWxzZSwKICAgICAgYm9vbCBpc0xvY2FsVmFyaWFibGU6IGZhbHNlLAogICAgICBib29sIGlzRHluYW1pYzogZmFsc2UsCiAgICAgIGJvb2wgaXNTdXBlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNTdGF0aWM6IGZhbHNlLAogICAgICBib29sIGlzQ29uc3RydWN0b3I6IGZhbHNlLAogICAgICBib29sIGlzVG9wTGV2ZWw6IGZhbHNlfSk7CgogIC8vLyBDb25maWd1cmUgdGhlIGdpdmVuIFtDb21wb25lbnRdIGluIGEgdGFyZ2V0IHNwZWNpZmljIHdheS4KICAvLy8gUmV0dXJucyB0aGUgY29uZmlndXJlZCBjb21wb25lbnQuCiAgQ29tcG9uZW50IGNvbmZpZ3VyZUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50KSA9PiBjb21wb25lbnQ7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICdUYXJnZXQoJG5hbWUpJzsKCiAgQ2xhc3MgY29uY3JldGVMaXN0TGl0ZXJhbENsYXNzKENvcmVUeXBlcyBjb3JlVHlwZXMpID0+IG51bGw7CiAgQ2xhc3MgY29uY3JldGVDb25zdExpc3RMaXRlcmFsQ2xhc3MoQ29yZVR5cGVzIGNvcmVUeXBlcykgPT4gbnVsbDsKCiAgQ2xhc3MgY29uY3JldGVNYXBMaXRlcmFsQ2xhc3MoQ29yZVR5cGVzIGNvcmVUeXBlcykgPT4gbnVsbDsKICBDbGFzcyBjb25jcmV0ZUNvbnN0TWFwTGl0ZXJhbENsYXNzKENvcmVUeXBlcyBjb3JlVHlwZXMpID0+IG51bGw7CgogIENsYXNzIGNvbmNyZXRlSW50TGl0ZXJhbENsYXNzKENvcmVUeXBlcyBjb3JlVHlwZXMsIGludCB2YWx1ZSkgPT4gbnVsbDsKICBDbGFzcyBjb25jcmV0ZVN0cmluZ0xpdGVyYWxDbGFzcyhDb3JlVHlwZXMgY29yZVR5cGVzLCBTdHJpbmcgdmFsdWUpID0+IG51bGw7CgogIENvbnN0YW50c0JhY2tlbmQgY29uc3RhbnRzQmFja2VuZChDb3JlVHlwZXMgY29yZVR5cGVzKTsKfQoKY2xhc3MgTm9uZUNvbnN0YW50c0JhY2tlbmQgZXh0ZW5kcyBDb25zdGFudHNCYWNrZW5kIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIHN1cHBvcnRzVW5ldmFsdWF0ZWRDb25zdGFudHM7CgogIGNvbnN0IE5vbmVDb25zdGFudHNCYWNrZW5kKHt0aGlzLnN1cHBvcnRzVW5ldmFsdWF0ZWRDb25zdGFudHN9KTsKfQoKY2xhc3MgTm9uZVRhcmdldCBleHRlbmRzIFRhcmdldCB7CiAgZmluYWwgVGFyZ2V0RmxhZ3MgZmxhZ3M7CgogIE5vbmVUYXJnZXQodGhpcy5mbGFncyk7CgogIGJvb2wgZ2V0IGxlZ2FjeU1vZGUgPT4gZmxhZ3MubGVnYWN5TW9kZTsKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJ25vbmUnOwogIExpc3Q8U3RyaW5nPiBnZXQgZXh0cmFSZXF1aXJlZExpYnJhcmllcyA9PiA8U3RyaW5nPltdOwogIHZvaWQgcGVyZm9ybU1vZHVsYXJUcmFuc2Zvcm1hdGlvbnNPbkxpYnJhcmllcygKICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgICAgRGlhZ25vc3RpY1JlcG9ydGVyIGRpYWdub3N0aWNSZXBvcnRlciwKICAgICAge3ZvaWQgbG9nZ2VyKFN0cmluZyBtc2cpfSkge30KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBpbnN0YW50aWF0ZUludm9jYXRpb24oQ29yZVR5cGVzIGNvcmVUeXBlcywgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgU3RyaW5nIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQsIGJvb2wgaXNTdXBlcikgewogICAgcmV0dXJuIG5ldyBJbnZhbGlkRXhwcmVzc2lvbihudWxsKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gaW5zdGFudGlhdGVOb1N1Y2hNZXRob2RFcnJvcihDb3JlVHlwZXMgY29yZVR5cGVzLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCwKICAgICAge2Jvb2wgaXNNZXRob2Q6IGZhbHNlLAogICAgICBib29sIGlzR2V0dGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc1NldHRlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNGaWVsZDogZmFsc2UsCiAgICAgIGJvb2wgaXNMb2NhbFZhcmlhYmxlOiBmYWxzZSwKICAgICAgYm9vbCBpc0R5bmFtaWM6IGZhbHNlLAogICAgICBib29sIGlzU3VwZXI6IGZhbHNlLAogICAgICBib29sIGlzU3RhdGljOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvbnN0cnVjdG9yOiBmYWxzZSwKICAgICAgYm9vbCBpc1RvcExldmVsOiBmYWxzZX0pIHsKICAgIHJldHVybiBuZXcgSW52YWxpZEV4cHJlc3Npb24obnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudHNCYWNrZW5kIGNvbnN0YW50c0JhY2tlbmQoQ29yZVR5cGVzIGNvcmVUeXBlcykgPT4KICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hvdWxkIHRoaXMgdmFyeSB3aXRoIHRoZSB1c2UgY2FzZT8KICAgICAgY29uc3QgTm9uZUNvbnN0YW50c0JhY2tlbmQoc3VwcG9ydHNVbmV2YWx1YXRlZENvbnN0YW50czogdHJ1ZSk7Cn0KgSoATk48HwEWIh0BOAEUGSIBTAIBMgFGOAMBMx8kGQIBKkIaAgFRFyAGATUGAgExGRwBSEEBRz8BRz8BMD0BSkVJTVBNPkUBOgZQGwZPKDICAUkYEwFFBik5ATwGT1AVTgFHF1EBFwFITikGTkweMgFLIAZKOwZOTUtPTScGOicBSC0GTEhLUSA9AU8mNBsbHy0kAU4xGxsgHy0iAUwGUUoRKkokAU8sBk8lKzIBSQZMGEgjKCMnNwFNBlFQT09RJwFQUU86MgFNP04qLzIBSUxKKSgBUBlNQwE/SR0cHBsjHRscISABQChCASgBP0QBPkMBSU8BOgIBNgwrAUMCASIbARoBKx05MRsbIB8tJAEMTUQoBAEMP0kdHBwbIx0bHCEhKAQBDDxCRgIBInBhY2thZ2U6a2VybmVsL3RhcmdldC90YXJnZXRzLmRhcnRCc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2FwaV9wcm90b3R5cGUvY29tcGlsZXJfb3B0aW9ucy5kYXJ0p7AvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmcm9udF9lbmQuY29tcGlsZXJfb3B0aW9uczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCcgc2hvdyBUYXJnZXQ7CgppbXBvcnQgJ2RpYWdub3N0aWNfbWVzc2FnZS5kYXJ0JyBzaG93IERpYWdub3N0aWNNZXNzYWdlSGFuZGxlcjsKCmltcG9ydCAnZXhwZXJpbWVudGFsX2ZsYWdzLmRhcnQnCiAgICBzaG93IGRlZmF1bHRFeHBlcmltZW50YWxGbGFncywgRXhwZXJpbWVudGFsRmxhZywgcGFyc2VFeHBlcmltZW50YWxGbGFnOwoKaW1wb3J0ICdmaWxlX3N5c3RlbS5kYXJ0JyBzaG93IEZpbGVTeXN0ZW07CgppbXBvcnQgJ3N0YW5kYXJkX2ZpbGVfc3lzdGVtLmRhcnQnIHNob3cgU3RhbmRhcmRGaWxlU3lzdGVtOwoKZXhwb3J0ICdkaWFnbm9zdGljX21lc3NhZ2UuZGFydCcgc2hvdyBEaWFnbm9zdGljTWVzc2FnZTsKCi8vLyBGcm9udC1lbmQgb3B0aW9ucyByZWxldmFudCB0byBjb21waWxlciBiYWNrIGVuZHMuCi8vLwovLy8gTm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IGNsaWVudHMuCmNsYXNzIENvbXBpbGVyT3B0aW9ucyB7CiAgLy8vIFRoZSBVUkkgb2YgdGhlIHJvb3Qgb2YgdGhlIERhcnQgU0RLICh0eXBpY2FsbHkgYSAiZmlsZToiIFVSSSkuCiAgLy8vCiAgLy8vIElmIGBudWxsYCwgdGhlIFNESyB3aWxsIGJlIHNlYXJjaGVkIGZvciB1c2luZwogIC8vLyBbUGxhdGZvcm0ucmVzb2x2ZWRFeGVjdXRhYmxlXSBhcyBhIHN0YXJ0aW5nIHBvaW50LgogIFVyaSBzZGtSb290OwoKICAvLy8gVXJpIHRvIGEgcGxhdGZvcm0gbGlicmFyaWVzIHNwZWNpZmljYXRpb24gZmlsZS4KICAvLy8KICAvLy8gQSBsaWJyYXJpZXMgc3BlY2lmaWNhdGlvbiBmaWxlIGlzIGEgSlNPTiBmaWxlIHRoYXQgZGVzY3JpYmVzIGhvdyB0byBtYXAKICAvLy8gYGRhcnQ6KmAgbGlicmFyaWVzIHRvIFVSSXMgaW4gdGhlIHVuZGVybHlpbmcgW2ZpbGVTeXN0ZW1dLiAgU2VlCiAgLy8vIGBwYWNrYWdlOmZyb250X2VuZC9zcmMvYmFzZS9saWJyYXJpZXNfc3BlY2lmaWNhdGlvbi5kYXJ0YCBmb3IgZGV0YWlscyBvbgogIC8vLyB0aGUgZm9ybWF0LgogIC8vLwogIC8vLyBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgYW5kIGBjb21waWxlU2RrID0gdHJ1ZWAsIHRoZSBjb21waWxlciB3aWxsCiAgLy8vIGluZmVyIGF0IGEgZGVmYXVsdCBsb2NhdGlvbiB1bmRlciBbc2RrUm9vdF0sIHR5cGljYWxseSB1bmRlcgogIC8vLyBgbGliL2xpYnJhcmllcy5qc29uYC4KICBVcmkgbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaTsKCiAgRGlhZ25vc3RpY01lc3NhZ2VIYW5kbGVyIG9uRGlhZ25vc3RpYzsKCiAgLy8vIFVSSSBvZiB0aGUgIi5wYWNrYWdlcyIgZmlsZSAodHlwaWNhbGx5IGEgImZpbGU6IiBVUkkpLgogIC8vLwogIC8vLyBJZiBgbnVsbGAsIHRoZSAiLnBhY2thZ2VzIiBmaWxlIHdpbGwgYmUgZm91bmQgdmlhIHRoZSBzdGFuZGFyZAogIC8vLyBwYWNrYWdlX2NvbmZpZyBzZWFyY2ggYWxnb3JpdGhtLgogIC8vLwogIC8vLyBJZiB0aGUgVVJJJ3MgcGF0aCBjb21wb25lbnQgaXMgZW1wdHkgKGUuZy4gYG5ldyBVcmkoKWApLCBubyBwYWNrYWdlcyBmaWxlCiAgLy8vIHdpbGwgYmUgdXNlZC4KICBVcmkgcGFja2FnZXNGaWxlVXJpOwoKICAvLy8gVVJJcyBvZiBpbnB1dCBzdW1tYXJ5IGZpbGVzIChleGNsdWRpbmcgdGhlIFNESyBzdW1tYXJ5OyB0eXBpY2FsbHkgdGhlc2UKICAvLy8gd2lsbCBiZSAiZmlsZToiIFVSSXMpLgogIC8vLwogIC8vLyBUaGVzZSBmaWxlcyBzaG91bGQgYmUgc3VtbWFyeSBmaWxlcyBnZW5lcmF0ZWQgYnkgdGhpcyBwYWNrYWdlIChhbmQgbm90IHRoZQogIC8vLyBzaW1pbGFybHkgbmFtZWQgc3VtbWFyeSBmaWxlcyBmcm9tIGBwYWNrYWdlOmFuYWx5emVyYC4pCiAgLy8vCiAgLy8vIFN1bW1hcmllcyBtYXkgYmUgcHJvdmlkZWQgaW4gYW55IG9yZGVyLCBidXQgdGhleSBzaG91bGQgYmUgYWN5Y2xpYyBhbmQKICAvLy8gY2xvc2VkOiBhbnkgbGlicmFyaWVzIHRoYXQgdGhleSByZWZlcmVuY2Ugc2hvdWxkIGJlIGRlZmluZWQgaW4gZWl0aGVyIG9uZQogIC8vLyBvZiBbaW5wdXRTdW1tYXJpZXNdIG9yIFtzZGtTdW1tYXJ5XS4KICBMaXN0PFVyaT4gaW5wdXRTdW1tYXJpZXMgPSBbXTsKCiAgLy8vIFVSSXMgb2Ygb3RoZXIga2VybmVsIGNvbXBvbmVudHMgdG8gbGluay4KICAvLy8KICAvLy8gQ29tbW9ubHkgdXNlZCB0byBsaW5rIHRoZSBjb2RlIGZvciB0aGUgU0RLIGxpYnJhcmllcyB0aGF0IHdhcyBjb21waWxlZAogIC8vLyBzZXBhcmF0ZWx5LiBGb3IgZXhhbXBsZSwgZGFydDJqcyBuZWVkcyB0byBsaW5rIHRoZSBTREsgc28gaXQgY2FuCiAgLy8vIG9wdGltaXplIGFuZCB0cmVlLXNoYWtlIHRoZSBjb2RlIGZvciB0aGUgYXBwbGljYXRpb24sIHdoZXJlYXMgdGhlIFZNCiAgLy8vIGFsd2F5cyBlbWJlZHMgdGhlIFNESyBpbnRlcm5hbGx5IGFuZCBkb2Vzbid0IG5lZWQgaXQgYXMgcGFydCBvZiB0aGUKICAvLy8gcHJvZ3JhbS4KICAvLy8KICAvLy8gVGhlIGNvbXBvbmVudHMgcHJvdmlkZWQgaGVyZSBzaG91bGQgYmUgY2xvc2VkIGFuZCBhY3ljbGljOiBhbnkgbGlicmFyaWVzCiAgLy8vIHRoYXQgdGhleSByZWZlcmVuY2Ugc2hvdWxkIGJlIGRlZmluZWQgaW4gYSBjb21wb25lbnQgaW4KICAvLy8gW2xpbmtlZERlcGVuZGVuY2llc10gb3IgYW55IG9mIHRoZSBbaW5wdXRTdW1tYXJpZXNdIG9yIFtzZGtTdW1tYXJ5XS4KICBMaXN0PFVyaT4gbGlua2VkRGVwZW5kZW5jaWVzID0gW107CgogIC8vLyBVUkkgb2YgdGhlIFNESyBzdW1tYXJ5IGZpbGUgKHR5cGljYWxseSBhICJmaWxlOiIgVVJJKS4KICAvLy8KICAvLy8gVGhpcyBzaG91bGQgc2hvdWxkIGJlIGEgc3VtbWFyeSBwcmV2aW9zbHkgZ2VuZXJhdGVkIGJ5IHRoaXMgcGFja2FnZSAoYW5kCiAgLy8vIG5vdCB0aGUgc2ltaWxhcmx5IG5hbWVkIHN1bW1hcnkgZmlsZXMgZnJvbSBgcGFja2FnZTphbmFseXplcmAuKQogIC8vLwogIC8vLyBJZiBgbnVsbGAgYW5kIFtjb21waWxlU2RrXSBpcyBmYWxzZSwgdGhlIFNESyBzdW1tYXJ5IHdpbGwgYmUgc2VhcmNoZWQgZm9yCiAgLy8vIGF0IGEgZGVmYXVsdCBsb2NhdGlvbiB3aXRoaW4gW3Nka1Jvb3RdLgogIFVyaSBzZGtTdW1tYXJ5OwoKICAvLy8gVGhlIGRlY2xhcmVkIHZhcmlhYmxlcyBmb3IgdXNlIGJ5IGNvbmZpZ3VyYWJsZSBpbXBvcnRzIGFuZCBjb25zdGFudAogIC8vLyBldmFsdWF0aW9uLgogIE1hcDxTdHJpbmcsIFN0cmluZz4gZGVjbGFyZWRWYXJpYWJsZXM7CgogIC8vLyBUaGUgW0ZpbGVTeXN0ZW1dIHdoaWNoIHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBmcm9udCBlbmQgdG8gYWNjZXNzIGZpbGVzLgogIC8vLwogIC8vLyBBbGwgZmlsZSBzeXN0ZW0gYWNjZXNzIHBlcmZvcm1lZCBieSB0aGUgZnJvbnQgZW5kIGdvZXMgdGhyb3VnaCB0aGlzCiAgLy8vIG1lY2hhbmlzbSwgd2l0aCBvbmUgZXhjZXB0aW9uOiBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yCiAgLy8vIFtwYWNrYWdlc0ZpbGVVcmldLCB0aGUgcGFja2FnZXMgZmlsZSBpcyBsb2NhdGVkIHVzaW5nIHRoZSBhY3R1YWwgcGh5c2ljYWwKICAvLy8gZmlsZSBzeXN0ZW0uICBUT0RPKHBhdWxiZXJyeSk6IGZpeCB0aGlzLgogIEZpbGVTeXN0ZW0gZmlsZVN5c3RlbSA9IFN0YW5kYXJkRmlsZVN5c3RlbS5pbnN0YW5jZTsKCiAgLy8vIFdoZXRoZXIgdG8gZ2VuZXJhdGUgY29kZSBmb3IgdGhlIFNESy4KICAvLy8KICAvLy8gQnkgZGVmYXVsdCB0aGUgZnJvbnQgZW5kIHJlc29sdmVzIGNvbXBvbmVudHMgdXNpbmcgYSBwcmVidWlsdCBTREsgc3VtbWFyeS4KICAvLy8gV2hlbiB0aGlzIG9wdGlvbiBpcyBgdHJ1ZWAsIFtzZGtTdW1tYXJ5XSBtdXN0IGJlIG51bGwuCiAgYm9vbCBjb21waWxlU2RrID0gZmFsc2U7CgogIEBkZXByZWNhdGVkCiAgYm9vbCBjaGFzZURlcGVuZGVuY2llczsKCiAgLy8vIFRydWUgaWYgZW5hYmxpbmcgbGVnYWN5IG1vZGUgKERhcnQgMSBjb21wYXRpYmlsaXR5KS4KICBib29sIGxlZ2FjeU1vZGUgPSBmYWxzZTsKCiAgLy8vIFBhdGNoIGZpbGVzIHRvIGFwcGx5IG9uIHRoZSBjb3JlIGxpYnJhcmllcyBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgcGxhdGZvcm0uCiAgLy8vCiAgLy8vIEtleXMgaW4gdGhlIG1hcCBhcmUgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2l0aCBubyBgZGFydDpgIHByZWZpeCwgZm9yCiAgLy8vIGV4YW1wbGU6CiAgLy8vCiAgLy8vICAgICAgeydjb3JlJzogWwogIC8vLyAgICAgICAgICdmaWxlOi8vL2xvY2F0aW9uL29mL2NvcmUvcGF0Y2hfZmlsZTEuZGFydCcsCiAgLy8vICAgICAgICAgJ2ZpbGU6Ly8vbG9jYXRpb24vb2YvY29yZS9wYXRjaF9maWxlMi5kYXJ0JywKICAvLy8gICAgICAgICBdfQogIC8vLwogIC8vLyBUaGUgdmFsdWVzIGNhbiBiZSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJJcy4gQWJzb2x1dGUgVVJJcyBhcmUgcmVhZAogIC8vLyBkaXJlY3RseSwgd2hpbGUgcmVsYXRpdmUgVVJJcyBhcmUgcmVzb2x2ZWQgZnJvbSB0aGUgW3Nka1Jvb3RdLgogIC8vIFRPRE8oc2lnbXVuZCk6IHByb3ZpZGUgYWxzbyBhIGZsYWcgdG8gbG9hZCB0aGlzIGRhdGEgZnJvbSBhIGZpbGUgKGxpa2UKICAvLyBsaWJyYXJpZXMuanNvbikKICBNYXA8U3RyaW5nLCBMaXN0PFVyaT4+IHRhcmdldFBhdGNoZXMgPSA8U3RyaW5nLCBMaXN0PFVyaT4+e307CgogIC8vLyBFbmFibGUgb3IgZGlzYWJsZSBleHBlcmltZW50YWwgZmVhdHVyZXMuIEZlYXR1cmVzIG1hcHBpbmcgdG8gYHRydWVgIGFyZQogIC8vLyBleHBsaWNpdGx5IGVuYWJsZWQuIEZlYXR1cmVzIG1hcHBpbmcgdG8gYGZhbHNlYCBhcmUgZXhwbGljaXRseSBkaXNhYmxlZC4KICAvLy8gRmVhdHVyZXMgbm90IG1lbnRpb25lZCBpbiB0aGUgbWFwIHdpbGwgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlLgogIE1hcDxFeHBlcmltZW50YWxGbGFnLCBib29sPiBleHBlcmltZW50YWxGbGFncyA9IDxFeHBlcmltZW50YWxGbGFnLCBib29sPnt9OwoKICAvLy8gRW52aXJvbm1lbnQgbWFwIHVzZWQgd2hlbiBldmFsdWF0aW5nIGBib29sLmZyb21FbnZpcm9ubWVudGAsCiAgLy8vIGBpbnQuZnJvbUVudmlyb25tZW50YCBhbmQgYFN0cmluZy5mcm9tRW52aXJvbm1lbnRgIGR1cmluZyBjb25zdGFudAogIC8vLyBldmFsdWF0aW9uLiBJZiB0aGUgbWFwIGlzIGBudWxsYCwgYWxsIGVudmlyb25tZW50IGNvbnN0YW50cyB3aWxsIGJlIGxlZnQKICAvLy8gdW5ldmFsdWF0ZWQgYW5kIGNhbiBiZSBldmFsdWF0ZWQgYnkgYSBjb25zdGFudCBldmFsdWF0b3IgbGF0ZXIuCiAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudERlZmluZXMgPSBudWxsOwoKICAvLy8gUmVwb3J0IGFuIGVycm9yIGlmIGEgY29uc3RhbnQgY291bGQgbm90IGJlIGV2YWx1YXRlZCAoZWl0aGVyIGJlY2F1c2UgaXQKICAvLy8gaXMgYW4gZW52aXJvbm1lbnQgY29uc3RhbnQgYW5kIG5vIGVudmlyb25tZW50IHdhcyBzcGVjaWZpZWQsIG9yIGJlY2F1c2UKICAvLy8gaXQgcmVmZXJzIHRvIGEgY29uc3RydWN0b3Igb3IgdmFyaWFibGUgaW5pdGlhbGl6ZXIgdGhhdCBpcyBub3QgYXZhaWxhYmxlKS4KICBib29sIGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50ID0gZmFsc2U7CgogIC8vLyBUaGUgdGFyZ2V0IHBsYXRmb3JtIHRoYXQgd2lsbCBjb25zdW1lIHRoZSBjb21waWxlZCBjb2RlLgogIC8vLwogIC8vLyBVc2VkIHRvIHByb3ZpZGUgcGxhdGZvcm0tc3BlY2lmaWMgZGV0YWlscyB0byB0aGUgY29tcGlsZXIgbGlrZToKICAvLy8gICAqIHRoZSBzZXQgb2YgbGlicmFyaWVzIGFyZSBwYXJ0IG9mIGEgcGxhdGZvcm0ncyBTREsgKGUuZy4gZGFydDpodG1sIGZvcgogIC8vLyAgICAgZGFydDJqcywgZGFydDp1aSBmb3IgZmx1dHRlcikuCiAgLy8vCiAgLy8vICAgKiB3aGF0IGtlcm5lbCB0cmFuc2Zvcm1hdGlvbnMgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudAogIC8vLyAgICAgKGFzeW5jL2F3YWl0LCBtaXhpbiBpbmxpbmluZywgZXRjKS4KICAvLy8KICAvLy8gICAqIGhvdyB0byBkZWFsIHdpdGggbm9uLXN0YW5kYXJkIGZlYXR1cmVzIGxpa2UgYG5hdGl2ZWAgZXh0ZW5zaW9ucy4KICAvLy8KICAvLy8gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdGFyZ2V0IGlzIHRoZSBWTS4KICBUYXJnZXQgdGFyZ2V0OwoKICAvLy8gRGVwcmVjYXRlZC4gSGFzIG5vIGFmZmVjdCBvbiBmcm9udC1lbmQuCiAgLy8gVE9ETyhkYXJ0YnVnLmNvbS8zNzUxNCkgUmVtb3ZlIHRoaXMgZmllbGQgb25jZSBEREsgcmVtb3ZlcyBpdHMgdXNlcyBvZiBpdC4KICBib29sIGVuYWJsZUFzc2VydHMgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gc2hvdyB2ZXJib3NlIG1lc3NhZ2VzIChtYWlubHkgZm9yIGRlYnVnZ2luZyBhbmQgcGVyZm9ybWFuY2UKICAvLy8gdHJhY2tpbmcpLgogIC8vLwogIC8vLyBNZXNzYWdlcyBhcmUgcHJpbnRlZCBvbiBzdGRvdXQuCiAgLy8gVE9ETyhzaWdtdW5kKTogaW1wcm92ZSB0aGUgZGlhZ25vdGljcyBBUEkgdG8gcHJvdmlkZSBtZWNoYW5pc20gdG8gaW50ZXJjZXB0CiAgLy8gdmVyYm9zZSBkYXRhIChJc3N1ZSAjMzAwNTYpCiAgYm9vbCB2ZXJib3NlID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIHJ1biBleHRyYSB2ZXJpZmljYXRpb24gc3RlcHMgdG8gdmFsaWRhdGUgdGhhdCBjb21waWxlZAogIC8vLyBjb21wb25lbnRzIGFyZSB3ZWxsIGZvcm1lZC4KICAvLy8KICAvLy8gRXJyb3JzIGFyZSByZXBvcnRlZCB2aWEgdGhlIFtvbkRpYWdub3N0aWNdIGNhbGxiYWNrLgogIGJvb2wgdmVyaWZ5ID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIGR1bXAgZ2VuZXJhdGVkIGNvbXBvbmVudHMgaW4gYSB0ZXh0IGZvcm1hdCAoYWxzbyBtYWlubHkgZm9yCiAgLy8vIGRlYnVnZ2luZykuCiAgLy8vCiAgLy8vIER1bXBlZCBkYXRhIGlzIHByaW50ZWQgaW4gc3Rkb3V0LgogIGJvb2wgZGVidWdEdW1wID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIG9taXQgdGhlIHBsYXRmb3JtIHdoZW4gc2VyaWFsaXppbmcgdGhlIHJlc3VsdCBmcm9tIGEgYGZhc3RhCiAgLy8vIGNvbXBpbGVgIHJ1bi4KICBib29sIG9taXRQbGF0Zm9ybSA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byBzZXQgdGhlIGV4aXQgY29kZSB0byBub24temVybyBpZiBhbnkgcHJvYmxlbSAoaW5jbHVkaW5nCiAgLy8vIHdhcm5pbmcsIGV0Yy4pIGlzIGVuY291bnRlcmVkIGR1cmluZyBjb21waWxhdGlvbi4KICBib29sIHNldEV4aXRDb2RlT25Qcm9ibGVtID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRvIGVtYmVkIHRoZSBpbnB1dCBzb3VyY2VzIGluIGdlbmVyYXRlZCBrZXJuZWwgY29tcG9uZW50cy4KICAvLy8KICAvLy8gVGhlIGtlcm5lbCBgQ29tcG9uZW50YCBBUEkgaW5jbHVkZXMgYSBgdXJpVG9Tb3VyY2VgIG1hcCBmaWVsZCB0aGF0IGlzIHVzZWQKICAvLy8gdG8gZW1iZWQgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGZpbGVzLiBUaGlzIHBhcnQgb2YgdGhlIGtlcm5lbAogIC8vLyBBUEkgaXMgaW4gZmx1eCBhbmQgaXQgaXMgbm90IG5lY2Vzc2FyeSBmb3Igc29tZSB0b29scy4gVG9kYXkgaXQgaXMgdXNlZAogIC8vLyBmb3IgdHJhbnNsYXRpbmcgZXJyb3IgbG9jYXRpb25zIGFuZCBzdGFjayB0cmFjZXMgaW4gdGhlIFZNLgogIC8vIFRPRE8oc2lnbXVuZCk6IGNoYW5nZSB0aGUgZGVmYXVsdC4KICBib29sIGVtYmVkU291cmNlVGV4dCA9IHRydWU7CgogIC8vLyBXaGV0aGVyIHRoZSBjb21waWxlciBzaG91bGQgdGhyb3cgYXMgc29vbiBhcyBpdCBlbmNvdW50ZXJzIGEKICAvLy8gY29tcGlsYXRpb24gZXJyb3IuCiAgLy8vCiAgLy8vIFR5cGljYWxseSB1c2VkIGJ5IGRldmVsb3BlcnMgdG8gZGVidWcgaW50ZXJuYWxzIG9mIHRoZSBjb21waWxlci4KICBib29sIHRocm93T25FcnJvcnNGb3JEZWJ1Z2dpbmcgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdGhlIGNvbXBpbGVyIHNob3VsZCB0aHJvdyBhcyBzb29uIGFzIGl0IGVuY291bnRlcnMgYQogIC8vLyBjb21waWxhdGlvbiB3YXJuaW5nLgogIC8vLwogIC8vLyBUeXBpY2FsbHkgdXNlZCBieSBkZXZlbG9wZXJzIHRvIGRlYnVnIGludGVybmFscyBvZiB0aGUgY29tcGlsZXIuCiAgYm9vbCB0aHJvd09uV2FybmluZ3NGb3JEZWJ1Z2dpbmcgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gZ2VuZXJhdGUgYnl0ZWNvZGUuCiAgYm9vbCBieXRlY29kZSA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byB3cml0ZSBhIGZpbGUgKGUuZy4gYSBkaWxsIGZpbGUpIHdoZW4gcmVwb3J0aW5nIGEgY3Jhc2guCiAgYm9vbCB3cml0ZUZpbGVPbkNyYXNoUmVwb3J0ID0gdHJ1ZTsKfQoKLy8vIFBhcnNlIGV4cGVyaW1lbnRhbCBmbGFncyBmcm9tIGEgbGlzdCBvZiBzdHJpbmdzLCBlYWNoIG9mIHdoaWNoIGlzIGVpdGhlciBhCi8vLyBmbGFnIG5hbWUgb3IgYSBmbGFnIG5hbWUgcHJlZml4ZWQgYnkgJ25vLScuIFJldHVybiBhIG1hcCBvZiBmbGFncyB0byB0aGVpcgovLy8gdmFsdWVzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBbZXhwZXJpbWVudGFsRmxhZ3NdLiBUaGUgcmV0dXJuZWQgbWFwIGlzCi8vLyBub3JtYWxpemVkIHRvIGNvbnRhaW4gZGVmYXVsdCB2YWx1ZXMgZm9yIHVubWVudGlvbmVkIGZsYWdzLgovLy8KLy8vIElmIGFuIHVua25vd24gZmxhZyBpcyBtZW50aW9uZWQsIG9yIGEgZmxhZyBpcyBtZW50aW9uZWQgbW9yZSB0aGFuIG9uY2UsCi8vLyB0aGUgc3VwcGxpZWQgZXJyb3IgaGFuZGxlciBpcyBjYWxsZWQgd2l0aCBhbiBlcnJvciBtZXNzYWdlLgpNYXA8RXhwZXJpbWVudGFsRmxhZywgYm9vbD4gcGFyc2VFeHBlcmltZW50YWxGbGFncygKICAgIEl0ZXJhYmxlPFN0cmluZz4gZXhwZXJpbWVudHMsIHZvaWQgb25FcnJvcihTdHJpbmcgbWVzc2FnZSkpIHsKICBNYXA8RXhwZXJpbWVudGFsRmxhZywgYm9vbD4gZmxhZ3MgPSA8RXhwZXJpbWVudGFsRmxhZywgYm9vbD57fTsKICBpZiAoZXhwZXJpbWVudHMgIT0gbnVsbCkgewogICAgZm9yIChTdHJpbmcgZXhwZXJpbWVudCBpbiBleHBlcmltZW50cykgewogICAgICBib29sIHZhbHVlID0gdHJ1ZTsKICAgICAgaWYgKGV4cGVyaW1lbnQuc3RhcnRzV2l0aCgibm8tIikpIHsKICAgICAgICB2YWx1ZSA9IGZhbHNlOwogICAgICAgIGV4cGVyaW1lbnQgPSBleHBlcmltZW50LnN1YnN0cmluZygzKTsKICAgICAgfQogICAgICBFeHBlcmltZW50YWxGbGFnIGZsYWcgPSBwYXJzZUV4cGVyaW1lbnRhbEZsYWcoZXhwZXJpbWVudCk7CiAgICAgIGlmIChmbGFnID09IG51bGwpIHsKICAgICAgICBvbkVycm9yKCJVbmtub3duIGV4cGVyaW1lbnQ6ICIgKyBleHBlcmltZW50KTsKICAgICAgfSBlbHNlIGlmIChmbGFnID09IEV4cGVyaW1lbnRhbEZsYWcuZXhwaXJlZEZsYWcpIHsKICAgICAgICBwcmludCgiRXhwZXJpbWVudCBmbGFnIG5vIGxvbmdlciByZXF1aXJlZDogIiArIGV4cGVyaW1lbnQpOwogICAgICB9IGVsc2UgaWYgKGZsYWdzLmNvbnRhaW5zS2V5KGZsYWcpKSB7CiAgICAgICAgaWYgKGZsYWdzW2ZsYWddICE9IHZhbHVlKSB7CiAgICAgICAgICBvbkVycm9yKAogICAgICAgICAgICAgICJFeHBlcmltZW50IHNwZWNpZmllZCB3aXRoIGNvbmZsaWN0aW5nIHZhbHVlczogIiArIGV4cGVyaW1lbnQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmbGFnc1tmbGFnXSA9IHZhbHVlOwogICAgICB9CiAgICB9CiAgfQogIGZvciAoRXhwZXJpbWVudGFsRmxhZyBmbGFnIGluIEV4cGVyaW1lbnRhbEZsYWcudmFsdWVzKSB7CiAgICBpZiAoZmxhZyA9PSBFeHBlcmltZW50YWxGbGFnLmV4cGlyZWRGbGFnKSBjb250aW51ZTsKICAgIGFzc2VydChkZWZhdWx0RXhwZXJpbWVudGFsRmxhZ3MuY29udGFpbnNLZXkoZmxhZyksCiAgICAgICAgIk5vIGRlZmF1bHQgdmFsdWUgZm9yICRmbGFnLiIpOwogICAgZmxhZ3NbZmxhZ10gPz89IGRlZmF1bHRFeHBlcmltZW50YWxGbGFnc1tmbGFnXTsKICB9CiAgcmV0dXJuIGZsYWdzOwp9CoEBAE5OPAEkATkBQAEhTAErATwBOQE2BDsYRQY0OQ8BNgZORk8SBk1DHCEBKQE9BkUnBlAUFwFOHQZRPgZNUCshAS8GTUdLSg8GTz5LJQE9Bk9GBlAuEgFKEikBTgZKQlAvNwEsBlE9GwEOGgE7GwFRBk4PBhY7OxEGUUVMFUABTk9HTgFDSU9GMQFOTlErAT8GRlApBkkuBksGNhEBLlAeAU0RBiZRIRgBSCIGOxcBTRIGKBoBTRQdAUk4JQFJBlFQTkIoHwFDGQZHKgFDGwZHLAEkGQFJJgIBT09KQARMQDRCQh0tGSoXLghBGjY5RCwkE04KDx0IBgQ7ODcoNAQQAgE5cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvY29tcGlsZXJfb3B0aW9ucy5kYXJ0RHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9hcGlfcHJvdG90eXBlL2RpYWdub3N0aWNfbWVzc2FnZS5kYXJ0itwvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmcm9udF9lbmQuZGlhZ25vc3RpY19tZXNzYWdlOwoKaW1wb3J0ICcuLi9mYXN0YS9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdyBDb2RlLCBEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uLCBGb3JtYXR0ZWRNZXNzYWdlOwoKaW1wb3J0ICcuLi9mYXN0YS9zZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKLy8vIFRoZSB0eXBlIG9mIGEgZGlhZ25vc3RpYyBtZXNzYWdlIGNhbGxiYWNrLiBGb3IgZXhhbXBsZToKLy8vCi8vLyAgICB2b2lkIGhhbmRsZXIoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSkgewovLy8gICAgICBpZiAoZW5hYmxlVGVybWluYWxDb2xvcnMpIHsgLy8gU2VlIFt0ZXJtaW5hbF9jb2xvcl9zdXBwb3J0LmRhcnRdLgovLy8gICAgICAgIG1lc3NhZ2UuYW5zaUZvcm1hdHRlZC5mb3JFYWNoKHN0ZGVyci53cml0ZWxuKTsKLy8vICAgICAgfSBlbHNlIHsKLy8vICAgICAgICBtZXNzYWdlLnBsYWluVGV4dEZvcm1hdHRlZC5mb3JFYWNoKHN0ZGVyci53cml0ZWxuKTsKLy8vICAgICAgfQovLy8gICAgfQp0eXBlZGVmIERpYWdub3N0aWNNZXNzYWdlSGFuZGxlciA9IHZvaWQgRnVuY3Rpb24oRGlhZ25vc3RpY01lc3NhZ2UpOwoKLy8vIFJlcHJlc2VudHMgYSBkaWFnbm9zdGljIG1lc3NhZ2UgdGhhdCBjYW4gYmUgcmVwb3J0ZWQgZnJvbSBhIHRvb2wsIGZvcgovLy8gZXhhbXBsZSwgYSBjb21waWxlci4KLy8vCi8vLyBUaGUgd29yZCAqZGlhZ25vc3RpYyogaXMgdXNlZCBsb29zZWx5IGhlcmUsIGFzIGEgdG9vbCBtYXkgYWxzbyB1c2UgdGhpcyBmb3IKLy8vIHJlcG9ydGluZyBhbnkga2luZCBvZiBtZXNzYWdlLCBpbmNsdWRpbmcgbm9uLWRpYWdub3N0aWMgbWVzc2FnZXMgc3VjaCBhcwovLy8gbGljZW5zaW5nLCBpbmZvcm1hbCwgb3IgbG9nZ2luZyBpbmZvcm1hdGlvbi4gVGhpcyBhbGxvd3MgYSB3ZWxsLWJlaGF2ZWQKLy8vIHRvb2wgdG8gbmV2ZXIgZGlyZWN0bHkgd3JpdGUgdG8gc3Rkb3V0IG9yIHN0ZGVyci4KYWJzdHJhY3QgY2xhc3MgRGlhZ25vc3RpY01lc3NhZ2UgewogIERpYWdub3N0aWNNZXNzYWdlLl8oKTsgLy8gUHJldmVudCBzdWJjbGFzc2luZy4KCiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgYW5zaUZvcm1hdHRlZDsKCiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgcGxhaW5UZXh0Rm9ybWF0dGVkOwoKICBTZXZlcml0eSBnZXQgc2V2ZXJpdHk7Cn0KCi8vLyBUaGlzIG1ldGhvZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KVXJpIGdldE1lc3NhZ2VVcmkoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSkgewogIHJldHVybiBtZXNzYWdlIGlzIEZvcm1hdHRlZE1lc3NhZ2UKICAgICAgPyBtZXNzYWdlLnVyaQogICAgICA6IG1lc3NhZ2UgaXMgRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbiA/IG1lc3NhZ2UudXJpIDogbnVsbDsKfQoKLy8vIFRoaXMgbWV0aG9kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgppbnQgZ2V0TWVzc2FnZUNoYXJPZmZzZXQoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSkgewogIHJldHVybiBtZXNzYWdlIGlzIEZvcm1hdHRlZE1lc3NhZ2UgPyBtZXNzYWdlLmNoYXJPZmZzZXQgOiBudWxsOwp9CgovLy8gVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuCmludCBnZXRNZXNzYWdlTGVuZ3RoKERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKICByZXR1cm4gbWVzc2FnZSBpcyBGb3JtYXR0ZWRNZXNzYWdlID8gbWVzc2FnZS5sZW5ndGggOiBudWxsOwp9CgovLy8gVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuCkNvZGUgZ2V0TWVzc2FnZUNvZGVPYmplY3QoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSkgewogIHJldHVybiBtZXNzYWdlIGlzIEZvcm1hdHRlZE1lc3NhZ2UgPyBtZXNzYWdlLmNvZGUgOiBudWxsOwp9CgovLy8gVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuClN0cmluZyBnZXRNZXNzYWdlSGVhZGVyVGV4dChEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgcmV0dXJuIG1lc3NhZ2UgaXMgRm9ybWF0dGVkTWVzc2FnZSA/IG1lc3NhZ2UubWVzc2FnZSA6IG51bGw7Cn0KCi8vLyBUaGlzIG1ldGhvZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KaW50IGdldE1lc3NhZ2VDb2RlKERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKICByZXR1cm4gbWVzc2FnZSBpcyBGb3JtYXR0ZWRNZXNzYWdlID8gbWVzc2FnZS5jb2RlLmluZGV4IDogLTE7Cn0KCi8vLyBUaGlzIG1ldGhvZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KTWFwPFN0cmluZywgZHluYW1pYz4gZ2V0TWVzc2FnZUFyZ3VtZW50cyhEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgcmV0dXJuIG1lc3NhZ2UgaXMgRm9ybWF0dGVkTWVzc2FnZSA/IG1lc3NhZ2UuYXJndW1lbnRzIDogbnVsbDsKfQoKLy8vIFRoaXMgbWV0aG9kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgpJdGVyYWJsZTxEaWFnbm9zdGljTWVzc2FnZT4gZ2V0TWVzc2FnZVJlbGF0ZWRJbmZvcm1hdGlvbigKICAgIERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKICByZXR1cm4gbWVzc2FnZSBpcyBGb3JtYXR0ZWRNZXNzYWdlID8gbWVzc2FnZS5yZWxhdGVkSW5mb3JtYXRpb24gOiBudWxsOwp9ClMATk48ASYBIzwBLwE8BDFLOhI/CwlFAUoZBFBNTDYjMQEmASsBGQIBJi8lFEMCASY2QgIBJjI+AgEmNzwCASY5PwIBJjBAAgEmRkECASY6IUoCATtwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9kaWFnbm9zdGljX21lc3NhZ2UuZGFydERzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Byb3RvdHlwZS9leHBlcmltZW50YWxfZmxhZ3MuZGFydIazLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIE5PVEU6IFRISVMgRklMRSBJUyBHRU5FUkFURUQuIERPIE5PVCBFRElULgovLwovLyBJbnN0ZWFkIG1vZGlmeSAndG9vbHMvZXhwZXJpbWVudGFsX2ZlYXR1cmVzLnlhbWwnIGFuZCBydW4KLy8gJ3BrZy9mcm9udF9lbmQvdG9vbC9mYXN0YSBnZW5lcmF0ZS1leHBlcmltZW50YWwtZmxhZ3MnIHRvIHVwZGF0ZS4KCmVudW0gRXhwZXJpbWVudGFsRmxhZyB7CiAgY29uc3RhbnRVcGRhdGUyMDE4LAogIGNvbnRyb2xGbG93Q29sbGVjdGlvbnMsCiAgZXh0ZW5zaW9uTWV0aG9kcywKICBub25OdWxsYWJsZSwKICBzcHJlYWRDb2xsZWN0aW9ucywKICB0cmlwbGVTaGlmdCwKCiAgLy8gQSBwbGFjZWhvbGRlciByZXByZXNlbnRpbmcgYW4gImV4cGlyZWQiIGZsYWcgd2hpY2ggaGFzIGJlZW4gcmVtb3ZlZAogIC8vIGZyb20gdGhlIGNvZGViYXNlIGJ1dCBzdGlsbCBuZWVkcyB0byBiZSBncmFjZWZ1bGx5IGlnbm9yZWQKICAvLyB3aGVuIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgogIGV4cGlyZWRGbGFnLAp9CgpFeHBlcmltZW50YWxGbGFnIHBhcnNlRXhwZXJpbWVudGFsRmxhZyhTdHJpbmcgZmxhZykgewogIHN3aXRjaCAoZmxhZykgewogICAgY2FzZSAiY29uc3RhbnQtdXBkYXRlLTIwMTgiOgogICAgICByZXR1cm4gRXhwZXJpbWVudGFsRmxhZy5jb25zdGFudFVwZGF0ZTIwMTg7CiAgICBjYXNlICJjb250cm9sLWZsb3ctY29sbGVjdGlvbnMiOgogICAgICByZXR1cm4gRXhwZXJpbWVudGFsRmxhZy5jb250cm9sRmxvd0NvbGxlY3Rpb25zOwogICAgY2FzZSAiZXh0ZW5zaW9uLW1ldGhvZHMiOgogICAgICByZXR1cm4gRXhwZXJpbWVudGFsRmxhZy5leHRlbnNpb25NZXRob2RzOwogICAgY2FzZSAibm9uLW51bGxhYmxlIjoKICAgICAgcmV0dXJuIEV4cGVyaW1lbnRhbEZsYWcubm9uTnVsbGFibGU7CiAgICBjYXNlICJzcHJlYWQtY29sbGVjdGlvbnMiOgogICAgICByZXR1cm4gRXhwZXJpbWVudGFsRmxhZy5zcHJlYWRDb2xsZWN0aW9uczsKICAgIGNhc2UgInRyaXBsZS1zaGlmdCI6CiAgICAgIHJldHVybiBFeHBlcmltZW50YWxGbGFnLnRyaXBsZVNoaWZ0OwoKICAgIC8vIEV4cGlyZWQgZmxhZ3MKICAgIGNhc2UgInNldC1saXRlcmFscyI6CiAgICAgIHJldHVybiBFeHBlcmltZW50YWxGbGFnLmV4cGlyZWRGbGFnOwogIH0KICByZXR1cm4gbnVsbDsKfQoKY29uc3QgTWFwPEV4cGVyaW1lbnRhbEZsYWcsIGJvb2w+IGRlZmF1bHRFeHBlcmltZW50YWxGbGFncyA9IHsKICBFeHBlcmltZW50YWxGbGFnLmNvbnN0YW50VXBkYXRlMjAxODogdHJ1ZSwKICBFeHBlcmltZW50YWxGbGFnLmNvbnRyb2xGbG93Q29sbGVjdGlvbnM6IHRydWUsCiAgRXhwZXJpbWVudGFsRmxhZy5leHRlbnNpb25NZXRob2RzOiBmYWxzZSwKICBFeHBlcmltZW50YWxGbGFnLm5vbk51bGxhYmxlOiBmYWxzZSwKICBFeHBlcmltZW50YWxGbGFnLnNwcmVhZENvbGxlY3Rpb25zOiB0cnVlLAogIEV4cGVyaW1lbnRhbEZsYWcudHJpcGxlU2hpZnQ6IGZhbHNlLAp9Owo3AE5OPAEuAz1FARgWGhQPFQ8BSUApDwIBNhIhMiU2HjAZKx8xGSsBFRkrBA8CAT8tMSwnLCcDATtwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9leHBlcmltZW50YWxfZmxhZ3MuZGFydD1zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Byb3RvdHlwZS9maWxlX3N5c3RlbS5kYXJ0imMvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmcm9udF9lbmQuZmlsZV9zeXN0ZW07CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwoKLy8vIEFic3RyYWN0IGludGVyZmFjZSB0byBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLgovLy8KLy8vIEFsbCBmcm9udCBlbmQgaW50ZXJhY3Rpb24gd2l0aCB0aGUgZmlsZSBzeXN0ZW0gZ29lcyB0aHJvdWdoIHRoaXMgaW50ZXJmYWNlOwovLy8gdGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgY2xpZW50cyB0byB1c2UgdGhlIGZyb250IGVuZCBpbiBhIHdheSB0aGF0Ci8vLyBkb2Vzbid0IHJlcXVpcmUgZmlsZSBzeXN0ZW0gYWNjZXNzIChlLmcuIHRvIHJ1biB1bml0IHRlc3RzLCBvciB0byBydW4KLy8vIGluc2lkZSBhIGJyb3dzZXIpLgovLy8KLy8vIE5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBjbGllbnRzLgphYnN0cmFjdCBjbGFzcyBGaWxlU3lzdGVtIHsKICAvLy8gUmV0dXJucyBhIFtGaWxlU3lzdGVtRW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBbdXJpXS4KICAvLy8KICAvLy8gVXNlcyBvZiBgLi5gIGFuZCBgLmAgaW4gdGhlIFVSSSBhcmUgbm9ybWFsaXplZCBiZWZvcmUgcmV0dXJuaW5nLgogIC8vLwogIC8vLyBJZiB0aGUgVVJJIHNjaGVtZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZSBzeXN0ZW0sIGFuIFtFcnJvcl0gd2lsbCBiZQogIC8vLyB0aHJvd24uCiAgLy8vCiAgLy8vIERvZXMgbm90IGNoZWNrIHdoZXRoZXIgYSBmaWxlIG9yIGZvbGRlciBleGlzdHMgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLgogIEZpbGVTeXN0ZW1FbnRpdHkgZW50aXR5Rm9yVXJpKFVyaSB1cmkpOwp9CgovLy8gQWJzdHJhY3QgcmVwcmVzZW50YXRpb24gb2YgYSBmaWxlIHN5c3RlbSBlbnRpdHkgdGhhdCBtYXkgb3IgbWF5IG5vdCBleGlzdC4KLy8vCi8vLyBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBoYXZlIHN1aXRhYmxlIGltcGxlbWVudGF0aW9ucyBvZiBlcXVhbGl0eSB0ZXN0cyBhbmQKLy8vIGhhc2hDb2RlLgovLy8KLy8vIE5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBjbGllbnRzLgphYnN0cmFjdCBjbGFzcyBGaWxlU3lzdGVtRW50aXR5IHsKICAvLy8gVGhlIGFic29sdXRlIG5vcm1hbGl6ZWQgVVJJIHJlcHJlc2VudGVkIGJ5IHRoaXMgZmlsZSBzeXN0ZW0gZW50aXR5LgogIC8vLwogIC8vLyBOb3RlOiB0aGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgVVJJIHRoYXQgd2FzIHBhc3NlZCB0bwogIC8vLyBbRmlsZVN5c3RlbS5lbnRpdHlGb3JVcmldLCBzaW5jZSB0aGUgVVJJIG1pZ2h0IGhhdmUgYmVlbiBub3JtYWxpemVkLgogIFVyaSBnZXQgdXJpOwoKICAvLy8gV2hldGhlciB0aGlzIGZpbGUgc3lzdGVtIGVudGl0eSBleGlzdHMuCiAgRnV0dXJlPGJvb2w+IGV4aXN0cygpOwoKICAvLy8gQXR0ZW1wdHMgdG8gYWNjZXNzIHRoaXMgZmlsZSBzeXN0ZW0gZW50aXR5IGFzIGEgZmlsZSBhbmQgcmVhZCBpdHMgY29udGVudHMKICAvLy8gYXMgcmF3IGJ5dGVzLgogIC8vLwogIC8vLyBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgYXR0ZW1wdGluZyB0byByZWFkIHRoZSBmaWxlIChlLmcuIGJlY2F1c2Ugbm8gc3VjaAogIC8vLyBmaWxlIGV4aXN0cywgb3IgdGhlIGVudGl0eSBpcyBhIGRpcmVjdG9yeSksIHRoZSBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGgKICAvLy8gW0ZpbGVTeXN0ZW1FeGNlcHRpb25dLgogIEZ1dHVyZTxMaXN0PGludD4+IHJlYWRBc0J5dGVzKCk7CgogIC8vLyBBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyBmaWxlIHN5c3RlbSBlbnRpdHkgYXMgYSBmaWxlIGFuZCByZWFkIGl0cyBjb250ZW50cwogIC8vLyBhcyBhIHN0cmluZy4KICAvLy8KICAvLy8gVGhlIGZpbGUgaXMgYXNzdW1lZCB0byBiZSBVVEYtOCBlbmNvZGVkLgogIC8vLwogIC8vLyBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgYXR0ZW1wdGluZyB0byByZWFkIHRoZSBmaWxlIChlLmcuIGJlY2F1c2Ugbm8gc3VjaAogIC8vLyBmaWxlIGV4aXN0cywgdGhlIGVudGl0eSBpcyBhIGRpcmVjdG9yeSwgb3IgdGhlIGZpbGUgaXMgbm90IHZhbGlkIFVURi04KSwKICAvLy8gdGhlIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0uCiAgRnV0dXJlPFN0cmluZz4gcmVhZEFzU3RyaW5nKCk7Cn0KCi8qKgogKiBCYXNlIGNsYXNzIGZvciBhbGwgZmlsZSBzeXN0ZW0gZXhjZXB0aW9ucy4KICovCmNsYXNzIEZpbGVTeXN0ZW1FeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb24gewogIGZpbmFsIFVyaSB1cmk7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CgogIEZpbGVTeXN0ZW1FeGNlcHRpb24odGhpcy51cmksIHRoaXMubWVzc2FnZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdGaWxlU3lzdGVtRXhjZXB0aW9uKHVyaT0kdXJpOyBtZXNzYWdlPSRtZXNzYWdlKSc7Cn0KTQBOTjwBHwEVATIEUEpKFwQ7HEUGRwZRDgZMKgIBTwRQDgQ7IkoGS0sPAS4ZAVEUBlFPHSMBURMGLwZRTzohAgEELgQxERgBLwEMSgIBNHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL2ZpbGVfc3lzdGVtLmRhcnQ6c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Jhc2UvcHJvY2Vzc2VkX29wdGlvbnMuZGFydMAAYBsvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmlvJyBzaG93IGV4aXRDb2RlOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZTsKCmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYmluYXJ5L2FzdF9mcm9tX2JpbmFyeS5kYXJ0JyBzaG93IEJpbmFyeUJ1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JyBzaG93IENhbm9uaWNhbE5hbWUsIENvbXBvbmVudCwgTG9jYXRpb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RhcmdldC90YXJnZXRzLmRhcnQnCiAgICBzaG93IE5vbmVUYXJnZXQsIFRhcmdldCwgVGFyZ2V0RmxhZ3M7CgppbXBvcnQgJ3BhY2thZ2U6cGFja2FnZV9jb25maWcvcGFja2FnZXMuZGFydCcgc2hvdyBQYWNrYWdlczsKCmltcG9ydCAncGFja2FnZTpwYWNrYWdlX2NvbmZpZy9wYWNrYWdlc19maWxlLmRhcnQnIGFzIHBhY2thZ2VfY29uZmlnOwoKaW1wb3J0ICdwYWNrYWdlOnBhY2thZ2VfY29uZmlnL3NyYy9wYWNrYWdlc19pbXBsLmRhcnQnIHNob3cgTWFwUGFja2FnZXM7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvY29tcGlsZXJfb3B0aW9ucy5kYXJ0JwogICAgc2hvdyBDb21waWxlck9wdGlvbnMsIERpYWdub3N0aWNNZXNzYWdlOwoKaW1wb3J0ICcuLi9hcGlfcHJvdG90eXBlL2V4cGVyaW1lbnRhbF9mbGFncy5kYXJ0JwogICAgc2hvdyBkZWZhdWx0RXhwZXJpbWVudGFsRmxhZ3MsIEV4cGVyaW1lbnRhbEZsYWc7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydCcKICAgIHNob3cgRmlsZVN5c3RlbSwgRmlsZVN5c3RlbUVudGl0eSwgRmlsZVN5c3RlbUV4Y2VwdGlvbjsKCmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS90ZXJtaW5hbF9jb2xvcl9zdXBwb3J0LmRhcnQnCiAgICBzaG93IHByaW50RGlhZ25vc3RpY01lc3NhZ2U7CgppbXBvcnQgJy4uL2Zhc3RhL2NvbW1hbmRfbGluZV9yZXBvcnRpbmcuZGFydCcgYXMgY29tbWFuZF9saW5lX3JlcG9ydGluZzsKCmltcG9ydCAnLi4vZmFzdGEvY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnLi4vZmFzdGEvZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBGb3JtYXR0ZWRNZXNzYWdlLAogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZUNhbnRJbmZlclBhY2thZ2VzRnJvbU1hbnlJbnB1dHMsCiAgICAgICAgbWVzc2FnZUNhbnRJbmZlclBhY2thZ2VzRnJvbVBhY2thZ2VVcmksCiAgICAgICAgbWVzc2FnZUludGVybmFsUHJvYmxlbVByb3ZpZGVkQm90aENvbXBpbGVTZGtBbmRTZGtTdW1tYXJ5LAogICAgICAgIG1lc3NhZ2VNaXNzaW5nSW5wdXQsCiAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgdGVtcGxhdGVDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbiwKICAgICAgICB0ZW1wbGF0ZUNhbnRSZWFkRmlsZSwKICAgICAgICB0ZW1wbGF0ZUlucHV0RmlsZU5vdEZvdW5kLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWQsCiAgICAgICAgdGVtcGxhdGVQYWNrYWdlc0ZpbGVGb3JtYXQsCiAgICAgICAgdGVtcGxhdGVTZGtSb290Tm90Rm91bmQsCiAgICAgICAgdGVtcGxhdGVTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmQsCiAgICAgICAgdGVtcGxhdGVTZGtTdW1tYXJ5Tm90Rm91bmQ7CgppbXBvcnQgJy4uL2Zhc3RhL21lc3NhZ2VzLmRhcnQnIHNob3cgZ2V0TG9jYXRpb247CgppbXBvcnQgJy4uL2Zhc3RhL3Byb2JsZW1zLmRhcnQnIHNob3cgRGVidWdBYm9ydCwgdW5pbXBsZW1lbnRlZDsKCmltcG9ydCAnLi4vZmFzdGEvc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eTsKCmltcG9ydCAnLi4vZmFzdGEvdGlja2VyLmRhcnQnIHNob3cgVGlja2VyOwoKaW1wb3J0ICcuLi9mYXN0YS91cmlfdHJhbnNsYXRvci5kYXJ0JyBzaG93IFVyaVRyYW5zbGF0b3I7CgppbXBvcnQgJ2xpYnJhcmllc19zcGVjaWZpY2F0aW9uLmRhcnQnCiAgICBzaG93CiAgICAgICAgTGlicmFyaWVzU3BlY2lmaWNhdGlvbiwKICAgICAgICBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uRXhjZXB0aW9uLAogICAgICAgIFRhcmdldExpYnJhcmllc1NwZWNpZmljYXRpb247CgovLy8gQWxsIG9wdGlvbnMgbmVlZGVkIGZvciB0aGUgZnJvbnQgZW5kIGltcGxlbWVudGF0aW9uLgovLy8KLy8vIFRoaXMgaW5jbHVkZXM6IGFsbCBvZiBbQ29tcGlsZXJPcHRpb25zXSBpbiBhIGZvcm0gdXNlZnVsIHRvIHRoZQovLy8gaW1wbGVtZW50YXRpb24sIGRlZmF1bHQgdmFsdWVzIGZvciBvcHRpb25zIHRoYXQgd2VyZSBub3QgcHJvdmlkZWQsCi8vLyBhbmQgaW5mb3JtYXRpb24gZGVyaXZlZCBmcm9tIGhvdyB0aGUgY29tcGlsZXIgd2FzIGludm9rZWQgKGxpa2UgdGhlCi8vLyBlbnRyeS1wb2ludHMgZ2l2ZW4gdG8gdGhlIGNvbXBpbGVyIGFuZCB3aGV0aGVyIGEgbW9kdWxhciBvciB3aG9sZS1wcm9ncmFtCi8vLyBBUEkgd2FzIHVzZWQpLgovLy8KLy8vIFRoZSBpbnRlbnQgaXMgdGhhdCB0aGUgZnJvbnQgZW5kIHNob3VsZCBpbW1lZGlhdGVseSB3cmFwIGFueSBpbmNvbWluZwovLy8gW0NvbXBpbGVyT3B0aW9uc10gb2JqZWN0IGluIHRoaXMgY2xhc3MgYmVmb3JlIGRvaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZywgYW5kCi8vLyBzaG91bGQgdGhlcmVhZnRlciBhY2Nlc3MgYWxsIG9wdGlvbnMgdmlhIHRoZSB3cmFwcGVyLiAgVGhpcyBlbnN1cmVzIHRoYXQKLy8vIG9wdGlvbnMgYXJlIGludGVycHJldGVkIGluIGEgY29uc2lzdGVudCB3YXkgYW5kIHRoYXQgZGF0YSBkZXJpdmVkIGZyb20KLy8vIG9wdGlvbnMgaXMgbm90IHVubmVjZXNzYXJpbHkgcmVjb21wdXRlZC4KY2xhc3MgUHJvY2Vzc2VkT3B0aW9ucyB7CiAgLy8vIFRoZSByYXcgW0NvbXBpbGVyT3B0aW9uc10gd2hpY2ggdGhpcyBjbGFzcyB3cmFwcy4KICBmaW5hbCBDb21waWxlck9wdGlvbnMgX3JhdzsKCiAgLy8vIFRoZSBwYWNrYWdlIG1hcCBkZXJpdmVkIGZyb20gdGhlIG9wdGlvbnMsIG9yIGBudWxsYCBpZiB0aGUgcGFja2FnZSBtYXAgaGFzCiAgLy8vIG5vdCBiZWVuIGNvbXB1dGVkIHlldC4KICBQYWNrYWdlcyBfcGFja2FnZXM7CgogIC8vLyBUaGUgdXJpIGZvciAucGFja2FnZXMgZGVyaXZlZCBmcm9tIHRoZSBvcHRpb25zLCBvciBgbnVsbGAgaWYgdGhlIHBhY2thZ2UKICAvLy8gbWFwIGhhcyBub3QgYmVlbiBjb21wdXRlZCB5ZXQgb3IgdGhlcmUgaXMgbm8gLnBhY2thZ2VzIGluIGVmZmVjdC4KICBVcmkgX3BhY2thZ2VzVXJpOwogIFVyaSBnZXQgcGFja2FnZXNVcmkgPT4gX3BhY2thZ2VzVXJpOwoKICAvLy8gVGhlIG9iamVjdCB0aGF0IGtub3dzIGhvdyB0byByZXNvbHZlICJwYWNrYWdlOiIgYW5kICJkYXJ0OiIgVVJJcywKICAvLy8gb3IgYG51bGxgIGlmIGl0IGhhcyBub3QgYmVlbiBjb21wdXRlZCB5ZXQuCiAgVXJpVHJhbnNsYXRvciBfdXJpVHJhbnNsYXRvcjsKCiAgLy8vIFRoZSBTREsgc3VtbWFyeSwgb3IgYG51bGxgIGlmIGl0IGhhcyBub3QgYmVlbiByZWFkIHlldC4KICAvLy8KICAvLy8gQSBzdW1tYXJ5LCBhbHNvIHJlZmVycmVkIHRvIGFzICJvdXRsaW5lIiBpbnRlcm5hbGx5LCBpcyBhIFtDb21wb25lbnRdCiAgLy8vIHdoZXJlIGFsbCBtZXRob2QgYm9kaWVzIGFyZSBsZWZ0IG91dC4gSW4gZXNzZW5jZSwgaXQgY29udGFpbnMganVzdCBBUEkKICAvLy8gc2lnbmF0dXJlcyBhbmQgY29uc3RhbnRzLiBUaGUgc3VtbWFyeSBzaG91bGQgaW5jbHVkZSBpbmZlcnJlZCB0b3AtbGV2ZWwKICAvLy8gdHlwZXMgdW5sZXNzIGxlZ2FjeSBtb2RlIGlzIGVuYWJsZWQuCiAgQ29tcG9uZW50IF9zZGtTdW1tYXJ5Q29tcG9uZW50OwoKICAvLy8gVGhlIHN1bW1hcnkgZm9yIGVhY2ggdXJpIGluIGBvcHRpb25zLmlucHV0U3VtbWFyaWVzYC4KICAvLy8KICAvLy8gQSBzdW1tYXJ5LCBhbHNvIHJlZmVycmVkIHRvIGFzICJvdXRsaW5lIiBpbnRlcm5hbGx5LCBpcyBhIFtDb21wb25lbnRdCiAgLy8vIHdoZXJlIGFsbCBtZXRob2QgYm9kaWVzIGFyZSBsZWZ0IG91dC4gSW4gZXNzZW5jZSwgaXQgY29udGFpbnMganVzdCBBUEkKICAvLy8gc2lnbmF0dXJlcyBhbmQgY29uc3RhbnRzLiBUaGUgc3VtbWFyaWVzIHNob3VsZCBpbmNsdWRlIGluZmVycmVkIHRvcC1sZXZlbAogIC8vLyB0eXBlcyB1bmxlc3MgbGVnYWN5IG1vZGUgaXMgZW5hYmxlZC4KICBMaXN0PENvbXBvbmVudD4gX2lucHV0U3VtbWFyaWVzQ29tcG9uZW50czsKCiAgLy8vIE90aGVyIGNvbXBvbmVudHMgdGhhdCBhcmUgbWVhbnQgdG8gYmUgbGlua2VkIGFuZCBjb21waWxlZCB3aXRoIHRoZSBpbnB1dAogIC8vLyBzb3VyY2VzLgogIExpc3Q8Q29tcG9uZW50PiBfbGlua2VkRGVwZW5kZW5jaWVzOwoKICAvLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSBTREssIG9yIGBudWxsYCBpZiB0aGUgbG9jYXRpb24gaGFzbid0IGJlZW4gZGV0ZXJtaW5lZAogIC8vLyB5ZXQuCiAgVXJpIF9zZGtSb290OwogIFVyaSBnZXQgc2RrUm9vdCB7CiAgICBfZW5zdXJlU2RrRGVmYXVsdHMoKTsKICAgIHJldHVybiBfc2RrUm9vdDsKICB9CgogIFVyaSBfc2RrU3VtbWFyeTsKICBVcmkgZ2V0IHNka1N1bW1hcnkgewogICAgX2Vuc3VyZVNka0RlZmF1bHRzKCk7CiAgICByZXR1cm4gX3Nka1N1bW1hcnk7CiAgfQoKICBMaXN0PGludD4gX3Nka1N1bW1hcnlCeXRlczsKCiAgLy8vIEdldCB0aGUgYnl0ZXMgb2YgdGhlIFNESyBvdXRsaW5lLCBpZiBhbnkuCiAgRnV0dXJlPExpc3Q8aW50Pj4gbG9hZFNka1N1bW1hcnlCeXRlcygpIGFzeW5jIHsKICAgIGlmIChfc2RrU3VtbWFyeUJ5dGVzID09IG51bGwpIHsKICAgICAgaWYgKHNka1N1bW1hcnkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBlbnRyeSA9IGZpbGVTeXN0ZW0uZW50aXR5Rm9yVXJpKHNka1N1bW1hcnkpOwogICAgICBfc2RrU3VtbWFyeUJ5dGVzID0gYXdhaXQgX3JlYWRBc0J5dGVzKGVudHJ5KTsKICAgIH0KICAgIHJldHVybiBfc2RrU3VtbWFyeUJ5dGVzOwogIH0KCiAgVXJpIF9saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpOwogIFVyaSBnZXQgbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSB7CiAgICBfZW5zdXJlU2RrRGVmYXVsdHMoKTsKICAgIHJldHVybiBfbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaTsKICB9CgogIFRpY2tlciB0aWNrZXI7CgogIFVyaSBnZXQgcGFja2FnZXNVcmlSYXcgPT4gX3Jhdy5wYWNrYWdlc0ZpbGVVcmk7CgogIGJvb2wgZ2V0IHZlcmJvc2UgPT4gX3Jhdy52ZXJib3NlOwoKICBib29sIGdldCB2ZXJpZnkgPT4gX3Jhdy52ZXJpZnk7CgogIGJvb2wgZ2V0IGRlYnVnRHVtcCA9PiBfcmF3LmRlYnVnRHVtcDsKCiAgYm9vbCBnZXQgb21pdFBsYXRmb3JtID0+IF9yYXcub21pdFBsYXRmb3JtOwoKICBib29sIGdldCBzZXRFeGl0Q29kZU9uUHJvYmxlbSA9PiBfcmF3LnNldEV4aXRDb2RlT25Qcm9ibGVtOwoKICBib29sIGdldCBlbWJlZFNvdXJjZVRleHQgPT4gX3Jhdy5lbWJlZFNvdXJjZVRleHQ7CgogIGJvb2wgZ2V0IHRocm93T25FcnJvcnNGb3JEZWJ1Z2dpbmcgPT4gX3Jhdy50aHJvd09uRXJyb3JzRm9yRGVidWdnaW5nOwoKICBib29sIGdldCB0aHJvd09uV2FybmluZ3NGb3JEZWJ1Z2dpbmcgPT4gX3Jhdy50aHJvd09uV2FybmluZ3NGb3JEZWJ1Z2dpbmc7CgogIC8vLyBUaGUgZW50cnktcG9pbnRzIHByb3ZpZGVkIHRvIHRoZSBjb21waWxlci4KICBmaW5hbCBMaXN0PFVyaT4gaW5wdXRzOwoKICAvLy8gVGhlIFVyaSB3aGVyZSBvdXRwdXQgaXMgZ2VuZXJhdGVkLCBtYXkgYmUgbnVsbC4KICBmaW5hbCBVcmkgb3V0cHV0OwoKICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50RGVmaW5lczsKCiAgYm9vbCBnZXQgZXJyb3JPblVuZXZhbHVhdGVkQ29uc3RhbnQgPT4gX3Jhdy5lcnJvck9uVW5ldmFsdWF0ZWRDb25zdGFudDsKCiAgLy8vIEluaXRpYWxpemVzIGEgW1Byb2Nlc3NlZE9wdGlvbnNdIG9iamVjdCB3cmFwcGluZyB0aGUgZ2l2ZW4gW3Jhd09wdGlvbnNdLgogIFByb2Nlc3NlZE9wdGlvbnMoe0NvbXBpbGVyT3B0aW9ucyBvcHRpb25zLCBMaXN0PFVyaT4gaW5wdXRzLCB0aGlzLm91dHB1dH0pCiAgICAgIDogdGhpcy5fcmF3ID0gb3B0aW9ucyA/PyBuZXcgQ29tcGlsZXJPcHRpb25zKCksCiAgICAgICAgdGhpcy5pbnB1dHMgPSBpbnB1dHMgPz8gPFVyaT5bXSwKICAgICAgICAvLyBUT0RPKGFza2VzYyk6IENvcHkgdGhlIG1hcCB3aGVuIGtlcm5lbF9zZXJ2aWNlIHN1cHBvcnRzIHRoYXQuCiAgICAgICAgdGhpcy5lbnZpcm9ubWVudERlZmluZXMgPSBvcHRpb25zPy5lbnZpcm9ubWVudERlZmluZXMsCiAgICAgICAgLy8gVE9ETyhzaWdtdW5kLCBhaGUpOiBjcmVhdGUgdGlja2VyIGV2ZW4gZWFybGllciBvciBwYXNzIGluIGEgc3RvcHdhdGNoCiAgICAgICAgLy8gY29sbGVjdGluZyB0aW1lIHNpbmNlIHRoZSBzdGFydCBvZiB0aGUgVk0uCiAgICAgICAgdGhpcy50aWNrZXIgPSBuZXcgVGlja2VyKGlzVmVyYm9zZTogb3B0aW9ucz8udmVyYm9zZSA/PyBmYWxzZSk7CgogIEZvcm1hdHRlZE1lc3NhZ2UgZm9ybWF0KAogICAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCBTZXZlcml0eSBzZXZlcml0eSwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCkgewogICAgaW50IG9mZnNldCA9IG1lc3NhZ2UuY2hhck9mZnNldDsKICAgIFVyaSB1cmkgPSBtZXNzYWdlLnVyaTsKICAgIExvY2F0aW9uIGxvY2F0aW9uID0gb2Zmc2V0ID09IC0xID8gbnVsbCA6IGdldExvY2F0aW9uKHVyaSwgb2Zmc2V0KTsKICAgIFN0cmluZyBmb3JtYXR0ZWQgPQogICAgICAgIGNvbW1hbmRfbGluZV9yZXBvcnRpbmcuZm9ybWF0KG1lc3NhZ2UsIHNldmVyaXR5LCBsb2NhdGlvbjogbG9jYXRpb24pOwogICAgTGlzdDxGb3JtYXR0ZWRNZXNzYWdlPiBmb3JtYXR0ZWRDb250ZXh0OwogICAgaWYgKGNvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0LmlzTm90RW1wdHkpIHsKICAgICAgZm9ybWF0dGVkQ29udGV4dCA9IG5ldyBMaXN0PEZvcm1hdHRlZE1lc3NhZ2U+KGNvbnRleHQubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZm9ybWF0dGVkQ29udGV4dFtpXSA9IGZvcm1hdChjb250ZXh0W2ldLCBTZXZlcml0eS5jb250ZXh0LCBudWxsKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG1lc3NhZ2Uud2l0aEZvcm1hdHRpbmcoZm9ybWF0dGVkLCBsb2NhdGlvbj8ubGluZSA/PyAtMSwKICAgICAgICBsb2NhdGlvbj8uY29sdW1uID8/IC0xLCBzZXZlcml0eSwgZm9ybWF0dGVkQ29udGV4dCk7CiAgfQoKICB2b2lkIHJlcG9ydChMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCBTZXZlcml0eSBzZXZlcml0eSwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBpZiAoY29tbWFuZF9saW5lX3JlcG9ydGluZy5pc0hpZGRlbihzZXZlcml0eSkpIHJldHVybjsKICAgIGlmIChjb21tYW5kX2xpbmVfcmVwb3J0aW5nLmlzQ29tcGlsZVRpbWVFcnJvcihzZXZlcml0eSkpIHsKICAgICAgQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQubG9nRXJyb3IobWVzc2FnZSwgc2V2ZXJpdHkpOwogICAgfQogICAgaWYgKENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMuc2V0RXhpdENvZGVPblByb2JsZW0pIHsKICAgICAgZXhpdENvZGUgPSAxOwogICAgfQogICAgcmVwb3J0RGlhZ25vc3RpY01lc3NhZ2UoZm9ybWF0KG1lc3NhZ2UsIHNldmVyaXR5LCBjb250ZXh0KSk7CiAgICBpZiAoY29tbWFuZF9saW5lX3JlcG9ydGluZy5zaG91bGRUaHJvd09uKHNldmVyaXR5KSkgewogICAgICB0aHJvdyBuZXcgRGVidWdBYm9ydCgKICAgICAgICAgIG1lc3NhZ2UudXJpLCBtZXNzYWdlLmNoYXJPZmZzZXQsIHNldmVyaXR5LCBTdGFja1RyYWNlLmN1cnJlbnQpOwogICAgfQogIH0KCiAgdm9pZCByZXBvcnREaWFnbm9zdGljTWVzc2FnZShEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAoX3Jhdy5vbkRpYWdub3N0aWMgPz8gX2RlZmF1bHREaWFnbm9zdGljTWVzc2FnZUhhbmRsZXIpKG1lc3NhZ2UpOwogIH0KCiAgdm9pZCBfZGVmYXVsdERpYWdub3N0aWNNZXNzYWdlSGFuZGxlcihEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBwcmludERpYWdub3N0aWNNZXNzYWdlKG1lc3NhZ2UsIHByaW50KTsKICB9CgogIC8vIFRPRE8oYXNrZXNjKTogUmVtb3ZlIHRoaXMgYW5kIGRpcmVjdCBjYWxsZXJzIGRpcmVjdGx5IHRvIHJlcG9ydC4KICB2b2lkIHJlcG9ydFdpdGhvdXRMb2NhdGlvbihNZXNzYWdlIG1lc3NhZ2UsIFNldmVyaXR5IHNldmVyaXR5KSB7CiAgICByZXBvcnQobWVzc2FnZS53aXRob3V0TG9jYXRpb24oKSwgc2V2ZXJpdHkpOwogIH0KCiAgLy8vIFJ1bnMgdmFyaW91cyB2YWxpZGF0aW9ucyBjaGVja3Mgb24gdGhlIGlucHV0IG9wdGlvbnMuIEZvciBpbnN0YW5jZSwKICAvLy8gaWYgYW4gb3B0aW9uIGlzIGEgcGF0aCB0byBhIGZpbGUsIGl0IGNoZWNrcyB0aGF0IHRoZSBmaWxlIGV4aXN0cy4KICBGdXR1cmU8Ym9vbD4gdmFsaWRhdGVPcHRpb25zKHtib29sIGVycm9yT25NaXNzaW5nSW5wdXQ6IHRydWV9KSBhc3luYyB7CiAgICBpZiAodmVyYm9zZSkgcHJpbnQoZGVidWdTdHJpbmcoKSk7CgogICAgaWYgKGVycm9yT25NaXNzaW5nSW5wdXQgJiYgaW5wdXRzLmlzRW1wdHkpIHsKICAgICAgcmVwb3J0V2l0aG91dExvY2F0aW9uKG1lc3NhZ2VNaXNzaW5nSW5wdXQsIFNldmVyaXR5LmVycm9yKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmIChfcmF3LnNka1Jvb3QgIT0gbnVsbCAmJgogICAgICAgICFhd2FpdCBmaWxlU3lzdGVtLmVudGl0eUZvclVyaShzZGtSb290KS5leGlzdHMoKSkgewogICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICB0ZW1wbGF0ZVNka1Jvb3ROb3RGb3VuZC53aXRoQXJndW1lbnRzKHNka1Jvb3QpLCBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB2YXIgc3VtbWFyeSA9IHNka1N1bW1hcnk7CiAgICBpZiAoc3VtbWFyeSAhPSBudWxsICYmICFhd2FpdCBmaWxlU3lzdGVtLmVudGl0eUZvclVyaShzdW1tYXJ5KS5leGlzdHMoKSkgewogICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICB0ZW1wbGF0ZVNka1N1bW1hcnlOb3RGb3VuZC53aXRoQXJndW1lbnRzKHN1bW1hcnkpLCBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAoY29tcGlsZVNkayAmJiBzdW1tYXJ5ICE9IG51bGwpIHsKICAgICAgcmVwb3J0V2l0aG91dExvY2F0aW9uKAogICAgICAgICAgbWVzc2FnZUludGVybmFsUHJvYmxlbVByb3ZpZGVkQm90aENvbXBpbGVTZGtBbmRTZGtTdW1tYXJ5LAogICAgICAgICAgU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGZvciAoVXJpIHNvdXJjZSBpbiBfcmF3LmxpbmtlZERlcGVuZGVuY2llcykgewogICAgICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIGNoZWNrLCB0aGUgY29tcGlsZXIgaXRzZWxmIHNob3VsZCBoYW5kbGUgYW5kCiAgICAgIC8vIHJlY292ZXIgZnJvbSB0aGlzLgogICAgICBpZiAoIWF3YWl0IGZpbGVTeXN0ZW0uZW50aXR5Rm9yVXJpKHNvdXJjZSkuZXhpc3RzKCkpIHsKICAgICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICAgIHRlbXBsYXRlSW5wdXRGaWxlTm90Rm91bmQud2l0aEFyZ3VtZW50cyhzb3VyY2UpLCBTZXZlcml0eS5lcnJvcik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0byBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgU0RLIHdoZW4gY29tcGlsaW5nIGEKICAvLy8gd2hvbGUtcHJvZ3JhbS4KICBib29sIGdldCBjb21waWxlU2RrID0+IF9yYXcuY29tcGlsZVNkazsKCiAgRmlsZVN5c3RlbSBfZmlsZVN5c3RlbTsKCiAgLy8vIEdldCB0aGUgW0ZpbGVTeXN0ZW1dIHdoaWNoIHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBmcm9udCBlbmQgdG8gYWNjZXNzCiAgLy8vIGZpbGVzLgogIEZpbGVTeXN0ZW0gZ2V0IGZpbGVTeXN0ZW0gPT4gX2ZpbGVTeXN0ZW0gPz89IF9jcmVhdGVGaWxlU3lzdGVtKCk7CgogIC8vLyBDbGVhciB0aGUgZmlsZSBzeXN0ZW0gc28gYW55IENvbXBpbGVyT3B0aW9ucyBmaWxlU3lzdGVtIGNoYW5nZSB3aWxsIGhhdmUKICAvLy8gZWZmZWN0LgogIHZvaWQgY2xlYXJGaWxlU3lzdGVtQ2FjaGUoKSA9PiBfZmlsZVN5c3RlbSA9IG51bGw7CgogIGJvb2wgZ2V0IGxlZ2FjeU1vZGUgPT4gX3Jhdy5sZWdhY3lNb2RlOwoKICAvLy8gV2hldGhlciB0byBnZW5lcmF0ZSBieXRlY29kZS4KICBib29sIGdldCBieXRlY29kZSA9PiBfcmF3LmJ5dGVjb2RlOwoKICAvLy8gV2hldGhlciB0byB3cml0ZSBhIGZpbGUgKGUuZy4gYSBkaWxsIGZpbGUpIHdoZW4gcmVwb3J0aW5nIGEgY3Jhc2guCiAgYm9vbCBnZXQgd3JpdGVGaWxlT25DcmFzaFJlcG9ydCA9PiBfcmF3LndyaXRlRmlsZU9uQ3Jhc2hSZXBvcnQ7CgogIFRhcmdldCBfdGFyZ2V0OwogIFRhcmdldCBnZXQgdGFyZ2V0ID0+IF90YXJnZXQgPz89CiAgICAgIF9yYXcudGFyZ2V0ID8/IG5ldyBOb25lVGFyZ2V0KG5ldyBUYXJnZXRGbGFncyhsZWdhY3lNb2RlOiBsZWdhY3lNb2RlKSk7CgogIGJvb2wgaXNFeHBlcmltZW50RW5hYmxlZChFeHBlcmltZW50YWxGbGFnIGZsYWcpIHsKICAgIGFzc2VydChkZWZhdWx0RXhwZXJpbWVudGFsRmxhZ3MuY29udGFpbnNLZXkoZmxhZyksCiAgICAgICAgIk5vIGRlZmF1bHQgdmFsdWUgZm9yICRmbGFnLiIpOwogICAgLy8gVE9ETyhhc2tlc2MpOiBEZXRlcm1pbmUgZGVmYXVsdCBmbGFnIHZhbHVlIGZyb20gc3BlY2lmaWNhdGlvbiBmaWxlLgogICAgcmV0dXJuIF9yYXcuZXhwZXJpbWVudGFsRmxhZ3NbZmxhZ10gPz8gZGVmYXVsdEV4cGVyaW1lbnRhbEZsYWdzW2ZsYWddOwogIH0KCiAgLy8vIEdldCBhbiBvdXRsaW5lIGNvbXBvbmVudCB0aGF0IHN1bW1hcml6ZXMgdGhlIFNESywgaWYgYW55LgogIC8vIFRPRE8oc2lnbXVuZCk6IG1vdmUsIHRoaXMgZG9lc24ndCBmZWVsIGxpa2UgYW4gIm9wdGlvbiIuCiAgRnV0dXJlPENvbXBvbmVudD4gbG9hZFNka1N1bW1hcnkoQ2Fub25pY2FsTmFtZSBuYW1lUm9vdCkgYXN5bmMgewogICAgaWYgKF9zZGtTdW1tYXJ5Q29tcG9uZW50ID09IG51bGwpIHsKICAgICAgaWYgKHNka1N1bW1hcnkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBieXRlcyA9IGF3YWl0IGxvYWRTZGtTdW1tYXJ5Qnl0ZXMoKTsKICAgICAgaWYgKGJ5dGVzICE9IG51bGwgJiYgYnl0ZXMuaXNOb3RFbXB0eSkgewogICAgICAgIF9zZGtTdW1tYXJ5Q29tcG9uZW50ID0gbG9hZENvbXBvbmVudChieXRlcywgbmFtZVJvb3QpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX3Nka1N1bW1hcnlDb21wb25lbnQ7CiAgfQoKICB2b2lkIHNldCBzZGtTdW1tYXJ5Q29tcG9uZW50KENvbXBvbmVudCBwbGF0Zm9ybSkgewogICAgaWYgKF9zZGtTdW1tYXJ5Q29tcG9uZW50ICE9IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoInNka1N1bW1hcnkgYWxyZWFkeSBsb2FkZWQuIik7CiAgICB9CiAgICBfc2RrU3VtbWFyeUNvbXBvbmVudCA9IHBsYXRmb3JtOwogIH0KCiAgLy8vIEdldCB0aGUgc3VtbWFyeSBwcm9ncmFtcyBmb3IgZWFjaCBvZiB0aGUgdW5kZXJseWluZyBgaW5wdXRTdW1tYXJpZXNgCiAgLy8vIHByb3ZpZGVkIHZpYSBbQ29tcGlsZXJPcHRpb25zXS4KICAvLyBUT0RPKHNpZ211bmQpOiBtb3ZlLCB0aGlzIGRvZXNuJ3QgZmVlbCBsaWtlIGFuICJvcHRpb24iLgogIEZ1dHVyZTxMaXN0PENvbXBvbmVudD4+IGxvYWRJbnB1dFN1bW1hcmllcyhDYW5vbmljYWxOYW1lIG5hbWVSb290KSBhc3luYyB7CiAgICBpZiAoX2lucHV0U3VtbWFyaWVzQ29tcG9uZW50cyA9PSBudWxsKSB7CiAgICAgIHZhciB1cmlzID0gX3Jhdy5pbnB1dFN1bW1hcmllczsKICAgICAgaWYgKHVyaXMgPT0gbnVsbCB8fCB1cmlzLmlzRW1wdHkpIHJldHVybiBjb25zdCA8Q29tcG9uZW50PltdOwogICAgICAvLyBUT0RPKHNpZ211bmQpOiB0aHJvdHRsZSAjIG9mIGNvbmN1cnJlbnQgb3ByZWF0aW9ucy4KICAgICAgdmFyIGFsbEJ5dGVzID0gYXdhaXQgRnV0dXJlLndhaXQoCiAgICAgICAgICB1cmlzLm1hcCgodXJpKSA9PiBfcmVhZEFzQnl0ZXMoZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkodXJpKSkpKTsKICAgICAgX2lucHV0U3VtbWFyaWVzQ29tcG9uZW50cyA9CiAgICAgICAgICBhbGxCeXRlcy5tYXAoKGJ5dGVzKSA9PiBsb2FkQ29tcG9uZW50KGJ5dGVzLCBuYW1lUm9vdCkpLnRvTGlzdCgpOwogICAgfQogICAgcmV0dXJuIF9pbnB1dFN1bW1hcmllc0NvbXBvbmVudHM7CiAgfQoKICB2b2lkIHNldCBpbnB1dFN1bW1hcmllc0NvbXBvbmVudHMoTGlzdDxDb21wb25lbnQ+IGNvbXBvbmVudHMpIHsKICAgIGlmIChfaW5wdXRTdW1tYXJpZXNDb21wb25lbnRzICE9IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoImlucHV0U3VtbWFyaWVzQ29tcG9uZW50cyBhbHJlYWR5IGxvYWRlZC4iKTsKICAgIH0KICAgIF9pbnB1dFN1bW1hcmllc0NvbXBvbmVudHMgPSBjb21wb25lbnRzOwogIH0KCiAgLy8vIExvYWQgZWFjaCBvZiB0aGUgW0NvbXBpbGVyT3B0aW9ucy5saW5rZWREZXBlbmRlbmNpZXNdIGNvbXBvbmVudHMuCiAgLy8gVE9ETyhzaWdtdW5kKTogbW92ZSwgdGhpcyBkb2Vzbid0IGZlZWwgbGlrZSBhbiAib3B0aW9uIi4KICBGdXR1cmU8TGlzdDxDb21wb25lbnQ+PiBsb2FkTGlua0RlcGVuZGVuY2llcyhDYW5vbmljYWxOYW1lIG5hbWVSb290KSBhc3luYyB7CiAgICBpZiAoX2xpbmtlZERlcGVuZGVuY2llcyA9PSBudWxsKSB7CiAgICAgIHZhciB1cmlzID0gX3Jhdy5saW5rZWREZXBlbmRlbmNpZXM7CiAgICAgIGlmICh1cmlzID09IG51bGwgfHwgdXJpcy5pc0VtcHR5KSByZXR1cm4gY29uc3QgPENvbXBvbmVudD5bXTsKICAgICAgLy8gVE9ETyhzaWdtdW5kKTogdGhyb3R0bGUgIyBvZiBjb25jdXJyZW50IG9wcmVhdGlvbnMuCiAgICAgIHZhciBhbGxCeXRlcyA9IGF3YWl0IEZ1dHVyZS53YWl0KAogICAgICAgICAgdXJpcy5tYXAoKHVyaSkgPT4gX3JlYWRBc0J5dGVzKGZpbGVTeXN0ZW0uZW50aXR5Rm9yVXJpKHVyaSkpKSk7CiAgICAgIF9saW5rZWREZXBlbmRlbmNpZXMgPQogICAgICAgICAgYWxsQnl0ZXMubWFwKChieXRlcykgPT4gbG9hZENvbXBvbmVudChieXRlcywgbmFtZVJvb3QpKS50b0xpc3QoKTsKICAgIH0KICAgIHJldHVybiBfbGlua2VkRGVwZW5kZW5jaWVzOwogIH0KCiAgLy8vIEhlbHBlciB0byBsb2FkIGEgLmRpbGwgZmlsZSBmcm9tIFt1cmldIHVzaW5nIHRoZSBleGlzdGluZyBbbmFtZVJvb3RdLgogIENvbXBvbmVudCBsb2FkQ29tcG9uZW50KExpc3Q8aW50PiBieXRlcywgQ2Fub25pY2FsTmFtZSBuYW1lUm9vdCwKICAgICAge2Jvb2wgYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2Rlc30pIHsKICAgIENvbXBvbmVudCBjb21wb25lbnQgPQogICAgICAgIHRhcmdldC5jb25maWd1cmVDb21wb25lbnQobmV3IENvbXBvbmVudChuYW1lUm9vdDogbmFtZVJvb3QpKTsKICAgIC8vIFRPRE8oYWhlKTogUGFzcyBmaWxlIG5hbWUgdG8gQmluYXJ5QnVpbGRlci4KICAgIC8vIFRPRE8oYWhlKTogQ29udHJvbCBsYXp5IGxvYWRpbmcgdmlhIGFuIG9wdGlvbi4KICAgIG5ldyBCaW5hcnlCdWlsZGVyKGJ5dGVzLAogICAgICAgICAgICBmaWxlbmFtZTogbnVsbCwKICAgICAgICAgICAgZGlzYWJsZUxhenlSZWFkaW5nOiBmYWxzZSwKICAgICAgICAgICAgYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2RlczogYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2RlcykKICAgICAgICAucmVhZENvbXBvbmVudChjb21wb25lbnQpOwogICAgcmV0dXJuIGNvbXBvbmVudDsKICB9CgogIC8vLyBHZXQgdGhlIFtVcmlUcmFuc2xhdG9yXSB3aGljaCByZXNvbHZlcyAicGFja2FnZToiIGFuZCAiZGFydDoiIFVSSXMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIG1ldGhvZCBzaW5jZSBmaWxlIHN5c3RlbSBvcGVyYXRpb25zIG1heSBiZQogIC8vLyByZXF1aXJlZCB0byBsb2NhdGUvcmVhZCB0aGUgcGFja2FnZXMgZmlsZSBhcyB3ZWxsIGFzIFNESyBtZXRhZGF0YS4KICBGdXR1cmU8VXJpVHJhbnNsYXRvcj4gZ2V0VXJpVHJhbnNsYXRvcih7Ym9vbCBieXBhc3NDYWNoZTogZmFsc2V9KSBhc3luYyB7CiAgICBpZiAoYnlwYXNzQ2FjaGUpIHsKICAgICAgX3VyaVRyYW5zbGF0b3IgPSBudWxsOwogICAgICBfcGFja2FnZXMgPSBudWxsOwogICAgfQogICAgaWYgKF91cmlUcmFuc2xhdG9yID09IG51bGwpIHsKICAgICAgdGlja2VyLmxvZ01zKCJTdGFydGVkIGJ1aWxkaW5nIFVyaVRyYW5zbGF0b3IiKTsKICAgICAgdmFyIGxpYnJhcmllcyA9IGF3YWl0IF9jb21wdXRlTGlicmFyeVNwZWNpZmljYXRpb24oKTsKICAgICAgdGlja2VyLmxvZ01zKCJSZWFkIGxpYnJhcmllcyBmaWxlIik7CiAgICAgIHZhciBwYWNrYWdlcyA9IGF3YWl0IF9nZXRQYWNrYWdlcygpOwogICAgICB0aWNrZXIubG9nTXMoIlJlYWQgcGFja2FnZXMgZmlsZSIpOwogICAgICBfdXJpVHJhbnNsYXRvciA9IG5ldyBVcmlUcmFuc2xhdG9yKGxpYnJhcmllcywgcGFja2FnZXMpOwogICAgfQogICAgcmV0dXJuIF91cmlUcmFuc2xhdG9yOwogIH0KCiAgRnV0dXJlPFRhcmdldExpYnJhcmllc1NwZWNpZmljYXRpb24+IF9jb21wdXRlTGlicmFyeVNwZWNpZmljYXRpb24oKSBhc3luYyB7CiAgICB2YXIgbmFtZSA9IHRhcmdldC5uYW1lOwogICAgLy8gVE9ETyhzaWdtdW5kKTogRWVrISBXZSBzaG91bGQgZ2V0IHRvIHRoZSBwb2ludCB3aGVyZSB0aGVyZSBpcyBubwogICAgLy8gZmFzdGEtc3BlY2lmaWMgdGFyZ2V0cyBhbmQgdGhlIHRhcmdldCBuYW1lcyBhcmUgbWVhbmluZ2Z1bC4KICAgIGlmIChuYW1lLmVuZHNXaXRoKCdfZmFzdGEnKSkgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoIC0gNik7CgogICAgaWYgKGxpYnJhcmllc1NwZWNpZmljYXRpb25VcmkgPT0gbnVsbCB8fAogICAgICAgICFhd2FpdCBmaWxlU3lzdGVtLmVudGl0eUZvclVyaShsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpKS5leGlzdHMoKSkgewogICAgICBpZiAoY29tcGlsZVNkaykgewogICAgICAgIHJlcG9ydFdpdGhvdXRMb2NhdGlvbigKICAgICAgICAgICAgdGVtcGxhdGVTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmQKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGxpYnJhcmllc1NwZWNpZmljYXRpb25VcmkpLAogICAgICAgICAgICBTZXZlcml0eS5lcnJvcik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uKG5hbWUpOwogICAgfQoKICAgIHZhciBqc29uID0KICAgICAgICBhd2FpdCBmaWxlU3lzdGVtLmVudGl0eUZvclVyaShsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpKS5yZWFkQXNTdHJpbmcoKTsKICAgIHRyeSB7CiAgICAgIHZhciBzcGVjID0KICAgICAgICAgIGF3YWl0IExpYnJhcmllc1NwZWNpZmljYXRpb24ucGFyc2UobGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSwganNvbik7CiAgICAgIHJldHVybiBzcGVjLnNwZWNpZmljYXRpb25Gb3IobmFtZSk7CiAgICB9IG9uIExpYnJhcmllc1NwZWNpZmljYXRpb25FeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgcmVwb3J0V2l0aG91dExvY2F0aW9uKAogICAgICAgICAgdGVtcGxhdGVDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbi53aXRoQXJndW1lbnRzKCcke2UuZXJyb3J9JyksCiAgICAgICAgICBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBuZXcgVGFyZ2V0TGlicmFyaWVzU3BlY2lmaWNhdGlvbihuYW1lKTsKICAgIH0KICB9CgogIC8vLyBHZXQgdGhlIHBhY2thZ2UgbWFwIHdoaWNoIG1hcHMgcGFja2FnZSBuYW1lcyB0byBVUklzLgogIC8vLwogIC8vLyBUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyBnZXR0ZXIgc2luY2UgZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucyBtYXkgYmUKICAvLy8gcmVxdWlyZWQgdG8gbG9jYXRlL3JlYWQgdGhlIHBhY2thZ2VzIGZpbGUuCiAgRnV0dXJlPFBhY2thZ2VzPiBfZ2V0UGFja2FnZXMoKSBhc3luYyB7CiAgICBpZiAoX3BhY2thZ2VzICE9IG51bGwpIHJldHVybiBfcGFja2FnZXM7CiAgICBfcGFja2FnZXNVcmkgPSBudWxsOwogICAgaWYgKF9yYXcucGFja2FnZXNGaWxlVXJpICE9IG51bGwpIHsKICAgICAgcmV0dXJuIF9wYWNrYWdlcyA9IGF3YWl0IGNyZWF0ZVBhY2thZ2VzRnJvbUZpbGUoX3Jhdy5wYWNrYWdlc0ZpbGVVcmkpOwogICAgfQoKICAgIGlmIChpbnB1dHMubGVuZ3RoID4gMSkgewogICAgICAvLyBUT0RPKHNpZ211bmQpOiBjb25zaWRlciBub3QgcmVwb3J0aW5nIGFuIGVycm9yIGlmIHdlIHdvdWxkIGluZmVyCiAgICAgIC8vIHRoZSBzYW1lIC5wYWNrYWdlcyBmaWxlIGZyb20gYWxsIG9mIHRoZSBpbnB1dHMuCiAgICAgIHJlcG9ydFdpdGhvdXRMb2NhdGlvbigKICAgICAgICAgIG1lc3NhZ2VDYW50SW5mZXJQYWNrYWdlc0Zyb21NYW55SW5wdXRzLCBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBfcGFja2FnZXMgPSBQYWNrYWdlcy5ub1BhY2thZ2VzOwogICAgfQoKICAgIHZhciBpbnB1dCA9IGlucHV0cy5maXJzdDsKCiAgICAvLyBXaGVuIGNvbXBpbGluZyB0aGUgU0RLIHRoZSBpbnB1dCBmaWxlcyBhcmUgbm9ybWFseSBgZGFydDpgIFVSSXMuCiAgICBpZiAoaW5wdXQuc2NoZW1lID09ICdkYXJ0JykgcmV0dXJuIF9wYWNrYWdlcyA9IFBhY2thZ2VzLm5vUGFja2FnZXM7CgogICAgaWYgKGlucHV0LnNjaGVtZSA9PSAncGFja2FnZXMnKSB7CiAgICAgIHJlcG9ydCgKICAgICAgICAgIG1lc3NhZ2VDYW50SW5mZXJQYWNrYWdlc0Zyb21QYWNrYWdlVXJpLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICBpbnB1dCwgLTEsIG5vTGVuZ3RoKSwKICAgICAgICAgIFNldmVyaXR5LmVycm9yKTsKICAgICAgcmV0dXJuIF9wYWNrYWdlcyA9IFBhY2thZ2VzLm5vUGFja2FnZXM7CiAgICB9CgogICAgcmV0dXJuIF9wYWNrYWdlcyA9IGF3YWl0IF9maW5kUGFja2FnZXMoaW5wdXRzLmZpcnN0KTsKICB9CgogIC8vLyBDcmVhdGUgYSBbUGFja2FnZXNdIGdpdmVuIHRoZSBVcmkgdG8gYSBgLnBhY2thZ2VzYCBmaWxlLgogIEZ1dHVyZTxQYWNrYWdlcz4gY3JlYXRlUGFja2FnZXNGcm9tRmlsZShVcmkgZmlsZSkgYXN5bmMgewogICAgTGlzdDxpbnQ+IGNvbnRlbnRzOwogICAgdHJ5IHsKICAgICAgLy8gVE9ETyhhaGUpOiBXZSBuZWVkIHRvIGNvbXB1dGUgbGluZSBlbmRpbmdzIGZvciB0aGlzIGZpbGUuCiAgICAgIGNvbnRlbnRzID0gYXdhaXQgZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkoZmlsZSkucmVhZEFzQnl0ZXMoKTsKICAgIH0gb24gRmlsZVN5c3RlbUV4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICB0ZW1wbGF0ZUNhbnRSZWFkRmlsZS53aXRoQXJndW1lbnRzKGZpbGUsIGUubWVzc2FnZSksIFNldmVyaXR5LmVycm9yKTsKICAgIH0KICAgIGlmIChjb250ZW50cyAhPSBudWxsKSB7CiAgICAgIF9wYWNrYWdlc1VyaSA9IGZpbGU7CiAgICAgIHRyeSB7CiAgICAgICAgTWFwPFN0cmluZywgVXJpPiBtYXAgPSBwYWNrYWdlX2NvbmZpZy5wYXJzZShjb250ZW50cywgZmlsZSk7CiAgICAgICAgcmV0dXJuIG5ldyBNYXBQYWNrYWdlcyhtYXApOwogICAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICAgIHJlcG9ydCgKICAgICAgICAgICAgdGVtcGxhdGVQYWNrYWdlc0ZpbGVGb3JtYXQKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGUubWVzc2FnZSkKICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oZmlsZSwgZS5vZmZzZXQsIG5vTGVuZ3RoKSwKICAgICAgICAgICAgU2V2ZXJpdHkuZXJyb3IpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmVwb3J0V2l0aG91dExvY2F0aW9uKAogICAgICAgICAgICB0ZW1wbGF0ZUNhbnRSZWFkRmlsZS53aXRoQXJndW1lbnRzKGZpbGUsICIkZSIpLCBTZXZlcml0eS5lcnJvcik7CiAgICAgIH0KICAgIH0KICAgIF9wYWNrYWdlc1VyaSA9IG51bGw7CiAgICByZXR1cm4gUGFja2FnZXMubm9QYWNrYWdlczsKICB9CgogIC8vLyBGaW5kcyBhIHBhY2thZ2UgcmVzb2x1dGlvbiBzdHJhdGVneSB1c2luZyBhIFtGaWxlU3lzdGVtXS4KICAvLy8KICAvLy8gVGhlIFtzY3JpcHRVcmldIHBvaW50cyB0byBhIERhcnQgc2NyaXB0IHdpdGggYSB2YWxpZCBzY2hlbWUgYWNjZXB0ZWQgYnkKICAvLy8gdGhlIFtGaWxlU3lzdGVtXS4KICAvLy8KICAvLy8gVGhpcyBmdW5jdGlvbiBmaXJzdCB0cmllcyB0byBsb2NhdGUgYSBgLnBhY2thZ2VzYCBmaWxlIGluIHRoZSBgc2NyaXB0VXJpYAogIC8vLyBkaXJlY3RvcnkuIElmIHRoYXQgaXMgbm90IGZvdW5kLCBpdCBzdGFydHMgY2hlY2tpbmcgcGFyZW50IGRpcmVjdG9yaWVzIGZvcgogIC8vLyBhIGAucGFja2FnZXNgIGZpbGUsIGFuZCBzdG9wcyBpZiBpdCBmaW5kcyBpdC4gT3RoZXJ3aXNlIGl0IGdpdmVzIHVwIGFuZAogIC8vLyByZXR1cm5zIFtQYWNrYWdlcy5ub1BhY2thZ2VzXS4KICAvLy8KICAvLy8gTm90ZTogdGhpcyBpcyBhIGZvcmsgZnJvbSBgcGFja2FnZTpwYWNrYWdlX2NvbmZpZy9kaXNjb3ZlcnkuZGFydGAgdG8gYWRhcHQKICAvLy8gaXQgdG8gdXNlIFtGaWxlU3lzdGVtXS4gVGhlIGxvZ2ljIGhlcmUgaXMgYSBtaXggb2YgdGhlIGxvZ2ljIGluIHRoZQogIC8vLyBgZmluZFBhY2thZ2VzRnJvbUZpbGVgIGFuZCBgZmluZFBhY2thZ2VzRnJvbU5vbkZpbGVgOgogIC8vLwogIC8vLyAgICAqIExpa2UgYGZpbmRQYWNrYWdlc0Zyb21GaWxlYCByZXNvbHV0aW9uIHNlYXJjaGVzIGZvciBwYXJlbnQKICAvLy8gICAgZGlyZWN0b3JpZXMKICAvLy8KICAvLy8gICAgKiBVbmxpa2UgcGFja2FnZTpwYWNrYWdlX2NvbmZpZywgaXQgZG9lcyBub3QgbG9vayBmb3IgYSBgcGFja2FnZXMvYAogIC8vLyAgICBkaXJlY3RvcnksIGFzIHRoYXQgd29uJ3QgYmUgc3VwcG9ydGVkIGluIERhcnQgMi4KICBGdXR1cmU8UGFja2FnZXM+IF9maW5kUGFja2FnZXMoVXJpIHNjcmlwdFVyaSkgYXN5bmMgewogICAgdmFyIGRpciA9IHNjcmlwdFVyaS5yZXNvbHZlKCcuJyk7CiAgICBpZiAoIWRpci5pc0Fic29sdXRlKSB7CiAgICAgIHJlcG9ydFdpdGhvdXRMb2NhdGlvbigKICAgICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWQKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cygiRXhwZWN0ZWQgaW5wdXQgVXJpIHRvIGJlIGFic29sdXRlOiAkc2NyaXB0VXJpLiIpLAogICAgICAgICAgU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKICAgICAgcmV0dXJuIFBhY2thZ2VzLm5vUGFja2FnZXM7CiAgICB9CgogICAgRnV0dXJlPFVyaT4gY2hlY2tJbkRpcihVcmkgZGlyKSBhc3luYyB7CiAgICAgIFVyaSBjYW5kaWRhdGUgPSBkaXIucmVzb2x2ZSgnLnBhY2thZ2VzJyk7CiAgICAgIGlmIChhd2FpdCBmaWxlU3lzdGVtLmVudGl0eUZvclVyaShjYW5kaWRhdGUpLmV4aXN0cygpKSByZXR1cm4gY2FuZGlkYXRlOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvLyBDaGVjayBmb3IgJGN3ZC8ucGFja2FnZXMKICAgIHZhciBjYW5kaWRhdGUgPSBhd2FpdCBjaGVja0luRGlyKGRpcik7CiAgICBpZiAoY2FuZGlkYXRlICE9IG51bGwpIHJldHVybiBjcmVhdGVQYWNrYWdlc0Zyb21GaWxlKGNhbmRpZGF0ZSk7CgogICAgLy8gQ2hlY2sgZm9yIGN3ZCgvLi4pKy8ucGFja2FnZXMKICAgIHZhciBwYXJlbnREaXIgPSBkaXIucmVzb2x2ZSgnLi4nKTsKICAgIHdoaWxlIChwYXJlbnREaXIucGF0aCAhPSBkaXIucGF0aCkgewogICAgICBjYW5kaWRhdGUgPSBhd2FpdCBjaGVja0luRGlyKHBhcmVudERpcik7CiAgICAgIGlmIChjYW5kaWRhdGUgIT0gbnVsbCkgYnJlYWs7CiAgICAgIGRpciA9IHBhcmVudERpcjsKICAgICAgcGFyZW50RGlyID0gZGlyLnJlc29sdmUoJy4uJyk7CiAgICB9CgogICAgaWYgKGNhbmRpZGF0ZSAhPSBudWxsKSByZXR1cm4gY3JlYXRlUGFja2FnZXNGcm9tRmlsZShjYW5kaWRhdGUpOwogICAgcmV0dXJuIFBhY2thZ2VzLm5vUGFja2FnZXM7CiAgfQoKICBib29sIF9jb21wdXRlZFNka0RlZmF1bHRzID0gZmFsc2U7CgogIC8vLyBFbnN1cmUgW19zZGtSb290XSwgW19zZGtTdW1tYXJ5XSBhbmQgW19saWJyYXJ5U3BlY1VyaV0gYXJlIGluaXRpYWxpemVkLgogIC8vLwogIC8vLyBJZiB0aGV5IGFyZSBub3Qgc2V0IGV4cGxpY2l0bHksIHRoZXkgYXJlIGluZmVyZWQgYmFzZWQgb24gdGhlIGRlZmF1bHQKICAvLy8gYmVoYXZpb3IgZGVzY3JpYmVkIGluIFtDb21waWxlck9wdGlvbnNdLgogIHZvaWQgX2Vuc3VyZVNka0RlZmF1bHRzKCkgewogICAgaWYgKF9jb21wdXRlZFNka0RlZmF1bHRzKSByZXR1cm47CiAgICBfY29tcHV0ZWRTZGtEZWZhdWx0cyA9IHRydWU7CiAgICB2YXIgcm9vdCA9IF9yYXcuc2RrUm9vdDsKICAgIGlmIChyb290ICE9IG51bGwpIHsKICAgICAgLy8gTm9ybWFsaXplIHRvIGFsd2F5cyBlbmQgaW4gJy8nCiAgICAgIGlmICghcm9vdC5wYXRoLmVuZHNXaXRoKCcvJykpIHsKICAgICAgICByb290ID0gcm9vdC5yZXBsYWNlKHBhdGg6IHJvb3QucGF0aCArICcvJyk7CiAgICAgIH0KICAgICAgX3Nka1Jvb3QgPSByb290OwogICAgfSBlbHNlIGlmIChjb21waWxlU2RrKSB7CiAgICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogaW1wbGVtZW50IHRoZSBhbGdvcml0aG0gZm9yIGZpbmRpbmcgdGhlIFNESwogICAgICAvLyBhdXRvbWFnaWNhbGx5LgogICAgICB1bmltcGxlbWVudGVkKCdpbmZlciB0aGUgZGVmYXVsdCBzZGsgbG9jYXRpb24nLCAtMSwgbnVsbCk7CiAgICB9CgogICAgaWYgKF9yYXcuc2RrU3VtbWFyeSAhPSBudWxsKSB7CiAgICAgIF9zZGtTdW1tYXJ5ID0gX3Jhdy5zZGtTdW1tYXJ5OwogICAgfSBlbHNlIGlmICghY29tcGlsZVNkaykgewogICAgICAvLyBJbmZlciBiYXNlZCBvbiB0aGUgc2RrUm9vdCwgYnV0IG9ubHkgd2hlbiBgY29tcGlsZVNka2AgaXMgZmFsc2UsCiAgICAgIC8vIG90aGVyd2lzZSB0aGUgZGVmYXVsdCBpbnRlbnQgd2FzIHRvIGNvbXBpbGUgdGhlIHNkayBmcm9tIHNvdXJjZXMgYW5kCiAgICAgIC8vIG5vdCB0byBsb2FkIGFuIHNkayBzdW1tYXJ5IGZpbGUuCiAgICAgIF9zZGtTdW1tYXJ5ID0gcm9vdD8ucmVzb2x2ZSgidm1fcGxhdGZvcm1fc3Ryb25nLmRpbGwiKTsKICAgIH0KCiAgICBpZiAoX3Jhdy5saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpICE9IG51bGwpIHsKICAgICAgX2xpYnJhcmllc1NwZWNpZmljYXRpb25VcmkgPSBfcmF3LmxpYnJhcmllc1NwZWNpZmljYXRpb25Vcmk7CiAgICB9IGVsc2UgaWYgKGNvbXBpbGVTZGspIHsKICAgICAgX2xpYnJhcmllc1NwZWNpZmljYXRpb25VcmkgPSBzZGtSb290LnJlc29sdmUoJ2xpYi9saWJyYXJpZXMuanNvbicpOwogICAgfQogIH0KCiAgLy8vIENyZWF0ZSBhIFtGaWxlU3lzdGVtXSBzcGVjaWZpYyB0byB0aGUgY3VycmVudCBvcHRpb25zLgogIEZpbGVTeXN0ZW0gX2NyZWF0ZUZpbGVTeXN0ZW0oKSB7CiAgICByZXR1cm4gX3Jhdy5maWxlU3lzdGVtOwogIH0KCiAgU3RyaW5nIGRlYnVnU3RyaW5nKCkgewogICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgd3JpdGVMaXN0KFN0cmluZyBuYW1lLCBMaXN0IGVsZW1lbnRzKSB7CiAgICAgIGlmIChlbGVtZW50cy5pc0VtcHR5KSB7CiAgICAgICAgc2Iud3JpdGVsbignJG5hbWU6IDxlbXB0eT4nKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgc2Iud3JpdGVsbignJG5hbWU6Jyk7CiAgICAgIGVsZW1lbnRzLmZvckVhY2goKHMpIHsKICAgICAgICBzYi53cml0ZWxuKCcgIC0gJHMnKTsKICAgICAgfSk7CiAgICB9CgogICAgc2Iud3JpdGVsbignSW5wdXRzOiAke2lucHV0c30nKTsKICAgIHNiLndyaXRlbG4oJ091dHB1dDogJHtvdXRwdXR9Jyk7CgogICAgc2Iud3JpdGVsbignV2FzIGRpYWdub3N0aWMgbWVzc2FnZSBoYW5kbGVyIHByb3ZpZGVkOiAnCiAgICAgICAgJyR7X3Jhdy5vbkRpYWdub3N0aWMgPT0gbnVsbCA/ICJubyIgOiAieWVzIn0nKTsKCiAgICBzYi53cml0ZWxuKCdGaWxlU3lzdGVtOiAke19maWxlU3lzdGVtLnJ1bnRpbWVUeXBlfSAnCiAgICAgICAgJyhwcm92aWRlZDogJHtfcmF3LmZpbGVTeXN0ZW0ucnVudGltZVR5cGV9KScpOwoKICAgIHdyaXRlTGlzdCgnSW5wdXQgU3VtbWFyaWVzJywgX3Jhdy5pbnB1dFN1bW1hcmllcyk7CiAgICB3cml0ZUxpc3QoJ0xpbmtlZCBEZXBlbmRlbmNpZXMnLCBfcmF3LmxpbmtlZERlcGVuZGVuY2llcyk7CgogICAgc2Iud3JpdGVsbignUGFja2FnZXMgdXJpOiAke19yYXcucGFja2FnZXNGaWxlVXJpfScpOwogICAgc2Iud3JpdGVsbignUGFja2FnZXM6ICR7X3BhY2thZ2VzfScpOwoKICAgIHNiLndyaXRlbG4oJ0NvbXBpbGUgU0RLOiAke2NvbXBpbGVTZGt9Jyk7CiAgICBzYi53cml0ZWxuKCdTREsgcm9vdDogJHtfc2RrUm9vdH0gKHByb3ZpZGVkOiAke19yYXcuc2RrUm9vdH0pJyk7CiAgICBzYi53cml0ZWxuKCdTREsgc3BlY2lmaWNhdGlvbjogJHtfbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaX0gJwogICAgICAgICcocHJvdmlkZWQ6ICR7X3Jhdy5saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpfSknKTsKICAgIHNiLndyaXRlbG4oJ1NESyBzdW1tYXJ5OiAke19zZGtTdW1tYXJ5fSAocHJvdmlkZWQ6ICR7X3Jhdy5zZGtTdW1tYXJ5fSknKTsKCiAgICBzYi53cml0ZWxuKCdMZWdhY3kgbW9kZTogJHtsZWdhY3lNb2RlfScpOwogICAgc2Iud3JpdGVsbignVGFyZ2V0OiAke190YXJnZXQ/Lm5hbWV9IChwcm92aWRlZDogJHtfcmF3LnRhcmdldD8ubmFtZX0pJyk7CgogICAgc2Iud3JpdGVsbigndGhyb3dPbkVycm9yc0ZvckRlYnVnZ2luZzogJHt0aHJvd09uRXJyb3JzRm9yRGVidWdnaW5nfScpOwogICAgc2Iud3JpdGVsbigndGhyb3dPbldhcm5pbmdzRm9yRGVidWdnaW5nOiAke3Rocm93T25XYXJuaW5nc0ZvckRlYnVnZ2luZ30nKTsKICAgIHNiLndyaXRlbG4oJ2V4aXQgb24gcHJvYmxlbTogJHtzZXRFeGl0Q29kZU9uUHJvYmxlbX0nKTsKICAgIHNiLndyaXRlbG4oJ0VtYmVkIHNvdXJjZXM6ICR7ZW1iZWRTb3VyY2VUZXh0fScpOwogICAgc2Iud3JpdGVsbignZGVidWdEdW1wOiAke2RlYnVnRHVtcH0nKTsKICAgIHNiLndyaXRlbG4oJ3ZlcmJvc2U6ICR7dmVyYm9zZX0nKTsKICAgIHNiLndyaXRlbG4oJ3ZlcmlmeTogJHt2ZXJpZnl9Jyk7CiAgICByZXR1cm4gJyRzYic7CiAgfQoKICBGdXR1cmU8TGlzdDxpbnQ+PiBfcmVhZEFzQnl0ZXMoRmlsZVN5c3RlbUVudGl0eSBmaWxlKSBhc3luYyB7CiAgICB0cnkgewogICAgICByZXR1cm4gYXdhaXQgZmlsZS5yZWFkQXNCeXRlcygpOwogICAgfSBvbiBGaWxlU3lzdGVtRXhjZXB0aW9uIGNhdGNoIChlcnJvcikgewogICAgICByZXBvcnQoCiAgICAgICAgICB0ZW1wbGF0ZUNhbnRSZWFkRmlsZQogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGVycm9yLnVyaSwgZXJyb3IubWVzc2FnZSkKICAgICAgICAgICAgICAud2l0aG91dExvY2F0aW9uKCksCiAgICAgICAgICBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBuZXcgVWludDhMaXN0KDApOwogICAgfQogIH0KfQoKLy8vIEEgW0ZpbGVTeXN0ZW1dIHRoYXQgb25seSBhbGxvd3MgYWNjZXNzIHRvIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGV4cGxpY2l0bHkKLy8vIHdoaXRlbGlzdGVkLgpjbGFzcyBIZXJtZXRpY0ZpbGVTeXN0ZW0gaW1wbGVtZW50cyBGaWxlU3lzdGVtIHsKICBmaW5hbCBTZXQ8VXJpPiBpbmNsdWRlZEZpbGVzOwogIGZpbmFsIEZpbGVTeXN0ZW0gX3JlYWxGaWxlU3lzdGVtOwoKICBIZXJtZXRpY0ZpbGVTeXN0ZW0odGhpcy5pbmNsdWRlZEZpbGVzLCB0aGlzLl9yZWFsRmlsZVN5c3RlbSk7CgogIEZpbGVTeXN0ZW1FbnRpdHkgZW50aXR5Rm9yVXJpKFVyaSB1cmkpIHsKICAgIGlmIChpbmNsdWRlZEZpbGVzLmNvbnRhaW5zKHVyaSkpIHJldHVybiBfcmVhbEZpbGVTeXN0ZW0uZW50aXR5Rm9yVXJpKHVyaSk7CiAgICB0aHJvdyBuZXcgSGVybWV0aWNBY2Nlc3NFeGNlcHRpb24odXJpKTsKICB9Cn0KCmNsYXNzIEhlcm1ldGljQWNjZXNzRXhjZXB0aW9uIGV4dGVuZHMgRmlsZVN5c3RlbUV4Y2VwdGlvbiB7CiAgSGVybWV0aWNBY2Nlc3NFeGNlcHRpb24oVXJpIHVyaSkKICAgICAgOiBzdXBlcigKICAgICAgICAgICAgdXJpLAogICAgICAgICAgICAnSW52YWxpZCBhY2Nlc3MgdG8gJHVyaTogJwogICAgICAgICAgICAndGhlIGZpbGUgaXMgYWNjZXNzZWQgaW4gYSBtb2R1bGFyIGhlcm1ldGljIGJ1aWxkLCAnCiAgICAgICAgICAgICdidXQgaXQgd2FzIG5vdCBleHBsaWNpdGx5IGxpc3RlZCBhcyBhbiBpbnB1dC4nKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gbWVzc2FnZTsKfQqCswBOTjwBIAEhASkBSAFNASwqAT0BRgFJATAtATI1ASs8ATYhAUkBPgEjCRoYETAwQx0SLB4jLCQhKiQBMgFAAS8BKwE6ASYJICkmATkEREdIThMESlBNSy0ZOB4BUR0WAU9IFCcBSDEgAT4GTE1OKyIBPAZMTVArLQFPDycBUAsQFBoVBAETFxoYBAEeATAyJCs3NAYdBAEiJhonBAERATIBJAEiASgBLgE+ATQBSAFMATEaATYUATABSgFPTTYpST9RNkgBG1ElG0gXTi0xRTFKCAZDPQQBOSg7PzsGQBQGQTocSgYEATxGBAFFLAQBRkMxBAFKSEknATFCFAYBIDwdSxQGAR5PHU4UBgEpHUUlFAYBMk0cPR9OFggGEQQBRhUqARoBSw1EAU8ONQEqASQmAUlCARIjTgE0NyhLSwQBQD5DKCsvLz8IBiEEATUoOgYlBAFLJj5NLSZEPShKIkwGJgQBQi1IBiwEAUg+TycqRD0oShxMBiAEAUxDKhpGMzYdHCdCIxYEAUoGSUlMFx0YBiI2PCsrKj8GGwQBThxIQ0wBLU4YHy07HQg1BgEPUQoRTyo1HUobNQYEATwGSTEqLRkoTQYBHUo5HUMuBgEeAUhIASYOPyQbLgYBOgQBPzwYCkNEKR1QBhwbDEUlJxAnKjkdFB9NCAYZIAQBQAZOGAZQUU4lBlFKPAZGFQZNOjgmGx0tUCUiBgEsME8TBgEgK0UBJScpLyQXJQYBRSAEASUBTgZMLx4mIR0YKCY0CBcdRhhBBgEjJR5KTio+BgEyQx1KBgQBPSMcBAEZISweJhAIHB0eCgYBJSUBOzgBOTcBNz8BOSoBLkVDOk4BLk0BS088NSsnJRIEAUAKJy0OHzciGx8GBAIBThExICQBQAErTywEAgE8Iw8RJ0E+AQwgAgExcGFja2FnZTpmcm9udF9lbmQvc3JjL2Jhc2UvcHJvY2Vzc2VkX29wdGlvbnMuZGFydEBzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYmFzZS9saWJyYXJpZXNfc3BlY2lmaWNhdGlvbi5kYXJ0p58vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIExpYnJhcnkgc3BlY2lmaWNhdGlvbiBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24uCi8vLwovLy8gTWFueSBkYXJ0IHRvb2xzIGFyZSBjb25maWd1cmFibGUgdG8gc3VwcG9ydCBkaWZmZXJlbnQgdGFyZ2V0IHBsYXRmb3Jtcy4gIEZvcgovLy8gYSBnaXZlbiB0YXJnZXQsIHRoZXkgbmVlZCB0byBrbm93IHdoYXQgbGlicmFyaWVzIGFyZSBhdmFpbGFibGUgYW5kIHdoZXJlIGFyZQovLy8gdGhlIHNvdXJjZXMgYW5kIHRhcmdldC1zcGVjaWZpYyBwYXRjaGVzLgovLy8KLy8vIEhlcmUgd2UgZGVmaW5lIEFQSXMgdG8gcmVwcmVzZW50IHRoaXMgc3BlY2lmaWNhdGlvbiBhbmQgaW1wbGVtZW50Ci8vLyBzZXJpYWxpemF0aW9uIHRvIChhbmQgZGVzZXJpYWxpemF0aW9uIGZyb20pIGEgSlNPTiBmaWxlLgovLy8KLy8vIEhlcmUgaXMgYW4gZXhhbXBsZSBzcGVjaWZpY2F0aW9uIEpTT04gZmlsZToKLy8vCi8vLyAgICAgewovLy8gICAgICAgInZtIjogewovLy8gICAgICAgICAibGlicmFyaWVzIjogewovLy8gICAgICAgICAgICAgImNvcmUiOiB7Ci8vLyAgICAgICAgICAgICAgICAidXJpIjogImFzeW5jL2NvcmUuZGFydCIsCi8vLyAgICAgICAgICAgICAgICAicGF0Y2hlcyI6IFsKLy8vICAgICAgICAgICAgICAgICAgICAicGF0aC90by9jb3JlX3BhdGNoLmRhcnQiLAovLy8gICAgICAgICAgICAgICAgICAgICJwYXRoL3RvL2xpc3RfcGF0Y2guZGFydCIKLy8vICAgICAgICAgICAgICAgIF0KLy8vICAgICAgICAgICAgIH0KLy8vICAgICAgICAgICAgICJhc3luYyI6IHsKLy8vICAgICAgICAgICAgICAgICJ1cmkiOiAiYXN5bmMvYXN5bmMuZGFydCIsCi8vLyAgICAgICAgICAgICAgICAicGF0Y2hlcyI6ICJwYXRoL3RvL2FzeW5jX3BhdGNoLmRhcnQiCi8vLyAgICAgICAgICAgICB9Ci8vLyAgICAgICAgICAgICAiY29udmVydCI6IHsKLy8vICAgICAgICAgICAgICAgICJ1cmkiOiAiY29udmVydC9jb252ZXJ0LmRhcnQiLAovLy8gICAgICAgICAgICAgfQovLy8gICAgICAgICAgICAgIm1pcnJvcnMiOiB7Ci8vLyAgICAgICAgICAgICAgICAidXJpIjogIm1pcnJvcnMvbWlycm9ycy5kYXJ0IiwKLy8vICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQiOiBmYWxzZQovLy8gICAgICAgICAgICAgfQovLy8gICAgICAgICB9Ci8vLyAgICAgICB9Ci8vLyAgICAgfQovLy8KLy8vIFRoZSBmb3JtYXQgY29udGFpbnM6Ci8vLyAgIC0gYSB0b3AgbGV2ZWwgZW50cnkgZm9yIGVhY2ggdGFyZ2V0LiBLZXlzIGFyZSB0YXJnZXQgbmFtZXMgKGUuZy4gInZtIgovLy8gICAgIGFib3ZlKSwgYW5kIHZhbHVlcyBjb250YWluIHRoZSBlbnRpcmUgc3BlY2lmaWNhdGlvbiBvZiBhIHRhcmdldC4KLy8vCi8vLyAgIC0gZWFjaCB0YXJnZXQgc3BlY2lmaWNhdGlvbiBpcyBhIG1hcC4gVG9kYXksIG9ubHkgb25lIGtleSBpcyBzdXBwb3J0ZWQgb24KLy8vICAgICB0aGlzIG1hcDogImxpYnJhcmllcyIuCi8vLwovLy8gICAtIFRoZSAibGlicmFyaWVzIiBlbnRyeSBjb250YWlucyBkZXRhaWxzIGZvciBob3cgZWFjaCBwbGF0Zm9ybSBsaWJyYXJ5IGlzCi8vLyAgICAgaW1wbGVtZW50ZWQuIFRoZSBlbnRyeSBpcyBhIG1hcCwgd2hlcmUga2V5cyBhcmUgdGhlIG5hbWUgb2YgdGhlIHBsYXRmb3JtCi8vLyAgICAgbGlicmFyeSBhbmQgdmFsdWVzIGNvbnRhaW4gZGV0YWlscyBmb3Igd2hlcmUgdG8gZmluZCB0aGUgaW1wbGVtZW50YXRpb24KLy8vICAgICBmbyB0aGF0IGxpYnJhcnkuCi8vLwovLy8gICAtIFRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IGlzIGEgc2luZ2xlIHRva2VuIChlLmcuICJjb3JlIikgdGhhdCBtYXRjaGVzIHRoZQovLy8gICAgIFVyaSBwYXRoIHVzZWQgYWZ0ZXIgYGRhcnQ6YCAoZS5nLiAiZGFydDpjb3JlIikuCi8vLwovLy8gICAtIFRoZSAidXJpIiBlbnRyeSBvbiB0aGUgbGlicmFyeSBpbmZvcm1hdGlvbiBpcyBtYW5kYXRvcnkuIFRoZSB2YWx1ZSBpcyBhCi8vLyAgICAgc3RyaW5nIFVSSSByZWZlcmVuY2UuIFRoZSAicGF0Y2hlcyIgZW50cnkgaXMgb3B0aW9uYWwgYW5kIG1heSBoYXZlIGFzIGEKLy8vICAgICB2YWx1ZSBhIHN0cmluZyBVUkkgcmVmZXJlbmNlIG9yIGEgbGlzdCBvZiBVUkkgcmVmZXJlbmNlcy4KLy8vCi8vLyAgICAgQWxsIFVSSSByZWZlcmVuY2VzIGNhbiBlaXRoZXIgYmUgYSBmaWxlIFVSSSBvciBhIHJlbGF0aXZlIFVSSSBwYXRoLAovLy8gICAgIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5Ci8vLyAgICAgc3BlY2lmaWNhdGlvbiBmaWxlLgovLy8KLy8vICAgLSBUaGUgInN1cHBvcnRlZCIgZW50cnkgb24gdGhlIGxpYnJhcnkgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwuIFRoZSB2YWx1ZQovLy8gICAgIGlzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGxpYnJhcnkgaXMgc3VwcG9ydGVkIGluIHRoZQovLy8gICAgIHVuZGVybHlpbmcgdGFyZ2V0LiAgSG93ZXZlciwgc2luY2UgdGhlIGxpYnJhcmllcyBhcmUgYXNzdW1lZCB0byBiZQovLy8gICAgIHN1cHBvcnRlZCBieSBkZWZhdWx0LCB3ZSBvbmx5IGV4cGVjdCB1c2VycyB0byB1c2UgYGZhbHNlYC4KLy8vCi8vLyAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyB2YWx1ZSBpcyB0byBjb25maWd1cmUgY29uZGl0aW9uYWwgaW1wb3J0cyBhbmQKLy8vICAgICBlbnZpcm9ubWVudCBjb25zdGFudHMuIEJ5IGRlZmF1bHQgZXZlcnkgcGxhdGZvcm0gbGlicmFyeSB0aGF0IGlzCi8vLyAgICAgYXZhaWxhYmxlIGluIHRoZSAibGlicmFyaWVzIiBzZWN0aW9uIGltcGxpY2l0bHkgZGVmaW5lcyBhbiBlbnZpcm9ubWVudAovLy8gICAgIHZhcmlhYmxlIGBkYXJ0LmxpYnJhcnkubmFtZWAgYXMgYCJ0cnVlImAsIHRvIGluZGljYXRlIHRoYXQgdGhlIGxpYnJhcnkKLy8vICAgICBpcyBzdXBwb3J0ZWQuICBTb21lIGJhY2tlbmRzIGFsbG93IGltcG9ydHMgdG8gYW4gdW5zdXBwb3J0ZWQgcGxhdGZvcm0KLy8vICAgICBsaWJyYXJ5ICh0dXJuaW5nIGEgc3RhdGljIGVycm9yIGludG8gYSBydW50aW1lIGVycm9yIHdoZW4gdGhlIGxpYnJhcnkgaXMKLy8vICAgICBldmVudHVhbGx5IGFjY2Vzc2VkKS4gVGhlc2UgYmFja2VuZHMgY2FuIHVzZSBgc3VwcG9ydGVkOiBmYWxzZWAgdG8KLy8vICAgICByZXBvcnQgdGhhdCBzdWNoIGxpYnJhcnkgaXMgc3RpbGwgbm90IHN1cHBvcnRlZCBpbiBjb25kaXRpb25hbCBpbXBvcnRzCi8vLyAgICAgYW5kIGNvbnN0IGBmcm9tRW52aXJvbm1lbnRgIGV4cHJlc3Npb25zLgovLy8KLy8vCi8vLyBOb3RlOiB3ZSBjdXJyZW50bHkgaGF2ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlcyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZAovLy8gd2hlbiBjaGFuZ2luZyBsaWJyYXJpZXMsIHNvdXJjZXMsIGFuZCBwYXRjaCBmaWxlczoKLy8vICAgICogLnBsYXRmb3JtIGZpbGVzIChmb3IgZGFydDJqcykKLy8vICAgICogLmd5cGkgZmlsZXMgKGZvciB2bSkKLy8vICAgICogc2RrX2xpYnJhcnlfbWV0YWRhdGEvbGliL2xpYnJhcmllcy5kYXJ0IChmb3IgYW5hbHl6ZXIsIGRkYykKLy8vCi8vLyB3ZSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgdW5pZnlpbmcgdGhlbSBhbGwgdW5kZXIgdGhpcyBmb3JtYXQgKHNlZQovLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzI4ODM2KSwgYnV0IGZvciBub3cgd2UgbmVlZCB0byBwYXkKLy8vIGNsb3NlIGF0dGVudGlvbiB0byBjaGFuZ2UgdGhlbSBjb25zaXN0ZW50bHkuCgovLyBUT0RPKHNpZ211bmQpOiBtb3ZlIHRoaXMgZmlsZSB0byBhIHNoYXJlZCBwYWNrYWdlLgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBqc29uRGVjb2RlLCBqc29uRW5jb2RlOwoKaW1wb3J0ICcuLi9mYXN0YS91dGlsL3JlbGF0aXZpemUuZGFydCcgc2hvdyByZWxhdGl2aXplVXJpOwppbXBvcnQgJy4uL2Zhc3RhL3Jlc29sdmVfaW5wdXRfdXJpLmRhcnQnIHNob3cgaXNXaW5kb3dzOwoKLy8vIENvbnRlbnRzIGZyb20gYSBzaW5nbGUgbGlicmFyeSBzcGVjaWZpY2F0aW9uIGZpbGUuCi8vLwovLy8gQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGxpYnJhcmllcyBvbiBhbGwgdGFyZ2V0IHBsYXRmb3JtcyBkZWZpbmVkIGluCi8vLyB0aGF0IGZpbGUuCmNsYXNzIExpYnJhcmllc1NwZWNpZmljYXRpb24gewogIGZpbmFsIE1hcDxTdHJpbmcsIFRhcmdldExpYnJhcmllc1NwZWNpZmljYXRpb24+IF90YXJnZXRzOwoKICBjb25zdCBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uKAogICAgICBbdGhpcy5fdGFyZ2V0cyA9IGNvbnN0IDxTdHJpbmcsIFRhcmdldExpYnJhcmllc1NwZWNpZmljYXRpb24+e31dKTsKCiAgLy8vIFRoZSBsaWJyYXJ5IHNwZWNpZmljYXRpb24gZm9yIGEgZ2l2ZW4gW3RhcmdldF0sIG9yIHRocm93cyBpZiBub25lIGlzCiAgLy8vIGF2YWlsYWJsZS4KICBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb25Gb3IoU3RyaW5nIHRhcmdldCkgewogICAgdmFyIHRhcmdldFNwZWMgPSBfdGFyZ2V0c1t0YXJnZXRdOwogICAgaWYgKHRhcmdldFNwZWMgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgTGlicmFyaWVzU3BlY2lmaWNhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICdObyBsaWJyYXJ5IHNwZWNpZmljYXRpb24gZm9yIHRhcmdldCAiJHRhcmdldCInKTsKICAgIH0KICAgIHJldHVybiB0YXJnZXRTcGVjOwogIH0KCiAgLy8vIFBhcnNlIHRoZSBnaXZlbiBbanNvbl0gYXMgYSBsaWJyYXJ5IHNwZWNpZmljYXRpb24sIHJlc29sdmluZyBhbnkgcmVsYXRpdmUKICAvLy8gcGF0aHMgZnJvbSBbYmFzZVVyaV0uCiAgLy8vCiAgLy8vIE1heSB0aHJvdyBhbiBleGNlcHRpb24gaWYgW2pzb25dIGlzIG5vdCBwcm9wZXJseSBmb3JtYXR0ZWQgb3IgY29udGFpbnMKICAvLy8gaW52YWxpZCB2YWx1ZXMuCiAgc3RhdGljIExpYnJhcmllc1NwZWNpZmljYXRpb24gcGFyc2UoVXJpIGJhc2VVcmksIFN0cmluZyBqc29uKSB7CiAgICBpZiAoanNvbiA9PSBudWxsKSByZXR1cm4gY29uc3QgTGlicmFyaWVzU3BlY2lmaWNhdGlvbigpOwogICAgdmFyIGpzb25EYXRhOwogICAgdHJ5IHsKICAgICAgdmFyIGRhdGEgPSBqc29uRGVjb2RlKGpzb24pOwogICAgICBpZiAoZGF0YSBpcyEgTWFwKSB7CiAgICAgICAgcmV0dXJuIF9yZXBvcnRFcnJvcigndG9wLWxldmVsIHNwZWNpZmljYXRpb24gaXMgbm90IGEgbWFwJyk7CiAgICAgIH0KICAgICAganNvbkRhdGEgPSBkYXRhIGFzIE1hcDsKICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIGNhdGNoIChlKSB7CiAgICAgIHRocm93IG5ldyBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uRXhjZXB0aW9uKGUpOwogICAgfQogICAgdmFyIHRhcmdldHMgPSA8U3RyaW5nLCBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uPnt9OwogICAganNvbkRhdGEuZm9yRWFjaCgoU3RyaW5nIHRhcmdldE5hbWUsIHRhcmdldERhdGEpIHsKICAgICAgaWYgKHRhcmdldE5hbWUuc3RhcnRzV2l0aCgiY29tbWVudDoiKSkgcmV0dXJuIG51bGw7CiAgICAgIE1hcDxTdHJpbmcsIExpYnJhcnlJbmZvPiBsaWJyYXJpZXMgPSA8U3RyaW5nLCBMaWJyYXJ5SW5mbz57fTsKICAgICAgaWYgKHRhcmdldERhdGEgaXMhIE1hcCkgewogICAgICAgIHJldHVybiBfcmVwb3J0RXJyb3IoCiAgICAgICAgICAgICJ0YXJnZXQgc3BlY2lmaWNhdGlvbiBmb3IgJyR0YXJnZXROYW1lJyBpcyBub3QgYSBtYXAiKTsKICAgICAgfQogICAgICBpZiAoIXRhcmdldERhdGEuY29udGFpbnNLZXkoImxpYnJhcmllcyIpKSB7CiAgICAgICAgcmV0dXJuIF9yZXBvcnRFcnJvcigidGFyZ2V0IHNwZWNpZmljYXRpb24gIgogICAgICAgICAgICAiZm9yICckdGFyZ2V0TmFtZScgZG9lc24ndCBoYXZlIGEgbGlicmFyaWVzIGVudHJ5Iik7CiAgICAgIH0KICAgICAgdmFyIGxpYnJhcmllc0RhdGEgPSB0YXJnZXREYXRhWyJsaWJyYXJpZXMiXTsKICAgICAgaWYgKGxpYnJhcmllc0RhdGEgaXMhIE1hcCkgewogICAgICAgIHJldHVybiBfcmVwb3J0RXJyb3IoImxpYnJhcmllcyBlbnRyeSBmb3IgJyR0YXJnZXROYW1lJyBpcyBub3QgYSBtYXAiKTsKICAgICAgfQogICAgICBsaWJyYXJpZXNEYXRhLmZvckVhY2goKFN0cmluZyBuYW1lLCBkYXRhKSB7CiAgICAgICAgaWYgKGRhdGEgaXMhIE1hcCkgewogICAgICAgICAgcmV0dXJuIF9yZXBvcnRFcnJvcigKICAgICAgICAgICAgICAibGlicmFyeSBkYXRhIGZvciAnJG5hbWUnIGluIHRhcmdldCAnJHRhcmdldE5hbWUnIGlzIG5vdCBhIG1hcCIpOwogICAgICAgIH0KICAgICAgICBVcmkgY2hlY2tBbmRSZXNvbHZlKHVyaVN0cmluZykgewogICAgICAgICAgaWYgKHVyaVN0cmluZyBpcyEgU3RyaW5nKSB7CiAgICAgICAgICAgIHJldHVybiBfcmVwb3J0RXJyb3IoInVyaSB2YWx1ZSAnJHVyaVN0cmluZycgaXMgbm90IGEgc3RyaW5nIgogICAgICAgICAgICAgICAgIihmcm9tIGxpYnJhcnkgJyRuYW1lJyBpbiB0YXJnZXQgJyR0YXJnZXROYW1lJykiKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciB1cmkgPSBVcmkucGFyc2UodXJpU3RyaW5nKTsKICAgICAgICAgIGlmICh1cmkuc2NoZW1lICE9ICcnICYmIHVyaS5zY2hlbWUgIT0gJ2ZpbGUnKSB7CiAgICAgICAgICAgIHJldHVybiBfcmVwb3J0RXJyb3IoInVyaSBzY2hlbWUgaW4gJyR1cmlTdHJpbmcnIGlzIG5vdCBzdXBwb3J0ZWQuIik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYmFzZVVyaS5yZXNvbHZlVXJpKHVyaSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgdXJpID0gY2hlY2tBbmRSZXNvbHZlKGRhdGFbJ3VyaSddKTsKICAgICAgICBMaXN0PFVyaT4gcGF0Y2hlczsKICAgICAgICBpZiAoZGF0YVsncGF0Y2hlcyddIGlzIExpc3QpIHsKICAgICAgICAgIHBhdGNoZXMgPQogICAgICAgICAgICAgIGRhdGFbJ3BhdGNoZXMnXS5tYXA8VXJpPigocykgPT4gYmFzZVVyaS5yZXNvbHZlKHMpKS50b0xpc3QoKTsKICAgICAgICB9IGVsc2UgaWYgKGRhdGFbJ3BhdGNoZXMnXSBpcyBTdHJpbmcpIHsKICAgICAgICAgIHBhdGNoZXMgPSBbY2hlY2tBbmRSZXNvbHZlKGRhdGFbJ3BhdGNoZXMnXSldOwogICAgICAgIH0gZWxzZSBpZiAoZGF0YVsncGF0Y2hlcyddID09IG51bGwpIHsKICAgICAgICAgIHBhdGNoZXMgPSBjb25zdCBbXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIF9yZXBvcnRFcnJvcigKICAgICAgICAgICAgICAicGF0Y2hlcyBlbnRyeSBmb3IgJyRuYW1lJyBpcyBub3QgYSBsaXN0IG9yIGEgc3RyaW5nIik7CiAgICAgICAgfQoKICAgICAgICB2YXIgc3VwcG9ydGVkID0gZGF0YVsnc3VwcG9ydGVkJ10gPz8gdHJ1ZTsKICAgICAgICBpZiAoc3VwcG9ydGVkIGlzISBib29sKSB7CiAgICAgICAgICByZXR1cm4gX3JlcG9ydEVycm9yKCJcInN1cHBvcnRlZFwiIGVudHJ5OiBleHBlY3RlZCBhICdib29sJyBidXQgIgogICAgICAgICAgICAgICJnb3QgYSAnJHtzdXBwb3J0ZWQucnVudGltZVR5cGV9JyAoJyRzdXBwb3J0ZWQnKSIpOwogICAgICAgIH0KICAgICAgICBsaWJyYXJpZXNbbmFtZV0gPQogICAgICAgICAgICBuZXcgTGlicmFyeUluZm8obmFtZSwgdXJpLCBwYXRjaGVzLCBpc1N1cHBvcnRlZDogc3VwcG9ydGVkKTsKICAgICAgfSk7CiAgICAgIHRhcmdldHNbdGFyZ2V0TmFtZV0gPQogICAgICAgICAgbmV3IFRhcmdldExpYnJhcmllc1NwZWNpZmljYXRpb24odGFyZ2V0TmFtZSwgbGlicmFyaWVzKTsKICAgIH0pOwogICAgcmV0dXJuIG5ldyBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uKHRhcmdldHMpOwogIH0KCiAgc3RhdGljIF9yZXBvcnRFcnJvcihTdHJpbmcgZXJyb3IpID0+CiAgICAgIHRocm93IG5ldyBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uRXhjZXB0aW9uKGVycm9yKTsKCiAgLy8vIFNlcmlhbGl6ZSB0aGlzIHNwZWNpZmljYXRpb24gdG8ganNvbi4KICAvLy8KICAvLy8gSWYgcG9zc2libGUgc2VyaWFsaXplcyBwYXRocyByZWxhdGl2ZSB0byBbb3V0cHV0VXJpXS4KICBTdHJpbmcgdG9Kc29uU3RyaW5nKFVyaSBvdXRwdXRVcmkpID0+IGpzb25FbmNvZGUodG9Kc29uTWFwKG91dHB1dFVyaSkpOwoKICBNYXAgdG9Kc29uTWFwKFVyaSBvdXRwdXRVcmkpIHsKICAgIHZhciByZXN1bHQgPSB7fTsKICAgIHZhciBkaXIgPSBvdXRwdXRVcmkucmVzb2x2ZSgnLicpOwogICAgU3RyaW5nIHBhdGhGb3IoVXJpIHVyaSkgPT4gcmVsYXRpdml6ZVVyaShkaXIsIHVyaSwgaXNXaW5kb3dzKTsKICAgIF90YXJnZXRzLmZvckVhY2goKHRhcmdldE5hbWUsIHRhcmdldCkgewogICAgICB2YXIgbGlicmFyaWVzID0ge307CiAgICAgIHRhcmdldC5fbGlicmFyaWVzLmZvckVhY2goKG5hbWUsIGxpYikgewogICAgICAgIGxpYnJhcmllc1tuYW1lXSA9IHsKICAgICAgICAgICd1cmknOiBwYXRoRm9yKGxpYi51cmkpLAogICAgICAgICAgJ3BhdGNoZXMnOiBsaWIucGF0Y2hlcy5tYXAocGF0aEZvcikudG9MaXN0KCksCiAgICAgICAgfTsKICAgICAgICBpZiAoIWxpYi5pc1N1cHBvcnRlZCkgewogICAgICAgICAgbGlicmFyaWVzW25hbWVdWydzdXBwb3J0ZWQnXSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJlc3VsdFt0YXJnZXROYW1lXSA9IHsnbGlicmFyaWVzJzogbGlicmFyaWVzfTsKICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCi8vLyBTcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGxpYnJhcmllcyBzdXBwb3J0ZWQgYnkgYSBnaXZlbiB0YXJnZXQuCmNsYXNzIFRhcmdldExpYnJhcmllc1NwZWNpZmljYXRpb24gewogIC8vLyBOYW1lIG9mIHRoZSB0YXJnZXQgcGxhdGZvcm0uCiAgZmluYWwgU3RyaW5nIHRhcmdldE5hbWU7CgogIGZpbmFsIE1hcDxTdHJpbmcsIExpYnJhcnlJbmZvPiBfbGlicmFyaWVzOwoKICBjb25zdCBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uKHRoaXMudGFyZ2V0TmFtZSwKICAgICAgW3RoaXMuX2xpYnJhcmllcyA9IGNvbnN0IDxTdHJpbmcsIExpYnJhcnlJbmZvPnt9XSk7CgogIC8vLyBEZXRhaWxzIGFib3V0IGEgbGlicmFyeSB3aG9zZSBpbXBvcnQgaXMgYGRhcnQ6JG5hbWVgLgogIExpYnJhcnlJbmZvIGxpYnJhcnlJbmZvRm9yKFN0cmluZyBuYW1lKSA9PiBfbGlicmFyaWVzW25hbWVdOwoKICBJdGVyYWJsZTxMaWJyYXJ5SW5mbz4gZ2V0IGFsbExpYnJhcmllcyA9PiBfbGlicmFyaWVzLnZhbHVlczsKfQoKLy8vIEluZm9ybWF0aW9uIGFib3V0IGEgYGRhcnQ6YCBsaWJyYXJ5IGluIGEgc3BlY2lmaWMgdGFyZ2V0IHBsYXRmb3JtLgpjbGFzcyBMaWJyYXJ5SW5mbyB7CiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBpcyB0aGUgcGF0aCBkZXZlbG9wZXJzIHVzZSB0byBpbXBvcnQgdGhpcwogIC8vLyBsaWJyYXJ5IChhcyBgZGFydDokbmFtZWApLgogIGZpbmFsIFN0cmluZyBuYW1lOwoKICAvLy8gVGhlIGZpbGUgZGVmaW5pbmcgdGhlIG1haW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGxpYnJhcnkuCiAgZmluYWwgVXJpIHVyaTsKCiAgLy8vIFBhdGNoIGZpbGVzIHVzZWQgZm9yIHRoaXMgbGlicmFyeSBpbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCBpZiBhbnkuCiAgZmluYWwgTGlzdDxVcmk+IHBhdGNoZXM7CgogIC8vLyBXaGV0aGVyIHRoZSBsaWJyYXJ5IGlzIHN1cHBvcnRlZCBhbmQgdGh1cyBgZGFydC5saWJyYXJ5Lm5hbWVgIGlzICJ0cnVlIgogIC8vLyBmb3IgY29uZGl0aW9uYWwgaW1wb3J0cyBhbmQgZnJvbUVudmlyb25tZW50IGNvbnN0YW50cy4KICBmaW5hbCBib29sIGlzU3VwcG9ydGVkOwoKICBjb25zdCBMaWJyYXJ5SW5mbyh0aGlzLm5hbWUsIHRoaXMudXJpLCB0aGlzLnBhdGNoZXMsCiAgICAgIHt0aGlzLmlzU3VwcG9ydGVkOiB0cnVlfSk7Cn0KCmNsYXNzIExpYnJhcmllc1NwZWNpZmljYXRpb25FeGNlcHRpb24gewogIE9iamVjdCBlcnJvcjsKICBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uRXhjZXB0aW9uKHRoaXMuZXJyb3IpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJGVycm9yJzsKfQqBCwBOTjwBNARRUS0ERj0EMAQKEhsaLSAyMRUSGy45Eh0yEh0yJhIODAoEGUxJBFAfBFBRUBkEUTgEUFBCBExHHARQSEtDBEpJT09OUUtPMQQETDcnHkUERk8xATYzATs5ATcEUA8fPAEgSQFLEUEnHjE8BhcEAVAcBk0WQj0SCiMaRQgeJTQGPDc6RCAdRAgyNEEIMyNPCDIcH1AKKSZJQwwqOlEMKgoBMBsnFEwwOC4eER9GCgEzIkxCChpJChxDCDAEASc4ASwGPEoBIRUmQywaLhwjOAsgMAoKNQgTBAIBSyUjGwEtATY6ATw/AT8CAUcUTyEVAUARAUgbAU49GgE3IQIBKBAvASECATdwYWNrYWdlOmZyb250X2VuZC9zcmMvYmFzZS9saWJyYXJpZXNfc3BlY2lmaWNhdGlvbi5kYXJ0OnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9jb21waWxlcl9jb250ZXh0LmRhcnSUJy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmNvbXBpbGVyX2NvbnRleHQ7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlLCBab25lLCBydW5ab25lZDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgU291cmNlOwoKaW1wb3J0ICcuLi9hcGlfcHJvdG90eXBlL2ZpbGVfc3lzdGVtLmRhcnQnIHNob3cgRmlsZVN5c3RlbTsKCmltcG9ydCAnLi4vYmFzZS9wcm9jZXNzZWRfb3B0aW9ucy5kYXJ0JyBzaG93IFByb2Nlc3NlZE9wdGlvbnM7CgppbXBvcnQgJ3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBTdHJpbmdUb2tlbjsKCmltcG9ydCAnY29tbWFuZF9saW5lX3JlcG9ydGluZy5kYXJ0JyBhcyBjb21tYW5kX2xpbmVfcmVwb3J0aW5nOwoKaW1wb3J0ICdjb2xvcnMuZGFydCcgc2hvdyBjb21wdXRlRW5hYmxlQ29sb3JzOwoKaW1wb3J0ICdmYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdyBMb2NhdGVkTWVzc2FnZSwgTWVzc2FnZSwgbWVzc2FnZUludGVybmFsUHJvYmxlbU1pc3NpbmdDb250ZXh0OwoKaW1wb3J0ICdzZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKZmluYWwgT2JqZWN0IGNvbXBpbGVyQ29udGV4dEtleSA9IG5ldyBPYmplY3QoKTsKCi8vLyBTaGFyZWQgY29udGV4dCB1c2VkIHRocm91Z2hvdXQgdGhlIGNvbXBpbGVyLgovLy8KLy8vIFRoZSBjb21waWxlciB3b3JrcyB3aXRoIGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuIFRvIGF2b2lkCi8vLyBwYXNzaW5nIGl0IGFyb3VuZCBhcyBhbiBhcmd1bWVudCBldmVyeXdoZXJlLCBpdCBpcyBzdG9yZWQgYXMgYSB6b25lLXZhbHVlLgovLy8KLy8vIEZvciBjb252ZW5pZW5jZSB0aGUgc3RhdGljIGdldHRlciBbQ29tcGlsZXJDb250ZXh0LmN1cnJlbnRdIHJldHJpZXZlcyB0aGUKLy8vIGNvbnRleHQgc3RvcmVkIGluIHRoZSBjdXJyZW50IHpvbmUuCmNsYXNzIENvbXBpbGVyQ29udGV4dCB7CiAgLy8gVE9ETyhzaWdtdW5kKTogTW92ZSBoZXJlIGFueSBtZXRob2QgaW4gUHJvY2Vzc2VkT3B0aW9ucyB0aGF0IGRvZXNuJ3Qgc2VlbQogIC8vIGFwcHJvcHJpYXRlIGFzIGFuICJvcHRpb24iLCBvciBjb25zaWRlciBtZXJnaW5nIFByb2Nlc3NlZE9wdGlvbnMgZW50aXJlbHkKICAvLyB3aXRoaW4gdGhpcyBjbGFzcywgYW5kIGRlcGVuZCBvbmx5IG9uIHRoZSByYXcgb3B0aW9ucyBoZXJlLgogIGZpbmFsIFByb2Nlc3NlZE9wdGlvbnMgb3B0aW9uczsKCiAgLy8vIFNvdXJjZXMgc2VlbiBieSB0aGUgY29tcGlsZXIuCiAgLy8vCiAgLy8vIFRoaXMgaXMgcG9wdWxhdGVkIGFzIHRoZSBjb21waWxlciByZWFkcyBmaWxlcywgYW5kIGl0IGlzIHVzZWQgZm9yIGVycm9yCiAgLy8vIHJlcG9ydGluZyBhbmQgdG8gZ2VuZXJhdGUgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGluIHRoZSBjb21waWxlZAogIC8vLyBwcm9ncmFtcy4KICBmaW5hbCBNYXA8VXJpLCBTb3VyY2U+IHVyaVRvU291cmNlID0gPFVyaSwgU291cmNlPnt9OwoKICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzLgogIGZpbmFsIExpc3Q8T2JqZWN0PiBlcnJvcnMgPSA8T2JqZWN0PltdOwoKICBmaW5hbCBMaXN0PFVyaT4gZGVwZW5kZW5jaWVzID0gPFVyaT5bXTsKCiAgRmlsZVN5c3RlbSBnZXQgZmlsZVN5c3RlbSA9PiBvcHRpb25zLmZpbGVTeXN0ZW07CgogIGJvb2wgZW5hYmxlQ29sb3JzQ2FjaGVkID0gbnVsbDsKCiAgVXJpIGNhY2hlZFNka1Jvb3QgPSBudWxsOwoKICBDb21waWxlckNvbnRleHQodGhpcy5vcHRpb25zKTsKCiAgdm9pZCBkaXNhYmxlQ29sb3JzKCkgewogICAgZW5hYmxlQ29sb3JzQ2FjaGVkID0gZmFsc2U7CiAgfQoKICAvLy8gUmVwb3J0IFttZXNzYWdlXSwgZm9yIGV4YW1wbGUsIGJ5IHByaW50aW5nIGl0LgogIHZvaWQgcmVwb3J0KExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UsIFNldmVyaXR5IHNldmVyaXR5LAogICAgICB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIG9wdGlvbnMucmVwb3J0KG1lc3NhZ2UsIHNldmVyaXR5LCBjb250ZXh0OiBjb250ZXh0KTsKICB9CgogIC8vLyBSZXBvcnQgW21lc3NhZ2VdLCBmb3IgZXhhbXBsZSwgYnkgcHJpbnRpbmcgaXQuCiAgLy8gVE9ETyhhc2tlc2MpOiBSZW1vdmUgdGhpcyBhbmQgZGlyZWN0IGNhbGxlcnMgZGlyZWN0bHkgdG8gcmVwb3J0LgogIHZvaWQgcmVwb3J0V2l0aG91dExvY2F0aW9uKE1lc3NhZ2UgbWVzc2FnZSwgU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKICAgIG9wdGlvbnMucmVwb3J0V2l0aG91dExvY2F0aW9uKG1lc3NhZ2UsIHNldmVyaXR5KTsKICB9CgogIC8vLyBGb3JtYXQgW21lc3NhZ2VdIGFzIGEgdGV4dCBzdHJpbmcgdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gZ2VuZXJhdGVkIGNvZGUuCiAgU3RyaW5nIGZvcm1hdChMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCBTZXZlcml0eSBzZXZlcml0eSkgewogICAgcmV0dXJuIGNvbW1hbmRfbGluZV9yZXBvcnRpbmcuZm9ybWF0KG1lc3NhZ2UsIHNldmVyaXR5KTsKICB9CgogIC8vLyBGb3JtYXQgW21lc3NhZ2VdIGFzIGEgdGV4dCBzdHJpbmcgdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gZ2VuZXJhdGVkIGNvZGUuCiAgLy8gVE9ETyhhc2tlc2MpOiBSZW1vdmUgdGhpcyBhbmQgZGlyZWN0IGNhbGxlcnMgZGlyZWN0bHkgdG8gZm9ybWF0LgogIFN0cmluZyBmb3JtYXRXaXRob3V0TG9jYXRpb24oTWVzc2FnZSBtZXNzYWdlLCBTZXZlcml0eSBzZXZlcml0eSkgewogICAgcmV0dXJuIGNvbW1hbmRfbGluZV9yZXBvcnRpbmcuZm9ybWF0KG1lc3NhZ2Uud2l0aG91dExvY2F0aW9uKCksIHNldmVyaXR5KTsKICB9CgogIC8vIFRPRE8oYWhlKTogUmVtb3ZlIHRoaXMuCiAgdm9pZCBsb2dFcnJvcihPYmplY3QgbWVzc2FnZSwgU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKICAgIGVycm9ycy5hZGQobWVzc2FnZSk7CiAgICBlcnJvcnMuYWRkKHNldmVyaXR5KTsKICB9CgogIHN0YXRpYyB2b2lkIHJlY29yZERlcGVuZGVuY3koVXJpIHVyaSkgewogICAgaWYgKHVyaS5zY2hlbWUgIT0gImZpbGUiKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJFeHBlY3RlZCBhIGZpbGUtVVJJLCBidXQgZ290OiAnJHVyaScuIik7CiAgICB9CiAgICBDb21waWxlckNvbnRleHQgY29udGV4dCA9IFpvbmUuY3VycmVudFtjb21waWxlckNvbnRleHRLZXldOwogICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewogICAgICBjb250ZXh0LmRlcGVuZGVuY2llcy5hZGQodXJpKTsKICAgIH0KICB9CgogIHN0YXRpYyBDb21waWxlckNvbnRleHQgZ2V0IGN1cnJlbnQgewogICAgQ29tcGlsZXJDb250ZXh0IGNvbnRleHQgPSBab25lLmN1cnJlbnRbY29tcGlsZXJDb250ZXh0S2V5XTsKICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKICAgICAgLy8gTm90ZTogd2UgdGhyb3cgZGlyZWN0bHkgYW5kIGRvbid0IHVzZSBpbnRlcm5hbFByb2JsZW0sIGJlY2F1c2UKICAgICAgLy8gaW50ZXJuYWxQcm9ibGVtIGRlcGVuZHMgb24gaGF2aW5nIGEgY29tcGlsZXIgY29udGV4dCBhdmFpbGFibGUuCiAgICAgIHZhciBtZXNzYWdlID0gbWVzc2FnZUludGVybmFsUHJvYmxlbU1pc3NpbmdDb250ZXh0Lm1lc3NhZ2U7CiAgICAgIHZhciB0aXAgPSBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtTWlzc2luZ0NvbnRleHQudGlwOwogICAgICB0aHJvdyAiSW50ZXJuYWwgcHJvYmxlbTogJG1lc3NhZ2VcblRpcDogJHRpcCI7CiAgICB9CiAgICByZXR1cm4gY29udGV4dDsKICB9CgogIHN0YXRpYyBib29sIGdldCBpc0FjdGl2ZSA9PiBab25lLmN1cnJlbnRbY29tcGlsZXJDb250ZXh0S2V5XSAhPSBudWxsOwoKICAvLy8gUGVyZm9ybSBbYWN0aW9uXSBpbiBhIFtab25lXSB3aGVyZSBbdGhpc10gd2lsbCBiZSBhdmFpbGFibGUgYXMKICAvLy8gYENvbXBpbGVyQ29udGV4dC5jdXJyZW50YC4KICBGdXR1cmU8VD4gcnVuSW5Db250ZXh0PFQ+KEZ1dHVyZTxUPiBhY3Rpb24oQ29tcGlsZXJDb250ZXh0IGMpKSB7CiAgICByZXR1cm4gcnVuWm9uZWQoCiAgICAgICAgKCkgPT4gbmV3IEZ1dHVyZTxUPi5zeW5jKCgpID0+IGFjdGlvbih0aGlzKSkud2hlbkNvbXBsZXRlKGNsZWFyKSwKICAgICAgICB6b25lVmFsdWVzOiB7Y29tcGlsZXJDb250ZXh0S2V5OiB0aGlzfSk7CiAgfQoKICAvLy8gUGVyZm9ybSBbYWN0aW9uXSBpbiBhIFtab25lXSB3aGVyZSBbb3B0aW9uc10gd2lsbCBiZSBhdmFpbGFibGUgYXMKICAvLy8gYENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnNgLgogIHN0YXRpYyBGdXR1cmU8VD4gcnVuV2l0aE9wdGlvbnM8VD4oCiAgICAgIFByb2Nlc3NlZE9wdGlvbnMgb3B0aW9ucywgRnV0dXJlPFQ+IGFjdGlvbihDb21waWxlckNvbnRleHQgYyksCiAgICAgIHtib29sIGVycm9yT25NaXNzaW5nSW5wdXQ6IHRydWV9KSB7CiAgICByZXR1cm4gbmV3IENvbXBpbGVyQ29udGV4dChvcHRpb25zKQogICAgICAgIC5ydW5JbkNvbnRleHQ8VD4oKENvbXBpbGVyQ29udGV4dCBjKSBhc3luYyB7CiAgICAgIGF3YWl0IG9wdGlvbnMudmFsaWRhdGVPcHRpb25zKGVycm9yT25NaXNzaW5nSW5wdXQ6IGVycm9yT25NaXNzaW5nSW5wdXQpOwogICAgICByZXR1cm4gYWN0aW9uKGMpOwogICAgfSk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPFQ+IHJ1bldpdGhEZWZhdWx0T3B0aW9uczxUPigKICAgICAgRnV0dXJlPFQ+IGFjdGlvbihDb21waWxlckNvbnRleHQgYykpIHsKICAgIHJldHVybiBuZXcgQ29tcGlsZXJDb250ZXh0KG5ldyBQcm9jZXNzZWRPcHRpb25zKCkpLnJ1bkluQ29udGV4dDxUPihhY3Rpb24pOwogIH0KCiAgc3RhdGljIGJvb2wgZ2V0IGVuYWJsZUNvbG9ycyB7CiAgICByZXR1cm4gY3VycmVudC5lbmFibGVDb2xvcnNDYWNoZWQgPz89IGNvbXB1dGVFbmFibGVDb2xvcnMoY3VycmVudCk7CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgU3RyaW5nVG9rZW4uY2Fub25pY2FsaXplci5jbGVhcigpOwogICAgZXJyb3JzLmNsZWFyKCk7CiAgICBkZXBlbmRlbmNpZXMuY2xlYXIoKTsKICB9Cn0KgJoATk48ASABMQEuATwBPwEuAUABLwEaSAEmATABMQRGTwROKBhPT0EiASQGTkwQOAEdKgEqATMBIgEcASEBGSAEATU5KDkEATVGQzYEAVA9PQQBUEZFTwQBHTUZGgQBKiBIBkAbJQYEASdAG0hJQjo1BhQEAUgBRSFDFUoxBAFIKSZFKig1TxgIBAEtLVAEASFIBAERJxQaBAIBMXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9jb21waWxlcl9jb250ZXh0LmRhcnQ1c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2Zhc3RhX2NvZGVzLmRhcnSbmy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmNvZGVzOwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgSnNvbkVuY29kZXIsIGpzb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdyBDb25zdGFudCwgRGFydFR5cGUsIGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWU7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZGlhZ25vc3RpY19tZXNzYWdlLmRhcnQnIHNob3cgRGlhZ25vc3RpY01lc3NhZ2U7CgppbXBvcnQgJy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAna2VybmVsL3R5cGVfbGFiZWxlci5kYXJ0JzsKCmltcG9ydCAnc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eTsKCmltcG9ydCAncmVzb2x2ZV9pbnB1dF91cmkuZGFydCcgc2hvdyBpc1dpbmRvd3M7CgppbXBvcnQgJ3V0aWwvcmVsYXRpdml6ZS5kYXJ0JyBhcyB1dGlsIHNob3cgcmVsYXRpdml6ZVVyaTsKCnBhcnQgJ2Zhc3RhX2NvZGVzX2dlbmVyYXRlZC5kYXJ0JzsKCmNvbnN0IGludCBub0xlbmd0aCA9IDE7CgpjbGFzcyBDb2RlPFQ+IHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgLy8vIFRoZSB1bmlxdWUgcG9zaXRpdmUgaW50ZWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb2RlLAogIC8vLyBvciBgLTFgIGlmIG5vbmUuIFRoaXMgaW5kZXggaXMgdXNlZCB3aGVuIHRyYW5zbGF0aW5nCiAgLy8vIHRoaXMgZXJyb3IgdG8gaXRzIGNvcnJlc3BvbmRpbmcgQW5hbHl6ZXIgZXJyb3IuCiAgZmluYWwgaW50IGluZGV4OwoKICBmaW5hbCBUZW1wbGF0ZTxUPiB0ZW1wbGF0ZTsKCiAgZmluYWwgTGlzdDxTdHJpbmc+IGFuYWx5emVyQ29kZXM7CgogIGZpbmFsIFNldmVyaXR5IHNldmVyaXR5OwoKICBjb25zdCBDb2RlKHRoaXMubmFtZSwgdGhpcy50ZW1wbGF0ZSwKICAgICAge2ludCBpbmRleCwgdGhpcy5hbmFseXplckNvZGVzLCB0aGlzLnNldmVyaXR5OiBTZXZlcml0eS5lcnJvcn0pCiAgICAgIDogdGhpcy5pbmRleCA9IGluZGV4ID8/IC0xOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBuYW1lOwp9CgpjbGFzcyBNZXNzYWdlIHsKICBmaW5hbCBDb2RlPGR5bmFtaWM+IGNvZGU7CgogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwoKICBmaW5hbCBTdHJpbmcgdGlwOwoKICBmaW5hbCBNYXA8U3RyaW5nLCBkeW5hbWljPiBhcmd1bWVudHM7CgogIGNvbnN0IE1lc3NhZ2UodGhpcy5jb2RlLCB7dGhpcy5tZXNzYWdlLCB0aGlzLnRpcCwgdGhpcy5hcmd1bWVudHN9KTsKCiAgTG9jYXRlZE1lc3NhZ2Ugd2l0aExvY2F0aW9uKFVyaSB1cmksIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IExvY2F0ZWRNZXNzYWdlKHVyaSwgY2hhck9mZnNldCwgbGVuZ3RoLCB0aGlzKTsKICB9CgogIExvY2F0ZWRNZXNzYWdlIHdpdGhvdXRMb2NhdGlvbigpIHsKICAgIHJldHVybiBuZXcgTG9jYXRlZE1lc3NhZ2UobnVsbCwgLTEsIG5vTGVuZ3RoLCB0aGlzKTsKICB9Cn0KCmNsYXNzIE1lc3NhZ2VDb2RlIGV4dGVuZHMgQ29kZTxOdWxsPiBpbXBsZW1lbnRzIE1lc3NhZ2UgewogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwoKICBmaW5hbCBTdHJpbmcgdGlwOwoKICBjb25zdCBNZXNzYWdlQ29kZShTdHJpbmcgbmFtZSwKICAgICAge2ludCBpbmRleCwKICAgICAgTGlzdDxTdHJpbmc+IGFuYWx5emVyQ29kZXMsCiAgICAgIFNldmVyaXR5IHNldmVyaXR5OiBTZXZlcml0eS5lcnJvciwKICAgICAgdGhpcy5tZXNzYWdlLAogICAgICB0aGlzLnRpcH0pCiAgICAgIDogc3VwZXIobmFtZSwgbnVsbCwKICAgICAgICAgICAgaW5kZXg6IGluZGV4LCBhbmFseXplckNvZGVzOiBhbmFseXplckNvZGVzLCBzZXZlcml0eTogc2V2ZXJpdHkpOwoKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgYXJndW1lbnRzID0+IGNvbnN0IDxTdHJpbmcsIGR5bmFtaWM+e307CgogIENvZGU8ZHluYW1pYz4gZ2V0IGNvZGUgPT4gdGhpczsKCiAgQG92ZXJyaWRlCiAgTG9jYXRlZE1lc3NhZ2Ugd2l0aExvY2F0aW9uKFVyaSB1cmksIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IExvY2F0ZWRNZXNzYWdlKHVyaSwgY2hhck9mZnNldCwgbGVuZ3RoLCB0aGlzKTsKICB9CgogIExvY2F0ZWRNZXNzYWdlIHdpdGhvdXRMb2NhdGlvbigpIHsKICAgIHJldHVybiBuZXcgTG9jYXRlZE1lc3NhZ2UobnVsbCwgLTEsIG5vTGVuZ3RoLCB0aGlzKTsKICB9Cn0KCmNsYXNzIFRlbXBsYXRlPFQ+IHsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZVRlbXBsYXRlOwoKICBmaW5hbCBTdHJpbmcgdGlwVGVtcGxhdGU7CgogIGZpbmFsIFQgd2l0aEFyZ3VtZW50czsKCiAgY29uc3QgVGVtcGxhdGUoe3RoaXMubWVzc2FnZVRlbXBsYXRlLCB0aGlzLnRpcFRlbXBsYXRlLCB0aGlzLndpdGhBcmd1bWVudHN9KTsKfQoKY2xhc3MgTG9jYXRlZE1lc3NhZ2UgaW1wbGVtZW50cyBDb21wYXJhYmxlPExvY2F0ZWRNZXNzYWdlPiB7CiAgZmluYWwgVXJpIHVyaTsKCiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIGZpbmFsIGludCBsZW5ndGg7CgogIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZU9iamVjdDsKCiAgY29uc3QgTG9jYXRlZE1lc3NhZ2UoCiAgICAgIHRoaXMudXJpLCB0aGlzLmNoYXJPZmZzZXQsIHRoaXMubGVuZ3RoLCB0aGlzLm1lc3NhZ2VPYmplY3QpOwoKICBDb2RlPGR5bmFtaWM+IGdldCBjb2RlID0+IG1lc3NhZ2VPYmplY3QuY29kZTsKCiAgU3RyaW5nIGdldCBtZXNzYWdlID0+IG1lc3NhZ2VPYmplY3QubWVzc2FnZTsKCiAgU3RyaW5nIGdldCB0aXAgPT4gbWVzc2FnZU9iamVjdC50aXA7CgogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGdldCBhcmd1bWVudHMgPT4gbWVzc2FnZU9iamVjdC5hcmd1bWVudHM7CgogIGludCBjb21wYXJlVG8oTG9jYXRlZE1lc3NhZ2Ugb3RoZXIpIHsKICAgIGludCByZXN1bHQgPSAiJHt1cml9Ii5jb21wYXJlVG8oIiR7b3RoZXIudXJpfSIpOwogICAgaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gcmVzdWx0OwogICAgcmVzdWx0ID0gY2hhck9mZnNldC5jb21wYXJlVG8ob3RoZXIuY2hhck9mZnNldCk7CiAgICBpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7CiAgICByZXR1cm4gbWVzc2FnZS5jb21wYXJlVG8obWVzc2FnZSk7CiAgfQoKICBGb3JtYXR0ZWRNZXNzYWdlIHdpdGhGb3JtYXR0aW5nKFN0cmluZyBmb3JtYXR0ZWQsIGludCBsaW5lLCBpbnQgY29sdW1uLAogICAgICBTZXZlcml0eSBzZXZlcml0eSwgTGlzdDxGb3JtYXR0ZWRNZXNzYWdlPiByZWxhdGVkSW5mb3JtYXRpb24pIHsKICAgIHJldHVybiBuZXcgRm9ybWF0dGVkTWVzc2FnZSgKICAgICAgICB0aGlzLCBmb3JtYXR0ZWQsIGxpbmUsIGNvbHVtbiwgc2V2ZXJpdHksIHJlbGF0ZWRJbmZvcm1hdGlvbik7CiAgfQp9CgpjbGFzcyBGb3JtYXR0ZWRNZXNzYWdlIGltcGxlbWVudHMgRGlhZ25vc3RpY01lc3NhZ2UgewogIGZpbmFsIExvY2F0ZWRNZXNzYWdlIGxvY2F0ZWRNZXNzYWdlOwoKICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkOwoKICBmaW5hbCBpbnQgbGluZTsKCiAgZmluYWwgaW50IGNvbHVtbjsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU2V2ZXJpdHkgc2V2ZXJpdHk7CgogIGZpbmFsIExpc3Q8Rm9ybWF0dGVkTWVzc2FnZT4gcmVsYXRlZEluZm9ybWF0aW9uOwoKICBjb25zdCBGb3JtYXR0ZWRNZXNzYWdlKHRoaXMubG9jYXRlZE1lc3NhZ2UsIHRoaXMuZm9ybWF0dGVkLCB0aGlzLmxpbmUsCiAgICAgIHRoaXMuY29sdW1uLCB0aGlzLnNldmVyaXR5LCB0aGlzLnJlbGF0ZWRJbmZvcm1hdGlvbik7CgogIENvZGU8ZHluYW1pYz4gZ2V0IGNvZGUgPT4gbG9jYXRlZE1lc3NhZ2UuY29kZTsKCiAgU3RyaW5nIGdldCBtZXNzYWdlID0+IGxvY2F0ZWRNZXNzYWdlLm1lc3NhZ2U7CgogIFN0cmluZyBnZXQgdGlwID0+IGxvY2F0ZWRNZXNzYWdlLnRpcDsKCiAgTWFwPFN0cmluZywgZHluYW1pYz4gZ2V0IGFyZ3VtZW50cyA9PiBsb2NhdGVkTWVzc2FnZS5hcmd1bWVudHM7CgogIFVyaSBnZXQgdXJpID0+IGxvY2F0ZWRNZXNzYWdlLnVyaTsKCiAgaW50IGdldCBjaGFyT2Zmc2V0ID0+IGxvY2F0ZWRNZXNzYWdlLmNoYXJPZmZzZXQ7CgogIGludCBnZXQgbGVuZ3RoID0+IGxvY2F0ZWRNZXNzYWdlLmxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgYW5zaUZvcm1hdHRlZCBzeW5jKiB7CiAgICB5aWVsZCBmb3JtYXR0ZWQ7CiAgICBpZiAocmVsYXRlZEluZm9ybWF0aW9uICE9IG51bGwpIHsKICAgICAgZm9yIChGb3JtYXR0ZWRNZXNzYWdlIG0gaW4gcmVsYXRlZEluZm9ybWF0aW9uKSB7CiAgICAgICAgeWllbGQgbS5mb3JtYXR0ZWQ7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IHBsYWluVGV4dEZvcm1hdHRlZCB7CiAgICAvLyBUT0RPKGFoZSk6IEltcGxlbWVudCB0aGlzIGNvcnJlY3RseS4KICAgIHJldHVybiBhbnNpRm9ybWF0dGVkOwogIH0KCiAgTWFwPFN0cmluZywgT2JqZWN0PiB0b0pzb24oKSB7CiAgICAvLyBUaGlzIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBwYWNrYWdlOmtlcm5lbC9wcm9ibGVtcy5tZAogICAgcmV0dXJuIDxTdHJpbmcsIE9iamVjdD57CiAgICAgICJhbnNpRm9ybWF0dGVkIjogYW5zaUZvcm1hdHRlZC50b0xpc3QoKSwKICAgICAgInBsYWluVGV4dEZvcm1hdHRlZCI6IHBsYWluVGV4dEZvcm1hdHRlZC50b0xpc3QoKSwKICAgICAgInNldmVyaXR5Ijogc2V2ZXJpdHkuaW5kZXgsCiAgICAgICJ1cmkiOiB1cmkudG9TdHJpbmcoKSwKICAgIH07CiAgfQoKICBTdHJpbmcgdG9Kc29uU3RyaW5nKCkgewogICAgSnNvbkVuY29kZXIgZW5jb2RlciA9IG5ldyBKc29uRW5jb2Rlci53aXRoSW5kZW50KCIgICIpOwogICAgcmV0dXJuIGVuY29kZXIuY29udmVydCh0aGlzKTsKICB9Cn0KCmNsYXNzIERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24gaW1wbGVtZW50cyBEaWFnbm9zdGljTWVzc2FnZSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBhbnNpRm9ybWF0dGVkOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IHBsYWluVGV4dEZvcm1hdHRlZDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU2V2ZXJpdHkgc2V2ZXJpdHk7CgogIGZpbmFsIFVyaSB1cmk7CgogIERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24oCiAgICAgIHRoaXMuYW5zaUZvcm1hdHRlZCwgdGhpcy5wbGFpblRleHRGb3JtYXR0ZWQsIHRoaXMuc2V2ZXJpdHksIHRoaXMudXJpKTsKCiAgZmFjdG9yeSBEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uLmZyb21Kc29uKFN0cmluZyBqc29uU3RyaW5nKSB7CiAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGRlY29kZWQgPSBqc29uLmRlY29kZShqc29uU3RyaW5nKTsKICAgIExpc3Q8U3RyaW5nPiBhbnNpRm9ybWF0dGVkID0KICAgICAgICBuZXcgTGlzdDxTdHJpbmc+LmZyb20oZGVjb2RlZFsiYW5zaUZvcm1hdHRlZCJdKTsKICAgIExpc3Q8U3RyaW5nPiBwbGFpblRleHRGb3JtYXR0ZWQgPQogICAgICAgIG5ldyBMaXN0PFN0cmluZz4uZnJvbShkZWNvZGVkWyJwbGFpblRleHRGb3JtYXR0ZWQiXSk7CiAgICBTZXZlcml0eSBzZXZlcml0eSA9IFNldmVyaXR5LnZhbHVlc1tkZWNvZGVkWyJzZXZlcml0eSJdXTsKICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoZGVjb2RlZFsidXJpIl0pOwoKICAgIHJldHVybiBuZXcgRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbigKICAgICAgICBhbnNpRm9ybWF0dGVkLCBwbGFpblRleHRGb3JtYXR0ZWQsIHNldmVyaXR5LCB1cmkpOwogIH0KCiAgTWFwPFN0cmluZywgT2JqZWN0PiB0b0pzb24oKSB7CiAgICAvLyBUaGlzIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBwYWNrYWdlOmtlcm5lbC9wcm9ibGVtcy5tZAogICAgcmV0dXJuIDxTdHJpbmcsIE9iamVjdD57CiAgICAgICJhbnNpRm9ybWF0dGVkIjogYW5zaUZvcm1hdHRlZC50b0xpc3QoKSwKICAgICAgInBsYWluVGV4dEZvcm1hdHRlZCI6IHBsYWluVGV4dEZvcm1hdHRlZC50b0xpc3QoKSwKICAgICAgInNldmVyaXR5Ijogc2V2ZXJpdHkuaW5kZXgsCiAgICAgICJ1cmkiOiB1cmkudG9TdHJpbmcoKSwKICAgIH07CiAgfQoKICBTdHJpbmcgdG9Kc29uU3RyaW5nKCkgewogICAgSnNvbkVuY29kZXIgZW5jb2RlciA9IG5ldyBKc29uRW5jb2Rlci53aXRoSW5kZW50KCIgICIpOwogICAgcmV0dXJuIGVuY29kZXIuY29udmVydCh0aGlzKTsKICB9Cn0KClN0cmluZyByZWxhdGl2aXplVXJpKFVyaSB1cmkpIHsKICAvLyBXZSBoYXZlIHRoaXMgbWV0aG9kIGhlcmUgZm9yIHR3byByZWFzb25zOgogIC8vCiAgLy8gMS4gSXQgYWxsb3dzIHVzIHRvIGltcGxlbWVudCAjdXJpIG1lc3NhZ2UgYXJndW1lbnQgd2l0aG91dCB1c2luZyBpdAogIC8vIChvdGhlcndpc2UsIHdlIG1pZ2h0IGdldCBhbiBgVU5VU0VEX0lNUE9SVGAgd2FybmluZykuCiAgLy8KICAvLyAyLiBXZSBjYW4gY2hhbmdlIGBiYXNlYCBhcmd1bWVudCBoZXJlIGlmIG5lZWRlZC4KICByZXR1cm4gdXJpID09IG51bGwgPyBudWxsIDogdXRpbC5yZWxhdGl2aXplVXJpKFVyaS5iYXNlLCB1cmksIGlzV2luZG93cyk7Cn0KCnR5cGVkZWYgU3VtbWFyeVRlbXBsYXRlID0gTWVzc2FnZSBGdW5jdGlvbihpbnQsIGludCwgbnVtLCBudW0sIG51bSk7CgpTdHJpbmcgaXRlbWl6ZU5hbWVzKExpc3Q8U3RyaW5nPiBuYW1lcykgewogIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGggLSAxOyBpKyspIHsKICAgIGJ1ZmZlci53cml0ZSgiIC0gIik7CiAgICBidWZmZXIud3JpdGVsbihuYW1lc1tpXSk7CiAgfQogIGJ1ZmZlci53cml0ZSgiIC0gIik7CiAgYnVmZmVyLndyaXRlKG5hbWVzLmxhc3QpOwogIHJldHVybiAiJGJ1ZmZlciI7Cn0KgRAATk48ARUBLgEhOwFKASsBIwEmATABOgEjARgBEBUBPTs2EwEeASQBGwEnRiIBHQIBEBwBGAEUASgBRgFFPgQBJTkEAgE6GAEUASESIikUERpNAUMBIgEMRT4EASU5BAIBFCABHAEZAVACAT0RARgBFAEfARhDATABLwEnAUEBKDUkNSQnBAFKRiFGBAIBNicBGgESARQBDBsBMwFJPAExATABKAFCASUBMwErAQwtFSY3GwgGBAEMLCwaBAEhQx0vOSIdBwQBGjwiBAIBPwwoAQwtAQwbAREBHU0BQjshOSY+PikBKjsEASFDHS85Ih0HBAEaPCIEAgEgLwVJOwU2TAIBRQEqLC8ZHgQXHBQCASxwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZmFzdGFfY29kZXMuZGFydD9zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvZmFzdGFfY29kZXNfZ2VuZXJhdGVkLmRhcnTABsP+Ly8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIE5PVEU6IFRISVMgRklMRSBJUyBHRU5FUkFURUQuIERPIE5PVCBFRElULgovLwovLyBJbnN0ZWFkIG1vZGlmeSAncGtnL2Zyb250X2VuZC9tZXNzYWdlcy55YW1sJyBhbmQgcnVuCi8vICdwa2cvZnJvbnRfZW5kL3Rvb2wvZmFzdGEgZ2VuZXJhdGUtbWVzc2FnZXMnIHRvIHVwZGF0ZS4KCnBhcnQgb2YgZmFzdGEuY29kZXM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSBjbGFzcyAnI25hbWUnIGlzIGFic3RyYWN0IGFuZCBjYW4ndCBiZSBpbnN0YW50aWF0ZWQuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbiIsIHRlbXBsYXRlQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5FV19XSVRIX0FCU1RSQUNUX0NMQVNTIl0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24oU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbiwKICAgICAgbWVzc2FnZTogIiIiVGhlIGNsYXNzICcke25hbWV9JyBpcyBhYnN0cmFjdCBhbmQgY2FuJ3QgYmUgaW5zdGFudGlhdGVkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUFic3RyYWN0Q2xhc3NNZW1iZXIgPSBtZXNzYWdlQWJzdHJhY3RDbGFzc01lbWJlcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VBYnN0cmFjdENsYXNzTWVtYmVyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQWJzdHJhY3RDbGFzc01lbWJlciIsCiAgICBpbmRleDogNTEsCiAgICBtZXNzYWdlOiByIiIiTWVtYmVycyBvZiBjbGFzc2VzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdhYnN0cmFjdCcuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlICdhYnN0cmFjdCcga2V5d29yZC4gWW91IGNhbiBhZGQgdGhlICdhYnN0cmFjdCcga2V5d29yZCBiZWZvcmUgdGhlIGNsYXNzIGRlY2xhcmF0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVBYnN0cmFjdE5vdFN5bmMgPSBtZXNzYWdlQWJzdHJhY3ROb3RTeW5jOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUFic3RyYWN0Tm90U3luYyA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJBYnN0cmFjdE5vdFN5bmMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PTl9TWU5DX0FCU1RSQUNUX01FVEhPRCJdLAogICAgbWVzc2FnZTogciIiIkFic3RyYWN0IG1ldGhvZHMgY2FuJ3QgdXNlICdhc3luYycsICdhc3luYyonLCBvciAnc3luYyonLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUFic3RyYWN0UmVkaXJlY3RlZENsYXNzSW5zdGFudGlhdGlvbiA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiRmFjdG9yeSByZWRpcmVjdHMgdG8gY2xhc3MgJyNuYW1lJywgd2hpY2ggaXMgYWJzdHJhY3QgYW5kIGNhbid0IGJlIGluc3RhbnRpYXRlZC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0Fic3RyYWN0UmVkaXJlY3RlZENsYXNzSW5zdGFudGlhdGlvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUFic3RyYWN0UmVkaXJlY3RlZENsYXNzSW5zdGFudGlhdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQWJzdHJhY3RSZWRpcmVjdGVkQ2xhc3NJbnN0YW50aWF0aW9uIiwKICAgICAgICB0ZW1wbGF0ZUFic3RyYWN0UmVkaXJlY3RlZENsYXNzSW5zdGFudGlhdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRkFDVE9SWV9SRURJUkVDVFNfVE9fQUJTVFJBQ1RfQ0xBU1MiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNBYnN0cmFjdFJlZGlyZWN0ZWRDbGFzc0luc3RhbnRpYXRpb24oU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVBYnN0cmFjdFJlZGlyZWN0ZWRDbGFzc0luc3RhbnRpYXRpb24sCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJGYWN0b3J5IHJlZGlyZWN0cyB0byBjbGFzcyAnJHtuYW1lfScsIHdoaWNoIGlzIGFic3RyYWN0IGFuZCBjYW4ndCBiZSBpbnN0YW50aWF0ZWQuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlQWNjZXNzRXJyb3IgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkFjY2VzcyBlcnJvcjogJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNBY2Nlc3NFcnJvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQWNjZXNzRXJyb3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIkFjY2Vzc0Vycm9yIiwKICB0ZW1wbGF0ZUFjY2Vzc0Vycm9yLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0FjY2Vzc0Vycm9yKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQWNjZXNzRXJyb3IsCiAgICAgIG1lc3NhZ2U6ICIiIkFjY2VzcyBlcnJvcjogJyR7bmFtZX0nLiIiIiwgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgdGVtcGxhdGVBbWJpZ3VvdXNTdXBlcnR5cGVzID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiInI25hbWUnIGNhbid0IGltcGxlbWVudCBib3RoICcjdHlwZScgYW5kICcjdHlwZTInIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQW1iaWd1b3VzU3VwZXJ0eXBlcyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUFtYmlndW91c1N1cGVydHlwZXMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgIkFtYmlndW91c1N1cGVydHlwZXMiLCB0ZW1wbGF0ZUFtYmlndW91c1N1cGVydHlwZXMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkFNQklHVU9VU19TVVBFUlRZUEVTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0FtYmlndW91c1N1cGVydHlwZXMoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQW1iaWd1b3VzU3VwZXJ0eXBlcywKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGNhbid0IGltcGxlbWVudCBib3RoICcke3R5cGV9JyBhbmQgJyR7dHlwZTJ9JyIiIiArCiAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVBbm9ueW1vdXNCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbiA9CiAgICBtZXNzYWdlQW5vbnltb3VzQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQW5vbnltb3VzQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb24gPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkFub255bW91c0JyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uIiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTEFCRUxfSU5fT1VURVJfU0NPUEUiXSwKICAgICAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgYnJlYWsgdG8gYSB0YXJnZXQgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUFub255bW91c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uID0KICAgIG1lc3NhZ2VBbm9ueW1vdXNDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VBbm9ueW1vdXNDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbiA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiQW5vbnltb3VzQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb24iLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJMQUJFTF9JTl9PVVRFUl9TQ09QRSJdLAogICAgICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCBjb250aW51ZSBhdCBhIHRhcmdldCBpbiBhIGRpZmZlcmVudCBmdW5jdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlCiAgICAgICAgICAgIF90eXBlMik+IHRlbXBsYXRlQXJndW1lbnRUeXBlTm90QXNzaWduYWJsZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgYXJndW1lbnQgdHlwZSAnI3R5cGUnIGNhbid0IGJlIGFzc2lnbmVkIHRvIHRoZSBwYXJhbWV0ZXIgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIsIG9yIGNhc3RpbmcgdGhlIGFyZ3VtZW50IHRvICcjdHlwZTInLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQXJndW1lbnRUeXBlTm90QXNzaWduYWJsZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+CiAgICBjb2RlQXJndW1lbnRUeXBlTm90QXNzaWduYWJsZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlIiwgdGVtcGxhdGVBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJBUkdVTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0FyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGUoCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUFyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgYXJndW1lbnQgdHlwZSAnJHt0eXBlfScgY2FuJ3QgYmUgYXNzaWduZWQgdG8gdGhlIHBhcmFtZXRlciB0eXBlICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIlRyeSBjaGFuZ2luZyB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyLCBvciBjYXN0aW5nIHRoZSBhcmd1bWVudCB0byAnJHt0eXBlMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBpbnQKICAgICAgICAgICAgY29kZVBvaW50KT4gdGVtcGxhdGVBc2NpaUNvbnRyb2xDaGFyYWN0ZXIgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKGludCBjb2RlUG9pbnQpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIGNvbnRyb2wgY2hhcmFjdGVyICN1bmljb2RlIGNhbiBvbmx5IGJlIHVzZWQgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNBc2NpaUNvbnRyb2xDaGFyYWN0ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb2RlUG9pbnQpPiBjb2RlQXNjaWlDb250cm9sQ2hhcmFjdGVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY29kZVBvaW50KT4oCiAgICAgICAgIkFzY2lpQ29udHJvbENoYXJhY3RlciIsIHRlbXBsYXRlQXNjaWlDb250cm9sQ2hhcmFjdGVyLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTExFR0FMX0NIQVJBQ1RFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNBc2NpaUNvbnRyb2xDaGFyYWN0ZXIoaW50IGNvZGVQb2ludCkgewogIFN0cmluZyB1bmljb2RlID0KICAgICAgIlUrJHtjb2RlUG9pbnQudG9SYWRpeFN0cmluZygxNikudG9VcHBlckNhc2UoKS5wYWRMZWZ0KDQsICcwJyl9IjsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUFzY2lpQ29udHJvbENoYXJhY3RlciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBjb250cm9sIGNoYXJhY3RlciAke3VuaWNvZGV9IGNhbiBvbmx5IGJlIHVzZWQgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnY29kZVBvaW50JzogY29kZVBvaW50fSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUFzc2VydEFzRXhwcmVzc2lvbiA9IG1lc3NhZ2VBc3NlcnRBc0V4cHJlc3Npb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQXNzZXJ0QXNFeHByZXNzaW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQXNzZXJ0QXNFeHByZXNzaW9uIiwKICAgIG1lc3NhZ2U6IHIiIiJgYXNzZXJ0YCBjYW4ndCBiZSB1c2VkIGFzIGFuIGV4cHJlc3Npb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUFzc2VydEV4dHJhbmVvdXNBcmd1bWVudCA9IG1lc3NhZ2VBc3NlcnRFeHRyYW5lb3VzQXJndW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQXNzZXJ0RXh0cmFuZW91c0FyZ3VtZW50ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQXNzZXJ0RXh0cmFuZW91c0FyZ3VtZW50IiwKICAgIG1lc3NhZ2U6IHIiIiJgYXNzZXJ0YCBjYW4ndCBoYXZlIG1vcmUgdGhhbiB0d28gYXJndW1lbnRzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVBd2FpdEFzSWRlbnRpZmllciA9IG1lc3NhZ2VBd2FpdEFzSWRlbnRpZmllcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VBd2FpdEFzSWRlbnRpZmllciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkF3YWl0QXNJZGVudGlmaWVyIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJBU1lOQ19LRVlXT1JEX1VTRURfQVNfSURFTlRJRklFUiJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiJ2F3YWl0JyBjYW4ndCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgaW4gJ2FzeW5jJywgJ2FzeW5jKicsIG9yICdzeW5jKicgbWV0aG9kcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQXdhaXRGb3JOb3RBc3luYyA9IG1lc3NhZ2VBd2FpdEZvck5vdEFzeW5jOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUF3YWl0Rm9yTm90QXN5bmMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJBd2FpdEZvck5vdEFzeW5jIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJBU1lOQ19GT1JfSU5fV1JPTkdfQ09OVEVYVCJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhlIGFzeW5jaHJvbm91cyBmb3ItaW4gY2FuIG9ubHkgYmUgdXNlZCBpbiBmdW5jdGlvbnMgbWFya2VkIHdpdGggJ2FzeW5jJyBvciAnYXN5bmMqJy4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSBtYXJraW5nIHRoZSBmdW5jdGlvbiBib2R5IHdpdGggZWl0aGVyICdhc3luYycgb3IgJ2FzeW5jKicsIG9yIHJlbW92aW5nIHRoZSAnYXdhaXQnIGJlZm9yZSB0aGUgZm9yIGxvb3AuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUF3YWl0Tm90QXN5bmMgPSBtZXNzYWdlQXdhaXROb3RBc3luYzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VBd2FpdE5vdEFzeW5jID0gY29uc3QgTWVzc2FnZUNvZGUoIkF3YWl0Tm90QXN5bmMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkFXQUlUX0lOX1dST05HX0NPTlRFWFQiXSwKICAgIG1lc3NhZ2U6IHIiIiInYXdhaXQnIGNhbiBvbmx5IGJlIHVzZWQgaW4gJ2FzeW5jJyBvciAnYXN5bmMqJyBtZXRob2RzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgdGVtcGxhdGVCYWRUeXBlVmFyaWFibGVJblN1cGVydHlwZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJGb3VuZCB1bnN1cHBvcnRlZCB1c2VzIG9mICcjbmFtZScgaW4gc3VwZXJ0eXBlICcjbmFtZTInLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0JhZFR5cGVWYXJpYWJsZUluU3VwZXJ0eXBlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVCYWRUeXBlVmFyaWFibGVJblN1cGVydHlwZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICJCYWRUeXBlVmFyaWFibGVJblN1cGVydHlwZSIsCiAgdGVtcGxhdGVCYWRUeXBlVmFyaWFibGVJblN1cGVydHlwZSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNCYWRUeXBlVmFyaWFibGVJblN1cGVydHlwZShTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUJhZFR5cGVWYXJpYWJsZUluU3VwZXJ0eXBlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiRm91bmQgdW5zdXBwb3J0ZWQgdXNlcyBvZiAnJHtuYW1lfScgaW4gc3VwZXJ0eXBlICcke25hbWUyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFDeWNsZU5vblNpbXBsaWNpdHkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLAogICAgICAgICAgICBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiR2VuZXJpYyB0eXBlICcjbmFtZScgY2FuJ3QgYmUgdXNlZCB3aXRob3V0IHR5cGUgYXJndW1lbnRzIGluIHRoZSBib3VuZHMgb2YgaXRzIG93biB0eXBlIHZhcmlhYmxlcy4gSXQgaXMgcmVmZXJlbmNlZCBpbmRpcmVjdGx5IHRocm91Z2ggJyNuYW1lMicuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBwcm92aWRpbmcgdHlwZSBhcmd1bWVudHMgdG8gJyNuYW1lMicgaGVyZSBvciB0byBzb21lIG90aGVyIHJhdyB0eXBlcyBpbiB0aGUgYm91bmRzIGFsb25nIHRoZSByZWZlcmVuY2UgY2hhaW4uIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIkJvdW5kSXNzdWVWaWFDeWNsZU5vblNpbXBsaWNpdHkiLAogICAgICAgIHRlbXBsYXRlQm91bmRJc3N1ZVZpYUN5Y2xlTm9uU2ltcGxpY2l0eSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0lOU1RBTlRJQVRFRF9CT1VORCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5KAogICAgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiR2VuZXJpYyB0eXBlICcke25hbWV9JyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gdGhlIGJvdW5kcyBvZiBpdHMgb3duIHR5cGUgdmFyaWFibGVzLiBJdCBpcyByZWZlcmVuY2VkIGluZGlyZWN0bHkgdGhyb3VnaCAnJHtuYW1lMn0nLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIHRvICcke25hbWUyfScgaGVyZSBvciB0byBzb21lIG90aGVyIHJhdyB0eXBlcyBpbiB0aGUgYm91bmRzIGFsb25nIHRoZSByZWZlcmVuY2UgY2hhaW4uIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlQm91bmRJc3N1ZVZpYUxvb3BOb25TaW1wbGljaXR5ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJHZW5lcmljIHR5cGUgJyNuYW1lJyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gdGhlIGJvdW5kcyBvZiBpdHMgb3duIHR5cGUgdmFyaWFibGVzLiIiIiwKICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHByb3ZpZGluZyB0eXBlIGFyZ3VtZW50cyB0byAnI25hbWUnIGhlcmUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUJvdW5kSXNzdWVWaWFMb29wTm9uU2ltcGxpY2l0eSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigiQm91bmRJc3N1ZVZpYUxvb3BOb25TaW1wbGljaXR5IiwKICAgICAgICB0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFMb29wTm9uU2ltcGxpY2l0eSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0lOU1RBTlRJQVRFRF9CT1VORCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHkoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHksCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJHZW5lcmljIHR5cGUgJyR7bmFtZX0nIGNhbid0IGJlIHVzZWQgd2l0aG91dCB0eXBlIGFyZ3VtZW50cyBpbiB0aGUgYm91bmRzIG9mIGl0cyBvd24gdHlwZSB2YXJpYWJsZXMuIiIiLAogICAgICB0aXA6ICIiIlRyeSBwcm92aWRpbmcgdHlwZSBhcmd1bWVudHMgdG8gJyR7bmFtZX0nIGhlcmUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFSYXdUeXBlV2l0aE5vblNpbXBsZUJvdW5kcyA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiR2VuZXJpYyB0eXBlICcjbmFtZScgY2FuJ3QgYmUgdXNlZCB3aXRob3V0IHR5cGUgYXJndW1lbnRzIGluIGEgdHlwZSB2YXJpYWJsZSBib3VuZC4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIHRvICcjbmFtZScgaGVyZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhUmF3VHlwZVdpdGhOb25TaW1wbGVCb3VuZHMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVCb3VuZElzc3VlVmlhUmF3VHlwZVdpdGhOb25TaW1wbGVCb3VuZHMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkJvdW5kSXNzdWVWaWFSYXdUeXBlV2l0aE5vblNpbXBsZUJvdW5kcyIsCiAgICAgICAgdGVtcGxhdGVCb3VuZElzc3VlVmlhUmF3VHlwZVdpdGhOb25TaW1wbGVCb3VuZHMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9JTlNUQU5USUFURURfQk9VTkQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiR2VuZXJpYyB0eXBlICcke25hbWV9JyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gYSB0eXBlIHZhcmlhYmxlIGJvdW5kLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIHRvICcke25hbWV9JyBoZXJlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUJyZWFrT3V0c2lkZU9mTG9vcCA9IG1lc3NhZ2VCcmVha091dHNpZGVPZkxvb3A7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQnJlYWtPdXRzaWRlT2ZMb29wID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQnJlYWtPdXRzaWRlT2ZMb29wIiwKICAgIGluZGV4OiA1MiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgYnJlYWsgc3RhdGVtZW50IGNhbid0IGJlIHVzZWQgb3V0c2lkZSBvZiBhIGxvb3Agb3Igc3dpdGNoIHN0YXRlbWVudC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGJyZWFrIHN0YXRlbWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUJyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBicmVhayB0byAnI25hbWUnIGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0JyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb24iLCB0ZW1wbGF0ZUJyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJMQUJFTF9JTl9PVVRFUl9TQ09QRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUJyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCBicmVhayB0byAnJHtuYW1lfScgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IHRlbXBsYXRlQnVpbHRJbklkZW50aWZpZXJBc1R5cGUgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSBidWlsdC1pbiBpZGVudGlmaWVyICcjbGV4ZW1lJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZS4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgY29ycmVjdGluZyB0aGUgbmFtZSB0byBtYXRjaCBhbiBleGlzdGluZyB0eXBlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0J1aWx0SW5JZGVudGlmaWVyQXNUeXBlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVCdWlsdEluSWRlbnRpZmllckFzVHlwZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiQnVpbHRJbklkZW50aWZpZXJBc1R5cGUiLCB0ZW1wbGF0ZUJ1aWx0SW5JZGVudGlmaWVyQXNUeXBlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJCVUlMVF9JTl9JREVOVElGSUVSX0FTX1RZUEUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQnVpbHRJbklkZW50aWZpZXJBc1R5cGUoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQnVpbHRJbklkZW50aWZpZXJBc1R5cGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgYnVpbHQtaW4gaWRlbnRpZmllciAnJHtsZXhlbWV9JyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZS4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgdHlwZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPgogICAgdGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNhbid0IHVzZSAnI2xleGVtZScgYXMgYSBuYW1lIGhlcmUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQnVpbHRJbklkZW50aWZpZXJJbkRlY2xhcmF0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oIkJ1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbiIsCiAgICAgICAgdGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkJVSUxUX0lOX0lERU5USUZJRVJfSU5fREVDTEFSQVRJT04iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQnVpbHRJbklkZW50aWZpZXJJbkRlY2xhcmF0aW9uKFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUJ1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbiwKICAgICAgbWVzc2FnZTogIiIiQ2FuJ3QgdXNlICcke2xleGVtZX0nIGFzIGEgbmFtZSBoZXJlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQnl0ZWNvZGVMaW1pdEV4Y2VlZGVkVG9vTWFueUFyZ3VtZW50cyA9CiAgICBtZXNzYWdlQnl0ZWNvZGVMaW1pdEV4Y2VlZGVkVG9vTWFueUFyZ3VtZW50czsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VCeXRlY29kZUxpbWl0RXhjZWVkZWRUb29NYW55QXJndW1lbnRzID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJCeXRlY29kZUxpbWl0RXhjZWVkZWRUb29NYW55QXJndW1lbnRzIiwKICAgICAgICBtZXNzYWdlOiByIiIiRGFydCBieXRlY29kZSBsaW1pdCBleGNlZWRlZDogdG9vIG1hbnkgYXJndW1lbnRzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDYW5kaWRhdGVGb3VuZCA9IG1lc3NhZ2VDYW5kaWRhdGVGb3VuZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDYW5kaWRhdGVGb3VuZCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJDYW5kaWRhdGVGb3VuZCIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwKICAgIG1lc3NhZ2U6IHIiIiJGb3VuZCB0aGlzIGNhbmRpZGF0ZSwgYnV0IHRoZSBhcmd1bWVudHMgZG9uJ3QgbWF0Y2guIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVDYW5kaWRhdGVGb3VuZElzRGVmYXVsdENvbnN0cnVjdG9yID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGUgY2xhc3MgJyNuYW1lJyBoYXMgYSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDYW5kaWRhdGVGb3VuZElzRGVmYXVsdENvbnN0cnVjdG9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICBjb2RlQ2FuZGlkYXRlRm91bmRJc0RlZmF1bHRDb25zdHJ1Y3RvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ2FuZGlkYXRlRm91bmRJc0RlZmF1bHRDb25zdHJ1Y3RvciIsCiAgICAgICAgdGVtcGxhdGVDYW5kaWRhdGVGb3VuZElzRGVmYXVsdENvbnN0cnVjdG9yLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDYW5kaWRhdGVGb3VuZElzRGVmYXVsdENvbnN0cnVjdG9yKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ2FuZGlkYXRlRm91bmRJc0RlZmF1bHRDb25zdHJ1Y3RvciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBjbGFzcyAnJHtuYW1lfScgaGFzIGEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ2Fubm90QXNzaWduVG9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA9CiAgICBtZXNzYWdlQ2Fubm90QXNzaWduVG9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDYW5ub3RBc3NpZ25Ub1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJDYW5ub3RBc3NpZ25Ub1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uIiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQVNTSUdOTUVOVF9UT19QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04iXSwKICAgICAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgYXNzaWduIHRvIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDYW5ub3RBc3NpZ25Ub1N1cGVyID0gbWVzc2FnZUNhbm5vdEFzc2lnblRvU3VwZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ2Fubm90QXNzaWduVG9TdXBlciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNhbm5vdEFzc2lnblRvU3VwZXIiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9BTl9MVkFMVUUiXSwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCBhc3NpZ24gdG8gc3VwZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICB0ZW1wbGF0ZUNhbm5vdFJlYWRTZGtTcGVjaWZpY2F0aW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlVuYWJsZSB0byByZWFkIHRoZSAnbGlicmFyaWVzLmpzb24nIHNwZWNpZmljYXRpb24gZmlsZToKICAjc3RyaW5nLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0Nhbm5vdFJlYWRTZGtTcGVjaWZpY2F0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZUNhbm5vdFJlYWRTZGtTcGVjaWZpY2F0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgIkNhbm5vdFJlYWRTZGtTcGVjaWZpY2F0aW9uIiwKICB0ZW1wbGF0ZUNhbm5vdFJlYWRTZGtTcGVjaWZpY2F0aW9uLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0Nhbm5vdFJlYWRTZGtTcGVjaWZpY2F0aW9uKFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ2Fubm90UmVhZFNka1NwZWNpZmljYXRpb24sCiAgICAgIG1lc3NhZ2U6ICIiIlVuYWJsZSB0byByZWFkIHRoZSAnbGlicmFyaWVzLmpzb24nIHNwZWNpZmljYXRpb24gZmlsZToKICAke3N0cmluZ30uIiIiLCBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNhbnREaXNhbWJpZ3VhdGVBbWJpZ3VvdXNJbmZvcm1hdGlvbiA9CiAgICBtZXNzYWdlQ2FudERpc2FtYmlndWF0ZUFtYmlndW91c0luZm9ybWF0aW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNhbnREaXNhbWJpZ3VhdGVBbWJpZ3VvdXNJbmZvcm1hdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNhbnREaXNhbWJpZ3VhdGVBbWJpZ3VvdXNJbmZvcm1hdGlvbiIsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJCb3RoIEl0ZXJhYmxlIGFuZCBNYXAgc3ByZWFkIGVsZW1lbnRzIGVuY291bnRlcmVkIGluIGFtYmlndW91cyBsaXRlcmFsLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDYW50RGlzYW1iaWd1YXRlTm90RW5vdWdoSW5mb3JtYXRpb24gPQogICAgbWVzc2FnZUNhbnREaXNhbWJpZ3VhdGVOb3RFbm91Z2hJbmZvcm1hdGlvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDYW50RGlzYW1iaWd1YXRlTm90RW5vdWdoSW5mb3JtYXRpb24gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDYW50RGlzYW1iaWd1YXRlTm90RW5vdWdoSW5mb3JtYXRpb24iLAogICAgbWVzc2FnZToKICAgICAgICByIiIiTm90IGVub3VnaCB0eXBlIGluZm9ybWF0aW9uIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIGxpdGVyYWwgc2V0IGFuZCBsaXRlcmFsIG1hcC4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSBwcm92aWRpbmcgdHlwZSBhcmd1bWVudHMgZm9yIHRoZSBsaXRlcmFsIGV4cGxpY2l0bHkgdG8gZGlzYW1iaWd1YXRlIGl0LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDYW50SW5mZXJQYWNrYWdlc0Zyb21NYW55SW5wdXRzID0KICAgIG1lc3NhZ2VDYW50SW5mZXJQYWNrYWdlc0Zyb21NYW55SW5wdXRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNhbnRJbmZlclBhY2thZ2VzRnJvbU1hbnlJbnB1dHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDYW50SW5mZXJQYWNrYWdlc0Zyb21NYW55SW5wdXRzIiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkNhbid0IGluZmVyIGEgLnBhY2thZ2VzIGZpbGUgd2hlbiBjb21waWxpbmcgbXVsdGlwbGUgaW5wdXRzLiIiIiwKICAgIHRpcDogciIiIlRyeSBzcGVjaWZ5aW5nIHRoZSBmaWxlIGV4cGxpY2l0bHkgd2l0aCB0aGUgLS1wYWNrYWdlcyBvcHRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNhbnRJbmZlclBhY2thZ2VzRnJvbVBhY2thZ2VVcmkgPQogICAgbWVzc2FnZUNhbnRJbmZlclBhY2thZ2VzRnJvbVBhY2thZ2VVcmk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ2FudEluZmVyUGFja2FnZXNGcm9tUGFja2FnZVVyaSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNhbnRJbmZlclBhY2thZ2VzRnJvbVBhY2thZ2VVcmkiLAogICAgbWVzc2FnZTogciIiIkNhbid0IGluZmVyIGEgLnBhY2thZ2VzIGZpbGUgZnJvbSBhbiBpbnB1dCAncGFja2FnZToqJyBVUkkuIiIiLAogICAgdGlwOiByIiIiVHJ5IHNwZWNpZnlpbmcgdGhlIGZpbGUgZXhwbGljaXRseSB3aXRoIHRoZSAtLXBhY2thZ2VzIG9wdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUNhbnRJbmZlclJldHVyblR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcyA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQ2FuJ3QgaW5mZXIgYSByZXR1cm4gdHlwZSBmb3IgJyNuYW1lJyBhcyBzb21lIG9mIHRoZSBpbmhlcml0ZWQgbWVtYmVycyBoYXZlIGRpZmZlcmVudCB0eXBlcy4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgYWRkaW5nIGFuIGV4cGxpY2l0IHR5cGUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6CiAgICAgICAgICAgIF93aXRoQXJndW1lbnRzQ2FudEluZmVyUmV0dXJuVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICBjb2RlQ2FudEluZmVyUmV0dXJuVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJDYW50SW5mZXJSZXR1cm5UeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXMiLAogICAgICAgIHRlbXBsYXRlQ2FudEluZmVyUmV0dXJuVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX01FVEhPRF9PVkVSUklERSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDYW50SW5mZXJSZXR1cm5UeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXMoCiAgICBTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNhbnRJbmZlclJldHVyblR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkNhbid0IGluZmVyIGEgcmV0dXJuIHR5cGUgZm9yICcke25hbWV9JyBhcyBzb21lIG9mIHRoZSBpbmhlcml0ZWQgbWVtYmVycyBoYXZlIGRpZmZlcmVudCB0eXBlcy4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IGFkZGluZyBhbiBleHBsaWNpdCB0eXBlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgc3RyaW5nKT4gdGVtcGxhdGVDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDYW4ndCBpbmZlciB0aGUgdHlwZSBvZiAnI3N0cmluZyc6IGNpcmN1bGFyaXR5IGZvdW5kIGR1cmluZyB0eXBlIGluZmVyZW5jZS4iIiIsCiAgICB0aXBUZW1wbGF0ZTogciIiIlNwZWNpZnkgdGhlIHR5cGUgZXhwbGljaXRseS4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZUNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5IiwgdGVtcGxhdGVDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUkVDVVJTSVZFX0NPTVBJTEVfVElNRV9DT05TVEFOVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eShTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgaW5mZXIgdGhlIHR5cGUgb2YgJyR7c3RyaW5nfSc6IGNpcmN1bGFyaXR5IGZvdW5kIGR1cmluZyB0eXBlIGluZmVyZW5jZS4iIiIsCiAgICAgIHRpcDogIiIiU3BlY2lmeSB0aGUgdHlwZSBleHBsaWNpdGx5LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJDYW4ndCBpbmZlciBhIHR5cGUgZm9yICcjbmFtZScgYXMgc29tZSBvZiB0aGUgaW5oZXJpdGVkIG1lbWJlcnMgaGF2ZSBkaWZmZXJlbnQgdHlwZXMuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IGFkZGluZyBhbiBleHBsaWNpdCB0eXBlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUNhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzIiwKICAgICAgICB0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9NRVRIT0RfT1ZFUlJJREUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgaW5mZXIgYSB0eXBlIGZvciAnJHtuYW1lfScgYXMgc29tZSBvZiB0aGUgaW5oZXJpdGVkIG1lbWJlcnMgaGF2ZSBkaWZmZXJlbnQgdHlwZXMuIiIiLAogICAgICB0aXA6ICIiIlRyeSBhZGRpbmcgYW4gZXhwbGljaXQgdHlwZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBTdHJpbmcgc3RyaW5nKT4gdGVtcGxhdGVDYW50UmVhZEZpbGUgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkVycm9yIHdoZW4gcmVhZGluZyAnI3VyaSc6ICNzdHJpbmciIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDYW50UmVhZEZpbGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBTdHJpbmcgc3RyaW5nKT4gY29kZUNhbnRSZWFkRmlsZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiQ2FudFJlYWRGaWxlIiwgdGVtcGxhdGVDYW50UmVhZEZpbGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVSSV9ET0VTX05PVF9FWElTVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDYW50UmVhZEZpbGUoVXJpIHVyaV8sIFN0cmluZyBzdHJpbmcpIHsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ2FudFJlYWRGaWxlLAogICAgICBtZXNzYWdlOiAiIiJFcnJvciB3aGVuIHJlYWRpbmcgJyR7dXJpfSc6ICR7c3RyaW5nfSIiIiwKICAgICAgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV8sICdzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+CiAgICB0ZW1wbGF0ZUNhbnRVc2VDb250cm9sRmxvd09yU3ByZWFkQXNDb25zdGFudCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiJyNsZXhlbWUnIGlzIG5vdCBzdXBwb3J0ZWQgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ2FudFVzZUNvbnRyb2xGbG93T3JTcHJlYWRBc0NvbnN0YW50KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+CiAgICBjb2RlQ2FudFVzZUNvbnRyb2xGbG93T3JTcHJlYWRBc0NvbnN0YW50ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJDYW50VXNlQ29udHJvbEZsb3dPclNwcmVhZEFzQ29uc3RhbnQiLAogICAgICAgIHRlbXBsYXRlQ2FudFVzZUNvbnRyb2xGbG93T3JTcHJlYWRBc0NvbnN0YW50LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOT1RfQ09OU1RBTlRfRVhQUkVTU0lPTiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDYW50VXNlQ29udHJvbEZsb3dPclNwcmVhZEFzQ29uc3RhbnQoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ2FudFVzZUNvbnRyb2xGbG93T3JTcHJlYWRBc0NvbnN0YW50LAogICAgICBtZXNzYWdlOiAiIiInJHtsZXhlbWV9JyBpcyBub3Qgc3VwcG9ydGVkIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFRva2VuCiAgICAgICAgICAgIHRva2VuKT4gdGVtcGxhdGVDYW50VXNlRGVmZXJyZWRQcmVmaXhBc0NvbnN0YW50ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiInI2xleGVtZScgY2FuJ3QgYmUgdXNlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24gYmVjYXVzZSBpdCdzIG1hcmtlZCBhcyAnZGVmZXJyZWQnIHdoaWNoIG1lYW5zIGl0IGlzbid0IGF2YWlsYWJsZSB1bnRpbCBsb2FkZWQuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBtb3ZpbmcgdGhlIGNvbnN0YW50IGZyb20gdGhlIGRlZmVycmVkIGxpYnJhcnksIG9yIHJlbW92aW5nICdkZWZlcnJlZCcgZnJvbSB0aGUgaW1wb3J0LgoiIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NhbnRVc2VEZWZlcnJlZFByZWZpeEFzQ29uc3RhbnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZUNhbnRVc2VEZWZlcnJlZFByZWZpeEFzQ29uc3RhbnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oIkNhbnRVc2VEZWZlcnJlZFByZWZpeEFzQ29uc3RhbnQiLAogICAgICAgIHRlbXBsYXRlQ2FudFVzZURlZmVycmVkUHJlZml4QXNDb25zdGFudCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfREVGRVJSRURfQ0xBU1MiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ2FudFVzZURlZmVycmVkUHJlZml4QXNDb25zdGFudChUb2tlbiB0b2tlbikgewogIFN0cmluZyBsZXhlbWUgPSB0b2tlbi5sZXhlbWU7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDYW50VXNlRGVmZXJyZWRQcmVmaXhBc0NvbnN0YW50LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiJyR7bGV4ZW1lfScgY2FuJ3QgYmUgdXNlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24gYmVjYXVzZSBpdCdzIG1hcmtlZCBhcyAnZGVmZXJyZWQnIHdoaWNoIG1lYW5zIGl0IGlzbid0IGF2YWlsYWJsZSB1bnRpbCBsb2FkZWQuIiIiLAogICAgICB0aXA6ICIiIlRyeSBtb3ZpbmcgdGhlIGNvbnN0YW50IGZyb20gdGhlIGRlZmVycmVkIGxpYnJhcnksIG9yIHJlbW92aW5nICdkZWZlcnJlZCcgZnJvbSB0aGUgaW1wb3J0LgoiIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNhbnRVc2VQcmVmaXhBc0V4cHJlc3Npb24gPQogICAgbWVzc2FnZUNhbnRVc2VQcmVmaXhBc0V4cHJlc3Npb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ2FudFVzZVByZWZpeEFzRXhwcmVzc2lvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNhbnRVc2VQcmVmaXhBc0V4cHJlc3Npb24iLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlBSRUZJWF9JREVOVElGSUVSX05PVF9GT0xMT1dFRF9CWV9ET1QiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIHByZWZpeCBjYW4ndCBiZSB1c2VkIGFzIGFuIGV4cHJlc3Npb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNhbnRVc2VQcmVmaXhXaXRoTnVsbEF3YXJlID0KICAgIG1lc3NhZ2VDYW50VXNlUHJlZml4V2l0aE51bGxBd2FyZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDYW50VXNlUHJlZml4V2l0aE51bGxBd2FyZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNhbnRVc2VQcmVmaXhXaXRoTnVsbEF3YXJlIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJQUkVGSVhfSURFTlRJRklFUl9OT1RfRk9MTE9XRURfQllfRE9UIl0sCiAgICBtZXNzYWdlOiByIiIiQSBwcmVmaXggY2FuJ3QgYmUgdXNlZCB3aXRoIG51bGwtYXdhcmUgb3BlcmF0b3JzLiIiIiwKICAgIHRpcDogciIiIkl0IHNob3VsZCBiZSBzYWZlIHRvIHJlbW92ZSB0aGUgJz8nIGFzIGEgcHJlZml4IGlzIG5ldmVyIG51bGwuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNhdGNoU3ludGF4ID0gbWVzc2FnZUNhdGNoU3ludGF4OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNhdGNoU3ludGF4ID0gY29uc3QgTWVzc2FnZUNvZGUoIkNhdGNoU3ludGF4IiwKICAgIGluZGV4OiA4NCwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIidjYXRjaCcgbXVzdCBiZSBmb2xsb3dlZCBieSAnKGlkZW50aWZpZXIpJyBvciAnKGlkZW50aWZpZXIsIGlkZW50aWZpZXIpJy4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIk5vIHR5cGVzIGFyZSBuZWVkZWQsIHRoZSBmaXJzdCBpcyBnaXZlbiBieSAnb24nLCB0aGUgc2Vjb25kIGlzIGFsd2F5cyAnU3RhY2tUcmFjZScuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNhdGNoU3ludGF4RXh0cmFQYXJhbWV0ZXJzID0KICAgIG1lc3NhZ2VDYXRjaFN5bnRheEV4dHJhUGFyYW1ldGVyczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDYXRjaFN5bnRheEV4dHJhUGFyYW1ldGVycyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNhdGNoU3ludGF4RXh0cmFQYXJhbWV0ZXJzIiwKICAgIGluZGV4OiA4MywKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIidjYXRjaCcgbXVzdCBiZSBmb2xsb3dlZCBieSAnKGlkZW50aWZpZXIpJyBvciAnKGlkZW50aWZpZXIsIGlkZW50aWZpZXIpJy4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIk5vIHR5cGVzIGFyZSBuZWVkZWQsIHRoZSBmaXJzdCBpcyBnaXZlbiBieSAnb24nLCB0aGUgc2Vjb25kIGlzIGFsd2F5cyAnU3RhY2tUcmFjZScuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNsYXNzSW5DbGFzcyA9IG1lc3NhZ2VDbGFzc0luQ2xhc3M7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ2xhc3NJbkNsYXNzID0gY29uc3QgTWVzc2FnZUNvZGUoIkNsYXNzSW5DbGFzcyIsCiAgICBpbmRleDogNTMsCiAgICBtZXNzYWdlOiByIiIiQ2xhc3NlcyBjYW4ndCBiZSBkZWNsYXJlZCBpbnNpZGUgb3RoZXIgY2xhc3Nlcy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgbW92aW5nIHRoZSBjbGFzcyB0byB0aGUgdG9wLWxldmVsLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb2xvbkluUGxhY2VPZkluID0gbWVzc2FnZUNvbG9uSW5QbGFjZU9mSW47CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29sb25JblBsYWNlT2ZJbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbG9uSW5QbGFjZU9mSW4iLAogICAgaW5kZXg6IDU0LAogICAgbWVzc2FnZTogciIiIkZvci1pbiBsb29wcyB1c2UgJ2luJyByYXRoZXIgdGhhbiBhIGNvbG9uLiIiIiwKICAgIHRpcDogciIiIlRyeSByZXBsYWNpbmcgdGhlIGNvbG9uIHdpdGggdGhlIGtleXdvcmQgJ2luJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lMik+IHRlbXBsYXRlQ29tYmluZWRNZW1iZXJTaWduYXR1cmVGYWlsZWQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQ2xhc3MgJyNuYW1lJyBpbmhlcml0cyBtdWx0aXBsZSBtZW1iZXJzIG5hbWVkICcjbmFtZTInIHdpdGggaW5jb21wYXRpYmxlIHNpZ25hdHVyZXMuIiIiLAogICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgYWRkaW5nIGEgZGVjbGFyYXRpb24gb2YgJyNuYW1lMicgdG8gJyNuYW1lJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbWJpbmVkTWVtYmVyU2lnbmF0dXJlRmFpbGVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVDb21iaW5lZE1lbWJlclNpZ25hdHVyZUZhaWxlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJDb21iaW5lZE1lbWJlclNpZ25hdHVyZUZhaWxlZCIsIHRlbXBsYXRlQ29tYmluZWRNZW1iZXJTaWduYXR1cmVGYWlsZWQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOQ09OU0lTVEVOVF9JTkhFUklUQU5DRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb21iaW5lZE1lbWJlclNpZ25hdHVyZUZhaWxlZChTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlRmFpbGVkLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2xhc3MgJyR7bmFtZX0nIGluaGVyaXRzIG11bHRpcGxlIG1lbWJlcnMgbmFtZWQgJyR7bmFtZTJ9JyB3aXRoIGluY29tcGF0aWJsZSBzaWduYXR1cmVzLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgYWRkaW5nIGEgZGVjbGFyYXRpb24gb2YgJyR7bmFtZTJ9JyB0byAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgc3RyaW5nLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBzdHJpbmcyKT4gdGVtcGxhdGVDb25mbGljdGluZ01vZGlmaWVycyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiTWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICcjc3RyaW5nJyBhbmQgJyNzdHJpbmcyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSByZW1vdmluZyBvbmUgb2YgdGhlIGtleXdvcmRzLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uZmxpY3RpbmdNb2RpZmllcnMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4KICAgIGNvZGVDb25mbGljdGluZ01vZGlmaWVycyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPigKICAgICAgICAiQ29uZmxpY3RpbmdNb2RpZmllcnMiLCB0ZW1wbGF0ZUNvbmZsaWN0aW5nTW9kaWZpZXJzLAogICAgICAgIGluZGV4OiA1OSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uZmxpY3RpbmdNb2RpZmllcnMoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChzdHJpbmcyLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uZmxpY3RpbmdNb2RpZmllcnMsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJNZW1iZXJzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlIGJvdGggJyR7c3RyaW5nfScgYW5kICcke3N0cmluZzJ9Jy4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IHJlbW92aW5nIG9uZSBvZiB0aGUga2V5d29yZHMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAnc3RyaW5nMic6IHN0cmluZzJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlQ29uZmxpY3RzV2l0aENvbnN0cnVjdG9yID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDb25mbGljdHMgd2l0aCBjb25zdHJ1Y3RvciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhDb25zdHJ1Y3Rvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ29uZmxpY3RzV2l0aENvbnN0cnVjdG9yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJDb25mbGljdHNXaXRoQ29uc3RydWN0b3IiLCB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhDb25zdHJ1Y3RvciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09ORkxJQ1RTX1dJVEhfQ09OU1RSVUNUT1IiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uZmxpY3RzV2l0aENvbnN0cnVjdG9yKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uZmxpY3RzV2l0aENvbnN0cnVjdG9yLAogICAgICBtZXNzYWdlOiAiIiJDb25mbGljdHMgd2l0aCBjb25zdHJ1Y3RvciAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlQ29uZmxpY3RzV2l0aEZhY3RvcnkgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvbmZsaWN0cyB3aXRoIGZhY3RvcnkgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoRmFjdG9yeSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ29uZmxpY3RzV2l0aEZhY3RvcnkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIkNvbmZsaWN0c1dpdGhGYWN0b3J5IiwKICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhGYWN0b3J5LAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhGYWN0b3J5KFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uZmxpY3RzV2l0aEZhY3RvcnksCiAgICAgIG1lc3NhZ2U6ICIiIkNvbmZsaWN0cyB3aXRoIGZhY3RvcnkgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvbmZsaWN0cyB3aXRoIG1lbWJlciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhNZW1iZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUNvbmZsaWN0c1dpdGhNZW1iZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkNvbmZsaWN0c1dpdGhNZW1iZXIiLCB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTkZMSUNUU19XSVRIX01FTUJFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoTWVtYmVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uZmxpY3RzV2l0aE1lbWJlciwKICAgICAgbWVzc2FnZTogIiIiQ29uZmxpY3RzIHdpdGggbWVtYmVyICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aE1lbWJlcldhcm5pbmcgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvbmZsaWN0cyB3aXRoIG1lbWJlciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhNZW1iZXJXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVDb25mbGljdHNXaXRoTWVtYmVyV2FybmluZyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ29uZmxpY3RzV2l0aE1lbWJlcldhcm5pbmciLCB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXJXYXJuaW5nLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05GTElDVFNfV0lUSF9NRU1CRVIiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoTWVtYmVyV2FybmluZyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbmZsaWN0c1dpdGhNZW1iZXJXYXJuaW5nLAogICAgICBtZXNzYWdlOiAiIiJDb25mbGljdHMgd2l0aCBtZW1iZXIgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvbmZsaWN0cyB3aXRoIHNldHRlciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhTZXR0ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUNvbmZsaWN0c1dpdGhTZXR0ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkNvbmZsaWN0c1dpdGhTZXR0ZXIiLCB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTkZMSUNUU19XSVRIX01FTUJFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoU2V0dGVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uZmxpY3RzV2l0aFNldHRlciwKICAgICAgbWVzc2FnZTogIiIiQ29uZmxpY3RzIHdpdGggc2V0dGVyICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aFNldHRlcldhcm5pbmcgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvbmZsaWN0cyB3aXRoIHNldHRlciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhTZXR0ZXJXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVDb25mbGljdHNXaXRoU2V0dGVyV2FybmluZyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ29uZmxpY3RzV2l0aFNldHRlcldhcm5pbmciLCB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXJXYXJuaW5nLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05GTElDVFNfV0lUSF9NRU1CRVIiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoU2V0dGVyV2FybmluZyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbmZsaWN0c1dpdGhTZXR0ZXJXYXJuaW5nLAogICAgICBtZXNzYWdlOiAiIiJDb25mbGljdHMgd2l0aCBzZXR0ZXIgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDb25mbGljdHMgd2l0aCB0eXBlIHZhcmlhYmxlICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZSIsIHRlbXBsYXRlQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09ORkxJQ1RJTkdfVFlQRV9WQVJJQUJMRV9BTkRfTUVNQkVSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlLAogICAgICBtZXNzYWdlOiAiIiJDb25mbGljdHMgd2l0aCB0eXBlIHZhcmlhYmxlICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ2F1c2UgPQogICAgbWVzc2FnZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGVDYXVzZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ2F1c2UgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ2F1c2UiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOiByIiIiVGhpcyBpcyB0aGUgdHlwZSB2YXJpYWJsZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RBbmRGaW5hbCA9IG1lc3NhZ2VDb25zdEFuZEZpbmFsOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0QW5kRmluYWwgPSBjb25zdCBNZXNzYWdlQ29kZSgiQ29uc3RBbmRGaW5hbCIsCiAgICBpbmRleDogNTgsCiAgICBtZXNzYWdlOiByIiIiTWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdjb25zdCcgYW5kICdmaW5hbCcuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIGVpdGhlciB0aGUgJ2NvbnN0JyBvciAnZmluYWwnIGtleXdvcmQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0Q2xhc3MgPSBtZXNzYWdlQ29uc3RDbGFzczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdENsYXNzID0gY29uc3QgTWVzc2FnZUNvZGUoIkNvbnN0Q2xhc3MiLAogICAgaW5kZXg6IDYwLAogICAgbWVzc2FnZTogciIiIkNsYXNzZXMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2NvbnN0Jy4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgJ2NvbnN0JyBrZXl3b3JkLiBJZiB5b3UncmUgdHJ5aW5nIHRvIGluZGljYXRlIHRoYXQgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBjYW4gYmUgY29uc3RhbnRzLCBwbGFjZSB0aGUgJ2NvbnN0JyBrZXl3b3JkIG9uICB0aGUgY2xhc3MnIGNvbnN0cnVjdG9yKHMpLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZCA9CiAgICBtZXNzYWdlQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfQ09OU1RSVUNUT1JfV0lUSF9OT05fRklOQUxfRklFTEQiXSwKICAgIG1lc3NhZ2U6IHIiIiJDb25zdHJ1Y3RvciBpcyBtYXJrZWQgJ2NvbnN0JyBzbyBhbGwgZmllbGRzIG11c3QgYmUgZmluYWwuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkQ2F1c2UgPQogICAgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkQ2F1c2U7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGRDYXVzZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkQ2F1c2UiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOiByIiIiRmllbGQgaXNuJ3QgZmluYWwsIGJ1dCBjb25zdHJ1Y3RvciBpcyAnY29uc3QnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdENvbnN0cnVjdG9yUmVkaXJlY3Rpb25Ub05vbkNvbnN0ID0KICAgIG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yUmVkaXJlY3Rpb25Ub05vbkNvbnN0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JSZWRpcmVjdGlvblRvTm9uQ29uc3QgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkNvbnN0Q29uc3RydWN0b3JSZWRpcmVjdGlvblRvTm9uQ29uc3QiLAogICAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAgIHIiIiJBIGNvbnN0YW50IGNvbnN0cnVjdG9yIGNhbid0IGNhbGwgYSBub24tY29uc3RhbnQgY29uc3RydWN0b3IuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0Q29uc3RydWN0b3JXaXRoQm9keSA9IG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yV2l0aEJvZHk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvcldpdGhCb2R5ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RDb25zdHJ1Y3RvcldpdGhCb2R5IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05TVF9DT05TVFJVQ1RPUl9XSVRIX0JPRFkiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIGNvbnN0IGNvbnN0cnVjdG9yIGNhbid0IGhhdmUgYSBib2R5LiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyBlaXRoZXIgdGhlICdjb25zdCcga2V5d29yZCBvciB0aGUgYm9keS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RDb25zdHJ1Y3RvcldpdGhOb25Db25zdFN1cGVyID0KICAgIG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yV2l0aE5vbkNvbnN0U3VwZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvcldpdGhOb25Db25zdFN1cGVyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RDb25zdHJ1Y3RvcldpdGhOb25Db25zdFN1cGVyIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05TVF9DT05TVFJVQ1RPUl9XSVRIX05PTl9DT05TVF9TVVBFUiJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQ29uc3RhbnQgY29uc3RydWN0b3IgY2FuJ3QgY2FsbCBub24tY29uc3RhbnQgc3VwZXIgY29uc3RydWN0b3JzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdEV2YWxDaXJjdWxhcml0eSA9IG1lc3NhZ2VDb25zdEV2YWxDaXJjdWxhcml0eTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdEV2YWxDaXJjdWxhcml0eSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0RXZhbENpcmN1bGFyaXR5IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJSRUNVUlNJVkVfQ09NUElMRV9USU1FX0NPTlNUQU5UIl0sCiAgICBtZXNzYWdlOiByIiIiQ29uc3RhbnQgZXhwcmVzc2lvbiBkZXBlbmRzIG9uIGl0c2VsZi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RFdmFsQ29udGV4dCA9IG1lc3NhZ2VDb25zdEV2YWxDb250ZXh0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0RXZhbENvbnRleHQgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkNvbnN0RXZhbENvbnRleHQiLCBtZXNzYWdlOiByIiIiV2hpbGUgYW5hbHl6aW5nOiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUNvbnN0RXZhbERlZmVycmVkTGlicmFyeSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiJyNuYW1lJyBjYW4ndCBiZSB1c2VkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBiZWNhdXNlIGl0J3MgbWFya2VkIGFzICdkZWZlcnJlZCcgd2hpY2ggbWVhbnMgaXQgaXNuJ3QgYXZhaWxhYmxlIHVudGlsIGxvYWRlZC4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IG1vdmluZyB0aGUgY29uc3RhbnQgZnJvbSB0aGUgZGVmZXJyZWQgbGlicmFyeSwgb3IgcmVtb3ZpbmcgJ2RlZmVycmVkJyBmcm9tIHRoZSBpbXBvcnQuCiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsRGVmZXJyZWRMaWJyYXJ5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVDb25zdEV2YWxEZWZlcnJlZExpYnJhcnkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkNvbnN0RXZhbERlZmVycmVkTGlicmFyeSIsIHRlbXBsYXRlQ29uc3RFdmFsRGVmZXJyZWRMaWJyYXJ5LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WwogICAgICAiTk9OX0NPTlNUQU5UX0RFRkFVTFRfVkFMVUVfRlJPTV9ERUZFUlJFRF9MSUJSQVJZIgogICAgXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsRGVmZXJyZWRMaWJyYXJ5KFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsRGVmZXJyZWRMaWJyYXJ5LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiJyR7bmFtZX0nIGNhbid0IGJlIHVzZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIGJlY2F1c2UgaXQncyBtYXJrZWQgYXMgJ2RlZmVycmVkJyB3aGljaCBtZWFucyBpdCBpc24ndCBhdmFpbGFibGUgdW50aWwgbG9hZGVkLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgbW92aW5nIHRoZSBjb25zdGFudCBmcm9tIHRoZSBkZWZlcnJlZCBsaWJyYXJ5LCBvciByZW1vdmluZyAnZGVmZXJyZWQnIGZyb20gdGhlIGltcG9ydC4KIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIENvbnN0YW50CiAgICAgICAgICAgIF9jb25zdGFudCk+IHRlbXBsYXRlQ29uc3RFdmFsRHVwbGljYXRlRWxlbWVudCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBlbGVtZW50ICcjY29uc3RhbnQnIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgZXhpc3RpbmcgZWxlbWVudCBpbiB0aGUgc2V0LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsRHVwbGljYXRlRWxlbWVudCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4gY29kZUNvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCk+KAogICAgICAgICJDb25zdEV2YWxEdXBsaWNhdGVFbGVtZW50IiwgdGVtcGxhdGVDb25zdEV2YWxEdXBsaWNhdGVFbGVtZW50LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFUVVBTF9FTEVNRU5UU19JTl9DT05TVF9TRVQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsRHVwbGljYXRlRWxlbWVudChDb25zdGFudCBfY29uc3RhbnQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IGNvbnN0YW50UGFydHMgPSBsYWJlbGVyLmxhYmVsQ29uc3RhbnQoX2NvbnN0YW50KTsKICBTdHJpbmcgY29uc3RhbnQgPSBjb25zdGFudFBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgZWxlbWVudCAnJHtjb25zdGFudH0nIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgZXhpc3RpbmcgZWxlbWVudCBpbiB0aGUgc2V0LiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J2NvbnN0YW50JzogX2NvbnN0YW50fSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBDb25zdGFudAogICAgICAgICAgICBfY29uc3RhbnQpPiB0ZW1wbGF0ZUNvbnN0RXZhbER1cGxpY2F0ZUtleSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBrZXkgJyNjb25zdGFudCcgY29uZmxpY3RzIHdpdGggYW5vdGhlciBleGlzdGluZyBrZXkgaW4gdGhlIG1hcC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbER1cGxpY2F0ZUtleSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4gY29kZUNvbnN0RXZhbER1cGxpY2F0ZUtleSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4oCiAgICAgICAgIkNvbnN0RXZhbER1cGxpY2F0ZUtleSIsIHRlbXBsYXRlQ29uc3RFdmFsRHVwbGljYXRlS2V5LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFUVVBTF9LRVlTX0lOX0NPTlNUX01BUCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEV2YWxEdXBsaWNhdGVLZXkoQ29uc3RhbnQgX2NvbnN0YW50KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiBjb25zdGFudFBhcnRzID0gbGFiZWxlci5sYWJlbENvbnN0YW50KF9jb25zdGFudCk7CiAgU3RyaW5nIGNvbnN0YW50ID0gY29uc3RhbnRQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxEdXBsaWNhdGVLZXksCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUga2V5ICcke2NvbnN0YW50fScgY29uZmxpY3RzIHdpdGggYW5vdGhlciBleGlzdGluZyBrZXkgaW4gdGhlIG1hcC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeydjb25zdGFudCc6IF9jb25zdGFudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgQ29uc3RhbnQKICAgICAgICAgICAgX2NvbnN0YW50KT4gdGVtcGxhdGVDb25zdEV2YWxFbGVtZW50SW1wbGVtZW50c0VxdWFsID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIGVsZW1lbnQgJyNjb25zdGFudCcgZG9lcyBub3QgaGF2ZSBhIHByaW1pdGl2ZSBvcGVyYXRvciAnPT0nLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4KICAgIGNvZGVDb25zdEV2YWxFbGVtZW50SW1wbGVtZW50c0VxdWFsID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQpPigKICAgICAgICAiQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbCIsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxFbGVtZW50SW1wbGVtZW50c0VxdWFsLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05TVF9TRVRfRUxFTUVOVF9UWVBFX0lNUExFTUVOVFNfRVFVQUxTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEVsZW1lbnRJbXBsZW1lbnRzRXF1YWwoQ29uc3RhbnQgX2NvbnN0YW50KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiBjb25zdGFudFBhcnRzID0gbGFiZWxlci5sYWJlbENvbnN0YW50KF9jb25zdGFudCk7CiAgU3RyaW5nIGNvbnN0YW50ID0gY29uc3RhbnRQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxFbGVtZW50SW1wbGVtZW50c0VxdWFsLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGVsZW1lbnQgJyR7Y29uc3RhbnR9JyBkb2VzIG5vdCBoYXZlIGEgcHJpbWl0aXZlIG9wZXJhdG9yICc9PScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnY29uc3RhbnQnOiBfY29uc3RhbnR9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uID0gbWVzc2FnZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdEV2YWxGYWlsZWRBc3NlcnRpb24gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdEV2YWxGYWlsZWRBc3NlcnRpb24iLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0VWQUxfVEhST1dTX0VYQ0VQVElPTiJdLAogICAgbWVzc2FnZTogciIiIlRoaXMgYXNzZXJ0aW9uIGZhaWxlZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4KICAgIHRlbXBsYXRlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uV2l0aE1lc3NhZ2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVGhpcyBhc3NlcnRpb24gZmFpbGVkIHdpdGggbWVzc2FnZTogI3N0cmluZyIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEZhaWxlZEFzc2VydGlvbldpdGhNZXNzYWdlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4KICAgIGNvZGVDb25zdEV2YWxGYWlsZWRBc3NlcnRpb25XaXRoTWVzc2FnZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJDb25zdEV2YWxGYWlsZWRBc3NlcnRpb25XaXRoTWVzc2FnZSIsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxGYWlsZWRBc3NlcnRpb25XaXRoTWVzc2FnZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfRVZBTF9USFJPV1NfRVhDRVBUSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEZhaWxlZEFzc2VydGlvbldpdGhNZXNzYWdlKFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uV2l0aE1lc3NhZ2UsCiAgICAgIG1lc3NhZ2U6ICIiIlRoaXMgYXNzZXJ0aW9uIGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7c3RyaW5nfSIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUpPiB0ZW1wbGF0ZUNvbnN0RXZhbEZyZWVUeXBlUGFyYW1ldGVyID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgdHlwZSAnI3R5cGUnIGlzIG5vdCBhIGNvbnN0YW50IGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIHR5cGUgcGFyYW1ldGVyLCBvbmx5IGluc3RhbnRpYXRlZCB0eXBlcyBhcmUgYWxsb3dlZC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEZyZWVUeXBlUGFyYW1ldGVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSk+IGNvZGVDb25zdEV2YWxGcmVlVHlwZVBhcmFtZXRlciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUpPigKICAiQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXIiLAogIHRlbXBsYXRlQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXIsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXIoRGFydFR5cGUgX3R5cGUpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxGcmVlVHlwZVBhcmFtZXRlciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSB0eXBlICcke3R5cGV9JyBpcyBub3QgYSBjb25zdGFudCBiZWNhdXNlIGl0IGRlcGVuZHMgb24gYSB0eXBlIHBhcmFtZXRlciwgb25seSBpbnN0YW50aWF0ZWQgdHlwZXMgYXJlIGFsbG93ZWQuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgc3RyaW5nLAogICAgICAgIENvbnN0YW50IF9jb25zdGFudCwKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRCaW5hcnlPcGVyYW5kVHlwZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkJpbmFyeSBvcGVyYXRvciAnI3N0cmluZycgb24gJyNjb25zdGFudCcgcmVxdWlyZXMgb3BlcmFuZCBvZiB0eXBlICcjdHlwZScsIGJ1dCB3YXMgb2YgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRCaW5hcnlPcGVyYW5kVHlwZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBDb25zdGFudCBfY29uc3RhbnQsIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlIF90eXBlMik+IGNvZGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUgPSBjb25zdCBDb2RlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgc3RyaW5nLCBDb25zdGFudCBfY29uc3RhbnQsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAiQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlIiwKICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRCaW5hcnlPcGVyYW5kVHlwZSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUoCiAgICBTdHJpbmcgc3RyaW5nLCBDb25zdGFudCBfY29uc3RhbnQsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gY29uc3RhbnRQYXJ0cyA9IGxhYmVsZXIubGFiZWxDb25zdGFudChfY29uc3RhbnQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyBjb25zdGFudCA9IGNvbnN0YW50UGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbEludmFsaWRCaW5hcnlPcGVyYW5kVHlwZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkJpbmFyeSBvcGVyYXRvciAnJHtzdHJpbmd9JyBvbiAnJHtjb25zdGFudH0nIHJlcXVpcmVzIG9wZXJhbmQgb2YgdHlwZSAnJHt0eXBlfScsIGJ1dCB3YXMgb2YgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7CiAgICAgICAgJ3N0cmluZyc6IHN0cmluZywKICAgICAgICAnY29uc3RhbnQnOiBfY29uc3RhbnQsCiAgICAgICAgJ3R5cGUnOiBfdHlwZSwKICAgICAgICAndHlwZTInOiBfdHlwZTIKICAgICAgfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBDb25zdGFudCBfY29uc3RhbnQsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUpPiB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJCaW5hcnkgb3BlcmF0b3IgJz09JyByZXF1aXJlcyByZWNlaXZlciBjb25zdGFudCAnI2NvbnN0YW50JyBvZiB0eXBlICdOdWxsJywgJ2Jvb2wnLCAnaW50JywgJ2RvdWJsZScsIG9yICdTdHJpbmcnLCBidXQgd2FzIG9mIHR5cGUgJyN0eXBlJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSk+CiAgICBjb2RlQ29uc3RFdmFsSW52YWxpZEVxdWFsc09wZXJhbmRUeXBlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQsIERhcnRUeXBlIF90eXBlKT4oCiAgIkNvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZSIsCiAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGUsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZEVxdWFsc09wZXJhbmRUeXBlKAogICAgQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gY29uc3RhbnRQYXJ0cyA9IGxhYmVsZXIubGFiZWxDb25zdGFudChfY29uc3RhbnQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIGNvbnN0YW50ID0gY29uc3RhbnRQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsSW52YWxpZEVxdWFsc09wZXJhbmRUeXBlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQmluYXJ5IG9wZXJhdG9yICc9PScgcmVxdWlyZXMgcmVjZWl2ZXIgY29uc3RhbnQgJyR7Y29uc3RhbnR9JyBvZiB0eXBlICdOdWxsJywgJ2Jvb2wnLCAnaW50JywgJ2RvdWJsZScsIG9yICdTdHJpbmcnLCBidXQgd2FzIG9mIHR5cGUgJyR7dHlwZX0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J2NvbnN0YW50JzogX2NvbnN0YW50LCAndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgc3RyaW5nLAogICAgICAgIENvbnN0YW50CiAgICAgICAgICAgIF9jb25zdGFudCk+IHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZE1ldGhvZEludm9jYXRpb24gPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIENvbnN0YW50IF9jb25zdGFudCk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbWV0aG9kICcjc3RyaW5nJyBjYW4ndCBiZSBpbnZva2VkIG9uICcjY29uc3RhbnQnIHdpdGhpbiBhIGNvbnN0IGNvbnRleHQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50KT4KICAgIGNvZGVDb25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50KT4oCiAgICAgICAgIkNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uIiwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVTkRFRklORURfT1BFUkFUT1IiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZE1ldGhvZEludm9jYXRpb24oCiAgICBTdHJpbmcgc3RyaW5nLCBDb25zdGFudCBfY29uc3RhbnQpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gY29uc3RhbnRQYXJ0cyA9IGxhYmVsZXIubGFiZWxDb25zdGFudChfY29uc3RhbnQpOwogIFN0cmluZyBjb25zdGFudCA9IGNvbnN0YW50UGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsSW52YWxpZE1ldGhvZEludm9jYXRpb24sCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgbWV0aG9kICcke3N0cmluZ30nIGNhbid0IGJlIGludm9rZWQgb24gJyR7Y29uc3RhbnR9JyB3aXRoaW4gYSBjb25zdCBjb250ZXh0LiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ2NvbnN0YW50JzogX2NvbnN0YW50fSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgc3RyaW5nLAogICAgICAgIENvbnN0YW50CiAgICAgICAgICAgIF9jb25zdGFudCk+IHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFByb3BlcnR5R2V0ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBDb25zdGFudCBfY29uc3RhbnQpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIHByb3BlcnR5ICcjc3RyaW5nJyBjYW4ndCBiZSBhY2Nlc3NlZCBvbiAnI2NvbnN0YW50JyB3aXRoaW4gYSBjb25zdCBjb250ZXh0LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFByb3BlcnR5R2V0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBDb25zdGFudCBfY29uc3RhbnQpPgogICAgY29kZUNvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50KT4oCiAgICAgICAgIkNvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldCIsIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFByb3BlcnR5R2V0LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05TVF9FVkFMX1RIUk9XU19FWENFUFRJT04iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFByb3BlcnR5R2V0KAogICAgU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50KSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IGNvbnN0YW50UGFydHMgPSBsYWJlbGVyLmxhYmVsQ29uc3RhbnQoX2NvbnN0YW50KTsKICBTdHJpbmcgY29uc3RhbnQgPSBjb25zdGFudFBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBwcm9wZXJ0eSAnJHtzdHJpbmd9JyBjYW4ndCBiZSBhY2Nlc3NlZCBvbiAnJHtjb25zdGFudH0nIHdpdGhpbiBhIGNvbnN0IGNvbnRleHQuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAnY29uc3RhbnQnOiBfY29uc3RhbnR9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3RhdGljSW52b2NhdGlvbiA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIGludm9jYXRpb24gb2YgJyNuYW1lJyBpcyBub3QgYWxsb3dlZCB3aXRoaW4gYSBjb25zdCBjb250ZXh0LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUNvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJDb25zdEV2YWxJbnZhbGlkU3RhdGljSW52b2NhdGlvbiIsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3RhdGljSW52b2NhdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfSU5JVElBTElaRURfV0lUSF9OT05fQ09OU1RBTlRfVkFMVUUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb24oU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxJbnZhbGlkU3RhdGljSW52b2NhdGlvbiwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBpbnZvY2F0aW9uIG9mICcke25hbWV9JyBpcyBub3QgYWxsb3dlZCB3aXRoaW4gYSBjb25zdCBjb250ZXh0LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4KICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0cmluZ0ludGVycG9sYXRpb25PcGVyYW5kID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVGhlICcjY29uc3RhbnQnIGNhbid0IGJlIHVzZWQgYXMgcGFydCBvZiBhIHN0cmluZyBpbnRlcnBvbGF0aW9uIHdpdGhpbiBhIGNvbnN0IGNvbnRleHQsIG9ubHkgdmFsdWVzIG9mIHR5cGUgJ251bGwnLCAnYm9vbCcsICdpbnQnLCAnZG91YmxlJywgb3IgJ1N0cmluZycgY2FuIGJlIHVzZWQuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6CiAgICAgICAgICAgIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFN0cmluZ0ludGVycG9sYXRpb25PcGVyYW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQpPgogICAgY29kZUNvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4oCiAgICAgICAgIkNvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZCIsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3RyaW5nSW50ZXJwb2xhdGlvbk9wZXJhbmQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0VWQUxfVFlQRV9CT09MX05VTV9TVFJJTkciXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFN0cmluZ0ludGVycG9sYXRpb25PcGVyYW5kKAogICAgQ29uc3RhbnQgX2NvbnN0YW50KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiBjb25zdGFudFBhcnRzID0gbGFiZWxlci5sYWJlbENvbnN0YW50KF9jb25zdGFudCk7CiAgU3RyaW5nIGNvbnN0YW50ID0gY29uc3RhbnRQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxJbnZhbGlkU3RyaW5nSW50ZXJwb2xhdGlvbk9wZXJhbmQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgJyR7Y29uc3RhbnR9JyBjYW4ndCBiZSB1c2VkIGFzIHBhcnQgb2YgYSBzdHJpbmcgaW50ZXJwb2xhdGlvbiB3aXRoaW4gYSBjb25zdCBjb250ZXh0LCBvbmx5IHZhbHVlcyBvZiB0eXBlICdudWxsJywgJ2Jvb2wnLCAnaW50JywgJ2RvdWJsZScsIG9yICdTdHJpbmcnIGNhbiBiZSB1c2VkLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J2NvbnN0YW50JzogX2NvbnN0YW50fSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBDb25zdGFudAogICAgICAgICAgICBfY29uc3RhbnQpPiB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTeW1ib2xOYW1lID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIHN5bWJvbCBuYW1lIG11c3QgYmUgYSB2YWxpZCBwdWJsaWMgRGFydCBtZW1iZXIgbmFtZSwgcHVibGljIGNvbnN0cnVjdG9yIG5hbWUsIG9yIGxpYnJhcnkgbmFtZSwgb3B0aW9uYWxseSBxdWFsaWZpZWQsIGJ1dCB3YXMgJyNjb25zdGFudCcuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkU3ltYm9sTmFtZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4KICAgIGNvZGVDb25zdEV2YWxJbnZhbGlkU3ltYm9sTmFtZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4oCiAgICAgICAgIkNvbnN0RXZhbEludmFsaWRTeW1ib2xOYW1lIiwgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3ltYm9sTmFtZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfRVZBTF9USFJPV1NfRVhDRVBUSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRTeW1ib2xOYW1lKENvbnN0YW50IF9jb25zdGFudCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gY29uc3RhbnRQYXJ0cyA9IGxhYmVsZXIubGFiZWxDb25zdGFudChfY29uc3RhbnQpOwogIFN0cmluZyBjb25zdGFudCA9IGNvbnN0YW50UGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsSW52YWxpZFN5bWJvbE5hbWUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgc3ltYm9sIG5hbWUgbXVzdCBiZSBhIHZhbGlkIHB1YmxpYyBEYXJ0IG1lbWJlciBuYW1lLCBwdWJsaWMgY29uc3RydWN0b3IgbmFtZSwgb3IgbGlicmFyeSBuYW1lLCBvcHRpb25hbGx5IHF1YWxpZmllZCwgYnV0IHdhcyAnJHtjb25zdGFudH0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J2NvbnN0YW50JzogX2NvbnN0YW50fSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBDb25zdGFudCBfY29uc3RhbnQsCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkVHlwZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkV4cGVjdGVkIGNvbnN0YW50ICcjY29uc3RhbnQnIHRvIGJlIG9mIHR5cGUgJyN0eXBlJywgYnV0IHdhcyBvZiB0eXBlICcjdHlwZTInLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+CiAgICBjb2RlQ29uc3RFdmFsSW52YWxpZFR5cGUgPSBjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgIkNvbnN0RXZhbEludmFsaWRUeXBlIiwKICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRUeXBlLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRUeXBlKAogICAgQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiBjb25zdGFudFBhcnRzID0gbGFiZWxlci5sYWJlbENvbnN0YW50KF9jb25zdGFudCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIGNvbnN0YW50ID0gY29uc3RhbnRQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsSW52YWxpZFR5cGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJFeHBlY3RlZCBjb25zdGFudCAnJHtjb25zdGFudH0nIHRvIGJlIG9mIHR5cGUgJyR7dHlwZX0nLCBidXQgd2FzIG9mIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeydjb25zdGFudCc6IF9jb25zdGFudCwgJ3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4KICAgIHRlbXBsYXRlQ29uc3RFdmFsS2V5SW1wbGVtZW50c0VxdWFsID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVGhlIGtleSAnI2NvbnN0YW50JyBkb2VzIG5vdCBoYXZlIGEgcHJpbWl0aXZlIG9wZXJhdG9yICc9PScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsS2V5SW1wbGVtZW50c0VxdWFsKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQpPgogICAgY29kZUNvbnN0RXZhbEtleUltcGxlbWVudHNFcXVhbCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50KT4oCiAgICAgICAgIkNvbnN0RXZhbEtleUltcGxlbWVudHNFcXVhbCIsIHRlbXBsYXRlQ29uc3RFdmFsS2V5SW1wbGVtZW50c0VxdWFsLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WwogICAgICAiQ09OU1RfTUFQX0tFWV9FWFBSRVNTSU9OX1RZUEVfSU1QTEVNRU5UU19FUVVBTFMiCiAgICBdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEV2YWxLZXlJbXBsZW1lbnRzRXF1YWwoQ29uc3RhbnQgX2NvbnN0YW50KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiBjb25zdGFudFBhcnRzID0gbGFiZWxlci5sYWJlbENvbnN0YW50KF9jb25zdGFudCk7CiAgU3RyaW5nIGNvbnN0YW50ID0gY29uc3RhbnRQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxLZXlJbXBsZW1lbnRzRXF1YWwsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUga2V5ICcke2NvbnN0YW50fScgZG9lcyBub3QgaGF2ZSBhIHByaW1pdGl2ZSBvcGVyYXRvciAnPT0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J2NvbnN0YW50JzogX2NvbnN0YW50fSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgc3RyaW5nLAogICAgICAgIFN0cmluZyBzdHJpbmcyLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBzdHJpbmczKT4gdGVtcGxhdGVDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQmluYXJ5IG9wZXJhdG9yICcjc3RyaW5nJyBvbiAnI3N0cmluZzInIHJlcXVpcmVzIG5vbi1uZWdhdGl2ZSBvcGVyYW5kLCBidXQgd2FzICcjc3RyaW5nMycuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpPgogICAgY29kZUNvbnN0RXZhbE5lZ2F0aXZlU2hpZnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgc3RyaW5nMyk+KAogICJDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0IiwKICB0ZW1wbGF0ZUNvbnN0RXZhbE5lZ2F0aXZlU2hpZnQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsTmVnYXRpdmVTaGlmdCgKICAgIFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgc3RyaW5nMykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgaWYgKHN0cmluZzIuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgaWYgKHN0cmluZzMuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQmluYXJ5IG9wZXJhdG9yICcke3N0cmluZ30nIG9uICcke3N0cmluZzJ9JyByZXF1aXJlcyBub24tbmVnYXRpdmUgb3BlcmFuZCwgYnV0IHdhcyAnJHtzdHJpbmczfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAnc3RyaW5nMic6IHN0cmluZzIsICdzdHJpbmczJzogc3RyaW5nM30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIHN0cmluZyk+IHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkNhbid0IGhhdmUgYSBub24tY29uc3RhbnQgI3N0cmluZyBsaXRlcmFsIHdpdGhpbiBhIGNvbnN0IGNvbnRleHQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxOb25Db25zdGFudExpdGVyYWwpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiBjb2RlQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkNvbnN0RXZhbE5vbkNvbnN0YW50TGl0ZXJhbCIsIHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOT05fQ09OU1RBTlRfREVGQVVMVF9WQUxVRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEV2YWxOb25Db25zdGFudExpdGVyYWwoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxOb25Db25zdGFudExpdGVyYWwsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCBoYXZlIGEgbm9uLWNvbnN0YW50ICR7c3RyaW5nfSBsaXRlcmFsIHdpdGhpbiBhIGNvbnN0IGNvbnRleHQuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgc3RyaW5nKT4gdGVtcGxhdGVDb25zdEV2YWxOb25Db25zdGFudFZhcmlhYmxlR2V0ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSB2YXJpYWJsZSAnI3N0cmluZycgaXMgbm90IGEgY29uc3RhbnQsIG9ubHkgY29uc3RhbnQgZXhwcmVzc2lvbnMgYXJlIGFsbG93ZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxOb25Db25zdGFudFZhcmlhYmxlR2V0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4KICAgIGNvZGVDb25zdEV2YWxOb25Db25zdGFudFZhcmlhYmxlR2V0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkNvbnN0RXZhbE5vbkNvbnN0YW50VmFyaWFibGVHZXQiLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9OX0NPTlNUQU5UX1ZBTFVFX0lOX0lOSVRJQUxJWkVSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbE5vbkNvbnN0YW50VmFyaWFibGVHZXQoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxOb25Db25zdGFudFZhcmlhYmxlR2V0LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHZhcmlhYmxlICcke3N0cmluZ30nIGlzIG5vdCBhIGNvbnN0YW50LCBvbmx5IGNvbnN0YW50IGV4cHJlc3Npb25zIGFyZSBhbGxvd2VkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdEV2YWxOb3RMaXN0T3JTZXRJblNwcmVhZCA9CiAgICBtZXNzYWdlQ29uc3RFdmFsTm90TGlzdE9yU2V0SW5TcHJlYWQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RFdmFsTm90TGlzdE9yU2V0SW5TcHJlYWQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdEV2YWxOb3RMaXN0T3JTZXRJblNwcmVhZCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfU1BSRUFEX0VYUEVDVEVEX0xJU1RfT1JfU0VUIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJPbmx5IGxpc3RzIGFuZCBzZXRzIGNhbiBiZSB1c2VkIGluIHNwcmVhZHMgaW4gY29uc3RhbnQgbGlzdHMgYW5kIHNldHMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0RXZhbE5vdE1hcEluU3ByZWFkID0gbWVzc2FnZUNvbnN0RXZhbE5vdE1hcEluU3ByZWFkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0RXZhbE5vdE1hcEluU3ByZWFkID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RFdmFsTm90TWFwSW5TcHJlYWQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX1NQUkVBRF9FWFBFQ1RFRF9NQVAiXSwKICAgIG1lc3NhZ2U6IHIiIiJPbmx5IG1hcHMgY2FuIGJlIHVzZWQgaW4gc3ByZWFkcyBpbiBjb25zdGFudCBtYXBzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdEV2YWxOdWxsVmFsdWUgPSBtZXNzYWdlQ29uc3RFdmFsTnVsbFZhbHVlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0RXZhbE51bGxWYWx1ZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0RXZhbE51bGxWYWx1ZSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfRVZBTF9USFJPV1NfRVhDRVBUSU9OIl0sCiAgICBtZXNzYWdlOiByIiIiTnVsbCB2YWx1ZSBkdXJpbmcgY29uc3RhbnQgZXZhbHVhdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RFdmFsVW5ldmFsdWF0ZWQgPSBtZXNzYWdlQ29uc3RFdmFsVW5ldmFsdWF0ZWQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RFdmFsVW5ldmFsdWF0ZWQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdEV2YWxVbmV2YWx1YXRlZCIsCiAgICBtZXNzYWdlOiByIiIiQ291bGQgbm90IGV2YWx1YXRlIGNvbnN0YW50IGV4cHJlc3Npb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgc3RyaW5nLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBzdHJpbmcyKT4gdGVtcGxhdGVDb25zdEV2YWxaZXJvRGl2aXNvciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQmluYXJ5IG9wZXJhdG9yICcjc3RyaW5nJyBvbiAnI3N0cmluZzInIHJlcXVpcmVzIG5vbi16ZXJvIGRpdmlzb3IsIGJ1dCBkaXZpc29yIHdhcyAnMCcuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxaZXJvRGl2aXNvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgY29kZUNvbnN0RXZhbFplcm9EaXZpc29yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICAgICAgICJDb25zdEV2YWxaZXJvRGl2aXNvciIsIHRlbXBsYXRlQ29uc3RFdmFsWmVyb0Rpdmlzb3IsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0VWQUxfVEhST1dTX0lEQlpFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbFplcm9EaXZpc29yKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbFplcm9EaXZpc29yLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQmluYXJ5IG9wZXJhdG9yICcke3N0cmluZ30nIG9uICcke3N0cmluZzJ9JyByZXF1aXJlcyBub24temVybyBkaXZpc29yLCBidXQgZGl2aXNvciB3YXMgJzAnLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ3N0cmluZzInOiBzdHJpbmcyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0RmFjdG9yeSA9IG1lc3NhZ2VDb25zdEZhY3Rvcnk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RGYWN0b3J5ID0gY29uc3QgTWVzc2FnZUNvZGUoIkNvbnN0RmFjdG9yeSIsCiAgICBpbmRleDogNjIsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJPbmx5IHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3JzIGNhbiBiZSBkZWNsYXJlZCB0byBiZSAnY29uc3QnLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHJlbW92aW5nIHRoZSAnY29uc3QnIGtleXdvcmQsIG9yIHJlcGxhY2luZyB0aGUgYm9keSB3aXRoICc9JyBmb2xsb3dlZCBieSBhIHZhbGlkIHRhcmdldC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RGYWN0b3J5UmVkaXJlY3Rpb25Ub05vbkNvbnN0ID0KICAgIG1lc3NhZ2VDb25zdEZhY3RvcnlSZWRpcmVjdGlvblRvTm9uQ29uc3Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RGYWN0b3J5UmVkaXJlY3Rpb25Ub05vbkNvbnN0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RGYWN0b3J5UmVkaXJlY3Rpb25Ub05vbkNvbnN0IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJSRURJUkVDVF9UT19OT05fQ09OU1RfQ09OU1RSVUNUT1IiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkNvbnN0YW50IGZhY3RvcnkgY29uc3RydWN0b3IgY2FuJ3QgZGVsZWdhdGUgdG8gYSBub24tY29uc3RhbnQgY29uc3RydWN0b3IuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVkaXJlY3RpbmcgdG8gYSBkaWZmZXJlbnQgY29uc3RydWN0b3Igb3IgbWFya2luZyB0aGUgdGFyZ2V0IGNvbnN0cnVjdG9yICdjb25zdCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlQ29uc3RGaWVsZFdpdGhvdXRJbml0aWFsaXplciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoZSBjb25zdCB2YXJpYWJsZSAnI25hbWUnIG11c3QgYmUgaW5pdGlhbGl6ZWQuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBhZGRpbmcgYW4gaW5pdGlhbGl6ZXIgKCc9IDxleHByZXNzaW9uPicpIHRvIHRoZSBkZWNsYXJhdGlvbi4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUNvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkNvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXIiLCB0ZW1wbGF0ZUNvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX05PVF9JTklUSUFMSVpFRCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEZpZWxkV2l0aG91dEluaXRpYWxpemVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RGaWVsZFdpdGhvdXRJbml0aWFsaXplciwKICAgICAgbWVzc2FnZTogIiIiVGhlIGNvbnN0IHZhcmlhYmxlICcke25hbWV9JyBtdXN0IGJlIGluaXRpYWxpemVkLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGFkZGluZyBhbiBpbml0aWFsaXplciAoJz0gPGV4cHJlc3Npb24+JykgdG8gdGhlIGRlY2xhcmF0aW9uLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0SW5zdGFuY2VGaWVsZCA9IG1lc3NhZ2VDb25zdEluc3RhbmNlRmllbGQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RJbnN0YW5jZUZpZWxkID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RJbnN0YW5jZUZpZWxkIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05TVF9JTlNUQU5DRV9GSUVMRCJdLAogICAgbWVzc2FnZTogciIiIk9ubHkgc3RhdGljIGZpZWxkcyBjYW4gYmUgZGVjbGFyZWQgYXMgY29uc3QuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgdXNpbmcgJ2ZpbmFsJyBpbnN0ZWFkIG9mICdjb25zdCcsIG9yIGFkZGluZyB0aGUga2V5d29yZCAnc3RhdGljJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RNZXRob2QgPSBtZXNzYWdlQ29uc3RNZXRob2Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RNZXRob2QgPSBjb25zdCBNZXNzYWdlQ29kZSgiQ29uc3RNZXRob2QiLAogICAgaW5kZXg6IDYzLAogICAgbWVzc2FnZToKICAgICAgICByIiIiR2V0dGVycywgc2V0dGVycyBhbmQgbWV0aG9kcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnY29uc3QnLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUgJ2NvbnN0JyBrZXl3b3JkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdHJ1Y3RvckN5Y2xpYyA9IG1lc3NhZ2VDb25zdHJ1Y3RvckN5Y2xpYzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdHJ1Y3RvckN5Y2xpYyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0cnVjdG9yQ3ljbGljIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJSRUNVUlNJVkVfQ09OU1RSVUNUT1JfUkVESVJFQ1QiXSwKICAgIG1lc3NhZ2U6IHIiIiJSZWRpcmVjdGluZyBjb25zdHJ1Y3RlcnMgY2FuJ3QgYmUgY3ljbGljLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHRvIGhhdmUgYWxsIGNvbnN0cnVjdG9ycyBldmVudHVhbGx5IHJlZGlyZWN0IHRvIGEgbm9uLXJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVDb25zdHJ1Y3Rvck5vdEZvdW5kID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDb3VsZG4ndCBmaW5kIGNvbnN0cnVjdG9yICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RydWN0b3JOb3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ29uc3RydWN0b3JOb3RGb3VuZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ29uc3RydWN0b3JOb3RGb3VuZCIsIHRlbXBsYXRlQ29uc3RydWN0b3JOb3RGb3VuZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RSVUNUT1JfTk9UX0ZPVU5EIl0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RydWN0b3JOb3RGb3VuZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0cnVjdG9yTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIkNvdWxkbid0IGZpbmQgY29uc3RydWN0b3IgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0cnVjdG9yTm90U3luYyA9IG1lc3NhZ2VDb25zdHJ1Y3Rvck5vdFN5bmM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RydWN0b3JOb3RTeW5jID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RydWN0b3JOb3RTeW5jIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOT05fU1lOQ19DT05TVFJVQ1RPUiJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQ29uc3RydWN0b3IgYm9kaWVzIGNhbid0IHVzZSAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RydWN0b3JXaXRoUmV0dXJuVHlwZSA9CiAgICBtZXNzYWdlQ29uc3RydWN0b3JXaXRoUmV0dXJuVHlwZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhSZXR1cm5UeXBlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RydWN0b3JXaXRoUmV0dXJuVHlwZSIsCiAgICBpbmRleDogNTUsCiAgICBtZXNzYWdlOiByIiIiQ29uc3RydWN0b3JzIGNhbid0IGhhdmUgYSByZXR1cm4gdHlwZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIHJldHVybiB0eXBlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdHJ1Y3RvcldpdGhUeXBlQXJndW1lbnRzID0KICAgIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhUeXBlQXJndW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFR5cGVBcmd1bWVudHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdHJ1Y3RvcldpdGhUeXBlQXJndW1lbnRzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJXUk9OR19OVU1CRVJfT0ZfVFlQRV9BUkdVTUVOVFNfQ09OU1RSVUNUT1IiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgY29uc3RydWN0b3IgaW52b2NhdGlvbiBjYW4ndCBoYXZlIHR5cGUgYXJndW1lbnRzIG9uIHRoZSBjb25zdHJ1Y3RvciBuYW1lLiIiIiwKICAgIHRpcDogciIiIlRyeSB0byBwbGFjZSB0aGUgdHlwZSBhcmd1bWVudHMgb24gdGhlIGNsYXNzIG5hbWUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0cnVjdG9yV2l0aFR5cGVQYXJhbWV0ZXJzID0KICAgIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhUeXBlUGFyYW1ldGVyczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhUeXBlUGFyYW1ldGVycyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0cnVjdG9yV2l0aFR5cGVQYXJhbWV0ZXJzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX1BBUkFNRVRFUl9PTl9DT05TVFJVQ1RPUiJdLAogICAgbWVzc2FnZTogciIiIkNvbnN0cnVjdG9ycyBjYW4ndCBoYXZlIHR5cGUgcGFyYW1ldGVycy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lID0gbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFdyb25nTmFtZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfQ09OU1RSVUNUT1JfTkFNRSJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhlIG5hbWUgb2YgYSBjb25zdHJ1Y3RvciBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVDb250ZXh0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUaGUgbmFtZSBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzIGlzICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigiQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dCIsCiAgICAgICAgdGVtcGxhdGVDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVDb250ZXh0LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVDb250ZXh0KFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dCwKICAgICAgbWVzc2FnZTogIiIiVGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcyBpcyAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29udGludWVMYWJlbE5vdFRhcmdldCA9IG1lc3NhZ2VDb250aW51ZUxhYmVsTm90VGFyZ2V0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnRpbnVlTGFiZWxOb3RUYXJnZXQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb250aW51ZUxhYmVsTm90VGFyZ2V0IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJMQUJFTF9VTkRFRklORUQiXSwKICAgIG1lc3NhZ2U6IHIiIiJUYXJnZXQgb2YgY29udGludWUgbXVzdCBiZSBhIGxhYmVsLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb250aW51ZU91dHNpZGVPZkxvb3AgPSBtZXNzYWdlQ29udGludWVPdXRzaWRlT2ZMb29wOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnRpbnVlT3V0c2lkZU9mTG9vcCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnRpbnVlT3V0c2lkZU9mTG9vcCIsCiAgICBpbmRleDogMiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgY29udGludWUgc3RhdGVtZW50IGNhbid0IGJlIHVzZWQgb3V0c2lkZSBvZiBhIGxvb3Agb3Igc3dpdGNoIHN0YXRlbWVudC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGNvbnRpbnVlIHN0YXRlbWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUNvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJDYW4ndCBjb250aW51ZSBhdCAnI25hbWUnIGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb24iLCB0ZW1wbGF0ZUNvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJMQUJFTF9JTl9PVVRFUl9TQ09QRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCBjb250aW51ZSBhdCAnJHtuYW1lfScgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29udGludWVXaXRob3V0TGFiZWxJbkNhc2UgPQogICAgbWVzc2FnZUNvbnRpbnVlV2l0aG91dExhYmVsSW5DYXNlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnRpbnVlV2l0aG91dExhYmVsSW5DYXNlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29udGludWVXaXRob3V0TGFiZWxJbkNhc2UiLAogICAgaW5kZXg6IDY0LAogICAgbWVzc2FnZToKICAgICAgICByIiIiQSBjb250aW51ZSBzdGF0ZW1lbnQgaW4gYSBzd2l0Y2ggc3RhdGVtZW50IG11c3QgaGF2ZSBhIGxhYmVsIGFzIGEgdGFyZ2V0LiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IGFkZGluZyBhIGxhYmVsIGFzc29jaWF0ZWQgd2l0aCBvbmUgb2YgdGhlIGNhc2UgY2xhdXNlcyB0byB0aGUgY29udGludWUgc3RhdGVtZW50LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4KICAgIHRlbXBsYXRlQ291bGROb3RQYXJzZVVyaSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ291bGRuJ3QgcGFyc2UgVVJJICcjc3RyaW5nJzoKICAjc3RyaW5nMi4iIiIsIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ291bGROb3RQYXJzZVVyaSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgY29kZUNvdWxkTm90UGFyc2VVcmkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgIkNvdWxkTm90UGFyc2VVcmkiLAogIHRlbXBsYXRlQ291bGROb3RQYXJzZVVyaSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb3VsZE5vdFBhcnNlVXJpKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvdWxkTm90UGFyc2VVcmksCiAgICAgIG1lc3NhZ2U6ICIiIkNvdWxkbid0IHBhcnNlIFVSSSAnJHtzdHJpbmd9JzoKICAke3N0cmluZzJ9LiIiIiwgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ3N0cmluZzInOiBzdHJpbmcyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvdmFyaWFudEFuZFN0YXRpYyA9IG1lc3NhZ2VDb3ZhcmlhbnRBbmRTdGF0aWM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ292YXJpYW50QW5kU3RhdGljID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ292YXJpYW50QW5kU3RhdGljIiwKICAgIGluZGV4OiA2NiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIk1lbWJlcnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgYm90aCAnY292YXJpYW50JyBhbmQgJ3N0YXRpYycuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIGVpdGhlciB0aGUgJ2NvdmFyaWFudCcgb3IgJ3N0YXRpYycga2V5d29yZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ292YXJpYW50TWVtYmVyID0gbWVzc2FnZUNvdmFyaWFudE1lbWJlcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb3ZhcmlhbnRNZW1iZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgiQ292YXJpYW50TWVtYmVyIiwKICAgIGluZGV4OiA2NywKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkdldHRlcnMsIHNldHRlcnMgYW5kIG1ldGhvZHMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2NvdmFyaWFudCcuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIHRoZSAnY292YXJpYW50JyBrZXl3b3JkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIHN0cmluZyk+IHRlbXBsYXRlQ3ljbGVJblR5cGVWYXJpYWJsZXMgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUeXBlICcjbmFtZScgaXMgYSBib3VuZCBvZiBpdHNlbGYgdmlhICcjc3RyaW5nJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGJyZWFraW5nIHRoZSBjeWNsZSBieSByZW1vdmluZyBhdCBsZWFzdCBvbiBvZiB0aGUgJ2V4dGVuZHMnIGNsYXVzZXMgaW4gdGhlIGN5Y2xlLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ3ljbGVJblR5cGVWYXJpYWJsZXMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKT4KICAgIGNvZGVDeWNsZUluVHlwZVZhcmlhYmxlcyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiQ3ljbGVJblR5cGVWYXJpYWJsZXMiLCB0ZW1wbGF0ZUN5Y2xlSW5UeXBlVmFyaWFibGVzLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX1BBUkFNRVRFUl9TVVBFUlRZUEVfT0ZfSVRTX0JPVU5EIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0N5Y2xlSW5UeXBlVmFyaWFibGVzKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDeWNsZUluVHlwZVZhcmlhYmxlcywKICAgICAgbWVzc2FnZTogIiIiVHlwZSAnJHtuYW1lfScgaXMgYSBib3VuZCBvZiBpdHNlbGYgdmlhICcke3N0cmluZ30nLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGJyZWFraW5nIHRoZSBjeWNsZSBieSByZW1vdmluZyBhdCBsZWFzdCBvbiBvZiB0aGUgJ2V4dGVuZHMnIGNsYXVzZXMgaW4gdGhlIGN5Y2xlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUN5Y2xpY0NsYXNzSGllcmFyY2h5ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiInI25hbWUnIGlzIGEgc3VwZXJ0eXBlIG9mIGl0c2VsZi4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDeWNsaWNDbGFzc0hpZXJhcmNoeSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ3ljbGljQ2xhc3NIaWVyYXJjaHkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkN5Y2xpY0NsYXNzSGllcmFyY2h5IiwgdGVtcGxhdGVDeWNsaWNDbGFzc0hpZXJhcmNoeSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUkVDVVJTSVZFX0lOVEVSRkFDRV9JTkhFUklUQU5DRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDeWNsaWNDbGFzc0hpZXJhcmNoeShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUN5Y2xpY0NsYXNzSGllcmFyY2h5LAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXMgYSBzdXBlcnR5cGUgb2YgaXRzZWxmLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVDeWNsaWNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkN5Y2xpYyBkZWZpbml0aW9uIG9mIGZhY3RvcnkgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDeWNsaWNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVDeWNsaWNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkN5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycyIsCiAgICAgICAgdGVtcGxhdGVDeWNsaWNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlJFQ1VSU0lWRV9GQUNUT1JZX1JFRElSRUNUIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0N5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUN5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycywKICAgICAgbWVzc2FnZTogIiIiQ3ljbGljIGRlZmluaXRpb24gb2YgZmFjdG9yeSAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlQ3ljbGljVHlwZWRlZiA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVGhlIHR5cGVkZWYgJyNuYW1lJyBoYXMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0N5Y2xpY1R5cGVkZWYpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUN5Y2xpY1R5cGVkZWYgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkN5Y2xpY1R5cGVkZWYiLCB0ZW1wbGF0ZUN5Y2xpY1R5cGVkZWYsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRZUEVfQUxJQVNfQ0FOTk9UX1JFRkVSRU5DRV9JVFNFTEYiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ3ljbGljVHlwZWRlZihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUN5Y2xpY1R5cGVkZWYsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSB0eXBlZGVmICcke25hbWV9JyBoYXMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZURlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlciA9CiAgICBtZXNzYWdlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZURlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlciA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyIiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiREVDTEFSRURfTUVNQkVSX0NPTkZMSUNUU19XSVRIX0lOSEVSSVRFRCJdLAogICAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAgIHIiIiJDYW4ndCBkZWNsYXJlIGEgbWVtYmVyIHRoYXQgY29uZmxpY3RzIHdpdGggYW4gaW5oZXJpdGVkIG9uZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2F1c2UgPQogICAgbWVzc2FnZURlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlckNhdXNlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZURlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlckNhdXNlID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJEZWNsYXJlZE1lbWJlckNvbmZsaWN0c1dpdGhJbmhlcml0ZWRNZW1iZXJDYXVzZSIsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICAgICAgbWVzc2FnZTogciIiIlRoaXMgaXMgdGhlIGluaGVyaXRlZCBtZW1iZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJDYW4ndCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBoZXJlIGJlY2F1c2UgYW55IGRlZmF1bHQgdmFsdWVzIG9mICcjbmFtZScgd291bGQgYmUgdXNlZCBpbnN0ZWFkLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSByZW1vdmluZyB0aGUgZGVmYXVsdCB2YWx1ZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czoKICAgICAgICAgICAgX3dpdGhBcmd1bWVudHNEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICBjb2RlRGVmYXVsdFZhbHVlSW5SZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRGVmYXVsdFZhbHVlSW5SZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciIsCiAgICAgICAgdGVtcGxhdGVEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WwogICAgICAiREVGQVVMVF9WQUxVRV9JTl9SRURJUkVDVElOR19GQUNUT1JZX0NPTlNUUlVDVE9SIgogICAgXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRGVmYXVsdFZhbHVlSW5SZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZURlZmF1bHRWYWx1ZUluUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBoZXJlIGJlY2F1c2UgYW55IGRlZmF1bHQgdmFsdWVzIG9mICcke25hbWV9JyB3b3VsZCBiZSB1c2VkIGluc3RlYWQuIiIiLAogICAgICB0aXA6ICIiIlRyeSByZW1vdmluZyB0aGUgZGVmYXVsdCB2YWx1ZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVEZWZlcnJlZEFmdGVyUHJlZml4ID0gbWVzc2FnZURlZmVycmVkQWZ0ZXJQcmVmaXg7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRGVmZXJyZWRBZnRlclByZWZpeCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkRlZmVycmVkQWZ0ZXJQcmVmaXgiLAogICAgaW5kZXg6IDY4LAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhlIGRlZmVycmVkIGtleXdvcmQgc2hvdWxkIGNvbWUgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBwcmVmaXggKCdhcycgY2xhdXNlKS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgbW92aW5nIHRoZSBkZWZlcnJlZCBrZXl3b3JkIGJlZm9yZSB0aGUgcHJlZml4LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZURlZmVycmVkUHJlZml4RHVwbGljYXRlZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQ2FuJ3QgdXNlIHRoZSBuYW1lICcjbmFtZScgZm9yIGEgZGVmZXJyZWQgbGlicmFyeSwgYXMgdGhlIG5hbWUgaXMgdXNlZCBlbHNld2hlcmUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZURlZmVycmVkUHJlZml4RHVwbGljYXRlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkIiwgdGVtcGxhdGVEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlNIQVJFRF9ERUZFUlJFRF9QUkVGSVgiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgdXNlIHRoZSBuYW1lICcke25hbWV9JyBmb3IgYSBkZWZlcnJlZCBsaWJyYXJ5LCBhcyB0aGUgbmFtZSBpcyB1c2VkIGVsc2V3aGVyZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIicjbmFtZScgaXMgdXNlZCBoZXJlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0RlZmVycmVkUHJlZml4RHVwbGljYXRlZENhdXNlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYXVzZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2UiLCB0ZW1wbGF0ZURlZmVycmVkUHJlZml4RHVwbGljYXRlZENhdXNlLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYXVzZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZURlZmVycmVkUHJlZml4RHVwbGljYXRlZENhdXNlLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXMgdXNlZCBoZXJlLiIiIiwgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlRGVmZXJyZWRUeXBlQW5ub3RhdGlvbiA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSB0eXBlICcjdHlwZScgaXMgZGVmZXJyZWQgbG9hZGVkIHZpYSBwcmVmaXggJyNuYW1lJyBhbmQgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgYW5ub3RhdGlvbi4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IHJlbW92aW5nICdkZWZlcnJlZCcgZnJvbSB0aGUgaW1wb3J0IG9mICcjbmFtZScgb3IgdXNlIGEgc3VwZXJ0eXBlIG9mICcjdHlwZScgdGhhdCBpc24ndCBkZWZlcnJlZC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0RlZmVycmVkVHlwZUFubm90YXRpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBTdHJpbmcgbmFtZSk+CiAgICBjb2RlRGVmZXJyZWRUeXBlQW5ub3RhdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkRlZmVycmVkVHlwZUFubm90YXRpb24iLCB0ZW1wbGF0ZURlZmVycmVkVHlwZUFubm90YXRpb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRZUEVfQU5OT1RBVElPTl9ERUZFUlJFRF9DTEFTUyJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0RlZmVycmVkVHlwZUFubm90YXRpb24oRGFydFR5cGUgX3R5cGUsIFN0cmluZyBuYW1lKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZURlZmVycmVkVHlwZUFubm90YXRpb24sCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgdHlwZSAnJHt0eXBlfScgaXMgZGVmZXJyZWQgbG9hZGVkIHZpYSBwcmVmaXggJyR7bmFtZX0nIGFuZCBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBhbm5vdGF0aW9uLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJUcnkgcmVtb3ZpbmcgJ2RlZmVycmVkJyBmcm9tIHRoZSBpbXBvcnQgb2YgJyR7bmFtZX0nIG9yIHVzZSBhIHN1cGVydHlwZSBvZiAnJHt0eXBlfScgdGhhdCBpc24ndCBkZWZlcnJlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpPgogICAgdGVtcGxhdGVEaWxsT3V0bGluZVN1bW1hcnkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50IGNvdW50MiwgbnVtIF9udW0xLCBudW0gX251bTIsIG51bSBfbnVtMyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkluZGV4ZWQgI2NvdW50IGxpYnJhcmllcyAoI2NvdW50MiBieXRlcykgaW4gI251bTElLjNtcywgdGhhdCBpcywKI251bTIlMTIuMyBieXRlcy9tcywgYW5kCiNudW0zJTEyLjMgbXMvbGlicmFyaWVzLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0RpbGxPdXRsaW5lU3VtbWFyeSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLAogICAgICAgIG51bSBfbnVtMyk+IGNvZGVEaWxsT3V0bGluZVN1bW1hcnkgPSBjb25zdCBDb2RlPAogICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpPigKICAiRGlsbE91dGxpbmVTdW1tYXJ5IiwKICB0ZW1wbGF0ZURpbGxPdXRsaW5lU3VtbWFyeSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEaWxsT3V0bGluZVN1bW1hcnkoCiAgICBpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpIHsKICBpZiAoY291bnQgPT0gbnVsbCkgdGhyb3cgJ05vIGNvdW50IHByb3ZpZGVkJzsKICBpZiAoY291bnQyID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgaWYgKF9udW0xID09IG51bGwpIHRocm93ICdObyBudW1iZXIgcHJvdmlkZWQnOwogIFN0cmluZyBudW0xID0gX251bTEudG9TdHJpbmdBc0ZpeGVkKDMpOwogIGlmIChfbnVtMiA9PSBudWxsKSB0aHJvdyAnTm8gbnVtYmVyIHByb3ZpZGVkJzsKICBTdHJpbmcgbnVtMiA9IF9udW0yLnRvU3RyaW5nQXNGaXhlZCgzKS5wYWRMZWZ0KDEyKTsKICBpZiAoX251bTMgPT0gbnVsbCkgdGhyb3cgJ05vIG51bWJlciBwcm92aWRlZCc7CiAgU3RyaW5nIG51bTMgPSBfbnVtMy50b1N0cmluZ0FzRml4ZWQoMykucGFkTGVmdCgxMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEaWxsT3V0bGluZVN1bW1hcnksCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJJbmRleGVkICR7Y291bnR9IGxpYnJhcmllcyAoJHtjb3VudDJ9IGJ5dGVzKSBpbiAke251bTF9bXMsIHRoYXQgaXMsCiR7bnVtMn0gYnl0ZXMvbXMsIGFuZAoke251bTN9IG1zL2xpYnJhcmllcy4iIiIsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICdjb3VudCc6IGNvdW50LAogICAgICAgICdjb3VudDInOiBjb3VudDIsCiAgICAgICAgJ251bTEnOiBfbnVtMSwKICAgICAgICAnbnVtMic6IF9udW0yLAogICAgICAgICdudW0zJzogX251bTMKICAgICAgfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlRGlyZWN0Q3ljbGVJblR5cGVWYXJpYWJsZXMgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUeXBlICcjbmFtZScgY2FuJ3QgdXNlIGl0c2VsZiBhcyBhIGJvdW5kLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgYnJlYWtpbmcgdGhlIGN5Y2xlIGJ5IHJlbW92aW5nIGF0IGxlYXN0IG9uIG9mIHRoZSAnZXh0ZW5kcycgY2xhdXNlcyBpbiB0aGUgY3ljbGUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlcyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRGlyZWN0Q3ljbGVJblR5cGVWYXJpYWJsZXMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkRpcmVjdEN5Y2xlSW5UeXBlVmFyaWFibGVzIiwgdGVtcGxhdGVEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlcywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVFlQRV9QQVJBTUVURVJfU1VQRVJUWVBFX09GX0lUU19CT1VORCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlcyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZURpcmVjdEN5Y2xlSW5UeXBlVmFyaWFibGVzLAogICAgICBtZXNzYWdlOiAiIiJUeXBlICcke25hbWV9JyBjYW4ndCB1c2UgaXRzZWxmIGFzIGEgYm91bmQuIiIiLAogICAgICB0aXA6CiAgICAgICAgICAiIiJUcnkgYnJlYWtpbmcgdGhlIGN5Y2xlIGJ5IHJlbW92aW5nIGF0IGxlYXN0IG9uIG9mIHRoZSAnZXh0ZW5kcycgY2xhdXNlcyBpbiB0aGUgY3ljbGUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRGlyZWN0aXZlQWZ0ZXJEZWNsYXJhdGlvbiA9CiAgICBtZXNzYWdlRGlyZWN0aXZlQWZ0ZXJEZWNsYXJhdGlvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VEaXJlY3RpdmVBZnRlckRlY2xhcmF0aW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRGlyZWN0aXZlQWZ0ZXJEZWNsYXJhdGlvbiIsCiAgICBpbmRleDogNjksCiAgICBtZXNzYWdlOiByIiIiRGlyZWN0aXZlcyBtdXN0IGFwcGVhciBiZWZvcmUgYW55IGRlY2xhcmF0aW9ucy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgbW92aW5nIHRoZSBkaXJlY3RpdmUgYmVmb3JlIGFueSBkZWNsYXJhdGlvbnMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUR1cGxpY2F0ZURlZmVycmVkID0gbWVzc2FnZUR1cGxpY2F0ZURlZmVycmVkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUR1cGxpY2F0ZURlZmVycmVkID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRHVwbGljYXRlRGVmZXJyZWQiLAogICAgaW5kZXg6IDcxLAogICAgbWVzc2FnZTogciIiIkFuIGltcG9ydCBkaXJlY3RpdmUgY2FuIG9ubHkgaGF2ZSBvbmUgJ2RlZmVycmVkJyBrZXl3b3JkLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSAnZGVmZXJyZWQnIGtleXdvcmQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVEdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGUgbGFiZWwgJyNuYW1lJyB3YXMgYWxyZWFkeSB1c2VkIGluIHRoaXMgc3dpdGNoIHN0YXRlbWVudC4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgY2hvb3NpbmcgYSBkaWZmZXJlbnQgbmFtZSBmb3IgdGhpcyBsYWJlbC4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVEdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KCJEdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50IiwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZUxhYmVsSW5Td2l0Y2hTdGF0ZW1lbnQsCiAgICAgICAgaW5kZXg6IDcyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50KFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlTGFiZWxJblN3aXRjaFN0YXRlbWVudCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBsYWJlbCAnJHtuYW1lfScgd2FzIGFscmVhZHkgdXNlZCBpbiB0aGlzIHN3aXRjaCBzdGF0ZW1lbnQuIiIiLAogICAgICB0aXA6ICIiIlRyeSBjaG9vc2luZyBhIGRpZmZlcmVudCBuYW1lIGZvciB0aGlzIGxhYmVsLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUR1cGxpY2F0ZVByZWZpeCA9IG1lc3NhZ2VEdXBsaWNhdGVQcmVmaXg7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRHVwbGljYXRlUHJlZml4ID0gY29uc3QgTWVzc2FnZUNvZGUoIkR1cGxpY2F0ZVByZWZpeCIsCiAgICBpbmRleDogNzMsCiAgICBtZXNzYWdlOiByIiIiQW4gaW1wb3J0IGRpcmVjdGl2ZSBjYW4gb25seSBoYXZlIG9uZSBwcmVmaXggKCdhcycgY2xhdXNlKS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgYWxsIGJ1dCBvbmUgcHJlZml4LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIicjbmFtZScgaXMgYWxyZWFkeSBkZWNsYXJlZCBpbiB0aGlzIHNjb3BlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWREZWNsYXJhdGlvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRHVwbGljYXRlZERlY2xhcmF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJEdXBsaWNhdGVkRGVjbGFyYXRpb24iLCB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRFVQTElDQVRFX0RFRklOSVRJT04iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZERlY2xhcmF0aW9uKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZERlY2xhcmF0aW9uLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXMgYWxyZWFkeSBkZWNsYXJlZCBpbiB0aGlzIHNjb3BlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiUHJldmlvdXMgZGVjbGFyYXRpb24gb2YgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlIiwgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2UoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZSwKICAgICAgbWVzc2FnZTogIiIiUHJldmlvdXMgZGVjbGFyYXRpb24gb2YgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uU3ludGhldGljQ2F1c2UgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlByZXZpb3VzIGRlY2xhcmF0aW9uIG9mICcjbmFtZScgaXMgaW1wbGllZCBieSB0aGlzIGRlZmluaXRpb24uIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRGVjbGFyYXRpb25TeW50aGV0aWNDYXVzZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUR1cGxpY2F0ZWREZWNsYXJhdGlvblN5bnRoZXRpY0NhdXNlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJEdXBsaWNhdGVkRGVjbGFyYXRpb25TeW50aGV0aWNDYXVzZSIsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25TeW50aGV0aWNDYXVzZSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZERlY2xhcmF0aW9uU3ludGhldGljQ2F1c2UoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkRGVjbGFyYXRpb25TeW50aGV0aWNDYXVzZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlByZXZpb3VzIGRlY2xhcmF0aW9uIG9mICcke25hbWV9JyBpcyBpbXBsaWVkIGJ5IHRoaXMgZGVmaW5pdGlvbi4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNhbid0IHVzZSAnI25hbWUnIGJlY2F1c2UgaXQgaXMgZGVjbGFyZWQgbW9yZSB0aGFuIG9uY2UuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZERlY2xhcmF0aW9uVXNlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIkR1cGxpY2F0ZWREZWNsYXJhdGlvblVzZSIsCiAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2UsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZERlY2xhcmF0aW9uVXNlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZERlY2xhcmF0aW9uVXNlLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCB1c2UgJyR7bmFtZX0nIGJlY2F1c2UgaXQgaXMgZGVjbGFyZWQgbW9yZSB0aGFuIG9uY2UuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+CiAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRFeHBvcnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIicjbmFtZScgaXMgZXhwb3J0ZWQgZnJvbSBib3RoICcjdXJpJyBhbmQgJyN1cmkyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRXhwb3J0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+CiAgICBjb2RlRHVwbGljYXRlZEV4cG9ydCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPigKICAgICAgICAiRHVwbGljYXRlZEV4cG9ydCIsIHRlbXBsYXRlRHVwbGljYXRlZEV4cG9ydCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQU1CSUdVT1VTX0VYUE9SVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRXhwb3J0KFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIFN0cmluZyB1cmkyID0gcmVsYXRpdml6ZVVyaSh1cmkyXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkRXhwb3J0LAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXMgZXhwb3J0ZWQgZnJvbSBib3RoICcke3VyaX0nIGFuZCAnJHt1cmkyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd1cmknOiB1cmlfLCAndXJpMic6IHVyaTJffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgdGVtcGxhdGVEdXBsaWNhdGVkRXhwb3J0SW5UeXBlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiInI25hbWUnIGlzIGV4cG9ydGVkIGZyb20gYm90aCAnI3VyaScgYW5kICcjdXJpMicuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZEV4cG9ydEluVHlwZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgY29kZUR1cGxpY2F0ZWRFeHBvcnRJblR5cGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4oCiAgICAgICAgIkR1cGxpY2F0ZWRFeHBvcnRJblR5cGUiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWRFeHBvcnRJblR5cGUsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZEV4cG9ydEluVHlwZShTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICBTdHJpbmcgdXJpMiA9IHJlbGF0aXZpemVVcmkodXJpMl8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZEV4cG9ydEluVHlwZSwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzIGV4cG9ydGVkIGZyb20gYm90aCAnJHt1cml9JyBhbmQgJyR7dXJpMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndXJpJzogdXJpXywgJ3VyaTInOiB1cmkyX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIHRlbXBsYXRlRHVwbGljYXRlZEltcG9ydCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiJyNuYW1lJyBpcyBpbXBvcnRlZCBmcm9tIGJvdGggJyN1cmknIGFuZCAnI3VyaTInLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRJbXBvcnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIGNvZGVEdXBsaWNhdGVkSW1wb3J0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgICJEdXBsaWNhdGVkSW1wb3J0IiwgdGVtcGxhdGVEdXBsaWNhdGVkSW1wb3J0LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pZ25vcmVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkSW1wb3J0KFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIFN0cmluZyB1cmkyID0gcmVsYXRpdml6ZVVyaSh1cmkyXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkSW1wb3J0LAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXMgaW1wb3J0ZWQgZnJvbSBib3RoICcke3VyaX0nIGFuZCAnJHt1cmkyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd1cmknOiB1cmlfLCAndXJpMic6IHVyaTJffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgdGVtcGxhdGVEdXBsaWNhdGVkSW1wb3J0SW5UeXBlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiInI25hbWUnIGlzIGltcG9ydGVkIGZyb20gYm90aCAnI3VyaScgYW5kICcjdXJpMicuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZEltcG9ydEluVHlwZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgY29kZUR1cGxpY2F0ZWRJbXBvcnRJblR5cGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4oCiAgICAgICAgIkR1cGxpY2F0ZWRJbXBvcnRJblR5cGUiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWRJbXBvcnRJblR5cGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkFNQklHVU9VU19JTVBPUlQiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkSW1wb3J0SW5UeXBlKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIFN0cmluZyB1cmkyID0gcmVsYXRpdml6ZVVyaSh1cmkyXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkSW1wb3J0SW5UeXBlLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXMgaW1wb3J0ZWQgZnJvbSBib3RoICcke3VyaX0nIGFuZCAnJHt1cmkyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd1cmknOiB1cmlfLCAndXJpMic6IHVyaTJffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJBIGxpYnJhcnkgd2l0aCBuYW1lICcjbmFtZScgaXMgZXhwb3J0ZWQgbW9yZSB0aGFuIG9uY2UuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZExpYnJhcnlFeHBvcnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJEdXBsaWNhdGVkTGlicmFyeUV4cG9ydCIsIHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlFeHBvcnQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUE9SVF9EVVBMSUNBVEVEX0xJQlJBUllfTkFNRUQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZExpYnJhcnlFeHBvcnQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydCwKICAgICAgbWVzc2FnZTogIiIiQSBsaWJyYXJ5IHdpdGggbmFtZSAnJHtuYW1lfScgaXMgZXhwb3J0ZWQgbW9yZSB0aGFuIG9uY2UuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0Q29udGV4dCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBpcyBhbHNvIGV4cG9ydGVkIGhlcmUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZExpYnJhcnlFeHBvcnRDb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydENvbnRleHQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oIkR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0Q29udGV4dCIsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydENvbnRleHQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0Q29udGV4dChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0Q29udGV4dCwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzIGFsc28gZXhwb3J0ZWQgaGVyZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQSBsaWJyYXJ5IHdpdGggbmFtZSAnI25hbWUnIGlzIGltcG9ydGVkIG1vcmUgdGhhbiBvbmNlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRHVwbGljYXRlZExpYnJhcnlJbXBvcnQiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTVBPUlRfRFVQTElDQVRFRF9MSUJSQVJZX05BTUVEIl0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0KFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZExpYnJhcnlJbXBvcnQsCiAgICAgIG1lc3NhZ2U6ICIiIkEgbGlicmFyeSB3aXRoIG5hbWUgJyR7bmFtZX0nIGlzIGltcG9ydGVkIG1vcmUgdGhhbiBvbmNlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydENvbnRleHQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIicjbmFtZScgaXMgYWxzbyBpbXBvcnRlZCBoZXJlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRHVwbGljYXRlZExpYnJhcnlJbXBvcnRDb250ZXh0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KCJEdXBsaWNhdGVkTGlicmFyeUltcG9ydENvbnRleHQiLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlJbXBvcnRDb250ZXh0LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTGlicmFyeUltcG9ydENvbnRleHQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydENvbnRleHQsCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpcyBhbHNvIGltcG9ydGVkIGhlcmUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IHRlbXBsYXRlRHVwbGljYXRlZE1vZGlmaWVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUaGUgbW9kaWZpZXIgJyNsZXhlbWUnIHdhcyBhbHJlYWR5IHNwZWNpZmllZC4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgcmVtb3ZpbmcgYWxsIGJ1dCBvbmUgb2NjdXJlbmNlIG9mIHRoZSBtb2RpZmllci4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTW9kaWZpZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZUR1cGxpY2F0ZWRNb2RpZmllciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiRHVwbGljYXRlZE1vZGlmaWVyIiwgdGVtcGxhdGVEdXBsaWNhdGVkTW9kaWZpZXIsCiAgICAgICAgaW5kZXg6IDcwKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTW9kaWZpZXIoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZE1vZGlmaWVyLAogICAgICBtZXNzYWdlOiAiIiJUaGUgbW9kaWZpZXIgJyR7bGV4ZW1lfScgd2FzIGFscmVhZHkgc3BlY2lmaWVkLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcmVtb3ZpbmcgYWxsIGJ1dCBvbmUgb2NjdXJlbmNlIG9mIHRoZSBtb2RpZmllci4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQ2FuJ3QgZGVjbGFyZSAnI25hbWUnIGJlY2F1c2UgaXQgd2FzIGFscmVhZHkgdXNlZCBpbiB0aGlzIHNjb3BlLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZCIsIHRlbXBsYXRlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUkVGRVJFTkNFRF9CRUZPUkVfREVDTEFSQVRJT04iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCBkZWNsYXJlICcke25hbWV9JyBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBzY29wZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZENhdXNlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJQcmV2aW91cyB1c2Ugb2YgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2F1c2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZSIsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZSwKICAgICAgbWVzc2FnZTogIiIiUHJldmlvdXMgdXNlIG9mICcke25hbWV9Jy4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVEdXBsaWNhdGVkTmFtZWRBcmd1bWVudCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRHVwbGljYXRlZCBuYW1lZCBhcmd1bWVudCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWROYW1lZEFyZ3VtZW50KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVEdXBsaWNhdGVkTmFtZWRBcmd1bWVudCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRHVwbGljYXRlZE5hbWVkQXJndW1lbnQiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWROYW1lZEFyZ3VtZW50LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJEVVBMSUNBVEVfTkFNRURfQVJHVU1FTlQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZE5hbWVkQXJndW1lbnQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkTmFtZWRBcmd1bWVudCwKICAgICAgbWVzc2FnZTogIiIiRHVwbGljYXRlZCBuYW1lZCBhcmd1bWVudCAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlRHVwbGljYXRlZFBhcmFtZXRlck5hbWUgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkR1cGxpY2F0ZWQgcGFyYW1ldGVyIG5hbWUgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRHVwbGljYXRlZFBhcmFtZXRlck5hbWUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lIiwgdGVtcGxhdGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRFVQTElDQVRFX0RFRklOSVRJT04iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZFBhcmFtZXRlck5hbWUoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZSwKICAgICAgbWVzc2FnZTogIiIiRHVwbGljYXRlZCBwYXJhbWV0ZXIgbmFtZSAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIk90aGVyIHBhcmFtZXRlciBuYW1lZCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZUNhdXNlLAogICAgICBtZXNzYWdlOiAiIiJPdGhlciBwYXJhbWV0ZXIgbmFtZWQgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUVtcHR5TmFtZWRQYXJhbWV0ZXJMaXN0ID0gbWVzc2FnZUVtcHR5TmFtZWRQYXJhbWV0ZXJMaXN0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUVtcHR5TmFtZWRQYXJhbWV0ZXJMaXN0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRW1wdHlOYW1lZFBhcmFtZXRlckxpc3QiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfSURFTlRJRklFUiJdLAogICAgbWVzc2FnZTogciIiIk5hbWVkIHBhcmFtZXRlciBsaXN0cyBjYW5ub3QgYmUgZW1wdHkuIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyBhIG5hbWVkIHBhcmFtZXRlciB0byB0aGUgbGlzdC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRW1wdHlPcHRpb25hbFBhcmFtZXRlckxpc3QgPQogICAgbWVzc2FnZUVtcHR5T3B0aW9uYWxQYXJhbWV0ZXJMaXN0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUVtcHR5T3B0aW9uYWxQYXJhbWV0ZXJMaXN0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRW1wdHlPcHRpb25hbFBhcmFtZXRlckxpc3QiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfSURFTlRJRklFUiJdLAogICAgbWVzc2FnZTogciIiIk9wdGlvbmFsIHBhcmFtZXRlciBsaXN0cyBjYW5ub3QgYmUgZW1wdHkuIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gdGhlIGxpc3QuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUVuY29kaW5nID0gbWVzc2FnZUVuY29kaW5nOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUVuY29kaW5nID0gY29uc3QgTWVzc2FnZUNvZGUoIkVuY29kaW5nIiwKICAgIG1lc3NhZ2U6IHIiIiJVbmFibGUgdG8gZGVjb2RlIGJ5dGVzIGFzIFVURi04LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUVudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3NpbmcgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIk5hbWUgb2YgZW51bSBjb25zdGFudCAnI25hbWUnIGNhbid0IGJlIHRoZSBzYW1lIGFzIHRoZSBlbnVtJ3Mgb3duIG5hbWUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFbnVtQ29uc3RhbnRTYW1lTmFtZUFzRW5jbG9zaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVFbnVtQ29uc3RhbnRTYW1lTmFtZUFzRW5jbG9zaW5nID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KCJFbnVtQ29uc3RhbnRTYW1lTmFtZUFzRW5jbG9zaW5nIiwKICAgICAgICB0ZW1wbGF0ZUVudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3NpbmcsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVOVU1fQ09OU1RBTlRfV0lUSF9FTlVNX05BTUUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRW51bUNvbnN0YW50U2FtZU5hbWVBc0VuY2xvc2luZyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUVudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3NpbmcsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJOYW1lIG9mIGVudW0gY29uc3RhbnQgJyR7bmFtZX0nIGNhbid0IGJlIHRoZSBzYW1lIGFzIHRoZSBlbnVtJ3Mgb3duIG5hbWUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRW51bURlY2xhcmF0aW9uRW1wdHkgPSBtZXNzYWdlRW51bURlY2xhcmF0aW9uRW1wdHk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRW51bURlY2xhcmF0aW9uRW1wdHkgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFbnVtRGVjbGFyYXRpb25FbXB0eSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRU1QVFlfRU5VTV9CT0RZIl0sCiAgICBtZXNzYWdlOiByIiIiQW4gZW51bSBkZWNsYXJhdGlvbiBjYW4ndCBiZSBlbXB0eS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRW51bUluQ2xhc3MgPSBtZXNzYWdlRW51bUluQ2xhc3M7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRW51bUluQ2xhc3MgPSBjb25zdCBNZXNzYWdlQ29kZSgiRW51bUluQ2xhc3MiLAogICAgaW5kZXg6IDc0LAogICAgbWVzc2FnZTogciIiIkVudW1zIGNhbid0IGJlIGRlY2xhcmVkIGluc2lkZSBjbGFzc2VzLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGVudW0gdG8gdGhlIHRvcC1sZXZlbC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRW51bUluc3RhbnRpYXRpb24gPSBtZXNzYWdlRW51bUluc3RhbnRpYXRpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRW51bUluc3RhbnRpYXRpb24gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFbnVtSW5zdGFudGlhdGlvbiIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5TVEFOVElBVEVfRU5VTSJdLAogICAgbWVzc2FnZTogciIiIkVudW1zIGNhbid0IGJlIGluc3RhbnRpYXRlZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXF1YWxpdHlDYW5ub3RCZUVxdWFsaXR5T3BlcmFuZCA9CiAgICBtZXNzYWdlRXF1YWxpdHlDYW5ub3RCZUVxdWFsaXR5T3BlcmFuZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFcXVhbGl0eUNhbm5vdEJlRXF1YWxpdHlPcGVyYW5kID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXF1YWxpdHlDYW5ub3RCZUVxdWFsaXR5T3BlcmFuZCIsCiAgICBpbmRleDogMSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkFuIGVxdWFsaXR5IGV4cHJlc3Npb24gY2FuJ3QgYmUgYW4gb3BlcmFuZCBvZiBhbm90aGVyIGVxdWFsaXR5IGV4cHJlc3Npb24uIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlLXdyaXRpbmcgdGhlIGV4cHJlc3Npb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IHRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCAnI3N0cmluZycgYWZ0ZXIgdGhpcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZEFmdGVyQnV0R290KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZUV4cGVjdGVkQWZ0ZXJCdXRHb3QgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiRXhwZWN0ZWRBZnRlckJ1dEdvdCIsIHRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQRUNURURfVE9LRU4iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZWN0ZWRBZnRlckJ1dEdvdChTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4cGVjdGVkQWZ0ZXJCdXRHb3QsCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkICcke3N0cmluZ30nIGFmdGVyIHRoaXMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4cGVjdGVkQW5Jbml0aWFsaXplciA9IG1lc3NhZ2VFeHBlY3RlZEFuSW5pdGlhbGl6ZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXhwZWN0ZWRBbkluaXRpYWxpemVyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwZWN0ZWRBbkluaXRpYWxpemVyIiwKICAgIGluZGV4OiAzNiwKICAgIG1lc3NhZ2U6IHIiIiJFeHBlY3RlZCBhbiBpbml0aWFsaXplci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwZWN0ZWRCbG9jayA9IG1lc3NhZ2VFeHBlY3RlZEJsb2NrOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4cGVjdGVkQmxvY2sgPSBjb25zdCBNZXNzYWdlQ29kZSgiRXhwZWN0ZWRCbG9jayIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQRUNURURfVE9LRU4iXSwKICAgIG1lc3NhZ2U6IHIiIiJFeHBlY3RlZCBhIGJsb2NrLiIiIiwKICAgIHRpcDogciIiIlRyeSBhZGRpbmcge30uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4cGVjdGVkQmxvY2tUb1NraXAgPSBtZXNzYWdlRXhwZWN0ZWRCbG9ja1RvU2tpcDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBlY3RlZEJsb2NrVG9Ta2lwID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwZWN0ZWRCbG9ja1RvU2tpcCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTUlTU0lOR19GVU5DVElPTl9CT0RZIl0sCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgYSBmdW5jdGlvbiBib2R5IG9yICc9PicuIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyB7fS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwZWN0ZWRCb2R5ID0gbWVzc2FnZUV4cGVjdGVkQm9keTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBlY3RlZEJvZHkgPSBjb25zdCBNZXNzYWdlQ29kZSgiRXhwZWN0ZWRCb2R5IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX0ZVTkNUSU9OX0JPRFkiXSwKICAgIG1lc3NhZ2U6IHIiIiJFeHBlY3RlZCBhIGZ1bmN0aW9uIGJvZHkgb3IgJz0+Jy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgYWRkaW5nIHt9LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiB0ZW1wbGF0ZUV4cGVjdGVkQnV0R290ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkV4cGVjdGVkICcjc3RyaW5nJyBiZWZvcmUgdGhpcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZEJ1dEdvdCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IGNvZGVFeHBlY3RlZEJ1dEdvdCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJFeHBlY3RlZEJ1dEdvdCIsIHRlbXBsYXRlRXhwZWN0ZWRCdXRHb3QsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUEVDVEVEX1RPS0VOIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkQnV0R290KFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRCdXRHb3QsCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkICcke3N0cmluZ30nIGJlZm9yZSB0aGlzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gdGVtcGxhdGVFeHBlY3RlZENsYXNzTWVtYmVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhIGNsYXNzIG1lbWJlciwgYnV0IGdvdCAnI2xleGVtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRXhwZWN0ZWRDbGFzc01lbWJlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiBjb2RlRXhwZWN0ZWRDbGFzc01lbWJlciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiRXhwZWN0ZWRDbGFzc01lbWJlciIsIHRlbXBsYXRlRXhwZWN0ZWRDbGFzc01lbWJlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQRUNURURfQ0xBU1NfTUVNQkVSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkQ2xhc3NNZW1iZXIoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRDbGFzc01lbWJlciwKICAgICAgbWVzc2FnZTogIiIiRXhwZWN0ZWQgYSBjbGFzcyBtZW1iZXIsIGJ1dCBnb3QgJyR7bGV4ZW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPgogICAgdGVtcGxhdGVFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHkgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQSAjc3RyaW5nIG11c3QgaGF2ZSBhIGJvZHksIGV2ZW4gaWYgaXQgaXMgZW1wdHkuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IGFkZGluZyBhbiBlbXB0eSBib2R5LiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkQ2xhc3NPck1peGluQm9keSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IGNvZGVFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiRXhwZWN0ZWRDbGFzc09yTWl4aW5Cb2R5IiwgdGVtcGxhdGVFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHksCiAgICAgICAgaW5kZXg6IDgpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkQ2xhc3NPck1peGluQm9keShTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4cGVjdGVkQ2xhc3NPck1peGluQm9keSwKICAgICAgbWVzc2FnZTogIiIiQSAke3N0cmluZ30gbXVzdCBoYXZlIGEgYm9keSwgZXZlbiBpZiBpdCBpcyBlbXB0eS4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IGFkZGluZyBhbiBlbXB0eSBib2R5LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gdGVtcGxhdGVFeHBlY3RlZERlY2xhcmF0aW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhIGRlY2xhcmF0aW9uLCBidXQgZ290ICcjbGV4ZW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZERlY2xhcmF0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVFeHBlY3RlZERlY2xhcmF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJFeHBlY3RlZERlY2xhcmF0aW9uIiwgdGVtcGxhdGVFeHBlY3RlZERlY2xhcmF0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFBFQ1RFRF9FWEVDVVRBQkxFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWREZWNsYXJhdGlvbiwKICAgICAgbWVzc2FnZTogIiIiRXhwZWN0ZWQgYSBkZWNsYXJhdGlvbiwgYnV0IGdvdCAnJHtsZXhlbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4cGVjdGVkRWxzZU9yQ29tbWEgPSBtZXNzYWdlRXhwZWN0ZWRFbHNlT3JDb21tYTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBlY3RlZEVsc2VPckNvbW1hID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwZWN0ZWRFbHNlT3JDb21tYSIsCiAgICBpbmRleDogNDYsCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgJ2Vsc2UnIG9yIGNvbW1hLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkRW51bUJvZHkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhIGVudW0gYm9keSwgYnV0IGdvdCAnI2xleGVtZScuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIkFuIGVudW0gZGVmaW5pdGlvbiBtdXN0IGhhdmUgYSBib2R5IHdpdGggYXQgbGVhc3Qgb25lIGNvbnN0YW50IG5hbWUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZEVudW1Cb2R5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVFeHBlY3RlZEVudW1Cb2R5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJFeHBlY3RlZEVudW1Cb2R5IiwgdGVtcGxhdGVFeHBlY3RlZEVudW1Cb2R5LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX0VOVU1fQk9EWSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFeHBlY3RlZEVudW1Cb2R5KFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4cGVjdGVkRW51bUJvZHksCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkIGEgZW51bSBib2R5LCBidXQgZ290ICcke2xleGVtZX0nLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiQW4gZW51bSBkZWZpbml0aW9uIG11c3QgaGF2ZSBhIGJvZHkgd2l0aCBhdCBsZWFzdCBvbmUgY29uc3RhbnQgbmFtZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkRnVuY3Rpb25Cb2R5ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhIGZ1bmN0aW9uIGJvZHksIGJ1dCBnb3QgJyNsZXhlbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkRnVuY3Rpb25Cb2R5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVFeHBlY3RlZEZ1bmN0aW9uQm9keSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiRXhwZWN0ZWRGdW5jdGlvbkJvZHkiLCB0ZW1wbGF0ZUV4cGVjdGVkRnVuY3Rpb25Cb2R5LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX0ZVTkNUSU9OX0JPRFkiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZWN0ZWRGdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRGdW5jdGlvbkJvZHksCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkIGEgZnVuY3Rpb24gYm9keSwgYnV0IGdvdCAnJHtsZXhlbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4cGVjdGVkSGV4RGlnaXQgPSBtZXNzYWdlRXhwZWN0ZWRIZXhEaWdpdDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBlY3RlZEhleERpZ2l0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwZWN0ZWRIZXhEaWdpdCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTUlTU0lOR19IRVhfRElHSVQiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIGhleCBkaWdpdCAoMC05IG9yIEEtRikgbXVzdCBmb2xsb3cgJzB4Jy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IHRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhbiBpZGVudGlmaWVyLCBidXQgZ290ICcjbGV4ZW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZElkZW50aWZpZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZUV4cGVjdGVkSWRlbnRpZmllciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiRXhwZWN0ZWRJZGVudGlmaWVyIiwgdGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfSURFTlRJRklFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFeHBlY3RlZElkZW50aWZpZXIoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRJZGVudGlmaWVyLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCBhbiBpZGVudGlmaWVyLCBidXQgZ290ICcke2xleGVtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gdGVtcGxhdGVFeHBlY3RlZEluc3RlYWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRXhwZWN0ZWQgJyNzdHJpbmcnIGluc3RlYWQgb2YgdGhpcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZEluc3RlYWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiBjb2RlRXhwZWN0ZWRJbnN0ZWFkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkV4cGVjdGVkSW5zdGVhZCIsIHRlbXBsYXRlRXhwZWN0ZWRJbnN0ZWFkLAogICAgICAgIGluZGV4OiA0MSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZWN0ZWRJbnN0ZWFkKFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRJbnN0ZWFkLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCAnJHtzdHJpbmd9JyBpbnN0ZWFkIG9mIHRoaXMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4cGVjdGVkTmFtZWRBcmd1bWVudCA9IG1lc3NhZ2VFeHBlY3RlZE5hbWVkQXJndW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXhwZWN0ZWROYW1lZEFyZ3VtZW50ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwZWN0ZWROYW1lZEFyZ3VtZW50IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFRSQV9QT1NJVElPTkFMX0FSR1VNRU5UUyJdLAogICAgbWVzc2FnZTogciIiIkV4cGVjdGVkIG5hbWVkIGFyZ3VtZW50LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHBlY3RlZE9uZUV4cHJlc3Npb24gPSBtZXNzYWdlRXhwZWN0ZWRPbmVFeHByZXNzaW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4cGVjdGVkT25lRXhwcmVzc2lvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkV4cGVjdGVkT25lRXhwcmVzc2lvbiIsCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgb25lIGV4cHJlc3Npb24sIGJ1dCBmb3VuZCBhZGRpdGlvbmFsIGlucHV0LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHBlY3RlZE9wZW5QYXJlbnMgPSBtZXNzYWdlRXhwZWN0ZWRPcGVuUGFyZW5zOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4cGVjdGVkT3BlblBhcmVucyA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiRXhwZWN0ZWRPcGVuUGFyZW5zIiwgbWVzc2FnZTogciIiIkV4cGVjdGVkICcoJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwZWN0ZWRTdGF0ZW1lbnQgPSBtZXNzYWdlRXhwZWN0ZWRTdGF0ZW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXhwZWN0ZWRTdGF0ZW1lbnQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFeHBlY3RlZFN0YXRlbWVudCIsCiAgICBpbmRleDogMjksCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgYSBzdGF0ZW1lbnQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkU3RyaW5nID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhIFN0cmluZywgYnV0IGdvdCAnI2xleGVtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRXhwZWN0ZWRTdHJpbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZUV4cGVjdGVkU3RyaW5nID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJFeHBlY3RlZFN0cmluZyIsIHRlbXBsYXRlRXhwZWN0ZWRTdHJpbmcsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUEVDVEVEX1NUUklOR19MSVRFUkFMIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkU3RyaW5nKFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4cGVjdGVkU3RyaW5nLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCBhIFN0cmluZywgYnV0IGdvdCAnJHtsZXhlbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IHRlbXBsYXRlRXhwZWN0ZWRUb2tlbiA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCB0byBmaW5kICcjc3RyaW5nJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZFRva2VuKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZUV4cGVjdGVkVG9rZW4gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiRXhwZWN0ZWRUb2tlbiIsIHRlbXBsYXRlRXhwZWN0ZWRUb2tlbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQRUNURURfVE9LRU4iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZWN0ZWRUb2tlbihTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4cGVjdGVkVG9rZW4sCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkIHRvIGZpbmQgJyR7c3RyaW5nfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkVHlwZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRXhwZWN0ZWQgYSB0eXBlLCBidXQgZ290ICcjbGV4ZW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZFR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZUV4cGVjdGVkVHlwZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiRXhwZWN0ZWRUeXBlIiwgdGVtcGxhdGVFeHBlY3RlZFR5cGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUEVDVEVEX1RZUEVfTkFNRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFeHBlY3RlZFR5cGUoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRUeXBlLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCBhIHR5cGUsIGJ1dCBnb3QgJyR7bGV4ZW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHBlY3RlZFVyaSA9IG1lc3NhZ2VFeHBlY3RlZFVyaTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBlY3RlZFVyaSA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiRXhwZWN0ZWRVcmkiLCBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgYSBVUkkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgc3RyaW5nKT4gdGVtcGxhdGVFeHBlcmltZW50Tm90RW5hYmxlZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGlzIHJlcXVpcmVzIHRoZSAnI3N0cmluZycgZXhwZXJpbWVudCB0byBiZSBlbmFibGVkLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgZW5hYmxpbmcgdGhpcyBleHBlcmltZW50IGJ5IGFkZGluZyBpdCB0byB0aGUgY29tbWFuZCBsaW5lIHdoZW4gY29tcGlsaW5nIGFuZCBydW5uaW5nLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRXhwZXJpbWVudE5vdEVuYWJsZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiBjb2RlRXhwZXJpbWVudE5vdEVuYWJsZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiRXhwZXJpbWVudE5vdEVuYWJsZWQiLCB0ZW1wbGF0ZUV4cGVyaW1lbnROb3RFbmFibGVkLAogICAgICAgIGluZGV4OiA0OCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZXJpbWVudE5vdEVuYWJsZWQoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVFeHBlcmltZW50Tm90RW5hYmxlZCwKICAgICAgbWVzc2FnZTogIiIiVGhpcyByZXF1aXJlcyB0aGUgJyR7c3RyaW5nfScgZXhwZXJpbWVudCB0byBiZSBlbmFibGVkLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGVuYWJsaW5nIHRoaXMgZXhwZXJpbWVudCBieSBhZGRpbmcgaXQgdG8gdGhlIGNvbW1hbmQgbGluZSB3aGVuIGNvbXBpbGluZyBhbmQgcnVubmluZy4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwb3J0QWZ0ZXJQYXJ0ID0gbWVzc2FnZUV4cG9ydEFmdGVyUGFydDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBvcnRBZnRlclBhcnQgPSBjb25zdCBNZXNzYWdlQ29kZSgiRXhwb3J0QWZ0ZXJQYXJ0IiwKICAgIGluZGV4OiA3NSwKICAgIG1lc3NhZ2U6IHIiIiJFeHBvcnQgZGlyZWN0aXZlcyBtdXN0IHByZWNlZGUgcGFydCBkaXJlY3RpdmVzLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGV4cG9ydCBkaXJlY3RpdmVzIGJlZm9yZSB0aGUgcGFydCBkaXJlY3RpdmVzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIHRlbXBsYXRlRXhwb3J0SGlkZXNFeHBvcnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkV4cG9ydCBvZiAnI25hbWUnIChmcm9tICcjdXJpJykgaGlkZXMgZXhwb3J0IGZyb20gJyN1cmkyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBvcnRIaWRlc0V4cG9ydCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgY29kZUV4cG9ydEhpZGVzRXhwb3J0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgICJFeHBvcnRIaWRlc0V4cG9ydCIsIHRlbXBsYXRlRXhwb3J0SGlkZXNFeHBvcnQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lmlnbm9yZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cG9ydEhpZGVzRXhwb3J0KFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIFN0cmluZyB1cmkyID0gcmVsYXRpdml6ZVVyaSh1cmkyXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVFeHBvcnRIaWRlc0V4cG9ydCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkV4cG9ydCBvZiAnJHtuYW1lfScgKGZyb20gJyR7dXJpfScpIGhpZGVzIGV4cG9ydCBmcm9tICcke3VyaTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV8sICd1cmkyJzogdXJpMl99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwcmVzc2lvbk5vdE1ldGFkYXRhID0gbWVzc2FnZUV4cHJlc3Npb25Ob3RNZXRhZGF0YTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHByZXNzaW9uTm90TWV0YWRhdGEgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFeHByZXNzaW9uTm90TWV0YWRhdGEiLAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhpcyBjYW4ndCBiZSB1c2VkIGFzIG1ldGFkYXRhOyBtZXRhZGF0YSBzaG91bGQgYmUgYSByZWZlcmVuY2UgdG8gYSBjb21waWxlLXRpbWUgY29uc3RhbnQgdmFyaWFibGUsIG9yIGEgY2FsbCB0byBhIGNvbnN0YW50IGNvbnN0cnVjdG9yLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVFeHRlbmRpbmdFbnVtID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiInI25hbWUnIGlzIGFuIGVudW0gYW5kIGNhbid0IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0V4dGVuZGluZ0VudW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUV4dGVuZGluZ0VudW0gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkV4dGVuZGluZ0VudW0iLCB0ZW1wbGF0ZUV4dGVuZGluZ0VudW0sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYVEVORFNfRU5VTSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFeHRlbmRpbmdFbnVtKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXh0ZW5kaW5nRW51bSwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzIGFuIGVudW0gYW5kIGNhbid0IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUV4dGVuZGluZ1Jlc3RyaWN0ZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIicjbmFtZScgaXMgcmVzdHJpY3RlZCBhbmQgY2FuJ3QgYmUgZXh0ZW5kZWQgb3IgaW1wbGVtZW50ZWQuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRXh0ZW5kaW5nUmVzdHJpY3RlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRXh0ZW5kaW5nUmVzdHJpY3RlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRXh0ZW5kaW5nUmVzdHJpY3RlZCIsIHRlbXBsYXRlRXh0ZW5kaW5nUmVzdHJpY3RlZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhURU5EU19ESVNBTExPV0VEX0NMQVNTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4dGVuZGluZ1Jlc3RyaWN0ZWQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVFeHRlbmRpbmdSZXN0cmljdGVkLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiJyR7bmFtZX0nIGlzIHJlc3RyaWN0ZWQgYW5kIGNhbid0IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVybmFsQ2xhc3MgPSBtZXNzYWdlRXh0ZXJuYWxDbGFzczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHRlcm5hbENsYXNzID0gY29uc3QgTWVzc2FnZUNvZGUoIkV4dGVybmFsQ2xhc3MiLAogICAgaW5kZXg6IDMsCiAgICBtZXNzYWdlOiByIiIiQ2xhc3NlcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnZXh0ZXJuYWwnLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAnZXh0ZXJuYWwnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEJvZHkgPQogICAgbWVzc2FnZUV4dGVybmFsQ29uc3RydWN0b3JXaXRoQm9keTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEJvZHkgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEJvZHkiLAogICAgaW5kZXg6IDg3LAogICAgbWVzc2FnZTogciIiIkV4dGVybmFsIGNvbnN0cnVjdG9ycyBjYW4ndCBoYXZlIGEgYm9keS4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgYm9keSBvZiB0aGUgY29uc3RydWN0b3IsIG9yIHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVybmFsQ29uc3RydWN0b3JXaXRoRmllbGRJbml0aWFsaXplcnMgPQogICAgbWVzc2FnZUV4dGVybmFsQ29uc3RydWN0b3JXaXRoRmllbGRJbml0aWFsaXplcnM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhGaWVsZEluaXRpYWxpemVycyA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhGaWVsZEluaXRpYWxpemVycyIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYVEVSTkFMX0NPTlNUUlVDVE9SX1dJVEhfRklFTERfSU5JVElBTElaRVJTIl0sCiAgICAgICAgbWVzc2FnZTogciIiIkFuIGV4dGVybmFsIGNvbnN0cnVjdG9yIGNhbid0IGluaXRpYWxpemUgZmllbGRzLiIiIiwKICAgICAgICB0aXA6CiAgICAgICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGZpZWxkIGluaXRpYWxpemVycywgb3IgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ2V4dGVybmFsJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXh0ZXJuYWxFbnVtID0gbWVzc2FnZUV4dGVybmFsRW51bTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHRlcm5hbEVudW0gPSBjb25zdCBNZXNzYWdlQ29kZSgiRXh0ZXJuYWxFbnVtIiwKICAgIGluZGV4OiA1LAogICAgbWVzc2FnZTogciIiIkVudW1zIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdleHRlcm5hbCcuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVybmFsRmFjdG9yeVJlZGlyZWN0aW9uID0KICAgIG1lc3NhZ2VFeHRlcm5hbEZhY3RvcnlSZWRpcmVjdGlvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHRlcm5hbEZhY3RvcnlSZWRpcmVjdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkV4dGVybmFsRmFjdG9yeVJlZGlyZWN0aW9uIiwKICAgIGluZGV4OiA4NSwKICAgIG1lc3NhZ2U6IHIiIiJBIHJlZGlyZWN0aW5nIGZhY3RvcnkgY2FuJ3QgYmUgZXh0ZXJuYWwuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIHRoZSAnZXh0ZXJuYWwnIG1vZGlmaWVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHRlcm5hbEZhY3RvcnlXaXRoQm9keSA9IG1lc3NhZ2VFeHRlcm5hbEZhY3RvcnlXaXRoQm9keTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHRlcm5hbEZhY3RvcnlXaXRoQm9keSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkV4dGVybmFsRmFjdG9yeVdpdGhCb2R5IiwKICAgIGluZGV4OiA4NiwKICAgIG1lc3NhZ2U6IHIiIiJFeHRlcm5hbCBmYWN0b3JpZXMgY2FuJ3QgaGF2ZSBhIGJvZHkuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGJvZHkgb2YgdGhlIGZhY3RvcnksIG9yIHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVybmFsRmllbGQgPSBtZXNzYWdlRXh0ZXJuYWxGaWVsZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHRlcm5hbEZpZWxkID0gY29uc3QgTWVzc2FnZUNvZGUoIkV4dGVybmFsRmllbGQiLAogICAgaW5kZXg6IDUwLAogICAgbWVzc2FnZTogciIiIkZpZWxkcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnZXh0ZXJuYWwnLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAnZXh0ZXJuYWwnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHRlcm5hbE1ldGhvZFdpdGhCb2R5ID0gbWVzc2FnZUV4dGVybmFsTWV0aG9kV2l0aEJvZHk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXh0ZXJuYWxNZXRob2RXaXRoQm9keSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkV4dGVybmFsTWV0aG9kV2l0aEJvZHkiLAogICAgaW5kZXg6IDQ5LAogICAgbWVzc2FnZTogciIiIkFuIGV4dGVybmFsIG9yIG5hdGl2ZSBtZXRob2QgY2FuJ3QgaGF2ZSBhIGJvZHkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVybmFsVHlwZWRlZiA9IG1lc3NhZ2VFeHRlcm5hbFR5cGVkZWY7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXh0ZXJuYWxUeXBlZGVmID0gY29uc3QgTWVzc2FnZUNvZGUoIkV4dGVybmFsVHlwZWRlZiIsCiAgICBpbmRleDogNzYsCiAgICBtZXNzYWdlOiByIiIiVHlwZWRlZnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2V4dGVybmFsJy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ2V4dGVybmFsJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IHRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBoYXZlIG1vZGlmaWVyICcjbGV4ZW1lJyBoZXJlLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSByZW1vdmluZyAnI2xleGVtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRXh0cmFuZW91c01vZGlmaWVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVFeHRyYW5lb3VzTW9kaWZpZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgIkV4dHJhbmVvdXNNb2RpZmllciIsIHRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyLAogICAgICAgIGluZGV4OiA3Nyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXh0cmFuZW91c01vZGlmaWVyKFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4dHJhbmVvdXNNb2RpZmllciwKICAgICAgbWVzc2FnZTogIiIiQ2FuJ3QgaGF2ZSBtb2RpZmllciAnJHtsZXhlbWV9JyBoZXJlLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcmVtb3ZpbmcgJyR7bGV4ZW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVGYWN0b3J5Tm90U3luYyA9IG1lc3NhZ2VGYWN0b3J5Tm90U3luYzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGYWN0b3J5Tm90U3luYyA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJGYWN0b3J5Tm90U3luYyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9OX1NZTkNfRkFDVE9SWSJdLAogICAgbWVzc2FnZTogciIiIkZhY3RvcnkgYm9kaWVzIGNhbid0IHVzZSAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRmFjdG9yeVRvcExldmVsRGVjbGFyYXRpb24gPQogICAgbWVzc2FnZUZhY3RvcnlUb3BMZXZlbERlY2xhcmF0aW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUZhY3RvcnlUb3BMZXZlbERlY2xhcmF0aW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRmFjdG9yeVRvcExldmVsRGVjbGFyYXRpb24iLAogICAgaW5kZXg6IDc4LAogICAgbWVzc2FnZTogciIiIlRvcC1sZXZlbCBkZWNsYXJhdGlvbnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2ZhY3RvcnknLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAnZmFjdG9yeScuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUZhc3RhQ0xJQXJndW1lbnRSZXF1aXJlZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRXhwZWN0ZWQgdmFsdWUgYWZ0ZXIgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGYXN0YUNMSUFyZ3VtZW50UmVxdWlyZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUZhc3RhQ0xJQXJndW1lbnRSZXF1aXJlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiRmFzdGFDTElBcmd1bWVudFJlcXVpcmVkIiwKICB0ZW1wbGF0ZUZhc3RhQ0xJQXJndW1lbnRSZXF1aXJlZCwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGYXN0YUNMSUFyZ3VtZW50UmVxdWlyZWQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVGYXN0YUNMSUFyZ3VtZW50UmVxdWlyZWQsCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkIHZhbHVlIGFmdGVyICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVGYXN0YVVzYWdlTG9uZyA9IG1lc3NhZ2VGYXN0YVVzYWdlTG9uZzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGYXN0YVVzYWdlTG9uZyA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiRmFzdGFVc2FnZUxvbmciLCBtZXNzYWdlOiByIiIiU3VwcG9ydGVkIG9wdGlvbnM6CgogIC1vIDxmaWxlPiwgLS1vdXRwdXQ9PGZpbGU+CiAgICBHZW5lcmF0ZSB0aGUgb3V0cHV0IGludG8gPGZpbGU+LgoKICAtaCwgL2gsIC8/LCAtLWhlbHAKICAgIERpc3BsYXkgdGhpcyBtZXNzYWdlIChhZGQgLXYgZm9yIGluZm9ybWF0aW9uIGFib3V0IGFsbCBvcHRpb25zKS4KCiAgLXYsIC0tdmVyYm9zZQogICAgRGlzcGxheSB2ZXJib3NlIGluZm9ybWF0aW9uLgoKICAtRG5hbWUKICAtRG5hbWU9dmFsdWUKICAgIERlZmluZSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiB0aGUgY29tcGlsZS10aW1lIGVudmlyb25tZW50LgoKICAtLW5vLWRlZmluZXMKICAgIElnbm9yZSBhbGwgLUQgb3B0aW9ucyBhbmQgbGVhdmUgZW52aXJvbm1lbnQgY29uc3RhbnRzIHVuZXZhbHVhdGVkLgoKICAtLQogICAgU3RvcCBvcHRpb24gcGFyc2luZywgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgbGluZSBpcyBhc3N1bWVkIHRvIGJlCiAgICBmaWxlIG5hbWVzIG9yIGFyZ3VtZW50cyB0byB0aGUgRGFydCBwcm9ncmFtLgoKICAtLXBhY2thZ2VzPTxmaWxlPgogICAgVXNlIHBhY2thZ2UgcmVzb2x1dGlvbiBjb25maWd1cmF0aW9uIDxmaWxlPiwgd2hpY2ggc2hvdWxkIGNvbnRhaW4gYSBtYXBwaW5nCiAgICBvZiBwYWNrYWdlIG5hbWVzIHRvIHBhdGhzLgoKICAtLXBsYXRmb3JtPTxmaWxlPgogICAgUmVhZCB0aGUgU0RLIHBsYXRmb3JtIGZyb20gPGZpbGU+LCB3aGljaCBzaG91bGQgYmUgaW4gRGlsbC9LZXJuZWwgSVIgZm9ybWF0CiAgICBhbmQgY29udGFpbiB0aGUgRGFydCBTREsuCgogIC0tdGFyZ2V0PWRhcnQyanN8ZGFydDJqc19zZXJ2ZXJ8ZGFydF9ydW5uZXJ8Zmx1dHRlcnxmbHV0dGVyX3J1bm5lcnxub25lfHZtCiAgICBTcGVjaWZ5IHRoZSB0YXJnZXQgY29uZmlndXJhdGlvbi4KCiAgLS1lbmFibGUtYXNzZXJ0cwogICAgQ2hlY2sgYXNzZXJ0cyBpbiBpbml0aWFsaXplcnMgZHVyaW5nIGNvbnN0YW50IGV2YWx1YXRpb24uCgogIC0tdmVyaWZ5CiAgICBDaGVjayB0aGF0IHRoZSBnZW5lcmF0ZWQgb3V0cHV0IGlzIGZyZWUgb2YgdmFyaW91cyBwcm9ibGVtcy4gVGhpcyBpcyBtb3N0bHkKICAgIHVzZWZ1bCBmb3IgZGV2ZWxvcGVycyBvZiB0aGlzIGNvbXBpbGVyIG9yIEtlcm5lbCB0cmFuc2Zvcm1hdGlvbnMuCgogIC0tZHVtcC1pcgogICAgUHJpbnQgY29tcGlsZWQgbGlicmFyaWVzIGluIEtlcm5lbCBzb3VyY2Ugbm90YXRpb24uCgogIC0tb21pdC1wbGF0Zm9ybQogICAgRXhjbHVkZSB0aGUgcGxhdGZvcm0gZnJvbSB0aGUgc2VyaWFsaXplZCBkaWxsIGZpbGUuCgogIC0tYnl0ZWNvZGUKICAgIEdlbmVyYXRlIGJ5dGVjb2RlLiBTdXBwb3J0ZWQgb25seSBmb3IgU0RLIHBsYXRmb3JtIGNvbXBpbGF0aW9uLgoKICAtLWV4Y2x1ZGUtc291cmNlCiAgICBEbyBub3QgaW5jbHVkZSBzb3VyY2UgY29kZSBpbiB0aGUgZGlsbCBmaWxlLgoKICAtLWNvbXBpbGUtc2RrPTxzZGs+CiAgICBDb21waWxlIHRoZSBTREsgZnJvbSBzY3JhdGNoIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIGEgLmRpbGwgZmlsZQogICAgKHNlZSAtLXBsYXRmb3JtKS4KCiAgLS1zZGs9PHNkaz4KICAgIExvY2F0aW9uIG9mIHRoZSBTREsgc291cmNlcyBmb3IgdXNlIHdoZW4gY29tcGlsaW5nIGFkZGl0aW9uYWwgcGxhdGZvcm0KICAgIGxpYnJhcmllcy4KCiAgLS1zdXBlcm1peGluCiAgICBJZ25vcmVkIGZvciBub3cuCgogIC0tc2luZ2xlLXJvb3Qtc2NoZW1lPVN0cmluZwogIC0tc2luZ2xlLXJvb3QtYmFzZT08ZGlyPgogICAgU3BlY2lmeSBhIGN1c3RvbSBVUkkgc2NoZW1lIGFuZCBhIGxvY2F0aW9uIG9uIGRpc2sgd2hlcmUgc3VjaCBVUklzIGFyZQogICAgbWFwcGVkIHRvLgoKICAgIFdoZW4gc3BlY2lmaWVkLCB0aGUgY29tcGlsZXIgY2FuIGJlIGludm9rZWQgd2l0aCBpbnB1dHMgdXNpbmcgdGhlIGN1c3RvbQogICAgVVJJIHNjaGVtZS4gVGhlIGNvbXBpbGVyIGNhbiBpZ25vcmUgdGhlIGV4YWN0IGxvY2F0aW9uIG9mIGZpbGVzIG9uIGRpc2sKICAgIGFuZCBhcyBhIHJlc3VsdCB0byBwcm9kdWNlIG91dHB1dCB0aGF0IGlzIGluZGVwZW5kZW5kZW50IG9mIHRoZSBhYnNvbHV0ZQogICAgbG9jYXRpb24gb2YgZmlsZXMgb24gZGlzay4gVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvciBpbnRlZ3JhdGluZyB3aXRoCiAgICBidWlsZCBzeXN0ZW1zLgoKICAtLWZhdGFsPWVycm9ycwogIC0tZmF0YWw9d2FybmluZ3MKICAgIE1ha2VzIG1lc3NhZ2VzIG9mIHRoZSBnaXZlbiBraW5kcyBmYXRhbCwgdGhhdCBpcywgaW1tZWRpYXRlbHkgc3RvcCB0aGUKICAgIGNvbXBpbGVyIHdpdGggYSBub24temVybyBleGl0LWNvZGUuIEluIC0tdmVyYm9zZSBtb2RlLCBhbHNvIGRpc3BsYXkgYW4KICAgIGludGVybmFsIHN0YWNrIHRyYWNlIGZyb20gdGhlIGNvbXBpbGVyLiBNdWx0aXBsZSBraW5kcyBjYW4gYmUgc2VwYXJhdGVkIGJ5CiAgICBjb21tYXMsIGZvciBleGFtcGxlLCAtLWZhdGFsPWVycm9ycyx3YXJuaW5ncy4KCiAgLS1lbmFibGUtZXhwZXJpbWVudD08ZmxhZz4KICAgIEVuYWJsZSBvciBkaXNhYmxlIGFuIGV4cGVyaW1lbnRhbCBmbGFnLCB1c2VkIHRvIGd1YXJkIGZlYXR1cmVzIGN1cnJlbnRseQogICAgaW4gZGV2ZWxvcG1lbnQuIFByZWZpeCBhbiBleHBlcmltZW50IG5hbWUgd2l0aCAnbm8tJyB0byBkaXNhYmxlIGl0LgogICAgTXVsdGlwbGUgZXhwZXJpbWVudHMgY2FuIGJlIHNlcGFyYXRlZCBieSBjb21tYXMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUZhc3RhVXNhZ2VTaG9ydCA9IG1lc3NhZ2VGYXN0YVVzYWdlU2hvcnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRmFzdGFVc2FnZVNob3J0ID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJGYXN0YVVzYWdlU2hvcnQiLCBtZXNzYWdlOiByIiIiRnJlcXVlbnRseSB1c2VkIG9wdGlvbnM6CgogIC1vIDxmaWxlPiBHZW5lcmF0ZSB0aGUgb3V0cHV0IGludG8gPGZpbGU+LgogIC1oICAgICAgICBEaXNwbGF5IHRoaXMgbWVzc2FnZSAoYWRkIC12IGZvciBpbmZvcm1hdGlvbiBhYm91dCBhbGwgb3B0aW9ucykuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+CiAgICB0ZW1wbGF0ZUZmaURhcnRUeXBlTWlzbWF0Y2ggPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRXhwZWN0ZWQgJyN0eXBlJyB0byBiZSBhIHN1YnR5cGUgb2YgJyN0eXBlMicuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmZpRGFydFR5cGVNaXNtYXRjaCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+CiAgICBjb2RlRmZpRGFydFR5cGVNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICJGZmlEYXJ0VHlwZU1pc21hdGNoIiwKICB0ZW1wbGF0ZUZmaURhcnRUeXBlTWlzbWF0Y2gsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmZpRGFydFR5cGVNaXNtYXRjaChEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZmaURhcnRUeXBlTWlzbWF0Y2gsCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkICcke3R5cGV9JyB0byBiZSBhIHN1YnR5cGUgb2YgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVGZmlFeHRlbmRzT3JJbXBsZW1lbnRzU2VhbGVkQ2xhc3MgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNsYXNzICcjbmFtZScgY2Fubm90IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZmaUV4dGVuZHNPckltcGxlbWVudHNTZWFsZWRDbGFzcyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUZmaUV4dGVuZHNPckltcGxlbWVudHNTZWFsZWRDbGFzcyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiRmZpRXh0ZW5kc09ySW1wbGVtZW50c1NlYWxlZENsYXNzIiwKICB0ZW1wbGF0ZUZmaUV4dGVuZHNPckltcGxlbWVudHNTZWFsZWRDbGFzcywKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGZmlFeHRlbmRzT3JJbXBsZW1lbnRzU2VhbGVkQ2xhc3MoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVGZmlFeHRlbmRzT3JJbXBsZW1lbnRzU2VhbGVkQ2xhc3MsCiAgICAgIG1lc3NhZ2U6ICIiIkNsYXNzICcke25hbWV9JyBjYW5ub3QgYmUgZXh0ZW5kZWQgb3IgaW1wbGVtZW50ZWQuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVGZmlGaWVsZEFubm90YXRpb24gPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkZpZWxkICcjbmFtZScgcmVxdWlyZXMgZXhhY3RseSBvbmUgYW5ub3RhdGlvbiB0byBkZWNsYXJlIGl0cyBDKysgdHlwZSwgd2hpY2ggY2Fubm90IGJlIFZvaWQuIGRhcnQ6ZmZpIFN0cnVjdHMgY2Fubm90IGhhdmUgcmVndWxhciBEYXJ0IGZpZWxkcy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZmaUZpZWxkQW5ub3RhdGlvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRmZpRmllbGRBbm5vdGF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICJGZmlGaWVsZEFubm90YXRpb24iLAogIHRlbXBsYXRlRmZpRmllbGRBbm5vdGF0aW9uLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZmaUZpZWxkQW5ub3RhdGlvbihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZmaUZpZWxkQW5ub3RhdGlvbiwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkZpZWxkICcke25hbWV9JyByZXF1aXJlcyBleGFjdGx5IG9uZSBhbm5vdGF0aW9uIHRvIGRlY2xhcmUgaXRzIEMrKyB0eXBlLCB3aGljaCBjYW5ub3QgYmUgVm9pZC4gZGFydDpmZmkgU3RydWN0cyBjYW5ub3QgaGF2ZSByZWd1bGFyIERhcnQgZmllbGRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlRmZpRmllbGRJbml0aWFsaXplciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiRmllbGQgJyNuYW1lJyBpcyBhIGRhcnQ6ZmZpIFBvaW50ZXIgdG8gYSBzdHJ1Y3QgZmllbGQgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNvbnN0cnVjdG9yIGV4ZWN1dGlvbi4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZmaUZpZWxkSW5pdGlhbGl6ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUZmaUZpZWxkSW5pdGlhbGl6ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIkZmaUZpZWxkSW5pdGlhbGl6ZXIiLAogIHRlbXBsYXRlRmZpRmllbGRJbml0aWFsaXplciwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGZmlGaWVsZEluaXRpYWxpemVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmZpRmllbGRJbml0aWFsaXplciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkZpZWxkICcke25hbWV9JyBpcyBhIGRhcnQ6ZmZpIFBvaW50ZXIgdG8gYSBzdHJ1Y3QgZmllbGQgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNvbnN0cnVjdG9yIGV4ZWN1dGlvbi4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUZmaUZpZWxkTm9Bbm5vdGF0aW9uID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJGaWVsZCAnI25hbWUnIHJlcXVpcmVzIG5vIGFubm90YXRpb24gdG8gZGVjbGFyZSBpdHMgQysrIHR5cGUsIGl0IGlzIGEgUG9pbnRlciB3aGljaCBpcyByZXByZXNlbnRlZCBieSB0aGUgc2FtZSB0eXBlIGluIERhcnQgYW5kIEMrKy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZmaUZpZWxkTm9Bbm5vdGF0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVGZmlGaWVsZE5vQW5ub3RhdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiRmZpRmllbGROb0Fubm90YXRpb24iLAogIHRlbXBsYXRlRmZpRmllbGROb0Fubm90YXRpb24sCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmZpRmllbGROb0Fubm90YXRpb24oU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVGZmlGaWVsZE5vQW5ub3RhdGlvbiwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkZpZWxkICcke25hbWV9JyByZXF1aXJlcyBubyBhbm5vdGF0aW9uIHRvIGRlY2xhcmUgaXRzIEMrKyB0eXBlLCBpdCBpcyBhIFBvaW50ZXIgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHNhbWUgdHlwZSBpbiBEYXJ0IGFuZCBDKysuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVGZmlOb3RTdGF0aWMgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIiNuYW1lIGV4cGVjdHMgYSBzdGF0aWMgZnVuY3Rpb24gYXMgcGFyYW1ldGVyLiBkYXJ0OmZmaSBvbmx5IHN1cHBvcnRzIGNhbGxpbmcgc3RhdGljIERhcnQgZnVuY3Rpb25zIGZyb20gYy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZmaU5vdFN0YXRpYyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRmZpTm90U3RhdGljID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICJGZmlOb3RTdGF0aWMiLAogIHRlbXBsYXRlRmZpTm90U3RhdGljLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZmaU5vdFN0YXRpYyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZmaU5vdFN0YXRpYywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIiR7bmFtZX0gZXhwZWN0cyBhIHN0YXRpYyBmdW5jdGlvbiBhcyBwYXJhbWV0ZXIuIGRhcnQ6ZmZpIG9ubHkgc3VwcG9ydHMgY2FsbGluZyBzdGF0aWMgRGFydCBmdW5jdGlvbnMgZnJvbSBjLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUZmaVN0cnVjdEdlbmVyaWMgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlN0cnVjdCAnI25hbWUnIHNob3VsZCBub3QgYmUgZ2VuZXJpYy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGZmlTdHJ1Y3RHZW5lcmljKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVGZmlTdHJ1Y3RHZW5lcmljID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICJGZmlTdHJ1Y3RHZW5lcmljIiwKICB0ZW1wbGF0ZUZmaVN0cnVjdEdlbmVyaWMsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmZpU3RydWN0R2VuZXJpYyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZmaVN0cnVjdEdlbmVyaWMsCiAgICAgIG1lc3NhZ2U6ICIiIlN0cnVjdCAnJHtuYW1lfScgc2hvdWxkIG5vdCBiZSBnZW5lcmljLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSk+IHRlbXBsYXRlRmZpVHlwZUludmFsaWQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkV4cGVjdGVkIHR5cGUgJyN0eXBlJyB0byBiZSBhIHZhbGlkIGFuZCBpbnN0YW50aWF0ZWQgc3VidHlwZSBvZiAnTmF0aXZlVHlwZScuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGZmlUeXBlSW52YWxpZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUpPiBjb2RlRmZpVHlwZUludmFsaWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4oCiAgIkZmaVR5cGVJbnZhbGlkIiwKICB0ZW1wbGF0ZUZmaVR5cGVJbnZhbGlkLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZmaVR5cGVJbnZhbGlkKERhcnRUeXBlIF90eXBlKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmZpVHlwZUludmFsaWQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJFeHBlY3RlZCB0eXBlICcke3R5cGV9JyB0byBiZSBhIHZhbGlkIGFuZCBpbnN0YW50aWF0ZWQgc3VidHlwZSBvZiAnTmF0aXZlVHlwZScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUzKT4gdGVtcGxhdGVGZmlUeXBlTWlzbWF0Y2ggPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIERhcnRUeXBlIF90eXBlMyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJFeHBlY3RlZCB0eXBlICcjdHlwZScgdG8gYmUgJyN0eXBlMicsIHdoaWNoIGlzIHRoZSBEYXJ0IHR5cGUgY29ycmVzcG9uZGluZyB0byAnI3R5cGUzJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZmaVR5cGVNaXNtYXRjaCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgRGFydFR5cGUgX3R5cGUzKT4KICAgIGNvZGVGZmlUeXBlTWlzbWF0Y2ggPSBjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgRGFydFR5cGUgX3R5cGUzKT4oCiAgIkZmaVR5cGVNaXNtYXRjaCIsCiAgdGVtcGxhdGVGZmlUeXBlTWlzbWF0Y2gsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmZpVHlwZU1pc21hdGNoKAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgRGFydFR5cGUgX3R5cGUzKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIExpc3Q8T2JqZWN0PiB0eXBlM1BhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUzKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUzID0gdHlwZTNQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVGZmlUeXBlTWlzbWF0Y2gsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJFeHBlY3RlZCB0eXBlICcke3R5cGV9JyB0byBiZSAnJHt0eXBlMn0nLCB3aGljaCBpcyB0aGUgRGFydCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gJyR7dHlwZTN9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMiwgJ3R5cGUzJzogX3R5cGUzfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZSk+IHRlbXBsYXRlRmZpVHlwZVVuc2l6ZWQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJNZXRob2QgJyNuYW1lJyBjYW5ub3QgYmUgY2FsbGVkIG9uIHNvbWV0aGluZyBvZiB0eXBlICcjdHlwZScgYXMgdGhpcyB0eXBlIGlzIHVuc2l6ZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGZmlUeXBlVW5zaXplZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlKT4gY29kZUZmaVR5cGVVbnNpemVkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUpPigKICAiRmZpVHlwZVVuc2l6ZWQiLAogIHRlbXBsYXRlRmZpVHlwZVVuc2l6ZWQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmZpVHlwZVVuc2l6ZWQoU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZmaVR5cGVVbnNpemVkLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiTWV0aG9kICcke25hbWV9JyBjYW5ub3QgYmUgY2FsbGVkIG9uIHNvbWV0aGluZyBvZiB0eXBlICcke3R5cGV9JyBhcyB0aGlzIHR5cGUgaXMgdW5zaXplZC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlRmZpV3JvbmdTdHJ1Y3RJbmhlcml0YW5jZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiU3RydWN0ICcjbmFtZScgbXVzdCBpbmhlcml0IGZyb20gJ1N0cnVjdDwjbmFtZT4nLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZmaVdyb25nU3RydWN0SW5oZXJpdGFuY2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUZmaVdyb25nU3RydWN0SW5oZXJpdGFuY2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIkZmaVdyb25nU3RydWN0SW5oZXJpdGFuY2UiLAogIHRlbXBsYXRlRmZpV3JvbmdTdHJ1Y3RJbmhlcml0YW5jZSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGZmlXcm9uZ1N0cnVjdEluaGVyaXRhbmNlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmZpV3JvbmdTdHJ1Y3RJbmhlcml0YW5jZSwKICAgICAgbWVzc2FnZTogIiIiU3RydWN0ICcke25hbWV9JyBtdXN0IGluaGVyaXQgZnJvbSAnU3RydWN0PCR7bmFtZX0+Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVGaWVsZEluaXRpYWxpemVkT3V0c2lkZURlY2xhcmluZ0NsYXNzID0KICAgIG1lc3NhZ2VGaWVsZEluaXRpYWxpemVkT3V0c2lkZURlY2xhcmluZ0NsYXNzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUZpZWxkSW5pdGlhbGl6ZWRPdXRzaWRlRGVjbGFyaW5nQ2xhc3MgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJGaWVsZEluaXRpYWxpemVkT3V0c2lkZURlY2xhcmluZ0NsYXNzIiwKICAgIGluZGV4OiA4OCwKICAgIG1lc3NhZ2U6IHIiIiJBIGZpZWxkIGNhbiBvbmx5IGJlIGluaXRpYWxpemVkIGluIGl0J3MgZGVjbGFyaW5nIGNsYXNzIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcGFzc2luZyBhIHZhbHVlIGludG8gdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IsIG9yIG1vdmluZyB0aGUgaW5pdGlhbGl6YXRpb24gaW50byB0aGUgY29uc3RydWN0b3IgYm9keS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRmllbGRJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvciA9CiAgICBtZXNzYWdlRmllbGRJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGaWVsZEluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9yID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRmllbGRJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvciIsCiAgICBpbmRleDogNzksCiAgICBtZXNzYWdlOiByIiIiRmllbGQgZm9ybWFsIHBhcmFtZXRlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIGNvbnN0cnVjdG9yLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyAndGhpcy4nLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVGaW5hbEFuZENvdmFyaWFudCA9IG1lc3NhZ2VGaW5hbEFuZENvdmFyaWFudDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGaW5hbEFuZENvdmFyaWFudCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkZpbmFsQW5kQ292YXJpYW50IiwKICAgIGluZGV4OiA4MCwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIk1lbWJlcnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgYm90aCAnZmluYWwnIGFuZCAnY292YXJpYW50Jy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgZWl0aGVyIHRoZSAnZmluYWwnIG9yICdjb3ZhcmlhbnQnIGtleXdvcmQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUZpbmFsQW5kVmFyID0gbWVzc2FnZUZpbmFsQW5kVmFyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUZpbmFsQW5kVmFyID0gY29uc3QgTWVzc2FnZUNvZGUoIkZpbmFsQW5kVmFyIiwKICAgIGluZGV4OiA4MSwKICAgIG1lc3NhZ2U6IHIiIiJNZW1iZXJzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlIGJvdGggJ2ZpbmFsJyBhbmQgJ3ZhcicuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIHRoZSBrZXl3b3JkICd2YXInLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUZpbmFsRmllbGROb3RJbml0aWFsaXplZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkZpbmFsIGZpZWxkICcjbmFtZScgaXMgbm90IGluaXRpYWxpemVkLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQgaW4gdGhlIGRlY2xhcmF0aW9uIG9yIGluIGV2ZXJ5IGNvbnN0cnVjdG9yLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmluYWxGaWVsZE5vdEluaXRpYWxpemVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkZpbmFsRmllbGROb3RJbml0aWFsaXplZCIsIHRlbXBsYXRlRmluYWxGaWVsZE5vdEluaXRpYWxpemVkLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJGSU5BTF9OT1RfSU5JVElBTElaRUQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmluYWxGaWVsZE5vdEluaXRpYWxpemVkKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmluYWxGaWVsZE5vdEluaXRpYWxpemVkLAogICAgICBtZXNzYWdlOiAiIiJGaW5hbCBmaWVsZCAnJHtuYW1lfScgaXMgbm90IGluaXRpYWxpemVkLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IHRvIGluaXRpYWxpemUgdGhlIGZpZWxkIGluIHRoZSBkZWNsYXJhdGlvbiBvciBpbiBldmVyeSBjb25zdHJ1Y3Rvci4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUZpbmFsRmllbGROb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3IgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkZpbmFsIGZpZWxkICcjbmFtZScgaXMgbm90IGluaXRpYWxpemVkIGJ5IHRoaXMgY29uc3RydWN0b3IuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSB0byBpbml0aWFsaXplIHRoZSBmaWVsZCB1c2luZyBhbiBpbml0aWFsaXppbmcgZm9ybWFsIG9yIGEgZmllbGQgaW5pdGlhbGl6ZXIuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICBjb2RlRmluYWxGaWVsZE5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRmluYWxGaWVsZE5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvciIsCiAgICAgICAgdGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJGSU5BTF9OT1RfSU5JVElBTElaRURfQ09OU1RSVUNUT1JfMSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmluYWxGaWVsZE5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkZpbmFsIGZpZWxkICcke25hbWV9JyBpcyBub3QgaW5pdGlhbGl6ZWQgYnkgdGhpcyBjb25zdHJ1Y3Rvci4iIiIsCiAgICAgIHRpcDoKICAgICAgICAgICIiIlRyeSB0byBpbml0aWFsaXplIHRoZSBmaWVsZCB1c2luZyBhbiBpbml0aWFsaXppbmcgZm9ybWFsIG9yIGEgZmllbGQgaW5pdGlhbGl6ZXIuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVyID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVGhlIGZpbmFsIHZhcmlhYmxlICcjbmFtZScgbXVzdCBiZSBpbml0aWFsaXplZC4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGFkZGluZyBhbiBpbml0aWFsaXplciAoJz0gPGV4cHJlc3Npb24+JykgdG8gdGhlIGRlY2xhcmF0aW9uLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplciIsIHRlbXBsYXRlRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRklOQUxfTk9UX0lOSVRJQUxJWkVEIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZpbmFsRmllbGRXaXRob3V0SW5pdGlhbGl6ZXIoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVyLAogICAgICBtZXNzYWdlOiAiIiJUaGUgZmluYWwgdmFyaWFibGUgJyR7bmFtZX0nIG11c3QgYmUgaW5pdGlhbGl6ZWQuIiIiLAogICAgICB0aXA6CiAgICAgICAgICAiIiJUcnkgYWRkaW5nIGFuIGluaXRpYWxpemVyICgnPSA8ZXhwcmVzc2lvbj4nKSB0byB0aGUgZGVjbGFyYXRpb24uIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiJyNuYW1lJyBpcyBhIGZpbmFsIGluc3RhbmNlIHZhcmlhYmxlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZCIsCiAgICAgICAgdGVtcGxhdGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkZJTkFMX0lOSVRJQUxJWkVEX01VTFRJUExFX1RJTUVTIl0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiJyR7bmFtZX0nIGlzIGEgZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRDYXVzZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyB3YXMgaW5pdGlhbGl6ZWQgaGVyZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czoKICAgICAgICAgICAgX3dpdGhBcmd1bWVudHNGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRDYXVzZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZENhdXNlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRDYXVzZSIsCiAgICAgICAgdGVtcGxhdGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRDYXVzZSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkQ2F1c2UoCiAgICBTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZENhdXNlLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgd2FzIGluaXRpYWxpemVkIGhlcmUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlCiAgICAgICAgICAgIF90eXBlMik+IHRlbXBsYXRlRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkEgdmFsdWUgb2YgdHlwZSAnI3R5cGUnIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSBjaGFuZ2luZyB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGb3JJbkxvb3BFbGVtZW50VHlwZU5vdEFzc2lnbmFibGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUZvckluTG9vcEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJGb3JJbkxvb3BFbGVtZW50VHlwZU5vdEFzc2lnbmFibGUiLAogICAgICAgIHRlbXBsYXRlRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJGT1JfSU5fT0ZfSU5WQUxJRF9FTEVNRU5UX1RZUEUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlKAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVGb3JJbkxvb3BFbGVtZW50VHlwZU5vdEFzc2lnbmFibGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJBIHZhbHVlIG9mIHR5cGUgJyR7dHlwZX0nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJUcnkgY2hhbmdpbmcgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUZvckluTG9vcEV4YWN0bHlPbmVWYXJpYWJsZSA9CiAgICBtZXNzYWdlRm9ySW5Mb29wRXhhY3RseU9uZVZhcmlhYmxlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUZvckluTG9vcEV4YWN0bHlPbmVWYXJpYWJsZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkZvckluTG9vcEV4YWN0bHlPbmVWYXJpYWJsZSIsCiAgICBtZXNzYWdlOiByIiIiQSBmb3ItaW4gbG9vcCBjYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgbG9vcCB2YXJpYWJsZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRm9ySW5Mb29wTm90QXNzaWduYWJsZSA9IG1lc3NhZ2VGb3JJbkxvb3BOb3RBc3NpZ25hYmxlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUZvckluTG9vcE5vdEFzc2lnbmFibGUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJGb3JJbkxvb3BOb3RBc3NpZ25hYmxlIiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkNhbid0IGFzc2lnbiB0byB0aGlzLCBzbyBpdCBjYW4ndCBiZSB1c2VkIGluIGEgZm9yLWluIGxvb3AuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUZvckluTG9vcFR5cGVOb3RJdGVyYWJsZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgdHlwZSAnI3R5cGUnIHVzZWQgaW4gdGhlICdmb3InIGxvb3AgbXVzdCBpbXBsZW1lbnQgJyN0eXBlMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGb3JJbkxvb3BUeXBlTm90SXRlcmFibGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUZvckluTG9vcFR5cGVOb3RJdGVyYWJsZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJGb3JJbkxvb3BUeXBlTm90SXRlcmFibGUiLCB0ZW1wbGF0ZUZvckluTG9vcFR5cGVOb3RJdGVyYWJsZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRk9SX0lOX09GX0lOVkFMSURfVFlQRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGb3JJbkxvb3BUeXBlTm90SXRlcmFibGUoCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZvckluTG9vcFR5cGVOb3RJdGVyYWJsZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSB0eXBlICcke3R5cGV9JyB1c2VkIGluIHRoZSAnZm9yJyBsb29wIG11c3QgaW1wbGVtZW50ICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlLCAndHlwZTInOiBfdHlwZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRm9ySW5Mb29wV2l0aENvbnN0VmFyaWFibGUgPQogICAgbWVzc2FnZUZvckluTG9vcFdpdGhDb25zdFZhcmlhYmxlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUZvckluTG9vcFdpdGhDb25zdFZhcmlhYmxlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRm9ySW5Mb29wV2l0aENvbnN0VmFyaWFibGUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkZPUl9JTl9XSVRIX0NPTlNUX1ZBUklBQkxFIl0sCiAgICBtZXNzYWdlOiByIiIiQSBmb3ItaW4gbG9vcC12YXJpYWJsZSBjYW4ndCBiZSAnY29uc3QnLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUgJ2NvbnN0JyBtb2RpZmllci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRnVuY3Rpb25UeXBlRGVmYXVsdFZhbHVlID0gbWVzc2FnZUZ1bmN0aW9uVHlwZURlZmF1bHRWYWx1ZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGdW5jdGlvblR5cGVEZWZhdWx0VmFsdWUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJGdW5jdGlvblR5cGVEZWZhdWx0VmFsdWUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkRFRkFVTFRfVkFMVUVfSU5fRlVOQ1RJT05fVFlQRSJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGluIGEgZnVuY3Rpb24gdHlwZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRnVuY3Rpb25UeXBlZFBhcmFtZXRlclZhciA9CiAgICBtZXNzYWdlRnVuY3Rpb25UeXBlZFBhcmFtZXRlclZhcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGdW5jdGlvblR5cGVkUGFyYW1ldGVyVmFyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRnVuY3Rpb25UeXBlZFBhcmFtZXRlclZhciIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRlVOQ1RJT05fVFlQRURfUEFSQU1FVEVSX1ZBUiJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiRnVuY3Rpb24tdHlwZWQgcGFyYW1ldGVycyBjYW4ndCBzcGVjaWZ5ICdjb25zdCcsICdmaW5hbCcgb3IgJ3ZhcicgaW4gcGxhY2Ugb2YgYSByZXR1cm4gdHlwZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVwbGFjaW5nIHRoZSBrZXl3b3JkIHdpdGggYSByZXR1cm4gdHlwZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlR2VuZXJhdG9yUmV0dXJuc1ZhbHVlID0gbWVzc2FnZUdlbmVyYXRvclJldHVybnNWYWx1ZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VHZW5lcmF0b3JSZXR1cm5zVmFsdWUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJHZW5lcmF0b3JSZXR1cm5zVmFsdWUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlJFVFVSTl9JTl9HRU5FUkFUT1IiXSwKICAgIG1lc3NhZ2U6IHIiIiInc3luYyonIGFuZCAnYXN5bmMqJyBjYW4ndCByZXR1cm4gYSB2YWx1ZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlR2VuZXJpY0Z1bmN0aW9uVHlwZUluQm91bmQgPQogICAgbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVJbkJvdW5kOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVJbkJvdW5kID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiR2VuZXJpY0Z1bmN0aW9uVHlwZUluQm91bmQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkdFTkVSSUNfRlVOQ1RJT05fVFlQRV9DQU5OT1RfQkVfQk9VTkQiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlR5cGUgdmFyaWFibGVzIGNhbid0IGhhdmUgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlcyBpbiB0aGVpciBib3VuZHMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUpPgogICAgdGVtcGxhdGVHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVW5leHBlY3RlZCBnZW5lcmljIGZ1bmN0aW9uIHR5cGUgJyN0eXBlJyBpbmZlcnJlZCBhcyBhIHR5cGUgYXJndW1lbnQuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOgogICAgICAgICAgICByIiIiVHJ5IHByb3ZpZGluZyBhIG5vbi1nZW5lcmljIGZ1bmN0aW9uIHR5cGUgZXhwbGljaXRseS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czoKICAgICAgICAgICAgX3dpdGhBcmd1bWVudHNHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUpPgogICAgY29kZUdlbmVyaWNGdW5jdGlvblR5cGVJbmZlcnJlZEFzQWN0dWFsVHlwZUFyZ3VtZW50ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSk+KAogICAgICAgICJHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudCIsCiAgICAgICAgdGVtcGxhdGVHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiR0VORVJJQ19GVU5DVElPTl9DQU5OT1RfQkVfVFlQRV9BUkdVTUVOVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudCgKICAgIERhcnRUeXBlIF90eXBlKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJVbmV4cGVjdGVkIGdlbmVyaWMgZnVuY3Rpb24gdHlwZSAnJHt0eXBlfScgaW5mZXJyZWQgYXMgYSB0eXBlIGFyZ3VtZW50LiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJUcnkgcHJvdmlkaW5nIGEgbm9uLWdlbmVyaWMgZnVuY3Rpb24gdHlwZSBleHBsaWNpdGx5LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVHZW5lcmljRnVuY3Rpb25UeXBlVXNlZEFzQWN0dWFsVHlwZUFyZ3VtZW50ID0KICAgIG1lc3NhZ2VHZW5lcmljRnVuY3Rpb25UeXBlVXNlZEFzQWN0dWFsVHlwZUFyZ3VtZW50OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnQgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnQiLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJHRU5FUklDX0ZVTkNUSU9OX0NBTk5PVF9CRV9UWVBFX0FSR1VNRU5UIl0sCiAgICAgICAgbWVzc2FnZToKICAgICAgICAgICAgciIiIlVuZXhwZWN0ZWQgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlIGZvdW5kIGluIGEgdHlwZSBhcmd1bWVudC4iIiIsCiAgICAgICAgdGlwOiByIiIiVHJ5IHVzaW5nIGEgbm9uLWdlbmVyaWMgZnVuY3Rpb24gdHlwZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlR2V0dGVyTm90Rm91bmQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkdldHRlciBub3QgZm91bmQ6ICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzR2V0dGVyTm90Rm91bmQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUdldHRlck5vdEZvdW5kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJHZXR0ZXJOb3RGb3VuZCIsIHRlbXBsYXRlR2V0dGVyTm90Rm91bmQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVOREVGSU5FRF9HRVRURVIiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNHZXR0ZXJOb3RGb3VuZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUdldHRlck5vdEZvdW5kLAogICAgICBtZXNzYWdlOiAiIiJHZXR0ZXIgbm90IGZvdW5kOiAnJHtuYW1lfScuIiIiLCBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlR2V0dGVyV2l0aEZvcm1hbHMgPSBtZXNzYWdlR2V0dGVyV2l0aEZvcm1hbHM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlR2V0dGVyV2l0aEZvcm1hbHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJHZXR0ZXJXaXRoRm9ybWFscyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiR0VUVEVSX1dJVEhfUEFSQU1FVEVSUyJdLAogICAgbWVzc2FnZTogciIiIkEgZ2V0dGVyIGNhbid0IGhhdmUgZm9ybWFsIHBhcmFtZXRlcnMuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nICcoLi4uKScuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUlsbGVnYWxBc3NpZ25tZW50VG9Ob25Bc3NpZ25hYmxlID0KICAgIG1lc3NhZ2VJbGxlZ2FsQXNzaWdubWVudFRvTm9uQXNzaWduYWJsZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbGxlZ2FsQXNzaWdubWVudFRvTm9uQXNzaWduYWJsZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIklsbGVnYWxBc3NpZ25tZW50VG9Ob25Bc3NpZ25hYmxlIiwKICAgIGluZGV4OiA0NSwKICAgIG1lc3NhZ2U6IHIiIiJJbGxlZ2FsIGFzc2lnbm1lbnQgdG8gbm9uLWFzc2lnbmFibGUgZXhwcmVzc2lvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSWxsZWdhbEFzeW5jR2VuZXJhdG9yUmV0dXJuVHlwZSA9CiAgICBtZXNzYWdlSWxsZWdhbEFzeW5jR2VuZXJhdG9yUmV0dXJuVHlwZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbGxlZ2FsQXN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSWxsZWdhbEFzeW5jR2VuZXJhdG9yUmV0dXJuVHlwZSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSUxMRUdBTF9BU1lOQ19HRU5FUkFUT1JfUkVUVVJOX1RZUEUiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkZ1bmN0aW9ucyBtYXJrZWQgJ2FzeW5jKicgbXVzdCBoYXZlIGEgcmV0dXJuIHR5cGUgYXNzaWduYWJsZSB0byAnU3RyZWFtJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSWxsZWdhbEFzeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGUgPQogICAgbWVzc2FnZUlsbGVnYWxBc3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUlsbGVnYWxBc3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJJbGxlZ2FsQXN5bmNHZW5lcmF0b3JWb2lkUmV0dXJuVHlwZSIsCiAgICAgICAgbWVzc2FnZToKICAgICAgICAgICAgciIiIkZ1bmN0aW9ucyBtYXJrZWQgJ2FzeW5jKicgY2FuJ3QgaGF2ZSByZXR1cm4gdHlwZSAndm9pZCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUlsbGVnYWxBc3luY1JldHVyblR5cGUgPSBtZXNzYWdlSWxsZWdhbEFzeW5jUmV0dXJuVHlwZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbGxlZ2FsQXN5bmNSZXR1cm5UeXBlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSWxsZWdhbEFzeW5jUmV0dXJuVHlwZSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSUxMRUdBTF9BU1lOQ19SRVRVUk5fVFlQRSJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiRnVuY3Rpb25zIG1hcmtlZCAnYXN5bmMnIG11c3QgaGF2ZSBhIHJldHVybiB0eXBlIGFzc2lnbmFibGUgdG8gJ0Z1dHVyZScuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUlsbGVnYWxNaXhpbiA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVGhlIHR5cGUgJyNuYW1lJyBjYW4ndCBiZSBtaXhlZCBpbi4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbGxlZ2FsTWl4aW4pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUlsbGVnYWxNaXhpbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiSWxsZWdhbE1peGluIiwgdGVtcGxhdGVJbGxlZ2FsTWl4aW4sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklMTEVHQUxfTUlYSU4iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSWxsZWdhbE1peGluKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSWxsZWdhbE1peGluLAogICAgICBtZXNzYWdlOiAiIiJUaGUgdHlwZSAnJHtuYW1lfScgY2FuJ3QgYmUgbWl4ZWQgaW4uIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJDYW4ndCB1c2UgJyNuYW1lJyBhcyBhIG1peGluIGJlY2F1c2UgaXQgaGFzIGNvbnN0cnVjdG9ycy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9ycyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIklsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzIiwgdGVtcGxhdGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9ycywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTUlYSU5fREVDTEFSRVNfQ09OU1RSVUNUT1IiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnMoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9ycywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkNhbid0IHVzZSAnJHtuYW1lfScgYXMgYSBtaXhpbiBiZWNhdXNlIGl0IGhhcyBjb25zdHJ1Y3RvcnMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoaXMgY29uc3RydWN0b3IgcHJldmVudHMgdXNpbmcgJyNuYW1lJyBhcyBhIG1peGluLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0lsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0NhdXNlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0NhdXNlIiwKICAgICAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0lsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2UoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0NhdXNlLAogICAgICBtZXNzYWdlOiAiIiJUaGlzIGNvbnN0cnVjdG9yIHByZXZlbnRzIHVzaW5nICcke25hbWV9JyBhcyBhIG1peGluLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUpPiB0ZW1wbGF0ZUlsbGVnYWxSZWN1cnNpdmVUeXBlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJJbGxlZ2FsIHJlY3Vyc2l2ZSB0eXBlICcjdHlwZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSWxsZWdhbFJlY3Vyc2l2ZVR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4gY29kZUlsbGVnYWxSZWN1cnNpdmVUeXBlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSk+KAogICJJbGxlZ2FsUmVjdXJzaXZlVHlwZSIsCiAgdGVtcGxhdGVJbGxlZ2FsUmVjdXJzaXZlVHlwZSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbGxlZ2FsUmVjdXJzaXZlVHlwZShEYXJ0VHlwZSBfdHlwZSkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUlsbGVnYWxSZWN1cnNpdmVUeXBlLAogICAgICBtZXNzYWdlOiAiIiJJbGxlZ2FsIHJlY3Vyc2l2ZSB0eXBlICcke3R5cGV9Jy4iIiIgKyBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUlsbGVnYWxTeW5jR2VuZXJhdG9yUmV0dXJuVHlwZSA9CiAgICBtZXNzYWdlSWxsZWdhbFN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUlsbGVnYWxTeW5jR2VuZXJhdG9yUmV0dXJuVHlwZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIklsbGVnYWxTeW5jR2VuZXJhdG9yUmV0dXJuVHlwZSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSUxMRUdBTF9TWU5DX0dFTkVSQVRPUl9SRVRVUk5fVFlQRSJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiRnVuY3Rpb25zIG1hcmtlZCAnc3luYyonIG11c3QgaGF2ZSBhIHJldHVybiB0eXBlIGFzc2lnbmFibGUgdG8gJ0l0ZXJhYmxlJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSWxsZWdhbFN5bmNHZW5lcmF0b3JWb2lkUmV0dXJuVHlwZSA9CiAgICBtZXNzYWdlSWxsZWdhbFN5bmNHZW5lcmF0b3JWb2lkUmV0dXJuVHlwZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbGxlZ2FsU3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSWxsZWdhbFN5bmNHZW5lcmF0b3JWb2lkUmV0dXJuVHlwZSIsCiAgICBtZXNzYWdlOiByIiIiRnVuY3Rpb25zIG1hcmtlZCAnc3luYyonIGNhbid0IGhhdmUgcmV0dXJuIHR5cGUgJ3ZvaWQnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbXBsZW1lbnRzQmVmb3JlRXh0ZW5kcyA9IG1lc3NhZ2VJbXBsZW1lbnRzQmVmb3JlRXh0ZW5kczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbXBsZW1lbnRzQmVmb3JlRXh0ZW5kcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkltcGxlbWVudHNCZWZvcmVFeHRlbmRzIiwKICAgIGluZGV4OiA0NCwKICAgIG1lc3NhZ2U6IHIiIiJUaGUgZXh0ZW5kcyBjbGF1c2UgbXVzdCBiZSBiZWZvcmUgdGhlIGltcGxlbWVudHMgY2xhdXNlLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGV4dGVuZHMgY2xhdXNlIGJlZm9yZSB0aGUgaW1wbGVtZW50cyBjbGF1c2UuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUltcGxlbWVudHNCZWZvcmVPbiA9IG1lc3NhZ2VJbXBsZW1lbnRzQmVmb3JlT247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW1wbGVtZW50c0JlZm9yZU9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW1wbGVtZW50c0JlZm9yZU9uIiwKICAgIGluZGV4OiA0MywKICAgIG1lc3NhZ2U6IHIiIiJUaGUgb24gY2xhdXNlIG11c3QgYmUgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgbW92aW5nIHRoZSBvbiBjbGF1c2UgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW1wbGVtZW50c0JlZm9yZVdpdGggPSBtZXNzYWdlSW1wbGVtZW50c0JlZm9yZVdpdGg7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW1wbGVtZW50c0JlZm9yZVdpdGggPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbXBsZW1lbnRzQmVmb3JlV2l0aCIsCiAgICBpbmRleDogNDIsCiAgICBtZXNzYWdlOiByIiIiVGhlIHdpdGggY2xhdXNlIG11c3QgYmUgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgbW92aW5nIHRoZSB3aXRoIGNsYXVzZSBiZWZvcmUgdGhlIGltcGxlbWVudHMgY2xhdXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbXBsZW1lbnRzRnV0dXJlT3IgPSBtZXNzYWdlSW1wbGVtZW50c0Z1dHVyZU9yOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUltcGxlbWVudHNGdXR1cmVPciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkltcGxlbWVudHNGdXR1cmVPciIsCiAgICBtZXNzYWdlOiByIiIiJ0Z1dHVyZU9yJyBjYW4ndCBiZSB1c2VkIGluIGFuICdpbXBsZW1lbnRzJyBjbGF1c2UuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIGludCBjb3VudCk+CiAgICB0ZW1wbGF0ZUltcGxlbWVudHNSZXBlYXRlZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBpbnQgY291bnQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiInI25hbWUnIGNhbiBvbmx5IGJlIGltcGxlbWVudGVkIG9uY2UuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHJlbW92aW5nICNjb3VudCBvZiB0aGUgb2NjdXJyZW5jZXMuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW1wbGVtZW50c1JlcGVhdGVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgaW50IGNvdW50KT4gY29kZUltcGxlbWVudHNSZXBlYXRlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIGludCBjb3VudCk+KAogICAgICAgICJJbXBsZW1lbnRzUmVwZWF0ZWQiLCB0ZW1wbGF0ZUltcGxlbWVudHNSZXBlYXRlZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU1QTEVNRU5UU19SRVBFQVRFRCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbXBsZW1lbnRzUmVwZWF0ZWQoU3RyaW5nIG5hbWUsIGludCBjb3VudCkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAoY291bnQgPT0gbnVsbCkgdGhyb3cgJ05vIGNvdW50IHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUltcGxlbWVudHNSZXBlYXRlZCwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGNhbiBvbmx5IGJlIGltcGxlbWVudGVkIG9uY2UuIiIiLAogICAgICB0aXA6ICIiIlRyeSByZW1vdmluZyAke2NvdW50fSBvZiB0aGUgb2NjdXJyZW5jZXMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICdjb3VudCc6IGNvdW50fSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlSW1wbGVtZW50c1N1cGVyQ2xhc3MgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIicjbmFtZScgY2FuJ3QgYmUgdXNlZCBpbiBib3RoICdleHRlbmRzJyBhbmQgJ2ltcGxlbWVudHMnIGNsYXVzZXMuIiIiLAogICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgcmVtb3Zpbmcgb25lIG9mIHRoZSBvY2N1cnJlbmNlcy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ltcGxlbWVudHNTdXBlckNsYXNzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVJbXBsZW1lbnRzU3VwZXJDbGFzcyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiSW1wbGVtZW50c1N1cGVyQ2xhc3MiLCB0ZW1wbGF0ZUltcGxlbWVudHNTdXBlckNsYXNzLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTVBMRU1FTlRTX1NVUEVSX0NMQVNTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ltcGxlbWVudHNTdXBlckNsYXNzKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW1wbGVtZW50c1N1cGVyQ2xhc3MsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiInJHtuYW1lfScgY2FuJ3QgYmUgdXNlZCBpbiBib3RoICdleHRlbmRzJyBhbmQgJ2ltcGxlbWVudHMnIGNsYXVzZXMuIiIiLAogICAgICB0aXA6ICIiIlRyeSByZW1vdmluZyBvbmUgb2YgdGhlIG9jY3VycmVuY2VzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZSk+IHRlbXBsYXRlSW1wbGljaXRDYWxsT2ZOb25NZXRob2QgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkNhbm5vdCBpbnZva2UgYW4gaW5zdGFuY2Ugb2YgJyN0eXBlJyBiZWNhdXNlIGl0IGRlY2xhcmVzICdjYWxsJyB0byBiZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIG1ldGhvZC4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGNoYW5naW5nICdjYWxsJyB0byBhIG1ldGhvZCBvciBleHBsaWNpdGx5IGludm9rZSAnY2FsbCcuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbXBsaWNpdENhbGxPZk5vbk1ldGhvZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUpPiBjb2RlSW1wbGljaXRDYWxsT2ZOb25NZXRob2QgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4oCiAgICAgICAgIkltcGxpY2l0Q2FsbE9mTm9uTWV0aG9kIiwgdGVtcGxhdGVJbXBsaWNpdENhbGxPZk5vbk1ldGhvZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU1QTElDSVRfQ0FMTF9PRl9OT05fTUVUSE9EIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ltcGxpY2l0Q2FsbE9mTm9uTWV0aG9kKERhcnRUeXBlIF90eXBlKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW1wbGljaXRDYWxsT2ZOb25NZXRob2QsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW5ub3QgaW52b2tlIGFuIGluc3RhbmNlIG9mICcke3R5cGV9JyBiZWNhdXNlIGl0IGRlY2xhcmVzICdjYWxsJyB0byBiZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIG1ldGhvZC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IGNoYW5naW5nICdjYWxsJyB0byBhIG1ldGhvZCBvciBleHBsaWNpdGx5IGludm9rZSAnY2FsbCcuIiIiLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZUltcGxpY2l0TWl4aW5PdmVycmlkZUNvbnRleHQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiT3ZlcnJpZGUgd2FzIGludHJvZHVjZWQgd2hlbiB0aGUgbWl4aW4gJyNuYW1lJyB3YXMgYXBwbGllZCB0byAnI25hbWUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ltcGxpY2l0TWl4aW5PdmVycmlkZUNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZUltcGxpY2l0TWl4aW5PdmVycmlkZUNvbnRleHQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgICAgICAiSW1wbGljaXRNaXhpbk92ZXJyaWRlQ29udGV4dCIsIHRlbXBsYXRlSW1wbGljaXRNaXhpbk92ZXJyaWRlQ29udGV4dCwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW1wbGljaXRNaXhpbk92ZXJyaWRlQ29udGV4dChTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUltcGxpY2l0TWl4aW5PdmVycmlkZUNvbnRleHQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJPdmVycmlkZSB3YXMgaW50cm9kdWNlZCB3aGVuIHRoZSBtaXhpbiAnJHtuYW1lfScgd2FzIGFwcGxpZWQgdG8gJyR7bmFtZTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ25hbWUyJzogbmFtZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW1wb3J0QWZ0ZXJQYXJ0ID0gbWVzc2FnZUltcG9ydEFmdGVyUGFydDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbXBvcnRBZnRlclBhcnQgPSBjb25zdCBNZXNzYWdlQ29kZSgiSW1wb3J0QWZ0ZXJQYXJ0IiwKICAgIGluZGV4OiAxMCwKICAgIG1lc3NhZ2U6IHIiIiJJbXBvcnQgZGlyZWN0aXZlcyBtdXN0IHByZWNlZGUgcGFydCBkaXJlY3RpdmVzLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGltcG9ydCBkaXJlY3RpdmVzIGJlZm9yZSB0aGUgcGFydCBkaXJlY3RpdmVzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIHRlbXBsYXRlSW1wb3J0SGlkZXNJbXBvcnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkltcG9ydCBvZiAnI25hbWUnIChmcm9tICcjdXJpJykgaGlkZXMgaW1wb3J0IGZyb20gJyN1cmkyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbXBvcnRIaWRlc0ltcG9ydCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgY29kZUltcG9ydEhpZGVzSW1wb3J0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgICJJbXBvcnRIaWRlc0ltcG9ydCIsIHRlbXBsYXRlSW1wb3J0SGlkZXNJbXBvcnQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lmlnbm9yZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ltcG9ydEhpZGVzSW1wb3J0KFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIFN0cmluZyB1cmkyID0gcmVsYXRpdml6ZVVyaSh1cmkyXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbXBvcnRIaWRlc0ltcG9ydCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkltcG9ydCBvZiAnJHtuYW1lfScgKGZyb20gJyR7dXJpfScpIGhpZGVzIGltcG9ydCBmcm9tICcke3VyaTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV8sICd1cmkyJzogdXJpMl99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlCiAgICAgICAgICAgIF90eXBlMik+IHRlbXBsYXRlSW5jb21wYXRpYmxlUmVkaXJlY3RlZUZ1bmN0aW9uVHlwZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gdHlwZSAnI3R5cGUnIGlzbid0IGEgc3VidHlwZSBvZiAnI3R5cGUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUluY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgICAgICAiSW5jb21wYXRpYmxlUmVkaXJlY3RlZUZ1bmN0aW9uVHlwZSIsCiAgICAgICAgdGVtcGxhdGVJbmNvbXBhdGlibGVSZWRpcmVjdGVlRnVuY3Rpb25UeXBlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJSRURJUkVDVF9UT19JTlZBTElEX1RZUEUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5jb21wYXRpYmxlUmVkaXJlY3RlZUZ1bmN0aW9uVHlwZSgKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5jb21wYXRpYmxlUmVkaXJlY3RlZUZ1bmN0aW9uVHlwZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0eXBlICcke3R5cGV9JyBpc24ndCBhIHN1YnR5cGUgb2YgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lMik+IHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUeXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjbmFtZTInLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgY2hhbmdpbmcgdHlwZSBhcmd1bWVudHMgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZUluY29ycmVjdFR5cGVBcmd1bWVudCA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIkluY29ycmVjdFR5cGVBcmd1bWVudCIsIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50KAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluY29ycmVjdFR5cGVBcmd1bWVudCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlR5cGUgYXJndW1lbnQgJyR7dHlwZX0nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyR7dHlwZTJ9JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnJHtuYW1lfScgb24gJyR7bmFtZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IGNoYW5naW5nIHR5cGUgYXJndW1lbnRzIHNvIHRoYXQgdGhleSBjb25mb3JtIHRvIHRoZSBib3VuZHMuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAndHlwZSc6IF90eXBlLAogICAgICAgICd0eXBlMic6IF90eXBlMiwKICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgJ25hbWUyJzogbmFtZTIKICAgICAgfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblJldHVyblR5cGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlR5cGUgYXJndW1lbnQgJyN0eXBlJyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcjdHlwZTInIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcjbmFtZScgb24gJyNuYW1lMicgaW4gdGhlIHJldHVybiB0eXBlLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgY2hhbmdpbmcgdHlwZSBhcmd1bWVudHMgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudEluUmV0dXJuVHlwZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZUluY29ycmVjdFR5cGVBcmd1bWVudEluUmV0dXJuVHlwZSA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIkluY29ycmVjdFR5cGVBcmd1bWVudEluUmV0dXJuVHlwZSIsCiAgICAgICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblJldHVyblR5cGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRZUEVfQVJHVU1FTlRfTk9UX01BVENISU5HX0JPVU5EUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRJblJldHVyblR5cGUoCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5SZXR1cm5UeXBlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVHlwZSBhcmd1bWVudCAnJHt0eXBlfScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnJHt0eXBlMn0nIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcke25hbWV9JyBvbiAnJHtuYW1lMn0nIGluIHRoZSByZXR1cm4gdHlwZS4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IGNoYW5naW5nIHR5cGUgYXJndW1lbnRzIHNvIHRoYXQgdGhleSBjb25mb3JtIHRvIHRoZSBib3VuZHMuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAndHlwZSc6IF90eXBlLAogICAgICAgICd0eXBlMic6IF90eXBlMiwKICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgJ25hbWUyJzogbmFtZTIKICAgICAgfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nIG5hbWUyLAogICAgICAgIFN0cmluZyBuYW1lMywKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTQpPiB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgU3RyaW5nIG5hbWUyLCBTdHJpbmcgbmFtZTMsIFN0cmluZyBuYW1lNCk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUeXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjbmFtZTInIGluIHRoZSBzdXBlcnR5cGUgJyNuYW1lMycgb2YgY2xhc3MgJyNuYW1lNCcuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBjaGFuZ2luZyB0eXBlIGFyZ3VtZW50cyBzbyB0aGF0IHRoZXkgY29uZm9ybSB0byB0aGUgYm91bmRzLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLAogICAgICAgICAgICBTdHJpbmcgbmFtZTIsIFN0cmluZyBuYW1lMywgU3RyaW5nIG5hbWU0KT4KICAgIGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZSA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTIsIFN0cmluZyBuYW1lMywgU3RyaW5nIG5hbWU0KT4oCiAgICAgICAgIkluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlIiwKICAgICAgICB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGUoRGFydFR5cGUgX3R5cGUsCiAgICBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIFN0cmluZyBuYW1lMywgU3RyaW5nIG5hbWU0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgaWYgKG5hbWUzLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMyA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTMpOwogIGlmIChuYW1lNC5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTQgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWU0KTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlR5cGUgYXJndW1lbnQgJyR7dHlwZX0nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyR7dHlwZTJ9JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnJHtuYW1lfScgb24gJyR7bmFtZTJ9JyBpbiB0aGUgc3VwZXJ0eXBlICcke25hbWUzfScgb2YgY2xhc3MgJyR7bmFtZTR9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDoKICAgICAgICAgICIiIlRyeSBjaGFuZ2luZyB0eXBlIGFyZ3VtZW50cyBzbyB0aGF0IHRoZXkgY29uZm9ybSB0byB0aGUgYm91bmRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7CiAgICAgICAgJ3R5cGUnOiBfdHlwZSwKICAgICAgICAndHlwZTInOiBfdHlwZTIsCiAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICduYW1lMic6IG5hbWUyLAogICAgICAgICduYW1lMyc6IG5hbWUzLAogICAgICAgICduYW1lNCc6IG5hbWU0CiAgICAgIH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZyBuYW1lMiwKICAgICAgICBTdHJpbmcgbmFtZTMsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWU0KT4gdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluZmVycmVkID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMiwKICAgICAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgIFN0cmluZyBuYW1lMiwKICAgICAgICAgICAgU3RyaW5nIG5hbWUzLAogICAgICAgICAgICBTdHJpbmcKICAgICAgICAgICAgICAgIG5hbWU0KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkluZmVycmVkIHR5cGUgYXJndW1lbnQgJyN0eXBlJyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcjdHlwZTInIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcjbmFtZScgb24gJyNuYW1lMicgaW4gdGhlIHN1cGVydHlwZSAnI25hbWUzJyBvZiBjbGFzcyAnI25hbWU0Jy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IHNwZWNpZnlpbmcgdHlwZSBhcmd1bWVudHMgZXhwbGljaXRseSBzbyB0aGF0IHRoZXkgY29uZm9ybSB0byB0aGUgYm91bmRzLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGVJbmZlcnJlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgIFN0cmluZyBuYW1lMiwgU3RyaW5nIG5hbWUzLCBTdHJpbmcgbmFtZTQpPgogICAgY29kZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlSW5mZXJyZWQgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUyLCBTdHJpbmcgbmFtZTMsIFN0cmluZyBuYW1lNCk+KAogICAgICAgICJJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluZmVycmVkIiwKICAgICAgICB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlSW5mZXJyZWQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRZUEVfQVJHVU1FTlRfTk9UX01BVENISU5HX0JPVU5EUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluZmVycmVkKERhcnRUeXBlIF90eXBlLAogICAgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBTdHJpbmcgbmFtZTMsIFN0cmluZyBuYW1lNCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIGlmIChuYW1lMy5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTMgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUzKTsKICBpZiAobmFtZTQuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWU0ID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lNCk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGVJbmZlcnJlZCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkluZmVycmVkIHR5cGUgYXJndW1lbnQgJyR7dHlwZX0nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyR7dHlwZTJ9JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnJHtuYW1lfScgb24gJyR7bmFtZTJ9JyBpbiB0aGUgc3VwZXJ0eXBlICcke25hbWUzfScgb2YgY2xhc3MgJyR7bmFtZTR9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDoKICAgICAgICAgICIiIlRyeSBzcGVjaWZ5aW5nIHR5cGUgYXJndW1lbnRzIGV4cGxpY2l0bHkgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICd0eXBlJzogX3R5cGUsCiAgICAgICAgJ3R5cGUyJzogX3R5cGUyLAogICAgICAgICduYW1lJzogbmFtZSwKICAgICAgICAnbmFtZTInOiBuYW1lMiwKICAgICAgICAnbmFtZTMnOiBuYW1lMywKICAgICAgICAnbmFtZTQnOiBuYW1lNAogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlIF90eXBlMiwKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluZmVycmVkID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJJbmZlcnJlZCB0eXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjbmFtZTInLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgc3BlY2lmeWluZyB0eXBlIGFyZ3VtZW50cyBleHBsaWNpdGx5IHNvIHRoYXQgdGhleSBjb25mb3JtIHRvIHRoZSBib3VuZHMuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmZlcnJlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZUluY29ycmVjdFR5cGVBcmd1bWVudEluZmVycmVkID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgICAgICAiSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5mZXJyZWQiLCB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluZmVycmVkLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5mZXJyZWQoCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5mZXJyZWQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJJbmZlcnJlZCB0eXBlIGFyZ3VtZW50ICcke3R5cGV9JyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcke3R5cGUyfScgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyR7bmFtZX0nIG9uICcke25hbWUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIlRyeSBzcGVjaWZ5aW5nIHR5cGUgYXJndW1lbnRzIGV4cGxpY2l0bHkgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICd0eXBlJzogX3R5cGUsCiAgICAgICAgJ3R5cGUyJzogX3R5cGUyLAogICAgICAgICduYW1lJzogbmFtZSwKICAgICAgICAnbmFtZTInOiBuYW1lMgogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlIF90eXBlMiwKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTMsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUzLAogICAgICAgICAgICBTdHJpbmcKICAgICAgICAgICAgICAgIG5hbWUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlR5cGUgYXJndW1lbnQgJyN0eXBlJyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcjdHlwZTInIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcjbmFtZScgb24gJyN0eXBlMy4jbmFtZTInLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgY2hhbmdpbmcgdHlwZSBhcmd1bWVudHMgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMywgU3RyaW5nIG5hbWUyKT4gY29kZUluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZCA9CiAgICBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUzLCBTdHJpbmcgbmFtZTIpPigKICAgICAgICAiSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkIiwKICAgICAgICB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVFlQRV9BUkdVTUVOVF9OT1RfTUFUQ0hJTkdfQk9VTkRTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZChEYXJ0VHlwZSBfdHlwZSwKICAgIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlMywgU3RyaW5nIG5hbWUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBMaXN0PE9iamVjdD4gdHlwZTNQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMyk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTMgPSB0eXBlM1BhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlR5cGUgYXJndW1lbnQgJyR7dHlwZX0nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyR7dHlwZTJ9JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnJHtuYW1lfScgb24gJyR7dHlwZTN9LiR7bmFtZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IGNoYW5naW5nIHR5cGUgYXJndW1lbnRzIHNvIHRoYXQgdGhleSBjb25mb3JtIHRvIHRoZSBib3VuZHMuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAndHlwZSc6IF90eXBlLAogICAgICAgICd0eXBlMic6IF90eXBlMiwKICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgJ3R5cGUzJzogX3R5cGUzLAogICAgICAgICduYW1lMic6IG5hbWUyCiAgICAgIH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIERhcnRUeXBlIF90eXBlMywKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZEluZmVycmVkID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUzLCBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiSW5mZXJyZWQgdHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI3R5cGUzLiNuYW1lMicuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBzcGVjaWZ5aW5nIHR5cGUgYXJndW1lbnRzIGV4cGxpY2l0bHkgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZEluZmVycmVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUzLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZUluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZEluZmVycmVkID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMywgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIkluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZEluZmVycmVkIiwKICAgICAgICB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZEluZmVycmVkLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkSW5mZXJyZWQoRGFydFR5cGUgX3R5cGUsCiAgICBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZTMsIFN0cmluZyBuYW1lMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUzUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTMpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUzID0gdHlwZTNQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkluZmVycmVkIHR5cGUgYXJndW1lbnQgJyR7dHlwZX0nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyR7dHlwZTJ9JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnJHtuYW1lfScgb24gJyR7dHlwZTN9LiR7bmFtZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IHNwZWNpZnlpbmcgdHlwZSBhcmd1bWVudHMgZXhwbGljaXRseSBzbyB0aGF0IHRoZXkgY29uZm9ybSB0byB0aGUgYm91bmRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7CiAgICAgICAgJ3R5cGUnOiBfdHlwZSwKICAgICAgICAndHlwZTInOiBfdHlwZTIsCiAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICd0eXBlMyc6IF90eXBlMywKICAgICAgICAnbmFtZTInOiBuYW1lMgogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50VmFyaWFibGUgPQogICAgbWVzc2FnZUluY29ycmVjdFR5cGVBcmd1bWVudFZhcmlhYmxlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUluY29ycmVjdFR5cGVBcmd1bWVudFZhcmlhYmxlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW5jb3JyZWN0VHlwZUFyZ3VtZW50VmFyaWFibGUiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOiByIiIiVGhpcyBpcyB0aGUgdHlwZSB2YXJpYWJsZSB3aG9zZSBib3VuZCBpc24ndCBjb25mb3JtZWQgdG8uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiB0ZW1wbGF0ZUluZmVycmVkUGFja2FnZVVyaSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiSW50ZXJwcmV0aW5nIHRoaXMgYXMgcGFja2FnZSBVUkksICcjdXJpJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbmZlcnJlZFBhY2thZ2VVcmkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gY29kZUluZmVycmVkUGFja2FnZVVyaSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgICAgICAiSW5mZXJyZWRQYWNrYWdlVXJpIiwgdGVtcGxhdGVJbmZlcnJlZFBhY2thZ2VVcmksCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luZmVycmVkUGFja2FnZVVyaShVcmkgdXJpXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5mZXJyZWRQYWNrYWdlVXJpLAogICAgICBtZXNzYWdlOiAiIiJJbnRlcnByZXRpbmcgdGhpcyBhcyBwYWNrYWdlIFVSSSwgJyR7dXJpfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3QgPSBtZXNzYWdlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkluaGVyaXRlZE1lbWJlcnNDb25mbGljdCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09ORkxJQ1RTX1dJVEhfSU5IRVJJVEVEX01FTUJFUiJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IGluaGVyaXQgbWVtYmVycyB0aGF0IGNvbmZsaWN0IHdpdGggZWFjaCBvdGhlci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UxID0KICAgIG1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTE7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UxID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UxIiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoaXMgaXMgb25lIGluaGVyaXRlZCBtZW1iZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMiA9CiAgICBtZXNzYWdlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMiIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwKICAgIG1lc3NhZ2U6IHIiIiJUaGlzIGlzIHRoZSBvdGhlciBpbmhlcml0ZWQgbWVtYmVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIHN0cmluZywKICAgICAgICBVcmkKICAgICAgICAgICAgdXJpXyk+IHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgVXJpIHVyaV8pPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVHJpZWQgdG8gaW5pdGlhbGl6ZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gKCNzdHJpbmcpLCBidXQgdGhlIGZpbGUgd2FzIG5vdCBzZWxmLWNvbnRhaW5lZC4gVGhpcyBtaWdodCBiZSBhIGJ1Zy4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGl0IGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvIHJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy4KSWYgeW91IGFyZSBjb21mb3J0YWJsZSB3aXRoIGl0LCBpdCB3b3VsZCBpbXByb3ZlIHRoZSBjaGFuY2VzIG9mIGZpeGluZyBhbnkgYnVnIGlmIHlvdSBpbmNsdWRlZCB0aGUgZmlsZSAjdXJpIGluIHlvdXIgZXJyb3IgcmVwb3J0LCBidXQgYmUgYXdhcmUgdGhhdCB0aGlzIGZpbGUgaW5jbHVkZXMgeW91ciBzb3VyY2UgY29kZS4KRWl0aGVyIHdheSwgeW91IHNob3VsZCBwcm9iYWJseSBkZWxldGUgdGhlIGZpbGUgc28gaXQgZG9lc24ndCB1c2UgdW5uZWNlc3NhcnkgZGlzayBzcGFjZS4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFVyaSB1cmlfKT4KICAgIGNvZGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBVcmkgdXJpXyk+KAogICAgICAgICJJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkIiwKICAgICAgICB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWQoCiAgICBTdHJpbmcgc3RyaW5nLCBVcmkgdXJpXykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVHJpZWQgdG8gaW5pdGlhbGl6ZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gKCR7c3RyaW5nfSksIGJ1dCB0aGUgZmlsZSB3YXMgbm90IHNlbGYtY29udGFpbmVkLiBUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LgpJZiB5b3UgYXJlIGNvbWZvcnRhYmxlIHdpdGggaXQsIGl0IHdvdWxkIGltcHJvdmUgdGhlIGNoYW5jZXMgb2YgZml4aW5nIGFueSBidWcgaWYgeW91IGluY2x1ZGVkIHRoZSBmaWxlICR7dXJpfSBpbiB5b3VyIGVycm9yIHJlcG9ydCwgYnV0IGJlIGF3YXJlIHRoYXQgdGhpcyBmaWxlIGluY2x1ZGVzIHlvdXIgc291cmNlIGNvZGUuCkVpdGhlciB3YXksIHlvdSBzaG91bGQgcHJvYmFibHkgZGVsZXRlIHRoZSBmaWxlIHNvIGl0IGRvZXNuJ3QgdXNlIHVubmVjZXNzYXJ5IGRpc2sgc3BhY2UuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPgogICAgdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgjc3RyaW5nKSwgYnV0IHRoZSBmaWxlIHdhcyBub3Qgc2VsZi1jb250YWluZWQuIFRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZE5vRHVtcCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICBjb2RlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZE5vRHVtcCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wIiwKICAgICAgICB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWROb0R1bXAsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWROb0R1bXAoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVHJpZWQgdG8gaW5pdGlhbGl6ZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gKCR7c3RyaW5nfSksIGJ1dCB0aGUgZmlsZSB3YXMgbm90IHNlbGYtY29udGFpbmVkLiBUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIHN0cmluZywKICAgICAgICBTdHJpbmcgc3RyaW5nMiwKICAgICAgICBTdHJpbmcgc3RyaW5nMywKICAgICAgICBVcmkKICAgICAgICAgICAgdXJpXyk+IHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW0gPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMsIFVyaSB1cmlfKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgjc3RyaW5nKSwgYnV0IGNvdWxkbid0LgpFcnJvciBtZXNzYWdlIHdhcyAnI3N0cmluZzInLgpTdGFja3RyYWNlIGluY2x1ZGVkICcjc3RyaW5nMycuClRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuCklmIHlvdSBhcmUgY29tZm9ydGFibGUgd2l0aCBpdCwgaXQgd291bGQgaW1wcm92ZSB0aGUgY2hhbmNlcyBvZiBmaXhpbmcgYW55IGJ1ZyBpZiB5b3UgaW5jbHVkZWQgdGhlIGZpbGUgI3VyaSBpbiB5b3VyIGVycm9yIHJlcG9ydCwgYnV0IGJlIGF3YXJlIHRoYXQgdGhpcyBmaWxlIGluY2x1ZGVzIHlvdXIgc291cmNlIGNvZGUuCkVpdGhlciB3YXksIHlvdSBzaG91bGQgcHJvYmFibHkgZGVsZXRlIHRoZSBmaWxlIHNvIGl0IGRvZXNuJ3QgdXNlIHVubmVjZXNzYXJ5IGRpc2sgc3BhY2UuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgc3RyaW5nMywgVXJpIHVyaV8pPgogICAgY29kZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgc3RyaW5nMywgVXJpIHVyaV8pPigKICAgICAgICAiSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW0iLAogICAgICAgIHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtKAogICAgU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIsIFN0cmluZyBzdHJpbmczLCBVcmkgdXJpXykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgaWYgKHN0cmluZzIuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgaWYgKHN0cmluZzMuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgke3N0cmluZ30pLCBidXQgY291bGRuJ3QuCkVycm9yIG1lc3NhZ2Ugd2FzICcke3N0cmluZzJ9Jy4KU3RhY2t0cmFjZSBpbmNsdWRlZCAnJHtzdHJpbmczfScuClRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuCklmIHlvdSBhcmUgY29tZm9ydGFibGUgd2l0aCBpdCwgaXQgd291bGQgaW1wcm92ZSB0aGUgY2hhbmNlcyBvZiBmaXhpbmcgYW55IGJ1ZyBpZiB5b3UgaW5jbHVkZWQgdGhlIGZpbGUgJHt1cml9IGluIHlvdXIgZXJyb3IgcmVwb3J0LCBidXQgYmUgYXdhcmUgdGhhdCB0aGlzIGZpbGUgaW5jbHVkZXMgeW91ciBzb3VyY2UgY29kZS4KRWl0aGVyIHdheSwgeW91IHNob3VsZCBwcm9iYWJseSBkZWxldGUgdGhlIGZpbGUgc28gaXQgZG9lc24ndCB1c2UgdW5uZWNlc3NhcnkgZGlzayBzcGFjZS4iIiIsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICdzdHJpbmcnOiBzdHJpbmcsCiAgICAgICAgJ3N0cmluZzInOiBzdHJpbmcyLAogICAgICAgICdzdHJpbmczJzogc3RyaW5nMywKICAgICAgICAndXJpJzogdXJpXwogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpPgogICAgdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbU5vRHVtcCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgc3RyaW5nMyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgjc3RyaW5nKSwgYnV0IGNvdWxkbid0LgpFcnJvciBtZXNzYWdlIHdhcyAnI3N0cmluZzInLgpTdGFja3RyYWNlIGluY2x1ZGVkICcjc3RyaW5nMycuClRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXApOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgc3RyaW5nMyk+CiAgICBjb2RlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXAgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgc3RyaW5nMyk+KAogICAgICAgICJJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbU5vRHVtcCIsCiAgICAgICAgdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbU5vRHVtcCwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkud2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXAoCiAgICBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChzdHJpbmcyLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChzdHJpbmczLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXAsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUcmllZCB0byBpbml0aWFsaXplIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiAoJHtzdHJpbmd9KSwgYnV0IGNvdWxkbid0LgpFcnJvciBtZXNzYWdlIHdhcyAnJHtzdHJpbmcyfScuClN0YWNrdHJhY2UgaW5jbHVkZWQgJyR7c3RyaW5nM30nLgpUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ3N0cmluZzInOiBzdHJpbmcyLCAnc3RyaW5nMyc6IHN0cmluZzN9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW5pdGlhbGl6ZWRWYXJpYWJsZUluRm9yRWFjaCA9CiAgICBtZXNzYWdlSW5pdGlhbGl6ZWRWYXJpYWJsZUluRm9yRWFjaDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbml0aWFsaXplZFZhcmlhYmxlSW5Gb3JFYWNoID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW5pdGlhbGl6ZWRWYXJpYWJsZUluRm9yRWFjaCIsCiAgICBpbmRleDogODIsCiAgICBtZXNzYWdlOiByIiIiVGhlIGxvb3AgdmFyaWFibGUgaW4gYSBmb3ItZWFjaCBsb29wIGNhbid0IGJlIGluaXRpYWxpemVkLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHJlbW92aW5nIHRoZSBpbml0aWFsaXplciwgb3IgdXNpbmcgYSBkaWZmZXJlbnQga2luZCBvZiBsb29wLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlSW5pdGlhbGl6ZXJGb3JTdGF0aWNGaWVsZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBpc24ndCBhbiBpbnN0YW5jZSBmaWVsZCBvZiB0aGlzIGNsYXNzLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVyRm9yU3RhdGljRmllbGQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUluaXRpYWxpemVyRm9yU3RhdGljRmllbGQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkluaXRpYWxpemVyRm9yU3RhdGljRmllbGQiLCB0ZW1wbGF0ZUluaXRpYWxpemVyRm9yU3RhdGljRmllbGQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOSVRJQUxJWkVSX0ZPUl9TVEFUSUNfRklFTEQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5pdGlhbGl6ZXJGb3JTdGF0aWNGaWVsZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluaXRpYWxpemVyRm9yU3RhdGljRmllbGQsCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpc24ndCBhbiBpbnN0YW5jZSBmaWVsZCBvZiB0aGlzIGNsYXNzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIk9ubHkgY29uc3RydWN0b3JzIGNhbiBoYXZlIGluaXRpYWxpemVycywgYW5kICcjbmFtZScgaXMgbm90IGEgY29uc3RydWN0b3IuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3Rvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9yIiwgdGVtcGxhdGVJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5JVElBTElaRVJfT1VUU0lERV9DT05TVFJVQ1RPUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9yLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiT25seSBjb25zdHJ1Y3RvcnMgY2FuIGhhdmUgaW5pdGlhbGl6ZXJzLCBhbmQgJyR7bmFtZX0nIGlzIG5vdCBhIGNvbnN0cnVjdG9yLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIHR5cGUgb2YgcGFyYW1ldGVyICcjbmFtZScsICcjdHlwZScgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCdzIHR5cGUsICcjdHlwZTInLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgY2hhbmdpbmcgdGhlIHR5cGUgb2YgcGFyYW1ldGVyICcjbmFtZScgdG8gYSBzdWJ0eXBlIG9mICcjdHlwZTInLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+CiAgICBjb2RlSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJJbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2giLAogICAgICAgIHRlbXBsYXRlSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX1BBUkFNRVRFUl9ERUNMQVJBVElPTiJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaCgKICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2gsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgdHlwZSBvZiBwYXJhbWV0ZXIgJyR7bmFtZX0nLCAnJHt0eXBlfScgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCdzIHR5cGUsICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIlRyeSBjaGFuZ2luZyB0aGUgdHlwZSBvZiBwYXJhbWV0ZXIgJyR7bmFtZX0nIHRvIGEgc3VidHlwZSBvZiAnJHt0eXBlMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndHlwZSc6IF90eXBlLCAndHlwZTInOiBfdHlwZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoRmllbGQgPQogICAgbWVzc2FnZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaEZpZWxkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaEZpZWxkID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJJbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2hGaWVsZCIsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICAgICAgbWVzc2FnZTogciIiIlRoZSBmaWVsZCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBwYXJhbWV0ZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiB0ZW1wbGF0ZUlucHV0RmlsZU5vdEZvdW5kID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJJbnB1dCBmaWxlIG5vdCBmb3VuZDogI3VyaS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnB1dEZpbGVOb3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiBjb2RlSW5wdXRGaWxlTm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgIklucHV0RmlsZU5vdEZvdW5kIiwKICB0ZW1wbGF0ZUlucHV0RmlsZU5vdEZvdW5kLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0lucHV0RmlsZU5vdEZvdW5kKFVyaSB1cmlfKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnB1dEZpbGVOb3RGb3VuZCwKICAgICAgbWVzc2FnZTogIiIiSW5wdXQgZmlsZSBub3QgZm91bmQ6ICR7dXJpfS4iIiIsIGFyZ3VtZW50czogeyd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgc3RyaW5nKT4gdGVtcGxhdGVJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgaW50ZWdlciBsaXRlcmFsICNzdHJpbmcgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgaW4gNjQgYml0cy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IHVzaW5nIHRoZSBCaWdJbnQgY2xhc3MgaWYgeW91IG5lZWQgYW4gaW50ZWdlciBsYXJnZXIgdGhhbiA5LDIyMywzNzIsMDM2LDg1NCw3NzUsODA3IG9yIGxlc3MgdGhhbiAtOSwyMjMsMzcyLDAzNiw4NTQsNzc1LDgwOC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVnZXJMaXRlcmFsSXNPdXRPZlJhbmdlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZUludGVnZXJMaXRlcmFsSXNPdXRPZlJhbmdlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkludGVnZXJMaXRlcmFsSXNPdXRPZlJhbmdlIiwgdGVtcGxhdGVJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5URUdFUl9MSVRFUkFMX09VVF9PRl9SQU5HRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZShTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVnZXJMaXRlcmFsSXNPdXRPZlJhbmdlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGludGVnZXIgbGl0ZXJhbCAke3N0cmluZ30gY2FuJ3QgYmUgcmVwcmVzZW50ZWQgaW4gNjQgYml0cy4iIiIsCiAgICAgIHRpcDoKICAgICAgICAgICIiIlRyeSB1c2luZyB0aGUgQmlnSW50IGNsYXNzIGlmIHlvdSBuZWVkIGFuIGludGVnZXIgbGFyZ2VyIHRoYW4gOSwyMjMsMzcyLDAzNiw4NTQsNzc1LDgwNyBvciBsZXNzIHRoYW4gLTksMjIzLDM3MiwwMzYsODU0LDc3NSw4MDguIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlSW50ZXJmYWNlQ2hlY2tDb250ZXh0ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJCb3RoIG1lbWJlcnMgYXJlIGluaGVyaXRlZCBieSB0aGUgbm9uLWFic3RyYWN0IGNsYXNzICcjbmFtZScuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcmZhY2VDaGVja0NvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUludGVyZmFjZUNoZWNrQ29udGV4dCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiSW50ZXJmYWNlQ2hlY2tDb250ZXh0IiwgdGVtcGxhdGVJbnRlcmZhY2VDaGVja0NvbnRleHQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVyZmFjZUNoZWNrQ29udGV4dChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVyZmFjZUNoZWNrQ29udGV4dCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkJvdGggbWVtYmVycyBhcmUgaW5oZXJpdGVkIGJ5IHRoZSBub24tYWJzdHJhY3QgY2xhc3MgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludGVybmFsUHJvYmxlbUFscmVhZHlJbml0aWFsaXplZCA9CiAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtQWxyZWFkeUluaXRpYWxpemVkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludGVybmFsUHJvYmxlbUFscmVhZHlJbml0aWFsaXplZCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkludGVybmFsUHJvYmxlbUFscmVhZHlJbml0aWFsaXplZCIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtLAogICAgbWVzc2FnZTogciIiIkF0dGVtcHQgdG8gc2V0IGluaXRpYWxpemVyIG9uIGZpZWxkIHdpdGhvdXQgaW5pdGlhbGl6ZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludGVybmFsUHJvYmxlbUJvZHlPbkFic3RyYWN0TWV0aG9kID0KICAgIG1lc3NhZ2VJbnRlcm5hbFByb2JsZW1Cb2R5T25BYnN0cmFjdE1ldGhvZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnRlcm5hbFByb2JsZW1Cb2R5T25BYnN0cmFjdE1ldGhvZCA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiSW50ZXJuYWxQcm9ibGVtQm9keU9uQWJzdHJhY3RNZXRob2QiLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0sCiAgICAgICAgbWVzc2FnZTogciIiIkF0dGVtcHRpbmcgdG8gc2V0IGJvZHkgb24gYWJzdHJhY3QgbWV0aG9kLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbUNvbnN0cnVjdG9yTm90Rm91bmQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJObyBjb25zdHJ1Y3RvciBuYW1lZCAnI25hbWUnIGluICcjdXJpJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPgogICAgY29kZUludGVybmFsUHJvYmxlbUNvbnN0cnVjdG9yTm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICAgICAgICJJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kIiwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbUNvbnN0cnVjdG9yTm90Rm91bmQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtQ29uc3RydWN0b3JOb3RGb3VuZCgKICAgIFN0cmluZyBuYW1lLCBVcmkgdXJpXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbUNvbnN0cnVjdG9yTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIk5vIGNvbnN0cnVjdG9yIG5hbWVkICcke25hbWV9JyBpbiAnJHt1cml9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4KICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtQ29udGV4dFNldmVyaXR5ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIk5vbi1jb250ZXh0IG1lc3NhZ2UgaGFzIGNvbnRleHQgc2V2ZXJpdHk6ICNzdHJpbmciIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Db250ZXh0U2V2ZXJpdHkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiBjb2RlSW50ZXJuYWxQcm9ibGVtQ29udGV4dFNldmVyaXR5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbUNvbnRleHRTZXZlcml0eSIsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Db250ZXh0U2V2ZXJpdHksCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtQ29udGV4dFNldmVyaXR5KFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJuYWxQcm9ibGVtQ29udGV4dFNldmVyaXR5LAogICAgICBtZXNzYWdlOiAiIiJOb24tY29udGV4dCBtZXNzYWdlIGhhcyBjb250ZXh0IHNldmVyaXR5OiAke3N0cmluZ30iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZyk+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbURlYnVnQWJvcnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvbXBpbGF0aW9uIGFib3J0ZWQgZHVlIHRvIGZhdGFsICcjbmFtZScgYXQ6CiNzdHJpbmciIiIsIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtRGVidWdBYm9ydCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpPgogICAgY29kZUludGVybmFsUHJvYmxlbURlYnVnQWJvcnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbURlYnVnQWJvcnQiLCB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbURlYnVnQWJvcnQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtRGVidWdBYm9ydChTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJuYWxQcm9ibGVtRGVidWdBYm9ydCwKICAgICAgbWVzc2FnZTogIiIiQ29tcGlsYXRpb24gYWJvcnRlZCBkdWUgdG8gZmF0YWwgJyR7bmFtZX0nIGF0Ogoke3N0cmluZ30iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnRlcm5hbFByb2JsZW1FeHRlbmRpbmdVbm1vZGlmaWFibGVTY29wZSA9CiAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtRXh0ZW5kaW5nVW5tb2RpZmlhYmxlU2NvcGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtRXh0ZW5kaW5nVW5tb2RpZmlhYmxlU2NvcGUgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlIiwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtLAogICAgICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCBleHRlbmQgYW4gdW5tb2RpZmlhYmxlIHNjb3BlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnRlcm5hbFByb2JsZW1MYWJlbFVzYWdlSW5WYXJpYWJsZXNEZWNsYXJhdGlvbiA9CiAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtTGFiZWxVc2FnZUluVmFyaWFibGVzRGVjbGFyYXRpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtTGFiZWxVc2FnZUluVmFyaWFibGVzRGVjbGFyYXRpb24gPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkludGVybmFsUHJvYmxlbUxhYmVsVXNhZ2VJblZhcmlhYmxlc0RlY2xhcmF0aW9uIiwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtLAogICAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAgIHIiIiJVbmV4cGVjdGVkIHVzYWdlIG9mIGxhYmVsIGluc2lkZSBkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZXMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludGVybmFsUHJvYmxlbU1pc3NpbmdDb250ZXh0ID0KICAgIG1lc3NhZ2VJbnRlcm5hbFByb2JsZW1NaXNzaW5nQ29udGV4dDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnRlcm5hbFByb2JsZW1NaXNzaW5nQ29udGV4dCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkludGVybmFsUHJvYmxlbU1pc3NpbmdDb250ZXh0IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0sCiAgICBtZXNzYWdlOiByIiIiQ29tcGlsZXIgY2Fubm90IHJ1biB3aXRob3V0IGEgY29tcGlsZXIgY29udGV4dC4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIkFyZSBjYWxscyB0byB0aGUgY29tcGlsZXIgd3JhcHBlZCBpbiBDb21waWxlckNvbnRleHQucnVuSW5Db250ZXh0PyIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtTm9JbmZlcnJlZFR5cGVTdG9yZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoZXJlJ3Mgbm8gaW5mZXJyZWQgdHlwZSBmb3IgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Ob0luZmVycmVkVHlwZVN0b3JlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUludGVybmFsUHJvYmxlbU5vSW5mZXJyZWRUeXBlU3RvcmVkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJJbnRlcm5hbFByb2JsZW1Ob0luZmVycmVkVHlwZVN0b3JlZCIsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob0luZmVycmVkVHlwZVN0b3JlZCwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Ob0luZmVycmVkVHlwZVN0b3JlZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbU5vSW5mZXJyZWRUeXBlU3RvcmVkLAogICAgICBtZXNzYWdlOiAiIiJUaGVyZSdzIG5vIGluZmVycmVkIHR5cGUgZm9yICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ291bGRuJ3QgZmluZCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbU5vdEZvdW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiSW50ZXJuYWxQcm9ibGVtTm90Rm91bmQiLCB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbU5vdEZvdW5kLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbU5vdEZvdW5kKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIkNvdWxkbid0IGZpbmQgJyR7bmFtZX0nLiIiIiwgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbU5vdEZvdW5kSW4gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ291bGRuJ3QgZmluZCAnI25hbWUnIGluICcjbmFtZTInLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbU5vdEZvdW5kSW4pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZUludGVybmFsUHJvYmxlbU5vdEZvdW5kSW4gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgICAgICAiSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbiIsIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbiwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbiwKICAgICAgbWVzc2FnZTogIiIiQ291bGRuJ3QgZmluZCAnJHtuYW1lfScgaW4gJyR7bmFtZTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ25hbWUyJzogbmFtZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW50ZXJuYWxQcm9ibGVtUHJldmlvdXNUb2tlbk5vdEZvdW5kID0KICAgIG1lc3NhZ2VJbnRlcm5hbFByb2JsZW1QcmV2aW91c1Rva2VuTm90Rm91bmQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtUHJldmlvdXNUb2tlbk5vdEZvdW5kID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJJbnRlcm5hbFByb2JsZW1QcmV2aW91c1Rva2VuTm90Rm91bmQiLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0sCiAgICAgICAgbWVzc2FnZTogciIiIkNvdWxkbid0IGZpbmQgcHJldmlvdXMgdG9rZW4uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3MgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNhbid0IGFjY2VzcyBwcml2YXRlIGNvbnN0cnVjdG9yICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICBjb2RlSW50ZXJuYWxQcm9ibGVtUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJJbnRlcm5hbFByb2JsZW1Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3MiLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVByaXZhdGVDb25zdHJ1Y3RvckFjY2VzcyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbVByaXZhdGVDb25zdHJ1Y3RvckFjY2VzcywKICAgICAgbWVzc2FnZTogIiIiQ2FuJ3QgYWNjZXNzIHByaXZhdGUgY29uc3RydWN0b3IgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludGVybmFsUHJvYmxlbVByb3ZpZGVkQm90aENvbXBpbGVTZGtBbmRTZGtTdW1tYXJ5ID0KICAgIG1lc3NhZ2VJbnRlcm5hbFByb2JsZW1Qcm92aWRlZEJvdGhDb21waWxlU2RrQW5kU2RrU3VtbWFyeTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnRlcm5hbFByb2JsZW1Qcm92aWRlZEJvdGhDb21waWxlU2RrQW5kU2RrU3VtbWFyeSA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiSW50ZXJuYWxQcm9ibGVtUHJvdmlkZWRCb3RoQ29tcGlsZVNka0FuZFNka1N1bW1hcnkiLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0sCiAgICAgICAgbWVzc2FnZToKICAgICAgICAgICAgciIiIlRoZSBjb21waWxlU2RrIGFuZCBzZGtTdW1tYXJ5IG9wdGlvbnMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKT4KICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiI25hbWUuc3RhY2sgaXNuJ3QgZW1wdHk6CiAgI3N0cmluZyIiIiwgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1TdGFja05vdEVtcHR5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZyk+CiAgICBjb2RlSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eSIsIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1TdGFja05vdEVtcHR5KFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1TdGFja05vdEVtcHR5LAogICAgICBtZXNzYWdlOiAiIiIke25hbWV9LnN0YWNrIGlzbid0IGVtcHR5OgogICR7c3RyaW5nfSIiIiwgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtU3RvcmluZ011bHRpcGxlSW5mZXJyZWRUeXBlcyA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZXJlJ3MgYWxyZWFkeSBhbiBpbmZlcnJlZCB0eXBlLCAnI3R5cGUnLCBmb3IgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czoKICAgICAgICAgICAgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1TdG9yaW5nTXVsdGlwbGVJbmZlcnJlZFR5cGVzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgU3RyaW5nIG5hbWUpPgogICAgY29kZUludGVybmFsUHJvYmxlbVN0b3JpbmdNdWx0aXBsZUluZmVycmVkVHlwZXMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBTdHJpbmcgbmFtZSk+KAogICAgICAgICJJbnRlcm5hbFByb2JsZW1TdG9yaW5nTXVsdGlwbGVJbmZlcnJlZFR5cGVzIiwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVN0b3JpbmdNdWx0aXBsZUluZmVycmVkVHlwZXMsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtU3RvcmluZ011bHRpcGxlSW5mZXJyZWRUeXBlcygKICAgIERhcnRUeXBlIF90eXBlLCBTdHJpbmcgbmFtZSkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1TdG9yaW5nTXVsdGlwbGVJbmZlcnJlZFR5cGVzLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlcmUncyBhbHJlYWR5IGFuIGluZmVycmVkIHR5cGUsICcke3R5cGV9JywgZm9yICcke25hbWV9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4KICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5leHBlY3RlZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRXhwZWN0ZWQgJyNzdHJpbmcnLCBidXQgZ290ICcjc3RyaW5nMicuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVW5leHBlY3RlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgY29kZUludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWQiLCB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVW5leHBlY3RlZChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMikgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgaWYgKHN0cmluZzIuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCAnJHtzdHJpbmd9JywgYnV0IGdvdCAnJHtzdHJpbmcyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAnc3RyaW5nMic6IHN0cmluZzJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuaGFuZGxlZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVW5oYW5kbGVkICNzdHJpbmcgaW4gI3N0cmluZzIuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVW5oYW5kbGVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+CiAgICBjb2RlSW50ZXJuYWxQcm9ibGVtVW5oYW5kbGVkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICAgICAgICJJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWQiLCB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuaGFuZGxlZCwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWQoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChzdHJpbmcyLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJuYWxQcm9ibGVtVW5oYW5kbGVkLAogICAgICBtZXNzYWdlOiAiIiJVbmhhbmRsZWQgJHtzdHJpbmd9IGluICR7c3RyaW5nMn0uIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAnc3RyaW5nMic6IHN0cmluZzJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4KICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5pbXBsZW1lbnRlZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJVbmltcGxlbWVudGVkICNzdHJpbmcuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVW5pbXBsZW1lbnRlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IGNvZGVJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbVVuaW1wbGVtZW50ZWQiLCB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuaW1wbGVtZW50ZWQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVW5pbXBsZW1lbnRlZChTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbVVuaW1wbGVtZW50ZWQsCiAgICAgIG1lc3NhZ2U6ICIiIlVuaW1wbGVtZW50ZWQgJHtzdHJpbmd9LiIiIiwgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlVuc3VwcG9ydGVkIG9wZXJhdGlvbjogJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkIiwgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZCwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkLAogICAgICBtZXNzYWdlOiAiIiJVbnN1cHBvcnRlZCBvcGVyYXRpb246ICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4KICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVXJpTWlzc2luZ1NjaGVtZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVGhlIFVSSSAnI3VyaScgaGFzIG5vIHNjaGVtZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VcmlNaXNzaW5nU2NoZW1lKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IGNvZGVJbnRlcm5hbFByb2JsZW1VcmlNaXNzaW5nU2NoZW1lID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KCJJbnRlcm5hbFByb2JsZW1VcmlNaXNzaW5nU2NoZW1lIiwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVyaU1pc3NpbmdTY2hlbWUsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVXJpTWlzc2luZ1NjaGVtZShVcmkgdXJpXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJuYWxQcm9ibGVtVXJpTWlzc2luZ1NjaGVtZSwKICAgICAgbWVzc2FnZTogIiIiVGhlIFVSSSAnJHt1cml9JyBoYXMgbm8gc2NoZW1lLiIiIiwgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4KICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVmVyaWZpY2F0aW9uRXJyb3IgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVmVyaWZpY2F0aW9uIG9mIHRoZSBnZW5lcmF0ZWQgcHJvZ3JhbSBmYWlsZWQ6CiNzdHJpbmciIiIsIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVmVyaWZpY2F0aW9uRXJyb3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPgogICAgY29kZUludGVybmFsUHJvYmxlbVZlcmlmaWNhdGlvbkVycm9yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbVZlcmlmaWNhdGlvbkVycm9yIiwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVZlcmlmaWNhdGlvbkVycm9yLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVZlcmlmaWNhdGlvbkVycm9yKFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJuYWxQcm9ibGVtVmVyaWZpY2F0aW9uRXJyb3IsCiAgICAgIG1lc3NhZ2U6ICIiIlZlcmlmaWNhdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIHByb2dyYW0gZmFpbGVkOgoke3N0cmluZ30iIiIsIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW50ZXJwb2xhdGlvbkluVXJpID0gbWVzc2FnZUludGVycG9sYXRpb25JblVyaTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnRlcnBvbGF0aW9uSW5VcmkgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnRlcnBvbGF0aW9uSW5VcmkiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfTElURVJBTF9JTl9DT05GSUdVUkFUSU9OIl0sCiAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgdXNlIHN0cmluZyBpbnRlcnBvbGF0aW9uIGluIGEgVVJJLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVJbnRlcnNlY3Rpb25UeXBlQXNUeXBlQXJndW1lbnQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkNhbid0IGluZmVyIGEgdHlwZSBmb3IgJyNuYW1lJywgaXQgY2FuIGJlIGVpdGhlciAnI3R5cGUnIG9yICcjdHlwZTInLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgYWRkaW5nIGEgdHlwZSBhcmd1bWVudCBzZWxlY3Rpbmcgb25lIG9mIHRoZSBvcHRpb25zLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJzZWN0aW9uVHlwZUFzVHlwZUFyZ3VtZW50KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+CiAgICBjb2RlSW50ZXJzZWN0aW9uVHlwZUFzVHlwZUFyZ3VtZW50ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICJJbnRlcnNlY3Rpb25UeXBlQXNUeXBlQXJndW1lbnQiLAogIHRlbXBsYXRlSW50ZXJzZWN0aW9uVHlwZUFzVHlwZUFyZ3VtZW50LAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVyc2VjdGlvblR5cGVBc1R5cGVBcmd1bWVudCgKICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcnNlY3Rpb25UeXBlQXNUeXBlQXJndW1lbnQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCBpbmZlciBhIHR5cGUgZm9yICcke25hbWV9JywgaXQgY2FuIGJlIGVpdGhlciAnJHt0eXBlfScgb3IgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IGFkZGluZyBhIHR5cGUgYXJndW1lbnQgc2VsZWN0aW5nIG9uZSBvZiB0aGUgb3B0aW9ucy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUludmFsaWRBc3NpZ25tZW50ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkEgdmFsdWUgb2YgdHlwZSAnI3R5cGUnIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHRoZSBsZWZ0IGhhbmQgc2lkZSwgb3IgY2FzdGluZyB0aGUgcmlnaHQgaGFuZCBzaWRlIHRvICcjdHlwZTInLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW52YWxpZEFzc2lnbm1lbnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUludmFsaWRBc3NpZ25tZW50ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgIkludmFsaWRBc3NpZ25tZW50IiwgdGVtcGxhdGVJbnZhbGlkQXNzaWdubWVudCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9BU1NJR05NRU5UIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRBc3NpZ25tZW50KERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52YWxpZEFzc2lnbm1lbnQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJBIHZhbHVlIG9mIHR5cGUgJyR7dHlwZX0nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJUcnkgY2hhbmdpbmcgdGhlIHR5cGUgb2YgdGhlIGxlZnQgaGFuZCBzaWRlLCBvciBjYXN0aW5nIHRoZSByaWdodCBoYW5kIHNpZGUgdG8gJyR7dHlwZTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnZhbGlkQXdhaXRGb3IgPSBtZXNzYWdlSW52YWxpZEF3YWl0Rm9yOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludmFsaWRBd2FpdEZvciA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJJbnZhbGlkQXdhaXRGb3IiLAogICAgaW5kZXg6IDksCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUaGUga2V5d29yZCAnYXdhaXQnIGlzbid0IGFsbG93ZWQgZm9yIGEgbm9ybWFsICdmb3InIHN0YXRlbWVudC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQsIG9yIHVzZSBhIGZvci1lYWNoIHN0YXRlbWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlSW52YWxpZEJyZWFrVGFyZ2V0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBicmVhayB0byAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRCcmVha1RhcmdldCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlSW52YWxpZEJyZWFrVGFyZ2V0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICJJbnZhbGlkQnJlYWtUYXJnZXQiLAogIHRlbXBsYXRlSW52YWxpZEJyZWFrVGFyZ2V0LAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRCcmVha1RhcmdldChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRCcmVha1RhcmdldCwKICAgICAgbWVzc2FnZTogIiIiQ2FuJ3QgYnJlYWsgdG8gJyR7bmFtZX0nLiIiIiwgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUludmFsaWRDYXN0RnVuY3Rpb25FeHByID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBmdW5jdGlvbiBleHByZXNzaW9uIHR5cGUgJyN0eXBlJyBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24gb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0RnVuY3Rpb25FeHByKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4KICAgIGNvZGVJbnZhbGlkQ2FzdEZ1bmN0aW9uRXhwciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJJbnZhbGlkQ2FzdEZ1bmN0aW9uRXhwciIsIHRlbXBsYXRlSW52YWxpZENhc3RGdW5jdGlvbkV4cHIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfQ0FTVF9GVU5DVElPTl9FWFBSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0RnVuY3Rpb25FeHByKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52YWxpZENhc3RGdW5jdGlvbkV4cHIsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgZnVuY3Rpb24gZXhwcmVzc2lvbiB0eXBlICcke3R5cGV9JyBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbiBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbExpc3QgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIGxpc3QgbGl0ZXJhbCB0eXBlICcjdHlwZScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBsaXN0IGxpdGVyYWwgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TGl0ZXJhbExpc3QpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUludmFsaWRDYXN0TGl0ZXJhbExpc3QgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgICAgICAiSW52YWxpZENhc3RMaXRlcmFsTGlzdCIsIHRlbXBsYXRlSW52YWxpZENhc3RMaXRlcmFsTGlzdCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9DQVNUX0xJVEVSQUxfTElTVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdExpdGVyYWxMaXN0KERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52YWxpZENhc3RMaXRlcmFsTGlzdCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBsaXN0IGxpdGVyYWwgdHlwZSAnJHt0eXBlfScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGxpc3QgbGl0ZXJhbCBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbE1hcCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbWFwIGxpdGVyYWwgdHlwZSAnI3R5cGUnIGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgbWFwIGxpdGVyYWwgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TGl0ZXJhbE1hcCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+CiAgICBjb2RlSW52YWxpZENhc3RMaXRlcmFsTWFwID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgIkludmFsaWRDYXN0TGl0ZXJhbE1hcCIsIHRlbXBsYXRlSW52YWxpZENhc3RMaXRlcmFsTWFwLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX0NBU1RfTElURVJBTF9NQVAiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW52YWxpZENhc3RMaXRlcmFsTWFwKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52YWxpZENhc3RMaXRlcmFsTWFwLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIG1hcCBsaXRlcmFsIHR5cGUgJyR7dHlwZX0nIGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBtYXAgbGl0ZXJhbCBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbFNldCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgc2V0IGxpdGVyYWwgdHlwZSAnI3R5cGUnIGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgc2V0IGxpdGVyYWwgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TGl0ZXJhbFNldCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+CiAgICBjb2RlSW52YWxpZENhc3RMaXRlcmFsU2V0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgIkludmFsaWRDYXN0TGl0ZXJhbFNldCIsIHRlbXBsYXRlSW52YWxpZENhc3RMaXRlcmFsU2V0LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX0NBU1RfTElURVJBTF9TRVQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW52YWxpZENhc3RMaXRlcmFsU2V0KERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52YWxpZENhc3RMaXRlcmFsU2V0LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHNldCBsaXRlcmFsIHR5cGUgJyR7dHlwZX0nIGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBzZXQgbGl0ZXJhbCBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUludmFsaWRDYXN0TG9jYWxGdW5jdGlvbiA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbG9jYWwgZnVuY3Rpb24gaGFzIHR5cGUgJyN0eXBlJyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TG9jYWxGdW5jdGlvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+CiAgICBjb2RlSW52YWxpZENhc3RMb2NhbEZ1bmN0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgIkludmFsaWRDYXN0TG9jYWxGdW5jdGlvbiIsIHRlbXBsYXRlSW52YWxpZENhc3RMb2NhbEZ1bmN0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX0NBU1RfRlVOQ1RJT04iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW52YWxpZENhc3RMb2NhbEZ1bmN0aW9uKAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb24sCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgbG9jYWwgZnVuY3Rpb24gaGFzIHR5cGUgJyR7dHlwZX0nIHRoYXQgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuIiIiLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlLCAndHlwZTInOiBfdHlwZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlCiAgICAgICAgICAgIF90eXBlMik+IHRlbXBsYXRlSW52YWxpZENhc3ROZXdFeHByID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBjb25zdHJ1Y3RvciByZXR1cm5zIHR5cGUgJyN0eXBlJyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGNvbnN0cnVjdGVkIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdE5ld0V4cHIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUludmFsaWRDYXN0TmV3RXhwciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJJbnZhbGlkQ2FzdE5ld0V4cHIiLCB0ZW1wbGF0ZUludmFsaWRDYXN0TmV3RXhwciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9DQVNUX05FV19FWFBSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TmV3RXhwcihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRDYXN0TmV3RXhwciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBjb25zdHJ1Y3RvciByZXR1cm5zIHR5cGUgJyR7dHlwZX0nIHRoYXQgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBiZWluZyBjb25zdHJ1Y3RlZCBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUludmFsaWRDYXN0U3RhdGljTWV0aG9kID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBzdGF0aWMgbWV0aG9kIGhhcyB0eXBlICcjdHlwZScgdGhhdCBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW52YWxpZENhc3RTdGF0aWNNZXRob2QpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUludmFsaWRDYXN0U3RhdGljTWV0aG9kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgIkludmFsaWRDYXN0U3RhdGljTWV0aG9kIiwgdGVtcGxhdGVJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9DQVNUX01FVEhPRCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZChEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRDYXN0U3RhdGljTWV0aG9kLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHN0YXRpYyBtZXRob2QgaGFzIHR5cGUgJyR7dHlwZX0nIHRoYXQgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZUludmFsaWRDYXN0VG9wTGV2ZWxGdW5jdGlvbiA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgdG9wIGxldmVsIGZ1bmN0aW9uIGhhcyB0eXBlICcjdHlwZScgdGhhdCBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZUludmFsaWRDYXN0VG9wTGV2ZWxGdW5jdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb24iLCB0ZW1wbGF0ZUludmFsaWRDYXN0VG9wTGV2ZWxGdW5jdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9DQVNUX0ZVTkNUSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0VG9wTGV2ZWxGdW5jdGlvbigKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52YWxpZENhc3RUb3BMZXZlbEZ1bmN0aW9uLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHRvcCBsZXZlbCBmdW5jdGlvbiBoYXMgdHlwZSAnJHt0eXBlfScgdGhhdCBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnZhbGlkQ2F0Y2hBcmd1bWVudHMgPSBtZXNzYWdlSW52YWxpZENhdGNoQXJndW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludmFsaWRDYXRjaEFyZ3VtZW50cyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkludmFsaWRDYXRjaEFyZ3VtZW50cyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9DQVRDSF9BUkdVTUVOVFMiXSwKICAgIG1lc3NhZ2U6IHIiIiJJbnZhbGlkIGNhdGNoIGFyZ3VtZW50cy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW52YWxpZENvZGVQb2ludCA9IG1lc3NhZ2VJbnZhbGlkQ29kZVBvaW50OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludmFsaWRDb2RlUG9pbnQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnZhbGlkQ29kZVBvaW50IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX0NPREVfUE9JTlQiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlRoZSBlc2NhcGUgc2VxdWVuY2Ugc3RhcnRpbmcgd2l0aCAnXHUnIGlzbid0IGEgdmFsaWQgY29kZSBwb2ludC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlSW52YWxpZENvbnRpbnVlVGFyZ2V0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBjb250aW51ZSBhdCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRDb250aW51ZVRhcmdldCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlSW52YWxpZENvbnRpbnVlVGFyZ2V0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICJJbnZhbGlkQ29udGludWVUYXJnZXQiLAogIHRlbXBsYXRlSW52YWxpZENvbnRpbnVlVGFyZ2V0LAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRDb250aW51ZVRhcmdldChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRDb250aW51ZVRhcmdldCwKICAgICAgbWVzc2FnZTogIiIiQ2FuJ3QgY29udGludWUgYXQgJyR7bmFtZX0nLiIiIiwgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludmFsaWRIZXhFc2NhcGUgPSBtZXNzYWdlSW52YWxpZEhleEVzY2FwZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnZhbGlkSGV4RXNjYXBlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW52YWxpZEhleEVzY2FwZSIsCiAgICBpbmRleDogNDAsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJBbiBlc2NhcGUgc2VxdWVuY2Ugc3RhcnRpbmcgd2l0aCAnXHgnIG11c3QgYmUgZm9sbG93ZWQgYnkgMiBoZXhhZGVjaW1hbCBkaWdpdHMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludmFsaWRJbml0aWFsaXplciA9IG1lc3NhZ2VJbnZhbGlkSW5pdGlhbGl6ZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW52YWxpZEluaXRpYWxpemVyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW52YWxpZEluaXRpYWxpemVyIiwKICAgIG1lc3NhZ2U6IHIiIiJOb3QgYSB2YWxpZCBpbml0aWFsaXplci4iIiIsCiAgICB0aXA6IHIiIiJUbyBpbml0aWFsaXplIGEgZmllbGQsIHVzZSB0aGUgc3ludGF4ICduYW1lID0gdmFsdWUnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnZhbGlkSW5saW5lRnVuY3Rpb25UeXBlID0KICAgIG1lc3NhZ2VJbnZhbGlkSW5saW5lRnVuY3Rpb25UeXBlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludmFsaWRJbmxpbmVGdW5jdGlvblR5cGUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnZhbGlkSW5saW5lRnVuY3Rpb25UeXBlIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX0lOTElORV9GVU5DVElPTl9UWVBFIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJJbmxpbmUgZnVuY3Rpb24gdHlwZXMgY2Fubm90IGJlIHVzZWQgZm9yIHBhcmFtZXRlcnMgaW4gYSBnZW5lcmljIGZ1bmN0aW9uIHR5cGUuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgY2hhbmdpbmcgdGhlIGlubGluZSBmdW5jdGlvbiB0eXBlIChhcyBpbiAnaW50IGYoKScpIHRvIGEgcHJlZml4ZWQgZnVuY3Rpb24gdHlwZSB1c2luZyB0aGUgYEZ1bmN0aW9uYCBrZXl3b3JkIChhcyBpbiAnaW50IEZ1bmN0aW9uKCkgZicpLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gdGVtcGxhdGVJbnZhbGlkT3BlcmF0b3IgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSBzdHJpbmcgJyNsZXhlbWUnIGlzbid0IGEgdXNlci1kZWZpbmFibGUgb3BlcmF0b3IuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW52YWxpZE9wZXJhdG9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVJbnZhbGlkT3BlcmF0b3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgIkludmFsaWRPcGVyYXRvciIsIHRlbXBsYXRlSW52YWxpZE9wZXJhdG9yLAogICAgICAgIGluZGV4OiAzOSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW52YWxpZE9wZXJhdG9yKFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRPcGVyYXRvciwKICAgICAgbWVzc2FnZTogIiIiVGhlIHN0cmluZyAnJHtsZXhlbWV9JyBpc24ndCBhIHVzZXItZGVmaW5hYmxlIG9wZXJhdG9yLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgU3RyaW5nIHN0cmluZyk+CiAgICB0ZW1wbGF0ZUludmFsaWRQYWNrYWdlVXJpID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJJbnZhbGlkIHBhY2thZ2UgVVJJICcjdXJpJzoKICAjc3RyaW5nLiIiIiwgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkUGFja2FnZVVyaSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFN0cmluZyBzdHJpbmcpPiBjb2RlSW52YWxpZFBhY2thZ2VVcmkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBTdHJpbmcgc3RyaW5nKT4oCiAgIkludmFsaWRQYWNrYWdlVXJpIiwKICB0ZW1wbGF0ZUludmFsaWRQYWNrYWdlVXJpLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRQYWNrYWdlVXJpKFVyaSB1cmlfLCBTdHJpbmcgc3RyaW5nKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRQYWNrYWdlVXJpLAogICAgICBtZXNzYWdlOiAiIiJJbnZhbGlkIHBhY2thZ2UgVVJJICcke3VyaX0nOgogICR7c3RyaW5nfS4iIiIsIGFyZ3VtZW50czogeyd1cmknOiB1cmlfLCAnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludmFsaWRTdXBlckluSW5pdGlhbGl6ZXIgPQogICAgbWVzc2FnZUludmFsaWRTdXBlckluSW5pdGlhbGl6ZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW52YWxpZFN1cGVySW5Jbml0aWFsaXplciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkludmFsaWRTdXBlckluSW5pdGlhbGl6ZXIiLAogICAgaW5kZXg6IDQ3LAogICAgbWVzc2FnZToKICAgICAgICByIiIiQ2FuIG9ubHkgdXNlICdzdXBlcicgaW4gYW4gaW5pdGlhbGl6ZXIgZm9yIGNhbGxpbmcgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IgKGUuZy4gJ3N1cGVyKCknIG9yICdzdXBlci5uYW1lZENvbnN0cnVjdG9yKCknKSIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnZhbGlkU3luY01vZGlmaWVyID0gbWVzc2FnZUludmFsaWRTeW5jTW9kaWZpZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW52YWxpZFN5bmNNb2RpZmllciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkludmFsaWRTeW5jTW9kaWZpZXIiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfU1RBUl9BRlRFUl9TWU5DIl0sCiAgICBtZXNzYWdlOiByIiIiSW52YWxpZCBtb2RpZmllciAnc3luYycuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlcGxhY2luZyAnc3luYycgd2l0aCAnc3luYyonLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnZhbGlkVGhpc0luSW5pdGlhbGl6ZXIgPSBtZXNzYWdlSW52YWxpZFRoaXNJbkluaXRpYWxpemVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludmFsaWRUaGlzSW5Jbml0aWFsaXplciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkludmFsaWRUaGlzSW5Jbml0aWFsaXplciIsCiAgICBpbmRleDogNjUsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJDYW4gb25seSB1c2UgJ3RoaXMnIGluIGFuIGluaXRpYWxpemVyIGZvciBmaWVsZCBpbml0aWFsaXphdGlvbiAoZS5nLiAndGhpcy54ID0gc29tZXRoaW5nJykgYW5kIGNvbnN0cnVjdG9yIHJlZGlyZWN0aW9uIChlLmcuICd0aGlzKCknIG9yICd0aGlzLm5hbWVkQ29uc3RydWN0b3IoKSkiIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW52YWxpZFVuaWNvZGVFc2NhcGUgPSBtZXNzYWdlSW52YWxpZFVuaWNvZGVFc2NhcGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW52YWxpZFVuaWNvZGVFc2NhcGUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnZhbGlkVW5pY29kZUVzY2FwZSIsCiAgICBpbmRleDogMzgsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJBbiBlc2NhcGUgc2VxdWVuY2Ugc3RhcnRpbmcgd2l0aCAnXHUnIG11c3QgYmUgZm9sbG93ZWQgYnkgNCBoZXhhZGVjaW1hbCBkaWdpdHMgb3IgZnJvbSAxIHRvIDYgZGlnaXRzIGJldHdlZW4gJ3snIGFuZCAnfScuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludmFsaWRVc2VPZk51bGxBd2FyZUFjY2VzcyA9CiAgICBtZXNzYWdlSW52YWxpZFVzZU9mTnVsbEF3YXJlQWNjZXNzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludmFsaWRVc2VPZk51bGxBd2FyZUFjY2VzcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkludmFsaWRVc2VPZk51bGxBd2FyZUFjY2VzcyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9VU0VfT0ZfTlVMTF9BV0FSRV9BQ0NFU1MiXSwKICAgIG1lc3NhZ2U6IHIiIiJDYW5ub3QgdXNlICc/LicgaGVyZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgdXNpbmcgJy4nLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnZhbGlkVm9pZCA9IG1lc3NhZ2VJbnZhbGlkVm9pZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnZhbGlkVm9pZCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJJbnZhbGlkVm9pZCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQRUNURURfVFlQRV9OQU1FIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUeXBlICd2b2lkJyBjYW4ndCBiZSB1c2VkIGhlcmUgYmVjYXVzZSBpdCBpc24ndCBhIHJldHVybiB0eXBlLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHJlbW92aW5nICd2b2lkJyBrZXl3b3JkIG9yIHJlcGxhY2UgaXQgd2l0aCAndmFyJywgJ2ZpbmFsJywgb3IgYSB0eXBlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVJbnZva2VOb25GdW5jdGlvbiA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiJyNuYW1lJyBpc24ndCBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBhbmQgY2FuJ3QgYmUgaW52b2tlZC4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZva2VOb25GdW5jdGlvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlSW52b2tlTm9uRnVuY3Rpb24gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkludm9rZU5vbkZ1bmN0aW9uIiwgdGVtcGxhdGVJbnZva2VOb25GdW5jdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WT0NBVElPTl9PRl9OT05fRlVOQ1RJT04iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW52b2tlTm9uRnVuY3Rpb24oU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZva2VOb25GdW5jdGlvbiwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzbid0IGEgZnVuY3Rpb24gb3IgbWV0aG9kIGFuZCBjYW4ndCBiZSBpbnZva2VkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlTGFiZWxOb3RGb3VuZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNhbid0IGZpbmQgbGFiZWwgJyNuYW1lJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGRlZmluaW5nIHRoZSBsYWJlbCwgb3IgY29ycmVjdGluZyB0aGUgbmFtZSB0byBtYXRjaCBhbiBleGlzdGluZyBsYWJlbC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0xhYmVsTm90Rm91bmQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUxhYmVsTm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkxhYmVsTm90Rm91bmQiLCB0ZW1wbGF0ZUxhYmVsTm90Rm91bmQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkxBQkVMX1VOREVGSU5FRCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNMYWJlbE5vdEZvdW5kKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTGFiZWxOb3RGb3VuZCwKICAgICAgbWVzc2FnZTogIiIiQ2FuJ3QgZmluZCBsYWJlbCAnJHtuYW1lfScuIiIiLAogICAgICB0aXA6CiAgICAgICAgICAiIiJUcnkgZGVmaW5pbmcgdGhlIGxhYmVsLCBvciBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIG1hdGNoIGFuIGV4aXN0aW5nIGxhYmVsLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUxpYnJhcnlEaXJlY3RpdmVOb3RGaXJzdCA9IG1lc3NhZ2VMaWJyYXJ5RGlyZWN0aXZlTm90Rmlyc3Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTGlicmFyeURpcmVjdGl2ZU5vdEZpcnN0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTGlicmFyeURpcmVjdGl2ZU5vdEZpcnN0IiwKICAgIGluZGV4OiAzNywKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlRoZSBsaWJyYXJ5IGRpcmVjdGl2ZSBtdXN0IGFwcGVhciBiZWZvcmUgYWxsIG90aGVyIGRpcmVjdGl2ZXMuIiIiLAogICAgdGlwOiByIiIiVHJ5IG1vdmluZyB0aGUgbGlicmFyeSBkaXJlY3RpdmUgYmVmb3JlIGFueSBvdGhlciBkaXJlY3RpdmVzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVMaXN0TGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzID0KICAgIG1lc3NhZ2VMaXN0TGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUxpc3RMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJMaXN0TGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFBFQ1RFRF9PTkVfTElTVF9UWVBFX0FSR1VNRU5UUyJdLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZywKICAgIG1lc3NhZ2U6IHIiIiJMaXN0IGxpdGVyYWwgcmVxdWlyZXMgZXhhY3RseSBvbmUgdHlwZSBhcmd1bWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gdGVtcGxhdGVMb2FkTGlicmFyeUhpZGVzTWVtYmVyID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbGlicmFyeSAnI3VyaScgZGVmaW5lcyBhIHRvcC1sZXZlbCBtZW1iZXIgbmFtZWQgJ2xvYWRMaWJyYXJ5Jy4gVGhpcyBtZW1iZXIgaXMgaGlkZGVuIGJ5IHRoZSBzcGVjaWFsIG1lbWJlciAnbG9hZExpYnJhcnknIHRoYXQgdGhlIGxhbmd1YWdlIGFkZHMgdG8gc3VwcG9ydCBkZWZlcnJlZCBsb2FkaW5nLiIiIiwKICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHRvIHJlbmFtZSBvciBoaWRlIHRoZSBtZW1iZXIuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNMb2FkTGlicmFyeUhpZGVzTWVtYmVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IGNvZGVMb2FkTGlicmFyeUhpZGVzTWVtYmVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgICAgICJMb2FkTGlicmFyeUhpZGVzTWVtYmVyIiwgdGVtcGxhdGVMb2FkTGlicmFyeUhpZGVzTWVtYmVyLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pZ25vcmVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNMb2FkTGlicmFyeUhpZGVzTWVtYmVyKFVyaSB1cmlfKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVMb2FkTGlicmFyeUhpZGVzTWVtYmVyLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGxpYnJhcnkgJyR7dXJpfScgZGVmaW5lcyBhIHRvcC1sZXZlbCBtZW1iZXIgbmFtZWQgJ2xvYWRMaWJyYXJ5Jy4gVGhpcyBtZW1iZXIgaXMgaGlkZGVuIGJ5IHRoZSBzcGVjaWFsIG1lbWJlciAnbG9hZExpYnJhcnknIHRoYXQgdGhlIGxhbmd1YWdlIGFkZHMgdG8gc3VwcG9ydCBkZWZlcnJlZCBsb2FkaW5nLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgdG8gcmVuYW1lIG9yIGhpZGUgdGhlIG1lbWJlci4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUxvYWRMaWJyYXJ5VGFrZXNOb0FyZ3VtZW50cyA9CiAgICBtZXNzYWdlTG9hZExpYnJhcnlUYWtlc05vQXJndW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUxvYWRMaWJyYXJ5VGFrZXNOb0FyZ3VtZW50cyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkxvYWRMaWJyYXJ5VGFrZXNOb0FyZ3VtZW50cyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTE9BRF9MSUJSQVJZX1RBS0VTX05PX0FSR1VNRU5UUyJdLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZywKICAgIG1lc3NhZ2U6IHIiIiInbG9hZExpYnJhcnknIHRha2VzIG5vIGFyZ3VtZW50cy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPgogICAgdGVtcGxhdGVMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkxvY2FsIGRlZmluaXRpb24gb2YgJyNuYW1lJyBoaWRlcyBleHBvcnQgZnJvbSAnI3VyaScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTG9jYWxEZWZpbml0aW9uSGlkZXNFeHBvcnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+CiAgICBjb2RlTG9jYWxEZWZpbml0aW9uSGlkZXNFeHBvcnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICAgICAgICJMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydCIsIHRlbXBsYXRlTG9jYWxEZWZpbml0aW9uSGlkZXNFeHBvcnQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lmlnbm9yZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0xvY2FsRGVmaW5pdGlvbkhpZGVzRXhwb3J0KFN0cmluZyBuYW1lLCBVcmkgdXJpXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUxvY2FsRGVmaW5pdGlvbkhpZGVzRXhwb3J0LAogICAgICBtZXNzYWdlOiAiIiJMb2NhbCBkZWZpbml0aW9uIG9mICcke25hbWV9JyBoaWRlcyBleHBvcnQgZnJvbSAnJHt1cml9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPgogICAgdGVtcGxhdGVMb2NhbERlZmluaXRpb25IaWRlc0ltcG9ydCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkxvY2FsIGRlZmluaXRpb24gb2YgJyNuYW1lJyBoaWRlcyBpbXBvcnQgZnJvbSAnI3VyaScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+CiAgICBjb2RlTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICAgICAgICJMb2NhbERlZmluaXRpb25IaWRlc0ltcG9ydCIsIHRlbXBsYXRlTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lmlnbm9yZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0xvY2FsRGVmaW5pdGlvbkhpZGVzSW1wb3J0KFN0cmluZyBuYW1lLCBVcmkgdXJpXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUxvY2FsRGVmaW5pdGlvbkhpZGVzSW1wb3J0LAogICAgICBtZXNzYWdlOiAiIiJMb2NhbCBkZWZpbml0aW9uIG9mICcke25hbWV9JyBoaWRlcyBpbXBvcnQgZnJvbSAnJHt1cml9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWFwTGl0ZXJhbFR5cGVBcmd1bWVudE1pc21hdGNoID0KICAgIG1lc3NhZ2VNYXBMaXRlcmFsVHlwZUFyZ3VtZW50TWlzbWF0Y2g7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWFwTGl0ZXJhbFR5cGVBcmd1bWVudE1pc21hdGNoID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTWFwTGl0ZXJhbFR5cGVBcmd1bWVudE1pc21hdGNoIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFBFQ1RFRF9UV09fTUFQX1RZUEVfQVJHVU1FTlRTIl0sCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nLAogICAgbWVzc2FnZTogciIiIkEgbWFwIGxpdGVyYWwgcmVxdWlyZXMgZXhhY3RseSB0d28gdHlwZSBhcmd1bWVudHMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1lbWJlcldpdGhTYW1lTmFtZUFzQ2xhc3MgPQogICAgbWVzc2FnZU1lbWJlcldpdGhTYW1lTmFtZUFzQ2xhc3M7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWVtYmVyV2l0aFNhbWVOYW1lQXNDbGFzcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk1lbWJlcldpdGhTYW1lTmFtZUFzQ2xhc3MiLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQSBjbGFzcyBtZW1iZXIgY2FuJ3QgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSBlbmNsb3NpbmcgY2xhc3MuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1ldGFkYXRhVHlwZUFyZ3VtZW50cyA9IG1lc3NhZ2VNZXRhZGF0YVR5cGVBcmd1bWVudHM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWV0YWRhdGFUeXBlQXJndW1lbnRzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTWV0YWRhdGFUeXBlQXJndW1lbnRzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJBTk5PVEFUSU9OX1dJVEhfVFlQRV9BUkdVTUVOVFMiXSwKICAgIG1lc3NhZ2U6IHIiIiJBbiBhbm5vdGF0aW9uIChtZXRhZGF0YSkgY2FuJ3QgdXNlIHR5cGUgYXJndW1lbnRzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVNZXRob2ROb3RGb3VuZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiTWV0aG9kIG5vdCBmb3VuZDogJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNNZXRob2ROb3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlTWV0aG9kTm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIk1ldGhvZE5vdEZvdW5kIiwgdGVtcGxhdGVNZXRob2ROb3RGb3VuZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX01FVEhPRCJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c01ldGhvZE5vdEZvdW5kKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTWV0aG9kTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIk1ldGhvZCBub3QgZm91bmQ6ICcke25hbWV9Jy4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nQXJndW1lbnRMaXN0ID0gbWVzc2FnZU1pc3NpbmdBcmd1bWVudExpc3Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWlzc2luZ0FyZ3VtZW50TGlzdCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk1pc3NpbmdBcmd1bWVudExpc3QiLAogICAgbWVzc2FnZTogciIiIkNvbnN0cnVjdG9yIGludm9jYXRpb25zIG11c3QgaGF2ZSBhbiBhcmd1bWVudCBsaXN0LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nQXNzaWduYWJsZVNlbGVjdG9yID0KICAgIG1lc3NhZ2VNaXNzaW5nQXNzaWduYWJsZVNlbGVjdG9yOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdBc3NpZ25hYmxlU2VsZWN0b3IgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNaXNzaW5nQXNzaWduYWJsZVNlbGVjdG9yIiwKICAgIGluZGV4OiAzNSwKICAgIG1lc3NhZ2U6IHIiIiJNaXNzaW5nIHNlbGVjdG9yIHN1Y2ggYXMgJy48aWRlbnRpZmllcj4nIG9yICdbMF0nLiIiIiwKICAgIHRpcDogciIiIlRyeSBhZGRpbmcgYSBzZWxlY3Rvci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWlzc2luZ0Fzc2lnbm1lbnRJbkluaXRpYWxpemVyID0KICAgIG1lc3NhZ2VNaXNzaW5nQXNzaWdubWVudEluSW5pdGlhbGl6ZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWlzc2luZ0Fzc2lnbm1lbnRJbkluaXRpYWxpemVyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTWlzc2luZ0Fzc2lnbm1lbnRJbkluaXRpYWxpemVyIiwKICAgIGluZGV4OiAzNCwKICAgIG1lc3NhZ2U6IHIiIiJFeHBlY3RlZCBhbiBhc3NpZ25tZW50IGFmdGVyIHRoZSBmaWVsZCBuYW1lLiIiIiwKICAgIHRpcDogciIiIlRvIGluaXRpYWxpemUgYSBmaWVsZCwgdXNlIHRoZSBzeW50YXggJ25hbWUgPSB2YWx1ZScuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1pc3NpbmdDb25zdEZpbmFsVmFyT3JUeXBlID0KICAgIG1lc3NhZ2VNaXNzaW5nQ29uc3RGaW5hbFZhck9yVHlwZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNaXNzaW5nQ29uc3RGaW5hbFZhck9yVHlwZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk1pc3NpbmdDb25zdEZpbmFsVmFyT3JUeXBlIiwKICAgIGluZGV4OiAzMywKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlZhcmlhYmxlcyBtdXN0IGJlIGRlY2xhcmVkIHVzaW5nIHRoZSBrZXl3b3JkcyAnY29uc3QnLCAnZmluYWwnLCAndmFyJyBvciBhIHR5cGUgbmFtZS4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSBhZGRpbmcgdGhlIG5hbWUgb2YgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIG9yIHRoZSBrZXl3b3JkICd2YXInLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCk+CiAgICB0ZW1wbGF0ZU1pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHMgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJObyB0eXBlIGFyZ3VtZW50cyBwcm92aWRlZCwgI2NvdW50IHBvc3NpYmxlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c01pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCk+IGNvZGVNaXNzaW5nRXhwbGljaXRUeXBlQXJndW1lbnRzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQpPigKICAgICAgICAiTWlzc2luZ0V4cGxpY2l0VHlwZUFyZ3VtZW50cyIsIHRlbXBsYXRlTWlzc2luZ0V4cGxpY2l0VHlwZUFyZ3VtZW50cywKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaWdub3JlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTWlzc2luZ0V4cGxpY2l0VHlwZUFyZ3VtZW50cyhpbnQgY291bnQpIHsKICBpZiAoY291bnQgPT0gbnVsbCkgdGhyb3cgJ05vIGNvdW50IHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU1pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHMsCiAgICAgIG1lc3NhZ2U6ICIiIk5vIHR5cGUgYXJndW1lbnRzIHByb3ZpZGVkLCAke2NvdW50fSBwb3NzaWJsZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeydjb3VudCc6IGNvdW50fSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1pc3NpbmdFeHBvbmVudCA9IG1lc3NhZ2VNaXNzaW5nRXhwb25lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWlzc2luZ0V4cG9uZW50ID0gY29uc3QgTWVzc2FnZUNvZGUoIk1pc3NpbmdFeHBvbmVudCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTUlTU0lOR19ESUdJVCJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiTnVtYmVycyBpbiBleHBvbmVudGlhbCBub3RhdGlvbiBzaG91bGQgYWx3YXlzIGNvbnRhaW4gYW4gZXhwb25lbnQgKGFuIGludGVnZXIgbnVtYmVyIHdpdGggYW4gb3B0aW9uYWwgc2lnbikuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJNYWtlIHN1cmUgdGhlcmUgaXMgYW4gZXhwb25lbnQsIGFuZCByZW1vdmUgYW55IHdoaXRlc3BhY2UgYmVmb3JlIGl0LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nRXhwcmVzc2lvbkluVGhyb3cgPSBtZXNzYWdlTWlzc2luZ0V4cHJlc3Npb25JblRocm93OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdFeHByZXNzaW9uSW5UaHJvdyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk1pc3NpbmdFeHByZXNzaW9uSW5UaHJvdyIsCiAgICBpbmRleDogMzIsCiAgICBtZXNzYWdlOiByIiIiTWlzc2luZyBleHByZXNzaW9uIGFmdGVyICd0aHJvdycuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJBZGQgYW4gZXhwcmVzc2lvbiBhZnRlciAndGhyb3cnIG9yIHVzZSAncmV0aHJvdycgdG8gdGhyb3cgYSBjYXVnaHQgZXhjZXB0aW9uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1pc3NpbmdGdW5jdGlvblBhcmFtZXRlcnMgPQogICAgbWVzc2FnZU1pc3NpbmdGdW5jdGlvblBhcmFtZXRlcnM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWlzc2luZ0Z1bmN0aW9uUGFyYW1ldGVycyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk1pc3NpbmdGdW5jdGlvblBhcmFtZXRlcnMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfRlVOQ1RJT05fUEFSQU1FVEVSUyJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBuZWVkcyBhbiBleHBsaWNpdCBsaXN0IG9mIHBhcmFtZXRlcnMuIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyBhIHBhcmFtZXRlciBsaXN0IHRvIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZU1pc3NpbmdJbXBsZW1lbnRhdGlvbkNhdXNlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiInI25hbWUnIGlzIGRlZmluZWQgaGVyZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIk1pc3NpbmdJbXBsZW1lbnRhdGlvbkNhdXNlIiwgdGVtcGxhdGVNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2UoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZSwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzIGRlZmluZWQgaGVyZS4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgTGlzdDxTdHJpbmc+CiAgICAgICAgICAgIF9uYW1lcyk+IHRlbXBsYXRlTWlzc2luZ0ltcGxlbWVudGF0aW9uTm90QWJzdHJhY3QgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBMaXN0PFN0cmluZz4gX25hbWVzKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBub24tYWJzdHJhY3QgY2xhc3MgJyNuYW1lJyBpcyBtaXNzaW5nIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlc2UgbWVtYmVyczoKI25hbWVzIiIiLAogICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgdG8gZWl0aGVyCiAtIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24sCiAtIGluaGVyaXQgYW4gaW1wbGVtZW50YXRpb24gZnJvbSBhIHN1cGVyY2xhc3Mgb3IgbWl4aW4sCiAtIG1hcmsgdGhlIGNsYXNzIGFzIGFic3RyYWN0LCBvcgogLSBwcm92aWRlIGEgJ25vU3VjaE1ldGhvZCcgaW1wbGVtZW50YXRpb24uCiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTWlzc2luZ0ltcGxlbWVudGF0aW9uTm90QWJzdHJhY3QpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBMaXN0PFN0cmluZz4gX25hbWVzKT4KICAgIGNvZGVNaXNzaW5nSW1wbGVtZW50YXRpb25Ob3RBYnN0cmFjdCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIExpc3Q8U3RyaW5nPiBfbmFtZXMpPigKICAgICAgICAiTWlzc2luZ0ltcGxlbWVudGF0aW9uTm90QWJzdHJhY3QiLAogICAgICAgIHRlbXBsYXRlTWlzc2luZ0ltcGxlbWVudGF0aW9uTm90QWJzdHJhY3QsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTkNSRVRFX0NMQVNTX1dJVEhfQUJTVFJBQ1RfTUVNQkVSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c01pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0KAogICAgU3RyaW5nIG5hbWUsIExpc3Q8U3RyaW5nPiBfbmFtZXMpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKF9uYW1lcy5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZXMgcHJvdmlkZWQnOwogIFN0cmluZyBuYW1lcyA9IGl0ZW1pemVOYW1lcyhfbmFtZXMpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTWlzc2luZ0ltcGxlbWVudGF0aW9uTm90QWJzdHJhY3QsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgbm9uLWFic3RyYWN0IGNsYXNzICcke25hbWV9JyBpcyBtaXNzaW5nIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlc2UgbWVtYmVyczoKJHtuYW1lc30iIiIsCiAgICAgIHRpcDogIiIiVHJ5IHRvIGVpdGhlcgogLSBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uLAogLSBpbmhlcml0IGFuIGltcGxlbWVudGF0aW9uIGZyb20gYSBzdXBlcmNsYXNzIG9yIG1peGluLAogLSBtYXJrIHRoZSBjbGFzcyBhcyBhYnN0cmFjdCwgb3IKIC0gcHJvdmlkZSBhICdub1N1Y2hNZXRob2QnIGltcGxlbWVudGF0aW9uLgoiIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ25hbWVzJzogX25hbWVzfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1pc3NpbmdJbnB1dCA9IG1lc3NhZ2VNaXNzaW5nSW5wdXQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWlzc2luZ0lucHV0ID0gY29uc3QgTWVzc2FnZUNvZGUoIk1pc3NpbmdJbnB1dCIsCiAgICBtZXNzYWdlOiByIiIiTm8gaW5wdXQgZmlsZSBwcm92aWRlZCB0byB0aGUgY29tcGlsZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1pc3NpbmdNYWluID0gbWVzc2FnZU1pc3NpbmdNYWluOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdNYWluID0gY29uc3QgTWVzc2FnZUNvZGUoIk1pc3NpbmdNYWluIiwKICAgIG1lc3NhZ2U6IHIiIiJObyAnbWFpbicgbWV0aG9kIGZvdW5kLiIiIiwKICAgIHRpcDogciIiIlRyeSBhZGRpbmcgYSBtZXRob2QgbmFtZWQgJ21haW4nIHRvIHlvdXIgcHJvZ3JhbS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWlzc2luZ01ldGhvZFBhcmFtZXRlcnMgPSBtZXNzYWdlTWlzc2luZ01ldGhvZFBhcmFtZXRlcnM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWlzc2luZ01ldGhvZFBhcmFtZXRlcnMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNaXNzaW5nTWV0aG9kUGFyYW1ldGVycyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTUlTU0lOR19NRVRIT0RfUEFSQU1FVEVSUyJdLAogICAgbWVzc2FnZTogciIiIkEgbWV0aG9kIGRlY2xhcmF0aW9uIG5lZWRzIGFuIGV4cGxpY2l0IGxpc3Qgb2YgcGFyYW1ldGVycy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgYWRkaW5nIGEgcGFyYW1ldGVyIGxpc3QgdG8gdGhlIG1ldGhvZCBkZWNsYXJhdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWlzc2luZ09wZXJhdG9yS2V5d29yZCA9IG1lc3NhZ2VNaXNzaW5nT3BlcmF0b3JLZXl3b3JkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdPcGVyYXRvcktleXdvcmQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNaXNzaW5nT3BlcmF0b3JLZXl3b3JkIiwKICAgIGluZGV4OiAzMSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIk9wZXJhdG9yIGRlY2xhcmF0aW9ucyBtdXN0IGJlIHByZWNlZGVkIGJ5IHRoZSBrZXl3b3JkICdvcGVyYXRvcicuIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyB0aGUga2V5d29yZCAnb3BlcmF0b3InLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiB0ZW1wbGF0ZU1pc3NpbmdQYXJ0T2YgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkNhbid0IHVzZSAnI3VyaScgYXMgYSBwYXJ0LCBiZWNhdXNlIGl0IGhhcyBubyAncGFydCBvZicgZGVjbGFyYXRpb24uIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNNaXNzaW5nUGFydE9mKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IGNvZGVNaXNzaW5nUGFydE9mID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgICAgICJNaXNzaW5nUGFydE9mIiwgdGVtcGxhdGVNaXNzaW5nUGFydE9mLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJQQVJUX09GX05PTl9QQVJUIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c01pc3NpbmdQYXJ0T2YoVXJpIHVyaV8pIHsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU1pc3NpbmdQYXJ0T2YsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCB1c2UgJyR7dXJpfScgYXMgYSBwYXJ0LCBiZWNhdXNlIGl0IGhhcyBubyAncGFydCBvZicgZGVjbGFyYXRpb24uIiIiLAogICAgICBhcmd1bWVudHM6IHsndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nUHJlZml4SW5EZWZlcnJlZEltcG9ydCA9CiAgICBtZXNzYWdlTWlzc2luZ1ByZWZpeEluRGVmZXJyZWRJbXBvcnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWlzc2luZ1ByZWZpeEluRGVmZXJyZWRJbXBvcnQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNaXNzaW5nUHJlZml4SW5EZWZlcnJlZEltcG9ydCIsCiAgICBpbmRleDogMzAsCiAgICBtZXNzYWdlOiByIiIiRGVmZXJyZWQgaW1wb3J0cyBzaG91bGQgaGF2ZSBhIHByZWZpeC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgYWRkaW5nIGEgcHJlZml4IHRvIHRoZSBpbXBvcnQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1pc3NpbmdUeXBlZGVmUGFyYW1ldGVycyA9IG1lc3NhZ2VNaXNzaW5nVHlwZWRlZlBhcmFtZXRlcnM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWlzc2luZ1R5cGVkZWZQYXJhbWV0ZXJzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTWlzc2luZ1R5cGVkZWZQYXJhbWV0ZXJzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX1RZUEVERUZfUEFSQU1FVEVSUyJdLAogICAgbWVzc2FnZTogciIiIkEgdHlwZWRlZiBuZWVkcyBhbiBleHBsaWNpdCBsaXN0IG9mIHBhcmFtZXRlcnMuIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyBhIHBhcmFtZXRlciBsaXN0IHRvIHRoZSB0eXBlZGVmLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIERhcnRUeXBlIF90eXBlMyk+CiAgICB0ZW1wbGF0ZU1peGluQXBwbGljYXRpb25JbmNvbXBhdGlibGVTdXBlcnR5cGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBEYXJ0VHlwZSBfdHlwZTMpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiInI3R5cGUnIGRvZXNuJ3QgaW1wbGVtZW50ICcjdHlwZTInIHNvIGl0IGNhbid0IGJlIHVzZWQgd2l0aCAnI3R5cGUzJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNNaXhpbkFwcGxpY2F0aW9uSW5jb21wYXRpYmxlU3VwZXJ0eXBlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBEYXJ0VHlwZSBfdHlwZTMpPgogICAgY29kZU1peGluQXBwbGljYXRpb25JbmNvbXBhdGlibGVTdXBlcnR5cGUgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIERhcnRUeXBlIF90eXBlMyk+KAogICAgICAgICJNaXhpbkFwcGxpY2F0aW9uSW5jb21wYXRpYmxlU3VwZXJ0eXBlIiwKICAgICAgICB0ZW1wbGF0ZU1peGluQXBwbGljYXRpb25JbmNvbXBhdGlibGVTdXBlcnR5cGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JWElOX0FQUExJQ0FUSU9OX05PVF9JTVBMRU1FTlRFRF9JTlRFUkZBQ0UiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTWl4aW5BcHBsaWNhdGlvbkluY29tcGF0aWJsZVN1cGVydHlwZSgKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIERhcnRUeXBlIF90eXBlMykgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBMaXN0PE9iamVjdD4gdHlwZTNQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMyk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMyA9IHR5cGUzUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTWl4aW5BcHBsaWNhdGlvbkluY29tcGF0aWJsZVN1cGVydHlwZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIicke3R5cGV9JyBkb2Vzbid0IGltcGxlbWVudCAnJHt0eXBlMn0nIHNvIGl0IGNhbid0IGJlIHVzZWQgd2l0aCAnJHt0eXBlM30nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyLCAndHlwZTMnOiBfdHlwZTN9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZyBuYW1lMiwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZSk+IHRlbXBsYXRlTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3MgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIERhcnRUeXBlIF90eXBlKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlR5cGUgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgaW5mZXJyZWQgZm9yIHRoZSBtaXhpbiAnI25hbWUnIGJlY2F1c2UgJyNuYW1lMicgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBtaXhpbidzIHN1cGVydHlwZSBjb25zdHJhaW50ICcjdHlwZScuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNNaXhpbkluZmVyZW5jZU5vTWF0Y2hpbmdDbGFzcyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMiwgRGFydFR5cGUgX3R5cGUpPgogICAgY29kZU1peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBEYXJ0VHlwZSBfdHlwZSk+KAogICAgICAgICJNaXhpbkluZmVyZW5jZU5vTWF0Y2hpbmdDbGFzcyIsIHRlbXBsYXRlTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3MsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JWElOX0lORkVSRU5DRV9OT19QT1NTSUJMRV9TVUJTVElUVVRJT04iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3MoCiAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBEYXJ0VHlwZSBfdHlwZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3MsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUeXBlIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIGluZmVycmVkIGZvciB0aGUgbWl4aW4gJyR7bmFtZX0nIGJlY2F1c2UgJyR7bmFtZTJ9JyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG1peGluJ3Mgc3VwZXJ0eXBlIGNvbnN0cmFpbnQgJyR7dHlwZX0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnbmFtZTInOiBuYW1lMiwgJ3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIHN0cmluZywKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgc3RyaW5nMik+IHRlbXBsYXRlTW9kaWZpZXJPdXRPZk9yZGVyID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbW9kaWZpZXIgJyNzdHJpbmcnIHNob3VsZCBiZSBiZWZvcmUgdGhlIG1vZGlmaWVyICcjc3RyaW5nMicuIiIiLAogICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgcmUtb3JkZXJpbmcgdGhlIG1vZGlmaWVycy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c01vZGlmaWVyT3V0T2ZPcmRlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgY29kZU1vZGlmaWVyT3V0T2ZPcmRlciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPigKICAgICAgICAiTW9kaWZpZXJPdXRPZk9yZGVyIiwgdGVtcGxhdGVNb2RpZmllck91dE9mT3JkZXIsCiAgICAgICAgaW5kZXg6IDU2KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNNb2RpZmllck91dE9mT3JkZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChzdHJpbmcyLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTW9kaWZpZXJPdXRPZk9yZGVyLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIG1vZGlmaWVyICcke3N0cmluZ30nIHNob3VsZCBiZSBiZWZvcmUgdGhlIG1vZGlmaWVyICcke3N0cmluZzJ9Jy4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IHJlLW9yZGVyaW5nIHRoZSBtb2RpZmllcnMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAnc3RyaW5nMic6IHN0cmluZzJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTW9yZVRoYW5PbmVTdXBlck9yVGhpc0luaXRpYWxpemVyID0KICAgIG1lc3NhZ2VNb3JlVGhhbk9uZVN1cGVyT3JUaGlzSW5pdGlhbGl6ZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTW9yZVRoYW5PbmVTdXBlck9yVGhpc0luaXRpYWxpemVyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTW9yZVRoYW5PbmVTdXBlck9yVGhpc0luaXRpYWxpemVyIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJTVVBFUl9JTl9SRURJUkVDVElOR19DT05TVFJVQ1RPUiJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSAnc3VwZXInIG9yICd0aGlzJyBpbml0aWFsaXplci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTXVsdGlwbGVFeHRlbmRzID0gbWVzc2FnZU11bHRpcGxlRXh0ZW5kczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNdWx0aXBsZUV4dGVuZHMgPSBjb25zdCBNZXNzYWdlQ29kZSgiTXVsdGlwbGVFeHRlbmRzIiwKICAgIGluZGV4OiAyOCwKICAgIG1lc3NhZ2U6IHIiIiJFYWNoIGNsYXNzIGRlZmluaXRpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgZXh0ZW5kcyBjbGF1c2UuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgY2hvb3Npbmcgb25lIHN1cGVyY2xhc3MgYW5kIGRlZmluZSB5b3VyIGNsYXNzIHRvIGltcGxlbWVudCAob3IgbWl4IGluKSB0aGUgb3RoZXJzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNdWx0aXBsZUltcGxlbWVudHMgPSBtZXNzYWdlTXVsdGlwbGVJbXBsZW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU11bHRpcGxlSW1wbGVtZW50cyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk11bHRpcGxlSW1wbGVtZW50cyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTVVMVElQTEVfSU1QTEVNRU5UU19DTEFVU0VTIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJFYWNoIGNsYXNzIGRlZmluaXRpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgaW1wbGVtZW50cyBjbGF1c2UuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgY29tYmluaW5nIGFsbCBvZiB0aGUgaW1wbGVtZW50cyBjbGF1c2VzIGludG8gYSBzaW5nbGUgY2xhdXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNdWx0aXBsZUxpYnJhcnlEaXJlY3RpdmVzID0KICAgIG1lc3NhZ2VNdWx0aXBsZUxpYnJhcnlEaXJlY3RpdmVzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU11bHRpcGxlTGlicmFyeURpcmVjdGl2ZXMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNdWx0aXBsZUxpYnJhcnlEaXJlY3RpdmVzIiwKICAgIGluZGV4OiAyNywKICAgIG1lc3NhZ2U6IHIiIiJPbmx5IG9uZSBsaWJyYXJ5IGRpcmVjdGl2ZSBtYXkgYmUgZGVjbGFyZWQgaW4gYSBmaWxlLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSBvZiB0aGUgbGlicmFyeSBkaXJlY3RpdmVzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNdWx0aXBsZU9uQ2xhdXNlcyA9IG1lc3NhZ2VNdWx0aXBsZU9uQ2xhdXNlczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNdWx0aXBsZU9uQ2xhdXNlcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk11bHRpcGxlT25DbGF1c2VzIiwKICAgIGluZGV4OiAyNiwKICAgIG1lc3NhZ2U6IHIiIiJFYWNoIG1peGluIGRlZmluaXRpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgb24gY2xhdXNlLiIiIiwKICAgIHRpcDogciIiIlRyeSBjb21iaW5pbmcgYWxsIG9mIHRoZSBvbiBjbGF1c2VzIGludG8gYSBzaW5nbGUgY2xhdXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNdWx0aXBsZVdpdGggPSBtZXNzYWdlTXVsdGlwbGVXaXRoOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU11bHRpcGxlV2l0aCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJNdWx0aXBsZVdpdGgiLAogICAgaW5kZXg6IDI0LAogICAgbWVzc2FnZTogciIiIkVhY2ggY2xhc3MgZGVmaW5pdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSB3aXRoIGNsYXVzZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgY29tYmluaW5nIGFsbCBvZiB0aGUgd2l0aCBjbGF1c2VzIGludG8gYSBzaW5nbGUgY2xhdXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbiA9IG1lc3NhZ2VOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk5hbWVkRnVuY3Rpb25FeHByZXNzaW9uIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOQU1FRF9GVU5DVElPTl9FWFBSRVNTSU9OIl0sCiAgICBtZXNzYWdlOiByIiIiQSBmdW5jdGlvbiBleHByZXNzaW9uIGNhbid0IGhhdmUgYSBuYW1lLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZU5hbWVkTWl4aW5PdmVycmlkZUNvbnRleHQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIk92ZXJyaWRlIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBtaXhpbiBhcHBsaWNhdGlvbiBjbGFzcyAnI25hbWUnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTmFtZWRNaXhpbk92ZXJyaWRlQ29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlTmFtZWRNaXhpbk92ZXJyaWRlQ29udGV4dCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiTmFtZWRNaXhpbk92ZXJyaWRlQ29udGV4dCIsIHRlbXBsYXRlTmFtZWRNaXhpbk92ZXJyaWRlQ29udGV4dCwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTmFtZWRNaXhpbk92ZXJyaWRlQ29udGV4dChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU5hbWVkTWl4aW5PdmVycmlkZUNvbnRleHQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJPdmVycmlkZSB3YXMgaW50cm9kdWNlZCBpbiB0aGUgbWl4aW4gYXBwbGljYXRpb24gY2xhc3MgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbiA9CiAgICBtZXNzYWdlTmF0aXZlQ2xhdXNlU2hvdWxkQmVBbm5vdGF0aW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbiIsCiAgICBpbmRleDogMjMsCiAgICBtZXNzYWdlOiByIiIiTmF0aXZlIGNsYXVzZSBpbiB0aGlzIGZvcm0gaXMgZGVwcmVjYXRlZC4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGlzIG5hdGl2ZSBjbGF1c2UgYW5kIGFkZGluZyBAbmF0aXZlKCkgb3IgQG5hdGl2ZSgnbmF0aXZlLW5hbWUnKSBiZWZvcmUgdGhlIGRlY2xhcmF0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZU5vRm9ybWFscyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkEgZnVuY3Rpb24gc2hvdWxkIGhhdmUgZm9ybWFsIHBhcmFtZXRlcnMuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBhZGRpbmcgJygpJyBhZnRlciAnI2xleGVtZScsIG9yIGFkZCAnZ2V0JyBiZWZvcmUgJyNsZXhlbWUnIHRvIGRlY2xhcmUgYSBnZXR0ZXIuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOb0Zvcm1hbHMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZU5vRm9ybWFscyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigiTm9Gb3JtYWxzIiwgdGVtcGxhdGVOb0Zvcm1hbHMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfRlVOQ1RJT05fUEFSQU1FVEVSUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOb0Zvcm1hbHMoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm9Gb3JtYWxzLAogICAgICBtZXNzYWdlOiAiIiJBIGZ1bmN0aW9uIHNob3VsZCBoYXZlIGZvcm1hbCBwYXJhbWV0ZXJzLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGFkZGluZyAnKCknIGFmdGVyICcke2xleGVtZX0nLCBvciBhZGQgJ2dldCcgYmVmb3JlICcke2xleGVtZX0nIHRvIGRlY2xhcmUgYSBnZXR0ZXIuIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVOb1N1Y2hOYW1lZFBhcmFtZXRlciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiTm8gbmFtZWQgcGFyYW1ldGVyIHdpdGggdGhlIG5hbWUgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOb1N1Y2hOYW1lZFBhcmFtZXRlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlTm9TdWNoTmFtZWRQYXJhbWV0ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIk5vU3VjaE5hbWVkUGFyYW1ldGVyIiwgdGVtcGxhdGVOb1N1Y2hOYW1lZFBhcmFtZXRlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX05BTUVEX1BBUkFNRVRFUiJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c05vU3VjaE5hbWVkUGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm9TdWNoTmFtZWRQYXJhbWV0ZXIsCiAgICAgIG1lc3NhZ2U6ICIiIk5vIG5hbWVkIHBhcmFtZXRlciB3aXRoIHRoZSBuYW1lICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVOb1VubmFtZWRDb25zdHJ1Y3RvckluT2JqZWN0ID0KICAgIG1lc3NhZ2VOb1VubmFtZWRDb25zdHJ1Y3RvckluT2JqZWN0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU5vVW5uYW1lZENvbnN0cnVjdG9ySW5PYmplY3QgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJOb1VubmFtZWRDb25zdHJ1Y3RvckluT2JqZWN0IiwKICAgIG1lc3NhZ2U6IHIiIiInT2JqZWN0JyBoYXMgbm8gdW5uYW1lZCBjb25zdHJ1Y3Rvci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBjaGFyYWN0ZXIsCiAgICAgICAgaW50CiAgICAgICAgICAgIGNvZGVQb2ludCk+IHRlbXBsYXRlTm9uQXNjaWlJZGVudGlmaWVyID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgY2hhcmFjdGVyLCBpbnQgY29kZVBvaW50KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBub24tQVNDSUkgY2hhcmFjdGVyICcjY2hhcmFjdGVyJyAoI3VuaWNvZGUpIGNhbid0IGJlIHVzZWQgaW4gaWRlbnRpZmllcnMsIG9ubHkgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSB1c2luZyBhbiBVUy1BU0NJSSBsZXR0ZXIsIGEgZGlnaXQsICdfJyAoYW4gdW5kZXJzY29yZSksIG9yICckJyAoYSBkb2xsYXIgc2lnbikuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOb25Bc2NpaUlkZW50aWZpZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBjaGFyYWN0ZXIsIGludCBjb2RlUG9pbnQpPgogICAgY29kZU5vbkFzY2lpSWRlbnRpZmllciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIGNoYXJhY3RlciwgaW50IGNvZGVQb2ludCk+KAogICAgICAgICJOb25Bc2NpaUlkZW50aWZpZXIiLCB0ZW1wbGF0ZU5vbkFzY2lpSWRlbnRpZmllciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSUxMRUdBTF9DSEFSQUNURVIiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTm9uQXNjaWlJZGVudGlmaWVyKFN0cmluZyBjaGFyYWN0ZXIsIGludCBjb2RlUG9pbnQpIHsKICBpZiAoY2hhcmFjdGVyLnJ1bmVzLmxlbmd0aCAhPSAxKSB0aHJvdyAiTm90IGEgY2hhcmFjdGVyICcke2NoYXJhY3Rlcn0nIjsKICBTdHJpbmcgdW5pY29kZSA9CiAgICAgICJVKyR7Y29kZVBvaW50LnRvUmFkaXhTdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkucGFkTGVmdCg0LCAnMCcpfSI7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVOb25Bc2NpaUlkZW50aWZpZXIsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgbm9uLUFTQ0lJIGNoYXJhY3RlciAnJHtjaGFyYWN0ZXJ9JyAoJHt1bmljb2RlfSkgY2FuJ3QgYmUgdXNlZCBpbiBpZGVudGlmaWVycywgb25seSBpbiBzdHJpbmdzIGFuZCBjb21tZW50cy4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IHVzaW5nIGFuIFVTLUFTQ0lJIGxldHRlciwgYSBkaWdpdCwgJ18nIChhbiB1bmRlcnNjb3JlKSwgb3IgJ1wkJyAoYSBkb2xsYXIgc2lnbikuIiIiLAogICAgICBhcmd1bWVudHM6IHsnY2hhcmFjdGVyJzogY2hhcmFjdGVyLCAnY29kZVBvaW50JzogY29kZVBvaW50fSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBpbnQKICAgICAgICAgICAgY29kZVBvaW50KT4gdGVtcGxhdGVOb25Bc2NpaVdoaXRlc3BhY2UgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKGludCBjb2RlUG9pbnQpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIG5vbi1BU0NJSSBzcGFjZSBjaGFyYWN0ZXIgI3VuaWNvZGUgY2FuIG9ubHkgYmUgdXNlZCBpbiBzdHJpbmdzIGFuZCBjb21tZW50cy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c05vbkFzY2lpV2hpdGVzcGFjZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvZGVQb2ludCk+IGNvZGVOb25Bc2NpaVdoaXRlc3BhY2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb2RlUG9pbnQpPigKICAgICAgICAiTm9uQXNjaWlXaGl0ZXNwYWNlIiwgdGVtcGxhdGVOb25Bc2NpaVdoaXRlc3BhY2UsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklMTEVHQUxfQ0hBUkFDVEVSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c05vbkFzY2lpV2hpdGVzcGFjZShpbnQgY29kZVBvaW50KSB7CiAgU3RyaW5nIHVuaWNvZGUgPQogICAgICAiVSske2NvZGVQb2ludC50b1JhZGl4U3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnBhZExlZnQoNCwgJzAnKX0iOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm9uQXNjaWlXaGl0ZXNwYWNlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIG5vbi1BU0NJSSBzcGFjZSBjaGFyYWN0ZXIgJHt1bmljb2RlfSBjYW4gb25seSBiZSB1c2VkIGluIHN0cmluZ3MgYW5kIGNvbW1lbnRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J2NvZGVQb2ludCc6IGNvZGVQb2ludH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVOb25Db25zdENvbnN0cnVjdG9yID0gbWVzc2FnZU5vbkNvbnN0Q29uc3RydWN0b3I7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTm9uQ29uc3RDb25zdHJ1Y3RvciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk5vbkNvbnN0Q29uc3RydWN0b3IiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9DT05TVEFOVF9FWFBSRVNTSU9OIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJDYW5ub3QgaW52b2tlIGEgbm9uLSdjb25zdCcgY29uc3RydWN0b3Igd2hlcmUgYSBjb25zdCBleHByZXNzaW9uIGlzIGV4cGVjdGVkLiIiIiwKICAgIHRpcDogciIiIlRyeSB1c2luZyBhIGNvbnN0cnVjdG9yIG9yIGZhY3RvcnkgdGhhdCBpcyAnY29uc3QnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVOb25Db25zdEZhY3RvcnkgPSBtZXNzYWdlTm9uQ29uc3RGYWN0b3J5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU5vbkNvbnN0RmFjdG9yeSA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJOb25Db25zdEZhY3RvcnkiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9DT05TVEFOVF9FWFBSRVNTSU9OIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJDYW5ub3QgaW52b2tlIGEgbm9uLSdjb25zdCcgZmFjdG9yeSB3aGVyZSBhIGNvbnN0IGV4cHJlc3Npb24gaXMgZXhwZWN0ZWQuIiIiLAogICAgdGlwOiByIiIiVHJ5IHVzaW5nIGEgY29uc3RydWN0b3Igb3IgZmFjdG9yeSB0aGF0IGlzICdjb25zdCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU5vbkluc3RhbmNlVHlwZVZhcmlhYmxlVXNlID0KICAgIG1lc3NhZ2VOb25JbnN0YW5jZVR5cGVWYXJpYWJsZVVzZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb25JbnN0YW5jZVR5cGVWYXJpYWJsZVVzZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk5vbkluc3RhbmNlVHlwZVZhcmlhYmxlVXNlIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX1BBUkFNRVRFUl9SRUZFUkVOQ0VEX0JZX1NUQVRJQyJdLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZywKICAgIG1lc3NhZ2U6IHIiIiJDYW4gb25seSB1c2UgdHlwZSB2YXJpYWJsZXMgaW4gaW5zdGFuY2UgbWV0aG9kcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTm9uTnVsbEF3YXJlU3ByZWFkSXNOdWxsID0gbWVzc2FnZU5vbk51bGxBd2FyZVNwcmVhZElzTnVsbDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb25OdWxsQXdhcmVTcHJlYWRJc051bGwgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJOb25OdWxsQXdhcmVTcHJlYWRJc051bGwiLAogICAgbWVzc2FnZTogciIiIkNhbid0IHNwcmVhZCBhIHZhbHVlIHdpdGggc3RhdGljIHR5cGUgTnVsbC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTm9uUGFydE9mRGlyZWN0aXZlSW5QYXJ0ID0gbWVzc2FnZU5vblBhcnRPZkRpcmVjdGl2ZUluUGFydDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb25QYXJ0T2ZEaXJlY3RpdmVJblBhcnQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJOb25QYXJ0T2ZEaXJlY3RpdmVJblBhcnQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PTl9QQVJUX09GX0RJUkVDVElWRV9JTl9QQVJUIl0sCiAgICBtZXNzYWdlOiByIiIiVGhlIHBhcnQtb2YgZGlyZWN0aXZlIG11c3QgYmUgdGhlIG9ubHkgZGlyZWN0aXZlIGluIGEgcGFydC4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgb3RoZXIgZGlyZWN0aXZlcywgb3IgbW92aW5nIHRoZW0gdG8gdGhlIGxpYnJhcnkgZm9yIHdoaWNoIHRoaXMgaXMgYSBwYXJ0LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkJvdW5kIG9mIHRoaXMgdmFyaWFibGUgcmVmZXJlbmNlcyByYXcgdHlwZSAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c05vblNpbXBsZUJvdW5kVmlhUmVmZXJlbmNlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVOb25TaW1wbGVCb3VuZFZpYVJlZmVyZW5jZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2UiLCB0ZW1wbGF0ZU5vblNpbXBsZUJvdW5kVmlhUmVmZXJlbmNlLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOb25TaW1wbGVCb3VuZFZpYVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU5vblNpbXBsZUJvdW5kVmlhUmVmZXJlbmNlLAogICAgICBtZXNzYWdlOiAiIiJCb3VuZCBvZiB0aGlzIHZhcmlhYmxlIHJlZmVyZW5jZXMgcmF3IHR5cGUgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlTm9uU2ltcGxlQm91bmRWaWFWYXJpYWJsZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQm91bmQgb2YgdGhpcyB2YXJpYWJsZSByZWZlcmVuY2VzIHZhcmlhYmxlICcjbmFtZScgZnJvbSB0aGUgc2FtZSBkZWNsYXJhdGlvbi4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c05vblNpbXBsZUJvdW5kVmlhVmFyaWFibGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU5vblNpbXBsZUJvdW5kVmlhVmFyaWFibGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIk5vblNpbXBsZUJvdW5kVmlhVmFyaWFibGUiLCB0ZW1wbGF0ZU5vblNpbXBsZUJvdW5kVmlhVmFyaWFibGUsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c05vblNpbXBsZUJvdW5kVmlhVmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVOb25TaW1wbGVCb3VuZFZpYVZhcmlhYmxlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQm91bmQgb2YgdGhpcyB2YXJpYWJsZSByZWZlcmVuY2VzIHZhcmlhYmxlICcke25hbWV9JyBmcm9tIHRoZSBzYW1lIGRlY2xhcmF0aW9uLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU5vdEFDb25zdGFudEV4cHJlc3Npb24gPSBtZXNzYWdlTm90QUNvbnN0YW50RXhwcmVzc2lvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb3RBQ29uc3RhbnRFeHByZXNzaW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTm90QUNvbnN0YW50RXhwcmVzc2lvbiIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0NPTlNUQU5UX0VYUFJFU1NJT04iXSwKICAgIG1lc3NhZ2U6IHIiIiJOb3QgYSBjb25zdGFudCBleHByZXNzaW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVOb3RBUHJlZml4SW5UeXBlQW5ub3RhdGlvbiA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiInI25hbWUuI25hbWUyJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBiZWNhdXNlICcjbmFtZScgZG9lc24ndCByZWZlciB0byBhbiBpbXBvcnQgcHJlZml4LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTm90QVByZWZpeEluVHlwZUFubm90YXRpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZU5vdEFQcmVmaXhJblR5cGVBbm5vdGF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIk5vdEFQcmVmaXhJblR5cGVBbm5vdGF0aW9uIiwgdGVtcGxhdGVOb3RBUHJlZml4SW5UeXBlQW5ub3RhdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0FfVFlQRSJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c05vdEFQcmVmaXhJblR5cGVBbm5vdGF0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm90QVByZWZpeEluVHlwZUFubm90YXRpb24sCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiInJHtuYW1lfS4ke25hbWUyfScgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgYmVjYXVzZSAnJHtuYW1lfScgZG9lc24ndCByZWZlciB0byBhbiBpbXBvcnQgcHJlZml4LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnbmFtZTInOiBuYW1lMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVOb3RBVHlwZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBpc24ndCBhIHR5cGUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTm90QVR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU5vdEFUeXBlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KCJOb3RBVHlwZSIsIHRlbXBsYXRlTm90QVR5cGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9BX1RZUEUiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOb3RBVHlwZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU5vdEFUeXBlLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXNuJ3QgYSB0eXBlLiIiIiwgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU5vdEFUeXBlQ29udGV4dCA9IG1lc3NhZ2VOb3RBVHlwZUNvbnRleHQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTm90QVR5cGVDb250ZXh0ID0gY29uc3QgTWVzc2FnZUNvZGUoIk5vdEFUeXBlQ29udGV4dCIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwgbWVzc2FnZTogciIiIlRoaXMgaXNuJ3QgYSB0eXBlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVOb3RBbkx2YWx1ZSA9IG1lc3NhZ2VOb3RBbkx2YWx1ZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb3RBbkx2YWx1ZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJOb3RBbkx2YWx1ZSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0FOX0xWQUxVRSJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IGFzc2lnbiB0byB0aGlzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gdGVtcGxhdGVOb3RCaW5hcnlPcGVyYXRvciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNsZXhlbWUnIGlzbid0IGEgYmluYXJ5IG9wZXJhdG9yLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c05vdEJpbmFyeU9wZXJhdG9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVOb3RCaW5hcnlPcGVyYXRvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAiTm90QmluYXJ5T3BlcmF0b3IiLAogIHRlbXBsYXRlTm90QmluYXJ5T3BlcmF0b3IsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTm90QmluYXJ5T3BlcmF0b3IoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm90QmluYXJ5T3BlcmF0b3IsCiAgICAgIG1lc3NhZ2U6ICIiIicke2xleGVtZX0nIGlzbid0IGEgYmluYXJ5IG9wZXJhdG9yLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gdGVtcGxhdGVOb3RDb25zdGFudEV4cHJlc3Npb24gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiI3N0cmluZyBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c05vdENvbnN0YW50RXhwcmVzc2lvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IGNvZGVOb3RDb25zdGFudEV4cHJlc3Npb24gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiTm90Q29uc3RhbnRFeHByZXNzaW9uIiwgdGVtcGxhdGVOb3RDb25zdGFudEV4cHJlc3Npb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9DT05TVEFOVF9FWFBSRVNTSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c05vdENvbnN0YW50RXhwcmVzc2lvbihTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU5vdENvbnN0YW50RXhwcmVzc2lvbiwKICAgICAgbWVzc2FnZTogIiIiJHtzdHJpbmd9IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24uIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU9iamVjdEV4dGVuZHMgPSBtZXNzYWdlT2JqZWN0RXh0ZW5kczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VPYmplY3RFeHRlbmRzID0gY29uc3QgTWVzc2FnZUNvZGUoIk9iamVjdEV4dGVuZHMiLAogICAgbWVzc2FnZTogciIiIlRoZSBjbGFzcyAnT2JqZWN0JyBjYW4ndCBoYXZlIGEgc3VwZXJjbGFzcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlT2JqZWN0SW1wbGVtZW50cyA9IG1lc3NhZ2VPYmplY3RJbXBsZW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU9iamVjdEltcGxlbWVudHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJPYmplY3RJbXBsZW1lbnRzIiwKICAgIG1lc3NhZ2U6IHIiIiJUaGUgY2xhc3MgJ09iamVjdCcgY2FuJ3QgaW1wbGVtZW50IGFueXRoaW5nLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVPYmplY3RNaXhlc0luID0gbWVzc2FnZU9iamVjdE1peGVzSW47CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlT2JqZWN0TWl4ZXNJbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJPYmplY3RNaXhlc0luIiwKICAgIG1lc3NhZ2U6IHIiIiJUaGUgY2xhc3MgJ09iamVjdCcgY2FuJ3QgdXNlIG1peGlucy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlT25seVRyeSA9IG1lc3NhZ2VPbmx5VHJ5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU9ubHlUcnkgPSBjb25zdCBNZXNzYWdlQ29kZSgiT25seVRyeSIsCiAgICBpbmRleDogMjAsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJBIHRyeSBibG9jayBtdXN0IGJlIGZvbGxvd2VkIGJ5IGFuICdvbicsICdjYXRjaCcsIG9yICdmaW5hbGx5JyBjbGF1c2UuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgYWRkaW5nIGVpdGhlciBhIGNhdGNoIG9yIGZpbmFsbHkgY2xhdXNlLCBvciByZW1vdmUgdGhlIHRyeSBzdGF0ZW1lbnQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlT3BlcmF0b3JNaW51c1BhcmFtZXRlck1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiT3BlcmF0b3IgJyNuYW1lJyBzaG91bGQgaGF2ZSB6ZXJvIG9yIG9uZSBwYXJhbWV0ZXIuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIldpdGggemVybyBwYXJhbWV0ZXJzLCBpdCBoYXMgdGhlIHN5bnRhY3RpYyBmb3JtICctYScsIGZvcm1hbGx5IGtub3duIGFzICd1bmFyeS0nLiBXaXRoIG9uZSBwYXJhbWV0ZXIsIGl0IGhhcyB0aGUgc3ludGFjdGljIGZvcm0gJ2EgLSBiJywgZm9ybWFsbHkga25vd24gYXMgJy0nLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzT3BlcmF0b3JNaW51c1BhcmFtZXRlck1pc21hdGNoKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVPcGVyYXRvck1pbnVzUGFyYW1ldGVyTWlzbWF0Y2ggPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oIk9wZXJhdG9yTWludXNQYXJhbWV0ZXJNaXNtYXRjaCIsCiAgICAgICAgdGVtcGxhdGVPcGVyYXRvck1pbnVzUGFyYW1ldGVyTWlzbWF0Y2gsIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WwogICJXUk9OR19OVU1CRVJfT0ZfUEFSQU1FVEVSU19GT1JfT1BFUkFUT1JfTUlOVVMiCl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c09wZXJhdG9yTWludXNQYXJhbWV0ZXJNaXNtYXRjaChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU9wZXJhdG9yTWludXNQYXJhbWV0ZXJNaXNtYXRjaCwKICAgICAgbWVzc2FnZTogIiIiT3BlcmF0b3IgJyR7bmFtZX0nIHNob3VsZCBoYXZlIHplcm8gb3Igb25lIHBhcmFtZXRlci4iIiIsCiAgICAgIHRpcDoKICAgICAgICAgICIiIldpdGggemVybyBwYXJhbWV0ZXJzLCBpdCBoYXMgdGhlIHN5bnRhY3RpYyBmb3JtICctYScsIGZvcm1hbGx5IGtub3duIGFzICd1bmFyeS0nLiBXaXRoIG9uZSBwYXJhbWV0ZXIsIGl0IGhhcyB0aGUgc3ludGFjdGljIGZvcm0gJ2EgLSBiJywgZm9ybWFsbHkga25vd24gYXMgJy0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiT3BlcmF0b3IgJyNuYW1lJyBzaG91bGRuJ3QgaGF2ZSBhbnkgcGFyYW1ldGVycy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDAgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIk9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gwIiwKICB0ZW1wbGF0ZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gwLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c09wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gwKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDAsCiAgICAgIG1lc3NhZ2U6ICIiIk9wZXJhdG9yICcke25hbWV9JyBzaG91bGRuJ3QgaGF2ZSBhbnkgcGFyYW1ldGVycy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDEgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIk9wZXJhdG9yICcjbmFtZScgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c09wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gxKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDEiLCB0ZW1wbGF0ZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gxLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJXUk9OR19OVU1CRVJfT0ZfUEFSQU1FVEVSU19GT1JfT1BFUkFUT1IiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDEoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMSwKICAgICAgbWVzc2FnZTogIiIiT3BlcmF0b3IgJyR7bmFtZX0nIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlci4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIk9wZXJhdG9yICcjbmFtZScgc2hvdWxkIGhhdmUgZXhhY3RseSB0d28gcGFyYW1ldGVycy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIk9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gyIiwgdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiV1JPTkdfTlVNQkVSX09GX1BBUkFNRVRFUlNfRk9SX09QRVJBVE9SIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c09wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDIsCiAgICAgIG1lc3NhZ2U6ICIiIk9wZXJhdG9yICcke25hbWV9JyBzaG91bGQgaGF2ZSBleGFjdGx5IHR3byBwYXJhbWV0ZXJzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU9wZXJhdG9yV2l0aE9wdGlvbmFsRm9ybWFscyA9CiAgICBtZXNzYWdlT3BlcmF0b3JXaXRoT3B0aW9uYWxGb3JtYWxzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU9wZXJhdG9yV2l0aE9wdGlvbmFsRm9ybWFscyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk9wZXJhdG9yV2l0aE9wdGlvbmFsRm9ybWFscyIsCiAgICBtZXNzYWdlOiByIiIiQW4gb3BlcmF0b3IgY2FuJ3QgaGF2ZSBvcHRpb25hbCBwYXJhbWV0ZXJzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVPdmVycmlkZGVuTWV0aG9kQ2F1c2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoaXMgaXMgdGhlIG92ZXJyaWRkZW4gbWV0aG9kICgnI25hbWUnKS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPdmVycmlkZGVuTWV0aG9kQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU92ZXJyaWRkZW5NZXRob2RDYXVzZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiT3ZlcnJpZGRlbk1ldGhvZENhdXNlIiwgdGVtcGxhdGVPdmVycmlkZGVuTWV0aG9kQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c092ZXJyaWRkZW5NZXRob2RDYXVzZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU92ZXJyaWRkZW5NZXRob2RDYXVzZSwKICAgICAgbWVzc2FnZTogIiIiVGhpcyBpcyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QgKCcke25hbWV9JykuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lMik+IHRlbXBsYXRlT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBtZXRob2QgJyNuYW1lJyBoYXMgZmV3ZXIgbmFtZWQgYXJndW1lbnRzIHRoYW4gdGhvc2Ugb2Ygb3ZlcnJpZGRlbiBtZXRob2QgJyNuYW1lMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPdmVycmlkZUZld2VyTmFtZWRBcmd1bWVudHMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZU92ZXJyaWRlRmV3ZXJOYW1lZEFyZ3VtZW50cyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJPdmVycmlkZUZld2VyTmFtZWRBcmd1bWVudHMiLCB0ZW1wbGF0ZU92ZXJyaWRlRmV3ZXJOYW1lZEFyZ3VtZW50cywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9PVkVSUklERV9OQU1FRCJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c092ZXJyaWRlRmV3ZXJOYW1lZEFyZ3VtZW50cyhTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU92ZXJyaWRlRmV3ZXJOYW1lZEFyZ3VtZW50cywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBtZXRob2QgJyR7bmFtZX0nIGhhcyBmZXdlciBuYW1lZCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnJHtuYW1lMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnbmFtZTInOiBuYW1lMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50cyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbWV0aG9kICcjbmFtZScgaGFzIGZld2VyIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYW4gdGhvc2Ugb2Ygb3ZlcnJpZGRlbiBtZXRob2QgJyNuYW1lMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50cyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+CiAgICBjb2RlT3ZlcnJpZGVGZXdlclBvc2l0aW9uYWxBcmd1bWVudHMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgICAgICAiT3ZlcnJpZGVGZXdlclBvc2l0aW9uYWxBcmd1bWVudHMiLAogICAgICAgIHRlbXBsYXRlT3ZlcnJpZGVGZXdlclBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfT1ZFUlJJREVfUE9TSVRJT05BTCJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c092ZXJyaWRlRmV3ZXJQb3NpdGlvbmFsQXJndW1lbnRzKAogICAgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBtZXRob2QgJyR7bmFtZX0nIGhhcyBmZXdlciBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICcke25hbWUyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcgbmFtZTIsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUzKT4gdGVtcGxhdGVPdmVycmlkZU1pc21hdGNoTmFtZWRQYXJhbWV0ZXIgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIFN0cmluZyBuYW1lMyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbWV0aG9kICcjbmFtZScgZG9lc24ndCBoYXZlIHRoZSBuYW1lZCBwYXJhbWV0ZXIgJyNuYW1lMicgb2Ygb3ZlcnJpZGRlbiBtZXRob2QgJyNuYW1lMycuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPdmVycmlkZU1pc21hdGNoTmFtZWRQYXJhbWV0ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIFN0cmluZyBuYW1lMyk+CiAgICBjb2RlT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBTdHJpbmcgbmFtZTMpPigKICAgICAgICAiT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVyIiwKICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRlTWlzbWF0Y2hOYW1lZFBhcmFtZXRlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9PVkVSUklERV9OQU1FRCJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c092ZXJyaWRlTWlzbWF0Y2hOYW1lZFBhcmFtZXRlcigKICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIFN0cmluZyBuYW1lMykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgaWYgKG5hbWUzLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMyA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTMpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVyLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIG1ldGhvZCAnJHtuYW1lfScgZG9lc24ndCBoYXZlIHRoZSBuYW1lZCBwYXJhbWV0ZXIgJyR7bmFtZTJ9JyBvZiBvdmVycmlkZGVuIG1ldGhvZCAnJHtuYW1lM30nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnbmFtZTInOiBuYW1lMiwgJ25hbWUzJzogbmFtZTN9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lMik+IHRlbXBsYXRlT3ZlcnJpZGVNb3JlUmVxdWlyZWRBcmd1bWVudHMgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIG1ldGhvZCAnI25hbWUnIGhhcyBtb3JlIHJlcXVpcmVkIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICcjbmFtZTInLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzT3ZlcnJpZGVNb3JlUmVxdWlyZWRBcmd1bWVudHMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZU92ZXJyaWRlTW9yZVJlcXVpcmVkQXJndW1lbnRzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIk92ZXJyaWRlTW9yZVJlcXVpcmVkQXJndW1lbnRzIiwgdGVtcGxhdGVPdmVycmlkZU1vcmVSZXF1aXJlZEFyZ3VtZW50cywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9PVkVSUklERV9SRVFVSVJFRCJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c092ZXJyaWRlTW9yZVJlcXVpcmVkQXJndW1lbnRzKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3ZlcnJpZGVNb3JlUmVxdWlyZWRBcmd1bWVudHMsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgbWV0aG9kICcke25hbWV9JyBoYXMgbW9yZSByZXF1aXJlZCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnJHtuYW1lMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnbmFtZTInOiBuYW1lMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nIG5hbWUyLAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlIF90eXBlMiwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTMpPiB0ZW1wbGF0ZU92ZXJyaWRlVHlwZU1pc21hdGNoUGFyYW1ldGVyID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgIFN0cmluZyBuYW1lMiwKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMiwKICAgICAgICAgICAgU3RyaW5nCiAgICAgICAgICAgICAgICBuYW1lMyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgcGFyYW1ldGVyICcjbmFtZScgb2YgdGhlIG1ldGhvZCAnI25hbWUyJyBoYXMgdHlwZSAnI3R5cGUnLCB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyB0eXBlLCAnI3R5cGUyJywgaW4gdGhlIG92ZXJyaWRkZW4gbWV0aG9kLCAnI25hbWUzJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiQ2hhbmdlIHRvIGEgc3VwZXJ0eXBlIG9mICcjdHlwZTInLCBvciwgZm9yIGEgY292YXJpYW50IHBhcmFtZXRlciwgYSBzdWJ0eXBlLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzT3ZlcnJpZGVUeXBlTWlzbWF0Y2hQYXJhbWV0ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lMyk+IGNvZGVPdmVycmlkZVR5cGVNaXNtYXRjaFBhcmFtZXRlciA9CiAgICBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZTMpPigKICAgICAgICAiT3ZlcnJpZGVUeXBlTWlzbWF0Y2hQYXJhbWV0ZXIiLCB0ZW1wbGF0ZU92ZXJyaWRlVHlwZU1pc21hdGNoUGFyYW1ldGVyLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX01FVEhPRF9PVkVSUklERSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNPdmVycmlkZVR5cGVNaXNtYXRjaFBhcmFtZXRlcigKICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lMykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIGlmIChuYW1lMy5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTMgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUzKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVPdmVycmlkZVR5cGVNaXNtYXRjaFBhcmFtZXRlciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBwYXJhbWV0ZXIgJyR7bmFtZX0nIG9mIHRoZSBtZXRob2QgJyR7bmFtZTJ9JyBoYXMgdHlwZSAnJHt0eXBlfScsIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUsICcke3R5cGUyfScsIGluIHRoZSBvdmVycmlkZGVuIG1ldGhvZCwgJyR7bmFtZTN9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiQ2hhbmdlIHRvIGEgc3VwZXJ0eXBlIG9mICcke3R5cGUyfScsIG9yLCBmb3IgYSBjb3ZhcmlhbnQgcGFyYW1ldGVyLCBhIHN1YnR5cGUuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgJ25hbWUyJzogbmFtZTIsCiAgICAgICAgJ3R5cGUnOiBfdHlwZSwKICAgICAgICAndHlwZTInOiBfdHlwZTIsCiAgICAgICAgJ25hbWUzJzogbmFtZTMKICAgICAgfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kICcjbmFtZScgaXMgJyN0eXBlJywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCAnI3R5cGUyJywgb2YgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLCAnI25hbWUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZTogciIiIkNoYW5nZSB0byBhIHN1YnR5cGUgb2YgJyN0eXBlMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGUgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGUiLAogICAgICAgIHRlbXBsYXRlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hSZXR1cm5UeXBlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX01FVEhPRF9PVkVSUklERSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGUoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUyKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hSZXR1cm5UeXBlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgJyR7bmFtZX0nIGlzICcke3R5cGV9Jywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCAnJHt0eXBlMn0nLCBvZiB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsICcke25hbWUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIkNoYW5nZSB0byBhIHN1YnR5cGUgb2YgJyR7dHlwZTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICduYW1lJzogbmFtZSwKICAgICAgICAndHlwZSc6IF90eXBlLAogICAgICAgICd0eXBlMic6IF90eXBlMiwKICAgICAgICAnbmFtZTInOiBuYW1lMgogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lMik+IHRlbXBsYXRlT3ZlcnJpZGVUeXBlVmFyaWFibGVzTWlzbWF0Y2ggPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiRGVjbGFyZWQgdHlwZSB2YXJpYWJsZXMgb2YgJyNuYW1lJyBkb2Vzbid0IG1hdGNoIHRob3NlIG9uIG92ZXJyaWRkZW4gbWV0aG9kICcjbmFtZTInLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzT3ZlcnJpZGVUeXBlVmFyaWFibGVzTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZU92ZXJyaWRlVHlwZVZhcmlhYmxlc01pc21hdGNoID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIk92ZXJyaWRlVHlwZVZhcmlhYmxlc01pc21hdGNoIiwgdGVtcGxhdGVPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9NRVRIT0RfT1ZFUlJJREVfVFlQRV9QQVJBTUVURVJTIl0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzT3ZlcnJpZGVUeXBlVmFyaWFibGVzTWlzbWF0Y2goU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkRlY2xhcmVkIHR5cGUgdmFyaWFibGVzIG9mICcke25hbWV9JyBkb2Vzbid0IG1hdGNoIHRob3NlIG9uIG92ZXJyaWRkZW4gbWV0aG9kICcke25hbWUyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4gdGVtcGxhdGVQYWNrYWdlTm90Rm91bmQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJDb3VsZCBub3QgcmVzb2x2ZSB0aGUgcGFja2FnZSAnI25hbWUnIGluICcjdXJpJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNQYWNrYWdlTm90Rm91bmQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+IGNvZGVQYWNrYWdlTm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICJQYWNrYWdlTm90Rm91bmQiLAogIHRlbXBsYXRlUGFja2FnZU5vdEZvdW5kLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1BhY2thZ2VOb3RGb3VuZChTdHJpbmcgbmFtZSwgVXJpIHVyaV8pIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVQYWNrYWdlTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIkNvdWxkIG5vdCByZXNvbHZlIHRoZSBwYWNrYWdlICcke25hbWV9JyBpbiAnJHt1cml9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gdGVtcGxhdGVQYWNrYWdlc0ZpbGVGb3JtYXQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiUHJvYmxlbSBpbiBwYWNrYWdlcyBjb25maWd1cmF0aW9uIGZpbGU6ICNzdHJpbmciIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNQYWNrYWdlc0ZpbGVGb3JtYXQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiBjb2RlUGFja2FnZXNGaWxlRm9ybWF0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgIlBhY2thZ2VzRmlsZUZvcm1hdCIsCiAgdGVtcGxhdGVQYWNrYWdlc0ZpbGVGb3JtYXQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzUGFja2FnZXNGaWxlRm9ybWF0KFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlUGFja2FnZXNGaWxlRm9ybWF0LAogICAgICBtZXNzYWdlOiAiIiJQcm9ibGVtIGluIHBhY2thZ2VzIGNvbmZpZ3VyYXRpb24gZmlsZTogJHtzdHJpbmd9IiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVBhcnRFeHBvcnQgPSBtZXNzYWdlUGFydEV4cG9ydDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXJ0RXhwb3J0ID0gY29uc3QgTWVzc2FnZUNvZGUoIlBhcnRFeHBvcnQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUE9SVF9PRl9OT05fTElCUkFSWSJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQ2FuJ3QgZXhwb3J0IHRoaXMgZmlsZSBiZWNhdXNlIGl0IGNvbnRhaW5zIGEgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXJ0RXhwb3J0Q29udGV4dCA9IG1lc3NhZ2VQYXJ0RXhwb3J0Q29udGV4dDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXJ0RXhwb3J0Q29udGV4dCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlBhcnRFeHBvcnRDb250ZXh0IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoaXMgaXMgdGhlIGZpbGUgdGhhdCBjYW4ndCBiZSBleHBvcnRlZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGFydEluUGFydCA9IG1lc3NhZ2VQYXJ0SW5QYXJ0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhcnRJblBhcnQgPSBjb25zdCBNZXNzYWdlQ29kZSgiUGFydEluUGFydCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9OX1BBUlRfT0ZfRElSRUNUSVZFX0lOX1BBUlQiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIGZpbGUgdGhhdCdzIGEgcGFydCBvZiBhIGxpYnJhcnkgY2FuJ3QgaGF2ZSBwYXJ0cyBpdHNlbGYuIiIiLAogICAgdGlwOiByIiIiVHJ5IG1vdmluZyB0aGUgJ3BhcnQnIGRlY2xhcmF0aW9uIHRvIHRoZSBjb250YWluaW5nIGxpYnJhcnkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVBhcnRJblBhcnRMaWJyYXJ5Q29udGV4dCA9IG1lc3NhZ2VQYXJ0SW5QYXJ0TGlicmFyeUNvbnRleHQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUGFydEluUGFydExpYnJhcnlDb250ZXh0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUGFydEluUGFydExpYnJhcnlDb250ZXh0IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoaXMgaXMgdGhlIGNvbnRhaW5pbmcgbGlicmFyeS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gdGVtcGxhdGVQYXJ0T2ZJbkxpYnJhcnkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkNhbid0IGltcG9ydCAnI3VyaScsIGJlY2F1c2UgaXQgaGFzIGEgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlICdwYXJ0IG9mJyBkZWNsYXJhdGlvbiwgb3IgdXNpbmcgJyN1cmknIGFzIGEgcGFydC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1BhcnRPZkluTGlicmFyeSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiBjb2RlUGFydE9mSW5MaWJyYXJ5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgICAgICJQYXJ0T2ZJbkxpYnJhcnkiLCB0ZW1wbGF0ZVBhcnRPZkluTGlicmFyeSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU1QT1JUX09GX05PTl9MSUJSQVJZIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1BhcnRPZkluTGlicmFyeShVcmkgdXJpXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlUGFydE9mSW5MaWJyYXJ5LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgaW1wb3J0ICcke3VyaX0nLCBiZWNhdXNlIGl0IGhhcyBhICdwYXJ0IG9mJyBkZWNsYXJhdGlvbi4iIiIsCiAgICAgIHRpcDoKICAgICAgICAgICIiIlRyeSByZW1vdmluZyB0aGUgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLCBvciB1c2luZyAnJHt1cml9JyBhcyBhIHBhcnQuIiIiLAogICAgICBhcmd1bWVudHM6IHsndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgVXJpIHVyaV8sCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVQYXJ0T2ZMaWJyYXJ5TmFtZU1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJVc2luZyAnI3VyaScgYXMgcGFydCBvZiAnI25hbWUnIGJ1dCBpdHMgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uIHNheXMgJyNuYW1lMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNQYXJ0T2ZMaWJyYXJ5TmFtZU1pc21hdGNoKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+CiAgICBjb2RlUGFydE9mTGlicmFyeU5hbWVNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgICAgICAiUGFydE9mTGlicmFyeU5hbWVNaXNtYXRjaCIsIHRlbXBsYXRlUGFydE9mTGlicmFyeU5hbWVNaXNtYXRjaCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUEFSVF9PRl9ESUZGRVJFTlRfTElCUkFSWSJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1BhcnRPZkxpYnJhcnlOYW1lTWlzbWF0Y2goCiAgICBVcmkgdXJpXywgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVQYXJ0T2ZMaWJyYXJ5TmFtZU1pc21hdGNoLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVXNpbmcgJyR7dXJpfScgYXMgcGFydCBvZiAnJHtuYW1lfScgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnJHtuYW1lMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV8sICduYW1lJzogbmFtZSwgJ25hbWUyJzogbmFtZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGFydE9mU2VsZiA9IG1lc3NhZ2VQYXJ0T2ZTZWxmOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhcnRPZlNlbGYgPSBjb25zdCBNZXNzYWdlQ29kZSgiUGFydE9mU2VsZiIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUEFSVF9PRl9OT05fUEFSVCJdLAogICAgbWVzc2FnZTogciIiIkEgZmlsZSBjYW4ndCBiZSBhIHBhcnQgb2YgaXRzZWxmLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXJ0T2ZUd2ljZSA9IG1lc3NhZ2VQYXJ0T2ZUd2ljZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXJ0T2ZUd2ljZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJQYXJ0T2ZUd2ljZSIsCiAgICBpbmRleDogMjUsCiAgICBtZXNzYWdlOiByIiIiT25seSBvbmUgcGFydC1vZiBkaXJlY3RpdmUgbWF5IGJlIGRlY2xhcmVkIGluIGEgZmlsZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgYWxsIGJ1dCBvbmUgb2YgdGhlIHBhcnQtb2YgZGlyZWN0aXZlcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGFydE9mVHdvTGlicmFyaWVzID0gbWVzc2FnZVBhcnRPZlR3b0xpYnJhcmllczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQYXJ0T2ZUd29MaWJyYXJpZXMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlBBUlRfT0ZfRElGRkVSRU5UX0xJQlJBUlkiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIGZpbGUgY2FuJ3QgYmUgcGFydCBvZiBtb3JlIHRoYW4gb25lIGxpYnJhcnkuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgbW92aW5nIHRoZSBzaGFyZWQgZGVjbGFyYXRpb25zIGludG8gdGhlIGxpYnJhcmllcywgb3IgaW50byBhIG5ldyBsaWJyYXJ5LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXJ0T2ZUd29MaWJyYXJpZXNDb250ZXh0ID0KICAgIG1lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXNDb250ZXh0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhcnRPZlR3b0xpYnJhcmllc0NvbnRleHQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQYXJ0T2ZUd29MaWJyYXJpZXNDb250ZXh0IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlVzZWQgYXMgYSBwYXJ0IGluIHRoaXMgbGlicmFyeS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFVyaSB1cmlfLAogICAgICAgIFVyaSB1cmkyXywKICAgICAgICBVcmkKICAgICAgICAgICAgdXJpM18pPiB0ZW1wbGF0ZVBhcnRPZlVyaU1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgVXJpIHVyaTJfLCBVcmkgdXJpM18pPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVXNpbmcgJyN1cmknIGFzIHBhcnQgb2YgJyN1cmkyJyBidXQgaXRzICdwYXJ0IG9mJyBkZWNsYXJhdGlvbiBzYXlzICcjdXJpMycuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNQYXJ0T2ZVcmlNaXNtYXRjaCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFVyaSB1cmkyXywgVXJpIHVyaTNfKT4KICAgIGNvZGVQYXJ0T2ZVcmlNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFVyaSB1cmkyXywgVXJpIHVyaTNfKT4oCiAgICAgICAgIlBhcnRPZlVyaU1pc21hdGNoIiwgdGVtcGxhdGVQYXJ0T2ZVcmlNaXNtYXRjaCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUEFSVF9PRl9ESUZGRVJFTlRfTElCUkFSWSJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1BhcnRPZlVyaU1pc21hdGNoKFVyaSB1cmlfLCBVcmkgdXJpMl8sIFVyaSB1cmkzXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIFN0cmluZyB1cmkyID0gcmVsYXRpdml6ZVVyaSh1cmkyXyk7CiAgU3RyaW5nIHVyaTMgPSByZWxhdGl2aXplVXJpKHVyaTNfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVBhcnRPZlVyaU1pc21hdGNoLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVXNpbmcgJyR7dXJpfScgYXMgcGFydCBvZiAnJHt1cmkyfScgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnJHt1cmkzfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsndXJpJzogdXJpXywgJ3VyaTInOiB1cmkyXywgJ3VyaTMnOiB1cmkzX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgVXJpIHVyaV8sCiAgICAgICAgVXJpIHVyaTJfLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVQYXJ0T2ZVc2VVcmkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBVcmkgdXJpMl8sIFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlVzaW5nICcjdXJpJyBhcyBwYXJ0IG9mICcjdXJpMicgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnI25hbWUnLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgY2hhbmdpbmcgdGhlICdwYXJ0IG9mJyBkZWNsYXJhdGlvbiB0byB1c2UgYSByZWxhdGl2ZSBmaWxlIG5hbWUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNQYXJ0T2ZVc2VVcmkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBVcmkgdXJpMl8sIFN0cmluZyBuYW1lKT4KICAgIGNvZGVQYXJ0T2ZVc2VVcmkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBVcmkgdXJpMl8sIFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlBhcnRPZlVzZVVyaSIsIHRlbXBsYXRlUGFydE9mVXNlVXJpLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJQQVJUX09GX1VOTkFNRURfTElCUkFSWSJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1BhcnRPZlVzZVVyaShVcmkgdXJpXywgVXJpIHVyaTJfLCBTdHJpbmcgbmFtZSkgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIFN0cmluZyB1cmkyID0gcmVsYXRpdml6ZVVyaSh1cmkyXyk7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlUGFydE9mVXNlVXJpLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVXNpbmcgJyR7dXJpfScgYXMgcGFydCBvZiAnJHt1cmkyfScgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnJHtuYW1lfScuIiIiLAogICAgICB0aXA6ICIiIlRyeSBjaGFuZ2luZyB0aGUgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uIHRvIHVzZSBhIHJlbGF0aXZlIGZpbGUgbmFtZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd1cmknOiB1cmlfLCAndXJpMic6IHVyaTJfLCAnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGFydE9ycGhhbiA9IG1lc3NhZ2VQYXJ0T3JwaGFuOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhcnRPcnBoYW4gPSBjb25zdCBNZXNzYWdlQ29kZSgiUGFydE9ycGhhbiIsCiAgICBtZXNzYWdlOiByIiIiVGhpcyBwYXJ0IGRvZXNuJ3QgaGF2ZSBhIGNvbnRhaW5pbmcgbGlicmFyeS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlICdwYXJ0IG9mJyBkZWNsYXJhdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IHRlbXBsYXRlUGFydFR3aWNlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCB1c2UgJyN1cmknIGFzIGEgcGFydCBtb3JlIHRoYW4gb25jZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNQYXJ0VHdpY2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gY29kZVBhcnRUd2ljZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigiUGFydFR3aWNlIiwgdGVtcGxhdGVQYXJ0VHdpY2UsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkRVUExJQ0FURV9QQVJUIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1BhcnRUd2ljZShVcmkgdXJpXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlUGFydFR3aWNlLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCB1c2UgJyR7dXJpfScgYXMgYSBwYXJ0IG1vcmUgdGhhbiBvbmNlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGF0Y2hDbGFzc09yaWdpbiA9IG1lc3NhZ2VQYXRjaENsYXNzT3JpZ2luOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhdGNoQ2xhc3NPcmlnaW4gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQYXRjaENsYXNzT3JpZ2luIiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoaXMgaXMgdGhlIG9yaWdpbiBjbGFzcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGF0Y2hDbGFzc1R5cGVWYXJpYWJsZXNNaXNtYXRjaCA9CiAgICBtZXNzYWdlUGF0Y2hDbGFzc1R5cGVWYXJpYWJsZXNNaXNtYXRjaDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXRjaENsYXNzVHlwZVZhcmlhYmxlc01pc21hdGNoID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUGF0Y2hDbGFzc1R5cGVWYXJpYWJsZXNNaXNtYXRjaCIsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJBIHBhdGNoIGNsYXNzIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgdHlwZSB2YXJpYWJsZXMgYXMgaXRzIG9yaWdpbiBjbGFzcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGF0Y2hEZWNsYXJhdGlvbk1pc21hdGNoID0gbWVzc2FnZVBhdGNoRGVjbGFyYXRpb25NaXNtYXRjaDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2ggPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2giLAogICAgbWVzc2FnZTogciIiIlRoaXMgcGF0Y2ggZG9lc24ndCBtYXRjaCBvcmlnaW4gZGVjbGFyYXRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVBhdGNoRGVjbGFyYXRpb25PcmlnaW4gPSBtZXNzYWdlUGF0Y2hEZWNsYXJhdGlvbk9yaWdpbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uT3JpZ2luID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUGF0Y2hEZWNsYXJhdGlvbk9yaWdpbiIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwKICAgIG1lc3NhZ2U6IHIiIiJUaGlzIGlzIHRoZSBvcmlnaW4gZGVjbGFyYXRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4KICAgIHRlbXBsYXRlUGF0Y2hJbmplY3Rpb25GYWlsZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBpbmplY3QgJyNuYW1lJyBpbnRvICcjdXJpJy4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgYWRkaW5nICdAcGF0Y2gnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1BhdGNoSW5qZWN0aW9uRmFpbGVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPiBjb2RlUGF0Y2hJbmplY3Rpb25GYWlsZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICJQYXRjaEluamVjdGlvbkZhaWxlZCIsCiAgdGVtcGxhdGVQYXRjaEluamVjdGlvbkZhaWxlZCwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNQYXRjaEluamVjdGlvbkZhaWxlZChTdHJpbmcgbmFtZSwgVXJpIHVyaV8pIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVQYXRjaEluamVjdGlvbkZhaWxlZCwKICAgICAgbWVzc2FnZTogIiIiQ2FuJ3QgaW5qZWN0ICcke25hbWV9JyBpbnRvICcke3VyaX0nLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgYWRkaW5nICdAcGF0Y2gnLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXRjaE5vbkV4dGVybmFsID0gbWVzc2FnZVBhdGNoTm9uRXh0ZXJuYWw7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUGF0Y2hOb25FeHRlcm5hbCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlBhdGNoTm9uRXh0ZXJuYWwiLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQ2FuJ3QgYXBwbHkgdGhpcyBwYXRjaCBhcyBpdHMgb3JpZ2luIGRlY2xhcmF0aW9uIGlzbid0IGV4dGVybmFsLiIiIiwKICAgIHRpcDogciIiIlRyeSBhZGRpbmcgJ2V4dGVybmFsJyB0byB0aGUgb3JpZ2luIGRlY2xhcmF0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzID0KICAgIG1lc3NhZ2VQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBsYXRmb3JtUHJpdmF0ZUxpYnJhcnlBY2Nlc3MgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTVBPUlRfSU5URVJOQUxfTElCUkFSWSJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IGFjY2VzcyBwbGF0Zm9ybSBwcml2YXRlIGxpYnJhcnkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVBvc2l0aW9uYWxBZnRlck5hbWVkQXJndW1lbnQgPQogICAgbWVzc2FnZVBvc2l0aW9uYWxBZnRlck5hbWVkQXJndW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUG9zaXRpb25hbEFmdGVyTmFtZWRBcmd1bWVudCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlBvc2l0aW9uYWxBZnRlck5hbWVkQXJndW1lbnQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlBPU0lUSU9OQUxfQUZURVJfTkFNRURfQVJHVU1FTlQiXSwKICAgIG1lc3NhZ2U6IHIiIiJQbGFjZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBiZWZvcmUgbmFtZWQgYXJndW1lbnRzLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IG1vdmluZyB0aGUgcG9zaXRpb25hbCBhcmd1bWVudCBiZWZvcmUgdGhlIG5hbWVkIGFyZ3VtZW50cywgb3IgYWRkIGEgbmFtZSB0byB0aGUgYXJndW1lbnQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzID0KICAgIG1lc3NhZ2VQb3NpdGlvbmFsUGFyYW1ldGVyV2l0aEVxdWFsczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQb3NpdGlvbmFsUGFyYW1ldGVyV2l0aEVxdWFscyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJXUk9OR19TRVBBUkFUT1JfRk9SX1BPU0lUSU9OQUxfUEFSQU1FVEVSIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJQb3NpdGlvbmFsIG9wdGlvbmFsIHBhcmFtZXRlcnMgY2FuJ3QgdXNlICc6JyB0byBzcGVjaWZ5IGEgZGVmYXVsdCB2YWx1ZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVwbGFjaW5nICc6JyB3aXRoICc9Jy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUHJlZml4QWZ0ZXJDb21iaW5hdG9yID0gbWVzc2FnZVByZWZpeEFmdGVyQ29tYmluYXRvcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQcmVmaXhBZnRlckNvbWJpbmF0b3IgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQcmVmaXhBZnRlckNvbWJpbmF0b3IiLAogICAgaW5kZXg6IDYsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUaGUgcHJlZml4ICgnYXMnIGNsYXVzZSkgc2hvdWxkIGNvbWUgYmVmb3JlIGFueSBzaG93L2hpZGUgY29tYmluYXRvcnMuIiIiLAogICAgdGlwOiByIiIiVHJ5IG1vdmluZyB0aGUgcHJlZml4IGJlZm9yZSB0aGUgY29tYmluYXRvcnMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVByaXZhdGVOYW1lZFBhcmFtZXRlciA9IG1lc3NhZ2VQcml2YXRlTmFtZWRQYXJhbWV0ZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUHJpdmF0ZU5hbWVkUGFyYW1ldGVyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUHJpdmF0ZU5hbWVkUGFyYW1ldGVyIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJQUklWQVRFX09QVElPTkFMX1BBUkFNRVRFUiJdLAogICAgbWVzc2FnZTogciIiIkFuIG9wdGlvbmFsIG5hbWVkIHBhcmFtZXRlciBjYW4ndCBzdGFydCB3aXRoICdfJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcldpdGhCb2R5ID0KICAgIG1lc3NhZ2VSZWRpcmVjdGluZ0NvbnN0cnVjdG9yV2l0aEJvZHk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcldpdGhCb2R5ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcldpdGhCb2R5IiwKICAgIGluZGV4OiAyMiwKICAgIG1lc3NhZ2U6IHIiIiJSZWRpcmVjdGluZyBjb25zdHJ1Y3RvcnMgY2FuJ3QgaGF2ZSBhIGJvZHkuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGJvZHksIG9yIG5vdCBtYWtpbmcgdGhpcyBhIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgdGVtcGxhdGVSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVGhlIHR5cGUgJyN0eXBlJyBkb2Vzbid0IGV4dGVuZCAnI3R5cGUyJy4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgdXNpbmcgYSBkaWZmZXJlbnQgdHlwZSBhcyBhcmd1bWVudC4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czoKICAgICAgICAgICAgX3dpdGhBcmd1bWVudHNSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZVJlZGlyZWN0aW5nRmFjdG9yeUluY29tcGF0aWJsZVR5cGVBcmd1bWVudCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnQiLAogICAgICAgIHRlbXBsYXRlUmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzUmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50KAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnQsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSB0eXBlICcke3R5cGV9JyBkb2Vzbid0IGV4dGVuZCAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIlRyeSB1c2luZyBhIGRpZmZlcmVudCB0eXBlIGFzIGFyZ3VtZW50LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5ID0gbWVzc2FnZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUmVkaXJlY3Rpb25Jbk5vbkZhY3RvcnkiLAogICAgaW5kZXg6IDIxLAogICAgbWVzc2FnZTogciIiIk9ubHkgZmFjdG9yeSBjb25zdHJ1Y3RvciBjYW4gc3BlY2lmeSAnPScgcmVkaXJlY3Rpb24uIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgbWFraW5nIHRoaXMgYSBmYWN0b3J5IGNvbnN0cnVjdG9yLCBvciByZW1vdmUgdGhlIHJlZGlyZWN0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlUmVkaXJlY3Rpb25UYXJnZXROb3RGb3VuZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiUmVkaXJlY3Rpb24gY29uc3RydWN0b3IgdGFyZ2V0IG5vdCBmb3VuZDogJyNuYW1lJyIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1JlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZVJlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlJlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQiLCB0ZW1wbGF0ZVJlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlJFRElSRUNUX1RPX01JU1NJTkdfQ09OU1RSVUNUT1IiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNSZWRpcmVjdGlvblRhcmdldE5vdEZvdW5kKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlUmVkaXJlY3Rpb25UYXJnZXROb3RGb3VuZCwKICAgICAgbWVzc2FnZTogIiIiUmVkaXJlY3Rpb24gY29uc3RydWN0b3IgdGFyZ2V0IG5vdCBmb3VuZDogJyR7bmFtZX0nIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUmVxdWlyZWRQYXJhbWV0ZXJXaXRoRGVmYXVsdCA9CiAgICBtZXNzYWdlUmVxdWlyZWRQYXJhbWV0ZXJXaXRoRGVmYXVsdDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VSZXF1aXJlZFBhcmFtZXRlcldpdGhEZWZhdWx0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUmVxdWlyZWRQYXJhbWV0ZXJXaXRoRGVmYXVsdCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTkFNRURfUEFSQU1FVEVSX09VVFNJREVfR1JPVVAiXSwKICAgIG1lc3NhZ2U6IHIiIiJOb24tb3B0aW9uYWwgcGFyYW1ldGVycyBjYW4ndCBoYXZlIGEgZGVmYXVsdCB2YWx1ZS4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgZGVmYXVsdCB2YWx1ZSBvciBtYWtpbmcgdGhlIHBhcmFtZXRlciBvcHRpb25hbC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUmV0aHJvd05vdENhdGNoID0gbWVzc2FnZVJldGhyb3dOb3RDYXRjaDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VSZXRocm93Tm90Q2F0Y2ggPSBjb25zdCBNZXNzYWdlQ29kZSgiUmV0aHJvd05vdENhdGNoIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJSRVRIUk9XX09VVFNJREVfQ0FUQ0giXSwKICAgIG1lc3NhZ2U6IHIiIiIncmV0aHJvdycgY2FuIG9ubHkgYmUgdXNlZCBpbiBjYXRjaCBjbGF1c2VzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVSZXR1cm5Gcm9tVm9pZEZ1bmN0aW9uID0gbWVzc2FnZVJldHVybkZyb21Wb2lkRnVuY3Rpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUmV0dXJuRnJvbVZvaWRGdW5jdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlJldHVybkZyb21Wb2lkRnVuY3Rpb24iLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlJFVFVSTl9PRl9JTlZBTElEX1RZUEUiXSwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCByZXR1cm4gYSB2YWx1ZSBmcm9tIGEgdm9pZCBmdW5jdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUmV0dXJuVHlwZUZ1bmN0aW9uRXhwcmVzc2lvbiA9CiAgICBtZXNzYWdlUmV0dXJuVHlwZUZ1bmN0aW9uRXhwcmVzc2lvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VSZXR1cm5UeXBlRnVuY3Rpb25FeHByZXNzaW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUmV0dXJuVHlwZUZ1bmN0aW9uRXhwcmVzc2lvbiIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nLAogICAgbWVzc2FnZTogciIiIkEgZnVuY3Rpb24gZXhwcmVzc2lvbiBjYW4ndCBoYXZlIGEgcmV0dXJuIHR5cGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVJldHVybldpdGhvdXRFeHByZXNzaW9uID0gbWVzc2FnZVJldHVybldpdGhvdXRFeHByZXNzaW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVJldHVybldpdGhvdXRFeHByZXNzaW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUmV0dXJuV2l0aG91dEV4cHJlc3Npb24iLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlJFVFVSTl9XSVRIT1VUX1ZBTFVFIl0sCiAgICBzZXZlcml0eTogU2V2ZXJpdHkud2FybmluZywKICAgIG1lc3NhZ2U6IHIiIiJNdXN0IGV4cGxpY2l0bHkgcmV0dXJuIGEgdmFsdWUgZnJvbSBhIG5vbi12b2lkIGZ1bmN0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gdGVtcGxhdGVTZGtSb290Tm90Rm91bmQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlNESyByb290IGRpcmVjdG9yeSBub3QgZm91bmQ6ICN1cmkuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU2RrUm9vdE5vdEZvdW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IGNvZGVTZGtSb290Tm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgIlNka1Jvb3ROb3RGb3VuZCIsCiAgdGVtcGxhdGVTZGtSb290Tm90Rm91bmQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU2RrUm9vdE5vdEZvdW5kKFVyaSB1cmlfKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTZGtSb290Tm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIlNESyByb290IGRpcmVjdG9yeSBub3QgZm91bmQ6ICR7dXJpfS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBVcmkKICAgICAgICAgICAgdXJpXyk+IHRlbXBsYXRlU2RrU3BlY2lmaWNhdGlvbk5vdEZvdW5kID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiU0RLIGxpYnJhcmllcyBzcGVjaWZpY2F0aW9uIG5vdCBmb3VuZDogI3VyaS4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiTm9ybWFsbHksIHRoZSBzcGVjaWZpY2F0aW9uIGlzIGEgZmlsZSBuYW1lZCAnbGlicmFyaWVzLmpzb24nIGluIHRoZSBEYXJ0IFNESyBpbnN0YWxsIGxvY2F0aW9uLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU2RrU3BlY2lmaWNhdGlvbk5vdEZvdW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IGNvZGVTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgIlNka1NwZWNpZmljYXRpb25Ob3RGb3VuZCIsCiAgdGVtcGxhdGVTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU2RrU3BlY2lmaWNhdGlvbk5vdEZvdW5kKFVyaSB1cmlfKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIlNESyBsaWJyYXJpZXMgc3BlY2lmaWNhdGlvbiBub3QgZm91bmQ6ICR7dXJpfS4iIiIsCiAgICAgIHRpcDoKICAgICAgICAgICIiIk5vcm1hbGx5LCB0aGUgc3BlY2lmaWNhdGlvbiBpcyBhIGZpbGUgbmFtZWQgJ2xpYnJhcmllcy5qc29uJyBpbiB0aGUgRGFydCBTREsgaW5zdGFsbCBsb2NhdGlvbi4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiB0ZW1wbGF0ZVNka1N1bW1hcnlOb3RGb3VuZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiU0RLIHN1bW1hcnkgbm90IGZvdW5kOiAjdXJpLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1Nka1N1bW1hcnlOb3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiBjb2RlU2RrU3VtbWFyeU5vdEZvdW5kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICJTZGtTdW1tYXJ5Tm90Rm91bmQiLAogIHRlbXBsYXRlU2RrU3VtbWFyeU5vdEZvdW5kLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1Nka1N1bW1hcnlOb3RGb3VuZChVcmkgdXJpXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU2RrU3VtbWFyeU5vdEZvdW5kLAogICAgICBtZXNzYWdlOiAiIiJTREsgc3VtbWFyeSBub3QgZm91bmQ6ICR7dXJpfS4iIiIsIGFyZ3VtZW50czogeyd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVNldExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50cyA9CiAgICBtZXNzYWdlU2V0TGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVNldExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50cyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlNldExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50cyIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nLAogICAgbWVzc2FnZTogciIiIkEgc2V0IGxpdGVyYWwgcmVxdWlyZXMgZXhhY3RseSBvbmUgdHlwZSBhcmd1bWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU2V0T3JNYXBMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMgPQogICAgbWVzc2FnZVNldE9yTWFwTGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVNldE9yTWFwTGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiU2V0T3JNYXBMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZywKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgc2V0IG9yIG1hcCBsaXRlcmFsIHJlcXVpcmVzIGV4YWN0bHkgb25lIG9yIHR3byB0eXBlIGFyZ3VtZW50cywgcmVzcGVjdGl2ZWx5LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVTZXR0ZXJOb3RGb3VuZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiU2V0dGVyIG5vdCBmb3VuZDogJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTZXR0ZXJOb3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlU2V0dGVyTm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlNldHRlck5vdEZvdW5kIiwgdGVtcGxhdGVTZXR0ZXJOb3RGb3VuZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX1NFVFRFUiJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1NldHRlck5vdEZvdW5kKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU2V0dGVyTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIlNldHRlciBub3QgZm91bmQ6ICcke25hbWV9Jy4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTZXR0ZXJOb3RTeW5jID0gbWVzc2FnZVNldHRlck5vdFN5bmM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU2V0dGVyTm90U3luYyA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJTZXR0ZXJOb3RTeW5jIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX01PRElGSUVSX09OX1NFVFRFUiJdLAogICAgbWVzc2FnZTogciIiIlNldHRlcnMgY2FuJ3QgdXNlICdhc3luYycsICdhc3luYyonLCBvciAnc3luYyonLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTZXR0ZXJXaXRoV3JvbmdOdW1iZXJPZkZvcm1hbHMgPQogICAgbWVzc2FnZVNldHRlcldpdGhXcm9uZ051bWJlck9mRm9ybWFsczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VTZXR0ZXJXaXRoV3JvbmdOdW1iZXJPZkZvcm1hbHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTZXR0ZXJXaXRoV3JvbmdOdW1iZXJPZkZvcm1hbHMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIldST05HX05VTUJFUl9PRl9QQVJBTUVURVJTX0ZPUl9TRVRURVIiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIHNldHRlciBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBmb3JtYWwgcGFyYW1ldGVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgaW50IGNvdW50LAogICAgICAgIGludCBjb3VudDIsCiAgICAgICAgbnVtIF9udW0xLAogICAgICAgIG51bSBfbnVtMiwKICAgICAgICBudW0KICAgICAgICAgICAgX251bTMpPiB0ZW1wbGF0ZVNvdXJjZUJvZHlTdW1tYXJ5ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgY291bnQyLCBudW0gX251bTEsIG51bSBfbnVtMiwgbnVtIF9udW0zKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkJ1aWx0IGJvZGllcyBmb3IgI2NvdW50IGNvbXBpbGF0aW9uIHVuaXRzICgjY291bnQyIGJ5dGVzKSBpbiAjbnVtMSUuM21zLCB0aGF0IGlzLAojbnVtMiUxMi4zIGJ5dGVzL21zLCBhbmQKI251bTMlMTIuMyBtcy9jb21waWxhdGlvbiB1bml0LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU291cmNlQm9keVN1bW1hcnkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50LCBpbnQgY291bnQyLCBudW0gX251bTEsIG51bSBfbnVtMiwKICAgICAgICBudW0gX251bTMpPiBjb2RlU291cmNlQm9keVN1bW1hcnkgPSBjb25zdCBDb2RlPAogICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpPigKICAiU291cmNlQm9keVN1bW1hcnkiLAogIHRlbXBsYXRlU291cmNlQm9keVN1bW1hcnksCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU291cmNlQm9keVN1bW1hcnkoCiAgICBpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpIHsKICBpZiAoY291bnQgPT0gbnVsbCkgdGhyb3cgJ05vIGNvdW50IHByb3ZpZGVkJzsKICBpZiAoY291bnQyID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgaWYgKF9udW0xID09IG51bGwpIHRocm93ICdObyBudW1iZXIgcHJvdmlkZWQnOwogIFN0cmluZyBudW0xID0gX251bTEudG9TdHJpbmdBc0ZpeGVkKDMpOwogIGlmIChfbnVtMiA9PSBudWxsKSB0aHJvdyAnTm8gbnVtYmVyIHByb3ZpZGVkJzsKICBTdHJpbmcgbnVtMiA9IF9udW0yLnRvU3RyaW5nQXNGaXhlZCgzKS5wYWRMZWZ0KDEyKTsKICBpZiAoX251bTMgPT0gbnVsbCkgdGhyb3cgJ05vIG51bWJlciBwcm92aWRlZCc7CiAgU3RyaW5nIG51bTMgPSBfbnVtMy50b1N0cmluZ0FzRml4ZWQoMykucGFkTGVmdCgxMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTb3VyY2VCb2R5U3VtbWFyeSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkJ1aWx0IGJvZGllcyBmb3IgJHtjb3VudH0gY29tcGlsYXRpb24gdW5pdHMgKCR7Y291bnQyfSBieXRlcykgaW4gJHtudW0xfW1zLCB0aGF0IGlzLAoke251bTJ9IGJ5dGVzL21zLCBhbmQKJHtudW0zfSBtcy9jb21waWxhdGlvbiB1bml0LiIiIiwKICAgICAgYXJndW1lbnRzOiB7CiAgICAgICAgJ2NvdW50JzogY291bnQsCiAgICAgICAgJ2NvdW50Mic6IGNvdW50MiwKICAgICAgICAnbnVtMSc6IF9udW0xLAogICAgICAgICdudW0yJzogX251bTIsCiAgICAgICAgJ251bTMnOiBfbnVtMwogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIGludCBjb3VudCwKICAgICAgICBpbnQgY291bnQyLAogICAgICAgIG51bSBfbnVtMSwKICAgICAgICBudW0gX251bTIsCiAgICAgICAgbnVtCiAgICAgICAgICAgIF9udW0zKT4gdGVtcGxhdGVTb3VyY2VPdXRsaW5lU3VtbWFyeSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIGludCBjb3VudCwgaW50IGNvdW50MiwgbnVtIF9udW0xLCBudW0gX251bTIsIG51bSBfbnVtMyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJCdWlsdCBvdXRsaW5lcyBmb3IgI2NvdW50IGNvbXBpbGF0aW9uIHVuaXRzICgjY291bnQyIGJ5dGVzKSBpbiAjbnVtMSUuM21zLCB0aGF0IGlzLAojbnVtMiUxMi4zIGJ5dGVzL21zLCBhbmQKI251bTMlMTIuMyBtcy9jb21waWxhdGlvbiB1bml0LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU291cmNlT3V0bGluZVN1bW1hcnkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50LCBpbnQgY291bnQyLCBudW0gX251bTEsIG51bSBfbnVtMiwKICAgICAgICBudW0gX251bTMpPiBjb2RlU291cmNlT3V0bGluZVN1bW1hcnkgPSBjb25zdCBDb2RlPAogICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpPigKICAiU291cmNlT3V0bGluZVN1bW1hcnkiLAogIHRlbXBsYXRlU291cmNlT3V0bGluZVN1bW1hcnksCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU291cmNlT3V0bGluZVN1bW1hcnkoCiAgICBpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpIHsKICBpZiAoY291bnQgPT0gbnVsbCkgdGhyb3cgJ05vIGNvdW50IHByb3ZpZGVkJzsKICBpZiAoY291bnQyID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgaWYgKF9udW0xID09IG51bGwpIHRocm93ICdObyBudW1iZXIgcHJvdmlkZWQnOwogIFN0cmluZyBudW0xID0gX251bTEudG9TdHJpbmdBc0ZpeGVkKDMpOwogIGlmIChfbnVtMiA9PSBudWxsKSB0aHJvdyAnTm8gbnVtYmVyIHByb3ZpZGVkJzsKICBTdHJpbmcgbnVtMiA9IF9udW0yLnRvU3RyaW5nQXNGaXhlZCgzKS5wYWRMZWZ0KDEyKTsKICBpZiAoX251bTMgPT0gbnVsbCkgdGhyb3cgJ05vIG51bWJlciBwcm92aWRlZCc7CiAgU3RyaW5nIG51bTMgPSBfbnVtMy50b1N0cmluZ0FzRml4ZWQoMykucGFkTGVmdCgxMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTb3VyY2VPdXRsaW5lU3VtbWFyeSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkJ1aWx0IG91dGxpbmVzIGZvciAke2NvdW50fSBjb21waWxhdGlvbiB1bml0cyAoJHtjb3VudDJ9IGJ5dGVzKSBpbiAke251bTF9bXMsIHRoYXQgaXMsCiR7bnVtMn0gYnl0ZXMvbXMsIGFuZAoke251bTN9IG1zL2NvbXBpbGF0aW9uIHVuaXQuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAnY291bnQnOiBjb3VudCwKICAgICAgICAnY291bnQyJzogY291bnQyLAogICAgICAgICdudW0xJzogX251bTEsCiAgICAgICAgJ251bTInOiBfbnVtMiwKICAgICAgICAnbnVtMyc6IF9udW0zCiAgICAgIH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTcHJlYWRFbGVtZW50ID0gbWVzc2FnZVNwcmVhZEVsZW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3ByZWFkRWxlbWVudCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJTcHJlYWRFbGVtZW50IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LCBtZXNzYWdlOiByIiIiSXRlcmFibGUgc3ByZWFkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkNhbid0IGFzc2lnbiBzcHJlYWQgZWxlbWVudHMgb2YgdHlwZSAnI3R5cGUnIHRvIGNvbGxlY3Rpb24gZWxlbWVudHMgb2YgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1NwcmVhZEVsZW1lbnRUeXBlTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZVNwcmVhZEVsZW1lbnRUeXBlTWlzbWF0Y2ggPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgICAgICAiU3ByZWFkRWxlbWVudFR5cGVNaXNtYXRjaCIsIHRlbXBsYXRlU3ByZWFkRWxlbWVudFR5cGVNaXNtYXRjaCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTElTVF9FTEVNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3ByZWFkRWxlbWVudFR5cGVNaXNtYXRjaCgKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3ByZWFkRWxlbWVudFR5cGVNaXNtYXRjaCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkNhbid0IGFzc2lnbiBzcHJlYWQgZWxlbWVudHMgb2YgdHlwZSAnJHt0eXBlfScgdG8gY29sbGVjdGlvbiBlbGVtZW50cyBvZiB0eXBlICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlLCAndHlwZTInOiBfdHlwZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3ByZWFkTWFwRWxlbWVudCA9IG1lc3NhZ2VTcHJlYWRNYXBFbGVtZW50OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVNwcmVhZE1hcEVsZW1lbnQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTcHJlYWRNYXBFbGVtZW50IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIk1hcCBzcHJlYWQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZTIpPiB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5RWxlbWVudEtleVR5cGVNaXNtYXRjaCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDYW4ndCBhc3NpZ24gc3ByZWFkIGVudHJ5IGtleXMgb2YgdHlwZSAnI3R5cGUnIHRvIG1hcCBlbnRyeSBrZXlzIG9mIHR5cGUgJyN0eXBlMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTcHJlYWRNYXBFbnRyeUVsZW1lbnRLZXlUeXBlTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZVNwcmVhZE1hcEVudHJ5RWxlbWVudEtleVR5cGVNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgICJTcHJlYWRNYXBFbnRyeUVsZW1lbnRLZXlUeXBlTWlzbWF0Y2giLAogICAgICAgIHRlbXBsYXRlU3ByZWFkTWFwRW50cnlFbGVtZW50S2V5VHlwZU1pc21hdGNoLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNQVBfS0VZX1RZUEVfTk9UX0FTU0lHTkFCTEUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3ByZWFkTWFwRW50cnlFbGVtZW50S2V5VHlwZU1pc21hdGNoKAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMikgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTcHJlYWRNYXBFbnRyeUVsZW1lbnRLZXlUeXBlTWlzbWF0Y2gsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCBhc3NpZ24gc3ByZWFkIGVudHJ5IGtleXMgb2YgdHlwZSAnJHt0eXBlfScgdG8gbWFwIGVudHJ5IGtleXMgb2YgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+CiAgICB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNhbid0IGFzc2lnbiBzcHJlYWQgZW50cnkgdmFsdWVzIG9mIHR5cGUgJyN0eXBlJyB0byBtYXAgZW50cnkgdmFsdWVzIG9mIHR5cGUgJyN0eXBlMicuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPgogICAgY29kZVNwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyKT4oCiAgICAgICAgIlNwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoIiwKICAgICAgICB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNQVBfVkFMVUVfVFlQRV9OT1RfQVNTSUdOQUJMRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTcHJlYWRNYXBFbnRyeUVsZW1lbnRWYWx1ZVR5cGVNaXNtYXRjaCgKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2gsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCBhc3NpZ24gc3ByZWFkIGVudHJ5IHZhbHVlcyBvZiB0eXBlICcke3R5cGV9JyB0byBtYXAgZW50cnkgdmFsdWVzIG9mIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUpPiB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJVbmV4cGVjdGVkIHR5cGUgJyN0eXBlJyBvZiBhIG1hcCBzcHJlYWQgZW50cnkuICBFeHBlY3RlZCAnZHluYW1pYycgb3IgYSBNYXAuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTcHJlYWRNYXBFbnRyeVR5cGVNaXNtYXRjaCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUpPiBjb2RlU3ByZWFkTWFwRW50cnlUeXBlTWlzbWF0Y2ggPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4oCiAgIlNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoIiwKICB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1NwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoKERhcnRUeXBlIF90eXBlKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3ByZWFkTWFwRW50cnlUeXBlTWlzbWF0Y2gsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJVbmV4cGVjdGVkIHR5cGUgJyR7dHlwZX0nIG9mIGEgbWFwIHNwcmVhZCBlbnRyeS4gIEV4cGVjdGVkICdkeW5hbWljJyBvciBhIE1hcC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlCiAgICAgICAgICAgIF90eXBlKT4gdGVtcGxhdGVTcHJlYWRUeXBlTWlzbWF0Y2ggPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlVuZXhwZWN0ZWQgdHlwZSAnI3R5cGUnIG9mIGEgc3ByZWFkLiAgRXhwZWN0ZWQgJ2R5bmFtaWMnIG9yIGFuIEl0ZXJhYmxlLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU3ByZWFkVHlwZU1pc21hdGNoKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSk+IGNvZGVTcHJlYWRUeXBlTWlzbWF0Y2ggPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlKT4oCiAgIlNwcmVhZFR5cGVNaXNtYXRjaCIsCiAgdGVtcGxhdGVTcHJlYWRUeXBlTWlzbWF0Y2gsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3ByZWFkVHlwZU1pc21hdGNoKERhcnRUeXBlIF90eXBlKSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3ByZWFkVHlwZU1pc21hdGNoLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVW5leHBlY3RlZCB0eXBlICcke3R5cGV9JyBvZiBhIHNwcmVhZC4gIEV4cGVjdGVkICdkeW5hbWljJyBvciBhbiBJdGVyYWJsZS4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3RhY2tPdmVyZmxvdyA9IG1lc3NhZ2VTdGFja092ZXJmbG93OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN0YWNrT3ZlcmZsb3cgPSBjb25zdCBNZXNzYWdlQ29kZSgiU3RhY2tPdmVyZmxvdyIsCiAgICBpbmRleDogMTksCiAgICBtZXNzYWdlOiByIiIiVGhlIGZpbGUgaGFzIHRvbyBtYW55IG5lc3RlZCBleHByZXNzaW9ucyBvciBzdGF0ZW1lbnRzLiIiIiwKICAgIHRpcDogciIiIlRyeSBzaW1wbGlmeWluZyB0aGUgY29kZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdCA9CiAgICBtZXNzYWdlU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VTdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09ORkxJQ1RJTkdfU1RBVElDX0FORF9JTlNUQU5DRSJdLAogICAgbWVzc2FnZTogciIiIlRoaXMgc3RhdGljIG1lbWJlciBjb25mbGljdHMgd2l0aCBhbiBpbnN0YW5jZSBtZW1iZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RDYXVzZSA9CiAgICBtZXNzYWdlU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdENhdXNlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RDYXVzZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RDYXVzZSIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwKICAgIG1lc3NhZ2U6IHIiIiJUaGlzIGlzIHRoZSBpbnN0YW5jZSBtZW1iZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN0YXRpY0NvbnN0cnVjdG9yID0gbWVzc2FnZVN0YXRpY0NvbnN0cnVjdG9yOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN0YXRpY0NvbnN0cnVjdG9yID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiU3RhdGljQ29uc3RydWN0b3IiLAogICAgaW5kZXg6IDQsCiAgICBtZXNzYWdlOiByIiIiQ29uc3RydWN0b3JzIGNhbid0IGJlIHN0YXRpYy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ3N0YXRpYycuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN0YXRpY09wZXJhdG9yID0gbWVzc2FnZVN0YXRpY09wZXJhdG9yOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN0YXRpY09wZXJhdG9yID0gY29uc3QgTWVzc2FnZUNvZGUoIlN0YXRpY09wZXJhdG9yIiwKICAgIGluZGV4OiAxNywKICAgIG1lc3NhZ2U6IHIiIiJPcGVyYXRvcnMgY2FuJ3QgYmUgc3RhdGljLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAnc3RhdGljJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3VwZXJBc0V4cHJlc3Npb24gPSBtZXNzYWdlU3VwZXJBc0V4cHJlc3Npb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3VwZXJBc0V4cHJlc3Npb24gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTdXBlckFzRXhwcmVzc2lvbiIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiU1VQRVJfQVNfRVhQUkVTU0lPTiJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IHVzZSAnc3VwZXInIGFzIGFuIGV4cHJlc3Npb24uIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUbyBkZWxlZ2F0ZSBhIGNvbnN0cnVjdG9yIHRvIGEgc3VwZXIgY29uc3RydWN0b3IsIHB1dCB0aGUgc3VwZXIgY2FsbCBhcyBhbiBpbml0aWFsaXplci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3VwZXJBc0lkZW50aWZpZXIgPSBtZXNzYWdlU3VwZXJBc0lkZW50aWZpZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3VwZXJBc0lkZW50aWZpZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTdXBlckFzSWRlbnRpZmllciIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiU1VQRVJfQVNfRVhQUkVTU0lPTiJdLAogICAgbWVzc2FnZTogciIiIkV4cGVjdGVkIGlkZW50aWZpZXIsIGJ1dCBnb3QgJ3N1cGVyJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3VwZXJJbml0aWFsaXplck5vdExhc3QgPSBtZXNzYWdlU3VwZXJJbml0aWFsaXplck5vdExhc3Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3VwZXJJbml0aWFsaXplck5vdExhc3QgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTdXBlckluaXRpYWxpemVyTm90TGFzdCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9TVVBFUl9JTlZPQ0FUSU9OIl0sCiAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgaGF2ZSBpbml0aWFsaXplcnMgYWZ0ZXIgJ3N1cGVyJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3VwZXJOdWxsQXdhcmUgPSBtZXNzYWdlU3VwZXJOdWxsQXdhcmU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3VwZXJOdWxsQXdhcmUgPSBjb25zdCBNZXNzYWdlQ29kZSgiU3VwZXJOdWxsQXdhcmUiLAogICAgaW5kZXg6IDE4LAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhlIG9wZXJhdG9yICc/LicgY2Fubm90IGJlIHVzZWQgd2l0aCAnc3VwZXInIGJlY2F1c2UgJ3N1cGVyJyBjYW5ub3QgYmUgbnVsbC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVwbGFjaW5nICc/Licgd2l0aCAnLiciIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb0NvbnN0cnVjdG9yID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJTdXBlcmNsYXNzIGhhcyBubyBjb25zdHJ1Y3RvciBuYW1lZCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb0NvbnN0cnVjdG9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVTdXBlcmNsYXNzSGFzTm9Db25zdHJ1Y3RvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiU3VwZXJjbGFzc0hhc05vQ29uc3RydWN0b3IiLCB0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb0NvbnN0cnVjdG9yLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WwogICAgICAgICAgIlVOREVGSU5FRF9DT05TVFJVQ1RPUl9JTl9JTklUSUFMSVpFUiIsCiAgICAgICAgICAiVU5ERUZJTkVEX0NPTlNUUlVDVE9SX0lOX0lOSVRJQUxJWkVSX0RFRkFVTFQiCiAgICAgICAgXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9Db25zdHJ1Y3RvcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVN1cGVyY2xhc3NIYXNOb0NvbnN0cnVjdG9yLAogICAgICBtZXNzYWdlOiAiIiJTdXBlcmNsYXNzIGhhcyBubyBjb25zdHJ1Y3RvciBuYW1lZCAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3IgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBzdXBlcmNsYXNzLCAnI25hbWUnLCBoYXMgbm8gdW5uYW1lZCBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb0RlZmF1bHRDb25zdHJ1Y3Rvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZVN1cGVyY2xhc3NIYXNOb0RlZmF1bHRDb25zdHJ1Y3RvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiU3VwZXJjbGFzc0hhc05vRGVmYXVsdENvbnN0cnVjdG9yIiwKICAgICAgICB0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb0RlZmF1bHRDb25zdHJ1Y3RvciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9fREVGQVVMVF9TVVBFUl9DT05TVFJVQ1RPUl9JTVBMSUNJVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3IoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3IsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgc3VwZXJjbGFzcywgJyR7bmFtZX0nLCBoYXMgbm8gdW5uYW1lZCBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9HZXR0ZXIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlN1cGVyY2xhc3MgaGFzIG5vIGdldHRlciBuYW1lZCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb0dldHRlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlU3VwZXJjbGFzc0hhc05vR2V0dGVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJTdXBlcmNsYXNzSGFzTm9HZXR0ZXIiLCB0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb0dldHRlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX1NVUEVSX0dFVFRFUiJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb0dldHRlcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVN1cGVyY2xhc3NIYXNOb0dldHRlciwKICAgICAgbWVzc2FnZTogIiIiU3VwZXJjbGFzcyBoYXMgbm8gZ2V0dGVyIG5hbWVkICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9NZXRob2QgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlN1cGVyY2xhc3MgaGFzIG5vIG1ldGhvZCBuYW1lZCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb01ldGhvZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlU3VwZXJjbGFzc0hhc05vTWV0aG9kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJTdXBlcmNsYXNzSGFzTm9NZXRob2QiLCB0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb01ldGhvZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX1NVUEVSX01FVEhPRCJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb01ldGhvZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVN1cGVyY2xhc3NIYXNOb01ldGhvZCwKICAgICAgbWVzc2FnZTogIiIiU3VwZXJjbGFzcyBoYXMgbm8gbWV0aG9kIG5hbWVkICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9TZXR0ZXIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlN1cGVyY2xhc3MgaGFzIG5vIHNldHRlciBuYW1lZCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb1NldHRlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlU3VwZXJjbGFzc0hhc05vU2V0dGVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJTdXBlcmNsYXNzSGFzTm9TZXR0ZXIiLCB0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb1NldHRlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX1NVUEVSX1NFVFRFUiJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb1NldHRlcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVN1cGVyY2xhc3NIYXNOb1NldHRlciwKICAgICAgbWVzc2FnZTogIiIiU3VwZXJjbGFzcyBoYXMgbm8gc2V0dGVyIG5hbWVkICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZVN1cGVyY2xhc3NNZXRob2RBcmd1bWVudE1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJTdXBlcmNsYXNzIGRvZXNuJ3QgaGF2ZSBhIG1ldGhvZCBuYW1lZCAnI25hbWUnIHdpdGggbWF0Y2hpbmcgYXJndW1lbnRzLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU3VwZXJjbGFzc01ldGhvZEFyZ3VtZW50TWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZVN1cGVyY2xhc3NNZXRob2RBcmd1bWVudE1pc21hdGNoID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJTdXBlcmNsYXNzTWV0aG9kQXJndW1lbnRNaXNtYXRjaCIsCiAgICAgICAgdGVtcGxhdGVTdXBlcmNsYXNzTWV0aG9kQXJndW1lbnRNaXNtYXRjaCwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzTWV0aG9kQXJndW1lbnRNaXNtYXRjaChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVN1cGVyY2xhc3NNZXRob2RBcmd1bWVudE1pc21hdGNoLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiU3VwZXJjbGFzcyBkb2Vzbid0IGhhdmUgYSBtZXRob2QgbmFtZWQgJyR7bmFtZX0nIHdpdGggbWF0Y2hpbmcgYXJndW1lbnRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN1cGVydHlwZUlzRnVuY3Rpb24gPSBtZXNzYWdlU3VwZXJ0eXBlSXNGdW5jdGlvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VTdXBlcnR5cGVJc0Z1bmN0aW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiU3VwZXJ0eXBlSXNGdW5jdGlvbiIsCiAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgdXNlIGEgZnVuY3Rpb24gdHlwZSBhcyBzdXBlcnR5cGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZVN1cGVydHlwZUlzSWxsZWdhbCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVGhlIHR5cGUgJyNuYW1lJyBjYW4ndCBiZSB1c2VkIGFzIHN1cGVydHlwZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTdXBlcnR5cGVJc0lsbGVnYWwpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZVN1cGVydHlwZUlzSWxsZWdhbCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiU3VwZXJ0eXBlSXNJbGxlZ2FsIiwgdGVtcGxhdGVTdXBlcnR5cGVJc0lsbGVnYWwsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYVEVORFNfTk9OX0NMQVNTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1N1cGVydHlwZUlzSWxsZWdhbChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVN1cGVydHlwZUlzSWxsZWdhbCwKICAgICAgbWVzc2FnZTogIiIiVGhlIHR5cGUgJyR7bmFtZX0nIGNhbid0IGJlIHVzZWQgYXMgc3VwZXJ0eXBlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZVN1cGVydHlwZUlzVHlwZVZhcmlhYmxlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIGNhbid0IGJlIHVzZWQgYXMgc3VwZXJ0eXBlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1N1cGVydHlwZUlzVHlwZVZhcmlhYmxlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiU3VwZXJ0eXBlSXNUeXBlVmFyaWFibGUiLCB0ZW1wbGF0ZVN1cGVydHlwZUlzVHlwZVZhcmlhYmxlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFRFTkRTX05PTl9DTEFTUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVN1cGVydHlwZUlzVHlwZVZhcmlhYmxlLAogICAgICBtZXNzYWdlOiAiIiJUaGUgdHlwZSB2YXJpYWJsZSAnJHtuYW1lfScgY2FuJ3QgYmUgdXNlZCBhcyBzdXBlcnR5cGUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3dpdGNoQ2FzZUZhbGxUaHJvdWdoID0gbWVzc2FnZVN3aXRjaENhc2VGYWxsVGhyb3VnaDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VTd2l0Y2hDYXNlRmFsbFRocm91Z2ggPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTd2l0Y2hDYXNlRmFsbFRocm91Z2giLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNBU0VfQkxPQ0tfTk9UX1RFUk1JTkFURUQiXSwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcsCiAgICBtZXNzYWdlOiByIiIiU3dpdGNoIGNhc2UgbWF5IGZhbGwgdGhyb3VnaCB0byB0aGUgbmV4dCBjYXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUyKT4gdGVtcGxhdGVTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUeXBlICcjdHlwZScgb2YgdGhlIHN3aXRjaCBleHByZXNzaW9uIGlzbid0IGFzc2lnbmFibGUgdG8gdGhlIHR5cGUgJyN0eXBlMicgb2YgdGhpcyBjYXNlIGV4cHJlc3Npb24uIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMik+CiAgICBjb2RlU3dpdGNoRXhwcmVzc2lvbk5vdEFzc2lnbmFibGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpPigKICAgICAgICAiU3dpdGNoRXhwcmVzc2lvbk5vdEFzc2lnbmFibGUiLCB0ZW1wbGF0ZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJTV0lUQ0hfRVhQUkVTU0lPTl9OT1RfQVNTSUdOQUJMRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZSgKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3dpdGNoRXhwcmVzc2lvbk5vdEFzc2lnbmFibGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUeXBlICcke3R5cGV9JyBvZiB0aGUgc3dpdGNoIGV4cHJlc3Npb24gaXNuJ3QgYXNzaWduYWJsZSB0byB0aGUgdHlwZSAnJHt0eXBlMn0nIG9mIHRoaXMgY2FzZSBleHByZXNzaW9uLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlQ2F1c2UgPQogICAgbWVzc2FnZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlQ2F1c2U7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3dpdGNoRXhwcmVzc2lvbk5vdEFzc2lnbmFibGVDYXVzZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlQ2F1c2UiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOiByIiIiVGhlIHN3aXRjaCBleHByZXNzaW9uIGlzIGhlcmUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN3aXRjaEhhc0Nhc2VBZnRlckRlZmF1bHQgPQogICAgbWVzc2FnZVN3aXRjaEhhc0Nhc2VBZnRlckRlZmF1bHQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3dpdGNoSGFzQ2FzZUFmdGVyRGVmYXVsdCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlN3aXRjaEhhc0Nhc2VBZnRlckRlZmF1bHQiLAogICAgaW5kZXg6IDE2LAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhlIGRlZmF1bHQgY2FzZSBzaG91bGQgYmUgdGhlIGxhc3QgY2FzZSBpbiBhIHN3aXRjaCBzdGF0ZW1lbnQuIiIiLAogICAgdGlwOiByIiIiVHJ5IG1vdmluZyB0aGUgZGVmYXVsdCBjYXNlIGFmdGVyIHRoZSBvdGhlciBjYXNlIGNsYXVzZXMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN3aXRjaEhhc011bHRpcGxlRGVmYXVsdHMgPQogICAgbWVzc2FnZVN3aXRjaEhhc011bHRpcGxlRGVmYXVsdHM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3dpdGNoSGFzTXVsdGlwbGVEZWZhdWx0cyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlN3aXRjaEhhc011bHRpcGxlRGVmYXVsdHMiLAogICAgaW5kZXg6IDE1LAogICAgbWVzc2FnZTogciIiIlRoZSAnZGVmYXVsdCcgY2FzZSBjYW4gb25seSBiZSBkZWNsYXJlZCBvbmNlLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSBkZWZhdWx0IGNhc2UuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN5bnRoZXRpY1Rva2VuID0gbWVzc2FnZVN5bnRoZXRpY1Rva2VuOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN5bnRoZXRpY1Rva2VuID0gY29uc3QgTWVzc2FnZUNvZGUoIlN5bnRoZXRpY1Rva2VuIiwKICAgIG1lc3NhZ2U6IHIiIiJUaGlzIGNvdWxkbid0IGJlIHBhcnNlZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZVRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNhbid0IGFjY2VzcyAndGhpcycgaW4gYSBmaWVsZCBpbml0aWFsaXplciB0byByZWFkICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVGhpc0FjY2Vzc0luRmllbGRJbml0aWFsaXplcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlVGhpc0FjY2Vzc0luRmllbGRJbml0aWFsaXplciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiVGhpc0FjY2Vzc0luRmllbGRJbml0aWFsaXplciIsIHRlbXBsYXRlVGhpc0FjY2Vzc0luRmllbGRJbml0aWFsaXplciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVEhJU19BQ0NFU1NfRlJPTV9GSUVMRF9JTklUSUFMSVpFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNUaGlzQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVGhpc0FjY2Vzc0luRmllbGRJbml0aWFsaXplciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkNhbid0IGFjY2VzcyAndGhpcycgaW4gYSBmaWVsZCBpbml0aWFsaXplciB0byByZWFkICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVUaGlzQXNJZGVudGlmaWVyID0gbWVzc2FnZVRoaXNBc0lkZW50aWZpZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVGhpc0FzSWRlbnRpZmllciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlRoaXNBc0lkZW50aWZpZXIiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfUkVGRVJFTkNFX1RPX1RISVMiXSwKICAgIG1lc3NhZ2U6IHIiIiJFeHBlY3RlZCBpZGVudGlmaWVyLCBidXQgZ290ICd0aGlzJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVGhpc0luaXRpYWxpemVyTm90QWxvbmUgPSBtZXNzYWdlVGhpc0luaXRpYWxpemVyTm90QWxvbmU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVGhpc0luaXRpYWxpemVyTm90QWxvbmUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJUaGlzSW5pdGlhbGl6ZXJOb3RBbG9uZSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRklFTERfSU5JVElBTElaRVJfUkVESVJFQ1RJTkdfQ09OU1RSVUNUT1IiXSwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCBoYXZlIG90aGVyIGluaXRpYWxpemVycyB0b2dldGhlciB3aXRoICd0aGlzJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4KICAgIHRlbXBsYXRlVGhpc09yU3VwZXJBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ2FuJ3QgYWNjZXNzICcjc3RyaW5nJyBpbiBhIGZpZWxkIGluaXRpYWxpemVyLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1RoaXNPclN1cGVyQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4KICAgIGNvZGVUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplciIsCiAgICAgICAgdGVtcGxhdGVUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVEhJU19BQ0NFU1NfRlJPTV9JTklUSUFMSVpFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplcihTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVRoaXNPclN1cGVyQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCBhY2Nlc3MgJyR7c3RyaW5nfScgaW4gYSBmaWVsZCBpbml0aWFsaXplci4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIGludCBjb3VudCwKICAgICAgICBpbnQKICAgICAgICAgICAgY291bnQyKT4gdGVtcGxhdGVUb29GZXdBcmd1bWVudHMgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCwgaW50IGNvdW50Mik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUb28gZmV3IHBvc2l0aW9uYWwgYXJndW1lbnRzOiAjY291bnQgcmVxdWlyZWQsICNjb3VudDIgZ2l2ZW4uIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNUb29GZXdBcmd1bWVudHMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCwgaW50IGNvdW50Mik+IGNvZGVUb29GZXdBcmd1bWVudHMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCwgaW50IGNvdW50Mik+KAogICAgICAgICJUb29GZXdBcmd1bWVudHMiLCB0ZW1wbGF0ZVRvb0Zld0FyZ3VtZW50cywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0VOT1VHSF9SRVFVSVJFRF9BUkdVTUVOVFMiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNUb29GZXdBcmd1bWVudHMoaW50IGNvdW50LCBpbnQgY291bnQyKSB7CiAgaWYgKGNvdW50ID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgaWYgKGNvdW50MiA9PSBudWxsKSB0aHJvdyAnTm8gY291bnQgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVG9vRmV3QXJndW1lbnRzLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVG9vIGZldyBwb3NpdGlvbmFsIGFyZ3VtZW50czogJHtjb3VudH0gcmVxdWlyZWQsICR7Y291bnQyfSBnaXZlbi4iIiIsCiAgICAgIGFyZ3VtZW50czogeydjb3VudCc6IGNvdW50LCAnY291bnQyJzogY291bnQyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBpbnQgY291bnQsCiAgICAgICAgaW50CiAgICAgICAgICAgIGNvdW50Mik+IHRlbXBsYXRlVG9vTWFueUFyZ3VtZW50cyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50LCBpbnQgY291bnQyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzOiAjY291bnQgYWxsb3dlZCwgYnV0ICNjb3VudDIgZm91bmQuIiIiLAogICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGV4dHJhIHBvc2l0aW9uYWwgYXJndW1lbnRzLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVG9vTWFueUFyZ3VtZW50cyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50LCBpbnQgY291bnQyKT4gY29kZVRvb01hbnlBcmd1bWVudHMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCwgaW50IGNvdW50Mik+KAogICAgICAgICJUb29NYW55QXJndW1lbnRzIiwgdGVtcGxhdGVUb29NYW55QXJndW1lbnRzLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFRSQV9QT1NJVElPTkFMX0FSR1VNRU5UUyJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1Rvb01hbnlBcmd1bWVudHMoaW50IGNvdW50LCBpbnQgY291bnQyKSB7CiAgaWYgKGNvdW50ID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgaWYgKGNvdW50MiA9PSBudWxsKSB0aHJvdyAnTm8gY291bnQgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVG9vTWFueUFyZ3VtZW50cywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzOiAke2NvdW50fSBhbGxvd2VkLCBidXQgJHtjb3VudDJ9IGZvdW5kLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcmVtb3ZpbmcgdGhlIGV4dHJhIHBvc2l0aW9uYWwgYXJndW1lbnRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J2NvdW50JzogY291bnQsICdjb3VudDInOiBjb3VudDJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVG9wTGV2ZWxPcGVyYXRvciA9IG1lc3NhZ2VUb3BMZXZlbE9wZXJhdG9yOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVRvcExldmVsT3BlcmF0b3IgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJUb3BMZXZlbE9wZXJhdG9yIiwKICAgIGluZGV4OiAxNCwKICAgIG1lc3NhZ2U6IHIiIiJPcGVyYXRvcnMgbXVzdCBiZSBkZWNsYXJlZCB3aXRoaW4gYSBjbGFzcy4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgb3BlcmF0b3IsIG1vdmluZyBpdCB0byBhIGNsYXNzLCBvciBjb252ZXJ0aW5nIGl0IHRvIGJlIGEgZnVuY3Rpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVR5cGVBZnRlclZhciA9IG1lc3NhZ2VUeXBlQWZ0ZXJWYXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVHlwZUFmdGVyVmFyID0gY29uc3QgTWVzc2FnZUNvZGUoIlR5cGVBZnRlclZhciIsCiAgICBpbmRleDogODksCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJWYXJpYWJsZXMgY2FuJ3QgYmUgZGVjbGFyZWQgdXNpbmcgYm90aCAndmFyJyBhbmQgYSB0eXBlIG5hbWUuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nICd2YXIuJyIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCk+IHRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2ggPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCAjY291bnQgdHlwZSBhcmd1bWVudHMuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVHlwZUFyZ3VtZW50TWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCk+IGNvZGVUeXBlQXJndW1lbnRNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50KT4oCiAgICAgICAgIlR5cGVBcmd1bWVudE1pc21hdGNoIiwgdGVtcGxhdGVUeXBlQXJndW1lbnRNaXNtYXRjaCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiV1JPTkdfTlVNQkVSX09GX1RZUEVfQVJHVU1FTlRTIl0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVHlwZUFyZ3VtZW50TWlzbWF0Y2goaW50IGNvdW50KSB7CiAgaWYgKGNvdW50ID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVUeXBlQXJndW1lbnRNaXNtYXRjaCwKICAgICAgbWVzc2FnZTogIiIiRXhwZWN0ZWQgJHtjb3VudH0gdHlwZSBhcmd1bWVudHMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnY291bnQnOiBjb3VudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJDYW4ndCB1c2UgdHlwZSBhcmd1bWVudHMgd2l0aCB0eXBlIHZhcmlhYmxlICcjbmFtZScuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHJlbW92aW5nIHRoZSB0eXBlIGFyZ3VtZW50cy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZVR5cGVBcmd1bWVudHNPblR5cGVWYXJpYWJsZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlIiwgdGVtcGxhdGVUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGUsCiAgICAgICAgaW5kZXg6IDEzLCBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGUsCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IHVzZSB0eXBlIGFyZ3VtZW50cyB3aXRoIHR5cGUgdmFyaWFibGUgJyR7bmFtZX0nLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcmVtb3ZpbmcgdGhlIHR5cGUgYXJndW1lbnRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVR5cGVCZWZvcmVGYWN0b3J5ID0gbWVzc2FnZVR5cGVCZWZvcmVGYWN0b3J5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVR5cGVCZWZvcmVGYWN0b3J5ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiVHlwZUJlZm9yZUZhY3RvcnkiLAogICAgaW5kZXg6IDU3LAogICAgbWVzc2FnZTogciIiIkZhY3RvcnkgY29uc3RydWN0b3JzIGNhbm5vdCBoYXZlIGEgcmV0dXJuIHR5cGUuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIHRoZSB0eXBlIGFwcGVhcmluZyBiZWZvcmUgJ2ZhY3RvcnknLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVUeXBlTm90Rm91bmQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlR5cGUgJyNuYW1lJyBub3QgZm91bmQuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVHlwZU5vdEZvdW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVUeXBlTm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlR5cGVOb3RGb3VuZCIsIHRlbXBsYXRlVHlwZU5vdEZvdW5kLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVTkRFRklORURfQ0xBU1MiXSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNUeXBlTm90Rm91bmQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVUeXBlTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIlR5cGUgJyR7bmFtZX0nIG5vdCBmb3VuZC4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+IHRlbXBsYXRlVHlwZU9yaWdpbiA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIicjbmFtZScgaXMgZnJvbSAnI3VyaScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVHlwZU9yaWdpbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4gY29kZVR5cGVPcmlnaW4gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICJUeXBlT3JpZ2luIiwKICB0ZW1wbGF0ZVR5cGVPcmlnaW4sCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVHlwZU9yaWdpbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVUeXBlT3JpZ2luLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXMgZnJvbSAnJHt1cml9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+CiAgICB0ZW1wbGF0ZVR5cGVPcmlnaW5XaXRoRmlsZVVyaSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBpcyBmcm9tICcjdXJpJyAoJyN1cmkyJykuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVHlwZU9yaWdpbldpdGhGaWxlVXJpKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+CiAgICBjb2RlVHlwZU9yaWdpbldpdGhGaWxlVXJpID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICJUeXBlT3JpZ2luV2l0aEZpbGVVcmkiLAogIHRlbXBsYXRlVHlwZU9yaWdpbldpdGhGaWxlVXJpLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1R5cGVPcmlnaW5XaXRoRmlsZVVyaShTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICBTdHJpbmcgdXJpMiA9IHJlbGF0aXZpemVVcmkodXJpMl8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVHlwZU9yaWdpbldpdGhGaWxlVXJpLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXMgZnJvbSAnJHt1cml9JyAoJyR7dXJpMn0nKS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV8sICd1cmkyJzogdXJpMl99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWUgPQogICAgbWVzc2FnZVR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkRVUExJQ0FURV9ERUZJTklUSU9OIl0sCiAgICBtZXNzYWdlOiByIiIiQSB0eXBlIHZhcmlhYmxlIGNhbid0IGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBhbm90aGVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWVDYXVzZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVGhlIG90aGVyIHR5cGUgdmFyaWFibGUgbmFtZWQgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KCJUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlIiwKICAgICAgICB0ZW1wbGF0ZVR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1R5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lQ2F1c2UoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlLAogICAgICBtZXNzYWdlOiAiIiJUaGUgb3RoZXIgdHlwZSB2YXJpYWJsZSBuYW1lZCAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVHlwZVZhcmlhYmxlSW5Db25zdGFudENvbnRleHQgPQogICAgbWVzc2FnZVR5cGVWYXJpYWJsZUluQ29uc3RhbnRDb250ZXh0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVR5cGVWYXJpYWJsZUluQ29uc3RhbnRDb250ZXh0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiVHlwZVZhcmlhYmxlSW5Db25zdGFudENvbnRleHQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRZUEVfUEFSQU1FVEVSX0lOX0NPTlNUX0VYUFJFU1NJT04iXSwKICAgIG1lc3NhZ2U6IHIiIiJUeXBlIHZhcmlhYmxlcyBjYW4ndCBiZSB1c2VkIGFzIGNvbnN0YW50cy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVHlwZVZhcmlhYmxlSW5TdGF0aWNDb250ZXh0ID0KICAgIG1lc3NhZ2VUeXBlVmFyaWFibGVJblN0YXRpY0NvbnRleHQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVHlwZVZhcmlhYmxlSW5TdGF0aWNDb250ZXh0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiVHlwZVZhcmlhYmxlSW5TdGF0aWNDb250ZXh0IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX1BBUkFNRVRFUl9SRUZFUkVOQ0VEX0JZX1NUQVRJQyJdLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZywKICAgIG1lc3NhZ2U6IHIiIiJUeXBlIHZhcmlhYmxlcyBjYW4ndCBiZSB1c2VkIGluIHN0YXRpYyBtZW1iZXJzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVUeXBlVmFyaWFibGVTYW1lTmFtZUFzRW5jbG9zaW5nID0KICAgIG1lc3NhZ2VUeXBlVmFyaWFibGVTYW1lTmFtZUFzRW5jbG9zaW5nOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVR5cGVWYXJpYWJsZVNhbWVOYW1lQXNFbmNsb3NpbmcgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJUeXBlVmFyaWFibGVTYW1lTmFtZUFzRW5jbG9zaW5nIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05GTElDVElOR19UWVBFX1ZBUklBQkxFX0FORF9DTEFTUyJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQSB0eXBlIHZhcmlhYmxlIGNhbid0IGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBpdHMgZW5jbG9zaW5nIGRlY2xhcmF0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVUeXBlZGVmSW5DbGFzcyA9IG1lc3NhZ2VUeXBlZGVmSW5DbGFzczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VUeXBlZGVmSW5DbGFzcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJUeXBlZGVmSW5DbGFzcyIsCiAgICBpbmRleDogNywKICAgIG1lc3NhZ2U6IHIiIiJUeXBlZGVmcyBjYW4ndCBiZSBkZWNsYXJlZCBpbnNpZGUgY2xhc3Nlcy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgbW92aW5nIHRoZSB0eXBlZGVmIHRvIHRoZSB0b3AtbGV2ZWwuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVR5cGVkZWZOb3RGdW5jdGlvbiA9IG1lc3NhZ2VUeXBlZGVmTm90RnVuY3Rpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVHlwZWRlZk5vdEZ1bmN0aW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiVHlwZWRlZk5vdEZ1bmN0aW9uIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX0dFTkVSSUNfRlVOQ1RJT05fVFlQRSJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IGNyZWF0ZSB0eXBlZGVmIGZyb20gbm9uLWZ1bmN0aW9uIHR5cGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBEYXJ0VHlwZQogICAgICAgICAgICBfdHlwZSk+IHRlbXBsYXRlVW5kZWZpbmVkR2V0dGVyID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIGdldHRlciAnI25hbWUnIGlzbid0IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnI3R5cGUnLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgY29ycmVjdGluZyB0aGUgbmFtZSB0byB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBnZXR0ZXIsIG9yIGRlZmluaW5nIGEgZ2V0dGVyIG9yIGZpZWxkIG5hbWVkICcjbmFtZScuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNVbmRlZmluZWRHZXR0ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSk+IGNvZGVVbmRlZmluZWRHZXR0ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSk+KAogICAgICAgICJVbmRlZmluZWRHZXR0ZXIiLCB0ZW1wbGF0ZVVuZGVmaW5lZEdldHRlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX0dFVFRFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNVbmRlZmluZWRHZXR0ZXIoU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoKTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVVuZGVmaW5lZEdldHRlciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBnZXR0ZXIgJyR7bmFtZX0nIGlzbid0IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnJHt0eXBlfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6CiAgICAgICAgICAiIiJUcnkgY29ycmVjdGluZyB0aGUgbmFtZSB0byB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBnZXR0ZXIsIG9yIGRlZmluaW5nIGEgZ2V0dGVyIG9yIGZpZWxkIG5hbWVkICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgRGFydFR5cGUKICAgICAgICAgICAgX3R5cGUpPiB0ZW1wbGF0ZVVuZGVmaW5lZE1ldGhvZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBtZXRob2QgJyNuYW1lJyBpc24ndCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyN0eXBlJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgbWV0aG9kLCBvciBkZWZpbmluZyBhIG1ldGhvZCBuYW1lZCAnI25hbWUnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVW5kZWZpbmVkTWV0aG9kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUpPiBjb2RlVW5kZWZpbmVkTWV0aG9kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUpPigKICAgICAgICAiVW5kZWZpbmVkTWV0aG9kIiwgdGVtcGxhdGVVbmRlZmluZWRNZXRob2QsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVOREVGSU5FRF9NRVRIT0QiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVW5kZWZpbmVkTWV0aG9kKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVVbmRlZmluZWRNZXRob2QsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgbWV0aG9kICcke25hbWV9JyBpc24ndCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyR7dHlwZX0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgbWV0aG9kLCBvciBkZWZpbmluZyBhIG1ldGhvZCBuYW1lZCAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIERhcnRUeXBlCiAgICAgICAgICAgIF90eXBlKT4gdGVtcGxhdGVVbmRlZmluZWRTZXR0ZXIgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgc2V0dGVyICcjbmFtZScgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzICcjdHlwZScuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIHNldHRlciwgb3IgZGVmaW5pbmcgYSBzZXR0ZXIgb3IgZmllbGQgbmFtZWQgJyNuYW1lJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1VuZGVmaW5lZFNldHRlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlKT4gY29kZVVuZGVmaW5lZFNldHRlciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlKT4oCiAgICAgICAgIlVuZGVmaW5lZFNldHRlciIsIHRlbXBsYXRlVW5kZWZpbmVkU2V0dGVyLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVTkRFRklORURfU0VUVEVSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1VuZGVmaW5lZFNldHRlcihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcigpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVW5kZWZpbmVkU2V0dGVyLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHNldHRlciAnJHtuYW1lfScgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzICcke3R5cGV9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDoKICAgICAgICAgICIiIlRyeSBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIHNldHRlciwgb3IgZGVmaW5pbmcgYSBzZXR0ZXIgb3IgZmllbGQgbmFtZWQgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVVuZXhwZWN0ZWREb2xsYXJJblN0cmluZyA9IG1lc3NhZ2VVbmV4cGVjdGVkRG9sbGFySW5TdHJpbmc7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVW5leHBlY3RlZERvbGxhckluU3RyaW5nID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiVW5leHBlY3RlZERvbGxhckluU3RyaW5nIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVTkVYUEVDVEVEX0RPTExBUl9JTl9TVFJJTkciXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgJyQnIGhhcyBzcGVjaWFsIG1lYW5pbmcgaW5zaWRlIGEgc3RyaW5nLCBhbmQgbXVzdCBiZSBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyIG9yIGFuIGV4cHJlc3Npb24gaW4gY3VybHkgYnJhY2VzICh7fSkuIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyBhIGJhY2tzbGFzaCAoXCkgdG8gZXNjYXBlIHRoZSAnJCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbiA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVW5leHBlY3RlZCB0b2tlbiAnI2xleGVtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVW5leHBlY3RlZFRva2VuKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVVbmV4cGVjdGVkVG9rZW4gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgIlVuZXhwZWN0ZWRUb2tlbiIsIHRlbXBsYXRlVW5leHBlY3RlZFRva2VuLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVTkVYUEVDVEVEX1RPS0VOIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1VuZXhwZWN0ZWRUb2tlbihUb2tlbiB0b2tlbikgewogIFN0cmluZyBsZXhlbWUgPSB0b2tlbi5sZXhlbWU7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVVbmV4cGVjdGVkVG9rZW4sCiAgICAgIG1lc3NhZ2U6ICIiIlVuZXhwZWN0ZWQgdG9rZW4gJyR7bGV4ZW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFRva2VuIHRva2VuKT4KICAgIHRlbXBsYXRlVW5tYXRjaGVkVG9rZW4gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBUb2tlbiB0b2tlbik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNhbid0IGZpbmQgJyNzdHJpbmcnIHRvIG1hdGNoICcjbGV4ZW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNVbm1hdGNoZWRUb2tlbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgVG9rZW4gdG9rZW4pPiBjb2RlVW5tYXRjaGVkVG9rZW4gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFRva2VuIHRva2VuKT4oCiAgICAgICAgIlVubWF0Y2hlZFRva2VuIiwgdGVtcGxhdGVVbm1hdGNoZWRUb2tlbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQRUNURURfVE9LRU4iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVW5tYXRjaGVkVG9rZW4oU3RyaW5nIHN0cmluZywgVG9rZW4gdG9rZW4pIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIFN0cmluZyBsZXhlbWUgPSB0b2tlbi5sZXhlbWU7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVVbm1hdGNoZWRUb2tlbiwKICAgICAgbWVzc2FnZTogIiIiQ2FuJ3QgZmluZCAnJHtzdHJpbmd9JyB0byBtYXRjaCAnJHtsZXhlbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmcsICd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZVVucmVzb2x2ZWRQcmVmaXhJblR5cGVBbm5vdGF0aW9uID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIicjbmFtZS4jbmFtZTInIGNhbid0IGJlIHVzZWQgYXMgYSB0eXBlIGJlY2F1c2UgJyNuYW1lJyBpc24ndCBkZWZpbmVkLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVW5yZXNvbHZlZFByZWZpeEluVHlwZUFubm90YXRpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZVVucmVzb2x2ZWRQcmVmaXhJblR5cGVBbm5vdGF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIlVucmVzb2x2ZWRQcmVmaXhJblR5cGVBbm5vdGF0aW9uIiwKICAgICAgICB0ZW1wbGF0ZVVucmVzb2x2ZWRQcmVmaXhJblR5cGVBbm5vdGF0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOT1RfQV9UWVBFIl0sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVW5yZXNvbHZlZFByZWZpeEluVHlwZUFubm90YXRpb24oCiAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVVucmVzb2x2ZWRQcmVmaXhJblR5cGVBbm5vdGF0aW9uLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiJyR7bmFtZX0uJHtuYW1lMn0nIGNhbid0IGJlIHVzZWQgYXMgYSB0eXBlIGJlY2F1c2UgJyR7bmFtZX0nIGlzbid0IGRlZmluZWQuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IHRlbXBsYXRlVW5zcGVjaWZpZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiI3N0cmluZyIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1Vuc3BlY2lmaWVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZVVuc3BlY2lmaWVkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgIlVuc3BlY2lmaWVkIiwKICB0ZW1wbGF0ZVVuc3BlY2lmaWVkLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1Vuc3BlY2lmaWVkKFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVW5zcGVjaWZpZWQsCiAgICAgIG1lc3NhZ2U6ICIiIiR7c3RyaW5nfSIiIiwgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gdGVtcGxhdGVVbnN1cHBvcnRlZE9wZXJhdG9yID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUaGUgJyNsZXhlbWUnIG9wZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVW5zdXBwb3J0ZWRPcGVyYXRvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiBjb2RlVW5zdXBwb3J0ZWRPcGVyYXRvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiVW5zdXBwb3J0ZWRPcGVyYXRvciIsIHRlbXBsYXRlVW5zdXBwb3J0ZWRPcGVyYXRvciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5TVVBQT1JURURfT1BFUkFUT1IiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVW5zdXBwb3J0ZWRPcGVyYXRvcihUb2tlbiB0b2tlbikgewogIFN0cmluZyBsZXhlbWUgPSB0b2tlbi5sZXhlbWU7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVVbnN1cHBvcnRlZE9wZXJhdG9yLAogICAgICBtZXNzYWdlOiAiIiJUaGUgJyR7bGV4ZW1lfScgb3BlcmF0b3IgaXMgbm90IHN1cHBvcnRlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVVuc3VwcG9ydGVkUHJlZml4UGx1cyA9IG1lc3NhZ2VVbnN1cHBvcnRlZFByZWZpeFBsdXM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVW5zdXBwb3J0ZWRQcmVmaXhQbHVzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiVW5zdXBwb3J0ZWRQcmVmaXhQbHVzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX0lERU5USUZJRVIiXSwKICAgIG1lc3NhZ2U6IHIiIiInKycgaXMgbm90IGEgcHJlZml4IG9wZXJhdG9yLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyAnKycuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVVudGVybWluYXRlZENvbW1lbnQgPSBtZXNzYWdlVW50ZXJtaW5hdGVkQ29tbWVudDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VVbnRlcm1pbmF0ZWRDb21tZW50ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiVW50ZXJtaW5hdGVkQ29tbWVudCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5URVJNSU5BVEVEX01VTFRJX0xJTkVfQ09NTUVOVCJdLAogICAgbWVzc2FnZTogciIiIkNvbW1lbnQgc3RhcnRpbmcgd2l0aCAnLyonIG11c3QgZW5kIHdpdGggJyovJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+CiAgICB0ZW1wbGF0ZVVudGVybWluYXRlZFN0cmluZyA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiU3RyaW5nIHN0YXJ0aW5nIHdpdGggI3N0cmluZyBtdXN0IGVuZCB3aXRoICNzdHJpbmcyLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1VudGVybWluYXRlZFN0cmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgY29kZVVudGVybWluYXRlZFN0cmluZyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPigKICAgICAgICAiVW50ZXJtaW5hdGVkU3RyaW5nIiwgdGVtcGxhdGVVbnRlcm1pbmF0ZWRTdHJpbmcsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVOVEVSTUlOQVRFRF9TVFJJTkdfTElURVJBTCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNVbnRlcm1pbmF0ZWRTdHJpbmcoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChzdHJpbmcyLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVW50ZXJtaW5hdGVkU3RyaW5nLAogICAgICBtZXNzYWdlOiAiIiJTdHJpbmcgc3RhcnRpbmcgd2l0aCAke3N0cmluZ30gbXVzdCBlbmQgd2l0aCAke3N0cmluZzJ9LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ3N0cmluZzInOiBzdHJpbmcyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVVudGVybWluYXRlZFRva2VuID0gbWVzc2FnZVVudGVybWluYXRlZFRva2VuOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVVudGVybWluYXRlZFRva2VuID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJVbnRlcm1pbmF0ZWRUb2tlbiIsIG1lc3NhZ2U6IHIiIiJJbmNvbXBsZXRlIHRva2VuLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gdGVtcGxhdGVVbnRyYW5zbGF0YWJsZVVyaSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiTm90IGZvdW5kOiAnI3VyaSciIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNVbnRyYW5zbGF0YWJsZVVyaSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiBjb2RlVW50cmFuc2xhdGFibGVVcmkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgICAgICAgIlVudHJhbnNsYXRhYmxlVXJpIiwgdGVtcGxhdGVVbnRyYW5zbGF0YWJsZVVyaSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVVJJX0RPRVNfTk9UX0VYSVNUIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1VudHJhbnNsYXRhYmxlVXJpKFVyaSB1cmlfKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVVbnRyYW5zbGF0YWJsZVVyaSwKICAgICAgbWVzc2FnZTogIiIiTm90IGZvdW5kOiAnJHt1cml9JyIiIiwgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZVVzZU9mRGVwcmVjYXRlZElkZW50aWZpZXIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIicjbmFtZScgaXMgZGVwcmVjYXRlZC4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNVc2VPZkRlcHJlY2F0ZWRJZGVudGlmaWVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVVc2VPZkRlcHJlY2F0ZWRJZGVudGlmaWVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJVc2VPZkRlcHJlY2F0ZWRJZGVudGlmaWVyIiwgdGVtcGxhdGVVc2VPZkRlcHJlY2F0ZWRJZGVudGlmaWVyLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pZ25vcmVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNVc2VPZkRlcHJlY2F0ZWRJZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllciwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzIGRlcHJlY2F0ZWQuIiIiLCBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVmFyQXNUeXBlTmFtZSA9IG1lc3NhZ2VWYXJBc1R5cGVOYW1lOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVZhckFzVHlwZU5hbWUgPSBjb25zdCBNZXNzYWdlQ29kZSgiVmFyQXNUeXBlTmFtZSIsCiAgICBpbmRleDogNjEsIG1lc3NhZ2U6IHIiIiJUaGUga2V5d29yZCAndmFyJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBuYW1lLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVWYXJSZXR1cm5UeXBlID0gbWVzc2FnZVZhclJldHVyblR5cGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVmFyUmV0dXJuVHlwZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJWYXJSZXR1cm5UeXBlIiwKICAgIGluZGV4OiAxMiwKICAgIG1lc3NhZ2U6IHIiIiJUaGUgcmV0dXJuIHR5cGUgY2FuJ3QgYmUgJ3ZhcicuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ3ZhcicsIG9yIHJlcGxhY2luZyBpdCB3aXRoIHRoZSBuYW1lIG9mIHRoZSByZXR1cm4gdHlwZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVm9pZEV4cHJlc3Npb24gPSBtZXNzYWdlVm9pZEV4cHJlc3Npb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVm9pZEV4cHJlc3Npb24gPSBjb25zdCBNZXNzYWdlQ29kZSgiVm9pZEV4cHJlc3Npb24iLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVTRV9PRl9WT0lEX1JFU1VMVCJdLAogICAgbWVzc2FnZTogciIiIlRoaXMgZXhwcmVzc2lvbiBoYXMgdHlwZSAndm9pZCcgYW5kIGNhbid0IGJlIHVzZWQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgc3RyaW5nLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBzdHJpbmcyKT4gdGVtcGxhdGVXZWJMaXRlcmFsQ2Fubm90QmVSZXByZXNlbnRlZEV4YWN0bHkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBpbnRlZ2VyIGxpdGVyYWwgI3N0cmluZyBjYW4ndCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGluIEphdmFTY3JpcHQuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBjaGFuZ2luZyB0aGUgbGl0ZXJhbCB0byBzb21ldGhpbmcgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gSmF2YXNjcmlwdC4gSW4gSmF2YXNjcmlwdCAjc3RyaW5nMiBpcyB0aGUgbmVhcmVzdCB2YWx1ZSB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBleGFjdGx5LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzV2ViTGl0ZXJhbENhbm5vdEJlUmVwcmVzZW50ZWRFeGFjdGx5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+CiAgICBjb2RlV2ViTGl0ZXJhbENhbm5vdEJlUmVwcmVzZW50ZWRFeGFjdGx5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICJXZWJMaXRlcmFsQ2Fubm90QmVSZXByZXNlbnRlZEV4YWN0bHkiLAogIHRlbXBsYXRlV2ViTGl0ZXJhbENhbm5vdEJlUmVwcmVzZW50ZWRFeGFjdGx5LAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1dlYkxpdGVyYWxDYW5ub3RCZVJlcHJlc2VudGVkRXhhY3RseSgKICAgIFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVdlYkxpdGVyYWxDYW5ub3RCZVJlcHJlc2VudGVkRXhhY3RseSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBpbnRlZ2VyIGxpdGVyYWwgJHtzdHJpbmd9IGNhbid0IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgaW4gSmF2YVNjcmlwdC4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IGNoYW5naW5nIHRoZSBsaXRlcmFsIHRvIHNvbWV0aGluZyB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBpbiBKYXZhc2NyaXB0LiBJbiBKYXZhc2NyaXB0ICR7c3RyaW5nMn0gaXMgdGhlIG5lYXJlc3QgdmFsdWUgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgZXhhY3RseS4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmcsICdzdHJpbmcyJzogc3RyaW5nMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVXaXRoQmVmb3JlRXh0ZW5kcyA9IG1lc3NhZ2VXaXRoQmVmb3JlRXh0ZW5kczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VXaXRoQmVmb3JlRXh0ZW5kcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIldpdGhCZWZvcmVFeHRlbmRzIiwKICAgIGluZGV4OiAxMSwKICAgIG1lc3NhZ2U6IHIiIiJUaGUgZXh0ZW5kcyBjbGF1c2UgbXVzdCBiZSBiZWZvcmUgdGhlIHdpdGggY2xhdXNlLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGV4dGVuZHMgY2xhdXNlIGJlZm9yZSB0aGUgd2l0aCBjbGF1c2UuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVlpZWxkQXNJZGVudGlmaWVyID0gbWVzc2FnZVlpZWxkQXNJZGVudGlmaWVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVlpZWxkQXNJZGVudGlmaWVyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiWWllbGRBc0lkZW50aWZpZXIiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkFTWU5DX0tFWVdPUkRfVVNFRF9BU19JREVOVElGSUVSIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiIneWllbGQnIGNhbid0IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBpbiAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJyBtZXRob2RzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVZaWVsZE5vdEdlbmVyYXRvciA9IG1lc3NhZ2VZaWVsZE5vdEdlbmVyYXRvcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VZaWVsZE5vdEdlbmVyYXRvciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIllpZWxkTm90R2VuZXJhdG9yIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJZSUVMRF9JTl9OT05fR0VORVJBVE9SIl0sCiAgICBtZXNzYWdlOiByIiIiJ3lpZWxkJyBjYW4gb25s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ATlGNSkzATk+MREXAwE5MzImQAIBOUwzSjsBOUQvPDoBOTkgLkEkAgE5SwE5RB0zMyQBOUcBOUIbQEUBOUAhRRlJOgE5PB1BOkEBOUoyMy1POgIBOUMBOS1PATlHMDM5ATk/LDg4ATk0JCxFAgE5LigzOEEBOUovSCUBOT8uLTRLAgE5OwE5TFEBOTsBOUwPNQljATk9ATlOM0kBORAWFw9VOhVYEYCqSAE5PC9BKjADATk8JTIzPw9bgK46AgE5QwE5QBkPSEgBOUMBOUAZQQ1iATlDATlAGTdPATZwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZmFzdGFfY29kZXNfZ2VuZXJhdGVkLmRhcnQyc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NldmVyaXR5LmRhcnSFLS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnNldmVyaXR5OwoKZW51bSBTZXZlcml0eSB7CiAgY29udGV4dCwKICBlcnJvciwKICBlcnJvckxlZ2FjeVdhcm5pbmcsCiAgaWdub3JlZCwKICBpbnRlcm5hbFByb2JsZW0sCiAgd2FybmluZywKfQoKY29uc3QgTWFwPFN0cmluZywgU3RyaW5nPiBzZXZlcml0eUVudW1OYW1lcyA9IGNvbnN0IDxTdHJpbmcsIFN0cmluZz57CiAgJ0NPTlRFWFQnOiAnY29udGV4dCcsCiAgJ0VSUk9SJzogJ2Vycm9yJywKICAnRVJST1JfTEVHQUNZX1dBUk5JTkcnOiAnZXJyb3JMZWdhY3lXYXJuaW5nJywKICAnSUdOT1JFRCc6ICdpZ25vcmVkJywKICAnSU5URVJOQUxfUFJPQkxFTSc6ICdpbnRlcm5hbFByb2JsZW0nLAogICdXQVJOSU5HJzogJ3dhcm5pbmcnLAp9OwoKY29uc3QgTWFwPFN0cmluZywgU2V2ZXJpdHk+IHNldmVyaXR5RW51bVZhbHVlcyA9IGNvbnN0IDxTdHJpbmcsIFNldmVyaXR5PnsKICAnQ09OVEVYVCc6IFNldmVyaXR5LmNvbnRleHQsCiAgJ0VSUk9SJzogU2V2ZXJpdHkuZXJyb3IsCiAgJ0VSUk9SX0xFR0FDWV9XQVJOSU5HJzogU2V2ZXJpdHkuZXJyb3JMZWdhY3lXYXJuaW5nLAogICdJR05PUkVEJzogU2V2ZXJpdHkuaWdub3JlZCwKICAnSU5URVJOQUxfUFJPQkxFTSc6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSwKICAnV0FSTklORyc6IFNldmVyaXR5Lndhcm5pbmcsCn07Cgpjb25zdCBNYXA8U2V2ZXJpdHksIFN0cmluZz4gc2V2ZXJpdHlQcmVmaXhlcyA9IGNvbnN0IDxTZXZlcml0eSwgU3RyaW5nPnsKICBTZXZlcml0eS5lcnJvcjogIkVycm9yIiwKICBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW06ICJJbnRlcm5hbCBwcm9ibGVtIiwKICBTZXZlcml0eS53YXJuaW5nOiAiV2FybmluZyIsCiAgU2V2ZXJpdHkuY29udGV4dDogIkNvbnRleHQiLAp9OwoKY29uc3QgTWFwPFNldmVyaXR5LCBTdHJpbmc+IHNldmVyaXR5VGV4dHMgPSBjb25zdCA8U2V2ZXJpdHksIFN0cmluZz57CiAgU2V2ZXJpdHkuZXJyb3I6ICJlcnJvciIsCiAgU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtOiAiaW50ZXJuYWwgcHJvYmxlbSIsCiAgU2V2ZXJpdHkud2FybmluZzogIndhcm5pbmciLAogIFNldmVyaXR5LmNvbnRleHQ6ICJjb250ZXh0IiwKfTsKMABOTjwBGAEQCwkWCxMLAgFGGBQwGCkYAwFLHxs3HzAfAwFJGzAfHwMBRhswHx8DASlwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc2V2ZXJpdHkuZGFydDlzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMva2VybmVsX2dlbmVyYXRvcl9pbXBsLmRhcnSb/S8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gRGVmaW5lcyB0aGUgZnJvbnQtZW5kIEFQSSBmb3IgY29udmVydGluZyBzb3VyY2UgY29kZSB0byBEYXJ0IEtlcm5lbCBvYmplY3RzLgpsaWJyYXJ5IGZyb250X2VuZC5rZXJuZWxfZ2VuZXJhdG9yX2ltcGw7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydCcgc2hvdyBDb21wb25lbnQsIENhbm9uaWNhbE5hbWU7CgppbXBvcnQgJ2Jhc2UvcHJvY2Vzc2VkX29wdGlvbnMuZGFydCcgc2hvdyBQcm9jZXNzZWRPcHRpb25zOwoKaW1wb3J0ICdmYXN0YS9jb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKaW1wb3J0ICdmYXN0YS9jcmFzaC5kYXJ0JyBzaG93IHdpdGhDcmFzaFJlcG9ydGluZzsKCmltcG9ydCAnZmFzdGEvZGlsbC9kaWxsX3RhcmdldC5kYXJ0JyBzaG93IERpbGxUYXJnZXQ7CgppbXBvcnQgJ2Zhc3RhL2tlcm5lbC9rZXJuZWxfdGFyZ2V0LmRhcnQnIHNob3cgS2VybmVsVGFyZ2V0OwoKaW1wb3J0ICdmYXN0YS9rZXJuZWwvdXRpbHMuZGFydCcgc2hvdyBwcmludENvbXBvbmVudFRleHQsIHNlcmlhbGl6ZUNvbXBvbmVudDsKCmltcG9ydCAnZmFzdGEva2VybmVsL3ZlcmlmaWVyLmRhcnQnIHNob3cgdmVyaWZ5Q29tcG9uZW50OwoKaW1wb3J0ICdmYXN0YS9sb2FkZXIuZGFydCcgc2hvdyBMb2FkZXI7CgppbXBvcnQgJ2Zhc3RhL3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJ2Zhc3RhL3VyaV90cmFuc2xhdG9yLmRhcnQnIHNob3cgVXJpVHJhbnNsYXRvcjsKCi8vLyBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlCi8vLyBgcGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUva2VybmVsX2dlbmVyYXRvci5kYXJ0YCBhbmQKLy8vIGBwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9zdW1tYXJ5X2dlbmVyYXRvci5kYXJ0YCBBUElzLgpGdXR1cmU8Q29tcGlsZXJSZXN1bHQ+IGdlbmVyYXRlS2VybmVsKFByb2Nlc3NlZE9wdGlvbnMgb3B0aW9ucywKICAgIHtib29sIGJ1aWxkU3VtbWFyeTogZmFsc2UsCiAgICBib29sIGJ1aWxkQ29tcG9uZW50OiB0cnVlLAogICAgYm9vbCB0cnVuY2F0ZVN1bW1hcnk6IGZhbHNlLAogICAgYm9vbCBpbmNsdWRlT2Zmc2V0czogdHJ1ZX0pIGFzeW5jIHsKICByZXR1cm4gYXdhaXQgQ29tcGlsZXJDb250ZXh0LnJ1bldpdGhPcHRpb25zKG9wdGlvbnMsIChfKSBhc3luYyB7CiAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVLZXJuZWxJbnRlcm5hbCgKICAgICAgICBidWlsZFN1bW1hcnk6IGJ1aWxkU3VtbWFyeSwKICAgICAgICBidWlsZENvbXBvbmVudDogYnVpbGRDb21wb25lbnQsCiAgICAgICAgdHJ1bmNhdGVTdW1tYXJ5OiB0cnVuY2F0ZVN1bW1hcnksCiAgICAgICAgaW5jbHVkZU9mZnNldHM6IGluY2x1ZGVPZmZzZXRzKTsKICB9KTsKfQoKRnV0dXJlPENvbXBpbGVyUmVzdWx0PiBnZW5lcmF0ZUtlcm5lbEludGVybmFsKAogICAge2Jvb2wgYnVpbGRTdW1tYXJ5OiBmYWxzZSwKICAgIGJvb2wgYnVpbGRDb21wb25lbnQ6IHRydWUsCiAgICBib29sIHRydW5jYXRlU3VtbWFyeTogZmFsc2UsCiAgICBib29sIGluY2x1ZGVPZmZzZXRzOiB0cnVlLAogICAgYm9vbCByZXRhaW5EYXRhRm9yVGVzdGluZzogZmFsc2V9KSBhc3luYyB7CiAgdmFyIG9wdGlvbnMgPSBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zOwogIHZhciBmcyA9IG9wdGlvbnMuZmlsZVN5c3RlbTsKCiAgTG9hZGVyIHNvdXJjZUxvYWRlcjsKICByZXR1cm4gd2l0aENyYXNoUmVwb3J0aW5nPENvbXBpbGVyUmVzdWx0PigoKSBhc3luYyB7CiAgICBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IgPSBhd2FpdCBvcHRpb25zLmdldFVyaVRyYW5zbGF0b3IoKTsKCiAgICB2YXIgZGlsbFRhcmdldCA9CiAgICAgICAgbmV3IERpbGxUYXJnZXQob3B0aW9ucy50aWNrZXIsIHVyaVRyYW5zbGF0b3IsIG9wdGlvbnMudGFyZ2V0KTsKCiAgICBTZXQ8VXJpPiBleHRlcm5hbExpYnMoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgICByZXR1cm4gY29tcG9uZW50LmxpYnJhcmllcwogICAgICAgICAgLndoZXJlKChsaWIpID0+IGxpYi5pc0V4dGVybmFsKQogICAgICAgICAgLm1hcCgobGliKSA9PiBsaWIuaW1wb3J0VXJpKQogICAgICAgICAgLnRvU2V0KCk7CiAgICB9CgogICAgdmFyIHNka1N1bW1hcnkgPSBhd2FpdCBvcHRpb25zLmxvYWRTZGtTdW1tYXJ5KG51bGwpOwogICAgLy8gQnkgdXNpbmcgdGhlIG5hbWVSb290IG9mIHRoZSB0aGUgc3VtbWFyeSwgd2UgZW5hYmxlIHNoYXJpbmcgdGhlCiAgICAvLyBzZGtTdW1tYXJ5IGJldHdlZW4gbXVsdGlwbGUgaW52b2NhdGlvbnMuCiAgICBDYW5vbmljYWxOYW1lIG5hbWVSb290ID0gc2RrU3VtbWFyeT8ucm9vdCA/PyBuZXcgQ2Fub25pY2FsTmFtZS5yb290KCk7CiAgICBpZiAoc2RrU3VtbWFyeSAhPSBudWxsKSB7CiAgICAgIHZhciBleGNsdWRlZCA9IGV4dGVybmFsTGlicyhzZGtTdW1tYXJ5KTsKICAgICAgZGlsbFRhcmdldC5sb2FkZXIuYXBwZW5kTGlicmFyaWVzKHNka1N1bW1hcnksCiAgICAgICAgICBmaWx0ZXI6ICh1cmkpID0+ICFleGNsdWRlZC5jb250YWlucyh1cmkpKTsKICAgIH0KCiAgICAvLyBUT0RPKHNpZ211bmQpOiBwcm92aWRlIGJldHRlciBlcnJvciByZXBvcnRpbmcgaWYgaW5wdXQgc3VtbWFyaWVzIG9yCiAgICAvLyBsaW5rZWQgZGVwZW5kZW5jaWVzIHdlcmUgbGlzdGVkIG91dCBvZiBvcmRlciAob3IgcHJvdmlkZSBtZWNoYW5pc20gdG8KICAgIC8vIHNvcnQgdGhlbSkuCiAgICBmb3IgKHZhciBpbnB1dFN1bW1hcnkgaW4gYXdhaXQgb3B0aW9ucy5sb2FkSW5wdXRTdW1tYXJpZXMobmFtZVJvb3QpKSB7CiAgICAgIHZhciBleGNsdWRlZCA9IGV4dGVybmFsTGlicyhpbnB1dFN1bW1hcnkpOwogICAgICBkaWxsVGFyZ2V0LmxvYWRlci5hcHBlbmRMaWJyYXJpZXMoaW5wdXRTdW1tYXJ5LAogICAgICAgICAgZmlsdGVyOiAodXJpKSA9PiAhZXhjbHVkZWQuY29udGFpbnModXJpKSk7CiAgICB9CgogICAgLy8gQWxsIHN1bW1hcmllcyBhcmUgY29uc2lkZXJlZCBleHRlcm5hbCBhbmQgc2hvdWxkbid0IGluY2x1ZGUgc291cmNlLWluZm8uCiAgICBkaWxsVGFyZ2V0LmxvYWRlci5saWJyYXJpZXMuZm9yRWFjaCgobGliKSB7CiAgICAgIC8vIFRPRE8oYWhlKTogRG9uJ3QgZG8gdGhpcywgYW5kIHJlbW92ZSBbZXh0ZXJuYWxfc3RhdGVfc25hcHNob3QuZGFydF0uCiAgICAgIGxpYi5pc0V4dGVybmFsID0gdHJ1ZTsKICAgIH0pOwoKICAgIC8vIExpbmtlZCBkZXBlbmRlbmNpZXMgYXJlIG1lYW50IHRvIGJlIHBhcnQgb2YgdGhlIGNvbXBvbmVudCBzbyB0aGV5IGFyZSBub3QKICAgIC8vIG1hcmtlZCBleHRlcm5hbC4KICAgIGZvciAodmFyIGRlcGVuZGVuY3kgaW4gYXdhaXQgb3B0aW9ucy5sb2FkTGlua0RlcGVuZGVuY2llcyhuYW1lUm9vdCkpIHsKICAgICAgdmFyIGV4Y2x1ZGVkID0gZXh0ZXJuYWxMaWJzKGRlcGVuZGVuY3kpOwogICAgICBkaWxsVGFyZ2V0LmxvYWRlci5hcHBlbmRMaWJyYXJpZXMoZGVwZW5kZW5jeSwKICAgICAgICAgIGZpbHRlcjogKHVyaSkgPT4gIWV4Y2x1ZGVkLmNvbnRhaW5zKHVyaSkpOwogICAgfQoKICAgIGF3YWl0IGRpbGxUYXJnZXQuYnVpbGRPdXRsaW5lcygpOwoKICAgIHZhciBrZXJuZWxUYXJnZXQgPSBuZXcgS2VybmVsVGFyZ2V0KGZzLCBmYWxzZSwgZGlsbFRhcmdldCwgdXJpVHJhbnNsYXRvcik7CiAgICBzb3VyY2VMb2FkZXIgPSBrZXJuZWxUYXJnZXQubG9hZGVyOwogICAga2VybmVsVGFyZ2V0LnNldEVudHJ5UG9pbnRzKG9wdGlvbnMuaW5wdXRzKTsKICAgIENvbXBvbmVudCBzdW1tYXJ5Q29tcG9uZW50ID0KICAgICAgICBhd2FpdCBrZXJuZWxUYXJnZXQuYnVpbGRPdXRsaW5lcyhuYW1lUm9vdDogbmFtZVJvb3QpOwogICAgTGlzdDxpbnQ+IHN1bW1hcnkgPSBudWxsOwogICAgaWYgKGJ1aWxkU3VtbWFyeSkgewogICAgICBpZiAob3B0aW9ucy52ZXJpZnkpIHsKICAgICAgICBmb3IgKHZhciBlcnJvciBpbiB2ZXJpZnlDb21wb25lbnQoc3VtbWFyeUNvbXBvbmVudCkpIHsKICAgICAgICAgIG9wdGlvbnMucmVwb3J0KGVycm9yLCBTZXZlcml0eS5lcnJvcik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmRlYnVnRHVtcCkgewogICAgICAgIHByaW50Q29tcG9uZW50VGV4dChzdW1tYXJ5Q29tcG9uZW50LAogICAgICAgICAgICBsaWJyYXJ5RmlsdGVyOiBrZXJuZWxUYXJnZXQuaXNTb3VyY2VMaWJyYXJ5KTsKICAgICAgfQoKICAgICAgLy8gQ3JlYXRlIHRoZSByZXF1ZXN0ZWQgY29tcG9uZW50ICgidHJ1bmNhdGluZyIgb3Igbm90KS4KICAgICAgLy8KICAgICAgLy8gTm90ZTogd2UgZG9uJ3QgcGFzcyB0aGUgbGlicmFyeSBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3IgdG8KICAgICAgLy8gcHJlc2VydmUgdGhlIHRoZSBsaWJyYXJpZXMgcGFyZW50IHBvaW50ZXIgKGl0IHNob3VsZCBjb250aW51ZSB0byBwb2ludAogICAgICAvLyB0byB0aGUgY29tcG9uZW50IHdpdGhpbiBLZXJuZWxUYXJnZXQpLgogICAgICB2YXIgdHJpbW1lZFN1bW1hcnlDb21wb25lbnQgPQogICAgICAgICAgbmV3IENvbXBvbmVudChuYW1lUm9vdDogc3VtbWFyeUNvbXBvbmVudC5yb290KQogICAgICAgICAgICAuLmxpYnJhcmllcy5hZGRBbGwodHJ1bmNhdGVTdW1tYXJ5CiAgICAgICAgICAgICAgICA/IGtlcm5lbFRhcmdldC5sb2FkZXIubGlicmFyaWVzCiAgICAgICAgICAgICAgICA6IHN1bW1hcnlDb21wb25lbnQubGlicmFyaWVzKTsKICAgICAgdHJpbW1lZFN1bW1hcnlDb21wb25lbnQubWV0YWRhdGEuYWRkQWxsKHN1bW1hcnlDb21wb25lbnQubWV0YWRhdGEpOwogICAgICB0cmltbWVkU3VtbWFyeUNvbXBvbmVudC51cmlUb1NvdXJjZS5hZGRBbGwoc3VtbWFyeUNvbXBvbmVudC51cmlUb1NvdXJjZSk7CgogICAgICAvLyBBcyBkb2N1bWVudGVkLCB3ZSBvbmx5IHJ1biBvdXRsaW5lIHRyYW5zZm9ybWF0aW9ucyB3aGVuIHdlIGFyZSBidWlsZGluZwogICAgICAvLyBzdW1tYXJpZXMgd2l0aG91dCBidWlsZGluZyBhIGZ1bGwgY29tcG9uZW50IChhdCB0aGlzIHRpbWUsIHRoYXQncwogICAgICAvLyB0aGUgb25seSBuZWVkIHdlIGhhdmUgZm9yIHRoZXNlIHRyYW5zZm9ybWF0aW9ucykuCiAgICAgIGlmICghYnVpbGRDb21wb25lbnQpIHsKICAgICAgICBvcHRpb25zLnRhcmdldC5wZXJmb3JtT3V0bGluZVRyYW5zZm9ybWF0aW9ucyh0cmltbWVkU3VtbWFyeUNvbXBvbmVudCk7CiAgICAgICAgb3B0aW9ucy50aWNrZXIubG9nTXMoIlRyYW5zZm9ybWVkIG91dGxpbmUiKTsKICAgICAgfQogICAgICAvLyBEb24ndCBpbmNsdWRlIHNvdXJjZSAoYnV0IGRvIGFkZCBpdCBhYm92ZSB0byBpbmNsdWRlIGltcG9ydFVyaXMpLgogICAgICBzdW1tYXJ5ID0gc2VyaWFsaXplQ29tcG9uZW50KHRyaW1tZWRTdW1tYXJ5Q29tcG9uZW50LAogICAgICAgICAgaW5jbHVkZVNvdXJjZXM6IGZhbHNlLCBpbmNsdWRlT2Zmc2V0czogaW5jbHVkZU9mZnNldHMpOwogICAgICBvcHRpb25zLnRpY2tlci5sb2dNcygiR2VuZXJhdGVkIG91dGxpbmUiKTsKICAgIH0KCiAgICBDb21wb25lbnQgY29tcG9uZW50OwogICAgaWYgKGJ1aWxkQ29tcG9uZW50KSB7CiAgICAgIGNvbXBvbmVudCA9IGF3YWl0IGtlcm5lbFRhcmdldC5idWlsZENvbXBvbmVudCh2ZXJpZnk6IG9wdGlvbnMudmVyaWZ5KTsKICAgICAgaWYgKG9wdGlvbnMuZGVidWdEdW1wKSB7CiAgICAgICAgcHJpbnRDb21wb25lbnRUZXh0KGNvbXBvbmVudCwKICAgICAgICAgICAgbGlicmFyeUZpbHRlcjoga2VybmVsVGFyZ2V0LmlzU291cmNlTGlicmFyeSk7CiAgICAgIH0KICAgICAgb3B0aW9ucy50aWNrZXIubG9nTXMoIkdlbmVyYXRlZCBjb21wb25lbnQiKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IENvbXBpbGVyUmVzdWx0KAogICAgICAgIHN1bW1hcnk6IHN1bW1hcnksCiAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQsCiAgICAgICAgZGVwczogbmV3IExpc3Q8VXJpPi5mcm9tKENvbXBpbGVyQ29udGV4dC5jdXJyZW50LmRlcGVuZGVuY2llcyksCiAgICAgICAga2VybmVsVGFyZ2V0Rm9yVGVzdGluZzogcmV0YWluRGF0YUZvclRlc3RpbmcgPyBrZXJuZWxUYXJnZXQgOiBudWxsKTsKICB9LCAoKSA9PiBzb3VyY2VMb2FkZXI/LmN1cnJlbnRVcmlGb3JDcmFzaFJlcG9ydGluZyA/PyBvcHRpb25zLmlucHV0cy5maXJzdCk7Cn0KCi8vLyBSZXN1bHQgb2JqZWN0IG9mIFtnZW5lcmF0ZUtlcm5lbF0uCmNsYXNzIENvbXBpbGVyUmVzdWx0IHsKICAvLy8gVGhlIGdlbmVyYXRlZCBzdW1tYXJ5IGJ5dGVzLCBpZiBpdCB3YXMgcmVxdWVzdGVkLgogIGZpbmFsIExpc3Q8aW50PiBzdW1tYXJ5OwoKICAvLy8gVGhlIGdlbmVyYXRlZCBjb21wb25lbnQsIGlmIGl0IHdhcyByZXF1ZXN0ZWQuCiAgZmluYWwgQ29tcG9uZW50IGNvbXBvbmVudDsKCiAgLy8vIERlcGVuZGVuY2llcyB0cmF2ZXJzZWQgYnkgdGhlIGNvbXBpbGVyLiBVc2VkIG9ubHkgZm9yIGdlbmVyYXRpbmcKICAvLy8gZGVwZW5kZW5jeSAuR04gZmlsZXMgaW4gdGhlIGRhcnQtc2RrIGJ1aWxkIHN5c3RlbS4KICAvLy8gTm90ZSB0aGlzIG1pZ2h0IGJlIHJlbW92ZWQgd2hlbiB3ZSBzd2l0Y2ggdG8gY29tcHV0ZSBkZXBlbmNlbmNpZXMgd2l0aG91dAogIC8vLyB1c2luZyB0aGUgY29tcGlsZXIgaXRzZWxmLgogIGZpbmFsIExpc3Q8VXJpPiBkZXBzOwoKICAvLy8gVGhlIFtLZXJuZWxUYXJnZXRdIHVzZWQgdG8gZ2VuZXJhdGVkIHRoZSBjb21wb25lbnQuCiAgLy8vCiAgLy8vIFRoaXMgaXMgb25seSBwcm92aWRlZCBmb3IgdXNlIGluIHRlc3RpbmcuCiAgZmluYWwgS2VybmVsVGFyZ2V0IGtlcm5lbFRhcmdldEZvclRlc3Rpbmc7CgogIENvbXBpbGVyUmVzdWx0KAogICAgICB7dGhpcy5zdW1tYXJ5LCB0aGlzLmNvbXBvbmVudCwgdGhpcy5kZXBzLCB0aGlzLmtlcm5lbFRhcmdldEZvclRlc3Rpbmd9KTsKfQqAvwBOTjwBUSkBIQFDATwBOwEzATYBPAFOAToBKAEsATcBG0RHQB8fIShDKSQoKikGAgEvHx8hHy8xHwEXN0QBFUcBMSEqJxQGATlHMEseLzQ1BgFLTRNLMTY1BgFQME4dCAFRGEsvNDUGASYBTygxIT4eGBw/MQoIHy06CAE/CUhQMCQ5LzAvSlABUUs7HU81CEs8QjEGARkaTR8mOggzBgEfGh5ITU8CAScXOBsBNB0BRzlQIRgBOgYwLQESTwIBMHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9rZXJuZWxfZ2VuZXJhdG9yX2ltcGwuZGFydDFzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc2Nhbm5lci5kYXJ0jM8vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFLm1kIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnNjYW5uZXI7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJSdW5lLCB1dGY4OwoKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ3NjYW5uZXIvYWJzdHJhY3Rfc2Nhbm5lci5kYXJ0JwogICAgc2hvdyBMYW5ndWFnZVZlcnNpb25DaGFuZ2VkLCBTY2FubmVyQ29uZmlndXJhdGlvbjsKCmltcG9ydCAnc2Nhbm5lci9zdHJpbmdfc2Nhbm5lci5kYXJ0JyBzaG93IFN0cmluZ1NjYW5uZXI7CgppbXBvcnQgJ3NjYW5uZXIvdXRmOF9ieXRlc19zY2FubmVyLmRhcnQnIHNob3cgVXRmOEJ5dGVzU2Nhbm5lcjsKCmltcG9ydCAnc2Nhbm5lci9yZWNvdmVyLmRhcnQnIHNob3cgc2Nhbm5lclJlY292ZXJ5OwoKZXhwb3J0ICdzY2FubmVyL2Fic3RyYWN0X3NjYW5uZXIuZGFydCcKICAgIHNob3cgTGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZCwgU2Nhbm5lckNvbmZpZ3VyYXRpb247CgpleHBvcnQgJ3NjYW5uZXIvdG9rZW4uZGFydCcKICAgIHNob3cKICAgICAgICBMYW5ndWFnZVZlcnNpb25Ub2tlbiwKICAgICAgICBTdHJpbmdUb2tlbiwKICAgICAgICBpc0JpbmFyeU9wZXJhdG9yLAogICAgICAgIGlzTWludXNPcGVyYXRvciwKICAgICAgICBpc1Rlcm5hcnlPcGVyYXRvciwKICAgICAgICBpc1VuYXJ5T3BlcmF0b3IsCiAgICAgICAgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I7CgpleHBvcnQgJ3NjYW5uZXIvZXJyb3JfdG9rZW4uZGFydCcKICAgIHNob3cgRXJyb3JUb2tlbiwgYnVpbGRVbmV4cGVjdGVkQ2hhcmFjdGVyVG9rZW47CgpleHBvcnQgJ3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBMYW5ndWFnZVZlcnNpb25Ub2tlbjsKCmV4cG9ydCAnc2Nhbm5lci90b2tlbl9jb25zdGFudHMuZGFydCcgc2hvdyBFT0ZfVE9LRU47CgpleHBvcnQgJ3NjYW5uZXIvdXRmOF9ieXRlc19zY2FubmVyLmRhcnQnIHNob3cgVXRmOEJ5dGVzU2Nhbm5lcjsKCmV4cG9ydCAnc2Nhbm5lci9zdHJpbmdfc2Nhbm5lci5kYXJ0JyBzaG93IFN0cmluZ1NjYW5uZXI7CgpleHBvcnQgJy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBLZXl3b3JkLCBUb2tlbjsKCmNvbnN0IGludCB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXIgPSB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJSdW5lOwoKdHlwZWRlZiBUb2tlbiBSZWNvdmVyKExpc3Q8aW50PiBieXRlcywgVG9rZW4gdG9rZW5zLCBMaXN0PGludD4gbGluZVN0YXJ0cyk7CgphYnN0cmFjdCBjbGFzcyBTY2FubmVyIHsKICAvLy8gUmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIFt0b2tlbml6ZV0uCiAgYm9vbCBnZXQgaGFzRXJyb3JzOwoKICBMaXN0PGludD4gZ2V0IGxpbmVTdGFydHM7CgogIC8vLyBDb25maWd1cmUgd2hpY2ggdG9rZW5zIGFyZSBwcm9kdWNlZC4KICBzZXQgY29uZmlndXJhdGlvbihTY2FubmVyQ29uZmlndXJhdGlvbiBjb25maWcpOwoKICBUb2tlbiB0b2tlbml6ZSgpOwp9CgpjbGFzcyBTY2FubmVyUmVzdWx0IHsKICBmaW5hbCBUb2tlbiB0b2tlbnM7CiAgZmluYWwgTGlzdDxpbnQ+IGxpbmVTdGFydHM7CiAgZmluYWwgYm9vbCBoYXNFcnJvcnM7CgogIFNjYW5uZXJSZXN1bHQodGhpcy50b2tlbnMsIHRoaXMubGluZVN0YXJ0cywgdGhpcy5oYXNFcnJvcnMpOwp9CgovLy8gU2Nhbi90b2tlbml6ZSB0aGUgZ2l2ZW4gVVRGOCBbYnl0ZXNdLgpTY2FubmVyUmVzdWx0IHNjYW4oTGlzdDxpbnQ+IGJ5dGVzLAogICAge1NjYW5uZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCiAgICBib29sIGluY2x1ZGVDb21tZW50czogZmFsc2UsCiAgICBMYW5ndWFnZVZlcnNpb25DaGFuZ2VkIGxhbmd1YWdlVmVyc2lvbkNoYW5nZWR9KSB7CiAgaWYgKGJ5dGVzLmxhc3QgIT0gMCkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIltieXRlc106IHRoZSBsYXN0IGJ5dGUgbXVzdCBiZSBudWxsLiIpOwogIH0KICBTY2FubmVyIHNjYW5uZXIgPSBuZXcgVXRmOEJ5dGVzU2Nhbm5lcihieXRlcywKICAgICAgY29uZmlndXJhdGlvbjogY29uZmlndXJhdGlvbiwKICAgICAgaW5jbHVkZUNvbW1lbnRzOiBpbmNsdWRlQ29tbWVudHMsCiAgICAgIGxhbmd1YWdlVmVyc2lvbkNoYW5nZWQ6IGxhbmd1YWdlVmVyc2lvbkNoYW5nZWQpOwogIHJldHVybiBfdG9rZW5pemVBbmRSZWNvdmVyKHNjYW5uZXIsIGJ5dGVzOiBieXRlcyk7Cn0KCi8vLyBTY2FuL3Rva2VuaXplIHRoZSBnaXZlbiBbc291cmNlXS4KU2Nhbm5lclJlc3VsdCBzY2FuU3RyaW5nKFN0cmluZyBzb3VyY2UsCiAgICB7U2Nhbm5lckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKICAgIGJvb2wgaW5jbHVkZUNvbW1lbnRzOiBmYWxzZSwKICAgIExhbmd1YWdlVmVyc2lvbkNoYW5nZWQgbGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZH0pIHsKICBhc3NlcnQoc291cmNlICE9IG51bGwsICdzb3VyY2UgbXVzdCBub3QgYmUgbnVsbCcpOwogIFN0cmluZ1NjYW5uZXIgc2Nhbm5lciA9IG5ldyBTdHJpbmdTY2FubmVyKHNvdXJjZSwKICAgICAgY29uZmlndXJhdGlvbjogY29uZmlndXJhdGlvbiwKICAgICAgaW5jbHVkZUNvbW1lbnRzOiBpbmNsdWRlQ29tbWVudHMsCiAgICAgIGxhbmd1YWdlVmVyc2lvbkNoYW5nZWQ6IGxhbmd1YWdlVmVyc2lvbkNoYW5nZWQpOwogIHJldHVybiBfdG9rZW5pemVBbmRSZWNvdmVyKHNjYW5uZXIsIHNvdXJjZTogc291cmNlKTsKfQoKU2Nhbm5lclJlc3VsdCBfdG9rZW5pemVBbmRSZWNvdmVyKFNjYW5uZXIgc2Nhbm5lciwKICAgIHtMaXN0PGludD4gYnl0ZXMsIFN0cmluZyBzb3VyY2V9KSB7CiAgVG9rZW4gdG9rZW5zID0gc2Nhbm5lci50b2tlbml6ZSgpOwogIGlmIChzY2FubmVyLmhhc0Vycm9ycykgewogICAgaWYgKGJ5dGVzID09IG51bGwpIGJ5dGVzID0gdXRmOC5lbmNvZGUoc291cmNlKTsKICAgIHRva2VucyA9IHNjYW5uZXJSZWNvdmVyeShieXRlcywgdG9rZW5zLCBzY2FubmVyLmxpbmVTdGFydHMpOwogIH0KICByZXR1cm4gbmV3IFNjYW5uZXJSZXN1bHQodG9rZW5zLCBzY2FubmVyLmxpbmVTdGFydHMsIHNjYW5uZXIuaGFzRXJyb3JzKTsKfQpsAE1OPwEXAUIBKwEnNwE5AUABNAEnNwEcCR4VGhkbGSEBIjQBNwE2AUABOQE0AUkBTAEZOhYBHAErMgEUAgEWFh4YAT8CASokKSE2GUUEMCQoNzUCASYoKSE2NTQkKDc3AgEzKCUbNEEESwIBKHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY2FubmVyLmRhcnRJc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9yZWRpcmVjdGluZ19mYWN0b3J5X2JvZHkuZGFydJiELy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEucmVkaXJlY3RpbmdfZmFjdG9yeV9ib2R5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQsCiAgICAgICAgRnVuY3Rpb25Ob2RlLAogICAgICAgIEludmFsaWRFeHByZXNzaW9uLAogICAgICAgIExldCwKICAgICAgICBNZW1iZXIsCiAgICAgICAgTnVsbExpdGVyYWwsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFN0YXRpY0dldCwKICAgICAgICBTdHJpbmdMaXRlcmFsLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBzaG93IFN1YnN0aXR1dGlvbjsKCmltcG9ydCAnYm9keV9idWlsZGVyLmRhcnQnIHNob3cgRW5zdXJlTG9hZGVkOwoKY29uc3QgU3RyaW5nIGxldE5hbWUgPSAiI3JlZGlyZWN0aW5nX2ZhY3RvcnkiOwoKY2xhc3MgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSBleHRlbmRzIEV4cHJlc3Npb25TdGF0ZW1lbnQgewogIFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkuaW50ZXJuYWwoRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAgW0xpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHNdKQogICAgICA6IHN1cGVyKG5ldyBMZXQobmV3IFZhcmlhYmxlRGVjbGFyYXRpb24obGV0TmFtZSwgaW5pdGlhbGl6ZXI6IHZhbHVlKSwKICAgICAgICAgICAgZW5jb2RlVHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKSkpOwoKICBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KE1lbWJlciB0YXJnZXQsIFtMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzXSkKICAgICAgOiB0aGlzLmludGVybmFsKG5ldyBTdGF0aWNHZXQodGFyZ2V0KSwgdHlwZUFyZ3VtZW50cyk7CgogIFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkudW5yZXNvbHZlZChTdHJpbmcgbmFtZSkKICAgICAgOiB0aGlzLmludGVybmFsKG5ldyBTdHJpbmdMaXRlcmFsKG5hbWUpKTsKCiAgTWVtYmVyIGdldCB0YXJnZXQgewogICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUoZXhwcmVzc2lvbik7CiAgICByZXR1cm4gdmFsdWUgaXMgU3RhdGljR2V0ID8gdmFsdWUudGFyZ2V0IDogbnVsbDsKICB9CgogIFN0cmluZyBnZXQgdW5yZXNvbHZlZE5hbWUgewogICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUoZXhwcmVzc2lvbik7CiAgICByZXR1cm4gdmFsdWUgaXMgU3RyaW5nTGl0ZXJhbCA/IHZhbHVlLnZhbHVlIDogbnVsbDsKICB9CgogIGJvb2wgZ2V0IGlzVW5yZXNvbHZlZCA9PiB1bnJlc29sdmVkTmFtZSAhPSBudWxsOwoKICBMaXN0PERhcnRUeXBlPiBnZXQgdHlwZUFyZ3VtZW50cyB7CiAgICBpZiAoZXhwcmVzc2lvbiBpcyBMZXQpIHsKICAgICAgTGV0IGJvZHlFeHByZXNzaW9uID0gZXhwcmVzc2lvbjsKICAgICAgaWYgKGJvZHlFeHByZXNzaW9uLnZhcmlhYmxlLm5hbWUgPT0gbGV0TmFtZSkgewogICAgICAgIHJldHVybiBkZWNvZGVUeXBlQXJndW1lbnRzKGJvZHlFeHByZXNzaW9uLmJvZHkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHN0YXRpYyBnZXRWYWx1ZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgIGlmIChleHByZXNzaW9uIGlzIExldCkgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gZXhwcmVzc2lvbi52YXJpYWJsZTsKICAgICAgaWYgKHZhcmlhYmxlLm5hbWUgPT0gbGV0TmFtZSkgewogICAgICAgIHJldHVybiB2YXJpYWJsZS5pbml0aWFsaXplcjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBzdGF0aWMgdm9pZCByZXN0b3JlRnJvbURpbGwoUHJvY2VkdXJlIGZhY3RvcnkpIHsKICAgIC8vIFRoaXMgaXMgYSBoYWNrIC8gd29yayBhcm91bmQgZm9yIHN0b3JpbmcgcmVkaXJlY3RpbmcgY29uc3RydWN0b3JzIGluCiAgICAvLyBkaWxsIGZpbGVzLiBTZWUgYENsYXNzQnVpbGRlci5hZGRSZWRpcmVjdGluZ0NvbnN0cnVjdG9yYCBpbgogICAgLy8gW2tlcm5lbF9jbGFzc19idWlsZGVyLmRhcnRdKGtlcm5lbF9jbGFzc19idWlsZGVyLmRhcnQpLgogICAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uID0gZmFjdG9yeS5mdW5jdGlvbjsKICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gZnVuY3Rpb24uYm9keTsKICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CiAgICBpZiAoc3RhdGVtZW50LmV4cHJlc3Npb24gaXMgTGV0KSB7CiAgICAgIExldCBleHByZXNzaW9uID0gc3RhdGVtZW50LmV4cHJlc3Npb247CiAgICAgIHR5cGVBcmd1bWVudHMgPSBkZWNvZGVUeXBlQXJndW1lbnRzKGV4cHJlc3Npb24uYm9keSk7CiAgICB9CiAgICBmdW5jdGlvbi5ib2R5ID0gbmV3IFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkuaW50ZXJuYWwoCiAgICAgICAgZ2V0VmFsdWUoc3RhdGVtZW50LmV4cHJlc3Npb24pLCB0eXBlQXJndW1lbnRzKQogICAgICAuLnBhcmVudCA9IGZ1bmN0aW9uOwogIH0KCiAgc3RhdGljIEV4cHJlc3Npb24gZW5jb2RlVHlwZUFyZ3VtZW50cyhMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBTdHJpbmcgdmFyTmFtZVByZWZpeCA9ICIjdHlwZUFyZyI7CiAgICBFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBJbnZhbGlkRXhwcmVzc2lvbihudWxsKTsKICAgIGlmICh0eXBlQXJndW1lbnRzID09IG51bGwpIHsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZvciAoaW50IGkgPSB0eXBlQXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHJlc3VsdCA9IG5ldyBMZXQoCiAgICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbigiJHZhck5hbWVQcmVmaXgkaSIsCiAgICAgICAgICAgICAgdHlwZTogdHlwZUFyZ3VtZW50c1tpXSwgaW5pdGlhbGl6ZXI6IG5ldyBOdWxsTGl0ZXJhbCgpKSwKICAgICAgICAgIHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIExpc3Q8RGFydFR5cGU+IGRlY29kZVR5cGVBcmd1bWVudHMoRXhwcmVzc2lvbiBlbmNvZGVkKSB7CiAgICBpZiAoZW5jb2RlZCBpcyBJbnZhbGlkRXhwcmVzc2lvbikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIExpc3Q8RGFydFR5cGU+IHJlc3VsdCA9IDxEYXJ0VHlwZT5bXTsKICAgIHdoaWxlIChlbmNvZGVkIGlzIExldCkgewogICAgICBMZXQgaGVhZCA9IGVuY29kZWQ7CiAgICAgIHJlc3VsdC5hZGQoaGVhZC52YXJpYWJsZS50eXBlKTsKICAgICAgZW5jb2RlZCA9IGhlYWQuYm9keTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9Cgpib29sIGlzUmVkaXJlY3RpbmdGYWN0b3J5KE1lbWJlciBtZW1iZXIsIHtFbnN1cmVMb2FkZWQgaGVscGVyfSkgewogIGFzc2VydChoZWxwZXIgPT0gbnVsbCB8fCBoZWxwZXIuaXNMb2FkZWQobWVtYmVyKSk7CiAgcmV0dXJuIG1lbWJlciBpcyBQcm9jZWR1cmUgJiYgbWVtYmVyLmZ1bmN0aW9uLmJvZHkgaXMgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keTsKfQoKUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSBnZXRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KE1lbWJlciBtZW1iZXIpIHsKICByZXR1cm4gaXNSZWRpcmVjdGluZ0ZhY3RvcnkobWVtYmVyKSA/IG1lbWJlci5mdW5jdGlvbi5ib2R5IDogbnVsbDsKfQoKY2xhc3MgUmVkaXJlY3Rpb25UYXJnZXQgewogIGZpbmFsIE1lbWJlciB0YXJnZXQ7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgUmVkaXJlY3Rpb25UYXJnZXQodGhpcy50YXJnZXQsIHRoaXMudHlwZUFyZ3VtZW50cyk7Cn0KClJlZGlyZWN0aW9uVGFyZ2V0IGdldFJlZGlyZWN0aW9uVGFyZ2V0KFByb2NlZHVyZSBtZW1iZXIsIEVuc3VyZUxvYWRlZCBoZWxwZXIsCiAgICB7Ym9vbCBsZWdhY3lNb2RlfSkgewogIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSA8RGFydFR5cGU+W10uLmxlbmd0aCA9CiAgICAgIG1lbWJlci5mdW5jdGlvbi50eXBlUGFyYW1ldGVycy5sZW5ndGg7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICB0eXBlQXJndW1lbnRzW2ldID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKG1lbWJlci5mdW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpXSk7CiAgfQoKICAvLyBXZSB1c2UgdGhlIFt0b3J0b2lzZSBhbmQgaGFyZSBhbGdvcml0aG1dCiAgLy8gKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N5Y2xlX2RldGVjdGlvbiNUb3J0b2lzZV9hbmRfaGFyZSkgdG8KICAvLyBoYW5kbGUgY3ljbGVzLgogIE1lbWJlciB0b3J0b2lzZSA9IG1lbWJlcjsKICBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5IHRvcnRvaXNlQm9keSA9IGdldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkodG9ydG9pc2UpOwogIE1lbWJlciBoYXJlID0gdG9ydG9pc2VCb2R5Py50YXJnZXQ7CiAgaGVscGVyLmVuc3VyZUxvYWRlZChoYXJlKTsKICBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5IGhhcmVCb2R5ID0gZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShoYXJlKTsKICB3aGlsZSAodG9ydG9pc2UgIT0gaGFyZSkgewogICAgaWYgKHRvcnRvaXNlQm9keT8uaXNVbnJlc29sdmVkID8/IHRydWUpIHsKICAgICAgcmV0dXJuIG5ldyBSZWRpcmVjdGlvblRhcmdldCh0b3J0b2lzZSwgdHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgICBNZW1iZXIgbmV4dFRvcnRvaXNlID0gdG9ydG9pc2VCb2R5LnRhcmdldDsKICAgIGhlbHBlci5lbnN1cmVMb2FkZWQobmV4dFRvcnRvaXNlKTsKICAgIExpc3Q8RGFydFR5cGU+IG5leHRUeXBlQXJndW1lbnRzID0gdG9ydG9pc2VCb2R5LnR5cGVBcmd1bWVudHM7CiAgICBpZiAoIWxlZ2FjeU1vZGUgJiYgbmV4dFR5cGVBcmd1bWVudHMgPT0gbnVsbCkgewogICAgICBuZXh0VHlwZUFyZ3VtZW50cyA9IDxEYXJ0VHlwZT5bXTsKICAgIH0KCiAgICBpZiAoIWxlZ2FjeU1vZGUgfHwgbmV4dFR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBTdWJzdGl0dXRpb24gc3ViID0gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgIHRvcnRvaXNlLmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLCB0eXBlQXJndW1lbnRzKTsKICAgICAgdHlwZUFyZ3VtZW50cyA9IDxEYXJ0VHlwZT5bXS4ubGVuZ3RoID0gbmV4dFR5cGVBcmd1bWVudHMubGVuZ3RoOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0eXBlQXJndW1lbnRzW2ldID0gc3ViLnN1YnN0aXR1dGVUeXBlKG5leHRUeXBlQXJndW1lbnRzW2ldKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gSW4gRGFydCAxLCB3ZSBuZWVkIHRvIHRocm93IGF3YXkgdGhlIGV4dHJhIHR5cGUgYXJndW1lbnRzIGFuZCB1c2UKICAgICAgLy8gYGR5bmFtaWNgIGluIHBsYWNlIG9mIHRoZSBtaXNzaW5nIG9uZXMuCiAgICAgIGludCB0eXBlQXJndW1lbnRDb3VudCA9IHR5cGVBcmd1bWVudHMubGVuZ3RoOwogICAgICBpbnQgbmV4dFR5cGVBcmd1bWVudENvdW50ID0KICAgICAgICAgIG5leHRUb3J0b2lzZS5lbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycy5sZW5ndGg7CiAgICAgIHR5cGVBcmd1bWVudHMubGVuZ3RoID0gbmV4dFR5cGVBcmd1bWVudENvdW50OwogICAgICBmb3IgKGludCBpID0gdHlwZUFyZ3VtZW50Q291bnQ7IGkgPCBuZXh0VHlwZUFyZ3VtZW50Q291bnQ7IGkrKykgewogICAgICAgIHR5cGVBcmd1bWVudHNbaV0gPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICB9CiAgICB9CgogICAgdG9ydG9pc2UgPSBuZXh0VG9ydG9pc2U7CiAgICB0b3J0b2lzZUJvZHkgPSBnZXRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KHRvcnRvaXNlKTsKICAgIGhlbHBlci5lbnN1cmVMb2FkZWQoaGFyZUJvZHk/LnRhcmdldCk7CiAgICBoYXJlID0gZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShoYXJlQm9keT8udGFyZ2V0KT8udGFyZ2V0OwogICAgaGVscGVyLmVuc3VyZUxvYWRlZChoYXJlKTsKICAgIGhhcmVCb2R5ID0gZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShoYXJlKTsKICB9CiAgcmV0dXJuIG51bGw7Cn0KgL8ATk48ASgBIQkSFRQdFhsNEBUTExcbHQE9AS4BLwE7NCZMMgFIPQExMAEWJjUEAR4mOAQBMwElHSc1OQgGEQQBKx06JiUIBhEEATNMQz8uMyInLTwGOTcbBAFIJzUhFQY6GDZHEwYTBAFCKBMGKh0aJhsGEwQCAUI1UAIBQkUCARoXJgE2AgFOGTgtM1EEAS5KFBxNJh1FHS49Bi8nQzQoBgE0MTxHN0UIDUsxNCI9NEgwCAYBHTgrQB8wBA8CAUBwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3JlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keS5kYXJ0P3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9hcGlfdW5zdGFibGUvY29tcGlsZXJfc3RhdGUuZGFydIYeLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9jb21waWxlcl9vcHRpb25zLmRhcnQnIHNob3cgQ29tcGlsZXJPcHRpb25zOwoKaW1wb3J0ICcuLi9iYXNlL3Byb2Nlc3NlZF9vcHRpb25zLmRhcnQnIHNob3cgUHJvY2Vzc2VkT3B0aW9uczsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2luY3JlbWVudGFsX2NvbXBpbGVyLmRhcnQnCiAgICBzaG93IEluY3JlbWVudGFsQ29tcGlsZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JyBzaG93IENvbXBvbmVudDsKCmNsYXNzIEluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSB7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnM7CiAgZmluYWwgUHJvY2Vzc2VkT3B0aW9ucyBwcm9jZXNzZWRPcHRzOwogIGZpbmFsIE1hcDxVcmksIFdvcmtlcklucHV0Q29tcG9uZW50PiB3b3JrZXJJbnB1dENhY2hlOwogIGZpbmFsIEluY3JlbWVudGFsQ29tcGlsZXIgaW5jcmVtZW50YWxDb21waWxlcjsKCiAgSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlKHRoaXMub3B0aW9ucywgdGhpcy5wcm9jZXNzZWRPcHRzLAogICAgICB7dGhpcy53b3JrZXJJbnB1dENhY2hlLCB0aGlzLmluY3JlbWVudGFsQ29tcGlsZXJ9KTsKfQoKLy8vIEEgY2FjaGVkIFtDb21wb25lbnRdIGZvciBhIHN1bW1hcnkgaW5wdXQgZmlsZS4KLy8vCi8vLyBUcmFja3MgdGhlIG9yaWdpbmFsbHkgbWFya2VkICJleHRlcm5hbCIgbGlicyBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlc3RvcmVkLAovLy8gc2luY2UgdGhlIGtlcm5lbCBnZW5lcmF0b3IgbXV0YXRlcyB0aGUgc3RhdGUuCmNsYXNzIFdvcmtlcklucHV0Q29tcG9uZW50IHsKICBmaW5hbCBMaXN0PGludD4gZGlnZXN0OwogIGZpbmFsIENvbXBvbmVudCBjb21wb25lbnQ7CiAgZmluYWwgU2V0PFVyaT4gZXh0ZXJuYWxMaWJzOwogIFdvcmtlcklucHV0Q29tcG9uZW50KHRoaXMuZGlnZXN0LCB0aGlzLmNvbXBvbmVudCkKICAgICAgOiBleHRlcm5hbExpYnMgPSBjb21wb25lbnQubGlicmFyaWVzCiAgICAgICAgICAgIC53aGVyZSgobGliKSA9PiBsaWIuaXNFeHRlcm5hbCkKICAgICAgICAgICAgLm1hcCgobGliKSA9PiBsaWIuaW1wb3J0VXJpKQogICAgICAgICAgICAudG9TZXQoKTsKfQoKYm9vbCBkaWdlc3RzRXF1YWwoTGlzdDxpbnQ+IGEsIExpc3Q8aW50PiBiKSB7CiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTsKICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTsKICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKICAgIGlmIChhW2ldICE9IGJbaV0pIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIHRydWU7Cn0KMABOTjwBRgE/AT8eATQBISEoOTEBPToCATMETzIdGh0fNCssKRYCAS4sKickBA8CATZwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2NvbXBpbGVyX3N0YXRlLmRhcnQ1c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2FwaV91bnN0YWJsZS91dGlsLmRhcnSC+C8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpib29sIGVxdWFsTGlzdHM8VD4oTGlzdDxUPiBhLCBMaXN0PFQ+IGIpIHsKICBpZiAoaWRlbnRpY2FsKGEsIGIpKSByZXR1cm4gdHJ1ZTsKICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSkgewogICAgaWYgKGFbaV0gIT0gYltpXSkgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfQoKYm9vbCBlcXVhbE1hcHM8SywgVj4oTWFwPEssIFY+IGEsIE1hcDxLLCBWPiBiKSB7CiAgaWYgKGlkZW50aWNhbChhLCBiKSkgcmV0dXJuIHRydWU7CiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTsKICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTsKICBmb3IgKEsga2V5IGluIGEua2V5cykgewogICAgaWYgKCFiLmNvbnRhaW5zS2V5KGtleSkgfHwgYVtrZXldICE9IGJba2V5XSkgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfQoZAE5OPAErJCwqJyQEDwIBMSQsKho/BA8CASxwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL3V0aWwuZGFydEJzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Byb3RvdHlwZS9rZXJuZWxfZ2VuZXJhdG9yLmRhcnSPSi8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gRGVmaW5lcyB0aGUgZnJvbnQtZW5kIEFQSSBmb3IgY29udmVydGluZyBzb3VyY2UgY29kZSB0byBEYXJ0IEtlcm5lbCBvYmplY3RzLgpsaWJyYXJ5IGZyb250X2VuZC5rZXJuZWxfZ2VuZXJhdG9yOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwva2VybmVsLmRhcnQnIHNob3cgQ29tcG9uZW50OwoKaW1wb3J0ICcuLi9iYXNlL3Byb2Nlc3NlZF9vcHRpb25zLmRhcnQnIHNob3cgUHJvY2Vzc2VkT3B0aW9uczsKCmltcG9ydCAnLi4vZmFzdGEvY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnLi4vZmFzdGEvZmFzdGFfY29kZXMuZGFydCcgc2hvdyBtZXNzYWdlTWlzc2luZ01haW4sIG5vTGVuZ3RoOwoKaW1wb3J0ICcuLi9mYXN0YS9zZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKaW1wb3J0ICcuLi9rZXJuZWxfZ2VuZXJhdG9yX2ltcGwuZGFydCcKICAgIHNob3cgQ29tcGlsZXJSZXN1bHQsIGdlbmVyYXRlS2VybmVsLCBnZW5lcmF0ZUtlcm5lbEludGVybmFsOwoKaW1wb3J0ICdjb21waWxlcl9vcHRpb25zLmRhcnQnIHNob3cgQ29tcGlsZXJPcHRpb25zOwoKLy8vIEdlbmVyYXRlcyBhIGtlcm5lbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvZ3JhbSB3aG9zZSBtYWluIGxpYnJhcnkgaXMgaW4KLy8vIHRoZSBnaXZlbiBbc291cmNlXS4KLy8vCi8vLyBJbnRlbmRlZCBmb3Igd2hvbGUtcHJvZ3JhbSAobm9uLW1vZHVsYXIpIGNvbXBpbGF0aW9uLgovLy8KLy8vIEdpdmVuIHRoZSBVcmkgb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBwcm9ncmFtJ3MgYG1haW5gIG1ldGhvZCwgdGhpcyBmdW5jdGlvbgovLy8gZm9sbG93cyBgaW1wb3J0YCwgYGV4cG9ydGAsIGFuZCBgcGFydGAgZGVjbGFyYXRpb25zIHRvIGRpc2NvdmVyIHRoZSB3aG9sZQovLy8gcHJvZ3JhbSwgYW5kIGNvbnZlcnRzIHRoZSByZXN1bHQgdG8gRGFydCBLZXJuZWwgZm9ybWF0LgovLy8KLy8vIElmIGBjb21waWxlU2RrYCBpbiBbb3B0aW9uc10gaXMgdHJ1ZSwgdGhlIGdlbmVyYXRlZCBjb21wb25lbnQgd2lsbCBpbmNsdWRlCi8vLyBjb2RlIGZvciB0aGUgU0RLLgovLy8KLy8vIElmIHN1bW1hcmllcyBhcmUgcHJvdmlkZWQgaW4gW29wdGlvbnNdLCB0aGUgY29tcGlsZXIgd2lsbCB1c2UgdGhlbSBpbnN0ZWFkCi8vLyBvZiBjb21waWxpbmcgdGhlIGxpYnJhcmllcyBjb250YWluZWQgaW4gdGhvc2Ugc3VtbWFyaWVzLiBUaGlzIGlzIHVzZWZ1bCwgZm9yCi8vLyBleGFtcGxlLCB3aGVuIGNvbXBpbGluZyBmb3IgcGxhdGZvcm1zIHRoYXQgYWxyZWFkeSBlbWJlZCB0aG9zZSBzb3VyY2VzIChsaWtlCi8vLyB0aGUgc2RrIGluIHRoZSBzdGFuZGFsb25lIFZNKS4KLy8vCi8vLyBUaGUgaW5wdXQgW3NvdXJjZV0gaXMgZXhwZWN0ZWQgdG8gYmUgYSBzY3JpcHQgd2l0aCBhIG1haW4gbWV0aG9kLCBvdGhlcndpc2UKLy8vIGFuIGVycm9yIGlzIHJlcG9ydGVkLgovLyBUT0RPKHNpZ211bmQpOiByZW5hbWUgdG8ga2VybmVsRm9yU2NyaXB0PwpGdXR1cmU8Q29tcG9uZW50PiBrZXJuZWxGb3JQcm9ncmFtKFVyaSBzb3VyY2UsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zKSBhc3luYyB7CiAgcmV0dXJuIChhd2FpdCBrZXJuZWxGb3JQcm9ncmFtSW50ZXJuYWwoc291cmNlLCBvcHRpb25zKSk/LmNvbXBvbmVudDsKfQoKRnV0dXJlPENvbXBpbGVyUmVzdWx0PiBrZXJuZWxGb3JQcm9ncmFtSW50ZXJuYWwoCiAgICBVcmkgc291cmNlLCBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgIHtib29sIHJldGFpbkRhdGFGb3JUZXN0aW5nOiBmYWxzZX0pIGFzeW5jIHsKICB2YXIgcE9wdGlvbnMgPSBuZXcgUHJvY2Vzc2VkT3B0aW9ucyhvcHRpb25zOiBvcHRpb25zLCBpbnB1dHM6IFtzb3VyY2VdKTsKICByZXR1cm4gYXdhaXQgQ29tcGlsZXJDb250ZXh0LnJ1bldpdGhPcHRpb25zKHBPcHRpb25zLCAoY29udGV4dCkgYXN5bmMgewogICAgQ29tcGlsZXJSZXN1bHQgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVLZXJuZWxJbnRlcm5hbCgKICAgICAgICByZXRhaW5EYXRhRm9yVGVzdGluZzogcmV0YWluRGF0YUZvclRlc3RpbmcpOwogICAgdmFyIGNvbXBvbmVudCA9IHJlc3VsdD8uY29tcG9uZW50OwogICAgaWYgKGNvbXBvbmVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgICBpZiAoY29tcG9uZW50Lm1haW5NZXRob2QgPT0gbnVsbCkgewogICAgICBjb250ZXh0Lm9wdGlvbnMucmVwb3J0KAogICAgICAgICAgbWVzc2FnZU1pc3NpbmdNYWluLndpdGhMb2NhdGlvbihzb3VyY2UsIC0xLCBub0xlbmd0aCksCiAgICAgICAgICBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9KTsKfQoKLy8vIEdlbmVyYXRlcyBhIGtlcm5lbCByZXByZXNlbnRhdGlvbiBmb3IgYSBidWlsZCB1bml0IGNvbnRhaW5pbmcgW3NvdXJjZXNdLgovLy8KLy8vIEEgYnVpbGQgdW5pdCBpcyBhIGNvbGxlY3Rpb24gb2YgbGlicmFyaWVzIHRoYXQgYXJlIGNvbXBpbGVkIHRvZ2V0aGVyLgovLy8gTGlicmFyaWVzIGluIHRoZSBidWlsZCB1bml0IG1heSBkZXBlbmQgb24gZWFjaCBvdGhlciBhbmQgbWF5IGhhdmUKLy8vIGRlcGVuZGVuY2llcyB0byBsaWJyYXJpZXMgaW4gb3RoZXIgYnVpbGQgdW5pdHMuIFVubGlua2UgbGlicmFyeQovLy8gZGVwZW5kZW5jaWVzLCBidWlsZCB1bml0IGRlcGVuZGVuY2llcyBtdXN0IGJlIGFjeWNsaWMuCi8vLwovLy8gVGhpcyBBUEkgaXMgaW50ZW5kZWQgZm9yIG1vZHVsYXIgY29tcGlsYXRpb24uIERlcGVuZGVuY2llcyB0byBvdGhlciBidWlsZAovLy8gdW5pdHMgYXJlIHNwZWNpZmllZCB1c2luZyBbQ29tcGlsZXJPcHRpb25zLmlucHV0U3VtbWFyaWVzXS4gIEFueSBkZXBlbmRlbmN5Ci8vLyBvZiBbc291cmNlc10gdGhhdCBpcyBub3QgbGlzdGVkIGluIFtDb21waWxlck9wdGlvbnMuaW5wdXRTdW1tYXJpZXNdIGFuZAovLy8gW0NvbXBpbGVyT3B0aW9ucy5zZGtTdW1tYXJ5XSBpcyB0cmVhdGVkIGFzIGFuIGFkZGl0aW9uYWwgc291cmNlIGZpbGUgZm9yIHRoZQovLy8gYnVpbGQgdW5pdC4KLy8vCi8vLyBBbnkgYHBhcnRgIGRlY2xhcmF0aW9ucyBmb3VuZCBpbiBbc291cmNlc10gbXVzdCByZWZlciB0byBwYXJ0IGZpbGVzIHdoaWNoCi8vLyBhcmUgYWxzbyBsaXN0ZWQgaW4gdGhlIGJ1aWxkIHVuaXQgc291cmNlcywgb3RoZXJ3aXNlIGFuIGVycm9yIHJlc3VsdHMuICAoSXQKLy8vIGlzIG5vdCBwZXJtaXR0ZWQgdG8gcmVmZXIgdG8gYSBwYXJ0IGZpbGUgZGVjbGFyZWQgaW4gYW5vdGhlciBidWlsZCB1bml0KS4KLy8vCi8vLyBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgW0NvbXBvbmVudF0gb2JqZWN0IHdpdGggbm8gbWFpbiBtZXRob2Qgc2V0LiBUaGUKLy8vIFtDb21wb25lbnRdIGluY2x1ZGVzIGV4dGVybmFsIGxpYnJhcmllcyBmb3IgdGhvc2UgbGlicmFyaWVzIGxvYWRlZCB0aHJvdWdoCi8vLyBzdW1tYXJpZXMuCkZ1dHVyZTxDb21wb25lbnQ+IGtlcm5lbEZvckNvbXBvbmVudCgKICAgIExpc3Q8VXJpPiBzb3VyY2VzLCBDb21waWxlck9wdGlvbnMgb3B0aW9ucykgYXN5bmMgewogIHJldHVybiAoYXdhaXQgZ2VuZXJhdGVLZXJuZWwoCiAgICAgICAgICBuZXcgUHJvY2Vzc2VkT3B0aW9ucyhvcHRpb25zOiBvcHRpb25zLCBpbnB1dHM6IHNvdXJjZXMpKSkKICAgICAgPy5jb21wb25lbnQ7Cn0KYABOTjwBUSQBIQE0AT8BPgFGAS8BJ0EBNQFOGAQ6BFBOPARPFgRPUVEjBFAaLVBHAgExKTBLSjo1JygBKB5BGxMGEwYCAU0ESkZEOwROUExREAROUE4ESk8PJjggRBMCATlwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9rZXJuZWxfZ2VuZXJhdG9yLmRhcnRGc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2FwaV9wcm90b3R5cGUvc3RhbmRhcmRfZmlsZV9zeXN0ZW0uZGFydI0XLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZnJvbnRfZW5kLnN0YW5kYXJkX2ZpbGVfc3lzdGVtOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAnZmlsZV9zeXN0ZW0uZGFydCc7CgppbXBvcnQgJy4uL2Zhc3RhL2NvbXBpbGVyX2NvbnRleHQuZGFydCcgc2hvdyBDb21waWxlckNvbnRleHQ7CgovLy8gQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgW0ZpbGVTeXN0ZW1dIGhhbmRsaW5nIHN0YW5kYXJkIFVSSSBzY2hlbWVzLgovLy8KLy8vIGZpbGU6IFVSSXMgYXJlIGhhbmRsZWQgdXNpbmcgZmlsZSBJL08uCi8vLyBkYXRhOiBVUklzIHJldHVybiB0aGVpciBkYXRhIGNvbnRlbnRzLgovLy8KLy8vIE5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBjbGllbnRzLgpjbGFzcyBTdGFuZGFyZEZpbGVTeXN0ZW0gaW1wbGVtZW50cyBGaWxlU3lzdGVtIHsKICBzdGF0aWMgZmluYWwgU3RhbmRhcmRGaWxlU3lzdGVtIGluc3RhbmNlID0gbmV3IFN0YW5kYXJkRmlsZVN5c3RlbS5fKCk7CgogIFN0YW5kYXJkRmlsZVN5c3RlbS5fKCk7CgogIEBvdmVycmlkZQogIEZpbGVTeXN0ZW1FbnRpdHkgZW50aXR5Rm9yVXJpKFVyaSB1cmkpIHsKICAgIGlmICh1cmkuc2NoZW1lID09ICdmaWxlJyB8fCB1cmkuc2NoZW1lID09ICcnKSB7CiAgICAgIC8vIFRPRE8oYXNrZXNjKTogRW1wdHkgc2NoZW1lcyBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQgZWxzZXdoZXJlLgogICAgICByZXR1cm4gbmV3IF9Jb0ZpbGVTeXN0ZW1FbnRpdHkoVXJpLmJhc2UucmVzb2x2ZVVyaSh1cmkpKTsKICAgIH0gZWxzZSBpZiAodXJpLnNjaGVtZSA9PSAnZGF0YScpIHsKICAgICAgcmV0dXJuIG5ldyBEYXRhRmlsZVN5c3RlbUVudGl0eShVcmkuYmFzZS5yZXNvbHZlVXJpKHVyaSkpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oCiAgICAgICAgICB1cmksICdTdGFuZGFyZEZpbGVTeXN0ZW0gb25seSBzdXBwb3J0cyBmaWxlOiogYW5kIGRhdGE6KiBVUklzJyk7CiAgICB9CiAgfQp9CgovLy8gQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgW0ZpbGVTeXN0ZW1FbnRpdHldIGZvciBmaWxlOiBVUklzLgpjbGFzcyBfSW9GaWxlU3lzdGVtRW50aXR5IGltcGxlbWVudHMgRmlsZVN5c3RlbUVudGl0eSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgVXJpIHVyaTsKCiAgX0lvRmlsZVN5c3RlbUVudGl0eSh0aGlzLnVyaSk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gdXJpLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgX0lvRmlsZVN5c3RlbUVudGl0eSAmJiBvdGhlci51cmkgPT0gdXJpOwoKICBAb3ZlcnJpZGUKICBGdXR1cmU8Ym9vbD4gZXhpc3RzKCkgYXN5bmMgewogICAgaWYgKGF3YWl0IGlvLkZpbGVTeXN0ZW1FbnRpdHkuaXNEaXJlY3RvcnkodXJpLnRvRmlsZVBhdGgoKSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IGlvLkZpbGUuZnJvbVVyaSh1cmkpLmV4aXN0cygpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPExpc3Q8aW50Pj4gcmVhZEFzQnl0ZXMoKSBhc3luYyB7CiAgICB0cnkgewogICAgICBDb21waWxlckNvbnRleHQucmVjb3JkRGVwZW5kZW5jeSh1cmkpOwogICAgICByZXR1cm4gbmV3IGlvLkZpbGUuZnJvbVVyaSh1cmkpLnJlYWRBc0J5dGVzU3luYygpOwogICAgfSBvbiBpby5GaWxlU3lzdGVtRXhjZXB0aW9uIGNhdGNoIChleGNlcHRpb24pIHsKICAgICAgdGhyb3cgX3RvRmlsZVN5c3RlbUV4Y2VwdGlvbihleGNlcHRpb24pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPFN0cmluZz4gcmVhZEFzU3RyaW5nKCkgYXN5bmMgewogICAgdHJ5IHsKICAgICAgQ29tcGlsZXJDb250ZXh0LnJlY29yZERlcGVuZGVuY3kodXJpKTsKICAgICAgcmV0dXJuIGF3YWl0IG5ldyBpby5GaWxlLmZyb21VcmkodXJpKS5yZWFkQXNTdHJpbmcoKTsKICAgIH0gb24gaW8uRmlsZVN5c3RlbUV4Y2VwdGlvbiBjYXRjaCAoZXhjZXB0aW9uKSB7CiAgICAgIHRocm93IF90b0ZpbGVTeXN0ZW1FeGNlcHRpb24oZXhjZXB0aW9uKTsKICAgIH0KICB9CgogIC8qKgogICAqIFJldHVybiB0aGUgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGZvciB0aGUgZ2l2ZW4gSS9PIGV4Y2VwdGlvbi4KICAgKi8KICBGaWxlU3lzdGVtRXhjZXB0aW9uIF90b0ZpbGVTeXN0ZW1FeGNlcHRpb24oaW8uRmlsZVN5c3RlbUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKICAgIFN0cmluZyBtZXNzYWdlID0gZXhjZXB0aW9uLm1lc3NhZ2U7CiAgICBTdHJpbmcgb3NNZXNzYWdlID0gZXhjZXB0aW9uLm9zRXJyb3I/Lm1lc3NhZ2U7CiAgICBpZiAob3NNZXNzYWdlICE9IG51bGwgJiYgb3NNZXNzYWdlLmlzTm90RW1wdHkpIHsKICAgICAgbWVzc2FnZSA9IG9zTWVzc2FnZTsKICAgIH0KICAgIHJldHVybiBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbih1cmksIG1lc3NhZ2UpOwogIH0KfQoKLy8vIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFtGaWxlU3lzdGVtRW50aXR5XSBmb3IgZGF0YTogVVJJcy4KY2xhc3MgRGF0YUZpbGVTeXN0ZW1FbnRpdHkgaW1wbGVtZW50cyBGaWxlU3lzdGVtRW50aXR5IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBVcmkgdXJpOwoKICBEYXRhRmlsZVN5c3RlbUVudGl0eSh0aGlzLnVyaSk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gdXJpLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgRGF0YUZpbGVTeXN0ZW1FbnRpdHkgJiYgb3RoZXIudXJpID09IHVyaTsKCiAgQG92ZXJyaWRlCiAgRnV0dXJlPGJvb2w+IGV4aXN0cygpIGFzeW5jIHsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPExpc3Q8aW50Pj4gcmVhZEFzQnl0ZXMoKSBhc3luYyB7CiAgICByZXR1cm4gdXJpLmRhdGEuY29udGVudEFzQnl0ZXMoKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxTdHJpbmc+IHJlYWRBc1N0cmluZygpIGFzeW5jIHsKICAgIHJldHVybiB1cmkuZGF0YS5jb250ZW50QXNTdHJpbmcoKTsKICB9Cn0KfQBOTjwBKAEVGAEbAT4BSwQrKwQ7MUkBGgEMKzRJQCdBDSVLBgQCAUI4DBEBIQEMJAEMJDgBDCBDEw0wBgQBDCoKLTk0LwYEAQwoCi08NC8GBAEGQwZRKDM1GwYyBAIBQjkMEQEiAQwkAQwkOQEMIBEEAQwqJgQBDCgnBAIBPXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL3N0YW5kYXJkX2ZpbGVfc3lzdGVtLmRhcnRGc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2NvbXB1dGVfcGxhdGZvcm1fYmluYXJpZXNfbG9jYXRpb24uZGFydIzSLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAiZGFydDppbyIgc2hvdyBGaWxlLCBQbGF0Zm9ybTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgU291cmNlOwoKaW1wb3J0ICdiYXNlL3Byb2Nlc3NlZF9vcHRpb25zLmRhcnQnIHNob3cgUHJvY2Vzc2VkT3B0aW9uczsKCmltcG9ydCAnZmFzdGEvY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCi8vLyBDb21wdXRlcyB0aGUgbG9jYXRpb24gb2YgcGxhdGZvcm0gYmluYXJpZXMsIHRoYXQgaXMsIGNvbXBpbGVkIGAuZGlsbGAgZmlsZXMKLy8vIG9mIHRoZSBwbGF0Zm9ybSBsaWJyYXJpZXMgdGhhdCBhcmUgdXNlZCB0byBhdm9pZCByZWNvbXBpbGluZyB0aG9zZQovLy8gbGlicmFyaWVzLgpVcmkgY29tcHV0ZVBsYXRmb3JtQmluYXJpZXNMb2NhdGlvbih7Ym9vbCBmb3JjZUJ1aWxkRGlyOiBmYWxzZX0pIHsKICAvLyBUaGUgZGlyZWN0b3J5IG9mIHRoZSBEYXJ0IFZNIGV4ZWN1dGFibGUuCiAgVXJpIHZtRGlyZWN0b3J5ID0gVXJpLmJhc2UKICAgICAgLnJlc29sdmVVcmkobmV3IFVyaS5maWxlKFBsYXRmb3JtLnJlc29sdmVkRXhlY3V0YWJsZSkpCiAgICAgIC5yZXNvbHZlKCIuIik7CiAgaWYgKHZtRGlyZWN0b3J5LnBhdGguZW5kc1dpdGgoIi9iaW4vIikpIHsKICAgIC8vIExvb2tzIGxpa2UgdGhlIFZNIGlzIGluIGEgYC9iaW4vYCBkaXJlY3RvcnksIHNvIHRoaXMgaXMgcnVubmluZyBmcm9tIGEKICAgIC8vIGJ1aWx0IFNESy4KICAgIHJldHVybiB2bURpcmVjdG9yeS5yZXNvbHZlKGZvcmNlQnVpbGREaXIgPyAiLi4vLi4vIiA6ICIuLi9saWIvX2ludGVybmFsLyIpOwogIH0gZWxzZSB7CiAgICAvLyBXZSBhc3N1bWUgdGhpcyBpcyBydW5uaW5nIGZyb20gYSBidWlsZCBkaXJlY3RvcnkgKGZvciBleGFtcGxlLAogICAgLy8gYG91dC9SZWxlYXNlWDY0YCBvciBgeGNvZGVidWlsZC9SZWxlYXNlWDY0YCkuCiAgICByZXR1cm4gdm1EaXJlY3Rvcnk7CiAgfQp9CgovLy8gVHJhbnNsYXRlcyBhbiBTREsgVVJJICgib3JnLWRhcnRsYW5nLXNkazovLy8uLi4iKSB0byBhIGZpbGUgVVJJLgpVcmkgdHJhbnNsYXRlU2RrKFVyaSB1cmkpIHsKICBpZiAoQ29tcGlsZXJDb250ZXh0LmlzQWN0aXZlKSB7CiAgICBpZiAodXJpLnNjaGVtZSA9PSAib3JnLWRhcnRsYW5nLXNkayIpIHsKICAgICAgU3RyaW5nIHBhdGggPSB1cmkucGF0aDsKICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiL3Nkay8iKSkgewogICAgICAgIENvbXBpbGVyQ29udGV4dCBjb250ZXh0ID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQ7CiAgICAgICAgVXJpIHNka1Jvb3QgPSBjb250ZXh0LmNhY2hlZFNka1Jvb3Q7CiAgICAgICAgaWYgKHNka1Jvb3QgPT0gbnVsbCkgewogICAgICAgICAgUHJvY2Vzc2VkT3B0aW9ucyBvcHRpb25zID0gY29udGV4dC5vcHRpb25zOwogICAgICAgICAgc2RrUm9vdCA9IG9wdGlvbnMuc2RrUm9vdDsKICAgICAgICAgIGlmIChzZGtSb290ID09IG51bGwpIHsKICAgICAgICAgICAgc2RrUm9vdCA9IG9wdGlvbnMubGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaT8ucmVzb2x2ZSgiLi4vIik7CiAgICAgICAgICAgIGlmIChzZGtSb290ICE9IG51bGwpIHsKICAgICAgICAgICAgICBpZiAoIWlzRXhpc3RpbmdGaWxlKHNka1Jvb3QucmVzb2x2ZSgibGliL2xpYnJhcmllcy5qc29uIikpKSB7CiAgICAgICAgICAgICAgICBzZGtSb290ID0gbnVsbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChzZGtSb290ID09IG51bGwpIHsKICAgICAgICAgICAgc2RrUm9vdCA9IChvcHRpb25zLnNka1N1bW1hcnkgPz8gY29tcHV0ZVBsYXRmb3JtQmluYXJpZXNMb2NhdGlvbigpKQogICAgICAgICAgICAgICAgLnJlc29sdmUoIi4uLy4uLyIpOwogICAgICAgICAgICBpZiAoc2RrUm9vdCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgaWYgKCFpc0V4aXN0aW5nRmlsZShzZGtSb290LnJlc29sdmUoImxpYi9saWJyYXJpZXMuanNvbiIpKSkgewogICAgICAgICAgICAgICAgaWYgKGlzRXhpc3RpbmdGaWxlKHNka1Jvb3QucmVzb2x2ZSgic2RrL2xpYi9saWJyYXJpZXMuanNvbiIpKSkgewogICAgICAgICAgICAgICAgICBzZGtSb290ID0gc2RrUm9vdC5yZXNvbHZlKCJzZGsvIik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZGtSb290ID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHNka1Jvb3QgPz89IFVyaS5wYXJzZSgib3JnLWRhcnRsYW5nLXNkazovLy9zZGsvIik7CiAgICAgICAgICBjb250ZXh0LmNhY2hlZFNka1Jvb3QgPSBzZGtSb290OwogICAgICAgIH0KICAgICAgICBVcmkgY2FuZGlkYXRlID0gc2RrUm9vdC5yZXNvbHZlKHBhdGguc3Vic3RyaW5nKDUpKTsKICAgICAgICBpZiAoaXNFeGlzdGluZ0ZpbGUoY2FuZGlkYXRlKSkgewogICAgICAgICAgTWFwPFVyaSwgU291cmNlPiB1cmlUb1NvdXJjZSA9IENvbXBpbGVyQ29udGV4dC5jdXJyZW50LnVyaVRvU291cmNlOwogICAgICAgICAgU291cmNlIHNvdXJjZSA9IHVyaVRvU291cmNlW3VyaV07CiAgICAgICAgICBpZiAoc291cmNlLnNvdXJjZS5pc0VtcHR5KSB7CiAgICAgICAgICAgIHVyaVRvU291cmNlW3VyaV0gPSBuZXcgU291cmNlKAogICAgICAgICAgICAgICAgc291cmNlLmxpbmVTdGFydHMsCiAgICAgICAgICAgICAgICBuZXcgRmlsZS5mcm9tVXJpKGNhbmRpZGF0ZSkucmVhZEFzQnl0ZXNTeW5jKCksCiAgICAgICAgICAgICAgICBzb3VyY2UuaW1wb3J0VXJpLAogICAgICAgICAgICAgICAgc291cmNlLmZpbGVVcmkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2FuZGlkYXRlOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiB1cmk7Cn0KCmJvb2wgaXNFeGlzdGluZ0ZpbGUoVXJpIHVyaSkgewogIGlmICh1cmkuc2NoZW1lID09ICJmaWxlIikgewogICAgcmV0dXJuIG5ldyBGaWxlLmZyb21VcmkodXJpKS5leGlzdHNTeW5jKCk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KXgBOTjwBJgEuATwBOwFQRw9DLh09FSxOElALRjUYBAIBRRwiLB4mOy0fNiUhSSNMIBAODCFQJCNMUTUZIhIQDgw9Kwo8KU4sJysjPyIhDAoaCAYEDgIBHx4vCxIEAgE9cGFja2FnZTpmcm9udF9lbmQvc3JjL2NvbXB1dGVfcGxhdGZvcm1fYmluYXJpZXNfbG9jYXRpb24uZGFydDJzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvb3BlcmF0b3IuZGFydI7nLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEub3BlcmF0b3JzOwoKLy8vIFRoZSB1c2VyLWRlZmluYWJsZSBvcGVyYXRvcnMgaW4gRGFydC4KLy8vCi8vLyBUaGUgbmFtZXMgaGF2ZSBiZWVuIGNob3NlbiB0byByZXByZXNlbnQgdGhlaXIgbm9ybWFsIHNlbWFudGljIG1lYW5pbmcuCmVudW0gT3BlcmF0b3IgewogIGFkZCwKICBiaXR3aXNlQW5kLAogIGJpdHdpc2VOb3QsCiAgYml0d2lzZU9yLAogIGJpdHdpc2VYb3IsCiAgZGl2aWRlLAogIGVxdWFscywKICBncmVhdGVyVGhhbiwKICBncmVhdGVyVGhhbkVxdWFscywKICBpbmRleEdldCwKICBpbmRleFNldCwKICBsZWZ0U2hpZnQsCiAgbGVzc1RoYW4sCiAgbGVzc1RoYW5FcXVhbHMsCiAgbW9kdWxvLAogIG11bHRpcGx5LAogIHJpZ2h0U2hpZnQsCiAgdHJpcGxlU2hpZnQsCiAgc3VidHJhY3QsCiAgdHJ1bmNhdGluZ0RpdmlkZSwKICB1bmFyeU1pbnVzLAp9CgpPcGVyYXRvciBvcGVyYXRvckZyb21TdHJpbmcoU3RyaW5nIHN0cmluZykgewogIGlmIChpZGVudGljYWwoIisiLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IuYWRkOwogIGlmIChpZGVudGljYWwoIiYiLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IuYml0d2lzZUFuZDsKICBpZiAoaWRlbnRpY2FsKCJ+Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmJpdHdpc2VOb3Q7CiAgaWYgKGlkZW50aWNhbCgifCIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci5iaXR3aXNlT3I7CiAgaWYgKGlkZW50aWNhbCgiXiIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci5iaXR3aXNlWG9yOwogIGlmIChpZGVudGljYWwoIi8iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IuZGl2aWRlOwogIGlmIChpZGVudGljYWwoIj09Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmVxdWFsczsKICBpZiAoaWRlbnRpY2FsKCI+Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmdyZWF0ZXJUaGFuOwogIGlmIChpZGVudGljYWwoIj49Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWxzOwogIGlmIChpZGVudGljYWwoIltdIiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmluZGV4R2V0OwogIGlmIChpZGVudGljYWwoIltdPSIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci5pbmRleFNldDsKICBpZiAoaWRlbnRpY2FsKCI8PCIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci5sZWZ0U2hpZnQ7CiAgaWYgKGlkZW50aWNhbCgiPCIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci5sZXNzVGhhbjsKICBpZiAoaWRlbnRpY2FsKCI8PSIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci5sZXNzVGhhbkVxdWFsczsKICBpZiAoaWRlbnRpY2FsKCIlIiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLm1vZHVsbzsKICBpZiAoaWRlbnRpY2FsKCIqIiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLm11bHRpcGx5OwogIGlmIChpZGVudGljYWwoIj4+Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLnJpZ2h0U2hpZnQ7CiAgaWYgKGlkZW50aWNhbCgiPj4+Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLnRyaXBsZVNoaWZ0OwogIGlmIChpZGVudGljYWwoIi0iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3Iuc3VidHJhY3Q7CiAgaWYgKGlkZW50aWNhbCgifi8iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IudHJ1bmNhdGluZ0RpdmlkZTsKICBpZiAoaWRlbnRpY2FsKCJ1bmFyeS0iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IudW5hcnlNaW51czsKICByZXR1cm4gbnVsbDsKfQoKU3RyaW5nIG9wZXJhdG9yVG9TdHJpbmcoT3BlcmF0b3Igb3BlcmF0b3IpIHsKICBzd2l0Y2ggKG9wZXJhdG9yKSB7CiAgICBjYXNlIE9wZXJhdG9yLmFkZDoKICAgICAgcmV0dXJuICIrIjsKICAgIGNhc2UgT3BlcmF0b3IuYml0d2lzZUFuZDoKICAgICAgcmV0dXJuICImIjsKICAgIGNhc2UgT3BlcmF0b3IuYml0d2lzZU5vdDoKICAgICAgcmV0dXJuICJ+IjsKICAgIGNhc2UgT3BlcmF0b3IuYml0d2lzZU9yOgogICAgICByZXR1cm4gInwiOwogICAgY2FzZSBPcGVyYXRvci5iaXR3aXNlWG9yOgogICAgICByZXR1cm4gIl4iOwogICAgY2FzZSBPcGVyYXRvci5kaXZpZGU6CiAgICAgIHJldHVybiAiLyI7CiAgICBjYXNlIE9wZXJhdG9yLmVxdWFsczoKICAgICAgcmV0dXJuICI9PSI7CiAgICBjYXNlIE9wZXJhdG9yLmdyZWF0ZXJUaGFuOgogICAgICByZXR1cm4gIj4iOwogICAgY2FzZSBPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsczoKICAgICAgcmV0dXJuICI+PSI7CiAgICBjYXNlIE9wZXJhdG9yLmluZGV4R2V0OgogICAgICByZXR1cm4gIltdIjsKICAgIGNhc2UgT3BlcmF0b3IuaW5kZXhTZXQ6CiAgICAgIHJldHVybiAiW109IjsKICAgIGNhc2UgT3BlcmF0b3IubGVmdFNoaWZ0OgogICAgICByZXR1cm4gIjw8IjsKICAgIGNhc2UgT3BlcmF0b3IubGVzc1RoYW46CiAgICAgIHJldHVybiAiPCI7CiAgICBjYXNlIE9wZXJhdG9yLmxlc3NUaGFuRXF1YWxzOgogICAgICByZXR1cm4gIjw9IjsKICAgIGNhc2UgT3BlcmF0b3IubW9kdWxvOgogICAgICByZXR1cm4gIiUiOwogICAgY2FzZSBPcGVyYXRvci5tdWx0aXBseToKICAgICAgcmV0dXJuICIqIjsKICAgIGNhc2UgT3BlcmF0b3IucmlnaHRTaGlmdDoKICAgICAgcmV0dXJuICI+PiI7CiAgICBjYXNlIE9wZXJhdG9yLnRyaXBsZVNoaWZ0OgogICAgICByZXR1cm4gIj4+PiI7CiAgICBjYXNlIE9wZXJhdG9yLnN1YnRyYWN0OgogICAgICByZXR1cm4gIi0iOwogICAgY2FzZSBPcGVyYXRvci50cnVuY2F0aW5nRGl2aWRlOgogICAgICByZXR1cm4gIn4vIjsKICAgIGNhc2UgT3BlcmF0b3IudW5hcnlNaW51czoKICAgICAgcmV0dXJuICJ1bmFyeS0iOwogIH0KICByZXR1cm4gbnVsbDsKfQoKaW50IG9wZXJhdG9yUmVxdWlyZWRBcmd1bWVudENvdW50KE9wZXJhdG9yIG9wZXJhdG9yKSB7CiAgc3dpdGNoIChvcGVyYXRvcikgewogICAgY2FzZSBPcGVyYXRvci5iaXR3aXNlTm90OgogICAgY2FzZSBPcGVyYXRvci51bmFyeU1pbnVzOgogICAgICByZXR1cm4gMDsKCiAgICBjYXNlIE9wZXJhdG9yLmFkZDoKICAgIGNhc2UgT3BlcmF0b3IuYml0d2lzZUFuZDoKICAgIGNhc2UgT3BlcmF0b3IuYml0d2lzZU9yOgogICAgY2FzZSBPcGVyYXRvci5iaXR3aXNlWG9yOgogICAgY2FzZSBPcGVyYXRvci5kaXZpZGU6CiAgICBjYXNlIE9wZXJhdG9yLmVxdWFsczoKICAgIGNhc2UgT3BlcmF0b3IuZ3JlYXRlclRoYW46CiAgICBjYXNlIE9wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWxzOgogICAgY2FzZSBPcGVyYXRvci5pbmRleEdldDoKICAgIGNhc2UgT3BlcmF0b3IubGVmdFNoaWZ0OgogICAgY2FzZSBPcGVyYXRvci5sZXNzVGhhbjoKICAgIGNhc2UgT3BlcmF0b3IubGVzc1RoYW5FcXVhbHM6CiAgICBjYXNlIE9wZXJhdG9yLm1vZHVsbzoKICAgIGNhc2UgT3BlcmF0b3IubXVsdGlwbHk6CiAgICBjYXNlIE9wZXJhdG9yLnJpZ2h0U2hpZnQ6CiAgICBjYXNlIE9wZXJhdG9yLnRyaXBsZVNoaWZ0OgogICAgY2FzZSBPcGVyYXRvci5zdWJ0cmFjdDoKICAgIGNhc2UgT3BlcmF0b3IudHJ1bmNhdGluZ0RpdmlkZToKICAgICAgcmV0dXJuIDE7CgogICAgY2FzZSBPcGVyYXRvci5pbmRleFNldDoKICAgICAgcmV0dXJuIDI7CiAgfQogIHJldHVybiAtMTsKfQqAiwBOTjwBGQEqBEsQBw4ODQ4KCg8VDAwNDBIKDA4PDBQOAgEtMzo6OTo2NztCOTo6OD82ODs9OEE/DwIBLRYXEh4SHhIdEh4SGhIaEx8SJRMcExwUHRMcEiITGhIcEh4THxQcEiQTHhcEDwIBNxYeHhABFx4dHhoaHyUcHRwiGhweHxwkEAEcEAQNAgEpcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL29wZXJhdG9yLmRhcnQ/c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci9hc3luY19tb2RpZmllci5kYXJ0gUAvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5wYXJzZXIuYXN5bmNfbW9kaWZpZXI7CgplbnVtIEFzeW5jTW9kaWZpZXIgewogIFN5bmMsCiAgU3luY1N0YXIsCiAgQXN5bmMsCiAgQXN5bmNTdGFyLAp9Cg4ATk48ASUBFQgMCQ0CATZwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2FzeW5jX21vZGlmaWVyLmRhcnQ8c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NjYW5uZXIvY2hhcmFjdGVycy5kYXJ0jW4vLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5zY2FubmVyLmNoYXJhY3RlcnM7Cgpjb25zdCBpbnQgJEVPRiA9IDA7CmNvbnN0IGludCAkU1RYID0gMjsKY29uc3QgaW50ICRCUyA9IDg7CmNvbnN0IGludCAkVEFCID0gOTsKY29uc3QgaW50ICRMRiA9IDEwOwpjb25zdCBpbnQgJFZUQUIgPSAxMTsKY29uc3QgaW50ICRGRiA9IDEyOwpjb25zdCBpbnQgJENSID0gMTM7CmNvbnN0IGludCAkU1BBQ0UgPSAzMjsKY29uc3QgaW50ICRCQU5HID0gMzM7CmNvbnN0IGludCAkRFEgPSAzNDsKY29uc3QgaW50ICRIQVNIID0gMzU7CmNvbnN0IGludCAkJCA9IDM2Owpjb25zdCBpbnQgJFBFUkNFTlQgPSAzNzsKY29uc3QgaW50ICRBTVBFUlNBTkQgPSAzODsKY29uc3QgaW50ICRTUSA9IDM5Owpjb25zdCBpbnQgJE9QRU5fUEFSRU4gPSA0MDsKY29uc3QgaW50ICRDTE9TRV9QQVJFTiA9IDQxOwpjb25zdCBpbnQgJFNUQVIgPSA0MjsKY29uc3QgaW50ICRQTFVTID0gNDM7CmNvbnN0IGludCAkQ09NTUEgPSA0NDsKY29uc3QgaW50ICRNSU5VUyA9IDQ1Owpjb25zdCBpbnQgJFBFUklPRCA9IDQ2Owpjb25zdCBpbnQgJFNMQVNIID0gNDc7CmNvbnN0IGludCAkMCA9IDQ4Owpjb25zdCBpbnQgJDEgPSA0OTsKY29uc3QgaW50ICQyID0gNTA7CmNvbnN0IGludCAkMyA9IDUxOwpjb25zdCBpbnQgJDQgPSA1MjsKY29uc3QgaW50ICQ1ID0gNTM7CmNvbnN0IGludCAkNiA9IDU0Owpjb25zdCBpbnQgJDcgPSA1NTsKY29uc3QgaW50ICQ4ID0gNTY7CmNvbnN0IGludCAkOSA9IDU3Owpjb25zdCBpbnQgJENPTE9OID0gNTg7CmNvbnN0IGludCAkU0VNSUNPTE9OID0gNTk7CmNvbnN0IGludCAkTFQgPSA2MDsKY29uc3QgaW50ICRFUSA9IDYxOwpjb25zdCBpbnQgJEdUID0gNjI7CmNvbnN0IGludCAkUVVFU1RJT04gPSA2MzsKY29uc3QgaW50ICRBVCA9IDY0Owpjb25zdCBpbnQgJEEgPSA2NTsKY29uc3QgaW50ICRCID0gNjY7CmNvbnN0IGludCAkQyA9IDY3Owpjb25zdCBpbnQgJEQgPSA2ODsKY29uc3QgaW50ICRFID0gNjk7CmNvbnN0IGludCAkRiA9IDcwOwpjb25zdCBpbnQgJEcgPSA3MTsKY29uc3QgaW50ICRIID0gNzI7CmNvbnN0IGludCAkSSA9IDczOwpjb25zdCBpbnQgJEogPSA3NDsKY29uc3QgaW50ICRLID0gNzU7CmNvbnN0IGludCAkTCA9IDc2Owpjb25zdCBpbnQgJE0gPSA3NzsKY29uc3QgaW50ICROID0gNzg7CmNvbnN0IGludCAkTyA9IDc5Owpjb25zdCBpbnQgJFAgPSA4MDsKY29uc3QgaW50ICRRID0gODE7CmNvbnN0IGludCAkUiA9IDgyOwpjb25zdCBpbnQgJFMgPSA4MzsKY29uc3QgaW50ICRUID0gODQ7CmNvbnN0IGludCAkVSA9IDg1Owpjb25zdCBpbnQgJFYgPSA4NjsKY29uc3QgaW50ICRXID0gODc7CmNvbnN0IGludCAkWCA9IDg4Owpjb25zdCBpbnQgJFkgPSA4OTsKY29uc3QgaW50ICRaID0gOTA7CmNvbnN0IGludCAkT1BFTl9TUVVBUkVfQlJBQ0tFVCA9IDkxOwpjb25zdCBpbnQgJEJBQ0tTTEFTSCA9IDkyOwpjb25zdCBpbnQgJENMT1NFX1NRVUFSRV9CUkFDS0VUID0gOTM7CmNvbnN0IGludCAkQ0FSRVQgPSA5NDsKY29uc3QgaW50ICRfID0gOTU7CmNvbnN0IGludCAkQkFDS1BJTkcgPSA5NjsKY29uc3QgaW50ICRhID0gOTc7CmNvbnN0IGludCAkYiA9IDk4Owpjb25zdCBpbnQgJGMgPSA5OTsKY29uc3QgaW50ICRkID0gMTAwOwpjb25zdCBpbnQgJGUgPSAxMDE7CmNvbnN0IGludCAkZiA9IDEwMjsKY29uc3QgaW50ICRnID0gMTAzOwpjb25zdCBpbnQgJGggPSAxMDQ7CmNvbnN0IGludCAkaSA9IDEwNTsKY29uc3QgaW50ICRqID0gMTA2Owpjb25zdCBpbnQgJGsgPSAxMDc7CmNvbnN0IGludCAkbCA9IDEwODsKY29uc3QgaW50ICRtID0gMTA5Owpjb25zdCBpbnQgJG4gPSAxMTA7CmNvbnN0IGludCAkbyA9IDExMTsKY29uc3QgaW50ICRwID0gMTEyOwpjb25zdCBpbnQgJHEgPSAxMTM7CmNvbnN0IGludCAkciA9IDExNDsKY29uc3QgaW50ICRzID0gMTE1Owpjb25zdCBpbnQgJHQgPSAxMTY7CmNvbnN0IGludCAkdSA9IDExNzsKY29uc3QgaW50ICR2ID0gMTE4Owpjb25zdCBpbnQgJHcgPSAxMTk7CmNvbnN0IGludCAkeCA9IDEyMDsKY29uc3QgaW50ICR5ID0gMTIxOwpjb25zdCBpbnQgJHogPSAxMjI7CmNvbnN0IGludCAkT1BFTl9DVVJMWV9CUkFDS0VUID0gMTIzOwpjb25zdCBpbnQgJEJBUiA9IDEyNDsKY29uc3QgaW50ICRDTE9TRV9DVVJMWV9CUkFDS0VUID0gMTI1Owpjb25zdCBpbnQgJFRJTERFID0gMTI2Owpjb25zdCBpbnQgJERFTCA9IDEyNzsKY29uc3QgaW50ICROQlNQID0gMTYwOwpjb25zdCBpbnQgJExTID0gMHgyMDI4Owpjb25zdCBpbnQgJFBTID0gMHgyMDI5OwoKY29uc3QgaW50ICRGSVJTVF9TVVJST0dBVEUgPSAweGQ4MDA7CmNvbnN0IGludCAkTEFTVF9TVVJST0dBVEUgPSAweGRmZmY7CmNvbnN0IGludCAkTEFTVF9DT0RFX1BPSU5UID0gMHgxMGZmZmY7Cgpib29sIGlzRGlnaXQoaW50IGNoYXJhY3RlckNvZGUpIHsKICByZXR1cm4gJDAgPD0gY2hhcmFjdGVyQ29kZSAmJiBjaGFyYWN0ZXJDb2RlIDw9ICQ5Owp9Cgpib29sIGlzSGV4RGlnaXQoaW50IGNoYXJhY3RlckNvZGUpIHsKICBpZiAoY2hhcmFjdGVyQ29kZSA8PSAkOSkgcmV0dXJuICQwIDw9IGNoYXJhY3RlckNvZGU7CiAgY2hhcmFjdGVyQ29kZSB8PSAkYSBeICRBOwogIHJldHVybiAoJGEgPD0gY2hhcmFjdGVyQ29kZSAmJiBjaGFyYWN0ZXJDb2RlIDw9ICRmKTsKfQoKaW50IGhleERpZ2l0VmFsdWUoaW50IGhleERpZ2l0KSB7CiAgYXNzZXJ0KGlzSGV4RGlnaXQoaGV4RGlnaXQpKTsKICAvLyBoZXhEaWdpdCBpcyBvbmUgb2YgJzAnLi4nOScsICdBJy4uJ0YnIGFuZCAnYScuLidmJy4KICBpZiAoaGV4RGlnaXQgPD0gJDkpIHJldHVybiBoZXhEaWdpdCAtICQwOwogIHJldHVybiAoaGV4RGlnaXQgfCAoJGEgXiAkQSkpIC0gKCRhIC0gMTApOwp9Cgpib29sIGlzVW5pY29kZVNjYWxhclZhbHVlKGludCB2YWx1ZSkgewogIHJldHVybiB2YWx1ZSA8ICRGSVJTVF9TVVJST0dBVEUgfHwKICAgICAgKHZhbHVlID4gJExBU1RfU1VSUk9HQVRFICYmIHZhbHVlIDw9ICRMQVNUX0NPREVfUE9JTlQpOwp9Cgpib29sIGlzVXRmMTZMZWFkU3Vycm9nYXRlKGludCB2YWx1ZSkgewogIHJldHVybiB2YWx1ZSA+PSAweGQ4MDAgJiYgdmFsdWUgPD0gMHhkYmZmOwp9Cgpib29sIGlzVXRmMTZUcmFpbFN1cnJvZ2F0ZShpbnQgdmFsdWUpIHsKICByZXR1cm4gdmFsdWUgPj0gMHhkYzAwICYmIHZhbHVlIDw9IDB4ZGZmZjsKfQqAlQBOTjwBIgEUFBMUFBYUFBcWFBYTGRsUHB0WFhcXGBcTExMTExMTExMTFxsUFBQaFBMTExMTExMTExMTExMTExMTExMTExMTExMTJRsmFxMaExMTFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlFiYYFhcYGAElJCcBIjUCASU3HDcCASIgOSwtAgEnJT4CASctAgEoLQIBM3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY2FubmVyL2NoYXJhY3RlcnMuZGFydDNzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdXRpbC9saW5rLmRhcnSU4y8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnV0aWwubGluazsKCmltcG9ydCAnbGlua19pbXBsZW1lbnRhdGlvbi5kYXJ0JwogICAgc2hvdyBMaW5rQnVpbGRlckltcGxlbWVudGF0aW9uLCBMaW5rRW50cnksIExpbmtJdGVyYXRvciwgTWFwcGVkTGlua0l0ZXJhYmxlOwoKY2xhc3MgTGluazxUPiBpbXBsZW1lbnRzIEl0ZXJhYmxlPFQ+IHsKICBUIGdldCBoZWFkID0+IHRocm93IG5ldyBTdGF0ZUVycm9yKCJubyBlbGVtZW50cyIpOwogIExpbms8VD4gZ2V0IHRhaWwgPT4gbnVsbDsKCiAgY29uc3QgTGluaygpOwoKICBMaW5rPFQ+IHByZXBlbmQoVCBlbGVtZW50KSB7CiAgICByZXR1cm4gbmV3IExpbmtFbnRyeTxUPihlbGVtZW50LCB0aGlzKTsKICB9CgogIEl0ZXJhdG9yPFQ+IGdldCBpdGVyYXRvciA9PiBuZXcgTGlua0l0ZXJhdG9yPFQ+KHRoaXMpOwoKICB2b2lkIHByaW50T24oU3RyaW5nQnVmZmVyIGJ1ZmZlciwgW3NlcGFyYXRlZEJ5XSkge30KCiAgTGlzdDxUPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICBMaXN0PFQ+IHJlc3VsdDsKICAgIGlmICghZ3Jvd2FibGUpIHsKICAgICAgcmVzdWx0ID0gbmV3IExpc3Q8VD4oc2xvd0xlbmd0aCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IG5ldyBMaXN0PFQ+KCk7CiAgICAgIHJlc3VsdC5sZW5ndGggPSBzbG93TGVuZ3RoKCk7CiAgICB9CiAgICBpbnQgaSA9IDA7CiAgICBmb3IgKExpbms8VD4gbGluayA9IHRoaXM7ICFsaW5rLmlzRW1wdHk7IGxpbmsgPSBsaW5rLnRhaWwpIHsKICAgICAgcmVzdWx0W2krK10gPSBsaW5rLmhlYWQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIExhemlseSBtYXBzIG92ZXIgdGhpcyBsaW5rZWQgbGlzdCwgcmV0dXJuaW5nIGFuIFtJdGVyYWJsZV0uCiAgSXRlcmFibGU8Sz4gbWFwPEs+KEsgZm4oVCBpdGVtKSkgewogICAgcmV0dXJuIG5ldyBNYXBwZWRMaW5rSXRlcmFibGU8VCwgSz4odGhpcywgZm4pOwogIH0KCiAgLy8vIEludm9rZXMgYGZuYCBmb3IgZXZlcnkgaXRlbSBpbiB0aGUgbGlua2VkIGxpc3QgYW5kIHJldHVybnMgdGhlIHJlc3VsdHMKICAvLy8gaW4gYSBbTGlzdF0uCiAgTGlzdDxFPiBtYXBUb0xpc3Q8RT4oRSBmbihUIGl0ZW0pLCB7Ym9vbCBncm93YWJsZTogdHJ1ZX0pIHsKICAgIExpc3Q8RT4gcmVzdWx0OwogICAgaWYgKCFncm93YWJsZSkgewogICAgICByZXN1bHQgPSBuZXcgTGlzdDxFPihzbG93TGVuZ3RoKCkpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gbmV3IExpc3Q8RT4oKTsKICAgICAgcmVzdWx0Lmxlbmd0aCA9IHNsb3dMZW5ndGgoKTsKICAgIH0KICAgIGludCBpID0gMDsKICAgIGZvciAoTGluazxUPiBsaW5rID0gdGhpczsgIWxpbmsuaXNFbXB0eTsgbGluayA9IGxpbmsudGFpbCkgewogICAgICByZXN1bHRbaSsrXSA9IGZuKGxpbmsuaGVhZCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiB0cnVlOwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gZmFsc2U7CgogIExpbms8VD4gcmV2ZXJzZShMaW5rPFQ+IHRhaWwpID0+IHRoaXM7CgogIExpbms8VD4gcmV2ZXJzZVByZXBlbmRBbGwoTGluazxUPiBmcm9tKSB7CiAgICBpZiAoZnJvbS5pc0VtcHR5KSByZXR1cm4gdGhpczsKICAgIHJldHVybiB0aGlzLnByZXBlbmQoZnJvbS5oZWFkKS5yZXZlcnNlUHJlcGVuZEFsbChmcm9tLnRhaWwpOwogIH0KCiAgTGluazxUPiBza2lwKGludCBuKSB7CiAgICBpZiAobiA9PSAwKSByZXR1cm4gdGhpczsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCAkbiBvdXQgb2YgcmFuZ2UnKTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoVCBlbGVtZW50KSkge30KCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBMaW5rPFQ+KSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gb3RoZXIuaXNFbXB0eTsKICB9CgogIGludCBnZXQgaGFzaENvZGUgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ0xpbmsuaGFzaENvZGUnKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIltdIjsKCiAgZ2V0IGxlbmd0aCB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignZ2V0Omxlbmd0aCcpOwogIH0KCiAgaW50IHNsb3dMZW5ndGgoKSA9PiAwOwoKICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIG1ldGhvZD8KICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSB7CiAgICBmb3IgKExpbms8VD4gbGluayA9IHRoaXM7ICFsaW5rLmlzRW1wdHk7IGxpbmsgPSBsaW5rLnRhaWwpIHsKICAgICAgaWYgKGxpbmsuaGVhZCA9PSBlbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vIFRPRE8oYWhlKTogUmVtb3ZlIHRoaXMgbWV0aG9kPwogIFQgZ2V0IHNpbmdsZSB7CiAgICBpZiAoaXNFbXB0eSkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ05vIGVsZW1lbnRzJyk7CiAgICBpZiAoIXRhaWwuaXNFbXB0eSkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ01vcmUgdGhhbiBvbmUgZWxlbWVudCcpOwogICAgcmV0dXJuIGhlYWQ7CiAgfQoKICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIG1ldGhvZD8KICBUIGdldCBmaXJzdCB7CiAgICBpZiAoaXNFbXB0eSkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ05vIGVsZW1lbnRzJyk7CiAgICByZXR1cm4gaGVhZDsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgZiByZXR1cm5zIHRydWUgZm9yIGFsbCBlbGVtZW50cyBvZiB0aGlzIGxpc3QuCiAgLy8vCiAgLy8vIFJldHVybnMgdHJ1ZSBmb3IgdGhlIGVtcHR5IGxpc3QuCiAgYm9vbCBldmVyeShib29sIGYoVCBlKSkgewogICAgZm9yIChMaW5rPFQ+IGxpbmsgPSB0aGlzOyAhbGluay5pc0VtcHR5OyBsaW5rID0gbGluay50YWlsKSB7CiAgICAgIGlmICghZihsaW5rLmhlYWQpKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vCiAgLy8gVW5zdXBwb3J0ZWQgSXRlcmFibGU8VD4gbWV0aG9kcy4KICAvLwogIGJvb2wgYW55KGJvb2wgZihUIGUpKSA9PiBfdW5zdXBwb3J0ZWQoJ2FueScpOwogIEl0ZXJhYmxlPFQ+IGNhc3Q8VD4oKSA9PiBfdW5zdXBwb3J0ZWQoJ2Nhc3QnKTsKICBUIGVsZW1lbnRBdChpbnQgaSkgPT4gX3Vuc3VwcG9ydGVkKCdlbGVtZW50QXQnKTsKICBJdGVyYWJsZTxLPiBleHBhbmQ8Sz4oSXRlcmFibGU8Sz4gZihUIGUpKSA9PiBfdW5zdXBwb3J0ZWQoJ2V4cGFuZCcpOwogIFQgZmlyc3RXaGVyZShib29sIGYoVCBlKSwge1Qgb3JFbHNlKCl9KSA9PiBfdW5zdXBwb3J0ZWQoJ2ZpcnN0V2hlcmUnKTsKICBLIGZvbGQ8Sz4oSyBpbml0aWFsVmFsdWUsIEsgY29tYmluZShLIHZhbHVlLCBUIGVsZW1lbnQpKSB7CiAgICByZXR1cm4gX3Vuc3VwcG9ydGVkKCdmb2xkJyk7CiAgfQoKICBJdGVyYWJsZTxUPiBmb2xsb3dlZEJ5KEl0ZXJhYmxlPFQ+IG90aGVyKSA9PiBfdW5zdXBwb3J0ZWQoJ2ZvbGxvd2VkQnknKTsKICBUIGdldCBsYXN0ID0+IF91bnN1cHBvcnRlZCgnZ2V0Omxhc3QnKTsKICBUIGxhc3RXaGVyZShib29sIGYoVCBlKSwge1Qgb3JFbHNlKCl9KSA9PiBfdW5zdXBwb3J0ZWQoJ2xhc3RXaGVyZScpOwogIFN0cmluZyBqb2luKFtzZXBhcmF0b3IgPSAnJ10pID0+IF91bnN1cHBvcnRlZCgnam9pbicpOwogIFQgcmVkdWNlKFQgY29tYmluZShUIGEsIFQgYikpID0+IF91bnN1cHBvcnRlZCgncmVkdWNlJyk7CiAgSXRlcmFibGU8VD4gcmV0eXBlPFQ+KCkgPT4gX3Vuc3VwcG9ydGVkKCdyZXR5cGUnKTsKICBUIHNpbmdsZVdoZXJlKGJvb2wgZihUIGUpLCB7VCBvckVsc2UoKX0pID0+IF91bnN1cHBvcnRlZCgnc2luZ2xlV2hlcmUnKTsKICBJdGVyYWJsZTxUPiBza2lwV2hpbGUoYm9vbCBmKFQgZSkpID0+IF91bnN1cHBvcnRlZCgnc2tpcFdoaWxlJyk7CiAgSXRlcmFibGU8VD4gdGFrZShpbnQgbikgPT4gX3Vuc3VwcG9ydGVkKCd0YWtlJyk7CiAgSXRlcmFibGU8VD4gdGFrZVdoaWxlKGJvb2wgZihUIGUpKSA9PiBfdW5zdXBwb3J0ZWQoJ3Rha2VXaGlsZScpOwogIFNldDxUPiB0b1NldCgpID0+IF91bnN1cHBvcnRlZCgndG9TZXQnKTsKICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBfdW5zdXBwb3J0ZWQoJ3doZXJlVHlwZScpOwogIEl0ZXJhYmxlPFQ+IHdoZXJlKGJvb2wgZihUIGUpKSA9PiBfdW5zdXBwb3J0ZWQoJ3doZXJlJyk7CgogIF91bnN1cHBvcnRlZChTdHJpbmcgbWV0aG9kKSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihtZXRob2QpOwp9CgovLy8gQnVpbGRlciBvYmplY3QgZm9yIGNyZWF0aW5nIGxpbmtlZCBsaXN0cyB1c2luZyBbTGlua10gb3IgZml4ZWQtbGVuZ3RoIFtMaXN0XQovLy8gb2JqZWN0cy4KYWJzdHJhY3QgY2xhc3MgTGlua0J1aWxkZXI8VD4gewogIGZhY3RvcnkgTGlua0J1aWxkZXIoKSA9IExpbmtCdWlsZGVySW1wbGVtZW50YXRpb248VD47CgogIC8vLyBQcmVwZW5kcyBhbGwgZWxlbWVudHMgYWRkZWQgdG8gdGhlIGJ1aWxkZXIgdG8gW3RhaWxdLiBUaGUgcmVzdWx0aW5nIGxpc3QKICAvLy8gaXMgcmV0dXJuZWQgYW5kIHRoZSBidWlsZGVyIGlzIGNsZWFyZWQuCiAgTGluazxUPiB0b0xpbmsoTGluazxUPiB0YWlsKTsKCiAgLy8vIENyZWF0ZXMgYSBuZXcgZml4ZWQgbGVuZ3RoIGNvbnRhaW5pbmcgYWxsIGFkZGVkIGVsZW1lbnRzLiBUaGUKICAvLy8gcmVzdWx0aW5nIGxpc3QgaXMgcmV0dXJuZWQgYW5kIHRoZSBidWlsZGVyIGlzIGNsZWFyZWQuCiAgTGlzdDxUPiB0b0xpc3QoKTsKCiAgLy8vIEFkZHMgdGhlIGVsZW1lbnQgW3RdIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgYmVpbmcgYnVpbHQuCiAgTGluazxUPiBhZGRMYXN0KFQgdCk7CgogIC8vLyBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBsaXN0IGJlaW5nIGJ1aWx0LgogIFQgZ2V0IGZpcnN0OwoKICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IGJlaW5nIGJ1aWx0LgogIGZpbmFsIGludCBsZW5ndGg7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgbGlzdCBiZWluZyBidWlsdCBpcyBlbXB0eS4KICBmaW5hbCBib29sIGlzRW1wdHk7CgogIC8vLyBSZW1vdmVzIGFsbCBhZGRlZCBlbGVtZW50cyBhbmQgcmVzZXRzIHRoZSBidWlsZGVyLgogIHZvaWQgY2xlYXIoKTsKfQqAtgBOTjwBGQEiUQEnNRwBEAEfLAQBOQE2ASoUFSoNHiQGD0EfBhMEAUIlMwQBTRM+FBUqDR4kBg9BIwYTBAEcIAEpASwjQQQBGB0zBAElARwpGgQBQwEdAQ8uBAEZASQiQS0GEgQBJBE2RhEEASQQNhEEAUQGJxxBJwYRBAEFJgUwMTNHST0hBAFLKkc5OzVLQzNDKzs7AUUCAVENIDgBTy4gAUQ9FAE/GAE5DwE+FAE3FgE5EAIBKnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS91dGlsL2xpbmsuZGFydEJzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdXRpbC9saW5rX2ltcGxlbWVudGF0aW9uLmRhcnSSWS8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnV0aWwubGlua19pbXBsZW1lbnRhdGlvbjsKCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJyBzaG93IEl0ZXJhYmxlQmFzZTsKCmltcG9ydCAnbGluay5kYXJ0JyBzaG93IExpbmssIExpbmtCdWlsZGVyOwoKY2xhc3MgTGlua0l0ZXJhdG9yPFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4gewogIFQgX2N1cnJlbnQ7CiAgTGluazxUPiBfbGluazsKCiAgTGlua0l0ZXJhdG9yKHRoaXMuX2xpbmspOwoKICBUIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9saW5rLmlzRW1wdHkpIHsKICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfY3VycmVudCA9IF9saW5rLmhlYWQ7CiAgICBfbGluayA9IF9saW5rLnRhaWw7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KCnR5cGVkZWYgVCBUcmFuc2Zvcm1hdGlvbjxTLCBUPihTIGlucHV0KTsKCmNsYXNzIE1hcHBlZExpbmtJdGVyYXRvcjxTLCBUPiBleHRlbmRzIEl0ZXJhdG9yPFQ+IHsKICBUcmFuc2Zvcm1hdGlvbjxTLCBUPiBfdHJhbnNmb3JtYXRpb247CiAgTGluazxTPiBfbGluazsKICBUIF9jdXJyZW50OwoKICBNYXBwZWRMaW5rSXRlcmF0b3IodGhpcy5fbGluaywgdGhpcy5fdHJhbnNmb3JtYXRpb24pOwoKICBUIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9saW5rLmlzRW1wdHkpIHsKICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfY3VycmVudCA9IF90cmFuc2Zvcm1hdGlvbihfbGluay5oZWFkKTsKICAgIF9saW5rID0gX2xpbmsudGFpbDsKICAgIHJldHVybiB0cnVlOwogIH0KfQoKY2xhc3MgTWFwcGVkTGlua0l0ZXJhYmxlPFMsIFQ+IGV4dGVuZHMgSXRlcmFibGVCYXNlPFQ+IHsKICBUcmFuc2Zvcm1hdGlvbjxTLCBUPiBfdHJhbnNmb3JtYXRpb247CiAgTGluazxTPiBfbGluazsKCiAgTWFwcGVkTGlua0l0ZXJhYmxlKHRoaXMuX2xpbmssIHRoaXMuX3RyYW5zZm9ybWF0aW9uKTsKCiAgSXRlcmF0b3I8VD4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBuZXcgTWFwcGVkTGlua0l0ZXJhdG9yPFMsIFQ+KF9saW5rLCBfdHJhbnNmb3JtYXRpb24pOwogIH0KfQoKY2xhc3MgTGlua0VudHJ5PFQ+IGV4dGVuZHMgTGluazxUPiB7CiAgZmluYWwgVCBoZWFkOwogIExpbms8VD4gdGFpbDsKCiAgTGlua0VudHJ5KHRoaXMuaGVhZCwgW0xpbms8VD4gdGFpbF0pIDogdGFpbCA9IHRhaWwgPz8gY29uc3QgTGluazxOdWxsPigpOwoKICBMaW5rPFQ+IHByZXBlbmQoVCBlbGVtZW50KSB7CiAgICAvLyBUT0RPKGFoZSk6IFVzZSBuZXcgTGluazxUPiwgYnV0IHRoaXMgY29zdCA4JSBwZXJmb3JtYW5jZSBvbiBWTS4KICAgIHJldHVybiBuZXcgTGlua0VudHJ5PFQ+KGVsZW1lbnQsIHRoaXMpOwogIH0KCiAgdm9pZCBwcmludE9uKFN0cmluZ0J1ZmZlciBidWZmZXIsIFtzZXBhcmF0ZWRCeV0pIHsKICAgIGJ1ZmZlci53cml0ZShoZWFkKTsKICAgIGlmIChzZXBhcmF0ZWRCeSA9PSBudWxsKSBzZXBhcmF0ZWRCeSA9ICcnOwogICAgZm9yIChMaW5rPFQ+IGxpbmsgPSB0YWlsOyBsaW5rLmlzTm90RW1wdHk7IGxpbmsgPSBsaW5rLnRhaWwpIHsKICAgICAgYnVmZmVyLndyaXRlKHNlcGFyYXRlZEJ5KTsKICAgICAgYnVmZmVyLndyaXRlKGxpbmsuaGVhZCk7CiAgICB9CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgYnVmZmVyLndyaXRlKCdbICcpOwogICAgcHJpbnRPbihidWZmZXIsICcsICcpOwogICAgYnVmZmVyLndyaXRlKCcgXScpOwogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGluazxUPiByZXZlcnNlKExpbms8VD4gdGFpbCkgewogICAgTGluazxUPiByZXN1bHQgPSB0YWlsOwogICAgZm9yIChMaW5rPFQ+IGxpbmsgPSB0aGlzOyBsaW5rLmlzTm90RW1wdHk7IGxpbmsgPSBsaW5rLnRhaWwpIHsKICAgICAgcmVzdWx0ID0gcmVzdWx0LnByZXBlbmQobGluay5oZWFkKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaW5rPFQ+IHJldmVyc2VQcmVwZW5kQWxsKExpbms8VD4gZnJvbSkgewogICAgTGluazxUPiByZXN1bHQ7CiAgICBmb3IgKHJlc3VsdCA9IHRoaXM7IGZyb20uaXNOb3RFbXB0eTsgZnJvbSA9IGZyb20udGFpbCkgewogICAgICByZXN1bHQgPSByZXN1bHQucHJlcGVuZChmcm9tLmhlYWQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIExpbms8VD4gc2tpcChpbnQgbikgewogICAgTGluazxUPiBsaW5rID0gdGhpczsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIGlmIChsaW5rLmlzRW1wdHkpIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggJG4gb3V0IG9mIHJhbmdlJyk7CiAgICAgIH0KICAgICAgbGluayA9IGxpbmsudGFpbDsKICAgIH0KICAgIHJldHVybiBsaW5rOwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBmYWxzZTsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IHRydWU7CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoVCBlbGVtZW50KSkgewogICAgZm9yIChMaW5rPFQ+IGxpbmsgPSB0aGlzOyBsaW5rLmlzTm90RW1wdHk7IGxpbmsgPSBsaW5rLnRhaWwpIHsKICAgICAgZihsaW5rLmhlYWQpOwogICAgfQogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBMaW5rPFQ+KSByZXR1cm4gZmFsc2U7CiAgICBMaW5rPFQ+IG15RWxlbWVudHMgPSB0aGlzOwogICAgd2hpbGUgKG15RWxlbWVudHMuaXNOb3RFbXB0eSAmJiBvdGhlci5pc05vdEVtcHR5KSB7CiAgICAgIGlmIChteUVsZW1lbnRzLmhlYWQgIT0gb3RoZXIuaGVhZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBteUVsZW1lbnRzID0gbXlFbGVtZW50cy50YWlsOwogICAgICBvdGhlciA9IG90aGVyLnRhaWw7CiAgICB9CiAgICByZXR1cm4gbXlFbGVtZW50cy5pc0VtcHR5ICYmIG90aGVyLmlzRW1wdHk7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdMaW5rRW50cnkuaGFzaENvZGUnKTsKCiAgaW50IHNsb3dMZW5ndGgoKSB7CiAgICBpbnQgbGVuZ3RoID0gMDsKICAgIGZvciAoTGluazxUPiBjdXJyZW50ID0gdGhpczsgY3VycmVudC5pc05vdEVtcHR5OyBjdXJyZW50ID0gY3VycmVudC50YWlsKSB7CiAgICAgICsrbGVuZ3RoOwogICAgfQogICAgcmV0dXJuIGxlbmd0aDsKICB9Cn0KCmNsYXNzIExpbmtCdWlsZGVySW1wbGVtZW50YXRpb248VD4gaW1wbGVtZW50cyBMaW5rQnVpbGRlcjxUPiB7CiAgTGlua0VudHJ5PFQ+IGhlYWQgPSBudWxsOwogIExpbmtFbnRyeTxUPiBsYXN0TGluayA9IG51bGw7CiAgaW50IGxlbmd0aCA9IDA7CgogIExpbmtCdWlsZGVySW1wbGVtZW50YXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgTGluazxUPiB0b0xpbmsoTGluazxUPiB0YWlsKSB7CiAgICBpZiAoaGVhZCA9PSBudWxsKSByZXR1cm4gdGFpbDsKICAgIGxhc3RMaW5rLnRhaWwgPSB0YWlsOwogICAgTGluazxUPiBsaW5rID0gaGVhZDsKICAgIGxhc3RMaW5rID0gbnVsbDsKICAgIGhlYWQgPSBudWxsOwogICAgbGVuZ3RoID0gMDsKICAgIHJldHVybiBsaW5rOwogIH0KCiAgTGlzdDxUPiB0b0xpc3QoKSB7CiAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBuZXcgTGlzdDxUPigwKTsKICAgIExpc3Q8VD4gbGlzdCA9IG5ldyBMaXN0PFQ+KGxlbmd0aCk7CiAgICBpbnQgaW5kZXggPSAwOwogICAgTGluazxUPiBsaW5rID0gaGVhZDsKICAgIHdoaWxlIChsaW5rLmlzTm90RW1wdHkpIHsKICAgICAgbGlzdFtpbmRleF0gPSBsaW5rLmhlYWQ7CiAgICAgIGxpbmsgPSBsaW5rLnRhaWw7CiAgICAgIGluZGV4Kys7CiAgICB9CiAgICBsYXN0TGluayA9IG51bGw7CiAgICBoZWFkID0gbnVsbDsKICAgIGxlbmd0aCA9IDA7CiAgICByZXR1cm4gbGlzdDsKICB9CgogIExpbms8VD4gYWRkTGFzdChUIHQpIHsKICAgIGxlbmd0aCsrOwogICAgTGlua0VudHJ5PFQ+IGVudHJ5ID0gbmV3IExpbmtFbnRyeTxUPih0LCBudWxsKTsKICAgIGlmIChoZWFkID09IG51bGwpIHsKICAgICAgaGVhZCA9IGVudHJ5OwogICAgfSBlbHNlIHsKICAgICAgbGFzdExpbmsudGFpbCA9IGVudHJ5OwogICAgfQogICAgbGFzdExpbmsgPSBlbnRyeTsKICAgIHJldHVybiBlbnRyeTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gbGVuZ3RoID09IDA7CgogIFQgZ2V0IGZpcnN0IHsKICAgIGlmIChoZWFkICE9IG51bGwpIHsKICAgICAgcmV0dXJuIGhlYWQuaGVhZDsKICAgIH0KICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJubyBlbGVtZW50cyIpOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIGhlYWQgPSBudWxsOwogICAgbGFzdExpbmsgPSBudWxsOwogICAgbGVuZ3RoID0gMDsKICB9Cn0KgNYATk48ASgBLAErAS8OEQEcAR0BFBkXFAYbGBEEAgEpATUoEQ4BOAEdARQZFxQGLBgRBAIBOSgRATgBHUEEAgElEBABTAEfRywEATUYL0MhHwYEARYuGBsYHgQBDCIbQyoGEwQBLBQ9KgYTBAEYGSIaNwgYBhEEAR0fASRDFAYEARwpHzgrFggkGgYwBAFIARUUTxAGEwQCAT8cIBIBHwEMISMaGRUREBEEARUsKBMZHh8YDwYVERARBAEZDjQYFA0dBhYSBAEjARAYGAYpBAERERUQBAIBOXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS91dGlsL2xpbmtfaW1wbGVtZW50YXRpb24uZGFydDlzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdXRpbC9yZWxhdGl2aXplLmRhcnSIgS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnV0aWwucmVsYXRpdml6ZTsKCmltcG9ydCAnZGFydDptYXRoJzsKClN0cmluZyByZWxhdGl2aXplVXJpKFVyaSBiYXNlLCBVcmkgdXJpLCBib29sIGlzV2luZG93cykgewogIGJvb2wgZXF1YWxzTkNTKFN0cmluZyBhLCBTdHJpbmcgYikgewogICAgcmV0dXJuIGEudG9Mb3dlckNhc2UoKSA9PSBiLnRvTG93ZXJDYXNlKCk7CiAgfQoKICBpZiAoIWVxdWFsc05DUyhiYXNlLnNjaGVtZSwgdXJpLnNjaGVtZSkgfHwKICAgICAgZXF1YWxzTkNTKGJhc2Uuc2NoZW1lLCAnZGFydCcpIHx8CiAgICAgIGVxdWFsc05DUyhiYXNlLnNjaGVtZSwgJ3BhY2thZ2UnKSkgewogICAgcmV0dXJuIHVyaS50b1N0cmluZygpOwogIH0KCiAgaWYgKCFlcXVhbHNOQ1MoYmFzZS5zY2hlbWUsICdmaWxlJykpIHsKICAgIGlzV2luZG93cyA9IGZhbHNlOwogIH0KCiAgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgcGF0aCkgewogICAgaWYgKGlzV2luZG93cykgewogICAgICByZXR1cm4gcGF0aC50b0xvd2VyQ2FzZSgpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHBhdGg7CiAgICB9CiAgfQoKICBpZiAoYmFzZS51c2VySW5mbyA9PSB1cmkudXNlckluZm8gJiYKICAgICAgZXF1YWxzTkNTKGJhc2UuaG9zdCwgdXJpLmhvc3QpICYmCiAgICAgIGJhc2UucG9ydCA9PSB1cmkucG9ydCAmJgogICAgICB1cmkucXVlcnkgPT0gIiIgJiYKICAgICAgdXJpLmZyYWdtZW50ID09ICIiKSB7CiAgICBpZiAobm9ybWFsaXplKHVyaS5wYXRoKS5zdGFydHNXaXRoKG5vcm1hbGl6ZShiYXNlLnBhdGgpKSkgewogICAgICByZXR1cm4gdXJpLnBhdGguc3Vic3RyaW5nKGJhc2UucGF0aC5sYXN0SW5kZXhPZignLycpICsgMSk7CiAgICB9CgogICAgaWYgKCFiYXNlLnBhdGguc3RhcnRzV2l0aCgnLycpIHx8ICF1cmkucGF0aC5zdGFydHNXaXRoKCcvJykpIHsKICAgICAgcmV0dXJuIHVyaS50b1N0cmluZygpOwogICAgfQoKICAgIExpc3Q8U3RyaW5nPiB1cmlQYXJ0cyA9IHVyaS5wYXRoLnNwbGl0KCcvJyk7CiAgICBMaXN0PFN0cmluZz4gYmFzZVBhcnRzID0gYmFzZS5wYXRoLnNwbGl0KCcvJyk7CiAgICBpbnQgY29tbW9uID0gMDsKICAgIGludCBsZW5ndGggPSBtaW4odXJpUGFydHMubGVuZ3RoLCBiYXNlUGFydHMubGVuZ3RoKTsKICAgIHdoaWxlIChjb21tb24gPCBsZW5ndGggJiYKICAgICAgICBub3JtYWxpemUodXJpUGFydHNbY29tbW9uXSkgPT0gbm9ybWFsaXplKGJhc2VQYXJ0c1tjb21tb25dKSkgewogICAgICBjb21tb24rKzsKICAgIH0KICAgIGlmIChjb21tb24gPT0gMSB8fCAoaXNXaW5kb3dzICYmIGNvbW1vbiA9PSAyKSkgewogICAgICAvLyBUaGUgZmlyc3QgcGFydCB3aWxsIGFsd2F5cyBiZSBhbiBlbXB0eSBzdHJpbmcgYmVjYXVzZSB0aGUKICAgICAgLy8gcGF0aHMgYXJlIGFic29sdXRlLiBPbiBXaW5kb3dzLCB3ZSBtdXN0IGFsc28gY29uc2lkZXIgZHJpdmUKICAgICAgLy8gbGV0dGVycyBvciBob3N0bmFtZXMuCiAgICAgIGlmIChiYXNlUGFydHMubGVuZ3RoID4gY29tbW9uICsgMSkgewogICAgICAgIC8vIEF2b2lkIHVzaW5nICcuLicgdG8gZ28gdG8gdGhlIHJvb3QsIHVubGVzcyB3ZSBhcmUgYWxyZWFkeSB0aGVyZS4KICAgICAgICByZXR1cm4gdXJpLnBhdGg7CiAgICAgIH0KICAgIH0KICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAoaW50IGkgPSBjb21tb24gKyAxOyBpIDwgYmFzZVBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHNiLndyaXRlKCcuLi8nKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSBjb21tb247IGkgPCB1cmlQYXJ0cy5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgc2Iud3JpdGUoJyR7dXJpUGFydHNbaV19LycpOwogICAgfQogICAgc2Iud3JpdGUoJyR7dXJpUGFydHMubGFzdH0nKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KICByZXR1cm4gdXJpLnRvU3RyaW5nKCk7Cn0KSwBOTjwBHwEUATonLwQBLSgrGwQBKRcEASIVIQ0TBgQBJygfGRxAQQYBQx0GATEzFDkeRxAGNUNFHytMGQgGKjoXBjkjBiIaBBkCATBwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXRpbC9yZWxhdGl2aXplLmRhcnQnc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9jb21waWxlci5kYXJ0mxMvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBjb21waWxlcjsKCmltcG9ydCAnZGFydDphc3luYyc7CgppbXBvcnQgJ2NvbXBpbGVyX25ldy5kYXJ0JyBhcyBuZXdfYXBpOwppbXBvcnQgJ3NyYy9vbGRfdG9fbmV3X2FwaS5kYXJ0JzsKaW1wb3J0ICdzcmMvb3B0aW9ucy5kYXJ0JyBzaG93IENvbXBpbGVyT3B0aW9uczsKCi8vIFVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWQsIHBhc3NpbmcgWzpudWxsOl0gZm9yIGFueSBhcmd1bWVudCB0byB0aGUKLy8gbWV0aG9kcyBvZiBsaWJyYXJ5IHdpbGwgcmVzdWx0IGluIGFuIEVycm9yIGJlaW5nIHRocm93bi4KCi8vLyBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgY29tcGxldGVzIHRvIHRoZSBzb3VyY2UgY29ycmVzcG9uZGluZyB0byBbdXJpXS4KLy8vIElmIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGggdGhpcyBleGNlcHRpb24uCi8vLwovLy8gVGhlIHNvdXJjZSBjYW4gYmUgcmVwcmVzZW50ZWQgZWl0aGVyIGFzIGEgWzpMaXN0PGludD46XSBvZiBVVEYtOCBieXRlcyBvciBhcwovLy8gYSBbU3RyaW5nXS4KLy8vCi8vLyBUaGUgZm9sbG93aW5nIHRleHQgaXMgbm9uLW5vcm1hdGl2ZToKLy8vCi8vLyBJdCBpcyByZWNvbW1lbmRlZCB0byByZXR1cm4gYSBVVEYtOCBlbmNvZGVkIGxpc3Qgb2YgYnl0ZXMgYmVjYXVzZSB0aGUKLy8vIHNjYW5uZXIgaXMgbW9yZSBlZmZpY2llbnQgaW4gdGhpcyBjYXNlLiBJbiBlaXRoZXIgY2FzZSwgdGhlIGRhdGEgc3RydWN0dXJlCi8vLyBpcyBleHBlY3RlZCB0byBob2xkIGEgemVybyBlbGVtZW50IGF0IHRoZSBsYXN0IHBvc2l0aW9uLiBJZiB0aGlzIGlzIG5vdCB0aGUKLy8vIGNhc2UsIHRoZSBlbnRpcmUgZGF0YSBzdHJ1Y3R1cmUgaXMgY29waWVkIGJlZm9yZSBzY2FubmluZy4KdHlwZWRlZiBGdXR1cmUgLyogPFN0cmluZyB8IExpc3Q8aW50Pj4gKi8gQ29tcGlsZXJJbnB1dFByb3ZpZGVyKFVyaSB1cmkpOwoKLy8vIERlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgW0NvbXBpbGVySW5wdXRQcm92aWRlcl0gaW5zdGVhZC4KdHlwZWRlZiBGdXR1cmU8U3RyaW5nPiBSZWFkU3RyaW5nRnJvbVVyaShVcmkgdXJpKTsKCi8vLyBSZXR1cm5zIGFuIFtFdmVudFNpbmtdIHRoYXQgd2lsbCBzZXJ2ZSBhcyBjb21waWxlciBvdXRwdXQgZm9yIHRoZSBnaXZlbgovLy8gY29tcG9uZW50LgovLy8KLy8vIENvbXBvbmVudHMgYXJlIGlkZW50aWZpZWQgYnkgW25hbWVdIGFuZCBbZXh0ZW5zaW9uXS4gQnkgY29udmVudGlvbiwKLy8vIHRoZSBlbXB0eSBzdHJpbmcgWzoiIjpdIHdpbGwgcmVwcmVzZW50IHRoZSBtYWluIHNjcmlwdAovLy8gKGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjcmlwdCBwYXJhbWV0ZXIgb2YgW2NvbXBpbGVdKSBldmVuIGlmIHRoZQovLy8gbWFpbiBzY3JpcHQgaXMgYSBsaWJyYXJ5LiBGb3IgbGlicmFyaWVzIHRoYXQgYXJlIGNvbXBpbGVkCi8vLyBzZXBhcmF0ZWx5LCB0aGUgbGlicmFyeSBuYW1lIGlzIHVzZWQuCi8vLwovLy8gQXQgbGVhc3QgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zIGNhbiBiZSBleHBlY3RlZDoKLy8vCi8vLyAqICJqcyIgZm9yIEphdmFTY3JpcHQgb3V0cHV0LgovLy8gKiAianMubWFwIiBmb3Igc291cmNlIG1hcHMuCi8vLyAqICJkYXJ0IiBmb3IgRGFydCBvdXRwdXQuCi8vLyAqICJkYXJ0Lm1hcCIgZm9yIHNvdXJjZSBtYXBzLgovLy8KLy8vIEFzIG1vcmUgZmVhdHVyZXMgYXJlIGFkZGVkIHRvIHRoZSBjb21waWxlciwgbmV3IG5hbWVzIGFuZAovLy8gZXh0ZW5zaW9ucyBtYXkgYmUgaW50cm9kdWNlZC4KdHlwZWRlZiBFdmVudFNpbms8U3RyaW5nPiBDb21waWxlck91dHB1dFByb3ZpZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgZXh0ZW5zaW9uKTsKCi8vLyBJbnZva2VkIGJ5IHRoZSBjb21waWxlciB0byByZXBvcnQgZGlhZ25vc3RpY3MuIElmIFt1cmldIGlzCi8vLyBbOm51bGw6XSwgc28gYXJlIFtiZWdpbl0gYW5kIFtlbmRdLiBObyBvdGhlciBhcmd1bWVudHMgbWF5IGJlCi8vLyBbOm51bGw6XS4gSWYgW3VyaV0gaXMgbm90IFs6bnVsbDpdLCBuZWl0aGVyIGFyZSBbYmVnaW5dIGFuZAovLy8gW2VuZF0uIFt1cmldIGluZGljYXRlcyB0aGUgY29tcGlsYXRpb24gdW5pdCBmcm9tIHdoZXJlIHRoZQovLy8gZGlhZ25vc3RpYyBvcmlnaW5hdGVzLiBbYmVnaW5dIGFuZCBbZW5kXSBhcmUgemVyby1iYXNlZCBjaGFyYWN0ZXIKLy8vIG9mZnNldHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LiBbbWVzc2FnZV0gaXMgdGhlCi8vLyBkaWFnbm9zdGljIG1lc3NhZ2UsIGFuZCBba2luZF0gaW5kaWNhdGVzIGluZGljYXRlcyB3aGF0IGtpbmQgb2YKLy8vIGRpYWdub3N0aWMgaXQgaXMuCnR5cGVkZWYgdm9pZCBEaWFnbm9zdGljSGFuZGxlcigKICAgIFVyaSB1cmksIGludCBiZWdpbiwgaW50IGVuZCwgU3RyaW5nIG1lc3NhZ2UsIERpYWdub3N0aWMga2luZCk7CgovLy8gSW5mb3JtYXRpb24gcmVzdWx0aW5nIGZyb20gdGhlIGNvbXBpbGF0aW9uLgpjbGFzcyBDb21waWxhdGlvblJlc3VsdCB7CiAgLy8vIGB0cnVlYCBpZiB0aGUgY29tcGlsYXRpb24gc3VjY2VlZGVkLCB0aGF0IGlzLCBjb21waWxhdGlvbiBkaWRuJ3QgZmFpbCBkdWUKICAvLy8gdG8gY29tcGlsZS10aW1lIGVycm9ycyBhbmQvb3IgaW50ZXJuYWwgZXJyb3JzLgogIGZpbmFsIGJvb2wgaXNTdWNjZXNzOwoKICAvLy8gVGhlIGNvbXBpbGVyIG9iamVjdCB1c2VkIGZvciB0aGUgY29tcGlsYXRpb24uCiAgLy8vCiAgLy8vIE5vdGU6IFRoZSB0eXBlIG9mIFtjb21waWxlcl0gaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IGFuZCBtYXkgdmFyeS4KICAvLy8gVXNlIG9ubHkgZm9yIGRlYnVnZ2luZyBhbmQgdGVzdGluZy4KICBmaW5hbCBjb21waWxlcjsKCiAgQ29tcGlsYXRpb25SZXN1bHQodGhpcy5jb21waWxlciwge3RoaXMuaXNTdWNjZXNzOiB0cnVlfSk7Cn0KCi8vLyBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgY29tcGxldGVzIHRvIGEgbm9uLW51bGwgU3RyaW5nIHdoZW4gW3NjcmlwdF0KLy8vIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb21waWxlZC4KLy8vCi8vLyBUaGUgY29tcGlsZXIgb3V0cHV0IGlzIG9idGFpbmVkIGJ5IHByb3ZpZGluZyBhbiBbb3V0cHV0UHJvdmlkZXJdLgovLy8KLy8vIElmIHRoZSBjb21waWxhdGlvbiBmYWlscywgdGhlIGZ1dHVyZSdzIHZhbHVlIHdpbGwgYmUgWzpudWxsOl0gYW5kCi8vLyBbaGFuZGxlcl0gd2lsbCBoYXZlIGJlZW4gaW52b2tlZCBhdCBsZWFzdCBvbmNlIHdpdGggWzpraW5kID09Ci8vLyBEaWFnbm9zdGljLkVSUk9SOl0gb3IgWzpraW5kID09IERpYWdub3N0aWMuQ1JBU0g6XS4KLy8vCi8vLyBEZXByZWNhdGVkOiBpZiBubyBbb3V0cHV0UHJvdmlkZXJdIGlzIGdpdmVuLCB0aGUgZnV0dXJlIGNvbXBsZXRlcwovLy8gdG8gdGhlIGNvbXBpbGVkIHNjcmlwdC4gVGhpcyBiZWhhdmlvciB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZQovLy8gYXMgdGhlIGNvbXBpbGVyIG1heSBjcmVhdGUgbXVsdGlwbGUgZmlsZXMgdG8gc3VwcG9ydCBsYXp5IGxvYWRpbmcKLy8vIG9mIGxpYnJhcmllcy4KRnV0dXJlPENvbXBpbGF0aW9uUmVzdWx0PiBjb21waWxlKAogICAgVXJpIHNjcmlwdCwKICAgIFVyaSBsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpLAogICAgVXJpIHBhY2thZ2VSb290LAogICAgQ29tcGlsZXJJbnB1dFByb3ZpZGVyIGlucHV0UHJvdmlkZXIsCiAgICBEaWFnbm9zdGljSGFuZGxlciBoYW5kbGVyLAogICAgW0xpc3Q8U3RyaW5nPiBvcHRpb25zID0gY29uc3QgW10sCiAgICBDb21waWxlck91dHB1dFByb3ZpZGVyIG91dHB1dFByb3ZpZGVyLAogICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCA9IGNvbnN0IHt9LAogICAgVXJpIHBhY2thZ2VDb25maWddKSB7CiAgQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IENvbXBpbGVyT3B0aW9ucy5wYXJzZShvcHRpb25zLAogICAgICBsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpOiBsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpKQogICAgLi5lbnRyeVBvaW50ID0gc2NyaXB0CiAgICAuLnBhY2thZ2VSb290ID0gcGFja2FnZVJvb3QKICAgIC4ucGFja2FnZUNvbmZpZyA9IHBhY2thZ2VDb25maWcKICAgIC4uZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKCiAgbmV3X2FwaS5Db21waWxlcklucHV0IGNvbXBpbGVySW5wdXQgPSBuZXcgTGVnYWN5Q29tcGlsZXJJbnB1dChpbnB1dFByb3ZpZGVyKTsKICBuZXdfYXBpLkNvbXBpbGVyRGlhZ25vc3RpY3MgY29tcGlsZXJEaWFnbm9zdGljcyA9CiAgICAgIG5ldyBMZWdhY3lDb21waWxlckRpYWdub3N0aWNzKGhhbmRsZXIpOwogIG5ld19hcGkuQ29tcGlsZXJPdXRwdXQgY29tcGlsZXJPdXRwdXQgPQogICAgICBuZXcgTGVnYWN5Q29tcGlsZXJPdXRwdXQob3V0cHV0UHJvdmlkZXIpOwoKICByZXR1cm4gbmV3X2FwaQogICAgICAuY29tcGlsZSgKICAgICAgICAgIGNvbXBpbGVyT3B0aW9ucywgY29tcGlsZXJJbnB1dCwgY29tcGlsZXJEaWFnbm9zdGljcywgY29tcGlsZXJPdXRwdXQpCiAgICAgIC50aGVuKChuZXdfYXBpLkNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCkgewogICAgcmV0dXJuIG5ldyBDb21waWxhdGlvblJlc3VsdChyZXN1bHQuY29tcGlsZXIsIGlzU3VjY2VzczogcmVzdWx0LmlzU3VjY2Vzcyk7CiAgfSk7Cn0KCi8vLyBLaW5kIG9mIGRpYWdub3N0aWNzIHRoYXQgdGhlIGNvbXBpbGVyIGNhbiByZXBvcnQuCmNsYXNzIERpYWdub3N0aWMgewogIC8vLyBBbiBlcnJvciBhcyBpZGVudGlmaWVkIGJ5IHRoZSAiRGFydCBQcm9ncmFtbWluZyBMYW5ndWFnZQogIC8vLyBTcGVjaWZpY2F0aW9uIiBbaHR0cDovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9zcGVjL10uCiAgLy8vCiAgLy8vIE5vdGU6IHRoZSBjb21waWxlciBtYXkgc3RpbGwgcHJvZHVjZSBhbiBleGVjdXRhYmxlIHJlc3VsdCBhZnRlcgogIC8vLyByZXBvcnRpbmcgYSBjb21waWxhdGlvbiBlcnJvci4gVGhlIHNwZWNpZmljYXRpb24gc2F5czoKICAvLy8KICAvLy8gIkEgY29tcGlsZS10aW1lIGVycm9yIG11c3QgYmUgcmVwb3J0ZWQgYnkgYSBEYXJ0IGNvbXBpbGVyIGJlZm9yZQogIC8vLyB0aGUgZXJyb25lb3VzIGNvZGUgaXMgZXhlY3V0ZWQuIiBhbmQgIklmIGEgY29tcGlsZS10aW1lIGVycm9yCiAgLy8vIG9jY3VycyB3aXRoaW4gdGhlIGNvZGUgb2YgYSBydW5uaW5nIGlzb2xhdGUgQSwgQSBpcyBpbW1lZGlhdGVseQogIC8vLyBzdXNwZW5kZWQuIgogIC8vLwogIC8vLyBUaGlzIG1lYW5zIHRoYXQgdGhlIGNvbXBpbGVyIGNhbiBnZW5lcmF0ZSBjb2RlIHRoYXQgd2hlbiBleGVjdXRlZAogIC8vLyB0ZXJtaW5hdGVzIGV4ZWN1dGlvbi4KICBzdGF0aWMgY29uc3QgRGlhZ25vc3RpYyBFUlJPUiA9IGNvbnN0IERpYWdub3N0aWMoMSwgJ2Vycm9yJyk7CgogIC8vLyBBIHdhcm5pbmcgYXMgaWRlbnRpZmllZCBieSB0aGUgIkRhcnQgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UKICAvLy8gU3BlY2lmaWNhdGlvbiIgW2h0dHA6Ly93d3cuZGFydGxhbmcub3JnL2RvY3Mvc3BlYy9dLgogIHN0YXRpYyBjb25zdCBEaWFnbm9zdGljIFdBUk5JTkcgPSBjb25zdCBEaWFnbm9zdGljKDIsICd3YXJuaW5nJyk7CgogIC8vLyBBbnkgb3RoZXIgd2FybmluZyB0aGF0IGlzIG5vdCBjb3ZlcmVkIGJ5IFtXQVJOSU5HXS4KICBzdGF0aWMgY29uc3QgRGlhZ25vc3RpYyBISU5UID0gY29uc3QgRGlhZ25vc3RpYyg0LCAnaGludCcpOwoKICAvLy8gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJlY2VkaW5nIG5vbi1pbmZvIGRpYWdub3N0aWMgZnJvbSB0aGUKICAvLy8gY29tcGlsZXIuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlLCBjb25zaWRlciBhIGR1cGxpY2F0ZWQgZGVmaW5pdGlvbi4gVGhlIGNvbXBpbGVyIGZpcnN0IGVtaXRzIGEKICAvLy8gbWVzc2FnZSBhYm91dCB0aGUgZHVwbGljYXRlZCBkZWZpbml0aW9uLCB0aGVuIGVtaXRzIGFuIGluZm8gbWVzc2FnZSBhYm91dAogIC8vLyB0aGUgbG9jYXRpb24gb2YgdGhlIGV4aXN0aW5nIGRlZmluaXRpb24uCiAgc3RhdGljIGNvbnN0IERpYWdub3N0aWMgSU5GTyA9IGNvbnN0IERpYWdub3N0aWMoOCwgJ2luZm8nKTsKCiAgLy8vIEluZm9ybWF0aW9uYWwgbWVzc2FnZXMgdGhhdCBzaG91bGRuJ3QgYmUgcHJpbnRlZCB1bmxlc3MKICAvLy8gZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIgb2YgYSBjb21waWxlci4KICBzdGF0aWMgY29uc3QgRGlhZ25vc3RpYyBWRVJCT1NFX0lORk8gPSBjb25zdCBEaWFnbm9zdGljKDE2LCAndmVyYm9zZSBpbmZvJyk7CgogIC8vLyBBbiBpbnRlcm5hbCBlcnJvciBpbiB0aGUgY29tcGlsZXIuCiAgc3RhdGljIGNvbnN0IERpYWdub3N0aWMgQ1JBU0ggPSBjb25zdCBEaWFnbm9zdGljKDMyLCAnY3Jhc2gnKTsKCiAgLy8vIEFuIFtpbnRdIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMga2luZC4gVGhlIG9yZGluYWxzIGFyZSBkZXNpZ25lZAogIC8vLyB0byBiZSB1c2VkIGFzIGJpdHNldHMuCiAgZmluYWwgaW50IG9yZGluYWw7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGlzIGtpbmQuCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8vLyBUaGlzIGNvbnN0cnVjdG9yIGlzIG5vdCBwcml2YXRlIHRvIHN1cHBvcnQgdXNlci1kZWZpbmVkCiAgLy8vIGRpYWdub3N0aWMga2luZHMuCiAgY29uc3QgRGlhZ25vc3RpYyh0aGlzLm9yZGluYWwsIHRoaXMubmFtZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7Cn0KgLEATk48ARIBFQEnIjABRzwBSkYEURAEKQRKT1A/SgE8MwFMDwRIO0U+KgQ3BCIgHiIEPiJRAT9CQD9GSUQWIEMBMBpQNRgBNAZNKhIBPAIBRyQERgRGQjgERkhGEiMQIxUpHyYrMBpDPBogJCEBUDQuKjABERBPMVAGAgE2Ez87BkY9BkdERhIGSBxAAUA7RAE6PgFOEAZQUC8+AT42TwEpQQFGHRUBHRUBPhgtAQwdAgEecGFja2FnZTpjb21waWxlci9jb21waWxlci5kYXJ0KnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2FwaWltcGwuZGFydKLfLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgbGVnX2FwaWltcGw7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyB1dGY4OwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcKICAgIHNob3cgZ2V0U3VwcG9ydGVkTGlicmFyeU5hbWVzOwoKaW1wb3J0ICcuLi9jb21waWxlcl9uZXcuZGFydCcgYXMgYXBpOwppbXBvcnQgJ2NvbW1vbi90YXNrcy5kYXJ0JyBzaG93IEdlbmVyaWNUYXNrLCBNZWFzdXJlcjsKaW1wb3J0ICdjb21tb24uZGFydCc7CmltcG9ydCAnY29tcGlsZXIuZGFydCc7CmltcG9ydCAnZGlhZ25vc3RpY3MvbWVzc2FnZXMuZGFydCcgc2hvdyBNZXNzYWdlOwppbXBvcnQgJ2Vudmlyb25tZW50LmRhcnQnOwppbXBvcnQgJ2lvL3NvdXJjZV9maWxlLmRhcnQnOwppbXBvcnQgJ29wdGlvbnMuZGFydCcgc2hvdyBDb21waWxlck9wdGlvbnM7CgovLy8gSW1wbGVtZW50cyB0aGUgW0NvbXBpbGVyXSB1c2luZyBhIFthcGkuQ29tcGlsZXJJbnB1dF0gZm9yIHN1cHBseWluZyB0aGUKLy8vIHNvdXJjZXMuCmNsYXNzIENvbXBpbGVySW1wbCBleHRlbmRzIENvbXBpbGVyIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBNZWFzdXJlciBtZWFzdXJlcjsKICBAb3ZlcnJpZGUKICBhcGkuQ29tcGlsZXJJbnB1dCBwcm92aWRlcjsKICBhcGkuQ29tcGlsZXJEaWFnbm9zdGljcyBoYW5kbGVyOwoKICBHZW5lcmljVGFzayB1c2VySGFuZGxlclRhc2s7CiAgR2VuZXJpY1Rhc2sgdXNlclByb3ZpZGVyVGFzazsKCiAgQ29tcGlsZXJJbXBsKHRoaXMucHJvdmlkZXIsIGFwaS5Db21waWxlck91dHB1dCBvdXRwdXRQcm92aWRlciwgdGhpcy5oYW5kbGVyLAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAge01ha2VSZXBvcnRlckZ1bmN0aW9uIG1ha2VSZXBvcnRlcn0pCiAgICAgIC8vIE5PVEU6IGFsbG9jYXRpbmcgbWVhc3VyZXIgaXMgZG9uZSB1cGZyb250IHRvIGVuc3VyZSB0aGUgd2FsbGNsb2NrIGlzCiAgICAgIC8vIHN0YXJ0ZWQgYmVmb3JlIG90aGVyIGNvbXB1dGF0aW9ucy4KICAgICAgOiBtZWFzdXJlciA9IG5ldyBNZWFzdXJlcihlbmFibGVUYXNrTWVhc3VyZW1lbnRzOiBvcHRpb25zLnZlcmJvc2UpLAogICAgICAgIHN1cGVyKAogICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLAogICAgICAgICAgICBvdXRwdXRQcm92aWRlcjogb3V0cHV0UHJvdmlkZXIsCiAgICAgICAgICAgIGVudmlyb25tZW50OiBuZXcgX0Vudmlyb25tZW50KG9wdGlvbnMuZW52aXJvbm1lbnQpLAogICAgICAgICAgICBtYWtlUmVwb3J0ZXI6IG1ha2VSZXBvcnRlcikgewogICAgdGFza3MuYWRkQWxsKFsKICAgICAgdXNlckhhbmRsZXJUYXNrID0gbmV3IEdlbmVyaWNUYXNrKCdEaWFnbm9zdGljIGhhbmRsZXInLCBtZWFzdXJlciksCiAgICAgIHVzZXJQcm92aWRlclRhc2sgPSBuZXcgR2VuZXJpY1Rhc2soJ0lucHV0IHByb3ZpZGVyJywgbWVhc3VyZXIpLAogICAgXSk7CiAgfQoKICB2b2lkIGxvZyhtZXNzYWdlKSB7CiAgICBjYWxsVXNlckhhbmRsZXIoCiAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbWVzc2FnZSwgYXBpLkRpYWdub3N0aWMuVkVSQk9TRV9JTkZPKTsKICB9CgogIEZ1dHVyZSBzZXR1cFNkaygpIHsKICAgIHZhciBmdXR1cmUgPSBuZXcgRnV0dXJlLnZhbHVlKG51bGwpOwogICAgX0Vudmlyb25tZW50IGVudiA9IGVudmlyb25tZW50OwogICAgaWYgKGVudi5zdXBwb3J0ZWRMaWJyYXJpZXMgPT0gbnVsbCkgewogICAgICBmdXR1cmUgPSBmdXR1cmUudGhlbigoXykgewogICAgICAgIFVyaSBzcGVjaWZpY2F0aW9uVXJpID0gb3B0aW9ucy5saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpOwogICAgICAgIHJldHVybiBwcm92aWRlci5yZWFkRnJvbVVyaShzcGVjaWZpY2F0aW9uVXJpKS50aGVuKChhcGkuSW5wdXQgc3BlYykgewogICAgICAgICAgU3RyaW5nIGpzb24gPSBudWxsOwogICAgICAgICAgLy8gVE9ETyhzaWdtdW5kKTogc2ltcGxpZnkgdGhpcywgd2UgaGF2ZSBzb21lIEFQSSBpbmNvbnNpc3RlbmNpZXMgd2hlbgogICAgICAgICAgLy8gb3VyIGludGVybmFsIGlucHV0IGFkZHMgYSB0ZXJtaW5hdGluZyB6ZXJvLgogICAgICAgICAgaWYgKHNwZWMgaXMgU291cmNlRmlsZSkgewogICAgICAgICAgICBqc29uID0gc3BlYy5zbG93VGV4dCgpOwogICAgICAgICAgfSBlbHNlIGlmIChzcGVjIGlzIEJpbmFyeSkgewogICAgICAgICAgICBqc29uID0gdXRmOC5kZWNvZGUoc3BlYy5kYXRhKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBUT0RPKHNpZ211bmQpOiB3b3VsZCBiZSBuaWNlIHRvIGZyb250LWxvYWQgc29tZSBvZiB0aGUgQ0ZFIG9wdGlvbgogICAgICAgICAgLy8gcHJvY2Vzc2luZyBhbmQgcGFyc2UgdGhpcyAuanNvbiBmaWxlIG9ubHkgb25jZS4KICAgICAgICAgIGVudi5zdXBwb3J0ZWRMaWJyYXJpZXMgPSBnZXRTdXBwb3J0ZWRMaWJyYXJ5TmFtZXMoc3BlY2lmaWNhdGlvblVyaSwKICAgICAgICAgICAgICAgICAganNvbiwgb3B0aW9ucy5jb21waWxlRm9yU2VydmVyID8gImRhcnQyanNfc2VydmVyIiA6ICJkYXJ0MmpzIikKICAgICAgICAgICAgICAudG9TZXQoKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIGRvZXMgbm90IGFwcGx5IGFueW1vcmUuCiAgICAvLyBUaGUgaW5jcmVtZW50YWwgY29tcGlsZXIgc2V0cyB1cCB0aGUgc2RrIGJlZm9yZSBydW4uCiAgICAvLyBUaGVyZWZvcmUgdGhpcyB3aWxsIGJlIGNhbGxlZCBhIHNlY29uZCB0aW1lLgogICAgcmV0dXJuIGZ1dHVyZTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxib29sPiBydW4oVXJpIHVyaSkgewogICAgRHVyYXRpb24gc2V0dXBEdXJhdGlvbiA9IG1lYXN1cmVyLmVsYXBzZWRXYWxsQ2xvY2s7CiAgICByZXR1cm4gc2VsZlRhc2subWVhc3VyZVN1YnRhc2soImltcGwucnVuIiwgKCkgewogICAgICByZXR1cm4gc2V0dXBTZGsoKS50aGVuKChfKSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLnJ1bih1cmkpOwogICAgICB9KS50aGVuKChib29sIHN1Y2Nlc3MpIHsKICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7CiAgICAgICAgICBTdHJpbmdCdWZmZXIgdGltaW5ncyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgIGNvbXB1dGVUaW1pbmdzKHNldHVwRHVyYXRpb24sIHRpbWluZ3MpOwogICAgICAgICAgbG9nKCIkdGltaW5ncyIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIFN0cmluZyBfZm9ybWF0TXMoaW50IG1zKSB7CiAgICByZXR1cm4gKG1zIC8gMTAwMCkudG9TdHJpbmdBc0ZpeGVkKDMpICsgJ3MnOwogIH0KCiAgdm9pZCBjb21wdXRlVGltaW5ncyhEdXJhdGlvbiBzZXR1cER1cmF0aW9uLCBTdHJpbmdCdWZmZXIgdGltaW5ncykgewogICAgdGltaW5ncy53cml0ZWxuKCJUaW1pbmdzOiIpOwogICAgRHVyYXRpb24gdG90YWxEdXJhdGlvbiA9IG1lYXN1cmVyLmVsYXBzZWRXYWxsQ2xvY2s7CiAgICBEdXJhdGlvbiBhc3luY0R1cmF0aW9uID0gbWVhc3VyZXIuZWxhcHNlZEFzeW5jV2FsbENsb2NrOwogICAgRHVyYXRpb24gY3VtdWxhdGVkRHVyYXRpb24gPSBEdXJhdGlvbi56ZXJvOwogICAgTGlzdDxfVGltaW5nRGF0YT4gdGltaW5nRGF0YSA9IFtdOwogICAgZm9yIChmaW5hbCB0YXNrIGluIHRhc2tzKSB7CiAgICAgIFN0cmluZyBydW5uaW5nID0gdGFzay5pc1J1bm5pbmcgPyAiKiIgOiAiICI7CiAgICAgIER1cmF0aW9uIGR1cmF0aW9uID0gdGFzay5kdXJhdGlvbjsKICAgICAgaWYgKGR1cmF0aW9uICE9IER1cmF0aW9uLnplcm8pIHsKICAgICAgICBjdW11bGF0ZWREdXJhdGlvbiArPSBkdXJhdGlvbjsKICAgICAgICBpbnQgbWlsbGlzZWNvbmRzID0gZHVyYXRpb24uaW5NaWxsaXNlY29uZHM7CiAgICAgICAgdGltaW5nRGF0YS5hZGQoX1RpbWluZ0RhdGEoJyAgICRydW5uaW5nJHt0YXNrLm5hbWV9OicsIG1pbGxpc2Vjb25kcywKICAgICAgICAgICAgbWlsbGlzZWNvbmRzICogMTAwIC8gdG90YWxEdXJhdGlvbi5pbk1pbGxpc2Vjb25kcykpOwogICAgICAgIGZvciAoU3RyaW5nIHN1YnRhc2sgaW4gdGFzay5zdWJ0YXNrcykgewogICAgICAgICAgaW50IHN1YnRpbWUgPSB0YXNrLmdldFN1YnRhc2tUaW1lKHN1YnRhc2spOwogICAgICAgICAgU3RyaW5nIHJ1bm5pbmcgPSB0YXNrLmdldFN1YnRhc2tJc1J1bm5pbmcoc3VidGFzaykgPyAiKiIgOiAiICI7CiAgICAgICAgICB0aW1pbmdEYXRhLmFkZChfVGltaW5nRGF0YSgnICAgJHJ1bm5pbmcke3Rhc2submFtZX0gPiAkc3VidGFzazonLAogICAgICAgICAgICAgIHN1YnRpbWUsIHN1YnRpbWUgKiAxMDAgLyB0b3RhbER1cmF0aW9uLmluTWlsbGlzZWNvbmRzKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpbnQgbG9uZ2VzdERlc2NyaXB0aW9uID0gdGltaW5nRGF0YQogICAgICAgIC5tYXAoKGQpID0+IGQuZGVzY3JpcHRpb24ubGVuZ3RoKQogICAgICAgIC5mb2xkKDAsIChhLCBiKSA9PiBhIDwgYiA/IGIgOiBhKTsKICAgIGZvciAodmFyIGRhdGEgaW4gdGltaW5nRGF0YSkgewogICAgICB2YXIgbXMgPSBfZm9ybWF0TXMoZGF0YS5taWxsaXNlY29uZHMpOwogICAgICB2YXIgcGFkZGluZyA9CiAgICAgICAgICAiICIgKiAobG9uZ2VzdERlc2NyaXB0aW9uICsgMTAgLSBkYXRhLmRlc2NyaXB0aW9uLmxlbmd0aCAtIG1zLmxlbmd0aCk7CiAgICAgIHZhciBwZXJjZW50UGFkZGluZyA9IGRhdGEucGVyY2VudCA8IDEwID8gIiAiIDogIiI7CiAgICAgIHRpbWluZ3Mud3JpdGVsbignJHtkYXRhLmRlc2NyaXB0aW9ufSRwYWRkaW5nICRtcyAnCiAgICAgICAgICAnJHBlcmNlbnRQYWRkaW5nKCR7ZGF0YS5wZXJjZW50LnRvU3RyaW5nQXNGaXhlZCgxKX0lKScpOwogICAgfQogICAgRHVyYXRpb24gdW5hY2NvdW50ZWREdXJhdGlvbiA9CiAgICAgICAgdG90YWxEdXJhdGlvbiAtIGN1bXVsYXRlZER1cmF0aW9uIC0gc2V0dXBEdXJhdGlvbiAtIGFzeW5jRHVyYXRpb247CiAgICBkb3VibGUgcGVyY2VudCA9CiAgICAgICAgdW5hY2NvdW50ZWREdXJhdGlvbi5pbk1pbGxpc2Vjb25kcyAqIDEwMCAvIHRvdGFsRHVyYXRpb24uaW5NaWxsaXNlY29uZHM7CiAgICB0aW1pbmdzLndyaXRlKAogICAgICAgICcgICAgVG90YWwgY29tcGlsZS10aW1lICR7X2Zvcm1hdE1zKHRvdGFsRHVyYXRpb24uaW5NaWxsaXNlY29uZHMpfTsnCiAgICAgICAgJyBzZXR1cCAke19mb3JtYXRNcyhzZXR1cER1cmF0aW9uLmluTWlsbGlzZWNvbmRzKX07JwogICAgICAgICcgYXN5bmMgJHtfZm9ybWF0TXMoYXN5bmNEdXJhdGlvbi5pbk1pbGxpc2Vjb25kcyl9OycKICAgICAgICAnIHVuYWNjb3VudGVkICR7X2Zvcm1hdE1zKHVuYWNjb3VudGVkRHVyYXRpb24uaW5NaWxsaXNlY29uZHMpfScKICAgICAgICAnICgke3BlcmNlbnQudG9TdHJpbmdBc0ZpeGVkKDIpfSUpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlcG9ydERpYWdub3N0aWMoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSwKICAgICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MsIGFwaS5EaWFnbm9zdGljIGtpbmQpIHsKICAgIF9yZXBvcnREaWFnbm9zdGljTWVzc2FnZShtZXNzYWdlLCBraW5kKTsKICAgIGZvciAoRGlhZ25vc3RpY01lc3NhZ2UgaW5mbyBpbiBpbmZvcykgewogICAgICBfcmVwb3J0RGlhZ25vc3RpY01lc3NhZ2UoaW5mbywgYXBpLkRpYWdub3N0aWMuSU5GTyk7CiAgICB9CiAgfQoKICB2b2lkIF9yZXBvcnREaWFnbm9zdGljTWVzc2FnZSgKICAgICAgRGlhZ25vc3RpY01lc3NhZ2UgZGlhZ25vc3RpY01lc3NhZ2UsIGFwaS5EaWFnbm9zdGljIGtpbmQpIHsKICAgIC8vIFs6c3Bhbi51cmk6XSBtaWdodCBiZSBbOm51bGw6XSBpbiBjYXNlIG9mIGEgW1NjcmlwdF0gd2l0aCBubyBbdXJpXS4gRm9yCiAgICAvLyBpbnN0YW5jZSBpbiB0aGUgW1R5cGVzXSBjb25zdHJ1Y3RvciBpbiB0eXBlY2hlY2tlci5kYXJ0LgogICAgU291cmNlU3BhbiBzcGFuID0gZGlhZ25vc3RpY01lc3NhZ2Uuc291cmNlU3BhbjsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGRpYWdub3N0aWNNZXNzYWdlLm1lc3NhZ2U7CiAgICBpZiAoc3BhbiA9PSBudWxsIHx8IHNwYW4udXJpID09IG51bGwpIHsKICAgICAgY2FsbFVzZXJIYW5kbGVyKG1lc3NhZ2UsIG51bGwsIG51bGwsIG51bGwsICckbWVzc2FnZScsIGtpbmQpOwogICAgfSBlbHNlIHsKICAgICAgY2FsbFVzZXJIYW5kbGVyKAogICAgICAgICAgbWVzc2FnZSwgc3Bhbi51cmksIHNwYW4uYmVnaW4sIHNwYW4uZW5kLCAnJG1lc3NhZ2UnLCBraW5kKTsKICAgIH0KICB9CgogIHZvaWQgY2FsbFVzZXJIYW5kbGVyKE1lc3NhZ2UgbWVzc2FnZSwgVXJpIHVyaSwgaW50IGJlZ2luLCBpbnQgZW5kLAogICAgICBTdHJpbmcgdGV4dCwgYXBpLkRpYWdub3N0aWMga2luZCkgewogICAgdHJ5IHsKICAgICAgdXNlckhhbmRsZXJUYXNrLm1lYXN1cmUoKCkgewogICAgICAgIGhhbmRsZXIucmVwb3J0KG1lc3NhZ2UsIHVyaSwgYmVnaW4sIGVuZCwgdGV4dCwga2luZCk7CiAgICAgIH0pOwogICAgfSBjYXRjaCAoZXgsIHMpIHsKICAgICAgcmVwb3J0Q3Jhc2hJblVzZXJDb2RlKCdVbmNhdWdodCBleGNlcHRpb24gaW4gZGlhZ25vc3RpYyBoYW5kbGVyJywgZXgsIHMpOwogICAgICByZXRocm93OwogICAgfQogIH0KCiAgRnV0dXJlPGFwaS5JbnB1dD4gY2FsbFVzZXJQcm92aWRlcihVcmkgdXJpLCBhcGkuSW5wdXRLaW5kIGlucHV0S2luZCkgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHVzZXJQcm92aWRlclRhc2sKICAgICAgICAgIC5tZWFzdXJlSW8oKCkgPT4gcHJvdmlkZXIucmVhZEZyb21VcmkodXJpLCBpbnB1dEtpbmQ6IGlucHV0S2luZCkpOwogICAgfSBjYXRjaCAoZXgsIHMpIHsKICAgICAgcmVwb3J0Q3Jhc2hJblVzZXJDb2RlKCdVbmNhdWdodCBleGNlcHRpb24gaW4gaW5wdXQgcHJvdmlkZXInLCBleCwgcyk7CiAgICAgIHJldGhyb3c7CiAgICB9CiAgfQp9CgpjbGFzcyBfRW52aXJvbm1lbnQgaW1wbGVtZW50cyBFbnZpcm9ubWVudCB7CiAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBkZWZpbml0aW9uczsKICBNYXA8U3RyaW5nLCBTdHJpbmc+IF9jb21wbGV0ZU1hcDsKICBTZXQ8U3RyaW5nPiBzdXBwb3J0ZWRMaWJyYXJpZXM7CgogIF9FbnZpcm9ubWVudCh0aGlzLmRlZmluaXRpb25zKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZhbHVlT2YoU3RyaW5nIG5hbWUpIHsKICAgIGlmIChfY29tcGxldGVNYXAgIT0gbnVsbCkgcmV0dXJuIF9jb21wbGV0ZU1hcFtuYW1lXTsKICAgIHZhciByZXN1bHQgPSBkZWZpbml0aW9uc1tuYW1lXTsKICAgIGlmIChyZXN1bHQgIT0gbnVsbCB8fCBkZWZpbml0aW9ucy5jb250YWluc0tleShuYW1lKSkgcmV0dXJuIHJlc3VsdDsKICAgIGlmICghbmFtZS5zdGFydHNXaXRoKF9kYXJ0TGlicmFyeUVudmlyb25tZW50UHJlZml4KSkgcmV0dXJuIG51bGw7CgogICAgU3RyaW5nIGxpYnJhcnlOYW1lID0gbmFtZS5zdWJzdHJpbmcoX2RhcnRMaWJyYXJ5RW52aXJvbm1lbnRQcmVmaXgubGVuZ3RoKTsKCiAgICAvLyBQcml2YXRlIGxpYnJhcmllcyBhcmUgbm90IGV4cG9zZWQgdG8gdGhlIHVzZXJzLgogICAgaWYgKGxpYnJhcnlOYW1lLnN0YXJ0c1dpdGgoIl8iKSkgcmV0dXJuIG51bGw7CiAgICBpZiAoc3VwcG9ydGVkTGlicmFyaWVzLmNvbnRhaW5zKGxpYnJhcnlOYW1lKSkgcmV0dXJuICJ0cnVlIjsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPFN0cmluZywgU3RyaW5nPiB0b01hcCgpIHsKICAgIGlmIChfY29tcGxldGVNYXAgPT0gbnVsbCkgewogICAgICBfY29tcGxldGVNYXAgPSBuZXcgTWFwPFN0cmluZywgU3RyaW5nPi5mcm9tKGRlZmluaXRpb25zKTsKICAgICAgZm9yIChTdHJpbmcgbGlicmFyeU5hbWUgaW4gc3VwcG9ydGVkTGlicmFyaWVzKSB7CiAgICAgICAgaWYgKCFsaWJyYXJ5TmFtZS5zdGFydHNXaXRoKCJfIikpIHsKICAgICAgICAgIFN0cmluZyBrZXkgPSAnJHtfZGFydExpYnJhcnlFbnZpcm9ubWVudFByZWZpeH0ke2xpYnJhcnlOYW1lfSc7CiAgICAgICAgICBpZiAoIWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgICAgICAgX2NvbXBsZXRlTWFwW2tleV0gPSAidHJ1ZSI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2NvbXBsZXRlTWFwOwogIH0KfQoKLy8vIEZvciBldmVyeSAnZGFydDonIGxpYnJhcnksIGEgY29ycmVzcG9uZGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQKLy8vIHRvICJ0cnVlIi4gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlJ3MgbmFtZSBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZgovLy8gdGhpcyBwcmVmaXggYW5kIHRoZSBuYW1lICh3aXRob3V0IHRoZSAnZGFydDonLgovLy8KLy8vIEZvciBleGFtcGxlICdkYXJ0Omh0bWwnIGhhcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ2RhcnQubGlicmFyeS5odG1sJyBzZXQKLy8vIHRvICJ0cnVlIi4KY29uc3QgU3RyaW5nIF9kYXJ0TGlicmFyeUVudmlyb25tZW50UHJlZml4ID0gJ2RhcnQubGlicmFyeS4nOwoKY2xhc3MgX1RpbWluZ0RhdGEgewogIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKICBmaW5hbCBpbnQgbWlsbGlzZWNvbmRzOwogIGZpbmFsIGRvdWJsZSBwZXJjZW50OwoKICBfVGltaW5nRGF0YSh0aGlzLmRlc2NyaXB0aW9uLCB0aGlzLm1pbGxpc2Vjb25kcywgdGhpcy5wZXJjZW50KTsKfQqA/QBOTjwBFQEVIQE5IwEmNxYYMRseLAFMDSYMGwweIwEfIAFPHytOLEoPHixAKhNJRggEARYVRwQBFikkKiFCTh5ROSQkJysMAU89TlEYDAoGOTw0EwQBDB44NCMfHx81MhsKGAoIBAEdMQQBRiE4PTAnIDMpJyc0TUEwNkpMRwoIBigqKyMtFFE5OUMGI0sVURNNPT1ILgQBDDM8LSw7BgQBIUJPQDQxLEQNF0YGBAFFKgojPgoWUA8GBAFJCh5NFkwPBgQCASwpJCIBIgEMIDkkSEYBTwE3MkERBAEMICBANyxJLygMCggGGQQCAUtHMwRRDz4BFBwaGAFCAgEhcGFja2FnZTpjb21waWxlci9zcmMvYXBpaW1wbC5kYXJ0KXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbG9ycy5kYXJ0hO4vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmNvbG9yczsKCi8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjQ1NJX2NvZGVzCmNvbnN0IFN0cmluZyBSRVNFVCA9ICdcdTAwMWJbMG0nOwoKLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNDb2xvcnMKY29uc3QgU3RyaW5nIEJMQUNLX0NPTE9SID0gJ1x1MDAxYlszMG0nOwpjb25zdCBTdHJpbmcgUkVEX0NPTE9SID0gJ1x1MDAxYlszMW0nOwpjb25zdCBTdHJpbmcgR1JFRU5fQ09MT1IgPSAnXHUwMDFiWzMybSc7CmNvbnN0IFN0cmluZyBZRUxMT1dfQ09MT1IgPSAnXHUwMDFiWzMzbSc7CmNvbnN0IFN0cmluZyBCTFVFX0NPTE9SID0gJ1x1MDAxYlszNG0nOwpjb25zdCBTdHJpbmcgTUFHRU5UQV9DT0xPUiA9ICdcdTAwMWJbMzVtJzsKY29uc3QgU3RyaW5nIENZQU5fQ09MT1IgPSAnXHUwMDFiWzM2bSc7CmNvbnN0IFN0cmluZyBXSElURV9DT0xPUiA9ICdcdTAwMWJbMzdtJzsKClN0cmluZyB3cmFwKFN0cmluZyBzdHJpbmcsIFN0cmluZyBjb2xvcikgPT4gIiR7Y29sb3J9JHN0cmluZyR7UkVTRVR9IjsKClN0cmluZyBibGFjayhTdHJpbmcgc3RyaW5nKSA9PiB3cmFwKHN0cmluZywgQkxBQ0tfQ09MT1IpOwpTdHJpbmcgcmVkKFN0cmluZyBzdHJpbmcpID0+IHdyYXAoc3RyaW5nLCBSRURfQ09MT1IpOwpTdHJpbmcgZ3JlZW4oU3RyaW5nIHN0cmluZykgPT4gd3JhcChzdHJpbmcsIEdSRUVOX0NPTE9SKTsKU3RyaW5nIHllbGxvdyhTdHJpbmcgc3RyaW5nKSA9PiB3cmFwKHN0cmluZywgWUVMTE9XX0NPTE9SKTsKU3RyaW5nIGJsdWUoU3RyaW5nIHN0cmluZykgPT4gd3JhcChzdHJpbmcsIEJMVUVfQ09MT1IpOwpTdHJpbmcgbWFnZW50YShTdHJpbmcgc3RyaW5nKSA9PiB3cmFwKHN0cmluZywgTUFHRU5UQV9DT0xPUik7ClN0cmluZyBjeWFuKFN0cmluZyBzdHJpbmcpID0+IHdyYXAoc3RyaW5nLCBDWUFOX0NPTE9SKTsKU3RyaW5nIHdoaXRlKFN0cmluZyBzdHJpbmcpID0+IHdyYXAoc3RyaW5nLCBXSElURV9DT0xPUik7Ch8ATk48ARgBPyIBPCknKSooKygpAUcBOjY6PDg+ODoBIHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbG9ycy5kYXJ0MXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lvL3NvdXJjZV9maWxlLmRhcnSixy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuaW8uc291cmNlX2ZpbGU7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyB1dGY4OwppbXBvcnQgJ2RhcnQ6bWF0aCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGtlcm5lbCBzaG93IExvY2F0aW9uLCBTb3VyY2U7CgppbXBvcnQgJ2xvY2F0aW9uX3Byb3ZpZGVyLmRhcnQnIHNob3cgTG9jYXRpb25Qcm92aWRlcjsKaW1wb3J0ICcuLi8uLi9jb21waWxlcl9uZXcuZGFydCc7CgovLy8gUmVwcmVzZW50cyBhIGZpbGUgb2Ygc291cmNlIGNvZGUuIFRoZSBjb250ZW50IGNhbiBiZSBlaXRoZXIgYSBbU3RyaW5nXSBvcgovLy8gYSBVVEYtOCBlbmNvZGVkIFtMaXN0PGludD5dIG9mIGJ5dGVzLgphYnN0cmFjdCBjbGFzcyBTb3VyY2VGaWxlPFQ+IGltcGxlbWVudHMgSW5wdXQ8VD4sIExvY2F0aW9uUHJvdmlkZXIgewogIC8vLyBUaGUgYWJzb2x1dGUgVVJJIG9mIHRoZSBzb3VyY2UgZmlsZS4KICBAb3ZlcnJpZGUKICBVcmkgZ2V0IHVyaTsKCiAgQG92ZXJyaWRlCiAgSW5wdXRLaW5kIGdldCBpbnB1dEtpbmQgPT4gSW5wdXRLaW5kLlVURjg7CgogIGtlcm5lbC5Tb3VyY2UgY2FjaGVkS2VybmVsU291cmNlOwoKICBrZXJuZWwuU291cmNlIGdldCBrZXJuZWxTb3VyY2UgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBTb3VyY2Ugb2JqZWN0LAogICAgLy8gd2Ugc2hvdWxkIHVzZSB0aGUgb25lIHByb3ZpZGVkIGJ5IHRoZSBmcm9udC1lbmQuCiAgICByZXR1cm4gY2FjaGVkS2VybmVsU291cmNlID8/PSBuZXcga2VybmVsLlNvdXJjZSgKICAgICAgICBsaW5lU3RhcnRzLAogICAgICAgIHNsb3dVdGY4WmVyb1Rlcm1pbmF0ZWRCeXRlcygpLAogICAgICAgIHVyaSAvKiBUT0RPKGplbnNqKTogV2hhdCBpcyB0aGUgaW1wb3J0IFVSST8gKi8sCiAgICAgICAgdXJpKQogICAgICAuLmNhY2hlZFRleHQgPSBzbG93VGV4dCgpOwogIH0KCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBmaWxlLgogIC8vLwogIC8vLyBUaGlzIGlzIFt1cmldLCBtYXliZSByZWxhdGl2aXplZCB0byBhIG1vcmUgaHVtYW4tcmVhZGFibGUgZm9ybS4KICBTdHJpbmcgZ2V0IGZpbGVuYW1lID0+IHVyaS50b1N0cmluZygpOwoKICAvLy8gVGhlIHRleHQgY29udGVudCBvZiB0aGUgZmlsZSByZXByZXNlbnRlZCBhcyBhIFN0cmluZwogIFN0cmluZyBzbG93VGV4dCgpOwoKICAvLy8gVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgcmVwcmVzZW50ZWQgYXMgYSBVVEYtOCBlbmNvZGVkIFtMaXN0PGludD5dLAogIC8vLyB0ZXJtaW5hdGVkIHdpdGggYSB0cmFpbGluZyAwIGJ5dGUuCiAgTGlzdDxpbnQ+IHNsb3dVdGY4WmVyb1Rlcm1pbmF0ZWRCeXRlcygpOwoKICAvLy8gVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc291cmNlIGZpbGUsIGkuZS4sCiAgLy8vIGVxdWl2YWxlbnQgdG8gWzpzbG93VGV4dCgpLmxlbmd0aDpdLCBidXQgZmFzdGVyLgogIGludCBnZXQgbGVuZ3RoOwoKICAvLy8gU2V0cyB0aGUgc3RyaW5nIGxlbmd0aCBvZiB0aGlzIHNvdXJjZSBmaWxlLiBGb3Igc291cmNlIGZpbGVzIGJhc2VkIG9uCiAgLy8vIFVURi04IGJ5dGUgYXJyYXlzLCB0aGUgc3RyaW5nIGxlbmd0aCBpcyBjb21wdXRlZCBhbmQgYXNzaWduZWQgYnkgdGhlCiAgLy8vIHNjYW5uZXIuCiAgc2V0IGxlbmd0aChpbnQgdik7CgogIC8vLyBBIG1hcCBmcm9tIGxpbmUgbnVtYmVycyB0byBvZmZzZXRzIGluIHRoZSBzdHJpbmcgdGV4dCByZXByZXNlbnRhdGlvbiBvZgogIC8vLyB0aGlzIHNvdXJjZSBmaWxlLgogIExpc3Q8aW50PiBnZXQgbGluZVN0YXJ0cyB7CiAgICBpZiAobGluZVN0YXJ0c0NhY2hlID09IG51bGwpIHsKICAgICAgLy8gV2hlbiByZXBvcnRpbmcgZXJyb3JzIGR1cmluZyBzY2FubmluZywgdGhlIGxpbmUgbnVtYmVycyBhcmUgbm90IHlldAogICAgICAvLyBhdmFpbGFibGUgYW5kIG5lZWQgdG8gYmUgY29tcHV0ZWQgdXNpbmcgdGhpcyBzbG93IHBhdGguCiAgICAgIGxpbmVTdGFydHNDYWNoZSA9IGxpbmVTdGFydHNGcm9tU3RyaW5nKHNsb3dUZXh0KCkpOwogICAgfQogICAgcmV0dXJuIGxpbmVTdGFydHNDYWNoZTsKICB9CgogIC8vLyBTZXRzIHRoZSBsaW5lIG51bWJlcnMgbWFwIGZvciB0aGlzIHNvdXJjZSBmaWxlLiBUaGlzIG1hcCBpcyBjb21wdXRlZCBhbmQKICAvLy8gYXNzaWduZWQgYnkgdGhlIHNjYW5uZXIsIGF2b2lkaW5nIGEgc2VwYXJhdGUgdHJhdmVyc2FsIG9mIHRoZSBzb3VyY2UgZmlsZS4KICAvLy8KICAvLy8gVGhlIG1hcCBjb250YWlucyBvbmUgYWRkaXRpb25hbCBlbnRyeSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhcyBpZiB0aGUKICAvLy8gc291cmNlIGZpbGUgaGFkIG9uZSBtb3JlIGVtcHR5IGxpbmUgYXQgdGhlIGVuZC4gVGhpcyBzaW1wbGlmaWVzIHRoZSBiaW5hcnkKICAvLy8gc2VhcmNoIGluIFtnZXRMb2NhdGlvbl0uCiAgc2V0IGxpbmVTdGFydHMoTGlzdDxpbnQ+IHYpID0+IGxpbmVTdGFydHNDYWNoZSA9IHY7CgogIExpc3Q8aW50PiBsaW5lU3RhcnRzQ2FjaGU7CgogIExpc3Q8aW50PiBsaW5lU3RhcnRzRnJvbVN0cmluZyhTdHJpbmcgdGV4dCkgewogICAgdmFyIHN0YXJ0cyA9IFswXTsKICAgIHZhciBpbmRleCA9IDA7CiAgICB3aGlsZSAoaW5kZXggPCB0ZXh0Lmxlbmd0aCkgewogICAgICBpbmRleCA9IHRleHQuaW5kZXhPZignXG4nLCBpbmRleCkgKyAxOwogICAgICBpZiAoaW5kZXggPD0gMCkgYnJlYWs7CiAgICAgIHN0YXJ0cy5hZGQoaW5kZXgpOwogICAgfQogICAgc3RhcnRzLmFkZCh0ZXh0Lmxlbmd0aCArIDEpOyAvLyBPbmUgYWRkaXRpb25hbCBsaW5lIHN0YXJ0IGF0IHRoZSBlbmQuCiAgICByZXR1cm4gc3RhcnRzOwogIH0KCiAgQG92ZXJyaWRlCiAga2VybmVsLkxvY2F0aW9uIGdldExvY2F0aW9uKGludCBvZmZzZXQpIHsKICAgIHJldHVybiBrZXJuZWxTb3VyY2UuZ2V0TG9jYXRpb24obnVsbCwgb2Zmc2V0KTsKICB9CgogIFN0cmluZyBzbG93U3Vic3RyaW5nKGludCBzdGFydCwgaW50IGVuZCk7CgogIC8vLyBDcmVhdGUgYSBwcmV0dHkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciBbbWVzc2FnZV0gZnJvbSBhIGNoYXJhY3RlcgogIC8vLyByYW5nZSBgW3N0YXJ0LCBlbmRdYCBpbiB0aGlzIGZpbGUuCiAgLy8vCiAgLy8vIElmIFtpbmNsdWRlU291cmNlTGluZV0gaXMgYHRydWVgIHRoZSBmaXJzdCBzb3VyY2UgbGluZSBjb2RlIGxpbmUgdGhhdAogIC8vLyBjb250YWlucyB0aGUgcmFuZ2Ugd2lsbCBiZSBpbmNsdWRlZCBhcyB3ZWxsIGFzIG1hcmtlciBjaGFyYWN0ZXJzICgnXicpCiAgLy8vIHVuZGVybGluaW5nIHRoZSByYW5nZS4KICAvLy8KICAvLy8gVXNlIFtjb2xvcml6ZV0gdG8gd3JhcCBzb3VyY2UgY29kZSB0ZXh0IGFuZCBtYXJrZXIgY2hhcmFjdGVycyBpbiBjb2xvcgogIC8vLyBlc2NhcGUgY29kZXMuCiAgU3RyaW5nIGdldExvY2F0aW9uTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IHN0YXJ0LCBpbnQgZW5kLAogICAgICB7Ym9vbCBpbmNsdWRlU291cmNlTGluZTogdHJ1ZSwgU3RyaW5nIGNvbG9yaXplKFN0cmluZyB0ZXh0KX0pIHsKICAgIGlmIChjb2xvcml6ZSA9PSBudWxsKSB7CiAgICAgIGNvbG9yaXplID0gKHRleHQpID0+IHRleHQ7CiAgICB9CgogICAga2VybmVsLkxvY2F0aW9uIHN0YXJ0TG9jYXRpb24gPSBrZXJuZWxTb3VyY2UuZ2V0TG9jYXRpb24obnVsbCwgc3RhcnQpOwogICAga2VybmVsLkxvY2F0aW9uIGVuZExvY2F0aW9uID0ga2VybmVsU291cmNlLmdldExvY2F0aW9uKG51bGwsIGVuZCk7CiAgICBpbnQgbGluZVN0YXJ0ID0gc3RhcnRMb2NhdGlvbi5saW5lIC0gMTsKICAgIGludCBjb2x1bW5TdGFydCA9IHN0YXJ0TG9jYXRpb24uY29sdW1uIC0gMTsKICAgIGludCBsaW5lRW5kID0gZW5kTG9jYXRpb24ubGluZSAtIDE7CiAgICBpbnQgY29sdW1uRW5kID0gZW5kTG9jYXRpb24uY29sdW1uIC0gMTsKCiAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcignJHtmaWxlbmFtZX06Jyk7CiAgICBpZiAoc3RhcnQgIT0gZW5kIHx8IHN0YXJ0ICE9IDApIHsKICAgICAgLy8gTGluZS9jb2x1bW4gaW5mbyBpcyByZWxldmFudC4KICAgICAgYnVmLndyaXRlKCcke2xpbmVTdGFydCArIDF9OiR7Y29sdW1uU3RhcnQgKyAxfTonKTsKICAgIH0KICAgIGJ1Zi53cml0ZSgnXG4kbWVzc2FnZVxuJyk7CgogICAgaWYgKHN0YXJ0ICE9IGVuZCAmJiBpbmNsdWRlU291cmNlTGluZSkgewogICAgICBpZiAobGluZVN0YXJ0ID09IGxpbmVFbmQpIHsKICAgICAgICBTdHJpbmcgdGV4dExpbmUgPSBrZXJuZWxTb3VyY2UuZ2V0VGV4dExpbmUoc3RhcnRMb2NhdGlvbi5saW5lKTsKCiAgICAgICAgaW50IHRvQ29sdW1uID0gbWluKGNvbHVtblN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSwgdGV4dExpbmUubGVuZ3RoKTsKICAgICAgICBidWYud3JpdGUodGV4dExpbmUuc3Vic3RyaW5nKDAsIGNvbHVtblN0YXJ0KSk7CiAgICAgICAgYnVmLndyaXRlKGNvbG9yaXplKHRleHRMaW5lLnN1YnN0cmluZyhjb2x1bW5TdGFydCwgdG9Db2x1bW4pKSk7CiAgICAgICAgYnVmLndyaXRlbG4odGV4dExpbmUuc3Vic3RyaW5nKHRvQ29sdW1uKSk7CgogICAgICAgIGludCBpID0gMDsKICAgICAgICBmb3IgKDsgaSA8IGNvbHVtblN0YXJ0OyBpKyspIHsKICAgICAgICAgIGJ1Zi53cml0ZSgnICcpOwogICAgICAgIH0KCiAgICAgICAgZm9yICg7IGkgPCB0b0NvbHVtbjsgaSsrKSB7CiAgICAgICAgICBidWYud3JpdGUoY29sb3JpemUoJ14nKSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoaW50IGxpbmUgPSBsaW5lU3RhcnQ7IGxpbmUgPD0gbGluZUVuZDsgbGluZSsrKSB7CiAgICAgICAgICBTdHJpbmcgdGV4dExpbmUgPSBrZXJuZWxTb3VyY2UuZ2V0VGV4dExpbmUobGluZSArIDEpOwogICAgICAgICAgaWYgKGxpbmUgPT0gbGluZVN0YXJ0KSB7CiAgICAgICAgICAgIGlmIChjb2x1bW5TdGFydCA+IHRleHRMaW5lLmxlbmd0aCkgewogICAgICAgICAgICAgIGNvbHVtblN0YXJ0ID0gdGV4dExpbmUubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ1Zi53cml0ZSh0ZXh0TGluZS5zdWJzdHJpbmcoMCwgY29sdW1uU3RhcnQpKTsKICAgICAgICAgICAgYnVmLndyaXRlbG4oY29sb3JpemUodGV4dExpbmUuc3Vic3RyaW5nKGNvbHVtblN0YXJ0KSkpOwogICAgICAgICAgfSBlbHNlIGlmIChsaW5lID09IGxpbmVFbmQpIHsKICAgICAgICAgICAgaWYgKGNvbHVtbkVuZCA+IHRleHRMaW5lLmxlbmd0aCkgewogICAgICAgICAgICAgIGNvbHVtbkVuZCA9IHRleHRMaW5lLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBidWYud3JpdGUoY29sb3JpemUodGV4dExpbmUuc3Vic3RyaW5nKDAsIGNvbHVtbkVuZCkpKTsKICAgICAgICAgICAgYnVmLndyaXRlbG4odGV4dExpbmUuc3Vic3RyaW5nKGNvbHVtbkVuZCkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnVmLndyaXRlbG4oY29sb3JpemUodGV4dExpbmUpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAgfQoKICBpbnQgZ2V0IGxpbmVzID0+IGxpbmVTdGFydHMubGVuZ3RoIC0gMTsKfQoKTGlzdDxpbnQ+IF96ZXJvVGVybWluYXRlSWZOZWNlc3NhcnkoTGlzdDxpbnQ+IGJ5dGVzKSB7CiAgaWYgKGJ5dGVzLmxlbmd0aCA+IDAgJiYgYnl0ZXMubGFzdCA9PSAwKSByZXR1cm4gYnl0ZXM7CiAgTGlzdDxpbnQ+IHJlc3VsdCA9IG5ldyBVaW50OExpc3QoYnl0ZXMubGVuZ3RoICsgMSk7CiAgcmVzdWx0LnNldFJhbmdlKDAsIGJ5dGVzLmxlbmd0aCwgYnl0ZXMpOwogIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSAwOwogIHJldHVybiByZXN1bHQ7Cn0KCmNsYXNzIFV0ZjhCeXRlc1NvdXJjZUZpbGUgZXh0ZW5kcyBTb3VyY2VGaWxlPExpc3Q8aW50Pj4gewogIEBvdmVycmlkZQogIGZpbmFsIFVyaSB1cmk7CgogIC8vLyBUaGUgVVRGLTggZW5jb2RlZCBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZS4KICBmaW5hbCBMaXN0PGludD4gemVyb1Rlcm1pbmF0ZWRDb250ZW50OwoKICAvLy8gQ3JlYXRlcyBhIFV0ZjhCeXRlc1NvdXJjZUZpbGUuCiAgLy8vCiAgLy8vIElmIHBvc3NpYmxlLCB0aGUgZ2l2ZW4gW2NvbnRlbnRdIHNob3VsZCBiZSB6ZXJvLXRlcm1pbmF0ZWQuIElmIGl0IGlzbid0LAogIC8vLyB0aGUgY29uc3RydWN0b3IgY2xvbmVzIHRoZSBjb250ZW50IGFuZCBhZGRzIGEgdHJhaWxpbmcgMC4KICBVdGY4Qnl0ZXNTb3VyY2VGaWxlKHRoaXMudXJpLCBMaXN0PGludD4gY29udGVudCkKICAgICAgOiB0aGlzLnplcm9UZXJtaW5hdGVkQ29udGVudCA9IF96ZXJvVGVybWluYXRlSWZOZWNlc3NhcnkoY29udGVudCk7CgogIEBvdmVycmlkZQogIExpc3Q8aW50PiBnZXQgZGF0YSA9PiB6ZXJvVGVybWluYXRlZENvbnRlbnQ7CgogIEBvdmVycmlkZQogIFN0cmluZyBzbG93VGV4dCgpIHsKICAgIC8vIERvbid0IGNvbnZlcnQgdGhlIHRyYWlsaW5nIHplcm8gYnl0ZS4KICAgIHJldHVybiB1dGY4LmRlY29kZXIKICAgICAgICAuY29udmVydCh6ZXJvVGVybWluYXRlZENvbnRlbnQsIDAsIHplcm9UZXJtaW5hdGVkQ29udGVudC5sZW5ndGggLSAxKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8aW50PiBzbG93VXRmOFplcm9UZXJtaW5hdGVkQnl0ZXMoKSA9PiB6ZXJvVGVybWluYXRlZENvbnRlbnQ7CgogIEBvdmVycmlkZQogIFN0cmluZyBzbG93U3Vic3RyaW5nKGludCBzdGFydCwgaW50IGVuZCkgewogICAgLy8gVE9ETyhscnkpOiB0byBtYWtlIHRoaXMgZmFzdGVyLCB0aGUgc2Nhbm5lciBjb3VsZCByZWNvcmQgdGhlIFVURi04IHNsYWNrCiAgICAvLyBmb3IgYWxsIHBvc2l0aW9ucyBvZiB0aGUgc291cmNlIHRleHQuIFdlIGNvdWxkIHVzZSBbOmNvbnRlbnQuc3VibGlzdDpdLgogICAgcmV0dXJuIHNsb3dUZXh0KCkuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggewogICAgaWYgKGxlbmd0aENhY2hlID09IC0xKSB7CiAgICAgIC8vIER1cmluZyBzY2FubmluZyB0aGUgbGVuZ3RoIGlzIG5vdCB5ZXQgYXNzaWduZWQsIHNvIHdlIHVzZSBhIHNsb3cgcGF0aC4KICAgICAgbGVuZ3RoQ2FjaGUgPSBzbG93VGV4dCgpLmxlbmd0aDsKICAgIH0KICAgIHJldHVybiBsZW5ndGhDYWNoZTsKICB9CgogIEBvdmVycmlkZQogIHNldCBsZW5ndGgoaW50IHYpID0+IGxlbmd0aENhY2hlID0gdjsKICBpbnQgbGVuZ3RoQ2FjaGUgPSAtMTsKfQoKY2xhc3MgQ2FjaGluZ1V0ZjhCeXRlc1NvdXJjZUZpbGUgZXh0ZW5kcyBVdGY4Qnl0ZXNTb3VyY2VGaWxlIHsKICBTdHJpbmcgY2FjaGVkVGV4dDsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgZmlsZW5hbWU7CgogIENhY2hpbmdVdGY4Qnl0ZXNTb3VyY2VGaWxlKFVyaSB1cmksIHRoaXMuZmlsZW5hbWUsIExpc3Q8aW50PiBjb250ZW50KQogICAgICA6IHN1cGVyKHVyaSwgY29udGVudCk7CgogIEBvdmVycmlkZQogIFN0cmluZyBzbG93VGV4dCgpIHsKICAgIGlmIChjYWNoZWRUZXh0ID09IG51bGwpIHsKICAgICAgY2FjaGVkVGV4dCA9IHN1cGVyLnNsb3dUZXh0KCk7CiAgICB9CiAgICByZXR1cm4gY2FjaGVkVGV4dDsKICB9Cn0KCmNsYXNzIFN0cmluZ1NvdXJjZUZpbGUgZXh0ZW5kcyBTb3VyY2VGaWxlPExpc3Q8aW50Pj4gewogIEBvdmVycmlkZQogIGZpbmFsIFVyaSB1cmk7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIGZpbGVuYW1lOwogIGZpbmFsIFN0cmluZyB0ZXh0OwoKICBTdHJpbmdTb3VyY2VGaWxlKHRoaXMudXJpLCB0aGlzLmZpbGVuYW1lLCB0aGlzLnRleHQpOwoKICBTdHJpbmdTb3VyY2VGaWxlLmZyb21VcmkoVXJpIHVyaSwgU3RyaW5nIHRleHQpCiAgICAgIDogdGhpcyh1cmksIHVyaS50b1N0cmluZygpLCB0ZXh0KTsKCiAgU3RyaW5nU291cmNlRmlsZS5mcm9tTmFtZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0ZXh0KQogICAgICA6IHRoaXMobmV3IFVyaShwYXRoOiBmaWxlbmFtZSksIGZpbGVuYW1lLCB0ZXh0KTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxpbnQ+IGdldCBkYXRhID0+IHV0ZjguZW5jb2RlKHRleHQpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiB0ZXh0Lmxlbmd0aDsKICBAb3ZlcnJpZGUKICBzZXQgbGVuZ3RoKGludCB2KSB7fQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgc2xvd1RleHQoKSA9PiB0ZXh0OwoKICBAb3ZlcnJpZGUKICBMaXN0PGludD4gc2xvd1V0ZjhaZXJvVGVybWluYXRlZEJ5dGVzKCkgewogICAgcmV0dXJuIF96ZXJvVGVybWluYXRlSWZOZWNlc3NhcnkodXRmOC5lbmNvZGUodGV4dCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHNsb3dTdWJzdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kKSA9PiB0ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKfQoKLy8vIEJpbmFyeSBpbnB1dCBkYXRhLgpjbGFzcyBCaW5hcnkgaW1wbGVtZW50cyBJbnB1dDxMaXN0PGludD4+IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBVcmkgdXJpOwogIEBvdmVycmlkZQogIGZpbmFsIExpc3Q8aW50PiBkYXRhOwoKICBCaW5hcnkodGhpcy51cmksIHRoaXMuZGF0YSk7CgogIEBvdmVycmlkZQogIElucHV0S2luZCBnZXQgaW5wdXRLaW5kID0+IElucHV0S2luZC5iaW5hcnk7Cn0KgScATk48ASABIRQpAUIBNyIBTipFKwwPAQwtASQBI0U4NRQnOA0hBAEcBkYpATsVAUopKwFJNxIBTEsPFQFOGB0jTUE6BhwEAU9RBk5RHzYBHQEwFhMiLR0ZBkoTBAEMLDMEASwBSykGTE0dBk0UQEYcIQYBS0csMCgsATkmJzkGHwEtIkgBSjdIMwETJxoKASQkCg8+QCMxLQ47RCgvKw5DOBMtDAoIBgEbBAEqAgE3OTYrIRECAToMEQE0KQElBk9AM0kBDC8BDBYtGE4EAQxEAQwtUE8tBAEMEx1QJwYYBAEMKBgCAT8VDBkBSB0BDBYeJQYXBAIBNwwRDBkVATgBMSkBOjcBDCsBDCEMFwEMHQEMLDkEAQxKAgEXKwwRDBgBHwEMLwIBKHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lvL3NvdXJjZV9maWxlLmRhcnQwc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdXRpbC9lbXB0eXNldC5kYXJ0hscvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLnV0aWwuZW1wdHlzZXQ7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgc2hvdyBJdGVyYWJsZUJhc2U7CgpjbGFzcyBJbW11dGFibGVFbXB0eVNldDxFPiBleHRlbmRzIEl0ZXJhYmxlQmFzZTxFPiBpbXBsZW1lbnRzIFNldDxFPiB7CiAgY29uc3QgSW1tdXRhYmxlRW1wdHlTZXQoKTsKCiAgQG92ZXJyaWRlCiAgU2V0PFI+IGNhc3Q8Uj4oKSA9PiBuZXcgSW1tdXRhYmxlRW1wdHlTZXQ8Uj4oKTsKICBAb3ZlcnJpZGUKICBnZXQgaXRlcmF0b3IgPT4gY29uc3QgX0VtcHR5U2V0SXRlcmF0b3IoKTsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiAwOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gdHJ1ZTsKCiAgZ2V0IF9pbW11dGFibGVFcnJvciA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiRW1wdHlTZXQgaXMgaW1tdXRhYmxlIik7CgogIEBvdmVycmlkZQogIGJvb2wgYWRkKEUgZWxlbWVudCkgPT4gX2ltbXV0YWJsZUVycm9yOwogIEBvdmVycmlkZQogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGVsZW1lbnRzKSA9PiBfaW1tdXRhYmxlRXJyb3I7CgogIEBvdmVycmlkZQogIEUgbG9va3VwKE9iamVjdCBlbGVtZW50KSA9PiBudWxsOwogIEBvdmVycmlkZQogIGJvb2wgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZUFsbChJdGVyYWJsZTxPYmplY3Q+IGVsZW1lbnRzKSB7fQogIEBvdmVycmlkZQogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHt9CiAgQG92ZXJyaWRlCiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykge30KICBAb3ZlcnJpZGUKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7fQogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaCh2b2lkIGFjdGlvbihFIGVsZW1lbnQpKSB7fQogIEBvdmVycmlkZQogIHZvaWQgY2xlYXIoKSB7fQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPE9iamVjdD4gb3RoZXIpID0+IG90aGVyLmlzRW1wdHk7CgogIEBvdmVycmlkZQogIFNldDxFPiB1bmlvbihTZXQ8RT4gb3RoZXIpID0+IG5ldyBTZXQuZnJvbShvdGhlcik7CiAgQG92ZXJyaWRlCiAgU2V0PEU+IGludGVyc2VjdGlvbihTZXQ8T2JqZWN0PiBvdGhlcikgPT4gdGhpczsKICBAb3ZlcnJpZGUKICBTZXQ8RT4gZGlmZmVyZW5jZShTZXQ8T2JqZWN0PiBvdGhlcikgPT4gdGhpczsKICBAb3ZlcnJpZGUKICBTZXQ8RT4gdG9TZXQoKSA9PiBuZXcgU2V0PEU+KCk7Cn0KCmNsYXNzIF9FbXB0eVNldEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8TnVsbD4gewogIGNvbnN0IF9FbXB0eVNldEl0ZXJhdG9yKCk7CgogIEBvdmVycmlkZQogIE51bGwgZ2V0IGN1cnJlbnQgPT4gbnVsbDsKICBAb3ZlcnJpZGUKICBib29sIG1vdmVOZXh0KCkgPT4gZmFsc2U7Cn0KRQBOTjwBHwEsAUcdAQwyDC0MFwwcAU4BDCoMOAEMJAwoDC8MLAwvDCwMKgwSAQwqDD0BDDUMMgwwDCICATQdAQwcDBwCASdwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL2VtcHR5c2V0LmRhcnQuc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdXRpbC9tYXBsZXQuZGFydJ4dLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy51dGlsLm1hcGxldDsKCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJyBzaG93IE1hcEJhc2UsIEl0ZXJhYmxlQmFzZTsKCmNsYXNzIE1hcGxldDxLLCBWPiBleHRlbmRzIE1hcEJhc2U8SywgVj4gewogIHN0YXRpYyBjb25zdCBfTWFwbGV0TWFya2VyIF9NQVJLRVIgPSBjb25zdCBfTWFwbGV0TWFya2VyKCk7CiAgc3RhdGljIGNvbnN0IGludCBDQVBBQ0lUWSA9IDg7CgovLyBUaGUgbWFwbGV0IGNhbiBiZSBpbiBvbmUgb2YgZm91ciBzdGF0ZXM6CiAgLy8KICAvLyAgICogRW1wdHkgICAgICAgICAgKGV4dHJhOiBudWxsLCAgIGtleTogbWFya2VyLCB2YWx1ZTogbnVsbCkKICAvLyAgICogU2luZ2xlIGVsZW1lbnQgKGV4dHJhOiBudWxsLCAgIGtleToga2V5LCAgICB2YWx1ZTogdmFsdWUpCiAgLy8gICAqIExpc3QtYmFja2VkICAgIChleHRyYTogbGVuZ3RoLCBrZXk6IGxpc3QsICAgdmFsdWU6IG51bGwpCiAgLy8gICAqIE1hcC1iYWNrZWQgICAgIChleHRyYTogbWFya2VyLCBrZXk6IG1hcCwgICAgdmFsdWU6IG51bGwpCiAgLy8KICAvLyBXaGVuIHRoZSBtYXBsZXQgaXMgbGlzdC1iYWNrZWQsIHRoZSBsaXN0IGhhcyB0d28gc2VjdGlvbnM6IE9uZQogIC8vIGZvciBrZXlzIGFuZCBvbmUgZm9yIHZhbHVlcy4gVGhlIGZpcnN0IFtDQVBBQ0lUWV0gZW50cmllcyBhcmUKICAvLyB0aGUga2V5cyBhbmQgdGhleSBtYXkgY29udGFpbiBtYXJrZXJzIGZvciBkZWxldGVkIGVsZW1lbnRzLiBBZnRlcgogIC8vIHRoZSBrZXlzIHRoZXJlIGFyZSBbQ0FQQUNJVFldIGVudHJpZXMgZm9yIHRoZSB2YWx1ZXMuCgogIGR5bmFtaWMgX2tleSA9IF9NQVJLRVI7CiAgdmFyIF92YWx1ZTsKICB2YXIgX2V4dHJhOwoKICBNYXBsZXQoKTsKCiAgTWFwbGV0LmZyb20oTWFwbGV0PEssIFY+IG90aGVyKSB7CiAgICBvdGhlci5mb3JFYWNoKChLIGtleSwgViB2YWx1ZSkgewogICAgICB0aGlzW2tleV0gPSB2YWx1ZTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbXB0eSB7CiAgICBpZiAoX2V4dHJhID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9NQVJLRVIgPT0gX2tleTsKICAgIH0gZWxzZSBpZiAoX01BUktFUiA9PSBfZXh0cmEpIHsKICAgICAgcmV0dXJuIF9rZXkuaXNFbXB0eTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfZXh0cmEgPT0gMDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoIHsKICAgIGlmIChfZXh0cmEgPT0gbnVsbCkgewogICAgICByZXR1cm4gKF9NQVJLRVIgPT0gX2tleSkgPyAwIDogMTsKICAgIH0gZWxzZSBpZiAoX01BUktFUiA9PSBfZXh0cmEpIHsKICAgICAgcmV0dXJuIF9rZXkubGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9leHRyYTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewogICAgaWYgKF9leHRyYSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfa2V5ID09IGtleTsKICAgIH0gZWxzZSBpZiAoX01BUktFUiA9PSBfZXh0cmEpIHsKICAgICAgcmV0dXJuIF9rZXkuY29udGFpbnNLZXkoa2V5KTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaW50IHJlbWFpbmluZyA9IF9leHRyYSwgaSA9IDA7IHJlbWFpbmluZyA+IDAgJiYgaSA8IENBUEFDSVRZOyBpKyspIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gX2tleVtpXTsKICAgICAgICBpZiAoX01BUktFUiA9PSBjYW5kaWRhdGUpIGNvbnRpbnVlOwogICAgICAgIGlmIChjYW5kaWRhdGUgPT0ga2V5KSByZXR1cm4gdHJ1ZTsKICAgICAgICByZW1haW5pbmctLTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpIHsKICAgIGlmIChfZXh0cmEgPT0gbnVsbCkgewogICAgICByZXR1cm4gKF9rZXkgPT0ga2V5KSA/IF92YWx1ZSA6IG51bGw7CiAgICB9IGVsc2UgaWYgKF9NQVJLRVIgPT0gX2V4dHJhKSB7CiAgICAgIHJldHVybiBfa2V5W2tleV07CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCByZW1haW5pbmcgPSBfZXh0cmEsIGkgPSAwOyByZW1haW5pbmcgPiAwICYmIGkgPCBDQVBBQ0lUWTsgaSsrKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IF9rZXlbaV07CiAgICAgICAgaWYgKF9NQVJLRVIgPT0gY2FuZGlkYXRlKSBjb250aW51ZTsKICAgICAgICBpZiAoY2FuZGlkYXRlID09IGtleSkgcmV0dXJuIF9rZXlbaSArIENBUEFDSVRZXTsKICAgICAgICByZW1haW5pbmctLTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBpZiAoX2V4dHJhID09IG51bGwpIHsKICAgICAgaWYgKF9NQVJLRVIgPT0gX2tleSkgewogICAgICAgIF9rZXkgPSBrZXk7CiAgICAgICAgX3ZhbHVlID0gdmFsdWU7CiAgICAgIH0gZWxzZSBpZiAoX2tleSA9PSBrZXkpIHsKICAgICAgICBfdmFsdWUgPSB2YWx1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBMaXN0IGxpc3QgPSBuZXcgTGlzdChDQVBBQ0lUWSAqIDIpOwogICAgICAgIGxpc3RbMF0gPSBfa2V5OwogICAgICAgIGxpc3RbMV0gPSBrZXk7CiAgICAgICAgbGlzdFtDQVBBQ0lUWV0gPSBfdmFsdWU7CiAgICAgICAgbGlzdFtDQVBBQ0lUWSArIDFdID0gdmFsdWU7CiAgICAgICAgX2tleSA9IGxpc3Q7CiAgICAgICAgX3ZhbHVlID0gbnVsbDsKICAgICAgICBfZXh0cmEgPSAyOyAvLyBUd28gZWxlbWVudHMuCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoX01BUktFUiA9PSBfZXh0cmEpIHsKICAgICAgX2tleVtrZXldID0gdmFsdWU7CiAgICB9IGVsc2UgewogICAgICBpbnQgcmVtYWluaW5nID0gX2V4dHJhOwogICAgICBpbnQgaW5kZXggPSAwOwogICAgICBpbnQgY29weVRvLCBjb3B5RnJvbTsKICAgICAgd2hpbGUgKHJlbWFpbmluZyA+IDAgJiYgaW5kZXggPCBDQVBBQ0lUWSkgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSBfa2V5W2luZGV4XTsKICAgICAgICBpZiAoX01BUktFUiA9PSBjYW5kaWRhdGUpIHsKICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgcmFuZ2Ugb2YgZW1wdHkgc2xvdHMgaW4gdGhlCiAgICAgICAgICAvLyBsaXN0LiBXaGVuIHdlJ3JlIGRvbmUgd2UnbGwgbW92ZSBhbGwgdGhlIGVsZW1lbnRzCiAgICAgICAgICAvLyBhZnRlciB0aG9zZSBlbXB0eSBzbG90cyBkb3duLCBzbyB0aGF0IGFkZGluZyBhbiBlbGVtZW50CiAgICAgICAgICAvLyBhZnRlciB0aGF0IHdpbGwgcHJlc2VydmUgdGhlIGluc2VydGlvbiBvcmRlci4KICAgICAgICAgIGlmIChjb3B5RnJvbSA9PSBpbmRleCkgewogICAgICAgICAgICBjb3B5RnJvbSsrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29weVRvID0gaW5kZXg7CiAgICAgICAgICAgIGNvcHlGcm9tID0gaW5kZXggKyAxOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2FuZGlkYXRlID09IGtleSkgewogICAgICAgICAgX2tleVtDQVBBQ0lUWSArIGluZGV4XSA9IHZhbHVlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBTa2lwcGVkIGFuIGVsZW1lbnQgdGhhdCBkaWRuJ3QgbWF0Y2guCiAgICAgICAgICByZW1haW5pbmctLTsKICAgICAgICB9CiAgICAgICAgaW5kZXgrKzsKICAgICAgfQogICAgICBpZiAoaW5kZXggPCBDQVBBQ0lUWSkgewogICAgICAgIF9rZXlbaW5kZXhdID0ga2V5OwogICAgICAgIF9rZXlbQ0FQQUNJVFkgKyBpbmRleF0gPSB2YWx1ZTsKICAgICAgICBfZXh0cmErKzsKICAgICAgfSBlbHNlIGlmIChfZXh0cmEgPCBDQVBBQ0lUWSkgewogICAgICAgIC8vIE1vdmUgdGhlIGxhc3QgZWxlbWVudHMgZG93biBpbnRvIHRoZSBsYXN0IGVtcHR5IHNsb3RzCiAgICAgICAgLy8gc28gdGhhdCB3ZSBoYXZlIGVtcHR5IHNsb3RzIGFmdGVyIHRoZSBsYXN0IGVsZW1lbnQuCiAgICAgICAgd2hpbGUgKGNvcHlGcm9tIDwgQ0FQQUNJVFkpIHsKICAgICAgICAgIF9rZXlbY29weVRvXSA9IF9rZXlbY29weUZyb21dOwogICAgICAgICAgX2tleVtDQVBBQ0lUWSArIGNvcHlUb10gPSBfa2V5W0NBUEFDSVRZICsgY29weUZyb21dOwogICAgICAgICAgY29weVRvKys7CiAgICAgICAgICBjb3B5RnJvbSsrOwogICAgICAgIH0KICAgICAgICAvLyBJbnNlcnQgdGhlIG5ldyBlbGVtZW50IGFzIHRoZSBsYXN0IGVsZW1lbnQuCiAgICAgICAgX2tleVtjb3B5VG9dID0ga2V5OwogICAgICAgIF9rZXlbQ0FQQUNJVFkgKyBjb3B5VG9dID0gdmFsdWU7CiAgICAgICAgY29weVRvKys7CiAgICAgICAgLy8gQWRkIG9uZSB0byB0aGUgbGVuZ3RoIGVuY29kZWQgaW4gdGhlIGV4dHJhIGZpZWxkLgogICAgICAgIF9leHRyYSsrOwogICAgICAgIC8vIENsZWFyIGFsbCBlbGVtZW50cyBhZnRlciB0aGUgbmV3IGxhc3QgZWxlbWVudHMgdG8KICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3Qga2VlcCBleHRyYSBzdHVmZiBhbGl2ZS4KICAgICAgICB3aGlsZSAoY29weVRvIDwgQ0FQQUNJVFkpIHsKICAgICAgICAgIF9rZXlbY29weVRvXSA9IF9rZXlbQ0FQQUNJVFkgKyBjb3B5VG9dID0gbnVsbDsKICAgICAgICAgIGNvcHlUbysrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgbWFwID0gbmV3IE1hcDxLLCBWPigpOwogICAgICAgIGZvckVhY2goKGVhY2hLZXksIGVhY2hWYWx1ZSkgPT4gbWFwW2VhY2hLZXldID0gZWFjaFZhbHVlKTsKICAgICAgICBtYXBba2V5XSA9IHZhbHVlOwogICAgICAgIF9rZXkgPSBtYXA7CiAgICAgICAgX2V4dHJhID0gX01BUktFUjsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgaWYgKF9leHRyYSA9PSBudWxsKSB7CiAgICAgIGlmIChfa2V5ICE9IGtleSkgcmV0dXJuIG51bGw7CiAgICAgIF9rZXkgPSBfTUFSS0VSOwogICAgICBWIHJlc3VsdCA9IF92YWx1ZTsKICAgICAgX3ZhbHVlID0gbnVsbDsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0gZWxzZSBpZiAoX01BUktFUiA9PSBfZXh0cmEpIHsKICAgICAgcmV0dXJuIF9rZXkucmVtb3ZlKGtleSk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCByZW1haW5pbmcgPSBfZXh0cmEsIGkgPSAwOyByZW1haW5pbmcgPiAwICYmIGkgPCBDQVBBQ0lUWTsgaSsrKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IF9rZXlbaV07CiAgICAgICAgaWYgKF9NQVJLRVIgPT0gY2FuZGlkYXRlKSBjb250aW51ZTsKICAgICAgICBpZiAoY2FuZGlkYXRlID09IGtleSkgewogICAgICAgICAgaW50IHZhbHVlSW5kZXggPSBDQVBBQ0lUWSArIGk7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gX2tleVt2YWx1ZUluZGV4XTsKICAgICAgICAgIF9rZXlbaV0gPSBfTUFSS0VSOwogICAgICAgICAgX2tleVt2YWx1ZUluZGV4XSA9IG51bGw7CiAgICAgICAgICBfZXh0cmEtLTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIHJlbWFpbmluZy0tOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoKHZvaWQgYWN0aW9uKEsga2V5LCBWIHZhbHVlKSkgewogICAgaWYgKF9leHRyYSA9PSBudWxsKSB7CiAgICAgIGlmIChfTUFSS0VSICE9IF9rZXkpIGFjdGlvbihfa2V5LCBfdmFsdWUpOwogICAgfSBlbHNlIGlmIChfTUFSS0VSID09IF9leHRyYSkgewogICAgICBfa2V5LmZvckVhY2goYWN0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaW50IHJlbWFpbmluZyA9IF9leHRyYSwgaSA9IDA7IHJlbWFpbmluZyA+IDAgJiYgaSA8IENBUEFDSVRZOyBpKyspIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gX2tleVtpXTsKICAgICAgICBpZiAoX01BUktFUiA9PSBjYW5kaWRhdGUpIGNvbnRpbnVlOwogICAgICAgIGFjdGlvbihjYW5kaWRhdGUsIF9rZXlbQ0FQQUNJVFkgKyBpXSk7CiAgICAgICAgcmVtYWluaW5nLS07CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xlYXIoKSB7CiAgICBfa2V5ID0gX01BUktFUjsKICAgIF92YWx1ZSA9IF9leHRyYSA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PiBuZXcgX01hcGxldEtleUl0ZXJhYmxlPEs+KHRoaXMpOwp9CgpjbGFzcyBfTWFwbGV0TWFya2VyIHsKICBjb25zdCBfTWFwbGV0TWFya2VyKCk7Cn0KCmNsYXNzIF9NYXBsZXRLZXlJdGVyYWJsZTxLPiBleHRlbmRzIEl0ZXJhYmxlQmFzZTxLPiB7CiAgZmluYWwgTWFwbGV0PEssIGR5bmFtaWM+IG1hcGxldDsKCiAgX01hcGxldEtleUl0ZXJhYmxlKHRoaXMubWFwbGV0KTsKCiAgQG92ZXJyaWRlCiAgSXRlcmF0b3I8Sz4gZ2V0IGl0ZXJhdG9yIHsKICAgIGlmIChtYXBsZXQuX2V4dHJhID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBfTWFwbGV0U2luZ2xlSXRlcmF0b3I8Sz4obWFwbGV0Ll9rZXkpOwogICAgfSBlbHNlIGlmIChNYXBsZXQuX01BUktFUiA9PSBtYXBsZXQuX2V4dHJhKSB7CiAgICAgIHJldHVybiBtYXBsZXQuX2tleS5rZXlzLml0ZXJhdG9yOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBfTWFwbGV0TGlzdEl0ZXJhdG9yPEs+KG1hcGxldC5fa2V5LCBtYXBsZXQuX2V4dHJhKTsKICAgIH0KICB9Cn0KCmNsYXNzIF9NYXBsZXRTaW5nbGVJdGVyYXRvcjxLPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEs+IHsKICB2YXIgX2VsZW1lbnQ7CiAgSyBfY3VycmVudDsKCiAgX01hcGxldFNpbmdsZUl0ZXJhdG9yKHRoaXMuX2VsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBLIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICBAb3ZlcnJpZGUKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKE1hcGxldC5fTUFSS0VSID09IF9lbGVtZW50KSB7CiAgICAgIF9jdXJyZW50ID0gbnVsbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX2N1cnJlbnQgPSBfZWxlbWVudDsKICAgIF9lbGVtZW50ID0gTWFwbGV0Ll9NQVJLRVI7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KCmNsYXNzIF9NYXBsZXRMaXN0SXRlcmF0b3I8Sz4gaW1wbGVtZW50cyBJdGVyYXRvcjxLPiB7CiAgZmluYWwgTGlzdCBfbGlzdDsKICBpbnQgX3JlbWFpbmluZzsKICBpbnQgX2luZGV4ID0gMDsKICBLIF9jdXJyZW50OwoKICBfTWFwbGV0TGlzdEl0ZXJhdG9yKHRoaXMuX2xpc3QsIHRoaXMuX3JlbWFpbmluZyk7CgogIEBvdmVycmlkZQogIEsgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7CgogIEBvdmVycmlkZQogIGJvb2wgbW92ZU5leHQoKSB7CiAgICB3aGlsZSAoX3JlbWFpbmluZyA+IDApIHsKICAgICAgdmFyIGNhbmRpZGF0ZSA9IF9saXN0W19pbmRleCsrXTsKICAgICAgaWYgKE1hcGxldC5fTUFSS0VSICE9IGNhbmRpZGF0ZSkgewogICAgICAgIF9jdXJyZW50ID0gY2FuZGlkYXRlOwogICAgICAgIF9yZW1haW5pbmctLTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgX2N1cnJlbnQgPSBudWxsOwogICAgcmV0dXJuIGZhbHNlOwogIH0KfQqBKABOTjwBHQE1ASs+IQEsBUJDQkIFRENHOwEaDg4BDAEkJRkIBAEMFRoeJBsNGgYEAQwTGigkGg0VBgQBDCEaGiQkDVAhLCsVCBQGBAEMHhosJBgNUCEsORUIEwYEAQwmGh0UGCAYDywYFyEkFRclCCQZDR4VHDIlJEA/RTsjGBMcIgwnKhIRMxcKEQgeGygSJkE/Jik/FBYKNxwpEj0SPTYkORQKDyNDGhQaCAYEAQwZGiQWGRUVJB8NUCEsICkpHSMUGQoVCBMGBAEMLhoxJBwNUCEsLxUIBgQBDBEUHAQBDDsCARYZAgE2IwEjAQwdITgyKA1FBgQCATgQDgEoAQwdAQwUJhcUBhkfEQQCATYUEhIOATQBDB0BDBQdJykeFhUIBhUSBAIBJXBhY2thZ2U6Y29tcGlsZXIvc3JjL3V0aWwvbWFwbGV0LmRhcnQuc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdXRpbC9zZXRsZXQuZGFydKI4Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy51dGlsLnNldGxldDsKCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJyBzaG93IFNldEJhc2U7CgpjbGFzcyBTZXRsZXQ8RT4gZXh0ZW5kcyBTZXRCYXNlPEU+IHsKICBzdGF0aWMgY29uc3QgX1NldGxldE1hcmtlciBfTUFSS0VSID0gY29uc3QgX1NldGxldE1hcmtlcigpOwogIHN0YXRpYyBjb25zdCBpbnQgQ0FQQUNJVFkgPSA4OwoKICAvLyBUaGUgc2V0bGV0IGNhbiBiZSBpbiBvbmUgb2YgZm91ciBzdGF0ZXM6CiAgLy8KICAvLyAgICogRW1wdHkgICAgICAgICAgKGV4dHJhOiBudWxsLCAgIGNvbnRlbnRzOiBtYXJrZXIpCiAgLy8gICAqIFNpbmdsZSBlbGVtZW50IChleHRyYTogbnVsbCwgICBjb250ZW50czogZWxlbWVudCkKICAvLyAgICogTGlzdC1iYWNrZWQgICAgKGV4dHJhOiBsZW5ndGgsIGNvbnRlbnRzOiBsaXN0KQogIC8vICAgKiBTZXQtYmFja2VkICAgICAoZXh0cmE6IG1hcmtlciwgY29udGVudHM6IHNldCkKICAvLwogIC8vIFdoZW4gdGhlIHNldGxldCBpcyBsaXN0LWJhY2tlZCwgdGhlIGxpc3QgaW4gdGhlIGNvbnRlbnRzIGZpZWxkCiAgLy8gbWF5IGhhdmUgZW1wdHkgc2xvdHMgZmlsbGVkIHdpdGggdGhlIG1hcmtlciB2YWx1ZS4KICBkeW5hbWljIF9jb250ZW50cyA9IF9NQVJLRVI7CiAgdmFyIF9leHRyYTsKCiAgU2V0bGV0KCk7CiAgU2V0bGV0LmZyb20oSXRlcmFibGU8RT4gZWxlbWVudHMpIHsKICAgIGFkZEFsbChlbGVtZW50cyk7CiAgfQoKICBzdGF0aWMgU2V0PFI+IF9uZXdTZXQ8Uj4oKSA9PiBuZXcgU2V0bGV0PFI+KCk7CgogIEBvdmVycmlkZQogIFNldDxSPiBjYXN0PFI+KCkgPT4gU2V0LmNhc3RGcm9tPEUsIFI+KHRoaXMsIG5ld1NldDogX25ld1NldCk7CiAgQG92ZXJyaWRlCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yIHsKICAgIGlmIChfZXh0cmEgPT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IF9TZXRsZXRTaW5nbGVJdGVyYXRvcjxFPihfY29udGVudHMpOwogICAgfSBlbHNlIGlmIChfTUFSS0VSID09IF9leHRyYSkgewogICAgICByZXR1cm4gX2NvbnRlbnRzLml0ZXJhdG9yOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBfU2V0bGV0TGlzdEl0ZXJhdG9yPEU+KF9jb250ZW50cywgX2V4dHJhKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoIHsKICAgIGlmIChfZXh0cmEgPT0gbnVsbCkgewogICAgICByZXR1cm4gKF9NQVJLRVIgPT0gX2NvbnRlbnRzKSA/IDAgOiAxOwogICAgfSBlbHNlIGlmIChfTUFSS0VSID09IF9leHRyYSkgewogICAgICByZXR1cm4gX2NvbnRlbnRzLmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfZXh0cmE7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0VtcHR5IHsKICAgIGlmIChfZXh0cmEgPT0gbnVsbCkgewogICAgICByZXR1cm4gX01BUktFUiA9PSBfY29udGVudHM7CiAgICB9IGVsc2UgaWYgKF9NQVJLRVIgPT0gX2V4dHJhKSB7CiAgICAgIHJldHVybiBfY29udGVudHMuaXNFbXB0eTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfZXh0cmEgPT0gMDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGlmIChfZXh0cmEgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2NvbnRlbnRzID09IGVsZW1lbnQ7CiAgICB9IGVsc2UgaWYgKF9NQVJLRVIgPT0gX2V4dHJhKSB7CiAgICAgIHJldHVybiBfY29udGVudHMuY29udGFpbnMoZWxlbWVudCk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCByZW1haW5pbmcgPSBfZXh0cmEsIGkgPSAwOyByZW1haW5pbmcgPiAwICYmIGkgPCBDQVBBQ0lUWTsgaSsrKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IF9jb250ZW50c1tpXTsKICAgICAgICBpZiAoX01BUktFUiA9PSBjYW5kaWRhdGUpIGNvbnRpbnVlOwogICAgICAgIGlmIChjYW5kaWRhdGUgPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICAgICAgcmVtYWluaW5nLS07CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhZGQoRSBlbGVtZW50KSB7CiAgICBpZiAoX2V4dHJhID09IG51bGwpIHsKICAgICAgaWYgKF9NQVJLRVIgPT0gX2NvbnRlbnRzKSB7CiAgICAgICAgX2NvbnRlbnRzID0gZWxlbWVudDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChfY29udGVudHMgPT0gZWxlbWVudCkgewogICAgICAgIC8vIERvIG5vdGhpbmcuCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIExpc3QgbGlzdCA9IG5ldyBMaXN0KENBUEFDSVRZKTsKICAgICAgICBsaXN0WzBdID0gX2NvbnRlbnRzOwogICAgICAgIGxpc3RbMV0gPSBlbGVtZW50OwogICAgICAgIF9jb250ZW50cyA9IGxpc3Q7CiAgICAgICAgX2V4dHJhID0gMjsgLy8gVHdvIGVsZW1lbnRzLgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9NQVJLRVIgPT0gX2V4dHJhKSB7CiAgICAgIHJldHVybiBfY29udGVudHMuYWRkKGVsZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgaW50IHJlbWFpbmluZyA9IF9leHRyYTsKICAgICAgaW50IGluZGV4ID0gMDsKICAgICAgaW50IGNvcHlUbywgY29weUZyb207CiAgICAgIHdoaWxlIChyZW1haW5pbmcgPiAwICYmIGluZGV4IDwgQ0FQQUNJVFkpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gX2NvbnRlbnRzW2luZGV4KytdOwogICAgICAgIGlmIChfTUFSS0VSID09IGNhbmRpZGF0ZSkgewogICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgbGFzdCByYW5nZSBvZiBlbXB0eSBzbG90cyBpbiB0aGUKICAgICAgICAgIC8vIGxpc3QuIFdoZW4gd2UncmUgZG9uZSB3ZSdsbCBtb3ZlIGFsbCB0aGUgZWxlbWVudHMKICAgICAgICAgIC8vIGFmdGVyIHRob3NlIGVtcHR5IHNsb3RzIGRvd24sIHNvIHRoYXQgYWRkaW5nIGFuIGVsZW1lbnQKICAgICAgICAgIC8vIGFmdGVyIHRoYXQgd2lsbCBwcmVzZXJ2ZSB0aGUgaW5zZXJ0aW9uIG9yZGVyLgogICAgICAgICAgaWYgKGNvcHlGcm9tID09IGluZGV4IC0gMSkgewogICAgICAgICAgICBjb3B5RnJvbSsrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29weVRvID0gaW5kZXggLSAxOwogICAgICAgICAgICBjb3B5RnJvbSA9IGluZGV4OwogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBlbHNlIGlmIChjYW5kaWRhdGUgPT0gZWxlbWVudCkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZW1haW5pbmctLTsKICAgICAgfQogICAgICBpZiAoaW5kZXggPCBDQVBBQ0lUWSkgewogICAgICAgIF9jb250ZW50c1tpbmRleF0gPSBlbGVtZW50OwogICAgICAgIF9leHRyYSsrOwogICAgICB9IGVsc2UgaWYgKF9leHRyYSA8IENBUEFDSVRZKSB7CiAgICAgICAgLy8gTW92ZSB0aGUgbGFzdCBlbGVtZW50cyBkb3duIGludG8gdGhlIGxhc3QgZW1wdHkgc2xvdHMKICAgICAgICAvLyBzbyB0aGF0IHdlIGhhdmUgZW1wdHkgc2xvdHMgYWZ0ZXIgdGhlIGxhc3QgZWxlbWVudC4KICAgICAgICB3aGlsZSAoY29weUZyb20gPCBDQVBBQ0lUWSkgewogICAgICAgICAgX2NvbnRlbnRzW2NvcHlUbysrXSA9IF9jb250ZW50c1tjb3B5RnJvbSsrXTsKICAgICAgICB9CiAgICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgZWxlbWVudCBhcyB0aGUgbGFzdCBlbGVtZW50LgogICAgICAgIF9jb250ZW50c1tjb3B5VG8rK10gPSBlbGVtZW50OwogICAgICAgIF9leHRyYSsrOwogICAgICAgIC8vIENsZWFyIGFsbCBlbGVtZW50cyBhZnRlciB0aGUgbmV3IGxhc3QgZWxlbWVudHMgdG8KICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3Qga2VlcCBleHRyYSBzdHVmZiBhbGl2ZS4KICAgICAgICB3aGlsZSAoY29weVRvIDwgQ0FQQUNJVFkpIF9jb250ZW50c1tjb3B5VG8rK10gPSBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIF9jb250ZW50cyA9IG5ldyBTZXQ8RT4oKQogICAgICAgICAgLi5hZGRBbGwoKF9jb250ZW50cyBhcyBMaXN0KS5jYXN0PEU+KCkpCiAgICAgICAgICAuLmFkZChlbGVtZW50KTsKICAgICAgICBfZXh0cmEgPSBfTUFSS0VSOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpIHsKICAgIGVsZW1lbnRzLmZvckVhY2goKGVhY2gpID0+IGFkZChlYWNoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFIGxvb2t1cChPYmplY3QgZWxlbWVudCkgewogICAgaWYgKF9leHRyYSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfY29udGVudHMgPT0gZWxlbWVudCA/IF9jb250ZW50cyA6IG51bGw7CiAgICB9IGVsc2UgaWYgKF9NQVJLRVIgPT0gX2V4dHJhKSB7CiAgICAgIHJldHVybiBfY29udGVudHMubG9va3VwKGVsZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgcmVtYWluaW5nID0gX2V4dHJhLCBpID0gMDsgcmVtYWluaW5nID4gMCAmJiBpIDwgQ0FQQUNJVFk7IGkrKykgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSBfY29udGVudHNbaV07CiAgICAgICAgaWYgKF9NQVJLRVIgPT0gY2FuZGlkYXRlKSBjb250aW51ZTsKICAgICAgICBpZiAoY2FuZGlkYXRlID09IGVsZW1lbnQpIHJldHVybiBjYW5kaWRhdGU7CiAgICAgICAgcmVtYWluaW5nLS07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewogICAgaWYgKF9leHRyYSA9PSBudWxsKSB7CiAgICAgIGlmIChfY29udGVudHMgPT0gZWxlbWVudCkgewogICAgICAgIF9jb250ZW50cyA9IF9NQVJLRVI7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9NQVJLRVIgPT0gX2V4dHJhKSB7CiAgICAgIHJldHVybiBfY29udGVudHMucmVtb3ZlKGVsZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgcmVtYWluaW5nID0gX2V4dHJhLCBpID0gMDsgcmVtYWluaW5nID4gMCAmJiBpIDwgQ0FQQUNJVFk7IGkrKykgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSBfY29udGVudHNbaV07CiAgICAgICAgaWYgKF9NQVJLRVIgPT0gY2FuZGlkYXRlKSBjb250aW51ZTsKICAgICAgICBpZiAoY2FuZGlkYXRlID09IGVsZW1lbnQpIHsKICAgICAgICAgIF9jb250ZW50c1tpXSA9IF9NQVJLRVI7CiAgICAgICAgICBfZXh0cmEtLTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZW1haW5pbmctLTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZUFsbChJdGVyYWJsZTxPYmplY3Q+IG90aGVyKSB7CiAgICBvdGhlci5mb3JFYWNoKHJlbW92ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBpZiAoX2V4dHJhID09IG51bGwpIHsKICAgICAgaWYgKHRlc3QoX2NvbnRlbnRzKSkgewogICAgICAgIF9jb250ZW50cyA9IF9NQVJLRVI7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoX01BUktFUiA9PSBfZXh0cmEpIHsKICAgICAgX2NvbnRlbnRzLnJlbW92ZVdoZXJlKHRlc3QpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgcmVtYWluaW5nID0gX2V4dHJhLCBpID0gMDsgcmVtYWluaW5nID4gMCAmJiBpIDwgQ0FQQUNJVFk7IGkrKykgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSBfY29udGVudHNbaV07CiAgICAgICAgaWYgKF9NQVJLRVIgPT0gY2FuZGlkYXRlKSBjb250aW51ZTsKICAgICAgICBpZiAodGVzdChjYW5kaWRhdGUpKSB7CiAgICAgICAgICBfY29udGVudHNbaV0gPSBfTUFSS0VSOwogICAgICAgICAgX2V4dHJhLS07CiAgICAgICAgfQogICAgICAgIHJlbWFpbmluZy0tOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICByZW1vdmVXaGVyZSgoRSBlbGVtZW50KSA9PiAhdGVzdChlbGVtZW50KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJldGFpbkFsbChJdGVyYWJsZTxPYmplY3Q+IGVsZW1lbnRzKSB7CiAgICBTZXQgc2V0ID0gZWxlbWVudHMgaXMgU2V0ID8gZWxlbWVudHMgOiBlbGVtZW50cy50b1NldCgpOwogICAgcmVtb3ZlV2hlcmUoKEUgZWxlbWVudCkgPT4gIXNldC5jb250YWlucyhlbGVtZW50KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oRSBlbGVtZW50KSkgewogICAgaWYgKF9leHRyYSA9PSBudWxsKSB7CiAgICAgIGlmIChfTUFSS0VSICE9IF9jb250ZW50cykgYWN0aW9uKF9jb250ZW50cyk7CiAgICB9IGVsc2UgaWYgKF9NQVJLRVIgPT0gX2V4dHJhKSB7CiAgICAgIF9jb250ZW50cy5mb3JFYWNoKGFjdGlvbik7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCByZW1haW5pbmcgPSBfZXh0cmEsIGkgPSAwOyByZW1haW5pbmcgPiAwICYmIGkgPCBDQVBBQ0lUWTsgaSsrKSB7CiAgICAgICAgdmFyIGVsZW1lbnQgPSBfY29udGVudHNbaV07CiAgICAgICAgaWYgKF9NQVJLRVIgPT0gZWxlbWVudCkgY29udGludWU7CiAgICAgICAgYWN0aW9uKGVsZW1lbnQpOwogICAgICAgIHJlbWFpbmluZy0tOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPE9iamVjdD4gb3RoZXIpIHsKICAgIGZvciAoRSBlIGluIG90aGVyKSB7CiAgICAgIGlmICghdGhpcy5jb250YWlucyhlKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBjbGVhcigpIHsKICAgIF9jb250ZW50cyA9IF9NQVJLRVI7CiAgICBfZXh0cmEgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgU2V0PEU+IHVuaW9uKFNldDxFPiBvdGhlcikgPT4gbmV3IFNldDxFPi5mcm9tKHRoaXMpLi5hZGRBbGwob3RoZXIpOwoKICBAb3ZlcnJpZGUKICBTZXRsZXQ8RT4gaW50ZXJzZWN0aW9uKFNldDxPYmplY3Q+IG90aGVyKSA9PgogICAgICBuZXcgU2V0bGV0PEU+LmZyb20odGhpcy53aGVyZSgoZSkgPT4gb3RoZXIuY29udGFpbnMoZSkpKTsKCiAgQG92ZXJyaWRlCiAgU2V0bGV0PEU+IGRpZmZlcmVuY2UoU2V0PE9iamVjdD4gb3RoZXIpID0+CiAgICAgIG5ldyBTZXRsZXQ8RT4uZnJvbSh0aGlzLndoZXJlKChlKSA9PiAhb3RoZXIuY29udGFpbnMoZSkpKTsKCiAgQG92ZXJyaWRlCiAgU2V0bGV0PEU+IHRvU2V0KCkgewogICAgU2V0bGV0PEU+IHJlc3VsdCA9IG5ldyBTZXRsZXQ8RT4oKTsKICAgIGlmIChfZXh0cmEgPT0gbnVsbCkgewogICAgICByZXN1bHQuX2NvbnRlbnRzID0gX2NvbnRlbnRzOwogICAgfSBlbHNlIGlmIChfZXh0cmEgPT0gX01BUktFUikgewogICAgICByZXN1bHQuX2V4dHJhID0gX01BUktFUjsKICAgICAgcmVzdWx0Ll9jb250ZW50cyA9IF9jb250ZW50cy50b1NldCgpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0Ll9leHRyYSA9IF9leHRyYTsKICAgICAgcmVzdWx0Ll9jb250ZW50cyA9IF9jb250ZW50cy50b0xpc3QoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgpjbGFzcyBfU2V0bGV0TWFya2VyIHsKICBjb25zdCBfU2V0bGV0TWFya2VyKCk7CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAiLSI7Cn0KCmNsYXNzIF9TZXRsZXRTaW5nbGVJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICB2YXIgX2VsZW1lbnQ7CiAgRSBfY3VycmVudDsKICBfU2V0bGV0U2luZ2xlSXRlcmF0b3IodGhpcy5fZWxlbWVudCk7CgogIEBvdmVycmlkZQogIEUgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7CgogIEBvdmVycmlkZQogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoU2V0bGV0Ll9NQVJLRVIgPT0gX2VsZW1lbnQpIHsKICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfY3VycmVudCA9IF9lbGVtZW50OwogICAgX2VsZW1lbnQgPSBTZXRsZXQuX01BUktFUjsKICAgIHJldHVybiB0cnVlOwogIH0KfQoKY2xhc3MgX1NldGxldExpc3RJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBMaXN0IF9saXN0OwogIGludCBfcmVtYWluaW5nOwogIGludCBfaW5kZXggPSAwOwogIEUgX2N1cnJlbnQ7CiAgX1NldGxldExpc3RJdGVyYXRvcih0aGlzLl9saXN0LCB0aGlzLl9yZW1haW5pbmcpOwoKICBAb3ZlcnJpZGUKICBFIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICBAb3ZlcnJpZGUKICBib29sIG1vdmVOZXh0KCkgewogICAgd2hpbGUgKF9yZW1haW5pbmcgPiAwKSB7CiAgICAgIHZhciBjYW5kaWRhdGUgPSBfbGlzdFtfaW5kZXgrK107CiAgICAgIGlmIChTZXRsZXQuX01BUktFUiAhPSBjYW5kaWRhdGUpIHsKICAgICAgICBfY3VycmVudCA9IGNhbmRpZGF0ZTsKICAgICAgICBfcmVtYWluaW5nLS07CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIF9jdXJyZW50ID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KgVgATk48AR0BJwElPiEBLgU6Ozg3BUQ4Hw4BDCYWBAExAQxBDB0aNiQhDTwGBAEMExotJB8NFQYEAQwVGiMkIA0aBgQBDCIaIyQqDVAmLC8VCBQGBAEMGBoiHRUpFxYPKB0bGiUVCCQlDR4VHDIsJEA/RTsnGBMgHgwUKxgKFQgeJBImQT8mNwo3JxI9Nj4PITIaGggTBgQBDCYrBAEMHRo2JCgNUCYsNBUIEwYEAQwgGiIdFQ8WCCQoDVAmLCQiFBcKFQgUBgQBDCsbBAEMKxodHQgkIw1QJiwfIhQKFQgGBAEMKzAEAQwuPTgEAQwpGjMkIQ1QJCoZFQgGBAEMLRkrBhEEAQwMGRMEAQxGAQwvQAEMLUEBDBYoGiQkHywNHi0GEwQCARYZDBUCATgQDigBDB0BDBQmFxQGGR8RBAIBNhQSEg40AQwdAQwUHScpHhYVCAYVEgQCASVwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL3NldGxldC5kYXJ0MXNka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL2JpbmFyeS9hc3RfdG9fYmluYXJ5LmRhcnTAATa7Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuYXN0X3RvX2JpbmFyeTsKCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyB1dGY4OwoKaW1wb3J0ICcuLi9hc3QuZGFydCc7CmltcG9ydCAndGFnLmRhcnQnOwppbXBvcnQgJ2RhcnQ6aW8nIHNob3cgQnl0ZXNCdWlsZGVyOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgovLy8gV3JpdGVzIHRvIGEgYmluYXJ5IGZpbGUuCi8vLwovLy8gQSBbQmluYXJ5UHJpbnRlcl0gY2FuIGJlIHVzZWQgdG8gd3JpdGUgb25lIGZpbGUgYW5kIG11c3QgdGhlbiBiZQovLy8gZGlzY2FyZGVkLgpjbGFzcyBCaW5hcnlQcmludGVyIGltcGxlbWVudHMgVmlzaXRvcjx2b2lkPiwgQmluYXJ5U2luayB7CiAgVmFyaWFibGVJbmRleGVyIF92YXJpYWJsZUluZGV4ZXI7CiAgTGFiZWxJbmRleGVyIF9sYWJlbEluZGV4ZXI7CiAgU3dpdGNoQ2FzZUluZGV4ZXIgX3N3aXRjaENhc2VJbmRleGVyOwogIGZpbmFsIFR5cGVQYXJhbWV0ZXJJbmRleGVyIF90eXBlUGFyYW1ldGVySW5kZXhlciA9IG5ldyBUeXBlUGFyYW1ldGVySW5kZXhlcigpOwogIGZpbmFsIFN0cmluZ0luZGV4ZXIgc3RyaW5nSW5kZXhlcjsKICBDb25zdGFudEluZGV4ZXIgX2NvbnN0YW50SW5kZXhlcjsKICBmaW5hbCBVcmlJbmRleGVyIF9zb3VyY2VVcmlJbmRleGVyID0gbmV3IFVyaUluZGV4ZXIoKTsKICBib29sIF9jdXJyZW50bHlJbk5vbmltcGxlbWVudGF0aW9uID0gZmFsc2U7CiAgZmluYWwgTGlzdDxib29sPiBfc291cmNlc0Zyb21SZWFsSW1wbGVtZW50YXRpb24gPSBuZXcgTGlzdDxib29sPigpOwogIGZpbmFsIExpc3Q8Ym9vbD4gX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uSW5MaWJyYXJ5ID0gbmV3IExpc3Q8Ym9vbD4oKTsKICBNYXA8TGlicmFyeURlcGVuZGVuY3ksIGludD4gX2xpYnJhcnlEZXBlbmRlbmN5SW5kZXggPQogICAgICA8TGlicmFyeURlcGVuZGVuY3ksIGludD57fTsKCiAgTGlzdDxfTWV0YWRhdGFTdWJzZWN0aW9uPiBfbWV0YWRhdGFTdWJzZWN0aW9uczsKCiAgZmluYWwgQnVmZmVyZWRTaW5rIF9tYWluU2luazsKICBmaW5hbCBCdWZmZXJlZFNpbmsgX21ldGFkYXRhU2luazsKICBmaW5hbCBCeXRlc1NpbmsgX2NvbnN0YW50c0J5dGVzU2luazsKICBCdWZmZXJlZFNpbmsgX2NvbnN0YW50c1Npbms7CiAgQnVmZmVyZWRTaW5rIF9zaW5rOwogIGJvb2wgaW5jbHVkZVNvdXJjZXM7CiAgYm9vbCBpbmNsdWRlT2Zmc2V0czsKCiAgTGlzdDxpbnQ+IGxpYnJhcnlPZmZzZXRzOwogIExpc3Q8aW50PiBjbGFzc09mZnNldHM7CiAgTGlzdDxpbnQ+IHByb2NlZHVyZU9mZnNldHM7CiAgaW50IF9iaW5hcnlPZmZzZXRGb3JTb3VyY2VUYWJsZSA9IC0xOwogIGludCBfYmluYXJ5T2Zmc2V0Rm9yTGlua1RhYmxlID0gLTE7CiAgaW50IF9iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzID0gLTE7CiAgaW50IF9iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YU1hcHBpbmdzID0gLTE7CiAgaW50IF9iaW5hcnlPZmZzZXRGb3JTdHJpbmdUYWJsZSA9IC0xOwogIGludCBfYmluYXJ5T2Zmc2V0Rm9yQ29uc3RhbnRUYWJsZSA9IC0xOwoKICBMaXN0PENhbm9uaWNhbE5hbWU+IF9jYW5vbmljYWxOYW1lTGlzdDsKICBTZXQ8Q2Fub25pY2FsTmFtZT4gX2tub3duQ2Fub25pY2FsTmFtZU5vblJvb3RUb3BzID0gbmV3IFNldDxDYW5vbmljYWxOYW1lPigpOwogIFNldDxDYW5vbmljYWxOYW1lPiBfcmVpbmRleGVkQ2Fub25pY2FsTmFtZXMgPSBuZXcgU2V0PENhbm9uaWNhbE5hbWU+KCk7CgogIC8vLyBDcmVhdGUgYSBwcmludGVyIHRoYXQgd3JpdGVzIHRvIHRoZSBnaXZlbiBbc2lua10uCiAgLy8vCiAgLy8vIFRoZSBCaW5hcnlQcmludGVyIHdpbGwgdXNlIGl0cyBvd24gYnVmZmVyLCBzbyB0aGUgW3NpbmtdIGRvZXMgbm90IG5lZWQKICAvLy8gb25lLgogIEJpbmFyeVByaW50ZXIoU2luazxMaXN0PGludD4+IHNpbmssCiAgICAgIHtTdHJpbmdJbmRleGVyIHN0cmluZ0luZGV4ZXIsCiAgICAgIHRoaXMuaW5jbHVkZVNvdXJjZXMgPSB0cnVlLAogICAgICB0aGlzLmluY2x1ZGVPZmZzZXRzID0gdHJ1ZX0pCiAgICAgIDogX21haW5TaW5rID0gbmV3IEJ1ZmZlcmVkU2luayhzaW5rKSwKICAgICAgICBfbWV0YWRhdGFTaW5rID0gbmV3IEJ1ZmZlcmVkU2luayhuZXcgQnl0ZXNTaW5rKCkpLAogICAgICAgIF9jb25zdGFudHNCeXRlc1NpbmsgPSBuZXcgQnl0ZXNTaW5rKCksCiAgICAgICAgc3RyaW5nSW5kZXhlciA9IHN0cmluZ0luZGV4ZXIgPz8gbmV3IFN0cmluZ0luZGV4ZXIoKSB7CiAgICBfY29uc3RhbnRzU2luayA9IG5ldyBCdWZmZXJlZFNpbmsoX2NvbnN0YW50c0J5dGVzU2luayk7CiAgICBfY29uc3RhbnRJbmRleGVyID0gbmV3IENvbnN0YW50SW5kZXhlcih0aGlzLnN0cmluZ0luZGV4ZXIsIHRoaXMpOwogICAgX3NpbmsgPSBfbWFpblNpbms7CiAgfQoKICB2b2lkIF9mbHVzaCgpIHsKICAgIF9zaW5rLmZsdXNoQW5kRGVzdHJveSgpOwogIH0KCiAgdm9pZCB3cml0ZUJ5dGUoaW50IGJ5dGUpIHsKICAgIF9zaW5rLmFkZEJ5dGUoYnl0ZSk7CiAgfQoKICB2b2lkIHdyaXRlQnl0ZXMoTGlzdDxpbnQ+IGJ5dGVzKSB7CiAgICBfc2luay5hZGRCeXRlcyhieXRlcyk7CiAgfQoKICB2b2lkIHdyaXRlVUludDMwKGludCB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlID49IDAgJiYgdmFsdWUgPj4gMzAgPT0gMCk7CiAgICBpZiAodmFsdWUgPCAweDgwKSB7CiAgICAgIF9zaW5rLmFkZEJ5dGUodmFsdWUpOwogICAgfSBlbHNlIGlmICh2YWx1ZSA8IDB4NDAwMCkgewogICAgICBfc2luay5hZGRCeXRlMigodmFsdWUgPj4gOCkgfCAweDgwLCB2YWx1ZSAmIDB4RkYpOwogICAgfSBlbHNlIHsKICAgICAgX3NpbmsuYWRkQnl0ZTQoKHZhbHVlID4+IDI0KSB8IDB4QzAsICh2YWx1ZSA+PiAxNikgJiAweEZGLAogICAgICAgICAgKHZhbHVlID4+IDgpICYgMHhGRiwgdmFsdWUgJiAweEZGKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVVSW50MzIoaW50IHZhbHVlKSB7CiAgICBfc2luay5hZGRCeXRlNCgodmFsdWUgPj4gMjQpICYgMHhGRiwgKHZhbHVlID4+IDE2KSAmIDB4RkYsCiAgICAgICAgKHZhbHVlID4+IDgpICYgMHhGRiwgdmFsdWUgJiAweEZGKTsKICB9CgogIHZvaWQgd3JpdGVCeXRlTGlzdChMaXN0PGludD4gdXRmOEJ5dGVzKSB7CiAgICB3cml0ZVVJbnQzMCh1dGY4Qnl0ZXMubGVuZ3RoKTsKICAgIHdyaXRlQnl0ZXModXRmOEJ5dGVzKTsKICB9CgogIGludCBnZXRCdWZmZXJPZmZzZXQoKSB7CiAgICByZXR1cm4gX3Npbmsub2Zmc2V0OwogIH0KCiAgdm9pZCB3cml0ZVN0cmluZ1RhYmxlKFN0cmluZ0luZGV4ZXIgaW5kZXhlcikgewogICAgX2JpbmFyeU9mZnNldEZvclN0cmluZ1RhYmxlID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CgogICAgLy8gQ29udGFpbmVycyBmb3IgdGhlIHV0ZjggZW5jb2RlZCBzdHJpbmdzLgogICAgZmluYWwgTGlzdDxVaW50OExpc3Q+IGRhdGEgPSBuZXcgTGlzdDxVaW50OExpc3Q+KCk7CiAgICBpbnQgdG90YWxMZW5ndGggPSAwOwogICAgY29uc3QgaW50IG1pbkxlbmd0aCA9IDEgPDwgMTY7CiAgICBVaW50OExpc3QgYnVmZmVyOwogICAgaW50IGluZGV4ID0gMDsKCiAgICAvLyBXcml0ZSB0aGUgZW5kIG9mZnNldHMuCiAgICB3cml0ZVVJbnQzMChpbmRleGVyLmluZGV4Lmxlbmd0aCk7CiAgICBmb3IgKFN0cmluZyBrZXkgaW4gaW5kZXhlci5pbmRleC5rZXlzKSB7CiAgICAgIGlmIChrZXkuaXNOb3RFbXB0eSkgewogICAgICAgIGludCByZXF1aXJlZE1pbkxlbmd0aCA9IGtleS5sZW5ndGg7CiAgICAgICAgaW50IGFsbG9jYXRlTWluTGVuZ3RoID0gcmVxdWlyZWRNaW5MZW5ndGggKiAzOwogICAgICAgIGludCBuZXdJbmRleDsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsIHx8IGluZGV4ICsgcmVxdWlyZWRNaW5MZW5ndGggPj0gYnVmZmVyLmxlbmd0aCkgewogICAgICAgICAgICBpbnQgbmV3TGVuZ3RoID0gbWluTGVuZ3RoOwogICAgICAgICAgICBpZiAoYWxsb2NhdGVNaW5MZW5ndGggPiBuZXdMZW5ndGgpIG5ld0xlbmd0aCA9IGFsbG9jYXRlTWluTGVuZ3RoOwogICAgICAgICAgICBpZiAoYnVmZmVyICE9IG51bGwgJiYgaW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgZGF0YS5hZGQobmV3IFVpbnQ4TGlzdC52aWV3KGJ1ZmZlci5idWZmZXIsIDAsIGluZGV4KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5kZXggPSAwOwogICAgICAgICAgICBidWZmZXIgPSBuZXcgVWludDhMaXN0KG5ld0xlbmd0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBuZXdJbmRleCA9IE5vdFF1aXRlU3RyaW5nLndyaXRlVXRmOChidWZmZXIsIGluZGV4LCBrZXkpOwogICAgICAgICAgaWYgKG5ld0luZGV4ICE9IC0xKSBicmVhazsKICAgICAgICAgIHJlcXVpcmVkTWluTGVuZ3RoID0gYWxsb2NhdGVNaW5MZW5ndGg7CiAgICAgICAgfQogICAgICAgIGlmIChuZXdJbmRleCA8IDApIHsKICAgICAgICAgIC8vIFV0ZjggZW5jb2RpbmcgZmFpbGVkLgogICAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsICYmIGluZGV4ID4gMCkgewogICAgICAgICAgICBkYXRhLmFkZChuZXcgVWludDhMaXN0LnZpZXcoYnVmZmVyLmJ1ZmZlciwgMCwgaW5kZXgpKTsKICAgICAgICAgICAgYnVmZmVyID0gbnVsbDsKICAgICAgICAgICAgaW5kZXggPSAwOwogICAgICAgICAgfQogICAgICAgICAgTGlzdDxpbnQ+IGNvbnZlcnRlZCA9IHV0ZjguZW5jb2Rlci5jb252ZXJ0KGtleSk7CiAgICAgICAgICBkYXRhLmFkZChjb252ZXJ0ZWQpOwogICAgICAgICAgdG90YWxMZW5ndGggKz0gY29udmVydGVkLmxlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG90YWxMZW5ndGggKz0gbmV3SW5kZXggLSBpbmRleDsKICAgICAgICAgIGluZGV4ID0gbmV3SW5kZXg7CiAgICAgICAgfQogICAgICB9CiAgICAgIHdyaXRlVUludDMwKHRvdGFsTGVuZ3RoKTsKICAgIH0KICAgIGlmIChidWZmZXIgIT0gbnVsbCAmJiBpbmRleCA+IDApIHsKICAgICAgZGF0YS5hZGQoVWludDhMaXN0LnZpZXcoYnVmZmVyLmJ1ZmZlciwgMCwgaW5kZXgpKTsKICAgIH0KCiAgICAvLyBXcml0ZSB0aGUgVVRGLTggZW5jb2RlZCBzdHJpbmdzLgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSB7CiAgICAgIHdyaXRlQnl0ZXMoZGF0YVtpXSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlU3RyaW5nUmVmZXJlbmNlKFN0cmluZyBzdHJpbmcpIHsKICAgIHdyaXRlVUludDMwKHN0cmluZ0luZGV4ZXIucHV0KHN0cmluZykpOwogIH0KCiAgdm9pZCB3cml0ZVN0cmluZ1JlZmVyZW5jZUxpc3QoTGlzdDxTdHJpbmc+IHN0cmluZ3MpIHsKICAgIHdyaXRlTGlzdChzdHJpbmdzLCB3cml0ZVN0cmluZ1JlZmVyZW5jZSk7CiAgfQoKICB2b2lkIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2UoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIHdyaXRlVUludDMwKF9jb25zdGFudEluZGV4ZXIucHV0KGNvbnN0YW50KSk7CiAgfQoKICB2b2lkIHdyaXRlQ29uc3RhbnRUYWJsZShDb25zdGFudEluZGV4ZXIgaW5kZXhlcikgewogICAgX2JpbmFyeU9mZnNldEZvckNvbnN0YW50VGFibGUgPSBnZXRCdWZmZXJPZmZzZXQoKTsKCiAgICB3cml0ZVVJbnQzMChpbmRleGVyLmVudHJpZXMubGVuZ3RoKTsKICAgIGFzc2VydChpZGVudGljYWwoX3NpbmssIF9tYWluU2luaykpOwogICAgX2NvbnN0YW50c1NpbmsuZmx1c2hBbmREZXN0cm95KCk7CiAgICB3cml0ZUJ5dGVzKF9jb25zdGFudHNCeXRlc1NpbmsuYnVpbGRlci50YWtlQnl0ZXMoKSk7CiAgfQoKICBpbnQgd3JpdGVDb25zdGFudFRhYmxlRW50cnkoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIEJ1ZmZlcmVkU2luayBvbGRTaW5rID0gX3Npbms7CiAgICBfc2luayA9IF9jb25zdGFudHNTaW5rOwogICAgaW50IGluaXRpYWxPZmZzZXQgPSBfc2luay5vZmZzZXQ7CiAgICBpZiAoY29uc3RhbnQgaXMgTnVsbENvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5OdWxsQ29uc3RhbnQpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBCb29sQ29uc3RhbnQpIHsKICAgICAgd3JpdGVCeXRlKENvbnN0YW50VGFnLkJvb2xDb25zdGFudCk7CiAgICAgIHdyaXRlQnl0ZShjb25zdGFudC52YWx1ZSA/IDEgOiAwKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgSW50Q29uc3RhbnQpIHsKICAgICAgd3JpdGVCeXRlKENvbnN0YW50VGFnLkludENvbnN0YW50KTsKICAgICAgd3JpdGVJbnRlZ2VyKGNvbnN0YW50LnZhbHVlKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgRG91YmxlQ29uc3RhbnQpIHsKICAgICAgd3JpdGVCeXRlKENvbnN0YW50VGFnLkRvdWJsZUNvbnN0YW50KTsKICAgICAgd3JpdGVEb3VibGUoY29uc3RhbnQudmFsdWUpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBTdHJpbmdDb25zdGFudCkgewogICAgICB3cml0ZUJ5dGUoQ29uc3RhbnRUYWcuU3RyaW5nQ29uc3RhbnQpOwogICAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShjb25zdGFudC52YWx1ZSk7CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50IGlzIFN5bWJvbENvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5TeW1ib2xDb25zdGFudCk7CiAgICAgIHdyaXRlTnVsbEFsbG93ZWRSZWZlcmVuY2UoY29uc3RhbnQubGlicmFyeVJlZmVyZW5jZSk7CiAgICAgIHdyaXRlU3RyaW5nUmVmZXJlbmNlKGNvbnN0YW50Lm5hbWUpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBNYXBDb25zdGFudCkgewogICAgICB3cml0ZUJ5dGUoQ29uc3RhbnRUYWcuTWFwQ29uc3RhbnQpOwogICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LmtleVR5cGUpOwogICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LnZhbHVlVHlwZSk7CiAgICAgIHdyaXRlVUludDMwKGNvbnN0YW50LmVudHJpZXMubGVuZ3RoKTsKICAgICAgZm9yIChmaW5hbCBDb25zdGFudE1hcEVudHJ5IGVudHJ5IGluIGNvbnN0YW50LmVudHJpZXMpIHsKICAgICAgICB3cml0ZUNvbnN0YW50UmVmZXJlbmNlKGVudHJ5LmtleSk7CiAgICAgICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShlbnRyeS52YWx1ZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgTGlzdENvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5MaXN0Q29uc3RhbnQpOwogICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LnR5cGVBcmd1bWVudCk7CiAgICAgIHdyaXRlVUludDMwKGNvbnN0YW50LmVudHJpZXMubGVuZ3RoKTsKICAgICAgY29uc3RhbnQuZW50cmllcy5mb3JFYWNoKHdyaXRlQ29uc3RhbnRSZWZlcmVuY2UpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBTZXRDb25zdGFudCkgewogICAgICB3cml0ZUJ5dGUoQ29uc3RhbnRUYWcuU2V0Q29uc3RhbnQpOwogICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LnR5cGVBcmd1bWVudCk7CiAgICAgIHdyaXRlVUludDMwKGNvbnN0YW50LmVudHJpZXMubGVuZ3RoKTsKICAgICAgY29uc3RhbnQuZW50cmllcy5mb3JFYWNoKHdyaXRlQ29uc3RhbnRSZWZlcmVuY2UpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBJbnN0YW5jZUNvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5JbnN0YW5jZUNvbnN0YW50KTsKICAgICAgd3JpdGVDbGFzc1JlZmVyZW5jZShjb25zdGFudC5jbGFzc05vZGUpOwogICAgICB3cml0ZVVJbnQzMChjb25zdGFudC50eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICAgIGNvbnN0YW50LnR5cGVBcmd1bWVudHMuZm9yRWFjaCh3cml0ZURhcnRUeXBlKTsKICAgICAgd3JpdGVVSW50MzAoY29uc3RhbnQuZmllbGRWYWx1ZXMubGVuZ3RoKTsKICAgICAgY29uc3RhbnQuZmllbGRWYWx1ZXMuZm9yRWFjaCgoUmVmZXJlbmNlIGZpZWxkUmVmLCBDb25zdGFudCB2YWx1ZSkgewogICAgICAgIHdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoZmllbGRSZWYuY2Fub25pY2FsTmFtZSk7CiAgICAgICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZSh2YWx1ZSk7CiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5QYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KTsKICAgICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShjb25zdGFudC50ZWFyT2ZmQ29uc3RhbnQpOwogICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gY29uc3RhbnQudHlwZXMubGVuZ3RoOwogICAgICB3cml0ZVVJbnQzMChsZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgd3JpdGVEYXJ0VHlwZShjb25zdGFudC50eXBlc1tpXSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgVGVhck9mZkNvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5UZWFyT2ZmQ29uc3RhbnQpOwogICAgICB3cml0ZU5vbk51bGxDYW5vbmljYWxOYW1lUmVmZXJlbmNlKGNvbnN0YW50LnByb2NlZHVyZS5jYW5vbmljYWxOYW1lKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgVHlwZUxpdGVyYWxDb25zdGFudCkgewogICAgICB3cml0ZUJ5dGUoQ29uc3RhbnRUYWcuVHlwZUxpdGVyYWxDb25zdGFudCk7CiAgICAgIHdyaXRlRGFydFR5cGUoY29uc3RhbnQudHlwZSk7CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50IGlzIFVuZXZhbHVhdGVkQ29uc3RhbnQpIHsKICAgICAgd3JpdGVCeXRlKENvbnN0YW50VGFnLlVuZXZhbHVhdGVkQ29uc3RhbnQpOwogICAgICB3cml0ZU5vZGUoY29uc3RhbnQuZXhwcmVzc2lvbik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignVW5zdXBwb3J0ZWQgY29uc3RhbnQgJGNvbnN0YW50Jyk7CiAgICB9CiAgICBfc2luayA9IG9sZFNpbms7CiAgICByZXR1cm4gX2NvbnN0YW50c1Npbmsub2Zmc2V0IC0gaW5pdGlhbE9mZnNldDsKICB9CgogIHZvaWQgd3JpdGVEYXJ0VHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICB0eXBlLmFjY2VwdCh0aGlzKTsKICB9CgogIC8vIFJldHVybnMgdGhlIG5ldyBhY3RpdmUgZmlsZSB1cmkuCiAgdm9pZCB3cml0ZVVyaVJlZmVyZW5jZShVcmkgdXJpKSB7CiAgICBmaW5hbCBpbnQgaW5kZXggPSBfc291cmNlVXJpSW5kZXhlci5wdXQodXJpKTsKICAgIHdyaXRlVUludDMwKGluZGV4KTsKICAgIGlmICghX2N1cnJlbnRseUluTm9uaW1wbGVtZW50YXRpb24pIHsKICAgICAgaWYgKF9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbkluTGlicmFyeS5sZW5ndGggPD0gaW5kZXgpIHsKICAgICAgICBfc291cmNlc0Zyb21SZWFsSW1wbGVtZW50YXRpb25JbkxpYnJhcnkubGVuZ3RoID0gaW5kZXggKyAxOwogICAgICB9CiAgICAgIF9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbkluTGlicmFyeVtpbmRleF0gPSB0cnVlOwogICAgICBpZiAoX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uLmxlbmd0aCA8PSBpbmRleCkgewogICAgICAgIF9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbi5sZW5ndGggPSBpbmRleCArIDE7CiAgICAgIH0KICAgICAgX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uW2luZGV4XSA9IHRydWU7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTGlzdDxUPihMaXN0PFQ+IGl0ZW1zLCB2b2lkIHdyaXRlSXRlbShUIHgpKSB7CiAgICB3cml0ZVVJbnQzMChpdGVtcy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgewogICAgICB3cml0ZUl0ZW0oaXRlbXNbaV0pOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZU5vZGVMaXN0KExpc3Q8Tm9kZT4gbm9kZXMpIHsKICAgIGZpbmFsIGxlbiA9IG5vZGVzLmxlbmd0aDsKICAgIHdyaXRlVUludDMwKGxlbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGZpbmFsIG5vZGUgPSBub2Rlc1tpXTsKICAgICAgd3JpdGVOb2RlKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVByb2NlZHVyZU5vZGVMaXN0KExpc3Q8UHJvY2VkdXJlPiBub2RlcykgewogICAgZmluYWwgbGVuID0gbm9kZXMubGVuZ3RoOwogICAgd3JpdGVVSW50MzAobGVuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgZmluYWwgbm9kZSA9IG5vZGVzW2ldOwogICAgICB3cml0ZVByb2NlZHVyZU5vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlRmllbGROb2RlTGlzdChMaXN0PEZpZWxkPiBub2RlcykgewogICAgZmluYWwgbGVuID0gbm9kZXMubGVuZ3RoOwogICAgd3JpdGVVSW50MzAobGVuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgZmluYWwgbm9kZSA9IG5vZGVzW2ldOwogICAgICB3cml0ZUZpZWxkTm9kZShub2RlKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVDbGFzc05vZGVMaXN0KExpc3Q8Q2xhc3M+IG5vZGVzKSB7CiAgICBmaW5hbCBsZW4gPSBub2Rlcy5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMChsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmaW5hbCBub2RlID0gbm9kZXNbaV07CiAgICAgIHdyaXRlQ2xhc3NOb2RlKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUNvbnN0cnVjdG9yTm9kZUxpc3QoTGlzdDxDb25zdHJ1Y3Rvcj4gbm9kZXMpIHsKICAgIGZpbmFsIGxlbiA9IG5vZGVzLmxlbmd0aDsKICAgIHdyaXRlVUludDMwKGxlbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGZpbmFsIG5vZGUgPSBub2Rlc1tpXTsKICAgICAgd3JpdGVDb25zdHJ1Y3Rvck5vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JOb2RlTGlzdCgKICAgICAgTGlzdDxSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcj4gbm9kZXMpIHsKICAgIGZpbmFsIGxlbiA9IG5vZGVzLmxlbmd0aDsKICAgIHdyaXRlVUludDMwKGxlbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGZpbmFsIG5vZGUgPSBub2Rlc1tpXTsKICAgICAgd3JpdGVSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvck5vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlU3dpdGNoQ2FzZU5vZGVMaXN0KExpc3Q8U3dpdGNoQ2FzZT4gbm9kZXMpIHsKICAgIGZpbmFsIGxlbiA9IG5vZGVzLmxlbmd0aDsKICAgIHdyaXRlVUludDMwKGxlbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGZpbmFsIG5vZGUgPSBub2Rlc1tpXTsKICAgICAgd3JpdGVTd2l0Y2hDYXNlTm9kZShub2RlKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVDYXRjaE5vZGVMaXN0KExpc3Q8Q2F0Y2g+IG5vZGVzKSB7CiAgICBmaW5hbCBsZW4gPSBub2Rlcy5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMChsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmaW5hbCBub2RlID0gbm9kZXNbaV07CiAgICAgIHdyaXRlQ2F0Y2hOb2RlKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVR5cGVkZWZOb2RlTGlzdChMaXN0PFR5cGVkZWY+IG5vZGVzKSB7CiAgICBmaW5hbCBsZW4gPSBub2Rlcy5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMChsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmaW5hbCBub2RlID0gbm9kZXNbaV07CiAgICAgIHdyaXRlVHlwZWRlZk5vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTm9kZShOb2RlIG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB3cml0ZUZ1bmN0aW9uTm9kZShGdW5jdGlvbk5vZGUgbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHdyaXRlQXJndW1lbnRzTm9kZShBcmd1bWVudHMgbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHdyaXRlTGlicmFyeU5vZGUoTGlicmFyeSBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIHZvaWQgd3JpdGVQcm9jZWR1cmVOb2RlKFByb2NlZHVyZSBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIHZvaWQgd3JpdGVGaWVsZE5vZGUoRmllbGQgbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHdyaXRlQ2xhc3NOb2RlKENsYXNzIG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB3cml0ZUNvbnN0cnVjdG9yTm9kZShDb25zdHJ1Y3RvciBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIHZvaWQgd3JpdGVSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvck5vZGUoCiAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB3cml0ZVN3aXRjaENhc2VOb2RlKFN3aXRjaENhc2Ugbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHdyaXRlQ2F0Y2hOb2RlKENhdGNoIG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB3cml0ZVR5cGVkZWZOb2RlKFR5cGVkZWYgbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHdyaXRlT3B0aW9uYWxOb2RlKE5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICB3cml0ZUJ5dGUoVGFnLk5vdGhpbmcpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVCeXRlKFRhZy5Tb21ldGhpbmcpOwogICAgICB3cml0ZU5vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlT3B0aW9uYWxGdW5jdGlvbk5vZGUoRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgd3JpdGVCeXRlKFRhZy5Ob3RoaW5nKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuU29tZXRoaW5nKTsKICAgICAgd3JpdGVGdW5jdGlvbk5vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTGlua1RhYmxlKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIF9iaW5hcnlPZmZzZXRGb3JMaW5rVGFibGUgPSBnZXRCdWZmZXJPZmZzZXQoKTsKICAgIHdyaXRlTGlzdChfY2Fub25pY2FsTmFtZUxpc3QsIHdyaXRlQ2Fub25pY2FsTmFtZUVudHJ5KTsKICB9CgogIHZvaWQgaW5kZXhMaW5rVGFibGUoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgX2Nhbm9uaWNhbE5hbWVMaXN0ID0gPENhbm9uaWNhbE5hbWU+W107CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudC5saWJyYXJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgTGlicmFyeSBsaWJyYXJ5ID0gY29tcG9uZW50LmxpYnJhcmllc1tpXTsKICAgICAgaWYgKCFzaG91bGRXcml0ZUxpYnJhcnlDYW5vbmljYWxOYW1lcyhsaWJyYXJ5KSkgY29udGludWU7CiAgICAgIF9pbmRleExpbmtUYWJsZUludGVybmFsKGxpYnJhcnkuY2Fub25pY2FsTmFtZSk7CiAgICAgIF9rbm93bkNhbm9uaWNhbE5hbWVOb25Sb290VG9wcy5hZGQobGlicmFyeS5jYW5vbmljYWxOYW1lKTsKICAgIH0KICB9CgogIHZvaWQgX2luZGV4TGlua1RhYmxlSW50ZXJuYWwoQ2Fub25pY2FsTmFtZSBub2RlKSB7CiAgICBub2RlLmluZGV4ID0gX2Nhbm9uaWNhbE5hbWVMaXN0Lmxlbmd0aDsKICAgIF9jYW5vbmljYWxOYW1lTGlzdC5hZGQobm9kZSk7CiAgICBJdGVyYWJsZTxDYW5vbmljYWxOYW1lPiBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW5Pck51bGw7CiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewogICAgICBmb3IgKENhbm9uaWNhbE5hbWUgY2hpbGQgaW4gY2hpbGRyZW4pIHsKICAgICAgICBfaW5kZXhMaW5rVGFibGVJbnRlcm5hbChjaGlsZCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBDb21wdXRlIGNhbm9uaWNhbCBuYW1lcyBmb3IgdGhlIHdob2xlIGNvbXBvbmVudCBvciBwYXJ0cyBvZiBpdC4KICB2b2lkIGNvbXB1dGVDYW5vbmljYWxOYW1lcyhDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBjb21wb25lbnQuY29tcHV0ZUNhbm9uaWNhbE5hbWVzKCk7CiAgfQoKICAvLy8gUmV0dXJuIGB0cnVlYCBpZiBhbGwgY2Fub25pY2FsIG5hbWVzIG9mIHRoZSBbbGlicmFyeV0gc2hvdWxkIGJlIHdyaXR0ZW4KICAvLy8gaW50byB0aGUgbGluayB0YWJsZS4gIElmIHNvbWUgbGlicmFyaWVzIG9mIHRoZSBjb21wb25lbnQgYXJlIHNraXBwZWQsCiAgLy8vIHRoZW4gYWxsIHRoZSBhZGRpdGlvbmFsIG5hbWVzIHJlZmVyZW5jZWQgYnkgdGhlIGxpYnJhcmllcyB0aGF0IGFyZSB3cml0dGVuCiAgLy8vIGJ5IFt3cml0ZUxpYnJhcmllc10gYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQuCiAgYm9vbCBzaG91bGRXcml0ZUxpYnJhcnlDYW5vbmljYWxOYW1lcyhMaWJyYXJ5IGxpYnJhcnkpID0+IHRydWU7CgogIHZvaWQgd3JpdGVDYW5vbmljYWxOYW1lRW50cnkoQ2Fub25pY2FsTmFtZSBub2RlKSB7CiAgICBDYW5vbmljYWxOYW1lIHBhcmVudCA9IG5vZGUucGFyZW50OwogICAgaWYgKHBhcmVudC5pc1Jvb3QpIHsKICAgICAgd3JpdGVVSW50MzAoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZVVJbnQzMChwYXJlbnQuaW5kZXggKyAxKTsKICAgIH0KICAgIHdyaXRlU3RyaW5nUmVmZXJlbmNlKG5vZGUubmFtZSk7CiAgfQoKICB2b2lkIHdyaXRlQ29tcG9uZW50RmlsZShDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBjb21wdXRlQ2Fub25pY2FsTmFtZXMoY29tcG9uZW50KTsKICAgIGZpbmFsIGNvbXBvbmVudE9mZnNldCA9IGdldEJ1ZmZlck9mZnNldCgpOwogICAgd3JpdGVVSW50MzIoVGFnLkNvbXBvbmVudEZpbGUpOwogICAgd3JpdGVVSW50MzIoVGFnLkJpbmFyeUZvcm1hdFZlcnNpb24pOwogICAgd3JpdGVMaXN0T2ZTdHJpbmdzKGNvbXBvbmVudC5wcm9ibGVtc0FzSnNvbik7CiAgICBpbmRleExpbmtUYWJsZShjb21wb25lbnQpOwogICAgX2NvbGxlY3RNZXRhZGF0YShjb21wb25lbnQpOwogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhSW1wbChjb21wb25lbnQsIGNvbXBvbmVudE9mZnNldCk7CiAgICB9CiAgICBsaWJyYXJ5T2Zmc2V0cyA9IDxpbnQ+W107CiAgICBDYW5vbmljYWxOYW1lIG1haW4gPSBnZXRDYW5vbmljYWxOYW1lT2ZNZW1iZXIoY29tcG9uZW50Lm1haW5NZXRob2QpOwogICAgaWYgKG1haW4gIT0gbnVsbCkgewogICAgICBjaGVja0Nhbm9uaWNhbE5hbWUobWFpbik7CiAgICB9CiAgICB3cml0ZUxpYnJhcmllcyhjb21wb25lbnQpOwogICAgd3JpdGVVcmlUb1NvdXJjZShjb21wb25lbnQudXJpVG9Tb3VyY2UpOwogICAgd3JpdGVMaW5rVGFibGUoY29tcG9uZW50KTsKICAgIF93cml0ZU1ldGFkYXRhU2VjdGlvbihjb21wb25lbnQpOwogICAgd3JpdGVTdHJpbmdUYWJsZShzdHJpbmdJbmRleGVyKTsKICAgIHdyaXRlQ29uc3RhbnRUYWJsZShfY29uc3RhbnRJbmRleGVyKTsKICAgIHdyaXRlQ29tcG9uZW50SW5kZXgoY29tcG9uZW50LCBjb21wb25lbnQubGlicmFyaWVzKTsKCiAgICBfZmx1c2goKTsKICB9CgogIHZvaWQgd3JpdGVMaXN0T2ZTdHJpbmdzKExpc3Q8U3RyaW5nPiBzdHJpbmdzKSB7CiAgICB3cml0ZVVJbnQzMChzdHJpbmdzPy5sZW5ndGggPz8gMCk7CiAgICBpZiAoc3RyaW5ncyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewogICAgICAgIFN0cmluZyBzID0gc3RyaW5nc1tpXTsKICAgICAgICAvLyBUaGlzIGlzIHNsb3csIGJ1dCB3ZSBleHBlY3QgdGhlcmUgdG8gaW4gZ2VuZXJhbCBiZSBubyBwcm9ibGVtcy4gSWYgdGhpcwogICAgICAgIC8vIHR1cm5zIG91dCB0byBiZSB3cm9uZyB3ZSBjYW4gb3B0aW1pemUgaXQgYXMgd2UgZG8gVVJMcyBmb3IgaW5zdGFuY2UuCiAgICAgICAgd3JpdGVCeXRlTGlzdCh1dGY4LmVuY29kZXIuY29udmVydChzKSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBDb2xsZWN0IG5vbi1lbXB0eSBtZXRhZGF0YSByZXBvc2l0b3JpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21wb25lbnQuCiAgdm9pZCBfY29sbGVjdE1ldGFkYXRhKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIGNvbXBvbmVudC5tZXRhZGF0YS5mb3JFYWNoKCh0YWcsIHJlcG9zaXRvcnkpIHsKICAgICAgaWYgKHJlcG9zaXRvcnkubWFwcGluZy5pc0VtcHR5KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBfbWV0YWRhdGFTdWJzZWN0aW9ucyA/Pz0gPF9NZXRhZGF0YVN1YnNlY3Rpb24+W107CiAgICAgIF9tZXRhZGF0YVN1YnNlY3Rpb25zLmFkZChuZXcgX01ldGFkYXRhU3Vic2VjdGlvbihyZXBvc2l0b3J5KSk7CiAgICB9KTsKICB9CgogIC8vLyBXcml0ZXMgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBbTm9kZV0uCiAgdm9pZCBfd3JpdGVOb2RlTWV0YWRhdGEoTm9kZSBub2RlKSB7CiAgICBfd3JpdGVOb2RlTWV0YWRhdGFJbXBsKG5vZGUsIGdldEJ1ZmZlck9mZnNldCgpKTsKICB9CgogIHZvaWQgX3dyaXRlTm9kZU1ldGFkYXRhSW1wbChOb2RlIG5vZGUsIGludCBub2RlT2Zmc2V0KSB7CiAgICBmb3IgKF9NZXRhZGF0YVN1YnNlY3Rpb24gc3Vic2VjdGlvbiBpbiBfbWV0YWRhdGFTdWJzZWN0aW9ucykgewogICAgICBmaW5hbCByZXBvc2l0b3J5ID0gc3Vic2VjdGlvbi5yZXBvc2l0b3J5OwogICAgICBmaW5hbCB2YWx1ZSA9IHJlcG9zaXRvcnkubWFwcGluZ1tub2RlXTsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgaWYgKCFNZXRhZGF0YVJlcG9zaXRvcnkuaXNTdXBwb3J0ZWQobm9kZSkpIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgIk5vZGVzIG9mIHR5cGUgJHtub2RlLnJ1bnRpbWVUeXBlfSBjYW4ndCBoYXZlIG1ldGFkYXRhLiIpOwogICAgICB9CgogICAgICBpZiAoIWlkZW50aWNhbChfc2luaywgX21haW5TaW5rKSkgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgICAiTm9kZSB3cml0dGVuIGludG8gbWV0YWRhdGEgY2FuJ3QgaGF2ZSBtZXRhZGF0YSAiCiAgICAgICAgICAgICIobWV0YWRhdGE6ICR7cmVwb3NpdG9yeS50YWd9LCBub2RlOiAke25vZGUucnVudGltZVR5cGV9ICRub2RlKSIpOwogICAgICB9CgogICAgICBfc2luayA9IF9tZXRhZGF0YVNpbms7CiAgICAgIHN1YnNlY3Rpb24ubWV0YWRhdGFNYXBwaW5nLmFkZChub2RlT2Zmc2V0KTsKICAgICAgc3Vic2VjdGlvbi5tZXRhZGF0YU1hcHBpbmcuYWRkKGdldEJ1ZmZlck9mZnNldCgpKTsKICAgICAgcmVwb3NpdG9yeS53cml0ZVRvQmluYXJ5KHZhbHVlLCBub2RlLCB0aGlzKTsKICAgICAgX3NpbmsgPSBfbWFpblNpbms7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVudGVyU2NvcGUoCiAgICAgIHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBib29sIG1lbWJlclNjb3BlOiBmYWxzZSwKICAgICAgYm9vbCB2YXJpYWJsZVNjb3BlOiBmYWxzZX0pIHsKICAgIGlmICh0eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIF90eXBlUGFyYW1ldGVySW5kZXhlci5lbnRlcih0eXBlUGFyYW1ldGVycyk7CiAgICB9CiAgICBpZiAobWVtYmVyU2NvcGUpIHsKICAgICAgX3ZhcmlhYmxlSW5kZXhlciA9IG51bGw7CiAgICB9CiAgICBpZiAodmFyaWFibGVTY29wZSkgewogICAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICAgIF92YXJpYWJsZUluZGV4ZXIucHVzaFNjb3BlKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGxlYXZlU2NvcGUoCiAgICAgIHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBib29sIG1lbWJlclNjb3BlOiBmYWxzZSwKICAgICAgYm9vbCB2YXJpYWJsZVNjb3BlOiBmYWxzZX0pIHsKICAgIGlmICh2YXJpYWJsZVNjb3BlKSB7CiAgICAgIF92YXJpYWJsZUluZGV4ZXIucG9wU2NvcGUoKTsKICAgIH0KICAgIGlmIChtZW1iZXJTY29wZSkgewogICAgICBfdmFyaWFibGVJbmRleGVyID0gbnVsbDsKICAgIH0KICAgIGlmICh0eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIF90eXBlUGFyYW1ldGVySW5kZXhlci5leGl0KHR5cGVQYXJhbWV0ZXJzKTsKICAgIH0KICB9CgogIHZvaWQgX3dyaXRlTWV0YWRhdGFTZWN0aW9uKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIC8vIE1ha2Ugc3VyZSBtZXRhZGF0YSBwYXlsb2FkcyBzZWN0aW9uIGlzIDgtYnl0ZSBhbGlnbmVkLAogICAgLy8gc28gY2VydGFpbiBraW5kcyBvZiBtZXRhZGF0YSBjYW4gY29udGFpbiBhbGlnbmVkIGRhdGEuCiAgICBjb25zdCBpbnQgbWV0YWRhdGFQYXlsb2Fkc0FsaWdubWVudCA9IDg7CiAgICBpbnQgcGFkZGluZyA9ICgoZ2V0QnVmZmVyT2Zmc2V0KCkgKyBtZXRhZGF0YVBheWxvYWRzQWxpZ25tZW50IC0gMSkgJgogICAgICAgICAgICAtbWV0YWRhdGFQYXlsb2Fkc0FsaWdubWVudCkgLQogICAgICAgIGdldEJ1ZmZlck9mZnNldCgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWRkaW5nOyArK2kpIHsKICAgICAgd3JpdGVCeXRlKDApOwogICAgfQoKICAgIF9iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CgogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zID09IG51bGwpIHsKICAgICAgX2JpbmFyeU9mZnNldEZvck1ldGFkYXRhTWFwcGluZ3MgPSBnZXRCdWZmZXJPZmZzZXQoKTsKICAgICAgd3JpdGVVSW50MzIoMCk7IC8vIEVtcHR5IHNlY3Rpb24uCiAgICAgIHJldHVybjsKICAgIH0KCiAgICBhc3NlcnQoaWRlbnRpY2FsKF9zaW5rLCBfbWFpblNpbmspKTsKICAgIF9tZXRhZGF0YVNpbmsuZmx1c2hBbmREZXN0cm95KCk7CiAgICB3cml0ZUJ5dGVzKChfbWV0YWRhdGFTaW5rLl9zaW5rIGFzIEJ5dGVzU2luaykuYnVpbGRlci50YWtlQnl0ZXMoKSk7CgogICAgLy8gUkxpc3Q8TWV0YWRhdGFNYXBwaW5nPiBtZXRhZGF0YU1hcHBpbmdzCiAgICBfYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFNYXBwaW5ncyA9IGdldEJ1ZmZlck9mZnNldCgpOwogICAgZm9yIChfTWV0YWRhdGFTdWJzZWN0aW9uIHN1YnNlY3Rpb24gaW4gX21ldGFkYXRhU3Vic2VjdGlvbnMpIHsKICAgICAgLy8gVUludDMyIHRhZwogICAgICB3cml0ZVVJbnQzMihzdHJpbmdJbmRleGVyLnB1dChzdWJzZWN0aW9uLnJlcG9zaXRvcnkudGFnKSk7CgogICAgICAvLyBSTGlzdDxQYWlyPFVJbnQzMiwgVUludDMyPj4gbm9kZU9mZnNldFRvTWV0YWRhdGFPZmZzZXQKICAgICAgZmluYWwgbWFwcGluZ0xlbmd0aCA9IHN1YnNlY3Rpb24ubWV0YWRhdGFNYXBwaW5nLmxlbmd0aDsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5nTGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICB3cml0ZVVJbnQzMihzdWJzZWN0aW9uLm1ldGFkYXRhTWFwcGluZ1tpXSk7IC8vIG5vZGUgb2Zmc2V0CiAgICAgICAgd3JpdGVVSW50MzIoc3Vic2VjdGlvbi5tZXRhZGF0YU1hcHBpbmdbaSArIDFdKTsgLy8gbWV0YWRhdGEgb2Zmc2V0CiAgICAgIH0KICAgICAgd3JpdGVVSW50MzIobWFwcGluZ0xlbmd0aCB+LyAyKTsKICAgIH0KICAgIHdyaXRlVUludDMyKF9tZXRhZGF0YVN1YnNlY3Rpb25zLmxlbmd0aCk7CiAgfQoKICAvLy8gV3JpdGUgYWxsIG9mIHNvbWUgb2YgdGhlIGxpYnJhcmllcyBvZiB0aGUgW2NvbXBvbmVudF0uCiAgdm9pZCB3cml0ZUxpYnJhcmllcyhDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudC5saWJyYXJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgd3JpdGVMaWJyYXJ5Tm9kZShjb21wb25lbnQubGlicmFyaWVzW2ldKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVDb21wb25lbnRJbmRleChDb21wb25lbnQgY29tcG9uZW50LCBMaXN0PExpYnJhcnk+IGxpYnJhcmllcykgewogICAgLy8gSXQgaXMgYWxsb3dlZCB0byBjb25jYXRlbmF0ZSBzZXZlcmFsIGtlcm5lbCBiaW5hcmllcyB0byBjcmVhdGUgYQogICAgLy8gbXVsdGktY29tcG9uZW50IGtlcm5lbCBmaWxlLiBJbiBvcmRlciB0byBtYWludGFpbiBhbGlnbm1lbnQgb2YKICAgIC8vIG1ldGFkYXRhIHNlY3Rpb25zIHdpdGhpbiBrZXJuZWwgYmluYXJpZXMgYWZ0ZXIgY29uY2F0ZW5hdGlvbiwKICAgIC8vIHNpemUgb2YgZWFjaCBrZXJuZWwgYmluYXJ5IHNob3VsZCBiZSBhbGlnbmVkLgogICAgLy8gQ29tcG9uZW50IGluZGV4IGlzIGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiBhIGtlcm5lbCBiaW5hcnksIHNvIHBhZGRpbmcKICAgIC8vIGlzIGFkZGVkIGJlZm9yZSBjb21wb25lbnQgaW5kZXguCiAgICBjb25zdCBpbnQga2VybmVsRmlsZUFsaWdubWVudCA9IDg7CgogICAgLy8gS2VlcCB0aGlzIGluIHN5bmMgd2l0aCBudW1iZXIgb2Ygd3JpdGVVSW50MzIgYmVsb3cuCiAgICBpbnQgbnVtQ29tcG9uZW50SW5kZXhFbnRyaWVzID0gNyArIGxpYnJhcnlPZmZzZXRzLmxlbmd0aCArIDM7CgogICAgaW50IHVuYWxpZ25lZFNpemUgPSBnZXRCdWZmZXJPZmZzZXQoKSArIG51bUNvbXBvbmVudEluZGV4RW50cmllcyAqIDQ7CiAgICBpbnQgcGFkZGluZyA9CiAgICAgICAgKCh1bmFsaWduZWRTaXplICsga2VybmVsRmlsZUFsaWdubWVudCAtIDEpICYgLWtlcm5lbEZpbGVBbGlnbm1lbnQpIC0KICAgICAgICAgICAgdW5hbGlnbmVkU2l6ZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFkZGluZzsgKytpKSB7CiAgICAgIHdyaXRlQnl0ZSgwKTsKICAgIH0KCiAgICAvLyBGaXhlZC1zaXplIGludHMgYXQgdGhlIGVuZCB1c2VkIGFzIGFuIGluZGV4LgogICAgYXNzZXJ0KF9iaW5hcnlPZmZzZXRGb3JTb3VyY2VUYWJsZSA+PSAwKTsKICAgIHdyaXRlVUludDMyKF9iaW5hcnlPZmZzZXRGb3JTb3VyY2VUYWJsZSk7CiAgICBhc3NlcnQoX2JpbmFyeU9mZnNldEZvckxpbmtUYWJsZSA+PSAwKTsKICAgIHdyaXRlVUludDMyKF9iaW5hcnlPZmZzZXRGb3JMaW5rVGFibGUpOwogICAgYXNzZXJ0KF9iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzID49IDApOwogICAgd3JpdGVVSW50MzIoX2JpbmFyeU9mZnNldEZvck1ldGFkYXRhUGF5bG9hZHMpOwogICAgYXNzZXJ0KF9iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YU1hcHBpbmdzID49IDApOwogICAgd3JpdGVVSW50MzIoX2JpbmFyeU9mZnNldEZvck1ldGFkYXRhTWFwcGluZ3MpOwogICAgYXNzZXJ0KF9iaW5hcnlPZmZzZXRGb3JTdHJpbmdUYWJsZSA+PSAwKTsKICAgIHdyaXRlVUludDMyKF9iaW5hcnlPZmZzZXRGb3JTdHJpbmdUYWJsZSk7CiAgICBhc3NlcnQoX2JpbmFyeU9mZnNldEZvckNvbnN0YW50VGFibGUgPj0gMCk7CiAgICB3cml0ZVVJbnQzMihfYmluYXJ5T2Zmc2V0Rm9yQ29uc3RhbnRUYWJsZSk7CgogICAgQ2Fub25pY2FsTmFtZSBtYWluID0gZ2V0Q2Fub25pY2FsTmFtZU9mTWVtYmVyKGNvbXBvbmVudC5tYWluTWV0aG9kKTsKICAgIGlmIChtYWluID09IG51bGwpIHsKICAgICAgd3JpdGVVSW50MzIoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZVVJbnQzMihtYWluLmluZGV4ICsgMSk7CiAgICB9CgogICAgYXNzZXJ0KGxpYnJhcnlPZmZzZXRzLmxlbmd0aCA9PSBsaWJyYXJpZXMubGVuZ3RoKTsKICAgIGZvciAoaW50IG9mZnNldCBpbiBsaWJyYXJ5T2Zmc2V0cykgewogICAgICB3cml0ZVVJbnQzMihvZmZzZXQpOwogICAgfQogICAgd3JpdGVVSW50MzIoX2JpbmFyeU9mZnNldEZvclNvdXJjZVRhYmxlKTsgLy8gZW5kIG9mIGxhc3QgbGlicmFyeS4KICAgIHdyaXRlVUludDMyKGxpYnJhcmllcy5sZW5ndGgpOwoKICAgIHdyaXRlVUludDMyKGdldEJ1ZmZlck9mZnNldCgpICsgNCk7IC8vIHRvdGFsIHNpemUuCiAgfQoKICB2b2lkIHdyaXRlVXJpVG9Tb3VyY2UoTWFwPFVyaSwgU291cmNlPiB1cmlUb1NvdXJjZSkgewogICAgX2JpbmFyeU9mZnNldEZvclNvdXJjZVRhYmxlID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CgogICAgaW50IGxlbmd0aCA9IF9zb3VyY2VVcmlJbmRleGVyLmluZGV4Lmxlbmd0aDsKICAgIHdyaXRlVUludDMyKGxlbmd0aCk7CiAgICBMaXN0PGludD4gaW5kZXggPSBuZXcgTGlzdDxpbnQ+KGxlbmd0aCk7CgogICAgLy8gV3JpdGUgZGF0YS4KICAgIGludCBpID0gMDsKICAgIFVpbnQ4TGlzdCBidWZmZXIgPSBuZXcgVWludDhMaXN0KDEgPDwgMTYpOwogICAgZm9yIChVcmkgdXJpIGluIF9zb3VyY2VVcmlJbmRleGVyLmluZGV4LmtleXMpIHsKICAgICAgaW5kZXhbaV0gPSBnZXRCdWZmZXJPZmZzZXQoKTsKICAgICAgU291cmNlIHNvdXJjZSA9IHVyaVRvU291cmNlW3VyaV07CiAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCB8fAogICAgICAgICAgIShpbmNsdWRlU291cmNlcyAmJgogICAgICAgICAgICAgIF9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbi5sZW5ndGggPiBpICYmCiAgICAgICAgICAgICAgX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uW2ldID09IHRydWUpKSB7CiAgICAgICAgc291cmNlID0gbmV3IFNvdXJjZSgKICAgICAgICAgICAgPGludD5bXSwgY29uc3QgPGludD5bXSwgc291cmNlPy5pbXBvcnRVcmksIHNvdXJjZT8uZmlsZVVyaSk7CiAgICAgIH0KCiAgICAgIFN0cmluZyB1cmlBc1N0cmluZyA9IHVyaSA9PSBudWxsID8gIiIgOiAiJHVyaSI7CiAgICAgIG91dHB1dFN0cmluZ1ZpYUJ1ZmZlcih1cmlBc1N0cmluZywgYnVmZmVyKTsKCiAgICAgIHdyaXRlQnl0ZUxpc3Qoc291cmNlLnNvdXJjZSk7CgogICAgICBMaXN0PGludD4gbGluZVN0YXJ0cyA9IHNvdXJjZS5saW5lU3RhcnRzOwogICAgICB3cml0ZVVJbnQzMChsaW5lU3RhcnRzLmxlbmd0aCk7CiAgICAgIGludCBwcmV2aW91c0xpbmVTdGFydCA9IDA7CiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGluZVN0YXJ0cy5sZW5ndGg7ICsraikgewogICAgICAgIGludCBsaW5lU3RhcnQgPSBsaW5lU3RhcnRzW2pdOwogICAgICAgIHdyaXRlVUludDMwKGxpbmVTdGFydCAtIHByZXZpb3VzTGluZVN0YXJ0KTsKICAgICAgICBwcmV2aW91c0xpbmVTdGFydCA9IGxpbmVTdGFydDsKICAgICAgfQoKICAgICAgU3RyaW5nIGltcG9ydFVyaUFzU3RyaW5nID0KICAgICAgICAgIHNvdXJjZS5pbXBvcnRVcmkgPT0gbnVsbCA/ICIiIDogIiR7c291cmNlLmltcG9ydFVyaX0iOwogICAgICBvdXRwdXRTdHJpbmdWaWFCdWZmZXIoaW1wb3J0VXJpQXNTdHJpbmcsIGJ1ZmZlcik7CgogICAgICBpKys7CiAgICB9CgogICAgLy8gV3JpdGUgaW5kZXggZm9yIHJhbmRvbSBhY2Nlc3MuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGV4Lmxlbmd0aDsgKytpKSB7CiAgICAgIHdyaXRlVUludDMyKGluZGV4W2ldKTsKICAgIH0KICB9CgogIHZvaWQgb3V0cHV0U3RyaW5nVmlhQnVmZmVyKFN0cmluZyB1cmlBc1N0cmluZywgVWludDhMaXN0IGJ1ZmZlcikgewogICAgaWYgKHVyaUFzU3RyaW5nLmxlbmd0aCAqIDMgPCBidWZmZXIubGVuZ3RoKSB7CiAgICAgIGludCBsZW5ndGggPSBOb3RRdWl0ZVN0cmluZy53cml0ZVV0ZjgoYnVmZmVyLCAwLCB1cmlBc1N0cmluZyk7CiAgICAgIGlmIChsZW5ndGggPCAwKSB7CiAgICAgICAgLy8gVXRmOCBlbmNvZGluZyBmYWlsZWQuCiAgICAgICAgd3JpdGVCeXRlTGlzdCh1dGY4LmVuY29kZXIuY29udmVydCh1cmlBc1N0cmluZykpOwogICAgICB9IGVsc2UgewogICAgICAgIHdyaXRlVUludDMwKGxlbmd0aCk7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgewogICAgICAgICAgd3JpdGVCeXRlKGJ1ZmZlcltqXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBVbmNvbW1vbiBjYXNlIHdpdGggdmVyeSBsb25nIHVybC4KICAgICAgd3JpdGVCeXRlTGlzdCh1dGY4LmVuY29kZXIuY29udmVydCh1cmlBc1N0cmluZykpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUxpYnJhcnlEZXBlbmRlbmN5UmVmZXJlbmNlKExpYnJhcnlEZXBlbmRlbmN5IG5vZGUpIHsKICAgIGludCBpbmRleCA9IF9saWJyYXJ5RGVwZW5kZW5jeUluZGV4W25vZGVdOwogICAgaWYgKGluZGV4ID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAnUmVmZXJlbmNlIHRvIGxpYnJhcnkgZGVwZW5kZW5jeSAkbm9kZSBvdXQgb2Ygc2NvcGUnKTsKICAgIH0KICAgIHdyaXRlVUludDMwKGluZGV4KTsKICB9CgogIHZvaWQgd3JpdGVOdWxsQWxsb3dlZFJlZmVyZW5jZShSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CiAgICBpZiAocmVmZXJlbmNlID09IG51bGwpIHsKICAgICAgd3JpdGVVSW50MzAoMCk7CiAgICB9IGVsc2UgewogICAgICBDYW5vbmljYWxOYW1lIG5hbWUgPSByZWZlcmVuY2UuY2Fub25pY2FsTmFtZTsKICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdNaXNzaW5nIGNhbm9uaWNhbCBuYW1lIGZvciAkcmVmZXJlbmNlJyk7CiAgICAgIH0KICAgICAgY2hlY2tDYW5vbmljYWxOYW1lKG5hbWUpOwogICAgICB3cml0ZVVJbnQzMChuYW1lLmluZGV4ICsgMSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CiAgICBpZiAocmVmZXJlbmNlID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ0dvdCBudWxsIHJlZmVyZW5jZScpOwogICAgfSBlbHNlIHsKICAgICAgQ2Fub25pY2FsTmFtZSBuYW1lID0gcmVmZXJlbmNlLmNhbm9uaWNhbE5hbWU7CiAgICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignTWlzc2luZyBjYW5vbmljYWwgbmFtZSBmb3IgJHJlZmVyZW5jZScpOwogICAgICB9CiAgICAgIGNoZWNrQ2Fub25pY2FsTmFtZShuYW1lKTsKICAgICAgd3JpdGVVSW50MzAobmFtZS5pbmRleCArIDEpOwogICAgfQogIH0KCiAgdm9pZCBjaGVja0Nhbm9uaWNhbE5hbWUoQ2Fub25pY2FsTmFtZSBub2RlKSB7CiAgICBpZiAoX2tub3duQ2Fub25pY2FsTmFtZU5vblJvb3RUb3BzLmNvbnRhaW5zKG5vZGUubm9uUm9vdFRvcCkpIHJldHVybjsKICAgIGlmIChub2RlID09IG51bGwgfHwgbm9kZS5pc1Jvb3QpIHJldHVybjsKICAgIGlmIChfcmVpbmRleGVkQ2Fub25pY2FsTmFtZXMuY29udGFpbnMobm9kZSkpIHJldHVybjsKCiAgICBjaGVja0Nhbm9uaWNhbE5hbWUobm9kZS5wYXJlbnQpOwogICAgbm9kZS5pbmRleCA9IF9jYW5vbmljYWxOYW1lTGlzdC5sZW5ndGg7CiAgICBfY2Fub25pY2FsTmFtZUxpc3QuYWRkKG5vZGUpOwogICAgX3JlaW5kZXhlZENhbm9uaWNhbE5hbWVzLmFkZChub2RlKTsKICB9CgogIHZvaWQgd3JpdGVOdWxsQWxsb3dlZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoQ2Fub25pY2FsTmFtZSBuYW1lKSB7CiAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgIHdyaXRlVUludDMwKDApOwogICAgfSBlbHNlIHsKICAgICAgY2hlY2tDYW5vbmljYWxOYW1lKG5hbWUpOwogICAgICB3cml0ZVVJbnQzMChuYW1lLmluZGV4ICsgMSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoQ2Fub25pY2FsTmFtZSBuYW1lKSB7CiAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgJ0V4cGVjdGVkIGEgY2Fub25pY2FsIG5hbWUgdG8gYmUgdmFsaWQgYnV0IHdhcyBgbnVsbGAuJyk7CiAgICB9IGVsc2UgewogICAgICBjaGVja0Nhbm9uaWNhbE5hbWUobmFtZSk7CiAgICAgIHdyaXRlVUludDMwKG5hbWUuaW5kZXggKyAxKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVMaWJyYXJ5UmVmZXJlbmNlKExpYnJhcnkgbm9kZSwge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChub2RlLmNhbm9uaWNhbE5hbWUgPT0gbnVsbCAmJiAhYWxsb3dOdWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgJ0V4cGVjdGVkIGEgbGlicmFyeSByZWZlcmVuY2UgdG8gYmUgdmFsaWQgYnV0IHdhcyBgbnVsbGAuJyk7CiAgICB9CiAgICB3cml0ZU51bGxBbGxvd2VkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZShub2RlLmNhbm9uaWNhbE5hbWUpOwogIH0KCiAgd3JpdGVPZmZzZXQoaW50IG9mZnNldCkgewogICAgLy8gVE9ETyhqZW5zaik6IERlbHRhLWVuY29kaW5nLgogICAgLy8gRmlsZSBvZmZzZXQgcmFuZ2VzIGZyb20gLTEgYW5kIHVwLAogICAgLy8gYnV0IGlzIGhlcmUgc2F2ZWQgYXMgdW5zaWduZWQgKHRodXMgdGhlICsxKQogICAgaWYgKCFpbmNsdWRlT2Zmc2V0cykgewogICAgICB3cml0ZVVJbnQzMCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlVUludDMwKG9mZnNldCArIDEpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUNsYXNzUmVmZXJlbmNlKENsYXNzIGNsYXNzXykgewogICAgaWYgKGNsYXNzXyA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgJ0V4cGVjdGVkIGEgY2xhc3MgcmVmZXJlbmNlIHRvIGJlIHZhbGlkIGJ1dCB3YXMgYG51bGxgLicpOwogICAgfQogICAgd3JpdGVOb25OdWxsQ2Fub25pY2FsTmFtZVJlZmVyZW5jZShnZXRDYW5vbmljYWxOYW1lT2ZDbGFzcyhjbGFzc18pKTsKICB9CgogIHZvaWQgd3JpdGVOYW1lKE5hbWUgbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2Uobm9kZS5uYW1lKTsKICAgIC8vIFRPRE86IENvbnNpZGVyIGEgbW9yZSBjb21wcmVzc2VkIGZvcm1hdCBmb3IgcHJpdmF0ZSBuYW1lcyB3aXRoaW4gdGhlCiAgICAvLyBlbmNsb3NpbmcgbGlicmFyeS4KICAgIGlmIChub2RlLmlzUHJpdmF0ZSkgewogICAgICB3cml0ZUxpYnJhcnlSZWZlcmVuY2Uobm9kZS5saWJyYXJ5KTsKICAgIH0KICB9CgogIGJvb2wgaW5zaWRlRXh0ZXJuYWxMaWJyYXJ5ID0gZmFsc2U7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaWJyYXJ5KExpYnJhcnkgbm9kZSkgewogICAgaW5zaWRlRXh0ZXJuYWxMaWJyYXJ5ID0gbm9kZS5pc0V4dGVybmFsOwogICAgbGlicmFyeU9mZnNldHMuYWRkKGdldEJ1ZmZlck9mZnNldCgpKTsKICAgIHdyaXRlQnl0ZShub2RlLmZsYWdzKTsKCiAgICAvLyBUT0RPKGplbnNqKTogRXZlbnR1YWxseSwgbGFuZ3VhZ2UgdmVyc2lvbiBzaG91bGQgYWx3YXlzIGJlIHNldC4KICAgIHdyaXRlVUludDMwKG5vZGUubGFuZ3VhZ2VWZXJzaW9uTWFqb3IgPz8gMCk7CiAgICB3cml0ZVVJbnQzMChub2RlLmxhbmd1YWdlVmVyc2lvbk1pbm9yID8/IDApOwoKICAgIHdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoZ2V0Q2Fub25pY2FsTmFtZU9mTGlicmFyeShub2RlKSk7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUgPz8gJycpOwogICAgd3JpdGVVcmlSZWZlcmVuY2Uobm9kZS5maWxlVXJpKTsKICAgIHdyaXRlTGlzdE9mU3RyaW5ncyhub2RlLnByb2JsZW1zQXNKc29uKTsKICAgIGVudGVyU2NvcGUobWVtYmVyU2NvcGU6IHRydWUpOwogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zKTsKICAgIHdyaXRlTGlicmFyeURlcGVuZGVuY2llcyhub2RlKTsKICAgIHdyaXRlQWRkaXRpb25hbEV4cG9ydHMobm9kZS5hZGRpdGlvbmFsRXhwb3J0cyk7CiAgICB3cml0ZUxpYnJhcnlQYXJ0cyhub2RlKTsKICAgIGxlYXZlU2NvcGUobWVtYmVyU2NvcGU6IHRydWUpOwoKICAgIHdyaXRlVHlwZWRlZk5vZGVMaXN0KG5vZGUudHlwZWRlZnMpOwogICAgY2xhc3NPZmZzZXRzID0gbmV3IExpc3Q8aW50PigpOwogICAgd3JpdGVDbGFzc05vZGVMaXN0KG5vZGUuY2xhc3Nlcyk7CiAgICBjbGFzc09mZnNldHMuYWRkKGdldEJ1ZmZlck9mZnNldCgpKTsKICAgIHdyaXRlRmllbGROb2RlTGlzdChub2RlLmZpZWxkcyk7CiAgICBwcm9jZWR1cmVPZmZzZXRzID0gbmV3IExpc3Q8aW50PigpOwogICAgd3JpdGVQcm9jZWR1cmVOb2RlTGlzdChub2RlLnByb2NlZHVyZXMpOwogICAgcHJvY2VkdXJlT2Zmc2V0cy5hZGQoZ2V0QnVmZmVyT2Zmc2V0KCkpOwoKICAgIC8vIER1bXAgYWxsIHNvdXJjZS1yZWZlcmVuY2VzIHVzZWQgaW4gdGhpcyBsaWJyYXJ5OyB1c2VkIGJ5IHRoZSBWTS4KICAgIGludCBzb3VyY2VSZWZlcmVuY2VzT2Zmc2V0ID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CiAgICBpbnQgc291cmNlUmVmZXJlbmNlc0NvdW50ID0gMDsKICAgIC8vIE5vdGU6IFdlIHN0YXJ0IGF0IDEgYmVjYXVzZSAwIGlzIHRoZSBudWxsLWVudHJ5IGFuZCB3ZSBkb24ndCB3YW50IHRvCiAgICAvLyBpbmNsdWRlIHRoYXQuCiAgICBmb3IgKGludCBpID0gMTsgaSA8IF9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbkluTGlicmFyeS5sZW5ndGg7IGkrKykgewogICAgICBpZiAoX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uSW5MaWJyYXJ5W2ldID09IHRydWUpIHsKICAgICAgICBzb3VyY2VSZWZlcmVuY2VzQ291bnQrKzsKICAgICAgfQogICAgfQogICAgd3JpdGVVSW50MzAoc291cmNlUmVmZXJlbmNlc0NvdW50KTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uSW5MaWJyYXJ5Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChfc291cmNlc0Zyb21SZWFsSW1wbGVtZW50YXRpb25JbkxpYnJhcnlbaV0gPT0gdHJ1ZSkgewogICAgICAgIHdyaXRlVUludDMwKGkpOwogICAgICAgIF9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbkluTGlicmFyeVtpXSA9IGZhbHNlOwogICAgICB9CiAgICB9CgogICAgLy8gRml4ZWQtc2l6ZSBpbnRzIGF0IHRoZSBlbmQgdXNlZCBhcyBhbiBpbmRleC4KICAgIHdyaXRlVUludDMyKHNvdXJjZVJlZmVyZW5jZXNPZmZzZXQpOwogICAgYXNzZXJ0KGNsYXNzT2Zmc2V0cy5sZW5ndGggPiAwKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NPZmZzZXRzLmxlbmd0aDsgKytpKSB7CiAgICAgIGludCBvZmZzZXQgPSBjbGFzc09mZnNldHNbaV07CiAgICAgIHdyaXRlVUludDMyKG9mZnNldCk7CiAgICB9CiAgICB3cml0ZVVJbnQzMihjbGFzc09mZnNldHMubGVuZ3RoIC0gMSk7CgogICAgYXNzZXJ0KHByb2NlZHVyZU9mZnNldHMubGVuZ3RoID4gMCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2NlZHVyZU9mZnNldHMubGVuZ3RoOyArK2kpIHsKICAgICAgaW50IG9mZnNldCA9IHByb2NlZHVyZU9mZnNldHNbaV07CiAgICAgIHdyaXRlVUludDMyKG9mZnNldCk7CiAgICB9CiAgICB3cml0ZVVJbnQzMihwcm9jZWR1cmVPZmZzZXRzLmxlbmd0aCAtIDEpOwogIH0KCiAgdm9pZCB3cml0ZUxpYnJhcnlEZXBlbmRlbmNpZXMoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICBfbGlicmFyeURlcGVuZGVuY3lJbmRleCA9IGxpYnJhcnkuZGVwZW5kZW5jaWVzLmlzRW1wdHkKICAgICAgICA/IGNvbnN0IDxMaWJyYXJ5RGVwZW5kZW5jeSwgaW50Pnt9CiAgICAgICAgOiA8TGlicmFyeURlcGVuZGVuY3ksIGludD57fTsKICAgIHdyaXRlVUludDMwKGxpYnJhcnkuZGVwZW5kZW5jaWVzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpYnJhcnkuZGVwZW5kZW5jaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgIExpYnJhcnlEZXBlbmRlbmN5IGltcG9ydE5vZGUgPSBsaWJyYXJ5LmRlcGVuZGVuY2llc1tpXTsKICAgICAgX2xpYnJhcnlEZXBlbmRlbmN5SW5kZXhbaW1wb3J0Tm9kZV0gPSBpOwogICAgICB3cml0ZUxpYnJhcnlEZXBlbmRlbmN5KGltcG9ydE5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUFkZGl0aW9uYWxFeHBvcnRzKExpc3Q8UmVmZXJlbmNlPiBhZGRpdGlvbmFsRXhwb3J0cykgewogICAgd3JpdGVVSW50MzAoYWRkaXRpb25hbEV4cG9ydHMubGVuZ3RoKTsKICAgIGZvciAoUmVmZXJlbmNlIHJlZiBpbiBhZGRpdGlvbmFsRXhwb3J0cykgewogICAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2UocmVmKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVMaWJyYXJ5RGVwZW5kZW5jeShMaWJyYXJ5RGVwZW5kZW5jeSBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVCeXRlKG5vZGUuZmxhZ3MpOwogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zKTsKICAgIHdyaXRlTGlicmFyeVJlZmVyZW5jZShub2RlLnRhcmdldExpYnJhcnksIGFsbG93TnVsbDogdHJ1ZSk7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUgPz8gJycpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLmNvbWJpbmF0b3JzKTsKICB9CgogIHZvaWQgdmlzaXRDb21iaW5hdG9yKENvbWJpbmF0b3Igbm9kZSkgewogICAgd3JpdGVCeXRlKG5vZGUuaXNTaG93ID8gMSA6IDApOwogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2VMaXN0KG5vZGUubmFtZXMpOwogIH0KCiAgdm9pZCB3cml0ZUxpYnJhcnlQYXJ0cyhMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIHdyaXRlVUludDMwKGxpYnJhcnkucGFydHMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyeS5wYXJ0cy5sZW5ndGg7ICsraSkgewogICAgICBMaWJyYXJ5UGFydCBwYXJ0Tm9kZSA9IGxpYnJhcnkucGFydHNbaV07CiAgICAgIHdyaXRlTGlicmFyeVBhcnQocGFydE5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUxpYnJhcnlQYXJ0KExpYnJhcnlQYXJ0IG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLnBhcnRVcmkpOwogIH0KCiAgdm9pZCB2aXNpdFR5cGVkZWYoVHlwZWRlZiBub2RlKSB7CiAgICBlbnRlclNjb3BlKG1lbWJlclNjb3BlOiB0cnVlKTsKICAgIHdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoZ2V0Q2Fub25pY2FsTmFtZU9mVHlwZWRlZihub2RlKSk7CiAgICB3cml0ZVVyaVJlZmVyZW5jZShub2RlLmZpbGVVcmkpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlU3RyaW5nUmVmZXJlbmNlKG5vZGUubmFtZSk7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwoKICAgIGVudGVyU2NvcGUodHlwZVBhcmFtZXRlcnM6IG5vZGUudHlwZVBhcmFtZXRlcnMsIHZhcmlhYmxlU2NvcGU6IHRydWUpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIHdyaXRlTm9kZShub2RlLnR5cGUpOwoKICAgIGVudGVyU2NvcGUodHlwZVBhcmFtZXRlcnM6IG5vZGUudHlwZVBhcmFtZXRlcnNPZkZ1bmN0aW9uVHlwZSk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnNPZkZ1bmN0aW9uVHlwZSk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMpOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChub2RlLm5hbWVkUGFyYW1ldGVycyk7CgogICAgbGVhdmVTY29wZSh0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVyc09mRnVuY3Rpb25UeXBlKTsKICAgIGxlYXZlU2NvcGUodHlwZVBhcmFtZXRlcnM6IG5vZGUudHlwZVBhcmFtZXRlcnMsIHZhcmlhYmxlU2NvcGU6IHRydWUpOwogICAgbGVhdmVTY29wZShtZW1iZXJTY29wZTogdHJ1ZSk7CiAgfQoKICB2b2lkIHdyaXRlQW5ub3RhdGlvbihFeHByZXNzaW9uIGFubm90YXRpb24pIHsKICAgIHdyaXRlTm9kZShhbm5vdGF0aW9uKTsKICB9CgogIHZvaWQgd3JpdGVBbm5vdGF0aW9uTGlzdChMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zKSB7CiAgICBmaW5hbCBsZW4gPSBhbm5vdGF0aW9ucy5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMChsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmaW5hbCBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbaV07CiAgICAgIHdyaXRlQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKICAgIH0KICB9CgogIGludCBfZW5jb2RlQ2xhc3NGbGFncyhpbnQgZmxhZ3MsIENsYXNzTGV2ZWwgbGV2ZWwpIHsKICAgIGFzc2VydCgoZmxhZ3MgJiBDbGFzcy5MZXZlbE1hc2spID09IDApOwogICAgZmluYWwgbGV2ZWxJbmRleCA9IGxldmVsLmluZGV4IC0gMTsKICAgIGFzc2VydCgobGV2ZWxJbmRleCAmIENsYXNzLkxldmVsTWFzaykgPT0gbGV2ZWxJbmRleCk7CiAgICByZXR1cm4gZmxhZ3MgfCBsZXZlbEluZGV4OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENsYXNzKENsYXNzIG5vZGUpIHsKICAgIGNsYXNzT2Zmc2V0cy5hZGQoZ2V0QnVmZmVyT2Zmc2V0KCkpOwoKICAgIGlmIChub2RlLmlzQW5vbnltb3VzTWl4aW4pIF9jdXJyZW50bHlJbk5vbmltcGxlbWVudGF0aW9uID0gdHJ1ZTsKCiAgICBpbnQgZmxhZ3MgPSBfZW5jb2RlQ2xhc3NGbGFncyhub2RlLmZsYWdzLCBub2RlLmxldmVsKTsKICAgIGlmIChub2RlLmNhbm9uaWNhbE5hbWUgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignTWlzc2luZyBjYW5vbmljYWwgbmFtZSBmb3IgJG5vZGUnKTsKICAgIH0KICAgIHdyaXRlQnl0ZShUYWcuQ2xhc3MpOwogICAgd3JpdGVOb25OdWxsQ2Fub25pY2FsTmFtZVJlZmVyZW5jZShnZXRDYW5vbmljYWxOYW1lT2ZDbGFzcyhub2RlKSk7CiAgICB3cml0ZVVyaVJlZmVyZW5jZShub2RlLmZpbGVVcmkpOwogICAgd3JpdGVPZmZzZXQobm9kZS5zdGFydEZpbGVPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZUVuZE9mZnNldCk7CgogICAgd3JpdGVCeXRlKGZsYWdzKTsKICAgIHdyaXRlU3RyaW5nUmVmZXJlbmNlKG5vZGUubmFtZSA/PyAnJyk7CgogICAgZW50ZXJTY29wZShtZW1iZXJTY29wZTogdHJ1ZSk7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgbGVhdmVTY29wZShtZW1iZXJTY29wZTogdHJ1ZSk7CiAgICBlbnRlclNjb3BlKHR5cGVQYXJhbWV0ZXJzOiBub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLnN1cGVydHlwZSk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLm1peGVkSW5UeXBlKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5pbXBsZW1lbnRlZFR5cGVzKTsKICAgIHdyaXRlRmllbGROb2RlTGlzdChub2RlLmZpZWxkcyk7CiAgICB3cml0ZUNvbnN0cnVjdG9yTm9kZUxpc3Qobm9kZS5jb25zdHJ1Y3RvcnMpOwogICAgcHJvY2VkdXJlT2Zmc2V0cyA9IDxpbnQ+W107CiAgICB3cml0ZVByb2NlZHVyZU5vZGVMaXN0KG5vZGUucHJvY2VkdXJlcyk7CiAgICBwcm9jZWR1cmVPZmZzZXRzLmFkZChnZXRCdWZmZXJPZmZzZXQoKSk7CiAgICB3cml0ZVJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yTm9kZUxpc3QoCiAgICAgICAgbm9kZS5yZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMpOwogICAgbGVhdmVTY29wZSh0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycyk7CgogICAgYXNzZXJ0KHByb2NlZHVyZU9mZnNldHMubGVuZ3RoID4gMCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2NlZHVyZU9mZnNldHMubGVuZ3RoOyArK2kpIHsKICAgICAgaW50IG9mZnNldCA9IHByb2NlZHVyZU9mZnNldHNbaV07CiAgICAgIHdyaXRlVUludDMyKG9mZnNldCk7CiAgICB9CiAgICB3cml0ZVVJbnQzMihwcm9jZWR1cmVPZmZzZXRzLmxlbmd0aCAtIDEpOwogICAgX2N1cnJlbnRseUluTm9uaW1wbGVtZW50YXRpb24gPSBmYWxzZTsKICB9CgogIHN0YXRpYyBmaW5hbCBOYW1lIF9lbXB0eU5hbWUgPSBuZXcgTmFtZSgnJyk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvciBub2RlKSB7CiAgICBpZiAobm9kZS5jYW5vbmljYWxOYW1lID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ01pc3NpbmcgY2Fub25pY2FsIG5hbWUgZm9yICRub2RlJyk7CiAgICB9CiAgICBlbnRlclNjb3BlKG1lbWJlclNjb3BlOiB0cnVlKTsKICAgIHdyaXRlQnl0ZShUYWcuQ29uc3RydWN0b3IpOwogICAgd3JpdGVOb25OdWxsQ2Fub25pY2FsTmFtZVJlZmVyZW5jZShnZXRDYW5vbmljYWxOYW1lT2ZNZW1iZXIobm9kZSkpOwogICAgd3JpdGVVcmlSZWZlcmVuY2Uobm9kZS5maWxlVXJpKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuc3RhcnRGaWxlT2Zmc2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVFbmRPZmZzZXQpOwoKICAgIHdyaXRlQnl0ZShub2RlLmZsYWdzKTsKICAgIHdyaXRlTmFtZShub2RlLm5hbWUgPz8gX2VtcHR5TmFtZSk7CgogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zKTsKICAgIGFzc2VydChub2RlLmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpOwogICAgd3JpdGVGdW5jdGlvbk5vZGUobm9kZS5mdW5jdGlvbik7CiAgICAvLyBQYXJhbWV0ZXJzIGFyZSBpbiBzY29wZSBpbiB0aGUgaW5pdGlhbGl6ZXJzLgogICAgX3ZhcmlhYmxlSW5kZXhlciA/Pz0gbmV3IFZhcmlhYmxlSW5kZXhlcigpOwogICAgX3ZhcmlhYmxlSW5kZXhlci5yZXN0b3JlU2NvcGUobm9kZS5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggKwogICAgICAgIG5vZGUuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUuaW5pdGlhbGl6ZXJzKTsKCiAgICBsZWF2ZVNjb3BlKG1lbWJlclNjb3BlOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQcm9jZWR1cmUoUHJvY2VkdXJlIG5vZGUpIHsKICAgIHByb2NlZHVyZU9mZnNldHMuYWRkKGdldEJ1ZmZlck9mZnNldCgpKTsKCiAgICBpZiAobm9kZS5jYW5vbmljYWxOYW1lID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ01pc3NpbmcgY2Fub25pY2FsIG5hbWUgZm9yICRub2RlJyk7CiAgICB9CgogICAgZmluYWwgYm9vbCBjdXJyZW50bHlJbk5vbmltcGxlbWVudGF0aW9uU2F2ZWQgPQogICAgICAgIF9jdXJyZW50bHlJbk5vbmltcGxlbWVudGF0aW9uOwogICAgaWYgKG5vZGUuaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXIgfHwgbm9kZS5pc1N5bnRoZXRpY0ZvcndhcmRlcikgewogICAgICBfY3VycmVudGx5SW5Ob25pbXBsZW1lbnRhdGlvbiA9IHRydWU7CiAgICB9CgogICAgZW50ZXJTY29wZShtZW1iZXJTY29wZTogdHJ1ZSk7CiAgICB3cml0ZUJ5dGUoVGFnLlByb2NlZHVyZSk7CiAgICB3cml0ZU5vbk51bGxDYW5vbmljYWxOYW1lUmVmZXJlbmNlKGdldENhbm9uaWNhbE5hbWVPZk1lbWJlcihub2RlKSk7CiAgICB3cml0ZVVyaVJlZmVyZW5jZShub2RlLmZpbGVVcmkpOwogICAgd3JpdGVPZmZzZXQobm9kZS5zdGFydEZpbGVPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZUVuZE9mZnNldCk7CiAgICB3cml0ZUJ5dGUobm9kZS5raW5kLmluZGV4KTsKICAgIHdyaXRlQnl0ZShub2RlLmZsYWdzKTsKICAgIHdyaXRlTmFtZShub2RlLm5hbWUgPz8gX2VtcHR5TmFtZSk7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVOdWxsQWxsb3dlZFJlZmVyZW5jZShub2RlLmZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVOdWxsQWxsb3dlZFJlZmVyZW5jZShub2RlLmZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlT3B0aW9uYWxGdW5jdGlvbk5vZGUobm9kZS5mdW5jdGlvbik7CiAgICBsZWF2ZVNjb3BlKG1lbWJlclNjb3BlOiB0cnVlKTsKCiAgICBfY3VycmVudGx5SW5Ob25pbXBsZW1lbnRhdGlvbiA9IGN1cnJlbnRseUluTm9uaW1wbGVtZW50YXRpb25TYXZlZDsKICAgIGFzc2VydCgobm9kZS5mb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0ICE9IG51bGwpIHx8CiAgICAgICAgIShub2RlLmlzRm9yd2FyZGluZ1N0dWIgJiYgbm9kZS5mdW5jdGlvbi5ib2R5ICE9IG51bGwpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGaWVsZChGaWVsZCBub2RlKSB7CiAgICBpZiAobm9kZS5jYW5vbmljYWxOYW1lID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ01pc3NpbmcgY2Fub25pY2FsIG5hbWUgZm9yICRub2RlJyk7CiAgICB9CiAgICBlbnRlclNjb3BlKG1lbWJlclNjb3BlOiB0cnVlKTsKICAgIHdyaXRlQnl0ZShUYWcuRmllbGQpOwogICAgd3JpdGVOb25OdWxsQ2Fub25pY2FsTmFtZVJlZmVyZW5jZShnZXRDYW5vbmljYWxOYW1lT2ZNZW1iZXIobm9kZSkpOwogICAgd3JpdGVVcmlSZWZlcmVuY2Uobm9kZS5maWxlVXJpKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVFbmRPZmZzZXQpOwogICAgd3JpdGVCeXRlKG5vZGUuZmxhZ3MpOwogICAgd3JpdGVOYW1lKG5vZGUubmFtZSk7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZSk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLmluaXRpYWxpemVyKTsKICAgIGxlYXZlU2NvcGUobWVtYmVyU2NvcGU6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIGlmIChub2RlLmNhbm9uaWNhbE5hbWUgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignTWlzc2luZyBjYW5vbmljYWwgbmFtZSBmb3IgJG5vZGUnKTsKICAgIH0KICAgIHdyaXRlQnl0ZShUYWcuUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IpOwogICAgZW50ZXJTY29wZSgKICAgICAgICB0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycywKICAgICAgICBtZW1iZXJTY29wZTogdHJ1ZSwKICAgICAgICB2YXJpYWJsZVNjb3BlOiB0cnVlKTsKICAgIHdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoZ2V0Q2Fub25pY2FsTmFtZU9mTWVtYmVyKG5vZGUpKTsKICAgIHdyaXRlVXJpUmVmZXJlbmNlKG5vZGUuZmlsZVVyaSk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlRW5kT2Zmc2V0KTsKICAgIHdyaXRlQnl0ZShub2RlLmZsYWdzKTsKICAgIHdyaXRlTmFtZShub2RlLm5hbWUpOwoKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVBcmd1bWVudHMpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIHdyaXRlVUludDMwKG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICsgbm9kZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIHdyaXRlVUludDMwKG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMpOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChub2RlLm5hbWVkUGFyYW1ldGVycyk7CgogICAgbGVhdmVTY29wZSgKICAgICAgICB0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycywKICAgICAgICBtZW1iZXJTY29wZTogdHJ1ZSwKICAgICAgICB2YXJpYWJsZVNjb3BlOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnZhbGlkSW5pdGlhbGl6ZXIoSW52YWxpZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuSW52YWxpZEluaXRpYWxpemVyKTsKICAgIHdyaXRlQnl0ZShub2RlLmlzU3ludGhldGljID8gMSA6IDApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZpZWxkSW5pdGlhbGl6ZXIoRmllbGRJbml0aWFsaXplciBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkZpZWxkSW5pdGlhbGl6ZXIpOwogICAgd3JpdGVCeXRlKG5vZGUuaXNTeW50aGV0aWMgPyAxIDogMCk7CiAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS5maWVsZFJlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGUobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3VwZXJJbml0aWFsaXplcihTdXBlckluaXRpYWxpemVyIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuU3VwZXJJbml0aWFsaXplcik7CiAgICB3cml0ZUJ5dGUobm9kZS5pc1N5bnRoZXRpYyA/IDEgOiAwKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVBcmd1bWVudHNOb2RlKG5vZGUuYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRSZWRpcmVjdGluZ0luaXRpYWxpemVyKFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5SZWRpcmVjdGluZ0luaXRpYWxpemVyKTsKICAgIHdyaXRlQnl0ZShub2RlLmlzU3ludGhldGljID8gMSA6IDApOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZUFyZ3VtZW50c05vZGUobm9kZS5hcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExvY2FsSW5pdGlhbGl6ZXIoTG9jYWxJbml0aWFsaXplciBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkxvY2FsSW5pdGlhbGl6ZXIpOwogICAgd3JpdGVCeXRlKG5vZGUuaXNTeW50aGV0aWMgPyAxIDogMCk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS52YXJpYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXNzZXJ0SW5pdGlhbGl6ZXIoQXNzZXJ0SW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Bc3NlcnRJbml0aWFsaXplcik7CiAgICB3cml0ZUJ5dGUobm9kZS5pc1N5bnRoZXRpYyA/IDEgOiAwKTsKICAgIHdyaXRlTm9kZShub2RlLnN0YXRlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25Ob2RlKEZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkZ1bmN0aW9uTm9kZSk7CiAgICBlbnRlclNjb3BlKHR5cGVQYXJhbWV0ZXJzOiBub2RlLnR5cGVQYXJhbWV0ZXJzLCB2YXJpYWJsZVNjb3BlOiB0cnVlKTsKICAgIExhYmVsSW5kZXhlciBvbGRMYWJlbHMgPSBfbGFiZWxJbmRleGVyOwogICAgX2xhYmVsSW5kZXhlciA9IG51bGw7CiAgICBTd2l0Y2hDYXNlSW5kZXhlciBvbGRDYXNlcyA9IF9zd2l0Y2hDYXNlSW5kZXhlcjsKICAgIF9zd2l0Y2hDYXNlSW5kZXhlciA9IG51bGw7CiAgICAvLyBOb3RlOiBGdW5jdGlvbk5vZGUgaGFzIG5vIHRhZy4KICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVFbmRPZmZzZXQpOwogICAgd3JpdGVCeXRlKG5vZGUuYXN5bmNNYXJrZXIuaW5kZXgpOwogICAgd3JpdGVCeXRlKG5vZGUuZGFydEFzeW5jTWFya2VyLmluZGV4KTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB3cml0ZVVJbnQzMChub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCArIG5vZGUubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICB3cml0ZVVJbnQzMChub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKTsKICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qobm9kZS5uYW1lZFBhcmFtZXRlcnMpOwogICAgd3JpdGVOb2RlKG5vZGUucmV0dXJuVHlwZSk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLmJvZHkpOwogICAgX2xhYmVsSW5kZXhlciA9IG9sZExhYmVsczsKICAgIF9zd2l0Y2hDYXNlSW5kZXhlciA9IG9sZENhc2VzOwogICAgbGVhdmVTY29wZSh0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycywgdmFyaWFibGVTY29wZTogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW52YWxpZEV4cHJlc3Npb24oSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5JbnZhbGlkRXhwcmVzc2lvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2Uobm9kZS5tZXNzYWdlID8/ICcnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlKSB7CiAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICBpbnQgaW5kZXggPSBfdmFyaWFibGVJbmRleGVyW25vZGUudmFyaWFibGVdOwogICAgYXNzZXJ0KGluZGV4ICE9IG51bGwpOwogICAgaWYgKGluZGV4ICYgVGFnLlNwZWNpYWxpemVkUGF5bG9hZE1hc2sgPT0gaW5kZXggJiYKICAgICAgICBub2RlLnByb21vdGVkVHlwZSA9PSBudWxsKSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuU3BlY2lhbGl6ZWRWYXJpYWJsZUdldCArIGluZGV4KTsKICAgICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgICAgd3JpdGVVSW50MzAobm9kZS52YXJpYWJsZS5iaW5hcnlPZmZzZXROb1RhZyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJ5dGUoVGFnLlZhcmlhYmxlR2V0KTsKICAgICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgICAgd3JpdGVVSW50MzAobm9kZS52YXJpYWJsZS5iaW5hcnlPZmZzZXROb1RhZyk7CiAgICAgIHdyaXRlVUludDMwKGluZGV4KTsKICAgICAgd3JpdGVPcHRpb25hbE5vZGUobm9kZS5wcm9tb3RlZFR5cGUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlU2V0KFZhcmlhYmxlU2V0IG5vZGUpIHsKICAgIF92YXJpYWJsZUluZGV4ZXIgPz89IG5ldyBWYXJpYWJsZUluZGV4ZXIoKTsKICAgIGludCBpbmRleCA9IF92YXJpYWJsZUluZGV4ZXJbbm9kZS52YXJpYWJsZV07CiAgICBhc3NlcnQoaW5kZXggIT0gbnVsbCk7CiAgICBpZiAoaW5kZXggJiBUYWcuU3BlY2lhbGl6ZWRQYXlsb2FkTWFzayA9PSBpbmRleCkgewogICAgICB3cml0ZUJ5dGUoVGFnLlNwZWNpYWxpemVkVmFyaWFibGVTZXQgKyBpbmRleCk7CiAgICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICAgIHdyaXRlVUludDMwKG5vZGUudmFyaWFibGUuYmluYXJ5T2Zmc2V0Tm9UYWcpOwogICAgICB3cml0ZU5vZGUobm9kZS52YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJ5dGUoVGFnLlZhcmlhYmxlU2V0KTsKICAgICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgICAgd3JpdGVVSW50MzAobm9kZS52YXJpYWJsZS5iaW5hcnlPZmZzZXROb1RhZyk7CiAgICAgIHdyaXRlVUludDMwKGluZGV4KTsKICAgICAgd3JpdGVOb2RlKG5vZGUudmFsdWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuUHJvcGVydHlHZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLnJlY2VpdmVyKTsKICAgIHdyaXRlTmFtZShub2RlLm5hbWUpOwogICAgd3JpdGVOdWxsQWxsb3dlZFJlZmVyZW5jZShub2RlLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJvcGVydHlTZXQoUHJvcGVydHlTZXQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Qcm9wZXJ0eVNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgd3JpdGVOYW1lKG5vZGUubmFtZSk7CiAgICB3cml0ZU5vZGUobm9kZS52YWx1ZSk7CiAgICB3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNlKG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5TdXBlclByb3BlcnR5R2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5hbWUobm9kZS5uYW1lKTsKICAgIHdyaXRlTnVsbEFsbG93ZWRSZWZlcmVuY2Uobm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN1cGVyUHJvcGVydHlTZXQoU3VwZXJQcm9wZXJ0eVNldCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlN1cGVyUHJvcGVydHlTZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTmFtZShub2RlLm5hbWUpOwogICAgd3JpdGVOb2RlKG5vZGUudmFsdWUpOwogICAgd3JpdGVOdWxsQWxsb3dlZFJlZmVyZW5jZShub2RlLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5EaXJlY3RQcm9wZXJ0eUdldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkRpcmVjdFByb3BlcnR5U2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS5yZWNlaXZlcik7CiAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVOb2RlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5TdGF0aWNHZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljU2V0KFN0YXRpY1NldCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlN0YXRpY1NldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlTm9kZShub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNZXRob2RJbnZvY2F0aW9uKE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5NZXRob2RJbnZvY2F0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS5yZWNlaXZlcik7CiAgICB3cml0ZU5hbWUobm9kZS5uYW1lKTsKICAgIHdyaXRlQXJndW1lbnRzTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgICB3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNlKG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuU3VwZXJNZXRob2RJbnZvY2F0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5hbWUobm9kZS5uYW1lKTsKICAgIHdyaXRlQXJndW1lbnRzTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgICB3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNlKG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKERpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5EaXJlY3RNZXRob2RJbnZvY2F0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS5yZWNlaXZlcik7CiAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVBcmd1bWVudHNOb2RlKG5vZGUuYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKG5vZGUuaXNDb25zdCA/IFRhZy5Db25zdFN0YXRpY0ludm9jYXRpb24gOiBUYWcuU3RhdGljSW52b2NhdGlvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlQXJndW1lbnRzTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUobm9kZS5pc0NvbnN0CiAgICAgICAgPyBUYWcuQ29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb24KICAgICAgICA6IFRhZy5Db25zdHJ1Y3Rvckludm9jYXRpb24pOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZUFyZ3VtZW50c05vZGUobm9kZS5hcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEFyZ3VtZW50cyhBcmd1bWVudHMgbm9kZSkgewogICAgd3JpdGVVSW50MzAobm9kZS5wb3NpdGlvbmFsLmxlbmd0aCArIG5vZGUubmFtZWQubGVuZ3RoKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS50eXBlcyk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUucG9zaXRpb25hbCk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUubmFtZWQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE5hbWVkRXhwcmVzc2lvbihOYW1lZEV4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2Uobm9kZS5uYW1lKTsKICAgIHdyaXRlTm9kZShub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROb3QoTm90IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuTm90KTsKICAgIHdyaXRlTm9kZShub2RlLm9wZXJhbmQpOwogIH0KCiAgaW50IGxvZ2ljYWxPcGVyYXRvckluZGV4KFN0cmluZyBvcGVyYXRvcikgewogICAgc3dpdGNoIChvcGVyYXRvcikgewogICAgICBjYXNlICcmJic6CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGNhc2UgJ3x8JzoKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdOb3QgYSBsb2dpY2FsIG9wZXJhdG9yOiAkb3BlcmF0b3InKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihMb2dpY2FsRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkxvZ2ljYWxFeHByZXNzaW9uKTsKICAgIHdyaXRlTm9kZShub2RlLmxlZnQpOwogICAgd3JpdGVCeXRlKGxvZ2ljYWxPcGVyYXRvckluZGV4KG5vZGUub3BlcmF0b3IpKTsKICAgIHdyaXRlTm9kZShub2RlLnJpZ2h0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuQ29uZGl0aW9uYWxFeHByZXNzaW9uKTsKICAgIHdyaXRlTm9kZShub2RlLmNvbmRpdGlvbik7CiAgICB3cml0ZU5vZGUobm9kZS50aGVuKTsKICAgIHdyaXRlTm9kZShub2RlLm90aGVyd2lzZSk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLnN0YXRpY1R5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlN0cmluZ0NvbmNhdGVuYXRpb24pOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5leHByZXNzaW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlzdENvbmNhdGVuYXRpb24oTGlzdENvbmNhdGVuYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5MaXN0Q29uY2F0ZW5hdGlvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZUFyZ3VtZW50KTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5saXN0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0Q29uY2F0ZW5hdGlvbihTZXRDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuU2V0Q29uY2F0ZW5hdGlvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZUFyZ3VtZW50KTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5zZXRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXBDb25jYXRlbmF0aW9uKE1hcENvbmNhdGVuYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5NYXBDb25jYXRlbmF0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS5rZXlUeXBlKTsKICAgIHdyaXRlTm9kZShub2RlLnZhbHVlVHlwZSk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUubWFwcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFuY2VDcmVhdGlvbihJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuSW5zdGFuY2VDcmVhdGlvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKG5vZGUuY2xhc3NSZWZlcmVuY2UpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVBcmd1bWVudHMpOwogICAgd3JpdGVVSW50MzAobm9kZS5maWVsZFZhbHVlcy5sZW5ndGgpOwogICAgbm9kZS5maWVsZFZhbHVlcy5mb3JFYWNoKChSZWZlcmVuY2UgZmllbGRSZWYsIEV4cHJlc3Npb24gdmFsdWUpIHsKICAgICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKGZpZWxkUmVmKTsKICAgICAgd3JpdGVOb2RlKHZhbHVlKTsKICAgIH0pOwogICAgd3JpdGVOb2RlTGlzdChub2RlLmFzc2VydHMpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnVudXNlZEFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SXNFeHByZXNzaW9uKElzRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLklzRXhwcmVzc2lvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUub3BlcmFuZCk7CiAgICB3cml0ZU5vZGUobm9kZS50eXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuQXNFeHByZXNzaW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZUJ5dGUobm9kZS5mbGFncyk7CiAgICB3cml0ZU5vZGUobm9kZS5vcGVyYW5kKTsKICAgIHdyaXRlTm9kZShub2RlLnR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0cmluZ0xpdGVyYWwoU3RyaW5nTGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlN0cmluZ0xpdGVyYWwpOwogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2Uobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50TGl0ZXJhbChJbnRMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlSW50ZWdlcihub2RlLnZhbHVlKTsKICB9CgogIHdyaXRlSW50ZWdlcihpbnQgdmFsdWUpIHsKICAgIGludCBiaWFzZWRWYWx1ZSA9IHZhbHVlICsgVGFnLlNwZWNpYWxpemVkSW50TGl0ZXJhbEJpYXM7CiAgICBpZiAoYmlhc2VkVmFsdWUgPj0gMCAmJgogICAgICAgIGJpYXNlZFZhbHVlICYgVGFnLlNwZWNpYWxpemVkUGF5bG9hZE1hc2sgPT0gYmlhc2VkVmFsdWUpIHsKICAgICAgd3JpdGVCeXRlKFRhZy5TcGVjaWFsaXplZEludExpdGVyYWwgKyBiaWFzZWRWYWx1ZSk7CiAgICB9IGVsc2UgaWYgKHZhbHVlLmFicygpID4+IDMwID09IDApIHsKICAgICAgaWYgKHZhbHVlIDwgMCkgewogICAgICAgIHdyaXRlQnl0ZShUYWcuTmVnYXRpdmVJbnRMaXRlcmFsKTsKICAgICAgICB3cml0ZVVJbnQzMCgtdmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHdyaXRlQnl0ZShUYWcuUG9zaXRpdmVJbnRMaXRlcmFsKTsKICAgICAgICB3cml0ZVVJbnQzMCh2YWx1ZSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIFRPRE86IFBpY2sgYSBiZXR0ZXIgZm9ybWF0IGZvciBiaWcgaW50IGxpdGVyYWxzLgogICAgICB3cml0ZUJ5dGUoVGFnLkJpZ0ludExpdGVyYWwpOwogICAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZSgnJHZhbHVlJyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RG91YmxlTGl0ZXJhbChEb3VibGVMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuRG91YmxlTGl0ZXJhbCk7CiAgICB3cml0ZURvdWJsZShub2RlLnZhbHVlKTsKICB9CgogIHdyaXRlRG91YmxlKGRvdWJsZSB2YWx1ZSkgewogICAgX3NpbmsuYWRkRG91YmxlKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb29sTGl0ZXJhbChCb29sTGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZUJ5dGUobm9kZS52YWx1ZSA/IFRhZy5UcnVlTGl0ZXJhbCA6IFRhZy5GYWxzZUxpdGVyYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE51bGxMaXRlcmFsKE51bGxMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuTnVsbExpdGVyYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN5bWJvbExpdGVyYWwoU3ltYm9sTGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlN5bWJvbExpdGVyYWwpOwogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2Uobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUxpdGVyYWwoVHlwZUxpdGVyYWwgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5UeXBlTGl0ZXJhbCk7CiAgICB3cml0ZU5vZGUobm9kZS50eXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlRoaXNFeHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRSZXRocm93KFJldGhyb3cgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5SZXRocm93KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGhyb3coVGhyb3cgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5UaHJvdyk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUuZXhwcmVzc2lvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgewogICAgd3JpdGVCeXRlKG5vZGUuaXNDb25zdCA/IFRhZy5Db25zdExpc3RMaXRlcmFsIDogVGFnLkxpc3RMaXRlcmFsKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS50eXBlQXJndW1lbnQpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLmV4cHJlc3Npb25zKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSkgewogICAgd3JpdGVCeXRlKG5vZGUuaXNDb25zdCA/IFRhZy5Db25zdFNldExpdGVyYWwgOiBUYWcuU2V0TGl0ZXJhbCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZUFyZ3VtZW50KTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5leHByZXNzaW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShub2RlLmlzQ29uc3QgPyBUYWcuQ29uc3RNYXBMaXRlcmFsIDogVGFnLk1hcExpdGVyYWwpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLmtleVR5cGUpOwogICAgd3JpdGVOb2RlKG5vZGUudmFsdWVUeXBlKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5lbnRyaWVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXBFbnRyeShNYXBFbnRyeSBub2RlKSB7CiAgICAvLyBOb3RlOiB0aGVyZSBpcyBubyB0YWcgb24gTWFwRW50cnkKICAgIHdyaXRlTm9kZShub2RlLmtleSk7CiAgICB3cml0ZU5vZGUobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkF3YWl0RXhwcmVzc2lvbik7CiAgICB3cml0ZU5vZGUobm9kZS5vcGVyYW5kKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuRnVuY3Rpb25FeHByZXNzaW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZUZ1bmN0aW9uTm9kZShub2RlLmZ1bmN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMZXQoTGV0IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuTGV0KTsKICAgIF92YXJpYWJsZUluZGV4ZXIgPz89IG5ldyBWYXJpYWJsZUluZGV4ZXIoKTsKICAgIF92YXJpYWJsZUluZGV4ZXIucHVzaFNjb3BlKCk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS52YXJpYWJsZSk7CiAgICB3cml0ZU5vZGUobm9kZS5ib2R5KTsKICAgIF92YXJpYWJsZUluZGV4ZXIucG9wU2NvcGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCbG9ja0V4cHJlc3Npb24oQmxvY2tFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuQmxvY2tFeHByZXNzaW9uKTsKICAgIF92YXJpYWJsZUluZGV4ZXIgPz89IG5ldyBWYXJpYWJsZUluZGV4ZXIoKTsKICAgIF92YXJpYWJsZUluZGV4ZXIucHVzaFNjb3BlKCk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUuYm9keS5zdGF0ZW1lbnRzKTsKICAgIHdyaXRlTm9kZShub2RlLnZhbHVlKTsKICAgIF92YXJpYWJsZUluZGV4ZXIucG9wU2NvcGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnN0YW50aWF0aW9uKEluc3RhbnRpYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5JbnN0YW50aWF0aW9uKTsKICAgIHdyaXRlTm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExvYWRMaWJyYXJ5KExvYWRMaWJyYXJ5IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuTG9hZExpYnJhcnkpOwogICAgd3JpdGVMaWJyYXJ5RGVwZW5kZW5jeVJlZmVyZW5jZShub2RlLmltcG9ydCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hlY2tMaWJyYXJ5SXNMb2FkZWQoQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5DaGVja0xpYnJhcnlJc0xvYWRlZCk7CiAgICB3cml0ZUxpYnJhcnlEZXBlbmRlbmN5UmVmZXJlbmNlKG5vZGUuaW1wb3J0KTsKICB9CgogIHdyaXRlU3RhdGVtZW50T3JFbXB0eShTdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICB3cml0ZUJ5dGUoVGFnLkVtcHR5U3RhdGVtZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlTm9kZShub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5FeHByZXNzaW9uU3RhdGVtZW50KTsKICAgIHdyaXRlTm9kZShub2RlLmV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpIHsKICAgIF92YXJpYWJsZUluZGV4ZXIgPz89IG5ldyBWYXJpYWJsZUluZGV4ZXIoKTsKICAgIF92YXJpYWJsZUluZGV4ZXIucHVzaFNjb3BlKCk7CiAgICB3cml0ZUJ5dGUoVGFnLkJsb2NrKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5zdGF0ZW1lbnRzKTsKICAgIF92YXJpYWJsZUluZGV4ZXIucG9wU2NvcGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBc3NlcnRCbG9jayhBc3NlcnRCbG9jayBub2RlKSB7CiAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICBfdmFyaWFibGVJbmRleGVyLnB1c2hTY29wZSgpOwogICAgd3JpdGVCeXRlKFRhZy5Bc3NlcnRCbG9jayk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUuc3RhdGVtZW50cyk7CiAgICBfdmFyaWFibGVJbmRleGVyLnBvcFNjb3BlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RW1wdHlTdGF0ZW1lbnQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5FbXB0eVN0YXRlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXNzZXJ0U3RhdGVtZW50KEFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkFzc2VydFN0YXRlbWVudCk7CiAgICB3cml0ZU5vZGUobm9kZS5jb25kaXRpb24pOwogICAgd3JpdGVPZmZzZXQobm9kZS5jb25kaXRpb25TdGFydE9mZnNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmNvbmRpdGlvbkVuZE9mZnNldCk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLm1lc3NhZ2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoX2xhYmVsSW5kZXhlciA9PSBudWxsKSB7CiAgICAgIF9sYWJlbEluZGV4ZXIgPSBuZXcgTGFiZWxJbmRleGVyKCk7CiAgICB9CiAgICBfbGFiZWxJbmRleGVyLmVudGVyKG5vZGUpOwogICAgd3JpdGVCeXRlKFRhZy5MYWJlbGVkU3RhdGVtZW50KTsKICAgIHdyaXRlTm9kZShub2RlLmJvZHkpOwogICAgX2xhYmVsSW5kZXhlci5leGl0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50RXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkNvbnN0YW50RXhwcmVzc2lvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVEYXJ0VHlwZShub2RlLnR5cGUpOwogICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShub2RlLmNvbnN0YW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCcmVha1N0YXRlbWVudChCcmVha1N0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkJyZWFrU3RhdGVtZW50KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZVVJbnQzMChfbGFiZWxJbmRleGVyW25vZGUudGFyZ2V0XSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0V2hpbGVTdGF0ZW1lbnQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5XaGlsZVN0YXRlbWVudCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUuY29uZGl0aW9uKTsKICAgIHdyaXRlTm9kZShub2RlLmJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvU3RhdGVtZW50KERvU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuRG9TdGF0ZW1lbnQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLmJvZHkpOwogICAgd3JpdGVOb2RlKG5vZGUuY29uZGl0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGb3JTdGF0ZW1lbnQoRm9yU3RhdGVtZW50IG5vZGUpIHsKICAgIF92YXJpYWJsZUluZGV4ZXIgPz89IG5ldyBWYXJpYWJsZUluZGV4ZXIoKTsKICAgIF92YXJpYWJsZUluZGV4ZXIucHVzaFNjb3BlKCk7CiAgICB3cml0ZUJ5dGUoVGFnLkZvclN0YXRlbWVudCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChub2RlLnZhcmlhYmxlcyk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLmNvbmRpdGlvbik7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUudXBkYXRlcyk7CiAgICB3cml0ZU5vZGUobm9kZS5ib2R5KTsKICAgIF92YXJpYWJsZUluZGV4ZXIucG9wU2NvcGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGb3JJblN0YXRlbWVudChGb3JJblN0YXRlbWVudCBub2RlKSB7CiAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICBfdmFyaWFibGVJbmRleGVyLnB1c2hTY29wZSgpOwogICAgd3JpdGVCeXRlKG5vZGUuaXNBc3luYyA/IFRhZy5Bc3luY0ZvckluU3RhdGVtZW50IDogVGFnLkZvckluU3RhdGVtZW50KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmJvZHlPZmZzZXQpOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUudmFyaWFibGUpOwogICAgd3JpdGVOb2RlKG5vZGUuaXRlcmFibGUpOwogICAgd3JpdGVOb2RlKG5vZGUuYm9keSk7CiAgICBfdmFyaWFibGVJbmRleGVyLnBvcFNjb3BlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3dpdGNoU3RhdGVtZW50KFN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoX3N3aXRjaENhc2VJbmRleGVyID09IG51bGwpIHsKICAgICAgX3N3aXRjaENhc2VJbmRleGVyID0gbmV3IFN3aXRjaENhc2VJbmRleGVyKCk7CiAgICB9CiAgICBfc3dpdGNoQ2FzZUluZGV4ZXIuZW50ZXIobm9kZSk7CiAgICB3cml0ZUJ5dGUoVGFnLlN3aXRjaFN0YXRlbWVudCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUuZXhwcmVzc2lvbik7CiAgICB3cml0ZVN3aXRjaENhc2VOb2RlTGlzdChub2RlLmNhc2VzKTsKICAgIF9zd2l0Y2hDYXNlSW5kZXhlci5leGl0KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN3aXRjaENhc2UoU3dpdGNoQ2FzZSBub2RlKSB7CiAgICAvLyBOb3RlOiB0aGVyZSBpcyBubyB0YWcgb24gU3dpdGNoQ2FzZS4KICAgIGludCBsZW5ndGggPSBub2RlLmV4cHJlc3Npb25zLmxlbmd0aDsKICAgIHdyaXRlVUludDMwKGxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHdyaXRlT2Zmc2V0KG5vZGUuZXhwcmVzc2lvbk9mZnNldHNbaV0pOwogICAgICB3cml0ZU5vZGUobm9kZS5leHByZXNzaW9uc1tpXSk7CiAgICB9CiAgICB3cml0ZUJ5dGUobm9kZS5pc0RlZmF1bHQgPyAxIDogMCk7CiAgICB3cml0ZU5vZGUobm9kZS5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChDb250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkNvbnRpbnVlU3dpdGNoU3RhdGVtZW50KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZVVJbnQzMChfc3dpdGNoQ2FzZUluZGV4ZXJbbm9kZS50YXJnZXRdKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJZlN0YXRlbWVudChJZlN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLklmU3RhdGVtZW50KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS5jb25kaXRpb24pOwogICAgd3JpdGVOb2RlKG5vZGUudGhlbik7CiAgICB3cml0ZVN0YXRlbWVudE9yRW1wdHkobm9kZS5vdGhlcndpc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5SZXR1cm5TdGF0ZW1lbnQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlT3B0aW9uYWxOb2RlKG5vZGUuZXhwcmVzc2lvbik7CiAgfQoKICBpbnQgX2VuY29kZVRyeUNhdGNoRmxhZ3MoYm9vbCBuZWVkc1N0YWNrVHJhY2UsIGJvb2wgaXNTeW50aGV0aWMpIHsKICAgIHJldHVybiAobmVlZHNTdGFja1RyYWNlID8gMSA6IDApIHwgKGlzU3ludGhldGljID8gMiA6IDApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRyeUNhdGNoKFRyeUNhdGNoIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuVHJ5Q2F0Y2gpOwogICAgd3JpdGVOb2RlKG5vZGUuYm9keSk7CiAgICBib29sIG5lZWRzU3RhY2tUcmFjZSA9IG5vZGUuY2F0Y2hlcy5hbnkoKENhdGNoIGMpID0+IGMuc3RhY2tUcmFjZSAhPSBudWxsKTsKICAgIHdyaXRlQnl0ZShfZW5jb2RlVHJ5Q2F0Y2hGbGFncyhuZWVkc1N0YWNrVHJhY2UsIG5vZGUuaXNTeW50aGV0aWMpKTsKICAgIHdyaXRlQ2F0Y2hOb2RlTGlzdChub2RlLmNhdGNoZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENhdGNoKENhdGNoIG5vZGUpIHsKICAgIC8vIE5vdGU6IHRoZXJlIGlzIG5vIHRhZyBvbiBDYXRjaC4KICAgIF92YXJpYWJsZUluZGV4ZXIgPz89IG5ldyBWYXJpYWJsZUluZGV4ZXIoKTsKICAgIF92YXJpYWJsZUluZGV4ZXIucHVzaFNjb3BlKCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUuZ3VhcmQpOwogICAgd3JpdGVPcHRpb25hbFZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS5leGNlcHRpb24pOwogICAgd3JpdGVPcHRpb25hbFZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS5zdGFja1RyYWNlKTsKICAgIHdyaXRlTm9kZShub2RlLmJvZHkpOwogICAgX3ZhcmlhYmxlSW5kZXhlci5wb3BTY29wZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRyeUZpbmFsbHkoVHJ5RmluYWxseSBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlRyeUZpbmFsbHkpOwogICAgd3JpdGVOb2RlKG5vZGUuYm9keSk7CiAgICB3cml0ZU5vZGUobm9kZS5maW5hbGl6ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuWWllbGRTdGF0ZW1lbnQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlQnl0ZShub2RlLmZsYWdzKTsKICAgIHdyaXRlTm9kZShub2RlLmV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlZhcmlhYmxlRGVjbGFyYXRpb24pOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpOwogIH0KCiAgdm9pZCB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICBub2RlLmJpbmFyeU9mZnNldE5vVGFnID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlRXF1YWxzT2Zmc2V0KTsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZUJ5dGUobm9kZS5mbGFncyk7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUgPz8gJycpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZSk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLmluaXRpYWxpemVyKTsKICAgIC8vIERlY2xhcmUgdGhlIHZhcmlhYmxlIGFmdGVyIGl0cyBpbml0aWFsaXplci4gSXQgaXMgbm90IGluIHNjb3BlIGluIGl0cwogICAgLy8gb3duIGluaXRpYWxpemVyLgogICAgX3ZhcmlhYmxlSW5kZXhlciA/Pz0gbmV3IFZhcmlhYmxlSW5kZXhlcigpOwogICAgX3ZhcmlhYmxlSW5kZXhlci5kZWNsYXJlKG5vZGUpOwogIH0KCiAgdm9pZCB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gbm9kZXMpIHsKICAgIHdyaXRlTGlzdChub2Rlcywgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKTsKICB9CgogIHZvaWQgd3JpdGVPcHRpb25hbFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuTm90aGluZyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJ5dGUoVGFnLlNvbWV0aGluZyk7CiAgICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5GdW5jdGlvbkRlY2xhcmF0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS52YXJpYWJsZSk7CiAgICB3cml0ZUZ1bmN0aW9uTm9kZShub2RlLmZ1bmN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb3R0b21UeXBlKEJvdHRvbVR5cGUgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Cb3R0b21UeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnZhbGlkVHlwZShJbnZhbGlkVHlwZSBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkludmFsaWRUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkR5bmFtaWNUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlZvaWRUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuU2ltcGxlSW50ZXJmYWNlVHlwZSk7CiAgICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLmNsYXNzTmFtZSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJ5dGUoVGFnLkludGVyZmFjZVR5cGUpOwogICAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS5jbGFzc05hbWUpOwogICAgICB3cml0ZU5vZGVMaXN0KG5vZGUudHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3VwZXJ0eXBlKFN1cGVydHlwZSBub2RlKSB7CiAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmlzRW1wdHkpIHsKICAgICAgd3JpdGVCeXRlKFRhZy5TaW1wbGVJbnRlcmZhY2VUeXBlKTsKICAgICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKG5vZGUuY2xhc3NOYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuSW50ZXJmYWNlVHlwZSk7CiAgICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLmNsYXNzTmFtZSk7CiAgICAgIHdyaXRlTm9kZUxpc3Qobm9kZS50eXBlQXJndW1lbnRzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIG5vZGUpIHsKICAgIGlmIChub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPT0gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggJiYKICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkgJiYKICAgICAgICBub2RlLm5hbWVkUGFyYW1ldGVycy5pc0VtcHR5ICYmCiAgICAgICAgbm9kZS50eXBlZGVmVHlwZSA9PSBudWxsKSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuU2ltcGxlRnVuY3Rpb25UeXBlKTsKICAgICAgd3JpdGVOb2RlTGlzdChub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKTsKICAgICAgd3JpdGVOb2RlKG5vZGUucmV0dXJuVHlwZSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJ5dGUoVGFnLkZ1bmN0aW9uVHlwZSk7CiAgICAgIGVudGVyU2NvcGUodHlwZVBhcmFtZXRlcnM6IG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgICB3cml0ZU5vZGVMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgICB3cml0ZVVJbnQzMChub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogICAgICB3cml0ZVVJbnQzMCgKICAgICAgICAgIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICsgbm9kZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgICAgd3JpdGVOb2RlTGlzdChub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKTsKICAgICAgd3JpdGVOb2RlTGlzdChub2RlLm5hbWVkUGFyYW1ldGVycyk7CiAgICAgIHdyaXRlT3B0aW9uYWxOb2RlKG5vZGUudHlwZWRlZlR5cGUpOwogICAgICB3cml0ZU5vZGUobm9kZS5yZXR1cm5UeXBlKTsKICAgICAgbGVhdmVTY29wZSh0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmFtZWRUeXBlKE5hbWVkVHlwZSBub2RlKSB7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5UeXBlUGFyYW1ldGVyVHlwZSk7CiAgICB3cml0ZVVJbnQzMChfdHlwZVBhcmFtZXRlckluZGV4ZXJbbm9kZS5wYXJhbWV0ZXJdKTsKICAgIHdyaXRlT3B0aW9uYWxOb2RlKG5vZGUucHJvbW90ZWRCb3VuZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5UeXBlZGVmVHlwZSk7CiAgICB3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNlKG5vZGUudHlwZWRlZlJlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUudHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShub2RlLmZsYWdzKTsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUgPz8gJycpOwogICAgd3JpdGVOb2RlKG5vZGUuYm91bmQpOwogICAgd3JpdGVPcHRpb25hbE5vZGUobm9kZS5kZWZhdWx0VHlwZSk7CiAgfQoKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gVGhlc2UgYXJlIG5vZGVzIHRoYXQgYXJlIG5ldmVyIHNlcmlhbGl6ZWQgZGlyZWN0bHkuICBSZWFjaGluZyBvbmUKICAvLyBkdXJpbmcgc2VyaWFsaXphdGlvbiBpcyBhbiBlcnJvci4KICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHROb2RlKE5vZGUgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBOb2RlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBDb25zdGFudHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdEJhc2ljTGl0ZXJhbChCYXNpY0xpdGVyYWwgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBCYXNpY0xpdGVyYWxzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIENvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgRGFydFR5cGVzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRFeHByZXNzaW9uKEV4cHJlc3Npb24gbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBFeHByZXNzaW9ucycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0SW5pdGlhbGl6ZXIoSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBJbml0aWFsaXplcnMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdE1lbWJlcihNZW1iZXIgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBNZW1iZXJzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRNZW1iZXJSZWZlcmVuY2UoTWVtYmVyIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgTWVtYmVyIHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdFN0YXRlbWVudChTdGF0ZW1lbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBTdGF0ZW1lbnRzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRUcmVlTm9kZShUcmVlTm9kZSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIFRyZWVOb2RlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJvb2xDb25zdGFudChCb29sQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgQm9vbENvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJvb2xDb25zdGFudFJlZmVyZW5jZShCb29sQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgQm9vbENvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDbGFzc1JlZmVyZW5jZShDbGFzcyBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBDbGFzcyByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uc3RydWN0b3JSZWZlcmVuY2UoQ29uc3RydWN0b3Igbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgQ29uc3RydWN0b3IgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvdWJsZUNvbnN0YW50KERvdWJsZUNvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIERvdWJsZUNvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvdWJsZUNvbnN0YW50UmVmZXJlbmNlKERvdWJsZUNvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIERvdWJsZUNvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGaWVsZFJlZmVyZW5jZShGaWVsZCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBGaWVsZCByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFuY2VDb25zdGFudChJbnN0YW5jZUNvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIEluc3RhbmNlQ29uc3RhbnRzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFuY2VDb25zdGFudFJlZmVyZW5jZShJbnN0YW5jZUNvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIEluc3RhbmNlQ29uc3RhbnQgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludENvbnN0YW50KEludENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIEludENvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludENvbnN0YW50UmVmZXJlbmNlKEludENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIEludENvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaWJyYXJ5RGVwZW5kZW5jeShMaWJyYXJ5RGVwZW5kZW5jeSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBMaWJyYXJ5RGVwZW5kZW5jeXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaWJyYXJ5UGFydChMaWJyYXJ5UGFydCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBMaWJyYXJ5UGFydHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXN0Q29uc3RhbnQoTGlzdENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIExpc3RDb25zdGFudHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXN0Q29uc3RhbnRSZWZlcmVuY2UoTGlzdENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIExpc3RDb25zdGFudCByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0Q29uc3RhbnQoU2V0Q29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgU2V0Q29uc3RhbnRzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0Q29uc3RhbnRSZWZlcmVuY2UoU2V0Q29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgU2V0Q29uc3RhbnQgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1hcENvbnN0YW50KE1hcENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIE1hcENvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1hcENvbnN0YW50UmVmZXJlbmNlKE1hcENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIE1hcENvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROYW1lKE5hbWUgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgTmFtZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROdWxsQ29uc3RhbnQoTnVsbENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIE51bGxDb25zdGFudHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROdWxsQ29uc3RhbnRSZWZlcmVuY2UoTnVsbENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIE51bGxDb25zdGFudCByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJvY2VkdXJlUmVmZXJlbmNlKFByb2NlZHVyZSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBQcm9jZWR1cmUgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbXBvbmVudChDb21wb25lbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgQ29tcG9uZW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yUmVmZXJlbmNlKAogICAgICBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAnc2VyaWFsaXphdGlvbiBvZiBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nQ29uc3RhbnQoU3RyaW5nQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgU3RyaW5nQ29uc3RhbnRzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nQ29uc3RhbnRSZWZlcmVuY2UoU3RyaW5nQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgU3RyaW5nQ29uc3RhbnQgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN5bWJvbENvbnN0YW50KFN5bWJvbENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIFN5bWJvbENvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN5bWJvbENvbnN0YW50UmVmZXJlbmNlKFN5bWJvbENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIFN5bWJvbENvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgJ3NlcmlhbGl6YXRpb24gb2YgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudHMgJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudFJlZmVyZW5jZSgKICAgICAgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAnc2VyaWFsaXphdGlvbiBvZiBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUZWFyT2ZmQ29uc3RhbnQoVGVhck9mZkNvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIFRlYXJPZmZDb25zdGFudHMgJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGVhck9mZkNvbnN0YW50UmVmZXJlbmNlKFRlYXJPZmZDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBUZWFyT2ZmQ29uc3RhbnQgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVMaXRlcmFsQ29uc3RhbnQoVHlwZUxpdGVyYWxDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBUeXBlTGl0ZXJhbENvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVMaXRlcmFsQ29uc3RhbnRSZWZlcmVuY2UoVHlwZUxpdGVyYWxDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAnc2VyaWFsaXphdGlvbiBvZiBUeXBlTGl0ZXJhbENvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlZGVmUmVmZXJlbmNlKFR5cGVkZWYgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgVHlwZWRlZiByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudChVbmV2YWx1YXRlZENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIFVuZXZhbHVhdGVkQ29uc3RhbnRzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudFJlZmVyZW5jZShVbmV2YWx1YXRlZENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICdzZXJpYWxpemF0aW9uIG9mIFVuZXZhbHVhdGVkQ29uc3RhbnQgcmVmZXJlbmNlcycpOwogIH0KfQoKdHlwZWRlZiBib29sIExpYnJhcnlGaWx0ZXIoTGlicmFyeSBfKTsKCmNsYXNzIFZhcmlhYmxlSW5kZXhlciB7CiAgTWFwPFZhcmlhYmxlRGVjbGFyYXRpb24sIGludD4gaW5kZXg7CiAgTGlzdDxpbnQ+IHNjb3BlczsKICBpbnQgc3RhY2tIZWlnaHQgPSAwOwoKICB2b2lkIGRlY2xhcmUoVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBpbmRleCA/Pz0gPFZhcmlhYmxlRGVjbGFyYXRpb24sIGludD57fTsKICAgIGluZGV4W25vZGVdID0gc3RhY2tIZWlnaHQrKzsKICB9CgogIHZvaWQgcHVzaFNjb3BlKCkgewogICAgc2NvcGVzID8/PSBuZXcgTGlzdDxpbnQ+KCk7CiAgICBzY29wZXMuYWRkKHN0YWNrSGVpZ2h0KTsKICB9CgogIHZvaWQgcG9wU2NvcGUoKSB7CiAgICBzdGFja0hlaWdodCA9IHNjb3Blcy5yZW1vdmVMYXN0KCk7CiAgfQoKICB2b2lkIHJlc3RvcmVTY29wZShpbnQgbnVtYmVyT2ZWYXJpYWJsZXMpIHsKICAgIHN0YWNrSGVpZ2h0ICs9IG51bWJlck9mVmFyaWFibGVzOwogIH0KCiAgaW50IG9wZXJhdG9yIFtdKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgcmV0dXJuIGluZGV4ID09IG51bGwgPyBudWxsIDogaW5kZXhbbm9kZV07CiAgfQp9CgpjbGFzcyBMYWJlbEluZGV4ZXIgewogIGZpbmFsIE1hcDxMYWJlbGVkU3RhdGVtZW50LCBpbnQ+IGluZGV4ID0gPExhYmVsZWRTdGF0ZW1lbnQsIGludD57fTsKICBpbnQgc3RhY2tIZWlnaHQgPSAwOwoKICB2b2lkIGVudGVyKExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgaW5kZXhbbm9kZV0gPSBzdGFja0hlaWdodCsrOwogIH0KCiAgdm9pZCBleGl0KCkgewogICAgLS1zdGFja0hlaWdodDsKICB9CgogIGludCBvcGVyYXRvciBbXShMYWJlbGVkU3RhdGVtZW50IG5vZGUpID0+IGluZGV4W25vZGVdOwp9CgpjbGFzcyBTd2l0Y2hDYXNlSW5kZXhlciB7CiAgZmluYWwgTWFwPFN3aXRjaENhc2UsIGludD4gaW5kZXggPSA8U3dpdGNoQ2FzZSwgaW50Pnt9OwogIGludCBzdGFja0hlaWdodCA9IDA7CgogIHZvaWQgZW50ZXIoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIGZvciAoU3dpdGNoQ2FzZSBjYXNlTm9kZSBpbiBub2RlLmNhc2VzKSB7CiAgICAgIGluZGV4W2Nhc2VOb2RlXSA9IHN0YWNrSGVpZ2h0Kys7CiAgICB9CiAgfQoKICB2b2lkIGV4aXQoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIHN0YWNrSGVpZ2h0IC09IG5vZGUuY2FzZXMubGVuZ3RoOwogIH0KCiAgaW50IG9wZXJhdG9yIFtdKFN3aXRjaENhc2Ugbm9kZSkgPT4gaW5kZXhbbm9kZV07Cn0KCmNsYXNzIENvbnN0YW50SW5kZXhlciBleHRlbmRzIFJlY3Vyc2l2ZVZpc2l0b3IgewogIGZpbmFsIFN0cmluZ0luZGV4ZXIgc3RyaW5nSW5kZXhlcjsKCiAgZmluYWwgTGlzdDxDb25zdGFudD4gZW50cmllcyA9IDxDb25zdGFudD5bXTsKICBmaW5hbCBNYXA8Q29uc3RhbnQsIGludD4gb2Zmc2V0cyA9IDxDb25zdGFudCwgaW50Pnt9OwogIGludCBuZXh0T2Zmc2V0ID0gMDsKCiAgZmluYWwgQmluYXJ5UHJpbnRlciBfcHJpbnRlcjsKCiAgQ29uc3RhbnRJbmRleGVyKHRoaXMuc3RyaW5nSW5kZXhlciwgdGhpcy5fcHJpbnRlcik7CgogIGludCBwdXQoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGZpbmFsIGludCBvbGRPZmZzZXQgPSBvZmZzZXRzW2NvbnN0YW50XTsKICAgIGlmIChvbGRPZmZzZXQgIT0gbnVsbCkgcmV0dXJuIG9sZE9mZnNldDsKCiAgICAvLyBUcmF2ZXJzZSBEQUcgaW4gcG9zdC1vcmRlciB0byBlbnN1cmUgY2hpbGRyZW4gaGF2ZSB0aGVpciBvZmZzZXRzIGFzc2lnbmVkCiAgICAvLyBiZWZvcmUgdGhlIHBhcmVudC4KICAgIGNvbnN0YW50LnZpc2l0Q2hpbGRyZW4odGhpcyk7CgogICAgaWYgKGNvbnN0YW50IGlzIFN0cmluZ0NvbnN0YW50KSB7CiAgICAgIHN0cmluZ0luZGV4ZXIucHV0KGNvbnN0YW50LnZhbHVlKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgU3ltYm9sQ29uc3RhbnQpIHsKICAgICAgc3RyaW5nSW5kZXhlci5wdXQoY29uc3RhbnQubmFtZSk7CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50IGlzIERvdWJsZUNvbnN0YW50KSB7CiAgICAgIHN0cmluZ0luZGV4ZXIucHV0KCcke2NvbnN0YW50LnZhbHVlfScpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBJbnRDb25zdGFudCkgewogICAgICBmaW5hbCBpbnQgdmFsdWUgPSBjb25zdGFudC52YWx1ZTsKICAgICAgaWYgKCh2YWx1ZS5hYnMoKSA+PiAzMCkgIT0gMCkgewogICAgICAgIHN0cmluZ0luZGV4ZXIucHV0KCckdmFsdWUnKTsKICAgICAgfQogICAgfQoKICAgIGZpbmFsIGludCBuZXdPZmZzZXQgPSBuZXh0T2Zmc2V0OwogICAgZW50cmllcy5hZGQoY29uc3RhbnQpOwogICAgbmV4dE9mZnNldCArPSBfcHJpbnRlci53cml0ZUNvbnN0YW50VGFibGVFbnRyeShjb25zdGFudCk7CiAgICByZXR1cm4gb2Zmc2V0c1tjb25zdGFudF0gPSBuZXdPZmZzZXQ7CiAgfQoKICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2UoQ29uc3RhbnQgbm9kZSkgewogICAgcHV0KG5vZGUpOwogIH0KCiAgaW50IG9wZXJhdG9yIFtdKENvbnN0YW50IG5vZGUpID0+IG9mZnNldHNbbm9kZV07Cn0KCmNsYXNzIFR5cGVQYXJhbWV0ZXJJbmRleGVyIHsKICBmaW5hbCBNYXA8VHlwZVBhcmFtZXRlciwgaW50PiBpbmRleCA9IDxUeXBlUGFyYW1ldGVyLCBpbnQ+e307CiAgaW50IHN0YWNrSGVpZ2h0ID0gMDsKCiAgdm9pZCBlbnRlcihMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyID0gdHlwZVBhcmFtZXRlcnNbaV07CiAgICAgIGluZGV4W3BhcmFtZXRlcl0gPSBzdGFja0hlaWdodDsKICAgICAgKytzdGFja0hlaWdodDsKICAgIH0KICB9CgogIHZvaWQgZXhpdChMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CiAgICBzdGFja0hlaWdodCAtPSB0eXBlUGFyYW1ldGVycy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIGluZGV4LnJlbW92ZSh0eXBlUGFyYW1ldGVyc1tpXSk7CiAgICB9CiAgfQoKICBpbnQgb3BlcmF0b3IgW10oVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIpID0+CiAgICAgIGluZGV4W3BhcmFtZXRlcl0gPz8KICAgICAgKHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdUeXBlIHBhcmFtZXRlciAkcGFyYW1ldGVyIGlzIG5vdCBpbmRleGVkJykpOwp9CgpjbGFzcyBTdHJpbmdJbmRleGVyIHsKICAvLyBOb3RlIHRoYXQgdGhlIGl0ZXJhdGlvbiBvcmRlciBpcyBpbXBvcnRhbnQuCiAgZmluYWwgTWFwPFN0cmluZywgaW50PiBpbmRleCA9IG5ldyBNYXA8U3RyaW5nLCBpbnQ+KCk7CgogIFN0cmluZ0luZGV4ZXIoKSB7CiAgICBwdXQoJycpOwogIH0KCiAgaW50IHB1dChTdHJpbmcgc3RyaW5nKSB7CiAgICBpbnQgcmVzdWx0ID0gaW5kZXhbc3RyaW5nXTsKICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewogICAgICByZXN1bHQgPSBpbmRleC5sZW5ndGg7CiAgICAgIGluZGV4W3N0cmluZ10gPSByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgaW50IG9wZXJhdG9yIFtdKFN0cmluZyBzdHJpbmcpID0+IGluZGV4W3N0cmluZ107Cn0KCmNsYXNzIFVyaUluZGV4ZXIgewogIC8vIE5vdGUgdGhhdCB0aGUgaXRlcmF0aW9uIG9yZGVyIGlzIGltcG9ydGFudC4KICBmaW5hbCBNYXA8VXJpLCBpbnQ+IGluZGV4ID0gbmV3IE1hcDxVcmksIGludD4oKTsKCiAgVXJpSW5kZXhlcigpIHsKICAgIHB1dChudWxsKTsKICB9CgogIGludCBwdXQoVXJpIHVyaSkgewogICAgaW50IHJlc3VsdCA9IGluZGV4W3VyaV07CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgcmVzdWx0ID0gaW5kZXgubGVuZ3RoOwogICAgICBpbmRleFt1cmldID0gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCi8vLyBQdXRzIGEgYnVmZmVyIGluIGZyb250IG9mIGEgW1Npbms8TGlzdDxpbnQ+Pl0uCmNsYXNzIEJ1ZmZlcmVkU2luayB7CiAgc3RhdGljIGNvbnN0IGludCBTSVpFID0gMTAwMDAwOwogIHN0YXRpYyBjb25zdCBpbnQgU0FGRV9TSVpFID0gU0laRSAtIDU7CiAgc3RhdGljIGNvbnN0IGludCBTTUFMTCA9IDEwMDAwOwogIGZpbmFsIFNpbms8TGlzdDxpbnQ+PiBfc2luazsKICBVaW50OExpc3QgX2J1ZmZlciA9IG5ldyBVaW50OExpc3QoU0laRSk7CiAgaW50IGxlbmd0aCA9IDA7CiAgaW50IGZsdXNoZWRMZW5ndGggPSAwOwoKICBGbG9hdDY0TGlzdCBfZG91YmxlQnVmZmVyID0gbmV3IEZsb2F0NjRMaXN0KDEpOwogIFVpbnQ4TGlzdCBfZG91YmxlQnVmZmVyVWludDg7CgogIGludCBnZXQgb2Zmc2V0ID0+IGxlbmd0aCArIGZsdXNoZWRMZW5ndGg7CgogIEJ1ZmZlcmVkU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBhZGREb3VibGUoZG91YmxlIGQpIHsKICAgIF9kb3VibGVCdWZmZXJVaW50OCA/Pz0gX2RvdWJsZUJ1ZmZlci5idWZmZXIuYXNVaW50OExpc3QoKTsKICAgIF9kb3VibGVCdWZmZXJbMF0gPSBkOwogICAgYWRkQnl0ZTQoX2RvdWJsZUJ1ZmZlclVpbnQ4WzBdLCBfZG91YmxlQnVmZmVyVWludDhbMV0sCiAgICAgICAgX2RvdWJsZUJ1ZmZlclVpbnQ4WzJdLCBfZG91YmxlQnVmZmVyVWludDhbM10pOwogICAgYWRkQnl0ZTQoX2RvdWJsZUJ1ZmZlclVpbnQ4WzRdLCBfZG91YmxlQnVmZmVyVWludDhbNV0sCiAgICAgICAgX2RvdWJsZUJ1ZmZlclVpbnQ4WzZdLCBfZG91YmxlQnVmZmVyVWludDhbN10pOwogIH0KCiAgdm9pZCBhZGRCeXRlKGludCBieXRlKSB7CiAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGU7CiAgICBpZiAobGVuZ3RoID09IFNJWkUpIHsKICAgICAgX3NpbmsuYWRkKF9idWZmZXIpOwogICAgICBfYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChTSVpFKTsKICAgICAgbGVuZ3RoID0gMDsKICAgICAgZmx1c2hlZExlbmd0aCArPSBTSVpFOwogICAgfQogIH0KCiAgdm9pZCBhZGRCeXRlMihpbnQgYnl0ZTEsIGludCBieXRlMikgewogICAgaWYgKGxlbmd0aCA8IFNBRkVfU0laRSkgewogICAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGUxOwogICAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGUyOwogICAgfSBlbHNlIHsKICAgICAgYWRkQnl0ZShieXRlMSk7CiAgICAgIGFkZEJ5dGUoYnl0ZTIpOwogICAgfQogIH0KCiAgdm9pZCBhZGRCeXRlNChpbnQgYnl0ZTEsIGludCBieXRlMiwgaW50IGJ5dGUzLCBpbnQgYnl0ZTQpIHsKICAgIGlmIChsZW5ndGggPCBTQUZFX1NJWkUpIHsKICAgICAgX2J1ZmZlcltsZW5ndGgrK10gPSBieXRlMTsKICAgICAgX2J1ZmZlcltsZW5ndGgrK10gPSBieXRlMjsKICAgICAgX2J1ZmZlcltsZW5ndGgrK10gPSBieXRlMzsKICAgICAgX2J1ZmZlcltsZW5ndGgrK10gPSBieXRlNDsKICAgIH0gZWxzZSB7CiAgICAgIGFkZEJ5dGUoYnl0ZTEpOwogICAgICBhZGRCeXRlKGJ5dGUyKTsKICAgICAgYWRkQnl0ZShieXRlMyk7CiAgICAgIGFkZEJ5dGUoYnl0ZTQpOwogICAgfQogIH0KCiAgdm9pZCBhZGRCeXRlcyhMaXN0PGludD4gYnl0ZXMpIHsKICAgIC8vIEF2b2lkIGNvcHlpbmcgYSBsYXJnZSBidWZmZXIgaW50byB0aGUgYW5vdGhlciBsYXJnZSBidWZmZXIuIEFsc28sIGlmCiAgICAvLyB0aGUgYnl0ZXMgYnVmZmVyIGlzIHRvbyBsYXJnZSB0byBmaXQgaW4gb3VyIG93biBidWZmZXIsIGp1c3QgZW1pdCBib3RoLgogICAgaWYgKGxlbmd0aCArIGJ5dGVzLmxlbmd0aCA8IFNJWkUgJiYKICAgICAgICAoYnl0ZXMubGVuZ3RoIDwgU01BTEwgfHwgbGVuZ3RoIDwgU01BTEwpKSB7CiAgICAgIF9idWZmZXIuc2V0UmFuZ2UobGVuZ3RoLCBsZW5ndGggKyBieXRlcy5sZW5ndGgsIGJ5dGVzKTsKICAgICAgbGVuZ3RoICs9IGJ5dGVzLmxlbmd0aDsKICAgIH0gZWxzZSBpZiAoYnl0ZXMubGVuZ3RoIDwgU01BTEwpIHsKICAgICAgLy8gRmx1c2ggYXMgbXVjaCBhcyB3ZSBjYW4gaW4gdGhlIGN1cnJlbnQgYnVmZmVyLgogICAgICBfYnVmZmVyLnNldFJhbmdlKGxlbmd0aCwgU0laRSwgYnl0ZXMpOwogICAgICBfc2luay5hZGQoX2J1ZmZlcik7CiAgICAgIC8vIENvcHkgb3ZlciB0aGUgcmVtYWluZGVyIGludG8gYSBuZXcgYnVmZmVyLiBJdCBpcyBndWFyYW50ZWVkIHRvIGZpdAogICAgICAvLyBiZWNhdXNlIHRoZSBpbnB1dCBieXRlIGFycmF5IGlzIHNtYWxsLgogICAgICBpbnQgYWxyZWFkeUVtaXR0ZWQgPSBTSVpFIC0gbGVuZ3RoOwogICAgICBpbnQgcmVtYWluZGVyID0gYnl0ZXMubGVuZ3RoIC0gYWxyZWFkeUVtaXR0ZWQ7CiAgICAgIF9idWZmZXIgPSBuZXcgVWludDhMaXN0KFNJWkUpOwogICAgICBfYnVmZmVyLnNldFJhbmdlKDAsIHJlbWFpbmRlciwgYnl0ZXMsIGFscmVhZHlFbWl0dGVkKTsKICAgICAgbGVuZ3RoID0gcmVtYWluZGVyOwogICAgICBmbHVzaGVkTGVuZ3RoICs9IFNJWkU7CiAgICB9IGVsc2UgewogICAgICBmbHVzaCgpOwogICAgICBfc2luay5hZGQoYnl0ZXMpOwogICAgICBmbHVzaGVkTGVuZ3RoICs9IGJ5dGVzLmxlbmd0aDsKICAgIH0KICB9CgogIHZvaWQgZmx1c2goKSB7CiAgICBfc2luay5hZGQoX2J1ZmZlci5zdWJsaXN0KDAsIGxlbmd0aCkpOwogICAgX2J1ZmZlciA9IG5ldyBVaW50OExpc3QoU0laRSk7CiAgICBmbHVzaGVkTGVuZ3RoICs9IGxlbmd0aDsKICAgIGxlbmd0aCA9IDA7CiAgfQoKICB2b2lkIGZsdXNoQW5kRGVzdHJveSgpIHsKICAgIF9zaW5rLmFkZChfYnVmZmVyLnN1Ymxpc3QoMCwgbGVuZ3RoKSk7CiAgfQp9CgovLy8gTm9uLWVtcHR5IG1ldGFkYXRhIHN1YnNlY3Rpb24uCmNsYXNzIF9NZXRhZGF0YVN1YnNlY3Rpb24gewogIGZpbmFsIE1ldGFkYXRhUmVwb3NpdG9yeTxPYmplY3Q+IHJlcG9zaXRvcnk7CgogIC8vLyBMaXN0IG9mIChub2RlT2Zmc2V0LCBtZXRhZGF0YU9mZnNldCkgcGFpcnMuCiAgLy8vIEdyYWR1YWxseSBmaWxsZWQgYnkgdGhlIHdyaXRlciBhcyB3cml0aW5nIHByb2dyZXNzZXMsIHdoaWNoIGJ5CiAgLy8vIGNvbnN0cnVjdGlvbiBndWFyYW50ZWVzIHRoYXQgcGFpcnMgYXJlIHNvcnRlZCBieSBmaXJzdCBjb21wb25lbnQKICAvLy8gKG5vZGVPZmZzZXQpIGluIGFzY2VuZGluZyBvcmRlci4KICBmaW5hbCBMaXN0PGludD4gbWV0YWRhdGFNYXBwaW5nID0gPGludD5bXTsKCiAgX01ldGFkYXRhU3Vic2VjdGlvbih0aGlzLnJlcG9zaXRvcnkpOwp9CgovLy8gQSBbU2lua10gdGhhdCBkaXJlY3RseSB3cml0ZXMgZGF0YSBpbnRvIGEgYnl0ZSBidWlsZGVyLgovLyBUT0RPKGRhcnRidWcuY29tLzI4MzE2KTogUmVtb3ZlIHRoaXMgd3JhcHBlciBjbGFzcy4KY2xhc3MgQnl0ZXNTaW5rIGltcGxlbWVudHMgU2luazxMaXN0PGludD4+IHsKICBmaW5hbCBCeXRlc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBCeXRlc0J1aWxkZXIoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGRhdGEpIHsKICAgIGJ1aWxkZXIuYWRkKGRhdGEpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHsKICAgIC8vIE5vdGhpbmcgdG8gZG8uCiAgfQp9CgpjbGFzcyBOb3RRdWl0ZVN0cmluZyB7CiAgLyoqCiAgICogV3JpdGUgW3NvdXJjZV0gc3RyaW5nIGludG8gW3RhcmdldF0gc3RhcnRpbmcgYXQgaW5kZXggW2luZGV4XS4KICAgKgogICAqIE9wdGlvbmFsbHkgb25seSB3cml0ZSBwYXJ0IG9mIHRoZSBpbnB1dCBbc291cmNlXSBzdGFydGluZyBhdCBbc3RhcnRdIGFuZAogICAqIGVuZGluZyBhdCBbZW5kXS4KICAgKgogICAqIFRoZSBvdXRwdXQgc3BhY2UgbmVlZGVkIGlzIGF0IG1vc3QgW3NvdXJjZS5sZW5ndGhdICogMy4KICAgKgogICAqIFJldHVybnMKICAgKiAgKiBOb24tbmVnYXRpdmUgb24gc3VjY2VzcyAodGhlIG5ldyBpbmRleCBpbiBbdGFyZ2V0XSkuCiAgICogICogLTEgd2hlbiBbdGFyZ2V0XSBkb2Vzbid0IGhhdmUgZW5vdWdoIHNwYWNlLiBOb3RlIHRoYXQgW3RhcmdldF0gY2FuIGJlCiAgICogICAgcG9sdXRlZCBzdGFydGluZyBhdCBbaW5kZXhdLgogICAqICAqIC0yIG9uIGlucHV0IGVycm9yLCBpLmUuIGFuIHVucGFpcmVkIGxlYWQgb3IgdGFpbCBzdXJyb2dhdGUuCiAgICovCiAgc3RhdGljIGludCB3cml0ZVV0ZjgoTGlzdDxpbnQ+IHRhcmdldCwgaW50IGluZGV4LCBTdHJpbmcgc291cmNlLAogICAgICBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZEluZGV4KGluZGV4LCB0YXJnZXQsIG51bGwsIHRhcmdldC5sZW5ndGgpOwogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLmxlbmd0aCk7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gaW5kZXg7CiAgICBpbnQgaSA9IHN0YXJ0OwogICAgaW50IGxlbmd0aCA9IHRhcmdldC5sZW5ndGg7CiAgICBkbyB7CiAgICAgIGludCBjb2RlVW5pdCA9IHNvdXJjZS5jb2RlVW5pdEF0KGkrKyk7CiAgICAgIHdoaWxlIChjb2RlVW5pdCA8IDEyOCkgewogICAgICAgIGlmIChpbmRleCA+PSBsZW5ndGgpIHJldHVybiAtMTsKICAgICAgICB0YXJnZXRbaW5kZXgrK10gPSBjb2RlVW5pdDsKICAgICAgICBpZiAoaSA+PSBlbmQpIHJldHVybiBpbmRleDsKICAgICAgICBjb2RlVW5pdCA9IHNvdXJjZS5jb2RlVW5pdEF0KGkrKyk7CiAgICAgIH0KICAgICAgaWYgKGNvZGVVbml0IDwgMHg4MDApIHsKICAgICAgICBpbmRleCArPSAyOwogICAgICAgIGlmIChpbmRleCA+IGxlbmd0aCkgcmV0dXJuIC0xOwogICAgICAgIHRhcmdldFtpbmRleCAtIDJdID0gMHhDMCB8IChjb2RlVW5pdCA+PiA2KTsKICAgICAgICB0YXJnZXRbaW5kZXggLSAxXSA9IDB4ODAgfCAoY29kZVVuaXQgJiAweDNmKTsKICAgICAgfSBlbHNlIGlmIChjb2RlVW5pdCAmIDB4RjgwMCAhPSAweEQ4MDApIHsKICAgICAgICAvLyBOb3QgYSBzdXJyb2dhdGUuCiAgICAgICAgaW5kZXggKz0gMzsKICAgICAgICBpZiAoaW5kZXggPiBsZW5ndGgpIHJldHVybiAtMTsKICAgICAgICB0YXJnZXRbaW5kZXggLSAzXSA9IDB4RTAgfCAoY29kZVVuaXQgPj4gMTIpOwogICAgICAgIHRhcmdldFtpbmRleCAtIDJdID0gMHg4MCB8ICgoY29kZVVuaXQgPj4gNikgJiAweDNmKTsKICAgICAgICB0YXJnZXRbaW5kZXggLSAxXSA9IDB4ODAgfCAoY29kZVVuaXQgJiAweDNmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoY29kZVVuaXQgPj0gMHhEQzAwKSByZXR1cm4gLTI7IC8vIFVucGFpcmVkIHRhaWwgc3Vycm9nYXRlLgogICAgICAgIGlmIChpID49IGVuZCkgcmV0dXJuIC0yOyAvLyBVbnBhaXJlZCBsZWFkIHN1cnJvZ2F0ZS4KICAgICAgICBpbnQgbmV4dENoYXIgPSBzb3VyY2UuY29kZVVuaXRBdChpKyspOwogICAgICAgIGlmIChuZXh0Q2hhciAmIDB4RkMwMCAhPSAweERDMDApIHJldHVybiAtMjsgLy8gVW5wYWlyZWQgbGVhZCBzdXJyb2dhdGUuCiAgICAgICAgaW5kZXggKz0gNDsKICAgICAgICBpZiAoaW5kZXggPiBsZW5ndGgpIHJldHVybiAtMTsKICAgICAgICBjb2RlVW5pdCA9IChjb2RlVW5pdCAmIDB4M0ZGKSArIDB4NDA7CiAg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ZTsKICBTdHJpbmcgcGF0aDsKCiAgUGFyc2VFcnJvcih0aGlzLm1lc3NhZ2UsIHt0aGlzLmZpbGVuYW1lLCB0aGlzLmJ5dGVJbmRleCwgdGhpcy5wYXRofSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICckZmlsZW5hbWU6JGJ5dGVJbmRleDogJG1lc3NhZ2UgYXQgJHBhdGgnOwp9CgpjbGFzcyBJbnZhbGlkS2VybmVsVmVyc2lvbkVycm9yIHsKICBmaW5hbCBpbnQgdmVyc2lvbjsKCiAgSW52YWxpZEtlcm5lbFZlcnNpb25FcnJvcih0aGlzLnZlcnNpb24pOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ1VuZXhwZWN0ZWQgS2VybmVsIHZlcnNpb24gJHt2ZXJzaW9ufSAnCiAgICAgICAgJyhleHBlY3RlZCAke1RhZy5CaW5hcnlGb3JtYXRWZXJzaW9ufSkuJzsKICB9Cn0KCmNsYXNzIENhbm9uaWNhbE5hbWVFcnJvciB7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CgogIENhbm9uaWNhbE5hbWVFcnJvcih0aGlzLm1lc3NhZ2UpOwp9CgpjbGFzcyBDYW5vbmljYWxOYW1lU2RrRXJyb3IgZXh0ZW5kcyBDYW5vbmljYWxOYW1lRXJyb3IgewogIENhbm9uaWNhbE5hbWVTZGtFcnJvcihTdHJpbmcgbWVzc2FnZSkgOiBzdXBlcihtZXNzYWdlKTsKfQoKY2xhc3MgX0NvbXBvbmVudEluZGV4IHsKICBzdGF0aWMgY29uc3QgbnVtYmVyT2ZGaXhlZEZpZWxkcyA9IDk7CgogIGludCBiaW5hcnlPZmZzZXRGb3JTb3VyY2VUYWJsZTsKICBpbnQgYmluYXJ5T2Zmc2V0Rm9yQ2Fub25pY2FsTmFtZXM7CiAgaW50IGJpbmFyeU9mZnNldEZvck1ldGFkYXRhUGF5bG9hZHM7CiAgaW50IGJpbmFyeU9mZnNldEZvck1ldGFkYXRhTWFwcGluZ3M7CiAgaW50IGJpbmFyeU9mZnNldEZvclN0cmluZ1RhYmxlOwogIGludCBiaW5hcnlPZmZzZXRGb3JDb25zdGFudFRhYmxlOwogIGludCBtYWluTWV0aG9kUmVmZXJlbmNlOwogIExpc3Q8aW50PiBsaWJyYXJ5T2Zmc2V0czsKICBpbnQgbGlicmFyeUNvdW50OwogIGludCBjb21wb25lbnRGaWxlU2l6ZUluQnl0ZXM7Cn0KCmNsYXNzIEJpbmFyeUJ1aWxkZXIgewogIGZpbmFsIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVTdGFjayA9IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdOwogIGZpbmFsIExpc3Q8TGFiZWxlZFN0YXRlbWVudD4gbGFiZWxTdGFjayA9IDxMYWJlbGVkU3RhdGVtZW50PltdOwogIGludCBsYWJlbFN0YWNrQmFzZSA9IDA7CiAgZmluYWwgTGlzdDxTd2l0Y2hDYXNlPiBzd2l0Y2hDYXNlU3RhY2sgPSA8U3dpdGNoQ2FzZT5bXTsKICBmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJTdGFjayA9IDxUeXBlUGFyYW1ldGVyPltdOwogIGZpbmFsIFN0cmluZyBmaWxlbmFtZTsKICBmaW5hbCBMaXN0PGludD4gX2J5dGVzOwogIGludCBfYnl0ZU9mZnNldCA9IDA7CiAgZmluYWwgTGlzdDxTdHJpbmc+IF9zdHJpbmdUYWJsZSA9IDxTdHJpbmc+W107CiAgZmluYWwgTGlzdDxVcmk+IF9zb3VyY2VVcmlUYWJsZSA9IDxVcmk+W107CiAgTWFwPGludCwgQ29uc3RhbnQ+IF9jb25zdGFudFRhYmxlID0gPGludCwgQ29uc3RhbnQ+e307CiAgTGlzdDxDYW5vbmljYWxOYW1lPiBfbGlua1RhYmxlOwogIGludCBfdHJhbnNmb3JtZXJGbGFncyA9IDA7CiAgTGlicmFyeSBfY3VycmVudExpYnJhcnk7CiAgaW50IF9jb21wb25lbnRTdGFydE9mZnNldCA9IDA7CgogIC8vIElmIHNvbWV0aGluZyBnb2VzIHdyb25nLCB0aGlzIGxpc3Qgc2hvdWxkIGluZGljYXRlIHdoYXQgbGlicmFyeSwKICAvLyBjbGFzcywgYW5kIG1lbWJlciB3YXMgYmVpbmcgYnVpbHQuCiAgTGlzdDxTdHJpbmc+IGRlYnVnUGF0aCA9IDxTdHJpbmc+W107CgogIGJvb2wgX2lzUmVhZGluZ0xpYnJhcnlJbXBsZW1lbnRhdGlvbiA9IGZhbHNlOwogIGZpbmFsIGJvb2wgYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2RlczsKCiAgLy8vIElmIGJpbmFyeSBjb250YWlucyBtZXRhZGF0YSBzZWN0aW9uIHdpdGggcGF5bG9hZHMgcmVmZXJlbmNpbmcgb3RoZXIgbm9kZXMKICAvLy8gc3VjaCBLZXJuZWwgYmluYXJ5IGNhbid0IGJlIHJlYWQgbGF6aWx5IGJlY2F1c2UgbWV0YWRhdGEgY3Jvc3MgcmVmZXJlbmNlcwogIC8vLyB3aWxsIG5vdCBiZSByZXNvbHZlZCBjb3JyZWN0bHkuCiAgYm9vbCBfZGlzYWJsZUxhenlSZWFkaW5nID0gZmFsc2U7CgogIEJpbmFyeUJ1aWxkZXIodGhpcy5fYnl0ZXMsCiAgICAgIHt0aGlzLmZpbGVuYW1lLAogICAgICBib29sIGRpc2FibGVMYXp5UmVhZGluZyA9IGZhbHNlLAogICAgICBib29sIGFsd2F5c0NyZWF0ZU5ld05hbWVkTm9kZXN9KQogICAgICA6IF9kaXNhYmxlTGF6eVJlYWRpbmcgPSBkaXNhYmxlTGF6eVJlYWRpbmcsCiAgICAgICAgdGhpcy5hbHdheXNDcmVhdGVOZXdOYW1lZE5vZGVzID0gYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2RlcyA/PyBmYWxzZTsKCiAgZmFpbChTdHJpbmcgbWVzc2FnZSkgewogICAgdGhyb3cgUGFyc2VFcnJvcihtZXNzYWdlLAogICAgICAgIGJ5dGVJbmRleDogX2J5dGVPZmZzZXQsIGZpbGVuYW1lOiBmaWxlbmFtZSwgcGF0aDogZGVidWdQYXRoLmpvaW4oJzo6JykpOwogIH0KCiAgaW50IGdldCBieXRlT2Zmc2V0ID0+IF9ieXRlT2Zmc2V0OwoKICBpbnQgcmVhZEJ5dGUoKSA9PiBfYnl0ZXNbX2J5dGVPZmZzZXQrK107CgogIGludCByZWFkVUludCgpIHsKICAgIHZhciBieXRlID0gcmVhZEJ5dGUoKTsKICAgIGlmIChieXRlICYgMHg4MCA9PSAwKSB7CiAgICAgIC8vIDB4eHh4eHh4CiAgICAgIHJldHVybiBieXRlOwogICAgfSBlbHNlIGlmIChieXRlICYgMHg0MCA9PSAwKSB7CiAgICAgIC8vIDEweHh4eHh4CiAgICAgIHJldHVybiAoKGJ5dGUgJiAweDNGKSA8PCA4KSB8IHJlYWRCeXRlKCk7CiAgICB9IGVsc2UgewogICAgICAvLyAxMXh4eHh4eAogICAgICByZXR1cm4gKChieXRlICYgMHgzRikgPDwgMjQpIHwKICAgICAgICAgIChyZWFkQnl0ZSgpIDw8IDE2KSB8CiAgICAgICAgICAocmVhZEJ5dGUoKSA8PCA4KSB8CiAgICAgICAgICByZWFkQnl0ZSgpOwogICAgfQogIH0KCiAgaW50IHJlYWRVaW50MzIoKSB7CiAgICByZXR1cm4gKHJlYWRCeXRlKCkgPDwgMjQpIHwKICAgICAgICAocmVhZEJ5dGUoKSA8PCAxNikgfAogICAgICAgIChyZWFkQnl0ZSgpIDw8IDgpIHwKICAgICAgICByZWFkQnl0ZSgpOwogIH0KCiAgZmluYWwgRmxvYXQ2NExpc3QgX2RvdWJsZUJ1ZmZlciA9IG5ldyBGbG9hdDY0TGlzdCgxKTsKICBVaW50OExpc3QgX2RvdWJsZUJ1ZmZlclVpbnQ4OwoKICBkb3VibGUgcmVhZERvdWJsZSgpIHsKICAgIF9kb3VibGVCdWZmZXJVaW50OCA/Pz0gX2RvdWJsZUJ1ZmZlci5idWZmZXIuYXNVaW50OExpc3QoKTsKICAgIF9kb3VibGVCdWZmZXJVaW50OFswXSA9IHJlYWRCeXRlKCk7CiAgICBfZG91YmxlQnVmZmVyVWludDhbMV0gPSByZWFkQnl0ZSgpOwogICAgX2RvdWJsZUJ1ZmZlclVpbnQ4WzJdID0gcmVhZEJ5dGUoKTsKICAgIF9kb3VibGVCdWZmZXJVaW50OFszXSA9IHJlYWRCeXRlKCk7CiAgICBfZG91YmxlQnVmZmVyVWludDhbNF0gPSByZWFkQnl0ZSgpOwogICAgX2RvdWJsZUJ1ZmZlclVpbnQ4WzVdID0gcmVhZEJ5dGUoKTsKICAgIF9kb3VibGVCdWZmZXJVaW50OFs2XSA9IHJlYWRCeXRlKCk7CiAgICBfZG91YmxlQnVmZmVyVWludDhbN10gPSByZWFkQnl0ZSgpOwogICAgcmV0dXJuIF9kb3VibGVCdWZmZXJbMF07CiAgfQoKICBMaXN0PGludD4gcmVhZEJ5dGVzKGludCBsZW5ndGgpIHsKICAgIExpc3Q8aW50PiBieXRlcyA9IG5ldyBVaW50OExpc3QobGVuZ3RoKTsKICAgIGJ5dGVzLnNldFJhbmdlKDAsIGJ5dGVzLmxlbmd0aCwgX2J5dGVzLCBfYnl0ZU9mZnNldCk7CiAgICBfYnl0ZU9mZnNldCArPSBieXRlcy5sZW5ndGg7CiAgICByZXR1cm4gYnl0ZXM7CiAgfQoKICBMaXN0PGludD4gcmVhZEJ5dGVMaXN0KCkgewogICAgcmV0dXJuIHJlYWRCeXRlcyhyZWFkVUludCgpKTsKICB9CgogIFN0cmluZyByZWFkU3RyaW5nRW50cnkoaW50IG51bUJ5dGVzKSB7CiAgICAvLyBVdGY4RGVjb2RlciB3aWxsIHNraXAgbGVhZGluZyBCT00gY2hhcmFjdGVycywgYnV0IHdlIG11c3QgcHJlc2VydmUgdGhlbS4KICAgIC8vIENvbGxlY3QgbGVhZGluZyBCT01zIGJlZm9yZSBwYXNzaW5nIHRoZSBieXRlcyBvbnRvIFV0ZjhEZWNvZGVyLgogICAgaW50IG51bUJ5dGVPcmRlck1hcmtzID0gMDsKICAgIHdoaWxlIChfYnl0ZU9mZnNldCArIDIgPCBfYnl0ZXMubGVuZ3RoICYmCiAgICAgICAgX2J5dGVzW19ieXRlT2Zmc2V0XSA9PSAweGVmICYmCiAgICAgICAgX2J5dGVzW19ieXRlT2Zmc2V0ICsgMV0gPT0gMHhiYiAmJgogICAgICAgIF9ieXRlc1tfYnl0ZU9mZnNldCArIDJdID09IDB4YmYpIHsKICAgICAgKytudW1CeXRlT3JkZXJNYXJrczsKICAgICAgX2J5dGVPZmZzZXQgKz0gMzsKICAgICAgbnVtQnl0ZXMgLT0gMzsKICAgIH0KICAgIFN0cmluZyBzdHJpbmcgPSBjb25zdCBVdGY4RGVjb2RlcigpCiAgICAgICAgLmNvbnZlcnQoX2J5dGVzLCBfYnl0ZU9mZnNldCwgX2J5dGVPZmZzZXQgKyBudW1CeXRlcyk7CiAgICBfYnl0ZU9mZnNldCArPSBudW1CeXRlczsKICAgIGlmIChudW1CeXRlT3JkZXJNYXJrcyA+IDApIHsKICAgICAgcmV0dXJuICdcdWZlZmYnICogbnVtQnl0ZU9yZGVyTWFya3MgKyBzdHJpbmc7CiAgICB9CiAgICByZXR1cm4gc3RyaW5nOwogIH0KCiAgLy8vIFJlYWQgbWV0YWRhdGFNYXBwaW5ncyBzZWN0aW9uIGZyb20gdGhlIGJpbmFyeS4KICB2b2lkIF9yZWFkTWV0YWRhdGFNYXBwaW5ncygKICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCwgaW50IGJpbmFyeU9mZnNldEZvck1ldGFkYXRhUGF5bG9hZHMpIHsKICAgIC8vIERlZmF1bHQgcmVhZGVyIGlnbm9yZXMgbWV0YWRhdGEgc2VjdGlvbiBlbnRpcmVseS4KICB9CgogIC8vLyBSZWFkcyBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIFtub2RlXS4KICBOb2RlIF9hc3NvY2lhdGVNZXRhZGF0YShOb2RlIG5vZGUsIGludCBub2RlT2Zmc2V0KSB7CiAgICAvLyBEZWZhdWx0IHJlYWRlciBpZ25vcmVzIG1ldGFkYXRhIHNlY3Rpb24gZW50aXJlbHkuCiAgICByZXR1cm4gbm9kZTsKICB9CgogIHZvaWQgcmVhZFN0cmluZ1RhYmxlKExpc3Q8U3RyaW5nPiB0YWJsZSkgewogICAgLy8gUmVhZCB0aGUgdGFibGUgb2YgZW5kIG9mZnNldHMuCiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8aW50PiBlbmRPZmZzZXRzID0gbmV3IExpc3Q8aW50PihsZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBlbmRPZmZzZXRzW2ldID0gcmVhZFVJbnQoKTsKICAgIH0KICAgIC8vIFJlYWQgdGhlIFVURi04IGVuY29kZWQgc3RyaW5ncy4KICAgIHRhYmxlLmxlbmd0aCA9IGxlbmd0aDsKICAgIGludCBzdGFydE9mZnNldCA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHRhYmxlW2ldID0gcmVhZFN0cmluZ0VudHJ5KGVuZE9mZnNldHNbaV0gLSBzdGFydE9mZnNldCk7CiAgICAgIHN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0c1tpXTsKICAgIH0KICB9CgogIHZvaWQgcmVhZENvbnN0YW50VGFibGUoKSB7CiAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIGZpbmFsIGludCBzdGFydE9mZnNldCA9IGJ5dGVPZmZzZXQ7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIF9jb25zdGFudFRhYmxlW2J5dGVPZmZzZXQgLSBzdGFydE9mZnNldF0gPSByZWFkQ29uc3RhbnRUYWJsZUVudHJ5KCk7CiAgICB9CiAgfQoKICBDb25zdGFudCByZWFkQ29uc3RhbnRUYWJsZUVudHJ5KCkgewogICAgZmluYWwgaW50IGNvbnN0YW50VGFnID0gcmVhZEJ5dGUoKTsKICAgIHN3aXRjaCAoY29uc3RhbnRUYWcpIHsKICAgICAgY2FzZSBDb25zdGFudFRhZy5OdWxsQ29uc3RhbnQ6CiAgICAgICAgcmV0dXJuIG5ldyBOdWxsQ29uc3RhbnQoKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5Cb29sQ29uc3RhbnQ6CiAgICAgICAgcmV0dXJuIG5ldyBCb29sQ29uc3RhbnQocmVhZEJ5dGUoKSA9PSAxKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5JbnRDb25zdGFudDoKICAgICAgICByZXR1cm4gbmV3IEludENvbnN0YW50KChyZWFkRXhwcmVzc2lvbigpIGFzIEludExpdGVyYWwpLnZhbHVlKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5Eb3VibGVDb25zdGFudDoKICAgICAgICByZXR1cm4gbmV3IERvdWJsZUNvbnN0YW50KHJlYWREb3VibGUoKSk7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcuU3RyaW5nQ29uc3RhbnQ6CiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdDb25zdGFudChyZWFkU3RyaW5nUmVmZXJlbmNlKCkpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlN5bWJvbENvbnN0YW50OgogICAgICAgIFJlZmVyZW5jZSBsaWJyYXJ5UmVmZXJlbmNlID0gcmVhZExpYnJhcnlSZWZlcmVuY2UoYWxsb3dOdWxsOiB0cnVlKTsKICAgICAgICByZXR1cm4gbmV3IFN5bWJvbENvbnN0YW50KHJlYWRTdHJpbmdSZWZlcmVuY2UoKSwgbGlicmFyeVJlZmVyZW5jZSk7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcuTWFwQ29uc3RhbnQ6CiAgICAgICAgZmluYWwgRGFydFR5cGUga2V5VHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIGZpbmFsIERhcnRUeXBlIHZhbHVlVHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIGZpbmFsIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgICAgIGZpbmFsIExpc3Q8Q29uc3RhbnRNYXBFbnRyeT4gZW50cmllcyA9CiAgICAgICAgICAgIG5ldyBMaXN0PENvbnN0YW50TWFwRW50cnk+LmZpbGxlZChsZW5ndGgsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBmaW5hbCBDb25zdGFudCBrZXkgPSByZWFkQ29uc3RhbnRSZWZlcmVuY2UoKTsKICAgICAgICAgIGZpbmFsIENvbnN0YW50IHZhbHVlID0gcmVhZENvbnN0YW50UmVmZXJlbmNlKCk7CiAgICAgICAgICBlbnRyaWVzW2ldID0gbmV3IENvbnN0YW50TWFwRW50cnkoa2V5LCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgTWFwQ29uc3RhbnQoa2V5VHlwZSwgdmFsdWVUeXBlLCBlbnRyaWVzKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5MaXN0Q29uc3RhbnQ6CiAgICAgICAgZmluYWwgRGFydFR5cGUgdHlwZUFyZ3VtZW50ID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICAgICAgZmluYWwgTGlzdDxDb25zdGFudD4gZW50cmllcyA9CiAgICAgICAgICAgIG5ldyBMaXN0PENvbnN0YW50Pi5maWxsZWQobGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgZW50cmllc1tpXSA9IHJlYWRDb25zdGFudFJlZmVyZW5jZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IExpc3RDb25zdGFudCh0eXBlQXJndW1lbnQsIGVudHJpZXMpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlNldENvbnN0YW50OgogICAgICAgIGZpbmFsIERhcnRUeXBlIHR5cGVBcmd1bWVudCA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIGZpbmFsIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgICAgIGZpbmFsIExpc3Q8Q29uc3RhbnQ+IGVudHJpZXMgPQogICAgICAgICAgICBuZXcgTGlzdDxDb25zdGFudD4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGVudHJpZXNbaV0gPSByZWFkQ29uc3RhbnRSZWZlcmVuY2UoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBTZXRDb25zdGFudCh0eXBlQXJndW1lbnQsIGVudHJpZXMpOwogICAgICBjYXNlIENvbnN0YW50VGFnLkluc3RhbmNlQ29uc3RhbnQ6CiAgICAgICAgZmluYWwgUmVmZXJlbmNlIGNsYXNzUmVmZXJlbmNlID0gcmVhZENsYXNzUmVmZXJlbmNlKCk7CiAgICAgICAgZmluYWwgaW50IHR5cGVBcmd1bWVudENvdW50ID0gcmVhZFVJbnQoKTsKICAgICAgICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCh0eXBlQXJndW1lbnRDb3VudCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50Q291bnQ7IGkrKykgewogICAgICAgICAgdHlwZUFyZ3VtZW50c1tpXSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIH0KICAgICAgICBmaW5hbCBpbnQgZmllbGRWYWx1ZUNvdW50ID0gcmVhZFVJbnQoKTsKICAgICAgICBmaW5hbCBNYXA8UmVmZXJlbmNlLCBDb25zdGFudD4gZmllbGRWYWx1ZXMgPSA8UmVmZXJlbmNlLCBDb25zdGFudD57fTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkVmFsdWVDb3VudDsgaSsrKSB7CiAgICAgICAgICBmaW5hbCBSZWZlcmVuY2UgZmllbGRSZWYgPQogICAgICAgICAgICAgIHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCkuZ2V0UmVmZXJlbmNlKCk7CiAgICAgICAgICBmaW5hbCBDb25zdGFudCBjb25zdGFudCA9IHJlYWRDb25zdGFudFJlZmVyZW5jZSgpOwogICAgICAgICAgZmllbGRWYWx1ZXNbZmllbGRSZWZdID0gY29uc3RhbnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgSW5zdGFuY2VDb25zdGFudChjbGFzc1JlZmVyZW5jZSwgdHlwZUFyZ3VtZW50cywgZmllbGRWYWx1ZXMpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQ6CiAgICAgICAgZmluYWwgdGVhck9mZkNvbnN0YW50ID0gcmVhZENvbnN0YW50UmVmZXJlbmNlKCkgYXMgVGVhck9mZkNvbnN0YW50OwogICAgICAgIGZpbmFsIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgICAgIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVzID0gbmV3IExpc3Q8RGFydFR5cGU+KGxlbmd0aCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgdHlwZXNbaV0gPSByZWFkRGFydFR5cGUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KHRlYXJPZmZDb25zdGFudCwgdHlwZXMpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlRlYXJPZmZDb25zdGFudDoKICAgICAgICBmaW5hbCBSZWZlcmVuY2UgcmVmZXJlbmNlID0gcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKS5nZXRSZWZlcmVuY2UoKTsKICAgICAgICByZXR1cm4gbmV3IFRlYXJPZmZDb25zdGFudC5ieVJlZmVyZW5jZShyZWZlcmVuY2UpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlR5cGVMaXRlcmFsQ29uc3RhbnQ6CiAgICAgICAgZmluYWwgRGFydFR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgVHlwZUxpdGVyYWxDb25zdGFudCh0eXBlKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5VbmV2YWx1YXRlZENvbnN0YW50OgogICAgICAgIGZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJlYWRFeHByZXNzaW9uKCk7CiAgICAgICAgcmV0dXJuIG5ldyBVbmV2YWx1YXRlZENvbnN0YW50KGV4cHJlc3Npb24pOwogICAgfQoKICAgIHRocm93IGZhaWwoJ3VuZXhwZWN0ZWQgY29uc3RhbnQgdGFnOiAkY29uc3RhbnRUYWcnKTsKICB9CgogIENvbnN0YW50IHJlYWRDb25zdGFudFJlZmVyZW5jZSgpIHsKICAgIGZpbmFsIGludCBvZmZzZXQgPSByZWFkVUludCgpOwogICAgQ29uc3RhbnQgY29uc3RhbnQgPSBfY29uc3RhbnRUYWJsZVtvZmZzZXRdOwogICAgYXNzZXJ0KGNvbnN0YW50ICE9IG51bGwpOwogICAgcmV0dXJuIGNvbnN0YW50OwogIH0KCiAgVXJpIHJlYWRVcmlSZWZlcmVuY2UoKSB7CiAgICByZXR1cm4gX3NvdXJjZVVyaVRhYmxlW3JlYWRVSW50KCldOwogIH0KCiAgU3RyaW5nIHJlYWRTdHJpbmdSZWZlcmVuY2UoKSB7CiAgICByZXR1cm4gX3N0cmluZ1RhYmxlW3JlYWRVSW50KCldOwogIH0KCiAgTGlzdDxTdHJpbmc+IHJlYWRTdHJpbmdSZWZlcmVuY2VMaXN0KCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IExpc3Q8U3RyaW5nPi5maWxsZWQobGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IHJlYWRTdHJpbmdSZWZlcmVuY2UoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTdHJpbmcgcmVhZFN0cmluZ09yTnVsbElmRW1wdHkoKSB7CiAgICB2YXIgc3RyaW5nID0gcmVhZFN0cmluZ1JlZmVyZW5jZSgpOwogICAgcmV0dXJuIHN0cmluZy5pc0VtcHR5ID8gbnVsbCA6IHN0cmluZzsKICB9CgogIGJvb2wgcmVhZEFuZENoZWNrT3B0aW9uVGFnKCkgewogICAgaW50IHRhZyA9IHJlYWRCeXRlKCk7CiAgICBpZiAodGFnID09IFRhZy5Ob3RoaW5nKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAodGFnID09IFRhZy5Tb21ldGhpbmcpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBmYWlsKCd1bmV4cGVjdGVkIG9wdGlvbiB0YWc6ICR0YWcnKTsKICAgIH0KICB9CgogIExpc3Q8RXhwcmVzc2lvbj4gcmVhZEFubm90YXRpb25MaXN0KFRyZWVOb2RlIHBhcmVudCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBjb25zdCA8RXhwcmVzc2lvbj5bXTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gbGlzdCA9CiAgICAgICAgbmV3IExpc3Q8RXhwcmVzc2lvbj4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBsaXN0W2ldID0gcmVhZEV4cHJlc3Npb24oKS4ucGFyZW50ID0gcGFyZW50OwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICB2b2lkIF9maWxsVHJlZU5vZGVMaXN0KAogICAgICBMaXN0PFRyZWVOb2RlPiBsaXN0LCBUcmVlTm9kZSBidWlsZE9iamVjdChpbnQgaW5kZXgpLCBUcmVlTm9kZSBwYXJlbnQpIHsKICAgIHZhciBsZW5ndGggPSByZWFkVUludCgpOwogICAgbGlzdC5sZW5ndGggPSBsZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIFRyZWVOb2RlIG9iamVjdCA9IGJ1aWxkT2JqZWN0KGkpOwogICAgICBsaXN0W2ldID0gb2JqZWN0Li5wYXJlbnQgPSBwYXJlbnQ7CiAgICB9CiAgfQoKICB2b2lkIF9maWxsTm9uVHJlZU5vZGVMaXN0KExpc3Q8Tm9kZT4gbGlzdCwgTm9kZSBidWlsZE9iamVjdCgpKSB7CiAgICB2YXIgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIGxpc3QubGVuZ3RoID0gbGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBOb2RlIG9iamVjdCA9IGJ1aWxkT2JqZWN0KCk7CiAgICAgIGxpc3RbaV0gPSBvYmplY3Q7CiAgICB9CiAgfQoKICB2b2lkIF9za2lwTm9kZUxpc3QoTm9kZSBza2lwT2JqZWN0KCkpIHsKICAgIHZhciBsZW5ndGggPSByZWFkVUludCgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBza2lwT2JqZWN0KCk7CiAgICB9CiAgfQoKICAvLy8gUmVhZHMgYSBsaXN0IG9mIG5hbWVkIG5vZGVzLCByZXVzaW5nIGFueSBleGlzdGluZyBvYmplY3RzIGFscmVhZHkgaW4gdGhlCiAgLy8vIGxpbmtpbmcgdHJlZS4gVGhlIG5vZGVzIGFyZSBtZXJnZWQgaW50byBbbGlzdF0sIGFuZCBpZiByZWFkaW5nIHRoZSBsaWJyYXJ5CiAgLy8vIGltcGxlbWVudGF0aW9uLCB0aGUgb3JkZXIgaXMgY29ycmVjdGVkLgogIC8vLwogIC8vLyBbcmVhZE9iamVjdF0gc2hvdWxkIHJlYWQgdGhlIG9iamVjdCBkZWZpbml0aW9uIGFuZCBpdHMgY2Fub25pY2FsIG5hbWUuCiAgLy8vIElmIGFuIGV4aXN0aW5nIG9iamVjdCBpcyBib3VuZCB0byB0aGUgY2Fub25pY2FsIG5hbWUsIHRoZSBleGlzdGluZyBvYmplY3QKICAvLy8gbXVzdCBiZSByZXVzZWQgYW5kIHJldHVybmVkLgogIHZvaWQgX21lcmdlTmFtZWROb2RlTGlzdCgKICAgICAgTGlzdDxOYW1lZE5vZGU+IGxpc3QsIE5hbWVkTm9kZSByZWFkT2JqZWN0KGludCBpbmRleCksIFRyZWVOb2RlIHBhcmVudCkgewogICAgaWYgKF9pc1JlYWRpbmdMaWJyYXJ5SW1wbGVtZW50YXRpb24pIHsKICAgICAgLy8gV2hlbiByZWFkaW5nIHRoZSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uLCBvdmVyd3JpdGUgdGhlIHdob2xlIGxpc3QKICAgICAgLy8gd2l0aCB0aGUgbmV3IG9uZS4KICAgICAgX2ZpbGxUcmVlTm9kZUxpc3QobGlzdCwgcmVhZE9iamVjdCwgcGFyZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFdoZW4gcmVhZGluZyBhbiBleHRlcm5hbCBsaWJyYXJ5LCB0aGUgcmVzdWx0cyBzaG91bGQgZWl0aGVyIGJlOgogICAgICAvLyAtIG1lcmdlZCB3aXRoIHRoZSBleGlzdGluZyBleHRlcm5hbCBsaWJyYXJ5IGRlZmluaXRpb24gKGlmIGFueSkKICAgICAgLy8gLSBpZ25vcmVkIGlmIHRoZSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIGlzIGFscmVhZHkgaW4gbWVtb3J5CiAgICAgIGludCBudW1iZXJPZk5vZGVzID0gcmVhZFVJbnQoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZk5vZGVzOyArK2kpIHsKICAgICAgICB2YXIgdmFsdWUgPSByZWFkT2JqZWN0KGkpOwogICAgICAgIC8vIFdlIHVzZSB0aGUgcGFyZW50IHBvaW50ZXIgb2YgYSBub2RlIHRvIGRldGVybWluZSBpZiBpdCBhbHJlYWR5IGlzIGluCiAgICAgICAgLy8gdGhlIEFTVCBhbmQgaGVuY2Ugc2hvdWxkIG5vdCBiZSBhZGRlZCBhZ2Fpbi4KICAgICAgICBpZiAodmFsdWUucGFyZW50ID09IG51bGwpIHsKICAgICAgICAgIGxpc3QuYWRkKHZhbHVlLi5wYXJlbnQgPSBwYXJlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdm9pZCByZWFkTGlua1RhYmxlKENhbm9uaWNhbE5hbWUgbGlua1Jvb3QpIHsKICAgIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgX2xpbmtUYWJsZSA9IG5ldyBMaXN0PENhbm9uaWNhbE5hbWU+KGxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIGludCBiaWFzZWRQYXJlbnRJbmRleCA9IHJlYWRVSW50KCk7CiAgICAgIFN0cmluZyBuYW1lID0gcmVhZFN0cmluZ1JlZmVyZW5jZSgpOwogICAgICB2YXIgcGFyZW50ID0KICAgICAgICAgIGJpYXNlZFBhcmVudEluZGV4ID09IDAgPyBsaW5rUm9vdCA6IF9saW5rVGFibGVbYmlhc2VkUGFyZW50SW5kZXggLSAxXTsKICAgICAgX2xpbmtUYWJsZVtpXSA9IHBhcmVudC5nZXRDaGlsZChuYW1lKTsKICAgIH0KICB9CgogIExpc3Q8aW50PiBfaW5kZXhDb21wb25lbnRzKCkgewogICAgaW50IHNhdmVkQnl0ZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgX2J5dGVPZmZzZXQgPSBfYnl0ZXMubGVuZ3RoIC0gNDsKICAgIExpc3Q8aW50PiBpbmRleCA9IDxpbnQ+W107CiAgICB3aGlsZSAoX2J5dGVPZmZzZXQgPiAwKSB7CiAgICAgIGludCBzaXplID0gcmVhZFVpbnQzMigpOwogICAgICBpbnQgc3RhcnQgPSBfYnl0ZU9mZnNldCAtIHNpemU7CiAgICAgIGlmIChzdGFydCA8IDApIHsKICAgICAgICB0aHJvdyBmYWlsKCJpbmRpY2F0ZWQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBmaWxlIHNpemUiKTsKICAgICAgfQogICAgICBpbmRleC5hZGQoc2l6ZSk7CiAgICAgIF9ieXRlT2Zmc2V0ID0gc3RhcnQgLSA0OwogICAgfQogICAgX2J5dGVPZmZzZXQgPSBzYXZlZEJ5dGVPZmZzZXQ7CiAgICByZXR1cm4gbmV3IExpc3QuZnJvbShpbmRleC5yZXZlcnNlZCk7CiAgfQoKICAvLy8gRGVzZXJpYWxpemVzIGEga2VybmVsIGNvbXBvbmVudCBhbmQgc3RvcmVzIGl0IGluIFtjb21wb25lbnRdLgogIC8vLwogIC8vLyBXaGVuIGxpbmtpbmcgd2l0aCBhIG5vbi1lbXB0eSBjb21wb25lbnQsIGNhbm9uaWNhbCBuYW1lcyBtdXN0IGhhdmUgYmVlbgogIC8vLyBjb21wdXRlZCBhaGVhZCBvZiB0aW1lLgogIC8vLwogIC8vLyBUaGUgaW5wdXQgYnl0ZXMgbWF5IGNvbnRhaW4gbXVsdGlwbGUgZmlsZXMgY29uY2F0ZW5hdGVkLgogIHZvaWQgcmVhZENvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50LCB7Ym9vbCBjaGVja0Nhbm9uaWNhbE5hbWVzOiBmYWxzZX0pIHsKICAgIC8vIENoZWNrIHRoYXQgd2UgaGF2ZSBhIC5kaWxsIGZpbGUgYW5kIGl0IGhhcyB0aGUgY29ycmVjdCB2ZXJzaW9uIGJlZm9yZSB3ZQogICAgLy8gc3RhcnQgZGVjb2RpbmcgaXQuICBPdGhlcndpc2Ugd2Ugd2lsbCBmYWlsIGZvciBjcnlwdGljIHJlYXNvbnMuCiAgICBpbnQgb2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBpbnQgbWFnaWMgPSByZWFkVWludDMyKCk7CiAgICBpZiAobWFnaWMgIT0gVGFnLkNvbXBvbmVudEZpbGUpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcignTm90IGEgLmRpbGwgZmlsZSAod3JvbmcgbWFnaWMgbnVtYmVyKS4nKTsKICAgIH0KICAgIGludCB2ZXJzaW9uID0gcmVhZFVpbnQzMigpOwogICAgaWYgKHZlcnNpb24gIT0gVGFnLkJpbmFyeUZvcm1hdFZlcnNpb24pIHsKICAgICAgdGhyb3cgSW52YWxpZEtlcm5lbFZlcnNpb25FcnJvcih2ZXJzaW9uKTsKICAgIH0KICAgIF9ieXRlT2Zmc2V0ID0gb2Zmc2V0OwogICAgTGlzdDxpbnQ+IGNvbXBvbmVudEZpbGVTaXplcyA9IF9pbmRleENvbXBvbmVudHMoKTsKICAgIGlmIChjb21wb25lbnRGaWxlU2l6ZXMubGVuZ3RoID4gMSkgewogICAgICBfZGlzYWJsZUxhenlSZWFkaW5nID0gdHJ1ZTsKICAgIH0KICAgIGludCBjb21wb25lbnRGaWxlSW5kZXggPSAwOwogICAgd2hpbGUgKF9ieXRlT2Zmc2V0IDwgX2J5dGVzLmxlbmd0aCkgewogICAgICBfcmVhZE9uZUNvbXBvbmVudChjb21wb25lbnQsIGNvbXBvbmVudEZpbGVTaXplc1tjb21wb25lbnRGaWxlSW5kZXhdKTsKICAgICAgKytjb21wb25lbnRGaWxlSW5kZXg7CiAgICB9CgogICAgaWYgKGNoZWNrQ2Fub25pY2FsTmFtZXMpIHsKICAgICAgX2NoZWNrQ2Fub25pY2FsTmFtZUNoaWxkcmVuKGNvbXBvbmVudC5yb290KTsKICAgIH0KICB9CgogIC8vLyBEZXNlcmlhbGl6ZXMgdGhlIHNvdXJjZSBhbmQgc3RvcmVzIGl0IGluIFtjb21wb25lbnRdLgogIC8vLwogIC8vLyBUaGUgaW5wdXQgYnl0ZXMgbWF5IGNvbnRhaW4gbXVsdGlwbGUgZmlsZXMgY29uY2F0ZW5hdGVkLgogIHZvaWQgcmVhZENvbXBvbmVudFNvdXJjZShDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBMaXN0PGludD4gY29tcG9uZW50RmlsZVNpemVzID0gX2luZGV4Q29tcG9uZW50cygpOwogICAgaWYgKGNvbXBvbmVudEZpbGVTaXplcy5sZW5ndGggPiAxKSB7CiAgICAgIF9kaXNhYmxlTGF6eVJlYWRpbmcgPSB0cnVlOwogICAgfQogICAgaW50IGNvbXBvbmVudEZpbGVJbmRleCA9IDA7CiAgICB3aGlsZSAoX2J5dGVPZmZzZXQgPCBfYnl0ZXMubGVuZ3RoKSB7CiAgICAgIF9yZWFkT25lQ29tcG9uZW50U291cmNlKAogICAgICAgICAgY29tcG9uZW50LCBjb21wb25lbnRGaWxlU2l6ZXNbY29tcG9uZW50RmlsZUluZGV4XSk7CiAgICAgICsrY29tcG9uZW50RmlsZUluZGV4OwogICAgfQogIH0KCiAgLy8vIFJlYWRzIGEgc2luZ2xlIGNvbXBvbmVudCBmaWxlIGZyb20gdGhlIGlucHV0IGFuZCBsb2FkcyBpdCBpbnRvIFtjb21wb25lbnRdLAogIC8vLyBvdmVyd3JpdGluZyBhbmQgcmV1c2luZyBhbnkgZXhpc3RpbmcgZGF0YSBpbiB0aGUgY29tcG9uZW50LgogIC8vLwogIC8vLyBXaGVuIGxpbmtpbmcgd2l0aCBhIG5vbi1lbXB0eSBjb21wb25lbnQsIGNhbm9uaWNhbCBuYW1lcyBtdXN0IGhhdmUgYmVlbgogIC8vLyBjb21wdXRlZCBhaGVhZCBvZiB0aW1lLgogIC8vLwogIC8vLyBUaGlzIHNob3VsZCAqb25seSogYmUgdXNlZCB3aGVuIHRoZXJlIGlzIGEgcmVhc29uIHRvIG5vdCBhbGxvdwogIC8vLyBjb25jYXRlbmF0ZWQgZmlsZXMuCiAgdm9pZCByZWFkU2luZ2xlRmlsZUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50LAogICAgICB7Ym9vbCBjaGVja0Nhbm9uaWNhbE5hbWVzOiBmYWxzZX0pIHsKICAgIExpc3Q8aW50PiBjb21wb25lbnRGaWxlU2l6ZXMgPSBfaW5kZXhDb21wb25lbnRzKCk7CiAgICBpZiAoY29tcG9uZW50RmlsZVNpemVzLmlzRW1wdHkpIHRocm93IGZhaWwoImludmFsaWQgY29tcG9uZW50IGRhdGEiKTsKICAgIF9yZWFkT25lQ29tcG9uZW50KGNvbXBvbmVudCwgY29tcG9uZW50RmlsZVNpemVzWzBdKTsKICAgIGlmIChfYnl0ZU9mZnNldCA8IF9ieXRlcy5sZW5ndGgpIHsKICAgICAgaWYgKF9ieXRlT2Zmc2V0ICsgMyA8IF9ieXRlcy5sZW5ndGgpIHsKICAgICAgICBpbnQgbWFnaWMgPSByZWFkVWludDMyKCk7CiAgICAgICAgaWYgKG1hZ2ljID09IFRhZy5Db21wb25lbnRGaWxlKSB7CiAgICAgICAgICB0aHJvdyAnQ29uY2F0ZW5hdGVkIGNvbXBvbmVudCBmaWxlIGdpdmVuIHdoZW4gYSBzaW5nbGUgY29tcG9uZW50ICcKICAgICAgICAgICAgICAnd2FzIGV4cGVjdGVkLic7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRocm93ICdVbnJlY29nbml6ZWQgYnl0ZXMgZm9sbG93aW5nIGNvbXBvbmVudCBkYXRhJzsKICAgIH0KCiAgICBpZiAoY2hlY2tDYW5vbmljYWxOYW1lcykgewogICAgICBfY2hlY2tDYW5vbmljYWxOYW1lQ2hpbGRyZW4oY29tcG9uZW50LnJvb3QpOwogICAgfQogIH0KCiAgdm9pZCBfY2hlY2tDYW5vbmljYWxOYW1lQ2hpbGRyZW4oQ2Fub25pY2FsTmFtZSBwYXJlbnQpIHsKICAgIEl0ZXJhYmxlPENhbm9uaWNhbE5hbWU+IHBhcmVudENoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuT3JOdWxsOwogICAgaWYgKHBhcmVudENoaWxkcmVuICE9IG51bGwpIHsKICAgICAgZm9yIChDYW5vbmljYWxOYW1lIGNoaWxkIGluIHBhcmVudENoaWxkcmVuKSB7CiAgICAgICAgaWYgKGNoaWxkLm5hbWUgIT0gJ0BtZXRob2RzJyAmJgogICAgICAgICAgICBjaGlsZC5uYW1lICE9ICdAdHlwZWRlZnMnICYmCiAgICAgICAgICAgIGNoaWxkLm5hbWUgIT0gJ0BmaWVsZHMnICYmCiAgICAgICAgICAgIGNoaWxkLm5hbWUgIT0gJ0BnZXR0ZXJzJyAmJgogICAgICAgICAgICBjaGlsZC5uYW1lICE9ICdAc2V0dGVycycgJiYKICAgICAgICAgICAgY2hpbGQubmFtZSAhPSAnQGZhY3RvcmllcycgJiYKICAgICAgICAgICAgY2hpbGQubmFtZSAhPSAnQGNvbnN0cnVjdG9ycycpIHsKICAgICAgICAgIGJvb2wgY2hlY2tSZWZlcmVuY2VOb2RlID0gdHJ1ZTsKICAgICAgICAgIGlmIChjaGlsZC5yZWZlcmVuY2UgPT0gbnVsbCkgewogICAgICAgICAgICAvLyBPSyBmb3IgImlmIHByaXZhdGU6IFVSSSBvZiBsaWJyYXJ5IiBwYXJ0IG9mICJRdWFsaWZpZWQgbmFtZSIuLi4KICAgICAgICAgICAgSXRlcmFibGU8Q2Fub25pY2FsTmFtZT4gY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbk9yTnVsbDsKICAgICAgICAgICAgaWYgKHBhcmVudC5wYXJlbnQgIT0gbnVsbCAmJgogICAgICAgICAgICAgICAgY2hpbGRyZW4gIT0gbnVsbCAmJgogICAgICAgICAgICAgICAgY2hpbGRyZW4uaXNOb3RFbXB0eSAmJgogICAgICAgICAgICAgICAgY2hpbGRyZW4uZmlyc3QubmFtZS5zdGFydHNXaXRoKCJfIikpIHsKICAgICAgICAgICAgICAvLyBPSyB0aGVuLgogICAgICAgICAgICAgIGNoZWNrUmVmZXJlbmNlTm9kZSA9IGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRocm93IGJ1aWxkQ2Fub25pY2FsTmFtZUVycm9yKAogICAgICAgICAgICAgICAgICAiTnVsbCByZWZlcmVuY2UgKCR7Y2hpbGQubmFtZX0pICgkY2hpbGQpLiIsIGNoaWxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGNoZWNrUmVmZXJlbmNlTm9kZSkgewogICAgICAgICAgICBpZiAoY2hpbGQucmVmZXJlbmNlLmNhbm9uaWNhbE5hbWUgIT0gY2hpbGQpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2Fub25pY2FsTmFtZUVycm9yKAogICAgICAgICAgICAgICAgICAiQ2Fub25pY2FsIG5hbWUgYW5kIHJlZmVyZW5jZSBkb2Vzbid0IGFncmVlLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaGlsZC5yZWZlcmVuY2Uubm9kZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgdGhyb3cgYnVpbGRDYW5vbmljYWxOYW1lRXJyb3IoCiAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgaXMgbnVsbCAoJHtjaGlsZC5uYW1lfSkgKCRjaGlsZCkuIiwgY2hpbGQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9jaGVja0Nhbm9uaWNhbE5hbWVDaGlsZHJlbihjaGlsZCk7CiAgICAgIH0KICAgIH0KICB9CgogIENhbm9uaWNhbE5hbWVFcnJvciBidWlsZENhbm9uaWNhbE5hbWVFcnJvcigKICAgICAgU3RyaW5nIG1lc3NhZ2UsIENhbm9uaWNhbE5hbWUgcHJvYmxlbU5vZGUpIHsKICAgIC8vIFNwZWNpYWwtY2FzZSBtaXNzaW5nIHNkayBlbnRyaWVzIGFzIHRoYXQgaXMgcHJvYmFibHkgYSBjaGFuZ2UgdG8gdGhlCiAgICAvLyBwbGF0Zm9ybSAtIHRoYXQncyBzb21ldGhpbmcgd2UgbWlnaHQgd2FudCB0byByZWFjdCBkaWZmZXJlbnRseSB0by4KICAgIFN0cmluZyBsaWJyYXJ5VXJpID0gcHJvYmxlbU5vZGU/Lm5vblJvb3RUb3A/Lm5hbWUgPz8gIiI7CiAgICBpZiAobGlicmFyeVVyaS5zdGFydHNXaXRoKCJkYXJ0OiIpKSB7CiAgICAgIHJldHVybiBuZXcgQ2Fub25pY2FsTmFtZVNka0Vycm9yKG1lc3NhZ2UpOwogICAgfQogICAgcmV0dXJuIG5ldyBDYW5vbmljYWxOYW1lRXJyb3IobWVzc2FnZSk7CiAgfQoKICBfQ29tcG9uZW50SW5kZXggX3JlYWRDb21wb25lbnRJbmRleChpbnQgY29tcG9uZW50RmlsZVNpemUpIHsKICAgIGludCBzYXZlZEJ5dGVJbmRleCA9IF9ieXRlT2Zmc2V0OwoKICAgIF9Db21wb25lbnRJbmRleCByZXN1bHQgPSBuZXcgX0NvbXBvbmVudEluZGV4KCk7CgogICAgLy8gVGhlcmUgYXJlIHR3byBmaWVsZHM6IGZpbGUgc2l6ZSBhbmQgbGlicmFyeSBjb3VudC4KICAgIF9ieXRlT2Zmc2V0ID0gX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgY29tcG9uZW50RmlsZVNpemUgLSAoMikgKiA0OwogICAgcmVzdWx0LmxpYnJhcnlDb3VudCA9IHJlYWRVaW50MzIoKTsKICAgIC8vIExpYnJhcnkgb2Zmc2V0cyBhcmUgdXNlZCBmb3Igc3RhcnQgYW5kIGVuZCBvZmZzZXRzLCBzbyB0aGVyZSBpcyBvbmUgZXh0cmEKICAgIC8vIGVsZW1lbnQgdGhhdCB0aGlzIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSBsYXN0IGxpYnJhcnkKICAgIHJlc3VsdC5saWJyYXJ5T2Zmc2V0cyA9IG5ldyBMaXN0PGludD4ocmVzdWx0LmxpYnJhcnlDb3VudCArIDEpOwogICAgcmVzdWx0LmNvbXBvbmVudEZpbGVTaXplSW5CeXRlcyA9IHJlYWRVaW50MzIoKTsKICAgIGlmIChyZXN1bHQuY29tcG9uZW50RmlsZVNpemVJbkJ5dGVzICE9IGNvbXBvbmVudEZpbGVTaXplKSB7CiAgICAgIHRocm93ICdNYWxmb3JtZWQgYmluYXJ5OiBUaGlzIGNvbXBvbmVudCBmaWxlXCdzIGNvbXBvbmVudCBpbmRleCBpbmRpY2F0ZXMgdGhhdCcKICAgICAgICAgICcgdGhlIGZpbGVzaXplIHNob3VsZCBiZSAkY29tcG9uZW50RmlsZVNpemUgYnV0IG90aGVyIGNvbXBvbmVudCBpbmRleGVzJwogICAgICAgICAgJyBoYXMgaW5kaWNhdGVkIHRoYXQgdGhlIHNpemUgc2hvdWxkIGJlICcKICAgICAgICAgICcke3Jlc3VsdC5jb21wb25lbnRGaWxlU2l6ZUluQnl0ZXN9Lic7CiAgICB9CgogICAgLy8gU2tpcCB0byB0aGUgc3RhcnQgb2YgdGhlIGluZGV4LgogICAgX2J5dGVPZmZzZXQgLT0KICAgICAgICAoKHJlc3VsdC5saWJyYXJ5Q291bnQgKyAxKSArIF9Db21wb25lbnRJbmRleC5udW1iZXJPZkZpeGVkRmllbGRzKSAqIDQ7CgogICAgLy8gTm93IHJlYWQgdGhlIGNvbXBvbmVudCBpbmRleC4KICAgIHJlc3VsdC5iaW5hcnlPZmZzZXRGb3JTb3VyY2VUYWJsZSA9IF9jb21wb25lbnRTdGFydE9mZnNldCArIHJlYWRVaW50MzIoKTsKICAgIHJlc3VsdC5iaW5hcnlPZmZzZXRGb3JDYW5vbmljYWxOYW1lcyA9IF9jb21wb25lbnRTdGFydE9mZnNldCArIHJlYWRVaW50MzIoKTsKICAgIHJlc3VsdC5iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzID0KICAgICAgICBfY29tcG9uZW50U3RhcnRPZmZzZXQgKyByZWFkVWludDMyKCk7CiAgICByZXN1bHQuYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFNYXBwaW5ncyA9CiAgICAgICAgX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgcmVhZFVpbnQzMigpOwogICAgcmVzdWx0LmJpbmFyeU9mZnNldEZvclN0cmluZ1RhYmxlID0gX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgcmVhZFVpbnQzMigpOwogICAgcmVzdWx0LmJpbmFyeU9mZnNldEZvckNvbnN0YW50VGFibGUgPSBfY29tcG9uZW50U3RhcnRPZmZzZXQgKyByZWFkVWludDMyKCk7CiAgICByZXN1bHQubWFpbk1ldGhvZFJlZmVyZW5jZSA9IHJlYWRVaW50MzIoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LmxpYnJhcnlDb3VudCArIDE7ICsraSkgewogICAgICByZXN1bHQubGlicmFyeU9mZnNldHNbaV0gPSBfY29tcG9uZW50U3RhcnRPZmZzZXQgKyByZWFkVWludDMyKCk7CiAgICB9CgogICAgX2J5dGVPZmZzZXQgPSBzYXZlZEJ5dGVJbmRleDsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBfcmVhZE9uZUNvbXBvbmVudFNvdXJjZShDb21wb25lbnQgY29tcG9uZW50LCBpbnQgY29tcG9uZW50RmlsZVNpemUpIHsKICAgIF9jb21wb25lbnRTdGFydE9mZnNldCA9IF9ieXRlT2Zmc2V0OwoKICAgIGZpbmFsIGludCBtYWdpYyA9IHJlYWRVaW50MzIoKTsKICAgIGlmIChtYWdpYyAhPSBUYWcuQ29tcG9uZW50RmlsZSkgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCdOb3QgYSAuZGlsbCBmaWxlICh3cm9uZyBtYWdpYyBudW1iZXIpLicpOwogICAgfQoKICAgIGZpbmFsIGludCBmb3JtYXRWZXJzaW9uID0gcmVhZFVpbnQzMigpOwogICAgaWYgKGZvcm1hdFZlcnNpb24gIT0gVGFnLkJpbmFyeUZvcm1hdFZlcnNpb24pIHsKICAgICAgdGhyb3cgSW52YWxpZEtlcm5lbFZlcnNpb25FcnJvcihmb3JtYXRWZXJzaW9uKTsKICAgIH0KCiAgICAvLyBSZWFkIGNvbXBvbmVudCBpbmRleCBmcm9tIHRoZSBlbmQgb2YgdGhpcyBDb21wb25lbnRGaWxlcyBzZXJpYWxpemVkIGRhdGEuCiAgICBfQ29tcG9uZW50SW5kZXggaW5kZXggPSBfcmVhZENvbXBvbmVudEluZGV4KGNvbXBvbmVudEZpbGVTaXplKTsKCiAgICBfYnl0ZU9mZnNldCA9IGluZGV4LmJpbmFyeU9mZnNldEZvclNvdXJjZVRhYmxlOwogICAgTWFwPFVyaSwgU291cmNlPiB1cmlUb1NvdXJjZSA9IHJlYWRVcmlUb1NvdXJjZSgpOwogICAgY29tcG9uZW50LnVyaVRvU291cmNlLmFkZEFsbCh1cmlUb1NvdXJjZSk7CgogICAgX2J5dGVPZmZzZXQgPSBfY29tcG9uZW50U3RhcnRPZmZzZXQgKyBjb21wb25lbnRGaWxlU2l6ZTsKICB9CgogIHZvaWQgX3JlYWRPbmVDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwgaW50IGNvbXBvbmVudEZpbGVTaXplKSB7CiAgICBfY29tcG9uZW50U3RhcnRPZmZzZXQgPSBfYnl0ZU9mZnNldDsKCiAgICBmaW5hbCBpbnQgbWFnaWMgPSByZWFkVWludDMyKCk7CiAgICBpZiAobWFnaWMgIT0gVGFnLkNvbXBvbmVudEZpbGUpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcignTm90IGEgLmRpbGwgZmlsZSAod3JvbmcgbWFnaWMgbnVtYmVyKS4nKTsKICAgIH0KCiAgICBmaW5hbCBpbnQgZm9ybWF0VmVyc2lvbiA9IHJlYWRVaW50MzIoKTsKICAgIGlmIChmb3JtYXRWZXJzaW9uICE9IFRhZy5CaW5hcnlGb3JtYXRWZXJzaW9uKSB7CiAgICAgIHRocm93IEludmFsaWRLZXJuZWxWZXJzaW9uRXJyb3IoZm9ybWF0VmVyc2lvbik7CiAgICB9CgogICAgTGlzdDxTdHJpbmc+IHByb2JsZW1zQXNKc29uID0gcmVhZExpc3RPZlN0cmluZ3MoKTsKICAgIGlmIChwcm9ibGVtc0FzSnNvbiAhPSBudWxsKSB7CiAgICAgIGNvbXBvbmVudC5wcm9ibGVtc0FzSnNvbiA/Pz0gPFN0cmluZz5bXTsKICAgICAgY29tcG9uZW50LnByb2JsZW1zQXNKc29uLmFkZEFsbChwcm9ibGVtc0FzSnNvbik7CiAgICB9CgogICAgLy8gUmVhZCBjb21wb25lbnQgaW5kZXggZnJvbSB0aGUgZW5kIG9mIHRoaXMgQ29tcG9uZW50RmlsZXMgc2VyaWFsaXplZCBkYXRhLgogICAgX0NvbXBvbmVudEluZGV4IGluZGV4ID0gX3JlYWRDb21wb25lbnRJbmRleChjb21wb25lbnRGaWxlU2l6ZSk7CgogICAgX2J5dGVPZmZzZXQgPSBpbmRleC5iaW5hcnlPZmZzZXRGb3JTdHJpbmdUYWJsZTsKICAgIHJlYWRTdHJpbmdUYWJsZShfc3RyaW5nVGFibGUpOwoKICAgIF9ieXRlT2Zmc2V0ID0gaW5kZXguYmluYXJ5T2Zmc2V0Rm9yQ2Fub25pY2FsTmFtZXM7CiAgICByZWFkTGlua1RhYmxlKGNvbXBvbmVudC5yb290KTsKCiAgICAvLyBUT0RPKGFsZXhtYXJrb3YpOiByZXZlcnNlIG1ldGFkYXRhIG1hcHBpbmdzIGFuZCByZWFkIGZvcndhcmRzCiAgICBfYnl0ZU9mZnNldCA9IGluZGV4LmJpbmFyeU9mZnNldEZvclN0cmluZ1RhYmxlOyAvLyBSZWFkIGJhY2t3YXJkcy4KICAgIF9yZWFkTWV0YWRhdGFNYXBwaW5ncyhjb21wb25lbnQsIGluZGV4LmJpbmFyeU9mZnNldEZvck1ldGFkYXRhUGF5bG9hZHMpOwoKICAgIF9hc3NvY2lhdGVNZXRhZGF0YShjb21wb25lbnQsIF9jb21wb25lbnRTdGFydE9mZnNldCk7CgogICAgX2J5dGVPZmZzZXQgPSBpbmRleC5iaW5hcnlPZmZzZXRGb3JTb3VyY2VUYWJsZTsKICAgIE1hcDxVcmksIFNvdXJjZT4gdXJpVG9Tb3VyY2UgPSByZWFkVXJpVG9Tb3VyY2UoKTsKICAgIGNvbXBvbmVudC51cmlUb1NvdXJjZS5hZGRBbGwodXJpVG9Tb3VyY2UpOwoKICAgIF9ieXRlT2Zmc2V0ID0gaW5kZXguYmluYXJ5T2Zmc2V0Rm9yQ29uc3RhbnRUYWJsZTsKICAgIHJlYWRDb25zdGFudFRhYmxlKCk7CgogICAgaW50IG51bWJlck9mTGlicmFyaWVzID0gaW5kZXgubGlicmFyeUNvdW50OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkxpYnJhcmllczsgKytpKSB7CiAgICAgIF9ieXRlT2Zmc2V0ID0gaW5kZXgubGlicmFyeU9mZnNldHNbaV07CiAgICAgIHJlYWRMaWJyYXJ5KGNvbXBvbmVudCwgaW5kZXgubGlicmFyeU9mZnNldHNbaSArIDFdKTsKICAgIH0KCiAgICB2YXIgbWFpbk1ldGhvZCA9CiAgICAgICAgZ2V0TWVtYmVyUmVmZXJlbmNlRnJvbUludChpbmRleC5tYWluTWV0aG9kUmVmZXJlbmNlLCBhbGxvd051bGw6IHRydWUpOwogICAgY29tcG9uZW50Lm1haW5NZXRob2ROYW1lID8/PSBtYWluTWV0aG9kOwoKICAgIF9ieXRlT2Zmc2V0ID0gX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgY29tcG9uZW50RmlsZVNpemU7CiAgfQoKICAvLy8gUmVhZCBhIGxpc3Qgb2Ygc3RyaW5ncy4gSWYgdGhlIGxpc3QgaXMgZW1wdHksIFtudWxsXSBpcyByZXR1cm5lZC4KICBMaXN0PFN0cmluZz4gcmVhZExpc3RPZlN0cmluZ3MoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PFN0cmluZz4gc3RyaW5ncyA9CiAgICAgICAgbmV3IExpc3Q8U3RyaW5nPi5maWxsZWQobGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIFN0cmluZyBzID0gY29uc3QgVXRmOERlY29kZXIoKS5jb252ZXJ0KHJlYWRCeXRlTGlzdCgpKTsKICAgICAgc3RyaW5nc1tpXSA9IHM7CiAgICB9CiAgICByZXR1cm4gc3RyaW5nczsKICB9CgogIE1hcDxVcmksIFNvdXJjZT4gcmVhZFVyaVRvU291cmNlKCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVaW50MzIoKTsKCiAgICAvLyBSZWFkIGRhdGEuCiAgICBfc291cmNlVXJpVGFibGUubGVuZ3RoID0gbGVuZ3RoOwogICAgTWFwPFVyaSwgU291cmNlPiB1cmlUb1NvdXJjZSA9IDxVcmksIFNvdXJjZT57fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgTGlzdDxpbnQ+IHVyaUJ5dGVzID0gcmVhZEJ5dGVMaXN0KCk7CiAgICAgIFVyaSB1cmkgPSB1cmlCeXRlcy5pc0VtcHR5CiAgICAgICAgICA/IG51bGwKICAgICAgICAgIDogVXJpLnBhcnNlKGNvbnN0IFV0ZjhEZWNvZGVyKCkuY29udmVydCh1cmlCeXRlcykpOwogICAgICBfc291cmNlVXJpVGFibGVbaV0gPSB1cmk7CiAgICAgIExpc3Q8aW50PiBzb3VyY2VDb2RlID0gcmVhZEJ5dGVMaXN0KCk7CiAgICAgIGludCBsaW5lQ291bnQgPSByZWFkVUludCgpOwogICAgICBMaXN0PGludD4gbGluZVN0YXJ0cyA9IG5ldyBMaXN0PGludD4obGluZUNvdW50KTsKICAgICAgaW50IHByZXZpb3VzTGluZVN0YXJ0ID0gMDsKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsaW5lQ291bnQ7ICsraikgewogICAgICAgIGludCBsaW5lU3RhcnQgPSByZWFkVUludCgpICsgcHJldmlvdXNMaW5lU3RhcnQ7CiAgICAgICAgbGluZVN0YXJ0c1tqXSA9IGxpbmVTdGFydDsKICAgICAgICBwcmV2aW91c0xpbmVTdGFydCA9IGxpbmVTdGFydDsKICAgICAgfQogICAgICBMaXN0PGludD4gaW1wb3J0VXJpQnl0ZXMgPSByZWFkQnl0ZUxpc3QoKTsKICAgICAgVXJpIGltcG9ydFVyaSA9IGltcG9ydFVyaUJ5dGVzLmlzRW1wdHkKICAgICAgICAgID8gbnVsbAogICAgICAgICAgOiBVcmkucGFyc2UoY29uc3QgVXRmOERlY29kZXIoKS5jb252ZXJ0KGltcG9ydFVyaUJ5dGVzKSk7CiAgICAgIHVyaVRvU291cmNlW3VyaV0gPSBuZXcgU291cmNlKGxpbmVTdGFydHMsIHNvdXJjZUNvZGUsIGltcG9ydFVyaSwgdXJpKTsKICAgIH0KCiAgICAvLyBSZWFkIGluZGV4LgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZWFkVWludDMyKCk7CiAgICB9CiAgICByZXR1cm4gdXJpVG9Tb3VyY2U7CiAgfQoKICBDYW5vbmljYWxOYW1lIHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCkgewogICAgdmFyIGluZGV4ID0gcmVhZFVJbnQoKTsKICAgIGlmIChpbmRleCA9PSAwKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfbGlua1RhYmxlW2luZGV4IC0gMV07CiAgfQoKICBDYW5vbmljYWxOYW1lIGdldENhbm9uaWNhbE5hbWVSZWZlcmVuY2VGcm9tSW50KGludCBpbmRleCkgewogICAgaWYgKGluZGV4ID09IDApIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9saW5rVGFibGVbaW5kZXggLSAxXTsKICB9CgogIFJlZmVyZW5jZSByZWFkTGlicmFyeVJlZmVyZW5jZSh7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgQ2Fub25pY2FsTmFtZSBjYW5vbmljYWxOYW1lID0gcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKTsKICAgIGlmIChjYW5vbmljYWxOYW1lICE9IG51bGwpIHJldHVybiBjYW5vbmljYWxOYW1lLmdldFJlZmVyZW5jZSgpOwogICAgaWYgKGFsbG93TnVsbCkgcmV0dXJuIG51bGw7CiAgICB0aHJvdyAnRXhwZWN0ZWQgYSBsaWJyYXJ5IHJlZmVyZW5jZSB0byBiZSB2YWxpZCBidXQgd2FzIGBudWxsYC4nOwogIH0KCiAgTGlicmFyeURlcGVuZGVuY3kgcmVhZExpYnJhcnlEZXBlbmRlbmN5UmVmZXJlbmNlKCkgewogICAgaW50IGluZGV4ID0gcmVhZFVJbnQoKTsKICAgIHJldHVybiBfY3VycmVudExpYnJhcnkuZGVwZW5kZW5jaWVzW2luZGV4XTsKICB9CgogIFJlZmVyZW5jZSByZWFkQ2xhc3NSZWZlcmVuY2Uoe2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIHZhciBuYW1lID0gcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKTsKICAgIGlmIChuYW1lID09IG51bGwgJiYgIWFsbG93TnVsbCkgewogICAgICB0aHJvdyAnRXhwZWN0ZWQgYSBjbGFzcyByZWZlcmVuY2UgdG8gYmUgdmFsaWQgYnV0IHdhcyBgbnVsbGAuJzsKICAgIH0KICAgIHJldHVybiBuYW1lPy5nZXRSZWZlcmVuY2UoKTsKICB9CgogIFJlZmVyZW5jZSByZWFkTWVtYmVyUmVmZXJlbmNlKHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICB2YXIgbmFtZSA9IHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCk7CiAgICBpZiAobmFtZSA9PSBudWxsICYmICFhbGxvd051bGwpIHsKICAgICAgdGhyb3cgJ0V4cGVjdGVkIGEgbWVtYmVyIHJlZmVyZW5jZSB0byBiZSB2YWxpZCBidXQgd2FzIGBudWxsYC4nOwogICAgfQogICAgcmV0dXJuIG5hbWU/LmdldFJlZmVyZW5jZSgpOwogIH0KCiAgUmVmZXJlbmNlIGdldE1lbWJlclJlZmVyZW5jZUZyb21JbnQoaW50IGluZGV4LCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgdmFyIG5hbWUgPSBnZXRDYW5vbmljYWxOYW1lUmVmZXJlbmNlRnJvbUludChpbmRleCk7CiAgICBpZiAobmFtZSA9PSBudWxsICYmICFhbGxvd051bGwpIHsKICAgICAgdGhyb3cgJ0V4cGVjdGVkIGEgbWVtYmVyIHJlZmVyZW5jZSB0byBiZSB2YWxpZCBidXQgd2FzIGBudWxsYC4nOwogICAgfQogICAgcmV0dXJuIG5hbWU/LmdldFJlZmVyZW5jZSgpOwogIH0KCiAgUmVmZXJlbmNlIHJlYWRUeXBlZGVmUmVmZXJlbmNlKCkgewogICAgcmV0dXJuIHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCk/LmdldFJlZmVyZW5jZSgpOwogIH0KCiAgTmFtZSByZWFkTmFtZSgpIHsKICAgIFN0cmluZyB0ZXh0ID0gcmVhZFN0cmluZ1JlZmVyZW5jZSgpOwogICAgaWYgKHRleHQuaXNOb3RFbXB0eSAmJiB0ZXh0WzBdID09ICdfJykgewogICAgICByZXR1cm4gbmV3IE5hbWUuYnlSZWZlcmVuY2UodGV4dCwgcmVhZExpYnJhcnlSZWZlcmVuY2UoKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IE5hbWUodGV4dCk7CiAgICB9CiAgfQoKICBMaWJyYXJ5IHJlYWRMaWJyYXJ5KENvbXBvbmVudCBjb21wb25lbnQsIGludCBlbmRPZmZzZXQpIHsKICAgIC8vIFJlYWQgaW5kZXguCiAgICBpbnQgc2F2ZWRCeXRlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CgogICAgLy8gVGhlcmUgaXMgYSBmaWVsZCBmb3IgdGhlIHByb2NlZHVyZSBjb3VudC4KICAgIF9ieXRlT2Zmc2V0ID0gZW5kT2Zmc2V0IC0gKDEpICogNDsKICAgIGludCBwcm9jZWR1cmVDb3VudCA9IHJlYWRVaW50MzIoKTsKICAgIExpc3Q8aW50PiBwcm9jZWR1cmVPZmZzZXRzID0gbmV3IExpc3Q8aW50Pihwcm9jZWR1cmVDb3VudCArIDEpOwoKICAgIC8vIFRoZXJlIGlzIGEgZmllbGQgZm9yIHRoZSBwcm9jZWR1cmUgY291bnQsIHRoYXQgbnVtYmVyICsgMSAoZm9yIHRoZSBlbmQpCiAgICAvLyBvZmZzZXRzLCBhbmQgdGhlbiB0aGUgY2xhc3MgY291bnQgKGkuZS4gcHJvY2VkdXJlIGNvdW50ICsgMyBmaWVsZHMpLgogICAgX2J5dGVPZmZzZXQgPSBlbmRPZmZzZXQgLSAocHJvY2VkdXJlQ291bnQgKyAzKSAqIDQ7CiAgICBpbnQgY2xhc3NDb3VudCA9IHJlYWRVaW50MzIoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2VkdXJlQ291bnQgKyAxOyBpKyspIHsKICAgICAgcHJvY2VkdXJlT2Zmc2V0c1tpXSA9IF9jb21wb25lbnRTdGFydE9mZnNldCArIHJlYWRVaW50MzIoKTsKICAgIH0KICAgIExpc3Q8aW50PiBjbGFzc09mZnNldHMgPSBuZXcgTGlzdDxpbnQ+KGNsYXNzQ291bnQgKyAxKTsKCiAgICAvLyBUaGVyZSBpcyBhIGZpZWxkIGZvciB0aGUgcHJvY2VkdXJlIGNvdW50LCB0aGF0IG51bWJlciArIDEgKGZvciB0aGUgZW5kKQogICAgLy8gb2Zmc2V0cywgdGhlbiB0aGUgY2xhc3MgY291bnQgYW5kIHRoYXQgbnVtYmVyICsgMSAoZm9yIHRoZSBlbmQpIG9mZnNldHMuCiAgICAvLyAoaS5lLiBwcm9jZWR1cmUgY291bnQgKyBjbGFzcyBjb3VudCArIDQgZmllbGRzKS4KICAgIF9ieXRlT2Zmc2V0ID0gZW5kT2Zmc2V0IC0gKHByb2NlZHVyZUNvdW50ICsgY2xhc3NDb3VudCArIDQpICogNDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NDb3VudCArIDE7IGkrKykgewogICAgICBjbGFzc09mZnNldHNbaV0gPSBfY29tcG9uZW50U3RhcnRPZmZzZXQgKyByZWFkVWludDMyKCk7CiAgICB9CiAgICBfYnl0ZU9mZnNldCA9IHNhdmVkQnl0ZU9mZnNldDsKCiAgICBpbnQgZmxhZ3MgPSByZWFkQnl0ZSgpOwogICAgYm9vbCBpc0V4dGVybmFsID0gKGZsYWdzICYgTGlicmFyeS5FeHRlcm5hbEZsYWcpICE9IDA7CiAgICBfaXNSZWFkaW5nTGlicmFyeUltcGxlbWVudGF0aW9uID0gIWlzRXh0ZXJuYWw7CgogICAgLy8gVE9ETyhqZW5zaik6IEV2ZW50dWFsbHksIGxhbmd1YWdlIHZlcnNpb24gc2hvdWxkIGFsd2F5cyBiZSBzZXQuCiAgICBpbnQgbGFuZ3VhZ2VWZXJzaW9uTWFqb3IgPSByZWFkVUludCgpOwogICAgaW50IGxhbmd1YWdlVmVyc2lvbk1pbm9yID0gcmVhZFVJbnQoKTsKICAgIGlmIChsYW5ndWFnZVZlcnNpb25NYWpvciA9PSAwIHx8IGxhbmd1YWdlVmVyc2lvbk1pbm9yID09IDApIHsKICAgICAgbGFuZ3VhZ2VWZXJzaW9uTWFqb3IgPSBudWxsOwogICAgICBsYW5ndWFnZVZlcnNpb25NaW5vciA9IG51bGw7CiAgICB9CgogICAgdmFyIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBMaWJyYXJ5IGxpYnJhcnkgPSByZWZlcmVuY2Uubm9kZTsKICAgIGlmIChhbHdheXNDcmVhdGVOZXdOYW1lZE5vZGVzKSB7CiAgICAgIGxpYnJhcnkgPSBudWxsOwogICAgfQogICAgYm9vbCBzaG91bGRXcml0ZURhdGEgPSBsaWJyYXJ5ID09IG51bGwgfHwgX2lzUmVhZGluZ0xpYnJhcnlJbXBsZW1lbnRhdGlvbjsKICAgIGlmIChsaWJyYXJ5ID09IG51bGwpIHsKICAgICAgbGlicmFyeSA9CiAgICAgICAgICBuZXcgTGlicmFyeShVcmkucGFyc2UoY2Fub25pY2FsTmFtZS5uYW1lKSwgcmVmZXJlbmNlOiByZWZlcmVuY2UpOwogICAgICBjb21wb25lbnQubGlicmFyaWVzLmFkZChsaWJyYXJ5Li5wYXJlbnQgPSBjb21wb25lbnQpOwogICAgfQogICAgX2N1cnJlbnRMaWJyYXJ5ID0gbGlicmFyeTsKICAgIFN0cmluZyBuYW1lID0gcmVhZFN0cmluZ09yTnVsbElmRW1wdHkoKTsKCiAgICAvLyBUT0RPKGplbnNqKTogV2UgY3VycmVudGx5IHNhdmUgKGFsbW9zdCB0aGUgc2FtZSkgdXJpIHR3aWNlLgogICAgVXJpIGZpbGVVcmkgPSByZWFkVXJpUmVmZXJlbmNlKCk7CgogICAgTGlzdDxTdHJpbmc+IHByb2JsZW1zQXNKc29uID0gcmVhZExpc3RPZlN0cmluZ3MoKTsKCiAgICBpZiAoc2hvdWxkV3JpdGVEYXRhKSB7CiAgICAgIGxpYnJhcnkuZmxhZ3MgPSBmbGFnczsKICAgICAgbGlicmFyeS5sYW5ndWFnZVZlcnNpb25NYWpvciA9IGxhbmd1YWdlVmVyc2lvbk1ham9yOwogICAgICBsaWJyYXJ5Lmxhbmd1YWdlVmVyc2lvbk1pbm9yID0gbGFuZ3VhZ2VWZXJzaW9uTWlub3I7CiAgICAgIGxpYnJhcnkubmFtZSA9IG5hbWU7CiAgICAgIGxpYnJhcnkuZmlsZVVyaSA9IGZpbGVVcmk7CiAgICAgIGxpYnJhcnkucHJvYmxlbXNBc0pzb24gPSBwcm9ibGVtc0FzSnNvbjsKICAgIH0KCiAgICBhc3NlcnQoKCkgewogICAgICBkZWJ1Z1BhdGguYWRkKGxpYnJhcnkubmFtZSA/PyBsaWJyYXJ5LmltcG9ydFVyaT8udG9TdHJpbmcoKSA/PyAnbGlicmFyeScpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0oKSk7CgogICAgaWYgKHNob3VsZFdyaXRlRGF0YSkgewogICAgICBfZmlsbFRyZWVOb2RlTGlzdCgKICAgICAgICAgIGxpYnJhcnkuYW5ub3RhdGlvbnMsIChpbmRleCkgPT4gcmVhZEV4cHJlc3Npb24oKSwgbGlicmFyeSk7CiAgICB9IGVsc2UgewogICAgICBfc2tpcE5vZGVMaXN0KHJlYWRFeHByZXNzaW9uKTsKICAgIH0KICAgIF9yZWFkTGlicmFyeURlcGVuZGVuY2llcyhsaWJyYXJ5KTsKICAgIF9yZWFkQWRkaXRpb25hbEV4cG9ydHMobGlicmFyeSk7CiAgICBfcmVhZExpYnJhcnlQYXJ0cyhsaWJyYXJ5KTsKICAgIF9tZXJnZU5hbWVkTm9kZUxpc3QobGlicmFyeS50eXBlZGVmcywgKGluZGV4KSA9PiByZWFkVHlwZWRlZigpLCBsaWJyYXJ5KTsKCiAgICBfbWVyZ2VOYW1lZE5vZGVMaXN0KGxpYnJhcnkuY2xhc3NlcywgKGluZGV4KSB7CiAgICAgIF9ieXRlT2Zmc2V0ID0gY2xhc3NPZmZzZXRzW2luZGV4XTsKICAgICAgcmV0dXJuIHJlYWRDbGFzcyhjbGFzc09mZnNldHNbaW5kZXggKyAxXSk7CiAgICB9LCBsaWJyYXJ5KTsKICAgIF9ieXRlT2Zmc2V0ID0gY2xhc3NPZmZzZXRzLmxhc3Q7CiAgICBfbWVyZ2VOYW1lZE5vZGVMaXN0KGxpYnJhcnkuZmllbGRzLCAoaW5kZXgpID0+IHJlYWRGaWVsZCgpLCBsaWJyYXJ5KTsKICAgIF9tZXJnZU5hbWVkTm9kZUxpc3QobGlicmFyeS5wcm9jZWR1cmVzLCAoaW5kZXgpIHsKICAgICAgX2J5dGVPZmZzZXQgPSBwcm9jZWR1cmVPZmZzZXRzW2luZGV4XTsKICAgICAgcmV0dXJuIHJlYWRQcm9jZWR1cmUocHJvY2VkdXJlT2Zmc2V0c1tpbmRleCArIDFdKTsKICAgIH0sIGxpYnJhcnkpOwogICAgX2J5dGVPZmZzZXQgPSBwcm9jZWR1cmVPZmZzZXRzLmxhc3Q7CgogICAgYXNzZXJ0KCgoXykgPT4gdHJ1ZSkoZGVidWdQYXRoLnJlbW92ZUxhc3QoKSkpOwogICAgX2N1cnJlbnRMaWJyYXJ5ID0gbnVsbDsKICAgIHJldHVybiBsaWJyYXJ5OwogIH0KCiAgdm9pZCBfcmVhZExpYnJhcnlEZXBlbmRlbmNpZXMoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIGxpYnJhcnkuZGVwZW5kZW5jaWVzLmxlbmd0aCA9IGxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgbGlicmFyeS5kZXBlbmRlbmNpZXNbaV0gPSByZWFkTGlicmFyeURlcGVuZGVuY3kobGlicmFyeSk7CiAgICB9CiAgfQoKICBMaWJyYXJ5RGVwZW5kZW5jeSByZWFkTGlicmFyeURlcGVuZGVuY3koTGlicmFyeSBsaWJyYXJ5KSB7CiAgICB2YXIgZmlsZU9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIHZhciBmbGFncyA9IHJlYWRCeXRlKCk7CiAgICB2YXIgYW5ub3RhdGlvbnMgPSByZWFkRXhwcmVzc2lvbkxpc3QoKTsKICAgIHZhciB0YXJnZXRMaWJyYXJ5ID0gcmVhZExpYnJhcnlSZWZlcmVuY2UoYWxsb3dOdWxsOiB0cnVlKTsKICAgIHZhciBwcmVmaXhOYW1lID0gcmVhZFN0cmluZ09yTnVsbElmRW1wdHkoKTsKICAgIHZhciBuYW1lcyA9IHJlYWRDb21iaW5hdG9yTGlzdCgpOwogICAgcmV0dXJuIG5ldyBMaWJyYXJ5RGVwZW5kZW5jeS5ieVJlZmVyZW5jZSgKICAgICAgICBmbGFncywgYW5ub3RhdGlvbnMsIHRhcmdldExpYnJhcnksIHByZWZpeE5hbWUsIG5hbWVzKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0CiAgICAgIC4ucGFyZW50ID0gbGlicmFyeTsKICB9CgogIHZvaWQgX3JlYWRBZGRpdGlvbmFsRXhwb3J0cyhMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIGludCBudW1FeHBvcnRlZFJlZmVyZW5jZSA9IHJlYWRVSW50KCk7CiAgICBpZiAobnVtRXhwb3J0ZWRSZWZlcmVuY2UgIT0gMCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUV4cG9ydGVkUmVmZXJlbmNlOyBpKyspIHsKICAgICAgICBDYW5vbmljYWxOYW1lIGV4cG9ydGVkTmFtZSA9IHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCk7CiAgICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGV4cG9ydGVkTmFtZS5nZXRSZWZlcmVuY2UoKTsKICAgICAgICBsaWJyYXJ5LmFkZGl0aW9uYWxFeHBvcnRzLmFkZChyZWZlcmVuY2UpOwogICAgICB9CiAgICB9CiAgfQoKICBDb21iaW5hdG9yIHJlYWRDb21iaW5hdG9yKCkgewogICAgdmFyIGlzU2hvdyA9IHJlYWRCeXRlKCkgPT0gMTsKICAgIHZhciBuYW1lcyA9IHJlYWRTdHJpbmdSZWZlcmVuY2VMaXN0KCk7CiAgICByZXR1cm4gbmV3IENvbWJpbmF0b3IoaXNTaG93LCBuYW1lcyk7CiAgfQoKICBMaXN0PENvbWJpbmF0b3I+IHJlYWRDb21iaW5hdG9yTGlzdCgpIHsKICAgIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgTGlzdDxDb21iaW5hdG9yPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PENvbWJpbmF0b3I+LmZpbGxlZChsZW5ndGgsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gcmVhZENvbWJpbmF0b3IoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIF9yZWFkTGlicmFyeVBhcnRzKExpYnJhcnkgbGlicmFyeSkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBsaWJyYXJ5LnBhcnRzLmxlbmd0aCA9IGxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgbGlicmFyeS5wYXJ0c1tpXSA9IHJlYWRMaWJyYXJ5UGFydChsaWJyYXJ5KTsKICAgIH0KICB9CgogIExpYnJhcnlQYXJ0IHJlYWRMaWJyYXJ5UGFydChMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSByZWFkRXhwcmVzc2lvbkxpc3QoKTsKICAgIFN0cmluZyBwYXJ0VXJpID0gcmVhZFN0cmluZ1JlZmVyZW5jZSgpOwogICAgcmV0dXJuIG5ldyBMaWJyYXJ5UGFydChhbm5vdGF0aW9ucywgcGFydFVyaSkuLnBhcmVudCA9IGxpYnJhcnk7CiAgfQoKICBUeXBlZGVmIHJlYWRUeXBlZGVmKCkgewogICAgdmFyIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgdmFyIHJlZmVyZW5jZSA9IGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBUeXBlZGVmIG5vZGUgPSByZWZlcmVuY2Uubm9kZTsKICAgIGlmIChhbHdheXNDcmVhdGVOZXdOYW1lZE5vZGVzKSB7CiAgICAgIG5vZGUgPSBudWxsOwogICAgfQogICAgYm9vbCBzaG91bGRXcml0ZURhdGEgPSBub2RlID09IG51bGwgfHwgX2lzUmVhZGluZ0xpYnJhcnlJbXBsZW1lbnRhdGlvbjsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgbm9kZSA9IG5ldyBUeXBlZGVmKG51bGwsIG51bGwsIHJlZmVyZW5jZTogcmVmZXJlbmNlKTsKICAgIH0KICAgIFVyaSBmaWxlVXJpID0gcmVhZFVyaVJlZmVyZW5jZSgpOwogICAgaW50IGZpbGVPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICBTdHJpbmcgbmFtZSA9IHJlYWRTdHJpbmdSZWZlcmVuY2UoKTsKICAgIG5vZGUuYW5ub3RhdGlvbnMgPSByZWFkQW5ub3RhdGlvbkxpc3Qobm9kZSk7CiAgICByZWFkQW5kUHVzaFR5cGVQYXJhbWV0ZXJMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMsIG5vZGUpOwogICAgdmFyIHR5cGUgPSByZWFkRGFydFR5cGUoKTsKICAgIHJlYWRBbmRQdXNoVHlwZVBhcmFtZXRlckxpc3Qobm9kZS50eXBlUGFyYW1ldGVyc09mRnVuY3Rpb25UeXBlLCBub2RlKTsKICAgIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMuYWRkQWxsKHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoKSk7CiAgICBub2RlLm5hbWVkUGFyYW1ldGVycy5hZGRBbGwocmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpKTsKICAgIHR5cGVQYXJhbWV0ZXJTdGFjay5sZW5ndGggPSAwOwogICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSAwOwogICAgaWYgKHNob3VsZFdyaXRlRGF0YSkgewogICAgICBub2RlLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICBub2RlLm5hbWUgPSBuYW1lOwogICAgICBub2RlLmZpbGVVcmkgPSBmaWxlVXJpOwogICAgICBub2RlLnR5cGUgPSB0eXBlOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBDbGFzcyByZWFkQ2xhc3MoaW50IGVuZE9mZnNldCkgewogICAgaW50IHRhZyA9IHJlYWRCeXRlKCk7CiAgICBhc3NlcnQodGFnID09IFRhZy5DbGFzcyk7CgogICAgLy8gUmVhZCBpbmRleC4KICAgIGludCBzYXZlZEJ5dGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIC8vIFRoZXJlIGlzIGEgZmllbGQgZm9yIHRoZSBwcm9jZWR1cmUgY291bnQuCiAgICBfYnl0ZU9mZnNldCA9IGVuZE9mZnNldCAtICgxKSAqIDQ7CiAgICBpbnQgcHJvY2VkdXJlQ291bnQgPSByZWFkVWludDMyKCk7CiAgICBMaXN0PGludD4gcHJvY2VkdXJlT2Zmc2V0cyA9IG5ldyBMaXN0PGludD4ocHJvY2VkdXJlQ291bnQgKyAxKTsKICAgIC8vIFRoZXJlIGlzIGEgZmllbGQgZm9yIHRoZSBwcm9jZWR1cmUgY291bnQsIHRoYXQgbnVtYmVyICsgMSAoZm9yIHRoZSBlbmQpCiAgICAvLyBvZmZzZXRzIChpLmUuIHByb2NlZHVyZSBjb3VudCArIDIgZmllbGRzKS4KICAgIF9ieXRlT2Zmc2V0ID0gZW5kT2Zmc2V0IC0gKHByb2NlZHVyZUNvdW50ICsgMikgKiA0OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZWR1cmVDb3VudCArIDE7IGkrKykgewogICAgICBwcm9jZWR1cmVPZmZzZXRzW2ldID0gX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgcmVhZFVpbnQzMigpOwogICAgfQogICAgX2J5dGVPZmZzZXQgPSBzYXZlZEJ5dGVPZmZzZXQ7CgogICAgdmFyIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgdmFyIHJlZmVyZW5jZSA9IGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBDbGFzcyBub2RlID0gcmVmZXJlbmNlLm5vZGU7CiAgICBpZiAoYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2RlcykgewogICAgICBub2RlID0gbnVsbDsKICAgIH0KICAgIGJvb2wgc2hvdWxkV3JpdGVEYXRhID0gbm9kZSA9PSBudWxsIHx8IF9pc1JlYWRpbmdMaWJyYXJ5SW1wbGVtZW50YXRpb247CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIG5vZGUgPSBuZXcgQ2xhc3MocmVmZXJlbmNlOiByZWZlcmVuY2UpLi5sZXZlbCA9IENsYXNzTGV2ZWwuVGVtcG9yYXJ5OwogICAgfQoKICAgIHZhciBmaWxlVXJpID0gcmVhZFVyaVJlZmVyZW5jZSgpOwogICAgbm9kZS5zdGFydEZpbGVPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICBub2RlLmZpbGVPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICBub2RlLmZpbGVFbmRPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICBpbnQgZmxhZ3MgPSByZWFkQnl0ZSgpOwogICAgbm9kZS5mbGFncyA9IGZsYWdzICYgfkNsYXNzLkxldmVsTWFzazsKICAgIGludCBsZXZlbEluZGV4ID0gZmxhZ3MgJiBDbGFzcy5MZXZlbE1hc2s7CiAgICB2YXIgbGV2ZWwgPSBDbGFzc0xldmVsLnZhbHVlc1tsZXZlbEluZGV4ICsgMV07CiAgICBpZiAobGV2ZWwuaW5kZXggPj0gbm9kZS5sZXZlbC5pbmRleCkgewogICAgICBub2RlLmxldmVsID0gbGV2ZWw7CiAgICB9CiAgICB2YXIgbmFtZSA9IHJlYWRTdHJpbmdPck51bGxJZkVtcHR5KCk7CiAgICB2YXIgYW5ub3RhdGlvbnMgPSByZWFkQW5ub3RhdGlvbkxpc3Qobm9kZSk7CiAgICBhc3NlcnQoKCkgewogICAgICBkZWJ1Z1BhdGguYWRkKG5vZGUubmFtZSA/PyAnbm9ybWFsLWNsYXNzJyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSgpKTsKICAgIHJlYWRBbmRQdXNoVHlwZVBhcmFtZXRlckxpc3Qobm9kZS50eXBlUGFyYW1ldGVycywgbm9kZSk7CiAgICB2YXIgc3VwZXJ0eXBlID0gcmVhZFN1cGVydHlwZU9wdGlvbigpOwogICAgdmFyIG1peGVkSW5UeXBlID0gcmVhZFN1cGVydHlwZU9wdGlvbigpOwogICAgaWYgKHNob3VsZFdyaXRlRGF0YSkgewogICAgICBfZmlsbE5vblRyZWVOb2RlTGlzdChub2RlLmltcGxlbWVudGVkVHlwZXMsIHJlYWRTdXBlcnR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgX3NraXBOb2RlTGlzdChyZWFkU3VwZXJ0eXBlKTsKICAgIH0KICAgIF9tZXJnZU5hbWVkTm9kZUxpc3Qobm9kZS5maWVsZHMsIChpbmRleCkgPT4gcmVhZEZpZWxkKCksIG5vZGUpOwogICAgX21lcmdlTmFtZWROb2RlTGlzdChub2RlLmNvbnN0cnVjdG9ycywgKGluZGV4KSA9PiByZWFkQ29uc3RydWN0b3IoKSwgbm9kZSk7CgogICAgX21lcmdlTmFtZWROb2RlTGlzdChub2RlLnByb2NlZHVyZXMsIChpbmRleCkgewogICAgICBfYnl0ZU9mZnNldCA9IHByb2NlZHVyZU9mZnNldHNbaW5kZXhdOwogICAgICByZXR1cm4gcmVhZFByb2NlZHVyZShwcm9jZWR1cmVPZmZzZXRzW2luZGV4ICsgMV0pOwogICAgfSwgbm9kZSk7CiAgICBfYnl0ZU9mZnNldCA9IHByb2NlZHVyZU9mZnNldHMubGFzdDsKICAgIF9tZXJnZU5hbWVkTm9kZUxpc3Qobm9kZS5yZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMsCiAgICAgICAgKGluZGV4KSA9PiByZWFkUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IoKSwgbm9kZSk7CiAgICB0eXBlUGFyYW1ldGVyU3RhY2subGVuZ3RoID0gMDsKICAgIGFzc2VydChkZWJ1Z1BhdGgucmVtb3ZlTGFzdCgpICE9IG51bGwpOwogICAgaWYgKHNob3VsZFdyaXRlRGF0YSkgewogICAgICBub2RlLm5hbWUgPSBuYW1lOwogICAgICBub2RlLmZpbGVVcmkgPSBmaWxlVXJpOwogICAgICBub2RlLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CiAgICAgIG5vZGUuc3VwZXJ0eXBlID0gc3VwZXJ0eXBlOwogICAgICBub2RlLm1peGVkSW5UeXBlID0gbWl4ZWRJblR5cGU7CiAgICB9CgogICAgX2J5dGVPZmZzZXQgPSBlbmRPZmZzZXQ7CgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBpbnQgZ2V0QW5kUmVzZXRUcmFuc2Zvcm1lckZsYWdzKCkgewogICAgaW50IGZsYWdzID0gX3RyYW5zZm9ybWVyRmxhZ3M7CiAgICBfdHJhbnNmb3JtZXJGbGFncyA9IDA7CiAgICByZXR1cm4gZmxhZ3M7CiAgfQoKICAvLy8gQWRkcyB0aGUgZ2l2ZW4gZmxhZyB0byB0aGUgY3VycmVudCBbTWVtYmVyLnRyYW5zZm9ybWVyRmxhZ3NdLgogIHZvaWQgYWRkVHJhbnNmb3JtZXJGbGFnKGludCBmbGFncykgewogICAgX3RyYW5zZm9ybWVyRmxhZ3MgfD0gZmxhZ3M7CiAgfQoKICBGaWVsZCByZWFkRmllbGQoKSB7CiAgICBpbnQgdGFnID0gcmVhZEJ5dGUoKTsKICAgIGFzc2VydCh0YWcgPT0gVGFnLkZpZWxkKTsKICAgIHZhciBjYW5vbmljYWxOYW1lID0gcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKTsKICAgIHZhciByZWZlcmVuY2UgPSBjYW5vbmljYWxOYW1lLmdldFJlZmVyZW5jZSgpOwogICAgRmllbGQgbm9kZSA9IHJlZmVyZW5jZS5ub2RlOwogICAgaWYgKGFsd2F5c0NyZWF0ZU5ld05hbWVkTm9kZXMpIHsKICAgICAgbm9kZSA9IG51bGw7CiAgICB9CiAgICBib29sIHNob3VsZFdyaXRlRGF0YSA9IG5vZGUgPT0gbnVsbCB8fCBfaXNSZWFkaW5nTGlicmFyeUltcGxlbWVudGF0aW9uOwogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICBub2RlID0gbmV3IEZpZWxkKG51bGwsIHJlZmVyZW5jZTogcmVmZXJlbmNlKTsKICAgIH0KICAgIHZhciBmaWxlVXJpID0gcmVhZFVyaVJlZmVyZW5jZSgpOwogICAgaW50IGZpbGVPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICBpbnQgZmlsZUVuZE9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIGludCBmbGFncyA9IHJlYWRCeXRlKCk7CiAgICB2YXIgbmFtZSA9IHJlYWROYW1lKCk7CiAgICB2YXIgYW5ub3RhdGlvbnMgPSByZWFkQW5ub3RhdGlvbkxpc3Qobm9kZSk7CiAgICBhc3NlcnQoKCkgewogICAgICBkZWJ1Z1BhdGguYWRkKG5vZGUubmFtZT8ubmFtZSA/PyAnZmllbGQnKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KCkpOwogICAgdmFyIHR5cGUgPSByZWFkRGFydFR5cGUoKTsKICAgIHZhciBpbml0aWFsaXplciA9IHJlYWRFeHByZXNzaW9uT3B0aW9uKCk7CiAgICBpbnQgdHJhbnNmb3JtZXJGbGFncyA9IGdldEFuZFJlc2V0VHJhbnNmb3JtZXJGbGFncygpOwogICAgYXNzZXJ0KCgoXykgPT4gdHJ1ZSkoZGVidWdQYXRoLnJlbW92ZUxhc3QoKSkpOwogICAgaWYgKHNob3VsZFdyaXRlRGF0YSkgewogICAgICBub2RlLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICBub2RlLmZpbGVFbmRPZmZzZXQgPSBmaWxlRW5kT2Zmc2V0OwogICAgICBub2RlLmZsYWdzID0gZmxhZ3M7CiAgICAgIG5vZGUubmFtZSA9IG5hbWU7CiAgICAgIG5vZGUuZmlsZVVyaSA9IGZpbGVVcmk7CiAgICAgIG5vZGUuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKICAgICAgbm9kZS50eXBlID0gdHlwZTsKICAgICAgbm9kZS5pbml0aWFsaXplciA9IGluaXRpYWxpemVyOwogICAgICBub2RlLmluaXRpYWxpemVyPy5wYXJlbnQgPSBub2RlOwogICAgICBub2RlLnRyYW5zZm9ybWVyRmxhZ3MgPSB0cmFuc2Zvcm1lckZsYWdzOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBDb25zdHJ1Y3RvciByZWFkQ29uc3RydWN0b3IoKSB7CiAgICBpbnQgdGFnID0gcmVhZEJ5dGUoKTsKICAgIGFzc2VydCh0YWcgPT0gVGFnLkNvbnN0cnVjdG9yKTsKICAgIHZhciBjYW5vbmljYWxOYW1lID0gcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKTsKICAgIHZhciByZWZlcmVuY2UgPSBjYW5vbmljYWxOYW1lLmdldFJlZmVyZW5jZSgpOwogICAgQ29uc3RydWN0b3Igbm9kZSA9IHJlZmVyZW5jZS5ub2RlOwogICAgaWYgKGFsd2F5c0NyZWF0ZU5ld05hbWVkTm9kZXMpIHsKICAgICAgbm9kZSA9IG51bGw7CiAgICB9CiAgICBib29sIHNob3VsZFdyaXRlRGF0YSA9IG5vZGUgPT0gbnVsbCB8fCBfaXNSZWFkaW5nTGlicmFyeUltcGxlbWVudGF0aW9uOwogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICBub2RlID0gbmV3IENvbnN0cnVjdG9yKG51bGwsIHJlZmVyZW5jZTogcmVmZXJlbmNlKTsKICAgIH0KICAgIHZhciBmaWxlVXJpID0gcmVhZFVyaVJlZmVyZW5jZSgpOwogICAgdmFyIHN0YXJ0RmlsZU9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIHZhciBmaWxlT2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgdmFyIGZpbGVFbmRPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICB2YXIgZmxhZ3MgPSByZWFkQnl0ZSgpOwogICAgdmFyIG5hbWUgPSByZWFkTmFtZSgpOwogICAgdmFyIGFubm90YXRpb25zID0gcmVhZEFubm90YXRpb25MaXN0KG5vZGUpOwogICAgYXNzZXJ0KCgpIHsKICAgICAgZGVidWdQYXRoLmFkZChub2RlLm5hbWU/Lm5hbWUgPz8gJ2NvbnN0cnVjdG9yJyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSgpKTsKICAgIHZhciBmdW5jdGlvbiA9IHJlYWRGdW5jdGlvbk5vZGUoKTsKICAgIHB1c2hWYXJpYWJsZURlY2xhcmF0aW9ucyhmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycyk7CiAgICBwdXNoVmFyaWFibGVEZWNsYXJhdGlvbnMoZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKTsKICAgIGlmIChzaG91bGRXcml0ZURhdGEpIHsKICAgICAgX2ZpbGxUcmVlTm9kZUxpc3Qobm9kZS5pbml0aWFsaXplcnMsIChpbmRleCkgPT4gcmVhZEluaXRpYWxpemVyKCksIG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgX3NraXBOb2RlTGlzdChyZWFkSW5pdGlhbGl6ZXIpOwogICAgfQogICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSAwOwogICAgdmFyIHRyYW5zZm9ybWVyRmxhZ3MgPSBnZXRBbmRSZXNldFRyYW5zZm9ybWVyRmxhZ3MoKTsKICAgIGFzc2VydCgoKF8pID0+IHRydWUpKGRlYnVnUGF0aC5yZW1vdmVMYXN0KCkpKTsKICAgIGlmIChzaG91bGRXcml0ZURhdGEpIHsKICAgICAgbm9kZS5zdGFydEZpbGVPZmZzZXQgPSBzdGFydEZpbGVPZmZzZXQ7CiAgICAgIG5vZGUuZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgIG5vZGUuZmlsZUVuZE9mZnNldCA9IGZpbGVFbmRPZmZzZXQ7CiAgICAgIG5vZGUuZmxhZ3MgPSBmbGFnczsKICAgICAgbm9kZS5uYW1lID0gbmFtZTsKICAgICAgbm9kZS5maWxlVXJpID0gZmlsZVVyaTsKICAgICAgbm9kZS5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOwogICAgICBub2RlLmZ1bmN0aW9uID0gZnVuY3Rpb24uLnBhcmVudCA9IG5vZGU7CiAgICAgIG5vZGUudHJhbnNmb3JtZXJGbGFncyA9IHRyYW5zZm9ybWVyRmxhZ3M7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIFByb2NlZHVyZSByZWFkUHJvY2VkdXJlKGludCBlbmRPZmZzZXQpIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgYXNzZXJ0KHRhZyA9PSBUYWcuUHJvY2VkdXJlKTsKICAgIHZhciBjYW5vbmljYWxOYW1lID0gcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKTsKICAgIHZhciByZWZlcmVuY2UgPSBjYW5vbmljYWxOYW1lLmdldFJlZmVyZW5jZSgpOwogICAgUHJvY2VkdXJlIG5vZGUgPSByZWZlcmVuY2Uubm9kZTsKICAgIGlmIChhbHdheXNDcmVhdGVOZXdOYW1lZE5vZGVzKSB7CiAgICAgIG5vZGUgPSBudWxsOwogICAgfQogICAgYm9vbCBzaG91bGRXcml0ZURhdGEgPSBub2RlID09IG51bGwgfHwgX2lzUmVhZGluZ0xpYnJhcnlJbXBsZW1lbnRhdGlvbjsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgbm9kZSA9IG5ldyBQcm9jZWR1cmUobnVsbCwgbnVsbCwgbnVsbCwgcmVmZXJlbmNlOiByZWZlcmVuY2UpOwogICAgfQogICAgdmFyIGZpbGVVcmkgPSByZWFkVXJpUmVmZXJlbmNlKCk7CiAgICB2YXIgc3RhcnRGaWxlT2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgdmFyIGZpbGVPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICB2YXIgZmlsZUVuZE9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIGludCBraW5kSW5kZXggPSByZWFkQnl0ZSgpOwogICAgdmFyIGtpbmQgPSBQcm9jZWR1cmVLaW5kLnZhbHVlc1traW5kSW5kZXhdOwogICAgdmFyIGZsYWdzID0gcmVhZEJ5dGUoKTsKICAgIHZhciBuYW1lID0gcmVhZE5hbWUoKTsKICAgIHZhciBhbm5vdGF0aW9ucyA9IHJlYWRBbm5vdGF0aW9uTGlzdChub2RlKTsKICAgIGFzc2VydCgoKSB7CiAgICAgIGRlYnVnUGF0aC5hZGQobm9kZS5uYW1lPy5uYW1lID8/ICdwcm9jZWR1cmUnKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KCkpOwogICAgaW50IGZ1bmN0aW9uTm9kZVNpemUgPSBlbmRPZmZzZXQgLSBfYnl0ZU9mZnNldDsKICAgIC8vIFJlYWQgc21hbGwgZmFjdG9yaWVzIHVwIGZyb250LiBQb3N0cG9uZSBldmVyeXRoaW5nIGVsc2UuCiAgICBib29sIHJlYWRGdW5jdGlvbk5vZGVOb3cgPQogICAgICAgIChraW5kID09IFByb2NlZHVyZUtpbmQuRmFjdG9yeSAmJiBmdW5jdGlvbk5vZGVTaXplIDw9IDUwKSB8fAogICAgICAgICAgICBfZGlzYWJsZUxhenlSZWFkaW5nOwogICAgdmFyIGZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRSZWZlcmVuY2UgPQogICAgICAgIHJlYWRNZW1iZXJSZWZlcmVuY2UoYWxsb3dOdWxsOiB0cnVlKTsKICAgIHZhciBmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldFJlZmVyZW5jZSA9CiAgICAgICAgcmVhZE1lbWJlclJlZmVyZW5jZShhbGxvd051bGw6IHRydWUpOwogICAgdmFyIGZ1bmN0aW9uID0gcmVhZEZ1bmN0aW9uTm9kZU9wdGlvbighcmVhZEZ1bmN0aW9uTm9kZU5vdywgZW5kT2Zmc2V0KTsKICAgIHZhciB0cmFuc2Zvcm1lckZsYWdzID0gZ2V0QW5kUmVzZXRUcmFuc2Zvcm1lckZsYWdzKCk7CiAgICBhc3NlcnQoKChfKSA9PiB0cnVlKShkZWJ1Z1BhdGgucmVtb3ZlTGFzdCgpKSk7CiAgICBpZiAoc2hvdWxkV3JpdGVEYXRhKSB7CiAgICAgIG5vZGUuc3RhcnRGaWxlT2Zmc2V0ID0gc3RhcnRGaWxlT2Zmc2V0OwogICAgICBub2RlLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICBub2RlLmZpbGVFbmRPZmZzZXQgPSBmaWxlRW5kT2Zmc2V0OwogICAgICBub2RlLmtpbmQgPSBraW5kOwogICAgICBub2RlLmZsYWdzID0gZmxhZ3M7CiAgICAgIG5vZGUubmFtZSA9IG5hbWU7CiAgICAgIG5vZGUuZmlsZVVyaSA9IGZpbGVVcmk7CiAgICAgIG5vZGUuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKICAgICAgbm9kZS5mdW5jdGlvbiA9IGZ1bmN0aW9uOwogICAgICBmdW5jdGlvbj8ucGFyZW50ID0gbm9kZTsKICAgICAgbm9kZS5zZXRUcmFuc2Zvcm1lckZsYWdzV2l0aG91dExhenlMb2FkaW5nKHRyYW5zZm9ybWVyRmxhZ3MpOwogICAgICBub2RlLmZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRSZWZlcmVuY2UgPQogICAgICAgICAgZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldFJlZmVyZW5jZTsKICAgICAgbm9kZS5mb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldFJlZmVyZW5jZSA9CiAgICAgICAgICBmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldFJlZmVyZW5jZTsKCiAgICAgIGFzc2VydCgobm9kZS5mb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlICE9IG51bGwpIHx8CiAgICAgICAgICAhKG5vZGUuaXNGb3J3YXJkaW5nU3R1YiAmJiBub2RlLmZ1bmN0aW9uLmJvZHkgIT0gbnVsbCkpOwogICAgfQogICAgX2J5dGVPZmZzZXQgPSBlbmRPZmZzZXQ7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIHJlYWRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcigpIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgYXNzZXJ0KHRhZyA9PSBUYWcuUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IpOwogICAgdmFyIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgdmFyIHJlZmVyZW5jZSA9IGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciBub2RlID0gcmVmZXJlbmNlLm5vZGU7CiAgICBpZiAoYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2RlcykgewogICAgICBub2RlID0gbnVsbDsKICAgIH0KICAgIGJvb2wgc2hvdWxkV3JpdGVEYXRhID0gbm9kZSA9PSBudWxsIHx8IF9pc1JlYWRpbmdMaWJyYXJ5SW1wbGVtZW50YXRpb247CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIG5vZGUgPSBuZXcgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IobnVsbCwgcmVmZXJlbmNlOiByZWZlcmVuY2UpOwogICAgfQogICAgdmFyIGZpbGVVcmkgPSByZWFkVXJpUmVmZXJlbmNlKCk7CiAgICB2YXIgZmlsZU9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIHZhciBmaWxlRW5kT2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgdmFyIGZsYWdzID0gcmVhZEJ5dGUoKTsKICAgIHZhciBuYW1lID0gcmVhZE5hbWUoKTsKICAgIHZhciBhbm5vdGF0aW9ucyA9IHJlYWRBbm5vdGF0aW9uTGlzdChub2RlKTsKICAgIGFzc2VydCgoKSB7CiAgICAgIGRlYnVnUGF0aC5hZGQobm9kZS5uYW1lPy5uYW1lID8/ICdyZWRpcmVjdGluZy1mYWN0b3J5LWNvbnN0cnVjdG9yJyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSgpKTsKICAgIHZhciB0YXJnZXRSZWZlcmVuY2UgPSByZWFkTWVtYmVyUmVmZXJlbmNlKCk7CiAgICB2YXIgdHlwZUFyZ3VtZW50cyA9IHJlYWREYXJ0VHlwZUxpc3QoKTsKICAgIGludCB0eXBlUGFyYW1ldGVyU3RhY2tIZWlnaHQgPSB0eXBlUGFyYW1ldGVyU3RhY2subGVuZ3RoOwogICAgdmFyIHR5cGVQYXJhbWV0ZXJzID0gcmVhZEFuZFB1c2hUeXBlUGFyYW1ldGVyTGlzdCgpOwogICAgcmVhZFVJbnQoKTsgLy8gVG90YWwgcGFyYW1ldGVyIGNvdW50LgogICAgdmFyIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPSByZWFkVUludCgpOwogICAgaW50IHZhcmlhYmxlU3RhY2tIZWlnaHQgPSB2YXJpYWJsZVN0YWNrLmxlbmd0aDsKICAgIHZhciBwb3NpdGlvbmFsID0gcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpOwogICAgdmFyIG5hbWVkID0gcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpOwogICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSB2YXJpYWJsZVN0YWNrSGVpZ2h0OwogICAgdHlwZVBhcmFtZXRlclN0YWNrLmxlbmd0aCA9IHR5cGVQYXJhbWV0ZXJTdGFja0hlaWdodDsKICAgIGRlYnVnUGF0aC5yZW1vdmVMYXN0KCk7CiAgICBpZiAoc2hvdWxkV3JpdGVEYXRhKSB7CiAgICAgIG5vZGUuZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgIG5vZGUuZmlsZUVuZE9mZnNldCA9IGZpbGVFbmRPZmZzZXQ7CiAgICAgIG5vZGUuZmxhZ3MgPSBmbGFnczsKICAgICAgbm9kZS5uYW1lID0gbmFtZTsKICAgICAgbm9kZS5maWxlVXJpID0gZmlsZVVyaTsKICAgICAgbm9kZS5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOwogICAgICBub2RlLnRhcmdldFJlZmVyZW5jZSA9IHRhcmdldFJlZmVyZW5jZTsKICAgICAgbm9kZS50eXBlQXJndW1lbnRzLmFkZEFsbCh0eXBlQXJndW1lbnRzKTsKICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOwogICAgICBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPSByZXF1aXJlZFBhcmFtZXRlckNvdW50OwogICAgICBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gcG9zaXRpb25hbDsKICAgICAgbm9kZS5uYW1lZFBhcmFtZXRlcnMgPSBuYW1lZDsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgSW5pdGlhbGl6ZXIgcmVhZEluaXRpYWxpemVyKCkgewogICAgaW50IHRhZyA9IHJlYWRCeXRlKCk7CiAgICBib29sIGlzU3ludGhldGljID0gcmVhZEJ5dGUoKSA9PSAxOwogICAgc3dpdGNoICh0YWcpIHsKICAgICAgY2FzZSBUYWcuSW52YWxpZEluaXRpYWxpemVyOgogICAgICAgIHJldHVybiBuZXcgSW52YWxpZEluaXRpYWxpemVyKCk7CiAgICAgIGNhc2UgVGFnLkZpZWxkSW5pdGlhbGl6ZXI6CiAgICAgICAgdmFyIHJlZmVyZW5jZSA9IHJlYWRNZW1iZXJSZWZlcmVuY2UoKTsKICAgICAgICB2YXIgdmFsdWUgPSByZWFkRXhwcmVzc2lvbigpOwogICAgICAgIHJldHVybiBuZXcgRmllbGRJbml0aWFsaXplci5ieVJlZmVyZW5jZShyZWZlcmVuY2UsIHZhbHVlKQogICAgICAgICAgLi5pc1N5bnRoZXRpYyA9IGlzU3ludGhldGljOwogICAgICBjYXNlIFRhZy5TdXBlckluaXRpYWxpemVyOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIHJlZmVyZW5jZSA9IHJlYWRNZW1iZXJSZWZlcmVuY2UoKTsKICAgICAgICB2YXIgYXJndW1lbnRzID0gcmVhZEFyZ3VtZW50cygpOwogICAgICAgIHJldHVybiBuZXcgU3VwZXJJbml0aWFsaXplci5ieVJlZmVyZW5jZShyZWZlcmVuY2UsIGFyZ3VtZW50cykKICAgICAgICAgIC4uaXNTeW50aGV0aWMgPSBpc1N5bnRoZXRpYwogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5SZWRpcmVjdGluZ0luaXRpYWxpemVyOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBSZWRpcmVjdGluZ0luaXRpYWxpemVyLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkTWVtYmVyUmVmZXJlbmNlKCksIHJlYWRBcmd1bWVudHMoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTG9jYWxJbml0aWFsaXplcjoKICAgICAgICByZXR1cm4gbmV3IExvY2FsSW5pdGlhbGl6ZXIocmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uKCkpOwogICAgICBjYXNlIFRhZy5Bc3NlcnRJbml0aWFsaXplcjoKICAgICAgICByZXR1cm4gbmV3IEFzc2VydEluaXRpYWxpemVyKHJlYWRTdGF0ZW1lbnQoKSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgZmFpbCgndW5leHBlY3RlZCBpbml0aWFsaXplciB0YWc6ICR0YWcnKTsKICAgIH0KICB9CgogIEZ1bmN0aW9uTm9kZSByZWFkRnVuY3Rpb25Ob2RlT3B0aW9uKGJvb2wgbGF6eUxvYWRCb2R5LCBpbnQgb3V0ZXJFbmRPZmZzZXQpIHsKICAgIHJldHVybiByZWFkQW5kQ2hlY2tPcHRpb25UYWcoKQogICAgICAgID8gcmVhZEZ1bmN0aW9uTm9kZSgKICAgICAgICAgICAgbGF6eUxvYWRCb2R5OiBsYXp5TG9hZEJvZHksIG91dGVyRW5kT2Zmc2V0OiBvdXRlckVuZE9mZnNldCkKICAgICAgICA6IG51bGw7CiAgfQoKICBGdW5jdGlvbk5vZGUgcmVhZEZ1bmN0aW9uTm9kZSgKICAgICAge2Jvb2wgbGF6eUxvYWRCb2R5OiBmYWxzZSwgaW50IG91dGVyRW5kT2Zmc2V0OiAtMX0pIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgYXNzZXJ0KHRhZyA9PSBUYWcuRnVuY3Rpb25Ob2RlKTsKICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICBpbnQgZW5kT2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIgPSBBc3luY01hcmtlci52YWx1ZXNbcmVhZEJ5dGUoKV07CiAgICBBc3luY01hcmtlciBkYXJ0QXN5bmNNYXJrZXIgPSBBc3luY01hcmtlci52YWx1ZXNbcmVhZEJ5dGUoKV07CiAgICBpbnQgdHlwZVBhcmFtZXRlclN0YWNrSGVpZ2h0ID0gdHlwZVBhcmFtZXRlclN0YWNrLmxlbmd0aDsKICAgIHZhciB0eXBlUGFyYW1ldGVycyA9IHJlYWRBbmRQdXNoVHlwZVBhcmFtZXRlckxpc3QoKTsKICAgIHJlYWRVSW50KCk7IC8vIHRvdGFsIHBhcmFtZXRlciBjb3VudC4KICAgIHZhciByZXF1aXJlZFBhcmFtZXRlckNvdW50ID0gcmVhZFVJbnQoKTsKICAgIGludCB2YXJpYWJsZVN0YWNrSGVpZ2h0ID0gdmFyaWFibGVTdGFjay5sZW5ndGg7CiAgICB2YXIgcG9zaXRpb25hbCA9IHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoKTsKICAgIHZhciBuYW1lZCA9IHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoKTsKICAgIHZhciByZXR1cm5UeXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICBpbnQgb2xkTGFiZWxTdGFja0Jhc2UgPSBsYWJlbFN0YWNrQmFzZTsKCiAgICBpZiAobGF6eUxvYWRCb2R5ICYmIG91dGVyRW5kT2Zmc2V0ID4gMCkgewogICAgICBsYXp5TG9hZEJvZHkgPSBvdXRlckVuZE9mZnNldCAtIF9ieXRlT2Zmc2V0ID4KICAgICAgICAgIDI7IC8vIGUuZy4gb3V0bGluZSBoYXMgVGFnLlNvbWV0aGluZyBhbmQgVGFnLkVtcHR5U3RhdGVtZW50CiAgICB9CgogICAgdmFyIGJvZHk7CiAgICBpZiAoIWxhenlMb2FkQm9keSkgewogICAgICBsYWJlbFN0YWNrQmFzZSA9IGxhYmVsU3RhY2subGVuZ3RoOwogICAgICBib2R5ID0gcmVhZFN0YXRlbWVudE9wdGlvbigpOwogICAgfQoKICAgIEZ1bmN0aW9uTm9kZSByZXN1bHQgPSBuZXcgRnVuY3Rpb25Ob2RlKGJvZHksCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IHBvc2l0aW9uYWwsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZCwKICAgICAgICByZXR1cm5UeXBlOiByZXR1cm5UeXBlLAogICAgICAgIGFzeW5jTWFya2VyOiBhc3luY01hcmtlciwKICAgICAgICBkYXJ0QXN5bmNNYXJrZXI6IGRhcnRBc3luY01hcmtlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0CiAgICAgIC4uZmlsZUVuZE9mZnNldCA9IGVuZE9mZnNldDsKCiAgICBpZiAobGF6eUxvYWRCb2R5KSB7CiAgICAgIF9zZXRMYXp5TG9hZEZ1bmN0aW9uKHJlc3VsdCwgb2xkTGFiZWxTdGFja0Jhc2UsIHZhcmlhYmxlU3RhY2tIZWlnaHQsCiAgICAgICAgICB0eXBlUGFyYW1ldGVyU3RhY2tIZWlnaHQpOwogICAgfQoKICAgIGxhYmVsU3RhY2tCYXNlID0gb2xkTGFiZWxTdGFja0Jhc2U7CiAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHZhcmlhYmxlU3RhY2tIZWlnaHQ7CiAgICB0eXBlUGFyYW1ldGVyU3RhY2subGVuZ3RoID0gdHlwZVBhcmFtZXRlclN0YWNrSGVpZ2h0OwoKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIF9zZXRMYXp5TG9hZEZ1bmN0aW9uKEZ1bmN0aW9uTm9kZSByZXN1bHQsIGludCBvbGRMYWJlbFN0YWNrQmFzZSwKICAgICAgaW50IHZhcmlhYmxlU3RhY2tIZWlnaHQsIGludCB0eXBlUGFyYW1ldGVyU3RhY2tIZWlnaHQpIHsKICAgIGZpbmFsIGludCBzYXZlZEJ5dGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIGludCBjb21wb25lbnRTdGFydE9mZnNldCA9IF9jb21wb25lbnRTdGFydE9mZnNldDsKICAgIGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyU3RhY2sudG9MaXN0KCk7CiAgICBmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcyA9IHZhcmlhYmxlU3RhY2sudG9MaXN0KCk7CiAgICBmaW5hbCBMaWJyYXJ5IGN1cnJlbnRMaWJyYXJ5ID0gX2N1cnJlbnRMaWJyYXJ5OwogICAgcmVzdWx0LmxhenlCdWlsZGVyID0gKCkgewogICAgICBfYnl0ZU9mZnNldCA9IHNhdmVkQnl0ZU9mZnNldDsKICAgICAgX2N1cnJlbnRMaWJyYXJ5ID0gY3VycmVudExpYnJhcnk7CiAgICAgIHR5cGVQYXJhbWV0ZXJTdGFjay5jbGVhcigpOwogICAgICB0eXBlUGFyYW1ldGVyU3RhY2suYWRkQWxsKHR5cGVQYXJhbWV0ZXJzKTsKICAgICAgdmFyaWFibGVTdGFjay5jbGVhcigpOwogICAgICB2YXJpYWJsZVN0YWNrLmFkZEFsbCh2YXJpYWJsZXMpOwogICAgICBfY29tcG9uZW50U3RhcnRPZmZzZXQgPSBjb21wb25lbnRTdGFydE9mZnNldDsKCiAgICAgIHJlc3VsdC5ib2R5ID0gcmVhZFN0YXRlbWVudE9wdGlvbigpOwogICAgICByZXN1bHQuYm9keT8ucGFyZW50ID0gcmVzdWx0OwogICAgICBsYWJlbFN0YWNrQmFzZSA9IG9sZExhYmVsU3RhY2tCYXNlOwogICAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHZhcmlhYmxlU3RhY2tIZWlnaHQ7CiAgICAgIHR5cGVQYXJhbWV0ZXJTdGFjay5sZW5ndGggPSB0eXBlUGFyYW1ldGVyU3RhY2tIZWlnaHQ7CiAgICAgIGlmIChyZXN1bHQucGFyZW50IGlzIFByb2NlZHVyZSkgewogICAgICAgIFByb2NlZHVyZSBwYXJlbnQgPSByZXN1bHQucGFyZW50OwogICAgICAgIHBhcmVudC50cmFuc2Zvcm1lckZsYWdzIHw9IGdldEFuZFJlc2V0VHJhbnNmb3JtZXJGbGFncygpOwogICAgICB9CiAgICB9OwogIH0KCiAgdm9pZCBwdXNoVmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICB2YXJpYWJsZVN0YWNrLmFkZCh2YXJpYWJsZSk7CiAgfQoKICB2b2lkIHB1c2hWYXJpYWJsZURlY2xhcmF0aW9ucyhMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcykgewogICAgdmFyaWFibGVTdGFjay5hZGRBbGwodmFyaWFibGVzKTsKICB9CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZFZhcmlhYmxlUmVmZXJlbmNlKCkgewogICAgaW50IGluZGV4ID0gcmVhZFVJbnQoKTsKICAgIGlmIChpbmRleCA+PSB2YXJpYWJsZVN0YWNrLmxlbmd0aCkgewogICAgICB0aHJvdyBmYWlsKCd1bmV4cGVjdGVkIHZhcmlhYmxlIGluZGV4OiAkaW5kZXgnKTsKICAgIH0KICAgIHJldHVybiB2YXJpYWJsZVN0YWNrW2luZGV4XTsKICB9CgogIFN0cmluZyBsb2dpY2FsT3BlcmF0b3JUb1N0cmluZyhpbnQgaW5kZXgpIHsKICAgIHN3aXRjaCAoaW5kZXgpIHsKICAgICAgY2FzZSAwOgogICAgICAgIHJldHVybiAnJiYnOwogICAgICBjYXNlIDE6CiAgICAgICAgcmV0dXJuICd8fCc7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgZmFpbCgndW5leHBlY3RlZCBsb2dpY2FsIG9wZXJhdG9yIGluZGV4OiAkaW5kZXgnKTsKICAgIH0KICB9CgogIExpc3Q8RXhwcmVzc2lvbj4gcmVhZEV4cHJlc3Npb25MaXN0KCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBMaXN0PEV4cHJlc3Npb24+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8RXhwcmVzc2lvbj4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkRXhwcmVzc2lvbigpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEV4cHJlc3Npb24gcmVhZEV4cHJlc3Npb25PcHRpb24oKSB7CiAgICByZXR1cm4gcmVhZEFuZENoZWNrT3B0aW9uVGFnKCkgPyByZWFkRXhwcmVzc2lvbigpIDogbnVsbDsKICB9CgogIEV4cHJlc3Npb24gcmVhZEV4cHJlc3Npb24oKSB7CiAgICBpbnQgdGFnQnl0ZSA9IHJlYWRCeXRlKCk7CiAgICBpbnQgdGFnID0gdGFnQnl0ZSAmIFRhZy5TcGVjaWFsaXplZFRhZ0hpZ2hCaXQgPT0gMAogICAgICAgID8gdGFnQnl0ZQogICAgICAgIDogKHRhZ0J5dGUgJiBUYWcuU3BlY2lhbGl6ZWRUYWdNYXNrKTsKICAgIHN3aXRjaCAodGFnKSB7CiAgICAgIGNhc2UgVGFnLkxvYWRMaWJyYXJ5OgogICAgICAgIHJldHVybiBuZXcgTG9hZExpYnJhcnkocmVhZExpYnJhcnlEZXBlbmRlbmN5UmVmZXJlbmNlKCkpOwogICAgICBjYXNlIFRhZy5DaGVja0xpYnJhcnlJc0xvYWRlZDoKICAgICAgICByZXR1cm4gbmV3IENoZWNrTGlicmFyeUlzTG9hZGVkKHJlYWRMaWJyYXJ5RGVwZW5kZW5jeVJlZmVyZW5jZSgpKTsKICAgICAgY2FzZSBUYWcuSW52YWxpZEV4cHJlc3Npb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IEludmFsaWRFeHByZXNzaW9uKHJlYWRTdHJpbmdPck51bGxJZkVtcHR5KCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlZhcmlhYmxlR2V0OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmVhZFVJbnQoKTsgLy8gb2Zmc2V0IG9mIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBpbiB0aGUgYmluYXJ5LgogICAgICAgIHJldHVybiBuZXcgVmFyaWFibGVHZXQocmVhZFZhcmlhYmxlUmVmZXJlbmNlKCksIHJlYWREYXJ0VHlwZU9wdGlvbigpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5TcGVjaWFsaXplZFZhcmlhYmxlR2V0OgogICAgICAgIGludCBpbmRleCA9IHRhZ0J5dGUgJiBUYWcuU3BlY2lhbGl6ZWRQYXlsb2FkTWFzazsKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJlYWRVSW50KCk7IC8vIG9mZnNldCBvZiB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gaW4gdGhlIGJpbmFyeS4KICAgICAgICByZXR1cm4gbmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlU3RhY2tbaW5kZXhdKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuVmFyaWFibGVTZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZWFkVUludCgpOyAvLyBvZmZzZXQgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGluIHRoZSBiaW5hcnkuCiAgICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZVNldChyZWFkVmFyaWFibGVSZWZlcmVuY2UoKSwgcmVhZEV4cHJlc3Npb24oKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuU3BlY2lhbGl6ZWRWYXJpYWJsZVNldDoKICAgICAgICBpbnQgaW5kZXggPSB0YWdCeXRlICYgVGFnLlNwZWNpYWxpemVkUGF5bG9hZE1hc2s7CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZWFkVUludCgpOyAvLyBvZmZzZXQgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGluIHRoZSBiaW5hcnkuCiAgICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZVNldCh2YXJpYWJsZVN0YWNrW2luZGV4XSwgcmVhZEV4cHJlc3Npb24oKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuUHJvcGVydHlHZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5R2V0LmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkRXhwcmVzc2lvbigpLCByZWFkTmFtZSgpLCByZWFkTWVtYmVyUmVmZXJlbmNlKGFsbG93TnVsbDogdHJ1ZSkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlByb3BlcnR5U2V0OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVNldC5ieVJlZmVyZW5jZShyZWFkRXhwcmVzc2lvbigpLCByZWFkTmFtZSgpLAogICAgICAgICAgICByZWFkRXhwcmVzc2lvbigpLCByZWFkTWVtYmVyUmVmZXJlbmNlKGFsbG93TnVsbDogdHJ1ZSkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlN1cGVyUHJvcGVydHlHZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICBhZGRUcmFuc2Zvcm1lckZsYWcoVHJhbnNmb3JtZXJGbGFnLnN1cGVyQ2FsbHMpOwogICAgICAgIHJldHVybiBuZXcgU3VwZXJQcm9wZXJ0eUdldC5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZE5hbWUoKSwgcmVhZE1lbWJlclJlZmVyZW5jZShhbGxvd051bGw6IHRydWUpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5TdXBlclByb3BlcnR5U2V0OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgYWRkVHJhbnNmb3JtZXJGbGFnKFRyYW5zZm9ybWVyRmxhZy5zdXBlckNhbGxzKTsKICAgICAgICByZXR1cm4gbmV3IFN1cGVyUHJvcGVydHlTZXQuYnlSZWZlcmVuY2UoCiAgICAgICAgICAgIHJlYWROYW1lKCksIHJlYWRFeHByZXNzaW9uKCksIHJlYWRNZW1iZXJSZWZlcmVuY2UoYWxsb3dOdWxsOiB0cnVlKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuRGlyZWN0UHJvcGVydHlHZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IERpcmVjdFByb3BlcnR5R2V0LmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkRXhwcmVzc2lvbigpLCByZWFkTWVtYmVyUmVmZXJlbmNlKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLkRpcmVjdFByb3BlcnR5U2V0OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RQcm9wZXJ0eVNldC5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZEV4cHJlc3Npb24oKSwgcmVhZE1lbWJlclJlZmVyZW5jZSgpLCByZWFkRXhwcmVzc2lvbigpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5TdGF0aWNHZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFN0YXRpY0dldC5ieVJlZmVyZW5jZShyZWFkTWVtYmVyUmVmZXJlbmNlKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlN0YXRpY1NldDoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJldHVybiBuZXcgU3RhdGljU2V0LmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkTWVtYmVyUmVmZXJlbmNlKCksIHJlYWRFeHByZXNzaW9uKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLk1ldGhvZEludm9jYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IE1ldGhvZEludm9jYXRpb24uYnlSZWZlcmVuY2UocmVhZEV4cHJlc3Npb24oKSwgcmVhZE5hbWUoKSwKICAgICAgICAgICAgcmVhZEFyZ3VtZW50cygpLCByZWFkTWVtYmVyUmVmZXJlbmNlKGFsbG93TnVsbDogdHJ1ZSkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlN1cGVyTWV0aG9kSW52b2NhdGlvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIGFkZFRyYW5zZm9ybWVyRmxhZyhUcmFuc2Zvcm1lckZsYWcuc3VwZXJDYWxscyk7CiAgICAgICAgcmV0dXJuIG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgICAgICAgIHJlYWROYW1lKCksIHJlYWRBcmd1bWVudHMoKSwgcmVhZE1lbWJlclJlZmVyZW5jZShhbGxvd051bGw6IHRydWUpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5EaXJlY3RNZXRob2RJbnZvY2F0aW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RNZXRob2RJbnZvY2F0aW9uLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkRXhwcmVzc2lvbigpLCByZWFkTWVtYmVyUmVmZXJlbmNlKCksIHJlYWRBcmd1bWVudHMoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuU3RhdGljSW52b2NhdGlvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJldHVybiBuZXcgU3RhdGljSW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZE1lbWJlclJlZmVyZW5jZSgpLCByZWFkQXJndW1lbnRzKCksCiAgICAgICAgICAgIGlzQ29uc3Q6IGZhbHNlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdFN0YXRpY0ludm9jYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFN0YXRpY0ludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgICAgICAgIHJlYWRNZW1iZXJSZWZlcmVuY2UoKSwgcmVhZEFyZ3VtZW50cygpLAogICAgICAgICAgICBpc0NvbnN0OiB0cnVlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdHJ1Y3Rvckludm9jYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZE1lbWJlclJlZmVyZW5jZSgpLCByZWFkQXJndW1lbnRzKCksCiAgICAgICAgICAgIGlzQ29uc3Q6IGZhbHNlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdENvbnN0cnVjdG9ySW52b2NhdGlvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3JJbnZvY2F0aW9uLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkTWVtYmVyUmVmZXJlbmNlKCksIHJlYWRBcmd1bWVudHMoKSwKICAgICAgICAgICAgaXNDb25zdDogdHJ1ZSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTm90OgogICAgICAgIHJldHVybiBuZXcgTm90KHJlYWRFeHByZXNzaW9uKCkpOwogICAgICBjYXNlIFRhZy5Mb2dpY2FsRXhwcmVzc2lvbjoKICAgICAgICByZXR1cm4gbmV3IExvZ2ljYWxFeHByZXNzaW9uKHJlYWRFeHByZXNzaW9uKCksCiAgICAgICAgICAgIGxvZ2ljYWxPcGVyYXRvclRvU3RyaW5nKHJlYWRCeXRlKCkpLCByZWFkRXhwcmVzc2lvbigpKTsKICAgICAgY2FzZSBUYWcuQ29uZGl0aW9uYWxFeHByZXNzaW9uOgogICAgICAgIHJldHVybiBuZXcgQ29uZGl0aW9uYWxFeHByZXNzaW9uKHJlYWRFeHByZXNzaW9uKCksIHJlYWRFeHByZXNzaW9uKCksCiAgICAgICAgICAgIHJlYWRFeHByZXNzaW9uKCksIHJlYWREYXJ0VHlwZU9wdGlvbigpKTsKICAgICAgY2FzZSBUYWcuU3RyaW5nQ29uY2F0ZW5hdGlvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJldHVybiBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbihyZWFkRXhwcmVzc2lvbkxpc3QoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTGlzdENvbmNhdGVuYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgdHlwZUFyZ3VtZW50ID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBMaXN0Q29uY2F0ZW5hdGlvbihyZWFkRXhwcmVzc2lvbkxpc3QoKSwKICAgICAgICAgICAgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlNldENvbmNhdGVuYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgdHlwZUFyZ3VtZW50ID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBTZXRDb25jYXRlbmF0aW9uKHJlYWRFeHByZXNzaW9uTGlzdCgpLAogICAgICAgICAgICB0eXBlQXJndW1lbnQ6IHR5cGVBcmd1bWVudCkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTWFwQ29uY2F0ZW5hdGlvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHZhciBrZXlUeXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgdmFyIHZhbHVlVHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgTWFwQ29uY2F0ZW5hdGlvbihyZWFkRXhwcmVzc2lvbkxpc3QoKSwKICAgICAgICAgICAga2V5VHlwZToga2V5VHlwZSwgdmFsdWVUeXBlOiB2YWx1ZVR5cGUpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLkluc3RhbmNlQ3JlYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICBSZWZlcmVuY2UgY2xhc3NSZWZlcmVuY2UgPSByZWFkQ2xhc3NSZWZlcmVuY2UoKTsKICAgICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0gcmVhZERhcnRUeXBlTGlzdCgpOwogICAgICAgIGludCBmaWVsZFZhbHVlQ291bnQgPSByZWFkVUludCgpOwogICAgICAgIE1hcDxSZWZlcmVuY2UsIEV4cHJlc3Npb24+IGZpZWxkVmFsdWVzID0gPFJlZmVyZW5jZSwgRXhwcmVzc2lvbj57fTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkVmFsdWVDb3VudDsgaSsrKSB7CiAgICAgICAgICBmaW5hbCBSZWZlcmVuY2UgZmllbGRSZWYgPQogICAgICAgICAgICAgIHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCkuZ2V0UmVmZXJlbmNlKCk7CiAgICAgICAgICBmaW5hbCBFeHByZXNzaW9uIHZhbHVlID0gcmVhZEV4cHJlc3Npb24oKTsKICAgICAgICAgIGZpZWxkVmFsdWVzW2ZpZWxkUmVmXSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICBpbnQgYXNzZXJ0Q291bnQgPSByZWFkVUludCgpOwogICAgICAgIExpc3Q8QXNzZXJ0U3RhdGVtZW50PiBhc3NlcnRzID0gbmV3IExpc3Q8QXNzZXJ0U3RhdGVtZW50Pihhc3NlcnRDb3VudCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhc3NlcnRDb3VudDsgaSsrKSB7CiAgICAgICAgICBhc3NlcnRzW2ldID0gcmVhZFN0YXRlbWVudCgpOwogICAgICAgIH0KICAgICAgICBMaXN0PEV4cHJlc3Npb24+IHVudXNlZEFyZ3VtZW50cyA9IHJlYWRFeHByZXNzaW9uTGlzdCgpOwogICAgICAgIHJldHVybiBuZXcgSW5zdGFuY2VDcmVhdGlvbihjbGFzc1JlZmVyZW5jZSwgdHlwZUFyZ3VtZW50cywgZmllbGRWYWx1ZXMsCiAgICAgICAgICAgIGFzc2VydHMsIHVudXNlZEFyZ3VtZW50cykKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuSXNFeHByZXNzaW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBJc0V4cHJlc3Npb24ocmVhZEV4cHJlc3Npb24oKSwgcmVhZERhcnRUeXBlKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLkFzRXhwcmVzc2lvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIGludCBmbGFncyA9IHJlYWRCeXRlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBBc0V4cHJlc3Npb24ocmVhZEV4cHJlc3Npb24oKSwgcmVhZERhcnRUeXBlKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQKICAgICAgICAgIC4uZmxhZ3MgPSBmbGFnczsKICAgICAgY2FzZSBUYWcuU3RyaW5nTGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0xpdGVyYWwocmVhZFN0cmluZ1JlZmVyZW5jZSgpKTsKICAgICAgY2FzZSBUYWcuU3BlY2lhbGl6ZWRJbnRMaXRlcmFsOgogICAgICAgIGludCBiaWFzZWRWYWx1ZSA9IHRhZ0J5dGUgJiBUYWcuU3BlY2lhbGl6ZWRQYXlsb2FkTWFzazsKICAgICAgICByZXR1cm4gbmV3IEludExpdGVyYWwoYmlhc2VkVmFsdWUgLSBUYWcuU3BlY2lhbGl6ZWRJbnRMaXRlcmFsQmlhcyk7CiAgICAgIGNhc2UgVGFnLlBvc2l0aXZlSW50TGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IEludExpdGVyYWwocmVhZFVJbnQoKSk7CiAgICAgIGNhc2UgVGFnLk5lZ2F0aXZlSW50TGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IEludExpdGVyYWwoLXJlYWRVSW50KCkpOwogICAgICBjYXNlIFRhZy5CaWdJbnRMaXRlcmFsOgogICAgICAgIHJldHVybiBuZXcgSW50TGl0ZXJhbChpbnQucGFyc2UocmVhZFN0cmluZ1JlZmVyZW5jZSgpKSk7CiAgICAgIGNhc2UgVGFnLkRvdWJsZUxpdGVyYWw6CiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVMaXRlcmFsKHJlYWREb3VibGUoKSk7CiAgICAgIGNhc2UgVGFnLlRydWVMaXRlcmFsOgogICAgICAgIHJldHVybiBuZXcgQm9vbExpdGVyYWwodHJ1ZSk7CiAgICAgIGNhc2UgVGFnLkZhbHNlTGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IEJvb2xMaXRlcmFsKGZhbHNlKTsKICAgICAgY2FzZSBUYWcuTnVsbExpdGVyYWw6CiAgICAgICAgcmV0dXJuIG5ldyBOdWxsTGl0ZXJhbCgpOwogICAgICBjYXNlIFRhZy5TeW1ib2xMaXRlcmFsOgogICAgICAgIHJldHVybiBuZXcgU3ltYm9sTGl0ZXJhbChyZWFkU3RyaW5nUmVmZXJlbmNlKCkpOwogICAgICBjYXNlIFRhZy5UeXBlTGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IFR5cGVMaXRlcmFsKHJlYWREYXJ0VHlwZSgpKTsKICAgICAgY2FzZSBUYWcuVGhpc0V4cHJlc3Npb246CiAgICAgICAgcmV0dXJuIG5ldyBUaGlzRXhwcmVzc2lvbigpOwogICAgICBjYXNlIFRhZy5SZXRocm93OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBSZXRocm93KCkuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlRocm93OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBUaHJvdyhyZWFkRXhwcmVzc2lvbigpKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTGlzdExpdGVyYWw6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgdHlwZUFyZ3VtZW50ID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBMaXN0TGl0ZXJhbChyZWFkRXhwcmVzc2lvbkxpc3QoKSwKICAgICAgICAgICAgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQsIGlzQ29uc3Q6IGZhbHNlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdExpc3RMaXRlcmFsOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIHR5cGVBcmd1bWVudCA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgTGlzdExpdGVyYWwocmVhZEV4cHJlc3Npb25MaXN0KCksCiAgICAgICAgICAgIHR5cGVBcmd1bWVudDogdHlwZUFyZ3VtZW50LCBpc0NvbnN0OiB0cnVlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5TZXRMaXRlcmFsOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIHR5cGVBcmd1bWVudCA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgU2V0TGl0ZXJhbChyZWFkRXhwcmVzc2lvbkxpc3QoKSwKICAgICAgICAgICAgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQsIGlzQ29uc3Q6IGZhbHNlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdFNldExpdGVyYWw6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgdHlwZUFyZ3VtZW50ID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBTZXRMaXRlcmFsKHJlYWRFeHByZXNzaW9uTGlzdCgpLAogICAgICAgICAgICB0eXBlQXJndW1lbnQ6IHR5cGVBcmd1bWVudCwgaXNDb25zdDogdHJ1ZSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTWFwTGl0ZXJhbDoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHZhciBrZXlUeXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgdmFyIHZhbHVlVHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgTWFwTGl0ZXJhbChyZWFkTWFwRW50cnlMaXN0KCksCiAgICAgICAgICAgIGtleVR5cGU6IGtleVR5cGUsIHZhbHVlVHlwZTogdmFsdWVUeXBlLCBpc0NvbnN0OiBmYWxzZSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuQ29uc3RNYXBMaXRlcmFsOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIGtleVR5cGUgPSByZWFkRGFydFR5cGUoKTsKICAgICAgICB2YXIgdmFsdWVUeXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBNYXBMaXRlcmFsKHJlYWRNYXBFbnRyeUxpc3QoKSwKICAgICAgICAgICAga2V5VHlwZToga2V5VHlwZSwgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsIGlzQ29uc3Q6IHRydWUpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLkF3YWl0RXhwcmVzc2lvbjoKICAgICAgICByZXR1cm4gbmV3IEF3YWl0RXhwcmVzc2lvbihyZWFkRXhwcmVzc2lvbigpKTsKICAgICAgY2FzZSBUYWcuRnVuY3Rpb25FeHByZXNzaW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkV4cHJlc3Npb24ocmVhZEZ1bmN0aW9uTm9kZSgpKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTGV0OgogICAgICAgIHZhciB2YXJpYWJsZSA9IHJlYWRWYXJpYWJsZURlY2xhcmF0aW9uKCk7CiAgICAgICAgaW50IHN0YWNrSGVpZ2h0ID0gdmFyaWFibGVTdGFjay5sZW5ndGg7CiAgICAgICAgcHVzaFZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGUpOwogICAgICAgIHZhciBib2R5ID0gcmVhZEV4cHJlc3Npb24oKTsKICAgICAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHN0YWNrSGVpZ2h0OwogICAgICAgIHJldHVybiBuZXcgTGV0KHZhcmlhYmxlLCBib2R5KTsKICAgICAgY2FzZSBUYWcuQmxvY2tFeHByZXNzaW9uOgogICAgICAgIGludCBzdGFja0hlaWdodCA9IHZhcmlhYmxlU3RhY2subGVuZ3RoOwogICAgICAgIHZhciBzdGF0ZW1lbnRzID0gcmVhZFN0YXRlbWVudExpc3QoKTsKICAgICAgICB2YXIgdmFsdWUgPSByZWFkRXhwcmVzc2lvbigpOwogICAgICAgIHZhcmlhYmxlU3RhY2subGVuZ3RoID0gc3RhY2tIZWlnaHQ7CiAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0V4cHJlc3Npb24obmV3IEJsb2NrKHN0YXRlbWVudHMpLCB2YWx1ZSk7CiAgICAgIGNhc2UgVGFnLkluc3RhbnRpYXRpb246CiAgICAgICAgdmFyIGV4cHJlc3Npb24gPSByZWFkRXhwcmVzc2lvbigpOwogICAgICAgIHZhciB0eXBlQXJndW1lbnRzID0gcmVhZERhcnRUeXBlTGlzdCgpOwogICAgICAgIHJldHVybiBuZXcgSW5zdGFudGlhdGlvbihleHByZXNzaW9uLCB0eXBlQXJndW1lbnRzKTsKICAgICAgY2FzZSBUYWcuQ29uc3RhbnRFeHByZXNzaW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIENvbnN0YW50IGNvbnN0YW50ID0gcmVhZENvbnN0YW50UmVmZXJlbmNlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudEV4cHJlc3Npb24oY29uc3RhbnQsIHR5cGUpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IGZhaWwoJ3VuZXhwZWN0ZWQgZXhwcmVzc2lvbiB0YWc6ICR0YWcnKTsKICAgIH0KICB9CgogIExpc3Q8TWFwRW50cnk+IHJlYWRNYXBFbnRyeUxpc3QoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8TWFwRW50cnk+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8TWFwRW50cnk+LmZpbGxlZChsZW5ndGgsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gcmVhZE1hcEVudHJ5KCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTWFwRW50cnkgcmVhZE1hcEVudHJ5KCkgewogICAgcmV0dXJuIG5ldyBNYXBFbnRyeShyZWFkRXhwcmVzc2lvbigpLCByZWFkRXhwcmVzc2lvbigpKTsKICB9CgogIExpc3Q8U3RhdGVtZW50PiByZWFkU3RhdGVtZW50TGlzdCgpIHsKICAgIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgTGlzdDxTdGF0ZW1lbnQ+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8U3RhdGVtZW50Pi5maWxsZWQobGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IHJlYWRTdGF0ZW1lbnQoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTdGF0ZW1lbnQgcmVhZFN0YXRlbWVudE9yTnVsbElmRW1wdHkoKSB7CiAgICB2YXIgbm9kZSA9IHJlYWRTdGF0ZW1lbnQoKTsKICAgIGlmIChub2RlIGlzIEVtcHR5U3RhdGVtZW50KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICBTdGF0ZW1lbnQgcmVhZFN0YXRlbWVudE9wdGlvbigpIHsKICAgIHJldHVybiByZWFkQW5kQ2hlY2tPcHRpb25UYWcoKSA/IHJlYWRTdGF0ZW1lbnQoKSA6IG51bGw7CiAgfQoKICBTdGF0ZW1lbnQgcmVhZFN0YXRlbWVudCgpIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgc3dpdGNoICh0YWcpIHsKICAgICAgY2FzZSBUYWcuRXhwcmVzc2lvblN0YXRlbWVudDoKICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQocmVhZEV4cHJlc3Npb24oKSk7CiAgICAgIGNhc2UgVGFnLkJsb2NrOgogICAgICAgIHJldHVybiByZWFkQmxvY2soKTsKICAgICAgY2FzZSBUYWcuQXNzZXJ0QmxvY2s6CiAgICAgICAgcmV0dXJuIHJlYWRBc3NlcnRCbG9jaygpOwogICAgICBjYXNlIFRhZy5FbXB0eVN0YXRlbWVudDoKICAgICAgICByZXR1cm4gbmV3IEVtcHR5U3RhdGVtZW50KCk7CiAgICAgIGNhc2UgVGFnLkFzc2VydFN0YXRlbWVudDoKICAgICAgICByZXR1cm4gbmV3IEFzc2VydFN0YXRlbWVudChyZWFkRXhwcmVzc2lvbigpLAogICAgICAgICAgICBjb25kaXRpb25TdGFydE9mZnNldDogcmVhZE9mZnNldCgpLAogICAgICAgICAgICBjb25kaXRpb25FbmRPZmZzZXQ6IHJlYWRPZmZzZXQoKSwKICAgICAgICAgICAgbWVzc2FnZTogcmVhZEV4cHJlc3Npb25PcHRpb24oKSk7CiAgICAgIGNhc2UgVGFnLkxhYmVsZWRTdGF0ZW1lbnQ6CiAgICAgICAgdmFyIGxhYmVsID0gbmV3IExhYmVsZWRTdGF0ZW1lbnQobnVsbCk7CiAgICAgICAgbGFiZWxTdGFjay5hZGQobGFiZWwpOwogICAgICAgIGxhYmVsLmJvZHkgPSByZWFkU3RhdGVtZW50KCkuLnBhcmVudCA9IGxhYmVsOwogICAgICAgIGxhYmVsU3RhY2sucmVtb3ZlTGFzdCgpOwogICAgICAgIHJldHVybiBsYWJlbDsKICAgICAgY2FzZSBUYWcuQnJlYWtTdGF0ZW1lbnQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICBpbnQgaW5kZXggPSByZWFkVUludCgpOwogICAgICAgIHJldHVybiBuZXcgQnJlYWtTdGF0ZW1lbnQobGFiZWxTdGFja1tsYWJlbFN0YWNrQmFzZSArIGluZGV4XSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuV2hpbGVTdGF0ZW1lbnQ6CiAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFdoaWxlU3RhdGVtZW50KHJlYWRFeHByZXNzaW9uKCksIHJlYWRTdGF0ZW1lbnQoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuRG9TdGF0ZW1lbnQ6CiAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IERvU3RhdGVtZW50KHJlYWRTdGF0ZW1lbnQoKSwgcmVhZEV4cHJlc3Npb24oKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuRm9yU3RhdGVtZW50OgogICAgICAgIGludCB2YXJpYWJsZVN0YWNrSGVpZ2h0ID0gdmFyaWFibGVTdGFjay5sZW5ndGg7CiAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgdmFyaWFibGVzID0gcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpOwogICAgICAgIHZhciBjb25kaXRpb24gPSByZWFkRXhwcmVzc2lvbk9wdGlvbigpOwogICAgICAgIHZhciB1cGRhdGVzID0gcmVhZEV4cHJlc3Npb25MaXN0KCk7CiAgICAgICAgdmFyIGJvZHkgPSByZWFkU3RhdGVtZW50KCk7CiAgICAgICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSB2YXJpYWJsZVN0YWNrSGVpZ2h0OwogICAgICAgIHJldHVybiBuZXcgRm9yU3RhdGVtZW50KHZhcmlhYmxlcywgY29uZGl0aW9uLCB1cGRhdGVzLCBib2R5KQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Gb3JJblN0YXRlbWVudDoKICAgICAgY2FzZSBUYWcuQXN5bmNGb3JJblN0YXRlbWVudDoKICAgICAgICBib29sIGlzQXN5bmMgPSB0YWcgPT0gVGFnLkFzeW5jRm9ySW5TdGF0ZW1lbnQ7CiAgICAgICAgaW50IHZhcmlhYmxlU3RhY2tIZWlnaHQgPSB2YXJpYWJsZVN0YWNrLmxlbmd0aDsKICAgICAgICB2YXIgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHZhciBib2R5T2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHZhciB2YXJpYWJsZSA9IHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbigpOwogICAgICAgIHZhciBpdGVyYWJsZSA9IHJlYWRFeHByZXNzaW9uKCk7CiAgICAgICAgdmFyIGJvZHkgPSByZWFkU3RhdGVtZW50KCk7CiAgICAgICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSB2YXJpYWJsZVN0YWNrSGVpZ2h0OwogICAgICAgIHJldHVybiBuZXcgRm9ySW5TdGF0ZW1lbnQodmFyaWFibGUsIGl0ZXJhYmxlLCBib2R5LCBpc0FzeW5jOiBpc0FzeW5jKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0CiAgICAgICAgICAuLmJvZHlPZmZzZXQgPSBib2R5T2Zmc2V0OwogICAgICBjYXNlIFRhZy5Td2l0Y2hTdGF0ZW1lbnQ6CiAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IHJlYWRFeHByZXNzaW9uKCk7CiAgICAgICAgaW50IGNvdW50ID0gcmVhZFVJbnQoKTsKICAgICAgICBMaXN0PFN3aXRjaENhc2U+IGNhc2VzID0KICAgICAgICAgICAgbmV3IExpc3Q8U3dpdGNoQ2FzZT4uZmlsbGVkKGNvdW50LCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAgICBjYXNlc1tpXSA9IG5ldyBTd2l0Y2hDYXNlLmVtcHR5KCk7CiAgICAgICAgfQogICAgICAgIHN3aXRjaENhc2VTdGFjay5hZGRBbGwoY2FzZXMpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIHJlYWRTd2l0Y2hDYXNlSW50byhjYXNlc1tpXSk7CiAgICAgICAgfQogICAgICAgIHN3aXRjaENhc2VTdGFjay5sZW5ndGggLT0gY291bnQ7CiAgICAgICAgcmV0dXJuIG5ldyBTd2l0Y2hTdGF0ZW1lbnQoZXhwcmVzc2lvbiwgY2FzZXMpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db250aW51ZVN3aXRjaFN0YXRlbWVudDoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIGludCBpbmRleCA9IHJlYWRVSW50KCk7CiAgICAgICAgcmV0dXJuIG5ldyBDb250aW51ZVN3aXRjaFN0YXRlbWVudChzd2l0Y2hDYXNlU3RhY2tbaW5kZXhdKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5JZlN0YXRlbWVudDoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJldHVybiBuZXcgSWZTdGF0ZW1lbnQoCiAgICAgICAgICAgIHJlYWRFeHByZXNzaW9uKCksIHJlYWRTdGF0ZW1lbnQoKSwgcmVhZFN0YXRlbWVudE9yTnVsbElmRW1wdHkoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuUmV0dXJuU3RhdGVtZW50OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBSZXR1cm5TdGF0ZW1lbnQocmVhZEV4cHJlc3Npb25PcHRpb24oKSkuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlRyeUNhdGNoOgogICAgICAgIFN0YXRlbWVudCBib2R5ID0gcmVhZFN0YXRlbWVudCgpOwogICAgICAgIGludCBmbGFncyA9IHJlYWRCeXRlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBUcnlDYXRjaChib2R5LCByZWFkQ2F0Y2hMaXN0KCksIGlzU3ludGhldGljOiBmbGFncyAmIDIgPT0gMik7CiAgICAgIGNhc2UgVGFnLlRyeUZpbmFsbHk6CiAgICAgICAgcmV0dXJuIG5ldyBUcnlGaW5hbGx5KHJlYWRTdGF0ZW1lbnQoKSwgcmVhZFN0YXRlbWVudCgpKTsKICAgICAgY2FzZSBUYWcuWWllbGRTdGF0ZW1lbnQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICBpbnQgZmxhZ3MgPSByZWFkQnl0ZSgpOwogICAgICAgIHJldHVybiBuZXcgWWllbGRTdGF0ZW1lbnQocmVhZEV4cHJlc3Npb24oKSwKICAgICAgICAgICAgaXNZaWVsZFN0YXI6IGZsYWdzICYgWWllbGRTdGF0ZW1lbnQuRmxhZ1lpZWxkU3RhciAhPSAwLAogICAgICAgICAgICBpc05hdGl2ZTogZmxhZ3MgJiBZaWVsZFN0YXRlbWVudC5GbGFnTmF0aXZlICE9IDApCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlZhcmlhYmxlRGVjbGFyYXRpb246CiAgICAgICAgdmFyIHZhcmlhYmxlID0gcmVhZFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgICAgICB2YXJpYWJsZVN0YWNrLmFkZCh2YXJpYWJsZSk7IC8vIFdpbGwgYmUgcG9wcGVkIGJ5IHRoZSBlbmNsb3Npbmcgc2NvcGUuCiAgICAgICAgcmV0dXJuIHZhcmlhYmxlOwogICAgICBjYXNlIFRhZy5GdW5jdGlvbkRlY2xhcmF0aW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIHZhcmlhYmxlID0gcmVhZFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgICAgICB2YXJpYWJsZVN0YWNrLmFkZCh2YXJpYWJsZSk7IC8vIFdpbGwgYmUgcG9wcGVkIGJ5IHRoZSBlbmNsb3Npbmcgc2NvcGUuCiAgICAgICAgdmFyIGZ1bmN0aW9uID0gcmVhZEZ1bmN0aW9uTm9kZSgpOwogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25EZWNsYXJhdGlvbih2YXJpYWJsZSwgZnVuY3Rpb24pLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IGZhaWwoJ3VuZXhwZWN0ZWQgc3RhdGVtZW50IHRhZzogJHRhZycpOwogICAgfQogIH0KCiAgdm9pZCByZWFkU3dpdGNoQ2FzZUludG8oU3dpdGNoQ2FzZSBjYXNlTm9kZSkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBjYXNlTm9kZS5leHByZXNzaW9ucy5sZW5ndGggPSBsZW5ndGg7CiAgICBjYXNlTm9kZS5leHByZXNzaW9uT2Zmc2V0cy5sZW5ndGggPSBsZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIGNhc2VOb2RlLmV4cHJlc3Npb25PZmZzZXRzW2ldID0gcmVhZE9mZnNldCgpOwogICAgICBjYXNlTm9kZS5leHByZXNzaW9uc1tpXSA9IHJlYWRFeHByZXNzaW9uKCkuLnBhcmVudCA9IGNhc2VOb2RlOwogICAgfQogICAgY2FzZU5vZGUuaXNEZWZhdWx0ID0gcmVhZEJ5dGUoKSA9PSAxOwogICAgY2FzZU5vZGUuYm9keSA9IHJlYWRTdGF0ZW1lbnQoKS4ucGFyZW50ID0gY2FzZU5vZGU7CiAgfQoKICBMaXN0PENhdGNoPiByZWFkQ2F0Y2hMaXN0KCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBMaXN0PENhdGNoPiByZXN1bHQgPSBuZXcgTGlzdDxDYXRjaD4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkQ2F0Y2goKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBDYXRjaCByZWFkQ2F0Y2goKSB7CiAgICBpbnQgdmFyaWFibGVTdGFja0hlaWdodCA9IHZhcmlhYmxlU3RhY2subGVuZ3RoOwogICAgdmFyIG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIHZhciBndWFyZCA9IHJlYWREYXJ0VHlwZSgpOwogICAgdmFyIGV4Y2VwdGlvbiA9IHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbk9wdGlvbigpOwogICAgdmFyIHN0YWNrVHJhY2UgPSByZWFkQW5kUHVzaFZhcmlhYmxlRGVjbGFyYXRpb25PcHRpb24oKTsKICAgIHZhciBib2R5ID0gcmVhZFN0YXRlbWVudCgpOwogICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSB2YXJpYWJsZVN0YWNrSGVpZ2h0OwogICAgcmV0dXJuIG5ldyBDYXRjaChleGNlcHRpb24sIGJvZHksIGd1YXJkOiBndWFyZCwgc3RhY2tUcmFjZTogc3RhY2tUcmFjZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgQmxvY2sgcmVhZEJsb2NrKCkgewogICAgaW50IHN0YWNrSGVpZ2h0ID0gdmFyaWFibGVTdGFjay5sZW5ndGg7CiAgICB2YXIgYm9keSA9IHJlYWRTdGF0ZW1lbnRMaXN0KCk7CiAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHN0YWNrSGVpZ2h0OwogICAgcmV0dXJuIG5ldyBCbG9jayhib2R5KTsKICB9CgogIEFzc2VydEJsb2NrIHJlYWRBc3NlcnRCbG9jaygpIHsKICAgIGludCBzdGFja0hlaWdodCA9IHZhcmlhYmxlU3RhY2subGVuZ3RoOwogICAgdmFyIGJvZHkgPSByZWFkU3RhdGVtZW50TGlzdCgpOwogICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSBzdGFja0hlaWdodDsKICAgIHJldHVybiBuZXcgQXNzZXJ0QmxvY2soYm9keSk7CiAgfQoKICBTdXBlcnR5cGUgcmVhZFN1cGVydHlwZSgpIHsKICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgcmV0dXJuIG5ldyBTdXBlcnR5cGUuYnlSZWZlcmVuY2UodHlwZS5jbGFzc05hbWUsIHR5cGUudHlwZUFyZ3VtZW50cyk7CiAgfQoKICBTdXBlcnR5cGUgcmVhZFN1cGVydHlwZU9wdGlvbigpIHsKICAgIHJldHVybiByZWFkQW5kQ2hlY2tPcHRpb25UYWcoKSA/IHJlYWRTdXBlcnR5cGUoKSA6IG51bGw7CiAgfQoKICBMaXN0PFN1cGVydHlwZT4gcmVhZFN1cGVydHlwZUxpc3QoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8U3VwZXJ0eXBlPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PFN1cGVydHlwZT4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkU3VwZXJ0eXBlKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTGlzdDxEYXJ0VHlwZT4gcmVhZERhcnRUeXBlTGlzdCgpIHsKICAgIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgTGlzdDxEYXJ0VHlwZT4gcmVzdWx0ID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkRGFydFR5cGUoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaXN0PE5hbWVkVHlwZT4gcmVhZE5hbWVkVHlwZUxpc3QoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8TmFtZWRUeXBlPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PE5hbWVkVHlwZT4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkTmFtZWRUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTmFtZWRUeXBlIHJlYWROYW1lZFR5cGUoKSB7CiAgICByZXR1cm4gbmV3IE5hbWVkVHlwZShyZWFkU3RyaW5nUmVmZXJlbmNlKCksIHJlYWREYXJ0VHlwZSgpKTsKICB9CgogIERhcnRUeXBlIHJlYWREYXJ0VHlwZU9wdGlvbigpIHsKICAgIHJldHVybiByZWFkQW5kQ2hlY2tPcHRpb25UYWcoKSA/IHJlYWREYXJ0VHlwZSgpIDogbnVsbDsKICB9CgogIERhcnRUeXBlIHJlYWREYXJ0VHlwZSgpIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgc3dpdGNoICh0YWcpIHsKICAgICAgY2FzZSBUYWcuVHlwZWRlZlR5cGU6CiAgICAgICAgcmV0dXJuIG5ldyBUeXBlZGVmVHlwZS5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZFR5cGVkZWZSZWZlcmVuY2UoKSwgcmVhZERhcnRUeXBlTGlzdCgpKTsKICAgICAgY2FzZSBUYWcuQm90dG9tVHlwZToKICAgICAgICByZXR1cm4gY29uc3QgQm90dG9tVHlwZSgpOwogICAgICBjYXNlIFRhZy5JbnZhbGlkVHlwZToKICAgICAgICByZXR1cm4gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgICAgY2FzZSBUYWcuRHluYW1pY1R5cGU6CiAgICAgICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIGNhc2UgVGFnLlZvaWRUeXBlOgogICAgICAgIHJldHVybiBjb25zdCBWb2lkVHlwZSgpOwogICAgICBjYXNlIFRhZy5JbnRlcmZhY2VUeXBlOgogICAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZS5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZENsYXNzUmVmZXJlbmNlKCksIHJlYWREYXJ0VHlwZUxpc3QoKSk7CiAgICAgIGNhc2UgVGFnLlNpbXBsZUludGVyZmFjZVR5cGU6CiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkQ2xhc3NSZWZlcmVuY2UoKSwgY29uc3QgPERhcnRUeXBlPltdKTsKICAgICAgY2FzZSBUYWcuRnVuY3Rpb25UeXBlOgogICAgICAgIGludCB0eXBlUGFyYW1ldGVyU3RhY2tIZWlnaHQgPSB0eXBlUGFyYW1ldGVyU3RhY2subGVuZ3RoOwogICAgICAgIHZhciB0eXBlUGFyYW1ldGVycyA9IHJlYWRBbmRQdXNoVHlwZVBhcmFtZXRlckxpc3QoKTsKICAgICAgICB2YXIgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9IHJlYWRVSW50KCk7CiAgICAgICAgdmFyIHRvdGFsUGFyYW1ldGVyQ291bnQgPSByZWFkVUludCgpOwogICAgICAgIHZhciBwb3NpdGlvbmFsID0gcmVhZERhcnRUeXBlTGlzdCgpOwogICAgICAgIHZhciBuYW1lZCA9IHJlYWROYW1lZFR5cGVMaXN0KCk7CiAgICAgICAgdmFyIHR5cGVkZWZUeXBlID0gcmVhZERhcnRUeXBlT3B0aW9uKCk7CiAgICAgICAgYXNzZXJ0KHBvc2l0aW9uYWwubGVuZ3RoICsgbmFtZWQubGVuZ3RoID09IHRvdGFsUGFyYW1ldGVyQ291bnQpOwogICAgICAgIHZhciByZXR1cm5UeXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgdHlwZVBhcmFtZXRlclN0YWNrLmxlbmd0aCA9IHR5cGVQYXJhbWV0ZXJTdGFja0hlaWdodDsKICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZShwb3NpdGlvbmFsLCByZXR1cm5UeXBlLAogICAgICAgICAgICB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWQsCiAgICAgICAgICAgIHR5cGVkZWZUeXBlOiB0eXBlZGVmVHlwZSk7CiAgICAgIGNhc2UgVGFnLlNpbXBsZUZ1bmN0aW9uVHlwZToKICAgICAgICB2YXIgcG9zaXRpb25hbCA9IHJlYWREYXJ0VHlwZUxpc3QoKTsKICAgICAgICB2YXIgcmV0dXJuVHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKHBvc2l0aW9uYWwsIHJldHVyblR5cGUpOwogICAgICBjYXNlIFRhZy5UeXBlUGFyYW1ldGVyVHlwZToKICAgICAgICBpbnQgaW5kZXggPSByZWFkVUludCgpOwogICAgICAgIHZhciBib3VuZCA9IHJlYWREYXJ0VHlwZU9wdGlvbigpOwogICAgICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUodHlwZVBhcmFtZXRlclN0YWNrW2luZGV4XSwgYm91bmQpOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IGZhaWwoJ3VuZXhwZWN0ZWQgZGFydCB0eXBlIHRhZzogJHRhZycpOwogICAgfQogIH0KCiAgTGlzdDxUeXBlUGFyYW1ldGVyPiByZWFkQW5kUHVzaFR5cGVQYXJhbWV0ZXJMaXN0KAogICAgICBbTGlzdDxUeXBlUGFyYW1ldGVyPiBsaXN0LCBUcmVlTm9kZSBwYXJlbnRdKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIGxpc3QgPz8gPFR5cGVQYXJhbWV0ZXI+W107CiAgICBpZiAobGlzdCA9PSBudWxsKSB7CiAgICAgIGxpc3QgPSBuZXcgTGlzdDxUeXBlUGFyYW1ldGVyPi5maWxsZWQobGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICBsaXN0W2ldID0gbmV3IFR5cGVQYXJhbWV0ZXIobnVsbCwgbnVsbCkuLnBhcmVudCA9IHBhcmVudDsKICAgICAgfQogICAgfSBlbHNlIGlmIChsaXN0Lmxlbmd0aCAhPSBsZW5ndGgpIHsKICAgICAgbGlzdC5sZW5ndGggPSBsZW5ndGg7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICBsaXN0W2ldID0gbmV3IFR5cGVQYXJhbWV0ZXIobnVsbCwgbnVsbCkuLnBhcmVudCA9IHBhcmVudDsKICAgICAgfQogICAgfQogICAgdHlwZVBhcmFtZXRlclN0YWNrLmFkZEFsbChsaXN0KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkgewogICAgICByZWFkVHlwZVBhcmFtZXRlcihsaXN0W2ldKTsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgdm9pZCByZWFkVHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIG5vZGUuZmxhZ3MgPSByZWFkQnl0ZSgpOwogICAgbm9kZS5hbm5vdGF0aW9ucyA9IHJlYWRBbm5vdGF0aW9uTGlzdChub2RlKTsKICAgIG5vZGUubmFtZSA9IHJlYWRTdHJpbmdPck51bGxJZkVtcHR5KCk7CiAgICBub2RlLmJvdW5kID0gcmVhZERhcnRUeXBlKCk7CiAgICBub2RlLmRlZmF1bHRUeXBlID0gcmVhZERhcnRUeXBlT3B0aW9uKCk7CiAgfQoKICBBcmd1bWVudHMgcmVhZEFyZ3VtZW50cygpIHsKICAgIHZhciBudW1Bcmd1bWVudHMgPSByZWFkVUludCgpOwogICAgdmFyIHR5cGVBcmd1bWVudHMgPSByZWFkRGFydFR5cGVMaXN0KCk7CiAgICB2YXIgcG9zaXRpb25hbCA9IHJlYWRFeHByZXNzaW9uTGlzdCgpOwogICAgdmFyIG5hbWVkID0gcmVhZE5hbWVkRXhwcmVzc2lvbkxpc3QoKTsKICAgIGFzc2VydChudW1Bcmd1bWVudHMgPT0gcG9zaXRpb25hbC5sZW5ndGggKyBuYW1lZC5sZW5ndGgpOwogICAgcmV0dXJuIG5ldyBBcmd1bWVudHMocG9zaXRpb25hbCwgdHlwZXM6IHR5cGVBcmd1bWVudHMsIG5hbWVkOiBuYW1lZCk7CiAgfQoKICBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gcmVhZE5hbWVkRXhwcmVzc2lvbkxpc3QoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8TmFtZWRFeHByZXNzaW9uPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PE5hbWVkRXhwcmVzc2lvbj4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkTmFtZWRFeHByZXNzaW9uKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTmFtZWRFeHByZXNzaW9uIHJlYWROYW1lZEV4cHJlc3Npb24oKSB7CiAgICByZXR1cm4gbmV3IE5hbWVkRXhwcmVzc2lvbihyZWFkU3RyaW5nUmVmZXJlbmNlKCksIHJlYWRFeHByZXNzaW9uKCkpOwogIH0KCiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiByZWFkQW5kUHVzaFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkQW5kUHVzaFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbk9wdGlvbigpIHsKICAgIHJldHVybiByZWFkQW5kQ2hlY2tPcHRpb25UYWcoKSA/IHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbigpIDogbnVsbDsKICB9CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uKCkgewogICAgdmFyIHZhcmlhYmxlID0gcmVhZFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgIHZhcmlhYmxlU3RhY2suYWRkKHZhcmlhYmxlKTsKICAgIHJldHVybiB2YXJpYWJsZTsKICB9CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZFZhcmlhYmxlRGVjbGFyYXRpb24oKSB7CiAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgaW50IGZpbGVFcXVhbHNPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAvLyBUaGUgW1ZhcmlhYmxlRGVjbGFyYXRpb25dIGluc3RhbmNlIGlzIG5vdCBjcmVhdGVkIGF0IHRoaXMgcG9pbnQgeWV0LAogICAgLy8gc28gYG51bGxgIGlzIHRlbXBvcmFyaWx5IHNldCBhcyB0aGUgcGFyZW50IG9mIHRoZSBhbm5vdGF0aW9uIG5vZGVzLgogICAgdmFyIGFubm90YXRpb25zID0gcmVhZEFubm90YXRpb25MaXN0KG51bGwpOwogICAgaW50IGZsYWdzID0gcmVhZEJ5dGUoKTsKICAgIHZhciBub2RlID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24ocmVhZFN0cmluZ09yTnVsbElmRW1wdHkoKSwKICAgICAgICB0eXBlOiByZWFkRGFydFR5cGUoKSwgaW5pdGlhbGl6ZXI6IHJlYWRFeHByZXNzaW9uT3B0aW9uKCksIGZsYWdzOiBmbGFncykKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0CiAgICAgIC4uZmlsZUVxdWFsc09mZnNldCA9IGZpbGVFcXVhbHNPZmZzZXQ7CiAgICBpZiAoYW5ub3RhdGlvbnMuaXNOb3RFbXB0eSkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tpXTsKICAgICAgICBhbm5vdGF0aW9uLnBhcmVudCA9IG5vZGU7CiAgICAgIH0KICAgICAgbm9kZS5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBpbnQgcmVhZE9mZnNldCgpIHsKICAgIC8vIE9mZnNldCBpcyBzYXZlZCBhcyB1bnNpZ25lZCwKICAgIC8vIGJ1dCBhY3R1YWxseSByYW5nZXMgZnJvbSAtMSBhbmQgdXAgKHRodXMgdGhlIC0xKQogICAgcmV0dXJuIHJlYWRVSW50KCkgLSAxOwogIH0KfQoKY2xhc3MgQmluYXJ5QnVpbGRlcldpdGhNZXRhZGF0YSBleHRlbmRzIEJpbmFyeUJ1aWxkZXIgaW1wbGVtZW50cyBCaW5hcnlTb3VyY2UgewogIC8vLyBMaXN0IG9mIG1ldGFkYXRhIHN1YnNlY3Rpb25zIHRoYXQgaGF2ZSBjb3JyZXNwb25kaW5nIFtNZXRhZGF0YVJlcG9zaXRvcnldCiAgLy8vIGFuZCBhcmUgYXdhaXRpbmcgdG8gYmUgcGFyc2VkIGFuZCBhdHRhY2hlZCB0byBub2Rlcy4KICBMaXN0PF9NZXRhZGF0YVN1YnNlY3Rpb24+IF9zdWJzZWN0aW9uczsKCiAgQmluYXJ5QnVpbGRlcldpdGhNZXRhZGF0YShieXRlcywgW2ZpbGVuYW1lXSkKICAgICAgOiBzdXBlcihieXRlcywgZmlsZW5hbWU6IGZpbGVuYW1lKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBfcmVhZE1ldGFkYXRhTWFwcGluZ3MoCiAgICAgIENvbXBvbmVudCBjb21wb25lbnQsIGludCBiaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzKSB7CiAgICAvLyBBdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZnVuY3Rpb24gX2J5dGVPZmZzZXQgcG9pbnRzIHJpZ2h0IHBhc3QKICAgIC8vIG1ldGFkYXRhTWFwcGluZ3MgdG8gc3RyaW5nIHRhYmxlLgoKICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiBtZXRhZGF0YU1hcHBpbmdzLgogICAgX2J5dGVPZmZzZXQgLT0gNDsKICAgIGZpbmFsIHN1YlNlY3Rpb25Db3VudCA9IHJlYWRVaW50MzIoKTsKCiAgICBpbnQgZW5kT2Zmc2V0ID0gX2J5dGVPZmZzZXQgLSA0OyAvLyBFbmQgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24uCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YlNlY3Rpb25Db3VudDsgaSsrKSB7CiAgICAgIC8vIFJMaXN0PFBhaXI8VUludDMyLCBVSW50MzI+PiBub2RlT2Zmc2V0VG9NZXRhZGF0YU9mZnNldAogICAgICBfYnl0ZU9mZnNldCA9IGVuZE9mZnNldCAtIDQ7CiAgICAgIGZpbmFsIG1hcHBpbmdMZW5ndGggPSByZWFkVWludDMyKCk7CiAgICAgIGZpbmFsIG1hcHBpbmdTdGFydCA9IChlbmRPZmZzZXQgLSA0KSAtIDQgKiAyICogbWFwcGluZ0xlbmd0aDsKICAgICAgX2J5dGVPZmZzZXQgPSBtYXBwaW5nU3RhcnQgLSA0OwoKICAgICAgLy8gVUludDMyIHRhZyAoZml4ZWQgc2l6ZSBTdHJpbmdSZWZlcmVuY2UpCiAgICAgIGZpbmFsIHRhZyA9IF9zdHJpbmdUYWJsZVtyZWFkVWludDMyKCldOwoKICAgICAgZmluYWwgcmVwb3NpdG9yeSA9IGNvbXBvbmVudC5tZXRhZGF0YVt0YWddOwogICAgICBpZiAocmVwb3NpdG9yeSAhPSBudWxsKSB7CiAgICAgICAgLy8gUmVhZCBub2RlT2Zmc2V0VG9NZXRhZGF0YU9mZnNldCBtYXBwaW5nLgogICAgICAgIGZpbmFsIG1hcHBpbmcgPSA8aW50LCBpbnQ+e307CiAgICAgICAgX2J5dGVPZmZzZXQgPSBtYXBwaW5nU3RhcnQ7CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtYXBwaW5nTGVuZ3RoOyBqKyspIHsKICAgICAgICAgIGZpbmFsIG5vZGVPZmZzZXQgPSByZWFkVWludDMyKCk7CiAgICAgICAgICBmaW5hbCBtZXRhZGF0YU9mZnNldCA9IGJpbmFyeU9mZnNldEZvck1ldGFkYXRhUGF5bG9hZHMgKyByZWFkVWludDMyKCk7CiAgICAgICAgICBtYXBwaW5nW25vZGVPZmZzZXRdID0gbWV0YWRhdGFPZmZzZXQ7CiAgICAgICAgfQoKICAgICAgICBfc3Vic2VjdGlvbnMgPz89IDxfTWV0YWRhdGFTdWJzZWN0aW9uPltdOwogICAgICAgIF9zdWJzZWN0aW9ucy5hZGQobmV3IF9NZXRhZGF0YVN1YnNlY3Rpb24ocmVwb3NpdG9yeSwgbWFwcGluZykpOwogICAgICB9CgogICAgICAvLyBTdGFydCBvZiB0aGUgc3Vic2VjdGlvbiBhbmQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgb25lLgogICAgICBlbmRPZmZzZXQgPSBtYXBwaW5nU3RhcnQgLSA0OwogICAgfQogIH0KCiAgT2JqZWN0IF9yZWFkTWV0YWRhdGEoTm9kZSBub2RlLCBNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgaW50IG9mZnNldCkgewogICAgZmluYWwgaW50IHNhdmVkT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBfYnl0ZU9mZnNldCA9IG9mZnNldDsKCiAgICBmaW5hbCBtZXRhZGF0YSA9IHJlcG9zaXRvcnkucmVhZEZyb21CaW5hcnkobm9kZSwgdGhpcyk7CgogICAgX2J5dGVPZmZzZXQgPSBzYXZlZE9mZnNldDsKICAgIHJldHVybiBtZXRhZGF0YTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW50ZXJTY29wZSh7TGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyc30pIHsKICAgIGlmICh0eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIHR5cGVQYXJhbWV0ZXJTdGFjay5hZGRBbGwodHlwZVBhcmFtZXRlcnMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsZWF2ZVNjb3BlKHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzfSkgewogICAgaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgdHlwZVBhcmFtZXRlclN0YWNrLmxlbmd0aCAtPSB0eXBlUGFyYW1ldGVycy5sZW5ndGg7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBOb2RlIF9hc3NvY2lhdGVNZXRhZGF0YShOb2RlIG5vZGUsIGludCBub2RlT2Zmc2V0KSB7CiAgICBpZiAoX3N1YnNlY3Rpb25zID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgZm9yICh2YXIgc3Vic2VjdGlvbiBpbiBfc3Vic2VjdGlvbnMpIHsKICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgYW55IG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCiAgICAgIGZpbmFsIG1ldGFkYXRhT2Zmc2V0ID0gc3Vic2VjdGlvbi5tYXBwaW5nW25vZGVPZmZzZXRdOwogICAgICBpZiAobWV0YWRhdGFPZmZzZXQgIT0gbnVsbCkgewogICAgICAgIHN1YnNlY3Rpb24ucmVwb3NpdG9yeS5tYXBwaW5nW25vZGVdID0KICAgICAgICAgICAgX3JlYWRNZXRhZGF0YShub2RlLCBzdWJzZWN0aW9uLnJlcG9zaXRvcnksIG1ldGFkYXRhT2Zmc2V0KTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgcmVhZERhcnRUeXBlKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZERhcnRUeXBlKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5IHJlYWRMaWJyYXJ5KENvbXBvbmVudCBjb21wb25lbnQsIGludCBlbmRPZmZzZXQpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRMaWJyYXJ5KGNvbXBvbmVudCwgZW5kT2Zmc2V0KTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVkZWYgcmVhZFR5cGVkZWYoKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkVHlwZWRlZigpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3MgcmVhZENsYXNzKGludCBlbmRPZmZzZXQpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRDbGFzcyhlbmRPZmZzZXQpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRmllbGQgcmVhZEZpZWxkKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZEZpZWxkKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvciByZWFkQ29uc3RydWN0b3IoKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkQ29uc3RydWN0b3IoKTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIFByb2NlZHVyZSByZWFkUHJvY2VkdXJlKGludCBlbmRPZmZzZXQpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRQcm9jZWR1cmUoZW5kT2Zmc2V0KTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIHJlYWRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcigpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcigpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXIgcmVhZEluaXRpYWxpemVyKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZEluaXRpYWxpemVyKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbk5vZGUgcmVhZEZ1bmN0aW9uTm9kZSgKICAgICAge2Jvb2wgbGF6eUxvYWRCb2R5OiBmYWxzZSwgaW50IG91dGVyRW5kT2Zmc2V0OiAtMX0pIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRGdW5jdGlvbk5vZGUoCiAgICAgICAgbGF6eUxvYWRCb2R5OiBsYXp5TG9hZEJvZHksIG91dGVyRW5kT2Zmc2V0OiBvdXRlckVuZE9mZnNldCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHJlYWRFeHByZXNzaW9uKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZEV4cHJlc3Npb24oKTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIEFyZ3VtZW50cyByZWFkQXJndW1lbnRzKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZEFyZ3VtZW50cygpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgTmFtZWRFeHByZXNzaW9uIHJlYWROYW1lZEV4cHJlc3Npb24oKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkTmFtZWRFeHByZXNzaW9uKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlYWRWYXJpYWJsZURlY2xhcmF0aW9uKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudCByZWFkU3RhdGVtZW50KCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZFN0YXRlbWVudCgpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29tYmluYXRvciByZWFkQ29tYmluYXRvcigpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRDb21iaW5hdG9yKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RGVwZW5kZW5jeSByZWFkTGlicmFyeURlcGVuZGVuY3koTGlicmFyeSBsaWJyYXJ5KSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkTGlicmFyeURlcGVuZGVuY3kobGlicmFyeSk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5UGFydCByZWFkTGlicmFyeVBhcnQoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkTGlicmFyeVBhcnQobGlicmFyeSk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRTd2l0Y2hDYXNlSW50byhTd2l0Y2hDYXNlIGNhc2VOb2RlKSB7CiAgICBfYXNzb2NpYXRlTWV0YWRhdGEoY2FzZU5vZGUsIF9ieXRlT2Zmc2V0KTsKICAgIHN1cGVyLnJlYWRTd2l0Y2hDYXNlSW50byhjYXNlTm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRUeXBlUGFyYW1ldGVyKFR5cGVQYXJhbWV0ZXIgcGFyYW0pIHsKICAgIF9hc3NvY2lhdGVNZXRhZGF0YShwYXJhbSwgX2J5dGVPZmZzZXQpOwogICAgc3VwZXIucmVhZFR5cGVQYXJhbWV0ZXIocGFyYW0pOwogIH0KCiAgQG92ZXJyaWRlCiAgU3VwZXJ0eXBlIHJlYWRTdXBlcnR5cGUoKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBJbnRlcmZhY2VUeXBlIHR5cGUgPSBzdXBlci5yZWFkRGFydFR5cGUoKTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEoCiAgICAgICAgbmV3IFN1cGVydHlwZS5ieVJlZmVyZW5jZSh0eXBlLmNsYXNzTmFtZSwgdHlwZS50eXBlQXJndW1lbnRzKSwKICAgICAgICBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIE5hbWUgcmVhZE5hbWUoKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5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YXNzIE5vcm1hbE5hbWVyPFQ+IGV4dGVuZHMgTmFtZXI8VD4gewogIGZpbmFsIFN0cmluZyBwcmVmaXg7CiAgTm9ybWFsTmFtZXIodGhpcy5wcmVmaXgpOwp9CgpjbGFzcyBDb25zdGFudE5hbWVyIGV4dGVuZHMgUmVjdXJzaXZlVmlzaXRvcjxOdWxsPiB3aXRoIE5hbWVyPENvbnN0YW50PiB7CiAgZmluYWwgU3RyaW5nIHByZWZpeDsKICBDb25zdGFudE5hbWVyKHRoaXMucHJlZml4KTsKCiAgU3RyaW5nIGdldE5hbWUoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGlmICghbWFwLmNvbnRhaW5zS2V5KGNvbnN0YW50KSkgewogICAgICAvLyBOYW1lIGV2ZXJ5dGhpbmcgaW4gcG9zdC1vcmRlciB2aXNpdCBvZiBEQUcuCiAgICAgIGNvbnN0YW50LnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZShjb25zdGFudCk7CiAgfQoKICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2UoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGdldE5hbWUoY29uc3RhbnQpOwogIH0KfQoKY2xhc3MgRGlzYW1iaWd1YXRvcjxULCBVPiB7CiAgZmluYWwgTWFwPFQsIFN0cmluZz4gbmFtZXNUID0gPFQsIFN0cmluZz57fTsKICBmaW5hbCBNYXA8VSwgU3RyaW5nPiBuYW1lc1UgPSA8VSwgU3RyaW5nPnt9OwogIGZpbmFsIFNldDxTdHJpbmc+IHVzZWROYW1lcyA9IG5ldyBTZXQ8U3RyaW5nPigpOwoKICBTdHJpbmcgZGlzYW1iaWd1YXRlKFQga2V5MSwgVSBrZXkyLCBTdHJpbmcgcHJvcG9zZU5hbWUoKSkgewogICAgZ2V0TmV3TmFtZSgpIHsKICAgICAgdmFyIHByb3Bvc2VkTmFtZSA9IHByb3Bvc2VOYW1lKCk7CiAgICAgIGlmICh1c2VkTmFtZXMuYWRkKHByb3Bvc2VkTmFtZSkpIHJldHVybiBwcm9wb3NlZE5hbWU7CiAgICAgIGludCBpID0gMjsKICAgICAgd2hpbGUgKCF1c2VkTmFtZXMuYWRkKCckcHJvcG9zZWROYW1lJGknKSkgewogICAgICAgICsraTsKICAgICAgfQogICAgICByZXR1cm4gJyRwcm9wb3NlZE5hbWUkaSc7CiAgICB9CgogICAgaWYgKGtleTEgIT0gbnVsbCkgewogICAgICBTdHJpbmcgcmVzdWx0ID0gbmFtZXNUW2tleTFdOwogICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CiAgICAgIHJldHVybiBuYW1lc1Rba2V5MV0gPSBnZXROZXdOYW1lKCk7CiAgICB9CiAgICBpZiAoa2V5MiAhPSBudWxsKSB7CiAgICAgIFN0cmluZyByZXN1bHQgPSBuYW1lc1Vba2V5Ml07CiAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgcmV0dXJuIHJlc3VsdDsKICAgICAgcmV0dXJuIG5hbWVzVVtrZXkyXSA9IGdldE5ld05hbWUoKTsKICAgIH0KICAgIHRocm93ICJDYW5ub3QgZGlzYW1iaWd1YXRlIjsKICB9Cn0KCk5hbWVTeXN0ZW0gZ2xvYmFsRGVidWdnaW5nTmFtZXMgPSBuZXcgTmFtZVN5c3RlbSgpOwoKU3RyaW5nIGRlYnVnTGlicmFyeU5hbWUoTGlicmFyeSBub2RlKSB7CiAgcmV0dXJuIG5vZGUgPT0gbnVsbAogICAgICA/ICdudWxsJwogICAgICA6IG5vZGUubmFtZSA/PyBnbG9iYWxEZWJ1Z2dpbmdOYW1lcy5uYW1lTGlicmFyeShub2RlKTsKfQoKU3RyaW5nIGRlYnVnQ2xhc3NOYW1lKENsYXNzIG5vZGUpIHsKICByZXR1cm4gbm9kZSA9PSBudWxsCiAgICAgID8gJ251bGwnCiAgICAgIDogbm9kZS5uYW1lID8/IGdsb2JhbERlYnVnZ2luZ05hbWVzLm5hbWVDbGFzcyhub2RlKTsKfQoKU3RyaW5nIGRlYnVnUXVhbGlmaWVkQ2xhc3NOYW1lKENsYXNzIG5vZGUpIHsKICByZXR1cm4gZGVidWdMaWJyYXJ5TmFtZShub2RlLmVuY2xvc2luZ0xpYnJhcnkpICsgJzo6JyArIGRlYnVnQ2xhc3NOYW1lKG5vZGUpOwp9CgpTdHJpbmcgZGVidWdNZW1iZXJOYW1lKE1lbWJlciBub2RlKSB7CiAgcmV0dXJuIG5vZGUubmFtZT8ubmFtZSA/PyBnbG9iYWxEZWJ1Z2dpbmdOYW1lcy5uYW1lTWVtYmVyKG5vZGUpOwp9CgpTdHJpbmcgZGVidWdRdWFsaWZpZWRNZW1iZXJOYW1lKE1lbWJlciBub2RlKSB7CiAgaWYgKG5vZGUuZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgcmV0dXJuIGRlYnVnUXVhbGlmaWVkQ2xhc3NOYW1lKG5vZGUuZW5jbG9zaW5nQ2xhc3MpICsKICAgICAgICAnOjonICsKICAgICAgICBkZWJ1Z01lbWJlck5hbWUobm9kZSk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBkZWJ1Z0xpYnJhcnlOYW1lKG5vZGUuZW5jbG9zaW5nTGlicmFyeSkgKwogICAgICAgICc6OicgKwogICAgICAgIGRlYnVnTWVtYmVyTmFtZShub2RlKTsKICB9Cn0KClN0cmluZyBkZWJ1Z1R5cGVQYXJhbWV0ZXJOYW1lKFR5cGVQYXJhbWV0ZXIgbm9kZSkgewogIHJldHVybiBub2RlLm5hbWUgPz8gZ2xvYmFsRGVidWdnaW5nTmFtZXMubmFtZVR5cGVQYXJhbWV0ZXIobm9kZSk7Cn0KClN0cmluZyBkZWJ1Z1F1YWxpZmllZFR5cGVQYXJhbWV0ZXJOYW1lKFR5cGVQYXJhbWV0ZXIgbm9kZSkgewogIGlmIChub2RlLnBhcmVudCBpcyBDbGFzcykgewogICAgcmV0dXJuIGRlYnVnUXVhbGlmaWVkQ2xhc3NOYW1lKG5vZGUucGFyZW50KSArCiAgICAgICAgJzo6JyArCiAgICAgICAgZGVidWdUeXBlUGFyYW1ldGVyTmFtZShub2RlKTsKICB9CiAgaWYgKG5vZGUucGFyZW50IGlzIE1lbWJlcikgewogICAgcmV0dXJuIGRlYnVnUXVhbGlmaWVkTWVtYmVyTmFtZShub2RlLnBhcmVudCkgKwogICAgICAgICc6OicgKwogICAgICAgIGRlYnVnVHlwZVBhcmFtZXRlck5hbWUobm9kZSk7CiAgfQogIHJldHVybiBkZWJ1Z1R5cGVQYXJhbWV0ZXJOYW1lKG5vZGUpOwp9CgpTdHJpbmcgZGVidWdWYXJpYWJsZURlY2xhcmF0aW9uTmFtZShWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICByZXR1cm4gbm9kZS5uYW1lID8/IGdsb2JhbERlYnVnZ2luZ05hbWVzLm5hbWVWYXJpYWJsZShub2RlKTsKfQoKU3RyaW5nIGRlYnVnTm9kZVRvU3RyaW5nKE5vZGUgbm9kZSkgewogIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgbmV3IFByaW50ZXIoYnVmZmVyLCBzeW50aGV0aWNOYW1lczogZ2xvYmFsRGVidWdnaW5nTmFtZXMpLndyaXRlTm9kZShub2RlKTsKICByZXR1cm4gJyRidWZmZXInOwp9CgpTdHJpbmcgY29tcG9uZW50VG9TdHJpbmcoQ29tcG9uZW50IG5vZGUpIHsKICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogIG5ldyBQcmludGVyKGJ1ZmZlciwgc3ludGhldGljTmFtZXM6IG5ldyBOYW1lU3lzdGVtKCkpCiAgICAgIC53cml0ZUNvbXBvbmVudEZpbGUobm9kZSk7CiAgcmV0dXJuICckYnVmZmVyJzsKfQoKY2xhc3MgTmFtZVN5c3RlbSB7CiAgZmluYWwgTmFtZXI8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzID0KICAgICAgbmV3IE5vcm1hbE5hbWVyPFZhcmlhYmxlRGVjbGFyYXRpb24+KCcjdCcpOwogIGZpbmFsIE5hbWVyPE1lbWJlcj4gbWVtYmVycyA9IG5ldyBOb3JtYWxOYW1lcjxNZW1iZXI+KCcjbScpOwogIGZpbmFsIE5hbWVyPENsYXNzPiBjbGFzc2VzID0gbmV3IE5vcm1hbE5hbWVyPENsYXNzPignI2NsYXNzJyk7CiAgZmluYWwgTmFtZXI8TGlicmFyeT4gbGlicmFyaWVzID0gbmV3IE5vcm1hbE5hbWVyPExpYnJhcnk+KCcjbGliJyk7CiAgZmluYWwgTmFtZXI8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPQogICAgICBuZXcgTm9ybWFsTmFtZXI8VHlwZVBhcmFtZXRlcj4oJyNUJyk7CiAgZmluYWwgTmFtZXI8VHJlZU5vZGU+IGxhYmVscyA9IG5ldyBOb3JtYWxOYW1lcjxUcmVlTm9kZT4oJyNMJyk7CiAgZmluYWwgTmFtZXI8Q29uc3RhbnQ+IGNvbnN0YW50cyA9IG5ldyBDb25zdGFudE5hbWVyKCcjQycpOwogIGZpbmFsIERpc2FtYmlndWF0b3I8UmVmZXJlbmNlLCBDYW5vbmljYWxOYW1lPiBwcmVmaXhlcyA9CiAgICAgIG5ldyBEaXNhbWJpZ3VhdG9yPFJlZmVyZW5jZSwgQ2Fub25pY2FsTmFtZT4oKTsKCiAgbmFtZVZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgPT4gdmFyaWFibGVzLmdldE5hbWUobm9kZSk7CiAgbmFtZU1lbWJlcihNZW1iZXIgbm9kZSkgPT4gbWVtYmVycy5nZXROYW1lKG5vZGUpOwogIG5hbWVDbGFzcyhDbGFzcyBub2RlKSA9PiBjbGFzc2VzLmdldE5hbWUobm9kZSk7CiAgbmFtZUxpYnJhcnkoTGlicmFyeSBub2RlKSA9PiBsaWJyYXJpZXMuZ2V0TmFtZShub2RlKTsKICBuYW1lVHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpID0+IHR5cGVQYXJhbWV0ZXJzLmdldE5hbWUobm9kZSk7CiAgbmFtZVN3aXRjaENhc2UoU3dpdGNoQ2FzZSBub2RlKSA9PiBsYWJlbHMuZ2V0TmFtZShub2RlKTsKICBuYW1lTGFiZWxlZFN0YXRlbWVudChMYWJlbGVkU3RhdGVtZW50IG5vZGUpID0+IGxhYmVscy5nZXROYW1lKG5vZGUpOwogIG5hbWVDb25zdGFudChDb25zdGFudCBub2RlKSA9PiBjb25zdGFudHMuZ2V0TmFtZShub2RlKTsKCiAgZmluYWwgUmVnRXhwIHBhdGhTZXBhcmF0b3IgPSBuZXcgUmVnRXhwKCdbXFwvXScpOwoKICBuYW1lTGlicmFyeVByZWZpeChMaWJyYXJ5IG5vZGUsIHtTdHJpbmcgcHJvcG9zZWROYW1lfSkgewogICAgcmV0dXJuIHByZWZpeGVzLmRpc2FtYmlndWF0ZShub2RlLnJlZmVyZW5jZSwgbm9kZS5yZWZlcmVuY2UuY2Fub25pY2FsTmFtZSwKICAgICAgICAoKSB7CiAgICAgIGlmIChwcm9wb3NlZE5hbWUgIT0gbnVsbCkgcmV0dXJuIHByb3Bvc2VkTmFtZTsKICAgICAgaWYgKG5vZGUubmFtZSAhPSBudWxsKSByZXR1cm4gYWJicmV2aWF0ZU5hbWUobm9kZS5uYW1lKTsKICAgICAgaWYgKG5vZGUuaW1wb3J0VXJpICE9IG51bGwpIHsKICAgICAgICB2YXIgcGF0aCA9IG5vZGUuaW1wb3J0VXJpLmhhc0VtcHR5UGF0aAogICAgICAgICAgICA/ICcke25vZGUuaW1wb3J0VXJpfScKICAgICAgICAgICAgOiBub2RlLmltcG9ydFVyaS5wYXRoU2VnbWVudHMubGFzdDsKICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgnLmRhcnQnKSkgewogICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gJy5kYXJ0Jy5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWJicmV2aWF0ZU5hbWUocGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuICdMJzsKICAgIH0pOwogIH0KCiAgbmFtZUNhbm9uaWNhbE5hbWVBc0xpYnJhcnlQcmVmaXgoUmVmZXJlbmNlIG5vZGUsIENhbm9uaWNhbE5hbWUgbmFtZSwKICAgICAge1N0cmluZyBwcm9wb3NlZE5hbWV9KSB7CiAgICByZXR1cm4gcHJlZml4ZXMuZGlzYW1iaWd1YXRlKG5vZGUsIG5hbWUsICgpIHsKICAgICAgaWYgKHByb3Bvc2VkTmFtZSAhPSBudWxsKSByZXR1cm4gcHJvcG9zZWROYW1lOwogICAgICBDYW5vbmljYWxOYW1lIGNhbm9uaWNhbE5hbWUgPSBuYW1lID8/IG5vZGUuY2Fub25pY2FsTmFtZTsKICAgICAgaWYgKGNhbm9uaWNhbE5hbWU/Lm5hbWUgIT0gbnVsbCkgewogICAgICAgIHZhciBwYXRoID0gY2Fub25pY2FsTmFtZS5uYW1lOwogICAgICAgIGludCBzbGFzaCA9IHBhdGgubGFzdEluZGV4T2YocGF0aFNlcGFyYXRvcik7CiAgICAgICAgaWYgKHNsYXNoID49IDApIHsKICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhzbGFzaCArIDEpOwogICAgICAgIH0KICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgnLmRhcnQnKSkgewogICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gJy5kYXJ0Jy5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWJicmV2aWF0ZU5hbWUocGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuICdMJzsKICAgIH0pOwogIH0KCiAgZmluYWwgUmVnRXhwIHB1bmN0dWF0aW9uID0gbmV3IFJlZ0V4cCgnWy46XScpOwoKICBTdHJpbmcgYWJicmV2aWF0ZU5hbWUoU3RyaW5nIG5hbWUpIHsKICAgIGludCBkb3QgPSBuYW1lLmxhc3RJbmRleE9mKHB1bmN0dWF0aW9uKTsKICAgIGlmIChkb3QgIT0gLTEpIHsKICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGRvdCArIDEpOwogICAgfQogICAgaWYgKG5hbWUubGVuZ3RoID4gNCkgewogICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgMyk7CiAgICB9CiAgICByZXR1cm4gbmFtZTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEFubm90YXRvciB7CiAgU3RyaW5nIGFubm90YXRlVmFyaWFibGUoUHJpbnRlciBwcmludGVyLCBWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpOwogIFN0cmluZyBhbm5vdGF0ZVJldHVybihQcmludGVyIHByaW50ZXIsIEZ1bmN0aW9uTm9kZSBub2RlKTsKICBTdHJpbmcgYW5ub3RhdGVGaWVsZChQcmludGVyIHByaW50ZXIsIEZpZWxkIG5vZGUpOwp9CgovLy8gQSBxdWljayBhbmQgZGlydHkgYW1iaWd1b3VzIHRleHQgcHJpbnRlci4KY2xhc3MgUHJpbnRlciBleHRlbmRzIFZpc2l0b3I8TnVsbD4gewogIGZpbmFsIE5hbWVTeXN0ZW0gc3ludGhldGljTmFtZXM7CiAgZmluYWwgU3RyaW5nU2luayBzaW5rOwogIGZpbmFsIEFubm90YXRvciBhbm5vdGF0b3I7CiAgZmluYWwgTWFwPFN0cmluZywgTWV0YWRhdGFSZXBvc2l0b3J5PE9iamVjdD4+IG1ldGFkYXRhOwogIEltcG9ydFRhYmxlIGltcG9ydFRhYmxlOwogIGludCBpbmRlbnRhdGlvbiA9IDA7CiAgaW50IGNvbHVtbiA9IDA7CiAgYm9vbCBzaG93RXh0ZXJuYWw7CiAgYm9vbCBzaG93T2Zmc2V0czsKICBib29sIHNob3dNZXRhZGF0YTsKCiAgc3RhdGljIGludCBTUEFDRSA9IDA7CiAgc3RhdGljIGludCBXT1JEID0gMTsKICBzdGF0aWMgaW50IFNZTUJPTCA9IDI7CiAgaW50IHN0YXRlID0gU1BBQ0U7CgogIFByaW50ZXIodGhpcy5zaW5rLAogICAgICB7TmFtZVN5c3RlbSBzeW50aGV0aWNOYW1lcywKICAgICAgdGhpcy5zaG93RXh0ZXJuYWwsCiAgICAgIHRoaXMuc2hvd09mZnNldHM6IGZhbHNlLAogICAgICB0aGlzLnNob3dNZXRhZGF0YTogZmFsc2UsCiAgICAgIHRoaXMuaW1wb3J0VGFibGUsCiAgICAgIHRoaXMuYW5ub3RhdG9yLAogICAgICB0aGlzLm1ldGFkYXRhfSkKICAgICAgOiB0aGlzLnN5bnRoZXRpY05hbWVzID0gc3ludGhldGljTmFtZXMgPz8gbmV3IE5hbWVTeXN0ZW0oKTsKCiAgUHJpbnRlciBjcmVhdGVJbm5lcihJbXBvcnRUYWJsZSBpbXBvcnRUYWJsZSwKICAgICAgTWFwPFN0cmluZywgTWV0YWRhdGFSZXBvc2l0b3J5PE9iamVjdD4+IG1ldGFkYXRhKSB7CiAgICByZXR1cm4gbmV3IFByaW50ZXIoc2luaywKICAgICAgICBpbXBvcnRUYWJsZTogaW1wb3J0VGFibGUsCiAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhLAogICAgICAgIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcywKICAgICAgICBhbm5vdGF0b3I6IGFubm90YXRvciwKICAgICAgICBzaG93RXh0ZXJuYWw6IHNob3dFeHRlcm5hbCwKICAgICAgICBzaG93T2Zmc2V0czogc2hvd09mZnNldHMsCiAgICAgICAgc2hvd01ldGFkYXRhOiBzaG93TWV0YWRhdGEpOwogIH0KCiAgYm9vbCBzaG91bGRIaWdobGlnaHQoTm9kZSBub2RlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIHN0YXJ0SGlnaGxpZ2h0KE5vZGUgbm9kZSkge30KICB2b2lkIGVuZEhpZ2hsaWdodChOb2RlIG5vZGUpIHt9CgogIFN0cmluZyBnZXRMaWJyYXJ5TmFtZShMaWJyYXJ5IG5vZGUpIHsKICAgIHJldHVybiBub2RlLm5hbWUgPz8gc3ludGhldGljTmFtZXMubmFtZUxpYnJhcnkobm9kZSk7CiAgfQoKICBTdHJpbmcgZ2V0TGlicmFyeVJlZmVyZW5jZShMaWJyYXJ5IG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiAnPE5vIExpYnJhcnk+JzsKICAgIGlmIChpbXBvcnRUYWJsZSAhPSBudWxsICYmIGltcG9ydFRhYmxlLmdldEltcG9ydEluZGV4KG5vZGUpICE9IC0xKSB7CiAgICAgIHJldHVybiBzeW50aGV0aWNOYW1lcy5uYW1lTGlicmFyeVByZWZpeChub2RlKTsKICAgIH0KICAgIHJldHVybiBnZXRMaWJyYXJ5TmFtZShub2RlKTsKICB9CgogIFN0cmluZyBnZXRDbGFzc05hbWUoQ2xhc3Mgbm9kZSkgewogICAgcmV0dXJuIG5vZGUubmFtZSA/PyBzeW50aGV0aWNOYW1lcy5uYW1lQ2xhc3Mobm9kZSk7CiAgfQoKICBTdHJpbmcgZ2V0Q2xhc3NSZWZlcmVuY2UoQ2xhc3Mgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuICc8Tm8gQ2xhc3M+JzsKICAgIFN0cmluZyBuYW1lID0gZ2V0Q2xhc3NOYW1lKG5vZGUpOwogICAgU3RyaW5nIGxpYnJhcnkgPSBnZXRMaWJyYXJ5UmVmZXJlbmNlKG5vZGUuZW5jbG9zaW5nTGlicmFyeSk7CiAgICByZXR1cm4gJyRsaWJyYXJ5OjokbmFtZSc7CiAgfQoKICBTdHJpbmcgZ2V0VHlwZWRlZlJlZmVyZW5jZShUeXBlZGVmIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiAnPE5vIFR5cGVkZWY+JzsKICAgIFN0cmluZyBsaWJyYXJ5ID0gZ2V0TGlicmFyeVJlZmVyZW5jZShub2RlLmVuY2xvc2luZ0xpYnJhcnkpOwogICAgcmV0dXJuICckbGlicmFyeTo6JHtub2RlLm5hbWV9JzsKICB9CgogIHN0YXRpYyBmaW5hbCBTdHJpbmcgZW1wdHlOYW1lU3RyaW5nID0gJ+KAoic7CiAgc3RhdGljIGZpbmFsIE5hbWUgZW1wdHlOYW1lID0gbmV3IE5hbWUoZW1wdHlOYW1lU3RyaW5nKTsKCiAgTmFtZSBnZXRNZW1iZXJOYW1lKE1lbWJlciBub2RlKSB7CiAgICBpZiAobm9kZS5uYW1lPy5uYW1lID09ICcnKSByZXR1cm4gZW1wdHlOYW1lOwogICAgaWYgKG5vZGUubmFtZSAhPSBudWxsKSByZXR1cm4gbm9kZS5uYW1lOwogICAgcmV0dXJuIG5ldyBOYW1lKHN5bnRoZXRpY05hbWVzLm5hbWVNZW1iZXIobm9kZSkpOwogIH0KCiAgU3RyaW5nIGdldE1lbWJlclJlZmVyZW5jZShNZW1iZXIgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuICc8Tm8gTWVtYmVyPic7CiAgICBTdHJpbmcgbmFtZSA9IGdldE1lbWJlck5hbWUobm9kZSkubmFtZTsKICAgIGlmIChub2RlLnBhcmVudCBpcyBDbGFzcykgewogICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NSZWZlcmVuY2Uobm9kZS5wYXJlbnQpOwogICAgICByZXR1cm4gJyRjbGFzc05hbWU6OiRuYW1lJzsKICAgIH0gZWxzZSB7CiAgICAgIFN0cmluZyBsaWJyYXJ5ID0gZ2V0TGlicmFyeVJlZmVyZW5jZShub2RlLmVuY2xvc2luZ0xpYnJhcnkpOwogICAgICByZXR1cm4gJyRsaWJyYXJ5OjokbmFtZSc7CiAgICB9CiAgfQoKICBTdHJpbmcgZ2V0VmFyaWFibGVOYW1lKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgcmV0dXJuIG5vZGUubmFtZSA/PyBzeW50aGV0aWNOYW1lcy5uYW1lVmFyaWFibGUobm9kZSk7CiAgfQoKICBTdHJpbmcgZ2V0VmFyaWFibGVSZWZlcmVuY2UoVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gJzxObyBWYXJpYWJsZURlY2xhcmF0aW9uPic7CiAgICByZXR1cm4gZ2V0VmFyaWFibGVOYW1lKG5vZGUpOwogIH0KCiAgU3RyaW5nIGdldFR5cGVQYXJhbWV0ZXJOYW1lKFR5cGVQYXJhbWV0ZXIgbm9kZSkgewogICAgcmV0dXJuIG5vZGUubmFtZSA/PyBzeW50aGV0aWNOYW1lcy5uYW1lVHlwZVBhcmFtZXRlcihub2RlKTsKICB9CgogIFN0cmluZyBnZXRUeXBlUGFyYW1ldGVyUmVmZXJlbmNlKFR5cGVQYXJhbWV0ZXIgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuICc8Tm8gVHlwZVBhcmFtZXRlcj4nOwogICAgU3RyaW5nIG5hbWUgPSBnZXRUeXBlUGFyYW1ldGVyTmFtZShub2RlKTsKICAgIGlmIChub2RlLnBhcmVudCBpcyBGdW5jdGlvbk5vZGUgJiYgbm9kZS5wYXJlbnQucGFyZW50IGlzIE1lbWJlcikgewogICAgICBTdHJpbmcgbWVtYmVyID0gZ2V0TWVtYmVyUmVmZXJlbmNlKG5vZGUucGFyZW50LnBhcmVudCk7CiAgICAgIHJldHVybiAnJG1lbWJlcjo6JG5hbWUnOwogICAgfSBlbHNlIGlmIChub2RlLnBhcmVudCBpcyBDbGFzcykgewogICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NSZWZlcmVuY2Uobm9kZS5wYXJlbnQpOwogICAgICByZXR1cm4gJyRjbGFzc05hbWU6OiRuYW1lJzsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuYW1lOyAvLyBCb3VuZCBpbnNpZGUgYSBmdW5jdGlvbiB0eXBlLgogICAgfQogIH0KCiAgdm9pZCB3cml0ZUNvbXBvbmVudFByb2JsZW1zKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIHdyaXRlUHJvYmxlbXNBc0pzb24oIlByb2JsZW1zIGluIGNvbXBvbmVudCIsIGNvbXBvbmVudC5wcm9ibGVtc0FzSnNvbik7CiAgfQoKICB2b2lkIHdyaXRlUHJvYmxlbXNBc0pzb24oU3RyaW5nIGhlYWRlciwgTGlzdDxTdHJpbmc+IHByb2JsZW1zQXNKc29uKSB7CiAgICBpZiAocHJvYmxlbXNBc0pzb24/LmlzRW1wdHkgPT0gZmFsc2UpIHsKICAgICAgZW5kTGluZSgiLy8iKTsKICAgICAgd3JpdGUoIi8vICIpOwogICAgICB3cml0ZShoZWFkZXIpOwogICAgICBlbmRMaW5lKCI6Iik7CiAgICAgIGVuZExpbmUoIi8vIik7CiAgICAgIGZvciAoU3RyaW5nIHMgaW4gcHJvYmxlbXNBc0pzb24pIHsKICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGRlY29kZWQgPSBqc29uLmRlY29kZShzKTsKICAgICAgICBMaXN0PE9iamVjdD4gcGxhaW5UZXh0Rm9ybWF0dGVkID0gZGVjb2RlZFsicGxhaW5UZXh0Rm9ybWF0dGVkIl07CiAgICAgICAgTGlzdDxTdHJpbmc+IGxpbmVzID0gcGxhaW5UZXh0Rm9ybWF0dGVkLmpvaW4oIlxuIikuc3BsaXQoIlxuIik7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd3JpdGUoIi8vIik7CiAgICAgICAgICBTdHJpbmcgdHJpbW1lZCA9IGxpbmVzW2ldLnRyaW1SaWdodCgpOwogICAgICAgICAgaWYgKHRyaW1tZWQuaXNOb3RFbXB0eSkgd3JpdGUoIiAiKTsKICAgICAgICAgIGVuZExpbmUodHJpbW1lZCk7CiAgICAgICAgfQogICAgICAgIGlmIChsaW5lcy5pc05vdEVtcHR5KSBlbmRMaW5lKCIvLyIpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTGlicmFyeUZpbGUoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KGxpYnJhcnkuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVXb3JkKCdsaWJyYXJ5Jyk7CiAgICBpZiAobGlicmFyeS5uYW1lICE9IG51bGwpIHsKICAgICAgd3JpdGVXb3JkKGxpYnJhcnkubmFtZSk7CiAgICB9CiAgICBlbmRMaW5lKCc7Jyk7CgogICAgTGlicmFyeUltcG9ydFRhYmxlIGltcG9ydHMgPSBuZXcgTGlicmFyeUltcG9ydFRhYmxlKGxpYnJhcnkpOwogICAgUHJpbnRlciBpbm5lciA9IGNyZWF0ZUlubmVyKGltcG9ydHMsIGxpYnJhcnkuZW5jbG9zaW5nQ29tcG9uZW50Py5tZXRhZGF0YSk7CiAgICBpbm5lci53cml0ZVN0YW5kYXJkTGlicmFyeUNvbnRlbnQobGlicmFyeSwKICAgICAgICBvdXRlclByaW50ZXI6IHRoaXMsIGltcG9ydHNUb1ByaW50OiBpbXBvcnRzKTsKICB9CgogIHZvaWQgcHJpbnRMaWJyYXJ5SW1wb3J0VGFibGUoTGlicmFyeUltcG9ydFRhYmxlIGltcG9ydHMpIHsKICAgIGZvciAodmFyIGxpYnJhcnkgaW4gaW1wb3J0cy5pbXBvcnRlZExpYnJhcmllcykgewogICAgICB2YXIgaW1wb3J0UGF0aCA9IGltcG9ydHMuZ2V0SW1wb3J0UGF0aChsaWJyYXJ5KTsKICAgICAgaWYgKGltcG9ydFBhdGggPT0gIiIpIHsKICAgICAgICB2YXIgcHJlZml4ID0KICAgICAgICAgICAgc3ludGhldGljTmFtZXMubmFtZUxpYnJhcnlQcmVmaXgobGlicmFyeSwgcHJvcG9zZWROYW1lOiAnc2VsZicpOwogICAgICAgIGVuZExpbmUoJ2ltcG9ydCBzZWxmIGFzICRwcmVmaXg7Jyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHByZWZpeCA9IHN5bnRoZXRpY05hbWVzLm5hbWVMaWJyYXJ5UHJlZml4KGxpYnJhcnkpOwogICAgICAgIGVuZExpbmUoJ2ltcG9ydCAiJGltcG9ydFBhdGgiIGFzICRwcmVmaXg7Jyk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgd3JpdGVTdGFuZGFyZExpYnJhcnlDb250ZW50KExpYnJhcnkgbGlicmFyeSwKICAgICAge1ByaW50ZXIgb3V0ZXJQcmludGVyLCBMaWJyYXJ5SW1wb3J0VGFibGUgaW1wb3J0c1RvUHJpbnR9KSB7CiAgICBvdXRlclByaW50ZXIgPz89IHRoaXM7CiAgICBvdXRlclByaW50ZXIud3JpdGVQcm9ibGVtc0FzSnNvbigKICAgICAgICAiUHJvYmxlbXMgaW4gbGlicmFyeSIsIGxpYnJhcnkucHJvYmxlbXNBc0pzb24pOwoKICAgIGlmIChpbXBvcnRzVG9QcmludCAhPSBudWxsKSB7CiAgICAgIG91dGVyUHJpbnRlci5wcmludExpYnJhcnlJbXBvcnRUYWJsZShpbXBvcnRzVG9QcmludCk7CiAgICB9CgogICAgd3JpdGVBZGRpdGlvbmFsRXhwb3J0cyhsaWJyYXJ5LmFkZGl0aW9uYWxFeHBvcnRzKTsKICAgIGVuZExpbmUoKTsKICAgIGxpYnJhcnkuZGVwZW5kZW5jaWVzLmZvckVhY2god3JpdGVOb2RlKTsKICAgIGlmIChsaWJyYXJ5LmRlcGVuZGVuY2llcy5pc05vdEVtcHR5KSBlbmRMaW5lKCk7CiAgICBsaWJyYXJ5LnBhcnRzLmZvckVhY2god3JpdGVOb2RlKTsKICAgIGxpYnJhcnkudHlwZWRlZnMuZm9yRWFjaCh3cml0ZU5vZGUpOwogICAgbGlicmFyeS5jbGFzc2VzLmZvckVhY2god3JpdGVOb2RlKTsKICAgIGxpYnJhcnkuZmllbGRzLmZvckVhY2god3JpdGVOb2RlKTsKICAgIGxpYnJhcnkucHJvY2VkdXJlcy5mb3JFYWNoKHdyaXRlTm9kZSk7CiAgfQoKICB2b2lkIHdyaXRlQWRkaXRpb25hbEV4cG9ydHMoTGlzdDxSZWZlcmVuY2U+IGFkZGl0aW9uYWxFeHBvcnRzKSB7CiAgICBpZiAoYWRkaXRpb25hbEV4cG9ydHMuaXNFbXB0eSkgcmV0dXJuOwogICAgd3JpdGUoJ2FkZGl0aW9uYWxFeHBvcnRzID0gKCcpOwogICAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKICAgIGZvciAoUmVmZXJlbmNlIHJlZmVyZW5jZSBpbiBhZGRpdGlvbmFsRXhwb3J0cykgewogICAgICBpZiAoaXNGaXJzdCkgewogICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3cml0ZSgnLCAnKTsKICAgICAgfQogICAgICB2YXIgbm9kZSA9IHJlZmVyZW5jZS5ub2RlOwogICAgICBpZiAobm9kZSBpcyBDbGFzcykgewogICAgICAgIExpYnJhcnkgbm9kZUxpYnJhcnkgPSBub2RlLmVuY2xvc2luZ0xpYnJhcnk7CiAgICAgICAgU3RyaW5nIHByZWZpeCA9IHN5bnRoZXRpY05hbWVzLm5hbWVMaWJyYXJ5UHJlZml4KG5vZGVMaWJyYXJ5KTsKICAgICAgICB3cml0ZShwcmVmaXggKyAnOjonICsgbm9kZS5uYW1lKTsKICAgICAgfSBlbHNlIGlmIChub2RlIGlzIEZpZWxkKSB7CiAgICAgICAgTGlicmFyeSBub2RlTGlicmFyeSA9IG5vZGUuZW5jbG9zaW5nTGlicmFyeTsKICAgICAgICBTdHJpbmcgcHJlZml4ID0gc3ludGhldGljTmFtZXMubmFtZUxpYnJhcnlQcmVmaXgobm9kZUxpYnJhcnkpOwogICAgICAgIHdyaXRlKHByZWZpeCArICc6OicgKyBub2RlLm5hbWUubmFtZSk7CiAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBQcm9jZWR1cmUpIHsKICAgICAgICBMaWJyYXJ5IG5vZGVMaWJyYXJ5ID0gbm9kZS5lbmNsb3NpbmdMaWJyYXJ5OwogICAgICAgIFN0cmluZyBwcmVmaXggPSBzeW50aGV0aWNOYW1lcy5uYW1lTGlicmFyeVByZWZpeChub2RlTGlicmFyeSk7CiAgICAgICAgd3JpdGUocHJlZml4ICsgJzo6JyArIG5vZGUubmFtZS5uYW1lKTsKICAgICAgfSBlbHNlIGlmIChub2RlIGlzIFR5cGVkZWYpIHsKICAgICAgICBMaWJyYXJ5IG5vZGVMaWJyYXJ5ID0gbm9kZS5lbmNsb3NpbmdMaWJyYXJ5OwogICAgICAgIFN0cmluZyBwcmVmaXggPSBzeW50aGV0aWNOYW1lcy5uYW1lTGlicmFyeVByZWZpeChub2RlTGlicmFyeSk7CiAgICAgICAgd3JpdGUocHJlZml4ICsgJzo6JyArIG5vZGUubmFtZSk7CiAgICAgIH0gZWxzZSBpZiAocmVmZXJlbmNlLmNhbm9uaWNhbE5hbWUgIT0gbnVsbCkgewogICAgICAgIHdyaXRlKHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lLnRvU3RyaW5nKCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoJyR7bm9kZS5ydW50aW1lVHlwZX0nKTsKICAgICAgfQogICAgICBlbmRMaW5lKCcpJyk7CiAgICB9CgogICAgZW5kTGluZSgpOwogIH0KCiAgdm9pZCB3cml0ZUNvbXBvbmVudEZpbGUoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgSW1wb3J0VGFibGUgaW1wb3J0cyA9IG5ldyBDb21wb25lbnRJbXBvcnRUYWJsZShjb21wb25lbnQpOwogICAgdmFyIGlubmVyID0gY3JlYXRlSW5uZXIoaW1wb3J0cywgY29tcG9uZW50Lm1ldGFkYXRhKTsKICAgIHdyaXRlV29yZCgnbWFpbicpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIGlubmVyLndyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShjb21wb25lbnQubWFpbk1ldGhvZE5hbWUpOwogICAgZW5kTGluZSgnOycpOwogICAgaWYgKHNob3dNZXRhZGF0YSkgewogICAgICBpbm5lci53cml0ZU1ldGFkYXRhKGNvbXBvbmVudCk7CiAgICB9CiAgICB3cml0ZUNvbXBvbmVudFByb2JsZW1zKGNvbXBvbmVudCk7CiAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgaWYgKGxpYnJhcnkuaXNFeHRlcm5hbCkgewogICAgICAgIGlmICghc2hvd0V4dGVybmFsKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgd3JpdGVXb3JkKCdleHRlcm5hbCcpOwogICAgICB9CiAgICAgIGlmIChzaG93TWV0YWRhdGEpIHsKICAgICAgICBpbm5lci53cml0ZU1ldGFkYXRhKGxpYnJhcnkpOwogICAgICB9CiAgICAgIHdyaXRlQW5ub3RhdGlvbkxpc3QobGlicmFyeS5hbm5vdGF0aW9ucyk7CiAgICAgIHdyaXRlV29yZCgnbGlicmFyeScpOwogICAgICBpZiAobGlicmFyeS5uYW1lICE9IG51bGwpIHsKICAgICAgICB3cml0ZVdvcmQobGlicmFyeS5uYW1lKTsKICAgICAgfQogICAgICBpZiAobGlicmFyeS5pbXBvcnRVcmkgIT0gbnVsbCkgewogICAgICAgIHdyaXRlU3BhY2VkKCdmcm9tJyk7CiAgICAgICAgd3JpdGVXb3JkKCciJHtsaWJyYXJ5LmltcG9ydFVyaX0iJyk7CiAgICAgIH0KICAgICAgdmFyIHByZWZpeCA9IHN5bnRoZXRpY05hbWVzLm5hbWVMaWJyYXJ5UHJlZml4KGxpYnJhcnkpOwogICAgICB3cml0ZVNwYWNlZCgnYXMnKTsKICAgICAgd3JpdGVXb3JkKHByZWZpeCk7CiAgICAgIGVuZExpbmUoJyB7Jyk7CiAgICAgICsraW5uZXIuaW5kZW50YXRpb247CgogICAgICBpbm5lci53cml0ZVN0YW5kYXJkTGlicmFyeUNvbnRlbnQobGlicmFyeSk7CiAgICAgIC0taW5uZXIuaW5kZW50YXRpb247CiAgICAgIGVuZExpbmUoJ30nKTsKICAgIH0KICAgIHdyaXRlQ29uc3RhbnRUYWJsZShjb21wb25lbnQpOwogIH0KCiAgdm9pZCB3cml0ZUNvbnN0YW50VGFibGUoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgaWYgKHN5bnRoZXRpY05hbWVzLmNvbnN0YW50cy5tYXAuaXNFbXB0eSkgcmV0dXJuOwogICAgSW1wb3J0VGFibGUgaW1wb3J0cyA9IG5ldyBDb21wb25lbnRJbXBvcnRUYWJsZShjb21wb25lbnQpOwogICAgdmFyIGlubmVyID0gY3JlYXRlSW5uZXIoaW1wb3J0cywgY29tcG9uZW50Lm1ldGFkYXRhKTsKICAgIHdyaXRlV29yZCgnY29uc3RhbnRzICcpOwogICAgZW5kTGluZSgnIHsnKTsKICAgICsraW5uZXIuaW5kZW50YXRpb247CiAgICBmb3IgKGZpbmFsIENvbnN0YW50IGNvbnN0YW50CiAgICAgICAgaW4gc3ludGhldGljTmFtZXMuY29uc3RhbnRzLm1hcC5rZXlzLnRvTGlzdCgpKSB7CiAgICAgIGlubmVyLndyaXRlTm9kZShjb25zdGFudCk7CiAgICB9CiAgICAtLWlubmVyLmluZGVudGF0aW9uOwogICAgZW5kTGluZSgnfScpOwogIH0KCiAgaW50IGdldFByZWNlZGVuY2UoVHJlZU5vZGUgbm9kZSkgewogICAgcmV0dXJuIFByZWNlZGVuY2Uub2Yobm9kZSk7CiAgfQoKICB2b2lkIHdyaXRlKFN0cmluZyBzdHJpbmcpIHsKICAgIHNpbmsud3JpdGUoc3RyaW5nKTsKICAgIGNvbHVtbiArPSBzdHJpbmcubGVuZ3RoOwogIH0KCiAgdm9pZCB3cml0ZVNwYWNlKFtTdHJpbmcgc3RyaW5nID0gJyAnXSkgewogICAgd3JpdGUoc3RyaW5nKTsKICAgIHN0YXRlID0gU1BBQ0U7CiAgfQoKICB2b2lkIGVuc3VyZVNwYWNlKCkgewogICAgaWYgKHN0YXRlICE9IFNQQUNFKSB3cml0ZVNwYWNlKCk7CiAgfQoKICB2b2lkIHdyaXRlU3ltYm9sKFN0cmluZyBzdHJpbmcpIHsKICAgIHdyaXRlKHN0cmluZyk7CiAgICBzdGF0ZSA9IFNZTUJPTDsKICB9CgogIHZvaWQgd3JpdGVTcGFjZWQoU3RyaW5nIHN0cmluZykgewogICAgZW5zdXJlU3BhY2UoKTsKICAgIHdyaXRlKHN0cmluZyk7CiAgICB3cml0ZVNwYWNlKCk7CiAgfQoKICB2b2lkIHdyaXRlQ29tbWEoW1N0cmluZyBzdHJpbmcgPSAnLCddKSB7CiAgICB3cml0ZShzdHJpbmcpOwogICAgd3JpdGVTcGFjZSgpOwogIH0KCiAgdm9pZCB3cml0ZVdvcmQoU3RyaW5nIHN0cmluZykgewogICAgaWYgKHN0cmluZy5pc0VtcHR5KSByZXR1cm47CiAgICBlbnN1cmVXb3JkQm91bmRhcnkoKTsKICAgIHdyaXRlKHN0cmluZyk7CiAgICBzdGF0ZSA9IFdPUkQ7CiAgfQoKICB2b2lkIGVuc3VyZVdvcmRCb3VuZGFyeSgpIHsKICAgIGlmIChzdGF0ZSA9PSBXT1JEKSB7CiAgICAgIHdyaXRlU3BhY2UoKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVJbmRlbnRhdGlvbigpIHsKICAgIHdyaXRlU3BhY2UoJyAgJyAqIGluZGVudGF0aW9uKTsKICB9CgogIHZvaWQgd3JpdGVOb2RlKE5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICB3cml0ZVN5bWJvbCgiPE51bGw+Iik7CiAgICB9IGVsc2UgewogICAgICBmaW5hbCBoaWdobGlnaHQgPSBzaG91bGRIaWdobGlnaHQobm9kZSk7CiAgICAgIGlmIChoaWdobGlnaHQpIHsKICAgICAgICBzdGFydEhpZ2hsaWdodChub2RlKTsKICAgICAgfQoKICAgICAgaWYgKHNob3dPZmZzZXRzICYmIG5vZGUgaXMgVHJlZU5vZGUpIHsKICAgICAgICB3cml0ZVdvcmQoIlske25vZGUuZmlsZU9mZnNldH1dIik7CiAgICAgIH0KICAgICAgaWYgKHNob3dNZXRhZGF0YSAmJiBub2RlIGlzIFRyZWVOb2RlKSB7CiAgICAgICAgd3JpdGVNZXRhZGF0YShub2RlKTsKICAgICAgfQoKICAgICAgbm9kZS5hY2NlcHQodGhpcyk7CgogICAgICBpZiAoaGlnaGxpZ2h0KSB7CiAgICAgICAgZW5kSGlnaGxpZ2h0KG5vZGUpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlT3B0aW9uYWxOb2RlKE5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgIT0gbnVsbCkgewogICAgICBub2RlLmFjY2VwdCh0aGlzKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVNZXRhZGF0YShUcmVlTm9kZSBub2RlKSB7CiAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkgewogICAgICBmb3IgKHZhciBtZCBpbiBtZXRhZGF0YS52YWx1ZXMpIHsKICAgICAgICBmaW5hbCBub2RlTWV0YWRhdGEgPSBtZC5tYXBwaW5nW25vZGVdOwogICAgICAgIGlmIChub2RlTWV0YWRhdGEgIT0gbnVsbCkgewogICAgICAgICAgd3JpdGVXb3JkKCJbQCR7bWQudGFnfT0ke25vZGVNZXRhZGF0YX1dIik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlQW5ub3RhdGVkVHlwZShEYXJ0VHlwZSB0eXBlLCBTdHJpbmcgYW5ub3RhdGlvbikgewogICAgd3JpdGVUeXBlKHR5cGUpOwogICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewogICAgICB3cml0ZSgnLycpOwogICAgICB3cml0ZShhbm5vdGF0aW9uKTsKICAgICAgc3RhdGUgPSBXT1JEOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgPT0gbnVsbCkgewogICAgICB3cml0ZSgnPE5vIERhcnRUeXBlPicpOwogICAgfSBlbHNlIHsKICAgICAgdHlwZS5hY2NlcHQodGhpcyk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlT3B0aW9uYWxUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlICE9IG51bGwpIHsKICAgICAgdHlwZS5hY2NlcHQodGhpcyk7CiAgICB9CiAgfQoKICB2aXNpdFN1cGVydHlwZShTdXBlcnR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgPT0gbnVsbCkgewogICAgICB3cml0ZSgnPE5vIFN1cGVydHlwZT4nKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlQ2xhc3NSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKHR5cGUuY2xhc3NOYW1lKTsKICAgICAgaWYgKHR5cGUudHlwZUFyZ3VtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgICAgd3JpdGVTeW1ib2woJzwnKTsKICAgICAgICB3cml0ZUxpc3QodHlwZS50eXBlQXJndW1lbnRzLCB3cml0ZVR5cGUpOwogICAgICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICAgIH0KICAgIH0KICB9CgogIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgdHlwZSkgewogICAgd3JpdGVUeXBlZGVmUmVmZXJlbmNlKHR5cGUudHlwZWRlZk5vZGUpOwogICAgaWYgKHR5cGUudHlwZUFyZ3VtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICAgIHdyaXRlTGlzdCh0eXBlLnR5cGVBcmd1bWVudHMsIHdyaXRlVHlwZSk7CiAgICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTW9kaWZpZXIoYm9vbCBpc1RoZXJlLCBTdHJpbmcgbmFtZSkgewogICAgaWYgKGlzVGhlcmUpIHsKICAgICAgd3JpdGVXb3JkKG5hbWUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZU5hbWUoTmFtZSBuYW1lKSB7CiAgICBpZiAobmFtZT8ubmFtZSA9PSAnJykgewogICAgICB3cml0ZVdvcmQoZW1wdHlOYW1lU3RyaW5nKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlV29yZChuYW1lPy5uYW1lID8/ICc8YW5vbj4nKTsgLy8gVE9ETzogd3JpdGUgbGlicmFyeSBuYW1lCiAgICB9CiAgfQoKICB2b2lkIGVuZExpbmUoW1N0cmluZyBzdHJpbmddKSB7CiAgICBpZiAoc3RyaW5nICE9IG51bGwpIHsKICAgICAgd3JpdGUoc3RyaW5nKTsKICAgIH0KICAgIHdyaXRlKCdcbicpOwogICAgc3RhdGUgPSBTUEFDRTsKICAgIGNvbHVtbiA9IDA7CiAgfQoKICB2b2lkIHdyaXRlRnVuY3Rpb24oRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLAogICAgICB7bmFtZSwgTGlzdDxJbml0aWFsaXplcj4gaW5pdGlhbGl6ZXJzLCBib29sIHRlcm1pbmF0ZUxpbmU6IHRydWV9KSB7CiAgICBpZiAobmFtZSBpcyBTdHJpbmcpIHsKICAgICAgd3JpdGVXb3JkKG5hbWUpOwogICAgfSBlbHNlIGlmIChuYW1lIGlzIE5hbWUpIHsKICAgICAgd3JpdGVOYW1lKG5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KG5hbWUgPT0gbnVsbCk7CiAgICB9CiAgICB3cml0ZVR5cGVQYXJhbWV0ZXJMaXN0KGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzKTsKICAgIHdyaXRlUGFyYW1ldGVyTGlzdChmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycywgZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIGZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogICAgd3JpdGVSZXR1cm5UeXBlKAogICAgICAgIGZ1bmN0aW9uLnJldHVyblR5cGUsIGFubm90YXRvcj8uYW5ub3RhdGVSZXR1cm4odGhpcywgZnVuY3Rpb24pKTsKICAgIGlmIChpbml0aWFsaXplcnMgIT0gbnVsbCAmJiBpbml0aWFsaXplcnMuaXNOb3RFbXB0eSkgewogICAgICBlbmRMaW5lKCk7CiAgICAgICsraW5kZW50YXRpb247CiAgICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgICAgd3JpdGVDb21tYSgnOicpOwogICAgICB3cml0ZUxpc3QoaW5pdGlhbGl6ZXJzLCB3cml0ZU5vZGUpOwogICAgICAtLWluZGVudGF0aW9uOwogICAgfQogICAgaWYgKGZ1bmN0aW9uLmFzeW5jTWFya2VyICE9IEFzeW5jTWFya2VyLlN5bmMpIHsKICAgICAgd3JpdGVTcGFjZWQoZ2V0QXN5bmNNYXJrZXJLZXl3b3JkKGZ1bmN0aW9uLmFzeW5jTWFya2VyKSk7CiAgICB9CiAgICBpZiAoZnVuY3Rpb24uZGFydEFzeW5jTWFya2VyICE9IEFzeW5jTWFya2VyLlN5bmMgJiYKICAgICAgICBmdW5jdGlvbi5kYXJ0QXN5bmNNYXJrZXIgIT0gZnVuY3Rpb24uYXN5bmNNYXJrZXIpIHsKICAgICAgd3JpdGVTcGFjZWQoIi8qIG9yaWdpbmFsbHkiKTsKICAgICAgd3JpdGVTcGFjZWQoZ2V0QXN5bmNNYXJrZXJLZXl3b3JkKGZ1bmN0aW9uLmRhcnRBc3luY01hcmtlcikpOwogICAgICB3cml0ZVNwYWNlZCgiKi8iKTsKICAgIH0KICAgIGlmIChmdW5jdGlvbi5ib2R5ICE9IG51bGwpIHsKICAgICAgd3JpdGVGdW5jdGlvbkJvZHkoZnVuY3Rpb24uYm9keSwgdGVybWluYXRlTGluZTogdGVybWluYXRlTGluZSk7CiAgICB9IGVsc2UgaWYgKHRlcm1pbmF0ZUxpbmUpIHsKICAgICAgZW5kTGluZSgnOycpOwogICAgfQogIH0KCiAgU3RyaW5nIGdldEFzeW5jTWFya2VyS2V5d29yZChBc3luY01hcmtlciBtYXJrZXIpIHsKICAgIHN3aXRjaCAobWFya2VyKSB7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuU3luYzoKICAgICAgICByZXR1cm4gJ3N5bmMnOwogICAgICBjYXNlIEFzeW5jTWFya2VyLlN5bmNTdGFyOgogICAgICAgIHJldHVybiAnc3luYyonOwogICAgICBjYXNlIEFzeW5jTWFya2VyLkFzeW5jOgogICAgICAgIHJldHVybiAnYXN5bmMnOwogICAgICBjYXNlIEFzeW5jTWFya2VyLkFzeW5jU3RhcjoKICAgICAgICByZXR1cm4gJ2FzeW5jKic7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuU3luY1lpZWxkaW5nOgogICAgICAgIHJldHVybiAneWllbGRpbmcnOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAnPEludmFsaWQgYXN5bmMgbWFya2VyOiAkbWFya2VyPic7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlRnVuY3Rpb25Cb2R5KFN0YXRlbWVudCBib2R5LCB7Ym9vbCB0ZXJtaW5hdGVMaW5lOiB0cnVlfSkgewogICAgaWYgKGJvZHkgaXMgQmxvY2sgJiYgYm9keS5zdGF0ZW1lbnRzLmlzRW1wdHkpIHsKICAgICAgZW5zdXJlU3BhY2UoKTsKICAgICAgd3JpdGVTeW1ib2woJ3t9Jyk7CiAgICAgIHN0YXRlID0gV09SRDsKICAgICAgaWYgKHRlcm1pbmF0ZUxpbmUpIHsKICAgICAgICBlbmRMaW5lKCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYm9keSBpcyBCbG9jaykgewogICAgICBlbnN1cmVTcGFjZSgpOwogICAgICBlbmRMaW5lKCd7Jyk7CiAgICAgICsraW5kZW50YXRpb247CiAgICAgIGJvZHkuc3RhdGVtZW50cy5mb3JFYWNoKHdyaXRlTm9kZSk7CiAgICAgIC0taW5kZW50YXRpb247CiAgICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgICAgd3JpdGVTeW1ib2woJ30nKTsKICAgICAgc3RhdGUgPSBXT1JEOwogICAgICBpZiAodGVybWluYXRlTGluZSkgewogICAgICAgIGVuZExpbmUoKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChib2R5IGlzIFJldHVyblN0YXRlbWVudCAmJiAhdGVybWluYXRlTGluZSkgewogICAgICB3cml0ZVNwYWNlZCgnPT4nKTsKICAgICAgd3JpdGVFeHByZXNzaW9uKGJvZHkuZXhwcmVzc2lvbik7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJvZHkoYm9keSk7CiAgICB9CiAgfQoKICB3cml0ZUZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSwKICAgICAge0xpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdHlwZWRlZlBvc2l0aW9uYWwsCiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdHlwZWRlZk5hbWVkfSkgewogICAgaWYgKHN0YXRlID09IFdPUkQpIHsKICAgICAgZW5zdXJlU3BhY2UoKTsKICAgIH0KICAgIHdyaXRlVHlwZVBhcmFtZXRlckxpc3Qobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgTGlzdDxEYXJ0VHlwZT4gcG9zaXRpb25hbCA9IG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnM7CgogICAgYm9vbCBwYXJhbWV0ZXJzQW5ub3RhdGVkID0gZmFsc2U7CiAgICBpZiAodHlwZWRlZlBvc2l0aW9uYWwgIT0gbnVsbCkgewogICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gZm9ybWFsIGluIHR5cGVkZWZQb3NpdGlvbmFsKSB7CiAgICAgICAgcGFyYW1ldGVyc0Fubm90YXRlZCA9CiAgICAgICAgICAgIHBhcmFtZXRlcnNBbm5vdGF0ZWQgfHwgZm9ybWFsLmFubm90YXRpb25zLmxlbmd0aCA+IDA7CiAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlZGVmTmFtZWQgIT0gbnVsbCkgewogICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gZm9ybWFsIGluIHR5cGVkZWZOYW1lZCkgewogICAgICAgIHBhcmFtZXRlcnNBbm5vdGF0ZWQgPQogICAgICAgICAgICBwYXJhbWV0ZXJzQW5ub3RhdGVkIHx8IGZvcm1hbC5hbm5vdGF0aW9ucy5sZW5ndGggPiAwOwogICAgICB9CiAgICB9CgogICAgaWYgKHBhcmFtZXRlcnNBbm5vdGF0ZWQgJiYgdHlwZWRlZlBvc2l0aW9uYWwgIT0gbnVsbCkgewogICAgICB3cml0ZUxpc3QodHlwZWRlZlBvc2l0aW9uYWwudGFrZShub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpLAogICAgICAgICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlTGlzdChwb3NpdGlvbmFsLnRha2Uobm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSwgd3JpdGVUeXBlKTsKICAgIH0KCiAgICBpZiAobm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50IDwgcG9zaXRpb25hbC5sZW5ndGgpIHsKICAgICAgaWYgKG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA+IDApIHsKICAgICAgICB3cml0ZUNvbW1hKCk7CiAgICAgIH0KICAgICAgd3JpdGVTeW1ib2woJ1snKTsKICAgICAgaWYgKHBhcmFtZXRlcnNBbm5vdGF0ZWQgJiYgdHlwZWRlZlBvc2l0aW9uYWwgIT0gbnVsbCkgewogICAgICAgIHdyaXRlTGlzdCh0eXBlZGVmUG9zaXRpb25hbC5za2lwKG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCksCiAgICAgICAgICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd3JpdGVMaXN0KHBvc2l0aW9uYWwuc2tpcChub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpLCB3cml0ZVR5cGUpOwogICAgICB9CiAgICAgIHdyaXRlU3ltYm9sKCddJyk7CiAgICB9CiAgICBpZiAobm9kZS5uYW1lZFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBpZiAobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgd3JpdGVDb21tYSgpOwogICAgICB9CiAgICAgIHdyaXRlU3ltYm9sKCd7Jyk7CiAgICAgIGlmIChwYXJhbWV0ZXJzQW5ub3RhdGVkICYmIHR5cGVkZWZOYW1lZCAhPSBudWxsKSB7CiAgICAgICAgd3JpdGVMaXN0KHR5cGVkZWZOYW1lZCwgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3cml0ZUxpc3Qobm9kZS5uYW1lZFBhcmFtZXRlcnMsIHZpc2l0TmFtZWRUeXBlKTsKICAgICAgfQogICAgICB3cml0ZVN5bWJvbCgnfScpOwogICAgfQogICAgd3JpdGVTeW1ib2woJyknKTsKICAgIGVuc3VyZVNwYWNlKCk7CiAgICB3cml0ZSgn4oaSJyk7CiAgICB3cml0ZU51bGxhYmlsaXR5KG5vZGUubnVsbGFiaWxpdHkpOwogICAgd3JpdGVTcGFjZSgpOwogICAgd3JpdGVUeXBlKG5vZGUucmV0dXJuVHlwZSk7CiAgfQoKICB2b2lkIHdyaXRlQm9keShTdGF0ZW1lbnQgYm9keSkgewogICAgaWYgKGJvZHkgaXMgQmxvY2spIHsKICAgICAgZW5kTGluZSgnIHsnKTsKICAgICAgKytpbmRlbnRhdGlvbjsKICAgICAgYm9keS5zdGF0ZW1lbnRzLmZvckVhY2god3JpdGVOb2RlKTsKICAgICAgLS1pbmRlbnRhdGlvbjsKICAgICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgICBlbmRMaW5lKCd9Jyk7CiAgICB9IGVsc2UgewogICAgICBlbmRMaW5lKCk7CiAgICAgICsraW5kZW50YXRpb247CiAgICAgIHdyaXRlTm9kZShib2R5KTsKICAgICAgLS1pbmRlbnRhdGlvbjsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVSZXR1cm5UeXBlKERhcnRUeXBlIHR5cGUsIFN0cmluZyBhbm5vdGF0aW9uKSB7CiAgICBpZiAodHlwZSA9PSBudWxsKSByZXR1cm47CiAgICB3cml0ZVNwYWNlZCgn4oaSJyk7CiAgICB3cml0ZUFubm90YXRlZFR5cGUodHlwZSwgYW5ub3RhdGlvbik7CiAgfQoKICB2b2lkIHdyaXRlVHlwZVBhcmFtZXRlckxpc3QoTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgewogICAgaWYgKHR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybjsKICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICB3cml0ZUxpc3QodHlwZVBhcmFtZXRlcnMsIHdyaXRlTm9kZSk7CiAgICB3cml0ZVN5bWJvbCgnPicpOwogICAgc3RhdGUgPSBXT1JEOyAvLyBFbnN1cmUgc3BhY2UgaWYgbm90IGZvbGxvd2VkIGJ5IGFub3RoZXIgc3ltYm9sLgogIH0KCiAgdm9pZCB3cml0ZVBhcmFtZXRlckxpc3QoTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkLCBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgd3JpdGVTeW1ib2woJygnKTsKICAgIHdyaXRlTGlzdCgKICAgICAgICBwb3NpdGlvbmFsLnRha2UocmVxdWlyZWRQYXJhbWV0ZXJDb3VudCksIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbik7CiAgICBpZiAocmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA8IHBvc2l0aW9uYWwubGVuZ3RoKSB7CiAgICAgIGlmIChyZXF1aXJlZFBhcmFtZXRlckNvdW50ID4gMCkgewogICAgICAgIHdyaXRlQ29tbWEoKTsKICAgICAgfQogICAgICB3cml0ZVN5bWJvbCgnWycpOwogICAgICB3cml0ZUxpc3QoCiAgICAgICAgICBwb3NpdGlvbmFsLnNraXAocmVxdWlyZWRQYXJhbWV0ZXJDb3VudCksIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbik7CiAgICAgIHdyaXRlU3ltYm9sKCddJyk7CiAgICB9CiAgICBpZiAobmFtZWQuaXNOb3RFbXB0eSkgewogICAgICBpZiAocG9zaXRpb25hbC5pc05vdEVtcHR5KSB7CiAgICAgICAgd3JpdGVDb21tYSgpOwogICAgICB9CiAgICAgIHdyaXRlU3ltYm9sKCd7Jyk7CiAgICAgIHdyaXRlTGlzdChuYW1lZCwgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKTsKICAgICAgd3JpdGVTeW1ib2woJ30nKTsKICAgIH0KICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgfQoKICB2b2lkIHdyaXRlTGlzdDxUPihJdGVyYWJsZTxUPiBub2Rlcywgdm9pZCBjYWxsYmFjayhUIHgpLAogICAgICB7U3RyaW5nIHNlcGFyYXRvcjogJywnfSkgewogICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICBmb3IgKHZhciBub2RlIGluIG5vZGVzKSB7CiAgICAgIGlmIChmaXJzdCkgewogICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd3JpdGVDb21tYShzZXBhcmF0b3IpOwogICAgICB9CiAgICAgIGNhbGxiYWNrKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUNsYXNzUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CiAgICB3cml0ZVdvcmQoZ2V0Q2xhc3NSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKHJlZmVyZW5jZSkpOwogIH0KCiAgU3RyaW5nIGdldENsYXNzUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CiAgICBpZiAocmVmZXJlbmNlID09IG51bGwpIHJldHVybiAnPE5vIENsYXNzPic7CiAgICBpZiAocmVmZXJlbmNlLm5vZGUgIT0gbnVsbCkgcmV0dXJuIGdldENsYXNzUmVmZXJlbmNlKHJlZmVyZW5jZS5hc0NsYXNzKTsKICAgIGlmIChyZWZlcmVuY2UuY2Fub25pY2FsTmFtZSAhPSBudWxsKQogICAgICByZXR1cm4gZ2V0Q2Fub25pY2FsTmFtZVN0cmluZyhyZWZlcmVuY2UuY2Fub25pY2FsTmFtZSk7CiAgICB0aHJvdyAiTmVpdGhlciBub2RlIG5vciBjYW5vbmljYWwgbmFtZSBmb3VuZCI7CiAgfQoKICB2b2lkIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CiAgICB3cml0ZVdvcmQoZ2V0TWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShyZWZlcmVuY2UpKTsKICB9CgogIFN0cmluZyBnZXRNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKICAgIGlmIChyZWZlcmVuY2UgPT0gbnVsbCkgcmV0dXJuICc8Tm8gTWVtYmVyPic7CiAgICBpZiAocmVmZXJlbmNlLm5vZGUgIT0gbnVsbCkgcmV0dXJuIGdldE1lbWJlclJlZmVyZW5jZShyZWZlcmVuY2UuYXNNZW1iZXIpOwogICAgaWYgKHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lICE9IG51bGwpCiAgICAgIHJldHVybiBnZXRDYW5vbmljYWxOYW1lU3RyaW5nKHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lKTsKICAgIHRocm93ICJOZWl0aGVyIG5vZGUgbm9yIGNhbm9uaWNhbCBuYW1lIGZvdW5kIjsKICB9CgogIFN0cmluZyBnZXRDYW5vbmljYWxOYW1lU3RyaW5nKENhbm9uaWNhbE5hbWUgbmFtZSkgewogICAgaWYgKG5hbWUuaXNSb290KSB0aHJvdyAndW5leHBlY3RlZCByb290JzsKICAgIGlmIChuYW1lLm5hbWUuc3RhcnRzV2l0aCgnQCcpKSB0aHJvdyAndW5leHBlY3RlZCBAJzsKCiAgICBsaWJyYXJ5U3RyaW5nKENhbm9uaWNhbE5hbWUgbGliKSB7CiAgICAgIGlmIChsaWIucmVmZXJlbmNlPy5ub2RlICE9IG51bGwpCiAgICAgICAgcmV0dXJuIGdldExpYnJhcnlSZWZlcmVuY2UobGliLnJlZmVyZW5jZS5hc0xpYnJhcnkpOwogICAgICByZXR1cm4gc3ludGhldGljTmFtZXMubmFtZUNhbm9uaWNhbE5hbWVBc0xpYnJhcnlQcmVmaXgoCiAgICAgICAgICBsaWIucmVmZXJlbmNlLCBsaWIpOwogICAgfQoKICAgIGNsYXNzU3RyaW5nKENhbm9uaWNhbE5hbWUgY2xzKSA9PgogICAgICAgIGxpYnJhcnlTdHJpbmcoY2xzLnBhcmVudCkgKyAnOjonICsgY2xzLm5hbWU7CgogICAgaWYgKG5hbWUucGFyZW50LmlzUm9vdCkgcmV0dXJuIGxpYnJhcnlTdHJpbmcobmFtZSk7CiAgICBpZiAobmFtZS5wYXJlbnQucGFyZW50LmlzUm9vdCkgcmV0dXJuIGNsYXNzU3RyaW5nKG5hbWUpOwoKICAgIENhbm9uaWNhbE5hbWUgYXROb2RlID0gbmFtZS5wYXJlbnQ7CiAgICB3aGlsZSAoIWF0Tm9kZS5uYW1lLnN0YXJ0c1dpdGgoJ0AnKSkgYXROb2RlID0gYXROb2RlLnBhcmVudDsKCiAgICBTdHJpbmcgcGFyZW50ID0gIiI7CiAgICBpZiAoYXROb2RlLnBhcmVudC5wYXJlbnQuaXNSb290KSB7CiAgICAgIHBhcmVudCA9IGxpYnJhcnlTdHJpbmcoYXROb2RlLnBhcmVudCk7CiAgICB9IGVsc2UgewogICAgICBwYXJlbnQgPSBjbGFzc1N0cmluZyhhdE5vZGUucGFyZW50KTsKICAgIH0KCiAgICBpZiAobmFtZS5uYW1lID09ICcnKSByZXR1cm4gIiRwYXJlbnQ6OiRlbXB0eU5hbWVTdHJpbmciOwogICAgcmV0dXJuICIkcGFyZW50Ojoke25hbWUubmFtZX0iOwogIH0KCiAgdm9pZCB3cml0ZVR5cGVkZWZSZWZlcmVuY2UoVHlwZWRlZiB0eXBlZGVmTm9kZSkgewogICAgd3JpdGVXb3JkKGdldFR5cGVkZWZSZWZlcmVuY2UodHlwZWRlZk5vZGUpKTsKICB9CgogIHZvaWQgd3JpdGVWYXJpYWJsZVJlZmVyZW5jZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICBmaW5hbCBoaWdobGlnaHQgPSBzaG91bGRIaWdobGlnaHQodmFyaWFibGUpOwogICAgaWYgKGhpZ2hsaWdodCkgewogICAgICBzdGFydEhpZ2hsaWdodCh2YXJpYWJsZSk7CiAgICB9CiAgICB3cml0ZVdvcmQoZ2V0VmFyaWFibGVSZWZlcmVuY2UodmFyaWFibGUpKTsKICAgIGlmIChoaWdobGlnaHQpIHsKICAgICAgZW5kSGlnaGxpZ2h0KHZhcmlhYmxlKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVUeXBlUGFyYW1ldGVyUmVmZXJlbmNlKFR5cGVQYXJhbWV0ZXIgbm9kZSkgewogICAgd3JpdGVXb3JkKGdldFR5cGVQYXJhbWV0ZXJSZWZlcmVuY2Uobm9kZSkpOwogIH0KCiAgdm9pZCB3cml0ZUV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlLCBbaW50IG1pbmltdW1QcmVjZWRlbmNlXSkgewogICAgZmluYWwgaGlnaGxpZ2h0ID0gc2hvdWxkSGlnaGxpZ2h0KG5vZGUpOwogICAgaWYgKGhpZ2hsaWdodCkgewogICAgICBzdGFydEhpZ2hsaWdodChub2RlKTsKICAgIH0KICAgIGlmIChzaG93T2Zmc2V0cykgd3JpdGVXb3JkKCJbJHtub2RlLmZpbGVPZmZzZXR9XSIpOwogICAgYm9vbCBuZWVkc1BhcmVudGVzZXMgPSBmYWxzZTsKICAgIGlmIChtaW5pbXVtUHJlY2VkZW5jZSAhPSBudWxsICYmIGdldFByZWNlZGVuY2Uobm9kZSkgPCBtaW5pbXVtUHJlY2VkZW5jZSkgewogICAgICBuZWVkc1BhcmVudGVzZXMgPSB0cnVlOwogICAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgfQogICAgd3JpdGVOb2RlKG5vZGUpOwogICAgaWYgKG5lZWRzUGFyZW50ZXNlcykgewogICAgICB3cml0ZVN5bWJvbCgnKScpOwogICAgfQogICAgaWYgKGhpZ2hsaWdodCkgewogICAgICBlbmRIaWdobGlnaHQobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlQW5ub3RhdGlvbihFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlU3ltYm9sKCdAJyk7CiAgICBpZiAobm9kZSBpcyBDb25zdHJ1Y3Rvckludm9jYXRpb24pIHsKICAgICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgICAgdmlzaXRBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVFeHByZXNzaW9uKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUFubm90YXRpb25MaXN0KExpc3Q8RXhwcmVzc2lvbj4gbm9kZXMsIHtib29sIHNlcGFyYXRlTGluZXM6IHRydWV9KSB7CiAgICBmb3IgKEV4cHJlc3Npb24gbm9kZSBpbiBub2RlcykgewogICAgICBpZiAoc2VwYXJhdGVMaW5lcykgewogICAgICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgICAgfQogICAgICB3cml0ZUFubm90YXRpb24obm9kZSk7CiAgICAgIGlmIChzZXBhcmF0ZUxpbmVzKSB7CiAgICAgICAgZW5kTGluZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHdyaXRlU3BhY2UoKTsKICAgICAgfQogICAgfQogIH0KCiAgdmlzaXRMaWJyYXJ5KExpYnJhcnkgbm9kZSkge30KCiAgdmlzaXRGaWVsZChGaWVsZCBub2RlKSB7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzU3RhdGljLCAnc3RhdGljJyk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNDb3ZhcmlhbnQsICdjb3ZhcmlhbnQnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsLCAnZ2VuZXJpYy1jb3ZhcmlhbnQtaW1wbCcpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzRmluYWwsICdmaW5hbCcpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzQ29uc3QsICdjb25zdCcpOwogICAgLy8gT25seSBzaG93IGltcGxpY2l0IGdldHRlci9zZXR0ZXIgbW9kaWZpZXJzIGluIGNhc2VzIHdoZXJlIHRoZXkgYXJlCiAgICAvLyBvdXQgb2YgdGhlIG9yZGluYXJ5LgogICAgaWYgKG5vZGUuaXNTdGF0aWMpIHsKICAgICAgd3JpdGVNb2RpZmllcihub2RlLmhhc0ltcGxpY2l0R2V0dGVyLCAnW2dldHRlcl0nKTsKICAgICAgd3JpdGVNb2RpZmllcihub2RlLmhhc0ltcGxpY2l0U2V0dGVyLCAnW3NldHRlcl0nKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlTW9kaWZpZXIoIW5vZGUuaGFzSW1wbGljaXRHZXR0ZXIsICdbbm8tZ2V0dGVyXScpOwogICAgICBpZiAobm9kZS5pc0ZpbmFsKSB7CiAgICAgICAgd3JpdGVNb2RpZmllcihub2RlLmhhc0ltcGxpY2l0U2V0dGVyLCAnW3NldHRlcl0nKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3cml0ZU1vZGlmaWVyKCFub2RlLmhhc0ltcGxpY2l0U2V0dGVyLCAnW25vLXNldHRlcl0nKTsKICAgICAgfQogICAgfQogICAgd3JpdGVXb3JkKCdmaWVsZCcpOwogICAgd3JpdGVTcGFjZSgpOwogICAgd3JpdGVBbm5vdGF0ZWRUeXBlKG5vZGUudHlwZSwgYW5ub3RhdG9yPy5hbm5vdGF0ZUZpZWxkKHRoaXMsIG5vZGUpKTsKICAgIHdyaXRlTmFtZShnZXRNZW1iZXJOYW1lKG5vZGUpKTsKICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgfQogICAgaWYgKChub2RlLmVuY2xvc2luZ0NsYXNzID09IG51bGwgJiYKICAgICAgICAgICAgbm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmZpbGVVcmkgIT0gbm9kZS5maWxlVXJpKSB8fAogICAgICAgIChub2RlLmVuY2xvc2luZ0NsYXNzICE9IG51bGwgJiYKICAgICAgICAgICAgbm9kZS5lbmNsb3NpbmdDbGFzcy5maWxlVXJpICE9IG5vZGUuZmlsZVVyaSkpIHsKICAgICAgd3JpdGVXb3JkKCIvKiBmcm9tICR7bm9kZS5maWxlVXJpfSAqLyIpOwogICAgfQogICAgZW5kTGluZSgnOycpOwogIH0KCiAgdmlzaXRQcm9jZWR1cmUoUHJvY2VkdXJlIG5vZGUpIHsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNFeHRlcm5hbCwgJ2V4dGVybmFsJyk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNTdGF0aWMsICdzdGF0aWMnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0Fic3RyYWN0LCAnYWJzdHJhY3QnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0ZvcndhcmRpbmdTdHViLCAnZm9yd2FyZGluZy1zdHViJyk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNGb3J3YXJkaW5nU2VtaVN0dWIsICdmb3J3YXJkaW5nLXNlbWktc3R1YicpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzTm9TdWNoTWV0aG9kRm9yd2FyZGVyLCAnbm8tc3VjaC1tZXRob2QtZm9yd2FyZGVyJyk7CiAgICB3cml0ZVdvcmQocHJvY2VkdXJlS2luZFRvU3RyaW5nKG5vZGUua2luZCkpOwogICAgaWYgKChub2RlLmVuY2xvc2luZ0NsYXNzID09IG51bGwgJiYKICAgICAgICAgICAgbm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmZpbGVVcmkgIT0gbm9kZS5maWxlVXJpKSB8fAogICAgICAgIChub2RlLmVuY2xvc2luZ0NsYXNzICE9IG51bGwgJiYKICAgICAgICAgICAgbm9kZS5lbmNsb3NpbmdDbGFzcy5maWxlVXJpICE9IG5vZGUuZmlsZVVyaSkpIHsKICAgICAgd3JpdGVXb3JkKCIvKiBmcm9tICR7bm9kZS5maWxlVXJpfSAqLyIpOwogICAgfQogICAgd3JpdGVGdW5jdGlvbihub2RlLmZ1bmN0aW9uLCBuYW1lOiBnZXRNZW1iZXJOYW1lKG5vZGUpKTsKICB9CgogIHZpc2l0Q29uc3RydWN0b3IoQ29uc3RydWN0b3Igbm9kZSkgewogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zKTsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0V4dGVybmFsLCAnZXh0ZXJuYWwnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0NvbnN0LCAnY29uc3QnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc1N5bnRoZXRpYywgJ3N5bnRoZXRpYycpOwogICAgd3JpdGVXb3JkKCdjb25zdHJ1Y3RvcicpOwogICAgd3JpdGVGdW5jdGlvbihub2RlLmZ1bmN0aW9uLAogICAgICAgIG5hbWU6IG5vZGUubmFtZSwgaW5pdGlhbGl6ZXJzOiBub2RlLmluaXRpYWxpemVycyk7CiAgfQoKICB2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNFeHRlcm5hbCwgJ2V4dGVybmFsJyk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNDb25zdCwgJ2NvbnN0Jyk7CiAgICB3cml0ZVdvcmQoJ3JlZGlyZWN0aW5nX2ZhY3RvcnknKTsKCiAgICBpZiAobm9kZS5uYW1lICE9IG51bGwpIHsKICAgICAgd3JpdGVOYW1lKG5vZGUubmFtZSk7CiAgICB9CiAgICB3cml0ZVR5cGVQYXJhbWV0ZXJMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgd3JpdGVQYXJhbWV0ZXJMaXN0KG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMsIG5vZGUubmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCk7CiAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgICB3cml0ZUxpc3Qobm9kZS50eXBlQXJndW1lbnRzLCB3cml0ZVR5cGUpOwogICAgICB3cml0ZVN5bWJvbCgnPicpOwogICAgfQogICAgZW5kTGluZSgnOycpOwogIH0KCiAgdmlzaXRDbGFzcyhDbGFzcyBub2RlKSB7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzQWJzdHJhY3QsICdhYnN0cmFjdCcpOwogICAgd3JpdGVXb3JkKCdjbGFzcycpOwogICAgd3JpdGVXb3JkKGdldENsYXNzTmFtZShub2RlKSk7CiAgICB3cml0ZVR5cGVQYXJhbWV0ZXJMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgaWYgKG5vZGUuaXNNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICAgIHZpc2l0U3VwZXJ0eXBlKG5vZGUuc3VwZXJ0eXBlKTsKICAgICAgd3JpdGVTcGFjZWQoJ3dpdGgnKTsKICAgICAgdmlzaXRTdXBlcnR5cGUobm9kZS5taXhlZEluVHlwZSk7CiAgICB9IGVsc2UgaWYgKG5vZGUuc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgd3JpdGVTcGFjZWQoJ2V4dGVuZHMnKTsKICAgICAgdmlzaXRTdXBlcnR5cGUobm9kZS5zdXBlcnR5cGUpOwogICAgfQogICAgaWYgKG5vZGUuaW1wbGVtZW50ZWRUeXBlcy5pc05vdEVtcHR5KSB7CiAgICAgIHdyaXRlU3BhY2VkKCdpbXBsZW1lbnRzJyk7CiAgICAgIHdyaXRlTGlzdChub2RlLmltcGxlbWVudGVkVHlwZXMsIHZpc2l0U3VwZXJ0eXBlKTsKICAgIH0KICAgIHZhciBlbmRMaW5lU3RyaW5nID0gJyB7JzsKICAgIGlmIChub2RlLmVuY2xvc2luZ0xpYnJhcnkuZmlsZVVyaSAhPSBub2RlLmZpbGVVcmkpIHsKICAgICAgZW5kTGluZVN0cmluZyArPSAnIC8vIGZyb20gJHtub2RlLmZpbGVVcml9JzsKICAgIH0KICAgIGVuZExpbmUoZW5kTGluZVN0cmluZyk7CiAgICArK2luZGVudGF0aW9uOwogICAgbm9kZS5maWVsZHMuZm9yRWFjaCh3cml0ZU5vZGUpOwogICAgbm9kZS5jb25zdHJ1Y3RvcnMuZm9yRWFjaCh3cml0ZU5vZGUpOwogICAgbm9kZS5wcm9jZWR1cmVzLmZvckVhY2god3JpdGVOb2RlKTsKICAgIG5vZGUucmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzLmZvckVhY2god3JpdGVOb2RlKTsKICAgIC0taW5kZW50YXRpb247CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICBlbmRMaW5lKCd9Jyk7CiAgfQoKICB2aXNpdFR5cGVkZWYoVHlwZWRlZiBub2RlKSB7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCd0eXBlZGVmJyk7CiAgICB3cml0ZVdvcmQobm9kZS5uYW1lKTsKICAgIHdyaXRlVHlwZVBhcmFtZXRlckxpc3Qobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgaWYgKG5vZGUudHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgd3JpdGVGdW5jdGlvblR5cGUobm9kZS50eXBlLAogICAgICAgICAgdHlwZWRlZlBvc2l0aW9uYWw6IG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgICB0eXBlZGVmTmFtZWQ6IG5vZGUubmFtZWRQYXJhbWV0ZXJzKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlTm9kZShub2RlLnR5cGUpOwogICAgfQogICAgZW5kTGluZSgnOycpOwogIH0KCiAgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ2ludmFsaWQtZXhwcmVzc2lvbicpOwogICAgaWYgKG5vZGUubWVzc2FnZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlV29yZCgnIiR7ZXNjYXBlU3RyaW5nKG5vZGUubWVzc2FnZSl9IicpOwogICAgfQogIH0KCiAgdmlzaXRNZXRob2RJbnZvY2F0aW9uKE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUucmVjZWl2ZXIsIFByZWNlZGVuY2UuUFJJTUFSWSk7CiAgICB3cml0ZVN5bWJvbCgnLicpOwogICAgd3JpdGVJbnRlcmZhY2VUYXJnZXQobm9kZS5uYW1lLCBub2RlLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGUobm9kZS5hcmd1bWVudHMpOwogIH0KCiAgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKERpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUucmVjZWl2ZXIsIFByZWNlZGVuY2UuUFJJTUFSWSk7CiAgICB3cml0ZVN5bWJvbCgnLns9Jyk7CiAgICB3cml0ZU1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVTeW1ib2woJ30nKTsKICAgIHdyaXRlTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgfQoKICB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVXb3JkKCdzdXBlcicpOwogICAgd3JpdGVTeW1ib2woJy4nKTsKICAgIHdyaXRlSW50ZXJmYWNlVGFyZ2V0KG5vZGUubmFtZSwgbm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVOb2RlKG5vZGUuYXJndW1lbnRzKTsKICB9CgogIHZpc2l0U3RhdGljSW52b2NhdGlvbihTdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0NvbnN0LCAnY29uc3QnKTsKICAgIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGUobm9kZS5hcmd1bWVudHMpOwogIH0KCiAgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHdyaXRlV29yZChub2RlLmlzQ29uc3QgPyAnY29uc3QnIDogJ25ldycpOwogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgfQoKICB2aXNpdE5vdChOb3Qgbm9kZSkgewogICAgd3JpdGVTeW1ib2woJyEnKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLm9wZXJhbmQsIFByZWNlZGVuY2UuUFJFRklYKTsKICB9CgogIHZpc2l0TG9naWNhbEV4cHJlc3Npb24oTG9naWNhbEV4cHJlc3Npb24gbm9kZSkgewogICAgaW50IHByZWNlZGVuY2UgPSBQcmVjZWRlbmNlLmJpbmFyeVByZWNlZGVuY2Vbbm9kZS5vcGVyYXRvcl07CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5sZWZ0LCBwcmVjZWRlbmNlKTsKICAgIHdyaXRlU3BhY2VkKG5vZGUub3BlcmF0b3IpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUucmlnaHQsIHByZWNlZGVuY2UgKyAxKTsKICB9CgogIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5jb25kaXRpb24sIFByZWNlZGVuY2UuTE9HSUNBTF9PUik7CiAgICBlbnN1cmVTcGFjZSgpOwogICAgd3JpdGUoJz8nKTsKICAgIHdyaXRlU3RhdGljVHlwZShub2RlLnN0YXRpY1R5cGUpOwogICAgd3JpdGVTcGFjZSgpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUudGhlbik7CiAgICB3cml0ZVNwYWNlZCgnOicpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUub3RoZXJ3aXNlKTsKICB9CgogIFN0cmluZyBnZXRFc2NhcGVkQ2hhcmFjdGVyKGludCBjb2RlVW5pdCkgewogICAgc3dpdGNoIChjb2RlVW5pdCkgewogICAgICBjYXNlIDk6CiAgICAgICAgcmV0dXJuIHInXHQnOwogICAgICBjYXNlIDEwOgogICAgICAgIHJldHVybiByJ1xuJzsKICAgICAgY2FzZSAxMToKICAgICAgICByZXR1cm4gcidcdic7CiAgICAgIGNhc2UgMTI6CiAgICAgICAgcmV0dXJuIHInXGYnOwogICAgICBjYXNlIDEzOgogICAgICAgIHJldHVybiByJ1xyJzsKICAgICAgY2FzZSAzNDoKICAgICAgICByZXR1cm4gcidcIic7CiAgICAgIGNhc2UgMzY6CiAgICAgICAgcmV0dXJuIHInXCQnOwogICAgICBjYXNlIDkyOgogICAgICAgIHJldHVybiByJ1xcJzsKICAgICAgZGVmYXVsdDoKICAgICAgICBpZiAoY29kZVVuaXQgPCAzMiB8fCBjb2RlVW5pdCA+IDEyNikgewogICAgICAgICAgcmV0dXJuIHInXHUnICsgJyRjb2RlVW5pdCcucGFkTGVmdCg0LCAnMCcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CiAgfQoKICBTdHJpbmcgZXNjYXBlU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXI7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7ICsraSkgewogICAgICBTdHJpbmcgY2hhcmFjdGVyID0gZ2V0RXNjYXBlZENoYXJhY3RlcihzdHJpbmcuY29kZVVuaXRBdChpKSk7CiAgICAgIGlmIChjaGFyYWN0ZXIgIT0gbnVsbCkgewogICAgICAgIGJ1ZmZlciA/Pz0gbmV3IFN0cmluZ0J1ZmZlcihzdHJpbmcuc3Vic3RyaW5nKDAsIGkpKTsKICAgICAgICBidWZmZXIud3JpdGUoY2hhcmFjdGVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWZmZXI/LndyaXRlKHN0cmluZ1tpXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBidWZmZXIgPT0gbnVsbCA/IHN0cmluZyA6IGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgewogICAgaWYgKHN0YXRlID09IFdPUkQpIHsKICAgICAgd3JpdGVTcGFjZSgpOwogICAgfQogICAgd3JpdGUoJyInKTsKICAgIGZvciAodmFyIHBhcnQgaW4gbm9kZS5leHByZXNzaW9ucykgewogICAgICBpZiAocGFydCBpcyBTdHJpbmdMaXRlcmFsKSB7CiAgICAgICAgd3JpdGVTeW1ib2woZXNjYXBlU3RyaW5nKHBhcnQudmFsdWUpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3cml0ZVN5bWJvbChyJyR7Jyk7CiAgICAgICAgd3JpdGVFeHByZXNzaW9uKHBhcnQpOwogICAgICAgIHdyaXRlU3ltYm9sKCd9Jyk7CiAgICAgIH0KICAgIH0KICAgIHdyaXRlKCciJyk7CiAgICBzdGF0ZSA9IFdPUkQ7CiAgfQoKICB2aXNpdExpc3RDb25jYXRlbmF0aW9uKExpc3RDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChFeHByZXNzaW9uIHBhcnQgaW4gbm9kZS5saXN0cykgewogICAgICBpZiAoIWZpcnN0KSB3cml0ZVNwYWNlZCgnKycpOwogICAgICB3cml0ZUV4cHJlc3Npb24ocGFydCk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgfQoKICB2aXNpdFNldENvbmNhdGVuYXRpb24oU2V0Q29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGZvciAoRXhwcmVzc2lvbiBwYXJ0IGluIG5vZGUuc2V0cykgewogICAgICBpZiAoIWZpcnN0KSB3cml0ZVNwYWNlZCgnKycpOwogICAgICB3cml0ZUV4cHJlc3Npb24ocGFydCk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgfQoKICB2aXNpdE1hcENvbmNhdGVuYXRpb24oTWFwQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGZvciAoRXhwcmVzc2lvbiBwYXJ0IGluIG5vZGUubWFwcykgewogICAgICBpZiAoIWZpcnN0KSB3cml0ZVNwYWNlZCgnKycpOwogICAgICB3cml0ZUV4cHJlc3Npb24ocGFydCk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgfQoKICB2aXNpdEluc3RhbmNlQ3JlYXRpb24oSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7CiAgICB3cml0ZUNsYXNzUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLmNsYXNzUmVmZXJlbmNlKTsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgICB3cml0ZUxpc3Qobm9kZS50eXBlQXJndW1lbnRzLCB3cml0ZVR5cGUpOwogICAgICB3cml0ZVN5bWJvbCgnPicpOwogICAgfQogICAgd3JpdGVTeW1ib2woJ3snKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgbm9kZS5maWVsZFZhbHVlcy5mb3JFYWNoKChSZWZlcmVuY2UgZmllbGRSZWYsIEV4cHJlc3Npb24gdmFsdWUpIHsKICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgIHdyaXRlQ29tbWEoKTsKICAgICAgfQogICAgICB3cml0ZVdvcmQoJyR7ZmllbGRSZWYuYXNGaWVsZC5uYW1lLm5hbWV9Jyk7CiAgICAgIHdyaXRlU3ltYm9sKCc6Jyk7CiAgICAgIHdyaXRlRXhwcmVzc2lvbih2YWx1ZSk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9KTsKICAgIGZvciAoQXNzZXJ0U3RhdGVtZW50IGFzc2VydF8gaW4gbm9kZS5hc3NlcnRzKSB7CiAgICAgIGlmICghZmlyc3QpIHsKICAgICAgICB3cml0ZUNvbW1hKCk7CiAgICAgIH0KICAgICAgd3JpdGUoJ2Fzc2VydCgnKTsKICAgICAgd3JpdGVFeHByZXNzaW9uKGFzc2VydF8uY29uZGl0aW9uKTsKICAgICAgaWYgKGFzc2VydF8ubWVzc2FnZSAhPSBudWxsKSB7CiAgICAgICAgd3JpdGVDb21tYSgpOwogICAgICAgIHdyaXRlRXhwcmVzc2lvbihhc3NlcnRfLm1lc3NhZ2UpOwogICAgICB9CiAgICAgIHdyaXRlKCcpJyk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgICBmb3IgKEV4cHJlc3Npb24gdW51c2VkQXJndW1lbnQgaW4gbm9kZS51bnVzZWRBcmd1bWVudHMpIHsKICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgIHdyaXRlQ29tbWEoKTsKICAgICAgfQogICAgICB3cml0ZUV4cHJlc3Npb24odW51c2VkQXJndW1lbnQpOwogICAgICBmaXJzdCA9IGZhbHNlOwogICAgfQogICAgd3JpdGVTeW1ib2woJ30nKTsKICB9CgogIHZpc2l0SXNFeHByZXNzaW9uKElzRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5vcGVyYW5kLCBQcmVjZWRlbmNlLkJJVFdJU0VfT1IpOwogICAgd3JpdGVTcGFjZWQoJ2lzJyk7CiAgICB3cml0ZVR5cGUobm9kZS50eXBlKTsKICB9CgogIHZpc2l0QXNFeHByZXNzaW9uKEFzRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5vcGVyYW5kLCBQcmVjZWRlbmNlLkJJVFdJU0VfT1IpOwogICAgd3JpdGVTcGFjZWQobm9kZS5pc1R5cGVFcnJvciA/ICdhc3tUeXBlRXJyb3J9JyA6ICdhcycpOwogICAgd3JpdGVUeXBlKG5vZGUudHlwZSk7CiAgfQoKICB2aXNpdFN5bWJvbExpdGVyYWwoU3ltYm9sTGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZVN5bWJvbCgnIycpOwogICAgd3JpdGVXb3JkKG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXRUeXBlTGl0ZXJhbChUeXBlTGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZVR5cGUobm9kZS50eXBlKTsKICB9CgogIHZpc2l0VGhpc0V4cHJlc3Npb24oVGhpc0V4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVXb3JkKCd0aGlzJyk7CiAgfQoKICB2aXNpdFJldGhyb3coUmV0aHJvdyBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ3JldGhyb3cnKTsKICB9CgogIHZpc2l0VGhyb3coVGhyb3cgbm9kZSkgewogICAgd3JpdGVXb3JkKCd0aHJvdycpOwogICAgd3JpdGVTcGFjZSgpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbik7CiAgfQoKICB2aXNpdExpc3RMaXRlcmFsKExpc3RMaXRlcmFsIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgd3JpdGVXb3JkKCdjb25zdCcpOwogICAgICB3cml0ZVNwYWNlKCk7CiAgICB9CiAgICBpZiAobm9kZS50eXBlQXJndW1lbnQgIT0gbnVsbCkgewogICAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgICB3cml0ZVR5cGUobm9kZS50eXBlQXJndW1lbnQpOwogICAgICB3cml0ZVN5bWJvbCgnPicpOwogICAgfQogICAgd3JpdGVTeW1ib2woJ1snKTsKICAgIHdyaXRlTGlzdChub2RlLmV4cHJlc3Npb25zLCB3cml0ZU5vZGUpOwogICAgd3JpdGVTeW1ib2woJ10nKTsKICB9CgogIHZpc2l0U2V0TGl0ZXJhbChTZXRMaXRlcmFsIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgd3JpdGVXb3JkKCdjb25zdCcpOwogICAgICB3cml0ZVNwYWNlKCk7CiAgICB9CiAgICBpZiAobm9kZS50eXBlQXJndW1lbnQgIT0gbnVsbCkgewogICAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgICB3cml0ZVR5cGUobm9kZS50eXBlQXJndW1lbnQpOwogICAgICB3cml0ZVN5bWJvbCgnPicpOwogICAgfQogICAgd3JpdGVTeW1ib2woJ3snKTsKICAgIHdyaXRlTGlzdChub2RlLmV4cHJlc3Npb25zLCB3cml0ZU5vZGUpOwogICAgd3JpdGVTeW1ib2woJ30nKTsKICB9CgogIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgd3JpdGVXb3JkKCdjb25zdCcpOwogICAgICB3cml0ZVNwYWNlKCk7CiAgICB9CiAgICBpZiAobm9kZS5rZXlUeXBlICE9IG51bGwpIHsKICAgICAgd3JpdGVTeW1ib2woJzwnKTsKICAgICAgd3JpdGVMaXN0KFtub2RlLmtleVR5cGUsIG5vZGUudmFsdWVUeXBlXSwgd3JpdGVUeXBlKTsKICAgICAgd3JpdGVTeW1ib2woJz4nKTsKICAgIH0KICAgIHdyaXRlU3ltYm9sKCd7Jyk7CiAgICB3cml0ZUxpc3Qobm9kZS5lbnRyaWVzLCB3cml0ZU5vZGUpOwogICAgd3JpdGVTeW1ib2woJ30nKTsKICB9CgogIHZpc2l0TWFwRW50cnkoTWFwRW50cnkgbm9kZSkgewogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUua2V5KTsKICAgIHdyaXRlQ29tbWEoJzonKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnZhbHVlKTsKICB9CgogIHZpc2l0QXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ2F3YWl0Jyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5vcGVyYW5kKTsKICB9CgogIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKEZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUZ1bmN0aW9uKG5vZGUuZnVuY3Rpb24sIHRlcm1pbmF0ZUxpbmU6IGZhbHNlKTsKICB9CgogIHZpc2l0U3RyaW5nTGl0ZXJhbChTdHJpbmdMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnIiR7ZXNjYXBlU3RyaW5nKG5vZGUudmFsdWUpfSInKTsKICB9CgogIHZpc2l0SW50TGl0ZXJhbChJbnRMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnJHtub2RlLnZhbHVlfScpOwogIH0KCiAgdmlzaXREb3VibGVMaXRlcmFsKERvdWJsZUxpdGVyYWwgbm9kZSkgewogICAgd3JpdGVXb3JkKCcke25vZGUudmFsdWV9Jyk7CiAgfQoKICB2aXNpdEJvb2xMaXRlcmFsKEJvb2xMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnJHtub2RlLnZhbHVlfScpOwogIH0KCiAgdmlzaXROdWxsTGl0ZXJhbChOdWxsTGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ251bGwnKTsKICB9CgogIHZpc2l0TGV0KExldCBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ2xldCcpOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUudmFyaWFibGUpOwogICAgd3JpdGVTcGFjZWQoJ2luJyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5ib2R5KTsKICB9CgogIHZpc2l0QmxvY2tFeHByZXNzaW9uKEJsb2NrRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZVNwYWNlZCgnYmxvY2snKTsKICAgIHdyaXRlQmxvY2tCb2R5KG5vZGUuYm9keS5zdGF0ZW1lbnRzLCBhc0V4cHJlc3Npb246IHRydWUpOwogICAgd3JpdGVTeW1ib2woJyA9PicpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXRJbnN0YW50aWF0aW9uKEluc3RhbnRpYXRpb24gbm9kZSkgewogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbik7CiAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgd3JpdGVMaXN0KG5vZGUudHlwZUFyZ3VtZW50cywgd3JpdGVUeXBlKTsKICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgfQoKICB2aXNpdExvYWRMaWJyYXJ5KExvYWRMaWJyYXJ5IG5vZGUpIHsKICAgIHdyaXRlV29yZCgnTG9hZExpYnJhcnknKTsKICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICB3cml0ZVdvcmQobm9kZS5pbXBvcnQubmFtZSk7CiAgICB3cml0ZVN5bWJvbCgnKScpOwogICAgc3RhdGUgPSBXT1JEOwogIH0KCiAgdmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZChDaGVja0xpYnJhcnlJc0xvYWRlZCBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ0NoZWNrTGlicmFyeUlzTG9hZGVkJyk7CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgd3JpdGVXb3JkKG5vZGUuaW1wb3J0Lm5hbWUpOwogICAgd3JpdGVTeW1ib2woJyknKTsKICAgIHN0YXRlID0gV09SRDsKICB9CgogIHZpc2l0TGlicmFyeVBhcnQoTGlicmFyeVBhcnQgbm9kZSkgewogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zKTsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlV29yZCgncGFydCcpOwogICAgd3JpdGVXb3JkKG5vZGUucGFydFVyaSk7CiAgICBlbmRMaW5lKCI7Iik7CiAgfQoKICB2aXNpdExpYnJhcnlEZXBlbmRlbmN5KExpYnJhcnlEZXBlbmRlbmN5IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlV29yZChub2RlLmlzSW1wb3J0ID8gJ2ltcG9ydCcgOiAnZXhwb3J0Jyk7CiAgICB2YXIgdXJpU3RyaW5nOwogICAgaWYgKG5vZGUuaW1wb3J0ZWRMaWJyYXJ5UmVmZXJlbmNlPy5ub2RlICE9IG51bGwpIHsKICAgICAgdXJpU3RyaW5nID0gJyR7bm9kZS50YXJnZXRMaWJyYXJ5LmltcG9ydFVyaX0nOwogICAgfSBlbHNlIHsKICAgICAgdXJpU3RyaW5nID0gJyR7bm9kZS5pbXBvcnRlZExpYnJhcnlSZWZlcmVuY2U/LmNhbm9uaWNhbE5hbWU/Lm5hbWV9JzsKICAgIH0KICAgIHdyaXRlV29yZCgnIiR1cmlTdHJpbmciJyk7CiAgICBpZiAobm9kZS5pc0RlZmVycmVkKSB7CiAgICAgIHdyaXRlV29yZCgnZGVmZXJyZWQnKTsKICAgIH0KICAgIGlmIChub2RlLm5hbWUgIT0gbnVsbCkgewogICAgICB3cml0ZVdvcmQoJ2FzJyk7CiAgICAgIHdyaXRlV29yZChub2RlLm5hbWUpOwogICAgfQogICAgZW5kTGluZSgnOycpOwogIH0KCiAgZGVmYXVsdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZVdvcmQoJyR7bm9kZS5ydW50aW1lVHlwZX0nKTsKICB9CgogIHZpc2l0VmFyaWFibGVHZXQoVmFyaWFibGVHZXQgbm9kZSkgewogICAgd3JpdGVWYXJpYWJsZVJlZmVyZW5jZShub2RlLnZhcmlhYmxlKTsKICAgIGlmIChub2RlLnByb21vdGVkVHlwZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlU3ltYm9sKCd7Jyk7CiAgICAgIHdyaXRlTm9kZShub2RlLnByb21vdGVkVHlwZSk7CiAgICAgIHdyaXRlU3ltYm9sKCd9Jyk7CiAgICAgIHN0YXRlID0gV09SRDsKICAgIH0KICB9CgogIHZpc2l0VmFyaWFibGVTZXQoVmFyaWFibGVTZXQgbm9kZSkgewogICAgd3JpdGVWYXJpYWJsZVJlZmVyZW5jZShub2RlLnZhcmlhYmxlKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS52YWx1ZSk7CiAgfQoKICB2b2lkIHdyaXRlSW50ZXJmYWNlVGFyZ2V0KE5hbWUgbmFtZSwgUmVmZXJlbmNlIHRhcmdldCkgewogICAgaWYgKHRhcmdldCAhPSBudWxsKSB7CiAgICAgIHdyaXRlU3ltYm9sKCd7Jyk7CiAgICAgIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZSh0YXJnZXQpOwogICAgICB3cml0ZVN5bWJvbCgnfScpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVOYW1lKG5hbWUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVN0YXRpY1R5cGUoRGFydFR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICB3cml0ZVN5bWJvbCgneycpOwogICAgICB3cml0ZVR5cGUodHlwZSk7CiAgICAgIHdyaXRlU3ltYm9sKCd9Jyk7CiAgICB9CiAgfQoKICB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnJlY2VpdmVyLCBQcmVjZWRlbmNlLlBSSU1BUlkpOwogICAgd3JpdGVTeW1ib2woJy4nKTsKICAgIHdyaXRlSW50ZXJmYWNlVGFyZ2V0KG5vZGUubmFtZSwgbm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgdmlzaXRQcm9wZXJ0eVNldChQcm9wZXJ0eVNldCBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5yZWNlaXZlciwgUHJlY2VkZW5jZS5QUklNQVJZKTsKICAgIHdyaXRlU3ltYm9sKCcuJyk7CiAgICB3cml0ZUludGVyZmFjZVRhcmdldChub2RlLm5hbWUsIG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdFN1cGVyUHJvcGVydHlHZXQoU3VwZXJQcm9wZXJ0eUdldCBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ3N1cGVyJyk7CiAgICB3cml0ZVN5bWJvbCgnLicpOwogICAgd3JpdGVJbnRlcmZhY2VUYXJnZXQobm9kZS5uYW1lLCBub2RlLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICB2aXNpdFN1cGVyUHJvcGVydHlTZXQoU3VwZXJQcm9wZXJ0eVNldCBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ3N1cGVyJyk7CiAgICB3cml0ZVN5bWJvbCgnLicpOwogICAgd3JpdGVJbnRlcmZhY2VUYXJnZXQobm9kZS5uYW1lLCBub2RlLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXREaXJlY3RQcm9wZXJ0eUdldChEaXJlY3RQcm9wZXJ0eUdldCBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5yZWNlaXZlciwgUHJlY2VkZW5jZS5QUklNQVJZKTsKICAgIHdyaXRlU3ltYm9sKCcuez0nKTsKICAgIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZVN5bWJvbCgnfScpOwogIH0KCiAgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5yZWNlaXZlciwgUHJlY2VkZW5jZS5QUklNQVJZKTsKICAgIHdyaXRlU3ltYm9sKCcuez0nKTsKICAgIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZVN5bWJvbCgnfScpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnZhbHVlKTsKICB9CgogIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlKSB7CiAgICB3cml0ZU1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgdmlzaXRTdGF0aWNTZXQoU3RhdGljU2V0IG5vZGUpIHsKICAgIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbik7CiAgICBlbmRMaW5lKCc7Jyk7CiAgfQoKICB2b2lkIHdyaXRlQmxvY2tCb2R5KExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzLCB7Ym9vbCBhc0V4cHJlc3Npb24gPSBmYWxzZX0pIHsKICAgIGlmIChzdGF0ZW1lbnRzLmlzRW1wdHkpIHsKICAgICAgYXNFeHByZXNzaW9uID8gd3JpdGVTeW1ib2woJ3t9JykgOiBlbmRMaW5lKCd7fScpOwogICAgICByZXR1cm47CiAgICB9CiAgICBlbmRMaW5lKCd7Jyk7CiAgICArK2luZGVudGF0aW9uOwogICAgc3RhdGVtZW50cy5mb3JFYWNoKHdyaXRlTm9kZSk7CiAgICAtLWluZGVudGF0aW9uOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgYXNFeHByZXNzaW9uID8gd3JpdGVTeW1ib2woJ30nKSA6IGVuZExpbmUoJ30nKTsKICB9CgogIHZpc2l0QmxvY2soQmxvY2sgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVCbG9ja0JvZHkobm9kZS5zdGF0ZW1lbnRzKTsKICB9CgogIHZpc2l0QXNzZXJ0QmxvY2soQXNzZXJ0QmxvY2sgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVTcGFjZWQoJ2Fzc2VydCcpOwogICAgd3JpdGVCbG9ja0JvZHkobm9kZS5zdGF0ZW1lbnRzKTsKICB9CgogIHZpc2l0RW1wdHlTdGF0ZW1lbnQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgZW5kTGluZSgnOycpOwogIH0KCiAgdmlzaXRBc3NlcnRTdGF0ZW1lbnQoQXNzZXJ0U3RhdGVtZW50IG5vZGUsIHtib29sIGFzRXhwcmVzc2lvbiA9IGZhbHNlfSkgewogICAgaWYgKCFhc0V4cHJlc3Npb24pIHsKICAgICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgfQogICAgd3JpdGVXb3JkKCdhc3NlcnQnKTsKICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5jb25kaXRpb24pOwogICAgaWYgKG5vZGUubWVzc2FnZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlQ29tbWEoKTsKICAgICAgd3JpdGVFeHByZXNzaW9uKG5vZGUubWVzc2FnZSk7CiAgICB9CiAgICBpZiAoIWFzRXhwcmVzc2lvbikgewogICAgICBlbmRMaW5lKCcpOycpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVTeW1ib2woJyknKTsKICAgIH0KICB9CgogIHZpc2l0TGFiZWxlZFN0YXRlbWVudChMYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlV29yZChzeW50aGV0aWNOYW1lcy5uYW1lTGFiZWxlZFN0YXRlbWVudChub2RlKSk7CiAgICBlbmRMaW5lKCc6Jyk7CiAgICB3cml0ZU5vZGUobm9kZS5ib2R5KTsKICB9CgogIHZpc2l0QnJlYWtTdGF0ZW1lbnQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCdicmVhaycpOwogICAgd3JpdGVXb3JkKHN5bnRoZXRpY05hbWVzLm5hbWVMYWJlbGVkU3RhdGVtZW50KG5vZGUudGFyZ2V0KSk7CiAgICBlbmRMaW5lKCc7Jyk7CiAgfQoKICB2aXNpdFdoaWxlU3RhdGVtZW50KFdoaWxlU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlU3BhY2VkKCd3aGlsZScpOwogICAgd3JpdGVTeW1ib2woJygnKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLmNvbmRpdGlvbik7CiAgICB3cml0ZVN5bWJvbCgnKScpOwogICAgd3JpdGVCb2R5KG5vZGUuYm9keSk7CiAgfQoKICB2aXNpdERvU3RhdGVtZW50KERvU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlV29yZCgnZG8nKTsKICAgIHdyaXRlQm9keShub2RlLmJvZHkpOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVTcGFjZWQoJ3doaWxlJyk7CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuY29uZGl0aW9uKTsKICAgIGVuZExpbmUoJyknKTsKICB9CgogIHZpc2l0Rm9yU3RhdGVtZW50KEZvclN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVNwYWNlZCgnZm9yJyk7CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgd3JpdGVMaXN0KG5vZGUudmFyaWFibGVzLCB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24pOwogICAgd3JpdGVDb21tYSgnOycpOwogICAgaWYgKG5vZGUuY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuY29uZGl0aW9uKTsKICAgIH0KICAgIHdyaXRlQ29tbWEoJzsnKTsKICAgIHdyaXRlTGlzdChub2RlLnVwZGF0ZXMsIHdyaXRlRXhwcmVzc2lvbik7CiAgICB3cml0ZVN5bWJvbCgnKScpOwogICAgd3JpdGVCb2R5KG5vZGUuYm9keSk7CiAgfQoKICB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIGlmIChub2RlLmlzQXN5bmMpIHsKICAgICAgd3JpdGVTcGFjZWQoJ2F3YWl0Jyk7CiAgICB9CiAgICB3cml0ZVNwYWNlZCgnZm9yJyk7CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUudmFyaWFibGUsIHVzZVZhcktleXdvcmQ6IHRydWUpOwogICAgd3JpdGVTcGFjZWQoJ2luJyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5pdGVyYWJsZSk7CiAgICB3cml0ZVN5bWJvbCgnKScpOwogICAgd3JpdGVCb2R5KG5vZGUuYm9keSk7CiAgfQoKICB2aXNpdFN3aXRjaFN0YXRlbWVudChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCdzd2l0Y2gnKTsKICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICAgIGVuZExpbmUoJykgeycpOwogICAgKytpbmRlbnRhdGlvbjsKICAgIG5vZGUuY2FzZXMuZm9yRWFjaCh3cml0ZU5vZGUpOwogICAgLS1pbmRlbnRhdGlvbjsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIGVuZExpbmUoJ30nKTsKICB9CgogIHZpc2l0U3dpdGNoQ2FzZShTd2l0Y2hDYXNlIG5vZGUpIHsKICAgIFN0cmluZyBsYWJlbCA9IHN5bnRoZXRpY05hbWVzLm5hbWVTd2l0Y2hDYXNlKG5vZGUpOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKGxhYmVsKTsKICAgIGVuZExpbmUoJzonKTsKICAgIGZvciAodmFyIGV4cHJlc3Npb24gaW4gbm9kZS5leHByZXNzaW9ucykgewogICAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICAgIHdyaXRlV29yZCgnY2FzZScpOwogICAgICB3cml0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7CiAgICAgIGVuZExpbmUoJzonKTsKICAgIH0KICAgIGlmIChub2RlLmlzRGVmYXVsdCkgewogICAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICAgIHdyaXRlV29yZCgnZGVmYXVsdCcpOwogICAgICBlbmRMaW5lKCc6Jyk7CiAgICB9CiAgICArK2luZGVudGF0aW9uOwogICAgd3JpdGVOb2RlKG5vZGUuYm9keSk7CiAgICAtLWluZGVudGF0aW9uOwogIH0KCiAgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChDb250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ2NvbnRpbnVlJyk7CiAgICB3cml0ZVdvcmQoc3ludGhldGljTmFtZXMubmFtZVN3aXRjaENhc2Uobm9kZS50YXJnZXQpKTsKICAgIGVuZExpbmUoJzsnKTsKICB9CgogIHZpc2l0SWZTdGF0ZW1lbnQoSWZTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCdpZicpOwogICAgd3JpdGVTeW1ib2woJygnKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLmNvbmRpdGlvbik7CiAgICB3cml0ZVN5bWJvbCgnKScpOwogICAgd3JpdGVCb2R5KG5vZGUudGhlbik7CiAgICBpZiAobm9kZS5vdGhlcndpc2UgIT0gbnVsbCkgewogICAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICAgIHdyaXRlV29yZCgnZWxzZScpOwogICAgICB3cml0ZUJvZHkobm9kZS5vdGhlcndpc2UpOwogICAgfQogIH0KCiAgdmlzaXRSZXR1cm5TdGF0ZW1lbnQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlV29yZCgncmV0dXJuJyk7CiAgICBpZiAobm9kZS5leHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgd3JpdGVTcGFjZSgpOwogICAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICAgIH0KICAgIGVuZExpbmUoJzsnKTsKICB9CgogIHZpc2l0VHJ5Q2F0Y2goVHJ5Q2F0Y2ggbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCd0cnknKTsKICAgIHdyaXRlQm9keShub2RlLmJvZHkpOwogICAgbm9kZS5jYXRjaGVzLmZvckVhY2god3JpdGVOb2RlKTsKICB9CgogIHZpc2l0Q2F0Y2goQ2F0Y2ggbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgaWYgKG5vZGUuZ3VhcmQgIT0gbnVsbCkgewogICAgICB3cml0ZVdvcmQoJ29uJyk7CiAgICAgIHdyaXRlVHlwZShub2RlLmd1YXJkKTsKICAgICAgd3JpdGVTcGFjZSgpOwogICAgfQogICAgd3JpdGVXb3JkKCdjYXRjaCcpOwogICAgd3JpdGVTeW1ib2woJygnKTsKICAgIGlmIChub2RlLmV4Y2VwdGlvbiAhPSBudWxsKSB7CiAgICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLmV4Y2VwdGlvbik7CiAgICB9IGVsc2UgewogICAgICB3cml0ZVdvcmQoJ25vLWV4Y2VwdGlvbi12YXInKTsKICAgIH0KICAgIGlmIChub2RlLnN0YWNrVHJhY2UgIT0gbnVsbCkgewogICAgICB3cml0ZUNvbW1hKCk7CiAgICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLnN0YWNrVHJhY2UpOwogICAgfQogICAgd3JpdGVTeW1ib2woJyknKTsKICAgIHdyaXRlQm9keShub2RlLmJvZHkpOwogIH0KCiAgdmlzaXRUcnlGaW5hbGx5KFRyeUZpbmFsbHkgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCd0cnknKTsKICAgIHdyaXRlQm9keShub2RlLmJvZHkpOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCdmaW5hbGx5Jyk7CiAgICB3cml0ZUJvZHkobm9kZS5maW5hbGl6ZXIpOwogIH0KCiAgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICBpZiAobm9kZS5pc1lpZWxkU3RhcikgewogICAgICB3cml0ZVdvcmQoJ3lpZWxkKicpOwogICAgfSBlbHNlIGlmIChub2RlLmlzTmF0aXZlKSB7CiAgICAgIHdyaXRlV29yZCgnW3lpZWxkXScpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVXb3JkKCd5aWVsZCcpOwogICAgfQogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbik7CiAgICBlbmRMaW5lKCc7Jyk7CiAgfQoKICB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSwgdXNlVmFyS2V5d29yZDogdHJ1ZSk7CiAgICBlbmRMaW5lKCc7Jyk7CiAgfQoKICB2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24oRnVuY3Rpb25EZWNsYXJhdGlvbiBub2RlKSB7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUudmFyaWFibGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCdmdW5jdGlvbicpOwogICAgaWYgKG5vZGUuZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICB3cml0ZUZ1bmN0aW9uKG5vZGUuZnVuY3Rpb24sIG5hbWU6IGdldFZhcmlhYmxlTmFtZShub2RlLnZhcmlhYmxlKSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZVdvcmQoZ2V0VmFyaWFibGVOYW1lKG5vZGUudmFyaWFibGUpKTsKICAgICAgZW5kTGluZSgnLi4uOycpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlLAogICAgICB7Ym9vbCB1c2VWYXJLZXl3b3JkOiBmYWxzZX0pIHsKICAgIGlmIChzaG93T2Zmc2V0cykgd3JpdGVXb3JkKCJbJHtub2RlLmZpbGVPZmZzZXR9XSIpOwogICAgaWYgKHNob3dNZXRhZGF0YSkgd3JpdGVNZXRhZGF0YShub2RlKTsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucywgc2VwYXJhdGVMaW5lczogZmFsc2UpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzQ292YXJpYW50LCAnY292YXJpYW50Jyk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNHZW5lcmljQ292YXJpYW50SW1wbCwgJ2dlbmVyaWMtY292YXJpYW50LWltcGwnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0ZpbmFsLCAnZmluYWwnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0NvbnN0LCAnY29uc3QnKTsKICAgIGlmIChub2RlLnR5cGUgIT0gbnVsbCkgewogICAgICB3cml0ZUFubm90YXRlZFR5cGUobm9kZS50eXBlLCBhbm5vdGF0b3I/LmFubm90YXRlVmFyaWFibGUodGhpcywgbm9kZSkpOwogICAgfQogICAgaWYgKHVzZVZhcktleXdvcmQgJiYgIW5vZGUuaXNGaW5hbCAmJiAhbm9kZS5pc0NvbnN0ICYmIG5vZGUudHlwZSA9PSBudWxsKSB7CiAgICAgIHdyaXRlV29yZCgndmFyJyk7CiAgICB9CiAgICB3cml0ZVdvcmQoZ2V0VmFyaWFibGVOYW1lKG5vZGUpKTsKICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgfQogIH0KCiAgdmlzaXRBcmd1bWVudHMoQXJndW1lbnRzIG5vZGUpIHsKICAgIGlmIChub2RlLnR5cGVzLmlzTm90RW1wdHkpIHsKICAgICAgd3JpdGVTeW1ib2woJzwnKTsKICAgICAgd3JpdGVMaXN0KG5vZGUudHlwZXMsIHdyaXRlVHlwZSk7CiAgICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICB9CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgdmFyIGFsbEFyZ3MgPQogICAgICAgIDxMaXN0PFRyZWVOb2RlPj5bbm9kZS5wb3NpdGlvbmFsLCBub2RlLm5hbWVkXS5leHBhbmQoKHgpID0+IHgpOwogICAgd3JpdGVMaXN0KGFsbEFyZ3MsIHdyaXRlTm9kZSk7CiAgICB3cml0ZVN5bWJvbCgnKScpOwogIH0KCiAgdmlzaXROYW1lZEV4cHJlc3Npb24oTmFtZWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlV29yZChub2RlLm5hbWUpOwogICAgd3JpdGVDb21tYSgnOicpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUudmFsdWUpOwogIH0KCiAgZGVmYXVsdFN0YXRlbWVudChTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgZW5kTGluZSgnJHtub2RlLnJ1bnRpbWVUeXBlfScpOwogIH0KCiAgdmlzaXRJbnZhbGlkSW5pdGlhbGl6ZXIoSW52YWxpZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnaW52YWxpZC1pbml0aWFsaXplcicpOwogIH0KCiAgdmlzaXRGaWVsZEluaXRpYWxpemVyKEZpZWxkSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUuZmllbGRSZWZlcmVuY2UpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnZhbHVlKTsKICB9CgogIHZpc2l0U3VwZXJJbml0aWFsaXplcihTdXBlckluaXRpYWxpemVyIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnc3VwZXInKTsKICAgIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGUobm9kZS5hcmd1bWVudHMpOwogIH0KCiAgdmlzaXRSZWRpcmVjdGluZ0luaXRpYWxpemVyKFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVXb3JkKCd0aGlzJyk7CiAgICB3cml0ZU1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVOb2RlKG5vZGUuYXJndW1lbnRzKTsKICB9CgogIHZpc2l0TG9jYWxJbml0aWFsaXplcihMb2NhbEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLnZhcmlhYmxlKTsKICB9CgogIHZpc2l0QXNzZXJ0SW5pdGlhbGl6ZXIoQXNzZXJ0SW5pdGlhbGl6ZXIgbm9kZSkgewogICAgdmlzaXRBc3NlcnRTdGF0ZW1lbnQobm9kZS5zdGF0ZW1lbnQsIGFzRXhwcmVzc2lvbjogdHJ1ZSk7CiAgfQoKICBkZWZhdWx0SW5pdGlhbGl6ZXIoSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgZW5kTGluZSgnOiAke25vZGUucnVudGltZVR5cGV9Jyk7CiAgfQoKICB3cml0ZU51bGxhYmlsaXR5KE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICBzd2l0Y2ggKG51bGxhYmlsaXR5KSB7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubGVnYWN5OgogICAgICAgIHdyaXRlU3ltYm9sKCcqJyk7CiAgICAgICAgc3RhdGUgPSBXT1JEOyAvLyBEaXNhbGxvdyBhIHdvcmQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlICcqJy4KICAgICAgICBicmVhazsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5udWxsYWJsZToKICAgICAgICB3cml0ZVN5bWJvbCgnPycpOyAvLyBEaXNhbGxvdyBhIHdvcmQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlICc/Jy4KICAgICAgICBicmVhazsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5uZWl0aGVyOgogICAgICBjYXNlIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlOgogICAgICAgIC8vIERvIG5vdGhpbmcuCiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnaW52YWxpZC10eXBlJyk7CiAgfQoKICB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnZHluYW1pYycpOwogIH0KCiAgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ3ZvaWQnKTsKICB9CgogIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIHdyaXRlQ2xhc3NSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUuY2xhc3NOYW1lKTsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgICB3cml0ZUxpc3Qobm9kZS50eXBlQXJndW1lbnRzLCB3cml0ZVR5cGUpOwogICAgICB3cml0ZVN5bWJvbCgnPicpOwogICAgICBzdGF0ZSA9IFdPUkQ7IC8vIERpc2FsbG93IGEgd29yZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgJz4nLgogICAgfQogICAgd3JpdGVOdWxsYWJpbGl0eShub2RlLm51bGxhYmlsaXR5KTsKICB9CgogIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICB3cml0ZUZ1bmN0aW9uVHlwZShub2RlKTsKICB9CgogIHZpc2l0TmFtZWRUeXBlKE5hbWVkVHlwZSBub2RlKSB7CiAgICB3cml0ZVdvcmQobm9kZS5uYW1lKTsKICAgIHdyaXRlU3ltYm9sKCc6Jyk7CiAgICB3cml0ZVNwYWNlKCk7CiAgICB3cml0ZVR5cGUobm9kZS50eXBlKTsKICB9CgogIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgd3JpdGVUeXBlUGFyYW1ldGVyUmVmZXJlbmNlKG5vZGUucGFyYW1ldGVyKTsKICAgIHdyaXRlTnVsbGFiaWxpdHkobm9kZS5udWxsYWJpbGl0eSk7CiAgICBpZiAobm9kZS5wcm9tb3RlZEJvdW5kICE9IG51bGwpIHsKICAgICAgd3JpdGVTcGFjZSgpOwogICAgICB3cml0ZVdvcmQoJ2V4dGVuZHMnKTsKICAgICAgd3JpdGVTcGFjZSgpOwogICAgICB3cml0ZVR5cGUobm9kZS5wcm9tb3RlZEJvdW5kKTsKICAgIH0KICB9CgogIHZpc2l0VHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsLCAnZ2VuZXJpYy1jb3ZhcmlhbnQtaW1wbCcpOwogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zLCBzZXBhcmF0ZUxpbmVzOiBmYWxzZSk7CiAgICB3cml0ZVdvcmQoZ2V0VHlwZVBhcmFtZXRlck5hbWUobm9kZSkpOwogICAgd3JpdGVTcGFjZWQoJ2V4dGVuZHMnKTsKICAgIHdyaXRlVHlwZShub2RlLmJvdW5kKTsKICAgIGlmIChub2RlLmRlZmF1bHRUeXBlICE9IG51bGwpIHsKICAgICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgICAgd3JpdGVUeXBlKG5vZGUuZGVmYXVsdFR5cGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUNvbnN0YW50UmVmZXJlbmNlKENvbnN0YW50IG5vZGUpIHsKICAgIHdyaXRlV29yZChzeW50aGV0aWNOYW1lcy5uYW1lQ29uc3RhbnQobm9kZSkpOwogIH0KCiAgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2Uobm9kZS5jb25zdGFudCk7CiAgfQoKICBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICBlbmRMaW5lKCckbm9kZScpOwogIH0KCiAgdmlzaXRMaXN0Q29uc3RhbnQoTGlzdENvbnN0YW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgd3JpdGVTeW1ib2woJzwnKTsKICAgIHdyaXRlVHlwZShub2RlLnR5cGVBcmd1bWVudCk7CiAgICB3cml0ZVN5bWJvbCgnPlsnKTsKICAgIHdyaXRlTGlzdChub2RlLmVudHJpZXMsIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2UpOwogICAgZW5kTGluZSgnXScpOwogIH0KCiAgdmlzaXRTZXRDb25zdGFudChTZXRDb25zdGFudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZUNvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICB3cml0ZVR5cGUobm9kZS50eXBlQXJndW1lbnQpOwogICAgd3JpdGVTeW1ib2woJz57Jyk7CiAgICB3cml0ZUxpc3Qobm9kZS5lbnRyaWVzLCB3cml0ZUNvbnN0YW50UmVmZXJlbmNlKTsKICAgIGVuZExpbmUoJ30nKTsKICB9CgogIHZpc2l0TWFwQ29uc3RhbnQoTWFwQ29uc3RhbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgd3JpdGVMaXN0KFtub2RlLmtleVR5cGUsIG5vZGUudmFsdWVUeXBlXSwgd3JpdGVUeXBlKTsKICAgIHdyaXRlU3ltYm9sKCc+eycpOwogICAgd3JpdGVMaXN0KG5vZGUuZW50cmllcywgKGVudHJ5KSB7CiAgICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2UoZW50cnkua2V5KTsKICAgICAgd3JpdGVTeW1ib2woJzonKTsKICAgICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShlbnRyeS52YWx1ZSk7CiAgICB9KTsKICAgIGVuZExpbmUoJyknKTsKICB9CgogIHZpc2l0SW5zdGFuY2VDb25zdGFudChJbnN0YW5jZUNvbnN0YW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgd3JpdGVDbGFzc1JlZmVyZW5jZUZyb21SZWZlcmVuY2Uobm9kZS5jbGFzc1JlZmVyZW5jZSk7CiAgICBpZiAoIW5vZGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgd3JpdGVTeW1ib2woJzwnKTsKICAgICAgd3JpdGVMaXN0KG5vZGUudHlwZUFyZ3VtZW50cywgd3JpdGVUeXBlKTsKICAgICAgd3JpdGVTeW1ib2woJz4nKTsKICAgIH0KICAgIHdyaXRlU3ltYm9sKCcgeycpOwogICAgd3JpdGVMaXN0KG5vZGUuZmllbGRWYWx1ZXMuZW50cmllcywgKGVudHJ5KSB7CiAgICAgIHdyaXRlV29yZCgnJHtlbnRyeS5rZXkuYXNGaWVsZC5uYW1lLm5hbWV9Jyk7CiAgICAgIHdyaXRlU3ltYm9sKCc6Jyk7CiAgICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2UoZW50cnkudmFsdWUpOwogICAgfSk7CiAgICBlbmRMaW5lKCd9Jyk7CiAgfQoKICB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZUNvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIHdyaXRlV29yZCgncGFydGlhbC1pbnN0YW50aWF0aW9uJyk7CiAgICB3cml0ZVNwYWNlKCk7CiAgICB3cml0ZU1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2Uobm9kZS50ZWFyT2ZmQ29uc3RhbnQucHJvY2VkdXJlUmVmZXJlbmNlKTsKICAgIHdyaXRlU3BhY2UoKTsKICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICB3cml0ZUxpc3Qobm9kZS50eXBlcywgd3JpdGVUeXBlKTsKICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICBlbmRMaW5lKCk7CiAgfQoKICB2aXNpdFN0cmluZ0NvbnN0YW50KFN0cmluZ0NvbnN0YW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgZW5kTGluZSgnIiR7ZXNjYXBlU3RyaW5nKG5vZGUudmFsdWUpfSInKTsKICB9CgogIHZpc2l0VGVhck9mZkNvbnN0YW50KFRlYXJPZmZDb25zdGFudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZUNvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIHdyaXRlV29yZCgndGVhcm9mZicpOwogICAgd3JpdGVTcGFjZSgpOwogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUucHJvY2VkdXJlUmVmZXJlbmNlKTsKICAgIGVuZExpbmUoKTsKICB9CgogIHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudChVbmV2YWx1YXRlZENvbnN0YW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgd3JpdGVTeW1ib2woJ2V2YWwnKTsKICAgIHdyaXRlU3BhY2UoKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pOwogICAgZW5kTGluZSgpOwogIH0KCiAgZGVmYXVsdE5vZGUoTm9kZSBub2RlKSB7CiAgICB3cml0ZSgnPCR7bm9kZS5ydW50aW1lVHlwZX0+Jyk7CiAgfQp9CgpjbGFzcyBQcmVjZWRlbmNlIGV4dGVuZHMgRXhwcmVzc2lvblZpc2l0b3I8aW50PiB7CiAgc3RhdGljIGZpbmFsIFByZWNlZGVuY2UgaW5zdGFuY2UgPSBuZXcgUHJlY2VkZW5jZSgpOwoKICBzdGF0aWMgaW50IG9mKEV4cHJlc3Npb24gbm9kZSkgPT4gbm9kZS5hY2NlcHQoaW5zdGFuY2UpOwoKICBzdGF0aWMgY29uc3QgaW50IEVYUFJFU1NJT04gPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgQ09ORElUSU9OQUwgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgTE9HSUNBTF9OVUxMX0FXQVJFID0gMzsKICBzdGF0aWMgY29uc3QgaW50IExPR0lDQUxfT1IgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgTE9HSUNBTF9BTkQgPSA1OwogIHN0YXRpYyBjb25zdCBpbnQgRVFVQUxJVFkgPSA2OwogIHN0YXRpYyBjb25zdCBpbnQgUkVMQVRJT05BTCA9IDc7CiAgc3RhdGljIGNvbnN0IGludCBCSVRXSVNFX09SID0gODsKICBzdGF0aWMgY29uc3QgaW50IEJJVFdJU0VfWE9SID0gOTsKICBzdGF0aWMgY29uc3QgaW50IEJJVFdJU0VfQU5EID0gMTA7CiAgc3RhdGljIGNvbnN0IGludCBTSElGVCA9IDExOwogIHN0YXRpYyBjb25zdCBpbnQgQURESVRJVkUgPSAxMjsKICBzdGF0aWMgY29uc3QgaW50IE1VTFRJUExJQ0FUSVZFID0gMTM7CiAgc3RhdGljIGNvbnN0IGludCBQUkVGSVggPSAxNDsKICBzdGF0aWMgY29uc3QgaW50IFBPU1RGSVggPSAxNTsKICBzdGF0aWMgY29uc3QgaW50IFRZUEVfTElURVJBTCA9IDE5OwogIHN0YXRpYyBjb25zdCBpbnQgUFJJTUFSWSA9IDIwOwogIHN0YXRpYyBjb25zdCBpbnQgQ0FMTEVFID0gMjE7CgogIHN0YXRpYyBjb25zdCBNYXA8U3RyaW5nLCBpbnQ+IGJpbmFyeVByZWNlZGVuY2UgPSBjb25zdCB7CiAgICAnJiYnOiBMT0dJQ0FMX0FORCwKICAgICd8fCc6IExPR0lDQUxfT1IsCiAgICAnPz8nOiBMT0dJQ0FMX05VTExfQVdBUkUsCiAgICAnPT0nOiBFUVVBTElUWSwKICAgICchPSc6IEVRVUFMSVRZLAogICAgJz4nOiBSRUxBVElPTkFMLAogICAgJz49JzogUkVMQVRJT05BTCwKICAgICc8JzogUkVMQVRJT05BTCwKICAgICc8PSc6IFJFTEFUSU9OQUwsCiAgICAnfCc6IEJJVFdJU0VfT1IsCiAgICAnXic6IEJJVFdJU0VfWE9SLAogICAgJyYnOiBCSVRXSVNFX0FORCwKICAgICc+Pic6IFNISUZULAogICAgJzw8JzogU0hJRlQsCiAgICAnKyc6IEFERElUSVZFLAogICAgJy0nOiBBRERJVElWRSwKICAgICcqJzogTVVMVElQTElDQVRJVkUsCiAgICAnJSc6IE1VTFRJUExJQ0FUSVZFLAogICAgJy8nOiBNVUxUSVBMSUNBVElWRSwKICAgICd+Lyc6IE1VTFRJUExJQ0FUSVZFLAogICAgbnVsbDogRVhQUkVTU0lPTiwKICB9OwoKICBzdGF0aWMgYm9vbCBpc0Fzc29jaWF0aXZlQmluYXJ5T3BlcmF0b3IoaW50IHByZWNlZGVuY2UpIHsKICAgIHJldHVybiBwcmVjZWRlbmNlICE9IEVRVUFMSVRZICYmIHByZWNlZGVuY2UgIT0gUkVMQVRJT05BTDsKICB9CgogIGludCBkZWZhdWx0RXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUpID0+IEVYUFJFU1NJT047CiAgaW50IHZpc2l0SW52YWxpZEV4cHJlc3Npb24oSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlKSA9PiBDQUxMRUU7CiAgaW50IHZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSA9PiBDQUxMRUU7CiAgaW50IHZpc2l0RGlyZWN0TWV0aG9kSW52b2NhdGlvbihEaXJlY3RNZXRob2RJbnZvY2F0aW9uIG5vZGUpID0+IENBTExFRTsKICBpbnQgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdE5vdChOb3Qgbm9kZSkgPT4gUFJFRklYOwogIGludCB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKExvZ2ljYWxFeHByZXNzaW9uIG5vZGUpID0+CiAgICAgIGJpbmFyeVByZWNlZGVuY2Vbbm9kZS5vcGVyYXRvcl07CiAgaW50IHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSA9PiBDT05ESVRJT05BTDsKICBpbnQgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgPT4gUFJJTUFSWTsKICBpbnQgdmlzaXRJc0V4cHJlc3Npb24oSXNFeHByZXNzaW9uIG5vZGUpID0+IFJFTEFUSU9OQUw7CiAgaW50IHZpc2l0QXNFeHByZXNzaW9uKEFzRXhwcmVzc2lvbiBub2RlKSA9PiBSRUxBVElPTkFMOwogIGludCB2aXNpdFN5bWJvbExpdGVyYWwoU3ltYm9sTGl0ZXJhbCBub2RlKSA9PiBQUklNQVJZOwogIGludCB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUpID0+IFBSSU1BUlk7CiAgaW50IHZpc2l0VGhpc0V4cHJlc3Npb24oVGhpc0V4cHJlc3Npb24gbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdFJldGhyb3coUmV0aHJvdyBub2RlKSA9PiBQUklNQVJZOwogIGludCB2aXNpdFRocm93KFRocm93IG5vZGUpID0+IEVYUFJFU1NJT047CiAgaW50IHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgPT4gUFJJTUFSWTsKICBpbnQgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSkgPT4gUFJJTUFSWTsKICBpbnQgdmlzaXRNYXBMaXRlcmFsKE1hcExpdGVyYWwgbm9kZSkgPT4gUFJJTUFSWTsKICBpbnQgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUpID0+IFBSRUZJWDsKICBpbnQgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpID0+IEVYUFJFU1NJT047CiAgaW50IHZpc2l0U3RyaW5nTGl0ZXJhbChTdHJpbmdMaXRlcmFsIG5vZGUpID0+IENBTExFRTsKICBpbnQgdmlzaXRJbnRMaXRlcmFsKEludExpdGVyYWwgbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlKSA9PiBDQUxMRUU7CiAgaW50IHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdE51bGxMaXRlcmFsKE51bGxMaXRlcmFsIG5vZGUpID0+IENBTExFRTsKICBpbnQgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlKSA9PiBQUklNQVJZOwogIGludCB2aXNpdFZhcmlhYmxlU2V0KFZhcmlhYmxlU2V0IG5vZGUpID0+IEVYUFJFU1NJT047CiAgaW50IHZpc2l0UHJvcGVydHlHZXQoUHJvcGVydHlHZXQgbm9kZSkgPT4gUFJJTUFSWTsKICBpbnQgdmlzaXRQcm9wZXJ0eVNldChQcm9wZXJ0eVNldCBub2RlKSA9PiBFWFBSRVNTSU9OOwogIGludCB2aXNpdFN1cGVyUHJvcGVydHlHZXQoU3VwZXJQcm9wZXJ0eUdldCBub2RlKSA9PiBQUklNQVJZOwogIGludCB2aXNpdFN1cGVyUHJvcGVydHlTZXQoU3VwZXJQcm9wZXJ0eVNldCBub2RlKSA9PiBFWFBSRVNTSU9OOwogIGludCB2aXNpdERpcmVjdFByb3BlcnR5R2V0KERpcmVjdFByb3BlcnR5R2V0IG5vZGUpID0+IFBSSU1BUlk7CiAgaW50IHZpc2l0RGlyZWN0UHJvcGVydHlTZXQoRGlyZWN0UHJvcGVydHlTZXQgbm9kZSkgPT4gRVhQUkVTU0lPTjsKICBpbnQgdmlzaXRTdGF0aWNHZXQoU3RhdGljR2V0IG5vZGUpID0+IFBSSU1BUlk7CiAgaW50IHZpc2l0U3RhdGljU2V0KFN0YXRpY1NldCBub2RlKSA9PiBFWFBSRVNTSU9OOwogIGludCB2aXNpdExldChMZXQgbm9kZSkgPT4gRVhQUkVTU0lPTjsKfQoKU3RyaW5nIHByb2NlZHVyZUtpbmRUb1N0cmluZyhQcm9jZWR1cmVLaW5kIGtpbmQpIHsKICBzd2l0Y2ggKGtpbmQpIHsKICAgIGNhc2UgUHJvY2VkdXJlS2luZC5NZXRob2Q6CiAgICAgIHJldHVybiAnbWV0aG9kJzsKICAgIGNhc2UgUHJvY2VkdXJlS2luZC5HZXR0ZXI6CiAgICAgIHJldHVybiAnZ2V0JzsKICAgIGNhc2UgUHJvY2VkdXJlS2luZC5TZXR0ZXI6CiAgICAgIHJldHVybiAnc2V0JzsKICAgIGNhc2UgUHJvY2VkdXJlS2luZC5PcGVyYXRvcjoKICAgICAgcmV0dXJuICdvcGVyYXRvcic7CiAgICBjYXNlIFByb2NlZHVy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Y2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmxpYnJhcnkga2VybmVsLmFzdC52aXNpdG9yOwoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCmltcG9ydCAnYXN0LmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvblZpc2l0b3I8Uj4gewogIGNvbnN0IEV4cHJlc3Npb25WaXNpdG9yKCk7CgogIFIgZGVmYXVsdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSA9PiBudWxsOwogIFIgZGVmYXVsdEJhc2ljTGl0ZXJhbChCYXNpY0xpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CgogIFIgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0VmFyaWFibGVHZXQoVmFyaWFibGVHZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFZhcmlhYmxlU2V0KFZhcmlhYmxlU2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRQcm9wZXJ0eUdldChQcm9wZXJ0eUdldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0UHJvcGVydHlTZXQoUHJvcGVydHlTZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdERpcmVjdFByb3BlcnR5R2V0KERpcmVjdFByb3BlcnR5R2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U3VwZXJQcm9wZXJ0eUdldChTdXBlclByb3BlcnR5R2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdXBlclByb3BlcnR5U2V0KFN1cGVyUHJvcGVydHlTZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN0YXRpY1NldChTdGF0aWNTZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0RGlyZWN0TWV0aG9kSW52b2NhdGlvbihEaXJlY3RNZXRob2RJbnZvY2F0aW9uIG5vZGUpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdE5vdChOb3Qgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKExvZ2ljYWxFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdExpc3RDb25jYXRlbmF0aW9uKExpc3RDb25jYXRlbmF0aW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTZXRDb25jYXRlbmF0aW9uKFNldENvbmNhdGVuYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdE1hcENvbmNhdGVuYXRpb24oTWFwQ29uY2F0ZW5hdGlvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0SW5zdGFuY2VDcmVhdGlvbihJbnN0YW5jZUNyZWF0aW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRJc0V4cHJlc3Npb24oSXNFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTeW1ib2xMaXRlcmFsKFN5bWJvbExpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0UmV0aHJvdyhSZXRocm93IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRUaHJvdyhUaHJvdyBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFNldExpdGVyYWwoU2V0TGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEJhc2ljTGl0ZXJhbChub2RlKTsKICBSIHZpc2l0SW50TGl0ZXJhbChJbnRMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSk7CiAgUiB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUpOwogIFIgdmlzaXRCb29sTGl0ZXJhbChCb29sTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUpOwogIFIgdmlzaXROdWxsTGl0ZXJhbChOdWxsTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUpOwogIFIgdmlzaXRMZXQoTGV0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRCbG9ja0V4cHJlc3Npb24oQmxvY2tFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRJbnN0YW50aWF0aW9uKEluc3RhbnRpYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdExvYWRMaWJyYXJ5KExvYWRMaWJyYXJ5IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZChDaGVja0xpYnJhcnlJc0xvYWRlZCBub2RlKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKfQoKYWJzdHJhY3QgY2xhc3MgU3RhdGVtZW50VmlzaXRvcjxSPiB7CiAgY29uc3QgU3RhdGVtZW50VmlzaXRvcigpOwoKICBSIGRlZmF1bHRTdGF0ZW1lbnQoU3RhdGVtZW50IG5vZGUpID0+IG51bGw7CgogIFIgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QmxvY2soQmxvY2sgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QXNzZXJ0QmxvY2soQXNzZXJ0QmxvY2sgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0RW1wdHlTdGF0ZW1lbnQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QXNzZXJ0U3RhdGVtZW50KEFzc2VydFN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QnJlYWtTdGF0ZW1lbnQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0V2hpbGVTdGF0ZW1lbnQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0RG9TdGF0ZW1lbnQoRG9TdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0Rm9yU3RhdGVtZW50KEZvclN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRGb3JJblN0YXRlbWVudChGb3JJblN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoU3dpdGNoU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KENvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdElmU3RhdGVtZW50KElmU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0VHJ5Q2F0Y2goVHJ5Q2F0Y2ggbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0VHJ5RmluYWxseShUcnlGaW5hbGx5IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlKTsKfQoKYWJzdHJhY3QgY2xhc3MgTWVtYmVyVmlzaXRvcjxSPiB7CiAgY29uc3QgTWVtYmVyVmlzaXRvcigpOwoKICBSIGRlZmF1bHRNZW1iZXIoTWVtYmVyIG5vZGUpID0+IG51bGw7CgogIFIgdmlzaXRDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvciBub2RlKSA9PiBkZWZhdWx0TWVtYmVyKG5vZGUpOwogIFIgdmlzaXRQcm9jZWR1cmUoUHJvY2VkdXJlIG5vZGUpID0+IGRlZmF1bHRNZW1iZXIobm9kZSk7CiAgUiB2aXNpdEZpZWxkKEZpZWxkIG5vZGUpID0+IGRlZmF1bHRNZW1iZXIobm9kZSk7CiAgUiB2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHJldHVybiBkZWZhdWx0TWVtYmVyKG5vZGUpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgSW5pdGlhbGl6ZXJWaXNpdG9yPFI+IHsKICBjb25zdCBJbml0aWFsaXplclZpc2l0b3IoKTsKCiAgUiBkZWZhdWx0SW5pdGlhbGl6ZXIoSW5pdGlhbGl6ZXIgbm9kZSkgPT4gbnVsbDsKCiAgUiB2aXNpdEludmFsaWRJbml0aWFsaXplcihJbnZhbGlkSW5pdGlhbGl6ZXIgbm9kZSkgPT4KICAgICAgZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRGaWVsZEluaXRpYWxpemVyKEZpZWxkSW5pdGlhbGl6ZXIgbm9kZSkgPT4gZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRTdXBlckluaXRpYWxpemVyKFN1cGVySW5pdGlhbGl6ZXIgbm9kZSkgPT4gZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRSZWRpcmVjdGluZ0luaXRpYWxpemVyKFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgbm9kZSkgPT4KICAgICAgZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRMb2NhbEluaXRpYWxpemVyKExvY2FsSW5pdGlhbGl6ZXIgbm9kZSkgPT4gZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRBc3NlcnRJbml0aWFsaXplcihBc3NlcnRJbml0aWFsaXplciBub2RlKSA9PiBkZWZhdWx0SW5pdGlhbGl6ZXIobm9kZSk7Cn0KCmNsYXNzIFRyZWVWaXNpdG9yPFI+CiAgICBpbXBsZW1lbnRzCiAgICAgICAgRXhwcmVzc2lvblZpc2l0b3I8Uj4sCiAgICAgICAgU3RhdGVtZW50VmlzaXRvcjxSPiwKICAgICAgICBNZW1iZXJWaXNpdG9yPFI+LAogICAgICAgIEluaXRpYWxpemVyVmlzaXRvcjxSPiB7CiAgY29uc3QgVHJlZVZpc2l0b3IoKTsKCiAgUiBkZWZhdWx0VHJlZU5vZGUoVHJlZU5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8gRXhwcmVzc2lvbnMKICBSIGRlZmF1bHRFeHByZXNzaW9uKEV4cHJlc3Npb24gbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgZGVmYXVsdEJhc2ljTGl0ZXJhbChCYXNpY0xpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdEludmFsaWRFeHByZXNzaW9uKEludmFsaWRFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0VmFyaWFibGVTZXQoVmFyaWFibGVTZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRQcm9wZXJ0eVNldChQcm9wZXJ0eVNldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdERpcmVjdFByb3BlcnR5U2V0KERpcmVjdFByb3BlcnR5U2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN1cGVyUHJvcGVydHlTZXQoU3VwZXJQcm9wZXJ0eVNldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U3RhdGljU2V0KFN0YXRpY1NldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TWV0aG9kSW52b2NhdGlvbihNZXRob2RJbnZvY2F0aW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKERpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN0YXRpY0ludm9jYXRpb24oU3RhdGljSW52b2NhdGlvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0Tm90KE5vdCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TG9naWNhbEV4cHJlc3Npb24oTG9naWNhbEV4cHJlc3Npb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TGlzdENvbmNhdGVuYXRpb24oTGlzdENvbmNhdGVuYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFNldENvbmNhdGVuYXRpb24oU2V0Q29uY2F0ZW5hdGlvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TWFwQ29uY2F0ZW5hdGlvbihNYXBDb25jYXRlbmF0aW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRJbnN0YW5jZUNyZWF0aW9uKEluc3RhbmNlQ3JlYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdElzRXhwcmVzc2lvbihJc0V4cHJlc3Npb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdEFzRXhwcmVzc2lvbihBc0V4cHJlc3Npb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN5bWJvbExpdGVyYWwoU3ltYm9sTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0VHlwZUxpdGVyYWwoVHlwZUxpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFRoaXNFeHByZXNzaW9uKFRoaXNFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRSZXRocm93KFJldGhyb3cgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFRocm93KFRocm93IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRMaXN0TGl0ZXJhbChMaXN0TGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U2V0TGl0ZXJhbChTZXRMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRNYXBMaXRlcmFsKE1hcExpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdEF3YWl0RXhwcmVzc2lvbihBd2FpdEV4cHJlc3Npb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihGdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdENvbnN0YW50RXhwcmVzc2lvbihDb25zdGFudEV4cHJlc3Npb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN0cmluZ0xpdGVyYWwoU3RyaW5nTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUpOwogIFIgdmlzaXRJbnRMaXRlcmFsKEludExpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEJhc2ljTGl0ZXJhbChub2RlKTsKICBSIHZpc2l0RG91YmxlTGl0ZXJhbChEb3VibGVMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSk7CiAgUiB2aXNpdEJvb2xMaXRlcmFsKEJvb2xMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSk7CiAgUiB2aXNpdE51bGxMaXRlcmFsKE51bGxMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSk7CiAgUiB2aXNpdExldChMZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdEJsb2NrRXhwcmVzc2lvbihCbG9ja0V4cHJlc3Npb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdEluc3RhbnRpYXRpb24oSW5zdGFudGlhdGlvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TG9hZExpYnJhcnkoTG9hZExpYnJhcnkgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkKENoZWNrTGlicmFyeUlzTG9hZGVkIG5vZGUpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwoKICAvLyBTdGF0ZW1lbnRzCiAgUiBkZWZhdWx0U3RhdGVtZW50KFN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRCbG9jayhCbG9jayBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRBc3NlcnRCbG9jayhBc3NlcnRCbG9jayBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRBc3NlcnRTdGF0ZW1lbnQoQXNzZXJ0U3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRCcmVha1N0YXRlbWVudChCcmVha1N0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRXaGlsZVN0YXRlbWVudChXaGlsZVN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXREb1N0YXRlbWVudChEb1N0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRGb3JTdGF0ZW1lbnQoRm9yU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFN3aXRjaFN0YXRlbWVudChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQoQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0SWZTdGF0ZW1lbnQoSWZTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0UmV0dXJuU3RhdGVtZW50KFJldHVyblN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRUcnlDYXRjaChUcnlDYXRjaCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRUcnlGaW5hbGx5KFRyeUZpbmFsbHkgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0WWllbGRTdGF0ZW1lbnQoWWllbGRTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24oRnVuY3Rpb25EZWNsYXJhdGlvbiBub2RlKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwoKICAvLyBNZW1iZXJzCiAgUiBkZWZhdWx0TWVtYmVyKE1lbWJlciBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yIG5vZGUpID0+IGRlZmF1bHRNZW1iZXIobm9kZSk7CiAgUiB2aXNpdFByb2NlZHVyZShQcm9jZWR1cmUgbm9kZSkgPT4gZGVmYXVsdE1lbWJlcihub2RlKTsKICBSIHZpc2l0RmllbGQoRmllbGQgbm9kZSkgPT4gZGVmYXVsdE1lbWJlcihub2RlKTsKICBSIHZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IoUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3Igbm9kZSkgewogICAgcmV0dXJuIGRlZmF1bHRNZW1iZXIobm9kZSk7CiAgfQoKICAvLyBDbGFzc2VzCiAgUiB2aXNpdENsYXNzKENsYXNzIG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKCiAgLy8gSW5pdGlhbGl6ZXJzCiAgUiBkZWZhdWx0SW5pdGlhbGl6ZXIoSW5pdGlhbGl6ZXIgbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRJbnZhbGlkSW5pdGlhbGl6ZXIoSW52YWxpZEluaXRpYWxpemVyIG5vZGUpID0+CiAgICAgIGRlZmF1bHRJbml0aWFsaXplcihub2RlKTsKICBSIHZpc2l0RmllbGRJbml0aWFsaXplcihGaWVsZEluaXRpYWxpemVyIG5vZGUpID0+IGRlZmF1bHRJbml0aWFsaXplcihub2RlKTsKICBSIHZpc2l0U3VwZXJJbml0aWFsaXplcihTdXBlckluaXRpYWxpemVyIG5vZGUpID0+IGRlZmF1bHRJbml0aWFsaXplcihub2RlKTsKICBSIHZpc2l0UmVkaXJlY3RpbmdJbml0aWFsaXplcihSZWRpcmVjdGluZ0luaXRpYWxpemVyIG5vZGUpID0+CiAgICAgIGRlZmF1bHRJbml0aWFsaXplcihub2RlKTsKICBSIHZpc2l0TG9jYWxJbml0aWFsaXplcihMb2NhbEluaXRpYWxpemVyIG5vZGUpID0+IGRlZmF1bHRJbml0aWFsaXplcihub2RlKTsKICBSIHZpc2l0QXNzZXJ0SW5pdGlhbGl6ZXIoQXNzZXJ0SW5pdGlhbGl6ZXIgbm9kZSkgPT4gZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwoKICAvLyBPdGhlciB0cmVlIG5vZGVzCiAgUiB2aXNpdExpYnJhcnkoTGlicmFyeSBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdExpYnJhcnlEZXBlbmRlbmN5KExpYnJhcnlEZXBlbmRlbmN5IG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICBSIHZpc2l0Q29tYmluYXRvcihDb21iaW5hdG9yIG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICBSIHZpc2l0TGlicmFyeVBhcnQoTGlicmFyeVBhcnQgbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRUeXBlZGVmKFR5cGVkZWYgbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRUeXBlUGFyYW1ldGVyKFR5cGVQYXJhbWV0ZXIgbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRGdW5jdGlvbk5vZGUoRnVuY3Rpb25Ob2RlIG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICBSIHZpc2l0QXJndW1lbnRzKEFyZ3VtZW50cyBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdE5hbWVkRXhwcmVzc2lvbihOYW1lZEV4cHJlc3Npb24gbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRTd2l0Y2hDYXNlKFN3aXRjaENhc2Ugbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRDYXRjaChDYXRjaCBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdE1hcEVudHJ5KE1hcEVudHJ5IG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICBSIHZpc2l0Q29tcG9uZW50KENvbXBvbmVudCBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7Cn0KCmNsYXNzIERhcnRUeXBlVmlzaXRvcjxSPiB7CiAgY29uc3QgRGFydFR5cGVWaXNpdG9yKCk7CgogIFIgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUpID0+IG51bGw7CgogIFIgdmlzaXRJbnZhbGlkVHlwZShJbnZhbGlkVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKICBSIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXRCb3R0b21UeXBlKEJvdHRvbVR5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKICBSIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXRUeXBlZGVmVHlwZShUeXBlZGVmVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7Cn0KCmNsYXNzIERhcnRUeXBlVmlzaXRvcjE8UiwgVD4gewogIFIgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUsIFQgYXJnKSA9PiBudWxsOwoKICBSIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlLCBhcmcpOwogIFIgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBub2RlLCBUIGFyZykgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFZvaWRUeXBlKFZvaWRUeXBlIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSwgYXJnKTsKICBSIHZpc2l0Qm90dG9tVHlwZShCb3R0b21UeXBlIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSwgYXJnKTsKICBSIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSwgYXJnKTsKICBSIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlLCBUIGFyZykgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RGFydFR5cGUobm9kZSwgYXJnKTsKICBSIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlLCBhcmcpOwp9CgovLy8gVmlzaXRvciBmb3IgW0NvbnN0YW50XSBub2Rlcy4KLy8vCi8vLyBOb3RlOiBDb25zdGFudCBub2RlcyBhcmUgX25vdF8gdHJlZXMgYnV0IGRpcmVjdGVkIGFjeWNsaWMgZ3JhcGhzLiBUaGlzCi8vLyBtZWFucyB0aGF0IHZpc2l0aW5nIGEgY29uc3RhbnQgbm9kZSB3aXRob3V0IHRyYWNraW5nIHdoaWNoIHN1Ym5vZGVzIHRoYXQKLy8vIGhhdmUgYWxyZWFkeSBiZWVuIHZpc2l0ZWQgbWlnaHQgbGVhZCB0byBleHBvbmVudGlhbCBydW5uaW5nIHRpbWVzLgovLy8KLy8vIFVzZSBbQ29tcHV0ZU9uY2VDb25zdGFudFZpc2l0b3JdIG9yIFtWaXNpdE9uY2VDb25zdGFudFZpc2l0b3JdIHRvIHZpc2l0Ci8vLyBhIGNvbnN0YW50IG5vZGUgd2hpbGUgZW5zdXJpbmcgZWFjaCBzdWJub2RlIGlzIG9ubHkgdmlzaXRlZCBvbmNlLgpjbGFzcyBDb25zdGFudFZpc2l0b3I8Uj4gewogIGNvbnN0IENvbnN0YW50VmlzaXRvcigpOwoKICBSIGRlZmF1bHRDb25zdGFudChDb25zdGFudCBub2RlKSA9PiBudWxsOwoKICBSIHZpc2l0TnVsbENvbnN0YW50KE51bGxDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdEJvb2xDb25zdGFudChCb29sQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRJbnRDb25zdGFudChJbnRDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdERvdWJsZUNvbnN0YW50KERvdWJsZUNvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0U3RyaW5nQ29uc3RhbnQoU3RyaW5nQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRTeW1ib2xDb25zdGFudChTeW1ib2xDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdE1hcENvbnN0YW50KE1hcENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0TGlzdENvbnN0YW50KExpc3RDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFNldENvbnN0YW50KFNldENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0SW5zdGFuY2VDb25zdGFudChJbnN0YW5jZUNvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudChQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0VGVhck9mZkNvbnN0YW50KFRlYXJPZmZDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFR5cGVMaXRlcmFsQ29uc3RhbnQoVHlwZUxpdGVyYWxDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnQoVW5ldmFsdWF0ZWRDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7Cn0KCmFic3RyYWN0IGNsYXNzIF9Db25zdGFudENhbGxiYWNrPFI+IHsKICBSIGRlZmF1bHRDb25zdGFudChDb25zdGFudCBub2RlKTsKCiAgUiB2aXNpdE51bGxDb25zdGFudChOdWxsQ29uc3RhbnQgbm9kZSk7CiAgUiB2aXNpdEJvb2xDb25zdGFudChCb29sQ29uc3RhbnQgbm9kZSk7CiAgUiB2aXNpdEludENvbnN0YW50KEludENvbnN0YW50IG5vZGUpOwogIFIgdmlzaXREb3VibGVDb25zdGFudChEb3VibGVDb25zdGFudCBub2RlKTsKICBSIHZpc2l0U3RyaW5nQ29uc3RhbnQoU3RyaW5nQ29uc3RhbnQgbm9kZSk7CiAgUiB2aXNpdFN5bWJvbENvbnN0YW50KFN5bWJvbENvbnN0YW50IG5vZGUpOwogIFIgdmlzaXRNYXBDb25zdGFudChNYXBDb25zdGFudCBub2RlKTsKICBSIHZpc2l0TGlzdENvbnN0YW50KExpc3RDb25zdGFudCBub2RlKTsKICBSIHZpc2l0U2V0Q29uc3RhbnQoU2V0Q29uc3RhbnQgbm9kZSk7CiAgUiB2aXNpdEluc3RhbmNlQ29uc3RhbnQoSW5zdGFuY2VDb25zdGFudCBub2RlKTsKICBSIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudChQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IG5vZGUpOwogIFIgdmlzaXRUZWFyT2ZmQ29uc3RhbnQoVGVhck9mZkNvbnN0YW50IG5vZGUpOwogIFIgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KFR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSk7CiAgUiB2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnQoVW5ldmFsdWF0ZWRDb25zdGFudCBub2RlKTsKfQoKY2xhc3MgX0NvbnN0YW50Q2FsbGJhY2tWaXNpdG9yPFI+IGltcGxlbWVudHMgQ29uc3RhbnRWaXNpdG9yPFI+IHsKICBmaW5hbCBfQ29uc3RhbnRDYWxsYmFjayBfY2FsbGJhY2s7CgogIF9Db25zdGFudENhbGxiYWNrVmlzaXRvcih0aGlzLl9jYWxsYmFjayk7CgogIEBvdmVycmlkZQogIFIgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgX2NhbGxiYWNrLnZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudChub2RlKTsKCiAgQG92ZXJyaWRlCiAgUiB2aXNpdFR5cGVMaXRlcmFsQ29uc3RhbnQoVHlwZUxpdGVyYWxDb25zdGFudCBub2RlKSA9PgogICAgICBfY2FsbGJhY2sudmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KG5vZGUpOwoKICBAb3ZlcnJpZGUKICBSIHZpc2l0VGVhck9mZkNvbnN0YW50KFRlYXJPZmZDb25zdGFudCBub2RlKSA9PgogICAgICBfY2FsbGJhY2sudmlzaXRUZWFyT2ZmQ29uc3RhbnQobm9kZSk7CgogIEBvdmVycmlkZQogIFIgdmlzaXRQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgX2NhbGxiYWNrLnZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudChub2RlKTsKCiAgQG92ZXJyaWRlCiAgUiB2aXNpdEluc3RhbmNlQ29uc3RhbnQoSW5zdGFuY2VDb25zdGFudCBub2RlKSA9PgogICAgICBfY2FsbGJhY2sudmlzaXRJbnN0YW5jZUNvbnN0YW50KG5vZGUpOwoKICBAb3ZlcnJpZGUKICBSIHZpc2l0U2V0Q29uc3RhbnQoU2V0Q29uc3RhbnQgbm9kZSkgPT4gX2NhbGxiYWNrLnZpc2l0U2V0Q29uc3RhbnQobm9kZSk7CgogIEBvdmVycmlkZQogIFIgdmlzaXRMaXN0Q29uc3RhbnQoTGlzdENvbnN0YW50IG5vZGUpID0+IF9jYWxsYmFjay52aXNpdExpc3RDb25zdGFudChub2RlKTsKCiAgQG92ZXJyaWRlCiAgUiB2aXNpdE1hcENvbnN0YW50KE1hcENvbnN0YW50IG5vZGUpID0+IF9jYWxsYmFjay52aXNpdE1hcENvbnN0YW50KG5vZGUpOwoKICBAb3ZlcnJpZGUKICBSIHZpc2l0U3ltYm9sQ29uc3RhbnQoU3ltYm9sQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgX2NhbGxiYWNrLnZpc2l0U3ltYm9sQ29uc3RhbnQobm9kZSk7CgogIEBvdmVycmlkZQogIFIgdmlzaXRTdHJpbmdDb25zdGFudChTdHJpbmdDb25zdGFudCBub2RlKSA9PgogICAgICBfY2FsbGJhY2sudmlzaXRTdHJpbmdDb25zdGFudChub2RlKTsKCiAgQG92ZXJyaWRlCiAgUiB2aXNpdERvdWJsZUNvbnN0YW50KERvdWJsZUNvbnN0YW50IG5vZGUpID0+CiAgICAgIF9jYWxsYmFjay52aXNpdERvdWJsZUNvbnN0YW50KG5vZGUpOwoKICBAb3ZlcnJpZGUKICBSIHZpc2l0SW50Q29uc3RhbnQoSW50Q29uc3RhbnQgbm9kZSkgPT4gX2NhbGxiYWNrLnZpc2l0SW50Q29uc3RhbnQobm9kZSk7CgogIEBvdmVycmlkZQogIFIgdmlzaXRCb29sQ29uc3RhbnQoQm9vbENvbnN0YW50IG5vZGUpID0+IF9jYWxsYmFjay52aXNpdEJvb2xDb25zdGFudChub2RlKTsKCiAgQG92ZXJyaWRlCiAgUiB2aXNpdE51bGxDb25zdGFudChOdWxsQ29uc3RhbnQgbm9kZSkgPT4gX2NhbGxiYWNrLnZpc2l0TnVsbENvbnN0YW50KG5vZGUpOwoKICBAb3ZlcnJpZGUKICBSIGRlZmF1bHRDb25zdGFudChDb25zdGFudCBub2RlKSA9PiBfY2FsbGJhY2suZGVmYXVsdENvbnN0YW50KG5vZGUpOwp9CgovLy8gVmlzaXRvci1saWtlIGNsYXNzIHVzZWQgZm9yIHZpc2l0aW5nIGEgW0NvbnN0YW50XSBub2RlIHdoaWxlIGNvbXB1dGluZyBhCi8vLyB2YWx1ZSBmb3IgZWFjaCBzdWJub2RlLiBUaGUgdmlzaXRvciBjYWNoZXMgdGhlIGNvbXB1dGVkIHZhbHVlcyBlbnN1cmluZyB0aGF0Ci8vLyBlYWNoIHN1Ym5vZGUgaXMgb25seSB2aXNpdGVkIG9uY2UuCmNsYXNzIENvbXB1dGVPbmNlQ29uc3RhbnRWaXNpdG9yPFI+IGltcGxlbWVudHMgX0NvbnN0YW50Q2FsbGJhY2s8Uj4gewogIF9Db25zdGFudENhbGxiYWNrVmlzaXRvciBfdmlzaXRvcjsKICBNYXA8Q29uc3RhbnQsIFI+IGNhY2hlID0gbmV3IExpbmtlZEhhc2hNYXAuaWRlbnRpdHkoKTsKCiAgQ29tcHV0ZU9uY2VDb25zdGFudFZpc2l0b3IoKSB7CiAgICBfdmlzaXRvciA9IG5ldyBfQ29uc3RhbnRDYWxsYmFja1Zpc2l0b3I8Uj4odGhpcyk7CiAgfQoKICAvLy8gVmlzaXRzIFtub2RlXSBpZiBub3QgYWxyZWFkeSB2aXNpdGVkIHRvIGNvbXB1dGUgYSB2YWx1ZSBmb3IgW25vZGVdLgogIC8vLwogIC8vLyBJZiB0aGUgdmFsdWUgaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZCB0aGUgY2FjaGVkIHZhbHVlIGlzIHJldHVybmVkIGltbWVkaWF0ZWx5LgogIC8vLwogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIHRvIGNvbXB1dGUgdmFsdWVzIGZvciBzdWJub2RlcyByZWN1cnNpdmVseSwgd2hpbGUgb25seQogIC8vLyB2aXNpdGluZyBlYWNoIHN1Ym5vZGUgb25jZS4KICBSIHZpc2l0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgewogICAgcmV0dXJuIGNhY2hlW25vZGVdID8/PSBub2RlLmFjY2VwdChfdmlzaXRvcik7CiAgfQoKICBSIGRlZmF1bHRDb25zdGFudChDb25zdGFudCBub2RlKSA9PiBudWxsOwoKICBSIHZpc2l0TnVsbENvbnN0YW50KE51bGxDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdEJvb2xDb25zdGFudChCb29sQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRJbnRDb25zdGFudChJbnRDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdERvdWJsZUNvbnN0YW50KERvdWJsZUNvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0U3RyaW5nQ29uc3RhbnQoU3RyaW5nQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRTeW1ib2xDb25zdGFudChTeW1ib2xDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdE1hcENvbnN0YW50KE1hcENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0TGlzdENvbnN0YW50KExpc3RDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFNldENvbnN0YW50KFNldENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0SW5zdGFuY2VDb25zdGFudChJbnN0YW5jZUNvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudChQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0VGVhck9mZkNvbnN0YW50KFRlYXJPZmZDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFR5cGVMaXRlcmFsQ29uc3RhbnQoVHlwZUxpdGVyYWxDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnQoVW5ldmFsdWF0ZWRDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7Cn0KCi8vLyBWaXNpdG9yLWxpa2UgY2xhc3MgdXNlZCBmb3IgdmlzaXRpbmcgZWFjaCBzdWJub2RlIG9mIGEgW0NvbnN0YW50XSBub2RlIG9uY2UuCi8vLwovLy8gVGhlIHZpc2l0b3IgcmVjb3JkcyB0aGUgdmlzaXRlZCBub2RlIHRvIGVuc3VyZSB0aGF0IGVhY2ggc3Vibm9kZSBpcyBvbmx5Ci8vLyB2aXNpdGVkIG9uY2UuCmNsYXNzIFZpc2l0T25jZUNvbnN0YW50VmlzaXRvciBpbXBsZW1lbnRzIF9Db25zdGFudENhbGxiYWNrPHZvaWQ+IHsKICBfQ29uc3RhbnRDYWxsYmFja1Zpc2l0b3I8dm9pZD4gX3Zpc2l0b3I7CiAgU2V0PENvbnN0YW50PiBjYWNoZSA9IG5ldyBMaW5rZWRIYXNoU2V0LmlkZW50aXR5KCk7CgogIFZpc2l0T25jZUNvbnN0YW50VmlzaXRvcigpIHsKICAgIF92aXNpdG9yID0gbmV3IF9Db25zdGFudENhbGxiYWNrVmlzaXRvcjx2b2lkPih0aGlzKTsKICB9CgogIC8vLyBWaXNpdHMgW25vZGVdIGlmIG5vdCBhbHJlYWR5IHZpc2l0ZWQuCiAgLy8vCiAgLy8vIENhbGwgdGhpcyBtZXRob2QgdG8gdmlzaXQgc3Vibm9kZXMgcmVjdXJzaXZlbHksIHdoaWxlIG9ubHkgdmlzaXRpbmcgZWFjaAogIC8vLyBzdWJub2RlIG9uY2UuCiAgdm9pZCB2aXNpdENvbnN0YW50KENvbnN0YW50IG5vZGUpIHsKICAgIGlmIChjYWNoZS5hZGQobm9kZSkpIHsKICAgICAgbm9kZS5hY2NlcHQoX3Zpc2l0b3IpOwogICAgfQogIH0KCiAgdm9pZCBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgPT4gbnVsbDsKCiAgdm9pZCB2aXNpdE51bGxDb25zdGFudChOdWxsQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIHZvaWQgdmlzaXRCb29sQ29uc3RhbnQoQm9vbENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICB2b2lkIHZpc2l0SW50Q29uc3RhbnQoSW50Q29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIHZvaWQgdmlzaXREb3VibGVDb25zdGFudChEb3VibGVDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgdm9pZCB2aXNpdFN0cmluZ0NvbnN0YW50KFN0cmluZ0NvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICB2b2lkIHZpc2l0U3ltYm9sQ29uc3RhbnQoU3ltYm9sQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIHZvaWQgdmlzaXRNYXBDb25zdGFudChNYXBDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgdm9pZCB2aXNpdExpc3RDb25zdGFudChMaXN0Q29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIHZvaWQgdmlzaXRTZXRDb25zdGFudChTZXRDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgdm9pZCB2aXNpdEluc3RhbmNlQ29uc3RhbnQoSW5zdGFuY2VDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgdm9pZCB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgdm9pZCB2aXNpdFRlYXJPZmZDb25zdGFudChUZWFyT2ZmQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIHZvaWQgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KFR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIHZvaWQgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50KG5vZGUpOwp9CgpjbGFzcyBNZW1iZXJSZWZlcmVuY2VWaXNpdG9yPFI+IHsKICBjb25zdCBNZW1iZXJSZWZlcmVuY2VWaXNpdG9yKCk7CgogIFIgZGVmYXVsdE1lbWJlclJlZmVyZW5jZShNZW1iZXIgbm9kZSkgPT4gbnVsbDsKCiAgUiB2aXNpdEZpZWxkUmVmZXJlbmNlKEZpZWxkIG5vZGUpID0+IGRlZmF1bHRNZW1iZXJSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdENvbnN0cnVjdG9yUmVmZXJlbmNlKENvbnN0cnVjdG9yIG5vZGUpID0+IGRlZmF1bHRNZW1iZXJSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdFByb2NlZHVyZVJlZmVyZW5jZShQcm9jZWR1cmUgbm9kZSkgPT4gZGVmYXVsdE1lbWJlclJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JSZWZlcmVuY2UoCiAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHJldHVybiBkZWZhdWx0TWVtYmVyUmVmZXJlbmNlKG5vZGUpOwogIH0KfQoKY2xhc3MgVmlzaXRvcjxSPiBleHRlbmRzIFRyZWVWaXNpdG9yPFI+CiAgICBpbXBsZW1lbnRzCiAgICAgICAgRGFydFR5cGVWaXNpdG9yPFI+LAogICAgICAgIENvbnN0YW50VmlzaXRvcjxSPiwKICAgICAgICBNZW1iZXJSZWZlcmVuY2VWaXNpdG9yPFI+IHsKICBjb25zdCBWaXNpdG9yKCk7CgogIC8vLyBUaGUgY2F0Y2gtYWxsIGNhc2UsIGV4Y2VwdCBmb3IgcmVmZXJlbmNlcy4KICBSIGRlZmF1bHROb2RlKE5vZGUgbm9kZSkgPT4gbnVsbDsKICBSIGRlZmF1bHRUcmVlTm9kZShUcmVlTm9kZSBub2RlKSA9PiBkZWZhdWx0Tm9kZShub2RlKTsKCiAgLy8gRGFydFR5cGVzCiAgUiBkZWZhdWx0RGFydFR5cGUoRGFydFR5cGUgbm9kZSkgPT4gZGVmYXVsdE5vZGUobm9kZSk7CiAgUiB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKICBSIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKCiAgLy8gQ29uc3RhbnRzCiAgUiBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdE5vZGUobm9kZSk7CiAgUiB2aXNpdE51bGxDb25zdGFudChOdWxsQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRCb29sQ29uc3RhbnQoQm9vbENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0SW50Q29uc3RhbnQoSW50Q29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXREb3VibGVDb25zdGFudChEb3VibGVDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFN0cmluZ0NvbnN0YW50KFN0cmluZ0NvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0U3ltYm9sQ29uc3RhbnQoU3ltYm9sQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRNYXBDb25zdGFudChNYXBDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdExpc3RDb25zdGFudChMaXN0Q29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRTZXRDb25zdGFudChTZXRDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdEluc3RhbmNlQ29uc3RhbnQoSW5zdGFuY2VDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFRlYXJPZmZDb25zdGFudChUZWFyT2ZmQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KFR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwoKICAvLyBDbGFzcyByZWZlcmVuY2VzCiAgUiB2aXNpdENsYXNzUmVmZXJlbmNlKENsYXNzIG5vZGUpID0+IG51bGw7CiAgUiB2aXNpdFR5cGVkZWZSZWZlcmVuY2UoVHlwZWRlZiBub2RlKSA9PiBudWxsOwoKICAvLyBDb25zdGFudCByZWZlcmVuY2VzCiAgUiBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2UoQ29uc3RhbnQgbm9kZSkgPT4gbnVsbDsKICBSIHZpc2l0TnVsbENvbnN0YW50UmVmZXJlbmNlKE51bGxDb25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdEJvb2xDb25zdGFudFJlZmVyZW5jZShCb29sQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRJbnRDb25zdGFudFJlZmVyZW5jZShJbnRDb25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdERvdWJsZUNvbnN0YW50UmVmZXJlbmNlKERvdWJsZUNvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0U3RyaW5nQ29uc3RhbnRSZWZlcmVuY2UoU3RyaW5nQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRTeW1ib2xDb25zdGFudFJlZmVyZW5jZShTeW1ib2xDb25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdE1hcENvbnN0YW50UmVmZXJlbmNlKE1hcENvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0TGlzdENvbnN0YW50UmVmZXJlbmNlKExpc3RDb25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdFNldENvbnN0YW50UmVmZXJlbmNlKFNldENvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0SW5zdGFuY2VDb25zdGFudFJlZmVyZW5jZShJbnN0YW5jZUNvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudFJlZmVyZW5jZSgKICAgICAgICAgIFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRUZWFyT2ZmQ29uc3RhbnRSZWZlcmVuY2UoVGVhck9mZkNvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0VHlwZUxpdGVyYWxDb25zdGFudFJlZmVyZW5jZShUeXBlTGl0ZXJhbENvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudFJlZmVyZW5jZShVbmV2YWx1YXRlZENvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKCiAgLy8gTWVtYmVyIHJlZmVyZW5jZXMKICBSIGRlZmF1bHRNZW1iZXJSZWZlcmVuY2UoTWVtYmVyIG5vZGUpID0+IG51bGw7CiAgUiB2aXNpdEZpZWxkUmVmZXJlbmNlKEZpZWxkIG5vZGUpID0+IGRlZmF1bHRNZW1iZXJSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdENvbnN0cnVjdG9yUmVmZXJlbmNlKENvbnN0cnVjdG9yIG5vZGUpID0+IGRlZmF1bHRNZW1iZXJSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdFByb2NlZHVyZVJlZmVyZW5jZShQcm9jZWR1cmUgbm9kZSkgPT4gZGVmYXVsdE1lbWJlclJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JSZWZlcmVuY2UoCiAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHJldHVybiBkZWZhdWx0TWVtYmVyUmVmZXJlbmNlKG5vZGUpOwogIH0KCiAgUiB2aXNpdE5hbWUoTmFtZSBub2RlKSA9PiBkZWZhdWx0Tm9kZShub2RlKTsKICBSIHZpc2l0U3VwZXJ0eXBlKFN1cGVydHlwZSBub2RlKSA9PiBkZWZhdWx0Tm9kZShub2RlKTsKICBSIHZpc2l0TmFtZWRUeXBlKE5hbWVkVHlwZSBub2RlKSA9PiBkZWZhdWx0Tm9kZShub2RlKTsKfQoKY2xhc3MgUmVjdXJzaXZlVmlzaXRvcjxSPiBleHRlbmRzIFZpc2l0b3I8Uj4gewogIGNvbnN0IFJlY3Vyc2l2ZVZpc2l0b3IoKTsKCiAgUiBkZWZhdWx0Tm9kZShOb2RlIG5vZGUpIHsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIHJldHVybiBudWxsOwogIH0KfQoKLy8vIFZpc2l0b3IgdGhhdCByZWN1cnNpdmVseSByZXdyaXRlcyBlYWNoIG5vZGUgaW4gdHJlZS4KLy8vCi8vLyBWaXNpdCBtZXRob2RzIHNob3VsZCByZXR1cm4gYSBuZXcgbm9kZSwgb3IgdGhlIHZpc2l0ZWQgbm9kZSAocG9zc2libHkKLy8vIG11dGF0ZWQpLCBvciBhbnkgbm9kZSBmcm9tIHRoZSB2aXNpdGVkIG5vZGUncyBzdWJ0cmVlLgovLy8KLy8vIEVhY2ggc3ViY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIEFTVCByZW1haW5zIGEgdHJlZS4KLy8vCi8vLyBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0cmFuc2Zvcm1lciByZXBsYWNlcyBldmVyeSBvY2N1cnJlbmNlIG9mCi8vLyBgISh4ICYmIHkpYCB3aXRoIGAoIXggfHwgIXkpYDoKLy8vCi8vLyAgICAgY2xhc3MgTmVnYXRpb25TaW5rZXIgZXh0ZW5kcyBUcmFuc2Zvcm1lciB7Ci8vLyAgICAgICBAb3ZlcnJpZGUKLy8vICAgICAgIE5vZGUgdmlzaXROb3QoTm90IG5vZGUpIHsKLy8vICAgICAgICAgdmFyIG9wZXJhbmQgPSBub2RlLm9wZXJhbmQuYWNjZXB0KHRoaXMpOyAvLyBSZW1lbWJlciB0byB2aXNpdC4KLy8vICAgICAgICAgaWYgKG9wZXJhbmQgaXMgTG9naWNhbEV4cHJlc3Npb24gJiYgb3BlcmFuZC5vcGVyYXRvciA9PSAnJiYnKSB7Ci8vLyAgICAgICAgICAgcmV0dXJuIG5ldyBMb2dpY2FsRXhwcmVzc2lvbigKLy8vICAgICAgICAgICAgIG5ldyBOb3Qob3BlcmFuZC5sZWZ0KSwKLy8vICAgICAgICAgICAgICd8fCcsCi8vLyAgICAgICAgICAgICBuZXcgTm90KG9wZXJhbmQucmlnaHQpKTsKLy8vICAgICAgICAgfQovLy8gICAgICAgICByZXR1cm4gbm9kZTsKLy8vICAgICAgIH0KLy8vICAgICB9Ci8vLwpjbGFzcyBUcmFuc2Zvcm1lciBleHRlbmRzIFRyZWVWaXNpdG9yPFRyZWVOb2RlPiB7CiAgY29uc3QgVHJhbnNmb3JtZXIoKTsKCiAgLy8vIFJlcGxhY2VzIGEgdXNlIG9mIGEgdHlwZS4KICAvLy8KICAvLy8gQnkgZGVmYXVsdCwgcmVjdXJzaW9uIHN0b3BzIGF0IHRoaXMgcG9pbnQuCiAgRGFydFR5cGUgdmlzaXREYXJ0VHlwZShEYXJ0VHlwZSBub2RlKSA9PiBub2RlOwoKICBDb25zdGFudCB2aXNpdENvbnN0YW50KENvbnN0YW50IG5vZGUpID0+IG5vZGU7CgogIFN1cGVydHlwZSB2aXNpdFN1cGVydHlwZShTdXBlcnR5cGUgbm9kZSkgPT4gbm9kZTsKCiAgVHJlZU5vZGUgZGVmYXVsdFRyZWVOb2RlKFRyZWVOb2RlIG5vZGUpIHsKICAgIG5vZGUudHJhbnNmb3JtQ2hpbGRyZW4odGhpcyk7CiAgICByZXR1cm4gbm9kZTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25WaXNpdG9yMTxSLCBUPiB7CiAgY29uc3QgRXhwcmVzc2lvblZpc2l0b3IxKCk7CgogIFIgZGVmYXVsdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlLCBUIGFyZykgPT4gbnVsbDsKICBSIGRlZmF1bHRCYXNpY0xpdGVyYWwoQmFzaWNMaXRlcmFsIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0VmFyaWFibGVHZXQoVmFyaWFibGVHZXQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFZhcmlhYmxlU2V0KFZhcmlhYmxlU2V0IG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRQcm9wZXJ0eUdldChQcm9wZXJ0eUdldCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0UHJvcGVydHlTZXQoUHJvcGVydHlTZXQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdERpcmVjdFByb3BlcnR5R2V0KERpcmVjdFByb3BlcnR5R2V0IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0U3VwZXJQcm9wZXJ0eUdldChTdXBlclByb3BlcnR5R2V0IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTdXBlclByb3BlcnR5U2V0KFN1cGVyUHJvcGVydHlTZXQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFN0YXRpY1NldChTdGF0aWNTZXQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0RGlyZWN0TWV0aG9kSW52b2NhdGlvbihEaXJlY3RNZXRob2RJbnZvY2F0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdE5vdChOb3Qgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKExvZ2ljYWxFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdExpc3RDb25jYXRlbmF0aW9uKExpc3RDb25jYXRlbmF0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTZXRDb25jYXRlbmF0aW9uKFNldENvbmNhdGVuYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdE1hcENvbmNhdGVuYXRpb24oTWFwQ29uY2F0ZW5hdGlvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0SW5zdGFuY2VDcmVhdGlvbihJbnN0YW5jZUNyZWF0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRJc0V4cHJlc3Npb24oSXNFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTeW1ib2xMaXRlcmFsKFN5bWJvbExpdGVyYWwgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50RXhwcmVzc2lvbiBub2RlLCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFJldGhyb3coUmV0aHJvdyBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0VGhyb3coVGhyb3cgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdExpc3RMaXRlcmFsKExpc3RMaXRlcmFsIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdE1hcExpdGVyYWwoTWFwTGl0ZXJhbCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0QXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKEZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0SW50TGl0ZXJhbChJbnRMaXRlcmFsIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFN0cmluZ0xpdGVyYWwoU3RyaW5nTGl0ZXJhbCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEJhc2ljTGl0ZXJhbChub2RlLCBhcmcpOwogIFIgdmlzaXREb3VibGVMaXRlcmFsKERvdWJsZUxpdGVyYWwgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSwgYXJnKTsKICBSIHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSwgYXJnKTsKICBSIHZpc2l0TnVsbExpdGVyYWwoTnVsbExpdGVyYWwgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSwgYXJnKTsKICBSIHZpc2l0TGV0KExldCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0QmxvY2tFeHByZXNzaW9uKEJsb2NrRXhwcmVzc2lvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0SW5zdGFudGlhdGlvbihJbnN0YW50aWF0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRMb2FkTGlicmFyeShMb2FkTGlicmFyeSBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0Q2hlY2tMaWJyYXJ5SXNMb2FkZWQoQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7Cn0KCmFic3RyYWN0IGNsYXNzIFN0YXRlbWVudFZpc2l0b3IxPFIsIFQ+IHsKICBjb25zdCBTdGF0ZW1lbnRWaXNpdG9yMSgpOwoKICBSIGRlZmF1bHRTdGF0ZW1lbnQoU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PiBudWxsOwoKICBSIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEJsb2NrKEJsb2NrIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEFzc2VydEJsb2NrKEFzc2VydEJsb2NrIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEVtcHR5U3RhdGVtZW50KEVtcHR5U3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEFzc2VydFN0YXRlbWVudChBc3NlcnRTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0TGFiZWxlZFN0YXRlbWVudChMYWJlbGVkU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEJyZWFrU3RhdGVtZW50KEJyZWFrU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdFdoaWxlU3RhdGVtZW50KFdoaWxlU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdERvU3RhdGVtZW50KERvU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEZvclN0YXRlbWVudChGb3JTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0Rm9ySW5TdGF0ZW1lbnQoRm9ySW5TdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0U3dpdGNoU3RhdGVtZW50KFN3aXRjaFN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChDb250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRJZlN0YXRlbWVudChJZlN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRSZXR1cm5TdGF0ZW1lbnQoUmV0dXJuU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdFRyeUNhdGNoKFRyeUNhdGNoIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdFRyeUZpbmFsbHkoVHJ5RmluYWxseSBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7Cn0KCmFic3RyYWN0IGNsYXNzIEJvZHlWaXNpdG9yMTxSLCBUPiBleHRlbmRzIEV4cHJlc3Npb25WaXNpdG9yMTxSLCBUPgogICAgaW1wbGVtZW50cyBTdGF0ZW1lbnRWaXNpdG9yMTxSLCBUPiB7CiAgY29uc3QgQm9keVZpc2l0b3IxKCk7CgogIFIgZGVmYXVsdFN0YXRlbWVudChTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+IG51bGw7CiAgUiB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRCbG9jayhCbG9jayBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRBc3NlcnRCbG9jayhBc3NlcnRCbG9jayBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRBc3NlcnRTdGF0ZW1lbnQoQXNzZXJ0U3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRCcmVha1N0YXRlbWVudChCcmVha1N0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRXaGlsZVN0YXRlbWVudChXaGlsZVN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXREb1N0YXRlbWVudChEb1N0YXRlbWVudCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRGb3JTdGF0ZW1lbnQoRm9yU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdFN3aXRjaFN0YXRlbWVudChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQoQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0SWZTdGF0ZW1lbnQoSWZTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0UmV0dXJuU3RhdGVtZW50KFJldHVyblN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRUcnlDYXRjaChUcnlDYXRjaCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRUcnlGaW5hbGx5KFRyeUZpbmFsbHkgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0WWllbGRTdGF0ZW1lbnQoWWllbGRTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24oRnVuY3Rpb25EZWNsYXJhdGlvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwp9CoMiAE5OPBwBIhoBEwEmHQEwRwFPQ0NDQ09PTU0/P01AHz4fTT4fM08+HzofT01NTUVFR0NJOzdDQUFLUVFJQ0lFRTNLR0M8HwIBJRwBLgE6HjZCSEpMSEhCREhKQh5CSjxASDoeOh4CASIZASgBPzszTSAEAgEnHgEyATggTk5AIE5QAgEVDx4dGiAXASwBEUFHT0NDQ0NPT01NPz9NQB8+H00+HzNPPh86H09NTU1FRUdDSTs3Q0FBS1FRSUNJRUUzS0dDPB8BED86HjZCSEpMSEhCREhKQh5CSjxASDoeOh4BDTk/OzNNIAQBDTUBEkM4IE5OQCBOUAEWOU0/QTlFQz1JPzU7PQIBGxsBLAFBQTs/RUNNQQIBHzMBTU1HS1FPPSJNAgEiBEtNRwRMRhsbASwBQ0NBR0dHQUNBS0wdSVFRAgEmJAEqKiguLi4oKigySjA4OAIBQiUBLAEMOjABDDowAQwyLAEMTDkBDDQtAQxMAQxPAQxMAQwwKwEMMCsBDDArAQxMAQxPAQxPAQxHAgFNUSdGJTkBITYEAUoGVwZOIiMyBAEsAUNDQUdHR0FDQUtMHUlRUQIBUQRNEkQrNgEfOQQBLAZPFCYbHQYEAS8BRkZESkpKREZETk8dTD0dPR0CASIiATEBRVFNMSwpBAIBKA8cHCQTATEkOQEPOUFBOz9FQ01BAQ85Q0NBR0dHQUNBS0wdSVFRARYtMQEZNTUmNSYzJjkmOSY5JjMmNSYzJj0mMDAmOyZDJkMmARcxRVFNMSwpBAEvOTkCAS8cAR0eEQQCATkESjsESwRIIwQzFCRLTCwnFikOGQwKBDIXASAGMTEBMQE0ASwiEQQCASoeATc1JD0kT09PTz0kPSQ7JDskS0s7JEckRSQ7JEUkPz0kRSRBJD0kOyQ7JDskUVE1JE83JD0kR0NPTU05JD8kTzUmNSZRUT85JDUkT0MkAgEpHQE1AUEjQk43IzkjOyM3IzcjTlA3IzkjSSNOOSNITDcjQSNBIwIBQykYATVBI0JONyM5IzsjNyM3I05QNyM5I0kjTjkjSEw3I0EjQSMCARtwYWNrYWdlOmtlcm5lbC92aXNpdG9yLmRhcnQrc2Rrcm9vdDovcGtnL2tlcm5lbC9saWIvY2Fub25pY2FsX25hbWUuZGFydJj6Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuY2Fub25pY2FsX25hbWU7CgppbXBvcnQgJ2FzdC5kYXJ0JzsKCi8vLyBBIHN0cmluZyBzZXF1ZW5jZSB0aGF0IGlkZW50aWZpZXMgYSBsaWJyYXJ5LCBjbGFzcywgb3IgbWVtYmVyLgovLy8KLy8vIENhbm9uaWNhbCBuYW1lcyBhcmUgb3JnYW5pemVkIGluIGEgcHJlZml4IHRyZWUuICBFYWNoIG5vZGUga25vd3MgaXRzCi8vLyBwYXJlbnQsIGNoaWxkcmVuLCBhbmQgdGhlIEFTVCBub2RlIGl0IGlzIGN1cnJlbnRseSBib3VuZCB0by4KLy8vCi8vLyBUaGUgZm9sbG93aW5nIHNjaGVtYSBzcGVjaWZpZXMgaG93IHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIGdpdmVuIG9iamVjdAovLy8gaXMgZGVmaW5lZDoKLy8vCi8vLyAgICAgIExpYnJhcnk6Ci8vLyAgICAgICAgIFVSSSBvZiBsaWJyYXJ5Ci8vLwovLy8gICAgICBDbGFzczoKLy8vICAgICAgICAgQ2Fub25pY2FsIG5hbWUgb2YgZW5jbG9zaW5nIGxpYnJhcnkKLy8vICAgICAgICAgTmFtZSBvZiBjbGFzcwovLy8KLy8vICAgICAgQ29uc3RydWN0b3I6Ci8vLyAgICAgICAgIENhbm9uaWNhbCBuYW1lIG9mIGVuY2xvc2luZyBjbGFzcyBvciBsaWJyYXJ5Ci8vLyAgICAgICAgICJAY29uc3RydWN0b3JzIgovLy8gICAgICAgICBRdWFsaWZpZWQgbmFtZQovLy8KLy8vICAgICAgRmllbGQ6Ci8vLyAgICAgICAgIENhbm9uaWNhbCBuYW1lIG9mIGVuY2xvc2luZyBjbGFzcyBvciBsaWJyYXJ5Ci8vLyAgICAgICAgICJAZmllbGRzIgovLy8gICAgICAgICBRdWFsaWZpZWQgbmFtZQovLy8KLy8vICAgICAgVHlwZWRlZjoKLy8vICAgICAgICAgQ2Fub25pY2FsIG5hbWUgb2YgZW5jbG9zaW5nIGNsYXNzCi8vLyAgICAgICAgICJAdHlwZWRlZnMiCi8vLyAgICAgICAgIE5hbWUgdGV4dAovLy8KLy8vICAgICAgUHJvY2VkdXJlIHRoYXQgaXMgbm90IGFuIGFjY2Vzc29yIG9yIGZhY3Rvcnk6Ci8vLyAgICAgICAgIENhbm9uaWNhbCBuYW1lIG9mIGVuY2xvc2luZyBjbGFzcyBvciBsaWJyYXJ5Ci8vLyAgICAgICAgICJAbWV0aG9kcyIKLy8vICAgICAgICAgUXVhbGlmaWVkIG5hbWUKLy8vCi8vLyAgICAgIFByb2NlZHVyZSB0aGF0IGlzIGEgZ2V0dGVyOgovLy8gICAgICAgICBDYW5vbmljYWwgbmFtZSBvZiBlbmNsb3NpbmcgY2xhc3Mgb3IgbGlicmFyeQovLy8gICAgICAgICAiQGdldHRlcnMiCi8vLyAgICAgICAgIFF1YWxpZmllZCBuYW1lCi8vLwovLy8gICAgICBQcm9jZWR1cmUgdGhhdCBpcyBhIHNldHRlcjoKLy8vICAgICAgICAgQ2Fub25pY2FsIG5hbWUgb2YgZW5jbG9zaW5nIGNsYXNzIG9yIGxpYnJhcnkKLy8vICAgICAgICAgIkBzZXR0ZXJzIgovLy8gICAgICAgICBRdWFsaWZpZWQgbmFtZQovLy8KLy8vICAgICAgUHJvY2VkdXJlIHRoYXQgaXMgYSBmYWN0b3J5OgovLy8gICAgICAgICBDYW5vbmljYWwgbmFtZSBvZiBlbmNsb3NpbmcgY2xhc3MKLy8vICAgICAgICAgIkBmYWN0b3JpZXMiCi8vLyAgICAgICAgIFF1YWxpZmllZCBuYW1lCi8vLwovLy8gICAgICBRdWFsaWZpZWQgbmFtZToKLy8vICAgICAgICAgaWYgcHJpdmF0ZTogVVJJIG9mIGxpYnJhcnkKLy8vICAgICAgICAgTmFtZSB0ZXh0Ci8vLwovLy8gVGhlICJxdWFsaWZpZWQgbmFtZSIgYWxsb3dzIGEgbWVtYmVyIHRvIGhhdmUgYSBuYW1lIHRoYXQgaXMgcHJpdmF0ZSB0bwovLy8gYSBsaWJyYXJ5IG90aGVyIHRoYW4gdGhlIG9uZSBjb250YWluaW5nIHRoYXQgbWVtYmVyLgpjbGFzcyBDYW5vbmljYWxOYW1lIHsKICBDYW5vbmljYWxOYW1lIF9wYXJlbnQ7CgogIENhbm9uaWNhbE5hbWUgZ2V0IHBhcmVudCA9PiBfcGFyZW50OwoKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBDYW5vbmljYWxOYW1lIF9ub25Sb290VG9wOwoKICBNYXA8U3RyaW5nLCBDYW5vbmljYWxOYW1lPiBfY2hpbGRyZW47CgogIC8vLyBUaGUgbGlicmFyeSwgY2xhc3MsIG9yIG1lbWJlciBib3VuZCB0byB0aGlzIG5hbWUuCiAgUmVmZXJlbmNlIHJlZmVyZW5jZTsKCiAgLy8vIFRlbXBvcmFyeSBpbmRleCB1c2VkIGR1cmluZyBzZXJpYWxpemF0aW9uLgogIGludCBpbmRleCA9IC0xOwoKICBDYW5vbmljYWxOYW1lLl8odGhpcy5fcGFyZW50LCB0aGlzLm5hbWUpIHsKICAgIGFzc2VydChuYW1lICE9IG51bGwpOwogICAgYXNzZXJ0KHBhcmVudCAhPSBudWxsKTsKICAgIF9ub25Sb290VG9wID0gX3BhcmVudC5pc1Jvb3QgPyB0aGlzIDogX3BhcmVudC5fbm9uUm9vdFRvcDsKICB9CgogIENhbm9uaWNhbE5hbWUucm9vdCgpCiAgICAgIDogX3BhcmVudCA9IG51bGwsCiAgICAgICAgX25vblJvb3RUb3AgPSBudWxsLAogICAgICAgIG5hbWUgPSAnJzsKCiAgYm9vbCBnZXQgaXNSb290ID0+IF9wYXJlbnQgPT0gbnVsbDsKICBDYW5vbmljYWxOYW1lIGdldCBub25Sb290VG9wID0+IF9ub25Sb290VG9wOwoKICBJdGVyYWJsZTxDYW5vbmljYWxOYW1lPiBnZXQgY2hpbGRyZW4gPT4KICAgICAgX2NoaWxkcmVuPy52YWx1ZXMgPz8gY29uc3QgPENhbm9uaWNhbE5hbWU+W107CgogIEl0ZXJhYmxlPENhbm9uaWNhbE5hbWU+IGdldCBjaGlsZHJlbk9yTnVsbCA9PiBfY2hpbGRyZW4/LnZhbHVlczsKCiAgYm9vbCBoYXNDaGlsZChTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIF9jaGlsZHJlbiAhPSBudWxsICYmIF9jaGlsZHJlbi5jb250YWluc0tleShuYW1lKTsKICB9CgogIENhbm9uaWNhbE5hbWUgZ2V0Q2hpbGQoU3RyaW5nIG5hbWUpIHsKICAgIHZhciBtYXAgPSBfY2hpbGRyZW4gPz89IDxTdHJpbmcsIENhbm9uaWNhbE5hbWU+e307CiAgICByZXR1cm4gbWFwW25hbWVdID8/PSBuZXcgQ2Fub25pY2FsTmFtZS5fKHRoaXMsIG5hbWUpOwogIH0KCiAgQ2Fub25pY2FsTmFtZSBnZXRDaGlsZEZyb21VcmkoVXJpIHVyaSkgewogICAgLy8gTm90ZSB0aGF0IHRoZSBVcmkgY2xhc3MgY2FjaGVzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGFuZCBhbGwgbGlicmFyeQogICAgLy8gVVJJcyB3aWxsIGJlIHN0cmluZ2lmaWVkIGZvciBzZXJpYWxpemF0aW9uIGFueXdheSwgc28gdGhlcmUgaXMgbm8KICAgIC8vIHNpZ25pZmljYW50IGNvc3QgZm9yIGNvbnZlcnRpbmcgdGhlIFVyaSB0byBhIHN0cmluZyBoZXJlLgogICAgcmV0dXJuIGdldENoaWxkKCckdXJpJyk7CiAgfQoKICBDYW5vbmljYWxOYW1lIGdldENoaWxkRnJvbVF1YWxpZmllZE5hbWUoTmFtZSBuYW1lKSB7CiAgICByZXR1cm4gbmFtZS5pc1ByaXZhdGUKICAgICAgICA/IGdldENoaWxkRnJvbVVyaShuYW1lLmxpYnJhcnkuaW1wb3J0VXJpKS5nZXRDaGlsZChuYW1lLm5hbWUpCiAgICAgICAgOiBnZXRDaGlsZChuYW1lLm5hbWUpOwogIH0KCiAgQ2Fub25pY2FsTmFtZSBnZXRDaGlsZEZyb21NZW1iZXIoTWVtYmVyIG1lbWJlcikgewogICAgcmV0dXJuIGdldENoaWxkKGdldE1lbWJlclF1YWxpZmllcihtZW1iZXIpKQogICAgICAgIC5nZXRDaGlsZEZyb21RdWFsaWZpZWROYW1lKG1lbWJlci5uYW1lKTsKICB9CgogIENhbm9uaWNhbE5hbWUgZ2V0Q2hpbGRGcm9tRmllbGRXaXRoTmFtZShOYW1lIG5hbWUpIHsKICAgIHJldHVybiBnZXRDaGlsZCgnQGZpZWxkcycpLmdldENoaWxkRnJvbVF1YWxpZmllZE5hbWUobmFtZSk7CiAgfQoKICBDYW5vbmljYWxOYW1lIGdldENoaWxkRnJvbVR5cGVkZWYoVHlwZWRlZiB0eXBlZGVmXykgewogICAgcmV0dXJuIGdldENoaWxkKCdAdHlwZWRlZnMnKS5nZXRDaGlsZCh0eXBlZGVmXy5uYW1lKTsKICB9CgogIC8vLyBUYWtlIG93bmVyc2hpcCBvZiBhIGNoaWxkIGNhbm9uaWNhbCBuYW1lIGFuZCBpdHMgc3VidHJlZS4KICAvLy8KICAvLy8gVGhlIGNoaWxkIG5hbWUgaXMgcmVtb3ZlZCBhcyBhIGNoaWxkIG9mIGl0cyBjdXJyZW50IHBhcmVudCBhbmQgdGhpcyBuYW1lCiAgLy8vIGJlY29tZXMgdGhlIG5ldyBwYXJlbnQuICBOb3RlIHRoYXQgdGhpcyBtb3ZlcyB0aGUgZW50aXJlIHN1YnRyZWUgcm9vdGVkIGF0CiAgLy8vIHRoZSBjaGlsZC4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gbW92ZSBzdWJ0cmVlcyB3aXRoaW4gYSBjYW5vbmljYWwgbmFtZSB0cmVlIG9yCiAgLy8vIGVsc2UgbW92ZSB0aGVtIGJldHdlZW4gdHJlZXMuICBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtZXRob2QgaWYgdGhlIGNoaWxkCiAgLy8vIG5hbWUgaXMgYWxyZWFkeSBhIGNoaWxkIG9mIHRoaXMgbmFtZS4KICAvLy8KICAvLy8gVGhlIHByZWNvbmRpdGlvbiBpcyB0aGF0IHRoaXMgbmFtZSBjYW5ub3QgaGF2ZSBhIChkaWZmZXJlbnQpIGNoaWxkIHdpdGgKICAvLy8gdGhlIHNhbWUgbmFtZS4KICB2b2lkIGFkb3B0Q2hpbGQoQ2Fub25pY2FsTmFtZSBjaGlsZCkgewogICAgaWYgKGNoaWxkLl9wYXJlbnQgPT0gdGhpcykgcmV0dXJuOwogICAgaWYgKF9jaGlsZHJlbiAhPSBudWxsICYmIF9jaGlsZHJlbi5jb250YWluc0tleShjaGlsZC5uYW1lKSkgewogICAgICB0aHJvdyAnQ2Fubm90IGFkZCBhIGNoaWxkIHRvICR0aGlzIGJlY2F1c2UgdGhpcyBuYW1lIGFscmVhZHkgaGFzIGEgJwogICAgICAgICAgJ2NoaWxkIG5hbWVkICR7Y2hpbGQubmFtZX0nOwogICAgfQogICAgY2hpbGQuX3BhcmVudC5yZW1vdmVDaGlsZChjaGlsZC5uYW1lKTsKICAgIGNoaWxkLl9wYXJlbnQgPSB0aGlzOwogICAgaWYgKF9jaGlsZHJlbiA9PSBudWxsKSBfY2hpbGRyZW4gPSA8U3RyaW5nLCBDYW5vbmljYWxOYW1lPnt9OwogICAgX2NoaWxkcmVuW2NoaWxkLm5hbWVdID0gY2hpbGQ7CiAgfQoKICB2b2lkIHJlbW92ZUNoaWxkKFN0cmluZyBuYW1lKSB7CiAgICBfY2hpbGRyZW4/LnJlbW92ZShuYW1lKTsKICB9CgogIHZvaWQgYmluZFRvKFJlZmVyZW5jZSB0YXJnZXQpIHsKICAgIGlmIChyZWZlcmVuY2UgPT0gdGFyZ2V0KSByZXR1cm47CiAgICBpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKICAgICAgdGhyb3cgJyR0aGlzIGlzIGFscmVhZHkgYm91bmQnOwogICAgfQogICAgaWYgKHRhcmdldC5jYW5vbmljYWxOYW1lICE9IG51bGwpIHsKICAgICAgdGhyb3cgJ0Nhbm5vdCBiaW5kICR0aGlzIHRvICR7dGFyZ2V0Lm5vZGV9LCB0YXJnZXQgaXMgYWxyZWFkeSBib3VuZCB0byAnCiAgICAgICAgICAnJHt0YXJnZXQuY2Fub25pY2FsTmFtZX0nOwogICAgfQogICAgdGFyZ2V0LmNhbm9uaWNhbE5hbWUgPSB0aGlzOwogICAgdGhpcy5yZWZlcmVuY2UgPSB0YXJnZXQ7CiAgfQoKICB2b2lkIHVuYmluZCgpIHsKICAgIGlmIChyZWZlcmVuY2UgPT0gbnVsbCkgcmV0dXJuOwogICAgYXNzZXJ0KHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lID09IHRoaXMpOwogICAgcmVmZXJlbmNlLmNhbm9uaWNhbE5hbWUgPSBudWxsOwogICAgcmVmZXJlbmNlID0gbnVsbDsKICB9CgogIHZvaWQgdW5iaW5kQWxsKCkgewogICAgdW5iaW5kKCk7CiAgICBJdGVyYWJsZTxDYW5vbmljYWxOYW1lPiBjaGlsZHJlbl8gPSBjaGlsZHJlbk9yTnVsbDsKICAgIGlmIChjaGlsZHJlbl8gIT0gbnVsbCkgewogICAgICBmb3IgKENhbm9uaWNhbE5hbWUgY2hpbGQgaW4gY2hpbGRyZW5fKSB7CiAgICAgICAgY2hpbGQudW5iaW5kQWxsKCk7CiAgICAgIH0KICAgIH0KICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+IF9wYXJlbnQgPT0gbnVsbCA/ICdyb290JyA6ICckcGFyZW50OjokbmFtZSc7CgogIFJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoKSB7CiAgICByZXR1cm4gcmVmZXJlbmNlID8/PSAobmV3IFJlZmVyZW5jZSgpLi5jYW5vbmljYWxOYW1lID0gdGhpcyk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIGdldE1lbWJlclF1YWxpZmllcihNZW1iZXIgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSkgewogICAgICBpZiAobWVtYmVyLmlzR2V0dGVyKSByZXR1cm4gJ0BnZXR0ZXJzJzsKICAgICAgaWYgKG1lbWJlci5pc1NldHRlcikgcmV0dXJuICdAc2V0dGVycyc7CiAgICAgIGlmIChtZW1iZXIuaXNGYWN0b3J5KSByZXR1cm4gJ0BmYWN0b3JpZXMnOwogICAgICByZXR1cm4gJ0BtZXRob2RzJzsKICAgIH0KICAgIGlmIChtZW1iZXIgaXMgRmllbGQpIHsKICAgICAgcmV0dXJuICdAZmllbGRzJzsKICAgIH0KICAgIGlmIChtZW1iZXIgaXMgQ29uc3RydWN0b3IpIHsKICAgICAgcmV0dXJuICdAY29uc3RydWN0b3JzJzsKICAgIH0KICAgIGlmIChtZW1iZXIgaXMgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IpIHsKICAgICAgcmV0dXJuICdAZmFjdG9yaWVzJzsKICAgIH0KICAgIHRocm93ICdVbmV4cGVjdGVkIG1lbWJlcjogJG1lbWJlcic7CiAgfQp9CoDaAE5OPB8BEwFDBElBBEwQBBIbBBAwGgQWORwbBBA5FhsEEi4YFgQ3ORcbBCU5FxsEJTkXGwQmLhkbBBknFgRLORYZAScBFR0BKAE4FwExEgEtGhw/BAEXGBwTASYvASo0AUMBHz0EASg3OgQBK1FJQR0EATcaRh8EATQwMQQBN0AEATg6BAFABk9REQZPUSwGThUpJ0JLJwYrGkIjBAEiHQQBIiUdJgYoTyUGIR0EARIjLSQWBAEVDjgdLxsIBgQBRAEdQgQBNB8uLjEZBhsYBiEeBjMbBigEAgEicGFja2FnZTprZXJuZWwvY2Fub25pY2FsX25hbWUuZGFydDJzZGtyb290Oi9wa2cva2VybmVsL2xpYi90cmFuc2Zvcm1hdGlvbnMvZmxhZ3MuZGFydIL1bGlicmFyeSBrZXJuZWwudHJhbnNmb3JtYXRpb25zLmZsYWdzOwoKaW1wb3J0ICcuLi9hc3QuZGFydCc7CgovLy8gRmxhZ3Mgc3VtbWFyaXppbmcgdGhlIGtpbmRzIG9mIEFTVCBub2RlcyBjb250YWluZWQgaW4gYSBnaXZlbiBtZW1iZXIgb3IKLy8vIGNsYXNzLCBmb3Igc3BlZWRpbmcgdXAgdHJhbnNmb3JtYXRpb25zIHRoYXQgb25seSBhZmZlY3QgY2VydGFpbiB0eXBlcyBvZgovLy8gbm9kZXMuCi8vLwovLy8gVGhlc2UgYXJlIHNldCBieSB0aGUgZnJvbnRlbmQgYW5kIHRoZSBkZXNlcmlhbGl6ZXIuCmNsYXNzIFRyYW5zZm9ybWVyRmxhZyB7CiAgLy8vIFRoZSBjbGFzcyBvciBtZW1iZXIgY29udGFpbnMgJ3N1cGVyJyBjYWxscywgdGhhdCBpcywgb25lIG9mIHRoZSBBU1Qgbm9kZXMKICAvLy8gW1N1cGVyUHJvcGVydHlHZXRdLCBbU3VwZXJQcm9wZXJ0eVNldF0sIFtTdXBlck1ldGhvZEludm9jYXRpb25dLgogIHN0YXRpYyBjb25zdCBpbnQgc3VwZXJDYWxscyA9IDEgPDwgMDsKCiAgLy8vIFRlbXBvcmFyeSBmbGFnIHVzZWQgYnkgdGhlIHZlcmlmaWVyIHRvIGluZGljYXRlIHRoYXQgdGhlIGdpdmVuIG1lbWJlcgogIC8vLyBoYXMgYmVlbiBzZWVuLgogIHN0YXRpYyBjb25zdCBpbnQgc2VlbkJ5VmVyaWZpZXIgPSAxIDw8IDE7CgogIC8vIFRPRE8oYXNnZXJmKTogIFdlIGNvdWxkIGFsc28gYWRkIGEgZmxhZyBmb3IgJ2FzeW5jJyBhbmQgd2lsbCBwcm9iYWJseSBoYXZlCiAgLy8gb25lIGZvciBjbG9zdXJlcyBhcyB3ZWxsLgp9ChcAJgEWAUxNCwQ4GFBHKAFMFSwBUB8CASlwYWNrYWdlOmtlcm5lbC90cmFuc2Zvcm1hdGlvbnMvZmxhZ3MuZGFydClzZGtyb290Oi9wa2cva2VybmVsL2xpYi90eXBlX2FsZ2VicmEuZGFydMAAbUEvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgpsaWJyYXJ5IGtlcm5lbC50eXBlX2FsZ2VicmE7CgppbXBvcnQgJ2FzdC5kYXJ0JzsKCi8vLyBSZXR1cm5zIGEgdHlwZSB3aGVyZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIGdpdmVuIHR5cGUgcGFyYW1ldGVycyBoYXZlIGJlZW4KLy8vIHJlcGxhY2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdHlwZXMuCi8vLwovLy8gVGhpcyB3aWxsIGNvcHkgb25seSB0aGUgc3VidGVybXMgb2YgW3R5cGVdIHRoYXQgY29udGFpbiBzdWJzdGl0dXRlZAovLy8gdmFyaWFibGVzOyBhbGwgb3RoZXIgW0RhcnRUeXBlXSBvYmplY3RzIHdpbGwgYmUgcmV1c2VkLgovLy8KLy8vIEluIHBhcnRpY3VsYXIsIGlmIG5vIHZhcmlhYmxlcyB3ZXJlIHN1YnN0aXR1dGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8KLy8vIHJldHVybiB0aGUgW3R5cGVdIGluc3RhbmNlIChub3QgYSBjb3B5KSwgc28gdGhlIGNhbGxlciBtYXkgdXNlIFtpZGVudGljYWxdCi8vLyB0byBlZmZpY2llbnRseSBjaGVjayBpZiBhIGRpc3RpbmN0IHR5cGUgd2FzIGNyZWF0ZWQuCkRhcnRUeXBlIHN1YnN0aXR1dGUoRGFydFR5cGUgdHlwZSwgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBzdWJzdGl0dXRpb24pIHsKICBpZiAoc3Vic3RpdHV0aW9uLmlzRW1wdHkpIHJldHVybiB0eXBlOwogIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbU1hcChzdWJzdGl0dXRpb24pLnN1YnN0aXR1dGVUeXBlKHR5cGUpOwp9CgovLy8gUmV0dXJucyBhIG1hcHBpbmcgZnJvbSB0aGUgdHlwZSBwYXJhbWV0ZXJzIGRlY2xhcmVkIG9uIHRoZSBjbGFzcyBvZiBbdHlwZV0KLy8vIHRvIHRoZSBhY3R1YWwgdHlwZSBhcmd1bWVudHMgcHJvdmlkZWQgaW4gW3R5cGVdLgovLy8KLy8vIFRoaXMgY2FuIGJlIHBhc3NlZCBhcyBhcmd1bWVudCB0byBbc3Vic3RpdHV0ZV0uCk1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gZ2V0U3Vic3RpdHV0aW9uTWFwKFN1cGVydHlwZSB0eXBlKSB7CiAgcmV0dXJuIHR5cGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5CiAgICAgID8gY29uc3QgPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9CiAgICAgIDogbmV3IE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4uZnJvbUl0ZXJhYmxlcygKICAgICAgICAgIHR5cGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLCB0eXBlLnR5cGVBcmd1bWVudHMpOwp9CgpNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IGdldFVwcGVyQm91bmRTdWJzdGl0dXRpb25NYXAoQ2xhc3MgaG9zdCkgewogIGlmIChob3N0LnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybiBjb25zdCA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgdmFyIHJlc3VsdCA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICBmb3IgKHZhciBwYXJhbWV0ZXIgaW4gaG9zdC50eXBlUGFyYW1ldGVycykgewogICAgcmVzdWx0W3BhcmFtZXRlcl0gPSBjb25zdCBEeW5hbWljVHlwZSgpOwogIH0KICBmb3IgKHZhciBwYXJhbWV0ZXIgaW4gaG9zdC50eXBlUGFyYW1ldGVycykgewogICAgcmVzdWx0W3BhcmFtZXRlcl0gPSBzdWJzdGl0dXRlKHBhcmFtZXRlci5ib3VuZCwgcmVzdWx0KTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKLy8vIExpa2UgW3N1YnN0aXR1dGVdLCBleGNlcHQgd2hlbiBhIHR5cGUgaW4gdGhlIFtzdWJzdGl0dXRpb25dIG1hcCByZWZlcmVuY2VzCi8vLyBhbm90aGVyIHN1YnN0aXR1dGVkIHR5cGUgdmFyaWFibGUsIHRoZSBtYXBwaW5nIGZvciB0aGF0IHR5cGUgaXMgcmVjdXJzaXZlbHkKLy8vIGluc2VydGVkLgovLy8KLy8vIEZvciBleGFtcGxlIGBTZXQ8Rz5gIHN1YnN0aXR1dGVkIHdpdGggYHtUIC0+IFN0cmluZywgRyAtPiBMaXN0PFQ+fWAgcmVzdWx0cwovLy8gaW4gYFNldDxMaXN0PFN0cmluZz4+YC4KLy8vCi8vLyBSZXR1cm5zIGBudWxsYCBpZiB0aGUgc3Vic3RpdHV0aW9uIG1hcCBjb250YWlucyBhIGN5Y2xlIHJlYWNoYWJsZSBmcm9tIGEKLy8vIHR5cGUgdmFyaWFibGUgaW4gW3R5cGVdICh0aGUgcmVzdWx0aW5nIHR5cGUgd291bGQgYmUgaW5maW5pdGUpLgovLy8KLy8vIFRoZSBbc3Vic3RpdHV0aW9uXSBtYXAgd2lsbCBiZSBtdXRhdGVkIHNvIHRoYXQgdGhlIHJpZ2h0LWhhbmQgc2lkZXMgbWF5Ci8vLyBiZSByZW1hcHBlZCB0byB0aGUgZGVlcGx5IHN1YnN0aXR1dGVkIHR5cGUsIGJ1dCBvbmx5IGZvciB0aGUga2V5cyB0aGF0IGFyZQovLy8gcmVhY2hhYmxlIGZyb20gW3R5cGVdLgovLy8KLy8vIEFzIHdpdGggW3N1YnN0aXR1dGVdLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIGlmIG5vCi8vLyBzdWJzdGl0dXRpb24gd2FzIHBlcmZvcm1lZC4KRGFydFR5cGUgc3Vic3RpdHV0ZURlZXAoCiAgICBEYXJ0VHlwZSB0eXBlLCBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbikgewogIGlmIChzdWJzdGl0dXRpb24uaXNFbXB0eSkgcmV0dXJuIHR5cGU7CiAgdmFyIHN1YnN0aXR1dG9yID0gbmV3IF9EZWVwVHlwZVN1YnN0aXR1dG9yKHN1YnN0aXR1dGlvbik7CiAgdmFyIHJlc3VsdCA9IHN1YnN0aXR1dG9yLnZpc2l0KHR5cGUpOwogIHJldHVybiBzdWJzdGl0dXRvci5pc0luZmluaXRlID8gbnVsbCA6IHJlc3VsdDsKfQoKLy8vIFJldHVybnMgdHJ1ZSBpZiBbdHlwZV0gY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBnaXZlbiBbdmFyaWFibGVzXS4KLy8vCi8vLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgd2l0aCBhIFt0eXBlXSB0aGF0IGNvbnRhaW5zIGEgW0Z1bmN0aW9uVHlwZV0KLy8vIHRoYXQgZGVjbGFyZXMgb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGluIFt2YXJpYWJsZXNdLgpib29sIGNvbnRhaW5zVHlwZVZhcmlhYmxlKERhcnRUeXBlIHR5cGUsIFNldDxUeXBlUGFyYW1ldGVyPiB2YXJpYWJsZXMpIHsKICBpZiAodmFyaWFibGVzLmlzRW1wdHkpIHJldHVybiBmYWxzZTsKICByZXR1cm4gbmV3IF9PY2N1cnJlbmNlVmlzaXRvcih2YXJpYWJsZXMpLnZpc2l0KHR5cGUpOwp9CgovLy8gR2l2ZW4gYSBzZXQgb2YgdHlwZSB2YXJpYWJsZXMsIGZpbmRzIGEgc3Vic3RpdHV0aW9uIG9mIHRob3NlIHZhcmlhYmxlcyBzdWNoCi8vLyB0aGF0IHRoZSB0d28gZ2l2ZW4gdHlwZXMgYmVjb21lcyBlcXVhbCwgb3IgcmV0dXJucyBgbnVsbGAgaWYgbm8gc3VjaAovLy8gc3Vic3RpdHV0aW9uIGV4aXN0cy4KLy8vCi8vLyBGb3IgZXhhbXBsZSwgdW5pZnlpbmcgYExpc3Q8VD5gIHdpdGggYExpc3Q8U3RyaW5nPmAsIHdoZXJlIGBUYCBpcyBhCi8vLyBxdWFudGlmaWVkIHZhcmlhYmxlLCB5aWVsZHMgdGhlIHN1YnN0aXR1dGlvbiBgVCA9IFN0cmluZ2AuCi8vLwovLy8gSWYgc3VjY2Vzc2Z1bCwgdGhpcyBlcXVhdGlvbiBob2xkczoKLy8vCi8vLyAgICAgc3Vic3RpdHV0ZSh0eXBlMSwgc3Vic3RpdHV0aW9uKSA9PSBzdWJzdGl0dXRlKHR5cGUyLCBzdWJzdGl0dXRpb24pCi8vLwovLy8gVGhlIHVuaWZpY2F0aW9uIGNhbiBmYWlsIGZvciB0d28gcmVhc29uczoKLy8vIC0gaW5jb21wYXRpYmxlIHR5cGVzLCBlLmcuIGBMaXN0PFQ+YCBjYW5ub3QgYmUgdW5pZmllZCB3aXRoIGBTZXQ8VD5gLgovLy8gLSBpbmZpbml0ZSB0eXBlczogZS5nLiBgVGAgY2Fubm90IGJlIHVuaWZpZWQgd2l0aCBgTGlzdDxUPmAgYmVjYXVzZSBpdAovLy8gICB3b3VsZCBjcmVhdGUgdGhlIGluZmluaXRlIHR5cGUgYExpc3Q8TGlzdDxMaXN0PC4uLj4+PmAuCk1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gdW5pZnlUeXBlcygKICAgIERhcnRUeXBlIHR5cGUxLCBEYXJ0VHlwZSB0eXBlMiwgU2V0PFR5cGVQYXJhbWV0ZXI+IHF1YW50aWZpZWRWYXJpYWJsZXMpIHsKICB2YXIgdW5pZmllciA9IG5ldyBfVHlwZVVuaWZpY2F0aW9uKHR5cGUxLCB0eXBlMiwgcXVhbnRpZmllZFZhcmlhYmxlcyk7CiAgcmV0dXJuIHVuaWZpZXIuc3VjY2VzcyA/IHVuaWZpZXIuc3Vic3RpdHV0aW9uIDogbnVsbDsKfQoKLy8vIEdlbmVyYXRlcyBhIGZyZXNoIGNvcHkgb2YgdGhlIGdpdmVuIHR5cGUgcGFyYW1ldGVycywgd2l0aCB0aGVpciBib3VuZHMKLy8vIHN1YnN0aXR1dGVkIHRvIHJlZmVyZW5jZSB0aGUgbmV3IHBhcmFtZXRlcnMuCi8vLwovLy8gVGhlIHJldHVybmVkIG9iamVjdCBjb250YWlucyB0aGUgZnJlc2ggdHlwZSBwYXJhbWV0ZXIgbGlzdCBhcyB3ZWxsIGFzIGEKLy8vIG1hcHBpbmcgdG8gYmUgdXNlZCBmb3IgcmVwbGFjaW5nIG90aGVyIHR5cGVzIHRvIHVzZSB0aGUgbmV3IHR5cGUgcGFyYW1ldGVycy4KRnJlc2hUeXBlUGFyYW1ldGVycyBnZXRGcmVzaFR5cGVQYXJhbWV0ZXJzKExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKICB2YXIgZnJlc2hQYXJhbWV0ZXJzID0gbmV3IExpc3Q8VHlwZVBhcmFtZXRlcj4uZ2VuZXJhdGUoCiAgICAgIHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgKGkpID0+IG5ldyBUeXBlUGFyYW1ldGVyKHR5cGVQYXJhbWV0ZXJzW2ldLm5hbWUpLAogICAgICBncm93YWJsZTogdHJ1ZSk7CiAgdmFyIG1hcCA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICBtYXBbdHlwZVBhcmFtZXRlcnNbaV1dID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKGZyZXNoUGFyYW1ldGVyc1tpXSk7CiAgfQogIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgIGZyZXNoUGFyYW1ldGVyc1tpXS5ib3VuZCA9IHN1YnN0aXR1dGUodHlwZVBhcmFtZXRlcnNbaV0uYm91bmQsIG1hcCk7CiAgICBmcmVzaFBhcmFtZXRlcnNbaV0uZGVmYXVsdFR5cGUgPSB0eXBlUGFyYW1ldGVyc1tpXS5kZWZhdWx0VHlwZSAhPSBudWxsCiAgICAgICAgPyBzdWJzdGl0dXRlKHR5cGVQYXJhbWV0ZXJzW2ldLmRlZmF1bHRUeXBlLCBtYXApCiAgICAgICAgOiBudWxsOwogIH0KICByZXR1cm4gbmV3IEZyZXNoVHlwZVBhcmFtZXRlcnMoZnJlc2hQYXJhbWV0ZXJzLCBTdWJzdGl0dXRpb24uZnJvbU1hcChtYXApKTsKfQoKY2xhc3MgRnJlc2hUeXBlUGFyYW1ldGVycyB7CiAgZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiBmcmVzaFR5cGVQYXJhbWV0ZXJzOwogIGZpbmFsIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb247CgogIEZyZXNoVHlwZVBhcmFtZXRlcnModGhpcy5mcmVzaFR5cGVQYXJhbWV0ZXJzLCB0aGlzLnN1YnN0aXR1dGlvbik7CgogIEZ1bmN0aW9uVHlwZSBhcHBseVRvRnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSB0eXBlKSA9PiBuZXcgRnVuY3Rpb25UeXBlKAogICAgICB0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLm1hcChzdWJzdGl0dXRlKS50b0xpc3QoKSwKICAgICAgc3Vic3RpdHV0ZSh0eXBlLnJldHVyblR5cGUpLAogICAgICBuYW1lZFBhcmFtZXRlcnM6IHR5cGUubmFtZWRQYXJhbWV0ZXJzLm1hcChzdWJzdGl0dXRlTmFtZWQpLnRvTGlzdCgpLAogICAgICB0eXBlUGFyYW1ldGVyczogZnJlc2hUeXBlUGFyYW1ldGVycywKICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogdHlwZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICB0eXBlZGVmVHlwZToKICAgICAgICAgIHR5cGUudHlwZWRlZlR5cGUgPT0gbnVsbCA/IG51bGwgOiBzdWJzdGl0dXRlKHR5cGUudHlwZWRlZlR5cGUpKTsKCiAgRGFydFR5cGUgc3Vic3RpdHV0ZShEYXJ0VHlwZSB0eXBlKSA9PiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUodHlwZSk7CgogIE5hbWVkVHlwZSBzdWJzdGl0dXRlTmFtZWQoTmFtZWRUeXBlIHR5cGUpID0+CiAgICAgIG5ldyBOYW1lZFR5cGUodHlwZS5uYW1lLCBzdWJzdGl0dXRlKHR5cGUudHlwZSkpOwoKICBTdXBlcnR5cGUgc3Vic3RpdHV0ZVN1cGVyKFN1cGVydHlwZSB0eXBlKSB7CiAgICByZXR1cm4gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVTdXBlcnR5cGUodHlwZSk7CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBMRU1FTlRBVElPTgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmFic3RyYWN0IGNsYXNzIFN1YnN0aXR1dGlvbiB7CiAgY29uc3QgU3Vic3RpdHV0aW9uKCk7CgogIHN0YXRpYyBjb25zdCBTdWJzdGl0dXRpb24gZW1wdHkgPSBfTnVsbFN1YnN0aXR1dGlvbi5pbnN0YW5jZTsKCiAgLy8vIFN1YnN0aXR1dGVzIGVhY2ggcGFyYW1ldGVyIHRvIHRoZSB0eXBlIGl0IG1hcHMgdG8gaW4gW21hcF0uCiAgc3RhdGljIFN1YnN0aXR1dGlvbiBmcm9tTWFwKE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gbWFwKSB7CiAgICBpZiAobWFwLmlzRW1wdHkpIHJldHVybiBfTnVsbFN1YnN0aXR1dGlvbi5pbnN0YW5jZTsKICAgIHJldHVybiBuZXcgX01hcFN1YnN0aXR1dGlvbihtYXAsIG1hcCk7CiAgfQoKICBzdGF0aWMgU3Vic3RpdHV0aW9uIGZpbHRlcmVkKFN1YnN0aXR1dGlvbiBzdWIsIFR5cGVQYXJhbWV0ZXJGaWx0ZXIgZmlsdGVyKSB7CiAgICByZXR1cm4gbmV3IF9GaWx0ZXJlZFN1YnN0aXR1dGlvbihzdWIsIGZpbHRlcik7CiAgfQoKICAvLy8gU3Vic3RpdHV0ZXMgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBnaXZlbiB0eXBlIHBhcmFtZXRlcnMgd2l0aCB0aGUKICAvLy8gY29ycmVzcG9uZGluZyB1cHBlciBvciBsb3dlciBib3VuZCwgZGVwZW5kaW5nIG9uIHRoZSB2YXJpYW5jZSBvZiB0aGUKICAvLy8gY29udGV4dCB3aGVyZSBpdCBvY2N1cnMuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlIHRoZSB0eXBlIGAoVCkgPT4gVGAgd2l0aCB0aGUgYm91bmRzIGBib3R0b20gPDogVCA8OiBudW1gCiAgLy8vIGJlY29tZXMgYChib3R0b20pID0+IG51bWAgKGluIHRoaXMgZXhhbXBsZSwgYG51bWAgaXMgdGhlIHVwcGVyIGJvdW5kLAogIC8vLyBhbmQgYGJvdHRvbWAgaXMgdGhlIGxvd2VyIGJvdW5kKS4KICAvLy8KICAvLy8gVGhpcyBpcyBhIHdheSB0byBvYnRhaW4gYW4gdXBwZXIgYm91bmQgZm9yIGEgdHlwZSB3aGlsZSBlbGltaW5hdGluZyBhbGwKICAvLy8gcmVmZXJlbmNlcyB0byBjZXJ0YWluIHR5cGUgdmFyaWFibGVzLgogIHN0YXRpYyBTdWJzdGl0dXRpb24gZnJvbVVwcGVyQW5kTG93ZXJCb3VuZHMoCiAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gdXBwZXIsIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gbG93ZXIpIHsKICAgIGlmICh1cHBlci5pc0VtcHR5ICYmIGxvd2VyLmlzRW1wdHkpIHJldHVybiBfTnVsbFN1YnN0aXR1dGlvbi5pbnN0YW5jZTsKICAgIHJldHVybiBuZXcgX01hcFN1YnN0aXR1dGlvbih1cHBlciwgbG93ZXIpOwogIH0KCiAgLy8vIFN1YnN0aXR1dGVzIHRoZSB0eXBlIHBhcmFtZXRlcnMgb24gdGhlIGNsYXNzIG9mIFtzdXBlcnR5cGVdIHdpdGggdGhlCiAgLy8vIHR5cGUgYXJndW1lbnRzIHByb3ZpZGVkIGluIFtzdXBlcnR5cGVdLgogIHN0YXRpYyBTdWJzdGl0dXRpb24gZnJvbVN1cGVydHlwZShTdXBlcnR5cGUgc3VwZXJ0eXBlKSB7CiAgICBpZiAoc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgcmV0dXJuIF9OdWxsU3Vic3RpdHV0aW9uLmluc3RhbmNlOwogICAgcmV0dXJuIGZyb21NYXAobmV3IE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4uZnJvbUl0ZXJhYmxlcygKICAgICAgICBzdXBlcnR5cGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLCBzdXBlcnR5cGUudHlwZUFyZ3VtZW50cykpOwogIH0KCiAgLy8vIFN1YnN0aXR1dGVzIHRoZSB0eXBlIHBhcmFtZXRlcnMgb24gdGhlIGNsYXNzIG9mIFt0eXBlXSB3aXRoIHRoZQogIC8vLyB0eXBlIGFyZ3VtZW50cyBwcm92aWRlZCBpbiBbdHlwZV0uCiAgc3RhdGljIFN1YnN0aXR1dGlvbiBmcm9tSW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgcmV0dXJuIF9OdWxsU3Vic3RpdHV0aW9uLmluc3RhbmNlOwogICAgcmV0dXJuIGZyb21NYXAobmV3IE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4uZnJvbUl0ZXJhYmxlcygKICAgICAgICB0eXBlLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVycywgdHlwZS50eXBlQXJndW1lbnRzKSk7CiAgfQoKICAvLy8gU3Vic3RpdHV0ZXMgdGhlIHR5cGUgcGFyYW1ldGVycyBvbiB0aGUgdHlwZWRlZiBvZiBbdHlwZV0gd2l0aCB0aGUKICAvLy8gdHlwZSBhcmd1bWVudHMgcHJvdmlkZWQgaW4gW3R5cGVdLgogIHN0YXRpYyBTdWJzdGl0dXRpb24gZnJvbVR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgcmV0dXJuIF9OdWxsU3Vic3RpdHV0aW9uLmluc3RhbmNlOwogICAgcmV0dXJuIGZyb21NYXAobmV3IE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4uZnJvbUl0ZXJhYmxlcygKICAgICAgICB0eXBlLnR5cGVkZWZOb2RlLnR5cGVQYXJhbWV0ZXJzLCB0eXBlLnR5cGVBcmd1bWVudHMpKTsKICB9CgogIC8vLyBTdWJzdGl0dXRlcyB0aGUgTnRoIHBhcmFtZXRlciBpbiBbcGFyYW1ldGVyc10gd2l0aCB0aGUgTnRoIHR5cGUgaW4KICAvLy8gW3R5cGVzXS4KICBzdGF0aWMgU3Vic3RpdHV0aW9uIGZyb21QYWlycygKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBwYXJhbWV0ZXJzLCBMaXN0PERhcnRUeXBlPiB0eXBlcykgewogICAgLy8gVE9ETyhhc2dlcmYpOiBJbnZlc3RpZ2F0ZSBpZiBpdCBpcyBtb3JlIGVmZmljaWVudCB0byBpbXBsZW1lbnQKICAgIC8vIHN1YnN0aXR1dGlvbiBiYXNlZCBvbiBwYXJhbGxlbCBwYWlyd2lzZSBsaXN0cyBpbnN0ZWFkIG9mIE1hcHMuCiAgICBhc3NlcnQocGFyYW1ldGVycy5sZW5ndGggPT0gdHlwZXMubGVuZ3RoKTsKICAgIGlmIChwYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybiBfTnVsbFN1YnN0aXR1dGlvbi5pbnN0YW5jZTsKICAgIHJldHVybiBmcm9tTWFwKAogICAgICAgIG5ldyBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+LmZyb21JdGVyYWJsZXMocGFyYW1ldGVycywgdHlwZXMpKTsKICB9CgogIC8vLyBTdWJzdGl0dXRlcyB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9uIHRoZSBjbGFzcyB3aXRoIGJvdHRvbSBvciBkeW5hbWljLAogIC8vLyBkZXBlbmRpbmcgb24gdGhlIGNvdmFyaWFuY2Ugb2YgaXRzIHVzZS4KICBzdGF0aWMgU3Vic3RpdHV0aW9uIGJvdHRvbUZvckNsYXNzKENsYXNzIGNsYXNzXykgewogICAgaWYgKGNsYXNzXy50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSByZXR1cm4gX051bGxTdWJzdGl0dXRpb24uaW5zdGFuY2U7CiAgICByZXR1cm4gbmV3IF9DbGFzc0JvdHRvbVN1YnN0aXR1dGlvbihjbGFzc18pOwogIH0KCiAgLy8vIFN1YnN0aXR1dGVzIGNvdmFyaWFudCB1c2VzIG9mIFtjbGFzc19dJ3MgdHlwZSBwYXJhbWV0ZXJzIHdpdGggdGhlIHVwcGVyCiAgLy8vIGJvdW5kIG9mIHRoYXQgdHlwZSBwYXJhbWV0ZXIuICBSZWN1cnNpdmUgcmVmZXJlbmNlcyBpbiB0aGUgYm91bmQgaGF2ZQogIC8vLyBiZWVuIHJlcGxhY2VkIGJ5IGR5bmFtaWMuCiAgc3RhdGljIFN1YnN0aXR1dGlvbiB1cHBlckJvdW5kRm9yQ2xhc3MoQ2xhc3MgY2xhc3NfKSB7CiAgICBpZiAoY2xhc3NfLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybiBfTnVsbFN1YnN0aXR1dGlvbi5pbnN0YW5jZTsKICAgIHZhciB1cHBlciA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgIGZvciAodmFyIHBhcmFtZXRlciBpbiBjbGFzc18udHlwZVBhcmFtZXRlcnMpIHsKICAgICAgdXBwZXJbcGFyYW1ldGVyXSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9CiAgICBmb3IgKHZhciBwYXJhbWV0ZXIgaW4gY2xhc3NfLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIHVwcGVyW3BhcmFtZXRlcl0gPSBzdWJzdGl0dXRlKHBhcmFtZXRlci5ib3VuZCwgdXBwZXIpOwogICAgfQogICAgcmV0dXJuIGZyb21VcHBlckFuZExvd2VyQm91bmRzKHVwcGVyLCB7fSk7CiAgfQoKICAvLy8gU3Vic3RpdHV0ZXMgYm90aCB2YXJpYWJsZXMgZnJvbSBbZmlyc3RdIGFuZCBbc2Vjb25kXSwgZmF2b3JpbmcgdGhvc2UgZnJvbQogIC8vLyBbZmlyc3RdIGlmIHRoZXkgb3ZlcmxhcC4KICAvLy8KICAvLy8gTmVpdGhlciBzdWJzdGl0dXRpb24gaXMgYXBwbGllZCB0byB0aGUgcmVzdWx0cyBvZiB0aGUgb3RoZXIsIHNvIHRoaXMgZG9lcwogIC8vLyAqbm90KiBjb3JyZXNwb25kIHRvIGEgc2VxdWVuY2Ugb2YgdHdvIHN1YnNpdHV0aW9ucy4gRm9yIGV4YW1wbGUsIGNvbWJpbmluZwogIC8vLyBge1QgLT4gTGlzdDxHPn1gIHdpdGggYHtHIC0+IFN0cmluZ31gIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8KICAvLy8gYHtUIC0+IExpc3Q8U3RyaW5nPn1gIGJlY2F1c2UgdGhlIHJlc3VsdCBmcm9tIHN1YnN0aXR1dGluZyBgVGAgaXMgbm90CiAgLy8vIHNlYXJjaGVkIGZvciBvY2N1cmVuY2VzIG9mIGBHYC4KICBzdGF0aWMgU3Vic3RpdHV0aW9uIGNvbWJpbmUoU3Vic3RpdHV0aW9uIGZpcnN0LCBTdWJzdGl0dXRpb24gc2Vjb25kKSB7CiAgICBpZiAoZmlyc3QgPT0gX051bGxTdWJzdGl0dXRpb24uaW5zdGFuY2UpIHJldHVybiBzZWNvbmQ7CiAgICBpZiAoc2Vjb25kID09IF9OdWxsU3Vic3RpdHV0aW9uLmluc3RhbmNlKSByZXR1cm4gZmlyc3Q7CiAgICByZXR1cm4gbmV3IF9Db21iaW5lZFN1YnN0aXR1dGlvbihmaXJzdCwgc2Vjb25kKTsKICB9CgogIERhcnRUeXBlIGdldFN1YnN0aXR1dGUoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIsIGJvb2wgdXBwZXJCb3VuZCk7CgogIERhcnRUeXBlIHN1YnN0aXR1dGVUeXBlKERhcnRUeXBlIG5vZGUsIHtib29sIGNvbnRyYXZhcmlhbnQ6IGZhbHNlfSkgewogICAgcmV0dXJuIG5ldyBfVG9wU3Vic3RpdHV0b3IodGhpcywgY29udHJhdmFyaWFudCkudmlzaXQobm9kZSk7CiAgfQoKICBTdXBlcnR5cGUgc3Vic3RpdHV0ZVN1cGVydHlwZShTdXBlcnR5cGUgbm9kZSkgewogICAgcmV0dXJuIG5ldyBfVG9wU3Vic3RpdHV0b3IodGhpcywgZmFsc2UpLnZpc2l0U3VwZXJ0eXBlKG5vZGUpOwogIH0KfQoKY2xhc3MgX051bGxTdWJzdGl0dXRpb24gZXh0ZW5kcyBTdWJzdGl0dXRpb24gewogIHN0YXRpYyBjb25zdCBfTnVsbFN1YnN0aXR1dGlvbiBpbnN0YW5jZSA9IGNvbnN0IF9OdWxsU3Vic3RpdHV0aW9uKCk7CgogIGNvbnN0IF9OdWxsU3Vic3RpdHV0aW9uKCk7CgogIERhcnRUeXBlIGdldFN1YnN0aXR1dGUoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIsIGJvb2wgdXBwZXJCb3VuZCkgewogICAgcmV0dXJuIG5ldyBUeXBlUGFyYW1ldGVyVHlwZShwYXJhbWV0ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgc3Vic3RpdHV0ZVR5cGUoRGFydFR5cGUgbm9kZSwge2Jvb2wgY29udHJhdmFyaWFudDogZmFsc2V9KSA9PiBub2RlOwoKICBAb3ZlcnJpZGUKICBTdXBlcnR5cGUgc3Vic3RpdHV0ZVN1cGVydHlwZShTdXBlcnR5cGUgbm9kZSkgPT4gbm9kZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlN1YnN0aXR1dGlvbi5lbXB0eSI7Cn0KCmNsYXNzIF9NYXBTdWJzdGl0dXRpb24gZXh0ZW5kcyBTdWJzdGl0dXRpb24gewogIGZpbmFsIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gdXBwZXI7CiAgZmluYWwgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBsb3dlcjsKCiAgX01hcFN1YnN0aXR1dGlvbih0aGlzLnVwcGVyLCB0aGlzLmxvd2VyKTsKCiAgRGFydFR5cGUgZ2V0U3Vic3RpdHV0ZShUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7CiAgICByZXR1cm4gdXBwZXJCb3VuZCA/IHVwcGVyW3BhcmFtZXRlcl0gOiBsb3dlcltwYXJhbWV0ZXJdOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIl9NYXBTdWJzdGl0dXRpb24oJHVwcGVyLCAkbG93ZXIpIjsKfQoKY2xhc3MgX1RvcFN1YnN0aXR1dG9yIGV4dGVuZHMgX1R5cGVTdWJzdGl0dXRvciB7CiAgZmluYWwgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbjsKCiAgX1RvcFN1YnN0aXR1dG9yKHRoaXMuc3Vic3RpdHV0aW9uLCBib29sIGNvbnRyYXZhcmlhbnQpIDogc3VwZXIobnVsbCkgewogICAgaWYgKGNvbnRyYXZhcmlhbnQpIHsKICAgICAgaW52ZXJ0VmFyaWFuY2UoKTsKICAgIH0KICB9CgogIERhcnRUeXBlIGxvb2t1cChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7CiAgICByZXR1cm4gc3Vic3RpdHV0aW9uLmdldFN1YnN0aXR1dGUocGFyYW1ldGVyLCB1cHBlckJvdW5kKTsKICB9CgogIFR5cGVQYXJhbWV0ZXIgZnJlc2hUeXBlUGFyYW1ldGVyKFR5cGVQYXJhbWV0ZXIgbm9kZSkgewogICAgdGhyb3cgJ0NyZWF0ZSBhIGZyZXNoIGVudmlyb25tZW50IGZpcnN0JzsKICB9Cn0KCmNsYXNzIF9DbGFzc0JvdHRvbVN1YnN0aXR1dGlvbiBleHRlbmRzIFN1YnN0aXR1dGlvbiB7CiAgZmluYWwgQ2xhc3MgY2xhc3NfOwoKICBfQ2xhc3NCb3R0b21TdWJzdGl0dXRpb24odGhpcy5jbGFzc18pOwoKICBEYXJ0VHlwZSBnZXRTdWJzdGl0dXRlKFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyLCBib29sIHVwcGVyQm91bmQpIHsKICAgIGlmIChwYXJhbWV0ZXIucGFyZW50ID09IGNsYXNzXykgewogICAgICByZXR1cm4gdXBwZXJCb3VuZCA/IGNvbnN0IEJvdHRvbVR5cGUoKSA6IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmNsYXNzIF9Db21iaW5lZFN1YnN0aXR1dGlvbiBleHRlbmRzIFN1YnN0aXR1dGlvbiB7CiAgZmluYWwgU3Vic3RpdHV0aW9uIGZpcnN0LCBzZWNvbmQ7CgogIF9Db21iaW5lZFN1YnN0aXR1dGlvbih0aGlzLmZpcnN0LCB0aGlzLnNlY29uZCk7CgogIERhcnRUeXBlIGdldFN1YnN0aXR1dGUoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIsIGJvb2wgdXBwZXJCb3VuZCkgewogICAgcmV0dXJuIGZpcnN0LmdldFN1YnN0aXR1dGUocGFyYW1ldGVyLCB1cHBlckJvdW5kKSA/PwogICAgICAgIHNlY29uZC5nZXRTdWJzdGl0dXRlKHBhcmFtZXRlciwgdXBwZXJCb3VuZCk7CiAgfQp9Cgp0eXBlZGVmIGJvb2wgVHlwZVBhcmFtZXRlckZpbHRlcihUeXBlUGFyYW1ldGVyIFApOwoKY2xhc3MgX0ZpbHRlcmVkU3Vic3RpdHV0aW9uIGV4dGVuZHMgU3Vic3RpdHV0aW9uIHsKICBmaW5hbCBTdWJzdGl0dXRpb24gYmFzZTsKICBmaW5hbCBUeXBlUGFyYW1ldGVyRmlsdGVyIGZpbHRlckZuOwoKICBfRmlsdGVyZWRTdWJzdGl0dXRpb24odGhpcy5iYXNlLCB0aGlzLmZpbHRlckZuKTsKCiAgRGFydFR5cGUgZ2V0U3Vic3RpdHV0ZShUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7CiAgICByZXR1cm4gZmlsdGVyRm4ocGFyYW1ldGVyKQogICAgICAgID8gYmFzZS5nZXRTdWJzdGl0dXRlKHBhcmFtZXRlciwgdXBwZXJCb3VuZCkKICAgICAgICA6IF9OdWxsU3Vic3RpdHV0aW9uLmluc3RhbmNlLmdldFN1YnN0aXR1dGUocGFyYW1ldGVyLCB1cHBlckJvdW5kKTsKICB9Cn0KCmNsYXNzIF9Jbm5lclR5cGVTdWJzdGl0dXRvciBleHRlbmRzIF9UeXBlU3Vic3RpdHV0b3IgewogIGZpbmFsIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwoKICBfSW5uZXJUeXBlU3Vic3RpdHV0b3IoX1R5cGVTdWJzdGl0dXRvciBvdXRlcikgOiBzdXBlcihvdXRlcik7CgogIERhcnRUeXBlIGxvb2t1cChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7CiAgICByZXR1cm4gc3Vic3RpdHV0aW9uW3BhcmFtZXRlcl07CiAgfQoKICBUeXBlUGFyYW1ldGVyIGZyZXNoVHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIHZhciBmcmVzaCA9IG5ldyBUeXBlUGFyYW1ldGVyKG5vZGUubmFtZSk7CiAgICBzdWJzdGl0dXRpb25bbm9kZV0gPSBuZXcgVHlwZVBhcmFtZXRlclR5cGUoZnJlc2gpOwogICAgZnJlc2guYm91bmQgPSB2aXNpdChub2RlLmJvdW5kKTsKICAgIGlmIChub2RlLmRlZmF1bHRUeXBlICE9IG51bGwpIHsKICAgICAgZnJlc2guZGVmYXVsdFR5cGUgPSB2aXNpdChub2RlLmRlZmF1bHRUeXBlKTsKICAgIH0KICAgIHJldHVybiBmcmVzaDsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9UeXBlU3Vic3RpdHV0b3IgZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8RGFydFR5cGU+IHsKICBmaW5hbCBfVHlwZVN1YnN0aXR1dG9yIG91dGVyOwogIGJvb2wgY292YXJpYW50Q29udGV4dCA9IHRydWU7CgogIF9UeXBlU3Vic3RpdHV0b3IodGhpcy5vdXRlcikgewogICAgY292YXJpYW50Q29udGV4dCA9IG91dGVyID09IG51bGwgPyB0cnVlIDogb3V0ZXIuY292YXJpYW50Q29udGV4dDsKICB9CgogIERhcnRUeXBlIGxvb2t1cChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKTsKCiAgLy8vIFRoZSBudW1iZXIgb2YgdGltZXMgYSB2YXJpYWJsZSBmcm9tIHRoaXMgZW52aXJvbm1lbnQgaGFzIGJlZW4gdXNlZCBpbgogIC8vLyBhIHN1YnN0aXR1dGlvbi4KICAvLy8KICAvLy8gVGhlcmUgaXMgYSBzdHJpY3QgcmVxdWlyZW1lbnQgdGhhdCB3ZSBtdXN0IHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZSBmb3IKICAvLy8gdHlwZXMgdGhhdCB3ZXJlIG5vdCBhbHRlcmVkIGJ5IHRoZSBzdWJzdGl0dXRpb24uICBUaGlzIGNvdW50ZXIgbGV0cyB1cwogIC8vLyBjaGVjayBxdWlja2x5IGlmIGFueXRoaW5nIGhhcHBlbmVkIGluIGEgc3Vic3RpdHV0aW9uLgogIGludCB1c2VDb3VudGVyID0gMDsKCiAgX0lubmVyVHlwZVN1YnN0aXR1dG9yIG5ld0lubmVyRW52aXJvbm1lbnQoKSB7CiAgICByZXR1cm4gbmV3IF9Jbm5lclR5cGVTdWJzdGl0dXRvcih0aGlzKTsKICB9CgogIHZvaWQgaW52ZXJ0VmFyaWFuY2UoKSB7CiAgICBjb3ZhcmlhbnRDb250ZXh0ID0gIWNvdmFyaWFudENvbnRleHQ7CiAgfQoKICBTdXBlcnR5cGUgdmlzaXRTdXBlcnR5cGUoU3VwZXJ0eXBlIG5vZGUpIHsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgcmV0dXJuIG5vZGU7CiAgICBpbnQgYmVmb3JlID0gdXNlQ291bnRlcjsKICAgIHZhciB0eXBlQXJndW1lbnRzID0gbm9kZS50eXBlQXJndW1lbnRzLm1hcCh2aXNpdCkudG9MaXN0KCk7CiAgICBpZiAodXNlQ291bnRlciA9PSBiZWZvcmUpIHJldHVybiBub2RlOwogICAgcmV0dXJuIG5ldyBTdXBlcnR5cGUobm9kZS5jbGFzc05vZGUsIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgTmFtZWRUeXBlIHZpc2l0TmFtZWRUeXBlKE5hbWVkVHlwZSBub2RlKSB7CiAgICBpbnQgYmVmb3JlID0gdXNlQ291bnRlcjsKICAgIHZhciB0eXBlID0gdmlzaXQobm9kZS50eXBlKTsKICAgIGlmICh1c2VDb3VudGVyID09IGJlZm9yZSkgcmV0dXJuIG5vZGU7CiAgICByZXR1cm4gbmV3IE5hbWVkVHlwZShub2RlLm5hbWUsIHR5cGUpOwogIH0KCiAgRGFydFR5cGUgdmlzaXQoRGFydFR5cGUgbm9kZSkgPT4gbm9kZS5hY2NlcHQodGhpcyk7CgogIERhcnRUeXBlIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgPT4gbm9kZTsKICBEYXJ0VHlwZSB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpID0+IG5vZGU7CiAgRGFydFR5cGUgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSA9PiBub2RlOwogIERhcnRUeXBlIHZpc2l0Qm90dG9tVHlwZShCb3R0b21UeXBlIG5vZGUpID0+IG5vZGU7CgogIERhcnRUeXBlIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgcmV0dXJuIG5vZGU7CiAgICBpbnQgYmVmb3JlID0gdXNlQ291bnRlcjsKICAgIHZhciB0eXBlQXJndW1lbnRzID0gbm9kZS50eXBlQXJndW1lbnRzLm1hcCh2aXNpdCkudG9MaXN0KCk7CiAgICBpZiAodXNlQ291bnRlciA9PSBiZWZvcmUpIHJldHVybiBub2RlOwogICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKG5vZGUuY2xhc3NOb2RlLCB0eXBlQXJndW1lbnRzKTsKICB9CgogIERhcnRUeXBlIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSByZXR1cm4gbm9kZTsKICAgIGludCBiZWZvcmUgPSB1c2VDb3VudGVyOwogICAgdmFyIHR5cGVBcmd1bWVudHMgPSBub2RlLnR5cGVBcmd1bWVudHMubWFwKHZpc2l0KS50b0xpc3QoKTsKICAgIGlmICh1c2VDb3VudGVyID09IGJlZm9yZSkgcmV0dXJuIG5vZGU7CiAgICByZXR1cm4gbmV3IFR5cGVkZWZUeXBlKG5vZGUudHlwZWRlZk5vZGUsIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgTGlzdDxUeXBlUGFyYW1ldGVyPiBmcmVzaFR5cGVQYXJhbWV0ZXJzKExpc3Q8VHlwZVBhcmFtZXRlcj4gcGFyYW1ldGVycykgewogICAgaWYgKHBhcmFtZXRlcnMuaXNFbXB0eSkgcmV0dXJuIGNvbnN0IDxUeXBlUGFyYW1ldGVyPltdOwogICAgcmV0dXJuIHBhcmFtZXRlcnMubWFwKGZyZXNoVHlwZVBhcmFtZXRlcikudG9MaXN0KCk7CiAgfQoKICBUeXBlUGFyYW1ldGVyIGZyZXNoVHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpOwoKICBEYXJ0VHlwZSB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgLy8gVGhpcyBpcyBhIGJpdCB0cmlja3kgYmVjYXVzZSB3ZSBoYXZlIHRvIGdlbmVyYXRlIGZyZXNoIHR5cGUgcGFyYW1ldGVycwogICAgLy8gaW4gb3JkZXIgdG8gY2hhbmdlIHRoZSBib3VuZHMuICBBdCB0aGUgc2FtZSB0aW1lLCBpZiB0aGUgZnVuY3Rpb24gdHlwZQogICAgLy8gd2FzIHVuYWx0ZXJlZCwgd2UgaGF2ZSB0byByZXR1cm4gdGhlIFtub2RlXSBvYmplY3QgKG5vdCBhIGNvcHkhKS4KICAgIC8vIFN1YnN0aXR1dGluZyBhIHR5cGUgZm9yIGEgZnJlc2ggdHlwZSB2YXJpYWJsZSBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGgKICAgIC8vIGEgInJlYWwiIHN1YnN0aXR1dGlvbi4KICAgIC8vCiAgICAvLyBDcmVhdGUgYW4gaW5uZXIgZW52aXJvbm1lbnQgdG8gZ2VuZXJhdGUgZnJlc2ggdHlwZSBwYXJhbWV0ZXJzLiAgVGhlIHVzZQogICAgLy8gY291bnRlciBvbiB0aGUgaW5uZXIgZW52aXJvbm1lbnQgdGVsbHMgaWYgdGhlIGZyZXNoIHR5cGUgcGFyYW1ldGVycyBoYXZlCiAgICAvLyBhbnkgdXNlcywgYnV0IGRvZXMgbm90IHRlbGwgaWYgdGhlIHJlc3VsdGluZyBmdW5jdGlvbiB0eXBlIGlzIGRpc3RpbmN0LgogICAgLy8gT3VyIG93biB1c2UgY291bnRlciB3aWxsIGdldCBpbmNyZW1lbnRlZCBpZiBzb21ldGhpbmcgZnJvbSBvdXIKICAgIC8vIGVudmlyb25tZW50IGhhcyBiZWVuIHVzZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4KICAgIHZhciBpbm5lciA9IG5vZGUudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSA/IHRoaXMgOiBuZXdJbm5lckVudmlyb25tZW50KCk7CiAgICBpbnQgYmVmb3JlID0gdGhpcy51c2VDb3VudGVyOwogICAgLy8gSW52ZXJ0IHRoZSB2YXJpYW5jZSB3aGVuIHRyYW5zbGF0aW5nIHBhcmFtZXRlcnMuCiAgICBpbm5lci5pbnZlcnRWYXJpYW5jZSgpOwogICAgdmFyIHR5cGVQYXJhbWV0ZXJzID0gaW5uZXIuZnJlc2hUeXBlUGFyYW1ldGVycyhub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIHZhciBwb3NpdGlvbmFsUGFyYW1ldGVycyA9IG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMuaXNFbXB0eQogICAgICAgID8gY29uc3QgPERhcnRUeXBlPltdCiAgICAgICAgOiBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLm1hcChpbm5lci52aXNpdCkudG9MaXN0KCk7CiAgICB2YXIgbmFtZWRQYXJhbWV0ZXJzID0gbm9kZS5uYW1lZFBhcmFtZXRlcnMuaXNFbXB0eQogICAgICAgID8gY29uc3QgPE5hbWVkVHlwZT5bXQogICAgICAgIDogbm9kZS5uYW1lZFBhcmFtZXRlcnMubWFwKGlubmVyLnZpc2l0TmFtZWRUeXBlKS50b0xpc3QoKTsKICAgIGlubmVyLmludmVydFZhcmlhbmNlKCk7CiAgICB2YXIgcmV0dXJuVHlwZSA9IGlubmVyLnZpc2l0KG5vZGUucmV0dXJuVHlwZSk7CiAgICBEYXJ0VHlwZSB0eXBlZGVmVHlwZSA9CiAgICAgICAgbm9kZS50eXBlZGVmVHlwZSA9PSBudWxsID8gbnVsbCA6IGlubmVyLnZpc2l0KG5vZGUudHlwZWRlZlR5cGUpOwogICAgaWYgKHRoaXMudXNlQ291bnRlciA9PSBiZWZvcmUpIHJldHVybiBub2RlOwogICAgcmV0dXJuIG5ldyBGdW5jdGlvblR5cGUocG9zaXRpb25hbFBhcmFtZXRlcnMsIHJldHVyblR5cGUsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZFBhcmFtZXRlcnMsCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICB0eXBlZGVmVHlwZTogdHlwZWRlZlR5cGUpOwogIH0KCiAgdm9pZCBidW1wQ291bnRlcnNVbnRpbChfVHlwZVN1YnN0aXR1dG9yIHRhcmdldCkgewogICAgdmFyIG5vZGUgPSB0aGlzOwogICAgd2hpbGUgKG5vZGUgIT0gdGFyZ2V0KSB7CiAgICAgICsrbm9kZS51c2VDb3VudGVyOwogICAgICBub2RlID0gbm9kZS5vdXRlcjsKICAgIH0KICAgICsrdGFyZ2V0LnVzZUNvdW50ZXI7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdWJzdGl0dXRlKFR5cGVQYXJhbWV0ZXIgdmFyaWFibGUpIHsKICAgIHZhciBlbnZpcm9ubWVudCA9IHRoaXM7CiAgICB3aGlsZSAoZW52aXJvbm1lbnQgIT0gbnVsbCkgewogICAgICB2YXIgcmVwbGFjZW1lbnQgPSBlbnZpcm9ubWVudC5sb29rdXAodmFyaWFibGUsIGNvdmFyaWFudENvbnRleHQpOwogICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewogICAgICAgIGJ1bXBDb3VudGVyc1VudGlsKGVudmlyb25tZW50KTsKICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICAgIH0KICAgICAgZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudC5vdXRlcjsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgRGFydFR5cGUgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICByZXR1cm4gZ2V0U3Vic3RpdHV0ZShub2RlLnBhcmFtZXRlcikgPz8gbm9kZTsKICB9Cn0KCmNsYXNzIF9EZWVwVHlwZVN1YnN0aXR1dG9yIGV4dGVuZHMgX0lubmVyVHlwZVN1YnN0aXR1dG9yIHsKICBpbnQgZGVwdGggPSAwOwogIGJvb2wgaXNJbmZpbml0ZSA9IGZhbHNlOwoKICBfRGVlcFR5cGVTdWJzdGl0dXRvcihNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbiwKICAgICAgW19EZWVwVHlwZVN1YnN0aXR1dG9yIG91dGVyXSkKICAgICAgOiBzdXBlcihvdXRlcikgewogICAgdGhpcy5zdWJzdGl0dXRpb24uYWRkQWxsKHN1YnN0aXR1dGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBfRGVlcFR5cGVTdWJzdGl0dXRvciBuZXdJbm5lckVudmlyb25tZW50KCkgewogICAgcmV0dXJuIG5ldyBfRGVlcFR5cGVTdWJzdGl0dXRvcig8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e30sIHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICBEYXJ0VHlwZSByZXBsYWNlbWVudCA9IGdldFN1YnN0aXR1dGUobm9kZS5wYXJhbWV0ZXIpOwogICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHJldHVybiBub2RlOwogICAgaWYgKGlzSW5maW5pdGUpIHJldHVybiByZXBsYWNlbWVudDsKICAgICsrZGVwdGg7CiAgICBpZiAoZGVwdGggPiBzdWJzdGl0dXRpb24ubGVuZ3RoKSB7CiAgICAgIGlzSW5maW5pdGUgPSB0cnVlOwogICAgICAtLWRlcHRoOwogICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICB9IGVsc2UgewogICAgICByZXBsYWNlbWVudCA9IHZpc2l0KHJlcGxhY2VtZW50KTsKICAgICAgLy8gVXBkYXRlIHR5cGUgdG8gdGhlIGZ1bGx5IGZsZXNoZWQtb3V0IHR5cGUuCiAgICAgIHN1YnN0aXR1dGlvbltub2RlLnBhcmFtZXRlcl0gPSByZXBsYWNlbWVudDsKICAgICAgLS1kZXB0aDsKICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OwogICAgfQogIH0KfQoKY2xhc3MgX1R5cGVVbmlmaWNhdGlvbiB7CiAgLy8gQWN5Y2xpYyBpbnZhcmlhbnQ6IFRoZXJlIGFyZSBubyBjeWNsZXMgaW4gdGhlIG1hcCwgdGhhdCBpcywgYWxsIHR5cGVzIGNhbgogIC8vICAgYmUgcmVzb2x2ZWQgdG8gZmluaXRlIHR5cGVzIGJ5IHN1YnN0aXR1dGluZyBhbGwgY29udGFpbmVkIHR5cGUgdmFyaWFibGVzLgogIC8vCiAgLy8gVGhlIGFjeWNsaWMgaW52YXJpYW50IGhvbGRzIGV2ZXJ5d2hlcmUgZXhjZXB0IGR1cmluZyBjeWNsZSBkZXRlY3Rpb24uCiAgLy8KICAvLyBJdCBpcyBub3QgY2hlY2tlZCB0aGF0IHRoZSBzdWJzdGl0dXRpb24gc2F0aXNmaWVzIHRoZSBib3VuZCBvbiB0aGUgdHlwZQogIC8vIHBhcmFtZXRlci4KICBmaW5hbCBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbiA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKCiAgLy8vIFZhcmlhYmxlcyB0aGF0IG1heSBiZSBhc3NpZ25lZCBmcmVlbHkgaW4gb3JkZXIgdG8gb2J0YWluIHVuaWZpY2F0aW9uLgogIC8vLwogIC8vLyBUaGVzZSBhcmUgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIGV4aXN0ZW50aWFsbHkgcXVhbnRpZmllZCB2YXJpYWJsZXMuCiAgZmluYWwgU2V0PFR5cGVQYXJhbWV0ZXI+IHF1YW50aWZpZWRWYXJpYWJsZXM7CgogIC8vLyBWYXJpYWJsZXMgdGhhdCBhcmUgYm91bmQgYnkgYSBmdW5jdGlvbiB0eXBlIGluc2lkZSBvbmUgb2YgdGhlIHR5cGVzLgogIC8vLyBUaGVzZSBtYXkgbm90IG9jY3VyIGluIGEgc3Vic3RpdHV0aW9uLCBiZWNhdXNlIHRoZXNlIHZhcmlhYmxlcyBhcmUgbm90IGluCiAgLy8vIHNjb3BlIGF0IHRoZSBleGlzdGVudGlhbGx5IHF1YW50aWZpZWQgdmFyaWFibGVzLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSwgc3VwcG9zZSB3ZSBhcmUgdHJ5aW5nIHRvIHNhdGlzZnkgdGhlIGVxdWF0aW9uOgogIC8vLwogIC8vLyAgICAg4oiDUy4gPEU+KEUsIFMpID0+IEUgID0gIDxFPihFLCBFKSA9PiBFCiAgLy8vCiAgLy8vIFRoYXQgaXMsIHdlIG11c3QgY2hvb3NlIGBTYCBzdWNoIHRoYXQgdGhlIGdlbmVyaWMgZnVuY3Rpb24gdHlwZQogIC8vLyBgPEU+KEUsIFMpID0+IEVgIGJlY29tZXMgYDxFPihFLCBFKSA9PiBFYC4gIENob29zaW5nIGBTID0gRWAgaXMgbm90IGEKICAvLy8gdmFsaWQgc29sdXRpb24sIGJlY2F1c2UgYEVgIGlzIG5vdCBpbiBzY29wZSB3aGVyZSBgU2AgaXMgcXVhbnRpZmllZC4KICAvLy8gVGhlIHR3byBmdW5jdGlvbiB0eXBlcyBjYW5ub3QgYmUgdW5pZmllZC4KICBmaW5hbCBTZXQ8VHlwZVBhcmFtZXRlcj4gX3VuaXZlcnNhbGx5UXVhbnRpZmllZFZhcmlhYmxlcyA9CiAgICAgIG5ldyBTZXQ8VHlwZVBhcmFtZXRlcj4oKTsKCiAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKCiAgX1R5cGVVbmlmaWNhdGlvbihEYXJ0VHlwZSB0eXBlMSwgRGFydFR5cGUgdHlwZTIsIHRoaXMucXVhbnRpZmllZFZhcmlhYmxlcykgewogICAgX3VuaWZ5KHR5cGUxLCB0eXBlMik7CiAgICBpZiAoc3VjY2VzcyAmJiBzdWJzdGl0dXRpb24ubGVuZ3RoID49IDIpIHsKICAgICAgZm9yICh2YXIga2V5IGluIHN1YnN0aXR1dGlvbi5rZXlzKSB7CiAgICAgICAgc3Vic3RpdHV0aW9uW2tleV0gPSBzdWJzdGl0dXRlRGVlcChzdWJzdGl0dXRpb25ba2V5XSwgc3Vic3RpdHV0aW9uKTsKICAgICAgfQogICAgfQogIH0KCiAgRGFydFR5cGUgX3N1YnN0aXR1dGVIZWFkKFR5cGVQYXJhbWV0ZXJUeXBlIHR5cGUpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN1YnN0aXR1dGlvbi5sZW5ndGg7ICsraSkgewogICAgICBEYXJ0VHlwZSBuZXh0VHlwZSA9IHN1YnN0aXR1dGlvblt0eXBlLnBhcmFtZXRlcl07CiAgICAgIGlmIChuZXh0VHlwZSA9PSBudWxsKSByZXR1cm4gdHlwZTsKICAgICAgaWYgKG5leHRUeXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgdHlwZSA9IG5leHRUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXh0VHlwZTsKICAgICAgfQogICAgfQogICAgLy8gVGhlIGN5Y2xlIHNob3VsZCBoYXZlIGJlZW4gZm91bmQgYnkgX3RyeVN1YnN0aXR1dGlvbiB3aGVuIHRoZSBjeWNsZQogICAgLy8gd2FzIGNyZWF0ZWQuCiAgICB0aHJvdyAnVW5leHBlY3RlZCBjeWNsZSBmb3VuZCBkdXJpbmcgdW5pZmljYXRpb24nOwogIH0KCiAgYm9vbCBfdW5pZnkoRGFydFR5cGUgdHlwZTEsIERhcnRUeXBlIHR5cGUyKSB7CiAgICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBmYWxzZTsKICAgIHR5cGUxID0gdHlwZTEgaXMgVHlwZVBhcmFtZXRlclR5cGUgPyBfc3Vic3RpdHV0ZUhlYWQodHlwZTEpIDogdHlwZTE7CiAgICB0eXBlMiA9IHR5cGUyIGlzIFR5cGVQYXJhbWV0ZXJUeXBlID8gX3N1YnN0aXR1dGVIZWFkKHR5cGUyKSA6IHR5cGUyOwogICAgaWYgKHR5cGUxIGlzIER5bmFtaWNUeXBlICYmIHR5cGUyIGlzIER5bmFtaWNUeXBlKSByZXR1cm4gdHJ1ZTsKICAgIGlmICh0eXBlMSBpcyBWb2lkVHlwZSAmJiB0eXBlMiBpcyBWb2lkVHlwZSkgcmV0dXJuIHRydWU7CiAgICBpZiAodHlwZTEgaXMgSW52YWxpZFR5cGUgJiYgdHlwZTIgaXMgSW52YWxpZFR5cGUpIHJldHVybiB0cnVlOwogICAgaWYgKHR5cGUxIGlzIEJvdHRvbVR5cGUgJiYgdHlwZTIgaXMgQm90dG9tVHlwZSkgcmV0dXJuIHRydWU7CiAgICBpZiAodHlwZTEgaXMgSW50ZXJmYWNlVHlwZSAmJiB0eXBlMiBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIGlmICh0eXBlMS5jbGFzc05vZGUgIT0gdHlwZTIuY2xhc3NOb2RlKSByZXR1cm4gX2ZhaWwoKTsKICAgICAgYXNzZXJ0KHR5cGUxLnR5cGVBcmd1bWVudHMubGVuZ3RoID09IHR5cGUyLnR5cGVBcmd1bWVudHMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlMS50eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKCFfdW5pZnkodHlwZTEudHlwZUFyZ3VtZW50c1tpXSwgdHlwZTIudHlwZUFyZ3VtZW50c1tpXSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAodHlwZTEgaXMgRnVuY3Rpb25UeXBlICYmIHR5cGUyIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICBpZiAodHlwZTEudHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9IHR5cGUyLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCB8fAogICAgICAgICAgdHlwZTEucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICE9CiAgICAgICAgICAgICAgdHlwZTIucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoIHx8CiAgICAgICAgICB0eXBlMS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoICE9IHR5cGUyLm5hbWVkUGFyYW1ldGVycy5sZW5ndGggfHwKICAgICAgICAgIHR5cGUxLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgIT0gdHlwZTIucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgICAgIHJldHVybiBfZmFpbCgpOwogICAgICB9CiAgICAgIC8vIFdoZW4gdW5pZnlpbmcgdHdvIGdlbmVyaWMgZnVuY3Rpb25zLCB0cmFuc2Zvcm0gdGhlIGVxdWF0aW9uIGxpa2UgdGhpczoKICAgICAgLy8KICAgICAgLy8gICAg4oiDUy4gPEU+KGZuMSkgPSA8VD4oZm4yKQogICAgICAvLyAgICAgID09PgogICAgICAvLyAgICDiiINTLiDiiIBHLiBmbjFbRy9FXSA9IGZuMltHL1RdCiAgICAgIC8vCiAgICAgIC8vIFRoYXQgaXMsIGFzc3VtZSBzb21lIGZpeGVkIGlkZW50aWNhbCBjaG9pY2Ugb2YgdHlwZSBwYXJhbWV0ZXJzIGZvciBib3RoCiAgICAgIC8vIGZ1bmN0aW9ucyBhbmQgdHJ5IHRvIHVuaWZ5IHRoZSBpbnN0YW50aWF0ZWQgZnVuY3Rpb24gdHlwZXMuCiAgICAgIGFzc2VydCghdHlwZTEudHlwZVBhcmFtZXRlcnMuYW55KHF1YW50aWZpZWRWYXJpYWJsZXMuY29udGFpbnMpKTsKICAgICAgYXNzZXJ0KCF0eXBlMi50eXBlUGFyYW1ldGVycy5hbnkocXVhbnRpZmllZFZhcmlhYmxlcy5jb250YWlucykpOwogICAgICB2YXIgbGVmdEluc3RhbmNlID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgICB2YXIgcmlnaHRJbnN0YW5jZSA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlMS50eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBpbnN0YW50aWF0b3IgPSBuZXcgVHlwZVBhcmFtZXRlcih0eXBlMS50eXBlUGFyYW1ldGVyc1tpXS5uYW1lKTsKICAgICAgICB2YXIgaW5zdGFudGlhdG9yVHlwZSA9IG5ldyBUeXBlUGFyYW1ldGVyVHlwZShpbnN0YW50aWF0b3IpOwogICAgICAgIGxlZnRJbnN0YW5jZVt0eXBlMS50eXBlUGFyYW1ldGVyc1tpXV0gPSBpbnN0YW50aWF0b3JUeXBlOwogICAgICAgIHJpZ2h0SW5zdGFuY2VbdHlwZTIudHlwZVBhcmFtZXRlcnNbaV1dID0gaW5zdGFudGlhdG9yVHlwZTsKICAgICAgICBfdW5pdmVyc2FsbHlRdWFudGlmaWVkVmFyaWFibGVzLmFkZChpbnN0YW50aWF0b3IpOwogICAgICB9CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZTEudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgbGVmdCA9IHN1YnN0aXR1dGUodHlwZTEudHlwZVBhcmFtZXRlcnNbaV0uYm91bmQsIGxlZnRJbnN0YW5jZSk7CiAgICAgICAgdmFyIHJpZ2h0ID0gc3Vic3RpdHV0ZSh0eXBlMi50eXBlUGFyYW1ldGVyc1tpXS5ib3VuZCwgcmlnaHRJbnN0YW5jZSk7CiAgICAgICAgaWYgKCFfdW5pZnkobGVmdCwgcmlnaHQpKSByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlMS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBsZWZ0ID0gc3Vic3RpdHV0ZSh0eXBlMS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSwgbGVmdEluc3RhbmNlKTsKICAgICAgICB2YXIgcmlnaHQgPSBzdWJzdGl0dXRlKHR5cGUyLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldLCByaWdodEluc3RhbmNlKTsKICAgICAgICBpZiAoIV91bmlmeShsZWZ0LCByaWdodCkpIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUxLm5hbWVkUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIGlmICh0eXBlMS5uYW1lZFBhcmFtZXRlcnNbaV0ubmFtZSAhPSB0eXBlMi5uYW1lZFBhcmFtZXRlcnNbaV0ubmFtZSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICB2YXIgbGVmdCA9IHN1YnN0aXR1dGUodHlwZTEubmFtZWRQYXJhbWV0ZXJzW2ldLnR5cGUsIGxlZnRJbnN0YW5jZSk7CiAgICAgICAgdmFyIHJpZ2h0ID0gc3Vic3RpdHV0ZSh0eXBlMi5uYW1lZFBhcmFtZXRlcnNbaV0udHlwZSwgcmlnaHRJbnN0YW5jZSk7CiAgICAgICAgaWYgKCFfdW5pZnkobGVmdCwgcmlnaHQpKSByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIGxlZnRSZXR1cm4gPSBzdWJzdGl0dXRlKHR5cGUxLnJldHVyblR5cGUsIGxlZnRJbnN0YW5jZSk7CiAgICAgIHZhciByaWdodFJldHVybiA9IHN1YnN0aXR1dGUodHlwZTIucmV0dXJuVHlwZSwgcmlnaHRJbnN0YW5jZSk7CiAgICAgIGlmICghX3VuaWZ5KGxlZnRSZXR1cm4sIHJpZ2h0UmV0dXJuKSkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICh0eXBlMSBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJgogICAgICAgIHR5cGUyIGlzIFR5cGVQYXJhbWV0ZXJUeXBlICYmCiAgICAgICAgdHlwZTEucGFyYW1ldGVyID09IHR5cGUyLnBhcmFtZXRlcikgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICh0eXBlMSBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJgogICAgICAgIHF1YW50aWZpZWRWYXJpYWJsZXMuY29udGFpbnModHlwZTEucGFyYW1ldGVyKSkgewogICAgICByZXR1cm4gX3RyeVN1YnN0aXR1dGlvbih0eXBlMS5wYXJhbWV0ZXIsIHR5cGUyKTsKICAgIH0KICAgIGlmICh0eXBlMiBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJgogICAgICAgIHF1YW50aWZpZWRWYXJpYWJsZXMuY29udGFpbnModHlwZTIucGFyYW1ldGVyKSkgewogICAgICByZXR1cm4gX3RyeVN1YnN0aXR1dGlvbih0eXBlMi5wYXJhbWV0ZXIsIHR5cGUxKTsKICAgIH0KICAgIHJldHVybiBfZmFpbCgpOwogIH0KCiAgYm9vbCBfdHJ5U3Vic3RpdHV0aW9uKFR5cGVQYXJhbWV0ZXIgdmFyaWFibGUsIERhcnRUeXBlIHR5cGUpIHsKICAgIGlmIChjb250YWluc1R5cGVWYXJpYWJsZSh0eXBlLCBfdW5pdmVyc2FsbHlRdWFudGlmaWVkVmFyaWFibGVzKSkgewogICAgICByZXR1cm4gX2ZhaWwoKTsKICAgIH0KICAgIC8vIFNldCB0aGUgcGxhaW4gc3Vic3RpdHV0aW9uIGZpcnN0IGFuZCB0aGVuIGdlbmVyYXRlIHRoZSBkZWVwCiAgICAvLyBzdWJzdGl0dXRpb24gdG8gZGV0ZWN0IGN5Y2xlcy4KICAgIHN1YnN0aXR1dGlvblt2YXJpYWJsZV0gPSB0eXBlOwogICAgRGFydFR5cGUgZGVlcFN1YnN0aXR1dGUgPSBzdWJzdGl0dXRlRGVlcCh0eXBlLCBzdWJzdGl0dXRpb24pOwogICAgaWYgKGRlZXBTdWJzdGl0dXRlID09IG51bGwpIHJldHVybiBfZmFpbCgpOwogICAgc3Vic3RpdHV0aW9uW3ZhcmlhYmxlXSA9IGRlZXBTdWJzdGl0dXRlOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIF9mYWlsKCkgewogICAgcmV0dXJuIHN1Y2Nlc3MgPSBmYWxzZTsKICB9Cn0KCmNsYXNzIF9PY2N1cnJlbmNlVmlzaXRvciBleHRlbmRzIERhcnRUeXBlVmlzaXRvcjxib29sPiB7CiAgZmluYWwgU2V0PFR5cGVQYXJhbWV0ZXI+IHZhcmlhYmxlczsKCiAgX09jY3VycmVuY2VWaXNpdG9yKHRoaXMudmFyaWFibGVzKTsKCiAgYm9vbCB2aXNpdChEYXJ0VHlwZSBub2RlKSA9PiBub2RlLmFjY2VwdCh0aGlzKTsKCiAgYm9vbCB2aXNpdE5hbWVkVHlwZShOYW1lZFR5cGUgbm9kZSkgewogICAgcmV0dXJuIHZpc2l0KG5vZGUudHlwZSk7CiAgfQoKICBib29sIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpID0+IGZhbHNlOwogIGJvb2wgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSA9PiBmYWxzZTsKCiAgYm9vbCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICByZXR1cm4gbm9kZS50eXBlQXJndW1lbnRzLmFueSh2aXNpdCk7CiAgfQoKICBib29sIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGUudHlwZUFyZ3VtZW50cy5hbnkodmlzaXQpOwogIH0KCiAgYm9vbCB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGUudHlwZVBhcmFtZXRlcnMuYW55KGhhbmRsZVR5cGVQYXJhbWV0ZXIpIHx8CiAgICAgICAgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5hbnkodmlzaXQpIHx8CiAgICAgICAgbm9kZS5uYW1lZFBhcmFtZXRlcnMuYW55KHZpc2l0TmFtZWRUeXBlKSB8fAogICAgICAgIHZpc2l0KG5vZGUucmV0dXJuVHlwZSk7CiAgfQoKICBib29sIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgcmV0dXJuIHZhcmlhYmxlcyA9PSBudWxsIHx8IHZhcmlhYmxlcy5jb250YWlucyhub2RlLnBhcmFtZXRlcik7CiAgfQoKICBib29sIGhhbmRsZVR5cGVQYXJhbWV0ZXIoVHlwZVBhcmFtZXRlciBub2RlKSB7CiAgICBhc3NlcnQoIXZhcmlhYmxlcy5jb250YWlucyhub2RlKSk7CiAgICBpZiAobm9kZS5ib3VuZC5hY2NlcHQodGhpcykpIHJldHVybiB0cnVlOwogICAgaWYgKG5vZGUuZGVmYXVsdFR5cGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIG5vZGUuZGVmYXVsdFR5cGUuYWNjZXB0KHRoaXMpOwogIH0KfQqC5gBOTjwdARMBUCsESDwES085UClCAgFPNQQ0QiQqOD4CAUhNLC8tBC89BBECAU9QDgRQHARNRARMTxsETyAZQCk8KDECAVEETThJJzgCAVBJGQRIPwQoBEsELkpLPilOSTgCAUsxBExRUTpPFyk0SAQ0SUs5EAROAgEcMSMBRAFLOiNLKzsTSwFLAS83AS4zBAIBTC9MAR4YAUABQkI4KwQBTzMEAUhLHwZLTCgGTiwvUEsvBAFLLjtMQ0cEAUYpPkdDPQQBSCk6R0M/BAFJDyE+RkYvPxRMBAFLLjVKMQQBTkwgOUotMy4GMz0GLwQBUB8GUFFDTCZJPDw1BAFEAUhBBAEyQgQCAS9HAR0BRS0EAQxPAQw5AQwtAgEuLCwBLAFFPQQBDDsCATEjAUkZGAYEAT4+BAE5LgQCATYWASkBRSZEBhEEAgEzJAEyAUU5NQQCATMBMxsmATMBRR80SwQCATdRAUABPiQEATkuNyUkMwYSBAIBRCAgASFGBAE9AUwWBk5NPBYBMCwEARoqBAEtMR1AKzkEAS0dISsrBAE2ATc3MTUBNDEdQCs9BAEwMR1AKz0EAUw8OAQBOAEyTk5JUR4HT1BPRjZMIjgcSUEdPzceQxwzG0kwPiooPSMEATQVHRkZBhkEATMcIkghKBwIJwYRBAE8MgQCATsRGwFCJBcsBAEML0gEAQw8OiooDScZDxoNKDQyDxoGBAIBGU9RBUsFTRBRAUwGTTABS1A3BkIGMAZGTEswPSABFwFPGi8rTQgGBAE1NTgpKxkPGQgGSxQ3BAEwIElJQz1DQTw+SD1HGAoIEwY6SC8zSkoYCFAJJBIoCVFFR0c2Nz5MREJDOwg+TE4wCERMTjAIP04YCkxOMAhDRToTBiYmLhMGJjk3BiY5NwYUBAFBRxYGQyYjQjAtEQQBERwEAgE5JgEmATIBKB0EATQ0LgEwKgQBLCoEAS47MDQgBAE4RAQBMScuMCoEAgEgcGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQtc2Rrcm9vdDovcGtnL2tlcm5lbC9saWIvdHlwZV9lbnZpcm9ubWVudC5kYXJ0sNEvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgpsaWJyYXJ5IGtlcm5lbC50eXBlX2Vudmlyb25tZW50OwoKaW1wb3J0ICdhc3QuZGFydCc7CmltcG9ydCAnY2xhc3NfaGllcmFyY2h5LmRhcnQnOwppbXBvcnQgJ2NvcmVfdHlwZXMuZGFydCc7CmltcG9ydCAndHlwZV9hbGdlYnJhLmRhcnQnOwoKaW1wb3J0ICdzcmMvaGllcmFyY2h5X2Jhc2VkX3R5cGVfZW52aXJvbm1lbnQuZGFydCcKICAgIHNob3cgSGllcmFyY2h5QmFzZWRUeXBlRW52aXJvbm1lbnQ7Cgp0eXBlZGVmIHZvaWQgRXJyb3JIYW5kbGVyKFRyZWVOb2RlIG5vZGUsIFN0cmluZyBtZXNzYWdlKTsKCmFic3RyYWN0IGNsYXNzIFR5cGVFbnZpcm9ubWVudCBleHRlbmRzIFN1YnR5cGVUZXN0ZXIgewogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CgogIEludGVyZmFjZVR5cGUgdGhpc1R5cGU7CgogIERhcnRUeXBlIHJldHVyblR5cGU7CiAgRGFydFR5cGUgeWllbGRUeXBlOwogIEFzeW5jTWFya2VyIGN1cnJlbnRBc3luY01hcmtlciA9IEFzeW5jTWFya2VyLlN5bmM7CgogIC8vLyBBbiBlcnJvciBoYW5kbGVyIGZvciB1c2UgaW4gZGVidWdnaW5nLCBvciBgbnVsbGAgaWYgdHlwZSBlcnJvcnMgc2hvdWxkIG5vdAogIC8vLyBiZSB0b2xlcmF0ZWQuICBTZWUgW3R5cGVFcnJvcl0uCiAgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcjsKCiAgVHlwZUVudmlyb25tZW50LmZyb21TdWJjbGFzcyh0aGlzLmNvcmVUeXBlcyk7CgogIGZhY3RvcnkgVHlwZUVudmlyb25tZW50KENvcmVUeXBlcyBjb3JlVHlwZXMsIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSkgewogICAgcmV0dXJuIG5ldyBIaWVyYXJjaHlCYXNlZFR5cGVFbnZpcm9ubWVudChjb3JlVHlwZXMsIGhpZXJhcmNoeSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBvYmplY3RUeXBlID0+IGNvcmVUeXBlcy5vYmplY3RDbGFzcy5yYXdUeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IG51bGxUeXBlID0+IGNvcmVUeXBlcy5udWxsQ2xhc3MucmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCBib29sVHlwZSA9PiBjb3JlVHlwZXMuYm9vbENsYXNzLnJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgaW50VHlwZSA9PiBjb3JlVHlwZXMuaW50Q2xhc3MucmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCBudW1UeXBlID0+IGNvcmVUeXBlcy5udW1DbGFzcy5yYXdUeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IGRvdWJsZVR5cGUgPT4gY29yZVR5cGVzLmRvdWJsZUNsYXNzLnJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgc3RyaW5nVHlwZSA9PiBjb3JlVHlwZXMuc3RyaW5nQ2xhc3MucmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCBzeW1ib2xUeXBlID0+IGNvcmVUeXBlcy5zeW1ib2xDbGFzcy5yYXdUeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IHR5cGVUeXBlID0+IGNvcmVUeXBlcy50eXBlQ2xhc3MucmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCByYXdGdW5jdGlvblR5cGUgPT4gY29yZVR5cGVzLmZ1bmN0aW9uQ2xhc3MucmF3VHlwZTsKCiAgQ2xhc3MgZ2V0IGludENsYXNzID0+IGNvcmVUeXBlcy5pbnRDbGFzczsKICBDbGFzcyBnZXQgbnVtQ2xhc3MgPT4gY29yZVR5cGVzLm51bUNsYXNzOwogIENsYXNzIGdldCBmdXR1cmVPckNsYXNzID0+IGNvcmVUeXBlcy5mdXR1cmVPckNsYXNzOwoKICBJbnRlcmZhY2VUeXBlIGxpdGVyYWxMaXN0VHlwZShEYXJ0VHlwZSBlbGVtZW50VHlwZSkgewogICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKGNvcmVUeXBlcy5saXN0Q2xhc3MsIDxEYXJ0VHlwZT5bZWxlbWVudFR5cGVdKTsKICB9CgogIEludGVyZmFjZVR5cGUgbGl0ZXJhbFNldFR5cGUoRGFydFR5cGUgZWxlbWVudFR5cGUpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShjb3JlVHlwZXMuc2V0Q2xhc3MsIDxEYXJ0VHlwZT5bZWxlbWVudFR5cGVdKTsKICB9CgogIEludGVyZmFjZVR5cGUgbGl0ZXJhbE1hcFR5cGUoRGFydFR5cGUga2V5LCBEYXJ0VHlwZSB2YWx1ZSkgewogICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKGNvcmVUeXBlcy5tYXBDbGFzcywgPERhcnRUeXBlPltrZXksIHZhbHVlXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGl0ZXJhYmxlVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MsIDxEYXJ0VHlwZT5bdHlwZV0pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBzdHJlYW1UeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShjb3JlVHlwZXMuc3RyZWFtQ2xhc3MsIDxEYXJ0VHlwZT5bdHlwZV0pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBmdXR1cmVUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShjb3JlVHlwZXMuZnV0dXJlQ2xhc3MsIDxEYXJ0VHlwZT5bdHlwZV0pOwogIH0KCiAgLy8vIFJlbW92ZXMgYSBsZXZlbCBvZiBgRnV0dXJlPD5gIHR5cGVzIHdyYXBwaW5nIGEgdHlwZS4KICAvLy8KICAvLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbiBgZmxhdHRlbmAgZnJvbSB0aGUgc3BlYywgd2hpY2ggdW53cmFwcyBhCiAgLy8vIGxheWVyIG9mIEZ1dHVyZSBvciBGdXR1cmVPciBmcm9tIGEgdHlwZS4KICBEYXJ0VHlwZSB1bmZ1dHVyZVR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBpZiAodHlwZS5jbGFzc05vZGUgPT0gY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MgfHwKICAgICAgICAgIHR5cGUuY2xhc3NOb2RlID09IGNvcmVUeXBlcy5mdXR1cmVDbGFzcykgewogICAgICAgIHJldHVybiB0eXBlLnR5cGVBcmd1bWVudHNbMF07CiAgICAgIH0KICAgICAgLy8gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgdG8gaW1wbGVtZW50LCBleHRlbmQsIG9yIG1peGluIEZ1dHVyZU9yIHNvCiAgICAgIC8vIHdlIGFyZW4ndCBjb25jZXJuZWQgd2l0aCBpdC4gIElmIGEgY2xhc3MgaW1wbGVtZW50cyBtdWx0aXBsZQogICAgICAvLyBpbnN0YW50aWF0aW9ucyBvZiBGdXR1cmUsIGdldFR5cGVBc0luc3RhbmNlT2YgaXMgcmVzcG9uc2libGUgZm9yCiAgICAgIC8vIHBpY2tpbmcgdGhlIGxlYXN0IG9uZSBpbiB0aGUgc2Vuc2UgcmVxdWlyZWQgYnkgdGhlIHNwZWMuCiAgICAgIEludGVyZmFjZVR5cGUgZnV0dXJlID0gZ2V0VHlwZUFzSW5zdGFuY2VPZih0eXBlLCBjb3JlVHlwZXMuZnV0dXJlQ2xhc3MpOwogICAgICBpZiAoZnV0dXJlICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gZnV0dXJlLnR5cGVBcmd1bWVudHNbMF07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0eXBlOwogIH0KCiAgLy8vIENhbGxlZCBpZiB0aGUgY29tcHV0YXRpb24gb2YgYSBzdGF0aWMgdHlwZSBmYWlsZWQgZHVlIHRvIGEgdHlwZSBlcnJvci4KICAvLy8KICAvLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGluIHByb2R1Y3Rpb24uICBUaGUgZnJvbnRlbmQgc2hvdWxkIHJlcG9ydCB0eXBlCiAgLy8vIGVycm9ycywgYW5kIGVpdGhlciByZWNvdmVyIGZyb20gdGhlIGVycm9yIGR1cmluZyB0cmFuc2xhdGlvbiBvciBhYm9ydAogIC8vLyBjb21waWxhdGlvbiBpZiB1bmFibGUgdG8gcmVjb3Zlci4KICAvLy8KICAvLy8gQnkgZGVmYXVsdCwgdGhpcyB0aHJvd3MgYW4gZXhjZXB0aW9uLCBzaW5jZSBwcm9ncmFtcyBpbiBrZXJuZWwgYXJlIGFzc3VtZWQKICAvLy8gdG8gYmUgY29ycmVjdGx5IHR5cGVkLgogIC8vLwogIC8vLyBBbiBbZXJyb3JIYW5kbGVyXSBtYXkgYmUgcHJvdmlkZWQgaW4gb3JkZXIgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQKICAvLy8gYmVoYXZpb3IgYW5kIHRvbGVyYXRlIHRoZSBwcmVzZW5jZSBvZiB0eXBlIGVycm9ycy4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IKICAvLy8gZGVidWdnaW5nIElSIHByb2R1Y2VycyB3aGljaCBhcmUgcmVxdWlyZWQgdG8gcHJvZHVjZSBhIHN0cm9uZ2x5IHR5cGVkIElSLgogIHZvaWQgdHlwZUVycm9yKFRyZWVOb2RlIG5vZGUsIFN0cmluZyBtZXNzYWdlKSB7CiAgICBpZiAoZXJyb3JIYW5kbGVyICE9IG51bGwpIHsKICAgICAgZXJyb3JIYW5kbGVyKG5vZGUsIG1lc3NhZ2UpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJyRtZXNzYWdlIGluICRub2RlJzsKICAgIH0KICB9CgogIC8vLyBUcnVlIGlmIFttZW1iZXJdIGlzIGEgYmluYXJ5IG9wZXJhdG9yIHRoYXQgcmV0dXJucyBhbiBgaW50YCBpZiBib3RoCiAgLy8vIG9wZXJhbmRzIGFyZSBgaW50YCwgYW5kIG90aGVyd2lzZSByZXR1cm5zIGBkb3VibGVgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY2FzZSBvZiB0eXBlLWJhc2VkIG92ZXJsb2FkaW5nLCB3aGljaCBpbiBEYXJ0IGlzIG9ubHkgc3VwcG9ydGVkCiAgLy8vIGJ5IGdpdmluZyBzcGVjaWFsIHRyZWF0bWVudCB0byBjZXJ0YWluIGFyaXRobWV0aWMgb3BlcmF0b3JzLgogIGJvb2wgaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yKFByb2NlZHVyZSBtZW1iZXIpIHsKICAgIENsYXNzIGNsYXNzXyA9IG1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgIGlmIChjbGFzc18gPT0gY29yZVR5cGVzLmludENsYXNzIHx8IGNsYXNzXyA9PSBjb3JlVHlwZXMubnVtQ2xhc3MpIHsKICAgICAgU3RyaW5nIG5hbWUgPSBtZW1iZXIubmFtZS5uYW1lOwogICAgICByZXR1cm4gbmFtZSA9PSAnKycgfHwKICAgICAgICAgIG5hbWUgPT0gJy0nIHx8CiAgICAgICAgICBuYW1lID09ICcqJyB8fAogICAgICAgICAgbmFtZSA9PSAncmVtYWluZGVyJyB8fAogICAgICAgICAgbmFtZSA9PSAnJSc7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgc3RhdGljIHJldHVybiB0eXBlIG9mIGFuIG92ZXJsb2FkZWQgYXJpdGhtZXRpYyBvcGVyYXRvcgogIC8vLyAoc2VlIFtpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3JdKSBnaXZlbiB0aGUgc3RhdGljIHR5cGUgb2YgdGhlCiAgLy8vIG9wZXJhbmRzLgogIC8vLwogIC8vLyBJZiBib3RoIHR5cGVzIGFyZSBgaW50YCwgdGhlIHJldHVybmVkIHR5cGUgaXMgYGludGAuCiAgLy8vIElmIGVpdGhlciB0eXBlIGlzIGBkb3VibGVgLCB0aGUgcmV0dXJuZWQgdHlwZSBpcyBgZG91YmxlYC4KICAvLy8gSWYgYm90aCB0eXBlcyByZWZlciB0byB0aGUgc2FtZSB0eXBlIHZhcmlhYmxlICh0eXBpY2FsbHkgd2l0aCBgbnVtYCBhcwogIC8vLyB0aGUgdXBwZXIgYm91bmQpLCB0aGVuIHRoYXQgdHlwZSB2YXJpYWJsZSBpcyByZXR1cm5lZC4KICAvLy8gT3RoZXJ3aXNlIGBudW1gIGlzIHJldHVybmVkLgogIERhcnRUeXBlIGdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljKERhcnRUeXBlIHR5cGUxLCBEYXJ0VHlwZSB0eXBlMikgewogICAgaWYgKHR5cGUxID09IHR5cGUyKSByZXR1cm4gdHlwZTE7CiAgICBpZiAodHlwZTEgPT0gZG91YmxlVHlwZSB8fCB0eXBlMiA9PSBkb3VibGVUeXBlKSByZXR1cm4gZG91YmxlVHlwZTsKICAgIHJldHVybiBudW1UeXBlOwogIH0KfQoKLy8vIFRoZSBwYXJ0IG9mIFtUeXBlRW52aXJvbm1lbnRdIHRoYXQgZGVhbHMgd2l0aCBzdWJ0eXBlIHRlc3RzLgovLy8KLy8vIFRoaXMgbGl2ZXMgaW4gYSBzZXBhcmF0ZSBjbGFzcyBzbyBpdCBjYW4gYmUgdGVzdGVkIGluZGVwZW5kZW50bHkgb2YgdGhlIFNESy4KYWJzdHJhY3QgY2xhc3MgU3VidHlwZVRlc3RlciB7CiAgSW50ZXJmYWNlVHlwZSBnZXQgb2JqZWN0VHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCBudWxsVHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCByYXdGdW5jdGlvblR5cGU7CiAgQ2xhc3MgZ2V0IGZ1dHVyZU9yQ2xhc3M7CiAgSW50ZXJmYWNlVHlwZSBmdXR1cmVUeXBlKERhcnRUeXBlIHR5cGUpOwoKICBzdGF0aWMgTGlzdDxPYmplY3Q+IHR5cGVDaGVja3M7CgogIEludGVyZmFjZVR5cGUgZ2V0VHlwZUFzSW5zdGFuY2VPZihJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MpOwoKICAvLy8gRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhdCB0aGUgdG9wIG9mIHRoZSB0eXBlIGhpZXJhcmNoeS4gIE1heSBiZQogIC8vLyBvdmVycmlkZGVuIGluIHN1YmNsYXNzZXMuCiAgYm9vbCBpc1RvcChEYXJ0VHlwZSB0eXBlKSA9PgogICAgICB0eXBlIGlzIER5bmFtaWNUeXBlIHx8IHR5cGUgaXMgVm9pZFR5cGUgfHwgdHlwZSA9PSBvYmplY3RUeXBlOwoKICAvLy8gQ2FuIGJlIHVzZSB0byBjb2xsZWN0IHR5cGUgY2hlY2tzLiBUbyB1c2U6CiAgLy8vIDEuIFJlbmFtZSBgaXNTdWJ0eXBlT2ZgIHRvIGBfaXNTdWJ0eXBlT2ZgLgogIC8vLyAyLiBSZW5hbWUgYF9jb2xsZWN0X2lzU3VidHlwZU9mYCB0byBgaXNTdWJ0eXBlT2ZgLgogIC8vLyAzLiBDb21tZW50IG91dCB0aGUgY2FsbCB0byBgX2lzU3VidHlwZU9mYCBiZWxvdy4KICAvLyBpZ25vcmU6dW51c2VkX2VsZW1lbnQKICBib29sIF9jb2xsZWN0X2lzU3VidHlwZU9mKERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSkgewogICAgYm9vbCByZXN1bHQgPSB0cnVlOwogICAgLy8gcmVzdWx0ID0gX2lzU3VidHlwZU9mKHN1YnR5cGUsIHN1cGVydHlwZSk7CiAgICB0eXBlQ2hlY2tzID8/PSA8T2JqZWN0PltdOwogICAgdHlwZUNoZWNrcy5hZGQoW3N1YnR5cGUsIHN1cGVydHlwZSwgcmVzdWx0XSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBbc3VidHlwZV0gaXMgYSBzdWJ0eXBlIG9mIFtzdXBlcnR5cGVdLgogIGJvb2wgaXNTdWJ0eXBlT2YoRGFydFR5cGUgc3VidHlwZSwgRGFydFR5cGUgc3VwZXJ0eXBlKSB7CiAgICBzdWJ0eXBlID0gc3VidHlwZS51bmFsaWFzOwogICAgc3VwZXJ0eXBlID0gc3VwZXJ0eXBlLnVuYWxpYXM7CiAgICBpZiAoaWRlbnRpY2FsKHN1YnR5cGUsIHN1cGVydHlwZSkpIHJldHVybiB0cnVlOwogICAgaWYgKHN1YnR5cGUgaXMgQm90dG9tVHlwZSkgcmV0dXJuIHRydWU7CiAgICBpZiAoc3VidHlwZSA9PSBudWxsVHlwZSkgewogICAgICAvLyBTZWUgcnVsZSA0IG9mIHRoZSBzdWJ0eXBlIHJ1bGVzIGZyb20gdGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbi4KICAgICAgcmV0dXJuIHN1cGVydHlwZSBpcyEgQm90dG9tVHlwZTsKICAgIH0KICAgIGlmIChpc1RvcChzdXBlcnR5cGUpKSByZXR1cm4gdHJ1ZTsKCiAgICAvLyBIYW5kbGUgRnV0dXJlT3I8VD4gdW5pb24gdHlwZS4KICAgIGlmIChzdWJ0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICBpZGVudGljYWwoc3VidHlwZS5jbGFzc05vZGUsIGZ1dHVyZU9yQ2xhc3MpKSB7CiAgICAgIHZhciBzdWJ0eXBlQXJnID0gc3VidHlwZS50eXBlQXJndW1lbnRzWzBdOwogICAgICBpZiAoc3VwZXJ0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICAgIGlkZW50aWNhbChzdXBlcnR5cGUuY2xhc3NOb2RlLCBmdXR1cmVPckNsYXNzKSkgewogICAgICAgIHZhciBzdXBlcnR5cGVBcmcgPSBzdXBlcnR5cGUudHlwZUFyZ3VtZW50c1swXTsKICAgICAgICAvLyBGdXR1cmVPcjxBPiA8OiBGdXR1cmVPcjxCPiBpZmYgQSA8OiBCCiAgICAgICAgcmV0dXJuIGlzU3VidHlwZU9mKHN1YnR5cGVBcmcsIHN1cGVydHlwZUFyZyk7CiAgICAgIH0KCiAgICAgIC8vIGdpdmVuIHQxIGlzIEZ1dHVyZTxBPiB8IEEsIHRoZW46CiAgICAgIC8vIChGdXR1cmU8QT4gfCBBKSA8OiB0MiBpZmYgRnV0dXJlPEE+IDw6IHQyIGFuZCBBIDw6IHQyLgogICAgICB2YXIgc3VidHlwZUZ1dHVyZSA9IGZ1dHVyZVR5cGUoc3VidHlwZUFyZyk7CiAgICAgIHJldHVybiBpc1N1YnR5cGVPZihzdWJ0eXBlRnV0dXJlLCBzdXBlcnR5cGUpICYmCiAgICAgICAgICBpc1N1YnR5cGVPZihzdWJ0eXBlQXJnLCBzdXBlcnR5cGUpOwogICAgfQoKICAgIGlmIChzdXBlcnR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIGlkZW50aWNhbChzdXBlcnR5cGUuY2xhc3NOb2RlLCBmdXR1cmVPckNsYXNzKSkgewogICAgICAvLyBnaXZlbiB0MiBpcyBGdXR1cmU8QT4gfCBBLCB0aGVuOgogICAgICAvLyB0MSA8OiAoRnV0dXJlPEE+IHwgQSkgaWZmIHQxIDw6IEZ1dHVyZTxBPiBvciB0MSA8OiBBCiAgICAgIHZhciBzdXBlcnR5cGVBcmcgPSBzdXBlcnR5cGUudHlwZUFyZ3VtZW50c1swXTsKICAgICAgdmFyIHN1cGVydHlwZUZ1dHVyZSA9IGZ1dHVyZVR5cGUoc3VwZXJ0eXBlQXJnKTsKICAgICAgcmV0dXJuIGlzU3VidHlwZU9mKHN1YnR5cGUsIHN1cGVydHlwZUZ1dHVyZSkgfHwKICAgICAgICAgIGlzU3VidHlwZU9mKHN1YnR5cGUsIHN1cGVydHlwZUFyZyk7CiAgICB9CgogICAgaWYgKHN1YnR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiBzdXBlcnR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICB2YXIgdXBjYXN0VHlwZSA9IGdldFR5cGVBc0luc3RhbmNlT2Yoc3VidHlwZSwgc3VwZXJ0eXBlLmNsYXNzTm9kZSk7CiAgICAgIGlmICh1cGNhc3RUeXBlID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cGNhc3RUeXBlLnR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAvLyBUZXJtaW5hdGlvbjogdGhlICdzdXBlcnR5cGUnIHBhcmFtZXRlciBkZWNyZWFzZXMgaW4gc2l6ZS4KICAgICAgICBpZiAoIWlzU3VidHlwZU9mKAogICAgICAgICAgICB1cGNhc3RUeXBlLnR5cGVBcmd1bWVudHNbaV0sIHN1cGVydHlwZS50eXBlQXJndW1lbnRzW2ldKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChzdWJ0eXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgIGlmIChzdXBlcnR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICAgIHN1YnR5cGUucGFyYW1ldGVyID09IHN1cGVydHlwZS5wYXJhbWV0ZXIpIHsKICAgICAgICBpZiAoc3VwZXJ0eXBlLnByb21vdGVkQm91bmQgIT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIGlzU3VidHlwZU9mKHN1YnR5cGUuYm91bmQsIHN1cGVydHlwZS5ib3VuZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFByb21vdGVkIGJvdW5kIHNob3VsZCBhbHdheXMgYmUgYSBzdWJ0eXBlIG9mIHRoZSBkZWNsYXJlZCBib3VuZC4KICAgICAgICAgIGFzc2VydChzdWJ0eXBlLnByb21vdGVkQm91bmQgPT0gbnVsbCB8fAogICAgICAgICAgICAgIGlzU3VidHlwZU9mKHN1YnR5cGUuYm91bmQsIHN1cGVydHlwZS5ib3VuZCkpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFRlcm1pbmF0aW9uOiBpZiB0aGVyZSBhcmUgbm8gY3ljbGljYWxseSBib3VuZCB0eXBlIHBhcmFtZXRlcnMsIHRoaXMKICAgICAgLy8gcmVjdXJzaXZlIGNhbGwgY2FuIG9ubHkgb2NjdXIgYSBmaW5pdGUgbnVtYmVyIG9mIHRpbWVzLCBiZWZvcmUgcmVhY2hpbmcKICAgICAgLy8gYSBzaHJpbmtpbmcgcmVjdXJzaXZlIGNhbGwgKG9yIHRlcm1pbmF0aW5nKS4KICAgICAgcmV0dXJuIGlzU3VidHlwZU9mKHN1YnR5cGUuYm91bmQsIHN1cGVydHlwZSk7CiAgICB9CiAgICBpZiAoc3VidHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgaWYgKHN1cGVydHlwZSA9PSByYXdGdW5jdGlvblR5cGUpIHJldHVybiB0cnVlOwogICAgICBpZiAoc3VwZXJ0eXBlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICAgIHJldHVybiBfaXNGdW5jdGlvblN1YnR5cGVPZihzdWJ0eXBlLCBzdXBlcnR5cGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIF9pc0Z1bmN0aW9uU3VidHlwZU9mKEZ1bmN0aW9uVHlwZSBzdWJ0eXBlLCBGdW5jdGlvblR5cGUgc3VwZXJ0eXBlKSB7CiAgICBpZiAoc3VidHlwZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50ID4gc3VwZXJ0eXBlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHN1YnR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoIDwKICAgICAgICBzdXBlcnR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChzdWJ0eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAhPSBzdXBlcnR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChzdWJ0eXBlLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgdmFyIHN1YnN0aXR1dGlvbiA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJ0eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIHN1YlBhcmFtZXRlciA9IHN1YnR5cGUudHlwZVBhcmFtZXRlcnNbaV07CiAgICAgICAgdmFyIHN1cGVyUGFyYW1ldGVyID0gc3VwZXJ0eXBlLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICAgIHN1YnN0aXR1dGlvbltzdWJQYXJhbWV0ZXJdID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKHN1cGVyUGFyYW1ldGVyKTsKICAgICAgfQogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgc3ViUGFyYW1ldGVyID0gc3VidHlwZS50eXBlUGFyYW1ldGVyc1tpXTsKICAgICAgICB2YXIgc3VwZXJQYXJhbWV0ZXIgPSBzdXBlcnR5cGUudHlwZVBhcmFtZXRlcnNbaV07CiAgICAgICAgdmFyIHN1YkJvdW5kID0gc3Vic3RpdHV0ZShzdWJQYXJhbWV0ZXIuYm91bmQsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgLy8gVGVybWluYXRpb246IGlmIHRoZXJlIGFyZSBubyBjeWNsaWNhbGx5IGJvdW5kIHR5cGUgcGFyYW1ldGVycywgdGhpcwogICAgICAgIC8vIHJlY3Vyc2l2ZSBjYWxsIGNhbiBvbmx5IG9jY3VyIGEgZmluaXRlIG51bWJlciBvZiB0aW1lcyBiZWZvcmUKICAgICAgICAvLyByZWFjaGluZyBhIHNocmlua2luZyByZWN1cnNpdmUgY2FsbCAob3IgdGVybWluYXRpbmcpLgogICAgICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBSZXBsYWNlIGl0IHdpdGggb25lIHJlY3Vyc2l2ZSBkZXNjZW50IGluc3RlYWQgb2YgdHdvLgogICAgICAgIGlmICghaXNTdWJ0eXBlT2Yoc3VwZXJQYXJhbWV0ZXIuYm91bmQsIHN1YkJvdW5kKSB8fAogICAgICAgICAgICAhaXNTdWJ0eXBlT2Yoc3ViQm91bmQsIHN1cGVyUGFyYW1ldGVyLmJvdW5kKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBzdWJ0eXBlID0gc3Vic3RpdHV0ZShzdWJ0eXBlLndpdGhvdXRUeXBlUGFyYW1ldGVycywgc3Vic3RpdHV0aW9uKTsKICAgIH0KICAgIGlmICghaXNTdWJ0eXBlT2Yoc3VidHlwZS5yZXR1cm5UeXBlLCBzdXBlcnR5cGUucmV0dXJuVHlwZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcnR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHN1cGVydHlwZVBhcmFtZXRlciA9IHN1cGVydHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgdmFyIHN1YnR5cGVQYXJhbWV0ZXIgPSBzdWJ0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICAvLyBUZXJtaW5hdGlvbjogQm90aCB0eXBlcyBzaHJpbmsgaW4gc2l6ZS4KICAgICAgaWYgKCFpc1N1YnR5cGVPZihzdXBlcnR5cGVQYXJhbWV0ZXIsIHN1YnR5cGVQYXJhbWV0ZXIpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpbnQgc3VidHlwZU5hbWVJbmRleCA9IDA7CiAgICBmb3IgKE5hbWVkVHlwZSBzdXBlcnR5cGVQYXJhbWV0ZXIgaW4gc3VwZXJ0eXBlLm5hbWVkUGFyYW1ldGVycykgewogICAgICB3aGlsZSAoc3VidHlwZU5hbWVJbmRleCA8IHN1YnR5cGUubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCAmJgogICAgICAgICAgc3VidHlwZS5uYW1lZFBhcmFtZXRlcnNbc3VidHlwZU5hbWVJbmRleF0ubmFtZSAhPQogICAgICAgICAgICAgIHN1cGVydHlwZVBhcmFtZXRlci5uYW1lKSB7CiAgICAgICAgKytzdWJ0eXBlTmFtZUluZGV4OwogICAgICB9CiAgICAgIGlmIChzdWJ0eXBlTmFtZUluZGV4ID09IHN1YnR5cGUubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgICBOYW1lZFR5cGUgc3VidHlwZVBhcmFtZXRlciA9IHN1YnR5cGUubmFtZWRQYXJhbWV0ZXJzW3N1YnR5cGVOYW1lSW5kZXhdOwogICAgICAvLyBUZXJtaW5hdGlvbjogQm90aCB0eXBlcyBzaHJpbmsgaW4gc2l6ZS4KICAgICAgaWYgKCFpc1N1YnR5cGVPZihzdXBlcnR5cGVQYXJhbWV0ZXIudHlwZSwgc3VidHlwZVBhcmFtZXRlci50eXBlKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQp9CoFCAE5OPCEBEx8aHAEzKAE6ATcdARoBFxY1AVEmHQEwAUtEBAFBPT07O0FBQT1IASwsNgE4TAQBN0sEAT9KBAEuSQQBLEcEASxHBAE7BkwvKSE3NSYIT0ZKQk8cKAgGEQQBTQZPTCgGUR0GSVFQMiAjDSEGBAFKOgZQQzoqSCYcGRkhFwYSBAFKShAGO0FNPSNLJkcUBAIBQQRRHyAeJRsrASIBSwFQIB9FATExOTcbRBgyHzITBAE9Ox8jNCwfTycGJwEmJDcxKDs3MTYIASpAMjYuBgEmOSo+NTY2LgYBQkosQkUaSBgKCBMGKCw2Lz4RTjI8FwoITVE2NAYjNSc5CAYSBAFMTRQGLjEUBkwUBi02QDY6TAhANjpFT0lBUTw8GAoISQZCFAZGQj4xQBYIBh5GQjwpHAhMTjFKFggGEQQCASRwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQmc2Rrcm9vdDovcGtnL2tlcm5lbC9saWIvY29xX2Fubm90LmRhcnSDty8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi8vCi8vIFBsZWFzZSBzZWUgdGhlIGNvbW1lbnRzIGluIGBwa2cva2VybmVsL2xpYi90cmFuc2Zvcm1hdGlvbnMvY29xLmRhcnRgIGZvciBtb3JlCi8vIGluZm8uCgpsaWJyYXJ5IGtlcm5lbC5jb3FfYW5ub3Q7Cgpjb25zdCBjb3EgPSAxOyAvLyBmaWVsZCBvciBjbGFzcwpjb25zdCBjb3FyZWYgPSAyOyAvLyBjbGFzcyBvbmx5CmNvbnN0IG5vY29xID0gMzsgLy8gZmllbGQgb25seQpjb25zdCBjb3FvcHQgPSA0OyAvLyBmaWVsZCBvbmx5CmNvbnN0IGNvcXNpbmdsZSA9IDU7IC8vIHRyZWF0IExpc3Q8QT4gYXMganVzdCBBCmNvbnN0IGNvcWRlZiA9IDY7CmNvbnN0IGNvcXNpbmdsZWRlZiA9IDc7CgovLyBsaWJyYXJ5IG9ubHkKY2xhc3MgQ29xTGliIHsKICBmaW5hbCBTdHJpbmcgZGVzdFBhdGhSZWxhdGl2ZTsKICBjb25zdCBDb3FMaWIodGhpcy5kZXN0UGF0aFJlbGF0aXZlKTsKfQoKLy8gVE9ETygzMDYwOSk6IFNpbmNlIGZhc3RhIGN1cnJlbnRseSB0aHJvd3MgYXdheSBhbm5vdGF0aW9ucyBvbiBFbnVtcywgd2UgdXNlIGEKLy8gbGlzdCB0byBpZGVudGlmeSB3aGljaCBlbnVtcyB0byBjb252ZXJ0LgovLwovLyBXZSdsbCB1bmNvbW1lbnQgdGhlc2UgZW51bXMgb25jZSB0aGUgQ29xIGZvcm1hbGl6YXRpb24gaXMgc3VmZmljaWVudGx5IGNvbXBsZXRlLgp2YXIgY29xRW51bXMgPSBbLyoia2VybmVsLmFzdDo6UHJvY2VkdXJlS2luZCIsICJrZXJuZWwuYXN0OjpBc3luY01hcmtlciIqL107Ch4ATk48A1EJARoBISAfIDASGAEQDyEnAgFRLANUTQEdcGFja2FnZTprZXJuZWwvY29xX2Fubm90LmRhcnQsc2Rrcm9vdDovcGtnL2tlcm5lbC9saWIvY2xhc3NfaGllcmFyY2h5LmRhcnTAANKaLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuY2xhc3NfaGllcmFyY2h5OwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwppbXBvcnQgJ2RhcnQ6bWF0aCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCmltcG9ydCAnYXN0LmRhcnQnOwppbXBvcnQgJ3NyYy9oZWFwLmRhcnQnOwppbXBvcnQgJ3R5cGVfYWxnZWJyYS5kYXJ0JzsKCnR5cGVkZWYgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyA9IHZvaWQgRnVuY3Rpb24oQ2xhc3MsIFN1cGVydHlwZSwgU3VwZXJ0eXBlKTsKCmFic3RyYWN0IGNsYXNzIE1peGluSW5mZXJyZXIgewogIHZvaWQgaW5mZXIoQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LCBDbGFzcyBjbGFzc05vZGUpOwp9CgovLy8gSW50ZXJmYWNlIGZvciBhbnN3ZXJpbmcgdmFyaW91cyBzdWJjbGFzc2luZyBxdWVyaWVzLgphYnN0cmFjdCBjbGFzcyBDbGFzc0hpZXJhcmNoeSB7CiAgZmFjdG9yeSBDbGFzc0hpZXJhcmNoeShDb21wb25lbnQgY29tcG9uZW50LAogICAgICB7SGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyBvbkFtYmlndW91c1N1cGVydHlwZXMsCiAgICAgIE1peGluSW5mZXJyZXIgbWl4aW5JbmZlcnJlcn0pIHsKICAgIG9uQW1iaWd1b3VzU3VwZXJ0eXBlcyA/Pz0gKENsYXNzIGNscywgU3VwZXJ0eXBlIGEsIFN1cGVydHlwZSBiKSB7CiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzIwOTEKICAgICAgdGhyb3cgIiRjbHMgY2FuJ3QgaW1wbGVtZW50IGJvdGggJGEgYW5kICRiIjsKICAgIH07CiAgICByZXR1cm4gbmV3IENsb3NlZFdvcmxkQ2xhc3NIaWVyYXJjaHkuX2ludGVybmFsKAogICAgICAgIG9uQW1iaWd1b3VzU3VwZXJ0eXBlcywgbWl4aW5JbmZlcnJlcikKICAgICAgLi5faW5pdGlhbGl6ZShjb21wb25lbnQubGlicmFyaWVzKTsKICB9CgogIHZvaWQgc2V0IG9uQW1iaWd1b3VzU3VwZXJ0eXBlcygKICAgICAgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyBvbkFtYmlndW91c1N1cGVydHlwZXMpOwoKICB2b2lkIHNldCBtaXhpbkluZmVycmVyKE1peGluSW5mZXJyZXIgbWl4aW5JbmZlcnJlcik7CgogIC8vLyBHaXZlbiB0aGUgW3Vub3JkZXJlZF0gY2xhc3NlcywgcmV0dXJuIHRoZW0gaW4gc3VjaCBvcmRlciB0aGF0IGNsYXNzZXMKICAvLy8gb2NjdXIgYWZ0ZXIgdGhlaXIgc3VwZXJjbGFzc2VzLiAgSWYgc29tZSBzdXBlcmNsYXNzZXMgYXJlIG5vdCBpbgogIC8vLyBbdW5vcmRlcmVkXSwgdGhleSBhcmUgbm90IGluY2x1ZGVkLgogIEl0ZXJhYmxlPENsYXNzPiBnZXRPcmRlcmVkQ2xhc3NlcyhJdGVyYWJsZTxDbGFzcz4gdW5vcmRlcmVkKTsKCiAgLy8gUmV0dXJucyB0aGUgaW5zdGFudGl0aW9uIG9mIGVhY2ggZ2VuZXJpYyBzdXBlcnR5cGUgaW1wbGVtZW50ZWQgYnkgdGhpcwogIC8vIGNsYXNzIChlLmcuIGdldENsYXNzQXNJbnN0YW5jZU9mIGFwcGxpZWQgdG8gYWxsIHN1cGVyY2xhc3NlcyBhbmQKICAvLyBpbnRlcmZhY2VzKS4KICBMaXN0PFN1cGVydHlwZT4gZ2VuZXJpY1N1cGVydHlwZXNPZihDbGFzcyBjbGFzc18pOwoKICAvLy8gUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgdHdvIGludGVyZmFjZSB0eXBlcywgYXMgZGVmaW5lZCBieSBEYXJ0CiAgLy8vIDEuMC4KICAvLy8KICAvLy8gR2l2ZW4gdHdvIGludGVyZmFjZXMgSSBhbmQgSiwgbGV0IFNfSSBiZSB0aGUgc2V0IG9mIHN1cGVyaW50ZXJmYWNlcyBvZiBJLAogIC8vLyBsZXQgU19KIGJlIHRoZSBzZXQgb2Ygc3VwZXJpbnRlcmZhY2VzIG9mIEosIGFuZCBsZXQKICAvLy8gUyA9IChJIHVuaW9uIFNfSSkgaW50ZXJzZWN0IChKIHVuaW9uIFNfSikuICBGdXJ0aGVybW9yZSwgd2UgZGVmaW5lCiAgLy8vIFNfbiA9IHtUIHwgVCBpbiBTIGFuZCBkZXB0aChUKSA9IG59IGZvciBhbnkgZmluaXRlIG4gd2hlcmUgZGVwdGgoVCkgaXMKICAvLy8gdGhlIG51bWJlciBvZiBzdGVwcyBpbiB0aGUgbG9uZ2VzdCBpbmhlcml0YW5jZSBwYXRoIGZyb20gVCB0byBPYmplY3QuICBMZXQKICAvLy8gcSBiZSB0aGUgbGFyZ2VzdCBudW1iZXIgc3VjaCB0aGF0IFNfcSBoYXMgY2FyZGluYWxpdHkgb25lLiAgVGhlIGxlYXN0CiAgLy8vIHVwcGVyIGJvdW5kIG9mIEkgYW5kIEogaXMgdGhlIHNvbGUgZWxlbWVudCBvZiBTX3EuCiAgLy8vCiAgLy8vIFRoaXMgaXMgY2FsbGVkIHRoZSAibGVnYWN5IiBsZWFzdCB1cHBlciBib3VuZCB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZQogIC8vLyBEYXJ0IDIgbGVhc3QgdXBwZXIgYm91bmQsIHdoaWNoIGhhcyBzcGVjaWFsIGJlaGF2aW9ycyBpbiB0aGUgY2FzZSB3aGVyZQogIC8vLyBvbmUgdHlwZSBpcyBhIHN1YnR5cGUgb2YgdGhlIG90aGVyLCBvciB3aGVyZSBib3RoIHR5cGVzIGFyZSBiYXNlZCBvbiB0aGUKICAvLy8gc2FtZSBjbGFzcy4KICBJbnRlcmZhY2VUeXBlIGdldExlZ2FjeUxlYXN0VXBwZXJCb3VuZCgKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlMSwgSW50ZXJmYWNlVHlwZSB0eXBlMik7CgogIC8vLyBSZXR1cm5zIHRoZSBpbnN0YW50aWF0aW9uIG9mIFtzdXBlcmNsYXNzXSB0aGF0IGlzIGltcGxlbWVudGVkIGJ5IFtjbGFzc19dLAogIC8vLyBvciBgbnVsbGAgaWYgW2NsYXNzX10gZG9lcyBub3QgaW1wbGVtZW50IFtzdXBlcmNsYXNzXSBhdCBhbGwuCiAgU3VwZXJ0eXBlIGdldENsYXNzQXNJbnN0YW5jZU9mKENsYXNzIGNsYXNzXywgQ2xhc3Mgc3VwZXJjbGFzcyk7CgogIC8vLyBSZXR1cm5zIHRoZSBpbnN0YW50aWF0aW9uIG9mIFtzdXBlcmNsYXNzXSB0aGF0IGlzIGltcGxlbWVudGVkIGJ5IFt0eXBlXSwKICAvLy8gb3IgYG51bGxgIGlmIFt0eXBlXSBkb2VzIG5vdCBpbXBsZW1lbnQgW3N1cGVyY2xhc3NdIGF0IGFsbC4KICBJbnRlcmZhY2VUeXBlIGdldFR5cGVBc0luc3RhbmNlT2YoSW50ZXJmYWNlVHlwZSB0eXBlLCBDbGFzcyBzdXBlcmNsYXNzKTsKCiAgLy8vIFJldHVybnMgdGhlIGluc3RhbnRpYXRpb24gb2YgW3N1cGVyY2xhc3NdIHRoYXQgaXMgaW1wbGVtZW50ZWQgYnkgW3R5cGVdLAogIC8vLyBvciBgbnVsbGAgaWYgW3R5cGVdIGRvZXMgbm90IGltcGxlbWVudCBbc3VwZXJjbGFzc10uICBbc3VwZXJjbGFzc10gbXVzdAogIC8vLyBiZSBhIGdlbmVyaWMgY2xhc3MuCiAgU3VwZXJ0eXBlIGFzSW5zdGFudGlhdGlvbk9mKFN1cGVydHlwZSB0eXBlLCBDbGFzcyBzdXBlcmNsYXNzKTsKCiAgLy8vIFJldHVybnMgdGhlIGluc3RhbmNlIG1lbWJlciB0aGF0IHdvdWxkIHJlc3BvbmQgdG8gYSBkeW5hbWljIGRpc3BhdGNoIG9mCiAgLy8vIFtuYW1lXSB0byBhbiBpbnN0YW5jZSBvZiBbY2xhc3NfXSwgb3IgYG51bGxgIGlmIG5vIHN1Y2ggbWVtYmVyIGV4aXN0cy4KICAvLy8KICAvLy8gSWYgW3NldHRlcl0gaXMgYGZhbHNlYCwgdGhlIG5hbWUgaXMgZGlzcGF0Y2hlZCBhcyBhIGdldHRlciBvciBjYWxsLAogIC8vLyBhbmQgd2lsbCByZXR1cm4gYSBmaWVsZCwgZ2V0dGVyLCBtZXRob2QsIG9yIG9wZXJhdG9yIChvciBudWxsKS4KICAvLy8KICAvLy8gSWYgW3NldHRlcl0gaXMgYHRydWVgLCB0aGUgbmFtZSBpcyBkaXNwYXRjaGVkIGFzIGEgc2V0dGVyLCByb3VnaGx5CiAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gYG5hbWU9YCBpbiB0aGUgRGFydCBzcGVjaWZpY2F0aW9uLCBidXQgbm90ZSB0aGF0IHRoZQogIC8vLyByZXR1cm5lZCBtZW1iZXIgd2lsbCBub3QgaGF2ZSBhIG5hbWUgZW5kaW5nIHdpdGggYD1gLiAgSW4gdGhpcyBjYXNlLAogIC8vLyBhIG5vbi1maW5hbCBmaWVsZCBvciBzZXR0ZXIgKG9yIG51bGwpIHdpbGwgYmUgcmV0dXJuZWQuCiAgLy8vCiAgLy8vIElmIHRoZSBjbGFzcyBpcyBhYnN0cmFjdCwgYWJzdHJhY3QgbWVtYmVycyBhcmUgaWdub3JlZCBhbmQgdGhlIGRpc3BhdGNoCiAgLy8vIGlzIHJlc29sdmVkIGlmIHRoZSBjbGFzcyB3YXMgbm90IGFic3RyYWN0LgogIE1lbWJlciBnZXREaXNwYXRjaFRhcmdldChDbGFzcyBjbGFzc18sIE5hbWUgbmFtZSwge2Jvb2wgc2V0dGVyOiBmYWxzZX0pOwoKICAvLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBwb3RlbnRpYWwgdGFyZ2V0cyBvZiBkeW5hbWljIGRpc3BhdGNoIHRvIGFuIGluc3RhbmNlCiAgLy8vIG9mIFtjbGFzc19dLgogIC8vLwogIC8vLyBJZiBbc2V0dGVyc10gaXMgYGZhbHNlYCwgb25seSBwb3RlbnRpYWwgdGFyZ2V0cyBvZiBhIGdldHRlciBvciBjYWxsCiAgLy8vIGRpc3BhdGNoIGFyZSByZXR1cm5lZC4gIElmIFtzZXR0ZXJzXSBpcyBgdHJ1ZWAsIG9ubHkgcG90ZW50aWFsIHRhcmdldHMKICAvLy8gb2YgYSBzZXR0ZXIgZGlzcGF0Y2ggYXJlIHJldHVybmVkLgogIC8vLwogIC8vLyBTZWUgW2dldERpc3BhdGNoVGFyZ2V0XSBmb3IgbW9yZSBkZXRhaWxzLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgbGlzdCBzaG91bGQgbm90IGJlIG1vZGlmaWVkLgogIExpc3Q8TWVtYmVyPiBnZXREaXNwYXRjaFRhcmdldHMoQ2xhc3MgY2xhc3NfLCB7Ym9vbCBzZXR0ZXJzOiBmYWxzZX0pOwoKICAvLy8gUmV0dXJucyB0aGUgcG9zc2libHkgYWJzdHJhY3QgaW50ZXJmYWNlIG1lbWJlciBvZiBbY2xhc3NfXSB3aXRoIHRoZSBnaXZlbgogIC8vLyBbbmFtZV0uCiAgLy8vCiAgLy8vIElmIFtzZXR0ZXJdIGlzIGBmYWxzZWAsIG9ubHkgZmllbGRzLCBtZXRob2RzLCBhbmQgZ2V0dGVycyB3aXRoIHRoYXQgbmFtZQogIC8vLyB3aWxsIGJlIGZvdW5kLiAgSWYgW3NldHRlcl0gaXMgYHRydWVgLCBvbmx5IG5vbi1maW5hbCBmaWVsZHMgYW5kIHNldHRlcnMKICAvLy8gd2lsbCBiZSBmb3VuZC4KICAvLy8KICAvLy8gSWYgbXVsdGlwbGUgbWVtYmVycyB3aXRoIHRoYXQgbmFtZSBhcmUgaW5oZXJpdGVkIGFuZCBub3Qgb3ZlcnJpZGRlbiwgdGhlCiAgLy8vIG1lbWJlciBmcm9tIHRoZSBmaXJzdCBkZWNsYXJlZCBzdXBlcnR5cGUgaXMgcmV0dXJuZWQuCiAgTWVtYmVyIGdldEludGVyZmFjZU1lbWJlcihDbGFzcyBjbGFzc18sIE5hbWUgbmFtZSwge2Jvb2wgc2V0dGVyOiBmYWxzZX0pOwoKICAvLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBtZW1iZXJzIGRlbm90aW5nIHRoZSBpbnRlcmZhY2UgZm9yIFtjbGFzc19dLCB3aGljaAogIC8vLyBtYXkgaW5jbHVkZSBhYnN0cmFjdCBtZW1iZXJzLgogIC8vLwogIC8vLyBUaGUgbGlzdCBtYXkgY29udGFpbiBtdWx0aXBsZSBtZW1iZXJzIHdpdGggYSBnaXZlbiBuYW1lLiAgVGhpcyBoYXBwZW5zCiAgLy8vIHdoZW4gbWVtYmVycyBhcmUgaW5oZXJpdGVkIHRocm91Z2ggZGlmZmVyZW50IHN1cGVydHlwZXMgYW5kIG5vdCBvdmVycmlkZGVuCiAgLy8vIGluIHRoZSBjbGFzcy4KICAvLy8KICAvLy8gQWxzbyBzZWUgW2dldEludGVyZmFjZU1lbWJlcl0uCiAgTGlzdDxNZW1iZXI+IGdldEludGVyZmFjZU1lbWJlcnMoQ2xhc3MgY2xhc3NfLCB7Ym9vbCBzZXR0ZXJzOiBmYWxzZX0pOwoKICAvLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBtZW1iZXJzIGRlY2xhcmVkIGluIFtjbGFzc19dLCBpbmNsdWRpbmcgYWJzdHJhY3QKICAvLy8gbWVtYmVycy4KICAvLy8KICAvLy8gTWVtYmVycyBhcmUgc29ydGVkIGJ5IG5hbWUgc28gdGhhdCB0aGV5IG1heSBiZSBlZmZpY2llbnRseSBjb21wYXJlZCBhY3Jvc3MKICAvLy8gY2xhc3Nlcy4KICBMaXN0PE1lbWJlcj4gZ2V0RGVjbGFyZWRNZW1iZXJzKENsYXNzIGNsYXNzXywge2Jvb2wgc2V0dGVyczogZmFsc2V9KTsKCiAgLy8vIFRydWUgaWYgW3N1YmNsYXNzXSBpbmhlcml0cyBmcm9tIFtzdXBlcmNsYXNzXSB0aG91Z2ggemVybyBvciBtb3JlCiAgLy8vIGBleHRlbmRzYCByZWxhdGlvbnNoaXBzLgogIGJvb2wgaXNTdWJjbGFzc09mKENsYXNzIHN1YmNsYXNzLCBDbGFzcyBzdXBlcmNsYXNzKTsKCiAgLy8vIFRydWUgaWYgW3N1YnR5cGVdIGluaGVyaXRzIGZyb20gW3N1cGVyY2xhc3NdIHRob3VnaCB6ZXJvIG9yIG1vcmUKICAvLy8gYGV4dGVuZHNgLCBgd2l0aGAsIGFuZCBgaW1wbGVtZW50c2AgcmVsYXRpb25zaGlwcy4KICBib29sIGlzU3VidHlwZU9mKENsYXNzIHN1YnR5cGUsIENsYXNzIHN1cGVyY2xhc3MpOwoKICAvLy8gVHJ1ZSBpZiB0aGUgZ2l2ZW4gY2xhc3MgaXMgdXNlZCBhcyB0aGUgcmlnaHQtaGFuZCBvcGVyYW5kIHRvIGEKICAvLy8gbWl4aW4gYXBwbGljYXRpb24gKGkuZS4gW0NsYXNzLm1peGVkSW5UeXBlXSkuCiAgYm9vbCBpc1VzZWRBc01peGluKENsYXNzIGNsYXNzXyk7CgogIC8vLyBJbnZva2VzIFtjYWxsYmFja10gZm9yIGV2ZXJ5IG1lbWJlciBkZWNsYXJlZCBpbiBvciBpbmhlcml0ZWQgYnkgW2NsYXNzX10KICAvLy8gdGhhdCBvdmVycmlkZXMgb3IgaW1wbGVtZW50cyBhIG1lbWJlciBpbiBhIHN1cGVydHlwZSBvZiBbY2xhc3NfXQogIC8vLyAob3IgaW4gcmFyZSBjYXNlcywgb3ZlcnJpZGVzIGEgbWVtYmVyIGRlY2xhcmVkIGluIFtjbGFzc19dKS4KICAvLy8KICAvLy8gV2UgdXNlIHRoZSB0ZXJtICJpbmhlcml0YWJsZSIgZm9yIG1lbWJlcnMgdGhhdCBhcmUgY2FuZGlkYXRlcyBmb3IKICAvLy8gaW5oZXJpdGFuY2UgYnV0IG1heSBoYXZlIGJlZW4gb3ZlcnJpZGRlbi4gIFRoZSAiZGVjbGFyZWQiIG1lbWJlcnMgb2YgYQogIC8vLyBtaXhpbiBhcHBsaWNhdGlvbiBhcmUgdGhvc2UgZGVjbGFyZWQgaW4gdGhlIG1peGVkLWluIHR5cGUuIFRoZSBjYWxsYmFjayBpcwogIC8vLyBpbnZva2VkIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6CiAgLy8vCiAgLy8vIDEuIEEgbWVtYmVyIGRlY2xhcmVkIGluIHRoZSBjbGFzcyBvdmVycmlkZXMgYSBtZW1iZXIgaW5oZXJpdGFibGUgdGhyb3VnaAogIC8vLyBvbmUgb2YgdGhlIHN1cGVydHlwZXMgb2YgdGhlIGNsYXNzLgogIC8vLwogIC8vLyAyLiBBIG5vbi1hYnN0cmFjdCBtZW1iZXIgaXMgaW5oZXJpdGVkIGZyb20gYSBzdXBlcmNsYXNzLCBhbmQgaW4gdGhlCiAgLy8vIGNvbnRleHQgb2YgdGhpcyBjbGFzcywgaXQgb3ZlcnJpZGVzIGFuIGFic3RyYWN0IG1lbWJlciBpbmhlcml0YWJsZSB0aHJvdWdoCiAgLy8vIG9uZSBvZiBpdHMgc3VwZXJpbnRlcmZhY2VzLgogIC8vLwogIC8vLyAzLiBBIG5vbi1hYnN0cmFjdCBtZW1iZXIgaXMgaW5oZXJpdGVkIGZyb20gYSBzdXBlcmNsYXNzLCBhbmQgaXQgb3ZlcnJpZGVzCiAgLy8vIGFuIGFic3RyYWN0IG1lbWJlciBkZWNsYXJlZCBpbiB0aGlzIGNsYXNzLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCB3aWxsIG5vdCByZXBvcnQgdGhhdCBhIG1lbWJlciBvdmVycmlkZXMgaXRzZWxmLiBBIGdpdmVuIHBhaXIKICAvLy8gbWF5IGJlIHJlcG9ydGVkIG11bHRpcGxlIHRpbWVzIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGluaGVyaXRhbmNlIHBhdGhzCiAgLy8vIHRvIHRoZSBvdmVycmlkZGVuIG1lbWJlci4KICAvLy8KICAvLy8gSXQgaXMgcG9zc2libGUgZm9yIHR3byBtZXRob2RzIHRvIG92ZXJyaWRlIG9uZSBhbm90aGVyIGluIGJvdGggZGlyZWN0aW9ucy4KICAvLy8KICAvLy8gQnkgZGVmYXVsdCBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGFyZSBvdmVycmlkZGVuIHNlcGFyYXRlbHkuICBUaGUgW2lzU2V0dGVyXQogIC8vLyBjYWxsYmFjayBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB3aGljaCB0eXBlIG9mIGFjY2VzcyBpcyBiZWluZyBvdmVycmlkZGVuLgogIHZvaWQgZm9yRWFjaE92ZXJyaWRlUGFpcihDbGFzcyBjbGFzc18sCiAgICAgIGNhbGxiYWNrKE1lbWJlciBkZWNsYXJlZE1lbWJlciwgTWVtYmVyIGludGVyZmFjZU1lbWJlciwgYm9vbCBpc1NldHRlcikpOwoKICAvLy8gVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgY2xpZW50IGFmdGVyIGEgY2hhbmdlOiByZW1vdmFsLCBhZGRpdGlvbiwKICAvLy8gb3IgbW9kaWZpY2F0aW9uIG9mIGNsYXNzZXMgKHZpYSBsaWJyYXJpZXMpLgogIC8vLwogIC8vLyBGb3IgbW9kaWZpZWQgY2xhc3NlcyBzcGVjaWZ5IGEgY2xhc3MgYXMgYm90aCByZW1vdmVkIGFuZCBhZGRlZDogU29tZSBvZgogIC8vLyB0aGUgaW5mb3JtYXRpb24gdGhhdCB0aGlzIGhpZXJhcmNoeSBtaWdodCBoYXZlIGNhY2hlZCwgaXMgbm90IHZhbGlkCiAgLy8vIGFueW1vcmUuCiAgLy8vCiAgLy8vIE5vdGUsIHRoYXQgaXQgaXMgdGhlIGNsaWVudHMgcmVzcG9uc2liaWxpdHkgdG8gbWFyayBhbGwgc3ViY2xhc3NlcyBhcwogIC8vLyBjaGFuZ2VkIHRvby4KICBDbGFzc0hpZXJhcmNoeSBhcHBseVRyZWVDaGFuZ2VzKEl0ZXJhYmxlPExpYnJhcnk+IHJlbW92ZWRMaWJyYXJpZXMsCiAgICAgIEl0ZXJhYmxlPExpYnJhcnk+IGVuc3VyZUtub3duTGlicmFyaWVzLAogICAgICB7Q29tcG9uZW50IHJlaXNzdWVBbWJpZ3VvdXNTdXBlcnR5cGVzRm9yfSk7CgogIC8vLyBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBjbGllbnQgYWZ0ZXIgYSBtZW1iZXIgY2hhbmdlIG9uIGNsYXNzZXM6CiAgLy8vIFNvbWUgb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgdGhpcyBoaWVyYXJjaHkgbWlnaHQgaGF2ZSBjYWNoZWQsCiAgLy8vIGlzIG5vdCB2YWxpZCBhbnltb3JlLgogIC8vLyBOb3RlLCB0aGF0IGl0IGlzIHRoZSBjbGllbnRzIHJlc3BvbnNpYmlsaXR5IHRvIG1hcmsgYWxsIHN1YmNsYXNzZXMgYXMKICAvLy8gY2hhbmdlZCB0b28sIG9yIC0gaWYgW2ZpbmREZXNjZW5kYW50c10gaXMgdHJ1ZSwgdGhlIENsYXNzSGllcmFyY2h5IHdpbGwKICAvLy8gc3BlbmQgdGhlIHRpbWUgdG8gZmluZCB0aGVtIGZvciB0aGUgY2FsbGVyLgogIENsYXNzSGllcmFyY2h5IGFwcGx5TWVtYmVyQ2hhbmdlcyhJdGVyYWJsZTxDbGFzcz4gY2xhc3NlcywKICAgICAge2Jvb2wgZmluZERlc2NlbmRhbnRzOiBmYWxzZX0pOwoKICAvLy8gTWVyZ2VzIHR3byBzb3J0ZWQgbGlzdHMuCiAgLy8vCiAgLy8vIElmIGEgZ2l2ZW4gbWVtYmVyIG9jY3VycyBpbiBib3RoIGxpc3RzLCB0aGUgbWVyZ2Ugd2lsbCBhdHRlbXB0IHRvIGV4Y2x1ZGUKICAvLy8gdGhlIGR1cGxpY2F0ZSBtZW1iZXIsIGJ1dCBpcyBub3Qgc3RyaWN0bHkgZ3VhcmFudGVlZCB0byBkbyBzby4KICAvLy8KICAvLy8gVGhlIHNvcnQgaGFzIHRoZSBmb2xsb3dpbmcgc3RhYmlsaXR5IHByb3BlcnRpZXM6CiAgLy8vCiAgLy8vIC0gSWYgYm90aCB4IGFuZCB5IGNhbWUgZnJvbSB0aGUgc2FtZSBpbnB1dCBsaXN0LCBhbmQgeCBwcmVjZWRlZCB5IGluIHRoZQogIC8vLyAgIGlucHV0IGxpc3QsIHggd2lsbCBwcmVjZWRlIHkgaW4gdGhlIG91dHB1dCBsaXN0LiAgVGhpcyBob2xkcyBldmVuIGlmIHgKICAvLy8gICBhbmQgeSBoYXZlIG1hdGNoaW5nIG5hbWVzLgogIC8vLwogIC8vLyAtIElmIG0gaXMgYSBjb250aWd1b3VzIHN1YnNlcXVlbmNlIG9mIHRoZSBvdXRwdXQgbGlzdCBjb250YWluaW5nIGF0IGxlYXN0CiAgLy8vICAgb25lIGVsZW1lbnQgZnJvbSBlYWNoIGlucHV0IGxpc3QsIGFuZCBhbGwgZWxlbWVudHMgb2YgbSBoYXZlIG1hdGNoaW5nCiAgLy8vICAgbmFtZXMsIHRoZW4gdGhlIGVsZW1lbnRzIG9mIG0gZnJvbSBbZmlyc3RdIHdpbGwgcHJlY2VkZSB0aGUgZWxlbWVudHMgb2YKICAvLy8gICBtIGZyb20gW3NlY29uZF0uCiAgc3RhdGljIExpc3Q8TWVtYmVyPiBtZXJnZVNvcnRlZExpc3RzKAogICAgICBMaXN0PE1lbWJlcj4gZmlyc3QsIExpc3Q8TWVtYmVyPiBzZWNvbmQpIHsKICAgIGlmIChmaXJzdC5pc0VtcHR5KSByZXR1cm4gc2Vjb25kOwogICAgaWYgKHNlY29uZC5pc0VtcHR5KSByZXR1cm4gZmlyc3Q7CiAgICBMaXN0PE1lbWJlcj4gcmVzdWx0ID0gPE1lbWJlcj5bXS4ubGVuZ3RoID0gZmlyc3QubGVuZ3RoICsgc2Vjb25kLmxlbmd0aDsKICAgIGludCBzdG9yZUluZGV4ID0gMDsKICAgIGludCBpID0gMCwgaiA9IDA7CiAgICB3aGlsZSAoaSA8IGZpcnN0Lmxlbmd0aCAmJiBqIDwgc2Vjb25kLmxlbmd0aCkgewogICAgICBNZW1iZXIgZmlyc3RNZW1iZXIgPSBmaXJzdFtpXTsKICAgICAgTWVtYmVyIHNlY29uZE1lbWJlciA9IHNlY29uZFtqXTsKICAgICAgaW50IGNvbXBhcmUgPSBDbGFzc0hpZXJhcmNoeS5jb21wYXJlTWVtYmVycyhmaXJzdE1lbWJlciwgc2Vjb25kTWVtYmVyKTsKICAgICAgaWYgKGNvbXBhcmUgPD0gMCkgewogICAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gZmlyc3RNZW1iZXI7CiAgICAgICAgKytpOwogICAgICAgIC8vIElmIHRoZSBzYW1lIG1lbWJlciBvY2N1cnMgaW4gYm90aCBsaXN0cywgc2tpcCB0aGUgZHVwbGljYXRlLgogICAgICAgIGlmIChpZGVudGljYWwoZmlyc3RNZW1iZXIsIHNlY29uZE1lbWJlcikpIHsKICAgICAgICAgICsrajsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBzZWNvbmRNZW1iZXI7CiAgICAgICAgKytqOwogICAgICB9CiAgICB9CiAgICB3aGlsZSAoaSA8IGZpcnN0Lmxlbmd0aCkgewogICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IGZpcnN0W2krK107CiAgICB9CiAgICB3aGlsZSAoaiA8IHNlY29uZC5sZW5ndGgpIHsKICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBzZWNvbmRbaisrXTsKICAgIH0KICAgIHJlc3VsdC5sZW5ndGggPSBzdG9yZUluZGV4OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBDb21wYXJlcyBtZW1iZXJzIGJ5IG5hbWUsIHVzaW5nIHRoZSBzYW1lIHNvcnQgb3JkZXIgYXMKICAvLy8gW2dldERlY2xhcmVkTWVtYmVyc10gYW5kIFtnZXRJbnRlcmZhY2VNZW1iZXJzXS4KICBzdGF0aWMgaW50IGNvbXBhcmVNZW1iZXJzKE1lbWJlciBmaXJzdCwgTWVtYmVyIHNlY29uZCkgewogICAgcmV0dXJuIGNvbXBhcmVOYW1lcyhmaXJzdC5uYW1lLCBzZWNvbmQubmFtZSk7CiAgfQoKICAvLy8gQ29tcGFyZXMgbmFtZXMsIHVzaW5nIHRoZSBzYW1lIHNvcnQgb3JkZXIgYXMgW2dldERlY2xhcmVkTWVtYmVyc10gYW5kCiAgLy8vIFtnZXRJbnRlcmZhY2VNZW1iZXJzXS4KICAvLy8KICAvLy8gVGhpcyBpcyBhbiBhcmJpdHJhcnkgYXMtZmFzdC1hcy1wb3NzaWJsZSBzb3J0aW5nIGNyaXRlcmlvbi4KICBzdGF0aWMgaW50IGNvbXBhcmVOYW1lcyhOYW1lIGZpcnN0TmFtZSwgTmFtZSBzZWNvbmROYW1lKSB7CiAgICBpbnQgZmlyc3RIYXNoID0gZmlyc3ROYW1lLmhhc2hDb2RlOwogICAgaW50IHNlY29uZEhhc2ggPSBzZWNvbmROYW1lLmhhc2hDb2RlOwogICAgaWYgKGZpcnN0SGFzaCAhPSBzZWNvbmRIYXNoKSByZXR1cm4gZmlyc3RIYXNoIC0gc2Vjb25kSGFzaDsKICAgIFN0cmluZyBmaXJzdFN0cmluZyA9IGZpcnN0TmFtZS5uYW1lOwogICAgU3RyaW5nIHNlY29uZFN0cmluZyA9IHNlY29uZE5hbWUubmFtZTsKICAgIGludCBmaXJzdExlbmd0aCA9IGZpcnN0U3RyaW5nLmxlbmd0aDsKICAgIGludCBzZWNvbmRMZW5ndGggPSBzZWNvbmRTdHJpbmcubGVuZ3RoOwogICAgaWYgKGZpcnN0TGVuZ3RoICE9IHNlY29uZExlbmd0aCkgewogICAgICByZXR1cm4gZmlyc3RMZW5ndGggLSBzZWNvbmRMZW5ndGg7CiAgICB9CiAgICBMaWJyYXJ5IGZpcnN0TGlicmFyeSA9IGZpcnN0TmFtZS5saWJyYXJ5OwogICAgTGlicmFyeSBzZWNvbmRMaWJyYXJ5ID0gc2Vjb25kTmFtZS5saWJyYXJ5OwogICAgaWYgKGZpcnN0TGlicmFyeSAhPSBzZWNvbmRMaWJyYXJ5KSB7CiAgICAgIGlmIChmaXJzdExpYnJhcnkgPT0gbnVsbCkgcmV0dXJuIC0xOwogICAgICBpZiAoc2Vjb25kTGlicmFyeSA9PSBudWxsKSByZXR1cm4gMTsKICAgICAgcmV0dXJuIGZpcnN0TGlicmFyeS5jb21wYXJlVG8oc2Vjb25kTGlicmFyeSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpcnN0TGVuZ3RoOyArK2kpIHsKICAgICAgaW50IGZpcnN0VW5pdCA9IGZpcnN0U3RyaW5nLmNvZGVVbml0QXQoaSk7CiAgICAgIGludCBzZWNvbmRVbml0ID0gc2Vjb25kU3RyaW5nLmNvZGVVbml0QXQoaSk7CiAgICAgIGludCBkZWx0YSA9IGZpcnN0VW5pdCAtIHNlY29uZFVuaXQ7CiAgICAgIGlmIChkZWx0YSAhPSAwKSByZXR1cm4gZGVsdGE7CiAgICB9CiAgICByZXR1cm4gMDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBtZW1iZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgYG51bGxgIGlmIG5vIG1lbWJlciBoYXMgdGhlCiAgLy8vIG5hbWUuICBJbiBjYXNlIHRoZSBsaXN0IGNvbnRhaW5zIG11bHRpcGxlIG1lbWJlcnMgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwKICAvLy8gdGhlIG9uZSB0aGF0IG9jY3VycyBmaXJzdCBpbiB0aGUgbGlzdCBpcyByZXR1cm5lZC4KICAvLy8KICAvLy8gVGhlIGxpc3QgaXMgYXNzdW1lZCB0byBiZSBzb3J0ZWQgYWNjb3JkaW5nIHRvIFtjb21wYXJlTWVtYmVyc10uCiAgc3RhdGljIE1lbWJlciBmaW5kTWVtYmVyQnlOYW1lKExpc3Q8TWVtYmVyPiBtZW1iZXJzLCBOYW1lIG5hbWUpIHsKICAgIGludCBsb3cgPSAwLCBoaWdoID0gbWVtYmVycy5sZW5ndGggLSAxOwogICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgIGludCBtaWQgPSBsb3cgKyAoKGhpZ2ggLSBsb3cpID4+IDEpOwogICAgICBNZW1iZXIgcGl2b3QgPSBtZW1iZXJzW21pZF07CiAgICAgIGludCBjb21wYXJpc29uID0gY29tcGFyZU5hbWVzKG5hbWUsIHBpdm90Lm5hbWUpOwogICAgICBpZiAoY29tcGFyaXNvbiA8IDApIHsKICAgICAgICBoaWdoID0gbWlkIC0gMTsKICAgICAgfSBlbHNlIGlmIChjb21wYXJpc29uID4gMCkgewogICAgICAgIGxvdyA9IG1pZCArIDE7CiAgICAgIH0gZWxzZSBpZiAoaGlnaCAhPSBtaWQpIHsKICAgICAgICAvLyBFbnN1cmUgd2UgZmluZCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gbmFtZS4KICAgICAgICBoaWdoID0gbWlkOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBwaXZvdDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBDbGFzc0hpZXJhcmNoeVN1YnR5cGVzIHsKICAvLy8gUmV0dXJucyB0aGUgc3VidHlwZXMgb2YgW2NsYXNzX10gYXMgYW4gaW50ZXJ2YWwgbGlzdC4KICBDbGFzc1NldCBnZXRTdWJ0eXBlc09mKENsYXNzIGNsYXNzXyk7CgogIC8vLyBSZXR1cm5zIHRoZSBzaW5nbGUgY29uY3JldGUgdGFyZ2V0IGZvciBpbnZvY2F0aW9uIG9mIHRoZSBnaXZlbiBpbnRlcmZhY2UKICAvLy8gdGFyZ2V0LCBvciBgbnVsbGAgaWYgaXQgY291bGQgbm90IGJlIHJlc29sdmVkIG9yIHRoZXJlIGFyZSBtdWx0aXBsZQogIC8vLyBwb3NzaWJsZSB0YXJnZXRzLgogIE1lbWJlciBnZXRTaW5nbGVUYXJnZXRGb3JJbnRlcmZhY2VJbnZvY2F0aW9uKE1lbWJlciBpbnRlcmZhY2VUYXJnZXQsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KTsKfQoKY2xhc3MgX0NsYXNzSW5mb1N1YnR5cGUgewogIGZpbmFsIF9DbGFzc0luZm8gY2xhc3NJbmZvOwogIGludCB0b3BEb3duSW5kZXggPSAtMTsKCiAgLy8vIFRvcC1kb3duIGluZGljZXMgb2YgYWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcywgcmVwcmVzZW50ZWQgYXMKICAvLy8gaW50ZXJsZWF2ZWQgYmVnaW4vZW5kIGludGVydmFsIGVuZCBwb2ludHMuCiAgVWludDMyTGlzdCBzdWJ0eXBlSW50ZXJ2YWxMaXN0OwoKICBfQ2xhc3NJbmZvU3VidHlwZSh0aGlzLmNsYXNzSW5mbyk7Cn0KCmNsYXNzIF9DbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5U3VidHlwZXMgaW1wbGVtZW50cyBDbGFzc0hpZXJhcmNoeVN1YnR5cGVzIHsKICBmaW5hbCBDbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeTsKICBmaW5hbCBMaXN0PENsYXNzPiBfY2xhc3Nlc0J5VG9wRG93bkluZGV4OwogIGZpbmFsIE1hcDxDbGFzcywgX0NsYXNzSW5mb1N1YnR5cGU+IF9pbmZvTWFwID0gPENsYXNzLCBfQ2xhc3NJbmZvU3VidHlwZT57fTsKICBib29sIGludmFsaWRhdGVkID0gZmFsc2U7CgogIF9DbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5U3VidHlwZXModGhpcy5oaWVyYXJjaHkpCiAgICAgIDogX2NsYXNzZXNCeVRvcERvd25JbmRleCA9IG5ldyBMaXN0PENsYXNzPihoaWVyYXJjaHkuX2luZm9NYXAubGVuZ3RoKSB7CiAgICBoaWVyYXJjaHkuYWxsQmV0c09mZiA9IHRydWU7CiAgICBpZiAoaGllcmFyY2h5Ll9pbmZvTWFwLmlzTm90RW1wdHkpIHsKICAgICAgZm9yIChDbGFzcyBjbGFzc18gaW4gaGllcmFyY2h5Ll9pbmZvTWFwLmtleXMpIHsKICAgICAgICBfaW5mb01hcFtjbGFzc19dID0gbmV3IF9DbGFzc0luZm9TdWJ0eXBlKGhpZXJhcmNoeS5faW5mb01hcFtjbGFzc19dKTsKICAgICAgfQoKICAgICAgX3RvcERvd25Tb3J0VmlzaXQoX2luZm9NYXBbaGllcmFyY2h5Ll9pbmZvTWFwLmtleXMuZmlyc3RdKTsKICAgIH0KICB9CgogIC8vLyBEb3dud2FyZHMgdHJhdmVyc2FsIG9mIHRoZSBjbGFzcyBoaWVyYXJjaHkgdGhhdCBvcmRlcnMgY2xhc3NlcyBzbyBsb2NhbAogIC8vLyBoaWVyYXJjaGllcyBoYXZlIGNvbnRpZ3VvdXMgaW5kaWNlcy4KICBpbnQgX3RvcERvd25Tb3J0SW5kZXggPSAwOwogIHZvaWQgX3RvcERvd25Tb3J0VmlzaXQoX0NsYXNzSW5mb1N1YnR5cGUgc3ViSW5mbykgewogICAgaWYgKHN1YkluZm8udG9wRG93bkluZGV4ICE9IC0xKSByZXR1cm47CiAgICBpbnQgaW5kZXggPSBfdG9wRG93blNvcnRJbmRleCsrOwogICAgc3ViSW5mby50b3BEb3duSW5kZXggPSBpbmRleDsKICAgIF9jbGFzc2VzQnlUb3BEb3duSW5kZXhbaW5kZXhdID0gc3ViSW5mby5jbGFzc0luZm8uY2xhc3NOb2RlOwogICAgdmFyIHN1YnR5cGVTZXRCdWlsZGVyID0gbmV3IF9JbnRlcnZhbExpc3RCdWlsZGVyKCkuLmFkZFNpbmdsZXRvbihpbmRleCk7CiAgICBmb3IgKF9DbGFzc0luZm8gc3VidHlwZSBpbiBzdWJJbmZvLmNsYXNzSW5mby5kaXJlY3RFeHRlbmRlcnMpIHsKICAgICAgX0NsYXNzSW5mb1N1YnR5cGUgc3VidHlwZUluZm8gPSBfaW5mb01hcFtzdWJ0eXBlLmNsYXNzTm9kZV07CiAgICAgIF90b3BEb3duU29ydFZpc2l0KHN1YnR5cGVJbmZvKTsKICAgICAgc3VidHlwZVNldEJ1aWxkZXIuYWRkSW50ZXJ2YWxMaXN0KHN1YnR5cGVJbmZvLnN1YnR5cGVJbnRlcnZhbExpc3QpOwogICAgfQogICAgZm9yIChfQ2xhc3NJbmZvIHN1YnR5cGUgaW4gc3ViSW5mby5jbGFzc0luZm8uZGlyZWN0TWl4ZXJzKSB7CiAgICAgIF9DbGFzc0luZm9TdWJ0eXBlIHN1YnR5cGVJbmZvID0gX2luZm9NYXBbc3VidHlwZS5jbGFzc05vZGVdOwogICAgICBfdG9wRG93blNvcnRWaXNpdChzdWJ0eXBlSW5mbyk7CiAgICAgIHN1YnR5cGVTZXRCdWlsZGVyLmFkZEludGVydmFsTGlzdChzdWJ0eXBlSW5mby5zdWJ0eXBlSW50ZXJ2YWxMaXN0KTsKICAgIH0KICAgIGZvciAoX0NsYXNzSW5mbyBzdWJ0eXBlIGluIHN1YkluZm8uY2xhc3NJbmZvLmRpcmVjdEltcGxlbWVudGVycykgewogICAgICBfQ2xhc3NJbmZvU3VidHlwZSBzdWJ0eXBlSW5mbyA9IF9pbmZvTWFwW3N1YnR5cGUuY2xhc3NOb2RlXTsKICAgICAgX3RvcERvd25Tb3J0VmlzaXQoc3VidHlwZUluZm8pOwogICAgICBzdWJ0eXBlU2V0QnVpbGRlci5hZGRJbnRlcnZhbExpc3Qoc3VidHlwZUluZm8uc3VidHlwZUludGVydmFsTGlzdCk7CiAgICB9CiAgICBzdWJJbmZvLnN1YnR5cGVJbnRlcnZhbExpc3QgPSBzdWJ0eXBlU2V0QnVpbGRlci5idWlsZEludGVydmFsTGlzdCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldFNpbmdsZVRhcmdldEZvckludGVyZmFjZUludm9jYXRpb24oTWVtYmVyIGludGVyZmFjZVRhcmdldCwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZX0pIHsKICAgIGlmIChpbnZhbGlkYXRlZCkgdGhyb3cgIlRoaXMgZGF0YXN0cnVjdHVyZSBoYXMgYmVlbiBpbnZhbGlkYXRlZCI7CiAgICBOYW1lIG5hbWUgPSBpbnRlcmZhY2VUYXJnZXQubmFtZTsKICAgIE1lbWJlciB0YXJnZXQgPSBudWxsOwogICAgQ2xhc3NTZXQgc3VidHlwZXMgPSBnZXRTdWJ0eXBlc09mKGludGVyZmFjZVRhcmdldC5lbmNsb3NpbmdDbGFzcyk7CiAgICBmb3IgKENsYXNzIGMgaW4gc3VidHlwZXMpIHsKICAgICAgaWYgKCFjLmlzQWJzdHJhY3QpIHsKICAgICAgICBNZW1iZXIgY2FuZGlkYXRlID0gaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0KGMsIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICAgICAgICBpZiAoKGNhbmRpZGF0ZSAhPSBudWxsKSAmJiAhY2FuZGlkYXRlLmlzQWJzdHJhY3QpIHsKICAgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewogICAgICAgICAgICB0YXJnZXQgPSBjYW5kaWRhdGU7CiAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCAhPSBjYW5kaWRhdGUpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NTZXQgZ2V0U3VidHlwZXNPZihDbGFzcyBjbGFzc18pIHsKICAgIGlmIChpbnZhbGlkYXRlZCkgdGhyb3cgIlRoaXMgZGF0YXN0cnVjdHVyZSBoYXMgYmVlbiBpbnZhbGlkYXRlZCI7CiAgICBTZXQ8Q2xhc3M+IHJlc3VsdCA9IG5ldyBTZXQ8Q2xhc3M+KCk7CiAgICBVaW50MzJMaXN0IGxpc3QgPSBfaW5mb01hcFtjbGFzc19dLnN1YnR5cGVJbnRlcnZhbExpc3Q7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgaW50IGZyb20gPSBsaXN0W2ldOwogICAgICBpbnQgdG8gPSBsaXN0W2kgKyAxXTsKICAgICAgZm9yIChpbnQgaiA9IGZyb207IGogPCB0bzsgaisrKSB7CiAgICAgICAgcmVzdWx0LmFkZChfY2xhc3Nlc0J5VG9wRG93bkluZGV4W2pdKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBDbGFzc1NldChyZXN1bHQpOwogIH0KfQoKLy8vIEltcGxlbWVudGF0aW9uIG9mIFtDbGFzc0hpZXJhcmNoeV0gZm9yIGNsb3NlZCB3b3JsZC4KY2xhc3MgQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeSBpbXBsZW1lbnRzIENsYXNzSGllcmFyY2h5IHsKICBIYW5kbGVBbWJpZ3VvdXNTdXBlcnR5cGVzIF9vbkFtYmlndW91c1N1cGVydHlwZXM7CiAgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyBfb25BbWJpZ3VvdXNTdXBlcnR5cGVzTm90V3JhcHBlZDsKICBNaXhpbkluZmVycmVyIG1peGluSW5mZXJyZXI7CgogIHZvaWQgc2V0IG9uQW1iaWd1b3VzU3VwZXJ0eXBlcygKICAgICAgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyBvbkFtYmlndW91c1N1cGVydHlwZXMpIHsKICAgIF9vbkFtYmlndW91c1N1cGVydHlwZXNOb3RXcmFwcGVkID0gb25BbWJpZ3VvdXNTdXBlcnR5cGVzOwogICAgX29uQW1iaWd1b3VzU3VwZXJ0eXBlcyA9IChDbGFzcyBjbGFzc18sIFN1cGVydHlwZSBhLCBTdXBlcnR5cGUgYikgewogICAgICBvbkFtYmlndW91c1N1cGVydHlwZXMoY2xhc3NfLCBhLCBiKTsKICAgICAgTGlzdDxTdXBlcnR5cGU+IHJlY29yZGVkID0gX3JlY29yZGVkQW1iaWd1b3VzU3VwZXJ0eXBlc1tjbGFzc19dOwogICAgICBpZiAocmVjb3JkZWQgPT0gbnVsbCkgewogICAgICAgIHJlY29yZGVkID0gbmV3IExpc3Q8U3VwZXJ0eXBlPigpOwogICAgICAgIF9yZWNvcmRlZEFtYmlndW91c1N1cGVydHlwZXNbY2xhc3NfXSA9IHJlY29yZGVkOwogICAgICB9CiAgICAgIHJlY29yZGVkLmFkZChhKTsKICAgICAgcmVjb3JkZWQuYWRkKGIpOwogICAgfTsKICB9CgogIC8vLyBUaGUgaW5zZXJ0IG9yZGVyIGlzIGltcG9ydGFudC4KICBmaW5hbCBNYXA8Q2xhc3MsIF9DbGFzc0luZm8+IF9pbmZvTWFwID0KICAgICAgbmV3IExpbmtlZEhhc2hNYXA8Q2xhc3MsIF9DbGFzc0luZm8+KCk7CgogIF9DbGFzc0luZm8gaW5mb0ZvcihDbGFzcyBjKSB7CiAgICBfQ2xhc3NJbmZvIGluZm8gPSBfaW5mb01hcFtjXTsKICAgIGluZm8/LnVzZWQgPSB0cnVlOwogICAgcmV0dXJuIGluZm87CiAgfQoKICBMaXN0PENsYXNzPiBnZXRVc2VkQ2xhc3NlcygpIHsKICAgIExpc3Q8Q2xhc3M+IHJlc3VsdCA9IG5ldyBMaXN0PENsYXNzPigpOwogICAgZm9yIChfQ2xhc3NJbmZvIGNsYXNzSW5mbyBpbiBfaW5mb01hcC52YWx1ZXMpIHsKICAgICAgaWYgKGNsYXNzSW5mby51c2VkKSB7CiAgICAgICAgcmVzdWx0LmFkZChjbGFzc0luZm8uY2xhc3NOb2RlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgcmVzZXRVc2VkKCkgewogICAgZm9yIChfQ2xhc3NJbmZvIGNsYXNzSW5mbyBpbiBfaW5mb01hcC52YWx1ZXMpIHsKICAgICAgY2xhc3NJbmZvLnVzZWQgPSBmYWxzZTsKICAgIH0KICAgIGFsbEJldHNPZmYgPSBmYWxzZTsKICB9CgogIGZpbmFsIFNldDxMaWJyYXJ5PiBrbm93bkxpYnJhcmllcyA9IG5ldyBTZXQ8TGlicmFyeT4oKTsKICBib29sIGFsbEJldHNPZmYgPSBmYWxzZTsKCiAgLy8vIFJlY29yZGVkIGVycm9ycyBmb3IgY2xhc3NlcyB3ZSBoYXZlIGFscmVhZHkgY2FsY3VsYXRlZCB0aGUgY2xhc3MgaGllcmFyY2h5CiAgLy8vIGZvciwgYnV0IHdpbGwgaGF2ZSB0byBiZSByZWlzc3VlZCB3aGVuIHJlLXVzaW5nIHRoZSBjYWxjdWxhdGlvbi4KICBmaW5hbCBNYXA8Q2xhc3MsIExpc3Q8U3VwZXJ0eXBlPj4gX3JlY29yZGVkQW1iaWd1b3VzU3VwZXJ0eXBlcyA9CiAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPENsYXNzLCBMaXN0PFN1cGVydHlwZT4+KCk7CgogIEl0ZXJhYmxlPENsYXNzPiBnZXQgY2xhc3NlcyB7CiAgICBhbGxCZXRzT2ZmID0gdHJ1ZTsKICAgIHJldHVybiBfaW5mb01hcC5rZXlzOwogIH0KCiAgaW50IGdldCBudW1iZXJPZkNsYXNzZXMgewogICAgYWxsQmV0c09mZiA9IHRydWU7CiAgICByZXR1cm4gX2luZm9NYXAubGVuZ3RoOwogIH0KCiAgX0Nsb3NlZFdvcmxkQ2xhc3NIaWVyYXJjaHlTdWJ0eXBlcyBfY2FjaGVkQ2xhc3NIaWVyYXJjaHlTdWJ0eXBlczsKCiAgQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeS5faW50ZXJuYWwoCiAgICAgIEhhbmRsZUFtYmlndW91c1N1cGVydHlwZXMgb25BbWJpZ3VvdXNTdXBlcnR5cGVzLCB0aGlzLm1peGluSW5mZXJyZXIpIHsKICAgIHRoaXMub25BbWJpZ3VvdXNTdXBlcnR5cGVzID0gb25BbWJpZ3VvdXNTdXBlcnR5cGVzOwogIH0KCiAgQ2xhc3NIaWVyYXJjaHlTdWJ0eXBlcyBjb21wdXRlU3VidHlwZXNJbmZvcm1hdGlvbigpIHsKICAgIF9jYWNoZWRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzID8/PQogICAgICAgIG5ldyBfQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzKHRoaXMpOwogICAgcmV0dXJuIF9jYWNoZWRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3M+IGdldE9yZGVyZWRDbGFzc2VzKEl0ZXJhYmxlPENsYXNzPiB1bm9yZGVyZWQpIHsKICAgIHZhciB1bm9yZGVyZWRTZXQgPSB1bm9yZGVyZWQudG9TZXQoKTsKICAgIGZvciAoQ2xhc3MgYyBpbiB1bm9yZGVyZWQpIF9pbmZvTWFwW2NdPy51c2VkID0gdHJ1ZTsKICAgIHJldHVybiBfaW5mb01hcC5rZXlzLndoZXJlKHVub3JkZXJlZFNldC5jb250YWlucyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU3ViY2xhc3NPZihDbGFzcyBzdWJjbGFzcywgQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgaWYgKGlkZW50aWNhbChzdWJjbGFzcywgc3VwZXJjbGFzcykpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGluZm9Gb3Ioc3ViY2xhc3MpLmlzU3ViY2xhc3NPZihpbmZvRm9yKHN1cGVyY2xhc3MpKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNTdWJ0eXBlT2YoQ2xhc3Mgc3VidHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgaWYgKGlkZW50aWNhbChzdWJ0eXBlLCBzdXBlcmNsYXNzKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gaW5mb0ZvcihzdWJ0eXBlKS5pc1N1YnR5cGVPZihpbmZvRm9yKHN1cGVyY2xhc3MpKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNVc2VkQXNNaXhpbihDbGFzcyBjbGFzc18pIHsKICAgIHJldHVybiBpbmZvRm9yKGNsYXNzXykuZGlyZWN0TWl4ZXJzLmlzTm90RW1wdHk7CiAgfQoKICBMaXN0PF9DbGFzc0luZm8+IF9nZXRSYW5rZWRTdXBlcmNsYXNzSW5mb3MoX0NsYXNzSW5mbyBpbmZvKSB7CiAgICBpZiAoaW5mby5sZWFzdFVwcGVyQm91bmRJbmZvcyAhPSBudWxsKSByZXR1cm4gaW5mby5sZWFzdFVwcGVyQm91bmRJbmZvczsKICAgIHZhciBoZWFwID0gbmV3IF9MdWJIZWFwKCkuLmFkZChpbmZvKTsKICAgIHZhciBjaGFpbiA9IDxfQ2xhc3NJbmZvPltdOwogICAgaW5mby5sZWFzdFVwcGVyQm91bmRJbmZvcyA9IGNoYWluOwogICAgX0NsYXNzSW5mbyBsYXN0SW5mbyA9IG51bGw7CiAgICB3aGlsZSAoaGVhcC5pc05vdEVtcHR5KSB7CiAgICAgIHZhciBuZXh0SW5mbyA9IGhlYXAucmVtb3ZlKCk7CiAgICAgIGlmIChpZGVudGljYWwobmV4dEluZm8sIGxhc3RJbmZvKSkgY29udGludWU7CiAgICAgIGNoYWluLmFkZChuZXh0SW5mbyk7CiAgICAgIGxhc3RJbmZvID0gbmV4dEluZm87CiAgICAgIHZhciBjbGFzc05vZGUgPSBuZXh0SW5mby5jbGFzc05vZGU7CiAgICAgIHZvaWQgYWRkVG9IZWFwKFN1cGVydHlwZSBzdXBlcnR5cGUpIHsKICAgICAgICBoZWFwLmFkZChpbmZvRm9yKHN1cGVydHlwZS5jbGFzc05vZGUpKTsKICAgICAgfQoKICAgICAgaWYgKGNsYXNzTm9kZS5zdXBlcnR5cGUgIT0gbnVsbCkgYWRkVG9IZWFwKGNsYXNzTm9kZS5zdXBlcnR5cGUpOwogICAgICBpZiAoY2xhc3NOb2RlLm1peGVkSW5UeXBlICE9IG51bGwpIGFkZFRvSGVhcChjbGFzc05vZGUubWl4ZWRJblR5cGUpOwogICAgICBjbGFzc05vZGUuaW1wbGVtZW50ZWRUeXBlcy5mb3JFYWNoKGFkZFRvSGVhcCk7CiAgICB9CiAgICByZXR1cm4gY2hhaW47CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldExlZ2FjeUxlYXN0VXBwZXJCb3VuZCgKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlMSwgSW50ZXJmYWNlVHlwZSB0eXBlMikgewogICAgLy8gVGhlIGFsZ29yaXRobSBpczogZmlyc3Qgd2UgY29tcHV0ZSBhIGxpc3Qgb2Ygc3VwZXJjbGFzc2VzIGZvciBib3RoIHR5cGVzLAogICAgLy8gb3JkZXJlZCBmcm9tIGdyZWF0ZXN0IHRvIGxlYXN0IGRlcHRoLCBhbmQgb3JkZXJlZCBieSB0b3BvbG9naWNhbCBzb3J0CiAgICAvLyBpbmRleCB3aXRoaW4gZWFjaCBkZXB0aC4gIER1ZSB0byB0aGUgc29ydCBvcmRlciwgd2UgY2FuIGZpbmQgdGhlCiAgICAvLyBpbnRlcnNlY3Rpb24gb2YgdGhlc2UgbGlzdHMgYnkgYSBzaW1wbGUgd2Fsay4KICAgIC8vCiAgICAvLyBUaGVuLCBmb3IgZWFjaCBjbGFzcyBpbiB0aGUgaW50ZXJzZWN0aW9uLCBkZXRlcm1pbmUgdGhlIGV4YWN0IHR5cGUgdGhhdAogICAgLy8gaXMgaW1wbGVtZW50ZWQgYnkgdHlwZTEgYW5kIHR5cGUyLiAgSWYgdGhlIHR5cGVzIG1hdGNoLCB0aGF0IHR5cGUgaXMgYQogICAgLy8gY2FuZGlkYXRlIChpdCdzIGEgbWVtYmVyIG9mIFNfbikuICBBcyBzb29uIGFzIHdlIGZpbmQgYSBjYW5kaWRhdGUgd2hpY2gKICAgIC8vIGlzIHVuaXF1ZSBmb3IgaXRzIGRlcHRoLCB3ZSByZXR1cm4gaXQuCiAgICAvLwogICAgLy8gQXMgYW4gb3B0aW1pemF0aW9uLCBpZiB0aGUgY2xhc3MgZm9yIEkgaXMgYSBzdWJ0eXBlIG9mIHRoZSBjbGFzcyBmb3IgSiwKICAgIC8vIHRoZW4gd2Uga25vdyB0aGF0IHRoZSBsaXN0IG9mIHN1cGVyY2xhc3NlcyBvZiBKIGlzIGEgc3Vic2V0IG9mIHRoZSBsaXN0CiAgICAvLyBvZiBzdXBlcmNsYXNzZXMgZm9yIEk7IHRoZXJlZm9yZSBpdCBpcyBzdWZmaWNpZW50IHRvIGNvbXB1dGUganVzdCB0aGUKICAgIC8vIGxpc3Qgb2Ygc3VwZXJjbGFzc2VzIGZvciBKLiAgVG8gYXZvaWQgY29tcGxpY2F0aW5nIHRoZSBjb2RlIGJlbG93ICh3aGljaAogICAgLy8gaW50ZXJzZWN0cyB0aGUgdHdvIGxpc3RzKSwgd2Ugc2V0IGJvdGggbGlzdHMgZXF1YWwgdG8gdGhlIGxpc3Qgb2YKICAgIC8vIHN1cGVyY2xhc3NlcyBmb3IgSi4gIEFuZCB2aWNlIHZlcnNhIHdpdGggdGhlIHJvbGUgb2YgSSBhbmQgSiBzd2FwcGVkLgoKICAgIC8vIENvbXB1dGUgdGhlIGxpc3Qgb2Ygc3VwZXJjbGFzc2VzIGZvciBib3RoIHR5cGVzLCB3aXRoIHRoZSBhYm92ZQogICAgLy8gb3B0aW1pemF0aW9uLgogICAgX0NsYXNzSW5mbyBpbmZvMSA9IGluZm9Gb3IodHlwZTEuY2xhc3NOb2RlKTsKICAgIF9DbGFzc0luZm8gaW5mbzIgPSBpbmZvRm9yKHR5cGUyLmNsYXNzTm9kZSk7CiAgICBMaXN0PF9DbGFzc0luZm8+IGNsYXNzZXMxOwogICAgTGlzdDxfQ2xhc3NJbmZvPiBjbGFzc2VzMjsKICAgIGlmIChpZGVudGljYWwoaW5mbzEsIGluZm8yKSB8fCBpbmZvMS5pc1N1YnR5cGVPZihpbmZvMikpIHsKICAgICAgY2xhc3NlczEgPSBjbGFzc2VzMiA9IF9nZXRSYW5rZWRTdXBlcmNsYXNzSW5mb3MoaW5mbzIpOwogICAgfSBlbHNlIGlmIChpbmZvMi5pc1N1YnR5cGVPZihpbmZvMSkpIHsKICAgICAgY2xhc3NlczEgPSBjbGFzc2VzMiA9IF9nZXRSYW5rZWRTdXBlcmNsYXNzSW5mb3MoaW5mbzEpOwogICAgfSBlbHNlIHsKICAgICAgY2xhc3NlczEgPSBfZ2V0UmFua2VkU3VwZXJjbGFzc0luZm9zKGluZm8xKTsKICAgICAgY2xhc3NlczIgPSBfZ2V0UmFua2VkU3VwZXJjbGFzc0luZm9zKGluZm8yKTsKICAgIH0KCiAgICAvLyBXYWxrIHRoZSBsaXN0cyBmaW5kaW5nIHRoZWlyIGludGVyc2VjdGlvbiwgbG9va2luZyBmb3IgYSBkZXB0aCB0aGF0IGhhcyBhCiAgICAvLyBzaW5nbGUgY2FuZGlkYXRlLgogICAgaW50IGkxID0gMDsKICAgIGludCBpMiA9IDA7CiAgICBJbnRlcmZhY2VUeXBlIGNhbmRpZGF0ZSA9IG51bGw7CiAgICBpbnQgY3VycmVudERlcHRoID0gLTE7CiAgICBpbnQgbnVtQ2FuZGlkYXRlc0F0VGhpc0RlcHRoID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIF9DbGFzc0luZm8gbmV4dCA9IGNsYXNzZXMxW2kxXTsKICAgICAgX0NsYXNzSW5mbyBuZXh0MiA9IGNsYXNzZXMyW2kyXTsKICAgICAgaWYgKCFpZGVudGljYWwobmV4dCwgbmV4dDIpKSB7CiAgICAgICAgaWYgKF9MdWJIZWFwLnNvcnRzQmVmb3JlU3RhdGljKG5leHQsIG5leHQyKSkgewogICAgICAgICAgKytpMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgKytpMjsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgKytpMjsKICAgICAgKytpMTsKICAgICAgaWYgKG5leHQuZGVwdGggIT0gY3VycmVudERlcHRoKSB7CiAgICAgICAgaWYgKG51bUNhbmRpZGF0ZXNBdFRoaXNEZXB0aCA9PSAxKSByZXR1cm4gY2FuZGlkYXRlOwogICAgICAgIGN1cnJlbnREZXB0aCA9IG5leHQuZGVwdGg7CiAgICAgICAgbnVtQ2FuZGlkYXRlc0F0VGhpc0RlcHRoID0gMDsKICAgICAgICBjYW5kaWRhdGUgPSBudWxsOwogICAgICB9IGVsc2UgaWYgKG51bUNhbmRpZGF0ZXNBdFRoaXNEZXB0aCA+IDEpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgLy8gRm9yIGVhY2ggY2xhc3MgaW4gdGhlIGludGVyc2VjdGlvbiwgZmluZCB0aGUgZXhhY3QgdHlwZSB0aGF0IGlzCiAgICAgIC8vIGltcGxlbWVudGVkIGJ5IHR5cGUxIGFuZCB0eXBlMi4gIElmIHRoZXkgbWF0Y2gsIGl0J3MgYSBjYW5kaWRhdGUuCiAgICAgIC8vCiAgICAgIC8vIFR3byBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnM6CiAgICAgIC8vCiAgICAgIC8vIC0gSWYgdGhpcyBjbGFzcyBsYWNrcyB0eXBlIHBhcmFtZXRlcnMsIHdlIGtub3cgdGhlcmUgaXMgYSBtYXRjaCB3aXRob3V0CiAgICAgIC8vICAgbmVlZGluZyB0byBzdWJzdGl0dXRlLgogICAgICAvLwogICAgICAvLyAtIElmIHRoZSBkZXB0aCBpcyAwLCB3ZSBoYXZlIHJlYWNoZWQgT2JqZWN0LCBzbyB3ZSBjYW4gcmV0dXJuIGl0CiAgICAgIC8vICAgaW1tZWRpYXRlbHkuICBTaW5jZSBhbGwgaW50ZXJmYWNlIHR5cGVzIGFyZSBzdWJ0eXBlcyBvZiBPYmplY3QsIHRoaXMKICAgICAgLy8gICBlbnN1cmVzIHRoZSBsb29wIHRlcm1pbmF0ZXMuCiAgICAgIGlmIChuZXh0LmNsYXNzTm9kZS50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgICAgY2FuZGlkYXRlID0gbmV4dC5jbGFzc05vZGUucmF3VHlwZTsKICAgICAgICBpZiAoY3VycmVudERlcHRoID09IDApIHJldHVybiBjYW5kaWRhdGU7CiAgICAgICAgKytudW1DYW5kaWRhdGVzQXRUaGlzRGVwdGg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHN1cGVyVHlwZTEgPSBpZGVudGljYWwoaW5mbzEsIG5leHQpCiAgICAgICAgICAgID8gdHlwZTEKICAgICAgICAgICAgOiBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUodHlwZTEpLnN1YnN0aXR1dGVUeXBlKAogICAgICAgICAgICAgICAgaW5mbzEuZ2VuZXJpY1N1cGVyVHlwZXNbbmV4dC5jbGFzc05vZGVdLmZpcnN0LmFzSW50ZXJmYWNlVHlwZSk7CiAgICAgICAgdmFyIHN1cGVyVHlwZTIgPSBpZGVudGljYWwoaW5mbzIsIG5leHQpCiAgICAgICAgICAgID8gdHlwZTIKICAgICAgICAgICAgOiBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUodHlwZTIpLnN1YnN0aXR1dGVUeXBlKAogICAgICAgICAgICAgICAgaW5mbzIuZ2VuZXJpY1N1cGVyVHlwZXNbbmV4dC5jbGFzc05vZGVdLmZpcnN0LmFzSW50ZXJmYWNlVHlwZSk7CiAgICAgICAgaWYgKHN1cGVyVHlwZTEgPT0gc3VwZXJUeXBlMikgewogICAgICAgICAgY2FuZGlkYXRlID0gc3VwZXJUeXBlMTsKICAgICAgICAgICsrbnVtQ2FuZGlkYXRlc0F0VGhpc0RlcHRoOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3VwZXJ0eXBlIGdldENsYXNzQXNJbnN0YW5jZU9mKENsYXNzIGNsYXNzXywgQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgaWYgKGlkZW50aWNhbChjbGFzc18sIHN1cGVyY2xhc3MpKSByZXR1cm4gY2xhc3NfLmFzVGhpc1N1cGVydHlwZTsKICAgIF9DbGFzc0luZm8gaW5mbyA9IGluZm9Gb3IoY2xhc3NfKTsKICAgIGlmIChpbmZvID09IG51bGwpIHsKICAgICAgdGhyb3cgIiR7Y2xhc3NfLmZpbGVVcml9OiBObyBjbGFzcyBpbmZvIGZvciAke2NsYXNzXy5uYW1lfSI7CiAgICB9CiAgICBfQ2xhc3NJbmZvIHN1cGVySW5mbyA9IGluZm9Gb3Ioc3VwZXJjbGFzcyk7CiAgICBpZiAoc3VwZXJJbmZvID09IG51bGwpIHsKICAgICAgdGhyb3cgIiR7c3VwZXJjbGFzcy5maWxlVXJpfTogTm8gY2xhc3MgaW5mbyBmb3IgJHtzdXBlcmNsYXNzLm5hbWV9IjsKICAgIH0KICAgIGlmICghaW5mby5pc1N1YnR5cGVPZihzdXBlckluZm8pKSByZXR1cm4gbnVsbDsKICAgIGlmIChzdXBlcmNsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybiBzdXBlcmNsYXNzLmFzUmF3U3VwZXJ0eXBlOwogICAgcmV0dXJuIGluZm8uZ2VuZXJpY1N1cGVyVHlwZXNbc3VwZXJjbGFzc10/LmZpcnN0OwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRUeXBlQXNJbnN0YW5jZU9mKEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgU3VwZXJ0eXBlIGNhc3RlZFR5cGUgPSBnZXRDbGFzc0FzSW5zdGFuY2VPZih0eXBlLmNsYXNzTm9kZSwgc3VwZXJjbGFzcyk7CiAgICBpZiAoY2FzdGVkVHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUodHlwZSkKICAgICAgICAuc3Vic3RpdHV0ZVR5cGUoY2FzdGVkVHlwZS5hc0ludGVyZmFjZVR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldERpc3BhdGNoVGFyZ2V0KENsYXNzIGNsYXNzXywgTmFtZSBuYW1lLCB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSkgewogICAgX0NsYXNzSW5mbyBpbmZvID0gaW5mb0ZvcihjbGFzc18pOwogICAgTGlzdDxNZW1iZXI+IGxpc3QgPQogICAgICAgIHNldHRlciA/IGluZm8uaW1wbGVtZW50ZWRTZXR0ZXJzIDogaW5mby5pbXBsZW1lbnRlZEdldHRlcnNBbmRDYWxsczsKICAgIHJldHVybiBDbGFzc0hpZXJhcmNoeS5maW5kTWVtYmVyQnlOYW1lKGxpc3QsIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxNZW1iZXI+IGdldERpc3BhdGNoVGFyZ2V0cyhDbGFzcyBjbGFzc18sIHtib29sIHNldHRlcnM6IGZhbHNlfSkgewogICAgX0NsYXNzSW5mbyBpbmZvID0gaW5mb0ZvcihjbGFzc18pOwogICAgcmV0dXJuIHNldHRlcnMgPyBpbmZvLmltcGxlbWVudGVkU2V0dGVycyA6IGluZm8uaW1wbGVtZW50ZWRHZXR0ZXJzQW5kQ2FsbHM7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXIgZ2V0SW50ZXJmYWNlTWVtYmVyKENsYXNzIGNsYXNzXywgTmFtZSBuYW1lLCB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSkgewogICAgTGlzdDxNZW1iZXI+IGxpc3QgPSBnZXRJbnRlcmZhY2VNZW1iZXJzKGNsYXNzXywgc2V0dGVyczogc2V0dGVyKTsKICAgIHJldHVybiBDbGFzc0hpZXJhcmNoeS5maW5kTWVtYmVyQnlOYW1lKGxpc3QsIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxNZW1iZXI+IGdldEludGVyZmFjZU1lbWJlcnMoQ2xhc3MgY2xhc3NfLCB7Ym9vbCBzZXR0ZXJzOiBmYWxzZX0pIHsKICAgIHJldHVybiBfYnVpbGRJbnRlcmZhY2VNZW1iZXJzKGNsYXNzXywgaW5mb0ZvcihjbGFzc18pLCBzZXR0ZXJzOiBzZXR0ZXJzKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8TWVtYmVyPiBnZXREZWNsYXJlZE1lbWJlcnMoQ2xhc3MgY2xhc3NfLCB7Ym9vbCBzZXR0ZXJzOiBmYWxzZX0pIHsKICAgIHZhciBpbmZvID0gaW5mb0ZvcihjbGFzc18pOwogICAgcmV0dXJuIHNldHRlcnMgPyBpbmZvLmRlY2xhcmVkU2V0dGVycyA6IGluZm8uZGVjbGFyZWRHZXR0ZXJzQW5kQ2FsbHM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hPdmVycmlkZVBhaXIoQ2xhc3MgY2xhc3NfLAogICAgICBjYWxsYmFjayhNZW1iZXIgZGVjbGFyZWRNZW1iZXIsIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsIGJvb2wgaXNTZXR0ZXIpLAogICAgICB7Ym9vbCBjcm9zc0dldHRlcnNTZXR0ZXJzOiBmYWxzZX0pIHsKICAgIF9DbGFzc0luZm8gaW5mbyA9IGluZm9Gb3IoY2xhc3NfKTsKICAgIGZvciAodmFyIHN1cGVydHlwZSBpbiBjbGFzc18uc3VwZXJzKSB7CiAgICAgIHZhciBzdXBlcmNsYXNzID0gc3VwZXJ0eXBlLmNsYXNzTm9kZTsKICAgICAgdmFyIHN1cGVyR2V0dGVycyA9IGdldEludGVyZmFjZU1lbWJlcnMoc3VwZXJjbGFzcyk7CiAgICAgIHZhciBzdXBlclNldHRlcnMgPSBnZXRJbnRlcmZhY2VNZW1iZXJzKHN1cGVyY2xhc3MsIHNldHRlcnM6IHRydWUpOwogICAgICBfcmVwb3J0T3ZlcnJpZGVzKGluZm8uZGVjbGFyZWRHZXR0ZXJzQW5kQ2FsbHMsIHN1cGVyR2V0dGVycywgY2FsbGJhY2spOwogICAgICBfcmVwb3J0T3ZlcnJpZGVzKGluZm8uZGVjbGFyZWRTZXR0ZXJzLCBzdXBlclNldHRlcnMsIGNhbGxiYWNrLAogICAgICAgICAgaXNTZXR0ZXI6IHRydWUpOwogICAgfQogIH0KCiAgc3RhdGljIHZvaWQgX3JlcG9ydE92ZXJyaWRlcygKICAgICAgTGlzdDxNZW1iZXI+IGRlY2xhcmVkTGlzdCwKICAgICAgTGlzdDxNZW1iZXI+IGluaGVyaXRlZExpc3QsCiAgICAgIGNhbGxiYWNrKE1lbWJlciBkZWNsYXJlZE1lbWJlciwgTWVtYmVyIGludGVyZmFjZU1lbWJlciwgYm9vbCBpc1NldHRlciksCiAgICAgIHtib29sIGlzU2V0dGVyOiBmYWxzZX0pIHsKICAgIGludCBpID0gMCwgaiA9IDA7CiAgICB3aGlsZSAoaSA8IGRlY2xhcmVkTGlzdC5sZW5ndGggJiYgaiA8IGluaGVyaXRlZExpc3QubGVuZ3RoKSB7CiAgICAgIE1lbWJlciBkZWNsYXJlZCA9IGRlY2xhcmVkTGlzdFtpXTsKICAgICAgTWVtYmVyIGluaGVyaXRlZCA9IGluaGVyaXRlZExpc3Rbal07CiAgICAgIGludCBjb21wYXJpc29uID0gQ2xhc3NIaWVyYXJjaHkuY29tcGFyZU1lbWJlcnMoZGVjbGFyZWQsIGluaGVyaXRlZCk7CiAgICAgIGlmIChjb21wYXJpc29uIDwgMCkgewogICAgICAgICsraTsKICAgICAgfSBlbHNlIGlmIChjb21wYXJpc29uID4gMCkgewogICAgICAgICsrajsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIWlkZW50aWNhbChkZWNsYXJlZCwgaW5oZXJpdGVkKSkgewogICAgICAgICAgY2FsbGJhY2soZGVjbGFyZWQsIGluaGVyaXRlZCwgaXNTZXR0ZXIpOwogICAgICAgIH0KICAgICAgICAvLyBBIGdpdmVuIGRlY2xhcmVkIG1lbWJlciBtYXkgb3ZlcnJpZGUgbXVsdGlwbGUgaW50ZXJmYWNlIG1lbWJlcnMsCiAgICAgICAgLy8gc28gb25seSBtb3ZlIHBhc3QgdGhlIGludGVyZmFjZSBtZW1iZXIuCiAgICAgICAgKytqOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PFN1cGVydHlwZT4gZ2VuZXJpY1N1cGVydHlwZXNPZihDbGFzcyBjbGFzc18pIHsKICAgIGZpbmFsIHN1cGVydHlwZXMgPSBpbmZvRm9yKGNsYXNzXykuZ2VuZXJpY1N1cGVyVHlwZXM7CiAgICBpZiAoc3VwZXJ0eXBlcyA9PSBudWxsKSByZXR1cm4gY29uc3QgPFN1cGVydHlwZT5bXTsKICAgIC8vIE11bHRpcGxlIHN1cGVydHlwZXMgY2FuIGFyaXNlIGZyb20gYW1iaWd1b3VzIHN1cGVydHlwZXMuIFRoZSBmaXJzdAogICAgLy8gc3VwZXJ0eXBlIGlzIHRoZSByZWFsIG9uZTsgdGhlIG90aGVycyBhcmUgcHVyZWx5IGluZm9ybWF0aW9uYWwuCiAgICByZXR1cm4gc3VwZXJ0eXBlcy52YWx1ZXMubWFwKCh2KSA9PiB2LmZpcnN0KS50b0xpc3QoKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzSGllcmFyY2h5IGFwcGx5VHJlZUNoYW5nZXMoSXRlcmFibGU8TGlicmFyeT4gcmVtb3ZlZExpYnJhcmllcywKICAgICAgSXRlcmFibGU8TGlicmFyeT4gZW5zdXJlS25vd25MaWJyYXJpZXMsCiAgICAgIHtDb21wb25lbnQgcmVpc3N1ZUFtYmlndW91c1N1cGVydHlwZXNGb3J9KSB7CiAgICAvLyBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJlbW92ZWQgY2xhc3Nlcy4KICAgIGZvciAoTGlicmFyeSBsaWIgaW4gcmVtb3ZlZExpYnJhcmllcykgewogICAgICBpZiAoIWtub3duTGlicmFyaWVzLmNvbnRhaW5zKGxpYikpIGNvbnRpbnVlOwogICAgICBmb3IgKENsYXNzIGNsYXNzXyBpbiBsaWIuY2xhc3NlcykgewogICAgICAgIF9DbGFzc0luZm8gaW5mbyA9IF9pbmZvTWFwW2NsYXNzX107CiAgICAgICAgaWYgKGNsYXNzXy5zdXBlcnR5cGUgIT0gbnVsbCkgewogICAgICAgICAgX2luZm9NYXBbY2xhc3NfLnN1cGVydHlwZS5jbGFzc05vZGVdPy5kaXJlY3RFeHRlbmRlcnM/LnJlbW92ZShpbmZvKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNsYXNzXy5taXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgICAgICBfaW5mb01hcFtjbGFzc18ubWl4ZWRJblR5cGUuY2xhc3NOb2RlXT8uZGlyZWN0TWl4ZXJzPy5yZW1vdmUoaW5mbyk7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIHN1cGVydHlwZSBpbiBjbGFzc18uaW1wbGVtZW50ZWRUeXBlcykgewogICAgICAgICAgX2luZm9NYXBbc3VwZXJ0eXBlLmNsYXNzTm9kZV0/LmRpcmVjdEltcGxlbWVudGVycz8ucmVtb3ZlKGluZm8pOwogICAgICAgIH0KCiAgICAgICAgX2luZm9NYXAucmVtb3ZlKGNsYXNzXyk7CiAgICAgICAgX3JlY29yZGVkQW1iaWd1b3VzU3VwZXJ0eXBlcy5yZW1vdmUoY2xhc3NfKTsKICAgICAgfQogICAgICBrbm93bkxpYnJhcmllcy5yZW1vdmUobGliKTsKICAgIH0KCiAgICAvLyBJZiB3ZSBoYXZlIGEgY2FjaGVkIGNvbXB1dGF0aW9uIG9mIHN1YnR5cGVzLCBpbnZhbGlkYXRlIGl0IGFuZCBzdG9wCiAgICAvLyBjYWNoaW5nIGl0LgogICAgaWYgKF9jYWNoZWRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzICE9IG51bGwpIHsKICAgICAgX2NhY2hlZENsYXNzSGllcmFyY2h5U3VidHlwZXMuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgfQoKICAgIGlmIChfcmVjb3JkZWRBbWJpZ3VvdXNTdXBlcnR5cGVzLmlzTm90RW1wdHkgJiYKICAgICAgICByZWlzc3VlQW1iaWd1b3VzU3VwZXJ0eXBlc0ZvciAhPSBudWxsKSB7CiAgICAgIFNldDxMaWJyYXJ5PiBsaWJzID0KICAgICAgICAgIG5ldyBTZXQ8TGlicmFyeT4uZnJvbShyZWlzc3VlQW1iaWd1b3VzU3VwZXJ0eXBlc0Zvci5saWJyYXJpZXMpOwogICAgICBmb3IgKENsYXNzIGNsYXNzXyBpbiBfcmVjb3JkZWRBbWJpZ3VvdXNTdXBlcnR5cGVzLmtleXMpIHsKICAgICAgICBpZiAoIWxpYnMuY29udGFpbnMoY2xhc3NfLmVuY2xvc2luZ0xpYnJhcnkpKSBjb250aW51ZTsKICAgICAgICBMaXN0PFN1cGVydHlwZT4gcmVjb3JkZWQgPSBfcmVjb3JkZWRBbWJpZ3VvdXNTdXBlcnR5cGVzW2NsYXNzX107CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvcmRlZC5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgX29uQW1iaWd1b3VzU3VwZXJ0eXBlc05vdFdyYXBwZWQoCiAgICAgICAgICAgICAgY2xhc3NfLCByZWNvcmRlZFtpXSwgcmVjb3JkZWRbaSArIDFdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBBZGQgdGhlIG5ldyBjbGFzc2VzLgogICAgTGlzdDxDbGFzcz4gYWRkZWRDbGFzc2VzU29ydGVkID0gbmV3IExpc3Q8Q2xhc3M+KCk7CiAgICBpbnQgZXhwZWN0ZWRTdGFydEluZGV4ID0gX3RvcFNvcnRJbmRleDsKICAgIGZvciAoTGlicmFyeSBsaWIgaW4gZW5zdXJlS25vd25MaWJyYXJpZXMpIHsKICAgICAgaWYgKGtub3duTGlicmFyaWVzLmNvbnRhaW5zKGxpYikpIGNvbnRpbnVlOwogICAgICBmb3IgKENsYXNzIGNsYXNzXyBpbiBsaWIuY2xhc3NlcykgewogICAgICAgIF90b3BvbG9naWNhbFNvcnRWaXNpdChjbGFzc18sIG5ldyBTZXQ8Q2xhc3M+KCksCiAgICAgICAgICAgIG9yZGVyZWRMaXN0OiBhZGRlZENsYXNzZXNTb3J0ZWQpOwogICAgICB9CiAgICAgIGtub3duTGlicmFyaWVzLmFkZChsaWIpOwogICAgfQogICAgX2luaXRpYWxpemVUb3BvbG9naWNhbGx5U29ydGVkQ2xhc3NlcygKICAgICAgICBhZGRlZENsYXNzZXNTb3J0ZWQsIGV4cGVjdGVkU3RhcnRJbmRleCk7CgogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0hpZXJhcmNoeSBhcHBseU1lbWJlckNoYW5nZXMoSXRlcmFibGU8Q2xhc3M+IGNsYXNzZXMsCiAgICAgIHtib29sIGZpbmREZXNjZW5kYW50czogZmFsc2V9KSB7CiAgICBpZiAoY2xhc3Nlcy5pc0VtcHR5KSByZXR1cm4gdGhpczsKCiAgICBMaXN0PF9DbGFzc0luZm8+IGluZm9zID0gbmV3IExpc3Q8X0NsYXNzSW5mbz4oKTsKICAgIGlmIChmaW5kRGVzY2VuZGFudHMpIHsKICAgICAgU2V0PF9DbGFzc0luZm8+IHByb2Nlc3NlZENsYXNzZXMgPSBuZXcgU2V0PF9DbGFzc0luZm8+KCk7CiAgICAgIExpc3Q8X0NsYXNzSW5mbz4gd29ya2xpc3QgPSA8X0NsYXNzSW5mbz5bXTsKICAgICAgZm9yIChDbGFzcyBjbGFzc18gaW4gY2xhc3NlcykgewogICAgICAgIF9DbGFzc0luZm8gaW5mbyA9IGluZm9Gb3IoY2xhc3NfKTsKICAgICAgICB3b3JrbGlzdC5hZGQoaW5mbyk7CiAgICAgIH0KCiAgICAgIHdoaWxlICh3b3JrbGlzdC5pc05vdEVtcHR5KSB7CiAgICAgICAgX0NsYXNzSW5mbyBpbmZvID0gd29ya2xpc3QucmVtb3ZlTGFzdCgpOwogICAgICAgIGlmIChwcm9jZXNzZWRDbGFzc2VzLmFkZChpbmZvKSkgewogICAgICAgICAgd29ya2xpc3QuYWRkQWxsKGluZm8uZGlyZWN0RXh0ZW5kZXJzKTsKICAgICAgICAgIHdvcmtsaXN0LmFkZEFsbChpbmZvLmRpcmVjdEltcGxlbWVudGVycyk7CiAgICAgICAgICB3b3JrbGlzdC5hZGRBbGwoaW5mby5kaXJlY3RNaXhlcnMpOwogICAgICAgIH0KICAgICAgfQogICAgICBpbmZvcy5hZGRBbGwocHJvY2Vzc2VkQ2xhc3Nlcyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKENsYXNzIGNsYXNzXyBpbiBjbGFzc2VzKSB7CiAgICAgICAgX0NsYXNzSW5mbyBpbmZvID0gaW5mb0ZvcihjbGFzc18pOwogICAgICAgIGluZm9zLmFkZChpbmZvKTsKICAgICAgfQogICAgfQoKICAgIGluZm9zLnNvcnQoKF9DbGFzc0luZm8gYSwgX0NsYXNzSW5mbyBiKSB7CiAgICAgIHJldHVybiBhLnRvcG9sb2dpY2FsSW5kZXggLSBiLnRvcG9sb2dpY2FsSW5kZXg7CiAgICB9KTsKCiAgICBmb3IgKF9DbGFzc0luZm8gaW5mbyBpbiBpbmZvcykgewogICAgICBDbGFzcyBjbGFzc18gPSBpbmZvLmNsYXNzTm9kZTsKICAgICAgX2J1aWxkRGVjbGFyZWRNZW1iZXJzKGNsYXNzXywgaW5mbyk7CiAgICAgIF9idWlsZEltcGxlbWVudGVkTWVtYmVycyhjbGFzc18sIGluZm8pOwogICAgICBpbmZvLmludGVyZmFjZVNldHRlcnMgPSBudWxsOwogICAgICBpbmZvLmludGVyZmFjZUdldHRlcnNBbmRDYWxscyA9IG51bGw7CiAgICAgIF9idWlsZEludGVyZmFjZU1lbWJlcnMoY2xhc3NfLCBpbmZvLCBzZXR0ZXJzOiB0cnVlKTsKICAgICAgX2J1aWxkSW50ZXJmYWNlTWVtYmVycyhjbGFzc18sIGluZm8sIHNldHRlcnM6IGZhbHNlKTsKICAgIH0KCiAgICBhc3NlcnQoc2FuaXR5Q2hlY2tBbHNvS25vd3NQYXJlbnRBbmRMaWJyYXJ5KCkpOwoKICAgIHJldHVybiB0aGlzOwogIH0KCiAgYm9vbCBzYW5pdHlDaGVja0Fsc29Lbm93c1BhcmVudEFuZExpYnJhcnkoKSB7CiAgICBmb3IgKENsYXNzIGMgaW4gX2luZm9NYXAua2V5cykgewogICAgICBpZiAoIWtub3duTGlicmFyaWVzLmNvbnRhaW5zKGMuZW5jbG9zaW5nTGlicmFyeSkpIHsKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiRGlkbid0IGtub3cgbGlicmFyeSBvZiAkYyAoZnJvbSAke2MuZmlsZVVyaX0pIik7CiAgICAgIH0KICAgICAgaWYgKGMuc3VwZXJ0eXBlICE9IG51bGwgJiYgX2luZm9NYXBbYy5zdXBlcnR5cGUuY2xhc3NOb2RlXSA9PSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIkRpZG4ndCBrbm93IHBhcmVudCBvZiAkYyAoZnJvbSAke2MuZmlsZVVyaX0pIik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgU3VwZXJ0eXBlIGFzSW5zdGFudGlhdGlvbk9mKFN1cGVydHlwZSB0eXBlLCBDbGFzcyBzdXBlcmNsYXNzKSB7CiAgICAvLyBUaGlzIGlzIHNpbWlsYXIgdG8gZ2V0VHlwZUFzSW5zdGFuY2VPZiwgZXhjZXB0IHRoYXQgaXQgYXNzdW1lcyB0aGF0CiAgICAvLyBzdXBlcmNsYXNzIGlzIGEgZ2VuZXJpYyBjbGFzcy4gIEl0IHRodXMgZG9lcyBub3QgcmVseSBvbiBiZWluZyBhYmxlCiAgICAvLyB0byBhbnN3ZXIgaXNTdWJ0eXBlT2YgcXVlcmllcyBhbmQgc28gY2FuIGJlIHVzZWQgYmVmb3JlIHdlIGhhdmUgYnVpbHQKICAgIC8vIHRoZSBpbnRlcnZhbHMgbmVlZGVkIGZvciB0aG9zZSBxdWVyaWVzLgogICAgYXNzZXJ0KHN1cGVyY2xhc3MudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSk7CiAgICBpZiAodHlwZS5jbGFzc05vZGUgPT0gc3VwZXJjbGFzcykgewogICAgICByZXR1cm4gc3VwZXJjbGFzcy5hc1RoaXNTdXBlcnR5cGU7CiAgICB9CiAgICB2YXIgbWFwID0gaW5mb0Zvcih0eXBlLmNsYXNzTm9kZSk/LmdlbmVyaWNTdXBlclR5cGVzOwogICAgcmV0dXJuIG1hcCA9PSBudWxsID8gbnVsbCA6IG1hcFtzdXBlcmNsYXNzXT8uZmlyc3Q7CiAgfQoKICB2b2lkIF9pbml0aWFsaXplKExpc3Q8TGlicmFyeT4gbGlicmFyaWVzKSB7CiAgICAvLyBCdWlsZCB0aGUgY2xhc3Mgb3JkZXJpbmcgYmFzZWQgb24gYSB0b3BvbG9naWNhbCBzb3J0LgogICAgZm9yICh2YXIgbGlicmFyeSBpbiBsaWJyYXJpZXMpIHsKICAgICAgZm9yICh2YXIgY2xhc3NOb2RlIGluIGxpYnJhcnkuY2xhc3NlcykgewogICAgICAgIF90b3BvbG9naWNhbFNvcnRWaXNpdChjbGFzc05vZGUsIG5ldyBTZXQ8Q2xhc3M+KCkpOwogICAgICB9CiAgICAgIGtub3duTGlicmFyaWVzLmFkZChsaWJyYXJ5KTsKICAgIH0KCiAgICBfaW5pdGlhbGl6ZVRvcG9sb2dpY2FsbHlTb3J0ZWRDbGFzc2VzKF9pbmZvTWFwLmtleXMsIDApOwogIH0KCiAgLy8vIC0gQnVpbGQgaW5kZXggb2YgZGlyZWN0IGNoaWxkcmVuLgogIC8vLyAtIEJ1aWxkIGxpc3Qgb2Ygc3VwZXIgY2xhc3NlcyBhbmQgc3VwZXIgdHlwZXMuCiAgLy8vIC0gSW5mZXIgYW5kIHJlY29yZCBzdXBlcnR5cGVzIGZvciB0aGUgY2xhc3Nlcy4KICAvLy8gLSBSZWNvcmQgaW50ZXJmYWNlIG1lbWJlcnMuCiAgLy8vIC0gUGVyZm9ybSBzb21lIHNhbml0eSBjaGVja2luZy4KICAvLy8gRG8gdGhpcyBhZnRlciB0aGUgdG9wb2xvZ2ljYWwgc29ydCBzbyB0aGF0IHN1cGVyIHR5cGVzIGFsd2F5cyBvY2N1cgogIC8vLyBiZWZvcmUgc3VidHlwZXMuCiAgdm9pZCBfaW5pdGlhbGl6ZVRvcG9sb2dpY2FsbHlTb3J0ZWRDbGFzc2VzKAogICAgICBJdGVyYWJsZTxDbGFzcz4gY2xhc3NlcywgaW50IGV4cGVjdGVkU3RhcnRpbmdUb3BvbG9naWNhbEluZGV4KSB7CiAgICBpbnQgaSA9IGV4cGVjdGVkU3RhcnRpbmdUb3BvbG9naWNhbEluZGV4OwogICAgZm9yIChDbGFzcyBjbGFzc18gaW4gY2xhc3NlcykgewogICAgICBfQ2xhc3NJbmZvIGluZm8gPSBfaW5mb01hcFtjbGFzc19dOwogICAgICBpZiAoY2xhc3NfLnN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgICAgX2luZm9NYXBbY2xhc3NfLnN1cGVydHlwZS5jbGFzc05vZGVdLmRpcmVjdEV4dGVuZGVycy5hZGQoaW5mbyk7CiAgICAgIH0KICAgICAgaWYgKGNsYXNzXy5taXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgICAgX2luZm9NYXBbY2xhc3NfLm1peGVkSW5UeXBlLmNsYXNzTm9kZV0uZGlyZWN0TWl4ZXJzLmFkZChpbmZvKTsKICAgICAgfQogICAgICBmb3IgKHZhciBzdXBlcnR5cGUgaW4gY2xhc3NfLmltcGxlbWVudGVkVHlwZXMpIHsKICAgICAgICBfaW5mb01hcFtzdXBlcnR5cGUuY2xhc3NOb2RlXS5kaXJlY3RJbXBsZW1lbnRlcnMuYWRkKGluZm8pOwogICAgICB9CiAgICAgIF9jb2xsZWN0U3VwZXJzRm9yQ2xhc3MoY2xhc3NfKTsKCiAgICAgIGlmIChjbGFzc18uc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgICBfcmVjb3JkU3VwZXJUeXBlcyhpbmZvLCBjbGFzc18uc3VwZXJ0eXBlKTsKICAgICAgfQogICAgICBpZiAoY2xhc3NfLm1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgICBtaXhpbkluZmVycmVyPy5pbmZlcih0aGlzLCBjbGFzc18pOwogICAgICAgIF9yZWNvcmRTdXBlclR5cGVzKGluZm8sIGNsYXNzXy5taXhlZEluVHlwZSk7CiAgICAgIH0KICAgICAgZm9yIChTdXBlcnR5cGUgc3VwZXJ0eXBlIGluIGNsYXNzXy5pbXBsZW1lbnRlZFR5cGVzKSB7CiAgICAgICAgX3JlY29yZFN1cGVyVHlwZXMoaW5mbywgc3VwZXJ0eXBlKTsKICAgICAgfQoKICAgICAgX2J1aWxkSW50ZXJmYWNlTWVtYmVycyhjbGFzc18sIGluZm8sIHNldHRlcnM6IHRydWUpOwogICAgICBfYnVpbGRJbnRlcmZhY2VNZW1iZXJzKGNsYXNzXywgaW5mbywgc2V0dGVyczogZmFsc2UpOwoKICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewogICAgICAgIHRocm93ICJObyBpbmZvIGZvciAke2NsYXNzXy5uYW1lfSBmcm9tICR7Y2xhc3NfLmZpbGVVcml9LiI7CiAgICAgIH0KICAgICAgaWYgKGluZm8udG9wb2xvZ2ljYWxJbmRleCAhPSBpKSB7CiAgICAgICAgdGhyb3cgIlVuZXhwZWN0ZWQgdG9wb2xvZ2ljYWxJbmRleCAoJHtpbmZvLnRvcG9sb2dpY2FsSW5kZXh9ICE9ICRpKSAiCiAgICAgICAgICAgICJmb3IgJHtjbGFzc18ubmFtZX0gZnJvbSAke2NsYXNzXy5maWxlVXJpfS4iOwogICAgICB9CiAgICAgIGkrKzsKICAgIH0KICB9CgogIC8vLyBVcHdhcmRzIHRyYXZlcnNhbCBvZiB0aGUgY2xhc3MgaGllcmFyY2h5IHRoYXQgb3JkZXJzIGNsYXNzZXMgc28gc3VwZXIKICAvLy8gdHlwZXMgYmVmb3JlIHRoZWlyIHN1YnR5cGVzLgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSBkZXB0aCBvZiB0aGUgdmlzaXRlZCBjbGFzcyAodGhlIG51bWJlciBvZiBzdGVwcyBpbiB0aGUgbG9uZ2VzdAogIC8vLyBpbmhlcml0YW5jZSBwYXRoIHRvIHRoZSByb290IGNsYXNzKS4KICBpbnQgX3RvcFNvcnRJbmRleCA9IDA7CiAgaW50IF90b3BvbG9naWNhbFNvcnRWaXNpdChDbGFzcyBjbGFzc05vZGUsIFNldDxDbGFzcz4gYmVpbmdWaXNpdGVkLAogICAgICB7TGlzdDxDbGFzcz4gb3JkZXJlZExpc3R9KSB7CiAgICB2YXIgaW5mbyA9IF9pbmZvTWFwW2NsYXNzTm9kZV07CiAgICBpZiAoaW5mbyAhPSBudWxsKSB7CiAgICAgIHJldHVybiBpbmZvLmRlcHRoOwogICAgfQoKICAgIGlmICghYmVpbmdWaXNpdGVkLmFkZChjbGFzc05vZGUpKSB7CiAgICAgIHRocm93ICdDeWNsaWMgaW5oZXJpdGFuY2UgaW52b2x2aW5nICR7Y2xhc3NOb2RlLm5hbWV9JzsKICAgIH0KCiAgICBpbmZvID0gbmV3IF9DbGFzc0luZm8oY2xhc3NOb2RlKTsKCiAgICBpbnQgc3VwZXJEZXB0aCA9IC0xOwogICAgaWYgKGNsYXNzTm9kZS5zdXBlcnR5cGUgIT0gbnVsbCkgewogICAgICBzdXBlckRlcHRoID0gbWF4KAogICAgICAgICAgc3VwZXJEZXB0aCwKICAgICAgICAgIF90b3BvbG9naWNhbFNvcnRWaXNpdChjbGFzc05vZGUuc3VwZXJ0eXBlLmNsYXNzTm9kZSwgYmVpbmdWaXNpdGVkLAogICAgICAgICAgICAgIG9yZGVyZWRMaXN0OiBvcmRlcmVkTGlzdCkpOwogICAgfQogICAgaWYgKGNsYXNzTm9kZS5taXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgIHN1cGVyRGVwdGggPSBtYXgoCiAgICAgICAgICBzdXBlckRlcHRoLAogICAgICAgICAgX3RvcG9sb2dpY2FsU29ydFZpc2l0KGNsYXNzTm9kZS5taXhlZEluVHlwZS5jbGFzc05vZGUsIGJlaW5nVmlzaXRlZCwKICAgICAgICAgICAgICBvcmRlcmVkTGlzdDogb3JkZXJlZExpc3QpKTsKICAgIH0KICAgIGZvciAodmFyIHN1cGVydHlwZSBpbiBjbGFzc05vZGUuaW1wbGVtZW50ZWRUeXBlcykgewogICAgICBzdXBlckRlcHRoID0gbWF4KAogICAgICAgICAgc3VwZXJEZXB0aCwKICAgICAgICAgIF90b3BvbG9naWNhbFNvcnRWaXNpdChzdXBlcnR5cGUuY2xhc3NOb2RlLCBiZWluZ1Zpc2l0ZWQsCiAgICAgICAgICAgICAgb3JkZXJlZExpc3Q6IG9yZGVyZWRMaXN0KSk7CiAgICB9CiAgICBfYnVpbGREZWNsYXJlZE1lbWJlcnMoY2xhc3NOb2RlLCBpbmZvKTsKICAgIF9idWlsZEltcGxlbWVudGVkTWVtYmVycyhjbGFzc05vZGUsIGluZm8pOwogICAgaW5mby50b3BvbG9naWNhbEluZGV4ID0gX3RvcFNvcnRJbmRleCsrOwoKICAgIF9pbmZvTWFwW2NsYXNzTm9kZV0gPSBpbmZvOwogICAgb3JkZXJlZExpc3Q/LmFkZChjbGFzc05vZGUpOwogICAgYmVpbmdWaXNpdGVkLnJlbW92ZShjbGFzc05vZGUpOwogICAgcmV0dXJuIGluZm8uZGVwdGggPSBzdXBlckRlcHRoICsgMTsKICB9CgogIHZvaWQgX2J1aWxkRGVjbGFyZWRNZW1iZXJzKENsYXNzIGNsYXNzTm9kZSwgX0NsYXNzSW5mbyBpbmZvKSB7CiAgICBpZiAoY2xhc3NOb2RlLm1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgX0NsYXNzSW5mbyBtaXhlZEluZm8gPSBfaW5mb01hcFtjbGFzc05vZGUubWl4ZWRJblR5cGUuY2xhc3NOb2RlXTsKCiAgICAgIExpc3Q8TWVtYmVyPiBkZWNsYXJlZEdldHRlcnNBbmRDYWxscyA9IDxNZW1iZXI+W107CiAgICAgIGZvciAoTWVtYmVyIG1peGluTWVtYmVyIGluIG1peGVkSW5mby5kZWNsYXJlZEdldHRlcnNBbmRDYWxscykgewogICAgICAgIGlmIChtaXhpbk1lbWJlciBpcyEgUHJvY2VkdXJlIHx8CiAgICAgICAgICAgIChtaXhpbk1lbWJlciBpcyBQcm9jZWR1cmUgJiYKICAgICAgICAgICAgICAgICFtaXhpbk1lbWJlci5pc05vU3VjaE1ldGhvZEZvcndhcmRlcikpIHsKICAgICAgICAgIGRlY2xhcmVkR2V0dGVyc0FuZENhbGxzLmFkZChtaXhpbk1lbWJlcik7CiAgICAgICAgfQogICAgICB9CgogICAgICBMaXN0PE1lbWJlcj4gZGVjbGFyZWRTZXR0ZXJzID0gPE1lbWJlcj5bXTsKICAgICAgZm9yIChNZW1iZXIgbWl4aW5NZW1iZXIgaW4gbWl4ZWRJbmZvLmRlY2xhcmVkU2V0dGVycykgewogICAgICAgIGlmIChtaXhpbk1lbWJlciBpcyEgUHJvY2VkdXJlIHx8CiAgICAgICAgICAgIChtaXhpbk1lbWJlciBpcyBQcm9jZWR1cmUgJiYKICAgICAgICAgICAgICAgICFtaXhpbk1lbWJlci5pc05vU3VjaE1ldGhvZEZvcndhcmRlcikpIHsKICAgICAgICAgIGRlY2xhcmVkU2V0dGVycy5hZGQobWl4aW5NZW1iZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaW5mby5kZWNsYXJlZEdldHRlcnNBbmRDYWxscyA9IGRlY2xhcmVkR2V0dGVyc0FuZENhbGxzOwogICAgICBpbmZvLmRlY2xhcmVkU2V0dGVycyA9IGRlY2xhcmVkU2V0dGVyczsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBtZW1iZXJzID0gaW5mby5kZWNsYXJlZEdldHRlcnNBbmRDYWxscyA9IDxNZW1iZXI+W107CiAgICAgIHZhciBzZXR0ZXJzID0gaW5mby5kZWNsYXJlZFNldHRlcnMgPSA8TWVtYmVyPltdOwogICAgICBmb3IgKFByb2NlZHVyZSBwcm9jZWR1cmUgaW4gY2xhc3NOb2RlLnByb2NlZHVyZXMpIHsKICAgICAgICBpZiAocHJvY2VkdXJlLmlzU3RhdGljKSBjb250aW51ZTsKICAgICAgICBpZiAocHJvY2VkdXJlLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXIpIHsKICAgICAgICAgIHNldHRlcnMuYWRkKHByb2NlZHVyZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1lbWJlcnMuYWRkKHByb2NlZHVyZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAoRmllbGQgZmllbGQgaW4gY2xhc3NOb2RlLmZpZWxkcykgewogICAgICAgIGlmIChmaWVsZC5pc1N0YXRpYykgY29udGludWU7CiAgICAgICAgaWYgKGZpZWxkLmhhc0ltcGxpY2l0R2V0dGVyKSB7CiAgICAgICAgICBtZW1iZXJzLmFkZChmaWVsZCk7CiAgICAgICAgfQogICAgICAgIGlmIChmaWVsZC5oYXNJbXBsaWNpdFNldHRlcikgewogICAgICAgICAgc2V0dGVycy5hZGQoZmllbGQpOwogICAgICAgIH0KICAgICAgfQogICAgICBtZW1iZXJzLnNvcnQoQ2xhc3NIaWVyYXJjaHkuY29tcGFyZU1lbWJlcnMpOwogICAgICBzZXR0ZXJzLnNvcnQoQ2xhc3NIaWVyYXJjaHkuY29tcGFyZU1lbWJlcnMpOwogICAgfQogIH0KCiAgdm9pZCBfYnVpbGRJbXBsZW1lbnRlZE1lbWJlcnMoQ2xhc3MgY2xhc3NOb2RlLCBfQ2xhc3NJbmZvIGluZm8pIHsKICAgIExpc3Q8TWVtYmVyPiBpbmhlcml0ZWRNZW1iZXJzOwogICAgTGlzdDxNZW1iZXI+IGluaGVyaXRlZFNldHRlcnM7CiAgICBpZiAoY2xhc3NOb2RlLnN1cGVydHlwZSA9PSBudWxsKSB7CiAgICAgIGluaGVyaXRlZE1lbWJlcnMgPSBpbmhlcml0ZWRTZXR0ZXJzID0gY29uc3QgPE1lbWJlcj5bXTsKICAgIH0gZWxzZSB7CiAgICAgIF9DbGFzc0luZm8gc3VwZXJJbmZvID0gX2luZm9NYXBbY2xhc3NOb2RlLnN1cGVydHlwZS5jbGFzc05vZGVdOwogICAgICBpbmhlcml0ZWRNZW1iZXJzID0gc3VwZXJJbmZvLmltcGxlbWVudGVkR2V0dGVyc0FuZENhbGxzOwogICAgICBpbmhlcml0ZWRTZXR0ZXJzID0gc3VwZXJJbmZvLmltcGxlbWVudGVkU2V0dGVyczsKICAgIH0KICAgIGluZm8uaW1wbGVtZW50ZWRHZXR0ZXJzQW5kQ2FsbHMgPSBfaW5oZXJpdE1lbWJlcnMoCiAgICAgICAgaW5mby5kZWNsYXJlZEdldHRlcnNBbmRDYWxscywgaW5oZXJpdGVkTWVtYmVycywKICAgICAgICBza2lwQWJzdHJhY3RNZW1iZXJzOiB0cnVlKTsKICAgIGluZm8uaW1wbGVtZW50ZWRTZXR0ZXJzID0gX2luaGVyaXRNZW1iZXJzKAogICAgICAgIGluZm8uZGVjbGFyZWRTZXR0ZXJzLCBpbmhlcml0ZWRTZXR0ZXJzLAogICAgICAgIHNraXBBYnN0cmFjdE1lbWJlcnM6IHRydWUpOwogIH0KCiAgTGlzdDxNZW1iZXI+IF9idWlsZEludGVyZmFjZU1lbWJlcnMoQ2xhc3MgY2xhc3NOb2RlLCBfQ2xhc3NJbmZvIGluZm8sCiAgICAgIHtib29sIHNldHRlcnN9KSB7CiAgICBpZiAoaW5mbyA9PSBudWxsKSB7CiAgICAgIHRocm93ICIke2NsYXNzTm9kZS5maWxlVXJpfTogTm8gY2xhc3MgaW5mbyBmb3IgJHtjbGFzc05vZGUubmFtZX0iOwogICAgfQogICAgTGlzdDxNZW1iZXI+IG1lbWJlcnMgPQogICAgICAgIHNldHRlcnMgPyBpbmZvLmludGVyZmFjZVNldHRlcnMgOiBpbmZvLmludGVyZmFjZUdldHRlcnNBbmRDYWxsczsKICAgIGlmIChtZW1iZXJzICE9IG51bGwpIHJldHVybiBtZW1iZXJzOwogICAgTGlzdDxNZW1iZXI+IGFsbEluaGVyaXRlZE1lbWJlcnMgPSA8TWVtYmVyPltdOwogICAgTGlzdDxNZW1iZXI+IGRlY2xhcmVkID0KICAgICAgICBzZXR0ZXJzID8gaW5mby5kZWNsYXJlZFNldHRlcnMgOiBpbmZvLmRlY2xhcmVkR2V0dGVyc0FuZENhbGxzOwogICAgdm9pZCBpbmhlcml0RnJvbShTdXBlcnR5cGUgdHlwZSkgewogICAgICBpZiAodHlwZSA9PSBudWxsKSByZXR1cm47CiAgICAgIExpc3Q8TWVtYmVyPiBpbmhlcml0ZWQgPSBfYnVpbGRJbnRlcmZhY2VNZW1iZXJzKAogICAgICAgICAgdHlwZS5jbGFzc05vZGUsIF9pbmZvTWFwW3R5cGUuY2xhc3NOb2RlXSwKICAgICAgICAgIHNldHRlcnM6IHNldHRlcnMpOwogICAgICBpbmhlcml0ZWQgPSBfZ2V0VW5zaGFkb3dlZEluaGVyaXRlZE1lbWJlcnMoZGVjbGFyZWQsIGluaGVyaXRlZCk7CiAgICAgIGFsbEluaGVyaXRlZE1lbWJlcnMgPQogICAgICAgICAgQ2xhc3NIaWVyYXJjaHkubWVyZ2VTb3J0ZWRMaXN0cyhhbGxJbmhlcml0ZWRNZW1iZXJzLCBpbmhlcml0ZWQpOwogICAgfQoKICAgIGluaGVyaXRGcm9tKGNsYXNzTm9kZS5zdXBlcnR5cGUpOwogICAgaW5oZXJpdEZyb20oY2xhc3NOb2RlLm1peGVkSW5UeXBlKTsKICAgIGNsYXNzTm9kZS5pbXBsZW1lbnRlZFR5cGVzLmZvckVhY2goaW5oZXJpdEZyb20pOwogICAgbWVtYmVycyA9IF9pbmhlcml0TWVtYmVycyhkZWNsYXJlZCwgYWxsSW5oZXJpdGVkTWVtYmVycyk7CiAgICBpZiAoc2V0dGVycykgewogICAgICBpbmZvLmludGVyZmFjZVNldHRlcnMgPSBtZW1iZXJzOwogICAgfSBlbHNlIHsKICAgICAgaW5mby5pbnRlcmZhY2VHZXR0ZXJzQW5kQ2FsbHMgPSBtZW1iZXJzOwogICAgfQogICAgcmV0dXJuIG1lbWJlcnM7CiAgfQoKICAvLy8gQ29tcHV0ZXMgdGhlIGxpc3Qgb2YgaW1wbGVtZW50ZWQgbWVtYmVycywgYmFzZWQgb24gdGhlIGRlY2xhcmVkIGluc3RhbmNlCiAgLy8vIG1lbWJlcnMgYW5kIGluaGVyaXRlZCBpbnN0YW5jZSBtZW1iZXJzLgogIC8vLwogIC8vLyBCb3RoIGxpc3RzIG11c3QgYmUgc29ydGVkIGJ5IG5hbWUgYmVmb3JlaGFuZC4KICBzdGF0aWMgTGlzdDxNZW1iZXI+IF9pbmhlcml0TWVtYmVycygKICAgICAgTGlzdDxNZW1iZXI+IGRlY2xhcmVkLCBMaXN0PE1lbWJlcj4gaW5oZXJpdGVkLAogICAgICB7Ym9vbCBza2lwQWJzdHJhY3RNZW1iZXJzOiBmYWxzZX0pIHsKICAgIExpc3Q8TWVtYmVyPiByZXN1bHQgPSA8TWVtYmVyPltdLi5sZW5ndGggPQogICAgICAgIGRlY2xhcmVkLmxlbmd0aCArIGluaGVyaXRlZC5sZW5ndGg7CiAgICAvLyBTaW5jZSBib3RoIGxpc3RzIGFyZSBzb3J0ZWQsIHdlIGNhbiBmdXNlIHRoZW0gbGlrZSBpbiBtZXJnZSBzb3J0LgogICAgaW50IHN0b3JlSW5kZXggPSAwOwogICAgaW50IGkgPSAwLCBqID0gMDsKICAgIHdoaWxlIChpIDwgZGVjbGFyZWQubGVuZ3RoICYmIGogPCBpbmhlcml0ZWQubGVuZ3RoKSB7CiAgICAgIE1lbWJlciBkZWNsYXJlZE1lbWJlciA9IGRlY2xhcmVkW2ldOwogICAgICBNZW1iZXIgaW5oZXJpdGVkTWVtYmVyID0gaW5oZXJpdGVkW2pdOwogICAgICBpZiAoc2tpcEFic3RyYWN0TWVtYmVycyAmJiBkZWNsYXJlZE1lbWJlci5pc0Fic3RyYWN0KSB7CiAgICAgICAgKytpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChza2lwQWJzdHJhY3RNZW1iZXJzICYmIGluaGVyaXRlZE1lbWJlci5pc0Fic3RyYWN0KSB7CiAgICAgICAgKytqOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGludCBjb21wYXJpc29uID0KICAgICAgICAgIENsYXNzSGllcmFyY2h5LmNvbXBhcmVNZW1iZXJzKGRlY2xhcmVkTWVtYmVyLCBpbmhlcml0ZWRNZW1iZXIpOwogICAgICBpZiAoY29tcGFyaXNvbiA8IDApIHsKICAgICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IGRlY2xhcmVkTWVtYmVyOwogICAgICAgICsraTsKICAgICAgfSBlbHNlIGlmIChjb21wYXJpc29uID4gMCkgewogICAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gaW5oZXJpdGVkTWVtYmVyOwogICAgICAgICsrajsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IGRlY2xhcmVkTWVtYmVyOwogICAgICAgICsraTsKICAgICAgICArK2o7IC8vIE1vdmUgcGFzdCBvdmVycmlkZGVuIG1lbWJlci4KICAgICAgfQogICAgfQogICAgLy8gT25lIG9mIHRoZSB0d28gbGlzdHMgaXMgbm93IGV4aGF1c3RlZCwgY29weSBvdmVyIHRoZSByZW1haW5zLgogICAgd2hpbGUgKGkgPCBkZWNsYXJlZC5sZW5ndGgpIHsKICAgICAgTWVtYmVyIGRlY2xhcmVkTWVtYmVyID0gZGVjbGFyZWRbaSsrXTsKICAgICAgaWYgKHNraXBBYnN0cmFjdE1lbWJlcnMgJiYgZGVjbGFyZWRNZW1iZXIuaXNBYnN0cmFjdCkgY29udGludWU7CiAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gZGVjbGFyZWRNZW1iZXI7CiAgICB9CiAgICB3aGlsZSAoaiA8IGluaGVyaXRlZC5sZW5ndGgpIHsKICAgICAgTWVtYmVyIGluaGVyaXRlZE1lbWJlciA9IGluaGVyaXRlZFtqKytdOwogICAgICBpZiAoc2tpcEFic3RyYWN0TWVtYmVycyAmJiBpbmhlcml0ZWRNZW1iZXIuaXNBYnN0cmFjdCkgY29udGludWU7CiAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gaW5oZXJpdGVkTWVtYmVyOwogICAgfQogICAgcmVzdWx0Lmxlbmd0aCA9IHN0b3JlSW5kZXg7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHN1YnNldCBvZiBtZW1iZXJzIGluIFtpbmhlcml0ZWRdIGZvciB3aGljaCBhIG1lbWJlciB3aXRoIHRoZQogIC8vLyBzYW1lIG5hbWUgZG9lcyBub3Qgb2NjdXIgaW4gW2RlY2xhcmVkXS4KICAvLy8KICAvLy8gVGhlIGlucHV0IGxpc3RzIG11c3QgYmUgc29ydGVkLCBhbmQgdGhlIHJldHVybmVkIGxpc3QgaXMgc29ydGVkLgogIHN0YXRpYyBMaXN0PE1lbWJlcj4gX2dldFVuc2hhZG93ZWRJbmhlcml0ZWRNZW1iZXJzKAogICAgICBMaXN0PE1lbWJlcj4gZGVjbGFyZWQsIExpc3Q8TWVtYmVyPiBpbmhlcml0ZWQpIHsKICAgIExpc3Q8TWVtYmVyPiByZXN1bHQgPSA8TWVtYmVyPltdLi5sZW5ndGggPSBpbmhlcml0ZWQubGVuZ3RoOwogICAgaW50IHN0b3JlSW5kZXggPSAwOwogICAgaW50IGkgPSAwLCBqID0gMDsKICAgIHdoaWxlIChpIDwgZGVjbGFyZWQubGVuZ3RoICYmIGogPCBpbmhlcml0ZWQubGVuZ3RoKSB7CiAgICAgIE1lbWJlciBkZWNsYXJlZE1lbWJlciA9IGRlY2xhcmVkW2ldOwogICAgICBNZW1iZXIgaW5oZXJpdGVkTWVtYmVyID0gaW5oZXJpdGVkW2pdOwogICAgICBpbnQgY29tcGFyaXNvbiA9CiAgICAgICAgICBDbGFzc0hpZXJhcmNoeS5jb21wYXJlTWVtYmVycyhkZWNsYXJlZE1lbWJlciwgaW5oZXJpdGVkTWVtYmVyKTsKICAgICAgaWYgKGNvbXBhcmlzb24gPCAwKSB7CiAgICAgICAgKytpOwogICAgICB9IGVsc2UgaWYgKGNvbXBhcmlzb24gPiAwKSB7CiAgICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBpbmhlcml0ZWRNZW1iZXI7CiAgICAgICAgKytqOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIE1vdmUgcGFzdCB0aGUgc2hhZG93ZWQgbWVtYmVyLCBidXQgcmV0YWluIHRoZSBkZWNsYXJlZCBtZW1iZXIsIGFzCiAgICAgICAgLy8gaXQgbWF5IHNoYWRvdyBtdWx0aXBsZSBtZW1iZXJzLgogICAgICAgICsrajsKICAgICAgfQogICAgfQogICAgLy8gSWYgdGhlIGxpc3Qgb2YgZGVjbGFyZWQgbWVtYmVycyBpcyBleGhhdXN0ZWQsIGNvcHkgb3ZlciB0aGUgcmVtYWlucyBvZgogICAgLy8gdGhlIGluaGVyaXRlZCBtZW1iZXJzLgogICAgd2hpbGUgKGogPCBpbmhlcml0ZWQubGVuZ3RoKSB7CiAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gaW5oZXJpdGVkW2orK107CiAgICB9CiAgICByZXN1bHQubGVuZ3RoID0gc3RvcmVJbmRleDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIF9yZWNvcmRTdXBlclR5cGVzKF9DbGFzc0luZm8gc3ViSW5mbywgU3VwZXJ0eXBlIHN1cGVydHlwZSkgewogICAgX0NsYXNzSW5mbyBzdXBlckluZm8gPSBfaW5mb01hcFtzdXBlcnR5cGUuY2xhc3NOb2RlXTsKICAgIGlmIChzdXBlcnR5cGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgIGlmIChzdXBlckluZm8uZ2VuZXJpY1N1cGVyVHlwZXMgPT0gbnVsbCkgcmV0dXJuOwogICAgICAvLyBDb3B5IG92ZXIgdGhlIHN1cGVyIHR5cGUgZW50cmllcy4KICAgICAgc3ViSW5mby5nZW5lcmljU3VwZXJUeXBlcyA/Pz0gPENsYXNzLCBMaXN0PFN1cGVydHlwZT4+e307CiAgICAgIHN1cGVySW5mby5nZW5lcmljU3VwZXJUeXBlcz8uZm9yRWFjaCgoQ2xhc3Mga2V5LCBMaXN0PFN1cGVydHlwZT4gdHlwZXMpIHsKICAgICAgICBmb3IgKFN1cGVydHlwZSB0eXBlIGluIHR5cGVzKSB7CiAgICAgICAgICBzdWJJbmZvLnJlY29yZEdlbmVyaWNTdXBlclR5cGUoa2V5LCB0eXBlLCBfb25BbWJpZ3VvdXNTdXBlcnR5cGVzKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgLy8gQ29weSBvdmVyIGFsbCB0cmFuc2l0aXZlIGdlbmVyaWMgc3VwZXIgdHlwZXMsIGFuZCBzdWJzdGl0dXRlIHRoZQogICAgICAvLyBmcmVlIHZhcmlhYmxlcyB3aXRoIHRob3NlIHByb3ZpZGVkIGluIFtzdXBlcnR5cGVdLgogICAgICBDbGFzcyBzdXBlcmNsYXNzID0gc3VwZXJ0eXBlLmNsYXNzTm9kZTsKICAgICAgdmFyIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICBzdXBlcmNsYXNzLnR5cGVQYXJhbWV0ZXJzLCBzdXBlcnR5cGUudHlwZUFyZ3VtZW50cyk7CiAgICAgIHN1YkluZm8uZ2VuZXJpY1N1cGVyVHlwZXMgPz89IDxDbGFzcywgTGlzdDxTdXBlcnR5cGU+Pnt9OwogICAgICBzdXBlckluZm8uZ2VuZXJpY1N1cGVyVHlwZXM/LmZvckVhY2goKENsYXNzIGtleSwgTGlzdDxTdXBlcnR5cGU+IHR5cGVzKSB7CiAgICAgICAgZm9yIChTdXBlcnR5cGUgdHlwZSBpbiB0eXBlcykgewogICAgICAgICAgc3ViSW5mby5yZWNvcmRHZW5lcmljU3VwZXJUeXBlKGtleSwKICAgICAgICAgICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVN1cGVydHlwZSh0eXBlKSwgX29uQW1iaWd1b3VzU3VwZXJ0eXBlcyk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIHN1YkluZm8ucmVjb3JkR2VuZXJpY1N1cGVyVHlwZSgKICAgICAgICAgIHN1cGVyY2xhc3MsIHN1cGVydHlwZSwgX29uQW1iaWd1b3VzU3VwZXJ0eXBlcyk7CiAgICB9CiAgfQoKICAvLy8gQnVpbGQgbGlzdHMgb2Ygc3VwZXIgdHlwZXMgYW5kIHN1cGVyIGNsYXNzZXMuCiAgLy8vIE5vdGUgdGhhdCB0aGUgc3VwZXIgY2xhc3MgYW5kIHN1cGVyIHR5cGVzIG9mIHRoZSBjbGFzcyBtdXN0IGFscmVhZHkgaGF2ZQogIC8vLyBoYWQgdGhlaXIgc3VwZXJzIGNvbGxlY3RlZC4KICB2b2lkIF9jb2xsZWN0U3VwZXJzRm9yQ2xhc3MoQ2xhc3MgY2xhc3NfKSB7CiAgICBfQ2xhc3NJbmZvIGluZm8gPSBfaW5mb01hcFtjbGFzc19dOwoKICAgIHZhciBzdXBlcmNsYXNzU2V0QnVpbGRlciA9IG5ldyBfSW50ZXJ2YWxMaXN0QnVpbGRlcigpCiAgICAgIC4uYWRkU2luZ2xldG9uKGluZm8udG9wb2xvZ2ljYWxJbmRleCk7CiAgICB2YXIgc3VwZXJ0eXBlU2V0QnVpbGRlciA9IG5ldyBfSW50ZXJ2YWxMaXN0QnVpbGRlcigpCiAgICAgIC4uYWRkU2luZ2xldG9uKGluZm8udG9wb2xvZ2ljYWxJbmRleCk7CgogICAgaWYgKGNsYXNzXy5zdXBlcnR5cGUgIT0gbnVsbCkgewogICAgICBfQ2xhc3NJbmZvIHN1cGVydHlwZUluZm8gPSBfaW5mb01hcFtjbGFzc18uc3VwZXJ0eXBlLmNsYXNzTm9kZV07CiAgICAgIHN1cGVyY2xhc3NTZXRCdWlsZGVyCiAgICAgICAgICAuYWRkSW50ZXJ2YWxMaXN0KHN1cGVydHlwZUluZm8uc3VwZXJjbGFzc0ludGVydmFsTGlzdCk7CiAgICAgIHN1cGVydHlwZVNldEJ1aWxkZXIuYWRkSW50ZXJ2YWxMaXN0KHN1cGVydHlwZUluZm8uc3VwZXJ0eXBlSW50ZXJ2YWxMaXN0KTsKICAgIH0KCiAgICBpZiAoY2xhc3NfLm1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgX0NsYXNzSW5mbyBtaXhlZEluVHlwZUluZm8gPSBfaW5mb01hcFtjbGFzc18ubWl4ZWRJblR5cGUuY2xhc3NOb2RlXTsKICAgICAgc3VwZXJ0eXBlU2V0QnVpbGRlcgogICAgICAgICAgLmFkZEludGVydmFsTGlzdChtaXhlZEluVHlwZUluZm8uc3VwZXJ0eXBlSW50ZXJ2YWxMaXN0KTsKICAgIH0KCiAgICBmb3IgKFN1cGVydHlwZSBzdXBlcnR5cGUgaW4gY2xhc3NfLmltcGxlbWVudGVkVHlwZXMpIHsKICAgICAgX0NsYXNzSW5mbyBzdXBlcnR5cGVJbmZvID0gX2luZm9NYXBbc3VwZXJ0eXBlLmNsYXNzTm9kZV07CiAgICAgIHN1cGVydHlwZVNldEJ1aWxkZXIuYWRkSW50ZXJ2YWxMaXN0KHN1cGVydHlwZUluZm8uc3VwZXJ0eXBlSW50ZXJ2YWxMaXN0KTsKICAgIH0KCiAgICBpbmZvLnN1cGVyY2xhc3NJbnRlcnZhbExpc3QgPSBzdXBlcmNsYXNzU2V0QnVpbGRlci5idWlsZEludGVydmFsTGlzdCgpOwogICAgaW5mby5zdXBlcnR5cGVJbnRlcnZhbExpc3QgPSBzdXBlcnR5cGVTZXRCdWlsZGVyLmJ1aWxkSW50ZXJ2YWxMaXN0KCk7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIGhpc3RvZ3JhbSBzdWNoIHRoYXQgaW5kZXggYE5gIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgY2xhc3NlcwogIC8vLyB0aGF0IGhhdmUgYE5gIGludGVydmFscyBpbiBpdHMgc3VwZXJ0eXBlIHNldC4KICAvLy8KICAvLy8gVGhlIG1vcmUgbnVtYmVycyBhcmUgY29uZGVuc2VkIG5lYXIgdGhlIGJlZ2lubmluZywgdGhlIG1vcmUgZWZmaWNpZW50IHRoZQogIC8vLyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBpcy4KICBMaXN0PGludD4gZ2V0RXhwZW5zZUhpc3RvZ3JhbSgpIHsKICAgIHZhciByZXN1bHQgPSA8aW50PltdOwogICAgZm9yIChDbGFzcyBjbGFzc18gaW4gX2luZm9NYXAua2V5cykgewogICAgICB2YXIgaW5mbyA9IF9pbmZvTWFwW2NsYXNzX107CiAgICAgIGludCBpbnRlcnZhbHMgPSBpbmZvLnN1cGVydHlwZUludGVydmFsTGlzdC5sZW5ndGggfi8gMjsKICAgICAgaWYgKGludGVydmFscyA+PSByZXN1bHQubGVuZ3RoKSB7CiAgICAgICAgaW50IG9sZExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7CiAgICAgICAgcmVzdWx0Lmxlbmd0aCA9IGludGVydmFscyArIDE7CiAgICAgICAgcmVzdWx0LmZpbGxSYW5nZShvbGRMZW5ndGgsIHJlc3VsdC5sZW5ndGgsIDApOwogICAgICB9CiAgICAgIHJlc3VsdFtpbnRlcnZhbHNdICs9IDE7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGludGVydmFscyBwZXIgc3VwZXJ0eXBlIHJlbGF0aW9uIChsZXNzCiAgLy8vIGlzIGJldHRlciwgMS4wIGlzIGJhZCkuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYW4gZXN0aW1hdGUgb2YgdGhlIG1lbW9yeSB1c2UgY29tcGFyZWQgdG8gYSBkYXRhIHN0cnVjdHVyZSB0aGF0CiAgLy8vIGVudW1lcmF0ZXMgYWxsIHN1cGVyY2xhc3Mvc3VwZXJ0eXBlIHBhaXJzLgogIGRvdWJsZSBnZXRDb21wcmVzc2lvblJhdGlvKCkgewogICAgaW50IGludGVydmFscyA9IDA7CiAgICBpbnQgc2l6ZXMgPSAwOwogICAgZm9yIChDbGFzcyBjbGFzc18gaW4gX2luZm9NYXAua2V5cykgewogICAgICB2YXIgaW5mbyA9IF9pbmZvTWFwW2NsYXNzX107CiAgICAgIGludGVydmFscyArPSAoaW5mby5zdXBlcmNsYXNzSW50ZXJ2YWxMaXN0Lmxlbmd0aCArCiAgICAgICAgICAgICAgaW5mby5zdXBlcnR5cGVJbnRlcnZhbExpc3QubGVuZ3RoKSB+LwogICAgICAgICAgMjsKICAgICAgc2l6ZXMgKz0gX2ludGVydmFsTGlzdFNpemUoaW5mby5zdXBlcmNsYXNzSW50ZXJ2YWxMaXN0KSArCiAgICAgICAgICBfaW50ZXJ2YWxMaXN0U2l6ZShpbmZvLnN1cGVydHlwZUludGVydmFsTGlzdCk7CiAgICB9CgogICAgcmV0dXJuIHNpemVzID09IDAgPyAxLjAgOiBpbnRlcnZhbHMgLyBzaXplczsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBoYXNoIHRhYmxlcyBzdG9yaW5nIGhpZXJhcmNoeSBkYXRhLgogIGludCBnZXRTdXBlclR5cGVIYXNoVGFibGVTaXplKCkgewogICAgaW50IHN1bSA9IDA7CiAgICBmb3IgKENsYXNzIGNsYXNzXyBpbiBfaW5mb01hcC5rZXlzKSB7CiAgICAgIHN1bSArPSBfaW5mb01hcFtjbGFzc19dLmdlbmVyaWNTdXBlclR5cGVzPy5sZW5ndGggPz8gMDsKICAgIH0KICAgIHJldHVybiBzdW07CiAgfQp9CgpjbGFzcyBfSW50ZXJ2YWxMaXN0QnVpbGRlciB7CiAgZmluYWwgTGlzdDxpbnQ+IGV2ZW50cyA9IDxpbnQ+W107CgogIHZvaWQgYWRkSW50ZXJ2YWwoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAvLyBBZGQgYW4gZXZlbnQgcG9pbnQgZm9yIGVhY2ggaW50ZXJ2YWwgZW5kIHBvaW50LCB1c2luZyB0aGUgbG93IGJpdCB0bwogICAgLy8gZGlzdGluZ3Vpc2ggb3BlbmluZyBmcm9tIGNsb3NpbmcgZW5kIHBvaW50cy4gQ2xvc2luZyBlbmQgcG9pbnRzIHNob3VsZAogICAgLy8gaGF2ZSB0aGUgaGlnaCBiaXQgdG8gZW5zdXJlIHRoZXkgb2NjdXIgYWZ0ZXIgYW4gb3BlbmluZyBlbmQgcG9pbnQuCiAgICBldmVudHMuYWRkKHN0YXJ0IDw8IDEpOwogICAgZXZlbnRzLmFkZCgoZW5kIDw8IDEpICsgMSk7CiAgfQoKICB2b2lkIGFkZFNpbmdsZXRvbihpbnQgeCkgewogICAgYWRkSW50ZXJ2YWwoeCwgeCArIDEpOwogIH0KCiAgdm9pZCBhZGRJbnRlcnZhbExpc3QoVWludDMyTGlzdCBpbnRlcnZhbHMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJ2YWxzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgIGFkZEludGVydmFsKGludGVydmFsc1tpXSwgaW50ZXJ2YWxzW2kgKyAxXSk7CiAgICB9CiAgfQoKICBVaW50MzJMaXN0IGJ1aWxkSW50ZXJ2YWxMaXN0KCkgewogICAgLy8gU29ydCB0aGUgZXZlbnQgcG9pbnRzIGFuZCBzd2VlcCBsZWZ0IHRvIHJpZ2h0IHdoaWxlIHRyYWNraW5nIGhvdyBtYW55CiAgICAvLyBpbnRlcnZhbHMgd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUuICBSZWNvcmQgYW4gaW50ZXJ2YWwgZW5kIHBvaW50IHdoZW4gdGhlCiAgICAvLyBudW1iZXIgb2YgaW50ZXJ2YWxzIGRyb3AgdG8gemVybyBvciBpbmNyZWFzZSBmcm9tIHplcm8gdG8gb25lLgogICAgLy8gRXZlbnQgcG9pbnRzIGFyZSBlbmNvZGVkIHNvIHRoYXQgYW4gb3BlbmluZyBlbmQgcG9pbnQgb2NjdXIgYmVmb3JlIGEKICAgIC8vIGNsb3NpbmcgZW5kIHBvaW50IGF0IHRoZSBzYW1lIHZhbHVlLgogICAgZXZlbnRzLnNvcnQoKTsKICAgIGludCBpbnNpZGVDb3VudCA9IDA7IC8vIFRoZSBudW1iZXIgb2YgaW50ZXJ2YWxzIHdlIGFyZSBjdXJyZW50bHkgaW5zaWRlLgogICAgaW50IHN0b3JlSW5kZXggPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgaW50IGV2ZW50ID0gZXZlbnRzW2ldOwogICAgICBpZiAoZXZlbnQgJiAxID09IDApIHsKICAgICAgICAvLyBTdGFydCBwb2ludAogICAgICAgICsraW5zaWRlQ291bnQ7CiAgICAgICAgaWYgKGluc2lkZUNvdW50ID09IDEpIHsKICAgICAgICAgIC8vIFN0b3JlIHRoZSByZXN1bHRzIHRlbXBvcmFyaWx5IGJhY2sgaW4gdGhlIGV2ZW50IGFycmF5LgogICAgICAgICAgZXZlbnRzW3N0b3JlSW5kZXgrK10gPSBldmVudCA+PiAxOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBFbmQgcG9pbnQKICAgICAgICAtLWluc2lkZUNvdW50OwogICAgICAgIGlmIChpbnNpZGVDb3VudCA9PSAwKSB7CiAgICAgICAgICBldmVudHNbc3RvcmVJbmRleCsrXSA9IGV2ZW50ID4+IDE7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyBDb3B5IHRoZSByZXN1bHRzIG92ZXIgdG8gYSB0eXBlZCBhcnJheSBvZiB0aGUgY29ycmVjdCBsZW5ndGguCiAgICB2YXIgcmVzdWx0ID0gbmV3IFVpbnQzMkxpc3Qoc3RvcmVJbmRleCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0b3JlSW5kZXg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSBldmVudHNbaV07CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKYm9vbCBfaW50ZXJ2YWxMaXN0Q29udGFpbnMoVWludDMyTGlzdCBpbnRlcnZhbExpc3QsIGludCB4KSB7CiAgaW50IGxvdyA9IDAsIGhpZ2ggPSBpbnRlcnZhbExpc3QubGVuZ3RoIC0gMTsKICBpZiAoaGlnaCA9PSAtMSB8fCB4IDwgaW50ZXJ2YWxMaXN0WzBdIHx8IGludGVydmFsTGlzdFtoaWdoXSA8PSB4KSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIC8vIEZpbmQgdGhlIGxvd2VyIGJvdW5kIG9mIHggaW4gdGhlIGxpc3QuCiAgLy8gSWYgdGhlIGxvd2VyIGJvdW5kIGlzIGF0IGFuIGV2ZW4gaW5kZXgsIHRoZSBsb3dlciBib3VuZCBpcyBhbiBvcGVuaW5nIHBvaW50CiAgLy8gb2YgYW4gaW50ZXJ2YWwgdGhhdCBjb250YWlucyB4LCBvdGhlcndpc2UgaXQgaXMgYSBjbG9zaW5nIHBvaW50IG9mIGFuCiAgLy8gaW50ZXJ2YWwgYmVsb3cgeCBhbmQgdGhlcmUgaXMgbm8gaW50ZXJ2YWwgY29udGFpbmluZyB4LgogIHdoaWxlIChsb3cgPCBoaWdoKSB7CiAgICBpbnQgbWlkID0gaGlnaCAtICgoaGlnaCAtIGxvdykgPj4gMSk7IC8vIEdldCBtaWRkbGUsIHJvdW5kaW5nIHVwLgogICAgaW50IHBpdm90ID0gaW50ZXJ2YWxMaXN0W21pZF07CiAgICBpZiAocGl2b3QgPD0geCkgewogICAgICBsb3cgPSBtaWQ7CiAgICB9IGVsc2UgewogICAgICBoaWdoID0gbWlkIC0gMTsKICAgIH0KICB9CiAgcmV0dXJuIGxvdyA9PSBoaWdoICYmIChsb3cgJiAxKSA9PSAwOwp9CgppbnQgX2ludGVydmFsTGlzdFNpemUoVWludDMyTGlzdCBpbnRlcnZhbExpc3QpIHsKICBpbnQgc2l6ZSA9IDA7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcnZhbExpc3QubGVuZ3RoOyBpICs9IDIpIHsKICAgIHNpemUgKz0gaW50ZXJ2YWxMaXN0W2kgKyAxXSAtIGludGVydmFsTGlzdFtpXTsKICB9CiAgcmV0dXJuIHNpemU7Cn0KCmNsYXNzIF9DbGFzc0luZm8gewogIGJvb2wgdXNlZCA9IGZhbHNlOwogIGZpbmFsIENsYXNzIGNsYXNzTm9kZTsKICBpbnQgdG9wb2xvZ2ljYWxJbmRleCA9IDA7CiAgaW50IGRlcHRoID0gMDsKCiAgLy8gU3VwZXIgdHlwZXMgbXVzdCBhbHdheXMgb2NjdXIgYmVmb3JlIHN1YnR5cGVzIGluIHRoZXNlIGxpc3RzLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gICBjbGFzcyBBIGV4dGVuZHMgT2JqZWN0CiAgLy8gICBjbGFzcyBCIGV4dGVuZHMgT2JqZWN0IGltcGxlbWVudHMgQQogIC8vCiAgLy8gSGVyZSBgQWAgbXVzdCBvY2N1ciBiZWZvcmUgYEJgIGluIHRoZSBsaXN0IG9mIGRpcmVjdCBleHRlbmRlcnMgb2YgT2JqZWN0LAogIC8vIGJlY2F1c2UgYEJgIGlzIGEgc3VidHlwZSBvZiBgQWAuCiAgZmluYWwgU2V0PF9DbGFzc0luZm8+IGRpcmVjdEV4dGVuZGVycyA9IG5ldyBMaW5rZWRIYXNoU2V0PF9DbGFzc0luZm8+KCk7CiAgZmluYWwgU2V0PF9DbGFzc0luZm8+IGRpcmVjdE1peGVycyA9IG5ldyBMaW5rZWRIYXNoU2V0PF9DbGFzc0luZm8+KCk7CiAgZmluYWwgU2V0PF9DbGFzc0luZm8+IGRpcmVjdEltcGxlbWVudGVycyA9IG5ldyBMaW5rZWRIYXNoU2V0PF9DbGFzc0luZm8+KCk7CgogIFVpbnQzMkxpc3Qgc3VwZXJjbGFzc0ludGVydmFsTGlzdDsKICBVaW50MzJMaXN0IHN1cGVydHlwZUludGVydmFsTGlzdDsKCiAgTGlzdDxfQ2xhc3NJbmZvPiBsZWFzdFVwcGVyQm91bmRJbmZvczsKCiAgLy8vIE1hcHMgZ2VuZXJpYyBzdXBlcnR5cGUgY2xhc3NlcyB0byB0aGUgaW5zdGFudGlhdGlvbiBpbXBsZW1lbnRlZCBieSB0aGlzCiAgLy8vIGNsYXNzLgogIC8vLwogIC8vLyBFLmcuIGBMaXN0YCBtYXBzIHRvIGBMaXN0PFN0cmluZz5gIGZvciBhIGNsYXNzIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseQogIC8vLyBpbXBsZW1lbnRzIGBMaXN0PFN0cmluZz5gLgogIE1hcDxDbGFzcywgTGlzdDxTdXBlcnR5cGU+PiBnZW5lcmljU3VwZXJUeXBlczsKCiAgLy8vIEluc3RhbmNlIGZpZWxkcywgZ2V0dGVycywgbWV0aG9kcywgYW5kIG9wZXJhdG9ycyBkZWNsYXJlZCBpbiB0aGlzIGNsYXNzCiAgLy8vIG9yIGl0cyBtaXhlZC1pbiBjbGFzcywgc29ydGVkIGFjY29yZGluZyB0byBbX2NvbXBhcmVNZW1iZXJzXS4KICBMaXN0PE1lbWJlcj4gZGVjbGFyZWRHZXR0ZXJzQW5kQ2FsbHM7CgogIC8vLyBOb24tZmluYWwgaW5zdGFuY2UgZmllbGRzIGFuZCBzZXR0ZXJzIGRlY2xhcmVkIGluIHRoaXMgY2xhc3Mgb3IgaXRzCiAgLy8vIG1peGVkLWluIGNsYXNzLCBzb3J0ZWQgYWNjb3JkaW5nIHRvIFtfY29tcGFyZU1lbWJlcnNdLgogIExpc3Q8TWVtYmVyPiBkZWNsYXJlZFNldHRlcnM7CgogIC8vLyBJbnN0YW5jZSBmaWVsZHMsIGdldHRlcnMsIG1ldGhvZHMsIGFuZCBvcGVyYXRvcnMgaW1wbGVtZW50ZWQgYnkgdGhpcyBjbGFzcwogIC8vLyAoZGVjbGFyZWQgb3IgaW5oZXJpdGVkKS4KICBMaXN0PE1lbWJlcj4gaW1wbGVtZW50ZWRHZXR0ZXJzQW5kQ2FsbHM7CgogIC8vLyBOb24tZmluYWwgaW5zdGFuY2UgZmllbGRzIGFuZCBzZXR0ZXJzIGltcGxlbWVudGVkIGJ5IHRoaXMgY2xhc3MKICAvLy8gKGRlY2xhcmVkIG9yIGluaGVyaXRlZCkuCiAgTGlzdDxNZW1iZXI+IGltcGxlbWVudGVkU2V0dGVyczsKCiAgTGlzdDxNZW1iZXI+IGludGVyZmFjZUdldHRlcnNBbmRDYWxsczsKICBMaXN0PE1lbWJlcj4gaW50ZXJmYWNlU2V0dGVyczsKCiAgX0NsYXNzSW5mbyh0aGlzLmNsYXNzTm9kZSk7CgogIGJvb2wgaXNTdWJjbGFzc09mKF9DbGFzc0luZm8gb3RoZXIpIHsKICAgIHJldHVybiBfaW50ZXJ2YWxMaXN0Q29udGFpbnMoCiAgICAgICAgc3VwZXJjbGFzc0ludGVydmFsTGlzdCwgb3RoZXIudG9wb2xvZ2ljYWxJbmRleCk7CiAgfQoKICBib29sIGlzU3VidHlwZU9mKF9DbGFzc0luZm8gb3RoZXIpIHsKICAgIHJldHVybiBfaW50ZXJ2YWxMaXN0Q29udGFpbnMoc3VwZXJ0eXBlSW50ZXJ2YWxMaXN0LCBvdGhlci50b3BvbG9naWNhbEluZGV4KTsKICB9CgogIHZvaWQgcmVjb3JkR2VuZXJpY1N1cGVyVHlwZShDbGFzcyBjbHMsIFN1cGVydHlwZSB0eXBlLAogICAgICBIYW5kbGVBbWJpZ3VvdXNTdXBlcnR5cGVzIG9uQW1iaWd1b3VzU3VwZXJ0eXBlcykgewogICAgTGlzdDxTdXBlcnR5cGU+IGV4aXN0aW5nID0gZ2VuZXJpY1N1cGVyVHlwZXNbY2xzXTsKICAgIGlmIChleGlzdGluZyA9PSBudWxsKSB7CiAgICAgIGdlbmVyaWNTdXBlclR5cGVzW2Nsc10gPSA8U3VwZXJ0eXBlPlt0eXBlXTsKICAgIH0gZWxzZSBpZiAodHlwZSAhPSBleGlzdGluZy5maXJzdCkgewogICAgICBleGlzdGluZy5hZGQodHlwZSk7CiAgICAgIG9uQW1iaWd1b3VzU3VwZXJ0eXBlcyhjbGFzc05vZGUsIGV4aXN0aW5nLmZpcnN0LCB0eXBlKTsKICAgIH0KICB9Cn0KCi8vLyBBbiBpbW11dGFibGUgc2V0IG9mIGNsYXNzZXMuCmNsYXNzIENsYXNzU2V0IGV4dGVuZHMgSXRlcmFibGVCYXNlPENsYXNzPiB7CiAgZmluYWwgU2V0PENsYXNzPiBfY2xhc3NlczsKICBDbGFzc1NldCh0aGlzLl9jbGFzc2VzKTsKCiAgYm9vbCBjb250YWlucyhPYmplY3QgY2xhc3NfKSB7CiAgICByZXR1cm4gX2NsYXNzZXMuY29udGFpbnMoY2xhc3NfKTsKICB9CgogIENsYXNzU2V0IHVuaW9uKENsYXNzU2V0IG90aGVyKSB7CiAgICBTZXQ8Q2xhc3M+IHJlc3VsdCA9IG5ldyBTZXQ8Q2xhc3M+LmZyb20oX2NsYXNzZXMpOwogICAgcmVzdWx0LmFkZEFsbChvdGhlci5fY2xhc3Nlcyk7CiAgICByZXR1cm4gbmV3IENsYXNzU2V0KHJlc3VsdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYXRvcjxDbGFzcz4gZ2V0IGl0ZXJhdG9yID0+IF9jbGFzc2VzLml0ZXJhdG9yOwp9CgovLy8gSGVhcCBmb3IgdXNlIGluIGNvbXB1dGluZyBsZWFzdCB1cHBlciBib3VuZHMuCi8vLwovLy8gVGhlIGhlYXAgaXMgc29ydGVkIHN1Y2ggdGhhdCBjbGFzc2VzIHRoYXQgYXJlIGRlZXBlc3QgaW4gdGhlIGhpZXJhcmNoeQovLy8gYXJlIHJlbW92ZWQgZmlyc3Q7IGluIHRoZSBjYXNlIG9mIHRpZXMsIGNsYXNzZXMgd2l0aCBsb3dlciB0b3BvbG9naWNhbCBzb3J0Ci8vLyBpbmRleCBhcmUgcmVtb3ZlZCBmaXJzdC4KY2xhc3MgX0x1YkhlYXAgZXh0ZW5kcyBIZWFwPF9DbGFzc0luZm8+IHsKICBAb3ZlcnJpZGUKICBib29sIHNvcnRzQmVmb3JlKF9DbGFzc0luZm8gYSwgX0NsYXNzSW5mbyBiKSA9PiBzb3J0c0JlZm9yZVN0YXRpYyhhLCBiKTsKCiAgc3RhdGljIGJvb2wgc29ydHNCZWZvcmVTdGF0aWMoX0NsYXNzSW5mbyBhLCBfQ2xhc3NJbmZvIGIpIHsKICAgIGlmIChhLmRlcHRoID4gYi5kZXB0aCkgcmV0dXJuIHRydWU7CiAgICBpZiAoYS5kZXB0aCA8IGIuZGVwdGgpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBhLnRvcG9sb2dpY2FsSW5kZXggPCBiLnRvcG9sb2dpY2FsSW5kZXg7CiAgfQp9CoXFAE5OPCABGhQaARMYHAFQAR85AgE5IC44JkY7Mwc0LioEASI4ATcBTEcqQAFMRhI1AU8LBlA6SU1RTDkGT05PEioxAVFEQgFPQksBT04aQQFOTQZKRgZJTEs+Bk4xSwFPEwZKTSkGMAYwSAFQDgZPTxUGTzxM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cy4KY2xhc3MgQ29yZVR5cGVzIHsKICBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXF1aXJlZENsYXNzZXMgPSB7CiAgICAnZGFydDpjb3JlJzogWwogICAgICAnT2JqZWN0JywKICAgICAgJ051bGwnLAogICAgICAnYm9vbCcsCiAgICAgICdpbnQnLAogICAgICAnbnVtJywKICAgICAgJ2RvdWJsZScsCiAgICAgICdTdHJpbmcnLAogICAgICAnTGlzdCcsCiAgICAgICdNYXAnLAogICAgICAnSXRlcmFibGUnLAogICAgICAnSXRlcmF0b3InLAogICAgICAnU3ltYm9sJywKICAgICAgJ1R5cGUnLAogICAgICAnRnVuY3Rpb24nLAogICAgICAnSW52b2NhdGlvbicsCiAgICAgICdGYWxsVGhyb3VnaEVycm9yJywKICAgIF0sCiAgICAnZGFydDpfaW50ZXJuYWwnOiBbCiAgICAgICdTeW1ib2wnLAogICAgXSwKICAgICdkYXJ0OmFzeW5jJzogWwogICAgICAnRnV0dXJlJywKICAgICAgJ1N0cmVhbScsCiAgICBdCiAgfTsKCiAgZmluYWwgTGlicmFyeUluZGV4IGluZGV4OwoKICBMaWJyYXJ5IF9jb3JlTGlicmFyeTsKICBDbGFzcyBfb2JqZWN0Q2xhc3M7CiAgQ2xhc3MgX251bGxDbGFzczsKICBDbGFzcyBfYm9vbENsYXNzOwogIENsYXNzIF9pbnRDbGFzczsKICBDbGFzcyBfbnVtQ2xhc3M7CiAgQ2xhc3MgX2RvdWJsZUNsYXNzOwogIENsYXNzIF9zdHJpbmdDbGFzczsKICBDbGFzcyBfbGlzdENsYXNzOwogIENsYXNzIF9zZXRDbGFzczsKICBDbGFzcyBfbWFwQ2xhc3M7CiAgQ2xhc3MgX2l0ZXJhYmxlQ2xhc3M7CiAgQ2xhc3MgX2l0ZXJhdG9yQ2xhc3M7CiAgQ2xhc3MgX3N5bWJvbENsYXNzOwogIENsYXNzIF90eXBlQ2xhc3M7CiAgQ2xhc3MgX2Z1bmN0aW9uQ2xhc3M7CiAgQ2xhc3MgX2ludm9jYXRpb25DbGFzczsKICBDbGFzcyBfaW52b2NhdGlvbk1pcnJvckNsYXNzOwogIENvbnN0cnVjdG9yIF9pbnZvY2F0aW9uTWlycm9yV2l0aFR5cGVDb25zdHJ1Y3RvcjsKICBDb25zdHJ1Y3RvciBfbm9TdWNoTWV0aG9kRXJyb3JEZWZhdWx0Q29uc3RydWN0b3I7CiAgUHJvY2VkdXJlIF9saXN0RnJvbUNvbnN0cnVjdG9yOwogIFByb2NlZHVyZSBfbGlzdFVubW9kaWZpYWJsZUNvbnN0cnVjdG9yOwogIFByb2NlZHVyZSBfaWRlbnRpY2FsUHJvY2VkdXJlOwogIENvbnN0cnVjdG9yIF9mYWxsVGhyb3VnaEVycm9yVXJsQW5kTGluZUNvbnN0cnVjdG9yOwogIFByb2NlZHVyZSBfb2JqZWN0RXF1YWxzOwogIFByb2NlZHVyZSBfbWFwVW5tb2RpZmlhYmxlOwoKICBDbGFzcyBfaW50ZXJuYWxTeW1ib2xDbGFzczsKCiAgTGlicmFyeSBfYXN5bmNMaWJyYXJ5OwogIENsYXNzIF9mdXR1cmVDbGFzczsKICBDbGFzcyBfc3RhY2tUcmFjZUNsYXNzOwogIENsYXNzIF9zdHJlYW1DbGFzczsKICBDbGFzcyBfYXN5bmNBd2FpdENvbXBsZXRlckNsYXNzOwogIENsYXNzIF9mdXR1cmVPckNsYXNzOwogIENvbnN0cnVjdG9yIF9hc3luY0F3YWl0Q29tcGxldGVyQ29uc3RydWN0b3I7CiAgUHJvY2VkdXJlIF9jb21wbGV0ZU9uQXN5bmNSZXR1cm5Qcm9jZWR1cmU7CiAgUHJvY2VkdXJlIF9jb21wbGV0ZXJDb21wbGV0ZUVycm9yOwogIENvbnN0cnVjdG9yIF9zeW5jSXRlcmFibGVEZWZhdWx0Q29uc3RydWN0b3I7CiAgQ29uc3RydWN0b3IgX3N0cmVhbUl0ZXJhdG9yRGVmYXVsdENvbnN0cnVjdG9yOwogIENvbnN0cnVjdG9yIF9hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyRGVmYXVsdENvbnN0cnVjdG9yOwogIFByb2NlZHVyZSBfYXN5bmNTdGFyTGlzdGVuSGVscGVyUHJvY2VkdXJlOwogIFByb2NlZHVyZSBfYXN5bmNTdGFyTW92ZU5leHRIZWxwZXJQcm9jZWR1cmU7CiAgUHJvY2VkdXJlIF9hc3luY1N0YWNrVHJhY2VIZWxwZXJQcm9jZWR1cmU7CiAgUHJvY2VkdXJlIF9hc3luY1RoZW5XcmFwcGVySGVscGVyUHJvY2VkdXJlOwogIFByb2NlZHVyZSBfYXN5bmNFcnJvcldyYXBwZXJIZWxwZXJQcm9jZWR1cmU7CiAgUHJvY2VkdXJlIF9hd2FpdEhlbHBlclByb2NlZHVyZTsKICBQcm9jZWR1cmUgX2Jvb2xGcm9tRW52aXJvbm1lbnQ7CgogIC8vLyBUaGUgYGRhcnQ6bWlycm9yc2AgbGlicmFyeSwgb3IgYG51bGxgIGlmIHRoZSBjb21wb25lbnQgZG9lcyBub3QgdXNlIGl0LgogIExpYnJhcnkgX21pcnJvcnNMaWJyYXJ5OwoKICBDbGFzcyBfcHJhZ21hQ2xhc3M7CiAgRmllbGQgX3ByYWdtYU5hbWU7CiAgRmllbGQgX3ByYWdtYU9wdGlvbnM7CiAgQ29uc3RydWN0b3IgX3ByYWdtYUNvbnN0cnVjdG9yOwoKICBDb3JlVHlwZXMoQ29tcG9uZW50IGNvbXBvbmVudCkKICAgICAgOiBpbmRleCA9IG5ldyBMaWJyYXJ5SW5kZXguY29yZUxpYnJhcmllcyhjb21wb25lbnQpOwoKICBQcm9jZWR1cmUgZ2V0IGFzeW5jRXJyb3JXcmFwcGVySGVscGVyUHJvY2VkdXJlIHsKICAgIHJldHVybiBfYXN5bmNFcnJvcldyYXBwZXJIZWxwZXJQcm9jZWR1cmUgPz89CiAgICAgICAgaW5kZXguZ2V0VG9wTGV2ZWxNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX2FzeW5jRXJyb3JXcmFwcGVySGVscGVyJyk7CiAgfQoKICBMaWJyYXJ5IGdldCBhc3luY0xpYnJhcnkgewogICAgcmV0dXJuIF9hc3luY0xpYnJhcnkgPz89IGluZGV4LmdldExpYnJhcnkoJ2RhcnQ6YXN5bmMnKTsKICB9CgogIE1lbWJlciBnZXQgYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckFkZCB7CiAgICByZXR1cm4gaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmFzeW5jJywgJ19Bc3luY1N0YXJTdHJlYW1Db250cm9sbGVyJywgJ2FkZCcpOwogIH0KCiAgTWVtYmVyIGdldCBhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkRXJyb3IgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcigKICAgICAgICAnZGFydDphc3luYycsICdfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcicsICdhZGRFcnJvcicpOwogIH0KCiAgTWVtYmVyIGdldCBhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtIHsKICAgIHJldHVybiBpbmRleC5nZXRNZW1iZXIoCiAgICAgICAgJ2RhcnQ6YXN5bmMnLCAnX0FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXInLCAnYWRkU3RyZWFtJyk7CiAgfQoKICBDbGFzcyBnZXQgYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckNsYXNzIHsKICAgIHJldHVybiBpbmRleC5nZXRDbGFzcygnZGFydDphc3luYycsICdfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcicpOwogIH0KCiAgTWVtYmVyIGdldCBhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQ2xvc2UgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcicsICdjbG9zZScpOwogIH0KCiAgQ29uc3RydWN0b3IgZ2V0IGFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJEZWZhdWx0Q29uc3RydWN0b3IgewogICAgcmV0dXJuIF9hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyRGVmYXVsdENvbnN0cnVjdG9yID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcicsICcnKTsKICB9CgogIE1lbWJlciBnZXQgYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlclN0cmVhbSB7CiAgICByZXR1cm4gaW5kZXguZ2V0TWVtYmVyKAogICAgICAgICdkYXJ0OmFzeW5jJywgJ19Bc3luY1N0YXJTdHJlYW1Db250cm9sbGVyJywgJ2dldDpzdHJlYW0nKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXN5bmNTdGFyTGlzdGVuSGVscGVyIHsKICAgIHJldHVybiBfYXN5bmNTdGFyTGlzdGVuSGVscGVyUHJvY2VkdXJlID8/PQogICAgICAgIGluZGV4LmdldFRvcExldmVsTWVtYmVyKCdkYXJ0OmFzeW5jJywgJ19hc3luY1N0YXJMaXN0ZW5IZWxwZXInKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXN5bmNTdGFyTW92ZU5leHRIZWxwZXIgewogICAgcmV0dXJuIF9hc3luY1N0YXJNb3ZlTmV4dEhlbHBlclByb2NlZHVyZSA/Pz0KICAgICAgICBpbmRleC5nZXRUb3BMZXZlbE1lbWJlcignZGFydDphc3luYycsICdfYXN5bmNTdGFyTW92ZU5leHRIZWxwZXInKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXN5bmNTdGFja1RyYWNlSGVscGVyUHJvY2VkdXJlIHsKICAgIHJldHVybiBfYXN5bmNTdGFja1RyYWNlSGVscGVyUHJvY2VkdXJlID8/PQogICAgICAgIGluZGV4LmdldFRvcExldmVsTWVtYmVyKCdkYXJ0OmFzeW5jJywgJ19hc3luY1N0YWNrVHJhY2VIZWxwZXInKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXN5bmNUaGVuV3JhcHBlckhlbHBlclByb2NlZHVyZSB7CiAgICByZXR1cm4gX2FzeW5jVGhlbldyYXBwZXJIZWxwZXJQcm9jZWR1cmUgPz89CiAgICAgICAgaW5kZXguZ2V0VG9wTGV2ZWxNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX2FzeW5jVGhlbldyYXBwZXJIZWxwZXInKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXdhaXRIZWxwZXJQcm9jZWR1cmUgewogICAgcmV0dXJuIF9hd2FpdEhlbHBlclByb2NlZHVyZSA/Pz0KICAgICAgICBpbmRleC5nZXRUb3BMZXZlbE1lbWJlcignZGFydDphc3luYycsICdfYXdhaXRIZWxwZXInKTsKICB9CgogIENsYXNzIGdldCBib29sQ2xhc3MgewogICAgcmV0dXJuIF9ib29sQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnYm9vbCcpOwogIH0KCiAgQ2xhc3MgZ2V0IGFzeW5jQXdhaXRDb21wbGV0ZXJDbGFzcyB7CiAgICByZXR1cm4gX2FzeW5jQXdhaXRDb21wbGV0ZXJDbGFzcyA/Pz0KICAgICAgICBpbmRleC5nZXRDbGFzcygnZGFydDphc3luYycsICdfQXN5bmNBd2FpdENvbXBsZXRlcicpOwogIH0KCiAgQ29uc3RydWN0b3IgZ2V0IGFzeW5jQXdhaXRDb21wbGV0ZXJDb25zdHJ1Y3RvciB7CiAgICByZXR1cm4gX2FzeW5jQXdhaXRDb21wbGV0ZXJDb25zdHJ1Y3RvciA/Pz0KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX0FzeW5jQXdhaXRDb21wbGV0ZXInLCAnJyk7CiAgfQoKICBNZW1iZXIgZ2V0IGNvbXBsZXRlT25Bc3luY1JldHVybiB7CiAgICByZXR1cm4gX2NvbXBsZXRlT25Bc3luY1JldHVyblByb2NlZHVyZSA/Pz0KICAgICAgICBpbmRleC5nZXRUb3BMZXZlbE1lbWJlcignZGFydDphc3luYycsICdfY29tcGxldGVPbkFzeW5jUmV0dXJuJyk7CiAgfQoKICBQcm9jZWR1cmUgZ2V0IGNvbXBsZXRlckNvbXBsZXRlRXJyb3IgewogICAgcmV0dXJuIF9jb21wbGV0ZXJDb21wbGV0ZUVycm9yID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdDb21wbGV0ZXInLCAnY29tcGxldGVFcnJvcicpOwogIH0KCiAgTWVtYmVyIGdldCBjb21wbGV0ZXJGdXR1cmUgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdDb21wbGV0ZXInLCAnZ2V0OmZ1dHVyZScpOwogIH0KCiAgTGlicmFyeSBnZXQgY29yZUxpYnJhcnkgewogICAgcmV0dXJuIF9jb3JlTGlicmFyeSA/Pz0gaW5kZXguZ2V0TGlicmFyeSgnZGFydDpjb3JlJyk7CiAgfQoKICBDbGFzcyBnZXQgZG91YmxlQ2xhc3MgewogICAgcmV0dXJuIF9kb3VibGVDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdkb3VibGUnKTsKICB9CgogIENsYXNzIGdldCBmdW5jdGlvbkNsYXNzIHsKICAgIHJldHVybiBfZnVuY3Rpb25DbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdGdW5jdGlvbicpOwogIH0KCiAgQ2xhc3MgZ2V0IGZ1dHVyZUNsYXNzIHsKICAgIHJldHVybiBfZnV0dXJlQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnRnV0dXJlJyk7CiAgfQoKICBDbGFzcyBnZXQgZnV0dXJlT3JDbGFzcyB7CiAgICByZXR1cm4gX2Z1dHVyZU9yQ2xhc3MgPz89IChpbmRleC50cnlHZXRDbGFzcygnZGFydDpjb3JlJywgJ0Z1dHVyZU9yJykgPz8KICAgICAgICBpbmRleC5nZXRDbGFzcygnZGFydDphc3luYycsICdGdXR1cmVPcicpKTsKICB9CgogIFByb2NlZHVyZSBnZXQgaWRlbnRpY2FsUHJvY2VkdXJlIHsKICAgIHJldHVybiBfaWRlbnRpY2FsUHJvY2VkdXJlID8/PQogICAgICAgIGluZGV4LmdldFRvcExldmVsTWVtYmVyKCdkYXJ0OmNvcmUnLCAnaWRlbnRpY2FsJyk7CiAgfQoKICBDbGFzcyBnZXQgaW50Q2xhc3MgewogICAgcmV0dXJuIF9pbnRDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdpbnQnKTsKICB9CgogIENsYXNzIGdldCBpbnRlcm5hbFN5bWJvbENsYXNzIHsKICAgIHJldHVybiBfaW50ZXJuYWxTeW1ib2xDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6X2ludGVybmFsJywgJ1N5bWJvbCcpOwogIH0KCiAgQ2xhc3MgZ2V0IGludm9jYXRpb25DbGFzcyB7CiAgICByZXR1cm4gX2ludm9jYXRpb25DbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdJbnZvY2F0aW9uJyk7CiAgfQoKICBDbGFzcyBnZXQgaW52b2NhdGlvbk1pcnJvckNsYXNzIHsKICAgIHJldHVybiBfaW52b2NhdGlvbk1pcnJvckNsYXNzID8/PQogICAgICAgIGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnX0ludm9jYXRpb25NaXJyb3InKTsKICB9CgogIENvbnN0cnVjdG9yIGdldCBpbnZvY2F0aW9uTWlycm9yV2l0aFR5cGVDb25zdHJ1Y3RvciB7CiAgICByZXR1cm4gX2ludm9jYXRpb25NaXJyb3JXaXRoVHlwZUNvbnN0cnVjdG9yID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ19JbnZvY2F0aW9uTWlycm9yJywgJ193aXRoVHlwZScpOwogIH0KCiAgQ2xhc3MgZ2V0IGl0ZXJhYmxlQ2xhc3MgewogICAgcmV0dXJuIF9pdGVyYWJsZUNsYXNzID8/PSBpbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ0l0ZXJhYmxlJyk7CiAgfQoKICBDbGFzcyBnZXQgaXRlcmF0b3JDbGFzcyB7CiAgICByZXR1cm4gX2l0ZXJhdG9yQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnSXRlcmF0b3InKTsKICB9CgogIENsYXNzIGdldCBsaXN0Q2xhc3MgewogICAgcmV0dXJuIF9saXN0Q2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnTGlzdCcpOwogIH0KCiAgUHJvY2VkdXJlIGdldCBsaXN0RnJvbUNvbnN0cnVjdG9yIHsKICAgIHJldHVybiBfbGlzdEZyb21Db25zdHJ1Y3RvciA/Pz0KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdMaXN0JywgJ2Zyb20nKTsKICB9CgogIFByb2NlZHVyZSBnZXQgbGlzdFVubW9kaWZpYWJsZUNvbnN0cnVjdG9yIHsKICAgIHJldHVybiBfbGlzdFVubW9kaWZpYWJsZUNvbnN0cnVjdG9yID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ0xpc3QnLCAndW5tb2RpZmlhYmxlJyk7CiAgfQoKICBDbGFzcyBnZXQgc2V0Q2xhc3MgewogICAgcmV0dXJuIF9zZXRDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdTZXQnKTsKICB9CgogIENsYXNzIGdldCBtYXBDbGFzcyB7CiAgICByZXR1cm4gX21hcENsYXNzID8/PSBpbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ01hcCcpOwogIH0KCiAgUHJvY2VkdXJlIGdldCBtYXBVbm1vZGlmaWFibGUgewogICAgcmV0dXJuIF9tYXBVbm1vZGlmaWFibGUgPz89CiAgICAgICAgaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnTWFwJywgJ3VubW9kaWZpYWJsZScpOwogIH0KCiAgTGlicmFyeSBnZXQgbWlycm9yc0xpYnJhcnkgewogICAgcmV0dXJuIF9taXJyb3JzTGlicmFyeSA/Pz0gaW5kZXgudHJ5R2V0TGlicmFyeSgnZGFydDptaXJyb3JzJyk7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgbm9TdWNoTWV0aG9kRXJyb3JEZWZhdWx0Q29uc3RydWN0b3IgewogICAgcmV0dXJuIF9ub1N1Y2hNZXRob2RFcnJvckRlZmF1bHRDb25zdHJ1Y3RvciA/Pz0KICAgICAgICAvLyBUT0RPKHJlZ2lzKTogUmVwbGFjZSAnd2l0aEludm9jYXRpb24nIHdpdGggJycgYWZ0ZXIgZGFydDJqcyBpcyBmaXhlZC4KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdOb1N1Y2hNZXRob2RFcnJvcicsICd3aXRoSW52b2NhdGlvbicpOwogIH0KCiAgQ2xhc3MgZ2V0IG51bGxDbGFzcyB7CiAgICByZXR1cm4gX251bGxDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdOdWxsJyk7CiAgfQoKICBDbGFzcyBnZXQgbnVtQ2xhc3MgewogICAgcmV0dXJuIF9udW1DbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdudW0nKTsKICB9CgogIENsYXNzIGdldCBvYmplY3RDbGFzcyB7CiAgICByZXR1cm4gX29iamVjdENsYXNzID8/PSBpbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ09iamVjdCcpOwogIH0KCiAgUHJvY2VkdXJlIGdldCBvYmplY3RFcXVhbHMgewogICAgcmV0dXJuIF9vYmplY3RFcXVhbHMgPz89IGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ09iamVjdCcsICc9PScpOwogIH0KCiAgQ2xhc3MgZ2V0IHByYWdtYUNsYXNzIHsKICAgIHJldHVybiBfcHJhZ21hQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAncHJhZ21hJyk7CiAgfQoKICBGaWVsZCBnZXQgcHJhZ21hTmFtZSB7CiAgICByZXR1cm4gX3ByYWdtYU5hbWUgPz89IGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ3ByYWdtYScsICduYW1lJyk7CiAgfQoKICBGaWVsZCBnZXQgcHJhZ21hT3B0aW9ucyB7CiAgICByZXR1cm4gX3ByYWdtYU9wdGlvbnMgPz89IGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ3ByYWdtYScsICdvcHRpb25zJyk7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgcHJhZ21hQ29uc3RydWN0b3IgewogICAgcmV0dXJuIF9wcmFnbWFDb25zdHJ1Y3RvciA/Pz0gaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAncHJhZ21hJywgJ18nKTsKICB9CgogIENsYXNzIGdldCBzdGFja1RyYWNlQ2xhc3MgewogICAgcmV0dXJuIF9zdGFja1RyYWNlQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnU3RhY2tUcmFjZScpOwogIH0KCiAgQ2xhc3MgZ2V0IHN0cmVhbUNsYXNzIHsKICAgIHJldHVybiBfc3RyZWFtQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnU3RyZWFtJyk7CiAgfQoKICBNZW1iZXIgZ2V0IHN0cmVhbUl0ZXJhdG9yU3Vic2NyaXB0aW9uIHsKICAgIHJldHVybiBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX1N0cmVhbUl0ZXJhdG9yJywgJ19zdWJzY3JpcHRpb24nKTsKICB9CgogIE1lbWJlciBnZXQgc3RyZWFtSXRlcmF0b3JDYW5jZWwgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdfU3RyZWFtSXRlcmF0b3InLCAnY2FuY2VsJyk7CiAgfQoKICBDbGFzcyBnZXQgc3RyZWFtSXRlcmF0b3JDbGFzcyB7CiAgICByZXR1cm4gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6YXN5bmMnLCAnX1N0cmVhbUl0ZXJhdG9yJyk7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgc3RyZWFtSXRlcmF0b3JEZWZhdWx0Q29uc3RydWN0b3IgewogICAgcmV0dXJuIF9zdHJlYW1JdGVyYXRvckRlZmF1bHRDb25zdHJ1Y3RvciA/Pz0KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX1N0cmVhbUl0ZXJhdG9yJywgJycpOwogIH0KCiAgTWVtYmVyIGdldCBzdHJlYW1JdGVyYXRvck1vdmVOZXh0IHsKICAgIHJldHVybiBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX1N0cmVhbUl0ZXJhdG9yJywgJ21vdmVOZXh0Jyk7CiAgfQoKICBNZW1iZXIgZ2V0IHN0cmVhbUl0ZXJhdG9yQ3VycmVudCB7CiAgICByZXR1cm4gaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmFzeW5jJywgJ19TdHJlYW1JdGVyYXRvcicsICdnZXQ6Y3VycmVudCcpOwogIH0KCiAgQ2xhc3MgZ2V0IHN0cmluZ0NsYXNzIHsKICAgIHJldHVybiBfc3RyaW5nQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnU3RyaW5nJyk7CiAgfQoKICBDbGFzcyBnZXQgc3ltYm9sQ2xhc3MgewogICAgcmV0dXJuIF9zeW1ib2xDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdTeW1ib2wnKTsKICB9CgogIENvbnN0cnVjdG9yIGdldCBzeW5jSXRlcmFibGVEZWZhdWx0Q29uc3RydWN0b3IgewogICAgcmV0dXJuIF9zeW5jSXRlcmFibGVEZWZhdWx0Q29uc3RydWN0b3IgPz89CiAgICAgICAgaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnX1N5bmNJdGVyYWJsZScsICcnKTsKICB9CgogIENsYXNzIGdldCBzeW5jSXRlcmF0b3JDbGFzcyB7CiAgICByZXR1cm4gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdfU3luY0l0ZXJhdG9yJyk7CiAgfQoKICBNZW1iZXIgZ2V0IHN5bmNJdGVyYXRvckN1cnJlbnQgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ19TeW5jSXRlcmF0b3InLCAnX2N1cnJlbnQnKTsKICB9CgogIE1lbWJlciBnZXQgc3luY0l0ZXJhdG9yWWllbGRFYWNoSXRlcmFibGUgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ19TeW5jSXRlcmF0b3InLCAnX3lpZWxkRWFjaEl0ZXJhYmxlJyk7CiAgfQoKICBDbGFzcyBnZXQgdHlwZUNsYXNzIHsKICAgIHJldHVybiBfdHlwZUNsYXNzID8/PSBpbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ1R5cGUnKTsKICB9CgogIENvbnN0cnVjdG9yIGdldCBmYWxsVGhyb3VnaEVycm9yVXJsQW5kTGluZUNvbnN0cnVjdG9yIHsKICAgIHJldHVybiBfZmFsbFRocm91Z2hFcnJvclVybEFuZExpbmVDb25zdHJ1Y3RvciA/Pz0KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdGYWxsVGhyb3VnaEVycm9yJywgJ19jcmVhdGUnKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYm9vbEZyb21FbnZpcm9ubWVudCB7CiAgICByZXR1cm4gX2Jvb2xGcm9tRW52aXJvbm1lbnQgPz89CiAgICAgICAgaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnYm9vbCcsICdmcm9tRW52aXJvbm1lbnQnKTsKICB9Cn0KgYkATk48GwETHQFIEj0TEA4ODQ0QEA4NEhIQDhIUGgcYEAcUEBAGBQEcARgWFBQTExYWFBMTGBgWFBgaIDQ0IiohNhseAR4BGRYaFiMYLy0lLzE8LS8tLi8jIgFOGwEWFRgiASE7ATMxSwQBHT0EASxPBAExHEEEATIcQgQBLUcEAS5RBAFAPEkEAS8cQwQBKC9JBAEqMUsEATEvSQQBMjBKBAEnJT8EARg/BAEnKT4EATMvQwQBJS9JBAEpJ0UEAR9FBAEcOwQBGkMEARxHBAEaQwQBHE0zBAElIzsEARc9BAEiUAQBHksEASQmOgQBODRIBAEcRwQBHEcEARg/BAEmJDYEAS4sPgQBFz0EARc9BAEiID0EAR9EBAE4NFFNBAEYPwQBFz0EARpDBAEfSwQBGkMEARlLBAEcUQQBJk8EAR5LBAEaQwQBKk4EASRHBAEiPAQBNTE+BAEmSQQBJUwEARpDBAEaQwQBMy87BAEgOQQBI0YEAS1QBAEYPwQBOjZFBAEmJEEEAgEecGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0QHNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZ190ZXN0ZWQvcGFja2FnZV9jb25maWcvbGliL3BhY2thZ2VzLmRhcnSJmS8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHBhY2thZ2VfY29uZmlnLnBhY2thZ2VzOwoKaW1wb3J0ICJzcmMvcGFja2FnZXNfaW1wbC5kYXJ0IjsKCi8vLyBBIHBhY2thZ2UgcmVzb2x1dGlvbiBzdHJhdGVneS4KLy8vCi8vLyBBbGxvd3MgY29udmVydGluZyBhIGBwYWNrYWdlOmAgVVJJIHRvIGEgZGlmZmVyZW50IGtpbmQgb2YgVVJJLgovLy8KLy8vIE1heSBhbHNvIGFsbG93IGxpc3RpbmcgdGhlIGF2YWlsYWJsZSBwYWNrYWdlcyBhbmQgY29udmVydGluZwovLy8gdG8gYSBgTWFwPFN0cmluZywgVXJpPmAgdGhhdCBnaXZlcyB0aGUgYmFzZSBsb2NhdGlvbiBvZiBlYWNoIGF2YWlsYWJsZQovLy8gcGFja2FnZS4gSW4gc29tZSBjYXNlcyB0aGVyZSBpcyBubyB3YXkgdG8gZmluZCB0aGUgYXZhaWxhYmxlIHBhY2thZ2VzLAovLy8gaW4gd2hpY2ggY2FzZSBbcGFja2FnZXNdIGFuZCBbYXNNYXBdIHdpbGwgdGhyb3cgaWYgdXNlZC4KLy8vIE9uZSBzdWNoIGNhc2UgaXMgaWYgdGhlIHBhY2thZ2VzIGFyZSByZXNvbHZlZCByZWxhdGl2ZSB0byBhCi8vLyBgcGFja2FnZXMvYCBkaXJlY3RvcnkgYXZhaWxhYmxlIG92ZXIgSFRUUC4KYWJzdHJhY3QgY2xhc3MgUGFja2FnZXMgewogIC8vLyBBIFtQYWNrYWdlc10gcmVzb2x2ZXIgY29udGFpbmluZyBubyBwYWNrYWdlcy4KICAvLy8KICAvLy8gVGhpcyBjb25zdGFudCBvYmplY3QgaXMgcmV0dXJuZWQgYnkgW2ZpbmRdIGFib3ZlIGlmIG5vCiAgLy8vIHBhY2thZ2UgcmVzb2x1dGlvbiBzdHJhdGVneSBpcyBmb3VuZC4KICBzdGF0aWMgY29uc3QgUGFja2FnZXMgbm9QYWNrYWdlcyA9IGNvbnN0IE5vUGFja2FnZXMoKTsKCiAgLy8vIFJlc29sdmUgYSBwYWNrYWdlIFVSSSBpbnRvIGEgbm9uLXBhY2thZ2UgVVJJLgogIC8vLwogIC8vLyBUcmFuc2xhdGVzIGEgYHBhY2thZ2U6YCBVUkksIGFjY29yZGluZyB0byB0aGUgcGFja2FnZSByZXNvbHV0aW9uCiAgLy8vIHN0cmF0ZWd5LCBpbnRvIGEgVVJJIHRoYXQgY2FuIGJlIGxvYWRlZC4KICAvLy8gQnkgZGVmYXVsdCwgb25seSBgZmlsZWAsIGBodHRwYCBhbmQgYGh0dHBzYCBVUklzIGFyZSByZXR1cm5lZC4KICAvLy8gQ3VzdG9tIGBQYWNrYWdlc2Agb2JqZWN0cyBtYXkgcmV0dXJuIG90aGVyIFVSSXMuCiAgLy8vCiAgLy8vIElmIHJlc29sdXRpb24gZmFpbHMgYmVjYXVzZSBhIHBhY2thZ2Ugd2l0aCB0aGUgcmVxdWVzdGVkIHBhY2thZ2UgbmFtZQogIC8vLyBpcyBub3QgYXZhaWxhYmxlLCB0aGUgW25vdEZvdW5kXSBmdW5jdGlvbiBpcyBjYWxsZWQuCiAgLy8vIElmIG5vIGBub3RGb3VuZGAgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGl0IGRlZmF1bHRzIHRvIHRocm93aW5nIGFuIGVycm9yLgogIC8vLwogIC8vLyBUaGUgW3BhY2thZ2VVcmldIG11c3QgYmUgYSB2YWxpZCBwYWNrYWdlIFVSSS4KICBVcmkgcmVzb2x2ZShVcmkgcGFja2FnZVVyaSwge1VyaSBub3RGb3VuZChVcmkgcGFja2FnZVVyaSl9KTsKCiAgLy8vIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGF2YWlsYWJsZSBwYWNrYWdlcy4KICAvLy8KICAvLy8gUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IGFsbG93cyBpdGVyYXRpbmcgdGhlIG5hbWVzIG9mIGF2YWlsYWJsZSBwYWNrYWdlcy4KICAvLy8KICAvLy8gU29tZSBgUGFja2FnZXNgIG9iamVjdHMgYXJlIHVuYWJsZSB0byBmaW5kIHRoZSBwYWNrYWdlIG5hbWVzLAogIC8vLyBhbmQgZ2V0dGluZyBgcGFja2FnZXNgIGZyb20gc3VjaCBhIGBQYWNrYWdlc2Agb2JqZWN0IHdpbGwgdGhyb3cuCiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgcGFja2FnZXM7CgogIC8vLyBSZXR1cm4gdGhlIG5hbWVzLXRvLWJhc2UtVVJJIG1hcHBpbmcgb2YgdGhlIGF2YWlsYWJsZSBwYWNrYWdlcy4KICAvLy8KICAvLy8gUmV0dXJucyBhIG1hcCBmcm9tIHBhY2thZ2UgbmFtZSB0byBhIGJhc2UgVVJJLgogIC8vLyBUaGUgW3Jlc29sdmVdIG1ldGhvZCB3aWxsIHJlc29sdmUgYSBwYWNrYWdlIFVSSSB3aXRoIGEgc3BlY2lmaWMgcGFja2FnZQogIC8vLyBuYW1lIHRvIGEgcGF0aCBleHRlbmRpbmcgdGhlIGJhc2UgVVJJIHRoYXQgdGhpcyBtYXAgZ2l2ZXMgZm9yIHRoYXQKICAvLy8gcGFja2FnZSBuYW1lLgogIC8vLwogIC8vLyBTb21lIGBQYWNrYWdlc2Agb2JqZWN0cyBhcmUgdW5hYmxlIHRvIGZpbmQgdGhlIHBhY2thZ2UgbmFtZXMsCiAgLy8vIGFuZCBjYWxsaW5nIGBhc01hcGAgb24gc3VjaCBhIGBQYWNrYWdlc2Agb2JqZWN0IHdpbGwgdGhyb3cuCiAgTWFwPFN0cmluZywgVXJpPiBhc01hcCgpOwp9CjwATk48ASEBIQEjBEMEQUtLPUAvGjQGPSw5ATQGRy9FNwZMO08GND8BMgZRBkRHIQFGBjVOSRQGREIcAgEkcGFja2FnZTpwYWNrYWdlX2NvbmZpZy9wYWNrYWdlcy5kYXJ0RXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZ190ZXN0ZWQvcGFja2FnZV9jb25maWcvbGliL3BhY2thZ2VzX2ZpbGUuZGFydJiWLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgcGFja2FnZV9jb25maWcucGFja2FnZXNfZmlsZTsKCmltcG9ydCAicGFja2FnZTpjaGFyY29kZS9hc2NpaS5kYXJ0IjsKCmltcG9ydCAic3JjL3V0aWwuZGFydCIgc2hvdyBpc1ZhbGlkUGFja2FnZU5hbWU7CgovLy8gUGFyc2VzIGEgYC5wYWNrYWdlc2AgZmlsZSBpbnRvIGEgbWFwIGZyb20gcGFja2FnZSBuYW1lIHRvIGJhc2UgVVJJLgovLy8KLy8vIFRoZSBbc291cmNlXSBpcyB0aGUgYnl0ZSBjb250ZW50IG9mIGEgYC5wYWNrYWdlc2AgZmlsZSwgYXNzdW1lZCB0byBiZQovLy8gVVRGLTggZW5jb2RlZC4gSW4gcHJhY3RpY2UsIGFsbCBzaWduaWZpY2FudCBwYXJ0cyBvZiB0aGUgZmlsZSBtdXN0IGJlIEFTQ0lJLAovLy8gc28gTGF0aW4tMSBvciBXaW5kb3dzLTEyNTIgZW5jb2Rpbmcgd2lsbCBhbHNvIHdvcmsgZmluZS4KLy8vCi8vLyBJZiB0aGUgZmlsZSBjb250ZW50IGlzIGF2YWlsYWJsZSBhcyBhIHN0cmluZywgaXRzIFtTdHJpbmcuY29kZVVuaXRzXSBjYW4KLy8vIGJlIHVzZWQgYXMgdGhlIGBzb3VyY2VgIGFyZ3VtZW50IG9mIHRoaXMgZnVuY3Rpb24uCi8vLwovLy8gVGhlIFtiYXNlTG9jYXRpb25dIGlzIHVzZWQgYXMgYSBiYXNlIFVSSSB0byByZXNvbHZlIGFsbCByZWxhdGl2ZQovLy8gVVJJIHJlZmVyZW5jZXMgYWdhaW5zdC4KLy8vIElmIHRoZSBjb250ZW50IHdhcyByZWFkIGZyb20gYSBmaWxlLCBgYmFzZUxvY2F0aW9uYCBzaG91bGQgYmUgdGhlCi8vLyBsb2NhdGlvbiBvZiB0aGF0IGZpbGUuCi8vLwovLy8gUmV0dXJucyBhIHNpbXBsZSBtYXBwaW5nIGZyb20gcGFja2FnZSBuYW1lIHRvIHBhY2thZ2UgbG9jYXRpb24uCk1hcDxTdHJpbmcsIFVyaT4gcGFyc2UoTGlzdDxpbnQ+IHNvdXJjZSwgVXJpIGJhc2VMb2NhdGlvbikgewogIGludCBpbmRleCA9IDA7CiAgTWFwPFN0cmluZywgVXJpPiByZXN1bHQgPSA8U3RyaW5nLCBVcmk+e307CiAgd2hpbGUgKGluZGV4IDwgc291cmNlLmxlbmd0aCkgewogICAgYm9vbCBpc0NvbW1lbnQgPSBmYWxzZTsKICAgIGludCBzdGFydCA9IGluZGV4OwogICAgaW50IHNlcGFyYXRvckluZGV4ID0gLTE7CiAgICBpbnQgZW5kID0gc291cmNlLmxlbmd0aDsKICAgIGludCBjaGFyID0gc291cmNlW2luZGV4KytdOwogICAgaWYgKGNoYXIgPT0gJGNyIHx8IGNoYXIgPT0gJGxmKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKGNoYXIgPT0gJGNvbG9uKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oIk1pc3NpbmcgcGFja2FnZSBuYW1lIiwgc291cmNlLCBpbmRleCAtIDEpOwogICAgfQogICAgaXNDb21tZW50ID0gY2hhciA9PSAkaGFzaDsKICAgIHdoaWxlIChpbmRleCA8IHNvdXJjZS5sZW5ndGgpIHsKICAgICAgY2hhciA9IHNvdXJjZVtpbmRleCsrXTsKICAgICAgaWYgKGNoYXIgPT0gJGNvbG9uICYmIHNlcGFyYXRvckluZGV4IDwgMCkgewogICAgICAgIHNlcGFyYXRvckluZGV4ID0gaW5kZXggLSAxOwogICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJGNyIHx8IGNoYXIgPT0gJGxmKSB7CiAgICAgICAgZW5kID0gaW5kZXggLSAxOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNDb21tZW50KSBjb250aW51ZTsKICAgIGlmIChzZXBhcmF0b3JJbmRleCA8IDApIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiTm8gJzonIG9uIGxpbmUiLCBzb3VyY2UsIGluZGV4IC0gMSk7CiAgICB9CiAgICB2YXIgcGFja2FnZU5hbWUgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoc291cmNlLCBzdGFydCwgc2VwYXJhdG9ySW5kZXgpOwogICAgaWYgKCFpc1ZhbGlkUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oIk5vdCBhIHZhbGlkIHBhY2thZ2UgbmFtZSIsIHBhY2thZ2VOYW1lLCAwKTsKICAgIH0KICAgIHZhciBwYWNrYWdlVXJpID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKHNvdXJjZSwgc2VwYXJhdG9ySW5kZXggKyAxLCBlbmQpOwogICAgdmFyIHBhY2thZ2VMb2NhdGlvbiA9IFVyaS5wYXJzZShwYWNrYWdlVXJpKTsKICAgIHBhY2thZ2VMb2NhdGlvbiA9IGJhc2VMb2NhdGlvbi5yZXNvbHZlVXJpKHBhY2thZ2VMb2NhdGlvbik7CiAgICBpZiAoIXBhY2thZ2VMb2NhdGlvbi5wYXRoLmVuZHNXaXRoKCcvJykpIHsKICAgICAgcGFja2FnZUxvY2F0aW9uID0KICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbi5yZXBsYWNlKHBhdGg6IHBhY2thZ2VMb2NhdGlvbi5wYXRoICsgIi8iKTsKICAgIH0KICAgIGlmIChyZXN1bHQuY29udGFpbnNLZXkocGFja2FnZU5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiU2FtZSBwYWNrYWdlIG5hbWUgb2NjdXJlZCB0d2ljZS4iLCBzb3VyY2UsIHN0YXJ0KTsKICAgIH0KICAgIHJlc3VsdFtwYWNrYWdlTmFtZV0gPSBwYWNrYWdlTG9jYXRpb247CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KCi8vLyBXcml0ZXMgdGhlIG1hcHBpbmcgdG8gYSBbU3RyaW5nU2lua10uCi8vLwovLy8gSWYgW2NvbW1lbnRdIGlzIHByb3ZpZGVkLCB0aGUgb3V0cHV0IHdpbGwgY29udGFpbiB0aGlzIGNvbW1lbnQKLy8vIHdpdGggYCMgYCBpbiBmcm9udCBvZiBlYWNoIGxpbmUuCi8vLyBMaW5lcyBhcmUgZGVmaW5lZCBhcyBlbmRpbmcgaW4gbGluZSBmZWVkIChgJ1xuJ2ApLiBJZiB0aGUgZmluYWwKLy8vIGxpbmUgb2YgdGhlIGNvbW1lbnQgZG9lc24ndCBlbmQgaW4gYSBsaW5lIGZlZWQsIG9uZSB3aWxsIGJlIGFkZGVkLgovLy8KLy8vIElmIFtiYXNlVXJpXSBpcyBwcm92aWRlZCwgcGFja2FnZSBsb2NhdGlvbnMgd2lsbCBiZSBtYWRlIHJlbGF0aXZlCi8vLyB0byB0aGUgYmFzZSBVUkksIGlmIHBvc3NpYmxlLCBiZWZvcmUgd3JpdGluZy4KLy8vCi8vLyBBbGwgdGhlIGtleXMgb2YgW3BhY2thZ2VNYXBwaW5nXSBtdXN0IGJlIHZhbGlkIHBhY2thZ2UgbmFtZXMsCi8vLyBhbmQgdGhlIHZhbHVlcyBtdXN0IGJlIFVSSXMgdGhhdCBkbyBub3QgaGF2ZSB0aGUgYHBhY2thZ2U6YCBzY2hlbWUuCnZvaWQgd3JpdGUoU3RyaW5nU2luayBvdXRwdXQsIE1hcDxTdHJpbmcsIFVyaT4gcGFja2FnZU1hcHBpbmcsCiAgICB7VXJpIGJhc2VVcmksIFN0cmluZyBjb21tZW50fSkgewogIGlmIChiYXNlVXJpICE9IG51bGwgJiYgIWJhc2VVcmkuaXNBYnNvbHV0ZSkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUoYmFzZVVyaSwgImJhc2VVcmkiLCAiTXVzdCBiZSBhYnNvbHV0ZSIpOwogIH0KCiAgaWYgKGNvbW1lbnQgIT0gbnVsbCkgewogICAgdmFyIGxpbmVzID0gY29tbWVudC5zcGxpdCgnXG4nKTsKICAgIGlmIChsaW5lcy5sYXN0LmlzRW1wdHkpIGxpbmVzLnJlbW92ZUxhc3QoKTsKICAgIGZvciAodmFyIGNvbW1lbnRMaW5lIGluIGxpbmVzKSB7CiAgICAgIG91dHB1dC53cml0ZSgnIyAnKTsKICAgICAgb3V0cHV0LndyaXRlbG4oY29tbWVudExpbmUpOwogICAgfQogIH0gZWxzZSB7CiAgICBvdXRwdXQud3JpdGUoIiMgZ2VuZXJhdGVkIGJ5IHBhY2thZ2U6cGFja2FnZV9jb25maWcgYXQgIik7CiAgICBvdXRwdXQud3JpdGUobmV3IERhdGVUaW1lLm5vdygpKTsKICAgIG91dHB1dC53cml0ZWxuKCk7CiAgfQoKICBwYWNrYWdlTWFwcGluZy5mb3JFYWNoKChTdHJpbmcgcGFja2FnZU5hbWUsIFVyaSB1cmkpIHsKICAgIC8vIFZhbGlkYXRlIHBhY2thZ2VOYW1lLgogICAgaWYgKCFpc1ZhbGlkUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCciJHBhY2thZ2VOYW1lIiBpcyBub3QgYSB2YWxpZCBwYWNrYWdlIG5hbWUnKTsKICAgIH0KICAgIGlmICh1cmkuc2NoZW1lID09ICJwYWNrYWdlIikgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICAgICJQYWNrYWdlIGxvY2F0aW9uIG11c3Qgbm90IGJlIGEgcGFja2FnZTogVVJJIiwgdXJpLnRvU3RyaW5nKCkpOwogICAgfQogICAgb3V0cHV0LndyaXRlKHBhY2thZ2VOYW1lKTsKICAgIG91dHB1dC53cml0ZSgnOicpOwogICAgLy8gSWYgYmFzZVVyaSBwcm92aWRlZCwgbWFrZSB1cmkgcmVsYXRpdmUuCiAgICBpZiAoYmFzZVVyaSAhPSBudWxsKSB7CiAgICAgIHVyaSA9IF9yZWxhdGl2aXplKHVyaSwgYmFzZVVyaSk7CiAgICB9CiAgICBvdXRwdXQud3JpdGUodXJpKTsKICAgIGlmICghdXJpLnBhdGguZW5kc1dpdGgoJy8nKSkgewogICAgICBvdXRwdXQud3JpdGUoJy8nKTsKICAgIH0KICAgIG91dHB1dC53cml0ZWxuKCk7CiAgfSk7Cn0KCi8vLyBBdHRlbXB0cyB0byByZXR1cm4gYSByZWxhdGl2ZSBVUkkgZm9yIFt1cmldLgovLy8KLy8vIFRoZSByZXN1bHQgVVJJIHNhdGlzZmllcyBgYmFzZVVyaS5yZXNvbHZlVXJpKHJlc3VsdCkgPT0gdXJpYCwKLy8vIGJ1dCBtYXkgYmUgcmVsYXRpdmUuCi8vLyBUaGUgYGJhc2VVcmlgIG11c3QgYmUgYWJzb2x1dGUuClVyaSBfcmVsYXRpdml6ZShVcmkgdXJpLCBVcmkgYmFzZVVyaSkgewogIGFzc2VydChiYXNlVXJpLmlzQWJzb2x1dGUpOwogIGlmICh1cmkuaGFzUXVlcnkgfHwgdXJpLmhhc0ZyYWdtZW50KSB7CiAgICB1cmkgPSBuZXcgVXJpKAogICAgICAgIHNjaGVtZTogdXJpLnNjaGVtZSwKICAgICAgICB1c2VySW5mbzogdXJpLmhhc0F1dGhvcml0eSA/IHVyaS51c2VySW5mbyA6IG51bGwsCiAgICAgICAgaG9zdDogdXJpLmhhc0F1dGhvcml0eSA/IHVyaS5ob3N0IDogbnVsbCwKICAgICAgICBwb3J0OiB1cmkuaGFzQXV0aG9yaXR5ID8gdXJpLnBvcnQgOiBudWxsLAogICAgICAgIHBhdGg6IHVyaS5wYXRoKTsKICB9CgogIC8vIEFscmVhZHkgcmVsYXRpdmUuIFdlIGFzc3VtZSB0aGUgY2FsbGVyIGtub3dzIHdoYXQgdGhleSBhcmUgZG9pbmcuCiAgaWYgKCF1cmkuaXNBYnNvbHV0ZSkgcmV0dXJuIHVyaTsKCiAgaWYgKGJhc2VVcmkuc2NoZW1lICE9IHVyaS5zY2hlbWUpIHsKICAgIHJldHVybiB1cmk7CiAgfQoKICAvLyBJZiBhdXRob3JpdHkgZGlmZmVycywgd2UgY291bGQgcmVtb3ZlIHRoZSBzY2hlbWUsIGJ1dCBpdCdzIG5vdCB3b3J0aCBpdC4KICBpZiAodXJpLmhhc0F1dGhvcml0eSAhPSBiYXNlVXJpLmhhc0F1dGhvcml0eSkgcmV0dXJuIHVyaTsKICBpZiAodXJpLmhhc0F1dGhvcml0eSkgewogICAgaWYgKHVyaS51c2VySW5mbyAhPSBiYXNlVXJpLnVzZXJJbmZvIHx8CiAgICAgICAgdXJpLmhvc3QudG9Mb3dlckNhc2UoKSAhPSBiYXNlVXJpLmhvc3QudG9Mb3dlckNhc2UoKSB8fAogICAgICAgIHVyaS5wb3J0ICE9IGJhc2VVcmkucG9ydCkgewogICAgICByZXR1cm4gdXJpOwogICAgfQogIH0KCiAgYmFzZVVyaSA9IGJhc2VVcmkubm9ybWFsaXplUGF0aCgpOwogIExpc3Q8U3RyaW5nPiBiYXNlID0gYmFzZVVyaS5wYXRoU2VnbWVudHMudG9MaXN0KCk7CiAgaWYgKGJhc2UuaXNOb3RFbXB0eSkgewogICAgYmFzZSA9IG5ldyBMaXN0PFN0cmluZz4uZnJvbShiYXNlKS4ucmVtb3ZlTGFzdCgpOwogIH0KICB1cmkgPSB1cmkubm9ybWFsaXplUGF0aCgpOwogIExpc3Q8U3RyaW5nPiB0YXJnZXQgPSB1cmkucGF0aFNlZ21lbnRzLnRvTGlzdCgpOwogIGlmICh0YXJnZXQuaXNOb3RFbXB0eSAmJiB0YXJnZXQubGFzdC5pc0VtcHR5KSB0YXJnZXQucmVtb3ZlTGFzdCgpOwogIGludCBpbmRleCA9IDA7CiAgd2hpbGUgKGluZGV4IDwgYmFzZS5sZW5ndGggJiYgaW5kZXggPCB0YXJnZXQubGVuZ3RoKSB7CiAgICBpZiAoYmFzZVtpbmRleF0gIT0gdGFyZ2V0W2luZGV4XSkgewogICAgICBicmVhazsKICAgIH0KICAgIGluZGV4Kys7CiAgfQogIGlmIChpbmRleCA9PSBiYXNlLmxlbmd0aCkgewogICAgaWYgKGluZGV4ID09IHRhcmdldC5sZW5ndGgpIHsKICAgICAgcmV0dXJuIG5ldyBVcmkocGF0aDogIi4vIik7CiAgICB9CiAgICByZXR1cm4gbmV3IFVyaShwYXRoOiB0YXJnZXQuc2tpcChpbmRleCkuam9pbignLycpKTsKICB9IGVsc2UgaWYgKGluZGV4ID4gMCkgewogICAgcmV0dXJuIG5ldyBVcmkoCiAgICAgICAgcGF0aDogJy4uLycgKiAoYmFzZS5sZW5ndGggLSBpbmRleCkgKyB0YXJnZXQuc2tpcChpbmRleCkuam9pbignLycpKTsKICB9IGVsc2UgewogICAgcmV0dXJuIHVyaTsKICB9Cn0KgL4ATk48ASYBJgEwAUgESlE9BE03BEUcRhsERD0RLSIcFx0dICYQBhpMBh8kHjIkLxkPCAYdHkYGTyxNBlAxQC8YRQYrIT4GKwQRAgEqBEMlREcERjIEQkg/JTBLBAEZJTAlGiMGCz8mFgQBOR0sTQYjJUoGHxcvGycGFyMZBhYGAgExBEIZJCgeKRMcOjIyGQQBRyMBJhAEAU48GixAJBIGBAElNRk2BB0zRRE5KA0GDQQeIiIGOBoUTQsQBAIBKXBhY2thZ2U6cGFja2FnZV9jb25maWcvcGFja2FnZXNfZmlsZS5kYXJ0SXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZ190ZXN0ZWQvcGFja2FnZV9jb25maWcvbGliL3NyYy9wYWNrYWdlc19pbXBsLmRhcnSMTS8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gSW1wbGVtZW50YXRpb25zIG9mIFtQYWNrYWdlc10gdGhhdCBtYXkgYmUgdXNlZCBpbiBlaXRoZXIgc2VydmVyIG9yIGJyb3dzZXIKLy8vIGJhc2VkIGFwcGxpY2F0aW9ucy4gRm9yIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbiBvbmx5IHJ1biBpbiB0aGUgYnJvd3NlciwKLy8vIHNlZSBbcGFja2FnZV9jb25maWcucGFja2FnZXNfaW9faW1wbF0uCmxpYnJhcnkgcGFja2FnZV9jb25maWcucGFja2FnZXNfaW1wbDsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIiBzaG93IFVubW9kaWZpYWJsZU1hcFZpZXc7CgppbXBvcnQgIi4uL3BhY2thZ2VzLmRhcnQiOwppbXBvcnQgInV0aWwuZGFydCIgc2hvdyBjaGVja1ZhbGlkUGFja2FnZVVyaTsKCi8vLyBBIFtQYWNrYWdlc10gbnVsbC1vYmplY3QuCmNsYXNzIE5vUGFja2FnZXMgaW1wbGVtZW50cyBQYWNrYWdlcyB7CiAgY29uc3QgTm9QYWNrYWdlcygpOwoKICBVcmkgcmVzb2x2ZShVcmkgcGFja2FnZVVyaSwge1VyaSBub3RGb3VuZChVcmkgcGFja2FnZVVyaSl9KSB7CiAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjaGVja1ZhbGlkUGFja2FnZVVyaShwYWNrYWdlVXJpKTsKICAgIGlmIChub3RGb3VuZCAhPSBudWxsKSByZXR1cm4gbm90Rm91bmQocGFja2FnZVVyaSk7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICBwYWNrYWdlVXJpLCAicGFja2FnZVVyaSIsICdObyBwYWNrYWdlIG5hbWVkICIkcGFja2FnZU5hbWUiJyk7CiAgfQoKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBwYWNrYWdlcyA9PiBuZXcgSXRlcmFibGU8U3RyaW5nPi5lbXB0eSgpOwoKICBNYXA8U3RyaW5nLCBVcmk+IGFzTWFwKCkgPT4gY29uc3QgPFN0cmluZywgVXJpPnt9Owp9CgovLy8gQmFzZSBjbGFzcyBmb3IgW1BhY2thZ2VzXSBpbXBsZW1lbnRhdGlvbnMuCi8vLwovLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBbcmVzb2x2ZV0gbWV0aG9kIGluIHRlcm1zIG9mIGEgcHJpdmF0ZQovLy8gbWVtYmVyCmFic3RyYWN0IGNsYXNzIFBhY2thZ2VzQmFzZSBpbXBsZW1lbnRzIFBhY2thZ2VzIHsKICBVcmkgcmVzb2x2ZShVcmkgcGFja2FnZVVyaSwge1VyaSBub3RGb3VuZChVcmkgcGFja2FnZVVyaSl9KSB7CiAgICBwYWNrYWdlVXJpID0gcGFja2FnZVVyaS5ub3JtYWxpemVQYXRoKCk7CiAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjaGVja1ZhbGlkUGFja2FnZVVyaShwYWNrYWdlVXJpKTsKICAgIFVyaSBwYWNrYWdlQmFzZSA9IGdldEJhc2UocGFja2FnZU5hbWUpOwogICAgaWYgKHBhY2thZ2VCYXNlID09IG51bGwpIHsKICAgICAgaWYgKG5vdEZvdW5kICE9IG51bGwpIHJldHVybiBub3RGb3VuZChwYWNrYWdlVXJpKTsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUoCiAgICAgICAgICBwYWNrYWdlVXJpLCAicGFja2FnZVVyaSIsICdObyBwYWNrYWdlIG5hbWVkICIkcGFja2FnZU5hbWUiJyk7CiAgICB9CiAgICBTdHJpbmcgcGFja2FnZVBhdGggPSBwYWNrYWdlVXJpLnBhdGguc3Vic3RyaW5nKHBhY2thZ2VOYW1lLmxlbmd0aCArIDEpOwogICAgcmV0dXJuIHBhY2thZ2VCYXNlLnJlc29sdmUocGFja2FnZVBhdGgpOwogIH0KCiAgLy8vIEZpbmQgYSBiYXNlIGxvY2F0aW9uIGZvciBhIHBhY2thZ2UgbmFtZS4KICAvLy8KICAvLy8gUmV0dXJucyBgbnVsbGAgaWYgbm8gcGFja2FnZSBleGlzdHMgd2l0aCB0aGF0IG5hbWUsIGFuZCB0aGF0IGNhbiBiZQogIC8vLyBkZXRlcm1pbmVkLgogIFVyaSBnZXRCYXNlKFN0cmluZyBwYWNrYWdlTmFtZSk7Cn0KCi8vLyBBIFtQYWNrYWdlc10gaW1wbGVtZW50YXRpb24gYmFzZWQgb24gYW4gZXhpc3RpbmcgbWFwLgpjbGFzcyBNYXBQYWNrYWdlcyBleHRlbmRzIFBhY2thZ2VzQmFzZSB7CiAgZmluYWwgTWFwPFN0cmluZywgVXJpPiBfbWFwcGluZzsKICBNYXBQYWNrYWdlcyh0aGlzLl9tYXBwaW5nKTsKCiAgVXJpIGdldEJhc2UoU3RyaW5nIHBhY2thZ2VOYW1lKSA9PiBfbWFwcGluZ1twYWNrYWdlTmFtZV07CgogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IHBhY2thZ2VzID0+IF9tYXBwaW5nLmtleXM7CgogIE1hcDxTdHJpbmcsIFVyaT4gYXNNYXAoKSA9PiBuZXcgVW5tb2RpZmlhYmxlTWFwVmlldzxTdHJpbmcsIFVyaT4oX21hcHBpbmcpOwp9CgovLy8gQSBbUGFja2FnZXNdIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGEgcmVtb3RlIChlLmcuLCBIVFRQKSBkaXJlY3RvcnkuCi8vLwovLy8gVGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCB3aGljaCBwYWNrYWdlcyBleGlzdCBzaG9ydCBvZiB0cnlpbmcgdG8gdXNlCi8vLyB0aGVtLiBZb3UgY2FuJ3QgbmVjZXNzYXJpbHkgY2hlY2sgd2hldGhlciBhIGRpcmVjdG9yeSBleGlzdHMsCi8vLyBleGNlcHQgYnkgY2hlY2tpbmcgZm9yIGEga25vdyBmaWxlIGluIHRoZSBkaXJlY3RvcnkuCmNsYXNzIE5vbkZpbGVQYWNrYWdlc0RpcmVjdG9yeVBhY2thZ2VzIGV4dGVuZHMgUGFja2FnZXNCYXNlIHsKICBmaW5hbCBVcmkgX3BhY2thZ2VCYXNlOwogIE5vbkZpbGVQYWNrYWdlc0RpcmVjdG9yeVBhY2thZ2VzKHRoaXMuX3BhY2thZ2VCYXNlKTsKCiAgVXJpIGdldEJhc2UoU3RyaW5nIHBhY2thZ2VOYW1lKSA9PiBfcGFja2FnZUJhc2UucmVzb2x2ZSgiJHBhY2thZ2VOYW1lLyIpOwoKICBFcnJvciBfZmFpbExpc3RpbmdQYWNrYWdlcygpIHsKICAgIHJldHVybiBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQ2Fubm90IGxpc3QgcGFja2FnZXMgZm9yIGEgJHtfcGFja2FnZUJhc2Uuc2NoZW1lfTogIgogICAgICAgICJiYXNlZCBwYWNrYWdlIHJvb3QiKTsKICB9CgogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IHBhY2thZ2VzIHsKICAgIHRocm93IF9mYWlsTGlzdGluZ1BhY2thZ2VzKCk7CiAgfQoKICBNYXA8U3RyaW5nLCBVcmk+IGFzTWFwKCkgewogICAgdGhyb3cgX2ZhaWxMaXN0aW5nUGFja2FnZXMoKTsKICB9Cn0KXgBOTjwBT04rJgEzARsuAR4nFgFAOzcjRgQBQQE1AgEvBEULMkAtOywfOSVIBkwtBAEvBkoSIwIBOikjHgE8ATIBTgIBSgRKQjk+GjcBTAEhIT4fBAEiIgQBHSIEAgEtcGFja2FnZTpwYWNrYWdlX2NvbmZpZy9zcmMvcGFja2FnZXNfaW1wbC5kYXJ0SHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9hcGlfcHJvdG90eXBlL3Rlcm1pbmFsX2NvbG9yX3N1cHBvcnQuZGFydI0rLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZnJvbnRfZW5kLnRlcm1pbmFsX2NvbG9yX3N1cHBvcnQ7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBqc29uRW5jb2RlOwoKaW1wb3J0ICdkYXJ0OmlvJyBzaG93IFBsYXRmb3JtLCBQcm9jZXNzLCBQcm9jZXNzUmVzdWx0LCBzdGRlcnIsIHN0ZG91dDsKCmltcG9ydCAnLi4vZmFzdGEvY29sb3JzLmRhcnQnIHNob3cgQUxMX0NPREVTLCBURVJNSU5BTF9DQVBBQklMSVRJRVM7CgppbXBvcnQgJ2RpYWdub3N0aWNfbWVzc2FnZS5kYXJ0JyBzaG93IERpYWdub3N0aWNNZXNzYWdlOwoKLy8vIFRydWUgaWYgd2Ugc2hvdWxkIGVuYWJsZSBjb2xvcnMgaW4gb3V0cHV0LgovLy8KLy8vIFdlIGVuYWJsZSBjb2xvcnMgb25seSB3aGVuIGJvdGggW3N0ZG91dF0gYW5kIFtzdGRlcnJdIHN1cHBvcnQgQU5TSSBlc2NhcGVzLgpmaW5hbCBib29sIGVuYWJsZVRlcm1pbmFsQ29sb3JzID0gX2NvbXB1dGVFbmFibGVDb2xvcnMoKTsKCnZvaWQgcHJpbnREaWFnbm9zdGljTWVzc2FnZSgKICAgIERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UsIHZvaWQgRnVuY3Rpb24oU3RyaW5nKSBwcmludGxuKSB7CiAgaWYgKGVuYWJsZVRlcm1pbmFsQ29sb3JzKSB7CiAgICBtZXNzYWdlLmFuc2lGb3JtYXR0ZWQuZm9yRWFjaChwcmludGxuKTsKICB9IGVsc2UgewogICAgbWVzc2FnZS5wbGFpblRleHRGb3JtYXR0ZWQuZm9yRWFjaChwcmludGxuKTsKICB9Cn0KCi8vLyBPbiBXaW5kb3dzLCBjb2xvcnMgYXJlIGVuYWJsZWQgaWYgYm90aCBzdGRvdXQgYW5kIHN0ZGVyciBzdXBwb3J0cyBBTlNJCi8vLyBlc2NhcGVzLiAgT24gb3RoZXIgcGxhdGZvcm1zLCB3ZSByZWx5IG9uIHRoZSBleHRlcm5hbCBwcm9ncmFtcyBgdHR5YCBhbmQKLy8vIGB0cHV0YCB0byBjb21wdXRlIGlmIEFOU0kgY29sb3JzIGFyZSBzdXBwb3J0ZWQuCmJvb2wgX2NvbXB1dGVFbmFibGVDb2xvcnMoKSB7CiAgY29uc3QgYm9vbCBkZWJ1ZyA9CiAgICAgIGNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCJmcm9udF9lbmQuZGVidWdfY29tcHV0ZV9lbmFibGVfY29sb3JzIik7CgogIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgIGlmICghc3Rkb3V0LnN1cHBvcnRzQW5zaUVzY2FwZXMgfHwgIXN0ZGVyci5zdXBwb3J0c0Fuc2lFc2NhcGVzKSB7CiAgICAgIC8vIEluIHRoaXMgY2FzZSwgZWl0aGVyIFtzdGRvdXRdIG9yIFtzdGRlcnJdIGRpZCBub3Qgc3VwcG9ydCB0aGUgcHJvcGVydHkKICAgICAgLy8gYHN1cHBvcnRzQW5zaUVzY2FwZXNgLiBTaW5jZSB3ZSBkbyBub3QgaGF2ZSBhbm90aGVyIHdheSB0byBkZXRlcm1pbmUKICAgICAgLy8gc3VwcG9ydCBmb3IgY29sb3JzLCB3ZSBkaXNhYmxlIHRoZW0uCiAgICAgIGlmIChkZWJ1ZykgewogICAgICAgIHByaW50KCJOb3QgZW5hYmxpbmcgY29sb3JzIGFzIEFOU0kgaXMgbm90IHN1cHBvcnRlZC4iKTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoZGVidWcpIHsKICAgICAgcHJpbnQoIkVuYWJsaW5nIGNvbG9ycyBhcyBPUyBpcyBXaW5kb3dzLiIpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLyBXZSBoYXZlIHRvIGNoZWNrIGlmIHRoZSB0ZXJtaW5hbCBhY3R1YWxseSBzdXBwb3J0cyBjb2xvcnMuIEN1cnJlbnRseSwgdG8KICAvLyBhdm9pZCBsaW5raW5nIHRoZSBEYXJ0IFZNIHdpdGggbmN1cnNlcywgQU5TSSBlc2NhcGUgc3VwcG9ydCBpcyByZWR1Y2VkIHRvCiAgLy8gYFBsYXRmb3JtLmVudmlyb25tZW50WydURVJNJ10uY29udGFpbnMoInh0ZXJtIilgLgoKICAvLyBDaGVjayBpZiBzdGRpbiBpcyBhIHRlcm1pbmFsIChUVFkpLgogIFByb2Nlc3NSZXN1bHQgcmVzdWx0ID0KICAgICAgUHJvY2Vzcy5ydW5TeW5jKCIvYmluL3NoIiwgWyItYyIsICJ0dHkgPiAvZGV2L251bGwgMj4gL2Rldi9udWxsIl0pOwoKICBpZiAocmVzdWx0LmV4aXRDb2RlICE9IDApIHsKICAgIGlmIChkZWJ1ZykgewogICAgICBwcmludCgiTm90IGVuYWJsaW5nIGNvbG9ycywgc3RkaW4gaXNuJ3QgYSB0ZXJtaW5hbC4iKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vIFRoZSBgLVNgIG9wdGlvbiBvZiBgdHB1dGAgYWxsb3dzIHVzIHRvIHF1ZXJ5IG11bHRpcGxlIGNhcGFiaWxpdGllcyBhdAogIC8vIG9uY2UuCiAgcmVzdWx0ID0gUHJvY2Vzcy5ydW5TeW5jKAogICAgICAiL2Jpbi9zaCIsIFsiLWMiLCAicHJpbnRmICclcycgJyRURVJNSU5BTF9DQVBBQklMSVRJRVMnIHwgdHB1dCAtUyJdKTsKCiAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPSAwKSB7CiAgICBpZiAoZGVidWcpIHsKICAgICAgcHJpbnQoIk5vdCBlbmFibGluZyBjb2xvcnMsIHJ1bm5pbmcgdHB1dCBmYWlsZWQuIik7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBMaXN0PFN0cmluZz4gbGluZXMgPSByZXN1bHQuc3Rkb3V0LnNwbGl0KCJcbiIpOwoKICBpZiAobGluZXMubGVuZ3RoICE9IDIpIHsKICAgIGlmIChkZWJ1ZykgewogICAgICBwcmludCgiTm90IGVuYWJsaW5nIGNvbG9ycywgdW5leHBlY3RlZCBvdXRwdXQgZnJvbSB0cHV0OiAiCiAgICAgICAgICAiJHtqc29uRW5jb2RlKHJlc3VsdC5zdGRvdXQpfS4iKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIFN0cmluZyBudW1iZXJPZkNvbG9ycyA9IGxpbmVzWzBdOwogIGlmICgoaW50LnRyeVBhcnNlKG51bWJlck9mQ29sb3JzKSA/PyAtMSkgPCA4KSB7CiAgICBpZiAoZGVidWcpIHsKICAgICAgcHJpbnQoIk5vdCBlbmFibGluZyBjb2xvcnMsIGxlc3MgdGhhbiA4IGNvbG9ycyBzdXBwb3J0ZWQ6ICIKICAgICAgICAgICIke2pzb25FbmNvZGUobnVtYmVyT2ZDb2xvcnMpfS4iKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIFN0cmluZyBhbGxDb2RlcyA9IGxpbmVzWzFdLnRyaW0oKTsKICBpZiAoQUxMX0NPREVTICE9IGFsbENvZGVzKSB7CiAgICBpZiAoZGVidWcpIHsKICAgICAgcHJpbnQoIk5vdCBlbmFibGluZyBjb2xvcnMsIGNvbG9yIGNvZGVzIGRvbid0IG1hdGNoOiAiCiAgICAgICAgICAiJHtqc29uRW5jb2RlKEFMTF9DT0RFUyl9ICE9ICR7anNvbkVuY29kZShhbGxDb2Rlcyl9LiIpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgaWYgKGRlYnVnKSB7CiAgICBwcmludCgiRW5hYmxpbmcgY29sb3JzLiIpOwogIH0KICByZXR1cm4gdHJ1ZTsKfQpxAE5OPAEqAScBSAFFATkBLwRQOgEdQB4sCzEEAgFLTTQeFUsBHEZQTi4TQAgUBhEyBhEEAU5PNwEpGUoBHhE9BhIEAUsLHEwBHhE6BhIEATIBGxFBLAYSBAEkMhFCLQYSBAElHxE9QwYSBAEPHwQPAgE/cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvdGVybWluYWxfY29sb3Jfc3VwcG9ydC5kYXJ0QHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9jb21tYW5kX2xpbmVfcmVwb3J0aW5nLmRhcnSXoS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gUHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXBvcnQgYW5kIGZvcm1hdCBtZXRob2RzIG9mCi8vLyBbQ29tcGlsZXJDb250ZXh0XSB0aGF0IGFyZSBzdWl0YWJsZSBmb3IgY29tbWFuZC1saW5lIHRvb2xzLiBUaGUgbWV0aG9kcyBpbgovLy8gdGhpcyBsaWJyYXJ5IGFyZW4ndCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHksIGluc3RlYWQsIG9uZSBzaG91bGQgdXNlCi8vLyBbQ29tcGlsZXJDb250ZXh0XS4KbGlicmFyeSBmYXN0YS5jb21tYW5kX2xpbmVfcmVwb3J0aW5nOwoKaW1wb3J0ICdkYXJ0Om1hdGgnIHNob3cgbWluOwoKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBMb2NhdGlvbiwgVHJlZU5vZGU7CgppbXBvcnQgJy4uL2NvbXB1dGVfcGxhdGZvcm1fYmluYXJpZXNfbG9jYXRpb24uZGFydCcgc2hvdyB0cmFuc2xhdGVTZGs7CgppbXBvcnQgJ2NvbG9ycy5kYXJ0JyBzaG93IGdyZWVuLCBtYWdlbnRhLCByZWQ7CgppbXBvcnQgJ2NvbXBpbGVyX2NvbnRleHQuZGFydCcgc2hvdyBDb21waWxlckNvbnRleHQ7CgppbXBvcnQgJ2NyYXNoLmRhcnQnIHNob3cgQ3Jhc2gsIHNhZmVUb1N0cmluZzsKCmltcG9ydCAnZmFzdGFfY29kZXMuZGFydCcgc2hvdyBMb2NhdGVkTWVzc2FnZTsKCmltcG9ydCAnbWVzc2FnZXMuZGFydCcgc2hvdyBnZXRMb2NhdGlvbiwgZ2V0U291cmNlTGluZTsKCmltcG9ydCAncHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQ7CgppbXBvcnQgJ3Jlc29sdmVfaW5wdXRfdXJpLmRhcnQnIHNob3cgaXNXaW5kb3dzOwoKaW1wb3J0ICdzZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5LCBzZXZlcml0eVByZWZpeGVzOwoKaW1wb3J0ICdzY2FubmVyL2NoYXJhY3RlcnMuZGFydCcgc2hvdyAkQ0FSRVQsICRTUEFDRSwgJFRBQjsKCmltcG9ydCAndXRpbC9yZWxhdGl2aXplLmRhcnQnIHNob3cgcmVsYXRpdml6ZVVyaTsKCmNvbnN0IGJvb2wgaGlkZVdhcm5pbmdzID0gZmFsc2U7CgovLy8gRm9ybWF0cyBbbWVzc2FnZV0gYXMgYSBzdHJpbmcgdGhhdCBpcyBzdWl0YWJsZSBmb3Igb3V0cHV0IGZyb20gYQovLy8gY29tbWFuZC1saW5lIHRvb2wuIFRoaXMgaW5jbHVkZXMgc291cmNlIHNuaXBwZXRzIGFuZCBkaWZmZXJlbnQgY29sb3JzIGJhc2VkCi8vLyBvbiBbc2V2ZXJpdHldLgpTdHJpbmcgZm9ybWF0KExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UsIFNldmVyaXR5IHNldmVyaXR5LCB7TG9jYXRpb24gbG9jYXRpb259KSB7CiAgdHJ5IHsKICAgIGludCBsZW5ndGggPSBtZXNzYWdlLmxlbmd0aDsKICAgIGlmIChsZW5ndGggPCAxKSB7CiAgICAgIC8vIFRPRE8oYWhlKTogVGhyb3cgaW4gdGhpcyBzaXR1YXRpb24uIEl0IGlzIG5vcm1hbGx5IGFuIGVycm9yIGNhdXNlZCBieQogICAgICAvLyBlbXB0eSBuYW1lcy4KICAgICAgbGVuZ3RoID0gMTsKICAgIH0KICAgIFN0cmluZyBwcmVmaXggPSBzZXZlcml0eVByZWZpeGVzW3NldmVyaXR5XTsKICAgIFN0cmluZyB0ZXh0ID0KICAgICAgICBwcmVmaXggPT0gbnVsbCA/IG1lc3NhZ2UubWVzc2FnZSA6ICIkcHJlZml4OiAke21lc3NhZ2UubWVzc2FnZX0iOwogICAgaWYgKG1lc3NhZ2UudGlwICE9IG51bGwpIHsKICAgICAgdGV4dCArPSAiXG4ke21lc3NhZ2UudGlwfSI7CiAgICB9CiAgICBpZiAoQ29tcGlsZXJDb250ZXh0LmVuYWJsZUNvbG9ycykgewogICAgICBzd2l0Y2ggKHNldmVyaXR5KSB7CiAgICAgICAgY2FzZSBTZXZlcml0eS5lcnJvcjoKICAgICAgICBjYXNlIFNldmVyaXR5LmludGVybmFsUHJvYmxlbToKICAgICAgICAgIHRleHQgPSByZWQodGV4dCk7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBTZXZlcml0eS53YXJuaW5nOgogICAgICAgICAgdGV4dCA9IG1hZ2VudGEodGV4dCk7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBTZXZlcml0eS5jb250ZXh0OgogICAgICAgICAgdGV4dCA9IGdyZWVuKHRleHQpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gdW5oYW5kbGVkKCIkc2V2ZXJpdHkiLCAiZm9ybWF0IiwgLTEsIG51bGwpOwogICAgICB9CiAgICB9CgogICAgaWYgKG1lc3NhZ2UudXJpICE9IG51bGwpIHsKICAgICAgU3RyaW5nIHBhdGggPQogICAgICAgICAgcmVsYXRpdml6ZVVyaShVcmkuYmFzZSwgdHJhbnNsYXRlU2RrKG1lc3NhZ2UudXJpKSwgaXNXaW5kb3dzKTsKICAgICAgaW50IG9mZnNldCA9IG1lc3NhZ2UuY2hhck9mZnNldDsKICAgICAgbG9jYXRpb24gPz89IChvZmZzZXQgPT0gLTEgPyBudWxsIDogZ2V0TG9jYXRpb24obWVzc2FnZS51cmksIG9mZnNldCkpOwogICAgICBpZiAobG9jYXRpb24/LmxpbmUgPT0gVHJlZU5vZGUubm9PZmZzZXQpIHsKICAgICAgICBsb2NhdGlvbiA9IG51bGw7CiAgICAgIH0KICAgICAgU3RyaW5nIHNvdXJjZUxpbmUgPSBnZXRTb3VyY2VMaW5lKGxvY2F0aW9uKTsKICAgICAgaWYgKHNvdXJjZUxpbmUgPT0gbnVsbCkgewogICAgICAgIHNvdXJjZUxpbmUgPSAiIjsKICAgICAgfSBlbHNlIGlmIChzb3VyY2VMaW5lLmlzTm90RW1wdHkpIHsKICAgICAgICAvLyBUT0RPKGFza2VzYyk6IE11Y2ggbW9yZSBjb3VsZCBiZSBkb25lIHRvIGluZGVudCBwcm9wZXJseSBpbiB0aGUKICAgICAgICAvLyBwcmVzZW5jZSBvZiBhbGwgc29ydHMgb2YgdW5pY29kZSB3ZWlyZG5lc3MuCiAgICAgICAgLy8gVGhpcyBoYW5kbGluZyBjb3ZlcnMgdGhlIGNvbW1vbiBjYXNlIG9mIHNpbmdsZS13aWR0aCBjaGFyYWN0ZXJzCiAgICAgICAgLy8gaW5kZW50ZWQgd2l0aCBzcGFjZXMgYW5kL29yIHRhYnMsIHVzaW5nIG5vIHN1cnJvZ2F0ZXMuCiAgICAgICAgaW50IGluZGVudExlbmd0aCA9IGxvY2F0aW9uLmNvbHVtbiAtIDE7CiAgICAgICAgVWludDhMaXN0IGluZGVudGF0aW9uID0gbmV3IFVpbnQ4TGlzdChpbmRlbnRMZW5ndGggKyBsZW5ndGgpCiAgICAgICAgICAuLmZpbGxSYW5nZSgwLCBpbmRlbnRMZW5ndGgsICRTUEFDRSkKICAgICAgICAgIC4uZmlsbFJhbmdlKGluZGVudExlbmd0aCwgaW5kZW50TGVuZ3RoICsgbGVuZ3RoLCAkQ0FSRVQpOwogICAgICAgIGludCBsZW5ndGhJblNvdXJjZUxpbmUgPSBtaW4oaW5kZW50YXRpb24ubGVuZ3RoLCBzb3VyY2VMaW5lLmxlbmd0aCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGhJblNvdXJjZUxpbmU7IGkrKykgewogICAgICAgICAgaWYgKHNvdXJjZUxpbmUuY29kZVVuaXRBdChpKSA9PSAkVEFCKSB7CiAgICAgICAgICAgIGluZGVudGF0aW9uW2ldID0gJFRBQjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgU3RyaW5nIHBvaW50ZXIgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoaW5kZW50YXRpb24pOwogICAgICAgIGlmIChwb2ludGVyLmxlbmd0aCA+IHNvdXJjZUxpbmUubGVuZ3RoKSB7CiAgICAgICAgICAvLyBUcnVuY2F0ZSB0aGUgY2FyZXRzIHRvIGhhbmRsZSBtZXNzYWdlcyB0aGF0IHNwYW4gbXVsdGlwbGUgbGluZXMuCiAgICAgICAgICBpbnQgcG9pbnRlckxlbmd0aCA9IHNvdXJjZUxpbmUubGVuZ3RoOwogICAgICAgICAgLy8gQWRkIG9uZSB0byBjb3ZlciB0aGUgY2FzZSBvZiBhIHBhcnNlciBlcnJvciBwb2ludGluZyB0byBFT0Ygd2hlbgogICAgICAgICAgLy8gdGhlIGxhc3QgbGluZSBkb2Vzbid0IGVuZCB3aXRoIGEgbmV3bGluZS4gRm9yIG1lc3NhZ2VzIHNwYW5uaW5nCiAgICAgICAgICAvLyBtdWx0aXBsZSBsaW5lcywgdGhpcyBhbHNvIHByb3ZpZGVzIGEgbWlub3IgdmlzdWFsIGNsdWUgdGhhdCBjYW4gYmUKICAgICAgICAgIC8vIHVzZWZ1bCBmb3IgZGVidWdnaW5nIEZhc3RhLgogICAgICAgICAgcG9pbnRlckxlbmd0aCArPSAxOwogICAgICAgICAgcG9pbnRlciA9IHBvaW50ZXIuc3Vic3RyaW5nKDAsIHBvaW50ZXJMZW5ndGgpOwogICAgICAgICAgcG9pbnRlciArPSAiLi4uIjsKICAgICAgICB9CiAgICAgICAgc291cmNlTGluZSA9ICJcbiRzb3VyY2VMaW5lXG4kcG9pbnRlciI7CiAgICAgIH0KICAgICAgU3RyaW5nIHBvc2l0aW9uID0KICAgICAgICAgIGxvY2F0aW9uID09IG51bGwgPyAiIiA6ICI6JHtsb2NhdGlvbi5saW5lfToke2xvY2F0aW9uLmNvbHVtbn0iOwogICAgICByZXR1cm4gIiRwYXRoJHBvc2l0aW9uOiAkdGV4dCRzb3VyY2VMaW5lIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0ZXh0OwogICAgfQogIH0gY2F0Y2ggKGVycm9yLCB0cmFjZSkgewogICAgcHJpbnQoIkNyYXNoIHdoZW4gZm9ybWF0dGluZzogIgogICAgICAgICJbJHttZXNzYWdlLmNvZGUubmFtZX1dICR7c2FmZVRvU3RyaW5nKG1lc3NhZ2UubWVzc2FnZSl9XG4iCiAgICAgICAgIiR7c2FmZVRvU3RyaW5nKGVycm9yKX1cbiIKICAgICAgICAiJHRyYWNlIik7CiAgICB0aHJvdyBuZXcgQ3Jhc2gobWVzc2FnZS51cmksIG1lc3NhZ2UuY2hhck9mZnNldCwgZXJyb3IsIHRyYWNlKTsKICB9Cn0KCi8vLyBBcmUgcHJvYmxlbXMgb2YgW3NldmVyaXR5XSBzdXBwcmVzc2VkPwpib29sIGlzSGlkZGVuKFNldmVyaXR5IHNldmVyaXR5KSB7CiAgc3dpdGNoIChzZXZlcml0eSkgewogICAgY2FzZSBTZXZlcml0eS5lcnJvcjoKICAgIGNhc2UgU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtOgogICAgY2FzZSBTZXZlcml0eS5jb250ZXh0OgogICAgICByZXR1cm4gZmFsc2U7CgogICAgY2FzZSBTZXZlcml0eS53YXJuaW5nOgogICAgICByZXR1cm4gaGlkZVdhcm5pbmdzOwoKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiB1bmhhbmRsZWQoIiRzZXZlcml0eSIsICJpc0hpZGRlbiIsIC0xLCBudWxsKTsKICB9Cn0KCi8vLyBBcmUgcHJvYmxlbXMgb2YgW3NldmVyaXR5XSBmYXRhbD8gVGhhdCBpcywgc2hvdWxkIHRoZSBjb21waWxlciB0ZXJtaW5hdGUKLy8vIGltbWVkaWF0ZWx5Pwpib29sIHNob3VsZFRocm93T24oU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKICBzd2l0Y2ggKHNldmVyaXR5KSB7CiAgICBjYXNlIFNldmVyaXR5LmVycm9yOgogICAgICByZXR1cm4gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQub3B0aW9ucy50aHJvd09uRXJyb3JzRm9yRGVidWdnaW5nOwoKICAgIGNhc2UgU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtOgogICAgICByZXR1cm4gdHJ1ZTsKCiAgICBjYXNlIFNldmVyaXR5Lndhcm5pbmc6CiAgICAgIHJldHVybiBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zLnRocm93T25XYXJuaW5nc0ZvckRlYnVnZ2luZzsKCiAgICBjYXNlIFNldmVyaXR5LmNvbnRleHQ6CiAgICAgIHJldHVybiBmYWxzZTsKCiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gdW5oYW5kbGVkKCIkc2V2ZXJpdHkiLCAic2hvdWxkVGhyb3dPbiIsIC0xLCBudWxsKTsKICB9Cn0KCmJvb2wgaXNDb21waWxlVGltZUVycm9yKFNldmVyaXR5IHNldmVyaXR5KSB7CiAgc3dpdGNoIChzZXZlcml0eSkgewogICAgY2FzZSBTZXZlcml0eS5lcnJvcjoKICAgIGNhc2UgU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtOgogICAgICByZXR1cm4gdHJ1ZTsKCiAgICBjYXNlIFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZzoKICAgICAgcmV0dXJuICFDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zLmxlZ2FjeU1vZGU7CgogICAgY2FzZSBTZXZlcml0eS53YXJuaW5nOgogICAgY2FzZSBTZXZlcml0eS5jb250ZXh0OgogICAgICByZXR1cm4gZmFsc2U7CgogICAgY2FzZSBTZXZlcml0eS5pZ25vcmVkOgogICAgICBicmVhazsgLy8gRmFsbC10aHJvdWdoIHRvIHVuaGFuZGxlZCBiZWxvdy4KICB9CiAgcmV0dXJuIHVuaGFuZGxlZCgiJHNldmVyaXR5IiwgImlzQ29tcGlsZVRpbWVFcnJvciIsIC0xLCBudWxsKTsKfQqAvQBOTjwBSk9QFyYBHQEpAToBRwEvATUBLgEvATgBJwEwATgBPAEyASEBRVATUAghFk8WEgYwEkofIgYoGh0nHBEBHyARAR8eEQERPQgGAR8USSdNMRkIMyAZKks3S0IwRS9ETTcyIwwKQDJOMU5NUCkeORwKMAgYSjENEwYbJEQjE0QEAgErIxYZIxsUARsbAQ07BAIBTREoFhlIASMTARtKARsUAQ1ABAIBLRYZIxMBJjoBGxsUARsxBEECATdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvY29tbWFuZF9saW5lX3JlcG9ydGluZy5kYXJ0MnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9tZXNzYWdlcy5kYXJ0hjwvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5tZXNzYWdlczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgTGlicmFyeSwgTG9jYXRpb24sIENvbXBvbmVudCwgVHJlZU5vZGU7CgppbXBvcnQgJ2NvbXBpbGVyX2NvbnRleHQuZGFydCcgc2hvdyBDb21waWxlckNvbnRleHQ7CgpleHBvcnQgJ2Zhc3RhX2NvZGVzLmRhcnQnOwoKYm9vbCBnZXQgaXNWZXJib3NlID0+IENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMudmVyYm9zZTsKCkxvY2F0aW9uIGdldExvY2F0aW9uKFVyaSB1cmksIGludCBjaGFyT2Zmc2V0KSB7CiAgcmV0dXJuIENvbXBpbGVyQ29udGV4dC5jdXJyZW50LnVyaVRvU291cmNlW3VyaV0/LmdldExvY2F0aW9uKHVyaSwgY2hhck9mZnNldCk7Cn0KCkxvY2F0aW9uIGdldExvY2F0aW9uRnJvbVVyaShVcmkgdXJpLCBpbnQgY2hhck9mZnNldCkgewogIGlmIChjaGFyT2Zmc2V0ID09IC0xKSByZXR1cm4gbnVsbDsKICByZXR1cm4gZ2V0TG9jYXRpb24odXJpLCBjaGFyT2Zmc2V0KTsKfQoKU3RyaW5nIGdldFNvdXJjZUxpbmUoTG9jYXRpb24gbG9jYXRpb24pIHsKICBpZiAobG9jYXRpb24gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgcmV0dXJuIENvbXBpbGVyQ29udGV4dC5jdXJyZW50LnVyaVRvU291cmNlW2xvY2F0aW9uLmZpbGVdCiAgICAgID8uZ2V0VGV4dExpbmUobG9jYXRpb24ubGluZSk7Cn0KCkxvY2F0aW9uIGdldExvY2F0aW9uRnJvbU5vZGUoVHJlZU5vZGUgbm9kZSkgewogIGlmIChub2RlLmVuY2xvc2luZ0NvbXBvbmVudCA9PSBudWxsKSB7CiAgICBUcmVlTm9kZSBwYXJlbnQgPSBub2RlOwogICAgd2hpbGUgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCBpcyEgTGlicmFyeSkgewogICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50OwogICAgfQogICAgaWYgKHBhcmVudCBpcyBMaWJyYXJ5KSB7CiAgICAgIENvbXBvbmVudCBjb21wb25lbnQgPSBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zLnRhcmdldAogICAgICAgICAgLmNvbmZpZ3VyZUNvbXBvbmVudCgKICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50KHVyaVRvU291cmNlOiBDb21waWxlckNvbnRleHQuY3VycmVudC51cmlUb1NvdXJjZSkpOwogICAgICBjb21wb25lbnQubGlicmFyaWVzLmFkZChwYXJlbnQpOwogICAgICBwYXJlbnQucGFyZW50ID0gY29tcG9uZW50OwogICAgICBMb2NhdGlvbiByZXN1bHQgPSBub2RlLmxvY2F0aW9uOwogICAgICBjb21wb25lbnQubGlicmFyaWVzLmNsZWFyKCk7CiAgICAgIHBhcmVudC5wYXJlbnQgPSBudWxsOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJldHVybiBub2RlLmxvY2F0aW9uOwogIH0KfQo2AE5OPAEYAU4BNQEbAT8BMFECATclJwIBKiU8JAIBLikcMx4GHUMfUCchJyMcFQ0TBgsaBAIBKXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9tZXNzYWdlcy5kYXJ0MnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9wcm9ibGVtcy5kYXJ0iqIvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5wcm9ibGVtczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgRmlsZVVyaU5vZGUsIFRyZWVOb2RlOwoKaW1wb3J0ICdjb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKaW1wb3J0ICdtZXNzYWdlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1EZWJ1Z0Fib3J0LAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5leHBlY3RlZCwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuaGFuZGxlZCwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuaW1wbGVtZW50ZWQsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZDsKCmltcG9ydCAnc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eSwgc2V2ZXJpdHlUZXh0czsKCmNsYXNzIERlYnVnQWJvcnQgewogIGZpbmFsIExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2U7CgogIERlYnVnQWJvcnQoVXJpIHVyaSwgaW50IGNoYXJPZmZzZXQsIFNldmVyaXR5IHNldmVyaXR5LCBTdGFja1RyYWNlIHRyYWNlKQogICAgICA6IG1lc3NhZ2UgPSB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbURlYnVnQWJvcnQKICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoc2V2ZXJpdHlUZXh0c1tzZXZlcml0eV0sICIkdHJhY2UiKQogICAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgY2hhck9mZnNldCwgbm9MZW5ndGgpOwoKICB0b1N0cmluZygpID0+ICJEZWJ1Z0Fib3J0OiAke21lc3NhZ2UubWVzc2FnZX0iOwp9CgovLy8gVXNlZCB0byByZXBvcnQgYW4gaW50ZXJuYWwgZXJyb3IuCi8vLwovLy8gSW50ZXJuYWwgZXJyb3JzIHNob3VsZCBiZSBhdm9pZGVkIGFzIGJlc3QgYXMgcG9zc2libGUsIGJ1dCBhcmUgcHJlZmVycmVkCi8vLyBvdmVyIGFzc2VydGlvbiBmYWlsdXJlcy4gVGhlIG1lc3NhZ2Ugc2hvdWxkIHN0YXJ0IHdpdGggYW4gdXBwZXItY2FzZSBsZXR0ZXIKLy8vIGFuZCBjb250YWluIGEgc2hvcnQgZGVzY3JpcHRpb24gdGhhdCBtYXkgaGVscCBhIGRldmVsb3BlciBkZWJ1ZyB0aGUgaXNzdWUuCi8vLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGluc3RlYWQgb2YgdXNpbmcgYHRocm93YCwgYXMgdGhpcyBhbGxvd3MgdXMgdG8KLy8vIGVuc3VyZSB0aGF0IHRoZXJlIGFyZSBubyB0aHJvd3MgYW55d2hlcmUgZWxzZSBpbiB0aGUgY29kZWJhc2UuCi8vLwovLy8gQmVmb3JlIHByaW50aW5nIHRoZSBtZXNzYWdlLCB0aGUgc3RyaW5nIGAiSW50ZXJuYWwgZXJyb3I6ICJgIGlzIHByZXBlbmRlZC4KZHluYW1pYyBpbnRlcm5hbFByb2JsZW0oTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgVXJpIHVyaSkgewogIHRocm93IENvbXBpbGVyQ29udGV4dC5jdXJyZW50LmZvcm1hdCgKICAgICAgbWVzc2FnZS53aXRoTG9jYXRpb24odXJpLCBjaGFyT2Zmc2V0LCBub0xlbmd0aCksCiAgICAgIFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7Cn0KCmR5bmFtaWMgdW5pbXBsZW1lbnRlZChTdHJpbmcgd2hhdCwgaW50IGNoYXJPZmZzZXQsIFVyaSB1cmkpIHsKICByZXR1cm4gaW50ZXJuYWxQcm9ibGVtKAogICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuaW1wbGVtZW50ZWQud2l0aEFyZ3VtZW50cyh3aGF0KSwKICAgICAgY2hhck9mZnNldCwKICAgICAgdXJpKTsKfQoKZHluYW1pYyB1bmhhbmRsZWQoU3RyaW5nIHdoYXQsIFN0cmluZyB3aGVyZSwgaW50IGNoYXJPZmZzZXQsIFVyaSB1cmkpIHsKICByZXR1cm4gaW50ZXJuYWxQcm9ibGVtKAogICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuaGFuZGxlZC53aXRoQXJndW1lbnRzKHdoYXQsIHdoZXJlKSwKICAgICAgY2hhck9mZnNldCwKICAgICAgdXJpKTsKfQoKZHluYW1pYyB1bmV4cGVjdGVkKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIGFjdHVhbCwgaW50IGNoYXJPZmZzZXQsIFVyaSB1cmkpIHsKICByZXR1cm4gaW50ZXJuYWxQcm9ibGVtKAogICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWQud2l0aEFyZ3VtZW50cyhleHBlY3RlZCwgYWN0dWFsKSwKICAgICAgY2hhck9mZnNldCwKICAgICAgdXJpKTsKfQoKZHluYW1pYyB1bnN1cHBvcnRlZChTdHJpbmcgb3BlcmF0aW9uLCBpbnQgY2hhck9mZnNldCwgVXJpIHVyaSkgewogIHJldHVybiBpbnRlcm5hbFByb2JsZW0oCiAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWQud2l0aEFyZ3VtZW50cyhvcGVyYXRpb24pLAogICAgICBjaGFyT2Zmc2V0LAogICAgICB1cmkpOwp9CgpVcmkgZ2V0RmlsZVVyaShUcmVlTm9kZSBub2RlKSB7CiAgZG8gewogICAgaWYgKG5vZGUgaXMgRmlsZVVyaU5vZGUpIHJldHVybiBub2RlLmZpbGVVcmk7CiAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgfSB3aGlsZSAobm9kZSBpcyBUcmVlTm9kZSk7CiAgcmV0dXJuIG51bGw7Cn0KVgBOTjwBGAE9ATUBFwkYERIrKyouLAE1ARMgAUs0PjYBMgIBJgRNUE9QQwRPRCg3IQIBPhpAEgwCAUgaQxIMAgFOGkkSDAIBQRpDEgwCASAHMhgeDwIBKXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wcm9ibGVtcy5kYXJ0MHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90aWNrZXIuZGFydINtLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudGlja2VyOwoKY2xhc3MgVGlja2VyIHsKICBmaW5hbCBTdG9wd2F0Y2ggc3cgPSBuZXcgU3RvcHdhdGNoKCkuLnN0YXJ0KCk7CgogIGJvb2wgaXNWZXJib3NlOwoKICBEdXJhdGlvbiBwcmV2aW91c1RpY2s7CgogIFRpY2tlcih7dGhpcy5pc1ZlcmJvc2U6IHRydWV9KSB7CiAgICBwcmV2aW91c1RpY2sgPSBzdy5lbGFwc2VkOwogIH0KCiAgdm9pZCBsb2dNcyhPYmplY3QgbWVzc2FnZSkgewogICAgbG9nKChEdXJhdGlvbiBlbGFwc2VkLCBEdXJhdGlvbiBzaW5jZVN0YXJ0KSB7CiAgICAgIHByaW50KCIkc2luY2VTdGFydDogJG1lc3NhZ2UgaW4gJHtlbGFwc2VkLmluTWlsbGlzZWNvbmRzfW1zLiIpOwogICAgfSk7CiAgfQoKICB2b2lkIGxvZyh2b2lkIGYoRHVyYXRpb24gZWxhcHNlZCwgRHVyYXRpb24gc2luY2VTdGFydCkpIHsKICAgIER1cmF0aW9uIGVsYXBzZWQgPSBzdy5lbGFwc2VkOwogICAgdHJ5IHsKICAgICAgaWYgKGlzVmVyYm9zZSkgZihlbGFwc2VkIC0gcHJldmlvdXNUaWNrLCBlbGFwc2VkKTsKICAgIH0gZmluYWxseSB7CiAgICAgIHByZXZpb3VzVGljayA9IHN3LmVsYXBzZWQ7CiAgICB9CiAgfQoKICB2b2lkIHJlc2V0KCkgewogICAgc3cucmVzZXQoKTsKICAgIHByZXZpb3VzVGljayA9IHN3LmVsYXBzZWQ7CiAgfQp9CicATk48ARYBDzEBEgEZASMfBAEfMkYIBAE8Iwo5ECEGBAEREB8EAgEncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3RpY2tlci5kYXJ0OHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS91cmlfdHJhbnNsYXRvci5kYXJ0i7kvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS51cmlfdHJhbnNsYXRvcjsKCmltcG9ydCAncGFja2FnZTpwYWNrYWdlX2NvbmZpZy9wYWNrYWdlcy5kYXJ0JyBzaG93IFBhY2thZ2VzOwoKaW1wb3J0ICcuLi9iYXNlL2xpYnJhcmllc19zcGVjaWZpY2F0aW9uLmRhcnQnIHNob3cgVGFyZ2V0TGlicmFyaWVzU3BlY2lmaWNhdGlvbjsKaW1wb3J0ICdjb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwppbXBvcnQgJ2Zhc3RhX2NvZGVzLmRhcnQnOwppbXBvcnQgJ3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgpjbGFzcyBVcmlUcmFuc2xhdG9yIHsKICBmaW5hbCBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uIGRhcnRMaWJyYXJpZXM7CgogIGZpbmFsIFBhY2thZ2VzIHBhY2thZ2VzOwoKICBVcmlUcmFuc2xhdG9yKHRoaXMuZGFydExpYnJhcmllcywgdGhpcy5wYWNrYWdlcyk7CgogIExpc3Q8VXJpPiBnZXREYXJ0UGF0Y2hlcyhTdHJpbmcgbGlicmFyeU5hbWUpID0+CiAgICAgIGRhcnRMaWJyYXJpZXMubGlicmFyeUluZm9Gb3IobGlicmFyeU5hbWUpPy5wYXRjaGVzOwoKICBib29sIGlzUGxhdGZvcm1JbXBsZW1lbnRhdGlvbihVcmkgdXJpKSB7CiAgICBpZiAodXJpLnNjaGVtZSAhPSAiZGFydCIpIHJldHVybiBmYWxzZTsKICAgIFN0cmluZyBwYXRoID0gdXJpLnBhdGg7CiAgICByZXR1cm4gZGFydExpYnJhcmllcy5saWJyYXJ5SW5mb0ZvcihwYXRoKSA9PSBudWxsIHx8IHBhdGguc3RhcnRzV2l0aCgiXyIpOwogIH0KCiAgLy8gVE9ETyhzaWdtdW5kLCBhaGUpOiBjb25zaWRlciBleHBhbmRpbmcgdGhpcyBBUEkgdG8gaW5jbHVkZSBhbiBlcnJvcgogIC8vIGNhbGxiYWNrLCBzbyB3ZSBjYW4gcHJvdmlkZSBhbiBlcnJvciBsb2NhdGlvbiB3aGVuIG9uZSBpcyBhdmFpbGFibGUuIEZvcgogIC8vIGV4YW1wbGUsIGlmIHRoZSBlcnJvciBvY2N1cnMgaW4gYW4gYGltcG9ydGAuCiAgVXJpIHRyYW5zbGF0ZShVcmkgdXJpLCBbYm9vbCByZXBvcnRNZXNzYWdlID0gdHJ1ZV0pIHsKICAgIGlmICh1cmkuc2NoZW1lID09ICJkYXJ0IikgcmV0dXJuIF90cmFuc2xhdGVEYXJ0VXJpKHVyaSk7CiAgICBpZiAodXJpLnNjaGVtZSA9PSAicGFja2FnZSIpIHsKICAgICAgcmV0dXJuIF90cmFuc2xhdGVQYWNrYWdlVXJpKHVyaSwgcmVwb3J0TWVzc2FnZSk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGJvb2wgaXNMaWJyYXJ5U3VwcG9ydGVkKFN0cmluZyBsaWJyYXJ5TmFtZSkgewogICAgLy8gVE9ETyhzaWdtdW5kKTogY2hhbmdlIHRoaXMgdG8gYD8/IGZhbHNlYCB3aGVuIGFsbCBiYWNrZW5kcyBwcm92aWRlIHRoZQogICAgLy8gYGxpYnJhcmllcy5qc29uYCBmaWxlIGJ5IGRlZmF1bHQgKElzc3VlICMzMjY1NykuCiAgICByZXR1cm4gZGFydExpYnJhcmllcy5saWJyYXJ5SW5mb0ZvcihsaWJyYXJ5TmFtZSk/LmlzU3VwcG9ydGVkID8/IHRydWU7CiAgfQoKICBVcmkgX3RyYW5zbGF0ZURhcnRVcmkoVXJpIHVyaSkgewogICAgaWYgKCF1cmkuaXNTY2hlbWUoJ2RhcnQnKSkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gZGFydExpYnJhcmllcy5saWJyYXJ5SW5mb0Zvcih1cmkucGF0aCk/LnVyaTsKICB9CgogIFVyaSBfdHJhbnNsYXRlUGFja2FnZVVyaShVcmkgdXJpLCBib29sIHJlcG9ydE1lc3NhZ2UpIHsKICAgIHRyeSB7CiAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IG9uY2Ugd2UgcmVtb3ZlIHRoZSBgcGFyc2VgIEFQSSwgd2UgY2FuIGVuc3VyZSB0aGF0CiAgICAgIC8vIHBhY2thZ2VzIHdpbGwgbmV2ZXIgYmUgbnVsbCBhbmQgZ2V0IHJpZCBvZiBgP2AgYmVsb3cuCiAgICAgIHJldHVybiBwYWNrYWdlcz8ucmVzb2x2ZSh1cmksCiAgICAgICAgICBub3RGb3VuZDogcmVwb3J0TWVzc2FnZQogICAgICAgICAgICAgID8gX3BhY2thZ2VVcmlOb3RGb3VuZAogICAgICAgICAgICAgIDogX3BhY2thZ2VVcmlOb3RGb3VuZE5vUmVwb3J0KTsKICAgIH0gb24gQXJndW1lbnRFcnJvciBjYXRjaCAoZSkgewogICAgICAvLyBUT0RPKHNpZ211bmQpOiBjYXRjaCBhIG1vcmUgcHJlY2lzZSBlcnJvciB3aGVuCiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvcGFja2FnZV9jb25maWcvaXNzdWVzLzQwIGlzIGZpeGVkLgogICAgICBpZiAocmVwb3J0TWVzc2FnZSkgewogICAgICAgIENvbXBpbGVyQ29udGV4dC5jdXJyZW50LnJlcG9ydFdpdGhvdXRMb2NhdGlvbigKICAgICAgICAgICAgdGVtcGxhdGVJbnZhbGlkUGFja2FnZVVyaS53aXRoQXJndW1lbnRzKHVyaSwgJyRlJyksIFNldmVyaXR5LmVycm9yKTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIHN0YXRpYyBVcmkgX3BhY2thZ2VVcmlOb3RGb3VuZChVcmkgdXJpKSB7CiAgICBTdHJpbmcgbmFtZSA9IHVyaS5wYXRoU2VnbWVudHMuZmlyc3Q7CiAgICBDb21waWxlckNvbnRleHQuY3VycmVudC5yZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgdGVtcGxhdGVQYWNrYWdlTm90Rm91bmQud2l0aEFyZ3VtZW50cyhuYW1lLCB1cmkpLCBTZXZlcml0eS5lcnJvcik7CiAgICAvLyBUT0RPKHNpZ211bmQsIGFoZSk6IGVuc3VyZSB3ZSBvbmx5IHJlcG9ydCBhbiBlcnJvciBvbmNlLAogICAgLy8gdGhpcyBudWxsIHJlc3VsdCB3aWxsIGxpa2VseSBjYXVzZSBhbm90aGVyIGVycm9yIGZ1cnRoZXIgZG93biBpbiB0aGUKICAgIC8vIGNvbXBpbGVyLgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBzdGF0aWMgVXJpIF9wYWNrYWdlVXJpTm90Rm91bmROb1JlcG9ydChVcmkgdXJpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KVgBOTjwBHgE9AVE1GyYBFjQBGwE0ATI6ASssHE8EAUlOMjg9IzcGEQQBME44SwQBIyw4BAE6Cks/JCIkLiM4SRs3UQgTBgQBLCozS0BMEREEATQRBAIBL3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS91cmlfdHJhbnNsYXRvci5kYXJ0O3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9yZXNvbHZlX2lucHV0X3VyaS5kYXJ0hHUvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIERldGVjdCBpZiB3ZSdyZSBvbiBXaW5kb3dzIHdpdGhvdXQgaW1wb3J0aW5nIGBkYXJ0OmlvYC4KYm9vbCBpc1dpbmRvd3MgPSBuZXcgVXJpLmRpcmVjdG9yeSgiQzpcXCIpLnBhdGggPT0KICAgIG5ldyBVcmkuZGlyZWN0b3J5KCJDOlxcIiwgd2luZG93czogdHJ1ZSkucGF0aDsKClVyaSByZXNvbHZlSW5wdXRVcmkoU3RyaW5nIHBhdGgpIHsKICBVcmkgdXJpOwogIGlmIChwYXRoLmluZGV4T2YoIjoiKSA9PSAtMSkgewogICAgdXJpID0gbmV3IFVyaS5maWxlKHBhdGgsIHdpbmRvd3M6IGlzV2luZG93cyk7CiAgfSBlbHNlIGlmICghaXNXaW5kb3dzKSB7CiAgICB1cmkgPSBwYXJzZVVyaShwYXRoKTsKICB9IGVsc2UgewogICAgdXJpID0gcmVzb2x2ZUFtYmlndW91c1dpbmRvd3NQYXRoKHBhdGgpOwogIH0KICByZXR1cm4gVXJpLmJhc2UucmVzb2x2ZVVyaSh1cmkpOwp9CgpVcmkgcGFyc2VVcmkoU3RyaW5nIHBhdGgpIHsKICBpZiAocGF0aC5zdGFydHNXaXRoKCJmaWxlOiIpKSB7CiAgICBpZiAoVXJpLmJhc2Uuc2NoZW1lID09ICJmaWxlIikgewogICAgICAvLyBUaGUgVXJpIGNsYXNzIGRvZXNuJ3QgaGFuZGxlIHJlbGF0aXZlIGZpbGUgVVJJcyBjb3JyZWN0bHksIHRoZQogICAgICAvLyBmb2xsb3dpbmcgd29ya3MgYXJvdW5kIHRoYXQgaXNzdWUuCiAgICAgIHJldHVybiBuZXcgVXJpKHBhdGg6IFVyaS5wYXJzZSgieC0kcGF0aCIpLnBhdGgpOwogICAgfQogIH0KICByZXR1cm4gVXJpLnBhcnNlKHBhdGgpOwp9CgpVcmkgcmVzb2x2ZUFtYmlndW91c1dpbmRvd3NQYXRoKFN0cmluZyBwYXRoKSB7CiAgdHJ5IHsKICAgIHJldHVybiBuZXcgVXJpLmZpbGUocGF0aCwgd2luZG93czogaXNXaW5kb3dzKTsKICB9IG9uIEFyZ3VtZW50RXJyb3IgY2F0Y2ggKF8pIHsKICAgIHJldHVybiBwYXJzZVVyaShwYXRoKTsKICB9Cn0KKABOTjwBPDMzASMLITIbGgstBCMCARwiJUgsNwYEGgIBLwgzIRsEAgEycGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3Jlc29sdmVfaW5wdXRfdXJpLmRhcnQ3c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NjYW5uZXIvdG9rZW4uZGFydKwaLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuc2Nhbm5lci50b2tlbjsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBhcyBhbmFseXplcjsKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW4sIFRva2VuVHlwZTsKCmltcG9ydCAndG9rZW5fY29uc3RhbnRzLmRhcnQnIHNob3cgSURFTlRJRklFUl9UT0tFTjsKCmltcG9ydCAnc3RyaW5nX2Nhbm9uaWNhbGl6ZXIuZGFydCc7CgovKioKICogQSBTdHJpbmctdmFsdWVkIHRva2VuLiBSZXByZXNlbnRzIGlkZW50aWZpZXJzLCBzdHJpbmcgbGl0ZXJhbHMsCiAqIG51bWJlciBsaXRlcmFscywgY29tbWVudHMsIGFuZCBlcnJvciB0b2tlbnMsIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nCiAqIHByZWNlZGVuY2UgaW5mby4KICovCmNsYXNzIFN0cmluZ1Rva2VuIGV4dGVuZHMgYW5hbHl6ZXIuU2ltcGxlVG9rZW4gaW1wbGVtZW50cyBhbmFseXplci5TdHJpbmdUb2tlbiB7CiAgLyoqCiAgICogVGhlIGxlbmd0aCB0aHJlc2hvbGQgYWJvdmUgd2hpY2ggc3Vic3RyaW5nIHRva2VucyBhcmUgY29tcHV0ZWQgbGF6aWx5LgogICAqCiAgICogRm9yIHN0cmluZyB0b2tlbnMgdGhhdCBhcmUgc3Vic3RyaW5ncyBvZiB0aGUgcHJvZ3JhbSBzb3VyY2UsIHRoZSBhY3R1YWwKICAgKiBzdWJzdHJpbmcgZXh0cmFjdGlvbiBpcyBwZXJmb3JtZWQgbGF6aWx5LiBUaGlzIGlzIGJlbmVmaWNpYWwgYmVjYXVzZQogICAqIG5vdCBhbGwgc2Nhbm5lZCBjb2RlIGFyZSBhY3R1YWxseSB1c2VkLiBGb3IgdW51c2VkIHBhcnRzLCB0aGUgc3Vic3RyaW5ncwogICAqIGFyZSBuZXZlciBjb21wdXRlZCBhbmQgYWxsb2NhdGVkLgogICAqLwogIHN0YXRpYyBjb25zdCBpbnQgTEFaWV9USFJFU0hPTEQgPSA0OwoKICB2YXIgLyogU3RyaW5nIHwgTGF6eVN1YnRyaW5nICovIHZhbHVlT3JMYXp5U3Vic3RyaW5nOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbm9uLWxhenkgc3RyaW5nIHRva2VuLiBJZiBbY2Fub25pY2FsaXplXSBpcyB0cnVlLCB0aGUgc3RyaW5nCiAgICogaXMgY2Fub25pY2FsaXplZCBiZWZvcmUgdGhlIHRva2VuIGlzIGNyZWF0ZWQuCiAgICovCiAgU3RyaW5nVG9rZW4uZnJvbVN0cmluZyhUb2tlblR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBpbnQgY2hhck9mZnNldCwKICAgICAge2Jvb2wgY2Fub25pY2FsaXplOiBmYWxzZSwgYW5hbHl6ZXIuQ29tbWVudFRva2VuIHByZWNlZGluZ0NvbW1lbnRzfSkKICAgICAgOiB2YWx1ZU9yTGF6eVN1YnN0cmluZyA9CiAgICAgICAgICAgIGNhbm9uaWNhbGl6ZWRTdHJpbmcodmFsdWUsIDAsIHZhbHVlLmxlbmd0aCwgY2Fub25pY2FsaXplKSwKICAgICAgICBzdXBlcih0eXBlLCBjaGFyT2Zmc2V0LCBwcmVjZWRpbmdDb21tZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBsYXp5IHN0cmluZyB0b2tlbi4gSWYgW2Nhbm9uaWNhbGl6ZV0gaXMgdHJ1ZSwgdGhlIHN0cmluZwogICAqIGlzIGNhbm9uaWNhbGl6ZWQgYmVmb3JlIHRoZSB0b2tlbiBpcyBjcmVhdGVkLgogICAqLwogIFN0cmluZ1Rva2VuLmZyb21TdWJzdHJpbmcoCiAgICAgIFRva2VuVHlwZSB0eXBlLCBTdHJpbmcgZGF0YSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY2hhck9mZnNldCwKICAgICAge2Jvb2wgY2Fub25pY2FsaXplOiBmYWxzZSwgYW5hbHl6ZXIuQ29tbWVudFRva2VuIHByZWNlZGluZ0NvbW1lbnRzfSkKICAgICAgOiBzdXBlcih0eXBlLCBjaGFyT2Zmc2V0LCBwcmVjZWRpbmdDb21tZW50cykgewogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGxlbmd0aCA8PSBMQVpZX1RIUkVTSE9MRCkgewogICAgICB2YWx1ZU9yTGF6eVN1YnN0cmluZyA9CiAgICAgICAgICBjYW5vbmljYWxpemVkU3RyaW5nKGRhdGEsIHN0YXJ0LCBlbmQsIGNhbm9uaWNhbGl6ZSk7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZU9yTGF6eVN1YnN0cmluZyA9CiAgICAgICAgICBuZXcgX0xhenlTdWJzdHJpbmcoZGF0YSwgc3RhcnQsIGxlbmd0aCwgY2Fub25pY2FsaXplKTsKICAgIH0KICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBsYXp5IHN0cmluZyB0b2tlbi4gSWYgW2FzY2lpT25seV0gaXMgZmFsc2UsIHRoZSBieXRlIGFycmF5CiAgICogaXMgcGFzc2VkIHRocm91Z2ggYSBVVEYtOCBkZWNvZGVyLgogICAqLwogIFN0cmluZ1Rva2VuLmZyb21VdGY4Qnl0ZXMoVG9rZW5UeXBlIHR5cGUsIExpc3Q8aW50PiBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgIGJvb2wgYXNjaWlPbmx5LCBpbnQgY2hhck9mZnNldCwKICAgICAge2FuYWx5emVyLkNvbW1lbnRUb2tlbiBwcmVjZWRpbmdDb21tZW50c30pCiAgICAgIDogc3VwZXIodHlwZSwgY2hhck9mZnNldCwgcHJlY2VkaW5nQ29tbWVudHMpIHsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGlmIChsZW5ndGggPD0gTEFaWV9USFJFU0hPTEQpIHsKICAgICAgdmFsdWVPckxhenlTdWJzdHJpbmcgPSBkZWNvZGVVdGY4KGRhdGEsIHN0YXJ0LCBlbmQsIGFzY2lpT25seSk7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZU9yTGF6eVN1YnN0cmluZyA9IG5ldyBfTGF6eVN1YnN0cmluZyhkYXRhLCBzdGFydCwgbGVuZ3RoLCBhc2NpaU9ubHkpOwogICAgfQogIH0KCiAgU3RyaW5nVG9rZW4uXyhUb2tlblR5cGUgdHlwZSwgdGhpcy52YWx1ZU9yTGF6eVN1YnN0cmluZywgaW50IGNoYXJPZmZzZXQsCiAgICAgIFthbmFseXplci5Db21tZW50VG9rZW4gcHJlY2VkaW5nQ29tbWVudHNdKQogICAgICA6IHN1cGVyKHR5cGUsIGNoYXJPZmZzZXQsIHByZWNlZGluZ0NvbW1lbnRzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBsZXhlbWUgewogICAgaWYgKHZhbHVlT3JMYXp5U3Vic3RyaW5nIGlzIFN0cmluZykgewogICAgICByZXR1cm4gdmFsdWVPckxhenlTdWJzdHJpbmc7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQodmFsdWVPckxhenlTdWJzdHJpbmcgaXMgX0xhenlTdWJzdHJpbmcpOwogICAgICB2YXIgZGF0YSA9IHZhbHVlT3JMYXp5U3Vic3RyaW5nLmRhdGE7CiAgICAgIGludCBzdGFydCA9IHZhbHVlT3JMYXp5U3Vic3RyaW5nLnN0YXJ0OwogICAgICBpbnQgZW5kID0gc3RhcnQgKyB2YWx1ZU9yTGF6eVN1YnN0cmluZy5sZW5ndGg7CiAgICAgIGlmIChkYXRhIGlzIFN0cmluZykgewogICAgICAgIHZhbHVlT3JMYXp5U3Vic3RyaW5nID0gY2Fub25pY2FsaXplZFN0cmluZygKICAgICAgICAgICAgZGF0YSwgc3RhcnQsIGVuZCwgdmFsdWVPckxhenlTdWJzdHJpbmcuYm9vbFZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZU9yTGF6eVN1YnN0cmluZyA9CiAgICAgICAgICAgIGRlY29kZVV0ZjgoZGF0YSwgc3RhcnQsIGVuZCwgdmFsdWVPckxhenlTdWJzdHJpbmcuYm9vbFZhbHVlKTsKICAgICAgfQogICAgICByZXR1cm4gdmFsdWVPckxhenlTdWJzdHJpbmc7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0lkZW50aWZpZXIgPT4gaWRlbnRpY2FsKGtpbmQsIElERU5USUZJRVJfVE9LRU4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBsZXhlbWU7CgogIHN0YXRpYyBmaW5hbCBTdHJpbmdDYW5vbmljYWxpemVyIGNhbm9uaWNhbGl6ZXIgPSBuZXcgU3RyaW5nQ2Fub25pY2FsaXplcigpOwoKICBzdGF0aWMgU3RyaW5nIGNhbm9uaWNhbGl6ZWRTdHJpbmcoCiAgICAgIFN0cmluZyBzLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgY2Fub25pY2FsaXplKSB7CiAgICBpZiAoIWNhbm9uaWNhbGl6ZSkgcmV0dXJuIHM7CiAgICByZXR1cm4gY2Fub25pY2FsaXplci5jYW5vbmljYWxpemUocywgc3RhcnQsIGVuZCwgZmFsc2UpOwogIH0KCiAgc3RhdGljIFN0cmluZyBkZWNvZGVVdGY4KExpc3Q8aW50PiBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgYXNjaWlPbmx5KSB7CiAgICByZXR1cm4gY2Fub25pY2FsaXplci5jYW5vbmljYWxpemUoZGF0YSwgc3RhcnQsIGVuZCwgYXNjaWlPbmx5KTsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIGNvcHkoKSA9PiBuZXcgU3RyaW5nVG9rZW4uXygKICAgICAgdHlwZSwgdmFsdWVPckxhenlTdWJzdHJpbmcsIGNoYXJPZmZzZXQsIGNvcHlDb21tZW50cyhwcmVjZWRpbmdDb21tZW50cykpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmFsdWUoKSA9PiBsZXhlbWU7Cn0KCi8qKgogKiBBIFN0cmluZy12YWx1ZWQgdG9rZW4gdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgb3JpZ2luYWwgc291cmNlLgogKi8KY2xhc3MgU3ludGhldGljU3RyaW5nVG9rZW4gZXh0ZW5kcyBTdHJpbmdUb2tlbgogICAgaW1wbGVtZW50cyBhbmFseXplci5TeW50aGV0aWNTdHJpbmdUb2tlbiB7CiAgU3ludGhldGljU3RyaW5nVG9rZW4oVG9rZW5UeXBlIHR5cGUsIFN0cmluZyB2YWx1ZSwgaW50IG9mZnNldCwKICAgICAgW2FuYWx5emVyLkNvbW1lbnRUb2tlbiBwcmVjZWRpbmdDb21tZW50c10pCiAgICAgIDogc3VwZXIuXyh0eXBlLCB2YWx1ZSwgb2Zmc2V0LCBwcmVjZWRpbmdDb21tZW50cyk7CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoID0+IDA7CgogIEBvdmVycmlkZQogIFRva2VuIGNvcHkoKSA9PiBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4oCiAgICAgIHR5cGUsIHZhbHVlT3JMYXp5U3Vic3RyaW5nLCBvZmZzZXQsIGNvcHlDb21tZW50cyhwcmVjZWRpbmdDb21tZW50cykpOwp9CgpjbGFzcyBDb21tZW50VG9rZW4gZXh0ZW5kcyBTdHJpbmdUb2tlbiBpbXBsZW1lbnRzIGFuYWx5emVyLkNvbW1lbnRUb2tlbiB7CiAgQG92ZXJyaWRlCiAgYW5hbHl6ZXIuU2ltcGxlVG9rZW4gcGFyZW50OwoKICAvKioKICAgKiBDcmVhdGVzIGEgbGF6eSBjb21tZW50IHRva2VuLiBJZiBbY2Fub25pY2FsaXplXSBpcyB0cnVlLCB0aGUgc3RyaW5nCiAgICogaXMgY2Fub25pY2FsaXplZCBiZWZvcmUgdGhlIHRva2VuIGlzIGNyZWF0ZWQuCiAgICovCiAgQ29tbWVudFRva2VuLmZyb21TdWJzdHJpbmcoCiAgICAgIFRva2VuVHlwZSB0eXBlLCBTdHJpbmcgZGF0YSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY2hhck9mZnNldCwKICAgICAge2Jvb2wgY2Fub25pY2FsaXplOiBmYWxzZX0pCiAgICAgIDogc3VwZXIuZnJvbVN1YnN0cmluZyh0eXBlLCBkYXRhLCBzdGFydCwgZW5kLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICBjYW5vbmljYWxpemU6IGNhbm9uaWNhbGl6ZSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBub24tbGF6eSBjb21tZW50IHRva2VuLgogICAqLwogIENvbW1lbnRUb2tlbi5mcm9tU3RyaW5nKFRva2VuVHlwZSB0eXBlLCBTdHJpbmcgbGV4ZW1lLCBpbnQgY2hhck9mZnNldCkKICAgICAgOiBzdXBlci5mcm9tU3RyaW5nKHR5cGUsIGxleGVtZSwgY2hhck9mZnNldCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBsYXp5IHN0cmluZyB0b2tlbi4gSWYgW2FzY2lpT25seV0gaXMgZmFsc2UsIHRoZSBieXRlIGFycmF5CiAgICogaXMgcGFzc2VkIHRocm91Z2ggYSBVVEYtOCBkZWNvZGVyLgogICAqLwogIENvbW1lbnRUb2tlbi5mcm9tVXRmOEJ5dGVzKFRva2VuVHlwZSB0eXBlLCBMaXN0PGludD4gZGF0YSwgaW50IHN0YXJ0LCBpbnQgZW5kLAogICAgICBib29sIGFzY2lpT25seSwgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc3VwZXIuZnJvbVV0ZjhCeXRlcyh0eXBlLCBkYXRhLCBzdGFydCwgZW5kLCBhc2NpaU9ubHksIGNoYXJPZmZzZXQpOwoKICBDb21tZW50VG9rZW4uXyhUb2tlblR5cGUgdHlwZSwgdmFsdWVPckxhenlTdWJzdHJpbmcsIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyLl8odHlwZSwgdmFsdWVPckxhenlTdWJzdHJpbmcsIGNoYXJPZmZzZXQpOwoKICBAb3ZlcnJpZGUKICBDb21tZW50VG9rZW4gY29weSgpID0+CiAgICAgIG5ldyBDb21tZW50VG9rZW4uXyh0eXBlLCB2YWx1ZU9yTGF6eVN1YnN0cmluZywgY2hhck9mZnNldCk7CgogIEBvdmVycmlkZQogIHZvaWQgcmVtb3ZlKCkgewogICAgaWYgKHByZXZpb3VzICE9IG51bGwpIHsKICAgICAgcHJldmlvdXMuc2V0TmV4dFdpdGhvdXRTZXR0aW5nUHJldmlvdXMobmV4dCk7CiAgICAgIG5leHQ/LnByZXZpb3VzID0gcHJldmlvdXM7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQocGFyZW50LnByZWNlZGluZ0NvbW1lbnRzID09IHRoaXMpOwogICAgICBwYXJlbnQucHJlY2VkaW5nQ29tbWVudHMgPSBuZXh0IGFzIENvbW1lbnRUb2tlbjsKICAgIH0KICB9Cn0KCi8qKgogKiBBIHNwZWNpYWxpemVkIGNvbW1lbnQgdG9rZW4gcmVwcmVzZW50aW5nIGEgbGFuZ3VhZ2UgdmVyc2lvbgogKiAoZS5nLiAnLy8gQGRhcnQgPSAyLjEnKS4KICovCmNsYXNzIExhbmd1YWdlVmVyc2lvblRva2VuIGV4dGVuZHMgQ29tbWVudFRva2VuIHsKICAvKioKICAgKiBUaGUgbWFqb3IgbGFuZ3VhZ2UgdmVyc2lvbi4KICAgKi8KICBpbnQgbWFqb3I7CgogIC8qKgogICAqIFRoZSBtaW5vciBsYW5ndWFnZSB2ZXJzaW9uLgogICAqLwogIGludCBtaW5vcjsKCiAgTGFuZ3VhZ2VWZXJzaW9uVG9rZW4uZnJvbShTdHJpbmcgdGV4dCwgaW50IG9mZnNldCwgdGhpcy5tYWpvciwgdGhpcy5taW5vcikKICAgICAgOiBzdXBlci5mcm9tU3RyaW5nKFRva2VuVHlwZS5TSU5HTEVfTElORV9DT01NRU5ULCB0ZXh0LCBvZmZzZXQpOwoKICBMYW5ndWFnZVZlcnNpb25Ub2tlbi5mcm9tU3Vic3RyaW5nKAogICAgICBTdHJpbmcgc3RyaW5nLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCB0b2tlblN0YXJ0LCB0aGlzLm1ham9yLCB0aGlzLm1pbm9yLAogICAgICB7Ym9vbCBjYW5vbmljYWxpemV9KQogICAgICA6IHN1cGVyLmZyb21TdWJzdHJpbmcoCiAgICAgICAgICAgIFRva2VuVHlwZS5TSU5HTEVfTElORV9DT01NRU5ULCBzdHJpbmcsIHN0YXJ0LCBlbmQsIHRva2VuU3RhcnQsCiAgICAgICAgICAgIGNhbm9uaWNhbGl6ZTogY2Fub25pY2FsaXplKTsKCiAgTGFuZ3VhZ2VWZXJzaW9uVG9rZW4uZnJvbVV0ZjhCeXRlcyhMaXN0PGludD4gYnl0ZXMsIGludCBzdGFydCwgaW50IGVuZCwKICAgICAgaW50IHRva2VuU3RhcnQsIHRoaXMubWFqb3IsIHRoaXMubWlub3IpCiAgICAgIDogc3VwZXIuZnJvbVV0ZjhCeXRlcygKICAgICAgICAgICAgVG9rZW5UeXBlLlNJTkdMRV9MSU5FX0NPTU1FTlQsIGJ5dGVzLCBzdGFydCwgZW5kLCB0cnVlLCB0b2tlblN0YXJ0KTsKCiAgQG92ZXJyaWRlCiAgTGFuZ3VhZ2VWZXJzaW9uVG9rZW4gY29weSgpID0+CiAgICAgIG5ldyBMYW5ndWFnZVZlcnNpb25Ub2tlbi5mcm9tKGxleGVtZSwgb2Zmc2V0LCBtYWpvciwgbWlub3IpOwp9CgpjbGFzcyBEYXJ0RG9jVG9rZW4gZXh0ZW5kcyBDb21tZW50VG9rZW4KICAgIGltcGxlbWVudHMgYW5hbHl6ZXIuRG9jdW1lbnRhdGlvbkNvbW1lbnRUb2tlbiB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIGxhenkgY29tbWVudCB0b2tlbi4gSWYgW2Nhbm9uaWNhbGl6ZV0gaXMgdHJ1ZSwgdGhlIHN0cmluZwogICAqIGlzIGNhbm9uaWNhbGl6ZWQgYmVmb3JlIHRoZSB0b2tlbiBpcyBjcmVhdGVkLgogICAqLwogIERhcnREb2NUb2tlbi5mcm9tU3Vic3RyaW5nKAogICAgICBUb2tlblR5cGUgdHlwZSwgU3RyaW5nIGRhdGEsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtib29sIGNhbm9uaWNhbGl6ZTogZmFsc2V9KQogICAgICA6IHN1cGVyLmZyb21TdWJzdHJpbmcodHlwZSwgZGF0YSwgc3RhcnQsIGVuZCwgY2hhck9mZnNldCwKICAgICAgICAgICAgY2Fub25pY2FsaXplOiBjYW5vbmljYWxpemUpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbGF6eSBzdHJpbmcgdG9rZW4uIElmIFthc2NpaU9ubHldIGlzIGZhbHNlLCB0aGUgYnl0ZSBhcnJheQogICAqIGlzIHBhc3NlZCB0aHJvdWdoIGEgVVRGLTggZGVjb2Rlci4KICAgKi8KICBEYXJ0RG9jVG9rZW4uZnJvbVV0ZjhCeXRlcyhUb2tlblR5cGUgdHlwZSwgTGlzdDxpbnQ+IGRhdGEsIGludCBzdGFydCwgaW50IGVuZCwKICAgICAgYm9vbCBhc2NpaU9ubHksIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyLmZyb21VdGY4Qnl0ZXModHlwZSwgZGF0YSwgc3RhcnQsIGVuZCwgYXNjaWlPbmx5LCBjaGFyT2Zmc2V0KTsKCiAgRGFydERvY1Rva2VuLl8oVG9rZW5UeXBlIHR5cGUsIHZhbHVlT3JMYXp5U3Vic3RyaW5nLCBpbnQgY2hhck9mZnNldCkKICAgICAgOiBzdXBlci5fKHR5cGUsIHZhbHVlT3JMYXp5U3Vic3RyaW5nLCBjaGFyT2Zmc2V0KTsKCiAgQG92ZXJyaWRlCiAgRGFydERvY1Rva2VuIGNvcHkoKSA9PgogICAgICBuZXcgRGFydERvY1Rva2VuLl8odHlwZSwgdmFsdWVPckxhenlTdWJzdHJpbmcsIGNoYXJPZmZzZXQpOwp9CgovKioKICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gY29tcHV0ZSBhIHN1YnN0cmluZwogKiBsYXppbHkuIFRoZSBzdWJzdHJpbmcgY2FuIGVpdGhlciBvcmlnaW5hdGUgZnJvbSBhIHN0cmluZyBvciBmcm9tCiAqIGEgWzpMaXN0PGludD46XSBvZiBVVEYtOCBieXRlcy4KICovCmFic3RyYWN0IGNsYXNzIF9MYXp5U3Vic3RyaW5nIHsKICAvKiogVGhlIG9yaWdpbmFsIGRhdGEsIGVpdGhlciBhIHN0cmluZyBvciBhIExpc3Q8aW50PiAqLwogIGdldCBkYXRhOwoKICBpbnQgZ2V0IHN0YXJ0OwogIGludCBnZXQgbGVuZ3RoOwoKICAvKioKICAgKiBJZiB0aGlzIHN1YnN0cmluZyBpcyBiYXNlZCBvbiBhIFN0cmluZywgdGhlIFtib29sVmFsdWVdIGluZGljYXRlcyB3aGV0aGVyCiAgICogdGhlIHJlc3VsdGluZyBzdWJzdHJpbmcgc2hvdWxkIGJlIGNhbm9uaWNhbGl6ZWQuCiAgICoKICAgKiBGb3Igc3Vic3RyaW5ncyBiYXNlZCBvbiBhIGJ5dGUgYXJyYXksIHRoZSBbYm9vbFZhbHVlXSBpcyB0cnVlIGlmIHRoZQogICAqIGFycmF5IG9ubHkgaG9sZHMgQVNDSUkgY2hhcmFjdGVycy4gVGhlIHJlc3VsdGluZyBzdWJzdHJpbmcgd2lsbCBiZQogICAqIGNhbm9uaWNhbGl6ZWQgYWZ0ZXIgZGVjb2RpbmcuCiAgICovCiAgYm9vbCBnZXQgYm9vbFZhbHVlOwoKICBfTGF6eVN1YnN0cmluZy5pbnRlcm5hbCgpOwoKICBmYWN0b3J5IF9MYXp5U3Vic3RyaW5nKGRhdGEsIGludCBzdGFydCwgaW50IGxlbmd0aCwgYm9vbCBiKSB7CiAgICAvLyBTZWUgY29tbWVudCBvbiBbQ29tcGFjdExhenlTdWJzdHJpbmddLgogICAgaWYgKHN0YXJ0IDwgMHgxMDAwMDAgJiYgbGVuZ3RoIDwgMHgyMDApIHsKICAgICAgaW50IGZpZWxkcyA9IChzdGFydCA8PCA5KTsKICAgICAgZmllbGRzID0gZmllbGRzIHwgbGVuZ3RoOwogICAgICBmaWVsZHMgPSBmaWVsZHMgPDwgMTsKICAgICAgaWYgKGIpIGZpZWxkcyB8PSAxOwogICAgICByZXR1cm4gbmV3IF9Db21wYWN0TGF6eVN1YnN0cmluZyhkYXRhLCBmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBfRnVsbExhenlTdWJzdHJpbmcoZGF0YSwgc3RhcnQsIGxlbmd0aCwgYik7CiAgICB9CiAgfQp9CgovKioKICogVGhpcyBjbGFzcyBlbmNvZGVzIFtzdGFydF0sIFtsZW5ndGhdIGFuZCBbYm9vbFZhbHVlXSBpbiBhIHNpbmdsZQogKiAzMCBiaXQgaW50ZWdlci4gSXQgdXNlcyAyMCBiaXRzIGZvciBbc3RhcnRdLCB3aGljaCBjb3ZlcnMgc291cmNlIGZpbGVzCiAqIG9mIDFNQi4gW2xlbmd0aF0gaGFzIDkgYml0cywgd2hpY2ggY292ZXJzIDUxMiBjaGFyYWN0ZXJzLgogKgogKiBUaGUgZmlsZSBodG1sX2RhcnQyanMuZGFydCBpcyBjdXJyZW50bHkgYXJvdW5kIDFNQi4KICovCmNsYXNzIF9Db21wYWN0TGF6eVN1YnN0cmluZyBleHRlbmRzIF9MYXp5U3Vic3RyaW5nIHsKICBmaW5hbCBkYXRhOwogIGZpbmFsIGludCBmaWVsZHM7CgogIF9Db21wYWN0TGF6eVN1YnN0cmluZyh0aGlzLmRhdGEsIHRoaXMuZmllbGRzKSA6IHN1cGVyLmludGVybmFsKCk7CgogIGludCBnZXQgc3RhcnQgPT4gZmllbGRzID4+IDEwOwogIGludCBnZXQgbGVuZ3RoID0+IChmaWVsZHMgPj4gMSkgJiAweDFmZjsKICBib29sIGdldCBib29sVmFsdWUgPT4gKGZpZWxkcyAmIDEpID09IDE7Cn0KCmNsYXNzIF9GdWxsTGF6eVN1YnN0cmluZyBleHRlbmRzIF9MYXp5U3Vic3RyaW5nIHsKICBmaW5hbCBkYXRhOwogIGZpbmFsIGludCBzdGFydDsKICBmaW5hbCBpbnQgbGVuZ3RoOwogIGZpbmFsIGJvb2wgYm9vbFZhbHVlOwogIF9GdWxsTGF6eVN1YnN0cmluZyh0aGlzLmRhdGEsIHRoaXMuc3RhcnQsIHRoaXMubGVuZ3RoLCB0aGlzLmJvb2xWYWx1ZSkKICAgICAgOiBzdXBlci5pbnRlcm5hbCgpOwp9Cgpib29sIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yKFN0cmluZyB2YWx1ZSkgewogIHJldHVybiBpc0JpbmFyeU9wZXJhdG9yKHZhbHVlKSB8fAogICAgICBpc01pbnVzT3BlcmF0b3IodmFsdWUpIHx8CiAgICAgIGlzVGVybmFyeU9wZXJhdG9yKHZhbHVlKSB8fAogICAgICBpc1VuYXJ5T3BlcmF0b3IodmFsdWUpOwp9Cgpib29sIGlzVW5hcnlPcGVyYXRvcihTdHJpbmcgdmFsdWUpID0+IGlkZW50aWNhbCh2YWx1ZSwgIn4iKTsKCmJvb2wgaXNCaW5hcnlPcGVyYXRvcihTdHJpbmcgdmFsdWUpIHsKICByZXR1cm4gaWRlbnRpY2FsKHZhbHVlLCAiPT0iKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICJbXSIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgIioiKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICIvIikgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAiJSIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgIn4vIikgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAiKyIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgIjw8IikgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAiPj4iKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICI+Pj4iKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICI+PSIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgIj4iKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICI8PSIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgIjwiKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICImIikgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAiXiIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgInwiKTsKfQoKYm9vbCBpc1Rlcm5hcnlPcGVyYXRvcihTdHJpbmcgdmFsdWUpID0+IGlkZW50aWNhbCh2YWx1ZSwgIltdPSIpOwoKYm9vbCBpc01pbnVzT3BlcmF0b3IoU3RyaW5nIHZhbHVlKSA9PiBpZGVudGljYWwodmFsdWUsICItIik7CoFfAE5OPAEdAS85ATUBJAEEQ0gUBFEGTAVNSk4nBicBOAEGTDMGR0sfRzQBBkgzBh1HSzUeJB0/DR1BBgQBBkooBlAmMTUeJEYNUQYEAUsxNAEMFiojDTYsLjUcND8PH0oIIwYEAQw+AQwfAU4BJTkhPQQBUUQEAQwlUAEMHAIBBEUELy9BMTkBDBcBDCxMAgFKDB8BBkkzBh5HIkApAQYnBkk0AQZKKAZRJkwBRzkBDBlCAQwSHDQhDTA3BgQCAQQ/HAQyBiEGDQEGIQYNAU1HASZRGx1LKQFKLh1RAQwhQwIBKDQGSTMGHkciQCkBBkooBlEmTAFHOQEMGUICAQRKRCMEIDsMARESAQZPNgVKSCMGFgEdAUAuLiEgHBo2DT0GBAIBBERKPQM3BDUOFAFEASErKwIBMg4TFBhJGgIBLSQgIh4CAT0BJiMgHx8fIB8gICEgHyAfHx8dAgFBAT0BLnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY2FubmVyL3Rva2VuLmRhcnQxc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL3NjYW5uZXIvdG9rZW4uZGFydMAAwVkvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLyoqCiAqIERlZmluZXMgdGhlIHRva2VucyB0aGF0IGFyZSBwcm9kdWNlZCBieSB0aGUgc2Nhbm5lciwgdXNlZCBieSB0aGUgcGFyc2VyLCBhbmQKICogcmVmZXJlbmNlZCBmcm9tIHRoZSBbQVNUIHN0cnVjdHVyZV0oYXN0LmRhcnQpLgogKi8KaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKaW1wb3J0ICcuLi9iYXNlL3N5bnRhY3RpY19lbnRpdHkuZGFydCc7CmltcG9ydCAnLi4vZmFzdGEvc2Nhbm5lci90b2tlbl9jb25zdGFudHMuZGFydCc7CmltcG9ydCAnc3RyaW5nX3V0aWxpdGllcy5kYXJ0JzsKCmNvbnN0IGludCBOT19QUkVDRURFTkNFID0gMDsKY29uc3QgaW50IEFTU0lHTk1FTlRfUFJFQ0VERU5DRSA9IDE7CmNvbnN0IGludCBDQVNDQURFX1BSRUNFREVOQ0UgPSAyOwpjb25zdCBpbnQgQ09ORElUSU9OQUxfUFJFQ0VERU5DRSA9IDM7CmNvbnN0IGludCBJRl9OVUxMX1BSRUNFREVOQ0UgPSA0Owpjb25zdCBpbnQgTE9HSUNBTF9PUl9QUkVDRURFTkNFID0gNTsKY29uc3QgaW50IExPR0lDQUxfQU5EX1BSRUNFREVOQ0UgPSA2Owpjb25zdCBpbnQgRVFVQUxJVFlfUFJFQ0VERU5DRSA9IDc7CmNvbnN0IGludCBSRUxBVElPTkFMX1BSRUNFREVOQ0UgPSA4Owpjb25zdCBpbnQgQklUV0lTRV9PUl9QUkVDRURFTkNFID0gOTsKY29uc3QgaW50IEJJVFdJU0VfWE9SX1BSRUNFREVOQ0UgPSAxMDsKY29uc3QgaW50IEJJVFdJU0VfQU5EX1BSRUNFREVOQ0UgPSAxMTsKY29uc3QgaW50IFNISUZUX1BSRUNFREVOQ0UgPSAxMjsKY29uc3QgaW50IEFERElUSVZFX1BSRUNFREVOQ0UgPSAxMzsKY29uc3QgaW50IE1VTFRJUExJQ0FUSVZFX1BSRUNFREVOQ0UgPSAxNDsKY29uc3QgaW50IFBSRUZJWF9QUkVDRURFTkNFID0gMTU7CmNvbnN0IGludCBQT1NURklYX1BSRUNFREVOQ0UgPSAxNjsKY29uc3QgaW50IFNFTEVDVE9SX1BSRUNFREVOQ0UgPSAxNzsKCi8qKgogKiBUaGUgb3BlbmluZyBoYWxmIG9mIGEgZ3JvdXBpbmcgcGFpciBvZiB0b2tlbnMuIFRoaXMgaXMgdXNlZCBmb3IgY3VybHkKICogYnJhY2tldHMgKCd7JyksIHBhcmVudGhlc2VzICgnKCcpLCBhbmQgc3F1YXJlIGJyYWNrZXRzICgnWycpLgogKi8KY2xhc3MgQmVnaW5Ub2tlbiBleHRlbmRzIFNpbXBsZVRva2VuIHsKICAvKioKICAgKiBUaGUgdG9rZW4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIHRva2VuLgogICAqLwogIFRva2VuIGVuZFRva2VuOwoKICAvKioKICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB0b2tlbiB0byBoYXZlIHRoZSBnaXZlbiBbdHlwZV0gYXQgdGhlIGdpdmVuCiAgICogW29mZnNldF0uCiAgICovCiAgQmVnaW5Ub2tlbihUb2tlblR5cGUgdHlwZSwgaW50IG9mZnNldCwgW0NvbW1lbnRUb2tlbiBwcmVjZWRpbmdDb21tZW50XSkKICAgICAgOiBzdXBlcih0eXBlLCBvZmZzZXQsIHByZWNlZGluZ0NvbW1lbnQpIHsKICAgIGFzc2VydCh0eXBlID09IFRva2VuVHlwZS5MVCB8fAogICAgICAgIHR5cGUgPT0gVG9rZW5UeXBlLk9QRU5fQ1VSTFlfQlJBQ0tFVCB8fAogICAgICAgIHR5cGUgPT0gVG9rZW5UeXBlLk9QRU5fUEFSRU4gfHwKICAgICAgICB0eXBlID09IFRva2VuVHlwZS5PUEVOX1NRVUFSRV9CUkFDS0VUIHx8CiAgICAgICAgdHlwZSA9PSBUb2tlblR5cGUuUVVFU1RJT05fUEVSSU9EX09QRU5fU1FVQVJFX0JSQUNLRVQgfHwKICAgICAgICB0eXBlID09IFRva2VuVHlwZS5TVFJJTkdfSU5URVJQT0xBVElPTl9FWFBSRVNTSU9OKTsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIGNvcHkoKSA9PiBuZXcgQmVnaW5Ub2tlbih0eXBlLCBvZmZzZXQsIGNvcHlDb21tZW50cyhwcmVjZWRpbmdDb21tZW50cykpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBnZXQgZW5kR3JvdXAgPT4gZW5kVG9rZW47CgogIC8qKgogICAqIFNldCB0aGUgdG9rZW4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIHRva2VuLgogICAqLwogIHNldCBlbmRHcm91cChUb2tlbiB0b2tlbikgewogICAgZW5kVG9rZW4gPSB0b2tlbjsKICB9Cn0KCi8qKgogKiBBIHRva2VuIHJlcHJlc2VudGluZyBhIGNvbW1lbnQuCiAqLwpjbGFzcyBDb21tZW50VG9rZW4gZXh0ZW5kcyBTdHJpbmdUb2tlbiB7CiAgLyoqCiAgICogVGhlIHRva2VuIHRoYXQgY29udGFpbnMgdGhpcyBjb21tZW50LgogICAqLwogIFNpbXBsZVRva2VuIHBhcmVudDsKCiAgLyoqCiAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdG9rZW4gdG8gcmVwcmVzZW50IGEgdG9rZW4gb2YgdGhlIGdpdmVuIFt0eXBlXQogICAqIHdpdGggdGhlIGdpdmVuIFt2YWx1ZV0gYXQgdGhlIGdpdmVuIFtvZmZzZXRdLgogICAqLwogIENvbW1lbnRUb2tlbihUb2tlblR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBpbnQgb2Zmc2V0KQogICAgICA6IHN1cGVyKHR5cGUsIHZhbHVlLCBvZmZzZXQpOwoKICBAb3ZlcnJpZGUKICBDb21tZW50VG9rZW4gY29weSgpID0+IG5ldyBDb21tZW50VG9rZW4odHlwZSwgX3ZhbHVlLCBvZmZzZXQpOwoKICAvKioKICAgKiBSZW1vdmUgdGhpcyBjb21tZW50IHRva2VuIGZyb20gdGhlIGxpc3QuCiAgICoKICAgKiBUaGlzIGlzIHVzZWQgd2hlbiB3ZSBkZWNpZGUgdG8gaW50ZXJwcmV0IHRoZSBjb21tZW50IGFzIHN5bnRheC4KICAgKi8KICB2b2lkIHJlbW92ZSgpIHsKICAgIGlmIChwcmV2aW91cyAhPSBudWxsKSB7CiAgICAgIHByZXZpb3VzLnNldE5leHRXaXRob3V0U2V0dGluZ1ByZXZpb3VzKG5leHQpOwogICAgICBuZXh0Py5wcmV2aW91cyA9IHByZXZpb3VzOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KHBhcmVudC5wcmVjZWRpbmdDb21tZW50cyA9PSB0aGlzKTsKICAgICAgcGFyZW50LnByZWNlZGluZ0NvbW1lbnRzID0gbmV4dDsKICAgIH0KICB9Cn0KCi8qKgogKiBBIGRvY3VtZW50YXRpb24gY29tbWVudCB0b2tlbi4KICovCmNsYXNzIERvY3VtZW50YXRpb25Db21tZW50VG9rZW4gZXh0ZW5kcyBDb21tZW50VG9rZW4gewogIC8qKgogICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHRva2VuIHRvIHJlcHJlc2VudCBhIHRva2VuIG9mIHRoZSBnaXZlbiBbdHlwZV0KICAgKiB3aXRoIHRoZSBnaXZlbiBbdmFsdWVdIGF0IHRoZSBnaXZlbiBbb2Zmc2V0XS4KICAgKi8KICBEb2N1bWVudGF0aW9uQ29tbWVudFRva2VuKFRva2VuVHlwZSB0eXBlLCBTdHJpbmcgdmFsdWUsIGludCBvZmZzZXQpCiAgICAgIDogc3VwZXIodHlwZSwgdmFsdWUsIG9mZnNldCk7CgogIEBvdmVycmlkZQogIENvbW1lbnRUb2tlbiBjb3B5KCkgPT4gbmV3IERvY3VtZW50YXRpb25Db21tZW50VG9rZW4odHlwZSwgX3ZhbHVlLCBvZmZzZXQpOwp9CgovKioKICogVGhlIGtleXdvcmRzIGluIHRoZSBEYXJ0IHByb2dyYW1taW5nIGxhbmd1YWdlLgogKgogKiBDbGllbnRzIG1heSBub3QgZXh0ZW5kLCBpbXBsZW1lbnQgb3IgbWl4LWluIHRoaXMgY2xhc3MuCiAqLwpjbGFzcyBLZXl3b3JkIGV4dGVuZHMgVG9rZW5UeXBlIHsKICBzdGF0aWMgY29uc3QgS2V5d29yZCBBQlNUUkFDVCA9CiAgICAgIGNvbnN0IEtleXdvcmQoImFic3RyYWN0IiwgIkFCU1RSQUNUIiwgaXNCdWlsdEluOiB0cnVlLCBpc01vZGlmaWVyOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgQVMgPSBjb25zdCBLZXl3b3JkKCJhcyIsICJBUyIsCiAgICAgIHByZWNlZGVuY2U6IFJFTEFUSU9OQUxfUFJFQ0VERU5DRSwgaXNCdWlsdEluOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgQVNTRVJUID0gY29uc3QgS2V5d29yZCgiYXNzZXJ0IiwgIkFTU0VSVCIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBBU1lOQyA9IGNvbnN0IEtleXdvcmQoImFzeW5jIiwgIkFTWU5DIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBBV0FJVCA9IGNvbnN0IEtleXdvcmQoImF3YWl0IiwgIkFXQUlUIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBCUkVBSyA9IGNvbnN0IEtleXdvcmQoImJyZWFrIiwgIkJSRUFLIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIENBU0UgPSBjb25zdCBLZXl3b3JkKCJjYXNlIiwgIkNBU0UiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgQ0FUQ0ggPSBjb25zdCBLZXl3b3JkKCJjYXRjaCIsICJDQVRDSCIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBDTEFTUyA9CiAgICAgIGNvbnN0IEtleXdvcmQoImNsYXNzIiwgIkNMQVNTIiwgaXNUb3BMZXZlbEtleXdvcmQ6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBDT05TVCA9CiAgICAgIGNvbnN0IEtleXdvcmQoImNvbnN0IiwgIkNPTlNUIiwgaXNNb2RpZmllcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIENPTlRJTlVFID0gY29uc3QgS2V5d29yZCgiY29udGludWUiLCAiQ09OVElOVUUiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgQ09WQVJJQU5UID0gY29uc3QgS2V5d29yZCgiY292YXJpYW50IiwgIkNPVkFSSUFOVCIsCiAgICAgIGlzQnVpbHRJbjogdHJ1ZSwgaXNNb2RpZmllcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIERFRkFVTFQgPSBjb25zdCBLZXl3b3JkKCJkZWZhdWx0IiwgIkRFRkFVTFQiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgREVGRVJSRUQgPQogICAgICBjb25zdCBLZXl3b3JkKCJkZWZlcnJlZCIsICJERUZFUlJFRCIsIGlzQnVpbHRJbjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIERPID0gY29uc3QgS2V5d29yZCgiZG8iLCAiRE8iKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgRFlOQU1JQyA9CiAgICAgIGNvbnN0IEtleXdvcmQoImR5bmFtaWMiLCAiRFlOQU1JQyIsIGlzQnVpbHRJbjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEVMU0UgPSBjb25zdCBLZXl3b3JkKCJlbHNlIiwgIkVMU0UiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgRU5VTSA9CiAgICAgIGNvbnN0IEtleXdvcmQoImVudW0iLCAiRU5VTSIsIGlzVG9wTGV2ZWxLZXl3b3JkOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgRVhQT1JUID0gY29uc3QgS2V5d29yZCgiZXhwb3J0IiwgIkVYUE9SVCIsCiAgICAgIGlzQnVpbHRJbjogdHJ1ZSwgaXNUb3BMZXZlbEtleXdvcmQ6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBFWFRFTkRTID0gY29uc3QgS2V5d29yZCgiZXh0ZW5kcyIsICJFWFRFTkRTIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEVYVEVOU0lPTiA9IGNvbnN0IEtleXdvcmQoImV4dGVuc2lvbiIsICJFWFRFTlNJT04iLAogICAgICBpc0J1aWx0SW46IHRydWUsIGlzVG9wTGV2ZWxLZXl3b3JkOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgRVhURVJOQUwgPQogICAgICBjb25zdCBLZXl3b3JkKCJleHRlcm5hbCIsICJFWFRFUk5BTCIsIGlzQnVpbHRJbjogdHJ1ZSwgaXNNb2RpZmllcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEZBQ1RPUlkgPQogICAgICBjb25zdCBLZXl3b3JkKCJmYWN0b3J5IiwgIkZBQ1RPUlkiLCBpc0J1aWx0SW46IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBGQUxTRSA9IGNvbnN0IEtleXdvcmQoImZhbHNlIiwgIkZBTFNFIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEZJTkFMID0KICAgICAgY29uc3QgS2V5d29yZCgiZmluYWwiLCAiRklOQUwiLCBpc01vZGlmaWVyOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgRklOQUxMWSA9IGNvbnN0IEtleXdvcmQoImZpbmFsbHkiLCAiRklOQUxMWSIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBGT1IgPSBjb25zdCBLZXl3b3JkKCJmb3IiLCAiRk9SIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEZVTkNUSU9OID0KICAgICAgY29uc3QgS2V5d29yZCgiRnVuY3Rpb24iLCAiRlVOQ1RJT04iLCBpc1BzZXVkbzogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEdFVCA9IGNvbnN0IEtleXdvcmQoImdldCIsICJHRVQiLCBpc0J1aWx0SW46IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBISURFID0gY29uc3QgS2V5d29yZCgiaGlkZSIsICJISURFIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBJRiA9IGNvbnN0IEtleXdvcmQoImlmIiwgIklGIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIElNUExFTUVOVFMgPQogICAgICBjb25zdCBLZXl3b3JkKCJpbXBsZW1lbnRzIiwgIklNUExFTUVOVFMiLCBpc0J1aWx0SW46IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBJTVBPUlQgPSBjb25zdCBLZXl3b3JkKCJpbXBvcnQiLCAiSU1QT1JUIiwKICAgICAgaXNCdWlsdEluOiB0cnVlLCBpc1RvcExldmVsS2V5d29yZDogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIElOID0gY29uc3QgS2V5d29yZCgiaW4iLCAiSU4iKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgSU5URVJGQUNFID0KICAgICAgY29uc3QgS2V5d29yZCgiaW50ZXJmYWNlIiwgIklOVEVSRkFDRSIsIGlzQnVpbHRJbjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIElTID0KICAgICAgY29uc3QgS2V5d29yZCgiaXMiLCAiSVMiLCBwcmVjZWRlbmNlOiBSRUxBVElPTkFMX1BSRUNFREVOQ0UpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBMQVRFID0gY29uc3QgS2V5d29yZCgibGF0ZSIsICJMQVRFIiwgaXNNb2RpZmllcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIExJQlJBUlkgPSBjb25zdCBLZXl3b3JkKCJsaWJyYXJ5IiwgIkxJQlJBUlkiLAogICAgICBpc0J1aWx0SW46IHRydWUsIGlzVG9wTGV2ZWxLZXl3b3JkOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgTUlYSU4gPQogICAgICBjb25zdCBLZXl3b3JkKCJtaXhpbiIsICJNSVhJTiIsIGlzQnVpbHRJbjogdHJ1ZSwgaXNUb3BMZXZlbEtleXdvcmQ6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBOQVRJVkUgPQogICAgICBjb25zdCBLZXl3b3JkKCJuYXRpdmUiLCAiTkFUSVZFIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBORVcgPSBjb25zdCBLZXl3b3JkKCJuZXciLCAiTkVXIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIE5VTEwgPSBjb25zdCBLZXl3b3JkKCJudWxsIiwgIk5VTEwiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgT0YgPSBjb25zdCBLZXl3b3JkKCJvZiIsICJPRiIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgT04gPSBjb25zdCBLZXl3b3JkKCJvbiIsICJPTiIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgT1BFUkFUT1IgPQogICAgICBjb25zdCBLZXl3b3JkKCJvcGVyYXRvciIsICJPUEVSQVRPUiIsIGlzQnVpbHRJbjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFBBUlQgPQogICAgICBjb25zdCBLZXl3b3JkKCJwYXJ0IiwgIlBBUlQiLCBpc0J1aWx0SW46IHRydWUsIGlzVG9wTGV2ZWxLZXl3b3JkOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgUEFUQ0ggPSBjb25zdCBLZXl3b3JkKCJwYXRjaCIsICJQQVRDSCIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgUkVRVUlSRUQgPQogICAgICBjb25zdCBLZXl3b3JkKCJyZXF1aXJlZCIsICJSRVFVSVJFRCIsIGlzQnVpbHRJbjogdHJ1ZSwgaXNNb2RpZmllcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFJFVEhST1cgPSBjb25zdCBLZXl3b3JkKCJyZXRocm93IiwgIlJFVEhST1ciKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgUkVUVVJOID0gY29uc3QgS2V5d29yZCgicmV0dXJuIiwgIlJFVFVSTiIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBTRVQgPSBjb25zdCBLZXl3b3JkKCJzZXQiLCAiU0VUIiwgaXNCdWlsdEluOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgU0hPVyA9IGNvbnN0IEtleXdvcmQoInNob3ciLCAiU0hPVyIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgU09VUkNFID0KICAgICAgY29uc3QgS2V5d29yZCgic291cmNlIiwgIlNPVVJDRSIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgU1RBVElDID0KICAgICAgY29uc3QgS2V5d29yZCgic3RhdGljIiwgIlNUQVRJQyIsIGlzQnVpbHRJbjogdHJ1ZSwgaXNNb2RpZmllcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFNVUEVSID0gY29uc3QgS2V5d29yZCgic3VwZXIiLCAiU1VQRVIiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgU1dJVENIID0gY29uc3QgS2V5d29yZCgic3dpdGNoIiwgIlNXSVRDSCIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBTWU5DID0gY29uc3QgS2V5d29yZCgic3luYyIsICJTWU5DIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBUSElTID0gY29uc3QgS2V5d29yZCgidGhpcyIsICJUSElTIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFRIUk9XID0gY29uc3QgS2V5d29yZCgidGhyb3ciLCAiVEhST1ciKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgVFJVRSA9IGNvbnN0IEtleXdvcmQoInRydWUiLCAiVFJVRSIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBUUlkgPSBjb25zdCBLZXl3b3JkKCJ0cnkiLCAiVFJZIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFRZUEVERUYgPSBjb25zdCBLZXl3b3JkKCJ0eXBlZGVmIiwgIlRZUEVERUYiLAogICAgICBpc0J1aWx0SW46IHRydWUsIGlzVG9wTGV2ZWxLZXl3b3JkOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgVkFSID0gY29uc3QgS2V5d29yZCgidmFyIiwgIlZBUiIsIGlzTW9kaWZpZXI6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBWT0lEID0gY29uc3QgS2V5d29yZCgidm9pZCIsICJWT0lEIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFdISUxFID0gY29uc3QgS2V5d29yZCgid2hpbGUiLCAiV0hJTEUiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgV0lUSCA9IGNvbnN0IEtleXdvcmQoIndpdGgiLCAiV0lUSCIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBZSUVMRCA9IGNvbnN0IEtleXdvcmQoInlpZWxkIiwgIllJRUxEIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgTGlzdDxLZXl3b3JkPiB2YWx1ZXMgPSBjb25zdCA8S2V5d29yZD5bCiAgICBBQlNUUkFDVCwKICAgIEFTLAogICAgQVNTRVJULAogICAgQVNZTkMsCiAgICBBV0FJVCwKICAgIEJSRUFLLAogICAgQ0FTRSwKICAgIENBVENILAogICAgQ0xBU1MsCiAgICBDT05TVCwKICAgIENPTlRJTlVFLAogICAgQ09WQVJJQU5ULAogICAgREVGQVVMVCwKICAgIERFRkVSUkVELAogICAgRE8sCiAgICBEWU5BTUlDLAogICAgRUxTRSwKICAgIEVOVU0sCiAgICBFWFBPUlQsCiAgICBFWFRFTkRTLAogICAgRVhURU5TSU9OLAogICAgRVhURVJOQUwsCiAgICBGQUNUT1JZLAogICAgRkFMU0UsCiAgICBGSU5BTCwKICAgIEZJTkFMTFksCiAgICBGT1IsCiAgICBGVU5DVElPTiwKICAgIEdFVCwKICAgIEhJREUsCiAgICBJRiwKICAgIElNUExFTUVOVFMsCiAgICBJTVBPUlQsCiAgICBJTiwKICAgIElOVEVSRkFDRSwKICAgIElTLAogICAgTEFURSwKICAgIExJQlJBUlksCiAgICBNSVhJTiwKICAgIE5BVElWRSwKICAgIE5FVywKICAgIE5VTEwsCiAgICBPRiwKICAgIE9OLAogICAgT1BFUkFUT1IsCiAgICBQQVJULAogICAgUEFUQ0gsCiAgICBSRVFVSVJFRCwKICAgIFJFVEhST1csCiAgICBSRVRVUk4sCiAgICBTRVQsCiAgICBTSE9XLAogICAgU09VUkNFLAogICAgU1RBVElDLAogICAgU1VQRVIsCiAgICBTV0lUQ0gsCiAgICBTWU5DLAogICAgVEhJUywKICAgIFRIUk9XLAogICAgVFJVRSwKICAgIFRSWSwKICAgIFRZUEVERUYsCiAgICBWQVIsCiAgICBWT0lELAogICAgV0hJTEUsCiAgICBXSVRILAogICAgWUlFTEQsCiAgXTsKCiAgLyoqCiAgICogQSB0YWJsZSBtYXBwaW5nIHRoZSBsZXhlbWVzIG9mIGtleXdvcmRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGtleXdvcmQuCiAgICovCiAgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIEtleXdvcmQ+IGtleXdvcmRzID0gX2NyZWF0ZUtleXdvcmRNYXAoKTsKCiAgLyoqCiAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUga2V5d29yZCBpcyAiYnVpbHQtaW4iIGlkZW50aWZpZXIuCiAgICovCiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0J1aWx0SW47CgogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgaXNQc2V1ZG87CgogIC8qKgogICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGtleXdvcmQuCiAgICovCiAgY29uc3QgS2V5d29yZChTdHJpbmcgbGV4ZW1lLCBTdHJpbmcgbmFtZSwKICAgICAge3RoaXMuaXNCdWlsdEluOiBmYWxzZSwKICAgICAgYm9vbCBpc01vZGlmaWVyOiBmYWxzZSwKICAgICAgdGhpcy5pc1BzZXVkbzogZmFsc2UsCiAgICAgIGJvb2wgaXNUb3BMZXZlbEtleXdvcmQ6IGZhbHNlLAogICAgICBpbnQgcHJlY2VkZW5jZTogTk9fUFJFQ0VERU5DRX0pCiAgICAgIDogc3VwZXIobGV4ZW1lLCBuYW1lLCBwcmVjZWRlbmNlLCBLRVlXT1JEX1RPS0VOLAogICAgICAgICAgICBpc01vZGlmaWVyOiBpc01vZGlmaWVyLCBpc1RvcExldmVsS2V5d29yZDogaXNUb3BMZXZlbEtleXdvcmQpOwoKICBib29sIGdldCBpc0J1aWx0SW5PclBzZXVkbyA9PiBpc0J1aWx0SW4gfHwgaXNQc2V1ZG87CgogIC8qKgogICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGtleXdvcmQgaXMgImJ1aWx0LWluIiBpZGVudGlmaWVyLgogICAqIFRoaXMgbWV0aG9kIGV4aXN0cyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhbmQgd2lsbCBiZSByZW1vdmVkLgogICAqIFVzZSBbaXNCdWlsdEluXSBpbnN0ZWFkLgogICAqLwogIEBkZXByZWNhdGVkCiAgYm9vbCBnZXQgaXNQc2V1ZG9LZXl3b3JkID0+IGlzQnVpbHRJbjsgLy8gVE9ETyAoZGFucnViZWwpOiByZW1vdmUgdGhpcwoKICAvKioKICAgKiBUaGUgbmFtZSBvZiB0aGUga2V5d29yZCB0eXBlLgogICAqLwogIFN0cmluZyBnZXQgbmFtZSA9PiBsZXhlbWUudG9VcHBlckNhc2UoKTsKCiAgLyoqCiAgICogVGhlIGxleGVtZSBmb3IgdGhlIGtleXdvcmQuCiAgICoKICAgKiBEZXByZWNhdGVkIC0gdXNlIFtsZXhlbWVdIGluc3RlYWQuCiAgICovCiAgQGRlcHJlY2F0ZWQKICBTdHJpbmcgZ2V0IHN5bnRheCA9PiBsZXhlbWU7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7CgogIC8qKgogICAqIENyZWF0ZSBhIHRhYmxlIG1hcHBpbmcgdGhlIGxleGVtZXMgb2Yga2V5d29yZHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcga2V5d29yZAogICAqIGFuZCByZXR1cm4gdGhlIHRhYmxlIHRoYXQgd2FzIGNyZWF0ZWQuCiAgICovCiAgc3RhdGljIE1hcDxTdHJpbmcsIEtleXdvcmQ+IF9jcmVhdGVLZXl3b3JkTWFwKCkgewogICAgTGlua2VkSGFzaE1hcDxTdHJpbmcsIEtleXdvcmQ+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBLZXl3b3JkPigpOwogICAgZm9yIChLZXl3b3JkIGtleXdvcmQgaW4gdmFsdWVzKSB7CiAgICAgIHJlc3VsdFtrZXl3b3JkLmxleGVtZV0gPSBrZXl3b3JkOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCi8qKgogKiBBIHRva2VuIHJlcHJlc2VudGluZyBhIGtleXdvcmQgaW4gdGhlIGxhbmd1YWdlLgogKi8KY2xhc3MgS2V5d29yZFRva2VuIGV4dGVuZHMgU2ltcGxlVG9rZW4gewogIEBvdmVycmlkZQogIGZpbmFsIEtleXdvcmQga2V5d29yZDsKCiAgLyoqCiAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdG9rZW4gdG8gcmVwcmVzZW50IHRoZSBnaXZlbiBba2V5d29yZF0gYXQgdGhlCiAgICogZ2l2ZW4gW29mZnNldF0uCiAgICovCiAgS2V5d29yZFRva2VuKHRoaXMua2V5d29yZCwgaW50IG9mZnNldCwgW0NvbW1lbnRUb2tlbiBwcmVjZWRpbmdDb21tZW50XSkKICAgICAgOiBzdXBlcihrZXl3b3JkLCBvZmZzZXQsIHByZWNlZGluZ0NvbW1lbnQpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBjb3B5KCkgPT4KICAgICAgbmV3IEtleXdvcmRUb2tlbihrZXl3b3JkLCBvZmZzZXQsIGNvcHlDb21tZW50cyhwcmVjZWRpbmdDb21tZW50cykpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0lkZW50aWZpZXIgPT4ga2V5d29yZC5pc1BzZXVkbyB8fCBrZXl3b3JkLmlzQnVpbHRJbjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNLZXl3b3JkID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzS2V5d29yZE9ySWRlbnRpZmllciA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBPYmplY3QgdmFsdWUoKSA9PiBrZXl3b3JkOwp9CgovKioKICogQSB0b2tlbiB0aGF0IHdhcyBzY2FubmVkIGZyb20gdGhlIGlucHV0LiBFYWNoIHRva2VuIGtub3dzIHdoaWNoIHRva2VucwogKiBwcmVjZWRlIGFuZCBmb2xsb3cgaXQsIGFjdGluZyBhcyBhIGxpbmsgaW4gYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgdG9rZW5zLgogKi8KY2xhc3MgU2ltcGxlVG9rZW4gaW1wbGVtZW50cyBUb2tlbiB7CiAgLyoqCiAgICogVGhlIHR5cGUgb2YgdGhlIHRva2VuLgogICAqLwogIEBvdmVycmlkZQogIGZpbmFsIFRva2VuVHlwZSB0eXBlOwoKICAvKioKICAgKiBUaGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZQogICAqIHRva2VuLgogICAqLwogIEBvdmVycmlkZQogIGludCBvZmZzZXQgPSAwOwoKICAvKioKICAgKiBUaGUgcHJldmlvdXMgdG9rZW4gaW4gdGhlIHRva2VuIHN0cmVhbS4KICAgKi8KICBAb3ZlcnJpZGUKICBUb2tlbiBwcmV2aW91czsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gbmV4dDsKCiAgLyoqCiAgICogVGhlIGZpcnN0IGNvbW1lbnQgaW4gdGhlIGxpc3Qgb2YgY29tbWVudHMgdGhhdCBwcmVjZWRlIHRoaXMgdG9rZW4uCiAgICovCiAgQ29tbWVudFRva2VuIF9wcmVjZWRpbmdDb21tZW50OwoKICAvKioKICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB0b2tlbiB0byBoYXZlIHRoZSBnaXZlbiBbdHlwZV0gYW5kIFtvZmZzZXRdLgogICAqLwogIFNpbXBsZVRva2VuKHRoaXMudHlwZSwgdGhpcy5vZmZzZXQsIFt0aGlzLl9wcmVjZWRpbmdDb21tZW50XSkgewogICAgX3NldENvbW1lbnRQYXJlbnQoX3ByZWNlZGluZ0NvbW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBjaGFyQ291bnQgPT4gbGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGNoYXJPZmZzZXQgPT4gb2Zmc2V0OwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGNoYXJFbmQgPT4gZW5kOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBnZXQgYmVmb3JlU3ludGhldGljID0+IG51bGw7CgogIEBvdmVycmlkZQogIHNldCBiZWZvcmVTeW50aGV0aWMoVG9rZW4gcHJldmlvdXMpIHsKICAgIC8vIGlnbm9yZWQKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgZW5kID0+IG9mZnNldCArIGxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZ2V0IGVuZEdyb3VwID0+IG51bGw7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW9mID0+IHR5cGUgPT0gVG9rZW5UeXBlLkVPRjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNJZGVudGlmaWVyID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0tleXdvcmQgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzS2V5d29yZE9ySWRlbnRpZmllciA9PiBpc0lkZW50aWZpZXI7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTW9kaWZpZXIgPT4gdHlwZS5pc01vZGlmaWVyOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc09wZXJhdG9yID0+IHR5cGUuaXNPcGVyYXRvcjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTeW50aGV0aWMgPT4gbGVuZ3RoID09IDA7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVG9wTGV2ZWxLZXl3b3JkID0+IHR5cGUuaXNUb3BMZXZlbEtleXdvcmQ7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVXNlckRlZmluYWJsZU9wZXJhdG9yID0+IHR5cGUuaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I7CgogIEBvdmVycmlkZQogIEtleXdvcmQgZ2V0IGtleXdvcmQgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBraW5kID0+IHR5cGUua2luZDsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gbGV4ZW1lLmxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBsZXhlbWUgPT4gdHlwZS5sZXhlbWU7CgogIEBvdmVycmlkZQogIENvbW1lbnRUb2tlbiBnZXQgcHJlY2VkaW5nQ29tbWVudHMgPT4gX3ByZWNlZGluZ0NvbW1lbnQ7CgogIHZvaWQgc2V0IHByZWNlZGluZ0NvbW1lbnRzKENvbW1lbnRUb2tlbiBjb21tZW50KSB7CiAgICBfcHJlY2VkaW5nQ29tbWVudCA9IGNvbW1lbnQ7CiAgICBfc2V0Q29tbWVudFBhcmVudChfcHJlY2VkaW5nQ29tbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHN0cmluZ1ZhbHVlID0+IHR5cGUuc3RyaW5nVmFsdWU7CgogIEBvdmVycmlkZQogIFRva2VuIGNvcHkoKSA9PgogICAgICBuZXcgU2ltcGxlVG9rZW4odHlwZSwgb2Zmc2V0LCBjb3B5Q29tbWVudHMocHJlY2VkaW5nQ29tbWVudHMpKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gY29weUNvbW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBpZiAodG9rZW4gPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIFRva2VuIGhlYWQgPSB0b2tlbi5jb3B5KCk7CiAgICBUb2tlbiB0YWlsID0gaGVhZDsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIHdoaWxlICh0b2tlbiAhPSBudWxsKSB7CiAgICAgIHRhaWwgPSB0YWlsLnNldE5leHQodG9rZW4uY29weSgpKTsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgfQogICAgcmV0dXJuIGhlYWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG1hdGNoZXNBbnkoTGlzdDxUb2tlblR5cGU+IHR5cGVzKSB7CiAgICBmb3IgKFRva2VuVHlwZSB0eXBlIGluIHR5cGVzKSB7CiAgICAgIGlmICh0aGlzLnR5cGUgPT0gdHlwZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBzZXROZXh0KFRva2VuIHRva2VuKSB7CiAgICBuZXh0ID0gdG9rZW47CiAgICB0b2tlbi5wcmV2aW91cyA9IHRoaXM7CiAgICB0b2tlbi5iZWZvcmVTeW50aGV0aWMgPSB0aGlzOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2V0TmV4dFdpdGhvdXRTZXR0aW5nUHJldmlvdXMoVG9rZW4gdG9rZW4pIHsKICAgIG5leHQgPSB0b2tlbjsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IGxleGVtZTsKCiAgQG92ZXJyaWRlCiAgT2JqZWN0IHZhbHVlKCkgPT4gbGV4ZW1lOwoKICAvKioKICAgKiBTZXRzIHRoZSBgcGFyZW50YCBwcm9wZXJ0eSB0byBgdGhpc2AgZm9yIHRoZSBnaXZlbiBbY29tbWVudF0gYW5kIGFsbCB0aGUKICAgKiBuZXh0IHRva2Vucy4KICAgKi8KICB2b2lkIF9zZXRDb21tZW50UGFyZW50KENvbW1lbnRUb2tlbiBjb21tZW50KSB7CiAgICB3aGlsZSAoY29tbWVudCAhPSBudWxsKSB7CiAgICAgIGNvbW1lbnQucGFyZW50ID0gdGhpczsKICAgICAgY29tbWVudCA9IGNvbW1lbnQubmV4dDsKICAgIH0KICB9Cn0KCi8qKgogKiBBIHRva2VuIHdob3NlIHZhbHVlIGlzIGluZGVwZW5kZW50IG9mIGl0J3MgdHlwZS4KICovCmNsYXNzIFN0cmluZ1Rva2VuIGV4dGVuZHMgU2ltcGxlVG9rZW4gewogIC8qKgogICAqIFRoZSBsZXhlbWUgcmVwcmVzZW50ZWQgYnkgdGhpcyB0b2tlbi4KICAgKi8KICBTdHJpbmcgX3ZhbHVlOwoKICAvKioKICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB0b2tlbiB0byByZXByZXNlbnQgYSB0b2tlbiBvZiB0aGUgZ2l2ZW4gW3R5cGVdCiAgICogd2l0aCB0aGUgZ2l2ZW4gW3ZhbHVlXSBhdCB0aGUgZ2l2ZW4gW29mZnNldF0uCiAgICovCiAgU3RyaW5nVG9rZW4oVG9rZW5UeXBlIHR5cGUsIFN0cmluZyB2YWx1ZSwgaW50IG9mZnNldCwKICAgICAgW0NvbW1lbnRUb2tlbiBwcmVjZWRpbmdDb21tZW50XSkKICAgICAgOiBzdXBlcih0eXBlLCBvZmZzZXQsIHByZWNlZGluZ0NvbW1lbnQpIHsKICAgIHRoaXMuX3ZhbHVlID0gU3RyaW5nVXRpbGl0aWVzLmludGVybih2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0lkZW50aWZpZXIgPT4gaWRlbnRpY2FsKGtpbmQsIElERU5USUZJRVJfVE9LRU4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGxleGVtZSA9PiBfdmFsdWU7CgogIEBvdmVycmlkZQogIFRva2VuIGNvcHkoKSA9PgogICAgICBuZXcgU3RyaW5nVG9rZW4odHlwZSwgX3ZhbHVlLCBvZmZzZXQsIGNvcHlDb21tZW50cyhwcmVjZWRpbmdDb21tZW50cykpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmFsdWUoKSA9PiBfdmFsdWU7Cn0KCi8qKgogKiBBIHN5bnRoZXRpYyBiZWdpbiB0b2tlbi4KICovCmNsYXNzIFN5bnRoZXRpY0JlZ2luVG9rZW4gZXh0ZW5kcyBCZWdpblRva2VuIHsKICAvKioKICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB0b2tlbiB0byBoYXZlIHRoZSBnaXZlbiBbdHlwZV0gYXQgdGhlIGdpdmVuCiAgICogW29mZnNldF0uCiAgICovCiAgU3ludGhldGljQmVnaW5Ub2tlbihUb2tlblR5cGUgdHlwZSwgaW50IG9mZnNldCwKICAgICAgW0NvbW1lbnRUb2tlbiBwcmVjZWRpbmdDb21tZW50XSkKICAgICAgOiBzdXBlcih0eXBlLCBvZmZzZXQsIHByZWNlZGluZ0NvbW1lbnQpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBjb3B5KCkgPT4KICAgICAgbmV3IFN5bnRoZXRpY0JlZ2luVG9rZW4odHlwZSwgb2Zmc2V0LCBjb3B5Q29tbWVudHMocHJlY2VkaW5nQ29tbWVudHMpKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTeW50aGV0aWMgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gMDsKfQoKLyoqCiAqIEEgc3ludGhldGljIGtleXdvcmQgdG9rZW4uCiAqLwpjbGFzcyBTeW50aGV0aWNLZXl3b3JkVG9rZW4gZXh0ZW5kcyBLZXl3b3JkVG9rZW4gewogIC8qKgogICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHRva2VuIHRvIHJlcHJlc2VudCB0aGUgZ2l2ZW4gW2tleXdvcmRdIGF0IHRoZQogICAqIGdpdmVuIFtvZmZzZXRdLgogICAqLwogIFN5bnRoZXRpY0tleXdvcmRUb2tlbihLZXl3b3JkIGtleXdvcmQsIGludCBvZmZzZXQpIDogc3VwZXIoa2V5d29yZCwgb2Zmc2V0KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gMDsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gY29weSgpID0+IG5ldyBTeW50aGV0aWNLZXl3b3JkVG9rZW4oa2V5d29yZCwgb2Zmc2V0KTsKfQoKLyoqCiAqIEEgdG9rZW4gd2hvc2UgdmFsdWUgaXMgaW5kZXBlbmRlbnQgb2YgaXQncyB0eXBlLgogKi8KY2xhc3MgU3ludGhldGljU3RyaW5nVG9rZW4gZXh0ZW5kcyBTdHJpbmdUb2tlbiB7CiAgZmluYWwgaW50IF9sZW5ndGg7CgogIC8qKgogICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHRva2VuIHRvIHJlcHJlc2VudCBhIHRva2VuIG9mIHRoZSBnaXZlbiBbdHlwZV0KICAgKiB3aXRoIHRoZSBnaXZlbiBbdmFsdWVdIGF0IHRoZSBnaXZlbiBbb2Zmc2V0XS4gSWYgdGhlIFtsZW5ndGhdIGlzCiAgICogbm90IHNwZWNpZmllZCwgdGhlbiBpdCBkZWZhdWx0cyB0byB0aGUgbGVuZ3RoIG9mIFt2YWx1ZV0uCiAgICovCiAgU3ludGhldGljU3RyaW5nVG9rZW4oVG9rZW5UeXBlIHR5cGUsIFN0cmluZyB2YWx1ZSwgaW50IG9mZnNldCwgW3RoaXMuX2xlbmd0aF0pCiAgICAgIDogc3VwZXIodHlwZSwgdmFsdWUsIG9mZnNldCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3ludGhldGljID0+IHRydWU7CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoID0+IF9sZW5ndGggPz8gc3VwZXIubGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBjb3B5KCkgPT4gbmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKHR5cGUsIF92YWx1ZSwgb2Zmc2V0LCBfbGVuZ3RoKTsKfQoKLyoqCiAqIEEgc3ludGhldGljIHRva2VuLgogKi8KY2xhc3MgU3ludGhldGljVG9rZW4gZXh0ZW5kcyBTaW1wbGVUb2tlbiB7CiAgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlIHR5cGUsIGludCBvZmZzZXQpIDogc3VwZXIodHlwZSwgb2Zmc2V0KTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gYmVmb3JlU3ludGhldGljOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1N5bnRoZXRpYyA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiAwOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBjb3B5KCkgPT4gbmV3IFN5bnRoZXRpY1Rva2VuKHR5cGUsIG9mZnNldCk7Cn0KCi8qKgogKiBBIHRva2VuIHRoYXQgd2FzIHNjYW5uZWQgZnJvbSB0aGUgaW5wdXQuIEVhY2ggdG9rZW4ga25vd3Mgd2hpY2ggdG9rZW5zCiAqIHByZWNlZGUgYW5kIGZvbGxvdyBpdCwgYWN0aW5nIGFzIGEgbGluayBpbiBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiB0b2tlbnMuCiAqCiAqIENsaWVudHMgbWF5IG5vdCBleHRlbmQsIGltcGxlbWVudCBvciBtaXgtaW4gdGhpcyBjbGFzcy4KICovCmFic3RyYWN0IGNsYXNzIFRva2VuIGltcGxlbWVudHMgU3ludGFjdGljRW50aXR5IHsKICAvKioKICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB0b2tlbiB0byBoYXZlIHRoZSBnaXZlbiBbdHlwZV0gYW5kIFtvZmZzZXRdLgogICAqLwogIGZhY3RvcnkgVG9rZW4oVG9rZW5UeXBlIHR5cGUsIGludCBvZmZzZXQsIFtDb21tZW50VG9rZW4gcHJlY2VlZGluZ0NvbW1lbnRdKSA9CiAgICAgIFNpbXBsZVRva2VuOwoKICAvKioKICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBlbmQtb2YtZmlsZSB0b2tlbiB0byBoYXZlIHRoZSBnaXZlbiBbb2Zmc2V0XS4KICAgKi8KICBmYWN0b3J5IFRva2VuLmVvZihpbnQgb2Zmc2V0LCBbQ29tbWVudFRva2VuIHByZWNlZGluZ0NvbW1lbnRzXSkgewogICAgVG9rZW4gZW9mID0gbmV3IFNpbXBsZVRva2VuKFRva2VuVHlwZS5FT0YsIG9mZnNldCwgcHJlY2VkaW5nQ29tbWVudHMpOwogICAgLy8gRU9GIHBvaW50cyB0byBpdHNlbGYgc28gdGhlcmUncyBhbHdheXMgaW5maW5pdGUgbG9vay1haGVhZC4KICAgIGVvZi5wcmV2aW91cyA9IGVvZjsKICAgIGVvZi5uZXh0ID0gZW9mOwogICAgcmV0dXJuIGVvZjsKICB9CgogIC8qKgogICAqIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwYXJzZWQgYnkgdGhpcyB0b2tlbi4KICAgKi8KICBpbnQgZ2V0IGNoYXJDb3VudDsKCiAgLyoqCiAgICogVGhlIGNoYXJhY3RlciBvZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHRoaXMgdG9rZW4gd2l0aGluIHRoZSBzb3VyY2UgdGV4dC4KICAgKi8KICBpbnQgZ2V0IGNoYXJPZmZzZXQ7CgogIC8qKgogICAqIFRoZSBjaGFyYWN0ZXIgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgdGhpcyB0b2tlbiB3aXRoaW4gdGhlIHNvdXJjZSB0ZXh0LgogICAqLwogIGludCBnZXQgY2hhckVuZDsKCiAgLyoqCiAgICogVGhlIHRva2VuIGJlZm9yZSB0aGlzIHN5bnRoZXRpYyB0b2tlbiwKICAgKiBvciBgbnVsbGAgaWYgdGhpcyBpcyBub3QgYSBzeW50aGV0aWMgYClgLCBgXWAsIGB9YCwgb3IgYD5gIHRva2VuLgogICAqLwogIFRva2VuIGdldCBiZWZvcmVTeW50aGV0aWM7CgogIC8qKgogICAqIFNldCB0b2tlbiBiZWZvcmUgdGhpcyBzeW50aGV0aWMgYClgLCBgXWAsIGB9YCwgb3IgYD5gIHRva2VuLAogICAqIGFuZCBpZ25vcmVkIG90aGVyd2lzZS4KICAgKi8KICBzZXQgYmVmb3JlU3ludGhldGljKFRva2VuIHByZXZpb3VzKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBlbmQ7CgogIC8qKgogICAqIFRoZSB0b2tlbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgdG9rZW4sIG9yIGBudWxsYCBpZiB0aGlzIHRva2VuIGlzIG5vdAogICAqIHRoZSBmaXJzdCBvZiBhIHBhaXIgb2YgbWF0Y2hpbmcgdG9rZW5zIChzdWNoIGFzIHBhcmVudGhlc2VzKS4KICAgKi8KICBUb2tlbiBnZXQgZW5kR3JvdXAgPT4gbnVsbDsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHRva2VuIHJlcHJlc2VudHMgYW4gZW5kIG9mIGZpbGUuCiAgICovCiAgYm9vbCBnZXQgaXNFb2Y7CgogIC8qKgogICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBpZGVudGlmaWVyLiBTb21lIGtleXdvcmRzIGFsbG93ZWQgYXMgaWRlbnRpZmllcnMsCiAgICogc2VlIGltcGxlbWVudGF0aW9uIGluIFtLZXl3b3JkVG9rZW5dLgogICAqLwogIGJvb2wgZ2V0IGlzSWRlbnRpZmllcjsKCiAgLyoqCiAgICogVHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEga2V5d29yZC4gU29tZSBrZXl3b3JkcyBhbGxvd2VkIGFzIGlkZW50aWZpZXJzLAogICAqIHNlZSBpbXBsZW1lbnRhdGlvbiBpbiBbS2V5d29yZFRva2VuXS4KICAgKi8KICBib29sIGdldCBpc0tleXdvcmQ7CgogIC8qKgogICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIGtleXdvcmQgb3IgYW4gaWRlbnRpZmllci4KICAgKi8KICBib29sIGdldCBpc0tleXdvcmRPcklkZW50aWZpZXI7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0b2tlbiBpcyBhIG1vZGlmaWVyIHN1Y2ggYXMgYGFic3RyYWN0YCBvciBgY29uc3RgLgogICAqLwogIGJvb2wgZ2V0IGlzTW9kaWZpZXI7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0b2tlbiByZXByZXNlbnRzIGFuIG9wZXJhdG9yLgogICAqLwogIGJvb2wgZ2V0IGlzT3BlcmF0b3I7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0b2tlbiBpcyBhIHN5bnRoZXRpYyB0b2tlbi4gQSBzeW50aGV0aWMgdG9rZW4gaXMgYQogICAqIHRva2VuIHRoYXQgd2FzIGludHJvZHVjZWQgYnkgdGhlIHBhcnNlciBpbiBvcmRlciB0byByZWNvdmVyIGZyb20gYW4gZXJyb3IKICAgKiBpbiB0aGUgY29kZS4KICAgKi8KICBib29sIGdldCBpc1N5bnRoZXRpYzsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHRva2VuIGlzIGEga2V5d29yZCBzdGFydGluZyBhIHRvcCBsZXZlbCBkZWNsYXJhdGlvbgogICAqIHN1Y2ggYXMgYGNsYXNzYCwgYGVudW1gLCBgaW1wb3J0YCwgZXRjLgogICAqLwogIGJvb2wgZ2V0IGlzVG9wTGV2ZWxLZXl3b3JkOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdG9rZW4gcmVwcmVzZW50cyBhbiBvcGVyYXRvciB0aGF0IGNhbiBiZSBkZWZpbmVkIGJ5CiAgICogdXNlcnMuCiAgICovCiAgYm9vbCBnZXQgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I7CgogIC8qKgogICAqIFJldHVybiB0aGUga2V5d29yZCwgaWYgYSBrZXl3b3JkIHRva2VuLCBvciBgbnVsbGAgb3RoZXJ3aXNlLgogICAqLwogIEtleXdvcmQgZ2V0IGtleXdvcmQ7CgogIC8qKgogICAqIFRoZSBraW5kIGVudW0gb2YgdGhpcyB0b2tlbiBhcyBkZXRlcm1pbmVkIGJ5IGl0cyBbdHlwZV0uCiAgICovCiAgaW50IGdldCBraW5kOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aDsKCiAgLyoqCiAgICogUmV0dXJuIHRoZSBsZXhlbWUgdGhhdCByZXByZXNlbnRzIHRoaXMgdG9rZW4uCiAgICoKICAgKiBGb3IgW1N0cmluZ1Rva2VuXXMgdGhlIFtsZXhlbWVdIGluY2x1ZGVzIHRoZSBxdW90ZXMsIGV4cGxpY2l0IGVzY2FwZXMsIGV0Yy4KICAgKi8KICBTdHJpbmcgZ2V0IGxleGVtZTsKCiAgLyoqCiAgICogUmV0dXJuIHRoZSBuZXh0IHRva2VuIGluIHRoZSB0b2tlbiBzdHJlYW0uCiAgICovCiAgVG9rZW4gZ2V0IG5leHQ7CgogIC8qKgogICAqIFJldHVybiB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgdG9rZW4gc3RyZWFtLgogICAqLwogIHZvaWQgc2V0IG5leHQoVG9rZW4gbmV4dCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgb2Zmc2V0OwoKICAvKioKICAgKiBTZXQgdGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBpbgogICAqIHRoZSB0b2tlbiB0byB0aGUgZ2l2ZW4gW29mZnNldF0uCiAgICovCiAgdm9pZCBzZXQgb2Zmc2V0KGludCBvZmZzZXQpOwoKICAvKioKICAgKiBSZXR1cm4gdGhlIGZpcnN0IGNvbW1lbnQgaW4gdGhlIGxpc3Qgb2YgY29tbWVudHMgdGhhdCBwcmVjZWRlIHRoaXMgdG9rZW4sCiAgICogb3IgYG51bGxgIGlmIHRoZXJlIGFyZSBubyBjb21tZW50cyBwcmVjZWRpbmcgdGhpcyB0b2tlbi4gQWRkaXRpb25hbAogICAqIGNvbW1lbnRzIGNhbiBiZSByZWFjaGVkIGJ5IGZvbGxvd2luZyB0aGUgdG9rZW4gc3RyZWFtIHVzaW5nIFtuZXh0XSB1bnRpbAogICAqIGBudWxsYCBpcyByZXR1cm5lZC4KICAgKgogICAqIEZvciBleGFtcGxlLCBpZiB0aGUgb3JpZ2luYWwgY29udGVudHMgd2VyZSBgLyogb25lICovIC8qIHR3byAqLyBpZGAsIHRoZW4KICAgKiB0aGUgZmlyc3QgcHJlY2VkaW5nIGNvbW1lbnQgdG9rZW4gd2lsbCBoYXZlIGEgbGV4ZW1lIG9mIGAvKiBvbmUgKi9gIGFuZAogICAqIHRoZSBuZXh0IGNvbW1lbnQgdG9rZW4gd2lsbCBoYXZlIGEgbGV4ZW1lIG9mIGAvKiB0d28gKi9gLgogICAqLwogIFRva2VuIGdldCBwcmVjZWRpbmdDb21tZW50czsKCiAgLyoqCiAgICogUmV0dXJuIHRoZSBwcmV2aW91cyB0b2tlbiBpbiB0aGUgdG9rZW4gc3RyZWFtLgogICAqLwogIFRva2VuIGdldCBwcmV2aW91czsKCiAgLyoqCiAgICogU2V0IHRoZSBwcmV2aW91cyB0b2tlbiBpbiB0aGUgdG9rZW4gc3RyZWFtIHRvIHRoZSBnaXZlbiBbdG9rZW5dLgogICAqLwogIHZvaWQgc2V0IHByZXZpb3VzKFRva2VuIHRva2VuKTsKCiAgLyoqCiAgICogRm9yIHN5bWJvbCBhbmQga2V5d29yZCB0b2tlbnMsIHJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGlzCiAgICogdG9rZW4uIEZvciBbU3RyaW5nVG9rZW5dcyB0aGlzIG1ldGhvZCByZXR1cm5zIFs6bnVsbDpdLgogICAqCiAgICogRm9yIFtTeW1ib2xUb2tlbl1zIGFuZCBbS2V5d29yZFRva2VuXXMsIHRoZSBzdHJpbmcgdmFsdWUgaXMgYSBjb21waWxlLXRpbWUKICAgKiBjb25zdGFudCBvcmlnaW5hdGluZyBpbiB0aGUgW1Rva2VuVHlwZV0gb3IgaW4gdGhlIFtLZXl3b3JkXSBpbnN0YW5jZS4KICAgKiBUaGlzIGFsbG93cyB0ZXN0aW5nIGZvciBrZXl3b3JkcyBhbmQgc3ltYm9scyB1c2luZyBbOmlkZW50aWNhbDpdLCBlLmcuLAogICAqIFs6aWRlbnRpY2FsKCdjbGFzcycsIHRva2VuLnZhbHVlKTpdLgogICAqCiAgICogTm90ZSB0aGF0IHJldHVybmluZyBbOm51bGw6XSBmb3Igc3RyaW5nIHRva2VucyBpcyBpbXBvcnRhbnQgdG8gaWRlbnRpZnkKICAgKiBzeW1ib2xzIGFuZCBrZXl3b3Jkcywgd2UgY2Fubm90IHVzZSBbbGV4ZW1lXSBpbnN0ZWFkLiBUaGUgc3RyaW5nIGxpdGVyYWwKICAgKiAgICIkYSgkYiIKICAgKiBwcm9kdWNlcyAuLi4sIFN5bWJvbFRva2VuKCQpLCBTdHJpbmdUb2tlbihhKSwgU3RyaW5nVG9rZW4oKCksIC4uLgogICAqCiAgICogQWZ0ZXIgcGFyc2luZyB0aGUgaWRlbnRpZmllciAnYScsIHRoZSBwYXJzZXIgdGVzdHMgZm9yIGEgZnVuY3Rpb24KICAgKiBkZWNsYXJhdGlvbiB1c2luZyBbOmlkZW50aWNhbChuZXh0LnN0cmluZ1ZhbHVlLCAnKCcpOl0sIHdoaWNoIChyaWdodGZ1bGx5KQogICAqIHJldHVybnMgZmFsc2UgYmVjYXVzZSBzdHJpbmdWYWx1ZSByZXR1cm5zIFs6bnVsbDpdLgogICAqLwogIFN0cmluZyBnZXQgc3RyaW5nVmFsdWU7CgogIC8qKgogICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgdG9rZW4uCiAgICovCiAgVG9rZW5UeXBlIGdldCB0eXBlOwoKICAvKioKICAgKiBSZXR1cm4gYSBuZXdseSBjcmVhdGVkIHRva2VuIHRoYXQgaXMgYSBjb3B5IG9mIHRoaXMgdG9rZW5zCiAgICogaW5jbHVkaW5nIGFueSBbcHJlY2VlZGluZ0NvbW1lbnRdIHRva2VucywKICAgKiBidXQgdGhhdCBpcyBub3QgYSBwYXJ0IG9mIGFueSB0b2tlbiBzdHJlYW0uCiAgICovCiAgVG9rZW4gY29weSgpOwoKICAvKioKICAgKiBDb3B5IGEgbGlua2VkIGxpc3Qgb2YgY29tbWVudCB0b2tlbnMgaWRlbnRpY2FsIHRvIHRoZSBnaXZlbiBjb21tZW50IHRva2Vucy4KICAgKi8KICBUb2tlbiBjb3B5Q29tbWVudHMoVG9rZW4gdG9rZW4pOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdG9rZW4gaGFzIGFueSBvbmUgb2YgdGhlIGdpdmVuIFt0eXBlc10uCiAgICovCiAgYm9vbCBtYXRjaGVzQW55KExpc3Q8VG9rZW5UeXBlPiB0eXBlcyk7CgogIC8qKgogICAqIFNldCB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgdG9rZW4gc3RyZWFtIHRvIHRoZSBnaXZlbiBbdG9rZW5dLiBUaGlzIGhhcyB0aGUKICAgKiBzaWRlLWVmZmVjdCBvZiBzZXR0aW5nIHRoaXMgdG9rZW4gdG8gYmUgdGhlIHByZXZpb3VzIHRva2VuIGZvciB0aGUgZ2l2ZW4KICAgKiB0b2tlbi4gUmV0dXJuIHRoZSB0b2tlbiB0aGF0IHdhcyBwYXNzZWQgaW4uCiAgICovCiAgVG9rZW4gc2V0TmV4dChUb2tlbiB0b2tlbik7CgogIC8qKgogICAqIFNldCB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgdG9rZW4gc3RyZWFtIHRvIHRoZSBnaXZlbiB0b2tlbiB3aXRob3V0IGNoYW5naW5nCiAgICogd2hpY2ggdG9rZW4gaXMgdGhlIHByZXZpb3VzIHRva2VuIGZvciB0aGUgZ2l2ZW4gdG9rZW4uIFJldHVybiB0aGUgdG9rZW4KICAgKiB0aGF0IHdhcyBwYXNzZWQgaW4uCiAgICovCiAgVG9rZW4gc2V0TmV4dFdpdGhvdXRTZXR0aW5nUHJldmlvdXMoVG9rZW4gdG9rZW4pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRva2VuIHRvIGJlIHVzZWQgZm9yIGRlYnVnZ2luZwogICAqIHB1cnBvc2VzLiBUaGUgcmVzdWx0aW5nIHN0cmluZyBtaWdodCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZQogICAqIHN0cnVjdHVyZSBvZiB0aGUgdG9rZW4sIGZvciBleGFtcGxlICdTdHJpbmdUb2tlbihmb28pJyBmb3IgdGhlIGlkZW50aWZpZXIKICAgKiB0b2tlbiAnZm9vJy4KICAgKgogICAqIFVzZSBbbGV4ZW1lXSBmb3IgdGhlIHRleHQgYWN0dWFsbHkgcGFyc2VkIGJ5IHRoZSB0b2tlbi4KICAgKi8KICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKTsKCiAgLyoqCiAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIHRva2VuLiBGb3Iga2V5d29yZCB0b2tlbnMsIHRoaXMgaXMgdGhlIGtleXdvcmQKICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRva2VuLCBmb3Igb3RoZXIgdG9rZW5zIGl0IGlzIHRoZSBsZXhlbWUgYXNzb2NpYXRlZAogICAqIHdpdGggdGhlIHRva2VuLgogICAqLwogIE9iamVjdCB2YWx1ZSgpOwoKICAvKioKICAgKiBDb21wYXJlIHRoZSBnaXZlbiBbdG9rZW5zXSB0byBmaW5kIHRoZSB0b2tlbiB0aGF0IGFwcGVhcnMgZmlyc3QgaW4gdGhlCiAgICogc291cmNlIGJlaW5nIHBhcnNlZC4gVGhhdCBpcywgcmV0dXJuIHRoZSBsZWZ0LW1vc3Qgb2YgYWxsIG9mIHRoZSB0b2tlbnMuCiAgICogVGhlIGxpc3QgbXVzdCBiZSBub24tYG51bGxgLCBidXQgdGhlIGVsZW1lbnRzIG9mIHRoZSBsaXN0IGFyZSBhbGxvd2VkIHRvIGJlCiAgICogYG51bGxgLiBSZXR1cm4gdGhlIHRva2VuIHdpdGggdGhlIHNtYWxsZXN0IG9mZnNldCwgb3IgYG51bGxgIGlmIHRoZSBsaXN0IGlzCiAgICogZW1wdHkgb3IgaWYgYWxsIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgbGlzdCBhcmUgYG51bGxgLgogICAqLwogIHN0YXRpYyBUb2tlbiBsZXhpY2FsbHlGaXJzdChMaXN0PFRva2VuPiB0b2tlbnMpIHsKICAgIFRva2VuIGZpcnN0ID0gbnVsbDsKICAgIGludCBvZmZzZXQgPSAtMTsKICAgIGludCBsZW5ndGggPSB0b2tlbnMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBUb2tlbiB0b2tlbiA9IHRva2Vuc1tpXTsKICAgICAgaWYgKHRva2VuICE9IG51bGwgJiYgKG9mZnNldCA8IDAgfHwgdG9rZW4ub2Zmc2V0IDwgb2Zmc2V0KSkgewogICAgICAgIGZpcnN0ID0gdG9rZW47CiAgICAgICAgb2Zmc2V0ID0gdG9rZW4ub2Zmc2V0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmlyc3Q7CiAgfQp9CgovKioKICogVGhlIGNsYXNzZXMgKG9yIGdyb3Vwcykgb2YgdG9rZW5zIHdpdGggYSBzaW1pbGFyIHVzZS4KICovCmNsYXNzIFRva2VuQ2xhc3MgewogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIG5vdCBwYXJ0IG9mIGFueSBzcGVjaWZpYwogICAqIGNsYXNzIG9mIHRva2VuLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIE5PX0NMQVNTID0gY29uc3QgVG9rZW5DbGFzcygnTk9fQ0xBU1MnKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYW4gYWRkaXRpdmUgb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgQURESVRJVkVfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdBRERJVElWRV9PUEVSQVRPUicsIEFERElUSVZFX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhbiBhc3NpZ25tZW50IG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIEFTU0lHTk1FTlRfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdBU1NJR05NRU5UX09QRVJBVE9SJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYSBiaXR3aXNlLWFuZCBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBCSVRXSVNFX0FORF9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ0JJVFdJU0VfQU5EX09QRVJBVE9SJywgQklUV0lTRV9BTkRfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGEgYml0d2lzZS1vciBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBCSVRXSVNFX09SX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnQklUV0lTRV9PUl9PUEVSQVRPUicsIEJJVFdJU0VfT1JfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGEgYml0d2lzZS14b3Igb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgQklUV0lTRV9YT1JfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdCSVRXSVNFX1hPUl9PUEVSQVRPUicsIEJJVFdJU0VfWE9SX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhIGNhc2NhZGUgb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgQ0FTQ0FERV9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ0NBU0NBREVfT1BFUkFUT1InLCBDQVNDQURFX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhIGNvbmRpdGlvbmFsIG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIENPTkRJVElPTkFMX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnQ09ORElUSU9OQUxfT1BFUkFUT1InLCBDT05ESVRJT05BTF9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYW4gZXF1YWxpdHkgb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgRVFVQUxJVFlfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdFUVVBTElUWV9PUEVSQVRPUicsIEVRVUFMSVRZX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhbiBpZi1udWxsIG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIElGX05VTExfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdJRl9OVUxMX09QRVJBVE9SJywgSUZfTlVMTF9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYSBsb2dpY2FsLWFuZCBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBMT0dJQ0FMX0FORF9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ0xPR0lDQUxfQU5EX09QRVJBVE9SJywgTE9HSUNBTF9BTkRfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGEgbG9naWNhbC1vciBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBMT0dJQ0FMX09SX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnTE9HSUNBTF9PUl9PUEVSQVRPUicsIExPR0lDQUxfT1JfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGEgbXVsdGlwbGljYXRpdmUgb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgTVVMVElQTElDQVRJVkVfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdNVUxUSVBMSUNBVElWRV9PUEVSQVRPUicsIE1VTFRJUExJQ0FUSVZFX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhIHJlbGF0aW9uYWwgb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgUkVMQVRJT05BTF9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ1JFTEFUSU9OQUxfT1BFUkFUT1InLCBSRUxBVElPTkFMX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhIHNoaWZ0IG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIFNISUZUX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnU0hJRlRfT1BFUkFUT1InLCBTSElGVF9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYSB1bmFyeSBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBVTkFSWV9QT1NURklYX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnVU5BUllfUE9TVEZJWF9PUEVSQVRPUicsIFBPU1RGSVhfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGEgdW5hcnkgb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgVU5BUllfUFJFRklYX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnVU5BUllfUFJFRklYX09QRVJBVE9SJywgUFJFRklYX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBUaGUgbmFtZSBvZiB0aGUgdG9rZW4gY2xhc3MuCiAgICovCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8qKgogICAqIFRoZSBwcmVjZWRlbmNlIG9mIHRva2VucyBvZiB0aGlzIGNsYXNzLCBvciBgMGAgaWYgdGhlIHN1Y2ggdG9rZW5zIGRvIG5vdAogICAqIHJlcHJlc2VudCBhbiBvcGVyYXRvci4KICAgKi8KICBmaW5hbCBpbnQgcHJlY2VkZW5jZTsKCiAgLyoqCiAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgY2xhc3Mgb2YgdG9rZW5zIHRvIGhhdmUgdGhlIGdpdmVuIFtuYW1lXSBhbmQKICAgKiBbcHJlY2VkZW5jZV0uCiAgICovCiAgY29uc3QgVG9rZW5DbGFzcyh0aGlzLm5hbWUsIFt0aGlzLnByZWNlZGVuY2UgPSBOT19QUkVDRURFTkNFXSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7Cn0KCi8qKgogKiBUaGUgdHlwZXMgb2YgdG9rZW5zIHRoYXQgY2FuIGJlIHJldHVybmVkIGJ5IHRoZSBzY2FubmVyLgogKgogKiBDbGllbnRzIG1heSBub3QgZXh0ZW5kLCBpbXBsZW1lbnQgb3IgbWl4LWluIHRoaXMgY2xhc3MuCiAqLwpjbGFzcyBUb2tlblR5cGUgewogIC8qKgogICAqIFRoZSB0eXBlIG9mIHRoZSB0b2tlbiB0aGF0IG1hcmtzIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIGlucHV0LgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgRU9GID0KICAgICAgY29uc3QgVG9rZW5UeXBlKCcnLCAnRU9GJywgTk9fUFJFQ0VERU5DRSwgRU9GX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBET1VCTEUgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdkb3VibGUnLCAnRE9VQkxFJywgTk9fUFJFQ0VERU5DRSwgRE9VQkxFX1RPS0VOLAogICAgICBzdHJpbmdWYWx1ZTogbnVsbCk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgSEVYQURFQ0lNQUwgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdoZXhhZGVjaW1hbCcsICdIRVhBREVDSU1BTCcsIE5PX1BSRUNFREVOQ0UsIEhFWEFERUNJTUFMX1RPS0VOLAogICAgICBzdHJpbmdWYWx1ZTogbnVsbCk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgSURFTlRJRklFUiA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ2lkZW50aWZpZXInLCAnSURFTlRJRklFUicsIE5PX1BSRUNFREVOQ0UsIElERU5USUZJRVJfVE9LRU4sCiAgICAgIHN0cmluZ1ZhbHVlOiBudWxsKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBJTlQgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdpbnQnLCAnSU5UJywgTk9fUFJFQ0VERU5DRSwgSU5UX1RPS0VOLAogICAgICBzdHJpbmdWYWx1ZTogbnVsbCk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgTVVMVElfTElORV9DT01NRU5UID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnY29tbWVudCcsICdNVUxUSV9MSU5FX0NPTU1FTlQnLCBOT19QUkVDRURFTkNFLCBDT01NRU5UX1RPS0VOLAogICAgICBzdHJpbmdWYWx1ZTogbnVsbCk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgU0NSSVBUX1RBRyA9CiAgICAgIGNvbnN0IFRva2VuVHlwZSgnc2NyaXB0JywgJ1NDUklQVF9UQUcnLCBOT19QUkVDRURFTkNFLCBTQ1JJUFRfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFNJTkdMRV9MSU5FX0NPTU1FTlQgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdjb21tZW50JywgJ1NJTkdMRV9MSU5FX0NPTU1FTlQnLCBOT19QUkVDRURFTkNFLCBDT01NRU5UX1RPS0VOLAogICAgICBzdHJpbmdWYWx1ZTogbnVsbCk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgU1RSSU5HID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnc3RyaW5nJywgJ1NUUklORycsIE5PX1BSRUNFREVOQ0UsIFNUUklOR19UT0tFTiwKICAgICAgc3RyaW5nVmFsdWU6IG51bGwpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEFNUEVSU0FORCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJyYnLCAnQU1QRVJTQU5EJywgQklUV0lTRV9BTkRfUFJFQ0VERU5DRSwgQU1QRVJTQU5EX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQU1QRVJTQU5EX0FNUEVSU0FORCA9IGNvbnN0IFRva2VuVHlwZSgnJiYnLAogICAgICAnQU1QRVJTQU5EX0FNUEVSU0FORCcsIExPR0lDQUxfQU5EX1BSRUNFREVOQ0UsIEFNUEVSU0FORF9BTVBFUlNBTkRfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICAvLyBUaGlzIGlzIG5vdCB5ZXQgcGFydCBvZiB0aGUgbGFuZ3VhZ2UgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgZmFzdGEKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEFNUEVSU0FORF9BTVBFUlNBTkRfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICcmJj0nLAogICAgICAnQU1QRVJTQU5EX0FNUEVSU0FORF9FUScsCiAgICAgIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwKICAgICAgQU1QRVJTQU5EX0FNUEVSU0FORF9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQU1QRVJTQU5EX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnJj0nLCAnQU1QRVJTQU5EX0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBBTVBFUlNBTkRfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEFUID0KICAgICAgY29uc3QgVG9rZW5UeXBlKCdAJywgJ0FUJywgTk9fUFJFQ0VERU5DRSwgQVRfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEJBTkcgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICchJywgJ0JBTkcnLCBQUkVGSVhfUFJFQ0VERU5DRSwgQkFOR19UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQkFOR19FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJyE9JywgJ0JBTkdfRVEnLCBFUVVBTElUWV9QUkVDRURFTkNFLCBCQU5HX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBCQU5HX0VRX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnIT09JywgJ0JBTkdfRVFfRVEnLCBFUVVBTElUWV9QUkVDRURFTkNFLCBCQU5HX0VRX0VRX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBCQVIgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICd8JywgJ0JBUicsIEJJVFdJU0VfT1JfUFJFQ0VERU5DRSwgQkFSX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQkFSX0JBUiA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ3x8JywgJ0JBUl9CQVInLCBMT0dJQ0FMX09SX1BSRUNFREVOQ0UsIEJBUl9CQVJfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICAvLyBUaGlzIGlzIG5vdCB5ZXQgcGFydCBvZiB0aGUgbGFuZ3VhZ2UgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgZmFzdGEKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEJBUl9CQVJfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICd8fD0nLCAnQkFSX0JBUl9FUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgQkFSX0JBUl9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQkFSX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnfD0nLCAnQkFSX0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBCQVJfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIENPTE9OID0KICAgICAgY29uc3QgVG9rZW5UeXBlKCc6JywgJ0NPTE9OJywgTk9fUFJFQ0VERU5DRSwgQ09MT05fVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIENPTU1BID0KICAgICAgY29uc3QgVG9rZW5UeXBlKCcsJywgJ0NPTU1BJywgTk9fUFJFQ0VERU5DRSwgQ09NTUFfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIENBUkVUID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnXicsICdDQVJFVCcsIEJJVFdJU0VfWE9SX1BSRUNFREVOQ0UsIENBUkVUX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQ0FSRVRfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdePScsICdDQVJFVF9FUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgQ0FSRVRfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIENMT1NFX0NVUkxZX0JSQUNLRVQgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICd9JywgJ0NMT1NFX0NVUkxZX0JSQUNLRVQnLCBOT19QUkVDRURFTkNFLCBDTE9TRV9DVVJMWV9CUkFDS0VUX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBDTE9TRV9QQVJFTiA9CiAgICAgIGNvbnN0IFRva2VuVHlwZSgnKScsICdDTE9TRV9QQVJFTicsIE5PX1BSRUNFREVOQ0UsIENMT1NFX1BBUkVOX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBDTE9TRV9TUVVBUkVfQlJBQ0tFVCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ10nLCAnQ0xPU0VfU1FVQVJFX0JSQUNLRVQnLCBOT19QUkVDRURFTkNFLCBDTE9TRV9TUVVBUkVfQlJBQ0tFVF9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc9JywgJ0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBFUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgRVFfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc9PScsICdFUV9FUScsIEVRVUFMSVRZX1BSRUNFREVOQ0UsIEVRX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIC8vLyBUaGUgYD09PWAgb3BlcmF0b3IgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgRGFydCBsYW5ndWFnZQogIC8vLyBidXQgaXMgcGFyc2VkIGFzIHN1Y2ggYnkgdGhlIHNjYW5uZXIgdG8gc3VwcG9ydCBiZXR0ZXIgcmVjb3ZlcnkKICAvLy8gd2hlbiBhIEphdmFTY3JpcHQgY29kZSBzbmlwcGV0IGlzIHBhc3RlZCBpbnRvIGEgRGFydCBmaWxlLgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgRVFfRVFfRVEgPQogICAgICBjb25zdCBUb2tlblR5cGUoJz09PScsICdFUV9FUV9FUScsIEVRVUFMSVRZX1BSRUNFREVOQ0UsIEVRX0VRX0VRX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBGVU5DVElPTiA9CiAgICAgIGNvbnN0IFRva2VuVHlwZSgnPT4nLCAnRlVOQ1RJT04nLCBOT19QUkVDRURFTkNFLCBGVU5DVElPTl9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgR1QgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc+JywgJ0dUJywgUkVMQVRJT05BTF9QUkVDRURFTkNFLCBHVF9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEdUX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPj0nLCAnR1RfRVEnLCBSRUxBVElPTkFMX1BSRUNFREVOQ0UsIEdUX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgR1RfR1QgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc+PicsICdHVF9HVCcsIFNISUZUX1BSRUNFREVOQ0UsIEdUX0dUX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgR1RfR1RfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc+Pj0nLCAnR1RfR1RfRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIEdUX0dUX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBHVF9HVF9HVCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJz4+PicsICdHVF9HVF9HVCcsIFNISUZUX1BSRUNFREVOQ0UsIEdUX0dUX0dUX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgR1RfR1RfR1RfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc+Pj49JywgJ0dUX0dUX0dUX0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBHVF9HVF9HVF9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgSEFTSCA9CiAgICAgIGNvbnN0IFRva2VuVHlwZSgnIycsICdIQVNIJywgTk9fUFJFQ0VERU5DRSwgSEFTSF9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgSU5ERVggPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdbXScsICdJTkRFWCcsIFNFTEVDVE9SX1BSRUNFREVOQ0UsIElOREVYX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgSU5ERVhfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdbXT0nLCAnSU5ERVhfRVEnLCBOT19QUkVDRURFTkNFLCBJTkRFWF9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIExUID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPCcsICdMVCcsIFJFTEFUSU9OQUxfUFJFQ0VERU5DRSwgTFRfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBMVF9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJzw9JywgJ0xUX0VRJywgUkVMQVRJT05BTF9QUkVDRURFTkNFLCBMVF9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIExUX0xUID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPDwnLCAnTFRfTFQnLCBTSElGVF9QUkVDRURFTkNFLCBMVF9MVF9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIExUX0xUX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPDw9JywgJ0xUX0xUX0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBMVF9MVF9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgTUlOVVMgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICctJywgJ01JTlVTJywgQURESVRJVkVfUFJFQ0VERU5DRSwgTUlOVVNfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBNSU5VU19FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJy09JywgJ01JTlVTX0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBNSU5VU19FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgTUlOVVNfTUlOVVMgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICctLScsICdNSU5VU19NSU5VUycsIFBPU1RGSVhfUFJFQ0VERU5DRSwgTUlOVVNfTUlOVVNfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIE9QRU5fQ1VSTFlfQlJBQ0tFVCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ3snLCAnT1BFTl9DVVJMWV9CUkFDS0VUJywgTk9fUFJFQ0VERU5DRSwgT1BFTl9DVVJMWV9CUkFDS0VUX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBPUEVOX1BBUkVOID0KICAgICAgY29uc3QgVG9rZW5UeXBlKCcoJywgJ09QRU5fUEFSRU4nLCBTRUxFQ1RPUl9QUkVDRURFTkNFLCBPUEVOX1BBUkVOX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBPUEVOX1NRVUFSRV9CUkFDS0VUID0gY29uc3QgVG9rZW5UeXBlKCdbJywKICAgICAgJ09QRU5fU1FVQVJFX0JSQUNLRVQnLCBTRUxFQ1RPUl9QUkVDRURFTkNFLCBPUEVOX1NRVUFSRV9CUkFDS0VUX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBQRVJDRU5UID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnJScsICdQRVJDRU5UJywgTVVMVElQTElDQVRJVkVfUFJFQ0VERU5DRSwgUEVSQ0VOVF9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFBFUkNFTlRfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICclPScsICdQRVJDRU5UX0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBQRVJDRU5UX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBQRVJJT0QgPQogICAgICBjb25zdCBUb2tlblR5cGUoJy4nLCAnUEVSSU9EJywgU0VMRUNUT1JfUFJFQ0VERU5DRSwgUEVSSU9EX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBQRVJJT0RfUEVSSU9EID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnLi4nLCAnUEVSSU9EX1BFUklPRCcsIENBU0NBREVfUFJFQ0VERU5DRSwgUEVSSU9EX1BFUklPRF9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUExVUyA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJysnLCAnUExVUycsIEFERElUSVZFX1BSRUNFREVOQ0UsIFBMVVNfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBQTFVTX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnKz0nLCAnUExVU19FUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgUExVU19FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUExVU19QTFVTID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnKysnLCAnUExVU19QTFVTJywgUE9TVEZJWF9QUkVDRURFTkNFLCBQTFVTX1BMVVNfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFFVRVNUSU9OID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPycsICdRVUVTVElPTicsIENPTkRJVElPTkFMX1BSRUNFREVOQ0UsIFFVRVNUSU9OX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBRVUVTVElPTl9QRVJJT0QgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc/LicsICdRVUVTVElPTl9QRVJJT0QnLCBTRUxFQ1RPUl9QUkVDRURFTkNFLCBRVUVTVElPTl9QRVJJT0RfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFFVRVNUSU9OX1FVRVNUSU9OID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPz8nLCAnUVVFU1RJT05fUVVFU1RJT04nLCBJRl9OVUxMX1BSRUNFREVOQ0UsIFFVRVNUSU9OX1FVRVNUSU9OX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBRVUVTVElPTl9RVUVTVElPTl9FUSA9IGNvbnN0IFRva2VuVHlwZSgnPz89JywKICAgICAgJ1FVRVNUSU9OX1FVRVNUSU9OX0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBRVUVTVElPTl9RVUVTVElPTl9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgU0VNSUNPTE9OID0KICAgICAgY29uc3QgVG9rZW5UeXBlKCc7JywgJ1NFTUlDT0xPTicsIE5PX1BSRUNFREVOQ0UsIFNFTUlDT0xPTl9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgU0xBU0ggPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICcvJywgJ1NMQVNIJywgTVVMVElQTElDQVRJVkVfUFJFQ0VERU5DRSwgU0xBU0hfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBTTEFTSF9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJy89JywgJ1NMQVNIX0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBTTEFTSF9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgU1RBUiA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJyonLCAnU1RBUicsIE1VTFRJUExJQ0FUSVZFX1BSRUNFREVOQ0UsIFNUQVJfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBTVEFSX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnKj0nLCAnU1RBUl9FUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgU1RBUl9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgU1RSSU5HX0lOVEVSUE9MQVRJT05fRVhQUkVTU0lPTiA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ1wkeycsCiAgICAgICdTVFJJTkdfSU5URVJQT0xBVElPTl9FWFBSRVNTSU9OJywKICAgICAgTk9fUFJFQ0VERU5DRSwKICAgICAgU1RSSU5HX0lOVEVSUE9MQVRJT05fVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFNUUklOR19JTlRFUlBPTEFUSU9OX0lERU5USUZJRVIgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdcJCcsCiAgICAgICdTVFJJTkdfSU5URVJQT0xBVElPTl9JREVOVElGSUVSJywKICAgICAgTk9fUFJFQ0VERU5DRSwKICAgICAgU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUl9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgVElMREUgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICd+JywgJ1RJTERFJywgUFJFRklYX1BSRUNFREVOQ0UsIFRJTERFX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgVElMREVfU0xBU0ggPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICd+LycsICdUSUxERV9TTEFTSCcsIE1VTFRJUExJQ0FUSVZFX1BSRUNFREVOQ0UsIFRJTERFX1NMQVNIX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgVElMREVfU0xBU0hfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICd+Lz0nLCAnVElMREVfU0xBU0hfRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIFRJTERFX1NMQVNIX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBCQUNLUElORyA9CiAgICAgIGNvbnN0IFRva2VuVHlwZSgnYCcsICdCQUNLUElORycsIE5PX1BSRUNFREVOQ0UsIEJBQ0tQSU5HX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBCQUNLU0xBU0ggPQogICAgICBjb25zdCBUb2tlblR5cGUoJ1xcJywgJ0JBQ0tTTEFTSCcsIE5PX1BSRUNFREVOQ0UsIEJBQ0tTTEFTSF9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUEVSSU9EX1BFUklPRF9QRVJJT0QgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICcuLi4nLCAnUEVSSU9EX1BFUklPRF9QRVJJT0QnLCBOT19QUkVDRURFTkNFLCBQRVJJT0RfUEVSSU9EX1BFUklPRF9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUEVSSU9EX1BFUklPRF9QRVJJT0RfUVVFU1RJT04gPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICcuLi4/JywKICAgICAgJ1BFUklPRF9QRVJJT0RfUEVSSU9EX1FVRVNUSU9OJywKICAgICAgTk9fUFJFQ0VERU5DRSwKICAgICAgUEVSSU9EX1BFUklPRF9QRVJJT0RfUVVFU1RJT05fVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFFVRVNUSU9OX1BFUklPRF9PUEVOX1NRVUFSRV9CUkFDS0VUID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPy5bJywKICAgICAgJ1FVRVNUSU9OX1BFUklPRF9PUEVOX1NRVUFSRV9CUkFDS0VUJywKICAgICAgU0VMRUNUT1JfUFJFQ0VERU5DRSwKICAgICAgUVVFU1RJT05fUEVSSU9EX09QRU5fU1FVQVJFX0JSQUNLRVRfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEFTID0gS2V5d29yZC5BUzsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBJUyA9IEtleXdvcmQuSVM7CgogIC8qKgogICAqIFRva2VuIHR5cGUgdXNlZCBieSBlcnJvciB0b2tlbnMuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBCQURfSU5QVVQgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdtYWxmb3JtZWQgaW5wdXQnLCAnQkFEX0lOUFVUJywgTk9fUFJFQ0VERU5DRSwgQkFEX0lOUFVUX1RPS0VOLAogICAgICBzdHJpbmdWYWx1ZTogbnVsbCk7CgogIC8qKgogICAqIFRva2VuIHR5cGUgdXNlZCBieSBzeW50aGV0aWMgdG9rZW5zIHRoYXQgYXJlIGNyZWF0ZWQgZHVyaW5nIHBhcnNlcgogICAqIHJlY292ZXJ5IChub24tYW5hbHl6ZXIgdXNlIGNhc2UpLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUkVDT1ZFUlkgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdyZWNvdmVyeScsICdSRUNPVkVSWScsIE5PX1BSRUNFREVOQ0UsIFJFQ09WRVJZX1RPS0VOLAogICAgICBzdHJpbmdWYWx1ZTogbnVsbCk7CgogIC8vIFRPRE8oZGFucnViZWwpOiAiYWxsIiBpcyBtaXNsZWFkaW5nCiAgLy8gYmVjYXVzZSB0aGlzIGxpc3QgZG9lcyBub3QgaW5jbHVkZSBhbGwgVG9rZW5UeXBlIGluc3RhbmNlcy4KICBzdGF0aWMgY29uc3QgTGlzdDxUb2tlblR5cGU+IGFsbCA9IGNvbnN0IDxUb2tlblR5cGU+WwogICAgVG9rZW5UeXBlLkVPRiwKICAgIFRva2VuVHlwZS5ET1VCTEUsCiAgICBUb2tlblR5cGUuSEVYQURFQ0lNQUwsCiAgICBUb2tlblR5cGUuSURFTlRJRklFUiwKICAgIFRva2VuVHlwZS5JTlQsCiAgICBUb2tlblR5cGUuTVVMVElfTElORV9DT01NRU5ULAogICAgVG9rZW5UeXBlLlNDUklQVF9UQUcsCiAgICBUb2tlblR5cGUuU0lOR0xFX0xJTkVfQ09NTUVOVCwKICAgIFRva2VuVHlwZS5TVFJJTkcsCiAgICBUb2tlblR5cGUuQU1QRVJTQU5ELAogICAgVG9rZW5UeXBlLkFNUEVSU0FORF9BTVBFUlNBTkQsCiAgICBUb2tlblR5cGUuQU1QRVJTQU5EX0VRLAogICAgVG9rZW5UeXBlLkFULAogICAgVG9rZW5UeXBlLkJBTkcsCiAgICBUb2tlblR5cGUuQkFOR19FUSwKICAgIFRva2VuVHlwZS5CQVIsCiAgICBUb2tlblR5cGUuQkFSX0JBUiwKICAgIFRva2VuVHlwZS5CQVJfRVEsCiAgICBUb2tlblR5cGUuQ09MT04sCiAgICBUb2tlblR5cGUuQ09NTUEsCiAgICBUb2tlblR5cGUuQ0FSRVQsCiAgICBUb2tlblR5cGUuQ0FSRVRfRVEsCiAgICBUb2tlblR5cGUuQ0xPU0VfQ1VSTFlfQlJBQ0tFVCwKICAgIFRva2VuVHlwZS5DTE9TRV9QQVJFTiwKICAgIFRva2VuVHlwZS5DTE9TRV9TUVVBUkVfQlJBQ0tFVCwKICAgIFRva2VuVHlwZS5FUSwKICAgIFRva2VuVHlwZS5FUV9FUSwKICAgIFRva2VuVHlwZS5GVU5DVElPTiwKICAgIFRva2VuVHlwZS5HVCwKICAgIFRva2VuVHlwZS5HVF9FUSwKICAgIFRva2VuVHlwZS5HVF9HVCwKICAgIFRva2VuVHlwZS5HVF9HVF9FUSwKICAgIFRva2VuVHlwZS5IQVNILAogICAgVG9rZW5UeXBlLklOREVYLAogICAgVG9rZW5UeXBlLklOREVYX0VRLAogICAgVG9rZW5UeXBlLkxULAogICAgVG9rZW5UeXBlLkxUX0VRLAogICAgVG9rZW5UeXBlLkxUX0xULAogICAgVG9rZW5UeXBlLkxUX0xUX0VRLAogICAgVG9rZW5UeXBlLk1JTlVTLAogICAgVG9rZW5UeXBlLk1JTlVTX0VRLAogICAgVG9rZW5UeXBlLk1JTlVTX01JTlVTLAogICAgVG9rZW5UeXBlLk9QRU5fQ1VSTFlfQlJBQ0tFVCwKICAgIFRva2VuVHlwZS5PUEVOX1BBUkVOLAogICAgVG9rZW5UeXBlLk9QRU5fU1FVQVJFX0JSQUNLRVQsCiAgICBUb2tlblR5cGUuUEVSQ0VOVCwKICAgIFRva2VuVHlwZS5QRVJDRU5UX0VRLAogICAgVG9rZW5UeXBlLlBFUklPRCwKICAgIFRva2VuVHlwZS5QRVJJT0RfUEVSSU9ELAogICAgVG9rZW5UeXBlLlBMVVMsCiAgICBUb2tlblR5cGUuUExVU19FUSwKICAgIFRva2VuVHlwZS5QTFVTX1BMVVMsCiAgICBUb2tlblR5cGUuUVVFU1RJT04sCiAgICBUb2tlblR5cGUuUVVFU1RJT05fUEVSSU9ELAogICAgVG9rZW5UeXBlLlFVRVNUSU9OX1FVRVNUSU9OLAogICAgVG9rZW5UeXBlLlFVRVNUSU9OX1FVRVNUSU9OX0VRLAogICAgVG9rZW5UeXBlLlNFTUlDT0xPTiwKICAgIFRva2VuVHlwZS5TTEFTSCwKICAgIFRva2VuVHlwZS5TTEFTSF9FUSwKICAgIFRva2VuVHlwZS5TVEFSLAogICAgVG9rZW5UeXBlLlNUQVJfRVEsCiAgICBUb2tlblR5cGUuU1RSSU5HX0lOVEVSUE9MQVRJT05fRVhQUkVTU0lPTiwKICAgIFRva2VuVHlwZS5TVFJJTkdfSU5URVJQT0xBVElPTl9JREVOVElGSUVSLAogICAgVG9rZW5UeXBlLlRJTERFLAogICAgVG9rZW5UeXBlLlRJTERFX1NMQVNILAogICAgVG9rZW5UeXBlLlRJTERFX1NMQVNIX0VRLAogICAgVG9rZW5UeXBlLkJBQ0tQSU5HLAogICAgVG9rZW5UeXBlLkJBQ0tTTEFTSCwKICAgIFRva2VuVHlwZS5QRVJJT0RfUEVSSU9EX1BFUklPRCwKICAgIFRva2VuVHlwZS5QRVJJT0RfUEVSSU9EX1BFUklPRF9RVUVTVElPTiwKCiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogU2hvdWxkIHRoZXNlIGJlIGFkZGVkIHRvIHRoZSAiYWxsIiBsaXN0PwogICAgLy9Ub2tlblR5cGUuSVMsCiAgICAvL1Rva2VuVHlwZS5BUywKCiAgICAvLyBUaGVzZSBhcmUgbm90IHlldCBwYXJ0IG9mIHRoZSBsYW5ndWFnZSBhbmQgbm90IHN1cHBvcnRlZCBieSBmYXN0YQogICAgLy9Ub2tlblR5cGUuQU1QRVJTQU5EX0FNUEVSU0FORF9FUSwKICAgIC8vVG9rZW5UeXBlLkJBUl9CQVJfRVEsCgogICAgLy8gU3VwcG9ydGVkIGJ5IGZhc3RhIGJ1dCBub3QgcGFydCBvZiB0aGUgbGFuZ3VhZ2UKICAgIC8vVG9rZW5UeXBlLkJBTkdfRVFfRVEsCiAgICAvL1Rva2VuVHlwZS5FUV9FUV9FUSwKCiAgICAvLyBVc2VkIGJ5IHN5bnRoZXRpYyB0b2tlbnMgZ2VuZXJhdGVkIGR1cmluZyByZWNvdmVyeQogICAgLy9Ub2tlblR5cGUuQkFEX0lOUFVULAogICAgLy9Ub2tlblR5cGUuUkVDT1ZFUlksCiAgXTsKCiAgZmluYWwgaW50IGtpbmQ7CgogIC8qKgogICAqIGB0cnVlYCBpZiB0aGlzIHRva2VuIHR5cGUgcmVwcmVzZW50cyBhIG1vZGlmaWVyCiAgICogc3VjaCBhcyBgYWJzdHJhY3RgIG9yIGBjb25zdGAuCiAgICovCiAgZmluYWwgYm9vbCBpc01vZGlmaWVyOwoKICAvKioKICAgKiBgdHJ1ZWAgaWYgdGhpcyB0b2tlbiB0eXBlIHJlcHJlc2VudHMgYW4gb3BlcmF0b3IuCiAgICovCiAgZmluYWwgYm9vbCBpc09wZXJhdG9yOwoKICAvKioKICAgKiBgdHJ1ZWAgaWYgdGhpcyB0b2tlbiB0eXBlIHJlcHJlc2VudHMgYSBrZXl3b3JkIHN0YXJ0aW5nIGEgdG9wIGxldmVsCiAgICogZGVjbGFyYXRpb24gc3VjaCBhcyBgY2xhc3NgLCBgZW51bWAsIGBpbXBvcnRgLCBldGMuCiAgICovCiAgZmluYWwgYm9vbCBpc1RvcExldmVsS2V5d29yZDsKCiAgLyoqCiAgICogYHRydWVgIGlmIHRoaXMgdG9rZW4gdHlwZSByZXByZXNlbnRzIGFuIG9wZXJhdG9yCiAgICogdGhhdCBjYW4gYmUgZGVmaW5lZCBieSB1c2Vycy4KICAgKi8KICBmaW5hbCBib29sIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOwoKICAvKioKICAgKiBUaGUgbGV4ZW1lIHRoYXQgZGVmaW5lcyB0aGlzIHR5cGUgb2YgdG9rZW4sCiAgICogb3IgYG51bGxgIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcG9zc2libGUgbGV4ZW1lIGZvciB0aGlzIHR5cGUgb2YgdG9rZW4uCiAgICovCiAgZmluYWwgU3RyaW5nIGxleGVtZTsKCiAgLyoqCiAgICogVGhlIG5hbWUgb2YgdGhlIHRva2VuIHR5cGUuCiAgICovCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8qKgogICAqIFRoZSBwcmVjZWRlbmNlIG9mIHRoaXMgdHlwZSBvZiB0b2tlbiwKICAgKiBvciBgMGAgaWYgdGhlIHRva2VuIGRvZXMgbm90IHJlcHJlc2VudCBhbiBvcGVyYXRvci4KICAgKi8KICBmaW5hbCBpbnQgcHJlY2VkZW5jZTsKCiAgLyoqCiAgICogU2VlIFtUb2tlbi5zdHJpbmdWYWx1ZV0gZm9yIGFuIGV4cGxhbmF0aW9uLgogICAqLwogIGZpbmFsIFN0cmluZyBzdHJpbmdWYWx1ZTsKCiAgY29uc3QgVG9rZW5UeXBlKHRoaXMubGV4ZW1lLCB0aGlzLm5hbWUsIHRoaXMucHJlY2VkZW5jZSwgdGhpcy5raW5kLAogICAgICB7dGhpcy5pc01vZGlmaWVyOiBmYWxzZSwKICAgICAgdGhpcy5pc09wZXJhdG9yOiBmYWxzZSwKICAgICAgdGhpcy5pc1RvcExldmVsS2V5d29yZDogZmFsc2UsCiAgICAgIHRoaXMuaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IGZhbHNlLAogICAgICBTdHJpbmcgc3RyaW5nVmFsdWU6ICd1bnNwZWNpZmllZCd9KQogICAgICA6IHRoaXMuc3RyaW5nVmFsdWUgPSBzdHJpbmdWYWx1ZSA9PSAndW5zcGVjaWZpZWQnID8gbGV4ZW1lIDogc3RyaW5nVmFsdWU7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0eXBlIG9mIHRva2VuIHJlcHJlc2VudHMgYW4gYWRkaXRpdmUgb3BlcmF0b3IuCiAgICovCiAgYm9vbCBnZXQgaXNBZGRpdGl2ZU9wZXJhdG9yID0+IHByZWNlZGVuY2UgPT0gQURESVRJVkVfUFJFQ0VERU5DRTsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgb2YgdG9rZW4gcmVwcmVzZW50cyBhbiBhc3NpZ25tZW50IG9wZXJhdG9yLgogICAqLwogIGJvb2wgZ2V0IGlzQXNzaWdubWVudE9wZXJhdG9yID0+IHByZWNlZGVuY2UgPT0gQVNTSUdOTUVOVF9QUkVDRURFTkNFOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBvZiB0b2tlbiByZXByZXNlbnRzIGFuIGFzc29jaWF0aXZlIG9wZXJhdG9yLiBBbgogICAqIGFzc29jaWF0aXZlIG9wZXJhdG9yIGlzIGFuIG9wZXJhdG9yIGZvciB3aGljaCB0aGUgZm9sbG93aW5nIGVxdWFsaXR5IGlzCiAgICogdHJ1ZTogYChhICogYikgKiBjID09IGEgKiAoYiAqIGMpYC4gSW4gb3RoZXIgd29yZHMsIGlmIHRoZSByZXN1bHQgb2YKICAgKiBhcHBseWluZyB0aGUgb3BlcmF0b3IgdG8gbXVsdGlwbGUgb3BlcmFuZHMgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciBpbgogICAqIHdoaWNoIHRob3NlIGFwcGxpY2F0aW9ucyBvY2N1ci4KICAgKgogICAqIE5vdGU6IFRoaXMgbWV0aG9kIGNvbnNpZGVycyB0aGUgbG9naWNhbC1hbmQgYW5kIGxvZ2ljYWwtb3Igb3BlcmF0b3JzIHRvIGJlCiAgICogYXNzb2NpYXRpdmUsIGV2ZW4gdGhvdWdoIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYXBwbGljYXRpb24gb2YgdGhvc2UKICAgKiBvcGVyYXRvcnMgY2FuIGhhdmUgYW4gZWZmZWN0IGJlY2F1c2UgZXZhbHVhdGlvbiBvZiB0aGUgcmlnaHQtaGFuZCBvcGVyYW5kCiAgICogaXMgY29uZGl0aW9uYWwuCiAgICovCiAgYm9vbCBnZXQgaXNBc3NvY2lhdGl2ZU9wZXJhdG9yID0+CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLkFNUEVSU0FORCB8fAogICAgICB0aGlzID09IFRva2VuVHlwZS5BTVBFUlNBTkRfQU1QRVJTQU5EIHx8CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLkJBUiB8fAogICAgICB0aGlzID09IFRva2VuVHlwZS5CQVJfQkFSIHx8CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLkNBUkVUIHx8CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLlBMVVMgfHwKICAgICAgdGhpcyA9PSBUb2tlblR5cGUuU1RBUjsKCiAgLyoqCiAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUga2V5d29yZCBpcyBhICJidWlsdC1pbiIgaWRlbnRpZmllci4KICAgKi8KICBib29sIGdldCBpc0J1aWx0SW4gPT4gZmFsc2U7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0eXBlIG9mIHRva2VuIHJlcHJlc2VudHMgYW4gZXF1YWxpdHkgb3BlcmF0b3IuCiAgICovCiAgYm9vbCBnZXQgaXNFcXVhbGl0eU9wZXJhdG9yID0+CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLkJBTkdfRVEgfHwgdGhpcyA9PSBUb2tlblR5cGUuRVFfRVE7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0eXBlIG9mIHRva2VuIHJlcHJlc2VudHMgYW4gaW5jcmVtZW50IG9wZXJhdG9yLgogICAqLwogIGJvb2wgZ2V0IGlzSW5jcmVtZW50T3BlcmF0b3IgPT4KICAgICAgdGhpcyA9PSBUb2tlblR5cGUuUExVU19QTFVTIHx8IHRoaXMgPT0gVG9rZW5UeXBlLk1JTlVTX01JTlVTOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBvZiB0b2tlbiBpcyBhIGtleXdvcmQuCiAgICovCiAgYm9vbCBnZXQgaXNLZXl3b3JkID0+IGtpbmQgPT0gS0VZV09SRF9UT0tFTjsKCiAgLyoqCiAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUga2V5d29yZCBjYW4gYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyCiAgICogaW4gc29tZSBzaXR1YXRpb25zLgogICAqLwogIGJvb2wgZ2V0IGlzUHNldWRvID0+IGZhbHNlOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBvZiB0b2tlbiByZXByZXNlbnRzIGEgbXVsdGlwbGljYXRpdmUgb3BlcmF0b3IuCiAgICovCiAgYm9vbCBnZXQgaXNNdWx0aXBsaWNhdGl2ZU9wZXJhdG9yID0+IHByZWNlZGVuY2UgPT0gTVVMVElQTElDQVRJVkVfUFJFQ0VERU5DRTsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgb2YgdG9rZW4gcmVwcmVzZW50cyBhIHJlbGF0aW9uYWwgb3BlcmF0b3IuCiAgICovCiAgYm9vbCBnZXQgaXNSZWxhdGlvbmFsT3BlcmF0b3IgPT4KICAgICAgdGhpcyA9PSBUb2tlblR5cGUuTFQgfHwKICAgICAgdGhpcyA9PSBUb2tlblR5cGUuTFRfRVEgfHwKICAgICAgdGhpcyA9PSBUb2tlblR5cGUuR1QgfHwKICAgICAgdGhpcyA9PSBUb2tlblR5cGUuR1RfRVE7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0eXBlIG9mIHRva2VuIHJlcHJlc2VudHMgYSBzaGlmdCBvcGVyYXRvci4KICAgKi8KICBib29sIGdldCBpc1NoaWZ0T3BlcmF0b3IgPT4gcHJlY2VkZW5jZSA9PSBTSElGVF9QUkVDRURFTkNFOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBvZiB0b2tlbiByZXByZXNlbnRzIGEgdW5hcnkgcG9zdGZpeCBvcGVyYXRvci4KICAgKi8KICBib29sIGdldCBpc1VuYXJ5UG9zdGZpeE9wZXJhdG9yID0+IHByZWNlZGVuY2UgPT0gUE9TVEZJWF9QUkVDRURFTkNFOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBvZiB0b2tlbiByZXByZXNlbnRzIGEgdW5hcnkgcHJlZml4IG9wZXJhdG9yLgogICAqLwogIGJvb2wgZ2V0IGlzVW5hcnlQcmVmaXhPcGVyYXRvciA9PgogICAgICBwcmVjZWRlbmNlID09IFBSRUZJWF9QUkVDRURFTkNFIHx8CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLk1JTlVTIHx8CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLlBMVVNfUExVUyB8fAogICAgICB0aGlzID09IFRva2VuVHlwZS5NSU5VU19NSU5VUzsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgb2YgdG9rZW4gcmVwcmVzZW50cyBhIHNlbGVjdG9yIG9wZXJhdG9yCiAgICogKHN0YXJ0aW5nIHRva2VuIG9mIGEgc2VsZWN0b3IpLgogICAqLwogIGJvb2wgZ2V0IGlzU2VsZWN0b3JPcGVyYXRvciA9PiBwcmVjZWRlbmNlID09IFNFTEVDVE9SX1BSRUNFREVOQ0U7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7CgogIC8qKgogICAqIFVzZSBbbGV4ZW1lXSBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kCiAgICovCiAgQGRlcHJlY2F0ZWQKICBTdHJpbmcgZ2V0IHZhbHVlID0+IGxleGVtZTsKfQqGvgBOTjwBBFAyBBoBKDAgAR0lIiYiJSYjJSUnJyEkKiIjJAEESUEEJwYvBhIBBkwPBkowIzAoMUE8BAEMUQEMIgEGMwYeFgQCAQQjBCkGKwYWAQZPMwY5JAEMQQEG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aWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBUT0RPKGFoZSk6IE9yaWduaWFsbHkgY29waWVkIGZyb20gc2RrL3BrZy9jb21waWxlci9saWIvc3JjL2NvbG9ycy5kYXJ0LAovLyBtZXJnZSB0aGVzZSB0d28gcGFja2FnZXMuCmxpYnJhcnkgY29sb3JzOwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cganNvbkVuY29kZTsKCmltcG9ydCAnZGFydDppbycgc2hvdyBQbGF0Zm9ybSwgUHJvY2VzcywgUHJvY2Vzc1Jlc3VsdCwgc3RkZXJyLCBzdGRvdXQ7CgppbXBvcnQgJ2NvbXBpbGVyX2NvbnRleHQuZGFydCcgc2hvdyBDb21waWxlckNvbnRleHQ7CgovLy8gQU5TSS94dGVybSB0ZXJtY2FwIGZvciBzZXR0aW5nIGRlZmF1bHQgY29sb3JzLiBPdXRwdXQgZnJvbSBVbml4Ci8vLyBjb21tYW5kLWxpbmUgcHJvZ3JhbSBgdHB1dCBvcGAuCmNvbnN0IFN0cmluZyBERUZBVUxUX0NPTE9SID0gIlx4MWJbMzk7NDltIjsKCi8vLyBBTlNJL3h0ZXJtIHRlcm1jYXAgZm9yIHNldHRpbmcgYmxhY2sgdGV4dCBjb2xvci4gT3V0cHV0IGZyb20gVW5peAovLy8gY29tbWFuZC1saW5lIHByb2dyYW0gYHRwdXQgc2V0YWYgMGAuCmNvbnN0IFN0cmluZyBCTEFDS19DT0xPUiA9ICJceDFiWzMwbSI7CgovLy8gQU5TSS94dGVybSB0ZXJtY2FwIGZvciBzZXR0aW5nIHJlZCB0ZXh0IGNvbG9yLiBPdXRwdXQgZnJvbSBVbml4Ci8vLyBjb21tYW5kLWxpbmUgcHJvZ3JhbSBgdHB1dCBzZXRhZiAxYC4KY29uc3QgU3RyaW5nIFJFRF9DT0xPUiA9ICJceDFiWzMxbSI7CgovLy8gQU5TSS94dGVybSB0ZXJtY2FwIGZvciBzZXR0aW5nIGdyZWVuIHRleHQgY29sb3IuIE91dHB1dCBmcm9tIFVuaXgKLy8vIGNvbW1hbmQtbGluZSBwcm9ncmFtIGB0cHV0IHNldGFmIDJgLgpjb25zdCBTdHJpbmcgR1JFRU5fQ09MT1IgPSAiXHgxYlszMm0iOwoKLy8vIEFOU0kveHRlcm0gdGVybWNhcCBmb3Igc2V0dGluZyB5ZWxsb3cgdGV4dCBjb2xvci4gT3V0cHV0IGZyb20gVW5peAovLy8gY29tbWFuZC1saW5lIHByb2dyYW0gYHRwdXQgc2V0YWYgM2AuCmNvbnN0IFN0cmluZyBZRUxMT1dfQ09MT1IgPSAiXHgxYlszM20iOwoKLy8vIEFOU0kveHRlcm0gdGVybWNhcCBmb3Igc2V0dGluZyBibHVlIHRleHQgY29sb3IuIE91dHB1dCBmcm9tIFVuaXgKLy8vIGNvbW1hbmQtbGluZSBwcm9ncmFtIGB0cHV0IHNldGFmIDRgLgpjb25zdCBTdHJpbmcgQkxVRV9DT0xPUiA9ICJceDFiWzM0bSI7CgovLy8gQU5TSS94dGVybSB0ZXJtY2FwIGZvciBzZXR0aW5nIG1hZ2VudGEgdGV4dCBjb2xvci4gT3V0cHV0IGZyb20gVW5peAovLy8gY29tbWFuZC1saW5lIHByb2dyYW0gYHRwdXQgc2V0YWYgNWAuCmNvbnN0IFN0cmluZyBNQUdFTlRBX0NPTE9SID0gIlx4MWJbMzVtIjsKCi8vLyBBTlNJL3h0ZXJtIHRlcm1jYXAgZm9yIHNldHRpbmcgY3lhbiB0ZXh0IGNvbG9yLiBPdXRwdXQgZnJvbSBVbml4Ci8vLyBjb21tYW5kLWxpbmUgcHJvZ3JhbSBgdHB1dCBzZXRhZiA2YC4KY29uc3QgU3RyaW5nIENZQU5fQ09MT1IgPSAiXHgxYlszNm0iOwoKLy8vIEFOU0kveHRlcm0gdGVybWNhcCBmb3Igc2V0dGluZyB3aGl0ZSB0ZXh0IGNvbG9yLiBPdXRwdXQgZnJvbSBVbml4Ci8vLyBjb21tYW5kLWxpbmUgcHJvZ3JhbSBgdHB1dCBzZXRhZiA3YC4KY29uc3QgU3RyaW5nIFdISVRFX0NPTE9SID0gIlx4MWJbMzdtIjsKCi8vLyBBbGwgdGhlIGFib3ZlIGNvZGVzLiBUaGlzIGlzIHVzZWQgdG8gY29tcGFyZSB0aGUgYWJvdmUgY29kZXMgdG8gdGhlCi8vLyB0ZXJtaW5hbCdzLiBQcmludGluZyB0aGlzIHN0cmluZyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBlZmZlY3QgYXMganVzdAovLy8gcHJpbnRpbmcgW0RFRkFVTFRfQ09MT1JdLgpjb25zdCBTdHJpbmcgQUxMX0NPREVTID0gQkxBQ0tfQ09MT1IgKwogICAgUkVEX0NPTE9SICsKICAgIEdSRUVOX0NPTE9SICsKICAgIFlFTExPV19DT0xPUiArCiAgICBCTFVFX0NPTE9SICsKICAgIE1BR0VOVEFfQ09MT1IgKwogICAgQ1lBTl9DT0xPUiArCiAgICBXSElURV9DT0xPUiArCiAgICBERUZBVUxUX0NPTE9SOwoKY29uc3QgU3RyaW5nIFRFUk1JTkFMX0NBUEFCSUxJVElFUyA9ICIiIgpjb2xvcnMKc2V0YWYgMApzZXRhZiAxCnNldGFmIDIKc2V0YWYgMwpzZXRhZiA0CnNldGFmIDUKc2V0YWYgNgpzZXRhZiA3Cm9wCiIiIjsKClN0cmluZyB3cmFwKFN0cmluZyBzdHJpbmcsIFN0cmluZyBjb2xvcikgewogIHJldHVybiBDb21waWxlckNvbnRleHQuZW5hYmxlQ29sb3JzCiAgICAgID8gIiR7Y29sb3J9JHN0cmluZyR7REVGQVVMVF9DT0xPUn0iCiAgICAgIDogc3RyaW5nOwp9CgpTdHJpbmcgYmxhY2soU3RyaW5nIHN0cmluZykgPT4gd3JhcChzdHJpbmcsIEJMQUNLX0NPTE9SKTsKU3RyaW5nIHJlZChTdHJpbmcgc3RyaW5nKSA9PiB3cmFwKHN0cmluZywgUkVEX0NPTE9SKTsKU3RyaW5nIGdyZWVuKFN0cmluZyBzdHJpbmcpID0+IHdyYXAoc3RyaW5nLCBHUkVFTl9DT0xPUik7ClN0cmluZyB5ZWxsb3coU3RyaW5nIHN0cmluZykgPT4gd3JhcChzdHJpbmcsIFlFTExPV19DT0xPUik7ClN0cmluZyBibHVlKFN0cmluZyBzdHJpbmcpID0+IHdyYXAoc3RyaW5nLCBCTFVFX0NPTE9SKTsKU3RyaW5nIG1hZ2VudGEoU3RyaW5nIHN0cmluZykgPT4gd3JhcChzdHJpbmcsIE1BR0VOVEFfQ09MT1IpOwpTdHJpbmcgY3lhbihTdHJpbmcgc3RyaW5nKSA9PiB3cmFwKHN0cmluZywgQ1lBTl9DT0xPUik7ClN0cmluZyB3aGl0ZShTdHJpbmcgc3RyaW5nKSA9PiB3cmFwKHN0cmluZywgV0hJVEVfQ09MT1IpOwoKLy8vIFJldHVybnMgd2hldGhlciBbc2lua10gc3VwcG9ydHMgQU5TSSBlc2NhcGVzIG9yIGBudWxsYCBpZiBpdCBjb3VsZCBub3QgYmUKLy8vIGRldGVybWluZWQuCmJvb2wgX3N1cHBvcnRzQW5zaUVzY2FwZXMoc2luaykgewogIHRyeSB7CiAgICAvLyBpZ25vcmU6IHVuZGVmaW5lZF9nZXR0ZXIKICAgIHJldHVybiBzaW5rLnN1cHBvcnRzQW5zaUVzY2FwZXM7CiAgfSBvbiBOb1N1Y2hNZXRob2RFcnJvciB7CiAgICAvLyBJZ25vcmVkOiBXZSdyZSBydW5uaW5nIG9uIGFuIG9sZGVyIHZlcnNpb24gb2YgdGhlIERhcnQgVk0gd2hpY2ggZG9lc24ndAogICAgLy8gaW1wbGVtZW50IGBzdXBwb3J0c0Fuc2lFc2NhcGVzYC4KICAgIHJldHVybiBudWxsOwogIH0KfQoKLy8vIFRydWUgaWYgd2Ugc2hvdWxkIGVuYWJsZSBjb2xvcnMgaW4gb3V0cHV0LgovLy8KLy8vIFdlIGVuYWJsZSBjb2xvcnMgd2hlbiBib3RoIGBzdGRvdXRgIGFuZCBgc3RkZXJyYCBzdXBwb3J0IEFOU0kgZXNjYXBlcy4KLy8vCi8vLyBPbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIHRoaXMgZnVuY3Rpb25zIGNoZWNrcyB0aGUgdGVybWluYWwgY2FwYWJpbGl0aWVzLAovLy8gb24gV2luZG93cyB3ZSBvbmx5IGVuYWJsZSBjb2xvcnMgaWYgdGhlIFZNIGdldHRlcnMgYXJlIHByZXNlbnQgYW5kIHJldHVybmVkCi8vLyBgdHJ1ZWAuCi8vLwovLy8gTm90ZTogZG8gbm90IGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHksIGFzIGl0IGlzIGV4cGVuc2l2ZSB0bwovLy8gY29tcHV0ZS4gSW5zdGVhZCwgdXNlIFtDb21waWxlckNvbnRleHQuZW5hYmxlQ29sb3JzXS4KYm9vbCBjb21wdXRlRW5hYmxlQ29sb3JzKENvbXBpbGVyQ29udGV4dCBjb250ZXh0KSB7CiAgLy8gVE9ETyhhaGUpOiBSZW1vdmUgdGhpcyBtZXRob2QuCgogIGJvb2wgc3RkZXJyU3VwcG9ydHNDb2xvcnMgPSBfc3VwcG9ydHNBbnNpRXNjYXBlcyhzdGRvdXQpOwogIGJvb2wgc3Rkb3V0U3VwcG9ydHNDb2xvcnMgPSBfc3VwcG9ydHNBbnNpRXNjYXBlcyhzdGRlcnIpOwoKICBpZiAoc3Rkb3V0U3VwcG9ydHNDb2xvcnMgPT0gZmFsc2UpIHsKICAgIGlmIChjb250ZXh0Lm9wdGlvbnMudmVyYm9zZSkgewogICAgICBwcmludCgiTm90IGVuYWJsaW5nIGNvbG9ycywgc3Rkb3V0IGRvZXMgbm90IHN1cHBvcnQgQU5TSSBjb2xvcnMuIik7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmIChzdGRlcnJTdXBwb3J0c0NvbG9ycyA9PSBmYWxzZSkgewogICAgaWYgKGNvbnRleHQub3B0aW9ucy52ZXJib3NlKSB7CiAgICAgIHByaW50KCJOb3QgZW5hYmxpbmcgY29sb3JzLCBzdGRlcnIgZG9lcyBub3Qgc3VwcG9ydCBBTlNJIGNvbG9ycy4iKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgIGlmIChzdGRlcnJTdXBwb3J0c0NvbG9ycyAhPSB0cnVlIHx8IHN0ZG91dFN1cHBvcnRzQ29sb3JzICE9IHRydWUpIHsKICAgICAgLy8gSW4gdGhpcyBjYXNlLCBlaXRoZXIgW3N0ZG91dF0gb3IgW3N0ZGVycl0gZGlkIG5vdCBzdXBwb3J0IHRoZQogICAgICAvLyBwcm9wZXJ0eSBgc3VwcG9ydHNBbnNpRXNjYXBlc2AuIFNpbmNlIHdlIGRvIG5vdCBoYXZlIGFub3RoZXIgd2F5CiAgICAgIC8vIHRvIGRldGVybWluZSBzdXBwb3J0IGZvciBjb2xvcnMsIHdlIGRpc2FibGUgdGhlbS4KICAgICAgaWYgKGNvbnRleHQub3B0aW9ucy52ZXJib3NlKSB7CiAgICAgICAgcHJpbnQoIk5vdCBlbmFibGluZyBjb2xvcnMgYXMgQU5TSSBpcyBub3Qgc3VwcG9ydGVkLiIpOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChjb250ZXh0Lm9wdGlvbnMudmVyYm9zZSkgewogICAgICBwcmludCgiRW5hYmxpbmcgY29sb3JzIGFzIE9TIGlzIFdpbmRvd3MuIik7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vIFdlIGhhdmUgdG8gY2hlY2sgaWYgdGhlIHRlcm1pbmFsIGFjdHVhbGx5IHN1cHBvcnRzIGNvbG9ycy4gQ3VycmVudGx5LAogIC8vIHRvIGF2b2lkIGxpbmtpbmcgdGhlIERhcnQgVk0gd2l0aCBuY3Vyc2VzLCBBTlNJIGVzY2FwZSBzdXBwb3J0IGlzIHJlZHVjZWQKICAvLyB0byBgUGxhdGZvcm0uZW52aXJvbm1lbnRbJ1RFUk0nXS5jb250YWlucygieHRlcm0iKWAuCgogIC8vIFRoZSBgLVNgIG9wdGlvbiBvZiBgdHB1dGAgYWxsb3dzIHVzIHRvIHF1ZXJ5IG11bHRpcGxlIGNhcGFiaWxpdGllcyBhdAogIC8vIG9uY2UuCiAgUHJvY2Vzc1Jlc3VsdCByZXN1bHQgPSBQcm9jZXNzLnJ1blN5bmMoCiAgICAgICIvYmluL3NoIiwgWyItYyIsICJwcmludGYgJyVzJyAnJFRFUk1JTkFMX0NBUEFCSUxJVElFUycgfCB0cHV0IC1TIl0pOwoKICBpZiAocmVzdWx0LmV4aXRDb2RlICE9IDApIHsKICAgIGlmIChjb250ZXh0Lm9wdGlvbnMudmVyYm9zZSkgewogICAgICBwcmludCgiTm90IGVuYWJsaW5nIGNvbG9ycywgcnVubmluZyB0cHV0IGZhaWxlZC4iKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIExpc3Q8U3RyaW5nPiBsaW5lcyA9IHJlc3VsdC5zdGRvdXQuc3BsaXQoIlxuIik7CgogIGlmIChsaW5lcy5sZW5ndGggIT0gMikgewogICAgaWYgKGNvbnRleHQub3B0aW9ucy52ZXJib3NlKSB7CiAgICAgIHByaW50KCJOb3QgZW5hYmxpbmcgY29sb3JzLCB1bmV4cGVjdGVkIG91dHB1dCBmcm9tIHRwdXQ6ICIKICAgICAgICAgICIke2pzb25FbmNvZGUocmVzdWx0LnN0ZG91dCl9LiIpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgU3RyaW5nIG51bWJlck9mQ29sb3JzID0gbGluZXNbMF07CiAgaWYgKChpbnQudHJ5UGFyc2UobnVtYmVyT2ZDb2xvcnMpID8/IC0xKSA8IDgpIHsKICAgIGlmIChjb250ZXh0Lm9wdGlvbnMudmVyYm9zZSkgewogICAgICBwcmludCgiTm90IGVuYWJsaW5nIGNvbG9ycywgbGVzcyB0aGFuIDggY29sb3JzIHN1cHBvcnRlZDogIgogICAgICAgICAgIiR7anNvbkVuY29kZShudW1iZXJPZkNvbG9ycyl9LiIpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgU3RyaW5nIGFsbENvZGVzID0gbGluZXNbMV0udHJpbSgpOwogIGlmIChBTExfQ09ERVMgIT0gYWxsQ29kZXMpIHsKICAgIGlmIChjb250ZXh0Lm9wdGlvbnMudmVyYm9zZSkgewogICAgICBwcmludCgiTm90IGVuYWJsaW5nIGNvbG9ycywgY29sb3IgY29kZXMgZG9uJ3QgbWF0Y2g6ICIKICAgICAgICAgICIke2pzb25FbmNvZGUoQUxMX0NPREVTKX0gIT0gJHtqc29uRW5jb2RlKGFsbENvZGVzKX0uIik7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBpZiAoY29udGV4dC5vcHRpb25zLnZlcmJvc2UpIHsKICAgIHByaW50KCJFbmFibGluZyBjb2xvcnMuIik7CiAgfQogIHJldHVybiB0cnVlOwp9CoDIAE5OPAFLHRABJwFIATUBRCQsAUYpJwFEKSUBRiknAUcpKAFFKSYBSCkpAUUpJgFGKScBSEkeJxASExEUERITASkHCAgICAgICAgDBQErJioQAgE6Njo8OD44OgFOECIIICUbTygRBAIBLwRLBE9QDARCOjQkATw8AScjSgYSBCcjSgYSBAEcSEdKOyVACBQGIzIGEQQBS086AUsLKkwBHiM6BhIEATIBGyNBLAYSBAEkMiNCLQYSBAElHyM9QwYSBAEhHwQPAgEncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2NvbG9ycy5kYXJ0PXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvdHlwZV9sYWJlbGVyLmRhcnSvlC8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBqc29uOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBCb29sQ29uc3RhbnQsCiAgICAgICAgQm90dG9tVHlwZSwKICAgICAgICBDbGFzcywKICAgICAgICBDb25zdGFudCwKICAgICAgICBDb25zdGFudE1hcEVudHJ5LAogICAgICAgIERhcnRUeXBlLAogICAgICAgIERvdWJsZUNvbnN0YW50LAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEZpZWxkLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBJbnN0YW5jZUNvbnN0YW50LAogICAgICAgIEludENvbnN0YW50LAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBMaXN0Q29uc3RhbnQsCiAgICAgICAgTWFwQ29uc3RhbnQsCiAgICAgICAgTnVsbENvbnN0YW50LAogICAgICAgIFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFNldENvbnN0YW50LAogICAgICAgIFN0cmluZ0NvbnN0YW50LAogICAgICAgIFN5bWJvbENvbnN0YW50LAogICAgICAgIFRlYXJPZmZDb25zdGFudCwKICAgICAgICBUcmVlTm9kZSwKICAgICAgICBUeXBlZGVmVHlwZSwKICAgICAgICBUeXBlTGl0ZXJhbENvbnN0YW50LAogICAgICAgIFR5cGVQYXJhbWV0ZXIsCiAgICAgICAgVHlwZVBhcmFtZXRlclR5cGUsCiAgICAgICAgVW5ldmFsdWF0ZWRDb25zdGFudCwKICAgICAgICBWb2lkVHlwZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdmlzaXRvci5kYXJ0JyBzaG93IENvbnN0YW50VmlzaXRvciwgRGFydFR5cGVWaXNpdG9yOwoKaW1wb3J0ICcuLi9ibGFja2xpc3RlZF9jbGFzc2VzLmRhcnQnIHNob3cgYmxhY2tsaXN0ZWRDb3JlQ2xhc3NlczsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cgTWVzc2FnZSwgdGVtcGxhdGVUeXBlT3JpZ2luLCB0ZW1wbGF0ZVR5cGVPcmlnaW5XaXRoRmlsZVVyaTsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bnN1cHBvcnRlZDsKCi8vLyBBIHByZXR0eS1wcmludGVyIGZvciBLZXJuZWwgdHlwZXMgYW5kIGNvbnN0YW50cyB3aXRoIHRoZSBhYmlsaXR5IHRvIGxhYmVsCi8vLyByYXcgdHlwZXMgd2l0aCBudW1lcmljIG1hcmtlcnMgaW4gRGFydCBjb21tZW50cyAoZS5nLiBgLyoxKi9gKSB0bwovLy8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IHR5cGVzIHdpdGggdGhlIHNhbWUgbmFtZS4gVGhpcyBpcyB1c2VkIGluIGRpYWdub3N0aWMKLy8vIG1lc3NhZ2VzIHRvIGluZGljYXRlIHRoZSBvcmlnaW5zIG9mIHR5cGVzIG9jY3VycmluZyBpbiB0aGUgbWVzc2FnZS4KY2xhc3MgVHlwZUxhYmVsZXIgaW1wbGVtZW50cyBEYXJ0VHlwZVZpc2l0b3I8dm9pZD4sIENvbnN0YW50VmlzaXRvcjx2b2lkPiB7CiAgTGlzdDxMYWJlbGVkTm9kZT4gbmFtZXMgPSA8TGFiZWxlZE5vZGU+W107CiAgTWFwPFN0cmluZywgTGlzdDxMYWJlbGVkTm9kZT4+IG5hbWVNYXAgPSA8U3RyaW5nLCBMaXN0PExhYmVsZWROb2RlPj57fTsKCiAgTGlzdDxPYmplY3Q+IHJlc3VsdDsKCiAgLy8vIFByZXR0eS1wcmludCBhIHR5cGUuCiAgLy8vIFdoZW4gYWxsIHR5cGVzIGFuZCBjb25zdGFudHMgYXBwZWFyaW5nIGluIHRoZSBzYW1lIG1lc3NhZ2UgaGF2ZSBiZWVuCiAgLy8vIHByZXR0eS1wcmludGVkLCB0aGUgcmV0dXJuZWQgbGlzdCBjYW4gYmUgY29udmVydGVkIHRvIGl0cyBzdHJpbmcKICAvLy8gcmVwcmVzZW50YXRpb24gKHdpdGggbGFiZWxzIG9uIGR1cGxpY2F0ZWQgbmFtZXMpIGJ5IHRoZSBgam9pbigpYCBtZXRob2QuCiAgTGlzdDxPYmplY3Q+IGxhYmVsVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICAvLyBUT0RPKGFza2VzYyk6IFJlbW92ZSBudWxsIGNoZWNrIHdoZW4gd2UgYXJlIGNvbXBsZXRlbHkgbnVsbCBjbGVhbiBoZXJlLgogICAgaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIFsibnVsbC10eXBlIl07CiAgICByZXN1bHQgPSBbXTsKICAgIHR5cGUuYWNjZXB0KHRoaXMpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBQcmV0dHktcHJpbnQgYSBjb25zdGFudC4KICAvLy8gV2hlbiBhbGwgdHlwZXMgYW5kIGNvbnN0YW50cyBhcHBlYXJpbmcgaW4gdGhlIHNhbWUgbWVzc2FnZSBoYXZlIGJlZW4KICAvLy8gcHJldHR5LXByaW50ZWQsIHRoZSByZXR1cm5lZCBsaXN0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gaXRzIHN0cmluZwogIC8vLyByZXByZXNlbnRhdGlvbiAod2l0aCBsYWJlbHMgb24gZHVwbGljYXRlZCBuYW1lcykgYnkgdGhlIGBqb2luKClgIG1ldGhvZC4KICBMaXN0PE9iamVjdD4gbGFiZWxDb25zdGFudChDb25zdGFudCBjb25zdGFudCkgewogICAgLy8gVE9ETyhhc2tlc2MpOiBSZW1vdmUgbnVsbCBjaGVjayB3aGVuIHdlIGFyZSBjb21wbGV0ZWx5IG51bGwgY2xlYW4gaGVyZS4KICAgIGlmIChjb25zdGFudCA9PSBudWxsKSByZXR1cm4gWyJudWxsLWNvbnN0YW50Il07CiAgICByZXN1bHQgPSBbXTsKICAgIGNvbnN0YW50LmFjY2VwdCh0aGlzKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gR2V0IGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgb3JpZ2lucyBvZiB0aGUgcmF3IHR5cGVzIGFwcGVhcmluZyBpbgogIC8vLyB0eXBlcyBhbmQgY29uc3RhbnRzIHRoYXQgaGF2ZSBiZWVuIHByZXR0eS1wcmludGVkIHVzaW5nIHRoaXMgbGFiZWxlci4KICBTdHJpbmcgZ2V0IG9yaWdpbk1lc3NhZ2VzIHsKICAgIFN0cmluZ0J1ZmZlciBtZXNzYWdlcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAoTGFiZWxlZE5vZGUgbmFtZSBpbiBuYW1lcykgewogICAgICBtZXNzYWdlcy53cml0ZShuYW1lLm9yaWdpbk1lc3NhZ2UpOwogICAgfQogICAgcmV0dXJuIG1lc3NhZ2VzLnRvU3RyaW5nKCk7CiAgfQoKICAvLyBXZSBkb24ndCBoYXZlIGFjY2VzcyB0byBjb3JlVHlwZXMgaGVyZSwgc28gd2UgaGF2ZSBvdXIgb3duIE9iamVjdCBjaGVjay4KICBzdGF0aWMgYm9vbCBpc09iamVjdChEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmIHR5cGUuY2xhc3NOb2RlLm5hbWUgPT0gJ09iamVjdCcpIHsKICAgICAgVXJpIGltcG9ydFVyaSA9IHR5cGUuY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpOwogICAgICByZXR1cm4gaW1wb3J0VXJpLnNjaGVtZSA9PSAnZGFydCcgJiYgaW1wb3J0VXJpLnBhdGggPT0gJ2NvcmUnOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgTGFiZWxlZE5vZGUgbmFtZUZvckVudGl0eSgKICAgICAgVHJlZU5vZGUgbm9kZSwgU3RyaW5nIG5vZGVOYW1lLCBVcmkgaW1wb3J0VXJpLCBVcmkgZmlsZVVyaSkgewogICAgTGlzdDxMYWJlbGVkTm9kZT4gbGFiZWxzRm9yTmFtZSA9IG5hbWVNYXBbbm9kZU5hbWVdOwogICAgaWYgKGxhYmVsc0Zvck5hbWUgPT0gbnVsbCkgewogICAgICAvLyBGaXJzdCBlbmNvdW50ZXJlZCBlbnRpdHkgd2l0aCB0aGlzIG5hbWUKICAgICAgTGFiZWxlZE5vZGUgbmFtZSA9CiAgICAgICAgICBuZXcgTGFiZWxlZE5vZGUobm9kZSwgbm9kZU5hbWUsIGltcG9ydFVyaSwgZmlsZVVyaSwgdGhpcyk7CiAgICAgIG5hbWVzLmFkZChuYW1lKTsKICAgICAgbmFtZU1hcFtub2RlTmFtZV0gPSBbbmFtZV07CiAgICAgIHJldHVybiBuYW1lOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChMYWJlbGVkTm9kZSBlbnRpdHlGb3JOYW1lIGluIGxhYmVsc0Zvck5hbWUpIHsKICAgICAgICBpZiAoZW50aXR5Rm9yTmFtZS5ub2RlID09IG5vZGUpIHsKICAgICAgICAgIC8vIFByZXZpb3VzbHkgZW5jb3VudGVyZWQgZW50aXR5CiAgICAgICAgICByZXR1cm4gZW50aXR5Rm9yTmFtZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gTmV3IGVudGl0eSB3aXRoIG5hbWUgdGhhdCB3YXMgcHJldmlvdXNseSBlbmNvdW50ZXJlZAogICAgICBMYWJlbGVkTm9kZSBuYW1lID0KICAgICAgICAgIG5ldyBMYWJlbGVkTm9kZShub2RlLCBub2RlTmFtZSwgaW1wb3J0VXJpLCBmaWxlVXJpLCB0aGlzKTsKICAgICAgbmFtZXMuYWRkKG5hbWUpOwogICAgICBsYWJlbHNGb3JOYW1lLmFkZChuYW1lKTsKICAgICAgcmV0dXJuIG5hbWU7CiAgICB9CiAgfQoKICB2b2lkIGRlZmF1bHREYXJ0VHlwZShEYXJ0VHlwZSB0eXBlKSB7fQogIHZvaWQgdmlzaXRUeXBlZGVmVHlwZShUeXBlZGVmVHlwZSBub2RlKSB7fQoKICB2b2lkIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgewogICAgLy8gVE9ETyhhc2tlc2MpOiBUaHJvdyBpbnRlcm5hbCBlcnJvciBpZiBJbnZhbGlkVHlwZSBhcHBlYXJzIGluIGRpYWdub3N0aWNzLgogICAgcmVzdWx0LmFkZCgiaW52YWxpZC10eXBlIik7CiAgfQoKICB2b2lkIHZpc2l0Qm90dG9tVHlwZShCb3R0b21UeXBlIG5vZGUpIHsKICAgIC8vIFRPRE8oYXNrZXNjKTogVGhyb3cgaW50ZXJuYWwgZXJyb3IgaWYgQm90dG9tVHlwZSBhcHBlYXJzIGluIGRpYWdub3N0aWNzLgogICAgcmVzdWx0LmFkZCgiYm90dG9tLXR5cGUiKTsKICB9CgogIHZvaWQgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBub2RlKSB7CiAgICByZXN1bHQuYWRkKCJkeW5hbWljIik7CiAgfQoKICB2b2lkIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgbm9kZSkgewogICAgcmVzdWx0LmFkZCgidm9pZCIpOwogIH0KCiAgdm9pZCB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIFRyZWVOb2RlIHBhcmVudCA9IG5vZGUucGFyYW1ldGVyOwogICAgd2hpbGUgKHBhcmVudCBpcyEgTGlicmFyeSAmJiBwYXJlbnQgIT0gbnVsbCkgewogICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50OwogICAgfQogICAgLy8gTm90ZSB0aGF0IHRoaXMgY2FuIGJlIG51bGwgaWYsIGZvciBpbnN0YW5jZSwgdGhlIGVycm9ybmlvdXMgY29kZSBpcyBub3QKICAgIC8vIGFjdHVhbGx5IGluIHRoZSB0cmVlIC0gdGhlbiB3ZSBkb24ndCBrbm93IHdoZXJlIGl0IGNvbWVzIGZyb20hCiAgICBMaWJyYXJ5IGVuY2xvc2luZ0xpYnJhcnkgPSBwYXJlbnQ7CgogICAgcmVzdWx0LmFkZChuYW1lRm9yRW50aXR5KAogICAgICAgIG5vZGUucGFyYW1ldGVyLAogICAgICAgIG5vZGUucGFyYW1ldGVyLm5hbWUsCiAgICAgICAgZW5jbG9zaW5nTGlicmFyeSA9PSBudWxsID8gdW5rbm93blVyaSA6IGVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpLAogICAgICAgIGVuY2xvc2luZ0xpYnJhcnkgPT0gbnVsbCA/IHVua25vd25VcmkgOiBlbmNsb3NpbmdMaWJyYXJ5LmZpbGVVcmkpKTsKICB9CgogIHZvaWQgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIG5vZGUpIHsKICAgIG5vZGUucmV0dXJuVHlwZS5hY2NlcHQodGhpcyk7CiAgICByZXN1bHQuYWRkKCIgRnVuY3Rpb24iKTsKICAgIGlmIChub2RlLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgcmVzdWx0LmFkZCgiPCIpOwogICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICAgZm9yIChUeXBlUGFyYW1ldGVyIHBhcmFtIGluIG5vZGUudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICBpZiAoIWZpcnN0KSByZXN1bHQuYWRkKCIsICIpOwogICAgICAgIHJlc3VsdC5hZGQocGFyYW0ubmFtZSk7CiAgICAgICAgaWYgKGlzT2JqZWN0KHBhcmFtLmJvdW5kKSAmJiBwYXJhbS5kZWZhdWx0VHlwZSBpcyBEeW5hbWljVHlwZSkgewogICAgICAgICAgLy8gQm91bmQgd2FzIG5vdCBzcGVjaWZpZWQsIGFuZCB0aGVyZWZvcmUgc2hvdWxkIG5vdCBiZSBwcmludGVkLgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQuYWRkKCIgZXh0ZW5kcyAiKTsKICAgICAgICAgIHBhcmFtLmJvdW5kLmFjY2VwdCh0aGlzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmVzdWx0LmFkZCgiPiIpOwogICAgfQogICAgcmVzdWx0LmFkZCgiKCIpOwogICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudDsgaSsrKSB7CiAgICAgIGlmICghZmlyc3QpIHJlc3VsdC5hZGQoIiwgIik7CiAgICAgIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0uYWNjZXB0KHRoaXMpOwogICAgICBmaXJzdCA9IGZhbHNlOwogICAgfQogICAgaWYgKG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoID4gbm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgIGlmIChub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPiAwKSByZXN1bHQuYWRkKCIsICIpOwogICAgICByZXN1bHQuYWRkKCJbIik7CiAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgZm9yIChpbnQgaSA9IG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudDsKICAgICAgICAgIGkgPCBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsKICAgICAgICAgIGkrKykgewogICAgICAgIGlmICghZmlyc3QpIHJlc3VsdC5hZGQoIiwgIik7CiAgICAgICAgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS5hY2NlcHQodGhpcyk7CiAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgfQogICAgICByZXN1bHQuYWRkKCJdIik7CiAgICB9CiAgICBpZiAobm9kZS5uYW1lZFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBpZiAobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5pc05vdEVtcHR5KSByZXN1bHQuYWRkKCIsICIpOwogICAgICByZXN1bHQuYWRkKCJ7Iik7CiAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLm5hbWVkUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmICghZmlyc3QpIHJlc3VsdC5hZGQoIiwgIik7CiAgICAgICAgbm9kZS5uYW1lZFBhcmFtZXRlcnNbaV0udHlwZS5hY2NlcHQodGhpcyk7CiAgICAgICAgcmVzdWx0LmFkZCgiICR7bm9kZS5uYW1lZFBhcmFtZXRlcnNbaV0ubmFtZX0iKTsKICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICB9CiAgICAgIHJlc3VsdC5hZGQoIn0iKTsKICAgIH0KICAgIHJlc3VsdC5hZGQoIikiKTsKICB9CgogIHZvaWQgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgQ2xhc3MgY2xhc3NOb2RlID0gbm9kZS5jbGFzc05vZGU7CiAgICByZXN1bHQuYWRkKG5hbWVGb3JFbnRpdHkoCiAgICAgICAgY2xhc3NOb2RlLAogICAgICAgIGNsYXNzTm9kZS5uYW1lLAogICAgICAgIGNsYXNzTm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaSwKICAgICAgICBjbGFzc05vZGUuZW5jbG9zaW5nTGlicmFyeS5maWxlVXJpKSk7CiAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgcmVzdWx0LmFkZCgiPCIpOwogICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICAgZm9yIChEYXJ0VHlwZSB0eXBlQXJnIGluIG5vZGUudHlwZUFyZ3VtZW50cykgewogICAgICAgIGlmICghZmlyc3QpIHJlc3VsdC5hZGQoIiwgIik7CiAgICAgICAgdHlwZUFyZy5hY2NlcHQodGhpcyk7CiAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgfQogICAgICByZXN1bHQuYWRkKCI+Iik7CiAgICB9CiAgfQoKICB2b2lkIGRlZmF1bHRDb25zdGFudChDb25zdGFudCBub2RlKSB7fQoKICB2b2lkIHZpc2l0TnVsbENvbnN0YW50KE51bGxDb25zdGFudCBub2RlKSB7CiAgICByZXN1bHQuYWRkKG5vZGUpOwogIH0KCiAgdm9pZCB2aXNpdEJvb2xDb25zdGFudChCb29sQ29uc3RhbnQgbm9kZSkgewogICAgcmVzdWx0LmFkZChub2RlKTsKICB9CgogIHZvaWQgdmlzaXRJbnRDb25zdGFudChJbnRDb25zdGFudCBub2RlKSB7CiAgICByZXN1bHQuYWRkKG5vZGUpOwogIH0KCiAgdm9pZCB2aXNpdERvdWJsZUNvbnN0YW50KERvdWJsZUNvbnN0YW50IG5vZGUpIHsKICAgIHJlc3VsdC5hZGQobm9kZSk7CiAgfQoKICB2b2lkIHZpc2l0U3ltYm9sQ29uc3RhbnQoU3ltYm9sQ29uc3RhbnQgbm9kZSkgewogICAgcmVzdWx0LmFkZChub2RlKTsKICB9CgogIHZvaWQgdmlzaXRTdHJpbmdDb25zdGFudChTdHJpbmdDb25zdGFudCBub2RlKSB7CiAgICByZXN1bHQuYWRkKGpzb24uZW5jb2RlKG5vZGUudmFsdWUpKTsKICB9CgogIHZvaWQgdmlzaXRJbnN0YW5jZUNvbnN0YW50KEluc3RhbmNlQ29uc3RhbnQgbm9kZSkgewogICAgbmV3IEludGVyZmFjZVR5cGUobm9kZS5jbGFzc05vZGUsIG5vZGUudHlwZUFyZ3VtZW50cykuYWNjZXB0KHRoaXMpOwogICAgcmVzdWx0LmFkZCgiIHsiKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChGaWVsZCBmaWVsZCBpbiBub2RlLmNsYXNzTm9kZS5maWVsZHMpIHsKICAgICAgaWYgKGZpZWxkLmlzU3RhdGljKSBjb250aW51ZTsKICAgICAgaWYgKCFmaXJzdCkgcmVzdWx0LmFkZCgiLCAiKTsKICAgICAgcmVzdWx0LmFkZCgiJHtmaWVsZC5uYW1lfTogIik7CiAgICAgIG5vZGUuZmllbGRWYWx1ZXNbZmllbGQucmVmZXJlbmNlXS5hY2NlcHQodGhpcyk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgICByZXN1bHQuYWRkKCJ9Iik7CiAgfQoKICB2b2lkIHZpc2l0TGlzdENvbnN0YW50KExpc3RDb25zdGFudCBub2RlKSB7CiAgICByZXN1bHQuYWRkKCI8Iik7CiAgICBub2RlLnR5cGVBcmd1bWVudC5hY2NlcHQodGhpcyk7CiAgICByZXN1bHQuYWRkKCI+WyIpOwogICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICBmb3IgKENvbnN0YW50IGNvbnN0YW50IGluIG5vZGUuZW50cmllcykgewogICAgICBpZiAoIWZpcnN0KSByZXN1bHQuYWRkKCIsICIpOwogICAgICBjb25zdGFudC5hY2NlcHQodGhpcyk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgICByZXN1bHQuYWRkKCJdIik7CiAgfQoKICB2b2lkIHZpc2l0U2V0Q29uc3RhbnQoU2V0Q29uc3RhbnQgbm9kZSkgewogICAgcmVzdWx0LmFkZCgiPCIpOwogICAgbm9kZS50eXBlQXJndW1lbnQuYWNjZXB0KHRoaXMpOwogICAgcmVzdWx0LmFkZCgiPnsiKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChDb25zdGFudCBjb25zdGFudCBpbiBub2RlLmVudHJpZXMpIHsKICAgICAgaWYgKCFmaXJzdCkgcmVzdWx0LmFkZCgiLCAiKTsKICAgICAgY29uc3RhbnQuYWNjZXB0KHRoaXMpOwogICAgICBmaXJzdCA9IGZhbHNlOwogICAgfQogICAgcmVzdWx0LmFkZCgifSIpOwogIH0KCiAgdm9pZCB2aXNpdE1hcENvbnN0YW50KE1hcENvbnN0YW50IG5vZGUpIHsKICAgIHJlc3VsdC5hZGQoIjwiKTsKICAgIG5vZGUua2V5VHlwZS5hY2NlcHQodGhpcyk7CiAgICByZXN1bHQuYWRkKCIsICIpOwogICAgbm9kZS52YWx1ZVR5cGUuYWNjZXB0KHRoaXMpOwogICAgcmVzdWx0LmFkZCgiPnsiKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChDb25zdGFudE1hcEVudHJ5IGVudHJ5IGluIG5vZGUuZW50cmllcykgewogICAgICBpZiAoIWZpcnN0KSByZXN1bHQuYWRkKCIsICIpOwogICAgICBlbnRyeS5rZXkuYWNjZXB0KHRoaXMpOwogICAgICByZXN1bHQuYWRkKCI6ICIpOwogICAgICBlbnRyeS52YWx1ZS5hY2NlcHQodGhpcyk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgICByZXN1bHQuYWRkKCJ9Iik7CiAgfQoKICB2b2lkIHZpc2l0VGVhck9mZkNvbnN0YW50KFRlYXJPZmZDb25zdGFudCBub2RlKSB7CiAgICBQcm9jZWR1cmUgcHJvY2VkdXJlID0gbm9kZS5wcm9jZWR1cmU7CiAgICBDbGFzcyBjbGFzc05vZGUgPSBwcm9jZWR1cmUuZW5jbG9zaW5nQ2xhc3M7CiAgICBpZiAoY2xhc3NOb2RlICE9IG51bGwpIHsKICAgICAgcmVzdWx0LmFkZChuYW1lRm9yRW50aXR5KAogICAgICAgICAgY2xhc3NOb2RlLAogICAgICAgICAgY2xhc3NOb2RlLm5hbWUsCiAgICAgICAgICBjbGFzc05vZGUuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmksCiAgICAgICAgICBjbGFzc05vZGUuZW5jbG9zaW5nTGlicmFyeS5maWxlVXJpKSk7CiAgICAgIHJlc3VsdC5hZGQoIi4iKTsKICAgIH0KICAgIHJlc3VsdC5hZGQocHJvY2VkdXJlLm5hbWUubmFtZSk7CiAgfQoKICB2b2lkIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudChQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IG5vZGUpIHsKICAgIG5vZGUudGVhck9mZkNvbnN0YW50LmFjY2VwdCh0aGlzKTsKICAgIGlmIChub2RlLnR5cGVzLmlzTm90RW1wdHkpIHsKICAgICAgcmVzdWx0LmFkZCgiPCIpOwogICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICAgZm9yIChEYXJ0VHlwZSB0eXBlQXJnIGluIG5vZGUudHlwZXMpIHsKICAgICAgICBpZiAoIWZpcnN0KSByZXN1bHQuYWRkKCIsICIpOwogICAgICAgIHR5cGVBcmcuYWNjZXB0KHRoaXMpOwogICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmVzdWx0LmFkZCgiPiIpOwogICAgfQogIH0KCiAgdm9pZCB2aXNpdFR5cGVMaXRlcmFsQ29uc3RhbnQoVHlwZUxpdGVyYWxDb25zdGFudCBub2RlKSB7CiAgICBub2RlLnR5cGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnQoVW5ldmFsdWF0ZWRDb25zdGFudCBub2RlKSB7CiAgICB1bnN1cHBvcnRlZCgncHJpbnRpbmcgdW5ldmFsdWF0ZWQgY29uc3RhbnRzJywgLTEsIG51bGwpOwogIH0KfQoKZmluYWwgVXJpIHVua25vd25VcmkgPSBVcmkucGFyc2UoInVua25vd24iKTsKCmNsYXNzIExhYmVsZWROb2RlIHsKICBmaW5hbCBUcmVlTm9kZSBub2RlOwogIGZpbmFsIFR5cGVMYWJlbGVyIHR5cGVMYWJlbGVyOwogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIFVyaSBpbXBvcnRVcmk7CiAgZmluYWwgVXJpIGZpbGVVcmk7CgogIExhYmVsZWROb2RlKAogICAgICB0aGlzLm5vZGUsIHRoaXMubmFtZSwgdGhpcy5pbXBvcnRVcmksIHRoaXMuZmlsZVVyaSwgdGhpcy50eXBlTGFiZWxlcik7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIExpc3Q8TGFiZWxlZE5vZGU+IGVudGl0eUZvck5hbWUgPSB0eXBlTGFiZWxlci5uYW1lTWFwW25hbWVdOwogICAgaWYgKGVudGl0eUZvck5hbWUubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIG5hbWU7CiAgICB9CiAgICByZXR1cm4gIiRuYW1lLyoke2VudGl0eUZvck5hbWUuaW5kZXhPZih0aGlzKSArIDF9Ki8iOwogIH0KCiAgU3RyaW5nIGdldCBvcmlnaW5NZXNzYWdlIHsKICAgIGlmIChpbXBvcnRVcmkuc2NoZW1lID09ICdkYXJ0JyAmJiBpbXBvcnRVcmkucGF0aCA9PSAnY29yZScpIHsKICAgICAgaWYgKG5vZGUgaXMgQ2xhc3MgJiYgYmxhY2tsaXN0ZWRDb3JlQ2xhc3Nlcy5jb250YWlucyhuYW1lKSkgewogICAgICAgIC8vIEJsYWNrbGlzdGVkIGNvcmUgY2xhc3MuIE9ubHkgcHJpbnQgaWYgYW1iaWd1b3VzLgogICAgICAgIExpc3Q8TGFiZWxlZE5vZGU+IGVudGl0eUZvck5hbWUgPSB0eXBlTGFiZWxlci5uYW1lTWFwW25hbWVdOwogICAgICAgIGlmIChlbnRpdHlGb3JOYW1lLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoaW1wb3J0VXJpID09IHVua25vd25VcmkgfHwgbm9kZSBpcyEgQ2xhc3MpIHsKICAgICAgLy8gV2UgZG9uJ3Qga25vdyB3aGVyZSBpdCBjb21lcyBmcm9tIGFuZC9vciBpdCdzIG5vdCBhIGNsYXNzLgogICAgICAvLyBPbmx5IHByaW50IGlmIGFtYmlndW91cy4KICAgICAgTGlzdDxMYWJlbGVkTm9kZT4gZW50aXR5Rm9yTmFtZSA9IHR5cGVMYWJlbGVyLm5hbWVNYXBbbmFtZV07CiAgICAgIGlmIChlbnRpdHlGb3JOYW1lLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgcmV0dXJuICIiOwogICAgICB9CiAgICB9CiAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoaW1wb3J0VXJpID09IGZpbGVVcmkgfHwgaW1wb3J0VXJpLnNjaGVtZSA9PSAnZGFydCcpCiAgICAgICAgPyB0ZW1wbGF0ZVR5cGVPcmlnaW4ud2l0aEFyZ3VtZW50cyh0b1N0cmluZygpLCBpbXBvcnRVcmkpCiAgICAgICAgOiB0ZW1wbGF0ZVR5cGVPcmlnaW5XaXRoRmlsZVVyaS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICB0b1N0cmluZygpLCBpbXBvcnRVcmksIGZpbGVVcmkpOwogICAgcmV0dXJuICJcbiAtICIgKyBtZXNzYWdlLm1lc3NhZ2U7CiAgfQp9CoGUAE5OPAEhASEJFhQPEhoSGBUPFhUaFRcRFhUWJhMVGBgZEhUdFxsdEgFMAUIBHUUBLAFORk9ITC1KARcBG0tHTypPLBEXEwQBH0tHTzJPNBEbEwQBTUweMCYqBiAEAU4oREFFBhIEAR1EOSExGUUXIhMNOSorIAoIPhlFFx8TBgQBKS0BLFEgBAEqUB8EASwbBAEmGAQBOCYzHgZPRicBHhgdTEwEAS4iHSoXGTkmIElLESMkCggXBhUXPCQxFQZKPRcUMDARJjMXCBcGK0IXFD4mMzgXCBcGFQQBMCYeExguLikXGTUmHhcIFwYEASkBLhYEAS4WBAEsFgQBMhYEATIWBAEyKQQBNkgWFzEkJCU2FQYVBAEuFSQWFy4kHRUGFQQBLBUkFhcuJB0VBhUEASwVHxYhFhczJB4YIBUGFQQBNCowHSAVGjAwFwYlBAFOJyEXGS0mHhcIFwYEATwcBAE8PQQCAS0BFBchFRcVAQ9NARZBJRMGOgQBHUJEPEUpFQoIBjVEIkMnEwgGS0I3LSYEAgE0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC90eXBlX2xhYmVsZXIuZGFydC9zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvY3Jhc2guZGFydI3sLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuY3Jhc2g7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cganNvbkVuY29kZTsKCmltcG9ydCAnZGFydDppbycKICAgIHNob3cgQ29udGVudFR5cGUsIEh0dHBDbGllbnQsIEh0dHBDbGllbnRSZXF1ZXN0LCBTb2NrZXRFeGNlcHRpb24sIHN0ZGVycjsKCmltcG9ydCAncHJvYmxlbXMuZGFydCcgc2hvdyBEZWJ1Z0Fib3J0OwoKY29uc3QgU3RyaW5nIGRlZmF1bHRTZXJ2ZXJBZGRyZXNzID0gImh0dHA6Ly8xMjcuMC4wLjE6NTk0MTAvIjsKCi8vLyBUcmFja3MgaWYgdGhlcmUgaGFzIGJlZW4gYSBjcmFzaCByZXBvcnRlZCB0aHJvdWdoIFtyZXBvcnRDcmFzaF0uIFNob3VsZCBiZQovLy8gcmVzZXQgYmV0d2VlbiBlYWNoIGNvbXBpbGF0aW9uIGJ5IGNhbGxpbmcgW3Jlc2V0Q3Jhc2hSZXBvcnRpbmddLgpib29sIGhhc0NyYXNoZWQgPSBmYWxzZTsKCi8vLyBUcmFja3MgdGhlIGZpcnN0IHNvdXJjZSBVUkkgdGhhdCBoYXMgYmVlbiByZWFkIGFuZCBpcyB1c2VkIGFzIGEgZmFsbC1iYWNrCi8vLyBmb3IgW3JlcG9ydENyYXNoXS4gU2hvdWxkIGJlIHJlc2V0IGJldHdlZW4gZWFjaCBjb21waWxhdGlvbiBieSBjYWxsaW5nCi8vLyBbcmVzZXRDcmFzaFJlcG9ydGluZ10uClVyaSBmaXJzdFNvdXJjZVVyaTsKCmNsYXNzIENyYXNoIHsKICBmaW5hbCBVcmkgdXJpOwoKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKCiAgZmluYWwgT2JqZWN0IGVycm9yOwoKICBmaW5hbCBTdGFja1RyYWNlIHRyYWNlOwoKICBDcmFzaCh0aGlzLnVyaSwgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmVycm9yLCB0aGlzLnRyYWNlKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICIiIgpDcmFzaCB3aGVuIGNvbXBpbGluZyAkdXJpLAphdCBjaGFyYWN0ZXIgb2Zmc2V0ICRjaGFyT2Zmc2V0OgokZXJyb3Ike3RyYWNlID09IG51bGwgPyAnJyA6ICdcbiR0cmFjZSd9CiIiIjsKICB9Cn0KCnZvaWQgcmVzZXRDcmFzaFJlcG9ydGluZygpIHsKICBmaXJzdFNvdXJjZVVyaSA9IG51bGw7CiAgaGFzQ3Jhc2hlZCA9IGZhbHNlOwp9CgpGdXR1cmU8VD4gcmVwb3J0Q3Jhc2g8VD4oZXJyb3IsIFN0YWNrVHJhY2UgdHJhY2UsCiAgICBbVXJpIHVyaSwgaW50IGNoYXJPZmZzZXRdKSBhc3luYyB7CiAgbm90ZShTdHJpbmcgbm90ZSkgYXN5bmMgewogICAgc3RkZXJyLndyaXRlKG5vdGUpOwogICAgYXdhaXQgc3RkZXJyLmZsdXNoKCk7CiAgfQoKICBpZiAoaGFzQ3Jhc2hlZCkgcmV0dXJuIG5ldyBGdXR1cmU8VD4uZXJyb3IoZXJyb3IsIHRyYWNlKTsKICBpZiAoZXJyb3IgaXMgQ3Jhc2gpIHsKICAgIHRyYWNlID0gZXJyb3IudHJhY2UgPz8gdHJhY2U7CiAgICB1cmkgPSBlcnJvci51cmkgPz8gdXJpOwogICAgY2hhck9mZnNldCA9IGVycm9yLmNoYXJPZmZzZXQgPz8gY2hhck9mZnNldDsKICAgIGVycm9yID0gZXJyb3IuZXJyb3I7CiAgfQogIHVyaSA/Pz0gZmlyc3RTb3VyY2VVcmk7CiAgaGFzQ3Jhc2hlZCA9IHRydWU7CiAgTWFwPFN0cmluZywgZHluYW1pYz4gZGF0YSA9IDxTdHJpbmcsIGR5bmFtaWM+e307CiAgZGF0YVsidHlwZSJdID0gImNyYXNoIjsKICBkYXRhWyJjbGllbnQiXSA9ICJwYWNrYWdlOmZhc3RhIjsKICBpZiAodXJpICE9IG51bGwpIGRhdGFbInVyaSJdID0gIiR1cmkiOwogIGlmIChjaGFyT2Zmc2V0ICE9IG51bGwpIGRhdGFbIm9mZnNldCJdID0gY2hhck9mZnNldDsKICBkYXRhWyJlcnJvciJdID0gc2FmZVRvU3RyaW5nKGVycm9yKTsKICBkYXRhWyJ0cmFjZSJdID0gIiR0cmFjZSI7CiAgU3RyaW5nIGpzb24gPSBqc29uRW5jb2RlKGRhdGEpOwogIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKICB0cnkgewogICAgVXJpIHNlcnZlclVyaSA9IFVyaS5wYXJzZShkZWZhdWx0U2VydmVyQWRkcmVzcyk7CiAgICBIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0OwogICAgdHJ5IHsKICAgICAgcmVxdWVzdCA9IGF3YWl0IGNsaWVudC5wb3N0VXJsKHNlcnZlclVyaSk7CiAgICB9IG9uIFNvY2tldEV4Y2VwdGlvbiB7CiAgICAgIC8vIEFzc3VtZSB0aGUgY3Jhc2ggbG9nZ2VyIGlzbid0IHJ1bm5pbmcuCiAgICAgIGNsaWVudC5jbG9zZShmb3JjZTogdHJ1ZSk7CiAgICAgIHJldHVybiBuZXcgRnV0dXJlPFQ+LmVycm9yKAogICAgICAgICAgbmV3IENyYXNoKHVyaSwgY2hhck9mZnNldCwgZXJyb3IsIHRyYWNlKSwgdHJhY2UpOwogICAgfQogICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgewogICAgICBhd2FpdCBub3RlKCJcblNlbmRpbmcgY3Jhc2ggcmVwb3J0IGRhdGEiKTsKICAgICAgcmVxdWVzdC5wZXJzaXN0ZW50Q29ubmVjdGlvbiA9IGZhbHNlOwogICAgICByZXF1ZXN0LmJ1ZmZlck91dHB1dCA9IGZhbHNlOwogICAgICBTdHJpbmcgaG9zdCA9IHJlcXVlc3Q/LmNvbm5lY3Rpb25JbmZvPy5yZW1vdGVBZGRyZXNzPy5ob3N0OwogICAgICBpbnQgcG9ydCA9IHJlcXVlc3Q/LmNvbm5lY3Rpb25JbmZvPy5yZW1vdGVQb3J0OwogICAgICBhd2FpdCBub3RlKCIgdG8gJGhvc3Q6JHBvcnQiKTsKICAgICAgYXdhaXQgcmVxdWVzdAogICAgICAgIC4uaGVhZGVycy5jb250ZW50VHlwZSA9IENvbnRlbnRUeXBlLmpzb24KICAgICAgICAuLndyaXRlKGpzb24pOwogICAgICBhd2FpdCByZXF1ZXN0LmNsb3NlKCk7CiAgICAgIGF3YWl0IG5vdGUoIi4iKTsKICAgIH0KICB9IGNhdGNoIChlLCBzKSB7CiAgICBhd2FpdCBub3RlKCJcbiR7c2FmZVRvU3RyaW5nKGUpfVxuJHNcbiIpOwogICAgYXdhaXQgbm90ZSgiXG5cblxuRkU6OkVSUk9SOjokanNvblxuXG5cbiIpOwogIH0KICBjbGllbnQuY2xvc2UoZm9yY2U6IHRydWUpOwogIGF3YWl0IG5vdGUoIlxuIik7CiAgcmV0dXJuIG5ldyBGdXR1cmU8VD4uZXJyb3IoZXJyb3IsIHRyYWNlKTsKfQoKU3RyaW5nIHNhZmVUb1N0cmluZyhPYmplY3Qgb2JqZWN0KSB7CiAgdHJ5IHsKICAgIHJldHVybiAiJG9iamVjdCI7CiAgfSBjYXRjaCAoZSkgewogICAgcmV0dXJuICJFcnJvciB3aGVuIGNvbnZlcnRpbmcgJHtvYmplY3QucnVudGltZVR5cGV9IHRvIHN0cmluZy4iOwogIH0KfQoKRnV0dXJlPFQ+IHdpdGhDcmFzaFJlcG9ydGluZzxUPigKICAgIEZ1dHVyZTxUPiBGdW5jdGlvbigpIGFjdGlvbiwgVXJpIEZ1bmN0aW9uKCkgY3VycmVudFVyaSkgYXN5bmMgewogIHJlc2V0Q3Jhc2hSZXBvcnRpbmcoKTsKICB0cnkgewogICAgcmV0dXJuIGF3YWl0IGFjdGlvbigpOwogIH0gb24gQ3Jhc2ggewogICAgcmV0aHJvdzsKICB9IG9uIERlYnVnQWJvcnQgewogICAgcmV0aHJvdzsKICB9IGNhdGNoIChlLCBzKSB7CiAgICByZXR1cm4gcmVwb3J0Q3Jhc2goZSwgcywgY3VycmVudFVyaSgpKTsKICB9Cn0KgIQATk48ARUBIQEnARFOASgBPwFPRRkBTksbFAEOEQEYARYBGgE8ARYPGyEpBQQCAR0ZFgIBMiccGBoEATwYIhwxGQQaFTMaJCk3JxwiKAg1HwoxGzAhIjwGGzEsJEI2JRQxFx0XBhMuMAQdFCwCASUIFhBFBAIBIUQZCBsPDRQNEywEAgEmcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2NyYXNoLmRhcnQ6c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2RpbGwvZGlsbF90YXJnZXQuZGFydIejLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZGlsbF90YXJnZXQ7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBMaWJyYXJ5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0JyBzaG93IFRhcmdldDsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnIHNob3cgQ2xhc3NCdWlsZGVyOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuc3VwcG9ydGVkOwoKaW1wb3J0ICcuLi90YXJnZXRfaW1wbGVtZW50YXRpb24uZGFydCcgc2hvdyBUYXJnZXRJbXBsZW1lbnRhdGlvbjsKCmltcG9ydCAnLi4vdGlja2VyLmRhcnQnIHNob3cgVGlja2VyOwoKaW1wb3J0ICcuLi91cmlfdHJhbnNsYXRvci5kYXJ0JyBzaG93IFVyaVRyYW5zbGF0b3I7CgppbXBvcnQgJ2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgRGlsbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdkaWxsX2xvYWRlci5kYXJ0JyBzaG93IERpbGxMb2FkZXI7CgpjbGFzcyBEaWxsVGFyZ2V0IGV4dGVuZHMgVGFyZ2V0SW1wbGVtZW50YXRpb24gewogIGZpbmFsIE1hcDxVcmksIERpbGxMaWJyYXJ5QnVpbGRlcj4gbGlicmFyeUJ1aWxkZXJzID0KICAgICAgPFVyaSwgRGlsbExpYnJhcnlCdWlsZGVyPnt9OwoKICBib29sIGlzTG9hZGVkID0gZmFsc2U7CgogIERpbGxMb2FkZXIgbG9hZGVyOwoKICBEaWxsVGFyZ2V0KFRpY2tlciB0aWNrZXIsIFVyaVRyYW5zbGF0b3IgdXJpVHJhbnNsYXRvciwgVGFyZ2V0IGJhY2tlbmRUYXJnZXQpCiAgICAgIDogc3VwZXIodGlja2VyLCB1cmlUcmFuc2xhdG9yLCBiYWNrZW5kVGFyZ2V0KSB7CiAgICBsb2FkZXIgPSBuZXcgRGlsbExvYWRlcih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkU291cmNlSW5mb3JtYXRpb24oCiAgICAgIFVyaSBpbXBvcnRVcmksIFVyaSBmaWxlVXJpLCBMaXN0PGludD4gbGluZVN0YXJ0cywgTGlzdDxpbnQ+IHNvdXJjZUNvZGUpIHsKICAgIHVuc3VwcG9ydGVkKCJhZGRTb3VyY2VJbmZvcm1hdGlvbiIsIC0xLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxOdWxsPiBidWlsZENvbXBvbmVudCgpIHsKICAgIHJldHVybiBuZXcgRnV0dXJlPE51bGw+LnN5bmMoKCkgPT4gdW5zdXBwb3J0ZWQoImJ1aWxkQ29tcG9uZW50IiwgLTEsIG51bGwpKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxOdWxsPiBidWlsZE91dGxpbmVzKCkgYXN5bmMgewogICAgaWYgKGxvYWRlci5saWJyYXJpZXMuaXNOb3RFbXB0eSkgewogICAgICBhd2FpdCBsb2FkZXIuYnVpbGRPdXRsaW5lcygpOwogICAgICBsb2FkZXIuZmluYWxpemVFeHBvcnRzKCk7CiAgICB9CiAgICBpc0xvYWRlZCA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBEaWxsTGlicmFyeUJ1aWxkZXIgY3JlYXRlTGlicmFyeUJ1aWxkZXIoVXJpIHVyaSwgVXJpIGZpbGVVcmksIG9yaWdpbikgewogICAgYXNzZXJ0KG9yaWdpbiA9PSBudWxsKTsKICAgIHJldHVybiBsaWJyYXJ5QnVpbGRlcnMucmVtb3ZlKHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJyZWFrQ3ljbGUoQ2xhc3NCdWlsZGVyIGNscykge30KCiAgdm9pZCBhZGRMaWJyYXJ5KExpYnJhcnkgbGlicmFyeSkgewogICAgbGlicmFyeUJ1aWxkZXJzW2xpYnJhcnkuaW1wb3J0VXJpXSA9CiAgICAgICAgbmV3IERpbGxMaWJyYXJ5QnVpbGRlcihsaWJyYXJ5LCBsb2FkZXIpOwogIH0KfQpLAE5OPAEbASEBLwE5AToBLAFCASUBNAE8ASsBMDcjARkBFQFPNiMEAQwdUDMEAQwiUQQBDCcnJCAGFQQBDEocKAQBDCcBJSkxBAIBMXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfdGFyZ2V0LmRhcnQ+c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfdGFyZ2V0LmRhcnTAAH5OLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEua2VybmVsX3RhcmdldDsKCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEFyZ3VtZW50cywKICAgICAgICBDYW5vbmljYWxOYW1lLAogICAgICAgIENsYXNzLAogICAgICAgIENvbXBvbmVudCwKICAgICAgICBDb25zdHJ1Y3RvciwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBFbXB0eVN0YXRlbWVudCwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZpZWxkLAogICAgICAgIEZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgRnVuY3Rpb25Ob2RlLAogICAgICAgIEluaXRpYWxpemVyLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgSW52YWxpZEluaXRpYWxpemVyLAogICAgICAgIExpYnJhcnksCiAgICAgICAgTmFtZSwKICAgICAgICBOYW1lZEV4cHJlc3Npb24sCiAgICAgICAgTnVsbExpdGVyYWwsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIsCiAgICAgICAgU291cmNlLAogICAgICAgIFN1cGVySW5pdGlhbGl6ZXIsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uLAogICAgICAgIFZhcmlhYmxlR2V0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbG9uZS5kYXJ0JyBzaG93IENsb25lVmlzaXRvcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIHNob3cgc3Vic3RpdHV0ZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCcgc2hvdyBEaWFnbm9zdGljUmVwb3J0ZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgc2hvdyBUeXBlRW52aXJvbm1lbnQ7CgppbXBvcnQgJy4uLy4uL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydCcgc2hvdyBGaWxlU3lzdGVtOwoKaW1wb3J0ICcuLi9jb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKaW1wb3J0ICcuLi9jcmFzaC5kYXJ0JyBzaG93IHdpdGhDcmFzaFJlcG9ydGluZzsKCmltcG9ydCAnLi4vZGlsbC9kaWxsX3RhcmdldC5kYXJ0JyBzaG93IERpbGxUYXJnZXQ7CgppbXBvcnQgJy4uL2RpbGwvZGlsbF9tZW1iZXJfYnVpbGRlci5kYXJ0JyBzaG93IERpbGxNZW1iZXJCdWlsZGVyOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IE1lc3NhZ2UsIExvY2F0ZWRNZXNzYWdlOwoKaW1wb3J0ICcuLi9sb2FkZXIuZGFydCcgc2hvdyBMb2FkZXI7CgppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnCiAgICBzaG93CiAgICAgICAgRm9ybWF0dGVkTWVzc2FnZSwKICAgICAgICBtZXNzYWdlQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGQsCiAgICAgICAgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkQ2F1c2UsCiAgICAgICAgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JSZWRpcmVjdGlvblRvTm9uQ29uc3QsCiAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgdGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWQsCiAgICAgICAgdGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yLAogICAgICAgIHRlbXBsYXRlSW5mZXJyZWRQYWNrYWdlVXJpLAogICAgICAgIHRlbXBsYXRlTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2UsCiAgICAgICAgdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3I7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5oYW5kbGVkOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JyBzaG93IEFtYmlndW91c0J1aWxkZXI7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUNsYXNzQnVpbGRlcjsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9sb2FkZXIuZGFydCcgc2hvdyBTb3VyY2VMb2FkZXI7CgppbXBvcnQgJy4uL3RhcmdldF9pbXBsZW1lbnRhdGlvbi5kYXJ0JyBzaG93IFRhcmdldEltcGxlbWVudGF0aW9uOwoKaW1wb3J0ICcuLi91cmlfdHJhbnNsYXRvci5kYXJ0JyBzaG93IFVyaVRyYW5zbGF0b3I7CgppbXBvcnQgJ2NvbnN0YW50X2V2YWx1YXRvci5kYXJ0JyBhcyBjb25zdGFudHMgc2hvdyB0cmFuc2Zvcm1MaWJyYXJpZXM7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3NCdWlsZGVyLAogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIEludmFsaWRUeXBlQnVpbGRlciwKICAgICAgICBLZXJuZWxGaWVsZEJ1aWxkZXIsCiAgICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTmFtZWRUeXBlQnVpbGRlciwKICAgICAgICBQcm9jZWR1cmVCdWlsZGVyLAogICAgICAgIExpYnJhcnlCdWlsZGVyLAogICAgICAgIFR5cGVCdWlsZGVyLAogICAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXI7CgppbXBvcnQgJ2tlcm5lbF9jb25zdGFudHMuZGFydCcgc2hvdyBLZXJuZWxDb25zdGFudEVycm9yUmVwb3J0ZXI7CgppbXBvcnQgJ21ldGFkYXRhX2NvbGxlY3Rvci5kYXJ0JyBzaG93IE1ldGFkYXRhQ29sbGVjdG9yOwoKaW1wb3J0ICd2ZXJpZmllci5kYXJ0JyBzaG93IHZlcmlmeUNvbXBvbmVudDsKCmNsYXNzIEtlcm5lbFRhcmdldCBleHRlbmRzIFRhcmdldEltcGxlbWVudGF0aW9uIHsKICAvLy8gVGhlIFtGaWxlU3lzdGVtXSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBhY2Nlc3MgZmlsZXMuCiAgZmluYWwgRmlsZVN5c3RlbSBmaWxlU3lzdGVtOwoKICAvLy8gV2hldGhlciBjb21tZW50cyBzaG91bGQgYmUgc2Nhbm5lZCBhbmQgcGFyc2VkLgogIGZpbmFsIGJvb2wgaW5jbHVkZUNvbW1lbnRzOwoKICBmaW5hbCBEaWxsVGFyZ2V0IGRpbGxUYXJnZXQ7CgogIC8vLyBUaGUgW01ldGFkYXRhQ29sbGVjdG9yXSB0byB3cml0ZSBtZXRhZGF0YSB0by4KICBmaW5hbCBNZXRhZGF0YUNvbGxlY3RvciBtZXRhZGF0YUNvbGxlY3RvcjsKCiAgU291cmNlTG9hZGVyIGxvYWRlcjsKCiAgQ29tcG9uZW50IGNvbXBvbmVudDsKCiAgZmluYWwgVHlwZUJ1aWxkZXIgZHluYW1pY1R5cGUgPSBuZXcgTmFtZWRUeXBlQnVpbGRlcigiZHluYW1pYyIsIG51bGwpOwoKICBmaW5hbCBOYW1lZFR5cGVCdWlsZGVyIG9iamVjdFR5cGUgPSBuZXcgTmFtZWRUeXBlQnVpbGRlcigiT2JqZWN0IiwgbnVsbCk7CgogIGZpbmFsIFR5cGVCdWlsZGVyIGJvdHRvbVR5cGUgPSBuZXcgTmFtZWRUeXBlQnVpbGRlcigiTnVsbCIsIG51bGwpOwoKICBib29sIGdldCBsZWdhY3lNb2RlID0+IGJhY2tlbmRUYXJnZXQubGVnYWN5TW9kZTsKCiAgZmluYWwgYm9vbCBleGNsdWRlU291cmNlID0gIUNvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMuZW1iZWRTb3VyY2VUZXh0OwoKICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50RGVmaW5lcyA9CiAgICAgIENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMuZW52aXJvbm1lbnREZWZpbmVzOwoKICBmaW5hbCBib29sIGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50ID0KICAgICAgQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQub3B0aW9ucy5lcnJvck9uVW5ldmFsdWF0ZWRDb25zdGFudDsKCiAgZmluYWwgTGlzdDxPYmplY3Q+IGNsb25lZEZvcm1hbHMgPSA8T2JqZWN0PltdOwoKICBLZXJuZWxUYXJnZXQodGhpcy5maWxlU3lzdGVtLCB0aGlzLmluY2x1ZGVDb21tZW50cywgRGlsbFRhcmdldCBkaWxsVGFyZ2V0LAogICAgICBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IsCiAgICAgIHtNZXRhZGF0YUNvbGxlY3RvciBtZXRhZGF0YUNvbGxlY3Rvcn0pCiAgICAgIDogZGlsbFRhcmdldCA9IGRpbGxUYXJnZXQsCiAgICAgICAgbWV0YWRhdGFDb2xsZWN0b3IgPSBtZXRhZGF0YUNvbGxlY3RvciwKICAgICAgICBzdXBlcihkaWxsVGFyZ2V0LnRpY2tlciwgdXJpVHJhbnNsYXRvciwgZGlsbFRhcmdldC5iYWNrZW5kVGFyZ2V0KSB7CiAgICBsb2FkZXIgPSBjcmVhdGVMb2FkZXIoKTsKICB9CgogIFNvdXJjZUxvYWRlciBjcmVhdGVMb2FkZXIoKSA9PgogICAgICBuZXcgU291cmNlTG9hZGVyKGZpbGVTeXN0ZW0sIGluY2x1ZGVDb21tZW50cywgdGhpcyk7CgogIHZvaWQgYWRkU291cmNlSW5mb3JtYXRpb24oCiAgICAgIFVyaSBpbXBvcnRVcmksIFVyaSBmaWxlVXJpLCBMaXN0PGludD4gbGluZVN0YXJ0cywgTGlzdDxpbnQ+IHNvdXJjZUNvZGUpIHsKICAgIHVyaVRvU291cmNlW2ZpbGVVcmldID0KICAgICAgICBuZXcgU291cmNlKGxpbmVTdGFydHMsIHNvdXJjZUNvZGUsIGltcG9ydFVyaSwgZmlsZVVyaSk7CiAgfQoKICAvLy8gUmV0dXJuIGxpc3Qgb2Ygc2FtZSBzaXplIGFzIGlucHV0IHdpdGggcG9zc2libHkgdHJhbnNsYXRlZCB1cmlzLgogIExpc3Q8VXJpPiBzZXRFbnRyeVBvaW50cyhMaXN0PFVyaT4gZW50cnlQb2ludHMpIHsKICAgIE1hcDxTdHJpbmcsIFVyaT4gcGFja2FnZXNNYXA7CiAgICBMaXN0PFVyaT4gcmVzdWx0ID0gbmV3IExpc3Q8VXJpPigpOwogICAgZm9yIChVcmkgZW50cnlQb2ludCBpbiBlbnRyeVBvaW50cykgewogICAgICBTdHJpbmcgc2NoZW1lID0gZW50cnlQb2ludC5zY2hlbWU7CiAgICAgIFVyaSBmaWxlVXJpOwogICAgICBzd2l0Y2ggKHNjaGVtZSkgewogICAgICAgIGNhc2UgInBhY2thZ2UiOgogICAgICAgIGNhc2UgImRhcnQiOgogICAgICAgIGNhc2UgImRhdGEiOgogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIC8vIEF0dGVtcHQgdG8gcmV2ZXJzZS1sb29rdXAgW2VudHJ5UG9pbnRdIGluIHBhY2thZ2UgY29uZmlnLgogICAgICAgICAgU3RyaW5nIGFzU3RyaW5nID0gIiRlbnRyeVBvaW50IjsKICAgICAgICAgIHBhY2thZ2VzTWFwID8/PSB1cmlUcmFuc2xhdG9yLnBhY2thZ2VzLmFzTWFwKCk7CiAgICAgICAgICBmb3IgKFN0cmluZyBwYWNrYWdlTmFtZSBpbiBwYWNrYWdlc01hcC5rZXlzKSB7CiAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAiJHtwYWNrYWdlc01hcFtwYWNrYWdlTmFtZV19IjsKICAgICAgICAgICAgaWYgKGFzU3RyaW5nLnN0YXJ0c1dpdGgocHJlZml4KSkgewogICAgICAgICAgICAgIFVyaSByZXZlcnNlZCA9IFVyaS5wYXJzZSgKICAgICAgICAgICAgICAgICAgInBhY2thZ2U6JHBhY2thZ2VOYW1lLyR7YXNTdHJpbmcuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpfSIpOwogICAgICAgICAgICAgIGlmIChlbnRyeVBvaW50ID09IHVyaVRyYW5zbGF0b3IudHJhbnNsYXRlKHJldmVyc2VkKSkgewogICAgICAgICAgICAgICAgbG9hZGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVJbmZlcnJlZFBhY2thZ2VVcmkud2l0aEFyZ3VtZW50cyhyZXZlcnNlZCksCiAgICAgICAgICAgICAgICAgICAgLTEsCiAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICBlbnRyeVBvaW50KTsKICAgICAgICAgICAgICAgIGZpbGVVcmkgPSBlbnRyeVBvaW50OwogICAgICAgICAgICAgICAgZW50cnlQb2ludCA9IHJldmVyc2VkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgcmVzdWx0LmFkZChlbnRyeVBvaW50KTsKICAgICAgbG9hZGVyLnJlYWQoZW50cnlQb2ludCwgLTEsIGFjY2Vzc29yOiBsb2FkZXIuZmlyc3QsIGZpbGVVcmk6IGZpbGVVcmkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIExpYnJhcnlCdWlsZGVyIGNyZWF0ZUxpYnJhcnlCdWlsZGVyKAogICAgICBVcmkgdXJpLCBVcmkgZmlsZVVyaSwgS2VybmVsTGlicmFyeUJ1aWxkZXIgb3JpZ2luKSB7CiAgICBpZiAoZGlsbFRhcmdldC5pc0xvYWRlZCkgewogICAgICB2YXIgYnVpbGRlciA9IGRpbGxUYXJnZXQubG9hZGVyLmJ1aWxkZXJzW3VyaV07CiAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gYnVpbGRlcjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBLZXJuZWxMaWJyYXJ5QnVpbGRlcih1cmksIGZpbGVVcmksIGxvYWRlciwgb3JpZ2luKTsKICB9CgogIC8vLyBSZXR1cm5zIGNsYXNzZXMgZGVmaW5lZCBpbiBsaWJyYXJpZXMgaW4gW2xvYWRlcl0uCiAgTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IGNvbGxlY3RNeUNsYXNzZXMoKSB7CiAgICBMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gcmVzdWx0ID0gPFNvdXJjZUNsYXNzQnVpbGRlcj5bXTsKICAgIGxvYWRlci5idWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSBsb2FkZXIpIHsKICAgICAgICBJdGVyYXRvcjxEZWNsYXJhdGlvbj4gaXRlcmF0b3IgPSBsaWJyYXJ5Lml0ZXJhdG9yOwogICAgICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgICAgICBEZWNsYXJhdGlvbiBtZW1iZXIgPSBpdGVyYXRvci5jdXJyZW50OwogICAgICAgICAgaWYgKG1lbWJlciBpcyBTb3VyY2VDbGFzc0J1aWxkZXIgJiYgIW1lbWJlci5pc1BhdGNoKSB7CiAgICAgICAgICAgIHJlc3VsdC5hZGQobWVtYmVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgYnJlYWtDeWNsZShDbGFzc0J1aWxkZXIgYnVpbGRlcikgewogICAgQ2xhc3MgY2xzID0gYnVpbGRlci50YXJnZXQ7CiAgICBjbHMuaW1wbGVtZW50ZWRUeXBlcy5jbGVhcigpOwogICAgY2xzLnN1cGVydHlwZSA9IG51bGw7CiAgICBjbHMubWl4ZWRJblR5cGUgPSBudWxsOwogICAgYnVpbGRlci5zdXBlcnR5cGUgPSBuZXcgTmFtZWRUeXBlQnVpbGRlcigiT2JqZWN0IiwgbnVsbCkKICAgICAgLi5iaW5kKG9iamVjdENsYXNzQnVpbGRlcik7CiAgICBidWlsZGVyLmludGVyZmFjZXMgPSBudWxsOwogICAgYnVpbGRlci5taXhlZEluVHlwZSA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBGdXR1cmU8Q29tcG9uZW50PiBidWlsZE91dGxpbmVzKHtDYW5vbmljYWxOYW1lIG5hbWVSb290fSkgYXN5bmMgewogICAgaWYgKGxvYWRlci5maXJzdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiB3aXRoQ3Jhc2hSZXBvcnRpbmc8Q29tcG9uZW50PigoKSBhc3luYyB7CiAgICAgIGxvYWRlci5jcmVhdGVUeXBlSW5mZXJlbmNlRW5naW5lKCk7CiAgICAgIGF3YWl0IGxvYWRlci5idWlsZE91dGxpbmVzKCk7CiAgICAgIGxvYWRlci5jb3JlTGlicmFyeS5iZWNvbWVDb3JlTGlicmFyeSgpOwogICAgICBkeW5hbWljVHlwZS5iaW5kKGxvYWRlci5jb3JlTGlicmFyeS5nZXRMb2NhbE1lbWJlcigiZHluYW1pYyIpKTsKICAgICAgbG9hZGVyLnJlc29sdmVQYXJ0cygpOwogICAgICBsb2FkZXIuY29tcHV0ZUxpYnJhcnlTY29wZXMoKTsKICAgICAgb2JqZWN0VHlwZS5iaW5kKGxvYWRlci5jb3JlTGlicmFyeS5nZXRMb2NhbE1lbWJlcigiT2JqZWN0IikpOwogICAgICBib3R0b21UeXBlLmJpbmQobG9hZGVyLmNvcmVMaWJyYXJ5LmdldExvY2FsTWVtYmVyKCJOdWxsIikpOwogICAgICBsb2FkZXIucmVzb2x2ZVR5cGVzKCk7CiAgICAgIGxvYWRlci5jb21wdXRlRGVmYXVsdFR5cGVzKGR5bmFtaWNUeXBlLCBib3R0b21UeXBlLCBvYmplY3RDbGFzc0J1aWxkZXIpOwogICAgICBMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gbXlDbGFzc2VzID0KICAgICAgICAgIGxvYWRlci5jaGVja1NlbWFudGljcyhvYmplY3RDbGFzc0J1aWxkZXIpOwogICAgICBsb2FkZXIuZmluaXNoVHlwZVZhcmlhYmxlcyhvYmplY3RDbGFzc0J1aWxkZXIsIGR5bmFtaWNUeXBlKTsKICAgICAgbG9hZGVyLmJ1aWxkQ29tcG9uZW50KCk7CiAgICAgIGxvYWRlci5maW5hbGl6ZUluaXRpYWxpemluZ0Zvcm1hbHMoKTsKICAgICAgaW5zdGFsbERlZmF1bHRTdXBlcnR5cGVzKCk7CiAgICAgIGluc3RhbGxTeW50aGV0aWNDb25zdHJ1Y3RvcnMobXlDbGFzc2VzKTsKICAgICAgbG9hZGVyLnJlc29sdmVDb25zdHJ1Y3RvcnMoKTsKICAgICAgY29tcG9uZW50ID0KICAgICAgICAgIGxpbmsobmV3IExpc3Q8TGlicmFyeT4uZnJvbShsb2FkZXIubGlicmFyaWVzKSwgbmFtZVJvb3Q6IG5hbWVSb290KTsKICAgICAgY29tcHV0ZUNvcmVUeXBlcygpOwogICAgICBsb2FkZXIuYnVpbGRDbGFzc0hpZXJhcmNoeShteUNsYXNzZXMsIG9iamVjdENsYXNzQnVpbGRlcik7CiAgICAgIGxvYWRlci5jb21wdXRlSGllcmFyY2h5KCk7CiAgICAgIGxvYWRlci5wZXJmb3JtVG9wTGV2ZWxJbmZlcmVuY2UobXlDbGFzc2VzKTsKICAgICAgbG9hZGVyLmNoZWNrU3VwZXJ0eXBlcyhteUNsYXNzZXMpOwogICAgICBsb2FkZXIuY2hlY2tCb3VuZHMoKTsKICAgICAgbG9hZGVyLmNoZWNrT3ZlcnJpZGVzKG15Q2xhc3Nlcyk7CiAgICAgIGxvYWRlci5jaGVja0Fic3RyYWN0TWVtYmVycyhteUNsYXNzZXMpOwogICAgICBsb2FkZXIuY2hlY2tSZWRpcmVjdGluZ0ZhY3RvcmllcyhteUNsYXNzZXMpOwogICAgICBsb2FkZXIuYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVycyhteUNsYXNzZXMpOwogICAgICBsb2FkZXIuY2hlY2tNaXhpbnMobXlDbGFzc2VzKTsKICAgICAgbG9hZGVyLmJ1aWxkT3V0bGluZUV4cHJlc3Npb25zKCk7CiAgICAgIGluc3RhbGxBbGxDb21wb25lbnRQcm9ibGVtcyhsb2FkZXIuYWxsQ29tcG9uZW50UHJvYmxlbXMpOwogICAgICBsb2FkZXIuYWxsQ29tcG9uZW50UHJvYmxlbXMuY2xlYXIoKTsKICAgICAgcmV0dXJuIGNvbXBvbmVudDsKICAgIH0sICgpID0+IGxvYWRlcj8uY3VycmVudFVyaUZvckNyYXNoUmVwb3J0aW5nKTsKICB9CgogIC8vLyBCdWlsZCB0aGUga2VybmVsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb21wb25lbnQgbG9hZGVkIGJ5IHRoaXMKICAvLy8gdGFyZ2V0LiBUaGUgY29tcG9uZW50IHdpbGwgY29udGFpbiBmdWxsIGJvZGllcyBmb3IgdGhlIGNvZGUgbG9hZGVkIGZyb20KICAvLy8gc291cmNlcywgYW5kIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgY29kZSBsb2FkZWQgYnkgdGhlIFtEaWxsVGFyZ2V0XSwKICAvLy8gd2hpY2ggbWF5IG9yIG1heSBub3QgaW5jbHVkZSBtZXRob2QgYm9kaWVzIChkZXBlbmRpbmcgb24gd2hhdCB3YXMgbG9hZGVkCiAgLy8vIGludG8gdGhhdCB0YXJnZXQsIGFuIG91dGxpbmUgb3IgYSBmdWxsIGtlcm5lbCBjb21wb25lbnQpLgogIC8vLwogIC8vLyBJZiBbdmVyaWZ5XSwgcnVuIHRoZSBkZWZhdWx0IGtlcm5lbCB2ZXJpZmljYXRpb24gb24gdGhlIHJlc3VsdGluZwogIC8vLyBjb21wb25lbnQuCiAgQG92ZXJyaWRlCiAgRnV0dXJlPENvbXBvbmVudD4gYnVpbGRDb21wb25lbnQoe2Jvb2wgdmVyaWZ5OiBmYWxzZX0pIGFzeW5jIHsKICAgIGlmIChsb2FkZXIuZmlyc3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gd2l0aENyYXNoUmVwb3J0aW5nPENvbXBvbmVudD4oKCkgYXN5bmMgewogICAgICB0aWNrZXIubG9nTXMoIkJ1aWxkaW5nIGNvbXBvbmVudCIpOwogICAgICBhd2FpdCBsb2FkZXIuYnVpbGRCb2RpZXMoKTsKICAgICAgZmluaXNoQ2xvbmVkUGFyYW1ldGVycygpOwogICAgICBsb2FkZXIuZmluaXNoRGVmZXJyZWRMb2FkVGVhcm9mZnMoKTsKICAgICAgbG9hZGVyLmZpbmlzaE5vU3VjaE1ldGhvZEZvcndhcmRlcnMoKTsKICAgICAgTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IG15Q2xhc3NlcyA9IGNvbGxlY3RNeUNsYXNzZXMoKTsKICAgICAgbG9hZGVyLmZpbmlzaE5hdGl2ZU1ldGhvZHMoKTsKICAgICAgbG9hZGVyLmZpbmlzaFBhdGNoTWV0aG9kcygpOwogICAgICBmaW5pc2hBbGxDb25zdHJ1Y3RvcnMobXlDbGFzc2VzKTsKICAgICAgcnVuQnVpbGRUcmFuc2Zvcm1hdGlvbnMoKTsKCiAgICAgIGlmICh2ZXJpZnkpIHRoaXMudmVyaWZ5KCk7CiAgICAgIGluc3RhbGxBbGxDb21wb25lbnRQcm9ibGVtcyhsb2FkZXIuYWxsQ29tcG9uZW50UHJvYmxlbXMpOwogICAgICByZXR1cm4gY29tcG9uZW50OwogICAgfSwgKCkgPT4gbG9hZGVyPy5jdXJyZW50VXJpRm9yQ3Jhc2hSZXBvcnRpbmcpOwogIH0KCiAgdm9pZCBpbnN0YWxsQWxsQ29tcG9uZW50UHJvYmxlbXMoCiAgICAgIExpc3Q8Rm9ybWF0dGVkTWVzc2FnZT4gYWxsQ29tcG9uZW50UHJvYmxlbXMpIHsKICAgIGlmIChhbGxDb21wb25lbnRQcm9ibGVtcy5pc05vdEVtcHR5KSB7CiAgICAgIGNvbXBvbmVudC5wcm9ibGVtc0FzSnNvbiA/Pz0gPFN0cmluZz5bXTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsQ29tcG9uZW50UHJvYmxlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgRm9ybWF0dGVkTWVzc2FnZSBmb3JtYXR0ZWRNZXNzYWdlID0gYWxsQ29tcG9uZW50UHJvYmxlbXNbaV07CiAgICAgIGNvbXBvbmVudC5wcm9ibGVtc0FzSnNvbi5hZGQoZm9ybWF0dGVkTWVzc2FnZS50b0pzb25TdHJpbmcoKSk7CiAgICB9CiAgfQoKICAvLy8gQ3JlYXRlcyBhIGNvbXBvbmVudCBieSBjb21iaW5pbmcgW2xpYnJhcmllc10gd2l0aCB0aGUgbGlicmFyaWVzIG9mCiAgLy8vIGBkaWxsVGFyZ2V0LmxvYWRlci5jb21wb25lbnRgLgogIENvbXBvbmVudCBsaW5rKExpc3Q8TGlicmFyeT4gbGlicmFyaWVzLCB7Q2Fub25pY2FsTmFtZSBuYW1lUm9vdH0pIHsKICAgIGxpYnJhcmllcy5hZGRBbGwoZGlsbFRhcmdldC5sb2FkZXIubGlicmFyaWVzKTsKCiAgICBNYXA8VXJpLCBTb3VyY2U+IHVyaVRvU291cmNlID0gbmV3IE1hcDxVcmksIFNvdXJjZT4oKTsKICAgIHZvaWQgY29weVNvdXJjZShVcmkgdXJpLCBTb3VyY2Ugc291cmNlKSB7CiAgICAgIHVyaVRvU291cmNlW3VyaV0gPSBleGNsdWRlU291cmNlCiAgICAgICAgICA/IG5ldyBTb3VyY2Uoc291cmNlLmxpbmVTdGFydHMsIGNvbnN0IDxpbnQ+W10sIHNvdXJjZS5pbXBvcnRVcmksCiAgICAgICAgICAgICAgc291cmNlLmZpbGVVcmkpCiAgICAgICAgICA6IHNvdXJjZTsKICAgIH0KCiAgICB0aGlzLnVyaVRvU291cmNlLmZvckVhY2goY29weVNvdXJjZSk7CgogICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IGJhY2tlbmRUYXJnZXQuY29uZmlndXJlQ29tcG9uZW50KG5ldyBDb21wb25lbnQoCiAgICAgICAgbmFtZVJvb3Q6IG5hbWVSb290LCBsaWJyYXJpZXM6IGxpYnJhcmllcywgdXJpVG9Tb3VyY2U6IHVyaVRvU291cmNlKSk7CiAgICBpZiAobG9hZGVyLmZpcnN0ICE9IG51bGwpIHsKICAgICAgLy8gVE9ETyhzaWdtdW5kKTogZG8gb25seSBmb3IgZnVsbCBwcm9ncmFtCiAgICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0KICAgICAgICAgIGxvYWRlci5maXJzdC5leHBvcnRTY29wZS5sb29rdXAoIm1haW4iLCAtMSwgbnVsbCk7CiAgICAgIGlmIChkZWNsYXJhdGlvbiBpcyBBbWJpZ3VvdXNCdWlsZGVyKSB7CiAgICAgICAgQW1iaWd1b3VzQnVpbGRlciBwcm9ibGVtID0gZGVjbGFyYXRpb247CiAgICAgICAgZGVjbGFyYXRpb24gPSBwcm9ibGVtLmdldEZpcnN0RGVjbGFyYXRpb24oKTsKICAgICAgfQogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgUHJvY2VkdXJlQnVpbGRlcikgewogICAgICAgIGNvbXBvbmVudC5tYWluTWV0aG9kID0gZGVjbGFyYXRpb24ucHJvY2VkdXJlOwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIERpbGxNZW1iZXJCdWlsZGVyKSB7CiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLm1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgICAgIGNvbXBvbmVudC5tYWluTWV0aG9kID0gZGVjbGFyYXRpb24ubWVtYmVyOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChtZXRhZGF0YUNvbGxlY3RvciAhPSBudWxsKSB7CiAgICAgIGNvbXBvbmVudC5hZGRNZXRhZGF0YVJlcG9zaXRvcnkobWV0YWRhdGFDb2xsZWN0b3IucmVwb3NpdG9yeSk7CiAgICB9CgogICAgdGlja2VyLmxvZ01zKCJMaW5rZWQgY29tcG9uZW50Iik7CiAgICByZXR1cm4gY29tcG9uZW50OwogIH0KCiAgdm9pZCBpbnN0YWxsRGVmYXVsdFN1cGVydHlwZXMoKSB7CiAgICBDbGFzcyBvYmplY3RDbGFzcyA9IHRoaXMub2JqZWN0Q2xhc3M7CiAgICBsb2FkZXIuYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gbG9hZGVyKSB7CiAgICAgICAgSXRlcmF0b3I8RGVjbGFyYXRpb24+IGl0ZXJhdG9yID0gbGlicmFyeS5pdGVyYXRvcjsKICAgICAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBpdGVyYXRvci5jdXJyZW50OwogICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIFNvdXJjZUNsYXNzQnVpbGRlcikgewogICAgICAgICAgICBDbGFzcyBjbHMgPSBkZWNsYXJhdGlvbi50YXJnZXQ7CiAgICAgICAgICAgIGlmIChjbHMgIT0gb2JqZWN0Q2xhc3MpIHsKICAgICAgICAgICAgICBjbHMuc3VwZXJ0eXBlID8/PSBvYmplY3RDbGFzcy5hc1Jhd1N1cGVydHlwZTsKICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5zdXBlcnR5cGUgPz89IG5ldyBOYW1lZFR5cGVCdWlsZGVyKCJPYmplY3QiLCBudWxsKQogICAgICAgICAgICAgICAgLi5iaW5kKG9iamVjdENsYXNzQnVpbGRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmlzTWl4aW5BcHBsaWNhdGlvbikgewogICAgICAgICAgICAgIGNscy5taXhlZEluVHlwZSA9IGRlY2xhcmF0aW9uLm1peGVkSW5UeXBlLmJ1aWxkTWl4ZWRJblR5cGUoCiAgICAgICAgICAgICAgICAgIGxpYnJhcnksIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQsIGRlY2xhcmF0aW9uLmZpbGVVcmkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIHRpY2tlci5sb2dNcygiSW5zdGFsbGVkIE9iamVjdCBhcyBpbXBsaWNpdCBzdXBlcmNsYXNzIik7CiAgfQoKICB2b2lkIGluc3RhbGxTeW50aGV0aWNDb25zdHJ1Y3RvcnMoTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IGJ1aWxkZXJzKSB7CiAgICBDbGFzcyBvYmplY3RDbGFzcyA9IHRoaXMub2JqZWN0Q2xhc3M7CiAgICBmb3IgKFNvdXJjZUNsYXNzQnVpbGRlciBidWlsZGVyIGluIGJ1aWxkZXJzKSB7CiAgICAgIGlmIChidWlsZGVyLnRhcmdldCAhPSBvYmplY3RDbGFzcyAmJiAhYnVpbGRlci5pc1BhdGNoKSB7CiAgICAgICAgaWYgKGJ1aWxkZXIuaXNQYXRjaCB8fAogICAgICAgICAgICBidWlsZGVyLmlzTWl4aW5EZWNsYXJhdGlvbiB8fAogICAgICAgICAgICBidWlsZGVyLmlzRXh0ZW5zaW9uKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGJ1aWxkZXIuaXNNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgICBpbnN0YWxsRm9yd2FyZGluZ0NvbnN0cnVjdG9ycyhidWlsZGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5zdGFsbERlZmF1bHRDb25zdHJ1Y3RvcihidWlsZGVyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRpY2tlci5sb2dNcygiSW5zdGFsbGVkIHN5bnRoZXRpYyBjb25zdHJ1Y3RvcnMiKTsKICB9CgogIENsYXNzQnVpbGRlciBnZXQgb2JqZWN0Q2xhc3NCdWlsZGVyID0+IG9iamVjdFR5cGUuZGVjbGFyYXRpb247CgogIENsYXNzIGdldCBvYmplY3RDbGFzcyA9PiBvYmplY3RDbGFzc0J1aWxkZXIuY2xzOwoKICAvLy8gSWYgW2J1aWxkZXJdIGRvZXNuJ3QgaGF2ZSBhIGNvbnN0cnVjdG9ycywgaW5zdGFsbCB0aGUgZGVmYXVsdHMuCiAgdm9pZCBpbnN0YWxsRGVmYXVsdENvbnN0cnVjdG9yKFNvdXJjZUNsYXNzQnVpbGRlciBidWlsZGVyKSB7CiAgICBhc3NlcnQoIWJ1aWxkZXIuaXNNaXhpbkFwcGxpY2F0aW9uKTsKICAgIGFzc2VydCghYnVpbGRlci5pc0V4dGVuc2lvbik7CiAgICAvLyBUT0RPKGFza2VzYyk6IE1ha2UgdGhpcyBjaGVjayBsaWdodC13ZWlnaHQgaW4gdGhlIGFic2VuY2Ugb2YgcGF0Y2hlcy4KICAgIGlmIChidWlsZGVyLnRhcmdldC5jb25zdHJ1Y3RvcnMuaXNOb3RFbXB0eSkgcmV0dXJuOwogICAgaWYgKGJ1aWxkZXIudGFyZ2V0LnJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycy5pc05vdEVtcHR5KSByZXR1cm47CiAgICBmb3IgKFByb2NlZHVyZSBwcm9jIGluIGJ1aWxkZXIudGFyZ2V0LnByb2NlZHVyZXMpIHsKICAgICAgaWYgKHByb2MuaXNGYWN0b3J5KSByZXR1cm47CiAgICB9CgogICAgLy8vIEZyb20gW0RhcnQgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgNHRoIEVkaXRpb25dKAogICAgLy8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FQ01BLTQwOC5wZGYpOgogICAgLy8vID5JZmYgbm8gY29uc3RydWN0b3IgaXMgc3BlY2lmaWVkIGZvciBhIGNsYXNzIEMsIGl0IGltcGxpY2l0bHkgaGFzIGEKICAgIC8vLyA+ZGVmYXVsdCBjb25zdHJ1Y3RvciBDKCkgOiBzdXBlcigpIHt9LCB1bmxlc3MgQyBpcyBjbGFzcyBPYmplY3QuCiAgICAvLyBUaGUgc3VwZXJpbml0aWFsaXplciBpcyBpbnN0YWxsZWQgYmVsb3cgaW4gW2ZpbmlzaENvbnN0cnVjdG9yc10uCiAgICBidWlsZGVyLmFkZFN5bnRoZXRpY0NvbnN0cnVjdG9yKG1ha2VEZWZhdWx0Q29uc3RydWN0b3IoYnVpbGRlci50YXJnZXQpKTsKICB9CgogIHZvaWQgaW5zdGFsbEZvcndhcmRpbmdDb25zdHJ1Y3RvcnMoU291cmNlQ2xhc3NCdWlsZGVyIGJ1aWxkZXIpIHsKICAgIGFzc2VydChidWlsZGVyLmlzTWl4aW5BcHBsaWNhdGlvbik7CiAgICBpZiAoYnVpbGRlci5saWJyYXJ5LmxvYWRlciAhPSBsb2FkZXIpIHJldHVybjsKICAgIGlmIChidWlsZGVyLnRhcmdldC5jb25zdHJ1Y3RvcnMuaXNOb3RFbXB0eSkgewogICAgICAvLyBUaGVzZSB3ZXJlIGluc3RhbGxlZCBieSBhIHN1YmNsYXNzIGluIHRoZSByZWN1cnNpdmUgY2FsbCBiZWxvdy4KICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vLyBGcm9tIFtEYXJ0IFByb2dyYW1taW5nIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDR0aCBFZGl0aW9uXSgKICAgIC8vLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL2ZpbGVzL0VDTUEtU1QvRUNNQS00MDgucGRmKToKICAgIC8vLyA+QSBtaXhpbiBhcHBsaWNhdGlvbiBvZiB0aGUgZm9ybSBTIHdpdGggTTsgZGVmaW5lcyBhIGNsYXNzIEMgd2l0aAogICAgLy8vID5zdXBlcmNsYXNzIFMuCiAgICAvLy8gPi4uLgoKICAgIC8vLyA+TGV0IExNIGJlIHRoZSBsaWJyYXJ5IGluIHdoaWNoIE0gaXMgZGVjbGFyZWQuIEZvciBlYWNoIGdlbmVyYXRpdmUKICAgIC8vLyA+Y29uc3RydWN0b3IgbmFtZWQgcWkoVGkxIGFpMSwgLiAuIC4gLCBUaWtpIGFpa2kpLCBpIGluIDEuLm4gb2YgUwogICAgLy8vID50aGF0IGlzIGFjY2Vzc2libGUgdG8gTE0gLCBDIGhhcyBhbiBpbXBsaWNpdGx5IGRlY2xhcmVkIGNvbnN0cnVjdG9yCiAgICAvLy8gPm5hbWVkIHEnaSA9IFtDL1NdcWkgb2YgdGhlIGZvcm0gcSdpKGFpMSwuLi4sYWlraSkgOgogICAgLy8vID5zdXBlcihhaTEsLi4uLGFpa2kpOy4KICAgIFR5cGVCdWlsZGVyIHR5cGUgPSBidWlsZGVyLnN1cGVydHlwZTsKICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgc3VwZXJ0eXBlOwogICAgaWYgKHR5cGUgaXMgTmFtZWRUeXBlQnVpbGRlcikgewogICAgICBzdXBlcnR5cGUgPSB0eXBlLmRlY2xhcmF0aW9uOwogICAgfSBlbHNlIHsKICAgICAgdW5oYW5kbGVkKCIke3R5cGUucnVudGltZVR5cGV9IiwgImluc3RhbGxGb3J3YXJkaW5nQ29uc3RydWN0b3JzIiwKICAgICAgICAgIGJ1aWxkZXIuY2hhck9mZnNldCwgYnVpbGRlci5maWxlVXJpKTsKICAgIH0KICAgIGlmIChzdXBlcnR5cGUuaXNNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgIGluc3RhbGxGb3J3YXJkaW5nQ29uc3RydWN0b3JzKHN1cGVydHlwZSk7CiAgICB9CiAgICBpZiAoc3VwZXJ0eXBlIGlzIENsYXNzQnVpbGRlcikgewogICAgICBpZiAoc3VwZXJ0eXBlLmNscy5jb25zdHJ1Y3RvcnMuaXNFbXB0eSkgewogICAgICAgIGJ1aWxkZXIuYWRkU3ludGhldGljQ29uc3RydWN0b3IobWFrZURlZmF1bHRDb25zdHJ1Y3RvcihidWlsZGVyLnRhcmdldCkpOwogICAgICB9IGVsc2UgewogICAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uTWFwID0KICAgICAgICAgICAgYnVpbGRlci5nZXRTdWJzdGl0dXRpb25NYXAoc3VwZXJ0eXBlLnRhcmdldCk7CiAgICAgICAgZm9yIChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciBpbiBzdXBlcnR5cGUuY2xzLmNvbnN0cnVjdG9ycykgewogICAgICAgICAgYnVpbGRlci5hZGRTeW50aGV0aWNDb25zdHJ1Y3RvcihtYWtlTWl4aW5BcHBsaWNhdGlvbkNvbnN0cnVjdG9yKAogICAgICAgICAgICAgIGJ1aWxkZXIudGFyZ2V0LCBidWlsZGVyLmNscy5taXhpbiwgY29uc3RydWN0b3IsIHN1YnN0aXR1dGlvbk1hcCkpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChzdXBlcnR5cGUgaXMgSW52YWxpZFR5cGVCdWlsZGVyKSB7CiAgICAgIGJ1aWxkZXIuYWRkU3ludGhldGljQ29uc3RydWN0b3IobWFrZURlZmF1bHRDb25zdHJ1Y3RvcihidWlsZGVyLnRhcmdldCkpOwogICAgfSBlbHNlIHsKICAgICAgdW5oYW5kbGVkKCIke3N1cGVydHlwZS5ydW50aW1lVHlwZX0iLCAiaW5zdGFsbEZvcndhcmRpbmdDb25zdHJ1Y3RvcnMiLAogICAgICAgICAgYnVpbGRlci5jaGFyT2Zmc2V0LCBidWlsZGVyLmZpbGVVcmkpOwogICAgfQogIH0KCiAgQ29uc3RydWN0b3IgbWFrZU1peGluQXBwbGljYXRpb25Db25zdHJ1Y3RvcihDbGFzcyBjbHMsIENsYXNzIG1peGluLAogICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBzdWJzdGl0dXRpb25NYXApIHsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gY29weUZvcm1hbChWYXJpYWJsZURlY2xhcmF0aW9uIGZvcm1hbCkgewogICAgICAvLyBUT0RPKGFoZSk6IEhhbmRsZSBpbml0aWFsaXplcnMuCiAgICAgIHZhciBjb3B5ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24oZm9ybWFsLm5hbWUsCiAgICAgICAgICBpc0ZpbmFsOiBmb3JtYWwuaXNGaW5hbCwgaXNDb25zdDogZm9ybWFsLmlzQ29uc3QpOwogICAgICBpZiAoZm9ybWFsLnR5cGUgIT0gbnVsbCkgewogICAgICAgIGNvcHkudHlwZSA9IHN1YnN0aXR1dGUoZm9ybWFsLnR5cGUsIHN1YnN0aXR1dGlvbk1hcCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvcHk7CiAgICB9CgogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsUGFyYW1ldGVycyA9IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdOwogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBuYW1lZFBhcmFtZXRlcnMgPSA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gcG9zaXRpb25hbCA9IDxFeHByZXNzaW9uPltdOwogICAgTGlzdDxOYW1lZEV4cHJlc3Npb24+IG5hbWVkID0gPE5hbWVkRXhwcmVzc2lvbj5bXTsKICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBmb3JtYWwKICAgICAgICBpbiBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycy5hZGQoY29weUZvcm1hbChmb3JtYWwpKTsKICAgICAgcG9zaXRpb25hbC5hZGQobmV3IFZhcmlhYmxlR2V0KHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxhc3QpKTsKICAgIH0KICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBmb3JtYWwgaW4gY29uc3RydWN0b3IuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gY2xvbmUgPSBjb3B5Rm9ybWFsKGZvcm1hbCk7CiAgICAgIGNsb25lZEZvcm1hbHMuLmFkZChmb3JtYWwpLi5hZGQoY2xvbmUpLi5hZGQoc3Vic3RpdHV0aW9uTWFwKTsKICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZChjbG9uZSk7CiAgICAgIG5hbWVkLmFkZChuZXcgTmFtZWRFeHByZXNzaW9uKAogICAgICAgICAgZm9ybWFsLm5hbWUsIG5ldyBWYXJpYWJsZUdldChuYW1lZFBhcmFtZXRlcnMubGFzdCkpKTsKICAgIH0KICAgIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiA9IG5ldyBGdW5jdGlvbk5vZGUobmV3IEVtcHR5U3RhdGVtZW50KCksCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IGNvbnN0cnVjdG9yLmZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgcmV0dXJuVHlwZTogbWFrZUNvbnN0cnVjdG9yUmV0dXJuVHlwZShjbHMpKTsKICAgIFN1cGVySW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSBuZXcgU3VwZXJJbml0aWFsaXplcigKICAgICAgICBjb25zdHJ1Y3RvciwgbmV3IEFyZ3VtZW50cyhwb3NpdGlvbmFsLCBuYW1lZDogbmFtZWQpKTsKICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IoZnVuY3Rpb24sCiAgICAgICAgbmFtZTogY29uc3RydWN0b3IubmFtZSwKICAgICAgICBpbml0aWFsaXplcnM6IDxJbml0aWFsaXplcj5baW5pdGlhbGl6ZXJdLAogICAgICAgIGlzU3ludGhldGljOiB0cnVlLAogICAgICAgIGlzQ29uc3Q6IGNvbnN0cnVjdG9yLmlzQ29uc3QgJiYgbWl4aW4uZmllbGRzLmlzRW1wdHkpOwogIH0KCiAgdm9pZCBmaW5pc2hDbG9uZWRQYXJhbWV0ZXJzKCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbG9uZWRGb3JtYWxzLmxlbmd0aDsgaSArPSAzKSB7CiAgICAgIC8vIE5vdGUgdGhhdCBbb3JpZ2luYWxdIG1heSBpdHNlbGYgYmUgY2xvbmUuIElmIHNvLCBpdCB3YXMgYWRkZWQgdG8KICAgICAgLy8gW2Nsb25lZEZvcm1hbHNdIGJlZm9yZSBbY2xvbmVdLCBzbyBpdCdzIGluaXRpYWxpemVycyBhcmUgYWxyZWFkeSBpbgogICAgICAvLyBwbGFjZS4KICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBvcmlnaW5hbCA9IGNsb25lZEZvcm1hbHNbaV07CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gY2xvbmUgPSBjbG9uZWRGb3JtYWxzW2kgKyAxXTsKICAgICAgaWYgKG9yaWdpbmFsLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICAvLyBUT0RPKGFoZSk6IEl0IGlzIHVuY2xlYXIgaWYgaXQgaXMgbGVnYWwgdG8gdXNlIHR5cGUgdmFyaWFibGVzIGluCiAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZXMsIGJ1dCBGYXN0YSBpcyBjdXJyZW50bHkgYWxsb3dpbmcgaXQsIGFuZCB0aGUgVk0KICAgICAgICAvLyBhY2NlcHRzIGl0LiBJZiBpdCBpc24ndCBsZWdhbCwgdGhlIHdlIGNhbiBzcGVlZCB0aGlzIHVwIGJ5IHVzaW5nIGEKICAgICAgICAvLyBzaW5nbGUgY2xvbmVyIHdpdGhvdXQgc3Vic3RpdHV0aW9uLgogICAgICAgIENsb25lVmlzaXRvciBjbG9uZXIgPQogICAgICAgICAgICBuZXcgQ2xvbmVWaXNpdG9yKHR5cGVTdWJzdGl0dXRpb246IGNsb25lZEZvcm1hbHNbaSArIDJdKTsKICAgICAgICBjbG9uZS5pbml0aWFsaXplciA9IGNsb25lci5jbG9uZShvcmlnaW5hbC5pbml0aWFsaXplcikuLnBhcmVudCA9IGNsb25lOwogICAgICB9CiAgICB9CiAgICBjbG9uZWRGb3JtYWxzLmNsZWFyKCk7CiAgICB0aWNrZXIubG9nTXMoIkNsb25lZCBkZWZhdWx0IHZhbHVlcyBvZiBmb3JtYWxzIik7CiAgfQoKICBDb25zdHJ1Y3RvciBtYWtlRGVmYXVsdENvbnN0cnVjdG9yKENsYXNzIGVuY2xvc2luZ0NsYXNzKSB7CiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKAogICAgICAgIG5ldyBGdW5jdGlvbk5vZGUobmV3IEVtcHR5U3RhdGVtZW50KCksCiAgICAgICAgICAgIHJldHVyblR5cGU6IG1ha2VDb25zdHJ1Y3RvclJldHVyblR5cGUoZW5jbG9zaW5nQ2xhc3MpKSwKICAgICAgICBuYW1lOiBuZXcgTmFtZSgiIiksCiAgICAgICAgaXNTeW50aGV0aWM6IHRydWUpOwogIH0KCiAgRGFydFR5cGUgbWFrZUNvbnN0cnVjdG9yUmV0dXJuVHlwZShDbGFzcyBlbmNsb3NpbmdDbGFzcykgewogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZVBhcmFtZXRlclR5cGVzID0gbmV3IExpc3Q8RGFydFR5cGU+KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICB0eXBlUGFyYW1ldGVyVHlwZXMuYWRkKG5ldyBUeXBlUGFyYW1ldGVyVHlwZSh0eXBlUGFyYW1ldGVyKSk7CiAgICB9CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoZW5jbG9zaW5nQ2xhc3MsIHR5cGVQYXJhbWV0ZXJUeXBlcyk7CiAgfQoKICB2b2lkIGNvbXB1dGVDb3JlVHlwZXMoKSB7CiAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcyA9IDxMaWJyYXJ5PltdOwogICAgZm9yIChTdHJpbmcgcGxhdGZvcm1MaWJyYXJ5IGluIGNvbnN0IFsKICAgICAgImRhcnQ6X2ludGVybmFsIiwKICAgICAgImRhcnQ6YXN5bmMiLAogICAgICAvLyBUT0RPKGFza2VzYyk6IFdoZW4gYWxsIGJhY2tlbmRzIHN1cHBvcnQgc2V0IGxpdGVyYWxzLCB3ZSBubyBsb25nZXIKICAgICAgLy8gbmVlZCB0byBpbmRleCBkYXJ0OmNvbGxlY3Rpb24sIGFzIGl0IGlzIG9ubHkgbmVlZGVkIGZvciBkZXN1Z2FyaW5nIG9mCiAgICAgIC8vIGNvbnN0IHNldHMuIFdlIGNhbiByZW1vdmUgaXQgZnJvbSB0aGlzIGxpc3QgYXQgdGhhdCB0aW1lLgogICAgICAiZGFydDpjb2xsZWN0aW9uIiwKICAgICAgImRhcnQ6Y29yZSIsCiAgICAgICJkYXJ0Om1pcnJvcnMiCiAgICBdKSB7CiAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UocGxhdGZvcm1MaWJyYXJ5KTsKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGxvYWRlci5idWlsZGVyc1t1cmldOwogICAgICBpZiAobGlicmFyeSA9PSBudWxsKSB7CiAgICAgICAgLy8gVE9ETyhhaGUpOiBUaGlzIGlzIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIGtlcm5lbF9kcml2ZXJfdGVzdCBvcgogICAgICAgIC8vIGtlcm5lbF9kcml2ZXIuCiAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgICAgIGZvciAoTGlicmFyeSB0YXJnZXQgaW4gZGlsbFRhcmdldC5sb2FkZXIubGlicmFyaWVzKSB7CiAgICAgICAgICBpZiAodGFyZ2V0LmltcG9ydFVyaSA9PSB1cmkpIHsKICAgICAgICAgICAgbGlicmFyaWVzLmFkZCh0YXJnZXQpOwogICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWZvdW5kICYmIHVyaS5wYXRoICE9ICJtaXJyb3JzIikgewogICAgICAgICAgLy8gZGFydDptaXJyb3JzIGlzIG9wdGlvbmFsLgogICAgICAgICAgdGhyb3cgIkNhbid0IGZpbmQgJHVyaSI7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGxpYnJhcmllcy5hZGQobGlicmFyeS50YXJnZXQpOwogICAgICB9CiAgICB9CiAgICBDb21wb25lbnQgcGxhZm9ybUxpYnJhcmllcyA9CiAgICAgICAgYmFja2VuZFRhcmdldC5jb25maWd1cmVDb21wb25lbnQobmV3IENvbXBvbmVudCgpKTsKICAgIC8vIEFkZCBsaWJyYXJpZXMgZGlyZWN0bHkgdG8gcHJldmVudCB0aGF0IHRoZWlyIHBhcmVudHMgYXJlIGNoYW5nZWQuCiAgICBwbGFmb3JtTGlicmFyaWVzLmxpYnJhcmllcy5hZGRBbGwobGlicmFyaWVzKTsKICAgIGxvYWRlci5jb21wdXRlQ29yZVR5cGVzKHBsYWZvcm1MaWJyYXJpZXMpOwogIH0KCiAgdm9pZCBmaW5pc2hBbGxDb25zdHJ1Y3RvcnMoTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IGJ1aWxkZXJzKSB7CiAgICBDbGFzcyBvYmplY3RDbGFzcyA9IHRoaXMub2JqZWN0Q2xhc3M7CiAgICBmb3IgKFNvdXJjZUNsYXNzQnVpbGRlciBidWlsZGVyIGluIGJ1aWxkZXJzKSB7CiAgICAgIENsYXNzIGNscyA9IGJ1aWxkZXIudGFyZ2V0OwogICAgICBpZiAoY2xzICE9IG9iamVjdENsYXNzKSB7CiAgICAgICAgZmluaXNoQ29uc3RydWN0b3JzKGJ1aWxkZXIpOwogICAgICB9CiAgICB9CiAgICB0aWNrZXIubG9nTXMoIkZpbmlzaGVkIGNvbnN0cnVjdG9ycyIpOwogIH0KCiAgLy8vIEVuc3VyZSBjb25zdHJ1Y3RvcnMgb2YgW2Nsc10gaGF2ZSB0aGUgY29ycmVjdCBpbml0aWFsaXplcnMgYW5kIG90aGVyCiAgLy8vIHJlcXVpcmVtZW50cy4KICB2b2lkIGZpbmlzaENvbnN0cnVjdG9ycyhTb3VyY2VDbGFzc0J1aWxkZXIgYnVpbGRlcikgewogICAgaWYgKGJ1aWxkZXIuaXNQYXRjaCkgcmV0dXJuOwogICAgQ2xhc3MgY2xzID0gYnVpbGRlci50YXJnZXQ7CgogICAgLy8vIFF1b3RlcyBiZWxvdyBhcmUgZnJvbSBbRGFydCBQcm9ncmFtbWluZyBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCA0dGgKICAgIC8vLyBFZGl0aW9uXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL2ZpbGVzL0VDTUEtU1QvRUNNQS00MDgucGRmKToKICAgIExpc3Q8RmllbGQ+IHVuaW5pdGlhbGl6ZWRGaWVsZHMgPSA8RmllbGQ+W107CiAgICBMaXN0PEZpZWxkPiBub25GaW5hbEZpZWxkcyA9IDxGaWVsZD5bXTsKICAgIGZvciAoRmllbGQgZmllbGQgaW4gY2xzLmZpZWxkcykgewogICAgICBpZiAoZmllbGQuaXNJbnN0YW5jZU1lbWJlciAmJiAhZmllbGQuaXNGaW5hbCkgewogICAgICAgIG5vbkZpbmFsRmllbGRzLmFkZChmaWVsZCk7CiAgICAgIH0KICAgICAgaWYgKGZpZWxkLmluaXRpYWxpemVyID09IG51bGwpIHsKICAgICAgICB1bmluaXRpYWxpemVkRmllbGRzLmFkZChmaWVsZCk7CiAgICAgIH0KICAgIH0KICAgIE1hcDxDb25zdHJ1Y3RvciwgU2V0PEZpZWxkPj4gY29uc3RydWN0b3JJbml0aWFsaXplZEZpZWxkcyA9CiAgICAgICAgPENvbnN0cnVjdG9yLCBTZXQ8RmllbGQ+Pnt9OwogICAgQ29uc3RydWN0b3Igc3VwZXJUYXJnZXQ7CiAgICBmb3IgKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yIGluIGNscy5jb25zdHJ1Y3RvcnMpIHsKICAgICAgYm9vbCBpc1JlZGlyZWN0aW5nID0gZmFsc2U7CiAgICAgIGZvciAoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgaW4gY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzKSB7CiAgICAgICAgaWYgKGluaXRpYWxpemVyIGlzIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIpIHsKICAgICAgICAgIGlmIChjb25zdHJ1Y3Rvci5pc0NvbnN0ICYmICFpbml0aWFsaXplci50YXJnZXQuaXNDb25zdCkgewogICAgICAgICAgICBidWlsZGVyLmFkZFByb2JsZW0obWVzc2FnZUNvbnN0Q29uc3RydWN0b3JSZWRpcmVjdGlvblRvTm9uQ29uc3QsCiAgICAgICAgICAgICAgICBpbml0aWFsaXplci5maWxlT2Zmc2V0LCBpbml0aWFsaXplci50YXJnZXQubmFtZS5uYW1lLmxlbmd0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBpc1JlZGlyZWN0aW5nID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWlzUmVkaXJlY3RpbmcpIHsKICAgICAgICAvLy8gPklmIG5vIHN1cGVyaW5pdGlhbGl6ZXIgaXMgcHJvdmlkZWQsIGFuIGltcGxpY2l0IHN1cGVyaW5pdGlhbGl6ZXIKICAgICAgICAvLy8gPm9mIHRoZSBmb3JtIHN1cGVyKCkgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiBr4oCZcyBpbml0aWFsaXplciBsaXN0LAogICAgICAgIC8vLyA+dW5sZXNzIHRoZSBlbmNsb3NpbmcgY2xhc3MgaXMgY2xhc3MgT2JqZWN0LgogICAgICAgIGlmIChjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMuaXNFbXB0eSkgewogICAgICAgICAgc3VwZXJUYXJnZXQgPz89IGRlZmF1bHRTdXBlckNvbnN0cnVjdG9yKGNscyk7CiAgICAgICAgICBJbml0aWFsaXplciBpbml0aWFsaXplcjsKICAgICAgICAgIGlmIChzdXBlclRhcmdldCA9PSBudWxsKSB7CiAgICAgICAgICAgIGludCBvZmZzZXQgPSBjb25zdHJ1Y3Rvci5maWxlT2Zmc2V0OwogICAgICAgICAgICBpZiAob2Zmc2V0ID09IC0xICYmIGNvbnN0cnVjdG9yLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgICAgb2Zmc2V0ID0gY2xzLmZpbGVPZmZzZXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnVpbGRlci5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3IKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhjbHMuc3VwZXJjbGFzcy5uYW1lKSwKICAgICAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgICAgIG5vTGVuZ3RoKTsKICAgICAgICAgICAgaW5pdGlhbGl6ZXIgPSBuZXcgSW52YWxpZEluaXRpYWxpemVyKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbml0aWFsaXplciA9CiAgICAgICAgICAgICAgICBuZXcgU3VwZXJJbml0aWFsaXplcihzdXBlclRhcmdldCwgbmV3IEFyZ3VtZW50cy5lbXB0eSgpKQogICAgICAgICAgICAgICAgICAuLmlzU3ludGhldGljID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0cnVjdG9yLmluaXRpYWxpemVycy5hZGQoaW5pdGlhbGl6ZXIpOwogICAgICAgICAgaW5pdGlhbGl6ZXIucGFyZW50ID0gY29uc3RydWN0b3I7CiAgICAgICAgfQogICAgICAgIGlmIChjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5ID09IG51bGwpIHsKICAgICAgICAgIC8vLyA+SWYgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIGMgaXMgbm90IGEgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IKICAgICAgICAgIC8vLyA+YW5kIG5vIGJvZHkgaXMgcHJvdmlkZWQsIHRoZW4gYyBpbXBsaWNpdGx5IGhhcyBhbiBlbXB0eSBib2R5IHt9LgogICAgICAgICAgLy8vIFdlIHVzZSBhbiBlbXB0eSBzdGF0ZW1lbnQgaW5zdGVhZC4KICAgICAgICAgIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLmJvZHkgPSBuZXcgRW1wdHlTdGF0ZW1lbnQoKTsKICAgICAgICAgIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLmJvZHkucGFyZW50ID0gY29uc3RydWN0b3IuZnVuY3Rpb247CiAgICAgICAgfQoKICAgICAgICBTZXQ8RmllbGQ+IG15SW5pdGlhbGl6ZWRGaWVsZHMgPSBuZXcgU2V0PEZpZWxkPigpOwogICAgICAgIGZvciAoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgaW4gY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzKSB7CiAgICAgICAgICBpZiAoaW5pdGlhbGl6ZXIgaXMgRmllbGRJbml0aWFsaXplcikgewogICAgICAgICAgICBteUluaXRpYWxpemVkRmllbGRzLmFkZChpbml0aWFsaXplci5maWVsZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBmb3JtYWwKICAgICAgICAgICAgaW4gY29uc3RydWN0b3IuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMpIHsKICAgICAgICAgIGlmIChmb3JtYWwuaXNGaWVsZEZvcm1hbCkgewogICAgICAgICAgICBEZWNsYXJhdGlvbiBmaWVsZEJ1aWxkZXIgPSBidWlsZGVyLnNjb3BlLmxvY2FsW2Zvcm1hbC5uYW1lXSA/PwogICAgICAgICAgICAgICAgYnVpbGRlci5vcmlnaW4uc2NvcGUubG9jYWxbZm9ybWFsLm5hbWVdOwogICAgICAgICAgICBpZiAoZmllbGRCdWlsZGVyIGlzIEtlcm5lbEZpZWxkQnVpbGRlcikgewogICAgICAgICAgICAgIG15SW5pdGlhbGl6ZWRGaWVsZHMuYWRkKGZpZWxkQnVpbGRlci5maWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3RydWN0b3JJbml0aWFsaXplZEZpZWxkc1tjb25zdHJ1Y3Rvcl0gPSBteUluaXRpYWxpemVkRmllbGRzOwogICAgICAgIGlmIChjb25zdHJ1Y3Rvci5pc0NvbnN0ICYmIG5vbkZpbmFsRmllbGRzLmlzTm90RW1wdHkpIHsKICAgICAgICAgIGJ1aWxkZXIuYWRkUHJvYmxlbShtZXNzYWdlQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGQsCiAgICAgICAgICAgICAgY29uc3RydWN0b3IuZmlsZU9mZnNldCwgbm9MZW5ndGgsCiAgICAgICAgICAgICAgY29udGV4dDogbm9uRmluYWxGaWVsZHMKICAgICAgICAgICAgICAgICAgLm1hcCgoZmllbGQpID0+IG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENhdXNlCiAgICAgICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKGZpZWxkLmZpbGVVcmksIGZpZWxkLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKSkKICAgICAgICAgICAgICAgICAgLnRvTGlzdCgpKTsKICAgICAgICAgIG5vbkZpbmFsRmllbGRzLmNsZWFyKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBTZXQ8RmllbGQ+IGluaXRpYWxpemVkRmllbGRzOwogICAgY29uc3RydWN0b3JJbml0aWFsaXplZEZpZWxkcwogICAgICAgIC5mb3JFYWNoKChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgU2V0PEZpZWxkPiBmaWVsZHMpIHsKICAgICAgaWYgKGluaXRpYWxpemVkRmllbGRzID09IG51bGwpIHsKICAgICAgICBpbml0aWFsaXplZEZpZWxkcyA9IG5ldyBTZXQ8RmllbGQ+LmZyb20oZmllbGRzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbml0aWFsaXplZEZpZWxkcy5hZGRBbGwoZmllbGRzKTsKICAgICAgfQogICAgfSk7CgogICAgLy8gUnVuIHRocm91Z2ggYWxsIGZpZWxkcyB0aGF0IGFyZW4ndCBpbml0aWFsaXplZCBieSBhbnkgY29uc3RydWN0b3IsIGFuZAogICAgLy8gc2V0IHRoZWlyIGluaXRpYWxpemVyIHRvIGBudWxsYC4KICAgIGZvciAoRmllbGQgZmllbGQgaW4gdW5pbml0aWFsaXplZEZpZWxkcykgewogICAgICBpZiAoaW5pdGlhbGl6ZWRGaWVsZHMgPT0gbnVsbCB8fCAhaW5pdGlhbGl6ZWRGaWVsZHMuY29udGFpbnMoZmllbGQpKSB7CiAgICAgICAgZmllbGQuaW5pdGlhbGl6ZXIgPSBuZXcgTnVsbExpdGVyYWwoKS4ucGFyZW50ID0gZmllbGQ7CiAgICAgICAgaWYgKGZpZWxkLmlzRmluYWwgJiYKICAgICAgICAgICAgKGNscy5jb25zdHJ1Y3RvcnMuaXNOb3RFbXB0eSB8fCBjbHMuaXNNaXhpbkRlY2xhcmF0aW9uKSkgewogICAgICAgICAgU3RyaW5nIHVyaSA9ICcke2ZpZWxkLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpfSc7CiAgICAgICAgICBTdHJpbmcgZmlsZSA9IGZpZWxkLmZpbGVVcmkucGF0aFNlZ21lbnRzLmxhc3Q7CiAgICAgICAgICBpZiAodXJpID09ICdkYXJ0Omh0bWwnIHx8CiAgICAgICAgICAgICAgdXJpID09ICdkYXJ0OnN2ZycgfHwKICAgICAgICAgICAgICB1cmkgPT0gJ2RhcnQ6X25hdGl2ZV90eXBlZF9kYXRhJyB8fAogICAgICAgICAgICAgIHVyaSA9PSAnZGFydDpfaW50ZXJjZXB0b3JzJyAmJiBmaWxlID09ICdqc19zdHJpbmcuZGFydCcpIHsKICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIGV4dGVybmFsIGdldHRlcnMgaW5zdGVhZCBvZiBmaW5hbAogICAgICAgICAgICAvLyBmaWVsZHMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzM3NjIKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJ1aWxkZXIubGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgdGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWQud2l0aEFyZ3VtZW50cyhmaWVsZC5uYW1lLm5hbWUpLAogICAgICAgICAgICAgICAgZmllbGQuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgIGZpZWxkLm5hbWUubmFtZS5sZW5ndGgsCiAgICAgICAgICAgICAgICBmaWVsZC5maWxlVXJpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBSdW4gdGhyb3VnaCBhbGwgZmllbGRzIHRoYXQgYXJlIGluaXRpYWxpemVkIGJ5IHNvbWUgY29uc3RydWN0b3IsIGFuZAogICAgLy8gbWFrZSBzdXJlIHRoYXQgYWxsIG90aGVyIGNvbnN0cnVjdG9ycyBhbHNvIGluaXRpYWxpemUgdGhlbS4KICAgIGNvbnN0cnVjdG9ySW5pdGlhbGl6ZWRGaWVsZHMKICAgICAgICAuZm9yRWFjaCgoQ29uc3RydWN0b3IgY29uc3RydWN0b3IsIFNldDxGaWVsZD4gZmllbGRzKSB7CiAgICAgIGZvciAoRmllbGQgZmllbGQgaW4gaW5pdGlhbGl6ZWRGaWVsZHMuZGlmZmVyZW5jZShmaWVsZHMpKSB7CiAgICAgICAgaWYgKGZpZWxkLmluaXRpYWxpemVyID09IG51bGwpIHsKICAgICAgICAgIEZpZWxkSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPQogICAgICAgICAgICAgIG5ldyBGaWVsZEluaXRpYWxpemVyKGZpZWxkLCBuZXcgTnVsbExpdGVyYWwoKSkKICAgICAgICAgICAgICAgIC4uaXNTeW50aGV0aWMgPSB0cnVlOwogICAgICAgICAgaW5pdGlhbGl6ZXIucGFyZW50ID0gY29uc3RydWN0b3I7CiAgICAgICAgICBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMuaW5zZXJ0KDAsIGluaXRpYWxpemVyKTsKICAgICAgICAgIGlmIChmaWVsZC5pc0ZpbmFsKSB7CiAgICAgICAgICAgIGJ1aWxkZXIubGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgdGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yCiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoZmllbGQubmFtZS5uYW1lKSwKICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5uYW1lLm5hbWUubGVuZ3RoLAogICAgICAgICAgICAgICAgY29uc3RydWN0b3IuZmlsZVVyaSwKICAgICAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZQogICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoZmllbGQubmFtZS5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihmaWVsZC5maWxlVXJpLCBmaWVsZC5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm5hbWUubmFtZS5sZW5ndGgpCiAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgLy8vIFJ1biBhbGwgdHJhbnNmb3JtYXRpb25zIHRoYXQgYXJlIG5lZWRlZCB3aGVuIGJ1aWxkaW5nIGEgYnVuZGxlIG9mCiAgLy8vIGxpYnJhcmllcyBmb3IgdGhlIGZpcnN0IHRpbWUuCiAgdm9pZCBydW5CdWlsZFRyYW5zZm9ybWF0aW9ucygpIHsKICAgIGJhY2tlbmRUYXJnZXQucGVyZm9ybVByZUNvbnN0YW50RXZhbHVhdGlvblRyYW5zZm9ybWF0aW9ucygKICAgICAgICBjb21wb25lbnQsCiAgICAgICAgbG9hZGVyLmNvcmVUeXBlcywKICAgICAgICBsb2FkZXIubGlicmFyaWVzLAogICAgICAgIG5ldyBLZXJuZWxEaWFnbm9zdGljUmVwb3J0ZXIobG9hZGVyKSwKICAgICAgICBsb2dnZXI6IChTdHJpbmcgbXNnKSA9PiB0aWNrZXIubG9nTXMobXNnKSk7CiAgICBpZiAobG9hZGVyLnRhcmdldC5lbmFibGVDb25zdGFudFVwZGF0ZTIwMTgpIHsKICAgICAgVHlwZUVudmlyb25tZW50IGVudmlyb25tZW50ID0KICAgICAgICAgIG5ldyBUeXBlRW52aXJvbm1lbnQobG9hZGVyLmNvcmVUeXBlcywgbG9hZGVyLmhpZXJhcmNoeSk7CiAgICAgIGNvbnN0YW50cy50cmFuc2Zvcm1MaWJyYXJpZXMoCiAgICAgICAgICBsb2FkZXIubGlicmFyaWVzLAogICAgICAgICAgYmFja2VuZFRhcmdldC5jb25zdGFudHNCYWNrZW5kKGxvYWRlci5jb3JlVHlwZXMpLAogICAgICAgICAgZW52aXJvbm1lbnREZWZpbmVzLAogICAgICAgICAgZW52aXJvbm1lbnQsCiAgICAgICAgICBuZXcgS2VybmVsQ29uc3RhbnRFcnJvclJlcG9ydGVyKGxvYWRlciksCiAgICAgICAgICBkZXN1Z2FyU2V0czogIWJhY2tlbmRUYXJnZXQuc3VwcG9ydHNTZXRMaXRlcmFscywKICAgICAgICAgIGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50OiBlcnJvck9uVW5ldmFsdWF0ZWRDb25zdGFudCk7CiAgICAgIHRpY2tlci5sb2dNcygiRXZhbHVhdGVkIGNvbnN0YW50cyIpOwogICAgfQogICAgYmFja2VuZFRhcmdldC5wZXJmb3JtTW9kdWxhclRyYW5zZm9ybWF0aW9uc09uTGlicmFyaWVzKAogICAgICAgIGNvbXBvbmVudCwKICAgICAgICBsb2FkZXIuY29yZVR5cGVzLAogICAgICAgIGxvYWRlci5oaWVyYXJjaHksCiAgICAgICAgbG9hZGVyLmxpYnJhcmllcywKICAgICAgICBuZXcgS2VybmVsRGlhZ25vc3RpY1JlcG9ydGVyKGxvYWRlciksCiAgICAgICAgbG9nZ2VyOiAoU3RyaW5nIG1zZykgPT4gdGlja2VyLmxvZ01zKG1zZykpOwogIH0KCiAgdm9pZCBydW5Qcm9jZWR1cmVUcmFuc2Zvcm1hdGlvbnMoUHJvY2VkdXJlIHByb2NlZHVyZSkgewogICAgYmFja2VuZFRhcmdldC5wZXJmb3JtVHJhbnNmb3JtYXRpb25zT25Qcm9jZWR1cmUoCiAgICAgICAgbG9hZGVyLmNvcmVUeXBlcywgbG9hZGVyLmhpZXJhcmNoeSwgcHJvY2VkdXJlLAogICAgICAgIGxvZ2dlcjogKFN0cmluZyBtc2cpID0+IHRpY2tlci5sb2dNcyhtc2cpKTsKICB9CgogIHZvaWQgdmVyaWZ5KCkgewogICAgLy8gVE9ETyhhaGUpOiBIb3cgdG8gaGFuZGxlIGVycm9ycy4KICAgIHZlcmlmeUNvbXBvbmVudChjb21wb25lbnQpOwogICAgdGlja2VyLmxvZ01zKCJWZXJpZmllZCBjb21wb25lbnQiKTsKICB9CgogIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbbGlicmFyeV0gd2FzIGJ1aWx0IGJ5IHRoaXMgW0tlcm5lbFRhcmdldF0KICAvLy8gZnJvbSBzb3VyY2VzLCBhbmQgbm90IGxvYWRlZCBmcm9tIGEgW0RpbGxUYXJnZXRdLgogIGJvb2wgaXNTb3VyY2VMaWJyYXJ5KExpYnJhcnkgbGlicmFyeSkgewogICAgcmV0dXJuIGxvYWRlci5saWJyYXJpZXMuY29udGFpbnMobGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRQYXRjaEZpbGVzKEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIGFzc2VydChsaWJyYXJ5LnVyaS5zY2hlbWUgPT0gImRhcnQiKTsKICAgIExpc3Q8VXJpPiBwYXRjaGVzID0gdXJpVHJhbnNsYXRvci5nZXREYXJ0UGF0Y2hlcyhsaWJyYXJ5LnVyaS5wYXRoKTsKICAgIGlmIChwYXRjaGVzICE9IG51bGwpIHsKICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgZmlyc3Q7CiAgICAgIGZvciAoVXJpIHBhdGNoIGluIHBhdGNoZXMpIHsKICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCkgewogICAgICAgICAgZmlyc3QgPSBsaWJyYXJ5LmxvYWRlci5yZWFkKHBhdGNoLCAtMSwKICAgICAgICAgICAgICBmaWxlVXJpOiBwYXRjaCwgb3JpZ2luOiBsaWJyYXJ5LCBhY2Nlc3NvcjogbGlicmFyeSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBwYXRjaCBmaWxlLCBpdCdzIGludGVycHJldGVkIGFzIGEgcGFydCBvZgogICAgICAgICAgLy8gdGhlIHBhdGNoIGxpYnJhcnkuCiAgICAgICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBwYXJ0ID0gbGlicmFyeS5sb2FkZXIucmVhZChwYXRjaCwgLTEsCiAgICAgICAgICAgICAgb3JpZ2luOiBsaWJyYXJ5LCBmaWxlVXJpOiBwYXRjaCwgYWNjZXNzb3I6IGxpYnJhcnkpOwogICAgICAgICAgZmlyc3QucGFydHMuYWRkKHBhcnQpOwogICAgICAgICAgZmlyc3QucGFydE9mZnNldHMuYWRkKC0xKTsKICAgICAgICAgIHBhcnQucGFydE9mVXJpID0gZmlyc3QudXJpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKLy8vIExvb2tzIGZvciBhIGNvbnN0cnVjdG9yIGNhbGwgdGhhdCBtYXRjaGVzIGBzdXBlcigpYCBmcm9tIGEgY29uc3RydWN0b3IgaW4KLy8vIFtjbHNdLiBTdWNoIGEgY29uc3RydWN0b3IgbWF5IGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzLCBidXQgbm8gcmVxdWlyZWQKLy8vIGFyZ3VtZW50cy4KQ29uc3RydWN0b3IgZGVmYXVsdFN1cGVyQ29uc3RydWN0b3IoQ2xhc3MgY2xzKSB7CiAgQ2xhc3Mgc3VwZXJjbGFzcyA9IGNscy5zdXBlcmNsYXNzOwogIGlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsKICAgIGZvciAoQ29uc3RydWN0b3IgY29uc3RydWN0b3IgaW4gc3VwZXJjbGFzcy5jb25zdHJ1Y3RvcnMpIHsKICAgICAgaWYgKGNvbnN0cnVjdG9yLm5hbWUubmFtZS5pc0VtcHR5KSB7CiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPT0gMAogICAgICAgICAgICA/IGNvbnN0cnVjdG9yCiAgICAgICAgICAgIDogbnVsbDsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfQoKY2xhc3MgS2VybmVsRGlhZ25vc3RpY1JlcG9ydGVyCiAgICBleHRlbmRzIERpYWdub3N0aWNSZXBvcnRlcjxNZXNzYWdlLCBMb2NhdGVkTWVzc2FnZT4gewogIGZpbmFsIExvYWRlciBsb2FkZXI7CgogIEtlcm5lbERpYWdub3N0aWNSZXBvcnRlcih0aGlzLmxvYWRlcik7CgogIHZvaWQgcmVwb3J0KE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsIFVyaSBmaWxlVXJpLAogICAgICB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIGxvYWRlci5hZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpLCBjb250ZXh0OiBjb250ZXh0KTsKICB9Cn0Kg2gATk48AR0BIQEhCRMXDxMVEhgUDxoWFRccEQ4ZFRMgEBoXGx0VATYBOwFFAUQBPwE4ATABMwFCATsBJQEaCRouMzYSKjckLDMBKgEuAUYBOQFCATQBRwEdCRYVHBweGhoYFSABQQE5AS0BMj0fATUeAR8BNC0BFwEXAUkBTAFFATMBTwExOgEqQgExAU0jLSEvTB0EASE7AR1QG0AEAUc0IigqKRMYGBUVERFHKzo5Oy8oUEUjSBgXISYnFxAODAgeTQYTBAEMJzsfNR0YCAZDBAE4MD5AJjsmMUEgDAoICBMEASogIhocPSIfIAQBDEQrNCokLkYdJURCHU8rNUMfLCIvJBJOGkEhMikcKC4zMyUoQCsYMwQBRk5LT0AGSBEMQSs0KiIgKy0/JCMoIQEhQBgzBAEkNSsvBjxDRQYEAUklRjMBOy4nSx4UBgEqAUpOIDEgPS0wNQgtNjUvNQoIBgElRQYBJhYEASQqQCY7JjYzLCY8TSwOMkpJDgwKCAg9BAFJKjM/HyojFAoqMhEuCggGNgQBQQEzAUY/KSJNOEo4IgYBRVFMSUhNBAFDKDIySQ4GAUVRShcNAUtKTT0fKiYkJA1IMAYoMAYlMFEPNzpGS1EKCDJPDU0wBgQBRk9BKTY9IT4IEwYBTkkyNyQ4NEIGTzZEIiVABkM0Kk01OT8lIDIbPwQBIjhKTRA3OCpMSk4vHkZQCAYbNgQBPRwvRBwcBAE9PkVGRAZCBAEcKysYFExPQxkTFQksNR1MGhw+KSMaEwwKLycjCg8nCAYhO0kyLwQBQiozIiAlCAYrBAFLFDghIAFMXTEsJjYjCCcoCAZAJR04IkI1RE1ODCARCggcTk45MDgjJTE7Jw4gOjkYGzQTGkkoDDUsCjFOUDE8QwoBO0QxOAwKKDwmSzk2Ow4MCklAQzAmTFAeIgoIBiIhQCc5DyoICAFOKC9NPx1HPjkkIzJJSkkTKFEiKCAMCggGAUxDIUBCKSk9Jiw7Hyg+NSguJRs1NkUyFAwKCAgEAUgkIz8TGhouNDIkQyQcPB4XMztDKwY8ExoaGi40BAE6NTc0BAESKCAoBAFMOCovBAEMNipIGyIjHTFDEVAgRUMhJSYKCAYEAgFOSw8xJRw/K0AaFAgGBA8CAR86FwEpAUgoUQQCATVwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF90YXJnZXQuZGFydDZzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL3V0aWxzLmRhcnSR9i8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdkYXJ0OmlvJyBzaG93IEJ5dGVzQnVpbGRlciwgRmlsZSwgSU9TaW5rOwoKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbG9uZS5kYXJ0JyBzaG93IENsb25lVmlzaXRvcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBDb21wb25lbnQsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIENsYXNzLAogICAgICAgIFR5cGVQYXJhbWV0ZXIsCiAgICAgICAgVHlwZVBhcmFtZXRlclR5cGUsCiAgICAgICAgU3VwZXJ0eXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9iaW5hcnkvYXN0X3RvX2JpbmFyeS5kYXJ0JyBzaG93IEJpbmFyeVByaW50ZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2JpbmFyeS9saW1pdGVkX2FzdF90b19iaW5hcnkuZGFydCcKICAgIHNob3cgTGltaXRlZEJpbmFyeVByaW50ZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RleHQvYXN0X3RvX3RleHQuZGFydCcgc2hvdyBQcmludGVyOwoKLy8vIFByaW50IHRoZSBnaXZlbiBbY29tcG9uZW50XS4gIERvIG5vdGhpbmcgaWYgaXQgaXMgYG51bGxgLiAgSWYgdGhlCi8vLyBbbGlicmFyeUZpbHRlcl0gaXMgcHJvdmlkZWQsIHRoZW4gb25seSBsaWJyYXJpZXMgdGhhdCBzYXRpc2Z5IGl0IGFyZQovLy8gcHJpbnRlZC4Kdm9pZCBwcmludENvbXBvbmVudFRleHQoQ29tcG9uZW50IGNvbXBvbmVudCwKICAgIHtib29sIGxpYnJhcnlGaWx0ZXIoTGlicmFyeSBsaWJyYXJ5KX0pIHsKICBpZiAoY29tcG9uZW50ID09IG51bGwpIHJldHVybjsKICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoc2IpOwogIHByaW50ZXIud3JpdGVDb21wb25lbnRQcm9ibGVtcyhjb21wb25lbnQpOwogIGZvciAoTGlicmFyeSBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgIGlmIChsaWJyYXJ5RmlsdGVyICE9IG51bGwgJiYgIWxpYnJhcnlGaWx0ZXIobGlicmFyeSkpIGNvbnRpbnVlOwogICAgcHJpbnRlci53cml0ZUxpYnJhcnlGaWxlKGxpYnJhcnkpOwogIH0KICBwcmludGVyLndyaXRlQ29uc3RhbnRUYWJsZShjb21wb25lbnQpOwogIHByaW50KHNiKTsKfQoKLy8vIFdyaXRlIFtjb21wb25lbnRdIHRvIGZpbGUgb25seSBpbmNsdWRpbmcgbGlicmFyaWVzIHRoYXQgbWF0Y2ggW2ZpbHRlcl0uCkZ1dHVyZTxOdWxsPiB3cml0ZUNvbXBvbmVudFRvRmlsZShDb21wb25lbnQgY29tcG9uZW50LCBVcmkgdXJpLAogICAge2Jvb2wgZmlsdGVyKExpYnJhcnkgbGlicmFyeSl9KSBhc3luYyB7CiAgRmlsZSBvdXRwdXQgPSBuZXcgRmlsZS5mcm9tVXJpKHVyaSk7CiAgSU9TaW5rIHNpbmsgPSBvdXRwdXQub3BlbldyaXRlKCk7CiAgdHJ5IHsKICAgIEJpbmFyeVByaW50ZXIgcHJpbnRlciA9IGZpbHRlciA9PSBudWxsCiAgICAgICAgPyBuZXcgQmluYXJ5UHJpbnRlcihzaW5rKQogICAgICAgIDogbmV3IExpbWl0ZWRCaW5hcnlQcmludGVyKHNpbmssIGZpbHRlciA/PyAoXykgPT4gdHJ1ZSwgZmFsc2UpOwogICAgcHJpbnRlci53cml0ZUNvbXBvbmVudEZpbGUoY29tcG9uZW50KTsKICB9IGZpbmFsbHkgewogICAgYXdhaXQgc2luay5jbG9zZSgpOwogIH0KfQoKLy8vIFNlcmlhbGl6ZSB0aGUgbGlicmFyaWVzIGluIFtjb21wb25lbnRdIHRoYXQgbWF0Y2ggW2ZpbHRlcl0uClVpbnQ4TGlzdCBzZXJpYWxpemVDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwKICAgIHtib29sIGZpbHRlcihMaWJyYXJ5IGxpYnJhcnkpLAogICAgYm9vbCBpbmNsdWRlU291cmNlczogdHJ1ZSwKICAgIGJvb2wgaW5jbHVkZU9mZnNldHM6IHRydWV9KSB7CiAgQnl0ZVNpbmsgYnl0ZVNpbmsgPSBuZXcgQnl0ZVNpbmsoKTsKICBCaW5hcnlQcmludGVyIHByaW50ZXIgPSBmaWx0ZXIgPT0gbnVsbAogICAgICA/IG5ldyBCaW5hcnlQcmludGVyKGJ5dGVTaW5rLAogICAgICAgICAgaW5jbHVkZVNvdXJjZXM6IGluY2x1ZGVTb3VyY2VzLCBpbmNsdWRlT2Zmc2V0czogaW5jbHVkZU9mZnNldHMpCiAgICAgIDogbmV3IExpbWl0ZWRCaW5hcnlQcmludGVyKGJ5dGVTaW5rLCBmaWx0ZXIsICFpbmNsdWRlU291cmNlcywKICAgICAgICAgIGluY2x1ZGVPZmZzZXRzOiBpbmNsdWRlT2Zmc2V0cyk7CiAgcHJpbnRlci53cml0ZUNvbXBvbmVudEZpbGUoY29tcG9uZW50KTsKICByZXR1cm4gYnl0ZVNpbmsuYnVpbGRlci50YWtlQnl0ZXMoKTsKfQoKY29uc3QgU3RyaW5nIGtEZWJ1Z0NsYXNzTmFtZSA9ICIjRGVidWdDbGFzcyI7CgpDb21wb25lbnQgY3JlYXRlRXhwcmVzc2lvbkV2YWx1YXRpb25Db21wb25lbnQoUHJvY2VkdXJlIHByb2NlZHVyZSkgewogIExpYnJhcnkgZmFrZUxpYnJhcnkgPQogICAgICBuZXcgTGlicmFyeShuZXcgVXJpKHNjaGVtZTogJ2V2YWx1YXRlJywgcGF0aDogJ3NvdXJjZScpKTsKCiAgaWYgKHByb2NlZHVyZS5wYXJlbnQgaXMgQ2xhc3MpIHsKICAgIENsYXNzIHJlYWxDbGFzcyA9IHByb2NlZHVyZS5wYXJlbnQ7CgogICAgQ2xhc3MgZmFrZUNsYXNzID0gbmV3IENsYXNzKG5hbWU6IGtEZWJ1Z0NsYXNzTmFtZSk7CiAgICBNYXA8VHlwZVBhcmFtZXRlciwgVHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtcyA9CiAgICAgICAgPFR5cGVQYXJhbWV0ZXIsIFR5cGVQYXJhbWV0ZXI+e307CiAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHR5cGVTdWJzdGl0dXRpb24gPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtIGluIHJlYWxDbGFzcy50eXBlUGFyYW1ldGVycykgewogICAgICB2YXIgbmV3Tm9kZSA9IG5ldyBUeXBlUGFyYW1ldGVyKHR5cGVQYXJhbS5uYW1lKTsKICAgICAgdHlwZVBhcmFtc1t0eXBlUGFyYW1dID0gbmV3Tm9kZTsKICAgICAgdHlwZVN1YnN0aXR1dGlvblt0eXBlUGFyYW1dID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKG5ld05vZGUpOwogICAgfQogICAgQ2xvbmVWaXNpdG9yIGNsb25lciA9IG5ldyBDbG9uZVZpc2l0b3IoCiAgICAgICAgdHlwZVN1YnN0aXR1dGlvbjogdHlwZVN1YnN0aXR1dGlvbiwgdHlwZVBhcmFtczogdHlwZVBhcmFtcyk7CgogICAgZm9yIChUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbSBpbiByZWFsQ2xhc3MudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgZmFrZUNsYXNzLnR5cGVQYXJhbWV0ZXJzLmFkZCh0eXBlUGFyYW0uYWNjZXB0KGNsb25lcikpOwogICAgfQoKICAgIGZha2VDbGFzcy5wYXJlbnQgPSBmYWtlTGlicmFyeTsKICAgIGlmIChyZWFsQ2xhc3Muc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgLy8gc3VwZXJ0eXBlIGlzIG51bGwgZm9yIE9iamVjdC4KICAgICAgZmFrZUNsYXNzLnN1cGVydHlwZSA9IG5ldyBTdXBlcnR5cGUuYnlSZWZlcmVuY2UoCiAgICAgICAgICByZWFsQ2xhc3Muc3VwZXJ0eXBlLmNsYXNzTmFtZSwKICAgICAgICAgIHJlYWxDbGFzcy5zdXBlcnR5cGUudHlwZUFyZ3VtZW50cy5tYXAoY2xvbmVyLnZpc2l0VHlwZSkudG9MaXN0KCkpOwogICAgfQoKICAgIC8vIFJlYmluZCB0aGUgdHlwZSBwYXJhbWV0ZXJzIGluIHRoZSBwcm9jZWR1cmUuCiAgICBwcm9jZWR1cmUgPSBwcm9jZWR1cmUuYWNjZXB0KGNsb25lcik7CiAgICBwcm9jZWR1cmUucGFyZW50ID0gZmFrZUNsYXNzOwogICAgZmFrZUNsYXNzLnByb2NlZHVyZXMuYWRkKHByb2NlZHVyZSk7CiAgICBmYWtlTGlicmFyeS5jbGFzc2VzLmFkZChmYWtlQ2xhc3MpOwogIH0gZWxzZSB7CiAgICBmYWtlTGlicmFyeS5wcm9jZWR1cmVzLmFkZChwcm9jZWR1cmUpOwogICAgcHJvY2VkdXJlLnBhcmVudCA9IGZha2VMaWJyYXJ5OwogIH0KCiAgLy8gVE9ETyh2ZWdvcm92KSBmaW5kIGEgd2F5IHRvIHByZXNlcnZlIG1ldGFkYXRhLgogIHJldHVybiBuZXcgQ29tcG9uZW50KGxpYnJhcmllczogW2Zha2VMaWJyYXJ5XSk7Cn0KCkxpc3Q8aW50PiBzZXJpYWxpemVQcm9jZWR1cmUoUHJvY2VkdXJlIHByb2NlZHVyZSkgewogIHJldHVybiBzZXJpYWxpemVDb21wb25lbnQoY3JlYXRlRXhwcmVzc2lvbkV2YWx1YXRpb25Db21wb25lbnQocHJvY2VkdXJlKSk7Cn0KCi8vLyBBIFtTaW5rXSB0aGF0IGRpcmVjdGx5IHdyaXRlcyBkYXRhIGludG8gYSBieXRlIGJ1aWxkZXIuCmNsYXNzIEJ5dGVTaW5rIGltcGxlbWVudHMgU2luazxMaXN0PGludD4+IHsKICBmaW5hbCBCeXRlc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBCeXRlc0J1aWxkZXIoKTsKCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGRhdGEpIHsKICAgIGJ1aWxkZXIuYWRkKGRhdGEpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHt9Cn0KgIwATk48ASEBMgEpATYBIQkSERMTDxcbEwFGATofATwBRkkNLS0hKCUtMUQnBCkNAgFMQCwnJAgrIkgrDhgEAgFAMiMfIiYpJEpEKyknAgEuAUUYQAEjKAE4MypRQDcnRAYsRQFAPgYBJCcnNylNBgE0KiIpKAsrJAQBNDICATRNAgE8LDMBHRcEARICAS1wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3V0aWxzLmRhcnQ5c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC92ZXJpZmllci5kYXJ0l2UvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS52ZXJpZmllcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXNFeHByZXNzaW9uLAogICAgICAgIENsYXNzLAogICAgICAgIENvbXBvbmVudCwKICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50LAogICAgICAgIEZpZWxkLAogICAgICAgIExldCwKICAgICAgICBMaWJyYXJ5LAogICAgICAgIE1lbWJlciwKICAgICAgICBQcm9jZWR1cmUsCiAgICAgICAgU3RhdGljSW52b2NhdGlvbiwKICAgICAgICBTdXBlck1ldGhvZEludm9jYXRpb24sCiAgICAgICAgU3VwZXJQcm9wZXJ0eUdldCwKICAgICAgICBTdXBlclByb3BlcnR5U2V0LAogICAgICAgIFRyZWVOb2RlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90cmFuc2Zvcm1hdGlvbnMvZmxhZ3MuZGFydCcgc2hvdyBUcmFuc2Zvcm1lckZsYWc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3ZlcmlmaWVyLmRhcnQnIHNob3cgVmVyaWZ5aW5nVmlzaXRvcjsKCmltcG9ydCAnLi4vY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cgTG9jYXRlZE1lc3NhZ2UsIG5vTGVuZ3RoLCB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVZlcmlmaWNhdGlvbkVycm9yOwoKaW1wb3J0ICcuLi9zZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX3NjaGVtYS5kYXJ0JyBzaG93IFR5cGVTY2hlbWFWaXNpdG9yLCBVbmtub3duVHlwZTsKCmltcG9ydCAna2VybmVsX3NoYWRvd19hc3QuZGFydCcgc2hvdyBTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQ7CgppbXBvcnQgJ3JlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keS5kYXJ0JwogICAgc2hvdyBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5LCBnZXRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5OwoKTGlzdDxMb2NhdGVkTWVzc2FnZT4gdmVyaWZ5Q29tcG9uZW50KENvbXBvbmVudCBjb21wb25lbnQsCiAgICB7Ym9vbCBpc091dGxpbmU6IGZhbHNlLCBib29sIHNraXBQbGF0Zm9ybTogZmFsc2V9KSB7CiAgRmFzdGFWZXJpZnlpbmdWaXNpdG9yIHZlcmlmaWVyID0KICAgICAgbmV3IEZhc3RhVmVyaWZ5aW5nVmlzaXRvcihpc091dGxpbmUsIHNraXBQbGF0Zm9ybSk7CiAgY29tcG9uZW50LmFjY2VwdCh2ZXJpZmllcik7CiAgcmV0dXJuIHZlcmlmaWVyLmVycm9yczsKfQoKY2xhc3MgRmFzdGFWZXJpZnlpbmdWaXNpdG9yIGV4dGVuZHMgVmVyaWZ5aW5nVmlzaXRvcgogICAgaW1wbGVtZW50cyBUeXBlU2NoZW1hVmlzaXRvcjx2b2lkPiB7CiAgZmluYWwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gZXJyb3JzID0gPExvY2F0ZWRNZXNzYWdlPltdOwoKICBVcmkgZmlsZVVyaTsKICBmaW5hbCBib29sIHNraXBQbGF0Zm9ybTsKCiAgRmFzdGFWZXJpZnlpbmdWaXNpdG9yKGJvb2wgaXNPdXRsaW5lLCB0aGlzLnNraXBQbGF0Zm9ybSkgewogICAgdGhpcy5pc091dGxpbmUgPSBpc091dGxpbmU7CiAgfQoKICBVcmkgY2hlY2tMb2NhdGlvbihUcmVlTm9kZSBub2RlLCBTdHJpbmcgbmFtZSwgVXJpIGZpbGVVcmkpIHsKICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5jb250YWlucygiIyIpKSB7CiAgICAgIC8vIFRPRE8oYWhlKTogSW52ZXN0aWdhdGUgaWYgdGhlc2UgY2hlY2tzIGNhbiBiZSBlbmFibGVkOgogICAgICAvLyBpZiAobm9kZS5maWxlVXJpICE9IG51bGwgJiYgbm9kZSBpcyEgTGlicmFyeSkgewogICAgICAvLyAgIHByb2JsZW0obm9kZSwgIkEgc3ludGhldGljIG5vZGUgc2hvdWxkbid0IGhhdmUgYSBmaWxlVXJpIiwKICAgICAgLy8gICAgICAgY29udGV4dDogbm9kZSk7CiAgICAgIC8vIH0KICAgICAgLy8gaWYgKG5vZGUuZmlsZU9mZnNldCAhPSAtMSkgewogICAgICAvLyAgIHByb2JsZW0obm9kZSwgIkEgc3ludGhldGljIG5vZGUgc2hvdWxkbid0IGhhdmUgYSBmaWxlT2Zmc2V0IiwKICAgICAgLy8gICAgICAgY29udGV4dDogbm9kZSk7CiAgICAgIC8vIH0KICAgICAgcmV0dXJuIGZpbGVVcmk7CiAgICB9IGVsc2UgewogICAgICBpZiAoZmlsZVVyaSA9PSBudWxsKSB7CiAgICAgICAgcHJvYmxlbShub2RlLCAiJyRuYW1lJyBoYXMgbm8gZmlsZVVyaSIsIGNvbnRleHQ6IG5vZGUpOwogICAgICAgIHJldHVybiBmaWxlVXJpOwogICAgICB9CiAgICAgIGlmIChub2RlLmZpbGVPZmZzZXQgPT0gLTEgJiYgbm9kZSBpcyEgTGlicmFyeSkgewogICAgICAgIHByb2JsZW0obm9kZSwgIickbmFtZScgaGFzIG5vIGZpbGVPZmZzZXQiLCBjb250ZXh0OiBub2RlKTsKICAgICAgfQogICAgICByZXR1cm4gZmlsZVVyaTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tTdXBlckludm9jYXRpb24oVHJlZU5vZGUgbm9kZSkgewogICAgdmFyIGNvbnRhaW5pbmdNZW1iZXIgPSBnZXRDb250YWluaW5nTWVtYmVyKG5vZGUpOwogICAgaWYgKGNvbnRhaW5pbmdNZW1iZXIgPT0gbnVsbCkgewogICAgICBwcm9ibGVtKG5vZGUsICdTdXBlciBjYWxsIG91dHNpZGUgb2YgYW55IG1lbWJlcicpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGNvbnRhaW5pbmdNZW1iZXIudHJhbnNmb3JtZXJGbGFncyAmIFRyYW5zZm9ybWVyRmxhZy5zdXBlckNhbGxzID09IDApIHsKICAgICAgICBwcm9ibGVtKAogICAgICAgICAgICBub2RlLCAnU3VwZXIgY2FsbCBpbiBhIG1lbWJlciBsYWNraW5nIFRyYW5zZm9ybWVyRmxhZy5zdXBlckNhbGxzJyk7CiAgICAgIH0KICAgIH0KICB9CgogIE1lbWJlciBnZXRDb250YWluaW5nTWVtYmVyKFRyZWVOb2RlIG5vZGUpIHsKICAgIHdoaWxlIChub2RlICE9IG51bGwpIHsKICAgICAgaWYgKG5vZGUgaXMgTWVtYmVyKSByZXR1cm4gbm9kZTsKICAgICAgbm9kZSA9IG5vZGUucGFyZW50OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBwcm9ibGVtKFRyZWVOb2RlIG5vZGUsIFN0cmluZyBkZXRhaWxzLCB7VHJlZU5vZGUgY29udGV4dH0pIHsKICAgIG5vZGUgPz89IChjb250ZXh0ID8/IHRoaXMuY29udGV4dCk7CiAgICBpbnQgb2Zmc2V0ID0gbm9kZT8uZmlsZU9mZnNldCA/PyAtMTsKICAgIFVyaSBmaWxlID0gbm9kZT8ubG9jYXRpb24/LmZpbGUgPz8gZmlsZVVyaTsKICAgIFVyaSB1cmkgPSBmaWxlID09IG51bGwgPyBudWxsIDogZmlsZTsKICAgIExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UgPSB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVZlcmlmaWNhdGlvbkVycm9yCiAgICAgICAgLndpdGhBcmd1bWVudHMoZGV0YWlscykKICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgb2Zmc2V0LCBub0xlbmd0aCk7CiAgICBDb21waWxlckNvbnRleHQuY3VycmVudC5yZXBvcnQobWVzc2FnZSwgU2V2ZXJpdHkuZXJyb3IpOwogICAgZXJyb3JzLmFkZChtZXNzYWdlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QXNFeHByZXNzaW9uKEFzRXhwcmVzc2lvbiBub2RlKSB7CiAgICBzdXBlci52aXNpdEFzRXhwcmVzc2lvbihub2RlKTsKICAgIGlmIChub2RlLmZpbGVPZmZzZXQgPT0gLTEpIHsKICAgICAgVHJlZU5vZGUgcGFyZW50ID0gbm9kZS5wYXJlbnQ7CiAgICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewogICAgICAgIGlmIChwYXJlbnQuZmlsZU9mZnNldCAhPSAtMSkgYnJlYWs7CiAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgICAgfQogICAgICBwcm9ibGVtKHBhcmVudCwgIk5vIG9mZnNldCBmb3IgJG5vZGUiLCBjb250ZXh0OiBub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKICAgIC8vIEJ5cGFzcyB2ZXJpZmljYXRpb24gb2YgdGhlIFtTdGF0aWNHZXRdIGluIFtSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5XSBhcwogICAgLy8gdGhpcyBpcyBhIHN0YXRpYyBnZXQgd2l0aG91dCBhIGdldHRlci4KICAgIGlmIChub2RlIGlzISBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KSB7CiAgICAgIHN1cGVyLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0TGV0KExldCBub2RlKSB7CiAgICBpZiAobm9kZSBpcyBTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQpIHsKICAgICAgcHJvYmxlbShub2RlLCAiTGVha2luZyBzaGFkb3cgbm9kZTogJHtub2RlLnJ1bnRpbWVUeXBlfSIpOwogICAgfQogICAgc3VwZXIudmlzaXRMZXQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExpYnJhcnkoTGlicmFyeSBub2RlKSB7CiAgICAvLyBJc3N1ZShodHRwOi8vZGFydGJ1Zy5jb20vMzI1MzApCiAgICBpZiAoc2tpcFBsYXRmb3JtICYmIG5vZGUuaW1wb3J0VXJpLnNjaGVtZSA9PSAnZGFydCcpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZmlsZVVyaSA9IGNoZWNrTG9jYXRpb24obm9kZSwgbm9kZS5uYW1lLCBub2RlLmZpbGVVcmkpOwogICAgc3VwZXIudmlzaXRMaWJyYXJ5KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDbGFzcyhDbGFzcyBub2RlKSB7CiAgICBmaWxlVXJpID0gY2hlY2tMb2NhdGlvbihub2RlLCBub2RlLm5hbWUsIG5vZGUuZmlsZVVyaSk7CiAgICBzdXBlci52aXNpdENsYXNzKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGaWVsZChGaWVsZCBub2RlKSB7CiAgICBmaWxlVXJpID0gY2hlY2tMb2NhdGlvbihub2RlLCBub2RlLm5hbWUubmFtZSwgbm9kZS5maWxlVXJpKTsKICAgIHN1cGVyLnZpc2l0RmllbGQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb2NlZHVyZShQcm9jZWR1cmUgbm9kZSkgewogICAgZmlsZVVyaSA9IGNoZWNrTG9jYXRpb24obm9kZSwgbm9kZS5uYW1lLm5hbWUsIG5vZGUuZmlsZVVyaSk7CiAgICBzdXBlci52aXNpdFByb2NlZHVyZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VW5rbm93blR5cGUoVW5rbm93blR5cGUgbm9kZSkgewogICAgLy8gTm90ZTogd2UgY2FuJ3QgcGFzcyBbbm9kZV0gdG8gW3Byb2JsZW1dIGJlY2F1c2UgaXQncyBub3QgYSBbVHJlZU5vZGVdLgogICAgcHJvYmxlbShudWxsLCAiVW5leHBlY3RlZCBhcHBlYXJhbmNlIG9mIHRoZSB1bmtub3duIHR5cGUuIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgY2hlY2tTdXBlckludm9jYXRpb24obm9kZSk7CiAgICBzdXBlci52aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3VwZXJQcm9wZXJ0eUdldChTdXBlclByb3BlcnR5R2V0IG5vZGUpIHsKICAgIGNoZWNrU3VwZXJJbnZvY2F0aW9uKG5vZGUpOwogICAgc3VwZXIudmlzaXRTdXBlclByb3BlcnR5R2V0KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdXBlclByb3BlcnR5U2V0KFN1cGVyUHJvcGVydHlTZXQgbm9kZSkgewogICAgY2hlY2tTdXBlckludm9jYXRpb24obm9kZSk7CiAgICBzdXBlci52aXNpdFN1cGVyUHJvcGVydHlTZXQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY0ludm9jYXRpb24oU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBzdXBlci52aXNpdFN0YXRpY0ludm9jYXRpb24obm9kZSk7CiAgICBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5IGJvZHkgPSBnZXRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KG5vZGUudGFyZ2V0KTsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgcHJvYmxlbShub2RlLCAiQXR0ZW1wdCB0byBpbnZva2UgcmVkaXJlY3RpbmcgZmFjdG9yeS4iKTsKICAgIH0KICB9Cn0KgNIATk48ARgBIQkWDxMdDw0REBMaHxoaEgFJAT0BOAEdTQEpAVEBQgEnPAE6OSM6HhoCATUpOgEPGwE9IAQBPy5AOUYfCyZJHwsWDR1AGAg3QwgWBgQBLTYkOQ1REVAIBgQBLhsnGgYRBAEMPygpMCpGIC49GQQBDCkjISUfLCAIPQYEAQw3TS4rLAYEAQwXL0EGGgQBDB8nOw4GPB4EAQwbPBwEAQwbQRwEAQwjQSAEAQwnTkEEAQw7ICwEAQwxICcEAQwxICcEAQwxJ0oYPwYEAgEwcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC92ZXJpZmllci5kYXJ0MHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9sb2FkZXIuZGFydKmILy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEubG9hZGVyOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZTsKCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJyBzaG93IFF1ZXVlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBMaWJyYXJ5OwoKaW1wb3J0ICdidWlsZGVyL2J1aWxkZXIuZGFydCcKICAgIHNob3cgQ2xhc3NCdWlsZGVyLCBEZWNsYXJhdGlvbiwgTGlicmFyeUJ1aWxkZXIsIFR5cGVCdWlsZGVyOwoKaW1wb3J0ICdjcmFzaC5kYXJ0JyBzaG93IGZpcnN0U291cmNlVXJpOwoKaW1wb3J0ICdtZXNzYWdlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIEZvcm1hdHRlZE1lc3NhZ2UsCiAgICAgICAgTG9jYXRlZE1lc3NhZ2UsCiAgICAgICAgTWVzc2FnZSwKICAgICAgICBub0xlbmd0aCwKICAgICAgICBTdW1tYXJ5VGVtcGxhdGUsCiAgICAgICAgVGVtcGxhdGUsCiAgICAgICAgbWVzc2FnZVBsYXRmb3JtUHJpdmF0ZUxpYnJhcnlBY2Nlc3MsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Db250ZXh0U2V2ZXJpdHksCiAgICAgICAgdGVtcGxhdGVTb3VyY2VCb2R5U3VtbWFyeTsKCmltcG9ydCAncHJvYmxlbXMuZGFydCcgc2hvdyBpbnRlcm5hbFByb2JsZW0sIHVuaGFuZGxlZDsKCmltcG9ydCAnc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eTsKCmltcG9ydCAndGFyZ2V0X2ltcGxlbWVudGF0aW9uLmRhcnQnIHNob3cgVGFyZ2V0SW1wbGVtZW50YXRpb247CgppbXBvcnQgJ3RpY2tlci5kYXJ0JyBzaG93IFRpY2tlcjsKCmNvbnN0IFN0cmluZyB1bnRyYW5zbGF0YWJsZVVyaVNjaGVtZSA9ICJvcmctZGFydGxhbmctdW50cmFuc2xhdGFibGUtdXJpIjsKCmFic3RyYWN0IGNsYXNzIExvYWRlciB7CiAgZmluYWwgTWFwPFVyaSwgTGlicmFyeUJ1aWxkZXI+IGJ1aWxkZXJzID0gPFVyaSwgTGlicmFyeUJ1aWxkZXI+e307CgogIGZpbmFsIFF1ZXVlPExpYnJhcnlCdWlsZGVyPiB1bnBhcnNlZExpYnJhcmllcyA9IG5ldyBRdWV1ZTxMaWJyYXJ5QnVpbGRlcj4oKTsKCiAgZmluYWwgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMgPSA8TGlicmFyeT5bXTsKCiAgZmluYWwgVGFyZ2V0SW1wbGVtZW50YXRpb24gdGFyZ2V0OwoKICAvLy8gTGlzdCBvZiBhbGwgaGFuZGxlZCBjb21waWxlLXRpbWUgZXJyb3JzIHNlZW4gc28gZmFyIGJ5IGxpYnJhcmllcyBsb2FkZWQKICAvLy8gYnkgdGhpcyBsb2FkZXIuCiAgLy8vCiAgLy8vIEEgaGFuZGxlZCBlcnJvciBpcyBhbiBlcnJvciB0aGF0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgQVNUCiAgLy8vIGFscmVhZHksIGZvciBleGFtcGxlLCBhcyBhIHRocm93IGV4cHJlc3Npb24uCiAgZmluYWwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gaGFuZGxlZEVycm9ycyA9IDxMb2NhdGVkTWVzc2FnZT5bXTsKCiAgLy8vIExpc3Qgb2YgYWxsIHVuaGFuZGxlZCBjb21waWxlLXRpbWUgZXJyb3JzIHNlZW4gc28gZmFyIGJ5IGxpYnJhcmllcyBsb2FkZWQKICAvLy8gYnkgdGhpcyBsb2FkZXIuCiAgLy8vCiAgLy8vIEFuIHVuaGFuZGxlZCBlcnJvciBpcyBhbiBlcnJvciB0aGF0IGhhc24ndCBiZWVuIGhhbmRsZWQsIHNlZQogIC8vLyBbaGFuZGxlZEVycm9yc10uCiAgZmluYWwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gdW5oYW5kbGVkRXJyb3JzID0gPExvY2F0ZWRNZXNzYWdlPltdOwoKICAvLy8gTGlzdCBvZiBhbGwgcHJvYmxlbXMgc2VlbiBzbyBmYXIgYnkgbGlicmFyaWVzIGxvYWRlZCBieSB0aGlzIGxvYWRlciB0aGF0CiAgLy8vIGRvZXMgbm90IGJlbG9uZyBkaXJlY3RseSB0byBhIGxpYnJhcnkuCiAgZmluYWwgTGlzdDxGb3JtYXR0ZWRNZXNzYWdlPiBhbGxDb21wb25lbnRQcm9ibGVtcyA9IDxGb3JtYXR0ZWRNZXNzYWdlPltdOwoKICBmaW5hbCBTZXQ8U3RyaW5nPiBzZWVuTWVzc2FnZXMgPSBuZXcgU2V0PFN0cmluZz4oKTsKCiAgTGlicmFyeUJ1aWxkZXIgY29yZUxpYnJhcnk7CgogIC8vLyBUaGUgZmlyc3QgbGlicmFyeSB0aGF0IHdlJ3ZlIGJlZW4gYXNrZWQgdG8gY29tcGlsZS4gV2hlbiBjb21waWxpbmcgYQogIC8vLyBwcm9ncmFtIChha2Egc2NyaXB0KSwgdGhpcyBpcyB0aGUgbGlicmFyeSB0aGF0IHNob3VsZCBoYXZlIGEgbWFpbiBtZXRob2QuCiAgTGlicmFyeUJ1aWxkZXIgZmlyc3Q7CgogIGludCBieXRlQ291bnQgPSAwOwoKICBVcmkgY3VycmVudFVyaUZvckNyYXNoUmVwb3J0aW5nOwoKICBMb2FkZXIodGhpcy50YXJnZXQpOwoKICBUaWNrZXIgZ2V0IHRpY2tlciA9PiB0YXJnZXQudGlja2VyOwoKICBUZW1wbGF0ZTxTdW1tYXJ5VGVtcGxhdGU+IGdldCBvdXRsaW5lU3VtbWFyeVRlbXBsYXRlOwoKICBib29sIGdldCBpc1NvdXJjZUxvYWRlciA9PiBmYWxzZTsKCiAgLy8vIExvb2sgdXAgYSBsaWJyYXJ5IGJ1aWxkZXIgYnkgdGhlIG5hbWUgW3VyaV0sIG9yIGlmIHN1Y2ggZG9lc24ndAogIC8vLyBleGlzdCwgY3JlYXRlIG9uZS4gVGhlIGNhbm9uaWNhbCBVUkkgb2YgdGhlIGxpYnJhcnkgaXMgW3VyaV0sIGFuZCBpdHMKICAvLy8gYWN0dWFsIGxvY2F0aW9uIGlzIFtmaWxlVXJpXS4KICAvLy8KICAvLy8gQ2Fub25pY2FsIFVSSXMgaGF2ZSBzY2hlbWVzIGxpa2UgImRhcnQiLCBvciAicGFja2FnZSIsIGFuZCB0aGUgYWN0dWFsCiAgLy8vIGxvY2F0aW9uIGlzIG9mdGVuIGEgZmlsZSBVUkkuCiAgLy8vCiAgLy8vIFRoZSBbYWNjZXNzb3JdIGlzIHRoZSBsaWJyYXJ5IHRoYXQncyB0cnlpbmcgdG8gaW1wb3J0LCBleHBvcnQsIG9yIGluY2x1ZGUKICAvLy8gYXMgcGFydCBbdXJpXSwgYW5kIFtjaGFyT2Zmc2V0XSBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcKICAvLy8gZGlyZWN0aXZlLiBJZiBbYWNjZXNzb3JdIGlzbid0IGFsbG93ZWQgdG8gYWNjZXNzIFt1cmldLCBpdCdzIGEKICAvLy8gY29tcGlsZS10aW1lIGVycm9yLgogIExpYnJhcnlCdWlsZGVyIHJlYWQoVXJpIHVyaSwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtVcmkgZmlsZVVyaSwgTGlicmFyeUJ1aWxkZXIgYWNjZXNzb3IsIExpYnJhcnlCdWlsZGVyIG9yaWdpbn0pIHsKICAgIExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgPSBidWlsZGVycy5wdXRJZkFic2VudCh1cmksICgpIHsKICAgICAgaWYgKGZpbGVVcmkgIT0gbnVsbCAmJgogICAgICAgICAgKGZpbGVVcmkuc2NoZW1lID09ICJkYXJ0IiB8fAogICAgICAgICAgICAgIGZpbGVVcmkuc2NoZW1lID09ICJwYWNrYWdlIiB8fAogICAgICAgICAgICAgIGZpbGVVcmkuc2NoZW1lID09ICJkYXJ0LWV4dCIpKSB7CiAgICAgICAgZmlsZVVyaSA9IG51bGw7CiAgICAgIH0KICAgICAgaWYgKGZpbGVVcmkgPT0gbnVsbCkgewogICAgICAgIHN3aXRjaCAodXJpLnNjaGVtZSkgewogICAgICAgICAgY2FzZSAicGFja2FnZSI6CiAgICAgICAgICBjYXNlICJkYXJ0IjoKICAgICAgICAgICAgZmlsZVVyaSA9IHRhcmdldC50cmFuc2xhdGVVcmkodXJpKSA/PwogICAgICAgICAgICAgICAgbmV3IFVyaSgKICAgICAgICAgICAgICAgICAgICBzY2hlbWU6IHVudHJhbnNsYXRhYmxlVXJpU2NoZW1lLAogICAgICAgICAgICAgICAgICAgIHBhdGg6IFVyaS5lbmNvZGVDb21wb25lbnQoIiR1cmkiKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGZpbGVVcmkgPSB1cmk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0KICAgICAgICAgIHRhcmdldC5jcmVhdGVMaWJyYXJ5QnVpbGRlcih1cmksIGZpbGVVcmksIG9yaWdpbik7CiAgICAgIGlmICh1cmkuc2NoZW1lID09ICJkYXJ0IiAmJiB1cmkucGF0aCA9PSAiY29yZSIpIHsKICAgICAgICBjb3JlTGlicmFyeSA9IGxpYnJhcnk7CiAgICAgIH0KICAgICAgaWYgKGxpYnJhcnkubG9hZGVyICE9IHRoaXMpIHsKICAgICAgICBpZiAoY29yZUxpYnJhcnkgPT0gbGlicmFyeSkgewogICAgICAgICAgdGFyZ2V0LmxvYWRFeHRyYVJlcXVpcmVkTGlicmFyaWVzKHRoaXMpOwogICAgICAgIH0KICAgICAgICAvLyBUaGlzIGxpYnJhcnkgaXNuJ3Qgb3duZWQgYnkgdGhpcyBsb2FkZXIsIHNvIG5vdCBmdXJ0aGVyIHByb2Nlc3NpbmcKICAgICAgICAvLyBzaG91bGQgYmUgYXR0ZW1wdGVkLgogICAgICAgIHJldHVybiBsaWJyYXJ5OwogICAgICB9CgogICAgICB7CiAgICAgICAgLy8gQWRkIGFueSBhZGRpdGlvbmFsIGxvZ2ljIGFmdGVyIHRoaXMgYmxvY2suIFNldHRpbmcgdGhlCiAgICAgICAgLy8gZmlyc3RTb3VyY2VVcmkgYW5kIGZpcnN0IGxpYnJhcnkgc2hvdWxkIGJlIGRvbmUgYXMgZWFybHkgYXMKICAgICAgICAvLyBwb3NzaWJsZS4KICAgICAgICBmaXJzdFNvdXJjZVVyaSA/Pz0gdXJpOwogICAgICAgIGZpcnN0ID8/PSBsaWJyYXJ5OwogICAgICB9CiAgICAgIGlmIChjb3JlTGlicmFyeSA9PSBsaWJyYXJ5KSB7CiAgICAgICAgdGFyZ2V0LmxvYWRFeHRyYVJlcXVpcmVkTGlicmFyaWVzKHRoaXMpOwogICAgICB9CiAgICAgIGlmICh0YXJnZXQuYmFja2VuZFRhcmdldC5tYXlEZWZpbmVSZXN0cmljdGVkVHlwZShvcmlnaW4/LnVyaSA/PyB1cmkpKSB7CiAgICAgICAgbGlicmFyeS5tYXlJbXBsZW1lbnRSZXN0cmljdGVkVHlwZXMgPSB0cnVlOwogICAgICB9CiAgICAgIGlmICh1cmkuc2NoZW1lID09ICJkYXJ0IikgewogICAgICAgIHRhcmdldC5yZWFkUGF0Y2hGaWxlcyhsaWJyYXJ5KTsKICAgICAgfQogICAgICB1bnBhcnNlZExpYnJhcmllcy5hZGRMYXN0KGxpYnJhcnkpOwogICAgICByZXR1cm4gbGlicmFyeTsKICAgIH0pOwogICAgaWYgKGFjY2Vzc29yID09IG51bGwpIHsKICAgICAgaWYgKGJ1aWxkZXIubG9hZGVyID09IHRoaXMgJiYgZmlyc3QgIT0gYnVpbGRlciAmJiBpc1NvdXJjZUxvYWRlcikgewogICAgICAgIHVuaGFuZGxlZCgibnVsbCIsICJhY2Nlc3NvciIsIGNoYXJPZmZzZXQsIHVyaSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGJ1aWxkZXIucmVjb3JkQWNjZXNzKGNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBhY2Nlc3Nvci5maWxlVXJpKTsKICAgICAgaWYgKCFhY2Nlc3Nvci5pc1BhdGNoICYmCiAgICAgICAgICAhYWNjZXNzb3IuaXNQYXJ0ICYmCiAgICAgICAgICAhdGFyZ2V0LmJhY2tlbmRUYXJnZXQKICAgICAgICAgICAgICAuYWxsb3dQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzKGFjY2Vzc29yLnVyaSwgdXJpKSkgewogICAgICAgIGFjY2Vzc29yLmFkZFByb2JsZW0obWVzc2FnZVBsYXRmb3JtUHJpdmF0ZUxpYnJhcnlBY2Nlc3MsIGNoYXJPZmZzZXQsCiAgICAgICAgICAgIG5vTGVuZ3RoLCBhY2Nlc3Nvci5maWxlVXJpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ1aWxkZXI7CiAgfQoKICB2b2lkIGVuc3VyZUNvcmVMaWJyYXJ5KCkgewogICAgaWYgKGNvcmVMaWJyYXJ5ID09IG51bGwpIHsKICAgICAgcmVhZChVcmkucGFyc2UoImRhcnQ6Y29yZSIpLCAwLCBhY2Nlc3NvcjogZmlyc3QpOwogICAgICAvLyBUT0RPKGFza2VzYyk6IFdoZW4gYWxsIGJhY2tlbmRzIHN1cHBvcnQgc2V0IGxpdGVyYWxzLCB3ZSBubyBsb25nZXIKICAgICAgLy8gbmVlZCB0byBpbmRleCBkYXJ0OmNvbGxlY3Rpb24sIGFzIGl0IGlzIG9ubHkgbmVlZGVkIGZvciBkZXN1Z2FyaW5nIG9mCiAgICAgIC8vIGNvbnN0IHNldHMuIFdlIGNhbiByZW1vdmUgaXQgZnJvbSB0aGlzIGxpc3QgYXQgdGhhdCB0aW1lLgogICAgICByZWFkKFVyaS5wYXJzZSgiZGFydDpjb2xsZWN0aW9uIiksIDAsIGFjY2Vzc29yOiBmaXJzdCk7CiAgICAgIGFzc2VydChjb3JlTGlicmFyeSAhPSBudWxsKTsKICAgIH0KICB9CgogIEZ1dHVyZTxOdWxsPiBidWlsZEJvZGllcygpIGFzeW5jIHsKICAgIGFzc2VydChjb3JlTGlicmFyeSAhPSBudWxsKTsKICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSBpbiBidWlsZGVycy52YWx1ZXMpIHsKICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICBjdXJyZW50VXJpRm9yQ3Jhc2hSZXBvcnRpbmcgPSBsaWJyYXJ5LnVyaTsKICAgICAgICBhd2FpdCBidWlsZEJvZHkobGlicmFyeSk7CiAgICAgIH0KICAgIH0KICAgIGN1cnJlbnRVcmlGb3JDcmFzaFJlcG9ydGluZyA9IG51bGw7CiAgICBsb2dTdW1tYXJ5KHRlbXBsYXRlU291cmNlQm9keVN1bW1hcnkpOwogIH0KCiAgRnV0dXJlPE51bGw+IGJ1aWxkT3V0bGluZXMoKSBhc3luYyB7CiAgICBlbnN1cmVDb3JlTGlicmFyeSgpOwogICAgd2hpbGUgKHVucGFyc2VkTGlicmFyaWVzLmlzTm90RW1wdHkpIHsKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IHVucGFyc2VkTGlicmFyaWVzLnJlbW92ZUZpcnN0KCk7CiAgICAgIGN1cnJlbnRVcmlGb3JDcmFzaFJlcG9ydGluZyA9IGxpYnJhcnkudXJpOwogICAgICBhd2FpdCBidWlsZE91dGxpbmUobGlicmFyeSk7CiAgICB9CiAgICBjdXJyZW50VXJpRm9yQ3Jhc2hSZXBvcnRpbmcgPSBudWxsOwogICAgbG9nU3VtbWFyeShvdXRsaW5lU3VtbWFyeVRlbXBsYXRlKTsKICB9CgogIHZvaWQgbG9nU3VtbWFyeShUZW1wbGF0ZTxTdW1tYXJ5VGVtcGxhdGU+IHRlbXBsYXRlKSB7CiAgICB0aWNrZXIubG9nKChEdXJhdGlvbiBlbGFwc2VkLCBEdXJhdGlvbiBzaW5jZVN0YXJ0KSB7CiAgICAgIGludCBsaWJyYXJ5Q291bnQgPSAwOwogICAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIGxpYnJhcnlDb3VudCsrOwogICAgICB9KTsKICAgICAgZG91YmxlIG1zID0gZWxhcHNlZC5pbk1pY3Jvc2Vjb25kcyAvIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1Blck1pbGxpc2Vjb25kOwogICAgICBNZXNzYWdlIG1lc3NhZ2UgPSB0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgbGlicmFyeUNvdW50LCBieXRlQ291bnQsIG1zLCBieXRlQ291bnQgLyBtcywgbXMgLyBsaWJyYXJ5Q291bnQpOwogICAgICBwcmludCgiJHNpbmNlU3RhcnQ6ICR7bWVzc2FnZS5tZXNzYWdlfSIpOwogICAgfSk7CiAgfQoKICBGdXR1cmU8TnVsbD4gYnVpbGRPdXRsaW5lKGNvdmFyaWFudCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KTsKCiAgLy8vIEJ1aWxkcyBhbGwgdGhlIG1ldGhvZCBib2RpZXMgZm91bmQgaW4gdGhlIGdpdmVuIFtsaWJyYXJ5XS4KICBGdXR1cmU8TnVsbD4gYnVpbGRCb2R5KGNvdmFyaWFudCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KTsKCiAgLy8vIFJlZ2lzdGVyIFttZXNzYWdlXSBhcyBhIHByb2JsZW0gd2l0aCBhIHNldmVyaXR5IGRldGVybWluZWQgYnkgdGhlCiAgLy8vIGludHJpbnNpYyBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZS4KICBGb3JtYXR0ZWRNZXNzYWdlIGFkZFByb2JsZW0oCiAgICAgIE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsIFVyaSBmaWxlVXJpLAogICAgICB7Ym9vbCB3YXNIYW5kbGVkOiBmYWxzZSwKICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCwKICAgICAgU2V2ZXJpdHkgc2V2ZXJpdHksCiAgICAgIGJvb2wgcHJvYmxlbU9uTGlicmFyeTogZmFsc2V9KSB7CiAgICByZXR1cm4gYWRkTWVzc2FnZShtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIGZpbGVVcmksIHNldmVyaXR5LAogICAgICAgIHdhc0hhbmRsZWQ6IHdhc0hhbmRsZWQsCiAgICAgICAgY29udGV4dDogY29udGV4dCwKICAgICAgICBwcm9ibGVtT25MaWJyYXJ5OiBwcm9ibGVtT25MaWJyYXJ5KTsKICB9CgogIC8vLyBBbGwgbWVzc2FnZXMgcmVwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyIChlcnJvcnMsIHdhcm5pbmdzLCBldGMuKSBhcmUgcm91dGVkCiAgLy8vIHRocm91Z2ggdGhpcyBtZXRob2QuCiAgLy8vCiAgLy8vIFJldHVybnMgYSBGb3JtYXR0ZWRNZXNzYWdlIGlmIHRoZSBtZXNzYWdlIGlzIG5ldywgdGhhdCBpcywgbm90IHByZXZpb3VzbHkKICAvLy8gcmVwb3J0ZWQuIFRoaXMgaXMgaW1wb3J0YW50IGFzIHNvbWUgcGFyc2VyIGVycm9ycyBtYXkgYmUgcmVwb3J0ZWQgdXAgdG8KICAvLy8gdGhyZWUgdGltZXMgYnkgYE91dGxpbmVCdWlsZGVyYCwgYERpZXRMaXN0ZW5lcmAsIGFuZCBgQm9keUJ1aWxkZXJgLgogIC8vLyBJZiB0aGUgbWVzc2FnZSBpcyBub3QgbmV3LCBbbnVsbF0gaXMgcmVwb3J0ZWQuCiAgLy8vCiAgLy8vIElmIFtzZXZlcml0eV0gaXMgYFNldmVyaXR5LmVycm9yYCwgdGhlIG1lc3NhZ2UgaXMgYWRkZWQgdG8KICAvLy8gW2hhbmRsZWRFcnJvcnNdIGlmIFt3YXNIYW5kbGVkXSBpcyB0cnVlIG9yIHRvIFt1bmhhbmRsZWRFcnJvcnNdIGlmCiAgLy8vIFt3YXNIYW5kbGVkXSBpcyBmYWxzZS4KICBGb3JtYXR0ZWRNZXNzYWdlIGFkZE1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwKICAgICAgVXJpIGZpbGVVcmksIFNldmVyaXR5IHNldmVyaXR5LAogICAgICB7Ym9vbCB3YXNIYW5kbGVkOiBmYWxzZSwKICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCwKICAgICAgYm9vbCBwcm9ibGVtT25MaWJyYXJ5OiBmYWxzZX0pIHsKICAgIHNldmVyaXR5ID0gdGFyZ2V0LmZpeFNldmVyaXR5KHNldmVyaXR5LCBtZXNzYWdlLCBmaWxlVXJpKTsKICAgIGlmIChzZXZlcml0eSA9PSBTZXZlcml0eS5pZ25vcmVkKSByZXR1cm4gbnVsbDsKICAgIFN0cmluZyB0cmFjZSA9ICIiIgptZXNzYWdlOiAke21lc3NhZ2UubWVzc2FnZX0KY2hhck9mZnNldDogJGNoYXJPZmZzZXQKZmlsZVVyaTogJGZpbGVVcmkKc2V2ZXJpdHk6ICRzZXZlcml0eQoiIiI7CiAgICAvLyBUT0RPKGFza2VzYyk6IFN3YXAgbWVzc2FnZSBhbmQgY29udGV4dCBhcm91bmQgZm9yIGludGVyZmFjZSBjaGVja3MKICAgIC8vIGFuZCBtaXhpbiBvdmVycmlkZXMgdG8gbWFrZSBjb21wYXJpbmcgY29udGV4dCBoZXJlIHVubmVjZXNzYXJ5LgogICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewogICAgICBmb3IgKExvY2F0ZWRNZXNzYWdlIGNvbnRleHRNZXNzYWdlIGluIGNvbnRleHQpIHsKICAgICAgICB0cmFjZSArPSAiIiIKbWVzc2FnZTogJHtjb250ZXh0TWVzc2FnZS5tZXNzYWdlfQpjaGFyT2Zmc2V0OiAke2NvbnRleHRNZXNzYWdlLmNoYXJPZmZzZXR9CmZpbGVVcmk6ICR7Y29udGV4dE1lc3NhZ2UudXJpfQoiIiI7CiAgICAgIH0KICAgIH0KICAgIGlmICghc2Vlbk1lc3NhZ2VzLmFkZCh0cmFjZSkpIHJldHVybiBudWxsOwogICAgaWYgKG1lc3NhZ2UuY29kZS5zZXZlcml0eSA9PSBTZXZlcml0eS5jb250ZXh0KSB7CiAgICAgIGludGVybmFsUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtQ29udGV4dFNldmVyaXR5CiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobWVzc2FnZS5jb2RlLm5hbWUpLAogICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgIGZpbGVVcmkpOwogICAgfQogICAgdGFyZ2V0LmNvbnRleHQucmVwb3J0KAogICAgICAgIG1lc3NhZ2Uud2l0aExvY2F0aW9uKGZpbGVVcmksIGNoYXJPZmZzZXQsIGxlbmd0aCksIHNldmVyaXR5LAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQpOwogICAgaWYgKHNldmVyaXR5ID09IFNldmVyaXR5LmVycm9yKSB7CiAgICAgICh3YXNIYW5kbGVkID8gaGFuZGxlZEVycm9ycyA6IHVuaGFuZGxlZEVycm9ycykKICAgICAgICAgIC5hZGQobWVzc2FnZS53aXRoTG9jYXRpb24oZmlsZVVyaSwgY2hhck9mZnNldCwgbGVuZ3RoKSk7CiAgICB9CiAgICBGb3JtYXR0ZWRNZXNzYWdlIGZvcm1hdHRlZE1lc3NhZ2UgPSB0YXJnZXQuY3JlYXRlRm9ybWF0dGVkTWVzc2FnZSgKICAgICAgICBtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIGZpbGVVcmksIGNvbnRleHQsIHNldmVyaXR5KTsKICAgIGlmICghcHJvYmxlbU9uTGlicmFyeSkgewogICAgICBhbGxDb21wb25lbnRQcm9ibGVtcy5hZGQoZm9ybWF0dGVkTWVzc2FnZSk7CiAgICB9CiAgICByZXR1cm4gZm9ybWF0dGVkTWVzc2FnZTsKICB9CgogIERlY2xhcmF0aW9uIGdldEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IoKSB7CiAgICByZXR1cm4gdGFyZ2V0LmdldEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IodGhpcyk7CiAgfQoKICBEZWNsYXJhdGlvbiBnZXRDb21waWxlVGltZUVycm9yKCkgPT4gdGFyZ2V0LmdldENvbXBpbGVUaW1lRXJyb3IodGhpcyk7CgogIERlY2xhcmF0aW9uIGdldER1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3IoKSB7CiAgICByZXR1cm4gdGFyZ2V0LmdldER1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3IodGhpcyk7CiAgfQoKICBEZWNsYXJhdGlvbiBnZXROYXRpdmVBbm5vdGF0aW9uKCkgPT4gdGFyZ2V0LmdldE5hdGl2ZUFubm90YXRpb24odGhpcyk7CgogIENsYXNzQnVpbGRlciBjb21wdXRlQ2xhc3NCdWlsZGVyRnJvbVRhcmdldENsYXNzKGNvdmFyaWFudCBPYmplY3QgY2xzKTsKCiAgVHlwZUJ1aWxkZXIgY29tcHV0ZVR5cGVCdWlsZGVyKGNvdmFyaWFudCBPYmplY3QgdHlwZSk7Cn0KgTkATk48ARYBIQElAS8BHkEBKQEXCRoYERIZEi0wIwE4ASYBPwEiAUoBGEUBTwEvASUBThYGSzNBAVAWBkMXQwFPLUwBNgEeAUtQGAEVASMBFwEmATgBJAFGTCQGTCQGUEtFGi9HPB0nLS8YCB0eGhcyGTU4EwETGxMKCB89OB8IJCYzCk4gGAgBCEJHFSAbCCQxCE40CCIoCCoWCBxKOAgNRB8eIEdNKQgGFAQBHR84TE9DPiMGBAElITYkMyIIBigrBAEnGStAMSMGKCgEATg5HDs0ClAwSzAIBAE/AUE8AUgpH0AfJBknRiAaLQQBUBsGUE5KNQZBSR1LJh8kJz8zFxwYEhQFSkcbNxUjKR8FCAYvNRcxMRYUBhtFGyY1QwZHQh0yBh0EATU8BAFJATU8BAFJAUkBOQIBJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9sb2FkZXIuZGFydEJzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc2Nhbm5lci9hYnN0cmFjdF9zY2FubmVyLmRhcnTAAOb4Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuc2Nhbm5lci5hYnN0cmFjdF9zY2FubmVyOwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nIHNob3cgTGlzdE1peGluOwoKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDE2TGlzdCwgVWludDMyTGlzdDsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JwogICAgc2hvdyBCZWdpblRva2VuLCBLZXl3b3JkLCBLZXl3b3JkVG9rZW4sIFN5bnRoZXRpY1Rva2VuLCBUb2tlbiwgVG9rZW5UeXBlOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIGFzIGFuYWx5emVyIHNob3cgU3RyaW5nVG9rZW47CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgbWVzc2FnZUV4cGVjdGVkSGV4RGlnaXQsCiAgICAgICAgbWVzc2FnZU1pc3NpbmdFeHBvbmVudCwKICAgICAgICBtZXNzYWdlVW5leHBlY3RlZERvbGxhckluU3RyaW5nLAogICAgICAgIG1lc3NhZ2VVbnRlcm1pbmF0ZWRDb21tZW50OwoKaW1wb3J0ICcuLi9zY2FubmVyLmRhcnQnCiAgICBzaG93IEVycm9yVG9rZW4sIEtleXdvcmQsIFNjYW5uZXIsIGJ1aWxkVW5leHBlY3RlZENoYXJhY3RlclRva2VuOwoKaW1wb3J0ICcuLi91dGlsL2xpbmsuZGFydCcgc2hvdyBMaW5rOwoKaW1wb3J0ICdlcnJvcl90b2tlbi5kYXJ0JwogICAgc2hvdwogICAgICAgIE5vbkFzY2lpSWRlbnRpZmllclRva2VuLAogICAgICAgIFVubWF0Y2hlZFRva2VuLAogICAgICAgIFVuc3VwcG9ydGVkT3BlcmF0b3IsCiAgICAgICAgVW50ZXJtaW5hdGVkU3RyaW5nLAogICAgICAgIFVudGVybWluYXRlZFRva2VuOwoKaW1wb3J0ICdrZXl3b3JkX3N0YXRlLmRhcnQnIHNob3cgS2V5d29yZFN0YXRlOwoKaW1wb3J0ICd0b2tlbi5kYXJ0JwogICAgc2hvdyBDb21tZW50VG9rZW4sIERhcnREb2NUb2tlbiwgTGFuZ3VhZ2VWZXJzaW9uVG9rZW4sIFN0cmluZ1Rva2VuOwoKaW1wb3J0ICd0b2tlbl9jb25zdGFudHMuZGFydCc7CgppbXBvcnQgJ2NoYXJhY3RlcnMuZGFydCc7Cgp0eXBlZGVmIHZvaWQgTGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZCgKICAgIFNjYW5uZXIgc2Nhbm5lciwgTGFuZ3VhZ2VWZXJzaW9uVG9rZW4gbGFuZ3VhZ2VWZXJzaW9uKTsKCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2Nhbm5lciBpbXBsZW1lbnRzIFNjYW5uZXIgewogIC8qKgogICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgY2hhcmFjdGVyIHNlcXVlbmNlcyBgJiY9YCBhbmQgYHx8PWAKICAgKiBzaG91bGQgYmUgdG9rZW5pemVkIGFzIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9ycwogICAqIFtBTVBFUlNBTkRfQU1QRVJTQU5EX0VRX1RPS0VOXSBhbmQgW0JBUl9CQVJfRVFfVE9LRU5dIHJlc3BlY3RpdmVseS4KICAgKiBTZWUgaXNzdWUgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzMwMzQwCiAgICovCiAgc3RhdGljIGNvbnN0IGJvb2wgTEFaWV9BU1NJR05NRU5UX0VOQUJMRUQgPSBmYWxzZTsKCiAgZmluYWwgYm9vbCBpbmNsdWRlQ29tbWVudHM7CgogIC8vLyBDYWxsZWQgd2hlbiB0aGUgc2Nhbm5lciBkZXRlY3RzIGEgbGFuZ3VhZ2UgdmVyc2lvbiBjb21tZW50CiAgLy8vIHNvIHRoYXQgdGhlIGxpc3RlbmVyIGNhbiB1cGRhdGUgdGhlIHNjYW5uZXIgY29uZmlndXJhdGlvbgogIC8vLyBiYXNlZCB1cG9uIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UgdmVyc2lvbi4KICBmaW5hbCBMYW5ndWFnZVZlcnNpb25DaGFuZ2VkIGxhbmd1YWdlVmVyc2lvbkNoYW5nZWQ7CgogIC8vLyBFeHBlcmltZW50YWwgZmxhZyBmb3IgZW5hYmxpbmcgc2Nhbm5pbmcgb2YgdGhlIGBleHRlbnNpb25gIHRva2VuLgogIGJvb2wgX2VuYWJsZUV4dGVuc2lvbk1ldGhvZHMgPSBmYWxzZTsKCiAgLy8vIEV4cGVyaW1lbnRhbCBmbGFnIGZvciBlbmFibGluZyBzY2FubmluZyBvZiBOTkJEIHRva2VucwogIC8vLyBzdWNoIGFzICdyZXF1aXJlZCcgYW5kICdsYXRlJy4KICBib29sIF9lbmFibGVOb25OdWxsYWJsZSA9IGZhbHNlOwoKICAvLy8gRXhwZXJpbWVudGFsIGZsYWcgZm9yIGVuYWJsaW5nIHNjYW5uaW5nIG9mIGA+Pj5gLgogIC8vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9sYW5ndWFnZS9pc3N1ZXMvNjEKICAvLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvbGFuZ3VhZ2UvaXNzdWVzLzYwCiAgYm9vbCBfZW5hYmxlVHJpcGxlU2hpZnQgPSBmYWxzZTsKCiAgLyoqCiAgICogVGhlIHN0cmluZyBvZmZzZXQgZm9yIHRoZSBuZXh0IHRva2VuIHRoYXQgd2lsbCBiZSBjcmVhdGVkLgogICAqCiAgICogTm90ZSB0aGF0IGluIHRoZSBbVXRmOEJ5dGVzU2Nhbm5lcl0sIFtzdHJpbmdPZmZzZXRdIGFuZCBbc2Nhbk9mZnNldF0gdmFsdWVzCiAgICogYXJlIGRpZmZlcmVudC4gT25lIHN0cmluZyBjaGFyYWN0ZXIgY2FuIGJlIGVuY29kZWQgdXNpbmcgbXVsdGlwbGUgVVRGLTgKICAgKiBieXRlcy4KICAgKi8KICBpbnQgdG9rZW5TdGFydCA9IC0xOwoKICAvKioKICAgKiBBIHBvaW50ZXIgdG8gdGhlIHRva2VuIHN0cmVhbSBjcmVhdGVkIGJ5IHRoaXMgc2Nhbm5lci4gVGhlIGZpcnN0IHRva2VuCiAgICogaXMgYSBzcGVjaWFsIHRva2VuIGFuZCBub3QgcGFydCBvZiB0aGUgc291cmNlIGZpbGUuIFRoaXMgaXMgYW4KICAgKiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgdG8gYXZvaWRzIHNwZWNpYWwgY2FzZXMgaW4gdGhlIHNjYW5uZXIuIFRoaXMgdG9rZW4KICAgKiBpcyBub3QgZXhwb3NlZCB0byBjbGllbnRzIG9mIHRoZSBzY2FubmVyLCB3aGljaCBhcmUgZXhwZWN0ZWQgdG8gaW52b2tlCiAgICogW2ZpcnN0VG9rZW5dIHRvIGFjY2VzcyB0aGUgdG9rZW4gc3RyZWFtLgogICAqLwogIGZpbmFsIFRva2VuIHRva2VucyA9IG5ldyBUb2tlbi5lb2YoLTEpOwoKICAvKioKICAgKiBBIHBvaW50ZXIgdG8gdGhlIGxhc3Qgc2Nhbm5lZCB0b2tlbi4KICAgKi8KICBUb2tlbiB0YWlsOwoKICAvKioKICAgKiBBIHBvaW50ZXIgdG8gdGhlIGxhc3QgcHJlcGVuZGVkIGVycm9yIHRva2VuLgogICAqLwogIFRva2VuIGVycm9yVGFpbDsKCiAgYm9vbCBoYXNFcnJvcnMgPSBmYWxzZTsKCiAgLyoqCiAgICogQSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gb2YgY29tbWVudCB0b2tlbnMgY3JlYXRlZCBieSB0aGlzIHNjYW5uZXIKICAgKiBiZWZvcmUgdGhleSBhcmUgYXNzaWduZWQgdG8gdGhlIFtUb2tlbl0gcHJlY2VkaW5nQ29tbWVudHMgZmllbGQKICAgKiBvZiBhIG5vbi1jb21tZW50IHRva2VuLiBBIHZhbHVlIG9mIGBudWxsYCBpbmRpY2F0ZXMgbm8gY29tbWVudCB0b2tlbnMuCiAgICovCiAgQ29tbWVudFRva2VuIGNvbW1lbnRzOwoKICAvKioKICAgKiBBIHBvaW50ZXIgdG8gdGhlIGxhc3Qgc2Nhbm5lZCBjb21tZW50IHRva2VuIG9yIGBudWxsYCBpZiBub25lLgogICAqLwogIFRva2VuIGNvbW1lbnRzVGFpbDsKCiAgZmluYWwgTGlzdDxpbnQ+IGxpbmVTdGFydHM7CgogIC8qKgogICAqIFRoZSBzdGFjayBvZiBvcGVuIGdyb3VwcywgZS5nIFs6IHsgLi4uICggLi4gOl0KICAgKiBFYWNoIEJlZ2luVG9rZW4gaGFzIGEgcG9pbnRlciB0byB0aGUgdG9rZW4gd2hlcmUgdGhlIGdyb3VwCiAgICogZW5kcy4gVGhpcyBmaWVsZCBpcyBzZXQgd2hlbiBzY2FubmluZyB0aGUgZW5kIGdyb3VwIHRva2VuLgogICAqLwogIExpbms8QmVnaW5Ub2tlbj4gZ3JvdXBpbmdTdGFjayA9IGNvbnN0IExpbms8QmVnaW5Ub2tlbj4oKTsKCiAgQWJzdHJhY3RTY2FubmVyKFNjYW5uZXJDb25maWd1cmF0aW9uIGNvbmZpZywgdGhpcy5pbmNsdWRlQ29tbWVudHMsCiAgICAgIHRoaXMubGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZCwKICAgICAge2ludCBudW1iZXJPZkJ5dGVzSGludH0pCiAgICAgIDogbGluZVN0YXJ0cyA9IG5ldyBMaW5lU3RhcnRzKG51bWJlck9mQnl0ZXNIaW50KSB7CiAgICB0aGlzLnRhaWwgPSB0aGlzLnRva2VuczsKICAgIHRoaXMuZXJyb3JUYWlsID0gdGhpcy50b2tlbnM7CiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWc7CiAgfQoKICBAb3ZlcnJpZGUKICBzZXQgY29uZmlndXJhdGlvbihTY2FubmVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKICAgIGlmIChjb25maWcgIT0gbnVsbCkgewogICAgICBfZW5hYmxlRXh0ZW5zaW9uTWV0aG9kcyA9IGNvbmZpZy5lbmFibGVFeHRlbnNpb25NZXRob2RzOwogICAgICBfZW5hYmxlTm9uTnVsbGFibGUgPSBjb25maWcuZW5hYmxlTm9uTnVsbGFibGU7CiAgICAgIF9lbmFibGVUcmlwbGVTaGlmdCA9IGNvbmZpZy5lbmFibGVUcmlwbGVTaGlmdDsKICAgIH0KICB9CgogIC8qKgogICAqIEFkdmFuY2VzIGFuZCByZXR1cm5zIHRoZSBuZXh0IGNoYXJhY3Rlci4KICAgKgogICAqIElmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBub24tQVNDSUksIHRoZW4gdGhlIHJldHVybmVkIHZhbHVlIGRlcGVuZHMgb24gdGhlCiAgICogc2Nhbm5lciBpbXBsZW1lbnRhdGlvbi4gVGhlIFtVdGY4Qnl0ZXNTY2FubmVyXSByZXR1cm5zIGEgVVRGLTggYnl0ZSwgd2hpbGUKICAgKiB0aGUgW1N0cmluZ1NjYW5uZXJdIHJldHVybnMgYSBVVEYtMTYgY29kZSB1bml0LgogICAqCiAgICogVGhlIHNjYW5uZXIgZW5zdXJlcyB0aGF0IFthZHZhbmNlXSBpcyBub3QgaW52b2tlZCBhZnRlciBpdCByZXR1cm5lZCBbJEVPRl0uCiAgICogVGhpcyBhbGxvd3MgaW1wbGVtZW50YXRpb25zIHRvIG9taXQgYm91bmQgY2hlY2tzIGlmIHRoZSBkYXRhIHN0cnVjdHVyZSBlbmRzCiAgICogd2l0aCAnMCcuCiAgICovCiAgaW50IGFkdmFuY2UoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgY3VycmVudCB1bmljb2RlIGNoYXJhY3Rlci4KICAgKgogICAqIElmIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBBU0NJSSwgdGhlbiBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCiAgICoKICAgKiBUaGUgW1V0ZjhCeXRlc1NjYW5uZXJdIGRlY29kZXMgdGhlIG5leHQgdW5pY29kZSBjb2RlIHBvaW50IHN0YXJ0aW5nIGF0IHRoZQogICAqIGN1cnJlbnQgcG9zaXRpb24uIE5vdGUgdGhhdCBldmVyeSB1bmljb2RlIGNoYXJhY3RlciBpcyByZXR1cm5lZCBhcyBhIHNpbmdsZQogICAqIGNvZGUgcG9pbnQsIHRoYXQgaXMsIGZvciAnXHV7MWQxMWV9JyBpdCByZXR1cm5zIDExOTA3MCwgYW5kIHRoZSBmb2xsb3dpbmcKICAgKiBbYWR2YW5jZV0gcmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIuCiAgICoKICAgKiBUaGUgW1N0cmluZ1NjYW5uZXJdIHJldHVybnMgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIHVuY2hhbmdlZCwgd2hpY2ggbWlnaHQKICAgKiBiZSBhIHN1cnJvZ2F0ZSBjaGFyYWN0ZXIuIEluIHRoZSBjYXNlIG9mICdcdXsxZDExZX0nLCBpdCByZXR1cm5zIHRoZSBmaXJzdAogICAqIGNvZGUgdW5pdCA1NTM0OCwgYW5kIHRoZSBmb2xsb3dpbmcgW2FkdmFuY2VdIHJldHVybnMgdGhlIHNlY29uZCBjb2RlIHVuaXQKICAgKiA1NjYwNi4KICAgKgogICAqIEludm9raW5nIFtjdXJyZW50QXNVbmljb2RlXSBtdWx0aXBsZSB0aW1lcyBpcyBzYWZlLCBpLmUuLAogICAqIFs6Y3VycmVudEFzVW5pY29kZShuZXh0KSA9PSBjdXJyZW50QXNVbmljb2RlKGN1cnJlbnRBc1VuaWNvZGUobmV4dCkpOl0uCiAgICovCiAgaW50IGN1cnJlbnRBc1VuaWNvZGUoaW50IG5leHQpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIG5leHQgcG9zaXRpb24uIExpa2UgaW4gW2FkdmFuY2VdLCB0aGUKICAgKiBbVXRmOEJ5dGVzU2Nhbm5lcl0gcmV0dXJucyBhIFVURi04IGJ5dGUsIHdoaWxlIHRoZSBbU3RyaW5nU2Nhbm5lcl0gcmV0dXJucwogICAqIGEgVVRGLTE2IGNvZGUgdW5pdC4KICAgKi8KICBpbnQgcGVlaygpOwoKICAvKioKICAgKiBOb3RpZmllcyB0aGUgc2Nhbm5lciB0aGF0IHVuaWNvZGUgY2hhcmFjdGVycyB3ZXJlIGRldGVjdGVkIGluIGVpdGhlciBhCiAgICogY29tbWVudCBvciBhIHN0cmluZyBsaXRlcmFsIGJldHdlZW4gW3N0YXJ0U2Nhbk9mZnNldF0gYW5kIHRoZSBjdXJyZW50CiAgICogc2NhbiBvZmZzZXQuCiAgICovCiAgdm9pZCBoYW5kbGVVbmljb2RlKGludCBzdGFydFNjYW5PZmZzZXQpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNjYW4gb2Zmc2V0LgogICAqCiAgICogSW4gdGhlIFtVdGY4Qnl0ZXNTY2FubmVyXSB0aGlzIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgYnl0ZSBsaXN0LCBpbiB0aGUKICAgKiBbU3RyaW5nU2Nhbm5lcl0gdGhlIG9mZnNldCBpbiB0aGUgc291cmNlIHN0cmluZy4KICAgKi8KICBpbnQgZ2V0IHNjYW5PZmZzZXQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RyaW5nIG9mZnNldC4KICAgKgogICAqIEluIHRoZSBbU3RyaW5nU2Nhbm5lcl0gdGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIFtzY2FuT2Zmc2V0XS4gSW4gdGhlCiAgICogW1V0ZjhCeXRlc1NjYW5uZXJdIGl0IGlzIGNvbXB1dGVkIGJhc2VkIG9uIGVuY291bnRlcmVkIFVURi04IGNoYXJhY3RlcnMuCiAgICovCiAgaW50IGdldCBzdHJpbmdPZmZzZXQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZpcnN0IHRva2VuIHNjYW5uZWQgYnkgdGhpcyBbU2Nhbm5lcl0uCiAgICovCiAgVG9rZW4gZmlyc3RUb2tlbigpID0+IHRva2Vucy5uZXh0OwoKICAvKioKICAgKiBOb3RpZmllcyB0aGF0IGEgbmV3IHRva2VuIHN0YXJ0cyBhdCBjdXJyZW50IG9mZnNldC4KICAgKi8KICB2b2lkIGJlZ2luVG9rZW4oKSB7CiAgICB0b2tlblN0YXJ0ID0gc3RyaW5nT2Zmc2V0OwogIH0KCiAgLyoqCiAgICogQXBwZW5kcyBhIHN1YnN0cmluZyBmcm9tIHRoZSBzY2FuIG9mZnNldCBbOnN0YXJ0Ol0gdG8gdGhlIGN1cnJlbnQKICAgKiBbOnNjYW5PZmZzZXQ6XSBwbHVzIHRoZSBbOmV4dHJhT2Zmc2V0Ol0uIEZvciBleGFtcGxlLCBpZiB0aGUgY3VycmVudAogICAqIHNjYW5PZmZzZXQgaXMgMTAsIHRoZW4gWzphcHBlbmRTdWJzdHJpbmdUb2tlbig1LCAtMSk6XSB3aWxsIGFwcGVuZCB0aGUKICAgKiBzdWJzdHJpbmcgc3RyaW5nIFs1LDkpLgogICAqCiAgICogTm90ZSB0aGF0IFtleHRyYU9mZnNldF0gY2FuIG9ubHkgYmUgdXNlZCBpZiB0aGUgY292ZXJlZCBjaGFyYWN0ZXIocykgYXJlCiAgICoga25vd24gdG8gYmUgQVNDSUkuCiAgICovCiAgdm9pZCBhcHBlbmRTdWJzdHJpbmdUb2tlbihUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwKICAgICAgW2ludCBleHRyYU9mZnNldCA9IDBdKSB7CiAgICBhcHBlbmRUb2tlbihjcmVhdGVTdWJzdHJpbmdUb2tlbih0eXBlLCBzdGFydCwgYXNjaWlPbmx5LCBleHRyYU9mZnNldCkpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBzdWJzdHJpbmcgZnJvbSB0aGUgc2NhbiBvZmZzZXQgW3N0YXJ0XSB0byB0aGUgY3VycmVudAogICAqIFtzY2FuT2Zmc2V0XSBwbHVzIHRoZSBbZXh0cmFPZmZzZXRdLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQKICAgKiBzY2FuT2Zmc2V0IGlzIDEwLCB0aGVuIFthcHBlbmRTdWJzdHJpbmdUb2tlbig1LCAtMSldIHdpbGwgYXBwZW5kIHRoZQogICAqIHN1YnN0cmluZyBzdHJpbmcgWzUsOSkuCiAgICoKICAgKiBOb3RlIHRoYXQgW2V4dHJhT2Zmc2V0XSBjYW4gb25seSBiZSB1c2VkIGlmIHRoZSBjb3ZlcmVkIGNoYXJhY3RlcihzKSBhcmUKICAgKiBrbm93biB0byBiZSBBU0NJSS4KICAgKi8KICBhbmFseXplci5TdHJpbmdUb2tlbiBjcmVhdGVTdWJzdHJpbmdUb2tlbigKICAgICAgVG9rZW5UeXBlIHR5cGUsIGludCBzdGFydCwgYm9vbCBhc2NpaU9ubHksCiAgICAgIFtpbnQgZXh0cmFPZmZzZXQgPSAwXSk7CgogIC8qKgogICAqIEFwcGVuZHMgYSBzdWJzdHJpbmcgZnJvbSB0aGUgc2NhbiBvZmZzZXQgW3N0YXJ0XSB0byB0aGUgY3VycmVudAogICAqIFtzY2FuT2Zmc2V0XSBwbHVzIFtzeW50aGV0aWNDaGFyc10uIFRoZSBhZGRpdGlvbmFsIGNoYXIocykgd2lsbCBiZSBhZGRlZAogICAqIHRvIHRoZSB1bnRlcm1pbmF0ZWQgc3RyaW5nIGxpdGVyYWwncyBsZXhlbWUgYnV0IHRoZSByZXR1cm5lZAogICAqIHRva2VuJ3MgbGVuZ3RoIHdpbGwgKm5vdCogaW5jbHVkZSB0aG9zZSBhZGRpdGlvbmFsIGNoYXIocykKICAgKiBzbyBhcyB0byBiZSB0cnVlIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UuCiAgICovCiAgdm9pZCBhcHBlbmRTeW50aGV0aWNTdWJzdHJpbmdUb2tlbigKICAgICAgVG9rZW5UeXBlIHR5cGUsIGludCBzdGFydCwgYm9vbCBhc2NpaU9ubHksIFN0cmluZyBzeW50aGV0aWNDaGFycykgewogICAgYXBwZW5kVG9rZW4oCiAgICAgICAgY3JlYXRlU3ludGhldGljU3Vic3RyaW5nVG9rZW4odHlwZSwgc3RhcnQsIGFzY2lpT25seSwgc3ludGhldGljQ2hhcnMpKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgc3ludGhldGljIHN1YnN0cmluZyBmcm9tIHRoZSBzY2FuIG9mZnNldCBbc3RhcnRdCiAgICogdG8gdGhlIGN1cnJlbnQgW3NjYW5PZmZzZXRdIHBsdXMgdGhlIFtzeW50aGV0aWNDaGFyc10uCiAgICogVGhlIFtzeW50aGV0aWNDaGFyc10gYXJlIGFwcGVuZGVkIHRvIHRoZSB1bnRlcm1pbmF0ZWQgc3RyaW5nCiAgICogbGl0ZXJhbCdzIGxleGVtZSBidXQgdGhlIHJldHVybmVkIHRva2VuJ3MgbGVuZ3RoIHdpbGwgKm5vdCogaW5jbHVkZQogICAqIHRob3NlIGFkZGl0aW9uYWwgY2hhcmFjdGVycyBzbyBhcyB0byBiZSB0cnVlIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UuCiAgICovCiAgYW5hbHl6ZXIuU3RyaW5nVG9rZW4gY3JlYXRlU3ludGhldGljU3Vic3RyaW5nVG9rZW4oCiAgICAgIFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LCBTdHJpbmcgc3ludGhldGljQ2hhcnMpOwogIC8qKgogICAqIEFwcGVuZHMgYSBmaXhlZCB0b2tlbiB3aG9zZSBraW5kIGFuZCBjb250ZW50IGlzIGRldGVybWluZWQgYnkgW3R5cGVdLgogICAqIEFwcGVuZHMgYW4gKm9wZXJhdG9yKiB0b2tlbiBmcm9tIFt0eXBlXS4KICAgKgogICAqIEFuIG9wZXJhdG9yIHRva2VuIHJlcHJlc2VudCBvcGVyYXRvcnMgbGlrZSAnOicsICcuJywgJzsnLCAnJiYnLCAnPT0nLCAnLS0nLAogICAqICc9PicsIGV0Yy4KICAgKi8KICB2b2lkIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUgdHlwZSkgewogICAgYXBwZW5kVG9rZW4obmV3IFRva2VuKHR5cGUsIHRva2VuU3RhcnQsIGNvbW1lbnRzKSk7CiAgfQoKICAvKioKICAgKiBBcHBlbmRzIGEgZml4ZWQgdG9rZW4gYmFzZWQgb24gd2hldGhlciB0aGUgY3VycmVudCBjaGFyIGlzIFtjaG9pY2VdIG9yIG5vdC4KICAgKiBJZiB0aGUgY3VycmVudCBjaGFyIGlzIFtjaG9pY2VdIGEgZml4ZWQgdG9rZW4gd2hvc2Uga2luZCBhbmQgY29udGVudAogICAqIGlzIGRldGVybWluZWQgYnkgW3llc10gaXMgYXBwZW5kZWQsIG90aGVyd2lzZSBhIGZpeGVkIHRva2VuIHdob3NlIGtpbmQKICAgKiBhbmQgY29udGVudCBpcyBkZXRlcm1pbmVkIGJ5IFtub10gaXMgYXBwZW5kZWQuCiAgICovCiAgaW50IHNlbGVjdChpbnQgY2hvaWNlLCBUb2tlblR5cGUgeWVzLCBUb2tlblR5cGUgbm8pIHsKICAgIGludCBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbChuZXh0LCBjaG9pY2UpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbih5ZXMpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfSBlbHNlIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKG5vKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgfQoKICAvKioKICAgKiBBcHBlbmRzIGEga2V5d29yZCB0b2tlbiB3aG9zZSBraW5kIGlzIGRldGVybWluZWQgYnkgW2tleXdvcmRdLgogICAqLwogIHZvaWQgYXBwZW5kS2V5d29yZFRva2VuKEtleXdvcmQga2V5d29yZCkgewogICAgU3RyaW5nIHN5bnRheCA9IGtleXdvcmQubGV4ZW1lOwogICAgLy8gVHlwZSBwYXJhbWV0ZXJzIGFuZCBhcmd1bWVudHMgY2Fubm90IGNvbnRhaW4gJ3RoaXMnLgogICAgaWYgKGlkZW50aWNhbChzeW50YXgsICd0aGlzJykpIHsKICAgICAgZGlzY2FyZE9wZW5MdCgpOwogICAgfQogICAgYXBwZW5kVG9rZW4obmV3IEtleXdvcmRUb2tlbihrZXl3b3JkLCB0b2tlblN0YXJ0LCBjb21tZW50cykpOwogIH0KCiAgdm9pZCBhcHBlbmRFb2ZUb2tlbigpIHsKICAgIGJlZ2luVG9rZW4oKTsKICAgIGRpc2NhcmRPcGVuTHQoKTsKICAgIHdoaWxlICghZ3JvdXBpbmdTdGFjay5pc0VtcHR5KSB7CiAgICAgIHVubWF0Y2hlZEJlZ2luR3JvdXAoZ3JvdXBpbmdTdGFjay5oZWFkKTsKICAgICAgZ3JvdXBpbmdTdGFjayA9IGdyb3VwaW5nU3RhY2sudGFpbDsKICAgIH0KICAgIGFwcGVuZFRva2VuKG5ldyBUb2tlbi5lb2YodG9rZW5TdGFydCwgY29tbWVudHMpKTsKICB9CgogIC8qKgogICAqIE5vdGlmaWVzIHNjYW5uaW5nIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuIE5vdGUgdGhhdCBbYXBwZW5kV2hpdGVTcGFjZV0gaXMKICAgKiBub3QgYWx3YXlzIGludm9rZWQgZm9yIFskU1BBQ0VdIGNoYXJhY3RlcnMuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBzY2FubmVycyB0byB0cmFjayBsaW5lIGJyZWFrcyBhbmQgY3JlYXRlIHRoZQogICAqIFtsaW5lU3RhcnRzXSBtYXAuCiAgICovCiAgdm9pZCBhcHBlbmRXaGl0ZVNwYWNlKGludCBuZXh0KSB7CiAgICBpZiAobmV4dCA9PSAkTEYpIHsKICAgICAgbGluZVN0YXJ0cy5hZGQoc3RyaW5nT2Zmc2V0ICsgMSk7IC8vICsxLCB0aGUgbGluZSBzdGFydHMgYWZ0ZXIgdGhlICRMRi4KICAgIH0KICB9CgogIC8qKgogICAqIE5vdGlmaWVzIG9uIFskTEZdIGNoYXJhY3RlcnMgaW4gbXVsdGktbGluZSBjb21tZW50cyBvciBzdHJpbmdzLgogICAqCiAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSB0aGUgc2Nhbm5lcnMgdG8gdHJhY2sgbGluZSBicmVha3MgYW5kIGNyZWF0ZSB0aGUKICAgKiBbbGluZVN0YXJ0c10gbWFwLgogICAqLwogIHZvaWQgbGluZUZlZWRJbk11bHRpbGluZSgpIHsKICAgIGxpbmVTdGFydHMuYWRkKHN0cmluZ09mZnNldCArIDEpOwogIH0KCiAgLyoqCiAgICogQXBwZW5kcyBhIHRva2VuIHRoYXQgYmVnaW5zIGEgbmV3IGdyb3VwLCByZXByZXNlbnRlZCBieSBbdHlwZV0uCiAgICogR3JvdXAgYmVnaW4gdG9rZW5zIGFyZSAneycsICcoJywgJ1snLCAnPCcgYW5kICckeycuCiAgICovCiAgdm9pZCBhcHBlbmRCZWdpbkdyb3VwKFRva2VuVHlwZSB0eXBlKSB7CiAgICBUb2tlbiB0b2tlbiA9IG5ldyBCZWdpblRva2VuKHR5cGUsIHRva2VuU3RhcnQsIGNvbW1lbnRzKTsKICAgIGFwcGVuZFRva2VuKHRva2VuKTsKCiAgICAvLyB7IFsgJHsgY2Fubm90IGFwcGVhciBpbnNpZGUgYSB0eXBlIHBhcmFtZXRlcnMgLyBhcmd1bWVudHMuCiAgICBpZiAoIWlkZW50aWNhbCh0eXBlLmtpbmQsIExUX1RPS0VOKSAmJgogICAgICAgICFpZGVudGljYWwodHlwZS5raW5kLCBPUEVOX1BBUkVOX1RPS0VOKSkgewogICAgICBkaXNjYXJkT3Blbkx0KCk7CiAgICB9CiAgICBncm91cGluZ1N0YWNrID0gZ3JvdXBpbmdTdGFjay5wcmVwZW5kKHRva2VuKTsKICB9CgogIC8qKgogICAqIEFwcGVuZHMgYSB0b2tlbiB0aGF0IGJlZ2lucyBhbiBlbmQgZ3JvdXAsIHJlcHJlc2VudGVkIGJ5IFt0eXBlXS4KICAgKiBJdCBoYW5kbGVzIHRoZSBncm91cCBlbmQgdG9rZW5zICd9JywgJyknIGFuZCAnXScuIFRoZSB0b2tlbnMgJz4nIGFuZAogICAqICc+PicgYXJlIGhhbmRsZWQgc2VwYXJhdGVseSBieSBbYXBwZW5kR3RdIGFuZCBbYXBwZW5kR3RHdF0uCiAgICovCiAgaW50IGFwcGVuZEVuZEdyb3VwKFRva2VuVHlwZSB0eXBlLCBpbnQgb3BlbktpbmQpIHsKICAgIGFzc2VydCghaWRlbnRpY2FsKG9wZW5LaW5kLCBMVF9UT0tFTikpOyAvLyBvcGVuS2luZCBpcyA8IGZvciA+IGFuZCA+PgogICAgaWYgKCFkaXNjYXJkQmVnaW5Hcm91cFVudGlsKG9wZW5LaW5kKSkgewogICAgICAvLyBObyBiZWdpbiBncm91cCBmb3VuZC4gSnVzdCBjb250aW51ZS4KICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKHR5cGUpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfQogICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKHR5cGUpOwogICAgVG9rZW4gY2xvc2UgPSB0YWlsOwogICAgQmVnaW5Ub2tlbiBiZWdpbiA9IGdyb3VwaW5nU3RhY2suaGVhZDsKICAgIGlmICghaWRlbnRpY2FsKGJlZ2luLmtpbmQsIG9wZW5LaW5kKSAmJgogICAgICAgICEoYmVnaW4ua2luZCA9PSBRVUVTVElPTl9QRVJJT0RfT1BFTl9TUVVBUkVfQlJBQ0tFVF9UT0tFTiAmJgogICAgICAgICAgICBvcGVuS2luZCA9PSBPUEVOX1NRVUFSRV9CUkFDS0VUX1RPS0VOKSkgewogICAgICBhc3NlcnQoYmVnaW4ua2luZCA9PSBTVFJJTkdfSU5URVJQT0xBVElPTl9UT0tFTiAmJgogICAgICAgICAgb3BlbktpbmQgPT0gT1BFTl9DVVJMWV9CUkFDS0VUX1RPS0VOKTsKICAgICAgLy8gV2UncmUgZW5kaW5nIGFuIGludGVycG9sYXRlZCBleHByZXNzaW9uLgogICAgICBiZWdpbi5lbmRHcm91cCA9IGNsb3NlOwogICAgICBncm91cGluZ1N0YWNrID0gZ3JvdXBpbmdTdGFjay50YWlsOwogICAgICAvLyBVc2luZyAic3RhcnQtb2YtdGV4dCIgdG8gc2lnbmFsIHRoYXQgd2UncmUgYmFjayBpbiBzdHJpbmcKICAgICAgLy8gc2Nhbm5pbmcgbW9kZS4KICAgICAgcmV0dXJuICRTVFg7CiAgICB9CiAgICBiZWdpbi5lbmRHcm91cCA9IGNsb3NlOwogICAgZ3JvdXBpbmdTdGFjayA9IGdyb3VwaW5nU3RhY2sudGFpbDsKICAgIHJldHVybiBhZHZhbmNlKCk7CiAgfQoKICAvKioKICAgKiBBcHBlbmRzIGEgdG9rZW4gZm9yICc+Jy4KICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBpc3N1ZSB1bm1hdGNoZWQgZXJyb3JzLCBiZWNhdXNlID4gaXMgYWxzbyB0aGUKICAgKiBncmVhdGVyLXRoYW4gb3BlcmF0b3IuIEl0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gY2xvc2UgYSBncm91cC4KICAgKi8KICB2b2lkIGFwcGVuZEd0KFRva2VuVHlwZSB0eXBlKSB7CiAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4odHlwZSk7CiAgICBpZiAoZ3JvdXBpbmdTdGFjay5pc0VtcHR5KSByZXR1cm47CiAgICBpZiAoaWRlbnRpY2FsKGdyb3VwaW5nU3RhY2suaGVhZC5raW5kLCBMVF9UT0tFTikpIHsKICAgICAgZ3JvdXBpbmdTdGFjay5oZWFkLmVuZEdyb3VwID0gdGFpbDsKICAgICAgZ3JvdXBpbmdTdGFjayA9IGdyb3VwaW5nU3RhY2sudGFpbDsKICAgIH0KICB9CgogIC8qKgogICAqIEFwcGVuZHMgYSB0b2tlbiBmb3IgJz4+Jy4KICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBpc3N1ZSB1bm1hdGNoZWQgZXJyb3JzLCBiZWNhdXNlID4+IGlzIGFsc28gdGhlCiAgICogc2hpZnQgb3BlcmF0b3IuIEl0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gY2xvc2UgYSBncm91cC4KICAgKi8KICB2b2lkIGFwcGVuZEd0R3QoVG9rZW5UeXBlIHR5cGUpIHsKICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbih0eXBlKTsKICAgIGlmIChncm91cGluZ1N0YWNrLmlzRW1wdHkpIHJldHVybjsKICAgIGlmIChpZGVudGljYWwoZ3JvdXBpbmdTdGFjay5oZWFkLmtpbmQsIExUX1RPS0VOKSkgewogICAgICAvLyBEb24ndCBhc3NpZ24gZW5kR3JvdXA6IGluICJUPFU8Vj4+IiwgdGhlICc+PicgdG9rZW4gY2xvc2VzIHRoZSBvdXRlcgogICAgICAvLyAnPCcsIHRoZSBpbm5lciAnPCcgaXMgbGVmdCB3aXRob3V0IGVuZEdyb3VwLgogICAgICBncm91cGluZ1N0YWNrID0gZ3JvdXBpbmdTdGFjay50YWlsOwogICAgfQogICAgaWYgKGdyb3VwaW5nU3RhY2suaXNFbXB0eSkgcmV0dXJuOwogICAgaWYgKGlkZW50aWNhbChncm91cGluZ1N0YWNrLmhlYWQua2luZCwgTFRfVE9LRU4pKSB7CiAgICAgIGdyb3VwaW5nU3RhY2suaGVhZC5lbmRHcm91cCA9IHRhaWw7CiAgICAgIGdyb3VwaW5nU3RhY2sgPSBncm91cGluZ1N0YWNrLnRhaWw7CiAgICB9CiAgfQoKICAvLy8gUHJlcGVuZCBbdG9rZW5dIHRvIHRoZSB0b2tlbiBzdHJlYW0uCiAgdm9pZCBwcmVwZW5kRXJyb3JUb2tlbihFcnJvclRva2VuIHRva2VuKSB7CiAgICBoYXNFcnJvcnMgPSB0cnVlOwogICAgaWYgKGVycm9yVGFpbCA9PSB0YWlsKSB7CiAgICAgIGFwcGVuZFRva2VuKHRva2VuKTsKICAgICAgZXJyb3JUYWlsID0gdGFpbDsKICAgIH0gZWxzZSB7CiAgICAgIHRva2VuLm5leHQgPSBlcnJvclRhaWwubmV4dDsKICAgICAgdG9rZW4ubmV4dC5wcmV2aW91cyA9IHRva2VuOwogICAgICBlcnJvclRhaWwubmV4dCA9IHRva2VuOwogICAgICB0b2tlbi5wcmV2aW91cyA9IGVycm9yVGFpbDsKICAgICAgZXJyb3JUYWlsID0gZXJyb3JUYWlsLm5leHQ7CiAgICB9CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGNvbW1lbnQgZnJvbSB0aGUgc2NhbiBvZmZzZXQgW3N0YXJ0XSB0byB0aGUgY3VycmVudAogICAqIFtzY2FuT2Zmc2V0XSBwbHVzIHRoZSBbZXh0cmFPZmZzZXRdLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQKICAgKiBzY2FuT2Zmc2V0IGlzIDEwLCB0aGVuIFthcHBlbmRTdWJzdHJpbmdUb2tlbig1LCAtMSldIHdpbGwgYXBwZW5kIHRoZQogICAqIHN1YnN0cmluZyBzdHJpbmcgWzUsOSkuCiAgICoKICAgKiBOb3RlIHRoYXQgW2V4dHJhT2Zmc2V0XSBjYW4gb25seSBiZSB1c2VkIGlmIHRoZSBjb3ZlcmVkIGNoYXJhY3RlcihzKSBhcmUKICAgKiBrbm93biB0byBiZSBBU0NJSS4KICAgKi8KICBDb21tZW50VG9rZW4gY3JlYXRlQ29tbWVudFRva2VuKFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LAogICAgICBbaW50IGV4dHJhT2Zmc2V0ID0gMF0pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGRhcnRkb2MgZnJvbSB0aGUgc2NhbiBvZmZzZXQgW3N0YXJ0XSB0byB0aGUgY3VycmVudAogICAqIFtzY2FuT2Zmc2V0XSBwbHVzIHRoZSBbZXh0cmFPZmZzZXRdLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQKICAgKiBzY2FuT2Zmc2V0IGlzIDEwLCB0aGVuIFthcHBlbmRTdWJzdHJpbmdUb2tlbig1LCAtMSldIHdpbGwgYXBwZW5kIHRoZQogICAqIHN1YnN0cmluZyBzdHJpbmcgWzUsOSkuCiAgICoKICAgKiBOb3RlIHRoYXQgW2V4dHJhT2Zmc2V0XSBjYW4gb25seSBiZSB1c2VkIGlmIHRoZSBjb3ZlcmVkIGNoYXJhY3RlcihzKSBhcmUKICAgKiBrbm93biB0byBiZSBBU0NJSS4KICAgKi8KICBEYXJ0RG9jVG9rZW4gY3JlYXRlRGFydERvY1Rva2VuKFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LAogICAgICBbaW50IGV4dHJhT2Zmc2V0ID0gMF0pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGxhbmd1YWdlIHZlcnNpb24gdG9rZW4gZnJvbSB0aGUgc2NhbiBvZmZzZXQgW3N0YXJ0XQogICAqIHRvIHRoZSBjdXJyZW50IFtzY2FuT2Zmc2V0XSBzaW1pbGFyIHRvIGNyZWF0ZUNvbW1lbnRUb2tlbi4KICAgKi8KICBMYW5ndWFnZVZlcnNpb25Ub2tlbiBjcmVhdGVMYW5ndWFnZVZlcnNpb25Ub2tlbigKICAgICAgaW50IHN0YXJ0LCBpbnQgbWFqb3IsIGludCBtaW5vcik7CgogIC8qKgogICAqIElmIGEgYmVnaW4gZ3JvdXAgdG9rZW4gbWF0Y2hlcyBbb3BlbktpbmRdLAogICAqIHRoZW4gZGlzY2FyZCBiZWdpbiBncm91cCB0b2tlbnMgdXAgdG8gdGhhdCBtYXRjaCBhbmQgcmV0dXJuIGB0cnVlYCwKICAgKiBvdGhlcndpc2UgcmV0dXJuIGBmYWxzZWAuCiAgICogVGhpcyByZWNvdmVycyBuaWNlbHkgZnJvbSBmcm9tIHNpdHVhdGlvbnMgbGlrZSAie1t9IiBhbmQgIntmb28oKSk7fSIsCiAgICogYnV0IG5vdCAiZm9vKCgpIHtiYXIoKSk7fSk7CiAgICovCiAgYm9vbCBkaXNjYXJkQmVnaW5Hcm91cFVudGlsKGludCBvcGVuS2luZCkgewogICAgTGluazxCZWdpblRva2VuPiBvcmlnaW5hbFN0YWNrID0gZ3JvdXBpbmdTdGFjazsKCiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGRvIHsKICAgICAgLy8gRG9uJ3QgcmVwb3J0IHVubWF0Y2hlZCBlcnJvcnMgZm9yIDw7IGl0IGlzIGFsc28gdGhlIGxlc3MtdGhhbiBvcGVyYXRvci4KICAgICAgZGlzY2FyZE9wZW5MdCgpOwogICAgICBpZiAoZ3JvdXBpbmdTdGFjay5pc0VtcHR5KSBicmVhazsgLy8gcmVjb3ZlcgogICAgICBCZWdpblRva2VuIGJlZ2luID0gZ3JvdXBpbmdTdGFjay5oZWFkOwogICAgICBpZiAob3BlbktpbmQgPT0gYmVnaW4ua2luZCB8fAogICAgICAgICAgKG9wZW5LaW5kID09IE9QRU5fQ1VSTFlfQlJBQ0tFVF9UT0tFTiAmJgogICAgICAgICAgICAgIGJlZ2luLmtpbmQgPT0gU1RSSU5HX0lOVEVSUE9MQVRJT05fVE9LRU4pIHx8CiAgICAgICAgICAob3BlbktpbmQgPT0gT1BFTl9TUVVBUkVfQlJBQ0tFVF9UT0tFTiAmJgogICAgICAgICAgICAgIGJlZ2luLmtpbmQgPT0gUVVFU1RJT05fUEVSSU9EX09QRU5fU1FVQVJFX0JSQUNLRVRfVE9LRU4pKSB7CiAgICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgICAvLyBJZiB0aGUgZXhwZWN0ZWQgb3BlbmVyIGhhcyBiZWVuIGZvdW5kIG9uIHRoZSBmaXJzdCBwYXNzCiAgICAgICAgICAvLyB0aGVuIG5vIHJlY292ZXJ5IG5lY2Vzc2FyeS4KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBicmVhazsgLy8gcmVjb3ZlcgogICAgICB9CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIGdyb3VwaW5nU3RhY2sgPSBncm91cGluZ1N0YWNrLnRhaWw7CiAgICB9IHdoaWxlICghZ3JvdXBpbmdTdGFjay5pc0VtcHR5KTsKCiAgICAvLyBJZiB0aGUgc3RhY2sgZG9lcyBub3QgaGF2ZSBhbnkgb3BlbmVyIG9mIHRoZSBnaXZlbiB0eXBlLAogICAgLy8gdGhlbiByZXR1cm4gd2l0aG91dCBkaXNjYXJkaW5nIGFueXRoaW5nLgogICAgLy8gVGhpcyByZWNvdmVycyBuaWNlbHkgZnJvbSBmcm9tIHNpdHVhdGlvbnMgbGlrZSAie2ZvbygpKTt9Ii4KICAgIGlmIChncm91cGluZ1N0YWNrLmlzRW1wdHkpIHsKICAgICAgZ3JvdXBpbmdTdGFjayA9IG9yaWdpbmFsU3RhY2s7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBJbnNlcnQgc3ludGhldGljIGNsb3NlcnMgYW5kIHJlcG9ydCBlcnJvcnMgZm9yIGFueSB1bmJhbGFuY2VkIG9wZW5lcnMuCiAgICAvLyBUaGlzIHJlY292ZXJzIG5pY2VseSBmcm9tIGZyb20gc2l0dWF0aW9ucyBsaWtlICJ7W30iLgogICAgd2hpbGUgKCFpZGVudGljYWwob3JpZ2luYWxTdGFjaywgZ3JvdXBpbmdTdGFjaykpIHsKICAgICAgLy8gRG9uJ3QgcmVwb3J0IHVubWF0Y2hlZCBlcnJvcnMgZm9yIDw7IGl0IGlzIGFsc28gdGhlIGxlc3MtdGhhbiBvcGVyYXRvci4KICAgICAgaWYgKCFpZGVudGljYWwoZ3JvdXBpbmdTdGFjay5oZWFkLmtpbmQsIExUX1RPS0VOKSkKICAgICAgICB1bm1hdGNoZWRCZWdpbkdyb3VwKG9yaWdpbmFsU3RhY2suaGVhZCk7CiAgICAgIG9yaWdpbmFsU3RhY2sgPSBvcmlnaW5hbFN0YWNrLnRhaWw7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8qKgogICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBkaXNjYXJkICc8JyBmcm9tIHRoZSAiZ3JvdXBpbmciIHN0YWNrLgogICAqCiAgICogW1BhcnRpYWxQYXJzZXIuc2tpcEV4cHJlc3Npb25dIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IHdlIGRvIG5vdAogICAqIGNyZWF0ZSBncm91cHMgZm9yIHN0dWZmIGxpa2U6CiAgICogWzphID0gYiA8IGMsIGQgPSBlID4gZjpdLgogICAqCiAgICogSW4gb3RoZXIgd29yZHMsIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBzY2FubmVyIHJlY29nbml6ZXMKICAgKiBzb21ldGhpbmcgd2hpY2ggY2Fubm90IHBvc3NpYmx5IGJlIHBhcnQgb2YgYSB0eXBlIHBhcmFtZXRlci9hcmd1bWVudAogICAqIGxpc3QsIGxpa2UgdGhlICc9JyBpbiB0aGUgYWJvdmUgZXhhbXBsZS4KICAgKi8KICB2b2lkIGRpc2NhcmRPcGVuTHQoKSB7CiAgICB3aGlsZSAoIWdyb3VwaW5nU3RhY2suaXNFbXB0eSAmJgogICAgICAgIGlkZW50aWNhbChncm91cGluZ1N0YWNrLmhlYWQua2luZCwgTFRfVE9LRU4pKSB7CiAgICAgIGdyb3VwaW5nU3RhY2sgPSBncm91cGluZ1N0YWNrLnRhaWw7CiAgICB9CiAgfQoKICAvKioKICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gZGlzY2FyZCAnJHsnIGZyb20gdGhlICJncm91cGluZyIgc3RhY2suCiAgICoKICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgc2Nhbm5lciBmaW5kcyBhbiB1bnRlcm1pbmF0ZWQKICAgKiBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb24uCiAgICovCiAgdm9pZCBkaXNjYXJkSW50ZXJwb2xhdGlvbigpIHsKICAgIHdoaWxlICghZ3JvdXBpbmdTdGFjay5pc0VtcHR5KSB7CiAgICAgIEJlZ2luVG9rZW4gYmVnaW5Ub2tlbiA9IGdyb3VwaW5nU3RhY2suaGVhZDsKICAgICAgdW5tYXRjaGVkQmVnaW5Hcm91cChiZWdpblRva2VuKTsKICAgICAgZ3JvdXBpbmdTdGFjayA9IGdyb3VwaW5nU3RhY2sudGFpbDsKICAgICAgaWYgKGlkZW50aWNhbChiZWdpblRva2VuLmtpbmQsIFNUUklOR19JTlRFUlBPTEFUSU9OX1RPS0VOKSkgYnJlYWs7CiAgICB9CiAgfQoKICB2b2lkIHVubWF0Y2hlZEJlZ2luR3JvdXAoQmVnaW5Ub2tlbiBiZWdpbikgewogICAgLy8gV2Ugd2FudCB0byBlbnN1cmUgdGhhdCB1bm1hdGNoZWQgQmVnaW5Ub2tlbnMgYXJlIHJlcG9ydGVkIGFzCiAgICAvLyBlcnJvcnMuICBIb3dldmVyLCB0aGUgZGlldCBwYXJzZXIgYXNzdW1lcyB0aGF0IGdyb3VwcyBhcmUgd2VsbC1iYWxhbmNlZAogICAgLy8gYW5kIHdpbGwgbmV2ZXIgbG9vayBhdCB0aGUgZW5kR3JvdXAgdG9rZW4uICBUaGlzIGlzIGEgbmljZSBwcm9wZXJ0eSB0aGF0CiAgICAvLyBhbGxvd3MgdXMgdG8gc2tpcCBxdWlja2x5IG92ZXIgY29ycmVjdCBjb2RlLiBCeSBpbnNlcnRpbmcgYW4gYWRkaXRpb25hbAogICAgLy8gc3ludGhldGljIHRva2VuIGluIHRoZSBzdHJlYW0sIHdlIGNhbiBrZWVwIGlnbm9yaW5nIGVuZEdyb3VwIHRva2Vucy4KICAgIC8vCiAgICAvLyBbYmVnaW5dIC0tbmV4dC0tPiBbdGFpbF0KICAgIC8vIFtiZWdpbl0gLS1lbmRHLS0+IFtzeW50aGV0aWNdIC0tbmV4dC0tPiBbbmV4dF0gLS1uZXh0LS0+IFt0YWlsXQogICAgLy8KICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBkaWV0IHBhcnNlciB0byBza2lwIGZyb20gW2JlZ2luXSB2aWEgZW5kR3JvdXAgdG8KICAgIC8vIFtzeW50aGV0aWNdIGFuZCBpZ25vcmUgdGhlIFtzeW50aGV0aWNdIHRva2VuIChhc3N1bWluZyBpdCdzIGNvcnJlY3QpLAogICAgLy8gdGhlbiB0aGUgZXJyb3Igd2lsbCBiZSByZXBvcnRlZCB3aGVuIHBhcnNpbmcgdGhlIFtuZXh0XSB0b2tlbi4KICAgIC8vCiAgICAvLyBGb3IgZXhhbXBsZSwgdG9rZW5pemUoIntbMX07IikgcHJvZHVjZXM6CiAgICAvLwogICAgLy8gU3ltYm9sVG9rZW4oeykgLS1lbmRHcm91cC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgIC8vICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyAgICAgbmV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vIFN5bWJvbFRva2VuKFspIC0tZW5kR3JvdXAtLSsgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgIG5leHQgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vICAgICAgdiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyBTdHJpbmdUb2tlbigxKSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vICAgICBuZXh0ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyAgICAgIHYgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gU3ltYm9sVG9rZW4oXSk8LS0tLS0tLS0tLS0tKyA8LS0gU3ludGhldGljIHRva2VuIHwKICAgIC8vICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyAgICAgbmV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vIFVubWF0Y2hlZFRva2VuKFspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgIG5leHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyBTeW1ib2xUb2tlbih9KTwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgLy8gICAgICB8CiAgICAvLyAgICAgbmV4dAogICAgLy8gICAgICB2CiAgICAvLyBTeW1ib2xUb2tlbig7KQogICAgLy8gICAgICB8CiAgICAvLyAgICAgbmV4dAogICAgLy8gICAgICB2CiAgICAvLyAgICAgRU9GCiAgICBUb2tlblR5cGUgdHlwZSA9IGNsb3NlQnJhY2VJbmZvRm9yKGJlZ2luKTsKICAgIGFwcGVuZFRva2VuKG5ldyBTeW50aGV0aWNUb2tlbih0eXBlLCB0b2tlblN0YXJ0KS4uYmVmb3JlU3ludGhldGljID0gdGFpbCk7CiAgICBiZWdpbi5lbmRHcm91cCA9IHRhaWw7CiAgICBwcmVwZW5kRXJyb3JUb2tlbihuZXcgVW5tYXRjaGVkVG9rZW4oYmVnaW4pKTsKICB9CgogIC8vLyBSZXR1cm4gdHJ1ZSB3aGVuIGF0IEVPRi4KICBib29sIGF0RW5kT2ZGaWxlKCk7CgogIFRva2VuIHRva2VuaXplKCkgewogICAgd2hpbGUgKCFhdEVuZE9mRmlsZSgpKSB7CiAgICAgIGludCBuZXh0ID0gYWR2YW5jZSgpOwoKICAgICAgLy8gU2NhbiB0aGUgaGVhZGVyIGxvb2tpbmcgZm9yIGEgbGFuZ3VhZ2UgdmVyc2lvbgogICAgICBpZiAoIWlkZW50aWNhbChuZXh0LCAkRU9GKSkgewogICAgICAgIFRva2VuIG9sZFRhaWwgPSB0YWlsOwogICAgICAgIG5leHQgPSBiaWdIZWFkZXJTd2l0Y2gobmV4dCk7CiAgICAgICAgaWYgKCFpZGVudGljYWwobmV4dCwgJEVPRikgJiYgdGFpbC5raW5kID09IFNDUklQVF9UT0tFTikgewogICAgICAgICAgb2xkVGFpbCA9IHRhaWw7CiAgICAgICAgICBuZXh0ID0gYmlnSGVhZGVyU3dpdGNoKG5leHQpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoIWlkZW50aWNhbChuZXh0LCAkRU9GKSAmJiB0YWlsID09IG9sZFRhaWwpIHsKICAgICAgICAgIG5leHQgPSBiaWdIZWFkZXJTd2l0Y2gobmV4dCk7CiAgICAgICAgfQogICAgICAgIG5leHQgPSBuZXh0OwogICAgICB9CgogICAgICB3aGlsZSAoIWlkZW50aWNhbChuZXh0LCAkRU9GKSkgewogICAgICAgIG5leHQgPSBiaWdTd2l0Y2gobmV4dCk7CiAgICAgIH0KICAgICAgaWYgKGF0RW5kT2ZGaWxlKCkpIHsKICAgICAgICBhcHBlbmRFb2ZUb2tlbigpOwogICAgICB9IGVsc2UgewogICAgICAgIHVuZXhwZWN0ZWQoJEVPRik7CiAgICAgIH0KICAgIH0KCiAgICAvLyBBbHdheXMgcHJldGVuZCB0aGF0IHRoZXJlJ3MgYSBsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCiAgICBsaW5lU3RhcnRzLmFkZChzdHJpbmdPZmZzZXQgKyAxKTsKCiAgICByZXR1cm4gZmlyc3RUb2tlbigpOwogIH0KCiAgaW50IGJpZ0hlYWRlclN3aXRjaChpbnQgbmV4dCkgewogICAgaWYgKCFpZGVudGljYWwobmV4dCwgJFNMQVNIKSkgewogICAgICByZXR1cm4gYmlnU3dpdGNoKG5leHQpOwogICAgfQogICAgYmVnaW5Ub2tlbigpOwogICAgaWYgKCFpZGVudGljYWwoJFNMQVNILCBwZWVrKCkpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVNsYXNoT3JDb21tZW50KG5leHQpOwogICAgfQogICAgcmV0dXJuIHRva2VuaXplTGFuZ3VhZ2VWZXJzaW9uT3JTaW5nbGVMaW5lQ29tbWVudChuZXh0KTsKICB9CgogIGludCBiaWdTd2l0Y2goaW50IG5leHQpIHsKICAgIGJlZ2luVG9rZW4oKTsKICAgIGlmIChpZGVudGljYWwobmV4dCwgJFNQQUNFKSB8fAogICAgICAgIGlkZW50aWNhbChuZXh0LCAkVEFCKSB8fAogICAgICAgIGlkZW50aWNhbChuZXh0LCAkTEYpIHx8CiAgICAgICAgaWRlbnRpY2FsKG5leHQsICRDUikpIHsKICAgICAgYXBwZW5kV2hpdGVTcGFjZShuZXh0KTsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgLy8gU2VxdWVuY2VzIG9mIHNwYWNlcyBhcmUgY29tbW9uLCBzbyBhZHZhbmNlIHRocm91Z2ggdGhlbSBmYXN0LgogICAgICB3aGlsZSAoaWRlbnRpY2FsKG5leHQsICRTUEFDRSkpIHsKICAgICAgICAvLyBXZSBkb24ndCBpbnZva2UgWzphcHBlbmRXaGl0ZVNwYWNlKG5leHQpOl0gaGVyZSBmb3IgZWZmaWNpZW5jeSwKICAgICAgICAvLyBhc3N1bWluZyB0aGF0IGl0IGRvZXMgbm90IGRvIGFueXRoaW5nIGZvciBzcGFjZSBjaGFyYWN0ZXJzLgogICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CgogICAgaW50IG5leHRMb3dlciA9IG5leHQgfCAweDIwOwoKICAgIGlmICgkYSA8PSBuZXh0TG93ZXIgJiYgbmV4dExvd2VyIDw9ICR6KSB7CiAgICAgIGlmIChpZGVudGljYWwoJHIsIG5leHQpKSB7CiAgICAgICAgcmV0dXJuIHRva2VuaXplUmF3U3RyaW5nS2V5d29yZE9ySWRlbnRpZmllcihuZXh0KTsKICAgICAgfQogICAgICByZXR1cm4gdG9rZW5pemVLZXl3b3JkT3JJZGVudGlmaWVyKG5leHQsIHRydWUpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJENMT1NFX1BBUkVOKSkgewogICAgICByZXR1cm4gYXBwZW5kRW5kR3JvdXAoVG9rZW5UeXBlLkNMT1NFX1BBUkVOLCBPUEVOX1BBUkVOX1RPS0VOKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRPUEVOX1BBUkVOKSkgewogICAgICBhcHBlbmRCZWdpbkdyb3VwKFRva2VuVHlwZS5PUEVOX1BBUkVOKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRTRU1JQ09MT04pKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuU0VNSUNPTE9OKTsKICAgICAgLy8gVHlwZSBwYXJhbWV0ZXJzIGFuZCBhcmd1bWVudHMgY2Fubm90IGNvbnRhaW4gc2VtaWNvbG9uLgogICAgICBkaXNjYXJkT3Blbkx0KCk7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkUEVSSU9EKSkgewogICAgICByZXR1cm4gdG9rZW5pemVEb3RzT3JOdW1iZXIobmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQ09NTUEpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuQ09NTUEpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJEVRKSkgewogICAgICByZXR1cm4gdG9rZW5pemVFcXVhbHMobmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQ0xPU0VfQ1VSTFlfQlJBQ0tFVCkpIHsKICAgICAgcmV0dXJuIGFwcGVuZEVuZEdyb3VwKAogICAgICAgICAgVG9rZW5UeXBlLkNMT1NFX0NVUkxZX0JSQUNLRVQsIE9QRU5fQ1VSTFlfQlJBQ0tFVF9UT0tFTik7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkU0xBU0gpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVNsYXNoT3JDb21tZW50KG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJE9QRU5fQ1VSTFlfQlJBQ0tFVCkpIHsKICAgICAgYXBwZW5kQmVnaW5Hcm91cChUb2tlblR5cGUuT1BFTl9DVVJMWV9CUkFDS0VUKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICREUSkgfHwgaWRlbnRpY2FsKG5leHQsICRTUSkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplU3RyaW5nKG5leHQsIHNjYW5PZmZzZXQsIGZhbHNlKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRfKSkgewogICAgICByZXR1cm4gdG9rZW5pemVLZXl3b3JkT3JJZGVudGlmaWVyKG5leHQsIHRydWUpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJENPTE9OKSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkNPTE9OKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRMVCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplTGVzc1RoYW4obmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkR1QpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUdyZWF0ZXJUaGFuKG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJEJBTkcpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUV4Y2xhbWF0aW9uKG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJE9QRU5fU1FVQVJFX0JSQUNLRVQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZU9wZW5TcXVhcmVCcmFja2V0KG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJENMT1NFX1NRVUFSRV9CUkFDS0VUKSkgewogICAgICByZXR1cm4gYXBwZW5kRW5kR3JvdXAoCiAgICAgICAgICBUb2tlblR5cGUuQ0xPU0VfU1FVQVJFX0JSQUNLRVQsIE9QRU5fU1FVQVJFX0JSQUNLRVRfVE9LRU4pOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJEFUKSkgewogICAgICByZXR1cm4gdG9rZW5pemVBdChuZXh0KTsKICAgIH0KCiAgICBpZiAobmV4dCA+PSAkMSAmJiBuZXh0IDw9ICQ5KSB7CiAgICAgIHJldHVybiB0b2tlbml6ZU51bWJlcihuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRBTVBFUlNBTkQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUFtcGVyc2FuZChuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICQwKSkgewogICAgICByZXR1cm4gdG9rZW5pemVIZXhPck51bWJlcihuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRRVUVTVElPTikpIHsKICAgICAgcmV0dXJuIHRva2VuaXplUXVlc3Rpb24obmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQkFSKSkgewogICAgICByZXR1cm4gdG9rZW5pemVCYXIobmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkUExVUykpIHsKICAgICAgcmV0dXJuIHRva2VuaXplUGx1cyhuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICQkKSkgewogICAgICByZXR1cm4gdG9rZW5pemVLZXl3b3JkT3JJZGVudGlmaWVyKG5leHQsIHRydWUpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJE1JTlVTKSkgewogICAgICByZXR1cm4gdG9rZW5pemVNaW51cyhuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRTVEFSKSkgewogICAgICByZXR1cm4gdG9rZW5pemVNdWx0aXBseShuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRDQVJFVCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplQ2FyZXQobmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkVElMREUpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVRpbGRlKG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJFBFUkNFTlQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVBlcmNlbnQobmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQkFDS1BJTkcpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuQkFDS1BJTkcpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJEJBQ0tTTEFTSCkpIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5CQUNLU0xBU0gpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJEhBU0gpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVRhZyhuZXh0KTsKICAgIH0KCiAgICBpZiAobmV4dCA8IDB4MWYpIHsKICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQobmV4dCk7CiAgICB9CgogICAgbmV4dCA9IGN1cnJlbnRBc1VuaWNvZGUobmV4dCk7CgogICAgcmV0dXJuIHVuZXhwZWN0ZWQobmV4dCk7CiAgfQoKICBpbnQgdG9rZW5pemVUYWcoaW50IG5leHQpIHsKICAgIC8vICMgb3IgIyEuKltcblxyXQogICAgaWYgKHNjYW5PZmZzZXQgPT0gMCkgewogICAgICBpZiAoaWRlbnRpY2FsKHBlZWsoKSwgJEJBTkcpKSB7CiAgICAgICAgaW50IHN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgICAgICBib29sIGFzY2lpT25seSA9IHRydWU7CiAgICAgICAgZG8gewogICAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICAgIGlmIChuZXh0ID4gMTI3KSBhc2NpaU9ubHkgPSBmYWxzZTsKICAgICAgICB9IHdoaWxlICghaWRlbnRpY2FsKG5leHQsICRMRikgJiYKICAgICAgICAgICAgIWlkZW50aWNhbChuZXh0LCAkQ1IpICYmCiAgICAgICAgICAgICFpZGVudGljYWwobmV4dCwgJEVPRikpOwogICAgICAgIGlmICghYXNjaWlPbmx5KSBoYW5kbGVVbmljb2RlKHN0YXJ0KTsKICAgICAgICBhcHBlbmRTdWJzdHJpbmdUb2tlbihUb2tlblR5cGUuU0NSSVBUX1RBRywgc3RhcnQsIGFzY2lpT25seSk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgIH0KICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuSEFTSCk7CiAgICByZXR1cm4gYWR2YW5jZSgpOwogIH0KCiAgaW50IHRva2VuaXplVGlsZGUoaW50IG5leHQpIHsKICAgIC8vIH4gfi8gfi89CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkU0xBU0gpKSB7CiAgICAgIHJldHVybiBzZWxlY3QoJEVRLCBUb2tlblR5cGUuVElMREVfU0xBU0hfRVEsIFRva2VuVHlwZS5USUxERV9TTEFTSCk7CiAgICB9IGVsc2UgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlRJTERFKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVPcGVuU3F1YXJlQnJhY2tldChpbnQgbmV4dCkgewogICAgLy8gWyBbXSBbXT0KICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRDTE9TRV9TUVVBUkVfQlJBQ0tFVCkpIHsKICAgICAgcmV0dXJuIHNlbGVjdCgkRVEsIFRva2VuVHlwZS5JTkRFWF9FUSwgVG9rZW5UeXBlLklOREVYKTsKICAgIH0KICAgIGFwcGVuZEJlZ2luR3JvdXAoVG9rZW5UeXBlLk9QRU5fU1FVQVJFX0JSQUNLRVQpOwogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBpbnQgdG9rZW5pemVDYXJldChpbnQgbmV4dCkgewogICAgLy8gXiBePQogICAgcmV0dXJuIHNlbGVjdCgkRVEsIFRva2VuVHlwZS5DQVJFVF9FUSwgVG9rZW5UeXBlLkNBUkVUKTsKICB9CgogIGludCB0b2tlbml6ZVF1ZXN0aW9uKGludCBuZXh0KSB7CiAgICAvLyA/ID8uID8/ID8/PQogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwobmV4dCwgJFFVRVNUSU9OKSkgewogICAgICByZXR1cm4gc2VsZWN0KAogICAgICAgICAgJEVRLCBUb2tlblR5cGUuUVVFU1RJT05fUVVFU1RJT05fRVEsIFRva2VuVHlwZS5RVUVTVElPTl9RVUVTVElPTik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChuZXh0LCAkUEVSSU9EKSkgewogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICBpZiAoX2VuYWJsZU5vbk51bGxhYmxlICYmIGlkZW50aWNhbCgkT1BFTl9TUVVBUkVfQlJBQ0tFVCwgbmV4dCkpIHsKICAgICAgICBhcHBlbmRCZWdpbkdyb3VwKFRva2VuVHlwZS5RVUVTVElPTl9QRVJJT0RfT1BFTl9TUVVBUkVfQlJBQ0tFVCk7CiAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgICAgfQogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlFVRVNUSU9OX1BFUklPRCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfSBlbHNlIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5RVUVTVElPTik7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgaW50IHRva2VuaXplQmFyKGludCBuZXh0KSB7CiAgICAvLyB8IHx8IHw9IHx8PQogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwobmV4dCwgJEJBUikpIHsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgaWYgKExBWllfQVNTSUdOTUVOVF9FTkFCTEVEICYmIGlkZW50aWNhbChuZXh0LCAkRVEpKSB7CiAgICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5CQVJfQkFSX0VRKTsKICAgICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgICB9CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuQkFSX0JBUik7CiAgICAgIHJldHVybiBuZXh0OwogICAgfSBlbHNlIGlmIChpZGVudGljYWwobmV4dCwgJEVRKSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkJBUl9FUSk7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9IGVsc2UgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkJBUik7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgaW50IHRva2VuaXplQW1wZXJzYW5kKGludCBuZXh0KSB7CiAgICAvLyAmJiAmPSAmICYmPQogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwobmV4dCwgJEFNUEVSU0FORCkpIHsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgaWYgKExBWllfQVNTSUdOTUVOVF9FTkFCTEVEICYmIGlkZW50aWNhbChuZXh0LCAkRVEpKSB7CiAgICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5BTVBFUlNBTkRfQU1QRVJTQU5EX0VRKTsKICAgICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgICB9CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuQU1QRVJTQU5EX0FNUEVSU0FORCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfSBlbHNlIGlmIChpZGVudGljYWwobmV4dCwgJEVRKSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkFNUEVSU0FORF9FUSk7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9IGVsc2UgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkFNUEVSU0FORCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgaW50IHRva2VuaXplUGVyY2VudChpbnQgbmV4dCkgewogICAgLy8gJSAlPQogICAgcmV0dXJuIHNlbGVjdCgkRVEsIFRva2VuVHlwZS5QRVJDRU5UX0VRLCBUb2tlblR5cGUuUEVSQ0VOVCk7CiAgfQoKICBpbnQgdG9rZW5pemVNdWx0aXBseShpbnQgbmV4dCkgewogICAgLy8gKiAqPQogICAgcmV0dXJuIHNlbGVjdCgkRVEsIFRva2VuVHlwZS5TVEFSX0VRLCBUb2tlblR5cGUuU1RBUik7CiAgfQoKICBpbnQgdG9rZW5pemVNaW51cyhpbnQgbmV4dCkgewogICAgLy8gLSAtLSAtPQogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwobmV4dCwgJE1JTlVTKSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLk1JTlVTX01JTlVTKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKG5leHQsICRFUSkpIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5NSU5VU19FUSk7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9IGVsc2UgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLk1JTlVTKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVQbHVzKGludCBuZXh0KSB7CiAgICAvLyArICsrICs9CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbCgkUExVUywgbmV4dCkpIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5QTFVTX1BMVVMpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoJEVRLCBuZXh0KSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlBMVVNfRVEpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfSBlbHNlIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5QTFVTKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVFeGNsYW1hdGlvbihpbnQgbmV4dCkgewogICAgLy8gISAhPQogICAgLy8gIT09IGlzIGtlcHQgZm9yIHVzZXItZnJpZW5kbHkgZXJyb3IgcmVwb3J0aW5nLgoKICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRFUSkpIHsKICAgICAgLy93YXMgYHJldHVybiBzZWxlY3QoJEVRLCBUb2tlblR5cGUuQkFOR19FUV9FUSwgVG9rZW5UeXBlLkJBTkdfRVEpO2AKICAgICAgaW50IG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIGlmIChpZGVudGljYWwobmV4dCwgJEVRKSkgewogICAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuQkFOR19FUV9FUSk7CiAgICAgICAgcHJlcGVuZEVycm9yVG9rZW4obmV3IFVuc3VwcG9ydGVkT3BlcmF0b3IodGFpbCwgdG9rZW5TdGFydCkpOwogICAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5CQU5HX0VRKTsKICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgfQogICAgfQogICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5CQU5HKTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgaW50IHRva2VuaXplRXF1YWxzKGludCBuZXh0KSB7CiAgICAvLyA9ID09ID0+CiAgICAvLyA9PT0gaXMga2VwdCBmb3IgdXNlci1mcmllbmRseSBlcnJvciByZXBvcnRpbmcuCgogICAgLy8gVHlwZSBwYXJhbWV0ZXJzIGFuZCBhcmd1bWVudHMgY2Fubm90IGNvbnRhaW4gYW55IHRva2VuIHRoYXQKICAgIC8vIHN0YXJ0cyB3aXRoICc9Jy4KICAgIGRpc2NhcmRPcGVuTHQoKTsKCiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkRVEpKSB7CiAgICAgIC8vIHdhcyBgcmV0dXJuIHNlbGVjdCgkRVEsIFRva2VuVHlwZS5FUV9FUV9FUSwgVG9rZW5UeXBlLkVRX0VRKTtgCiAgICAgIGludCBuZXh0ID0gYWR2YW5jZSgpOwogICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRFUSkpIHsKICAgICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkVRX0VRX0VRKTsKICAgICAgICBwcmVwZW5kRXJyb3JUb2tlbihuZXcgVW5zdXBwb3J0ZWRPcGVyYXRvcih0YWlsLCB0b2tlblN0YXJ0KSk7CiAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkVRX0VRKTsKICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgfQogICAgfSBlbHNlIGlmIChpZGVudGljYWwobmV4dCwgJEdUKSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkZVTkNUSU9OKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0KICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuRVEpOwogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBpbnQgdG9rZW5pemVHcmVhdGVyVGhhbihpbnQgbmV4dCkgewogICAgLy8gPiA+PSA+PiA+Pj0gPj4+ID4+Pj0KICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoaWRlbnRpY2FsKCRFUSwgbmV4dCkpIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5HVF9FUSk7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgkR1QsIG5leHQpKSB7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIGlmIChpZGVudGljYWwoJEVRLCBuZXh0KSkgewogICAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuR1RfR1RfRVEpOwogICAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICAgIH0gZWxzZSBpZiAoX2VuYWJsZVRyaXBsZVNoaWZ0ICYmIGlkZW50aWNhbCgkR1QsIG5leHQpKSB7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICBpZiAoX2VuYWJsZVRyaXBsZVNoaWZ0ICYmIGlkZW50aWNhbCgkRVEsIG5leHQpKSB7CiAgICAgICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkdUX0dUX0dUX0VRKTsKICAgICAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICAgICAgfQogICAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuR1RfR1RfR1QpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIGFwcGVuZEd0R3QoVG9rZW5UeXBlLkdUX0dUKTsKICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYXBwZW5kR3QoVG9rZW5UeXBlLkdUKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVMZXNzVGhhbihpbnQgbmV4dCkgewogICAgLy8gPCA8PSA8PCA8PD0KICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoaWRlbnRpY2FsKCRFUSwgbmV4dCkpIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5MVF9FUSk7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgkTFQsIG5leHQpKSB7CiAgICAgIHJldHVybiBzZWxlY3QoJEVRLCBUb2tlblR5cGUuTFRfTFRfRVEsIFRva2VuVHlwZS5MVF9MVCk7CiAgICB9IGVsc2UgewogICAgICBhcHBlbmRCZWdpbkdyb3VwKFRva2VuVHlwZS5MVCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgaW50IHRva2VuaXplTnVtYmVyKGludCBuZXh0KSB7CiAgICBpbnQgc3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgaWYgKCQwIDw9IG5leHQgJiYgbmV4dCA8PSAkOSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChuZXh0LCAkZSkgfHwgaWRlbnRpY2FsKG5leHQsICRFKSkgewogICAgICAgIHJldHVybiB0b2tlbml6ZUZyYWN0aW9uUGFydChuZXh0LCBzdGFydCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCAkUEVSSU9EKSkgewogICAgICAgICAgaW50IG5leHRuZXh0ID0gcGVlaygpOwogICAgICAgICAgaWYgKCQwIDw9IG5leHRuZXh0ICYmIG5leHRuZXh0IDw9ICQ5KSB7CiAgICAgICAgICAgIHJldHVybiB0b2tlbml6ZUZyYWN0aW9uUGFydChhZHZhbmNlKCksIHN0YXJ0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLklOVCwgc3RhcnQsIHRydWUpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVIZXhPck51bWJlcihpbnQgbmV4dCkgewogICAgaW50IHggPSBwZWVrKCk7CiAgICBpZiAoaWRlbnRpY2FsKHgsICR4KSB8fCBpZGVudGljYWwoeCwgJFgpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUhleChuZXh0KTsKICAgIH0KICAgIHJldHVybiB0b2tlbml6ZU51bWJlcihuZXh0KTsKICB9CgogIGludCB0b2tlbml6ZUhleChpbnQgbmV4dCkgewogICAgaW50IHN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgIG5leHQgPSBhZHZhbmNlKCk7IC8vIEFkdmFuY2UgcGFzdCB0aGUgJHggb3IgJFguCiAgICBib29sIGhhc0RpZ2l0cyA9IGZhbHNlOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgaWYgKCgkMCA8PSBuZXh0ICYmIG5leHQgPD0gJDkpIHx8CiAgICAgICAgICAoJEEgPD0gbmV4dCAmJiBuZXh0IDw9ICRGKSB8fAogICAgICAgICAgKCRhIDw9IG5leHQgJiYgbmV4dCA8PSAkZikpIHsKICAgICAgICBoYXNEaWdpdHMgPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICghaGFzRGlnaXRzKSB7CiAgICAgICAgICBwcmVwZW5kRXJyb3JUb2tlbihuZXcgVW50ZXJtaW5hdGVkVG9rZW4oCiAgICAgICAgICAgICAgbWVzc2FnZUV4cGVjdGVkSGV4RGlnaXQsIHN0YXJ0LCBzdHJpbmdPZmZzZXQpKTsKICAgICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgICBhcHBlbmRTeW50aGV0aWNTdWJzdHJpbmdUb2tlbigKICAgICAgICAgICAgICBUb2tlblR5cGUuSEVYQURFQ0lNQUwsIHN0YXJ0LCB0cnVlLCAiMCIpOwogICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgICAgfQogICAgICAgIGFwcGVuZFN1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5IRVhBREVDSU1BTCwgc3RhcnQsIHRydWUpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVEb3RzT3JOdW1iZXIoaW50IG5leHQpIHsKICAgIGludCBzdGFydCA9IHNjYW5PZmZzZXQ7CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKCgkMCA8PSBuZXh0ICYmIG5leHQgPD0gJDkpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUZyYWN0aW9uUGFydChuZXh0LCBzdGFydCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgkUEVSSU9ELCBuZXh0KSkgewogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRQRVJJT0QpKSB7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRRVUVTVElPTikpIHsKICAgICAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuUEVSSU9EX1BFUklPRF9QRVJJT0RfUVVFU1RJT04pOwogICAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5QRVJJT0RfUEVSSU9EX1BFUklPRCk7CiAgICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5QRVJJT0RfUEVSSU9EKTsKICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5QRVJJT0QpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICB9CgogIGludCB0b2tlbml6ZUZyYWN0aW9uUGFydChpbnQgbmV4dCwgaW50IHN0YXJ0KSB7CiAgICBib29sIGRvbmUgPSBmYWxzZTsKICAgIGJvb2wgaGFzRGlnaXQgPSBmYWxzZTsKICAgIExPT1A6CiAgICB3aGlsZSAoIWRvbmUpIHsKICAgICAgaWYgKCQwIDw9IG5leHQgJiYgbmV4dCA8PSAkOSkgewogICAgICAgIGhhc0RpZ2l0ID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoJGUsIG5leHQpIHx8IGlkZW50aWNhbCgkRSwgbmV4dCkpIHsKICAgICAgICBoYXNEaWdpdCA9IHRydWU7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRQTFVTKSB8fCBpZGVudGljYWwobmV4dCwgJE1JTlVTKSkgewogICAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICB9CiAgICAgICAgYm9vbCBoYXNFeHBvbmVudERpZ2l0cyA9IGZhbHNlOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICBpZiAoJDAgPD0gbmV4dCAmJiBuZXh0IDw9ICQ5KSB7CiAgICAgICAgICAgIGhhc0V4cG9uZW50RGlnaXRzID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghaGFzRXhwb25lbnREaWdpdHMpIHsKICAgICAgICAgICAgICBhcHBlbmRTeW50aGV0aWNTdWJzdHJpbmdUb2tlbihUb2tlblR5cGUuRE9VQkxFLCBzdGFydCwgdHJ1ZSwgJzAnKTsKICAgICAgICAgICAgICBwcmVwZW5kRXJyb3JUb2tlbihuZXcgVW50ZXJtaW5hdGVkVG9rZW4oCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VNaXNzaW5nRXhwb25lbnQsIHRva2VuU3RhcnQsIHN0cmluZ09mZnNldCkpOwogICAgICAgICAgICAgIHJldHVybiBuZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICB9CgogICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgIGNvbnRpbnVlIExPT1A7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG9uZSA9IHRydWU7CiAgICAgICAgY29udGludWUgTE9PUDsKICAgICAgfQogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgfQogICAgaWYgKCFoYXNEaWdpdCkgewogICAgICAvLyBSZWR1Y2Ugb2Zmc2V0LCB3ZSBhbHJlYWR5IGFkdmFuY2VkIHRvIHRoZSB0b2tlbiBwYXN0IHRoZSBwZXJpb2QuCiAgICAgIGFwcGVuZFN1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5JTlQsIHN0YXJ0LCB0cnVlLCAtMSk7CgogICAgICAvLyBUT0RPKGFoZSk6IFdyb25nIG9mZnNldCBmb3IgdGhlIHBlcmlvZC4gQ2Fubm90IGNhbGwgYmVnaW5Ub2tlbiBiZWNhdXNlCiAgICAgIC8vIHRoZSBzY2FubmVyIGFscmVhZHkgYWR2YW5jZWQgcGFzdCB0aGUgcGVyaW9kLgogICAgICBpZiAoaWRlbnRpY2FsKCRQRVJJT0QsIG5leHQpKSB7CiAgICAgICAgcmV0dXJuIHNlbGVjdCgKICAgICAgICAgICAgJFBFUklPRCwgVG9rZW5UeXBlLlBFUklPRF9QRVJJT0RfUEVSSU9ELCBUb2tlblR5cGUuUEVSSU9EX1BFUklPRCk7CiAgICAgIH0KICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5QRVJJT0QpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICAgIGFwcGVuZFN1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5ET1VCTEUsIHN0YXJ0LCB0cnVlKTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgaW50IHRva2VuaXplU2xhc2hPckNvbW1lbnQoaW50IG5leHQpIHsKICAgIGludCBzdGFydCA9IHNjYW5PZmZzZXQ7CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbCgkU1RBUiwgbmV4dCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplTXVsdGlMaW5lQ29tbWVudChuZXh0LCBzdGFydCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgkU0xBU0gsIG5leHQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVNpbmdsZUxpbmVDb21tZW50KG5leHQsIHN0YXJ0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCRFUSwgbmV4dCkpIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5TTEFTSF9FUSk7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9IGVsc2UgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlNMQVNIKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVMYW5ndWFnZVZlcnNpb25PclNpbmdsZUxpbmVDb21tZW50KGludCBuZXh0KSB7CiAgICBpbnQgc3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgbmV4dCA9IGFkdmFuY2UoKTsKCiAgICAvLyBEYXJ0IGRvYwogICAgaWYgKGlkZW50aWNhbCgkU0xBU0gsIHBlZWsoKSkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnQobmV4dCwgc3RhcnQpOwogICAgfQoKICAgIC8vICJAZGFydCIKICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICB3aGlsZSAoaWRlbnRpY2FsKCRTUEFDRSwgbmV4dCkpIHsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIH0KICAgIGlmICghaWRlbnRpY2FsKCRBVCwgbmV4dCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnRSZXN0KG5leHQsIHN0YXJ0LCBmYWxzZSk7CiAgICB9CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKCFpZGVudGljYWwoJGQsIG5leHQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVNpbmdsZUxpbmVDb21tZW50UmVzdChuZXh0LCBzdGFydCwgZmFsc2UpOwogICAgfQogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmICghaWRlbnRpY2FsKCRhLCBuZXh0KSkgewogICAgICByZXR1cm4gdG9rZW5pemVTaW5nbGVMaW5lQ29tbWVudFJlc3QobmV4dCwgc3RhcnQsIGZhbHNlKTsKICAgIH0KICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoIWlkZW50aWNhbCgkciwgbmV4dCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnRSZXN0KG5leHQsIHN0YXJ0LCBmYWxzZSk7CiAgICB9CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKCFpZGVudGljYWwoJHQsIG5leHQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVNpbmdsZUxpbmVDb21tZW50UmVzdChuZXh0LCBzdGFydCwgZmFsc2UpOwogICAgfQogICAgbmV4dCA9IGFkdmFuY2UoKTsKCiAgICAvLyAiPSIKICAgIHdoaWxlIChpZGVudGljYWwoJFNQQUNFLCBuZXh0KSkgewogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgfQogICAgaWYgKCFpZGVudGljYWwoJEVRLCBuZXh0KSkgewogICAgICByZXR1cm4gdG9rZW5pemVTaW5nbGVMaW5lQ29tbWVudFJlc3QobmV4dCwgc3RhcnQsIGZhbHNlKTsKICAgIH0KICAgIG5leHQgPSBhZHZhbmNlKCk7CgogICAgLy8gbWFqb3IKICAgIHdoaWxlIChpZGVudGljYWwoJFNQQUNFLCBuZXh0KSkgewogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgfQogICAgaW50IG1ham9yID0gMDsKICAgIGludCBtYWpvclN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgIHdoaWxlIChpc0RpZ2l0KG5leHQpKSB7CiAgICAgIG1ham9yID0gbWFqb3IgKiAxMCArIG5leHQgLSAkMDsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIH0KICAgIGlmIChzY2FuT2Zmc2V0ID09IG1ham9yU3RhcnQpIHsKICAgICAgcmV0dXJuIHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnRSZXN0KG5leHQsIHN0YXJ0LCBmYWxzZSk7CiAgICB9CgogICAgLy8gbWlub3IKICAgIGlmICghaWRlbnRpY2FsKCRQRVJJT0QsIG5leHQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVNpbmdsZUxpbmVDb21tZW50UmVzdChuZXh0LCBzdGFydCwgZmFsc2UpOwogICAgfQogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGludCBtaW5vciA9IDA7CiAgICBpbnQgbWlub3JTdGFydCA9IHNjYW5PZmZzZXQ7CiAgICB3aGlsZSAoaXNEaWdpdChuZXh0KSkgewogICAgICBtaW5vciA9IG1pbm9yICogMTAgKyBuZXh0IC0gJDA7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICB9CiAgICBpZiAoc2Nhbk9mZnNldCA9PSBtaW5vclN0YXJ0KSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVNpbmdsZUxpbmVDb21tZW50UmVzdChuZXh0LCBzdGFydCwgZmFsc2UpOwogICAgfQoKICAgIC8vIHRyYWlsaW5nIHNwYWNlcwogICAgd2hpbGUgKGlkZW50aWNhbCgkU1BBQ0UsIG5leHQpKSB7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICB9CiAgICBpZiAobmV4dCAhPSAkTEYgJiYgbmV4dCAhPSAkQ1IgJiYgbmV4dCAhPSAkRU9GKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVNpbmdsZUxpbmVDb21tZW50UmVzdChuZXh0LCBzdGFydCwgZmFsc2UpOwogICAgfQoKICAgIHZhciBsYW5ndWFnZVZlcnNpb24gPSBjcmVhdGVMYW5ndWFnZVZlcnNpb25Ub2tlbihzdGFydCwgbWFqb3IsIG1pbm9yKTsKICAgIGlmIChsYW5ndWFnZVZlcnNpb25DaGFuZ2VkICE9IG51bGwpIHsKICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IG1ha2UgdGhpcyByZXF1aXJlZCBhbmQgcmVtb3ZlIHRoZSBsYW5ndWFnZVZlcnNpb24gZmllbGQKICAgICAgbGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZCh0aGlzLCBsYW5ndWFnZVZlcnNpb24pOwogICAgfSBlbHNlIHsKICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IHJlbW92ZSB0aGlzIGhhY2sgYW5kIHJlcXVpcmUgbGlzdGVuZXIgdG8gdXBkYXRlCiAgICAgIC8vIHRoZSBzY2FubmVyJ3MgY29uZmlndXJhdGlvbi4KICAgICAgY29uZmlndXJhdGlvbiA9IFNjYW5uZXJDb25maWd1cmF0aW9uLmNsYXNzaWM7CiAgICB9CiAgICBpZiAoaW5jbHVkZUNvbW1lbnRzKSB7CiAgICAgIF9hcHBlbmRUb0NvbW1lbnRTdHJlYW0obGFuZ3VhZ2VWZXJzaW9uKTsKICAgIH0KICAgIHJldHVybiBuZXh0OwogIH0KCiAgaW50IHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnQoaW50IG5leHQsIGludCBzdGFydCkgewogICAgYm9vbCBkYXJ0ZG9jID0gaWRlbnRpY2FsKCRTTEFTSCwgcGVlaygpKTsKICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICByZXR1cm4gdG9rZW5pemVTaW5nbGVMaW5lQ29tbWVudFJlc3QobmV4dCwgc3RhcnQsIGRhcnRkb2MpOwogIH0KCiAgaW50IHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnRSZXN0KGludCBuZXh0LCBpbnQgc3RhcnQsIGJvb2wgZGFydGRvYykgewogICAgYm9vbCBhc2NpaU9ubHkgPSB0cnVlOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKG5leHQgPiAxMjcpIGFzY2lpT25seSA9IGZhbHNlOwogICAgICBpZiAoaWRlbnRpY2FsKCRMRiwgbmV4dCkgfHwKICAgICAgICAgIGlkZW50aWNhbCgkQ1IsIG5leHQpIHx8CiAgICAgICAgICBpZGVudGljYWwoJEVPRiwgbmV4dCkpIHsKICAgICAgICBpZiAoIWFzY2lpT25seSkgaGFuZGxlVW5pY29kZShzdGFydCk7CiAgICAgICAgaWYgKGRhcnRkb2MpIHsKICAgICAgICAgIGFwcGVuZERhcnREb2Moc3RhcnQsIFRva2VuVHlwZS5TSU5HTEVfTElORV9DT01NRU5ULCBhc2NpaU9ubHkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhcHBlbmRDb21tZW50KHN0YXJ0LCBUb2tlblR5cGUuU0lOR0xFX0xJTkVfQ09NTUVOVCwgYXNjaWlPbmx5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIH0KICB9CgogIGludCB0b2tlbml6ZU11bHRpTGluZUNvbW1lbnQoaW50IG5leHQsIGludCBzdGFydCkgewogICAgYm9vbCBhc2NpaU9ubHlDb21tZW50ID0gdHJ1ZTsgLy8gVHJhY2sgaWYgdGhlIGVudGlyZSBjb21tZW50IGlzIEFTQ0lJLgogICAgYm9vbCBhc2NpaU9ubHlMaW5lcyA9IHRydWU7IC8vIFRyYWNrIEFTQ0lJIHNpbmNlIHRoZSBsYXN0IGhhbmRsZVVuaWNvZGUuCiAgICBpbnQgdW5pY29kZVN0YXJ0ID0gc3RhcnQ7CiAgICBpbnQgbmVzdGluZyA9IDE7CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgYm9vbCBkYXJ0ZG9jID0gaWRlbnRpY2FsKCRTVEFSLCBuZXh0KTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChpZGVudGljYWwoJEVPRiwgbmV4dCkpIHsKICAgICAgICBpZiAoIWFzY2lpT25seUxpbmVzKSBoYW5kbGVVbmljb2RlKHVuaWNvZGVTdGFydCk7CiAgICAgICAgcHJlcGVuZEVycm9yVG9rZW4oVW50ZXJtaW5hdGVkVG9rZW4oCiAgICAgICAgICAgIG1lc3NhZ2VVbnRlcm1pbmF0ZWRDb21tZW50LCB0b2tlblN0YXJ0LCBzdHJpbmdPZmZzZXQpKTsKICAgICAgICBhZHZhbmNlQWZ0ZXJFcnJvcih0cnVlKTsKICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoJFNUQVIsIG5leHQpKSB7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICBpZiAoaWRlbnRpY2FsKCRTTEFTSCwgbmV4dCkpIHsKICAgICAgICAgIC0tbmVzdGluZzsKICAgICAgICAgIGlmICgwID09IG5lc3RpbmcpIHsKICAgICAgICAgICAgaWYgKCFhc2NpaU9ubHlMaW5lcykgaGFuZGxlVW5pY29kZSh1bmljb2RlU3RhcnQpOwogICAgICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgICAgICBpZiAoZGFydGRvYykgewogICAgICAgICAgICAgIGFwcGVuZERhcnREb2MoCiAgICAgICAgICAgICAgICAgIHN0YXJ0LCBUb2tlblR5cGUuTVVMVElfTElORV9DT01NRU5ULCBhc2NpaU9ubHlDb21tZW50KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBhcHBlbmRDb21tZW50KAogICAgICAgICAgICAgICAgICBzdGFydCwgVG9rZW5UeXBlLk1VTFRJX0xJTkVfQ09NTUVOVCwgYXNjaWlPbmx5Q29tbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoJFNMQVNILCBuZXh0KSkgewogICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgICAgaWYgKGlkZW50aWNhbCgkU1RBUiwgbmV4dCkpIHsKICAgICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgICAgICArK25lc3Rpbmc7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChuZXh0LCAkTEYpKSB7CiAgICAgICAgaWYgKCFhc2NpaU9ubHlMaW5lcykgewogICAgICAgICAgLy8gU3luY2hyb25pemUgdGhlIHN0cmluZyBvZmZzZXQgaW4gdGhlIHV0Zjggc2Nhbm5lci4KICAgICAgICAgIGhhbmRsZVVuaWNvZGUodW5pY29kZVN0YXJ0KTsKICAgICAgICAgIGFzY2lpT25seUxpbmVzID0gdHJ1ZTsKICAgICAgICAgIHVuaWNvZGVTdGFydCA9IHNjYW5PZmZzZXQ7CiAgICAgICAgfQogICAgICAgIGxpbmVGZWVkSW5NdWx0aWxpbmUoKTsKICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChuZXh0ID4gMTI3KSB7CiAgICAgICAgICBhc2NpaU9ubHlMaW5lcyA9IGZhbHNlOwogICAgICAgICAgYXNjaWlPbmx5Q29tbWVudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV4dDsKICB9CgogIHZvaWQgYXBwZW5kQ29tbWVudChpbnQgc3RhcnQsIFRva2VuVHlwZSB0eXBlLCBib29sIGFzY2lpT25seSkgewogICAgaWYgKCFpbmNsdWRlQ29tbWVudHMpIHJldHVybjsKICAgIENvbW1lbnRUb2tlbiBuZXdDb21tZW50ID0gY3JlYXRlQ29tbWVudFRva2VuKHR5cGUsIHN0YXJ0LCBhc2NpaU9ubHkpOwogICAgX2FwcGVuZFRvQ29tbWVudFN0cmVhbShuZXdDb21tZW50KTsKICB9CgogIHZvaWQgYXBwZW5kRGFydERvYyhpbnQgc3RhcnQsIFRva2VuVHlwZSB0eXBlLCBib29sIGFzY2lpT25seSkgewogICAgaWYgKCFpbmNsdWRlQ29tbWVudHMpIHJldHVybjsKICAgIFRva2VuIG5ld0NvbW1lbnQgPSBjcmVhdGVEYXJ0RG9jVG9rZW4odHlwZSwgc3RhcnQsIGFzY2lpT25seSk7CiAgICBfYXBwZW5kVG9Db21tZW50U3RyZWFtKG5ld0NvbW1lbnQpOwogIH0KCiAgLyoqCiAgICogQXBwZW5kIHRoZSBnaXZlbiB0b2tlbiB0byB0aGUgW3RhaWxdIG9mIHRoZSBjdXJyZW50IHN0cmVhbSBvZiB0b2tlbnMuCiAgICovCiAgdm9pZCBhcHBlbmRUb2tlbihUb2tlbiB0b2tlbikgewogICAgdGFpbC5uZXh0ID0gdG9rZW47CiAgICB0b2tlbi5wcmV2aW91cyA9IHRhaWw7CiAgICB0YWlsID0gdG9rZW47CiAgICBpZiAoY29tbWVudHMgIT0gbnVsbCAmJiBjb21tZW50cyA9PSB0b2tlbi5wcmVjZWRpbmdDb21tZW50cykgewogICAgICBjb21tZW50cyA9IG51bGw7CiAgICAgIGNvbW1lbnRzVGFpbCA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICAvLyBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBjb25zdHJ1Y3QgdGhlIHRva2VuCiAgICAgIC8vIGJlaW5nIGFwcGVuZGVkIHdpdGggcHJlY2VkaW5nIGNvbW1lbnRzIGlmIGFueQogICAgICBhc3NlcnQoY29tbWVudHMgPT0gbnVsbCB8fCB0b2tlbi5pc1N5bnRoZXRpYyB8fCB0b2tlbiBpcyBFcnJvclRva2VuKTsKICAgIH0KICB9CgogIHZvaWQgX2FwcGVuZFRvQ29tbWVudFN0cmVhbShUb2tlbiBuZXdDb21tZW50KSB7CiAgICBpZiAoY29tbWVudHMgPT0gbnVsbCkgewogICAgICBjb21tZW50cyA9IG5ld0NvbW1lbnQ7CiAgICAgIGNvbW1lbnRzVGFpbCA9IGNvbW1lbnRzOwogICAgfSBlbHNlIHsKICAgICAgY29tbWVudHNUYWlsLm5leHQgPSBuZXdDb21tZW50OwogICAgICBjb21tZW50c1RhaWwubmV4dC5wcmV2aW91cyA9IGNvbW1lbnRzVGFpbDsKICAgICAgY29tbWVudHNUYWlsID0gY29tbWVudHNUYWlsLm5leHQ7CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVSYXdTdHJpbmdLZXl3b3JkT3JJZGVudGlmaWVyKGludCBuZXh0KSB7CiAgICAvLyBbbmV4dF0gaXMgJHIuCiAgICBpbnQgbmV4dG5leHQgPSBwZWVrKCk7CiAgICBpZiAoaWRlbnRpY2FsKG5leHRuZXh0LCAkRFEpIHx8IGlkZW50aWNhbChuZXh0bmV4dCwgJFNRKSkgewogICAgICBpbnQgc3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICByZXR1cm4gdG9rZW5pemVTdHJpbmcobmV4dCwgc3RhcnQsIHRydWUpOwogICAgfQogICAgcmV0dXJuIHRva2VuaXplS2V5d29yZE9ySWRlbnRpZmllcihuZXh0LCB0cnVlKTsKICB9CgogIGludCB0b2tlbml6ZUtleXdvcmRPcklkZW50aWZpZXIoaW50IG5leHQsIGJvb2wgYWxsb3dEb2xsYXIpIHsKICAgIEtleXdvcmRTdGF0ZSBzdGF0ZSA9IEtleXdvcmRTdGF0ZS5LRVlXT1JEX1NUQVRFOwogICAgaW50IHN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgIC8vIFdlIGFsbG93IGEgbGVhZGluZyBjYXBpdGFsIGNoYXJhY3Rlci4KICAgIGlmICgkQSA8PSBuZXh0ICYmIG5leHQgPD0gJFopIHsKICAgICAgc3RhdGUgPSBzdGF0ZS5uZXh0Q2FwaXRhbChuZXh0KTsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIH0gZWxzZSBpZiAoJGEgPD0gbmV4dCAmJiBuZXh0IDw9ICR6KSB7CiAgICAgIC8vIERvIHRoZSBmaXJzdCBuZXh0IGNhbGwgb3V0c2lkZSB0aGUgbG9vcCB0byBhdm9pZCBhbiBhZGRpdGlvbmFsIHRlc3QKICAgICAgLy8gYW5kIHRvIG1ha2UgdGhlIGxvb3AgbW9ub21vcnBoaWMuCiAgICAgIHN0YXRlID0gc3RhdGUubmV4dChuZXh0KTsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIH0KICAgIHdoaWxlIChzdGF0ZSAhPSBudWxsICYmICRhIDw9IG5leHQgJiYgbmV4dCA8PSAkeikgewogICAgICBzdGF0ZSA9IHN0YXRlLm5leHQobmV4dCk7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICB9CiAgICBpZiAoc3RhdGUgPT0gbnVsbCB8fCBzdGF0ZS5rZXl3b3JkID09IG51bGwpIHsKICAgICAgcmV0dXJuIHRva2VuaXplSWRlbnRpZmllcihuZXh0LCBzdGFydCwgYWxsb3dEb2xsYXIpOwogICAgfQogICAgaWYgKCFfZW5hYmxlRXh0ZW5zaW9uTWV0aG9kcyAmJiBzdGF0ZS5rZXl3b3JkID09IEtleXdvcmQuRVhURU5TSU9OKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUlkZW50aWZpZXIobmV4dCwgc3RhcnQsIGFsbG93RG9sbGFyKTsKICAgIH0KICAgIGlmICghX2VuYWJsZU5vbk51bGxhYmxlICYmCiAgICAgICAgKHN0YXRlLmtleXdvcmQgPT0gS2V5d29yZC5MQVRFIHx8IHN0YXRlLmtleXdvcmQgPT0gS2V5d29yZC5SRVFVSVJFRCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplSWRlbnRpZmllcihuZXh0LCBzdGFydCwgYWxsb3dEb2xsYXIpOwogICAgfQogICAgaWYgKCgkQSA8PSBuZXh0ICYmIG5leHQgPD0gJFopIHx8CiAgICAgICAgKCQwIDw9IG5leHQgJiYgbmV4dCA8PSAkOSkgfHwKICAgICAgICBpZGVudGljYWwobmV4dCwgJF8pIHx8CiAgICAgICAgaWRlbnRpY2FsKG5leHQsICQkKSkgewogICAgICByZXR1cm4gdG9rZW5pemVJZGVudGlmaWVyKG5leHQsIHN0YXJ0LCBhbGxvd0RvbGxhcik7CiAgICB9IGVsc2UgewogICAgICBhcHBlbmRLZXl3b3JkVG9rZW4oc3RhdGUua2V5d29yZCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgLyoqCiAgICogW2FsbG93RG9sbGFyXSBjYW4gZXhjbHVkZSAnJCcsIHdoaWNoIGlzIG5vdCBhbGxvd2VkIGFzIHBhcnQgb2YgYSBzdHJpbmcKICAgKiBpbnRlcnBvbGF0aW9uIGlkZW50aWZpZXIuCiAgICovCiAgaW50IHRva2VuaXplSWRlbnRpZmllcihpbnQgbmV4dCwgaW50IHN0YXJ0LCBib29sIGFsbG93RG9sbGFyKSB7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoX2lzSWRlbnRpZmllckNoYXIobmV4dCwgYWxsb3dEb2xsYXIpKSB7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBJZGVudGlmaWVyIGVuZHMgaGVyZS4KICAgICAgICBpZiAoc3RhcnQgPT0gc2Nhbk9mZnNldCkgewogICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQobmV4dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFwcGVuZFN1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5JREVOVElGSUVSLCBzdGFydCwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV4dDsKICB9CgogIGludCB0b2tlbml6ZUF0KGludCBuZXh0KSB7CiAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkFUKTsKICAgIHJldHVybiBhZHZhbmNlKCk7CiAgfQoKICBpbnQgdG9rZW5pemVTdHJpbmcoaW50IG5leHQsIGludCBzdGFydCwgYm9vbCByYXcpIHsKICAgIGludCBxdW90ZUNoYXIgPSBuZXh0OwogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwocXVvdGVDaGFyLCBuZXh0KSkgewogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICBpZiAoaWRlbnRpY2FsKHF1b3RlQ2hhciwgbmV4dCkpIHsKICAgICAgICAvLyBNdWx0aWxpbmUgc3RyaW5nLgogICAgICAgIHJldHVybiB0b2tlbml6ZU11bHRpTGluZVN0cmluZyhxdW90ZUNoYXIsIHN0YXJ0LCByYXcpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEVtcHR5IHN0cmluZy4KICAgICAgICBhcHBlbmRTdWJzdHJpbmdUb2tlbihUb2tlblR5cGUuU1RSSU5HLCBzdGFydCwgdHJ1ZSk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgIH0KICAgIGlmIChyYXcpIHsKICAgICAgcmV0dXJuIHRva2VuaXplU2luZ2xlTGluZVJhd1N0cmluZyhuZXh0LCBxdW90ZUNoYXIsIHN0YXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVNpbmdsZUxpbmVTdHJpbmcobmV4dCwgcXVvdGVDaGFyLCBzdGFydCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBbbmV4dF0gaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgcXVvdGUuCiAgICogW3F1b3RlU3RhcnRdIGlzIHRoZSBzY2FuT2Zmc2V0IG9mIHRoZSBxdW90ZS4KICAgKgogICAqIFRoZSB0b2tlbiBjb250YWlucyBhIHN1YnN0cmluZyBvZiB0aGUgc291cmNlIGZpbGUsIGluY2x1ZGluZyB0aGUKICAgKiBzdHJpbmcgcXVvdGVzLCBiYWNrc2xhc2hlcyBmb3IgZXNjYXBpbmcuIEZvciBpbnRlcnBvbGF0ZWQgc3RyaW5ncywKICAgKiB0aGUgcGFydHMgYmVmb3JlIGFuZCBhZnRlciBhcmUgc2VwYXJhdGUgdG9rZW5zLgogICAqCiAgICogICAiYSAkYiBjIgogICAqCiAgICogZ2l2ZXMgU3RyaW5nVG9rZW4oImEgJCksIFN0cmluZ1Rva2VuKGIpIGFuZCBTdHJpbmdUb2tlbiggYyIpLgogICAqLwogIGludCB0b2tlbml6ZVNpbmdsZUxpbmVTdHJpbmcoaW50IG5leHQsIGludCBxdW90ZUNoYXIsIGludCBxdW90ZVN0YXJ0KSB7CiAgICBpbnQgc3RhcnQgPSBxdW90ZVN0YXJ0OwogICAgYm9vbCBhc2NpaU9ubHkgPSB0cnVlOwogICAgd2hpbGUgKCFpZGVudGljYWwobmV4dCwgcXVvdGVDaGFyKSkgewogICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRCQUNLU0xBU0gpKSB7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwobmV4dCwgJCQpKSB7CiAgICAgICAgaWYgKCFhc2NpaU9ubHkpIGhhbmRsZVVuaWNvZGUoc3RhcnQpOwogICAgICAgIG5leHQgPSB0b2tlbml6ZVN0cmluZ0ludGVycG9sYXRpb24oc3RhcnQsIGFzY2lpT25seSk7CiAgICAgICAgc3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgICAgIGFzY2lpT25seSA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKG5leHQgPD0gJENSICYmCiAgICAgICAgICAoaWRlbnRpY2FsKG5leHQsICRMRikgfHwKICAgICAgICAgICAgICBpZGVudGljYWwobmV4dCwgJENSKSB8fAogICAgICAgICAgICAgIGlkZW50aWNhbChuZXh0LCAkRU9GKSkpIHsKICAgICAgICBpZiAoIWFzY2lpT25seSkgaGFuZGxlVW5pY29kZShzdGFydCk7CiAgICAgICAgdW50ZXJtaW5hdGVkU3RyaW5nKHF1b3RlQ2hhciwgcXVvdGVTdGFydCwgc3RhcnQsCiAgICAgICAgICAgIGFzY2lpT25seTogYXNjaWlPbmx5LCBpc011bHRpTGluZTogZmFsc2UsIGlzUmF3OiBmYWxzZSk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgICAgaWYgKG5leHQgPiAxMjcpIGFzY2lpT25seSA9IGZhbHNlOwogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgfQogICAgaWYgKCFhc2NpaU9ubHkpIGhhbmRsZVVuaWNvZGUoc3RhcnQpOwogICAgLy8gQWR2YW5jZSBwYXN0IHRoZSBxdW90ZSBjaGFyYWN0ZXIuCiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLlNUUklORywgc3RhcnQsIGFzY2lpT25seSk7CiAgICByZXR1cm4gbmV4dDsKICB9CgogIGludCB0b2tlbml6ZVN0cmluZ0ludGVycG9sYXRpb24oaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSkgewogICAgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLlNUUklORywgc3RhcnQsIGFzY2lpT25seSk7CiAgICBiZWdpblRva2VuKCk7IC8vICQgc3RhcnRzIGhlcmUuCiAgICBpbnQgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwobmV4dCwgJE9QRU5fQ1VSTFlfQlJBQ0tFVCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplSW50ZXJwb2xhdGVkRXhwcmVzc2lvbihuZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUludGVycG9sYXRlZElkZW50aWZpZXIobmV4dCk7CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVJbnRlcnBvbGF0ZWRFeHByZXNzaW9uKGludCBuZXh0KSB7CiAgICBhcHBlbmRCZWdpbkdyb3VwKFRva2VuVHlwZS5TVFJJTkdfSU5URVJQT0xBVElPTl9FWFBSRVNTSU9OKTsKICAgIGJlZ2luVG9rZW4oKTsgLy8gVGhlIGV4cHJlc3Npb24gc3RhcnRzIGhlcmUuCiAgICBuZXh0ID0gYWR2YW5jZSgpOyAvLyBNb3ZlIHBhc3QgdGhlIGN1cmx5IGJyYWNrZXQuCiAgICB3aGlsZSAoIWlkZW50aWNhbChuZXh0LCAkRU9GKSAmJiAhaWRlbnRpY2FsKG5leHQsICRTVFgpKSB7CiAgICAgIG5leHQgPSBiaWdTd2l0Y2gobmV4dCk7CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRFT0YpKSB7CiAgICAgIGJlZ2luVG9rZW4oKTsKICAgICAgZGlzY2FyZEludGVycG9sYXRpb24oKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgICBuZXh0ID0gYWR2YW5jZSgpOyAvLyBNb3ZlIHBhc3QgdGhlICRTVFguCiAgICBiZWdpblRva2VuKCk7IC8vIFRoZSBzdHJpbmcgaW50ZXJwb2xhdGlvbiBzdWZmaXggc3RhcnRzIGhlcmUuCiAgICByZXR1cm4gbmV4dDsKICB9CgogIGludCB0b2tlbml6ZUludGVycG9sYXRlZElkZW50aWZpZXIoaW50IG5leHQpIHsKICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUik7CgogICAgaWYgKCRhIDw9IG5leHQgJiYgbmV4dCA8PSAkeiB8fAogICAgICAgICRBIDw9IG5leHQgJiYgbmV4dCA8PSAkWiB8fAogICAgICAgIGlkZW50aWNhbChuZXh0LCAkXykpIHsKICAgICAgYmVnaW5Ub2tlbigpOyAvLyBUaGUgaWRlbnRpZmllciBzdGFydHMgaGVyZS4KICAgICAgbmV4dCA9IHRva2VuaXplS2V5d29yZE9ySWRlbnRpZmllcihuZXh0LCBmYWxzZSk7CiAgICB9IGVsc2UgewogICAgICBiZWdpblRva2VuKCk7IC8vIFRoZSBzeW50aGV0aWMgaWRlbnRpZmllciBzdGFydHMgaGVyZS4KICAgICAgYXBwZW5kU3ludGhldGljU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLklERU5USUZJRVIsIHNjYW5PZmZzZXQsIHRydWUsICcnKTsKICAgICAgcHJlcGVuZEVycm9yVG9rZW4oVW50ZXJtaW5hdGVkVG9rZW4oCiAgICAgICAgICBtZXNzYWdlVW5leHBlY3RlZERvbGxhckluU3RyaW5nLCB0b2tlblN0YXJ0LCBzdHJpbmdPZmZzZXQpKTsKICAgIH0KICAgIGJlZ2luVG9rZW4oKTsgLy8gVGhlIHN0cmluZyBpbnRlcnBvbGF0aW9uIHN1ZmZpeCBzdGFydHMgaGVyZS4KICAgIHJldHVybiBuZXh0OwogIH0KCiAgaW50IHRva2VuaXplU2luZ2xlTGluZVJhd1N0cmluZyhpbnQgbmV4dCwgaW50IHF1b3RlQ2hhciwgaW50IHF1b3RlU3RhcnQpIHsKICAgIGJvb2wgYXNjaWlPbmx5ID0gdHJ1ZTsKICAgIHdoaWxlIChuZXh0ICE9ICRFT0YpIHsKICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCBxdW90ZUNoYXIpKSB7CiAgICAgICAgaWYgKCFhc2NpaU9ubHkpIGhhbmRsZVVuaWNvZGUocXVvdGVTdGFydCk7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICBhcHBlbmRTdWJzdHJpbmdUb2tlbihUb2tlblR5cGUuU1RSSU5HLCBxdW90ZVN0YXJ0LCBhc2NpaU9ubHkpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChuZXh0LCAkTEYpIHx8IGlkZW50aWNhbChuZXh0LCAkQ1IpKSB7CiAgICAgICAgaWYgKCFhc2NpaU9ubHkpIGhhbmRsZVVuaWNvZGUocXVvdGVTdGFydCk7CiAgICAgICAgdW50ZXJtaW5hdGVkU3RyaW5nKHF1b3RlQ2hhciwgcXVvdGVTdGFydCwgcXVvdGVTdGFydCwKICAgICAgICAgICAgYXNjaWlPbmx5OiBhc2NpaU9ubHksIGlzTXVsdGlMaW5lOiBmYWxzZSwgaXNSYXc6IHRydWUpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9IGVsc2UgaWYgKG5leHQgPiAxMjcpIHsKICAgICAgICBhc2NpaU9ubHkgPSBmYWxzZTsKICAgICAgfQogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgfQogICAgaWYgKCFhc2NpaU9ubHkpIGhhbmRsZVVuaWNvZGUocXVvdGVTdGFydCk7CiAgICB1bnRlcm1pbmF0ZWRTdHJpbmcocXVvdGVDaGFyLCBxdW90ZVN0YXJ0LCBxdW90ZVN0YXJ0LAogICAgICAgIGFzY2lpT25seTogYXNjaWlPbmx5LCBpc011bHRpTGluZTogZmFsc2UsIGlzUmF3OiB0cnVlKTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgaW50IHRva2VuaXplTXVsdGlMaW5lUmF3U3RyaW5nKGludCBxdW90ZUNoYXIsIGludCBxdW90ZVN0YXJ0KSB7CiAgICBib29sIGFzY2lpT25seVN0cmluZyA9IHRydWU7CiAgICBib29sIGFzY2lpT25seUxpbmUgPSB0cnVlOwogICAgaW50IHVuaWNvZGVTdGFydCA9IHF1b3RlU3RhcnQ7CiAgICBpbnQgbmV4dCA9IGFkdmFuY2UoKTsgLy8gQWR2YW5jZSBwYXN0IHRoZSAobGFzdCkgcXVvdGUgKG9mIHRocmVlKS4KICAgIG91dGVyOgogICAgd2hpbGUgKCFpZGVudGljYWwobmV4dCwgJEVPRikpIHsKICAgICAgd2hpbGUgKCFpZGVudGljYWwobmV4dCwgcXVvdGVDaGFyKSkgewogICAgICAgIGlmIChpZGVudGljYWwobmV4dCwgJExGKSkgewogICAgICAgICAgaWYgKCFhc2NpaU9ubHlMaW5lKSB7CiAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIHRoZSBzdHJpbmcgb2Zmc2V0IGluIHRoZSB1dGY4IHNjYW5uZXIuCiAgICAgICAgICAgIGhhbmRsZVVuaWNvZGUodW5pY29kZVN0YXJ0KTsKICAgICAgICAgICAgYXNjaWlPbmx5TGluZSA9IHRydWU7CiAgICAgICAgICAgIHVuaWNvZGVTdGFydCA9IHNjYW5PZmZzZXQ7CiAgICAgICAgICB9CiAgICAgICAgICBsaW5lRmVlZEluTXVsdGlsaW5lKCk7CiAgICAgICAgfSBlbHNlIGlmIChuZXh0ID4gMTI3KSB7CiAgICAgICAgICBhc2NpaU9ubHlMaW5lID0gZmFsc2U7CiAgICAgICAgICBhc2NpaU9ubHlTdHJpbmcgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRFT0YpKSBicmVhayBvdXRlcjsKICAgICAgfQogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICBpZiAoaWRlbnRpY2FsKG5leHQsIHF1b3RlQ2hhcikpIHsKICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIGlmIChpZGVudGljYWwobmV4dCwgcXVvdGVDaGFyKSkgewogICAgICAgICAgaWYgKCFhc2NpaU9ubHlMaW5lKSBoYW5kbGVVbmljb2RlKHVuaWNvZGVTdGFydCk7CiAgICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgICAgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLlNUUklORywgcXVvdGVTdGFydCwgYXNjaWlPbmx5U3RyaW5nKTsKICAgICAgICAgIHJldHVybiBuZXh0OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKCFhc2NpaU9ubHlMaW5lKSBoYW5kbGVVbmljb2RlKHVuaWNvZGVTdGFydCk7CiAgICB1bnRlcm1pbmF0ZWRTdHJpbmcocXVvdGVDaGFyLCBxdW90ZVN0YXJ0LCBxdW90ZVN0YXJ0LAogICAgICAgIGFzY2lpT25seTogYXNjaWlPbmx5TGluZSwgaXNNdWx0aUxpbmU6IHRydWUsIGlzUmF3OiB0cnVlKTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgaW50IHRva2VuaXplTXVsdGlMaW5lU3RyaW5nKGludCBxdW90ZUNoYXIsIGludCBxdW90ZVN0YXJ0LCBib29sIHJhdykgewogICAgaWYgKHJhdykgcmV0dXJuIHRva2VuaXplTXVsdGlMaW5lUmF3U3RyaW5nKHF1b3RlQ2hhciwgcXVvdGVTdGFydCk7CiAgICBpbnQgc3RhcnQgPSBxdW90ZVN0YXJ0OwogICAgYm9vbCBhc2NpaU9ubHlTdHJpbmcgPSB0cnVlOwogICAgYm9vbCBhc2NpaU9ubHlMaW5lID0gdHJ1ZTsKICAgIGludCB1bmljb2RlU3RhcnQgPSBzdGFydDsKICAgIGludCBuZXh0ID0gYWR2YW5jZSgpOyAvLyBBZHZhbmNlIHBhc3QgdGhlIChsYXN0KSBxdW90ZSAob2YgdGhyZWUpLgogICAgd2hpbGUgKCFpZGVudGljYWwobmV4dCwgJEVPRikpIHsKICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCAkJCkpIHsKICAgICAgICBpZiAoIWFzY2lpT25seUxpbmUpIGhhbmRsZVVuaWNvZGUodW5pY29kZVN0YXJ0KTsKICAgICAgICBuZXh0ID0gdG9rZW5pemVTdHJpbmdJbnRlcnBvbGF0aW9uKHN0YXJ0LCBhc2NpaU9ubHlTdHJpbmcpOwogICAgICAgIHN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgICAgICB1bmljb2RlU3RhcnQgPSBzdGFydDsKICAgICAgICBhc2NpaU9ubHlTdHJpbmcgPSB0cnVlOyAvLyBBIG5ldyBzdHJpbmcgdG9rZW4gaXMgY3JlYXRlZCBmb3IgdGhlIHJlc3QuCiAgICAgICAgYXNjaWlPbmx5TGluZSA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCBxdW90ZUNoYXIpKSB7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICBpZiAoaWRlbnRpY2FsKG5leHQsIHF1b3RlQ2hhcikpIHsKICAgICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgICAgICBpZiAoaWRlbnRpY2FsKG5leHQsIHF1b3RlQ2hhcikpIHsKICAgICAgICAgICAgaWYgKCFhc2NpaU9ubHlMaW5lKSBoYW5kbGVVbmljb2RlKHVuaWNvZGVTdGFydCk7CiAgICAgICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgICAgICAgIGFwcGVuZFN1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5TVFJJTkcsIHN0YXJ0LCBhc2NpaU9ubHlTdHJpbmcpOwogICAgICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQkFDS1NMQVNIKSkgewogICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCAkRU9GKSkgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCAkTEYpKSB7CiAgICAgICAgaWYgKCFhc2NpaU9ubHlMaW5lKSB7CiAgICAgICAgICAvLyBTeW5jaHJvbml6ZSB0aGUgc3RyaW5nIG9mZnNldCBpbiB0aGUgdXRmOCBzY2FubmVyLgogICAgICAgICAgaGFuZGxlVW5pY29kZSh1bmljb2RlU3RhcnQpOwogICAgICAgICAgYXNjaWlPbmx5TGluZSA9IHRydWU7CiAgICAgICAgICB1bmljb2RlU3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgICAgIH0KICAgICAgICBsaW5lRmVlZEluTXVsdGlsaW5lKCk7CiAgICAgIH0gZWxzZSBpZiAobmV4dCA+IDEyNykgewogICAgICAgIGFzY2lpT25seVN0cmluZyA9IGZhbHNlOwogICAgICAgIGFzY2lpT25seUxpbmUgPSBmYWxzZTsKICAgICAgfQogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgfQogICAgaWYgKCFhc2NpaU9ubHlMaW5lKSBoYW5kbGVVbmljb2RlKHVuaWNvZGVTdGFydCk7CiAgICB1bnRlcm1pbmF0ZWRTdHJpbmcocXVvdGVDaGFyLCBxdW90ZVN0YXJ0LCBzdGFydCwKICAgICAgICBhc2NpaU9ubHk6IGFzY2lpT25seVN0cmluZywgaXNNdWx0aUxpbmU6IHRydWUsIGlzUmF3OiBmYWxzZSk7CiAgICByZXR1cm4gbmV4dDsKICB9CgogIGludCB1bmV4cGVjdGVkKGludCBjaGFyYWN0ZXIpIHsKICAgIHZhciBlcnJvclRva2VuID0gYnVpbGRVbmV4cGVjdGVkQ2hhcmFjdGVyVG9rZW4oY2hhcmFjdGVyLCB0b2tlblN0YXJ0KTsKICAgIGlmIChlcnJvclRva2VuIGlzIE5vbkFzY2lpSWRlbnRpZmllclRva2VuKSB7CiAgICAgIGludCBjaGFyT2Zmc2V0OwogICAgICBMaXN0PGludD4gY29kZVVuaXRzID0gPGludD5bXTsKICAgICAgaWYgKHRhaWwudHlwZSA9PSBUb2tlblR5cGUuSURFTlRJRklFUiAmJiB0YWlsLmNoYXJFbmQgPT0gdG9rZW5TdGFydCkgewogICAgICAgIGNoYXJPZmZzZXQgPSB0YWlsLmNoYXJPZmZzZXQ7CiAgICAgICAgY29kZVVuaXRzLmFkZEFsbCh0YWlsLmxleGVtZS5jb2RlVW5pdHMpOwogICAgICAgIHRhaWwgPSB0YWlsLnByZXZpb3VzOwogICAgICB9IGVsc2UgewogICAgICAgIGNoYXJPZmZzZXQgPSBlcnJvclRva2VuLmNoYXJPZmZzZXQ7CiAgICAgIH0KICAgICAgY29kZVVuaXRzLmFkZChlcnJvclRva2VuLmNoYXJhY3Rlcik7CiAgICAgIHByZXBlbmRFcnJvclRva2VuKGVycm9yVG9rZW4pOwogICAgICBpbnQgbmV4dCA9IGFkdmFuY2VBZnRlckVycm9yKHRydWUpOwogICAgICB3aGlsZSAoX2lzSWRlbnRpZmllckNoYXIobmV4dCwgdHJ1ZSkpIHsKICAgICAgICBjb2RlVW5pdHMuYWRkKG5leHQpOwogICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIH0KICAgICAgYXBwZW5kVG9rZW4oU3RyaW5nVG9rZW4uZnJvbVN0cmluZyhUb2tlblR5cGUuSURFTlRJRklFUiwKICAgICAgICAgIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpLCBjaGFyT2Zmc2V0KSk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfSBlbHNlIHsKICAgICAgcHJlcGVuZEVycm9yVG9rZW4oZXJyb3JUb2tlbik7CiAgICAgIHJldHVybiBhZHZhbmNlQWZ0ZXJFcnJvcih0cnVlKTsKICAgIH0KICB9CgogIHZvaWQgdW50ZXJtaW5hdGVkU3RyaW5nKGludCBxdW90ZUNoYXIsIGludCBxdW90ZVN0YXJ0LCBpbnQgc3RhcnQsCiAgICAgIHtib29sIGFzY2lpT25seSwgYm9vbCBpc011bHRpTGluZSwgYm9vbCBpc1Jhd30pIHsKICAgIFN0cmluZyBzdWZmaXggPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoCiAgICAgICAgaXNNdWx0aUxpbmUgPyBbcXVvdGVDaGFyLCBxdW90ZUNoYXIsIHF1b3RlQ2hhcl0gOiBbcXVvdGVDaGFyXSk7CiAgICBTdHJpbmcgcHJlZml4ID0gaXNSYXcgPyAnciRzdWZmaXgnIDogc3VmZml4OwoKICAgIGFwcGVuZFN5bnRoZXRpY1N1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5TVFJJTkcsIHN0YXJ0LCBhc2NpaU9ubHksIHN1ZmZpeCk7CiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgZXJyb3IgaXMgcmVwb3J0ZWQgb24gYSB2aXNpYmxlIHRva2VuCiAgICBpbnQgZXJyb3JTdGFydCA9IHRva2VuU3RhcnQgPCBzdHJpbmdPZmZzZXQgPyB0b2tlblN0YXJ0IDogcXVvdGVTdGFydDsKICAgIHByZXBlbmRFcnJvclRva2VuKG5ldyBVbnRlcm1pbmF0ZWRTdHJpbmcocHJlZml4LCBlcnJvclN0YXJ0LCBzdHJpbmdPZmZzZXQpKTsKICB9CgogIGludCBhZHZhbmNlQWZ0ZXJFcnJvcihib29sIHNob3VsZEFkdmFuY2UpIHsKICAgIGlmIChhdEVuZE9mRmlsZSgpKSByZXR1cm4gJEVPRjsKICAgIGlmIChzaG91bGRBZHZhbmNlKSB7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7IC8vIEVuc3VyZSBwcm9ncmVzcy4KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICB9Cn0KClRva2VuVHlwZSBjbG9zZUJyYWNlSW5mb0ZvcihCZWdpblRva2VuIGJlZ2luKSB7CiAgcmV0dXJuIGNvbnN0IHsKICAgICcoJzogVG9rZW5UeXBlLkNMT1NFX1BBUkVOLAogICAgJ1snOiBUb2tlblR5cGUuQ0xPU0VfU1FVQVJFX0JSQUNLRVQsCiAgICAneyc6IFRva2VuVHlwZS5DTE9TRV9DVVJMWV9CUkFDS0VULAogICAgJzwnOiBUb2tlblR5cGUuR1QsCiAgICByJyR7JzogVG9rZW5UeXBlLkNMT1NFX0NVUkxZX0JSQUNLRVQsCiAgICAnPy5bJzogVG9rZW5UeXBlLkNMT1NFX1NRVUFSRV9CUkFDS0VULAogIH1bYmVnaW4ubGV4ZW1lXTsKfQoKY2xhc3MgTGluZVN0YXJ0cyBleHRlbmRzIE9iamVjdCB3aXRoIExpc3RNaXhpbjxpbnQ+IHsKICBMaXN0PGludD4gYXJyYXk7CiAgaW50IGFycmF5TGVuZ3RoID0gMDsKCiAgTGluZVN0YXJ0cyhpbnQgbnVtYmVyT2ZCeXRlc0hpbnQpIHsKICAgIC8vIExldCdzIGFzc3VtZSB0aGUgYXZlcmFnZSBEYXJ0IGZpbGUgaXMgMzAwIGJ5dGVzLgogICAgaWYgKG51bWJlck9mQnl0ZXNIaW50ID09IG51bGwpIG51bWJlck9mQnl0ZXNIaW50ID0gMzAwOwoKICAgIC8vIExldCdzIGFzc3VtZSB3ZSBoYXZlIG9uIGF2ZXJhZ2UgMjIgYnl0ZXMgcGVyIGxpbmUuCiAgICBmaW5hbCBpbnQgZXhwZWN0ZWROdW1iZXJPZkxpbmVzID0gMSArIChudW1iZXJPZkJ5dGVzSGludCB+LyAyMik7CgogICAgaWYgKG51bWJlck9mQnl0ZXNIaW50ID4gNjU1MzUpIHsKICAgICAgYXJyYXkgPSBuZXcgVWludDMyTGlzdChleHBlY3RlZE51bWJlck9mTGluZXMpOwogICAgfSBlbHNlIHsKICAgICAgYXJyYXkgPSBuZXcgVWludDE2TGlzdChleHBlY3RlZE51bWJlck9mTGluZXMpOwogICAgfQoKICAgIC8vIFRoZSBmaXJzdCBsaW5lIHN0YXJ0cyBhdCBjaGFyYWN0ZXIgb2Zmc2V0IDAuCiAgICBhZGQoMCk7CiAgfQoKICAvLyBJbXBsZW1lbnQgYWJzdHJhY3QgbWVtYmVycyB1c2VkIGJ5IFtMaXN0TWl4aW5dCgogIGludCBnZXQgbGVuZ3RoID0+IGFycmF5TGVuZ3RoOwoKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBhc3NlcnQoaW5kZXggPCBhcnJheUxlbmd0aCk7CiAgICByZXR1cm4gYXJyYXlbaW5kZXhdOwogIH0KCiAgdm9pZCBzZXQgbGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKICAgIGlmIChuZXdMZW5ndGggPiBhcnJheS5sZW5ndGgpIHsKICAgICAgZ3JvdyhuZXdMZW5ndGgpOwogICAgfQogICAgYXJyYXlMZW5ndGggPSBuZXdMZW5ndGg7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID4gNjU1MzUgJiYgYXJyYXkgaXMhIFVpbnQzMkxpc3QpIHsKICAgICAgc3dpdGNoVG9VaW50MzIoYXJyYXkubGVuZ3RoKTsKICAgIH0KICAgIGFycmF5W2luZGV4XSA9IHZhbHVlOwogIH0KCiAgLy8gU3BlY2lhbGl6ZSBtZXRob2RzIGZyb20gW0xpc3RNaXhpbl0uCiAgdm9pZCBhZGQoaW50IHZhbHVlKSB7CiAgICBpZiAoYXJyYXlMZW5ndGggPj0gYXJyYXkubGVuZ3RoKSB7CiAgICAgIGdyb3coMCk7CiAgICB9CiAgICBpZiAodmFsdWUgPiA2NTUzNSAmJiBhcnJheSBpcyEgVWludDMyTGlzdCkgewogICAgICBzd2l0Y2hUb1VpbnQzMihhcnJheS5sZW5ndGgpOwogICAgfQogICAgYXJyYXlbYXJyYXlMZW5ndGgrK10gPSB2YWx1ZTsKICB9CgogIC8vIEhlbHBlciBtZXRob2RzLgoKICB2b2lkIGdyb3coaW50IG5ld0xlbmd0aE1pbmltdW0pIHsKICAgIGludCBuZXdMZW5ndGggPSBhcnJheS5sZW5ndGggKiAyOwogICAgaWYgKG5ld0xlbmd0aCA8IG5ld0xlbmd0aE1pbmltdW0pIG5ld0xlbmd0aCA9IG5ld0xlbmd0aE1pbmltdW07CgogICAgaWYgKGFycmF5IGlzIFVpbnQxNkxpc3QpIHsKICAgICAgZmluYWwgbmV3QXJyYXkgPSBuZXcgVWludDE2TGlzdChuZXdMZW5ndGgpOwogICAgICBuZXdBcnJheS5zZXRSYW5nZSgwLCBhcnJheUxlbmd0aCwgYXJyYXkpOwogICAgICBhcnJheSA9IG5ld0FycmF5OwogICAgfSBlbHNlIHsKICAgICAgc3dpdGNoVG9VaW50MzIobmV3TGVuZ3RoKTsKICAgIH0KICB9CgogIHZvaWQgc3dpdGNoVG9VaW50MzIoaW50IG5ld0xlbmd0aCkgewogICAgZmluYWwgbmV3QXJyYXkgPSBuZXcgVWludDMyTGlzdChuZXdMZW5ndGgpOwogICAgbmV3QXJyYXkuc2V0UmFuZ2UoMCwgYXJyYXlMZW5ndGgsIGFycmF5KTsKICAgIGFycmF5ID0gbmV3QXJyYXk7CiAgfQp9CgovLy8gW1NjYW5uZXJDb25maWd1cmF0aW9uXSBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgY29uZmlndXJpbmcgd2hpY2ggdG9rZW5zCi8vLyB0aGUgc2Nhbm5lciBwcm9kdWNlcyBiYXNlZCB1cG9uIHRoZSBEYXJ0IGxhbmd1YWdlIGxldmVsLgpjbGFzcyBTY2FubmVyQ29uZmlndXJhdGlvbiB7CiAgc3RhdGljIGNvbnN0IGNsYXNzaWMgPSBTY2FubmVyQ29uZmlndXJhdGlvbigpOwogIHN0YXRpYyBjb25zdCBub25OdWxsYWJsZSA9IFNjYW5uZXJDb25maWd1cmF0aW9uKGVuYWJsZU5vbk51bGxhYmxlOiB0cnVlKTsKCiAgLy8vIEV4cGVyaW1lbnRhbCBmbGFnIGZvciBlbmFibGluZyBzY2FubmluZyBvZiB0aGUgYGV4dGVuc2lvbmAga2V5d29yZC4KICBmaW5hbCBib29sIGVuYWJsZUV4dGVuc2lvbk1ldGhvZHM7CgogIC8vLyBFeHBlcmltZW50YWwgZmxhZyBmb3IgZW5hYmxpbmcgc2Nhbm5pbmcgb2YgTk5CRCB0b2tlbnMKICAvLy8gc3VjaCBhcyAncmVxdWlyZWQnIGFuZCAnbGF0ZScKICBmaW5hbCBib29sIGVuYWJsZU5vbk51bGxhYmxlOwoKICAvLy8gRXhwZXJpbWVudGFsIGZsYWcgZm9yIGVuYWJsaW5nIHNjYW5uaW5nIG9mIGA+Pj5gLgogIC8vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9sYW5ndWFnZS9pc3N1ZXMvNjEKICAvLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvbGFuZ3VhZ2UvaXNzdWVzLzYwCiAgZmluYWwgYm9vbCBlbmFibGVUcmlwbGVTaGlmdDsKCiAgY29uc3QgU2Nhbm5lckNvbmZpZ3VyYXRpb24oewogICAgYm9vbCBlbmFibGVFeHRlbnNpb25NZXRob2RzLAogICAgYm9vbCBlbmFibGVOb25OdWxsYWJsZSwKICAgIGJvb2wgZW5hYmxlVHJpcGxlU2hpZnQsCiAgfSkgIDogdGhpcy5lbmFibGVFeHRlbnNpb25NZXRob2RzID0gZW5hYmxlRXh0ZW5zaW9uTWV0aG9kcyA/PyBmYWxzZSwKICAgICAgICB0aGlzLmVuYWJsZU5vbk51bGxhYmxlID0gZW5hYmxlTm9uTnVsbGFibGUgPz8g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bnRlcmZhY2UuCi8vLwovLy8gQWxsIG9wZXJhdGlvbnMgYXJlIGRlZmluZWQgaW4gdGVybXMgb2YgYGxlbmd0aGAsIGBvcGVyYXRvcltdYCwKLy8vIGBvcGVyYXRvcltdPWAgYW5kIGBsZW5ndGg9YCwgd2hpY2ggbmVlZCB0byBiZSBpbXBsZW1lbnRlZC4KLy8vCi8vLyAqTk9USUNFKjogRm9yd2FyZGluZyBqdXN0IHRoZXNlIGZvdXIgb3BlcmF0aW9ucyB0byBhIG5vcm1hbCBncm93YWJsZSBbTGlzdF0KLy8vIChhcyBjcmVhdGVkIGJ5IGBuZXcgTGlzdCgpYCkgd2lsbCBnaXZlIHZlcnkgYmFkIHBlcmZvcm1hbmNlIGZvciBgYWRkYCBhbmQKLy8vIGBhZGRBbGxgIG9wZXJhdGlvbnMgb2YgYExpc3RCYXNlYC4gVGhlc2Ugb3BlcmF0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYnkKLy8vIGluY3JlYXNpbmcgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBieSBvbmUgZm9yIGVhY2ggYGFkZGAgb3BlcmF0aW9uLCBhbmQKLy8vIHJlcGVhdGVkbHkgaW5jcmVhc2luZyB0aGUgbGVuZ3RoIG9mIGEgZ3Jvd2FibGUgbGlzdCBpcyBub3QgZWZmaWNpZW50LgovLy8gVG8gYXZvaWQgdGhpcywgZWl0aGVyIG92ZXJyaWRlICdhZGQnIGFuZCAnYWRkQWxsJyB0byBhbHNvIGZvcndhcmQgZGlyZWN0bHkKLy8vIHRvIHRoZSBncm93YWJsZSBsaXN0LCBvciwgcHJlZmVyYWJseSwgdXNlIGBEZWxlZ2F0aW5nTGlzdGAgZnJvbQovLy8gInBhY2thZ2U6Y29sbGVjdGlvbi93cmFwcGVycy5kYXJ0IiBpbnN0ZWFkLgphYnN0cmFjdCBjbGFzcyBMaXN0QmFzZTxFPiBleHRlbmRzIE9iamVjdCB3aXRoIExpc3RNaXhpbjxFPiB7CiAgLy8vIENvbnZlcnQgYSBgTGlzdGAgdG8gYSBzdHJpbmcgYXMgYFtlYWNoLCBlbGVtZW50LCBhcywgc3RyaW5nXWAuCiAgLy8vCiAgLy8vIEhhbmRsZXMgY2lyY3VsYXIgcmVmZXJlbmNlcyB3aGVyZSBjb252ZXJ0aW5nIG9uZSBvZiB0aGUgZWxlbWVudHMKICAvLy8gdG8gYSBzdHJpbmcgZW5kcyB1cCBjb252ZXJ0aW5nIFtsaXN0XSB0byBhIHN0cmluZyBhZ2Fpbi4KICBzdGF0aWMgU3RyaW5nIGxpc3RUb1N0cmluZyhMaXN0IGxpc3QpID0+CiAgICAgIEl0ZXJhYmxlQmFzZS5pdGVyYWJsZVRvRnVsbFN0cmluZyhsaXN0LCAnWycsICddJyk7Cn0KCi8vLyBCYXNlIGltcGxlbWVudGF0aW9uIG9mIGEgW0xpc3RdIGNsYXNzLgovLy8KLy8vIGBMaXN0TWl4aW5gIGNhbiBiZSB1c2VkIGFzIGEgbWl4aW4gdG8gbWFrZSBhIGNsYXNzIGltcGxlbWVudAovLy8gdGhlIGBMaXN0YCBpbnRlcmZhY2UuCi8vLwovLy8gVGhpcyBpbXBsZW1lbnRzIGFsbCByZWFkIG9wZXJhdGlvbnMgdXNpbmcgb25seSB0aGUgYGxlbmd0aGAgYW5kCi8vLyBgb3BlcmF0b3JbXWAgbWVtYmVycy4gSXQgaW1wbGVtZW50cyB3cml0ZSBvcGVyYXRpb25zIHVzaW5nIHRob3NlIGFuZAovLy8gYGxlbmd0aD1gIGFuZCBgb3BlcmF0b3JbXT1gCi8vLwovLy8gKk5PVElDRSo6IEZvcndhcmRpbmcganVzdCB0aGVzZSBmb3VyIG9wZXJhdGlvbnMgdG8gYSBub3JtYWwgZ3Jvd2FibGUgW0xpc3RdCi8vLyAoYXMgY3JlYXRlZCBieSBgbmV3IExpc3QoKWApIHdpbGwgZ2l2ZSB2ZXJ5IGJhZCBwZXJmb3JtYW5jZSBmb3IgYGFkZGAgYW5kCi8vLyBgYWRkQWxsYCBvcGVyYXRpb25zIG9mIGBMaXN0QmFzZWAuIFRoZXNlIG9wZXJhdGlvbnMgYXJlIGltcGxlbWVudGVkIGJ5Ci8vLyBpbmNyZWFzaW5nIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYnkgb25lIGZvciBlYWNoIGBhZGRgIG9wZXJhdGlvbiwgYW5kCi8vLyByZXBlYXRlZGx5IGluY3JlYXNpbmcgdGhlIGxlbmd0aCBvZiBhIGdyb3dhYmxlIGxpc3QgaXMgbm90IGVmZmljaWVudC4KLy8vIFRvIGF2b2lkIHRoaXMsIGVpdGhlciBvdmVycmlkZSAnYWRkJyBhbmQgJ2FkZEFsbCcgdG8gYWxzbyBmb3J3YXJkIGRpcmVjdGx5Ci8vLyB0byB0aGUgZ3Jvd2FibGUgbGlzdCwgb3IsIGlmIHBvc3NpYmxlLCB1c2UgYERlbGVnYXRpbmdMaXN0YCBmcm9tCi8vLyAicGFja2FnZTpjb2xsZWN0aW9uL3dyYXBwZXJzLmRhcnQiIGluc3RlYWQuCmFic3RyYWN0IGNsYXNzIExpc3RNaXhpbjxFPiBpbXBsZW1lbnRzIExpc3Q8RT4gewogIC8vIEl0ZXJhYmxlIGludGVyZmFjZS4KICAvLyBUT0RPKGxybik6IFdoZW4gd2UgZ2V0IGNvbXBvc2FibGUgbWl4aW5zLCByZXVzZSBJdGVyYWJsZU1peGluIGluc3RlYWQKICAvLyBvZiByZWRhY2xhdGluZyBldmVyeXRoaW5nLgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBMaXN0SXRlcmF0b3I8RT4odGhpcyk7CgogIEUgZWxlbWVudEF0KGludCBpbmRleCkgPT4gdGhpc1tpbmRleF07CgogIEl0ZXJhYmxlPEU+IGZvbGxvd2VkQnkoSXRlcmFibGU8RT4gb3RoZXIpID0+CiAgICAgIEZvbGxvd2VkQnlJdGVyYWJsZTxFPi5maXJzdEVmZmljaWVudCh0aGlzLCBvdGhlcik7CgogIHZvaWQgZm9yRWFjaCh2b2lkIGFjdGlvbihFIGVsZW1lbnQpKSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGFjdGlvbih0aGlzW2ldKTsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBsZW5ndGggPT0gMDsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKCiAgRSBnZXQgZmlyc3QgewogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHJldHVybiB0aGlzWzBdOwogIH0KCiAgdm9pZCBzZXQgZmlyc3QoRSB2YWx1ZSkgewogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHRoaXNbMF0gPSB2YWx1ZTsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHJldHVybiB0aGlzW2xlbmd0aCAtIDFdOwogIH0KCiAgdm9pZCBzZXQgbGFzdChFIHZhbHVlKSB7CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdGhpc1tsZW5ndGggLSAxXSA9IHZhbHVlOwogIH0KCiAgRSBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICBpZiAobGVuZ3RoID4gMSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgcmV0dXJuIHRoaXNbMF07CiAgfQoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiB0cnVlOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIGV2ZXJ5KGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICghdGVzdCh0aGlzW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgYW55KGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRSBmaXJzdFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgRSBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiBlbGVtZW50OwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBsYXN0V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IGxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIEUgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgRSBtYXRjaDsKICAgIGJvb2wgbWF0Y2hGb3VuZCA9IGZhbHNlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBFIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIGlmIChtYXRjaEZvdW5kKSB7CiAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgfQogICAgICAgIG1hdGNoRm91bmQgPSB0cnVlOwogICAgICAgIG1hdGNoID0gZWxlbWVudDsKICAgICAgfQogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICBpZiAobWF0Y2hGb3VuZCkgcmV0dXJuIG1hdGNoOwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIFN0cmluZyBqb2luKFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSB7CiAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiAiIjsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBTdHJpbmdCdWZmZXIoKS4ud3JpdGVBbGwodGhpcywgc2VwYXJhdG9yKTsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIEl0ZXJhYmxlPEU+IHdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBXaGVyZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwoKICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBXaGVyZVR5cGVJdGVyYWJsZTxUPih0aGlzKTsKCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihFIGVsZW1lbnQpKSA9PiBNYXBwZWRMaXN0SXRlcmFibGU8RSwgVD4odGhpcywgZik7CgogIEl0ZXJhYmxlPFQ+IGV4cGFuZDxUPihJdGVyYWJsZTxUPiBmKEUgZWxlbWVudCkpID0+CiAgICAgIEV4cGFuZEl0ZXJhYmxlPEUsIFQ+KHRoaXMsIGYpOwoKICBFIHJlZHVjZShFIGNvbWJpbmUoRSBwcmV2aW91c1ZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgRSB2YWx1ZSA9IHRoaXNbMF07CiAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgdGhpc1tpXSk7CiAgICAgIGlmIChsZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgcHJldmlvdXNWYWx1ZSwgRSBlbGVtZW50KSkgewogICAgdmFyIHZhbHVlID0gaW5pdGlhbFZhbHVlOwogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICB2YWx1ZSA9IGNvbWJpbmUodmFsdWUsIHRoaXNbaV0pOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBJdGVyYWJsZTxFPiBza2lwKGludCBjb3VudCkgPT4gU3ViTGlzdEl0ZXJhYmxlPEU+KHRoaXMsIGNvdW50LCBudWxsKTsKCiAgSXRlcmFibGU8RT4gc2tpcFdoaWxlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICByZXR1cm4gU2tpcFdoaWxlSXRlcmFibGU8RT4odGhpcywgdGVzdCk7CiAgfQoKICBJdGVyYWJsZTxFPiB0YWtlKGludCBjb3VudCkgPT4gU3ViTGlzdEl0ZXJhYmxlPEU+KHRoaXMsIDAsIGNvdW50KTsKCiAgSXRlcmFibGU8RT4gdGFrZVdoaWxlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICByZXR1cm4gVGFrZVdoaWxlSXRlcmFibGU8RT4odGhpcywgdGVzdCk7CiAgfQoKICBMaXN0PEU+IHRvTGlzdCh7Ym9vbCBncm93YWJsZSA9IHRydWV9KSB7CiAgICBMaXN0PEU+IHJlc3VsdDsKICAgIGlmIChncm93YWJsZSkgewogICAgICByZXN1bHQgPSA8RT5bXS4ubGVuZ3RoID0gbGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gTGlzdDxFPihsZW5ndGgpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICByZXN1bHRbaV0gPSB0aGlzW2ldOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFNldDxFPiB0b1NldCgpIHsKICAgIFNldDxFPiByZXN1bHQgPSBTZXQ8RT4oKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0LmFkZCh0aGlzW2ldKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBMaXN0IGludGVyZmFjZS4KICB2b2lkIGFkZChFIGVsZW1lbnQpIHsKICAgIHRoaXNbdGhpcy5sZW5ndGgrK10gPSBlbGVtZW50OwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIGludCBpID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKEUgZWxlbWVudCBpbiBpdGVyYWJsZSkgewogICAgICBhc3NlcnQodGhpcy5sZW5ndGggPT0gaSB8fCAodGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpKSk7CiAgICAgIHRoaXMubGVuZ3RoID0gaSArIDE7CiAgICAgIHRoaXNbaV0gPSBlbGVtZW50OwogICAgICBpKys7CiAgICB9CiAgfQoKICBib29sIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHsKICAgICAgICB0aGlzLl9jbG9zZUdhcChpLCBpICsgMSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBSZW1vdmVzIGVsZW1lbnRzIGZyb20gdGhlIGxpc3Qgc3RhcnRpbmcgYXQgW3N0YXJ0XSB1cCB0byBidXQgbm90IGluY2x1ZGluZwogIC8vLyBbZW5kXS4gIEFyZ3VtZW50cyBhcmUgcHJlLXZhbGlkYXRlZC4KICB2b2lkIF9jbG9zZUdhcChpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGFzc2VydCgwIDw9IHN0YXJ0KTsKICAgIGFzc2VydChzdGFydCA8IGVuZCk7CiAgICBhc3NlcnQoZW5kIDw9IGxlbmd0aCk7CiAgICBpbnQgc2l6ZSA9IGVuZCAtIHN0YXJ0OwogICAgZm9yIChpbnQgaSA9IGVuZDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHRoaXNbaSAtIHNpemVdID0gdGhpc1tpXTsKICAgIH0KICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoIC0gc2l6ZTsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIF9maWx0ZXIodGVzdCwgZmFsc2UpOwogIH0KCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgX2ZpbHRlcih0ZXN0LCB0cnVlKTsKICB9CgogIHZvaWQgX2ZpbHRlcihib29sIHRlc3QoRSBlbGVtZW50KSwgYm9vbCByZXRhaW5NYXRjaGluZykgewogICAgTGlzdDxFPiByZXRhaW5lZCA9IDxFPltdOwogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpID09IHJldGFpbk1hdGNoaW5nKSB7CiAgICAgICAgcmV0YWluZWQuYWRkKGVsZW1lbnQpOwogICAgICB9CiAgICAgIGlmIChsZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChyZXRhaW5lZC5sZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgdGhpcy5zZXRSYW5nZSgwLCByZXRhaW5lZC5sZW5ndGgsIHJldGFpbmVkKTsKICAgICAgdGhpcy5sZW5ndGggPSByZXRhaW5lZC5sZW5ndGg7CiAgICB9CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgdGhpcy5sZW5ndGggPSAwOwogIH0KCiAgTGlzdDxSPiBjYXN0PFI+KCkgPT4gTGlzdC5jYXN0RnJvbTxFLCBSPih0aGlzKTsKICBFIHJlbW92ZUxhc3QoKSB7CiAgICBpZiAobGVuZ3RoID09IDApIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICBFIHJlc3VsdCA9IHRoaXNbbGVuZ3RoIC0gMV07CiAgICBsZW5ndGgtLTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIHNvcnQoW2ludCBjb21wYXJlKEUgYSwgRSBiKV0pIHsKICAgIFNvcnQuc29ydCh0aGlzLCBjb21wYXJlID8/IF9jb21wYXJlQW55KTsKICB9CgogIHN0YXRpYyBpbnQgX2NvbXBhcmVBbnkoYSwgYikgewogICAgLy8gSW4gc3Ryb25nIG1vZGUgQ29tcGFyYWJsZS5jb21wYXJlIHJlcXVpcmVzIGFuIGltcGxpY2l0IGNhc3QgdG8gZW5zdXJlCiAgICAvLyBgYWAgYW5kIGBiYCBhcmUgQ29tcGFyYWJsZS4KICAgIHJldHVybiBDb21wYXJhYmxlLmNvbXBhcmUoYSwgYik7CiAgfQoKICB2b2lkIHNodWZmbGUoW1JhbmRvbSByYW5kb21dKSB7CiAgICByYW5kb20gPz89IFJhbmRvbSgpOwogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgd2hpbGUgKGxlbmd0aCA+IDEpIHsKICAgICAgaW50IHBvcyA9IHJhbmRvbS5uZXh0SW50KGxlbmd0aCk7CiAgICAgIGxlbmd0aCAtPSAxOwogICAgICB2YXIgdG1wID0gdGhpc1tsZW5ndGhdOwogICAgICB0aGlzW2xlbmd0aF0gPSB0aGlzW3Bvc107CiAgICAgIHRoaXNbcG9zXSA9IHRtcDsKICAgIH0KICB9CgogIE1hcDxpbnQsIEU+IGFzTWFwKCkgewogICAgcmV0dXJuIExpc3RNYXBWaWV3PEU+KHRoaXMpOwogIH0KCiAgTGlzdDxFPiBvcGVyYXRvciArKExpc3Q8RT4gb3RoZXIpIHsKICAgIHZhciByZXN1bHQgPSA8RT5bXS4ubGVuZ3RoID0gKHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoKTsKICAgIHJlc3VsdC5zZXRSYW5nZSgwLCB0aGlzLmxlbmd0aCwgdGhpcyk7CiAgICByZXN1bHQuc2V0UmFuZ2UodGhpcy5sZW5ndGgsIHJlc3VsdC5sZW5ndGgsIG90aGVyKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaXN0PEU+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIGludCBsaXN0TGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBlbmQgPz89IGxpc3RMZW5ndGg7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsaXN0TGVuZ3RoKTsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIExpc3Q8RT4gcmVzdWx0ID0gPEU+W10uLmxlbmd0aCA9IGxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0W2ldID0gdGhpc1tzdGFydCArIGldOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEl0ZXJhYmxlPEU+IGdldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgcmV0dXJuIFN1Ykxpc3RJdGVyYWJsZTxFPih0aGlzLCBzdGFydCwgZW5kKTsKICB9CgogIHZvaWQgcmVtb3ZlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICBpZiAoZW5kID4gc3RhcnQpIHsKICAgICAgX2Nsb3NlR2FwKHN0YXJ0LCBlbmQpOwogICAgfQogIH0KCiAgdm9pZCBmaWxsUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBbRSBmaWxsXSkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdGhpc1tpXSA9IGZpbGw7CiAgICB9CiAgfQoKICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RT4gaXRlcmFibGUsIFtpbnQgc2tpcENvdW50ID0gMF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuOwogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKHNraXBDb3VudCwgInNraXBDb3VudCIpOwoKICAgIExpc3Q8RT4gb3RoZXJMaXN0OwogICAgaW50IG90aGVyU3RhcnQ7CiAgICAvLyBUT0RPKGZsb2l0c2NoKTogTWFrZSB0aGlzIGFjY2VwdCBtb3JlLgogICAgaWYgKGl0ZXJhYmxlIGlzIExpc3Q8RT4pIHsKICAgICAgb3RoZXJMaXN0ID0gaXRlcmFibGU7CiAgICAgIG90aGVyU3RhcnQgPSBza2lwQ291bnQ7CiAgICB9IGVsc2UgewogICAgICBvdGhlckxpc3QgPSBpdGVyYWJsZS5za2lwKHNraXBDb3VudCkudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIG90aGVyU3RhcnQgPSAwOwogICAgfQogICAgaWYgKG90aGVyU3RhcnQgKyBsZW5ndGggPiBvdGhlckxpc3QubGVuZ3RoKSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb0ZldygpOwogICAgfQogICAgaWYgKG90aGVyU3RhcnQgPCBzdGFydCkgewogICAgICAvLyBDb3B5IGJhY2t3YXJkcyB0byBlbnN1cmUgY29ycmVjdCBjb3B5IGlmIFtmcm9tXSBpcyB0aGlzLgogICAgICBmb3IgKGludCBpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICB0aGlzW3N0YXJ0ICsgaV0gPSBvdGhlckxpc3Rbb3RoZXJTdGFydCArIGldOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpc1tzdGFydCArIGldID0gb3RoZXJMaXN0W290aGVyU3RhcnQgKyBpXTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCByZXBsYWNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiBuZXdDb250ZW50cykgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgaWYgKG5ld0NvbnRlbnRzIGlzISBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSkgewogICAgICBuZXdDb250ZW50cyA9IG5ld0NvbnRlbnRzLnRvTGlzdCgpOwogICAgfQogICAgaW50IHJlbW92ZUxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaW50IGluc2VydExlbmd0aCA9IG5ld0NvbnRlbnRzLmxlbmd0aDsKICAgIGlmIChyZW1vdmVMZW5ndGggPj0gaW5zZXJ0TGVuZ3RoKSB7CiAgICAgIGludCBpbnNlcnRFbmQgPSBzdGFydCArIGluc2VydExlbmd0aDsKICAgICAgdGhpcy5zZXRSYW5nZShzdGFydCwgaW5zZXJ0RW5kLCBuZXdDb250ZW50cyk7CiAgICAgIGlmIChyZW1vdmVMZW5ndGggPiBpbnNlcnRMZW5ndGgpIHsKICAgICAgICBfY2xvc2VHYXAoaW5zZXJ0RW5kLCBlbmQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpbnQgZGVsdGEgPSBpbnNlcnRMZW5ndGggLSByZW1vdmVMZW5ndGg7CiAgICAgIGludCBuZXdMZW5ndGggPSB0aGlzLmxlbmd0aCArIGRlbHRhOwogICAgICBpbnQgaW5zZXJ0RW5kID0gc3RhcnQgKyBpbnNlcnRMZW5ndGg7IC8vIGFrYS4gZW5kICsgZGVsdGEuCiAgICAgIHRoaXMubGVuZ3RoID0gbmV3TGVuZ3RoOwogICAgICB0aGlzLnNldFJhbmdlKGluc2VydEVuZCwgbmV3TGVuZ3RoLCB0aGlzLCBlbmQpOwogICAgICB0aGlzLnNldFJhbmdlKHN0YXJ0LCBpbnNlcnRFbmQsIG5ld0NvbnRlbnRzKTsKICAgIH0KICB9CgogIGludCBpbmRleE9mKE9iamVjdCBlbGVtZW50LCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMDsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgaW5kZXhXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDA7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGludCBsYXN0SW5kZXhPZihPYmplY3QgZWxlbWVudCwgW2ludCBzdGFydF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSBzdGFydCA9IHRoaXMubGVuZ3RoIC0gMTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA+PSAwOyBpLS0pIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgbGFzdEluZGV4V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIFtpbnQgc3RhcnRdKSB7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgc3RhcnQgPSB0aGlzLmxlbmd0aCAtIDE7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRSBlbGVtZW50KSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChpbmRleCwgImluZGV4Iik7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsdWVJbkludGVydmFsKGluZGV4LCAwLCBsZW5ndGgsICJpbmRleCIpOwogICAgaWYgKGluZGV4ID09IHRoaXMubGVuZ3RoKSB7CiAgICAgIGFkZChlbGVtZW50KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5sZW5ndGgrKzsKICAgIHNldFJhbmdlKGluZGV4ICsgMSwgdGhpcy5sZW5ndGgsIHRoaXMsIGluZGV4KTsKICAgIHRoaXNbaW5kZXhdID0gZWxlbWVudDsKICB9CgogIEUgcmVtb3ZlQXQoaW50IGluZGV4KSB7CiAgICBFIHJlc3VsdCA9IHRoaXNbaW5kZXhdOwogICAgX2Nsb3NlR2FwKGluZGV4LCBpbmRleCArIDEpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWx1ZUluSW50ZXJ2YWwoaW5kZXgsIDAsIGxlbmd0aCwgImluZGV4Iik7CiAgICBpZiAoaXRlcmFibGUgaXMhIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlIHx8IGlkZW50aWNhbChpdGVyYWJsZSwgdGhpcykpIHsKICAgICAgaXRlcmFibGUgPSBpdGVyYWJsZS50b0xpc3QoKTsKICAgIH0KICAgIGludCBpbnNlcnRpb25MZW5ndGggPSBpdGVyYWJsZS5sZW5ndGg7CiAgICAvLyBUaGVyZSBtaWdodCBiZSBlcnJvcnMgYWZ0ZXIgdGhlIGxlbmd0aCBjaGFuZ2UsIGluIHdoaWNoIGNhc2UgdGhlIGxpc3QKICAgIC8vIHdpbGwgZW5kIHVwIGJlaW5nIG1vZGlmaWVkIGJ1dCB0aGUgb3BlcmF0aW9uIG5vdCBjb21wbGV0ZS4gVW5sZXNzIHdlCiAgICAvLyBhbHdheXMgZ28gdGhyb3VnaCBhICJ0b0xpc3QiIHdlIGNhbid0IHJlYWxseSBhdm9pZCB0aGF0LgogICAgdGhpcy5sZW5ndGggKz0gaW5zZXJ0aW9uTGVuZ3RoOwogICAgaWYgKGl0ZXJhYmxlLmxlbmd0aCAhPSBpbnNlcnRpb25MZW5ndGgpIHsKICAgICAgLy8gSWYgdGhlIGl0ZXJhYmxlJ3MgbGVuZ3RoIGlzIGxpbmtlZCB0byB0aGlzIGxpc3QncyBsZW5ndGggc29tZWhvdywKICAgICAgLy8gd2UgY2FuJ3QgaW5zZXJ0IG9uZSBpbiB0aGUgb3RoZXIuCiAgICAgIHRoaXMubGVuZ3RoIC09IGluc2VydGlvbkxlbmd0aDsKICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKGl0ZXJhYmxlKTsKICAgIH0KICAgIHNldFJhbmdlKGluZGV4ICsgaW5zZXJ0aW9uTGVuZ3RoLCB0aGlzLmxlbmd0aCwgdGhpcywgaW5kZXgpOwogICAgc2V0QWxsKGluZGV4LCBpdGVyYWJsZSk7CiAgfQoKICB2b2lkIHNldEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBpZiAoaXRlcmFibGUgaXMgTGlzdCkgewogICAgICBzZXRSYW5nZShpbmRleCwgaW5kZXggKyBpdGVyYWJsZS5sZW5ndGgsIGl0ZXJhYmxlKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoRSBlbGVtZW50IGluIGl0ZXJhYmxlKSB7CiAgICAgICAgdGhpc1tpbmRleCsrXSA9IGVsZW1lbnQ7CiAgICAgIH0KICAgIH0KICB9CgogIEl0ZXJhYmxlPEU+IGdldCByZXZlcnNlZCA9PiBSZXZlcnNlZExpc3RJdGVyYWJsZTxFPih0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gSXRlcmFibGVCYXNlLml0ZXJhYmxlVG9GdWxsU3RyaW5nKHRoaXMsICdbJywgJ10nKTsKfQqCGQBOTjwBGQEnBEcPBEM/BFBOS0tKT0QwPkUGRz8rOQIBKwRBGgRESSAEUE5LS0pPRTAxGUsgNQEpAS85ASkeJxcjMQgGBAEeIwEjARA9FAQBHD0VBAEPPR0EARs9HgQBET06FAQBIh4nKyMxCAYSBAElHicoIzEIBhEEASMeJyYjMQgGEgQBNR4nGykjMQgGKSwEATQeLBspIzEIBiksBAE2Hg0dJxsbGjAKGxkIIzEIBiIpLAQBKSBFHgQBSwE8AUsBNSUBNB49FycnIzEIBhIEAUUeHicnIzEIBhIEAUgBMC0EAUUBMC0EASsUFCcNIAYnGwYTBAETHicbBhMEARUYIwQBJhkiTRsZCwYEASAsICIVCAYSBAFRKyceGBkbHCkgBiEEASsaBAErGQQBPB4eJx0tHwgjMQgGKjMlBgQBERUEATITFy4GIQ4TBAEnLQQBIU0jJQQBIhkeGSgTHiAXBgQBGCEEASY/KzgTBAEqIhg4Hi0nIwYTBAEtOTEEASk5Fx0GBAExOSgWBgQBUTkeHTkBFxQuHxweDUQWBjIrBh5CLjUIDSk1CAYEAUM5MyoGJCsoLDQpIwgNLytBHzY0BgQBMR4wKAYPBAE6HjAjBg8EATFIJygGDwQBOkgnIwYPBAEmMEAgFA4GEzMbBAEaHCETBAE0QE0kBitNTEAkLksrJjMGQR0EATEcOg0kIQgGBAE9AUoCARlkYXJ0OmNvbGxlY3Rpb24vbGlzdC5kYXJ0QHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zY2FubmVyL3N0cmluZ19zY2FubmVyLmRhcnSM/y8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuc2Nhbm5lci5zdHJpbmdfc2Nhbm5lcjsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuLCBTeW50aGV0aWNTdHJpbmdUb2tlbiwgVG9rZW5UeXBlOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIGFzIGFuYWx5emVyIHNob3cgU3RyaW5nVG9rZW47CgppbXBvcnQgJ2Fic3RyYWN0X3NjYW5uZXIuZGFydCcKICAgIHNob3cgQWJzdHJhY3RTY2FubmVyLCBMYW5ndWFnZVZlcnNpb25DaGFuZ2VkLCBTY2FubmVyQ29uZmlndXJhdGlvbjsKCmltcG9ydCAndG9rZW4uZGFydCcKICAgIHNob3cgQ29tbWVudFRva2VuLCBEYXJ0RG9jVG9rZW4sIExhbmd1YWdlVmVyc2lvblRva2VuLCBTdHJpbmdUb2tlbjsKCmltcG9ydCAnZXJyb3JfdG9rZW4uZGFydCcgc2hvdyBFcnJvclRva2VuOwoKLyoqCiAqIFNjYW5uZXIgdGhhdCByZWFkcyBmcm9tIGEgU3RyaW5nIGFuZCBjcmVhdGVzIHRva2VucyB0aGF0IHBvaW50cyB0bwogKiBzdWJzdHJpbmdzLgogKi8KY2xhc3MgU3RyaW5nU2Nhbm5lciBleHRlbmRzIEFic3RyYWN0U2Nhbm5lciB7CiAgLyoqIFRoZSBmaWxlIGNvbnRlbnQuICovCiAgU3RyaW5nIHN0cmluZzsKCiAgLyoqIFRoZSBjdXJyZW50IG9mZnNldCBpbiBbc3RyaW5nXS4gKi8KICBpbnQgc2Nhbk9mZnNldCA9IC0xOwoKICBTdHJpbmdTY2FubmVyKFN0cmluZyBzdHJpbmcsCiAgICAgIHtTY2FubmVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAogICAgICBib29sIGluY2x1ZGVDb21tZW50czogZmFsc2UsCiAgICAgIExhbmd1YWdlVmVyc2lvbkNoYW5nZWQgbGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZH0pCiAgICAgIDogc3RyaW5nID0gZW5zdXJlWmVyb1Rlcm1pbmF0aW9uKHN0cmluZyksCiAgICAgICAgc3VwZXIoY29uZmlndXJhdGlvbiwgaW5jbHVkZUNvbW1lbnRzLCBsYW5ndWFnZVZlcnNpb25DaGFuZ2VkKTsKCiAgc3RhdGljIFN0cmluZyBlbnN1cmVaZXJvVGVybWluYXRpb24oU3RyaW5nIHN0cmluZykgewogICAgcmV0dXJuIChzdHJpbmcuaXNFbXB0eSB8fCBzdHJpbmcuY29kZVVuaXRBdChzdHJpbmcubGVuZ3RoIC0gMSkgIT0gMCkKICAgICAgICAvLyBUT0RPKGxyeSk6IGFib3J0IGluc3RlYWQgb2YgY29weWluZyB0aGUgYXJyYXksIG9yIHdhcm4/CiAgICAgICAgPyBzdHJpbmcgKyAnXHgwMCcKICAgICAgICA6IHN0cmluZzsKICB9CgogIHN0YXRpYyBib29sIGlzTGVnYWxJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7CiAgICBTdHJpbmdTY2FubmVyIHNjYW5uZXIgPSBuZXcgU3RyaW5nU2Nhbm5lcihpZGVudGlmaWVyKTsKICAgIFRva2VuIHN0YXJ0VG9rZW4gPSBzY2FubmVyLnRva2VuaXplKCk7CiAgICByZXR1cm4gc3RhcnRUb2tlbiBpcyEgRXJyb3JUb2tlbiAmJiBzdGFydFRva2VuLm5leHQuaXNFb2Y7CiAgfQoKICBpbnQgYWR2YW5jZSgpID0+IHN0cmluZy5jb2RlVW5pdEF0KCsrc2Nhbk9mZnNldCk7CiAgaW50IHBlZWsoKSA9PiBzdHJpbmcuY29kZVVuaXRBdChzY2FuT2Zmc2V0ICsgMSk7CgogIGludCBnZXQgc3RyaW5nT2Zmc2V0ID0+IHNjYW5PZmZzZXQ7CgogIGludCBjdXJyZW50QXNVbmljb2RlKGludCBuZXh0KSA9PiBuZXh0OwoKICB2b2lkIGhhbmRsZVVuaWNvZGUoaW50IHN0YXJ0U2Nhbk9mZnNldCkge30KCiAgQG92ZXJyaWRlCiAgYW5hbHl6ZXIuU3RyaW5nVG9rZW4gY3JlYXRlU3Vic3RyaW5nVG9rZW4oCiAgICAgIFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LAogICAgICBbaW50IGV4dHJhT2Zmc2V0ID0gMF0pIHsKICAgIHJldHVybiBuZXcgU3RyaW5nVG9rZW4uZnJvbVN1YnN0cmluZygKICAgICAgICB0eXBlLCBzdHJpbmcsIHN0YXJ0LCBzY2FuT2Zmc2V0ICsgZXh0cmFPZmZzZXQsIHRva2VuU3RhcnQsCiAgICAgICAgY2Fub25pY2FsaXplOiB0cnVlLCBwcmVjZWRpbmdDb21tZW50czogY29tbWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYW5hbHl6ZXIuU3RyaW5nVG9rZW4gY3JlYXRlU3ludGhldGljU3Vic3RyaW5nVG9rZW4oCiAgICAgIFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LCBTdHJpbmcgc3ludGhldGljQ2hhcnMpIHsKICAgIFN0cmluZyBzb3VyY2UgPSBzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBzY2FuT2Zmc2V0KTsKICAgIHJldHVybiBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4oCiAgICAgICAgdHlwZSwgc291cmNlICsgc3ludGhldGljQ2hhcnMsIHRva2VuU3RhcnQsIHNvdXJjZS5sZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29tbWVudFRva2VuIGNyZWF0ZUNvbW1lbnRUb2tlbihUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwKICAgICAgW2ludCBleHRyYU9mZnNldCA9IDBdKSB7CiAgICByZXR1cm4gbmV3IENvbW1lbnRUb2tlbi5mcm9tU3Vic3RyaW5nKAogICAgICAgIHR5cGUsIHN0cmluZywgc3RhcnQsIHNjYW5PZmZzZXQgKyBleHRyYU9mZnNldCwgdG9rZW5TdGFydCwKICAgICAgICBjYW5vbmljYWxpemU6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydERvY1Rva2VuIGNyZWF0ZURhcnREb2NUb2tlbihUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwKICAgICAgW2ludCBleHRyYU9mZnNldCA9IDBdKSB7CiAgICByZXR1cm4gbmV3IERhcnREb2NUb2tlbi5mcm9tU3Vic3RyaW5nKAogICAgICAgIHR5cGUsIHN0cmluZywgc3RhcnQsIHNjYW5PZmZzZXQgKyBleHRyYU9mZnNldCwgdG9rZW5TdGFydCwKICAgICAgICBjYW5vbmljYWxpemU6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGFuZ3VhZ2VWZXJzaW9uVG9rZW4gY3JlYXRlTGFuZ3VhZ2VWZXJzaW9uVG9rZW4oCiAgICAgIGludCBzdGFydCwgaW50IG1ham9yLCBpbnQgbWlub3IpIHsKICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VWZXJzaW9uVG9rZW4uZnJvbVN1YnN0cmluZygKICAgICAgICBzdHJpbmcsIHN0YXJ0LCBzY2FuT2Zmc2V0LCB0b2tlblN0YXJ0LCBtYWpvciwgbWlub3IsCiAgICAgICAgY2Fub25pY2FsaXplOiB0cnVlKTsKICB9CgogIGJvb2wgYXRFbmRPZkZpbGUoKSA9PiBzY2FuT2Zmc2V0ID49IHN0cmluZy5sZW5ndGggLSAxOwp9CmcATk48ASgBTwFAAR9IARRIASsBBEYPBC4bEQEpFwEfKyM2MEcBN0lDGhIEATU7Kz8EATQzASYBKgEtAQwtMR8qQzoEAQw2SjklQwQBDE0fK0MdBAEMTR8rQx0EAQwzKTM9HQQBOQIBN3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY2FubmVyL3N0cmluZ19zY2FubmVyLmRhcnREc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NjYW5uZXIvdXRmOF9ieXRlc19zY2FubmVyLmRhcnShRi8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnNjYW5uZXIudXRmOF9ieXRlc19zY2FubmVyOwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgdW5pY29kZUJvbUNoYXJhY3RlclJ1bmUsIHV0Zjg7CgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBTeW50aGV0aWNTdHJpbmdUb2tlbiwgVG9rZW5UeXBlOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIGFzIGFuYWx5emVyIHNob3cgU3RyaW5nVG9rZW47CgppbXBvcnQgJy4uL3NjYW5uZXIuZGFydCcgc2hvdyB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXI7CgppbXBvcnQgJ2Fic3RyYWN0X3NjYW5uZXIuZGFydCcKICAgIHNob3cgQWJzdHJhY3RTY2FubmVyLCBMYW5ndWFnZVZlcnNpb25DaGFuZ2VkLCBTY2FubmVyQ29uZmlndXJhdGlvbjsKCmltcG9ydCAndG9rZW4uZGFydCcKICAgIHNob3cgQ29tbWVudFRva2VuLCBEYXJ0RG9jVG9rZW4sIExhbmd1YWdlVmVyc2lvblRva2VuLCBTdHJpbmdUb2tlbjsKCi8qKgogKiBTY2FubmVyIHRoYXQgcmVhZHMgZnJvbSBhIFVURi04IGVuY29kZWQgbGlzdCBvZiBieXRlcyBhbmQgY3JlYXRlcyB0b2tlbnMKICogdGhhdCBwb2ludHMgdG8gc3Vic3RyaW5ncy4KICovCmNsYXNzIFV0ZjhCeXRlc1NjYW5uZXIgZXh0ZW5kcyBBYnN0cmFjdFNjYW5uZXIgewogIC8qKgogICAqIFRoZSBmaWxlIGNvbnRlbnQuCiAgICoKICAgKiBUaGUgY29udGVudCBpcyB6ZXJvLXRlcm1pbmF0ZWQuCiAgICovCiAgTGlzdDxpbnQ+IGJ5dGVzOwoKICAvKioKICAgKiBQb2ludHMgdG8gdGhlIG9mZnNldCBvZiB0aGUgbGFzdCBieXRlIHJldHVybmVkIGJ5IFthZHZhbmNlXS4KICAgKgogICAqIEFmdGVyIGludm9raW5nIFtjdXJyZW50QXNVbmljb2RlXSwgdGhlIFtieXRlT2Zmc2V0XSBwb2ludHMgdG8gdGhlIGxhc3QKICAgKiBieXRlIHRoYXQgaXMgcGFydCBvZiB0aGUgKHVuaWNvZGUgb3IgQVNDSUkpIGNoYXJhY3Rlci4gVGhhdCB3YXksIFthZHZhbmNlXQogICAqIGNhbiBhbHdheXMgaW5jcmVhc2UgdGhlIGJ5dGUgb2Zmc2V0IGJ5IDEuCiAgICovCiAgaW50IGJ5dGVPZmZzZXQgPSAtMTsKCiAgLyoqCiAgICogVGhlIGdldHRlciBbc2Nhbk9mZnNldF0gaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0aGUgY3VycmVudAogICAqIGNoYXJhY3RlciAqc3RhcnRzKi4gSW4gY2FzZSBvZiBhIG5vbi1hc2NpaSBjaGFyYWN0ZXIsIGFmdGVyIGludm9raW5nCiAgICogW2N1cnJlbnRBc1VuaWNvZGVdLCB0aGUgYnl0ZSBvZmZzZXQgcG9pbnRzIHRvIHRoZSAqbGFzdCogYnl0ZS4KICAgKgogICAqIFRoaXMgZmllbGQga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBieXRlcyBmb3IgdGhlIGN1cnJlbnQgdW5pY29kZQogICAqIGNoYXJhY3Rlci4gRm9yIGV4YW1wbGUsIGlmIGJ5dGVzIDcsOCw5IGVuY29kZSBvbmUgdW5pY29kZSBjaGFyYWN0ZXIsIHRoZQogICAqIFtieXRlT2Zmc2V0XSBpcyA5IChhZnRlciBpbnZva2luZyBbY3VycmVudEFzVW5pY29kZV0pLiBUaGUgW3NjYW5TbGFja10KICAgKiB3aWxsIGJlIDIsIHNvIHRoYXQgW3NjYW5PZmZzZXRdIHJldHVybnMgNy4KICAgKi8KICBpbnQgc2NhblNsYWNrID0gMDsKCiAgLyoqCiAgICogSG9sZHMgdGhlIFtieXRlT2Zmc2V0XSB2YWx1ZSBmb3Igd2hpY2ggdGhlIGN1cnJlbnQgW3NjYW5TbGFja10gaXMgdmFsaWQuCiAgICovCiAgaW50IHNjYW5TbGFja09mZnNldCA9IC0xOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBieXRlIG9mZnNldCBvZiB0aGUgZmlyc3QgYnl0ZSB0aGF0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQKICAgKiBjaGFyYWN0ZXIuCiAgICovCiAgaW50IGdldCBzY2FuT2Zmc2V0IHsKICAgIGlmIChieXRlT2Zmc2V0ID09IHNjYW5TbGFja09mZnNldCkgewogICAgICByZXR1cm4gYnl0ZU9mZnNldCAtIHNjYW5TbGFjazsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBieXRlT2Zmc2V0OwogICAgfQogIH0KCiAgLyoqCiAgICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFuZCB0aGUgbnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcKICAgKiBzdHJpbmcgY2hhcmFjdGVycywgdXAgdG8gdGhlIGN1cnJlbnQgW2J5dGVPZmZzZXRdLgogICAqLwogIGludCB1dGY4U2xhY2sgPSAwOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IFV0ZjhCeXRlc1NjYW5uZXIuIFRoZSBzb3VyY2UgZmlsZSBpcyBleHBlY3RlZCB0byBiZSBhCiAgICogW1V0ZjhCeXRlc1NvdXJjZUZpbGVdIHRoYXQgaG9sZHMgYSBsaXN0IG9mIFVURi04IGJ5dGVzLiBPdGhlcndpc2UgdGhlCiAgICogc3RyaW5nIHRleHQgb2YgdGhlIHNvdXJjZSBmaWxlIGlzIGRlY29kZWQuCiAgICoKICAgKiBUaGUgbGlzdCBvZiBVVEYtOCBieXRlcyBbZmlsZS5zbG93VXRmOEJ5dGVzKCldIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhbgogICAqIGFycmF5IHdob3NlIGxhc3QgZWxlbWVudCBpcyAnMCcgdG8gc2lnbmFsIHRoZSBlbmQgb2YgdGhlIGZpbGUuIElmIHRoaXMKICAgKiBpcyBub3QgdGhlIGNhc2UsIHRoZSBlbnRpcmUgYXJyYXkgaXMgY29waWVkIGJlZm9yZSBzY2FubmluZy4KICAgKi8KICBVdGY4Qnl0ZXNTY2FubmVyKHRoaXMuYnl0ZXMsCiAgICAgIHtTY2FubmVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAogICAgICBib29sIGluY2x1ZGVDb21tZW50czogZmFsc2UsCiAgICAgIExhbmd1YWdlVmVyc2lvbkNoYW5nZWQgbGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZH0pCiAgICAgIDogc3VwZXIoY29uZmlndXJhdGlvbiwgaW5jbHVkZUNvbW1lbnRzLCBsYW5ndWFnZVZlcnNpb25DaGFuZ2VkLAogICAgICAgICAgICBudW1iZXJPZkJ5dGVzSGludDogYnl0ZXMubGVuZ3RoKSB7CiAgICBhc3NlcnQoYnl0ZXMubGFzdCA9PSAwKTsKICAgIC8vIFNraXAgYSBsZWFkaW5nIEJPTS4KICAgIGlmIChjb250YWluc0JvbUF0KDApKSBieXRlT2Zmc2V0ICs9IDM7CiAgfQoKICBib29sIGNvbnRhaW5zQm9tQXQoaW50IG9mZnNldCkgewogICAgY29uc3QgQk9NX1VURjggPSBjb25zdCBbMHhFRiwgMHhCQiwgMHhCRl07CgogICAgcmV0dXJuIG9mZnNldCArIDMgPCBieXRlcy5sZW5ndGggJiYKICAgICAgICBieXRlc1tvZmZzZXRdID09IEJPTV9VVEY4WzBdICYmCiAgICAgICAgYnl0ZXNbb2Zmc2V0ICsgMV0gPT0gQk9NX1VURjhbMV0gJiYKICAgICAgICBieXRlc1tvZmZzZXQgKyAyXSA9PSBCT01fVVRGOFsyXTsKICB9CgogIGludCBhZHZhbmNlKCkgPT4gYnl0ZXNbKytieXRlT2Zmc2V0XTsKCiAgaW50IHBlZWsoKSA9PiBieXRlc1tieXRlT2Zmc2V0ICsgMV07CgogIC8vLyBSZXR1cm5zIHRoZSB1bmljb2RlIGNvZGUgcG9pbnQgc3RhcnRpbmcgYXQgdGhlIGJ5dGUgb2Zmc2V0IFtzdGFydE9mZnNldF0KICAvLy8gd2l0aCB0aGUgYnl0ZSBbbmV4dEJ5dGVdLgogIGludCBuZXh0Q29kZVBvaW50KGludCBzdGFydE9mZnNldCwgaW50IG5leHRCeXRlKSB7CiAgICBpbnQgZXhwZWN0ZWRIaWdoQnl0ZXM7CiAgICBpZiAobmV4dEJ5dGUgPCAweEMyKSB7CiAgICAgIGV4cGVjdGVkSGlnaEJ5dGVzID0gMTsgLy8gQmFkIGNvZGUgdW5pdC4KICAgIH0gZWxzZSBpZiAobmV4dEJ5dGUgPCAweEUwKSB7CiAgICAgIGV4cGVjdGVkSGlnaEJ5dGVzID0gMjsKICAgIH0gZWxzZSBpZiAobmV4dEJ5dGUgPCAweEYwKSB7CiAgICAgIGV4cGVjdGVkSGlnaEJ5dGVzID0gMzsKICAgIH0gZWxzZSBpZiAobmV4dEJ5dGUgPCAweEY1KSB7CiAgICAgIGV4cGVjdGVkSGlnaEJ5dGVzID0gNDsKICAgIH0gZWxzZSB7CiAgICAgIGV4cGVjdGVkSGlnaEJ5dGVzID0gMTsgLy8gQmFkIGNvZGUgdW5pdC4KICAgIH0KICAgIGludCBudW1CeXRlcyA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkSGlnaEJ5dGVzOyBpKyspIHsKICAgICAgaWYgKGJ5dGVzW2J5dGVPZmZzZXQgKyBpXSA8IDB4ODApIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBudW1CeXRlcysrOwogICAgfQogICAgaW50IGVuZCA9IHN0YXJ0T2Zmc2V0ICsgbnVtQnl0ZXM7CiAgICBieXRlT2Zmc2V0ID0gZW5kIC0gMTsKICAgIGlmIChleHBlY3RlZEhpZ2hCeXRlcyA9PSAxIHx8IG51bUJ5dGVzICE9IGV4cGVjdGVkSGlnaEJ5dGVzKSB7CiAgICAgIHJldHVybiB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXI7CiAgICB9CiAgICAvLyBUT0RPKGxyeSk6IG1lYXN1cmFibHkgc2xvdywgZGVjb2RlIGNyZWF0ZXMgZmlyc3QgYSBVdGY4RGVjb2RlciBhbmQgYQogICAgLy8gX1V0ZjhEZWNvZGVyIGluc3RhbmNlLiBBbHNvIHRoZSBzdWJsaXN0IGlzIGVhZ2VybHkgYWxsb2NhdGVkLgogICAgU3RyaW5nIGNvZGVQb2ludCA9CiAgICAgICAgdXRmOC5kZWNvZGUoYnl0ZXMuc3VibGlzdChzdGFydE9mZnNldCwgZW5kKSwgYWxsb3dNYWxmb3JtZWQ6IHRydWUpOwogICAgaWYgKGNvZGVQb2ludC5sZW5ndGggPT0gMCkgewogICAgICAvLyBUaGUgVVRGLTggZGVjb2RlciBkaXNjYXJkcyBsZWFkaW5nIEJPTSBjaGFyYWN0ZXJzLgogICAgICAvLyBUT0RPKGZsb2l0c2NoKTogZG9uJ3QganVzdCBhc3N1bWUgdGhhdCByZW1vdmVkIGNoYXJhY3RlcnMgd2VyZSB0aGUKICAgICAgLy8gQk9NLgogICAgICBhc3NlcnQoY29udGFpbnNCb21BdChzdGFydE9mZnNldCkpOwogICAgICBjb2RlUG9pbnQgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZSh1bmljb2RlQm9tQ2hhcmFjdGVyUnVuZSk7CiAgICB9CiAgICBpZiAoY29kZVBvaW50Lmxlbmd0aCA9PSAxKSB7CiAgICAgIHV0ZjhTbGFjayArPSAobnVtQnl0ZXMgLSAxKTsKICAgICAgc2NhblNsYWNrID0gbnVtQnl0ZXMgLSAxOwogICAgICBzY2FuU2xhY2tPZmZzZXQgPSBieXRlT2Zmc2V0OwogICAgICByZXR1cm4gY29kZVBvaW50LmNvZGVVbml0QXQoMCk7CiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludC5sZW5ndGggPT0gMikgewogICAgICB1dGY4U2xhY2sgKz0gKG51bUJ5dGVzIC0gMik7CiAgICAgIHNjYW5TbGFjayA9IG51bUJ5dGVzIC0gMTsKICAgICAgc2NhblNsYWNrT2Zmc2V0ID0gYnl0ZU9mZnNldDsKICAgICAgc3RyaW5nT2Zmc2V0U2xhY2tPZmZzZXQgPSBieXRlT2Zmc2V0OwogICAgICAvLyBJbiBjYXNlIG9mIGEgc3Vycm9nYXRlIHBhaXIsIHJldHVybiBhIHNpbmdsZSBjb2RlIHBvaW50LgogICAgICAvLyBHcmFjZWZ1bGx5IGRlZ3JhZGUgZ2l2ZW4gaW52YWxpZCBVVEYtOC4KICAgICAgdmFyIHJ1bmVzID0gY29kZVBvaW50LnJ1bmVzLml0ZXJhdG9yOwogICAgICBpZiAoIXJ1bmVzLm1vdmVOZXh0KCkpIHJldHVybiB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXI7CiAgICAgIHZhciBjb2RlVW5pdCA9IHJ1bmVzLmN1cnJlbnQ7CiAgICAgIHJldHVybiAhcnVuZXMubW92ZU5leHQoKSA/IGNvZGVVbml0IDogdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHVuaWNvZGVSZXBsYWNlbWVudENoYXJhY3RlcjsKICAgIH0KICB9CgogIGludCBsYXN0VW5pY29kZU9mZnNldCA9IC0xOwogIGludCBjdXJyZW50QXNVbmljb2RlKGludCBuZXh0KSB7CiAgICBpZiAobmV4dCA8IDEyOCkgcmV0dXJuIG5leHQ7CiAgICAvLyBDaGVjayBpZiBjdXJyZW50QXNVbmljb2RlIHdhcyBhbHJlYWR5IGludm9rZWQuCiAgICBpZiAoYnl0ZU9mZnNldCA9PSBsYXN0VW5pY29kZU9mZnNldCkgcmV0dXJuIG5leHQ7CiAgICBpbnQgcmVzID0gbmV4dENvZGVQb2ludChieXRlT2Zmc2V0LCBuZXh0KTsKICAgIGxhc3RVbmljb2RlT2Zmc2V0ID0gYnl0ZU9mZnNldDsKICAgIHJldHVybiByZXM7CiAgfQoKICB2b2lkIGhhbmRsZVVuaWNvZGUoaW50IHN0YXJ0U2Nhbk9mZnNldCkgewogICAgaW50IGVuZCA9IGJ5dGVPZmZzZXQ7CiAgICAvLyBUT0RPKGxyeSk6IHRoaXMgbWVhc3VyYWJseSBzbG93cyBkb3duIHRoZSBzY2FubmVyIGZvciBmaWxlcyB3aXRoIHVuaWNvZGUuCiAgICBTdHJpbmcgcyA9CiAgICAgICAgdXRmOC5kZWNvZGUoYnl0ZXMuc3VibGlzdChzdGFydFNjYW5PZmZzZXQsIGVuZCksIGFsbG93TWFsZm9ybWVkOiB0cnVlKTsKICAgIHV0ZjhTbGFjayArPSAoZW5kIC0gc3RhcnRTY2FuT2Zmc2V0KSAtIHMubGVuZ3RoOwogIH0KCiAgLyoqCiAgICogVGhpcyBmaWVsZCByZW1lbWJlcnMgdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBkZWNvZGVkIHdpdGgKICAgKiBbbmV4dENvZGVQb2ludF0gdGhhdCB1c2VkIHR3byBjb2RlIHVuaXRzIGluIFVURi0xNi4KICAgKgogICAqIFtuZXh0Q29kZVBvaW50XSByZXR1cm5zIGEgc2luZ2xlIGNvZGUgcG9pbnQgZm9yIGVhY2ggdW5pY29kZSBjaGFyYWN0ZXIsCiAgICogZXZlbiBpZiBpdCBuZWVkcyB0d28gY29kZSB1bml0cyBpbiBVVEYtMTYuCiAgICoKICAgKiBGb3IgZXhhbXBsZSwgJ1x1ezFkMTFlfScgdXNlcyA0IGJ5dGVzIGluIFVURi04LCBhbmQgdHdvIGNvZGUgdW5pdHMgaW4KICAgKiBVVEYtMTYuIFRoZSBbdXRmOFNsYWNrXSBpcyB0aGVyZWZvcmUgMi4gQWZ0ZXIgaW52b2tpbmcgW25leHRDb2RlUG9pbnRdLCB0aGUKICAgKiBbYnl0ZU9mZnNldF0gcG9pbnRzIHRvIHRoZSBsYXN0IChvZiA0KSBieXRlcy4gVGhlIFtzdHJpbmdPZmZzZXRdIHNob3VsZAogICAqIHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBvbmUsIHdoaWNoIGlzIG9uZSBwb3NpdGlvbiBtb3JlIGxlZnQgdGhhbgogICAqIHRoZSBbdXRmOFNsYWNrXS4KICAgKi8KICBpbnQgc3RyaW5nT2Zmc2V0U2xhY2tPZmZzZXQgPSAtMTsKCiAgaW50IGdldCBzdHJpbmdPZmZzZXQgewogICAgaWYgKHN0cmluZ09mZnNldFNsYWNrT2Zmc2V0ID09IGJ5dGVPZmZzZXQpIHsKICAgICAgcmV0dXJuIGJ5dGVPZmZzZXQgLSB1dGY4U2xhY2sgLSAxOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGJ5dGVPZmZzZXQgLSB1dGY4U2xhY2s7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBhbmFseXplci5TdHJpbmdUb2tlbiBjcmVhdGVTdWJzdHJpbmdUb2tlbigKICAgICAgVG9rZW5UeXBlIHR5cGUsIGludCBzdGFydCwgYm9vbCBhc2NpaU9ubHksCiAgICAgIFtpbnQgZXh0cmFPZmZzZXQgPSAwXSkgewogICAgcmV0dXJuIG5ldyBTdHJpbmdUb2tlbi5mcm9tVXRmOEJ5dGVzKAogICAgICAgIHR5cGUsIGJ5dGVzLCBzdGFydCwgYnl0ZU9mZnNldCArIGV4dHJhT2Zmc2V0LCBhc2NpaU9ubHksIHRva2VuU3RhcnQsCiAgICAgICAgcHJlY2VkaW5nQ29tbWVudHM6IGNvbW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGFuYWx5emVyLlN0cmluZ1Rva2VuIGNyZWF0ZVN5bnRoZXRpY1N1YnN0cmluZ1Rva2VuKAogICAgICBUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwgU3RyaW5nIHN5bnRoZXRpY0NoYXJzKSB7CiAgICBTdHJpbmcgc291cmNlID0gU3RyaW5nVG9rZW4uZGVjb2RlVXRmOChieXRlcywgc3RhcnQsIGJ5dGVPZmZzZXQsIGFzY2lpT25seSk7CiAgICByZXR1cm4gbmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKAogICAgICAgIHR5cGUsIHNvdXJjZSArIHN5bnRoZXRpY0NoYXJzLCB0b2tlblN0YXJ0LCBzb3VyY2UubGVuZ3RoKTsKICB9CgogIEBvdmVycmlkZQogIENvbW1lbnRUb2tlbiBjcmVhdGVDb21tZW50VG9rZW4oVG9rZW5UeXBlIHR5cGUsIGludCBzdGFydCwgYm9vbCBhc2NpaU9ubHksCiAgICAgIFtpbnQgZXh0cmFPZmZzZXQgPSAwXSkgewogICAgcmV0dXJuIG5ldyBDb21tZW50VG9rZW4uZnJvbVV0ZjhCeXRlcygKICAgICAgICB0eXBlLCBieXRlcywgc3RhcnQsIGJ5dGVPZmZzZXQgKyBleHRyYU9mZnNldCwgYXNjaWlPbmx5LCB0b2tlblN0YXJ0KTsKICB9CgogIEBvdmVycmlkZQogIERhcnREb2NUb2tlbiBjcmVhdGVEYXJ0RG9jVG9rZW4oVG9rZW5UeXBlIHR5cGUsIGludCBzdGFydCwgYm9vbCBhc2NpaU9ubHksCiAgICAgIFtpbnQgZXh0cmFPZmZzZXQgPSAwXSkgewogICAgcmV0dXJuIG5ldyBEYXJ0RG9jVG9rZW4uZnJvbVV0ZjhCeXRlcygKICAgICAgICB0eXBlLCBieXRlcywgc3RhcnQsIGJ5dGVPZmZzZXQgKyBleHRyYU9mZnNldCwgYXNjaWlPbmx5LCB0b2tlblN0YXJ0KTsKICB9CgogIEBvdmVycmlkZQogIExhbmd1YWdlVmVyc2lvblRva2VuIGNyZWF0ZUxhbmd1YWdlVmVyc2lvblRva2VuKAogICAgICBpbnQgc3RhcnQsIGludCBtYWpvciwgaW50IG1pbm9yKSB7CiAgICByZXR1cm4gbmV3IExhbmd1YWdlVmVyc2lvblRva2VuLmZyb21VdGY4Qnl0ZXMoCiAgICAgICAgYnl0ZXMsIHN0YXJ0LCBieXRlT2Zmc2V0LCB0b2tlblN0YXJ0LCBtYWpvciwgbWlub3IpOwogIH0KCiAgYm9vbCBhdEVuZE9mRmlsZSgpID0+IGJ5dGVPZmZzZXQgPj0gYnl0ZXMubGVuZ3RoIC0gMTsKfQqA+wBOTjwBKgE6AUgBQAE7AR9IARRIAQRMHgQxBhcFJQYTAQZCBUxQLwYXAQZPSkQFS05MMAYVAQZOBhwBBksQBhcpJQ0ZBgQBBlA4BhUBBklLMAVNTEIGHysjNkYvHRsrBAEjLwEoKCwqBAEoAScBTyA1GxsvIh0iHSIdDS8GFjIqDwgSBiYaQyoGTEUXTCE8TA4qRAYhIyAkJigjICQsQjEsQSRJDSoGBAEeIyE2Ni8kEAQBLBpRD1A1BAEGTTkFTTAFS1FNThYGJAEZMSkNJQYEAQwtMR8qTSYEAQw2SlElQwQBDE0fK04EAQxNHytOBAEMMykzPQQBOAIBO3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY2FubmVyL3V0ZjhfYnl0ZXNfc2Nhbm5lci5kYXJ0OXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zY2FubmVyL3JlY292ZXIuZGFydIisLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2V0IGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuc2Nhbm5lci5yZWNvdmVyOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW5UeXBlOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ3Rva2VuLmRhcnQnIHNob3cgU3RyaW5nVG9rZW47CgppbXBvcnQgJ2Vycm9yX3Rva2VuLmRhcnQnIHNob3cgRXJyb3JUb2tlbjsKCi8vLyBSZWNvdmVyIGZyb20gZXJyb3JzIGluIFt0b2tlbnNdLiBUaGUgb3JpZ2luYWwgc291cmNlcyBhcmUgcHJvdmlkZWQgYXMKLy8vIFtieXRlc10uIFtsaW5lU3RhcnRzXSBhcmUgdGhlIGJlZ2lubmluZyBjaGFyYWN0ZXIgb2Zmc2V0cyBvZiBsaW5lcywgYW5kCi8vLyBtdXN0IGJlIHVwZGF0ZWQgaWYgcmVjb3ZlcnkgaXMgcGVyZm9ybWVkIHJld3JpdGluZyB0aGUgb3JpZ2luYWwgc291cmNlCi8vLyBjb2RlLgpUb2tlbiBzY2FubmVyUmVjb3ZlcnkoTGlzdDxpbnQ+IGJ5dGVzLCBUb2tlbiB0b2tlbnMsIExpc3Q8aW50PiBsaW5lU3RhcnRzKSB7CiAgLy8gU2FuaXR5IGNoZWNrIHRoYXQgYWxsIGVycm9yIHRva2VucyBhcmUgcHJlcGVuZGVkLgoKICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVtb3ZlIHRoaXMgaW4gYSB3aGlsZSBhZnRlciB0aGUgZHVzdCBoYXMgc2V0dGxlZC4KCiAgLy8gU2tpcCBvdmVyIHByZXBlbmRlZCBlcnJvciB0b2tlbnMKICB2YXIgdG9rZW4gPSB0b2tlbnM7CiAgd2hpbGUgKHRva2VuIGlzIEVycm9yVG9rZW4pIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICB9CgogIC8vIEFzc2VydCBubyBlcnJvciB0b2tlbnMgaW4gdGhlIHJlbWFpbmluZyB0b2tlbnMKICB3aGlsZSAoIXRva2VuLmlzRW9mKSB7CiAgICBpZiAodG9rZW4gaXMgRXJyb3JUb2tlbikgewogICAgICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgMzsgKytjb3VudCkgewogICAgICAgIHZhciBwcmV2aW91cyA9IHRva2VuLnByZXZpb3VzOwogICAgICAgIGlmIChwcmV2aW91cy5pc0VvZikgYnJlYWs7CiAgICAgICAgdG9rZW4gPSBwcmV2aW91czsKICAgICAgfQogICAgICB2YXIgbXNnID0gbmV3IFN0cmluZ0J1ZmZlcigKICAgICAgICAgICJJbnRlcm5hbCBlcnJvcjogQWxsIGVycm9yIHRva2VucyBzaG91bGQgaGF2ZSBiZWVuIHByZXBlbmRlZDoiKTsKICAgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IDc7ICsrY291bnQpIHsKICAgICAgICBpZiAodG9rZW4uaXNFb2YpIGJyZWFrOwogICAgICAgIG1zZy53cml0ZSgnICR7dG9rZW4ucnVudGltZVR5cGV9LCcpOwogICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgICB0aHJvdyBtc2cudG9TdHJpbmcoKTsKICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICB9CgogIHJldHVybiB0b2tlbnM7Cn0KClRva2VuIHN5bnRoZXNpemVUb2tlbihpbnQgY2hhck9mZnNldCwgU3RyaW5nIHZhbHVlLCBUb2tlblR5cGUgdHlwZSkgewogIHJldHVybiBuZXcgU3RyaW5nVG9rZW4uZnJvbVN0cmluZyh0eXBlLCB2YWx1ZSwgY2hhck9mZnNldCk7Cn0KClRva2VuIHNraXBUb0VvZihUb2tlbiB0b2tlbikgewogIHdoaWxlICghdG9rZW4uaXNFb2YpIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICB9CiAgcmV0dXJuIHRva2VuOwp9CgpTdHJpbmcgY2xvc2VCcmFjZUZvcihTdHJpbmcgb3BlbkJyYWNlKSB7CiAgcmV0dXJuIGNvbnN0IHsKICAgICcoJzogJyknLAogICAgJ1snOiAnXScsCiAgICAneyc6ICd9JywKICAgICc8JzogJz4nLAogICAgcickeyc6ICd9JywKICAgICc/LlsnOiAnXScsCiAgfVtvcGVuQnJhY2VdOwp9CgpTdHJpbmcgY2xvc2VRdW90ZUZvcihTdHJpbmcgb3BlblF1b3RlKSB7CiAgcmV0dXJuIGNvbnN0IHsKICAgICciJzogJyInLAogICAgIiciOiAiJyIsCiAgICAnIiIiJzogJyIiIicsCiAgICAiJycnIjogIicnJyIsCiAgICAnciInOiAnIicsCiAgICAiciciOiAiJyIsCiAgICAnciIiIic6ICciIiInLAogICAgInInJyciOiAiJycnIiwKICB9W29wZW5RdW90ZV07Cn0KWABOTjwBHwEyAS4BJgErAUpMSwpNNwFIASYWIBgEATQZHzAnIxoIIkswIC0cCBwGGAQBEQIBRj4CAR8ZGAQQAgEpEQ4ODg4QEBACASkRDg4SEg8PExMQAgEwcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvcmVjb3Zlci5kYXJ0PXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zY2FubmVyL2Vycm9yX3Rva2VuLmRhcnSZqS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNldCBoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnRfc2Nhbm5lci5lcnJvcl90b2tlbjsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IEJlZ2luVG9rZW4sIFNpbXBsZVRva2VuLCBUb2tlblR5cGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ29kZSwKICAgICAgICBNZXNzYWdlLAogICAgICAgIG1lc3NhZ2VFbmNvZGluZywKICAgICAgICB0ZW1wbGF0ZUFzY2lpQ29udHJvbENoYXJhY3RlciwKICAgICAgICB0ZW1wbGF0ZU5vbkFzY2lpSWRlbnRpZmllciwKICAgICAgICB0ZW1wbGF0ZU5vbkFzY2lpV2hpdGVzcGFjZSwKICAgICAgICB0ZW1wbGF0ZVVubWF0Y2hlZFRva2VuLAogICAgICAgIHRlbXBsYXRlVW5zdXBwb3J0ZWRPcGVyYXRvciwKICAgICAgICB0ZW1wbGF0ZVVudGVybWluYXRlZFN0cmluZzsKCmltcG9ydCAnLi4vc2Nhbm5lci5kYXJ0JyBzaG93IFRva2VuLCB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXI7CgppbXBvcnQgJy4uL3NjYW5uZXIvcmVjb3Zlci5kYXJ0JyBzaG93IGNsb3NlQnJhY2VGb3IsIGNsb3NlUXVvdGVGb3I7CgpFcnJvclRva2VuIGJ1aWxkVW5leHBlY3RlZENoYXJhY3RlclRva2VuKGludCBjaGFyYWN0ZXIsIGludCBjaGFyT2Zmc2V0KSB7CiAgaWYgKGNoYXJhY3RlciA8IDB4MWYpIHsKICAgIHJldHVybiBuZXcgQXNjaWlDb250cm9sQ2hhcmFjdGVyVG9rZW4oY2hhcmFjdGVyLCBjaGFyT2Zmc2V0KTsKICB9CiAgc3dpdGNoIChjaGFyYWN0ZXIpIHsKICAgIGNhc2UgdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyOgogICAgICByZXR1cm4gbmV3IEVuY29kaW5nRXJyb3JUb2tlbihjaGFyT2Zmc2V0KTsKCiAgICAvLy8gU2VlIFtHZW5lcmFsIFB1bmN0dWF0aW9uXQogICAgLy8vIChodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTIwMDAucGRmKS4KICAgIGNhc2UgMHgwMEEwOiAvLyBOby1icmVhayBzcGFjZS4KICAgIGNhc2UgMHgxNjgwOiAvLyBPZ2hhbSBzcGFjZSBtYXJrLgogICAgY2FzZSAweDE4MEU6IC8vIE1vbmdvbGlhbiB2b3dlbCBzZXBhcmF0b3IuCiAgICBjYXNlIDB4MjAwMDogLy8gRW4gcXVhZC4KICAgIGNhc2UgMHgyMDAxOiAvLyBFbSBxdWFkLgogICAgY2FzZSAweDIwMDI6IC8vIEVuIHNwYWNlLgogICAgY2FzZSAweDIwMDM6IC8vIEVtIHNwYWNlLgogICAgY2FzZSAweDIwMDQ6IC8vIFRocmVlLXBlci1lbSBzcGFjZS4KICAgIGNhc2UgMHgyMDA1OiAvLyBGb3VyLXBlci1lbSBzcGFjZS4KICAgIGNhc2UgMHgyMDA2OiAvLyBTaXgtcGVyLWVtIHNwYWNlLgogICAgY2FzZSAweDIwMDc6IC8vIEZpZ3VyZSBzcGFjZS4KICAgIGNhc2UgMHgyMDA4OiAvLyBQdW5jdHVhdGlvbiBzcGFjZS4KICAgIGNhc2UgMHgyMDA5OiAvLyBUaGluIHNwYWNlLgogICAgY2FzZSAweDIwMEE6IC8vIEhhaXIgc3BhY2UuCiAgICBjYXNlIDB4MjAwQjogLy8gWmVybyB3aWR0aCBzcGFjZS4KICAgIGNhc2UgMHgyMDI4OiAvLyBMaW5lIHNlcGFyYXRvci4KICAgIGNhc2UgMHgyMDI5OiAvLyBQYXJhZ3JhcGggc2VwYXJhdG9yLgogICAgY2FzZSAweDIwMkY6IC8vIE5hcnJvdyBuby1icmVhayBzcGFjZS4KICAgIGNhc2UgMHgyMDVGOiAvLyBNZWRpdW0gbWF0aGVtYXRpY2FsIHNwYWNlLgogICAgY2FzZSAweDMwMDA6IC8vIElkZW9ncmFwaGljIHNwYWNlLgogICAgY2FzZSAweEZFRkY6IC8vIFplcm8gd2lkdGggbm8tYnJlYWsgc3BhY2UuCiAgICAgIHJldHVybiBuZXcgTm9uQXNjaWlXaGl0ZXNwYWNlVG9rZW4oY2hhcmFjdGVyLCBjaGFyT2Zmc2V0KTsKCiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gbmV3IE5vbkFzY2lpSWRlbnRpZmllclRva2VuKGNoYXJhY3RlciwgY2hhck9mZnNldCk7CiAgfQp9CgovLy8gQ29tbW9uIHN1cGVyY2xhc3MgZm9yIGFsbCBlcnJvciB0b2tlbnMuCi8vLwovLy8gSXQncyBjb25zaWRlcmVkIGFuIGltcGxlbWVudGF0aW9uIGVycm9yIHRvIGFjY2VzcyBbbGV4ZW1lXSBvZiBhbgovLy8gW0Vycm9yVG9rZW5dLgphYnN0cmFjdCBjbGFzcyBFcnJvclRva2VuIGV4dGVuZHMgU2ltcGxlVG9rZW4gewogIEVycm9yVG9rZW4oaW50IG9mZnNldCkgOiBzdXBlcihUb2tlblR5cGUuQkFEX0lOUFVULCBvZmZzZXQsIG51bGwpOwoKICAvLy8gVGhpcyBpcyBhIHRva2VuIHRoYXQgd3JhcHMgYXJvdW5kIGFuIGVycm9yIG1lc3NhZ2UuIFJldHVybiAxCiAgLy8vIGluc3RlYWQgb2YgdGhlIHNpemUgb2YgdGhlIGxlbmd0aCBvZiB0aGUgZXJyb3IgbWVzc2FnZS4KICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiAxOwoKICBTdHJpbmcgZ2V0IGxleGVtZSB7CiAgICB2YXIgZXJyb3JNc2cgPSBhc3NlcnRpb25NZXNzYWdlLm1lc3NhZ2U7CgogICAgLy8gQXR0ZW1wdCB0byBpbmNsdWRlIHRoZSBsb2NhdGlvbiB3aGljaCBpcyBjYWxsaW5nIHRoZSBwYXJzZXIKICAgIC8vIGluIGFuIGVmZm9ydCB0byBkZWJ1ZyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzc1MjgKICAgIHZhciBwYXR0ZXJuID0gUmVnRXhwKCdeI1swLTldKiAqUGFyc2VyJyk7CiAgICB2YXIgdHJhY2VMaW5lcyA9IFN0YWNrVHJhY2UuY3VycmVudC50b1N0cmluZygpLnNwbGl0KCdcbicpOwogICAgZm9yIChpbnQgaW5kZXggPSB0cmFjZUxpbmVzLmxlbmd0aCAtIDI7IGluZGV4ID49IDA7IC0taW5kZXgpIHsKICAgICAgdmFyIGxpbmUgPSB0cmFjZUxpbmVzW2luZGV4XTsKICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChwYXR0ZXJuKSkgewogICAgICAgIGVycm9yTXNnID0gJyRlcnJvck1zZyAtICR7dHJhY2VMaW5lc1tpbmRleCArIDFdfSc7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICB0aHJvdyBlcnJvck1zZzsKICB9CgogIE1lc3NhZ2UgZ2V0IGFzc2VydGlvbk1lc3NhZ2U7CgogIENvZGU8ZHluYW1pYz4gZ2V0IGVycm9yQ29kZSA9PiBhc3NlcnRpb25NZXNzYWdlLmNvZGU7CgogIGludCBnZXQgY2hhcmFjdGVyID0+IG51bGw7CgogIFN0cmluZyBnZXQgc3RhcnQgPT4gbnVsbDsKCiAgaW50IGdldCBlbmRPZmZzZXQgPT4gbnVsbDsKCiAgQmVnaW5Ub2tlbiBnZXQgYmVnaW4gPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gY29weSgpIHsKICAgIHRocm93ICd1bnN1cHBvcnRlZCBvcGVyYXRpb24nOwogIH0KfQoKLy8vIFJlcHJlc2VudHMgYW4gZW5jb2RpbmcgZXJyb3IuCmNsYXNzIEVuY29kaW5nRXJyb3JUb2tlbiBleHRlbmRzIEVycm9yVG9rZW4gewogIEVuY29kaW5nRXJyb3JUb2tlbihpbnQgY2hhck9mZnNldCkgOiBzdXBlcihjaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkVuY29kaW5nRXJyb3JUb2tlbigpIjsKCiAgTWVzc2FnZSBnZXQgYXNzZXJ0aW9uTWVzc2FnZSA9PiBtZXNzYWdlRW5jb2Rpbmc7Cn0KCi8vLyBSZXByZXNlbnRzIGEgbm9uLUFTQ0lJIGNoYXJhY3RlciBvdXRzaWRlIGEgc3RyaW5nIG9yIGNvbW1lbnQuCmNsYXNzIE5vbkFzY2lpSWRlbnRpZmllclRva2VuIGV4dGVuZHMgRXJyb3JUb2tlbiB7CiAgZmluYWwgaW50IGNoYXJhY3RlcjsKCiAgTm9uQXNjaWlJZGVudGlmaWVyVG9rZW4odGhpcy5jaGFyYWN0ZXIsIGludCBjaGFyT2Zmc2V0KSA6IHN1cGVyKGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiTm9uQXNjaWlJZGVudGlmaWVyVG9rZW4oJGNoYXJhY3RlcikiOwoKICBNZXNzYWdlIGdldCBhc3NlcnRpb25NZXNzYWdlID0+IHRlbXBsYXRlTm9uQXNjaWlJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoCiAgICAgIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhbY2hhcmFjdGVyXSksIGNoYXJhY3Rlcik7Cn0KCi8vLyBSZXByZXNlbnRzIGEgbm9uLUFTQ0lJIHdoaXRlc3BhY2Ugb3V0c2lkZSBhIHN0cmluZyBvciBjb21tZW50LgpjbGFzcyBOb25Bc2NpaVdoaXRlc3BhY2VUb2tlbiBleHRlbmRzIEVycm9yVG9rZW4gewogIGZpbmFsIGludCBjaGFyYWN0ZXI7CgogIE5vbkFzY2lpV2hpdGVzcGFjZVRva2VuKHRoaXMuY2hhcmFjdGVyLCBpbnQgY2hhck9mZnNldCkgOiBzdXBlcihjaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIk5vbkFzY2lpV2hpdGVzcGFjZVRva2VuKCRjaGFyYWN0ZXIpIjsKCiAgTWVzc2FnZSBnZXQgYXNzZXJ0aW9uTWVzc2FnZSA9PgogICAgICB0ZW1wbGF0ZU5vbkFzY2lpV2hpdGVzcGFjZS53aXRoQXJndW1lbnRzKGNoYXJhY3Rlcik7Cn0KCi8vLyBSZXByZXNlbnRzIGFuIEFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVyIG91dHNpZGUgYSBzdHJpbmcgb3IgY29tbWVudC4KY2xhc3MgQXNjaWlDb250cm9sQ2hhcmFjdGVyVG9rZW4gZXh0ZW5kcyBFcnJvclRva2VuIHsKICBmaW5hbCBpbnQgY2hhcmFjdGVyOwoKICBBc2NpaUNvbnRyb2xDaGFyYWN0ZXJUb2tlbih0aGlzLmNoYXJhY3RlciwgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc3VwZXIoY2hhck9mZnNldCk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJBc2NpaUNvbnRyb2xDaGFyYWN0ZXJUb2tlbigkY2hhcmFjdGVyKSI7CgogIE1lc3NhZ2UgZ2V0IGFzc2VydGlvbk1lc3NhZ2UgPT4KICAgICAgdGVtcGxhdGVBc2NpaUNvbnRyb2xDaGFyYWN0ZXIud2l0aEFyZ3VtZW50cyhjaGFyYWN0ZXIpOwp9CgovLy8gRGVub3RlcyBhbiBvcGVyYXRvciB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIERhcnQgbGFuZ3VhZ2UuCmNsYXNzIFVuc3VwcG9ydGVkT3BlcmF0b3IgZXh0ZW5kcyBFcnJvclRva2VuIHsKICBUb2tlbiB0b2tlbjsKCiAgVW5zdXBwb3J0ZWRPcGVyYXRvcih0aGlzLnRva2VuLCBpbnQgY2hhck9mZnNldCkgOiBzdXBlcihjaGFyT2Zmc2V0KTsKCiAgQG92ZXJyaWRlCiAgTWVzc2FnZSBnZXQgYXNzZXJ0aW9uTWVzc2FnZSA9PgogICAgICB0ZW1wbGF0ZVVuc3VwcG9ydGVkT3BlcmF0b3Iud2l0aEFyZ3VtZW50cyh0b2tlbik7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICJVbnN1cHBvcnRlZE9wZXJhdG9yKCR7dG9rZW4ubGV4ZW1lfSkiOwp9CgovLy8gUmVwcmVzZW50cyBhbiB1bnRlcm1pbmF0ZWQgc3RyaW5nLgpjbGFzcyBVbnRlcm1pbmF0ZWRTdHJpbmcgZXh0ZW5kcyBFcnJvclRva2VuIHsKICBmaW5hbCBTdHJpbmcgc3RhcnQ7CiAgZmluYWwgaW50IGVuZE9mZnNldDsKCiAgVW50ZXJtaW5hdGVkU3RyaW5nKHRoaXMuc3RhcnQsIGludCBjaGFyT2Zmc2V0LCB0aGlzLmVuZE9mZnNldCkKICAgICAgOiBzdXBlcihjaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlVudGVybWluYXRlZFN0cmluZygkc3RhcnQpIjsKCiAgaW50IGdldCBjaGFyQ291bnQgPT4gZW5kT2Zmc2V0IC0gY2hhck9mZnNldDsKCiAgaW50IGdldCBsZW5ndGggPT4gY2hhckNvdW50OwoKICBNZXNzYWdlIGdldCBhc3NlcnRpb25NZXNzYWdlID0+CiAgICAgIHRlbXBsYXRlVW50ZXJtaW5hdGVkU3RyaW5nLndpdGhBcmd1bWVudHMoc3RhcnQsIGNsb3NlUXVvdGVGb3Ioc3RhcnQpKTsKfQoKLy8vIFJlcHJlc2VudHMgYW4gdW50ZXJtaW5hdGVkIHRva2VuLgpjbGFzcyBVbnRlcm1pbmF0ZWRUb2tlbiBleHRlbmRzIEVycm9yVG9rZW4gewogIGZpbmFsIE1lc3NhZ2UgYXNzZXJ0aW9uTWVzc2FnZTsKICBmaW5hbCBpbnQgZW5kT2Zmc2V0OwoKICBVbnRlcm1pbmF0ZWRUb2tlbih0aGlzLmFzc2VydGlvbk1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCB0aGlzLmVuZE9mZnNldCkKICAgICAgOiBzdXBlcihjaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlVudGVybWluYXRlZFRva2VuKCR7YXNzZXJ0aW9uTWVzc2FnZS5jb2RlLm5hbWV9KSI7CgogIGludCBnZXQgY2hhckNvdW50ID0+IGVuZE9mZnNldCAtIGNoYXJPZmZzZXQ7Cn0KCi8vLyBSZXByZXNlbnRzIGFuIG9wZW4gYnJhY2Ugd2l0aG91dCBhIG1hdGNoaW5nIGNsb3NlIGJyYWNlLgovLy8KLy8vIEluIHRoaXMgY2FzZSwgYnJhY2UgbWVhbnMgYW55IG9mIGAoYCwgYHtgLCBgW2AsIGFuZCBgPGAsIHBhcmVudGhlc2lzLCBjdXJseQovLy8gYnJhY2UsIHNxdWFyZSBicmFjZSwgYW5kIGFuZ2xlIGJyYWNlLCByZXNwZWN0aXZlbHkuCmNsYXNzIFVubWF0Y2hlZFRva2VuIGV4dGVuZHMgRXJyb3JUb2tlbiB7CiAgZmluYWwgQmVnaW5Ub2tlbiBiZWdpbjsKCiAgVW5tYXRjaGVkVG9rZW4oQmVnaW5Ub2tlbiBiZWdpbikKICAgICAgOiB0aGlzLmJlZ2luID0gYmVnaW4sCiAgICAgICAgc3VwZXIoYmVnaW4uY2hhck9mZnNldCk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJVbm1hdGNoZWRUb2tlbigke2JlZ2luLmxleGVtZX0pIjsKCiAgTWVzc2FnZSBnZXQgYXNzZXJ0aW9uTWVzc2FnZSA9PgogICAgICB0ZW1wbGF0ZVVubWF0Y2hlZFRva2VuLndpdGhBcmd1bWVudHMoY2xvc2VCcmFjZUZvcihiZWdpbi5sZXhlbWUpLCBiZWdpbik7Cn0KgNsATk48ASIBSwEdCQ4RGSckJCAlJAFCAUQBShpCBBcmMQEiNyQmLx0dHh4oJyYiJyAgJiQpKy8nL0EBDUEEAgEsBEUSMEUBQz4MFwEWLQFDSy5AQyQmOw8IBgEUBAEgATgBHQEcAR0BIAEMESMEAgEiLjoBLwEzAgFCMxcBTwE+AUw5AgFDMxcBTwE+ASI7AgFHNhcBPRsBQQEiPgIBRC8PAUcBDCI4AQw/AgEnLhYXAUEbATUBLwEfASJNAgEmLSIXAUsbAUsBLwIBPQRQOCoaASMcIQE6ASJQAgE0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvZXJyb3JfdG9rZW4uZGFydEFzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc2Nhbm5lci90b2tlbl9jb25zdGFudHMuZGFydI+JLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuc2Nhbm5lci50b2tlbl9jb25zdGFudHM7CgppbXBvcnQgJ2NoYXJhY3RlcnMuZGFydCc7Cgpjb25zdCBpbnQgRU9GX1RPS0VOID0gMDsKCmNvbnN0IGludCBLRVlXT1JEX1RPS0VOID0gJGs7CmNvbnN0IGludCBJREVOVElGSUVSX1RPS0VOID0gJGE7CmNvbnN0IGludCBTQ1JJUFRfVE9LRU4gPSAkYjsKY29uc3QgaW50IEJBRF9JTlBVVF9UT0tFTiA9ICRYOwpjb25zdCBpbnQgRE9VQkxFX1RPS0VOID0gJGQ7CmNvbnN0IGludCBJTlRfVE9LRU4gPSAkaTsKY29uc3QgaW50IFJFQ09WRVJZX1RPS0VOID0gJHI7CmNvbnN0IGludCBIRVhBREVDSU1BTF9UT0tFTiA9ICR4Owpjb25zdCBpbnQgU1RSSU5HX1RPS0VOID0gJFNROwoKY29uc3QgaW50IEFNUEVSU0FORF9UT0tFTiA9ICRBTVBFUlNBTkQ7CmNvbnN0IGludCBCQUNLUElOR19UT0tFTiA9ICRCQUNLUElORzsKY29uc3QgaW50IEJBQ0tTTEFTSF9UT0tFTiA9ICRCQUNLU0xBU0g7CmNvbnN0IGludCBCQU5HX1RPS0VOID0gJEJBTkc7CmNvbnN0IGludCBCQVJfVE9LRU4gPSAkQkFSOwpjb25zdCBpbnQgQ09MT05fVE9LRU4gPSAkQ09MT047CmNvbnN0IGludCBDT01NQV9UT0tFTiA9ICRDT01NQTsKY29uc3QgaW50IEVRX1RPS0VOID0gJEVROwpjb25zdCBpbnQgR1RfVE9LRU4gPSAkR1Q7CmNvbnN0IGludCBIQVNIX1RPS0VOID0gJEhBU0g7CmNvbnN0IGludCBPUEVOX0NVUkxZX0JSQUNLRVRfVE9LRU4gPSAkT1BFTl9DVVJMWV9CUkFDS0VUOwpjb25zdCBpbnQgT1BFTl9TUVVBUkVfQlJBQ0tFVF9UT0tFTiA9ICRPUEVOX1NRVUFSRV9CUkFDS0VUOwpjb25zdCBpbnQgT1BFTl9QQVJFTl9UT0tFTiA9ICRPUEVOX1BBUkVOOwpjb25zdCBpbnQgTFRfVE9LRU4gPSAkTFQ7CmNvbnN0IGludCBNSU5VU19UT0tFTiA9ICRNSU5VUzsKY29uc3QgaW50IFBFUklPRF9UT0tFTiA9ICRQRVJJT0Q7CmNvbnN0IGludCBQTFVTX1RPS0VOID0gJFBMVVM7CmNvbnN0IGludCBRVUVTVElPTl9UT0tFTiA9ICRRVUVTVElPTjsKY29uc3QgaW50IEFUX1RPS0VOID0gJEFUOwpjb25zdCBpbnQgQ0xPU0VfQ1VSTFlfQlJBQ0tFVF9UT0tFTiA9ICRDTE9TRV9DVVJMWV9CUkFDS0VUOwpjb25zdCBpbnQgQ0xPU0VfU1FVQVJFX0JSQUNLRVRfVE9LRU4gPSAkQ0xPU0VfU1FVQVJFX0JSQUNLRVQ7CmNvbnN0IGludCBDTE9TRV9QQVJFTl9UT0tFTiA9ICRDTE9TRV9QQVJFTjsKY29uc3QgaW50IFNFTUlDT0xPTl9UT0tFTiA9ICRTRU1JQ09MT047CmNvbnN0IGludCBTTEFTSF9UT0tFTiA9ICRTTEFTSDsKY29uc3QgaW50IFRJTERFX1RPS0VOID0gJFRJTERFOwpjb25zdCBpbnQgU1RBUl9UT0tFTiA9ICRTVEFSOwpjb25zdCBpbnQgUEVSQ0VOVF9UT0tFTiA9ICRQRVJDRU5UOwpjb25zdCBpbnQgQ0FSRVRfVE9LRU4gPSAkQ0FSRVQ7Cgpjb25zdCBpbnQgU1RSSU5HX0lOVEVSUE9MQVRJT05fVE9LRU4gPSAxMjg7CmNvbnN0IGludCBMVF9FUV9UT0tFTiA9IFNUUklOR19JTlRFUlBPTEFUSU9OX1RPS0VOICsgMTsKY29uc3QgaW50IEZVTkNUSU9OX1RPS0VOID0gTFRfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgU0xBU0hfRVFfVE9LRU4gPSBGVU5DVElPTl9UT0tFTiArIDE7CmNvbnN0IGludCBQRVJJT0RfUEVSSU9EX1BFUklPRF9UT0tFTiA9IFNMQVNIX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IFBFUklPRF9QRVJJT0RfVE9LRU4gPSBQRVJJT0RfUEVSSU9EX1BFUklPRF9UT0tFTiArIDE7CmNvbnN0IGludCBFUV9FUV9FUV9UT0tFTiA9IFBFUklPRF9QRVJJT0RfVE9LRU4gKyAxOwpjb25zdCBpbnQgRVFfRVFfVE9LRU4gPSBFUV9FUV9FUV9UT0tFTiArIDE7CmNvbnN0IGludCBMVF9MVF9FUV9UT0tFTiA9IEVRX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IExUX0xUX1RPS0VOID0gTFRfTFRfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgR1RfRVFfVE9LRU4gPSBMVF9MVF9UT0tFTiArIDE7CmNvbnN0IGludCBHVF9HVF9FUV9UT0tFTiA9IEdUX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IElOREVYX0VRX1RPS0VOID0gR1RfR1RfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgSU5ERVhfVE9LRU4gPSBJTkRFWF9FUV9UT0tFTiArIDE7CmNvbnN0IGludCBCQU5HX0VRX0VRX1RPS0VOID0gSU5ERVhfVE9LRU4gKyAxOwpjb25zdCBpbnQgQkFOR19FUV9UT0tFTiA9IEJBTkdfRVFfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgQU1QRVJTQU5EX0FNUEVSU0FORF9UT0tFTiA9IEJBTkdfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgQU1QRVJTQU5EX0FNUEVSU0FORF9FUV9UT0tFTiA9IEFNUEVSU0FORF9BTVBFUlNBTkRfVE9LRU4gKyAxOwpjb25zdCBpbnQgQU1QRVJTQU5EX0VRX1RPS0VOID0gQU1QRVJTQU5EX0FNUEVSU0FORF9FUV9UT0tFTiArIDE7CmNvbnN0IGludCBCQVJfQkFSX1RPS0VOID0gQU1QRVJTQU5EX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IEJBUl9CQVJfRVFfVE9LRU4gPSBCQVJfQkFSX1RPS0VOICsgMTsKY29uc3QgaW50IEJBUl9FUV9UT0tFTiA9IEJBUl9CQVJfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgU1RBUl9FUV9UT0tFTiA9IEJBUl9FUV9UT0tFTiArIDE7CmNvbnN0IGludCBQTFVTX1BMVVNfVE9LRU4gPSBTVEFSX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IFBMVVNfRVFfVE9LRU4gPSBQTFVTX1BMVVNfVE9LRU4gKyAxOwpjb25zdCBpbnQgTUlOVVNfTUlOVVNfVE9LRU4gPSBQTFVTX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IE1JTlVTX0VRX1RPS0VOID0gTUlOVVNfTUlOVVNfVE9LRU4gKyAxOwpjb25zdCBpbnQgVElMREVfU0xBU0hfRVFfVE9LRU4gPSBNSU5VU19FUV9UT0tFTiArIDE7CmNvbnN0IGludCBUSUxERV9TTEFTSF9UT0tFTiA9IFRJTERFX1NMQVNIX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IFBFUkNFTlRfRVFfVE9LRU4gPSBUSUxERV9TTEFTSF9UT0tFTiArIDE7CmNvbnN0IGludCBHVF9HVF9UT0tFTiA9IFBFUkNFTlRfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgQ0FSRVRfRVFfVE9LRU4gPSBHVF9HVF9UT0tFTiArIDE7CmNvbnN0IGludCBDT01NRU5UX1RPS0VOID0gQ0FSRVRfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUl9UT0tFTiA9IENPTU1FTlRfVE9LRU4gKyAxOwpjb25zdCBpbnQgUVVFU1RJT05fUEVSSU9EX1RPS0VOID0gU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUl9UT0tFTiArIDE7CmNvbnN0IGludCBRVUVTVElPTl9RVUVTVElPTl9UT0tFTiA9IFFVRVNUSU9OX1BFUklPRF9UT0tFTiArIDE7CmNvbnN0IGludCBRVUVTVElPTl9RVUVTVElPTl9FUV9UT0tFTiA9IFFVRVNUSU9OX1FVRVNUSU9OX1RPS0VOICsgMTsKY29uc3QgaW50IEdFTkVSSUNfTUVUSE9EX1RZUEVfQVNTSUdOX1RPS0VOID0gUVVFU1RJT05fUVVFU1RJT05fRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgR0VORVJJQ19NRVRIT0RfVFlQRV9MSVNUX1RPS0VOID0gR0VORVJJQ19NRVRIT0RfVFlQRV9BU1NJR05fVE9LRU4gKyAxOwpjb25zdCBpbnQgR1RfR1RfR1RfVE9LRU4gPSBHRU5FUklDX01FVEhPRF9UWVBFX0xJU1RfVE9LRU4gKyAxOwpjb25zdCBpbnQgUEVSSU9EX1BFUklPRF9QRVJJT0RfUVVFU1RJT05fVE9LRU4gPSBHVF9HVF9HVF9UT0tFTiArIDE7CmNvbnN0IGludCBHVF9HVF9HVF9FUV9UT0tFTiA9IFBFUklPRF9QRVJJT0RfUEVSSU9EX1FVRVNUSU9OX1RPS0VOICsgMTsKY29uc3QgaW50IFFVRVNUSU9OX1BFUklPRF9PUEVOX1NRVUFSRV9CUkFDS0VUX1RPS0VOID0gR1RfR1RfR1RfRVFfVE9LRU4gKyAxOwpeAE5OPAEnARoBGQEeIR0gHRofIh4BKCYoHhwgIBoaHjo8KhogIh4mGjw+LCggIB4kIAEsOCwvO0A0LCwsKSwvLC4wOUhBMjAvLC8vMTI1ODQuLC5FTT9ETVE/REdNAThwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc2Nhbm5lci90b2tlbl9jb25zdGFudHMuZGFydD1zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2JvZHlfYnVpbGRlci5kYXJ0wAMHHy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmJvZHlfYnVpbGRlcjsKCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICcuLi9jb25zdGFudF9jb250ZXh0LmRhcnQnIHNob3cgQ29uc3RhbnRDb250ZXh0OwoKaW1wb3J0ICcuLi9kaWxsL2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgRGlsbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBhcyBmYXN0YTsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyBMb2NhdGVkTWVzc2FnZSwgTWVzc2FnZSwgbm9MZW5ndGgsIFRlbXBsYXRlOwoKaW1wb3J0ICcuLi9tZXNzYWdlcy5kYXJ0JyBhcyBtZXNzYWdlcyBzaG93IGdldExvY2F0aW9uRnJvbVVyaTsKCmltcG9ydCAnLi4vbW9kaWZpZXIuZGFydCcgc2hvdyBNb2RpZmllciwgY29uc3RNYXNrLCBjb3ZhcmlhbnRNYXNrLCBmaW5hbE1hc2s7CgppbXBvcnQgJy4uL25hbWVzLmRhcnQnCiAgICBzaG93IGNhbGxOYW1lLCBlbXB0eU5hbWUsIGluZGV4R2V0TmFtZSwgaW5kZXhTZXROYW1lLCBtaW51c05hbWUsIHBsdXNOYW1lOwoKaW1wb3J0ICcuLi9wYXJzZXIuZGFydCcKICAgIHNob3cKICAgICAgICBBc3NlcnQsCiAgICAgICAgUGFyc2VyLAogICAgICAgIEZvcm1hbFBhcmFtZXRlcktpbmQsCiAgICAgICAgSWRlbnRpZmllckNvbnRleHQsCiAgICAgICAgTWVtYmVyS2luZCwKICAgICAgICBsZW5ndGhGb3JUb2tlbiwKICAgICAgICBsZW5ndGhPZlNwYW4sCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4sCiAgICAgICAgb3B0aW9uYWw7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnCiAgICBzaG93IGludGVybmFsUHJvYmxlbSwgdW5leHBlY3RlZCwgdW5oYW5kbGVkLCB1bnN1cHBvcnRlZDsKCmltcG9ydCAnLi4vcXVvdGUuZGFydCcKICAgIHNob3cKICAgICAgICBRdW90ZSwKICAgICAgICBhbmFseXplUXVvdGUsCiAgICAgICAgdW5lc2NhcGUsCiAgICAgICAgdW5lc2NhcGVGaXJzdFN0cmluZ1BhcnQsCiAgICAgICAgdW5lc2NhcGVMYXN0U3RyaW5nUGFydCwKICAgICAgICB1bmVzY2FwZVN0cmluZzsKCmltcG9ydCAnLi4vc2Nhbm5lci5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuLmRhcnQnCiAgICBzaG93IGlzQmluYXJ5T3BlcmF0b3IsIGlzTWludXNPcGVyYXRvciwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I7CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnIHNob3cgUHJvYmxlbUJ1aWxkZXI7CgppbXBvcnQgJy4uL3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJy4uL3NvdXJjZS9zY29wZV9saXN0ZW5lci5kYXJ0JwogICAgc2hvdwogICAgICAgIEZpeGVkTnVsbGFibGVMaXN0LAogICAgICAgIEdyb3dhYmxlTGlzdCwKICAgICAgICBKdW1wVGFyZ2V0S2luZCwKICAgICAgICBOdWxsVmFsdWUsCiAgICAgICAgUGFyc2VyUmVjb3ZlcnksCiAgICAgICAgU2NvcGVMaXN0ZW5lcjsKCmltcG9ydCAnLi4vc291cmNlL3ZhbHVlX2tpbmRzLmRhcnQnOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnQnIHNob3cgVHlwZUluZmVycmVyOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX3Byb21vdGlvbi5kYXJ0JwogICAgc2hvdyBUeXBlUHJvbW90ZXIsIFR5cGVQcm9tb3Rpb25GYWN0LCBUeXBlUHJvbW90aW9uU2NvcGU7CgppbXBvcnQgJ2NvbGxlY3Rpb25zLmRhcnQnCiAgICBzaG93CiAgICAgICAgU3ByZWFkRWxlbWVudCwKICAgICAgICBTcHJlYWRNYXBFbnRyeSwKICAgICAgICBjb252ZXJ0VG9NYXBFbnRyeSwKICAgICAgICBpc0NvbnZlcnRpYmxlVG9NYXBFbnRyeTsKCmltcG9ydCAnY29uc3RuZXNzLmRhcnQnIHNob3cgQ29uc3RuZXNzOwoKaW1wb3J0ICdleHByZXNzaW9uX2dlbmVyYXRvci5kYXJ0JwogICAgc2hvdwogICAgICAgIERlbGF5ZWRBc3NpZ25tZW50LAogICAgICAgIERlbGF5ZWRQb3N0Zml4SW5jcmVtZW50LAogICAgICAgIEdlbmVyYXRvciwKICAgICAgICBJbmNvbXBsZXRlRXJyb3JHZW5lcmF0b3IsCiAgICAgICAgSW5jb21wbGV0ZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yLAogICAgICAgIEluY29tcGxldGVTZW5kR2VuZXJhdG9yLAogICAgICAgIEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IsCiAgICAgICAgTG9hZExpYnJhcnlHZW5lcmF0b3IsCiAgICAgICAgUGFyZW50aGVzaXplZEV4cHJlc3Npb25HZW5lcmF0b3IsCiAgICAgICAgUGFyc2VyRXJyb3JHZW5lcmF0b3IsCiAgICAgICAgUHJlZml4VXNlR2VuZXJhdG9yLAogICAgICAgIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yLAogICAgICAgIFJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yLAogICAgICAgIFNlbmRBY2Nlc3NHZW5lcmF0b3IsCiAgICAgICAgU3RhdGljQWNjZXNzR2VuZXJhdG9yLAogICAgICAgIFN1cGVySW5kZXhlZEFjY2Vzc0dlbmVyYXRvciwKICAgICAgICBUaGlzQWNjZXNzR2VuZXJhdG9yLAogICAgICAgIFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciwKICAgICAgICBUeXBlVXNlR2VuZXJhdG9yLAogICAgICAgIFVubGlua2VkR2VuZXJhdG9yLAogICAgICAgIFVucmVzb2x2ZWROYW1lR2VuZXJhdG9yLAogICAgICAgIFZhcmlhYmxlVXNlR2VuZXJhdG9yLAogICAgICAgIGJ1aWxkSXNOdWxsOwoKaW1wb3J0ICdleHByZXNzaW9uX2dlbmVyYXRvcl9oZWxwZXIuZGFydCcgc2hvdyBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyOwoKaW1wb3J0ICdmYW5nb3JuLmRhcnQnIHNob3cgRmFuZ29ybjsKCmltcG9ydCAnZm9yZXN0LmRhcnQnIHNob3cgRm9yZXN0OwoKaW1wb3J0ICdpbXBsaWNpdF90eXBlX2FyZ3VtZW50LmRhcnQnIHNob3cgSW1wbGljaXRUeXBlQXJndW1lbnQ7CgppbXBvcnQgJ2tlcm5lbF9zaGFkb3dfYXN0LmRhcnQnIGFzIHNoYWRvdwogICAgc2hvdyBTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQsIFN5bnRoZXRpY1dyYXBwZXI7CgppbXBvcnQgJ3JlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keS5kYXJ0JwogICAgc2hvdwogICAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUJvZHksCiAgICAgICAgUmVkaXJlY3Rpb25UYXJnZXQsCiAgICAgICAgZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keSwKICAgICAgICBnZXRSZWRpcmVjdGlvblRhcmdldCwKICAgICAgICBpc1JlZGlyZWN0aW5nRmFjdG9yeTsKCmltcG9ydCAndHlwZV9hbGdvcml0aG1zLmRhcnQnIHNob3cgY2FsY3VsYXRlQm91bmRzOwoKaW1wb3J0ICdrZXJuZWxfYXBpLmRhcnQnOwoKaW1wb3J0ICdrZXJuZWxfYXN0X2FwaS5kYXJ0JzsKCmltcG9ydCAna2VybmVsX2J1aWxkZXIuZGFydCc7CgovLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIGFuZCBlbnN1cmUgYWxsIG5vZGVzIGhhdmUgYSBsb2NhdGlvbi4KY29uc3Qgbm9Mb2NhdGlvbiA9IG51bGw7CgovLyBUT0RPKGRhbnJ1YmVsKTogUmVtb3ZlIHRoaXMgb25jZSBjb250cm9sIGZsb3cgYW5kIHNwcmVhZCBjb2xsZWN0aW9uIHN1cHBvcnQKLy8gaGFzIGJlZW4gZW5hYmxlZCBieSBkZWZhdWx0Lgpjb25zdCBpbnZhbGlkQ29sbGVjdGlvbkVsZW1lbnQgPSBjb25zdCBPYmplY3QoKTsKCmNsYXNzIEJvZHlCdWlsZGVyIGV4dGVuZHMgU2NvcGVMaXN0ZW5lcjxKdW1wVGFyZ2V0PgogICAgaW1wbGVtZW50cyBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyLCBFbnN1cmVMb2FkZWQgewogIGZpbmFsIEZvcmVzdCBmb3Jlc3Q7CgogIC8vIFRPRE8oYWhlKTogUmVuYW1lIFtsaWJyYXJ5XSB0byAncGFydCcuCiAgQG92ZXJyaWRlCiAgZmluYWwgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeTsKCiAgZmluYWwgTW9kaWZpZXJCdWlsZGVyIG1lbWJlcjsKCiAgZmluYWwgQ2xhc3NCdWlsZGVyIGNsYXNzQnVpbGRlcjsKCiAgZmluYWwgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5OwoKICBAb3ZlcnJpZGUKICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzOwoKICBmaW5hbCBib29sIGlzSW5zdGFuY2VNZW1iZXI7CgogIGZpbmFsIFNjb3BlIGVuY2xvc2luZ1Njb3BlOwoKICBmaW5hbCBib29sIGVuYWJsZU5hdGl2ZTsKCiAgZmluYWwgYm9vbCBzdHJpbmdFeHBlY3RlZEFmdGVyTmF0aXZlOwoKICAvLy8gV2hldGhlciB0byBpZ25vcmUgYW4gdW5yZXNvbHZlZCByZWZlcmVuY2UgdG8gYG1haW5gIHdpdGhpbiB0aGUgYm9keSBvZgogIC8vLyBgX2dldE1haW5DbG9zdXJlYCB3aGVuIGNvbXBpbGluZyB0aGUgY3VycmVudCBsaWJyYXJ5LgogIC8vLwogIC8vLyBUaGlzIGFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQuIFRoZSBzdGFuZGFsb25lIFZNIGFuZCBmbHV0dGVyIGhhdmUKICAvLy8gc3BlY2lhbCBsb2dpYyB0byByZXNvbHZlIGBtYWluYCBpbiBgX2dldE1haW5DbG9zdXJlYCwgdGhpcyBmbGFnIGlzIHVzZWQgdG8KICAvLy8gaWdub3JlIHRoYXQgcmVmZXJlbmNlIHRvIGBtYWluYCwgYnV0IG9ubHkgb24gbGlicmFyaWVzIHdoZXJlIHdlIGV4cGVjdCB0bwogIC8vLyBzZWUgaXQgKHRvZGF5IHRoYXQgaXMgZGFydDpfYnVpbHRpbiBhbmQgZGFydDp1aSkuCiAgLy8vCiAgLy8gVE9ETyhhaGUsc2lnbXVuZCk6IHJlbW92ZSB3aGVuIHRoZSBWTSBnZXRzIHJpZCBvZiB0aGUgc3BlY2lhbCBydWxlLCBzZWUKICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMjg5ODkuCiAgZmluYWwgYm9vbCBpZ25vcmVNYWluSW5HZXRNYWluQ2xvc3VyZTsKCiAgLy8gVE9ETyhhaGUpOiBDb25zaWRlciByZW5hbWluZyBbdXJpXSB0byAncGFydFVyaScuCiAgQG92ZXJyaWRlCiAgZmluYWwgVXJpIHVyaTsKCiAgZmluYWwgVHlwZUluZmVycmVyIHR5cGVJbmZlcnJlcjsKCiAgQG92ZXJyaWRlCiAgZmluYWwgVHlwZVByb21vdGVyIHR5cGVQcm9tb3RlcjsKCiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBsZWdhY3lNb2RlOwoKICAvLy8gT25seSB1c2VkIHdoZW4gW21lbWJlcl0gaXMgYSBjb25zdHJ1Y3Rvci4gSXQgdHJhY2tzIGlmIGFuIGltcGxpY2l0IHN1cGVyCiAgLy8vIGluaXRpYWxpemVyIGlzIG5lZWRlZC4KICAvLy8KICAvLy8gQW4gaW1wbGljaXQgc3VwZXIgaW5pdGlhbGl6ZXIgaXNuJ3QgbmVlZGVkCiAgLy8vCiAgLy8vIDEuIGlmIHRoZSBjdXJyZW50IGNsYXNzIGlzIE9iamVjdCwKICAvLy8gMi4gaWYgdGhlcmUgaXMgYW4gZXhwbGljaXQgc3VwZXIgaW5pdGlhbGl6ZXIsCiAgLy8vIDMuIGlmIHRoZXJlIGlzIGEgcmVkaXJlY3RpbmcgKHRoaXMpIGluaXRpYWxpemVyLCBvcgogIC8vLyA0LiBpZiBhIGNvbXBpbGUtdGltZSBlcnJvciBwcmV2ZW50ZWQgdXMgZnJvbSBnZW5lcmF0aW5nIGNvZGUgZm9yIGFuCiAgLy8vICAgIGluaXRpYWxpemVyLiBUaGlzIGF2b2lkcyBjYXNjYWRpbmcgZXJyb3JzLgogIGJvb2wgbmVlZHNJbXBsaWNpdFN1cGVySW5pdGlhbGl6ZXI7CgogIFNjb3BlIGZvcm1hbFBhcmFtZXRlclNjb3BlOwoKICAvLy8gVGhpcyBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHdlIHN0YXJ0IHBhcnNpbmcgYW4gaW5pdGlhbGl6ZXIuIFdlIHVzZSB0aGlzIHRvCiAgLy8vIGZpbmQgdGhlIGNvcnJlY3Qgc2NvcGUgZm9yIGluaXRpYWxpemVycyBsaWtlIGluIHRoaXMgZXhhbXBsZToKICAvLy8KICAvLy8gICAgIGNsYXNzIEMgewogIC8vLyAgICAgICBmaW5hbCB4OwogIC8vLyAgICAgICBDKHgpIDogeCA9IHg7CiAgLy8vICAgICB9CiAgLy8vCiAgLy8vIFdoZW4gcGFyc2luZyB0aGlzIGluaXRpYWxpemVyIGB4ID0geGAsIGB4YCBtdXN0IGJlIHJlc29sdmVkIGluIHR3bwogIC8vLyBkaWZmZXJlbnQgc2NvcGVzLiBUaGUgZmlyc3QgYHhgIG11c3QgYmUgcmVzb2x2ZWQgaW4gdGhlIGNsYXNzJyBzY29wZSwgdGhlCiAgLy8vIHNlY29uZCBpbiB0aGUgZm9ybWFsIHBhcmFtZXRlciBzY29wZS4KICBib29sIGluSW5pdGlhbGl6ZXIgPSBmYWxzZTsKCiAgLy8vIFNldCB0byBgdHJ1ZWAgd2hlbiB3ZSBhcmUgcGFyc2luZyBhIGZpZWxkIGluaXRpYWxpemVyIGVpdGhlciBkaXJlY3RseQogIC8vLyBvciB3aXRoaW4gYW4gaW5pdGlhbGl6ZXIgbGlzdC4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGluIGA8aW5pdD5gIGluCiAgLy8vCiAgLy8vICAgIHZhciBmb28gPSA8aW5pdD47CiAgLy8vICAgIGNsYXNzIENsYXNzIHsKICAvLy8gICAgICB2YXIgYmFyID0gPGluaXQ+OwogIC8vLyAgICAgIENsYXNzKCkgOiA8aW5pdD47CiAgLy8vICAgIH0KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGluc3RhbmNlIHByb3BlcnRpZXMgYXJlIGF2YWlsYWJsZS4KICBib29sIGluRmllbGRJbml0aWFsaXplciA9IGZhbHNlOwoKICBib29sIGluQ2F0Y2hDbGF1c2UgPSBmYWxzZTsKCiAgYm9vbCBpbkNhdGNoQmxvY2sgPSBmYWxzZTsKCiAgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsID0gMDsKCiAgLy8gU2V0IHdoZW4gYSBzcHJlYWQgZWxlbWVudCBpcyBlbmNvdW50ZXJlZCBpbiBhIGNvbGxlY3Rpb24gc28gdGhlIGNvbGxlY3Rpb24KICAvLyBuZWVkcyB0byBiZSBkZXN1Z2FyZWQgYWZ0ZXIgdHlwZSBpbmZlcmVuY2UuCiAgYm9vbCB0cmFuc2Zvcm1Db2xsZWN0aW9ucyA9IGZhbHNlOwoKICAvLyBTZXQgYnkgdHlwZSBpbmZlcmVuY2Ugd2hlbiBhIHNldCBsaXRlcmFsIGlzIGVuY291bnRlcmVkIHRoYXQgbmVlZHMgdG8gYmUKICAvLyB0cmFuc2Zvcm1lZCBiZWNhdXNlIHRoZSBiYWNrZW5kIHRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHNldCBsaXRlcmFscy4KICBib29sIHRyYW5zZm9ybVNldExpdGVyYWxzID0gZmFsc2U7CgogIFN0YXRlbWVudCBwcm9ibGVtSW5Mb29wT3JTd2l0Y2g7CgogIFNjb3BlIHN3aXRjaFNjb3BlOwoKICBDbG9uZVZpc2l0b3IgY2xvbmVyOwoKICBDb25zdGFudENvbnRleHQgY29uc3RhbnRDb250ZXh0ID0gQ29uc3RhbnRDb250ZXh0Lm5vbmU7CgogIFVucmVzb2x2ZWRUeXBlIGN1cnJlbnRMb2NhbFZhcmlhYmxlVHlwZTsKCiAgLy8gVXNpbmcgbm9uLW51bGwgdmFsdWUgdG8gaW5pdGlhbGl6ZSB0aGlzIGZpZWxkIGJhc2VkIG9uIHBlcmZvcm1hbmNlIGFkdmljZQogIC8vIGZyb20gVk0gZW5naW5lZXJzLiBUT0RPKGFoZSk6IERvZXMgdGhpcyBzdGlsbCBhcHBseT8KICBpbnQgY3VycmVudExvY2FsVmFyaWFibGVNb2RpZmllcnMgPSAtMTsKCiAgLy8vIElmIG5vbi1udWxsLCByZWNvcmRzIGluc3RhbmNlIGZpZWxkcyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZAogIC8vLyBhbmQgd2hlcmUgdGhhdCB3YXMuCiAgTWFwPFN0cmluZywgaW50PiBpbml0aWFsaXplZEZpZWxkczsKCiAgLy8vIExpc3Qgb2YgYnVpbHQgcmVkaXJlY3RpbmcgZmFjdG9yeSBpbnZvY2F0aW9ucy4gIFRoZSB0YXJnZXRzIG9mIHRoZQogIC8vLyBpbnZvY2F0aW9ucyBhcmUgdG8gYmUgcmVzb2x2ZWQgaW4gYSBzZXBhcmF0ZSBzdGVwLgogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gcmVkaXJlY3RpbmdGYWN0b3J5SW52b2NhdGlvbnMgPSA8RXhwcmVzc2lvbj5bXTsKCiAgLy8vIFZhcmlhYmxlcyB3aXRoIG1ldGFkYXRhLiAgVGhlaXIgdHlwZXMgbmVlZCB0byBiZSBpbmZlcnJlZCBsYXRlLCBmb3IKICAvLy8gZXhhbXBsZSwgaW4gW2ZpbmlzaEZ1bmN0aW9uXS4KICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlc1dpdGhNZXRhZGF0YTsKCiAgLy8vIE1vcmUgdGhhbiBvbmUgdmFyaWFibGUgZGVjbGFyZWQgaW4gYSBzaW5nbGUgc3RhdGVtZW50IHRoYXQgaGFzIG1ldGFkYXRhLgogIC8vLyBUaGVpciB0eXBlcyBuZWVkIHRvIGJlIGluZmVycmVkIGxhdGUsIGZvciBleGFtcGxlLCBpbiBbZmluaXNoRnVuY3Rpb25dLgogIExpc3Q8TGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPj4gbXVsdGlWYXJpYWJsZXNXaXRoTWV0YWRhdGE7CgogIC8vLyBJZiB0aGUgY3VycmVudCBtZW1iZXIgaXMgYW4gaW5zdGFuY2UgbWVtYmVyIGluIGFuIGV4dGVuc2lvbiBkZWNsYXJhdGlvbiwKICAvLy8gW2V4dGVuc2lvblRoaXNdIGhvbGRzIHRoZSBzeW50aGV0aWNhbGx5IGFkZCBwYXJhbWV0ZXIgaG9sZGluZyB0aGUgdmFsdWUKICAvLy8gZm9yIGB0aGlzYC4KICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuc2lvblRoaXM7CgogIEJvZHlCdWlsZGVyKAogICAgICB0aGlzLmxpYnJhcnksCiAgICAgIHRoaXMubWVtYmVyLAogICAgICB0aGlzLmVuY2xvc2luZ1Njb3BlLAogICAgICB0aGlzLmZvcm1hbFBhcmFtZXRlclNjb3BlLAogICAgICB0aGlzLmhpZXJhcmNoeSwKICAgICAgdGhpcy5jb3JlVHlwZXMsCiAgICAgIHRoaXMuY2xhc3NCdWlsZGVyLAogICAgICB0aGlzLmlzSW5zdGFuY2VNZW1iZXIsCiAgICAgIHRoaXMuZXh0ZW5zaW9uVGhpcywKICAgICAgdGhpcy51cmksCiAgICAgIHRoaXMudHlwZUluZmVycmVyKQogICAgICA6IGZvcmVzdCA9IGNvbnN0IEZhbmdvcm4oKSwKICAgICAgICBlbmFibGVOYXRpdmUgPQogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuYmFja2VuZFRhcmdldC5lbmFibGVOYXRpdmUobGlicmFyeS51cmkpLAogICAgICAgIHN0cmluZ0V4cGVjdGVkQWZ0ZXJOYXRpdmUgPQogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuYmFja2VuZFRhcmdldC5uYXRpdmVFeHRlbnNpb25FeHBlY3RzU3RyaW5nLAogICAgICAgIGlnbm9yZU1haW5JbkdldE1haW5DbG9zdXJlID0gbGlicmFyeS51cmkuc2NoZW1lID09ICdkYXJ0JyAmJgogICAgICAgICAgICAobGlicmFyeS51cmkucGF0aCA9PSAiX2J1aWx0aW4iIHx8IGxpYnJhcnkudXJpLnBhdGggPT0gInVpIiksCiAgICAgICAgbmVlZHNJbXBsaWNpdFN1cGVySW5pdGlhbGl6ZXIgPQogICAgICAgICAgICBjb3JlVHlwZXM/Lm9iamVjdENsYXNzICE9IGNsYXNzQnVpbGRlcj8uY2xzLAogICAgICAgIHR5cGVQcm9tb3RlciA9IHR5cGVJbmZlcnJlcj8udHlwZVByb21vdGVyLAogICAgICAgIGxlZ2FjeU1vZGUgPSBsaWJyYXJ5LmxlZ2FjeU1vZGUsCiAgICAgICAgc3VwZXIoZW5jbG9zaW5nU2NvcGUpOwoKICBCb2R5QnVpbGRlci53aXRoUGFyZW50cyhLZXJuZWxGaWVsZEJ1aWxkZXIgZmllbGQsIEtlcm5lbExpYnJhcnlCdWlsZGVyIHBhcnQsCiAgICAgIENsYXNzQnVpbGRlciBjbGFzc0J1aWxkZXIsIFR5cGVJbmZlcnJlciB0eXBlSW5mZXJyZXIpCiAgICAgIDogdGhpcygKICAgICAgICAgICAgcGFydCwKICAgICAgICAgICAgZmllbGQsCiAgICAgICAgICAgIGNsYXNzQnVpbGRlcj8uc2NvcGUgPz8gZmllbGQubGlicmFyeS5zY29wZSwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgcGFydC5sb2FkZXIuaGllcmFyY2h5LAogICAgICAgICAgICBwYXJ0LmxvYWRlci5jb3JlVHlwZXMsCiAgICAgICAgICAgIGNsYXNzQnVpbGRlciwKICAgICAgICAgICAgZmllbGQuaXNJbnN0YW5jZU1lbWJlciwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgZmllbGQuZmlsZVVyaSwKICAgICAgICAgICAgdHlwZUluZmVycmVyKTsKCiAgQm9keUJ1aWxkZXIuZm9yRmllbGQoS2VybmVsRmllbGRCdWlsZGVyIGZpZWxkLCBUeXBlSW5mZXJyZXIgdHlwZUluZmVycmVyKQogICAgICA6IHRoaXMud2l0aFBhcmVudHMoCiAgICAgICAgICAgIGZpZWxkLAogICAgICAgICAgICBmaWVsZC5wYXJlbnQgaXMgQ2xhc3NCdWlsZGVyID8gZmllbGQucGFyZW50LnBhcmVudCA6IGZpZWxkLnBhcmVudCwKICAgICAgICAgICAgZmllbGQucGFyZW50IGlzIENsYXNzQnVpbGRlciA/IGZpZWxkLnBhcmVudCA6IG51bGwsCiAgICAgICAgICAgIHR5cGVJbmZlcnJlcik7CgogIEJvZHlCdWlsZGVyLmZvck91dGxpbmVFeHByZXNzaW9uKAogICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LAogICAgICBDbGFzc0J1aWxkZXIgY2xhc3NCdWlsZGVyLAogICAgICBNb2RpZmllckJ1aWxkZXIgbWVtYmVyLAogICAgICBTY29wZSBzY29wZSwKICAgICAgVXJpIGZpbGVVcmkpCiAgICAgIDogdGhpcygKICAgICAgICAgICAgbGlicmFyeSwKICAgICAgICAgICAgbWVtYmVyLAogICAgICAgICAgICBzY29wZSwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgbGlicmFyeS5sb2FkZXIuaGllcmFyY2h5LAogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci5jb3JlVHlwZXMsCiAgICAgICAgICAgIGNsYXNzQnVpbGRlciwKICAgICAgICAgICAgbWVtYmVyPy5pc0luc3RhbmNlTWVtYmVyID8/IGZhbHNlLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBmaWxlVXJpLAogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50eXBlSW5mZXJlbmNlRW5naW5lPy5jcmVhdGVMb2NhbFR5cGVJbmZlcnJlcigKICAgICAgICAgICAgICAgIGZpbGVVcmksIGNsYXNzQnVpbGRlcj8udGFyZ2V0Py50aGlzVHlwZSwgbGlicmFyeSkpOwoKICBib29sIGdldCBpbkNvbnN0cnVjdG9yIHsKICAgIHJldHVybiBmdW5jdGlvbk5lc3RpbmdMZXZlbCA9PSAwICYmIG1lbWJlciBpcyBDb25zdHJ1Y3RvckJ1aWxkZXI7CiAgfQoKICBib29sIGdldCBpc0luc3RhbmNlQ29udGV4dCB7CiAgICByZXR1cm4gaXNJbnN0YW5jZU1lbWJlciB8fCBtZW1iZXIgaXMgQ29uc3RydWN0b3JCdWlsZGVyOwogIH0KCiAgVHlwZUVudmlyb25tZW50IGdldCB0eXBlRW52aXJvbm1lbnQgPT4gdHlwZUluZmVycmVyPy50eXBlU2NoZW1hRW52aXJvbm1lbnQ7CgogIERhcnRUeXBlIGdldCBpbXBsaWNpdFR5cGVBcmd1bWVudCA9PgogICAgICBsZWdhY3lNb2RlID8gY29uc3QgRHluYW1pY1R5cGUoKSA6IGNvbnN0IEltcGxpY2l0VHlwZUFyZ3VtZW50KCk7CgogIEBvdmVycmlkZQogIHZvaWQgcHVzaChPYmplY3Qgbm9kZSkgewogICAgaWYgKG5vZGUgaXMgRGFydFR5cGUpIHsKICAgICAgdW5oYW5kbGVkKCJEYXJ0VHlwZSIsICJwdXNoIiwgLTEsIHVyaSk7CiAgICB9CiAgICBpbkluaXRpYWxpemVyID0gZmFsc2U7CiAgICBzdXBlci5wdXNoKG5vZGUpOwogIH0KCiAgRXhwcmVzc2lvbiBwb3BGb3JWYWx1ZSgpID0+IHRvVmFsdWUocG9wKCkpOwoKICBFeHByZXNzaW9uIHBvcEZvckVmZmVjdCgpID0+IHRvRWZmZWN0KHBvcCgpKTsKCiAgRXhwcmVzc2lvbiBwb3BGb3JWYWx1ZUlmTm90TnVsbChPYmplY3QgdmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IHBvcEZvclZhbHVlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHRvVmFsdWUoT2JqZWN0IG5vZGUpIHsKICAgIGlmIChub2RlIGlzIEdlbmVyYXRvcikgewogICAgICByZXR1cm4gbm9kZS5idWlsZFNpbXBsZVJlYWQoKTsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBFeHByZXNzaW9uKSB7CiAgICAgIHJldHVybiBub2RlOwogICAgfSBlbHNlIGlmIChub2RlIGlzIFN1cGVySW5pdGlhbGl6ZXIpIHsKICAgICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLm1lc3NhZ2VTdXBlckFzRXhwcmVzc2lvbiwgbm9kZS5maWxlT2Zmc2V0LCBub0xlbmd0aCk7CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgUHJvYmxlbUJ1aWxkZXIpIHsKICAgICAgcmV0dXJuIGJ1aWxkUHJvYmxlbShub2RlLm1lc3NhZ2UsIG5vZGUuY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHVuaGFuZGxlZCgiJHtub2RlLnJ1bnRpbWVUeXBlfSIsICJ0b1ZhbHVlIiwgLTEsIHVyaSk7CiAgICB9CiAgfQoKICBFeHByZXNzaW9uIHRvRWZmZWN0KE9iamVjdCBub2RlKSB7CiAgICBpZiAobm9kZSBpcyBHZW5lcmF0b3IpIHJldHVybiBub2RlLmJ1aWxkRm9yRWZmZWN0KCk7CiAgICByZXR1cm4gdG9WYWx1ZShub2RlKTsKICB9CgogIExpc3Q8RXhwcmVzc2lvbj4gcG9wTGlzdEZvclZhbHVlKGludCBuKSB7CiAgICBMaXN0PEV4cHJlc3Npb24+IGxpc3QgPQogICAgICAgIG5ldyBMaXN0PEV4cHJlc3Npb24+LmZpbGxlZChuLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gbiAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGxpc3RbaV0gPSBwb3BGb3JWYWx1ZSgpOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBMaXN0PEV4cHJlc3Npb24+IHBvcExpc3RGb3JFZmZlY3QoaW50IG4pIHsKICAgIExpc3Q8RXhwcmVzc2lvbj4gbGlzdCA9CiAgICAgICAgbmV3IExpc3Q8RXhwcmVzc2lvbj4uZmlsbGVkKG4sIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgIGZvciAoaW50IGkgPSBuIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgbGlzdFtpXSA9IHBvcEZvckVmZmVjdCgpOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBTdGF0ZW1lbnQgcG9wQmxvY2soaW50IGNvdW50LCBUb2tlbiBvcGVuQnJhY2UsIFRva2VuIGNsb3NlQnJhY2UpIHsKICAgIHJldHVybiBmb3Jlc3QuYmxvY2soCiAgICAgICAgb3BlbkJyYWNlLAogICAgICAgIGNvbnN0IEdyb3dhYmxlTGlzdDxTdGF0ZW1lbnQ+KCkucG9wKHN0YWNrLCBjb3VudCkgPz8gPFN0YXRlbWVudD5bXSwKICAgICAgICBjbG9zZUJyYWNlKTsKICB9CgogIFN0YXRlbWVudCBwb3BTdGF0ZW1lbnRJZk5vdE51bGwoT2JqZWN0IHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBwb3BTdGF0ZW1lbnQoKTsKICB9CgogIFN0YXRlbWVudCBwb3BTdGF0ZW1lbnQoKSA9PiBmb3Jlc3Qud3JhcFZhcmlhYmxlcyhwb3AoKSk7CgogIHZvaWQgZW50ZXJTd2l0Y2hTY29wZSgpIHsKICAgIHB1c2goc3dpdGNoU2NvcGUgPz8gTnVsbFZhbHVlLlN3aXRjaFNjb3BlKTsKICAgIHN3aXRjaFNjb3BlID0gc2NvcGU7CiAgfQoKICB2b2lkIGV4aXRTd2l0Y2hTY29wZSgpIHsKICAgIFNjb3BlIG91dGVyU3dpdGNoU2NvcGUgPSBwb3AoKTsKICAgIGlmIChzd2l0Y2hTY29wZS51bmNsYWltZWRGb3J3YXJkRGVjbGFyYXRpb25zICE9IG51bGwpIHsKICAgICAgc3dpdGNoU2NvcGUudW5jbGFpbWVkRm9yd2FyZERlY2xhcmF0aW9ucwogICAgICAgICAgLmZvckVhY2goKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewogICAgICAgIGlmIChvdXRlclN3aXRjaFNjb3BlID09IG51bGwpIHsKICAgICAgICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gZGVjbGFyYXRpb247CiAgICAgICAgICBmb3IgKFN0YXRlbWVudCBzdGF0ZW1lbnQgaW4gdGFyZ2V0LnVzZXJzKSB7CiAgICAgICAgICAgIHN0YXRlbWVudC5wYXJlbnQucmVwbGFjZUNoaWxkKAogICAgICAgICAgICAgICAgc3RhdGVtZW50LAogICAgICAgICAgICAgICAgd3JhcEluUHJvYmxlbVN0YXRlbWVudChzdGF0ZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVMYWJlbE5vdEZvdW5kLndpdGhBcmd1bWVudHMobmFtZSkpKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgb3V0ZXJTd2l0Y2hTY29wZS5mb3J3YXJkRGVjbGFyZUxhYmVsKG5hbWUsIGRlY2xhcmF0aW9uKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgc3dpdGNoU2NvcGUgPSBvdXRlclN3aXRjaFNjb3BlOwogIH0KCiAgdm9pZCB3cmFwVmFyaWFibGVJbml0aWFsaXplckluRXJyb3IoCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsCiAgICAgIFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZSwKICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCkgewogICAgU3RyaW5nIG5hbWUgPSB2YXJpYWJsZS5uYW1lOwogICAgaW50IG9mZnNldCA9IHZhcmlhYmxlLmZpbGVPZmZzZXQ7CiAgICBNZXNzYWdlIG1lc3NhZ2UgPSB0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKG5hbWUpOwogICAgaWYgKHZhcmlhYmxlLmluaXRpYWxpemVyID09IG51bGwpIHsKICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIgPQogICAgICAgICAgYnVpbGRQcm9ibGVtKG1lc3NhZ2UsIG9mZnNldCwgbmFtZS5sZW5ndGgsIGNvbnRleHQ6IGNvbnRleHQpCiAgICAgICAgICAgIC4ucGFyZW50ID0gdmFyaWFibGU7CiAgICB9IGVsc2UgewogICAgICB2YXJpYWJsZS5pbml0aWFsaXplciA9IHdyYXBJbkxvY2F0ZWRQcm9ibGVtKAogICAgICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIsIG1lc3NhZ2Uud2l0aExvY2F0aW9uKHVyaSwgb2Zmc2V0LCBuYW1lLmxlbmd0aCksCiAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KQogICAgICAgIC4ucGFyZW50ID0gdmFyaWFibGU7CiAgICB9CiAgfQoKICB2b2lkIGRlY2xhcmVWYXJpYWJsZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBTY29wZSBzY29wZSkgewogICAgU3RyaW5nIG5hbWUgPSB2YXJpYWJsZS5uYW1lOwogICAgRGVjbGFyYXRpb24gZXhpc3RpbmcgPSBzY29wZS5sb2NhbFtuYW1lXTsKICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgIC8vIFRoaXMgcmVwb3J0cyBhbiBlcnJvciBmb3IgZHVwbGljYXRlZCBkZWNsYXJhdGlvbnMgaW4gdGhlIHNhbWUgc2NvcGU6CiAgICAgIC8vIGB7IHZhciB4OyB2YXIgeDsgfWAKICAgICAgd3JhcFZhcmlhYmxlSW5pdGlhbGl6ZXJJbkVycm9yKAogICAgICAgICAgdmFyaWFibGUsIGZhc3RhLnRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uLCA8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgIGZhc3RhLnRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2UKICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGV4aXN0aW5nLmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoKQogICAgICBdKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgTG9jYXRlZE1lc3NhZ2UgY29udGV4dCA9IHNjb3BlLmRlY2xhcmUoCiAgICAgICAgdmFyaWFibGUubmFtZSwKICAgICAgICBuZXcgS2VybmVsVmFyaWFibGVCdWlsZGVyKAogICAgICAgICAgICB2YXJpYWJsZSwgbWVtYmVyID8/IGNsYXNzQnVpbGRlciA/PyBsaWJyYXJ5LCB1cmkpLAogICAgICAgIHVyaSk7CiAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CiAgICAgIC8vIFRoaXMgY2FzZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUgZXJyb3IuIEluIHRoaXMgY2FzZSwgdGhlIHByb2JsZW0KICAgICAgLy8gaXMgdXNpbmcgYHhgIGJlZm9yZSBpdCdzIGRlY2xhcmVkOiBgeyB2YXIgeDsgeyBwcmludCh4KTsgdmFyIHg7CiAgICAgIC8vIH19YC4gSW4gdGhpcyBjYXNlLCB3ZSB3YW50IHR3byBlcnJvcnMsIHRoZSBgeGAgaW4gYHByaW50KHgpYCBhbmQgdGhlCiAgICAgIC8vIHNlY29uZCAob3IgaW5uZXJtb3N0IGRlY2xhcmF0aW9uKSBvZiBgeGAuCiAgICAgIHdyYXBWYXJpYWJsZUluaXRpYWxpemVySW5FcnJvcigKICAgICAgICAgIHZhcmlhYmxlLAogICAgICAgICAgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkLAogICAgICAgICAgPExvY2F0ZWRNZXNzYWdlPltjb250ZXh0XSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBKdW1wVGFyZ2V0IGNyZWF0ZUp1bXBUYXJnZXQoSnVtcFRhcmdldEtpbmQga2luZCwgaW50IGNoYXJPZmZzZXQpIHsKICAgIHJldHVybiBuZXcgSnVtcFRhcmdldChraW5kLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCwgbWVtYmVyLCBjaGFyT2Zmc2V0KTsKICB9CgogIHZvaWQgaW5mZXJBbm5vdGF0aW9ucyhMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zKSB7CiAgICBpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogICAgICB0eXBlSW5mZXJyZXI/LmluZmVyTWV0YWRhdGEodGhpcywgYW5ub3RhdGlvbnMpOwogICAgICBsaWJyYXJ5LmxvYWRlci50cmFuc2Zvcm1MaXN0UG9zdEluZmVyZW5jZSgKICAgICAgICAgIGFubm90YXRpb25zLCB0cmFuc2Zvcm1TZXRMaXRlcmFscywgdHJhbnNmb3JtQ29sbGVjdGlvbnMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbk1ldGFkYXRhKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbk1ldGFkYXRhIik7CiAgICBzdXBlci5wdXNoKGNvbnN0YW50Q29udGV4dCk7CiAgICBjb25zdGFudENvbnRleHQgPSBDb25zdGFudENvbnRleHQuaW5mZXJyZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1ldGFkYXRhKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHBlcmlvZEJlZm9yZU5hbWUsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJNZXRhZGF0YSIpOwogICAgQXJndW1lbnRzIGFyZ3VtZW50cyA9IHBvcCgpOwogICAgcHVzaFF1YWxpZmllZFJlZmVyZW5jZShiZWdpblRva2VuLm5leHQsIHBlcmlvZEJlZm9yZU5hbWUpOwogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIHB1c2goYXJndW1lbnRzKTsKICAgICAgYnVpbGRDb25zdHJ1Y3RvclJlZmVyZW5jZUludm9jYXRpb24oCiAgICAgICAgICBiZWdpblRva2VuLm5leHQsIGJlZ2luVG9rZW4ub2Zmc2V0LCBDb25zdG5lc3MuZXhwbGljaXRDb25zdCk7CiAgICAgIHB1c2gocG9wRm9yVmFsdWUoKSk7CiAgICB9IGVsc2UgewogICAgICBwb3AoKTsgLy8gTmFtZSBsYXN0IGlkZW50aWZpZXIKICAgICAgU3RyaW5nIG5hbWUgPSBwb3AoKTsKICAgICAgcG9wKCk7IC8vIFR5cGUgYXJndW1lbnRzIChpZ25vcmVkLCBhbHJlYWR5IHJlcG9ydGVkIGJ5IHBhcnNlcikuCiAgICAgIE9iamVjdCBleHByZXNzaW9uID0gcG9wKCk7CiAgICAgIGlmIChleHByZXNzaW9uIGlzIElkZW50aWZpZXIpIHsKICAgICAgICBJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBleHByZXNzaW9uOwogICAgICAgIGV4cHJlc3Npb24gPSBuZXcgVW5yZXNvbHZlZE5hbWVHZW5lcmF0b3IoCiAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgIGRlcHJlY2F0ZWRfZXh0cmFjdFRva2VuKGlkZW50aWZpZXIpLAogICAgICAgICAgICBuZXcgTmFtZShpZGVudGlmaWVyLm5hbWUsIGxpYnJhcnkubmFtZU9yaWdpbikpOwogICAgICB9CiAgICAgIGlmIChuYW1lPy5pc05vdEVtcHR5ID8/IGZhbHNlKSB7CiAgICAgICAgVG9rZW4gcGVyaW9kID0gcGVyaW9kQmVmb3JlTmFtZSA/PyBiZWdpblRva2VuLm5leHQubmV4dDsKICAgICAgICBHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZXhwcmVzc2lvbjsKICAgICAgICBleHByZXNzaW9uID0gZ2VuZXJhdG9yLmJ1aWxkUHJvcGVydHlBY2Nlc3MoCiAgICAgICAgICAgIG5ldyBJbmNvbXBsZXRlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgICAgICAgICB0aGlzLCBwZXJpb2QubmV4dCwgbmV3IE5hbWUobmFtZSwgbGlicmFyeS5uYW1lT3JpZ2luKSksCiAgICAgICAgICAgIHBlcmlvZC5uZXh0Lm9mZnNldCwKICAgICAgICAgICAgZmFsc2UpOwogICAgICB9CgogICAgICBDb25zdGFudENvbnRleHQgc2F2ZWRDb25zdGFudENvbnRleHQgPSBwb3AoKTsKICAgICAgaWYgKGV4cHJlc3Npb24gaXMhIFN0YXRpY0FjY2Vzc0dlbmVyYXRvciAmJgogICAgICAgICAgZXhwcmVzc2lvbiBpcyEgVmFyaWFibGVVc2VHZW5lcmF0b3IpIHsKICAgICAgICBwdXNoKHdyYXBJblByb2JsZW0oCiAgICAgICAgICAgIHRvVmFsdWUoZXhwcmVzc2lvbiksIGZhc3RhLm1lc3NhZ2VFeHByZXNzaW9uTm90TWV0YWRhdGEsIG5vTGVuZ3RoKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaCh0b1ZhbHVlKGV4cHJlc3Npb24pKTsKICAgICAgfQogICAgICBjb25zdGFudENvbnRleHQgPSBzYXZlZENvbnN0YW50Q29udGV4dDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWV0YWRhdGFTdGFyKGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiTWV0YWRhdGFTdGFyIik7CiAgICBpZiAoY291bnQgPT0gMCkgewogICAgICBwdXNoKE51bGxWYWx1ZS5NZXRhZGF0YSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKGNvbnN0IEdyb3dhYmxlTGlzdDxFeHByZXNzaW9uPigpLnBvcChzdGFjaywgY291bnQpID8/CiAgICAgICAgICBOdWxsVmFsdWUuTWV0YWRhdGEgLyogSWdub3JlIHBhcnNlciByZWNvdmVyeSAqLyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFRvcExldmVsRmllbGRzKAogICAgICBUb2tlbiBzdGF0aWNUb2tlbiwKICAgICAgVG9rZW4gY292YXJpYW50VG9rZW4sCiAgICAgIFRva2VuIGxhdGVUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LAogICAgICBpbnQgY291bnQsCiAgICAgIFRva2VuIGJlZ2luVG9rZW4sCiAgICAgIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJUb3BMZXZlbEZpZWxkcyIpOwogICAgLy8gVE9ETyhkYW5ydWJlbCk6IGhhbmRsZSBOTkJEICdsYXRlJyBtb2RpZmllcgogICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlTm9uTnVsbGFibGUpIHsKICAgICAgcmVwb3J0Tm9uTnVsbGFibGVNb2RpZmllckVycm9yKGxhdGVUb2tlbik7CiAgICB9CiAgICBwdXNoKGNvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRmllbGRzKFRva2VuIHN0YXRpY1Rva2VuLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwgVG9rZW4gbGF0ZVRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZpZWxkcyIpOwogICAgLy8gVE9ETyhkYW5ydWJlbCk6IGhhbmRsZSBOTkJEICdsYXRlJyBtb2RpZmllcgogICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlTm9uTnVsbGFibGUpIHsKICAgICAgcmVwb3J0Tm9uTnVsbGFibGVNb2RpZmllckVycm9yKGxhdGVUb2tlbik7CiAgICB9CiAgICBwdXNoKGNvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZmluaXNoRmllbGRzKCkgewogICAgZGVidWdFdmVudCgiZmluaXNoRmllbGRzIik7CiAgICBpbnQgY291bnQgPSBwb3AoKTsKICAgIExpc3Q8S2VybmVsRmllbGRCdWlsZGVyPiBmaWVsZHMgPSA8S2VybmVsRmllbGRCdWlsZGVyPltdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIgPSBwb3AoKTsKICAgICAgSWRlbnRpZmllciBpZGVudGlmaWVyID0gcG9wKCk7CiAgICAgIFN0cmluZyBuYW1lID0gaWRlbnRpZmllci5uYW1lOwogICAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKICAgICAgaWYgKGNsYXNzQnVpbGRlciAhPSBudWxsKSB7CiAgICAgICAgZGVjbGFyYXRpb24gPSBjbGFzc0J1aWxkZXIuZ2V0TG9jYWxNZW1iZXIobmFtZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVjbGFyYXRpb24gPSBsaWJyYXJ5LmdldExvY2FsTWVtYmVyKG5hbWUpOwogICAgICB9CiAgICAgIEtlcm5lbEZpZWxkQnVpbGRlciBmaWVsZDsKICAgICAgaWYgKGRlY2xhcmF0aW9uLmlzRmllbGQgJiYgZGVjbGFyYXRpb24ubmV4dCA9PSBudWxsKSB7CiAgICAgICAgZmllbGQgPSBkZWNsYXJhdGlvbjsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmaWVsZHMuYWRkKGZpZWxkKTsKICAgICAgaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICBpZiAoZmllbGQubmV4dCAhPSBudWxsKSB7CiAgICAgICAgICAvLyBEdXBsaWNhdGUgZGVmaW5pdGlvbi4gVGhlIGZpZWxkIG1pZ2h0IG5vdCBiZSB0aGUgY29ycmVjdCBvbmUsCiAgICAgICAgICAvLyBzbyB3ZSBza2lwIGluZmVyZW5jZSBvZiB0aGUgaW5pdGlhbGl6ZXIuCiAgICAgICAgICAvLyBFcnJvciByZXBvcnRpbmcgYW5kIHJlY292ZXJ5IGlzIGhhbmRsZWQgZWxzZXdoZXJlLgogICAgICAgIH0gZWxzZSBpZiAoZmllbGQudGFyZ2V0LmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICAgIC8vIFRoZSBpbml0aWFsaXplciB3YXMgYWxyZWFkeSBjb21waWxlZCAoZS5nLiwgaWYgaXQgYXBwZWFyIGluIHRoZQogICAgICAgICAgLy8gb3V0bGluZSwgbGlrZSBjb25zdGFudCBmaWVsZCBpbml0aWFsaXplcnMpIHNvIHdlIGRvIG5vdCBuZWVkIHRvCiAgICAgICAgICAvLyBwZXJmb3JtIHR5cGUgaW5mZXJlbmNlIG9yIHRyYW5zZm9ybWF0aW9ucy4KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZmllbGQuaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcjsKICAgICAgICAgIHR5cGVJbmZlcnJlcj8uaW5mZXJGaWVsZEluaXRpYWxpemVyKAogICAgICAgICAgICAgIHRoaXMsIGZpZWxkLmJ1aWx0VHlwZSwgaW5pdGlhbGl6ZXIpOwogICAgICAgICAgbGlicmFyeS5sb2FkZXIudHJhbnNmb3JtUG9zdEluZmVyZW5jZSgKICAgICAgICAgICAgICBmaWVsZC50YXJnZXQsIHRyYW5zZm9ybVNldExpdGVyYWxzLCB0cmFuc2Zvcm1Db2xsZWN0aW9ucyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB7CiAgICAgIC8vIFRPRE8oYWhlKTogVGhlIHR5cGUgd2UgY29tcHV0ZSBoZXJlIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB3aGF0IGlzCiAgICAgIC8vIGNvbXB1dGVkIGluIHRoZSBvdXRsaW5lIHBoYXNlLiBXZSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgdGhlIG91dGxpbmUKICAgICAgLy8gcGhhc2UgY29tcHV0ZXMgdGhlIHNhbWUgdHlwZS4gU2VlCiAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL3JlZ3Jlc3MvaXNzdWVfMzIyMDAuZGFydCBmb3IgYW4gZXhhbXBsZSB3aGVyZQogICAgICAvLyBub3QgY2FsbGluZyBbYnVpbGREYXJ0VHlwZV0gbGVhZHMgdG8gYSBtaXNzaW5nIGNvbXBpbGUtdGltZQogICAgICAvLyBlcnJvci4gQWxzbywgbm90aWNlIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHByb2JsZW1hdGljIGZpZWxkIGlzbid0CiAgICAgIC8vIGBpbnZhbGlkLXR5cGVgLgogICAgICBidWlsZERhcnRUeXBlKHBvcCgpKTsgLy8gVHlwZS4KICAgIH0KICAgIHBvcCgpOyAvLyBBbm5vdGF0aW9ucy4KCiAgICByZXNvbHZlUmVkaXJlY3RpbmdGYWN0b3J5VGFyZ2V0cygpOwogICAgZmluaXNoVmFyaWFibGVNZXRhZGF0YSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNZW1iZXIoKSB7CiAgICBkZWJ1Z0V2ZW50KCJNZW1iZXIiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQmxvY2tGdW5jdGlvbkJvZHkoaW50IGNvdW50LCBUb2tlbiBvcGVuQnJhY2UsIFRva2VuIGNsb3NlQnJhY2UpIHsKICAgIGRlYnVnRXZlbnQoIkJsb2NrRnVuY3Rpb25Cb2R5Iik7CiAgICBpZiAob3BlbkJyYWNlID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGNvdW50ID09IDApOwogICAgICBwdXNoKE51bGxWYWx1ZS5CbG9jayk7CiAgICB9IGVsc2UgewogICAgICBTdGF0ZW1lbnQgYmxvY2sgPSBwb3BCbG9jayhjb3VudCwgb3BlbkJyYWNlLCBjbG9zZUJyYWNlKTsKICAgICAgZXhpdExvY2FsU2NvcGUoKTsKICAgICAgcHVzaChibG9jayk7CiAgICB9CiAgfQoKICB2b2lkIHByZXBhcmVJbml0aWFsaXplcnMoKSB7CiAgICBGdW5jdGlvbkJ1aWxkZXIgbWVtYmVyID0gdGhpcy5tZW1iZXI7CiAgICBzY29wZSA9IG1lbWJlci5jb21wdXRlRm9ybWFsUGFyYW1ldGVySW5pdGlhbGl6ZXJTY29wZShzY29wZSk7CiAgICBpZiAobWVtYmVyIGlzIENvbnN0cnVjdG9yQnVpbGRlcikgewogICAgICBtZW1iZXIucHJlcGFyZUluaXRpYWxpemVycygpOwogICAgICBpZiAobWVtYmVyLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gbWVtYmVyLmZvcm1hbHMpIHsKICAgICAgICAgIGlmIChmb3JtYWwuaXNJbml0aWFsaXppbmdGb3JtYWwpIHsKICAgICAgICAgICAgSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXI7CiAgICAgICAgICAgIGlmIChtZW1iZXIuaXNFeHRlcm5hbCkgewogICAgICAgICAgICAgIGluaXRpYWxpemVyID0gYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgICAgICAgICAgICAgIGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEZpZWxkSW5pdGlhbGl6ZXJzLAogICAgICAgICAgICAgICAgICAgICAgZm9ybWFsLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICBmb3JtYWwubmFtZS5sZW5ndGgpKSwKICAgICAgICAgICAgICAgICAgZm9ybWFsLmNoYXJPZmZzZXQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGluaXRpYWxpemVyID0gYnVpbGRGaWVsZEluaXRpYWxpemVyKAogICAgICAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgICBmb3JtYWwubmFtZSwKICAgICAgICAgICAgICAgICAgZm9ybWFsLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGZvcm1hbC5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQoZm9ybWFsLmRlY2xhcmF0aW9uKSwKICAgICAgICAgICAgICAgICAgZm9ybWFsVHlwZTogZm9ybWFsLmRlY2xhcmF0aW9uLnR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1lbWJlci5hZGRJbml0aWFsaXplcihpbml0aWFsaXplciwgdGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vSW5pdGlhbGl6ZXJzKCkgewogICAgZGVidWdFdmVudCgiTm9Jbml0aWFsaXplcnMiKTsKICAgIGlmIChmdW5jdGlvbk5lc3RpbmdMZXZlbCA9PSAwKSB7CiAgICAgIHByZXBhcmVJbml0aWFsaXplcnMoKTsKICAgICAgc2NvcGUgPSBmb3JtYWxQYXJhbWV0ZXJTY29wZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Jbml0aWFsaXplcnMoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luSW5pdGlhbGl6ZXJzIik7CiAgICBpZiAoZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPT0gMCkgewogICAgICBwcmVwYXJlSW5pdGlhbGl6ZXJzKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEluaXRpYWxpemVycyhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbml0aWFsaXplcnMiKTsKICAgIGlmIChmdW5jdGlvbk5lc3RpbmdMZXZlbCA9PSAwKSB7CiAgICAgIHNjb3BlID0gZm9ybWFsUGFyYW1ldGVyU2NvcGU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luSW5pdGlhbGl6ZXIiKTsKICAgIGluSW5pdGlhbGl6ZXIgPSB0cnVlOwogICAgaW5GaWVsZEluaXRpYWxpemVyID0gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZEluaXRpYWxpemVyIik7CiAgICBpbkZpZWxkSW5pdGlhbGl6ZXIgPSBmYWxzZTsKICAgIGFzc2VydCghaW5Jbml0aWFsaXplcik7CiAgICBmaW5hbCBtZW1iZXIgPSB0aGlzLm1lbWJlcjsKICAgIE9iamVjdCBub2RlID0gcG9wKCk7CiAgICBJbml0aWFsaXplciBpbml0aWFsaXplcjsKICAgIGlmIChub2RlIGlzIEluaXRpYWxpemVyKSB7CiAgICAgIGluaXRpYWxpemVyID0gbm9kZTsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBHZW5lcmF0b3IpIHsKICAgICAgaW5pdGlhbGl6ZXIgPSBub2RlLmJ1aWxkRmllbGRJbml0aWFsaXplcihpbml0aWFsaXplZEZpZWxkcyk7CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgQ29uc3RydWN0b3JJbnZvY2F0aW9uKSB7CiAgICAgIGluaXRpYWxpemVyID0gYnVpbGRTdXBlckluaXRpYWxpemVyKAogICAgICAgICAgZmFsc2UsIG5vZGUudGFyZ2V0LCBub2RlLmFyZ3VtZW50cywgdG9rZW4uY2hhck9mZnNldCk7CiAgICB9IGVsc2UgewogICAgICBFeHByZXNzaW9uIHZhbHVlID0gdG9WYWx1ZShub2RlKTsKICAgICAgaWYgKCFmb3Jlc3QuaXNUaHJvdyhub2RlKSkgewogICAgICAgIHZhbHVlID0KICAgICAgICAgICAgd3JhcEluUHJvYmxlbSh2YWx1ZSwgZmFzdGEubWVzc2FnZUV4cGVjdGVkQW5Jbml0aWFsaXplciwgbm9MZW5ndGgpOwogICAgICB9CiAgICAgIGluaXRpYWxpemVyID0gYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIobm9kZSwgdG9rZW4uY2hhck9mZnNldCk7CiAgICB9CiAgICB0eXBlSW5mZXJyZXI/LmluZmVySW5pdGlhbGl6ZXIodGhpcywgaW5pdGlhbGl6ZXIpOwogICAgaWYgKG1lbWJlciBpcyBDb25zdHJ1Y3RvckJ1aWxkZXIgJiYgIW1lbWJlci5pc0V4dGVybmFsKSB7CiAgICAgIG1lbWJlci5hZGRJbml0aWFsaXplcihpbml0aWFsaXplciwgdGhpcyk7CiAgICB9IGVsc2UgewogICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgZmFzdGEudGVtcGxhdGVJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvcgogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG1lbWJlci5uYW1lKSwKICAgICAgICAgIHRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICBtZW1iZXIubmFtZS5sZW5ndGgpOwogICAgfQogIH0KCiAgRGFydFR5cGUgX2NvbXB1dGVSZXR1cm5UeXBlQ29udGV4dChNZW1iZXJCdWlsZGVyIG1lbWJlcikgewogICAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmVCdWlsZGVyKSB7CiAgICAgIHJldHVybiBtZW1iZXIucHJvY2VkdXJlLmZ1bmN0aW9uLnJldHVyblR5cGU7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQobWVtYmVyIGlzIENvbnN0cnVjdG9yQnVpbGRlcik7CiAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmaW5pc2hGdW5jdGlvbigKICAgICAgRm9ybWFsUGFyYW1ldGVycyBmb3JtYWxzLCBBc3luY01hcmtlciBhc3luY01vZGlmaWVyLCBTdGF0ZW1lbnQgYm9keSkgewogICAgZGVidWdFdmVudCgiZmluaXNoRnVuY3Rpb24iKTsKICAgIHR5cGVQcm9tb3Rlcj8uZmluaXNoZWQoKTsKCiAgICBGdW5jdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG1lbWJlcjsKICAgIGlmIChmb3JtYWxzPy5wYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JtYWxzLnBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIHBhcmFtZXRlciA9IGZvcm1hbHMucGFyYW1ldGVyc1tpXTsKICAgICAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyID0gcGFyYW1ldGVyLnRhcmdldC5pbml0aWFsaXplcjsKICAgICAgICBpZiAocGFyYW1ldGVyLmlzT3B0aW9uYWwgfHwgaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZWFsUGFyYW1ldGVyID0gYnVpbGRlci5mb3JtYWxzW2ldLnRhcmdldDsKICAgICAgICAgIGlmIChwYXJhbWV0ZXIuaXNPcHRpb25hbCkgewogICAgICAgICAgICBpbml0aWFsaXplciA/Pz0gZm9yZXN0LmxpdGVyYWxOdWxsKAogICAgICAgICAgICAgICAgLy8gVE9ETyhhaGUpOiBTaG91bGQgc3RvcmU6IHJlYWxQYXJhbWV0ZXIuZmlsZU9mZnNldAogICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzMyMjg5CiAgICAgICAgICAgICAgICBudWxsKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlYWxQYXJhbWV0ZXIuaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplci4ucGFyZW50ID0gcmVhbFBhcmFtZXRlcjsKICAgICAgICAgIHR5cGVJbmZlcnJlcj8uaW5mZXJQYXJhbWV0ZXJJbml0aWFsaXplcigKICAgICAgICAgICAgICB0aGlzLCBpbml0aWFsaXplciwgcmVhbFBhcmFtZXRlci50eXBlKTsKICAgICAgICAgIGxpYnJhcnkubG9hZGVyLnRyYW5zZm9ybVBvc3RJbmZlcmVuY2UoCiAgICAgICAgICAgICAgcmVhbFBhcmFtZXRlciwgdHJhbnNmb3JtU2V0TGl0ZXJhbHMsIHRyYW5zZm9ybUNvbGxlY3Rpb25zKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB0eXBlSW5mZXJyZXI/LmluZmVyRnVuY3Rpb25Cb2R5KAogICAgICAgIHRoaXMsIF9jb21wdXRlUmV0dXJuVHlwZUNvbnRleHQobWVtYmVyKSwgYXN5bmNNb2RpZmllciwgYm9keSk7CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGxpYnJhcnkubG9hZGVyLnRyYW5zZm9ybVBvc3RJbmZlcmVuY2UoCiAgICAgICAgICBib2R5LCB0cmFuc2Zvcm1TZXRMaXRlcmFscywgdHJhbnNmb3JtQ29sbGVjdGlvbnMpOwogICAgfQoKICAgIC8vIEZvciBhc3luYywgYXN5bmMqLCBhbmQgc3luYyogZnVuY3Rpb25zIHdpdGggZGVjbGFyZWQgcmV0dXJuIHR5cGVzLCB3ZQogICAgLy8gbmVlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aG9zZSB0eXBlcyBhcmUgdmFsaWQuCiAgICAvLyBUT0RPKGhpbGxlcnN0cm9tKTogY3VycmVudGx5LCB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgW2xlZ2FjeU1vZGVdIGlzCiAgICAvLyBlbmFibGVkIGZvciB0d28gcmVhc29uczoKICAgIC8vIDEpIHRoZSBbaXNTdWJ0eXBlT2ZdIHByZWRpY2F0ZSBwcm9kdWNlcyBmYWxzZS1uZWdhdGl2ZXMgd2hlbgogICAgLy8gW2xlZ2FjeU1vZGVdIGlzIGVuYWJsZWQuCiAgICAvLyAyKSB0aGUgbWVtYmVyIFt0eXBlRW52aXJvbm1lbnRdIG1pZ2h0IGJlIG51bGwgd2hlbiBbbGVnYWN5TW9kZV0gaXMKICAgIC8vIGVuYWJsZWQuCiAgICAvLyBUaGlzIHBhcnRpY3VsYXIgYmVoYXZpb3VyIGNhbiBiZSBvYnNlcnZlZCB3aGVuIHJ1bm5pbmcgdGhlIGZhc3RhIHBlcmYKICAgIC8vIGJlbmNobWFya3MuCiAgICBpZiAoIWxlZ2FjeU1vZGUgJiYgYnVpbGRlci5yZXR1cm5UeXBlICE9IG51bGwpIHsKICAgICAgRGFydFR5cGUgcmV0dXJuVHlwZSA9IGJ1aWxkZXIuZnVuY3Rpb24ucmV0dXJuVHlwZTsKICAgICAgLy8gV2UgdXNlIHRoZSBzYW1lIHRyaWNrIGluIGVhY2ggY2FzZSBiZWxvdy4gRm9yIGV4YW1wbGUgdG8gZGVjaWRlIHdoZXRoZXIKICAgICAgLy8gRnV0dXJlPFQ+IDw6IFtyZXR1cm5UeXBlXSBmb3IgZXZlcnkgVCwgd2UgcmVseSBvbiBGdXR1cmU8Qm90PiBhbmQKICAgICAgLy8gdHJhbnNpdGl2aXR5IG9mIHRoZSBzdWJ0eXBpbmcgcmVsYXRpb24gYmVjYXVzZSBGdXR1cmU8Qm90PiA8OiBGdXR1cmU8VD4KICAgICAgLy8gZm9yIGV2ZXJ5IFQuCgogICAgICAvLyBXZSB1c2UgW3Byb2JsZW0gPT0gbnVsbF0gdG8gc2lnbmFsIHN1Y2Nlc3MuCiAgICAgIE1lc3NhZ2UgcHJvYmxlbTsKICAgICAgc3dpdGNoIChhc3luY01vZGlmaWVyKSB7CiAgICAgICAgY2FzZSBBc3luY01hcmtlci5Bc3luYzoKICAgICAgICAgIERhcnRUeXBlIGZ1dHVyZUJvdHRvbVR5cGUgPSBsaWJyYXJ5LmxvYWRlci5mdXR1cmVPZkJvdHRvbTsKICAgICAgICAgIGlmICghdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKGZ1dHVyZUJvdHRvbVR5cGUsIHJldHVyblR5cGUpKSB7CiAgICAgICAgICAgIHByb2JsZW0gPSBmYXN0YS5tZXNzYWdlSWxsZWdhbEFzeW5jUmV0dXJuVHlwZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEFzeW5jTWFya2VyLkFzeW5jU3RhcjoKICAgICAgICAgIERhcnRUeXBlIHN0cmVhbUJvdHRvbVR5cGUgPSBsaWJyYXJ5LmxvYWRlci5zdHJlYW1PZkJvdHRvbTsKICAgICAgICAgIGlmIChyZXR1cm5UeXBlIGlzIFZvaWRUeXBlKSB7CiAgICAgICAgICAgIHByb2JsZW0gPSBmYXN0YS5tZXNzYWdlSWxsZWdhbEFzeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGU7CiAgICAgICAgICB9IGVsc2UgaWYgKCF0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoCiAgICAgICAgICAgICAgc3RyZWFtQm90dG9tVHlwZSwgcmV0dXJuVHlwZSkpIHsKICAgICAgICAgICAgcHJvYmxlbSA9IGZhc3RhLm1lc3NhZ2VJbGxlZ2FsQXN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQXN5bmNNYXJrZXIuU3luY1N0YXI6CiAgICAgICAgICBEYXJ0VHlwZSBpdGVyYWJsZUJvdHRvbVR5cGUgPSBsaWJyYXJ5LmxvYWRlci5pdGVyYWJsZU9mQm90dG9tOwogICAgICAgICAgaWYgKHJldHVyblR5cGUgaXMgVm9pZFR5cGUpIHsKICAgICAgICAgICAgcHJvYmxlbSA9IGZhc3RhLm1lc3NhZ2VJbGxlZ2FsU3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlOwogICAgICAgICAgfSBlbHNlIGlmICghdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKAogICAgICAgICAgICAgIGl0ZXJhYmxlQm90dG9tVHlwZSwgcmV0dXJuVHlwZSkpIHsKICAgICAgICAgICAgcHJvYmxlbSA9IGZhc3RhLm1lc3NhZ2VJbGxlZ2FsU3luY0dlbmVyYXRvclJldHVyblR5cGU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBBc3luY01hcmtlci5TeW5jOgogICAgICAgICAgYnJlYWs7IC8vIHNraXAKICAgICAgICBjYXNlIEFzeW5jTWFya2VyLlN5bmNZaWVsZGluZzoKICAgICAgICAgIHVuZXhwZWN0ZWQoImFzeW5jLCBhc3luYyosIHN5bmMsIG9yIHN5bmMqIiwgIiRhc3luY01vZGlmaWVyIiwKICAgICAgICAgICAgICBtZW1iZXIuY2hhck9mZnNldCwgdXJpKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CgogICAgICBpZiAocHJvYmxlbSAhPSBudWxsKSB7CiAgICAgICAgLy8gVE9ETyhoaWxsZXJzdHJvbSk6IG9uY2UgdHlwZXMgZ2V0IGFubm90YXRlZCB3aXRoIGxvY2F0aW9uCiAgICAgICAgLy8gaW5mb3JtYXRpb24sIHdlIGNhbiBpbXByb3ZlIHRoZSBxdWFsaXR5IG9mIHRoZSBlcnJvciBtZXNzYWdlIGJ5CiAgICAgICAgLy8gdXNpbmcgdGhlIG9mZnNldCBvZiBbcmV0dXJuVHlwZV0gKGFuZCB0aGUgbGVuZ3RoIG9mIGl0cyBuYW1lKS4KICAgICAgICBhZGRQcm9ibGVtKHByb2JsZW0sIG1lbWJlci5jaGFyT2Zmc2V0LCBtZW1iZXIubmFtZS5sZW5ndGgpOwogICAgICB9CiAgICB9CgogICAgaWYgKGJ1aWxkZXIua2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcikgewogICAgICBpZiAoZm9ybWFscz8ucGFyYW1ldGVycyA9PSBudWxsIHx8CiAgICAgICAgICBmb3JtYWxzLnBhcmFtZXRlcnMubGVuZ3RoICE9IDEgfHwKICAgICAgICAgIGZvcm1hbHMucGFyYW1ldGVycy5zaW5nbGUuaXNPcHRpb25hbCkgewogICAgICAgIGludCBjaGFyT2Zmc2V0ID0gZm9ybWFscz8uY2hhck9mZnNldCA/PwogICAgICAgICAgICBib2R5Py5maWxlT2Zmc2V0ID8/CiAgICAgICAgICAgIGJ1aWxkZXIudGFyZ2V0LmZpbGVPZmZzZXQ7CiAgICAgICAgaWYgKGJvZHkgPT0gbnVsbCkgewogICAgICAgICAgYm9keSA9IG5ldyBFbXB0eVN0YXRlbWVudCgpLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgICAgICB9CiAgICAgICAgaWYgKGJ1aWxkZXIuZm9ybWFscyAhPSBudWxsKSB7CiAgICAgICAgICAvLyBJbGxlZ2FsIHBhcmFtZXRlcnMgd2VyZSByZW1vdmVkIGJ5IHRoZSBmdW5jdGlvbiBidWlsZGVyLgogICAgICAgICAgLy8gQWRkIHRoZW0gYXMgbG9jYWwgdmFyaWFibGUgdG8gcHV0IHRoZW0gaW4gc2NvcGUgb2YgdGhlIGJvZHkuCiAgICAgICAgICBMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W107CiAgICAgICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgcGFyYW1ldGVyIGluIGJ1aWxkZXIuZm9ybWFscykgewogICAgICAgICAgICBzdGF0ZW1lbnRzLmFkZChwYXJhbWV0ZXIudGFyZ2V0KTsKICAgICAgICAgIH0KICAgICAgICAgIHN0YXRlbWVudHMuYWRkKGJvZHkpOwogICAgICAgICAgYm9keSA9IGZvcmVzdC5ibG9jayhudWxsLCBzdGF0ZW1lbnRzLCBudWxsKS4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICAgICAgfQogICAgICAgIGJvZHkgPSBmb3Jlc3QuYmxvY2soCiAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgIDxTdGF0ZW1lbnQ+WwogICAgICAgICAgICAgIGZvcmVzdC5leHByZXNzaW9uU3RhdGVtZW50KAogICAgICAgICAgICAgICAgICAvLyBUaGlzIGVycm9yIGlzIGFkZGVkIGFmdGVyIHR5cGUgaW5mZXJlbmNlIGlzIGRvbmUsIHNvIHdlCiAgICAgICAgICAgICAgICAgIC8vIGRvbid0IG5lZWQgdG8gd3JhcCBlcnJvcnMgaW4gU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50LgogICAgICAgICAgICAgICAgICBkZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihidWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgICAgICBmYXN0YS5tZXNzYWdlU2V0dGVyV2l0aFdyb25nTnVtYmVyT2ZGb3JtYWxzLAogICAgICAgICAgICAgICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgIG5vTGVuZ3RoKSksCiAgICAgICAgICAgICAgICAgIG51bGwpLAogICAgICAgICAgICAgIGJvZHksCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG51bGwpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogICAgICB9CiAgICB9CiAgICAvLyBOby1zdWNoLW1ldGhvZCBmb3J3YXJkZXJzIGdldCB0aGVpciBib2RpZXMgaW5qZWN0ZWQgZHVyaW5nIG91dGxpbmUKICAgIC8vIGJ1aWxkaW5nLCBzbyB3ZSBzaG91bGQgc2tpcCB0aGVtIGhlcmUuCiAgICBib29sIGlzTm9TdWNoTWV0aG9kRm9yd2FyZGVyID0gKGJ1aWxkZXIuZnVuY3Rpb24ucGFyZW50IGlzIFByb2NlZHVyZSAmJgogICAgICAgIChidWlsZGVyLmZ1bmN0aW9uLnBhcmVudCBhcyBQcm9jZWR1cmUpLmlzTm9TdWNoTWV0aG9kRm9yd2FyZGVyKTsKICAgIGlmICghYnVpbGRlci5pc0V4dGVybmFsICYmICFpc05vU3VjaE1ldGhvZEZvcndhcmRlcikgewogICAgICBidWlsZGVyLmJvZHkgPSBib2R5OwogICAgfSBlbHNlIHsKICAgICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICAgIGJ1aWxkZXIuYm9keSA9IG5ldyBCbG9jayg8U3RhdGVtZW50PlsKICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50SnVkZ21lbnQoZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgICAgICAgYnVpbGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VFeHRlcm5hbE1ldGhvZFdpdGhCb2R5LCBib2R5LmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgIG5vTGVuZ3RoKSkpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGJvZHkuZmlsZU9mZnNldCwKICAgICAgICAgIGJvZHksCiAgICAgICAgXSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGJvZHkuZmlsZU9mZnNldDsKICAgICAgfQogICAgfQogICAgaWYgKGJ1aWxkZXIgaXMgQ29uc3RydWN0b3JCdWlsZGVyKSB7CiAgICAgIGZpbmlzaENvbnN0cnVjdG9yKGJ1aWxkZXIsIGFzeW5jTW9kaWZpZXIpOwogICAgfSBlbHNlIGlmIChidWlsZGVyIGlzIFByb2NlZHVyZUJ1aWxkZXIpIHsKICAgICAgYnVpbGRlci5hc3luY01vZGlmaWVyID0gYXN5bmNNb2RpZmllcjsKICAgIH0gZWxzZSB7CiAgICAgIHVuaGFuZGxlZCgiJHtidWlsZGVyLnJ1bnRpbWVUeXBlfSIsICJmaW5pc2hGdW5jdGlvbiIsIGJ1aWxkZXIuY2hhck9mZnNldCwKICAgICAgICAgIGJ1aWxkZXIuZmlsZVVyaSk7CiAgICB9CgogICAgcmVzb2x2ZVJlZGlyZWN0aW5nRmFjdG9yeVRhcmdldHMoKTsKICAgIGZpbmlzaFZhcmlhYmxlTWV0YWRhdGEoKTsKICB9CgogIC8vLyBFbnN1cmUgdGhhdCB0aGUgY29udGFpbmluZyBsaWJyYXJ5IG9mIHRoZSBbbWVtYmVyXSBoYXMgYmVlbiBsb2FkZWQuCiAgLy8vCiAgLy8vIFRoaXMgaXMgZm9yIGluc3RhbmNlIGltcG9ydGFudCBmb3IgbGF6eSBkaWxsIGxpYnJhcnkgYnVpbGRlcnMgd2hlcmUgdGhpcwogIC8vLyBtZXRob2QgaGFzIHRvIGJlIGNhbGxlZCB0byBlbnN1cmUgdGhhdAogIC8vLyBhKSBUaGUgbGlicmFyeSBoYXMgYmVlbiBmdWxseSBsb2FkZWQgKGFuZCBmb3IgaW5zdGFuY2UgYW55IGludGVybmFsCiAgLy8vICAgIHRyYW5zZm9ybWF0aW9uIG5lZWRlZCBoYXMgYmVlbiBwZXJmb3JtZWQpOyBhbmQKICAvLy8gYikgVGhlIGxpYnJhcnkgaXMgY29ycmVjdGx5IG1hcmtlZCBhcyBiZWluZyB1c2VkIHRvIGFsbG93IGZvciBwcm9wZXIKICAvLy8gICAgJ2RlcGVuZGVuY3kgcHJ1bmluZycuCiAgdm9pZCBlbnN1cmVMb2FkZWQoTWVtYmVyIG1lbWJlcikgewogICAgaWYgKG1lbWJlciA9PSBudWxsKSByZXR1cm47CiAgICBMaWJyYXJ5IGVuc3VyZUxpYnJhcnlMb2FkZWQgPSBtZW1iZXIuZW5jbG9zaW5nTGlicmFyeTsKICAgIExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgPQogICAgICAgIGxpYnJhcnkubG9hZGVyLmJ1aWxkZXJzW2Vuc3VyZUxpYnJhcnlMb2FkZWQuaW1wb3J0VXJpXSA/PwogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuZGlsbFRhcmdldC5sb2FkZXIKICAgICAgICAgICAgICAgIC5idWlsZGVyc1tlbnN1cmVMaWJyYXJ5TG9hZGVkLmltcG9ydFVyaV07CiAgICBpZiAoYnVpbGRlciBpcyBEaWxsTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgYnVpbGRlci5lbnN1cmVMb2FkZWQoKTsKICAgIH0KICB9CgogIC8vLyBDaGVjayBpZiB0aGUgY29udGFpbmluZyBsaWJyYXJ5IG9mIHRoZSBbbWVtYmVyXSBoYXMgYmVlbiBsb2FkZWQuCiAgLy8vCiAgLy8vIFRoaXMgaXMgZGVzaWduZWQgZm9yIHVzZSB3aXRoIGFzc2VydHMuCiAgLy8vIFNlZSBbZW5zdXJlTG9hZGVkXSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB3aGF0ICdsb2FkZWQnIG1lYW5zIGFuZCB0aGUgaWRlYXMKICAvLy8gYmVoaW5kIHRoYXQuCiAgYm9vbCBpc0xvYWRlZChNZW1iZXIgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyID09IG51bGwpIHJldHVybiB0cnVlOwogICAgTGlicmFyeSBlbnN1cmVMaWJyYXJ5TG9hZGVkID0gbWVtYmVyLmVuY2xvc2luZ0xpYnJhcnk7CiAgICBMaWJyYXJ5QnVpbGRlciBidWlsZGVyID0KICAgICAgICBsaWJyYXJ5LmxvYWRlci5idWlsZGVyc1tlbnN1cmVMaWJyYXJ5TG9hZGVkLmltcG9ydFVyaV0gPz8KICAgICAgICAgICAgbGlicmFyeS5sb2FkZXIudGFyZ2V0LmRpbGxUYXJnZXQubG9hZGVyCiAgICAgICAgICAgICAgICAuYnVpbGRlcnNbZW5zdXJlTGlicmFyeUxvYWRlZC5pbXBvcnRVcmldOwogICAgaWYgKGJ1aWxkZXIgaXMgRGlsbExpYnJhcnlCdWlsZGVyKSB7CiAgICAgIHJldHVybiBidWlsZGVyLmlzQnVpbHRBbmRNYXJrZWQ7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgcmVzb2x2ZVJlZGlyZWN0aW5nRmFjdG9yeVRhcmdldHMoKSB7CiAgICBmb3IgKFN0YXRpY0ludm9jYXRpb24gaW52b2NhdGlvbiBpbiByZWRpcmVjdGluZ0ZhY3RvcnlJbnZvY2F0aW9ucykgewogICAgICAvLyBJZiB0aGUgaW52b2NhdGlvbiB3YXMgaW52YWxpZCwgaXQgb3IgaXRzIHBhcmVudCBoYXMgYWxyZWFkeSBiZWVuCiAgICAgIC8vIGRlc3VnYXJlZCBpbnRvIGFuIGV4Y2VwdGlvbiB0aHJvd2luZyBleHByZXNzaW9uLiAgVGhlcmUgaXMgbm90aGluZyB0bwogICAgICAvLyByZXNvbHZlIGFueW1vcmUuICBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGludm9jYXRpb24ncyBwYXJlbnQKICAgICAgLy8gd2FzIGludmFsaWQsIHR5cGUgaW5mZXJlbmNlIHdvbid0IHJlYWNoIHRoZSBpbnZvY2F0aW9uIG5vZGUgYW5kIHdvbid0CiAgICAgIC8vIHNldCBpdHMgaW5mZXJyZWRUeXBlIGZpZWxkLiAgSWYgdHlwZSBpbmZlcmVuY2UgaXMgZGlzYWJsZWQsIHJlYWNoIHRvCiAgICAgIC8vIHRoZSBvdXR0ZXJtb3N0IHBhcmVudCB0byBjaGVjayBpZiB0aGUgbm9kZSBpcyBhIGRlYWQgY29kZS4KICAgICAgaWYgKGludm9jYXRpb24ucGFyZW50ID09IG51bGwpIGNvbnRpbnVlOwogICAgICBpZiAodHlwZUluZmVycmVyICE9IG51bGwpIHsKICAgICAgICBpZiAoaW52b2NhdGlvbiBpcyBGYWN0b3J5Q29uc3RydWN0b3JJbnZvY2F0aW9uSnVkZ21lbnQgJiYKICAgICAgICAgICAgaW52b2NhdGlvbi5pbmZlcnJlZFR5cGUgPT0gbnVsbCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIFRyZWVOb2RlIHBhcmVudCA9IGludm9jYXRpb24ucGFyZW50OwogICAgICAgIHdoaWxlIChwYXJlbnQgaXMhIENvbXBvbmVudCAmJiBwYXJlbnQgIT0gbnVsbCkgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIGNvbnRpbnVlOwogICAgICB9CgogICAgICBQcm9jZWR1cmUgaW5pdGlhbFRhcmdldCA9IGludm9jYXRpb24udGFyZ2V0OwogICAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50Tm9kZTsKCiAgICAgIFJlZGlyZWN0aW9uVGFyZ2V0IHJlZGlyZWN0aW9uVGFyZ2V0ID0KICAgICAgICAgIGdldFJlZGlyZWN0aW9uVGFyZ2V0KGluaXRpYWxUYXJnZXQsIHRoaXMsIGxlZ2FjeU1vZGU6IGxlZ2FjeU1vZGUpOwogICAgICBNZW1iZXIgcmVzb2x2ZWRUYXJnZXQgPSByZWRpcmVjdGlvblRhcmdldD8udGFyZ2V0OwoKICAgICAgaWYgKHJlc29sdmVkVGFyZ2V0ID09IG51bGwpIHsKICAgICAgICBTdHJpbmcgbmFtZSA9IGNvbnN0cnVjdG9yTmFtZUZvckRpYWdub3N0aWNzKGluaXRpYWxUYXJnZXQubmFtZS5uYW1lLAogICAgICAgICAgICBjbGFzc05hbWU6IGluaXRpYWxUYXJnZXQuZW5jbG9zaW5nQ2xhc3MubmFtZSk7CiAgICAgICAgLy8gVE9ETyhkbWl0cnlhcyk6IFJlcG9ydCB0aGlzIGVycm9yIGVhcmxpZXIuCiAgICAgICAgcmVwbGFjZW1lbnROb2RlID0gZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oYnVpbGRQcm9ibGVtKAogICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUN5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycwogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICAgIGluaXRpYWxUYXJnZXQuZmlsZU9mZnNldCwKICAgICAgICAgICAgbmFtZS5sZW5ndGgpKTsKICAgICAgfSBlbHNlIGlmIChyZXNvbHZlZFRhcmdldCBpcyBDb25zdHJ1Y3RvciAmJgogICAgICAgICAgcmVzb2x2ZWRUYXJnZXQuZW5jbG9zaW5nQ2xhc3MuaXNBYnN0cmFjdCkgewogICAgICAgIHJlcGxhY2VtZW50Tm9kZSA9IGV2YWx1YXRlQXJndW1lbnRzQmVmb3JlKAogICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzKGludm9jYXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWwsIG51bGwsCiAgICAgICAgICAgICAgICB0eXBlczogaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXMsCiAgICAgICAgICAgICAgICBuYW1lZDogaW52b2NhdGlvbi5hcmd1bWVudHMubmFtZWQpLAogICAgICAgICAgICBidWlsZEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUFic3RyYWN0UmVkaXJlY3RlZENsYXNzSW5zdGFudGlhdGlvbgogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHJlc29sdmVkVGFyZ2V0LmVuY2xvc2luZ0NsYXNzLm5hbWUpLAogICAgICAgICAgICAgICAgcmVzb2x2ZWRUYXJnZXQuZW5jbG9zaW5nQ2xhc3MubmFtZSwKICAgICAgICAgICAgICAgIGluaXRpYWxUYXJnZXQuZmlsZU9mZnNldCkpOwogICAgICB9IGVsc2UgewogICAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkgcmVkaXJlY3RpbmdGYWN0b3J5Qm9keSA9CiAgICAgICAgICAgIGdldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkocmVzb2x2ZWRUYXJnZXQpOwogICAgICAgIGlmIChyZWRpcmVjdGluZ0ZhY3RvcnlCb2R5ICE9IG51bGwpIHsKICAgICAgICAgIC8vIElmIHRoZSByZWRpcmVjdGlvbiB0YXJnZXQgaXMgaXRzZWxmIGEgcmVkaXJlY3RpbmcgZmFjdG9yeSwgaXQgbWVhbnMKICAgICAgICAgIC8vIHRoYXQgaXQgaXMgdW5yZXNvbHZlZC4KICAgICAgICAgIGFzc2VydChyZWRpcmVjdGluZ0ZhY3RvcnlCb2R5LmlzVW5yZXNvbHZlZCk7CiAgICAgICAgICBTdHJpbmcgZXJyb3JOYW1lID0gcmVkaXJlY3RpbmdGYWN0b3J5Qm9keS51bnJlc29sdmVkTmFtZTsKCiAgICAgICAgICByZXBsYWNlbWVudE5vZGUgPSB0aHJvd05vU3VjaE1ldGhvZEVycm9yKAogICAgICAgICAgICAgIGZvcmVzdC5saXRlcmFsTnVsbChudWxsKS4uZmlsZU9mZnNldCA9IGludm9jYXRpb24uZmlsZU9mZnNldCwKICAgICAgICAgICAgICBlcnJvck5hbWUsCiAgICAgICAgICAgICAgZm9yZXN0LmFyZ3VtZW50cyhpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLCBudWxsLAogICAgICAgICAgICAgICAgICB0eXBlczogaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXMsCiAgICAgICAgICAgICAgICAgIG5hbWVkOiBpbnZvY2F0aW9uLmFyZ3VtZW50cy5uYW1lZCksCiAgICAgICAgICAgICAgaW5pdGlhbFRhcmdldC5maWxlT2Zmc2V0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgICAgaW5pdGlhbFRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgICBpbnZvY2F0aW9uLmFyZ3VtZW50cy50eXBlcyk7CiAgICAgICAgICBpbnZvY2F0aW9uLmFyZ3VtZW50cy50eXBlcy5jbGVhcigpOwogICAgICAgICAgaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXMubGVuZ3RoID0KICAgICAgICAgICAgICByZWRpcmVjdGlvblRhcmdldC50eXBlQXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXNbaV0gPQogICAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHJlZGlyZWN0aW9uVGFyZ2V0LnR5cGVBcmd1bWVudHNbaV0pOwogICAgICAgICAgfQoKICAgICAgICAgIHJlcGxhY2VtZW50Tm9kZSA9IGJ1aWxkU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgICByZXNvbHZlZFRhcmdldCwKICAgICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzKGludm9jYXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWwsIG51bGwsCiAgICAgICAgICAgICAgICAgIHR5cGVzOiBpbnZvY2F0aW9uLmFyZ3VtZW50cy50eXBlcywKICAgICAgICAgICAgICAgICAgbmFtZWQ6IGludm9jYXRpb24uYXJndW1lbnRzLm5hbWVkKSwKICAgICAgICAgICAgICBjb25zdG5lc3M6IGludm9jYXRpb24uaXNDb25zdAogICAgICAgICAgICAgICAgICA/IENvbnN0bmVzcy5leHBsaWNpdENvbnN0CiAgICAgICAgICAgICAgICAgIDogQ29uc3RuZXNzLmV4cGxpY2l0TmV3LAogICAgICAgICAgICAgIGNoYXJPZmZzZXQ6IGludm9jYXRpb24uZmlsZU9mZnNldCk7CiAgICAgICAgICAvLyBUT0RPKGRtaXRyeWFzKTogRmluZCBhIGJldHRlciB3YXkgdG8gdW53cmFwCiAgICAgICAgICAvLyBbU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50XSBvciBub3QgdG8gYnVpbGQgaXQgaW4gdGhlIGZpcnN0IHBsYWNlCiAgICAgICAgICAvLyB3aGVuIGl0J3Mgbm90IG5lZWRlZC4KICAgICAgICAgIGlmIChyZXBsYWNlbWVudE5vZGUgaXMgc2hhZG93LlN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudCkgewogICAgICAgICAgICByZXBsYWNlbWVudE5vZGUgPSBkZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihyZXBsYWNlbWVudE5vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaW52b2NhdGlvbi5yZXBsYWNlV2l0aChyZXBsYWNlbWVudE5vZGUpOwogICAgfQogICAgcmVkaXJlY3RpbmdGYWN0b3J5SW52b2NhdGlvbnMuY2xlYXIoKTsKICB9CgogIHZvaWQgZmluaXNoVmFyaWFibGVNZXRhZGF0YSgpIHsKICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzV2l0aE1ldGFkYXRhID0KICAgICAgICB0aGlzLnZhcmlhYmxlc1dpdGhNZXRhZGF0YTsKICAgIHRoaXMudmFyaWFibGVzV2l0aE1ldGFkYXRhID0gbnVsbDsKICAgIExpc3Q8TGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPj4gbXVsdGlWYXJpYWJsZXNXaXRoTWV0YWRhdGEgPQogICAgICAgIHRoaXMubXVsdGlWYXJpYWJsZXNXaXRoTWV0YWRhdGE7CiAgICB0aGlzLm11bHRpVmFyaWFibGVzV2l0aE1ldGFkYXRhID0gbnVsbDsKCiAgICBpZiAodmFyaWFibGVzV2l0aE1ldGFkYXRhICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJpYWJsZXNXaXRoTWV0YWRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICBpbmZlckFubm90YXRpb25zKHZhcmlhYmxlc1dpdGhNZXRhZGF0YVtpXS5hbm5vdGF0aW9ucyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChtdWx0aVZhcmlhYmxlc1dpdGhNZXRhZGF0YSAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXVsdGlWYXJpYWJsZXNXaXRoTWV0YWRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcyA9IG11bHRpVmFyaWFibGVzV2l0aE1ldGFkYXRhW2ldOwogICAgICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSB2YXJpYWJsZXMuZmlyc3QuYW5ub3RhdGlvbnM7CiAgICAgICAgaW5mZXJBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB2YXJpYWJsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNsb25lciA/Pz0gbmV3IENsb25lVmlzaXRvcigpOwogICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IHZhcmlhYmxlc1tpXTsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyaWFibGUuYWRkQW5ub3RhdGlvbihjbG9uZXIuY2xvbmUoYW5ub3RhdGlvbnNbaV0pKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIExpc3Q8RXhwcmVzc2lvbj4gZmluaXNoTWV0YWRhdGEoVHJlZU5vZGUgcGFyZW50KSB7CiAgICBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gcG9wKCk7CiAgICBpbmZlckFubm90YXRpb25zKGV4cHJlc3Npb25zKTsKCiAgICAvLyBUaGUgaW52b2NhdGlvbiBvZiBbcmVzb2x2ZVJlZGlyZWN0aW5nRmFjdG9yeVRhcmdldHNdIGJlbG93IG1heSBjaGFuZ2UgdGhlCiAgICAvLyByb290IG5vZGVzIG9mIHRoZSBhbm5vdGF0aW9uIGV4cHJlc3Npb25zLiAgV2UgbmVlZCB0byBoYXZlIGEgcGFyZW50IG9mCiAgICAvLyB0aGUgYW5ub3RhdGlvbiBub2RlcyBiZWZvcmUgdGhlIHJlc29sdXRpb24gaXMgcGVyZm9ybWVkLCB0byBjb2xsZWN0IGFuZAogICAgLy8gcmV0dXJuIHRoZW0gbGF0ZXIuICBJZiBbcGFyZW50XSBpcyBub3QgcHJvdmlkZWQsIFt0ZW1wb3JhcnlQYXJlbnRdIGlzCiAgICAvLyB1c2VkLgogICAgTGlzdExpdGVyYWwgdGVtcG9yYXJ5UGFyZW50OwoKICAgIGlmIChwYXJlbnQgaXMgQ2xhc3MpIHsKICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gZXhwcmVzc2lvbnMpIHsKICAgICAgICBwYXJlbnQuYWRkQW5ub3RhdGlvbihleHByZXNzaW9uKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgTGlicmFyeSkgewogICAgICBmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBleHByZXNzaW9ucykgewogICAgICAgIHBhcmVudC5hZGRBbm5vdGF0aW9uKGV4cHJlc3Npb24pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBhcmVudCBpcyBMaWJyYXJ5RGVwZW5kZW5jeSkgewogICAgICBmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBleHByZXNzaW9ucykgewogICAgICAgIHBhcmVudC5hZGRBbm5vdGF0aW9uKGV4cHJlc3Npb24pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBhcmVudCBpcyBMaWJyYXJ5UGFydCkgewogICAgICBmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBleHByZXNzaW9ucykgewogICAgICAgIHBhcmVudC5hZGRBbm5vdGF0aW9uKGV4cHJlc3Npb24pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBhcmVudCBpcyBNZW1iZXIpIHsKICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gZXhwcmVzc2lvbnMpIHsKICAgICAgICBwYXJlbnQuYWRkQW5ub3RhdGlvbihleHByZXNzaW9uKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgVHlwZWRlZikgewogICAgICBmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBleHByZXNzaW9ucykgewogICAgICAgIHBhcmVudC5hZGRBbm5vdGF0aW9uKGV4cHJlc3Npb24pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBhcmVudCBpcyBUeXBlUGFyYW1ldGVyKSB7CiAgICAgIGZvciAoRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGV4cHJlc3Npb25zKSB7CiAgICAgICAgcGFyZW50LmFkZEFubm90YXRpb24oZXhwcmVzc2lvbik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGFyZW50IGlzIFZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gZXhwcmVzc2lvbnMpIHsKICAgICAgICBwYXJlbnQuYWRkQW5ub3RhdGlvbihleHByZXNzaW9uKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGVtcG9yYXJ5UGFyZW50ID0gbmV3IExpc3RMaXRlcmFsKGV4cHJlc3Npb25zKTsKICAgIH0KICAgIHJlc29sdmVSZWRpcmVjdGluZ0ZhY3RvcnlUYXJnZXRzKCk7CiAgICBmaW5pc2hWYXJpYWJsZU1ldGFkYXRhKCk7CiAgICByZXR1cm4gdGVtcG9yYXJ5UGFyZW50ICE9IG51bGwgPyB0ZW1wb3JhcnlQYXJlbnQuZXhwcmVzc2lvbnMgOiBleHByZXNzaW9uczsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gcGFyc2VTaW5nbGVFeHByZXNzaW9uKAogICAgICBQYXJzZXIgcGFyc2VyLCBUb2tlbiB0b2tlbiwgRnVuY3Rpb25Ob2RlIHBhcmFtZXRlcnMpIHsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVBhcmFtZXRlckJ1aWxkZXJzOwogICAgZm9yIChUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgaW4gcGFyYW1ldGVycy50eXBlUGFyYW1ldGVycykgewogICAgICB0eXBlUGFyYW1ldGVyQnVpbGRlcnMgPz89IDxUeXBlVmFyaWFibGVCdWlsZGVyPltdOwogICAgICB0eXBlUGFyYW1ldGVyQnVpbGRlcnMKICAgICAgICAgIC5hZGQobmV3IFR5cGVWYXJpYWJsZUJ1aWxkZXIuZnJvbUtlcm5lbCh0eXBlUGFyYW1ldGVyLCBsaWJyYXJ5KSk7CiAgICB9CiAgICBlbnRlckZ1bmN0aW9uVHlwZVNjb3BlKHR5cGVQYXJhbWV0ZXJCdWlsZGVycyk7CgogICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzID0KICAgICAgICBwYXJhbWV0ZXJzLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA9PSAwCiAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICA6IG5ldyBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KAogICAgICAgICAgICAgICAgcGFyYW1ldGVycy5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZm9ybWFsID0gcGFyYW1ldGVycy5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgZm9ybWFsc1tpXSA9IG5ldyBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyKAogICAgICAgICAgbnVsbCwgMCwgbnVsbCwgZm9ybWFsLm5hbWUsIGxpYnJhcnksIGZvcm1hbC5maWxlT2Zmc2V0KQogICAgICAgIC4uZGVjbGFyYXRpb24gPSBmb3JtYWw7CiAgICB9CiAgICBlbnRlckxvY2FsU2NvcGUoCiAgICAgICAgbnVsbCwKICAgICAgICBuZXcgRm9ybWFsUGFyYW1ldGVycyhmb3JtYWxzLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksIG5vTGVuZ3RoLCB1cmkpCiAgICAgICAgICAgIC5jb21wdXRlRm9ybWFsUGFyYW1ldGVyU2NvcGUoc2NvcGUsIG1lbWJlciwgdGhpcykpOwoKICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbihwYXJzZXIuc3ludGhldGljUHJldmlvdXNUb2tlbih0b2tlbikpOwoKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBUb2tlbiBlb2YgPSB0b2tlbi5uZXh0OwoKICAgIGlmICghZW9mLmlzRW9mKSB7CiAgICAgIGV4cHJlc3Npb24gPSB3cmFwSW5Mb2NhdGVkUHJvYmxlbSgKICAgICAgICAgIGV4cHJlc3Npb24sCiAgICAgICAgICBmYXN0YS5tZXNzYWdlRXhwZWN0ZWRPbmVFeHByZXNzaW9uCiAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGVvZi5jaGFyT2Zmc2V0LCBlb2YubGVuZ3RoKSk7CiAgICB9CgogICAgUmV0dXJuSnVkZ21lbnQgZmFrZVJldHVybiA9IG5ldyBSZXR1cm5KdWRnbWVudChudWxsLCBleHByZXNzaW9uKTsKCiAgICB0eXBlSW5mZXJyZXI/LmluZmVyRnVuY3Rpb25Cb2R5KAogICAgICAgIHRoaXMsIGNvbnN0IER5bmFtaWNUeXBlKCksIEFzeW5jTWFya2VyLlN5bmMsIGZha2VSZXR1cm4pOwoKICAgIHJldHVybiBmYWtlUmV0dXJuLmV4cHJlc3Npb247CiAgfQoKICB2b2lkIHBhcnNlSW5pdGlhbGl6ZXJzKFRva2VuIHRva2VuKSB7CiAgICBQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcih0aGlzKTsKICAgIGlmICghdG9rZW4uaXNFb2YpIHsKICAgICAgdG9rZW4gPSBwYXJzZXIucGFyc2VJbml0aWFsaXplcnModG9rZW4pOwogICAgICBjaGVja0VtcHR5KHRva2VuLmNoYXJPZmZzZXQpOwogICAgfSBlbHNlIHsKICAgICAgaGFuZGxlTm9Jbml0aWFsaXplcnMoKTsKICAgIH0KICB9CgogIEV4cHJlc3Npb24gcGFyc2VGaWVsZEluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcih0aGlzKTsKICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbihwYXJzZXIuc3ludGhldGljUHJldmlvdXNUb2tlbih0b2tlbikpOwogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIGNoZWNrRW1wdHkodG9rZW4uY2hhck9mZnNldCk7CiAgICByZXR1cm4gZXhwcmVzc2lvbjsKICB9CgogIEV4cHJlc3Npb24gcGFyc2VBbm5vdGF0aW9uKFRva2VuIHRva2VuKSB7CiAgICBQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcih0aGlzKTsKICAgIHRva2VuID0gcGFyc2VyLnBhcnNlTWV0YWRhdGEocGFyc2VyLnN5bnRoZXRpY1ByZXZpb3VzVG9rZW4odG9rZW4pKTsKICAgIEV4cHJlc3Npb24gYW5ub3RhdGlvbiA9IHBvcCgpOwogICAgY2hlY2tFbXB0eSh0b2tlbi5jaGFyT2Zmc2V0KTsKICAgIHJldHVybiBhbm5vdGF0aW9uOwogIH0KCiAgdm9pZCBmaW5pc2hDb25zdHJ1Y3RvcigKICAgICAgQ29uc3RydWN0b3JCdWlsZGVyIGJ1aWxkZXIsIEFzeW5jTWFya2VyIGFzeW5jTW9kaWZpZXIpIHsKICAgIC8vLyBRdW90ZXMgYmVsb3cgYXJlIGZyb20gW0RhcnQgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgNHRoCiAgICAvLy8gRWRpdGlvbl0oCiAgICAvLy8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNUL0VDTUEtNDA4LnBkZikuCiAgICBhc3NlcnQoYnVpbGRlciA9PSBtZW1iZXIpOwogICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBidWlsZGVyLmNvbnN0cnVjdG9yOwogICAgaWYgKGFzeW5jTW9kaWZpZXIgIT0gQXN5bmNNYXJrZXIuU3luYykgewogICAgICAvLyBUT0RPKGFoZSk6IENoYW5nZSB0aGlzIHRvIGEgbnVsbCBjaGVjay4KICAgICAgaW50IG9mZnNldCA9IGJ1aWxkZXIuYm9keT8uZmlsZU9mZnNldCA/PyBidWlsZGVyLmNoYXJPZmZzZXQ7CiAgICAgIGNvbnN0cnVjdG9yLmluaXRpYWxpemVycy5hZGQoYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgICAgICBkZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICAgICAgICBidWlsZFByb2JsZW0oZmFzdGEubWVzc2FnZUNvbnN0cnVjdG9yTm90U3luYywgb2Zmc2V0LCBub0xlbmd0aCkpLAogICAgICAgICAgb2Zmc2V0KSk7CiAgICB9CiAgICBpZiAobmVlZHNJbXBsaWNpdFN1cGVySW5pdGlhbGl6ZXIpIHsKICAgICAgLy8vID5JZiBubyBzdXBlcmluaXRpYWxpemVyIGlzIHByb3ZpZGVkLCBhbiBpbXBsaWNpdCBzdXBlcmluaXRpYWxpemVyCiAgICAgIC8vLyA+b2YgdGhlIGZvcm0gc3VwZXIoKSBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mIGvigJlzIGluaXRpYWxpemVyIGxpc3QsCiAgICAgIC8vLyA+dW5sZXNzIHRoZSBlbmNsb3NpbmcgY2xhc3MgaXMgY2xhc3MgT2JqZWN0LgogICAgICBDb25zdHJ1Y3RvciBzdXBlclRhcmdldCA9IGxvb2t1cENvbnN0cnVjdG9yKGVtcHR5TmFtZSwgaXNTdXBlcjogdHJ1ZSk7CiAgICAgIEluaXRpYWxpemVyIGluaXRpYWxpemVyOwogICAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gZm9yZXN0LmFyZ3VtZW50c0VtcHR5KG5vTG9jYXRpb24pOwogICAgICBpZiAoc3VwZXJUYXJnZXQgPT0gbnVsbCB8fAogICAgICAgICAgY2hlY2tBcmd1bWVudHNGb3JGdW5jdGlvbihzdXBlclRhcmdldC5mdW5jdGlvbiwgYXJndW1lbnRzLAogICAgICAgICAgICAgICAgICBidWlsZGVyLmNoYXJPZmZzZXQsIGNvbnN0IDxUeXBlUGFyYW1ldGVyPltdKSAhPQogICAgICAgICAgICAgIG51bGwpIHsKICAgICAgICBTdHJpbmcgc3VwZXJjbGFzcyA9IGNsYXNzQnVpbGRlci5zdXBlcnR5cGUuZnVsbE5hbWVGb3JFcnJvcnM7CiAgICAgICAgaW50IGxlbmd0aCA9IGNvbnN0cnVjdG9yLm5hbWUubmFtZS5sZW5ndGg7CiAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CiAgICAgICAgICBsZW5ndGggPSAoY29uc3RydWN0b3IucGFyZW50IGFzIENsYXNzKS5uYW1lLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgaW5pdGlhbGl6ZXIgPSBidWlsZEludmFsaWRJbml0aWFsaXplcigKICAgICAgICAgICAgZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3IKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhzdXBlcmNsYXNzKSwKICAgICAgICAgICAgICAgIGJ1aWxkZXIuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIGxlbmd0aCkpLAogICAgICAgICAgICBidWlsZGVyLmNoYXJPZmZzZXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGluaXRpYWxpemVyID0gYnVpbGRTdXBlckluaXRpYWxpemVyKAogICAgICAgICAgICB0cnVlLCBzdXBlclRhcmdldCwgYXJndW1lbnRzLCBidWlsZGVyLmNoYXJPZmZzZXQpOwogICAgICB9CiAgICAgIGNvbnN0cnVjdG9yLmluaXRpYWxpemVycy5hZGQoaW5pdGlhbGl6ZXIpOwogICAgfQogICAgc2V0UGFyZW50cyhjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMsIGNvbnN0cnVjdG9yKTsKICAgIGxpYnJhcnkubG9hZGVyLnRyYW5zZm9ybUxpc3RQb3N0SW5mZXJlbmNlKAogICAgICAgIGNvbnN0cnVjdG9yLmluaXRpYWxpemVycywgdHJhbnNmb3JtU2V0TGl0ZXJhbHMsIHRyYW5zZm9ybUNvbGxlY3Rpb25zKTsKICAgIGlmIChjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5ID09IG51bGwpIHsKICAgICAgLy8vID5JZiBhIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgYyBpcyBub3QgYSByZWRpcmVjdGluZyBjb25zdHJ1Y3RvcgogICAgICAvLy8gPmFuZCBubyBib2R5IGlzIHByb3ZpZGVkLCB0aGVuIGMgaW1wbGljaXRseSBoYXMgYW4gZW1wdHkgYm9keSB7fS4KICAgICAgLy8vIFdlIHVzZSBhbiBlbXB0eSBzdGF0ZW1lbnQgaW5zdGVhZC4KICAgICAgY29uc3RydWN0b3IuZnVuY3Rpb24uYm9keSA9IG5ldyBFbXB0eVN0YXRlbWVudCgpOwogICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5LnBhcmVudCA9IGNvbnN0cnVjdG9yLmZ1bmN0aW9uOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVFeHByZXNzaW9uU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJFeHByZXNzaW9uU3RhdGVtZW50Iik7CiAgICBwdXNoKGZvcmVzdC5leHByZXNzaW9uU3RhdGVtZW50KHBvcEZvckVmZmVjdCgpLCB0b2tlbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiQXJndW1lbnRzIik7CiAgICBMaXN0PE9iamVjdD4gYXJndW1lbnRzID0gY291bnQgPT0gMAogICAgICAgID8gPE9iamVjdD5bXQogICAgICAgIDogY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8T2JqZWN0PigpLnBvcChzdGFjaywgY291bnQpOwogICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIHB1c2gobmV3IFBhcnNlclJlY292ZXJ5KGJlZ2luVG9rZW4uY2hhck9mZnNldCkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgZmlyc3ROYW1lZEFyZ3VtZW50SW5kZXggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgT2JqZWN0IG5vZGUgPSBhcmd1bWVudHNbaV07CiAgICAgIGlmIChub2RlIGlzIE5hbWVkRXhwcmVzc2lvbikgewogICAgICAgIGZpcnN0TmFtZWRBcmd1bWVudEluZGV4ID0KICAgICAgICAgICAgaSA8IGZpcnN0TmFtZWRBcmd1bWVudEluZGV4ID8gaSA6IGZpcnN0TmFtZWRBcmd1bWVudEluZGV4OwogICAgICB9IGVsc2UgewogICAgICAgIEV4cHJlc3Npb24gYXJndW1lbnQgPSB0b1ZhbHVlKG5vZGUpOwogICAgICAgIGFyZ3VtZW50c1tpXSA9IGFyZ3VtZW50OwogICAgICAgIGlmIChpID4gZmlyc3ROYW1lZEFyZ3VtZW50SW5kZXgpIHsKICAgICAgICAgIGFyZ3VtZW50c1tpXSA9IG5ldyBOYW1lZEV4cHJlc3Npb24oCiAgICAgICAgICAgICAgIiMkaSIsCiAgICAgICAgICAgICAgYnVpbGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VFeHBlY3RlZE5hbWVkQXJndW1lbnQsCiAgICAgICAgICAgICAgICAgIGZvcmVzdC5yZWFkT2Zmc2V0KGFyZ3VtZW50KSwgbm9MZW5ndGgpKQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBiZWdpblRva2VuLmNoYXJPZmZzZXQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoZmlyc3ROYW1lZEFyZ3VtZW50SW5kZXggPCBhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gcG9zaXRpb25hbCA9IG5ldyBMaXN0PEV4cHJlc3Npb24+LmZyb20oCiAgICAgICAgICBhcmd1bWVudHMuZ2V0UmFuZ2UoMCwgZmlyc3ROYW1lZEFyZ3VtZW50SW5kZXgpKTsKICAgICAgTGlzdDxOYW1lZEV4cHJlc3Npb24+IG5hbWVkID0gbmV3IExpc3Q8TmFtZWRFeHByZXNzaW9uPi5mcm9tKAogICAgICAgICAgYXJndW1lbnRzLmdldFJhbmdlKGZpcnN0TmFtZWRBcmd1bWVudEluZGV4LCBhcmd1bWVudHMubGVuZ3RoKSk7CiAgICAgIHB1c2goZm9yZXN0LmFyZ3VtZW50cyhwb3NpdGlvbmFsLCBiZWdpblRva2VuLCBuYW1lZDogbmFtZWQpKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRPRE8oa21pbGxpa2luKTogRmluZCBhIHdheSB0byBhdm9pZCBhbGxvY2F0aW5nIGEgc2Vjb25kIGxpc3QgaW4gdGhlCiAgICAgIC8vIGNhc2Ugd2hlcmUgdGhlcmUgd2VyZSBubyBuYW1lZCBhcmd1bWVudHMsIHdoaWNoIGlzIGEgY29tbW9uIG9uZS4KICAgICAgcHVzaChmb3Jlc3QuYXJndW1lbnRzKG5ldyBMaXN0PEV4cHJlc3Npb24+LmZyb20oYXJndW1lbnRzKSwgYmVnaW5Ub2tlbikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVQYXJlbnRoZXNpemVkQ29uZGl0aW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJQYXJlbnRoZXNpemVkQ29uZGl0aW9uIik7CiAgICBwdXNoKGZvcmVzdC5wYXJlbnRoZXNpemVkQ29uZGl0aW9uKHRva2VuLCBwb3BGb3JWYWx1ZSgpLCB0b2tlbi5lbmRHcm91cCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiUGFyZW50aGVzaXplZEV4cHJlc3Npb24iKTsKICAgIEV4cHJlc3Npb24gdmFsdWUgPSBwb3BGb3JWYWx1ZSgpOwogICAgaWYgKHZhbHVlIGlzIFNoYWRvd0xhcmdlSW50TGl0ZXJhbCkgewogICAgICAvLyBXZSBuZWVkIHRvIGtub3cgdGhhdCB0aGUgZXhwcmVzc2lvbiB3YXMgcGFyZW50aGVzaXplZCBiZWNhdXNlIHdlIHdpbGwKICAgICAgLy8gdHJlYXQgLW4gZGlmZmVyZW50bHkgZnJvbSAtKG4pLiAgSWYgdGhlIGV4cHJlc3Npb24gb2NjdXJzIGluIGEgZG91YmxlCiAgICAgIC8vIGNvbnRleHQsIC1uIGlzIGEgZG91YmxlIGxpdGVyYWwgYW5kIC0obikgaXMgYW4gYXBwbGljYXRpb24gb2YgdW5hcnktIHRvCiAgICAgIC8vIGFuIGludGVnZXIgbGl0ZXJhbC4gIEFuZCBpbiBhbnkgb3RoZXIgY29udGV4dCwgJy0nIGlzIHBhcnQgb2YgdGhlCiAgICAgIC8vIHN5bnRheCBvZiAtbiwgaS5lLiwgLTkyMjMzNzIwMzY4NTQ3NzU4MDggaXMgT0sgYW5kIGl0IGlzIHRoZSBtaW5pbXVtCiAgICAgIC8vIDY0LWJpdCBpbnRlZ2VyLCBhbmQgJy0nIGlzIGFuIGFwcGxpY2F0aW9uIG9mIHVuYXJ5LSBpbiAtKG4pLCBpLmUuLAogICAgICAvLyAtKDkyMjMzNzIwMzY4NTQ3NzU4MDgpIGlzIGFuIGVycm9yIGJlY2F1c2UgdGhlIGxpdGVyYWwgZG9lcyBub3QgZml0IGluCiAgICAgIC8vIDY0LWJpdHMuCiAgICAgIHB1c2godmFsdWUuLmlzUGFyZW50aGVzaXplZCA9IHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChuZXcgUGFyZW50aGVzaXplZEV4cHJlc3Npb25HZW5lcmF0b3IodGhpcywgdG9rZW4uZW5kR3JvdXAsIHZhbHVlKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVNlbmQoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGFzc2VydChjaGVja1N0YXRlKGJlZ2luVG9rZW4sIFsKICAgICAgVmFsdWVLaW5kLkFyZ3VtZW50c09yTnVsbCwKICAgICAgVmFsdWVLaW5kLlR5cGVBcmd1bWVudHNPck51bGwsCiAgICAgIHVuaW9uT2ZLaW5kcyhbCiAgICAgICAgVmFsdWVLaW5kLkV4cHJlc3Npb24sCiAgICAgICAgVmFsdWVLaW5kLkdlbmVyYXRvciwKICAgICAgICBWYWx1ZUtpbmQuSWRlbnRpZmllciwKICAgICAgICBWYWx1ZUtpbmQuUGFyc2VyUmVjb3ZlcnksCiAgICAgICAgVmFsdWVLaW5kLlByb2JsZW1CdWlsZGVyCiAgICAgIF0pCiAgICBdKSk7CiAgICBkZWJ1Z0V2ZW50KCJTZW5kIik7CiAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gcG9wKCk7CiAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPiB0eXBlQXJndW1lbnRzID0gcG9wKCk7CiAgICBPYmplY3QgcmVjZWl2ZXIgPSBwb3AoKTsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCAmJiB0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgYXNzZXJ0KGZvcmVzdC5hcmd1bWVudHNUeXBlQXJndW1lbnRzKGFyZ3VtZW50cykuaXNFbXB0eSk7CiAgICAgIGZvcmVzdC5hcmd1bWVudHNTZXRUeXBlQXJndW1lbnRzKAogICAgICAgICAgYXJndW1lbnRzLCBidWlsZERhcnRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydCh0eXBlQXJndW1lbnRzID09IG51bGwpOwogICAgfQogICAgaWYgKHJlY2VpdmVyIGlzIElkZW50aWZpZXIpIHsKICAgICAgTmFtZSBuYW1lID0gbmV3IE5hbWUocmVjZWl2ZXIubmFtZSwgbGlicmFyeS5uYW1lT3JpZ2luKTsKICAgICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgICAgcHVzaChuZXcgSW5jb21wbGV0ZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yKHRoaXMsIGJlZ2luVG9rZW4sIG5hbWUpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwdXNoKG5ldyBTZW5kQWNjZXNzR2VuZXJhdG9yKAogICAgICAgICAgICB0aGlzLCBiZWdpblRva2VuLCBuYW1lLCBmb3Jlc3QuY2FzdEFyZ3VtZW50cyhhcmd1bWVudHMpKSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzID09IG51bGwpIHsKICAgICAgcHVzaChyZWNlaXZlcik7CiAgICB9IGVsc2UgewogICAgICBwdXNoKGZpbmlzaFNlbmQocmVjZWl2ZXIsIGFyZ3VtZW50cywgYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0KSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBmaW5pc2hTZW5kKE9iamVjdCByZWNlaXZlciwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IGNoYXJPZmZzZXQpIHsKICAgIGlmIChyZWNlaXZlciBpcyBHZW5lcmF0b3IpIHsKICAgICAgcmV0dXJuIHJlY2VpdmVyLmRvSW52b2NhdGlvbihjaGFyT2Zmc2V0LCBhcmd1bWVudHMpOwogICAgfSBlbHNlIGlmIChyZWNlaXZlciBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICByZXR1cm4gbmV3IFBhcnNlckVycm9yR2VuZXJhdG9yKHRoaXMsIG51bGwsIGZhc3RhLm1lc3NhZ2VTeW50aGV0aWNUb2tlbik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gYnVpbGRNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgdG9WYWx1ZShyZWNlaXZlciksIGNhbGxOYW1lLCBhcmd1bWVudHMsIGNoYXJPZmZzZXQsCiAgICAgICAgICBpc0ltcGxpY2l0Q2FsbDogdHJ1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2FzY2FkZShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5DYXNjYWRlIik7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgaWYgKGV4cHJlc3Npb24gaXMgQ2FzY2FkZUp1ZGdtZW50KSB7CiAgICAgIHB1c2goZXhwcmVzc2lvbik7CiAgICAgIHB1c2gobmV3IFZhcmlhYmxlVXNlR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBleHByZXNzaW9uLnZhcmlhYmxlKSk7CiAgICAgIGV4cHJlc3Npb24uZXh0ZW5kKCk7CiAgICB9IGVsc2UgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudC5mb3JWYWx1ZSgKICAgICAgICAgIGV4cHJlc3Npb24sIGZ1bmN0aW9uTmVzdGluZ0xldmVsKQogICAgICAgIC4uZmlsZU9mZnNldCA9IGV4cHJlc3Npb24uZmlsZU9mZnNldDsKICAgICAgcHVzaChuZXcgQ2FzY2FkZUp1ZGdtZW50KHZhcmlhYmxlKS4uZmlsZU9mZnNldCA9IGV4cHJlc3Npb24uZmlsZU9mZnNldCk7CiAgICAgIHB1c2gobmV3IFZhcmlhYmxlVXNlR2VuZXJhdG9yKHRoaXMsIHRva2VuLCB2YXJpYWJsZSkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDYXNjYWRlKCkgewogICAgZGVidWdFdmVudCgiZW5kQ2FzY2FkZSIpOwogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcG9wRm9yRWZmZWN0KCk7CiAgICBDYXNjYWRlSnVkZ21lbnQgY2FzY2FkZVJlY2VpdmVyID0gcG9wKCk7CiAgICBjYXNjYWRlUmVjZWl2ZXIuZmluYWxpemUoZXhwcmVzc2lvbik7CiAgICBwdXNoKGNhc2NhZGVSZWNlaXZlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2FzZUV4cHJlc3Npb24oVG9rZW4gY2FzZUtleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luQ2FzZUV4cHJlc3Npb24iKTsKICAgIHN1cGVyLnB1c2goY29uc3RhbnRDb250ZXh0KTsKICAgIGNvbnN0YW50Q29udGV4dCA9IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2FzZUV4cHJlc3Npb24oVG9rZW4gY29sb24pIHsKICAgIGRlYnVnRXZlbnQoImVuZENhc2VFeHByZXNzaW9uIik7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgY29uc3RhbnRDb250ZXh0ID0gcG9wKCk7CiAgICBzdXBlci5wdXNoKGV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkJpbmFyeUV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGlmIChvcHRpb25hbCgiJiYiLCB0b2tlbikgfHwgb3B0aW9uYWwoInx8IiwgdG9rZW4pKSB7CiAgICAgIEV4cHJlc3Npb24gbGhzID0gcG9wRm9yVmFsdWUoKTsKICAgICAgdHlwZVByb21vdGVyPy5lbnRlckxvZ2ljYWxFeHByZXNzaW9uKGxocywgdG9rZW4uc3RyaW5nVmFsdWUpOwogICAgICBwdXNoKGxocyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEJpbmFyeUV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkJpbmFyeUV4cHJlc3Npb24iKTsKICAgIGlmIChvcHRpb25hbCgiLiIsIHRva2VuKSB8fCBvcHRpb25hbCgiLi4iLCB0b2tlbikpIHsKICAgICAgcmV0dXJuIGRvRG90T3JDYXNjYWRlRXhwcmVzc2lvbih0b2tlbik7CiAgICB9CiAgICBpZiAob3B0aW9uYWwoIiYmIiwgdG9rZW4pIHx8IG9wdGlvbmFsKCJ8fCIsIHRva2VuKSkgewogICAgICByZXR1cm4gZG9Mb2dpY2FsRXhwcmVzc2lvbih0b2tlbik7CiAgICB9CiAgICBpZiAob3B0aW9uYWwoIj8/IiwgdG9rZW4pKSByZXR1cm4gZG9JZk51bGwodG9rZW4pOwogICAgaWYgKG9wdGlvbmFsKCI/LiIsIHRva2VuKSkgcmV0dXJuIGRvSWZOb3ROdWxsKHRva2VuKTsKICAgIEV4cHJlc3Npb24gYXJndW1lbnQgPSBwb3BGb3JWYWx1ZSgpOwogICAgT2JqZWN0IHJlY2VpdmVyID0gcG9wKCk7CiAgICBib29sIGlzU3VwZXIgPSBmYWxzZTsKICAgIGlmIChyZWNlaXZlciBpcyBUaGlzQWNjZXNzR2VuZXJhdG9yICYmIHJlY2VpdmVyLmlzU3VwZXIpIHsKICAgICAgVGhpc0FjY2Vzc0dlbmVyYXRvciB0aGlzQWNjZXNzb3JSZWNlaXZlciA9IHJlY2VpdmVyOwogICAgICBpc1N1cGVyID0gdHJ1ZTsKICAgICAgcmVjZWl2ZXIgPSBmb3Jlc3QudGhpc0V4cHJlc3Npb24odGhpc0FjY2Vzc29yUmVjZWl2ZXIudG9rZW4pOwogICAgfQogICAgcHVzaChidWlsZEJpbmFyeU9wZXJhdG9yKHRvVmFsdWUocmVjZWl2ZXIpLCB0b2tlbiwgYXJndW1lbnQsIGlzU3VwZXIpKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRCaW5hcnlPcGVyYXRvcigKICAgICAgRXhwcmVzc2lvbiBhLCBUb2tlbiB0b2tlbiwgRXhwcmVzc2lvbiBiLCBib29sIGlzU3VwZXIpIHsKICAgIGJvb2wgbmVnYXRlID0gZmFsc2U7CiAgICBTdHJpbmcgb3BlcmF0b3IgPSB0b2tlbi5zdHJpbmdWYWx1ZTsKICAgIGlmIChpZGVudGljYWwoIiE9Iiwgb3BlcmF0b3IpKSB7CiAgICAgIG9wZXJhdG9yID0gIj09IjsKICAgICAgbmVnYXRlID0gdHJ1ZTsKICAgIH0KICAgIGlmICghaXNCaW5hcnlPcGVyYXRvcihvcGVyYXRvcikgJiYgIWlzTWludXNPcGVyYXRvcihvcGVyYXRvcikpIHsKICAgICAgaWYgKGlzVXNlckRlZmluYWJsZU9wZXJhdG9yKG9wZXJhdG9yKSkgewogICAgICAgIHJldHVybiBidWlsZFByb2JsZW0oCiAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlTm90QmluYXJ5T3BlcmF0b3Iud2l0aEFyZ3VtZW50cyh0b2tlbiksCiAgICAgICAgICAgIHRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICAgIHRva2VuLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGJ1aWxkUHJvYmxlbShmYXN0YS50ZW1wbGF0ZUludmFsaWRPcGVyYXRvci53aXRoQXJndW1lbnRzKHRva2VuKSwKICAgICAgICAgICAgdG9rZW4uY2hhck9mZnNldCwgdG9rZW4ubGVuZ3RoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgRXhwcmVzc2lvbiByZXN1bHQgPSBidWlsZE1ldGhvZEludm9jYXRpb24oYSwgbmV3IE5hbWUob3BlcmF0b3IpLAogICAgICAgICAgZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bYl0sIG5vTG9jYXRpb24pLCB0b2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgLy8gVGhpcyAqY291bGQqIGJlIGEgY29uc3RhbnQgZXhwcmVzc2lvbiwgd2UgY2FuJ3Qga25vdyB3aXRob3V0CiAgICAgICAgICAvLyBldmFsdWF0aW5nIFthXSBhbmQgW2JdLgogICAgICAgICAgaXNDb25zdGFudEV4cHJlc3Npb246ICFpc1N1cGVyLAogICAgICAgICAgaXNTdXBlcjogaXNTdXBlcik7CiAgICAgIHJldHVybiBuZWdhdGUgPyBmb3Jlc3Qubm90RXhwcmVzc2lvbihyZXN1bHQsIG51bGwsIHRydWUpIDogcmVzdWx0OwogICAgfQogIH0KCiAgdm9pZCBkb0xvZ2ljYWxFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBFeHByZXNzaW9uIGFyZ3VtZW50ID0gcG9wRm9yVmFsdWUoKTsKICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIgPSBwb3AoKTsKICAgIEV4cHJlc3Npb24gbG9naWNhbEV4cHJlc3Npb24gPQogICAgICAgIGZvcmVzdC5sb2dpY2FsRXhwcmVzc2lvbihyZWNlaXZlciwgdG9rZW4sIGFyZ3VtZW50KTsKICAgIHR5cGVQcm9tb3Rlcj8uZXhpdExvZ2ljYWxFeHByZXNzaW9uKGFyZ3VtZW50LCBsb2dpY2FsRXhwcmVzc2lvbik7CiAgICBwdXNoKGxvZ2ljYWxFeHByZXNzaW9uKTsKICB9CgogIC8vLyBIYW5kbGUgYGEgPz8gYmAuCiAgdm9pZCBkb0lmTnVsbChUb2tlbiB0b2tlbikgewogICAgRXhwcmVzc2lvbiBiID0gcG9wRm9yVmFsdWUoKTsKICAgIEV4cHJlc3Npb24gYSA9IHBvcEZvclZhbHVlKCk7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoYSk7CiAgICBwdXNoKG5ldyBJZk51bGxKdWRnbWVudCgKICAgICAgICB2YXJpYWJsZSwKICAgICAgICBmb3Jlc3QuY29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICAgICAgICBidWlsZElzTnVsbChuZXcgVmFyaWFibGVHZXQodmFyaWFibGUpLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHRoaXMpLAogICAgICAgICAgICB0b2tlbiwKICAgICAgICAgICAgYiwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlKSkpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKSk7CiAgfQoKICAvLy8gSGFuZGxlIGBhPy5iKC4uLilgLgogIHZvaWQgZG9JZk5vdE51bGwoVG9rZW4gdG9rZW4pIHsKICAgIE9iamVjdCBzZW5kID0gcG9wKCk7CiAgICBpZiAoc2VuZCBpcyBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvcikgewogICAgICBwdXNoKHNlbmQud2l0aFJlY2VpdmVyKHBvcCgpLCB0b2tlbi5jaGFyT2Zmc2V0LCBpc051bGxBd2FyZTogdHJ1ZSkpOwogICAgfSBlbHNlIHsKICAgICAgcG9wKCk7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgcHVzaChidWlsZFByb2JsZW0oZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyh0b2tlbiksCiAgICAgICAgICBvZmZzZXRGb3JUb2tlbih0b2tlbiksIGxlbmd0aEZvclRva2VuKHRva2VuKSkpOwogICAgfQogIH0KCiAgdm9pZCBkb0RvdE9yQ2FzY2FkZUV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIE9iamVjdCBzZW5kID0gcG9wKCk7CiAgICBpZiAoc2VuZCBpcyBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvcikgewogICAgICBPYmplY3QgcmVjZWl2ZXIgPSBvcHRpb25hbCgiLiIsIHRva2VuKSA/IHBvcCgpIDogcG9wRm9yVmFsdWUoKTsKICAgICAgcHVzaChzZW5kLndpdGhSZWNlaXZlcihyZWNlaXZlciwgdG9rZW4uY2hhck9mZnNldCkpOwogICAgfSBlbHNlIHsKICAgICAgcG9wKCk7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgcHVzaChidWlsZFByb2JsZW0oZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyh0b2tlbiksCiAgICAgICAgICBvZmZzZXRGb3JUb2tlbih0b2tlbiksIGxlbmd0aEZvclRva2VuKHRva2VuKSkpOwogICAgfQogIH0KCiAgYm9vbCBhcmVBcmd1bWVudHNDb21wYXRpYmxlKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgLy8gVE9ETyhhaGUpOiBJbXBsZW1lbnQgdGhpcy4KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB0aHJvd05vU3VjaE1ldGhvZEVycm9yKAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtNZW1iZXIgY2FuZGlkYXRlLAogICAgICBib29sIGlzU3VwZXI6IGZhbHNlLAogICAgICBib29sIGlzR2V0dGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc1NldHRlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNTdGF0aWM6IGZhbHNlLAogICAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlfSkgewogICAgaW50IGxlbmd0aCA9IG5hbWUubGVuZ3RoOwogICAgaW50IHBlcmlvZEluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZigiLiIpOwogICAgaWYgKHBlcmlvZEluZGV4ICE9IC0xKSB7CiAgICAgIGxlbmd0aCAtPSBwZXJpb2RJbmRleCArIDE7CiAgICB9CiAgICBOYW1lIGtlcm5lbE5hbWUgPSBuZXcgTmFtZShuYW1lLCBsaWJyYXJ5Lm5hbWVPcmlnaW4pOwogICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dDsKICAgIGlmIChjYW5kaWRhdGUgIT0gbnVsbCAmJiBjYW5kaWRhdGUubG9jYXRpb24gIT0gbnVsbCkgewogICAgICBVcmkgdXJpID0gY2FuZGlkYXRlLmxvY2F0aW9uLmZpbGU7CiAgICAgIGludCBvZmZzZXQgPSBjYW5kaWRhdGUuZmlsZU9mZnNldDsKICAgICAgTWVzc2FnZSBjb250ZXh0TWVzc2FnZTsKICAgICAgaW50IGxlbmd0aCA9IG5vTGVuZ3RoOwogICAgICBpZiAoY2FuZGlkYXRlIGlzIENvbnN0cnVjdG9yICYmIGNhbmRpZGF0ZS5pc1N5bnRoZXRpYykgewogICAgICAgIG9mZnNldCA9IGNhbmRpZGF0ZS5lbmNsb3NpbmdDbGFzcy5maWxlT2Zmc2V0OwogICAgICAgIGNvbnRleHRNZXNzYWdlID0gZmFzdGEudGVtcGxhdGVDYW5kaWRhdGVGb3VuZElzRGVmYXVsdENvbnN0cnVjdG9yCiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGNhbmRpZGF0ZS5lbmNsb3NpbmdDbGFzcy5uYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZW5ndGggPSBuYW1lLmxlbmd0aDsKICAgICAgICBjb250ZXh0TWVzc2FnZSA9IGZhc3RhLm1lc3NhZ2VDYW5kaWRhdGVGb3VuZDsKICAgICAgfQogICAgICBjb250ZXh0ID0gW2NvbnRleHRNZXNzYWdlLndpdGhMb2NhdGlvbih1cmksIG9mZnNldCwgbGVuZ3RoKV07CiAgICB9CiAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CiAgICAgIGlmIChpc0dldHRlcikgewogICAgICAgIG1lc3NhZ2UgPSB3YXJuVW5yZXNvbHZlZEdldChrZXJuZWxOYW1lLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgaXNTdXBlcjogaXNTdXBlciwgcmVwb3J0V2FybmluZzogZmFsc2UsIGNvbnRleHQ6IGNvbnRleHQpCiAgICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBjaGFyT2Zmc2V0LCBsZW5ndGgpOwogICAgICB9IGVsc2UgaWYgKGlzU2V0dGVyKSB7CiAgICAgICAgbWVzc2FnZSA9IHdhcm5VbnJlc29sdmVkU2V0KGtlcm5lbE5hbWUsIGNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICBpc1N1cGVyOiBpc1N1cGVyLCByZXBvcnRXYXJuaW5nOiBmYWxzZSwgY29udGV4dDogY29udGV4dCkKICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGNoYXJPZmZzZXQsIGxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWVzc2FnZSA9IHdhcm5VbnJlc29sdmVkTWV0aG9kKGtlcm5lbE5hbWUsIGNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICBpc1N1cGVyOiBpc1N1cGVyLCByZXBvcnRXYXJuaW5nOiBmYWxzZSwgY29udGV4dDogY29udGV4dCkKICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGNoYXJPZmZzZXQsIGxlbmd0aCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChsZWdhY3lNb2RlICYmIGNvbnN0YW50Q29udGV4dCA9PSBDb25zdGFudENvbnRleHQubm9uZSkgewogICAgICBhZGRQcm9ibGVtKG1lc3NhZ2UubWVzc2FnZU9iamVjdCwgbWVzc2FnZS5jaGFyT2Zmc2V0LCBtZXNzYWdlLmxlbmd0aCwKICAgICAgICAgIHdhc0hhbmRsZWQ6IHRydWUsIGNvbnRleHQ6IGNvbnRleHQpOwogICAgICByZXR1cm4gZm9yZXN0LnRocm93RXhwcmVzc2lvbigKICAgICAgICAgIG51bGwsCiAgICAgICAgICBsaWJyYXJ5LmxvYWRlci5pbnN0YW50aWF0ZU5vU3VjaE1ldGhvZEVycm9yKAogICAgICAgICAgICAgIHJlY2VpdmVyLCBuYW1lLCBmb3Jlc3QuY2FzdEFyZ3VtZW50cyhhcmd1bWVudHMpLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgIGlzTWV0aG9kOiAhaXNHZXR0ZXIgJiYgIWlzU2V0dGVyLAogICAgICAgICAgICAgIGlzR2V0dGVyOiBpc0dldHRlciwKICAgICAgICAgICAgICBpc1NldHRlcjogaXNTZXR0ZXIsCiAgICAgICAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLAogICAgICAgICAgICAgIGlzVG9wTGV2ZWw6ICFpc1N0YXRpYyAmJiAhaXNTdXBlcikpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgIH0KICAgIHJldHVybiBkZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihidWlsZFByb2JsZW0oCiAgICAgICAgbWVzc2FnZS5tZXNzYWdlT2JqZWN0LCBtZXNzYWdlLmNoYXJPZmZzZXQsIG1lc3NhZ2UubGVuZ3RoLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQpKTsKICB9CgogIEBvdmVycmlkZQogIE1lc3NhZ2Ugd2FyblVucmVzb2x2ZWRHZXQoTmFtZSBuYW1lLCBpbnQgY2hhck9mZnNldCwKICAgICAge2Jvb2wgaXNTdXBlcjogZmFsc2UsCiAgICAgIGJvb2wgcmVwb3J0V2FybmluZzogdHJ1ZSwKICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGlzU3VwZXIKICAgICAgICA/IGZhc3RhLnRlbXBsYXRlU3VwZXJjbGFzc0hhc05vR2V0dGVyLndpdGhBcmd1bWVudHMobmFtZS5uYW1lKQogICAgICAgIDogZmFzdGEudGVtcGxhdGVHZXR0ZXJOb3RGb3VuZC53aXRoQXJndW1lbnRzKG5hbWUubmFtZSk7CiAgICBpZiAocmVwb3J0V2FybmluZykgewogICAgICBhZGRQcm9ibGVtRXJyb3JJZkNvbnN0KG1lc3NhZ2UsIGNoYXJPZmZzZXQsIG5hbWUubmFtZS5sZW5ndGgsCiAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgIH0KICAgIHJldHVybiBtZXNzYWdlOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVzc2FnZSB3YXJuVW5yZXNvbHZlZFNldChOYW1lIG5hbWUsIGludCBjaGFyT2Zmc2V0LAogICAgICB7Ym9vbCBpc1N1cGVyOiBmYWxzZSwKICAgICAgYm9vbCByZXBvcnRXYXJuaW5nOiB0cnVlLAogICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgTWVzc2FnZSBtZXNzYWdlID0gaXNTdXBlcgogICAgICAgID8gZmFzdGEudGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9TZXR0ZXIud2l0aEFyZ3VtZW50cyhuYW1lLm5hbWUpCiAgICAgICAgOiBmYXN0YS50ZW1wbGF0ZVNldHRlck5vdEZvdW5kLndpdGhBcmd1bWVudHMobmFtZS5uYW1lKTsKICAgIGlmIChyZXBvcnRXYXJuaW5nKSB7CiAgICAgIGFkZFByb2JsZW1FcnJvcklmQ29uc3QobWVzc2FnZSwgY2hhck9mZnNldCwgbmFtZS5uYW1lLmxlbmd0aCwKICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQpOwogICAgfQogICAgcmV0dXJuIG1lc3NhZ2U7CiAgfQoKICBAb3ZlcnJpZGUKICBNZXNzYWdlIHdhcm5VbnJlc29sdmVkTWV0aG9kKE5hbWUgbmFtZSwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtib29sIGlzU3VwZXI6IGZhbHNlLAogICAgICBib29sIHJlcG9ydFdhcm5pbmc6IHRydWUsCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBTdHJpbmcgcGxhaW5OYW1lID0gbmFtZS5uYW1lOwogICAgaW50IGRvdEluZGV4ID0gcGxhaW5OYW1lLmxhc3RJbmRleE9mKCIuIik7CiAgICBpZiAoZG90SW5kZXggIT0gLTEpIHsKICAgICAgcGxhaW5OYW1lID0gcGxhaW5OYW1lLnN1YnN0cmluZyhkb3RJbmRleCArIDEpOwogICAgfQogICAgLy8gVE9ETyhhaGUpOiBUaGlzIGlzIHJhdGhlciBicml0dGxlLiBXZSB3b3VsZCBwcm9iYWJseSBiZSBiZXR0ZXIgb2ZmIHdpdGgKICAgIC8vIG1vcmUgcHJlY2lzZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBpbiB0aGlzIGNhc2UuCiAgICBpbnQgbGVuZ3RoID0gcGxhaW5OYW1lLmxlbmd0aDsKICAgIGlmIChwbGFpbk5hbWUuc3RhcnRzV2l0aCgiWyIpKSB7CiAgICAgIGxlbmd0aCA9IDE7CiAgICB9CiAgICBNZXNzYWdlIG1lc3NhZ2UgPSBpc1N1cGVyCiAgICAgICAgPyBmYXN0YS50ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb01ldGhvZC53aXRoQXJndW1lbnRzKG5hbWUubmFtZSkKICAgICAgICA6IGZhc3RhLnRlbXBsYXRlTWV0aG9kTm90Rm91bmQud2l0aEFyZ3VtZW50cyhuYW1lLm5hbWUpOwogICAgaWYgKHJlcG9ydFdhcm5pbmcpIHsKICAgICAgYWRkUHJvYmxlbUVycm9ySWZDb25zdChtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIGNvbnRleHQ6IGNvbnRleHQpOwogICAgfQogICAgcmV0dXJuIG1lc3NhZ2U7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdhcm5UeXBlQXJndW1lbnRzTWlzbWF0Y2goU3RyaW5nIG5hbWUsIGludCBleHBlY3RlZCwgaW50IGNoYXJPZmZzZXQpIHsKICAgIGFkZFByb2JsZW1FcnJvcklmQ29uc3QoCiAgICAgICAgZmFzdGEudGVtcGxhdGVUeXBlQXJndW1lbnRNaXNtYXRjaC53aXRoQXJndW1lbnRzKGV4cGVjdGVkKSwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIG5hbWUubGVuZ3RoKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlciBsb29rdXBJbnN0YW5jZU1lbWJlcihOYW1lIG5hbWUsCiAgICAgIHtib29sIGlzU2V0dGVyOiBmYWxzZSwgYm9vbCBpc1N1cGVyOiBmYWxzZX0pIHsKICAgIHJldHVybiBjbGFzc0J1aWxkZXIubG9va3VwSW5zdGFuY2VNZW1iZXIoaGllcmFyY2h5LCBuYW1lLAogICAgICAgIGlzU2V0dGVyOiBpc1NldHRlciwgaXNTdXBlcjogaXNTdXBlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvciBsb29rdXBDb25zdHJ1Y3RvcihOYW1lIG5hbWUsIHtib29sIGlzU3VwZXJ9KSB7CiAgICByZXR1cm4gY2xhc3NCdWlsZGVyLmxvb2t1cENvbnN0cnVjdG9yKG5hbWUsIGlzU3VwZXI6IGlzU3VwZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBkZWJ1Z0V2ZW50KCJoYW5kbGVJZGVudGlmaWVyIik7CiAgICBTdHJpbmcgbmFtZSA9IHRva2VuLmxleGVtZTsKICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoImRlcHJlY2F0ZWQiKSAmJgogICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgcHJldmlvdXMgY2hlY2sgaXMgcmVkdW5kYW50LCBidXQgZmFzdGVyIGluIHRoZSBjb21tb24KICAgICAgICAvLyBjYXNlICh3aGVuIFtuYW1lXSBpc24ndCBkZXByZWNhdGVkKS4KICAgICAgICAobmFtZSA9PSAiZGVwcmVjYXRlZCIgfHwgbmFtZS5zdGFydHNXaXRoKCJkZXByZWNhdGVkXyIpKSkgewogICAgICBhZGRQcm9ibGVtKGZhc3RhLnRlbXBsYXRlVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBsZW5ndGhGb3JUb2tlbih0b2tlbikpOwogICAgfQogICAgaWYgKGNvbnRleHQuaXNTY29wZVJlZmVyZW5jZSkgewogICAgICBhc3NlcnQoIWluSW5pdGlhbGl6ZXIgfHwKICAgICAgICAgIHRoaXMuc2NvcGUgPT0gZW5jbG9zaW5nU2NvcGUgfHwKICAgICAgICAgIHRoaXMuc2NvcGUucGFyZW50ID09IGVuY2xvc2luZ1Njb3BlKTsKICAgICAgLy8gVGhpcyBkZWFscyB3aXRoIHRoaXMga2luZCBvZiBpbml0aWFsaXplcjogYEMoYSkgOiBhID0gYTtgCiAgICAgIFNjb3BlIHNjb3BlID0gaW5Jbml0aWFsaXplciA/IGVuY2xvc2luZ1Njb3BlIDogdGhpcy5zY29wZTsKICAgICAgcHVzaChzY29wZUxvb2t1cChzY29wZSwgbmFtZSwgdG9rZW4pKTsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmIChjb250ZXh0LmluRGVjbGFyYXRpb24pIHsKICAgICAgaWYgKGNvbnRleHQgPT0gSWRlbnRpZmllckNvbnRleHQudG9wTGV2ZWxWYXJpYWJsZURlY2xhcmF0aW9uIHx8CiAgICAgICAgICBjb250ZXh0ID09IElkZW50aWZpZXJDb250ZXh0LmZpZWxkRGVjbGFyYXRpb24pIHsKICAgICAgICBjb25zdGFudENvbnRleHQgPSBtZW1iZXIuaXNDb25zdAogICAgICAgICAgICA/IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZAogICAgICAgICAgICA6ICFtZW1iZXIuaXNTdGF0aWMgJiYKICAgICAgICAgICAgICAgICAgICBjbGFzc0J1aWxkZXIgIT0gbnVsbCAmJgogICAgICAgICAgICAgICAgICAgIGNsYXNzQnVpbGRlci5oYXNDb25zdENvbnN0cnVjdG9yCiAgICAgICAgICAgICAgICA/IENvbnN0YW50Q29udGV4dC5yZXF1aXJlZAogICAgICAgICAgICAgICAgOiBDb25zdGFudENvbnRleHQubm9uZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUgJiYKICAgICAgICAhY29udGV4dC5hbGxvd2VkSW5Db25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLm1lc3NhZ2VOb3RBQ29uc3RhbnRFeHByZXNzaW9uLCB0b2tlbi5jaGFyT2Zmc2V0LCB0b2tlbi5sZW5ndGgpOwogICAgfQogICAgaWYgKHRva2VuLmlzU3ludGhldGljKSB7CiAgICAgIHB1c2gobmV3IFBhcnNlclJlY292ZXJ5KG9mZnNldEZvclRva2VuKHRva2VuKSkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChuZXcgSWRlbnRpZmllci5wcmVzZXJ2ZVRva2VuKHRva2VuKSk7CiAgICB9CiAgfQoKICAvLy8gSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBbVmFyaWFibGVHZXRdIG9mIHRoZSBbdmFyaWFibGVdIHVzaW5nCiAgLy8vIFtjaGFyT2Zmc2V0XSBhcyB0aGUgZmlsZSBvZmZzZXQuCiAgVmFyaWFibGVHZXQgX2NyZWF0ZVZhcmlhYmxlR2V0KFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBjaGFyT2Zmc2V0KSB7CiAgICBPYmplY3QgZmFjdCA9CiAgICAgICAgdHlwZVByb21vdGVyPy5nZXRGYWN0Rm9yQWNjZXNzKHZhcmlhYmxlLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCk7CiAgICBPYmplY3Qgc2NvcGUgPSB0eXBlUHJvbW90ZXI/LmN1cnJlbnRTY29wZTsKICAgIHJldHVybiBuZXcgVmFyaWFibGVHZXRKdWRnbWVudCh2YXJpYWJsZSwgZmFjdCwgc2NvcGUpCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgfQoKICAvLy8gSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBbUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3JdIG9uIHRoZSBbdmFyaWFibGVdCiAgLy8vIHVzaW5nIFt0b2tlbl0gYW5kIFtjaGFyT2Zmc2V0XSBmb3Igb2Zmc2V0IGluZm9ybWF0aW9uIGFuZCBbbmFtZV0KICAvLy8gZm9yIGBFeHByZXNzaW9uR2VuZXJhdG9yLl9wbGFpbk5hbWVGb3JSZWFkYC4KICBSZWFkT25seUFjY2Vzc0dlbmVyYXRvciBfY3JlYXRlUmVhZE9ubHlWYXJpYWJsZUFjY2VzcygKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgVG9rZW4gdG9rZW4sIGludCBjaGFyT2Zmc2V0LCBTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIG5ldyBSZWFkT25seUFjY2Vzc0dlbmVyYXRvcigKICAgICAgICB0aGlzLCB0b2tlbiwgX2NyZWF0ZVZhcmlhYmxlR2V0KHZhcmlhYmxlLCBjaGFyT2Zmc2V0KSwgbmFtZSk7CiAgfQoKICAvLy8gTG9vayB1cCBbbmFtZV0gaW4gW3Njb3BlXSB1c2luZyBbdG9rZW5dIGFzIGxvY2F0aW9uIGluZm9ybWF0aW9uIChib3RoIHRvCiAgLy8vIHJlcG9ydCBwcm9ibGVtcyBhbmQgYXMgdGhlIGZpbGUgb2Zmc2V0IGluIHRoZSBnZW5lcmF0ZWQga2VybmVsIGNvZGUpLgogIC8vLyBbaXNRdWFsaWZpZWRdIHNob3VsZCBiZSB0cnVlIGlmIFtuYW1lXSBpcyBhIHF1YWxpZmllZCBhY2Nlc3MgKHdoaWNoCiAgLy8vIGltcGxpZXMgdGhhdCBpdCBzaG91bGRuJ3QgYmUgdHVybmVkIGludG8gYSBbVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yXQogIC8vLyBpZiB0aGUgbmFtZSBkb2Vzbid0IHJlc29sdmUgaW4gdGhlIHNjb3BlKS4KICBAb3ZlcnJpZGUKICBzY29wZUxvb2t1cChTY29wZSBzY29wZSwgU3RyaW5nIG5hbWUsIFRva2VuIHRva2VuLAogICAgICB7Ym9vbCBpc1F1YWxpZmllZDogZmFsc2UsIFByZWZpeEJ1aWxkZXIgcHJlZml4fSkgewogICAgaW50IGNoYXJPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBpZiAodG9rZW4uaXNTeW50aGV0aWMpIHsKICAgICAgcmV0dXJuIG5ldyBQYXJzZXJFcnJvckdlbmVyYXRvcih0aGlzLCB0b2tlbiwgZmFzdGEubWVzc2FnZVN5bnRoZXRpY1Rva2VuKTsKICAgIH0KICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gc2NvcGUubG9va3VwKG5hbWUsIGNoYXJPZmZzZXQsIHVyaSk7CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgVW5saW5rZWREZWNsYXJhdGlvbikgewogICAgICByZXR1cm4gbmV3IFVubGlua2VkR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBkZWNsYXJhdGlvbik7CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb24gPT0gbnVsbCAmJgogICAgICAgIHByZWZpeCA9PSBudWxsICYmCiAgICAgICAgKGNsYXNzQnVpbGRlcj8uaXNQYXRjaCA/PyBmYWxzZSkpIHsKICAgICAgLy8gVGhlIHNjb3BlIG9mIGEgcGF0Y2hlZCBtZXRob2QgaW5jbHVkZXMgdGhlIG9yaWdpbiBjbGFzcy4KICAgICAgZGVjbGFyYXRpb24gPQogICAgICAgICAgY2xhc3NCdWlsZGVyLm9yaWdpbi5maW5kU3RhdGljQnVpbGRlcihuYW1lLCBjaGFyT2Zmc2V0LCB1cmksIGxpYnJhcnkpOwogICAgfQogICAgaWYgKGRlY2xhcmF0aW9uICE9IG51bGwgJiYKICAgICAgICBkZWNsYXJhdGlvbi5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICAgaW5GaWVsZEluaXRpYWxpemVyICYmCiAgICAgICAgIWluSW5pdGlhbGl6ZXIpIHsKICAgICAgcmV0dXJuIG5ldyBJbmNvbXBsZXRlRXJyb3JHZW5lcmF0b3IodGhpcywgdG9rZW4sCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZVRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIud2l0aEFyZ3VtZW50cyhuYW1lKSk7CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb24gPT0gbnVsbCB8fAogICAgICAgICghaXNJbnN0YW5jZUNvbnRleHQgJiYgZGVjbGFyYXRpb24uaXNJbnN0YW5jZU1lbWJlcikpIHsKICAgICAgTmFtZSBuID0gbmV3IE5hbWUobmFtZSwgbGlicmFyeS5uYW1lT3JpZ2luKTsKICAgICAgaWYgKCFpc1F1YWxpZmllZCAmJiBpc0luc3RhbmNlQ29udGV4dCkgewogICAgICAgIGFzc2VydChkZWNsYXJhdGlvbiA9PSBudWxsKTsKICAgICAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lIHx8IG1lbWJlci5pc0ZpZWxkKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFVucmVzb2x2ZWROYW1lR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBuKTsKICAgICAgICB9CiAgICAgICAgaWYgKGV4dGVuc2lvblRoaXMgIT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yLm1ha2UoCiAgICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgICB0b2tlbiwKICAgICAgICAgICAgICBfY3JlYXRlVmFyaWFibGVHZXQoZXh0ZW5zaW9uVGhpcywgY2hhck9mZnNldCksCiAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbmV3IFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcih0aGlzLCB0b2tlbiwgbiwKICAgICAgICAgICAgICBsb29rdXBJbnN0YW5jZU1lbWJlcihuKSwgbG9va3VwSW5zdGFuY2VNZW1iZXIobiwgaXNTZXR0ZXI6IHRydWUpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaWdub3JlTWFpbkluR2V0TWFpbkNsb3N1cmUgJiYKICAgICAgICAgIG5hbWUgPT0gIm1haW4iICYmCiAgICAgICAgICBtZW1iZXI/Lm5hbWUgPT0gIl9nZXRNYWluQ2xvc3VyZSIpIHsKICAgICAgICByZXR1cm4gZm9yZXN0LmxpdGVyYWxOdWxsKG51bGwpLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IFVucmVzb2x2ZWROYW1lR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBuKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi5pc1R5cGVEZWNsYXJhdGlvbikgewogICAgICByZXR1cm4gbmV3IFR5cGVVc2VHZW5lcmF0b3IodGhpcywgdG9rZW4sIGRlY2xhcmF0aW9uLCBuYW1lKTsKICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24uaXNMb2NhbCkgewogICAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lICYmCiAgICAgICAgICAhZGVjbGFyYXRpb24uaXNDb25zdCAmJgogICAgICAgICAgIW1lbWJlci5pc0NvbnN0cnVjdG9yKSB7CiAgICAgICAgcmV0dXJuIG5ldyBJbmNvbXBsZXRlRXJyb3JHZW5lcmF0b3IoCiAgICAgICAgICAgIHRoaXMsIHRva2VuLCBmYXN0YS5tZXNzYWdlTm90QUNvbnN0YW50RXhwcmVzc2lvbik7CiAgICAgIH0KICAgICAgLy8gQW4gaW5pdGlhbGl6aW5nIGZvcm1hbCBwYXJhbWV0ZXIgbWlnaHQgYmUgZmluYWwgd2l0aG91dCBpdHMKICAgICAgLy8gVmFyaWFibGVEZWNsYXJhdGlvbiBiZWluZyBmaW5hbC4gU2VlCiAgICAgIC8vIFtQcm9jZWR1cmVCdWlsZGVyLmNvbXB1dGVGb3JtYWxQYXJhbWV0ZXJJbml0aWFsaXplclNjb3BlXS4gSWYgdGhhdAogICAgICAvLyB3YXNuJ3QgdGhlIGNhc2UsIHdlIGNvdWxkIGFsd2F5cyB1c2UgW1ZhcmlhYmxlVXNlR2VuZXJhdG9yXS4KICAgICAgaWYgKGRlY2xhcmF0aW9uLmlzRmluYWwpIHsKICAgICAgICByZXR1cm4gX2NyZWF0ZVJlYWRPbmx5VmFyaWFibGVBY2Nlc3MoCiAgICAgICAgICAgIGRlY2xhcmF0aW9uLnRhcmdldCwgdG9rZW4sIGNoYXJPZmZzZXQsIG5hbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgVmFyaWFibGVVc2VHZW5lcmF0b3IodGhpcywgdG9rZW4sIGRlY2xhcmF0aW9uLnRhcmdldCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24uaXNJbnN0YW5jZU1lbWJlcikgewogICAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lICYmCiAgICAgICAgICAhaW5Jbml0aWFsaXplciAmJgogICAgICAgICAgLy8gVE9ETyhhaGUpOiBUaGlzIGlzIGEgaGFjayBiZWNhdXNlIEZhc3RhIHNldHMgdXAgdGhlIHNjb3BlCiAgICAgICAgICAvLyAidGhpcy5maWVsZCIgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gb2xkIHNlbWFudGljcy4gVW5kZXIgdGhlIG5ldwogICAgICAgICAgLy8gc2VtYW50aWNzLCBzdWNoIHBhcmFtZXRlcnMgaW50cm9kdWNlcyBhIG5ldyBwYXJhbWV0ZXIgd2l0aCB0aGF0CiAgICAgICAgICAvLyBuYW1lIHRoYXQgc2hvdWxkIGJlIHJlc29sdmVkIGhlcmUuCiAgICAgICAgICAhbWVtYmVyLmlzQ29uc3RydWN0b3IpIHsKICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICBmYXN0YS5tZXNzYWdlTm90QUNvbnN0YW50RXhwcmVzc2lvbiwgY2hhck9mZnNldCwgdG9rZW4ubGVuZ3RoKTsKICAgICAgfQogICAgICBOYW1lIG4gPSBuZXcgTmFtZShuYW1lLCBsaWJyYXJ5Lm5hbWVPcmlnaW4pOwogICAgICBNZW1iZXIgZ2V0dGVyOwogICAgICBNZW1iZXIgc2V0dGVyOwogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgQWNjZXNzRXJyb3JCdWlsZGVyKSB7CiAgICAgICAgc2V0dGVyID0gZGVjbGFyYXRpb24ucGFyZW50LnRhcmdldDsKICAgICAgICBnZXR0ZXIgPSBsb29rdXBJbnN0YW5jZU1lbWJlcihuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnZXR0ZXIgPSBkZWNsYXJhdGlvbi50YXJnZXQ7CiAgICAgICAgc2V0dGVyID0gbG9va3VwSW5zdGFuY2VNZW1iZXIobiwgaXNTZXR0ZXI6IHRydWUpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBuLCBnZXR0ZXIsIHNldHRlcik7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uLmlzUmVndWxhck1ldGhvZCkgewogICAgICBhc3NlcnQoZGVjbGFyYXRpb24uaXNTdGF0aWMgfHwgZGVjbGFyYXRpb24uaXNUb3BMZXZlbCk7CiAgICAgIHJldHVybiBuZXcgU3RhdGljQWNjZXNzR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBkZWNsYXJhdGlvbi50YXJnZXQsIG51bGwpOwogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBQcmVmaXhCdWlsZGVyKSB7CiAgICAgIGFzc2VydChwcmVmaXggPT0gbnVsbCk7CiAgICAgIHJldHVybiBuZXcgUHJlZml4VXNlR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBkZWNsYXJhdGlvbik7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIExvYWRMaWJyYXJ5QnVpbGRlcikgewogICAgICByZXR1cm4gbmV3IExvYWRMaWJyYXJ5R2VuZXJhdG9yKHRoaXMsIHRva2VuLCBkZWNsYXJhdGlvbik7CiAgICB9IGVsc2UgewogICAgICBpZiAoZGVjbGFyYXRpb24uaGFzUHJvYmxlbSAmJiBkZWNsYXJhdGlvbiBpcyEgQWNjZXNzRXJyb3JCdWlsZGVyKQogICAgICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICAgICAgRGVjbGFyYXRpb24gc2V0dGVyOwogICAgICBpZiAoZGVjbGFyYXRpb24uaXNTZXR0ZXIpIHsKICAgICAgICBzZXR0ZXIgPSBkZWNsYXJhdGlvbjsKICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi5pc0dldHRlcikgewogICAgICAgIHNldHRlciA9IHNjb3BlLmxvb2t1cFNldHRlcihuYW1lLCBjaGFyT2Zmc2V0LCB1cmkpOwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uLmlzRmllbGQpIHsKICAgICAgICBpZiAoZGVjbGFyYXRpb24uaXNGaW5hbCB8fCBkZWNsYXJhdGlvbi5pc0NvbnN0KSB7CiAgICAgICAgICBzZXR0ZXIgPSBzY29wZS5sb29rdXBTZXR0ZXIobmFtZSwgY2hhck9mZnNldCwgdXJpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2V0dGVyID0gZGVjbGFyYXRpb247CiAgICAgICAgfQogICAgICB9CiAgICAgIFN0YXRpY0FjY2Vzc0dlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgU3RhdGljQWNjZXNzR2VuZXJhdG9yLmZyb21CdWlsZGVyKAogICAgICAgICAgdGhpcywgZGVjbGFyYXRpb24sIHRva2VuLCBzZXR0ZXIpOwogICAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lKSB7CiAgICAgICAgTWVtYmVyIHJlYWRUYXJnZXQgPSBnZW5lcmF0b3IucmVhZFRhcmdldDsKICAgICAgICBpZiAoIShyZWFkVGFyZ2V0IGlzIEZpZWxkICYmIHJlYWRUYXJnZXQuaXNDb25zdCB8fAogICAgICAgICAgICAvLyBTdGF0aWMgdGVhci1vZmZzIGFyZSBhbHNvIGNvbXBpbGUgdGltZSBjb25zdGFudHMuCiAgICAgICAgICAgIHJlYWRUYXJnZXQgaXMgUHJvY2VkdXJlKSkgewogICAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgICBmYXN0YS5tZXNzYWdlTm90QUNvbnN0YW50RXhwcmVzc2lvbiwgY2hhck9mZnNldCwgdG9rZW4ubGVuZ3RoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGdlbmVyYXRvcjsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUXVhbGlmaWVkKFRva2VuIHBlcmlvZCkgewogICAgZGVidWdFdmVudCgiUXVhbGlmaWVkIik7CiAgICBPYmplY3Qgbm9kZSA9IHBvcCgpOwogICAgT2JqZWN0IHF1YWxpZmllciA9IHBvcCgpOwogICAgaWYgKHF1YWxpZmllciBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKHF1YWxpZmllcik7CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIElkZW50aWZpZXIgaWRlbnRpZmllciA9IG5vZGU7CiAgICAgIHB1c2goaWRlbnRpZmllci53aXRoUXVhbGlmaWVyKHF1YWxpZmllcikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkxpdGVyYWxTdHJpbmcoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luTGl0ZXJhbFN0cmluZyIpOwogICAgcHVzaCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN0cmluZ1BhcnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlN0cmluZ1BhcnQiKTsKICAgIHB1c2godG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRMaXRlcmFsU3RyaW5nKGludCBpbnRlcnBvbGF0aW9uQ291bnQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRMaXRlcmFsU3RyaW5nIik7CiAgICBpZiAoaW50ZXJwb2xhdGlvbkNvdW50ID09IDApIHsKICAgICAgVG9rZW4gdG9rZW4gPSBwb3AoKTsKICAgICAgU3RyaW5nIHZhbHVlID0gdW5lc2NhcGVTdHJpbmcodG9rZW4ubGV4ZW1lLCB0b2tlbiwgdGhpcyk7CiAgICAgIHB1c2goZm9yZXN0LmxpdGVyYWxTdHJpbmcodmFsdWUsIHRva2VuKSk7CiAgICB9IGVsc2UgewogICAgICBpbnQgY291bnQgPSAxICsgaW50ZXJwb2xhdGlvbkNvdW50ICogMjsKICAgICAgTGlzdDxPYmplY3Q+IHBhcnRzID0gY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8T2JqZWN0PigpLnBvcChzdGFjaywgY291bnQpOwogICAgICBpZiAocGFydHMgPT0gbnVsbCkgewogICAgICAgIHB1c2gobmV3IFBhcnNlclJlY292ZXJ5KGVuZFRva2VuLmNoYXJPZmZzZXQpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgVG9rZW4gZmlyc3QgPSBwYXJ0cy5maXJzdDsKICAgICAgVG9rZW4gbGFzdCA9IHBhcnRzLmxhc3Q7CiAgICAgIFF1b3RlIHF1b3RlID0gYW5hbHl6ZVF1b3RlKGZpcnN0LmxleGVtZSk7CiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSA8RXhwcmVzc2lvbj5bXTsKICAgICAgLy8gQ29udGFpbnMgbW9yZSB0aGFuIGp1c3QgXCcgb3IgXCIuCiAgICAgIGlmIChmaXJzdC5sZXhlbWUubGVuZ3RoID4gMSkgewogICAgICAgIFN0cmluZyB2YWx1ZSA9CiAgICAgICAgICAgIHVuZXNjYXBlRmlyc3RTdHJpbmdQYXJ0KGZpcnN0LmxleGVtZSwgcXVvdGUsIGZpcnN0LCB0aGlzKTsKICAgICAgICBpZiAodmFsdWUuaXNOb3RFbXB0eSkgewogICAgICAgICAgZXhwcmVzc2lvbnMuYWRkKGZvcmVzdC5saXRlcmFsU3RyaW5nKHZhbHVlLCBmaXJzdCkpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGludCBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgIE9iamVjdCBwYXJ0ID0gcGFydHNbaV07CiAgICAgICAgaWYgKHBhcnQgaXMgVG9rZW4pIHsKICAgICAgICAgIGlmIChwYXJ0LmxleGVtZS5sZW5ndGggIT0gMCkgewogICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSB1bmVzY2FwZShwYXJ0LmxleGVtZSwgcXVvdGUsIHBhcnQsIHRoaXMpOwogICAgICAgICAgICBleHByZXNzaW9ucy5hZGQoZm9yZXN0LmxpdGVyYWxTdHJpbmcodmFsdWUsIHBhcnQpKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZXhwcmVzc2lvbnMuYWRkKHRvVmFsdWUocGFydCkpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBDb250YWlucyBtb3JlIHRoYW4ganVzdCBcJyBvciBcIi4KICAgICAgaWYgKGxhc3QubGV4ZW1lLmxlbmd0aCA+IDEpIHsKICAgICAgICBTdHJpbmcgdmFsdWUgPSB1bmVzY2FwZUxhc3RTdHJpbmdQYXJ0KAogICAgICAgICAgICBsYXN0LmxleGVtZSwgcXVvdGUsIGxhc3QsIGxhc3QuaXNTeW50aGV0aWMsIHRoaXMpOwogICAgICAgIGlmICh2YWx1ZS5pc05vdEVtcHR5KSB7CiAgICAgICAgICBleHByZXNzaW9ucy5hZGQoZm9yZXN0LmxpdGVyYWxTdHJpbmcodmFsdWUsIGxhc3QpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcHVzaChmb3Jlc3Quc3RyaW5nQ29uY2F0ZW5hdGlvbkV4cHJlc3Npb24oZXhwcmVzc2lvbnMsIGVuZFRva2VuKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUNsYXVzZShUb2tlbiBuYXRpdmVUb2tlbiwgYm9vbCBoYXNOYW1lKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYXRpdmVDbGF1c2UiKTsKICAgIGlmIChoYXNOYW1lKSB7CiAgICAgIGZvcmVzdC5hc0xpdGVyYWxTdHJpbmcocG9wKCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTY3JpcHQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlNjcmlwdCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdHJpbmdKdXh0YXBvc2l0aW9uKGludCBsaXRlcmFsQ291bnQpIHsKICAgIGRlYnVnRXZlbnQoIlN0cmluZ0p1eHRhcG9zaXRpb24iKTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gcGFydHMgPSBwb3BMaXN0Rm9yVmFsdWUobGl0ZXJhbENvdW50KTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnM7CiAgICAvLyBGbGF0dGVuIHN0cmluZyBqdXh0YXBvc2l0aW9ucyBvZiBzdHJpbmcgaW50ZXJwb2xhdGlvbi4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgRXhwcmVzc2lvbiBwYXJ0ID0gcGFydHNbaV07CiAgICAgIGlmIChwYXJ0IGlzIFN0cmluZ0NvbmNhdGVuYXRpb24pIHsKICAgICAgICBpZiAoZXhwcmVzc2lvbnMgPT0gbnVsbCkgewogICAgICAgICAgZXhwcmVzc2lvbnMgPSBwYXJ0cy5zdWJsaXN0KDAsIGkpOwogICAgICAgIH0KICAgICAgICBmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBwYXJ0LmV4cHJlc3Npb25zKSB7CiAgICAgICAgICBleHByZXNzaW9ucy5hZGQoZXhwcmVzc2lvbik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChleHByZXNzaW9ucyAhPSBudWxsKSB7CiAgICAgICAgICBleHByZXNzaW9ucy5hZGQocGFydCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBwdXNoKGZvcmVzdC5zdHJpbmdDb25jYXRlbmF0aW9uRXhwcmVzc2lvbihleHByZXNzaW9ucyA/PyBwYXJ0cywgbnVsbCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMaXRlcmFsSW50KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJMaXRlcmFsSW50Iik7CiAgICBpbnQgdmFsdWUgPSBpbnQudHJ5UGFyc2UodG9rZW4ubGV4ZW1lKTsKICAgIGlmIChsZWdhY3lNb2RlKSB7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgcHVzaCh1bmhhbmRsZWQoCiAgICAgICAgICAgICdsYXJnZSBpbnRlZ2VyJywgJ2hhbmRsZUxpdGVyYWxJbnQnLCB0b2tlbi5jaGFyT2Zmc2V0LCB1cmkpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwdXNoKGZvcmVzdC5saXRlcmFsSW50KHZhbHVlLCB0b2tlbikpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIFBvc3Rwb25lIHBhcnNpbmcgb2YgbGl0ZXJhbHMgcmVzdWx0aW5nIGluIGEgbmVnYXRpdmUgdmFsdWUKICAgIC8vIChoZXggbGl0ZXJhbHMgPj0gMl42MykuIFRoZXNlIGFyZSBvbmx5IGFsbG93ZWQgd2hlbiBub3QgbmVnYXRlZC4KICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlIDwgMCkgewogICAgICBwdXNoKGZvcmVzdC5saXRlcmFsTGFyZ2VJbnQodG9rZW4ubGV4ZW1lLCB0b2tlbikpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChmb3Jlc3QubGl0ZXJhbEludCh2YWx1ZSwgdG9rZW4pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHkoVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJFeHByZXNzaW9uRnVuY3Rpb25Cb2R5Iik7CiAgICBlbmRCbG9ja0Z1bmN0aW9uQm9keSgwLCBudWxsLCBzZW1pY29sb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KFRva2VuIGFycm93VG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJFeHByZXNzaW9uRnVuY3Rpb25Cb2R5Iik7CiAgICBlbmRSZXR1cm5TdGF0ZW1lbnQodHJ1ZSwgYXJyb3dUb2tlbi5uZXh0LCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFJldHVyblN0YXRlbWVudCgKICAgICAgYm9vbCBoYXNFeHByZXNzaW9uLCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiUmV0dXJuU3RhdGVtZW50Iik7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBoYXNFeHByZXNzaW9uID8gcG9wRm9yVmFsdWUoKSA6IG51bGw7CiAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsICYmIGluQ29uc3RydWN0b3IpIHsKICAgICAgcHVzaChidWlsZFByb2JsZW1TdGF0ZW1lbnQoCiAgICAgICAgICBmYXN0YS5tZXNzYWdlQ29uc3RydWN0b3JXaXRoUmV0dXJuVHlwZSwgYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0KSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKGZvcmVzdC5yZXR1cm5TdGF0ZW1lbnQoYmVnaW5Ub2tlbiwgZXhwcmVzc2lvbiwgZW5kVG9rZW4pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UaGVuU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBlbnRlclRoZW5Gb3JUeXBlUHJvbW90aW9uKGNvbmRpdGlvbik7CiAgICBwdXNoKGNvbmRpdGlvbik7CiAgICBzdXBlci5iZWdpblRoZW5TdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUaGVuU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICB0eXBlUHJvbW90ZXI/LmVudGVyRWxzZSgpOwogICAgc3VwZXIuZW5kVGhlblN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZElmU3RhdGVtZW50KFRva2VuIGlmVG9rZW4sIFRva2VuIGVsc2VUb2tlbikgewogICAgU3RhdGVtZW50IGVsc2VQYXJ0ID0gcG9wU3RhdGVtZW50SWZOb3ROdWxsKGVsc2VUb2tlbik7CiAgICBTdGF0ZW1lbnQgdGhlblBhcnQgPSBwb3BTdGF0ZW1lbnQoKTsKICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0gcG9wKCk7CiAgICB0eXBlUHJvbW90ZXI/LmV4aXRDb25kaXRpb25hbCgpOwogICAgcHVzaChmb3Jlc3QuaWZTdGF0ZW1lbnQoaWZUb2tlbiwgY29uZGl0aW9uLCB0aGVuUGFydCwgZWxzZVRva2VuLCBlbHNlUGFydCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRWYXJpYWJsZUluaXRpYWxpemVyKFRva2VuIGFzc2lnbm1lbnRPcGVyYXRvcikgewogICAgZGVidWdFdmVudCgiVmFyaWFibGVJbml0aWFsaXplciIpOwogICAgYXNzZXJ0KGFzc2lnbm1lbnRPcGVyYXRvci5zdHJpbmdWYWx1ZSA9PSAiPSIpOwogICAgcHVzaE5ld0xvY2FsVmFyaWFibGUocG9wRm9yVmFsdWUoKSwgZXF1YWxzVG9rZW46IGFzc2lnbm1lbnRPcGVyYXRvcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVmFyaWFibGVJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9WYXJpYWJsZUluaXRpYWxpemVyIik7CiAgICBib29sIGlzQ29uc3QgPSAoY3VycmVudExvY2FsVmFyaWFibGVNb2RpZmllcnMgJiBjb25zdE1hc2spICE9IDA7CiAgICBib29sIGlzRmluYWwgPSAoY3VycmVudExvY2FsVmFyaWFibGVNb2RpZmllcnMgJiBmaW5hbE1hc2spICE9IDA7CiAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyOwogICAgaWYgKCFvcHRpb25hbCgiaW4iLCB0b2tlbikpIHsKICAgICAgLy8gQSBmb3ItaW4gbG9vcC12YXJpYWJsZSBjYW4ndCBoYXZlIGFuIGluaXRpYWxpemVyLiBTbyBsZXQncyByZW1haW4KICAgICAgLy8gc2lsZW50IGlmIHRoZSBuZXh0IHRva2VuIGlzIGBpbmAuIFNpbmNlIGEgZm9yLWluIGxvb3AgY2FuIG9ubHkgaGF2ZQogICAgICAvLyBvbmUgdmFyaWFibGUgaXQgbXVzdCBiZSBmb2xsb3dlZCBieSBgaW5gLgogICAgICBpZiAoaXNDb25zdCkgewogICAgICAgIGluaXRpYWxpemVyID0gYnVpbGRQcm9ibGVtKAogICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUNvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXIKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHRva2VuLmxleGVtZSksCiAgICAgICAgICAgIHRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICAgIHRva2VuLmxlbmd0aCk7CiAgICAgIH0gZWxzZSBpZiAoaXNGaW5hbCkgewogICAgICAgIGluaXRpYWxpemVyID0gYnVpbGRQcm9ibGVtKAogICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUZpbmFsRmllbGRXaXRob3V0SW5pdGlhbGl6ZXIKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHRva2VuLmxleGVtZSksCiAgICAgICAgICAgIHRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICAgIHRva2VuLmxlbmd0aCk7CiAgICAgIH0KICAgIH0KICAgIHB1c2hOZXdMb2NhbFZhcmlhYmxlKGluaXRpYWxpemVyKTsKICB9CgogIHZvaWQgcHVzaE5ld0xvY2FsVmFyaWFibGUoRXhwcmVzc2lvbiBpbml0aWFsaXplciwge1Rva2VuIGVxdWFsc1Rva2VufSkgewogICAgT2JqZWN0IG5vZGUgPSBwb3AoKTsKICAgIGlmIChub2RlIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gobm9kZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIElkZW50aWZpZXIgaWRlbnRpZmllciA9IG5vZGU7CiAgICBhc3NlcnQoY3VycmVudExvY2FsVmFyaWFibGVNb2RpZmllcnMgIT0gLTEpOwogICAgYm9vbCBpc0NvbnN0ID0gKGN1cnJlbnRMb2NhbFZhcmlhYmxlTW9kaWZpZXJzICYgY29uc3RNYXNrKSAhPSAwOwogICAgYm9vbCBpc0ZpbmFsID0gKGN1cnJlbnRMb2NhbFZhcmlhYmxlTW9kaWZpZXJzICYgZmluYWxNYXNrKSAhPSAwOwogICAgYXNzZXJ0KGlzQ29uc3QgPT0gKGNvbnN0YW50Q29udGV4dCA9PSBDb25zdGFudENvbnRleHQuaW5mZXJyZWQpKTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50KAogICAgICAgIGlkZW50aWZpZXIubmFtZSwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwsCiAgICAgICAgZm9yU3ludGhldGljVG9rZW46IGRlcHJlY2F0ZWRfZXh0cmFjdFRva2VuKGlkZW50aWZpZXIpLmlzU3ludGhldGljLAogICAgICAgIGluaXRpYWxpemVyOiBpbml0aWFsaXplciwKICAgICAgICB0eXBlOiBidWlsZERhcnRUeXBlKGN1cnJlbnRMb2NhbFZhcmlhYmxlVHlwZSksCiAgICAgICAgaXNGaW5hbDogaXNGaW5hbCwKICAgICAgICBpc0NvbnN0OiBpc0NvbnN0KQogICAgICAuLmZpbGVPZmZzZXQgPSBpZGVudGlmaWVyLmNoYXJPZmZzZXQKICAgICAgLi5maWxlRXF1YWxzT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4oZXF1YWxzVG9rZW4pOwogICAgbGlicmFyeS5jaGVja0JvdW5kc0luVmFyaWFibGVEZWNsYXJhdGlvbih2YXJpYWJsZSwgdHlwZUVudmlyb25tZW50LCB1cmkpOwogICAgcHVzaCh2YXJpYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRmllbGRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgaW5GaWVsZEluaXRpYWxpemVyID0gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRmllbGRJbml0aWFsaXplcihUb2tlbiBhc3NpZ25tZW50T3BlcmF0b3IsIFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGaWVsZEluaXRpYWxpemVyIik7CiAgICBpbkZpZWxkSW5pdGlhbGl6ZXIgPSBmYWxzZTsKICAgIGFzc2VydChhc3NpZ25tZW50T3BlcmF0b3Iuc3RyaW5nVmFsdWUgPT0gIj0iKTsKICAgIHB1c2gocG9wRm9yVmFsdWUoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRmllbGRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9GaWVsZEluaXRpYWxpemVyIik7CiAgICBpZiAoY29uc3RhbnRDb250ZXh0ID09IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZCkgewogICAgICAvLyBDcmVhdGluZyBhIG51bGwgdmFsdWUgdG8gcHJldmVudCB0aGUgRGFydCBWTSBmcm9tIGNyYXNoaW5nLgogICAgICBwdXNoKGZvcmVzdC5saXRlcmFsTnVsbCh0b2tlbikpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChOdWxsVmFsdWUuRmllbGRJbml0aWFsaXplcik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEluaXRpYWxpemVkSWRlbnRpZmllcihUb2tlbiBuYW1lVG9rZW4pIHsKICAgIC8vIFRPRE8oYWhlKTogVXNlIFtJbml0aWFsaXplZElkZW50aWZpZXJdIGhlcmU/CiAgICBkZWJ1Z0V2ZW50KCJJbml0aWFsaXplZElkZW50aWZpZXIiKTsKICAgIE9iamVjdCBub2RlID0gcG9wKCk7CiAgICBpZiAobm9kZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKG5vZGUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gbm9kZTsKICAgIHZhcmlhYmxlLmZpbGVPZmZzZXQgPSBuYW1lVG9rZW4uY2hhck9mZnNldDsKICAgIHB1c2godmFyaWFibGUpOwogICAgZGVjbGFyZVZhcmlhYmxlKHZhcmlhYmxlLCBzY29wZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVmFyaWFibGVzRGVjbGFyYXRpb24oCiAgICAgIFRva2VuIHRva2VuLCBUb2tlbiBsYXRlVG9rZW4sIFRva2VuIHZhckZpbmFsT3JDb25zdCkgewogICAgZGVidWdFdmVudCgiYmVnaW5WYXJpYWJsZXNEZWNsYXJhdGlvbiIpOwogICAgLy8gVE9ETyhkYW5ydWJlbCk6IGhhbmRsZSBOTkJEICdsYXRlJyBtb2RpZmllcgogICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlTm9uTnVsbGFibGUpIHsKICAgICAgcmVwb3J0Tm9uTnVsbGFibGVNb2RpZmllckVycm9yKGxhdGVUb2tlbik7CiAgICB9CiAgICBVbnJlc29sdmVkVHlwZSB0eXBlID0gcG9wKCk7CiAgICBpbnQgbW9kaWZpZXJzID0gTW9kaWZpZXIudmFsaWRhdGVWYXJGaW5hbE9yQ29uc3QodmFyRmluYWxPckNvbnN0Py5sZXhlbWUpOwogICAgc3VwZXIucHVzaChjdXJyZW50TG9jYWxWYXJpYWJsZU1vZGlmaWVycyk7CiAgICBzdXBlci5wdXNoKGN1cnJlbnRMb2NhbFZhcmlhYmxlVHlwZSA/PyBOdWxsVmFsdWUuVHlwZSk7CiAgICBjdXJyZW50TG9jYWxWYXJpYWJsZVR5cGUgPSB0eXBlOwogICAgY3VycmVudExvY2FsVmFyaWFibGVNb2RpZmllcnMgPSBtb2RpZmllcnM7CiAgICBzdXBlci5wdXNoKGNvbnN0YW50Q29udGV4dCk7CiAgICBjb25zdGFudENvbnRleHQgPSAoKG1vZGlmaWVycyAmIGNvbnN0TWFzaykgIT0gMCkKICAgICAgICA/IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZAogICAgICAgIDogQ29uc3RhbnRDb250ZXh0Lm5vbmU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFZhcmlhYmxlc0RlY2xhcmF0aW9uKGludCBjb3VudCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlZhcmlhYmxlc0RlY2xhcmF0aW9uIik7CiAgICBpZiAoY291bnQgPT0gMSkgewogICAgICBPYmplY3Qgbm9kZSA9IHBvcCgpOwogICAgICBjb25zdGFudENvbnRleHQgPSBwb3AoKTsKICAgICAgY3VycmVudExvY2FsVmFyaWFibGVUeXBlID0gcG9wKCk7CiAgICAgIGN1cnJlbnRMb2NhbFZhcmlhYmxlTW9kaWZpZXJzID0gcG9wKCk7CiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSBwb3AoKTsKICAgICAgaWYgKG5vZGUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgICBwdXNoKG5vZGUpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gbm9kZTsKICAgICAgaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXJpYWJsZS5hZGRBbm5vdGF0aW9uKGFubm90YXRpb25zW2ldKTsKICAgICAgICB9CiAgICAgICAgKHZhcmlhYmxlc1dpdGhNZXRhZGF0YSA/Pz0gPFZhcmlhYmxlRGVjbGFyYXRpb24+W10pLmFkZCh2YXJpYWJsZSk7CiAgICAgIH0KICAgICAgcHVzaCh2YXJpYWJsZSk7CiAgICB9IGVsc2UgewogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcyA9CiAgICAgICAgICBjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPigpLnBvcChzdGFjaywgY291bnQpOwogICAgICBjb25zdGFudENvbnRleHQgPSBwb3AoKTsKICAgICAgY3VycmVudExvY2FsVmFyaWFibGVUeXBlID0gcG9wKCk7CiAgICAgIGN1cnJlbnRMb2NhbFZhcmlhYmxlTW9kaWZpZXJzID0gcG9wKCk7CiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSBwb3AoKTsKICAgICAgaWYgKHZhcmlhYmxlcyA9PSBudWxsKSB7CiAgICAgICAgcHVzaChuZXcgUGFyc2VyUmVjb3Zlcnkob2Zmc2V0Rm9yVG9rZW4oZW5kVG9rZW4pKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBmaXJzdCA9IHZhcmlhYmxlcy5maXJzdDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBmaXJzdC5hZGRBbm5vdGF0aW9uKGFubm90YXRpb25zW2ldKTsKICAgICAgICB9CiAgICAgICAgKG11bHRpVmFyaWFibGVzV2l0aE1ldGFkYXRhID8/PSA8TGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPj5bXSkKICAgICAgICAgICAgLmFkZCh2YXJpYWJsZXMpOwogICAgICB9CiAgICAgIHB1c2goZm9yZXN0LnZhcmlhYmxlc0RlY2xhcmF0aW9uKHZhcmlhYmxlcywgdXJpKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEJsb2NrKGludCBjb3VudCwgVG9rZW4gb3BlbkJyYWNlLCBUb2tlbiBjbG9zZUJyYWNlKSB7CiAgICBkZWJ1Z0V2ZW50KCJCbG9jayIpOwogICAgU3RhdGVtZW50IGJsb2NrID0gcG9wQmxvY2soY291bnQsIG9wZW5CcmFjZSwgY2xvc2VCcmFjZSk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgcHVzaChibG9jayk7CiAgfQoKICB2b2lkIGhhbmRsZUludmFsaWRUb3BMZXZlbEJsb2NrKFRva2VuIHRva2VuKSB7CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgaW1wcm92ZWQgcmVjb3ZlcnkgYnkgYWRkaW5nIHRoaXMgYmxvY2sKICAgIC8vIGFzIHBhcnQgb2YgYSBzeW50aGV0aWMgdG9wIGxldmVsIGZ1bmN0aW9uLgogICAgcG9wKCk7IC8vIGJsb2NrCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUFzc2lnbm1lbnRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJBc3NpZ25tZW50RXhwcmVzc2lvbiIpOwogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IHBvcEZvclZhbHVlKCk7CiAgICBPYmplY3QgZ2VuZXJhdG9yID0gcG9wKCk7CiAgICBpZiAoZ2VuZXJhdG9yIGlzISBHZW5lcmF0b3IpIHsKICAgICAgcHVzaChidWlsZFByb2JsZW0oZmFzdGEubWVzc2FnZU5vdEFuTHZhbHVlLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICBsZW5ndGhGb3JUb2tlbih0b2tlbikpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobmV3IERlbGF5ZWRBc3NpZ25tZW50KAogICAgICAgICAgdGhpcywgdG9rZW4sIGdlbmVyYXRvciwgdmFsdWUsIHRva2VuLnN0cmluZ1ZhbHVlKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVudGVyTG9vcChpbnQgY2hhck9mZnNldCkgewogICAgaWYgKHBlZWsoKSBpcyBMYWJlbFRhcmdldCkgewogICAgICBMYWJlbFRhcmdldCB0YXJnZXQgPSBwZWVrKCk7CiAgICAgIGVudGVyQnJlYWtUYXJnZXQoY2hhck9mZnNldCwgdGFyZ2V0LmJyZWFrVGFyZ2V0KTsKICAgICAgZW50ZXJDb250aW51ZVRhcmdldChjaGFyT2Zmc2V0LCB0YXJnZXQuY29udGludWVUYXJnZXQpOwogICAgfSBlbHNlIHsKICAgICAgZW50ZXJCcmVha1RhcmdldChjaGFyT2Zmc2V0KTsKICAgICAgZW50ZXJDb250aW51ZVRhcmdldChjaGFyT2Zmc2V0KTsKICAgIH0KICB9CgogIHZvaWQgZXhpdExvb3BPclN3aXRjaChTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICBpZiAocHJvYmxlbUluTG9vcE9yU3dpdGNoICE9IG51bGwpIHsKICAgICAgcHVzaChwcm9ibGVtSW5Mb29wT3JTd2l0Y2gpOwogICAgICBwcm9ibGVtSW5Mb29wT3JTd2l0Y2ggPSBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChzdGF0ZW1lbnQpOwogICAgfQogIH0KCiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBidWlsZFZhcmlhYmxlRGVjbGFyYXRpb25zKHZhcmlhYmxlT3JFeHByZXNzaW9uKSB7CiAgICAvLyBUT0RPKGFoZSk6IFRoaXMgY2FuIGJlIHNpbXBsaWZpZWQgbm93IHRoYXQgd2UgaGF2ZSB0aGUgZXZlbnRzCiAgICAvLyBgaGFuZGxlRm9ySW5pdGlhbGl6ZXIuLi5gIGV2ZW50cy4KICAgIGlmICh2YXJpYWJsZU9yRXhwcmVzc2lvbiBpcyBHZW5lcmF0b3IpIHsKICAgICAgdmFyaWFibGVPckV4cHJlc3Npb24gPSB2YXJpYWJsZU9yRXhwcmVzc2lvbi5idWlsZEZvckVmZmVjdCgpOwogICAgfQogICAgaWYgKHZhcmlhYmxlT3JFeHByZXNzaW9uIGlzIFZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgcmV0dXJuIDxWYXJpYWJsZURlY2xhcmF0aW9uPlt2YXJpYWJsZU9yRXhwcmVzc2lvbl07CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlT3JFeHByZXNzaW9uIGlzIEV4cHJlc3Npb24pIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQuZm9yRWZmZWN0KAogICAgICAgICAgdmFyaWFibGVPckV4cHJlc3Npb24sIGZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKICAgICAgcmV0dXJuIDxWYXJpYWJsZURlY2xhcmF0aW9uPlt2YXJpYWJsZV07CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlT3JFeHByZXNzaW9uIGlzIEV4cHJlc3Npb25TdGF0ZW1lbnQpIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQuZm9yRWZmZWN0KAogICAgICAgICAgdmFyaWFibGVPckV4cHJlc3Npb24uZXhwcmVzc2lvbiwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpOwogICAgICByZXR1cm4gPFZhcmlhYmxlRGVjbGFyYXRpb24+W3ZhcmlhYmxlXTsKICAgIH0gZWxzZSBpZiAoZm9yZXN0LmlzVmFyaWFibGVzRGVjbGFyYXRpb24odmFyaWFibGVPckV4cHJlc3Npb24pKSB7CiAgICAgIHJldHVybiBmb3Jlc3QKICAgICAgICAgIC52YXJpYWJsZXNEZWNsYXJhdGlvbkV4dHJhY3REZWNsYXJhdGlvbnModmFyaWFibGVPckV4cHJlc3Npb24pOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZU9yRXhwcmVzc2lvbiBpcyBMaXN0PE9iamVjdD4pIHsKICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMgPSA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXTsKICAgICAgZm9yIChPYmplY3QgdiBpbiB2YXJpYWJsZU9yRXhwcmVzc2lvbikgewogICAgICAgIHZhcmlhYmxlcy5hZGRBbGwoYnVpbGRWYXJpYWJsZURlY2xhcmF0aW9ucyh2KSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHZhcmlhYmxlczsKICAgIH0gZWxzZSBpZiAodmFyaWFibGVPckV4cHJlc3Npb24gPT0gbnVsbCkgewogICAgICByZXR1cm4gPFZhcmlhYmxlRGVjbGFyYXRpb24+W107CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ySW5pdGlhbGl6ZXJFbXB0eVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiRm9ySW5pdGlhbGl6ZXJFbXB0eVN0YXRlbWVudCIpOwogICAgcHVzaChOdWxsVmFsdWUuRXhwcmVzc2lvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZvckluaXRpYWxpemVyRXhwcmVzc2lvblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiRm9ySW5pdGlhbGl6ZXJFeHByZXNzaW9uU3RhdGVtZW50Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZvckluaXRpYWxpemVyTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JJbml0aWFsaXplckxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVGb3JMb29wUGFydHMoVG9rZW4gZm9yS2V5d29yZCwgVG9rZW4gbGVmdFBhcmVuLAogICAgICBUb2tlbiBsZWZ0U2VwYXJhdG9yLCBpbnQgdXBkYXRlRXhwcmVzc2lvbkNvdW50KSB7CiAgICBwdXNoKGZvcktleXdvcmQpOwogICAgcHVzaChsZWZ0UGFyZW4pOwogICAgcHVzaChsZWZ0U2VwYXJhdG9yKTsKICAgIHB1c2godXBkYXRlRXhwcmVzc2lvbkNvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9yQ29udHJvbEZsb3coVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZvckNvbnRyb2xGbG93Iik7CiAgICB2YXIgZW50cnkgPSBwb3AoKTsKICAgIGludCB1cGRhdGVFeHByZXNzaW9uQ291bnQgPSBwb3AoKTsKICAgIHBvcCgpOyAvLyBsZWZ0IHNlcGFyYXRvcgogICAgcG9wKCk7IC8vIGxlZnQgcGFyZW50aGVzaXMKICAgIFRva2VuIGZvclRva2VuID0gcG9wKCk7CiAgICBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZXMgPSBwb3BMaXN0Rm9yRWZmZWN0KHVwZGF0ZUV4cHJlc3Npb25Db3VudCk7CiAgICBTdGF0ZW1lbnQgY29uZGl0aW9uU3RhdGVtZW50ID0gcG9wU3RhdGVtZW50KCk7IC8vIGNvbmRpdGlvbgogICAgT2JqZWN0IHZhcmlhYmxlT3JFeHByZXNzaW9uID0gcG9wKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwoKICAgIGlmICghbGlicmFyeS5sb2FkZXIudGFyZ2V0LmVuYWJsZUNvbnRyb2xGbG93Q29sbGVjdGlvbnMpIHsKICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IFJlcG9ydCBhIG1vcmUgdXNlciBmcmllbmRseSBlcnJvciBtZXNzYWdlCiAgICAgIC8vIHdoZW4gYW4gZXhwZXJpbWVudCBpcyBub3QgZW5hYmxlZAogICAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4ud2l0aEFyZ3VtZW50cyhmb3JUb2tlbiksCiAgICAgICAgICBmb3JUb2tlbiwKICAgICAgICAgIGZvclRva2VuKTsKICAgICAgcHVzaChpbnZhbGlkQ29sbGVjdGlvbkVsZW1lbnQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSkgewogICAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgZmFzdGEudGVtcGxhdGVDYW50VXNlQ29udHJvbEZsb3dPclNwcmVhZEFzQ29uc3RhbnQKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmb3JUb2tlbiksCiAgICAgICAgICBmb3JUb2tlbiwKICAgICAgICAgIGZvclRva2VuKTsKICAgICAgcHVzaChpbnZhbGlkQ29sbGVjdGlvbkVsZW1lbnQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdHJhbnNmb3JtQ29sbGVjdGlvbnMgPSB0cnVlOwogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMgPQogICAgICAgIGJ1aWxkVmFyaWFibGVEZWNsYXJhdGlvbnModmFyaWFibGVPckV4cHJlc3Npb24pOwogICAgRXhwcmVzc2lvbiBjb25kaXRpb247CiAgICBpZiAoZm9yZXN0LmlzRXhwcmVzc2lvblN0YXRlbWVudChjb25kaXRpb25TdGF0ZW1lbnQpKSB7CiAgICAgIGNvbmRpdGlvbiA9CiAgICAgICAgICBmb3Jlc3QuZ2V0RXhwcmVzc2lvbkZyb21FeHByZXNzaW9uU3RhdGVtZW50KGNvbmRpdGlvblN0YXRlbWVudCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoZm9yZXN0LmlzRW1wdHlTdGF0ZW1lbnQoY29uZGl0aW9uU3RhdGVtZW50KSk7CiAgICB9CiAgICBpZiAoZW50cnkgaXMgTWFwRW50cnkpIHsKICAgICAgcHVzaChmb3Jlc3QuZm9yTWFwRW50cnkodmFyaWFibGVzLCBjb25kaXRpb24sIHVwZGF0ZXMsIGVudHJ5LCBmb3JUb2tlbikpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChmb3Jlc3QuZm9yRWxlbWVudCgKICAgICAgICAgIHZhcmlhYmxlcywgY29uZGl0aW9uLCB1cGRhdGVzLCB0b1ZhbHVlKGVudHJ5KSwgZm9yVG9rZW4pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9yU3RhdGVtZW50KFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JTdGF0ZW1lbnQiKTsKICAgIFN0YXRlbWVudCBib2R5ID0gcG9wU3RhdGVtZW50KCk7CgogICAgaW50IHVwZGF0ZUV4cHJlc3Npb25Db3VudCA9IHBvcCgpOwogICAgVG9rZW4gbGVmdFNlcGFyYXRvciA9IHBvcCgpOwogICAgVG9rZW4gbGVmdFBhcmVuID0gcG9wKCk7CiAgICBUb2tlbiBmb3JLZXl3b3JkID0gcG9wKCk7CgogICAgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGVzID0gcG9wTGlzdEZvckVmZmVjdCh1cGRhdGVFeHByZXNzaW9uQ291bnQpOwogICAgU3RhdGVtZW50IGNvbmRpdGlvblN0YXRlbWVudCA9IHBvcFN0YXRlbWVudCgpOwogICAgT2JqZWN0IHZhcmlhYmxlT3JFeHByZXNzaW9uID0gcG9wKCk7CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcyA9CiAgICAgICAgYnVpbGRWYXJpYWJsZURlY2xhcmF0aW9ucyh2YXJpYWJsZU9yRXhwcmVzc2lvbik7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgSnVtcFRhcmdldCBjb250aW51ZVRhcmdldCA9IGV4aXRDb250aW51ZVRhcmdldCgpOwogICAgSnVtcFRhcmdldCBicmVha1RhcmdldCA9IGV4aXRCcmVha1RhcmdldCgpOwogICAgaWYgKGNvbnRpbnVlVGFyZ2V0Lmhhc1VzZXJzKSB7CiAgICAgIGJvZHkgPSBmb3Jlc3Quc3ludGhldGljTGFiZWxlZFN0YXRlbWVudChib2R5KTsKICAgICAgY29udGludWVUYXJnZXQucmVzb2x2ZUNvbnRpbnVlcyhmb3Jlc3QsIGJvZHkpOwogICAgfQogICAgRXhwcmVzc2lvbiBjb25kaXRpb247CiAgICBpZiAoZm9yZXN0LmlzRXhwcmVzc2lvblN0YXRlbWVudChjb25kaXRpb25TdGF0ZW1lbnQpKSB7CiAgICAgIGNvbmRpdGlvbiA9CiAgICAgICAgICBmb3Jlc3QuZ2V0RXhwcmVzc2lvbkZyb21FeHByZXNzaW9uU3RhdGVtZW50KGNvbmRpdGlvblN0YXRlbWVudCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoZm9yZXN0LmlzRW1wdHlTdGF0ZW1lbnQoY29uZGl0aW9uU3RhdGVtZW50KSk7CiAgICB9CiAgICBTdGF0ZW1lbnQgcmVzdWx0ID0gZm9yZXN0LmZvclN0YXRlbWVudCgKICAgICAgICBmb3JLZXl3b3JkLAogICAgICAgIGxlZnRQYXJlbiwKICAgICAgICB2YXJpYWJsZXMsCiAgICAgICAgbGVmdFNlcGFyYXRvciwKICAgICAgICBjb25kaXRpb24sCiAgICAgICAgY29uZGl0aW9uU3RhdGVtZW50LAogICAgICAgIHVwZGF0ZXMsCiAgICAgICAgbGVmdFBhcmVuLmVuZEdyb3VwLAogICAgICAgIGJvZHkpOwogICAgaWYgKGJyZWFrVGFyZ2V0Lmhhc1VzZXJzKSB7CiAgICAgIHJlc3VsdCA9IGZvcmVzdC5zeW50aGV0aWNMYWJlbGVkU3RhdGVtZW50KHJlc3VsdCk7CiAgICAgIGJyZWFrVGFyZ2V0LnJlc29sdmVCcmVha3MoZm9yZXN0LCByZXN1bHQpOwogICAgfQogICAgaWYgKHZhcmlhYmxlT3JFeHByZXNzaW9uIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHByb2JsZW1Jbkxvb3BPclN3aXRjaCA/Pz0gYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgZmFzdGEubWVzc2FnZVN5bnRoZXRpY1Rva2VuLCB2YXJpYWJsZU9yRXhwcmVzc2lvbi5jaGFyT2Zmc2V0LAogICAgICAgICAgc3VwcHJlc3NNZXNzYWdlOiB0cnVlKTsKICAgIH0KICAgIGV4aXRMb29wT3JTd2l0Y2gocmVzdWx0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQXdhaXRFeHByZXNzaW9uKFRva2VuIGtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJBd2FpdEV4cHJlc3Npb24iKTsKICAgIHB1c2goZm9yZXN0LmF3YWl0RXhwcmVzc2lvbihwb3BGb3JWYWx1ZSgpLCBrZXl3b3JkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEludmFsaWRBd2FpdEV4cHJlc3Npb24oCiAgICAgIFRva2VuIGtleXdvcmQsIFRva2VuIGVuZFRva2VuLCBmYXN0YS5NZXNzYWdlQ29kZSBlcnJvckNvZGUpIHsKICAgIGRlYnVnRXZlbnQoIkF3YWl0RXhwcmVzc2lvbiIpOwogICAgcG9wRm9yVmFsdWUoKTsKICAgIHB1c2goYnVpbGRQcm9ibGVtKGVycm9yQ29kZSwga2V5d29yZC5vZmZzZXQsIGtleXdvcmQubGVuZ3RoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUFzeW5jTW9kaWZpZXIoVG9rZW4gYXN5bmNUb2tlbiwgVG9rZW4gc3RhclRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJBc3luY01vZGlmaWVyIik7CiAgICBwdXNoKGFzeW5jTWFya2VyRnJvbVRva2Vucyhhc3luY1Rva2VuLCBzdGFyVG9rZW4pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGl0ZXJhbExpc3QoCiAgICAgIGludCBjb3VudCwgVG9rZW4gbGVmdEJyYWNrZXQsIFRva2VuIGNvbnN0S2V5d29yZCwgVG9rZW4gcmlnaHRCcmFja2V0KSB7CiAgICBkZWJ1Z0V2ZW50KCJMaXRlcmFsTGlzdCIpOwoKICAgIC8vIFRPRE8oZGFucnViZWwpOiBSZXBsYWNlIHRoaXMgd2l0aCBwb3BMaXN0Rm9yVmFsdWUKICAgIC8vIHdoZW4gY29udHJvbCBmbG93IGFuZCBzcHJlYWQgY29sbGVjdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgZGVmYXVsdAogICAgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9CiAgICAgICAgbmV3IExpc3Q8RXhwcmVzc2lvbj4uZmlsbGVkKGNvdW50LCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkgewogICAgICB2YXIgZWxlbSA9IHBvcCgpOwogICAgICBpZiAoZWxlbSAhPSBpbnZhbGlkQ29sbGVjdGlvbkVsZW1lbnQpIHsKICAgICAgICBleHByZXNzaW9uc1tpXSA9IHRvVmFsdWUoZWxlbSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXhwcmVzc2lvbnMucmVtb3ZlQXQoaSk7CiAgICAgIH0KICAgIH0KCiAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPiB0eXBlQXJndW1lbnRzID0gcG9wKCk7CgogICAgRGFydFR5cGUgdHlwZUFyZ3VtZW50OwogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CiAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgZmFzdGEubWVzc2FnZUxpc3RMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMsCiAgICAgICAgICAgIG9mZnNldEZvclRva2VuKGxlZnRCcmFja2V0KSwKICAgICAgICAgICAgbGVuZ3RoT2ZTcGFuKGxlZnRCcmFja2V0LCBsZWZ0QnJhY2tldC5lbmRHcm91cCkpOwogICAgICAgIHR5cGVBcmd1bWVudCA9IGNvbnN0IEludmFsaWRUeXBlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHlwZUFyZ3VtZW50ID0gYnVpbGREYXJ0VHlwZSh0eXBlQXJndW1lbnRzLnNpbmdsZSk7CiAgICAgICAgaWYgKCFsZWdhY3lNb2RlKSB7CiAgICAgICAgICB0eXBlQXJndW1lbnQgPQogICAgICAgICAgICAgIGluc3RhbnRpYXRlVG9Cb3VuZHModHlwZUFyZ3VtZW50LCBjb3JlVHlwZXMub2JqZWN0Q2xhc3MpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdHlwZUFyZ3VtZW50ID0gaW1wbGljaXRUeXBlQXJndW1lbnQ7CiAgICB9CgogICAgRXhwcmVzc2lvbiBub2RlID0gZm9yZXN0LmxpdGVyYWxMaXN0KAogICAgICAgIGNvbnN0S2V5d29yZCwKICAgICAgICBjb25zdEtleXdvcmQgIT0gbnVsbCB8fCBjb25zdGFudENvbnRleHQgPT0gQ29uc3RhbnRDb250ZXh0LmluZmVycmVkLAogICAgICAgIHR5cGVBcmd1bWVudCwKICAgICAgICB0eXBlQXJndW1lbnRzLAogICAgICAgIGxlZnRCcmFja2V0LAogICAgICAgIGV4cHJlc3Npb25zLAogICAgICAgIHJpZ2h0QnJhY2tldCk7CiAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5MaXN0TGl0ZXJhbChub2RlLCB0eXBlRW52aXJvbm1lbnQsIHVyaSk7CiAgICBwdXNoKG5vZGUpOwogIH0KCiAgdm9pZCBidWlsZExpdGVyYWxTZXQoTGlzdDxVbnJlc29sdmVkVHlwZT4gdHlwZUFyZ3VtZW50cywgVG9rZW4gY29uc3RLZXl3b3JkLAogICAgICBUb2tlbiBsZWZ0QnJhY2UsIExpc3Q8ZHluYW1pYz4gc2V0T3JNYXBFbnRyaWVzKSB7CiAgICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQ7CiAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIHR5cGVBcmd1bWVudCA9IGJ1aWxkRGFydFR5cGUodHlwZUFyZ3VtZW50cy5zaW5nbGUpOwogICAgICBpZiAoIWxpYnJhcnkubG9hZGVyLnRhcmdldC5sZWdhY3lNb2RlKSB7CiAgICAgICAgdHlwZUFyZ3VtZW50ID0gaW5zdGFudGlhdGVUb0JvdW5kcyh0eXBlQXJndW1lbnQsIGNvcmVUeXBlcy5vYmplY3RDbGFzcyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHR5cGVBcmd1bWVudCA9IGltcGxpY2l0VHlwZUFyZ3VtZW50OwogICAgfQoKICAgIHZhciBleHByZXNzaW9ucyA9IDxFeHByZXNzaW9uPltdOwogICAgaWYgKHNldE9yTWFwRW50cmllcyAhPSBudWxsKSB7CiAgICAgIGZvciAodmFyIGVudHJ5IGluIHNldE9yTWFwRW50cmllcykgewogICAgICAgIGlmIChlbnRyeSBpcyBNYXBFbnRyeSkgewogICAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IHJlcG9ydCB0aGUgZXJyb3Igb24gdGhlIGNvbG9uCiAgICAgICAgICBhZGRQcm9ibGVtKGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnLCcpLAogICAgICAgICAgICAgIGVudHJ5LmZpbGVPZmZzZXQsIDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUmV2aXNlIG9uY2UgY29udHJvbCBmbG93IGFuZCBzcHJlYWQKICAgICAgICAgIC8vICBjb2xsZWN0aW9uIGVudHJpZXMgYXJlIHN1cHBvcnRlZC4KICAgICAgICAgIGV4cHJlc3Npb25zLmFkZChlbnRyeSBhcyBFeHByZXNzaW9uKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBFeHByZXNzaW9uIG5vZGUgPSBmb3Jlc3QubGl0ZXJhbFNldCgKICAgICAgICBjb25zdEtleXdvcmQsCiAgICAgICAgY29uc3RLZXl3b3JkICE9IG51bGwgfHwgY29uc3RhbnRDb250ZXh0ID09IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZCwKICAgICAgICB0eXBlQXJndW1lbnQsCiAgICAgICAgdHlwZUFyZ3VtZW50cywKICAgICAgICBsZWZ0QnJhY2UsCiAgICAgICAgZXhwcmVzc2lvbnMsCiAgICAgICAgbGVmdEJyYWNlLmVuZEdyb3VwKTsKICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJblNldExpdGVyYWwobm9kZSwgdHlwZUVudmlyb25tZW50LCB1cmkpOwogICAgcHVzaChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGl0ZXJhbFNldE9yTWFwKAogICAgaW50IGNvdW50LAogICAgVG9rZW4gbGVmdEJyYWNlLAogICAgVG9rZW4gY29uc3RLZXl3b3JkLAogICAgVG9rZW4gcmlnaHRCcmFjZSwKICAgIC8vIFRPRE8oZGFucnViZWwpOiBoYXNTZXRFbnRyeSBwYXJhbWV0ZXIgZXhpc3RzIGZvciByZXBsaWNhdGluZyBleGlzdGluZwogICAgLy8gYmVoYXZpb3IgYW5kIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHVuaWZpZWQgY29sbGVjdGlvbiBoYXMgYmVlbiBlbmFibGVkCiAgICBib29sIGhhc1NldEVudHJ5LAogICkgewogICAgZGVidWdFdmVudCgiTGl0ZXJhbFNldE9yTWFwIik7CgogICAgdmFyIHNldE9yTWFwRW50cmllcyA9IG5ldyBMaXN0PGR5bmFtaWM+LmZpbGxlZChjb3VudCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IGNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgdmFyIGVsZW0gPSBwb3AoKTsKICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IFJldmlzZSB0aGlzIHRvIGhhbmRsZSBjb250cm9sIGZsb3cgYW5kIHNwcmVhZAogICAgICBpZiAoZWxlbSA9PSBpbnZhbGlkQ29sbGVjdGlvbkVsZW1lbnQpIHsKICAgICAgICBzZXRPck1hcEVudHJpZXMucmVtb3ZlQXQoaSk7CiAgICAgIH0gZWxzZSBpZiAoZWxlbSBpcyBNYXBFbnRyeSkgewogICAgICAgIHNldE9yTWFwRW50cmllc1tpXSA9IGVsZW07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0T3JNYXBFbnRyaWVzW2ldID0gdG9WYWx1ZShlbGVtKTsKICAgICAgfQogICAgfQogICAgTGlzdDxVbnJlc29sdmVkVHlwZT4gdHlwZUFyZ3VtZW50cyA9IHBvcCgpOwoKICAgIC8vIFJlcGxpY2F0ZSBleGlzdGluZyBiZWhhdmlvciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyc2VyLgogICAgLy8gVGhpcyB3aWxsIGJlIHJlbW92ZWQgb25jZSB1bmlmaWVkIGNvbGxlY3Rpb25zIGlzIGltcGxlbWVudGVkLgoKICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgc2V0IG9yIG1hcCBiYXNlZCBvbiB0eXBlIGFyZ3MgYW5kIGNvbnRlbnQKICAgIC8vIFRPRE8oZGFucnViZWwpOiBTaW5jZSB0eXBlIHJlc29sdXRpb24gaXMgbmVlZGVkIHRvIGRpc2FtYmlndWF0ZQogICAgLy8gc2V0IG9yIG1hcCBpbiBzb21lIHNpdHVhdGlvbnMsIGNvbnNpZGVyIGFsd2F5cyBkZWZlcnJpbmcgZGV0ZXJtaW5hdGlvbgogICAgLy8gdW50aWwgdGhlIHR5cGUgcmVzb2x1dGlvbiBwaGFzZS4KICAgIGZpbmFsIHR5cGVBcmdDb3VudCA9IHR5cGVBcmd1bWVudHM/Lmxlbmd0aDsKICAgIGJvb2wgaXNTZXQgPSB0eXBlQXJnQ291bnQgPT0gMSA/IHRydWUgOiB0eXBlQXJnQ291bnQgIT0gbnVsbCA/IGZhbHNlIDogbnVsbDsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldE9yTWFwRW50cmllcy5sZW5ndGg7ICsraSkgewogICAgICBpZiAoc2V0T3JNYXBFbnRyaWVzW2ldIGlzISBNYXBFbnRyeSAmJgogICAgICAgICAgIWlzQ29udmVydGlibGVUb01hcEVudHJ5KHNldE9yTWFwRW50cmllc1tpXSkpIHsKICAgICAgICBoYXNTZXRFbnRyeSA9IHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogSWYgdGhlIHR5cGUgYXJndW1lbnRzIGFyZSBub3Qga25vd24gKG51bGwpIHRoZW4KICAgIC8vIGRlZmVyIHNldC9tYXAgZGV0ZXJtaW5hdGlvbiB1bnRpbCBhZnRlciB0eXBlIHJlc29sdXRpb24gYXMgcGVyIHRoZQogICAgLy8gdW5pZmllZCBjb2xsZWN0aW9uIHNwZWM6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvbGFuZ3VhZ2UvcHVsbC8yMDAKICAgIC8vIHJhdGhlciB0aGFuIHRyeWluZyB0byBndWVzcyBhcyBkb25lIGJlbG93LgogICAgaXNTZXQgPz89IGhhc1NldEVudHJ5OwoKICAgIGlmIChpc1NldCkgewogICAgICBidWlsZExpdGVyYWxTZXQodHlwZUFyZ3VtZW50cywgY29uc3RLZXl3b3JkLCBsZWZ0QnJhY2UsIHNldE9yTWFwRW50cmllcyk7CiAgICB9IGVsc2UgewogICAgICBMaXN0PE1hcEVudHJ5PiBtYXBFbnRyaWVzID0gbmV3IExpc3Q8TWFwRW50cnk+KHNldE9yTWFwRW50cmllcy5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldE9yTWFwRW50cmllcy5sZW5ndGg7ICsraSkgewogICAgICAgIGlmIChzZXRPck1hcEVudHJpZXNbaV0gaXMgTWFwRW50cnkpIHsKICAgICAgICAgIG1hcEVudHJpZXNbaV0gPSBzZXRPck1hcEVudHJpZXNbaV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1hcEVudHJpZXNbaV0gPSBjb252ZXJ0VG9NYXBFbnRyeShzZXRPck1hcEVudHJpZXNbaV0sIHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgICBidWlsZExpdGVyYWxNYXAodHlwZUFyZ3VtZW50cywgY29uc3RLZXl3b3JkLCBsZWZ0QnJhY2UsIG1hcEVudHJpZXMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMaXRlcmFsQm9vbChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTGl0ZXJhbEJvb2wiKTsKICAgIGJvb2wgdmFsdWUgPSBvcHRpb25hbCgidHJ1ZSIsIHRva2VuKTsKICAgIGFzc2VydCh2YWx1ZSB8fCBvcHRpb25hbCgiZmFsc2UiLCB0b2tlbikpOwogICAgcHVzaChmb3Jlc3QubGl0ZXJhbEJvb2wodmFsdWUsIHRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxEb3VibGUoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkxpdGVyYWxEb3VibGUiKTsKICAgIHB1c2goZm9yZXN0LmxpdGVyYWxEb3VibGUoZG91YmxlLnBhcnNlKHRva2VuLmxleGVtZSksIHRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxOdWxsKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJMaXRlcmFsTnVsbCIpOwogICAgcHVzaChmb3Jlc3QubGl0ZXJhbE51bGwodG9rZW4pKTsKICB9CgogIHZvaWQgYnVpbGRMaXRlcmFsTWFwKExpc3Q8VW5yZXNvbHZlZFR5cGU+IHR5cGVBcmd1bWVudHMsIFRva2VuIGNvbnN0S2V5d29yZCwKICAgICAgVG9rZW4gbGVmdEJyYWNlLCBMaXN0PE1hcEVudHJ5PiBlbnRyaWVzKSB7CiAgICBEYXJ0VHlwZSBrZXlUeXBlOwogICAgRGFydFR5cGUgdmFsdWVUeXBlOwogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gMikgewogICAgICAgIGtleVR5cGUgPSBjb25zdCBJbnZhbGlkVHlwZSgpOwogICAgICAgIHZhbHVlVHlwZSA9IGNvbnN0IEludmFsaWRUeXBlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAga2V5VHlwZSA9IGJ1aWxkRGFydFR5cGUodHlwZUFyZ3VtZW50c1swXSk7CiAgICAgICAgdmFsdWVUeXBlID0gYnVpbGREYXJ0VHlwZSh0eXBlQXJndW1lbnRzWzFdKTsKICAgICAgICBpZiAoIWxlZ2FjeU1vZGUpIHsKICAgICAgICAgIGtleVR5cGUgPSBpbnN0YW50aWF0ZVRvQm91bmRzKGtleVR5cGUsIGNvcmVUeXBlcy5vYmplY3RDbGFzcyk7CiAgICAgICAgICB2YWx1ZVR5cGUgPSBpbnN0YW50aWF0ZVRvQm91bmRzKHZhbHVlVHlwZSwgY29yZVR5cGVzLm9iamVjdENsYXNzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIERhcnRUeXBlIGltcGxpY2l0VHlwZUFyZ3VtZW50ID0gdGhpcy5pbXBsaWNpdFR5cGVBcmd1bWVudDsKICAgICAga2V5VHlwZSA9IGltcGxpY2l0VHlwZUFyZ3VtZW50OwogICAgICB2YWx1ZVR5cGUgPSBpbXBsaWNpdFR5cGVBcmd1bWVudDsKICAgIH0KCiAgICBFeHByZXNzaW9uIG5vZGUgPSBmb3Jlc3QubGl0ZXJhbE1hcCgKICAgICAgICBjb25zdEtleXdvcmQsCiAgICAgICAgY29uc3RLZXl3b3JkICE9IG51bGwgfHwgY29uc3RhbnRDb250ZXh0ID09IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZCwKICAgICAgICBrZXlUeXBlLAogICAgICAgIHZhbHVlVHlwZSwKICAgICAgICB0eXBlQXJndW1lbnRzLAogICAgICAgIGxlZnRCcmFjZSwKICAgICAgICBlbnRyaWVzLAogICAgICAgIGxlZnRCcmFjZS5lbmRHcm91cCk7CiAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5NYXBMaXRlcmFsKG5vZGUsIHR5cGVFbnZpcm9ubWVudCwgdXJpKTsKICAgIHB1c2gobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxNYXBFbnRyeShUb2tlbiBjb2xvbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkxpdGVyYWxNYXBFbnRyeSIpOwogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IHBvcEZvclZhbHVlKCk7CiAgICBFeHByZXNzaW9uIGtleSA9IHBvcEZvclZhbHVlKCk7CiAgICBwdXNoKGZvcmVzdC5tYXBFbnRyeShrZXksIGNvbG9uLCB2YWx1ZSkpOwogIH0KCiAgU3RyaW5nIHN5bWJvbFBhcnRUb1N0cmluZyhuYW1lKSB7CiAgICBpZiAobmFtZSBpcyBJZGVudGlmaWVyKSB7CiAgICAgIHJldHVybiBuYW1lLm5hbWU7CiAgICB9IGVsc2UgaWYgKG5hbWUgaXMgT3BlcmF0b3IpIHsKICAgICAgcmV0dXJuIG5hbWUubmFtZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB1bmhhbmRsZWQoIiR7bmFtZS5ydW50aW1lVHlwZX0iLCAic3ltYm9sUGFydFRvU3RyaW5nIiwgLTEsIHVyaSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExpdGVyYWxTeW1ib2woVG9rZW4gaGFzaFRva2VuLCBpbnQgaWRlbnRpZmllckNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJMaXRlcmFsU3ltYm9sIik7CiAgICBpZiAoaWRlbnRpZmllckNvdW50ID09IDEpIHsKICAgICAgT2JqZWN0IHBhcnQgPSBwb3AoKTsKICAgICAgaWYgKHBhcnQgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgICBwdXNoKG5ldyBQYXJzZXJFcnJvckdlbmVyYXRvcigKICAgICAgICAgICAgdGhpcywgaGFzaFRva2VuLCBmYXN0YS5tZXNzYWdlU3ludGhldGljVG9rZW4pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwdXNoKGZvcmVzdC5saXRlcmFsU3ltYm9sU2luZ2x1YXIoCiAgICAgICAgICAgIHN5bWJvbFBhcnRUb1N0cmluZyhwYXJ0KSwgaGFzaFRva2VuLCBwYXJ0KSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIExpc3Q8SWRlbnRpZmllcj4gcGFydHMgPQogICAgICAgICAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8SWRlbnRpZmllcj4oKS5wb3Aoc3RhY2ssIGlkZW50aWZpZXJDb3VudCk7CiAgICAgIGlmIChwYXJ0cyA9PSBudWxsKSB7CiAgICAgICAgcHVzaChuZXcgUGFyc2VyRXJyb3JHZW5lcmF0b3IoCiAgICAgICAgICAgIHRoaXMsIGhhc2hUb2tlbiwgZmFzdGEubWVzc2FnZVN5bnRoZXRpY1Rva2VuKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIFN0cmluZyB2YWx1ZSA9IHN5bWJvbFBhcnRUb1N0cmluZyhwYXJ0cy5maXJzdCk7CiAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YWx1ZSArPSAiLiR7c3ltYm9sUGFydFRvU3RyaW5nKHBhcnRzW2ldKX0iOwogICAgICB9CiAgICAgIHB1c2goZm9yZXN0LmxpdGVyYWxTeW1ib2xNdWx0aXBsZSh2YWx1ZSwgaGFzaFRva2VuLCBwYXJ0cykpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb25OdWxsQXNzZXJ0RXhwcmVzc2lvbihUb2tlbiBiYW5nKSB7CiAgICBpZiAoIWxpYnJhcnkubG9hZGVyLnRhcmdldC5lbmFibGVOb25OdWxsYWJsZSkgewogICAgICByZXBvcnROb25OdWxsQXNzZXJ0RXhwcmVzc2lvbk5vdEVuYWJsZWQoYmFuZyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVR5cGUoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gcXVlc3Rpb25NYXJrKSB7CiAgICAvLyBUT0RPKGFoZSk6IFRoZSBzY29wZSBpcyB3cm9uZyBmb3IgcmV0dXJuIHR5cGVzIG9mIGdlbmVyaWMgZnVuY3Rpb25zLgogICAgZGVidWdFdmVudCgiVHlwZSIpOwogICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlTm9uTnVsbGFibGUpIHsKICAgICAgcmVwb3J0RXJyb3JJZk51bGxhYmxlVHlwZShxdWVzdGlvbk1hcmspOwogICAgfQogICAgTGlzdDxVbnJlc29sdmVkVHlwZT4gYXJndW1lbnRzID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgaWYgKG5hbWUgaXMgUXVhbGlmaWVkTmFtZSkgewogICAgICBRdWFsaWZpZWROYW1lIHF1YWxpZmllZCA9IG5hbWU7CiAgICAgIE9iamVjdCBwcmVmaXggPSBxdWFsaWZpZWQucXVhbGlmaWVyOwogICAgICBUb2tlbiBzdWZmaXggPSBkZXByZWNhdGVkX2V4dHJhY3RUb2tlbihxdWFsaWZpZWQpOwogICAgICBpZiAocHJlZml4IGlzIEdlbmVyYXRvcikgewogICAgICAgIG5hbWUgPSBwcmVmaXgucXVhbGlmaWVkTG9va3VwKHN1ZmZpeCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXROb2RlTmFtZShwcmVmaXgpOwogICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSA9IGRlYnVnTmFtZShuYW1lLCBzdWZmaXgubGV4ZW1lKTsKICAgICAgICBpbnQgb2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4oYmVnaW5Ub2tlbik7CiAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZmFzdGEudGVtcGxhdGVOb3RBVHlwZS53aXRoQXJndW1lbnRzKGRpc3BsYXlOYW1lKTsKICAgICAgICBsaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2UsIG9mZnNldCwgbGVuZ3RoT2ZTcGFuKGJlZ2luVG9rZW4sIHN1ZmZpeCksIHVyaSk7CiAgICAgICAgcHVzaChuZXcgVW5yZXNvbHZlZFR5cGUoCiAgICAgICAgICAgIG5ldyBOYW1lZFR5cGVCdWlsZGVyKG5hbWUsIG51bGwpCiAgICAgICAgICAgICAgLi5iaW5kKG5ldyBJbnZhbGlkVHlwZUJ1aWxkZXIoCiAgICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgICAgdXJpLCBvZmZzZXQsIGxlbmd0aE9mU3BhbihiZWdpblRva2VuLCBzdWZmaXgpKSkpLAogICAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICAgIHVyaSkpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgVHlwZUJ1aWxkZXIgcmVzdWx0OwogICAgaWYgKG5hbWUgaXMgR2VuZXJhdG9yKSB7CiAgICAgIHJlc3VsdCA9IG5hbWUuYnVpbGRUeXBlV2l0aFJlc29sdmVkQXJndW1lbnRzKGFyZ3VtZW50cyk7CiAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewogICAgICAgIHVuaGFuZGxlZCgibnVsbCIsICJyZXN1bHQiLCBiZWdpblRva2VuLmNoYXJPZmZzZXQsIHVyaSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobmFtZSBpcyBQcm9ibGVtQnVpbGRlcikgewogICAgICAvLyBUT0RPKGFoZSk6IEFyZ3VtZW50cyBjb3VsZCBiZSBwYXNzZWQgaGVyZS4KICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgbmFtZS5tZXNzYWdlLCBuYW1lLmNoYXJPZmZzZXQsIG5hbWUubmFtZS5sZW5ndGgsIG5hbWUuZmlsZVVyaSk7CiAgICAgIHJlc3VsdCA9IG5ldyBOYW1lZFR5cGVCdWlsZGVyKG5hbWUubmFtZSwgbnVsbCkKICAgICAgICAuLmJpbmQobmV3IEludmFsaWRUeXBlQnVpbGRlcigKICAgICAgICAgICAgbmFtZS5uYW1lLAogICAgICAgICAgICBuYW1lLm1lc3NhZ2Uud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgbmFtZS5maWxlVXJpLCBuYW1lLmNoYXJPZmZzZXQsIG5hbWUubmFtZS5sZW5ndGgpKSk7CiAgICB9IGVsc2UgewogICAgICB1bmhhbmRsZWQoCiAgICAgICAgICAiJHtuYW1lLnJ1bnRpbWVUeXBlfSIsICJoYW5kbGVUeXBlIiwgYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0LCB1cmkpOwogICAgfQogICAgcHVzaChuZXcgVW5yZXNvbHZlZFR5cGUocmVzdWx0LCBiZWdpblRva2VuLmNoYXJPZmZzZXQsIHVyaSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZ1bmN0aW9uVHlwZShUb2tlbiBiZWdpblRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkZ1bmN0aW9uVHlwZSIpOwogIH0KCiAgdm9pZCBlbnRlckZ1bmN0aW9uVHlwZVNjb3BlKExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcykgewogICAgZGVidWdFdmVudCgiZW50ZXJGdW5jdGlvblR5cGVTY29wZSIpOwogICAgZW50ZXJMb2NhbFNjb3BlKG51bGwsCiAgICAgICAgc2NvcGUuY3JlYXRlTmVzdGVkU2NvcGUoImZ1bmN0aW9uLXR5cGUgc2NvcGUiLCBpc01vZGlmaWFibGU6IHRydWUpKTsKICAgIGlmICh0eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgU2NvcGVCdWlsZGVyIHNjb3BlQnVpbGRlciA9IG5ldyBTY29wZUJ1aWxkZXIoc2NvcGUpOwogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgYnVpbGRlciBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBidWlsZGVyLm5hbWU7CiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciBleGlzdGluZyA9IHNjb3BlQnVpbGRlcltuYW1lXTsKICAgICAgICBpZiAoZXhpc3RpbmcgPT0gbnVsbCkgewogICAgICAgICAgc2NvcGVCdWlsZGVyLmFkZE1lbWJlcihuYW1lLCBidWlsZGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVwb3J0RHVwbGljYXRlZERlY2xhcmF0aW9uKGV4aXN0aW5nLCBuYW1lLCBidWlsZGVyLmNoYXJPZmZzZXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGdW5jdGlvblR5cGUoVG9rZW4gZnVuY3Rpb25Ub2tlbiwgVG9rZW4gcXVlc3Rpb25NYXJrKSB7CiAgICBkZWJ1Z0V2ZW50KCJGdW5jdGlvblR5cGUiKTsKICAgIGlmICghbGlicmFyeS5sb2FkZXIudGFyZ2V0LmVuYWJsZU5vbk51bGxhYmxlKSB7CiAgICAgIHJlcG9ydEVycm9ySWZOdWxsYWJsZVR5cGUocXVlc3Rpb25NYXJrKTsKICAgIH0KICAgIEZvcm1hbFBhcmFtZXRlcnMgZm9ybWFscyA9IHBvcCgpOwogICAgVW5yZXNvbHZlZFR5cGUgcmV0dXJuVHlwZSA9IHBvcCgpOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcG9wKCk7CiAgICBVbnJlc29sdmVkVHlwZSB0eXBlID0gZm9ybWFscy50b0Z1bmN0aW9uVHlwZShyZXR1cm5UeXBlLCB0eXBlVmFyaWFibGVzKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBwdXNoKHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVWb2lkS2V5d29yZChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiVm9pZEtleXdvcmQiKTsKICAgIGludCBvZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBwdXNoKG5ldyBVbnJlc29sdmVkVHlwZSgKICAgICAgICBuZXcgTmFtZWRUeXBlQnVpbGRlcigidm9pZCIsIG51bGwpCiAgICAgICAgICAuLmJpbmQobmV3IFZvaWRUeXBlQnVpbGRlcihjb25zdCBWb2lkVHlwZSgpLCBsaWJyYXJ5LCBvZmZzZXQpKSwKICAgICAgICBvZmZzZXQsCiAgICAgICAgdXJpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUFzT3BlcmF0b3IoVG9rZW4gb3BlcmF0b3IpIHsKICAgIGRlYnVnRXZlbnQoIkFzT3BlcmF0b3IiKTsKICAgIERhcnRUeXBlIHR5cGUgPSBidWlsZERhcnRUeXBlKHBvcCgpKTsKICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJblR5cGUodHlwZSwgdHlwZUVudmlyb25tZW50LCB1cmksIG9wZXJhdG9yLmNoYXJPZmZzZXQpOwogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIGlmICghbGlicmFyeS5sb2FkZXIudGFyZ2V0LmVuYWJsZUNvbnN0YW50VXBkYXRlMjAxOCAmJgogICAgICAgIGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSkgewogICAgICBwdXNoKGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlTm90Q29uc3RhbnRFeHByZXNzaW9uLndpdGhBcmd1bWVudHMoJ0FzIGV4cHJlc3Npb24nKSwKICAgICAgICAgIG9wZXJhdG9yLmNoYXJPZmZzZXQsCiAgICAgICAgICBvcGVyYXRvci5sZW5ndGgpKSk7CiAgICB9IGVsc2UgewogICAgICBFeHByZXNzaW9uIG5vZGUgPSBmb3Jlc3QuYXNFeHByZXNzaW9uKGV4cHJlc3Npb24sIHR5cGUsIG9wZXJhdG9yKTsKICAgICAgcHVzaChub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSXNPcGVyYXRvcihUb2tlbiBpc09wZXJhdG9yLCBUb2tlbiBub3QpIHsKICAgIGRlYnVnRXZlbnQoIklzT3BlcmF0b3IiKTsKICAgIERhcnRUeXBlIHR5cGUgPSBidWlsZERhcnRUeXBlKHBvcCgpKTsKICAgIEV4cHJlc3Npb24gb3BlcmFuZCA9IHBvcEZvclZhbHVlKCk7CiAgICBib29sIGlzSW52ZXJ0ZWQgPSBub3QgIT0gbnVsbDsKICAgIEV4cHJlc3Npb24gaXNFeHByZXNzaW9uID0KICAgICAgICBmb3Jlc3QuaXNFeHByZXNzaW9uKG9wZXJhbmQsIGlzT3BlcmF0b3IsIG5vdCwgdHlwZSk7CiAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5UeXBlKAogICAgICAgIHR5cGUsIHR5cGVFbnZpcm9ubWVudCwgdXJpLCBpc09wZXJhdG9yLmNoYXJPZmZzZXQpOwogICAgaWYgKG9wZXJhbmQgaXMgVmFyaWFibGVHZXQpIHsKICAgICAgdHlwZVByb21vdGVyPy5oYW5kbGVJc0NoZWNrKGlzRXhwcmVzc2lvbiwgaXNJbnZlcnRlZCwgb3BlcmFuZC52YXJpYWJsZSwKICAgICAgICAgIHR5cGUsIGZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKICAgIH0KICAgIGlmICghbGlicmFyeS5sb2FkZXIudGFyZ2V0LmVuYWJsZUNvbnN0YW50VXBkYXRlMjAxOCAmJgogICAgICAgIGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSkgewogICAgICBwdXNoKGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlTm90Q29uc3RhbnRFeHByZXNzaW9uLndpdGhBcmd1bWVudHMoJ0lzIGV4cHJlc3Npb24nKSwKICAgICAgICAgIGlzT3BlcmF0b3IuY2hhck9mZnNldCwKICAgICAgICAgIGlzT3BlcmF0b3IubGVuZ3RoKSkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChpc0V4cHJlc3Npb24pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNvbmRpdGlvbmFsRXhwcmVzc2lvbihUb2tlbiBxdWVzdGlvbikgewogICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgdHlwZVByb21vdGVyPy5lbnRlclRoZW4oY29uZGl0aW9uKTsKICAgIHB1c2goY29uZGl0aW9uKTsKICAgIHN1cGVyLmJlZ2luQ29uZGl0aW9uYWxFeHByZXNzaW9uKHF1ZXN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ29uZGl0aW9uYWxFeHByZXNzaW9uQ29sb24oKSB7CiAgICBFeHByZXNzaW9uIHRoZW4gPSBwb3BGb3JWYWx1ZSgpOwogICAgdHlwZVByb21vdGVyPy5lbnRlckVsc2UoKTsKICAgIHB1c2godGhlbik7CiAgICBzdXBlci5oYW5kbGVDb25kaXRpb25hbEV4cHJlc3Npb25Db2xvbigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25kaXRpb25hbEV4cHJlc3Npb24oVG9rZW4gcXVlc3Rpb24sIFRva2VuIGNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJDb25kaXRpb25hbEV4cHJlc3Npb24iKTsKICAgIEV4cHJlc3Npb24gZWxzZUV4cHJlc3Npb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgRXhwcmVzc2lvbiB0aGVuRXhwcmVzc2lvbiA9IHBvcCgpOwogICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBwb3AoKTsKICAgIHR5cGVQcm9tb3Rlcj8uZXhpdENvbmRpdGlvbmFsKCk7CiAgICBwdXNoKGZvcmVzdC5jb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgICAgY29uZGl0aW9uLCBxdWVzdGlvbiwgdGhlbkV4cHJlc3Npb24sIGNvbG9uLCBlbHNlRXhwcmVzc2lvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVUaHJvd0V4cHJlc3Npb24oVG9rZW4gdGhyb3dUb2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlRocm93RXhwcmVzc2lvbiIpOwogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIGlmIChjb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUpIHsKICAgICAgcHVzaChidWlsZFByb2JsZW0oCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZU5vdENvbnN0YW50RXhwcmVzc2lvbi53aXRoQXJndW1lbnRzKCdUaHJvdycpLAogICAgICAgICAgdGhyb3dUb2tlbi5vZmZzZXQsCiAgICAgICAgICB0aHJvd1Rva2VuLmxlbmd0aCkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChmb3Jlc3QudGhyb3dFeHByZXNzaW9uKHRocm93VG9rZW4sIGV4cHJlc3Npb24pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JtYWxQYXJhbWV0ZXIoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCwgVG9rZW4gcmVxdWlyZWRUb2tlbiwKICAgICAgVG9rZW4gY292YXJpYW50VG9rZW4sIFRva2VuIHZhckZpbmFsT3JDb25zdCkgewogICAgLy8gVE9ETyhkYW5ydWJlbCk6IGhhbmRsZSByZXF1aXJlZCB0b2tlbgogICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlTm9uTnVsbGFibGUpIHsKICAgICAgcmVwb3J0Tm9uTnVsbGFibGVNb2RpZmllckVycm9yKHJlcXVpcmVkVG9rZW4pOwogICAgfQogICAgcHVzaCgoY292YXJpYW50VG9rZW4gIT0gbnVsbCA/IGNvdmFyaWFudE1hc2sgOiAwKSB8CiAgICAgICAgTW9kaWZpZXIudmFsaWRhdGVWYXJGaW5hbE9yQ29uc3QodmFyRmluYWxPckNvbnN0Py5sZXhlbWUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ybWFsUGFyYW1ldGVyKAogICAgICBUb2tlbiB0aGlzS2V5d29yZCwKICAgICAgVG9rZW4gcGVyaW9kQWZ0ZXJUaGlzLAogICAgICBUb2tlbiBuYW1lVG9rZW4sCiAgICAgIFRva2VuIGluaXRpYWxpemVyU3RhcnQsCiAgICAgIFRva2VuIGluaXRpYWxpemVyRW5kLAogICAgICBGb3JtYWxQYXJhbWV0ZXJLaW5kIGtpbmQsCiAgICAgIE1lbWJlcktpbmQgbWVtYmVyS2luZCkgewogICAgZGVidWdFdmVudCgiRm9ybWFsUGFyYW1ldGVyIik7CiAgICBpZiAodGhpc0tleXdvcmQgIT0gbnVsbCkgewogICAgICBpZiAoIWluQ29uc3RydWN0b3IpIHsKICAgICAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKGZhc3RhLm1lc3NhZ2VGaWVsZEluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9yLAogICAgICAgICAgICB0aGlzS2V5d29yZCwgdGhpc0tleXdvcmQpOwogICAgICAgIHRoaXNLZXl3b3JkID0gbnVsbDsKICAgICAgfQogICAgfQogICAgT2JqZWN0IG5hbWVOb2RlID0gcG9wKCk7CiAgICBVbnJlc29sdmVkVHlwZSB0eXBlID0gcG9wKCk7CiAgICBpZiAoZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPT0gMCkgewogICAgICAvLyBUT0RPKGFoZSk6IFRoZSB0eXBlIHdlIGNvbXB1dGUgaGVyZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gd2hhdCBpcwogICAgICAvLyBjb21wdXRlZCBpbiB0aGUgb3V0bGluZSBwaGFzZS4gV2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoZSBvdXRsaW5lCiAgICAgIC8vIHBoYXNlIGNvbXB1dGVzIHRoZSBzYW1lIHR5cGUuIFNlZQogICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9kZWZlcnJlZF90eXBlX2Fubm90YXRpb24uZGFydCBmb3IgYW4gZXhhbXBsZQogICAgICAvLyB3aGVyZSBub3QgY2FsbGluZyBbYnVpbGREYXJ0VHlwZV0gbGVhZHMgdG8gYSBtaXNzaW5nIGNvbXBpbGUtdGltZQogICAgICAvLyBlcnJvci4gQWxzbywgbm90aWNlIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHByb2JsZW1hdGljIHBhcmFtZXRlciBpc24ndAogICAgICAvLyBgaW52YWxpZC10eXBlYC4KICAgICAgYnVpbGREYXJ0VHlwZSh0eXBlKTsKICAgIH0KICAgIGludCBtb2RpZmllcnMgPSBwb3AoKTsKICAgIGlmIChpbkNhdGNoQ2xhdXNlKSB7CiAgICAgIG1vZGlmaWVycyB8PSBmaW5hbE1hc2s7CiAgICB9CiAgICBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zID0gcG9wKCk7CiAgICBpZiAobmFtZU5vZGUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChuYW1lTm9kZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIElkZW50aWZpZXIgbmFtZSA9IG5hbWVOb2RlOwogICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBwYXJhbWV0ZXI7CiAgICBpZiAoIWluQ2F0Y2hDbGF1c2UgJiYKICAgICAgICBmdW5jdGlvbk5lc3RpbmdMZXZlbCA9PSAwICYmCiAgICAgICAgbWVtYmVyS2luZCAhPSBNZW1iZXJLaW5kLkdlbmVyYWxpemVkRnVuY3Rpb25UeXBlKSB7CiAgICAgIEZ1bmN0aW9uQnVpbGRlciBtZW1iZXIgPSB0aGlzLm1lbWJlcjsKICAgICAgcGFyYW1ldGVyID0gbWVtYmVyLmdldEZvcm1hbChuYW1lLm5hbWUpOwogICAgICBpZiAocGFyYW1ldGVyID09IG51bGwpIHsKICAgICAgICBwdXNoKG5ldyBQYXJzZXJSZWNvdmVyeShuYW1lVG9rZW4uY2hhck9mZnNldCkpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcGFyYW1ldGVyID0gbmV3IEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIobnVsbCwgbW9kaWZpZXJzLCB0eXBlPy5idWlsZGVyLAogICAgICAgICAgbmFtZT8ubmFtZSwgbGlicmFyeSwgb2Zmc2V0Rm9yVG9rZW4obmFtZVRva2VuKSk7CiAgICB9CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0KICAgICAgICBwYXJhbWV0ZXIuYnVpbGQobGlicmFyeSwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpOwogICAgRXhwcmVzc2lvbiBpbml0aWFsaXplciA9IG5hbWU/LmluaXRpYWxpemVyOwogICAgaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgaWYgKG1lbWJlciBpcyBSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyKSB7CiAgICAgICAgUmVkaXJlY3RpbmdGYWN0b3J5QnVpbGRlciBmYWN0b3J5ID0gbWVtYmVyOwogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlRGVmYXVsdFZhbHVlSW5SZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcgogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoZmFjdG9yeS5yZWRpcmVjdGlvblRhcmdldC5mdWxsTmFtZUZvckVycm9ycyksCiAgICAgICAgICAgIGluaXRpYWxpemVyLmZpbGVPZmZzZXQsCiAgICAgICAgICAgIG5vTGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXJpYWJsZS5pbml0aWFsaXplciA9IGluaXRpYWxpemVyLi5wYXJlbnQgPSB2YXJpYWJsZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChraW5kICE9IEZvcm1hbFBhcmFtZXRlcktpbmQubWFuZGF0b3J5KSB7CiAgICAgIHZhcmlhYmxlLmluaXRpYWxpemVyID8/PSBmb3Jlc3QubGl0ZXJhbE51bGwobnVsbCkuLnBhcmVudCA9IHZhcmlhYmxlOwogICAgfQogICAgaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKICAgICAgaWYgKGZ1bmN0aW9uTmVzdGluZ0xldmVsID09IDApIHsKICAgICAgICBpbmZlckFubm90YXRpb25zKGFubm90YXRpb25zKTsKICAgICAgfQogICAgICBmb3IgKEV4cHJlc3Npb24gYW5ub3RhdGlvbiBpbiBhbm5vdGF0aW9ucykgewogICAgICAgIHZhcmlhYmxlLmFkZEFubm90YXRpb24oYW5ub3RhdGlvbik7CiAgICAgIH0KICAgIH0KICAgIHB1c2gocGFyYW1ldGVyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzKAogICAgICBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMiKTsKICAgIEZvcm1hbFBhcmFtZXRlcktpbmQga2luZCA9IG9wdGlvbmFsKCJ7IiwgYmVnaW5Ub2tlbikKICAgICAgICA/IEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxOYW1lZAogICAgICAgIDogRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbFBvc2l0aW9uYWw7CiAgICAvLyBXaGVuIHJlY292ZXJpbmcgZnJvbSBhbiBlbXB0eSBsaXN0IG9mIG9wdGlvbmFsIGFyZ3VtZW50cywgY291bnQgbWF5IGJlCiAgICAvLyAwLiBJdCBtaWdodCBiZSBzaW1wbGVyIGlmIHRoZSBwYXJzZXIgZGlkbid0IGNhbGwgdGhpcyBtZXRob2QgaW4gdGhhdAogICAgLy8gY2FzZSwgaG93ZXZlciwgdGhlbiBbYmVnaW5PcHRpb25hbEZvcm1hbFBhcmFtZXRlcnNdIHdvdWxkbid0IGFsd2F5cyBiZQogICAgLy8gbWF0Y2hlZCBieSB0aGlzIG1ldGhvZC4KICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gcGFyYW1ldGVycyA9CiAgICAgICAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4oKS5wb3Aoc3RhY2ssIGNvdW50KTsKICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKICAgICAgcHVzaChuZXcgUGFyc2VyUmVjb3Zlcnkob2Zmc2V0Rm9yVG9rZW4oYmVnaW5Ub2tlbikpKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBwYXJhbWV0ZXIgaW4gcGFyYW1ldGVycykgewogICAgICAgIHBhcmFtZXRlci5raW5kID0ga2luZDsKICAgICAgfQogICAgICBwdXNoKHBhcmFtZXRlcnMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlciIpOwogICAgZnVuY3Rpb25OZXN0aW5nTGV2ZWwrKzsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcihUb2tlbiBuYW1lVG9rZW4sIFRva2VuIHF1ZXN0aW9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJGdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyIik7CiAgICBpZiAoaW5DYXRjaENsYXVzZSB8fCBmdW5jdGlvbk5lc3RpbmdMZXZlbCAhPSAwKSB7CiAgICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICB9CiAgICBGb3JtYWxQYXJhbWV0ZXJzIGZvcm1hbHMgPSBwb3AoKTsKICAgIFVucmVzb2x2ZWRUeXBlIHJldHVyblR5cGUgPSBwb3AoKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBvcCgpOwogICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlTm9uTnVsbGFibGUpIHsKICAgICAgcmVwb3J0RXJyb3JJZk51bGxhYmxlVHlwZShxdWVzdGlvbik7CiAgICB9CiAgICBVbnJlc29sdmVkVHlwZSB0eXBlID0gZm9ybWFscy50b0Z1bmN0aW9uVHlwZShyZXR1cm5UeXBlLCB0eXBlVmFyaWFibGVzKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBwdXNoKHR5cGUpOwogICAgZnVuY3Rpb25OZXN0aW5nTGV2ZWwtLTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uKCkgewogICAgc3VwZXIucHVzaChjb25zdGFudENvbnRleHQpOwogICAgY29uc3RhbnRDb250ZXh0ID0gQ29uc3RhbnRDb250ZXh0LnJlcXVpcmVkOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uKCkgewogICAgZGVidWdFdmVudCgiRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbiIpOwogICAgT2JqZWN0IGRlZmF1bHRWYWx1ZUV4cHJlc3Npb24gPSBwb3AoKTsKICAgIGNvbnN0YW50Q29udGV4dCA9IHBvcCgpOwogICAgcHVzaChkZWZhdWx0VmFsdWVFeHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVmFsdWVkRm9ybWFsUGFyYW1ldGVyKFRva2VuIGVxdWFscywgVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlZhbHVlZEZvcm1hbFBhcmFtZXRlciIpOwogICAgRXhwcmVzc2lvbiBpbml0aWFsaXplciA9IHBvcEZvclZhbHVlKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobmV3IEluaXRpYWxpemVkSWRlbnRpZmllcihuYW1lLCBpbml0aWFsaXplcikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVGb3JtYWxQYXJhbWV0ZXJXaXRob3V0VmFsdWUoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvcm1hbFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgc3VwZXIucHVzaChjb25zdGFudENvbnRleHQpOwogICAgY29uc3RhbnRDb250ZXh0ID0gQ29uc3RhbnRDb250ZXh0Lm5vbmU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvcm1hbFBhcmFtZXRlcnMoCiAgICAgIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgZGVidWdFdmVudCgiRm9ybWFsUGFyYW1ldGVycyIpOwogICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBvcHRpb25hbHM7CiAgICBpbnQgb3B0aW9uYWxzQ291bnQgPSAwOwogICAgaWYgKGNvdW50ID4gMCAmJiBwZWVrKCkgaXMgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPikgewogICAgICBvcHRpb25hbHMgPSBwb3AoKTsKICAgICAgY291bnQtLTsKICAgICAgb3B0aW9uYWxzQ291bnQgPSBvcHRpb25hbHMubGVuZ3RoOwogICAgfQogICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBwYXJhbWV0ZXJzID0KICAgICAgICBjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPigpCiAgICAgICAgICAgIC5wb3BQYWRkZWQoc3RhY2ssIGNvdW50LCBvcHRpb25hbHNDb3VudCk7CiAgICBpZiAob3B0aW9uYWxzICE9IG51bGwgJiYgcGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIHBhcmFtZXRlcnMuc2V0UmFuZ2UoY291bnQsIGNvdW50ICsgb3B0aW9uYWxzQ291bnQsIG9wdGlvbmFscyk7CiAgICB9CiAgICBhc3NlcnQocGFyYW1ldGVycz8uaXNOb3RFbXB0eSA/PyB0cnVlKTsKICAgIEZvcm1hbFBhcmFtZXRlcnMgZm9ybWFscyA9IG5ldyBGb3JtYWxQYXJhbWV0ZXJzKHBhcmFtZXRlcnMsCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4oYmVnaW5Ub2tlbiksIGxlbmd0aE9mU3BhbihiZWdpblRva2VuLCBlbmRUb2tlbiksIHVyaSk7CiAgICBjb25zdGFudENvbnRleHQgPSBwb3AoKTsKICAgIHB1c2goZm9ybWFscyk7CiAgICBpZiAoKGluQ2F0Y2hDbGF1c2UgfHwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwgIT0gMCkgJiYKICAgICAgICBraW5kICE9IE1lbWJlcktpbmQuR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGUpIHsKICAgICAgZW50ZXJMb2NhbFNjb3BlKAogICAgICAgICAgbnVsbCwKICAgICAgICAgIGZvcm1hbHMuY29tcHV0ZUZvcm1hbFBhcmFtZXRlclNjb3BlKAogICAgICAgICAgICAgIHNjb3BlLCBtZW1iZXIgPz8gY2xhc3NCdWlsZGVyID8/IGxpYnJhcnksIHRoaXMpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DYXRjaENsYXVzZShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5DYXRjaENsYXVzZSIpOwogICAgaW5DYXRjaENsYXVzZSA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENhdGNoQ2xhdXNlKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJDYXRjaENsYXVzZSIpOwogICAgaW5DYXRjaENsYXVzZSA9IGZhbHNlOwogICAgcHVzaChpbkNhdGNoQmxvY2spOwogICAgaW5DYXRjaEJsb2NrID0gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2F0Y2hCbG9jayhUb2tlbiBvbktleXdvcmQsIFRva2VuIGNhdGNoS2V5d29yZCwgVG9rZW4gY29tbWEpIHsKICAgIGRlYnVnRXZlbnQoIkNhdGNoQmxvY2siKTsKICAgIFN0YXRlbWVudCBib2R5ID0gcG9wKCk7CiAgICBpbkNhdGNoQmxvY2sgPSBwb3AoKTsKICAgIGlmIChjYXRjaEtleXdvcmQgIT0gbnVsbCkgewogICAgICBleGl0TG9jYWxTY29wZSgpOwogICAgfQogICAgRm9ybWFsUGFyYW1ldGVycyBjYXRjaFBhcmFtZXRlcnMgPSBwb3BJZk5vdE51bGwoY2F0Y2hLZXl3b3JkKTsKICAgIERhcnRUeXBlIGV4Y2VwdGlvblR5cGUgPQogICAgICAgIGJ1aWxkRGFydFR5cGUocG9wSWZOb3ROdWxsKG9uS2V5d29yZCkpID8/IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGV4Y2VwdGlvbjsKICAgIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgc3RhY2tUcmFjZTsKICAgIExpc3Q8U3RhdGVtZW50PiBjb21waWxlVGltZUVycm9yczsKICAgIGlmIChjYXRjaFBhcmFtZXRlcnM/LnBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBpbnQgcGFyYW1ldGVyQ291bnQgPSBjYXRjaFBhcmFtZXRlcnMucGFyYW1ldGVycy5sZW5ndGg7CiAgICAgIGlmIChwYXJhbWV0ZXJDb3VudCA+IDApIHsKICAgICAgICBleGNlcHRpb24gPSBjYXRjaFBhcmFtZXRlcnMucGFyYW1ldGVyc1swXTsKICAgICAgICBleGNlcHRpb24uYnVpbGQobGlicmFyeSwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpLnR5cGUgPSBleGNlcHRpb25UeXBlOwogICAgICAgIGlmIChwYXJhbWV0ZXJDb3VudCA+IDEpIHsKICAgICAgICAgIHN0YWNrVHJhY2UgPSBjYXRjaFBhcmFtZXRlcnMucGFyYW1ldGVyc1sxXTsKICAgICAgICAgIHN0YWNrVHJhY2UuYnVpbGQobGlicmFyeSwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpLnR5cGUgPQogICAgICAgICAgICAgIGNvcmVUeXBlcy5zdGFja1RyYWNlQ2xhc3MucmF3VHlwZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHBhcmFtZXRlckNvdW50ID4gMikgewogICAgICAgIC8vIElmIHBhcmFtZXRlckNvdW50IGlzIDAsIHRoZSBwYXJzZXIgcmVwb3J0ZWQgYW4gZXJyb3IgYWxyZWFkeS4KICAgICAgICBpZiAocGFyYW1ldGVyQ291bnQgIT0gMCkgewogICAgICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgcGFyYW1ldGVyID0gY2F0Y2hQYXJhbWV0ZXJzLnBhcmFtZXRlcnNbaV07CiAgICAgICAgICAgIGNvbXBpbGVUaW1lRXJyb3JzID8/PSA8U3RhdGVtZW50PltdOwogICAgICAgICAgICBjb21waWxlVGltZUVycm9ycy5hZGQoYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgICAgICAgZmFzdGEubWVzc2FnZUNhdGNoU3ludGF4RXh0cmFQYXJhbWV0ZXJzLCBwYXJhbWV0ZXIuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIGxlbmd0aDogcGFyYW1ldGVyLm5hbWUubGVuZ3RoKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBwdXNoKGZvcmVzdC5jYXRjaENsYXVzZSgKICAgICAgICBvbktleXdvcmQsCiAgICAgICAgZXhjZXB0aW9uVHlwZSwKICAgICAgICBjYXRjaEtleXdvcmQsCiAgICAgICAgZXhjZXB0aW9uPy50YXJnZXQsCiAgICAgICAgc3RhY2tUcmFjZT8udGFyZ2V0LAogICAgICAgIGNvcmVUeXBlcy5zdGFja1RyYWNlQ2xhc3MucmF3VHlwZSwKICAgICAgICBib2R5KSk7CiAgICBpZiAoY29tcGlsZVRpbWVFcnJvcnMgPT0gbnVsbCkgewogICAgICBwdXNoKE51bGxWYWx1ZS5CbG9jayk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKGZvcmVzdC5ibG9jayhudWxsLCBjb21waWxlVGltZUVycm9ycywgbnVsbCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUcnlTdGF0ZW1lbnQoaW50IGNhdGNoQ291bnQsIFRva2VuIHRyeUtleXdvcmQsIFRva2VuIGZpbmFsbHlLZXl3b3JkKSB7CiAgICBTdGF0ZW1lbnQgZmluYWxseUJsb2NrID0gcG9wU3RhdGVtZW50SWZOb3ROdWxsKGZpbmFsbHlLZXl3b3JkKTsKICAgIExpc3Q8Q2F0Y2g+IGNhdGNoQmxvY2tzOwogICAgTGlzdDxTdGF0ZW1lbnQ+IGNvbXBpbGVUaW1lRXJyb3JzOwogICAgaWYgKGNhdGNoQ291bnQgIT0gMCkgewogICAgICBMaXN0PE9iamVjdD4gY2F0Y2hCbG9ja3NBbmRFcnJvcnMgPQogICAgICAgICAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8T2JqZWN0PigpLnBvcChzdGFjaywgY2F0Y2hDb3VudCAqIDIpOwogICAgICBjYXRjaEJsb2NrcyA9IG5ldyBMaXN0PENhdGNoPi5maWxsZWQoY2F0Y2hDb3VudCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhdGNoQ291bnQ7IGkrKykgewogICAgICAgIGNhdGNoQmxvY2tzW2ldID0gY2F0Y2hCbG9ja3NBbmRFcnJvcnNbaSAqIDJdOwogICAgICAgIFN0YXRlbWVudCBlcnJvciA9IGNhdGNoQmxvY2tzQW5kRXJyb3JzW2kgKiAyICsgMV07CiAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKICAgICAgICAgIGNvbXBpbGVUaW1lRXJyb3JzID8/PSA8U3RhdGVtZW50PltdOwogICAgICAgICAgY29tcGlsZVRpbWVFcnJvcnMuYWRkKGVycm9yKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIFN0YXRlbWVudCB0cnlCbG9jayA9IHBvcFN0YXRlbWVudCgpOwogICAgU3RhdGVtZW50IHRyeVN0YXRlbWVudCA9IGZvcmVzdC50cnlTdGF0ZW1lbnQoCiAgICAgICAgdHJ5S2V5d29yZCwgdHJ5QmxvY2ssIGNhdGNoQmxvY2tzLCBmaW5hbGx5S2V5d29yZCwgZmluYWxseUJsb2NrKTsKICAgIGlmIChjb21waWxlVGltZUVycm9ycyAhPSBudWxsKSB7CiAgICAgIGNvbXBpbGVUaW1lRXJyb3JzLmFkZCh0cnlTdGF0ZW1lbnQpOwogICAgICBwdXNoKGZvcmVzdC5ibG9jayhudWxsLCBjb21waWxlVGltZUVycm9ycywgbnVsbCkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaCh0cnlTdGF0ZW1lbnQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbmRleGVkRXhwcmVzc2lvbigKICAgICAgVG9rZW4gb3BlblNxdWFyZUJyYWNrZXQsIFRva2VuIGNsb3NlU3F1YXJlQnJhY2tldCkgewogICAgZGVidWdFdmVudCgiSW5kZXhlZEV4cHJlc3Npb24iKTsKICAgIEV4cHJlc3Npb24gaW5kZXggPSBwb3BGb3JWYWx1ZSgpOwogICAgT2JqZWN0IHJlY2VpdmVyID0gcG9wKCk7CiAgICBpZiAocmVjZWl2ZXIgaXMgVGhpc0FjY2Vzc0dlbmVyYXRvciAmJiByZWNlaXZlci5pc1N1cGVyKSB7CiAgICAgIHB1c2gobmV3IFN1cGVySW5kZXhlZEFjY2Vzc0dlbmVyYXRvcigKICAgICAgICAgIHRoaXMsCiAgICAgICAgICBvcGVuU3F1YXJlQnJhY2tldCwKICAgICAgICAgIGluZGV4LAogICAgICAgICAgbG9va3VwSW5zdGFuY2VNZW1iZXIoaW5kZXhHZXROYW1lLCBpc1N1cGVyOiB0cnVlKSwKICAgICAgICAgIGxvb2t1cEluc3RhbmNlTWVtYmVyKGluZGV4U2V0TmFtZSwgaXNTdXBlcjogdHJ1ZSkpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goSW5kZXhlZEFjY2Vzc0dlbmVyYXRvci5tYWtlKAogICAgICAgICAgdGhpcywgb3BlblNxdWFyZUJyYWNrZXQsIHRvVmFsdWUocmVjZWl2ZXIpLCBpbmRleCwgbnVsbCwgbnVsbCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVVbmFyeVByZWZpeEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlVuYXJ5UHJlZml4RXhwcmVzc2lvbiIpOwogICAgT2JqZWN0IHJlY2VpdmVyID0gcG9wKCk7CiAgICBpZiAob3B0aW9uYWwoIiEiLCB0b2tlbikpIHsKICAgICAgcHVzaChmb3Jlc3Qubm90RXhwcmVzc2lvbih0b1ZhbHVlKHJlY2VpdmVyKSwgdG9rZW4sIGZhbHNlKSk7CiAgICB9IGVsc2UgewogICAgICBTdHJpbmcgb3BlcmF0b3IgPSB0b2tlbi5zdHJpbmdWYWx1ZTsKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlclZhbHVlOwogICAgICBpZiAob3B0aW9uYWwoIi0iLCB0b2tlbikpIHsKICAgICAgICBvcGVyYXRvciA9ICJ1bmFyeS0iOwogICAgICB9CiAgICAgIGJvb2wgaXNTdXBlciA9IGZhbHNlOwogICAgICBpZiAocmVjZWl2ZXIgaXMgVGhpc0FjY2Vzc0dlbmVyYXRvciAmJiByZWNlaXZlci5pc1N1cGVyKSB7CiAgICAgICAgaXNTdXBlciA9IHRydWU7CiAgICAgICAgcmVjZWl2ZXJWYWx1ZSA9IGZvcmVzdC50aGlzRXhwcmVzc2lvbihyZWNlaXZlci50b2tlbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVjZWl2ZXJWYWx1ZSA9IHRvVmFsdWUocmVjZWl2ZXIpOwogICAgICB9CiAgICAgIHB1c2goYnVpbGRNZXRob2RJbnZvY2F0aW9uKHJlY2VpdmVyVmFsdWUsIG5ldyBOYW1lKG9wZXJhdG9yKSwKICAgICAgICAgIGZvcmVzdC5hcmd1bWVudHNFbXB0eShub0xvY2F0aW9uKSwgdG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgIC8vIFRoaXMgKmNvdWxkKiBiZSBhIGNvbnN0YW50IGV4cHJlc3Npb24sIHdlIGNhbid0IGtub3cgd2l0aG91dAogICAgICAgICAgLy8gZXZhbHVhdGluZyBbcmVjZWl2ZXJdLgogICAgICAgICAgaXNDb25zdGFudEV4cHJlc3Npb246ICFpc1N1cGVyLAogICAgICAgICAgaXNTdXBlcjogaXNTdXBlcikpOwogICAgfQogIH0KCiAgTmFtZSBpbmNyZW1lbnRPcGVyYXRvcihUb2tlbiB0b2tlbikgewogICAgaWYgKG9wdGlvbmFsKCIrKyIsIHRva2VuKSkgcmV0dXJuIHBsdXNOYW1lOwogICAgaWYgKG9wdGlvbmFsKCItLSIsIHRva2VuKSkgcmV0dXJuIG1pbnVzTmFtZTsKICAgIHJldHVybiB1bmhhbmRsZWQodG9rZW4ubGV4ZW1lLCAiaW5jcmVtZW50T3BlcmF0b3IiLCB0b2tlbi5jaGFyT2Zmc2V0LCB1cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVVbmFyeVByZWZpeEFzc2lnbm1lbnRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJVbmFyeVByZWZpeEFzc2lnbm1lbnRFeHByZXNzaW9uIik7CiAgICBPYmplY3QgZ2VuZXJhdG9yID0gcG9wKCk7CiAgICBpZiAoZ2VuZXJhdG9yIGlzIEdlbmVyYXRvcikgewogICAgICBwdXNoKGdlbmVyYXRvci5idWlsZFByZWZpeEluY3JlbWVudChpbmNyZW1lbnRPcGVyYXRvcih0b2tlbiksCiAgICAgICAgICBvZmZzZXQ6IHRva2VuLmNoYXJPZmZzZXQpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2god3JhcEluUHJvYmxlbSgKICAgICAgICAgIHRvVmFsdWUoZ2VuZXJhdG9yKSwgZmFzdGEubWVzc2FnZU5vdEFuTHZhbHVlLCBub0xlbmd0aCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVVbmFyeVBvc3RmaXhBc3NpZ25tZW50RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiVW5hcnlQb3N0Zml4QXNzaWdubWVudEV4cHJlc3Npb24iKTsKICAgIE9iamVjdCBnZW5lcmF0b3IgPSBwb3AoKTsKICAgIGlmIChnZW5lcmF0b3IgaXMgR2VuZXJhdG9yKSB7CiAgICAgIHB1c2gobmV3IERlbGF5ZWRQb3N0Zml4SW5jcmVtZW50KAogICAgICAgICAgdGhpcywgdG9rZW4sIGdlbmVyYXRvciwgaW5jcmVtZW50T3BlcmF0b3IodG9rZW4pLCBudWxsKSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKHdyYXBJblByb2JsZW0oCiAgICAgICAgICB0b1ZhbHVlKGdlbmVyYXRvciksIGZhc3RhLm1lc3NhZ2VOb3RBbkx2YWx1ZSwgbm9MZW5ndGgpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29uc3RydWN0b3JSZWZlcmVuY2UoCiAgICAgIFRva2VuIHN0YXJ0LCBUb2tlbiBwZXJpb2RCZWZvcmVOYW1lLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiQ29uc3RydWN0b3JSZWZlcmVuY2UiKTsKICAgIHB1c2hRdWFsaWZpZWRSZWZlcmVuY2Uoc3RhcnQsIHBlcmlvZEJlZm9yZU5hbWUpOwogIH0KCiAgLy8vIEEgcXVhbGlmaWVkIHJlZmVyZW5jZSBpcyBzb21ldGhpbmcgdGhhdCBtYXRjaGVzIG9uZSBvZjoKICAvLy8KICAvLy8gICAgIGlkZW50aWZpZXIKICAvLy8gICAgIGlkZW50aWZpZXIgdHlwZUFyZ3VtZW50cz8gJy4nIGlkZW50aWZpZXIKICAvLy8gICAgIGlkZW50aWZpZXIgJy4nIGlkZW50aWZpZXIgdHlwZUFyZ3VtZW50cz8gJy4nIGlkZW50aWZpZXIKICAvLy8KICAvLy8gVGhhdCBpcywgb25lIHRvIHRocmVlIGlkZW50aWZpZXJzIHNlcGFyYXRlZCBieSBwZXJpb2RzIGFuZCBvcHRpb25hbGx5IG9uZQogIC8vLyBsaXN0IG9mIHR5cGUgYXJndW1lbnRzLgogIC8vLwogIC8vLyBBIHF1YWxpZmllZCByZWZlcmVuY2UgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGJvdGggYSByZWZlcmVuY2UgdG8KICAvLy8gY29tcGlsZS10aW1lIGNvbnN0YW50IHZhcmlhYmxlIChtZXRhZGF0YSkgb3IgYSBjb25zdHJ1Y3RvciByZWZlcmVuY2UKICAvLy8gKHVzZWQgYnkgbWV0YWRhdGEsIG5ldy9jb25zdCBleHByZXNzaW9uLCBhbmQgcmVkaXJlY3RpbmcgZmFjdG9yaWVzKS4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoZSBwYXJzZXIgd2lsbCByZXBvcnQgZXJyb3JzIGlmIG1ldGFkYXRhIGluY2x1ZGVzIHR5cGUKICAvLy8gYXJndW1lbnRzLCBidXQgd2lsbCBvdGhlciBwcmVzZXJ2ZSB0aGVtIGZvciBlcnJvciByZWNvdmVyeS4KICAvLy8KICAvLy8gQSBjb25zdHJ1Y3RvciByZWZlcmVuY2UgY2FuIGNvbnRhaW4gdXAgdG8gdGhyZWUgaWRlbnRpZmllcnM6CiAgLy8vCiAgLy8vICAgICBhKSB0eXBlIHR5cGVBcmd1bWVudHM/CiAgLy8vICAgICBiKSB0eXBlIHR5cGVBcmd1bWVudHM/ICcuJyBuYW1lCiAgLy8vICAgICBjKSBwcmVmaXggJy4nIHR5cGUgdHlwZUFyZ3VtZW50cz8KICAvLy8gICAgIGQpIHByZWZpeCAnLicgdHlwZSB0eXBlQXJndW1lbnRzPyAnLicgbmFtZQogIC8vLwogIC8vLyBUaGlzIGlzbid0IGEgbGVnYWwgY29uc3RydWN0b3IgcmVmZXJlbmNlOgogIC8vLwogIC8vLyAgICAgdHlwZSAnLicgbmFtZSB0eXBlQXJndW1lbnRzPwogIC8vLwogIC8vLyBCdXQgdGhlIHBhcnNlciBjYW4ndCB0ZWxsIHRoaXMgZnJvbSB0eXBlIGMpIGFib3ZlLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBwb3BzIDIgKG9yIDMgaWYgYHBlcmlvZEJlZm9yZU5hbWUgIT0gbnVsbGApIHZhbHVlcyBmcm9tIHRoZQogIC8vLyBzdGFjayBhbmQgcHVzaGVzIDMgdmFsdWVzOiBhIGdlbmVyYXRvciAodGhlIHR5cGUgaW4gYSBjb25zdHJ1Y3RvcgogIC8vLyByZWZlcmVuY2UsIG9yIGFuIGV4cHJlc3Npb24gaW4gbWV0YWRhdGEpLCBhIGxpc3Qgb2YgdHlwZSBhcmd1bWVudHMsIGFuZCBhCiAgLy8vIG5hbWUuCiAgdm9pZCBwdXNoUXVhbGlmaWVkUmVmZXJlbmNlKFRva2VuIHN0YXJ0LCBUb2tlbiBwZXJpb2RCZWZvcmVOYW1lKSB7CiAgICBJZGVudGlmaWVyIHN1ZmZpeCA9IHBvcElmTm90TnVsbChwZXJpb2RCZWZvcmVOYW1lKTsKICAgIElkZW50aWZpZXIgaWRlbnRpZmllcjsKICAgIExpc3Q8VW5yZXNvbHZlZFR5cGU+IHR5cGVBcmd1bWVudHMgPSBwb3AoKTsKICAgIE9iamVjdCB0eXBlID0gcG9wKCk7CiAgICBpZiAodHlwZSBpcyBRdWFsaWZpZWROYW1lKSB7CiAgICAgIGlkZW50aWZpZXIgPSB0eXBlOwogICAgICBRdWFsaWZpZWROYW1lIHF1YWxpZmllZCA9IHR5cGU7CiAgICAgIE9iamVjdCBxdWFsaWZpZXIgPSBxdWFsaWZpZWQucXVhbGlmaWVyOwogICAgICBpZiAocXVhbGlmaWVyIGlzIFR5cGVVc2VHZW5lcmF0b3IpIHsKICAgICAgICB0eXBlID0gcXVhbGlmaWVyOwogICAgICAgIGlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICAgIC8vIFRPRE8oYWhlKTogUG9pbnQgdG8gdGhlIHR5cGUgYXJndW1lbnRzIGluc3RlYWQuCiAgICAgICAgICBhZGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhUeXBlQXJndW1lbnRzLAogICAgICAgICAgICAgIGlkZW50aWZpZXIuY2hhck9mZnNldCwgaWRlbnRpZmllci5uYW1lLmxlbmd0aCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHF1YWxpZmllciBpcyBHZW5lcmF0b3IpIHsKICAgICAgICB0eXBlID0gcXVhbGlmaWVyLnF1YWxpZmllZExvb2t1cChkZXByZWNhdGVkX2V4dHJhY3RUb2tlbihpZGVudGlmaWVyKSk7CiAgICAgICAgaWRlbnRpZmllciA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdW5oYW5kbGVkKCIke3F1YWxpZmllci5ydW50aW1lVHlwZX0iLCAicHVzaFF1YWxpZmllZFJlZmVyZW5jZSIsCiAgICAgICAgICAgIHN0YXJ0LmNoYXJPZmZzZXQsIHVyaSk7CiAgICAgIH0KICAgIH0KICAgIFN0cmluZyBuYW1lOwogICAgaWYgKGlkZW50aWZpZXIgIT0gbnVsbCAmJiBzdWZmaXggIT0gbnVsbCkgewogICAgICBuYW1lID0gIiR7aWRlbnRpZmllci5uYW1lfS4ke3N1ZmZpeC5uYW1lfSI7CiAgICB9IGVsc2UgaWYgKGlkZW50aWZpZXIgIT0gbnVsbCkgewogICAgICBuYW1lID0gaWRlbnRpZmllci5uYW1lOwogICAgfSBlbHNlIGlmIChzdWZmaXggIT0gbnVsbCkgewogICAgICBuYW1lID0gc3VmZml4Lm5hbWU7CiAgICB9IGVsc2UgewogICAgICBuYW1lID0gIiI7CiAgICB9CiAgICBwdXNoKHR5cGUpOwogICAgcHVzaCh0eXBlQXJndW1lbnRzID8/IE51bGxWYWx1ZS5UeXBlQXJndW1lbnRzKTsKICAgIHB1c2gobmFtZSk7CiAgICBwdXNoKHN1ZmZpeCA/PyBpZGVudGlmaWVyID8/IE51bGxWYWx1ZS5JZGVudGlmaWVyKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTdGF0aWNJbnZvY2F0aW9uKE1lbWJlciB0YXJnZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIHtDb25zdG5lc3MgY29uc3RuZXNzOiBDb25zdG5lc3MuaW1wbGljaXQsCiAgICAgIGludCBjaGFyT2Zmc2V0OiAtMSwKICAgICAgaW50IGNoYXJMZW5ndGg6IG5vTGVuZ3RofSkgewogICAgLy8gVGhlIGFyZ3VtZW50IGNoZWNrcyBmb3IgdGhlIGluaXRpYWwgdGFyZ2V0IG9mIHJlZGlyZWN0aW5nIGZhY3RvcmllcwogICAgLy8gaW52b2NhdGlvbnMgYXJlIHNraXBwZWQgaW4gRGFydCAxLgogICAgaWYgKCFsZWdhY3lNb2RlIHx8ICFpc1JlZGlyZWN0aW5nRmFjdG9yeSh0YXJnZXQsIGhlbHBlcjogdGhpcykpIHsKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IHRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVyczsKICAgICAgaWYgKHRhcmdldCBpcyBDb25zdHJ1Y3RvcikgewogICAgICAgIGFzc2VydCghdGFyZ2V0LmVuY2xvc2luZ0NsYXNzLmlzQWJzdHJhY3QpOwogICAgICAgIHR5cGVQYXJhbWV0ZXJzID0gdGFyZ2V0LmVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzOwogICAgICB9CiAgICAgIExvY2F0ZWRNZXNzYWdlIGFyZ01lc3NhZ2UgPSBjaGVja0FyZ3VtZW50c0ZvckZ1bmN0aW9uKAogICAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uLCBhcmd1bWVudHMsIGNoYXJPZmZzZXQsIHR5cGVQYXJhbWV0ZXJzKTsKICAgICAgaWYgKGFyZ01lc3NhZ2UgIT0gbnVsbCkgewogICAgICAgIHJldHVybiB3cmFwU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICAgICAgdGhyb3dOb1N1Y2hNZXRob2RFcnJvcigKICAgICAgICAgICAgICAgIGZvcmVzdC5saXRlcmFsTnVsbChudWxsKS4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICB0YXJnZXQubmFtZS5uYW1lLAogICAgICAgICAgICAgICAgYXJndW1lbnRzLAogICAgICAgICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIGNhbmRpZGF0ZTogdGFyZ2V0LAogICAgICAgICAgICAgICAgbWVzc2FnZTogYXJnTWVzc2FnZSksCiAgICAgICAgICAgIGNoYXJPZmZzZXQpOwogICAgICB9CiAgICB9CgogICAgYm9vbCBpc0NvbnN0ID0gY29uc3RuZXNzID09IENvbnN0bmVzcy5leHBsaWNpdENvbnN0OwogICAgaWYgKHRhcmdldCBpcyBDb25zdHJ1Y3RvcikgewogICAgICBpc0NvbnN0ID0KICAgICAgICAgIGlzQ29uc3QgfHwgY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lICYmIHRhcmdldC5pc0NvbnN0OwogICAgICBpZiAoKGlzQ29uc3QgfHwgY29uc3RhbnRDb250ZXh0ID09IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZCkgJiYKICAgICAgICAgICF0YXJnZXQuaXNDb25zdCkgewogICAgICAgIHJldHVybiB3cmFwSW52YWxpZENvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgZmFzdGEubWVzc2FnZU5vbkNvbnN0Q29uc3RydWN0b3IsIGNoYXJPZmZzZXQsIGNoYXJMZW5ndGgpKSwKICAgICAgICAgICAgdGFyZ2V0LAogICAgICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgICAgIGNoYXJPZmZzZXQpOwogICAgICB9CiAgICAgIENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlID0gbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgIHRhcmdldCwgZm9yZXN0LmNhc3RBcmd1bWVudHMoYXJndW1lbnRzKSwKICAgICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgICAgbGlicmFyeS5jaGVja0JvdW5kc0luQ29uc3RydWN0b3JJbnZvY2F0aW9uKG5vZGUsIHR5cGVFbnZpcm9ubWVudCwgdXJpKTsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9IGVsc2UgewogICAgICBQcm9jZWR1cmUgcHJvY2VkdXJlID0gdGFyZ2V0OwogICAgICBpZiAocHJvY2VkdXJlLmlzRmFjdG9yeSkgewogICAgICAgIGlzQ29uc3QgPSBpc0NvbnN0IHx8CiAgICAgICAgICAgIGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSAmJiBwcm9jZWR1cmUuaXNDb25zdDsKICAgICAgICBpZiAoKGlzQ29uc3QgfHwgY29uc3RhbnRDb250ZXh0ID09IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZCkgJiYKICAgICAgICAgICAgIXByb2NlZHVyZS5pc0NvbnN0KSB7CiAgICAgICAgICByZXR1cm4gd3JhcEludmFsaWRDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgICAgICAgICAgZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICBmYXN0YS5tZXNzYWdlTm9uQ29uc3RGYWN0b3J5LCBjaGFyT2Zmc2V0LCBjaGFyTGVuZ3RoKSksCiAgICAgICAgICAgICAgdGFyZ2V0LAogICAgICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgICAgICBjaGFyT2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgU3RhdGljSW52b2NhdGlvbiBub2RlID0gRmFjdG9yeUNvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50KAogICAgICAgICAgICB0YXJnZXQsIGZvcmVzdC5jYXN0QXJndW1lbnRzKGFyZ3VtZW50cyksCiAgICAgICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogICAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbkZhY3RvcnlJbnZvY2F0aW9uKG5vZGUsIHR5cGVFbnZpcm9ubWVudCwgdXJpKTsKICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBTdGF0aWNJbnZvY2F0aW9uIG5vZGUgPSBuZXcgU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgdGFyZ2V0LCBmb3Jlc3QuY2FzdEFyZ3VtZW50cyhhcmd1bWVudHMpLAogICAgICAgICAgICBpc0NvbnN0OiBpc0NvbnN0KQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgICAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5TdGF0aWNJbnZvY2F0aW9uKG5vZGUsIHR5cGVFbnZpcm9ubWVudCwgdXJpKTsKICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgTG9jYXRlZE1lc3NhZ2UgY2hlY2tBcmd1bWVudHNGb3JGdW5jdGlvbihGdW5jdGlvbk5vZGUgZnVuY3Rpb24sCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKICAgIGlmIChmb3Jlc3QuYXJndW1lbnRzUG9zaXRpb25hbChhcmd1bWVudHMpLmxlbmd0aCA8CiAgICAgICAgZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgICByZXR1cm4gZmFzdGEudGVtcGxhdGVUb29GZXdBcmd1bWVudHMKICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgICAgICAgZm9yZXN0LmFyZ3VtZW50c1Bvc2l0aW9uYWwoYXJndW1lbnRzKS5sZW5ndGgpCiAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgYXJndW1lbnRzLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKTsKICAgIH0KICAgIGlmIChmb3Jlc3QuYXJndW1lbnRzUG9zaXRpb25hbChhcmd1bWVudHMpLmxlbmd0aCA+CiAgICAgICAgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYXN0YS50ZW1wbGF0ZVRvb01hbnlBcmd1bWVudHMKICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCwKICAgICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzUG9zaXRpb25hbChhcmd1bWVudHMpLmxlbmd0aCkKICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBhcmd1bWVudHMuZmlsZU9mZnNldCwgbm9MZW5ndGgpOwogICAgfQogICAgTGlzdDxPYmplY3Q+IG5hbWVkID0gZm9yZXN0LmFyZ3VtZW50c05hbWVkKGFyZ3VtZW50cyk7CiAgICBpZiAobmFtZWQuaXNOb3RFbXB0eSkgewogICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9CiAgICAgICAgICBuZXcgU2V0LmZyb20oZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLm1hcCgoYSkgPT4gYS5uYW1lKSk7CiAgICAgIGZvciAoTmFtZWRFeHByZXNzaW9uIGFyZ3VtZW50IGluIG5hbWVkKSB7CiAgICAgICAgaWYgKCFuYW1lcy5jb250YWlucyhhcmd1bWVudC5uYW1lKSkgewogICAgICAgICAgcmV0dXJuIGZhc3RhLnRlbXBsYXRlTm9TdWNoTmFtZWRQYXJhbWV0ZXIKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhhcmd1bWVudC5uYW1lKQogICAgICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBhcmd1bWVudC5maWxlT2Zmc2V0LCBhcmd1bWVudC5uYW1lLmxlbmd0aCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZXMgPSBmb3Jlc3QuYXJndW1lbnRzVHlwZUFyZ3VtZW50cyhhcmd1bWVudHMpOwogICAgaWYgKHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAhPSB0eXBlcy5sZW5ndGgpIHsKICAgICAgaWYgKHR5cGVzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgLy8gRXhwZWN0ZWQgYHR5cGVQYXJhbWV0ZXJzLmxlbmd0aGAgdHlwZSBhcmd1bWVudHMsIGJ1dCBub25lIGdpdmVuLCBzbwogICAgICAgIC8vIHdlIGZpbGwgaW4gZHluYW1pYyBpbiBsZWdhY3kgbW9kZSwgYW5kIHVzZSB0eXBlIGluZmVyZW5jZSBvdGhlcndpc2UuCiAgICAgICAgaWYgKGxlZ2FjeU1vZGUpIHsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdHlwZXMuYWRkKGNvbnN0IER5bmFtaWNUeXBlKCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBBIHdyb25nIChub24temVybykgYW1vdW50IG9mIHR5cGUgYXJndW1lbnRzIGdpdmVuLiBUaGF0J3MgYW4gZXJyb3IuCiAgICAgICAgLy8gVE9ETyhqZW5zaik6IFBvc2l0aW9uIHNob3VsZCBiZSBvbiB0eXBlIGFyZ3VtZW50cyBpbnN0ZWFkLgogICAgICAgIHJldHVybiBmYXN0YS50ZW1wbGF0ZVR5cGVBcmd1bWVudE1pc21hdGNoCiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIG9mZnNldCwgbm9MZW5ndGgpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBMb2NhdGVkTWVzc2FnZSBjaGVja0FyZ3VtZW50c0ZvclR5cGUoCiAgICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvbiwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCkgewogICAgaWYgKGZvcmVzdC5hcmd1bWVudHNQb3NpdGlvbmFsKGFyZ3VtZW50cykubGVuZ3RoIDwKICAgICAgICBmdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgIHJldHVybiBmYXN0YS50ZW1wbGF0ZVRvb0Zld0FyZ3VtZW50cwogICAgICAgICAgLndpdGhBcmd1bWVudHMoZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzUG9zaXRpb25hbChhcmd1bWVudHMpLmxlbmd0aCkKICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBhcmd1bWVudHMuZmlsZU9mZnNldCwgbm9MZW5ndGgpOwogICAgfQogICAgaWYgKGZvcmVzdC5hcmd1bWVudHNQb3NpdGlvbmFsKGFyZ3VtZW50cykubGVuZ3RoID4KICAgICAgICBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIGZhc3RhLnRlbXBsYXRlVG9vTWFueUFyZ3VtZW50cwogICAgICAgICAgLndpdGhBcmd1bWVudHMoZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoLAogICAgICAgICAgICAgIGZvcmVzdC5hcmd1bWVudHNQb3NpdGlvbmFsKGFyZ3VtZW50cykubGVuZ3RoKQogICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGFyZ3VtZW50cy5maWxlT2Zmc2V0LCBub0xlbmd0aCk7CiAgICB9CiAgICBMaXN0PE9iamVjdD4gbmFtZWQgPSBmb3Jlc3QuYXJndW1lbnRzTmFtZWQoYXJndW1lbnRzKTsKICAgIGlmIChuYW1lZC5pc05vdEVtcHR5KSB7CiAgICAgIFNldDxTdHJpbmc+IG5hbWVzID0KICAgICAgICAgIG5ldyBTZXQuZnJvbShmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMubWFwKChhKSA9PiBhLm5hbWUpKTsKICAgICAgZm9yIChOYW1lZEV4cHJlc3Npb24gYXJndW1lbnQgaW4gbmFtZWQpIHsKICAgICAgICBpZiAoIW5hbWVzLmNvbnRhaW5zKGFyZ3VtZW50Lm5hbWUpKSB7CiAgICAgICAgICByZXR1cm4gZmFzdGEudGVtcGxhdGVOb1N1Y2hOYW1lZFBhcmFtZXRlcgogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGFyZ3VtZW50Lm5hbWUpCiAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGFyZ3VtZW50LmZpbGVPZmZzZXQsIGFyZ3VtZW50Lm5hbWUubGVuZ3RoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIExpc3Q8T2JqZWN0PiB0eXBlcyA9IGZvcmVzdC5hcmd1bWVudHNUeXBlQXJndW1lbnRzKGFyZ3VtZW50cyk7CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gZnVuY3Rpb24udHlwZVBhcmFtZXRlcnM7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9IHR5cGVzLmxlbmd0aCAmJiB0eXBlcy5sZW5ndGggIT0gMCkgewogICAgICAvLyBBIHdyb25nIChub24temVybykgYW1vdW50IG9mIHR5cGUgYXJndW1lbnRzIGdpdmVuLiBUaGF0J3MgYW4gZXJyb3IuCiAgICAgIC8vIFRPRE8oamVuc2opOiBQb3NpdGlvbiBzaG91bGQgYmUgb24gdHlwZSBhcmd1bWVudHMgaW5zdGVhZC4KICAgICAgcmV0dXJuIGZhc3RhLnRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2gKICAgICAgICAgIC53aXRoQXJndW1lbnRzKHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBvZmZzZXQsIG5vTGVuZ3RoKTsKICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5OZXdFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbk5ld0V4cHJlc3Npb24iKTsKICAgIHN1cGVyLnB1c2goY29uc3RhbnRDb250ZXh0KTsKICAgIGlmIChjb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUpIHsKICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlTm90Q29uc3RhbnRFeHByZXNzaW9uLndpdGhBcmd1bWVudHMoJ05ldyBleHByZXNzaW9uJyksCiAgICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgdG9rZW4ubGVuZ3RoKTsKICAgIH0KICAgIGNvbnN0YW50Q29udGV4dCA9IENvbnN0YW50Q29udGV4dC5ub25lOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNvbnN0RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Db25zdEV4cHJlc3Npb24iKTsKICAgIHN1cGVyLnB1c2goY29uc3RhbnRDb250ZXh0KTsKICAgIGNvbnN0YW50Q29udGV4dCA9IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Db25zdExpdGVyYWwoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luQ29uc3RMaXRlcmFsIik7CiAgICBzdXBlci5wdXNoKGNvbnN0YW50Q29udGV4dCk7CiAgICBjb25zdGFudENvbnRleHQgPSBDb25zdGFudENvbnRleHQuaW5mZXJyZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24iKTsKICAgIHN1cGVyLnB1c2goY29uc3RhbnRDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29uc3RMaXRlcmFsKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRDb25zdExpdGVyYWwiKTsKICAgIE9iamVjdCBsaXRlcmFsID0gcG9wKCk7CiAgICBjb25zdGFudENvbnRleHQgPSBwb3AoKTsKICAgIHB1c2gobGl0ZXJhbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE5ld0V4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5ld0V4cHJlc3Npb24iKTsKICAgIGJ1aWxkQ29uc3RydWN0b3JSZWZlcmVuY2VJbnZvY2F0aW9uKAogICAgICAgIHRva2VuLm5leHQsIHRva2VuLm9mZnNldCwgQ29uc3RuZXNzLmV4cGxpY2l0TmV3KTsKICB9CgogIHZvaWQgYnVpbGRDb25zdHJ1Y3RvclJlZmVyZW5jZUludm9jYXRpb24oCiAgICAgIFRva2VuIG5hbWVUb2tlbiwgaW50IG9mZnNldCwgQ29uc3RuZXNzIGNvbnN0bmVzcykgewogICAgQXJndW1lbnRzIGFyZ3VtZW50cyA9IHBvcCgpOwogICAgSWRlbnRpZmllciBuYW1lTGFzdElkZW50aWZpZXIgPSBwb3AoTnVsbFZhbHVlLklkZW50aWZpZXIpOwogICAgVG9rZW4gbmFtZUxhc3RUb2tlbiA9CiAgICAgICAgZGVwcmVjYXRlZF9leHRyYWN0VG9rZW4obmFtZUxhc3RJZGVudGlmaWVyKSA/PyBuYW1lVG9rZW47CiAgICBTdHJpbmcgbmFtZSA9IHBvcCgpOwogICAgTGlzdDxVbnJlc29sdmVkVHlwZT4gdHlwZUFyZ3VtZW50cyA9IHBvcCgpOwoKICAgIE9iamVjdCB0eXBlID0gcG9wKCk7CgogICAgQ29uc3RhbnRDb250ZXh0IHNhdmVkQ29uc3RhbnRDb250ZXh0ID0gcG9wKCk7CiAgICBpZiAodHlwZSBpcyBHZW5lcmF0b3IpIHsKICAgICAgcHVzaCh0eXBlLmludm9rZUNvbnN0cnVjdG9yKAogICAgICAgICAgdHlwZUFyZ3VtZW50cywgbmFtZSwgYXJndW1lbnRzLCBuYW1lVG9rZW4sIG5hbWVMYXN0VG9rZW4sIGNvbnN0bmVzcykpOwogICAgfSBlbHNlIGlmICh0eXBlIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gobmV3IFBhcnNlckVycm9yR2VuZXJhdG9yKAogICAgICAgICAgdGhpcywgbmFtZVRva2VuLCBmYXN0YS5tZXNzYWdlU3ludGhldGljVG9rZW4pKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2god3JhcFN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgICB0aHJvd05vU3VjaE1ldGhvZEVycm9yKAogICAgICAgICAgICAgIGZvcmVzdC5saXRlcmFsTnVsbChudWxsKS4uZmlsZU9mZnNldCA9IG9mZnNldCwKICAgICAgICAgICAgICBkZWJ1Z05hbWUoZ2V0Tm9kZU5hbWUodHlwZSksIG5hbWUpLAogICAgICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgICAgICBuYW1lVG9rZW4uY2hhck9mZnNldCksCiAgICAgICAgICBvZmZzZXQpKTsKICAgIH0KICAgIGNvbnN0YW50Q29udGV4dCA9IHNhdmVkQ29uc3RhbnRDb250ZXh0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJbXBsaWNpdENyZWF0aW9uRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24iKTsKICAgIGJ1aWxkQ29uc3RydWN0b3JSZWZlcmVuY2VJbnZvY2F0aW9uKAogICAgICAgIHRva2VuLCB0b2tlbi5vZmZzZXQsIENvbnN0bmVzcy5pbXBsaWNpdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIHR5cGUsCiAgICAgIFRva2VuIG5hbWVUb2tlbiwKICAgICAgVG9rZW4gbmFtZUxhc3RUb2tlbiwKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VW5yZXNvbHZlZFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBDb25zdG5lc3MgY29uc3RuZXNzKSB7CiAgICBpZiAoYXJndW1lbnRzID09IG51bGwpIHsKICAgICAgcmV0dXJuIGJ1aWxkUHJvYmxlbShmYXN0YS5tZXNzYWdlTWlzc2luZ0FyZ3VtZW50TGlzdCwKICAgICAgICAgIG5hbWVUb2tlbi5jaGFyT2Zmc2V0LCBuYW1lVG9rZW4ubGVuZ3RoKTsKICAgIH0KICAgIGlmIChuYW1lLmlzTm90RW1wdHkgJiYgYXJndW1lbnRzLnR5cGVzLmlzTm90RW1wdHkpIHsKICAgICAgLy8gVE9ETyhhaGUpOiBQb2ludCB0byB0aGUgdHlwZSBhcmd1bWVudHMgaW5zdGVhZC4KICAgICAgYWRkUHJvYmxlbShmYXN0YS5tZXNzYWdlQ29uc3RydWN0b3JXaXRoVHlwZUFyZ3VtZW50cywKICAgICAgICAgIG5hbWVUb2tlbi5jaGFyT2Zmc2V0LCBuYW1lVG9rZW4ubGVuZ3RoKTsKICAgIH0KCiAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFzc2VydChmb3Jlc3QuYXJndW1lbnRzVHlwZUFyZ3VtZW50cyhhcmd1bWVudHMpLmlzRW1wdHkpOwogICAgICBmb3Jlc3QuYXJndW1lbnRzU2V0VHlwZUFyZ3VtZW50cygKICAgICAgICAgIGFyZ3VtZW50cywgYnVpbGREYXJ0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKSk7CiAgICB9CgogICAgU3RyaW5nIGVycm9yTmFtZTsKICAgIExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2U7CiAgICBpZiAodHlwZSBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgaWYgKHR5cGUgaXMgRW51bUJ1aWxkZXIpIHsKICAgICAgICByZXR1cm4gYnVpbGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VFbnVtSW5zdGFudGlhdGlvbiwKICAgICAgICAgICAgbmFtZVRva2VuLmNoYXJPZmZzZXQsIG5hbWVUb2tlbi5sZW5ndGgpOwogICAgICB9CiAgICAgIERlY2xhcmF0aW9uIGIgPQogICAgICAgICAgdHlwZS5maW5kQ29uc3RydWN0b3JPckZhY3RvcnkobmFtZSwgY2hhck9mZnNldCwgdXJpLCBsaWJyYXJ5KTsKICAgICAgTWVtYmVyIHRhcmdldCA9IGI/LnRhcmdldDsKICAgICAgaWYgKGIgPT0gbnVsbCkgewogICAgICAgIC8vIE5vdCBmb3VuZC4gUmVwb3J0ZWQgYmVsb3cuCiAgICAgIH0gZWxzZSBpZiAoYiBpcyBQcm9ibGVtQnVpbGRlcikgewogICAgICAgIG1lc3NhZ2UgPSBiLm1lc3NhZ2Uud2l0aExvY2F0aW9uKHVyaSwgY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgICB9IGVsc2UgaWYgKGIuaXNDb25zdHJ1Y3RvcikgewogICAgICAgIGlmICh0eXBlLmlzQWJzdHJhY3QpIHsKICAgICAgICAgIHJldHVybiB3cmFwSW52YWxpZENvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgICBldmFsdWF0ZUFyZ3VtZW50c0JlZm9yZSgKICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLAogICAgICAgICAgICAgICAgICBidWlsZEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHModHlwZS5uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgIHR5cGUubmFtZSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWVUb2tlbi5jaGFyT2Zmc2V0KSksCiAgICAgICAgICAgICAgdGFyZ2V0LAogICAgICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgICAgICBjaGFyT2Zmc2V0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRhcmdldCBpcyBDb25zdHJ1Y3RvciB8fAogICAgICAgICAgKHRhcmdldCBpcyBQcm9jZWR1cmUgJiYgdGFyZ2V0LmtpbmQgPT0gUHJvY2VkdXJlS2luZC5GYWN0b3J5KSkgewogICAgICAgIEV4cHJlc3Npb24gaW52b2NhdGlvbjsKCiAgICAgICAgaWYgKGxlZ2FjeU1vZGUgJiYgaXNSZWRpcmVjdGluZ0ZhY3RvcnkodGFyZ2V0LCBoZWxwZXI6IHRoaXMpKSB7CiAgICAgICAgICAvLyBJbiBsZWdhY3kgbW9kZSB0aGUgY2hlY2tzIHRoYXQgYXJlIGRvbmUgaW4gW2J1aWxkU3RhdGljSW52b2NhdGlvbl0KICAgICAgICAgIC8vIG9uIHRoZSBpbml0aWFsIHRhcmdldCBvZiBhIHJlZGlyZWN0aW5nIGZhY3RvcnkgaW52b2NhdGlvbiBzaG91bGQKICAgICAgICAgIC8vIGJlIHNraXBwZWQuIFNvIHdlIGJ1aWxkIHRoZSBpbnZvY2F0aW9uIG5vZGVzIGRpcmVjdGx5IGhlcmUgd2l0aG91dAogICAgICAgICAgLy8gZG9pbmcgYW55IGNoZWNrcy4KICAgICAgICAgIGlmICh0YXJnZXQuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMgIT0gbnVsbCAmJgogICAgICAgICAgICAgIHRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVycy5sZW5ndGggIT0KICAgICAgICAgICAgICAgICAgZm9yZXN0LmFyZ3VtZW50c1R5cGVBcmd1bWVudHMoYXJndW1lbnRzKS5sZW5ndGgpIHsKICAgICAgICAgICAgYXJndW1lbnRzID0gZm9yZXN0LmFyZ3VtZW50cygKICAgICAgICAgICAgICAgIGZvcmVzdC5hcmd1bWVudHNQb3NpdGlvbmFsKGFyZ3VtZW50cyksIG51bGwsCiAgICAgICAgICAgICAgICBuYW1lZDogZm9yZXN0LmFyZ3VtZW50c05hbWVkKGFyZ3VtZW50cyksCiAgICAgICAgICAgICAgICB0eXBlczogbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoLCBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICAgICAgICAgICAgICAgIGdyb3dhYmxlOiB0cnVlKSk7CiAgICAgICAgICB9CiAgICAgICAgICBpbnZvY2F0aW9uID0gbmV3IEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudCgKICAgICAgICAgICAgICB0YXJnZXQsIGZvcmVzdC5jYXN0QXJndW1lbnRzKGFyZ3VtZW50cyksCiAgICAgICAgICAgICAgaXNDb25zdDogY29uc3RuZXNzID09IENvbnN0bmVzcy5leHBsaWNpdENvbnN0KQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBuYW1lVG9rZW4uY2hhck9mZnNldDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW52b2NhdGlvbiA9IGJ1aWxkU3RhdGljSW52b2NhdGlvbih0YXJnZXQsIGFyZ3VtZW50cywKICAgICAgICAgICAgICBjb25zdG5lc3M6IGNvbnN0bmVzcywKICAgICAgICAgICAgICBjaGFyT2Zmc2V0OiBuYW1lVG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgICAgICBjaGFyTGVuZ3RoOiBuYW1lVG9rZW4ubGVuZ3RoKTsKICAgICAgICB9CgogICAgICAgIGlmIChpbnZvY2F0aW9uIGlzIFN0YXRpY0ludm9jYXRpb24gJiYKICAgICAgICAgICAgaXNSZWRpcmVjdGluZ0ZhY3RvcnkodGFyZ2V0LCBoZWxwZXI6IHRoaXMpKSB7CiAgICAgICAgICByZWRpcmVjdGluZ0ZhY3RvcnlJbnZvY2F0aW9ucy5hZGQoaW52b2NhdGlvbik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW52b2NhdGlvbjsKICAgICAgfSBlbHNlIHsKICAgICAgICBlcnJvck5hbWUgPz89IGRlYnVnTmFtZSh0eXBlLm5hbWUsIG5hbWUpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHR5cGUgaXMgSW52YWxpZFR5cGVCdWlsZGVyKSB7CiAgICAgIExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UgPSB0eXBlLm1lc3NhZ2U7CiAgICAgIHJldHVybiBldmFsdWF0ZUFyZ3VtZW50c0JlZm9yZSgKICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgIGJ1aWxkUHJvYmxlbShtZXNzYWdlLm1lc3NhZ2VPYmplY3QsIG5hbWVUb2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgIG5hbWVUb2tlbi5sZXhlbWUubGVuZ3RoKSk7CiAgICB9IGVsc2UgewogICAgICBlcnJvck5hbWUgPSBkZWJ1Z05hbWUodHlwZS5mdWxsTmFtZUZvckVycm9ycywgbmFtZSk7CiAgICB9CiAgICBlcnJvck5hbWUgPz89IG5hbWU7CgogICAgcmV0dXJuIHdyYXBVbnJlc29sdmVkVGFyZ2V0SW52b2NhdGlvbigKICAgICAgICB0aHJvd05vU3VjaE1ldGhvZEVycm9yKAogICAgICAgICAgICBmb3Jlc3QubGl0ZXJhbE51bGwobnVsbCkuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0LAogICAgICAgICAgICBlcnJvck5hbWUsCiAgICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgICAgbmFtZUxhc3RUb2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlKSwKICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgYXJndW1lbnRzLmZpbGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25zdEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZENvbnN0RXhwcmVzc2lvbiIpOwogICAgYnVpbGRDb25zdHJ1Y3RvclJlZmVyZW5jZUludm9jYXRpb24oCiAgICAgICAgdG9rZW4ubmV4dCwgdG9rZW4ub2Zmc2V0LCBDb25zdG5lc3MuZXhwbGljaXRDb25zdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSWZDb250cm9sRmxvdyhUb2tlbiBpZlRva2VuKSB7CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogY29uc2lkZXIgcmVtb3ZpbmcgdGhpcyB3aGVuIGNvbnRyb2wgZmxvdyBzdXBwb3J0IGlzIGFkZGVkCiAgICAvLyBpZiB0aGUgaWZUb2tlbiBpcyBub3QgbmVlZGVkIGZvciBlcnJvciByZXBvcnRpbmcKICAgIHB1c2goaWZUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVGhlbkNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBlbnRlclRoZW5Gb3JUeXBlUHJvbW90aW9uKGNvbmRpdGlvbik7CiAgICBwdXNoKGNvbmRpdGlvbik7CiAgICBzdXBlci5iZWdpblRoZW5Db250cm9sRmxvdyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUVsc2VDb250cm9sRmxvdyhUb2tlbiBlbHNlVG9rZW4pIHsKICAgIHR5cGVQcm9tb3Rlcj8uZW50ZXJFbHNlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZElmQ29udHJvbEZsb3coVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZElmQ29udHJvbEZsb3ciKTsKICAgIHZhciBlbnRyeSA9IHBvcCgpOwogICAgdmFyIGNvbmRpdGlvbiA9IHBvcCgpOyAvLyBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24KICAgIFRva2VuIGlmVG9rZW4gPSBwb3AoKTsKICAgIHR5cGVQcm9tb3Rlcj8uZW50ZXJFbHNlKCk7CiAgICB0eXBlUHJvbW90ZXI/LmV4aXRDb25kaXRpb25hbCgpOwogICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlQ29udHJvbEZsb3dDb2xsZWN0aW9ucykgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVwb3J0IGEgbW9yZSB1c2VyIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UKICAgICAgLy8gd2hlbiBhbiBleHBlcmltZW50IGlzIG5vdCBlbmFibGVkCiAgICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKGlmVG9rZW4pLAogICAgICAgICAgaWZUb2tlbiwKICAgICAgICAgIGlmVG9rZW4pOwogICAgICBwdXNoKGludmFsaWRDb2xsZWN0aW9uRWxlbWVudCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lICYmCiAgICAgICAgIWxpYnJhcnkubG9hZGVyLnRhcmdldC5lbmFibGVDb25zdGFudFVwZGF0ZTIwMTgpIHsKICAgICAgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlQ2FudFVzZUNvbnRyb2xGbG93T3JTcHJlYWRBc0NvbnN0YW50CiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoaWZUb2tlbiksCiAgICAgICAgICBpZlRva2VuLAogICAgICAgICAgaWZUb2tlbik7CiAgICAgIHB1c2goaW52YWxpZENvbGxlY3Rpb25FbGVtZW50KTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHRyYW5zZm9ybUNvbGxlY3Rpb25zID0gdHJ1ZTsKICAgIGlmIChlbnRyeSBpcyBNYXBFbnRyeSkgewogICAgICBwdXNoKGZvcmVzdC5pZk1hcEVudHJ5KHRvVmFsdWUoY29uZGl0aW9uKSwgZW50cnksIG51bGwsIGlmVG9rZW4pKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goZm9yZXN0LmlmRWxlbWVudCh0b1ZhbHVlKGNvbmRpdGlvbiksIHRvVmFsdWUoZW50cnkpLCBudWxsLCBpZlRva2VuKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZElmRWxzZUNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRJZkVsc2VDb250cm9sRmxvdyIpOwogICAgdmFyIGVsc2VFbnRyeSA9IHBvcCgpOyAvLyBlbHNlIGVudHJ5CiAgICB2YXIgdGhlbkVudHJ5ID0gcG9wKCk7IC8vIHRoZW4gZW50cnkKICAgIHZhciBjb25kaXRpb24gPSBwb3AoKTsgLy8gcGFyZW50aGVzaXplZCBleHByZXNzaW9uCiAgICBUb2tlbiBpZlRva2VuID0gcG9wKCk7CiAgICB0eXBlUHJvbW90ZXI/LmV4aXRDb25kaXRpb25hbCgpOwogICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlQ29udHJvbEZsb3dDb2xsZWN0aW9ucykgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVwb3J0IGEgbW9yZSB1c2VyIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UKICAgICAgLy8gd2hlbiBhbiBleHBlcmltZW50IGlzIG5vdCBlbmFibGVkCiAgICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKGlmVG9rZW4pLAogICAgICAgICAgaWZUb2tlbiwKICAgICAgICAgIGlmVG9rZW4pOwogICAgICBwdXNoKGludmFsaWRDb2xsZWN0aW9uRWxlbWVudCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lICYmCiAgICAgICAgIWxpYnJhcnkubG9hZGVyLnRhcmdldC5lbmFibGVDb25zdGFudFVwZGF0ZTIwMTgpIHsKICAgICAgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlQ2FudFVzZUNvbnRyb2xGbG93T3JTcHJlYWRBc0NvbnN0YW50CiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoaWZUb2tlbiksCiAgICAgICAgICBpZlRva2VuLAogICAgICAgICAgaWZUb2tlbik7CiAgICAgIHB1c2goaW52YWxpZENvbGxlY3Rpb25FbGVtZW50KTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHRyYW5zZm9ybUNvbGxlY3Rpb25zID0gdHJ1ZTsKICAgIGlmICh0aGVuRW50cnkgaXMgTWFwRW50cnkpIHsKICAgICAgaWYgKGVsc2VFbnRyeSBpcyBNYXBFbnRyeSkgewogICAgICAgIHB1c2goZm9yZXN0LmlmTWFwRW50cnkoCiAgICAgICAgICAgIHRvVmFsdWUoY29uZGl0aW9uKSwgdGhlbkVudHJ5LCBlbHNlRW50cnksIGlmVG9rZW4pKTsKICAgICAgfSBlbHNlIGlmIChlbHNlRW50cnkgaXMgU3ByZWFkRWxlbWVudCkgewogICAgICAgIHB1c2goZm9yZXN0LmlmTWFwRW50cnkoCiAgICAgICAgICAgIHRvVmFsdWUoY29uZGl0aW9uKSwKICAgICAgICAgICAgdGhlbkVudHJ5LAogICAgICAgICAgICBuZXcgU3ByZWFkTWFwRW50cnkoZWxzZUVudHJ5LmV4cHJlc3Npb24sIGVsc2VFbnRyeS5pc051bGxBd2FyZSksCiAgICAgICAgICAgIGlmVG9rZW4pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnQgb2Zmc2V0ID0gZWxzZUVudHJ5IGlzIEV4cHJlc3Npb24KICAgICAgICAgICAgPyBlbHNlRW50cnkuZmlsZU9mZnNldAogICAgICAgICAgICA6IG9mZnNldEZvclRva2VuKGlmVG9rZW4pOwogICAgICAgIHB1c2gobmV3IE1hcEVudHJ5KAogICAgICAgICAgICBkZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihidWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3Qud2l0aEFyZ3VtZW50cygnOicpLAogICAgICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICAgICAgMSkpLAogICAgICAgICAgICBuZXcgTnVsbExpdGVyYWwoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKGlmVG9rZW4pKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChlbHNlRW50cnkgaXMgTWFwRW50cnkpIHsKICAgICAgaWYgKHRoZW5FbnRyeSBpcyBTcHJlYWRFbGVtZW50KSB7CiAgICAgICAgcHVzaChmb3Jlc3QuaWZNYXBFbnRyeSgKICAgICAgICAgICAgdG9WYWx1ZShjb25kaXRpb24pLAogICAgICAgICAgICBuZXcgU3ByZWFkTWFwRW50cnkodGhlbkVudHJ5LmV4cHJlc3Npb24sIHRoZW5FbnRyeS5pc051bGxBd2FyZSksCiAgICAgICAgICAgIGVsc2VFbnRyeSwKICAgICAgICAgICAgaWZUb2tlbikpOwogICAgICB9IGVsc2UgewogICAgICAgIGludCBvZmZzZXQgPSB0aGVuRW50cnkgaXMgRXhwcmVzc2lvbgogICAgICAgICAgICA/IHRoZW5FbnRyeS5maWxlT2Zmc2V0CiAgICAgICAgICAgIDogb2Zmc2V0Rm9yVG9rZW4oaWZUb2tlbik7CiAgICAgICAgcHVzaChuZXcgTWFwRW50cnkoCiAgICAgICAgICAgIGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdC53aXRoQXJndW1lbnRzKCc6JyksCiAgICAgICAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICAgICAgICAxKSksCiAgICAgICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4oaWZUb2tlbikpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBwdXNoKGZvcmVzdC5pZkVsZW1lbnQoCiAgICAgICAgICB0b1ZhbHVlKGNvbmRpdGlvbiksIHRvVmFsdWUodGhlbkVudHJ5KSwgdG9WYWx1ZShlbHNlRW50cnkpLCBpZlRva2VuKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVNwcmVhZEV4cHJlc3Npb24oVG9rZW4gc3ByZWFkVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlNwcmVhZEV4cHJlc3Npb24iKTsKICAgIHZhciBleHByZXNzaW9uID0gcG9wKCk7CiAgICBpZiAoIWxpYnJhcnkubG9hZGVyLnRhcmdldC5lbmFibGVTcHJlYWRDb2xsZWN0aW9ucykgewogICAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4ud2l0aEFyZ3VtZW50cyhzcHJlYWRUb2tlbiksCiAgICAgICAgICBzcHJlYWRUb2tlbiwKICAgICAgICAgIHNwcmVhZFRva2VuKTsKICAgICAgcHVzaChpbnZhbGlkQ29sbGVjdGlvbkVsZW1lbnQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSAmJgogICAgICAgICFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlQ29uc3RhbnRVcGRhdGUyMDE4KSB7CiAgICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUNhbnRVc2VDb250cm9sRmxvd09yU3ByZWFkQXNDb25zdGFudAogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHNwcmVhZFRva2VuKSwKICAgICAgICAgIHNwcmVhZFRva2VuLAogICAgICAgICAgc3ByZWFkVG9rZW4pOwogICAgICBwdXNoKGludmFsaWRDb2xsZWN0aW9uRWxlbWVudCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB0cmFuc2Zvcm1Db2xsZWN0aW9ucyA9IHRydWU7CiAgICBwdXNoKGZvcmVzdC5zcHJlYWRFbGVtZW50KHRvVmFsdWUoZXhwcmVzc2lvbiksIHNwcmVhZFRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiVHlwZUFyZ3VtZW50cyIpOwogICAgcHVzaChjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxVbnJlc29sdmVkVHlwZT4oKS5wb3Aoc3RhY2ssIGNvdW50KSA/PwogICAgICAgIE51bGxWYWx1ZS5UeXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZFR5cGVBcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkludmFsaWRUeXBlQXJndW1lbnRzIik7CiAgICBwb3AoTnVsbFZhbHVlLlR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVUaGlzRXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgZGVidWdFdmVudCgiVGhpc0V4cHJlc3Npb24iKTsKICAgIGlmIChjb250ZXh0LmlzU2NvcGVSZWZlcmVuY2UgJiYgaXNJbnN0YW5jZUNvbnRleHQpIHsKICAgICAgaWYgKGV4dGVuc2lvblRoaXMgIT0gbnVsbCkgewogICAgICAgIHB1c2goX2NyZWF0ZVJlYWRPbmx5VmFyaWFibGVBY2Nlc3MoCiAgICAgICAgICAgIGV4dGVuc2lvblRoaXMsIHRva2VuLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksICd0aGlzJykpOwogICAgICB9IGVsc2UgewogICAgICAgIHB1c2gobmV3IFRoaXNBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgICAgIHRoaXMsIHRva2VuLCBpbkluaXRpYWxpemVyLCBpbkZpZWxkSW5pdGlhbGl6ZXIpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcHVzaChuZXcgSW5jb21wbGV0ZUVycm9yR2VuZXJhdG9yKAogICAgICAgICAgdGhpcywgdG9rZW4sIGZhc3RhLm1lc3NhZ2VUaGlzQXNJZGVudGlmaWVyKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN1cGVyRXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgZGVidWdFdmVudCgiU3VwZXJFeHByZXNzaW9uIik7CiAgICBpZiAoY29udGV4dC5pc1Njb3BlUmVmZXJlbmNlICYmCiAgICAgICAgaXNJbnN0YW5jZUNvbnRleHQgJiYKICAgICAgICBleHRlbnNpb25UaGlzID09IG51bGwpIHsKICAgICAgTWVtYmVyIG1lbWJlciA9IHRoaXMubWVtYmVyLnRhcmdldDsKICAgICAgbWVtYmVyLnRyYW5zZm9ybWVyRmxhZ3MgfD0gVHJhbnNmb3JtZXJGbGFnLnN1cGVyQ2FsbHM7CiAgICAgIHB1c2gobmV3IFRoaXNBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgICB0aGlzLCB0b2tlbiwgaW5Jbml0aWFsaXplciwgaW5GaWVsZEluaXRpYWxpemVyLAogICAgICAgICAgaXNTdXBlcjogdHJ1ZSkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChuZXcgSW5jb21wbGV0ZUVycm9yR2VuZXJhdG9yKAogICAgICAgICAgdGhpcywgdG9rZW4sIGZhc3RhLm1lc3NhZ2VTdXBlckFzSWRlbnRpZmllcikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYW1lZEFyZ3VtZW50KFRva2VuIGNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYW1lZEFyZ3VtZW50Iik7CiAgICBFeHByZXNzaW9uIHZhbHVlID0gcG9wRm9yVmFsdWUoKTsKICAgIElkZW50aWZpZXIgaWRlbnRpZmllciA9IHBvcCgpOwogICAgcHVzaChuZXcgTmFtZWRFeHByZXNzaW9uKGlkZW50aWZpZXIubmFtZSwgdmFsdWUpCiAgICAgIC4uZmlsZU9mZnNldCA9IGlkZW50aWZpZXIuY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uTmFtZShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiRnVuY3Rpb25OYW1lIik7CiAgICBJZGVudGlmaWVyIG5hbWUgPSBwb3AoKTsKICAgIFRva2VuIG5hbWVUb2tlbiA9IGRlcHJlY2F0ZWRfZXh0cmFjdFRva2VuKG5hbWUpOwogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQoCiAgICAgICAgbmFtZS5uYW1lLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCwKICAgICAgICBmb3JTeW50aGV0aWNUb2tlbjogbmFtZVRva2VuLmlzU3ludGhldGljLAogICAgICAgIGlzRmluYWw6IHRydWUsCiAgICAgICAgaXNMb2NhbEZ1bmN0aW9uOiB0cnVlKQogICAgICAuLmZpbGVPZmZzZXQgPSBuYW1lLmNoYXJPZmZzZXQ7CiAgICAvLyBUT0RPKGFoZSk6IFdoeSBhcmUgd2UgbG9va2luZyB1cCBpbiBsb2NhbCBzY29wZSwgYnV0IGRlY2xhcmluZyBpbiBwYXJlbnQKICAgIC8vIHNjb3BlPwogICAgRGVjbGFyYXRpb24gZXhpc3RpbmcgPSBzY29wZS5sb2NhbFtuYW1lLm5hbWVdOwogICAgaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKICAgICAgcmVwb3J0RHVwbGljYXRlZERlY2xhcmF0aW9uKGV4aXN0aW5nLCBuYW1lLm5hbWUsIG5hbWUuY2hhck9mZnNldCk7CiAgICB9CiAgICBwdXNoKG5ldyBGdW5jdGlvbkRlY2xhcmF0aW9uSnVkZ21lbnQoCiAgICAgICAgdmFyaWFibGUsCiAgICAgICAgLy8gVGhlIGZ1bmN0aW9uIG5vZGUgaXMgY3JlYXRlZCBsYXRlci4KICAgICAgICBudWxsKQogICAgICAuLmZpbGVPZmZzZXQgPSBiZWdpblRva2VuLmNoYXJPZmZzZXQpOwogICAgZGVjbGFyZVZhcmlhYmxlKHZhcmlhYmxlLCBzY29wZS5wYXJlbnQpOwogIH0KCiAgdm9pZCBlbnRlckZ1bmN0aW9uKCkgewogICAgZGVidWdFdmVudCgiZW50ZXJGdW5jdGlvbiIpOwogICAgZnVuY3Rpb25OZXN0aW5nTGV2ZWwrKzsKICAgIHB1c2goc3dpdGNoU2NvcGUgPz8gTnVsbFZhbHVlLlN3aXRjaFNjb3BlKTsKICAgIHN3aXRjaFNjb3BlID0gbnVsbDsKICAgIHB1c2goaW5DYXRjaEJsb2NrKTsKICAgIGluQ2F0Y2hCbG9jayA9IGZhbHNlOwogIH0KCiAgdm9pZCBleGl0RnVuY3Rpb24oKSB7CiAgICBkZWJ1Z0V2ZW50KCJleGl0RnVuY3Rpb24iKTsKICAgIGZ1bmN0aW9uTmVzdGluZ0xldmVsLS07CiAgICBpbkNhdGNoQmxvY2sgPSBwb3AoKTsKICAgIHN3aXRjaFNjb3BlID0gcG9wKCk7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBwdXNoKHR5cGVWYXJpYWJsZXMgPz8gTnVsbFZhbHVlLlR5cGVWYXJpYWJsZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Mb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb24iKTsKICAgIGVudGVyRnVuY3Rpb24oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5OYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5OYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbiIpOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcG9wKCk7CiAgICAvLyBDcmVhdGUgYW4gYWRkaXRpb25hbCBzY29wZSBpbiB3aGljaCB0aGUgbmFtZWQgZnVuY3Rpb24gZXhwcmVzc2lvbiBpcwogICAgLy8gZGVjbGFyZWQuCiAgICBlbnRlckxvY2FsU2NvcGUoIm5hbWVkIGZ1bmN0aW9uIik7CiAgICBwdXNoKHR5cGVWYXJpYWJsZXMgPz8gTnVsbFZhbHVlLlR5cGVWYXJpYWJsZXMpOwogICAgZW50ZXJGdW5jdGlvbigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZ1bmN0aW9uRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5GdW5jdGlvbkV4cHJlc3Npb24iKTsKICAgIGVudGVyRnVuY3Rpb24oKTsKICB9CgogIHZvaWQgcHVzaE5hbWVkRnVuY3Rpb24oVG9rZW4gdG9rZW4sIGJvb2wgaXNGdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgIFN0YXRlbWVudCBib2R5ID0gcG9wU3RhdGVtZW50KCk7CiAgICBBc3luY01hcmtlciBhc3luY01vZGlmaWVyID0gcG9wKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgRm9ybWFsUGFyYW1ldGVycyBmb3JtYWxzID0gcG9wKCk7CiAgICBPYmplY3QgZGVjbGFyYXRpb24gPSBwb3AoKTsKICAgIFVucmVzb2x2ZWRUeXBlIHJldHVyblR5cGUgPSBwb3AoKTsKICAgIGJvb2wgaGFzSW1wbGljaXRSZXR1cm5UeXBlID0gcmV0dXJuVHlwZSA9PSBudWxsOwogICAgZXhpdEZ1bmN0aW9uKCk7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVQYXJhbWV0ZXJzID0gcG9wKCk7CiAgICBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zOwogICAgaWYgKCFpc0Z1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICBhbm5vdGF0aW9ucyA9IHBvcCgpOyAvLyBNZXRhZGF0YS4KICAgIH0KICAgIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiA9IGZvcm1hbHMuYnVpbGRGdW5jdGlvbk5vZGUobGlicmFyeSwgcmV0dXJuVHlwZSwKICAgICAgICB0eXBlUGFyYW1ldGVycywgYXN5bmNNb2RpZmllciwgYm9keSwgdG9rZW4uY2hhck9mZnNldCk7CgogICAgaWYgKGRlY2xhcmF0aW9uIGlzIEZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IGRlY2xhcmF0aW9uLnZhcmlhYmxlOwogICAgICBpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogICAgICAgIGZvciAoRXhwcmVzc2lvbiBhbm5vdGF0aW9uIGluIGFubm90YXRpb25zKSB7CiAgICAgICAgICB2YXJpYWJsZS5hZGRBbm5vdGF0aW9uKGFubm90YXRpb24pOwogICAgICAgIH0KICAgICAgfQogICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uSnVkZ21lbnQuc2V0SGFzSW1wbGljaXRSZXR1cm5UeXBlKAogICAgICAgICAgZGVjbGFyYXRpb24sIGhhc0ltcGxpY2l0UmV0dXJuVHlwZSk7CgogICAgICB2YXJpYWJsZS50eXBlID0gZnVuY3Rpb24uZnVuY3Rpb25UeXBlOwogICAgICBpZiAoaXNGdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgICBFeHByZXNzaW9uIG9sZEluaXRpYWxpemVyID0gdmFyaWFibGUuaW5pdGlhbGl6ZXI7CiAgICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIgPSBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKGZ1bmN0aW9uKQogICAgICAgICAgLi5wYXJlbnQgPSB2YXJpYWJsZQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZm9ybWFscy5jaGFyT2Zmc2V0OwogICAgICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gbmV3IE5hbWVkRnVuY3Rpb25FeHByZXNzaW9uSnVkZ21lbnQodmFyaWFibGUpOwogICAgICAgIGlmIChvbGRJbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgICAvLyBUaGlzIG11c3QgaGF2ZSBiZWVuIGEgY29tcGlsZS10aW1lIGVycm9yLgogICAgICAgICAgRXhwcmVzc2lvbiBlcnJvciA9IGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKG9sZEluaXRpYWxpemVyKTsKICAgICAgICAgIGFzc2VydChpc0Vycm9uZW91c05vZGUoZXJyb3IpKTsKICAgICAgICAgIGludCBvZmZzZXQgPSBmb3Jlc3QucmVhZE9mZnNldChleHByZXNzaW9uKTsKICAgICAgICAgIHB1c2god3JhcFN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgICAgICAgbmV3IExldCgKICAgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoZXJyb3IpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgICAgICAgICAgICBleHByZXNzaW9uKQogICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgICAgICAgIG9mZnNldCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwdXNoKGV4cHJlc3Npb24pOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBkZWNsYXJhdGlvbi5mdW5jdGlvbiA9IGZ1bmN0aW9uOwogICAgICAgIGZ1bmN0aW9uLnBhcmVudCA9IGRlY2xhcmF0aW9uOwogICAgICAgIGlmICh2YXJpYWJsZS5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgICAvLyBUaGlzIG11c3QgaGF2ZSBiZWVuIGEgY29tcGlsZS10aW1lIGVycm9yLgogICAgICAgICAgYXNzZXJ0KGlzRXJyb25lb3VzTm9kZSh2YXJpYWJsZS5pbml0aWFsaXplcikpOwoKICAgICAgICAgIHB1c2goZm9yZXN0LmJsb2NrKAogICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgPFN0YXRlbWVudD5bCiAgICAgICAgICAgICAgICBmb3Jlc3QuZXhwcmVzc2lvblN0YXRlbWVudCh2YXJpYWJsZS5pbml0aWFsaXplciwgdG9rZW4pLAogICAgICAgICAgICAgICAgZGVjbGFyYXRpb24KICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgIG51bGwpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGRlY2xhcmF0aW9uLmZpbGVPZmZzZXQpOwogICAgICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIgPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwdXNoKGRlY2xhcmF0aW9uKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB1bmhhbmRsZWQoIiR7ZGVjbGFyYXRpb24ucnVudGltZVR5cGV9IiwgInB1c2hOYW1lZEZ1bmN0aW9uIiwKICAgICAgICAgIHRva2VuLmNoYXJPZmZzZXQsIHVyaSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE5hbWVkRnVuY3Rpb25FeHByZXNzaW9uKFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbiIpOwogICAgcHVzaE5hbWVkRnVuY3Rpb24oZW5kVG9rZW4sIHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbiIpOwogICAgcHVzaE5hbWVkRnVuY3Rpb24odG9rZW4sIGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRnVuY3Rpb25FeHByZXNzaW9uKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGdW5jdGlvbkV4cHJlc3Npb24iKTsKICAgIFN0YXRlbWVudCBib2R5ID0gcG9wU3RhdGVtZW50KCk7CiAgICBBc3luY01hcmtlciBhc3luY01vZGlmaWVyID0gcG9wKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgRm9ybWFsUGFyYW1ldGVycyBmb3JtYWxzID0gcG9wKCk7CiAgICBleGl0RnVuY3Rpb24oKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVBhcmFtZXRlcnMgPSBwb3AoKTsKICAgIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiA9IGZvcm1hbHMuYnVpbGRGdW5jdGlvbk5vZGUoCiAgICAgICAgbGlicmFyeSwgbnVsbCwgdHlwZVBhcmFtZXRlcnMsIGFzeW5jTW9kaWZpZXIsIGJvZHksIHRva2VuLmNoYXJPZmZzZXQpCiAgICAgIC4uZmlsZU9mZnNldCA9IGJlZ2luVG9rZW4uY2hhck9mZnNldDsKCiAgICBpZiAobGlicmFyeS5sZWdhY3lNb2RlICYmIGFzeW5jTW9kaWZpZXIgIT0gQXN5bmNNYXJrZXIuU3luYykgewogICAgICBEYXJ0VHlwZSByZXR1cm5UeXBlOwogICAgICBzd2l0Y2ggKGFzeW5jTW9kaWZpZXIpIHsKICAgICAgICBjYXNlIEFzeW5jTWFya2VyLkFzeW5jOgogICAgICAgICAgcmV0dXJuVHlwZSA9IGNvcmVUeXBlcy5mdXR1cmVDbGFzcy5yYXdUeXBlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBc3luY01hcmtlci5Bc3luY1N0YXI6CiAgICAgICAgICByZXR1cm5UeXBlID0gY29yZVR5cGVzLnN0cmVhbUNsYXNzLnJhd1R5cGU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFzeW5jTWFya2VyLlN5bmNTdGFyOgogICAgICAgICAgcmV0dXJuVHlwZSA9IGNvcmVUeXBlcy5pdGVyYWJsZUNsYXNzLnJhd1R5cGU7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuVHlwZSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBmdW5jdGlvbi5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKICAgIH0KICAgIGlmIChjb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUpIHsKICAgICAgcHVzaChidWlsZFByb2JsZW0oZmFzdGEubWVzc2FnZU5vdEFDb25zdGFudEV4cHJlc3Npb24sIGZvcm1hbHMuY2hhck9mZnNldCwKICAgICAgICAgIGZvcm1hbHMubGVuZ3RoKSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKG5ldyBGdW5jdGlvbkV4cHJlc3Npb24oZnVuY3Rpb24pCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4oYmVnaW5Ub2tlbikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmREb1doaWxlU3RhdGVtZW50KAogICAgICBUb2tlbiBkb0tleXdvcmQsIFRva2VuIHdoaWxlS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkRvV2hpbGVTdGF0ZW1lbnQiKTsKICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIFN0YXRlbWVudCBib2R5ID0gcG9wU3RhdGVtZW50KCk7CiAgICBKdW1wVGFyZ2V0IGNvbnRpbnVlVGFyZ2V0ID0gZXhpdENvbnRpbnVlVGFyZ2V0KCk7CiAgICBKdW1wVGFyZ2V0IGJyZWFrVGFyZ2V0ID0gZXhpdEJyZWFrVGFyZ2V0KCk7CiAgICBpZiAoY29udGludWVUYXJnZXQuaGFzVXNlcnMpIHsKICAgICAgYm9keSA9IGZvcmVzdC5zeW50aGV0aWNMYWJlbGVkU3RhdGVtZW50KGJvZHkpOwogICAgICBjb250aW51ZVRhcmdldC5yZXNvbHZlQ29udGludWVzKGZvcmVzdCwgYm9keSk7CiAgICB9CiAgICBTdGF0ZW1lbnQgcmVzdWx0ID0KICAgICAgICBmb3Jlc3QuZG9TdGF0ZW1lbnQoZG9LZXl3b3JkLCBib2R5LCB3aGlsZUtleXdvcmQsIGNvbmRpdGlvbiwgZW5kVG9rZW4pOwogICAgaWYgKGJyZWFrVGFyZ2V0Lmhhc1VzZXJzKSB7CiAgICAgIHJlc3VsdCA9IGZvcmVzdC5zeW50aGV0aWNMYWJlbGVkU3RhdGVtZW50KHJlc3VsdCk7CiAgICAgIGJyZWFrVGFyZ2V0LnJlc29sdmVCcmVha3MoZm9yZXN0LCByZXN1bHQpOwogICAgfQogICAgZXhpdExvb3BPclN3aXRjaChyZXN1bHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvckluRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZW50ZXJMb2NhbFNjb3BlKG51bGwsIHNjb3BlLnBhcmVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvckluRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiRm9ySW5FeHByZXNzaW9uIik7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIHB1c2goZXhwcmVzc2lvbiA/PyBOdWxsVmFsdWUuRXhwcmVzc2lvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZvckluTG9vcFBhcnRzKFRva2VuIGF3YWl0VG9rZW4sIFRva2VuIGZvclRva2VuLAogICAgICBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsIFRva2VuIGluS2V5d29yZCkgewogICAgcHVzaChhd2FpdFRva2VuID8/IE51bGxWYWx1ZS5Bd2FpdFRva2VuKTsKICAgIHB1c2goZm9yVG9rZW4pOwogICAgcHVzaChpbktleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JJbkNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JJbkNvbnRyb2xGbG93Iik7CiAgICB2YXIgZW50cnkgPSBwb3AoKTsKICAgIFRva2VuIGluVG9rZW4gPSBwb3AoKTsKICAgIFRva2VuIGZvclRva2VuID0gcG9wKCk7CiAgICBUb2tlbiBhd2FpdFRva2VuID0gcG9wKE51bGxWYWx1ZS5Bd2FpdFRva2VuKTsKICAgIEV4cHJlc3Npb24gaXRlcmFibGUgPSBwb3BGb3JWYWx1ZSgpOwogICAgT2JqZWN0IGx2YWx1ZSA9IHBvcCgpOyAvLyBsdmFsdWUKICAgIGV4aXRMb2NhbFNjb3BlKCk7CgogICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlQ29udHJvbEZsb3dDb2xsZWN0aW9ucykgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVwb3J0IGEgbW9yZSB1c2VyIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UKICAgICAgLy8gd2hlbiBhbiBleHBlcmltZW50IGlzIG5vdCBlbmFibGVkCiAgICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKGZvclRva2VuKSwKICAgICAgICAgIGZvclRva2VuLAogICAgICAgICAgZm9yVG9rZW4pOwogICAgICBwdXNoKGludmFsaWRDb2xsZWN0aW9uRWxlbWVudCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lKSB7CiAgICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUNhbnRVc2VDb250cm9sRmxvd09yU3ByZWFkQXNDb25zdGFudAogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZvclRva2VuKSwKICAgICAgICAgIGZvclRva2VuLAogICAgICAgICAgZm9yVG9rZW4pOwogICAgICBwdXNoKGludmFsaWRDb2xsZWN0aW9uRWxlbWVudCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB0cmFuc2Zvcm1Db2xsZWN0aW9ucyA9IHRydWU7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gYnVpbGRGb3JJblZhcmlhYmxlKGx2YWx1ZSk7CiAgICBFeHByZXNzaW9uIHByb2JsZW0gPSBjaGVja0ZvckluVmFyaWFibGUobHZhbHVlLCB2YXJpYWJsZSwgZm9yVG9rZW4pOwogICAgU3RhdGVtZW50IHByb2xvZ3VlID0gYnVpbGRGb3JJbkJvZHkobHZhbHVlLCB2YXJpYWJsZSwgZm9yVG9rZW4sIGluVG9rZW4pOwogICAgaWYgKGVudHJ5IGlzIE1hcEVudHJ5KSB7CiAgICAgIHB1c2goZm9yZXN0LmZvckluTWFwRW50cnkoCiAgICAgICAgICB2YXJpYWJsZSwgaXRlcmFibGUsIHByb2xvZ3VlLCBlbnRyeSwgcHJvYmxlbSwgZm9yVG9rZW4sCiAgICAgICAgICBpc0FzeW5jOiBhd2FpdFRva2VuICE9IG51bGwpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goZm9yZXN0LmZvckluRWxlbWVudCgKICAgICAgICAgIHZhcmlhYmxlLCBpdGVyYWJsZSwgcHJvbG9ndWUsIHRvVmFsdWUoZW50cnkpLCBwcm9ibGVtLCBmb3JUb2tlbiwKICAgICAgICAgIGlzQXN5bmM6IGF3YWl0VG9rZW4gIT0gbnVsbCkpOwogICAgfQogIH0KCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBidWlsZEZvckluVmFyaWFibGUoT2JqZWN0IGx2YWx1ZSkgewogICAgaWYgKGx2YWx1ZSBpcyBWYXJpYWJsZURlY2xhcmF0aW9uKSByZXR1cm4gbHZhbHVlOwogICAgcmV0dXJuIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQuZm9yVmFsdWUobnVsbCwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpOwogIH0KCiAgRXhwcmVzc2lvbiBjaGVja0ZvckluVmFyaWFibGUoCiAgICAgIE9iamVjdCBsdmFsdWUsIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIFRva2VuIGZvclRva2VuKSB7CiAgICBpZiAobHZhbHVlIGlzIFZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgaWYgKHZhcmlhYmxlLmlzQ29uc3QpIHsKICAgICAgICByZXR1cm4gYnVpbGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VGb3JJbkxvb3BXaXRoQ29uc3RWYXJpYWJsZSwKICAgICAgICAgICAgdmFyaWFibGUuZmlsZU9mZnNldCwgdmFyaWFibGUubmFtZS5sZW5ndGgpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGx2YWx1ZSBpcyEgR2VuZXJhdG9yKSB7CiAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGZvcmVzdC5pc1ZhcmlhYmxlc0RlY2xhcmF0aW9uKGx2YWx1ZSkKICAgICAgICAgID8gZmFzdGEubWVzc2FnZUZvckluTG9vcEV4YWN0bHlPbmVWYXJpYWJsZQogICAgICAgICAgOiBmYXN0YS5tZXNzYWdlRm9ySW5Mb29wTm90QXNzaWduYWJsZTsKICAgICAgVG9rZW4gdG9rZW4gPSBmb3JUb2tlbi5uZXh0Lm5leHQ7CiAgICAgIHJldHVybiBidWlsZFByb2JsZW0oCiAgICAgICAgICBtZXNzYWdlLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksIGxlbmd0aEZvclRva2VuKHRva2VuKSk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIFN0YXRlbWVudCBidWlsZEZvckluQm9keShPYmplY3QgbHZhbHVlLCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLAogICAgICBUb2tlbiBmb3JUb2tlbiwgVG9rZW4gaW5LZXl3b3JkKSB7CiAgICBpZiAobHZhbHVlIGlzIFZhcmlhYmxlRGVjbGFyYXRpb24pIHJldHVybiBudWxsOwogICAgaWYgKGx2YWx1ZSBpcyBHZW5lcmF0b3IpIHsKICAgICAgLy8vIFdlIGFyZSBpbiB0aGlzIGNhc2UsIHdoZXJlIGBsdmFsdWVgIGlzbid0IGEgW1ZhcmlhYmxlRGVjbGFyYXRpb25dOgogICAgICAvLy8KICAgICAgLy8vICAgICBmb3IgKGx2YWx1ZSBpbiBleHByZXNzaW9uKSBib2R5CiAgICAgIC8vLwogICAgICAvLy8gVGhpcyBpcyBub3JtYWxpemVkIHRvOgogICAgICAvLy8KICAgICAgLy8vICAgICBmb3IgKGZpbmFsICN0IGluIGV4cHJlc3Npb24pIHsKICAgICAgLy8vICAgICAgIGx2YWx1ZSA9ICN0OwogICAgICAvLy8gICAgICAgYm9keTsKICAgICAgLy8vICAgICB9CiAgICAgIFR5cGVQcm9tb3Rpb25GYWN0IGZhY3QgPQogICAgICAgICAgdHlwZVByb21vdGVyPy5nZXRGYWN0Rm9yQWNjZXNzKHZhcmlhYmxlLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCk7CiAgICAgIFR5cGVQcm9tb3Rpb25TY29wZSBzY29wZSA9IHR5cGVQcm9tb3Rlcj8uY3VycmVudFNjb3BlOwogICAgICBFeHByZXNzaW9uIHN5bnRoZXRpY0Fzc2lnbm1lbnQgPSBsdmFsdWUuYnVpbGRBc3NpZ25tZW50KAogICAgICAgICAgbmV3IFZhcmlhYmxlR2V0SnVkZ21lbnQodmFyaWFibGUsIGZhY3QsIHNjb3BlKQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBpbktleXdvcmQub2Zmc2V0LAogICAgICAgICAgdm9pZENvbnRleHQ6IHRydWUpOwogICAgICBpZiAoc3ludGhldGljQXNzaWdubWVudCBpcyBzaGFkb3cuU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50KSB7CiAgICAgICAgc3ludGhldGljQXNzaWdubWVudCA9IHdyYXBTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgICAgICBkZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihzeW50aGV0aWNBc3NpZ25tZW50KSwKICAgICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4obHZhbHVlLnRva2VuKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZvcmVzdC5leHByZXNzaW9uU3RhdGVtZW50KHN5bnRoZXRpY0Fzc2lnbm1lbnQsIG51bGwpOwogICAgfQogICAgTWVzc2FnZSBtZXNzYWdlID0gZm9yZXN0LmlzVmFyaWFibGVzRGVjbGFyYXRpb24obHZhbHVlKQogICAgICAgID8gZmFzdGEubWVzc2FnZUZvckluTG9vcEV4YWN0bHlPbmVWYXJpYWJsZQogICAgICAgIDogZmFzdGEubWVzc2FnZUZvckluTG9vcE5vdEFzc2lnbmFibGU7CiAgICBUb2tlbiB0b2tlbiA9IGZvclRva2VuLm5leHQubmV4dDsKICAgIFN0YXRlbWVudCBib2R5OwogICAgaWYgKGZvcmVzdC5pc1ZhcmlhYmxlc0RlY2xhcmF0aW9uKGx2YWx1ZSkpIHsKICAgICAgYm9keSA9IGZvcmVzdC5ibG9jaygKICAgICAgICAgIG51bGwsCiAgICAgICAgICAvLyBOZXcgbGlzdCBiZWNhdXNlIHRoZSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBhIGdyb3dhYmxlIGxpc3QuCiAgICAgICAgICBuZXcgTGlzdDxTdGF0ZW1lbnQ+LmZyb20oCiAgICAgICAgICAgICAgZm9yZXN0LnZhcmlhYmxlc0RlY2xhcmF0aW9uRXh0cmFjdERlY2xhcmF0aW9ucyhsdmFsdWUpKSwKICAgICAgICAgIG51bGwpOwogICAgfSBlbHNlIHsKICAgICAgYm9keSA9IGZvcmVzdC5leHByZXNzaW9uU3RhdGVtZW50KGx2YWx1ZSwgbnVsbCk7CiAgICB9CiAgICByZXR1cm4gY29tYmluZVN0YXRlbWVudHMoCiAgICAgICAgZm9yZXN0LmV4cHJlc3Npb25TdGF0ZW1lbnQoCiAgICAgICAgICAgIGJ1aWxkUHJvYmxlbShtZXNzYWdlLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksIGxlbmd0aEZvclRva2VuKHRva2VuKSksCiAgICAgICAgICAgIG51bGwpLAogICAgICAgIGJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JJbihUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiRm9ySW4iKTsKICAgIFN0YXRlbWVudCBib2R5ID0gcG9wU3RhdGVtZW50KCk7CgogICAgVG9rZW4gaW5LZXl3b3JkID0gcG9wKCk7CiAgICBUb2tlbiBmb3JUb2tlbiA9IHBvcCgpOwogICAgVG9rZW4gYXdhaXRUb2tlbiA9IHBvcChOdWxsVmFsdWUuQXdhaXRUb2tlbik7CgogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIE9iamVjdCBsdmFsdWUgPSBwb3AoKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBKdW1wVGFyZ2V0IGNvbnRpbnVlVGFyZ2V0ID0gZXhpdENvbnRpbnVlVGFyZ2V0KCk7CiAgICBKdW1wVGFyZ2V0IGJyZWFrVGFyZ2V0ID0gZXhpdEJyZWFrVGFyZ2V0KCk7CiAgICBpZiAoY29udGludWVUYXJnZXQuaGFzVXNlcnMpIHsKICAgICAgYm9keSA9IGZvcmVzdC5zeW50aGV0aWNMYWJlbGVkU3RhdGVtZW50KGJvZHkpOwogICAgICBjb250aW51ZVRhcmdldC5yZXNvbHZlQ29udGludWVzKGZvcmVzdCwgYm9keSk7CiAgICB9CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gYnVpbGRGb3JJblZhcmlhYmxlKGx2YWx1ZSk7CiAgICBFeHByZXNzaW9uIHByb2JsZW0gPSBjaGVja0ZvckluVmFyaWFibGUobHZhbHVlLCB2YXJpYWJsZSwgZm9yVG9rZW4pOwogICAgU3RhdGVtZW50IHByb2xvZ3VlID0gYnVpbGRGb3JJbkJvZHkobHZhbHVlLCB2YXJpYWJsZSwgZm9yVG9rZW4sIGluS2V5d29yZCk7CiAgICBpZiAocHJvbG9ndWUgIT0gbnVsbCkgewogICAgICBpZiAocHJvbG9ndWUgaXMgQmxvY2spIHsKICAgICAgICBpZiAoYm9keSBpcyBCbG9jaykgewogICAgICAgICAgZm9yIChTdGF0ZW1lbnQgc3RhdGVtZW50IGluIGJvZHkuc3RhdGVtZW50cykgewogICAgICAgICAgICBwcm9sb2d1ZS5hZGRTdGF0ZW1lbnQoc3RhdGVtZW50KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHJvbG9ndWUuYWRkU3RhdGVtZW50KGJvZHkpOwogICAgICAgIH0KICAgICAgICBib2R5ID0gcHJvbG9ndWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYm9keSA9IGNvbWJpbmVTdGF0ZW1lbnRzKHByb2xvZ3VlLCBib2R5KTsKICAgICAgfQogICAgfQogICAgU3RhdGVtZW50IHJlc3VsdCA9IG5ldyBGb3JJblN0YXRlbWVudCh2YXJpYWJsZSwgZXhwcmVzc2lvbiwgYm9keSwKICAgICAgICBpc0FzeW5jOiBhd2FpdFRva2VuICE9IG51bGwpCiAgICAgIC4uZmlsZU9mZnNldCA9IGF3YWl0VG9rZW4/LmNoYXJPZmZzZXQgPz8gZm9yVG9rZW4uY2hhck9mZnNldAogICAgICAuLmJvZHlPZmZzZXQgPSBib2R5LmZpbGVPZmZzZXQ7IC8vIFRPRE8oYWhlKTogSXNuJ3QgdGhpcyByZWR1bmRhbnQ/CiAgICBpZiAoYnJlYWtUYXJnZXQuaGFzVXNlcnMpIHsKICAgICAgcmVzdWx0ID0gZm9yZXN0LnN5bnRoZXRpY0xhYmVsZWRTdGF0ZW1lbnQocmVzdWx0KTsKICAgICAgYnJlYWtUYXJnZXQucmVzb2x2ZUJyZWFrcyhmb3Jlc3QsIHJlc3VsdCk7CiAgICB9CiAgICBpZiAocHJvYmxlbSAhPSBudWxsKSB7CiAgICAgIHJlc3VsdCA9CiAgICAgICAgICBjb21iaW5lU3RhdGVtZW50cyhmb3Jlc3QuZXhwcmVzc2lvblN0YXRlbWVudChwcm9ibGVtLCBudWxsKSwgcmVzdWx0KTsKICAgIH0KICAgIGV4aXRMb29wT3JTd2l0Y2gocmVzdWx0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGFiZWwoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkxhYmVsIik7CiAgICBJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBwb3AoKTsKICAgIHB1c2gobmV3IExhYmVsKGlkZW50aWZpZXIubmFtZSwgaWRlbnRpZmllci5jaGFyT2Zmc2V0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTGFiZWxlZFN0YXRlbWVudChUb2tlbiB0b2tlbiwgaW50IGxhYmVsQ291bnQpIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luTGFiZWxlZFN0YXRlbWVudCIpOwogICAgTGlzdDxMYWJlbD4gbGFiZWxzID0KICAgICAgICBjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxMYWJlbD4oKS5wb3Aoc3RhY2ssIGxhYmVsQ291bnQpOwogICAgZW50ZXJMb2NhbFNjb3BlKG51bGwsIHNjb3BlLmNyZWF0ZU5lc3RlZExhYmVsU2NvcGUoKSk7CiAgICBMYWJlbFRhcmdldCB0YXJnZXQgPQogICAgICAgIG5ldyBMYWJlbFRhcmdldChtZW1iZXIsIGZ1bmN0aW9uTmVzdGluZ0xldmVsLCB0b2tlbi5jaGFyT2Zmc2V0KTsKICAgIGlmIChsYWJlbHMgIT0gbnVsbCkgewogICAgICBmb3IgKExhYmVsIGxhYmVsIGluIGxhYmVscykgewogICAgICAgIHNjb3BlLmRlY2xhcmVMYWJlbChsYWJlbC5uYW1lLCB0YXJnZXQpOwogICAgICB9CiAgICB9CiAgICBwdXNoKHRhcmdldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExhYmVsZWRTdGF0ZW1lbnQoaW50IGxhYmVsQ291bnQpIHsKICAgIGRlYnVnRXZlbnQoIkxhYmVsZWRTdGF0ZW1lbnQiKTsKICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBwb3AoKTsKICAgIExhYmVsVGFyZ2V0IHRhcmdldCA9IHBvcCgpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIGlmICh0YXJnZXQuYnJlYWtUYXJnZXQuaGFzVXNlcnMgfHwgdGFyZ2V0LmNvbnRpbnVlVGFyZ2V0Lmhhc1VzZXJzKSB7CiAgICAgIGlmIChmb3Jlc3QuaXNWYXJpYWJsZXNEZWNsYXJhdGlvbihzdGF0ZW1lbnQpKSB7CiAgICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgICBmYXN0YS5tZXNzYWdlSW50ZXJuYWxQcm9ibGVtTGFiZWxVc2FnZUluVmFyaWFibGVzRGVjbGFyYXRpb24sCiAgICAgICAgICAgIHN0YXRlbWVudC5maWxlT2Zmc2V0LAogICAgICAgICAgICB1cmkpOwogICAgICB9CiAgICAgIGlmIChzdGF0ZW1lbnQgaXMhIExhYmVsZWRTdGF0ZW1lbnQpIHsKICAgICAgICBzdGF0ZW1lbnQgPSBmb3Jlc3Quc3ludGhldGljTGFiZWxlZFN0YXRlbWVudChzdGF0ZW1lbnQpOwogICAgICB9CiAgICAgIHRhcmdldC5icmVha1RhcmdldC5yZXNvbHZlQnJlYWtzKGZvcmVzdCwgc3RhdGVtZW50KTsKICAgICAgdGFyZ2V0LmNvbnRpbnVlVGFyZ2V0LnJlc29sdmVDb250aW51ZXMoZm9yZXN0LCBzdGF0ZW1lbnQpOwogICAgfQogICAgcHVzaChzdGF0ZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRSZXRocm93U3RhdGVtZW50KFRva2VuIHJldGhyb3dUb2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlJldGhyb3dTdGF0ZW1lbnQiKTsKICAgIGlmIChpbkNhdGNoQmxvY2spIHsKICAgICAgcHVzaChmb3Jlc3QucmV0aHJvd1N0YXRlbWVudChyZXRocm93VG9rZW4sIGVuZFRva2VuKSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKG5ldyBFeHByZXNzaW9uU3RhdGVtZW50SnVkZ21lbnQoYnVpbGRQcm9ibGVtKAogICAgICAgICAgZmFzdGEubWVzc2FnZVJldGhyb3dOb3RDYXRjaCwKICAgICAgICAgIG9mZnNldEZvclRva2VuKHJldGhyb3dUb2tlbiksCiAgICAgICAgICBsZW5ndGhGb3JUb2tlbihyZXRocm93VG9rZW4pKSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihyZXRocm93VG9rZW4pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRmluYWxseUJsb2NrKFRva2VuIGZpbmFsbHlLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJGaW5hbGx5QmxvY2siKTsKICAgIC8vIERvIG5vdGhpbmcsIGhhbmRsZWQgYnkgW2VuZFRyeVN0YXRlbWVudF0uCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFdoaWxlU3RhdGVtZW50KFRva2VuIHdoaWxlS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIldoaWxlU3RhdGVtZW50Iik7CiAgICBTdGF0ZW1lbnQgYm9keSA9IHBvcFN0YXRlbWVudCgpOwogICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgSnVtcFRhcmdldCBjb250aW51ZVRhcmdldCA9IGV4aXRDb250aW51ZVRhcmdldCgpOwogICAgSnVtcFRhcmdldCBicmVha1RhcmdldCA9IGV4aXRCcmVha1RhcmdldCgpOwogICAgaWYgKGNvbnRpbnVlVGFyZ2V0Lmhhc1VzZXJzKSB7CiAgICAgIGJvZHkgPSBmb3Jlc3Quc3ludGhldGljTGFiZWxlZFN0YXRlbWVudChib2R5KTsKICAgICAgY29udGludWVUYXJnZXQucmVzb2x2ZUNvbnRpbnVlcyhmb3Jlc3QsIGJvZHkpOwogICAgfQogICAgU3RhdGVtZW50IHJlc3VsdCA9IGZvcmVzdC53aGlsZVN0YXRlbWVudCh3aGlsZUtleXdvcmQsIGNvbmRpdGlvbiwgYm9keSk7CiAgICBpZiAoYnJlYWtUYXJnZXQuaGFzVXNlcnMpIHsKICAgICAgcmVzdWx0ID0gZm9yZXN0LnN5bnRoZXRpY0xhYmVsZWRTdGF0ZW1lbnQocmVzdWx0KTsKICAgICAgYnJlYWtUYXJnZXQucmVzb2x2ZUJyZWFrcyhmb3Jlc3QsIHJlc3VsdCk7CiAgICB9CiAgICBleGl0TG9vcE9yU3dpdGNoKHJlc3VsdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUVtcHR5U3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJFbXB0eVN0YXRlbWVudCIpOwogICAgcHVzaChmb3Jlc3QuZW1wdHlTdGF0ZW1lbnQodG9rZW4pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Bc3NlcnQoVG9rZW4gYXNzZXJ0S2V5d29yZCwgQXNzZXJ0IGtpbmQpIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luQXNzZXJ0Iik7CiAgICAvLyBJZiBpbiBhbiBhc3NlcnQgaW5pdGlhbGl6ZXIsIG1ha2Ugc3VyZSBbaW5Jbml0aWFsaXplcl0gaXMgZmFsc2Ugc28gd2UKICAgIC8vIHVzZSB0aGUgZm9ybWFsIHBhcmFtZXRlciBzY29wZS4gSWYgdGhpcyBpcyBhbnkgb3RoZXIga2luZCBvZiBhc3NlcnQsCiAgICAvLyBpbkluaXRpYWxpemVyIHNob3VsZCBiZSBmYWxzZSBhbnl3YXkuCiAgICBpbkluaXRpYWxpemVyID0gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEFzc2VydChUb2tlbiBhc3NlcnRLZXl3b3JkLCBBc3NlcnQga2luZCwgVG9rZW4gbGVmdFBhcmVudGhlc2lzLAogICAgICBUb2tlbiBjb21tYVRva2VuLCBUb2tlbiBzZW1pY29sb25Ub2tlbikgewogICAgZGVidWdFdmVudCgiQXNzZXJ0Iik7CiAgICBFeHByZXNzaW9uIG1lc3NhZ2UgPSBwb3BGb3JWYWx1ZUlmTm90TnVsbChjb21tYVRva2VuKTsKICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0gcG9wRm9yVmFsdWUoKTsKCiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBBc3NlcnQuU3RhdGVtZW50OgogICAgICAgIHB1c2goZm9yZXN0LmFzc2VydFN0YXRlbWVudChhc3NlcnRLZXl3b3JkLCBsZWZ0UGFyZW50aGVzaXMsIGNvbmRpdGlvbiwKICAgICAgICAgICAgY29tbWFUb2tlbiwgbWVzc2FnZSwgc2VtaWNvbG9uVG9rZW4pKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQXNzZXJ0LkV4cHJlc3Npb246CiAgICAgICAgLy8gVGhlIHBhcnNlciBoYXMgYWxyZWFkeSByZXBvcnRlZCBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgYXNzZXJ0CiAgICAgICAgLy8gY2Fubm90IGJlIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4KICAgICAgICBwdXNoKGJ1aWxkUHJvYmxlbShmYXN0YS5tZXNzYWdlQXNzZXJ0QXNFeHByZXNzaW9uLCBhc3NlcnRLZXl3b3JkLm9mZnNldCwKICAgICAgICAgICAgYXNzZXJ0S2V5d29yZC5sZW5ndGgpKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQXNzZXJ0LkluaXRpYWxpemVyOgogICAgICAgIHB1c2goZm9yZXN0LmFzc2VydEluaXRpYWxpemVyKAogICAgICAgICAgICBhc3NlcnRLZXl3b3JkLCBsZWZ0UGFyZW50aGVzaXMsIGNvbmRpdGlvbiwgY29tbWFUb2tlbiwgbWVzc2FnZSkpOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRZaWVsZFN0YXRlbWVudChUb2tlbiB5aWVsZFRva2VuLCBUb2tlbiBzdGFyVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJZaWVsZFN0YXRlbWVudCIpOwogICAgcHVzaChmb3Jlc3QueWllbGRTdGF0ZW1lbnQoeWllbGRUb2tlbiwgc3RhclRva2VuLCBwb3BGb3JWYWx1ZSgpLCBlbmRUb2tlbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblN3aXRjaEJsb2NrKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpblN3aXRjaEJsb2NrIik7CiAgICBlbnRlckxvY2FsU2NvcGUoInN3aXRjaCBibG9jayIpOwogICAgZW50ZXJTd2l0Y2hTY29wZSgpOwogICAgZW50ZXJCcmVha1RhcmdldCh0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Td2l0Y2hDYXNlKGludCBsYWJlbENvdW50LCBpbnQgZXhwcmVzc2lvbkNvdW50LCBUb2tlbiBmaXJzdFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpblN3aXRjaENhc2UiKTsKICAgIGludCBjb3VudCA9IGxhYmVsQ291bnQgKyBleHByZXNzaW9uQ291bnQ7CiAgICBMaXN0PE9iamVjdD4gbGFiZWxzQW5kRXhwcmVzc2lvbnMgPQogICAgICAgIGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PE9iamVjdD4oKS5wb3Aoc3RhY2ssIGNvdW50KTsKICAgIExpc3Q8TGFiZWw+IGxhYmVscyA9IGxhYmVsQ291bnQgPT0gMCA/IG51bGwgOiBuZXcgTGlzdDxMYWJlbD4obGFiZWxDb3VudCk7CiAgICBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0KICAgICAgICBuZXcgTGlzdDxFeHByZXNzaW9uPi5maWxsZWQoZXhwcmVzc2lvbkNvdW50LCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBpbnQgbGFiZWxJbmRleCA9IDA7CiAgICBpbnQgZXhwcmVzc2lvbkluZGV4ID0gMDsKICAgIGlmIChsYWJlbHNBbmRFeHByZXNzaW9ucyAhPSBudWxsKSB7CiAgICAgIGZvciAoT2JqZWN0IGxhYmVsT3JFeHByZXNzaW9uIGluIGxhYmVsc0FuZEV4cHJlc3Npb25zKSB7CiAgICAgICAgaWYgKGxhYmVsT3JFeHByZXNzaW9uIGlzIExhYmVsKSB7CiAgICAgICAgICBsYWJlbHNbbGFiZWxJbmRleCsrXSA9IGxhYmVsT3JFeHByZXNzaW9uOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBleHByZXNzaW9uc1tleHByZXNzaW9uSW5kZXgrK10gPSBsYWJlbE9yRXhwcmVzc2lvbjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGFzc2VydChzY29wZSA9PSBzd2l0Y2hTY29wZSk7CiAgICBpZiAobGFiZWxzICE9IG51bGwpIHsKICAgICAgZm9yIChMYWJlbCBsYWJlbCBpbiBsYWJlbHMpIHsKICAgICAgICBTdHJpbmcgbGFiZWxOYW1lID0gbGFiZWwubmFtZTsKICAgICAgICBpZiAoc2NvcGUuaGFzTG9jYWxMYWJlbChsYWJlbE5hbWUpKSB7CiAgICAgICAgICAvLyBUT0RPKGFoZSk6IFNob3VsZCB2YWxpZGF0ZSB0aGlzIGlzIGEgZ290byB0YXJnZXQuCiAgICAgICAgICBpZiAoIXNjb3BlLmNsYWltTGFiZWwobGFiZWxOYW1lKSkgewogICAgICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50CiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobGFiZWxOYW1lKSwKICAgICAgICAgICAgICAgIGxhYmVsLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICBsYWJlbE5hbWUubGVuZ3RoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2NvcGUuZGVjbGFyZUxhYmVsKAogICAgICAgICAgICAgIGxhYmVsTmFtZSwgY3JlYXRlR290b1RhcmdldChmaXJzdFRva2VuLmNoYXJPZmZzZXQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHB1c2goZXhwcmVzc2lvbnMpOwogICAgcHVzaChsYWJlbHMgPz8gTnVsbFZhbHVlLkxhYmVscyk7CiAgICBlbnRlckxvY2FsU2NvcGUoInN3aXRjaCBjYXNlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFN3aXRjaENhc2UoCiAgICAgIGludCBsYWJlbENvdW50LAogICAgICBpbnQgZXhwcmVzc2lvbkNvdW50LAogICAgICBUb2tlbiBkZWZhdWx0S2V5d29yZCwKICAgICAgVG9rZW4gY29sb25BZnRlckRlZmF1bHQsCiAgICAgIGludCBzdGF0ZW1lbnRDb3VudCwKICAgICAgVG9rZW4gZmlyc3RUb2tlbiwKICAgICAgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlN3aXRjaENhc2UiKTsKICAgIC8vIFdlIGFsd2F5cyBjcmVhdGUgYSBibG9jayBoZXJlIHNvIHRoYXQgd2UgbGF0ZXIga25vdyB0aGF0IHRoZXJlJ3MgYWx3YXlzCiAgICAvLyBvbmUgc3ludGhldGljIGJsb2NrIHdoZW4gd2UgZmluaXNoIGNvbXBpbGluZyB0aGUgc3dpdGNoIHN0YXRlbWVudCBhbmQKICAgIC8vIGNoZWNrIHRoaXMgc3dpdGNoIGNhc2UgdG8gc2VlIGlmIGl0IGZhbGxzIHRocm91Z2ggdG8gdGhlIG5leHQgY2FzZS4KICAgIFN0YXRlbWVudCBibG9jayA9IHBvcEJsb2NrKHN0YXRlbWVudENvdW50LCBmaXJzdFRva2VuLCBudWxsKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBMaXN0PExhYmVsPiBsYWJlbHMgPSBwb3AoKTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSBwb3AoKTsKICAgIExpc3Q8aW50PiBleHByZXNzaW9uT2Zmc2V0cyA9IDxpbnQ+W107CiAgICBmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBleHByZXNzaW9ucykgewogICAgICBleHByZXNzaW9uT2Zmc2V0cy5hZGQoZm9yZXN0LnJlYWRPZmZzZXQoZXhwcmVzc2lvbikpOwogICAgfQogICAgcHVzaChuZXcgU3dpdGNoQ2FzZUp1ZGdtZW50KGV4cHJlc3Npb25zLCBleHByZXNzaW9uT2Zmc2V0cywgYmxvY2ssCiAgICAgICAgaXNEZWZhdWx0OiBkZWZhdWx0S2V5d29yZCAhPSBudWxsKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaXJzdFRva2VuLmNoYXJPZmZzZXQpOwogICAgcHVzaChsYWJlbHMgPz8gTnVsbFZhbHVlLkxhYmVscyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFN3aXRjaFN0YXRlbWVudChUb2tlbiBzd2l0Y2hLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiU3dpdGNoU3RhdGVtZW50Iik7CgogICAgTGlzdDxTd2l0Y2hDYXNlPiBjYXNlcyA9IHBvcCgpOwogICAgSnVtcFRhcmdldCB0YXJnZXQgPSBleGl0QnJlYWtUYXJnZXQoKTsKICAgIGV4aXRTd2l0Y2hTY29wZSgpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IFN3aXRjaFN0YXRlbWVudEp1ZGdtZW50KGV4cHJlc3Npb24sIGNhc2VzKQogICAgICAuLmZpbGVPZmZzZXQgPSBzd2l0Y2hLZXl3b3JkLmNoYXJPZmZzZXQ7CiAgICBpZiAodGFyZ2V0Lmhhc1VzZXJzKSB7CiAgICAgIHJlc3VsdCA9IGZvcmVzdC5zeW50aGV0aWNMYWJlbGVkU3RhdGVtZW50KHJlc3VsdCk7CiAgICAgIHRhcmdldC5yZXNvbHZlQnJlYWtzKGZvcmVzdCwgcmVzdWx0KTsKICAgIH0KICAgIGV4aXRMb29wT3JTd2l0Y2gocmVzdWx0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kU3dpdGNoQmxvY2soaW50IGNhc2VDb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlN3aXRjaEJsb2NrIik7CiAgICBMaXN0PFN3aXRjaENhc2U+IGNhc2VzID0KICAgICAgICBuZXcgTGlzdDxTd2l0Y2hDYXNlPi5maWxsZWQoY2FzZUNvdW50LCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gY2FzZUNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgTGlzdDxMYWJlbD4gbGFiZWxzID0gcG9wKCk7CiAgICAgIFN3aXRjaENhc2UgY3VycmVudCA9IGNhc2VzW2ldID0gcG9wKCk7CiAgICAgIGlmIChsYWJlbHMgIT0gbnVsbCkgewogICAgICAgIGZvciAoTGFiZWwgbGFiZWwgaW4gbGFiZWxzKSB7CiAgICAgICAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IHN3aXRjaFNjb3BlLmxvb2t1cExhYmVsKGxhYmVsLm5hbWUpOwogICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7CiAgICAgICAgICAgIHRhcmdldC5yZXNvbHZlR290b3MoZm9yZXN0LCBjdXJyZW50KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FzZUNvdW50IC0gMTsgaSsrKSB7CiAgICAgIFN3aXRjaENhc2UgY3VycmVudCA9IGNhc2VzW2ldOwogICAgICBCbG9jayBibG9jayA9IGN1cnJlbnQuYm9keTsKICAgICAgLy8gW2Jsb2NrXSBpcyBhIHN5bnRoZXRpYyBibG9jayB0aGF0IGlzIGFkZGVkIHRvIGhhbmRsZSB2YXJpYWJsZQogICAgICAvLyBkZWNsYXJhdGlvbnMgaW4gdGhlIHN3aXRjaCBjYXNlLgogICAgICBUcmVlTm9kZSBsYXN0Tm9kZSA9CiAgICAgICAgICBibG9jay5zdGF0ZW1lbnRzLmlzRW1wdHkgPyBudWxsIDogYmxvY2suc3RhdGVtZW50cy5sYXN0OwogICAgICBpZiAoZm9yZXN0LmlzQmxvY2sobGFzdE5vZGUpKSB7CiAgICAgICAgLy8gVGhpcyBpcyBhIG5vbi1zeW50aGV0aWMgYmxvY2suCiAgICAgICAgQmxvY2sgYmxvY2sgPSBsYXN0Tm9kZTsKICAgICAgICBsYXN0Tm9kZSA9IGJsb2NrLnN0YXRlbWVudHMuaXNFbXB0eSA/IG51bGwgOiBibG9jay5zdGF0ZW1lbnRzLmxhc3Q7CiAgICAgIH0KICAgICAgaWYgKGxhc3ROb2RlIGlzIEV4cHJlc3Npb25TdGF0ZW1lbnQpIHsKICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IGxhc3ROb2RlOwogICAgICAgIGxhc3ROb2RlID0gc3RhdGVtZW50LmV4cHJlc3Npb247CiAgICAgIH0KICAgICAgaWYgKGxhc3ROb2RlIGlzISBCcmVha1N0YXRlbWVudCAmJgogICAgICAgICAgbGFzdE5vZGUgaXMhIENvbnRpbnVlU3dpdGNoU3RhdGVtZW50ICYmCiAgICAgICAgICBsYXN0Tm9kZSBpcyEgUmV0aHJvdyAmJgogICAgICAgICAgbGFzdE5vZGUgaXMhIFJldHVyblN0YXRlbWVudCAmJgogICAgICAgICAgIWZvcmVzdC5pc1Rocm93KGxhc3ROb2RlKSkgewogICAgICAgIGJsb2NrLmFkZFN0YXRlbWVudCgKICAgICAgICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoYnVpbGRGYWxsVGhyb3VnaEVycm9yKGN1cnJlbnQuZmlsZU9mZnNldCkpKTsKICAgICAgfQogICAgfQoKICAgIHB1c2goY2FzZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDYXNlTWF0Y2goVG9rZW4gY2FzZUtleXdvcmQsIFRva2VuIGNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJDYXNlTWF0Y2giKTsKICAgIC8vIERvIG5vdGhpbmcuIEhhbmRsZWQgYnkgW2hhbmRsZVN3aXRjaENhc2VdLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVCcmVha1N0YXRlbWVudCgKICAgICAgYm9vbCBoYXNUYXJnZXQsIFRva2VuIGJyZWFrS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkJyZWFrU3RhdGVtZW50Iik7CiAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IGJyZWFrVGFyZ2V0OwogICAgSWRlbnRpZmllciBpZGVudGlmaWVyOwogICAgU3RyaW5nIG5hbWU7CiAgICBpZiAoaGFzVGFyZ2V0KSB7CiAgICAgIGlkZW50aWZpZXIgPSBwb3AoKTsKICAgICAgbmFtZSA9IGlkZW50aWZpZXIubmFtZTsKICAgICAgdGFyZ2V0ID0gc2NvcGUubG9va3VwTGFiZWwobmFtZSk7CiAgICB9CiAgICBpZiAodGFyZ2V0ID09IG51bGwgJiYgbmFtZSA9PSBudWxsKSB7CiAgICAgIHB1c2gocHJvYmxlbUluTG9vcE9yU3dpdGNoID0gYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgZmFzdGEubWVzc2FnZUJyZWFrT3V0c2lkZU9mTG9vcCwgYnJlYWtLZXl3b3JkLmNoYXJPZmZzZXQpKTsKICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09IG51bGwgfHwKICAgICAgICB0YXJnZXQgaXMhIEp1bXBUYXJnZXQgfHwKICAgICAgICAhdGFyZ2V0LmlzQnJlYWtUYXJnZXQpIHsKICAgICAgVG9rZW4gbGFiZWxUb2tlbiA9IGJyZWFrS2V5d29yZC5uZXh0OwogICAgICBwdXNoKHByb2JsZW1Jbkxvb3BPclN3aXRjaCA9IGJ1aWxkUHJvYmxlbVN0YXRlbWVudCgKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlSW52YWxpZEJyZWFrVGFyZ2V0LndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICBsYWJlbFRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICBsZW5ndGg6IGxhYmVsVG9rZW4ubGVuZ3RoKSk7CiAgICB9IGVsc2UgaWYgKHRhcmdldC5mdW5jdGlvbk5lc3RpbmdMZXZlbCAhPSBmdW5jdGlvbk5lc3RpbmdMZXZlbCkgewogICAgICBwdXNoKGJ1aWxkUHJvYmxlbVRhcmdldE91dHNpZGVMb2NhbEZ1bmN0aW9uKG5hbWUsIGJyZWFrS2V5d29yZCkpOwogICAgfSBlbHNlIHsKICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9CiAgICAgICAgICBmb3Jlc3QuYnJlYWtTdGF0ZW1lbnQoYnJlYWtLZXl3b3JkLCBpZGVudGlmaWVyLCBlbmRUb2tlbik7CiAgICAgIHRhcmdldC5hZGRCcmVhayhzdGF0ZW1lbnQpOwogICAgICBwdXNoKHN0YXRlbWVudCk7CiAgICB9CiAgfQoKICBTdGF0ZW1lbnQgYnVpbGRQcm9ibGVtVGFyZ2V0T3V0c2lkZUxvY2FsRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFRva2VuIGtleXdvcmQpIHsKICAgIFN0YXRlbWVudCBwcm9ibGVtOwogICAgYm9vbCBpc0JyZWFrID0gb3B0aW9uYWwoImJyZWFrIiwga2V5d29yZCk7CiAgICBpZiAobmFtZSAhPSBudWxsKSB7CiAgICAgIFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nKT4gdGVtcGxhdGUgPSBpc0JyZWFrCiAgICAgICAgICA/IGZhc3RhLnRlbXBsYXRlQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb24KICAgICAgICAgIDogZmFzdGEudGVtcGxhdGVDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbjsKICAgICAgcHJvYmxlbSA9IGJ1aWxkUHJvYmxlbVN0YXRlbWVudCgKICAgICAgICAgIHRlbXBsYXRlLndpdGhBcmd1bWVudHMobmFtZSksIG9mZnNldEZvclRva2VuKGtleXdvcmQpLAogICAgICAgICAgbGVuZ3RoOiBsZW5ndGhPZlNwYW4oa2V5d29yZCwga2V5d29yZC5uZXh0KSk7CiAgICB9IGVsc2UgewogICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBpc0JyZWFrCiAgICAgICAgICA/IGZhc3RhLm1lc3NhZ2VBbm9ueW1vdXNCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbgogICAgICAgICAgOiBmYXN0YS5tZXNzYWdlQW5vbnltb3VzQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb247CiAgICAgIHByb2JsZW0gPSBidWlsZFByb2JsZW1TdGF0ZW1lbnQobWVzc2FnZSwgb2Zmc2V0Rm9yVG9rZW4oa2V5d29yZCksCiAgICAgICAgICBsZW5ndGg6IGxlbmd0aEZvclRva2VuKGtleXdvcmQpKTsKICAgIH0KICAgIHByb2JsZW1Jbkxvb3BPclN3aXRjaCA/Pz0gcHJvYmxlbTsKICAgIHJldHVybiBwcm9ibGVtOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDb250aW51ZVN0YXRlbWVudCgKICAgICAgYm9vbCBoYXNUYXJnZXQsIFRva2VuIGNvbnRpbnVlS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkNvbnRpbnVlU3RhdGVtZW50Iik7CiAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IGNvbnRpbnVlVGFyZ2V0OwogICAgSWRlbnRpZmllciBpZGVudGlmaWVyOwogICAgU3RyaW5nIG5hbWU7CiAgICBpZiAoaGFzVGFyZ2V0KSB7CiAgICAgIGlkZW50aWZpZXIgPSBwb3AoKTsKICAgICAgbmFtZSA9IGlkZW50aWZpZXIubmFtZTsKICAgICAgRGVjbGFyYXRpb24gbmFtZWRUYXJnZXQgPSBzY29wZS5sb29rdXBMYWJlbChpZGVudGlmaWVyLm5hbWUpOwogICAgICBpZiAobmFtZWRUYXJnZXQgIT0gbnVsbCAmJiBuYW1lZFRhcmdldCBpcyEgSnVtcFRhcmdldCkgewogICAgICAgIFRva2VuIGxhYmVsVG9rZW4gPSBjb250aW51ZUtleXdvcmQubmV4dDsKICAgICAgICBwdXNoKHByb2JsZW1Jbkxvb3BPclN3aXRjaCA9IGJ1aWxkUHJvYmxlbVN0YXRlbWVudCgKICAgICAgICAgICAgZmFzdGEubWVzc2FnZUNvbnRpbnVlTGFiZWxOb3RUYXJnZXQsIGxhYmVsVG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgICAgbGVuZ3RoOiBsYWJlbFRva2VuLmxlbmd0aCkpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0YXJnZXQgPSBuYW1lZFRhcmdldDsKICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgICAgaWYgKHN3aXRjaFNjb3BlID09IG51bGwpIHsKICAgICAgICAgIHB1c2goYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlTGFiZWxOb3RGb3VuZC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICAgIGNvbnRpbnVlS2V5d29yZC5uZXh0LmNoYXJPZmZzZXQpKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc3dpdGNoU2NvcGUuZm9yd2FyZERlY2xhcmVMYWJlbCgKICAgICAgICAgICAgaWRlbnRpZmllci5uYW1lLCB0YXJnZXQgPSBjcmVhdGVHb3RvVGFyZ2V0KGlkZW50aWZpZXIuY2hhck9mZnNldCkpOwogICAgICB9CiAgICAgIGlmICh0YXJnZXQuaXNHb3RvVGFyZ2V0ICYmCiAgICAgICAgICB0YXJnZXQuZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPT0gZnVuY3Rpb25OZXN0aW5nTGV2ZWwpIHsKICAgICAgICBDb250aW51ZVN3aXRjaFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBuZXcgQ29udGludWVTd2l0Y2hKdWRnbWVudChudWxsKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gY29udGludWVLZXl3b3JkLmNoYXJPZmZzZXQ7CiAgICAgICAgdGFyZ2V0LmFkZEdvdG8oc3RhdGVtZW50KTsKICAgICAgICBwdXNoKHN0YXRlbWVudCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKICAgICAgcHVzaChwcm9ibGVtSW5Mb29wT3JTd2l0Y2ggPSBidWlsZFByb2JsZW1TdGF0ZW1lbnQoCiAgICAgICAgICBmYXN0YS5tZXNzYWdlQ29udGludWVXaXRob3V0TGFiZWxJbkNhc2UsIGNvbnRpbnVlS2V5d29yZC5jaGFyT2Zmc2V0LAogICAgICAgICAgbGVuZ3RoOiBjb250aW51ZUtleXdvcmQubGVuZ3RoKSk7CiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaXNDb250aW51ZVRhcmdldCkgewogICAgICBUb2tlbiBsYWJlbFRva2VuID0gY29udGludWVLZXl3b3JkLm5leHQ7CiAgICAgIHB1c2gocHJvYmxlbUluTG9vcE9yU3dpdGNoID0gYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgZmFzdGEudGVtcGxhdGVJbnZhbGlkQ29udGludWVUYXJnZXQud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIGxhYmVsVG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgIGxlbmd0aDogbGFiZWxUb2tlbi5sZW5ndGgpKTsKICAgIH0gZWxzZSBpZiAodGFyZ2V0LmZ1bmN0aW9uTmVzdGluZ0xldmVsICE9IGZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICAgIHB1c2goYnVpbGRQcm9ibGVtVGFyZ2V0T3V0c2lkZUxvY2FsRnVuY3Rpb24obmFtZSwgY29udGludWVLZXl3b3JkKSk7CiAgICB9IGVsc2UgewogICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0KICAgICAgICAgIGZvcmVzdC5jb250aW51ZVN0YXRlbWVudChjb250aW51ZUtleXdvcmQsIGlkZW50aWZpZXIsIGVuZFRva2VuKTsKICAgICAgdGFyZ2V0LmFkZENvbnRpbnVlKHN0YXRlbWVudCk7CiAgICAgIHB1c2goc3RhdGVtZW50KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UeXBlVmFyaWFibGUoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luVHlwZVZhcmlhYmxlIik7CiAgICBJZGVudGlmaWVyIG5hbWUgPSBwb3AoKTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSBwb3AoKTsKICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgPQogICAgICAgIG5ldyBUeXBlVmFyaWFibGVCdWlsZGVyKG5hbWUubmFtZSwgbGlicmFyeSwgbmFtZS5jaGFyT2Zmc2V0LCBudWxsKTsKICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAgICAgIGluZmVyQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOwogICAgICBmb3IgKEV4cHJlc3Npb24gYW5ub3RhdGlvbiBpbiBhbm5vdGF0aW9ucykgewogICAgICAgIHZhcmlhYmxlLnBhcmFtZXRlci5hZGRBbm5vdGF0aW9uKGFubm90YXRpb24pOwogICAgICB9CiAgICB9CiAgICBwdXNoKHZhcmlhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVHlwZVZhcmlhYmxlc0RlZmluZWQoVG9rZW4gdG9rZW4sIGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiaGFuZGxlVHlwZVZhcmlhYmxlc0RlZmluZWQiKTsKICAgIGFzc2VydChjb3VudCA+IDApOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0KICAgICAgICBjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPigpLnBvcChzdGFjaywgY291bnQpOwogICAgZW50ZXJGdW5jdGlvblR5cGVTY29wZSh0eXBlVmFyaWFibGVzKTsKICAgIHB1c2godHlwZVZhcmlhYmxlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVWYXJpYWJsZShUb2tlbiB0b2tlbiwgaW50IGluZGV4LCBUb2tlbiBleHRlbmRzT3JTdXBlcikgewogICAgZGVidWdFdmVudCgiVHlwZVZhcmlhYmxlIik7CiAgICBVbnJlc29sdmVkVHlwZSBib3VuZCA9IHBvcCgpOwogICAgLy8gUGVlayB0byBsZWF2ZSB0eXBlIHBhcmFtZXRlcnMgb24gdG9wIG9mIHN0YWNrLgogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcGVlaygpOwoKICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgPSB0eXBlVmFyaWFibGVzW2luZGV4XTsKICAgIHZhcmlhYmxlLmJvdW5kID0gYm91bmQ/LmJ1aWxkZXI7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVWYXJpYWJsZXMoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlR5cGVWYXJpYWJsZXMiKTsKICAgIC8vIFBlZWsgdG8gbGVhdmUgdHlwZSBwYXJhbWV0ZXJzIG9uIHRvcCBvZiBzdGFjay4KICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBlZWsoKTsKCiAgICBpZiAoIWxlZ2FjeU1vZGUpIHsKICAgICAgTGlzdDxUeXBlQnVpbGRlcj4gY2FsY3VsYXRlZEJvdW5kcyA9IGNhbGN1bGF0ZUJvdW5kcygKICAgICAgICAgIHR5cGVWYXJpYWJsZXMsCiAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuZHluYW1pY1R5cGUsCiAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuYm90dG9tVHlwZSwKICAgICAgICAgIGxpYnJhcnkubG9hZGVyLnRhcmdldC5vYmplY3RDbGFzc0J1aWxkZXIpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVWYXJpYWJsZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICB0eXBlVmFyaWFibGVzW2ldLmRlZmF1bHRUeXBlID0gY2FsY3VsYXRlZEJvdW5kc1tpXTsKICAgICAgICB0eXBlVmFyaWFibGVzW2ldLmRlZmF1bHRUeXBlLnJlc29sdmVJbihzY29wZSwKICAgICAgICAgICAgdHlwZVZhcmlhYmxlc1tpXS5jaGFyT2Zmc2V0LCB0eXBlVmFyaWFibGVzW2ldLmZpbGVVcmksIGxpYnJhcnkpOwogICAgICAgIHR5cGVWYXJpYWJsZXNbaV0uZmluaXNoKAogICAgICAgICAgICBsaWJyYXJ5LAogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQub2JqZWN0Q2xhc3NCdWlsZGVyLAogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuZHluYW1pY1R5cGUpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVWYXJpYWJsZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICB0eXBlVmFyaWFibGVzW2ldLmRlZmF1bHRUeXBlID0gbGlicmFyeS5sb2FkZXIudGFyZ2V0LmR5bmFtaWNUeXBlOwogICAgICAgIHR5cGVWYXJpYWJsZXNbaV0uZmluaXNoKAogICAgICAgICAgICBsaWJyYXJ5LAogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQub2JqZWN0Q2xhc3NCdWlsZGVyLAogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuZHluYW1pY1R5cGUpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVHlwZVZhcmlhYmxlcyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9UeXBlVmFyaWFibGVzIik7CiAgICBlbnRlckZ1bmN0aW9uVHlwZVNjb3BlKG51bGwpOwogICAgcHVzaChOdWxsVmFsdWUuVHlwZVZhcmlhYmxlcyk7CiAgfQoKICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVWYXJpYWJsZUJ1aWxkZXJzVG9LZXJuZWwoCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlQnVpbGRlcnMpIHsKICAgIGlmICh0eXBlVmFyaWFibGVCdWlsZGVycyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBuZXcgTGlzdDxUeXBlUGFyYW1ldGVyPi5maWxsZWQoCiAgICAgICAgdHlwZVZhcmlhYmxlQnVpbGRlcnMubGVuZ3RoLCBudWxsLAogICAgICAgIGdyb3dhYmxlOiB0cnVlKTsKICAgIGludCBpID0gMDsKICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciBidWlsZGVyIGluIHR5cGVWYXJpYWJsZUJ1aWxkZXJzKSB7CiAgICAgIHR5cGVQYXJhbWV0ZXJzW2krK10gPSBidWlsZGVyLnRhcmdldDsKICAgIH0KICAgIHJldHVybiB0eXBlUGFyYW1ldGVyczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZFN0YXRlbWVudChUb2tlbiB0b2tlbiwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gcG9wKCk7CiAgICBwdXNoKG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgIGJ1aWxkUHJvYmxlbShtZXNzYWdlLCBzdGF0ZW1lbnQuZmlsZU9mZnNldCwgbm9MZW5ndGgpKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFByb2JsZW0oTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQsIGJvb2wgc3VwcHJlc3NNZXNzYWdlOiBmYWxzZX0pIHsKICAgIGlmICghc3VwcHJlc3NNZXNzYWdlKSB7CiAgICAgIGFkZFByb2JsZW0obWVzc2FnZSwgY2hhck9mZnNldCwgbGVuZ3RoLAogICAgICAgICAgd2FzSGFuZGxlZDogdHJ1ZSwgY29udGV4dDogY29udGV4dCk7CiAgICB9CiAgICBTdHJpbmcgdGV4dCA9IGxpYnJhcnkubG9hZGVyLnRhcmdldC5jb250ZXh0CiAgICAgICAgLmZvcm1hdChtZXNzYWdlLndpdGhMb2NhdGlvbih1cmksIGNoYXJPZmZzZXQsIGxlbmd0aCksIFNldmVyaXR5LmVycm9yKTsKICAgIHJldHVybiB3cmFwU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICBuZXcgSW52YWxpZEV4cHJlc3Npb24odGV4dCkuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0LCBjaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gd3JhcEluUHJvYmxlbShFeHByZXNzaW9uIGV4cHJlc3Npb24sIE1lc3NhZ2UgbWVzc2FnZSwgaW50IGxlbmd0aCwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBpbnQgY2hhck9mZnNldCA9IGZvcmVzdC5yZWFkT2Zmc2V0KGV4cHJlc3Npb24pOwogICAgU2V2ZXJpdHkgc2V2ZXJpdHkgPSBtZXNzYWdlLmNvZGUuc2V2ZXJpdHk7CiAgICBpZiAoc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuZXJyb3IgfHwKICAgICAgICBzZXZlcml0eSA9PSBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcgJiYgIWxlZ2FjeU1vZGUpIHsKICAgICAgcmV0dXJuIHdyYXBJbkxvY2F0ZWRQcm9ibGVtKAogICAgICAgICAgZXhwcmVzc2lvbiwgbWVzc2FnZS53aXRoTG9jYXRpb24odXJpLCBjaGFyT2Zmc2V0LCBsZW5ndGgpLAogICAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgICB9IGVsc2UgewogICAgICBhZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwgY29udGV4dDogY29udGV4dCk7CiAgICAgIHJldHVybiBleHByZXNzaW9uOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB3cmFwSW5Mb2NhdGVkUHJvYmxlbShFeHByZXNzaW9uIGV4cHJlc3Npb24sIExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIHtMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgLy8gVE9ETyhhc2tlc2MpOiBQcm9kdWNlIGV4cGxpY2l0IGVycm9yIGV4cHJlc3Npb24gd3JhcHBpbmcgdGhlIG9yaWdpbmFsLgogICAgLy8gU2VlIFtpc3N1ZSAyOTcxN10oaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzI5NzE3KQogICAgaW50IG9mZnNldCA9IGZvcmVzdC5yZWFkT2Zmc2V0KGV4cHJlc3Npb24pOwogICAgaWYgKG9mZnNldCA9PSAtMSkgewogICAgICBvZmZzZXQgPSBtZXNzYWdlLmNoYXJPZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gbmV3IExldCgKICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZSgKICAgICAgICAgICAgZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgbWVzc2FnZS5tZXNzYWdlT2JqZWN0LCBtZXNzYWdlLmNoYXJPZmZzZXQsIG1lc3NhZ2UubGVuZ3RoLAogICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dCkpLAogICAgICAgICAgICB0eXBlOiBjb25zdCBCb3R0b21UeXBlKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQsCiAgICAgICAgZXhwcmVzc2lvbik7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkRmFsbFRocm91Z2hFcnJvcihpbnQgY2hhck9mZnNldCkgewogICAgYWRkUHJvYmxlbShmYXN0YS5tZXNzYWdlU3dpdGNoQ2FzZUZhbGxUaHJvdWdoLCBjaGFyT2Zmc2V0LCBub0xlbmd0aCk7CgogICAgLy8gVE9ETyhhaGUpOiBUaGUgZm9sbG93aW5nIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3IgdGhlIEFuYWx5emVyLiBJdCBzaG91bGQKICAgIC8vIGJlIG1vdmVkIHRvIFtGb3Jlc3RdIG9yIGNvbmRpdGlvbmFsIG9uIGBmb3Jlc3QgaXMgRmFuZ29ybmAuCgogICAgLy8gVE9ETyhhaGUpOiBDb21wdXRlIGEgTG9jYXRlZE1lc3NhZ2UgYWJvdmUgaW5zdGVhZD8KICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbWVzc2FnZXMuZ2V0TG9jYXRpb25Gcm9tVXJpKHVyaSwgY2hhck9mZnNldCk7CgogICAgcmV0dXJuIGZvcmVzdC50aHJvd0V4cHJlc3Npb24oCiAgICAgICAgbnVsbCwKICAgICAgICBidWlsZFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICAgIGxpYnJhcnkubG9hZGVyLmNvcmVUeXBlcy5mYWxsVGhyb3VnaEVycm9yVXJsQW5kTGluZUNvbnN0cnVjdG9yLAogICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICAgICAgICBmb3Jlc3QubGl0ZXJhbFN0cmluZygiJHtsb2NhdGlvbj8uZmlsZSA/PyB1cml9IiwgbnVsbCkKICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgZm9yZXN0LmxpdGVyYWxJbnQobG9jYXRpb24/LmxpbmUgPz8gMCwgbnVsbCkKICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQsCiAgICAgICAgICAgIF0sIG5vTG9jYXRpb24pLAogICAgICAgICAgICBjaGFyT2Zmc2V0OiBjaGFyT2Zmc2V0KSkKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBjbGFzc05hbWUsCiAgICAgIFtpbnQgY2hhck9mZnNldCA9IC0xXSkgewogICAgYWRkUHJvYmxlbUVycm9ySWZDb25zdChtZXNzYWdlLCBjaGFyT2Zmc2V0LCBjbGFzc05hbWUubGVuZ3RoKTsKICAgIC8vIFRPRE8oYWhlKTogVGhlIGZvbGxvd2luZyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gQW5hbHl6ZXIgQVNULgogICAgRGVjbGFyYXRpb24gY29uc3RydWN0b3IgPQogICAgICAgIGxpYnJhcnkubG9hZGVyLmdldEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IoKTsKICAgIEV4cHJlc3Npb24gaW52b2NhdGlvbiA9IGJ1aWxkU3RhdGljSW52b2NhdGlvbigKICAgICAgICBjb25zdHJ1Y3Rvci50YXJnZXQsCiAgICAgICAgZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bCiAgICAgICAgICBmb3Jlc3QubGl0ZXJhbFN0cmluZyhjbGFzc05hbWUsIG51bGwpLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldAogICAgICAgIF0sIG5vTG9jYXRpb24pCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQ6IGNoYXJPZmZzZXQpOwogICAgaWYgKGludm9jYXRpb24gaXMgc2hhZG93LlN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudCkgewogICAgICBpbnZvY2F0aW9uID0gZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oaW52b2NhdGlvbik7CiAgICB9CiAgICByZXR1cm4gZm9yZXN0LnRocm93RXhwcmVzc2lvbihudWxsLCBpbnZvY2F0aW9uKS4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgfQoKICBTdGF0ZW1lbnQgYnVpbGRQcm9ibGVtU3RhdGVtZW50KE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0LCBpbnQgbGVuZ3RoLCBib29sIHN1cHByZXNzTWVzc2FnZTogZmFsc2V9KSB7CiAgICBsZW5ndGggPz89IG5vTGVuZ3RoOwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50SnVkZ21lbnQoYnVpbGRQcm9ibGVtKAogICAgICAgIG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwKICAgICAgICBjb250ZXh0OiBjb250ZXh0LCBzdXBwcmVzc01lc3NhZ2U6IHN1cHByZXNzTWVzc2FnZSkpOwogIH0KCiAgU3RhdGVtZW50IHdyYXBJblByb2JsZW1TdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAvLyBUT0RPKGFza2VzYyk6IFByb2R1Y2UgZXhwbGljaXQgZXJyb3Igc3RhdGVtZW50IHdyYXBwaW5nIHRoZSBvcmlnaW5hbC4KICAgIC8vIFNlZSBbaXNzdWUgMjk3MTddKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8yOTcxNykKICAgIHJldHVybiBidWlsZFByb2JsZW1TdGF0ZW1lbnQobWVzc2FnZSwgc3RhdGVtZW50LmZpbGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXIgYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICBbaW50IGNoYXJPZmZzZXQgPSAtMV0pIHsKICAgIG5lZWRzSW1wbGljaXRTdXBlckluaXRpYWxpemVyID0gZmFsc2U7CiAgICByZXR1cm4gbmV3IFNoYWRvd0ludmFsaWRJbml0aWFsaXplcigKICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZShleHByZXNzaW9uKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICB9CgogIEluaXRpYWxpemVyIGJ1aWxkSW52YWxpZFN1cGVySW5pdGlhbGl6ZXIoCiAgICAgIENvbnN0cnVjdG9yIHRhcmdldCwgQXJndW1lbnRzSnVkZ21lbnQgYXJndW1lbnRzLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIFtpbnQgY2hhck9mZnNldCA9IC0xXSkgewogICAgbmVlZHNJbXBsaWNpdFN1cGVySW5pdGlhbGl6ZXIgPSBmYWxzZTsKICAgIHJldHVybiBuZXcgSW52YWxpZFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudCgKICAgICAgICB0YXJnZXQsIGFyZ3VtZW50cywgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoZXhwcmVzc2lvbikpCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgfQoKICBJbml0aWFsaXplciBidWlsZER1cGxpY2F0ZWRJbml0aWFsaXplcihGaWVsZCBmaWVsZCwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAgU3RyaW5nIG5hbWUsIGludCBvZmZzZXQsIGludCBwcmV2aW91c0luaXRpYWxpemVyT2Zmc2V0KSB7CiAgICByZXR1cm4gbmV3IFNoYWRvd0ludmFsaWRGaWVsZEluaXRpYWxpemVyKAogICAgICAgIGZpZWxkLAogICAgICAgIHZhbHVlLAogICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgICAgICBidWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZAogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICAgICAgbm9MZW5ndGgpKSkpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICB9CgogIC8vLyBQYXJhbWV0ZXIgW2Zvcm1hbFR5cGVdIHNob3VsZCBvbmx5IGJlIHBhc3NlZCBpbiB0aGUgc3BlY2lhbCBjYXNlIG9mCiAgLy8vIGJ1aWxkaW5nIGEgZmllbGQgaW5pdGlhbGl6ZXIgYXMgYSBkZXN1Z2FyaW5nIG9mIGFuIGluaXRpYWxpemluZyBmb3JtYWwKICAvLy8gcGFyYW1ldGVyLiAgVGhlIHNwZWMgc2F5cyB0aGUgZm9sbG93aW5nOgogIC8vLwogIC8vLyAiSWYgYW4gZXhwbGljaXQgdHlwZSBpcyBhdHRhY2hlZCB0byB0aGUgaW5pdGlhbGl6aW5nIGZvcm1hbCwgdGhhdCBpcyBpdHMKICAvLy8gc3RhdGljIHR5cGUuICBPdGhlcndpc2UsIHRoZSB0eXBlIG9mIGFuIGluaXRpYWxpemluZyBmb3JtYWwgbmFtZWQgX2lkXyBpcwogIC8vLyBfVGlkXywgd2hlcmUgX1RpZF8gaXMgdGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIHZhcmlhYmxlIG5hbWVkIF9pZF8gaW4gdGhlCiAgLy8vIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcy4gIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgdGhlIHN0YXRpYyB0eXBlIG9mCiAgLy8vIF9pZF8gaXMgbm90IGEgc3VidHlwZSBvZiBfVGlkXy4iCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXIgYnVpbGRGaWVsZEluaXRpYWxpemVyKGJvb2wgaXNTeW50aGV0aWMsIFN0cmluZyBuYW1lLAogICAgICBpbnQgZmllbGROYW1lT2Zmc2V0LCBpbnQgYXNzaWdubWVudE9mZnNldCwgRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICB7RGFydFR5cGUgZm9ybWFsVHlwZX0pIHsKICAgIERlY2xhcmF0aW9uIGJ1aWxkZXIgPQogICAgICAgIGNsYXNzQnVpbGRlci5zY29wZS5sb2NhbFtuYW1lXSA/PyBjbGFzc0J1aWxkZXIub3JpZ2luLnNjb3BlLmxvY2FsW25hbWVdOwogICAgaWYgKGJ1aWxkZXI/Lm5leHQgIT0gbnVsbCkgewogICAgICAvLyBEdXBsaWNhdGVkIG5hbWUsIGFscmVhZHkgcmVwb3J0ZWQuCiAgICAgIHJldHVybiBuZXcgTG9jYWxJbml0aWFsaXplcigKICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKAogICAgICAgICAgICAgIGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2Uud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgICAgICAgZmllbGROYW1lT2Zmc2V0LAogICAgICAgICAgICAgICAgICBuYW1lLmxlbmd0aCkpCiAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWVsZE5hbWVPZmZzZXQpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpZWxkTmFtZU9mZnNldCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWVsZE5hbWVPZmZzZXQ7CiAgICB9IGVsc2UgaWYgKGJ1aWxkZXIgaXMgS2VybmVsRmllbGRCdWlsZGVyICYmIGJ1aWxkZXIuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICBpbml0aWFsaXplZEZpZWxkcyA/Pz0gPFN0cmluZywgaW50Pnt9OwogICAgICBpZiAoaW5pdGlhbGl6ZWRGaWVsZHMuY29udGFpbnNLZXkobmFtZSkpIHsKICAgICAgICByZXR1cm4gYnVpbGREdXBsaWNhdGVkSW5pdGlhbGl6ZXIoYnVpbGRlci5maWVsZCwgZXhwcmVzc2lvbiwgbmFtZSwKICAgICAgICAgICAgYXNzaWdubWVudE9mZnNldCwgaW5pdGlhbGl6ZWRGaWVsZHNbbmFtZV0pOwogICAgICB9CiAgICAgIGluaXRpYWxpemVkRmllbGRzW25hbWVdID0gYXNzaWdubWVudE9mZnNldDsKICAgICAgaWYgKGJ1aWxkZXIuaXNGaW5hbCAmJiBidWlsZGVyLmhhc0luaXRpYWxpemVyKSB7CiAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWQKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICBhc3NpZ25tZW50T2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkQ2F1c2UKICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGJ1aWxkZXIuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpCiAgICAgICAgICAgIF0pOwogICAgICAgIERlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0KICAgICAgICAgICAgbGlicmFyeS5sb2FkZXIuZ2V0RHVwbGljYXRlZEZpZWxkSW5pdGlhbGl6ZXJFcnJvcigpOwogICAgICAgIEV4cHJlc3Npb24gaW52b2NhdGlvbiA9IGJ1aWxkU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgY29uc3RydWN0b3IudGFyZ2V0LAogICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICAgICAgICBmb3Jlc3QubGl0ZXJhbFN0cmluZyhuYW1lLCBudWxsKS4uZmlsZU9mZnNldCA9IGFzc2lnbm1lbnRPZmZzZXQKICAgICAgICAgICAgXSwgbm9Mb2NhdGlvbikKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBhc3NpZ25tZW50T2Zmc2V0LAogICAgICAgICAgICBjaGFyT2Zmc2V0OiBhc3NpZ25tZW50T2Zmc2V0KTsKICAgICAgICBpZiAoaW52b2NhdGlvbiBpcyBzaGFkb3cuU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50KSB7CiAgICAgICAgICBpbnZvY2F0aW9uID0gZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oaW52b2NhdGlvbik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgU2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXIoCiAgICAgICAgICAgIGJ1aWxkZXIuZmllbGQsCiAgICAgICAgICAgIGV4cHJlc3Npb24sCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKAogICAgICAgICAgICAgICAgZm9yZXN0LnRocm93RXhwcmVzc2lvbihudWxsLCBpbnZvY2F0aW9uKQogICAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBhc3NpZ25tZW50T2Zmc2V0KSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGFzc2lnbm1lbnRPZmZzZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFsZWdhY3lNb2RlICYmCiAgICAgICAgICAgIGZvcm1hbFR5cGUgIT0gbnVsbCAmJgogICAgICAgICAgICAhdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKGZvcm1hbFR5cGUsIGJ1aWxkZXIuZmllbGQudHlwZSkpIHsKICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaAogICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhuYW1lLCBmb3JtYWxUeXBlLCBidWlsZGVyLmZpZWxkLnR5cGUpLAogICAgICAgICAgICAgIGFzc2lnbm1lbnRPZmZzZXQsCiAgICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgICAgdXJpLAogICAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VJbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2hGaWVsZAogICAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oYnVpbGRlci5maWxlVXJpLCBidWlsZGVyLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgIF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFNoYWRvd0ZpZWxkSW5pdGlhbGl6ZXIoYnVpbGRlci5maWVsZCwgZXhwcmVzc2lvbikKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGFzc2lnbm1lbnRPZmZzZXQKICAgICAgICAgIC4uaXNTeW50aGV0aWMgPSBpc1N5bnRoZXRpYzsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGJ1aWxkSW52YWxpZEluaXRpYWxpemVyKAogICAgICAgICAgZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlSW5pdGlhbGl6ZXJGb3JTdGF0aWNGaWVsZC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICAgIGZpZWxkTmFtZU9mZnNldCwKICAgICAgICAgICAgICBuYW1lLmxlbmd0aCkpLAogICAgICAgICAgZmllbGROYW1lT2Zmc2V0KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyIGJ1aWxkU3VwZXJJbml0aWFsaXplcigKICAgICAgYm9vbCBpc1N5bnRoZXRpYywgQ29uc3RydWN0b3IgY29uc3RydWN0b3IsIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIFtpbnQgY2hhck9mZnNldCA9IC0xXSkgewogICAgaWYgKG1lbWJlci5pc0NvbnN0ICYmICFjb25zdHJ1Y3Rvci5pc0NvbnN0KSB7CiAgICAgIHJldHVybiBidWlsZEludmFsaWRTdXBlckluaXRpYWxpemVyKAogICAgICAgICAgY29uc3RydWN0b3IsCiAgICAgICAgICBmb3Jlc3QuY2FzdEFyZ3VtZW50cyhhcmd1bWVudHMpLAogICAgICAgICAgZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VDb25zdENvbnN0cnVjdG9yV2l0aE5vbkNvbnN0U3VwZXIsCiAgICAgICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5uYW1lLm5hbWUubGVuZ3RoKSksCiAgICAgICAgICBjaGFyT2Zmc2V0KTsKICAgIH0KICAgIG5lZWRzSW1wbGljaXRTdXBlckluaXRpYWxpemVyID0gZmFsc2U7CiAgICByZXR1cm4gbmV3IFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudCgKICAgICAgICBjb25zdHJ1Y3RvciwgZm9yZXN0LmNhc3RBcmd1bWVudHMoYXJndW1lbnRzKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldAogICAgICAuLmlzU3ludGhldGljID0gaXNTeW50aGV0aWM7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplciBidWlsZFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoCiAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLCBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBbaW50IGNoYXJPZmZzZXQgPSAtMV0pIHsKICAgIGlmIChjbGFzc0J1aWxkZXIuY2hlY2tDb25zdHJ1Y3RvckN5Y2xpYygKICAgICAgICBtZW1iZXIubmFtZSwgY29uc3RydWN0b3IubmFtZS5uYW1lKSkgewogICAgICBpbnQgbGVuZ3RoID0gY29uc3RydWN0b3IubmFtZS5uYW1lLmxlbmd0aDsKICAgICAgaWYgKGxlbmd0aCA9PSAwKSBsZW5ndGggPSAidGhpcyIubGVuZ3RoOwogICAgICBhZGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VDb25zdHJ1Y3RvckN5Y2xpYywgY2hhck9mZnNldCwgbGVuZ3RoKTsKICAgICAgLy8gVE9ETyhhc2tlc2MpOiBQcm9kdWNlIGludmFsaWQgaW5pdGlhbGl6ZXIuCiAgICB9CiAgICBuZWVkc0ltcGxpY2l0U3VwZXJJbml0aWFsaXplciA9IGZhbHNlOwogICAgcmV0dXJuIG5ldyBSZWRpcmVjdGluZ0luaXRpYWxpemVySnVkZ21lbnQoCiAgICAgICAgY29uc3RydWN0b3IsIGZvcmVzdC5jYXN0QXJndW1lbnRzKGFyZ3VtZW50cykpCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU9wZXJhdG9yKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJPcGVyYXRvciIpOwogICAgcHVzaChuZXcgT3BlcmF0b3IodG9rZW4sIHRva2VuLmNoYXJPZmZzZXQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3ltYm9sVm9pZChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiU3ltYm9sVm9pZCIpOwogICAgcHVzaChuZXcgSWRlbnRpZmllci5wcmVzZXJ2ZVRva2VuKHRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRGdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGlmIChtZW1iZXIuaXNOYXRpdmUpIHsKICAgICAgcHVzaChOdWxsVmFsdWUuRnVuY3Rpb25Cb2R5KTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goZm9yZXN0LmJsb2NrKAogICAgICAgICAgdG9rZW4sCiAgICAgICAgICA8U3RhdGVtZW50PlsKICAgICAgICAgICAgYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEZ1bmN0aW9uQm9keS53aXRoQXJndW1lbnRzKHRva2VuKSwKICAgICAgICAgICAgICAgIHRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICBsZW5ndGg6IHRva2VuLmxlbmd0aCkKICAgICAgICAgIF0sCiAgICAgICAgICBudWxsKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBVbnJlc29sdmVkVHlwZSB2YWxpZGF0ZVR5cGVVc2UoCiAgICAgIFVucmVzb2x2ZWRUeXBlIHVucmVzb2x2ZWQsIGJvb2wgbm9uSW5zdGFuY2VBY2Nlc3NJc0Vycm9yKSB7CiAgICBUeXBlQnVpbGRlciBidWlsZGVyID0gdW5yZXNvbHZlZC5idWlsZGVyOwogICAgaWYgKGJ1aWxkZXIgaXMgTmFtZWRUeXBlQnVpbGRlciAmJiBidWlsZGVyLmRlY2xhcmF0aW9uLmlzVHlwZVZhcmlhYmxlKSB7CiAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGJ1aWxkZXIuZGVjbGFyYXRpb24udGFyZ2V0OwogICAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlOwogICAgICBpZiAoIWlzSW5zdGFuY2VDb250ZXh0ICYmIHR5cGVQYXJhbWV0ZXIucGFyZW50IGlzIENsYXNzKSB7CiAgICAgICAgbWVzc2FnZSA9IGZhc3RhLm1lc3NhZ2VUeXBlVmFyaWFibGVJblN0YXRpY0NvbnRleHQud2l0aExvY2F0aW9uKAogICAgICAgICAgICB1bnJlc29sdmVkLmZpbGVVcmksCiAgICAgICAgICAgIHVucmVzb2x2ZWQuY2hhck9mZnNldCwKICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5uYW1lLmxlbmd0aCk7CiAgICAgIH0gZWxzZSBpZiAoY29uc3RhbnRDb250ZXh0ID09IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZCkgewogICAgICAgIG1lc3NhZ2UgPSBmYXN0YS5tZXNzYWdlVHlwZVZhcmlhYmxlSW5Db25zdGFudENvbnRleHQud2l0aExvY2F0aW9uKAogICAgICAgICAgICB1bnJlc29sdmVkLmZpbGVVcmksCiAgICAgICAgICAgIHVucmVzb2x2ZWQuY2hhck9mZnNldCwKICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5uYW1lLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHVucmVzb2x2ZWQ7CiAgICAgIH0KICAgICAgYWRkUHJvYmxlbShtZXNzYWdlLm1lc3NhZ2VPYmplY3QsIG1lc3NhZ2UuY2hhck9mZnNldCwgbWVzc2FnZS5sZW5ndGgpOwogICAgICByZXR1cm4gbmV3IFVucmVzb2x2ZWRUeXBlKAogICAgICAgICAgbmV3IE5hbWVkVHlwZUJ1aWxkZXIodHlwZVBhcmFtZXRlci5uYW1lLCBudWxsKQogICAgICAgICAgICAuLmJpbmQobmV3IEludmFsaWRUeXBlQnVpbGRlcih0eXBlUGFyYW1ldGVyLm5hbWUsIG1lc3NhZ2UpKSwKICAgICAgICAgIHVucmVzb2x2ZWQuY2hhck9mZnNldCwKICAgICAgICAgIHVucmVzb2x2ZWQuZmlsZVVyaSk7CiAgICB9CiAgICByZXR1cm4gdW5yZXNvbHZlZDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZXZhbHVhdGVBcmd1bWVudHNCZWZvcmUoCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm4gZXhwcmVzc2lvbjsKICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPQogICAgICAgIG5ldyBMaXN0PEV4cHJlc3Npb24+LmZyb20oZm9yZXN0LmFyZ3VtZW50c1Bvc2l0aW9uYWwoYXJndW1lbnRzKSk7CiAgICBmb3IgKE5hbWVkRXhwcmVzc2lvbiBuYW1lZCBpbiBmb3Jlc3QuYXJndW1lbnRzTmFtZWQoYXJndW1lbnRzKSkgewogICAgICBleHByZXNzaW9ucy5hZGQobmFtZWQudmFsdWUpOwogICAgfQogICAgZm9yIChFeHByZXNzaW9uIGFyZ3VtZW50IGluIGV4cHJlc3Npb25zLnJldmVyc2VkKSB7CiAgICAgIGV4cHJlc3Npb24gPSBuZXcgTGV0KAogICAgICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoYXJndW1lbnQsCiAgICAgICAgICAgICAgaXNGaW5hbDogdHJ1ZSwgdHlwZTogY29yZVR5cGVzLm9iamVjdENsYXNzLnJhd1R5cGUpLAogICAgICAgICAgZXhwcmVzc2lvbik7CiAgICB9CiAgICByZXR1cm4gZXhwcmVzc2lvbjsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJZGVudGljYWwoTWVtYmVyIG1lbWJlcikgPT4gbWVtYmVyID09IGNvcmVUeXBlcy5pZGVudGljYWxQcm9jZWR1cmU7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRNZXRob2RJbnZvY2F0aW9uKAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLCBOYW1lIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQsCiAgICAgIHtib29sIGlzQ29uc3RhbnRFeHByZXNzaW9uOiBmYWxzZSwKICAgICAgYm9vbCBpc051bGxBd2FyZTogZmFsc2UsCiAgICAgIGJvb2wgaXNJbXBsaWNpdENhbGw6IGZhbHNlLAogICAgICBib29sIGlzU3VwZXI6IGZhbHNlLAogICAgICBNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0fSkgewogICAgaWYgKGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSAmJiAhaXNDb25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlTm90Q29uc3RhbnRFeHByZXNzaW9uCiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoJ01ldGhvZCBpbnZvY2F0aW9uJyksCiAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICBuYW1lLm5hbWUubGVuZ3RoKTsKICAgIH0KICAgIGlmIChpc1N1cGVyKSB7CiAgICAgIC8vIFdlIGNhbiBpZ25vcmUgW2lzTnVsbEF3YXJlXSBvbiBzdXBlciBzZW5kcy4KICAgICAgYXNzZXJ0KGZvcmVzdC5pc1RoaXNFeHByZXNzaW9uKHJlY2VpdmVyKSk7CiAgICAgIE1lbWJlciB0YXJnZXQgPSBsb29rdXBJbnN0YW5jZU1lbWJlcihuYW1lLCBpc1N1cGVyOiB0cnVlKTsKCiAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCAodGFyZ2V0IGlzIFByb2NlZHVyZSAmJiAhdGFyZ2V0LmlzQWNjZXNzb3IpKSB7CiAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgICAgICB3YXJuVW5yZXNvbHZlZE1ldGhvZChuYW1lLCBvZmZzZXQsIGlzU3VwZXI6IHRydWUpOwogICAgICAgIH0gZWxzZSBpZiAoIWFyZUFyZ3VtZW50c0NvbXBhdGlibGUodGFyZ2V0LmZ1bmN0aW9uLCBhcmd1bWVudHMpKSB7CiAgICAgICAgICB0YXJnZXQgPSBudWxsOwogICAgICAgICAgYWRkUHJvYmxlbUVycm9ySWZDb25zdCgKICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZVN1cGVyY2xhc3NNZXRob2RBcmd1bWVudE1pc21hdGNoCiAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUubmFtZSksCiAgICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICAgIG5hbWUubmFtZS5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFN1cGVyTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50KAogICAgICAgICAgICBuYW1lLCBmb3Jlc3QuY2FzdEFyZ3VtZW50cyhhcmd1bWVudHMpLAogICAgICAgICAgICBpbnRlcmZhY2VUYXJnZXQ6IHRhcmdldCkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgfQoKICAgICAgcmVjZWl2ZXIgPSBuZXcgU3VwZXJQcm9wZXJ0eUdldEp1ZGdtZW50KG5hbWUsIGludGVyZmFjZVRhcmdldDogdGFyZ2V0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgTWV0aG9kSW52b2NhdGlvbiBub2RlID0gbmV3IE1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgICAgIHJlY2VpdmVyLCBjYWxsTmFtZSwgZm9yZXN0LmNhc3RBcmd1bWVudHMoYXJndW1lbnRzKSwKICAgICAgICAgIGlzSW1wbGljaXRDYWxsOiB0cnVlKQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZvcmVzdC5yZWFkT2Zmc2V0KGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiBub2RlOwogICAgfQoKICAgIGlmIChpc051bGxBd2FyZSkgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUocmVjZWl2ZXIpOwogICAgICByZXR1cm4gbmV3IE51bGxBd2FyZU1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgICAgIHZhcmlhYmxlLAogICAgICAgICAgZm9yZXN0LmNvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICAgICAgICBidWlsZElzTnVsbChuZXcgVmFyaWFibGVHZXQodmFyaWFibGUpLCBvZmZzZXQsIHRoaXMpLAogICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgZm9yZXN0LmxpdGVyYWxOdWxsKG51bGwpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgbmV3IE1ldGhvZEludm9jYXRpb24obmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlKSwgbmFtZSwKICAgICAgICAgICAgICAgICAgZm9yZXN0LmNhc3RBcmd1bWVudHMoYXJndW1lbnRzKSwgaW50ZXJmYWNlVGFyZ2V0KQogICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0KQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgfSBlbHNlIHsKICAgICAgTWV0aG9kSW52b2NhdGlvbiBub2RlID0gbmV3IE1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgICAgIHJlY2VpdmVyLCBuYW1lLCBmb3Jlc3QuY2FzdEFyZ3VtZW50cyhhcmd1bWVudHMpLAogICAgICAgICAgaXNJbXBsaWNpdENhbGw6IGlzSW1wbGljaXRDYWxsLCBpbnRlcmZhY2VUYXJnZXQ6IGludGVyZmFjZVRhcmdldCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIHJldHVybiBub2RlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRQcm9ibGVtKE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsCiAgICAgIHtib29sIHdhc0hhbmRsZWQ6IGZhbHNlLAogICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0LAogICAgICBTZXZlcml0eSBzZXZlcml0eX0pIHsKICAgIGxpYnJhcnkuYWRkUHJvYmxlbShtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIHVyaSwKICAgICAgICB3YXNIYW5kbGVkOiB3YXNIYW5kbGVkLCBjb250ZXh0OiBjb250ZXh0LCBzZXZlcml0eTogc2V2ZXJpdHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRQcm9ibGVtRXJyb3JJZkNvbnN0KE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsCiAgICAgIHtib29sIHdhc0hhbmRsZWQ6IGZhbHNlLCBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgLy8gVE9ETyhhc2tlc2MpOiBJbnN0ZWFkIG9mIGRlY2lkaW5nIG9uIHRoZSBzZXZlcml0eSwgdGhpcyBtZXRob2Qgc2hvdWxkCiAgICAvLyB0YWtlIHR3byBtZXNzYWdlczogb25lIHRvIHVzZSB3aGVuIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBpcwogICAgLy8gcmVxdWlyZWQgYW5kIG9uZSB0byB1c2Ugb3RoZXJ3aXNlLgogICAgU2V2ZXJpdHkgc2V2ZXJpdHkgPSBtZXNzYWdlLmNvZGUuc2V2ZXJpdHk7CiAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lKSB7CiAgICAgIHNldmVyaXR5ID0gU2V2ZXJpdHkuZXJyb3I7CiAgICB9CiAgICBhZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwKICAgICAgICB3YXNIYW5kbGVkOiB3YXNIYW5kbGVkLCBjb250ZXh0OiBjb250ZXh0LCBzZXZlcml0eTogc2V2ZXJpdHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnREdXBsaWNhdGVkRGVjbGFyYXRpb24oCiAgICAgIERlY2xhcmF0aW9uIGV4aXN0aW5nLCBTdHJpbmcgbmFtZSwgaW50IGNoYXJPZmZzZXQpIHsKICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQgPSBleGlzdGluZy5pc1N5bnRoZXRpYwogICAgICAgID8gbnVsbAogICAgICAgIDogPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZQogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZmlsZVVyaSwgZXhpc3RpbmcuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpCiAgICAgICAgICBdOwogICAgYWRkUHJvYmxlbShmYXN0YS50ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbi53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgIGNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWJ1Z0V2ZW50KFN0cmluZyBuYW1lKSB7CiAgICAvLyBwcmludEV2ZW50KCdCb2R5QnVpbGRlcjogJG5hbWUnKTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRpY0dldCBtYWtlU3RhdGljR2V0KE1lbWJlciByZWFkVGFyZ2V0LCBUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG5ldyBTdGF0aWNHZXQocmVhZFRhcmdldCkuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHdyYXBJbkRlZmVycmVkQ2hlY2soCiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgS2VybmVsUHJlZml4QnVpbGRlciBwcmVmaXgsIGludCBjaGFyT2Zmc2V0KSB7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGNoZWNrID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgZm9yZXN0LmNoZWNrTGlicmFyeUlzTG9hZGVkKHByZWZpeC5kZXBlbmRlbmN5KSkKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgIHJldHVybiBuZXcgRGVmZXJyZWRDaGVja0p1ZGdtZW50KGNoZWNrLCBleHByZXNzaW9uKTsKICB9CgogIC8vLyBUT0RPKGFoZSk6IFRoaXMgbWV0aG9kIGlzIHRlbXBvcmFyaWx5IGltcGxlbWVudGVkLiBPbmNlIHR5cGUgcHJvbW90aW9uIGlzCiAgLy8vIGluZGVwZW5kZW50IG9mIHNoYWRvdyBub2RlcywgcmVtb3ZlIHRoaXMgbWV0aG9kLgogIHZvaWQgZW50ZXJUaGVuRm9yVHlwZVByb21vdGlvbihFeHByZXNzaW9uIGNvbmRpdGlvbikgewogICAgdHlwZVByb21vdGVyPy5lbnRlclRoZW4oY29uZGl0aW9uKTsKICB9CgogIGJvb2wgaXNFcnJvbmVvdXNOb2RlKFRyZWVOb2RlIG5vZGUpIHsKICAgIHJldHVybiBsaWJyYXJ5LmxvYWRlci5oYW5kbGVkRXJyb3JzLmlzTm90RW1wdHkgJiYKICAgICAgICBmb3Jlc3QuaXNFcnJvbmVvdXNOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgYnVpbGREYXJ0VHlwZShVbnJlc29sdmVkVHlwZSB1bnJlc29sdmVkVHlwZSwKICAgICAge2Jvb2wgbm9uSW5zdGFuY2VBY2Nlc3NJc0Vycm9yOiBmYWxzZX0pIHsKICAgIGlmICh1bnJlc29sdmVkVHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiB2YWxpZGF0ZVR5cGVVc2UodW5yZXNvbHZlZFR5cGUsIG5vbkluc3RhbmNlQWNjZXNzSXNFcnJvcikKICAgICAgICAuYnVpbGRlcgogICAgICAgID8uYnVpbGQobGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PERhcnRUeXBlPiBidWlsZERhcnRUeXBlQXJndW1lbnRzKExpc3Q8VW5yZXNvbHZlZFR5cGU+IHVucmVzb2x2ZWRUeXBlcykgewogICAgaWYgKHVucmVzb2x2ZWRUeXBlcyA9PSBudWxsKSByZXR1cm4gPERhcnRUeXBlPltdOwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZXMgPQogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQodW5yZXNvbHZlZFR5cGVzLmxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewogICAgICB0eXBlc1tpXSA9IGJ1aWxkRGFydFR5cGUodW5yZXNvbHZlZFR5cGVzW2ldKTsKICAgIH0KICAgIHJldHVybiB0eXBlczsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBjb25zdHJ1Y3Rvck5hbWVGb3JEaWFnbm9zdGljcyhTdHJpbmcgbmFtZSwKICAgICAge1N0cmluZyBjbGFzc05hbWUsIGJvb2wgaXNTdXBlcjogZmFsc2V9KSB7CiAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKICAgICAgQ2xhc3MgY2xzID0gY2xhc3NCdWlsZGVyLmNsczsKICAgICAgaWYgKGlzU3VwZXIpIHsKICAgICAgICBjbHMgPSBjbHMuc3VwZXJjbGFzczsKICAgICAgICB3aGlsZSAoY2xzLmlzTWl4aW5BcHBsaWNhdGlvbikgewogICAgICAgICAgY2xzID0gY2xzLnN1cGVyY2xhc3M7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNsYXNzTmFtZSA9IGNscy5uYW1lOwogICAgfQogICAgcmV0dXJuIG5hbWUuaXNFbXB0eSA/IGNsYXNzTmFtZSA6ICIkY2xhc3NOYW1lLiRuYW1lIjsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gd3JhcFN5bnRoZXRpY0V4cHJlc3Npb24oRXhwcmVzc2lvbiBkZXN1Z2FyZWQsIGludCBjaGFyT2Zmc2V0KSB7CiAgICBpZiAobGVnYWN5TW9kZSkgcmV0dXJuIGRlc3VnYXJlZDsKICAgIHJldHVybiBzaGFkb3cuU3ludGhldGljV3JhcHBlci53cmFwU3ludGhldGljRXhwcmVzc2lvbihkZXN1Z2FyZWQpCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKEV4cHJlc3Npb24gbm9kZSkgewogICAgaWYgKGxlZ2FjeU1vZGUpIHJldHVybiBub2RlOwogICAgc2hhZG93LlN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudCBzaGFkb3dOb2RlID0gbm9kZTsKICAgIHJldHVybiBzaGFkb3dOb2RlLmRlc3VnYXJlZDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gd3JhcEludmFsaWRDb25zdHJ1Y3Rvckludm9jYXRpb24oRXhwcmVzc2lvbiBkZXN1Z2FyZWQsCiAgICAgIE1lbWJlciBjb25zdHJ1Y3RvciwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IGNoYXJPZmZzZXQpIHsKICAgIGlmIChsZWdhY3lNb2RlKSByZXR1cm4gZGVzdWdhcmVkOwogICAgcmV0dXJuIHNoYWRvdy5TeW50aGV0aWNXcmFwcGVyLndyYXBJbnZhbGlkQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgIGRlc3VnYXJlZCwgY29uc3RydWN0b3IsIGFyZ3VtZW50cykKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gd3JhcEludmFsaWRXcml0ZSgKICAgICAgRXhwcmVzc2lvbiBkZXN1Z2FyZWQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgaW50IGNoYXJPZmZzZXQpIHsKICAgIGlmIChsZWdhY3lNb2RlKSByZXR1cm4gZGVzdWdhcmVkOwogICAgcmV0dXJuIHNoYWRvdy5TeW50aGV0aWNXcmFwcGVyLndyYXBJbnZhbGlkV3JpdGUoZGVzdWdhcmVkLCBleHByZXNzaW9uKQogICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB3cmFwVW5yZXNvbHZlZFRhcmdldEludm9jYXRpb24oCiAgICAgIEV4cHJlc3Npb24gZGVzdWdhcmVkLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgY2hhck9mZnNldCkgewogICAgaWYgKGxlZ2FjeU1vZGUpIHJldHVybiBkZXN1Z2FyZWQ7CiAgICByZXR1cm4gc2hhZG93LlN5bnRoZXRpY1dyYXBwZXIud3JhcFVucmVzb2x2ZWRUYXJnZXRJbnZvY2F0aW9uKAogICAgICAgIGRlc3VnYXJlZCwgYXJndW1lbnRzKQogICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB3cmFwVW5yZXNvbHZlZFZhcmlhYmxlQXNzaWdubWVudCgKICAgICAgRXhwcmVzc2lvbiBkZXN1Z2FyZWQsIGJvb2wgaXNDb21wb3VuZCwgRXhwcmVzc2lvbiByaHMsIGludCBjaGFyT2Zmc2V0KSB7CiAgICBpZiAobGVnYWN5TW9kZSkgcmV0dXJuIGRlc3VnYXJlZDsKICAgIHJldHVybiBzaGFkb3cuU3ludGhldGljV3JhcHBlci53cmFwVW5yZXNvbHZlZFZhcmlhYmxlQXNzaWdubWVudCgKICAgICAgICBkZXN1Z2FyZWQsIGlzQ29tcG91bmQsIHJocykKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEVuc3VyZUxvYWRlZCB7CiAgdm9pZCBlbnN1cmVMb2FkZWQoTWVtYmVyIG1lbWJlcik7CiAgYm9vbCBpc0xvYWRlZChNZW1iZXIgbWVtYmVyKTsKfQoKY2xhc3MgT3BlcmF0b3IgewogIGZpbmFsIFRva2VuIHRva2VuOwogIFN0cmluZyBnZXQgbmFtZSA9PiB0b2tlbi5zdHJpbmdWYWx1ZTsKCiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIE9wZXJhdG9yKHRoaXMudG9rZW4sIHRoaXMuY2hhck9mZnNldCk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJvcGVyYXRvcigkbmFtZSkiOwp9CgpjbGFzcyBKdW1wVGFyZ2V0IGV4dGVuZHMgRGVjbGFyYXRpb24gewogIGZpbmFsIExpc3Q8U3RhdGVtZW50PiB1c2VycyA9IDxTdGF0ZW1lbnQ+W107CgogIGZpbmFsIEp1bXBUYXJnZXRLaW5kIGtpbmQ7CgogIGZpbmFsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyQnVpbGRlciBwYXJlbnQ7CgogIEBvdmVycmlkZQogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICBKdW1wVGFyZ2V0KAogICAgICB0aGlzLmtpbmQsIHRoaXMuZnVuY3Rpb25OZXN0aW5nTGV2ZWwsIHRoaXMucGFyZW50LCB0aGlzLmNoYXJPZmZzZXQpOwoKICBAb3ZlcnJpZGUKICBVcmkgZ2V0IGZpbGVVcmkgPT4gcGFyZW50LmZpbGVVcmk7CgogIGJvb2wgZ2V0IGlzQnJlYWtUYXJnZXQgPT4ga2luZCA9PSBKdW1wVGFyZ2V0S2luZC5CcmVhazsKCiAgYm9vbCBnZXQgaXNDb250aW51ZVRhcmdldCA9PiBraW5kID09IEp1bXBUYXJnZXRLaW5kLkNvbnRpbnVlOwoKICBib29sIGdldCBpc0dvdG9UYXJnZXQgPT4ga2luZCA9PSBKdW1wVGFyZ2V0S2luZC5Hb3RvOwoKICBib29sIGdldCBoYXNVc2VycyA9PiB1c2Vycy5pc05vdEVtcHR5OwoKICB2b2lkIGFkZEJyZWFrKFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIGFzc2VydChpc0JyZWFrVGFyZ2V0KTsKICAgIHVzZXJzLmFkZChzdGF0ZW1lbnQpOwogIH0KCiAgdm9pZCBhZGRDb250aW51ZShTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICBhc3NlcnQoaXNDb250aW51ZVRhcmdldCk7CiAgICB1c2Vycy5hZGQoc3RhdGVtZW50KTsKICB9CgogIHZvaWQgYWRkR290byhTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICBhc3NlcnQoaXNHb3RvVGFyZ2V0KTsKICAgIHVzZXJzLmFkZChzdGF0ZW1lbnQpOwogIH0KCiAgdm9pZCByZXNvbHZlQnJlYWtzKEZvcmVzdCBmb3Jlc3QsIFN0YXRlbWVudCB0YXJnZXQpIHsKICAgIGFzc2VydChpc0JyZWFrVGFyZ2V0KTsKICAgIGZvciAoQnJlYWtTdGF0ZW1lbnQgdXNlciBpbiB1c2VycykgewogICAgICB1c2VyLnRhcmdldCA9IHRhcmdldDsKICAgIH0KICAgIHVzZXJzLmNsZWFyKCk7CiAgfQoKICB2b2lkIHJlc29sdmVDb250aW51ZXMoRm9yZXN0IGZvcmVzdCwgU3RhdGVtZW50IHRhcmdldCkgewogICAgYXNzZXJ0KGlzQ29udGludWVUYXJnZXQpOwogICAgZm9yIChCcmVha1N0YXRlbWVudCB1c2VyIGluIHVzZXJzKSB7CiAgICAgIHVzZXIudGFyZ2V0ID0gdGFyZ2V0OwogICAgfQogICAgdXNlcnMuY2xlYXIoKTsKICB9CgogIHZvaWQgcmVzb2x2ZUdvdG9zKEZvcmVzdCBmb3Jlc3QsIFN3aXRjaENhc2UgdGFyZ2V0KSB7CiAgICBhc3NlcnQoaXNHb3RvVGFyZ2V0KTsKICAgIGZvciAoQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgdXNlciBpbiB1c2VycykgewogICAgICB1c2VyLnRhcmdldCA9IHRhcmdldDsKICAgIH0KICAgIHVzZXJzLmNsZWFyKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzID0+ICI8anVtcC10YXJnZXQ+IjsKfQoKY2xhc3MgTGFiZWxUYXJnZXQgZXh0ZW5kcyBEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIEp1bXBUYXJnZXQgewogIEBvdmVycmlkZQogIGZpbmFsIE1lbWJlckJ1aWxkZXIgcGFyZW50OwoKICBmaW5hbCBKdW1wVGFyZ2V0IGJyZWFrVGFyZ2V0OwoKICBmaW5hbCBKdW1wVGFyZ2V0IGNvbnRpbnVlVGFyZ2V0OwoKICBmaW5hbCBpbnQgZnVuY3Rpb25OZXN0aW5nTGV2ZWw7CgogIEBvdmVycmlkZQogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICBMYWJlbFRhcmdldCh0aGlzLnBhcmVudCwgdGhpcy5mdW5jdGlvbk5lc3RpbmdMZXZlbCwgdGhpcy5jaGFyT2Zmc2V0KQogICAgICA6IGJyZWFrVGFyZ2V0ID0gbmV3IEp1bXBUYXJnZXQoCiAgICAgICAgICAgIEp1bXBUYXJnZXRLaW5kLkJyZWFrLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCwgcGFyZW50LCBjaGFyT2Zmc2V0KSwKICAgICAgICBjb250aW51ZVRhcmdldCA9IG5ldyBKdW1wVGFyZ2V0KAogICAgICAgICAgICBKdW1wVGFyZ2V0S2luZC5Db250aW51ZSwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwsIHBhcmVudCwgY2hhck9mZnNldCk7CgogIEBvdmVycmlkZQogIFVyaSBnZXQgZmlsZVVyaSA9PiBwYXJlbnQuZmlsZVVyaTsKCiAgYm9vbCBnZXQgaGFzVXNlcnMgPT4gYnJlYWtUYXJnZXQuaGFzVXNlcnMgfHwgY29udGludWVUYXJnZXQuaGFzVXNlcnM7CgogIExpc3Q8U3RhdGVtZW50PiBnZXQgdXNlcnMgPT4gdW5zdXBwb3J0ZWQoInVzZXJzIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CgogIEp1bXBUYXJnZXRLaW5kIGdldCBraW5kID0+IHVuc3VwcG9ydGVkKCJraW5kIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CgogIGJvb2wgZ2V0IGlzQnJlYWtUYXJnZXQgPT4gdHJ1ZTsKCiAgYm9vbCBnZXQgaXNDb250aW51ZVRhcmdldCA9PiB0cnVlOwoKICBib29sIGdldCBpc0dvdG9UYXJnZXQgPT4gZmFsc2U7CgogIHZvaWQgYWRkQnJlYWsoU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgYnJlYWtUYXJnZXQuYWRkQnJlYWsoc3RhdGVtZW50KTsKICB9CgogIHZvaWQgYWRkQ29udGludWUoU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgY29udGludWVUYXJnZXQuYWRkQ29udGludWUoc3RhdGVtZW50KTsKICB9CgogIHZvaWQgYWRkR290byhTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICB1bnN1cHBvcnRlZCgiYWRkR290byIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgdm9pZCByZXNvbHZlQnJlYWtzKEZvcmVzdCBmb3Jlc3QsIFN0YXRlbWVudCB0YXJnZXQpIHsKICAgIGJyZWFrVGFyZ2V0LnJlc29sdmVCcmVha3MoZm9yZXN0LCB0YXJnZXQpOwogIH0KCiAgdm9pZCByZXNvbHZlQ29udGludWVzKEZvcmVzdCBmb3Jlc3QsIFN0YXRlbWVudCB0YXJnZXQpIHsKICAgIGNvbnRpbnVlVGFyZ2V0LnJlc29sdmVDb250aW51ZXMoZm9yZXN0LCB0YXJnZXQpOwogIH0KCiAgdm9pZCByZXNvbHZlR290b3MoRm9yZXN0IGZvcmVzdCwgU3dpdGNoQ2FzZSB0YXJnZXQpIHsKICAgIHVuc3VwcG9ydGVkKCJyZXNvbHZlR290b3MiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgPT4gIjxsYWJlbC10YXJnZXQ+IjsKfQoKY2xhc3MgRm9ybWFsUGFyYW1ldGVycyB7CiAgZmluYWwgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBwYXJhbWV0ZXJzOwogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwogIGZpbmFsIGludCBsZW5ndGg7CiAgZmluYWwgVXJpIHVyaTsKCiAgRm9ybWFsUGFyYW1ldGVycyh0aGlzLnBhcmFtZXRlcnMsIHRoaXMuY2hhck9mZnNldCwgdGhpcy5sZW5ndGgsIHRoaXMudXJpKSB7CiAgICBpZiAocGFyYW1ldGVycz8uaXNFbXB0eSA/PyBmYWxzZSkgewogICAgICB0aHJvdyAiRW1wdHkgcGFyYW1ldGVycyBzaG91bGQgYmUgbnVsbCI7CiAgICB9CiAgfQoKICBGdW5jdGlvbk5vZGUgYnVpbGRGdW5jdGlvbk5vZGUoCiAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnksCiAgICAgIFVucmVzb2x2ZWRUeXBlIHJldHVyblR5cGUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVBhcmFtZXRlcnMsCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTW9kaWZpZXIsCiAgICAgIFN0YXRlbWVudCBib2R5LAogICAgICBpbnQgZmlsZUVuZE9mZnNldCkgewogICAgRnVuY3Rpb25UeXBlIHR5cGUgPQogICAgICAgIHRvRnVuY3Rpb25UeXBlKHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzKS5idWlsZGVyLmJ1aWxkKGxpYnJhcnkpOwogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsUGFyYW1ldGVycyA9IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdOwogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBuYW1lZFBhcmFtZXRlcnMgPSA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXTsKICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIHBhcmFtZXRlciBpbiBwYXJhbWV0ZXJzKSB7CiAgICAgICAgaWYgKHBhcmFtZXRlci5pc05hbWVkKSB7CiAgICAgICAgICBuYW1lZFBhcmFtZXRlcnMuYWRkKHBhcmFtZXRlci50YXJnZXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycy5hZGQocGFyYW1ldGVyLnRhcmdldCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIG5hbWVkUGFyYW1ldGVycy5zb3J0KChWYXJpYWJsZURlY2xhcmF0aW9uIGEsIFZhcmlhYmxlRGVjbGFyYXRpb24gYikgewogICAgICAgIHJldHVybiBhLm5hbWUuY29tcGFyZVRvKGIubmFtZSk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIG5ldyBGdW5jdGlvbk5vZGVKdWRnbWVudChib2R5LAogICAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0eXBlLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzOiBwb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5hbWVkUGFyYW1ldGVycywKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiB0eXBlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgcmV0dXJuVHlwZTogdHlwZS5yZXR1cm5UeXBlLAogICAgICAgIGFzeW5jTWFya2VyOiBhc3luY01vZGlmaWVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0CiAgICAgIC4uZmlsZUVuZE9mZnNldCA9IGZpbGVFbmRPZmZzZXQ7CiAgfQoKICBVbnJlc29sdmVkVHlwZSB0b0Z1bmN0aW9uVHlwZShVbnJlc29sdmVkVHlwZSByZXR1cm5UeXBlLAogICAgICBbTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlUGFyYW1ldGVyc10pIHsKICAgIHJldHVybiBuZXcgVW5yZXNvbHZlZFR5cGUoCiAgICAgICAgbmV3IEZ1bmN0aW9uVHlwZUJ1aWxkZXIoCiAgICAgICAgICAgIHJldHVyblR5cGU/LmJ1aWxkZXIsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKSwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIHVyaSk7CiAgfQoKICBTY29wZSBjb21wdXRlRm9ybWFsUGFyYW1ldGVyU2NvcGUoCiAgICAgIFNjb3BlIHBhcmVudCwgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyKSB7CiAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsKSByZXR1cm4gcGFyZW50OwogICAgYXNzZXJ0KHBhcmFtZXRlcnMuaXNOb3RFbXB0eSk7CiAgICBNYXA8U3RyaW5nLCBEZWNsYXJhdGlvbj4gbG9jYWwgPSA8U3RyaW5nLCBEZWNsYXJhdGlvbj57fTsKCiAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgcGFyYW1ldGVyIGluIHBhcmFtZXRlcnMpIHsKICAgICAgRGVjbGFyYXRpb24gZXhpc3RpbmcgPSBsb2NhbFtwYXJhbWV0ZXIubmFtZV07CiAgICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgICAgaGVscGVyLnJlcG9ydER1cGxpY2F0ZWREZWNsYXJhdGlvbigKICAgICAgICAgICAgZXhpc3RpbmcsIHBhcmFtZXRlci5uYW1lLCBwYXJhbWV0ZXIuY2hhck9mZnNldCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbG9jYWxbcGFyYW1ldGVyLm5hbWVdID0gcGFyYW1ldGVyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFNjb3BlKGxvY2FsLCBudWxsLCBwYXJlbnQsICJmb3JtYWxzIiwgaXNNb2RpZmlhYmxlOiBmYWxzZSk7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIkZvcm1hbFBhcmFtZXRlcnMoJHBhcmFtZXRlcnMsICRjaGFyT2Zmc2V0LCAkdXJpKSI7CiAgfQp9CgovLy8gUmV0dXJucyBhIGJsb2NrIGxpa2UgdGhpczoKLy8vCi8vLyAgICAgewovLy8gICAgICAgc3RhdGVtZW50OwovLy8gICAgICAgYm9keTsKLy8vICAgICB9Ci8vLwovLy8gSWYgW2JvZHldIGlzIGEgW0Jsb2NrXSwgaXQncyByZXR1cm5lZCB3aXRoIFtzdGF0ZW1lbnRdIHByZXBlbmRlZCB0byBpdC4KQmxvY2sgY29tYmluZVN0YXRlbWVudHMoU3RhdGVtZW50IHN0YXRlbWVudCwgU3RhdGVtZW50IGJvZHkpIHsKICBpZiAoYm9keSBpcyBCbG9jaykgewogICAgYm9keS5zdGF0ZW1lbnRzLmluc2VydCgwLCBzdGF0ZW1lbnQpOwogICAgc3RhdGVtZW50LnBhcmVudCA9IGJvZHk7CiAgICByZXR1cm4gYm9keTsKICB9IGVsc2UgewogICAgcmV0dXJuIG5ldyBCbG9ja0p1ZGdtZW50KDxTdGF0ZW1lbnQ+W3N0YXRlbWVudCwgYm9keV0pCiAgICAgIC4uZmlsZU9mZnNldCA9IHN0YXRlbWVudC5maWxlT2Zmc2V0OwogIH0KfQoKU3RyaW5nIGRlYnVnTmFtZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbmFtZSwgW1N0cmluZyBwcmVmaXhdKSB7CiAgU3RyaW5nIHJlc3VsdCA9IG5hbWUuaXNFbXB0eSA/IGNsYXNzTmFtZSA6ICIkY2xhc3NOYW1lLiRuYW1lIjsKICByZXR1cm4gcHJlZml4ID09IG51bGwgPyByZXN1bHQgOiAiJHByZWZpeC5yZXN1bHQiOwp9CgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIGlzIGEgYml0IGFkIGhvYy4gQ2FsbCBzaXRlcyBzaG91bGQga25vdyB3aGF0IGtpbmQKLy8gb2Ygb2JqZWN0cyBjYW4gYmUgYW50aWNpcGF0ZWQgYW5kIGhhbmRsZSB0aGVzZSBkaXJlY3RseS4KU3RyaW5nIGdldE5vZGVOYW1lKE9iamVjdCBub2RlKSB7CiAgaWYgKG5vZGUgaXMgSWRlbnRpZmllcikgewogICAgcmV0dXJuIG5vZGUubmFtZTsKICB9IGVsc2UgaWYgKG5vZGUgaXMgRGVjbGFyYXRpb24pIHsKICAgIHJldHVybiBub2RlLmZ1bGxOYW1lRm9yRXJyb3JzOwogIH0gZWxzZSBpZiAobm9kZSBpcyBRdWFsaWZpZWROYW1lKSB7CiAgICByZXR1cm4gZmxhdHRlbk5hbWUobm9kZSwgbm9kZS5jaGFyT2Zmc2V0LCBudWxsKTsKICB9IGVsc2UgewogICAgcmV0dXJuIHVuaGFuZGxlZCgiJHtub2RlLnJ1bnRpbWVUeXBlfSIsICJnZXROb2RlTmFtZSIsIC0xLCBudWxsKTsKICB9Cn0KCkFzeW5jTWFya2VyIGFzeW5jTWFya2VyRnJvbVRva2VucyhUb2tlbiBhc3luY1Rva2VuLCBUb2tlbiBzdGFyVG9rZW4pIHsKICBpZiAoYXN5bmNUb2tlbiA9PSBudWxsIHx8IGlkZW50aWNhbChhc3luY1Rva2VuLnN0cmluZ1ZhbHVlLCAic3luYyIpKSB7CiAgICBpZiAoc3RhclRva2VuID09IG51bGwpIHsKICAgICAgcmV0dXJuIEFzeW5jTWFya2VyLlN5bmM7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoaWRlbnRpY2FsKHN0YXJUb2tlbi5zdHJpbmdWYWx1ZSwgIioiKSk7CiAgICAgIHJldHVybiBBc3luY01hcmtlci5TeW5jU3RhcjsKICAgIH0KICB9IGVsc2UgaWYgKGlkZW50aWNhbChhc3luY1Rva2VuLnN0cmluZ1ZhbHVlLCAiYXN5bmMiKSkgewogICAgaWYgKHN0YXJUb2tlbiA9PSBudWxsKSB7CiAgICAgIHJldHVybiBBc3luY01hcmtlci5Bc3luYzsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChpZGVudGljYWwoc3RhclRva2VuLnN0cmluZ1ZhbHVlLCAiKiIpKTsKICAgICAgcmV0dXJuIEFzeW5jTWFya2VyLkFzeW5jU3RhcjsKICAgIH0KICB9IGVsc2UgewogICAgcmV0dXJuIHVuaGFuZGxlZChhc3luY1Rva2VuLmxleGVtZSwgImFzeW5jTWFya2VyRnJvbVRva2VucyIsCiAgICAgICAgYXN5bmNUb2tlbi5jaGFyT2Zmc2V0LCBudWxsKTsKICB9Cn0KCi8vLyBBIGRhdGEgaG9sZGVyIHVzZWQgdG8gaG9sZCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYSBsYWJlbCB0aGF0IGlzIHB1c2hlZCBvbgovLy8gdGhlIHN0YWNrLgpjbGFzcyBMYWJlbCB7CiAgU3RyaW5nIG5hbWU7CiAgaW50IGNoYXJPZmZzZXQ7CgogIExhYmVsKHRoaXMubmFtZSwgdGhpcy5jaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gImxhYmVs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X2JpbmFyeS5kYXJ0JwogICAgc2hvdwogICAgICAgIEJpbmFyeUJ1aWxkZXIsCiAgICAgICAgQ2Fub25pY2FsTmFtZUVycm9yLAogICAgICAgIENhbm9uaWNhbE5hbWVTZGtFcnJvciwKICAgICAgICBJbnZhbGlkS2VybmVsVmVyc2lvbkVycm9yOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcKICAgIHNob3cgQ2xhc3NIaWVyYXJjaHksIENsb3NlZFdvcmxkQ2xhc3NIaWVyYXJjaHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JwogICAgc2hvdwogICAgICAgIENsYXNzLAogICAgICAgIENvbXBvbmVudCwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBMaWJyYXJ5LAogICAgICAgIExpYnJhcnlEZXBlbmRlbmN5LAogICAgICAgIExpYnJhcnlQYXJ0LAogICAgICAgIE5hbWUsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFByb2NlZHVyZUtpbmQsCiAgICAgICAgUmV0dXJuU3RhdGVtZW50LAogICAgICAgIFNvdXJjZSwKICAgICAgICBTdXBlcnR5cGUsCiAgICAgICAgVHJlZU5vZGUsCiAgICAgICAgVHlwZVBhcmFtZXRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwva2VybmVsLmRhcnQnIGFzIGtlcm5lbCBzaG93IENvbWJpbmF0b3I7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydCcgc2hvdyBGaWxlU3lzdGVtRW50aXR5OwoKaW1wb3J0ICcuLi9hcGlfcHJvdG90eXBlL2luY3JlbWVudGFsX2tlcm5lbF9nZW5lcmF0b3IuZGFydCcKICAgIHNob3cgSW5jcmVtZW50YWxLZXJuZWxHZW5lcmF0b3IsIGlzTGVnYWxJZGVudGlmaWVyOwoKaW1wb3J0ICcuLi9hcGlfcHJvdG90eXBlL21lbW9yeV9maWxlX3N5c3RlbS5kYXJ0JyBzaG93IE1lbW9yeUZpbGVTeXN0ZW07CgppbXBvcnQgJ2J1aWxkZXIvYnVpbGRlci5kYXJ0JyBzaG93IExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdidWlsZGVyX2dyYXBoLmRhcnQnIHNob3cgQnVpbGRlckdyYXBoOwoKaW1wb3J0ICdjb21iaW5hdG9yLmRhcnQnIHNob3cgQ29tYmluYXRvcjsKCmltcG9ydCAnY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnZGlsbC9kaWxsX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IERpbGxMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnZGlsbC9kaWxsX3RhcmdldC5kYXJ0JyBzaG93IERpbGxUYXJnZXQ7CgppbXBvcnQgJ3V0aWwvZXJyb3JfcmVwb3J0ZXJfZmlsZV9jb3BpZXIuZGFydCcgc2hvdyBzYXZlQXNHemlwOwoKaW1wb3J0ICdmYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24sCiAgICAgICAgdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkLAogICAgICAgIHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZE5vRHVtcCwKICAgICAgICB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtLAogICAgICAgIHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXA7CgppbXBvcnQgJ2h5YnJpZF9maWxlX3N5c3RlbS5kYXJ0JyBzaG93IEh5YnJpZEZpbGVTeXN0ZW07CgppbXBvcnQgJ2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5QnVpbGRlcjsKCmltcG9ydCAna2VybmVsL2tlcm5lbF9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBLZXJuZWxMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAna2VybmVsL2tlcm5lbF9zaGFkb3dfYXN0LmRhcnQnIHNob3cgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50OwoKaW1wb3J0ICdrZXJuZWwva2VybmVsX3RhcmdldC5kYXJ0JyBzaG93IEtlcm5lbFRhcmdldDsKCmltcG9ydCAnbGlicmFyeV9ncmFwaC5kYXJ0JyBzaG93IExpYnJhcnlHcmFwaDsKCmltcG9ydCAnbWVzc2FnZXMuZGFydCcgc2hvdyBNZXNzYWdlOwoKaW1wb3J0ICdzb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUxpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICd0aWNrZXIuZGFydCcgc2hvdyBUaWNrZXI7CgppbXBvcnQgJ3VyaV90cmFuc2xhdG9yLmRhcnQnIHNob3cgVXJpVHJhbnNsYXRvcjsKCmNsYXNzIEluY3JlbWVudGFsQ29tcGlsZXIgaW1wbGVtZW50cyBJbmNyZW1lbnRhbEtlcm5lbEdlbmVyYXRvciB7CiAgZmluYWwgQ29tcGlsZXJDb250ZXh0IGNvbnRleHQ7CgogIGZpbmFsIFRpY2tlciB0aWNrZXI7CgogIGZpbmFsIGJvb2wgb3V0bGluZU9ubHk7CiAgYm9vbCB0cmFja05lZWRlZERpbGxMaWJyYXJpZXMgPSBmYWxzZTsKICBTZXQ8TGlicmFyeT4gbmVlZGVkRGlsbExpYnJhcmllczsKCiAgU2V0PFVyaT4gaW52YWxpZGF0ZWRVcmlzID0gbmV3IFNldDxVcmk+KCk7CgogIERpbGxUYXJnZXQgZGlsbExvYWRlZERhdGE7CiAgTGlzdDxMaWJyYXJ5QnVpbGRlcj4gcGxhdGZvcm1CdWlsZGVyczsKICBNYXA8VXJpLCBMaWJyYXJ5QnVpbGRlcj4gdXNlckJ1aWxkZXJzOwogIGZpbmFsIFVyaSBpbml0aWFsaXplRnJvbURpbGxVcmk7CiAgZmluYWwgQ29tcG9uZW50IGNvbXBvbmVudFRvSW5pdGlhbGl6ZUZyb207CiAgYm9vbCBpbml0aWFsaXplZEZyb21EaWxsID0gZmFsc2U7CiAgVXJpIHByZXZpb3VzUGFja2FnZXNVcmk7CiAgTWFwPFN0cmluZywgVXJpPiBwcmV2aW91c1BhY2thZ2VzTWFwOwogIE1hcDxTdHJpbmcsIFVyaT4gY3VycmVudFBhY2thZ2VzTWFwOwogIGJvb2wgaGFzVG9DaGVja1BhY2thZ2VVcmlzID0gZmFsc2U7CiAgTWFwPFVyaSwgTGlzdDxEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uPj4gcmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXMgPQogICAgICBuZXcgTWFwPFVyaSwgTGlzdDxEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uPj4oKTsKICBMaXN0PENvbXBvbmVudD4gbW9kdWxlc1RvTG9hZDsKCiAgc3RhdGljIGZpbmFsIFVyaSBkZWJ1Z0V4cHJVcmkgPQogICAgICBuZXcgVXJpKHNjaGVtZTogIm9yZy1kYXJ0bGFuZy1kZWJ1ZyIsIHBhdGg6ICJzeW50aGV0aWNfZGVidWdfZXhwcmVzc2lvbiIpOwoKICBLZXJuZWxUYXJnZXQgdXNlckNvZGU7CgogIEluY3JlbWVudGFsQ29tcGlsZXIuZnJvbUNvbXBvbmVudCgKICAgICAgdGhpcy5jb250ZXh0LCBDb21wb25lbnQgdGhpcy5jb21wb25lbnRUb0luaXRpYWxpemVGcm9tLAogICAgICBbYm9vbCBvdXRsaW5lT25seV0pCiAgICAgIDogdGlja2VyID0gY29udGV4dC5vcHRpb25zLnRpY2tlciwKICAgICAgICBpbml0aWFsaXplRnJvbURpbGxVcmkgPSBudWxsLAogICAgICAgIHRoaXMub3V0bGluZU9ubHkgPSBvdXRsaW5lT25seSA/PyBmYWxzZTsKCiAgSW5jcmVtZW50YWxDb21waWxlcih0aGlzLmNvbnRleHQsCiAgICAgIFt0aGlzLmluaXRpYWxpemVGcm9tRGlsbFVyaSwgYm9vbCBvdXRsaW5lT25seV0pCiAgICAgIDogdGlja2VyID0gY29udGV4dC5vcHRpb25zLnRpY2tlciwKICAgICAgICBjb21wb25lbnRUb0luaXRpYWxpemVGcm9tID0gbnVsbCwKICAgICAgICB0aGlzLm91dGxpbmVPbmx5ID0gb3V0bGluZU9ubHkgPz8gZmFsc2U7CgogIEBvdmVycmlkZQogIEZ1dHVyZTxDb21wb25lbnQ+IGNvbXB1dGVEZWx0YSgKICAgICAge0xpc3Q8VXJpPiBlbnRyeVBvaW50cywgYm9vbCBmdWxsQ29tcG9uZW50OiBmYWxzZX0pIGFzeW5jIHsKICAgIHRpY2tlci5yZXNldCgpOwogICAgZW50cnlQb2ludHMgPz89IGNvbnRleHQub3B0aW9ucy5pbnB1dHM7CiAgICByZXR1cm4gY29udGV4dC5ydW5JbkNvbnRleHQ8Q29tcG9uZW50PigoQ29tcGlsZXJDb250ZXh0IGMpIGFzeW5jIHsKICAgICAgSW5jcmVtZW50YWxDb21waWxlckRhdGEgZGF0YSA9IG5ldyBJbmNyZW1lbnRhbENvbXBpbGVyRGF0YSgpOwoKICAgICAgYm9vbCBieXBhc3NDYWNoZSA9IGZhbHNlOwogICAgICBpZiAoIWlkZW50aWNhbChwcmV2aW91c1BhY2thZ2VzVXJpLCBjLm9wdGlvbnMucGFja2FnZXNVcmlSYXcpKSB7CiAgICAgICAgcHJldmlvdXNQYWNrYWdlc1VyaSA9IGMub3B0aW9ucy5wYWNrYWdlc1VyaVJhdzsKICAgICAgICBieXBhc3NDYWNoZSA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5pbnZhbGlkYXRlZFVyaXMuY29udGFpbnMoYy5vcHRpb25zLnBhY2thZ2VzVXJpKSkgewogICAgICAgIGJ5cGFzc0NhY2hlID0gdHJ1ZTsKICAgICAgfQogICAgICBoYXNUb0NoZWNrUGFja2FnZVVyaXMgPSBoYXNUb0NoZWNrUGFja2FnZVVyaXMgfHwgYnlwYXNzQ2FjaGU7CiAgICAgIFVyaVRyYW5zbGF0b3IgdXJpVHJhbnNsYXRvciA9CiAgICAgICAgICBhd2FpdCBjLm9wdGlvbnMuZ2V0VXJpVHJhbnNsYXRvcihieXBhc3NDYWNoZTogYnlwYXNzQ2FjaGUpOwogICAgICBwcmV2aW91c1BhY2thZ2VzTWFwID0gY3VycmVudFBhY2thZ2VzTWFwOwogICAgICBjdXJyZW50UGFja2FnZXNNYXAgPSB1cmlUcmFuc2xhdG9yLnBhY2thZ2VzLmFzTWFwKCk7CiAgICAgIHRpY2tlci5sb2dNcygiUmVhZCBwYWNrYWdlcyBmaWxlIik7CgogICAgICBpZiAoZGlsbExvYWRlZERhdGEgPT0gbnVsbCkgewogICAgICAgIGludCBieXRlc0xlbmd0aCA9IDA7CiAgICAgICAgaWYgKGNvbXBvbmVudFRvSW5pdGlhbGl6ZUZyb20gIT0gbnVsbCkgewogICAgICAgICAgLy8gSWYgaW5pdGlhbGl6aW5nIGZyb20gYSBjb21wb25lbnQgaXQgaGFzIHRvIGluY2x1ZGUgdGhlIHNkaywKICAgICAgICAgIC8vIHNvIHdlIGV4cGxpY2l0bHkgZG9uJ3QgbG9hZCBpdCBoZXJlLgogICAgICAgICAgaW5pdGlhbGl6ZUZyb21Db21wb25lbnQodXJpVHJhbnNsYXRvciwgYywgZGF0YSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIExpc3Q8aW50PiBzdW1tYXJ5Qnl0ZXMgPSBhd2FpdCBjLm9wdGlvbnMubG9hZFNka1N1bW1hcnlCeXRlcygpOwogICAgICAgICAgYnl0ZXNMZW5ndGggPSBwcmVwYXJlU3VtbWFyeShzdW1tYXJ5Qnl0ZXMsIHVyaVRyYW5zbGF0b3IsIGMsIGRhdGEpOwogICAgICAgICAgaWYgKGluaXRpYWxpemVGcm9tRGlsbFVyaSAhPSBudWxsKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgYnl0ZXNMZW5ndGggKz0gYXdhaXQgaW5pdGlhbGl6ZUZyb21EaWxsKHVyaVRyYW5zbGF0b3IsIGMsIGRhdGEpOwogICAgICAgICAgICB9IGNhdGNoIChlLCBzdCkgewogICAgICAgICAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgbG9hZGVkIHggb3V0IG9mIHkgbGlicmFyaWVzIGludG8gdGhlIGNvbXBvbmVudC4KICAgICAgICAgICAgICAvLyBUbyBhdm9pZCBhbnkgdW5mb3Jlc2VlbiBwcm9ibGVtcyBzdGFydCBvdmVyLgogICAgICAgICAgICAgIGJ5dGVzTGVuZ3RoID0KICAgICAgICAgICAgICAgICAgcHJlcGFyZVN1bW1hcnkoc3VtbWFyeUJ5dGVzLCB1cmlUcmFuc2xhdG9yLCBjLCBkYXRhKTsKCiAgICAgICAgICAgICAgaWYgKGUgaXMgSW52YWxpZEtlcm5lbFZlcnNpb25FcnJvciB8fAogICAgICAgICAgICAgICAgICBlIGlzIFBhY2thZ2VDaGFuZ2VkRXJyb3IgfHwKICAgICAgICAgICAgICAgICAgZSBpcyBDYW5vbmljYWxOYW1lU2RrRXJyb3IpIHsKICAgICAgICAgICAgICAgIC8vIERvbid0IHJlcG9ydCBhbnkgd2FybmluZy4KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgVXJpIGd6SW5pdGlhbGl6ZWRGcm9tOwogICAgICAgICAgICAgICAgaWYgKGMub3B0aW9ucy53cml0ZUZpbGVPbkNyYXNoUmVwb3J0KSB7CiAgICAgICAgICAgICAgICAgIGd6SW5pdGlhbGl6ZWRGcm9tID0gc2F2ZUFzR3ppcCgKICAgICAgICAgICAgICAgICAgICAgIGRhdGEuaW5pdGlhbGl6YXRpb25CeXRlcywgImluaXRpYWxpemVfZnJvbS5kaWxsIik7CiAgICAgICAgICAgICAgICAgIHJlY29yZFRlbXBvcmFyeUZpbGVGb3JUZXN0aW5nKGd6SW5pdGlhbGl6ZWRGcm9tKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChlIGlzIENhbm9uaWNhbE5hbWVFcnJvcikgewogICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnekluaXRpYWxpemVkRnJvbSAhPSBudWxsCiAgICAgICAgICAgICAgICAgICAgICA/IHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZAogICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGluaXRpYWxpemVGcm9tRGlsbFVyaS50b1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnekluaXRpYWxpemVkRnJvbSkKICAgICAgICAgICAgICAgICAgICAgIDogdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wCiAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoaW5pdGlhbGl6ZUZyb21EaWxsVXJpLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICBkaWxsTG9hZGVkRGF0YS5sb2FkZXIKICAgICAgICAgICAgICAgICAgICAgIC5hZGRQcm9ibGVtKG1lc3NhZ2UsIFRyZWVOb2RlLm5vT2Zmc2V0LCAxLCBudWxsKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIC8vIFVua25vd24gZXJyb3I6IFJlcG9ydCBwcm9ibGVtIGFzIHN1Y2guCiAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGd6SW5pdGlhbGl6ZWRGcm9tICE9IG51bGwKICAgICAgICAgICAgICAgICAgICAgID8gdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVGcm9tRGlsbFVyaS50b1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICIkZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiRzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3pJbml0aWFsaXplZEZyb20pCiAgICAgICAgICAgICAgICAgICAgICA6IHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXAKICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUZyb21EaWxsVXJpLnRvU3RyaW5nKCksICIkZSIsICIkc3QiKTsKICAgICAgICAgICAgICAgICAgZGlsbExvYWRlZERhdGEubG9hZGVyCiAgICAgICAgICAgICAgICAgICAgICAuYWRkUHJvYmxlbShtZXNzYWdlLCBUcmVlTm9kZS5ub09mZnNldCwgMSwgbnVsbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGFwcGVuZExpYnJhcmllcyhkYXRhLCBieXRlc0xlbmd0aCk7CgogICAgICAgIGF3YWl0IGRpbGxMb2FkZWREYXRhLmJ1aWxkT3V0bGluZXMoKTsKICAgICAgICB1c2VyQnVpbGRlcnMgPSA8VXJpLCBMaWJyYXJ5QnVpbGRlcj57fTsKICAgICAgICBwbGF0Zm9ybUJ1aWxkZXJzID0gPExpYnJhcnlCdWlsZGVyPltdOwogICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy5mb3JFYWNoKCh1cmksIGJ1aWxkZXIpIHsKICAgICAgICAgIGlmIChidWlsZGVyLnVyaS5zY2hlbWUgPT0gImRhcnQiKSB7CiAgICAgICAgICAgIHBsYXRmb3JtQnVpbGRlcnMuYWRkKGJ1aWxkZXIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdXNlckJ1aWxkZXJzW3VyaV0gPSBidWlsZGVyOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmICh1c2VyQnVpbGRlcnMuaXNFbXB0eSkgdXNlckJ1aWxkZXJzID0gbnVsbDsKICAgICAgfQogICAgICBkYXRhLmluaXRpYWxpemF0aW9uQnl0ZXMgPSBudWxsOwoKICAgICAgU2V0PFVyaT4gaW52YWxpZGF0ZWRVcmlzID0gdGhpcy5pbnZhbGlkYXRlZFVyaXMudG9TZXQoKTsKCiAgICAgIGludmFsaWRhdGVOb3RLZXB0VXNlckJ1aWxkZXJzKGludmFsaWRhdGVkVXJpcyk7CgogICAgICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHkgPSB1c2VyQ29kZT8ubG9hZGVyPy5oaWVyYXJjaHk7CiAgICAgIFNldDxMaWJyYXJ5QnVpbGRlcj4gbm90UmV1c2VkTGlicmFyaWVzID0gbmV3IFNldDxMaWJyYXJ5QnVpbGRlcj4oKTsKICAgICAgTGlzdDxMaWJyYXJ5QnVpbGRlcj4gcmV1c2VkTGlicmFyaWVzID0gY29tcHV0ZVJldXNlZExpYnJhcmllcygKICAgICAgICAgIGludmFsaWRhdGVkVXJpcywgdXJpVHJhbnNsYXRvciwKICAgICAgICAgIG5vdFJldXNlZDogbm90UmV1c2VkTGlicmFyaWVzKTsKCiAgICAgIGJvb2wgcmVtb3ZlZERpbGxCdWlsZGVycyA9IGZhbHNlOwogICAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgaW4gbm90UmV1c2VkTGlicmFyaWVzKSB7CiAgICAgICAgQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQudXJpVG9Tb3VyY2UucmVtb3ZlKGJ1aWxkZXIuZmlsZVVyaSk7CgogICAgICAgIExpYnJhcnlCdWlsZGVyIGRpbGxCdWlsZGVyID0KICAgICAgICAgICAgZGlsbExvYWRlZERhdGEubG9hZGVyLmJ1aWxkZXJzLnJlbW92ZShidWlsZGVyLnVyaSk7CiAgICAgICAgaWYgKGRpbGxCdWlsZGVyICE9IG51bGwpIHsKICAgICAgICAgIHJlbW92ZWREaWxsQnVpbGRlcnMgPSB0cnVlOwogICAgICAgICAgdXNlckJ1aWxkZXJzPy5yZW1vdmUoYnVpbGRlci51cmkpOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVtb3ZlIGNvbXBvbmVudCBwcm9ibGVtcyBmb3IgbGlicmFyaWVzIHdlIGRvbid0IHJldXNlLgogICAgICAgIGlmIChyZW1haW5pbmdDb21wb25lbnRQcm9ibGVtcy5pc05vdEVtcHR5KSB7CiAgICAgICAgICBMaWJyYXJ5IGxpYiA9IGJ1aWxkZXIudGFyZ2V0OwogICAgICAgICAgcmVtb3ZlTGlicmFyeUZyb21SZW1haW5pbmdDb21wb25lbnRQcm9ibGVtcyhsaWIsIHVyaVRyYW5zbGF0b3IpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHJlbW92ZWREaWxsQnVpbGRlcnMpIHsKICAgICAgICBkaWxsTG9hZGVkRGF0YS5sb2FkZXIubGlicmFyaWVzLmNsZWFyKCk7CiAgICAgICAgZm9yIChMaWJyYXJ5QnVpbGRlciBidWlsZGVyIGluIGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy52YWx1ZXMpIHsKICAgICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5saWJyYXJpZXMuYWRkKGJ1aWxkZXIudGFyZ2V0KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChoYXNUb0NoZWNrUGFja2FnZVVyaXMpIHsKICAgICAgICAvLyBUaGUgcGFja2FnZSBmaWxlIHdhcyBjaGFuZ2VkLgogICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGlsbCBsb2FkZXIgaXMgb24gdGhlIHNhbWUgcGFnZS4KICAgICAgICBEaWxsVGFyZ2V0IG9sZERpbGxMb2FkZWREYXRhID0gZGlsbExvYWRlZERhdGE7CiAgICAgICAgZGlsbExvYWRlZERhdGEgPQogICAgICAgICAgICBuZXcgRGlsbFRhcmdldCh0aWNrZXIsIHVyaVRyYW5zbGF0b3IsIGMub3B0aW9ucy50YXJnZXQpOwogICAgICAgIGZvciAoRGlsbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkKICAgICAgICAgICAgaW4gb2xkRGlsbExvYWRlZERhdGEubG9hZGVyLmJ1aWxkZXJzLnZhbHVlcykgewogICAgICAgICAgbGlicmFyeS5sb2FkZXIgPSBkaWxsTG9hZGVkRGF0YS5sb2FkZXI7CiAgICAgICAgICBkaWxsTG9hZGVkRGF0YS5sb2FkZXIuYnVpbGRlcnNbbGlicmFyeS51cmldID0gbGlicmFyeTsKICAgICAgICAgIGlmIChsaWJyYXJ5LnVyaS5zY2hlbWUgPT0gImRhcnQiICYmIGxpYnJhcnkudXJpLnBhdGggPT0gImNvcmUiKSB7CiAgICAgICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5jb3JlTGlicmFyeSA9IGxpYnJhcnk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5maXJzdCA9IG9sZERpbGxMb2FkZWREYXRhLmxvYWRlci5maXJzdDsKICAgICAgICBkaWxsTG9hZGVkRGF0YS5sb2FkZXIubGlicmFyaWVzCiAgICAgICAgICAgIC5hZGRBbGwob2xkRGlsbExvYWRlZERhdGEubG9hZGVyLmxpYnJhcmllcyk7CiAgICAgIH0KCiAgICAgIGlmIChoaWVyYXJjaHkgIT0gbnVsbCkgewogICAgICAgIExpc3Q8TGlicmFyeT4gcmVtb3ZlZExpYnJhcmllcyA9IG5ldyBMaXN0PExpYnJhcnk+KCk7CiAgICAgICAgZm9yIChMaWJyYXJ5QnVpbGRlciBidWlsZGVyIGluIG5vdFJldXNlZExpYnJhcmllcykgewogICAgICAgICAgTGlicmFyeSBsaWIgPSBidWlsZGVyLnRhcmdldDsKICAgICAgICAgIHJlbW92ZWRMaWJyYXJpZXMuYWRkKGxpYik7CiAgICAgICAgfQogICAgICAgIGhpZXJhcmNoeS5hcHBseVRyZWVDaGFuZ2VzKHJlbW92ZWRMaWJyYXJpZXMsIGNvbnN0IFtdKTsKICAgICAgfQogICAgICBub3RSZXVzZWRMaWJyYXJpZXMgPSBudWxsOwoKICAgICAgaWYgKHVzZXJDb2RlICE9IG51bGwpIHsKICAgICAgICB0aWNrZXIubG9nTXMoIkRlY2lkZWQgdG8gcmV1c2UgJHtyZXVzZWRMaWJyYXJpZXMubGVuZ3RofSIKICAgICAgICAgICAgIiBvZiAke3VzZXJDb2RlLmxvYWRlci5idWlsZGVycy5sZW5ndGh9IGxpYnJhcmllcyIpOwogICAgICB9CgogICAgICBhd2FpdCBsb2FkRW5zdXJlTG9hZGVkQ29tcG9uZW50cyhyZXVzZWRMaWJyYXJpZXMpOwoKICAgICAgS2VybmVsVGFyZ2V0IHVzZXJDb2RlT2xkID0gdXNlckNvZGU7CiAgICAgIHVzZXJDb2RlID0gbmV3IEtlcm5lbFRhcmdldCgKICAgICAgICAgIG5ldyBIeWJyaWRGaWxlU3lzdGVtKAogICAgICAgICAgICAgIG5ldyBNZW1vcnlGaWxlU3lzdGVtKAogICAgICAgICAgICAgICAgICBuZXcgVXJpKHNjaGVtZTogIm9yZy1kYXJ0bGFuZy1kZWJ1ZyIsIHBhdGg6ICIvIikpLAogICAgICAgICAgICAgIGMuZmlsZVN5c3RlbSksCiAgICAgICAgICBmYWxzZSwKICAgICAgICAgIGRpbGxMb2FkZWREYXRhLAogICAgICAgICAgdXJpVHJhbnNsYXRvcik7CiAgICAgIHVzZXJDb2RlLmxvYWRlci5oaWVyYXJjaHkgPSBoaWVyYXJjaHk7CgogICAgICBpZiAodHJhY2tOZWVkZWREaWxsTGlicmFyaWVzKSB7CiAgICAgICAgLy8gUmVzZXQgZGlsbCBsb2FkZXJzIGFuZCBrZXJuZWwgY2xhc3MgaGllcmFyY2h5LgogICAgICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgYnVpbGRlciBpbiBkaWxsTG9hZGVkRGF0YS5sb2FkZXIuYnVpbGRlcnMudmFsdWVzKSB7CiAgICAgICAgICBpZiAoYnVpbGRlciBpcyBEaWxsTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgICAgICAgYnVpbGRlci5pc0J1aWx0QW5kTWFya2VkID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoaGllcmFyY2h5IGlzIENsb3NlZFdvcmxkQ2xhc3NIaWVyYXJjaHkpIHsKICAgICAgICAgIGhpZXJhcmNoeS5yZXNldFVzZWQoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSBpbiByZXVzZWRMaWJyYXJpZXMpIHsKICAgICAgICB1c2VyQ29kZS5sb2FkZXIuYnVpbGRlcnNbbGlicmFyeS51cmldID0gbGlicmFyeTsKICAgICAgICBpZiAobGlicmFyeS51cmkuc2NoZW1lID09ICJkYXJ0IiAmJiBsaWJyYXJ5LnVyaS5wYXRoID09ICJjb3JlIikgewogICAgICAgICAgdXNlckNvZGUubG9hZGVyLmNvcmVMaWJyYXJ5ID0gbGlicmFyeTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGVudHJ5UG9pbnRzID0gdXNlckNvZGUuc2V0RW50cnlQb2ludHMoZW50cnlQb2ludHMpOwogICAgICBpZiAodXNlckNvZGUubG9hZGVyLmZpcnN0ID09IG51bGwgJiYKICAgICAgICAgIHVzZXJDb2RlLmxvYWRlci5idWlsZGVyc1tlbnRyeVBvaW50cy5maXJzdF0gIT0gbnVsbCkgewogICAgICAgIHVzZXJDb2RlLmxvYWRlci5maXJzdCA9IHVzZXJDb2RlLmxvYWRlci5idWlsZGVyc1tlbnRyeVBvaW50cy5maXJzdF07CiAgICAgIH0KICAgICAgQ29tcG9uZW50IGNvbXBvbmVudFdpdGhEaWxsID0gYXdhaXQgdXNlckNvZGUuYnVpbGRPdXRsaW5lcygpOwoKICAgICAgLy8gVGhpcyBpcyBub3QgdGhlIGZ1bGwgY29tcG9uZW50LiBJdCBpcyB0aGUgY29tcG9uZW50IGNvbnNpc3Rpbmcgb2YgYWxsCiAgICAgIC8vIG5ld2x5IGNvbXBpbGVkIGxpYnJhcmllcyBhbmQgYWxsIGxpYnJhcmllcyBsb2FkZWQgZnJvbSAuZGlsbCBmaWxlcyBvcgogICAgICAvLyBkaXJlY3RseSBmcm9tIGNvbXBvbmVudHMuCiAgICAgIC8vIFRlY2huaWNhbGx5LCBpdCdzIHRoZSBjb21iaW5hdGlvbiBvZiB1c2VyQ29kZS5sb2FkZXIubGlicmFyaWVzIGFuZAogICAgICAvLyBkaWxsTG9hZGVkRGF0YS5sb2FkZXIubGlicmFyaWVzLgogICAgICBpZiAoIW91dGxpbmVPbmx5KSB7CiAgICAgICAgY29tcG9uZW50V2l0aERpbGwgPQogICAgICAgICAgICBhd2FpdCB1c2VyQ29kZS5idWlsZENvbXBvbmVudCh2ZXJpZnk6IGMub3B0aW9ucy52ZXJpZnkpOwogICAgICB9CiAgICAgIGhpZXJhcmNoeSA/Pz0gdXNlckNvZGUubG9hZGVyLmhpZXJhcmNoeTsKCiAgICAgIHJlY29yZE5vbkZ1bGxDb21wb25lbnRGb3JUZXN0aW5nKGNvbXBvbmVudFdpdGhEaWxsKTsKICAgICAgaWYgKHRyYWNrTmVlZGVkRGlsbExpYnJhcmllcykgewogICAgICAgIC8vIFdoaWNoIGRpbGwgYnVpbGRlcnMgd2VyZSBidWlsdD8KICAgICAgICBuZWVkZWREaWxsTGlicmFyaWVzID0gbmV3IFNldDxMaWJyYXJ5PigpOwogICAgICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgYnVpbGRlciBpbiBkaWxsTG9hZGVkRGF0YS5sb2FkZXIuYnVpbGRlcnMudmFsdWVzKSB7CiAgICAgICAgICBpZiAoYnVpbGRlciBpcyBEaWxsTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgICAgICAgaWYgKGJ1aWxkZXIuaXNCdWlsdEFuZE1hcmtlZCkgewogICAgICAgICAgICAgIG5lZWRlZERpbGxMaWJyYXJpZXMuYWRkKGJ1aWxkZXIubGlicmFyeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHVwZGF0ZU5lZWRlZERpbGxMaWJyYXJlc1dpdGhIaWVyYXJjaHkoCiAgICAgICAgICAgIGhpZXJhcmNoeSwgdXNlckNvZGUubG9hZGVyLmJ1aWxkZXJIaWVyYXJjaHkpOwogICAgICB9CgogICAgICBpZiAoY29tcG9uZW50V2l0aERpbGwgIT0gbnVsbCkgewogICAgICAgIHRoaXMuaW52YWxpZGF0ZWRVcmlzLmNsZWFyKCk7CiAgICAgICAgaGFzVG9DaGVja1BhY2thZ2VVcmlzID0gZmFsc2U7CiAgICAgICAgdXNlckNvZGVPbGQ/LmxvYWRlcj8ucmVsZWFzZUFuY2lsbGFyeVJlc291cmNlcygpOwogICAgICAgIHVzZXJDb2RlT2xkPy5sb2FkZXI/LmJ1aWxkZXJzPy5jbGVhcigpOwogICAgICAgIHVzZXJDb2RlT2xkID0gbnVsbDsKICAgICAgfQoKICAgICAgTGlzdDxMaWJyYXJ5PiBjb21waWxlZExpYnJhcmllcyA9CiAgICAgICAgICBuZXcgTGlzdDxMaWJyYXJ5Pi5mcm9tKHVzZXJDb2RlLmxvYWRlci5saWJyYXJpZXMpOwogICAgICBQcm9jZWR1cmUgbWFpbk1ldGhvZCA9IGNvbXBvbmVudFdpdGhEaWxsID09IG51bGwKICAgICAgICAgID8gZGF0YS51c2VyTG9hZGVkVXJpTWFpbgogICAgICAgICAgOiBjb21wb25lbnRXaXRoRGlsbC5tYWluTWV0aG9kOwoKICAgICAgTGlzdDxMaWJyYXJ5PiBvdXRwdXRMaWJyYXJpZXM7CiAgICAgIFNldDxMaWJyYXJ5PiBhbGxMaWJyYXJpZXM7CiAgICAgIE1hcDxVcmksIFNvdXJjZT4gdXJpVG9Tb3VyY2UgPSBjb21wb25lbnRXaXRoRGlsbD8udXJpVG9Tb3VyY2U7CiAgICAgIGlmIChkYXRhLmNvbXBvbmVudCAhPSBudWxsIHx8IGZ1bGxDb21wb25lbnQpIHsKICAgICAgICBvdXRwdXRMaWJyYXJpZXMgPSBjb21wdXRlVHJhbnNpdGl2ZUNsb3N1cmUoCiAgICAgICAgICAgIGNvbXBpbGVkTGlicmFyaWVzLAogICAgICAgICAgICBlbnRyeVBvaW50cywKICAgICAgICAgICAgcmV1c2VkTGlicmFyaWVzLAogICAgICAgICAgICBoaWVyYXJjaHksCiAgICAgICAgICAgIHVyaVRyYW5zbGF0b3IsCiAgICAgICAgICAgIHVyaVRvU291cmNlKTsKICAgICAgICBhbGxMaWJyYXJpZXMgPSBvdXRwdXRMaWJyYXJpZXMudG9TZXQoKTsKICAgICAgICBpZiAoIWMub3B0aW9ucy5vbWl0UGxhdGZvcm0pIHsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxhdGZvcm1CdWlsZGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBMaWJyYXJ5IGxpYiA9IHBsYXRmb3JtQnVpbGRlcnNbaV0udGFyZ2V0OwogICAgICAgICAgICBvdXRwdXRMaWJyYXJpZXMuYWRkKGxpYik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG91dHB1dExpYnJhcmllcyA9IG5ldyBMaXN0PExpYnJhcnk+KCk7CiAgICAgICAgYWxsTGlicmFyaWVzID0gY29tcHV0ZVRyYW5zaXRpdmVDbG9zdXJlKAogICAgICAgICAgICAgICAgY29tcGlsZWRMaWJyYXJpZXMsCiAgICAgICAgICAgICAgICBlbnRyeVBvaW50cywKICAgICAgICAgICAgICAgIHJldXNlZExpYnJhcmllcywKICAgICAgICAgICAgICAgIGhpZXJhcmNoeSwKICAgICAgICAgICAgICAgIHVyaVRyYW5zbGF0b3IsCiAgICAgICAgICAgICAgICB1cmlUb1NvdXJjZSwKICAgICAgICAgICAgICAgIG91dHB1dExpYnJhcmllcykKICAgICAgICAgICAgLnRvU2V0KCk7CiAgICAgIH0KCiAgICAgIExpc3Q8U3RyaW5nPiBwcm9ibGVtc0FzSnNvbiA9IHJlaXNzdWVDb21wb25lbnRQcm9ibGVtcyhjb21wb25lbnRXaXRoRGlsbCk7CiAgICAgIHJlaXNzdWVMaWJyYXJ5UHJvYmxlbXMoYWxsTGlicmFyaWVzLCBjb21waWxlZExpYnJhcmllcyk7CgogICAgICBpZiAoY29tcG9uZW50V2l0aERpbGwgPT0gbnVsbCkgewogICAgICAgIHVzZXJDb2RlLmxvYWRlci5idWlsZGVycy5jbGVhcigpOwogICAgICAgIHVzZXJDb2RlID0gdXNlckNvZGVPbGQ7CiAgICAgIH0KCiAgICAgIC8vIFRoaXMgaXMgdGhlIGluY3JlbWVudGFsIGNvbXBvbmVudC4KICAgICAgcmV0dXJuIGNvbnRleHQub3B0aW9ucy50YXJnZXQuY29uZmlndXJlQ29tcG9uZW50KAogICAgICAgICAgbmV3IENvbXBvbmVudChsaWJyYXJpZXM6IG91dHB1dExpYnJhcmllcywgdXJpVG9Tb3VyY2U6IHVyaVRvU291cmNlKSkKICAgICAgICAuLm1haW5NZXRob2QgPSBtYWluTWV0aG9kCiAgICAgICAgLi5wcm9ibGVtc0FzSnNvbiA9IHByb2JsZW1zQXNKc29uOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb3JlVHlwZXMgZ2V0Q29yZVR5cGVzKCkgPT4gdXNlckNvZGU/LmxvYWRlcj8uY29yZVR5cGVzOwoKICBAb3ZlcnJpZGUKICBDbGFzc0hpZXJhcmNoeSBnZXRDbGFzc0hpZXJhcmNoeSgpID0+IHVzZXJDb2RlPy5sb2FkZXI/LmhpZXJhcmNoeTsKCiAgLy8vIEFsbG93cyBmb3IgdXBkYXRpbmcgdGhlIGxpc3Qgb2YgbmVlZGVkIGxpYnJhcmllcy4KICAvLy8KICAvLy8gVXNlZnVsIGlmIGEgY2xhc3MgaGllcmFyY2h5IGhhcyBiZWVuIHVzZWQgZXh0ZXJuYWxseS4KICAvLy8gQ3VycmVudGx5IHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGNsYXNzIGhpZXJhcmNoaWVzIHdoaWNoIGlzIHVuZm9ydHVuYXRlLgogIC8vLyBGb3Igbm93IHRoaXMgbWV0aG9kIGFsbG93cyB0aGUgJ0NsYXNzSGllcmFyY2h5QnVpbGRlcicgdG8gYmUgbnVsbC4KICAvLy8KICAvLy8gVE9ETyhqZW5zaixDRkUgaW4gZ2VuZXJhbCk6IEV2ZW50dWFsbHkgd2Ugc2hvdWxkIGdldCB0byBhIHBvaW50IHdoZXJlIHdlCiAgLy8vIG9ubHkgaGF2ZSBvbmUgY2xhc3MgaGllcmFyY2h5LgogIC8vLyBUT0RPKGplbnNqKTogVGhpcyBjb3VsZCBwcm9iYWJseSBiZSBhIHV0aWxpdHkgbWV0aG9kIHNvbWV3aGVyZSBpbnN0ZWFkCiAgLy8vICh0aG91Z2ggaGFuZGxpbmcgb2YgdGhlIGNhc2Ugd2hlcmUgYWxsIGJldHMgYXJlIG9mZiBzaG91bGQgcHJvYmFibHkgc3RpbGwKICAvLy8gbGl2ZSBsb2NhbGx5KS4KICB2b2lkIHVwZGF0ZU5lZWRlZERpbGxMaWJyYXJlc1dpdGhIaWVyYXJjaHkoCiAgICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGJ1aWxkZXJIaWVyYXJjaHkpIHsKICAgIGlmIChoaWVyYXJjaHkgaXMgQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeSAmJiAhaGllcmFyY2h5LmFsbEJldHNPZmYpIHsKICAgICAgbmVlZGVkRGlsbExpYnJhcmllcyA/Pz0gbmV3IFNldDxMaWJyYXJ5PigpOwogICAgICBTZXQ8Q2xhc3M+IGNsYXNzZXMgPSBuZXcgU2V0PENsYXNzPigpOwogICAgICBMaXN0PENsYXNzPiB3b3JrbGlzdCA9IG5ldyBMaXN0PENsYXNzPigpOwogICAgICAvLyBHZXQgYWxsIGNsYXNzZXMgdG91Y2hlZCBieSBrZXJuZWwgY2xhc3MgaGllcmFyY2h5LgogICAgICBMaXN0PENsYXNzPiB1c2VkQ2xhc3NlcyA9IGhpZXJhcmNoeS5nZXRVc2VkQ2xhc3NlcygpOwogICAgICB3b3JrbGlzdC5hZGRBbGwodXNlZENsYXNzZXMpOwogICAgICBjbGFzc2VzLmFkZEFsbCh1c2VkQ2xhc3Nlcyk7CgogICAgICAvLyBHZXQgYWxsIGNsYXNzZXMgdG91Y2hlZCBieSBmYXN0YSBjbGFzcyBoaWVyYXJjaHkuCiAgICAgIGlmIChidWlsZGVySGllcmFyY2h5ICE9IG51bGwpIHsKICAgICAgICBmb3IgKENsYXNzIGMgaW4gYnVpbGRlckhpZXJhcmNoeS5ub2Rlcy5rZXlzKSB7CiAgICAgICAgICBpZiAoY2xhc3Nlcy5hZGQoYykpIHdvcmtsaXN0LmFkZChjKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEdldCBhbGwgc3VwZXJzIGV0Yy4KICAgICAgd2hpbGUgKHdvcmtsaXN0LmlzTm90RW1wdHkpIHsKICAgICAgICBDbGFzcyBjID0gd29ya2xpc3QucmVtb3ZlTGFzdCgpOwogICAgICAgIGZvciAoU3VwZXJ0eXBlIHN1cGVydHlwZSBpbiBjLmltcGxlbWVudGVkVHlwZXMpIHsKICAgICAgICAgIGlmIChjbGFzc2VzLmFkZChzdXBlcnR5cGUuY2xhc3NOb2RlKSkgewogICAgICAgICAgICB3b3JrbGlzdC5hZGQoc3VwZXJ0eXBlLmNsYXNzTm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjLm1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgICAgIGlmIChjbGFzc2VzLmFkZChjLm1peGVkSW5UeXBlLmNsYXNzTm9kZSkpIHsKICAgICAgICAgICAgd29ya2xpc3QuYWRkKGMubWl4ZWRJblR5cGUuY2xhc3NOb2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGMuc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgICAgIGlmIChjbGFzc2VzLmFkZChjLnN1cGVydHlwZS5jbGFzc05vZGUpKSB7CiAgICAgICAgICAgIHdvcmtsaXN0LmFkZChjLnN1cGVydHlwZS5jbGFzc05vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gQWRkIGFueSBsaWJyYXJpZXMgdGhhdCB3YXMgdXNlZCBvciB3YXMgaW4gdGhlICJwYXJlbnQtY2hhaW4iIG9mIGEKICAgICAgLy8gdXNlZCBjbGFzcy4KICAgICAgZm9yIChDbGFzcyBjIGluIGNsYXNzZXMpIHsKICAgICAgICBMaWJyYXJ5IGxpYnJhcnkgPSBjLmVuY2xvc2luZ0xpYnJhcnk7CiAgICAgICAgLy8gT25seSBhZGQgaWYgbG9hZGVkIGZyb20gYSBkaWxsIGZpbGUuCiAgICAgICAgaWYgKGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy5jb250YWluc0tleShsaWJyYXJ5LmltcG9ydFVyaSkpIHsKICAgICAgICAgIG5lZWRlZERpbGxMaWJyYXJpZXMuYWRkKGxpYnJhcnkpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gQ2Fubm90IHRyYWNrIGluIG90aGVyIGtlcm5lbCBjbGFzcyBoaWVyYXJjaGllcyBvcgogICAgICAvLyBpZiBhbGwgYmV0cyBhcmUgb2ZmOiBBZGQgZXZlcnl0aGluZy4KICAgICAgbmVlZGVkRGlsbExpYnJhcmllcyA9IG5ldyBTZXQ8TGlicmFyeT4oKTsKICAgICAgZm9yIChMaWJyYXJ5QnVpbGRlciBidWlsZGVyIGluIGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy52YWx1ZXMpIHsKICAgICAgICBpZiAoYnVpbGRlciBpcyBEaWxsTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgICAgIG5lZWRlZERpbGxMaWJyYXJpZXMuYWRkKGJ1aWxkZXIubGlicmFyeSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIHZvaWQgaW52YWxpZGF0ZU5vdEtlcHRVc2VyQnVpbGRlcnMoU2V0PFVyaT4gaW52YWxpZGF0ZWRVcmlzKSB7CiAgICBpZiAobW9kdWxlc1RvTG9hZCAhPSBudWxsICYmIHVzZXJCdWlsZGVycyAhPSBudWxsKSB7CiAgICAgIFNldDxMaWJyYXJ5PiBsb2FkZWROb3RLZXB0ID0gbmV3IFNldDxMaWJyYXJ5PigpOwogICAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgaW4gdXNlckJ1aWxkZXJzLnZhbHVlcykgewogICAgICAgIGxvYWRlZE5vdEtlcHQuYWRkKGJ1aWxkZXIudGFyZ2V0KTsKICAgICAgfQogICAgICBmb3IgKENvbXBvbmVudCBtb2R1bGUgaW4gbW9kdWxlc1RvTG9hZCkgewogICAgICAgIGxvYWRlZE5vdEtlcHQucmVtb3ZlQWxsKG1vZHVsZS5saWJyYXJpZXMpOwogICAgICB9CiAgICAgIGZvciAoTGlicmFyeSBsaWIgaW4gbG9hZGVkTm90S2VwdCkgewogICAgICAgIGludmFsaWRhdGVkVXJpcy5hZGQobGliLmltcG9ydFVyaSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgRnV0dXJlPHZvaWQ+IGxvYWRFbnN1cmVMb2FkZWRDb21wb25lbnRzKAogICAgICBMaXN0PExpYnJhcnlCdWlsZGVyPiByZXVzZWRMaWJyYXJpZXMpIGFzeW5jIHsKICAgIGlmIChtb2R1bGVzVG9Mb2FkICE9IG51bGwpIHsKICAgICAgYm9vbCBsb2FkZWRBbnl0aGluZyA9IGZhbHNlOwogICAgICBmb3IgKENvbXBvbmVudCBtb2R1bGUgaW4gbW9kdWxlc1RvTG9hZCkgewogICAgICAgIGJvb2wgdXNlZENvbXBvbmVudCA9IGZhbHNlOwogICAgICAgIGZvciAoTGlicmFyeSBsaWIgaW4gbW9kdWxlLmxpYnJhcmllcykgewogICAgICAgICAgaWYgKCFkaWxsTG9hZGVkRGF0YS5sb2FkZXIuYnVpbGRlcnMuY29udGFpbnNLZXkobGliLmltcG9ydFVyaSkpIHsKICAgICAgICAgICAgZGlsbExvYWRlZERhdGEubG9hZGVyLmxpYnJhcmllcy5hZGQobGliKTsKICAgICAgICAgICAgZGlsbExvYWRlZERhdGEuYWRkTGlicmFyeShsaWIpOwogICAgICAgICAgICByZXVzZWRMaWJyYXJpZXMuYWRkKGRpbGxMb2FkZWREYXRhLmxvYWRlci5yZWFkKGxpYi5pbXBvcnRVcmksIC0xKSk7CiAgICAgICAgICAgIHVzZWRDb21wb25lbnQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodXNlZENvbXBvbmVudCkgewogICAgICAgICAgZGlsbExvYWRlZERhdGEudXJpVG9Tb3VyY2UuYWRkQWxsKG1vZHVsZS51cmlUb1NvdXJjZSk7CiAgICAgICAgICBsb2FkZWRBbnl0aGluZyA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChsb2FkZWRBbnl0aGluZykgewogICAgICAgIGF3YWl0IGRpbGxMb2FkZWREYXRhLmJ1aWxkT3V0bGluZXMoKTsKICAgICAgICB1c2VyQnVpbGRlcnMgPSA8VXJpLCBMaWJyYXJ5QnVpbGRlcj57fTsKICAgICAgICBwbGF0Zm9ybUJ1aWxkZXJzID0gPExpYnJhcnlCdWlsZGVyPltdOwogICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy5mb3JFYWNoKCh1cmksIGJ1aWxkZXIpIHsKICAgICAgICAgIGlmIChidWlsZGVyLnVyaS5zY2hlbWUgPT0gImRhcnQiKSB7CiAgICAgICAgICAgIHBsYXRmb3JtQnVpbGRlcnMuYWRkKGJ1aWxkZXIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdXNlckJ1aWxkZXJzW3VyaV0gPSBidWlsZGVyOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmICh1c2VyQnVpbGRlcnMuaXNFbXB0eSkgewogICAgICAgICAgdXNlckJ1aWxkZXJzID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgbW9kdWxlc1RvTG9hZCA9IG51bGw7CiAgICB9CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIHZvaWQgcmVpc3N1ZUxpYnJhcnlQcm9ibGVtcygKICAgICAgU2V0PExpYnJhcnk+IGFsbExpYnJhcmllcywgTGlzdDxMaWJyYXJ5PiBjb21waWxlZExpYnJhcmllcykgewogICAgLy8gVGhlIG5ld2x5LWNvbXBpbGVkIGxpYnJhcmllcyBoYXZlIGlzc3VlZCBwcm9ibGVtcyBhbHJlYWR5LiBSZS1pc3N1ZQogICAgLy8gcHJvYmxlbXMgZm9yIHRoZSBsaWJyYXJpZXMgdGhhdCB3ZXJlbid0IHJlLWNvbXBpbGVkIChpZ25vcmUgY29tcGlsZQogICAgLy8gZXhwcmVzc2lvbiBwcm9ibGVtcykKICAgIGFsbExpYnJhcmllcy5yZW1vdmVBbGwoY29tcGlsZWRMaWJyYXJpZXMpOwogICAgZm9yIChMaWJyYXJ5IGxpYnJhcnkgaW4gYWxsTGlicmFyaWVzKSB7CiAgICAgIGlmIChsaWJyYXJ5LnByb2JsZW1zQXNKc29uPy5pc05vdEVtcHR5ID09IHRydWUpIHsKICAgICAgICBmb3IgKFN0cmluZyBqc29uU3RyaW5nIGluIGxpYnJhcnkucHJvYmxlbXNBc0pzb24pIHsKICAgICAgICAgIERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24gbWVzc2FnZSA9CiAgICAgICAgICAgICAgbmV3IERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24uZnJvbUpzb24oanNvblN0cmluZyk7CiAgICAgICAgICBpZiAobWVzc2FnZS51cmkgPT0gZGVidWdFeHByVXJpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY29udGV4dC5vcHRpb25zLnJlcG9ydERpYWdub3N0aWNNZXNzYWdlKG1lc3NhZ2UpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICAvLy8gUmUtaXNzdWUgcHJvYmxlbXMgb24gdGhlIGNvbXBvbmVudCBhbmQgcmV0dXJuIHRoZSBmaWx0ZXJlZCBsaXN0LgogIExpc3Q8U3RyaW5nPiByZWlzc3VlQ29tcG9uZW50UHJvYmxlbXMoQ29tcG9uZW50IGNvbXBvbmVudFdpdGhEaWxsKSB7CiAgICAvLyBUaGVzZSBwcm9ibGVtcyBoYXZlIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KICAgIFNldDxTdHJpbmc+IGlzc3VlZFByb2JsZW1zID0gbmV3IFNldDxTdHJpbmc+KCk7CiAgICBpZiAoY29tcG9uZW50V2l0aERpbGw/LnByb2JsZW1zQXNKc29uICE9IG51bGwpIHsKICAgICAgaXNzdWVkUHJvYmxlbXMuYWRkQWxsKGNvbXBvbmVudFdpdGhEaWxsLnByb2JsZW1zQXNKc29uKTsKICAgIH0KCiAgICAvLyBSZXBvcnQgb2xkIHByb2JsZW1zIHRoYXQgd2Fzbid0IHJlcG9ydGVkIGFnYWluLgogICAgZm9yIChMaXN0PERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24+IG1lc3NhZ2VzCiAgICAgICAgaW4gcmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXMudmFsdWVzKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uIG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTsKICAgICAgICBpZiAoaXNzdWVkUHJvYmxlbXMuYWRkKG1lc3NhZ2UudG9Kc29uU3RyaW5nKCkpKSB7CiAgICAgICAgICBjb250ZXh0Lm9wdGlvbnMucmVwb3J0RGlhZ25vc3RpY01lc3NhZ2UobWVzc2FnZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gU2F2ZSBhbnkgbmV3IGNvbXBvbmVudC1wcm9ibGVtcy4KICAgIGlmIChjb21wb25lbnRXaXRoRGlsbD8ucHJvYmxlbXNBc0pzb24gIT0gbnVsbCkgewogICAgICBmb3IgKFN0cmluZyBqc29uU3RyaW5nIGluIGNvbXBvbmVudFdpdGhEaWxsLnByb2JsZW1zQXNKc29uKSB7CiAgICAgICAgRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbiBtZXNzYWdlID0KICAgICAgICAgICAgbmV3IERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24uZnJvbUpzb24oanNvblN0cmluZyk7CiAgICAgICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uPiBtZXNzYWdlcyA9CiAgICAgICAgICAgIHJlbWFpbmluZ0NvbXBvbmVudFByb2JsZW1zW21lc3NhZ2UudXJpXSA/Pz0KICAgICAgICAgICAgICAgIG5ldyBMaXN0PERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24+KCk7CiAgICAgICAgbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IExpc3Q8U3RyaW5nPi5mcm9tKGlzc3VlZFByb2JsZW1zKTsKICB9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgVXJpIGdldFBhcnRGaWxlVXJpKAogICAgICBVcmkgcGFyZW50RmlsZVVyaSwgTGlicmFyeVBhcnQgcGFydCwgVXJpVHJhbnNsYXRvciB1cmlUcmFuc2xhdG9yKSB7CiAgICBVcmkgZmlsZVVyaSA9IHBhcmVudEZpbGVVcmkucmVzb2x2ZShwYXJ0LnBhcnRVcmkpOwogICAgaWYgKGZpbGVVcmkuc2NoZW1lID09ICJwYWNrYWdlIikgewogICAgICAvLyBQYXJ0IHdhcyBzcGVjaWZpZWQgdmlhIHBhY2thZ2UgVVJJIGFuZCB0aGUgcmVzb2x2ZSBhYm92ZSB0aHVzCiAgICAgIC8vIGRpZCBub3QgZ28gYXMgZXhwZWN0ZWQuIFRyYW5zbGF0ZSB0aGUgcGFja2FnZSBVUkkgdG8gZ2V0IHRoZQogICAgICAvLyBhY3R1YWwgZmlsZSBVUkkuCiAgICAgIGZpbGVVcmkgPSB1cmlUcmFuc2xhdG9yLnRyYW5zbGF0ZShmaWxlVXJpLCBmYWxzZSk7CiAgICB9CiAgICByZXR1cm4gZmlsZVVyaTsKICB9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgLy8vIENvbXB1dGUgdGhlIHRyYW5zaXRpdmUgY2xvc3VyZS4KICAvLy8KICAvLy8gQXMgYSBzaWRlLWVmZmVjdCwgdGhpcyBhbHNvIGNsZWFucy11cCBub3ctdW5yZWZlcmVuY2VkIGJ1aWxkZXJzIGFzIHdlbGwgYXMKICAvLy8gYW55IHNhdmVkIGNvbXBvbmVudCBwcm9ibGVtcyBmb3Igc3VjaCBidWlsZGVycy4KICBMaXN0PExpYnJhcnk+IGNvbXB1dGVUcmFuc2l0aXZlQ2xvc3VyZSgKICAgICAgTGlzdDxMaWJyYXJ5PiBpbnB1dExpYnJhcmllcywKICAgICAgTGlzdDxVcmk+IGVudHJpZXMsCiAgICAgIExpc3Q8TGlicmFyeUJ1aWxkZXI+IHJldXNlZExpYnJhcmllcywKICAgICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgICBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IsCiAgICAgIE1hcDxVcmksIFNvdXJjZT4gdXJpVG9Tb3VyY2UsCiAgICAgIFtMaXN0PExpYnJhcnk+IGlucHV0TGlicmFyaWVzRmlsdGVyZWRdKSB7CiAgICBMaXN0PExpYnJhcnk+IHJlc3VsdCA9IG5ldyBMaXN0PExpYnJhcnk+KCk7CiAgICBNYXA8VXJpLCBMaWJyYXJ5PiBsaWJyYXJ5TWFwID0gPFVyaSwgTGlicmFyeT57fTsKICAgIE1hcDxVcmksIExpYnJhcnk+IHBvdGVudGlhbGx5UmVmZXJlbmNlZExpYnJhcmllcyA9IDxVcmksIExpYnJhcnk+e307CiAgICBNYXA8VXJpLCBMaWJyYXJ5PiBwb3RlbnRpYWxseVJlZmVyZW5jZWRJbnB1dExpYnJhcmllcyA9IDxVcmksIExpYnJhcnk+e307CiAgICBmb3IgKExpYnJhcnkgbGlicmFyeSBpbiBpbnB1dExpYnJhcmllcykgewogICAgICBsaWJyYXJ5TWFwW2xpYnJhcnkuaW1wb3J0VXJpXSA9IGxpYnJhcnk7CiAgICAgIGlmIChsaWJyYXJ5LmltcG9ydFVyaS5zY2hlbWUgPT0gImRhcnQiKSB7CiAgICAgICAgcmVzdWx0LmFkZChsaWJyYXJ5KTsKICAgICAgICBpbnB1dExpYnJhcmllc0ZpbHRlcmVkPy5hZGQobGlicmFyeSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG90ZW50aWFsbHlSZWZlcmVuY2VkTGlicmFyaWVzW2xpYnJhcnkuaW1wb3J0VXJpXSA9IGxpYnJhcnk7CiAgICAgICAgcG90ZW50aWFsbHlSZWZlcmVuY2VkSW5wdXRMaWJyYXJpZXNbbGlicmFyeS5pbXBvcnRVcmldID0gbGlicmFyeTsKICAgICAgfQogICAgfQoKICAgIExpc3Q8VXJpPiB3b3JrbGlzdCA9IG5ldyBMaXN0PFVyaT4oKTsKICAgIHdvcmtsaXN0LmFkZEFsbChlbnRyaWVzKTsKICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSBpbiByZXVzZWRMaWJyYXJpZXMpIHsKICAgICAgaWYgKGxpYnJhcnkudXJpLnNjaGVtZSA9PSAiZGFydCIgJiYgIWxpYnJhcnkuaXNTeW50aGV0aWMpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBMaWJyYXJ5IGxpYiA9IGxpYnJhcnkudGFyZ2V0OwogICAgICBwb3RlbnRpYWxseVJlZmVyZW5jZWRMaWJyYXJpZXNbbGlicmFyeS51cmldID0gbGliOwogICAgICBsaWJyYXJ5TWFwW2xpYnJhcnkudXJpXSA9IGxpYjsKICAgIH0KCiAgICBMaWJyYXJ5R3JhcGggZ3JhcGggPSBuZXcgTGlicmFyeUdyYXBoKGxpYnJhcnlNYXApOwogICAgd2hpbGUgKHdvcmtsaXN0LmlzTm90RW1wdHkgJiYgcG90ZW50aWFsbHlSZWZlcmVuY2VkTGlicmFyaWVzLmlzTm90RW1wdHkpIHsKICAgICAgVXJpIHVyaSA9IHdvcmtsaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgaWYgKGxpYnJhcnlNYXAuY29udGFpbnNLZXkodXJpKSkgewogICAgICAgIGZvciAoVXJpIG5laWdoYm9yIGluIGdyYXBoLm5laWdoYm9yc09mKHVyaSkpIHsKICAgICAgICAgIHdvcmtsaXN0LmFkZChuZWlnaGJvcik7CiAgICAgICAgfQogICAgICAgIGxpYnJhcnlNYXAucmVtb3ZlKHVyaSk7CiAgICAgICAgTGlicmFyeSBsaWJyYXJ5ID0gcG90ZW50aWFsbHlSZWZlcmVuY2VkTGlicmFyaWVzLnJlbW92ZSh1cmkpOwogICAgICAgIGlmIChsaWJyYXJ5ICE9IG51bGwpIHsKICAgICAgICAgIHJlc3VsdC5hZGQobGlicmFyeSk7CiAgICAgICAgICBpZiAocG90ZW50aWFsbHlSZWZlcmVuY2VkSW5wdXRMaWJyYXJpZXMucmVtb3ZlKHVyaSkgIT0gbnVsbCkgewogICAgICAgICAgICBpbnB1dExpYnJhcmllc0ZpbHRlcmVkPy5hZGQobGlicmFyeSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgTGlzdDxMaWJyYXJ5PiByZW1vdmVkTGlicmFyaWVzID0gbmV3IExpc3Q8TGlicmFyeT4oKTsKICAgIGZvciAoVXJpIHVyaSBpbiBwb3RlbnRpYWxseVJlZmVyZW5jZWRMaWJyYXJpZXMua2V5cykgewogICAgICBpZiAodXJpLnNjaGVtZSA9PSAicGFja2FnZSIpIGNvbnRpbnVlOwogICAgICBMaWJyYXJ5QnVpbGRlciBidWlsZGVyID0gdXNlckNvZGUubG9hZGVyLmJ1aWxkZXJzLnJlbW92ZSh1cmkpOwogICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7CiAgICAgICAgTGlicmFyeSBsaWIgPSBidWlsZGVyLnRhcmdldDsKICAgICAgICByZW1vdmVkTGlicmFyaWVzLmFkZChsaWIpOwogICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy5yZW1vdmUodXJpKTsKICAgICAgICBDb21waWxlckNvbnRleHQuY3VycmVudC51cmlUb1NvdXJjZS5yZW1vdmUodXJpKTsKICAgICAgICB1cmlUb1NvdXJjZS5yZW1vdmUodXJpKTsKICAgICAgICB1c2VyQnVpbGRlcnM/LnJlbW92ZSh1cmkpOwogICAgICAgIHJlbW92ZUxpYnJhcnlGcm9tUmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXMobGliLCB1cmlUcmFuc2xhdG9yKTsKICAgICAgfQogICAgfQogICAgaGllcmFyY2h5Py5hcHBseVRyZWVDaGFuZ2VzKHJlbW92ZWRMaWJyYXJpZXMsIGNvbnN0IFtdKTsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICB2b2lkIHJlbW92ZUxpYnJhcnlGcm9tUmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXMoCiAgICAgIExpYnJhcnkgbGliLCBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IpIHsKICAgIHJlbWFpbmluZ0NvbXBvbmVudFByb2JsZW1zLnJlbW92ZShsaWIuZmlsZVVyaSk7CiAgICAvLyBSZW1vdmUgcGFydHMgdG9vLgogICAgZm9yIChMaWJyYXJ5UGFydCBwYXJ0IGluIGxpYi5wYXJ0cykgewogICAgICBVcmkgcGFydEZpbGVVcmkgPSBnZXRQYXJ0RmlsZVVyaShsaWIuZmlsZVVyaSwgcGFydCwgdXJpVHJhbnNsYXRvcik7CiAgICAgIHJlbWFpbmluZ0NvbXBvbmVudFByb2JsZW1zLnJlbW92ZShwYXJ0RmlsZVVyaSk7CiAgICB9CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIGludCBwcmVwYXJlU3VtbWFyeShMaXN0PGludD4gc3VtbWFyeUJ5dGVzLCBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IsCiAgICAgIENvbXBpbGVyQ29udGV4dCBjLCBJbmNyZW1lbnRhbENvbXBpbGVyRGF0YSBkYXRhKSB7CiAgICBkaWxsTG9hZGVkRGF0YSA9IG5ldyBEaWxsVGFyZ2V0KHRpY2tlciwgdXJpVHJhbnNsYXRvciwgYy5vcHRpb25zLnRhcmdldCk7CiAgICBpbnQgYnl0ZXNMZW5ndGggPSAwOwoKICAgIGlmIChzdW1tYXJ5Qnl0ZXMgIT0gbnVsbCkgewogICAgICB0aWNrZXIubG9nTXMoIlJlYWQgJHtjLm9wdGlvbnMuc2RrU3VtbWFyeX0iKTsKICAgICAgZGF0YS5jb21wb25lbnQgPSBjLm9wdGlvbnMudGFyZ2V0LmNvbmZpZ3VyZUNvbXBvbmVudChuZXcgQ29tcG9uZW50KCkpOwogICAgICBuZXcgQmluYXJ5QnVpbGRlcihzdW1tYXJ5Qnl0ZXMsIGRpc2FibGVMYXp5UmVhZGluZzogZmFsc2UpCiAgICAgICAgICAucmVhZENvbXBvbmVudChkYXRhLmNvbXBvbmVudCk7CiAgICAgIHRpY2tlci5sb2dNcygiRGVzZXJpYWxpemVkICR7Yy5vcHRpb25zLnNka1N1bW1hcnl9Iik7CiAgICAgIGJ5dGVzTGVuZ3RoICs9IHN1bW1hcnlCeXRlcy5sZW5ndGg7CiAgICB9CgogICAgcmV0dXJuIGJ5dGVzTGVuZ3RoOwogIH0KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICAvLyBUaGlzIHByb2NlZHVyZSB3aWxsIHRyeSB0byBsb2FkIHRoZSBkaWxsIGZpbGUgYW5kIHdpbGwgY3Jhc2ggaWYgaXQgY2Fubm90LgogIEZ1dHVyZTxpbnQ+IGluaXRpYWxpemVGcm9tRGlsbChVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IsIENvbXBpbGVyQ29udGV4dCBjLAogICAgICBJbmNyZW1lbnRhbENvbXBpbGVyRGF0YSBkYXRhKSBhc3luYyB7CiAgICBpbnQgYnl0ZXNMZW5ndGggPSAwOwogICAgRmlsZVN5c3RlbUVudGl0eSBlbnRpdHkgPQogICAgICAgIGMub3B0aW9ucy5maWxlU3lzdGVtLmVudGl0eUZvclVyaShpbml0aWFsaXplRnJvbURpbGxVcmkpOwogICAgaWYgKGF3YWl0IGVudGl0eS5leGlzdHMoKSkgewogICAgICBMaXN0PGludD4gaW5pdGlhbGl6YXRpb25CeXRlcyA9IGF3YWl0IGVudGl0eS5yZWFkQXNCeXRlcygpOwogICAgICBpZiAoaW5pdGlhbGl6YXRpb25CeXRlcyAhPSBudWxsICYmIGluaXRpYWxpemF0aW9uQnl0ZXMuaXNOb3RFbXB0eSkgewogICAgICAgIHRpY2tlci5sb2dNcygiUmVhZCAkaW5pdGlhbGl6ZUZyb21EaWxsVXJpIik7CiAgICAgICAgZGF0YS5pbml0aWFsaXphdGlvbkJ5dGVzID0gaW5pdGlhbGl6YXRpb25CeXRlczsKCiAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gb3V0cHV0IGFsbCB3ZSByZWFkIGhlcmUgc28gbGF6eSBsb2FkaW5nIGl0CiAgICAgICAgLy8gZG9lc24ndCBtYWtlIHNlbnNlLgogICAgICAgIG5ldyBCaW5hcnlCdWlsZGVyKGluaXRpYWxpemF0aW9uQnl0ZXMsIGRpc2FibGVMYXp5UmVhZGluZzogdHJ1ZSkKICAgICAgICAgICAgLnJlYWRDb21wb25lbnQoZGF0YS5jb21wb25lbnQsIGNoZWNrQ2Fub25pY2FsTmFtZXM6IHRydWUpOwoKICAgICAgICAvLyBDaGVjayB0aGUgYW55IHBhY2thZ2UtdXJscyBzdGlsbCBwb2ludCB0byB0aGUgc2FtZSBmaWxlCiAgICAgICAgLy8gKGUuZy4gdGhlIHBhY2thZ2Ugc3RpbGwgZXhpc3RzIGFuZCBoYXNuJ3QgYmVlbiB1cGRhdGVkKS4KICAgICAgICBmb3IgKExpYnJhcnkgbGliIGluIGRhdGEuY29tcG9uZW50LmxpYnJhcmllcykgewogICAgICAgICAgaWYgKGxpYi5pbXBvcnRVcmkuc2NoZW1lID09ICJwYWNrYWdlIiAmJgogICAgICAgICAgICAgIHVyaVRyYW5zbGF0b3IudHJhbnNsYXRlKGxpYi5pbXBvcnRVcmksIGZhbHNlKSAhPSBsaWIuZmlsZVVyaSkgewogICAgICAgICAgICAvLyBQYWNrYWdlIGhhcyBiZWVuIHJlbW92ZWQgb3IgdXBkYXRlZC4KICAgICAgICAgICAgLy8gVGhpcyBsaWJyYXJ5IHNob3VsZCBiZSB0aHJvd24gYXdheS4KICAgICAgICAgICAgLy8gRXZlcnl0aGluZyB0aGF0IGRlcGVuZHMgb24gaXQgc2hvdWxkIGJlIHRocm93biBhd2F5LgogICAgICAgICAgICAvLyBUT0RPKGplbnNqKTogQW55dGhpbmcgdGhhdCBkb2Vzbid0IGRlcGVuZCBvbiBpdCBjYW4gYmUga2VwdC4KICAgICAgICAgICAgLy8gRm9yIG5vdyBqdXN0IGRvbid0IGluaXRpYWxpemUgZnJvbSB0aGlzIGRpbGwuCiAgICAgICAgICAgIHRocm93IGNvbnN0IFBhY2thZ2VDaGFuZ2VkRXJyb3IoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGluaXRpYWxpemVkRnJvbURpbGwgPSB0cnVlOwogICAgICAgIGJ5dGVzTGVuZ3RoICs9IGluaXRpYWxpemF0aW9uQnl0ZXMubGVuZ3RoOwogICAgICAgIGRhdGEudXNlckxvYWRlZFVyaU1haW4gPSBkYXRhLmNvbXBvbmVudC5tYWluTWV0aG9kOwogICAgICAgIHNhdmVDb21wb25lbnRQcm9ibGVtcyhkYXRhKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ5dGVzTGVuZ3RoOwogIH0KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICB2b2lkIHNhdmVDb21wb25lbnRQcm9ibGVtcyhJbmNyZW1lbnRhbENvbXBpbGVyRGF0YSBkYXRhKSB7CiAgICBpZiAoZGF0YS5jb21wb25lbnQucHJvYmxlbXNBc0pzb24gIT0gbnVsbCkgewogICAgICBmb3IgKFN0cmluZyBqc29uU3RyaW5nIGluIGRhdGEuY29tcG9uZW50LnByb2JsZW1zQXNKc29uKSB7CiAgICAgICAgRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbiBtZXNzYWdlID0KICAgICAgICAgICAgbmV3IERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24uZnJvbUpzb24oanNvblN0cmluZyk7CiAgICAgICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uPiBtZXNzYWdlcyA9CiAgICAgICAgICAgIHJlbWFpbmluZ0NvbXBvbmVudFByb2JsZW1zW21lc3NhZ2UudXJpXSA/Pz0KICAgICAgICAgICAgICAgIG5ldyBMaXN0PERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24+KCk7CiAgICAgICAgbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIC8vIFRoaXMgcHJvY2VkdXJlIHdpbGwgc2V0IHVwIGNvbXBpbGVyIGZyb20gW2NvbXBvbmVudFRvSW5pdGlhbGl6ZUZyb21dLgogIHZvaWQgaW5pdGlhbGl6ZUZyb21Db21wb25lbnQoVXJpVHJhbnNsYXRvciB1cmlUcmFuc2xhdG9yLCBDb21waWxlckNvbnRleHQgYywKICAgICAgSW5jcmVtZW50YWxDb21waWxlckRhdGEgZGF0YSkgewogICAgdGlja2VyLmxvZ01zKCJBYm91dCB0byBpbml0aWFsaXplRnJvbUNvbXBvbmVudCIpOwoKICAgIGRpbGxMb2FkZWREYXRhID0gbmV3IERpbGxUYXJnZXQodGlja2VyLCB1cmlUcmFuc2xhdG9yLCBjLm9wdGlvbnMudGFyZ2V0KTsKICAgIGRhdGEuY29tcG9uZW50ID0gbmV3IENvbXBvbmVudCgKICAgICAgICBsaWJyYXJpZXM6IGNvbXBvbmVudFRvSW5pdGlhbGl6ZUZyb20ubGlicmFyaWVzLAogICAgICAgIHVyaVRvU291cmNlOiBjb21wb25lbnRUb0luaXRpYWxpemVGcm9tLnVyaVRvU291cmNlKQogICAgICAuLm1haW5NZXRob2QgPSBjb21wb25lbnRUb0luaXRpYWxpemVGcm9tLm1haW5NZXRob2Q7CiAgICBkYXRhLnVzZXJMb2FkZWRVcmlNYWluID0gY29tcG9uZW50VG9Jbml0aWFsaXplRnJvbS5tYWluTWV0aG9kOwogICAgc2F2ZUNvbXBvbmVudFByb2JsZW1zKGRhdGEpOwoKICAgIGJvb2wgZm91bmREYXJ0Q29yZSA9IGZhbHNlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmNvbXBvbmVudC5saWJyYXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgTGlicmFyeSBsaWJyYXJ5ID0gZGF0YS5jb21wb25lbnQubGlicmFyaWVzW2ldOwogICAgICBpZiAobGlicmFyeS5pbXBvcnRVcmkuc2NoZW1lID09ICJkYXJ0IiAmJgogICAgICAgICAgbGlicmFyeS5pbXBvcnRVcmkucGF0aCA9PSAiY29yZSIpIHsKICAgICAgICBmb3VuZERhcnRDb3JlID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIGlmICghZm91bmREYXJ0Q29yZSkgewogICAgICB0aHJvdyBjb25zdCBJbml0aWFsaXplRnJvbUNvbXBvbmVudEVycm9yKCJEaWQgbm90IGZpbmQgZGFydDpjb3JlIHdoZW4gIgogICAgICAgICAgInRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBjb21wb25lbnQuIik7CiAgICB9CgogICAgdGlja2VyLmxvZ01zKCJSYW4gaW5pdGlhbGl6ZUZyb21Db21wb25lbnQiKTsKICB9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgdm9pZCBhcHBlbmRMaWJyYXJpZXMoSW5jcmVtZW50YWxDb21waWxlckRhdGEgZGF0YSwgaW50IGJ5dGVzTGVuZ3RoKSB7CiAgICBpZiAoZGF0YS5jb21wb25lbnQgIT0gbnVsbCkgewogICAgICBkaWxsTG9hZGVkRGF0YS5sb2FkZXIKICAgICAgICAgIC5hcHBlbmRMaWJyYXJpZXMoZGF0YS5jb21wb25lbnQsIGJ5dGVDb3VudDogYnl0ZXNMZW5ndGgpOwogICAgfQogICAgdGlja2VyLmxvZ01zKCJBcHBlbmRlZCBsaWJyYXJpZXMiKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxQcm9jZWR1cmU+IGNvbXBpbGVFeHByZXNzaW9uKAogICAgICBTdHJpbmcgZXhwcmVzc2lvbiwKICAgICAgTWFwPFN0cmluZywgRGFydFR5cGU+IGRlZmluaXRpb25zLAogICAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVEZWZpbml0aW9ucywKICAgICAgU3RyaW5nIHN5bnRoZXRpY1Byb2NlZHVyZU5hbWUsCiAgICAgIFVyaSBsaWJyYXJ5VXJpLAogICAgICBbU3RyaW5nIGNsYXNzTmFtZSwKICAgICAgYm9vbCBpc1N0YXRpYyA9IGZhbHNlXSkgYXN5bmMgewogICAgYXNzZXJ0KGRpbGxMb2FkZWREYXRhICE9IG51bGwgJiYgdXNlckNvZGUgIT0gbnVsbCk7CgogICAgcmV0dXJuIGF3YWl0IGNvbnRleHQucnVuSW5Db250ZXh0KChfKSBhc3luYyB7CiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPQogICAgICAgICAgdXNlckNvZGUubG9hZGVyLnJlYWQobGlicmFyeVVyaSwgLTEsIGFjY2Vzc29yOiB1c2VyQ29kZS5sb2FkZXIuZmlyc3QpOwoKICAgICAgQ2xhc3Mga2VybmVsQ2xhc3M7CiAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkgewogICAgICAgIGtlcm5lbENsYXNzID0gbGlicmFyeS5zY29wZUJ1aWxkZXJbY2xhc3NOYW1lXT8udGFyZ2V0OwogICAgICAgIGlmIChrZXJuZWxDbGFzcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgdXNlckNvZGUubG9hZGVyLnNlZW5NZXNzYWdlcy5jbGVhcigpOwoKICAgICAgZm9yIChUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbSBpbiB0eXBlRGVmaW5pdGlvbnMpIHsKICAgICAgICBpZiAoIWlzTGVnYWxJZGVudGlmaWVyKHR5cGVQYXJhbS5uYW1lKSkgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZm9yIChTdHJpbmcgbmFtZSBpbiBkZWZpbml0aW9ucy5rZXlzKSB7CiAgICAgICAgaWYgKCFpc0xlZ2FsSWRlbnRpZmllcihuYW1lKSkgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyIGRlYnVnTGlicmFyeSA9IG5ldyBLZXJuZWxMaWJyYXJ5QnVpbGRlcigKICAgICAgICBsaWJyYXJ5VXJpLAogICAgICAgIGRlYnVnRXhwclVyaSwKICAgICAgICB1c2VyQ29kZS5sb2FkZXIsCiAgICAgICAgbnVsbCwKICAgICAgICBzY29wZTogbGlicmFyeS5zY29wZS5jcmVhdGVOZXN0ZWRTY29wZSgiZXhwcmVzc2lvbiIpLAogICAgICAgIG5hbWVPcmlnaW46IGxpYnJhcnkudGFyZ2V0LAogICAgICApOwoKICAgICAgaWYgKGxpYnJhcnkgaXMgRGlsbExpYnJhcnlCdWlsZGVyKSB7CiAgICAgICAgZm9yIChMaWJyYXJ5RGVwZW5kZW5jeSBkZXBlbmRlbmN5IGluIGxpYnJhcnkudGFyZ2V0LmRlcGVuZGVuY2llcykgewogICAgICAgICAgaWYgKCFkZXBlbmRlbmN5LmlzSW1wb3J0KSBjb250aW51ZTsKCiAgICAgICAgICBMaXN0PENvbWJpbmF0b3I+IGNvbWJpbmF0b3JzOwoKICAgICAgICAgIGZvciAoa2VybmVsLkNvbWJpbmF0b3IgY29tYmluYXRvciBpbiBkZXBlbmRlbmN5LmNvbWJpbmF0b3JzKSB7CiAgICAgICAgICAgIGNvbWJpbmF0b3JzID8/PSA8Q29tYmluYXRvcj5bXTsKCiAgICAgICAgICAgIGNvbWJpbmF0b3JzLmFkZChjb21iaW5hdG9yLmlzU2hvdwogICAgICAgICAgICAgICAgPyBuZXcgQ29tYmluYXRvci5zaG93KAogICAgICAgICAgICAgICAgICAgIGNvbWJpbmF0b3IubmFtZXMsIGNvbWJpbmF0b3IuZmlsZU9mZnNldCwgbGlicmFyeS5maWxlVXJpKQogICAgICAgICAgICAgICAgOiBuZXcgQ29tYmluYXRvci5oaWRlKAogICAgICAgICAgICAgICAgICAgIGNvbWJpbmF0b3IubmFtZXMsIGNvbWJpbmF0b3IuZmlsZU9mZnNldCwgbGlicmFyeS5maWxlVXJpKSk7CiAgICAgICAgICB9CgogICAgICAgICAgZGVidWdMaWJyYXJ5LmFkZEltcG9ydCgKICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgIGRlcGVuZGVuY3kuaW1wb3J0ZWRMaWJyYXJ5UmVmZXJlbmNlLmNhbm9uaWNhbE5hbWUubmFtZSwKICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgIGRlcGVuZGVuY3kubmFtZSwKICAgICAgICAgICAgICBjb21iaW5hdG9ycywKICAgICAgICAgICAgICBkZXBlbmRlbmN5LmlzRGVmZXJyZWQsCiAgICAgICAgICAgICAgLTEsCiAgICAgICAgICAgICAgLTEsCiAgICAgICAgICAgICAgLTEsCiAgICAgICAgICAgICAgLTEpOwogICAgICAgIH0KCiAgICAgICAgZGVidWdMaWJyYXJ5LmFkZEltcG9ydHNUb1Njb3BlKCk7CiAgICAgIH0KCiAgICAgIEh5YnJpZEZpbGVTeXN0ZW0gaGZzID0gdXNlckNvZGUuZmlsZVN5c3RlbTsKICAgICAgTWVtb3J5RmlsZVN5c3RlbSBmcyA9IGhmcy5tZW1vcnk7CiAgICAgIGZzLmVudGl0eUZvclVyaShkZWJ1Z0V4cHJVcmkpLndyaXRlQXNTdHJpbmdTeW5jKGV4cHJlc3Npb24pOwoKICAgICAgRnVuY3Rpb25Ob2RlIHBhcmFtZXRlcnMgPSBuZXcgRnVuY3Rpb25Ob2RlKG51bGwsCiAgICAgICAgICB0eXBlUGFyYW1ldGVyczogdHlwZURlZmluaXRpb25zLAogICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IGRlZmluaXRpb25zLmtleXMKICAgICAgICAgICAgICAubWFwKChuYW1lKSA9PiBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50KG5hbWUsIDApKQogICAgICAgICAgICAgIC50b0xpc3QoKSk7CgogICAgICBkZWJ1Z0xpYnJhcnkuYnVpbGQodXNlckNvZGUubG9hZGVyLmNvcmVMaWJyYXJ5LCBtb2RpZnlUYXJnZXQ6IGZhbHNlKTsKICAgICAgRXhwcmVzc2lvbiBjb21waWxlZEV4cHJlc3Npb24gPSBhd2FpdCB1c2VyQ29kZS5sb2FkZXIuYnVpbGRFeHByZXNzaW9uKAogICAgICAgICAgZGVidWdMaWJyYXJ5LCBjbGFzc05hbWUsIGNsYXNzTmFtZSAhPSBudWxsICYmICFpc1N0YXRpYywgcGFyYW1ldGVycyk7CgogICAgICBQcm9jZWR1cmUgcHJvY2VkdXJlID0gbmV3IFByb2NlZHVyZSgKICAgICAgICAgIG5ldyBOYW1lKHN5bnRoZXRpY1Byb2NlZHVyZU5hbWUpLCBQcm9jZWR1cmVLaW5kLk1ldGhvZCwgcGFyYW1ldGVycywKICAgICAgICAgIGlzU3RhdGljOiBpc1N0YXRpYyk7CgogICAgICBwYXJhbWV0ZXJzLmJvZHkgPSBuZXcgUmV0dXJuU3RhdGVtZW50KGNvbXBpbGVkRXhwcmVzc2lvbikKICAgICAgICAuLnBhcmVudCA9IHBhcmFtZXRlcnM7CgogICAgICBwcm9jZWR1cmUuZmlsZVVyaSA9IGRlYnVnTGlicmFyeS5maWxlVXJpOwogICAgICBwcm9jZWR1cmUucGFyZW50ID0gY2xhc3NOYW1lICE9IG51bGwgPyBrZXJuZWxDbGFzcyA6IGxpYnJhcnkudGFyZ2V0OwoKICAgICAgdXNlckNvZGUudXJpVG9Tb3VyY2UucmVtb3ZlKGRlYnVnRXhwclVyaSk7CiAgICAgIHVzZXJDb2RlLmxvYWRlci5zb3VyY2VCeXRlcy5yZW1vdmUoZGVidWdFeHByVXJpKTsKCiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgbGlicmFyeSBoYXMgYSBjYW5vbmljYWwgbmFtZS4KICAgICAgQ29tcG9uZW50IGMgPSBuZXcgQ29tcG9uZW50KGxpYnJhcmllczogW2RlYnVnTGlicmFyeS50YXJnZXRdKTsKICAgICAgYy5jb21wdXRlQ2Fub25pY2FsTmFtZXMoKTsKCiAgICAgIHVzZXJDb2RlLnJ1blByb2NlZHVyZVRyYW5zZm9ybWF0aW9ucyhwcm9jZWR1cmUpOwoKICAgICAgcmV0dXJuIHByb2NlZHVyZTsKICAgIH0pOwogIH0KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICBMaXN0PExpYnJhcnlCdWlsZGVyPiBjb21wdXRlUmV1c2VkTGlicmFyaWVzKAogICAgICBTZXQ8VXJpPiBpbnZhbGlkYXRlZFVyaXMsIFVyaVRyYW5zbGF0b3IgdXJpVHJhbnNsYXRvciwKICAgICAge1NldDxMaWJyYXJ5QnVpbGRlcj4gbm90UmV1c2VkfSkgewogICAgTGlzdDxMaWJyYXJ5QnVpbGRlcj4gcmVzdWx0ID0gPExpYnJhcnlCdWlsZGVyPltdOwogICAgcmVzdWx0LmFkZEFsbChwbGF0Zm9ybUJ1aWxkZXJzKTsKICAgIGlmICh1c2VyQ29kZSA9PSBudWxsICYmIHVzZXJCdWlsZGVycyA9PSBudWxsKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLy8gTWFwcyBhbGwgbm9uLXBsYXRmb3JtIExpYnJhcnlCdWlsZGVycyBmcm9tIHRoZWlyIGltcG9ydCBVUkkuCiAgICBNYXA8VXJpLCBMaWJyYXJ5QnVpbGRlcj4gYnVpbGRlcnMgPSA8VXJpLCBMaWJyYXJ5QnVpbGRlcj57fTsKCiAgICAvLyBJbnZhbGlkYXRlZCBVUklzIHRyYW5zbGF0ZWQgYmFjayB0byB0aGVpciBpbXBvcnQgVVJJIChwYWNrYWdlOiwgZGFydDosCiAgICAvLyBldGMuKS4KICAgIExpc3Q8VXJpPiBpbnZhbGlkYXRlZEltcG9ydFVyaXMgPSA8VXJpPltdOwoKICAgIGJvb2wgaXNJbnZhbGlkYXRlZChVcmkgaW1wb3J0VXJpLCBVcmkgZmlsZVVyaSkgewogICAgICBpZiAoaW52YWxpZGF0ZWRVcmlzLmNvbnRhaW5zKGltcG9ydFVyaSkpIHJldHVybiB0cnVlOwogICAgICBpZiAoaW1wb3J0VXJpICE9IGZpbGVVcmkgJiYgaW52YWxpZGF0ZWRVcmlzLmNvbnRhaW5zKGZpbGVVcmkpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKGhhc1RvQ2hlY2tQYWNrYWdlVXJpcyAmJiBpbXBvcnRVcmkuc2NoZW1lID09ICJwYWNrYWdlIikgewogICAgICAgIC8vIEdldCBwYWNrYWdlIG5hbWUsIGNoZWNrIGlmIHRoZSBiYXNlIFVSSSBoYXMgY2hhbmdlZCBmb3IgdGhlIHBhY2thZ2UsCiAgICAgICAgLy8gaWYgaXQgaGFzLCB0cmFuc2xhdGUgdGhlIFVSSSBhZ2FpbiwKICAgICAgICAvLyBvdGhlcndpc2UgdGhlIFVSSSBjYW5ub3QgaGF2ZSBjaGFuZ2VkLgogICAgICAgIFN0cmluZyBwYXRoID0gaW1wb3J0VXJpLnBhdGg7CiAgICAgICAgaW50IGZpcnN0U2xhc2ggPSBwYXRoLmluZGV4T2YoJy8nKTsKICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBwYXRoLnN1YnN0cmluZygwLCBmaXJzdFNsYXNoKTsKICAgICAgICBpZiAocHJldmlvdXNQYWNrYWdlc01hcCA9PSBudWxsIHx8CiAgICAgICAgICAgIChwcmV2aW91c1BhY2thZ2VzTWFwW3BhY2thZ2VOYW1lXSAhPQogICAgICAgICAgICAgICAgY3VycmVudFBhY2thZ2VzTWFwW3BhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgIFVyaSBuZXdGaWxlVXJpID0gdXJpVHJhbnNsYXRvci50cmFuc2xhdGUoaW1wb3J0VXJpLCBmYWxzZSk7CiAgICAgICAgICBpZiAobmV3RmlsZVVyaSAhPSBmaWxlVXJpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoYnVpbGRlcnNbaW1wb3J0VXJpXT8uaXNTeW50aGV0aWMgPz8gZmFsc2UpIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgYWRkQnVpbGRlckFuZEludmFsaWRhdGVVcmlzKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKHVyaS5zY2hlbWUgPT0gImRhcnQiICYmICFsaWJyYXJ5LmlzU3ludGhldGljKSB7CiAgICAgICAgcmVzdWx0LmFkZChsaWJyYXJ5KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYnVpbGRlcnNbdXJpXSA9IGxpYnJhcnk7CiAgICAgIGlmIChpc0ludmFsaWRhdGVkKHVyaSwgbGlicmFyeS50YXJnZXQuZmlsZVVyaSkpIHsKICAgICAgICBpbnZhbGlkYXRlZEltcG9ydFVyaXMuYWRkKHVyaSk7CiAgICAgIH0KICAgICAgaWYgKGxpYnJhcnkgaXMgU291cmNlTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgICBmb3IgKExpYnJhcnlCdWlsZGVyIHBhcnQgaW4gbGlicmFyeS5wYXJ0cykgewogICAgICAgICAgaWYgKGlzSW52YWxpZGF0ZWQocGFydC51cmksIHBhcnQuZmlsZVVyaSkpIHsKICAgICAgICAgICAgaW52YWxpZGF0ZWRJbXBvcnRVcmlzLmFkZChwYXJ0LnVyaSk7CiAgICAgICAgICAgIGJ1aWxkZXJzW3BhcnQudXJpXSA9IHBhcnQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGxpYnJhcnkgaXMgRGlsbExpYnJhcnlCdWlsZGVyKSB7CiAgICAgICAgZm9yIChMaWJyYXJ5UGFydCBwYXJ0IGluIGxpYnJhcnkudGFyZ2V0LnBhcnRzKSB7CiAgICAgICAgICBVcmkgcGFydFVyaSA9IGxpYnJhcnkudXJpLnJlc29sdmUocGFydC5wYXJ0VXJpKTsKICAgICAgICAgIFVyaSBmaWxlVXJpID0KICAgICAgICAgICAgICBnZXRQYXJ0RmlsZVVyaShsaWJyYXJ5LmxpYnJhcnkuZmlsZVVyaSwgcGFydCwgdXJpVHJhbnNsYXRvcik7CgogICAgICAgICAgaWYgKGlzSW52YWxpZGF0ZWQocGFydFVyaSwgZmlsZVVyaSkpIHsKICAgICAgICAgICAgaW52YWxpZGF0ZWRJbXBvcnRVcmlzLmFkZChwYXJ0VXJpKTsKICAgICAgICAgICAgYnVpbGRlcnNbcGFydFVyaV0gPSBsaWJyYXJ5OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmICh1c2VyQ29kZSAhPSBudWxsKSB7CiAgICAgIC8vIHVzZXJDb2RlIGFscmVhZHkgY29udGFpbnMgdGhlIGJ1aWxkZXJzIGZyb20gdXNlckJ1aWxkZXJzLgogICAgICB1c2VyQ29kZS5sb2FkZXIuYnVpbGRlcnMuZm9yRWFjaChhZGRCdWlsZGVyQW5kSW52YWxpZGF0ZVVyaXMpOwogICAgfSBlbHNlIHsKICAgICAgLy8gdXNlckNvZGUgd2FzIG51bGwgc28gd2UgZXhwbGljaXRseSBoYXZlIHRvIGFkZCB0aGUgYnVpbGRlcnMgZnJvbQogICAgICAvLyB1c2VyQnVpbGRlcnMgKHdoaWNoIGNhbm5vdCBiZSBudWxsIGFzIHdlIGNoZWNrZWQgaW5pdGlhbGx5IHRoYXQgb25lIG9mCiAgICAgIC8vIHRoZW0gd2FzIG5vbi1udWxsKS4KICAgICAgdXNlckJ1aWxkZXJzLmZvckVhY2goYWRkQnVpbGRlckFuZEludmFsaWRhdGVVcmlzKTsKICAgIH0KCiAgICByZWNvcmRJbnZhbGlkYXRlZEltcG9ydFVyaXNGb3JUZXN0aW5nKGludmFsaWRhdGVkSW1wb3J0VXJpcyk7CgogICAgQnVpbGRlckdyYXBoIGdyYXBoID0gbmV3IEJ1aWxkZXJHcmFwaChidWlsZGVycyk7CgogICAgLy8gQ29tcHV0ZSBkaXJlY3QgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGltcG9ydCBVUkkgKHRoZSByZXZlcnNlIG9mIHRoZQogICAgLy8gZWRnZXMgcmV0dXJuZWQgYnkgYGdyYXBoLm5laWdoYm9yc09mYCkuCiAgICBNYXA8VXJpLCBTZXQ8VXJpPj4gZGlyZWN0RGVwZW5kZW5jaWVzID0gPFVyaSwgU2V0PFVyaT4+e307CiAgICBmb3IgKFVyaSB2ZXJ0ZXggaW4gZ3JhcGgudmVydGljZXMpIHsKICAgICAgZm9yIChVcmkgbmVpZ2hib3IgaW4gZ3JhcGgubmVpZ2hib3JzT2YodmVydGV4KSkgewogICAgICAgIChkaXJlY3REZXBlbmRlbmNpZXNbbmVpZ2hib3JdID8/PSBuZXcgU2V0PFVyaT4oKSkuYWRkKHZlcnRleCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBSZW1vdmUgYWxsIGRlcGVuZGVuY2llcyBvZiBbaW52YWxpZGF0ZWRJbXBvcnRVcmlzXSBmcm9tIGJ1aWxkZXJzLgogICAgTGlzdDxVcmk+IHdvcmtMaXN0ID0gaW52YWxpZGF0ZWRJbXBvcnRVcmlzOwogICAgd2hpbGUgKHdvcmtMaXN0LmlzTm90RW1wdHkpIHsKICAgICAgVXJpIHJlbW92ZWQgPSB3b3JrTGlzdC5yZW1vdmVMYXN0KCk7CiAgICAgIExpYnJhcnlCdWlsZGVyIGN1cnJlbnQgPSBidWlsZGVycy5yZW1vdmUocmVtb3ZlZCk7CiAgICAgIC8vIFtjdXJyZW50XSBpcyBudWxsIGlmIHRoZSBjb3JyZXNwb25kaW5nIGtleSAoVVJJKSBoYXMgYWxyZWFkeSBiZWVuCiAgICAgIC8vIHJlbW92ZWQuCiAgICAgIGlmIChjdXJyZW50ICE9IG51bGwpIHsKICAgICAgICBTZXQ8VXJpPiBzID0gZGlyZWN0RGVwZW5kZW5jaWVzW2N1cnJlbnQudXJpXTsKICAgICAgICBpZiAoY3VycmVudC51cmkgIT0gcmVtb3ZlZCkgewogICAgICAgICAgaWYgKHMgPT0gbnVsbCkgewogICAgICAgICAgICBzID0gZGlyZWN0RGVwZW5kZW5jaWVzW3JlbW92ZWRdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcy5hZGRBbGwoZGlyZWN0RGVwZW5kZW5jaWVzW3JlbW92ZWRdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHMgIT0gbnVsbCkgewogICAgICAgICAgLy8gW3NdIGlzIG51bGwgZm9yIGxlYXZlcy4KICAgICAgICAgIGZvciAoVXJpIGRlcGVuZGVuY3kgaW4gcykgewogICAgICAgICAgICB3b3JrTGlzdC5hZGQoZGVwZW5kZW5jeSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5vdFJldXNlZD8uYWRkKGN1cnJlbnQpOwogICAgICB9CiAgICB9CgogICAgLy8gQnVpbGRlcnMgY29udGFpbiBtYXBwaW5ncyBmcm9tIHBhcnQgdXJpIHRvIGJ1aWxkZXIsIG1lYW5pbmcgdGhlIHNhbWUKICAgIC8vIGJ1aWxkZXIgY2FuIGV4aXN0IG11bHRpcGxlIHRpbWVzIGluIHRoZSB2YWx1ZXMgbGlzdC4KICAgIFNldDxVcmk+IHNlZW5VcmlzID0gbmV3IFNldDxVcmk+KCk7CiAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgaW4gYnVpbGRlcnMudmFsdWVzKSB7CiAgICAgIGlmIChidWlsZGVyLmlzUGFydCkgY29udGludWU7CiAgICAgIC8vIFRPRE8oamVuc2ovYWhlKTogVGhpcyBsaW5lIGNhbiBwcm9iYWJseSBnbyBhd2F5IG9uY2UKICAgICAgLy8gaHR0cHM6Ly9kYXJ0LXJldmlldy5nb29nbGVzb3VyY2UuY29tLzQ3NDQyIGxhbmRzLgogICAgICBpZiAoYnVpbGRlci5pc1BhdGNoKSBjb250aW51ZTsKICAgICAgaWYgKCFzZWVuVXJpcy5hZGQoYnVpbGRlci51cmkpKSBjb250aW51ZTsKICAgICAgcmVzdWx0LmFkZChidWlsZGVyKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGludmFsaWRhdGUoVXJpIHVyaSkgewogICAgaW52YWxpZGF0ZWRVcmlzLmFkZCh1cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBpbnZhbGlkYXRlQWxsU291cmNlcygpIHsKICAgIGlmICh1c2VyQ29kZSAhPSBudWxsKSB7CiAgICAgIFNldDxVcmk+IHVyaXMgPSBuZXcgU2V0PFVyaT4uZnJvbSh1c2VyQ29kZS5sb2FkZXIuYnVpbGRlcnMua2V5cyk7CiAgICAgIHVyaXMucmVtb3ZlQWxsKGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy5rZXlzKTsKICAgICAgaW52YWxpZGF0ZWRVcmlzLmFkZEFsbCh1cmlzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgc2V0TW9kdWxlc1RvTG9hZE9uTmV4dENvbXB1dGVEZWx0YShMaXN0PENvbXBvbmVudD4gY29tcG9uZW50cykgewogICAgbW9kdWxlc1RvTG9hZCA9IGNvbXBvbmVudHMudG9MaXN0KCk7CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIHZvaWQgcmVjb3JkTm9uRnVsbENvbXBvbmVudEZvclRlc3RpbmcoQ29tcG9uZW50IGNvbXBvbmVudCkge30KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICB2b2lkIHJlY29yZEludmFsaWRhdGVkSW1wb3J0VXJpc0ZvclRlc3RpbmcoTGlzdDxVcmk+IHVyaXMpIHt9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgdm9pZCByZWNvcmRUZW1wb3JhcnlGaWxlRm9yVGVzdGluZyhVcmkgdXJpKSB7fQp9CgpjbGFzcyBQYWNrYWdlQ2hhbmdlZEVycm9yIHsKICBjb25zdCBQYWNrYWdlQ2hhbmdlZEVycm9yKCk7Cn0KCmNsYXNzIEluaXRpYWxpemVGcm9tQ29tcG9uZW50RXJyb3IgewogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwoKICBjb25zdCBJbml0aWFsaXplRnJvbUNvbXBvbmVudEVycm9yKHRoaXMubWVzc2FnZSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+IG1lc3NhZ2U7Cn0KCmNsYXNzIEluY3JlbWVudGFsQ29tcGlsZXJEYXRhIHsKICBQcm9jZWR1cmUgdXNlckxvYWRlZFVyaU1haW4gPSBudWxsOwogIENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwogIExpc3Q8aW50PiBpbml0aWFsaXphdGlvbkJ5dGVzID0gbnVsbDsKfQqEXQBOTjwBJAEhAUgBNAkXHB8jAS00ATgBJAkPExIUFhEbFQ4TFxkQExIXAT8BQgE8OAFJATMBLwEqATUBQQEwAT8BGgkjNDoyOAE4AUABRwFJATYBLwElAUcBIgExAUIhARcBGikkAS0BHSkpIy0kGygnJkk3IQEiUQEZASU+GikmMQEkNikqMQEMIkIULEdEASBHOBxJHAhEJEYwOyoBJB0xSTI7EUpOLxJPHk8+HEgBNC4wLRcnODJJRBIvPkNLMUlMKEgZPD5QPCAhLUcqTihIEhAODAosAS4wL0AuKxMpDAw3CCcBPwE2AT5KRSoqASg7RQElQCMmLQoBQzUoSwoIASExUD8KCAEjKTo3GUUoOzJBTDkMCkYoOQgBHz49KCUKQAghAR5CQQgBOQErIyAkRR0RGhotASY6UC8uDAoBNiEKCAE4OUoxCggBOitBTQhEAU9PI0wqGhxFCC8BOyYrMlAvLDgODAoBLzoIAScmJzowHAgBKD03IyoBJSFFNTQfGR0XGxowJz42JgwKDy8xIx0hGx8dIRYIAVE/AScqIAgBLDhPIisIBAEMOwEMRQE4BjxQSQZPJU1QFS5KSzItMDw8JCMBOyY3LwoIAR0kKToyLwwKJTYzDAojNDEMCggBSxUhLjBNLAoIDTsuME4tNAoIBgQBF0E5NzwrCDAzCCssCAYEARcrNCEjMCQwTDYsUCIMCh1BIQoIHC4wL0AuKxMpDAwkHwoIHAYEARcfREtLHC8sODwuQi0WDDwKCAYEARdHRzI0NT8GATcyMDI5OjwKCAYBKDVELEAzODcfCAYyBAEXFko3J0dGGjkGFAQBFyYGUTYqJBksICMkMDA1SU4uLzAdLg9FSggGASoeNkISCCQ5JQYBN08nKTciCiBGHx9JMgwKCAYBOjstRR0mIzQ5ISNJCAY9ARMEARc0MjQZKko2BgQBF0o5ThkBIDRNQSo8KgYBGAQBF1BRLBkeQiFCSzU4AUUfSUcBQ0Q4M040M0RMPS8MCgEkMzwlCAYYBAEXPTFBLEAzODcfCAYEARdLTyY2AU4kODw7QyEBIEA1MC4eDwgGARpOMgYBMQQBF0giHEQGKAQBDCcZKSslFhkmOAEyH1EBGR8/LggBLAE5PQguMwgBRBQWGQ4+JAkBK0wuASgBSSwBLidOJ1AMASIURhQfGyUSEhITCgEqCAEyKEMBNysxRxoBTE1QAStOHwFAHwEwSwExOAE1RSEBNwEYCAQBFy89KTYlNBUGAURBAU4OLwE1PEcVCERQLzImLDwrMTRGJxkMCghCFAYBQzodEAgfOCgILTU3MScMCjI5OxhMATEwKQwKCAYBHENFDUpQHTkGAUIBNQFLLz8pOEcIBgFJMCIrOUsSHTYmGy0TMwwKGSUmJgwKIQgGAUw8KDYkPjslMBsGEwQBDB0eBAEMIBxIOyQGBAEMSCkEARdAARdAARcxAgEcHwIBJRgBNAEgAgEgJh4oAgE1cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2luY3JlbWVudGFsX2NvbXBpbGVyLmRhcnQxc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvb2xkX3RvX25ld19hcGkuZGFydIz2Ly8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgbmV3IGNvbXBpbGVyIEFQSSBpbiAnLi4vY29tcGlsZXJfbmV3LmRhcnQnIHRocm91Z2ggdGhlCi8vLyBvbGQgY29tcGlsZXIgQVBJIGluICcuLi9jb21waWxlci5kYXJ0Jy4KCmxpYnJhcnkgY29tcGlsZXIuYXBpLmxlZ2FjeTsKCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBFdmVudFNpbmssIEZ1dHVyZTsKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgdXRmODsKCmltcG9ydCAnLi4vY29tcGlsZXIuZGFydCc7CmltcG9ydCAnLi4vY29tcGlsZXJfbmV3LmRhcnQnOwppbXBvcnQgJ2lvL3NvdXJjZV9maWxlLmRhcnQnOwppbXBvcnQgJ251bGxfY29tcGlsZXJfb3V0cHV0LmRhcnQnIHNob3cgTnVsbFNpbms7CgovLy8gSW1wbGVtZW50YXRpb24gb2YgW0NvbXBpbGVySW5wdXRdIHVzaW5nIGEgW0NvbXBpbGVySW5wdXRQcm92aWRlcl0uCmNsYXNzIExlZ2FjeUNvbXBpbGVySW5wdXQgaW1wbGVtZW50cyBDb21waWxlcklucHV0IHsKICBmaW5hbCBDb21waWxlcklucHV0UHJvdmlkZXIgX2lucHV0UHJvdmlkZXI7CgogIExlZ2FjeUNvbXBpbGVySW5wdXQodGhpcy5faW5wdXRQcm92aWRlcik7CgogIEBvdmVycmlkZQogIEZ1dHVyZTxJbnB1dD4gcmVhZEZyb21VcmkoVXJpIHVyaSwge0lucHV0S2luZCBpbnB1dEtpbmQ6IElucHV0S2luZC5VVEY4fSkgewogICAgLy8gVGhlIHN3aXRjaCBoYW5kbGVzIGFsbCBlbnVtIHZhbHVlcywgYnV0IG5vdCBudWxsLgogICAgLy8gaWdub3JlOiBtaXNzaW5nX3JldHVybgogICAgcmV0dXJuIF9pbnB1dFByb3ZpZGVyKHVyaSkudGhlbigoLypTdHJpbmd8TGlzdDxpbnQ+Ki8gZGF0YSkgewogICAgICBzd2l0Y2ggKGlucHV0S2luZCkgewogICAgICAgIGNhc2UgSW5wdXRLaW5kLlVURjg6CiAgICAgICAgICBTb3VyY2VGaWxlIHNvdXJjZUZpbGU7CiAgICAgICAgICBpZiAoZGF0YSBpcyBMaXN0PGludD4pIHsKICAgICAgICAgICAgc291cmNlRmlsZSA9IG5ldyBVdGY4Qnl0ZXNTb3VyY2VGaWxlKHVyaSwgZGF0YSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaXMgU3RyaW5nKSB7CiAgICAgICAgICAgIHNvdXJjZUZpbGUgPSBuZXcgU3RyaW5nU291cmNlRmlsZS5mcm9tVXJpKHVyaSwgZGF0YSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiRXhwZWN0ZWQgYSAnU3RyaW5nJyBvciBhICdMaXN0PGludD4nIGZyb20gdGhlIGlucHV0ICIKICAgICAgICAgICAgICAgICJwcm92aWRlciwgYnV0IGdvdDogJHtFcnJvci5zYWZlVG9TdHJpbmcoZGF0YSl9LiI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc291cmNlRmlsZTsKICAgICAgICBjYXNlIElucHV0S2luZC5iaW5hcnk6CiAgICAgICAgICBpZiAoZGF0YSBpcyBTdHJpbmcpIHsKICAgICAgICAgICAgZGF0YSA9IHV0ZjguZW5jb2RlKGRhdGEpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnkodXJpLCBkYXRhKTsKICAgICAgfQogICAgfSk7CiAgfQp9CgovLy8gSW1wbGVtZW50YXRpb24gb2YgW0NvbXBpbGVyRGlhZ25vc3RpY3NdIHVzaW5nIGEgW0RpYWdub3N0aWNIYW5kbGVyXS4KY2xhc3MgTGVnYWN5Q29tcGlsZXJEaWFnbm9zdGljcyBpbXBsZW1lbnRzIENvbXBpbGVyRGlhZ25vc3RpY3MgewogIGZpbmFsIERpYWdub3N0aWNIYW5kbGVyIF9oYW5kbGVyOwoKICBMZWdhY3lDb21waWxlckRpYWdub3N0aWNzKHRoaXMuX2hhbmRsZXIpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlcG9ydCgKICAgICAgdmFyIGNvZGUsIFVyaSB1cmksIGludCBiZWdpbiwgaW50IGVuZCwgU3RyaW5nIG1lc3NhZ2UsIERpYWdub3N0aWMga2luZCkgewogICAgX2hhbmRsZXIodXJpLCBiZWdpbiwgZW5kLCBtZXNzYWdlLCBraW5kKTsKICB9Cn0KCi8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbQ29tcGlsZXJPdXRwdXRdIHVzaW5nIGFuIG9wdGlvbmFsCi8vLyBbQ29tcGlsZXJPdXRwdXRQcm92aWRlcl0uCi8vIFRPRE8oam9obm5pd2ludGhlcik6IENoYW5nZSBQdWIgdG8gdXNlIHRoZSBuZXcgaW50ZXJmYWNlIGFuZCByZW1vdmUgdGhpcy4KY2xhc3MgTGVnYWN5Q29tcGlsZXJPdXRwdXQgaW1wbGVtZW50cyBDb21waWxlck91dHB1dCB7CiAgZmluYWwgQ29tcGlsZXJPdXRwdXRQcm92aWRlciBfb3V0cHV0UHJvdmlkZXI7CgogIExlZ2FjeUNvbXBpbGVyT3V0cHV0KFt0aGlzLl9vdXRwdXRQcm92aWRlcl0pOwoKICBAb3ZlcnJpZGUKICBPdXRwdXRTaW5rIGNyZWF0ZU91dHB1dFNpbmsoU3RyaW5nIG5hbWUsIFN0cmluZyBleHRlbnNpb24sIE91dHB1dFR5cGUgdHlwZSkgewogICAgaWYgKF9vdXRwdXRQcm92aWRlciAhPSBudWxsKSB7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgT3V0cHV0VHlwZS5kdW1wSW5mbzoKICAgICAgICBjYXNlIE91dHB1dFR5cGUuZGVmZXJyZWRNYXA6CiAgICAgICAgICBpZiAoZXh0ZW5zaW9uID09ICcnKSB7CiAgICAgICAgICAgIC8vIE5lZWRlZCB0byBtYWtlIFB1YiBnZW5lcmF0ZSB0aGUgc2FtZSBvdXRwdXQgbmFtZS4KICAgICAgICAgICAgZXh0ZW5zaW9uID0gJ2RlZmVycmVkX21hcCc7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICB9CiAgICAgIHJldHVybiBuZXcgTGVnYWN5T3V0cHV0U2luayhfb3V0cHV0UHJvdmlkZXIobmFtZSwgZXh0ZW5zaW9uKSk7CiAgICB9CiAgICByZXR1cm4gTnVsbFNpbmsub3V0cHV0UHJvdmlkZXIobmFtZSwgZXh0ZW5zaW9uLCB0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIEJpbmFyeU91dHB1dFNpbmsgY3JlYXRlQmluYXJ5U2luayhVcmkgdXJpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiTGVnYWN5Q29tcGlsZXJPdXRwdXQuY3JlYXRlQmluYXJ5U2luayIpOwogIH0KfQoKY2xhc3MgTGVnYWN5T3V0cHV0U2luayBpbXBsZW1lbnRzIE91dHB1dFNpbmsgewogIGZpbmFsIEV2ZW50U2luazxTdHJpbmc+IHNpbms7CgogIExlZ2FjeU91dHB1dFNpbmsodGhpcy5zaW5rKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGQoU3RyaW5nIGV2ZW50KSA9PiBzaW5rLmFkZChldmVudCk7CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSA9PiBzaW5rLmNsb3NlKCk7Cn0KbABOTjwBUSwBHQEsIQEbHx4yAUc1LgEsAQxOOR5CGx0hIz0nQhNJQwwdHyAmDCgICAQCAUlBJAEsAQwPUC4EAgE5Hk03MAEwAQxQIxYiJSFBKAwREQhFBjsEAQwvSQQCAS8gAR8BDC0BDCACAShwYWNrYWdlOmNvbXBpbGVyL3NyYy9vbGRfdG9fbmV3X2FwaS5kYXJ0L3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbW1vbi90YXNrcy5kYXJ0pdsvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmNvbW1vbi50YXNrczsKCmltcG9ydCAnZGFydDphc3luYycKICAgIHNob3cgRnV0dXJlLCBab25lLCBab25lRGVsZWdhdGUsIFpvbmVTcGVjaWZpY2F0aW9uLCBydW5ab25lZDsKCi8vLyBVc2VkIHRvIG1lYXN1cmUgd2hlcmUgdGltZSBpcyBzcGVudCBpbiB0aGUgY29tcGlsZXIuCi8vLwovLy8gVGhpcyBleHBvc2VzIFttZWFzdXJlXSBhbmQgW21lYXN1cmVJb10sIHdoaWNoIHdyYXAgYW4gYWN0aW9uIGFuZCBhc3NvY2lhdGUKLy8vIHRoZSB0aW1lIHNwZW50IGR1cmluZyB0aGF0IGFjdGlvbiB3aXRoIHRoaXMgdGFzay4gTmVzdGVkIG1lYXN1cmVtZW50c2NjYW4gYmUKLy8vIGludHJvZHVjZWQgYnkgdXNpbmcgW21lYXN1cmVTdWJ0YXNrXS4KLy8gVE9ETyhzaWdtdW5kKTogcmVuYW1lIHRvIE1lYXN1cmFibGVUYXNrCmFic3RyYWN0IGNsYXNzIENvbXBpbGVyVGFzayB7CiAgZmluYWwgTWVhc3VyZXIgX21lYXN1cmVyOwogIGZpbmFsIFN0b3B3YXRjaCBfd2F0Y2g7CiAgZmluYWwgTWFwPFN0cmluZywgR2VuZXJpY1Rhc2s+IF9zdWJ0YXNrcyA9IDxTdHJpbmcsIEdlbmVyaWNUYXNrPnt9OwoKICBpbnQgX2FzeW5jQ291bnQgPSAwOwoKICAvLyBFYWNoIHRhc2sgaGFzIGEgZml4ZWQsIGxhemlseSBjb21wdXRlZCwgWm9uZVNwZWNpZmljYXRpb24gYW5kIHpvbmVWYWx1ZXMKICAvLyBmb3IgW19tZWFzdXJlWm9uZWRdLgogIFpvbmVTcGVjaWZpY2F0aW9uIF96b25lU3BlY2lmaWNhdGlvbjsKICBNYXAgX3pvbmVWYWx1ZXM7CgogIENvbXBpbGVyVGFzayh0aGlzLl9tZWFzdXJlcikKICAgICAgOiBfd2F0Y2ggPSBfbWVhc3VyZXIuZW5hYmxlVGFza01lYXN1cmVtZW50cyA/IG5ldyBTdG9wd2F0Y2goKSA6IG51bGw7CgogIC8vLyBXaGV0aGVyIG1lYXN1cmVtZW50IGlzIGRpc2FibGVkLiBUaGUgZnVuY3Rpb25zIFttZWFzdXJlXSBhbmQgW21lYXN1cmVJb10KICAvLy8gb25seSBtZWFzdXJlIHRpbWUgaWYgbWVhc3VyZW1lbnRzIGFyZSBlbmFibGVkLgogIGJvb2wgZ2V0IF9pc0Rpc2FibGVkID0+IF93YXRjaCA9PSBudWxsOwoKICAvLy8gTmFtZSB0byB1c2UgZm9yIHJlcG9ydGluZyB0aW1pbmcgaW5mb3JtYXRpb24uCiAgLy8vCiAgLy8vIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgd2l0aCBhIHByb3BlciBuYW1lLCBvdGhlcndpc2Ugd2UgdXNlIHRoZQogIC8vLyBydW50aW1lIHR5cGUgb2YgdGhlIHRhc2suCiAgU3RyaW5nIGdldCBuYW1lID0+ICJVbmtub3duIHRhc2sgJyR7dGhpcy5ydW50aW1lVHlwZX0nIjsKCiAgYm9vbCBnZXQgaXNSdW5uaW5nID0+IF93YXRjaD8uaXNSdW5uaW5nID09IHRydWU7CgogIGludCBnZXQgdGltaW5nIHsKICAgIGlmIChfaXNEaXNhYmxlZCkgcmV0dXJuIDA7CiAgICBpbnQgdG90YWwgPSBfd2F0Y2guZWxhcHNlZE1pbGxpc2Vjb25kczsKICAgIGZvciAoR2VuZXJpY1Rhc2sgc3VidGFzayBpbiBfc3VidGFza3MudmFsdWVzKSB7CiAgICAgIHRvdGFsICs9IHN1YnRhc2sudGltaW5nOwogICAgfQogICAgcmV0dXJuIHRvdGFsOwogIH0KCiAgRHVyYXRpb24gZ2V0IGR1cmF0aW9uIHsKICAgIGlmIChfaXNEaXNhYmxlZCkgcmV0dXJuIER1cmF0aW9uLnplcm87CiAgICBEdXJhdGlvbiB0b3RhbCA9IF93YXRjaC5lbGFwc2VkOwogICAgZm9yIChHZW5lcmljVGFzayBzdWJ0YXNrIGluIF9zdWJ0YXNrcy52YWx1ZXMpIHsKICAgICAgdG90YWwgKz0gc3VidGFzay5kdXJhdGlvbjsKICAgIH0KICAgIHJldHVybiB0b3RhbDsKICB9CgogIC8vLyBQZXJmb3JtIFthY3Rpb25dIGFuZCBtZWFzdXJlIGl0cyBydW50aW1lIChpbmNsdWRpbmcgYW55IGFzeW5jaHJvbm91cwogIC8vLyBjYWxsYmFja3MsIHN1Y2ggYXMsIFtGdXR1cmUudGhlbl0sIGJ1dCBleGNsdWRpbmcgY29kZSBtZWFzdXJlZCBieSBvdGhlcgogIC8vLyB0YXNrcykuCiAgVCBtZWFzdXJlPFQ+KFQgYWN0aW9uKCkpID0+IF9pc0Rpc2FibGVkID8gYWN0aW9uKCkgOiBfbWVhc3VyZVpvbmVkKGFjdGlvbik7CgogIC8vLyBIZWxwZXIgbWV0aG9kIHRoYXQgc3RhcnRzIG1lYXN1cmluZyB3aXRoIHRoaXMgW0NvbXBpbGVyVGFza10sIHRoYXQgaXMsCiAgLy8vIG1ha2UgdGhpcyB0YXNrIHRoZSBjdXJyZW50bHkgbWVhc3VyZWQgdGFzay4KICBDb21waWxlclRhc2sgX3N0YXJ0KCkgewogICAgaWYgKF9pc0Rpc2FibGVkKSByZXR1cm4gbnVsbDsKICAgIENvbXBpbGVyVGFzayBwcmV2aW91cyA9IF9tZWFzdXJlci5fY3VycmVudFRhc2s7CiAgICBfbWVhc3VyZXIuX2N1cnJlbnRUYXNrID0gdGhpczsKICAgIGlmIChwcmV2aW91cyAhPSBudWxsKSBwcmV2aW91cy5fd2F0Y2guc3RvcCgpOwogICAgLy8gUmVnYXJkbGVzcyBvZiB3aGV0aGVyIFtwcmV2aW91c10gaXMgYG51bGxgIHdlJ3ZlIHJldHVybmVkIGZyb20gdGhlCiAgICAvLyBldmVudGxvb3AuCiAgICBfbWVhc3VyZXIuc3RvcEFzeW5jV2FsbENsb2NrKCk7CiAgICBfd2F0Y2guc3RhcnQoKTsKICAgIHJldHVybiBwcmV2aW91czsKICB9CgogIC8vLyBIZWxwZXIgbWV0aG9kIHRoYXQgc3RvcHMgbWVhc3VyaW5nIHdpdGggdGhpcyBbQ29tcGlsZXJUYXNrXSwgdGhhdCBpcywKICAvLy8gbWFrZSBbcHJldmlvdXNdIHRoZSBjdXJyZW50bHkgbWVhc3VyZWQgdGFzay4KICB2b2lkIF9zdG9wKENvbXBpbGVyVGFzayBwcmV2aW91cykgewogICAgaWYgKF9pc0Rpc2FibGVkKSByZXR1cm47CiAgICBfd2F0Y2guc3RvcCgpOwogICAgaWYgKHByZXZpb3VzICE9IG51bGwpIHsKICAgICAgcHJldmlvdXMuX3dhdGNoLnN0YXJ0KCk7CiAgICB9IGVsc2UgewogICAgICAvLyBJZiB0aGVyZSdzIG5vIHByZXZpb3VzIHRhc2ssIHdlJ3JlIGFib3V0IHRvIHJldHVybiBjb250cm9sIHRvIHRoZQogICAgICAvLyBldmVudCBsb29wLiBTdGFydCBjb3VudGluZyB0aGF0IGFzIHdhaXRpbmcgYXN5bmNocm9ub3VzIEkvTy4KICAgICAgX21lYXN1cmVyLnN0YXJ0QXN5bmNXYWxsQ2xvY2soKTsKICAgIH0KICAgIF9tZWFzdXJlci5fY3VycmVudFRhc2sgPSBwcmV2aW91czsKICB9CgogIFQgX21lYXN1cmVab25lZDxUPihUIGFjdGlvbigpKSB7CiAgICAvLyBVc2luZyB6b25lcywgd2UncmUgYWJsZSB0byB0cmFjayBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBjb3JyZWN0bHksIGFzCiAgICAvLyBvdXIgem9uZSB3aWxsIGJlIGFza2VkIHRvIGludm9rZSBgdGhlbmAgYmxvY2tzLiBUaGVuIGJsb2NrcyAodGhlIGNsb3N1cmUKICAgIC8vIHBhc3NlZCB0byBydW5ab25lZCwgYW5kIG90aGVyIGNsb3N1cmVzKSBhcmUgcnVuIHZpYSB0aGUgYHJ1bmAgZnVuY3Rpb25zCiAgICAvLyBiZWxvdy4KCiAgICBhc3NlcnQoX3dhdGNoICE9IG51bGwpOwoKICAgIC8vIFRoZSBjdXJyZW50IHpvbmUgaXMgYWxyZWFkeSBtZWFzdXJpbmcgYHRoaXNgIHRhc2suCiAgICBpZiAoWm9uZS5jdXJyZW50W19tZWFzdXJlcl0gPT0gdGhpcykgcmV0dXJuIGFjdGlvbigpOwoKICAgIHJldHVybiBydW5ab25lZChhY3Rpb24sCiAgICAgICAgem9uZVZhbHVlczogX3pvbmVWYWx1ZXMgPz89IHtfbWVhc3VyZXI6IHRoaXN9LAogICAgICAgIHpvbmVTcGVjaWZpY2F0aW9uOiBfem9uZVNwZWNpZmljYXRpb24gPz89IG5ldyBab25lU3BlY2lmaWNhdGlvbigKICAgICAgICAgICAgcnVuOiBfcnVuLCBydW5VbmFyeTogX3J1blVuYXJ5LCBydW5CaW5hcnk6IF9ydW5CaW5hcnkpKTsKICB9CgogIC8vLyBSdW4gW2ZdIGluIFt6b25lXS4gUnVubmluZyBtdXN0IGJlIGRlbGVnYXRlZCB0byBbcGFyZW50XSB0byBlbnN1cmUgdGhhdAogIC8vLyB2YXJpb3VzIHN0YXRlIGlzIHNldCB1cCBjb3JyZWN0bHkgKGluIHBhcnRpY3VsYXIgdGhhdCBgWm9uZS5jdXJyZW50YAogIC8vLyBoYXMgdGhlIHJpZ2h0IHZhbHVlKS4gU2luY2UgW19tZWFzdXJlWm9uZWRdIGNhbiBiZSBjYWxsZWQgcmVjdXJzaXZlbHkKICAvLy8gKHN5bmNocm9ub3VzbHkpLCBzb21lIG9mIHRoZSBtZWFzdXJpbmcgem9uZXMgd2UgY3JlYXRlIHdpbGwgYmUgcGFyZW50cwogIC8vLyBvZiBvdGhlciBtZWFzdXJpbmcgem9uZXMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGNhbGwgdGhyb3VnaCB0aGUgcGFyZW50CiAgLy8vIGNoYWluLiBDb25zZXF1ZW50bHksIHdlIHVzZSBhIHpvbmUgdmFsdWUga2V5ZWQgYnkgW19tZWFzdXJlcl0gdG8gc2VlIGlmCiAgLy8vIHdlIHNob3VsZCBtZWFzdXJlIG9yIG5vdCB3aGVuIGRlbGVnYXRpbmcuCiAgUiBfcnVuPFI+KFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBSIGYoKSkgewogICAgaWYgKHpvbmVbX21lYXN1cmVyXSAhPSB0aGlzKSByZXR1cm4gcGFyZW50LnJ1bih6b25lLCBmKTsKICAgIENvbXBpbGVyVGFzayBwcmV2aW91cyA9IF9zdGFydCgpOwogICAgdHJ5IHsKICAgICAgcmV0dXJuIHBhcmVudC5ydW4oem9uZSwgZik7CiAgICB9IGZpbmFsbHkgewogICAgICBfc3RvcChwcmV2aW91cyk7CiAgICB9CiAgfQoKICAvLy8gU2FtZSBhcyBbcnVuXSBleGNlcHQgdGhhdCBbZl0gdGFrZXMgb25lIGFyZ3VtZW50LCBbYXJnXS4KICBSIF9ydW5VbmFyeTxSLCBUPigKICAgICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFIgZihUIGFyZyksIFQgYXJnKSB7CiAgICBpZiAoem9uZVtfbWVhc3VyZXJdICE9IHRoaXMpIHJldHVybiBwYXJlbnQucnVuVW5hcnkoem9uZSwgZiwgYXJnKTsKICAgIENvbXBpbGVyVGFzayBwcmV2aW91cyA9IF9zdGFydCgpOwogICAgdHJ5IHsKICAgICAgcmV0dXJuIHBhcmVudC5ydW5VbmFyeSh6b25lLCBmLCBhcmcpOwogICAgfSBmaW5hbGx5IHsKICAgICAgX3N0b3AocHJldmlvdXMpOwogICAgfQogIH0KCiAgLy8vIFNhbWUgYXMgW3J1bl0gZXhjZXB0IHRoYXQgW2ZdIHRha2VzIHR3byBhcmd1bWVudHMgKFthMV0gYW5kIFthMl0pLgogIFIgX3J1bkJpbmFyeTxSLCBUMSwgVDI+KFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLAogICAgICBSIGYoVDEgYTEsIFQyIGEyKSwgVDEgYTEsIFQyIGEyKSB7CiAgICBpZiAoem9uZVtfbWVhc3VyZXJdICE9IHRoaXMpIHJldHVybiBwYXJlbnQucnVuQmluYXJ5KHpvbmUsIGYsIGExLCBhMik7CiAgICBDb21waWxlclRhc2sgcHJldmlvdXMgPSBfc3RhcnQoKTsKICAgIHRyeSB7CiAgICAgIHJldHVybiBwYXJlbnQucnVuQmluYXJ5KHpvbmUsIGYsIGExLCBhMik7CiAgICB9IGZpbmFsbHkgewogICAgICBfc3RvcChwcmV2aW91cyk7CiAgICB9CiAgfQoKICAvLy8gQXN5bmNocm9ub3VzIHZlcnNpb24gb2YgW21lYXN1cmVdLiBVc2UgdGhpcyB3aGVuIGFjdGlvbiByZXR1cm5zIGEgZnV0dXJlCiAgLy8vIHRoYXQncyB0cnVseSBhc3luY2hyb25vdXMsIHN1Y2ggSS9PLiBPbmx5IG9uZSB0YXNrIGNhbiB1c2UgdGhpcyBtZXRob2QKICAvLy8gY29uY3VycmVudGx5LgogIC8vLwogIC8vLyBOb3RlOiB3ZSBhc3N1bWUgdGhhdCB0aGlzIG1ldGhvZCBpcyB1c2VkIG9ubHkgYnkgdGhlIGNvbXBpbGVyIGlucHV0CiAgLy8vIHByb3ZpZGVyLCBidXQgaXQgY291bGQgYmUgdXNlZCBieSBvdGhlciB0YXNrcyBhcyBsb25nIGFzIHRoZSBpbnB1dAogIC8vLyBwcm92aWRlciB3aWxsIG5vdCBiZSBjYWxsZWQgYnkgdGhvc2UgdGFza3MuCiAgRnV0dXJlPFQ+IG1lYXN1cmVJbzxUPihGdXR1cmU8VD4gYWN0aW9uKCkpIHsKICAgIGlmIChfaXNEaXNhYmxlZCkgcmV0dXJuIGFjdGlvbigpOwoKICAgIGlmIChfbWVhc3VyZXIuX2N1cnJlbnRBc3luY1Rhc2sgPT0gbnVsbCkgewogICAgICBfbWVhc3VyZXIuX2N1cnJlbnRBc3luY1Rhc2sgPSB0aGlzOwogICAgfSBlbHNlIGlmIChfbWVhc3VyZXIuX2N1cnJlbnRBc3luY1Rhc2sgIT0gdGhpcykgewogICAgICB0aHJvdyAiQ2FuJ3QgdHJhY2sgYXN5bmMgdGFzayAnJG5hbWUnIGJlY2F1c2UiCiAgICAgICAgICAiICcke19tZWFzdXJlci5fY3VycmVudEFzeW5jVGFzay5uYW1lfScgaXMgYWxyZWFkeSBiZWluZyB0cmFja2VkLiI7CiAgICB9CiAgICBfYXN5bmNDb3VudCsrOwogICAgcmV0dXJuIG1lYXN1cmUoYWN0aW9uKS53aGVuQ29tcGxldGUoKCkgewogICAgICBfYXN5bmNDb3VudC0tOwogICAgICBpZiAoX2FzeW5jQ291bnQgPT0gMCkgX21lYXN1cmVyLl9jdXJyZW50QXN5bmNUYXNrID0gbnVsbDsKICAgIH0pOwogIH0KCiAgLy8vIE1lYXN1cmUgdGhlIHRpbWUgc3BlbnQgaW4gW2FjdGlvbl0gKGlmIGluIHZlcmJvc2UgbW9kZSkgYW5kIGFjY3VtdWxhdGUgaXQKICAvLy8gdW5kZXIgYSBzdWJ0YXNrIHdpdGggdGhlIGdpdmVuIG5hbWUuCiAgVCBtZWFzdXJlU3VidGFzazxUPihTdHJpbmcgbmFtZSwgVCBhY3Rpb24oKSkgewogICAgaWYgKF9pc0Rpc2FibGVkKSByZXR1cm4gYWN0aW9uKCk7CgogICAgLy8gVXNlIGEgbmVzdGVkIENvbXBpbGVyVGFzayBmb3IgdGhlIG1lYXN1cmVtZW50IHRvIGVuc3VyZSBuZXN0ZWQgW21lYXN1cmVdCiAgICAvLyBjYWxscyB3b3JrIGNvcnJlY3RseS4gVGhlIHN1YnRhc2tzIHdpbGwgbmV2ZXIgdGhlbXNlbHZlcyBoYXZlIG5lc3RlZAogICAgLy8gc3VidGFza3MgYmVjYXVzZSB0aGV5IGFyZSBub3QgYWNjZXNzaWJsZSBvdXRzaWRlLgogICAgR2VuZXJpY1Rhc2sgc3VidGFzayA9IF9zdWJ0YXNrc1tuYW1lXSA/Pz0gbmV3IEdlbmVyaWNUYXNrKG5hbWUsIF9tZWFzdXJlcik7CiAgICByZXR1cm4gc3VidGFzay5tZWFzdXJlKGFjdGlvbik7CiAgfQoKICAvLy8gQXN5bmNocm9ub3VzIHZlcnNpb24gb2YgW21lYXN1cmVTdWJ0YXNrXS4gVXNlIHRoaXMgd2hlbiBhY3Rpb24gcmV0dXJucyBhCiAgLy8vIGZ1dHVyZSB0aGF0J3MgdHJ1bHkgYXN5bmNocm9ub3VzLCBzdWNoIEkvTy4gT25seSBvbmUgdGFzayBjYW4gdXNlIHRoaXMKICAvLy8gY29uY3VycmVudGx5LgogIC8vLwogIC8vLyBOb3RlOiB3ZSBhc3N1bWUgdGhhdCB0aGlzIG1ldGhvZCBpcyB1c2VkIG9ubHkgYnkgdGhlIGNvbXBpbGVyIGlucHV0CiAgLy8vIHByb3ZpZGVyLCBidXQgaXQgY291bGQgYmUgdXNlZCBieSBvdGhlciB0YXNrcyBhcyBsb25nIGFzIHRoZSBpbnB1dAogIC8vLyBwcm92aWRlciB3aWxsIG5vdCBiZSBjYWxsZWQgYnkgdGhvc2UgdGFza3MuCiAgRnV0dXJlPFQ+IG1lYXN1cmVJb1N1YnRhc2s8VD4oU3RyaW5nIG5hbWUsIEZ1dHVyZTxUPiBhY3Rpb24oKSkgewogICAgaWYgKF9pc0Rpc2FibGVkKSByZXR1cm4gYWN0aW9uKCk7CgogICAgLy8gVXNlIGEgbmVzdGVkIENvbXBpbGVyVGFzayBmb3IgdGhlIG1lYXN1cmVtZW50IHRvIGVuc3VyZSBuZXN0ZWQgW21lYXN1cmVdCiAgICAvLyBjYWxscyB3b3JrIGNvcnJlY3RseS4gVGhlIHN1YnRhc2tzIHdpbGwgbmV2ZXIgdGhlbXNlbHZlcyBoYXZlIG5lc3RlZAogICAgLy8gc3VidGFza3MgYmVjYXVzZSB0aGV5IGFyZSBub3QgYWNjZXNzaWJsZSBvdXRzaWRlLgogICAgR2VuZXJpY1Rhc2sgc3VidGFzayA9IF9zdWJ0YXNrc1tuYW1lXSA/Pz0gbmV3IEdlbmVyaWNUYXNrKG5hbWUsIF9tZWFzdXJlcik7CiAgICByZXR1cm4gc3VidGFzay5tZWFzdXJlSW8oYWN0aW9uKTsKICB9CgogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IHN1YnRhc2tzID0+IF9zdWJ0YXNrcy5rZXlzOwoKICBpbnQgZ2V0U3VidGFza1RpbWUoU3RyaW5nIHN1YnRhc2spID0+IF9zdWJ0YXNrc1tzdWJ0YXNrXS50aW1pbmc7CgogIGJvb2wgZ2V0U3VidGFza0lzUnVubmluZyhTdHJpbmcgc3VidGFzaykgPT4gX3N1YnRhc2tzW3N1YnRhc2tdLmlzUnVubmluZzsKfQoKY2xhc3MgR2VuZXJpY1Rhc2sgZXh0ZW5kcyBDb21waWxlclRhc2sgewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lOwogIEdlbmVyaWNUYXNrKHRoaXMubmFtZSwgTWVhc3VyZXIgbWVhc3VyZXIpIDogc3VwZXIobWVhc3VyZXIpOwp9CgpjbGFzcyBNZWFzdXJlciB7CiAgLy8vIE1lYXN1cmVzIHRoZSB0b3RhbCBydW50aW1lIGZyb20gdGhpcyBvYmplY3Qgd2FzIGNvbnN0cnVjdGVkLgogIC8vLwogIC8vLyBOb3RlOiBNVVNUIGJlIHRoZSBmaXJzdCBmaWVsZCBvZiB0aGlzIGNsYXNzIHRvIGVuc3VyZSBbd2FsbGNsb2NrXSBpcwogIC8vLyBzdGFydGVkIGJlZm9yZSBvdGhlciBjb21wdXRhdGlvbnMuCiAgZmluYWwgU3RvcHdhdGNoIF93YWxsQ2xvY2sgPSBuZXcgU3RvcHdhdGNoKCkuLnN0YXJ0KCk7CgogIER1cmF0aW9uIGdldCBlbGFwc2VkV2FsbENsb2NrID0+IF93YWxsQ2xvY2suZWxhcHNlZDsKCiAgLy8vIE1lYXN1cmVzIGdhcHMgYmV0d2VlbiB6b25lZCBjbG9zdXJlcyBkdWUgdG8gYXN5bmNocm9uaWNpdHkuCiAgZmluYWwgU3RvcHdhdGNoIF9hc3luY1dhbGxDbG9jayA9IG5ldyBTdG9wd2F0Y2goKTsKCiAgRHVyYXRpb24gZ2V0IGVsYXBzZWRBc3luY1dhbGxDbG9jayA9PiBfYXN5bmNXYWxsQ2xvY2suZWxhcHNlZDsKCiAgLy8vIFdoZXRoZXIgbWVhc3VyZW1lbnQgb2YgdGFza3MgaXMgZW5hYmxlZC4KICBmaW5hbCBib29sIGVuYWJsZVRhc2tNZWFzdXJlbWVudHM7CgogIHN0YXRpYyBpbnQgX2hhc2hDb2RlR2VuZXJhdG9yID0gMTk3OwogIEBvdmVycmlkZQogIGZpbmFsIGludCBoYXNoQ29kZSA9IF9oYXNoQ29kZUdlbmVyYXRvcisrOwoKICBNZWFzdXJlcih7dGhpcy5lbmFibGVUYXNrTWVhc3VyZW1lbnRzOiBmYWxzZX0pOwoKICAvLy8gVGhlIGN1cnJlbnRseSBydW5uaW5nIHRhc2ssIHRoYXQgaXMsIHRoZSB0YXNrIHdob3NlIFtTdG9wd2F0Y2hdIGlzCiAgLy8vIGN1cnJlbnRseSBydW5uaW5nLgogIENvbXBpbGVyVGFzayBfY3VycmVudFRhc2s7CgogIC8vLyBUaGUgY3VycmVudCB0YXNrIHdoaWNoIHNob3VsZCBiZSBjaGFyZ2VkIGZvciBhc3luY2hyb25vdXMgZ2Fwcy4KICBDb21waWxlclRhc2sgX2N1cnJlbnRBc3luY1Rhc2s7CgogIC8vLyBTdGFydCBjb3VudGluZyB0aGUgdG90YWwgZWxhcHNlZCB0aW1lIHNpbmNlIHRoZSBjb21waWxlciBzdGFydGVkLgogIHZvaWQgc3RhcnRXYWxsQ2xvY2soKSB7CiAgICBfd2FsbENsb2NrLnN0YXJ0KCk7CiAgfQoKICAvLy8gU3RhcnQgY291bnRpbmcgdGhlIHRvdGFsIGVsYXBzZWQgdGltZSBzaW5jZSB0aGUgY29tcGlsZXIgc3RhcnRlZC4KICB2b2lkIHN0b3BXYWxsQ2xvY2soKSB7CiAgICBfd2FsbENsb2NrLnN0b3AoKTsKICB9CgogIC8vLyBDYWxsIHRoaXMgYmVmb3JlIHJldHVybmluZyB0byB0aGUgZXZlbnRsb29wLgogIHZvaWQgc3RhcnRBc3luY1dhbGxDbG9jaygpIHsKICAgIGlmIChfY3VycmVudEFzeW5jVGFzayAhPSBudWxsKSB7CiAgICAgIF9jdXJyZW50QXN5bmNUYXNrLl93YXRjaC5zdGFydCgpOwogICAgfSBlbHNlIHsKICAgICAgX2FzeW5jV2FsbENsb2NrLnN0YXJ0KCk7CiAgICB9CiAgfQoKICAvLy8gQ2FsbCB0aGlzIHdoZW4gdGhlIGV2ZW50bG9vcCByZXR1cm5zIGNvbnRyb2wgdG8gdXMuCiAgdm9pZCBzdG9wQXN5bmNXYWxsQ2xvY2soKSB7CiAgICBpZiAoX2N1cnJlbnRBc3luY1Rhc2sgIT0gbnVsbCkgewogICAgICBfY3VycmVudEFzeW5jVGFzay5fd2F0Y2guc3RvcCgpOwogICAgfQogICAgX2FzeW5jV2FsbENsb2NrLnN0b3AoKTsKICB9Cn0KgRQATk48AR4BFEIBOQRPUSorHhwaRgEXAU4aKBMBH0wBTzUqATQGTyA7ATMBEx8sNB8GEgQBGislNCEGEgQBS04OTgFNMhoiNCMyShIkFBUEAUwzJh0THB8NS0YnBicEASNOUE8OARwBOjoBHDdJRQQBTktMTU1OMEA9JgoiEBcGBAE/FUZHJgosEBcGBAFJRSlLJgowEBcGBAFPTRQGSkkyLyYBLyo2NU4GEy0VQAgEAVArMSYBUEw5UCQEAU9NFAZKSTJDJgFQTDlQJgQBMwFDAUwCASkMFT8CARFDBkspOQE3AUI1AUEBLyUBJwwtATIBSRkdAUYiAUgaGAQBSBkXBAEzHyUoDR8GBAE6HiUnBhwEAgEmcGFja2FnZTpjb21waWxlci9zcmMvY29tbW9uL3Rhc2tzLmRhcnQpc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvY29tbW9uLmRhcnSDWC8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gTGlicmFyeSB0aGF0IHJlLWV4cG9ydHMgbGlicmFyaWVzIHVzZWQgdGhyb3VnaG91dCB0aGUgY29tcGlsZXIgcmVnYXJkbGVzcwovLy8gb2YgcGhhc2Ugb3Igc3ViZnVuY3Rpb25hbGl0eS4KbGlicmFyeSBkYXJ0MmpzLmNvbW1vbjsKCmV4cG9ydCAnZGlhZ25vc3RpY3MvZGlhZ25vc3RpY19saXN0ZW5lci5kYXJ0JwogICAgc2hvdyBEaWFnbm9zdGljTWVzc2FnZSwgRGlhZ25vc3RpY1JlcG9ydGVyOwpleHBvcnQgJ2RpYWdub3N0aWNzL2ludmFyaWFudC5kYXJ0JyBzaG93IGFzc2VydERlYnVnTW9kZSwgZmFpbGVkQXQ7CmV4cG9ydCAnZGlhZ25vc3RpY3MvbWVzc2FnZXMuZGFydCcgc2hvdyBNZXNzYWdlS2luZDsKZXhwb3J0ICdkaWFnbm9zdGljcy9zb3VyY2Vfc3Bhbi5kYXJ0JyBzaG93IFNvdXJjZVNwYW47CmV4cG9ydCAnZGlhZ25vc3RpY3Mvc3Bhbm5hYmxlLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICBOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgU3Bhbm5hYmxlLAogICAgICAgIFNwYW5uYWJsZUFzc2VydGlvbkZhaWx1cmU7CmV4cG9ydCAnaGVscGVycy9oZWxwZXJzLmRhcnQnOwoKYm9vbCByZXRhaW5EYXRhRm9yVGVzdGluZyA9IGZhbHNlOwoYAE5OPAFOIhgBLjBENTckCSMfEyMfASMBIHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbW1vbi5kYXJ0K3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbXBpbGVyLmRhcnTAAIo8Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5jb21waWxlcl9iYXNlOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZTsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9kYXJ0MmpzLmRhcnQnCiAgICBzaG93IGNsZWFyU3RyaW5nVG9rZW5DYW5vbmljYWxpemVyOwoKaW1wb3J0ICcuLi9jb21waWxlcl9uZXcuZGFydCcgYXMgYXBpOwppbXBvcnQgJ2JhY2tlbmRfc3RyYXRlZ3kuZGFydCc7CmltcG9ydCAnY29tbW9uL2NvZGVnZW4uZGFydCc7CmltcG9ydCAnY29tbW9uL25hbWVzLmRhcnQnIHNob3cgU2VsZWN0b3JzLCBVcmlzOwppbXBvcnQgJ2NvbW1vbi90YXNrcy5kYXJ0JyBzaG93IENvbXBpbGVyVGFzaywgR2VuZXJpY1Rhc2ssIE1lYXN1cmVyOwppbXBvcnQgJ2NvbW1vbi93b3JrLmRhcnQnIHNob3cgV29ya0l0ZW07CmltcG9ydCAnY29tbW9uLmRhcnQnOwppbXBvcnQgJ2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IEVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICdkZWZlcnJlZF9sb2FkLmRhcnQnIHNob3cgRGVmZXJyZWRMb2FkVGFzaywgT3V0cHV0VW5pdERhdGE7CmltcG9ydCAnZGlhZ25vc3RpY3MvY29kZV9sb2NhdGlvbi5kYXJ0JzsKaW1wb3J0ICdkaWFnbm9zdGljcy9kaWFnbm9zdGljX2xpc3RlbmVyLmRhcnQnIHNob3cgRGlhZ25vc3RpY1JlcG9ydGVyOwppbXBvcnQgJ2RpYWdub3N0aWNzL21lc3NhZ2VzLmRhcnQnIHNob3cgTWVzc2FnZSwgTWVzc2FnZVRlbXBsYXRlOwppbXBvcnQgJ2R1bXBfaW5mby5kYXJ0JyBzaG93IER1bXBJbmZvVGFzazsKaW1wb3J0ICdlbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICdlbnF1ZXVlLmRhcnQnIHNob3cgRW5xdWV1ZXIsIEVucXVldWVUYXNrLCBSZXNvbHV0aW9uRW5xdWV1ZXI7CmltcG9ydCAnZW52aXJvbm1lbnQuZGFydCc7CmltcG9ydCAnZnJvbnRlbmRfc3RyYXRlZ3kuZGFydCc7CmltcG9ydCAnaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnIHNob3cgQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5OwppbXBvcnQgJ2luZmVycmVyL3RyaXZpYWwuZGFydCcgc2hvdyBUcml2aWFsQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5OwppbXBvcnQgJ2luZmVycmVyL3R5cGVtYXNrcy9tYXNrcy5kYXJ0JyBzaG93IFR5cGVNYXNrU3RyYXRlZ3k7CmltcG9ydCAnaW5mZXJyZXIvdHlwZXMuZGFydCcKICAgIHNob3cgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMsIEdsb2JhbFR5cGVJbmZlcmVuY2VUYXNrOwppbXBvcnQgJ2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JyBzaG93IFNvdXJjZUluZm9ybWF0aW9uOwppbXBvcnQgJ2pzX2JhY2tlbmQvYmFja2VuZC5kYXJ0JyBzaG93IENvZGVnZW5JbnB1dHMsIEphdmFTY3JpcHRJbXBhY3RTdHJhdGVneTsKaW1wb3J0ICdqc19iYWNrZW5kL2luZmVycmVkX2RhdGEuZGFydCc7CmltcG9ydCAnanNfbW9kZWwvanNfc3RyYXRlZ3kuZGFydCc7CmltcG9ydCAna2VybmVsL2tlcm5lbF9zdHJhdGVneS5kYXJ0JzsKaW1wb3J0ICdrZXJuZWwvbG9hZGVyLmRhcnQnIHNob3cgS2VybmVsTG9hZGVyVGFzaywgS2VybmVsUmVzdWx0OwppbXBvcnQgJ251bGxfY29tcGlsZXJfb3V0cHV0LmRhcnQnIHNob3cgTnVsbENvbXBpbGVyT3V0cHV0OwppbXBvcnQgJ29wdGlvbnMuZGFydCcgc2hvdyBDb21waWxlck9wdGlvbnMsIERpYWdub3N0aWNPcHRpb25zOwppbXBvcnQgJ3NlcmlhbGl6YXRpb24vdGFzay5kYXJ0JzsKaW1wb3J0ICdzZXJpYWxpemF0aW9uL3N0cmF0ZWdpZXMuZGFydCc7CmltcG9ydCAnc3NhL25vZGVzLmRhcnQnIHNob3cgSEluc3RydWN0aW9uOwppbXBvcnQgJ3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAndW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3VuaXZlcnNlL3Jlc29sdXRpb25fd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd1bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydCcKICAgIHNob3cgSW1wYWN0U3RyYXRlZ3ksIFdvcmxkSW1wYWN0LCBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsOwppbXBvcnQgJ3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkLCBLQ2xvc2VkV29ybGQ7Cgp0eXBlZGVmIENvbXBpbGVyRGlhZ25vc3RpY1JlcG9ydGVyIE1ha2VSZXBvcnRlckZ1bmN0aW9uKAogICAgQ29tcGlsZXIgY29tcGlsZXIsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zKTsKCmFic3RyYWN0IGNsYXNzIENvbXBpbGVyIHsKICBNZWFzdXJlciBnZXQgbWVhc3VyZXI7CgogIGFwaS5Db21waWxlcklucHV0IGdldCBwcm92aWRlcjsKCiAgRnJvbnRlbmRTdHJhdGVneSBmcm9udGVuZFN0cmF0ZWd5OwogIEJhY2tlbmRTdHJhdGVneSBiYWNrZW5kU3RyYXRlZ3k7CiAgQ29tcGlsZXJEaWFnbm9zdGljUmVwb3J0ZXIgX3JlcG9ydGVyOwogIE1hcDxFbnRpdHksIFdvcmxkSW1wYWN0PiBfaW1wYWN0Q2FjaGU7CiAgSW1wYWN0Q2FjaGVEZWxldGVyIF9pbXBhY3RDYWNoZURlbGV0ZXI7CgogIEltcGFjdFN0cmF0ZWd5IGltcGFjdFN0cmF0ZWd5ID0gY29uc3QgSW1wYWN0U3RyYXRlZ3koKTsKCiAgLy8vIE9wdGlvbnMgcHJvdmlkZWQgZnJvbSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zOwoKICAvLyBUaGVzZSBpbnRlcm5hbCBmbGFncyBhcmUgdXNlZCB0byBzdG9wIGNvbXBpbGF0aW9uIGFmdGVyIGEgc3BlY2lmaWMgcGhhc2UuCiAgLy8gVXNlZCBvbmx5IGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmcgcHVycG9zZXMgb25seS4KICBib29sIHN0b3BBZnRlckNsb3NlZFdvcmxkID0gZmFsc2U7CiAgYm9vbCBzdG9wQWZ0ZXJUeXBlSW5mZXJlbmNlID0gZmFsc2U7CgogIC8vLyBPdXRwdXQgcHJvdmlkZXIgZnJvbSB1c2VyIG9mIENvbXBpbGVyIEFQSS4KICBhcGkuQ29tcGlsZXJPdXRwdXQgX291dHB1dFByb3ZpZGVyOwoKICBhcGkuQ29tcGlsZXJPdXRwdXQgZ2V0IG91dHB1dFByb3ZpZGVyID0+IF9vdXRwdXRQcm92aWRlcjsKCiAgTGlzdDxDb2RlTG9jYXRpb24+IF91c2VyQ29kZUxvY2F0aW9ucyA9IDxDb2RlTG9jYXRpb24+W107CgogIEpDbG9zZWRXb3JsZCBiYWNrZW5kQ2xvc2VkV29ybGRGb3JUZXN0aW5nOwoKICBEaWFnbm9zdGljUmVwb3J0ZXIgZ2V0IHJlcG9ydGVyID0+IF9yZXBvcnRlcjsKICBNYXA8RW50aXR5LCBXb3JsZEltcGFjdD4gZ2V0IGltcGFjdENhY2hlID0+IF9pbXBhY3RDYWNoZTsKICBJbXBhY3RDYWNoZURlbGV0ZXIgZ2V0IGltcGFjdENhY2hlRGVsZXRlciA9PiBfaW1wYWN0Q2FjaGVEZWxldGVyOwoKICBmaW5hbCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudDsKICAvLyBUT0RPKHNpZ211bmQpOiBkZWxldGUgb25jZSB3ZSBtaWdyYXRlIHRoZSByZXN0IG9mIHRoZSBjb21waWxlciB0byB1c2UKICAvLyBgZW52aXJvbm1lbnRgIGRpcmVjdGx5LgogIEBkZXByZWNhdGVkCiAgZnJvbUVudmlyb25tZW50KFN0cmluZyBuYW1lKSA9PiBlbnZpcm9ubWVudC52YWx1ZU9mKG5hbWUpOwoKICBFbnRpdHkgZ2V0IGN1cnJlbnRFbGVtZW50ID0+IF9yZXBvcnRlci5jdXJyZW50RWxlbWVudDsKCiAgTGlzdDxDb21waWxlclRhc2s+IHRhc2tzOwogIEtlcm5lbExvYWRlclRhc2sga2VybmVsTG9hZGVyOwogIEdsb2JhbFR5cGVJbmZlcmVuY2VUYXNrIGdsb2JhbEluZmVyZW5jZTsKICBDb2RlZ2VuV29ybGRCdWlsZGVyIF9jb2RlZ2VuV29ybGRCdWlsZGVyOwoKICBBYnN0cmFjdFZhbHVlU3RyYXRlZ3kgYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5OwoKICBHZW5lcmljVGFzayBzZWxmVGFzazsKCiAgRW5xdWV1ZVRhc2sgZW5xdWV1ZXI7CiAgRGVmZXJyZWRMb2FkVGFzayBkZWZlcnJlZExvYWRUYXNrOwogIER1bXBJbmZvVGFzayBkdW1wSW5mb1Rhc2s7CiAgU2VyaWFsaXphdGlvblRhc2sgc2VyaWFsaXphdGlvblRhc2s7CgogIGJvb2wgZ2V0IGhhc0NyYXNoZWQgPT4gX3JlcG9ydGVyLmhhc0NyYXNoZWQ7CgogIFByb2dyZXNzIHByb2dyZXNzID0gY29uc3QgUHJvZ3Jlc3MoKTsKCiAgc3RhdGljIGNvbnN0IGludCBQSEFTRV9TQ0FOTklORyA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBQSEFTRV9SRVNPTFZJTkcgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgUEhBU0VfRE9ORV9SRVNPTFZJTkcgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgUEhBU0VfQ09NUElMSU5HID0gMzsKICBpbnQgcGhhc2U7CgogIGJvb2wgY29tcGlsYXRpb25GYWlsZWQgPSBmYWxzZTsKCiAgLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBmb3IgdGVzdGluZyByZXNvbHV0aW9uIGVucXVldWluZy4KICB2b2lkIEZ1bmN0aW9uKCkgb25SZXNvbHV0aW9uUXVldWVFbXB0eUZvclRlc3Rpbmc7CgogIC8vIENhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgZm9yIHRlc3RpbmcgY29kZWdlbiBlbnF1ZXVpbmcuCiAgdm9pZCBGdW5jdGlvbigpIG9uQ29kZWdlblF1ZXVlRW1wdHlGb3JUZXN0aW5nOwoKICBDb21waWxlcigKICAgICAge0NvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBhcGkuQ29tcGlsZXJPdXRwdXQgb3V0cHV0UHJvdmlkZXIsCiAgICAgIHRoaXMuZW52aXJvbm1lbnQ6IGNvbnN0IF9FbXB0eUVudmlyb25tZW50KCksCiAgICAgIE1ha2VSZXBvcnRlckZ1bmN0aW9uIG1ha2VSZXBvcnRlcn0pCiAgICAgIDogdGhpcy5vcHRpb25zID0gb3B0aW9ucyB7CiAgICBvcHRpb25zLmRlcml2ZU9wdGlvbnMoKTsKICAgIG9wdGlvbnMudmFsaWRhdGUoKTsKCiAgICBhYnN0cmFjdFZhbHVlU3RyYXRlZ3kgPSBvcHRpb25zLnVzZVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgPyBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5KCkKICAgICAgICA6IGNvbnN0IFR5cGVNYXNrU3RyYXRlZ3koKTsKICAgIENvbXBpbGVyVGFzayBrZXJuZWxGcm9udEVuZFRhc2s7CiAgICBzZWxmVGFzayA9IG5ldyBHZW5lcmljVGFzaygnc2VsZicsIG1lYXN1cmVyKTsKICAgIF9vdXRwdXRQcm92aWRlciA9IG5ldyBfQ29tcGlsZXJPdXRwdXQodGhpcywgb3V0cHV0UHJvdmlkZXIpOwogICAgaWYgKG1ha2VSZXBvcnRlciAhPSBudWxsKSB7CiAgICAgIF9yZXBvcnRlciA9IG1ha2VSZXBvcnRlcih0aGlzLCBvcHRpb25zKTsKICAgIH0gZWxzZSB7CiAgICAgIF9yZXBvcnRlciA9IG5ldyBDb21waWxlckRpYWdub3N0aWNSZXBvcnRlcih0aGlzLCBvcHRpb25zKTsKICAgIH0KICAgIGtlcm5lbEZyb250RW5kVGFzayA9IG5ldyBHZW5lcmljVGFzaygnRnJvbnQgZW5kJywgbWVhc3VyZXIpOwogICAgZnJvbnRlbmRTdHJhdGVneSA9IG5ldyBLZXJuZWxGcm9udGVuZFN0cmF0ZWd5KAogICAgICAgIGtlcm5lbEZyb250RW5kVGFzaywgb3B0aW9ucywgcmVwb3J0ZXIsIGVudmlyb25tZW50KTsKICAgIGJhY2tlbmRTdHJhdGVneSA9IGNyZWF0ZUJhY2tlbmRTdHJhdGVneSgpOwogICAgX2ltcGFjdENhY2hlID0gPEVudGl0eSwgV29ybGRJbXBhY3Q+e307CiAgICBfaW1wYWN0Q2FjaGVEZWxldGVyID0gbmV3IF9NYXBJbXBhY3RDYWNoZURlbGV0ZXIoX2ltcGFjdENhY2hlKTsKCiAgICBpZiAob3B0aW9ucy5zaG93SW50ZXJuYWxQcm9ncmVzcykgewogICAgICBwcm9ncmVzcyA9IG5ldyBJbnRlcmFjdGl2ZVByb2dyZXNzKCk7CiAgICB9CgogICAgZW5xdWV1ZXIgPSBuZXcgRW5xdWV1ZVRhc2sodGhpcyk7CgogICAgdGFza3MgPSBbCiAgICAgIGtlcm5lbExvYWRlciA9IG5ldyBLZXJuZWxMb2FkZXJUYXNrKAogICAgICAgICAgb3B0aW9ucywgcHJvdmlkZXIsIF9vdXRwdXRQcm92aWRlciwgcmVwb3J0ZXIsIG1lYXN1cmVyKSwKICAgICAga2VybmVsRnJvbnRFbmRUYXNrLAogICAgICBnbG9iYWxJbmZlcmVuY2UgPSBuZXcgR2xvYmFsVHlwZUluZmVyZW5jZVRhc2sodGhpcyksCiAgICAgIGRlZmVycmVkTG9hZFRhc2sgPSBmcm9udGVuZFN0cmF0ZWd5LmNyZWF0ZURlZmVycmVkTG9hZFRhc2sodGhpcyksCiAgICAgIC8vIFtlbnF1ZXVlcl0gaXMgY3JlYXRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgY29udGFpbnMgdGhlIHJlc29sdXRpb24gd29ybGQKICAgICAgLy8gb2JqZWN0cyBuZWVkZWQgYnkgb3RoZXIgdGFza3MuCiAgICAgIGVucXVldWVyLAogICAgICBkdW1wSW5mb1Rhc2sgPSBuZXcgRHVtcEluZm9UYXNrKHRoaXMpLAogICAgICBzZWxmVGFzaywKICAgICAgc2VyaWFsaXphdGlvblRhc2sgPSBuZXcgU2VyaWFsaXphdGlvblRhc2soCiAgICAgICAgICBvcHRpb25zLCByZXBvcnRlciwgcHJvdmlkZXIsIG91dHB1dFByb3ZpZGVyLCBtZWFzdXJlciksCiAgICBdOwoKICAgIHRhc2tzLmFkZEFsbChiYWNrZW5kU3RyYXRlZ3kudGFza3MpOwogIH0KCiAgLy8vIENyZWF0ZXMgdGhlIGJhY2tlbmQgc3RyYXRlZ3kuCiAgLy8vCiAgLy8vIE92ZXJyaWRlIHRoaXMgdG8gbW9jayB0aGUgYmFja2VuZCBzdHJhdGVneSBmb3IgdGVzdGluZy4KICBCYWNrZW5kU3RyYXRlZ3kgY3JlYXRlQmFja2VuZFN0cmF0ZWd5KCkgewogICAgcmV0dXJuIG5ldyBKc0JhY2tlbmRTdHJhdGVneSh0aGlzKTsKICB9CgogIFJlc29sdXRpb25Xb3JsZEJ1aWxkZXIgZ2V0IHJlc29sdXRpb25Xb3JsZEJ1aWxkZXIgPT4KICAgICAgZW5xdWV1ZXIucmVzb2x1dGlvbi53b3JsZEJ1aWxkZXI7CgogIENvZGVnZW5Xb3JsZEJ1aWxkZXIgZ2V0IGNvZGVnZW5Xb3JsZEJ1aWxkZXIgewogICAgYXNzZXJ0KAogICAgICAgIF9jb2RlZ2VuV29ybGRCdWlsZGVyICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAiQ29kZWdlbldvcmxkQnVpbGRlciBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuIikpOwogICAgcmV0dXJuIF9jb2RlZ2VuV29ybGRCdWlsZGVyOwogIH0KCiAgQ29kZWdlbldvcmxkIGNvZGVnZW5Xb3JsZEZvclRlc3Rpbmc7CgogIGJvb2wgZ2V0IGRpc2FibGVUeXBlSW5mZXJlbmNlID0+CiAgICAgIG9wdGlvbnMuZGlzYWJsZVR5cGVJbmZlcmVuY2UgfHwgY29tcGlsYXRpb25GYWlsZWQ7CgogIC8vIENvbXBpbGVzIHRoZSBkYXJ0IHNjcmlwdCBhdCBbdXJpXS4KICAvLwogIC8vIFRoZSByZXN1bHRpbmcgZnV0dXJlIHdpbGwgY29tcGxldGUgd2l0aCB0cnVlIGlmIHRoZSBjb21waWxhdGlvbgogIC8vIHN1Y2NlZWRlZC4KICBGdXR1cmU8Ym9vbD4gcnVuKFVyaSB1cmkpID0+IHNlbGZUYXNrLm1lYXN1cmVTdWJ0YXNrKCJydW4iLCAoKSB7CiAgICAgICAgbWVhc3VyZXIuc3RhcnRXYWxsQ2xvY2soKTsKCiAgICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuc3luYygoKSA9PiBydW5JbnRlcm5hbCh1cmkpKQogICAgICAgICAgICAuY2F0Y2hFcnJvcigoZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgPT4KICAgICAgICAgICAgICAgIF9yZXBvcnRlci5vbkVycm9yKHVyaSwgZXJyb3IsIHN0YWNrVHJhY2UpKQogICAgICAgICAgICAud2hlbkNvbXBsZXRlKCgpIHsKICAgICAgICAgIG1lYXN1cmVyLnN0b3BXYWxsQ2xvY2soKTsKICAgICAgICB9KS50aGVuKChfKSB7CiAgICAgICAgICByZXR1cm4gIWNvbXBpbGF0aW9uRmFpbGVkOwogICAgICAgIH0pOwogICAgICB9KTsKCiAgRnV0dXJlIHJ1bkludGVybmFsKFVyaSB1cmkpIGFzeW5jIHsKICAgIGNsZWFyU3RhdGUoKTsKICAgIGFzc2VydCh1cmkgIT0gbnVsbCk7CiAgICAvLyBBcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhpcyBicmFuY2ggaXMgb25seSB1c2VkIGJ5IHRlc3QgY29kZS4KICAgIHJlcG9ydGVyLmxvZygnQ29tcGlsaW5nICR1cmkgKCR7b3B0aW9ucy5idWlsZElkfSknKTsKCiAgICBpZiAob3B0aW9ucy5yZWFkRGF0YVVyaSAhPSBudWxsKSB7CiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzID0KICAgICAgICAgIGF3YWl0IHNlcmlhbGl6YXRpb25UYXNrLmRlc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZSgKICAgICAgICAgICAgICBlbnZpcm9ubWVudCwgYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5KTsKICAgICAgaWYgKG9wdGlvbnMuZGVidWdHbG9iYWxJbmZlcmVuY2UpIHsKICAgICAgICBwZXJmb3JtR2xvYmFsVHlwZUluZmVyZW5jZShnbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cy5jbG9zZWRXb3JsZCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGF3YWl0IGdlbmVyYXRlSmF2YVNjcmlwdENvZGUoZ2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMpOwogICAgfSBlbHNlIHsKICAgICAgS2VybmVsUmVzdWx0IHJlc3VsdCA9IGF3YWl0IGtlcm5lbExvYWRlci5sb2FkKHVyaSk7CiAgICAgIHJlcG9ydGVyLmxvZygiS2VybmVsIGxvYWQgY29tcGxldGUiKTsKICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXR1cm47CiAgICAgIGlmIChjb21waWxhdGlvbkZhaWxlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAob3B0aW9ucy5jZmVPbmx5KSByZXR1cm47CgogICAgICBmcm9udGVuZFN0cmF0ZWd5LnJlZ2lzdGVyTG9hZGVkTGlicmFyaWVzKHJlc3VsdCk7CgogICAgICAvLyBUT0RPKGVmb3J0dW5hLCBzaWdtdW5kKTogVGhlc2UgdmFsaWRhdGlvbiBzdGVwcyBzaG91bGQgYmUgZG9uZSBpbiB0aGUKICAgICAgLy8gZnJvbnQgZW5kIGZvciB0aGUgS2VybmVsIHBhdGggc2luY2UgS2VybmVsIGRvZXNuJ3QgaGF2ZSB0aGUgbm90aW9uIG9mCiAgICAgIC8vIGltcG9ydHMgKGV2ZXJ5dGhpbmcgaGFzIGFscmVhZHkgYmVlbiByZXNvbHZlZCkuIChTZWUKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzI5MzY4KQogICAgICBpZiAocmVzdWx0LmxpYnJhcmllcy5jb250YWlucyhVcmlzLmRhcnRfbWlycm9ycykpIHsKICAgICAgICByZXBvcnRlci5yZXBvcnRXYXJuaW5nTWVzc2FnZShOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAgIE1lc3NhZ2VLaW5kLk1JUlJPUlNfTElCUkFSWV9OT1RfU1VQUE9SVF9XSVRIX0NGRSk7CiAgICAgIH0KCiAgICAgIGF3YWl0IGNvbXBpbGVGcm9tS2VybmVsKHJlc3VsdC5yb290TGlicmFyeVVyaSwgcmVzdWx0LmxpYnJhcmllcyk7CiAgICB9CiAgfQoKICB2b2lkIGdlbmVyYXRlSmF2YVNjcmlwdENvZGUoCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzKSBhc3luYyB7CiAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQgPSBnbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cy5jbG9zZWRXb3JsZDsKICAgIGJhY2tlbmRTdHJhdGVneS5yZWdpc3RlckpDbG9zZWRXb3JsZChjbG9zZWRXb3JsZCk7CiAgICBwaGFzZSA9IFBIQVNFX0NPTVBJTElORzsKICAgIENvZGVnZW5JbnB1dHMgY29kZWdlbklucHV0cyA9CiAgICAgICAgYmFja2VuZFN0cmF0ZWd5Lm9uQ29kZWdlblN0YXJ0KGdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzKTsKCiAgICBpZiAob3B0aW9ucy5yZWFkQ29kZWdlblVyaSAhPSBudWxsKSB7CiAgICAgIENvZGVnZW5SZXN1bHRzIGNvZGVnZW5SZXN1bHRzID0KICAgICAgICAgIGF3YWl0IHNlcmlhbGl6YXRpb25UYXNrLmRlc2VyaWFsaXplQ29kZWdlbigKICAgICAgICAgICAgICBiYWNrZW5kU3RyYXRlZ3ksIGdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzLCBjb2RlZ2VuSW5wdXRzKTsKICAgICAgcmVwb3J0ZXIubG9nKCdDb21waWxpbmcgbWV0aG9kcycpOwogICAgICBydW5Db2RlZ2VuRW5xdWV1ZXIoY29kZWdlblJlc3VsdHMpOwogICAgfSBlbHNlIHsKICAgICAgcmVwb3J0ZXIubG9nKCdDb21waWxpbmcgbWV0aG9kcycpOwogICAgICBDb2RlZ2VuUmVzdWx0cyBjb2RlZ2VuUmVzdWx0cyA9IG5ldyBPbkRlbWFuZENvZGVnZW5SZXN1bHRzKAogICAgICAgICAgZ2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMsCiAgICAgICAgICBjb2RlZ2VuSW5wdXRzLAogICAgICAgICAgYmFja2VuZFN0cmF0ZWd5LmZ1bmN0aW9uQ29tcGlsZXIpOwogICAgICBpZiAob3B0aW9ucy53cml0ZUNvZGVnZW5VcmkgIT0gbnVsbCkgewogICAgICAgIHNlcmlhbGl6YXRpb25UYXNrLnNlcmlhbGl6ZUNvZGVnZW4oYmFja2VuZFN0cmF0ZWd5LCBjb2RlZ2VuUmVzdWx0cyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcnVuQ29kZWdlbkVucXVldWVyKGNvZGVnZW5SZXN1bHRzKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIENsZWFyIHRoZSBpbnRlcm5hbCBjb21waWxlciBzdGF0ZSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyB3aGVuIGludm9raW5nCiAgLy8vIHRoZSBjb21waWxlciBtdWx0aXBsZSB0aW1lcyAoZS5nLiBpbiBiYXRjaCBtb2RlKS4KICAvLyBUT0RPKGFoZSk6IGltcGxlbWVudCBhIGJldHRlciBtZWNoYW5pc20gd2hlcmUgd2UgY2FuIHN0b3JlCiAgLy8gc3VjaCBjYWNoZXMgaW4gdGhlIGNvbXBpbGVyIGFuZCBnZXQgYWNjZXNzIHRvIHRoZW0gdGhyb3VnaCBhCiAgLy8gc3VpdGFibHkgbWFpbnRhaW5lZCBzdGF0aWMgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGNvbXBpbGVyLgogIHZvaWQgY2xlYXJTdGF0ZSgpIHsKICAgIGNsZWFyU3RyaW5nVG9rZW5DYW5vbmljYWxpemVyKCk7CiAgICBTZWxlY3Rvci5jYW5vbmljYWxpemVkVmFsdWVzLmNsZWFyKCk7CgogICAgLy8gVGhlIHNlbGVjdG9yIG9iamVjdHMgaGVsZCBpbiBzdGF0aWMgZmllbGRzIG11c3QgcmVtYWluIGNhbm9uaWNhbC4KICAgIGZvciAoU2VsZWN0b3Igc2VsZWN0b3IgaW4gU2VsZWN0b3JzLkFMTCkgewogICAgICBTZWxlY3Rvci5jYW5vbmljYWxpemVkVmFsdWVzCiAgICAgICAgICAucHV0SWZBYnNlbnQoc2VsZWN0b3IuaGFzaENvZGUsICgpID0+IDxTZWxlY3Rvcj5bXSkKICAgICAgICAgIC5hZGQoc2VsZWN0b3IpOwogICAgfQogIH0KCiAgLy8vIFN0YXJ0cyB0aGUgcmVzb2x1dGlvbiBwaGFzZSwgY3JlYXRpbmcgdGhlIFtSZXNvbHV0aW9uRW5xdWV1ZXJdIGlmIG5vdAogIC8vLyBhbHJlYWR5IGNyZWF0ZWQuCiAgLy8vCiAgLy8vIER1cmluZyBub3JtYWwgY29tcGlsYXRpb24gcmVzb2x1dGlvbiBvbmx5IHN0YXJ0ZWQgb25jZSwgYnV0IHRocm91Z2gKICAvLy8gW2FuYWx5emVVcmldIHJlc29sdXRpb24gaXMgc3RhcnRlZCByZXBlYXRlZGx5LgogIFJlc29sdXRpb25FbnF1ZXVlciBzdGFydFJlc29sdXRpb24oKSB7CiAgICBSZXNvbHV0aW9uRW5xdWV1ZXIgcmVzb2x1dGlvbkVucXVldWVyOwogICAgaWYgKGVucXVldWVyLmhhc1Jlc29sdXRpb24pIHsKICAgICAgcmVzb2x1dGlvbkVucXVldWVyID0gZW5xdWV1ZXIucmVzb2x1dGlvbjsKICAgIH0gZWxzZSB7CiAgICAgIHJlc29sdXRpb25FbnF1ZXVlciA9IGVucXVldWVyLmNyZWF0ZVJlc29sdXRpb25FbnF1ZXVlcigpOwogICAgICBmcm9udGVuZFN0cmF0ZWd5Lm9uUmVzb2x1dGlvblN0YXJ0KCk7CiAgICB9CiAgICByZXR1cm4gcmVzb2x1dGlvbkVucXVldWVyOwogIH0KCiAgSkNsb3NlZFdvcmxkIGNvbXB1dGVDbG9zZWRXb3JsZChVcmkgcm9vdExpYnJhcnlVcmksIEl0ZXJhYmxlPFVyaT4gbGlicmFyaWVzKSB7CiAgICBSZXNvbHV0aW9uRW5xdWV1ZXIgcmVzb2x1dGlvbkVucXVldWVyID0gc3RhcnRSZXNvbHV0aW9uKCk7CiAgICBmb3IgKExpYnJhcnlFbnRpdHkgbGlicmFyeQogICAgICAgIGluIGZyb250ZW5kU3RyYXRlZ3kuZWxlbWVudEVudmlyb25tZW50LmxpYnJhcmllcykgewogICAgICBmcm9udGVuZFN0cmF0ZWd5LmVsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoQ2xhc3MobGlicmFyeSwKICAgICAgICAgIChDbGFzc0VudGl0eSBjbHMpIHsKICAgICAgICAvLyBSZWdpc3RlciBhbGwgY2xhc3NlcyBlYWdlcmx5IHRvIG9wdGltaXplIGNsb3NlZCB3b3JsZCBjb21wdXRhdGlvbiBpbgogICAgICAgIC8vIGBDbGFzc1dvcmxkQnVpbGRlci5pc0luaGVyaXRlZEluU3VidHlwZU9mYC4KICAgICAgICByZXNvbHV0aW9uRW5xdWV1ZXIud29ybGRCdWlsZGVyLnJlZ2lzdGVyQ2xhc3MoY2xzKTsKICAgICAgfSk7CiAgICB9CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIG1haW5JbXBhY3QgPSBuZXcgV29ybGRJbXBhY3RCdWlsZGVySW1wbCgpOwogICAgRnVuY3Rpb25FbnRpdHkgbWFpbkZ1bmN0aW9uID0gZnJvbnRlbmRTdHJhdGVneS5jb21wdXRlTWFpbihtYWluSW1wYWN0KTsKCiAgICAvLyBJbiBvcmRlciB0byBzZWUgaWYgYSBsaWJyYXJ5IGlzIGRlZmVycmVkLCB3ZSBtdXN0IGNvbXB1dGUgdGhlCiAgICAvLyBjb21waWxlLXRpbWUgY29uc3RhbnRzIHRoYXQgYXJlIG1ldGFkYXRhLiAgVGhpcyBtZWFucyBhZGRpbmcKICAgIC8vIHNvbWV0aGluZyB0byB0aGUgcmVzb2x1dGlvbiBxdWV1ZS4gIFNvIHdlIGNhbm5vdCB3YWl0IHdpdGgKICAgIC8vIHRoaXMgdW50aWwgYWZ0ZXIgdGhlIHJlc29sdXRpb24gcXVldWUgaXMgcHJvY2Vzc2VkLgogICAgZGVmZXJyZWRMb2FkVGFzay5iZWZvcmVSZXNvbHV0aW9uKHJvb3RMaWJyYXJ5VXJpLCBsaWJyYXJpZXMpOwoKICAgIGltcGFjdFN0cmF0ZWd5ID0gbmV3IEphdmFTY3JpcHRJbXBhY3RTdHJhdGVneSgKICAgICAgICBpbXBhY3RDYWNoZURlbGV0ZXIsIGR1bXBJbmZvVGFzaywKICAgICAgICBzdXBwb3J0RGVmZXJyZWRMb2FkOiBkZWZlcnJlZExvYWRUYXNrLmlzUHJvZ3JhbVNwbGl0LAogICAgICAgIHN1cHBvcnREdW1wSW5mbzogb3B0aW9ucy5kdW1wSW5mbyk7CgogICAgcGhhc2UgPSBQSEFTRV9SRVNPTFZJTkc7CiAgICByZXNvbHV0aW9uRW5xdWV1ZXIuYXBwbHlJbXBhY3QobWFpbkltcGFjdCk7CiAgICBpZiAob3B0aW9ucy5zaG93SW50ZXJuYWxQcm9ncmVzcykgcmVwb3J0ZXIubG9nKCdDb21wdXRpbmcgY2xvc2VkIHdvcmxkJyk7CgogICAgcHJvY2Vzc1F1ZXVlKAogICAgICAgIGZyb250ZW5kU3RyYXRlZ3kuZWxlbWVudEVudmlyb25tZW50LCByZXNvbHV0aW9uRW5xdWV1ZXIsIG1haW5GdW5jdGlvbiwKICAgICAgICBvblByb2dyZXNzOiBzaG93UmVzb2x1dGlvblByb2dyZXNzKTsKICAgIGZyb250ZW5kU3RyYXRlZ3kub25SZXNvbHV0aW9uRW5kKCk7CiAgICByZXNvbHV0aW9uRW5xdWV1ZXIubG9nU3VtbWFyeShyZXBvcnRlci5sb2cpOwoKICAgIF9yZXBvcnRlci5yZXBvcnRTdXBwcmVzc2VkTWVzc2FnZXNTdW1tYXJ5KCk7CgogICAgaWYgKGNvbXBpbGF0aW9uRmFpbGVkKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGFzc2VydChtYWluRnVuY3Rpb24gIT0gbnVsbCk7CiAgICBjaGVja1F1ZXVlKHJlc29sdXRpb25FbnF1ZXVlcik7CgogICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkID0gY2xvc2VSZXNvbHV0aW9uKG1haW5GdW5jdGlvbik7CiAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgYmFja2VuZENsb3NlZFdvcmxkRm9yVGVzdGluZyA9IGNsb3NlZFdvcmxkOwogICAgfQogICAgcmV0dXJuIGNsb3NlZFdvcmxkOwogIH0KCiAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcGVyZm9ybUdsb2JhbFR5cGVJbmZlcmVuY2UoCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgRnVuY3Rpb25FbnRpdHkgbWFpbkZ1bmN0aW9uID0gY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50Lm1haW5GdW5jdGlvbjsKICAgIHJlcG9ydGVyLmxvZygnUGVyZm9ybWluZyBnbG9iYWwgdHlwZSBpbmZlcmVuY2UnKTsKICAgIEluZmVycmVkRGF0YUJ1aWxkZXIgaW5mZXJyZWREYXRhQnVpbGRlciA9CiAgICAgICAgbmV3IEluZmVycmVkRGF0YUJ1aWxkZXJJbXBsKGNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YSk7CiAgICByZXR1cm4gZ2xvYmFsSW5mZXJlbmNlLnJ1bkdsb2JhbFR5cGVJbmZlcmVuY2UoCiAgICAgICAgbWFpbkZ1bmN0aW9uLCBjbG9zZWRXb3JsZCwgaW5mZXJyZWREYXRhQnVpbGRlcik7CiAgfQoKICB2b2lkIHJ1bkNvZGVnZW5FbnF1ZXVlcihDb2RlZ2VuUmVzdWx0cyBjb2RlZ2VuUmVzdWx0cykgewogICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyA9CiAgICAgICAgY29kZWdlblJlc3VsdHMuZ2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHM7CiAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQgPSBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzLmNsb3NlZFdvcmxkOwogICAgQ29kZWdlbklucHV0cyBjb2RlZ2VuSW5wdXRzID0gY29kZWdlblJlc3VsdHMuY29kZWdlbklucHV0czsKICAgIEVucXVldWVyIGNvZGVnZW5FbnF1ZXVlciA9IGVucXVldWVyLmNyZWF0ZUNvZGVnZW5FbnF1ZXVlcigKICAgICAgICBjbG9zZWRXb3JsZCwgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywgY29kZWdlbklucHV0cywgY29kZWdlblJlc3VsdHMpOwogICAgX2NvZGVnZW5Xb3JsZEJ1aWxkZXIgPSBjb2RlZ2VuRW5xdWV1ZXIud29ybGRCdWlsZGVyOwoKICAgIEZ1bmN0aW9uRW50aXR5IG1haW5GdW5jdGlvbiA9IGNsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudC5tYWluRnVuY3Rpb247CiAgICBwcm9jZXNzUXVldWUoY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LCBjb2RlZ2VuRW5xdWV1ZXIsIG1haW5GdW5jdGlvbiwKICAgICAgICBvblByb2dyZXNzOiBzaG93Q29kZWdlblByb2dyZXNzKTsKICAgIGNvZGVnZW5FbnF1ZXVlci5sb2dTdW1tYXJ5KHJlcG9ydGVyLmxvZyk7CiAgICBDb2RlZ2VuV29ybGQgY29kZWdlbldvcmxkID0gY29kZWdlbldvcmxkQnVpbGRlci5jbG9zZSgpOwogICAgaWYgKHJldGFpbkRhdGFGb3JUZXN0aW5nKSB7CiAgICAgIGNvZGVnZW5Xb3JsZEZvclRlc3RpbmcgPSBjb2RlZ2VuV29ybGQ7CiAgICB9CiAgICByZXBvcnRlci5sb2coJ0VtaXR0aW5nIEphdmFTY3JpcHQnKTsKICAgIGludCBwcm9ncmFtU2l6ZSA9IGJhY2tlbmRTdHJhdGVneS5hc3NlbWJsZVByb2dyYW0oY2xvc2VkV29ybGQsCiAgICAgICAgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cy5pbmZlcnJlZERhdGEsIGNvZGVnZW5JbnB1dHMsIGNvZGVnZW5Xb3JsZCk7CgogICAgaWYgKG9wdGlvbnMuZHVtcEluZm8pIHsKICAgICAgZHVtcEluZm9UYXNrLnJlcG9ydFNpemUocHJvZ3JhbVNpemUpOwogICAgICBkdW1wSW5mb1Rhc2suZHVtcEluZm8oY2xvc2VkV29ybGQsIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMpOwogICAgfQoKICAgIGJhY2tlbmRTdHJhdGVneS5vbkNvZGVnZW5FbmQoY29kZWdlbklucHV0cyk7CgogICAgY2hlY2tRdWV1ZShjb2RlZ2VuRW5xdWV1ZXIpOwogIH0KCiAgdm9pZCBjb21waWxlRnJvbUtlcm5lbChVcmkgcm9vdExpYnJhcnlVcmksIEl0ZXJhYmxlPFVyaT4gbGlicmFyaWVzKSB7CiAgICBfdXNlckNvZGVMb2NhdGlvbnMuYWRkKG5ldyBDb2RlTG9jYXRpb24ocm9vdExpYnJhcnlVcmkpKTsKICAgIHNlbGZUYXNrLm1lYXN1cmVTdWJ0YXNrKCJjb21waWxlRnJvbUtlcm5lbCIsICgpIHsKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkID0gc2VsZlRhc2subWVhc3VyZVN1YnRhc2soImNvbXB1dGVDbG9zZWRXb3JsZCIsCiAgICAgICAgICAoKSA9PiBjb21wdXRlQ2xvc2VkV29ybGQocm9vdExpYnJhcnlVcmksIGxpYnJhcmllcykpOwogICAgICBpZiAoc3RvcEFmdGVyQ2xvc2VkV29ybGQpIHJldHVybjsKICAgICAgaWYgKGNsb3NlZFdvcmxkICE9IG51bGwpIHsKICAgICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzID0KICAgICAgICAgICAgcGVyZm9ybUdsb2JhbFR5cGVJbmZlcmVuY2UoY2xvc2VkV29ybGQpOwogICAgICAgIGlmIChvcHRpb25zLndyaXRlRGF0YVVyaSAhPSBudWxsKSB7CiAgICAgICAgICBzZXJpYWxpemF0aW9uVGFzawogICAgICAgICAgICAgIC5zZXJpYWxpemVHbG9iYWxUeXBlSW5mZXJlbmNlKGdsb2JhbEluZmVyZW5jZVJlc3VsdHMpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAob3B0aW9ucy50ZXN0TW9kZSkgewogICAgICAgICAgU2VyaWFsaXphdGlvblN0cmF0ZWd5IHN0cmF0ZWd5ID0KICAgICAgICAgICAgICBjb25zdCBCeXRlc0luTWVtb3J5U2VyaWFsaXphdGlvblN0cmF0ZWd5KCk7CiAgICAgICAgICBMaXN0PGludD4gaXJEYXRhID0KICAgICAgICAgICAgICBzdHJhdGVneS5zZXJpYWxpemVDb21wb25lbnQoZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgICAgICAgICBMaXN0IHdvcmxkRGF0YSA9IHN0cmF0ZWd5LnNlcmlhbGl6ZURhdGEoZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgICAgICAgICBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzID0gc3RyYXRlZ3kuZGVzZXJpYWxpemVEYXRhKAogICAgICAgICAgICAgIG9wdGlvbnMsCiAgICAgICAgICAgICAgcmVwb3J0ZXIsCiAgICAgICAgICAgICAgZW52aXJvbm1lbnQsCiAgICAgICAgICAgICAgYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5LAogICAgICAgICAgICAgIHN0cmF0ZWd5LmRlc2VyaWFsaXplQ29tcG9uZW50KGlyRGF0YSksCiAgICAgICAgICAgICAgd29ybGREYXRhKTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0b3BBZnRlclR5cGVJbmZlcmVuY2UpIHJldHVybjsKICAgICAgICBnZW5lcmF0ZUphdmFTY3JpcHRDb2RlKGdsb2JhbEluZmVyZW5jZVJlc3VsdHMpOwogICAgICB9CiAgICB9KTsKICB9CgogIC8vLyBQZXJmb3JtIHRoZSBzdGVwcyBuZWVkZWQgdG8gZnVsbHkgZW5kIHRoZSByZXNvbHV0aW9uIHBoYXNlLgogIEpDbG9zZWRXb3JsZCBjbG9zZVJlc29sdXRpb24oRnVuY3Rpb25FbnRpdHkgbWFpbkZ1bmN0aW9uKSB7CiAgICBwaGFzZSA9IFBIQVNFX0RPTkVfUkVTT0xWSU5HOwoKICAgIEtDbG9zZWRXb3JsZCBrQ2xvc2VkV29ybGQgPSByZXNvbHV0aW9uV29ybGRCdWlsZGVyLmNsb3NlV29ybGQocmVwb3J0ZXIpOwogICAgT3V0cHV0VW5pdERhdGEgcmVzdWx0ID0gZGVmZXJyZWRMb2FkVGFzay5ydW4obWFpbkZ1bmN0aW9uLCBrQ2xvc2VkV29ybGQpOwogICAgSkNsb3NlZFdvcmxkIGpDbG9zZWRXb3JsZCA9CiAgICAgICAgYmFja2VuZFN0cmF0ZWd5LmNyZWF0ZUpDbG9zZWRXb3JsZChrQ2xvc2VkV29ybGQsIHJlc3VsdCk7CiAgICByZXR1cm4gakNsb3NlZFdvcmxkOwogIH0KCiAgLy8vIEVtcHR5IHRoZSBbZW5xdWV1ZXJdIHF1ZXVlLgogIHZvaWQgZW1wdHlRdWV1ZShFbnF1ZXVlciBlbnF1ZXVlciwge3ZvaWQgb25Qcm9ncmVzcyhFbnF1ZXVlciBlbnF1ZXVlcil9KSB7CiAgICBzZWxmVGFzay5tZWFzdXJlU3VidGFzaygiZW1wdHlRdWV1ZSIsICgpIHsKICAgICAgZW5xdWV1ZXIuZm9yRWFjaCgoV29ya0l0ZW0gd29yaykgewogICAgICAgIGlmIChvblByb2dyZXNzICE9IG51bGwpIHsKICAgICAgICAgIG9uUHJvZ3Jlc3MoZW5xdWV1ZXIpOwogICAgICAgIH0KICAgICAgICByZXBvcnRlci53aXRoQ3VycmVudEVsZW1lbnQoCiAgICAgICAgICAgIHdvcmsuZWxlbWVudCwKICAgICAgICAgICAgKCkgPT4gc2VsZlRhc2subWVhc3VyZVN1YnRhc2soImFwcGx5SW1wYWN0IiwgKCkgewogICAgICAgICAgICAgICAgICBlbnF1ZXVlci5hcHBseUltcGFjdCgKICAgICAgICAgICAgICAgICAgICAgIHNlbGZUYXNrLm1lYXN1cmVTdWJ0YXNrKCJ3b3JrLnJ1biIsICgpID0+IHdvcmsucnVuKCkpLAogICAgICAgICAgICAgICAgICAgICAgaW1wYWN0U291cmNlOiB3b3JrLmVsZW1lbnQpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgdm9pZCBwcm9jZXNzUXVldWUoRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCwgRW5xdWV1ZXIgZW5xdWV1ZXIsCiAgICAgIEZ1bmN0aW9uRW50aXR5IG1haW5NZXRob2QsCiAgICAgIHt2b2lkIG9uUHJvZ3Jlc3MoRW5xdWV1ZXIgZW5xdWV1ZXIpfSkgewogICAgc2VsZlRhc2subWVhc3VyZVN1YnRhc2soInByb2Nlc3NRdWV1ZSIsICgpIHsKICAgICAgZW5xdWV1ZXIub3BlbigKICAgICAgICAgIGltcGFjdFN0cmF0ZWd5LAogICAgICAgICAgbWFpbk1ldGhvZCwKICAgICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudC5saWJyYXJpZXMKICAgICAgICAgICAgICAubWFwKChMaWJyYXJ5RW50aXR5IGxpYnJhcnkpID0+IGxpYnJhcnkuY2Fub25pY2FsVXJpKSk7CiAgICAgIHByb2dyZXNzLnN0YXJ0UGhhc2UoKTsKICAgICAgZW1wdHlRdWV1ZShlbnF1ZXVlciwgb25Qcm9ncmVzczogb25Qcm9ncmVzcyk7CiAgICAgIGVucXVldWVyLnF1ZXVlSXNDbG9zZWQgPSB0cnVlOwogICAgICBlbnF1ZXVlci5jbG9zZSgpOwogICAgICAvLyBOb3RpZnkgdGhlIGltcGFjdCBzdHJhdGVneSBpbXBhY3RzIGFyZSBubyBsb25nZXIgbmVlZGVkIGZvciB0aGlzCiAgICAgIC8vIGVucXVldWVyLgogICAgICBpbXBhY3RTdHJhdGVneS5vbkltcGFjdFVzZWQoZW5xdWV1ZXIuaW1wYWN0VXNlKTsKICAgICAgYXNzZXJ0KGNvbXBpbGF0aW9uRmFpbGVkIHx8CiAgICAgICAgICBlbnF1ZXVlci5jaGVja05vRW5xdWV1ZWRJbnZva2VkSW5zdGFuY2VNZXRob2RzKGVsZW1lbnRFbnZpcm9ubWVudCkpOwogICAgfSk7CiAgfQoKICAvLy8gUGVyZm9ybSB2YXJpb3VzIGNoZWNrcyBvZiB0aGUgcXVldWUuIFRoaXMgaW5jbHVkZXMgY2hlY2tpbmcgdGhhdCB0aGUKICAvLy8gcXVldWVzIGFyZSBlbXB0eSAobm90aGluZyB3YXMgYWRkZWQgYWZ0ZXIgd2Ugc3RvcHBlZCBwcm9jZXNzaW5nIHRoZQogIC8vLyBxdWV1ZXMpLgogIGNoZWNrUXVldWUoRW5xdWV1ZXIgZW5xdWV1ZXIpIHsKICAgIGVucXVldWVyLmNoZWNrUXVldWVJc0VtcHR5KCk7CiAgfQoKICB2b2lkIHNob3dSZXNvbHV0aW9uUHJvZ3Jlc3MoRW5xdWV1ZXIgZW5xdWV1ZXIpIHsKICAgIGFzc2VydChwaGFzZSA9PSBQSEFTRV9SRVNPTFZJTkcsICdVbmV4cGVjdGVkIHBoYXNlOiAkcGhhc2UnKTsKICAgIHByb2dyZXNzLnNob3dQcm9ncmVzcygKICAgICAgICAnUmVzb2x2ZWQgJywgZW5xdWV1ZXIucHJvY2Vzc2VkRW50aXRpZXMubGVuZ3RoLCAnIGVsZW1lbnRzLicpOwogIH0KCiAgdm9pZCBzaG93Q29kZWdlblByb2dyZXNzKEVucXVldWVyIGVucXVldWVyKSB7CiAgICBwcm9ncmVzcy5zaG93UHJvZ3Jlc3MoCiAgICAgICAgJ0NvbXBpbGVkICcsIGVucXVldWVyLnByb2Nlc3NlZEVudGl0aWVzLmxlbmd0aCwgJyBtZXRob2RzLicpOwogIH0KCiAgdm9pZCByZXBvcnREaWFnbm9zdGljKERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIExpc3Q8RGlhZ25vc3RpY01lc3NhZ2U+IGluZm9zLCBhcGkuRGlhZ25vc3RpYyBraW5kKTsKCiAgdm9pZCByZXBvcnRDcmFzaEluVXNlckNvZGUoU3RyaW5nIG1lc3NhZ2UsIGV4Y2VwdGlvbiwgc3RhY2tUcmFjZSkgewogICAgcmVwb3J0ZXIub25DcmFzaEluVXNlckNvZGUobWVzc2FnZSwgZXhjZXB0aW9uLCBzdGFja1RyYWNlKTsKICB9CgogIC8vLyBNZXNzYWdlcyBmb3Igd2hpY2ggY29tcGlsZS10aW1lIGVycm9ycyBhcmUgcmVwb3J0ZWQgYnV0IGNvbXBpbGF0aW9uCiAgLy8vIGNvbnRpbnVlcyByZWdhcmRsZXNzLgogIHN0YXRpYyBjb25zdCBMaXN0PE1lc3NhZ2VLaW5kPiBCRU5JR05fRVJST1JTID0gY29uc3QgPE1lc3NhZ2VLaW5kPlsKICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfTUVUQURBVEEsCiAgICBNZXNzYWdlS2luZC5JTlZBTElEX01FVEFEQVRBX0dFTkVSSUMsCiAgXTsKCiAgYm9vbCBtYXJrQ29tcGlsYXRpb25Bc0ZhaWxlZChEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlLCBhcGkuRGlhZ25vc3RpYyBraW5kKSB7CiAgICBpZiAob3B0aW9ucy50ZXN0TW9kZSkgewogICAgICAvLyBXaGVuIGluIHRlc3QgbW9kZSwgaS5lLiBvbiB0aGUgYnVpbGQtYm90LCB3ZSBhbHdheXMgc3RvcCBjb21waWxhdGlvbi4KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAocmVwb3J0ZXIub3B0aW9ucy5mYXRhbFdhcm5pbmdzKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuICFCRU5JR05fRVJST1JTLmNvbnRhaW5zKG1lc3NhZ2UubWVzc2FnZS5raW5kKTsKICB9CgogIHZvaWQgZmF0YWxEaWFnbm9zdGljUmVwb3J0ZWQoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSwKICAgICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MsIGFwaS5EaWFnbm9zdGljIGtpbmQpIHsKICAgIGlmIChtYXJrQ29tcGlsYXRpb25Bc0ZhaWxlZChtZXNzYWdlLCBraW5kKSkgewogICAgICBjb21waWxhdGlvbkZhaWxlZCA9IHRydWU7CiAgICB9CiAgfQoKICAvLy8gSGVscGVyIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgZGVjbGFyZWQgd2l0aGluCiAgLy8vICd1c2VyIGNvZGUnLgogIC8vLwogIC8vLyBTZWUgW2luVXNlckNvZGVdIGZvciB3aGF0IGRlZmluZXMgJ3VzZXIgY29kZScuCiAgYm9vbCBjdXJyZW50bHlJblVzZXJDb2RlKCkgewogICAgcmV0dXJuIGluVXNlckNvZGUoY3VycmVudEVsZW1lbnQpOwogIH0KCiAgLy8vIEhlbHBlciBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBbZWxlbWVudF0gaXMgZGVjbGFyZWQgd2l0aGluICd1c2VyIGNvZGUnLgogIC8vLwogIC8vLyBXaGF0IGNvbnN0aXR1dGVzICd1c2VyIGNvZGUnIGlzIGRlZmluZWQgYnkgdGhlIFVSSShzKSBwcm92aWRlZCBieSB0aGUKICAvLy8gZW50cnkgcG9pbnQocykgb2YgY29tcGlsYXRpb24gb3IgYW5hbHlzaXM6CiAgLy8vCiAgLy8vIElmIGFuIGVudHJ5cG9pbnQgVVJJIHVzZXMgdGhlICdwYWNrYWdlJyBzY2hlbWUgdGhlbiBldmVyeSBsaWJyYXJ5IGZyb20KICAvLy8gdGhhdCBzYW1lIHBhY2thZ2UgaXMgY29uc2lkZXJlZCB0byBiZSBpbiB1c2VyIGNvZGUuIEZvciBpbnN0YW5jZSwgaWYKICAvLy8gYW4gZW50cnkgcG9pbnQgVVJJIGlzICdwYWNrYWdlOmZvby9iYXIuZGFydCcgdGhlbiBldmVyeSBsaWJyYXJ5IHdob3NlCiAgLy8vIGNhbm9uaWNhbCBVUkkgc3RhcnRzIHdpdGggJ3BhY2thZ2U6Zm9vLycgaXMgaW4gdXNlciBjb2RlLgogIC8vLwogIC8vLyBJZiBhbiBlbnRyeXBvaW50IFVSSSB1c2VzIGFub3RoZXIgc2NoZW1lIHRoYW4gJ3BhY2thZ2UnIHRoZW4gZXZlcnkgbGlicmFyeQogIC8vLyB3aXRoIHRoYXQgc2NoZW1lIGlzIGluIHVzZXIgY29kZS4gRm9yIGluc3RhbmNlLCBhbiBlbnRyeSBwb2ludCBVUkkgaXMKICAvLy8gJ2ZpbGU6Ly8vZm9vLmRhcnQnIHRoZW4gZXZlcnkgbGlicmFyeSB3aG9zZSBjYW5vbmljYWwgVVJJIHNjaGVtZSBpcwogIC8vLyAnZmlsZScgaXMgaW4gdXNlciBjb2RlLgogIC8vLwogIC8vLyBJZiBbYXNzdW1lSW5Vc2VyQ29kZV0gaXMgYHRydWVgLCBbZWxlbWVudF0gaXMgYXNzdW1lZCB0byBiZSBpbiB1c2VyIGNvZGUKICAvLy8gaWYgbm8gZW50cnlwb2ludHMgaGF2ZSBiZWVuIHNldC4KICBib29sIGluVXNlckNvZGUoRW50aXR5IGVsZW1lbnQsIHtib29sIGFzc3VtZUluVXNlckNvZGU6IGZhbHNlfSkgewogICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIGFzc3VtZUluVXNlckNvZGU7CiAgICBVcmkgbGlicmFyeVVyaSA9IF91cmlGcm9tRWxlbWVudChlbGVtZW50KTsKICAgIGlmIChsaWJyYXJ5VXJpID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIGlmIChfdXNlckNvZGVMb2NhdGlvbnMuaXNFbXB0eSAmJiBhc3N1bWVJblVzZXJDb2RlKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBfdXNlckNvZGVMb2NhdGlvbnMuYW55KAogICAgICAgIChDb2RlTG9jYXRpb24gY29kZUxvY2F0aW9uKSA9PiBjb2RlTG9jYXRpb24uaW5TYW1lTG9jYXRpb24obGlicmFyeVVyaSkpOwogIH0KCiAgLy8vIFJldHVybiBhIGNhbm9uaWNhbCBVUkkgZm9yIHRoZSBzb3VyY2Ugb2YgW2VsZW1lbnRdLgogIC8vLwogIC8vLyBGb3IgYSBwYWNrYWdlIGxpYnJhcnkgd2l0aCBjYW5vbmljYWwgVVJJICdwYWNrYWdlOmZvby9iYXIvYmF6LmRhcnQnIHRoZQogIC8vLyByZXR1cm4gVVJJIGlzICdwYWNrYWdlOmZvbycuIEZvciBub24tcGFja2FnZSBsaWJyYXJpZXMgdGhlIHJldHVybmVkIFVSSSBpcwogIC8vLyB0aGUgY2Fub25pY2FsIFVSSSBvZiB0aGUgbGlicmFyeSBpdHNlbGYuCiAgVXJpIGdldENhbm9uaWNhbFVyaShFbnRpdHkgZWxlbWVudCkgewogICAgVXJpIGxpYnJhcnlVcmkgPSBfdXJpRnJvbUVsZW1lbnQoZWxlbWVudCk7CiAgICBpZiAobGlicmFyeVVyaSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChsaWJyYXJ5VXJpLnNjaGVtZSA9PSAncGFja2FnZScpIHsKICAgICAgaW50IHNsYXNoUG9zID0gbGlicmFyeVVyaS5wYXRoLmluZGV4T2YoJy8nKTsKICAgICAgaWYgKHNsYXNoUG9zICE9IC0xKSB7CiAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbGlicmFyeVVyaS5wYXRoLnN1YnN0cmluZygwLCBzbGFzaFBvcyk7CiAgICAgICAgcmV0dXJuIG5ldyBVcmkoc2NoZW1lOiAncGFja2FnZScsIHBhdGg6IHBhY2thZ2VOYW1lKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGxpYnJhcnlVcmk7CiAgfQoKICBVcmkgX3VyaUZyb21FbGVtZW50KEVudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoZWxlbWVudCBpcyBMaWJyYXJ5RW50aXR5KSB7CiAgICAgIHJldHVybiBlbGVtZW50LmNhbm9uaWNhbFVyaTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpcyBDbGFzc0VudGl0eSkgewogICAgICByZXR1cm4gZWxlbWVudC5saWJyYXJ5LmNhbm9uaWNhbFVyaTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpcyBNZW1iZXJFbnRpdHkpIHsKICAgICAgcmV0dXJuIGVsZW1lbnQubGlicmFyeS5jYW5vbmljYWxVcmk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmNsYXNzIF9Db21waWxlck91dHB1dCBpbXBsZW1lbnRzIGFwaS5Db21waWxlck91dHB1dCB7CiAgZmluYWwgQ29tcGlsZXIgX2NvbXBpbGVyOwogIGZpbmFsIGFwaS5Db21waWxlck91dHB1dCBfdXNlck91dHB1dDsKCiAgX0NvbXBpbGVyT3V0cHV0KHRoaXMuX2NvbXBpbGVyLCBhcGkuQ29tcGlsZXJPdXRwdXQgb3V0cHV0KQogICAgICA6IHRoaXMuX3VzZXJPdXRwdXQgPSBvdXRwdXQgPz8gY29uc3QgTnVsbENvbXBpbGVyT3V0cHV0KCk7CgogIEBvdmVycmlkZQogIGFwaS5PdXRwdXRTaW5rIGNyZWF0ZU91dHB1dFNpbmsoCiAgICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgZXh0ZW5zaW9uLCBhcGkuT3V0cHV0VHlwZSB0eXBlKSB7CiAgICBpZiAoX2NvbXBpbGVyLmNvbXBpbGF0aW9uRmFpbGVkKSB7CiAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGRvbid0IGVtaXQgb3V0cHV0IHdoZW4gdGhlIGNvbXBpbGF0aW9uIGhhcyBmYWlsZWQuCiAgICAgIHJldHVybiBjb25zdCBOdWxsQ29tcGlsZXJPdXRwdXQoKS5jcmVhdGVPdXRwdXRTaW5rKG5hbWUsIGV4dGVuc2lvbiwgdHlwZSk7CiAgICB9CiAgICByZXR1cm4gX3VzZXJPdXRwdXQuY3JlYXRlT3V0cHV0U2luayhuYW1lLCBleHRlbnNpb24sIHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYXBpLkJpbmFyeU91dHB1dFNpbmsgY3JlYXRlQmluYXJ5U2luayhVcmkgdXJpKSB7CiAgICByZXR1cm4gX3VzZXJPdXRwdXQuY3JlYXRlQmluYXJ5U2luayh1cmkpOwogIH0KfQoKLy8vIEluZm9ybWF0aW9uIGFib3V0IHN1cHByZXNzZWQgd2FybmluZ3MgYW5kIGhpbnRzIGZvciBhIGdpdmVuIGxpYnJhcnkuCmNsYXNzIFN1cHByZXNzaW9uSW5mbyB7CiAgaW50IHdhcm5pbmdzID0gMDsKICBpbnQgaGludHMgPSAwOwp9CgpjbGFzcyBDb21waWxlckRpYWdub3N0aWNSZXBvcnRlciBleHRlbmRzIERpYWdub3N0aWNSZXBvcnRlciB7CiAgZmluYWwgQ29tcGlsZXIgY29tcGlsZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgRGlhZ25vc3RpY09wdGlvbnMgb3B0aW9uczsKCiAgRW50aXR5IF9jdXJyZW50RWxlbWVudDsKICBib29sIGhhc0NyYXNoZWQgPSBmYWxzZTsKCiAgLy8vIGB0cnVlYCBpZiB0aGUgbGFzdCBkaWFnbm9zdGljIHdhcyBmaWx0ZXJlZCwgaW4gd2hpY2ggY2FzZSB0aGUKICAvLy8gYWNjb21wYW55aW5nIGluZm8gbWVzc2FnZSBzaG91bGQgYmUgZmlsdGVyZWQgYXMgd2VsbC4KICBib29sIGxhc3REaWFnbm9zdGljV2FzRmlsdGVyZWQgPSBmYWxzZTsKCiAgLy8vIE1hcCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3YXJuaW5ncyBhbmQgaGludHMgdGhhdCBoYXZlIGJlZW4KICAvLy8gc3VwcHJlc3NlZCBmb3IgZWFjaCBsaWJyYXJ5LgogIE1hcDxVcmksIFN1cHByZXNzaW9uSW5mbz4gc3VwcHJlc3NlZFdhcm5pbmdzID0gPFVyaSwgU3VwcHJlc3Npb25JbmZvPnt9OwoKICBDb21waWxlckRpYWdub3N0aWNSZXBvcnRlcih0aGlzLmNvbXBpbGVyLCB0aGlzLm9wdGlvbnMpOwoKICBFbnRpdHkgZ2V0IGN1cnJlbnRFbGVtZW50ID0+IF9jdXJyZW50RWxlbWVudDsKCiAgQG92ZXJyaWRlCiAgRGlhZ25vc3RpY01lc3NhZ2UgY3JlYXRlTWVzc2FnZShTcGFubmFibGUgc3Bhbm5hYmxlLCBNZXNzYWdlS2luZCBtZXNzYWdlS2luZCwKICAgICAgW01hcCBhcmd1bWVudHMgPSBjb25zdCB7fV0pIHsKICAgIFNvdXJjZVNwYW4gc3BhbiA9IHNwYW5Gcm9tU3Bhbm5hYmxlKHNwYW5uYWJsZSk7CiAgICBNZXNzYWdlVGVtcGxhdGUgdGVtcGxhdGUgPSBNZXNzYWdlVGVtcGxhdGUuVEVNUExBVEVTW21lc3NhZ2VLaW5kXTsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlLm1lc3NhZ2UoYXJndW1lbnRzLCBvcHRpb25zLnRlcnNlRGlhZ25vc3RpY3MpOwogICAgcmV0dXJuIG5ldyBEaWFnbm9zdGljTWVzc2FnZShzcGFuLCBzcGFubmFibGUsIG1lc3NhZ2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnRFcnJvcihEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlLAogICAgICBbTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MgPSBjb25zdCA8RGlhZ25vc3RpY01lc3NhZ2U+W11dKSB7CiAgICByZXBvcnREaWFnbm9zdGljSW50ZXJuYWwobWVzc2FnZSwgaW5mb3MsIGFwaS5EaWFnbm9zdGljLkVSUk9SKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVwb3J0V2FybmluZyhEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlLAogICAgICBbTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MgPSBjb25zdCA8RGlhZ25vc3RpY01lc3NhZ2U+W11dKSB7CiAgICByZXBvcnREaWFnbm9zdGljSW50ZXJuYWwobWVzc2FnZSwgaW5mb3MsIGFwaS5EaWFnbm9zdGljLldBUk5JTkcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnRIaW50KERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIFtMaXN0PERpYWdub3N0aWNNZXNzYWdlPiBpbmZvcyA9IGNvbnN0IDxEaWFnbm9zdGljTWVzc2FnZT5bXV0pIHsKICAgIHJlcG9ydERpYWdub3N0aWNJbnRlcm5hbChtZXNzYWdlLCBpbmZvcywgYXBpLkRpYWdub3N0aWMuSElOVCk7CiAgfQoKICBAZGVwcmVjYXRlZAogIEBvdmVycmlkZQogIHZvaWQgcmVwb3J0SW5mbyhTcGFubmFibGUgbm9kZSwgTWVzc2FnZUtpbmQgbWVzc2FnZUtpbmQsCiAgICAgIFtNYXAgYXJndW1lbnRzID0gY29uc3Qge31dKSB7CiAgICByZXBvcnREaWFnbm9zdGljSW50ZXJuYWwoY3JlYXRlTWVzc2FnZShub2RlLCBtZXNzYWdlS2luZCwgYXJndW1lbnRzKSwKICAgICAgICBjb25zdCA8RGlhZ25vc3RpY01lc3NhZ2U+W10sIGFwaS5EaWFnbm9zdGljLklORk8pOwogIH0KCiAgdm9pZCByZXBvcnREaWFnbm9zdGljSW50ZXJuYWwoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSwKICAgICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MsIGFwaS5EaWFnbm9zdGljIGtpbmQpIHsKICAgIGlmICghb3B0aW9ucy5zaG93QWxsUGFja2FnZVdhcm5pbmdzICYmCiAgICAgICAgbWVzc2FnZS5zcGFubmFibGUgIT0gTk9fTE9DQVRJT05fU1BBTk5BQkxFKSB7CiAgICAgIHN3aXRjaCAoa2luZCkgewogICAgICAgIGNhc2UgYXBpLkRpYWdub3N0aWMuV0FSTklORzoKICAgICAgICBjYXNlIGFwaS5EaWFnbm9zdGljLkhJTlQ6CiAgICAgICAgICBFbnRpdHkgZWxlbWVudCA9IGVsZW1lbnRGcm9tU3Bhbm5hYmxlKG1lc3NhZ2Uuc3Bhbm5hYmxlKTsKICAgICAgICAgIGlmICghY29tcGlsZXIuaW5Vc2VyQ29kZShlbGVtZW50LCBhc3N1bWVJblVzZXJDb2RlOiB0cnVlKSkgewogICAgICAgICAgICBVcmkgdXJpID0gY29tcGlsZXIuZ2V0Q2Fub25pY2FsVXJpKGVsZW1lbnQpOwogICAgICAgICAgICBpZiAob3B0aW9ucy5zaG93UGFja2FnZVdhcm5pbmdzRm9yKHVyaSkpIHsKICAgICAgICAgICAgICByZXBvcnREaWFnbm9zdGljKG1lc3NhZ2UsIGluZm9zLCBraW5kKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3VwcHJlc3Npb25JbmZvIGluZm8gPSBzdXBwcmVzc2VkV2FybmluZ3MucHV0SWZBYnNlbnQoCiAgICAgICAgICAgICAgICB1cmksICgpID0+IG5ldyBTdXBwcmVzc2lvbkluZm8oKSk7CiAgICAgICAgICAgIGlmIChraW5kID09IGFwaS5EaWFnbm9zdGljLldBUk5JTkcpIHsKICAgICAgICAgICAgICBpbmZvLndhcm5pbmdzKys7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaW5mby5oaW50cysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhc3REaWFnbm9zdGljV2FzRmlsdGVyZWQgPSB0cnVlOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIGFwaS5EaWFnbm9zdGljLklORk86CiAgICAgICAgICBpZiAobGFzdERpYWdub3N0aWNXYXNGaWx0ZXJlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgbGFzdERpYWdub3N0aWNXYXNGaWx0ZXJlZCA9IGZhbHNlOwogICAgcmVwb3J0RGlhZ25vc3RpYyhtZXNzYWdlLCBpbmZvcywga2luZCk7CiAgfQoKICB2b2lkIHJlcG9ydERpYWdub3N0aWMoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSwKICAgICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MsIGFwaS5EaWFnbm9zdGljIGtpbmQpIHsKICAgIGNvbXBpbGVyLnJlcG9ydERpYWdub3N0aWMobWVzc2FnZSwgaW5mb3MsIGtpbmQpOwogICAgaWYgKGtpbmQgPT0gYXBpLkRpYWdub3N0aWMuRVJST1IgfHwKICAgICAgICBraW5kID09IGFwaS5EaWFnbm9zdGljLkNSQVNIIHx8CiAgICAgICAgKG9wdGlvbnMuZmF0YWxXYXJuaW5ncyAmJiBraW5kID09IGFwaS5EaWFnbm9zdGljLldBUk5JTkcpKSB7CiAgICAgIGNvbXBpbGVyLmZhdGFsRGlhZ25vc3RpY1JlcG9ydGVkKG1lc3NhZ2UsIGluZm9zLCBraW5kKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGhhc1JlcG9ydGVkRXJyb3IgPT4gY29tcGlsZXIuY29tcGlsYXRpb25GYWlsZWQ7CgogIC8vLyBQZXJmb3JtIGFuIG9wZXJhdGlvbiwgW2ZdLCByZXR1cm5pbmcgdGhlIHJldHVybiB2YWx1ZSBmcm9tIFtmXS4gIElmIGFuCiAgLy8vIGVycm9yIG9jY3VycyB0aGVuIHJlcG9ydCBpdCBhcyBoYXZpbmcgb2NjdXJyZWQgZHVyaW5nIGNvbXBpbGF0aW9uIG9mCiAgLy8vIFtlbGVtZW50XS4gIENhbiBiZSBuZXN0ZWQuCiAgQG92ZXJyaWRlCiAgd2l0aEN1cnJlbnRFbGVtZW50KEVudGl0eSBlbGVtZW50LCBmKCkpIHsKICAgIEVudGl0eSBvbGQgPSBjdXJyZW50RWxlbWVudDsKICAgIF9jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7CiAgICB0cnkgewogICAgICByZXR1cm4gZigpOwogICAgfSBvbiBTcGFubmFibGVBc3NlcnRpb25GYWlsdXJlIGNhdGNoIChleCkgewogICAgICBpZiAoIWhhc0NyYXNoZWQpIHsKICAgICAgICByZXBvcnRBc3NlcnRpb25GYWlsdXJlKGV4KTsKICAgICAgICBwbGVhc2VSZXBvcnRDcmFzaCgpOwogICAgICB9CiAgICAgIGhhc0NyYXNoZWQgPSB0cnVlOwogICAgICByZXRocm93OwogICAgfSBvbiBTdGFja092ZXJmbG93RXJyb3IgewogICAgICAvLyBXZSBjYW5ub3QgcmVwb3J0IGFueXRoaW5nIHVzZWZ1bCBpbiB0aGlzIGNhc2UsIGJlY2F1c2Ugd2UKICAgICAgLy8gZG8gbm90IGhhdmUgZW5vdWdoIHN0YWNrIHNwYWNlLgogICAgICByZXRocm93OwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGhhc0NyYXNoZWQpIHJldGhyb3c7CiAgICAgIHRyeSB7CiAgICAgICAgdW5oYW5kbGVkRXhjZXB0aW9uT25FbGVtZW50KGVsZW1lbnQpOwogICAgICB9IGNhdGNoIChkb3VibGVGYXVsdCkgewogICAgICAgIC8vIElnbm9yaW5nIGV4Y2VwdGlvbnMgaW4gZXhjZXB0aW9uIGhhbmRsaW5nLgogICAgICB9CiAgICAgIHJldGhyb3c7CiAgICB9IGZpbmFsbHkgewogICAgICBfY3VycmVudEVsZW1lbnQgPSBvbGQ7CiAgICB9CiAgfQoKICB2b2lkIHJlcG9ydEFzc2VydGlvbkZhaWx1cmUoU3Bhbm5hYmxlQXNzZXJ0aW9uRmFpbHVyZSBleCkgewogICAgU3RyaW5nIG1lc3NhZ2UgPQogICAgICAgIChleC5tZXNzYWdlICE9IG51bGwpID8gdHJ5VG9TdHJpbmcoZXgubWVzc2FnZSkgOiB0cnlUb1N0cmluZyhleCk7CiAgICByZXBvcnREaWFnbm9zdGljSW50ZXJuYWwoCiAgICAgICAgY3JlYXRlTWVzc2FnZShleC5ub2RlLCBNZXNzYWdlS2luZC5HRU5FUklDLCB7J3RleHQnOiBtZXNzYWdlfSksCiAgICAgICAgY29uc3QgPERpYWdub3N0aWNNZXNzYWdlPltdLAogICAgICAgIGFwaS5EaWFnbm9zdGljLkNSQVNIKTsKICB9CgogIC8vLyBVc2luZyBbZnJvbnRlbmRTdHJhdGVneV0gdG8gY29tcHV0ZSBhIFtTb3VyY2VTcGFuXSBmcm9tIHNwYW5uYWJsZSB1c2luZwogIC8vLyB0aGUgW2N1cnJlbnRFbGVtZW50XSBhcyBjb250ZXh0LgogIFNvdXJjZVNwYW4gX3NwYW5Gcm9tU3RyYXRlZ3koU3Bhbm5hYmxlIHNwYW5uYWJsZSkgewogICAgU291cmNlU3BhbiBzcGFuOwogICAgaWYgKGNvbXBpbGVyLnBoYXNlID09IENvbXBpbGVyLlBIQVNFX0NPTVBJTElORykgewogICAgICBzcGFuID0KICAgICAgICAgIGNvbXBpbGVyLmJhY2tlbmRTdHJhdGVneS5zcGFuRnJvbVNwYW5uYWJsZShzcGFubmFibGUsIGN1cnJlbnRFbGVtZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHNwYW4gPSBjb21waWxlci5mcm9udGVuZFN0cmF0ZWd5CiAgICAgICAgICAuc3BhbkZyb21TcGFubmFibGUoc3Bhbm5hYmxlLCBjdXJyZW50RWxlbWVudCk7CiAgICB9CiAgICBpZiAoc3BhbiAhPSBudWxsKSByZXR1cm4gc3BhbjsKICAgIHRocm93ICdObyBlcnJvciBsb2NhdGlvbi4nOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlU3BhbiBzcGFuRnJvbVNwYW5uYWJsZShTcGFubmFibGUgc3Bhbm5hYmxlKSB7CiAgICBpZiAoc3Bhbm5hYmxlID09IENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUpIHsKICAgICAgc3Bhbm5hYmxlID0gY3VycmVudEVsZW1lbnQ7CiAgICB9IGVsc2UgaWYgKHNwYW5uYWJsZSA9PSBOT19MT0NBVElPTl9TUEFOTkFCTEUpIHsKICAgICAgaWYgKGN1cnJlbnRFbGVtZW50ID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBzcGFubmFibGUgPSBjdXJyZW50RWxlbWVudDsKICAgIH0KICAgIGlmIChzcGFubmFibGUgaXMgU291cmNlU3BhbikgewogICAgICByZXR1cm4gc3Bhbm5hYmxlOwogICAgfSBlbHNlIGlmIChzcGFubmFibGUgaXMgSEluc3RydWN0aW9uKSB7CiAgICAgIEVudGl0eSBlbGVtZW50ID0gc3Bhbm5hYmxlLnNvdXJjZUVsZW1lbnQ7CiAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIGVsZW1lbnQgPSBjdXJyZW50RWxlbWVudDsKICAgICAgU291cmNlSW5mb3JtYXRpb24gcG9zaXRpb24gPSBzcGFubmFibGUuc291cmNlSW5mb3JtYXRpb247CiAgICAgIGlmIChwb3NpdGlvbiAhPSBudWxsKSByZXR1cm4gcG9zaXRpb24uc291cmNlU3BhbjsKICAgICAgcmV0dXJuIF9zcGFuRnJvbVN0cmF0ZWd5KGVsZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9zcGFuRnJvbVN0cmF0ZWd5KHNwYW5uYWJsZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnRlcm5hbEVycm9yKFNwYW5uYWJsZSBzcGFubmFibGUsIHJlYXNvbikgewogICAgU3RyaW5nIG1lc3NhZ2UgPSB0cnlUb1N0cmluZyhyZWFzb24pOwogICAgcmVwb3J0RGlhZ25vc3RpY0ludGVybmFsKAogICAgICAgIGNyZWF0ZU1lc3NhZ2Uoc3Bhbm5hYmxlLCBNZXNzYWdlS2luZC5HRU5FUklDLCB7J3RleHQnOiBtZXNzYWdlfSksCiAgICAgICAgY29uc3QgPERpYWdub3N0aWNNZXNzYWdlPltdLAogICAgICAgIGFwaS5EaWFnbm9zdGljLkNSQVNIKTsKICAgIHRocm93ICdJbnRlcm5hbCBFcnJvcjogJG1lc3NhZ2UnOwogIH0KCiAgdm9pZCB1bmhhbmRsZWRFeGNlcHRpb25PbkVsZW1lbnQoRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChoYXNDcmFzaGVkKSByZXR1cm47CiAgICBoYXNDcmFzaGVkID0gdHJ1ZTsKICAgIHJlcG9ydERpYWdub3N0aWMoY3JlYXRlTWVzc2FnZShlbGVtZW50LCBNZXNzYWdlS2luZC5DT01QSUxFUl9DUkFTSEVEKSwKICAgICAgICBjb25zdCA8RGlhZ25vc3RpY01lc3NhZ2U+W10sIGFwaS5EaWFnbm9zdGljLkNSQVNIKTsKICAgIHBsZWFzZVJlcG9ydENyYXNoKCk7CiAgfQoKICB2b2lkIHBsZWFzZVJlcG9ydENyYXNoKCkgewogICAgcHJpbnQoTWVzc2FnZVRlbXBsYXRlLlRFTVBMQVRFU1tNZXNzYWdlS2luZC5QTEVBU0VfUkVQT1JUX1RIRV9DUkFTSF0KICAgICAgICAubWVzc2FnZSh7J2J1aWxkSWQnOiBjb21waWxlci5vcHRpb25zLmJ1aWxkSWR9KSk7CiAgfQoKICAvLy8gRmluZHMgdGhlIGFwcHJveGltYXRlIFtFbGVtZW50XSBmb3IgW25vZGVdLiBbY3VycmVudEVsZW1lbnRdIGlzIHVzZWQgYXMKICAvLy8gdGhlIGRlZmF1bHQgdmFsdWUuCiAgRW50aXR5IGVsZW1lbnRGcm9tU3Bhbm5hYmxlKFNwYW5uYWJsZSBub2RlKSB7CiAgICBFbnRpdHkgZWxlbWVudDsKICAgIGlmIChub2RlIGlzIEVudGl0eSkgewogICAgICBlbGVtZW50ID0gbm9kZTsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBISW5zdHJ1Y3Rpb24pIHsKICAgICAgZWxlbWVudCA9IG5vZGUuc291cmNlRWxlbWVudDsKICAgIH0KICAgIHJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogY3VycmVudEVsZW1lbnQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGxvZyhtZXNzYWdlKSB7CiAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2VUZW1wbGF0ZS5URU1QTEFURVNbTWVzc2FnZUtpbmQuR0VORVJJQ10KICAgICAgICAubWVzc2FnZSh7J3RleHQnOiAnJG1lc3NhZ2UnfSk7CiAgICByZXBvcnREaWFnbm9zdGljKG5ldyBEaWFnbm9zdGljTWVzc2FnZShudWxsLCBudWxsLCBtc2cpLAogICAgICAgIGNvbnN0IDxEaWFnbm9zdGljTWVzc2FnZT5bXSwgYXBpLkRpYWdub3N0aWMuVkVSQk9TRV9JTkZPKTsKICB9CgogIFN0cmluZyB0cnlUb1N0cmluZyhvYmplY3QpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKICAgIH0gY2F0Y2ggKF8pIHsKICAgICAgcmV0dXJuICc8ZXhjZXB0aW9uIGluIHRvU3RyaW5nKCk+JzsKICAgIH0KICB9CgogIG9uRXJyb3IoVXJpIHVyaSwgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgdHJ5IHsKICAgICAgaWYgKCFoYXNDcmFzaGVkKSB7CiAgICAgICAgaGFzQ3Jhc2hlZCA9IHRydWU7CiAgICAgICAgaWYgKGVycm9yIGlzIFNwYW5uYWJsZUFzc2VydGlvbkZhaWx1cmUpIHsKICAgICAgICAgIHJlcG9ydEFzc2VydGlvbkZhaWx1cmUoZXJyb3IpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXBvcnREaWFnbm9zdGljKAogICAgICAgICAgICAgIGNyZWF0ZU1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgIG5ldyBTb3VyY2VTcGFuKHVyaSwgMCwgMCksIE1lc3NhZ2VLaW5kLkNPTVBJTEVSX0NSQVNIRUQpLAogICAgICAgICAgICAgIGNvbnN0IDxEaWFnbm9zdGljTWVzc2FnZT5bXSwKICAgICAgICAgICAgICBhcGkuRGlhZ25vc3RpYy5DUkFTSCk7CiAgICAgICAgfQogICAgICAgIHBsZWFzZVJlcG9ydENyYXNoKCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGRvdWJsZUZhdWx0KSB7CiAgICAgIC8vIElnbm9yaW5nIGV4Y2VwdGlvbnMgaW4gZXhjZXB0aW9uIGhhbmRsaW5nLgogICAgfQogICAgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBvbkNyYXNoSW5Vc2VyQ29kZShTdHJpbmcgbWVzc2FnZSwgZXhjZXB0aW9uLCBzdGFja1RyYWNlKSB7CiAgICBoYXNDcmFzaGVkID0gdHJ1ZTsKICAgIHByaW50KCckbWVzc2FnZTogJHt0cnlUb1N0cmluZyhleGNlcHRpb24pfScpOwogICAgcHJpbnQodHJ5VG9TdHJpbmcoc3RhY2tUcmFjZSkpOwogIH0KCiAgdm9pZCByZXBvcnRTdXBwcmVzc2VkTWVzc2FnZXNTdW1tYXJ5KCkgewogICAgaWYgKCFvcHRpb25zLnNob3dBbGxQYWNrYWdlV2FybmluZ3MgJiYgIW9wdGlvbnMuc3VwcHJlc3NXYXJuaW5ncykgewogICAgICBzdXBwcmVzc2VkV2FybmluZ3MuZm9yRWFjaCgoVXJpIHVyaSwgU3VwcHJlc3Npb25JbmZvIGluZm8pIHsKICAgICAgICBNZXNzYWdlS2luZCBraW5kID0gTWVzc2FnZUtpbmQuSElEREVOX1dBUk5JTkdTX0hJTlRTOwogICAgICAgIGlmIChpbmZvLndhcm5pbmdzID09IDApIHsKICAgICAgICAgIGtpbmQgPSBNZXNzYWdlS2luZC5ISURERU5fSElOVFM7CiAgICAgICAgfSBlbHNlIGlmIChpbmZvLmhpbnRzID09IDApIHsKICAgICAgICAgIGtpbmQgPSBNZXNzYWdlS2luZC5ISURERU5fV0FSTklOR1M7CiAgICAgICAgfQogICAgICAgIE1lc3NhZ2VUZW1wbGF0ZSB0ZW1wbGF0ZSA9IE1lc3NhZ2VUZW1wbGF0ZS5URU1QTEFURVNba2luZF07CiAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gdGVtcGxhdGUubWVzc2FnZSgKICAgICAgICAgICAgeyd3YXJuaW5ncyc6IGluZm8ud2FybmluZ3MsICdoaW50cyc6IGluZm8uaGludHMsICd1cmknOiB1cml9LAogICAgICAgICAgICBvcHRpb25zLnRlcnNlRGlhZ25vc3RpY3MpOwogICAgICAgIHJlcG9ydERpYWdub3N0aWMobmV3IERpYWdub3N0aWNNZXNzYWdlKG51bGwsIG51bGwsIG1lc3NhZ2UpLAogICAgICAgICAgICBjb25zdCA8RGlhZ25vc3RpY01lc3NhZ2U+W10sIGFwaS5EaWFnbm9zdGljLkhJTlQpOwogICAgICB9KTsKICAgIH0KICB9Cn0KCmNsYXNzIF9NYXBJbXBhY3RDYWNoZURlbGV0ZXIgaW1wbGVtZW50cyBJbXBhY3RDYWNoZURlbGV0ZXIgewogIGZpbmFsIE1hcDxFbnRpdHksIFdvcmxkSW1wYWN0PiBfaW1wYWN0Q2FjaGU7CiAgX01hcEltcGFjdENhY2hlRGVsZXRlcih0aGlzLl9pbXBhY3RDYWNoZSk7CgogIEBvdmVycmlkZQogIHZvaWQgdW5jYWNoZVdvcmxkSW1wYWN0KEVudGl0eSBlbGVtZW50KSB7CiAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHJldHVybjsKICAgIF9pbXBhY3RDYWNoZS5yZW1vdmUoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVtcHR5Q2FjaGUoKSB7CiAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHJldHVybjsKICAgIF9pbXBhY3RDYWNoZS5jbGVhcigpOwogIH0KfQoKY2xhc3MgX0VtcHR5RW52aXJvbm1lbnQgaW1wbGVtZW50cyBFbnZpcm9ubWVudCB7CiAgY29uc3QgX0VtcHR5RW52aXJvbm1lbnQoKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZhbHVlT2YoU3RyaW5nIGtleSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgTWFwPFN0cmluZywgU3RyaW5nPiB0b01hcCgpID0+IGNvbnN0IHt9Owp9CgovLy8gSW50ZXJmYWNlIGZvciBzaG93aW5nIHByb2dyZXNzIGR1cmluZyBjb21waWxhdGlvbi4KY2xhc3MgUHJvZ3Jlc3MgewogIGNvbnN0IFByb2dyZXNzKCk7CgogIC8vLyBTdGFydHMgYSBuZXcgcGhhc2UgZm9yIHdoaWNoIHRvIHNob3cgcHJvZ3Jlc3MuCiAgdm9pZCBzdGFydFBoYXNlKCkge30KCiAgLy8vIFNob3dzIHByb2dyZXNzIG9mIHRoZSBjdXJyZW50IHBoYXNlIGlmIG5lZWRlZC4gVGhlIHNob3duIG1lc3NhZ2UgaXMKICAvLy8gY29tcHV0ZWQgYXMgJyRwcmVmaXgkY291bnQkc3VmZml4Jy4KICB2b2lkIHNob3dQcm9ncmVzcyhTdHJpbmcgcHJlZml4LCBpbnQgY291bnQsIFN0cmluZyBzdWZmaXgpIHt9Cn0KCi8vLyBQcm9ncmVzcyBpbXBsZW1lbnRhdGlvbnMgdGhhdCBwcmludHMgcHJvZ3Jlc3MgdG8gdGhlIFtEaWFnbm9zdGljUmVwb3J0ZXJdCi8vLyB3aXRoIDUwMG1zIGludGVydmFscy4KY2xhc3MgUHJvZ3Jlc3NJbXBsIGltcGxlbWVudHMgUHJvZ3Jlc3MgewogIGZpbmFsIERpYWdub3N0aWNSZXBvcnRlciBfcmVwb3J0ZXI7CiAgZmluYWwgU3RvcHdhdGNoIF9zdG9wd2F0Y2ggPSBuZXcgU3RvcHdhdGNoKCkuLnN0YXJ0KCk7CgogIFByb2dyZXNzSW1wbCh0aGlzLl9yZXBvcnRlcik7CgogIEBvdmVycmlkZQogIHZvaWQgc2hvd1Byb2dyZXNzKFN0cmluZyBwcmVmaXgsIGludCBjb3VudCwgU3RyaW5nIHN1ZmZpeCkgewogICAgaWYgKF9zdG9wd2F0Y2guZWxhcHNlZE1pbGxpc2Vjb25kcyA+IDUwMCkgewogICAgICBfcmVwb3J0ZXIubG9nKCckcHJlZml4JGNvdW50JHN1ZmZpeCcpOwogICAgICBfc3RvcHdhdGNoLnJlc2V0KCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHN0YXJ0UGhhc2UoKSB7CiAgICBfc3RvcHdhdGNoLnJlc2V0KCk7CiAgfQp9CgovLy8gUHJvZ3Jlc3MgaW1wbGVtZW50YXRpb25zIHRoYXQgcHJpbnRzIHByb2dyZXNzIHRvIHRoZSBbRGlhZ25vc3RpY1JlcG9ydGVyXQovLy8gd2l0aCA1MDBtcyBpbnRlcnZhbHMgdXNpbmcgZXNjYXBlIHNlcXVlbmNlcyB0byBrZWVwIHRoZSBwcm9ncmVzcyBkYXRhIG9uIGEKLy8vIHNpbmdsZSBsaW5lLgpjbGFzcyBJbnRlcmFjdGl2ZVByb2dyZXNzIGltcGxlbWVudHMgUHJvZ3Jlc3MgewogIGZpbmFsIFN0b3B3YXRjaCBfc3RvcHdhdGNoUGhhc2UgPSBuZXcgU3RvcHdhdGNoKCkuLnN0YXJ0KCk7CiAgZmluYWwgU3RvcHdhdGNoIF9zdG9wd2F0Y2hJbnRlcnZhbCA9IG5ldyBTdG9wd2F0Y2goKS4uc3RhcnQoKTsKICBAb3ZlcnJpZGUKICB2b2lkIHN0YXJ0UGhhc2UoKSB7CiAgICBwcmludCgnJyk7CiAgICBfc3RvcHdhdGNoUGhhc2UucmVzZXQoKTsKICAgIF9zdG9wd2F0Y2hJbnRlcnZhbC5yZXNldCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzaG93UHJvZ3Jlc3MoU3RyaW5nIHByZWZpeCwgaW50IGNvdW50LCBTdHJpbmcgc3VmZml4KSB7CiAgICBpZiAoX3N0b3B3YXRjaEludGVydmFsLmVsYXBzZWRNaWxsaXNlY29u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bmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBUaGUgbWVzc2FnZXMgaW4gdGhpcyBmaWxlIHNob3VsZCBmb2xsb3cgdGhlIFtHdWlkZSBmb3IgV3JpdGluZwovLy8gRGlhZ25vc3RpY3NdKC4uLy4uLy4uLy4uL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2RpYWdub3N0aWNzLm1kKS4KLy8vCi8vLyBPdGhlciB0aGluZ3MgdG8ga2VlcCBpbiBtaW5kOgovLy8KLy8vIEFuIElORk8gbWVzc2FnZSBzaG91bGQgYWx3YXlzIGJlIHByZWNlZGVkIGJ5IGEgbm9uLUlORk8gbWVzc2FnZSwgYW5kIHRoZQovLy8gSU5GTyBtZXNzYWdlcyBhcmUgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoZSBwcmVjZWRpbmcgbm9uLUlORk8KLy8vIG1lc3NhZ2UuIEZvciBleGFtcGxlLCBjb25zaWRlciBkdXBsaWNhdGVkIGVsZW1lbnRzLiBGaXJzdCByZXBvcnQgYSBXQVJOSU5HCi8vLyBvciBFUlJPUiBhYm91dCB0aGUgZHVwbGljYXRlZCBlbGVtZW50LCBhbmQgdGhlbiByZXBvcnQgYW4gSU5GTyBhYm91dCB0aGUKLy8vIGxvY2F0aW9uIG9mIHRoZSBleGlzdGluZyBlbGVtZW50LgpsaWJyYXJ5IGRhcnQyanMubWVzc2FnZXM7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JyBzaG93IHRva2VuVG9TdHJpbmc7CgppbXBvcnQgJ2dlbmVyYXRlZC9zaGFyZWRfbWVzc2FnZXMuZGFydCcgYXMgc2hhcmVkX21lc3NhZ2VzOwppbXBvcnQgJy4uL2NvbnN0YW50cy9leHByZXNzaW9ucy5kYXJ0JyBzaG93IENvbnN0YW50RXhwcmVzc2lvbjsKaW1wb3J0ICcuLi9jb21tYW5kbGluZV9vcHRpb25zLmRhcnQnOwppbXBvcnQgJ2ludmFyaWFudC5kYXJ0JyBzaG93IGZhaWxlZEF0OwppbXBvcnQgJ3NwYW5uYWJsZS5kYXJ0JyBzaG93IENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEU7Cgpjb25zdCBET05UX0tOT1dfSE9XX1RPX0ZJWCA9ICJDb21wdXRlciBzYXlzIG5vISI7CgovLy8gS2V5cyBmb3IgdGhlIFtNZXNzYWdlVGVtcGxhdGVdcy4KZW51bSBNZXNzYWdlS2luZCB7CiAgQUJTVFJBQ1RfR0VUVEVSLAogIENBTk5PVF9SRVNPTFZFLAogIENPTVBJTEVSX0NSQVNIRUQsCiAgQ09NUExFWF9SRVRVUk5JTkdfTlNNLAogIENPTVBMRVhfVEhST1dJTkdfTlNNLAogIENPTlNUX0NPTlNUUlVDVE9SX1dJVEhfQk9EWSwKICBDT05TVF9GQUNUT1JZLAogIENPTlNUUlVDVE9SX1dJVEhfUkVUVVJOX1RZUEUsCiAgQ1lDTElDX0NPTVBJTEVfVElNRV9DT05TVEFOVFMsCiAgRElSRUNUTFlfVEhST1dJTkdfTlNNLAogIEVRVUFMX01BUF9FTlRSWV9LRVksCiAgRVFVQUxfU0VUX0VOVFJZLAogIEVYVFJBTkVPVVNfTU9ESUZJRVIsCiAgRVhUUkFORU9VU19NT0RJRklFUl9SRVBMQUNFLAogIEZPUklOX05PVF9BU1NJR05BQkxFLAogIEdFTkVSSUMsCiAgSElEREVOX0hJTlRTLAogIEhJRERFTl9XQVJOSU5HUywKICBISURERU5fV0FSTklOR1NfSElOVFMsCiAgSU1QTElDSVRfSlNfSU5URVJPUF9GSUVMRF9OT1RfU1VQUE9SVEVELAogIElOVkFMSURfQVNTRVJUX1ZBTFVFLAogIElOVkFMSURfQVNTRVJUX1ZBTFVFX01FU1NBR0UsCiAgSU5WQUxJRF9CT09MX0ZST01fRU5WSVJPTk1FTlRfREVGQVVMVF9WQUxVRV9UWVBFLAogIElOVkFMSURfQ09OU1RBTlRfQ0FTVCwKICBJTlZBTElEX0NPTlNUQU5UX0FERF9UWVBFUywKICBJTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9JTlRfVFlQRSwKICBJTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9OVU1fVFlQRSwKICBJTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9QUklNSVRJVkVfVFlQRSwKICBJTlZBTElEX0NPTlNUQU5UX0NPTVBMRU1FTlRfVFlQRSwKICBJTlZBTElEX0NPTlNUQU5UX0NPTkRJVElPTkFMX1RZUEUsCiAgSU5WQUxJRF9DT05TVEFOVF9DT05TVFJVQ1RPUiwKICBJTlZBTElEX0NPTlNUQU5UX0RJViwKICBJTlZBTElEX0NPTlNUQU5UX0lOREVYLAogIElOVkFMSURfQ09OU1RBTlRfSU5URVJQT0xBVElPTl9UWVBFLAogIElOVkFMSURfQ09OU1RBTlRfTkVHQVRFX1RZUEUsCiAgSU5WQUxJRF9DT05TVEFOVF9OT1RfVFlQRSwKICBJTlZBTElEX0NPTlNUQU5UX1NUUklOR19BRERfVFlQRSwKICBJTlZBTElEX0NPTlNUQU5UX05VTV9BRERfVFlQRSwKICBJTlZBTElEX0NPTlNUQU5UX1NUUklOR19MRU5HVEhfVFlQRSwKICBJTlZBTElEX0NPTlNUQU5UX1NISUZULAogIElOVkFMSURfRlJPTV9FTlZJUk9OTUVOVF9OQU1FX1RZUEUsCiAgSU5WQUxJRF9JTlRfRlJPTV9FTlZJUk9OTUVOVF9ERUZBVUxUX1ZBTFVFX1RZUEUsCiAgSU5WQUxJRF9MT0dJQ0FMX0FORF9PUEVSQU5EX1RZUEUsCiAgSU5WQUxJRF9MT0dJQ0FMX09SX09QRVJBTkRfVFlQRSwKICBJTlZBTElEX01FVEFEQVRBLAogIElOVkFMSURfTUVUQURBVEFfR0VORVJJQywKICBJTlZBTElEX1BBQ0tBR0VfQ09ORklHLAogIElOVkFMSURfUEFDS0FHRV9VUkksCiAgSU5WQUxJRF9TVFJJTkdfRlJPTV9FTlZJUk9OTUVOVF9ERUZBVUxUX1ZBTFVFX1RZUEUsCiAgSlNfSU5URVJPUF9DTEFTU19DQU5OT1RfRVhURU5EX0RBUlRfQ0xBU1MsCiAgSlNfSU5URVJPUF9DTEFTU19OT05fRVhURVJOQUxfQ09OU1RSVUNUT1IsCiAgSlNfSU5URVJPUF9DTEFTU19OT05fRVhURVJOQUxfTUVNQkVSLAogIEpTX0lOVEVST1BfRklFTERfTk9UX1NVUFBPUlRFRCwKICBKU19JTlRFUk9QX0lOREVYX05PVF9TVVBQT1JURUQsCiAgSlNfSU5URVJPUF9OT05fRVhURVJOQUxfTUVNQkVSLAogIEpTX0lOVEVST1BfTUVNQkVSX0lOX05PTl9KU19JTlRFUk9QX0NMQVNTLAogIEpTX0lOVEVST1BfTUVUSE9EX1dJVEhfTkFNRURfQVJHVU1FTlRTLAogIEpTX09CSkVDVF9MSVRFUkFMX0NPTlNUUlVDVE9SX1dJVEhfUE9TSVRJT05BTF9BUkdVTUVOVFMsCiAgSlNfUExBQ0VIT0xERVJfQ0FQVFVSRSwKICBMSUJSQVJZX05PVF9GT1VORCwKICBNSVJST1JTX0xJQlJBUllfTk9UX1NVUFBPUlRfV0lUSF9DRkUsCiAgTUlTU0lOR19FWFBSRVNTSU9OX0lOX1RIUk9XLAogIE5BVElWRV9OT05fSU5TVEFOQ0VfSU5fTk9OX05BVElWRV9DTEFTUywKICBOT19TVUNIX1NVUEVSX01FTUJFUiwKICBOT05fTkFUSVZFX0VYVEVSTkFMLAogIE5PVF9BX0NPTVBJTEVfVElNRV9DT05TVEFOVCwKICBOT1RfQVNTSUdOQUJMRSwKICBQTEVBU0VfUkVQT1JUX1RIRV9DUkFTSCwKICBQUkVBTUJMRSwKICBSRVRIUk9XX09VVFNJREVfQ0FUQ0gsCiAgUkVUVVJOX0lOX0dFTkVSQVRJVkVfQ09OU1RSVUNUT1IsCiAgUkVUVVJOX0lOX0dFTkVSQVRPUiwKICBSVU5USU1FX1RZUEVfVE9fU1RSSU5HX09CSkVDVCwKICBSVU5USU1FX1RZUEVfVE9fU1RSSU5HX1NVQlRZUEUsCiAgU1RSSU5HX0VYUEVDVEVELAogIFVOREVGSU5FRF9HRVRURVIsCiAgVU5ERUZJTkVEX0lOU1RBTkNFX0dFVFRFUl9CVVRfU0VUVEVSLAogIFVOREVGSU5FRF9NRVRIT0QsCiAgVU5ERUZJTkVEX09QRVJBVE9SLAogIFVOREVGSU5FRF9TRVRURVIsCiAgVU5ERUZJTkVEX1NUQVRJQ19HRVRURVJfQlVUX1NFVFRFUiwKICBVTkRFRklORURfU1RBVElDX1NFVFRFUl9CVVRfR0VUVEVSLAogIFVOREVGSU5FRF9TVVBFUl9TRVRURVIsCiAgV1JPTkdfQVJHVU1FTlRfRk9SX0pTLAogIFdST05HX0FSR1VNRU5UX0ZPUl9KU19GSVJTVCwKICBXUk9OR19BUkdVTUVOVF9GT1JfSlNfU0VDT05ELAogIFdST05HX0FSR1VNRU5UX0ZPUl9KU19JTlRFUkNFUFRPUl9DT05TVEFOVCwKICAvLyBUT0RPKDMyNTU3KTogUmVtb3ZlIHRoZXNlIHdoZW4gaXNzdWUgMzI1NTcgaXMgZml4ZWQuCiAgU1dJVENIX0NBU0VfRk9SQklEREVOLAogIFNXSVRDSF9DQVNFX1ZBTFVFX09WRVJSSURFU19FUVVBTFMsCiAgU1dJVENIX0NBU0VfVFlQRVNfTk9UX0VRVUFMLAogIFNXSVRDSF9DQVNFX1RZUEVTX05PVF9FUVVBTF9DQVNFLAp9CgovLy8gQSBtZXNzYWdlIHRlbXBsYXRlIGZvciBhbiBlcnJvciwgd2FybmluZywgaGludCBvciBpbmZvIG1lc3NhZ2UgZ2VuZXJhdGVkCi8vLyBieSB0aGUgY29tcGlsZXIuIEVhY2ggdGVtcGxhdGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgW01lc3NhZ2VLaW5kXSB0aGF0Ci8vLyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBtZXNzYWdlIHRlbXBsYXRlLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBGb3IgSW5mb3MsIGNvbnNpZGVyIGFkZGluZyBhIHJlZmVyZW5jZSB0byB0aGUKLy8gZXJyb3Ivd2FybmluZy9oaW50IHRoYXQgdGhleSBiZWxvbmcgdG8uCmNsYXNzIE1lc3NhZ2VUZW1wbGF0ZSB7CiAgZmluYWwgTWVzc2FnZUtpbmQga2luZDsKCiAgLy8vIFNob3VsZCBkZXNjcmliZSB3aGF0IGlzIHdyb25nIGFuZCB3aHkuCiAgZmluYWwgU3RyaW5nIHRlbXBsYXRlOwoKICAvLy8gU2hvdWxkIGRlc2NyaWJlIGhvdyB0byBmaXggdGhlIHByb2JsZW0uIEVsaWRlZCB3aGVuIHVzaW5nIC0tdGVyc2Ugb3B0aW9uLgogIGZpbmFsIFN0cmluZyBob3dUb0ZpeDsKCiAgLy8vICBFeGFtcGxlcyB3aWxsIGJlIGNoZWNrZWQgYnkKICAvLy8gIHRlc3RzL2NvbXBpbGVyL2RhcnQyanMvbWVzc2FnZV9raW5kX3Rlc3QuZGFydC4KICAvLy8KICAvLy8gIEFuIGV4YW1wbGUgaXMgZWl0aGVyIGEgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGV4YW1wbGUgc291cmNlIGNvZGUgb3IgYSBNYXAKICAvLy8gIGZyb20gZmlsZW5hbWVzIHRvIHNvdXJjZSBjb2RlLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBmaWxlbmFtZSBmb3IgdGhlCiAgLy8vICBtYWluIGxpYnJhcnkgY29kZSBtdXN0IGJlICdtYWluLmRhcnQnLgogIGZpbmFsIExpc3QgZXhhbXBsZXM7CgogIC8vLyBBZGRpdGlvbmFsIG9wdGlvbnMgbmVlZGVkIGZvciB0aGUgZXhhbXBsZXMgdG8gd29yay4KICBmaW5hbCBMaXN0PFN0cmluZz4gb3B0aW9uczsKCiAgY29uc3QgTWVzc2FnZVRlbXBsYXRlKHRoaXMua2luZCwgdGhpcy50ZW1wbGF0ZSwKICAgICAge3RoaXMuaG93VG9GaXgsIHRoaXMuZXhhbXBsZXMsIHRoaXMub3B0aW9uczogY29uc3QgPFN0cmluZz5bXX0pOwoKICAvLy8gQWxsIHRlbXBsYXRlcyB1c2VkIGJ5IHRoZSBjb21waWxlci4KICAvLy8KICAvLy8gVGhlIG1hcCBpcyBjb21wbGV0ZSBtYXBwaW5nIGZyb20gW01lc3NhZ2VLaW5kXSB0byB0aGVpciBjb3JyZXNwb25kaW5nCiAgLy8vIFtNZXNzYWdlVGVtcGxhdGVdLgogIC8vIFRoZSBrZXkgdHlwZSBpcyBhIHVuaW9uIG9mIE1lc3NhZ2VLaW5kIGFuZCBTaGFyZWRNZXNzYWdlS2luZC4KICBzdGF0aWMgZmluYWwgTWFwPGR5bmFtaWMsIE1lc3NhZ2VUZW1wbGF0ZT4gVEVNUExBVEVTID0gPGR5bmFtaWMsCiAgICAgIE1lc3NhZ2VUZW1wbGF0ZT57fQogICAgLi5hZGRBbGwoc2hhcmVkX21lc3NhZ2VzLlRFTVBMQVRFUykKICAgIC4uYWRkQWxsKGNvbnN0IDxNZXNzYWdlS2luZCwgTWVzc2FnZVRlbXBsYXRlPnsKICAgICAgLy8vIERvIG5vdCB1c2UgdGhpcy4gSXQgaXMgaGVyZSBmb3IgbGVnYWN5IGFuZCBkZWJ1Z2dpbmcuIEl0IHZpb2xhdGVzIGl0ZW0KICAgICAgLy8vIDQgb2YgdGhlIGd1aWRlIGxpbmVzIGZvciBlcnJvciBtZXNzYWdlcyBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgogICAgICBNZXNzYWdlS2luZC5HRU5FUklDOgogICAgICAgICAgY29uc3QgTWVzc2FnZVRlbXBsYXRlKE1lc3NhZ2VLaW5kLkdFTkVSSUMsICcje3RleHR9JyksCgogICAgICBNZXNzYWdlS2luZC5DQU5OT1RfUkVTT0xWRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuQ0FOTk9UX1JFU09MVkUsICJDYW5ub3QgcmVzb2x2ZSAnI3tuYW1lfScuIiksCgogICAgICBNZXNzYWdlS2luZC5OT1RfQV9DT01QSUxFX1RJTUVfQ09OU1RBTlQ6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLk5PVF9BX0NPTVBJTEVfVElNRV9DT05TVEFOVCwKICAgICAgICAgICJOb3QgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuIiksCgogICAgICBNZXNzYWdlS2luZC5DWUNMSUNfQ09NUElMRV9USU1FX0NPTlNUQU5UUzogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuQ1lDTElDX0NPTVBJTEVfVElNRV9DT05TVEFOVFMsCiAgICAgICAgICAiQ3ljbGUgaW4gdGhlIGNvbXBpbGUtdGltZSBjb25zdGFudCBjb21wdXRhdGlvbi4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLlVOREVGSU5FRF9TVEFUSUNfU0VUVEVSX0JVVF9HRVRURVI6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLlVOREVGSU5FRF9TVEFUSUNfU0VUVEVSX0JVVF9HRVRURVIsCiAgICAgICAgICAiQ2Fubm90IHJlc29sdmUgc2V0dGVyLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuU1RSSU5HX0VYUEVDVEVEOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5TVFJJTkdfRVhQRUNURUQsCiAgICAgICAgICAiRXhwZWN0ZWQgYSAnU3RyaW5nJywgYnV0IGdvdCBhbiBpbnN0YW5jZSBvZiAnI3t0eXBlfScuIiksCgogICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX0NMQVNTX0NBTk5PVF9FWFRFTkRfREFSVF9DTEFTUzoKICAgICAgICAgIGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX0NMQVNTX0NBTk5PVF9FWFRFTkRfREFSVF9DTEFTUywKICAgICAgICAgICAgICAiSnMtaW50ZXJvcCBjbGFzcyAnI3tjbHN9JyBjYW5ub3QgZXh0ZW5kIGZyb20gdGhlIG5vbiBqcy1pbnRlcm9wICIKICAgICAgICAgICAgICAiY2xhc3MgJyN7c3VwZXJjbGFzc30nLiIsCiAgICAgICAgICAgICAgaG93VG9GaXg6ICJBbm5vdGF0ZSB0aGUgc3VwZXJjbGFzcyB3aXRoIEBKUy4iLAogICAgICAgICAgICAgIGV4YW1wbGVzOiBjb25zdCBbCiAgICAgICAgICAgICIiIgogICAgICAgICAgICAgIGltcG9ydCAncGFja2FnZTpqcy9qcy5kYXJ0JzsKCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsgfQoKICAgICAgICAgICAgICBASlMoKQogICAgICAgICAgICAgIGNsYXNzIEJhciBleHRlbmRzIEZvbyB7IH0KCiAgICAgICAgICAgICAgbWFpbigpIHsKICAgICAgICAgICAgICAgIG5ldyBCYXIoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIiIiCiAgICAgICAgICBdKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfSU5ERVhfTk9UX1NVUFBPUlRFRDogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9JTkRFWF9OT1RfU1VQUE9SVEVELAogICAgICAgICAgIkpzLWludGVyb3AgZG9lcyBub3Qgc3VwcG9ydCBbXSBhbmQgW109IG9wZXJhdG9yIG1ldGhvZHMuIiwKICAgICAgICAgIGhvd1RvRml4OiAiVHJ5IHJlcGxhY2luZyBbXSBhbmQgW109IG9wZXJhdG9yIG1ldGhvZHMgd2l0aCBub3JtYWwgIgogICAgICAgICAgICAgICJtZXRob2RzLiIsCiAgICAgICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICAgICAiIiIKICAgICAgICBpbXBvcnQgJ3BhY2thZ2U6anMvanMuZGFydCc7CgogICAgICAgIEBKUygpCiAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgIGV4dGVybmFsIG9wZXJhdG9yIFtdKGFyZyk7CiAgICAgICAgfQoKICAgICAgICBtYWluKCkgewogICAgICAgICAgbmV3IEZvbygpWzBdOwogICAgICAgIH0KICAgICAgICAiIiIsCiAgICAgICAgICAgICIiIgogICAgICAgIGltcG9ydCAncGFja2FnZTpqcy9qcy5kYXJ0JzsKCiAgICAgICAgQEpTKCkKICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgZXh0ZXJuYWwgb3BlcmF0b3IgW109KGFyZywgdmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgbWFpbigpIHsKICAgICAgICAgIG5ldyBGb28oKVswXSA9IDE7CiAgICAgICAgfQogICAgICAgICIiIgogICAgICAgICAgXSksCgogICAgICBNZXNzYWdlS2luZC5KU19PQkpFQ1RfTElURVJBTF9DT05TVFJVQ1RPUl9XSVRIX1BPU0lUSU9OQUxfQVJHVU1FTlRTOgogICAgICAgICAgY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgICAgIE1lc3NhZ2VLaW5kCiAgICAgICAgICAgICAgICAgIC5KU19PQkpFQ1RfTElURVJBTF9DT05TVFJVQ1RPUl9XSVRIX1BPU0lUSU9OQUxfQVJHVU1FTlRTLAogICAgICAgICAgICAgICJTb21lIHBhcmFtZXRlcnMgaW4gYW5vbnltb3VzIGpzLWludGVyb3AgY2xhc3MgJyN7Y2xzfScgIgogICAgICAgICAgICAgICJvYmplY3QgbGl0ZXJhbCBjb25zdHJ1Y3RvciBhcmUgcG9zaXRpb25hbCBpbnN0ZWFkIG9mIG5hbWVkLiIKICAgICAgICAgICAgICAiLiIsCiAgICAgICAgICAgICAgaG93VG9GaXg6ICJNYWtlIGFsbCBhcmd1bWVudHMgaW4gZXh0ZXJuYWwgZmFjdG9yeSBvYmplY3QgbGl0ZXJhbCAiCiAgICAgICAgICAgICAgICAgICJjb25zdHJ1Y3RvcnMgbmFtZWQuIiwKICAgICAgICAgICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICAgICAiIiIKY2xhc3MgU3VwZXIgewogIGZhY3RvcnkgU3VwZXIuZm9vKCkgPT4gbnVsbDsKfQpjbGFzcyBDbGFzcyBleHRlbmRzIFN1cGVyIHsKICBDbGFzcygpIDogc3VwZXIuZm9vKCk7Cn0KbWFpbigpID0+IG5ldyBDbGFzcygpOwoiIiIKICAgICAgICAgIF0pLAoKICAgICAgTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9OT05fRVhURVJOQUxfTUVNQkVSOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX05PTl9FWFRFUk5BTF9NRU1CRVIsCiAgICAgICAgICAiSnMtaW50ZXJvcCBtZW1iZXJzIG11c3QgYmUgJ2V4dGVybmFsJy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfTUVNQkVSX0lOX05PTl9KU19JTlRFUk9QX0NMQVNTOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX01FTUJFUl9JTl9OT05fSlNfSU5URVJPUF9DTEFTUywKICAgICAgICAgICJKcy1pbnRlcm9wIGNsYXNzIG1lbWJlcnMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGpzLWludGVyb3AgY2xhc3Nlcy4iLAogICAgICAgICAgaG93VG9GaXg6ICJUcnkgbWFya2luZyB0aGUgZW5jbG9zaW5nIGNsYXNzIGFzIGpzLWludGVyb3Agb3IgIgogICAgICAgICAgICAgICJyZW1vdmUgdGhlIGpzLWludGVyb3AgYW5ub3RhdGlvbiBmcm9tIHRoZSBtZW1iZXIuIiksCgogICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX0NMQVNTX05PTl9FWFRFUk5BTF9DT05TVFJVQ1RPUjoKICAgICAgICAgIGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX0NMQVNTX05PTl9FWFRFUk5BTF9DT05TVFJVQ1RPUiwKICAgICAgICAgICAgICAiQ29uc3RydWN0b3IgJyN7Y29uc3RydWN0b3J9JyBpbiBqcy1pbnRlcm9wIGNsYXNzICcje2Nsc30nIGlzICIKICAgICAgICAgICAgICAibm90IGV4dGVybmFsLiIsCiAgICAgICAgICAgICAgaG93VG9GaXg6ICJUcnkgYWRkaW5nIHRoZSAnZXh0ZXJuYWwnIHRvICcje2NvbnN0cnVjdG9yfScuIiksCgogICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX0NMQVNTX05PTl9FWFRFUk5BTF9NRU1CRVI6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfQ0xBU1NfTk9OX0VYVEVSTkFMX01FTUJFUiwKICAgICAgICAgICJNZW1iZXIgJyN7bWVtYmVyfScgaW4ganMtaW50ZXJvcCBjbGFzcyAnI3tjbHN9JyBpcyBub3QgZXh0ZXJuYWwuIiwKICAgICAgICAgIGhvd1RvRml4OiAiVHJ5IGFkZGluZyB0aGUgJ2V4dGVybmFsJyB0byAnI3ttZW1iZXJ9Jy4iLAogICAgICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICAgaW1wb3J0ICdwYWNrYWdlOmpzL2pzLmRhcnQnOwoKICAgICAgICAgICAgICBASlMoKQogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBiYXIoKSB7fQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgbWFpbigpIHsKICAgICAgICAgICAgICAgIG5ldyBGb28oKS5iYXIoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIiIiCiAgICAgICAgICBdKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfTUVUSE9EX1dJVEhfTkFNRURfQVJHVU1FTlRTOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX01FVEhPRF9XSVRIX05BTUVEX0FSR1VNRU5UUywKICAgICAgICAgICJKcy1pbnRlcm9wIG1ldGhvZCAnI3ttZXRob2R9JyBoYXMgbmFtZWQgYXJndW1lbnRzIGJ1dCBpcyBub3QgIgogICAgICAgICAgImEgZmFjdG9yeSBjb25zdHJ1Y3RvciBvZiBhbiBAYW5vbnltb3VzIEBKUyBjbGFzcy4iLAogICAgICAgICAgaG93VG9GaXg6ICJSZW1vdmUgYWxsIG5hbWVkIGFyZ3VtZW50cyBmcm9tIGpzLWludGVyb3AgbWV0aG9kIG9yICIKICAgICAgICAgICAgICAiaW4gdGhlIGNhc2Ugb2YgYSBmYWN0b3J5IGNvbnN0cnVjdG9yIGFubm90YXRlIHRoZSBjbGFzcyAiCiAgICAgICAgICAgICAgImFzIEBhbm9ueW1vdXMuIiwKICAgICAgICAgIGV4YW1wbGVzOiBjb25zdCBbCiAgICAgICAgICAgICIiIgogICAgICAgICAgICAgIGltcG9ydCAncGFja2FnZTpqcy9qcy5kYXJ0JzsKCiAgICAgICAgICAgICAgQEpTKCkKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgZXh0ZXJuYWwgYmFyKGZvbywge2Jhen0pOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgbWFpbigpIHsKICAgICAgICAgICAgICAgIG5ldyBGb28oKS5iYXIoNCwgYmF6OiA1KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIiIiCiAgICAgICAgICBdKSwKICAgICAgTWVzc2FnZUtpbmQuSU1QTElDSVRfSlNfSU5URVJPUF9GSUVMRF9OT1RfU1VQUE9SVEVEOgogICAgICAgICAgY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLklNUExJQ0lUX0pTX0lOVEVST1BfRklFTERfTk9UX1NVUFBPUlRFRCwKICAgICAgICAgICAgICAiRmllbGRzIGluIGpzLWludGVyb3AgY2xhc3NlcyBhcmUgbm90IHN1cHBvcnRlZC4iLAogICAgICAgICAgICAgIGhvd1RvRml4OiAiVHJ5IHJlcGxhY2luZyB0aGUgZmllbGQgd2l0aCBhbiAiCiAgICAgICAgICAgICAgICAgICJleHRlcm5hbCBnZXR0ZXIgYW5kL29yIHNldHRlci4iKSwKICAgICAgTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9GSUVMRF9OT1RfU1VQUE9SVEVEOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX0ZJRUxEX05PVF9TVVBQT1JURUQsCiAgICAgICAgICAiRmllbGQgY2FuJ3QgYmUgbWFya2VkIGFzIGpzLWludGVyb3AuIiwKICAgICAgICAgIGhvd1RvRml4OiAiVHJ5IHJlcGxhY2luZyB0aGUgZmllbGQgd2l0aCBhbiAiCiAgICAgICAgICAgICAgImV4dGVybmFsIGdldHRlciBhbmQvb3Igc2V0dGVyLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuTElCUkFSWV9OT1RfRk9VTkQ6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLkxJQlJBUllfTk9UX0ZPVU5ELCAiTGlicmFyeSBub3QgZm91bmQgJyN7cmVzb2x2ZWRVcml9Jy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfUEFDS0FHRV9DT05GSUc6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfUEFDS0FHRV9DT05GSUcsCiAgICAgICAgICAiIiJQYWNrYWdlIGNvbmZpZyBmaWxlICcje3VyaX0nIGlzIGludmFsaWQuCiN7ZXhjZXB0aW9ufSIiIiwKICAgICAgICAgIGhvd1RvRml4OiBET05UX0tOT1dfSE9XX1RPX0ZJWCksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX1BBQ0tBR0VfVVJJOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX1BBQ0tBR0VfVVJJLAogICAgICAgICAgIicje3VyaX0nIGlzIG5vdCBhIHZhbGlkIHBhY2thZ2UgVVJJICgje2V4Y2VwdGlvbn0pLiIsCiAgICAgICAgICBob3dUb0ZpeDogRE9OVF9LTk9XX0hPV19UT19GSVgsCiAgICAgICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICAgICAiIiIKLy8gY2FuJ3QgaGF2ZSBhICd0b3AgbGV2ZWwnIHBhY2thZ2UgVVJJCmltcG9ydCAncGFja2FnZTpmb28uZGFydCc7CgptYWluKCkge30KIiIiLAogICAgICAgICAgICAiIiIKLy8gY2FuJ3QgaGF2ZSAyIHNsYXNoZXMKaW1wb3J0ICdwYWNrYWdlOi8vZm9vL2Zvby5kYXJ0JzsKCm1haW4oKSB7fQoiIiIsCiAgICAgICAgICAgICIiIgovLyBwYWNrYWdlIG5hbWUgbXVzdCBiZSB2YWxpZAppbXBvcnQgJ3BhY2thZ2U6bm90XHZhbGlkL2Zvby5kYXJ0JzsKCm1haW4oKSB7fQoiIiIKICAgICAgICAgIF0pLAoKICAgICAgTWVzc2FnZUtpbmQuSlNfUExBQ0VIT0xERVJfQ0FQVFVSRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSlNfUExBQ0VIT0xERVJfQ0FQVFVSRSwKICAgICAgICAgICJKUyBjb2RlIG11c3Qgbm90IHVzZSAnIycgcGxhY2Vob2xkZXJzIGluc2lkZSBmdW5jdGlvbnMuIiwKICAgICAgICAgIGhvd1RvRml4OgogICAgICAgICAgICAgICJVc2UgYW4gaW1tZWRpYXRlbHkgY2FsbGVkIEphdmFTY3JpcHQgZnVuY3Rpb24gdG8gY2FwdHVyZSB0aGUiCiAgICAgICAgICAgICAgIiB0aGUgcGxhY2Vob2xkZXIgdmFsdWVzIGFzIEphdmFTY3JpcHQgZnVuY3Rpb24gcGFyYW1ldGVycy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KUzogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTLAogICAgICAgICAgIkpTIGV4cHJlc3Npb24gbXVzdCB0YWtlIHR3byBvciBtb3JlIGFyZ3VtZW50cy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KU19GSVJTVDogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTX0ZJUlNULAogICAgICAgICAgIkpTIGV4cHJlc3Npb24gbXVzdCB0YWtlIHR3byBvciBtb3JlIGFyZ3VtZW50cy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KU19TRUNPTkQ6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KU19TRUNPTkQsCiAgICAgICAgICAiSlMgc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgbGl0ZXJhbC4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KU19JTlRFUkNFUFRPUl9DT05TVEFOVDoKICAgICAgICAgIGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgICAgICBNZXNzYWdlS2luZC5XUk9OR19BUkdVTUVOVF9GT1JfSlNfSU5URVJDRVBUT1JfQ09OU1RBTlQsCiAgICAgICAgICAgICAgIkFyZ3VtZW50IGZvciAnSlNfSU5URVJDRVBUT1JfQ09OU1RBTlQnIG11c3QgYmUgYSB0eXBlIGNvbnN0YW50LiIpLAoKICAgICAgTWVzc2FnZUtpbmQuQUJTVFJBQ1RfR0VUVEVSOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5BQlNUUkFDVF9HRVRURVIsCiAgICAgICAgICAiVGhlIGdldHRlciAnI3tuYW1lfScgaGFzIG5vIGltcGxlbWVudGF0aW9uIGluICIKICAgICAgICAgICJjbGFzcyAnI3tjbGFzc30nLiIsCiAgICAgICAgICBob3dUb0ZpeDogIlRyeSBhZGRpbmcgYSBib2R5IHRvICcje25hbWV9JyBvciBkZWNsYXJpbmcgIgogICAgICAgICAgICAgICInI3tjbGFzc30nIHRvIGJlICdhYnN0cmFjdCcuIiwKICAgICAgICAgIGV4YW1wbGVzOiBjb25zdCBbCiAgICAgICAgICAgICIiIgpjbGFzcyBDbGFzcyB7CiAgZ2V0IGdldHRlcjsKfQptYWluKCkgPT4gbmV3IENsYXNzKCk7CiIiIgogICAgICAgICAgXSksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX01FVEFEQVRBOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX01FVEFEQVRBLAogICAgICAgICAgIkEgbWV0YWRhdGEgYW5ub3RhdGlvbiBtdXN0IGJlIGVpdGhlciBhIHJlZmVyZW5jZSB0byBhIGNvbXBpbGUtdGltZSAiCiAgICAgICAgICAiY29uc3RhbnQgdmFyaWFibGUgb3IgYSBjYWxsIHRvIGEgY29uc3RhbnQgY29uc3RydWN0b3IuIiwKICAgICAgICAgIGhvd1RvRml4OgogICAgICAgICAgICAgICJUcnkgdXNpbmcgYSBkaWZmZXJlbnQgY29uc3RhbnQgdmFsdWUgb3IgcmVmZXJlbmNpbmcgaXQgdGhyb3VnaCBhICIKICAgICAgICAgICAgICAiY29uc3RhbnQgdmFyaWFibGUuIiwKICAgICAgICAgIGV4YW1wbGVzOiBjb25zdCBbJ0BPYmplY3QgbWFpbigpIHt9JywgJ0BwcmludCBtYWluKCkge30nXSksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX01FVEFEQVRBX0dFTkVSSUM6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfTUVUQURBVEFfR0VORVJJQywKICAgICAgICAgICJBIG1ldGFkYXRhIGFubm90YXRpb24gdXNpbmcgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBjYW5ub3QgdXNlIHR5cGUgIgogICAgICAgICAgImFyZ3VtZW50cy4iLAogICAgICAgICAgaG93VG9GaXg6CiAgICAgICAgICAgICAgIlRyeSByZW1vdmluZyB0aGUgdHlwZSBhcmd1bWVudHMgb3IgcmVmZXJlbmNpbmcgdGhlIGNvbnN0YW50ICIKICAgICAgICAgICAgICAidGhyb3VnaCBhIGNvbnN0YW50IHZhcmlhYmxlLiIsCiAgICAgICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICAgICAnJycKY2xhc3MgQzxUPiB7CiAgY29uc3QgQygpOwp9CkBDPGludD4oKSBtYWluKCkge30KJycnCiAgICAgICAgICBdKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkVRVUFMX01BUF9FTlRSWV9LRVk6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLkVRVUFMX01BUF9FTlRSWV9LRVksCiAgICAgICAgICAiQW4gZW50cnkgd2l0aCB0aGUgc2FtZSBrZXkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIG1hcC4iLAogICAgICAgICAgaG93VG9GaXg6CiAgICAgICAgICAgICAgIlRyeSByZW1vdmluZyB0aGUgcHJldmlvdXMgZW50cnkgb3IgY2hhbmdpbmcgdGhlIGtleSBpbiBvbmUgIgogICAgICAgICAgICAgICJvZiB0aGUgZW50cmllcy4iLAogICAgICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICAgICAgIiIiCm1haW4oKSB7CiAgdmFyIG0gPSBjb25zdCB7J2Zvbyc6IDEsICdmb28nOiAyfTsKfSIiIgogICAgICAgICAgXSksCgogICAgICBNZXNzYWdlS2luZC5FUVVBTF9TRVRfRU5UUlk6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLkVRVUFMX1NFVF9FTlRSWSwgIkFuIGVudHJ5IGFwcGVhcnMgdHdpY2UgaW4gdGhlIHNldC4iLAogICAgICAgICAgaG93VG9GaXg6ICJUcnkgcmVtb3Zpbmcgb25lIG9mIHRoZSBlbnRyaWVzLiIsCiAgICAgICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICAgICAiIiIKbWFpbigpIHsKICB2YXIgbSA9IGNvbnN0IHsnZm9vJywgJ2JhcicsICdmb28nfTsKfSIiIgogICAgICAgICAgXSksCgogICAgICBNZXNzYWdlS2luZC5DT01QSUxFUl9DUkFTSEVEOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5DT01QSUxFUl9DUkFTSEVELAogICAgICAgICAgIlRoZSBjb21waWxlciBjcmFzaGVkIHdoZW4gY29tcGlsaW5nIHRoaXMgZWxlbWVudC4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLlBMRUFTRV9SRVBPUlRfVEhFX0NSQVNIOgogICAgICAgICAgY29uc3QgTWVzc2FnZVRlbXBsYXRlKE1lc3NhZ2VLaW5kLlBMRUFTRV9SRVBPUlRfVEhFX0NSQVNILCAnJycKVGhlIGNvbXBpbGVyIGlzIGJyb2tlbi4KCldoZW4gY29tcGlsaW5nIHRoZSBhYm92ZSBlbGVtZW50LCB0aGUgY29tcGlsZXIgY3Jhc2hlZC4gSXQgaXMgbm90CnBvc3NpYmxlIHRvIHRlbGwgaWYgdGhpcyBpcyBjYXVzZWQgYnkgYSBwcm9ibGVtIGluIHlvdXIgcHJvZ3JhbSBvcgpub3QuIFJlZ2FyZGxlc3MsIHRoZSBjb21waWxlciBzaG91bGQgbm90IGNyYXNoLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8KcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LgoKUGxlYXNlIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKCiogdGhlIG5hbWUgYW5kIHZlcnNpb24gb2YgeW91ciBvcGVyYXRpbmcgc3lzdGVtLAoKKiB0aGUgRGFydCBTREsgYnVpbGQgbnVtYmVyICgje2J1aWxkSWR9KSwgYW5kCgoqIHRoZSBlbnRpcmUgbWVzc2FnZSB5b3Ugc2VlIGhlcmUgKGluY2x1ZGluZyB0aGUgZnVsbCBzdGFjayB0cmFjZQogIGJlbG93IGFzIHdlbGwgYXMgdGhlIHNvdXJjZSBsb2NhdGlvbiBhYm92ZSkuCicnJyksCgogICAgICBNZXNzYWdlS2luZC5ISURERU5fV0FSTklOR1NfSElOVFM6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLkhJRERFTl9XQVJOSU5HU19ISU5UUywKICAgICAgICAgICIje3dhcm5pbmdzfSB3YXJuaW5nKHMpIGFuZCAje2hpbnRzfSBoaW50KHMpIHN1cHByZXNzZWQgaW4gI3t1cml9LiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSElEREVOX1dBUk5JTkdTOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5ISURERU5fV0FSTklOR1MsCiAgICAgICAgICAiI3t3YXJuaW5nc30gd2FybmluZyhzKSBzdXBwcmVzc2VkIGluICN7dXJpfS4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLkhJRERFTl9ISU5UUzogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSElEREVOX0hJTlRTLCAiI3toaW50c30gaGludChzKSBzdXBwcmVzc2VkIGluICN7dXJpfS4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLlBSRUFNQkxFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5QUkVBTUJMRSwKICAgICAgICAgICJXaGVuIHJ1biBvbiB0aGUgY29tbWFuZC1saW5lLCB0aGUgY29tcGlsZWQgb3V0cHV0IG1pZ2h0IgogICAgICAgICAgIiByZXF1aXJlIGEgcHJlYW1ibGUgZmlsZSBsb2NhdGVkIGluOlxuIgogICAgICAgICAgIiAgPHNkaz4vbGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9wcmVhbWJsZXMuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0NPTkRJVElPTkFMX1RZUEU6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQ09ORElUSU9OQUxfVFlQRSwKICAgICAgICAgICJgI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIGNvbnN0YW50IGNvbmRpdGlvbi4gIgogICAgICAgICAgIk11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdib29sJy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfSU5URVJQT0xBVElPTl9UWVBFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0lOVEVSUE9MQVRJT05fVFlQRSwKICAgICAgICAgICJgI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCB2YWxpZCBpbiBjb25zdGFudCBzdHJpbmcgIgogICAgICAgICAgImludGVycG9sYXRpb24uIE11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdib29sJywgJ2ludCcsICdkb3VibGUnLCAiCiAgICAgICAgICAib3IgJ1N0cmluZycuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9QUklNSVRJVkVfVFlQRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9CSU5BUllfUFJJTUlUSVZFX1RZUEUsCiAgICAgICAgICAiYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBvcGVyYW5kIG9mIGEgIgogICAgICAgICAgImNvbnN0YW50IGJpbmFyeSAje29wZXJhdG9yfSBleHByZXNzaW9uLiBNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAiCiAgICAgICAgICAiJ2Jvb2wnLCAnaW50JywgJ2RvdWJsZScsICdTdHJpbmcnLCBvciAnTnVsbCcuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX1NUUklOR19BRERfVFlQRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9TVFJJTkdfQUREX1RZUEUsCiAgICAgICAgICAiYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBvcGVyYW5kIG9mIGEgIgogICAgICAgICAgImNvbnN0YW50IGJpbmFyeSArIGV4cHJlc3Npb24gb24gJ1N0cmluZycuIE11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICIKICAgICAgICAgICInU3RyaW5nJy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfU1RSSU5HX0xFTkdUSF9UWVBFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX1NUUklOR19MRU5HVEhfVFlQRSwKICAgICAgICAgICJgI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIG9wZXJhbmQgZm9yIGEgIgogICAgICAgICAgIi5sZW5ndGggZXhwcmVzc2lvbi4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ1N0cmluZycuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX1NISUZUOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX1NISUZULAogICAgICAgICAgIlNoaWZ0IGFtb3VudCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbiAiCiAgICAgICAgICAiYCN7bGVmdH0gI3tvcGVyYXRvcn0gI3tyaWdodH1gLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9ESVY6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfRElWLAogICAgICAgICAgIkRpdmlzb3IgbXVzdCBiZSBub24temVybyBpbiBgI3tsZWZ0fSAje29wZXJhdG9yfSAje3JpZ2h0fWAuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX05VTV9BRERfVFlQRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9OVU1fQUREX1RZUEUsCiAgICAgICAgICAiYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBvcGVyYW5kIG9mIGEgIgogICAgICAgICAgImNvbnN0YW50IGJpbmFyeSArIGV4cHJlc3Npb24gb24gJ251bScuIE11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICIKICAgICAgICAgICInaW50JyBvciAnZG91YmxlJy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQ0FTVDogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9DQVNULAogICAgICAgICAgImAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgc3VidHlwZSBvZiAje2Nhc3RUeXBlfS4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQUREX1RZUEVTOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0FERF9UWVBFUywKICAgICAgICAgICJgI3tsZWZ0Q29uc3RhbnR9YCBvZiB0eXBlICcje2xlZnRUeXBlfScgYW5kICIKICAgICAgICAgICJgI3tyaWdodENvbnN0YW50fWAgb2YgdHlwZSAnI3tyaWdodFR5cGV9JyBhcmUgbm90IHZhbGlkIG9wZXJhbmRzICIKICAgICAgICAgICJvZiBhIGNvbnN0YW50IGJpbmFyeSArIGV4cHJlc3Npb24uIE11c3QgYm90aCBiZSBlaXRoZXIgb2YgIgogICAgICAgICAgInR5cGUgJ1N0cmluZycsIG9yIG9mIHR5cGVzICdpbnQnIG9yICdkb3VibGUnLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9CSU5BUllfTlVNX1RZUEU6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQklOQVJZX05VTV9UWVBFLAogICAgICAgICAgImAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgb3BlcmFuZCBvZiBhICIKICAgICAgICAgICJjb25zdGFudCBiaW5hcnkgI3tvcGVyYXRvcn0gZXhwcmVzc2lvbi4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgIgogICAgICAgICAgIidpbnQnIG9yICdkb3VibGUnLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9CSU5BUllfSU5UX1RZUEU6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQklOQVJZX0lOVF9UWVBFLAogICAgICAgICAgImAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgb3BlcmFuZCBvZiBhICIKICAgICAgICAgICJjb25zdGFudCBiaW5hcnkgI3tvcGVyYXRvcn0gZXhwcmVzc2lvbi4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgIgogICAgICAgICAgIidpbnQnLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9OT1RfVFlQRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9OT1RfVFlQRSwKICAgICAgICAgICJgI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIG9wZXJhbmQgb2YgYSAiCiAgICAgICAgICAiY29uc3RhbnQgdW5hcnkgI3tvcGVyYXRvcn0gZXhwcmVzc2lvbi4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgIgogICAgICAgICAgIidib29sJy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfTkVHQVRFX1RZUEU6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfTkVHQVRFX1RZUEUsCiAgICAgICAgICAiYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBvcGVyYW5kIG9mIGEgIgogICAgICAgICAgImNvbnN0YW50IHVuYXJ5ICN7b3BlcmF0b3J9IGV4cHJlc3Npb24uIE11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICIKICAgICAgICAgICInaW50JyBvciAnZG91YmxlJy4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQ09NUExFTUVOVF9UWVBFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0NPTVBMRU1FTlRfVFlQRSwKICAgICAgICAgICJgI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIG9wZXJhbmQgb2YgYSAiCiAgICAgICAgICAiY29uc3RhbnQgdW5hcnkgI3tvcGVyYXRvcn0gZXhwcmVzc2lvbi4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgIgogICAgICAgICAgIidpbnQnLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9JTkRFWDogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9JTkRFWCwKICAgICAgICAgICJJbmRleCBleHByZXNzaW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0ZST01fRU5WSVJPTk1FTlRfTkFNRV9UWVBFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0ZST01fRU5WSVJPTk1FTlRfTkFNRV9UWVBFLAogICAgICAgICAgImAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgZW52aXJvbm1lbnQgbmFtZSAiCiAgICAgICAgICAiY29uc3RhbnQuIE11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdTdHJpbmcnLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9CT09MX0ZST01fRU5WSVJPTk1FTlRfREVGQVVMVF9WQUxVRV9UWVBFOgogICAgICAgICAgY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQk9PTF9GUk9NX0VOVklST05NRU5UX0RFRkFVTFRfVkFMVUVfVFlQRSwKICAgICAgICAgICAgICAiYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCAiCiAgICAgICAgICAgICAgImBib29sLmZyb21FbnZpcm9ubWVudGAgZGVmYXVsdCB2YWx1ZSBjb25zdGFudC4gIgogICAgICAgICAgICAgICJNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAnYm9vbCcgb3IgYG51bGxgLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9JTlRfRlJPTV9FTlZJUk9OTUVOVF9ERUZBVUxUX1ZBTFVFX1RZUEU6CiAgICAgICAgICBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9JTlRfRlJPTV9FTlZJUk9OTUVOVF9ERUZBVUxUX1ZBTFVFX1RZUEUsCiAgICAgICAgICAgICAgImAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgIgogICAgICAgICAgICAgICJgaW50LmZyb21FbnZpcm9ubWVudGAgZGVmYXVsdCB2YWx1ZSBjb25zdGFudC4gIgogICAgICAgICAgICAgICJNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAnaW50JyBvciBgbnVsbGAuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX1NUUklOR19GUk9NX0VOVklST05NRU5UX0RFRkFVTFRfVkFMVUVfVFlQRToKICAgICAgICAgIGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX1NUUklOR19GUk9NX0VOVklST05NRU5UX0RFRkFVTFRfVkFMVUVfVFlQRSwKICAgICAgICAgICAgICAiYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCAiCiAgICAgICAgICAgICAgImBTdHJpbmcuZnJvbUVudmlyb25tZW50YCBkZWZhdWx0IHZhbHVlIGNvbnN0YW50LiAiCiAgICAgICAgICAgICAgIk11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdTdHJpbmcnIG9yIGBudWxsYC4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfTE9HSUNBTF9BTkRfT1BFUkFORF9UWVBFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0xPR0lDQUxfQU5EX09QRVJBTkRfVFlQRSwKICAgICAgICAgICJgI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIGxvZ2ljYWwgYW5kIG9wZXJhbmQuICIKICAgICAgICAgICJNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAnYm9vbCcuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0xPR0lDQUxfT1JfT1BFUkFORF9UWVBFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0xPR0lDQUxfT1JfT1BFUkFORF9UWVBFLAogICAgICAgICAgImAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgbG9naWNhbCBvciBvcGVyYW5kLiAiCiAgICAgICAgICAiTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ2Jvb2wnLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9DT05TVFJVQ1RPUjogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9DT05TVFJVQ1RPUiwKICAgICAgICAgICJDb25zdHJ1Y3RvciAnI3tjb25zdHJ1Y3Rvck5hbWV9JyBpcyBub3QgYSB2YWxpZCBjb25zdGFudCAiCiAgICAgICAgICAiY29uc3RydWN0b3IuIiksCgogICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0FTU0VSVF9WQUxVRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9BU1NFUlRfVkFMVUUsICJBc3NlcnRpb24gJyN7YXNzZXJ0aW9ufScgZmFpbGVkLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9BU1NFUlRfVkFMVUVfTUVTU0FHRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9BU1NFUlRfVkFMVUVfTUVTU0FHRSwKICAgICAgICAgICJBc3NlcnRpb24gZmFpbGVkOiAje21lc3NhZ2V9IiksCgogICAgICBNZXNzYWdlS2luZC5NSVJST1JTX0xJQlJBUllfTk9UX1NVUFBPUlRfV0lUSF9DRkU6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLk1JUlJPUlNfTElCUkFSWV9OT1RfU1VQUE9SVF9XSVRIX0NGRSwgIiIiCmRhcnQyanMgbm8gbG9uZ2VyIHN1cHBvcnRzIHRoZSBkYXJ0Om1pcnJvcnMgbGlicmFyeS4KCkFQSXMgZnJvbSB0aGlzIGxpYnJhcnkgd2lsbCB0aHJvdyBhIHJ1bnRpbWUgZXJyb3IgYXQgdGhpcyB0aW1lLCBidXQgdGhleSB3aWxsCmJlY29tZSBhIGNvbXBpbGUtdGltZSBlcnJvciBpbiB0aGUgZnV0dXJlLiIiIiksCgogICAgICBNZXNzYWdlS2luZC5ESVJFQ1RMWV9USFJPV0lOR19OU006IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLkRJUkVDVExZX1RIUk9XSU5HX05TTSwKICAgICAgICAgICJUaGlzICdub1N1Y2hNZXRob2QnIGltcGxlbWVudGF0aW9uIGlzIGd1YXJhbnRlZWQgdG8gdGhyb3cgYW4gIgogICAgICAgICAgImV4Y2VwdGlvbi4gVGhlIGdlbmVyYXRlZCBjb2RlIHdpbGwgYmUgc21hbGxlciBpZiBpdCBpcyAiCiAgICAgICAgICAicmV3cml0dGVuLiIsCiAgICAgICAgICBob3dUb0ZpeDogIlJld3JpdGUgdG8gIgogICAgICAgICAgICAgICInbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaSkgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGkpOycuIiksCgogICAgICBNZXNzYWdlS2luZC5DT01QTEVYX1RIUk9XSU5HX05TTTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuQ09NUExFWF9USFJPV0lOR19OU00sCiAgICAgICAgICAiVGhpcyAnbm9TdWNoTWV0aG9kJyBpbXBsZW1lbnRhdGlvbiBpcyBndWFyYW50ZWVkIHRvIHRocm93IGFuICIKICAgICAgICAgICJleGNlcHRpb24uIFRoZSBnZW5lcmF0ZWQgY29kZSB3aWxsIGJlIHNtYWxsZXIgYW5kIHRoZSBjb21waWxlciAiCiAgICAgICAgICAid2lsbCBiZSBhYmxlIHRvIHBlcmZvcm0gbW9yZSBvcHRpbWl6YXRpb25zIGlmIGl0IGlzIHJld3JpdHRlbi4iLAogICAgICAgICAgaG93VG9GaXg6ICJSZXdyaXRlIHRvICIKICAgICAgICAgICAgICAiJ25vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGkpID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpKTsnLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuQ09NUExFWF9SRVRVUk5JTkdfTlNNOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5DT01QTEVYX1JFVFVSTklOR19OU00sCiAgICAgICAgICAiT3ZlcnJpZGluZyAnbm9TdWNoTWV0aG9kJyBjYXVzZXMgdGhlIGNvbXBpbGVyIHRvIGdlbmVyYXRlICIKICAgICAgICAgICJtb3JlIGNvZGUgYW5kIHByZXZlbnRzIHRoZSBjb21waWxlciBmcm9tIGRvaW5nIHNvbWUgb3B0aW1pemF0aW9ucy4iLAogICAgICAgICAgaG93VG9GaXg6ICJDb25zaWRlciByZW1vdmluZyB0aGlzICdub1N1Y2hNZXRob2QnIGltcGxlbWVudGF0aW9uLiIpLAoKICAgICAgTWVzc2FnZUtpbmQuUlVOVElNRV9UWVBFX1RPX1NUUklOR19PQkpFQ1Q6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLlJVTlRJTUVfVFlQRV9UT19TVFJJTkdfT0JKRUNULAogICAgICAgICAgIlVzaW5nICcucnVudGltZVR5cGUudG9TdHJpbmcoKScgY2F1c2VzIHRoZSBjb21waWxlciB0byBnZW5lcmF0ZSAiCiAgICAgICAgICAibW9yZSBjb2RlIGJlY2F1c2UgaXQgbmVlZHMgdG8gcHJlc2VydmUgdHlwZSBhcmd1bWVudHMgb24gYWxsICIKICAgICAgICAgICJnZW5lcmljIGNsYXNzZXMsIGV2ZW4gaWYgdGhleSBhcmUgbm90IG5lY2Vzc2FyeSBlbHNld2hlcmUuIiwKICAgICAgICAgIGhvd1RvRml4OiAiSWYgdXNlZCBvbmx5IGZvciBkZWJ1Z2dpbmcsIGNvbnNpZGVyIHVzaW5nIG9wdGlvbiAiCiAgICAgICAgICAgICAgIiR7RmxhZ3MubGF4UnVudGltZVR5cGVUb1N0cmluZ30gdG8gcmVkdWNlIHRoZSBjb2RlIHNpemUgIgogICAgICAgICAgICAgICJpbXBhY3QuIiksCgogICAgICBNZXNzYWdlS2luZC5SVU5USU1FX1RZUEVfVE9fU1RSSU5HX1NVQlRZUEU6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLlJVTlRJTUVfVFlQRV9UT19TVFJJTkdfU1VCVFlQRSwKICAgICAgICAgICJVc2luZyAnLnJ1bnRpbWVUeXBlLnRvU3RyaW5nKCknIGhlcmUgY2F1c2VzIHRoZSBjb21waWxlciB0byAiCiAgICAgICAgICAiZ2VuZXJhdGUgbW9yZSBjb2RlIGJlY2F1c2UgaXQgbmVlZHMgdG8gcHJlc2VydmUgdHlwZSBhcmd1bWVudHMgb24gIgogICAgICAgICAgImFsbCBnZW5lcmljIHN1YnR5cGVzIG9mICcje3JlY2VpdmVyVHlwZX0nLCBldmVuIGlmIHRoZXkgYXJlIG5vdCAiCiAgICAgICAgICAibmVjZXNzYXJ5IGVsc2V3aGVyZS4iLAogICAgICAgICAgaG93VG9GaXg6ICJJZiB1c2VkIG9ubHkgZm9yIGRlYnVnZ2luZywgY29uc2lkZXIgdXNpbmcgb3B0aW9uICIKICAgICAgICAgICAgICAiJHtGbGFncy5sYXhSdW50aW1lVHlwZVRvU3RyaW5nfSB0byByZWR1Y2UgdGhlIGNvZGUgc2l6ZSAiCiAgICAgICAgICAgICAgImltcGFjdC4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLk5PTl9OQVRJVkVfRVhURVJOQUw6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLk5PTl9OQVRJVkVfRVhURVJOQUwsCiAgICAgICAgICAiT25seSBleHRlcm5hbCBqcy1pbnRlcm9wIGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkLiIsCiAgICAgICAgICBob3dUb0ZpeDoKICAgICAgICAgICAgICAiVHJ5IHJlbW92aW5nICdleHRlcm5hbCcga2V5d29yZCBvciBhbm5vdGF0aW5nIHRoZSBmdW5jdGlvbiAiCiAgICAgICAgICAgICAgImFzIGEganMtaW50ZXJvcCBmdW5jdGlvbi4iKSwKCiAgICAgIE1lc3NhZ2VLaW5kLk5BVElWRV9OT05fSU5TVEFOQ0VfSU5fTk9OX05BVElWRV9DTEFTUzogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuTkFUSVZFX05PTl9JTlNUQU5DRV9JTl9OT05fTkFUSVZFX0NMQVNTLAogICAgICAgICAgIk5hdGl2ZSBub24taW5zdGFuY2UgbWVtYmVycyBhcmUgb25seSBhbGxvd2VkIGluIG5hdGl2ZSBjbGFzc2VzLiIpLAoKICAgICAgLy8gVE9ETygzMjU1Nyk6IFJlbW92ZSB0aGVzZSB3aGVuIGlzc3VlIDMyNTU3IGlzIGZpeGVkLgogICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9WQUxVRV9PVkVSUklERVNfRVFVQUxTOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9WQUxVRV9PVkVSUklERVNfRVFVQUxTLAogICAgICAgICAgIidjYXNlJyBleHByZXNzaW9uIHR5cGUgJyN7dHlwZX0nIG92ZXJyaWRlcyAnb3BlcmF0b3IgPT0nLiIpLAogICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9GT1JCSURERU46IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX0ZPUkJJRERFTiwKICAgICAgICAgICInY2FzZScgZXhwcmVzc2lvbiBtYXkgbm90IGJlIG9mIHR5cGUgJyN7dHlwZX0nLiIpLAogICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9UWVBFU19OT1RfRVFVQUw6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX1RZUEVTX05PVF9FUVVBTCwKICAgICAgICAgICInY2FzZScgZXhwcmVzc2lvbnMgZG8gbm90IGFsbCBoYXZlIHR5cGUgJyN7dHlwZX0nLiIpLAogICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9UWVBFU19OT1RfRVFVQUxfQ0FTRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICAgICAgTWVzc2FnZUtpbmQuU1dJVENIX0NBU0VfVFlQRVNfTk9UX0VRVUFMX0NBU0UsCiAgICAgICAgICAiJ2Nhc2UnIGV4cHJlc3Npb24gb2YgdHlwZSAnI3t0eXBlfScuIiksCiAgICB9KTsgLy8gRW5kIG9mIFRFTVBMQVRFUy4KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gdGVtcGxhdGU7CgogIE1lc3NhZ2UgbWVzc2FnZShbTWFwIGFyZ3VtZW50cyA9IGNvbnN0IHt9LCBib29sIHRlcnNlID0gZmFsc2VdKSB7CiAgICByZXR1cm4gbmV3IE1lc3NhZ2UodGhpcywgYXJndW1lbnRzLCB0ZXJzZSk7CiAgfQoKICBib29sIGdldCBoYXNIb3dUb0ZpeCA9PiBob3dUb0ZpeCAhPSBudWxsICYmIGhvd1RvRml4ICE9IERPTlRfS05PV19IT1dfVE9fRklYOwp9CgpjbGFzcyBNZXNzYWdlIHsKICBmaW5hbCBNZXNzYWdlVGVtcGxhdGUgdGVtcGxhdGU7CiAgZmluYWwgTWFwIGFyZ3VtZW50czsKICBmaW5hbCBib29sIHRlcnNlOwogIFN0cmluZyBtZXNzYWdlOwoKICBNZXNzYWdlKHRoaXMudGVtcGxhdGUsIHRoaXMuYXJndW1lbnRzLCB0aGlzLnRlcnNlKSB7CiAgICBhc3NlcnQoKCkgewogICAgICBjb21wdXRlTWVzc2FnZSgpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0oKSk7CiAgfQoKICBNZXNzYWdlS2luZCBnZXQga2luZCA9PiB0ZW1wbGF0ZS5raW5kOwoKICBTdHJpbmcgY29tcHV0ZU1lc3NhZ2UoKSB7CiAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CiAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZS50ZW1wbGF0ZTsKICAgICAgYXJndW1lbnRzLmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlQWxsKCcjeyR7a2V5fX0nLCBjb252ZXJ0VG9TdHJpbmcodmFsdWUpKTsKICAgICAgfSk7CiAgICAgIGFzc2VydCgKICAgICAgICAgIGtpbmQgPT0gTWVzc2FnZUtpbmQuR0VORVJJQyB8fAogICAgICAgICAgICAgICFtZXNzYWdlLmNvbnRhaW5zKG5ldyBSZWdFeHAocicjXHsuK1x9JykpLAogICAgICAgICAgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICAgICAnTWlzc2luZyBhcmd1bWVudHMgaW4gZXJyb3IgbWVzc2FnZTogIiRtZXNzYWdlIicpKTsKICAgICAgaWYgKCF0ZXJzZSAmJiB0ZW1wbGF0ZS5oYXNIb3dUb0ZpeCkgewogICAgICAgIFN0cmluZyBob3dUb0ZpeCA9IHRlbXBsYXRlLmhvd1RvRml4OwogICAgICAgIGFyZ3VtZW50cy5mb3JFYWNoKChrZXksIHZhbHVlKSB7CiAgICAgICAgICBob3dUb0ZpeCA9IGhvd1RvRml4LnJlcGxhY2VBbGwoJyN7JHtrZXl9fScsIGNvbnZlcnRUb1N0cmluZyh2YWx1ZSkpOwogICAgICAgIH0pOwogICAgICAgIG1lc3NhZ2UgPSAnJG1lc3NhZ2VcbiRob3dUb0ZpeCc7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtZXNzYWdlOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIGNvbXB1dGVNZXNzYWdlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIE1lc3NhZ2UpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiAodGVtcGxhdGUgPT0gb3RoZXIudGVtcGxhdGUpICYmICh0b1N0cmluZygpID09IG90aGVyLnRvU3RyaW5nKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignTWVzc2FnZS5oYXNoQ29kZScpOwoKICBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyh2YWx1ZSkgewogICAgaWYgKHZhbHVlIGlzIENvbnN0YW50RXhwcmVzc2lvbikgewogICAgICB2YWx1ZSA9IHZhbHVlLnRvRGFydFRleHQoKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlID0gdG9rZW5Ub1N0cmluZyh2YWx1ZSk7CiAgICB9CiAgICByZXR1cm4gJyR2YWx1ZSc7CiAgfQp9CoMDAE5OPAFDRgQiBE1GT00mGgFNATxAJic4ATIBJRMTEhQZGB8RICEZFxMXHxgLEBMZKxggNBkeJCQqJCUgGBonIB0kIScaJjMkIxQcGhc2LS0oIiIiLSo7GhUoHysYFx8SGwwZJBchIhMUKBQWFCYmGhkfIC46GSYfJAIBTUsuRisYGgEtGQFQGQEjNgZRTy4XAToeATJHASoGTBlDQxkoM1FQG0EBOUQBRjMrAUg1PgFNOiUBOidFAT0hRVEoPSAQKwEcARQoARcbEBIOAUk2Rk0aHBAlAQ4UJQoBERgKDRAlAQ4ULQoBERwKDA4BSyEaTEhME1EpIBAOHwIcGQIXBA4BSTY1AVRBUEhEAT0hRU4fSwFPPE5BHBArARQaGRABFyEQEg4BUT5KP0xJIBwQKwEUGioQARcqEBIOOyFDQTs1STYyNzEBPFEBQS42ESsBPitBKhwQKBsBCgUQGCEBCgUQHiUBCgQOAUEuRRRNTQFALT0BRjM9AUc0OwE+IUZSATonOx9DLhwQDg4CFwQOATsoUEQUUiRGAUMwUBgUTS4cEA0NAhQEDgE+K0MUTCEcEAkmBQ4BOk04HBAJJwUOATsoQAErSRgBQkMwAUUvASoBMQEuAUIvBgFALVABOic7ATdPATMgRDM+AUw5UC4BTjtNTRsBUT5JTTwBSzhJTxgBTjtKRAFBLjIuAT8sSgFINUlMIQFALU8BRTI5Tkc8AUs4SU0hAUs4SU0VAUQxSUwWAUc0SUwhAUs4SUwVAUEuSQFNOk06AUQhTEBAPAFDIUtAPzsBRiFOQEI+AUs4US4BSjdQLgFHNEYbAT9RAUc0KwFPQDUBTjABQC1KRBgiSgE/LEpMTCJKAUAtR1BOAUg1TUpISUkaAUk2SU9NIklJGgE+Kz8UTCwBUj9OAT5NOkhALT5GM0FLODMdAQwhAUQwBAFQAgEQIhcUEgE3EBgTCgQBKQEcGyMnSwoOKTkuQiwtKU8MKQgGFAQBDBYdBAEMHClNBAEMRgEpJyINJAYVBAIBLnBhY2thZ2U6Y29tcGlsZXIvc3JjL2RpYWdub3N0aWNzL21lc3NhZ2VzLmRhcnQuc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvZW52aXJvbm1lbnQuZGFydIMQLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBDb2xsZWN0cyBkZWZpbml0aW9ucyBwcm92aWRlZCB0byB0aGUgY29tcGlsZXIgdmlhIHRoZSBgLURgIGZsYWcuCi8vLwovLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbiBiZSB1c2VkIGluIHRoZSB1c2VyIGNvZGUgaW4gdHdvIHdheXMuIEZyb20KLy8vIGNvbmRpdGlvbmFsIGltcG9ydHMsIGFuZCBmcm9tIGBjb25zdCBTdHJpbmcuZnJvbUVudmlyb25tZW50YCBhbmQKLy8vIG90aGVyIHNpbWlsYXIgY29uc3RydWN0b3JzLgphYnN0cmFjdCBjbGFzcyBFbnZpcm9ubWVudCB7CiAgLy8vIFJldHVybiB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCBgYm9vbC5mcm9tRW52aXJvbm1lbnRgIGFuZCBgaW50LmZyb21FbnZpcm9ubWVudGAgYXJlIGFsc28KICAvLy8gaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgYFN0cmluZy5mcm9tRW52aXJvbm1lbnRgLgogIFN0cmluZyB2YWx1ZU9mKFN0cmluZyBrZXkpOwoKICAvLy8gUmV0dXJucyB0aGUgZnVsbCBlbnZpcm9ubWVudCBhcyBtYXAuCiAgTWFwPFN0cmluZywgU3RyaW5nPiB0b01hcCgpOwp9ChUATk48AUUESUUgHTAGSjgeASsfAgElcGFja2FnZTpjb21waWxlci9zcmMvZW52aXJvbm1lbnQuZGFydDdzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pby9sb2NhdGlvbl9wcm92aWRlci5kYXJ0hjAvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmlvLmxvY2F0aW9uX3Byb3ZpZGVyOwoKaW1wb3J0ICdjb2RlX291dHB1dC5kYXJ0JyBzaG93IENvZGVPdXRwdXRMaXN0ZW5lcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgTG9jYXRpb24sIFNvdXJjZTsKCi8vLyBJbnRlcmZhY2UgZm9yIHByb3ZpZGluZyBsaW5lL2NvbHVtbiBpbmZvcm1hdGlvbi4KYWJzdHJhY3QgY2xhc3MgTG9jYXRpb25Qcm92aWRlciB7CiAgLy8vIFRyYW5zbGF0ZXMgdGhlIHplcm8tYmFzZWQgY2hhcmFjdGVyIFtvZmZzZXRdIChmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYQogIC8vLyBmaWxlKSB0byBhIFtMb2NhdGlvbl0uCiAgTG9jYXRpb24gZ2V0TG9jYXRpb24oaW50IG9mZnNldCk7Cn0KCi8vLyBbQ29kZU91dHB1dExpc3RlbmVyXSB0aGF0IGNvbGxlY3RzIGxpbmUgaW5mb3JtYXRpb24uCmNsYXNzIExvY2F0aW9uQ29sbGVjdG9yIGV4dGVuZHMgQ29kZU91dHB1dExpc3RlbmVyIGltcGxlbWVudHMgTG9jYXRpb25Qcm92aWRlciB7CiAgaW50IGxlbmd0aCA9IDA7CiAgTGlzdDxpbnQ+IGxpbmVTdGFydHMgPSA8aW50PlswXTsKCiAgdm9pZCBfY29sbGVjdChTdHJpbmcgdGV4dCkgewogICAgaW50IGluZGV4ID0gMDsKICAgIHdoaWxlIChpbmRleCA8IHRleHQubGVuZ3RoKSB7CiAgICAgIC8vIFVuaXggdXNlcyAnXG4nIGFuZCBXaW5kb3dzIHVzZXMgJ1xyXG4nLCBzbyB0aGlzIGFsZ29yaXRobSB3b3JrcyBmb3IKICAgICAgLy8gYm90aCBwbGF0Zm9ybXMuCiAgICAgIGluZGV4ID0gdGV4dC5pbmRleE9mKCdcbicsIGluZGV4KSArIDE7CiAgICAgIGlmIChpbmRleCA8PSAwKSBicmVhazsKICAgICAgbGluZVN0YXJ0cy5hZGQobGVuZ3RoICsgaW5kZXgpOwogICAgfQogICAgbGVuZ3RoICs9IHRleHQubGVuZ3RoOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBvblRleHQoU3RyaW5nIHRleHQpIHsKICAgIF9jb2xsZWN0KHRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgTG9jYXRpb24gZ2V0TG9jYXRpb24oaW50IG9mZnNldCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbHVlSW5JbnRlcnZhbChvZmZzZXQsIDAsIGxlbmd0aCwgJ29mZnNldCcpOwogICAgcmV0dXJuIG5ldyBTb3VyY2UobGluZVN0YXJ0cywgbnVsbCwgbnVsbCwgbnVsbCkuZ2V0TG9jYXRpb24obnVsbCwgb2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgb25Eb25lKGludCBsZW5ndGgpIHsKICAgIGxpbmVTdGFydHMuYWRkKGxlbmd0aCArIDEpOwogICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ2xpbmVTdGFydHM9JGxpbmVTdGFydHMsbGVuZ3RoPSRsZW5ndGgnOwogIH0KfQo6AE5OPAEmATMBOAE1IkwdJAIBOVESIwEfEyJNGS0dJgYbBAEMHRQEAQwlQk8EAQwcIBoEAQwWNAQCAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9pby9sb2NhdGlvbl9wcm92aWRlci5kYXJ0J3Nka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL2JpbmFyeS90YWcuZGFydJjELy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuYmluYXJ5LnRhZzsKCmNsYXNzIFRhZyB7CiAgc3RhdGljIGNvbnN0IGludCBOb3RoaW5nID0gMDsKICBzdGF0aWMgY29uc3QgaW50IFNvbWV0aGluZyA9IDE7CgogIHN0YXRpYyBjb25zdCBpbnQgQ2xhc3MgPSAyOwoKICBzdGF0aWMgY29uc3QgaW50IEZ1bmN0aW9uTm9kZSA9IDM7CgogIC8vIE1lbWJlcnMKICBzdGF0aWMgY29uc3QgaW50IEZpZWxkID0gNDsKICBzdGF0aWMgY29uc3QgaW50IENvbnN0cnVjdG9yID0gNTsKICBzdGF0aWMgY29uc3QgaW50IFByb2NlZHVyZSA9IDY7CiAgc3RhdGljIGNvbnN0IGludCBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciA9IDEwODsKCiAgLy8gSW5pdGlhbGl6ZXJzCiAgc3RhdGljIGNvbnN0IGludCBJbnZhbGlkSW5pdGlhbGl6ZXIgPSA3OwogIHN0YXRpYyBjb25zdCBpbnQgRmllbGRJbml0aWFsaXplciA9IDg7CiAgc3RhdGljIGNvbnN0IGludCBTdXBlckluaXRpYWxpemVyID0gOTsKICBzdGF0aWMgY29uc3QgaW50IFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgPSAxMDsKICBzdGF0aWMgY29uc3QgaW50IExvY2FsSW5pdGlhbGl6ZXIgPSAxMTsKICBzdGF0aWMgY29uc3QgaW50IEFzc2VydEluaXRpYWxpemVyID0gMTI7CgogIC8vIEV4cHJlc3Npb25zCiAgc3RhdGljIGNvbnN0IGludCBDaGVja0xpYnJhcnlJc0xvYWRlZCA9IDEzOwogIHN0YXRpYyBjb25zdCBpbnQgTG9hZExpYnJhcnkgPSAxNDsKICBzdGF0aWMgY29uc3QgaW50IERpcmVjdFByb3BlcnR5R2V0ID0gMTU7CiAgc3RhdGljIGNvbnN0IGludCBEaXJlY3RQcm9wZXJ0eVNldCA9IDE2OwogIHN0YXRpYyBjb25zdCBpbnQgRGlyZWN0TWV0aG9kSW52b2NhdGlvbiA9IDE3OwogIHN0YXRpYyBjb25zdCBpbnQgQ29uc3RTdGF0aWNJbnZvY2F0aW9uID0gMTg7CiAgc3RhdGljIGNvbnN0IGludCBJbnZhbGlkRXhwcmVzc2lvbiA9IDE5OwogIHN0YXRpYyBjb25zdCBpbnQgVmFyaWFibGVHZXQgPSAyMDsKICBzdGF0aWMgY29uc3QgaW50IFZhcmlhYmxlU2V0ID0gMjE7CiAgc3RhdGljIGNvbnN0IGludCBQcm9wZXJ0eUdldCA9IDIyOwogIHN0YXRpYyBjb25zdCBpbnQgUHJvcGVydHlTZXQgPSAyMzsKICBzdGF0aWMgY29uc3QgaW50IFN1cGVyUHJvcGVydHlHZXQgPSAyNDsKICBzdGF0aWMgY29uc3QgaW50IFN1cGVyUHJvcGVydHlTZXQgPSAyNTsKICBzdGF0aWMgY29uc3QgaW50IFN0YXRpY0dldCA9IDI2OwogIHN0YXRpYyBjb25zdCBpbnQgU3RhdGljU2V0ID0gMjc7CiAgc3RhdGljIGNvbnN0IGludCBNZXRob2RJbnZvY2F0aW9uID0gMjg7CiAgc3RhdGljIGNvbnN0IGludCBTdXBlck1ldGhvZEludm9jYXRpb24gPSAyOTsKICBzdGF0aWMgY29uc3QgaW50IFN0YXRpY0ludm9jYXRpb24gPSAzMDsKICBzdGF0aWMgY29uc3QgaW50IENvbnN0cnVjdG9ySW52b2NhdGlvbiA9IDMxOwogIHN0YXRpYyBjb25zdCBpbnQgQ29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb24gPSAzMjsKICBzdGF0aWMgY29uc3QgaW50IE5vdCA9IDMzOwogIHN0YXRpYyBjb25zdCBpbnQgTG9naWNhbEV4cHJlc3Npb24gPSAzNDsKICBzdGF0aWMgY29uc3QgaW50IENvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IDM1OwogIHN0YXRpYyBjb25zdCBpbnQgU3RyaW5nQ29uY2F0ZW5hdGlvbiA9IDM2OwogIHN0YXRpYyBjb25zdCBpbnQgTGlzdENvbmNhdGVuYXRpb24gPSAxMTE7CiAgc3RhdGljIGNvbnN0IGludCBTZXRDb25jYXRlbmF0aW9uID0gMTEyOwogIHN0YXRpYyBjb25zdCBpbnQgTWFwQ29uY2F0ZW5hdGlvbiA9IDExMzsKICBzdGF0aWMgY29uc3QgaW50IEluc3RhbmNlQ3JlYXRpb24gPSAxMTQ7CiAgc3RhdGljIGNvbnN0IGludCBJc0V4cHJlc3Npb24gPSAzNzsKICBzdGF0aWMgY29uc3QgaW50IEFzRXhwcmVzc2lvbiA9IDM4OwogIHN0YXRpYyBjb25zdCBpbnQgU3RyaW5nTGl0ZXJhbCA9IDM5OwogIHN0YXRpYyBjb25zdCBpbnQgRG91YmxlTGl0ZXJhbCA9IDQwOwogIHN0YXRpYyBjb25zdCBpbnQgVHJ1ZUxpdGVyYWwgPSA0MTsKICBzdGF0aWMgY29uc3QgaW50IEZhbHNlTGl0ZXJhbCA9IDQyOwogIHN0YXRpYyBjb25zdCBpbnQgTnVsbExpdGVyYWwgPSA0MzsKICBzdGF0aWMgY29uc3QgaW50IFN5bWJvbExpdGVyYWwgPSA0NDsKICBzdGF0aWMgY29uc3QgaW50IFR5cGVMaXRlcmFsID0gNDU7CiAgc3RhdGljIGNvbnN0IGludCBUaGlzRXhwcmVzc2lvbiA9IDQ2OwogIHN0YXRpYyBjb25zdCBpbnQgUmV0aHJvdyA9IDQ3OwogIHN0YXRpYyBjb25zdCBpbnQgVGhyb3cgPSA0ODsKICBzdGF0aWMgY29uc3QgaW50IExpc3RMaXRlcmFsID0gNDk7CiAgc3RhdGljIGNvbnN0IGludCBNYXBMaXRlcmFsID0gNTA7CiAgc3RhdGljIGNvbnN0IGludCBBd2FpdEV4cHJlc3Npb24gPSA1MTsKICBzdGF0aWMgY29uc3QgaW50IEZ1bmN0aW9uRXhwcmVzc2lvbiA9IDUyOwogIHN0YXRpYyBjb25zdCBpbnQgTGV0ID0gNTM7CiAgc3RhdGljIGNvbnN0IGludCBCbG9ja0V4cHJlc3Npb24gPSA4MjsKICBzdGF0aWMgY29uc3QgaW50IEluc3RhbnRpYXRpb24gPSA1NDsKICBzdGF0aWMgY29uc3QgaW50IFBvc2l0aXZlSW50TGl0ZXJhbCA9IDU1OwogIHN0YXRpYyBjb25zdCBpbnQgTmVnYXRpdmVJbnRMaXRlcmFsID0gNTY7CiAgc3RhdGljIGNvbnN0IGludCBCaWdJbnRMaXRlcmFsID0gNTc7CiAgc3RhdGljIGNvbnN0IGludCBDb25zdExpc3RMaXRlcmFsID0gNTg7CiAgc3RhdGljIGNvbnN0IGludCBDb25zdE1hcExpdGVyYWwgPSA1OTsKICBzdGF0aWMgY29uc3QgaW50IFNldExpdGVyYWwgPSAxMDk7CiAgc3RhdGljIGNvbnN0IGludCBDb25zdFNldExpdGVyYWwgPSAxMTA7CgogIC8vIFN0YXRlbWVudHMKICBzdGF0aWMgY29uc3QgaW50IEV4cHJlc3Npb25TdGF0ZW1lbnQgPSA2MTsKICBzdGF0aWMgY29uc3QgaW50IEJsb2NrID0gNjI7CiAgc3RhdGljIGNvbnN0IGludCBFbXB0eVN0YXRlbWVudCA9IDYzOwogIHN0YXRpYyBjb25zdCBpbnQgQXNzZXJ0U3RhdGVtZW50ID0gNjQ7CiAgc3RhdGljIGNvbnN0IGludCBMYWJlbGVkU3RhdGVtZW50ID0gNjU7CiAgc3RhdGljIGNvbnN0IGludCBCcmVha1N0YXRlbWVudCA9IDY2OwogIHN0YXRpYyBjb25zdCBpbnQgV2hpbGVTdGF0ZW1lbnQgPSA2NzsKICBzdGF0aWMgY29uc3QgaW50IERvU3RhdGVtZW50ID0gNjg7CiAgc3RhdGljIGNvbnN0IGludCBGb3JTdGF0ZW1lbnQgPSA2OTsKICBzdGF0aWMgY29uc3QgaW50IEZvckluU3RhdGVtZW50ID0gNzA7CiAgc3RhdGljIGNvbnN0IGludCBTd2l0Y2hTdGF0ZW1lbnQgPSA3MTsKICBzdGF0aWMgY29uc3QgaW50IENvbnRpbnVlU3dpdGNoU3RhdGVtZW50ID0gNzI7CiAgc3RhdGljIGNvbnN0IGludCBJZlN0YXRlbWVudCA9IDczOwogIHN0YXRpYyBjb25zdCBpbnQgUmV0dXJuU3RhdGVtZW50ID0gNzQ7CiAgc3RhdGljIGNvbnN0IGludCBUcnlDYXRjaCA9IDc1OwogIHN0YXRpYyBjb25zdCBpbnQgVHJ5RmluYWxseSA9IDc2OwogIHN0YXRpYyBjb25zdCBpbnQgWWllbGRTdGF0ZW1lbnQgPSA3NzsKICBzdGF0aWMgY29uc3QgaW50IFZhcmlhYmxlRGVjbGFyYXRpb24gPSA3ODsKICBzdGF0aWMgY29uc3QgaW50IEZ1bmN0aW9uRGVjbGFyYXRpb24gPSA3OTsKICBzdGF0aWMgY29uc3QgaW50IEFzeW5jRm9ySW5TdGF0ZW1lbnQgPSA4MDsKICBzdGF0aWMgY29uc3QgaW50IEFzc2VydEJsb2NrID0gODE7CiAgLy8gODIgaXMgb2NjdXBpZWQgYnkgW0Jsb2NrRXhwcmVzc2lvbl0gKGV4cHJlc3Npb24pLgoKICAvLyBUeXBlcwogIHN0YXRpYyBjb25zdCBpbnQgVHlwZWRlZlR5cGUgPSA4NzsKICBzdGF0aWMgY29uc3QgaW50IEJvdHRvbVR5cGUgPSA4OTsKICBzdGF0aWMgY29uc3QgaW50IEludmFsaWRUeXBlID0gOTA7CiAgc3RhdGljIGNvbnN0IGludCBEeW5hbWljVHlwZSA9IDkxOwogIHN0YXRpYyBjb25zdCBpbnQgVm9pZFR5cGUgPSA5MjsKICBzdGF0aWMgY29uc3QgaW50IEludGVyZmFjZVR5cGUgPSA5MzsKICBzdGF0aWMgY29uc3QgaW50IEZ1bmN0aW9uVHlwZSA9IDk0OwogIHN0YXRpYyBjb25zdCBpbnQgVHlwZVBhcmFtZXRlclR5cGUgPSA5NTsKICBzdGF0aWMgY29uc3QgaW50IFNpbXBsZUludGVyZmFjZVR5cGUgPSA5NjsKICBzdGF0aWMgY29uc3QgaW50IFNpbXBsZUZ1bmN0aW9uVHlwZSA9IDk3OwoKICAvLyBSZWZlcmVuY2VzCiAgc3RhdGljIGNvbnN0IGludCBOdWxsUmVmZXJlbmNlID0gOTk7CiAgc3RhdGljIGNvbnN0IGludCBDbGFzc1JlZmVyZW5jZSA9IDEwMDsKICBzdGF0aWMgY29uc3QgaW50IE1lbWJlclJlZmVyZW5jZSA9IDEwMTsKCiAgc3RhdGljIGNvbnN0IGludCBDb25zdGFudEV4cHJlc3Npb24gPSAxMDY7CgogIC8vIFRhZyBpcyBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMjQuCiAgc3RhdGljIGNvbnN0IGludCBEZXByZWNhdGVkX0NvbnN0YW50RXhwcmVzc2lvbiA9IDEwNzsKCiAgLy8vIDEwOCBpcyBvY2N1cGllZCBieSBbUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JdIChtZW1iZXIpLgogIC8vLyAxMDkgaXMgb2NjdXBpZWQgYnkgW1NldExpdGVyYWxdIChleHByZXNzaW9uKS4KICAvLy8gMTEwIGlzIG9jY3VwaWVkIGJ5IFtDb25zdFNldExpdGVyYWxdIChleHByZXNzaW9uKS4KICAvLy8gMTExIGlzIG9jY3VwaWVkIGJ5IFtMaXN0Q29uY2F0ZW5hdGlvbl0gKGV4cHJlc3Npb24pLgogIC8vLyAxMTIgaXMgb2NjdXBpZWQgYnkgW1NldENvbmNhdGVuYXRpb25dIChleHByZXNzaW9uKS4KICAvLy8gMTEzIGlzIG9jY3VwaWVkIGJ5IFtNYXBDb25jYXRlbmF0aW9uXSAoZXhwcmVzc2lvbikuCiAgLy8vIDExNCBpcyBvY2N1cGllZCBieSBbSW5zdGFuY2VDcmVhdGlvbl0gKGV4cHJlc3Npb24pLgoKICBzdGF0aWMgY29uc3QgaW50IFNwZWNpYWxpemVkVGFnSGlnaEJpdCA9IDB4ODA7IC8vIDEwMDAwMDAwCiAgc3RhdGljIGNvbnN0IGludCBTcGVjaWFsaXplZFRhZ01hc2sgPSAweEY4OyAvLyAxMTExMTAwMAogIHN0YXRpYyBjb25zdCBpbnQgU3BlY2lhbGl6ZWRQYXlsb2FkTWFzayA9IDB4NzsgLy8gMDAwMDAxMTEKCiAgc3RhdGljIGNvbnN0IGludCBTcGVjaWFsaXplZFZhcmlhYmxlR2V0ID0gMTI4OwogIHN0YXRpYyBjb25zdCBpbnQgU3BlY2lhbGl6ZWRWYXJpYWJsZVNldCA9IDEzNjsKICBzdGF0aWMgY29uc3QgaW50IFNwZWNpYWxpemVkSW50TGl0ZXJhbCA9IDE0NDsKCiAgc3RhdGljIGNvbnN0IGludCBTcGVjaWFsaXplZEludExpdGVyYWxCaWFzID0gMzsKCiAgc3RhdGljIGNvbnN0IGludCBDb21wb25lbnRGaWxlID0gMHg5MEFCQ0RFRjsKCiAgLy8vIEludGVybmFsIHZlcnNpb24gb2Yga2VybmVsIGJpbmFyeSBmb3JtYXQuCiAgLy8vIEJ1bXAgaXQgd2hlbiBtYWtpbmcgaW5jb21wYXRpYmxlIGNoYW5nZXMgaW4ga2VybmVsIGJpbmFyaWVzLgogIC8vLyBLZWVwIGluIHN5bmMgd2l0aCBydW50aW1lL3ZtL2tlcm5lbF9iaW5hcnkuaCwgcGtnL2tlcm5lbC9iaW5hcnkubWQuCiAgc3RhdGljIGNvbnN0IGludCBCaW5hcnlGb3JtYXRWZXJzaW9uID0gMjc7Cn0KCmFic3RyYWN0IGNsYXNzIENvbnN0YW50VGFnIHsKICBzdGF0aWMgY29uc3QgaW50IE51bGxDb25zdGFudCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBCb29sQ29uc3RhbnQgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgSW50Q29uc3RhbnQgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgRG91YmxlQ29uc3RhbnQgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgU3RyaW5nQ29uc3RhbnQgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgU3ltYm9sQ29uc3RhbnQgPSA1OwogIHN0YXRpYyBjb25zdCBpbnQgTWFwQ29uc3RhbnQgPSA2OwogIHN0YXRpYyBjb25zdCBpbnQgTGlzdENvbnN0YW50ID0gNzsKICBzdGF0aWMgY29uc3QgaW50IFNldENvbnN0YW50ID0gMTM7CiAgc3RhdGljIGNvbnN0IGludCBJbnN0YW5jZUNvbnN0YW50ID0gODsKICBzdGF0aWMgY29uc3QgaW50IFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQgPSA5OwogIHN0YXRpYyBjb25zdCBpbnQgVGVhck9mZkNvbnN0YW50ID0gMTA7CiAgc3RhdGljIGNvbnN0IGludCBUeXBlTGl0ZXJhbENvbnN0YW50ID0gMTE7CiAgc3RhdGljIGNvbnN0IGludCBVbmV2YWx1YXRlZENvbnN0YW50ID0gMTI7CiAgLy8gMTMgaXMgb2NjdXBpZWQgYnkgW1NldENvbnN0YW50XQp9CoCuAE5OPBsBDCAiAR4BJQENHiQiOAESKykpMCorAREuJSsrMC8rJSUlJSoqIyMqLyovNB0rLy0sKysrJiYnJyUmJSclKCEfJSQpLB0pJywsJyopJSoBEC0fKCkqKCglJigpMSUpIiQoLS0tJTcBCyUkJSUiJyYrLSwBECcpKgEtASk4AUM0OTs6OjoBPTo9ATExMAEyAS8BMENKLQIBHSUlJCcnJyQlJSk1KS0tJQIBHnBhY2thZ2U6a2VybmVsL2JpbmFyeS90YWcuZGFydClzZGtyb290Oi9wa2cva2VybmVsL2xpYi9pbXBvcnRfdGFibGUuZGFydJNbLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuaW1wb3J0X3RhYmxlOwoKaW1wb3J0ICdhc3QuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBJbXBvcnRUYWJsZSB7CiAgaW50IGdldEltcG9ydEluZGV4KExpYnJhcnkgbGlicmFyeSk7Cn0KCmNsYXNzIENvbXBvbmVudEltcG9ydFRhYmxlIGltcGxlbWVudHMgSW1wb3J0VGFibGUgewogIGZpbmFsIE1hcDxMaWJyYXJ5LCBpbnQ+IF9saWJyYXJ5SW5kZXggPSA8TGlicmFyeSwgaW50Pnt9OwoKICBDb21wb25lbnRJbXBvcnRUYWJsZShDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudC5saWJyYXJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgX2xpYnJhcnlJbmRleFtjb21wb25lbnQubGlicmFyaWVzW2ldXSA9IGk7CiAgICB9CiAgfQoKICBpbnQgZ2V0SW1wb3J0SW5kZXgoTGlicmFyeSBsaWJyYXJ5KSA9PiBfbGlicmFyeUluZGV4W2xpYnJhcnldID8/IC0xOwp9CgpjbGFzcyBMaWJyYXJ5SW1wb3J0VGFibGUgaW1wbGVtZW50cyBJbXBvcnRUYWJsZSB7CiAgZmluYWwgTGlzdDxTdHJpbmc+IF9pbXBvcnRQYXRocyA9IDxTdHJpbmc+W107CiAgZmluYWwgTGlzdDxMaWJyYXJ5PiBfaW1wb3J0ZWRMaWJyYXJpZXMgPSA8TGlicmFyeT5bXTsKICBmaW5hbCBNYXA8TGlicmFyeSwgaW50PiBfbGlicmFyeUluZGV4ID0gPExpYnJhcnksIGludD57fTsKCiAgZmFjdG9yeSBMaWJyYXJ5SW1wb3J0VGFibGUoTGlicmFyeSBsaWIpIHsKICAgIHJldHVybiBuZXcgX0ltcG9ydFRhYmxlQnVpbGRlcihsaWIpLmJ1aWxkKCk7CiAgfQoKICBMaWJyYXJ5SW1wb3J0VGFibGUuZW1wdHkoKTsKCiAgLy8vIFRoZSBsaXN0IG9mIGltcG9ydHMuCiAgLy8vCiAgLy8vIFNob3VsZCBub3QgYmUgbW9kaWZpZWQgZGlyZWN0bHksIGFzIHRoZSBpbmRleCBtYXAgd291bGQgZ28gb3V0IG9mIHN5bmMuCiAgTGlzdDxTdHJpbmc+IGdldCBpbXBvcnRQYXRocyA9PiBfaW1wb3J0UGF0aHM7CgogIExpc3Q8TGlicmFyeT4gZ2V0IGltcG9ydGVkTGlicmFyaWVzID0+IF9pbXBvcnRlZExpYnJhcmllczsKCiAgaW50IGFkZEltcG9ydChMaWJyYXJ5IHRhcmdldCwgU3RyaW5nIGltcG9ydFBhdGgpIHsKICAgIGludCBpbmRleCA9IF9saWJyYXJ5SW5kZXhbdGFyZ2V0XTsKICAgIGlmIChpbmRleCAhPSBudWxsKSByZXR1cm4gaW5kZXg7CiAgICBpbmRleCA9IF9pbXBvcnRQYXRocy5sZW5ndGg7CiAgICBfaW1wb3J0UGF0aHMuYWRkKGltcG9ydFBhdGgpOwogICAgX2ltcG9ydGVkTGlicmFyaWVzLmFkZCh0YXJnZXQpOwogICAgX2xpYnJhcnlJbmRleFt0YXJnZXRdID0gaW5kZXg7CiAgICByZXR1cm4gaW5kZXg7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIGltcG9ydCwgb3IgLTEgaWYgbm90IGZvdW5kLgogIGludCBnZXRJbXBvcnRJbmRleChMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIHJldHVybiBfbGlicmFyeUluZGV4W2xpYnJhcnldID8/IC0xOwogIH0KCiAgU3RyaW5nIGdldEltcG9ydFBhdGgoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICByZXR1cm4gX2ltcG9ydFBhdGhzW2dldEltcG9ydEluZGV4KGxpYnJhcnkpXTsKICB9Cn0KCi8vLyBCdWlsZHMgdGhlIGltcG9ydCB0YWJsZSBmb3IgYSBnaXZlbiBsaWJyYXJ5LgpjbGFzcyBfSW1wb3J0VGFibGVCdWlsZGVyIGV4dGVuZHMgUmVjdXJzaXZlVmlzaXRvciB7CiAgZmluYWwgTGlicmFyeUltcG9ydFRhYmxlIHRhYmxlID0gbmV3IExpYnJhcnlJbXBvcnRUYWJsZS5lbXB0eSgpOwogIGZpbmFsIExpYnJhcnkgcmVmZXJlbmNlTGlicmFyeTsKCiAgTGlicmFyeUltcG9ydFRhYmxlIGJ1aWxkKCkgewogICAgcmVmZXJlbmNlTGlicmFyeS5hY2NlcHQodGhpcyk7CiAgICByZXR1cm4gdGFibGU7CiAgfQoKICBfSW1wb3J0VGFibGVCdWlsZGVyKHRoaXMucmVmZXJlbmNlTGlicmFyeSkgewogICAgdGFibGUuYWRkSW1wb3J0KHJlZmVyZW5jZUxpYnJhcnksICcnKTsKICB9CgogIHZvaWQgYWRkTGlicmFyeUltcG9ydChMaWJyYXJ5IHRhcmdldCkgewogICAgaWYgKHRhcmdldCA9PSByZWZlcmVuY2VMaWJyYXJ5KSByZXR1cm47IC8vIFNlbGYtcmVmZXJlbmNlIGlzIHNwZWNpYWwuCiAgICB2YXIgcmVmZXJlbmNlVXJpID0gcmVmZXJlbmNlTGlicmFyeS5pbXBvcnRVcmk7CiAgICB2YXIgdGFyZ2V0VXJpID0gdGFyZ2V0LmltcG9ydFVyaTsKICAgIGlmICh0YXJnZXRVcmkgPT0gbnVsbCkgewogICAgICB0aHJvdyAnJHJlZmVyZW5jZVVyaSBjYW5ub3QgcmVmZXIgdG8gbGlicmFyeSB3aXRob3V0IGFuIGltcG9ydCBVUkknOwogICAgfQogICAgLy8gVG8gc3VwcG9ydCB1c2luZyBjdXN0b20tdXJpcyBpbiB1bml0IHRlc3RzLCB3ZSBkb24ndCBjaGVjayBkaXJlY3RseQogICAgLy8gd2hldGhlciB0aGUgc2NoZW1lIGlzICdmaWxlOicsIGJ1dCBpbnN0ZWFkIHdlIGNoZWNrIHRoYXQgaXMgbm90ICdkYXJ0OicKICAgIC8vIG9yICdwYWNrYWdlOicuCiAgICBib29sIGlzRmlsZU9yQ3VzdG9tU2NoZW1lKHVyaSkgPT4KICAgICAgICB1cmkuc2NoZW1lICE9ICcnICYmIHVyaS5zY2hlbWUgIT0gJ3BhY2thZ2UnICYmIHVyaS5zY2hlbWUgIT0gJ2RhcnQnOwogICAgYm9vbCBpc1RhcmdldFNjaGVtZUZpbGVPckN1c3RvbSA9IGlzRmlsZU9yQ3VzdG9tU2NoZW1lKHRhcmdldFVyaSk7CiAgICBib29sIGlzUmVmZXJlbmNlU2NoZW1lRmlsZU9yQ3VzdG9tID0gaXNGaWxlT3JDdXN0b21TY2hlbWUocmVmZXJlbmNlVXJpKTsKICAgIGlmIChpc1RhcmdldFNjaGVtZUZpbGVPckN1c3RvbSAmJiBpc1JlZmVyZW5jZVNjaGVtZUZpbGVPckN1c3RvbSkgewogICAgICBTdHJpbmcgcmVsYXRpdmVVcmkgPSByZWxhdGl2ZVVyaVBhdGgodGFyZ2V0VXJpLCByZWZlcmVuY2VVcmkpOwogICAgICB0YWJsZS5hZGRJbXBvcnQodGFyZ2V0LCByZWxhdGl2ZVVyaSk7CiAgICB9IGVsc2UgaWYgKGlzVGFyZ2V0U2NoZW1lRmlsZU9yQ3VzdG9tKSB7CiAgICAgIC8vIENhbm5vdCBpbXBvcnQgYSBmaWxlOlVSSSBmcm9tIGEgZGFydDpVUkkgb3IgcGFja2FnZTpVUkkuCiAgICAgIC8vIFdlIG1heSB3YW50IHRvIHJlbW92ZSB0aGlzIHJlc3RyaWN0aW9uLCBidXQgZm9yIG5vdyBpdCdzIGp1c3QgYSBzYW5pdHkKICAgICAgLy8gY2hlY2suCiAgICAgIHRocm93ICckcmVmZXJlbmNlVXJpIGNhbm5vdCByZWZlciB0byBhcHBsaWNhdGlvbiBsaWJyYXJ5ICR0YXJnZXRVcmknOwogICAgfSBlbHNlIHsKICAgICAgdGFibGUuYWRkSW1wb3J0KHRhcmdldCwgdGFyZ2V0LmltcG9ydFVyaS50b1N0cmluZygpKTsKICAgIH0KICB9CgogIHZpc2l0Q2xhc3NSZWZlcmVuY2UoQ2xhc3Mgbm9kZSkgewogICAgYWRkTGlicmFyeUltcG9ydChub2RlLmVuY2xvc2luZ0xpYnJhcnkpOwogIH0KCiAgdmlzaXRMaWJyYXJ5KExpYnJhcnkgbm9kZSkgewogICAgc3VwZXIudmlzaXRMaWJyYXJ5KG5vZGUpOwogICAgZm9yIChSZWZlcmVuY2UgZXhwb3J0ZWRSZWZlcmVuY2UgaW4gbm9kZS5hZGRpdGlvbmFsRXhwb3J0cykgewogICAgICBhZGRMaWJyYXJ5SW1wb3J0KGV4cG9ydGVkUmVmZXJlbmNlLm5vZGUucGFyZW50KTsKICAgIH0KICB9CgogIGRlZmF1bHRNZW1iZXJSZWZlcmVuY2UoTWVtYmVyIG5vZGUpIHsKICAgIGFkZExpYnJhcnlJbXBvcnQobm9kZS5lbmNsb3NpbmdMaWJyYXJ5KTsKICB9CgogIHZpc2l0TmFtZShOYW1lIG5hbWUpIHsKICAgIGlmIChuYW1lLmxpYnJhcnkgIT0gbnVsbCkgewogICAgICBhZGRMaWJyYXJ5SW1wb3J0KG5hbWUubGlicmFyeSk7CiAgICB9CiAgfQp9CgpTdHJpbmcgcmVsYXRpdmVVcmlQYXRoKFVyaSB0YXJnZXQsIFVyaSByZWYpIHsKICBMaXN0PFN0cmluZz4gdGFyZ2V0U2VnbWVudHMgPSB0YXJnZXQucGF0aFNlZ21lbnRzOwogIExpc3Q8U3RyaW5nPiByZWZTZWdtZW50cyA9IHJlZi5wYXRoU2VnbWVudHM7CiAgaW50IHRvID0gcmVmU2VnbWVudHMubGVuZ3RoOwogIGlmICh0YXJnZXRTZWdtZW50cy5sZW5ndGggPCB0bykgdG8gPSB0YXJnZXRTZWdtZW50cy5sZW5ndGg7CiAgdG8tLTsgLy8gVGhlIGxhc3QgZW50cnkgaXMgdGhlIGZpbGVuYW1lLCBoZXJlIHdlIGNvbXBhcmUgb25seSBkaXJlY3Rvcmllcy4KICBpbnQgc2FtZSA9IC0xOwogIGZvciAoaW50IGkgPSAwOyBpIDwgdG87IGkrKykgewogICAgaWYgKHRhcmdldFNlZ21lbnRzW2ldID09IHJlZlNlZ21lbnRzW2ldKSB7CiAgICAgIHNhbWUgPSBpOwogICAgfSBlbHNlIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChzYW1lID09IHRhcmdldFNlZ21lbnRzLmxlbmd0aCAtIDIgJiYKICAgICAgdGFyZ2V0U2VnbWVudHMubGVuZ3RoID09IHJlZlNlZ21lbnRzLmxlbmd0aCkgewogICAgLy8gQm90aCBwYXJ0cyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBzZWdtZW50cywKICAgIC8vIGFuZCB0aGV5IGFncmVlIG9uIGFsbCBkaXJlY3Rvcmllcy4KICAgIGlmICh0YXJnZXRTZWdtZW50cy5sYXN0ID09ICIiKSByZXR1cm4gIi4iOwogICAgcmV0dXJuIHRhcmdldFNlZ21lbnRzLmxhc3Q7CiAgfQogIExpc3Q8U3RyaW5nPiBwYXRoID0gbmV3IExpc3Q8U3RyaW5nPigpOwogIGludCBva2VkID0gc2FtZSArIDE7CiAgd2hpbGUgKG9rZWQgPCByZWZTZWdtZW50cy5sZW5ndGggLSAxKSB7CiAgICBwYXRoLmFkZCgiLi4iKTsKICAgIG9rZWQrKzsKICB9CiAgcGF0aC5hZGRBbGwodGFyZ2V0U2VnbWVudHMuc2tpcChzYW1lICsgMSkpOwoKICBpZiAocGF0aC5pc0VtcHR5KSBwYXRoLmFkZCgiLiIpOwogIHJldHVybiBwYXRoLmpvaW4oIi8iKTsKfQqAngBOTjwdARMBHScCATQ8AS47MQYEAUcCATIwODwBLDEEAR4BGwZOMAE9ATUnJSEiJCMSBAFBKCkEASoyBAIBMTVDIgEfIxIEAS8rBAEqSjMmHUsGS08WJk1HTUdFLC1CUBBMDTwGBAEkLQQBHx5CNwYEASgtBAEZICYGBAIBLjUvHz5NESEvEA0NBgQrNTQqLyAEKhcqFAwELgEjGQIBIHBhY2thZ2U6a2VybmVsL2ltcG9ydF90YWJsZS5kYXJ0QXNka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL3NyYy9oaWVyYXJjaHlfYmFzZWRfdHlwZV9lbnZpcm9ubWVudC5kYXJ0g0EvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBrZXJuZWwuaGllcmFyY2h5X2Jhc2VkX3R5cGVfZW52aXJvbm1lbnQ7CgppbXBvcnQgJy4uL2FzdC5kYXJ0JyBzaG93IENsYXNzLCBJbnRlcmZhY2VUeXBlOwoKaW1wb3J0ICcuLi9jbGFzc19oaWVyYXJjaHkuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeTsKCmltcG9ydCAnLi4vY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKCmltcG9ydCAnLi4vdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBzaG93IFR5cGVFbnZpcm9ubWVudDsKCmNsYXNzIEhpZXJhcmNoeUJhc2VkVHlwZUVudmlyb25tZW50IGV4dGVuZHMgVHlwZUVudmlyb25tZW50IHsKICBmaW5hbCBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHk7CgogIEhpZXJhcmNoeUJhc2VkVHlwZUVudmlyb25tZW50KENvcmVUeXBlcyBjb3JlVHlwZXMsIHRoaXMuaGllcmFyY2h5KQogICAgICA6IHN1cGVyLmZyb21TdWJjbGFzcyhjb3JlVHlwZXMpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldFR5cGVBc0luc3RhbmNlT2YoSW50ZXJmYWNlVHlwZSB0eXBlLCBDbGFzcyBzdXBlcmNsYXNzKSB7CiAgICByZXR1cm4gaGllcmFyY2h5LmdldFR5cGVBc0luc3RhbmNlT2YodHlwZSwgc3VwZXJjbGFzcyk7CiAgfQp9ChsATk48ATEBMAE2ASwBOAE+IgFFJwEMTDwEAgE4cGFja2FnZTprZXJuZWwvc3JjL2hpZXJhcmNoeV9iYXNlZF90eXBlX2Vudmlyb25tZW50LmRhcnQlc2Rrcm9vdDovcGtnL2tlcm5lbC9saWIvc3JjL2hlYXAuZGFydIZxLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBCYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBhIGhlYXAsIHdpdGggTyhsb2cgbikgaW5zZXJ0aW9uIGFuZCByZW1vdmFsLgphYnN0cmFjdCBjbGFzcyBIZWFwPFQ+IHsKICBmaW5hbCBfaXRlbXMgPSA8VD5bXTsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfaXRlbXMuaXNFbXB0eTsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfaXRlbXMuaXNOb3RFbXB0eTsKCiAgdm9pZCBhZGQoVCBpdGVtKSB7CiAgICBpbnQgaW5kZXggPSBfaXRlbXMubGVuZ3RoOwogICAgX2l0ZW1zLmxlbmd0aCArPSAxOwogICAgd2hpbGUgKGluZGV4ID4gMCkgewogICAgICBUIHBhcmVudCA9IF9pdGVtc1tfcGFyZW50SW5kZXgoaW5kZXgpXTsKICAgICAgaWYgKHNvcnRzQmVmb3JlKHBhcmVudCwgaXRlbSkpIGJyZWFrOwogICAgICBfaXRlbXNbaW5kZXhdID0gcGFyZW50OwogICAgICBpbmRleCA9IF9wYXJlbnRJbmRleChpbmRleCk7CiAgICB9CiAgICBfaXRlbXNbaW5kZXhdID0gaXRlbTsKICB9CgogIFQgcmVtb3ZlKCkgewogICAgVCByZW1vdmVkID0gX2l0ZW1zWzBdOwogICAgVCBvcnBoYW4gPSBfaXRlbXMucmVtb3ZlTGFzdCgpOwogICAgaWYgKF9pdGVtcy5pc05vdEVtcHR5KSBfcmVJbnNlcnQob3JwaGFuKTsKICAgIHJldHVybiByZW1vdmVkOwogIH0KCiAgLy8vIENsaWVudCBzaG91bGQgdXNlIGEgZGVyaXZlZCBjbGFzcyB0byBzcGVjaWZ5IHRoZSBzb3J0IG9yZGVyLgogIGJvb2wgc29ydHNCZWZvcmUoVCBhLCBUIGIpOwoKICBpbnQgX2ZpcnN0Q2hpbGRJbmRleChpbnQgaW5kZXgpIHsKICAgIHJldHVybiAoaW5kZXggPDwgMSkgKyAxOwogIH0KCiAgaW50IF9wYXJlbnRJbmRleChpbnQgaW5kZXgpIHsKICAgIHJldHVybiAoaW5kZXggLSAxKSA+PiAxOwogIH0KCiAgdm9pZCBfcmVJbnNlcnQoVCBpdGVtKSB7CiAgICBpbnQgaW5kZXggPSAwOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaW50IGNoaWxkSW5kZXggPSBfZmlyc3RDaGlsZEluZGV4KGluZGV4KTsKICAgICAgaWYgKGNoaWxkSW5kZXggPj0gX2l0ZW1zLmxlbmd0aCkgYnJlYWs7CiAgICAgIFQgY2hpbGQgPSBfaXRlbXNbY2hpbGRJbmRleF07CiAgICAgIGlmIChjaGlsZEluZGV4ICsgMSA8IF9pdGVtcy5sZW5ndGgpIHsKICAgICAgICBUIG5leHRDaGlsZCA9IF9pdGVtc1tjaGlsZEluZGV4ICsgMV07CiAgICAgICAgaWYgKHNvcnRzQmVmb3JlKG5leHRDaGlsZCwgY2hpbGQpKSB7CiAgICAgICAgICBjaGlsZCA9IG5leHRDaGlsZDsKICAgICAgICAgIGNoaWxkSW5kZXgrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHNvcnRzQmVmb3JlKGl0ZW0sIGNoaWxkKSkgYnJlYWs7CiAgICAgIF9pdGVtc1tpbmRleF0gPSBfaXRlbXNbY2hpbGRJbmRleF07CiAgICAgIGluZGV4ID0gY2hpbGRJbmRleDsKICAgIH0KICAgIF9pdGVtc1tpbmRleF0gPSBpdGVtOwogIH0KfQpAAE5OPAFJGRgBJgEsARUfGBguLB4jBhoEAQ8bJC4UBAFDHgEkHQQBIB0EARsTEzAuJCwuLR0YCggrKhoGGgQCARxwYWNrYWdlOmtlcm5lbC9zcmMvaGVhcC5kYXJ0KnNka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL2xpYnJhcnlfaW5kZXguZGFydKD9Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwubGlicmFyeV9pbmRleDsKCmltcG9ydCAnYXN0LmRhcnQnOwoKLy8vIFByb3ZpZGVzIG5hbWUtYmFzZWQgYWNjZXNzIHRvIGxpYnJhcnksIGNsYXNzLCBhbmQgbWVtYmVyIEFTVCBub2Rlcy4KLy8vCi8vLyBXaGVuIGNvbnN0cnVjdGVkLCBhIGdpdmVuIHNldCBvZiBsaWJyYXJpZXMgYXJlIGluZGV4ZWQgaW1tZWRpYXRlbHksIGFuZAovLy8gd2lsbCBub3QgYmUgdXAtdG8tZGF0ZSB3aXRoIGNoYW5nZXMgbWFkZSBhZnRlciBpdCB3YXMgY3JlYXRlZC4KY2xhc3MgTGlicmFyeUluZGV4IHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGdldHRlclByZWZpeCA9ICdnZXQ6JzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHNldHRlclByZWZpeCA9ICdzZXQ6JzsKCiAgLy8vIEEgc3BlY2lhbCBjbGFzcyBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSB0b3AtbGV2ZWwgbWVtYmVycwogIC8vLyBvZiBhIGxpYnJhcnkuCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0b3BMZXZlbCA9ICc6Oic7CgogIGZpbmFsIE1hcDxTdHJpbmcsIF9DbGFzc1RhYmxlPiBfbGlicmFyaWVzID0gPFN0cmluZywgX0NsYXNzVGFibGU+e307CgogIC8vLyBJbmRleGVzIHRoZSBsaWJyYXJpZXMgd2l0aCB0aGUgVVJJcyBnaXZlbiBpbiBbbGlicmFyeVVyaXNdLgogIExpYnJhcnlJbmRleChDb21wb25lbnQgY29tcG9uZW50LCBJdGVyYWJsZTxTdHJpbmc+IGxpYnJhcnlVcmlzKSB7CiAgICB2YXIgbGlicmFyeVVyaVNldCA9IGxpYnJhcnlVcmlzLnRvU2V0KCk7CiAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgdmFyIHVyaSA9ICcke2xpYnJhcnkuaW1wb3J0VXJpfSc7CiAgICAgIGlmIChsaWJyYXJ5VXJpU2V0LmNvbnRhaW5zKHVyaSkpIHsKICAgICAgICBfbGlicmFyaWVzW3VyaV0gPSBuZXcgX0NsYXNzVGFibGUobGlicmFyeSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBJbmRleGVzIHRoZSBsaWJyYXJpZXMgd2l0aCB0aGUgVVJJcyBnaXZlbiBpbiBbbGlicmFyeVVyaXNdLgogIExpYnJhcnlJbmRleC5ieVVyaShDb21wb25lbnQgY29tcG9uZW50LCBJdGVyYWJsZTxVcmk+IGxpYnJhcnlVcmlzKQogICAgICA6IHRoaXMoY29tcG9uZW50LCBsaWJyYXJ5VXJpcy5tYXAoKHVyaSkgPT4gJyR1cmknKSk7CgogIC8vLyBJbmRleGVzIGBkYXJ0OmAgbGlicmFyaWVzLgogIExpYnJhcnlJbmRleC5jb3JlTGlicmFyaWVzKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIGZvciAodmFyIGxpYnJhcnkgaW4gY29tcG9uZW50LmxpYnJhcmllcykgewogICAgICBpZiAobGlicmFyeS5pbXBvcnRVcmkuc2NoZW1lID09ICdkYXJ0JykgewogICAgICAgIF9saWJyYXJpZXNbJyR7bGlicmFyeS5pbXBvcnRVcml9J10gPSBuZXcgX0NsYXNzVGFibGUobGlicmFyeSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBJbmRleGVzIHRoZSBlbnRpcmUgY29tcG9uZW50LgogIC8vLwogIC8vLyBDb25zaWRlciB1c2luZyBhbm90aGVyIGNvbnN0cnVjdG9yIHRvIG9ubHkgaW5kZXggdGhlIGxpYnJhcmllcyB0aGF0CiAgLy8vIGFyZSBuZWVkZWQuCiAgTGlicmFyeUluZGV4LmFsbChDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgX2xpYnJhcmllc1snJHtsaWJyYXJ5LmltcG9ydFVyaX0nXSA9IG5ldyBfQ2xhc3NUYWJsZShsaWJyYXJ5KTsKICAgIH0KICB9CgogIF9DbGFzc1RhYmxlIF9nZXRMaWJyYXJ5SW5kZXgoU3RyaW5nIHVyaSkgewogICAgX0NsYXNzVGFibGUgbGlicmFyeUluZGV4ID0gX2xpYnJhcmllc1t1cmldOwogICAgaWYgKGxpYnJhcnlJbmRleCA9PSBudWxsKSB7CiAgICAgIHRocm93ICJUaGUgbGlicmFyeSAnJHVyaScgaGFzIG5vdCBiZWVuIGluZGV4ZWQiOwogICAgfQogICAgcmV0dXJuIGxpYnJhcnlJbmRleDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuIFVSSS4KICAvLy8KICAvLy8gVGhyb3dzIGFuIGVycm9yIGlmIGl0IGRvZXMgbm90IGV4aXN0LgogIExpYnJhcnkgZ2V0TGlicmFyeShTdHJpbmcgdXJpKSA9PiBfZ2V0TGlicmFyeUluZGV4KHVyaSkubGlicmFyeTsKCiAgLy8vIExpa2UgW2dldExpYnJhcnldIGJ1dCByZXR1cm5zIGBudWxsYCBpZiBub3QgZm91bmQuCiAgTGlicmFyeSB0cnlHZXRMaWJyYXJ5KFN0cmluZyB1cmkpID0+IF9saWJyYXJpZXNbdXJpXT8ubGlicmFyeTsKCiAgLy8vIFRydWUgaWYgdGhlIGxpYnJhcnkgd2l0aCB0aGUgZ2l2ZW4gVVJJIGV4aXN0cyBhbmQgd2FzIGluZGV4ZWQuCiAgYm9vbCBjb250YWluc0xpYnJhcnkoU3RyaW5nIHVyaSkgPT4gX2xpYnJhcmllcy5jb250YWluc0tleSh1cmkpOwoKICAvLy8gUmV0dXJucyB0aGUgY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgZ2l2ZW4gbGlicmFyeS4KICAvLy8KICAvLy8gQW4gZXJyb3IgaXMgdGhyb3duIGlmIHRoZSBjbGFzcyBpcyBub3QgZm91bmQuCiAgQ2xhc3MgZ2V0Q2xhc3MoU3RyaW5nIGxpYnJhcnksIFN0cmluZyBjbGFzc05hbWUpIHsKICAgIHJldHVybiBfZ2V0TGlicmFyeUluZGV4KGxpYnJhcnkpLmdldENsYXNzKGNsYXNzTmFtZSk7CiAgfQoKICAvLy8gTGlrZSBbZ2V0Q2xhc3NdIGJ1dCByZXR1cm5zIGBudWxsYCBpZiBub3QgZm91bmQuCiAgQ2xhc3MgdHJ5R2V0Q2xhc3MoU3RyaW5nIGxpYnJhcnksIFN0cmluZyBjbGFzc05hbWUpIHsKICAgIHJldHVybiBfbGlicmFyaWVzW2xpYnJhcnldPy50cnlHZXRDbGFzcyhjbGFzc05hbWUpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIG1lbWJlciB3aXRoIHRoZSBnaXZlbiBuYW1lLCBpbiB0aGUgZ2l2ZW4gY2xhc3MsIGluIHRoZQogIC8vLyBnaXZlbiBsaWJyYXJ5LgogIC8vLwogIC8vLyBJZiBhIGdldHRlciBvciBzZXR0ZXIgaXMgd2FudGVkLCB0aGUgYGdldDpgIG9yIGBzZXQ6YCBwcmVmaXggbXVzdCBiZQogIC8vLyBhZGRlZCBpbiBmcm9udCBvZiB0aGUgbWVtYmVyIG5hbWUuCiAgLy8vCiAgLy8vIFRoZSBzcGVjaWFsIGNsYXNzIG5hbWUgYDo6YCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdG9wLWxldmVsIG1lbWJlcnMuCiAgLy8vCiAgLy8vIElmIHRoZSBtZW1iZXIgbmFtZSBpcyBwcml2YXRlIGl0IGlzIGNvbnNpZGVyZWQgcHJpdmF0ZSB0byBbbGlicmFyeV0uCiAgLy8vIEl0IGlzIG5vdCBwb3NzaWJsZSB3aXRoIHRoaXMgY2xhc3MgdG8gbG9va3VwIG1lbWJlcnMgd2hvc2UgbmFtZSBpcyBwcml2YXRlCiAgLy8vIHRvIGEgbGlicmFyeSBvdGhlciB0aGFuIHRoZSBvbmUgY29udGFpbmluZyBpdC4KICAvLy8KICAvLy8gQW4gZXJyb3IgaXMgdGhyb3duIGlmIHRoZSBtZW1iZXIgaXMgbm90IGZvdW5kLgogIE1lbWJlciBnZXRNZW1iZXIoU3RyaW5nIGxpYnJhcnksIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZW1iZXJOYW1lKSB7CiAgICByZXR1cm4gX2dldExpYnJhcnlJbmRleChsaWJyYXJ5KS5nZXRNZW1iZXIoY2xhc3NOYW1lLCBtZW1iZXJOYW1lKTsKICB9CgogIC8vLyBMaWtlIFtnZXRNZW1iZXJdIGJ1dCByZXR1cm5zIGBudWxsYCBpZiBub3QgZm91bmQuCiAgTWVtYmVyIHRyeUdldE1lbWJlcihTdHJpbmcgbGlicmFyeSwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1lbWJlck5hbWUpIHsKICAgIHJldHVybiBfbGlicmFyaWVzW2xpYnJhcnldPy50cnlHZXRNZW1iZXIoY2xhc3NOYW1lLCBtZW1iZXJOYW1lKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSB0b3AtbGV2ZWwgbWVtYmVyIHdpdGggdGhlIGdpdmVuIG5hbWUsIGluIHRoZSBnaXZlbiBsaWJyYXJ5LgogIC8vLwogIC8vLyBJZiBhIGdldHRlciBvciBzZXR0ZXIgaXMgd2FudGVkLCB0aGUgYGdldDpgIG9yIGBzZXQ6YCBwcmVmaXggbXVzdCBiZQogIC8vLyBhZGRlZCBpbiBmcm9udCBvZiB0aGUgbWVtYmVyIG5hbWUuCiAgLy8vCiAgLy8vIElmIHRoZSBtZW1iZXIgbmFtZSBpcyBwcml2YXRlIGl0IGlzIGNvbnNpZGVyZWQgcHJpdmF0ZSB0byBbbGlicmFyeV0uCiAgLy8vIEl0IGlzIG5vdCBwb3NzaWJsZSB3aXRoIHRoaXMgY2xhc3MgdG8gbG9va3VwIG1lbWJlcnMgd2hvc2UgbmFtZSBpcyBwcml2YXRlCiAgLy8vIHRvIGEgbGlicmFyeSBvdGhlciB0aGFuIHRoZSBvbmUgY29udGFpbmluZyBpdC4KICAvLy8KICAvLy8gQW4gZXJyb3IgaXMgdGhyb3duIGlmIHRoZSBtZW1iZXIgaXMgbm90IGZvdW5kLgogIE1lbWJlciBnZXRUb3BMZXZlbE1lbWJlcihTdHJpbmcgbGlicmFyeSwgU3RyaW5nIG1lbWJlck5hbWUpIHsKICAgIHJldHVybiBnZXRNZW1iZXIobGlicmFyeSwgdG9wTGV2ZWwsIG1lbWJlck5hbWUpOwogIH0KCiAgLy8vIExpa2UgW2dldFRvcExldmVsTWVtYmVyXSBidXQgcmV0dXJucyBgbnVsbGAgaWYgbm90IGZvdW5kLgogIE1lbWJlciB0cnlHZXRUb3BMZXZlbE1lbWJlcigKICAgICAgU3RyaW5nIGxpYnJhcnksIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZW1iZXJOYW1lKSB7CiAgICByZXR1cm4gdHJ5R2V0TWVtYmVyKGxpYnJhcnksIHRvcExldmVsLCBtZW1iZXJOYW1lKTsKICB9Cn0KCmNsYXNzIF9DbGFzc1RhYmxlIHsKICBmaW5hbCBMaWJyYXJ5IGxpYnJhcnk7CgogIE1hcDxTdHJpbmcsIF9NZW1iZXJUYWJsZT4gX2NsYXNzZXM7CgogIF9DbGFzc1RhYmxlKHRoaXMubGlicmFyeSk7CgogIE1hcDxTdHJpbmcsIF9NZW1iZXJUYWJsZT4gZ2V0IGNsYXNzZXMgewogICAgaWYgKF9jbGFzc2VzID09IG51bGwpIHsKICAgICAgX2NsYXNzZXMgPSA8U3RyaW5nLCBfTWVtYmVyVGFibGU+e307CiAgICAgIF9jbGFzc2VzW0xpYnJhcnlJbmRleC50b3BMZXZlbF0gPSBuZXcgX01lbWJlclRhYmxlLnRvcExldmVsKHRoaXMpOwogICAgICBmb3IgKHZhciBjbGFzc18gaW4gbGlicmFyeS5jbGFzc2VzKSB7CiAgICAgICAgX2NsYXNzZXNbY2xhc3NfLm5hbWVdID0gbmV3IF9NZW1iZXJUYWJsZSh0aGlzLCBjbGFzc18pOwogICAgICB9CiAgICAgIGZvciAoUmVmZXJlbmNlIHJlZmVyZW5jZSBpbiBsaWJyYXJ5LmFkZGl0aW9uYWxFeHBvcnRzKSB7CiAgICAgICAgTmFtZWROb2RlIG5vZGUgPSByZWZlcmVuY2Uubm9kZTsKICAgICAgICBpZiAobm9kZSBpcyBDbGFzcykgewogICAgICAgICAgX2NsYXNzZXNbbm9kZS5uYW1lXSA9IG5ldyBfTWVtYmVyVGFibGUodGhpcywgbm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2NsYXNzZXM7CiAgfQoKICBTdHJpbmcgZ2V0IGNvbnRhaW5lck5hbWUgewogICAgLy8gRm9yIHVzZWZ1bCBlcnJvciBtZXNzYWdlcywgaXQgY2FuIGJlIGhlbHBmdWwgdG8gaW5kaWNhdGUgaWYgdGhlIGxpYnJhcnkKICAgIC8vIGlzIGV4dGVybmFsLiAgSWYgYSBjbGFzcyBvciBtZW1iZXIgd2FzIG5vdCBmb3VuZCBpbiBhbiBleHRlcm5hbCBsaWJyYXJ5LAogICAgLy8gaXQgbWlnaHQgYmUgdGhhdCBpdCBleGlzdHMgaW4gdGhlIGFjdHVhbCBsaWJyYXJ5LCBidXQgaXRzIGludGVyZmFjZSB3YXMKICAgIC8vIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGJ1aWxkIHVuaXQuCiAgICByZXR1cm4gbGlicmFyeS5pc0V4dGVybmFsCiAgICAgICAgPyAiZXh0ZXJuYWwgbGlicmFyeSAnJHtsaWJyYXJ5LmltcG9ydFVyaX0nIgogICAgICAgIDogImxpYnJhcnkgJyR7bGlicmFyeS5pbXBvcnRVcml9JyI7CiAgfQoKICBfTWVtYmVyVGFibGUgX2dldENsYXNzSW5kZXgoU3RyaW5nIG5hbWUpIHsKICAgIHZhciBpbmRleGVyID0gY2xhc3Nlc1tuYW1lXTsKICAgIGlmIChpbmRleGVyID09IG51bGwpIHsKICAgICAgdGhyb3cgIkNsYXNzICckbmFtZScgbm90IGZvdW5kIGluICRjb250YWluZXJOYW1lIjsKICAgIH0KICAgIHJldHVybiBpbmRleGVyOwogIH0KCiAgQ2xhc3MgZ2V0Q2xhc3MoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBfZ2V0Q2xhc3NJbmRleChuYW1lKS5jbGFzc187CiAgfQoKICBDbGFzcyB0cnlHZXRDbGFzcyhTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIGNsYXNzZXNbbmFtZV0/LmNsYXNzXzsKICB9CgogIE1lbWJlciBnZXRNZW1iZXIoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1lbWJlck5hbWUpIHsKICAgIHJldHVybiBfZ2V0Q2xhc3NJbmRleChjbGFzc05hbWUpLmdldE1lbWJlcihtZW1iZXJOYW1lKTsKICB9CgogIE1lbWJlciB0cnlHZXRNZW1iZXIoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1lbWJlck5hbWUpIHsKICAgIHJldHVybiBjbGFzc2VzW2NsYXNzTmFtZV0/LnRyeUdldE1lbWJlcihtZW1iZXJOYW1lKTsKICB9Cn0KCmNsYXNzIF9NZW1iZXJUYWJsZSB7CiAgZmluYWwgX0NsYXNzVGFibGUgcGFyZW50OwogIGZpbmFsIENsYXNzIGNsYXNzXzsgLy8gTnVsbCBmb3IgdG9wLWxldmVsLgogIE1hcDxTdHJpbmcsIE1lbWJlcj4gX21lbWJlcnM7CgogIExpYnJhcnkgZ2V0IGxpYnJhcnkgPT4gcGFyZW50LmxpYnJhcnk7CgogIF9NZW1iZXJUYWJsZSh0aGlzLnBhcmVudCwgdGhpcy5jbGFzc18pOwoKICBfTWVtYmVyVGFibGUudG9wTGV2ZWwodGhpcy5wYXJlbnQpIDogY2xhc3NfID0gbnVsbDsKCiAgTWFwPFN0cmluZywgTWVtYmVyPiBnZXQgbWVtYmVycyB7CiAgICBpZiAoX21lbWJlcnMgPT0gbnVsbCkgewogICAgICBfbWVtYmVycyA9IDxTdHJpbmcsIE1lbWJlcj57fTsKICAgICAgaWYgKGNsYXNzXyAhPSBudWxsKSB7CiAgICAgICAgY2xhc3NfLnByb2NlZHVyZXMuZm9yRWFjaChhZGRNZW1iZXIpOwogICAgICAgIGNsYXNzXy5maWVsZHMuZm9yRWFjaChhZGRNZW1iZXIpOwogICAgICAgIGNsYXNzXy5jb25zdHJ1Y3RvcnMuZm9yRWFjaChhZGRNZW1iZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIGxpYnJhcnkucHJvY2VkdXJlcy5mb3JFYWNoKGFkZE1lbWJlcik7CiAgICAgICAgbGlicmFyeS5maWVsZHMuZm9yRWFjaChhZGRNZW1iZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX21lbWJlcnM7CiAgfQoKICBTdHJpbmcgZ2V0RGlzYW1iaWd1YXRlZE5hbWUoTWVtYmVyIG1lbWJlcikgewogICAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgaWYgKG1lbWJlci5pc0dldHRlcikgcmV0dXJuIExpYnJhcnlJbmRleC5nZXR0ZXJQcmVmaXggKyBtZW1iZXIubmFtZS5uYW1lOwogICAgICBpZiAobWVtYmVyLmlzU2V0dGVyKSByZXR1cm4gTGlicmFyeUluZGV4LnNldHRlclByZWZpeCArIG1lbWJlci5uYW1lLm5hbWU7CiAgICB9CiAgICByZXR1cm4gbWVtYmVyLm5hbWUubmFtZTsKICB9CgogIHZvaWQgYWRkTWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIubmFtZS5pc1ByaXZhdGUgJiYgbWVtYmVyLm5hbWUubGlicmFyeSAhPSBsaWJyYXJ5KSB7CiAgICAgIC8vIE1lbWJlcnMgd2hvc2UgbmFtZSBpcyBwcml2YXRlIHRvIG90aGVyIGxpYnJhcmllcyBjYW5ub3QgY3VycmVudGx5CiAgICAgIC8vIGJlIGZvdW5kIHdpdGggdGhlIExpYnJhcnlJbmRleCBjbGFzcy4KICAgICAgcmV0dXJuOwogICAgfQogICAgX21lbWJlcnNbZ2V0RGlzYW1iaWd1YXRlZE5hbWUobWVtYmVyKV0gPSBtZW1iZXI7CiAgfQoKICBTdHJpbmcgZ2V0IGNvbnRhaW5lck5hbWUgewogICAgaWYgKGNsYXNzXyA9PSBudWxsKSB7CiAgICAgIHJldHVybiAidG9wLWxldmVsIG9mICR7cGFyZW50LmNvbnRhaW5lck5hbWV9IjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAiY2xhc3MgJyR7Y2xhc3NfLm5hbWV9JyBpbiAke3BhcmVudC5jb250YWluZXJOYW1lfSI7CiAgICB9CiAgfQoKICBNZW1iZXIgZ2V0TWVtYmVyKFN0cmluZyBuYW1lKSB7CiAgICB2YXIgbWVtYmVyID0gbWVtYmVyc1tuYW1lXTsKICAgIGlmIChtZW1iZXIgPT0gbnVsbCkgewogICAgICBTdHJpbmcgbWVzc2FnZSA9ICJBIG1lbWJlciB3aXRoIGRpc2FtYmlndWF0ZWQgbmFtZSAnJG5hbWUnIHdhcyBub3QgZm91bmQgIgogICAgICAgICAgImluICRjb250YWluZXJOYW1lIjsKICAgICAgdmFyIGdldHRlciA9IExpYnJhcnlJbmRleC5nZXR0ZXJQcmVmaXggKyBuYW1lOwogICAgICB2YXIgc2V0dGVyID0gTGlicmFyeUluZGV4LnNldHRlclByZWZpeCArIG5hbWU7CiAgICAgIGlmIChtZW1iZXJzW2dldHRlcl0gIT0gbnVsbCB8fCBtZW1iZXJzW3NldHRlcl0gIT0gbnVsbCkgewogICAgICAgIHRocm93ICIkbWVzc2FnZS4gRGlkIHlvdSBtZWFuICckZ2V0dGVyJyBvciAnJHNldHRlcic/IjsKICAgICAgfQogICAgICB0aHJvdyBtZXNzYWdlOwogICAgfQogICAgcmV0dXJuIG1lbWJlcjsKICB9CgogIE1lbWJlciB0cnlHZXRNZW1iZXIoU3RyaW5nIG5hbWUpID0+IG1lbWJlcnNbbmFtZV07Cn0KgQIATk48HgETAUgETEMVLS0BTBQnAUcBQkQtLygpNAgGBAFCRTsBITQvMEcIBgQBJAZKEiovRQYEAS0wIDcGGQQBLgYsQwE5QQFFQwFCBjQ1OgQBNzg4BAFJFQZLKQZLBktRNQY1SkcEAThNRQQBTgZLKQZLUTUGNUA1BAFAHz04BAIBFBkBJgEdASocK0ksQAg/KR0+CggGFQQBHU9QTygeNCwEAS0hGzkGFAQBICgEASMiBAE6PAQBPTkEAgEVHC0gASkBKgE2ASQcJRwuKjAPLysIBhUEAS8fUFAGHQQBIkNLLw4GNQQBHRo1DUIGBAEiIBpRHzU1QEAIFQYTBAE1AgEhcGFja2FnZTprZXJuZWwvbGlicmFyeV9pbmRleC5kYXJ0MHNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jaGFyY29kZS9saWIvYXNjaWkuZGFydKMpLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gRGVjbGFyZSBpbnRlZ2VyIGNvbnN0YW50cyBmb3IgZWFjaCBBU0NJSSBjaGFyYWN0ZXIuCi8vLwovLy8gVGhlIGNvbnN0YW50cyBhbGwgc3RhcnQgd2l0aCAiJCIgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aCBvdGhlciBjb25zdGFudHMuCi8vLwovLy8gRm9yIGNoYXJhY3RlcnMgdGhhdCBhcmUgdmFsaWQgaW4gYW4gaWRlbnRpZmllciwgdGhlIGNoYXJhY3RlciBpdHNlbGYKLy8vIGZvbGxvd3MgdGhlICIkIi4gRm9yIG90aGVyIGNoYXJhY3RlcnMsIGEgc3ltYm9saWMgbmFtZSBpcyB1c2VkLgovLy8gSW4gc29tZSBjYXNlcywgbXVsdGlwbGUgYWx0ZXJuYXRpdmUgc3ltYm9saWMgbmFtZXMgYXJlIHByb3ZpZGVkLgovLy8gUGxlYXNlIHN0aWNrIHRvIHVzaW5nIG9uZSBuYW1lIHBlciBjaGFyYWN0ZXIgaW4geW91ciBjb2RlLgovLy8KLy8vIFRoZSBzeW1ib2xpYyBuYW1lcyBhcmUsIHdoZXJlIGFwcGxpY2FibGUsIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgd2l0aG91dAovLy8gYW55ICJtYXJrIiwgInN5bWJvbCIgInNpZ24iIG9yICJhY2NlbnQiIHN1ZmZpeC4KLy8vIEV4YW1wbGVzOiBbJGV4Y2xhbWF0aW9uXSwgWyRwaXBlXSwgWyRkb2xsYXJdIGFuZCBbJGdyYXZlXS4KLy8vIEZvciBsZXNzIGNvbW1vbiBzeW1ib2xzLCBhIHNlbGVjdGlvbiBvZiBjb21tb24gbmFtZXMgYXJlIHVzZWQuCi8vLwovLy8gRm9yIHBhcmVudGhldGljYWwgbWFya2VycywgdGhlcmUgaXMgYm90aCBhIHNob3J0IG5hbWUsIFskbHBhcmVuXS9bJHJwYXJlbl0sCi8vLyBhbmQgYSBsb25nIG5hbWUsIFskb3Blbl9wYXJlbl0vIFskY2xvc2VfcGFyZW5dLgovLy8KLy8vIEZvciBjb21tb24gSFRNTCBlbnRpdGllcywgdGhlIGVudGl0eSBuYW1lcyBhcmUgYWxzbyB1c2FibGUgYXMgc3ltYm9saWMKLy8vIG5hbWVzOiBbJGFwb3NdLCBbJHF1b3RdLCBbJGx0XSwgWyRndF0sIGFuZCBbJGFtcF0uCmxpYnJhcnkgY2hhcmNvZGUuYXNjaWkuZG9sbGFyX2xvd2VyY2FzZTsKCi8vIENvbnRyb2wgY2hhcmFjdGVycy4KCi8vLyAiTnVsbCBjaGFyYWN0ZXIiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJG51bCA9IDB4MDA7CgovLy8gIlN0YXJ0IG9mIEhlYWRlciIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkc29oID0gMHgwMTsKCi8vLyAiU3RhcnQgb2YgVGV4dCIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkc3R4ID0gMHgwMjsKCi8vLyAiRW5kIG9mIFRleHQiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGV0eCA9IDB4MDM7CgovLy8gIkVuZCBvZiBUcmFuc21pc3Npb24iIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGVvdCA9IDB4MDQ7CgovLy8gIkVucXVpcnkiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGVucSA9IDB4MDU7CgovLy8gIkFja25vd2xlZGdtZW50IiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRhY2sgPSAweDA2OwoKLy8vICJCZWxsIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRiZWwgPSAweDA3OwoKLy8vICJCYWNrc3BhY2UiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGJzID0gMHgwODsKCi8vLyAiSG9yaXpvbnRhbCBUYWIiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGh0ID0gMHgwOTsKCi8vLyAiSG9yaXpvbnRhbCBUYWIiIGNvbnRyb2wgY2hhcmFjdGVyLCBjb21tb24gbmFtZS4KY29uc3QgaW50ICR0YWIgPSAweDA5OwoKLy8vICJMaW5lIGZlZWQiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGxmID0gMHgwQTsKCi8vLyAiVmVydGljYWwgVGFiIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICR2dCA9IDB4MEI7CgovLy8gIkZvcm0gZmVlZCIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkZmYgPSAweDBDOwoKLy8vICJDYXJyaWFnZSByZXR1cm4iIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGNyID0gMHgwRDsKCi8vLyAiU2hpZnQgT3V0IiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRzbyA9IDB4MEU7CgovLy8gIlNoaWZ0IEluIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRzaSA9IDB4MEY7CgovLy8gIkRhdGEgTGluayBFc2NhcGUiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGRsZSA9IDB4MTA7CgovLy8gIkRldmljZSBDb250cm9sIDEiIGNvbnRyb2wgY2hhcmFjdGVyIChvZnQuIFhPTikuCmNvbnN0IGludCAkZGMxID0gMHgxMTsKCi8vLyAiRGV2aWNlIENvbnRyb2wgMiIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkZGMyID0gMHgxMjsKCi8vLyAiRGV2aWNlIENvbnRyb2wgMyIgY29udHJvbCBjaGFyYWN0ZXIgKG9mdC4gWE9GRikuCmNvbnN0IGludCAkZGMzID0gMHgxMzsKCi8vLyAiRGV2aWNlIENvbnRyb2wgNCIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkZGM0ID0gMHgxNDsKCi8vLyAiTmVnYXRpdmUgQWNrbm93bGVkZ21lbnQiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJG5hayA9IDB4MTU7CgovLy8gIlN5bmNocm9ub3VzIGlkbGUiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJHN5biA9IDB4MTY7CgovLy8gIkVuZCBvZiBUcmFuc21pc3Npb24gQmxvY2siIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGV0YiA9IDB4MTc7CgovLy8gIkNhbmNlbCIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkY2FuID0gMHgxODsKCi8vLyAiRW5kIG9mIE1lZGl1bSIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkZW0gPSAweDE5OwoKLy8vICJTdWJzdGl0dXRlIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRzdWIgPSAweDFBOwoKLy8vICJFc2NhcGUiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGVzYyA9IDB4MUI7CgovLy8gIkZpbGUgU2VwYXJhdG9yIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRmcyA9IDB4MUM7CgovLy8gIkdyb3VwIFNlcGFyYXRvciIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkZ3MgPSAweDFEOwoKLy8vICJSZWNvcmQgU2VwYXJhdG9yIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRycyA9IDB4MUU7CgovLy8gIlVuaXQgU2VwYXJhdG9yIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICR1cyA9IDB4MUY7CgovLy8gIkRlbGV0ZSIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkZGVsID0gMHg3RjsKCi8vIFZpc2libGUgY2hhcmFjdGVycy4KCi8vLyBTcGFjZSBjaGFyYWN0ZXIuCmNvbnN0IGludCAkc3BhY2UgPSAweDIwOwoKLy8vIENoYXJhY3RlciAnIScuCmNvbnN0IGludCAkZXhjbGFtYXRpb24gPSAweDIxOwoKLy8vIENoYXJhY3RlciAnIicsIHNob3J0IG5hbWUuCmNvbnN0IGludCAkcXVvdCA9IDB4MjI7CgovLy8gQ2hhcmFjdGVyICciJy4KY29uc3QgaW50ICRxdW90ZSA9IDB4MjI7CgovLy8gQ2hhcmFjdGVyICciJy4KY29uc3QgaW50ICRkb3VibGVfcXVvdGUgPSAweDIyOwoKLy8vIENoYXJhY3RlciAnIicuCmNvbnN0IGludCAkcXVvdGF0aW9uID0gMHgyMjsKCi8vLyBDaGFyYWN0ZXIgJyMnLgpjb25zdCBpbnQgJGhhc2ggPSAweDIzOwoKLy8vIENoYXJhY3RlciAnJCcuCmNvbnN0IGludCAkJCA9IDB4MjQ7CgovLy8gQ2hhcmFjdGVyICckJy4KY29uc3QgaW50ICRkb2xsYXIgPSAweDI0OwoKLy8vIENoYXJhY3RlciAnJScuCmNvbnN0IGludCAkcGVyY2VudCA9IDB4MjU7CgovLy8gQ2hhcmFjdGVyICcmJywgc2hvcnQgbmFtZS4KY29uc3QgaW50ICRhbXAgPSAweDI2OwoKLy8vIENoYXJhY3RlciAnJicuCmNvbnN0IGludCAkYW1wZXJzYW5kID0gMHgyNjsKCi8vLyBDaGFyYWN0ZXIgIiciLgpjb25zdCBpbnQgJGFwb3MgPSAweDI3OwoKLy8vIENoYXJhY3RlciAnJycuCmNvbnN0IGludCAkYXBvc3Ryb3BoZSA9IDB4Mjc7CgovLy8gQ2hhcmFjdGVyICcnJy4KY29uc3QgaW50ICRzaW5nbGVfcXVvdGUgPSAweDI3OwoKLy8vIENoYXJhY3RlciAnKCcuCmNvbnN0IGludCAkbHBhcmVuID0gMHgyODsKCi8vLyBDaGFyYWN0ZXIgJygnLgpjb25zdCBpbnQgJG9wZW5fcGFyZW4gPSAweDI4OwoKLy8vIENoYXJhY3RlciAnKCcuCmNvbnN0IGludCAkb3Blbl9wYXJlbnRoZXNpcyA9IDB4Mjg7CgovLy8gQ2hhcmFjdGVyICcpJy4KY29uc3QgaW50ICRycGFyZW4gPSAweDI5OwoKLy8vIENoYXJhY3RlciAnKScuCmNvbnN0IGludCAkY2xvc2VfcGFyZW4gPSAweDI5OwoKLy8vIENoYXJhY3RlciAnKScuCmNvbnN0IGludCAkY2xvc2VfcGFyZW50aGVzaXMgPSAweDI5OwoKLy8vIENoYXJhY3RlciAnKicuCmNvbnN0IGludCAkYXN0ZXJpc2sgPSAweDJBOwoKLy8vIENoYXJhY3RlciAnKycuCmNvbnN0IGludCAkcGx1cyA9IDB4MkI7CgovLy8gQ2hhcmFjdGVyICcsJy4KY29uc3QgaW50ICRjb21tYSA9IDB4MkM7CgovLy8gQ2hhcmFjdGVyICctJy4KY29uc3QgaW50ICRtaW51cyA9IDB4MkQ7CgovLy8gQ2hhcmFjdGVyICctJy4KY29uc3QgaW50ICRkYXNoID0gMHgyRDsKCi8vLyBDaGFyYWN0ZXIgJy4nLgpjb25zdCBpbnQgJGRvdCA9IDB4MkU7CgovLy8gQ2hhcmFjdGVyICcuJy4KY29uc3QgaW50ICRmdWxsc3RvcCA9IDB4MkU7CgovLy8gQ2hhcmFjdGVyICcvJy4KY29uc3QgaW50ICRzbGFzaCA9IDB4MkY7CgovLy8gQ2hhcmFjdGVyICcvJy4KY29uc3QgaW50ICRzb2xpZHVzID0gMHgyRjsKCi8vLyBDaGFyYWN0ZXIgJy8nLgpjb25zdCBpbnQgJGRpdmlzaW9uID0gMHgyRjsKCi8vLyBDaGFyYWN0ZXIgJzAnLgpjb25zdCBpbnQgJDAgPSAweDMwOwoKLy8vIENoYXJhY3RlciAnMScuCmNvbnN0IGludCAkMSA9IDB4MzE7CgovLy8gQ2hhcmFjdGVyICcyJy4KY29uc3QgaW50ICQyID0gMHgzMjsKCi8vLyBDaGFyYWN0ZXIgJzMnLgpjb25zdCBpbnQgJDMgPSAweDMzOwoKLy8vIENoYXJhY3RlciAnNCcuCmNvbnN0IGludCAkNCA9IDB4MzQ7CgovLy8gQ2hhcmFjdGVyICc1Jy4KY29uc3QgaW50ICQ1ID0gMHgzNTsKCi8vLyBDaGFyYWN0ZXIgJzYnLgpjb25zdCBpbnQgJDYgPSAweDM2OwoKLy8vIENoYXJhY3RlciAnNycuCmNvbnN0IGludCAkNyA9IDB4Mzc7CgovLy8gQ2hhcmFjdGVyICc4Jy4KY29uc3QgaW50ICQ4ID0gMHgzODsKCi8vLyBDaGFyYWN0ZXIgJzknLgpjb25zdCBpbnQgJDkgPSAweDM5OwoKLy8vIENoYXJhY3RlciAnOicuCmNvbnN0IGludCAkY29sb24gPSAweDNBOwoKLy8vIENoYXJhY3RlciAnOycuCmNvbnN0IGludCAkc2VtaWNvbG9uID0gMHgzQjsKCi8vLyBDaGFyYWN0ZXIgJzwnLgpjb25zdCBpbnQgJGx0ID0gMHgzQzsKCi8vLyBDaGFyYWN0ZXIgJzwnLgpjb25zdCBpbnQgJGxlc3NfdGhhbiA9IDB4M0M7CgovLy8gQ2hhcmFjdGVyICc8Jy4KY29uc3QgaW50ICRsYW5nbGUgPSAweDNDOwoKLy8vIENoYXJhY3RlciAnPCcuCmNvbnN0IGludCAkb3Blbl9hbmdsZSA9IDB4M0M7CgovLy8gQ2hhcmFjdGVyICc9Jy4KY29uc3QgaW50ICRlcXVhbCA9IDB4M0Q7CgovLy8gQ2hhcmFjdGVyICc+Jy4KY29uc3QgaW50ICRndCA9IDB4M0U7CgovLy8gQ2hhcmFjdGVyICc+Jy4KY29uc3QgaW50ICRncmVhdGVyX3RoYW4gPSAweDNFOwoKLy8vIENoYXJhY3RlciAnPicuCmNvbnN0IGludCAkcmFuZ2xlID0gMHgzRTsKCi8vLyBDaGFyYWN0ZXIgJz4nLgpjb25zdCBpbnQgJGNsb3NlX2FuZ2xlID0gMHgzRTsKCi8vLyBDaGFyYWN0ZXIgJz8nLgpjb25zdCBpbnQgJHF1ZXN0aW9uID0gMHgzRjsKCi8vLyBDaGFyYWN0ZXIgJ0AnLgpjb25zdCBpbnQgJGF0ID0gMHg0MDsKCi8vLyBDaGFyYWN0ZXIgJ0EnLgpjb25zdCBpbnQgJEEgPSAweDQxOwoKLy8vIENoYXJhY3RlciAnQicuCmNvbnN0IGludCAkQiA9IDB4NDI7CgovLy8gQ2hhcmFjdGVyICdDJy4KY29uc3QgaW50ICRDID0gMHg0MzsKCi8vLyBDaGFyYWN0ZXIgJ0QnLgpjb25zdCBpbnQgJEQgPSAweDQ0OwoKLy8vIENoYXJhY3RlciAnRScuCmNvbnN0IGludCAkRSA9IDB4NDU7CgovLy8gQ2hhcmFjdGVyICdGJy4KY29uc3QgaW50ICRGID0gMHg0NjsKCi8vLyBDaGFyYWN0ZXIgJ0cnLgpjb25zdCBpbnQgJEcgPSAweDQ3OwoKLy8vIENoYXJhY3RlciAnSCcuCmNvbnN0IGludCAkSCA9IDB4NDg7CgovLy8gQ2hhcmFjdGVyICdJJy4KY29uc3QgaW50ICRJID0gMHg0OTsKCi8vLyBDaGFyYWN0ZXIgJ0onLgpjb25zdCBpbnQgJEogPSAweDRBOwoKLy8vIENoYXJhY3RlciAnSycuCmNvbnN0IGludCAkSyA9IDB4NEI7CgovLy8gQ2hhcmFjdGVyICdMJy4KY29uc3QgaW50ICRMID0gMHg0QzsKCi8vLyBDaGFyYWN0ZXIgJ00nLgpjb25zdCBpbnQgJE0gPSAweDREOwoKLy8vIENoYXJhY3RlciAnTicuCmNvbnN0IGludCAkTiA9IDB4NEU7CgovLy8gQ2hhcmFjdGVyICdPJy4KY29uc3QgaW50ICRPID0gMHg0RjsKCi8vLyBDaGFyYWN0ZXIgJ1AnLgpjb25zdCBpbnQgJFAgPSAweDUwOwoKLy8vIENoYXJhY3RlciAnUScuCmNvbnN0IGludCAkUSA9IDB4NTE7CgovLy8gQ2hhcmFjdGVyICdSJy4KY29uc3QgaW50ICRSID0gMHg1MjsKCi8vLyBDaGFyYWN0ZXIgJ1MnLgpjb25zdCBpbnQgJFMgPSAweDUzOwoKLy8vIENoYXJhY3RlciAnVCcuCmNvbnN0IGludCAkVCA9IDB4NTQ7CgovLy8gQ2hhcmFjdGVyICdVJy4KY29uc3QgaW50ICRVID0gMHg1NTsKCi8vLyBDaGFyYWN0ZXIgJ1YnLgpjb25zdCBpbnQgJFYgPSAweDU2OwoKLy8vIENoYXJhY3RlciAnVycuCmNvbnN0IGludCAkVyA9IDB4NTc7CgovLy8gQ2hhcmFjdGVyICdYJy4KY29uc3QgaW50ICRYID0gMHg1ODsKCi8vLyBDaGFyYWN0ZXIgJ1knLgpjb25zdCBpbnQgJFkgPSAweDU5OwoKLy8vIENoYXJhY3RlciAnWicuCmNvbnN0IGludCAkWiA9IDB4NUE7CgovLy8gQ2hhcmFjdGVyICdbJy4KY29uc3QgaW50ICRsYnJhY2tldCA9IDB4NUI7CgovLy8gQ2hhcmFjdGVyICdbJy4KY29uc3QgaW50ICRvcGVuX2JyYWNrZXQgPSAweDVCOwoKLy8vIENoYXJhY3RlciAnXCcuCmNvbnN0IGludCAkYmFja3NsYXNoID0gMHg1QzsKCi8vLyBDaGFyYWN0ZXIgJ10nLgpjb25zdCBpbnQgJHJicmFja2V0ID0gMHg1RDsKCi8vLyBDaGFyYWN0ZXIgJ10nLgpjb25zdCBpbnQgJGNsb3NlX2JyYWNrZXQgPSAweDVEOwoKLy8vIENoYXJhY3RlciAnXicuCmNvbnN0IGludCAkY2lyY3VtZmxleCA9IDB4NUU7CgovLy8gQ2hhcmFjdGVyICdeJy4KY29uc3QgaW50ICRjYXJldCA9IDB4NUU7CgovLy8gQ2hhcmFjdGVyICdeJy4KY29uc3QgaW50ICRoYXQgPSAweDVFOwoKLy8vIENoYXJhY3RlciAnXycuCmNvbnN0IGludCAkXyA9IDB4NUY7CgovLy8gQ2hhcmFjdGVyICdfJy4KY29uc3QgaW50ICR1bmRlcnNjb3JlID0gMHg1RjsKCi8vLyBDaGFyYWN0ZXIgJ18nLgpjb25zdCBpbnQgJHVuZGVybGluZSA9IDB4NUY7CgovLy8gQ2hhcmFjdGVyICdgJy4KY29uc3QgaW50ICRiYWNrcXVvdGUgPSAweDYwOwoKLy8vIENoYXJhY3RlciAnYCcuCmNvbnN0IGludCAkZ3JhdmUgPSAweDYwOwoKLy8vIENoYXJhY3RlciAnYScuCmNvbnN0IGludCAkYSA9IDB4NjE7CgovLy8gQ2hhcmFjdGVyICdiJy4KY29uc3QgaW50ICRiID0gMHg2MjsKCi8vLyBDaGFyYWN0ZXIgJ2MnLgpjb25zdCBpbnQgJGMgPSAweDYzOwoKLy8vIENoYXJhY3RlciAnZCcuCmNvbnN0IGludCAkZCA9IDB4NjQ7CgovLy8gQ2hhcmFjdGVyICdlJy4KY29uc3QgaW50ICRlID0gMHg2NTsKCi8vLyBDaGFyYWN0ZXIgJ2YnLgpjb25zdCBpbnQgJGYgPSAweDY2OwoKLy8vIENoYXJhY3RlciAnZycuCmNvbnN0IGludCAkZyA9IDB4Njc7CgovLy8gQ2hhcmFjdGVyICdoJy4KY29uc3QgaW50ICRoID0gMHg2ODsKCi8vLyBDaGFyYWN0ZXIgJ2knLgpjb25zdCBpbnQgJGkgPSAweDY5OwoKLy8vIENoYXJhY3RlciAnaicuCmNvbnN0IGludCAkaiA9IDB4NkE7CgovLy8gQ2hhcmFjdGVyICdrJy4KY29uc3QgaW50ICRrID0gMHg2QjsKCi8vLyBDaGFyYWN0ZXIgJ2wnLgpjb25zdCBpbnQgJGwgPSAweDZDOwoKLy8vIENoYXJhY3RlciAnbScuCmNvbnN0IGludCAkbSA9IDB4NkQ7CgovLy8gQ2hhcmFjdGVyICduJy4KY29uc3QgaW50ICRuID0gMHg2RTsKCi8vLyBDaGFyYWN0ZXIgJ28nLgpjb25zdCBpbnQgJG8gPSAweDZGOwoKLy8vIENoYXJhY3RlciAncCcuCmNvbnN0IGludCAkcCA9IDB4NzA7CgovLy8gQ2hhcmFjdGVyICdxJy4KY29uc3QgaW50ICRxID0gMHg3MTsKCi8vLyBDaGFyYWN0ZXIgJ3InLgpjb25zdCBpbnQgJHIgPSAweDcyOwoKLy8vIENoYXJhY3RlciAncycuCmNvbnN0IGludCAkcyA9IDB4NzM7CgovLy8gQ2hhcmFjdGVyICd0Jy4KY29uc3QgaW50ICR0ID0gMHg3NDsKCi8vLyBDaGFyYWN0ZXIgJ3UnLgpjb25zdCBpbnQgJHUgPSAweDc1OwoKLy8vIENoYXJhY3RlciAndicuCmNvbnN0IGludCAkdiA9IDB4NzY7CgovLy8gQ2hhcmFjdGVyICd3Jy4KY29uc3QgaW50ICR3ID0gMHg3NzsKCi8vLyBDaGFyYWN0ZXIgJ3gnLgpjb25zdCBpbnQgJHggPSAweDc4OwoKLy8vIENoYXJhY3RlciAneScuCmNvbnN0IGludCAkeSA9IDB4Nzk7CgovLy8gQ2hhcmFjdGVyICd6Jy4KY29uc3QgaW50ICR6ID0gMHg3QTsKCi8vLyBDaGFyYWN0ZXIgJ3snLgpjb25zdCBpbnQgJGxicmFjZSA9IDB4N0I7CgovLy8gQ2hhcmFjdGVyICd7Jy4KY29uc3QgaW50ICRvcGVuX2JyYWNlID0gMHg3QjsKCi8vLyBDaGFyYWN0ZXIgJ3wnLgpjb25zdCBpbnQgJHBpcGUgPSAweDdDOwoKLy8vIENoYXJhY3RlciAnfCcuCmNvbnN0IGludCAkYmFyID0gMHg3QzsKCi8vLyBDaGFyYWN0ZXIgJ30nLgpjb25zdCBpbnQgJHJicmFjZSA9IDB4N0Q7CgovLy8gQ2hhcmFjdGVyICd9Jy4KY29uc3QgaW50ICRjbG9zZV9icmFjZSA9IDB4N0Q7CgovLy8gQ2hhcmFjdGVyICd+Jy4KY29uc3QgaW50ICR0aWxkZSA9IDB4N0U7CoH+AE5JPAE4BFAESURFPwRNND9DBFA0BEs3KQEXASgXASkXAScXASUXAS0XASEXASgXAR4XASMWASgWATUXASMWASYWASMWASkWASMWASIWASoXATUXASoXATYXASoXATEXASoXATMXASAXAScWASQXASAXASgWASkWASoWASgWASAXARcBFRkBEx8BHxgBExkBEyABEx0BExgBExUBExoBExsBHxcBEx0BExgBEx4BEyABExoBEx4BEyQBExoBEx8BEyUBExwBExgBExkBExkBExgBExcBExwBExkBExsBExwBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExkBEx0BExYBEx0BExoBEx4BExkBExYBEyABExoBEx8BExwBExYBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExwBEyABEx0BExwBEyEBEx4BExkBExcBExUBEx4BEx0BEx0BExkBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExUBExoBEx4BExgBExcBExoBEx8BExkBG3BhY2thZ2U6Y2hhcmNvZGUvYXNjaWkuZGFydEBzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2dfdGVzdGVkL3BhY2thZ2VfY29uZmlnL2xpYi9zcmMvdXRpbC5kYXJ0jxAvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIFV0aWxpdHkgbWV0aG9kcyB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUgbGlicmFyeSBpbiB0aGUgcGFja2FnZS4KbGlicmFyeSBwYWNrYWdlX2NvbmZpZy51dGlsOwoKaW1wb3J0ICJwYWNrYWdlOmNoYXJjb2RlL2FzY2lpLmRhcnQiOwoKLy8gQWxsIEFTQ0lJIGNoYXJhY3RlcnMgdGhhdCBhcmUgdmFsaWQgaW4gYSBwYWNrYWdlIG5hbWUsIHdpdGggc3BhY2UKLy8gZm9yIGFsbCB0aGUgaW52YWxpZCBvbmVzIChpbmNsdWRpbmcgc3BhY2UpLgpjb25zdCBTdHJpbmcgX3ZhbGlkUGFja2FnZU5hbWVDaGFyYWN0ZXJzID0KICAgIHIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISAgJCAmJygpKissLS4gMDEyMzQ1Njc4OSA7ID0gICIKICAgIHIiQEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaICAgIF8gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogICB+ICI7CgovLy8gVGVzdHMgd2hldGhlciBzb21ldGhpbmcgaXMgYSB2YWxpZCBEYXJ0IHBhY2thZ2UgbmFtZS4KYm9vbCBpc1ZhbGlkUGFja2FnZU5hbWUoU3RyaW5nIHN0cmluZykgewogIHJldHVybiBfZmluZEludmFsaWRDaGFyYWN0ZXIoc3RyaW5nKSA8IDA7Cn0KCi8vLyBDaGVjayBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIHBhY2thZ2UgbmFtZS4KLy8vCi8vLyBWYWxpZCBwYWNrYWdlIG5hbWVzIGNvbnRhaW4gb25seSBjaGFyYWN0ZXJzIGluIFtfdmFsaWRQYWNrYWdlTmFtZUNoYXJhY3RlcnNdCi8vLyBhbmQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBub24tJy4nIGNoYXJhY3Rlci4KLy8vCi8vLyBSZXR1cm5zIGAtMWAgaWYgdGhlIHN0cmluZyBpcyB2YWxpZC4KLy8vIE90aGVyd2lzZSByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIsCi8vLyBvciBgc3RyaW5nLmxlbmd0aGAgaWYgdGhlIHN0cmluZyBjb250YWlucyBubyBub24tJy4nIGNoYXJhY3Rlci4KaW50IF9maW5kSW52YWxpZENoYXJhY3RlcihTdHJpbmcgc3RyaW5nKSB7CiAgLy8gQmVjb21lcyBub24temVybyBpZiBhbnkgbm9uLScuJyBjaGFyYWN0ZXIgaXMgZW5jb3VudGVyZWQuCiAgaW50IG5vbkRvdCA9IDA7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHsKICAgIHZhciBjID0gc3RyaW5nLmNvZGVVbml0QXQoaSk7CiAgICBpZiAoYyA+IDB4N2YgfHwgX3ZhbGlkUGFja2FnZU5hbWVDaGFyYWN0ZXJzLmNvZGVVbml0QXQoYykgPD0gJHNwYWNlKSB7CiAgICAgIHJldHVybiBpOwogICAgfQogICAgbm9uRG90ICs9IGMgXiAkZG90OwogIH0KICBpZiAobm9uRG90ID09IDApIHJldHVybiBzdHJpbmcubGVuZ3RoOwogIHJldHVybiAtMTsKfQoKLy8vIFZhbGlkYXRlIHRoYXQgYSBVcmkgaXMgYSB2YWxpZCBwYWNrYWdlOlVSSS4KU3RyaW5nIGNoZWNrVmFsaWRQYWNrYWdlVXJpKFVyaSBwYWNrYWdlVXJpKSB7CiAgaWYgKHBhY2thZ2VVcmkuc2NoZW1lICE9ICJwYWNrYWdlIikgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUoCiAgICAgICAgcGFja2FnZVVyaSwgInBhY2thZ2VVcmkiLCAiTm90IGEgcGFja2FnZTogVVJJIik7CiAgfQogIGlmIChwYWNrYWdlVXJpLmhhc0F1dGhvcml0eSkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUoCiAgICAgICAgcGFja2FnZVVyaSwgInBhY2thZ2VVcmkiLCAiUGFja2FnZSBVUklzIG11c3Qgbm90IGhhdmUgYSBob3N0IHBhcnQiKTsKICB9CiAgaWYgKHBhY2thZ2VVcmkuaGFzUXVlcnkpIHsKICAgIC8vIEEgcXVlcnkgbWFrZXMgbm8gc2Vuc2UgaWYgcmVzb2x2ZWQgdG8gYSBmaWxlOiBVUkkuCiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICBwYWNrYWdlVXJpLCAicGFja2FnZVVyaSIsICJQYWNrYWdlIFVSSXMgbXVzdCBub3QgaGF2ZSBhIHF1ZXJ5IHBhcnQiKTsKICB9CiAgaWYgKHBhY2thZ2VVcmkuaGFzRnJhZ21lbnQpIHsKICAgIC8vIFdlIGNvdWxkIGxlYXZlIHRoZSBmcmFnbWVudCBhZnRlciB0aGUgVVJMIHdoZW4gcmVzb2x2aW5nLAogICAgLy8gYnV0IGl0IHdvdWxkIGJlIG9kZCBpZiAicGFja2FnZTpmb28vZm9vLmRhcnQjMSIgYW5kCiAgICAvLyAicGFja2FnZTpmb28vZm9vLmRhcnQjMiIgd2VyZSBjb25zaWRlcmVkIGRpZmZlcmVudCBsaWJyYXJpZXMuCiAgICAvLyBLZWVwIHRoZSBzeW50YXggb3BlbiBpbiBjYXNlIHdlIGV2ZXIgZ2V0IG11bHRpcGxlIGxpYnJhcmllcyBpbiBvbmUgZmlsZS4KICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgIHBhY2thZ2VVcmksICJwYWNrYWdlVXJpIiwgIlBhY2thZ2UgVVJJcyBtdXN0IG5vdCBoYXZlIGEgZnJhZ21lbnQgcGFydCIpOwogIH0KICBpZiAocGFja2FnZVVyaS5wYXRoLnN0YXJ0c1dpdGgoJy8nKSkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUoCiAgICAgICAgcGFja2FnZVVyaSwgInBhY2thZ2VVcmkiLCAiUGFja2FnZSBVUklzIG11c3Qgbm90IHN0YXJ0IHdpdGggYSAnLyciKTsKICB9CiAgaW50IGZpcnN0U2xhc2ggPSBwYWNrYWdlVXJpLnBhdGguaW5kZXhPZignLycpOwogIGlmIChmaXJzdFNsYXNoID09IC0xKSB7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShwYWNrYWdlVXJpLCAicGFja2FnZVVyaSIsCiAgICAgICAgIlBhY2thZ2UgVVJJcyBtdXN0IHN0YXJ0IHdpdGggdGhlIHBhY2thZ2UgbmFtZSBmb2xsb3dlZCBieSBhICcvJyIpOwogIH0KICBTdHJpbmcgcGFja2FnZU5hbWUgPSBwYWNrYWdlVXJpLnBhdGguc3Vic3RyaW5nKDAsIGZpcnN0U2xhc2gpOwogIGludCBiYWRJbmRleCA9IF9maW5kSW52YWxpZENoYXJhY3RlcihwYWNrYWdlTmFtZSk7CiAgaWYgKGJhZEluZGV4ID49IDApIHsKICAgIGlmIChwYWNrYWdlTmFtZS5pc0VtcHR5KSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgICAgcGFja2FnZVVyaSwgInBhY2thZ2VVcmkiLCAiUGFja2FnZSBuYW1lcyBtdXMgYmUgbm9uLWVtcHR5Iik7CiAgICB9CiAgICBpZiAoYmFkSW5kZXggPT0gcGFja2FnZU5hbWUubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKHBhY2thZ2VVcmksICJwYWNrYWdlVXJpIiwKICAgICAgICAgICJQYWNrYWdlIG5hbWVzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgbm9uLScuJyBjaGFyYWN0ZXIiKTsKICAgIH0KICAgIGFzc2VydChiYWRJbmRleCA8IHBhY2thZ2VOYW1lLmxlbmd0aCk7CiAgICBpbnQgYmFkQ2hhckNvZGUgPSBwYWNrYWdlTmFtZS5jb2RlVW5pdEF0KGJhZEluZGV4KTsKICAgIHZhciBiYWRDaGFyID0gIlUrIiArIGJhZENoYXJDb2RlLnRvUmFkaXhTdHJpbmcoMTYpLnBhZExlZnQoNCwgJzAnKTsKICAgIGlmIChiYWRDaGFyQ29kZSA+PSAweDIwICYmIGJhZENoYXJDb2RlIDw9IDB4N2UpIHsKICAgICAgLy8gUHJpbnRhYmxlIGNoYXJhY3Rlci4KICAgICAgYmFkQ2hhciA9ICInJHtwYWNrYWdlTmFtZVtiYWRJbmRleF19JyAoJGJhZENoYXIpIjsKICAgIH0KICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgIHBhY2thZ2VVcmksICJwYWNrYWdlVXJpIiwgIlBhY2thZ2UgbmFtZXMgbXVzdCBub3QgY29udGFpbiAkYmFkQ2hhciIpOwogIH0KICByZXR1cm4gcGFja2FnZU5hbWU7Cn0KYwBOTjwBQh0BJgFFLytISQE6KSwCAS8EUTUEKUBEKz8SLCJLEAYYBCkNAgEwLigjOQQhI00EHTojTgQgQTtFUCNRBCkjTQQxGjxMBEE1Fx8lRwYqPkgGKzhINh45BiNOBBYCASRwYWNrYWdlOnBhY2thZ2VfY29uZmlnL3NyYy91dGlsLmRhcnRGc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NjYW5uZXIvc3RyaW5nX2Nhbm9uaWNhbGl6ZXIuZGFydIyELy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuc2Nhbm5lci5zdHJpbmdfY2Fub25pY2FsaXplcjsKCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKCmNsYXNzIE5vZGUgewogIHZhciAvKiBTdHJpbmcgfCBMaXN0PGludD4gKi8gZGF0YTsKICBpbnQgc3RhcnQ7CiAgaW50IGVuZDsKICBTdHJpbmcgcGF5bG9hZDsKICBOb2RlIG5leHQ7CiAgTm9kZSh0aGlzLmRhdGEsIHRoaXMuc3RhcnQsIHRoaXMuZW5kLCB0aGlzLnBheWxvYWQsIHRoaXMubmV4dCk7Cn0KCi8vLyBBIGhhc2ggdGFibGUgZm9yIHRyaXBsZXM6Ci8vLyAobGlzdCBvZiBieXRlcywgc3RhcnQsIGVuZCkgLS0+IGNhbm9uaWNhbGl6ZWQgc3RyaW5nCi8vLyBVc2luZyB0cmlwbGVzIGF2b2lkcyBhbGxvY2F0aW5nIHN0cmluZyBzbGljZXMgYmVmb3JlIGNoZWNraW5nIGlmIHRoZXkKLy8vIGFyZSBjYW5vbmljYWwuCi8vLwovLy8gR2l2ZXMgYWJvdXQgMyUgc3BlZWR1cCBvbiBkYXJ0MmpzLgpjbGFzcyBTdHJpbmdDYW5vbmljYWxpemVyIHsKICAvLy8gTWFzayBhd2F5IHRvcCBiaXRzIHRvIGtlZXAgaGFzaCBjYWxjdWxhdGlvbiB3aXRoaW4gMzItYml0IFNNSSByYW5nZS4KICBzdGF0aWMgY29uc3QgaW50IE1BU0sgPSAxNiAqIDEwMjQgKiAxMDI0IC0gMTsKCiAgc3RhdGljIGNvbnN0IGludCBJTklUSUFMX1NJWkUgPSA4ICogMTAyNDsKCiAgLy8vIExpbmVhciBzaXplIG9mIGEgaGFzaCB0YWJsZS4KICBpbnQgX3NpemUgPSBJTklUSUFMX1NJWkU7CgogIC8vLyBJdGVtcyBpbiBhIGhhc2ggdGFibGUuCiAgaW50IF9jb3VudCA9IDA7CgogIC8vLyBUaGUgdGFibGUgaXRzZWxmLgogIExpc3Q8Tm9kZT4gX25vZGVzID0gbmV3IExpc3Q8Tm9kZT4oSU5JVElBTF9TSVpFKTsKCiAgc3RhdGljIFN0cmluZyBkZWNvZGUoTGlzdDxpbnQ+IGRhdGEsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBhc2NpaU9ubHkpIHsKICAgIHZhciBzOwogICAgaWYgKGFzY2lpT25seSkgewogICAgICBzID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgfSBlbHNlIHsKICAgICAgcyA9IG5ldyBVdGY4RGVjb2RlcihhbGxvd01hbGZvcm1lZDogdHJ1ZSkuY29udmVydChkYXRhLCBzdGFydCwgZW5kKTsKICAgIH0KICAgIHJldHVybiBzOwogIH0KCiAgc3RhdGljIGludCBoYXNoQnl0ZXMoTGlzdDxpbnQ+IGRhdGEsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgaW50IGggPSA1MzgxOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgaCA9ICgoaCA8PCA1KSArIGggKyBkYXRhW2ldKSAmIE1BU0s7CiAgICB9CiAgICByZXR1cm4gaDsKICB9CgogIHN0YXRpYyBpbnQgaGFzaFN0cmluZyhTdHJpbmcgZGF0YSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBpbnQgaCA9IDUzODE7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICBoID0gKChoIDw8IDUpICsgaCArIGRhdGEuY29kZVVuaXRBdChpKSkgJiBNQVNLOwogICAgfQogICAgcmV0dXJuIGg7CiAgfQoKICByZWhhc2goKSB7CiAgICB2YXIgbmV3U2l6ZSA9IF9zaXplICogMjsKICAgIHZhciBuZXdOb2RlcyA9IG5ldyBMaXN0PE5vZGU+KG5ld1NpemUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2l6ZTsgaSsrKSB7CiAgICAgIE5vZGUgdCA9IF9ub2Rlc1tpXTsKICAgICAgd2hpbGUgKHQgIT0gbnVsbCkgewogICAgICAgIE5vZGUgbiA9IHQubmV4dDsKICAgICAgICBpbnQgbmV3SW5kZXggPSB0LmRhdGEgaXMgU3RyaW5nCiAgICAgICAgICAgID8gaGFzaFN0cmluZyh0LmRhdGEsIHQuc3RhcnQsIHQuZW5kKSAmIChuZXdTaXplIC0gMSkKICAgICAgICAgICAgOiBoYXNoQnl0ZXModC5kYXRhLCB0LnN0YXJ0LCB0LmVuZCkgJiAobmV3U2l6ZSAtIDEpOwogICAgICAgIE5vZGUgcyA9IG5ld05vZGVzW25ld0luZGV4XTsKICAgICAgICB0Lm5leHQgPSBzOwogICAgICAgIG5ld05vZGVzW25ld0luZGV4XSA9IHQ7CiAgICAgICAgdCA9IG47CiAgICAgIH0KICAgIH0KICAgIF9zaXplID0gbmV3U2l6ZTsKICAgIF9ub2RlcyA9IG5ld05vZGVzOwogIH0KCiAgU3RyaW5nIGNhbm9uaWNhbGl6ZShkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgYXNjaWlPbmx5KSB7CiAgICBpZiAoX2NvdW50ID4gX3NpemUpIHJlaGFzaCgpOwogICAgaW50IGluZGV4ID0gZGF0YSBpcyBTdHJpbmcKICAgICAgICA/IGhhc2hTdHJpbmcoZGF0YSwgc3RhcnQsIGVuZCkKICAgICAgICA6IGhhc2hCeXRlcyhkYXRhLCBzdGFydCwgZW5kKTsKICAgIGluZGV4ID0gaW5kZXggJiAoX3NpemUgLSAxKTsKICAgIE5vZGUgcyA9IF9ub2Rlc1tpbmRleF07CiAgICBOb2RlIHQgPSBzOwogICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OwogICAgd2hpbGUgKHQgIT0gbnVsbCkgewogICAgICBpZiAodC5lbmQgLSB0LnN0YXJ0ID09IGxlbikgewogICAgICAgIGludCBpID0gc3RhcnQsIGogPSB0LnN0YXJ0OwogICAgICAgIHdoaWxlIChpIDwgZW5kICYmIGRhdGFbaV0gPT0gdC5kYXRhW2pdKSB7CiAgICAgICAgICBpKys7CiAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgICAgIGlmIChpID09IGVuZCkgewogICAgICAgICAgcmV0dXJuIHQucGF5bG9hZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdCA9IHQubmV4dDsKICAgIH0KICAgIFN0cmluZyBwYXlsb2FkOwogICAgaWYgKGRhdGEgaXMgU3RyaW5nKQogICAgICBwYXlsb2FkID0gZGF0YS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgICBlbHNlCiAgICAgIHBheWxvYWQgPSBkZWNvZGUoZGF0YSwgc3RhcnQsIGVuZCwgYXNjaWlPbmx5KTsKICAgIF9ub2Rlc1tpbmRleF0gPSBuZXcgTm9kZShkYXRhLCBzdGFydCwgZW5kLCBwYXlsb2FkLCBzKTsKICAgIF9jb3VudCsrOwogICAgcmV0dXJuIHBheWxvYWQ7CiAgfQoKICBjbGVhcigpIHsKICAgIF9zaXplID0gSU5JVElBTF9TSVpFOwogICAgX25vZGVzID0gbmV3IExpc3Q8Tm9kZT4oX3NpemUpOwogICAgX2NvdW50ID0gMDsKICB9Cn0KfABOTjwBLAEXAQ0lDQsSDUICAR45ShMEJxxLMAEsASMcAR0SARg0AU0LFTYNSwYOBAE9EigrBg4EATsSKDYGDgQBDR0sJhoaGShBQSUUIA8IBhUXBAFCIh8nJyEcEBsYJCQyDw8KGBwKCBIGFBgsCTU8DhQEAQwaJBAEAgE9cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvc3RyaW5nX2Nhbm9uaWNhbGl6ZXIuZGFydDlzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYmFzZS9zeW50YWN0aWNfZW50aXR5LmRhcnSDFy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovKioKICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIHN5bnRhY3RpYyBlbnRpdHkgKGVpdGhlciBhIHRva2VuIG9yIGFuIEFTVCBub2RlKQogKiB3aGljaCBoYXMgYSBsb2NhdGlvbiBhbmQgZXh0ZW50IGluIHRoZSBzb3VyY2UgZmlsZS4KICovCmFic3RyYWN0IGNsYXNzIFN5bnRhY3RpY0VudGl0eSB7CiAgLyoqCiAgICogUmV0dXJuIHRoZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlCiAgICogbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIHN5bnRhY3RpYyBlbnRpdHkuCiAgICovCiAgaW50IGdldCBlbmQ7CgogIC8qKgogICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHN5bnRhY3RpYyBlbnRpdHkncyBzb3VyY2UgcmFuZ2UuCiAgICovCiAgaW50IGdldCBsZW5ndGg7CgogIC8qKgogICAqIFJldHVybiB0aGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGluCiAgICogdGhlIHN5bnRhY3RpYyBlbnRpdHkuCiAgICovCiAgaW50IGdldCBvZmZzZXQ7Cn0KHABOTjwBBE03BCEGUS0GDwEGTQYSAQZQGwYSAgEwcGFja2FnZTpmcm9udF9lbmQvc3JjL2Jhc2Uvc3ludGFjdGljX2VudGl0eS5kYXJ0PHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9zY2FubmVyL3N0cmluZ191dGlsaXRpZXMuZGFydIGALy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnaW50ZXJuZXIuZGFydCc7CgpjbGFzcyBTdHJpbmdVdGlsaXRpZXMgewogIHN0YXRpYyBJbnRlcm5lciBJTlRFUk5FUiA9IG5ldyBOdWxsSW50ZXJuZXIoKTsKCiAgc3RhdGljIFN0cmluZyBpbnRlcm4oU3RyaW5nIHN0cmluZykgPT4gSU5URVJORVIuaW50ZXJuKHN0cmluZyk7Cn0KDQBOTjwBGAEYMQFCAgEzcGFja2FnZTpmcm9udF9lbmQvc3JjL3NjYW5uZXIvc3RyaW5nX3V0aWxpdGllcy5kYXJ0PXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9ibGFja2xpc3RlZF9jbGFzc2VzLmRhcnSBiS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBMaXN0IG9mIHNwZWNpYWwgY2xhc3NlcyBpbiBkYXJ0OmNvcmUgdGhhdCBjYW4ndCBiZSBzdWJjbGFzc2VkLgpjb25zdCBMaXN0PFN0cmluZz4gYmxhY2tsaXN0ZWRDb3JlQ2xhc3NlcyA9IFsKICAiYm9vbCIsCiAgImludCIsCiAgIm51bSIsCiAgImRvdWJsZSIsCiAgIlN0cmluZyIsCiAgIk51bGwiCl07Cg8ATk48AUIuCgkJDAwJAwE0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2JsYWNrbGlzdGVkX2NsYXNzZXMuZGFydD9zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnSIdy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmtlcm5lbF9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBDb21iaW5hdG9yLAogICAgICAgIENvbnN0cnVjdG9yLAogICAgICAgIEluaXRpYWxpemVyLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBSZWRpcmVjdGluZ0luaXRpYWxpemVyOwoKaW1wb3J0ICcuLi9jb21iaW5hdG9yLmRhcnQnIGFzIGZhc3RhOwoKZXhwb3J0ICcuLi9idWlsZGVyL2J1aWxkZXIuZGFydCc7CgpleHBvcnQgJ2NsYXNzX2hpZXJhcmNoeV9idWlsZGVyLmRhcnQnCiAgICBzaG93IENsYXNzSGllcmFyY2h5QnVpbGRlciwgRGVsYXllZE1lbWJlciwgRGVsYXllZE92ZXJyaWRlQ2hlY2s7CgpleHBvcnQgJ2ltcGxpY2l0X2ZpZWxkX3R5cGUuZGFydCcgc2hvdyBJbXBsaWNpdEZpZWxkVHlwZTsKCmV4cG9ydCAna2VybmVsX2ZpZWxkX2J1aWxkZXIuZGFydCcgc2hvdyBLZXJuZWxGaWVsZEJ1aWxkZXI7CgpleHBvcnQgJ2tlcm5lbF9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBLZXJuZWxMaWJyYXJ5QnVpbGRlcjsKCmV4cG9ydCAna2VybmVsX21ldGFkYXRhX2J1aWxkZXIuZGFydCcgc2hvdyBLZXJuZWxNZXRhZGF0YUJ1aWxkZXI7CgpleHBvcnQgJ2tlcm5lbF9wcmVmaXhfYnVpbGRlci5kYXJ0JyBzaG93IEtlcm5lbFByZWZpeEJ1aWxkZXI7CgpleHBvcnQgJ2tlcm5lbF92YXJpYWJsZV9idWlsZGVyLmRhcnQnIHNob3cgS2VybmVsVmFyaWFibGVCdWlsZGVyOwoKZXhwb3J0ICdsb2FkX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IExvYWRMaWJyYXJ5QnVpbGRlcjsKCmV4cG9ydCAndW5saW5rZWRfc2NvcGUuZGFydCcgc2hvdyBVbmxpbmtlZERlY2xhcmF0aW9uOwoKaW50IGNvbXBhcmVQcm9jZWR1cmVzKFByb2NlZHVyZSBhLCBQcm9jZWR1cmUgYikgewogIGludCBpID0gIiR7YS5maWxlVXJpfSIuY29tcGFyZVRvKCIke2IuZmlsZVVyaX0iKTsKICBpZiAoaSAhPSAwKSByZXR1cm4gaTsKICByZXR1cm4gYS5maWxlT2Zmc2V0LmNvbXBhcmVUbyhiLmZpbGVPZmZzZXQpOwp9Cgpib29sIGlzUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RydWN0b3JJbXBsZW1lbnRhdGlvbihDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgewogIExpc3Q8SW5pdGlhbGl6ZXI+IGluaXRpYWxpemVycyA9IGNvbnN0cnVjdG9yLmluaXRpYWxpemVyczsKICByZXR1cm4gaW5pdGlhbGl6ZXJzLmxlbmd0aCA9PSAxICYmCiAgICAgIGluaXRpYWxpemVycy5zaW5nbGUgaXMgUmVkaXJlY3RpbmdJbml0aWFsaXplcjsKfQoKTGlzdDxDb21iaW5hdG9yPiB0b0tlcm5lbENvbWJpbmF0b3JzKExpc3Q8ZmFzdGEuQ29tYmluYXRvcj4gZmFzdGFDb21iaW5hdG9ycykgewogIGlmIChmYXN0YUNvbWJpbmF0b3JzID09IG51bGwpIHsKICAgIC8vIE5vdGU6IGl0J3Mgc2FmZSB0byByZXR1cm4gbnVsbCBoZXJlIGFzIEtlcm5lbCdzIExpYnJhcnlEZXBlbmRlbmN5IHdpbGwKICAgIC8vIGNvbnZlcnQgbnVsbCB0byBhbiBlbXB0eSBsaXN0LgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBMaXN0PENvbWJpbmF0b3I+IHJlc3VsdCA9IG5ldyBMaXN0PENvbWJpbmF0b3I+LmZpbGxlZCgKICAgICAgZmFzdGFDb21iaW5hdG9ycy5sZW5ndGgsIG51bGwsCiAgICAgIGdyb3dhYmxlOiB0cnVlKTsKICBmb3IgKGludCBpID0gMDsgaSA8IGZhc3RhQ29tYmluYXRvcnMubGVuZ3RoOyBpKyspIHsKICAgIGZhc3RhLkNvbWJpbmF0b3IgY29tYmluYXRvciA9IGZhc3RhQ29tYmluYXRvcnNbaV07CiAgICBMaXN0PFN0cmluZz4gbmFtZUxpc3QgPSBjb21iaW5hdG9yLm5hbWVzLnRvTGlzdCgpOwogICAgcmVzdWx0W2ldID0gY29tYmluYXRvci5pc1Nob3cKICAgICAgICA/IG5ldyBDb21iaW5hdG9yLnNob3cobmFtZUxpc3QpCiAgICAgICAgOiBuZXcgQ29tYmluYXRvci5oaWRlKG5hbWVMaXN0KTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpGAE5OPAEeASEJFBUVEyABJgEiASZFAToBPAFAAUIBPgFCATwBNwEyNBgvAgFRPSU1AgFQIk4mEQQBOSUXNjc3IigpBBECATZwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQ/c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3RhcmdldF9pbXBsZW1lbnRhdGlvbi5kYXJ0maEvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS50YXJnZXRfaW1wbGVtZW50YXRpb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IFNvdXJjZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCcgYXMgYmFja2VuZCBzaG93IFRhcmdldDsKCmltcG9ydCAnLi4vYmFzZS9wcm9jZXNzZWRfb3B0aW9ucy5kYXJ0JyBzaG93IFByb2Nlc3NlZE9wdGlvbnM7CgppbXBvcnQgJ2J1aWxkZXIvYnVpbGRlci5kYXJ0JyBzaG93IERlY2xhcmF0aW9uLCBDbGFzc0J1aWxkZXIsIExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdjb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKaW1wb3J0ICdsb2FkZXIuZGFydCcgc2hvdyBMb2FkZXI7CgppbXBvcnQgJ21lc3NhZ2VzLmRhcnQnIHNob3cgRm9ybWF0dGVkTWVzc2FnZSwgTG9jYXRlZE1lc3NhZ2UsIE1lc3NhZ2U7CgppbXBvcnQgJ3Jld3JpdGVfc2V2ZXJpdHkuZGFydCcgc2hvdyByZXdyaXRlU2V2ZXJpdHk7CgppbXBvcnQgJ3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJ3RhcmdldC5kYXJ0JyBzaG93IFRhcmdldDsKCmltcG9ydCAndGlja2VyLmRhcnQnIHNob3cgVGlja2VyOwoKaW1wb3J0ICd1cmlfdHJhbnNsYXRvci5kYXJ0JyBzaG93IFVyaVRyYW5zbGF0b3I7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZXhwZXJpbWVudGFsX2ZsYWdzLmRhcnQnIHNob3cgRXhwZXJpbWVudGFsRmxhZzsKCi8vLyBQcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscyB1c2VkIGJ5IGEgbG9hZGVyIGZvciBhIHRhcmdldC4KYWJzdHJhY3QgY2xhc3MgVGFyZ2V0SW1wbGVtZW50YXRpb24gZXh0ZW5kcyBUYXJnZXQgewogIGZpbmFsIFVyaVRyYW5zbGF0b3IgdXJpVHJhbnNsYXRvcjsKCiAgZmluYWwgYmFja2VuZC5UYXJnZXQgYmFja2VuZFRhcmdldDsKCiAgZmluYWwgQ29tcGlsZXJDb250ZXh0IGNvbnRleHQgPSBDb21waWxlckNvbnRleHQuY3VycmVudDsKCiAgLy8vIFNoYXJlZCB3aXRoIFtDb21waWxlckNvbnRleHRdLgogIGZpbmFsIE1hcDxVcmksIFNvdXJjZT4gdXJpVG9Tb3VyY2UgPSBDb21waWxlckNvbnRleHQuY3VycmVudC51cmlUb1NvdXJjZTsKCiAgRGVjbGFyYXRpb24gY2FjaGVkQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcjsKICBEZWNsYXJhdGlvbiBjYWNoZWRDb21waWxlVGltZUVycm9yOwogIERlY2xhcmF0aW9uIGNhY2hlZER1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3I7CiAgRGVjbGFyYXRpb24gY2FjaGVkRmFsbFRocm91Z2hFcnJvcjsKICBEZWNsYXJhdGlvbiBjYWNoZWROYXRpdmVBbm5vdGF0aW9uOwogIERlY2xhcmF0aW9uIGNhY2hlZE5hdGl2ZUV4dGVuc2lvbkFubm90YXRpb247CgogIGJvb2wgZW5hYmxlQ29uc3RhbnRVcGRhdGUyMDE4OwogIGJvb2wgZW5hYmxlQ29udHJvbEZsb3dDb2xsZWN0aW9uczsKICBib29sIGVuYWJsZUV4dGVuc2lvbk1ldGhvZHM7CiAgYm9vbCBlbmFibGVOb25OdWxsYWJsZTsKICBib29sIGVuYWJsZVNwcmVhZENvbGxlY3Rpb25zOwogIGJvb2wgZW5hYmxlVHJpcGxlU2hpZnQ7CgogIFRhcmdldEltcGxlbWVudGF0aW9uKFRpY2tlciB0aWNrZXIsIHRoaXMudXJpVHJhbnNsYXRvciwgdGhpcy5iYWNrZW5kVGFyZ2V0KQogICAgICA6IGVuYWJsZUNvbnN0YW50VXBkYXRlMjAxOCA9IENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMKICAgICAgICAgICAgLmlzRXhwZXJpbWVudEVuYWJsZWQoRXhwZXJpbWVudGFsRmxhZy5jb25zdGFudFVwZGF0ZTIwMTgpLAogICAgICAgIGVuYWJsZUNvbnRyb2xGbG93Q29sbGVjdGlvbnMgPSBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zCiAgICAgICAgICAgIC5pc0V4cGVyaW1lbnRFbmFibGVkKEV4cGVyaW1lbnRhbEZsYWcuY29udHJvbEZsb3dDb2xsZWN0aW9ucyksCiAgICAgICAgZW5hYmxlRXh0ZW5zaW9uTWV0aG9kcyA9IENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMKICAgICAgICAgICAgLmlzRXhwZXJpbWVudEVuYWJsZWQoRXhwZXJpbWVudGFsRmxhZy5leHRlbnNpb25NZXRob2RzKSwKICAgICAgICBlbmFibGVOb25OdWxsYWJsZSA9IENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMKICAgICAgICAgICAgLmlzRXhwZXJpbWVudEVuYWJsZWQoRXhwZXJpbWVudGFsRmxhZy5ub25OdWxsYWJsZSksCiAgICAgICAgZW5hYmxlU3ByZWFkQ29sbGVjdGlvbnMgPSBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zCiAgICAgICAgICAgIC5pc0V4cGVyaW1lbnRFbmFibGVkKEV4cGVyaW1lbnRhbEZsYWcuc3ByZWFkQ29sbGVjdGlvbnMpLAogICAgICAgIGVuYWJsZVRyaXBsZVNoaWZ0ID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQub3B0aW9ucwogICAgICAgICAgICAuaXNFeHBlcmltZW50RW5hYmxlZChFeHBlcmltZW50YWxGbGFnLnRyaXBsZVNoaWZ0KSwKICAgICAgICBzdXBlcih0aWNrZXIpOwoKICAvLy8gQ3JlYXRlcyBhIFtMaWJyYXJ5QnVpbGRlcl0gY29ycmVzcG9uZGluZyB0byBbdXJpXSwgaWYgb25lIGRvZXNuJ3QgZXhpc3QKICAvLy8gYWxyZWFkeS4KICAvLy8KICAvLy8gW2ZpbGVVcmldIG11c3Qgbm90IGJlIG51bGwgYW5kIGlzIGEgVVJJIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBGaWxlU3lzdGVtCiAgLy8vIHRvIGxvY2F0ZSB0aGUgY29ycmVzcG9uZGluZyBmaWxlLgogIC8vLwogIC8vLyBbb3JpZ2luXSBpcyBub24tbnVsbCBpZiB0aGUgY3JlYXRlZCBsaWJyYXJ5IGlzIGEgcGF0Y2ggdG8gW29yaWdpbl0uCiAgTGlicmFyeUJ1aWxkZXIgY3JlYXRlTGlicmFyeUJ1aWxkZXIoCiAgICAgIFVyaSB1cmksIFVyaSBmaWxlVXJpLCBjb3ZhcmlhbnQgTGlicmFyeUJ1aWxkZXIgb3JpZ2luKTsKCiAgLy8vIFRoZSBjbGFzcyBbY2xzXSBpcyBpbnZvbHZlZCBpbiBhIGN5Y2xpYyBkZWZpbml0aW9uLiBUaGlzIG1ldGhvZCBzaG91bGQKICAvLy8gZW5zdXJlIHRoYXQgdGhlIGN5Y2xlIGlzIGJyb2tlbiwgZm9yIGV4YW1wbGUsIGJ5IHJlbW92aW5nIHN1cGVyY2xhc3MgYW5kCiAgLy8vIGltcGxlbWVudGVkIGludGVyZmFjZXMuCiAgdm9pZCBicmVha0N5Y2xlKENsYXNzQnVpbGRlciBjbHMpOwoKICBVcmkgdHJhbnNsYXRlVXJpKFVyaSB1cmkpID0+IHVyaVRyYW5zbGF0b3IudHJhbnNsYXRlKHVyaSk7CgogIC8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjb25zdHJ1Y3RvciBvZgogIC8vLyBbQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcl0gZXJyb3IuICBUaGUgY29uc3RydWN0b3IgaXMgZXhwZWN0ZWQgdG8KICAvLy8gYWNjZXB0IGEgc2luZ2xlIGFyZ3VtZW50IG9mIHR5cGUgU3RyaW5nLCB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUKICAvLy8gYWJzdHJhY3QgY2xhc3MuCiAgRGVjbGFyYXRpb24gZ2V0QWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcihMb2FkZXIgbG9hZGVyKSB7CiAgICBpZiAoY2FjaGVkQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvciAhPSBudWxsKSB7CiAgICAgIHJldHVybiBjYWNoZWRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yOwogICAgfQogICAgcmV0dXJuIGNhY2hlZEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IgPQogICAgICAgIGxvYWRlci5jb3JlTGlicmFyeS5nZXRDb25zdHJ1Y3RvcigiQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvciIpOwogIH0KCiAgLy8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGNvbnN0cnVjdG9yIHVzZWQgZm9yIGNyZWF0aW5nIGEgY29tcGlsZS10aW1lCiAgLy8vIGVycm9yLiBUaGUgY29uc3RydWN0b3IgaXMgZXhwZWN0ZWQgdG8gYWNjZXB0IGEgc2luZ2xlIGFyZ3VtZW50IG9mIHR5cGUKICAvLy8gU3RyaW5nLCB3aGljaCBpcyB0aGUgY29tcGlsZS10aW1lIGVycm9yIG1lc3NhZ2UuCiAgRGVjbGFyYXRpb24gZ2V0Q29tcGlsZVRpbWVFcnJvcihMb2FkZXIgbG9hZGVyKSB7CiAgICBpZiAoY2FjaGVkQ29tcGlsZVRpbWVFcnJvciAhPSBudWxsKSByZXR1cm4gY2FjaGVkQ29tcGlsZVRpbWVFcnJvcjsKICAgIHJldHVybiBjYWNoZWRDb21waWxlVGltZUVycm9yID0gbG9hZGVyLmNvcmVMaWJyYXJ5CiAgICAgICAgLmdldENvbnN0cnVjdG9yKCJfQ29tcGlsZVRpbWVFcnJvciIsIGJ5cGFzc0xpYnJhcnlQcml2YWN5OiB0cnVlKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjb25zdHJ1Y3RvciB1c2VkIGZvciBjcmVhdGluZyBhIHJ1bnRpbWUgZXJyb3IKICAvLy8gd2hlbiBhIGZpbmFsIGZpZWxkIGlzIGluaXRpYWxpemVkIHR3aWNlLiBUaGUgY29uc3RydWN0b3IgaXMgZXhwZWN0ZWQgdG8KICAvLy8gYWNjZXB0IGEgc2luZ2xlIGFyZ3VtZW50IHdoaWNoIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KICBEZWNsYXJhdGlvbiBnZXREdXBsaWNhdGVkRmllbGRJbml0aWFsaXplckVycm9yKExvYWRlciBsb2FkZXIpIHsKICAgIGlmIChjYWNoZWREdXBsaWNhdGVkRmllbGRJbml0aWFsaXplckVycm9yICE9IG51bGwpIHsKICAgICAgcmV0dXJuIGNhY2hlZER1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3I7CiAgICB9CiAgICByZXR1cm4gY2FjaGVkRHVwbGljYXRlZEZpZWxkSW5pdGlhbGl6ZXJFcnJvciA9IGxvYWRlci5jb3JlTGlicmFyeQogICAgICAgIC5nZXRDb25zdHJ1Y3RvcigiX0R1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3IiLAogICAgICAgICAgICBieXBhc3NMaWJyYXJ5UHJpdmFjeTogdHJ1ZSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgY29uc3RydWN0b3IgdXNlZCBmb3IgY3JlYXRpbmcgYG5hdGl2ZWAKICAvLy8gYW5ub3RhdGlvbnMuIFRoZSBjb25zdHJ1Y3RvciBpcyBleHBlY3RlZCB0byBhY2NlcHQgYSBzaW5nbGUgYXJndW1lbnQgb2YKICAvLy8gdHlwZSBTdHJpbmcsIHdoaWNoIGlzIHRoZSBuYW1lIG9mIHRoZSBuYXRpdmUgbWV0aG9kLgogIERlY2xhcmF0aW9uIGdldE5hdGl2ZUFubm90YXRpb24oTG9hZGVyIGxvYWRlcikgewogICAgaWYgKGNhY2hlZE5hdGl2ZUFubm90YXRpb24gIT0gbnVsbCkgcmV0dXJuIGNhY2hlZE5hdGl2ZUFubm90YXRpb247CiAgICBMaWJyYXJ5QnVpbGRlciBpbnRlcm5hbCA9IGxvYWRlci5yZWFkKFVyaS5wYXJzZSgiZGFydDpfaW50ZXJuYWwiKSwgLTEsCiAgICAgICAgYWNjZXNzb3I6IGxvYWRlci5jb3JlTGlicmFyeSk7CiAgICByZXR1cm4gY2FjaGVkTmF0aXZlQW5ub3RhdGlvbiA9IGludGVybmFsLmdldENvbnN0cnVjdG9yKCJFeHRlcm5hbE5hbWUiKTsKICB9CgogIHZvaWQgbG9hZEV4dHJhUmVxdWlyZWRMaWJyYXJpZXMoTG9hZGVyIGxvYWRlcikgewogICAgZm9yIChTdHJpbmcgdXJpIGluIGJhY2tlbmRUYXJnZXQuZXh0cmFSZXF1aXJlZExpYnJhcmllcykgewogICAgICBsb2FkZXIucmVhZChVcmkucGFyc2UodXJpKSwgMCwgYWNjZXNzb3I6IGxvYWRlci5jb3JlTGlicmFyeSk7CiAgICB9CiAgfQoKICB2b2lkIGFkZFNvdXJjZUluZm9ybWF0aW9uKAogICAgICBVcmkgaW1wb3J0VXJpLCBVcmkgZmlsZVVyaSwgTGlzdDxpbnQ+IGxpbmVTdGFydHMsIExpc3Q8aW50PiBzb3VyY2VDb2RlKTsKCiAgdm9pZCByZWFkUGF0Y2hGaWxlcyhjb3ZhcmlhbnQgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkge30KCiAgRm9ybWF0dGVkTWVzc2FnZSBjcmVhdGVGb3JtYXR0ZWRNZXNzYWdlKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgbGVuZ3RoLAogICAgICBVcmkgZmlsZVVyaSwKICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gbWVzc2FnZUNvbnRleHQsCiAgICAgIFNldmVyaXR5IHNldmVyaXR5KSB7CiAgICBQcm9jZXNzZWRPcHRpb25zIHByb2Nlc3NlZE9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7CiAgICByZXR1cm4gcHJvY2Vzc2VkT3B0aW9ucy5mb3JtYXQoCiAgICAgICAgbWVzc2FnZS53aXRoTG9jYXRpb24oZmlsZVVyaSwgY2hhck9mZnNldCwgbGVuZ3RoKSwKICAgICAgICBzZXZlcml0eSwKICAgICAgICBtZXNzYWdlQ29udGV4dCk7CiAgfQoKICBTZXZlcml0eSBmaXhTZXZlcml0eShTZXZlcml0eSBzZXZlcml0eSwgTWVzc2FnZSBtZXNzYWdlLCBVcmkgZmlsZVVyaSkgewogICAgc2V2ZXJpdHkgPz89IG1lc3NhZ2UuY29kZS5zZXZlcml0eTsKICAgIGlmIChzZXZlcml0eSA9PSBTZXZlcml0eS5lcnJvckxlZ2FjeVdhcm5pbmcpIHsKICAgICAgc2V2ZXJpdHkgPSBiYWNrZW5kVGFyZ2V0LmxlZ2FjeU1vZGUgPyBTZXZlcml0eS53YXJuaW5nIDogU2V2ZXJpdHkuZXJyb3I7CiAgICB9CiAgICByZXR1cm4gcmV3cml0ZVNldmVyaXR5KHNldmVyaXR5LCBtZXNzYWdlLmNvZGUsIGZpbGVVcmkpOwogIH0KfQqApwBOTjwBJQEuAUQBPwFOATUBIgFHATUBJgEiASIBMQFJAUc1JQEmATsBJUwBNSY1JiYvASElHxogGgFOQ0dHS0FFPEBCRjxAFwFODwZPKAZKJz4BTU8eJQE9ATBPSBZCOTQGM04EAU5NNzNHN0oEAU9OP0I5NAZGPCkEAUhOOzNHSydNBAEzP0QGBAEdTwE7ASsXFhITKxs5JDsSGQQBSigzTwY9BAIBNnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90YXJnZXRfaW1wbGVtZW50YXRpb24uZGFydENzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvZGlsbC9kaWxsX2xpYnJhcnlfYnVpbGRlci5kYXJ0pPQvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5kaWxsX2xpYnJhcnlfYnVpbGRlcjsKCmltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IGpzb25EZWNvZGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIENsYXNzLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEZpZWxkLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBMaWJyYXJ5LAogICAgICAgIExpc3RMaXRlcmFsLAogICAgICAgIE1lbWJlciwKICAgICAgICBQcm9jZWR1cmUsCiAgICAgICAgU3RhdGljR2V0LAogICAgICAgIFN0cmluZ0xpdGVyYWwsCiAgICAgICAgVHlwZWRlZjsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBNZXNzYWdlLAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uLAogICAgICAgIHRlbXBsYXRlVHlwZU5vdEZvdW5kLAogICAgICAgIHRlbXBsYXRlVW5zcGVjaWZpZWQ7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgaW50ZXJuYWxQcm9ibGVtLCB1bmhhbmRsZWQsIHVuaW1wbGVtZW50ZWQ7CgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIER5bmFtaWNUeXBlQnVpbGRlciwKICAgICAgICBJbnZhbGlkVHlwZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgU2NvcGU7CgppbXBvcnQgJy4uL2tlcm5lbC9yZWRpcmVjdGluZ19mYWN0b3J5X2JvZHkuZGFydCcgc2hvdyBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5OwoKaW1wb3J0ICdkaWxsX2NsYXNzX2J1aWxkZXIuZGFydCcgc2hvdyBEaWxsQ2xhc3NCdWlsZGVyOwoKaW1wb3J0ICdkaWxsX21lbWJlcl9idWlsZGVyLmRhcnQnIHNob3cgRGlsbE1lbWJlckJ1aWxkZXI7CgppbXBvcnQgJ2RpbGxfbG9hZGVyLmRhcnQnIHNob3cgRGlsbExvYWRlcjsKCmltcG9ydCAnZGlsbF90eXBlX2FsaWFzX2J1aWxkZXIuZGFydCcgc2hvdyBEaWxsVHlwZUFsaWFzQnVpbGRlcjsKCmNsYXNzIExhenlMaWJyYXJ5U2NvcGUgZXh0ZW5kcyBTY29wZSB7CiAgRGlsbExpYnJhcnlCdWlsZGVyIGxpYnJhcnlCdWlsZGVyOwoKICBMYXp5TGlicmFyeVNjb3BlKE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBsb2NhbCwKICAgICAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IHNldHRlcnMsIFNjb3BlIHBhcmVudCwgU3RyaW5nIGRlYnVnTmFtZSwKICAgICAge2Jvb2wgaXNNb2RpZmlhYmxlOiB0cnVlfSkKICAgICAgOiBzdXBlcihsb2NhbCwgc2V0dGVycywgcGFyZW50LCBkZWJ1Z05hbWUsIGlzTW9kaWZpYWJsZTogaXNNb2RpZmlhYmxlKTsKCiAgTGF6eUxpYnJhcnlTY29wZS50b3Aoe2Jvb2wgaXNNb2RpZmlhYmxlOiBmYWxzZX0pCiAgICAgIDogdGhpcyg8U3RyaW5nLCBEZWNsYXJhdGlvbj57fSwgPFN0cmluZywgRGVjbGFyYXRpb24+e30sIG51bGwsICJ0b3AiLAogICAgICAgICAgICBpc01vZGlmaWFibGU6IGlzTW9kaWZpYWJsZSk7CgogIE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBnZXQgbG9jYWwgewogICAgaWYgKGxpYnJhcnlCdWlsZGVyID09IG51bGwpIHRocm93IG5ldyBTdGF0ZUVycm9yKCJObyBsaWJyYXJ5IGJ1aWxkZXIuIik7CiAgICBsaWJyYXJ5QnVpbGRlci5lbnN1cmVMb2FkZWQoKTsKICAgIHJldHVybiBzdXBlci5sb2NhbDsKICB9CgogIE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBnZXQgc2V0dGVycyB7CiAgICBpZiAobGlicmFyeUJ1aWxkZXIgPT0gbnVsbCkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIk5vIGxpYnJhcnkgYnVpbGRlci4iKTsKICAgIGxpYnJhcnlCdWlsZGVyLmVuc3VyZUxvYWRlZCgpOwogICAgcmV0dXJuIHN1cGVyLnNldHRlcnM7CiAgfQp9CgpjbGFzcyBEaWxsTGlicmFyeUJ1aWxkZXIgZXh0ZW5kcyBMaWJyYXJ5QnVpbGRlciB7CiAgZmluYWwgTGlicmFyeSBsaWJyYXJ5OwoKICBEaWxsTG9hZGVyIGxvYWRlcjsKCiAgLy8vIEV4cG9ydHMgdGhhdCBjYW4ndCBiZSBzZXJpYWxpemVkLgogIC8vLwogIC8vLyBUaGUgZWxlbWVudHMgb2YgdGhpcyBtYXAgYXJlIGRvY3VtZW50ZWQgaW4KICAvLy8gWy4uL2tlcm5lbC9rZXJuZWxfbGlicmFyeV9idWlsZGVyLmRhcnRdLgogIE1hcDxTdHJpbmcsIFN0cmluZz4gdW5zZXJpYWxpemFibGVFeHBvcnRzOwoKICBib29sIGV4cG9ydHNBbHJlYWR5RmluYWxpemVkID0gZmFsc2U7CgogIC8vIFRPRE8oamVuc2opOiBUaGVzZSA0IGJvb2xlYW5zIGNvdWxkIHBvdGVudGlhbGx5IGJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlCiAgLy8gc3RhdGUgZmllbGQuCiAgYm9vbCBpc1JlYWR5VG9CdWlsZCA9IGZhbHNlOwogIGJvb2wgaXNSZWFkeVRvRmluYWxpemVFeHBvcnRzID0gZmFsc2U7CiAgYm9vbCBpc0J1aWx0ID0gZmFsc2U7CiAgYm9vbCBpc0J1aWx0QW5kTWFya2VkID0gZmFsc2U7CgogIERpbGxMaWJyYXJ5QnVpbGRlcih0aGlzLmxpYnJhcnksIHRoaXMubG9hZGVyKQogICAgICA6IHN1cGVyKGxpYnJhcnkuZmlsZVVyaSwgbmV3IExhenlMaWJyYXJ5U2NvcGUudG9wKCksCiAgICAgICAgICAgIG5ldyBMYXp5TGlicmFyeVNjb3BlLnRvcCgpKSB7CiAgICBMYXp5TGlicmFyeVNjb3BlIGxhenlTY29wZSA9IHNjb3BlOwogICAgbGF6eVNjb3BlLmxpYnJhcnlCdWlsZGVyID0gdGhpczsKICAgIExhenlMaWJyYXJ5U2NvcGUgbGF6eUV4cG9ydFNjb3BlID0gZXhwb3J0U2NvcGU7CiAgICBsYXp5RXhwb3J0U2NvcGUubGlicmFyeUJ1aWxkZXIgPSB0aGlzOwogIH0KCiAgdm9pZCBlbnN1cmVMb2FkZWQoKSB7CiAgICBpZiAoIWlzUmVhZHlUb0J1aWxkKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiTm90IHJlYWR5IHRvIGJ1aWxkLiIpOwogICAgaXNCdWlsdEFuZE1hcmtlZCA9IHRydWU7CiAgICBpZiAoaXNCdWlsdCkgcmV0dXJuOwogICAgaXNCdWlsdCA9IHRydWU7CiAgICBsaWJyYXJ5LmNsYXNzZXMuZm9yRWFjaChhZGRDbGFzcyk7CiAgICBsaWJyYXJ5LnByb2NlZHVyZXMuZm9yRWFjaChhZGRNZW1iZXIpOwogICAgbGlicmFyeS50eXBlZGVmcy5mb3JFYWNoKGFkZFR5cGVkZWYpOwogICAgbGlicmFyeS5maWVsZHMuZm9yRWFjaChhZGRNZW1iZXIpOwoKICAgIGlmIChpc1JlYWR5VG9GaW5hbGl6ZUV4cG9ydHMpIHsKICAgICAgZmluYWxpemVFeHBvcnRzKCk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiTm90IHJlYWR5IHRvIGZpbmFsaXplIGV4cG9ydHMuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1N5bnRoZXRpYyA9PiBsaWJyYXJ5LmlzU3ludGhldGljOwoKICBVcmkgZ2V0IHVyaSA9PiBsaWJyYXJ5LmltcG9ydFVyaTsKCiAgVXJpIGdldCBmaWxlVXJpID0+IGxpYnJhcnkuZmlsZVVyaTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+IGxpYnJhcnkubmFtZTsKCiAgQG92ZXJyaWRlCiAgTGlicmFyeSBnZXQgdGFyZ2V0ID0+IGxpYnJhcnk7CgogIHZvaWQgYWRkU3ludGhldGljRGVjbGFyYXRpb25PZkR5bmFtaWMoKSB7CiAgICBhZGRCdWlsZGVyKAogICAgICAgICJkeW5hbWljIiwgbmV3IER5bmFtaWNUeXBlQnVpbGRlcihjb25zdCBEeW5hbWljVHlwZSgpLCB0aGlzLCAtMSksIC0xKTsKICB9CgogIHZvaWQgYWRkQ2xhc3MoQ2xhc3MgY2xzKSB7CiAgICBEaWxsQ2xhc3NCdWlsZGVyIGNsYXNzQnVsZGVyID0gbmV3IERpbGxDbGFzc0J1aWxkZXIoY2xzLCB0aGlzKTsKICAgIGFkZEJ1aWxkZXIoY2xzLm5hbWUsIGNsYXNzQnVsZGVyLCBjbHMuZmlsZU9mZnNldCk7CiAgICBjbHMucHJvY2VkdXJlcy5mb3JFYWNoKGNsYXNzQnVsZGVyLmFkZE1lbWJlcik7CiAgICBjbHMuY29uc3RydWN0b3JzLmZvckVhY2goY2xhc3NCdWxkZXIuYWRkTWVtYmVyKTsKICAgIGZvciAoRmllbGQgZmllbGQgaW4gY2xzLmZpZWxkcykgewogICAgICBpZiAoZmllbGQubmFtZS5uYW1lID09ICJfcmVkaXJlY3RpbmcjIikgewogICAgICAgIExpc3RMaXRlcmFsIGluaXRpYWxpemVyID0gZmllbGQuaW5pdGlhbGl6ZXI7CiAgICAgICAgZm9yIChTdGF0aWNHZXQgZ2V0IGluIGluaXRpYWxpemVyLmV4cHJlc3Npb25zKSB7CiAgICAgICAgICBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5LnJlc3RvcmVGcm9tRGlsbChnZXQudGFyZ2V0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2xhc3NCdWxkZXIuYWRkTWVtYmVyKGZpZWxkKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBhZGRNZW1iZXIoTWVtYmVyIG1lbWJlcikgewogICAgU3RyaW5nIG5hbWUgPSBtZW1iZXIubmFtZS5uYW1lOwogICAgaWYgKG5hbWUgPT0gIl9leHBvcnRzIyIpIHsKICAgICAgRmllbGQgZmllbGQgPSBtZW1iZXI7CiAgICAgIFN0cmluZ0xpdGVyYWwgc3RyaW5nID0gZmllbGQuaW5pdGlhbGl6ZXI7CiAgICAgIHZhciBqc29uID0ganNvbkRlY29kZShzdHJpbmcudmFsdWUpOwogICAgICB1bnNlcmlhbGl6YWJsZUV4cG9ydHMgPQogICAgICAgICAganNvbiAhPSBudWxsID8gbmV3IE1hcDxTdHJpbmcsIFN0cmluZz4uZnJvbShqc29uKSA6IG51bGw7CiAgICB9IGVsc2UgewogICAgICBhZGRCdWlsZGVyKG5hbWUsIG5ldyBEaWxsTWVtYmVyQnVpbGRlcihtZW1iZXIsIHRoaXMpLCBtZW1iZXIuZmlsZU9mZnNldCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBEZWNsYXJhdGlvbiBhZGRCdWlsZGVyKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGNoYXJPZmZzZXQpIHsKICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5pc0VtcHR5KSByZXR1cm4gbnVsbDsKICAgIGJvb2wgaXNTZXR0ZXIgPSBkZWNsYXJhdGlvbi5pc1NldHRlcjsKICAgIGlmIChpc1NldHRlcikgewogICAgICBzY29wZUJ1aWxkZXIuYWRkU2V0dGVyKG5hbWUsIGRlY2xhcmF0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIHNjb3BlQnVpbGRlci5hZGRNZW1iZXIobmFtZSwgZGVjbGFyYXRpb24pOwogICAgfQogICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgoIl8iKSkgewogICAgICBpZiAoaXNTZXR0ZXIpIHsKICAgICAgICBleHBvcnRTY29wZUJ1aWxkZXIuYWRkU2V0dGVyKG5hbWUsIGRlY2xhcmF0aW9uKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBleHBvcnRTY29wZUJ1aWxkZXIuYWRkTWVtYmVyKG5hbWUsIGRlY2xhcmF0aW9uKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRlY2xhcmF0aW9uOwogIH0KCiAgdm9pZCBhZGRUeXBlZGVmKFR5cGVkZWYgdHlwZWRlZikgewogICAgRGFydFR5cGUgdHlwZSA9IHR5cGVkZWYudHlwZTsKICAgIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZSAmJiB0eXBlLnR5cGVkZWZUeXBlID09IG51bGwpIHsKICAgICAgdW5oYW5kbGVkKCJudWxsIiwgImFkZFR5cGVkZWYiLCB0eXBlZGVmLmZpbGVPZmZzZXQsIHR5cGVkZWYuZmlsZVVyaSk7CiAgICB9CiAgICBhZGRCdWlsZGVyKHR5cGVkZWYubmFtZSwgbmV3IERpbGxUeXBlQWxpYXNCdWlsZGVyKHR5cGVkZWYsIHRoaXMpLAogICAgICAgIHR5cGVkZWYuZmlsZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFRvU2NvcGUoCiAgICAgIFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBtZW1iZXIsIGludCBjaGFyT2Zmc2V0LCBib29sIGlzSW1wb3J0KSB7CiAgICB1bmltcGxlbWVudGVkKCJhZGRUb1Njb3BlIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEZWNsYXJhdGlvbiBjb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb24oCiAgICAgIFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBidWlsZGVyLCBEZWNsYXJhdGlvbiBvdGhlciwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtib29sIGlzRXhwb3J0OiBmYWxzZSwgYm9vbCBpc0ltcG9ydDogZmFsc2V9KSB7CiAgICBpZiAoYnVpbGRlciA9PSBvdGhlcikgcmV0dXJuIGJ1aWxkZXI7CiAgICBpZiAoYnVpbGRlciBpcyBJbnZhbGlkVHlwZUJ1aWxkZXIpIHJldHVybiBidWlsZGVyOwogICAgaWYgKG90aGVyIGlzIEludmFsaWRUeXBlQnVpbGRlcikgcmV0dXJuIG90aGVyOwogICAgLy8gRm9yIGVhY2ggZW50cnkgbWFwcGluZyBrZXkgYGtgIHRvIGRlY2xhcmF0aW9uIGBkYCBpbiBgTlNgIGFuIGVudHJ5CiAgICAvLyBtYXBwaW5nIGBrYCB0byBgZGAgaXMgYWRkZWQgdG8gdGhlIGV4cG9ydGVkIG5hbWVzcGFjZSBvZiBgTGAgdW5sZXNzIGEKICAgIC8vIHRvcC1sZXZlbCBkZWNsYXJhdGlvbiB3aXRoIHRoZSBuYW1lIGBrYCBleGlzdHMgaW4gYExgLgogICAgaWYgKGJ1aWxkZXIucGFyZW50ID09IHRoaXMpIHJldHVybiBidWlsZGVyOwogICAgTWVzc2FnZSBtZXNzYWdlID0gdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24ud2l0aEFyZ3VtZW50cyhuYW1lKTsKICAgIGFkZFByb2JsZW0obWVzc2FnZSwgY2hhck9mZnNldCwgbmFtZS5sZW5ndGgsIGZpbGVVcmkpOwogICAgcmV0dXJuIG5ldyBJbnZhbGlkVHlwZUJ1aWxkZXIoCiAgICAgICAgbmFtZSwgbWVzc2FnZS53aXRoTG9jYXRpb24oZmlsZVVyaSwgY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgewogICAgcmV0dXJuIGxpYnJhcnkubmFtZSA/PyAiPGxpYnJhcnkgJyR7bGlicmFyeS5maWxlVXJpfSc+IjsKICB9CgogIHZvaWQgbWFya0FzUmVhZHlUb0J1aWxkKCkgewogICAgaXNSZWFkeVRvQnVpbGQgPSB0cnVlOwogIH0KCiAgdm9pZCBtYXJrQXNSZWFkeVRvRmluYWxpemVFeHBvcnRzKCkgewogICAgaXNSZWFkeVRvRmluYWxpemVFeHBvcnRzID0gdHJ1ZTsKICB9CgogIHZvaWQgZmluYWxpemVFeHBvcnRzKCkgewogICAgaWYgKGV4cG9ydHNBbHJlYWR5RmluYWxpemVkKSByZXR1cm47CiAgICBleHBvcnRzQWxyZWFkeUZpbmFsaXplZCA9IHRydWU7CiAgICB1bnNlcmlhbGl6YWJsZUV4cG9ydHM/LmZvckVhY2goKFN0cmluZyBuYW1lLCBTdHJpbmcgbWVzc2FnZVRleHQpIHsKICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb247CiAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgIGNhc2UgImR5bmFtaWMiOgogICAgICAgIGNhc2UgInZvaWQiOgogICAgICAgICAgLy8gVE9ETyhhaGUpOiBJdCdzIGxpa2VseSB0aGF0IHdlIHNob3VsZG4ndCBiZSBleHBvcnRpbmcgdGhlc2UgdHlwZXMKICAgICAgICAgIC8vIGZyb20gZGFydDpjb3JlLCBhbmQgdGhpcyBjYXNlIGNhbiBiZSByZW1vdmVkLgogICAgICAgICAgZGVjbGFyYXRpb24gPSBsb2FkZXIuY29yZUxpYnJhcnkuZXhwb3J0U2NvcGVCdWlsZGVyW25hbWVdOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlVGV4dCA9PSBudWxsCiAgICAgICAgICAgICAgPyB0ZW1wbGF0ZVR5cGVOb3RGb3VuZC53aXRoQXJndW1lbnRzKG5hbWUpCiAgICAgICAgICAgICAgOiB0ZW1wbGF0ZVVuc3BlY2lmaWVkLndpdGhBcmd1bWVudHMobWVzc2FnZVRleHQpOwogICAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlLCAtMSwgbm9MZW5ndGgsIG51bGwpOwogICAgICAgICAgZGVjbGFyYXRpb24gPSBuZXcgSW52YWxpZFR5cGVCdWlsZGVyKG5hbWUsIG1lc3NhZ2Uud2l0aG91dExvY2F0aW9uKCkpOwogICAgICB9CiAgICAgIGV4cG9ydFNjb3BlQnVpbGRlci5hZGRNZW1iZXIobmFtZSwgZGVjbGFyYXRpb24pOwogICAgfSk7CgogICAgZm9yICh2YXIgcmVmZXJlbmNlIGluIGxpYnJhcnkuYWRkaXRpb25hbEV4cG9ydHMpIHsKICAgICAgdmFyIG5vZGUgPSByZWZlcmVuY2Uubm9kZTsKICAgICAgVXJpIGxpYnJhcnlVcmk7CiAgICAgIFN0cmluZyBuYW1lOwogICAgICBib29sIGlzU2V0dGVyID0gZmFsc2U7CiAgICAgIGlmIChub2RlIGlzIENsYXNzKSB7CiAgICAgICAgbGlicmFyeVVyaSA9IG5vZGUuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmk7CiAgICAgICAgbmFtZSA9IG5vZGUubmFtZTsKICAgICAgfSBlbHNlIGlmIChub2RlIGlzIFByb2NlZHVyZSkgewogICAgICAgIGxpYnJhcnlVcmkgPSBub2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpOwogICAgICAgIG5hbWUgPSBub2RlLm5hbWUubmFtZTsKICAgICAgICBpc1NldHRlciA9IG5vZGUuaXNTZXR0ZXI7CiAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBNZW1iZXIpIHsKICAgICAgICBsaWJyYXJ5VXJpID0gbm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaTsKICAgICAgICBuYW1lID0gbm9kZS5uYW1lLm5hbWU7CiAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBUeXBlZGVmKSB7CiAgICAgICAgbGlicmFyeVVyaSA9IG5vZGUuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmk7CiAgICAgICAgbmFtZSA9IG5vZGUubmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB1bmhhbmRsZWQoIiR7bm9kZS5ydW50aW1lVHlwZX0iLCAiZmluYWxpemVFeHBvcnRzIiwgLTEsIGZpbGVVcmkpOwogICAgICB9CiAgICAgIERpbGxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gbG9hZGVyLmJ1aWxkZXJzW2xpYnJhcnlVcmldOwogICAgICBpZiAobGlicmFyeSA9PSBudWxsKSB7CiAgICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZVVuc3BlY2lmaWVkLndpdGhBcmd1bWVudHMoIk5vIGJ1aWxkZXIgZm9yICckbGlicmFyeVVyaScuIiksCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICBmaWxlVXJpKTsKICAgICAgfQogICAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKICAgICAgaWYgKGlzU2V0dGVyKSB7CiAgICAgICAgZGVjbGFyYXRpb24gPSBsaWJyYXJ5LmV4cG9ydFNjb3BlLnNldHRlcnNbbmFtZV07CiAgICAgICAgZXhwb3J0U2NvcGVCdWlsZGVyLmFkZFNldHRlcihuYW1lLCBkZWNsYXJhdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVjbGFyYXRpb24gPSBsaWJyYXJ5LmV4cG9ydFNjb3BlLmxvY2FsW25hbWVdOwogICAgICAgIGV4cG9ydFNjb3BlQnVpbGRlci5hZGRNZW1iZXIobmFtZSwgZGVjbGFyYXRpb24pOwogICAgICB9CiAgICAgIGlmIChkZWNsYXJhdGlvbiA9PSBudWxsKSB7CiAgICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZVVuc3BlY2lmaWVkLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAiRXhwb3J0ZWQgZWxlbWVudCAnJG5hbWUnIG5vdCBmb3VuZCBpbiAnJGxpYnJhcnlVcmknLiIpLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgZmlsZVVyaSk7CiAgICAgIH0KICAgICAgYXNzZXJ0KG5vZGUgPT0gZGVjbGFyYXRpb24udGFyZ2V0KTsKICAgIH0KICB9Cn0KgTIATk48ASQBJwEhCQ8SFQ8WERUQExMXEQEdCRESJx4dAUoBJwkVHBwYDwFOATgBOgErAUEBJyUBM0ghTgEzTCkBJ00jGAQBKU0jGgQCATIZARUBKAYxLy0BKAFNEh8pGCEBMDsqKCU0KwQBGEYdGRQnKyonASQZDT4GBAEMLwEkASYBDCMBDCEBLBBPBAEdRDczNSYwNTk+Cg8mCAYEASIkHxwwKx5EDVAGBAEMUTMqFDENMQYhFjkPOQgGGAQBJSI8TAZGHQQBDBNINgQBDCtLNio3M0pNPjBJOyNHBAEMIT0EAR4bBAEoJQQBGykkRx8WGBVPO0URAREwOUAzUQg3CAE3IRYTHRs2GiY2HyIjNh8kNhoPSghAHRlQEBYIHxY5OQ83OQghGS9JEBYIKgYEAgE6cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2RpbGwvZGlsbF9saWJyYXJ5X2J1aWxkZXIuZGFydDpzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvZGlsbC9kaWxsX2xvYWRlci5kYXJ0i2ovLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5kaWxsX2xvYWRlcjsKCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IENsYXNzLCBDb21wb25lbnQsIERhcnRUeXBlLCBMaWJyYXJ5OwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdyBTdW1tYXJ5VGVtcGxhdGUsIFRlbXBsYXRlLCB0ZW1wbGF0ZURpbGxPdXRsaW5lU3VtbWFyeTsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93IENsYXNzQnVpbGRlciwgVHlwZUJ1aWxkZXIsIExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICcuLi9rZXJuZWwvdHlwZV9idWlsZGVyX2NvbXB1dGVyLmRhcnQnIHNob3cgVHlwZUJ1aWxkZXJDb21wdXRlcjsKCmltcG9ydCAnLi4vbG9hZGVyLmRhcnQnIHNob3cgTG9hZGVyOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuaGFuZGxlZDsKCmltcG9ydCAnLi4vdGFyZ2V0X2ltcGxlbWVudGF0aW9uLmRhcnQnIHNob3cgVGFyZ2V0SW1wbGVtZW50YXRpb247CgppbXBvcnQgJ2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgRGlsbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdkaWxsX3RhcmdldC5kYXJ0JyBzaG93IERpbGxUYXJnZXQ7CgpjbGFzcyBEaWxsTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHsKICBEaWxsTG9hZGVyKFRhcmdldEltcGxlbWVudGF0aW9uIHRhcmdldCkgOiBzdXBlcih0YXJnZXQpOwoKICBUZW1wbGF0ZTxTdW1tYXJ5VGVtcGxhdGU+IGdldCBvdXRsaW5lU3VtbWFyeVRlbXBsYXRlID0+CiAgICAgIHRlbXBsYXRlRGlsbE91dGxpbmVTdW1tYXJ5OwoKICAvLy8gQXBwZW5kIGNvbXBpbGVkIGxpYnJhcmllcyBmcm9tIHRoZSBnaXZlbiBbY29tcG9uZW50XS4gSWYgdGhlIFtmaWx0ZXJdIGlzCiAgLy8vIHByb3ZpZGVkLCBhcHBlbmQgb25seSBsaWJyYXJpZXMgd2hvc2UgW1VyaV0gaXMgYWNjZXB0ZWQgYnkgdGhlIFtmaWx0ZXJdLgogIExpc3Q8RGlsbExpYnJhcnlCdWlsZGVyPiBhcHBlbmRMaWJyYXJpZXMoQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAge2Jvb2wgZmlsdGVyKFVyaSB1cmkpLCBpbnQgYnl0ZUNvdW50OiAwfSkgewogICAgTGlzdDxMaWJyYXJ5PiBjb21wb25lbnRMaWJyYXJpZXMgPSBjb21wb25lbnQubGlicmFyaWVzOwogICAgTGlzdDxVcmk+IHJlcXVlc3RlZExpYnJhcmllcyA9IDxVcmk+W107CiAgICBEaWxsVGFyZ2V0IHRhcmdldCA9IHRoaXMudGFyZ2V0OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRMaWJyYXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgTGlicmFyeSBsaWJyYXJ5ID0gY29tcG9uZW50TGlicmFyaWVzW2ldOwogICAgICBVcmkgdXJpID0gbGlicmFyeS5pbXBvcnRVcmk7CiAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIobGlicmFyeS5pbXBvcnRVcmkpKSB7CiAgICAgICAgbGlicmFyaWVzLmFkZChsaWJyYXJ5KTsKICAgICAgICB0YXJnZXQuYWRkTGlicmFyeShsaWJyYXJ5KTsKICAgICAgICByZXF1ZXN0ZWRMaWJyYXJpZXMuYWRkKHVyaSk7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8RGlsbExpYnJhcnlCdWlsZGVyPiByZXN1bHQgPSA8RGlsbExpYnJhcnlCdWlsZGVyPltdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1ZXN0ZWRMaWJyYXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0LmFkZChyZWFkKHJlcXVlc3RlZExpYnJhcmllc1tpXSwgLTEpKTsKICAgIH0KICAgIHRhcmdldC51cmlUb1NvdXJjZS5hZGRBbGwoY29tcG9uZW50LnVyaVRvU291cmNlKTsKICAgIHRoaXMuYnl0ZUNvdW50ICs9IGJ5dGVDb3VudDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBGdXR1cmU8TnVsbD4gYnVpbGRPdXRsaW5lKERpbGxMaWJyYXJ5QnVpbGRlciBidWlsZGVyKSBhc3luYyB7CiAgICBpZiAoYnVpbGRlci5saWJyYXJ5ID09IG51bGwpIHsKICAgICAgdW5oYW5kbGVkKCJudWxsIiwgImJ1aWxkZXIubGlicmFyeSIsIDAsIGJ1aWxkZXIuZmlsZVVyaSk7CiAgICB9CiAgICBidWlsZGVyLm1hcmtBc1JlYWR5VG9CdWlsZCgpOwogIH0KCiAgRnV0dXJlPE51bGw+IGJ1aWxkQm9keShEaWxsTGlicmFyeUJ1aWxkZXIgYnVpbGRlcikgewogICAgcmV0dXJuIGJ1aWxkT3V0bGluZShidWlsZGVyKTsKICB9CgogIHZvaWQgZmluYWxpemVFeHBvcnRzKCkgewogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgYnVpbGRlcikgewogICAgICBEaWxsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGJ1aWxkZXI7CiAgICAgIGxpYnJhcnkubWFya0FzUmVhZHlUb0ZpbmFsaXplRXhwb3J0cygpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0J1aWxkZXIgY29tcHV0ZUNsYXNzQnVpbGRlckZyb21UYXJnZXRDbGFzcyhDbGFzcyBjbHMpIHsKICAgIExpYnJhcnkga2VybmVsTGlicmFyeSA9IGNscy5lbmNsb3NpbmdMaWJyYXJ5OwogICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGJ1aWxkZXJzW2tlcm5lbExpYnJhcnkuaW1wb3J0VXJpXTsKICAgIHJldHVybiBsaWJyYXJ5LmdldExvY2FsTWVtYmVyKGNscy5uYW1lKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVCdWlsZGVyIGNvbXB1dGVUeXBlQnVpbGRlcihEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gdHlwZS5hY2NlcHQobmV3IFR5cGVCdWlsZGVyQ29tcHV0ZXIodGhpcykpOwogIH0KfQpbAE5OPAEbASEBSwEdQAEnNAFIASUBKgFCATwBKwEiOwE6IgFPT0AyPCwlOi8jOSAkJQgGPjozBjYhEwQBQCNABiIEATciBAEbOSwuCAQBDD8yQC0EAQwyNwQCATFwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZGlsbC9kaWxsX2xvYWRlci5kYXJ0InNka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL2Nsb25lLmRhcnTAAFMrLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuY2xvbmU7CgppbXBvcnQgJ2RhcnQ6Y29yZScgaGlkZSBNYXBFbnRyeTsKCmltcG9ydCAnYXN0LmRhcnQnOwppbXBvcnQgJ3R5cGVfYWxnZWJyYS5kYXJ0JzsKCi8vLyBWaXNpdG9yIHRoYXQgcmV0dXJuIGEgY2xvbmUgb2YgYSB0cmVlLCBtYWludGFpbmluZyByZWZlcmVuY2VzIHRvIGNsb25lZAovLy8gb2JqZWN0cy4KLy8vCi8vLyBJdCBpcyBzYWZlIHRvIGNsb25lIG1lbWJlcnMsIGJ1dCBjbG9uaW5nIGEgY2xhc3Mgb3IgbGlicmFyeSBpcyBub3QKLy8vIHN1cHBvcnRlZC4KY2xhc3MgQ2xvbmVWaXNpdG9yIGltcGxlbWVudHMgVHJlZVZpc2l0b3IgewogIGZpbmFsIE1hcDxWYXJpYWJsZURlY2xhcmF0aW9uLCBWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMgPQogICAgICA8VmFyaWFibGVEZWNsYXJhdGlvbiwgVmFyaWFibGVEZWNsYXJhdGlvbj57fTsKICBmaW5hbCBNYXA8TGFiZWxlZFN0YXRlbWVudCwgTGFiZWxlZFN0YXRlbWVudD4gbGFiZWxzID0KICAgICAgPExhYmVsZWRTdGF0ZW1lbnQsIExhYmVsZWRTdGF0ZW1lbnQ+e307CiAgZmluYWwgTWFwPFN3aXRjaENhc2UsIFN3aXRjaENhc2U+IHN3aXRjaENhc2VzID0gPFN3aXRjaENhc2UsIFN3aXRjaENhc2U+e307CiAgZmluYWwgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiB0eXBlU3Vic3RpdHV0aW9uOwogIGZpbmFsIE1hcDxUeXBlUGFyYW1ldGVyLCBUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1zOwogIGJvb2wgY2xvbmVBbm5vdGF0aW9uczsKCiAgLy8vIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsb25pbmcgdmlzaXRvciBmb3IgS2VybmVsIEFTVHMuCiAgLy8vCiAgLy8vIFRoZSBib29sZWFuIHZhbHVlIG9mIFtjbG9uZUFubm90YXRpb25zXSB0ZWxscyBpZiB0aGUgYW5ub3RhdGlvbnMgb24gdGhlCiAgLy8vIG91dGxpbmUgZWxlbWVudHMgaW4gdGhlIHNvdXJjZSBBU1Qgc2hvdWxkIGJlIGNsb25lZCB0byB0aGUgdGFyZ2V0IEFTVC4gVGhlCiAgLy8vIGFubm90YXRpb25zIGluIHByb2NlZHVyZSBib2RpZXMgYXJlIGNsb25lZCB1bmNvbmRpdGlvbmFsbHkuCiAgQ2xvbmVWaXNpdG9yKAogICAgICB7TWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiB0eXBlU3Vic3RpdHV0aW9uLAogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgVHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtcywKICAgICAgdGhpcy5jbG9uZUFubm90YXRpb25zID0gdHJ1ZX0pCiAgICAgIDogdGhpcy50eXBlU3Vic3RpdHV0aW9uID0gZW5zdXJlTXV0YWJsZSh0eXBlU3Vic3RpdHV0aW9uKSwKICAgICAgICB0aGlzLnR5cGVQYXJhbXMgPSB0eXBlUGFyYW1zID8/IDxUeXBlUGFyYW1ldGVyLCBUeXBlUGFyYW1ldGVyPnt9OwoKICBzdGF0aWMgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBlbnN1cmVNdXRhYmxlKAogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IG1hcCkgewogICAgLy8gV2UgbmVlZCB0byBtdXRhdGUgdGhpcyBtYXAsIHNvIG1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgYSBjb25zdGFudCBtYXAuCiAgICBpZiAobWFwID09IG51bGwgfHwgbWFwLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQoKICBUcmVlTm9kZSB2aXNpdExpYnJhcnkoTGlicmFyeSBub2RlKSB7CiAgICB0aHJvdyAnQ2xvbmluZyBvZiBsaWJyYXJpZXMgaXMgbm90IGltcGxlbWVudGVkJzsKICB9CgogIFRyZWVOb2RlIHZpc2l0Q2xhc3MoQ2xhc3Mgbm9kZSkgewogICAgdGhyb3cgJ0Nsb25pbmcgb2YgY2xhc3NlcyBpcyBub3QgaW1wbGVtZW50ZWQnOwogIH0KCiAgLy8gVGhlIGN1cnJlbnRseSBhY3RpdmUgZmlsZSB1cmkgd2hlcmUgd2UgYXJlIGNsb25pbmcgW1RyZWVOb2RlXXMgZnJvbS4gIElmCiAgLy8gdGhpcyBpcyBzZXQgdG8gYG51bGxgIHdlIGNhbm5vdCBjbG9uZSBmaWxlIG9mZnNldHMgdG8gbmV3bHkgY3JlYXRlZCBub2Rlcy4KICAvLyBUaGUgW19jbG9uZUZpbGVPZmZzZXRdIGhlbHBlciBmdW5jdGlvbiB3aWxsIGVuc3VyZSB0aGlzLgogIFVyaSBfYWN0aXZlRmlsZVVyaTsKCiAgLy8gSWYgd2UgZG9uJ3Qga25vdyB0aGUgZmlsZSB1cmkgd2UgYXJlIGNsb25pbmcgZWxlbWVudHMgZnJvbSwgaXQncyBub3Qgc2FmZQogIC8vIHRvIGNsb25lIGZpbGUgb2Zmc2V0cyBlaXRoZXIuCiAgaW50IF9jbG9uZUZpbGVPZmZzZXQoaW50IGZpbGVPZmZzZXQpIHsKICAgIHJldHVybiBfYWN0aXZlRmlsZVVyaSA9PSBudWxsID8gVHJlZU5vZGUubm9PZmZzZXQgOiBmaWxlT2Zmc2V0OwogIH0KCiAgVCBjbG9uZTxUIGV4dGVuZHMgVHJlZU5vZGU+KFQgbm9kZSkgewogICAgZmluYWwgVXJpIGFjdGl2ZUZpbGVVcmlTYXZlZCA9IF9hY3RpdmVGaWxlVXJpOwogICAgaWYgKG5vZGUgaXMgRmlsZVVyaU5vZGUpIF9hY3RpdmVGaWxlVXJpID0gbm9kZS5maWxlVXJpID8/IF9hY3RpdmVGaWxlVXJpOwogICAgZmluYWwgVHJlZU5vZGUgcmVzdWx0ID0gbm9kZS5hY2NlcHQodGhpcykKICAgICAgLi5maWxlT2Zmc2V0ID0gX2Nsb25lRmlsZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgX2FjdGl2ZUZpbGVVcmkgPSBhY3RpdmVGaWxlVXJpU2F2ZWQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgVHJlZU5vZGUgY2xvbmVPcHRpb25hbChUcmVlTm9kZSBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGZpbmFsIFVyaSBhY3RpdmVGaWxlVXJpU2F2ZWQgPSBfYWN0aXZlRmlsZVVyaTsKICAgIGlmIChub2RlIGlzIEZpbGVVcmlOb2RlKSBfYWN0aXZlRmlsZVVyaSA9IG5vZGUuZmlsZVVyaSA/PyBfYWN0aXZlRmlsZVVyaTsKICAgIFRyZWVOb2RlIHJlc3VsdCA9IG5vZGU/LmFjY2VwdCh0aGlzKTsKICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgcmVzdWx0LmZpbGVPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICBfYWN0aXZlRmlsZVVyaSA9IGFjdGl2ZUZpbGVVcmlTYXZlZDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBEYXJ0VHlwZSB2aXNpdFR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIHN1YnN0aXR1dGUodHlwZSwgdHlwZVN1YnN0aXR1dGlvbik7CiAgfQoKICBDb25zdGFudCB2aXNpdENvbnN0YW50KENvbnN0YW50IGNvbnN0YW50KSB7CiAgICByZXR1cm4gY29uc3RhbnQ7CiAgfQoKICBEYXJ0VHlwZSB2aXNpdE9wdGlvbmFsVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gdHlwZSA9PSBudWxsID8gbnVsbCA6IHN1YnN0aXR1dGUodHlwZSwgdHlwZVN1YnN0aXR1dGlvbik7CiAgfQoKICB2aXNpdEludmFsaWRFeHByZXNzaW9uKEludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgSW52YWxpZEV4cHJlc3Npb24obm9kZS5tZXNzYWdlKTsKICB9CgogIHZpc2l0VmFyaWFibGVHZXQoVmFyaWFibGVHZXQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBWYXJpYWJsZUdldCgKICAgICAgICB2YXJpYWJsZXNbbm9kZS52YXJpYWJsZV0sIHZpc2l0T3B0aW9uYWxUeXBlKG5vZGUucHJvbW90ZWRUeXBlKSk7CiAgfQoKICB2aXNpdFZhcmlhYmxlU2V0KFZhcmlhYmxlU2V0IG5vZGUpIHsKICAgIHJldHVybiBuZXcgVmFyaWFibGVTZXQodmFyaWFibGVzW25vZGUudmFyaWFibGVdLCBjbG9uZShub2RlLnZhbHVlKSk7CiAgfQoKICB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHJldHVybiBuZXcgUHJvcGVydHlHZXQuYnlSZWZlcmVuY2UoCiAgICAgICAgY2xvbmUobm9kZS5yZWNlaXZlciksIG5vZGUubmFtZSwgbm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgdmlzaXRQcm9wZXJ0eVNldChQcm9wZXJ0eVNldCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFByb3BlcnR5U2V0LmJ5UmVmZXJlbmNlKGNsb25lKG5vZGUucmVjZWl2ZXIpLCBub2RlLm5hbWUsCiAgICAgICAgY2xvbmUobm9kZS52YWx1ZSksIG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBEaXJlY3RQcm9wZXJ0eUdldC5ieVJlZmVyZW5jZSgKICAgICAgICBjbG9uZShub2RlLnJlY2VpdmVyKSwgbm9kZS50YXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBub2RlKSB7CiAgICByZXR1cm4gbmV3IERpcmVjdFByb3BlcnR5U2V0LmJ5UmVmZXJlbmNlKAogICAgICAgIGNsb25lKG5vZGUucmVjZWl2ZXIpLCBub2RlLnRhcmdldFJlZmVyZW5jZSwgY2xvbmUobm9kZS52YWx1ZSkpOwogIH0KCiAgdmlzaXRTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdXBlclByb3BlcnR5R2V0LmJ5UmVmZXJlbmNlKAogICAgICAgIG5vZGUubmFtZSwgbm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgdmlzaXRTdXBlclByb3BlcnR5U2V0KFN1cGVyUHJvcGVydHlTZXQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdXBlclByb3BlcnR5U2V0LmJ5UmVmZXJlbmNlKAogICAgICAgIG5vZGUubmFtZSwgY2xvbmUobm9kZS52YWx1ZSksIG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFN0YXRpY0dldC5ieVJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICB2aXNpdFN0YXRpY1NldChTdGF0aWNTZXQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdGF0aWNTZXQuYnlSZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UsIGNsb25lKG5vZGUudmFsdWUpKTsKICB9CgogIHZpc2l0TWV0aG9kSW52b2NhdGlvbihNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTWV0aG9kSW52b2NhdGlvbi5ieVJlZmVyZW5jZShjbG9uZShub2RlLnJlY2VpdmVyKSwgbm9kZS5uYW1lLAogICAgICAgIGNsb25lKG5vZGUuYXJndW1lbnRzKSwgbm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKERpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBEaXJlY3RNZXRob2RJbnZvY2F0aW9uLmJ5UmVmZXJlbmNlKAogICAgICAgIGNsb25lKG5vZGUucmVjZWl2ZXIpLCBub2RlLnRhcmdldFJlZmVyZW5jZSwgY2xvbmUobm9kZS5hcmd1bWVudHMpKTsKICB9CgogIHZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IFN1cGVyTWV0aG9kSW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgICBub2RlLm5hbWUsIGNsb25lKG5vZGUuYXJndW1lbnRzKSwgbm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdGF0aWNJbnZvY2F0aW9uLmJ5UmVmZXJlbmNlKAogICAgICAgIG5vZGUudGFyZ2V0UmVmZXJlbmNlLCBjbG9uZShub2RlLmFyZ3VtZW50cyksCiAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICB9CgogIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgICBub2RlLnRhcmdldFJlZmVyZW5jZSwgY2xvbmUobm9kZS5hcmd1bWVudHMpLAogICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgfQoKICB2aXNpdE5vdChOb3Qgbm9kZSkgewogICAgcmV0dXJuIG5ldyBOb3QoY2xvbmUobm9kZS5vcGVyYW5kKSk7CiAgfQoKICB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKExvZ2ljYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTG9naWNhbEV4cHJlc3Npb24oCiAgICAgICAgY2xvbmUobm9kZS5sZWZ0KSwgbm9kZS5vcGVyYXRvciwgY2xvbmUobm9kZS5yaWdodCkpOwogIH0KCiAgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgQ29uZGl0aW9uYWxFeHByZXNzaW9uKGNsb25lKG5vZGUuY29uZGl0aW9uKSwgY2xvbmUobm9kZS50aGVuKSwKICAgICAgICBjbG9uZShub2RlLm90aGVyd2lzZSksIHZpc2l0T3B0aW9uYWxUeXBlKG5vZGUuc3RhdGljVHlwZSkpOwogIH0KCiAgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKG5vZGUuZXhwcmVzc2lvbnMubWFwKGNsb25lKS50b0xpc3QoKSk7CiAgfQoKICB2aXNpdExpc3RDb25jYXRlbmF0aW9uKExpc3RDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTGlzdENvbmNhdGVuYXRpb24obm9kZS5saXN0cy5tYXAoY2xvbmUpLnRvTGlzdCgpLAogICAgICAgIHR5cGVBcmd1bWVudDogdmlzaXRUeXBlKG5vZGUudHlwZUFyZ3VtZW50KSk7CiAgfQoKICB2aXNpdFNldENvbmNhdGVuYXRpb24oU2V0Q29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IFNldENvbmNhdGVuYXRpb24obm9kZS5zZXRzLm1hcChjbG9uZSkudG9MaXN0KCksCiAgICAgICAgdHlwZUFyZ3VtZW50OiB2aXNpdFR5cGUobm9kZS50eXBlQXJndW1lbnQpKTsKICB9CgogIHZpc2l0TWFwQ29uY2F0ZW5hdGlvbihNYXBDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTWFwQ29uY2F0ZW5hdGlvbihub2RlLm1hcHMubWFwKGNsb25lKS50b0xpc3QoKSwKICAgICAgICBrZXlUeXBlOiB2aXNpdFR5cGUobm9kZS5rZXlUeXBlKSwgdmFsdWVUeXBlOiB2aXNpdFR5cGUobm9kZS52YWx1ZVR5cGUpKTsKICB9CgogIHZpc2l0SW5zdGFuY2VDcmVhdGlvbihJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKICAgIGZpbmFsIE1hcDxSZWZlcmVuY2UsIEV4cHJlc3Npb24+IGZpZWxkVmFsdWVzID0gPFJlZmVyZW5jZSwgRXhwcmVzc2lvbj57fTsKICAgIG5vZGUuZmllbGRWYWx1ZXMuZm9yRWFjaCgoUmVmZXJlbmNlIGZpZWxkUmVmLCBFeHByZXNzaW9uIHZhbHVlKSB7CiAgICAgIGZpZWxkVmFsdWVzW2ZpZWxkUmVmXSA9IGNsb25lKHZhbHVlKTsKICAgIH0pOwogICAgcmV0dXJuIG5ldyBJbnN0YW5jZUNyZWF0aW9uKAogICAgICAgIG5vZGUuY2xhc3NSZWZlcmVuY2UsCiAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzLm1hcCh2aXNpdFR5cGUpLnRvTGlzdCgpLAogICAgICAgIGZpZWxkVmFsdWVzLAogICAgICAgIG5vZGUuYXNzZXJ0cy5tYXAoY2xvbmUpLnRvTGlzdCgpLAogICAgICAgIG5vZGUudW51c2VkQXJndW1lbnRzLm1hcChjbG9uZSkudG9MaXN0KCkpOwogIH0KCiAgdmlzaXRJc0V4cHJlc3Npb24oSXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgSXNFeHByZXNzaW9uKGNsb25lKG5vZGUub3BlcmFuZCksIHZpc2l0VHlwZShub2RlLnR5cGUpKTsKICB9CgogIHZpc2l0QXNFeHByZXNzaW9uKEFzRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IEFzRXhwcmVzc2lvbihjbG9uZShub2RlLm9wZXJhbmQpLCB2aXNpdFR5cGUobm9kZS50eXBlKSkKICAgICAgLi5mbGFncyA9IG5vZGUuZmxhZ3M7CiAgfQoKICB2aXNpdFN5bWJvbExpdGVyYWwoU3ltYm9sTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFN5bWJvbExpdGVyYWwobm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBuZXcgVHlwZUxpdGVyYWwodmlzaXRUeXBlKG5vZGUudHlwZSkpOwogIH0KCiAgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IFRoaXNFeHByZXNzaW9uKCk7CiAgfQoKICB2aXNpdFJldGhyb3coUmV0aHJvdyBub2RlKSB7CiAgICByZXR1cm4gbmV3IFJldGhyb3coKTsKICB9CgogIHZpc2l0VGhyb3coVGhyb3cgbm9kZSkgewogICAgcmV0dXJuIG5ldyBUaHJvdyhjbG9uZU9wdGlvbmFsKG5vZGUuZXhwcmVzc2lvbikpOwogIH0KCiAgdmlzaXRMaXN0TGl0ZXJhbChMaXN0TGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gbmV3IExpc3RMaXRlcmFsKG5vZGUuZXhwcmVzc2lvbnMubWFwKGNsb25lKS50b0xpc3QoKSwKICAgICAgICB0eXBlQXJndW1lbnQ6IHZpc2l0VHlwZShub2RlLnR5cGVBcmd1bWVudCksIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgfQoKICB2aXNpdFNldExpdGVyYWwoU2V0TGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFNldExpdGVyYWwobm9kZS5leHByZXNzaW9ucy5tYXAoY2xvbmUpLnRvTGlzdCgpLAogICAgICAgIHR5cGVBcmd1bWVudDogdmlzaXRUeXBlKG5vZGUudHlwZUFyZ3VtZW50KSwgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICB9CgogIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTWFwTGl0ZXJhbChub2RlLmVudHJpZXMubWFwKGNsb25lKS50b0xpc3QoKSwKICAgICAgICBrZXlUeXBlOiB2aXNpdFR5cGUobm9kZS5rZXlUeXBlKSwKICAgICAgICB2YWx1ZVR5cGU6IHZpc2l0VHlwZShub2RlLnZhbHVlVHlwZSksCiAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICB9CgogIHZpc2l0TWFwRW50cnkoTWFwRW50cnkgbm9kZSkgewogICAgcmV0dXJuIG5ldyBNYXBFbnRyeShjbG9uZShub2RlLmtleSksIGNsb25lKG5vZGUudmFsdWUpKTsKICB9CgogIHZpc2l0QXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IEF3YWl0RXhwcmVzc2lvbihjbG9uZShub2RlLm9wZXJhbmQpKTsKICB9CgogIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKEZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uRXhwcmVzc2lvbihjbG9uZShub2RlLmZ1bmN0aW9uKSk7CiAgfQoKICB2aXNpdENvbnN0YW50RXhwcmVzc2lvbihDb25zdGFudEV4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBDb25zdGFudEV4cHJlc3Npb24oCiAgICAgICAgdmlzaXRDb25zdGFudChub2RlLmNvbnN0YW50KSwgdmlzaXRUeXBlKG5vZGUudHlwZSkpOwogIH0KCiAgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdHJpbmdMaXRlcmFsKG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXRJbnRMaXRlcmFsKEludExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBJbnRMaXRlcmFsKG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXREb3VibGVMaXRlcmFsKERvdWJsZUxpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBEb3VibGVMaXRlcmFsKG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXRCb29sTGl0ZXJhbChCb29sTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gbmV3IEJvb2xMaXRlcmFsKG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXROdWxsTGl0ZXJhbChOdWxsTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gbmV3IE51bGxMaXRlcmFsKCk7CiAgfQoKICB2aXNpdExldChMZXQgbm9kZSkgewogICAgdmFyIG5ld1ZhcmlhYmxlID0gY2xvbmUobm9kZS52YXJpYWJsZSk7CiAgICByZXR1cm4gbmV3IExldChuZXdWYXJpYWJsZSwgY2xvbmUobm9kZS5ib2R5KSk7CiAgfQoKICB2aXNpdEJsb2NrRXhwcmVzc2lvbihCbG9ja0V4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBCbG9ja0V4cHJlc3Npb24oY2xvbmUobm9kZS5ib2R5KSwgY2xvbmUobm9kZS52YWx1ZSkpOwogIH0KCiAgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KGNsb25lKG5vZGUuZXhwcmVzc2lvbikpOwogIH0KCiAgdmlzaXRCbG9jayhCbG9jayBub2RlKSB7CiAgICByZXR1cm4gbmV3IEJsb2NrKG5vZGUuc3RhdGVtZW50cy5tYXAoY2xvbmUpLnRvTGlzdCgpKTsKICB9CgogIHZpc2l0QXNzZXJ0QmxvY2soQXNzZXJ0QmxvY2sgbm9kZSkgewogICAgcmV0dXJuIG5ldyBBc3NlcnRCbG9jayhub2RlLnN0YXRlbWVudHMubWFwKGNsb25lKS50b0xpc3QoKSk7CiAgfQoKICB2aXNpdEVtcHR5U3RhdGVtZW50KEVtcHR5U3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBuZXcgRW1wdHlTdGF0ZW1lbnQoKTsKICB9CgogIHZpc2l0QXNzZXJ0U3RhdGVtZW50KEFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gbmV3IEFzc2VydFN0YXRlbWVudChjbG9uZShub2RlLmNvbmRpdGlvbiksCiAgICAgICAgY29uZGl0aW9uU3RhcnRPZmZzZXQ6IG5vZGUuY29uZGl0aW9uU3RhcnRPZmZzZXQsCiAgICAgICAgY29uZGl0aW9uRW5kT2Zmc2V0OiBub2RlLmNvbmRpdGlvbkVuZE9mZnNldCwKICAgICAgICBtZXNzYWdlOiBjbG9uZU9wdGlvbmFsKG5vZGUubWVzc2FnZSkpOwogIH0KCiAgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgTGFiZWxlZFN0YXRlbWVudCBuZXdOb2RlID0gbmV3IExhYmVsZWRTdGF0ZW1lbnQobnVsbCk7CiAgICBsYWJlbHNbbm9kZV0gPSBuZXdOb2RlOwogICAgbmV3Tm9kZS5ib2R5ID0gY2xvbmUobm9kZS5ib2R5KS4ucGFyZW50ID0gbmV3Tm9kZTsKICAgIHJldHVybiBuZXdOb2RlOwogIH0KCiAgdmlzaXRCcmVha1N0YXRlbWVudChCcmVha1N0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gbmV3IEJyZWFrU3RhdGVtZW50KGxhYmVsc1tub2RlLnRhcmdldF0pOwogIH0KCiAgdmlzaXRXaGlsZVN0YXRlbWVudChXaGlsZVN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFdoaWxlU3RhdGVtZW50KGNsb25lKG5vZGUuY29uZGl0aW9uKSwgY2xvbmUobm9kZS5ib2R5KSk7CiAgfQoKICB2aXNpdERvU3RhdGVtZW50KERvU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBuZXcgRG9TdGF0ZW1lbnQoY2xvbmUobm9kZS5ib2R5KSwgY2xvbmUobm9kZS5jb25kaXRpb24pKTsKICB9CgogIHZpc2l0Rm9yU3RhdGVtZW50KEZvclN0YXRlbWVudCBub2RlKSB7CiAgICB2YXIgdmFyaWFibGVzID0gbm9kZS52YXJpYWJsZXMubWFwKGNsb25lKS50b0xpc3QoKTsKICAgIHJldHVybiBuZXcgRm9yU3RhdGVtZW50KHZhcmlhYmxlcywgY2xvbmVPcHRpb25hbChub2RlLmNvbmRpdGlvbiksCiAgICAgICAgbm9kZS51cGRhdGVzLm1hcChjbG9uZSkudG9MaXN0KCksIGNsb25lKG5vZGUuYm9keSkpOwogIH0KCiAgdmlzaXRGb3JJblN0YXRlbWVudChGb3JJblN0YXRlbWVudCBub2RlKSB7CiAgICB2YXIgbmV3VmFyaWFibGUgPSBjbG9uZShub2RlLnZhcmlhYmxlKTsKICAgIHJldHVybiBuZXcgRm9ySW5TdGF0ZW1lbnQoCiAgICAgICAgbmV3VmFyaWFibGUsIGNsb25lKG5vZGUuaXRlcmFibGUpLCBjbG9uZShub2RlLmJvZHkpLAogICAgICAgIGlzQXN5bmM6IG5vZGUuaXNBc3luYyk7CiAgfQoKICB2aXNpdFN3aXRjaFN0YXRlbWVudChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgZm9yIChTd2l0Y2hDYXNlIHN3aXRjaENhc2UgaW4gbm9kZS5jYXNlcykgewogICAgICBzd2l0Y2hDYXNlc1tzd2l0Y2hDYXNlXSA9IG5ldyBTd2l0Y2hDYXNlKAogICAgICAgICAgc3dpdGNoQ2FzZS5leHByZXNzaW9ucy5tYXAoY2xvbmUpLnRvTGlzdCgpLAogICAgICAgICAgbmV3IExpc3Q8aW50Pi5mcm9tKHN3aXRjaENhc2UuZXhwcmVzc2lvbk9mZnNldHMpLAogICAgICAgICAgbnVsbCwKICAgICAgICAgIGlzRGVmYXVsdDogc3dpdGNoQ2FzZS5pc0RlZmF1bHQpOwogICAgfQogICAgcmV0dXJuIG5ldyBTd2l0Y2hTdGF0ZW1lbnQoCiAgICAgICAgY2xvbmUobm9kZS5leHByZXNzaW9uKSwgbm9kZS5jYXNlcy5tYXAoY2xvbmUpLnRvTGlzdCgpKTsKICB9CgogIHZpc2l0U3dpdGNoQ2FzZShTd2l0Y2hDYXNlIG5vZGUpIHsKICAgIHZhciBzd2l0Y2hDYXNlID0gc3dpdGNoQ2FzZXNbbm9kZV07CiAgICBzd2l0Y2hDYXNlLmJvZHkgPSBjbG9uZShub2RlLmJvZHkpLi5wYXJlbnQgPSBzd2l0Y2hDYXNlOwogICAgcmV0dXJuIHN3aXRjaENhc2U7CiAgfQoKICB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KENvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBuZXcgQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQoc3dpdGNoQ2FzZXNbbm9kZS50YXJnZXRdKTsKICB9CgogIHZpc2l0SWZTdGF0ZW1lbnQoSWZTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBJZlN0YXRlbWVudCgKICAgICAgICBjbG9uZShub2RlLmNvbmRpdGlvbiksIGNsb25lKG5vZGUudGhlbiksIGNsb25lT3B0aW9uYWwobm9kZS5vdGhlcndpc2UpKTsKICB9CgogIHZpc2l0UmV0dXJuU3RhdGVtZW50KFJldHVyblN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFJldHVyblN0YXRlbWVudChjbG9uZU9wdGlvbmFsKG5vZGUuZXhwcmVzc2lvbikpOwogIH0KCiAgdmlzaXRUcnlDYXRjaChUcnlDYXRjaCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFRyeUNhdGNoKGNsb25lKG5vZGUuYm9keSksIG5vZGUuY2F0Y2hlcy5tYXAoY2xvbmUpLnRvTGlzdCgpLAogICAgICAgIGlzU3ludGhldGljOiBub2RlLmlzU3ludGhldGljKTsKICB9CgogIHZpc2l0Q2F0Y2goQ2F0Y2ggbm9kZSkgewogICAgdmFyIG5ld0V4Y2VwdGlvbiA9IGNsb25lT3B0aW9uYWwobm9kZS5leGNlcHRpb24pOwogICAgdmFyIG5ld1N0YWNrVHJhY2UgPSBjbG9uZU9wdGlvbmFsKG5vZGUuc3RhY2tUcmFjZSk7CiAgICByZXR1cm4gbmV3IENhdGNoKG5ld0V4Y2VwdGlvbiwgY2xvbmUobm9kZS5ib2R5KSwKICAgICAgICBzdGFja1RyYWNlOiBuZXdTdGFja1RyYWNlLCBndWFyZDogdmlzaXRUeXBlKG5vZGUuZ3VhcmQpKTsKICB9CgogIHZpc2l0VHJ5RmluYWxseShUcnlGaW5hbGx5IG5vZGUpIHsKICAgIHJldHVybiBuZXcgVHJ5RmluYWxseShjbG9uZShub2RlLmJvZHkpLCBjbG9uZShub2RlLmZpbmFsaXplcikpOwogIH0KCiAgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFlpZWxkU3RhdGVtZW50KGNsb25lKG5vZGUuZXhwcmVzc2lvbikpLi5mbGFncyA9IG5vZGUuZmxhZ3M7CiAgfQoKICB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gdmFyaWFibGVzW25vZGVdID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS5uYW1lLAogICAgICAgIGluaXRpYWxpemVyOiBjbG9uZU9wdGlvbmFsKG5vZGUuaW5pdGlhbGl6ZXIpLAogICAgICAgIHR5cGU6IHZpc2l0VHlwZShub2RlLnR5cGUpKQogICAgICAuLmFubm90YXRpb25zID0gY2xvbmVBbm5vdGF0aW9ucyAmJiAhbm9kZS5hbm5vdGF0aW9ucy5pc0VtcHR5CiAgICAgICAgICA/IG5vZGUuYW5ub3RhdGlvbnMubWFwKGNsb25lKS50b0xpc3QoKQogICAgICAgICAgOiBjb25zdCA8RXhwcmVzc2lvbj5bXQogICAgICAuLmZsYWdzID0gbm9kZS5mbGFncwogICAgICAuLmZpbGVFcXVhbHNPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuZmlsZUVxdWFsc09mZnNldCk7CiAgfQoKICB2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24oRnVuY3Rpb25EZWNsYXJhdGlvbiBub2RlKSB7CiAgICB2YXIgbmV3VmFyaWFibGUgPSBjbG9uZShub2RlLnZhcmlhYmxlKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25EZWNsYXJhdGlvbihuZXdWYXJpYWJsZSwgY2xvbmUobm9kZS5mdW5jdGlvbikpOwogIH0KCiAgLy8gTWVtYmVycwogIHZpc2l0Q29uc3RydWN0b3IoQ29uc3RydWN0b3Igbm9kZSkgewogICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihjbG9uZShub2RlLmZ1bmN0aW9uKSwKICAgICAgICBuYW1lOiBub2RlLm5hbWUsCiAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0LAogICAgICAgIGlzRXh0ZXJuYWw6IG5vZGUuaXNFeHRlcm5hbCwKICAgICAgICBpc1N5bnRoZXRpYzogbm9kZS5pc1N5bnRoZXRpYywKICAgICAgICBpbml0aWFsaXplcnM6IG5vZGUuaW5pdGlhbGl6ZXJzLm1hcChjbG9uZSkudG9MaXN0KCksCiAgICAgICAgdHJhbnNmb3JtZXJGbGFnczogbm9kZS50cmFuc2Zvcm1lckZsYWdzLAogICAgICAgIGZpbGVVcmk6IF9hY3RpdmVGaWxlVXJpKQogICAgICAuLmFubm90YXRpb25zID0gY2xvbmVBbm5vdGF0aW9ucyAmJiAhbm9kZS5hbm5vdGF0aW9ucy5pc0VtcHR5CiAgICAgICAgICA/IG5vZGUuYW5ub3RhdGlvbnMubWFwKGNsb25lKS50b0xpc3QoKQogICAgICAgICAgOiBjb25zdCA8RXhwcmVzc2lvbj5bXQogICAgICAuLmZpbGVPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCkKICAgICAgLi5maWxlRW5kT2Zmc2V0ID0gX2Nsb25lRmlsZU9mZnNldChub2RlLmZpbGVFbmRPZmZzZXQpOwogIH0KCiAgdmlzaXRQcm9jZWR1cmUoUHJvY2VkdXJlIG5vZGUpIHsKICAgIHJldHVybiBuZXcgUHJvY2VkdXJlKG5vZGUubmFtZSwgbm9kZS5raW5kLCBjbG9uZShub2RlLmZ1bmN0aW9uKSwKICAgICAgICB0cmFuc2Zvcm1lckZsYWdzOiBub2RlLnRyYW5zZm9ybWVyRmxhZ3MsCiAgICAgICAgZmlsZVVyaTogX2FjdGl2ZUZpbGVVcmksCiAgICAgICAgZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldDogbm9kZS5mb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0LAogICAgICAgIGZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0OiBub2RlLmZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0KQogICAgICAuLmFubm90YXRpb25zID0gY2xvbmVBbm5vdGF0aW9ucyAmJiAhbm9kZS5hbm5vdGF0aW9ucy5pc0VtcHR5CiAgICAgICAgICA/IG5vZGUuYW5ub3RhdGlvbnMubWFwKGNsb25lKS50b0xpc3QoKQogICAgICAgICAgOiBjb25zdCA8RXhwcmVzc2lvbj5bXQogICAgICAuLnN0YXJ0RmlsZU9mZnNldCA9IF9jbG9uZUZpbGVPZmZzZXQobm9kZS5zdGFydEZpbGVPZmZzZXQpCiAgICAgIC4uZmlsZU9mZnNldCA9IF9jbG9uZUZpbGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KQogICAgICAuLmZpbGVFbmRPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuZmlsZUVuZE9mZnNldCkKICAgICAgLi5mbGFncyA9IG5vZGUuZmxhZ3M7CiAgfQoKICB2aXNpdEZpZWxkKEZpZWxkIG5vZGUpIHsKICAgIHJldHVybiBuZXcgRmllbGQobm9kZS5uYW1lLAogICAgICAgIHR5cGU6IHZpc2l0VHlwZShub2RlLnR5cGUpLAogICAgICAgIGluaXRpYWxpemVyOiBjbG9uZU9wdGlvbmFsKG5vZGUuaW5pdGlhbGl6ZXIpLAogICAgICAgIGlzQ292YXJpYW50OiBub2RlLmlzQ292YXJpYW50LAogICAgICAgIGlzRmluYWw6IG5vZGUuaXNGaW5hbCwKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QsCiAgICAgICAgaXNTdGF0aWM6IG5vZGUuaXNTdGF0aWMsCiAgICAgICAgaGFzSW1wbGljaXRHZXR0ZXI6IG5vZGUuaGFzSW1wbGljaXRHZXR0ZXIsCiAgICAgICAgaGFzSW1wbGljaXRTZXR0ZXI6IG5vZGUuaGFzSW1wbGljaXRTZXR0ZXIsCiAgICAgICAgdHJhbnNmb3JtZXJGbGFnczogbm9kZS50cmFuc2Zvcm1lckZsYWdzLAogICAgICAgIGZpbGVVcmk6IF9hY3RpdmVGaWxlVXJpKQogICAgICAuLmFubm90YXRpb25zID0gY2xvbmVBbm5vdGF0aW9ucyAmJiAhbm9kZS5hbm5vdGF0aW9ucy5pc0VtcHR5CiAgICAgICAgICA/IG5vZGUuYW5ub3RhdGlvbnMubWFwKGNsb25lKS50b0xpc3QoKQogICAgICAgICAgOiBjb25zdCA8RXhwcmVzc2lvbj5bXQogICAgICAuLmZpbGVPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCkKICAgICAgLi5maWxlRW5kT2Zmc2V0ID0gX2Nsb25lRmlsZU9mZnNldChub2RlLmZpbGVFbmRPZmZzZXQpCiAgICAgIC4uZmxhZ3MgPSBub2RlLmZsYWdzOwogIH0KCiAgdmlzaXRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcihSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciBub2RlKSB7CiAgICByZXR1cm4gbmV3IFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKG5vZGUudGFyZ2V0UmVmZXJlbmNlLAogICAgICAgIG5hbWU6IG5vZGUubmFtZSwKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QsCiAgICAgICAgaXNFeHRlcm5hbDogbm9kZS5pc0V4dGVybmFsLAogICAgICAgIHRyYW5zZm9ybWVyRmxhZ3M6IG5vZGUudHJhbnNmb3JtZXJGbGFncywKICAgICAgICB0eXBlQXJndW1lbnRzOiBub2RlLnR5cGVBcmd1bWVudHMubWFwKHZpc2l0VHlwZSkudG9MaXN0KCksCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IG5vZGUudHlwZVBhcmFtZXRlcnMubWFwKGNsb25lKS50b0xpc3QoKSwKICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5tYXAoY2xvbmUpLnRvTGlzdCgpLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbm9kZS5uYW1lZFBhcmFtZXRlcnMubWFwKGNsb25lKS50b0xpc3QoKSwKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgZmlsZVVyaTogX2FjdGl2ZUZpbGVVcmkpCiAgICAgIC4uYW5ub3RhdGlvbnMgPSBjbG9uZUFubm90YXRpb25zICYmICFub2RlLmFubm90YXRpb25zLmlzRW1wdHkKICAgICAgICAgID8gbm9kZS5hbm5vdGF0aW9ucy5tYXAoY2xvbmUpLnRvTGlzdCgpCiAgICAgICAgICA6IGNvbnN0IDxFeHByZXNzaW9uPltdOwogIH0KCiAgdmlzaXRUeXBlUGFyYW1ldGVyKFR5cGVQYXJhbWV0ZXIgbm9kZSkgewogICAgVHlwZVBhcmFtZXRlciBuZXdOb2RlID0gdHlwZVBhcmFtc1tub2RlXTsKICAgIGlmIChuZXdOb2RlID09IG51bGwpIHsKICAgICAgbmV3Tm9kZSA9IG5ldyBUeXBlUGFyYW1ldGVyKG5vZGUubmFtZSk7CiAgICAgIHR5cGVTdWJzdGl0dXRpb25bbm9kZV0gPSBuZXcgVHlwZVBhcmFtZXRlclR5cGUobmV3Tm9kZSk7CiAgICB9CiAgICBuZXdOb2RlLmJvdW5kID0gdmlzaXRUeXBlKG5vZGUuYm91bmQpOwogICAgaWYgKG5vZGUuZGVmYXVsdFR5cGUgIT0gbnVsbCkgewogICAgICBuZXdOb2RlLmRlZmF1bHRUeXBlID0gdmlzaXRUeXBlKG5vZGUuZGVmYXVsdFR5cGUpOwogICAgfQogICAgcmV0dXJuIG5ld05vZGUKICAgICAgLi5hbm5vdGF0aW9ucyA9IGNsb25lQW5ub3RhdGlvbnMgJiYgIW5vZGUuYW5ub3RhdGlvbnMuaXNFbXB0eQogICAgICAgICAgPyBub2RlLmFubm90YXRpb25zLm1hcChjbG9uZSkudG9MaXN0KCkKICAgICAgICAgIDogY29uc3QgPEV4cHJlc3Npb24+W10KICAgICAgLi5mbGFncyA9IG5vZGUuZmxhZ3M7CiAgfQoKICBUcmVlTm9kZSBjbG9uZUZ1bmN0aW9uTm9kZUJvZHkoRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICAgIGJvb2wgc2F2ZWRDbG9uZUFubm90YXRpb25zID0gdGhpcy5jbG9uZUFubm90YXRpb25zOwogICAgdHJ5IHsKICAgICAgdGhpcy5jbG9uZUFubm90YXRpb25zID0gdHJ1ZTsKICAgICAgcmV0dXJuIGNsb25lT3B0aW9uYWwobm9kZS5ib2R5KTsKICAgIH0gZmluYWxseSB7CiAgICAgIHRoaXMuY2xvbmVBbm5vdGF0aW9ucyA9IHNhdmVkQ2xvbmVBbm5vdGF0aW9uczsKICAgIH0KICB9CgogIHZpc2l0RnVuY3Rpb25Ob2RlKEZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICB2YXIgdHlwZVBhcmFtZXRlcnMgPSBub2RlLnR5cGVQYXJhbWV0ZXJzLm1hcChjbG9uZSkudG9MaXN0KCk7CiAgICB2YXIgcG9zaXRpb25hbCA9IG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMubWFwKGNsb25lKS50b0xpc3QoKTsKICAgIHZhciBuYW1lZCA9IG5vZGUubmFtZWRQYXJhbWV0ZXJzLm1hcChjbG9uZSkudG9MaXN0KCk7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uTm9kZShjbG9uZUZ1bmN0aW9uTm9kZUJvZHkobm9kZSksCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzOiBwb3NpdGlvbmFsLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWQsCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogbm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIHJldHVyblR5cGU6IHZpc2l0VHlwZShub2RlLnJldHVyblR5cGUpLAogICAgICAgIGFzeW5jTWFya2VyOiBub2RlLmFzeW5jTWFya2VyLAogICAgICAgIGRhcnRBc3luY01hcmtlcjogbm9kZS5kYXJ0QXN5bmNNYXJrZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IF9jbG9uZUZpbGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KQogICAgICAuLmZpbGVFbmRPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuZmlsZUVuZE9mZnNldCk7CiAgfQoKICB2aXNpdEFyZ3VtZW50cyhBcmd1bWVudHMgbm9kZSkgewogICAgcmV0dXJuIG5ldyBBcmd1bWVudHMobm9kZS5wb3NpdGlvbmFsLm1hcChjbG9uZSkudG9MaXN0KCksCiAgICAgICAgdHlwZXM6IG5vZGUudHlwZXMubWFwKHZpc2l0VHlwZSkudG9MaXN0KCksCiAgICAgICAgbmFtZWQ6IG5vZGUubmFtZWQubWFwKGNsb25lKS50b0xpc3QoKSk7CiAgfQoKICB2aXNpdE5hbWVkRXhwcmVzc2lvbihOYW1lZEV4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBOYW1lZEV4cHJlc3Npb24obm9kZS5uYW1lLCBjbG9uZShub2RlLnZhbHVlKSk7CiAgfQoKICBkZWZhdWx0QmFzaWNMaXRlcmFsKEJhc2ljTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgfQoKICBkZWZhdWx0RXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUpIHsKICAgIHRocm93ICdVbmltcGxlbWVudGVkIGNsb25lIGZvciBLZXJuZWwgZXhwcmVzc2lvbjogJG5vZGUnOwogIH0KCiAgZGVmYXVsdEluaXRpYWxpemVyKEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHRocm93ICdVbmltcGxlbWVudGVkIGNsb25lIGZvciBLZXJuZWwgaW5pdGlhbGl6ZXI6ICRub2RlJzsKICB9CgogIGRlZmF1bHRNZW1iZXIoTWVtYmVyIG5vZGUpIHsKICAgIHRocm93ICdVbmltcGxlbWVudGVkIGNsb25lIGZvciBLZXJuZWwgbWVtYmVyOiAkbm9kZSc7CiAgfQoKICBkZWZhdWx0U3RhdGVtZW50KFN0YXRlbWVudCBub2RlKSB7CiAgICB0aHJvdyAnVW5pbXBsZW1lbnRlZCBjbG9uZSBmb3IgS2VybmVsIHN0YXRlbWVudDogJG5vZGUnOwogIH0KCiAgZGVmYXVsdFRyZWVOb2RlKFRyZWVOb2RlIG5vZGUpIHsKICAgIHRocm93ICdDbG9uaW5nIEtlcm5lbCBub24tbWVtYmVycyBpcyBub3Qgc3VwcG9ydGVkLiAgJwogICAgICAgICdUcmllZCBjbG9uaW5nICRub2RlJzsKICB9CgogIHZpc2l0QXNzZXJ0SW5pdGlhbGl6ZXIoQXNzZXJ0SW5pdGlhbGl6ZXIgbm9kZSkgewogICAgcmV0dXJuIG5ldyBBc3NlcnRJbml0aWFsaXplcihjbG9uZShub2RlLnN0YXRlbWVudCkpOwogIH0KCiAgdmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZChDaGVja0xpYnJhcnlJc0xvYWRlZCBub2RlKSB7CiAgICByZXR1cm4gbmV3IENoZWNrTGlicmFyeUlzTG9hZGVkKG5vZGUuaW1wb3J0KTsKICB9CgogIHZpc2l0Q29tYmluYXRvcihDb21iaW5hdG9yIG5vZGUpIHsKICAgIHJldHVybiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgfQoKICB2aXNpdEZpZWxkSW5pdGlhbGl6ZXIoRmllbGRJbml0aWFsaXplciBub2RlKSB7CiAgICByZXR1cm4gbmV3IEZpZWxkSW5pdGlhbGl6ZXIuYnlSZWZlcmVuY2UoCiAgICAgICAgbm9kZS5maWVsZFJlZmVyZW5jZSwgY2xvbmUobm9kZS52YWx1ZSkpOwogIH0KCiAgdmlzaXRJbnN0YW50aWF0aW9uKEluc3RhbnRpYXRpb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBJbnN0YW50aWF0aW9uKAogICAgICAgIGNsb25lKG5vZGUuZXhwcmVzc2lvbiksIG5vZGUudHlwZUFyZ3VtZW50cy5tYXAodmlzaXRUeXBlKS50b0xpc3QoKSk7CiAgfQoKICB2aXNpdEludmFsaWRJbml0aWFsaXplcihJbnZhbGlkSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgcmV0dXJuIG5ldyBJbnZhbGlkSW5pdGlhbGl6ZXIoKTsKICB9CgogIHZpc2l0TGlicmFyeURlcGVuZGVuY3koTGlicmFyeURlcGVuZGVuY3kgbm9kZSkgewogICAgcmV0dXJuIGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICB9CgogIHZpc2l0TGlicmFyeVBhcnQoTGlicmFyeVBhcnQgbm9kZSkgewogICAgcmV0dXJuIGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICB9CgogIHZpc2l0TG9hZExpYnJhcnkoTG9hZExpYnJhcnkgbm9kZSkgewogICAgcmV0dXJuIG5ldyBMb2FkTGlicmFyeShub2RlLmltcG9ydCk7CiAgfQoKICB2aXNpdExvY2FsSW5pdGlhbGl6ZXIoTG9jYWxJbml0aWFsaXplciBub2RlKSB7CiAgICByZXR1cm4gbmV3IExvY2FsSW5pdGlhbGl6ZXIoY2xvbmUobm9kZS52YXJpYWJsZSkpOwogIH0KCiAgdmlzaXRDb21wb25lbnQoQ29tcG9uZW50IG5vZGUpIHsKICAgIHJldHVybiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgfQoKICB2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoUmVkaXJlY3RpbmdJbml0aWFsaXplciBub2RlKSB7CiAgICByZXR1cm4gbmV3IFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIuYnlSZWZlcmVuY2UoCiAgICAgICAgbm9kZS50YXJnZXRSZWZlcmVuY2UsIGNsb25lKG5vZGUuYXJndW1lbnRzKSk7CiAgfQoKICB2aXNpdFN1cGVySW5pdGlhbGl6ZXIoU3VwZXJJbml0aWFsaXplciBub2RlKSB7CiAgICByZXR1cm4gbmV3IFN1cGVySW5pdGlhbGl6ZXIuYnlSZWZlcmVuY2UoCiAgICAgICAgbm9kZS50YXJnZXRSZWZlcmVuY2UsIGNsb25lKG5vZGUuYXJndW1lbnRzKSk7CiAgfQoKICB2aXNpdFR5cGVkZWYoVHlwZWRlZiBub2RlKSB7CiAgICByZXR1cm4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIH0KfQoKY2xhc3MgQ2xvbmVXaXRob3V0Qm9keSBleHRlbmRzIENsb25lVmlzaXRvciB7CiAgQ2xvbmVXaXRob3V0Qm9keSgKICAgICAge01hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gdHlwZVN1YnN0aXR1dGlvbiwKICAgICAgYm9vbCBjbG9uZUFubm90YXRpb25zID0gdHJ1ZX0pCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIHR5cGVTdWJzdGl0dXRpb246IHR5cGVTdWJzdGl0dXRpb24sCiAgICAgICAgICAgIGNsb25lQW5ub3RhdGlvbnM6IGNsb25lQW5ub3RhdGlvbnMpOwoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSBjbG9uZUZ1bmN0aW9uTm9kZUJvZHkoRnVuY3Rpb25Ob2RlIG5vZGUpID0+IG51bGw7Cn0Kgo8ATk48FgEiARMcAUwNBEcPLEI0OS5ONzYZAUIGTlFCEDY0JUFKATUqTSYqBhAEASg1BAEkMwQBTlA+FgFPIylEBAEoM04uOCkTBAEqIzNOKk8pEwQBJi8EAS4VBAEuRQQBMzAEASccSQQBJ0kEAScoSQQBJ0g7BAEzLjUEATMuSAQBMS0zBAExLUYEASM8BAEjTwQBMU0/BAE9M0wEATsySgQBMS01IAQBOzI1IAQBFykEATMiPQQBO05EBAE3SgQBM0E1BAExPzUEATE/UQQBMU5GLAghHTQVKjMEASlIBAEpRxwEASsqBAEnMgQBLSEEAR8aBAEbNgQBJ0FMBAElQEwEASU8Ki4gBAEhPQQBLzUEATU5BAE1Iz0EASsqBAElJwQBKyoEAScoBAEnHgQBFywzBAEvRQQBNzwEARs7BAEnQQQBLSEEAS82OTUvBAExOxw3FAQBLTQEAS1IBAEnRQQBKThGPQQBLSwfPSAEAS8wMDY8ECwGIEEEASUoPRcEAT9CBAEnHFEEAS9ABAEhTCgEARs2ODVCBAElRAQBLUsEATdANiREMSEbRAQBNyxHBAENJzEZHyUnPTEhRDEhNz4EASNFMSFDS0QxIUE3PRwEARsgJDYnHx8hMzMxIUQxITc9HAQBS0MZHyUxQ0FNQz0hRDEiBAErLhsuPwYrJDkGE0QxIRwEATY4CiQnEDUGBAEpQkQ6OSgqID0wJy83PgQBIz4zMAQBLz4EASskBAEnPgQBKT8EAR86BAElPQQBIzsfBAEzOQQBOTIEASUiBAExLTEEASseTQQBNSUEATMiBAEnIgQBJykEATE3BAEjIgQBPTM2BAExLTYEAR8iBAIBLhQ2JQ8wMQEMPQIBGXBhY2thZ2U6a2VybmVsL2Nsb25lLmRhcnRCc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2RpbGwvZGlsbF9tZW1iZXJfYnVpbGRlci5kYXJ0igcvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5kaWxsX21lbWJlcl9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cgQ29uc3RydWN0b3IsIEZpZWxkLCBNZW1iZXIsIFByb2NlZHVyZSwgUHJvY2VkdXJlS2luZDsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgRGVjbGFyYXRpb24sCiAgICAgICAgTWVtYmVyQnVpbGRlciwKICAgICAgICBpc1JlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0cnVjdG9ySW1wbGVtZW50YXRpb247CgppbXBvcnQgJy4uL21vZGlmaWVyLmRhcnQnCiAgICBzaG93IGFic3RyYWN0TWFzaywgY29uc3RNYXNrLCBleHRlcm5hbE1hc2ssIGZpbmFsTWFzaywgc3RhdGljTWFzazsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQ7CgpjbGFzcyBEaWxsTWVtYmVyQnVpbGRlciBleHRlbmRzIE1lbWJlckJ1aWxkZXIgewogIGZpbmFsIGludCBtb2RpZmllcnM7CgogIGZpbmFsIE1lbWJlciBtZW1iZXI7CgogIERpbGxNZW1iZXJCdWlsZGVyKE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uIHBhcmVudCkKICAgICAgOiBtb2RpZmllcnMgPSBjb21wdXRlTW9kaWZpZXJzKG1lbWJlciksCiAgICAgICAgbWVtYmVyID0gbWVtYmVyLAogICAgICAgIHN1cGVyKHBhcmVudCwgbWVtYmVyLmZpbGVPZmZzZXQpOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiRGlsbE1lbWJlckJ1aWxkZXIiOwoKICBNZW1iZXIgZ2V0IHRhcmdldCA9PiBtZW1iZXI7CgogIFN0cmluZyBnZXQgbmFtZSA9PiBtZW1iZXIubmFtZS5uYW1lOwoKICBib29sIGdldCBpc0NvbnN0cnVjdG9yID0+IG1lbWJlciBpcyBDb25zdHJ1Y3RvcjsKCiAgUHJvY2VkdXJlS2luZCBnZXQga2luZCB7CiAgICBmaW5hbCBtZW1iZXIgPSB0aGlzLm1lbWJlcjsKICAgIHJldHVybiBtZW1iZXIgaXMgUHJvY2VkdXJlID8gbWVtYmVyLmtpbmQgOiBudWxsOwogIH0KCiAgYm9vbCBnZXQgaXNSZWd1bGFyTWV0aG9kID0+IGlkZW50aWNhbChQcm9jZWR1cmVLaW5kLk1ldGhvZCwga2luZCk7CgogIGJvb2wgZ2V0IGlzR2V0dGVyID0+IGlkZW50aWNhbChQcm9jZWR1cmVLaW5kLkdldHRlciwga2luZCk7CgogIGJvb2wgZ2V0IGlzU2V0dGVyID0+IGlkZW50aWNhbChQcm9jZWR1cmVLaW5kLlNldHRlciwga2luZCk7CgogIGJvb2wgZ2V0IGlzT3BlcmF0b3IgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuT3BlcmF0b3IsIGtpbmQpOwoKICBib29sIGdldCBpc0ZhY3RvcnkgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuRmFjdG9yeSwga2luZCk7CgogIGJvb2wgZ2V0IGlzUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RydWN0b3IgewogICAgcmV0dXJuIGlzQ29uc3RydWN0b3IgJiYKICAgICAgICBpc1JlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0cnVjdG9ySW1wbGVtZW50YXRpb24obWVtYmVyKTsKICB9CgogIGJvb2wgZ2V0IGlzU3ludGhldGljIHsKICAgIGZpbmFsIE1lbWJlciBtZW1iZXIgPSB0aGlzLm1lbWJlcjsKICAgIHJldHVybiBtZW1iZXIgaXMgQ29uc3RydWN0b3IgJiYgbWVtYmVyLmlzU3ludGhldGljOwogIH0KCiAgYm9vbCBnZXQgaXNGaWVsZCA9PiBtZW1iZXIgaXMgRmllbGQ7Cn0KCmludCBjb21wdXRlTW9kaWZpZXJzKE1lbWJlciBtZW1iZXIpIHsKICBpbnQgbW9kaWZpZXIgPSBtZW1iZXIuaXNBYnN0cmFjdCA/IGFic3RyYWN0TWFzayA6IDA7CiAgbW9kaWZpZXIgfD0gbWVtYmVyLmlzRXh0ZXJuYWwgPyBleHRlcm5hbE1hc2sgOiAwOwogIGlmIChtZW1iZXIgaXMgRmllbGQpIHsKICAgIG1vZGlmaWVyIHw9IG1lbWJlci5pc0NvbnN0ID8gY29uc3RNYXNrIDogMDsKICAgIG1vZGlmaWVyIHw9IG1lbWJlci5pc0ZpbmFsID8gZmluYWxNYXNrIDogMDsKICAgIG1vZGlmaWVyIHw9IG1lbWJlci5pc1N0YXRpYyA/IHN0YXRpY01hc2sgOiAwOwogIH0gZWxzZSBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSkgewogICAgbW9kaWZpZXIgfD0gbWVtYmVyLmlzQ29uc3QgPyBjb25zdE1hc2sgOiAwOwogICAgbW9kaWZpZXIgfD0gbWVtYmVyLmlzU3RhdGljID8gc3RhdGljTWFzayA6IDA7CiAgfSBlbHNlIGlmIChtZW1iZXIgaXMgQ29uc3RydWN0b3IpIHsKICAgIG1vZGlmaWVyIHw9IG1lbWJlci5pc0NvbnN0ID8gY29uc3RNYXNrIDogMDsKICB9IGVsc2UgewogICAgZHluYW1pYyBwYXJlbnQgPSBtZW1iZXIucGFyZW50OwogICAgdW5oYW5kbGVkKCIke21lbWJlci5ydW50aW1lVHlwZX0iLCAiY29tcHV0ZU1vZGlmaWVycyIsIG1lbWJlci5maWxlT2Zmc2V0LAogICAgICAgIFVyaS5iYXNlLnJlc29sdmUocGFyZW50LmZpbGVVcmkpKTsKICB9CiAgcmV0dXJuIG1vZGlmaWVyOwp9ClcATk48ASMBIT8BJwkVFzoBGkcBKgEwFwEXATcuGSoBLwEfAScBMwEbIDUEAUUBPgE+AUIBQAEwHEIEARknOAQBJwIBJjc0GTAwMiQwMiYwCyROKwQTAgE5cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2RpbGwvZGlsbF9tZW1iZXJfYnVpbGRlci5kYXJ0L3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zY29wZS5kYXJ0toUvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5zY29wZTsKCmltcG9ydCAnYnVpbGRlci9idWlsZGVyLmRhcnQnCiAgICBzaG93IERlY2xhcmF0aW9uLCBOYW1lSXRlcmF0b3IsIFR5cGVWYXJpYWJsZUJ1aWxkZXI7CgppbXBvcnQgJ2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgTG9jYXRlZE1lc3NhZ2UsCiAgICAgICAgTWVzc2FnZSwKICAgICAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtRXh0ZW5kaW5nVW5tb2RpZmlhYmxlU2NvcGUsCiAgICAgICAgdGVtcGxhdGVBY2Nlc3NFcnJvciwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvblVzZSwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZTsKCmltcG9ydCAncHJvYmxlbXMuZGFydCcgc2hvdyBpbnRlcm5hbFByb2JsZW0sIHVuc3VwcG9ydGVkOwoKY2xhc3MgTXV0YWJsZVNjb3BlIHsKICAvLy8gTmFtZXMgZGVjbGFyZWQgaW4gdGhpcyBzY29wZS4KICBNYXA8U3RyaW5nLCBEZWNsYXJhdGlvbj4gbG9jYWw7CgogIC8vLyBTZXR0ZXJzIGRlY2xhcmVkIGluIHRoaXMgc2NvcGUuCiAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IHNldHRlcnM7CgogIC8vLyBUaGUgc2NvcGUgdGhhdCB0aGlzIHNjb3BlIGlzIG5lc3RlZCB3aXRoaW4sIG9yIGBudWxsYCBpZiB0aGlzIGlzIHRoZSB0b3AKICAvLy8gbGV2ZWwgc2NvcGUuCiAgU2NvcGUgcGFyZW50OwoKICBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lT3JEZWJ1Z05hbWU7CgogIE11dGFibGVTY29wZSgKICAgICAgdGhpcy5sb2NhbCwgdGhpcy5zZXR0ZXJzLCB0aGlzLnBhcmVudCwgdGhpcy5jbGFzc05hbWVPckRlYnVnTmFtZSkgewogICAgYXNzZXJ0KGNsYXNzTmFtZU9yRGVidWdOYW1lICE9IG51bGwpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlNjb3BlKCRjbGFzc05hbWVPckRlYnVnTmFtZSwgJHtsb2NhbC5rZXlzfSkiOwp9CgpjbGFzcyBTY29wZSBleHRlbmRzIE11dGFibGVTY29wZSB7CiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIGFuIGF0dGVtcHQgdG8gZGVjbGFyZSBuZXcgbmFtZXMgaW4gdGhpcyBzY29wZSBzaG91bGQKICAvLy8gc3VjY2VlZC4KICBmaW5hbCBib29sIGlzTW9kaWZpYWJsZTsKCiAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IGxhYmVsczsKCiAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IGZvcndhcmREZWNsYXJlZExhYmVsczsKCiAgTWFwPFN0cmluZywgaW50PiB1c2VkTmFtZXM7CgogIFNjb3BlKE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBsb2NhbCwgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IHNldHRlcnMsCiAgICAgIFNjb3BlIHBhcmVudCwgU3RyaW5nIGRlYnVnTmFtZSwge3RoaXMuaXNNb2RpZmlhYmxlOiB0cnVlfSkKICAgICAgOiBzdXBlcihsb2NhbCwgc2V0dGVycyA9IHNldHRlcnMgPz8gY29uc3QgPFN0cmluZywgRGVjbGFyYXRpb24+e30sIHBhcmVudCwKICAgICAgICAgICAgZGVidWdOYW1lKTsKCiAgU2NvcGUudG9wKHtib29sIGlzTW9kaWZpYWJsZTogZmFsc2V9KQogICAgICA6IHRoaXMoPFN0cmluZywgRGVjbGFyYXRpb24+e30sIDxTdHJpbmcsIERlY2xhcmF0aW9uPnt9LCBudWxsLCAidG9wIiwKICAgICAgICAgICAgaXNNb2RpZmlhYmxlOiBpc01vZGlmaWFibGUpOwoKICBTY29wZS5pbW11dGFibGUoKQogICAgICA6IHRoaXMoY29uc3QgPFN0cmluZywgRGVjbGFyYXRpb24+e30sIGNvbnN0IDxTdHJpbmcsIERlY2xhcmF0aW9uPnt9LCBudWxsLAogICAgICAgICAgICAiaW1tdXRhYmxlIiwKICAgICAgICAgICAgaXNNb2RpZmlhYmxlOiBmYWxzZSk7CgogIFNjb3BlLm5lc3RlZChTY29wZSBwYXJlbnQsIFN0cmluZyBkZWJ1Z05hbWUsIHtib29sIGlzTW9kaWZpYWJsZTogdHJ1ZX0pCiAgICAgIDogdGhpcygKICAgICAgICAgICAgPFN0cmluZywgRGVjbGFyYXRpb24+e30sIDxTdHJpbmcsIERlY2xhcmF0aW9uPnt9LCBwYXJlbnQsIGRlYnVnTmFtZSwKICAgICAgICAgICAgaXNNb2RpZmlhYmxlOiBpc01vZGlmaWFibGUpOwoKICBJdGVyYXRvcjxEZWNsYXJhdGlvbj4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBuZXcgU2NvcGVMb2NhbERlY2xhcmF0aW9uSXRlcmF0b3IodGhpcyk7CiAgfQoKICBOYW1lSXRlcmF0b3IgZ2V0IG5hbWVJdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IFNjb3BlTG9jYWxEZWNsYXJhdGlvbk5hbWVJdGVyYXRvcih0aGlzKTsKICB9CgogIFNjb3BlIGNvcHlXaXRoUGFyZW50KFNjb3BlIHBhcmVudCwgU3RyaW5nIGRlYnVnTmFtZSkgewogICAgcmV0dXJuIG5ldyBTY29wZShzdXBlci5sb2NhbCwgc3VwZXIuc2V0dGVycywgcGFyZW50LCBkZWJ1Z05hbWUsCiAgICAgICAgaXNNb2RpZmlhYmxlOiBpc01vZGlmaWFibGUpOwogIH0KCiAgLy8vIERvbid0IHVzZSB0aGlzLiBVc2UgW2JlY29tZVBhcnRPZl0gaW5zdGVhZC4KICB2b2lkIHNldCBsb2NhbChfKSA9PiB1bnN1cHBvcnRlZCgibG9jYWw9IiwgLTEsIG51bGwpOwoKICAvLy8gRG9uJ3QgdXNlIHRoaXMuIFVzZSBbYmVjb21lUGFydE9mXSBpbnN0ZWFkLgogIHZvaWQgc2V0IHNldHRlcnMoXykgPT4gdW5zdXBwb3J0ZWQoInNldHRlcnM9IiwgLTEsIG51bGwpOwoKICAvLy8gRG9uJ3QgdXNlIHRoaXMuIFVzZSBbYmVjb21lUGFydE9mXSBpbnN0ZWFkLgogIHZvaWQgc2V0IHBhcmVudChfKSA9PiB1bnN1cHBvcnRlZCgicGFyZW50PSIsIC0xLCBudWxsKTsKCiAgLy8vIFRoaXMgc2NvcGUgYmVjb21lcyBlcXVpdmFsZW50IHRvIFtzY29wZV0uIFRoaXMgaXMgdXNlZCBmb3IgcGFydHMgdG8KICAvLy8gYmVjb21lIHBhcnQgb2YgdGhlaXIgbGlicmFyeSdzIHNjb3BlLgogIHZvaWQgYmVjb21lUGFydE9mKFNjb3BlIHNjb3BlKSB7CiAgICBhc3NlcnQocGFyZW50LnBhcmVudCA9PSBudWxsKTsKICAgIGFzc2VydChzY29wZS5wYXJlbnQucGFyZW50ID09IG51bGwpOwogICAgc3VwZXIubG9jYWwgPSBzY29wZS5sb2NhbDsKICAgIHN1cGVyLnNldHRlcnMgPSBzY29wZS5zZXR0ZXJzOwogICAgc3VwZXIucGFyZW50ID0gc2NvcGUucGFyZW50OwogIH0KCiAgU2NvcGUgY3JlYXRlTmVzdGVkU2NvcGUoU3RyaW5nIGRlYnVnTmFtZSwge2Jvb2wgaXNNb2RpZmlhYmxlOiB0cnVlfSkgewogICAgcmV0dXJuIG5ldyBTY29wZS5uZXN0ZWQodGhpcywgZGVidWdOYW1lLCBpc01vZGlmaWFibGU6IGlzTW9kaWZpYWJsZSk7CiAgfQoKICBTY29wZSB3aXRoVHlwZVZhcmlhYmxlcyhMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMpIHsKICAgIGlmICh0eXBlVmFyaWFibGVzID09IG51bGwpIHJldHVybiB0aGlzOwogICAgU2NvcGUgbmV3U2NvcGUgPQogICAgICAgIG5ldyBTY29wZS5uZXN0ZWQodGhpcywgInR5cGUgdmFyaWFibGVzIiwgaXNNb2RpZmlhYmxlOiBmYWxzZSk7CiAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdCBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgIG5ld1Njb3BlLmxvY2FsW3QubmFtZV0gPSB0OwogICAgfQogICAgcmV0dXJuIG5ld1Njb3BlOwogIH0KCiAgLy8vIENyZWF0ZSBhIHNwZWNpYWwgc2NvcGUgZm9yIHVzZSBieSBsYWJlbGVkIHN0YW1lbnRzLiBUaGlzIHNjb3BlIGRvZXNuJ3QKICAvLy8gaW50cm9kdWNlIGEgbmV3IHNjb3BlIGZvciBsb2NhbCB2YXJpYWJsZXMsIG9ubHkgZm9yIGxhYmVscy4gVGhpcyBkZWFscwogIC8vLyB3aXRoIGNvcm5lciBjYXNlcyBsaWtlIHRoaXM6CiAgLy8vCiAgLy8vICAgICBMOiB2YXIgeDsKICAvLy8gICAgIHggPSA0MjsKICAvLy8gICAgIHByaW50KCJUaGUgYW5zd2VyIGlzICR4LiIpOwogIFNjb3BlIGNyZWF0ZU5lc3RlZExhYmVsU2NvcGUoKSB7CiAgICByZXR1cm4gbmV3IFNjb3BlKGxvY2FsLCBzZXR0ZXJzLCBwYXJlbnQsICJsYWJlbCIsIGlzTW9kaWZpYWJsZTogdHJ1ZSk7CiAgfQoKICB2b2lkIHJlY29yZFVzZShTdHJpbmcgbmFtZSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKSB7CiAgICBpZiAoaXNNb2RpZmlhYmxlKSB7CiAgICAgIHVzZWROYW1lcyA/Pz0gPFN0cmluZywgaW50Pnt9OwogICAgICB1c2VkTmFtZXMucHV0SWZBYnNlbnQobmFtZSwgKCkgPT4gY2hhck9mZnNldCk7CiAgICB9CiAgfQoKICBEZWNsYXJhdGlvbiBsb29rdXBJbihTdHJpbmcgbmFtZSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpLAogICAgICBNYXA8U3RyaW5nLCBEZWNsYXJhdGlvbj4gbWFwLCBib29sIGlzSW5zdGFuY2VTY29wZSkgewogICAgRGVjbGFyYXRpb24gYnVpbGRlciA9IG1hcFtuYW1lXTsKICAgIGlmIChidWlsZGVyID09IG51bGwpIHJldHVybiBudWxsOwogICAgaWYgKGJ1aWxkZXIubmV4dCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgQW1iaWd1b3VzQnVpbGRlcihuYW1lLmlzRW1wdHkgPyBjbGFzc05hbWVPckRlYnVnTmFtZSA6IG5hbWUsCiAgICAgICAgICBidWlsZGVyLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIH0gZWxzZSBpZiAoIWlzSW5zdGFuY2VTY29wZSAmJiBidWlsZGVyLmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gYnVpbGRlcjsKICAgIH0KICB9CgogIERlY2xhcmF0aW9uIGxvb2t1cChTdHJpbmcgbmFtZSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpLAogICAgICB7Ym9vbCBpc0luc3RhbmNlU2NvcGU6IHRydWV9KSB7CiAgICByZWNvcmRVc2UobmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICBEZWNsYXJhdGlvbiBidWlsZGVyID0KICAgICAgICBsb29rdXBJbihuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBsb2NhbCwgaXNJbnN0YW5jZVNjb3BlKTsKICAgIGlmIChidWlsZGVyICE9IG51bGwpIHJldHVybiBidWlsZGVyOwogICAgYnVpbGRlciA9IGxvb2t1cEluKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmksIHNldHRlcnMsIGlzSW5zdGFuY2VTY29wZSk7CiAgICBpZiAoYnVpbGRlciAhPSBudWxsICYmICFidWlsZGVyLmhhc1Byb2JsZW0pIHsKICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NFcnJvckJ1aWxkZXIobmFtZSwgYnVpbGRlciwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CiAgICBpZiAoIWlzSW5zdGFuY2VTY29wZSkgewogICAgICAvLyBGb3Igc3RhdGljIGxvb2t1cCwgZG8gbm90IHNlYWNoIHRoZSBwYXJlbnQgc2NvcGUuCiAgICAgIHJldHVybiBidWlsZGVyOwogICAgfQogICAgcmV0dXJuIGJ1aWxkZXIgPz8gcGFyZW50Py5sb29rdXAobmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICBEZWNsYXJhdGlvbiBsb29rdXBTZXR0ZXIoU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSwKICAgICAge2Jvb2wgaXNJbnN0YW5jZVNjb3BlOiB0cnVlfSkgewogICAgcmVjb3JkVXNlKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgRGVjbGFyYXRpb24gYnVpbGRlciA9CiAgICAgICAgbG9va3VwSW4obmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSwgc2V0dGVycywgaXNJbnN0YW5jZVNjb3BlKTsKICAgIGlmIChidWlsZGVyICE9IG51bGwpIHJldHVybiBidWlsZGVyOwogICAgYnVpbGRlciA9IGxvb2t1cEluKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmksIGxvY2FsLCBpc0luc3RhbmNlU2NvcGUpOwogICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCAmJiAhYnVpbGRlci5oYXNQcm9ibGVtKSB7CiAgICAgIHJldHVybiBuZXcgQWNjZXNzRXJyb3JCdWlsZGVyKG5hbWUsIGJ1aWxkZXIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgfQogICAgaWYgKCFpc0luc3RhbmNlU2NvcGUpIHsKICAgICAgLy8gRm9yIHN0YXRpYyBsb29rdXAsIGRvIG5vdCBzZWFjaCB0aGUgcGFyZW50IHNjb3BlLgogICAgICByZXR1cm4gYnVpbGRlcjsKICAgIH0KICAgIHJldHVybiBidWlsZGVyID8/IHBhcmVudD8ubG9va3VwU2V0dGVyKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgYm9vbCBoYXNMb2NhbExhYmVsKFN0cmluZyBuYW1lKSA9PiBsYWJlbHMgIT0gbnVsbCAmJiBsYWJlbHMuY29udGFpbnNLZXkobmFtZSk7CgogIHZvaWQgZGVjbGFyZUxhYmVsKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiB0YXJnZXQpIHsKICAgIGlmIChpc01vZGlmaWFibGUpIHsKICAgICAgbGFiZWxzID8/PSA8U3RyaW5nLCBEZWNsYXJhdGlvbj57fTsKICAgICAgbGFiZWxzW25hbWVdID0gdGFyZ2V0OwogICAgfSBlbHNlIHsKICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgbWVzc2FnZUludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlLCAtMSwgbnVsbCk7CiAgICB9CiAgfQoKICB2b2lkIGZvcndhcmREZWNsYXJlTGFiZWwoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIHRhcmdldCkgewogICAgZGVjbGFyZUxhYmVsKG5hbWUsIHRhcmdldCk7CiAgICBmb3J3YXJkRGVjbGFyZWRMYWJlbHMgPz89IDxTdHJpbmcsIERlY2xhcmF0aW9uPnt9OwogICAgZm9yd2FyZERlY2xhcmVkTGFiZWxzW25hbWVdID0gdGFyZ2V0OwogIH0KCiAgYm9vbCBjbGFpbUxhYmVsKFN0cmluZyBuYW1lKSB7CiAgICBpZiAoZm9yd2FyZERlY2xhcmVkTGFiZWxzID09IG51bGwgfHwKICAgICAgICBmb3J3YXJkRGVjbGFyZWRMYWJlbHMucmVtb3ZlKG5hbWUpID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIGlmIChmb3J3YXJkRGVjbGFyZWRMYWJlbHMubGVuZ3RoID09IDApIHsKICAgICAgZm9yd2FyZERlY2xhcmVkTGFiZWxzID0gbnVsbDsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IGdldCB1bmNsYWltZWRGb3J3YXJkRGVjbGFyYXRpb25zIHsKICAgIHJldHVybiBmb3J3YXJkRGVjbGFyZWRMYWJlbHM7CiAgfQoKICBEZWNsYXJhdGlvbiBsb29rdXBMYWJlbChTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIChsYWJlbHMgPT0gbnVsbCA/IG51bGwgOiBsYWJlbHNbbmFtZV0pID8/IHBhcmVudD8ubG9va3VwTGFiZWwobmFtZSk7CiAgfQoKICAvLy8gRGVjbGFyZXMgdGhhdCB0aGUgbWVhbmluZyBvZiBbbmFtZV0gaW4gdGhpcyBzY29wZSBpcyBbYnVpbGRlcl0uCiAgLy8vCiAgLy8vIElmIG5hbWUgd2FzIHVzZWQgcHJldmlvdXNseSBpbiB0aGlzIHNjb3BlLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbWVzc2FnZQogIC8vLyB0aGF0IGNhbiBiZSB1c2VkIGFzIGNvbnRleHQgZm9yIHJlcG9ydGluZyBhIGNvbXBpbGUtdGltZSBlcnJvciBhYm91dAogIC8vLyBbbmFtZV0gYmVpbmcgdXNlZCBiZWZvcmUgaXRzIGRlY2xhcmVkLiBbZmlsZVVyaV0gaXMgdXNlZCB0byBiaW5kIHRoZQogIC8vLyBsb2NhdGlvbiBvZiB0aGlzIG1lc3NhZ2UuCiAgTG9jYXRlZE1lc3NhZ2UgZGVjbGFyZShTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gYnVpbGRlciwgVXJpIGZpbGVVcmkpIHsKICAgIGlmIChpc01vZGlmaWFibGUpIHsKICAgICAgaWYgKHVzZWROYW1lcz8uY29udGFpbnNLZXkobmFtZSkgPz8gZmFsc2UpIHsKICAgICAgICByZXR1cm4gdGVtcGxhdGVEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2F1c2UKICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAgICAgICAgICAgLndpdGhMb2NhdGlvbihmaWxlVXJpLCB1c2VkTmFtZXNbbmFtZV0sIG5hbWUubGVuZ3RoKTsKICAgICAgfQogICAgICBsb2NhbFtuYW1lXSA9IGJ1aWxkZXI7CiAgICB9IGVsc2UgewogICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtRXh0ZW5kaW5nVW5tb2RpZmlhYmxlU2NvcGUsIC0xLCBudWxsKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBtZXJnZSgKICAgICAgU2NvcGUgc2NvcGUsCiAgICAgIERlY2xhcmF0aW9uIGNvbXB1dGVBbWJpZ3VvdXNEZWNsYXJhdGlvbigKICAgICAgICAgIFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBleGlzdGluZywgRGVjbGFyYXRpb24gbWVtYmVyKSkgewogICAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IG1hcCA9IGxvY2FsOwoKICAgIHZvaWQgbWVyZ2VNZW1iZXIoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgICBEZWNsYXJhdGlvbiBleGlzdGluZyA9IG1hcFtuYW1lXTsKICAgICAgaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKICAgICAgICBpZiAoZXhpc3RpbmcgIT0gbWVtYmVyKSB7CiAgICAgICAgICBtZW1iZXIgPSBjb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb24obmFtZSwgZXhpc3RpbmcsIG1lbWJlcik7CiAgICAgICAgfQogICAgICB9CiAgICAgIG1hcFtuYW1lXSA9IG1lbWJlcjsKICAgIH0KCiAgICBzY29wZS5sb2NhbC5mb3JFYWNoKG1lcmdlTWVtYmVyKTsKICAgIG1hcCA9IHNldHRlcnM7CiAgICBzY29wZS5zZXR0ZXJzLmZvckVhY2gobWVyZ2VNZW1iZXIpOwogIH0KCiAgdm9pZCBmb3JFYWNoKGYoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikpIHsKICAgIGxvY2FsLmZvckVhY2goZik7CiAgICBzZXR0ZXJzLmZvckVhY2goZik7CiAgfQoKICBTdHJpbmcgZ2V0IGRlYnVnU3RyaW5nIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBpbnQgbmVzdGluZ0xldmVsID0gd3JpdGVPbihidWZmZXIpOwogICAgZm9yIChpbnQgaSA9IG5lc3RpbmdMZXZlbDsgaSA+PSAwOyBpLS0pIHsKICAgICAgYnVmZmVyLndyaXRlbG4oIiR7JyAgJyAqIGl9fSIpOwogICAgfQogICAgcmV0dXJuICIkYnVmZmVyIjsKICB9CgogIGludCB3cml0ZU9uKFN0cmluZ1Npbmsgc2luaykgewogICAgaW50IG5lc3RpbmdMZXZlbCA9IChwYXJlbnQ/LndyaXRlT24oc2luaykgPz8gLTEpICsgMTsKICAgIFN0cmluZyBpbmRlbnQgPSAiICAiICogbmVzdGluZ0xldmVsOwogICAgc2luay53cml0ZWxuKCIkaW5kZW50eyIpOwogICAgbG9jYWwuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgICBzaW5rLndyaXRlbG4oIiRpbmRlbnQgICRuYW1lIik7CiAgICB9KTsKICAgIHNldHRlcnMuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgICBzaW5rLndyaXRlbG4oIiRpbmRlbnQgICRuYW1lPSIpOwogICAgfSk7CiAgICByZXR1cm4gbmVzdGluZ0xldmVsOwogIH0KCiAgU2NvcGUgY29tcHV0ZU1peGluU2NvcGUoKSB7CiAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSB0aGlzLmxvY2FsLmtleXMudG9MaXN0KCk7CiAgICBNYXA8U3RyaW5nLCBEZWNsYXJhdGlvbj4gbG9jYWwgPSA8U3RyaW5nLCBEZWNsYXJhdGlvbj57fTsKICAgIGJvb2wgbmVlZHNDb3B5ID0gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFN0cmluZyBuYW1lID0gbmFtZXNbaV07CiAgICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gdGhpcy5sb2NhbFtuYW1lXTsKICAgICAgaWYgKGRlY2xhcmF0aW9uLmlzU3RhdGljKSB7CiAgICAgICAgbmVlZHNDb3B5ID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbFtuYW1lXSA9IGRlY2xhcmF0aW9uOwogICAgICB9CiAgICB9CiAgICBuYW1lcyA9IHRoaXMuc2V0dGVycy5rZXlzLnRvTGlzdCgpOwogICAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IHNldHRlcnMgPSA8U3RyaW5nLCBEZWNsYXJhdGlvbj57fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSB0aGlzLnNldHRlcnNbbmFtZV07CiAgICAgIGlmIChkZWNsYXJhdGlvbi5pc1N0YXRpYykgewogICAgICAgIG5lZWRzQ29weSA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0dGVyc1tuYW1lXSA9IGRlY2xhcmF0aW9uOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmVlZHNDb3B5CiAgICAgICAgPyBuZXcgU2NvcGUobG9jYWwsIHNldHRlcnMsIHBhcmVudCwgY2xhc3NOYW1lT3JEZWJ1Z05hbWUsCiAgICAgICAgICAgIGlzTW9kaWZpYWJsZTogaXNNb2RpZmlhYmxlKQogICAgICAgIDogdGhpczsKICB9Cn0KCmNsYXNzIFNjb3BlQnVpbGRlciB7CiAgZmluYWwgU2NvcGUgc2NvcGU7CgogIFNjb3BlQnVpbGRlcih0aGlzLnNjb3BlKTsKCiAgdm9pZCBhZGRNZW1iZXIoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIGJ1aWxkZXIpIHsKICAgIHNjb3BlLmxvY2FsW25hbWVdID0gYnVpbGRlcjsKICB9CgogIHZvaWQgYWRkU2V0dGVyKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBidWlsZGVyKSB7CiAgICBzY29wZS5zZXR0ZXJzW25hbWVdID0gYnVpbGRlcjsKICB9CgogIERlY2xhcmF0aW9uIG9wZXJhdG9yIFtdKFN0cmluZyBuYW1lKSA9PiBzY29wZS5sb2NhbFtuYW1lXTsKfQoKYWJzdHJhY3QgY2xhc3MgUHJvYmxlbUJ1aWxkZXIgZXh0ZW5kcyBEZWNsYXJhdGlvbiB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIGZpbmFsIERlY2xhcmF0aW9uIGJ1aWxkZXI7CgogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICBmaW5hbCBVcmkgZmlsZVVyaTsKCiAgUHJvYmxlbUJ1aWxkZXIodGhpcy5uYW1lLCB0aGlzLmJ1aWxkZXIsIHRoaXMuY2hhck9mZnNldCwgdGhpcy5maWxlVXJpKTsKCiAgZ2V0IHRhcmdldCA9PiBudWxsOwoKICBib29sIGdldCBoYXNQcm9ibGVtID0+IHRydWU7CgogIE1lc3NhZ2UgZ2V0IG1lc3NhZ2U7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgPT4gbmFtZTsKfQoKLy8vIFJlcHJlc2VudHMgYSBbYnVpbGRlcl0gdGhhdCdzIGJlaW5nIGFjY2Vzc2VkIGluY29ycmVjdGx5LiBGb3IgZXhhbXBsZSwgYW4KLy8vIGF0dGVtcHQgdG8gd3JpdGUgdG8gYSBmaW5hbCBmaWVsZCwgb3IgdG8gcmVhZCBmcm9tIGEgc2V0dGVyLgpjbGFzcyBBY2Nlc3NFcnJvckJ1aWxkZXIgZXh0ZW5kcyBQcm9ibGVtQnVpbGRlciB7CiAgQWNjZXNzRXJyb3JCdWlsZGVyKAogICAgICBTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gYnVpbGRlciwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKQogICAgICA6IHN1cGVyKG5hbWUsIGJ1aWxkZXIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwoKICBEZWNsYXJhdGlvbiBnZXQgcGFyZW50ID0+IGJ1aWxkZXI7CgogIGJvb2wgZ2V0IGlzRmluYWwgPT4gYnVpbGRlci5pc0ZpbmFsOwoKICBib29sIGdldCBpc0ZpZWxkID0+IGJ1aWxkZXIuaXNGaWVsZDsKCiAgYm9vbCBnZXQgaXNSZWd1bGFyTWV0aG9kID0+IGJ1aWxkZXIuaXNSZWd1bGFyTWV0aG9kOwoKICBib29sIGdldCBpc0dldHRlciA9PiAhYnVpbGRlci5pc0dldHRlcjsKCiAgYm9vbCBnZXQgaXNTZXR0ZXIgPT4gIWJ1aWxkZXIuaXNTZXR0ZXI7CgogIGJvb2wgZ2V0IGlzSW5zdGFuY2VNZW1iZXIgPT4gYnVpbGRlci5pc0luc3RhbmNlTWVtYmVyOwoKICBib29sIGdldCBpc1N0YXRpYyA9PiBidWlsZGVyLmlzU3RhdGljOwoKICBib29sIGdldCBpc1RvcExldmVsID0+IGJ1aWxkZXIuaXNUb3BMZXZlbDsKCiAgYm9vbCBnZXQgaXNUeXBlRGVjbGFyYXRpb24gPT4gYnVpbGRlci5pc1R5cGVEZWNsYXJhdGlvbjsKCiAgYm9vbCBnZXQgaXNMb2NhbCA9PiBidWlsZGVyLmlzTG9jYWw7CgogIE1lc3NhZ2UgZ2V0IG1lc3NhZ2UgPT4gdGVtcGxhdGVBY2Nlc3NFcnJvci53aXRoQXJndW1lbnRzKG5hbWUpOwp9CgpjbGFzcyBBbWJpZ3VvdXNCdWlsZGVyIGV4dGVuZHMgUHJvYmxlbUJ1aWxkZXIgewogIEFtYmlndW91c0J1aWxkZXIoCiAgICAgIFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBidWlsZGVyLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpCiAgICAgIDogc3VwZXIobmFtZSwgYnVpbGRlciwgY2hhck9mZnNldCwgZmlsZVVyaSk7CgogIERlY2xhcmF0aW9uIGdldCBwYXJlbnQgPT4gbnVsbDsKCiAgTWVzc2FnZSBnZXQgbWVzc2FnZSA9PiB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvblVzZS53aXRoQXJndW1lbnRzKG5hbWUpOwoKICAvLyBUT0RPKGFoZSk6IEFsc28gcHJvdmlkZSBjb250ZXh0LgoKICBEZWNsYXJhdGlvbiBnZXRGaXJzdERlY2xhcmF0aW9uKCkgewogICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBidWlsZGVyOwogICAgd2hpbGUgKGRlY2xhcmF0aW9uLm5leHQgIT0gbnVsbCkgewogICAgICBkZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uLm5leHQ7CiAgICB9CiAgICByZXR1cm4gZGVjbGFyYXRpb247CiAgfQp9CgpjbGFzcyBTY29wZUxvY2FsRGVjbGFyYXRpb25JdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPERlY2xhcmF0aW9uPiB7CiAgSXRlcmF0b3I8RGVjbGFyYXRpb24+IGxvY2FsOwogIGZpbmFsIEl0ZXJhdG9yPERlY2xhcmF0aW9uPiBzZXR0ZXJzOwogIERlY2xhcmF0aW9uIGN1cnJlbnQ7CgogIFNjb3BlTG9jYWxEZWNsYXJhdGlvbkl0ZXJhdG9yKFNjb3BlIHNjb3BlKQogICAgICA6IGxvY2FsID0gc2NvcGUubG9jYWwudmFsdWVzLml0ZXJhdG9yLAogICAgICAgIHNldHRlcnMgPSBzY29wZS5zZXR0ZXJzLnZhbHVlcy5pdGVyYXRvcjsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIERlY2xhcmF0aW9uIG5leHQgPSBjdXJyZW50Py5uZXh0OwogICAgaWYgKG5leHQgIT0gbnVsbCkgewogICAgICBjdXJyZW50ID0gbmV4dDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAobG9jYWwgIT0gbnVsbCkgewogICAgICBpZiAobG9jYWwubW92ZU5leHQoKSkgewogICAgICAgIGN1cnJlbnQgPSBsb2NhbC5jdXJyZW50OwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxvY2FsID0gbnVsbDsKICAgIH0KICAgIGlmIChzZXR0ZXJzLm1vdmVOZXh0KCkpIHsKICAgICAgY3VycmVudCA9IHNldHRlcnMuY3VycmVudDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICBjdXJyZW50ID0gbnVsbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KfQoKY2xhc3MgU2NvcGVMb2NhbERlY2xhcmF0aW9uTmFtZUl0ZXJhdG9yIGV4dGVuZHMgU2NvcGVMb2NhbERlY2xhcmF0aW9uSXRlcmF0b3IKICAgIGltcGxlbWVudHMgTmFtZUl0ZXJhdG9yIHsKICBJdGVyYXRvcjxTdHJpbmc+IGxvY2FsTmFtZXM7CiAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBzZXR0ZXJOYW1l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c3NhZ2UsCiAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgdGVtcGxhdGVCYWRUeXBlVmFyaWFibGVJblN1cGVydHlwZSwKICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhDb25zdHJ1Y3RvciwKICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhGYWN0b3J5LAogICAgICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aE1lbWJlciwKICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXJXYXJuaW5nLAogICAgICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aFNldHRlciwKICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXJXYXJuaW5nLAogICAgICAgIHRlbXBsYXRlU3VwZXJ0eXBlSXNJbGxlZ2FsOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzc0J1aWxkZXIsCiAgICAgICAgQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyLAogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIEtlcm5lbEZpZWxkQnVpbGRlciwKICAgICAgICBGdW5jdGlvbkJ1aWxkZXIsCiAgICAgICAgSW52YWxpZFR5cGVCdWlsZGVyLAogICAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyLAogICAgICAgIE5hbWVkVHlwZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTWV0YWRhdGFCdWlsZGVyLAogICAgICAgIFNjb3BlLAogICAgICAgIFR5cGVCdWlsZGVyLAogICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIsCiAgICAgICAgY29tcGFyZVByb2NlZHVyZXM7CgppbXBvcnQgJy4uL2tlcm5lbC90eXBlX2FsZ29yaXRobXMuZGFydCcgc2hvdyBWYXJpYW5jZSwgY29tcHV0ZVZhcmlhbmNlOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuZXhwZWN0ZWQsIHVuaGFuZGxlZDsKCkNsYXNzIGluaXRpYWxpemVDbGFzcygKICAgIENsYXNzIGNscywKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgIFN0cmluZyBuYW1lLAogICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgcGFyZW50LAogICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgIGludCBjaGFyT2Zmc2V0LAogICAgaW50IGNoYXJFbmRPZmZzZXQpIHsKICBjbHMgPz89IG5ldyBDbGFzcygKICAgICAgbmFtZTogbmFtZSwKICAgICAgdHlwZVBhcmFtZXRlcnM6CiAgICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyLmtlcm5lbFR5cGVQYXJhbWV0ZXJzRnJvbUJ1aWxkZXJzKHR5cGVWYXJpYWJsZXMpKTsKICBjbHMuZmlsZVVyaSA/Pz0gcGFyZW50LmZpbGVVcmk7CiAgaWYgKGNscy5zdGFydEZpbGVPZmZzZXQgPT0gVHJlZU5vZGUubm9PZmZzZXQpIHsKICAgIGNscy5zdGFydEZpbGVPZmZzZXQgPSBzdGFydENoYXJPZmZzZXQ7CiAgfQogIGlmIChjbHMuZmlsZU9mZnNldCA9PSBUcmVlTm9kZS5ub09mZnNldCkgewogICAgY2xzLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogIH0KICBpZiAoY2xzLmZpbGVFbmRPZmZzZXQgPT0gVHJlZU5vZGUubm9PZmZzZXQpIHsKICAgIGNscy5maWxlRW5kT2Zmc2V0ID0gY2hhckVuZE9mZnNldDsKICB9CgogIHJldHVybiBjbHM7Cn0KCmNsYXNzIFNvdXJjZUNsYXNzQnVpbGRlciBleHRlbmRzIENsYXNzQnVpbGRlcgogICAgaW1wbGVtZW50cyBDb21wYXJhYmxlPFNvdXJjZUNsYXNzQnVpbGRlcj4gewogIEBvdmVycmlkZQogIGZpbmFsIENsYXNzIGFjdHVhbENsczsKCiAgZmluYWwgTGlzdDxDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXI+IGNvbnN0cnVjdG9yUmVmZXJlbmNlczsKCiAgVHlwZUJ1aWxkZXIgbWl4ZWRJblR5cGU7CgogIGJvb2wgaXNNaXhpbkRlY2xhcmF0aW9uOwoKICBTb3VyY2VDbGFzc0J1aWxkZXIoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlLAogICAgICBMaXN0PFR5cGVCdWlsZGVyPiBpbnRlcmZhY2VzLAogICAgICBMaXN0PFR5cGVCdWlsZGVyPiBvblR5cGVzLAogICAgICBTY29wZSBzY29wZSwKICAgICAgU2NvcGUgY29uc3RydWN0b3JzLAogICAgICBMaWJyYXJ5QnVpbGRlciBwYXJlbnQsCiAgICAgIHRoaXMuY29uc3RydWN0b3JSZWZlcmVuY2VzLAogICAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICAgIHtDbGFzcyBjbHMsCiAgICAgIHRoaXMubWl4ZWRJblR5cGUsCiAgICAgIHRoaXMuaXNNaXhpbkRlY2xhcmF0aW9uID0gZmFsc2V9KQogICAgICA6IGFjdHVhbENscyA9IGluaXRpYWxpemVDbGFzcyhjbHMsIHR5cGVWYXJpYWJsZXMsIG5hbWUsIHBhcmVudCwKICAgICAgICAgICAgc3RhcnRDaGFyT2Zmc2V0LCBjaGFyT2Zmc2V0LCBjaGFyRW5kT2Zmc2V0KSwKICAgICAgICBzdXBlcihtZXRhZGF0YSwgbW9kaWZpZXJzLCBuYW1lLCB0eXBlVmFyaWFibGVzLCBzdXBlcnR5cGUsIGludGVyZmFjZXMsCiAgICAgICAgICAgIG9uVHlwZXMsIHNjb3BlLCBjb25zdHJ1Y3RvcnMsIHBhcmVudCwgY2hhck9mZnNldCk7CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBjbHMgPT4gb3JpZ2luLmFjdHVhbENsczsKCiAgQG92ZXJyaWRlCiAgS2VybmVsTGlicmFyeUJ1aWxkZXIgZ2V0IGxpYnJhcnkgPT4gc3VwZXIubGlicmFyeTsKCiAgQ2xhc3MgYnVpbGQoS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlicmFyeUJ1aWxkZXIgY29yZUxpYnJhcnkpIHsKICAgIHZvaWQgYnVpbGRCdWlsZGVycyhTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICAgICAgZG8gewogICAgICAgIGlmIChkZWNsYXJhdGlvbi5wYXJlbnQgIT0gdGhpcykgewogICAgICAgICAgaWYgKGZpbGVVcmkgIT0gZGVjbGFyYXRpb24ucGFyZW50LmZpbGVVcmkpIHsKICAgICAgICAgICAgdW5leHBlY3RlZCgiJGZpbGVVcmkiLCAiJHtkZWNsYXJhdGlvbi5wYXJlbnQuZmlsZVVyaX0iLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgZmlsZVVyaSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bmV4cGVjdGVkKGZ1bGxOYW1lRm9yRXJyb3JzLCBkZWNsYXJhdGlvbi5wYXJlbnQ/LmZ1bGxOYW1lRm9yRXJyb3JzLAogICAgICAgICAgICAgICAgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBLZXJuZWxGaWVsZEJ1aWxkZXIpIHsKICAgICAgICAgIC8vIFRPRE8oYWhlKTogSXQgd291bGQgYmUgbmljZSB0byBoYXZlIGEgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlCiAgICAgICAgICAvLyBidWlsZCBtZXRob2QgdG8gYXZvaWQgZHVwbGljYXRpbmcgdGhlc2UgdHdvIGNhc2VzLgogICAgICAgICAgTWVtYmVyIGZpZWxkID0gZGVjbGFyYXRpb24uYnVpbGQobGlicmFyeSk7CiAgICAgICAgICBpZiAoIWRlY2xhcmF0aW9uLmlzUGF0Y2ggJiYgZGVjbGFyYXRpb24ubmV4dCA9PSBudWxsKSB7CiAgICAgICAgICAgIGNscy5hZGRNZW1iZXIoZmllbGQpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgRnVuY3Rpb25CdWlsZGVyKSB7CiAgICAgICAgICBNZW1iZXIgZnVuY3Rpb24gPSBkZWNsYXJhdGlvbi5idWlsZChsaWJyYXJ5KTsKICAgICAgICAgIGZ1bmN0aW9uLnBhcmVudCA9IGNsczsKICAgICAgICAgIGlmICghZGVjbGFyYXRpb24uaXNQYXRjaCAmJiBkZWNsYXJhdGlvbi5uZXh0ID09IG51bGwpIHsKICAgICAgICAgICAgY2xzLmFkZE1lbWJlcihmdW5jdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVuaGFuZGxlZCgiJHtkZWNsYXJhdGlvbi5ydW50aW1lVHlwZX0iLCAiYnVpbGRCdWlsZGVycyIsCiAgICAgICAgICAgICAgZGVjbGFyYXRpb24uY2hhck9mZnNldCwgZGVjbGFyYXRpb24uZmlsZVVyaSk7CiAgICAgICAgfQogICAgICAgIGRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb24ubmV4dDsKICAgICAgfSB3aGlsZSAoZGVjbGFyYXRpb24gIT0gbnVsbCk7CiAgICB9CgogICAgc2NvcGUuZm9yRWFjaChidWlsZEJ1aWxkZXJzKTsKICAgIGNvbnN0cnVjdG9ycy5mb3JFYWNoKGJ1aWxkQnVpbGRlcnMpOwogICAgc3VwZXJ0eXBlID0gY2hlY2tTdXBlcnR5cGUoc3VwZXJ0eXBlKTsKICAgIGFjdHVhbENscy5zdXBlcnR5cGUgPQogICAgICAgIHN1cGVydHlwZT8uYnVpbGRTdXBlcnR5cGUobGlicmFyeSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICBpZiAoIWlzTWl4aW5EZWNsYXJhdGlvbiAmJgogICAgICAgIGFjdHVhbENscy5zdXBlcnR5cGUgIT0gbnVsbCAmJgogICAgICAgIGFjdHVhbENscy5zdXBlcmNsYXNzLmlzTWl4aW5EZWNsYXJhdGlvbikgewogICAgICAvLyBEZWNsYXJlZCBtaXhpbnMgaGF2ZSBpbnRlcmZhY2VzIHRoYXQgY2FuIGJlIGltcGxlbWVudGVkLCBidXQgdGhleQogICAgICAvLyBjYW5ub3QgYmUgZXh0ZW5kZWQuICBIb3dldmVyLCBhIG1peGluIGRlY2xhcmF0aW9uIHdpdGggYSBzaW5nbGUKICAgICAgLy8gc3VwZXJjbGFzcyBjb25zdHJhaW50IGlzIGVuY29kZWQgd2l0aCB0aGUgY29uc3RyYWludCBhcyB0aGUgc3VwZXJ0eXBlLAogICAgICAvLyBhbmQgdGhhdCBpcyBhbGxvd2VkIHRvIGJlIGEgbWl4aW4ncyBpbnRlcmZhY2UuCiAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlU3VwZXJ0eXBlSXNJbGxlZ2FsLndpdGhBcmd1bWVudHMoYWN0dWFsQ2xzLnN1cGVyY2xhc3MubmFtZSksCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICBmaWxlVXJpKTsKICAgICAgYWN0dWFsQ2xzLnN1cGVydHlwZSA9IG51bGw7CiAgICB9CiAgICBpZiAoYWN0dWFsQ2xzLnN1cGVydHlwZSA9PSBudWxsICYmIHN1cGVydHlwZSBpcyEgTmFtZWRUeXBlQnVpbGRlcikgewogICAgICBzdXBlcnR5cGUgPSBudWxsOwogICAgfQogICAgbWl4ZWRJblR5cGUgPSBjaGVja1N1cGVydHlwZShtaXhlZEluVHlwZSk7CiAgICBhY3R1YWxDbHMubWl4ZWRJblR5cGUgPQogICAgICAgIG1peGVkSW5UeXBlPy5idWlsZE1peGVkSW5UeXBlKGxpYnJhcnksIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgaWYgKGFjdHVhbENscy5taXhlZEluVHlwZSA9PSBudWxsICYmIG1peGVkSW5UeXBlIGlzISBOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICAgIG1peGVkSW5UeXBlID0gbnVsbDsKICAgIH0KICAgIGFjdHVhbENscy5pc01peGluRGVjbGFyYXRpb24gPSBpc01peGluRGVjbGFyYXRpb247CiAgICAvLyBUT0RPKGFoZSk6IElmIGBjbHMuc3VwZXJ0eXBlYCBpcyBudWxsLCBhbmQgdGhpcyBpc24ndCBPYmplY3QsIHJlcG9ydCBhCiAgICAvLyBjb21waWxlLXRpbWUgZXJyb3IuCiAgICBjbHMuaXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7CiAgICBpZiAoaW50ZXJmYWNlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7ICsraSkgewogICAgICAgIGludGVyZmFjZXNbaV0gPSBjaGVja1N1cGVydHlwZShpbnRlcmZhY2VzW2ldKTsKICAgICAgICBTdXBlcnR5cGUgc3VwZXJ0eXBlID0KICAgICAgICAgICAgaW50ZXJmYWNlc1tpXS5idWlsZFN1cGVydHlwZShsaWJyYXJ5LCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgICBpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgICAgIC8vIFRPRE8oYWhlKTogUmVwb3J0IGFuIGVycm9yIGlmIHN1cGVydHlwZSBpcyBudWxsLgogICAgICAgICAgYWN0dWFsQ2xzLmltcGxlbWVudGVkVHlwZXMuYWRkKHN1cGVydHlwZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgY29uc3RydWN0b3JzLmZvckVhY2goKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvcikgewogICAgICBEZWNsYXJhdGlvbiBtZW1iZXIgPSBzY29wZUJ1aWxkZXJbbmFtZV07CiAgICAgIGlmIChtZW1iZXIgPT0gbnVsbCkgcmV0dXJuOwogICAgICBpZiAoIW1lbWJlci5pc1N0YXRpYykgcmV0dXJuOwogICAgICAvLyBUT0RPKGFoZSk6IFJldmlzaXQgdGhlc2UgbWVzc2FnZXMuIEl0IHNlZW1zIGxpa2UgdGhlIGxhc3QgdHdvIHNob3VsZAogICAgICAvLyBiZSBgY29udGV4dGAgcGFyYW1ldGVyIHRvIHRoaXMgbWVzc2FnZS4KICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXIud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIGNvbnN0cnVjdG9yLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKICAgICAgaWYgKGNvbnN0cnVjdG9yLmlzRmFjdG9yeSkgewogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aEZhY3Rvcnkud2l0aEFyZ3VtZW50cygiJHt0aGlzLm5hbWV9LiR7bmFtZX0iKSwKICAgICAgICAgICAgbWVtYmVyLmNoYXJPZmZzZXQsCiAgICAgICAgICAgIG5vTGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhDb25zdHJ1Y3RvcgogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoIiR7dGhpcy5uYW1lfS4ke25hbWV9IiksCiAgICAgICAgICAgIG1lbWJlci5jaGFyT2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCk7CiAgICAgIH0KICAgIH0pOwoKICAgIHNjb3BlLnNldHRlcnMuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIHNldHRlcikgewogICAgICBEZWNsYXJhdGlvbiBtZW1iZXIgPSBzY29wZUJ1aWxkZXJbbmFtZV07CiAgICAgIGlmIChtZW1iZXIgPT0gbnVsbCB8fAogICAgICAgICAgIShtZW1iZXIuaXNGaWVsZCAmJiAhbWVtYmVyLmlzRmluYWwgJiYgIW1lbWJlci5pc0NvbnN0IHx8CiAgICAgICAgICAgICAgbWVtYmVyLmlzUmVndWxhck1ldGhvZCAmJiBtZW1iZXIuaXNTdGF0aWMgJiYgc2V0dGVyLmlzU3RhdGljKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAobWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIgPT0gc2V0dGVyLmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgICBhZGRQcm9ibGVtKHRlbXBsYXRlQ29uZmxpY3RzV2l0aE1lbWJlci53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICBzZXR0ZXIuY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgICAgIC8vIFRPRE8oYWhlKTogQ29udGV4dCBhcmd1bWVudCB0byBwcmV2aW91cyBtZXNzYWdlPwogICAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVDb25mbGljdHNXaXRoU2V0dGVyLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICAgIG1lbWJlci5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXJXYXJuaW5nLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICAgIHNldHRlci5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgICAgLy8gVE9ETyhhaGUpOiBDb250ZXh0IGFyZ3VtZW50IHRvIHByZXZpb3VzIG1lc3NhZ2U/CiAgICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXJXYXJuaW5nLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICAgIG1lbWJlci5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgIH0KICAgIH0pOwoKICAgIHNjb3BlLnNldHRlcnMuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIHNldHRlcikgewogICAgICBEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yU2NvcGVCdWlsZGVyW25hbWVdOwogICAgICBpZiAoY29uc3RydWN0b3IgPT0gbnVsbCB8fCAhc2V0dGVyLmlzU3RhdGljKSByZXR1cm47CiAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVDb25mbGljdHNXaXRoQ29uc3RydWN0b3Iud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIHNldHRlci5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVDb25mbGljdHNXaXRoU2V0dGVyLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICBjb25zdHJ1Y3Rvci5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICB9KTsKCiAgICBjbHMucHJvY2VkdXJlcy5zb3J0KGNvbXBhcmVQcm9jZWR1cmVzKTsKICAgIHJldHVybiBjbHM7CiAgfQoKICBUeXBlQnVpbGRlciBjaGVja1N1cGVydHlwZShUeXBlQnVpbGRlciBzdXBlcnR5cGUpIHsKICAgIGlmICh0eXBlVmFyaWFibGVzID09IG51bGwgfHwgc3VwZXJ0eXBlID09IG51bGwpIHJldHVybiBzdXBlcnR5cGU7CiAgICBNZXNzYWdlIG1lc3NhZ2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVWYXJpYWJsZXMubGVuZ3RoOyArK2kpIHsKICAgICAgaW50IHZhcmlhbmNlID0gY29tcHV0ZVZhcmlhbmNlKHR5cGVWYXJpYWJsZXNbaV0sIHN1cGVydHlwZSk7CiAgICAgIGlmICh2YXJpYW5jZSA9PSBWYXJpYW5jZS5jb250cmF2YXJpYW50IHx8CiAgICAgICAgICB2YXJpYW5jZSA9PSBWYXJpYW5jZS5pbnZhcmlhbnQpIHsKICAgICAgICBtZXNzYWdlID0gdGVtcGxhdGVCYWRUeXBlVmFyaWFibGVJblN1cGVydHlwZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICB0eXBlVmFyaWFibGVzW2ldLm5hbWUsIHN1cGVydHlwZS5uYW1lKTsKICAgICAgICBsaWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZSwgY2hhck9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmkpOwogICAgICB9CiAgICB9CiAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgTmFtZWRUeXBlQnVpbGRlcihzdXBlcnR5cGUubmFtZSwgbnVsbCkKICAgICAgICAuLmJpbmQobmV3IEludmFsaWRUeXBlQnVpbGRlcihzdXBlcnR5cGUubmFtZSwKICAgICAgICAgICAgbWVzc2FnZS53aXRoTG9jYXRpb24oZmlsZVVyaSwgY2hhck9mZnNldCwgbm9MZW5ndGgpKSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXJ0eXBlOwogIH0KCiAgdm9pZCBhZGRTeW50aGV0aWNDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgewogICAgU3RyaW5nIG5hbWUgPSBjb25zdHJ1Y3Rvci5uYW1lLm5hbWU7CiAgICBjbHMuY29uc3RydWN0b3JzLmFkZChjb25zdHJ1Y3Rvcik7CiAgICBjb25zdHJ1Y3Rvci5wYXJlbnQgPSBjbHM7CiAgICBEaWxsTWVtYmVyQnVpbGRlciBtZW1iZXJCdWlsZGVyID0gbmV3IERpbGxNZW1iZXJCdWlsZGVyKGNvbnN0cnVjdG9yLCB0aGlzKTsKICAgIG1lbWJlckJ1aWxkZXIubmV4dCA9IGNvbnN0cnVjdG9yU2NvcGVCdWlsZGVyW25hbWVdOwogICAgY29uc3RydWN0b3JTY29wZUJ1aWxkZXIuYWRkTWVtYmVyKG5hbWUsIG1lbWJlckJ1aWxkZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGZpbmlzaFBhdGNoKCkgewogICAgaWYgKCFpc1BhdGNoKSByZXR1cm4gMDsKCiAgICAvLyBUT0RPKGFoZSk6IHJlc3RvcmUgZmlsZS1vZmZzZXQgb25jZSB3ZSB0cmFjayBib3RoIG9yaWdpbiBhbmQgcGF0Y2ggZmlsZQogICAgLy8gVVJJcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zMTU3OQogICAgY2xzLmFubm90YXRpb25zLmZvckVhY2goKG0pID0+IG0uZmlsZU9mZnNldCA9IG9yaWdpbi5jbHMuZmlsZU9mZnNldCk7CgogICAgaW50IGNvdW50ID0gMDsKICAgIHNjb3BlLmZvckVhY2goKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewogICAgICBjb3VudCArPSBkZWNsYXJhdGlvbi5maW5pc2hQYXRjaCgpOwogICAgfSk7CiAgICBjb25zdHJ1Y3RvcnMuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgICAgIGNvdW50ICs9IGRlY2xhcmF0aW9uLmZpbmlzaFBhdGNoKCk7CiAgICB9KTsKICAgIHJldHVybiBjb3VudDsKICB9CgogIExpc3Q8RGVjbGFyYXRpb24+IGNvbXB1dGVEaXJlY3RTdXBlcnR5cGVzKENsYXNzQnVpbGRlciBvYmplY3RDbGFzcykgewogICAgZmluYWwgTGlzdDxEZWNsYXJhdGlvbj4gcmVzdWx0ID0gPERlY2xhcmF0aW9uPltdOwogICAgZmluYWwgVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlID0gdGhpcy5zdXBlcnR5cGU7CiAgICBpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgcmVzdWx0LmFkZChzdXBlcnR5cGUuZGVjbGFyYXRpb24pOwogICAgfSBlbHNlIGlmIChvYmplY3RDbGFzcyAhPSB0aGlzKSB7CiAgICAgIHJlc3VsdC5hZGQob2JqZWN0Q2xhc3MpOwogICAgfQogICAgZmluYWwgTGlzdDxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlcyA9IHRoaXMuaW50ZXJmYWNlczsKICAgIGlmIChpbnRlcmZhY2VzICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgVHlwZUJ1aWxkZXIgaW50ZXJmYWNlID0gaW50ZXJmYWNlc1tpXTsKICAgICAgICByZXN1bHQuYWRkKGludGVyZmFjZS5kZWNsYXJhdGlvbik7CiAgICAgIH0KICAgIH0KICAgIGZpbmFsIFR5cGVCdWlsZGVyIG1peGVkSW5UeXBlID0gdGhpcy5taXhlZEluVHlwZTsKICAgIGlmIChtaXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgIHJlc3VsdC5hZGQobWl4ZWRJblR5cGUuZGVjbGFyYXRpb24pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIGludCBjb21wYXJlVG8oU291cmNlQ2xhc3NCdWlsZGVyIG90aGVyKSB7CiAgICBpbnQgcmVzdWx0ID0gIiRmaWxlVXJpIi5jb21wYXJlVG8oIiR7b3RoZXIuZmlsZVVyaX0iKTsKICAgIGlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIHJlc3VsdDsKICAgIHJldHVybiBjaGFyT2Zmc2V0LmNvbXBhcmVUbyhvdGhlci5jaGFyT2Zmc2V0KTsKICB9Cn0KgUIATk48ASQBIToBQgEdCRESLComJSwlLCQBJwkWJRUcGRweGhgZDxUdGwFIATYBFw8tESEZFBkVEhZQIjIrBC0hBDAnBAEOAgEuMAwZAUEBGwEbARYmFRMvHSQhExodIhsWGRIYKEY5Tz8BDCUBDDUBSj8LKjdQGhNRJgw4TEA1QiIMNTghQiUMEUM8CiglBgEiKSsaQR8nM0tJUDgaTxYUFCIGSRgGLxxFTRoGN04bIR40Nx5IIT41CggGAUIvIiROMUItIxRQHxcPFC04HxcICAE+LxxETxAIQEQqPEQqD0sqPEsqCAgBPj87RyhCLQgBLBAEATZGFTVDMCxENEQIBhs4NkMGFgQBOiknHlA4PAQBDBYcAU8/SgETOyoIQioIEgQBSDYyHSkmHwY6HjQvKwgGNh8rBhMEAQwsOyQzBAIBPHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2Uvc291cmNlX2NsYXNzX2J1aWxkZXIuZGFydD5zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc291cmNlL3NvdXJjZV9sb2FkZXIuZGFydMAAowYvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5zb3VyY2VfbG9hZGVyOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZTsKCmltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IHV0Zjg7CgppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEFyZ3VtZW50cywKICAgICAgICBCb3R0b21UeXBlLAogICAgICAgIENsYXNzLAogICAgICAgIENvbXBvbmVudCwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIExpYnJhcnksCiAgICAgICAgTGlicmFyeURlcGVuZGVuY3ksCiAgICAgICAgUHJvY2VkdXJlS2luZCwKICAgICAgICBTdXBlcnR5cGUsCiAgICAgICAgVHJlZU5vZGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JwogICAgc2hvdyBDbGFzc0hpZXJhcmNoeSwgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKCmltcG9ydCAnLi4vLi4vYXBpX3Byb3RvdHlwZS9maWxlX3N5c3RlbS5kYXJ0JzsKCmltcG9ydCAnLi4vLi4vYmFzZS9pbnN0cnVtZW50YXRpb24uZGFydCcgc2hvdyBJbnN0cnVtZW50YXRpb247CgppbXBvcnQgJy4uL2JsYWNrbGlzdGVkX2NsYXNzZXMuZGFydCcgc2hvdyBibGFja2xpc3RlZENvcmVDbGFzc2VzOwoKaW1wb3J0ICcuLi9leHBvcnQuZGFydCcgc2hvdyBFeHBvcnQ7CgppbXBvcnQgJy4uL2ltcG9ydC5kYXJ0JyBzaG93IEltcG9ydDsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICBNZXNzYWdlLAogICAgICAgIFN1bW1hcnlUZW1wbGF0ZSwKICAgICAgICBUZW1wbGF0ZSwKICAgICAgICBtZXNzYWdlT2JqZWN0RXh0ZW5kcywKICAgICAgICBtZXNzYWdlT2JqZWN0SW1wbGVtZW50cywKICAgICAgICBtZXNzYWdlT2JqZWN0TWl4ZXNJbiwKICAgICAgICBtZXNzYWdlUGFydE9ycGhhbiwKICAgICAgICBub0xlbmd0aCwKICAgICAgICB0ZW1wbGF0ZUFtYmlndW91c1N1cGVydHlwZXMsCiAgICAgICAgdGVtcGxhdGVDYW50UmVhZEZpbGUsCiAgICAgICAgdGVtcGxhdGVDeWNsaWNDbGFzc0hpZXJhcmNoeSwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0LAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlFeHBvcnRDb250ZXh0LAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlJbXBvcnQsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydENvbnRleHQsCiAgICAgICAgdGVtcGxhdGVFeHRlbmRpbmdFbnVtLAogICAgICAgIHRlbXBsYXRlRXh0ZW5kaW5nUmVzdHJpY3RlZCwKICAgICAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbiwKICAgICAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzLAogICAgICAgIHRlbXBsYXRlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZSwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVyaU1pc3NpbmdTY2hlbWUsCiAgICAgICAgdGVtcGxhdGVTb3VyY2VPdXRsaW5lU3VtbWFyeSwKICAgICAgICB0ZW1wbGF0ZVVudHJhbnNsYXRhYmxlVXJpOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX3NoYWRvd19hc3QuZGFydCcgc2hvdyBTaGFkb3dUeXBlSW5mZXJlbmNlRW5naW5lOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzc0J1aWxkZXIsCiAgICAgICAgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyLAogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIERlbGF5ZWRNZW1iZXIsCiAgICAgICAgRGVsYXllZE92ZXJyaWRlQ2hlY2ssCiAgICAgICAgRW51bUJ1aWxkZXIsCiAgICAgICAgRmllbGRCdWlsZGVyLAogICAgICAgIFByb2NlZHVyZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTWVtYmVyQnVpbGRlciwKICAgICAgICBOYW1lZFR5cGVCdWlsZGVyLAogICAgICAgIFR5cGVCdWlsZGVyOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX3RhcmdldC5kYXJ0JyBzaG93IEtlcm5lbFRhcmdldDsKCmltcG9ydCAnLi4va2VybmVsL2JvZHlfYnVpbGRlci5kYXJ0JyBzaG93IEJvZHlCdWlsZGVyOwoKaW1wb3J0ICcuLi9rZXJuZWwvdHJhbnNmb3JtX2NvbGxlY3Rpb25zLmRhcnQnIHNob3cgQ29sbGVjdGlvblRyYW5zZm9ybWVyOwoKaW1wb3J0ICcuLi9rZXJuZWwvdHJhbnNmb3JtX3NldF9saXRlcmFscy5kYXJ0JyBzaG93IFNldExpdGVyYWxUcmFuc2Zvcm1lcjsKCmltcG9ydCAnLi4va2VybmVsL3R5cGVfYnVpbGRlcl9jb21wdXRlci5kYXJ0JyBzaG93IFR5cGVCdWlsZGVyQ29tcHV0ZXI7CgppbXBvcnQgJy4uL2xvYWRlci5kYXJ0JyBzaG93IExvYWRlciwgdW50cmFuc2xhdGFibGVVcmlTY2hlbWU7CgppbXBvcnQgJy4uL3BhcnNlci9jbGFzc19tZW1iZXJfcGFyc2VyLmRhcnQnIHNob3cgQ2xhc3NNZW1iZXJQYXJzZXI7CgppbXBvcnQgJy4uL3BhcnNlci5kYXJ0JyBzaG93IFBhcnNlciwgbGVuZ3RoRm9yVG9rZW4sIG9mZnNldEZvclRva2VuOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IGludGVybmFsUHJvYmxlbTsKCmltcG9ydCAnLi4vc2Nhbm5lci5kYXJ0JwogICAgc2hvdwogICAgICAgIEVycm9yVG9rZW4sCiAgICAgICAgTGFuZ3VhZ2VWZXJzaW9uVG9rZW4sCiAgICAgICAgU2Nhbm5lckNvbmZpZ3VyYXRpb24sCiAgICAgICAgU2Nhbm5lclJlc3VsdCwKICAgICAgICBUb2tlbiwKICAgICAgICBzY2FuOwoKaW1wb3J0ICdkaWV0X2xpc3RlbmVyLmRhcnQnIHNob3cgRGlldExpc3RlbmVyOwoKaW1wb3J0ICdkaWV0X3BhcnNlci5kYXJ0JyBzaG93IERpZXRQYXJzZXI7CgppbXBvcnQgJ291dGxpbmVfYnVpbGRlci5kYXJ0JyBzaG93IE91dGxpbmVCdWlsZGVyOwoKaW1wb3J0ICdzb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUNsYXNzQnVpbGRlcjsKCmltcG9ydCAnc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUxpYnJhcnlCdWlsZGVyOwoKY2xhc3MgU291cmNlTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHsKICAvLy8gVGhlIFtGaWxlU3lzdGVtXSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBhY2Nlc3MgZmlsZXMuCiAgZmluYWwgRmlsZVN5c3RlbSBmaWxlU3lzdGVtOwoKICAvLy8gV2hldGhlciBjb21tZW50cyBzaG91bGQgYmUgc2Nhbm5lZCBhbmQgcGFyc2VkLgogIGZpbmFsIGJvb2wgaW5jbHVkZUNvbW1lbnRzOwoKICBmaW5hbCBNYXA8VXJpLCBMaXN0PGludD4+IHNvdXJjZUJ5dGVzID0gPFVyaSwgTGlzdDxpbnQ+Pnt9OwoKICBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgYnVpbGRlckhpZXJhcmNoeTsKCiAgLy8gVXNlZCB3aGVuIGJ1aWxkaW5nIGRpcmVjdGx5IHRvIGtlcm5lbC4KICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHk7CiAgQ29yZVR5cGVzIGNvcmVUeXBlczsKICAvLyBVc2VkIHdoZW4gY2hlY2tpbmcgd2hldGhlciBhIHJldHVybiB0eXBlIG9mIGFuIGFzeW5jIGZ1bmN0aW9uIGlzIHZhbGlkLgogIERhcnRUeXBlIGZ1dHVyZU9mQm90dG9tOwogIERhcnRUeXBlIGl0ZXJhYmxlT2ZCb3R0b207CiAgRGFydFR5cGUgc3RyZWFtT2ZCb3R0b207CgogIFNoYWRvd1R5cGVJbmZlcmVuY2VFbmdpbmUgdHlwZUluZmVyZW5jZUVuZ2luZTsKCiAgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbjsKCiAgQ29sbGVjdGlvblRyYW5zZm9ybWVyIGNvbGxlY3Rpb25UcmFuc2Zvcm1lcjsKCiAgU2V0TGl0ZXJhbFRyYW5zZm9ybWVyIHNldExpdGVyYWxUcmFuc2Zvcm1lcjsKCiAgU291cmNlTG9hZGVyKHRoaXMuZmlsZVN5c3RlbSwgdGhpcy5pbmNsdWRlQ29tbWVudHMsIEtlcm5lbFRhcmdldCB0YXJnZXQpCiAgICAgIDogc3VwZXIodGFyZ2V0KTsKCiAgVGVtcGxhdGU8U3VtbWFyeVRlbXBsYXRlPiBnZXQgb3V0bGluZVN1bW1hcnlUZW1wbGF0ZSA9PgogICAgICB0ZW1wbGF0ZVNvdXJjZU91dGxpbmVTdW1tYXJ5OwoKICBib29sIGdldCBpc1NvdXJjZUxvYWRlciA9PiB0cnVlOwoKICBGdXR1cmU8VG9rZW4+IHRva2VuaXplKFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnksCiAgICAgIHtib29sIHN1cHByZXNzTGV4aWNhbEVycm9yczogZmFsc2V9KSBhc3luYyB7CiAgICBVcmkgdXJpID0gbGlicmFyeS5maWxlVXJpOwoKICAgIC8vIExvb2t1cCB0aGUgZmlsZSBVUkkgaW4gdGhlIGNhY2hlLgogICAgTGlzdDxpbnQ+IGJ5dGVzID0gc291cmNlQnl0ZXNbdXJpXTsKCiAgICBpZiAoYnl0ZXMgPT0gbnVsbCkgewogICAgICAvLyBFcnJvciByZWNvdmVyeS4KICAgICAgaWYgKHVyaS5zY2hlbWUgPT0gdW50cmFuc2xhdGFibGVVcmlTY2hlbWUpIHsKICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSB0ZW1wbGF0ZVVudHJhbnNsYXRhYmxlVXJpLndpdGhBcmd1bWVudHMobGlicmFyeS51cmkpOwogICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbUF0QWNjZXNzb3JzKG1lc3NhZ2UpOwogICAgICAgIGJ5dGVzID0gc3ludGhlc2l6ZVNvdXJjZUZvck1pc3NpbmdGaWxlKGxpYnJhcnkudXJpLCBudWxsKTsKICAgICAgfSBlbHNlIGlmICghdXJpLmhhc1NjaGVtZSkgewogICAgICAgIHJldHVybiBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVXJpTWlzc2luZ1NjaGVtZS53aXRoQXJndW1lbnRzKHVyaSksCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICBsaWJyYXJ5LnVyaSk7CiAgICAgIH0gZWxzZSBpZiAodXJpLnNjaGVtZSA9PSBTb3VyY2VMaWJyYXJ5QnVpbGRlci5NQUxGT1JNRURfVVJJX1NDSEVNRSkgewogICAgICAgIGJ5dGVzID0gc3ludGhlc2l6ZVNvdXJjZUZvck1pc3NpbmdGaWxlKGxpYnJhcnkudXJpLCBudWxsKTsKICAgICAgfQogICAgICBpZiAoYnl0ZXMgIT0gbnVsbCkgewogICAgICAgIFVpbnQ4TGlzdCB6ZXJvVGVybWluYXRlZEJ5dGVzID0gbmV3IFVpbnQ4TGlzdChieXRlcy5sZW5ndGggKyAxKTsKICAgICAgICB6ZXJvVGVybWluYXRlZEJ5dGVzLnNldFJhbmdlKDAsIGJ5dGVzLmxlbmd0aCwgYnl0ZXMpOwogICAgICAgIGJ5dGVzID0gemVyb1Rlcm1pbmF0ZWRCeXRlczsKICAgICAgICBzb3VyY2VCeXRlc1t1cmldID0gYnl0ZXM7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoYnl0ZXMgPT0gbnVsbCkgewogICAgICAvLyBJZiBpdCBpc24ndCBmb3VuZCBpbiB0aGUgY2FjaGUsIHJlYWQgdGhlIGZpbGUgcmVhZCBmcm9tIHRoZSBmaWxlCiAgICAgIC8vIHN5c3RlbS4KICAgICAgTGlzdDxpbnQ+IHJhd0J5dGVzOwogICAgICB0cnkgewogICAgICAgIHJhd0J5dGVzID0gYXdhaXQgZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkodXJpKS5yZWFkQXNCeXRlcygpOwogICAgICB9IG9uIEZpbGVTeXN0ZW1FeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSB0ZW1wbGF0ZUNhbnRSZWFkRmlsZS53aXRoQXJndW1lbnRzKHVyaSwgZS5tZXNzYWdlKTsKICAgICAgICBsaWJyYXJ5LmFkZFByb2JsZW1BdEFjY2Vzc29ycyhtZXNzYWdlKTsKICAgICAgICByYXdCeXRlcyA9IHN5bnRoZXNpemVTb3VyY2VGb3JNaXNzaW5nRmlsZShsaWJyYXJ5LnVyaSwgbWVzc2FnZSk7CiAgICAgIH0KICAgICAgVWludDhMaXN0IHplcm9UZXJtaW5hdGVkQnl0ZXMgPSBuZXcgVWludDhMaXN0KHJhd0J5dGVzLmxlbmd0aCArIDEpOwogICAgICB6ZXJvVGVybWluYXRlZEJ5dGVzLnNldFJhbmdlKDAsIHJhd0J5dGVzLmxlbmd0aCwgcmF3Qnl0ZXMpOwogICAgICBieXRlcyA9IHplcm9UZXJtaW5hdGVkQnl0ZXM7CiAgICAgIHNvdXJjZUJ5dGVzW3VyaV0gPSBieXRlczsKICAgICAgYnl0ZUNvdW50ICs9IHJhd0J5dGVzLmxlbmd0aDsKICAgIH0KCiAgICBTY2FubmVyUmVzdWx0IHJlc3VsdCA9IHNjYW4oYnl0ZXMsCiAgICAgICAgaW5jbHVkZUNvbW1lbnRzOiBpbmNsdWRlQ29tbWVudHMsCiAgICAgICAgY29uZmlndXJhdGlvbjogbmV3IFNjYW5uZXJDb25maWd1cmF0aW9uKAogICAgICAgICAgICBlbmFibGVUcmlwbGVTaGlmdDogdGFyZ2V0LmVuYWJsZVRyaXBsZVNoaWZ0LAogICAgICAgICAgICBlbmFibGVFeHRlbnNpb25NZXRob2RzOiB0YXJnZXQuZW5hYmxlRXh0ZW5zaW9uTWV0aG9kcywKICAgICAgICAgICAgZW5hYmxlTm9uTnVsbGFibGU6IHRhcmdldC5lbmFibGVOb25OdWxsYWJsZSksCiAgICAgICAgbGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZDogKF8sIExhbmd1YWdlVmVyc2lvblRva2VuIHZlcnNpb24pIHsKICAgICAgLy8gVE9ETyhqZW5zaik6IFdoYXQgaWYgd2UgaGF2ZSBzZXZlcmFsPyBXaGF0IGlmIGl0IGlzIHVuc3VwcG9ydGVkPwogICAgICAvLyBXaGF0IGlmIHRoZSBsYW5ndWFnZSB2ZXJzaW9uIHdhcyBhbHJlYWR5IHNldCB2aWEgcGFja2FnZXMgYW5kIHRoaXMgaXMKICAgICAgLy8gaGlnaGVyPyBFdGMKICAgICAgbGlicmFyeS5zZXRMYW5ndWFnZVZlcnNpb24odmVyc2lvbi5tYWpvciwgdmVyc2lvbi5taW5vcik7CiAgICB9KTsKICAgIFRva2VuIHRva2VuID0gcmVzdWx0LnRva2VuczsKICAgIGlmICghc3VwcHJlc3NMZXhpY2FsRXJyb3JzKSB7CiAgICAgIExpc3Q8aW50PiBzb3VyY2UgPSBnZXRTb3VyY2UoYnl0ZXMpOwogICAgICBVcmkgaW1wb3J0VXJpID0gbGlicmFyeS51cmk7CiAgICAgIGlmIChsaWJyYXJ5LmlzUGF0Y2gpIHsKICAgICAgICAvLyBGb3IgcGF0Y2ggZmlsZXMgd2UgY3JlYXRlIGEgImZha2UiIGltcG9ydCB1cmkuCiAgICAgICAgLy8gV2UgY2Fubm90IHVzZSB0aGUgaW1wb3J0IHVyaSBmcm9tIHRoZSBwYXRjaGVkIGxpYmFyYXJ5IGJlY2F1c2UKICAgICAgICAvLyBzZXZlcmFsIGRpZmZlcmVudCBmaWxlcyB3b3VsZCB0aGVuIGhhdmUgdGhlIHNhbWUgaW1wb3J0IHVyaSwKICAgICAgICAvLyBhbmQgdGhlIFZNIGRvZXMgbm90IHN1cHBvcnQgdGhhdC4gQWxzbywgd2hhdCB3b3VsZCwgZm9yIGluc3RhbmNlLAogICAgICAgIC8vIHNldHRpbmcgYSBicmVha3BvaW50IG9uIGxpbmUgNDIgb2Ygc29tZSBpbXBvcnQgdXJpIG1lYW4sIGlmIHRoZSB1cmkKICAgICAgICAvLyByZXByZXNlbnRlZCBzZXZlcmFsIGZpbGVzPwogICAgICAgIExpc3Q8U3RyaW5nPiBuZXdQYXRoU2VnbWVudHMgPQogICAgICAgICAgICBuZXcgTGlzdDxTdHJpbmc+LmZyb20oaW1wb3J0VXJpLnBhdGhTZWdtZW50cyk7CiAgICAgICAgbmV3UGF0aFNlZ21lbnRzLmFkZChsaWJyYXJ5LmZpbGVVcmkucGF0aFNlZ21lbnRzLmxhc3QpOwogICAgICAgIG5ld1BhdGhTZWdtZW50c1swXSA9ICIke25ld1BhdGhTZWdtZW50c1swXX0tcGF0Y2giOwogICAgICAgIGltcG9ydFVyaSA9IGltcG9ydFVyaS5yZXBsYWNlKHBhdGhTZWdtZW50czogbmV3UGF0aFNlZ21lbnRzKTsKICAgICAgfQogICAgICB0YXJnZXQuYWRkU291cmNlSW5mb3JtYXRpb24oCiAgICAgICAgICBpbXBvcnRVcmksIGxpYnJhcnkuZmlsZVVyaSwgcmVzdWx0LmxpbmVTdGFydHMsIHNvdXJjZSk7CiAgICB9CiAgICB3aGlsZSAodG9rZW4gaXMgRXJyb3JUb2tlbikgewogICAgICBpZiAoIXN1cHByZXNzTGV4aWNhbEVycm9ycykgewogICAgICAgIEVycm9yVG9rZW4gZXJyb3IgPSB0b2tlbjsKICAgICAgICBsaWJyYXJ5LmFkZFByb2JsZW0oZXJyb3IuYXNzZXJ0aW9uTWVzc2FnZSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLAogICAgICAgICAgICBsZW5ndGhGb3JUb2tlbih0b2tlbiksIHVyaSk7CiAgICAgIH0KICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgTGlzdDxpbnQ+IHN5bnRoZXNpemVTb3VyY2VGb3JNaXNzaW5nRmlsZShVcmkgdXJpLCBNZXNzYWdlIG1lc3NhZ2UpIHsKICAgIHN3aXRjaCAoIiR1cmkiKSB7CiAgICAgIGNhc2UgImRhcnQ6Y29yZSI6CiAgICAgICAgcmV0dXJuIHV0ZjguZW5jb2RlKGRlZmF1bHREYXJ0Q29yZVNvdXJjZSk7CgogICAgICBjYXNlICJkYXJ0OmFzeW5jIjoKICAgICAgICByZXR1cm4gdXRmOC5lbmNvZGUoZGVmYXVsdERhcnRBc3luY1NvdXJjZSk7CgogICAgICBjYXNlICJkYXJ0OmNvbGxlY3Rpb24iOgogICAgICAgIHJldHVybiB1dGY4LmVuY29kZShkZWZhdWx0RGFydENvbGxlY3Rpb25Tb3VyY2UpOwoKICAgICAgY2FzZSAiZGFydDpfaW50ZXJuYWwiOgogICAgICAgIHJldHVybiB1dGY4LmVuY29kZShkZWZhdWx0RGFydEludGVybmFsU291cmNlKTsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIHV0ZjguZW5jb2RlKG1lc3NhZ2UgPT0gbnVsbCA/ICIiIDogIi8qICR7bWVzc2FnZS5tZXNzYWdlfSAqLyIpOwogICAgfQogIH0KCiAgTGlzdDxpbnQ+IGdldFNvdXJjZShMaXN0PGludD4gYnl0ZXMpIHsKICAgIC8vIGJ5dGVzIGlzIDAtdGVybWluYXRlZC4gV2UgZG9uJ3Qgd2FudCB0aGF0IGluY2x1ZGVkLgogICAgaWYgKGJ5dGVzIGlzIFVpbnQ4TGlzdCkgewogICAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdC52aWV3KAogICAgICAgICAgYnl0ZXMuYnVmZmVyLCBieXRlcy5vZmZzZXRJbkJ5dGVzLCBieXRlcy5sZW5ndGggLSAxKTsKICAgIH0KICAgIHJldHVybiBieXRlcy5zdWJsaXN0KDAsIGJ5dGVzLmxlbmd0aCAtIDEpOwogIH0KCiAgRnV0dXJlPE51bGw+IGJ1aWxkT3V0bGluZShTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSBhc3luYyB7CiAgICBUb2tlbiB0b2tlbnMgPSBhd2FpdCB0b2tlbml6ZShsaWJyYXJ5KTsKICAgIGlmICh0b2tlbnMgPT0gbnVsbCkgcmV0dXJuOwogICAgT3V0bGluZUJ1aWxkZXIgbGlzdGVuZXIgPSBuZXcgT3V0bGluZUJ1aWxkZXIobGlicmFyeSk7CiAgICBuZXcgQ2xhc3NNZW1iZXJQYXJzZXIobGlzdGVuZXIpLnBhcnNlVW5pdCh0b2tlbnMpOwogIH0KCiAgRnV0dXJlPE51bGw+IGJ1aWxkQm9keShMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSBhc3luYyB7CiAgICBpZiAobGlicmFyeSBpcyBTb3VyY2VMaWJyYXJ5QnVpbGRlcikgewogICAgICAvLyBXZSB0b2tlbml6ZSBzb3VyY2UgZmlsZXMgdHdpY2UgdG8ga2VlcCBtZW1vcnkgdXNhZ2UgbG93LiBUaGlzIGlzIHRoZQogICAgICAvLyBzZWNvbmQgdGltZSwgYW5kIHRoZSBmaXJzdCB0aW1lIHdhcyBpbiBbYnVpbGRPdXRsaW5lXSBhYm92ZS4gU28gdGhpcwogICAgICAvLyB0aW1lIHdlIHN1cHByZXNzIGxleGljYWwgZXJyb3JzLgogICAgICBUb2tlbiB0b2tlbnMgPSBhd2FpdCB0b2tlbml6ZShsaWJyYXJ5LCBzdXBwcmVzc0xleGljYWxFcnJvcnM6IHRydWUpOwogICAgICBpZiAodG9rZW5zID09IG51bGwpIHJldHVybjsKICAgICAgRGlldExpc3RlbmVyIGxpc3RlbmVyID0gY3JlYXRlRGlldExpc3RlbmVyKGxpYnJhcnkpOwogICAgICBEaWV0UGFyc2VyIHBhcnNlciA9IG5ldyBEaWV0UGFyc2VyKGxpc3RlbmVyKTsKICAgICAgcGFyc2VyLnBhcnNlVW5pdCh0b2tlbnMpOwogICAgICBmb3IgKFNvdXJjZUxpYnJhcnlCdWlsZGVyIHBhcnQgaW4gbGlicmFyeS5wYXJ0cykgewogICAgICAgIGlmIChwYXJ0LnBhcnRPZkxpYnJhcnkgIT0gbGlicmFyeSkgewogICAgICAgICAgLy8gUGFydCB3YXMgaW5jbHVkZWQgaW4gbXVsdGlwbGUgbGlicmFyaWVzLiBTa2lwIGl0IGhlcmUuCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgVG9rZW4gdG9rZW5zID0gYXdhaXQgdG9rZW5pemUocGFydCk7CiAgICAgICAgaWYgKHRva2VucyAhPSBudWxsKSB7CiAgICAgICAgICBsaXN0ZW5lci51cmkgPSBwYXJ0LmZpbGVVcmk7CiAgICAgICAgICBwYXJzZXIucGFyc2VVbml0KHRva2Vucyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBGdXR1cmU8RXhwcmVzc2lvbj4gYnVpbGRFeHByZXNzaW9uKAogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LAogICAgICBTdHJpbmcgZW5jbG9zaW5nQ2xhc3MsCiAgICAgIGJvb2wgaXNJbnN0YW5jZU1lbWJlciwKICAgICAgRnVuY3Rpb25Ob2RlIHBhcmFtZXRlcnMpIGFzeW5jIHsKICAgIFRva2VuIHRva2VuID0gYXdhaXQgdG9rZW5pemUobGlicmFyeSwgc3VwcHJlc3NMZXhpY2FsRXJyb3JzOiBmYWxzZSk7CiAgICBpZiAodG9rZW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBEaWV0TGlzdGVuZXIgZGlldExpc3RlbmVyID0gY3JlYXRlRGlldExpc3RlbmVyKGxpYnJhcnkpOwoKICAgIERlY2xhcmF0aW9uIHBhcmVudCA9IGxpYnJhcnk7CiAgICBpZiAoZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICBEZWNsYXJhdGlvbiBjbHMgPQogICAgICAgICAgZGlldExpc3RlbmVyLm1lbWJlclNjb3BlLmxvb2t1cChlbmNsb3NpbmdDbGFzcywgLTEsIG51bGwpOwogICAgICBpZiAoY2xzIGlzIENsYXNzQnVpbGRlcikgewogICAgICAgIHBhcmVudCA9IGNsczsKICAgICAgICBkaWV0TGlzdGVuZXIKICAgICAgICAgIC4uY3VycmVudENsYXNzID0gY2xzCiAgICAgICAgICAuLm1lbWJlclNjb3BlID0gY2xzLnNjb3BlLmNvcHlXaXRoUGFyZW50KAogICAgICAgICAgICAgIGRpZXRMaXN0ZW5lci5tZW1iZXJTY29wZS53aXRoVHlwZVZhcmlhYmxlcyhjbHMudHlwZVZhcmlhYmxlcyksCiAgICAgICAgICAgICAgImRlYnVnRXhwcmVzc2lvbiBpbiAkZW5jbG9zaW5nQ2xhc3MiKTsKICAgICAgfQogICAgfQogICAgUHJvY2VkdXJlQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2NlZHVyZUJ1aWxkZXIobnVsbCwgMCwgbnVsbCwgImRlYnVnRXhwciIsCiAgICAgICAgbnVsbCwgbnVsbCwgUHJvY2VkdXJlS2luZC5NZXRob2QsIGxpYnJhcnksIDAsIDAsIC0xLCAtMSkKICAgICAgLi5wYXJlbnQgPSBwYXJlbnQ7CiAgICBCb2R5QnVpbGRlciBsaXN0ZW5lciA9IGRpZXRMaXN0ZW5lci5jcmVhdGVMaXN0ZW5lcigKICAgICAgICBidWlsZGVyLCBkaWV0TGlzdGVuZXIubWVtYmVyU2NvcGUsIGlzSW5zdGFuY2VNZW1iZXIpOwoKICAgIHJldHVybiBsaXN0ZW5lci5wYXJzZVNpbmdsZUV4cHJlc3Npb24oCiAgICAgICAgbmV3IFBhcnNlcihsaXN0ZW5lciksIHRva2VuLCBwYXJhbWV0ZXJzKTsKICB9CgogIEtlcm5lbFRhcmdldCBnZXQgdGFyZ2V0ID0+IHN1cGVyLnRhcmdldDsKCiAgRGlldExpc3RlbmVyIGNyZWF0ZURpZXRMaXN0ZW5lcihTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICByZXR1cm4gbmV3IERpZXRMaXN0ZW5lcihsaWJyYXJ5LCBoaWVyYXJjaHksIGNvcmVUeXBlcywgdHlwZUluZmVyZW5jZUVuZ2luZSk7CiAgfQoKICB2b2lkIHJlc29sdmVQYXJ0cygpIHsKICAgIExpc3Q8VXJpPiBwYXJ0cyA9IDxVcmk+W107CiAgICBMaXN0PFNvdXJjZUxpYnJhcnlCdWlsZGVyPiBsaWJyYXJpZXMgPSA8U291cmNlTGlicmFyeUJ1aWxkZXI+W107CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgaWYgKGxpYnJhcnkuaXNQYXJ0KSB7CiAgICAgICAgICBwYXJ0cy5hZGQodXJpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGlicmFyaWVzLmFkZChsaWJyYXJ5KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgU2V0PFVyaT4gdXNlZFBhcnRzID0gbmV3IFNldDxVcmk+KCk7CiAgICBmb3IgKFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkgaW4gbGlicmFyaWVzKSB7CiAgICAgIGxpYnJhcnkuaW5jbHVkZVBhcnRzKHVzZWRQYXJ0cyk7CiAgICB9CiAgICBmb3IgKFVyaSB1cmkgaW4gcGFydHMpIHsKICAgICAgaWYgKHVzZWRQYXJ0cy5jb250YWlucyh1cmkpKSB7CiAgICAgICAgYnVpbGRlcnMucmVtb3ZlKHVyaSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgcGFydCA9IGJ1aWxkZXJzW3VyaV07CiAgICAgICAgcGFydC5hZGRQcm9ibGVtKG1lc3NhZ2VQYXJ0T3JwaGFuLCAwLCAxLCBwYXJ0LmZpbGVVcmkpOwogICAgICAgIHBhcnQudmFsaWRhdGVQYXJ0KG51bGwsIG51bGwpOwogICAgICB9CiAgICB9CiAgICB0aWNrZXIubG9nTXMoIlJlc29sdmVkIHBhcnRzIik7CgogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIGxpYnJhcnkuYXBwbHlQYXRjaGVzKCk7CiAgICAgIH0KICAgIH0pOwogICAgdGlja2VyLmxvZ01zKCJBcHBsaWVkIHBhdGNoZXMiKTsKICB9CgogIHZvaWQgY29tcHV0ZUxpYnJhcnlTY29wZXMoKSB7CiAgICBTZXQ8TGlicmFyeUJ1aWxkZXI+IGV4cG9ydGVycyA9IG5ldyBTZXQ8TGlicmFyeUJ1aWxkZXI+KCk7CiAgICBTZXQ8TGlicmFyeUJ1aWxkZXI+IGV4cG9ydGVlcyA9IG5ldyBTZXQ8TGlicmFyeUJ1aWxkZXI+KCk7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgc291cmNlTGlicmFyeSA9IGxpYnJhcnk7CiAgICAgICAgc291cmNlTGlicmFyeS5idWlsZEluaXRpYWxTY29wZXMoKTsKICAgICAgfQogICAgICBpZiAobGlicmFyeS5leHBvcnRlcnMuaXNOb3RFbXB0eSkgewogICAgICAgIGV4cG9ydGVlcy5hZGQobGlicmFyeSk7CiAgICAgICAgZm9yIChFeHBvcnQgZXhwb3J0ZXIgaW4gbGlicmFyeS5leHBvcnRlcnMpIHsKICAgICAgICAgIGV4cG9ydGVycy5hZGQoZXhwb3J0ZXIuZXhwb3J0ZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBTZXQ8U291cmNlTGlicmFyeUJ1aWxkZXI+IGJvdGggPSBuZXcgU2V0PFNvdXJjZUxpYnJhcnlCdWlsZGVyPigpOwogICAgZm9yIChMaWJyYXJ5QnVpbGRlciBleHBvcnRlZCBpbiBleHBvcnRlZXMpIHsKICAgICAgaWYgKGV4cG9ydGVycy5jb250YWlucyhleHBvcnRlZCkpIHsKICAgICAgICBib3RoLmFkZChleHBvcnRlZCk7CiAgICAgIH0KICAgICAgZm9yIChFeHBvcnQgZXhwb3J0IGluIGV4cG9ydGVkLmV4cG9ydGVycykgewogICAgICAgIGV4cG9ydGVkLmV4cG9ydFNjb3BlLmZvckVhY2goZXhwb3J0LmFkZFRvRXhwb3J0U2NvcGUpOwogICAgICB9CiAgICB9CiAgICBib29sIHdhc0NoYW5nZWQgPSBmYWxzZTsKICAgIGRvIHsKICAgICAgd2FzQ2hhbmdlZCA9IGZhbHNlOwogICAgICBmb3IgKFNvdXJjZUxpYnJhcnlCdWlsZGVyIGV4cG9ydGVkIGluIGJvdGgpIHsKICAgICAgICBmb3IgKEV4cG9ydCBleHBvcnQgaW4gZXhwb3J0ZWQuZXhwb3J0ZXJzKSB7CiAgICAgICAgICBleHBvcnRlZC5leHBvcnRTY29wZS5mb3JFYWNoKChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gbWVtYmVyKSB7CiAgICAgICAgICAgIGlmIChleHBvcnQuYWRkVG9FeHBvcnRTY29wZShuYW1lLCBtZW1iZXIpKSB7CiAgICAgICAgICAgICAgd2FzQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfSB3aGlsZSAod2FzQ2hhbmdlZCk7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgc291cmNlTGlicmFyeSA9IGxpYnJhcnk7CiAgICAgICAgc291cmNlTGlicmFyeS5hZGRJbXBvcnRzVG9TY29wZSgpOwogICAgICB9CiAgICB9KTsKICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgZXhwb3J0ZWUgaW4gZXhwb3J0ZWVzKSB7CiAgICAgIC8vIFRPRE8oYWhlKTogQ2hhbmdlIGhvdyB3ZSB0cmFjayBleHBvcnRlcnMuIEN1cnJlbnRseSwgd2hlbiBhIGxpYnJhcnkKICAgICAgLy8gKGV4cG9ydGVyKSBleHBvcnRzIGFub3RoZXIgbGlicmFyeSAoZXhwb3J0ZWUpIHdlIGFkZCBhIHJlZmVyZW5jZSB0bwogICAgICAvLyBleHBvcnRlciB0byBleHBvcnRlZS4gVGhpcyBjcmVhdGVzIGEgcmVmZXJlbmNlIGluIHRoZSB3cm9uZyBkaXJlY3Rpb24KICAgICAgLy8gYW5kIGNhbiBsZWFkIHRvIG1lbW9yeSBsZWFrcy4KICAgICAgZXhwb3J0ZWUuZXhwb3J0ZXJzLmNsZWFyKCk7CiAgICB9CiAgICB0aWNrZXIubG9nTXMoIkNvbXB1dGVkIGxpYnJhcnkgc2NvcGVzIik7CiAgICAvLyBkZWJ1Z1ByaW50RXhwb3J0cygpOwogIH0KCiAgdm9pZCBkZWJ1Z1ByaW50RXhwb3J0cygpIHsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IHNob3VsZCBiZSBgY292YXJpbnQgU291cmNlTGlicmFyeUJ1aWxkZXJgLgogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgZHluYW1pYyBsKSB7CiAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBsOwogICAgICBTZXQ8RGVjbGFyYXRpb24+IG1lbWJlcnMgPSBuZXcgU2V0PERlY2xhcmF0aW9uPigpOwogICAgICBJdGVyYXRvcjxEZWNsYXJhdGlvbj4gaXRlcmF0b3IgPSBsaWJyYXJ5Lml0ZXJhdG9yOwogICAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgIG1lbWJlcnMuYWRkKGl0ZXJhdG9yLmN1cnJlbnQpOwogICAgICB9CiAgICAgIExpc3Q8U3RyaW5nPiBleHBvcnRzID0gPFN0cmluZz5bXTsKICAgICAgbGlicmFyeS5leHBvcnRTY29wZS5mb3JFYWNoKChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gbWVtYmVyKSB7CiAgICAgICAgd2hpbGUgKG1lbWJlciAhPSBudWxsKSB7CiAgICAgICAgICBpZiAoIW1lbWJlcnMuY29udGFpbnMobWVtYmVyKSkgewogICAgICAgICAgICBleHBvcnRzLmFkZChuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIG1lbWJlciA9IG1lbWJlci5uZXh0OwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmIChleHBvcnRzLmlzTm90RW1wdHkpIHsKICAgICAgICBwcmludCgiJHVyaSBleHBvcnRzICRleHBvcnRzIik7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCByZXNvbHZlVHlwZXMoKSB7CiAgICBpbnQgdHlwZUNvdW50ID0gMDsKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBzb3VyY2VMaWJyYXJ5ID0gbGlicmFyeTsKICAgICAgICB0eXBlQ291bnQgKz0gc291cmNlTGlicmFyeS5yZXNvbHZlVHlwZXMoKTsKICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIlJlc29sdmVkICR0eXBlQ291bnQgdHlwZXMiKTsKICB9CgogIHZvaWQgZmluYWxpemVJbml0aWFsaXppbmdGb3JtYWxzKCkgewogICAgaW50IGZvcm1hbENvdW50ID0gMDsKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBzb3VyY2VMaWJyYXJ5ID0gbGlicmFyeTsKICAgICAgICBmb3JtYWxDb3VudCArPSBzb3VyY2VMaWJyYXJ5LmZpbmFsaXplSW5pdGlhbGl6aW5nRm9ybWFscygpOwogICAgICB9CiAgICB9KTsKICAgIHRpY2tlci5sb2dNcygiRmluYWxpemVkICRmb3JtYWxDb3VudCBpbml0aWFsaXppbmcgZm9ybWFscyIpOwogIH0KCiAgdm9pZCBmaW5pc2hEZWZlcnJlZExvYWRUZWFyb2ZmcygpIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgY291bnQgKz0gbGlicmFyeS5maW5pc2hEZWZlcnJlZExvYWRUZWFyb2ZmcygpOwogICAgICB9CiAgICB9KTsKICAgIHRpY2tlci5sb2dNcygiRmluaXNoZWQgZGVmZXJyZWQgbG9hZCB0ZWFyb2ZmcyAkY291bnQiKTsKICB9CgogIHZvaWQgZmluaXNoTm9TdWNoTWV0aG9kRm9yd2FyZGVycygpIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgY291bnQgKz0gbGlicmFyeS5maW5pc2hGb3J3YXJkZXJzKCk7CiAgICAgIH0KICAgIH0pOwogICAgdGlja2VyLmxvZ01zKCJGaW5pc2hlZCBmb3J3YXJkZXJzIGZvciAkY291bnQgcHJvY2VkdXJlcyIpOwogIH0KCiAgdm9pZCByZXNvbHZlQ29uc3RydWN0b3JzKCkgewogICAgaW50IGNvdW50ID0gMDsKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICBjb3VudCArPSBsaWJyYXJ5LnJlc29sdmVDb25zdHJ1Y3RvcnMobnVsbCk7CiAgICAgIH0KICAgIH0pOwogICAgdGlja2VyLmxvZ01zKCJSZXNvbHZlZCAkY291bnQgY29uc3RydWN0b3JzIik7CiAgfQoKICB2b2lkIGZpbmlzaFR5cGVWYXJpYWJsZXMoQ2xhc3NCdWlsZGVyIG9iamVjdCwgVHlwZUJ1aWxkZXIgZHluYW1pY1R5cGUpIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgY291bnQgKz0gbGlicmFyeS5maW5pc2hUeXBlVmFyaWFibGVzKG9iamVjdCwgZHluYW1pY1R5cGUpOwogICAgICB9CiAgICB9KTsKICAgIHRpY2tlci5sb2dNcygiUmVzb2x2ZWQgJGNvdW50IHR5cGUtdmFyaWFibGUgYm91bmRzIik7CiAgfQoKICB2b2lkIGNvbXB1dGVEZWZhdWx0VHlwZXMoVHlwZUJ1aWxkZXIgZHluYW1pY1R5cGUsIFR5cGVCdWlsZGVyIGJvdHRvbVR5cGUsCiAgICAgIENsYXNzQnVpbGRlciBvYmplY3RDbGFzcykgewogICAgaW50IGNvdW50ID0gMDsKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICBjb3VudCArPQogICAgICAgICAgICBsaWJyYXJ5LmNvbXB1dGVEZWZhdWx0VHlwZXMoZHluYW1pY1R5cGUsIGJvdHRvbVR5cGUsIG9iamVjdENsYXNzKTsKICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIkNvbXB1dGVkIGRlZmF1bHQgdHlwZXMgZm9yICRjb3VudCB0eXBlIHZhcmlhYmxlcyIpOwogIH0KCiAgdm9pZCBmaW5pc2hOYXRpdmVNZXRob2RzKCkgewogICAgaW50IGNvdW50ID0gMDsKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICBjb3VudCArPSBsaWJyYXJ5LmZpbmlzaE5hdGl2ZU1ldGhvZHMoKTsKICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIkZpbmlzaGVkICRjb3VudCBuYXRpdmUgbWV0aG9kcyIpOwogIH0KCiAgdm9pZCBmaW5pc2hQYXRjaE1ldGhvZHMoKSB7CiAgICBpbnQgY291bnQgPSAwOwogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIGNvdW50ICs9IGxpYnJhcnkuZmluaXNoUGF0Y2hNZXRob2RzKCk7CiAgICAgIH0KICAgIH0pOwogICAgdGlja2VyLmxvZ01zKCJGaW5pc2hlZCAkY291bnQgcGF0Y2ggbWV0aG9kcyIpOwogIH0KCiAgLy8vIENoZWNrIHRoYXQgW29iamVjdENsYXNzXSBoYXMgbm8gc3VwZXJ0eXBlcy4gUmVjb3ZlciBieSByZW1vdmluZyBhbnkKICAvLy8gZm91bmQuCiAgdm9pZCBjaGVja09iamVjdENsYXNzSGllcmFyY2h5KENsYXNzQnVpbGRlciBvYmplY3RDbGFzcykgewogICAgaWYgKG9iamVjdENsYXNzIGlzIFNvdXJjZUNsYXNzQnVpbGRlciAmJgogICAgICAgIG9iamVjdENsYXNzLmxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgaWYgKG9iamVjdENsYXNzLnN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgICAgb2JqZWN0Q2xhc3Muc3VwZXJ0eXBlID0gbnVsbDsKICAgICAgICBvYmplY3RDbGFzcy5hZGRQcm9ibGVtKAogICAgICAgICAgICBtZXNzYWdlT2JqZWN0RXh0ZW5kcywgb2JqZWN0Q2xhc3MuY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgICB9CiAgICAgIGlmIChvYmplY3RDbGFzcy5pbnRlcmZhY2VzICE9IG51bGwpIHsKICAgICAgICBvYmplY3RDbGFzcy5hZGRQcm9ibGVtKAogICAgICAgICAgICBtZXNzYWdlT2JqZWN0SW1wbGVtZW50cywgb2JqZWN0Q2xhc3MuY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgICAgIG9iamVjdENsYXNzLmludGVyZmFjZXMgPSBudWxsOwogICAgICB9CiAgICAgIGlmIChvYmplY3RDbGFzcy5taXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgICAgb2JqZWN0Q2xhc3MuYWRkUHJvYmxlbSgKICAgICAgICAgICAgbWVzc2FnZU9iamVjdE1peGVzSW4sIG9iamVjdENsYXNzLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKICAgICAgICBvYmplY3RDbGFzcy5taXhlZEluVHlwZSA9IG51bGw7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgY2xhc3MgYnVpbGRlcnMgZGVjbGFyZWQgaW4gdGhpcyBsb2FkZXIuICBBcyB0aGUKICAvLy8gY2xhc3NlcyBhcmUgc29ydGVkLCBhbnkgY3ljbGVzIGluIHRoZSBoaWVhcmNoeSBhcmUgcmVwb3J0ZWQgYXMKICAvLy8gZXJyb3JzLiBSZWNvdmVyIGJ5IGJyZWFraW5nIHRoZSBjeWNsZXMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmVzdCBvZiB0aGUKICAvLy8gcGlwZWxpbmUgKGluY2x1ZGluZyBiYWNrZW5kcykgY2FuIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBubyBoaWVyYXJjaHkKICAvLy8gY3ljbGVzLgogIExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBoYW5kbGVIaWVyYXJjaHlDeWNsZXMoQ2xhc3NCdWlsZGVyIG9iamVjdENsYXNzKSB7CiAgICAvLyBDb21wdXRlIHRoZSBpbml0aWFsIHdvcmsgbGlzdCBvZiBhbGwgY2xhc3NlcyBkZWNsYXJlZCBpbiB0aGlzIGxvYWRlci4KICAgIExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiB3b3JrTGlzdCA9IDxTb3VyY2VDbGFzc0J1aWxkZXI+W107CiAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgaW4gYnVpbGRlcnMudmFsdWVzKSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgSXRlcmF0b3I8RGVjbGFyYXRpb24+IG1lbWJlcnMgPSBsaWJyYXJ5Lml0ZXJhdG9yOwogICAgICAgIHdoaWxlIChtZW1iZXJzLm1vdmVOZXh0KCkpIHsKICAgICAgICAgIERlY2xhcmF0aW9uIG1lbWJlciA9IG1lbWJlcnMuY3VycmVudDsKICAgICAgICAgIGlmIChtZW1iZXIgaXMgU291cmNlQ2xhc3NCdWlsZGVyKSB7CiAgICAgICAgICAgIHdvcmtMaXN0LmFkZChtZW1iZXIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIFNldDxDbGFzc0J1aWxkZXI+IGJsYWNrTGlzdGVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NCdWlsZGVyPigpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibGFja2xpc3RlZENvcmVDbGFzc2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGJsYWNrTGlzdGVkQ2xhc3NlcwogICAgICAgICAgLmFkZChjb3JlTGlicmFyeS5nZXRMb2NhbE1lbWJlcihibGFja2xpc3RlZENvcmVDbGFzc2VzW2ldKSk7CiAgICB9CgogICAgLy8gU29ydCB0aGUgY2xhc3NlcyB0b3BvbG9naWNhbGx5LgogICAgU2V0PFNvdXJjZUNsYXNzQnVpbGRlcj4gdG9wb2xvZ2ljYWxseVNvcnRlZENsYXNzZXMgPQogICAgICAgIG5ldyBTZXQ8U291cmNlQ2xhc3NCdWlsZGVyPigpOwogICAgTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IHByZXZpb3VzV29ya0xpc3Q7CiAgICBkbyB7CiAgICAgIHByZXZpb3VzV29ya0xpc3QgPSB3b3JrTGlzdDsKICAgICAgd29ya0xpc3QgPSA8U291cmNlQ2xhc3NCdWlsZGVyPltdOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByZXZpb3VzV29ya0xpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBTb3VyY2VDbGFzc0J1aWxkZXIgY2xzID0gcHJldmlvdXNXb3JrTGlzdFtpXTsKICAgICAgICBMaXN0PERlY2xhcmF0aW9uPiBkaXJlY3RTdXBlcnR5cGVzID0KICAgICAgICAgICAgY2xzLmNvbXB1dGVEaXJlY3RTdXBlcnR5cGVzKG9iamVjdENsYXNzKTsKICAgICAgICBib29sIGFsbFN1cGVydHlwZXNQcm9jZXNzZWQgPSB0cnVlOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0U3VwZXJ0eXBlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgRGVjbGFyYXRpb24gc3VwZXJ0eXBlID0gZGlyZWN0U3VwZXJ0eXBlc1tpXTsKICAgICAgICAgIGlmIChzdXBlcnR5cGUgaXMgU291cmNlQ2xhc3NCdWlsZGVyICYmCiAgICAgICAgICAgICAgc3VwZXJ0eXBlLmxpYnJhcnkubG9hZGVyID09IHRoaXMgJiYKICAgICAgICAgICAgICAhdG9wb2xvZ2ljYWxseVNvcnRlZENsYXNzZXMuY29udGFpbnMoc3VwZXJ0eXBlKSkgewogICAgICAgICAgICBhbGxTdXBlcnR5cGVzUHJvY2Vzc2VkID0gZmFsc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoYWxsU3VwZXJ0eXBlc1Byb2Nlc3NlZCAmJiBjbHMuaXNQYXRjaCkgewogICAgICAgICAgYWxsU3VwZXJ0eXBlc1Byb2Nlc3NlZCA9CiAgICAgICAgICAgICAgdG9wb2xvZ2ljYWxseVNvcnRlZENsYXNzZXMuY29udGFpbnMoY2xzLm9yaWdpbik7CiAgICAgICAgfQogICAgICAgIGlmIChhbGxTdXBlcnR5cGVzUHJvY2Vzc2VkKSB7CiAgICAgICAgICB0b3BvbG9naWNhbGx5U29ydGVkQ2xhc3Nlcy5hZGQoY2xzKTsKICAgICAgICAgIGNoZWNrQ2xhc3NTdXBlcnR5cGVzKGNscywgZGlyZWN0U3VwZXJ0eXBlcywgYmxhY2tMaXN0ZWRDbGFzc2VzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgd29ya0xpc3QuYWRkKGNscyk7CiAgICAgICAgfQogICAgICB9CiAgICB9IHdoaWxlIChwcmV2aW91c1dvcmtMaXN0Lmxlbmd0aCAhPSB3b3JrTGlzdC5sZW5ndGgpOwogICAgTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IGNsYXNzZXMgPSB0b3BvbG9naWNhbGx5U29ydGVkQ2xhc3Nlcy50b0xpc3QoKTsKICAgIExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBjbGFzc2VzV2l0aEN5Y2xlcyA9IHByZXZpb3VzV29ya0xpc3Q7CgogICAgLy8gT25jZSB0aGUgd29yayBsaXN0IGRvZXNuJ3QgY2hhbmdlIGluIHNpemUsIGl0J3MgZWl0aGVyIGVtcHR5LCBvcgogICAgLy8gY29udGFpbnMgYWxsIGNsYXNzZXMgd2l0aCBjeWNsZXMuCgogICAgLy8gU29ydCB0aGUgY2xhc3NlcyB0byBlbnN1cmUgY29uc2lzdGVudCBvdXRwdXQuCiAgICBjbGFzc2VzV2l0aEN5Y2xlcy5zb3J0KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXNXaXRoQ3ljbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFNvdXJjZUNsYXNzQnVpbGRlciBjbHMgPSBjbGFzc2VzV2l0aEN5Y2xlc1tpXTsKICAgICAgdGFyZ2V0LmJyZWFrQ3ljbGUoY2xzKTsKICAgICAgY2xhc3Nlcy5hZGQoY2xzKTsKICAgICAgY2xzLmFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUN5Y2xpY0NsYXNzSGllcmFyY2h5LndpdGhBcmd1bWVudHMoY2xzLmZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgIGNscy5jaGFyT2Zmc2V0LAogICAgICAgICAgbm9MZW5ndGgpOwogICAgfQoKICAgIHRpY2tlci5sb2dNcygiQ2hlY2tlZCBjbGFzcyBoaWVyYXJjaHkiKTsKICAgIHJldHVybiBjbGFzc2VzOwogIH0KCiAgdm9pZCBjaGVja0NsYXNzU3VwZXJ0eXBlcygKICAgICAgU291cmNlQ2xhc3NCdWlsZGVyIGNscywKICAgICAgTGlzdDxEZWNsYXJhdGlvbj4gZGlyZWN0U3VwZXJ0eXBlcywKICAgICAgU2V0PENsYXNzQnVpbGRlcj4gYmxhY2tMaXN0ZWRDbGFzc2VzKSB7CiAgICAvLyBDaGVjayB0aGF0IHRoZSBkaXJlY3Qgc3VwZXJ0eXBlcyBhcmVuJ3QgYmxhY2stbGlzdGVkIG9yIGVudW1zLgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3RTdXBlcnR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIERlY2xhcmF0aW9uIHN1cGVydHlwZSA9IGRpcmVjdFN1cGVydHlwZXNbaV07CiAgICAgIGlmIChzdXBlcnR5cGUgaXMgRW51bUJ1aWxkZXIpIHsKICAgICAgICBjbHMuYWRkUHJvYmxlbSh0ZW1wbGF0ZUV4dGVuZGluZ0VudW0ud2l0aEFyZ3VtZW50cyhzdXBlcnR5cGUubmFtZSksCiAgICAgICAgICAgIGNscy5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgIH0gZWxzZSBpZiAoIWNscy5saWJyYXJ5Lm1heUltcGxlbWVudFJlc3RyaWN0ZWRUeXBlcyAmJgogICAgICAgICAgYmxhY2tMaXN0ZWRDbGFzc2VzLmNvbnRhaW5zKHN1cGVydHlwZSkpIHsKICAgICAgICBjbHMuYWRkUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVFeHRlbmRpbmdSZXN0cmljdGVkCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhzdXBlcnR5cGUuZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgICBjbHMuY2hhck9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICB9CiAgICB9CgogICAgLy8gQ2hlY2sgdGhhdCB0aGUgbWl4ZWQtaW4gdHlwZSBjYW4gYmUgdXNlZCBhcyBhIG1peGluLgogICAgZmluYWwgVHlwZUJ1aWxkZXIgbWl4ZWRJblR5cGUgPSBjbHMubWl4ZWRJblR5cGU7CiAgICBpZiAobWl4ZWRJblR5cGUgIT0gbnVsbCkgewogICAgICBib29sIGlzQ2xhc3NCdWlsZGVyID0gZmFsc2U7CiAgICAgIGlmIChtaXhlZEluVHlwZSBpcyBOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICAgICAgdmFyIGJ1aWxkZXIgPSBtaXhlZEluVHlwZS5kZWNsYXJhdGlvbjsKICAgICAgICBpZiAoYnVpbGRlciBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgICAgIGlzQ2xhc3NCdWlsZGVyID0gdHJ1ZTsKICAgICAgICAgIGZvciAoRGVjbGFyYXRpb24gY29uc3RydWN0b3J5IGluIGJ1aWxkZXIuY29uc3RydWN0b3JzLmxvY2FsLnZhbHVlcykgewogICAgICAgICAgICBpZiAoY29uc3RydWN0b3J5LmlzQ29uc3RydWN0b3IgJiYgIWNvbnN0cnVjdG9yeS5pc1N5bnRoZXRpYykgewogICAgICAgICAgICAgIGNscy5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhidWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgICAgICAgICAgY2xzLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0NhdXNlCiAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGJ1aWxkZXIuZnVsbE5hbWVGb3JFcnJvcnMpCiAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oY29uc3RydWN0b3J5LmZpbGVVcmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcnkuY2hhck9mZnNldCwgbm9MZW5ndGgpCiAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghaXNDbGFzc0J1aWxkZXIpIHsKICAgICAgICAvLyBUT0RPKGFoZSk6IEVpdGhlciB3ZSBuZWVkIHRvIGNoZWNrIHRoaXMgZm9yIHN1cGVyY2xhc3MgYW5kCiAgICAgICAgLy8gaW50ZXJmYWNlcywgb3IgdGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IChvciBoYW5kbGVkIGVsc2V3aGVyZSkuCiAgICAgICAgY2xzLmFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlSWxsZWdhbE1peGluLndpdGhBcmd1bWVudHMobWl4ZWRJblR5cGUuZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgICBjbHMuY2hhck9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICB9CiAgICB9CiAgfQoKICBMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gY2hlY2tTZW1hbnRpY3MoQ2xhc3NCdWlsZGVyIG9iamVjdENsYXNzKSB7CiAgICBjaGVja09iamVjdENsYXNzSGllcmFyY2h5KG9iamVjdENsYXNzKTsKICAgIExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBjbGFzc2VzID0gaGFuZGxlSGllcmFyY2h5Q3ljbGVzKG9iamVjdENsYXNzKTsKCiAgICAvLyBDaGVjayBpbXBvcnRzIGFuZCBleHBvcnRzIGZvciBkdXBsaWNhdGUgbmFtZXMuCiAgICAvLyBUaGlzIGlzIHJhdGhlciBzaWxseSwgZS5nLiBpdCBtYWtlcyBpbXBvcnRpbmcgJ2ZvbycgYW5kIGV4cG9ydGluZyBhbm90aGVyCiAgICAvLyAnZm9vJyBvay4KICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKGxpYnJhcnkgaXMgU291cmNlTGlicmFyeUJ1aWxkZXIgJiYgbGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIC8vIENoZWNrIGV4cG9ydHMuCiAgICAgICAgaWYgKGxpYnJhcnkuZXhwb3J0cy5pc05vdEVtcHR5KSB7CiAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PEV4cG9ydD4+IG5hbWVUb0V4cG9ydHM7CiAgICAgICAgICBib29sIGVycm9yRXhwb3J0cyA9IGZhbHNlOwogICAgICAgICAgZm9yIChFeHBvcnQgZXhwb3J0IGluIGxpYnJhcnkuZXhwb3J0cykgewogICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGV4cG9ydC5leHBvcnRlZD8ubmFtZSA/PyAnJzsKICAgICAgICAgICAgaWYgKG5hbWUgIT0gJycpIHsKICAgICAgICAgICAgICBuYW1lVG9FeHBvcnRzID8/PSBuZXcgTWFwPFN0cmluZywgTGlzdDxFeHBvcnQ+PigpOwogICAgICAgICAgICAgIExpc3Q8RXhwb3J0PiBleHBvcnRzID0gbmFtZVRvRXhwb3J0c1tuYW1lXSA/Pz0gPEV4cG9ydD5bXTsKICAgICAgICAgICAgICBleHBvcnRzLmFkZChleHBvcnQpOwogICAgICAgICAgICAgIGlmIChleHBvcnRzWzBdLmV4cG9ydGVkICE9IGV4cG9ydC5leHBvcnRlZCkgZXJyb3JFeHBvcnRzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGVycm9yRXhwb3J0cykgewogICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIGluIG5hbWVUb0V4cG9ydHMua2V5cykgewogICAgICAgICAgICAgIExpc3Q8RXhwb3J0PiBleHBvcnRzID0gbmFtZVRvRXhwb3J0c1tuYW1lXTsKICAgICAgICAgICAgICBpZiAoZXhwb3J0cy5sZW5ndGggPCAyKSBjb250aW51ZTsKICAgICAgICAgICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0ID0gPExvY2F0ZWRNZXNzYWdlPltdOwogICAgICAgICAgICAgIGZvciAoRXhwb3J0IGV4cG9ydCBpbiBleHBvcnRzLnNraXAoMSkpIHsKICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkKHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlFeHBvcnRDb250ZXh0CiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAgICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgZXhwb3J0LmNoYXJPZmZzZXQsIG5vTGVuZ3RoKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICAgICAgICBleHBvcnRzWzBdLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgICAgICAgICB1cmksCiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpbXBvcnRzLgogICAgICAgIGlmIChsaWJyYXJ5LmltcG9ydHMuaXNOb3RFbXB0eSkgewogICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxJbXBvcnQ+PiBuYW1lVG9JbXBvcnRzOwogICAgICAgICAgYm9vbCBlcnJvckltcG9ydHM7CiAgICAgICAgICBmb3IgKEltcG9ydCBpbXBvcnQgaW4gbGlicmFyeS5pbXBvcnRzKSB7CiAgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW1wb3J0LmltcG9ydGVkPy5uYW1lID8/ICcnOwogICAgICAgICAgICBpZiAobmFtZSAhPSAnJykgewogICAgICAgICAgICAgIG5hbWVUb0ltcG9ydHMgPz89IG5ldyBNYXA8U3RyaW5nLCBMaXN0PEltcG9ydD4+KCk7CiAgICAgICAgICAgICAgTGlzdDxJbXBvcnQ+IGltcG9ydHMgPSBuYW1lVG9JbXBvcnRzW25hbWVdID8/PSA8SW1wb3J0PltdOwogICAgICAgICAgICAgIGltcG9ydHMuYWRkKGltcG9ydCk7CiAgICAgICAgICAgICAgaWYgKGltcG9ydHNbMF0uaW1wb3J0ZWQgIT0gaW1wb3J0LmltcG9ydGVkKSBlcnJvckltcG9ydHMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZXJyb3JJbXBvcnRzICE9IG51bGwpIHsKICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSBpbiBuYW1lVG9JbXBvcnRzLmtleXMpIHsKICAgICAgICAgICAgICBMaXN0PEltcG9ydD4gaW1wb3J0cyA9IG5hbWVUb0ltcG9ydHNbbmFtZV07CiAgICAgICAgICAgICAgaWYgKGltcG9ydHMubGVuZ3RoIDwgMikgY29udGludWU7CiAgICAgICAgICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCA9IDxMb2NhdGVkTWVzc2FnZT5bXTsKICAgICAgICAgICAgICBmb3IgKEltcG9ydCBpbXBvcnQgaW4gaW1wb3J0cy5za2lwKDEpKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LmFkZCh0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dAogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGltcG9ydC5jaGFyT2Zmc2V0LCBub0xlbmd0aCkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBsaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlJbXBvcnQud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgICAgICAgaW1wb3J0c1swXS5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgICAgICAgdXJpLAogICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIkNoZWNrZWQgaW1wb3J0cyBhbmQgZXhwb3J0cyBmb3IgZHVwbGljYXRlIG5hbWVzIik7CiAgICByZXR1cm4gY2xhc3NlczsKICB9CgogIHZvaWQgYnVpbGRDb21wb25lbnQoKSB7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgc291cmNlTGlicmFyeSA9IGxpYnJhcnk7CiAgICAgICAgTGlicmFyeSB0YXJnZXQgPSBzb3VyY2VMaWJyYXJ5LmJ1aWxkKGNvcmVMaWJyYXJ5KTsKICAgICAgICBpZiAoIWxpYnJhcnkuaXNQYXRjaCkgewogICAgICAgICAgbGlicmFyaWVzLmFkZCh0YXJnZXQpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIkJ1aWx0IGNvbXBvbmVudCIpOwogIH0KCiAgQ29tcG9uZW50IGNvbXB1dGVGdWxsQ29tcG9uZW50KCkgewogICAgU2V0PExpYnJhcnk+IGxpYnJhcmllcyA9IG5ldyBTZXQ8TGlicmFyeT4oKTsKICAgIExpc3Q8TGlicmFyeT4gd29ya0xpc3QgPSA8TGlicmFyeT5bXTsKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKCFsaWJyYXJ5LmlzUGF0Y2ggJiYKICAgICAgICAgIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzIHx8CiAgICAgICAgICAgICAgbGlicmFyeS51cmkuc2NoZW1lID09ICJkYXJ0IiB8fAogICAgICAgICAgICAgIGxpYnJhcnkgPT0gdGhpcy5maXJzdCkpIHsKICAgICAgICBpZiAobGlicmFyaWVzLmFkZChsaWJyYXJ5LnRhcmdldCkpIHsKICAgICAgICAgIHdvcmtMaXN0LmFkZChsaWJyYXJ5LnRhcmdldCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIHdoaWxlICh3b3JrTGlzdC5pc05vdEVtcHR5KSB7CiAgICAgIExpYnJhcnkgbGlicmFyeSA9IHdvcmtMaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgZm9yIChMaWJyYXJ5RGVwZW5kZW5jeSBkZXBlbmRlbmN5IGluIGxpYnJhcnkuZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgaWYgKGxpYnJhcmllcy5hZGQoZGVwZW5kZW5jeS50YXJnZXRMaWJyYXJ5KSkgewogICAgICAgICAgd29ya0xpc3QuYWRkKGRlcGVuZGVuY3kudGFyZ2V0TGlicmFyeSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IENvbXBvbmVudCgpLi5saWJyYXJpZXMuYWRkQWxsKGxpYnJhcmllcyk7CiAgfQoKICB2b2lkIGNvbXB1dGVIaWVyYXJjaHkoKSB7CiAgICBMaXN0PEFtYmlndW91c1R5cGVzUmVjb3JkPiBhbWJpZ3VvdXNUeXBlc1JlY29yZHMgPSBbXTsKICAgIEhhbmRsZUFtYmlndW91c1N1cGVydHlwZXMgb25BbWJpZ3VvdXNTdXBlcnR5cGVzID0KICAgICAgICAoQ2xhc3MgY2xzLCBTdXBlcnR5cGUgYSwgU3VwZXJ0eXBlIGIpIHsKICAgICAgaWYgKGFtYmlndW91c1R5cGVzUmVjb3JkcyAhPSBudWxsKSB7CiAgICAgICAgYW1iaWd1b3VzVHlwZXNSZWNvcmRzLmFkZChuZXcgQW1iaWd1b3VzVHlwZXNSZWNvcmQoY2xzLCBhLCBiKSk7CiAgICAgIH0KICAgIH07CiAgICBpZiAoaGllcmFyY2h5ID09IG51bGwpIHsKICAgICAgaGllcmFyY2h5ID0gbmV3IENsYXNzSGllcmFyY2h5KGNvbXB1dGVGdWxsQ29tcG9uZW50KCksCiAgICAgICAgICBvbkFtYmlndW91c1N1cGVydHlwZXM6IG9uQW1iaWd1b3VzU3VwZXJ0eXBlcyk7CiAgICB9IGVsc2UgewogICAgICBoaWVyYXJjaHkub25BbWJpZ3VvdXNTdXBlcnR5cGVzID0gb25BbWJpZ3VvdXNTdXBlcnR5cGVzOwogICAgICBDb21wb25lbnQgY29tcG9uZW50ID0gY29tcHV0ZUZ1bGxDb21wb25lbnQoKTsKICAgICAgaGllcmFyY2h5LmFwcGx5VHJlZUNoYW5nZXMoY29uc3QgW10sIGNvbXBvbmVudC5saWJyYXJpZXMsCiAgICAgICAgICByZWlzc3VlQW1iaWd1b3VzU3VwZXJ0eXBlc0ZvcjogY29tcG9uZW50KTsKICAgIH0KICAgIGZvciAoQW1iaWd1b3VzVHlwZXNSZWNvcmQgcmVjb3JkIGluIGFtYmlndW91c1R5cGVzUmVjb3JkcykgewogICAgICBoYW5kbGVBbWJpZ3VvdXNTdXBlcnR5cGVzKHJlY29yZC5jbHMsIHJlY29yZC5hLCByZWNvcmQuYik7CiAgICB9CiAgICBhbWJpZ3VvdXNUeXBlc1JlY29yZHMgPSBudWxsOwogICAgdGlja2VyLmxvZ01zKCJDb21wdXRlZCBjbGFzcyBoaWVyYXJjaHkiKTsKICB9CgogIHZvaWQgaGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyhDbGFzcyBjbHMsIFN1cGVydHlwZSBhLCBTdXBlcnR5cGUgYikgewogICAgYWRkUHJvYmxlbSgKICAgICAgICB0ZW1wbGF0ZUFtYmlndW91c1N1cGVydHlwZXMud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgY2xzLm5hbWUsIGEuYXNJbnRlcmZhY2VUeXBlLCBiLmFzSW50ZXJmYWNlVHlwZSksCiAgICAgICAgY2xzLmZpbGVPZmZzZXQsCiAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgY2xzLmZpbGVVcmkpOwogIH0KCiAgdm9pZCBpZ25vcmVBbWJpZ3VvdXNTdXBlcnR5cGVzKENsYXNzIGNscywgU3VwZXJ0eXBlIGEsIFN1cGVydHlwZSBiKSB7fQoKICB2b2lkIGNvbXB1dGVDb3JlVHlwZXMoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgY29yZVR5cGVzID0gbmV3IENvcmVUeXBlcyhjb21wb25lbnQpOwoKICAgIGZ1dHVyZU9mQm90dG9tID0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgY29yZVR5cGVzLmZ1dHVyZUNsYXNzLCA8RGFydFR5cGU+W2NvbnN0IEJvdHRvbVR5cGUoKV0pOwogICAgaXRlcmFibGVPZkJvdHRvbSA9IG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgIGNvcmVUeXBlcy5pdGVyYWJsZUNsYXNzLCA8RGFydFR5cGU+W2NvbnN0IEJvdHRvbVR5cGUoKV0pOwogICAgc3RyZWFtT2ZCb3R0b20gPSBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBjb3JlVHlwZXMuc3RyZWFtQ2xhc3MsIDxEYXJ0VHlwZT5bY29uc3QgQm90dG9tVHlwZSgpXSk7CgogICAgdGlja2VyLmxvZ01zKCJDb21wdXRlZCBjb3JlIHR5cGVzIik7CiAgfQoKICB2b2lkIGNoZWNrU3VwZXJ0eXBlcyhMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gc291cmNlQ2xhc3NlcykgewogICAgZm9yIChTb3VyY2VDbGFzc0J1aWxkZXIgYnVpbGRlciBpbiBzb3VyY2VDbGFzc2VzKSB7CiAgICAgIGlmIChidWlsZGVyLmxpYnJhcnkubG9hZGVyID09IHRoaXMgJiYgIWJ1aWxkZXIuaXNQYXRjaCkgewogICAgICAgIGJ1aWxkZXIuY2hlY2tTdXBlcnR5cGVzKGNvcmVUeXBlcyk7CiAgICAgIH0KICAgIH0KICAgIHRpY2tlci5sb2dNcygiQ2hlY2tlZCBzdXBlcnR5cGVzIik7CiAgfQoKICB2b2lkIGNoZWNrQm91bmRzKCkgewogICAgaWYgKHRhcmdldC5sZWdhY3lNb2RlKSByZXR1cm47CgogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeSBpcyBTb3VyY2VMaWJyYXJ5QnVpbGRlcikgewogICAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgICBsaWJyYXJ5CiAgICAgICAgICAgICAgLmNoZWNrQm91bmRzSW5PdXRsaW5lKHR5cGVJbmZlcmVuY2VFbmdpbmUudHlwZVNjaGVtYUVudmlyb25tZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgdGlja2VyLmxvZ01zKCJDaGVja2VkIHR5cGUgYXJndW1lbnRzIG9mIHN1cGVycyBhZ2FpbnN0IHRoZSBib3VuZHMiKTsKICB9CgogIHZvaWQgY2hlY2tPdmVycmlkZXMoTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IHNvdXJjZUNsYXNzZXMpIHsKICAgIExpc3Q8RGVsYXllZE92ZXJyaWRlQ2hlY2s+IG92ZXJyaWRlQ2hlY2tzID0KICAgICAgICBidWlsZGVySGllcmFyY2h5Lm92ZXJyaWRlQ2hlY2tzLnRvTGlzdCgpOwogICAgYnVpbGRlckhpZXJhcmNoeS5vdmVycmlkZUNoZWNrcy5jbGVhcigpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdmVycmlkZUNoZWNrcy5sZW5ndGg7IGkrKykgewogICAgICBvdmVycmlkZUNoZWNrc1tpXS5jaGVjayhidWlsZGVySGllcmFyY2h5KTsKICAgIH0KICAgIHRpY2tlci5sb2dNcygiQ2hlY2tlZCAke292ZXJyaWRlQ2hlY2tzLmxlbmd0aH0gb3ZlcnJpZGVzIik7CgogICAgdHlwZUluZmVyZW5jZUVuZ2luZT8uZmluaXNoVG9wTGV2ZWxJbml0aWFsaXppbmdGb3JtYWxzKCk7CiAgICB0aWNrZXIubG9nTXMoIkZpbmlzaGVkIGluaXRpYWxpemluZyBmb3JtYWxzIik7CiAgfQoKICB2b2lkIGNoZWNrQWJzdHJhY3RNZW1iZXJzKExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBzb3VyY2VDbGFzc2VzKSB7CiAgICBMaXN0PERlbGF5ZWRNZW1iZXI+IGRlbGF5ZWRNZW1iZXJDaGVja3MgPQogICAgICAgIGJ1aWxkZXJIaWVyYXJjaHkuZGVsYXllZE1lbWJlckNoZWNrcy50b0xpc3QoKTsKICAgIGJ1aWxkZXJIaWVyYXJjaHkuZGVsYXllZE1lbWJlckNoZWNrcy5jbGVhcigpOwogICAgU2V0PENsYXNzPiBjaGFuZ2VkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3M+KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbGF5ZWRNZW1iZXJDaGVja3MubGVuZ3RoOyBpKyspIHsKICAgICAgZGVsYXllZE1lbWJlckNoZWNrc1tpXS5jaGVjayhidWlsZGVySGllcmFyY2h5KTsKICAgICAgY2hhbmdlZENsYXNzZXMuYWRkKGRlbGF5ZWRNZW1iZXJDaGVja3NbaV0ucGFyZW50LmNscyk7CiAgICB9CiAgICB0aWNrZXIubG9nTXMoCiAgICAgICAgIkNvbXB1dGVkICR7ZGVsYXllZE1lbWJlckNoZWNrcy5sZW5ndGh9IGNvbWJpbmVkIG1lbWJlciBzaWduYXR1cmVzIik7CgogICAgaGllcmFyY2h5LmFwcGx5TWVtYmVyQ2hhbmdlcyhjaGFuZ2VkQ2xhc3NlcywgZmluZERlc2NlbmRhbnRzOiBmYWxzZSk7CiAgICB0aWNrZXIKICAgICAgICAubG9nTXMoIlVwZGF0ZWQgJHtjaGFuZ2VkQ2xhc3Nlcy5sZW5ndGh9IGNsYXNzZXMgaW4ga2VybmVsIGhpZXJhcmNoeSIpOwogIH0KCiAgdm9pZCBjaGVja1JlZGlyZWN0aW5nRmFjdG9yaWVzKExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBzb3VyY2VDbGFzc2VzKSB7CiAgICAvLyBUT0RPKGFoZSk6IE1vdmUgdGhpcyB0byBbQ2xhc3NIaWVyYXJjaHlCdWlsZGVyXS4KICAgIGlmICh0YXJnZXQubGVnYWN5TW9kZSkgcmV0dXJuOwogICAgZm9yIChTb3VyY2VDbGFzc0J1aWxkZXIgYnVpbGRlciBpbiBzb3VyY2VDbGFzc2VzKSB7CiAgICAgIGlmIChidWlsZGVyLmxpYnJhcnkubG9hZGVyID09IHRoaXMgJiYgIWJ1aWxkZXIuaXNQYXRjaCkgewogICAgICAgIGJ1aWxkZXIuY2hlY2tSZWRpcmVjdGluZ0ZhY3RvcmllcygKICAgICAgICAgICAgdHlwZUluZmVyZW5jZUVuZ2luZS50eXBlU2NoZW1hRW52aXJvbm1lbnQpOwogICAgICB9CiAgICB9CiAgICB0aWNrZXIubG9nTXMoIkNoZWNrZWQgcmVkaXJlY3RpbmcgZmFjdG9yaWVzIik7CiAgfQoKICB2b2lkIGFkZE5vU3VjaE1ldGhvZEZvcndhcmRlcnMoTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IHNvdXJjZUNsYXNzZXMpIHsKICAgIC8vIFRPRE8oYWhlKTogTW92ZSB0aGlzIHRvIFtDbGFzc0hpZXJhcmNoeUJ1aWxkZXJdLgogICAgaWYgKCF0YXJnZXQuYmFja2VuZFRhcmdldC5lbmFibGVOb1N1Y2hNZXRob2RGb3J3YXJkZXJzKSByZXR1cm47CgogICAgTGlzdDxDbGFzcz4gY2hhbmdlZENsYXNzZXMgPSBuZXcgTGlzdDxDbGFzcz4oKTsKICAgIGZvciAoU291cmNlQ2xhc3NCdWlsZGVyIGJ1aWxkZXIgaW4gc291cmNlQ2xhc3NlcykgewogICAgICBpZiAoYnVpbGRlci5saWJyYXJ5LmxvYWRlciA9PSB0aGlzICYmICFidWlsZGVyLmlzUGF0Y2gpIHsKICAgICAgICBpZiAoYnVpbGRlci5hZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJzKHRhcmdldCwgaGllcmFyY2h5KSkgewogICAgICAgICAgY2hhbmdlZENsYXNzZXMuYWRkKGJ1aWxkZXIudGFyZ2V0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGhpZXJhcmNoeS5hcHBseU1lbWJlckNoYW5nZXMoY2hhbmdlZENsYXNzZXMsIGZpbmREZXNjZW5kYW50czogdHJ1ZSk7CiAgICB0aWNrZXIubG9nTXMoIkFkZGVkIG5vU3VjaE1ldGhvZCBmb3J3YXJkZXJzIik7CiAgfQoKICB2b2lkIGNoZWNrTWl4aW5zKExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBzb3VyY2VDbGFzc2VzKSB7CiAgICBmb3IgKFNvdXJjZUNsYXNzQnVpbGRlciBidWlsZGVyIGluIHNvdXJjZUNsYXNzZXMpIHsKICAgICAgaWYgKGJ1aWxkZXIubGlicmFyeS5sb2FkZXIgPT0gdGhpcyAmJiAhYnVpbGRlci5pc1BhdGNoKSB7CiAgICAgICAgaWYgKGJ1aWxkZXIuaXNNaXhpbkRlY2xhcmF0aW9uKSB7CiAgICAgICAgICBidWlsZGVyLmNoZWNrTWl4aW5EZWNsYXJhdGlvbigpOwogICAgICAgIH0KCiAgICAgICAgQ2xhc3MgbWl4ZWRJbkNsYXNzID0gYnVpbGRlci5jbHMubWl4ZWRJbkNsYXNzOwogICAgICAgIGlmIChtaXhlZEluQ2xhc3MgIT0gbnVsbCAmJiBtaXhlZEluQ2xhc3MuaXNNaXhpbkRlY2xhcmF0aW9uKSB7CiAgICAgICAgICBidWlsZGVyLmNoZWNrTWl4aW5BcHBsaWNhdGlvbihoaWVyYXJjaHkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGlja2VyLmxvZ01zKCJDaGVja2VkIG1peGluIGRlY2xhcmF0aW9uIGFwcGxpY2F0aW9ucyIpOwogIH0KCiAgdm9pZCBidWlsZE91dGxpbmVFeHByZXNzaW9ucygpIHsKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICBsaWJyYXJ5LmJ1aWxkT3V0bGluZUV4cHJlc3Npb25zKCk7CiAgICAgICAgSXRlcmF0b3I8RGVjbGFyYXRpb24+IGl0ZXJhdG9yID0gbGlicmFyeS5pdGVyYXRvcjsKICAgICAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBpdGVyYXRvci5jdXJyZW50OwogICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlcikgewogICAgICAgICAgICBkZWNsYXJhdGlvbi5idWlsZE91dGxpbmVFeHByZXNzaW9ucyhsaWJyYXJ5KTsKICAgICAgICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgTWVtYmVyQnVpbGRlcikgewogICAgICAgICAgICBkZWNsYXJhdGlvbi5idWlsZE91dGxpbmVFeHByZXNzaW9ucyhsaWJyYXJ5KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCBidWlsZENsYXNzSGllcmFyY2h5KAogICAgICBMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gc291cmNlQ2xhc3NlcywgQ2xhc3NCdWlsZGVyIG9iamVjdENsYXNzKSB7CiAgICBidWlsZGVySGllcmFyY2h5ID0gQ2xhc3NIaWVyYXJjaHlCdWlsZGVyLmJ1aWxkKAogICAgICAgIG9iamVjdENsYXNzLCBzb3VyY2VDbGFzc2VzLCB0aGlzLCBjb3JlVHlwZXMpOwogICAgdHlwZUluZmVyZW5jZUVuZ2luZT8uaGllcmFyY2h5QnVpbGRlciA9IGJ1aWxkZXJIaWVyYXJjaHk7CiAgICB0aWNrZXIubG9nTXMoIkJ1aWx0IGNsYXNzIGhpZXJhcmNoeSIpOwogIH0KCiAgdm9pZCBjcmVhdGVUeXBlSW5mZXJlbmNlRW5naW5lKCkgewogICAgaWYgKHRhcmdldC5sZWdhY3lNb2RlKSByZXR1cm47CiAgICB0eXBlSW5mZXJlbmNlRW5naW5lID0gbmV3IFNoYWRvd1R5cGVJbmZlcmVuY2VFbmdpbmUoaW5zdHJ1bWVudGF0aW9uKTsKICB9CgogIHZvaWQgcGVyZm9ybVRvcExldmVsSW5mZXJlbmNlKExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBzb3VyY2VDbGFzc2VzKSB7CiAgICBpZiAodGFyZ2V0LmxlZ2FjeU1vZGUpIHJldHVybjsKCiAgICAvLy8gVGhlIGZpcnN0IHBoYXNlIG9mIHRvcCBsZXZlbCBpbml0aWFsaXplciBpbmZlcmVuY2UsIHdoaWNoIGNvbnNpc3RzIG9mCiAgICAvLy8gY3JlYXRpbmcga2VybmVsIG9iamVjdHMgZm9yIGFsbCBmaWVsZHMgYW5kIHRvcCBsZXZlbCB2YXJpYWJsZXMgdGhhdAogICAgLy8vIG1pZ2h0IGJlIHN1YmplY3QgdG8gdHlwZSBpbmZlcmVuY2UsIGFuZCByZWNvcmRzIGRlcGVuZGVuY2llcyBiZXR3ZWVuCiAgICAvLy8gdGhlbS4KICAgIHR5cGVJbmZlcmVuY2VFbmdpbmUucHJlcGFyZVRvcExldmVsKGNvcmVUeXBlcywgaGllcmFyY2h5KTsKICAgIExpc3Q8RmllbGRCdWlsZGVyPiBhbGxJbXBsaWNpdGx5VHlwZWRGaWVsZHMgPSA8RmllbGRCdWlsZGVyPltdOwogICAgZm9yIChMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5IGluIGJ1aWxkZXJzLnZhbHVlcykgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIExpc3Q8RmllbGRCdWlsZGVyPiBpbXBsaWNpdGx5VHlwZWRGaWVsZHMgPQogICAgICAgICAgICBsaWJyYXJ5LnRha2VJbXBsaWNpdGx5VHlwZWRGaWVsZHMoKTsKICAgICAgICBpZiAoaW1wbGljaXRseVR5cGVkRmllbGRzICE9IG51bGwpIHsKICAgICAgICAgIGFsbEltcGxpY2l0bHlUeXBlZEZpZWxkcy5hZGRBbGwoaW1wbGljaXRseVR5cGVkRmllbGRzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbEltcGxpY2l0bHlUeXBlZEZpZWxkcy5sZW5ndGg7IGkrKykgewogICAgICAvLyBUT0RPKGFoZSk6IFRoaXMgY2FuIGNhdXNlIGEgY3Jhc2ggZm9yIHBhcnRzIHRoYXQgZmFpbGVkIHRvIGdldAogICAgICAvLyBpbmNsdWRlZCwgc2VlIGZvciBleGFtcGxlLAogICAgICAvLyB0ZXN0cy9zdGFuZGFsb25lXzIvaW8vaHR0cF9jb29raWVfZGF0ZV90ZXN0LmRhcnQuCiAgICAgIGFsbEltcGxpY2l0bHlUeXBlZEZpZWxkc1tpXS5pbmZlclR5cGUoKTsKICAgIH0KCiAgICB0eXBlSW5mZXJlbmNlRW5naW5lLmlzVHlwZUluZmVyZW5jZVByZXBhcmVkID0gdHJ1ZTsKCiAgICAvLyBTaW5jZSBmaW5hbGl6YXRpb24gb2YgY292YXJpYW5jZSBtYXkgaGF2ZSBhZGRlZCBmb3J3YXJkaW5nIHN0dWJzLCB3ZSBuZWVkCiAgICAvLyB0byByZWNvbXB1dGUgdGhlIGNsYXNzIGhpZXJhcmNoeSBzbyB0aGF0IG1ldGhvZCBjb21waWxhdGlvbiB3aWxsIHByb3Blcmx5CiAgICAvLyB0YXJnZXQgdGhvc2UgZm9yd2FyZGluZyBzdHVicy4KICAgIGhpZXJhcmNoeS5vbkFtYmlndW91c1N1cGVydHlwZXMgPSBpZ25vcmVBbWJpZ3VvdXNTdXBlcnR5cGVzOwogICAgdGlja2VyLmxvZ01zKCJQZXJmb3JtZWQgdG9wIGxldmVsIGluZmVyZW5jZSIpOwogIH0KCiAgdm9pZCB0cmFuc2Zvcm1Qb3N0SW5mZXJlbmNlKAogICAgICBUcmVlTm9kZSBub2RlLCBib29sIHRyYW5zZm9ybVNldExpdGVyYWxzLCBib29sIHRyYW5zZm9ybUNvbGxlY3Rpb25zKSB7CiAgICBpZiAodHJhbnNmb3JtQ29sbGVjdGlvbnMpIHsKICAgICAgbm9kZS5hY2NlcHQoY29sbGVjdGlvblRyYW5zZm9ybWVyID8/PSBuZXcgQ29sbGVjdGlvblRyYW5zZm9ybWVyKHRoaXMpKTsKICAgIH0KICAgIGlmICh0cmFuc2Zvcm1TZXRMaXRlcmFscykgewogICAgICBub2RlLmFjY2VwdChzZXRMaXRlcmFsVHJhbnNmb3JtZXIgPz89IG5ldyBTZXRMaXRlcmFsVHJhbnNmb3JtZXIodGhpcywKICAgICAgICAgIHRyYW5zZm9ybUNvbnN0OiAhdGFyZ2V0LmVuYWJsZUNvbnN0YW50VXBkYXRlMjAxOCkpOwogICAgfQogIH0KCiAgdm9pZCB0cmFuc2Zvcm1MaXN0UG9zdEluZmVyZW5jZShMaXN0PFRyZWVOb2RlPiBsaXN0LAogICAgICBib29sIHRyYW5zZm9ybVNldExpdGVyYWxzLCBib29sIHRyYW5zZm9ybUNvbGxlY3Rpb25zKSB7CiAgICBpZiAodHJhbnNmb3JtQ29sbGVjdGlvbnMpIHsKICAgICAgQ29sbGVjdGlvblRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0KICAgICAgICAgIGNvbGxlY3Rpb25UcmFuc2Zvcm1lciA/Pz0gbmV3IENvbGxlY3Rpb25UcmFuc2Zvcm1lcih0aGlzKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgbGlzdFtpXSA9IGxpc3RbaV0uYWNjZXB0KHRyYW5zZm9ybWVyKTsKICAgICAgfQogICAgfQogICAgaWYgKHRyYW5zZm9ybVNldExpdGVyYWxzKSB7CiAgICAgIFNldExpdGVyYWxUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHNldExpdGVyYWxUcmFuc2Zvcm1lciA/Pz0KICAgICAgICAgIG5ldyBTZXRMaXRlcmFsVHJhbnNmb3JtZXIodGhpcywKICAgICAgICAgICAgICB0cmFuc2Zvcm1Db25zdDogIXRhcmdldC5lbmFibGVDb25zdGFudFVwZGF0ZTIwMTgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHsKICAgICAgICBsaXN0W2ldID0gbGlzdFtpXS5hY2NlcHQodHJhbnNmb3JtZXIpOwogICAgICB9CiAgICB9CiAgfQoKICBFeHByZXNzaW9uIGluc3RhbnRpYXRlSW52b2NhdGlvbihFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgbmFtZSwKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCwgYm9vbCBpc1N1cGVyKSB7CiAgICByZXR1cm4gdGFyZ2V0LmJhY2tlbmRUYXJnZXQuaW5zdGFudGlhdGVJbnZvY2F0aW9uKAogICAgICAgIGNvcmVUeXBlcywgcmVjZWl2ZXIsIG5hbWUsIGFyZ3VtZW50cywgb2Zmc2V0LCBpc1N1cGVyKTsKICB9CgogIEV4cHJlc3Npb24gaW5zdGFudGlhdGVOb1N1Y2hNZXRob2RFcnJvcigKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwgU3RyaW5nIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQsCiAgICAgIHtib29sIGlzTWV0aG9kOiBmYWxzZSwKICAgICAgYm9vbCBpc0dldHRlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNTZXR0ZXI6IGZhbHNlLAogICAgICBib29sIGlzRmllbGQ6IGZhbHNlLAogICAgICBib29sIGlzTG9jYWxWYXJpYWJsZTogZmFsc2UsCiAgICAgIGJvb2wgaXNEeW5hbWljOiBmYWxzZSwKICAgICAgYm9vbCBpc1N1cGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc1N0YXRpYzogZmFsc2UsCiAgICAgIGJvb2wgaXNDb25zdHJ1Y3RvcjogZmFsc2UsCiAgICAgIGJvb2wgaXNUb3BMZXZlbDogZmFsc2V9KSB7CiAgICByZXR1cm4gdGFyZ2V0LmJhY2tlbmRUYXJnZXQuaW5zdGFudGlhdGVOb1N1Y2hNZXRob2RFcnJvcigKICAgICAgICBjb3JlVHlwZXMsIHJlY2VpdmVyLCBuYW1lLCBhcmd1bWVudHMsIG9mZnNldCwKICAgICAgICBpc01ldGhvZDogaXNNZXRob2QsCiAgICAgICAgaXNHZXR0ZXI6IGlzR2V0dGVyLAogICAgICAgIGlzU2V0dGVyOiBpc1NldHRlciwKICAgICAgICBpc0ZpZWxkOiBpc0ZpZWxkLAogICAgICAgIGlzTG9jYWxWYXJpYWJsZTogaXNMb2NhbFZhcmlhYmxlLAogICAgICAgIGlzRHluYW1pYzogaXNEeW5hbWljLAogICAgICAgIGlzU3VwZXI6IGlzU3VwZXIsCiAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLAogICAgICAgIGlzQ29uc3RydWN0b3I6IGlzQ29uc3RydWN0b3IsCiAgICAgICAgaXNUb3BMZXZlbDogaXNUb3BMZXZlbCk7CiAgfQoKICB2b2lkIHJlbGVhc2VBbmNpbGxhcnlSZXNvdXJjZXMoKSB7CiAgICBoaWVyYXJjaHkgPSBudWxsOwogICAgdHlwZUluZmVyZW5jZUVuZ2luZSA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0J1aWxkZXIgY29tcHV0ZUNsYXNzQnVpbGRlckZyb21UYXJnZXRDbGFzcyhDbGFzcyBjbHMpIHsKICAgIExpYnJhcnkga2VybmVsTGlicmFyeSA9IGNscy5lbmNsb3NpbmdMaWJyYXJ5OwogICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGJ1aWxkZXJzW2tlcm5lbExpYnJhcnkuaW1wb3J0VXJpXTsKICAgIGlmIChsaWJyYXJ5ID09IG51bGwpIHsKICAgICAgcmV0dXJuIHRhcmdldC5kaWxsVGFyZ2V0LmxvYWRlci5jb21wdXRlQ2xhc3NCdWlsZGVyRnJvbVRhcmdldENsYXNzKGNscyk7CiAgICB9CiAgICByZXR1cm4gbGlicmFyeS5nZXRMb2NhbE1lbWJlcihjbHMubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlQnVpbGRlciBjb21wdXRlVHlwZUJ1aWxkZXIoRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIHR5cGUuYWNjZXB0KG5ldyBUeXBlQnVpbGRlckNvbXB1dGVyKHRoaXMpKTsKICB9Cn0KCi8vLyBBIG1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgZGFydDpjb3JlIHRoYXQgaXMgc3VmZmljaWVudCB0byBjcmVhdGUgYW4KLy8vIGluc3RhbmNlIG9mIFtDb3JlVHlwZXNdIGFuZCBjb21waWxlIGEgcHJvZ3JhbS4KY29uc3QgU3RyaW5nIGRlZmF1bHREYXJ0Q29yZVNvdXJjZSA9ICIiIgppbXBvcnQgJ2RhcnQ6X2ludGVybmFsJzsKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKCmV4cG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmUsIFN0cmVhbTsKCnByaW50KG9iamVjdCkge30KCmNsYXNzIEl0ZXJhdG9yIHt9CgpjbGFzcyBJdGVyYWJsZSB7fQoKY2xhc3MgTGlzdCBleHRlbmRzIEl0ZXJhYmxlIHsKICBmYWN0b3J5IExpc3QudW5tb2RpZmlhYmxlKGVsZW1lbnRzKSA9PiBudWxsOwp9CgpjbGFzcyBNYXAgZXh0ZW5kcyBJdGVyYWJsZSB7CiAgZmFjdG9yeSBNYXAudW5tb2RpZmlhYmxlKG90aGVyKSA9PiBudWxsOwp9CgpjbGFzcyBOb1N1Y2hNZXRob2RFcnJvciB7CiAgTm9TdWNoTWV0aG9kRXJyb3Iud2l0aEludm9jYXRpb24ocmVjZWl2ZXIsIGludm9jYXRpb24pOwp9CgpjbGFzcyBOdWxsIHt9CgpjbGFzcyBPYmplY3QgewogIG5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKSA9PiBudWxsOwp9CgpjbGFzcyBTdHJpbmcge30KCmNsYXNzIFN5bWJvbCB7fQoKY2xhc3MgU2V0IHt9CgpjbGFzcyBUeXBlIHt9CgpjbGFzcyBfSW52b2NhdGlvbk1pcnJvciB7CiAgX0ludm9jYXRpb25NaXJyb3IuX3dpdGhUeXBlKF9tZW1iZXJOYW1lLCBfdHlwZSwgX3R5cGVBcmd1bWVudHMsCiAgICAgIF9wb3NpdGlvbmFsQXJndW1lbnRzLCBfbmFtZWRBcmd1bWVudHMpOwp9CgpjbGFzcyBib29sIHt9CgpjbGFzcyBkb3VibGUgZXh0ZW5kcyBudW0ge30KCmNsYXNzIGludCBleHRlbmRzIG51bSB7fQoKY2xhc3MgbnVtIHt9CgpjbGFzcyBfU3luY0l0ZXJhYmxlIHt9CgpjbGFzcyBfU3luY0l0ZXJhdG9yIHsKICB2YXIgX2N1cnJlbnQ7CiAgdmFyIF95aWVsZEVhY2hJdGVyYWJsZTsKfQoKY2xhc3MgRnVuY3Rpb24ge30KIiIiOwoKLy8vIEEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiBkYXJ0OmFzeW5jIHRoYXQgaXMgc3VmZmljaWVudCB0byBjcmVhdGUgYW4KLy8vIGluc3RhbmNlIG9mIFtDb3JlVHlwZXNdIGFuZCBjb21waWxlIHByb2dyYW0uCmNvbnN0IFN0cmluZyBkZWZhdWx0RGFydEFzeW5jU291cmNlID0gIiIiCl9hc3luY0Vycm9yV3JhcHBlckhlbHBlcihjb250aW51YXRpb24pIHt9CgpfYXN5bmNTdGFja1RyYWNlSGVscGVyKGFzeW5jX29wKSB7fQoKX2FzeW5jVGhlbldyYXBwZXJIZWxwZXIoY29udGludWF0aW9uKSB7fQoKX2F3YWl0SGVscGVyKG9iamVjdCwgdGhlbkNhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBhd2FpdGVyKSB7fQoKX2NvbXBsZXRlT25Bc3luY1JldHVybihjb21wbGV0ZXIsIHZhbHVlKSB7fQoKY2xhc3MgX0FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXIgewogIGFkZChldmVudCkge30KCiAgYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpIHt9CgogIGFkZFN0cmVhbShzdHJlYW0pIHt9CgogIGNsb3NlKCkge30KCiAgZ2V0IHN0cmVhbSA9PiBudWxsOwp9CgpjbGFzcyBDb21wbGV0ZXIgewogIGZhY3RvcnkgQ29tcGxldGVyLnN5bmMoKSA9PiBudWxsOwoKICBnZXQgZnV0dXJlOwoKICBjb21wbGV0ZShbdmFsdWVdKTsKCiAgY29tcGxldGVFcnJvcihlcnJvciwgW3N0YWNrVHJhY2VdKTsKfQoKY2xhc3MgRnV0dXJlIHsKICBmYWN0b3J5IEZ1dHVyZS5taWNyb3Rhc2soY29tcHV0YXRpb24pID0+IG51bGw7Cn0KCmNsYXNzIEZ1dHVyZU9yIHsKfQoKY2xhc3MgX0FzeW5jQXdhaXRDb21wbGV0ZXIgaW1wbGVtZW50cyBDb21wbGV0ZXIgewogIGdldCBmdXR1cmUgPT4gbnVsbDsKCiAgY29tcGxldGUoW3ZhbHVlXSkge30KCiAgY29tcGxldGVFcnJvcihlcnJvciwgW3N0YWNrVHJhY2VdKSB7fQp9CgpjbGFzcyBTdHJlYW0ge30KCmNsYXNzIF9TdHJlYW1JdGVyYXRvciB7CiAgZ2V0IGN1cnJlbnQgPT4gbnVsbDsKCiAgbW92ZU5leHQoKSB7fQoKICBjYW5jZWwoKSB7fQp9CiIiIjsKCi8vLyBBIG1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgZGFydDpjb2xsZWN0aW9uIHRoYXQgaXMgc3VmZmljaWVudCB0byBjcmVhdGUgYW4KLy8vIGluc3RhbmNlIG9mIFtDb3JlVHlwZXNdIGFuZCBjb21waWxlIHByb2dyYW0uCmNvbnN0IFN0cmluZyBkZWZhdWx0RGFydENvbGxlY3Rpb25Tb3VyY2UgPSAiIiIKY2xhc3MgX1VubW9kaWZpYWJsZVNldCB7CiAgZmluYWwgTWFwIF9tYXA7CiAgY29uc3QgX1VubW9kaWZpYWJsZVNldCh0aGlzLl9tYXApOwp9CiIiIjsKCi8vLyBBIG1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgZGFydDpfaW50ZXJuZWwgdGhhdCBpcyBzdWZmaWNpZW50IHRvIGNyZWF0ZSBhbgovLy8gaW5zdGFuY2Ugb2YgW0NvcmVUeXBlc10gYW5kIGNvbXBpbGUgcHJvZ3JhbS4KY29uc3QgU3RyaW5nIGRlZmF1bHREYXJ0SW50ZXJuYWxTb3VyY2UgPSAiIiIKY2xhc3MgU3ltYm9sIHsKICBjb25zdCBTeW1ib2woU3RyaW5nIG5hbWUpOwp9CiIiIjsKCmNsYXNzIEFtYmlndW91c1R5cGVzUmVjb3JkIHsKICBmaW5hbCBDbGFzcyBjbHM7CiAgZmluYWwgU3VwZXJ0eXBlIGE7CiAgZmluYWwgU3VwZXJ0eXBlIGI7CgogIGNvbnN0IEFtYmlndW91c1R5cGVzUmVjb3JkKHRoaXMuY2xzLCB0aGlzLmEsIHRoaXMuYik7Cn0KhPkATk48AR0BIQEhASkBIQkTFA8TEhQWFxEbFxMSAS00ATgBLwE/AUIBJQElAR0JGBEZEh4hHhsSJR4mKTApMB8lHi80MSYjAUoBJwkWHxUXHhUWGhgXGhUBOQE3AUoBSwFIAT4BRAFFATABGQkUHh4XDw4BLwErATMBPAFAASQ9HwE1HgE+ASoBLBwXTRsdGwExASMBLwEvAUsXATokASMBNzMfASkoARkZM1AwQyMgSBAaTEMIG0k+JSIIBgEZShEaDEUrTjBJCEpCIyAkBgEnKjE5QzpESk8VQAghIisjHTpKSE1PJic7QDxGCCNCBiIkIkopCBoGEgQBRxYYMwEZNAEeOQEdNwEPTwYEASk7HiFABi8EAUIsIDs3BAE5K05OKksiOzQgOS1EFAotHickCggGBAEmJB0dJ0kkPQEiIhhFIRYVHzRNNQgGUEEZOD4BKzIEASsBQlEEARgfRTkkHhoRIgoICCk2JwYdJR4PM0AnCAYkATkkIAgIJQQBID8/OSQ2LAgqIDUsCggIRjEqHAgyPwgGHQkaNDRLOSEODgoIGjkkNisICDFNTU8nIgYtHAQBHUEsKDk5JCcIKUYhKx8MIAoKICgICAQBGBc5JDYzCAgvBAEnGTkkNkQICEEEASYTOSQ3CAg8BAEoEzkkLQgIPwQBHxM5JDQICDIEAUsTOSRDCAg6BAFMIhM5JBFPCAhGBAEfEzkkMAgINAQBHhM5JC8ICDMEAUoNPS0uKyYgRQgsIEgnCC0gRSgIBgQBTEVOSw5NTUA2JDolMC4iDAoIBgFEPhlHBgEnOScvCSMpOjYtNiw8NzEyQSwTDAo1Iz8KJi9LER0KCDpMQwFIKQE1Hjk1HhgWTRoVBgEtFAQBHR4qLkY4MyZMJz00GCg9HBcIBgE8NR8jLS8nIVBLHjhBIhwdP0I8PxYODAoIHUZOGE8cFwgGBAFGLEsBNlEROUcaKjMlMzceQUkjTw4MHjY6MEE3QylGECJHKRwXJQ4MCgEaKjMdMzceQUkjTw4MJjY6MEE3QylGECJHKRwXJQ4MCggIRRQEARo5JDY7ICEKCAglBAElMSo5HiUuKC0oCggIIi9DNzIKCAY5BAEcOzYwK0gIBx09OQ0/NEA1BkFBBiIuBAFIEDM9GBIWBAFJAS8qAShAKkIoQAEpBAFBOEAsCAYoBAEXIwE5LSYSUAoICEkEAUAwMi02MQZAAT4zBAFGLjcyMjs2PQYSTgFKC1AEAUs4IzhAKzgIBjMEAUs4RAE0OEBELgoIBkkzBAE9OEAqKwoBN0c0CggGPAQBIzkkKzsmNi06NToMCggIBAEcSjQ2PisEASUjSgQBSiMBTkxNDj9ENiQzMS1CCggGAUBIJDsvBgE4AVFRJkEzBAEfTSBOBiBMPgYEATc+ICpFLi8IBiBEKkEuLwgGBAFFNzdABAErSR0cHBsjHRscISE+NhwcHBoqHhocJiEEASUWIAQBDD8yQBtPBi0EAQwyNwQCAUozKRkVASkBEQESARIBHi8CAR0rAgEaOgIBDgEPJAIBEAEQAQ0BDgEaQi4CAQ4BHAEZAQ0BFwEWEBoCARIFAUsxKioBJAEpAT4BLAEjEAEhARcBDQEWAgESJAEOARUBJgIBDzECARECATIWARcBKAIBEAEYFwEQAQ4CBQFQMS8ZEiUCBQFPMS0PHQIFAR0TFRUBOAIBNXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2Uvc291cmNlX2xvYWRlci5kYXJ0Q3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvY29uc3RhbnRfZXZhbHVhdG9yLmRhcnTAATdrLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBUaGlzIGxpYnJhcnkgaW1wbGVtZW50cyBhIGtlcm5lbDJrZXJuZWwgY29uc3RhbnQgZXZhbHVhdGlvbiB0cmFuc2Zvcm1hdGlvbi4KLy8vCi8vLyBFdmVuIHRob3VnaCBpdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBmcm9udGVuZCBkb2VzIG5vdCBlbWl0IGtlcm5lbCBBU1Qgd2hpY2gKLy8vIGNvbnRhaW5zIGNvbXBpbGUtdGltZSBlcnJvcnMsIHRoaXMgdHJhbnNmb3JtYXRpb24gc3RpbGwgcGVyZm9ybXMgc29tZQovLy8gdmFsaWF0aW9uIGFuZCB0aHJvd3MgYSBbQ29uc3RhbnRFdmFsdWF0aW9uRXJyb3JdIGlmIHRoZXJlIHdhcyBhIGNvbXBpbGUtdGltZQovLy8gZXJyb3JzLgovLy8KLy8vIER1ZSB0byB0aGUgbGFjayBpbmZvcm1hdGlvbiB3aGljaCBpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgZnJvbnQtZW5kLAovLy8gdGhpcyB2YWxpZGF0aW9uIGlzIGluY29tcGxldGUgKGUuZy4gd2hldGhlciBhbiBpbnRlZ2VyIGxpdGVyYWwgdXNlZCB0aGUKLy8vIGhleGFkZWNpbWFsIHN5bnRheCBvciBub3QpLgovLy8KLy8vIEZ1cnRoZXJtb3JlIGR1ZSB0byB0aGUgbG93ZXJpbmcgb2YgY2VydGFpbiBjb25zdHJ1Y3RzIGluIHRoZSBmcm9udC1lbmQKLy8vIChlLmcuICc/PycpIHdlIG5lZWQgdG8gc3VwcG9ydCBhIHN1cGVyLXNldCBvZiB0aGUgbm9ybWFsIGNvbnN0YW50IGV4cHJlc3Npb24KLy8vIGxhbmd1YWdlLiAgSXNzdWUoaHR0cDovL2RhcnRidWcuY29tLzMxNzk5KQpsaWJyYXJ5IGZhc3RhLmNvbnN0YW50X2V2YWx1YXRvcjsKCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbG9uZS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCc7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgTG9jYXRlZE1lc3NhZ2UsCiAgICAgICAgTWVzc2FnZSwKICAgICAgICBtZXNzYWdlQ29uc3RFdmFsQ2lyY3VsYXJpdHksCiAgICAgICAgbWVzc2FnZUNvbnN0RXZhbENvbnRleHQsCiAgICAgICAgbWVzc2FnZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbiwKICAgICAgICBtZXNzYWdlQ29uc3RFdmFsTm90TGlzdE9yU2V0SW5TcHJlYWQsCiAgICAgICAgbWVzc2FnZUNvbnN0RXZhbE5vdE1hcEluU3ByZWFkLAogICAgICAgIG1lc3NhZ2VDb25zdEV2YWxOdWxsVmFsdWUsCiAgICAgICAgbWVzc2FnZUNvbnN0RXZhbFVuZXZhbHVhdGVkLAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRGVmZXJyZWRMaWJyYXJ5LAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRHVwbGljYXRlRWxlbWVudCwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbER1cGxpY2F0ZUtleSwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEVsZW1lbnRJbXBsZW1lbnRzRXF1YWwsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxGYWlsZWRBc3NlcnRpb25XaXRoTWVzc2FnZSwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEZyZWVUeXBlUGFyYW1ldGVyLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFR5cGUsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGUsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvbiwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldCwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0cmluZ0ludGVycG9sYXRpb25PcGVyYW5kLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN5bWJvbE5hbWUsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxLZXlJbXBsZW1lbnRzRXF1YWwsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0LAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldCwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbFplcm9EaXZpc29yOwoKcGFydCAnY29uc3RhbnRfY29sbGVjdGlvbl9idWlsZGVycy5kYXJ0JzsKCkNvbXBvbmVudCB0cmFuc2Zvcm1Db21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwgQ29uc3RhbnRzQmFja2VuZCBiYWNrZW5kLAogICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudERlZmluZXMsIEVycm9yUmVwb3J0ZXIgZXJyb3JSZXBvcnRlciwKICAgIHtib29sIGtlZXBGaWVsZHM6IHRydWUsCiAgICBib29sIGV2YWx1YXRlQW5ub3RhdGlvbnM6IHRydWUsCiAgICBib29sIGRlc3VnYXJTZXRzOiBmYWxzZSwKICAgIGJvb2wgZXJyb3JPblVuZXZhbHVhdGVkQ29uc3RhbnQ6IGZhbHNlLAogICAgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeX0pIHsKICBjb3JlVHlwZXMgPz89IG5ldyBDb3JlVHlwZXMoY29tcG9uZW50KTsKICBoaWVyYXJjaHkgPz89IG5ldyBDbGFzc0hpZXJhcmNoeShjb21wb25lbnQpOwoKICBmaW5hbCB0eXBlRW52aXJvbm1lbnQgPSBuZXcgVHlwZUVudmlyb25tZW50KGNvcmVUeXBlcywgaGllcmFyY2h5KTsKCiAgdHJhbnNmb3JtTGlicmFyaWVzKGNvbXBvbmVudC5saWJyYXJpZXMsIGJhY2tlbmQsIGVudmlyb25tZW50RGVmaW5lcywKICAgICAgdHlwZUVudmlyb25tZW50LCBlcnJvclJlcG9ydGVyLAogICAgICBrZWVwRmllbGRzOiBrZWVwRmllbGRzLAogICAgICBkZXN1Z2FyU2V0czogZGVzdWdhclNldHMsCiAgICAgIGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50OiBlcnJvck9uVW5ldmFsdWF0ZWRDb25zdGFudCwKICAgICAgZXZhbHVhdGVBbm5vdGF0aW9uczogZXZhbHVhdGVBbm5vdGF0aW9ucyk7CiAgcmV0dXJuIGNvbXBvbmVudDsKfQoKdm9pZCB0cmFuc2Zvcm1MaWJyYXJpZXMoCiAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgIENvbnN0YW50c0JhY2tlbmQgYmFja2VuZCwKICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnREZWZpbmVzLAogICAgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwKICAgIEVycm9yUmVwb3J0ZXIgZXJyb3JSZXBvcnRlciwKICAgIHtib29sIGtlZXBGaWVsZHM6IHRydWUsCiAgICBib29sIGtlZXBWYXJpYWJsZXM6IGZhbHNlLAogICAgYm9vbCBldmFsdWF0ZUFubm90YXRpb25zOiB0cnVlLAogICAgYm9vbCBkZXN1Z2FyU2V0czogZmFsc2UsCiAgICBib29sIGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50OiBmYWxzZX0pIHsKICBmaW5hbCBDb25zdGFudHNUcmFuc2Zvcm1lciBjb25zdGFudHNUcmFuc2Zvcm1lciA9IG5ldyBDb25zdGFudHNUcmFuc2Zvcm1lcigKICAgICAgYmFja2VuZCwKICAgICAgZW52aXJvbm1lbnREZWZpbmVzLAogICAgICBrZWVwRmllbGRzLAogICAgICBrZWVwVmFyaWFibGVzLAogICAgICBldmFsdWF0ZUFubm90YXRpb25zLAogICAgICBkZXN1Z2FyU2V0cywKICAgICAgZXJyb3JPblVuZXZhbHVhdGVkQ29uc3RhbnQsCiAgICAgIHR5cGVFbnZpcm9ubWVudCwKICAgICAgZXJyb3JSZXBvcnRlcik7CiAgZm9yIChmaW5hbCBMaWJyYXJ5IGxpYnJhcnkgaW4gbGlicmFyaWVzKSB7CiAgICBjb25zdGFudHNUcmFuc2Zvcm1lci5jb252ZXJ0TGlicmFyeShsaWJyYXJ5KTsKICB9Cn0KCmNsYXNzIEphdmFTY3JpcHRJbnRDb25zdGFudCBleHRlbmRzIERvdWJsZUNvbnN0YW50IHsKICBmaW5hbCBCaWdJbnQgYmlnSW50VmFsdWU7CiAgSmF2YVNjcmlwdEludENvbnN0YW50KGludCB2YWx1ZSkgOiB0aGlzLmZyb21CaWdJbnQoQmlnSW50LmZyb20odmFsdWUpKTsKICBKYXZhU2NyaXB0SW50Q29uc3RhbnQuZnJvbURvdWJsZShkb3VibGUgdmFsdWUpCiAgICAgIDogYmlnSW50VmFsdWUgPSBCaWdJbnQuZnJvbSh2YWx1ZSksCiAgICAgICAgc3VwZXIodmFsdWUpOwogIEphdmFTY3JpcHRJbnRDb25zdGFudC5mcm9tQmlnSW50KHRoaXMuYmlnSW50VmFsdWUpCiAgICAgIDogc3VwZXIoYmlnSW50VmFsdWUudG9Eb3VibGUoKSk7CiAgSmF2YVNjcmlwdEludENvbnN0YW50LmZyb21VSW50NjQoaW50IHZhbHVlKQogICAgICA6IHRoaXMuZnJvbUJpZ0ludChCaWdJbnQuZnJvbSh2YWx1ZSkudG9VbnNpZ25lZCg2NCkpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgPT4gdHlwZXMuaW50VHlwZTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRiaWdJbnRWYWx1ZSc7Cn0KCmNsYXNzIENvbnN0YW50c1RyYW5zZm9ybWVyIGV4dGVuZHMgVHJhbnNmb3JtZXIgewogIGZpbmFsIENvbnN0YW50c0JhY2tlbmQgYmFja2VuZDsKICBmaW5hbCBDb25zdGFudEV2YWx1YXRvciBjb25zdGFudEV2YWx1YXRvcjsKICBmaW5hbCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50OwoKICAvLy8gV2hldGhlciB0byBwcmVzZXJ2ZSBjb25zdGFudCBbRmllbGRdcy4gIEFsbCB1c2Utc2l0ZXMgd2lsbCBiZSByZXdyaXR0ZW4uCiAgZmluYWwgYm9vbCBrZWVwRmllbGRzOwogIGZpbmFsIGJvb2wga2VlcFZhcmlhYmxlczsKICBmaW5hbCBib29sIGV2YWx1YXRlQW5ub3RhdGlvbnM7CiAgZmluYWwgYm9vbCBkZXN1Z2FyU2V0czsKICBmaW5hbCBib29sIGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50OwoKICBDb25zdGFudHNUcmFuc2Zvcm1lcigKICAgICAgdGhpcy5iYWNrZW5kLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50RGVmaW5lcywKICAgICAgdGhpcy5rZWVwRmllbGRzLAogICAgICB0aGlzLmtlZXBWYXJpYWJsZXMsCiAgICAgIHRoaXMuZXZhbHVhdGVBbm5vdGF0aW9ucywKICAgICAgdGhpcy5kZXN1Z2FyU2V0cywKICAgICAgdGhpcy5lcnJvck9uVW5ldmFsdWF0ZWRDb25zdGFudCwKICAgICAgdGhpcy50eXBlRW52aXJvbm1lbnQsCiAgICAgIEVycm9yUmVwb3J0ZXIgZXJyb3JSZXBvcnRlcikKICAgICAgOiBjb25zdGFudEV2YWx1YXRvciA9IG5ldyBDb25zdGFudEV2YWx1YXRvcigKICAgICAgICAgICAgYmFja2VuZCwgZW52aXJvbm1lbnREZWZpbmVzLCB0eXBlRW52aXJvbm1lbnQsIGVycm9yUmVwb3J0ZXIsCiAgICAgICAgICAgIGRlc3VnYXJTZXRzOiBkZXN1Z2FyU2V0cywKICAgICAgICAgICAgZXJyb3JPblVuZXZhbHVhdGVkQ29uc3RhbnQ6IGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50KTsKCiAgLy8gVHJhbnNmb3JtIHRoZSBsaWJyYXJ5L2NsYXNzIG1lbWJlcnM6CgogIHZvaWQgY29udmVydExpYnJhcnkoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICB0cmFuc2Zvcm1Bbm5vdGF0aW9ucyhsaWJyYXJ5LmFubm90YXRpb25zLCBsaWJyYXJ5KTsKCiAgICB0cmFuc2Zvcm1MaXN0KGxpYnJhcnkuZGVwZW5kZW5jaWVzLCB0aGlzLCBsaWJyYXJ5KTsKICAgIHRyYW5zZm9ybUxpc3QobGlicmFyeS5wYXJ0cywgdGhpcywgbGlicmFyeSk7CiAgICB0cmFuc2Zvcm1MaXN0KGxpYnJhcnkudHlwZWRlZnMsIHRoaXMsIGxpYnJhcnkpOwogICAgdHJhbnNmb3JtTGlzdChsaWJyYXJ5LmNsYXNzZXMsIHRoaXMsIGxpYnJhcnkpOwogICAgdHJhbnNmb3JtTGlzdChsaWJyYXJ5LnByb2NlZHVyZXMsIHRoaXMsIGxpYnJhcnkpOwogICAgdHJhbnNmb3JtTGlzdChsaWJyYXJ5LmZpZWxkcywgdGhpcywgbGlicmFyeSk7CgogICAgaWYgKCFrZWVwRmllbGRzKSB7CiAgICAgIC8vIFRoZSB0cmFuc2Zvcm1lciBBUEkgZG9lcyBub3QgaXRlcmF0ZSBvdmVyIGBMaWJyYXJ5LmFkZGl0aW9uYWxFeHBvcnRzYCwKICAgICAgLy8gc28gd2UgbWFudWFsbHkgZGVsZXRlIHRoZSByZWZlcmVuY2VzIHRvIHNoYWtlbiBub2Rlcy4KICAgICAgbGlicmFyeS5hZGRpdGlvbmFsRXhwb3J0cy5yZW1vdmVXaGVyZSgoUmVmZXJlbmNlIHJlZmVyZW5jZSkgewogICAgICAgIHJldHVybiByZWZlcmVuY2Uubm9kZSBpcyBGaWVsZCAmJiByZWZlcmVuY2UuY2Fub25pY2FsTmFtZSA9PSBudWxsOwogICAgICB9KTsKICAgIH0KICB9CgogIHZpc2l0TGlicmFyeVBhcnQoTGlicmFyeVBhcnQgbm9kZSkgewogICAgY29uc3RhbnRFdmFsdWF0b3Iud2l0aE5ld0Vudmlyb25tZW50KCgpIHsKICAgICAgdHJhbnNmb3JtQW5ub3RhdGlvbnMobm9kZS5hbm5vdGF0aW9ucywgbm9kZSk7CiAgICB9KTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgdmlzaXRMaWJyYXJ5RGVwZW5kZW5jeShMaWJyYXJ5RGVwZW5kZW5jeSBub2RlKSB7CiAgICBjb25zdGFudEV2YWx1YXRvci53aXRoTmV3RW52aXJvbm1lbnQoKCkgewogICAgICB0cmFuc2Zvcm1Bbm5vdGF0aW9ucyhub2RlLmFubm90YXRpb25zLCBub2RlKTsKICAgIH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICB2aXNpdENsYXNzKENsYXNzIG5vZGUpIHsKICAgIGNvbnN0YW50RXZhbHVhdG9yLndpdGhOZXdFbnZpcm9ubWVudCgoKSB7CiAgICAgIHRyYW5zZm9ybUFubm90YXRpb25zKG5vZGUuYW5ub3RhdGlvbnMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUuZmllbGRzLCB0aGlzLCBub2RlKTsKICAgICAgdHJhbnNmb3JtTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzLCB0aGlzLCBub2RlKTsKICAgICAgdHJhbnNmb3JtTGlzdChub2RlLmNvbnN0cnVjdG9ycywgdGhpcywgbm9kZSk7CiAgICAgIHRyYW5zZm9ybUxpc3Qobm9kZS5wcm9jZWR1cmVzLCB0aGlzLCBub2RlKTsKICAgICAgdHJhbnNmb3JtTGlzdChub2RlLnJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycywgdGhpcywgbm9kZSk7CiAgICB9KTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgdmlzaXRQcm9jZWR1cmUoUHJvY2VkdXJlIG5vZGUpIHsKICAgIGNvbnN0YW50RXZhbHVhdG9yLndpdGhOZXdFbnZpcm9ubWVudCgoKSB7CiAgICAgIHRyYW5zZm9ybUFubm90YXRpb25zKG5vZGUuYW5ub3RhdGlvbnMsIG5vZGUpOwogICAgICBub2RlLmZ1bmN0aW9uID0gbm9kZS5mdW5jdGlvbi5hY2NlcHQodGhpcykuLnBhcmVudCA9IG5vZGU7CiAgICB9KTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgdmlzaXRDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvciBub2RlKSB7CiAgICBjb25zdGFudEV2YWx1YXRvci53aXRoTmV3RW52aXJvbm1lbnQoKCkgewogICAgICB0cmFuc2Zvcm1Bbm5vdGF0aW9ucyhub2RlLmFubm90YXRpb25zLCBub2RlKTsKICAgICAgdHJhbnNmb3JtTGlzdChub2RlLmluaXRpYWxpemVycywgdGhpcywgbm9kZSk7CiAgICAgIG5vZGUuZnVuY3Rpb24gPSBub2RlLmZ1bmN0aW9uLmFjY2VwdCh0aGlzKS4ucGFyZW50ID0gbm9kZTsKICAgIH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICB2aXNpdFR5cGVkZWYoVHlwZWRlZiBub2RlKSB7CiAgICBjb25zdGFudEV2YWx1YXRvci53aXRoTmV3RW52aXJvbm1lbnQoKCkgewogICAgICB0cmFuc2Zvcm1Bbm5vdGF0aW9ucyhub2RlLmFubm90YXRpb25zLCBub2RlKTsKICAgICAgdHJhbnNmb3JtTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzLCB0aGlzLCBub2RlKTsKICAgICAgdHJhbnNmb3JtTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGUsIHRoaXMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMsIHRoaXMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUubmFtZWRQYXJhbWV0ZXJzLCB0aGlzLCBub2RlKTsKICAgIH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICB2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIGNvbnN0YW50RXZhbHVhdG9yLndpdGhOZXdFbnZpcm9ubWVudCgoKSB7CiAgICAgIHRyYW5zZm9ybUFubm90YXRpb25zKG5vZGUuYW5ub3RhdGlvbnMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMsIHRoaXMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMsIHRoaXMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUubmFtZWRQYXJhbWV0ZXJzLCB0aGlzLCBub2RlKTsKICAgIH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICB2aXNpdFR5cGVQYXJhbWV0ZXIoVHlwZVBhcmFtZXRlciBub2RlKSB7CiAgICB0cmFuc2Zvcm1Bbm5vdGF0aW9ucyhub2RlLmFubm90YXRpb25zLCBub2RlKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgdm9pZCB0cmFuc2Zvcm1Bbm5vdGF0aW9ucyhMaXN0PEV4cHJlc3Npb24+IG5vZGVzLCBUcmVlTm9kZSBwYXJlbnQpIHsKICAgIGlmIChldmFsdWF0ZUFubm90YXRpb25zICYmIG5vZGVzLmxlbmd0aCA+IDApIHsKICAgICAgdHJhbnNmb3JtRXhwcmVzc2lvbnMobm9kZXMsIHBhcmVudCk7CiAgICB9CiAgfQoKICB2b2lkIHRyYW5zZm9ybUV4cHJlc3Npb25zKExpc3Q8RXhwcmVzc2lvbj4gbm9kZXMsIFRyZWVOb2RlIHBhcmVudCkgewogICAgY29uc3RhbnRFdmFsdWF0b3Iud2l0aE5ld0Vudmlyb25tZW50KCgpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7ICsraSkgewogICAgICAgIG5vZGVzW2ldID0gZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dChwYXJlbnQsIG5vZGVzW2ldKQogICAgICAgICAgLi5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgLy8gSGFuZGxlIGRlZmluaXRpb24gb2YgY29uc3RhbnRzOgoKICB2aXNpdEZ1bmN0aW9uTm9kZShGdW5jdGlvbk5vZGUgbm9kZSkgewogICAgZmluYWwgcG9zaXRpb25hbFBhcmFtZXRlckNvdW50ID0gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9uYWxQYXJhbWV0ZXJDb3VudDsgKytpKSB7CiAgICAgIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICB0cmFuc2Zvcm1Bbm5vdGF0aW9ucyh2YXJpYWJsZS5hbm5vdGF0aW9ucywgdmFyaWFibGUpOwogICAgICBpZiAodmFyaWFibGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgIHZhcmlhYmxlLmluaXRpYWxpemVyID0KICAgICAgICAgICAgZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dCh2YXJpYWJsZSwgdmFyaWFibGUuaW5pdGlhbGl6ZXIpCiAgICAgICAgICAgICAgLi5wYXJlbnQgPSB2YXJpYWJsZTsKICAgICAgfQogICAgfQogICAgZm9yIChmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIG5vZGUubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIHRyYW5zZm9ybUFubm90YXRpb25zKHZhcmlhYmxlLmFubm90YXRpb25zLCB2YXJpYWJsZSk7CiAgICAgIGlmICh2YXJpYWJsZS5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIgPQogICAgICAgICAgICBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KHZhcmlhYmxlLCB2YXJpYWJsZS5pbml0aWFsaXplcikKICAgICAgICAgICAgICAuLnBhcmVudCA9IHZhcmlhYmxlOwogICAgICB9CiAgICB9CiAgICBpZiAobm9kZS5ib2R5ICE9IG51bGwpIHsKICAgICAgbm9kZS5ib2R5ID0gbm9kZS5ib2R5LmFjY2VwdCh0aGlzKS4ucGFyZW50ID0gbm9kZTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgdHJhbnNmb3JtQW5ub3RhdGlvbnMobm9kZS5hbm5vdGF0aW9ucywgbm9kZSk7CgogICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgICAgZmluYWwgQ29uc3RhbnQgY29uc3RhbnQgPSBldmFsdWF0ZVdpdGhDb250ZXh0KG5vZGUsIG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgICAgIGNvbnN0YW50RXZhbHVhdG9yLmVudi5hZGRWYXJpYWJsZVZhbHVlKG5vZGUsIGNvbnN0YW50KTsKICAgICAgICBub2RlLmluaXRpYWxpemVyID0gbWFrZUNvbnN0YW50RXhwcmVzc2lvbihjb25zdGFudCwgbm9kZS5pbml0aWFsaXplcikKICAgICAgICAgIC4ucGFyZW50ID0gbm9kZTsKCiAgICAgICAgLy8gSWYgdGhpcyBjb25zdGFudCBpcyBpbmxpbmVkLCByZW1vdmUgaXQuCiAgICAgICAgaWYgKCFrZWVwVmFyaWFibGVzICYmIHNob3VsZElubGluZShub2RlLmluaXRpYWxpemVyKSkgewogICAgICAgICAgaWYgKGNvbnN0YW50IGlzISBVbmV2YWx1YXRlZENvbnN0YW50KSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBjb25zdGFudCBpcyB1bmV2YWx1YXRlZCB3ZSBuZWVkIHRvIGtlZXAgdGhlIGV4cHJlc3Npb24sCiAgICAgICAgICAgIC8vIHNvIHRoYXQsIGluIHRoZSBjYXNlIHRoZSBjb25zdGFudCBjb250YWlucyBlcnJvciBidXQgdGhlIGxvY2FsCiAgICAgICAgICAgIC8vIGlzIHVudXNlZCwgdGhlIGVycm9yIHdpbGwgc3RpbGwgYmUgcmVwb3J0ZWQuCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBub2RlLmluaXRpYWxpemVyID0gbm9kZS5pbml0aWFsaXplci5hY2NlcHQodGhpcykuLnBhcmVudCA9IG5vZGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgdmlzaXRGaWVsZChGaWVsZCBub2RlKSB7CiAgICByZXR1cm4gY29uc3RhbnRFdmFsdWF0b3Iud2l0aE5ld0Vudmlyb25tZW50KCgpIHsKICAgICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICAgIHRyYW5zZm9ybUFubm90YXRpb25zKG5vZGUuYW5ub3RhdGlvbnMsIG5vZGUpOwogICAgICAgIG5vZGUuaW5pdGlhbGl6ZXIgPQogICAgICAgICAgICBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KG5vZGUsIG5vZGUuaW5pdGlhbGl6ZXIpCiAgICAgICAgICAgICAgLi5wYXJlbnQgPSBub2RlOwoKICAgICAgICAvLyBJZiB0aGlzIGNvbnN0YW50IGlzIGlubGluZWQsIHJlbW92ZSBpdC4KICAgICAgICBpZiAoIWtlZXBGaWVsZHMgJiYgc2hvdWxkSW5saW5lKG5vZGUuaW5pdGlhbGl6ZXIpKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHJhbnNmb3JtQW5ub3RhdGlvbnMobm9kZS5hbm5vdGF0aW9ucywgbm9kZSk7CiAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgbm9kZS5pbml0aWFsaXplciA9IG5vZGUuaW5pdGlhbGl6ZXIuYWNjZXB0KHRoaXMpLi5wYXJlbnQgPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbm9kZTsKICAgIH0pOwogIH0KCiAgLy8gSGFuZGxlIHVzZS1zaXRlcyBvZiBjb25zdGFudHMgKGFuZCAiaW5saW5lIiBjb25zdGFudCBleHByZXNzaW9ucyk6CgogIHZpc2l0U3ltYm9sTGl0ZXJhbChTeW1ib2xMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBtYWtlQ29uc3RhbnRFeHByZXNzaW9uKGNvbnN0YW50RXZhbHVhdG9yLmV2YWx1YXRlKG5vZGUpLCBub2RlKTsKICB9CgogIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlKSB7CiAgICBmaW5hbCBNZW1iZXIgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBpZiAodGFyZ2V0IGlzIEZpZWxkICYmIHRhcmdldC5pc0NvbnN0KSB7CiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgaW5pdGlhbGl6ZXIgaXMgZXZhbHVhdGVkIGZpcnN0LgogICAgICB0YXJnZXQuaW5pdGlhbGl6ZXIgPQogICAgICAgICAgZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dCh0YXJnZXQsIHRhcmdldC5pbml0aWFsaXplcikKICAgICAgICAgICAgLi5wYXJlbnQgPSB0YXJnZXQ7CiAgICAgIGlmIChzaG91bGRJbmxpbmUodGFyZ2V0LmluaXRpYWxpemVyKSkgewogICAgICAgIHJldHVybiBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KG5vZGUsIG5vZGUpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRhcmdldCBpcyBQcm9jZWR1cmUgJiYgdGFyZ2V0LmtpbmQgPT0gUHJvY2VkdXJlS2luZC5NZXRob2QpIHsKICAgICAgcmV0dXJuIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQobm9kZSwgbm9kZSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXIudmlzaXRTdGF0aWNHZXQobm9kZSk7CiAgfQoKICB2aXNpdFN3aXRjaENhc2UoU3dpdGNoQ2FzZSBub2RlKSB7CiAgICB0cmFuc2Zvcm1FeHByZXNzaW9ucyhub2RlLmV4cHJlc3Npb25zLCBub2RlKTsKICAgIHJldHVybiBzdXBlci52aXNpdFN3aXRjaENhc2Uobm9kZSk7CiAgfQoKICB2aXNpdFZhcmlhYmxlR2V0KFZhcmlhYmxlR2V0IG5vZGUpIHsKICAgIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBub2RlLnZhcmlhYmxlOwogICAgaWYgKHZhcmlhYmxlLmlzQ29uc3QpIHsKICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIgPQogICAgICAgICAgZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dCh2YXJpYWJsZSwgdmFyaWFibGUuaW5pdGlhbGl6ZXIpCiAgICAgICAgICAgIC4ucGFyZW50ID0gdmFyaWFibGU7CiAgICAgIGlmIChzaG91bGRJbmxpbmUodmFyaWFibGUuaW5pdGlhbGl6ZXIpKSB7CiAgICAgICAgcmV0dXJuIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQobm9kZSwgbm9kZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdXBlci52aXNpdFZhcmlhYmxlR2V0KG5vZGUpOwogIH0KCiAgdmlzaXRMaXN0TGl0ZXJhbChMaXN0TGl0ZXJhbCBub2RlKSB7CiAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KG5vZGUsIG5vZGUpOwogICAgfQogICAgcmV0dXJuIHN1cGVyLnZpc2l0TGlzdExpdGVyYWwobm9kZSk7CiAgfQoKICB2aXNpdExpc3RDb25jYXRlbmF0aW9uKExpc3RDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KG5vZGUsIG5vZGUpOwogIH0KCiAgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dChub2RlLCBub2RlKTsKICAgIH0KICAgIHJldHVybiBzdXBlci52aXNpdFNldExpdGVyYWwobm9kZSk7CiAgfQoKICB2aXNpdFNldENvbmNhdGVuYXRpb24oU2V0Q29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICByZXR1cm4gZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dChub2RlLCBub2RlKTsKICB9CgogIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQobm9kZSwgbm9kZSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXIudmlzaXRNYXBMaXRlcmFsKG5vZGUpOwogIH0KCiAgdmlzaXRNYXBDb25jYXRlbmF0aW9uKE1hcENvbmNhdGVuYXRpb24gbm9kZSkgewogICAgcmV0dXJuIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQobm9kZSwgbm9kZSk7CiAgfQoKICB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dChub2RlLCBub2RlKTsKICAgIH0KICAgIHJldHVybiBzdXBlci52aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihub2RlKTsKICB9CgogIHZpc2l0U3RhdGljSW52b2NhdGlvbihTdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQobm9kZSwgbm9kZSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXIudmlzaXRTdGF0aWNJbnZvY2F0aW9uKG5vZGUpOwogIH0KCiAgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIENvbnN0YW50IGNvbnN0YW50ID0gbm9kZS5jb25zdGFudDsKICAgIGlmIChjb25zdGFudCBpcyBVbmV2YWx1YXRlZENvbnN0YW50KSB7CiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGNvbnN0YW50LmV4cHJlc3Npb247CiAgICAgIHJldHVybiBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KGV4cHJlc3Npb24sIGV4cHJlc3Npb24pOwogICAgfSBlbHNlIHsKICAgICAgbm9kZS5jb25zdGFudCA9IGNvbnN0YW50RXZhbHVhdG9yLmNhbm9uaWNhbGl6ZShjb25zdGFudCk7CiAgICAgIHJldHVybiBub2RlOwogICAgfQogIH0KCiAgRXhwcmVzc2lvbiBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KAogICAgICBUcmVlTm9kZSB0cmVlQ29udGV4dCwgRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gbWFrZUNvbnN0YW50RXhwcmVzc2lvbihldmFsdWF0ZVdpdGhDb250ZXh0KHRyZWVDb250ZXh0LCBub2RlKSwgbm9kZSk7CiAgfQoKICBDb25zdGFudCBldmFsdWF0ZVdpdGhDb250ZXh0KFRyZWVOb2RlIHRyZWVDb250ZXh0LCBFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlmICh0cmVlQ29udGV4dCA9PSBub2RlKSB7CiAgICAgIHJldHVybiBjb25zdGFudEV2YWx1YXRvci5ldmFsdWF0ZShub2RlKTsKICAgIH0KCiAgICByZXR1cm4gY29uc3RhbnRFdmFsdWF0b3IucnVuSW5zaWRlQ29udGV4dCh0cmVlQ29udGV4dCwgKCkgewogICAgICByZXR1cm4gY29uc3RhbnRFdmFsdWF0b3IuZXZhbHVhdGUobm9kZSk7CiAgICB9KTsKICB9CgogIEV4cHJlc3Npb24gbWFrZUNvbnN0YW50RXhwcmVzc2lvbihDb25zdGFudCBjb25zdGFudCwgRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpZiAoY29uc3RhbnQgaXMgVW5ldmFsdWF0ZWRDb25zdGFudCAmJgogICAgICAgIGNvbnN0YW50LmV4cHJlc3Npb24gaXMgSW52YWxpZEV4cHJlc3Npb24pIHsKICAgICAgcmV0dXJuIGNvbnN0YW50LmV4cHJlc3Npb247CiAgICB9CiAgICByZXR1cm4gbmV3IENvbnN0YW50RXhwcmVzc2lvbihjb25zdGFudCwgbm9kZS5nZXRTdGF0aWNUeXBlKHR5cGVFbnZpcm9ubWVudCkpCiAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICB9CgogIGJvb2wgc2hvdWxkSW5saW5lKEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIpIHsKICAgIGlmIChpbml0aWFsaXplciBpcyBDb25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgcmV0dXJuIGJhY2tlbmQuc2hvdWxkSW5saW5lQ29uc3RhbnQoaW5pdGlhbGl6ZXIpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQp9CgpjbGFzcyBDb25zdGFudEV2YWx1YXRvciBleHRlbmRzIFJlY3Vyc2l2ZVZpc2l0b3I8Q29uc3RhbnQ+IHsKICBmaW5hbCBDb25zdGFudHNCYWNrZW5kIGJhY2tlbmQ7CiAgZmluYWwgTnVtYmVyU2VtYW50aWNzIG51bWJlclNlbWFudGljczsKICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50RGVmaW5lczsKICBmaW5hbCBib29sIGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50OwogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CiAgZmluYWwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudDsKICBmaW5hbCBFcnJvclJlcG9ydGVyIGVycm9yUmVwb3J0ZXI7CgogIGZpbmFsIGJvb2wgZGVzdWdhclNldHM7CiAgZmluYWwgRmllbGQgdW5tb2RpZmlhYmxlU2V0TWFwOwoKICBmaW5hbCBpc0luc3RhbnRpYXRlZCA9IG5ldyBJc0luc3RhbnRpYXRlZFZpc2l0b3IoKS5pc0luc3RhbnRpYXRlZDsKCiAgZmluYWwgTWFwPENvbnN0YW50LCBDb25zdGFudD4gY2Fub25pY2FsaXphdGlvbkNhY2hlOwogIGZpbmFsIE1hcDxOb2RlLCBPYmplY3Q+IG5vZGVDYWNoZTsKICBmaW5hbCBDbG9uZVZpc2l0b3IgY2xvbmVyID0gbmV3IENsb25lVmlzaXRvcigpOwoKICBNYXA8Q2xhc3MsIGJvb2w+IHByaW1pdGl2ZUVxdWFsQ2FjaGU7CgogIGZpbmFsIE51bGxDb25zdGFudCBudWxsQ29uc3RhbnQgPSBuZXcgTnVsbENvbnN0YW50KCk7CiAgZmluYWwgQm9vbENvbnN0YW50IHRydWVDb25zdGFudCA9IG5ldyBCb29sQ29uc3RhbnQodHJ1ZSk7CiAgZmluYWwgQm9vbENvbnN0YW50IGZhbHNlQ29uc3RhbnQgPSBuZXcgQm9vbENvbnN0YW50KGZhbHNlKTsKCiAgZmluYWwgTGlzdDxUcmVlTm9kZT4gY29udGV4dENoYWluID0gW107CgogIEluc3RhbmNlQnVpbGRlciBpbnN0YW5jZUJ1aWxkZXI7CiAgRXZhbHVhdGlvbkVudmlyb25tZW50IGVudjsKICBTZXQ8RXhwcmVzc2lvbj4gcmVwbGFjZW1lbnROb2RlcyA9IG5ldyBTZXQ8RXhwcmVzc2lvbj4uaWRlbnRpdHkoKTsKICBNYXA8Q29uc3RhbnQsIENvbnN0YW50PiBsb3dlcmVkID0gbmV3IE1hcDxDb25zdGFudCwgQ29uc3RhbnQ+LmlkZW50aXR5KCk7CgogIGJvb2wgc2VlblVuZXZhbHVhdGVkQ2hpbGQ7IC8vIEFueSBjaGlsZHJlbiB0aGF0IHdlcmUgbGVmdCB1bmV2YWx1YXRlZD8KICBpbnQgbGF6eURlcHRoOyAvLyBDdXJyZW50IG5lc3RpbmcgZGVwdGggb2YgbGF6eSByZWdpb25zLgoKICBib29sIGdldCBzaG91bGRCZVVuZXZhbHVhdGVkID0+IHNlZW5VbmV2YWx1YXRlZENoaWxkIHx8IGxhenlEZXB0aCAhPSAwOwoKICBib29sIGdldCB0YXJnZXRpbmdKYXZhU2NyaXB0ID0+IG51bWJlclNlbWFudGljcyA9PSBOdW1iZXJTZW1hbnRpY3MuanM7CgogIENvbnN0YW50RXZhbHVhdG9yKHRoaXMuYmFja2VuZCwgdGhpcy5lbnZpcm9ubWVudERlZmluZXMsIHRoaXMudHlwZUVudmlyb25tZW50LAogICAgICB0aGlzLmVycm9yUmVwb3J0ZXIsCiAgICAgIHt0aGlzLmRlc3VnYXJTZXRzID0gZmFsc2UsIHRoaXMuZXJyb3JPblVuZXZhbHVhdGVkQ29uc3RhbnQgPSBmYWxzZX0pCiAgICAgIDogbnVtYmVyU2VtYW50aWNzID0gYmFja2VuZC5udW1iZXJTZW1hbnRpY3MsCiAgICAgICAgY29yZVR5cGVzID0gdHlwZUVudmlyb25tZW50LmNvcmVUeXBlcywKICAgICAgICBjYW5vbmljYWxpemF0aW9uQ2FjaGUgPSA8Q29uc3RhbnQsIENvbnN0YW50Pnt9LAogICAgICAgIG5vZGVDYWNoZSA9IDxOb2RlLCBDb25zdGFudD57fSwKICAgICAgICBlbnYgPSBuZXcgRXZhbHVhdGlvbkVudmlyb25tZW50KCksCiAgICAgICAgdW5tb2RpZmlhYmxlU2V0TWFwID0gZGVzdWdhclNldHMKICAgICAgICAgICAgPyB0eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLmluZGV4CiAgICAgICAgICAgICAgICAuZ2V0TWVtYmVyKCdkYXJ0OmNvbGxlY3Rpb24nLCAnX1VubW9kaWZpYWJsZVNldCcsICdfbWFwJykKICAgICAgICAgICAgOiBudWxsIHsKICAgIGlmIChlbnZpcm9ubWVudERlZmluZXMgPT0gbnVsbCAmJiAhYmFja2VuZC5zdXBwb3J0c1VuZXZhbHVhdGVkQ29uc3RhbnRzKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgIk5vICdlbnZpcm9ubWVudERlZmluZXMnIHBhc3NlZCB0byB0aGUgY29uc3RhbnQgZXZhbHVhdG9yIGJ1dCB0aGUgIgogICAgICAgICAgIkNvbnN0YW50c0JhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCB1bmV2YWx1YXRlZCBjb25zdGFudHMuIik7CiAgICB9CiAgICBwcmltaXRpdmVFcXVhbENhY2hlID0gPENsYXNzLCBib29sPnsKICAgICAgY29yZVR5cGVzLmJvb2xDbGFzczogdHJ1ZSwKICAgICAgY29yZVR5cGVzLmRvdWJsZUNsYXNzOiBmYWxzZSwKICAgICAgY29yZVR5cGVzLmludENsYXNzOiB0cnVlLAogICAgICBjb3JlVHlwZXMuaW50ZXJuYWxTeW1ib2xDbGFzczogdHJ1ZSwKICAgICAgY29yZVR5cGVzLmxpc3RDbGFzczogdHJ1ZSwKICAgICAgY29yZVR5cGVzLm1hcENsYXNzOiB0cnVlLAogICAgICBjb3JlVHlwZXMubnVsbENsYXNzOiB0cnVlLAogICAgICBjb3JlVHlwZXMub2JqZWN0Q2xhc3M6IHRydWUsCiAgICAgIGNvcmVUeXBlcy5zZXRDbGFzczogdHJ1ZSwKICAgICAgY29yZVR5cGVzLnN0cmluZ0NsYXNzOiB0cnVlLAogICAgICBjb3JlVHlwZXMuc3ltYm9sQ2xhc3M6IHRydWUsCiAgICAgIGNvcmVUeXBlcy50eXBlQ2xhc3M6IHRydWUsCiAgICB9OwogIH0KCiAgVXJpIGdldEZpbGVVcmkoVHJlZU5vZGUgbm9kZSkgewogICAgd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBub2RlIGlzISBGaWxlVXJpTm9kZSkgewogICAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICB9CiAgICByZXR1cm4gKG5vZGUgYXMgRmlsZVVyaU5vZGUpPy5maWxlVXJpOwogIH0KCiAgaW50IGdldEZpbGVPZmZzZXQoVXJpIHVyaSwgVHJlZU5vZGUgbm9kZSkgewogICAgaWYgKHVyaSA9PSBudWxsKSByZXR1cm4gVHJlZU5vZGUubm9PZmZzZXQ7CiAgICB3aGlsZSAobm9kZSAhPSBudWxsICYmIG5vZGUuZmlsZU9mZnNldCA9PSBUcmVlTm9kZS5ub09mZnNldCkgewogICAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICB9CiAgICByZXR1cm4gbm9kZSA9PSBudWxsID8gVHJlZU5vZGUubm9PZmZzZXQgOiBub2RlLmZpbGVPZmZzZXQ7CiAgfQoKICAvLy8gRXZhbHVhdGUgW25vZGVdIGFuZCBwb3NzaWJseSBjYWNoZSB0aGUgZXZhbHVhdGlvbiByZXN1bHQuCiAgLy8vIFJldHVybnMgVW5ldmFsdWF0ZWRDb25zdGFudCBpZiB0aGUgY29uc3RhbnQgY291bGQgbm90IGJlIGV2YWx1YXRlZC4KICAvLy8gSWYgdGhlIGV4cHJlc3Npb24gaW4gdGhlIFVuZXZhbHVhdGVkQ29uc3RhbnQgaXMgYW4gSW52YWxpZEV4cHJlc3Npb24sCiAgLy8vIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBjb25zdGFudCBldmFsdWF0aW9uLgogIENvbnN0YW50IGV2YWx1YXRlKEV4cHJlc3Npb24gbm9kZSkgewogICAgc2VlblVuZXZhbHVhdGVkQ2hpbGQgPSBmYWxzZTsKICAgIGxhenlEZXB0aCA9IDA7CiAgICB0cnkgewogICAgICBDb25zdGFudCByZXN1bHQgPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUpOwogICAgICBpZiAoZXJyb3JPblVuZXZhbHVhdGVkQ29uc3RhbnQgJiYgcmVzdWx0IGlzIFVuZXZhbHVhdGVkQ29uc3RhbnQpIHsKICAgICAgICByZXR1cm4gcmVwb3J0KG5vZGUsIG1lc3NhZ2VDb25zdEV2YWxVbmV2YWx1YXRlZCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0gb24gX0Fib3J0RHVlVG9FcnJvciBjYXRjaCAoZSkgewogICAgICBmaW5hbCBVcmkgdXJpID0gZ2V0RmlsZVVyaShlLm5vZGUpOwogICAgICBmaW5hbCBpbnQgZmlsZU9mZnNldCA9IGdldEZpbGVPZmZzZXQodXJpLCBlLm5vZGUpOwogICAgICBmaW5hbCBsb2NhdGVkTWVzc2FnZSA9IGUubWVzc2FnZS53aXRoTG9jYXRpb24odXJpLCBmaWxlT2Zmc2V0LCBub0xlbmd0aCk7CgogICAgICBmaW5hbCBjb250ZXh0TWVzc2FnZXMgPSA8TG9jYXRlZE1lc3NhZ2U+W107CiAgICAgIGlmIChlLmNvbnRleHQgIT0gbnVsbCkgY29udGV4dE1lc3NhZ2VzLmFkZEFsbChlLmNvbnRleHQpOwogICAgICBmb3IgKGZpbmFsIFRyZWVOb2RlIG5vZGUgaW4gY29udGV4dENoYWluKSB7CiAgICAgICAgZmluYWwgVXJpIHVyaSA9IGdldEZpbGVVcmkobm9kZSk7CiAgICAgICAgZmluYWwgaW50IGZpbGVPZmZzZXQgPSBnZXRGaWxlT2Zmc2V0KHVyaSwgbm9kZSk7CiAgICAgICAgY29udGV4dE1lc3NhZ2VzLmFkZCgKICAgICAgICAgICAgbWVzc2FnZUNvbnN0RXZhbENvbnRleHQud2l0aExvY2F0aW9uKHVyaSwgZmlsZU9mZnNldCwgbm9MZW5ndGgpKTsKICAgICAgfQogICAgICBlcnJvclJlcG9ydGVyLnJlcG9ydChsb2NhdGVkTWVzc2FnZSwgY29udGV4dE1lc3NhZ2VzKTsKICAgICAgcmV0dXJuIG5ldyBVbmV2YWx1YXRlZENvbnN0YW50KG5ldyBJbnZhbGlkRXhwcmVzc2lvbihlLm1lc3NhZ2UubWVzc2FnZSkpOwogICAgfSBvbiBfQWJvcnREdWVUb0ludmFsaWRFeHByZXNzaW9uIGNhdGNoIChlKSB7CiAgICAgIC8vIFRPRE8oYXNrZXNjKTogQ29weSBwb3NpdGlvbiBmcm9tIGVycm9uZW91cyBub2RlLgogICAgICAvLyBDdXJyZW50bHkgbm90IHBvc3NpYmxlLCBhcyBpdCBtaWdodCBiZSBpbiBhIGRpZmZlcmVudCBmaWxlLgogICAgICAvLyBDYW4gYmUgZG9uZSBpZiB3ZSBhZGQgYW4gZXhwbGljaXQgVVJJIHRvIEludmFsaWRFeHByZXNzaW9uLgogICAgICBJbnZhbGlkRXhwcmVzc2lvbiBpbnZhbGlkID0gbmV3IEludmFsaWRFeHByZXNzaW9uKGUubWVzc2FnZSk7CiAgICAgIGlmIChpbnZhbGlkLmZpbGVPZmZzZXQgPT0gVHJlZU5vZGUubm9PZmZzZXQpIHsKICAgICAgICBpbnZhbGlkLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICAgIH0KICAgICAgZXJyb3JSZXBvcnRlci5yZXBvcnRJbnZhbGlkRXhwcmVzc2lvbihpbnZhbGlkKTsKICAgICAgcmV0dXJuIG5ldyBVbmV2YWx1YXRlZENvbnN0YW50KGludmFsaWQpOwogICAgfQogIH0KCiAgLy8vIFJlcG9ydCBhbiBlcnJvciB0aGF0IGhhcyBiZWVuIGRldGVjdGVkIGR1cmluZyBjb25zdGFudCBldmFsdWF0aW9uLgogIE51bGwgcmVwb3J0KFRyZWVOb2RlIG5vZGUsIE1lc3NhZ2UgbWVzc2FnZSwge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICB0aHJvdyBuZXcgX0Fib3J0RHVlVG9FcnJvcihub2RlLCBtZXNzYWdlLCBjb250ZXh0OiBjb250ZXh0KTsKICB9CgogIC8vLyBSZXBvcnQgYSBjb25zdHJ1Y3QgdGhhdCBzaG91bGQgbm90IG9jY3VyIGluc2lkZSBhIHBvdGVudGlhbGx5IGNvbnN0YW50CiAgLy8vIGV4cHJlc3Npb24uIEl0IGlzIGFzc3VtZWQgdGhhdCBhbiBlcnJvciBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLgogIE51bGwgcmVwb3J0SW52YWxpZChUcmVlTm9kZSBub2RlLCBTdHJpbmcgbWVzc2FnZSkgewogICAgdGhyb3cgbmV3IF9BYm9ydER1ZVRvSW52YWxpZEV4cHJlc3Npb24obm9kZSwgbWVzc2FnZSk7CiAgfQoKICAvLy8gUHJvZHVjZSBhbiB1bmV2YWx1YXRlZCBjb25zdGFudCBub2RlIGZvciBhbiBleHByZXNzaW9uLgogIENvbnN0YW50IHVuZXZhbHVhdGVkKEV4cHJlc3Npb24gb3JpZ2luYWwsIEV4cHJlc3Npb24gcmVwbGFjZW1lbnQpIHsKICAgIHJlcGxhY2VtZW50LmZpbGVPZmZzZXQgPSBvcmlnaW5hbC5maWxlT2Zmc2V0OwogICAgLy8gVE9ETyhhc2tlc2Msam9obm5pd2ludGhlcik6IFByZXNlcnZlIGZpbGVVcmkgb24gW3JlcGxhY2VtZW50XS4KICAgIHJldHVybiBuZXcgVW5ldmFsdWF0ZWRDb25zdGFudChyZXBsYWNlbWVudCk7CiAgfQoKICAvLy8gRXh0cmFjdCBhbiBleHByZXNzaW9uIGZyb20gYSAocG9zc2libHkgdW5ldmFsdWF0ZWQpIGNvbnN0YW50IHRvIGJlY29tZQogIC8vLyBwYXJ0IG9mIHRoZSBleHByZXNzaW9uIHRyZWUgb2YgYW5vdGhlciB1bmV2YWx1YXRlZCBjb25zdGFudC4KICAvLy8gTWFrZXMgc3VyZSBhIHBhcnRpY3VsYXIgZXhwcmVzc2lvbiBvY2N1cnMgb25seSBvbmNlIGluIHRoZSB0cmVlIGJ5CiAgLy8vIGNsb25pbmcgZnVydGhlciBpbnN0YW5jZXMuCiAgRXhwcmVzc2lvbiBleHRyYWN0KENvbnN0YW50IGNvbnN0YW50KSB7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBjb25zdGFudC5hc0V4cHJlc3Npb24oKTsKICAgIGlmICghcmVwbGFjZW1lbnROb2Rlcy5hZGQoZXhwcmVzc2lvbikpIHsKICAgICAgZXhwcmVzc2lvbiA9IGNsb25lci5jbG9uZShleHByZXNzaW9uKTsKICAgICAgcmVwbGFjZW1lbnROb2Rlcy5hZGQoZXhwcmVzc2lvbik7CiAgICB9CiAgICByZXR1cm4gZXhwcmVzc2lvbjsKICB9CgogIC8vLyBFbnRlciBhIHJlZ2lvbiBvZiBsYXp5IGV2YWx1YXRpb24uIEFsbCBsZWFmIG5vZGVzIGFyZSBldmFsdWF0ZWQgbm9ybWFsbHkKICAvLy8gKHRvIGVuc3VyZSBpbmxpbmluZyBvZiByZWZlcmVuY2VkIGxvY2FsIHZhcmlhYmxlcyksIGJ1dCBjb21wb3NpdGUgbm9kZXMKICAvLy8gYWx3YXlzIHRyZWF0IHRoZWlyIGNoaWxkcmVuIGFzIHVuZXZhbHVhdGVkLCByZXN1bHRpbmcgaW4gYSBwYXJ0aWFsbHkKICAvLy8gZXZhbHVhdGVkIGNsb25lIG9mIHRoZSBvcmlnaW5hbCBleHByZXNzaW9uIHRyZWUuCiAgLy8vIExhenkgZXZhbHVhdGlvbiBpcyB1c2VkIGZvciB0aGUgc3VidHJlZXMgb2YgbGF6eSBvcGVyYXRpb25zIHdpdGgKICAvLy8gdW5ldmFsdWF0ZWQgY29uZGl0aW9ucyB0byBlbnN1cmUgbm8gZXJyb3JzIGFyZSByZXBvcnRlZCBmb3IgcHJvYmxlbXMKICAvLy8gaW4gdGhlIHN1YnRyZWUgYXMgbG9uZyBhcyB0aGUgc3VidHJlZSBpcyBwb3RlbnRpYWxseSBjb25zdGFudC4KICB2b2lkIGVudGVyTGF6eSgpID0+IGxhenlEZXB0aCsrOwoKICAvLy8gTGVhdmUgYSAocG9zc2libHkgbmVzdGVkKSByZWdpb24gb2YgbGF6eSBldmFsdWF0aW9uLgogIHZvaWQgbGVhdmVMYXp5KCkgPT4gbGF6eURlcHRoLS07CgogIENvbnN0YW50IGxvd2VyKENvbnN0YW50IG9yaWdpbmFsLCBDb25zdGFudCByZXBsYWNlbWVudCkgewogICAgaWYgKCFpZGVudGljYWwob3JpZ2luYWwsIHJlcGxhY2VtZW50KSkgewogICAgICBvcmlnaW5hbCA9IGNhbm9uaWNhbGl6ZShvcmlnaW5hbCk7CiAgICAgIHJlcGxhY2VtZW50ID0gY2Fub25pY2FsaXplKHJlcGxhY2VtZW50KTsKICAgICAgbG93ZXJlZFtyZXBsYWNlbWVudF0gPSBvcmlnaW5hbDsKICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OwogICAgfQogICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShyZXBsYWNlbWVudCk7CiAgfQoKICBDb25zdGFudCB1bmxvd2VyKENvbnN0YW50IGNvbnN0YW50KSB7CiAgICByZXR1cm4gbG93ZXJlZFtjb25zdGFudF0gPz8gY29uc3RhbnQ7CiAgfQoKICBDb25zdGFudCBsb3dlckxpc3RDb25zdGFudChMaXN0Q29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSByZXR1cm4gY29uc3RhbnQ7CiAgICByZXR1cm4gbG93ZXIoY29uc3RhbnQsIGJhY2tlbmQubG93ZXJMaXN0Q29uc3RhbnQoY29uc3RhbnQpKTsKICB9CgogIENvbnN0YW50IGxvd2VyU2V0Q29uc3RhbnQoU2V0Q29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSByZXR1cm4gY29uc3RhbnQ7CiAgICByZXR1cm4gbG93ZXIoY29uc3RhbnQsIGJhY2tlbmQubG93ZXJTZXRDb25zdGFudChjb25zdGFudCkpOwogIH0KCiAgQ29uc3RhbnQgbG93ZXJNYXBDb25zdGFudChNYXBDb25zdGFudCBjb25zdGFudCkgewogICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHJldHVybiBjb25zdGFudDsKICAgIHJldHVybiBsb3dlcihjb25zdGFudCwgYmFja2VuZC5sb3dlck1hcENvbnN0YW50KGNvbnN0YW50KSk7CiAgfQoKICAvLy8gRXZhbHVhdGUgW25vZGVdIGFuZCBwb3NzaWJseSBjYWNoZSB0aGUgZXZhbHVhdGlvbiByZXN1bHQuCiAgLy8vIEB0aHJvd3MgX0Fib3J0RHVlVG9FcnJvciBvciBfQWJvcnREdWVUb0ludmFsaWRFeHByZXNzaW9uIGlmIGV4cHJlc3Npb24KICAvLy8gY2FuJ3QgYmUgZXZhbHVhdGVkLgogIENvbnN0YW50IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSB7CiAgICBib29sIHdhc1VuZXZhbHVhdGVkID0gc2VlblVuZXZhbHVhdGVkQ2hpbGQ7CiAgICBzZWVuVW5ldmFsdWF0ZWRDaGlsZCA9IGZhbHNlOwogICAgQ29uc3RhbnQgcmVzdWx0OwogICAgaWYgKGVudi5pc0VtcHR5KSB7CiAgICAgIC8vIFdlIG9ubHkgdHJ5IHRvIGV2YWx1YXRlIHRoZSBzYW1lIFtub2RlXSAqb25jZSogd2l0aGluIGFuIGVtcHR5CiAgICAgIC8vIGVudmlyb25tZW50LgogICAgICBpZiAobm9kZUNhY2hlLmNvbnRhaW5zS2V5KG5vZGUpKSB7CiAgICAgICAgcmVzdWx0ID0gbm9kZUNhY2hlW25vZGVdID8/IHJlcG9ydChub2RlLCBtZXNzYWdlQ29uc3RFdmFsQ2lyY3VsYXJpdHkpOwogICAgICB9IGVsc2UgewogICAgICAgIG5vZGVDYWNoZVtub2RlXSA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJlc3VsdCA9IG5vZGVDYWNoZVtub2RlXSA9IG5vZGUuYWNjZXB0KHRoaXMpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIG5vZGVDYWNoZS5yZW1vdmUobm9kZSk7CiAgICAgICAgICByZXRocm93OwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gbm9kZS5hY2NlcHQodGhpcyk7CiAgICB9CiAgICBzZWVuVW5ldmFsdWF0ZWRDaGlsZCA9IHdhc1VuZXZhbHVhdGVkIHx8IHJlc3VsdCBpcyBVbmV2YWx1YXRlZENvbnN0YW50OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIENvbnN0YW50IF9ldmFsdWF0ZU51bGxhYmxlU3ViZXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiBudWxsQ29uc3RhbnQ7CiAgICByZXR1cm4gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlKTsKICB9CgogIENvbnN0YW50IHJ1bkluc2lkZUNvbnRleHQoVHJlZU5vZGUgbm9kZSwgQ29uc3RhbnQgZnVuKCkpIHsKICAgIHRyeSB7CiAgICAgIHB1c2hDb250ZXh0KG5vZGUpOwogICAgICByZXR1cm4gZnVuKCk7CiAgICB9IGZpbmFsbHkgewogICAgICBwb3BDb250ZXh0KG5vZGUpOwogICAgfQogIH0KCiAgQ29uc3RhbnQgcnVuSW5zaWRlQ29udGV4dElmTm9Db250ZXh0KFRyZWVOb2RlIG5vZGUsIENvbnN0YW50IGZ1bigpKSB7CiAgICBpZiAoY29udGV4dENoYWluLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIHJ1bkluc2lkZUNvbnRleHQobm9kZSwgZnVuKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmdW4oKTsKICAgIH0KICB9CgogIHB1c2hDb250ZXh0KFRyZWVOb2RlIGNvbnRleHROb2RlKSB7CiAgICBjb250ZXh0Q2hhaW4uYWRkKGNvbnRleHROb2RlKTsKICB9CgogIHBvcENvbnRleHQoVHJlZU5vZGUgY29udGV4dE5vZGUpIHsKICAgIGFzc2VydChjb250ZXh0Q2hhaW4ubGFzdCA9PSBjb250ZXh0Tm9kZSk7CiAgICBjb250ZXh0Q2hhaW4ubGVuZ3RoID0gY29udGV4dENoYWluLmxlbmd0aCAtIDE7CiAgfQoKICBkZWZhdWx0VHJlZU5vZGUoTm9kZSBub2RlKSB7CiAgICAvLyBPbmx5IGEgc3Vic2V0IG9mIHRoZSBleHByZXNzaW9uIGxhbmd1YWdlIGlzIHZhbGlkIGZvciBjb25zdGFudAogICAgLy8gZXZhbHVhdGlvbi4KICAgIHJldHVybiByZXBvcnRJbnZhbGlkKAogICAgICAgIG5vZGUsICdDb25zdGFudCBldmFsdWF0aW9uIGhhcyBubyBzdXBwb3J0IGZvciAke25vZGUucnVudGltZVR5cGV9IScpOwogIH0KCiAgdmlzaXROdWxsTGl0ZXJhbChOdWxsTGl0ZXJhbCBub2RlKSA9PiBudWxsQ29uc3RhbnQ7CgogIHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG1ha2VCb29sQ29uc3RhbnQobm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdEludExpdGVyYWwoSW50TGl0ZXJhbCBub2RlKSB7CiAgICAvLyBUaGUgZnJvbnRlbmQgZW5zdXJlcyB0aGF0IGludGVnZXIgbGl0ZXJhbHMgYXJlIHZhbGlkIGFjY29yZGluZyB0byB0aGUKICAgIC8vIHRhcmdldCByZXByZXNlbnRhdGlvbi4KICAgIHJldHVybiB0YXJnZXRpbmdKYXZhU2NyaXB0CiAgICAgICAgPyBjYW5vbmljYWxpemUobmV3IEphdmFTY3JpcHRJbnRDb25zdGFudC5mcm9tVUludDY0KG5vZGUudmFsdWUpKQogICAgICAgIDogY2Fub25pY2FsaXplKG5ldyBJbnRDb25zdGFudChub2RlLnZhbHVlKSk7CiAgfQoKICB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gY2Fub25pY2FsaXplKG1ha2VEb3VibGVDb25zdGFudChub2RlLnZhbHVlKSk7CiAgfQoKICB2aXNpdFN0cmluZ0xpdGVyYWwoU3RyaW5nTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBTdHJpbmdDb25zdGFudChub2RlLnZhbHVlKSk7CiAgfQoKICB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUpIHsKICAgIGZpbmFsIERhcnRUeXBlIHR5cGUgPSBldmFsdWF0ZURhcnRUeXBlKG5vZGUsIG5vZGUudHlwZSk7CiAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBUeXBlTGl0ZXJhbENvbnN0YW50KHR5cGUpKTsKICB9CgogIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50RXhwcmVzc2lvbiBub2RlKSB7CiAgICBDb25zdGFudCBjb25zdGFudCA9IG5vZGUuY29uc3RhbnQ7CiAgICBDb25zdGFudCByZXN1bHQgPSBjb25zdGFudDsKICAgIGlmIChjb25zdGFudCBpcyBVbmV2YWx1YXRlZENvbnN0YW50KSB7CiAgICAgIHJlc3VsdCA9IHJ1bkluc2lkZUNvbnRleHQoY29uc3RhbnQuZXhwcmVzc2lvbiwgKCkgewogICAgICAgIHJldHVybiBfZXZhbHVhdGVTdWJleHByZXNzaW9uKGNvbnN0YW50LmV4cHJlc3Npb24pOwogICAgICB9KTsKICAgIH0gZWxzZSBpZiAodGFyZ2V0aW5nSmF2YVNjcmlwdCkgewogICAgICBpZiAoY29uc3RhbnQgaXMgRG91YmxlQ29uc3RhbnQpIHsKICAgICAgICBkb3VibGUgdmFsdWUgPSBjb25zdGFudC52YWx1ZTsKICAgICAgICAvLyBUT0RPKGFza2VzYywgZmlzaHl0aGVmaXNoKTogSGFuZGxlIGluZmluaXRlIGludGVnZXJzLgogICAgICAgIGlmICh2YWx1ZS5pc0Zpbml0ZSAmJiB2YWx1ZS50cnVuY2F0ZVRvRG91YmxlKCkgPT0gdmFsdWUpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBKYXZhU2NyaXB0SW50Q29uc3RhbnQuZnJvbURvdWJsZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyBJZiB0aGVyZSB3ZXJlIGFscmVhZHkgY29uc3RhbnRzIGluIHRoZSBBU1QgdGhlbiB3ZSBtYWtlIHN1cmUgd2UKICAgIC8vIHJlLWNhbm9uaWNhbGl6ZSB0aGVtLiAgQWZ0ZXIgcnVubmluZyB0aGUgdHJhbnNmb3JtZXIgd2Ugd2lsbCB0aGVyZWZvcmUKICAgIC8vIGhhdmUgYSBmdWxseS1jYW5vbmljYWxpemVkIGNvbnN0YW50IERBRyB3aXRoIHJvb3RzIGNvbWluZyBmcm9tIHRoZQogICAgLy8gW0NvbnN0YW50RXhwcmVzc2lvbl0gbm9kZXMgaW4gdGhlIEFTVC4KICAgIHJldHVybiBjYW5vbmljYWxpemUocmVzdWx0KTsKICB9CgogIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgewogICAgaWYgKCFub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgIG5vZGUsIHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsLndpdGhBcmd1bWVudHMoJ0xpc3QnKSk7CiAgICB9CiAgICBmaW5hbCBMaXN0Q29uc3RhbnRCdWlsZGVyIGJ1aWxkZXIgPQogICAgICAgIG5ldyBMaXN0Q29uc3RhbnRCdWlsZGVyKG5vZGUsIG5vZGUudHlwZUFyZ3VtZW50LCB0aGlzKTsKICAgIGZvciAoRXhwcmVzc2lvbiBlbGVtZW50IGluIG5vZGUuZXhwcmVzc2lvbnMpIHsKICAgICAgYnVpbGRlci5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwogIH0KCiAgdmlzaXRMaXN0Q29uY2F0ZW5hdGlvbihMaXN0Q29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBmaW5hbCBMaXN0Q29uc3RhbnRCdWlsZGVyIGJ1aWxkZXIgPQogICAgICAgIG5ldyBMaXN0Q29uc3RhbnRCdWlsZGVyKG5vZGUsIG5vZGUudHlwZUFyZ3VtZW50LCB0aGlzKTsKICAgIGZvciAoRXhwcmVzc2lvbiBsaXN0IGluIG5vZGUubGlzdHMpIHsKICAgICAgYnVpbGRlci5hZGRTcHJlYWQobGlzdCk7CiAgICB9CiAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwogIH0KCiAgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSkgewogICAgaWYgKCFub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgIG5vZGUsIHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsLndpdGhBcmd1bWVudHMoJ1NldCcpKTsKICAgIH0KICAgIGZpbmFsIFNldENvbnN0YW50QnVpbGRlciBidWlsZGVyID0KICAgICAgICBuZXcgU2V0Q29uc3RhbnRCdWlsZGVyKG5vZGUsIG5vZGUudHlwZUFyZ3VtZW50LCB0aGlzKTsKICAgIGZvciAoRXhwcmVzc2lvbiBlbGVtZW50IGluIG5vZGUuZXhwcmVzc2lvbnMpIHsKICAgICAgYnVpbGRlci5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwogIH0KCiAgdmlzaXRTZXRDb25jYXRlbmF0aW9uKFNldENvbmNhdGVuYXRpb24gbm9kZSkgewogICAgZmluYWwgU2V0Q29uc3RhbnRCdWlsZGVyIGJ1aWxkZXIgPQogICAgICAgIG5ldyBTZXRDb25zdGFudEJ1aWxkZXIobm9kZSwgbm9kZS50eXBlQXJndW1lbnQsIHRoaXMpOwogICAgZm9yIChFeHByZXNzaW9uIHNldF8gaW4gbm9kZS5zZXRzKSB7CiAgICAgIGJ1aWxkZXIuYWRkU3ByZWFkKHNldF8pOwogICAgfQogICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKICB9CgogIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpIHsKICAgIGlmICghbm9kZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICBub2RlLCB0ZW1wbGF0ZUNvbnN0RXZhbE5vbkNvbnN0YW50TGl0ZXJhbC53aXRoQXJndW1lbnRzKCdNYXAnKSk7CiAgICB9CiAgICBmaW5hbCBNYXBDb25zdGFudEJ1aWxkZXIgYnVpbGRlciA9CiAgICAgICAgbmV3IE1hcENvbnN0YW50QnVpbGRlcihub2RlLCBub2RlLmtleVR5cGUsIG5vZGUudmFsdWVUeXBlLCB0aGlzKTsKICAgIGZvciAoTWFwRW50cnkgZWxlbWVudCBpbiBub2RlLmVudHJpZXMpIHsKICAgICAgYnVpbGRlci5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwogIH0KCiAgdmlzaXRNYXBDb25jYXRlbmF0aW9uKE1hcENvbmNhdGVuYXRpb24gbm9kZSkgewogICAgZmluYWwgTWFwQ29uc3RhbnRCdWlsZGVyIGJ1aWxkZXIgPQogICAgICAgIG5ldyBNYXBDb25zdGFudEJ1aWxkZXIobm9kZSwgbm9kZS5rZXlUeXBlLCBub2RlLnZhbHVlVHlwZSwgdGhpcyk7CiAgICBmb3IgKEV4cHJlc3Npb24gbWFwIGluIG5vZGUubWFwcykgewogICAgICBidWlsZGVyLmFkZFNwcmVhZChtYXApOwogICAgfQogICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKICB9CgogIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKEZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gcmVwb3J0KAogICAgICAgIG5vZGUsIHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsLndpdGhBcmd1bWVudHMoJ0Z1bmN0aW9uJykpOwogIH0KCiAgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGZpbmFsIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gbm9kZS50YXJnZXQ7CiAgICBmaW5hbCBDbGFzcyBrbGFzcyA9IGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzOwogICAgYm9vbCBpc1N5bWJvbCA9IGtsYXNzID09IGNvcmVUeXBlcy5pbnRlcm5hbFN5bWJvbENsYXNzOwogICAgaWYgKCFjb25zdHJ1Y3Rvci5pc0NvbnN0KSB7CiAgICAgIHJldHVybiByZXBvcnRJbnZhbGlkKG5vZGUsICdOb24tY29uc3QgY29uc3RydWN0b3IgaW52b2NhdGlvbi4nKTsKICAgIH0KICAgIGlmIChjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5ICE9IG51bGwgJiYKICAgICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5IGlzISBFbXB0eVN0YXRlbWVudCkgewogICAgICByZXR1cm4gcmVwb3J0SW52YWxpZCgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICAnQ29uc3RydWN0b3IgIiRub2RlIiBoYXMgbm9uLXRyaXZpYWwgYm9keSAnCiAgICAgICAgICAnIiR7Y29uc3RydWN0b3IuZnVuY3Rpb24uYm9keS5ydW50aW1lVHlwZX0iLicpOwogICAgfQogICAgaWYgKGtsYXNzLmlzQWJzdHJhY3QpIHsKICAgICAgcmV0dXJuIHJlcG9ydEludmFsaWQoCiAgICAgICAgICBub2RlLCAnQ29uc3RydWN0b3IgIiRub2RlIiBiZWxvbmdzIHRvIGFic3RyYWN0IGNsYXNzICIke2tsYXNzfSIuJyk7CiAgICB9CgogICAgZmluYWwgcG9zaXRpb25hbHMgPSBldmFsdWF0ZVBvc2l0aW9uYWxBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgZmluYWwgbmFtZWQgPSBldmFsdWF0ZU5hbWVkQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKCiAgICBpZiAoaXNTeW1ib2wgJiYgc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICByZXR1cm4gdW5ldmFsdWF0ZWQoCiAgICAgICAgICBub2RlLAogICAgICAgICAgbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbihjb25zdHJ1Y3RvciwKICAgICAgICAgICAgICB1bmV2YWx1YXRlZEFyZ3VtZW50cyhwb3NpdGlvbmFscywgbmFtZWQsIG5vZGUuYXJndW1lbnRzLnR5cGVzKSwKICAgICAgICAgICAgICBpc0NvbnN0OiB0cnVlKSk7CiAgICB9CgogICAgLy8gU3BlY2lhbCBjYXNlIHRoZSBkYXJ0OmNvcmUncyBTeW1ib2wgY2xhc3MgaGVyZSBhbmQgY29udmVydCBpdCB0byBhCiAgICAvLyBbU3ltYm9sQ29uc3RhbnRdLiAgRm9yIGludmFsaWQgdmFsdWVzIHdlIHJlcG9ydCBhIGNvbXBpbGUtdGltZSBlcnJvci4KICAgIGlmIChpc1N5bWJvbCkgewogICAgICBmaW5hbCBDb25zdGFudCBuYW1lVmFsdWUgPSBwb3NpdGlvbmFscy5zaW5nbGU7CgogICAgICBpZiAobmFtZVZhbHVlIGlzIFN0cmluZ0NvbnN0YW50ICYmIGlzVmFsaWRTeW1ib2xOYW1lKG5hbWVWYWx1ZS52YWx1ZSkpIHsKICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBTeW1ib2xDb25zdGFudChuYW1lVmFsdWUudmFsdWUsIG51bGwpKTsKICAgICAgfQogICAgICByZXR1cm4gcmVwb3J0KG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwuZmlyc3QsCiAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTeW1ib2xOYW1lLndpdGhBcmd1bWVudHMobmFtZVZhbHVlKSk7CiAgICB9CgogICAgZmluYWwgdHlwZUFyZ3VtZW50cyA9IGV2YWx1YXRlVHlwZUFyZ3VtZW50cyhub2RlLCBub2RlLmFyZ3VtZW50cyk7CgogICAgLy8gRmlsbCBpbiBhbnkgbWlzc2luZyB0eXBlIGFyZ3VtZW50cyB3aXRoICJkeW5hbWljIi4KICAgIGZvciAoaW50IGkgPSB0eXBlQXJndW1lbnRzLmxlbmd0aDsgaSA8IGtsYXNzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHR5cGVBcmd1bWVudHMuYWRkKGNvbnN0IER5bmFtaWNUeXBlKCkpOwogICAgfQoKICAgIC8vIFN0YXJ0IGJ1aWxkaW5nIGEgbmV3IGluc3RhbmNlLgogICAgcmV0dXJuIHdpdGhOZXdJbnN0YW5jZUJ1aWxkZXIoa2xhc3MsIHR5cGVBcmd1bWVudHMsICgpIHsKICAgICAgcmV0dXJuIHJ1bkluc2lkZUNvbnRleHRJZk5vQ29udGV4dChub2RlLCAoKSB7CiAgICAgICAgLy8gIlJ1biIgdGhlIGNvbnN0cnVjdG9yIChhbmQgYW55IHN1cGVyIGNvbnN0cnVjdG9yIGNhbGxzKSwgd2hpY2ggd2lsbAogICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGZpZWxkcyBvZiB0aGUgbmV3IGluc3RhbmNlLgogICAgICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSB7CiAgICAgICAgICBlbnRlckxhenkoKTsKICAgICAgICAgIGhhbmRsZUNvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwgdHlwZUFyZ3VtZW50cywgcG9zaXRpb25hbHMsIG5hbWVkKTsKICAgICAgICAgIGxlYXZlTGF6eSgpOwogICAgICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKG5vZGUsIGluc3RhbmNlQnVpbGRlci5idWlsZFVuZXZhbHVhdGVkSW5zdGFuY2UoKSk7CiAgICAgICAgfQogICAgICAgIGhhbmRsZUNvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgY29uc3RydWN0b3IsIHR5cGVBcmd1bWVudHMsIHBvc2l0aW9uYWxzLCBuYW1lZCk7CiAgICAgICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgICAgIHJldHVybiB1bmV2YWx1YXRlZChub2RlLCBpbnN0YW5jZUJ1aWxkZXIuYnVpbGRVbmV2YWx1YXRlZEluc3RhbmNlKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKGluc3RhbmNlQnVpbGRlci5idWlsZEluc3RhbmNlKCkpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgdmlzaXRJbnN0YW5jZUNyZWF0aW9uKEluc3RhbmNlQ3JlYXRpb24gbm9kZSkgewogICAgcmV0dXJuIHdpdGhOZXdJbnN0YW5jZUJ1aWxkZXIobm9kZS5jbGFzc05vZGUsIG5vZGUudHlwZUFyZ3VtZW50cywgKCkgewogICAgICBmb3IgKEFzc2VydFN0YXRlbWVudCBzdGF0ZW1lbnQgaW4gbm9kZS5hc3NlcnRzKSB7CiAgICAgICAgY2hlY2tBc3NlcnQoc3RhdGVtZW50KTsKICAgICAgfQogICAgICBub2RlLmZpZWxkVmFsdWVzLmZvckVhY2goKFJlZmVyZW5jZSBmaWVsZFJlZiwgRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICAgIGluc3RhbmNlQnVpbGRlci5zZXRGaWVsZFZhbHVlKAogICAgICAgICAgICBmaWVsZFJlZi5hc0ZpZWxkLCBfZXZhbHVhdGVTdWJleHByZXNzaW9uKHZhbHVlKSk7CiAgICAgIH0pOwogICAgICBub2RlLnVudXNlZEFyZ3VtZW50cy5mb3JFYWNoKChFeHByZXNzaW9uIHZhbHVlKSB7CiAgICAgICAgQ29uc3RhbnQgY29uc3RhbnQgPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKHZhbHVlKTsKICAgICAgICBpZiAoY29uc3RhbnQgaXMgVW5ldmFsdWF0ZWRDb25zdGFudCkgewogICAgICAgICAgaW5zdGFuY2VCdWlsZGVyLnVudXNlZEFyZ3VtZW50cy5hZGQoZXh0cmFjdChjb25zdGFudCkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSB7CiAgICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKG5vZGUsIGluc3RhbmNlQnVpbGRlci5idWlsZFVuZXZhbHVhdGVkSW5zdGFuY2UoKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShpbnN0YW5jZUJ1aWxkZXIuYnVpbGRJbnN0YW5jZSgpKTsKICAgIH0pOwogIH0KCiAgYm9vbCBpc1ZhbGlkU3ltYm9sTmFtZShTdHJpbmcgbmFtZSkgewogICAgLy8gU2VlIGh0dHBzOi8vYXBpLmRhcnRsYW5nLm9yZy9zdGFibGUvMi4wLjAvZGFydC1jb3JlL1N5bWJvbC9TeW1ib2wuaHRtbDoKICAgIC8vCiAgICAvLyAgQSBxdWFsaWZpZWQgbmFtZSBpcyBhIHZhbGlkIG5hbWUgcHJlY2VkZWQgYnkgYSBwdWJsaWMgaWRlbnRpZmllciBuYW1lIGFuZAogICAgLy8gIGEgJy4nLCBlLmcuLCBmb28uYmFyLmJhej0gaXMgYSBxdWFsaWZpZWQgdmVyc2lvbiBvZiBiYXo9LgogICAgLy8KICAgIC8vICBUaGF0IG1lYW5zIHRoYXQgdGhlIGNvbnRlbnQgb2YgdGhlIG5hbWUgU3RyaW5nIG11c3QgYmUgZWl0aGVyCiAgICAvLyAgICAgLSBhIHZhbGlkIHB1YmxpYyBEYXJ0IGlkZW50aWZpZXIgKHRoYXQgaXMsIGFuIGlkZW50aWZpZXIgbm90CiAgICAvLyAgICAgICBzdGFydGluZyB3aXRoICJfIiksCiAgICAvLyAgICAgLSBzdWNoIGFuIGlkZW50aWZpZXIgZm9sbG93ZWQgYnkgIj0iIChhIHNldHRlciBuYW1lKSwKICAgIC8vICAgICAtIHRoZSBuYW1lIG9mIGEgZGVjbGFyYWJsZSBvcGVyYXRvciwKICAgIC8vICAgICAtIGFueSBvZiB0aGUgYWJvdmUgcHJlY2VkZWQgYnkgYW55IG51bWJlciBvZiBxdWFsaWZpZXJzLCB3aGVyZSBhCiAgICAvLyAgICAgICBxdWFsaWZpZXIgaXMgYSBub24tcHJpdmF0ZSBpZGVudGlmaWVyIGZvbGxvd2VkIGJ5ICcuJywKICAgIC8vICAgICAtIG9yIHRoZSBlbXB0eSBzdHJpbmcgKHRoZSBkZWZhdWx0IG5hbWUgb2YgYSBsaWJyYXJ5IHdpdGggbm8gbGlicmFyeQogICAgLy8gICAgICAgbmFtZSBkZWNsYXJhdGlvbikuCgogICAgY29uc3Qgb3BlcmF0b3JOYW1lcyA9IGNvbnN0IDxTdHJpbmc+WwogICAgICAnKycsCiAgICAgICctJywKICAgICAgJyonLAogICAgICAnLycsCiAgICAgICclJywKICAgICAgJ34vJywKICAgICAgJyYnLAogICAgICAnfCcsCiAgICAgICdeJywKICAgICAgJ34nLAogICAgICAnPDwnLAogICAgICAnPj4nLAogICAgICAnPCcsCiAgICAgICc8PScsCiAgICAgICc+JywKICAgICAgJz49JywKICAgICAgJz09JywKICAgICAgJ1tdJywKICAgICAgJ1tdPScsCiAgICAgICd1bmFyeS0nCiAgICBdOwoKICAgIGlmIChuYW1lID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIGlmIChuYW1lID09ICcnKSByZXR1cm4gdHJ1ZTsKCiAgICBmaW5hbCBwYXJ0cyA9IG5hbWUuc3BsaXQoJy4nKTsKCiAgICAvLyBFYWNoIHF1YWxpZmllciBtdXN0IGJlIGEgcHVibGljIGlkZW50aWZpZXIuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7ICsraSkgewogICAgICBpZiAoIWlzVmFsaWRQdWJsaWNJZGVudGlmaWVyKHBhcnRzW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIFN0cmluZyBsYXN0ID0gcGFydHMubGFzdDsKICAgIGlmIChvcGVyYXRvck5hbWVzLmNvbnRhaW5zKGxhc3QpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKGxhc3QuZW5kc1dpdGgoJz0nKSkgewogICAgICBsYXN0ID0gbGFzdC5zdWJzdHJpbmcoMCwgbGFzdC5sZW5ndGggLSAxKTsKICAgIH0KICAgIGlmICghaXNWYWxpZFB1YmxpY0lkZW50aWZpZXIobGFzdCkpIHJldHVybiBmYWxzZTsKCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBGcm9tIHRoZSBEYXJ0IExhbmd1YWdlIHNwZWNpZmljYXRpb246CiAgLy8vCiAgLy8vICAgSURFTlRJRklFUjoKICAvLy8gICAgIElERU5USUZJRVJfU1RBUlQgSURFTlRJRklFUl9QQVJUKgogIC8vLwogIC8vLyAgIElERU5USUZJRVJfU1RBUlQ6CiAgLy8vICAgICAgIElERU5USUZJRVJfU1RBUlRfTk9fRE9MTEFSIHwg4oCYJOKAmQogIC8vLwogIC8vLyAgIElERU5USUZJRVJfUEFSVDoKICAvLy8gICAgICAgSURFTlRJRklFUl9TVEFSVCB8IERJR0lUCiAgLy8vCiAgLy8vICAgSURFTlRJRklFUl9OT19ET0xMQVI6CiAgLy8vICAgICBJREVOVElGSUVSX1NUQVJUX05PX0RPTExBUiBJREVOVElGSUVSX1BBUlRfTk9fRE9MTEFSKgogIC8vLwogIC8vLyAgIElERU5USUZJRVJfU1RBUlRfTk9fRE9MTEFSOgogIC8vLyAgICAgICBMRVRURVIgfCAnXycKICAvLy8KICAvLy8gICBJREVOVElGSUVSX1BBUlRfTk9fRE9MTEFSOgogIC8vLyAgICAgICBJREVOVElGSUVSX1NUQVJUX05PX0RPTExBUiB8IERJR0lUCiAgLy8vCiAgc3RhdGljIGZpbmFsIHB1YmxpY0lkZW50aWZpZXJSZWdFeHAgPQogICAgICBuZXcgUmVnRXhwKHInXlthLXpBLVokXVthLXpBLVowLTlfJF0qJCcpOwoKICBzdGF0aWMgY29uc3Qgbm9uVXNhYmxlS2V5d29yZHMgPSBjb25zdCA8U3RyaW5nPlsKICAgICdhc3NlcnQnLAogICAgJ2JyZWFrJywKICAgICdjYXNlJywKICAgICdjYXRjaCcsCiAgICAnY2xhc3MnLAogICAgJ2NvbnN0JywKICAgICdjb250aW51ZScsCiAgICAnZGVmYXVsdCcsCiAgICAnZG8nLAogICAgJ2Vsc2UnLAogICAgJ2VudW0nLAogICAgJ2V4dGVuZHMnLAogICAgJ2ZhbHNlJywKICAgICdmaW5hbCcsCiAgICAnZmluYWxseScsCiAgICAnZm9yJywKICAgICdpZicsCiAgICAnaW4nLAogICAgJ2lzJywKICAgICduZXcnLAogICAgJ251bGwnLAogICAgJ3JldGhyb3cnLAogICAgJ3JldHVybicsCiAgICAnc3VwZXInLAogICAgJ3N3aXRjaCcsCiAgICAndGhpcycsCiAgICAndGhyb3cnLAogICAgJ3RydWUnLAogICAgJ3RyeScsCiAgICAndmFyJywKICAgICd3aGlsZScsCiAgICAnd2l0aCcsCiAgXTsKCiAgYm9vbCBpc1ZhbGlkUHVibGljSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIHB1YmxpY0lkZW50aWZpZXJSZWdFeHAuaGFzTWF0Y2gobmFtZSkgJiYKICAgICAgICAhbm9uVXNhYmxlS2V5d29yZHMuY29udGFpbnMobmFtZSk7CiAgfQoKICBoYW5kbGVDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLAogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBMaXN0PENvbnN0YW50PiBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBNYXA8U3RyaW5nLCBDb25zdGFudD4gbmFtZWRBcmd1bWVudHMpIHsKICAgIHJldHVybiBydW5JbnNpZGVDb250ZXh0KGNvbnN0cnVjdG9yLCAoKSB7CiAgICAgIHJldHVybiB3aXRoTmV3RW52aXJvbm1lbnQoKCkgewogICAgICAgIGZpbmFsIENsYXNzIGtsYXNzID0gY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgZmluYWwgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uID0gY29uc3RydWN0b3IuZnVuY3Rpb247CgogICAgICAgIC8vIFdlIHNpbXVsYXRlIG5vdyB0aGUgY29uc3RydWN0b3IgaW52b2NhdGlvbi4KCiAgICAgICAgLy8gU3RlcCAxKSBNYXAgdHlwZSBhcmd1bWVudHMgYW5kIG5vcm1hbCBhcmd1bWVudHMgZnJvbSBjYWxsZXIgdG8gY2FsbGVlLgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2xhc3MudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGVudi5hZGRUeXBlUGFyYW1ldGVyVmFsdWUoa2xhc3MudHlwZVBhcmFtZXRlcnNbaV0sIHR5cGVBcmd1bWVudHNbaV0pOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9CiAgICAgICAgICAgICAgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgICAgICBmaW5hbCBDb25zdGFudCB2YWx1ZSA9IChpIDwgcG9zaXRpb25hbEFyZ3VtZW50cy5sZW5ndGgpCiAgICAgICAgICAgICAgPyBwb3NpdGlvbmFsQXJndW1lbnRzW2ldCiAgICAgICAgICAgICAgOiBfZXZhbHVhdGVOdWxsYWJsZVN1YmV4cHJlc3Npb24ocGFyYW1ldGVyLmluaXRpYWxpemVyKTsKICAgICAgICAgIGVudi5hZGRWYXJpYWJsZVZhbHVlKHBhcmFtZXRlciwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICBmb3IgKGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIGluIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgICAgICAgZmluYWwgQ29uc3RhbnQgdmFsdWUgPSBuYW1lZEFyZ3VtZW50c1twYXJhbWV0ZXIubmFtZV0gPz8KICAgICAgICAgICAgICBfZXZhbHVhdGVOdWxsYWJsZVN1YmV4cHJlc3Npb24ocGFyYW1ldGVyLmluaXRpYWxpemVyKTsKICAgICAgICAgIGVudi5hZGRWYXJpYWJsZVZhbHVlKHBhcmFtZXRlciwgdmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gU3RlcCAyKSBSdW4gYWxsIGluaXRpYWxpemVycyAoaW5jbHVkaW5nIHN1cGVyIGNhbGxzKSB3aXRoIGVudmlyb25tZW50IHNldHVwLgogICAgICAgIGZvciAoZmluYWwgRmllbGQgZmllbGQgaW4ga2xhc3MuZmllbGRzKSB7CiAgICAgICAgICBpZiAoIWZpZWxkLmlzU3RhdGljKSB7CiAgICAgICAgICAgIGluc3RhbmNlQnVpbGRlci5zZXRGaWVsZFZhbHVlKAogICAgICAgICAgICAgICAgZmllbGQsIF9ldmFsdWF0ZU51bGxhYmxlU3ViZXhwcmVzc2lvbihmaWVsZC5pbml0aWFsaXplcikpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGZpbmFsIEluaXRpYWxpemVyIGluaXQgaW4gY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzKSB7CiAgICAgICAgICBpZiAoaW5pdCBpcyBGaWVsZEluaXRpYWxpemVyKSB7CiAgICAgICAgICAgIGluc3RhbmNlQnVpbGRlci5zZXRGaWVsZFZhbHVlKAogICAgICAgICAgICAgICAgaW5pdC5maWVsZCwgX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihpbml0LnZhbHVlKSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGluaXQgaXMgTG9jYWxJbml0aWFsaXplcikgewogICAgICAgICAgICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gaW5pdC52YXJpYWJsZTsKICAgICAgICAgICAgZW52LmFkZFZhcmlhYmxlVmFsdWUoCiAgICAgICAgICAgICAgICB2YXJpYWJsZSwgX2V2YWx1YXRlU3ViZXhwcmVzc2lvbih2YXJpYWJsZS5pbml0aWFsaXplcikpOwogICAgICAgICAgfSBlbHNlIGlmIChpbml0IGlzIFN1cGVySW5pdGlhbGl6ZXIpIHsKICAgICAgICAgICAgaGFuZGxlQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgICAgICAgICAgaW5pdC50YXJnZXQsCiAgICAgICAgICAgICAgICBldmFsdWF0ZVN1cGVyVHlwZUFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICBpbml0LCBjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzcy5zdXBlcnR5cGUpLAogICAgICAgICAgICAgICAgZXZhbHVhdGVQb3NpdGlvbmFsQXJndW1lbnRzKGluaXQuYXJndW1lbnRzKSwKICAgICAgICAgICAgICAgIGV2YWx1YXRlTmFtZWRBcmd1bWVudHMoaW5pdC5hcmd1bWVudHMpKTsKICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdCBpcyBSZWRpcmVjdGluZ0luaXRpYWxpemVyKSB7CiAgICAgICAgICAgIC8vIFNpbmNlIGEgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IgdGFyZ2V0cyBhIGNvbnN0cnVjdG9yIG9mIHRoZSBzYW1lCiAgICAgICAgICAgIC8vIGNsYXNzLCB3ZSBwYXNzIHRoZSBzYW1lIFt0eXBlQXJndW1lbnRzXS4KICAgICAgICAgICAgaGFuZGxlQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgICAgICAgICAgaW5pdC50YXJnZXQsCiAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLAogICAgICAgICAgICAgICAgZXZhbHVhdGVQb3NpdGlvbmFsQXJndW1lbnRzKGluaXQuYXJndW1lbnRzKSwKICAgICAgICAgICAgICAgIGV2YWx1YXRlTmFtZWRBcmd1bWVudHMoaW5pdC5hcmd1bWVudHMpKTsKICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdCBpcyBBc3NlcnRJbml0aWFsaXplcikgewogICAgICAgICAgICBjaGVja0Fzc2VydChpbml0LnN0YXRlbWVudCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcmVwb3J0SW52YWxpZCgKICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLAogICAgICAgICAgICAgICAgJ05vIHN1cHBvcnQgZm9yIGhhbmRsaW5nIGluaXRpYWxpemVyIG9mIHR5cGUgJwogICAgICAgICAgICAgICAgJyIke2luaXQucnVudGltZVR5cGV9Ii4nKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAoVW5ldmFsdWF0ZWRDb25zdGFudCBjb25zdGFudCBpbiBlbnYudW5ldmFsdWF0ZWRVbnJlYWRDb25zdGFudHMpIHsKICAgICAgICAgIGluc3RhbmNlQnVpbGRlci51bnVzZWRBcmd1bWVudHMuYWRkKGV4dHJhY3QoY29uc3RhbnQpKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICB2b2lkIGNoZWNrQXNzZXJ0KEFzc2VydFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIGZpbmFsIENvbnN0YW50IGNvbmRpdGlvbiA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24oc3RhdGVtZW50LmNvbmRpdGlvbik7CgogICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgRXhwcmVzc2lvbiBtZXNzYWdlID0gbnVsbDsKICAgICAgaWYgKHN0YXRlbWVudC5tZXNzYWdlICE9IG51bGwpIHsKICAgICAgICBlbnRlckxhenkoKTsKICAgICAgICBtZXNzYWdlID0gZXh0cmFjdChfZXZhbHVhdGVTdWJleHByZXNzaW9uKHN0YXRlbWVudC5tZXNzYWdlKSk7CiAgICAgICAgbGVhdmVMYXp5KCk7CiAgICAgIH0KICAgICAgaW5zdGFuY2VCdWlsZGVyLmFzc2VydHMuYWRkKG5ldyBBc3NlcnRTdGF0ZW1lbnQoZXh0cmFjdChjb25kaXRpb24pLAogICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSwKICAgICAgICAgIGNvbmRpdGlvblN0YXJ0T2Zmc2V0OiBzdGF0ZW1lbnQuY29uZGl0aW9uU3RhcnRPZmZzZXQsCiAgICAgICAgICBjb25kaXRpb25FbmRPZmZzZXQ6IHN0YXRlbWVudC5jb25kaXRpb25FbmRPZmZzZXQpKTsKICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uIGlzIEJvb2xDb25zdGFudCkgewogICAgICBpZiAoIWNvbmRpdGlvbi52YWx1ZSkgewogICAgICAgIGlmIChzdGF0ZW1lbnQubWVzc2FnZSA9PSBudWxsKSB7CiAgICAgICAgICByZXBvcnQoc3RhdGVtZW50LmNvbmRpdGlvbiwgbWVzc2FnZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbik7CiAgICAgICAgfQogICAgICAgIGZpbmFsIENvbnN0YW50IG1lc3NhZ2UgPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKHN0YXRlbWVudC5tZXNzYWdlKTsKICAgICAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICAgICAgaW5zdGFuY2VCdWlsZGVyLmFzc2VydHMuYWRkKG5ldyBBc3NlcnRTdGF0ZW1lbnQoZXh0cmFjdChjb25kaXRpb24pLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGV4dHJhY3QobWVzc2FnZSksCiAgICAgICAgICAgICAgY29uZGl0aW9uU3RhcnRPZmZzZXQ6IHN0YXRlbWVudC5jb25kaXRpb25TdGFydE9mZnNldCwKICAgICAgICAgICAgICBjb25kaXRpb25FbmRPZmZzZXQ6IHN0YXRlbWVudC5jb25kaXRpb25FbmRPZmZzZXQpKTsKICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UgaXMgU3RyaW5nQ29uc3RhbnQpIHsKICAgICAgICAgIHJlcG9ydCgKICAgICAgICAgICAgICBzdGF0ZW1lbnQuY29uZGl0aW9uLAogICAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uV2l0aE1lc3NhZ2UKICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobWVzc2FnZS52YWx1ZSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXBvcnQoCiAgICAgICAgICAgICAgc3RhdGVtZW50Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkVHlwZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICBtZXNzYWdlLAogICAgICAgICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQuc3RyaW5nVHlwZSwKICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRUeXBlKHR5cGVFbnZpcm9ubWVudCkpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlcG9ydCgKICAgICAgICAgIHN0YXRlbWVudC5jb25kaXRpb24sCiAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRUeXBlLndpdGhBcmd1bWVudHMoY29uZGl0aW9uLAogICAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5ib29sVHlwZSwgY29uZGl0aW9uLmdldFR5cGUodHlwZUVudmlyb25tZW50KSkpOwogICAgfQogIH0KCiAgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gcmVwb3J0SW52YWxpZChub2RlLCBub2RlLm1lc3NhZ2UpOwogIH0KCiAgdmlzaXRNZXRob2RJbnZvY2F0aW9uKE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgLy8gV2UgaGF2ZSBubyBzdXBwb3J0IGZvciBnZW5lcmljIG1ldGhvZCBpbnZvY2F0aW9uIGF0bS4KICAgIGFzc2VydChub2RlLmFyZ3VtZW50cy5uYW1lZC5pc0VtcHR5KTsKCiAgICBmaW5hbCBDb25zdGFudCByZWNlaXZlciA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZS5yZWNlaXZlcik7CiAgICBmaW5hbCBMaXN0PENvbnN0YW50PiBhcmd1bWVudHMgPQogICAgICAgIGV2YWx1YXRlUG9zaXRpb25hbEFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cyk7CgogICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKAogICAgICAgICAgbm9kZSwKICAgICAgICAgIG5ldyBNZXRob2RJbnZvY2F0aW9uKGV4dHJhY3QocmVjZWl2ZXIpLCBub2RlLm5hbWUsCiAgICAgICAgICAgICAgdW5ldmFsdWF0ZWRBcmd1bWVudHMoYXJndW1lbnRzLCB7fSwgbm9kZS5hcmd1bWVudHMudHlwZXMpKSk7CiAgICB9CgogICAgLy8gSGFuZGxlID09IGFuZCAhPSBmaXJzdCAoaXQncyBjb21tb24gYmV0d2VlbiBhbGwgdHlwZXMpLiBTaW5jZSBgYSAhPSBiYCBpcwogICAgLy8gcGFyc2VkIGFzIGAhKGEgPT0gYilgIGl0IGlzIGhhbmRsZWQgaW1wbGljaXRseSB0aHJvdWdoID09LgogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSAmJiBub2RlLm5hbWUubmFtZSA9PSAnPT0nKSB7CiAgICAgIGZpbmFsIHJpZ2h0ID0gYXJndW1lbnRzWzBdOwoKICAgICAgLy8gW0RvdWJsZUNvbnN0YW50XSB1c2VzIFtpZGVudGljYWxdIHRvIGRldGVybWluZSBlcXVhbGl0eSwgc28gd2UgbmVlZCB0d28KICAgICAgLy8gc3BlY2lhbCBjYXNlczoKICAgICAgLy8gVHdvIE5hTnMgYXJlIGFsd2F5cyB1bmVxdWFsIGV2ZW4gaWYgW2lkZW50aWNhbF0gcmV0dXJucyBgdHJ1ZWAuCiAgICAgIGlmIChpc05hTihyZWNlaXZlcikgfHwgaXNOYU4ocmlnaHQpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlQ29uc3RhbnQ7CiAgICAgIH0KCiAgICAgIC8vIFR3byB6ZXJvIHZhbHVlcyBhcmUgYWx3YXlzIGVxdWFsIHJlZ2FyZGxlc3Mgb2Ygc2lnbi4KICAgICAgaWYgKGlzWmVybyhyZWNlaXZlcikpIHsKICAgICAgICByZXR1cm4gbWFrZUJvb2xDb25zdGFudChpc1plcm8ocmlnaHQpKTsKICAgICAgfQoKICAgICAgaWYgKHJlY2VpdmVyIGlzIE51bGxDb25zdGFudCB8fAogICAgICAgICAgcmVjZWl2ZXIgaXMgQm9vbENvbnN0YW50IHx8CiAgICAgICAgICByZWNlaXZlciBpcyBJbnRDb25zdGFudCB8fAogICAgICAgICAgcmVjZWl2ZXIgaXMgRG91YmxlQ29uc3RhbnQgfHwKICAgICAgICAgIHJlY2VpdmVyIGlzIFN0cmluZ0NvbnN0YW50IHx8CiAgICAgICAgICByaWdodCBpcyBOdWxsQ29uc3RhbnQpIHsKICAgICAgICByZXR1cm4gbWFrZUJvb2xDb25zdGFudChyZWNlaXZlciA9PSByaWdodCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIHJlY2VpdmVyLCByZWNlaXZlci5nZXRUeXBlKHR5cGVFbnZpcm9ubWVudCkpKTsKICAgICAgfQogICAgfQoKICAgIC8vIFRoaXMgaXMgYSB3aGl0ZS1saXN0ZWQgc2V0IG9mIG1ldGhvZHMgd2UgbmVlZCB0byBzdXBwb3J0IG9uIGNvbnN0YW50cy4KICAgIGlmIChyZWNlaXZlciBpcyBTdHJpbmdDb25zdGFudCkgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgc3dpdGNoIChub2RlLm5hbWUubmFtZSkgewogICAgICAgICAgY2FzZSAnKyc6CiAgICAgICAgICAgIGZpbmFsIENvbnN0YW50IG90aGVyID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICBpZiAob3RoZXIgaXMgU3RyaW5nQ29uc3RhbnQpIHsKICAgICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKAogICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQ29uc3RhbnQocmVjZWl2ZXIudmFsdWUgKyBvdGhlci52YWx1ZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICAgICAgICBub2RlLAogICAgICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICAnKycsCiAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXIsCiAgICAgICAgICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LnN0cmluZ1R5cGUsCiAgICAgICAgICAgICAgICAgICAgb3RoZXIuZ2V0VHlwZSh0eXBlRW52aXJvbm1lbnQpKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKHJlY2VpdmVyIGlzIEludENvbnN0YW50IHx8IHJlY2VpdmVyIGlzIEphdmFTY3JpcHRJbnRDb25zdGFudCkgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgc3dpdGNoIChub2RlLm5hbWUubmFtZSkgewogICAgICAgICAgY2FzZSAndW5hcnktJzoKICAgICAgICAgICAgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgICAgICAgICBCaWdJbnQgdmFsdWUgPSAocmVjZWl2ZXIgYXMgSmF2YVNjcmlwdEludENvbnN0YW50KS5iaWdJbnRWYWx1ZTsKICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gQmlnSW50Lnplcm8pIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYW5vbmljYWxpemUobmV3IERvdWJsZUNvbnN0YW50KC0wLjApKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgSmF2YVNjcmlwdEludENvbnN0YW50LmZyb21CaWdJbnQoLXZhbHVlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IHZhbHVlID0gKHJlY2VpdmVyIGFzIEludENvbnN0YW50KS52YWx1ZTsKICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgSW50Q29uc3RhbnQoLXZhbHVlKSk7CiAgICAgICAgICBjYXNlICd+JzoKICAgICAgICAgICAgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgICAgICAgICBCaWdJbnQgdmFsdWUgPSAocmVjZWl2ZXIgYXMgSmF2YVNjcmlwdEludENvbnN0YW50KS5iaWdJbnRWYWx1ZTsKICAgICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBKYXZhU2NyaXB0SW50Q29uc3RhbnQuZnJvbUJpZ0ludCgKICAgICAgICAgICAgICAgICAgKH52YWx1ZSkudG9VbnNpZ25lZCgzMikpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbnQgdmFsdWUgPSAocmVjZWl2ZXIgYXMgSW50Q29uc3RhbnQpLnZhbHVlOwogICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBJbnRDb25zdGFudCh+dmFsdWUpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgZmluYWwgQ29uc3RhbnQgb3RoZXIgPSBhcmd1bWVudHNbMF07CiAgICAgICAgZmluYWwgb3AgPSBub2RlLm5hbWUubmFtZTsKICAgICAgICBpZiAob3RoZXIgaXMgSW50Q29uc3RhbnQgfHwgb3RoZXIgaXMgSmF2YVNjcmlwdEludENvbnN0YW50KSB7CiAgICAgICAgICBpZiAoKG9wID09ICc8PCcgfHwgb3AgPT0gJz4+JyB8fCBvcCA9PSAnPj4+JykpIHsKICAgICAgICAgICAgdmFyIHJlY2VpdmVyVmFsdWUgPSByZWNlaXZlciBpcyBJbnRDb25zdGFudAogICAgICAgICAgICAgICAgPyByZWNlaXZlci52YWx1ZQogICAgICAgICAgICAgICAgOiAocmVjZWl2ZXIgYXMgSmF2YVNjcmlwdEludENvbnN0YW50KS5iaWdJbnRWYWx1ZTsKICAgICAgICAgICAgaW50IG90aGVyVmFsdWUgPSBvdGhlciBpcyBJbnRDb25zdGFudAogICAgICAgICAgICAgICAgPyBvdGhlci52YWx1ZQogICAgICAgICAgICAgICAgOiAob3RoZXIgYXMgSmF2YVNjcmlwdEludENvbnN0YW50KS5iaWdJbnRWYWx1ZS50b0ludCgpOwogICAgICAgICAgICBpZiAob3RoZXJWYWx1ZSA8IDApIHsKICAgICAgICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICAgICAgICBub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmZpcnN0LAogICAgICAgICAgICAgICAgICAvLyBUT0RPKGFza2VzYyk6IENoYW5nZSBhcmd1bWVudCB0eXBlcyBpbiB0ZW1wbGF0ZSB0byBjb25zdGFudHMuCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsTmVnYXRpdmVTaGlmdC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgICAgb3AsICcke3JlY2VpdmVyVmFsdWV9JywgJyR7b3RoZXJWYWx1ZX0nKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoKG9wID09ICclJyB8fCBvcCA9PSAnfi8nKSkgewogICAgICAgICAgICB2YXIgcmVjZWl2ZXJWYWx1ZSA9IHJlY2VpdmVyIGlzIEludENvbnN0YW50CiAgICAgICAgICAgICAgICA/IHJlY2VpdmVyLnZhbHVlCiAgICAgICAgICAgICAgICA6IChyZWNlaXZlciBhcyBKYXZhU2NyaXB0SW50Q29uc3RhbnQpLmJpZ0ludFZhbHVlOwogICAgICAgICAgICBpbnQgb3RoZXJWYWx1ZSA9IG90aGVyIGlzIEludENvbnN0YW50CiAgICAgICAgICAgICAgICA/IG90aGVyLnZhbHVlCiAgICAgICAgICAgICAgICA6IChvdGhlciBhcyBKYXZhU2NyaXB0SW50Q29uc3RhbnQpLmJpZ0ludFZhbHVlLnRvSW50KCk7CiAgICAgICAgICAgIGlmIChvdGhlclZhbHVlID09IDApIHsKICAgICAgICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICAgICAgICBub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmZpcnN0LAogICAgICAgICAgICAgICAgICAvLyBUT0RPKGFza2VzYyk6IENoYW5nZSBhcmd1bWVudCB0eXBlIGluIHRlbXBsYXRlIHRvIGNvbnN0YW50LgogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbFplcm9EaXZpc29yLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgICBvcCwgJyR7cmVjZWl2ZXJWYWx1ZX0nKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBzd2l0Y2ggKG9wKSB7CiAgICAgICAgICAgIGNhc2UgJ3wnOgogICAgICAgICAgICBjYXNlICcmJzoKICAgICAgICAgICAgY2FzZSAnXic6CiAgICAgICAgICAgICAgaW50IHJlY2VpdmVyVmFsdWUgPSByZWNlaXZlciBpcyBJbnRDb25zdGFudAogICAgICAgICAgICAgICAgICA/IHJlY2VpdmVyLnZhbHVlCiAgICAgICAgICAgICAgICAgIDogKHJlY2VpdmVyIGFzIEphdmFTY3JpcHRJbnRDb25zdGFudCkKICAgICAgICAgICAgICAgICAgICAgIC5iaWdJbnRWYWx1ZQogICAgICAgICAgICAgICAgICAgICAgLnRvVW5zaWduZWQoMzIpCiAgICAgICAgICAgICAgICAgICAgICAudG9JbnQoKTsKICAgICAgICAgICAgICBpbnQgb3RoZXJWYWx1ZSA9IG90aGVyIGlzIEludENvbnN0YW50CiAgICAgICAgICAgICAgICAgID8gb3RoZXIudmFsdWUKICAgICAgICAgICAgICAgICAgOiAob3RoZXIgYXMgSmF2YVNjcmlwdEludENvbnN0YW50KQogICAgICAgICAgICAgICAgICAgICAgLmJpZ0ludFZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAudG9VbnNpZ25lZCgzMikKICAgICAgICAgICAgICAgICAgICAgIC50b0ludCgpOwogICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZUJpbmFyeUJpdE9wZXJhdGlvbigKICAgICAgICAgICAgICAgICAgbm9kZS5uYW1lLm5hbWUsIHJlY2VpdmVyVmFsdWUsIG90aGVyVmFsdWUsIG5vZGUpOwogICAgICAgICAgICBjYXNlICc8PCc6CiAgICAgICAgICAgIGNhc2UgJz4+JzoKICAgICAgICAgICAgY2FzZSAnPj4+JzoKICAgICAgICAgICAgICBib29sIG5lZ2F0aXZlID0gZmFsc2U7CiAgICAgICAgICAgICAgaW50IHJlY2VpdmVyVmFsdWU7CiAgICAgICAgICAgICAgaWYgKHJlY2VpdmVyIGlzIEludENvbnN0YW50KSB7CiAgICAgICAgICAgICAgICByZWNlaXZlclZhbHVlID0gcmVjZWl2ZXIudmFsdWU7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIEJpZ0ludCBiaWdJbnRWYWx1ZSA9CiAgICAgICAgICAgICAgICAgICAgKHJlY2VpdmVyIGFzIEphdmFTY3JpcHRJbnRDb25zdGFudCkuYmlnSW50VmFsdWU7CiAgICAgICAgICAgICAgICByZWNlaXZlclZhbHVlID0gYmlnSW50VmFsdWUudG9VbnNpZ25lZCgzMikudG9JbnQoKTsKICAgICAgICAgICAgICAgIG5lZ2F0aXZlID0gYmlnSW50VmFsdWUuaXNOZWdhdGl2ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaW50IG90aGVyVmFsdWUgPSBvdGhlciBpcyBJbnRDb25zdGFudAogICAgICAgICAgICAgICAgICA/IG90aGVyLnZhbHVlCiAgICAgICAgICAgICAgICAgIDogKG90aGVyIGFzIEphdmFTY3JpcHRJbnRDb25zdGFudCkuYmlnSW50VmFsdWUudG9JbnQoKTsKCiAgICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRlQmluYXJ5U2hpZnRPcGVyYXRpb24oCiAgICAgICAgICAgICAgICAgIG5vZGUubmFtZS5uYW1lLCByZWNlaXZlclZhbHVlLCBvdGhlclZhbHVlLCBub2RlLAogICAgICAgICAgICAgICAgICBuZWdhdGl2ZVJlY2VpdmVyOiBuZWdhdGl2ZSk7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgbnVtIHJlY2VpdmVyVmFsdWUgPSByZWNlaXZlciBpcyBJbnRDb25zdGFudAogICAgICAgICAgICAgICAgICA/IHJlY2VpdmVyLnZhbHVlCiAgICAgICAgICAgICAgICAgIDogKHJlY2VpdmVyIGFzIERvdWJsZUNvbnN0YW50KS52YWx1ZTsKICAgICAgICAgICAgICBudW0gb3RoZXJWYWx1ZSA9IG90aGVyIGlzIEludENvbnN0YW50CiAgICAgICAgICAgICAgICAgID8gb3RoZXIudmFsdWUKICAgICAgICAgICAgICAgICAgOiAob3RoZXIgYXMgRG91YmxlQ29uc3RhbnQpLnZhbHVlOwogICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZUJpbmFyeU51bWVyaWNPcGVyYXRpb24oCiAgICAgICAgICAgICAgICAgIG5vZGUubmFtZS5uYW1lLCByZWNlaXZlclZhbHVlLCBvdGhlclZhbHVlLCBub2RlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG90aGVyIGlzIERvdWJsZUNvbnN0YW50KSB7CiAgICAgICAgICBudW0gcmVjZWl2ZXJWYWx1ZSA9IHJlY2VpdmVyIGlzIEludENvbnN0YW50CiAgICAgICAgICAgICAgPyByZWNlaXZlci52YWx1ZQogICAgICAgICAgICAgIDogKHJlY2VpdmVyIGFzIERvdWJsZUNvbnN0YW50KS52YWx1ZTsKICAgICAgICAgIHJldHVybiBldmFsdWF0ZUJpbmFyeU51bWVyaWNPcGVyYXRpb24oCiAgICAgICAgICAgICAgbm9kZS5uYW1lLm5hbWUsIHJlY2VpdmVyVmFsdWUsIG90aGVyLnZhbHVlLCBub2RlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIG5vZGUubmFtZS5uYW1lLAogICAgICAgICAgICAgICAgcmVjZWl2ZXIsCiAgICAgICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQubnVtVHlwZSwKICAgICAgICAgICAgICAgIG90aGVyLmdldFR5cGUodHlwZUVudmlyb25tZW50KSkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHJlY2VpdmVyIGlzIERvdWJsZUNvbnN0YW50KSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDApIHsKICAgICAgICBzd2l0Y2ggKG5vZGUubmFtZS5uYW1lKSB7CiAgICAgICAgICBjYXNlICd1bmFyeS0nOgogICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG1ha2VEb3VibGVDb25zdGFudCgtcmVjZWl2ZXIudmFsdWUpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgZmluYWwgQ29uc3RhbnQgb3RoZXIgPSBhcmd1bWVudHNbMF07CgogICAgICAgIGlmIChvdGhlciBpcyBJbnRDb25zdGFudCB8fCBvdGhlciBpcyBEb3VibGVDb25zdGFudCkgewogICAgICAgICAgZmluYWwgbnVtIHZhbHVlID0gKG90aGVyIGlzIEludENvbnN0YW50KQogICAgICAgICAgICAgID8gb3RoZXIudmFsdWUKICAgICAgICAgICAgICA6IChvdGhlciBhcyBEb3VibGVDb25zdGFudCkudmFsdWU7CiAgICAgICAgICByZXR1cm4gZXZhbHVhdGVCaW5hcnlOdW1lcmljT3BlcmF0aW9uKAogICAgICAgICAgICAgIG5vZGUubmFtZS5uYW1lLCByZWNlaXZlci52YWx1ZSwgdmFsdWUsIG5vZGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRCaW5hcnlPcGVyYW5kVHlwZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgbm9kZS5uYW1lLm5hbWUsCiAgICAgICAgICAgICAgICByZWNlaXZlciwKICAgICAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5udW1UeXBlLAogICAgICAgICAgICAgICAgb3RoZXIuZ2V0VHlwZSh0eXBlRW52aXJvbm1lbnQpKSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocmVjZWl2ZXIgaXMgQm9vbENvbnN0YW50KSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICBmaW5hbCBDb25zdGFudCBvdGhlciA9IGFyZ3VtZW50c1swXTsKICAgICAgICBpZiAob3RoZXIgaXMgQm9vbENvbnN0YW50KSB7CiAgICAgICAgICBzd2l0Y2ggKG5vZGUubmFtZS5uYW1lKSB7CiAgICAgICAgICAgIGNhc2UgJ3wnOgogICAgICAgICAgICAgIHJldHVybiBjYW5vbmljYWxpemUoCiAgICAgICAgICAgICAgICAgIG5ldyBCb29sQ29uc3RhbnQocmVjZWl2ZXIudmFsdWUgfHwgb3RoZXIudmFsdWUpKTsKICAgICAgICAgICAgY2FzZSAnJic6CiAgICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZSgKICAgICAgICAgICAgICAgICAgbmV3IEJvb2xDb25zdGFudChyZWNlaXZlci52YWx1ZSAmJiBvdGhlci52YWx1ZSkpOwogICAgICAgICAgICBjYXNlICdeJzoKICAgICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKAogICAgICAgICAgICAgICAgICBuZXcgQm9vbENvbnN0YW50KHJlY2VpdmVyLnZhbHVlICE9IG90aGVyLnZhbHVlKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKHJlY2VpdmVyIGlzIE51bGxDb25zdGFudCkgewogICAgICByZXR1cm4gcmVwb3J0KG5vZGUsIG1lc3NhZ2VDb25zdEV2YWxOdWxsVmFsdWUpOwogICAgfQoKICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgbm9kZSwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgIG5vZGUubmFtZS5uYW1lLCByZWNlaXZlcikpOwogIH0KCiAgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihMb2dpY2FsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBmaW5hbCBDb25zdGFudCBsZWZ0ID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLmxlZnQpOwogICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgZW50ZXJMYXp5KCk7CiAgICAgIENvbnN0YW50IHJpZ2h0ID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLnJpZ2h0KTsKICAgICAgbGVhdmVMYXp5KCk7CiAgICAgIHJldHVybiB1bmV2YWx1YXRlZChub2RlLAogICAgICAgICAgbmV3IExvZ2ljYWxFeHByZXNzaW9uKGV4dHJhY3QobGVmdCksIG5vZGUub3BlcmF0b3IsIGV4dHJhY3QocmlnaHQpKSk7CiAgICB9CiAgICBzd2l0Y2ggKG5vZGUub3BlcmF0b3IpIHsKICAgICAgY2FzZSAnfHwnOgogICAgICAgIGlmIChsZWZ0IGlzIEJvb2xDb25zdGFudCkgewogICAgICAgICAgaWYgKGxlZnQudmFsdWUpIHJldHVybiB0cnVlQ29uc3RhbnQ7CgogICAgICAgICAgZmluYWwgQ29uc3RhbnQgcmlnaHQgPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUucmlnaHQpOwogICAgICAgICAgaWYgKHJpZ2h0IGlzIEJvb2xDb25zdGFudCB8fCByaWdodCBpcyBVbmV2YWx1YXRlZENvbnN0YW50KSB7CiAgICAgICAgICAgIHJldHVybiByaWdodDsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgbm9kZS5vcGVyYXRvciwKICAgICAgICAgICAgICAgICAgbGVmdCwKICAgICAgICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LmJvb2xUeXBlLAogICAgICAgICAgICAgICAgICByaWdodC5nZXRUeXBlKHR5cGVFbnZpcm9ubWVudCkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvbi53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgbm9kZS5vcGVyYXRvciwgbGVmdCkpOwogICAgICBjYXNlICcmJic6CiAgICAgICAgaWYgKGxlZnQgaXMgQm9vbENvbnN0YW50KSB7CiAgICAgICAgICBpZiAoIWxlZnQudmFsdWUpIHJldHVybiBmYWxzZUNvbnN0YW50OwoKICAgICAgICAgIGZpbmFsIENvbnN0YW50IHJpZ2h0ID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLnJpZ2h0KTsKICAgICAgICAgIGlmIChyaWdodCBpcyBCb29sQ29uc3RhbnQgfHwgcmlnaHQgaXMgVW5ldmFsdWF0ZWRDb25zdGFudCkgewogICAgICAgICAgICByZXR1cm4gcmlnaHQ7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgICAgICBub2RlLAogICAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgIG5vZGUub3BlcmF0b3IsCiAgICAgICAgICAgICAgICAgIGxlZnQsCiAgICAgICAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5ib29sVHlwZSwKICAgICAgICAgICAgICAgICAgcmlnaHQuZ2V0VHlwZSh0eXBlRW52aXJvbm1lbnQpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZE1ldGhvZEludm9jYXRpb24ud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIG5vZGUub3BlcmF0b3IsIGxlZnQpKTsKICAgICAgY2FzZSAnPz8nOgogICAgICAgIHJldHVybiAobGVmdCBpcyEgTnVsbENvbnN0YW50KQogICAgICAgICAgICA/IGxlZnQKICAgICAgICAgICAgOiBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUucmlnaHQpOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZE1ldGhvZEludm9jYXRpb24ud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIG5vZGUub3BlcmF0b3IsIGxlZnQpKTsKICAgIH0KICB9CgogIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBmaW5hbCBDb25zdGFudCBjb25kaXRpb24gPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUuY29uZGl0aW9uKTsKICAgIGlmIChjb25kaXRpb24gPT0gdHJ1ZUNvbnN0YW50KSB7CiAgICAgIHJldHVybiBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUudGhlbik7CiAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbiA9PSBmYWxzZUNvbnN0YW50KSB7CiAgICAgIHJldHVybiBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUub3RoZXJ3aXNlKTsKICAgIH0gZWxzZSBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICBlbnRlckxhenkoKTsKICAgICAgQ29uc3RhbnQgdGhlbiA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZS50aGVuKTsKICAgICAgQ29uc3RhbnQgb3RoZXJ3aXNlID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLm90aGVyd2lzZSk7CiAgICAgIGxlYXZlTGF6eSgpOwogICAgICByZXR1cm4gdW5ldmFsdWF0ZWQoCiAgICAgICAgICBub2RlLAogICAgICAgICAgbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbihleHRyYWN0KGNvbmRpdGlvbiksIGV4dHJhY3QodGhlbiksCiAgICAgICAgICAgICAgZXh0cmFjdChvdGhlcndpc2UpLCBub2RlLnN0YXRpY1R5cGUpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICBub2RlLmNvbmRpdGlvbiwKICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFR5cGUud2l0aEFyZ3VtZW50cyhjb25kaXRpb24sCiAgICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LmJvb2xUeXBlLCBjb25kaXRpb24uZ2V0VHlwZSh0eXBlRW52aXJvbm1lbnQpKSk7CiAgICB9CiAgfQoKICB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIGlmIChub2RlLnJlY2VpdmVyIGlzIFRoaXNFeHByZXNzaW9uKSB7CiAgICAgIC8vIEFjY2VzcyAidGhpcyIgZHVyaW5nIGluc3RhbmNlIGNyZWF0aW9uLgogICAgICBpZiAoaW5zdGFuY2VCdWlsZGVyID09IG51bGwpIHsKICAgICAgICByZXR1cm4gcmVwb3J0SW52YWxpZChub2RlLCAnSW5zdGFuY2UgZmllbGQgYWNjZXNzIG91dHNpZGUgY29uc3RydWN0b3InKTsKICAgICAgfQogICAgICBmb3IgKGZpbmFsIEZpZWxkIGZpZWxkIGluIGluc3RhbmNlQnVpbGRlci5maWVsZHMua2V5cykgewogICAgICAgIGlmIChmaWVsZC5uYW1lID09IG5vZGUubmFtZSkgewogICAgICAgICAgcmV0dXJuIGluc3RhbmNlQnVpbGRlci5maWVsZHNbZmllbGRdOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVwb3J0SW52YWxpZChub2RlLAogICAgICAgICAgJ0NvdWxkIG5vdCBldmFsdWF0ZSBmaWVsZCBnZXQgJHtub2RlLm5hbWV9IG9uIGluY29tcGxldGUgaW5zdGFuY2UnKTsKICAgIH0KCiAgICBmaW5hbCBDb25zdGFudCByZWNlaXZlciA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZS5yZWNlaXZlcik7CiAgICBpZiAocmVjZWl2ZXIgaXMgU3RyaW5nQ29uc3RhbnQgJiYgbm9kZS5uYW1lLm5hbWUgPT0gJ2xlbmd0aCcpIHsKICAgICAgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBKYXZhU2NyaXB0SW50Q29uc3RhbnQocmVjZWl2ZXIudmFsdWUubGVuZ3RoKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgSW50Q29uc3RhbnQocmVjZWl2ZXIudmFsdWUubGVuZ3RoKSk7CiAgICB9IGVsc2UgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKG5vZGUsCiAgICAgICAgICBuZXcgUHJvcGVydHlHZXQoZXh0cmFjdChyZWNlaXZlciksIG5vZGUubmFtZSwgbm9kZS5pbnRlcmZhY2VUYXJnZXQpKTsKICAgIH0gZWxzZSBpZiAocmVjZWl2ZXIgaXMgTnVsbENvbnN0YW50KSB7CiAgICAgIHJldHVybiByZXBvcnQobm9kZSwgbWVzc2FnZUNvbnN0RXZhbE51bGxWYWx1ZSk7CiAgICB9CiAgICByZXR1cm4gcmVwb3J0KAogICAgICAgIG5vZGUsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkUHJvcGVydHlHZXQud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgbm9kZS5uYW1lLm5hbWUsIHJlY2VpdmVyKSk7CiAgfQoKICB2aXNpdExldChMZXQgbm9kZSkgewogICAgZW52LmFkZFZhcmlhYmxlVmFsdWUoCiAgICAgICAgbm9kZS52YXJpYWJsZSwgX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLnZhcmlhYmxlLmluaXRpYWxpemVyKSk7CiAgICByZXR1cm4gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLmJvZHkpOwogIH0KCiAgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlKSB7CiAgICAvLyBOb3QgZXZlcnkgdmFyaWFibGUgd2hpY2ggYSBbVmFyaWFibGVHZXRdIHJlZmVycyB0byBtdXN0IGJlIG1hcmtlZCBhcwogICAgLy8gY29uc3RhbnQuICBGb3IgZXhhbXBsZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFzIHdlbGwgYXMgY29uc3RydWN0cwogICAgLy8gZGVzdWdhcmVkIHRvIFtMZXRdIGV4cHJlc3Npb25zIGFyZSBvay4KICAgIC8vCiAgICAvLyBUT0RPKGt1c3Rlcm1hbm4pOiBUaGUgaGV1cmlzdGljIG9mIGFsbG93aW5nIGFsbCBbVmFyaWFibGVHZXRdcyBvbiBbTGV0XQogICAgLy8gdmFyaWFibGVzIG1pZ2h0IGFsbG93IG1vcmUgdGhhbiBpdCBzaG91bGQuCiAgICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gbm9kZS52YXJpYWJsZTsKICAgIGlmICh2YXJpYWJsZS5wYXJlbnQgaXMgTGV0IHx8IF9pc0Zvcm1hbFBhcmFtZXRlcih2YXJpYWJsZSkpIHsKICAgICAgcmV0dXJuIGVudi5sb29rdXBWYXJpYWJsZShub2RlLnZhcmlhYmxlKSA/PwogICAgICAgICAgcmVwb3J0KAogICAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxOb25Db25zdGFudFZhcmlhYmxlR2V0CiAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHZhcmlhYmxlLm5hbWUpKTsKICAgIH0KICAgIGlmICh2YXJpYWJsZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiBfZXZhbHVhdGVTdWJleHByZXNzaW9uKHZhcmlhYmxlLmluaXRpYWxpemVyKTsKICAgIH0KICAgIHJldHVybiByZXBvcnRJbnZhbGlkKG5vZGUsICdWYXJpYWJsZSBnZXQgb2YgYSBub24tY29uc3QgdmFyaWFibGUuJyk7CiAgfQoKICB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgewogICAgcmV0dXJuIHdpdGhOZXdFbnZpcm9ubWVudCgoKSB7CiAgICAgIGZpbmFsIE1lbWJlciB0YXJnZXQgPSBub2RlLnRhcmdldDsKICAgICAgaWYgKHRhcmdldCBpcyBGaWVsZCkgewogICAgICAgIGlmICh0YXJnZXQuaXNDb25zdCkgewogICAgICAgICAgaWYgKHRhcmdldC5pc0luRXh0ZXJuYWxMaWJyYXJ5ICYmIHRhcmdldC5pbml0aWFsaXplciA9PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFRoZSB2YXJpYWJsZSBpcyB1bmF2YWlsYWJsZSBkdWUgdG8gc2VwYXJhdGUgY29tcGlsYXRpb24uCiAgICAgICAgICAgIHJldHVybiB1bmV2YWx1YXRlZChub2RlLCBuZXcgU3RhdGljR2V0KHRhcmdldCkpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJ1bkluc2lkZUNvbnRleHQodGFyZ2V0LCAoKSB7CiAgICAgICAgICAgIHJldHVybiBfZXZhbHVhdGVTdWJleHByZXNzaW9uKHRhcmdldC5pbml0aWFsaXplcik7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3RhdGljSW52b2NhdGlvbgogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHModGFyZ2V0Lm5hbWUubmFtZSkpOwogICAgICB9IGVsc2UgaWYgKHRhcmdldCBpcyBQcm9jZWR1cmUpIHsKICAgICAgICBpZiAodGFyZ2V0LmtpbmQgPT0gUHJvY2VkdXJlS2luZC5NZXRob2QpIHsKICAgICAgICAgIHJldHVybiBjYW5vbmljYWxpemUobmV3IFRlYXJPZmZDb25zdGFudCh0YXJnZXQpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3RhdGljSW52b2NhdGlvbgogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHModGFyZ2V0Lm5hbWUubmFtZSkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlcG9ydEludmFsaWQoCiAgICAgICAgICAgIG5vZGUsICdObyBzdXBwb3J0IGZvciAke3RhcmdldC5ydW50aW1lVHlwZX0gaW4gYSBzdGF0aWMtZ2V0LicpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9KTsKICB9CgogIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBjb25jYXRlbmF0ZWQgPSA8T2JqZWN0PltuZXcgU3RyaW5nQnVmZmVyKCldOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgIENvbnN0YW50IGNvbnN0YW50ID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb25zW2ldKTsKICAgICAgaWYgKGNvbnN0YW50IGlzIFByaW1pdGl2ZUNvbnN0YW50PE9iamVjdD4pIHsKICAgICAgICBTdHJpbmcgdmFsdWUgPSBjb25zdGFudC50b1N0cmluZygpOwogICAgICAgIE9iamVjdCBsYXN0ID0gY29uY2F0ZW5hdGVkLmxhc3Q7CiAgICAgICAgaWYgKGxhc3QgaXMgU3RyaW5nQnVmZmVyKSB7CiAgICAgICAgICBsYXN0LndyaXRlKHZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uY2F0ZW5hdGVkLmFkZChuZXcgU3RyaW5nQnVmZmVyKHZhbHVlKSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgICAvLyBUaGUgY29uc3RhbnQgaXMgZWl0aGVyIHVuZXZhbHVhdGVkIG9yIGEgbm9uLXByaW1pdGl2ZSBpbiBhbgogICAgICAgIC8vIHVuZXZhbHVhdGVkIGNvbnRleHQuIEluIGJvdGggY2FzZXMgd2UgZGVmZXIgdGhlIGV2YWx1YXRpb24gYW5kL29yCiAgICAgICAgLy8gZXJyb3IgcmVwb3J0aW5nIHRpbGwgbGF0ZXIuCiAgICAgICAgY29uY2F0ZW5hdGVkLmFkZChjb25zdGFudCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3RyaW5nSW50ZXJwb2xhdGlvbk9wZXJhbmQKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGNvbnN0YW50KSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjb25jYXRlbmF0ZWQubGVuZ3RoID4gMSkgewogICAgICBmaW5hbCBleHByZXNzaW9ucyA9IG5ldyBMaXN0PEV4cHJlc3Npb24+KGNvbmNhdGVuYXRlZC5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmNhdGVuYXRlZC5sZW5ndGg7IGkrKykgewogICAgICAgIE9iamVjdCB2YWx1ZSA9IGNvbmNhdGVuYXRlZFtpXTsKICAgICAgICBpZiAodmFsdWUgaXMgU3RyaW5nQnVmZmVyKSB7CiAgICAgICAgICBleHByZXNzaW9uc1tpXSA9IG5ldyBDb25zdGFudEV4cHJlc3Npb24oCiAgICAgICAgICAgICAgY2Fub25pY2FsaXplKG5ldyBTdHJpbmdDb25zdGFudCh2YWx1ZS50b1N0cmluZygpKSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBUaGUgdmFsdWUgaXMgZWl0aGVyIHVuZXZhbHVhdGVkIGNvbnN0YW50IG9yIGEgbm9uLXByaW1pdGl2ZQogICAgICAgICAgLy8gY29uc3RhbnQgaW4gYW4gdW5ldmFsdWF0ZWQgZXhwcmVzc2lvbi4KICAgICAgICAgIGV4cHJlc3Npb25zW2ldID0gZXh0cmFjdCh2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB1bmV2YWx1YXRlZChub2RlLCBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbihleHByZXNzaW9ucykpOwogICAgfQogICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgU3RyaW5nQ29uc3RhbnQoY29uY2F0ZW5hdGVkLnNpbmdsZS50b1N0cmluZygpKSk7CiAgfQoKICB2aXNpdFN0YXRpY0ludm9jYXRpb24oU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBmaW5hbCBQcm9jZWR1cmUgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBmaW5hbCBBcmd1bWVudHMgYXJndW1lbnRzID0gbm9kZS5hcmd1bWVudHM7CiAgICBmaW5hbCBwb3NpdGlvbmFscyA9IGV2YWx1YXRlUG9zaXRpb25hbEFyZ3VtZW50cyhhcmd1bWVudHMpOwogICAgZmluYWwgbmFtZWQgPSBldmFsdWF0ZU5hbWVkQXJndW1lbnRzKGFyZ3VtZW50cyk7CiAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICByZXR1cm4gdW5ldmFsdWF0ZWQoCiAgICAgICAgICBub2RlLAogICAgICAgICAgbmV3IFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICAgICAgdGFyZ2V0LCB1bmV2YWx1YXRlZEFyZ3VtZW50cyhwb3NpdGlvbmFscywgbmFtZWQsIGFyZ3VtZW50cy50eXBlcyksCiAgICAgICAgICAgICAgaXNDb25zdDogdHJ1ZSkpOwogICAgfQogICAgaWYgKHRhcmdldC5raW5kID09IFByb2NlZHVyZUtpbmQuRmFjdG9yeSkgewogICAgICBpZiAodGFyZ2V0LmlzQ29uc3QgJiYKICAgICAgICAgIHRhcmdldC5uYW1lLm5hbWUgPT0gImZyb21FbnZpcm9ubWVudCIgJiYKICAgICAgICAgIHRhcmdldC5lbmNsb3NpbmdMaWJyYXJ5ID09IGNvcmVUeXBlcy5jb3JlTGlicmFyeSAmJgogICAgICAgICAgcG9zaXRpb25hbHMubGVuZ3RoID09IDEpIHsKICAgICAgICBpZiAoZW52aXJvbm1lbnREZWZpbmVzICE9IG51bGwpIHsKICAgICAgICAgIC8vIEV2YWx1YXRlIGVudmlyb25tZW50IGNvbnN0YW50LgogICAgICAgICAgQ29uc3RhbnQgbmFtZSA9IHBvc2l0aW9uYWxzLnNpbmdsZTsKICAgICAgICAgIGlmIChuYW1lIGlzIFN0cmluZ0NvbnN0YW50KSB7CiAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGVudmlyb25tZW50RGVmaW5lc1tuYW1lLnZhbHVlXTsKICAgICAgICAgICAgQ29uc3RhbnQgZGVmYXVsdFZhbHVlID0gbmFtZWRbImRlZmF1bHRWYWx1ZSJdOwoKICAgICAgICAgICAgaWYgKHRhcmdldC5lbmNsb3NpbmdDbGFzcyA9PSBjb3JlVHlwZXMuYm9vbENsYXNzKSB7CiAgICAgICAgICAgICAgQ29uc3RhbnQgYm9vbENvbnN0YW50ID0gdmFsdWUgPT0gInRydWUiCiAgICAgICAgICAgICAgICAgID8gdHJ1ZUNvbnN0YW50CiAgICAgICAgICAgICAgICAgIDogdmFsdWUgPT0gImZhbHNlIgogICAgICAgICAgICAgICAgICAgICAgPyBmYWxzZUNvbnN0YW50CiAgICAgICAgICAgICAgICAgICAgICA6IGRlZmF1bHRWYWx1ZSBpcyBCb29sQ29uc3RhbnQKICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1ha2VCb29sQ29uc3RhbnQoZGVmYXVsdFZhbHVlLnZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVmYXVsdFZhbHVlIGlzIE51bGxDb25zdGFudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxDb25zdGFudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlQ29uc3RhbnQ7CiAgICAgICAgICAgICAgcmV0dXJuIGJvb2xDb25zdGFudDsKICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQuZW5jbG9zaW5nQ2xhc3MgPT0gY29yZVR5cGVzLmludENsYXNzKSB7CiAgICAgICAgICAgICAgaW50IGludFZhbHVlID0gdmFsdWUgIT0gbnVsbCA/IGludC50cnlQYXJzZSh2YWx1ZSkgOiBudWxsOwogICAgICAgICAgICAgIGludFZhbHVlID8/PSBkZWZhdWx0VmFsdWUgaXMgSW50Q29uc3RhbnQKICAgICAgICAgICAgICAgICAgPyBkZWZhdWx0VmFsdWUudmFsdWUKICAgICAgICAgICAgICAgICAgOiBkZWZhdWx0VmFsdWUgaXMgSmF2YVNjcmlwdEludENvbnN0YW50CiAgICAgICAgICAgICAgICAgICAgICA/IGRlZmF1bHRWYWx1ZS5iaWdJbnRWYWx1ZS50b0ludCgpCiAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7CiAgICAgICAgICAgICAgaWYgKGludFZhbHVlID09IG51bGwpIHJldHVybiBudWxsQ29uc3RhbnQ7CiAgICAgICAgICAgICAgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYW5vbmljYWxpemUobmV3IEphdmFTY3JpcHRJbnRDb25zdGFudChpbnRWYWx1ZSkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBJbnRDb25zdGFudChpbnRWYWx1ZSkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5lbmNsb3NpbmdDbGFzcyA9PSBjb3JlVHlwZXMuc3RyaW5nQ2xhc3MpIHsKICAgICAgICAgICAgICB2YWx1ZSA/Pz0KICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlIGlzIFN0cmluZ0NvbnN0YW50ID8gZGVmYXVsdFZhbHVlLnZhbHVlIDogbnVsbDsKICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGxDb25zdGFudDsKICAgICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBTdHJpbmdDb25zdGFudCh2YWx1ZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgaXMgTnVsbENvbnN0YW50KSB7CiAgICAgICAgICAgIHJldHVybiByZXBvcnQobm9kZSwgbWVzc2FnZUNvbnN0RXZhbE51bGxWYWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIExlYXZlIGVudmlyb25tZW50IGNvbnN0YW50IHVuZXZhbHVhdGVkLgogICAgICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKAogICAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgICAgbmV3IFN0YXRpY0ludm9jYXRpb24odGFyZ2V0LAogICAgICAgICAgICAgICAgICB1bmV2YWx1YXRlZEFyZ3VtZW50cyhwb3NpdGlvbmFscywgbmFtZWQsIGFyZ3VtZW50cy50eXBlcyksCiAgICAgICAgICAgICAgICAgIGlzQ29uc3Q6IHRydWUpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodGFyZ2V0Lm5hbWUubmFtZSA9PSAnaWRlbnRpY2FsJykgewogICAgICAvLyBFbnN1cmUgdGhlICJpZGVudGljYWwoKSIgZnVuY3Rpb24gY29tZXMgZnJvbSBkYXJ0OmNvcmUuCiAgICAgIGZpbmFsIHBhcmVudCA9IHRhcmdldC5wYXJlbnQ7CiAgICAgIGlmIChwYXJlbnQgaXMgTGlicmFyeSAmJiBwYXJlbnQgPT0gY29yZVR5cGVzLmNvcmVMaWJyYXJ5KSB7CiAgICAgICAgZmluYWwgQ29uc3RhbnQgbGVmdCA9IHBvc2l0aW9uYWxzWzBdOwogICAgICAgIGZpbmFsIENvbnN0YW50IHJpZ2h0ID0gcG9zaXRpb25hbHNbMV07CgogICAgICAgIGlmICh0YXJnZXRpbmdKYXZhU2NyaXB0KSB7CiAgICAgICAgICAvLyBJbiBKYXZhU2NyaXB0LCB3ZSBsb3dlciBbaWRlbnRpY2FsXSB0byBgPT09YCwgc28gYW55IGNvbXBhcmlzb24KICAgICAgICAgIC8vIGFnYWluc3QgTmFOIHlpZWxkcyBgZmFsc2VgLgogICAgICAgICAgaWYgKGlzTmFOKGxlZnQpIHx8IGlzTmFOKHJpZ2h0KSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2VDb25zdGFudDsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBJbiBKYXZhU2NyaXB0LCBgLTAuMCA9PT0gMC4wYC4KICAgICAgICAgIGlmIChpc1plcm8obGVmdCkpIHsKICAgICAgICAgICAgcmV0dXJuIG1ha2VCb29sQ29uc3RhbnQoaXNaZXJvKHJpZ2h0KSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBTaW5jZSB3ZSBjYW5vbmljYWxpemUgY29uc3RhbnRzIGR1cmluZyB0aGUgZXZhbHVhdGlvbiwgd2UgY2FuIHVzZQogICAgICAgIC8vIGlkZW50aWNhbCBoZXJlLgogICAgICAgIHJldHVybiBtYWtlQm9vbENvbnN0YW50KGlkZW50aWNhbChsZWZ0LCByaWdodCkpOwogICAgICB9CiAgICB9CgogICAgLy8gVE9ETyhrbWlsbGlraW4pIEZvciBhbiBpbnZhbGlkIGZhY3RvcnkgaW52b2NhdGlvbiB3ZSBzaG91bGQgYWRvcHQgYQogICAgLy8gYmV0dGVyIG1lc3NhZ2UuICBUaGlzIHdpbGwgc2hvdyBzb21ldGhpbmcgbGlrZToKICAgIC8vCiAgICAvLyAiVGhlIGludm9jYXRpb24gb2YgJ0xpc3QnIGlzIG5vdCBhbGxvd2VkIHdpdGhpbiBhIGNvbnN0IGNvbnRleHQuIgogICAgLy8KICAgIC8vIFdoaWNoIGlzIG5vdCBxdWl0ZSByaWdodCB3aGVuIHRoZSBjb2RlIHdhcyAibmV3IExpc3QoKSIuCiAgICBTdHJpbmcgbmFtZSA9IHRhcmdldC5uYW1lLm5hbWU7CiAgICBpZiAodGFyZ2V0IGlzIFByb2NlZHVyZSAmJiB0YXJnZXQuaXNGYWN0b3J5KSB7CiAgICAgIGlmIChuYW1lLmlzRW1wdHkpIHsKICAgICAgICBuYW1lID0gdGFyZ2V0LmVuY2xvc2luZ0NsYXNzLm5hbWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmFtZSA9ICcke3RhcmdldC5lbmNsb3NpbmdDbGFzcy5uYW1lfS4ke25hbWV9JzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICBub2RlLCB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uLndpdGhBcmd1bWVudHMobmFtZSkpOwogIH0KCiAgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIGZpbmFsIENvbnN0YW50IGNvbnN0YW50ID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLm9wZXJhbmQpOwogICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKG5vZGUsCiAgICAgICAgICBuZXcgQXNFeHByZXNzaW9uKGV4dHJhY3QoY29uc3RhbnQpLCBlbnYuc3Vic3RpdHV0ZVR5cGUobm9kZS50eXBlKSkpOwogICAgfQogICAgcmV0dXJuIGVuc3VyZUlzU3VidHlwZShjb25zdGFudCwgZXZhbHVhdGVEYXJ0VHlwZShub2RlLCBub2RlLnR5cGUpLCBub2RlKTsKICB9CgogIHZpc2l0SXNFeHByZXNzaW9uKElzRXhwcmVzc2lvbiBub2RlKSB7CiAgICBmaW5hbCBDb25zdGFudCBjb25zdGFudCA9IG5vZGUub3BlcmFuZC5hY2NlcHQodGhpcyk7CiAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICByZXR1cm4gdW5ldmFsdWF0ZWQobm9kZSwgbmV3IElzRXhwcmVzc2lvbihleHRyYWN0KGNvbnN0YW50KSwgbm9kZS50eXBlKSk7CiAgICB9CiAgICBpZiAoY29uc3RhbnQgaXMgTnVsbENvbnN0YW50KSB7CiAgICAgIHJldHVybiBtYWtlQm9vbENvbnN0YW50KG5vZGUudHlwZSA9PSB0eXBlRW52aXJvbm1lbnQubnVsbFR5cGUgfHwKICAgICAgICAgIG5vZGUudHlwZSA9PSB0eXBlRW52aXJvbm1lbnQub2JqZWN0VHlwZSB8fAogICAgICAgICAgbm9kZS50eXBlIGlzIER5bmFtaWNUeXBlKTsKICAgIH0KICAgIHJldHVybiBtYWtlQm9vbENvbnN0YW50KAogICAgICAgIGlzU3VidHlwZShjb25zdGFudCwgZXZhbHVhdGVEYXJ0VHlwZShub2RlLCBub2RlLnR5cGUpKSk7CiAgfQoKICB2aXNpdE5vdChOb3Qgbm9kZSkgewogICAgZmluYWwgQ29uc3RhbnQgY29uc3RhbnQgPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUub3BlcmFuZCk7CiAgICBpZiAoY29uc3RhbnQgaXMgQm9vbENvbnN0YW50KSB7CiAgICAgIHJldHVybiBtYWtlQm9vbENvbnN0YW50KGNvbnN0YW50ICE9IHRydWVDb25zdGFudCk7CiAgICB9CiAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICByZXR1cm4gdW5ldmFsdWF0ZWQobm9kZSwgbmV3IE5vdChleHRyYWN0KGNvbnN0YW50KSkpOwogICAgfQogICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICBub2RlLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFR5cGUud2l0aEFyZ3VtZW50cyhjb25zdGFudCwKICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LmJvb2xUeXBlLCBjb25zdGFudC5nZXRUeXBlKHR5cGVFbnZpcm9ubWVudCkpKTsKICB9CgogIHZpc2l0U3ltYm9sTGl0ZXJhbChTeW1ib2xMaXRlcmFsIG5vZGUpIHsKICAgIGZpbmFsIGxpYnJhcnlSZWZlcmVuY2UgPQogICAgICAgIG5vZGUudmFsdWUuc3RhcnRzV2l0aCgnXycpID8gbGlicmFyeU9mKG5vZGUpLnJlZmVyZW5jZSA6IG51bGw7CiAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBTeW1ib2xDb25zdGFudChub2RlLnZhbHVlLCBsaWJyYXJ5UmVmZXJlbmNlKSk7CiAgfQoKICB2aXNpdEluc3RhbnRpYXRpb24oSW5zdGFudGlhdGlvbiBub2RlKSB7CiAgICBmaW5hbCBDb25zdGFudCBjb25zdGFudCA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSB7CiAgICAgIHJldHVybiB1bmV2YWx1YXRlZCgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICBuZXcgSW5zdGFudGlhdGlvbihleHRyYWN0KGNvbnN0YW50KSwKICAgICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVudHMubWFwKCh0KSA9PiBlbnYuc3Vic3RpdHV0ZVR5cGUodCkpLnRvTGlzdCgpKSk7CiAgICB9CiAgICBpZiAoY29uc3RhbnQgaXMgVGVhck9mZkNvbnN0YW50KSB7CiAgICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoID09CiAgICAgICAgICBjb25zdGFudC5wcm9jZWR1cmUuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgZmluYWwgdHlwZUFyZ3VtZW50cyA9IGV2YWx1YXRlRGFydFR5cGVzKG5vZGUsIG5vZGUudHlwZUFyZ3VtZW50cyk7CiAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZSgKICAgICAgICAgICAgbmV3IFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoY29uc3RhbnQsIHR5cGVBcmd1bWVudHMpKTsKICAgICAgfQogICAgICByZXR1cm4gcmVwb3J0SW52YWxpZCgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICAnVGhlIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cyBzdXBwbGllZCBpbiB0aGUgcGFydGlhbCBpbnN0YW50aWF0aW9uICcKICAgICAgICAgICdkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIG9mIHRoZSAkY29uc3RhbnQuJyk7CiAgICB9CiAgICAvLyBUaGUgaW5uZXIgZXhwcmVzc2lvbiBpbiBhbiBpbnN0YW50aWF0aW9uIGNhbiBuZXZlciBiZSBudWxsLCBzaW5jZQogICAgLy8gaW5zdGFudGlhdGlvbnMgYXJlIG9ubHkgaW5mZXJyZWQgb24gZGlyZWN0IHJlZmVyZW5jZXMgdG8gZGVjbGFyYXRpb25zLgogICAgcmV0dXJuIHJlcG9ydEludmFsaWQoCiAgICAgICAgbm9kZSwgJ09ubHkgdGVhci1vZmYgY29uc3RhbnRzIGNhbiBiZSBwYXJ0aWFsbHkgaW5zdGFudGlhdGVkLicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZChDaGVja0xpYnJhcnlJc0xvYWRlZCBub2RlKSB7CiAgICByZXR1cm4gcmVwb3J0KAogICAgICAgIG5vZGUsIHRlbXBsYXRlQ29uc3RFdmFsRGVmZXJyZWRMaWJyYXJ5LndpdGhBcmd1bWVudHMobm9kZS5pbXBvcnQubmFtZSkpOwogIH0KCiAgLy8gSGVscGVyIG1ldGhvZHM6CgogIGJvb2wgaXNaZXJvKENvbnN0YW50IHZhbHVlKSA9PgogICAgICAodmFsdWUgaXMgSW50Q29uc3RhbnQgJiYgdmFsdWUudmFsdWUgPT0gMCkgfHwKICAgICAgKHZhbHVlIGlzIEphdmFTY3JpcHRJbnRDb25zdGFudCAmJiB2YWx1ZS5iaWdJbnRWYWx1ZSA9PSBCaWdJbnQuemVybykgfHwKICAgICAgKHZhbHVlIGlzIERvdWJsZUNvbnN0YW50ICYmIHZhbHVlLnZhbHVlID09IDApOwoKICBib29sIGlzTmFOKENvbnN0YW50IHZhbHVlKSA9PiB2YWx1ZSBpcyBEb3VibGVDb25zdGFudCAmJiB2YWx1ZS52YWx1ZS5pc05hTjsKCiAgYm9vbCBoYXNQcmltaXRpdmVFcXVhbChDb25zdGFudCBjb25zdGFudCkgewogICAgLy8gVE9ETyhhc2tlc2MsIGZpc2h5dGhlZmlzaCk6IE1ha2Ugc3VyZSB0aGUgY29ycmVjdCBjbGFzcyBpcyBpbmZlcnJlZAogICAgLy8gd2hlbiB3ZSBjbGVhbiB1cCBKYXZhU2NyaXB0IGludCBjb25zdGFudCBoYW5kbGluZy4KICAgIERhcnRUeXBlIHR5cGUgPSBjb25zdGFudC5nZXRUeXBlKHR5cGVFbnZpcm9ubWVudCk7CiAgICByZXR1cm4gISh0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYgIWNsYXNzSGFzUHJpbWl0aXZlRXF1YWwodHlwZS5jbGFzc05vZGUpKTsKICB9CgogIGJvb2wgY2xhc3NIYXNQcmltaXRpdmVFcXVhbChDbGFzcyBrbGFzcykgewogICAgYm9vbCBjYWNoZWQgPSBwcmltaXRpdmVFcXVhbENhY2hlW2tsYXNzXTsKICAgIGlmIChjYWNoZWQgIT0gbnVsbCkgcmV0dXJuIGNhY2hlZDsKICAgIGZvciAoUHJvY2VkdXJlIHByb2NlZHVyZSBpbiBrbGFzcy5wcm9jZWR1cmVzKSB7CiAgICAgIGlmIChwcm9jZWR1cmUua2luZCA9PSBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yICYmCiAgICAgICAgICBwcm9jZWR1cmUubmFtZS5uYW1lID09ICc9PScgJiYKICAgICAgICAgICFwcm9jZWR1cmUuaXNBYnN0cmFjdCAmJgogICAgICAgICAgIXByb2NlZHVyZS5pc0ZvcndhcmRpbmdTdHViKSB7CiAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUVxdWFsQ2FjaGVba2xhc3NdID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChrbGFzcy5zdXBlcnR5cGUgPT0gbnVsbCkgcmV0dXJuIHRydWU7IC8vIFRvIGJlIG9uIHRoZSBzYWZlIHNpZGUKICAgIHJldHVybiBwcmltaXRpdmVFcXVhbENhY2hlW2tsYXNzXSA9CiAgICAgICAgY2xhc3NIYXNQcmltaXRpdmVFcXVhbChrbGFzcy5zdXBlcnR5cGUuY2xhc3NOb2RlKTsKICB9CgogIEJvb2xDb25zdGFudCBtYWtlQm9vbENvbnN0YW50KGJvb2wgdmFsdWUpID0+CiAgICAgIHZhbHVlID8gdHJ1ZUNvbnN0YW50IDogZmFsc2VDb25zdGFudDsKCiAgRG91YmxlQ29uc3RhbnQgbWFrZURvdWJsZUNvbnN0YW50KGRvdWJsZSB2YWx1ZSkgewogICAgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgLy8gQ29udmVydCB0byBhbiBpbnRlZ2VyIHdoZW4gcG9zc2libGUgKG1hdGNoaW5nIHRoZSBydW50aW1lIGJlaGF2aW9yCiAgICAgIC8vIG9mIGBpcyBpbnRgKS4KICAgICAgaWYgKHZhbHVlLmlzRmluaXRlICYmICFpZGVudGljYWwodmFsdWUsIC0wLjApKSB7CiAgICAgICAgdmFyIGkgPSB2YWx1ZS50b0ludCgpOwogICAgICAgIGlmICh2YWx1ZSA9PSBpLnRvRG91YmxlKCkpIHJldHVybiBuZXcgSmF2YVNjcmlwdEludENvbnN0YW50KGkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IERvdWJsZUNvbnN0YW50KHZhbHVlKTsKICB9CgogIGJvb2wgaXNTdWJ0eXBlKENvbnN0YW50IGNvbnN0YW50LCBEYXJ0VHlwZSB0eXBlKSB7CiAgICBEYXJ0VHlwZSBjb25zdGFudFR5cGUgPSBjb25zdGFudC5nZXRUeXBlKHR5cGVFbnZpcm9ubWVudCk7CiAgICBpZiAodGFyZ2V0aW5nSmF2YVNjcmlwdCkgewogICAgICBpZiAoY29uc3RhbnRUeXBlID09IHR5cGVFbnZpcm9ubWVudC5pbnRUeXBlICYmCiAgICAgICAgICB0eXBlID09IHR5cGVFbnZpcm9ubWVudC5kb3VibGVUeXBlKSB7CiAgICAgICAgLy8gV2l0aCBKUyBzZW1hbnRpY3MsIGFuIGludGVnZXIgaXMgYWxzbyBhIGRvdWJsZS4KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKGNvbnN0YW50VHlwZSA9PSB0eXBlRW52aXJvbm1lbnQuZG91YmxlVHlwZSAmJgogICAgICAgICAgdHlwZSA9PSB0eXBlRW52aXJvbm1lbnQuaW50VHlwZSkgewogICAgICAgIGRvdWJsZSB2YWx1ZSA9IChjb25zdGFudCBhcyBEb3VibGVDb25zdGFudCkudmFsdWU7CiAgICAgICAgaWYgKHZhbHVlLmlzRmluaXRlICYmIHZhbHVlID09IHZhbHVlLnRydW5jYXRlVG9Eb3VibGUoKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKGNvbnN0YW50VHlwZSwgdHlwZSk7CiAgfQoKICBDb25zdGFudCBlbnN1cmVJc1N1YnR5cGUoQ29uc3RhbnQgY29uc3RhbnQsIERhcnRUeXBlIHR5cGUsIFRyZWVOb2RlIG5vZGUpIHsKICAgIGlmICghaXNTdWJ0eXBlKGNvbnN0YW50LCB0eXBlKSkgewogICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgbm9kZSwKICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICBjb25zdGFudCwgdHlwZSwgY29uc3RhbnQuZ2V0VHlwZSh0eXBlRW52aXJvbm1lbnQpKSk7CiAgICB9CiAgICByZXR1cm4gY29uc3RhbnQ7CiAgfQoKICBMaXN0PERhcnRUeXBlPiBldmFsdWF0ZVR5cGVBcmd1bWVudHMoVHJlZU5vZGUgbm9kZSwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIGV2YWx1YXRlRGFydFR5cGVzKG5vZGUsIGFyZ3VtZW50cy50eXBlcyk7CiAgfQoKICBMaXN0PERhcnRUeXBlPiBldmFsdWF0ZVN1cGVyVHlwZUFyZ3VtZW50cyhUcmVlTm9kZSBub2RlLCBTdXBlcnR5cGUgdHlwZSkgewogICAgcmV0dXJuIGV2YWx1YXRlRGFydFR5cGVzKG5vZGUsIHR5cGUudHlwZUFyZ3VtZW50cyk7CiAgfQoKICBMaXN0PERhcnRUeXBlPiBldmFsdWF0ZURhcnRUeXBlcyhUcmVlTm9kZSBub2RlLCBMaXN0PERhcnRUeXBlPiB0eXBlcykgewogICAgLy8gVE9ETzogT25jZSB0aGUgZnJvbnRlbmQgZ3VyYW50ZWVzIHRoYXQgdGhlcmUgYXJlIG5vIGZyZWUgdHlwZSB2YXJpYWJsZXMKICAgIC8vIGxlZnQgb3ZlciBhZnRlciBzdHVic3RpdHV0aW9uLCB3ZSBjYW4gZW5hYmxlIHRoaXMgc2hvcnRjdXQgYWdhaW46CiAgICAvLyBpZiAoZW52LmlzRW1wdHkpIHJldHVybiB0eXBlczsKICAgIHJldHVybiB0eXBlcy5tYXAoKHQpID0+IGV2YWx1YXRlRGFydFR5cGUobm9kZSwgdCkpLnRvTGlzdCgpOwogIH0KCiAgRGFydFR5cGUgZXZhbHVhdGVEYXJ0VHlwZShUcmVlTm9kZSBub2RlLCBEYXJ0VHlwZSB0eXBlKSB7CiAgICBmaW5hbCByZXN1bHQgPSBlbnYuc3Vic3RpdHV0ZVR5cGUodHlwZSk7CgogICAgaWYgKCFpc0luc3RhbnRpYXRlZChyZXN1bHQpKSB7CiAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICBub2RlLCB0ZW1wbGF0ZUNvbnN0RXZhbEZyZWVUeXBlUGFyYW1ldGVyLndpdGhBcmd1bWVudHModHlwZSkpOwogICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaXN0PENvbnN0YW50PiBldmFsdWF0ZVBvc2l0aW9uYWxBcmd1bWVudHMoQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5wb3NpdGlvbmFsLm1hcCgoRXhwcmVzc2lvbiBub2RlKSB7CiAgICAgIHJldHVybiBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUpOwogICAgfSkudG9MaXN0KCk7CiAgfQoKICBNYXA8U3RyaW5nLCBDb25zdGFudD4gZXZhbHVhdGVOYW1lZEFyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBpZiAoYXJndW1lbnRzLm5hbWVkLmlzRW1wdHkpIHJldHVybiBjb25zdCA8U3RyaW5nLCBDb25zdGFudD57fTsKCiAgICBmaW5hbCBNYXA8U3RyaW5nLCBDb25zdGFudD4gbmFtZWQgPSB7fTsKICAgIGFyZ3VtZW50cy5uYW1lZC5mb3JFYWNoKChOYW1lZEV4cHJlc3Npb24gcGFpcikgewogICAgICBuYW1lZFtwYWlyLm5hbWVdID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihwYWlyLnZhbHVlKTsKICAgIH0pOwogICAgcmV0dXJuIG5hbWVkOwogIH0KCiAgQXJndW1lbnRzIHVuZXZhbHVhdGVkQXJndW1lbnRzKExpc3Q8Q29uc3RhbnQ+IHBvc2l0aW9uYWxBcmdzLAogICAgICBNYXA8U3RyaW5nLCBDb25zdGFudD4gbmFtZWRBcmdzLCBMaXN0PERhcnRUeXBlPiB0eXBlcykgewogICAgZmluYWwgcG9zaXRpb25hbCA9IG5ldyBMaXN0PEV4cHJlc3Npb24+KHBvc2l0aW9uYWxBcmdzLmxlbmd0aCk7CiAgICBmaW5hbCBuYW1lZCA9IG5ldyBMaXN0PE5hbWVkRXhwcmVzc2lvbj4obmFtZWRBcmdzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9uYWxBcmdzLmxlbmd0aDsgKytpKSB7CiAgICAgIHBvc2l0aW9uYWxbaV0gPSBleHRyYWN0KHBvc2l0aW9uYWxBcmdzW2ldKTsKICAgIH0KICAgIGludCBpID0gMDsKICAgIG5hbWVkQXJncy5mb3JFYWNoKChTdHJpbmcgbmFtZSwgQ29uc3RhbnQgdmFsdWUpIHsKICAgICAgbmFtZWRbaSsrXSA9IG5ldyBOYW1lZEV4cHJlc3Npb24obmFtZSwgZXh0cmFjdCh2YWx1ZSkpOwogICAgfSk7CiAgICByZXR1cm4gbmV3IEFyZ3VtZW50cyhwb3NpdGlvbmFsLCBuYW1lZDogbmFtZWQsIHR5cGVzOiB0eXBlcyk7CiAgfQoKICBDb25zdGFudCBjYW5vbmljYWxpemUoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIHJldHVybiBjYW5vbmljYWxpemF0aW9uQ2FjaGUucHV0SWZBYnNlbnQoY29uc3RhbnQsICgpID0+IGNvbnN0YW50KTsKICB9CgogIHdpdGhOZXdJbnN0YW5jZUJ1aWxkZXIoQ2xhc3Mga2xhc3MsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMsIGZuKCkpIHsKICAgIEluc3RhbmNlQnVpbGRlciBvbGQgPSBpbnN0YW5jZUJ1aWxkZXI7CiAgICB0cnkgewogICAgICBpbnN0YW5jZUJ1aWxkZXIgPSBuZXcgSW5zdGFuY2VCdWlsZGVyKHRoaXMsIGtsYXNzLCB0eXBlQXJndW1lbnRzKTsKICAgICAgcmV0dXJuIGZuKCk7CiAgICB9IGZpbmFsbHkgewogICAgICBpbnN0YW5jZUJ1aWxkZXIgPSBvbGQ7CiAgICB9CiAgfQoKICB3aXRoTmV3RW52aXJvbm1lbnQoZm4oKSkgewogICAgZmluYWwgRXZhbHVhdGlvbkVudmlyb25tZW50IG9sZEVudiA9IGVudjsKICAgIHRyeSB7CiAgICAgIGVudiA9IG5ldyBFdmFsdWF0aW9uRW52aXJvbm1lbnQoKTsKICAgICAgcmV0dXJuIGZuKCk7CiAgICB9IGZpbmFsbHkgewogICAgICBlbnYgPSBvbGRFbnY7CiAgICB9CiAgfQoKICBDb25zdGFudCBldmFsdWF0ZUJpbmFyeUJpdE9wZXJhdGlvbihTdHJpbmcgb3AsIGludCBhLCBpbnQgYiwgVHJlZU5vZGUgbm9kZSkgewogICAgaW50IHJlc3VsdDsKICAgIHN3aXRjaCAob3ApIHsKICAgICAgY2FzZSAnfCc6CiAgICAgICAgcmVzdWx0ID0gYSB8IGI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJyYnOgogICAgICAgIHJlc3VsdCA9IGEgJiBiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdeJzoKICAgICAgICByZXN1bHQgPSBhIF4gYjsKICAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAodGFyZ2V0aW5nSmF2YVNjcmlwdCkgewogICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBKYXZhU2NyaXB0SW50Q29uc3RhbnQocmVzdWx0KSk7CiAgICB9CiAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBJbnRDb25zdGFudChyZXN1bHQpKTsKICB9CgogIENvbnN0YW50IGV2YWx1YXRlQmluYXJ5U2hpZnRPcGVyYXRpb24oU3RyaW5nIG9wLCBpbnQgYSwgaW50IGIsIFRyZWVOb2RlIG5vZGUsCiAgICAgIHtuZWdhdGl2ZVJlY2VpdmVyOiBmYWxzZX0pIHsKICAgIGludCByZXN1bHQ7CiAgICBzd2l0Y2ggKG9wKSB7CiAgICAgIGNhc2UgJzw8JzoKICAgICAgICByZXN1bHQgPSBhIDw8IGI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJz4+JzoKICAgICAgICBpZiAodGFyZ2V0aW5nSmF2YVNjcmlwdCkgewogICAgICAgICAgaWYgKG5lZ2F0aXZlUmVjZWl2ZXIpIHsKICAgICAgICAgICAgY29uc3Qgc2lnbkJpdCA9IDB4ODAwMDAwMDA7CiAgICAgICAgICAgIGEgLT0gKGEgJiBzaWduQml0KSA8PCAxOwogICAgICAgICAgfQogICAgICAgICAgcmVzdWx0ID0gYSA+PiBiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQgPSBhID4+IGI7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlICc+Pj4nOgogICAgICAgIC8vIFRPRE8oZmlzaHl0aGVmaXNoKTogSW1wbGVtZW50IEpTIHNlbWFudGljcyBmb3IgYD4+PmAuCiAgICAgICAgcmVzdWx0ID0gYiA+PSA2NCA/IDAgOiAoYSA+PiBiKSAmICgoMSA8PCAoNjQgLSBiKSkgLSAxKTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAodGFyZ2V0aW5nSmF2YVNjcmlwdCkgewogICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBKYXZhU2NyaXB0SW50Q29uc3RhbnQocmVzdWx0LnRvVW5zaWduZWQoMzIpKSk7CiAgICB9CiAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBJbnRDb25zdGFudChyZXN1bHQpKTsKICB9CgogIENvbnN0YW50IGV2YWx1YXRlQmluYXJ5TnVtZXJpY09wZXJhdGlvbigKICAgICAgU3RyaW5nIG9wLCBudW0gYSwgbnVtIGIsIFRyZWVOb2RlIG5vZGUpIHsKICAgIG51bSByZXN1bHQ7CiAgICBzd2l0Y2ggKG9wKSB7CiAgICAgIGNhc2UgJysnOgogICAgICAgIHJlc3VsdCA9IGEgKyBiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICctJzoKICAgICAgICByZXN1bHQgPSBhIC0gYjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnKic6CiAgICAgICAgcmVzdWx0ID0gYSAqIGI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJy8nOgogICAgICAgIHJlc3VsdCA9IGEgLyBiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICd+Lyc6CiAgICAgICAgcmVzdWx0ID0gYSB+LyBiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICclJzoKICAgICAgICByZXN1bHQgPSBhICUgYjsKICAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAocmVzdWx0IGlzIGludCkgewogICAgICBpZiAodGFyZ2V0aW5nSmF2YVNjcmlwdCkgewogICAgICAgIHJldHVybiBjYW5vbmljYWxpemUobmV3IEphdmFTY3JpcHRJbnRDb25zdGFudChyZXN1bHQpKTsKICAgICAgfQogICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBJbnRDb25zdGFudChyZXN1bHQudG9TaWduZWQoNjQpKSk7CiAgICB9CiAgICBpZiAocmVzdWx0IGlzIGRvdWJsZSkgewogICAgICByZXR1cm4gY2Fub25pY2FsaXplKG1ha2VEb3VibGVDb25zdGFudChyZXN1bHQpKTsKICAgIH0KCiAgICBzd2l0Y2ggKG9wKSB7CiAgICAgIGNhc2UgJzwnOgogICAgICAgIHJldHVybiBtYWtlQm9vbENvbnN0YW50KGEgPCBiKTsKICAgICAgY2FzZSAnPD0nOgogICAgICAgIHJldHVybiBtYWtlQm9vbENvbnN0YW50KGEgPD0gYik7CiAgICAgIGNhc2UgJz49JzoKICAgICAgICByZXR1cm4gbWFrZUJvb2xDb25zdGFudChhID49IGIpOwogICAgICBjYXNlICc+JzoKICAgICAgICByZXR1cm4gbWFrZUJvb2xDb25zdGFudChhID4gYik7CiAgICB9CgogICAgcmV0dXJuIHJlcG9ydEludmFsaWQobm9kZSwgIlVuZXhwZWN0ZWQgYmluYXJ5IG51bWVyaWMgb3BlcmF0aW9uICckb3AnLiIpOwogIH0KCiAgTGlicmFyeSBsaWJyYXJ5T2YoVHJlZU5vZGUgbm9kZSkgewogICAgLy8gVGhlIHRyZWUgc3RydWN0dXJlIG9mIHRoZSBrZXJuZWwgQVNUIGVuc3VyZXMgd2UgYWx3YXlzIGhhdmUgYW4gZW5jbG9zaW5nCiAgICAvLyBsaWJyYXJ5LgogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKG5vZGUgaXMgTGlicmFyeSkgcmV0dXJuIG5vZGU7CiAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgIH0KICB9Cn0KCi8vLyBIb2xkcyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciBhIGNvbnN0YW50IG9iamVjdCwgbmFtZWx5Ci8vLyAgICogdGhlIFtrbGFzc10gYmVpbmcgaW5zdGFudGlhdGVkCi8vLyAgICogdGhlIFt0eXBlQXJndW1lbnRzXSB1c2VkIGZvciB0aGUgaW5zdGFudGlhdGlvbgovLy8gICAqIHRoZSBbZmllbGRzXSB0aGUgaW5zdGFuY2Ugd2lsbCBvYnRhaW4gKGFsbCBmaWVsZHMgZnJvbSB0aGUKLy8vICAgICBpbnN0YW50aWF0ZWQgW2tsYXNzXSB1cCB0byB0aGUgW09iamVjdF0ga2xhc3MpLgpjbGFzcyBJbnN0YW5jZUJ1aWxkZXIgewogIENvbnN0YW50RXZhbHVhdG9yIGV2YWx1YXRvcjsKCiAgLy8vIFRoZSBjbGFzcyBvZiB0aGUgbmV3IGluc3RhbmNlLgogIGZpbmFsIENsYXNzIGtsYXNzOwoKICAvLy8gVGhlIHZhbHVlcyBvZiB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIHRoZSBuZXcgaW5zdGFuY2UuCiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgLy8vIFRoZSBmaWVsZCB2YWx1ZXMgb2YgdGhlIG5ldyBpbnN0YW5jZS4KICBmaW5hbCBNYXA8RmllbGQsIENvbnN0YW50PiBmaWVsZHMgPSA8RmllbGQsIENvbnN0YW50Pnt9OwoKICBmaW5hbCBMaXN0PEFzc2VydFN0YXRlbWVudD4gYXNzZXJ0cyA9IDxBc3NlcnRTdGF0ZW1lbnQ+W107CgogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gdW51c2VkQXJndW1lbnRzID0gPEV4cHJlc3Npb24+W107CgogIEluc3RhbmNlQnVpbGRlcih0aGlzLmV2YWx1YXRvciwgdGhpcy5rbGFzcywgdGhpcy50eXBlQXJndW1lbnRzKTsKCiAgdm9pZCBzZXRGaWVsZFZhbHVlKEZpZWxkIGZpZWxkLCBDb25zdGFudCBjb25zdGFudCkgewogICAgZmllbGRzW2ZpZWxkXSA9IGNvbnN0YW50OwogIH0KCiAgSW5zdGFuY2VDb25zdGFudCBidWlsZEluc3RhbmNlKCkgewogICAgYXNzZXJ0KGFzc2VydHMuaXNFbXB0eSk7CiAgICBmaW5hbCBNYXA8UmVmZXJlbmNlLCBDb25zdGFudD4gZmllbGRWYWx1ZXMgPSA8UmVmZXJlbmNlLCBDb25zdGFudD57fTsKICAgIGZpZWxkcy5mb3JFYWNoKChGaWVsZCBmaWVsZCwgQ29uc3RhbnQgdmFsdWUpIHsKICAgICAgYXNzZXJ0KHZhbHVlIGlzISBVbmV2YWx1YXRlZENvbnN0YW50KTsKICAgICAgZmllbGRWYWx1ZXNbZmllbGQucmVmZXJlbmNlXSA9IHZhbHVlOwogICAgfSk7CiAgICBhc3NlcnQodW51c2VkQXJndW1lbnRzLmlzRW1wdHkpOwogICAgcmV0dXJuIG5ldyBJbnN0YW5jZUNvbnN0YW50KGtsYXNzLnJlZmVyZW5jZSwgdHlwZUFyZ3VtZW50cywgZmllbGRWYWx1ZXMpOwogIH0KCiAgSW5zdGFuY2VDcmVhdGlvbiBidWlsZFVuZXZhbHVhdGVkSW5zdGFuY2UoKSB7CiAgICBmaW5hbCBNYXA8UmVmZXJlbmNlLCBFeHByZXNzaW9uPiBmaWVsZFZhbHVlcyA9IDxSZWZlcmVuY2UsIEV4cHJlc3Npb24+e307CiAgICBmaWVsZHMuZm9yRWFjaCgoRmllbGQgZmllbGQsIENvbnN0YW50IHZhbHVlKSB7CiAgICAgIGZpZWxkVmFsdWVzW2ZpZWxkLnJlZmVyZW5jZV0gPSBldmFsdWF0b3IuZXh0cmFjdCh2YWx1ZSk7CiAgICB9KTsKICAgIHJldHVybiBuZXcgSW5zdGFuY2VDcmVhdGlvbigKICAgICAgICBrbGFzcy5yZWZlcmVuY2UsIHR5cGVBcmd1bWVudHMsIGZpZWxkVmFsdWVzLCBhc3NlcnRzLCB1bnVzZWRBcmd1bWVudHMpOwogIH0KfQoKLy8vIEhvbGRzIGFuIGVudmlyb25tZW50IG9mIHR5cGUgcGFyYW1ldGVycywgcGFyYW1ldGVycyBhbmQgdmFyaWFibGVzLgpjbGFzcyBFdmFsdWF0aW9uRW52aXJvbm1lbnQgewogIC8vLyBUaGUgdmFsdWVzIG9mIHRoZSB0eXBlIHBhcmFtZXRlcnMgaW4gc2NvcGUuCiAgZmluYWwgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBfdHlwZVZhcmlhYmxlcyA9CiAgICAgIDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKCiAgLy8vIFRoZSB2YWx1ZXMgb2YgdGhlIHBhcmFtZXRlcnMvdmFyaWFibGVzIGluIHNjb3BlLgogIGZpbmFsIE1hcDxWYXJpYWJsZURlY2xhcmF0aW9uLCBDb25zdGFudD4gX3ZhcmlhYmxlcyA9CiAgICAgIDxWYXJpYWJsZURlY2xhcmF0aW9uLCBDb25zdGFudD57fTsKCiAgLy8vIFRoZSB2YXJpYWJsZXMgdGhhdCBob2xkIHVuZXZhbHVhdGVkIGNvbnN0YW50cy4KICAvLy8KICAvLy8gVmFyaWFibGVzIGFyZSByZW1vdmVkIGZyb20gdGhpcyBzZXQgd2hlbiBsb29rZWQgdXAsIGxlYXZpbmcgb25seSB0aGUKICAvLy8gdW5yZWFkIHZhcmlhYmxlcyBhdCB0aGUgZW5kLgogIGZpbmFsIFNldDxWYXJpYWJsZURlY2xhcmF0aW9uPiBfdW5yZWFkVW5ldmFsdWF0ZWRWYXJpYWJsZXMgPQogICAgICBuZXcgU2V0PFZhcmlhYmxlRGVjbGFyYXRpb24+KCk7CgogIC8vLyBXaGV0aGVyIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIGVtcHR5LgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX3R5cGVWYXJpYWJsZXMuaXNFbXB0eSAmJiBfdmFyaWFibGVzLmlzRW1wdHk7CgogIHZvaWQgYWRkVHlwZVBhcmFtZXRlclZhbHVlKFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyLCBEYXJ0VHlwZSB2YWx1ZSkgewogICAgYXNzZXJ0KCFfdHlwZVZhcmlhYmxlcy5jb250YWluc0tleShwYXJhbWV0ZXIpKTsKICAgIF90eXBlVmFyaWFibGVzW3BhcmFtZXRlcl0gPSB2YWx1ZTsKICB9CgogIHZvaWQgYWRkVmFyaWFibGVWYWx1ZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBDb25zdGFudCB2YWx1ZSkgewogICAgX3ZhcmlhYmxlc1t2YXJpYWJsZV0gPSB2YWx1ZTsKICAgIGlmICh2YWx1ZSBpcyBVbmV2YWx1YXRlZENvbnN0YW50KSB7CiAgICAgIF91bnJlYWRVbmV2YWx1YXRlZFZhcmlhYmxlcy5hZGQodmFyaWFibGUpOwogICAgfQogIH0KCiAgRGFydFR5cGUgbG9va3VwUGFyYW1ldGVyVmFsdWUoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKICAgIGZpbmFsIERhcnRUeXBlIHZhbHVlID0gX3R5cGVWYXJpYWJsZXNbcGFyYW1ldGVyXTsKICAgIGFzc2VydCh2YWx1ZSAhPSBudWxsKTsKICAgIHJldHVybiB2YWx1ZTsKICB9CgogIENvbnN0YW50IGxvb2t1cFZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgIENvbnN0YW50IHZhbHVlID0gX3ZhcmlhYmxlc1t2YXJpYWJsZV07CiAgICBpZiAodmFsdWUgaXMgVW5ldmFsdWF0ZWRDb25zdGFudCkgewogICAgICBfdW5yZWFkVW5ldmFsdWF0ZWRWYXJpYWJsZXMucmVtb3ZlKHZhcmlhYmxlKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIC8vLyBUaGUgdW5ldmFsdWF0ZWQgY29uc3RhbnRzIG9mIHZhcmlhYmxlcyB0aGF0IHdlcmUgbmV2ZXIgcmVhZC4KICBJdGVyYWJsZTxVbmV2YWx1YXRlZENvbnN0YW50PiBnZXQgdW5ldmFsdWF0ZWRVbnJlYWRDb25zdGFudHMgewogICAgaWYgKF91bnJlYWRVbmV2YWx1YXRlZFZhcmlhYmxlcy5pc0VtcHR5KSByZXR1cm4gY29uc3QgW107CiAgICByZXR1cm4gX3VucmVhZFVuZXZhbHVhdGVkVmFyaWFibGVzLm1hcDxVbmV2YWx1YXRlZENvbnN0YW50PigKICAgICAgICAoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgPT4gX3ZhcmlhYmxlc1t2YXJpYWJsZV0pOwogIH0KCiAgRGFydFR5cGUgc3Vic3RpdHV0ZVR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgaWYgKF90eXBlVmFyaWFibGVzLmlzRW1wdHkpIHJldHVybiB0eXBlOwogICAgcmV0dXJuIHN1YnN0aXR1dGUodHlwZSwgX3R5cGVWYXJpYWJsZXMpOwogIH0KfQoKLy8gVXNlZCBhcyBjb250cm9sLWZsb3cgdG8gYWJvcnQgdGhlIGN1cnJlbnQgZXZhbHVhdGlvbi4KY2xhc3MgX0Fib3J0RHVlVG9FcnJvciB7CiAgZmluYWwgVHJlZU5vZGUgbm9kZTsKICBmaW5hbCBNZXNzYWdlIG1lc3NhZ2U7CiAgZmluYWwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dDsKCiAgX0Fib3J0RHVlVG9FcnJvcih0aGlzLm5vZGUsIHRoaXMubWVzc2FnZSwge3RoaXMuY29udGV4dH0pOwp9CgpjbGFzcyBfQWJvcnREdWVUb0ludmFsaWRFeHByZXNzaW9uIHsKICBmaW5hbCBUcmVlTm9kZSBub2RlOwogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwoKICBfQWJvcnREdWVUb0ludmFsaWRFeHByZXNzaW9uKHRoaXMubm9kZSwgdGhpcy5tZXNzYWdlKTsKfQoKYWJzdHJhY3QgY2xhc3MgRXJyb3JSZXBvcnRlciB7CiAgY29uc3QgRXJyb3JSZXBvcnRlcigpOwoKICB2b2lkIHJlcG9ydChMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0KTsKCiAgdm9pZCByZXBvcnRJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBub2RlKTsKfQoKY2xhc3MgU2ltcGxlRXJyb3JSZXBvcnRlciBpbXBsZW1lbnRzIEVycm9yUmVwb3J0ZXIgewogIGNvbnN0IFNpbXBsZUVycm9yUmVwb3J0ZXIoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnQoTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCkgewogICAgX3JlcG9ydChtZXNzYWdlKTsKICAgIGZvciAoTG9jYXRlZE1lc3NhZ2UgY29udGV4dE1lc3NhZ2UgaW4gY29udGV4dCkgewogICAgICBfcmVwb3J0KGNvbnRleHRNZXNzYWdlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVwb3J0SW52YWxpZEV4cHJlc3Npb24oSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgewogICAgLy8gSWdub3JlZAogIH0KCiAgdm9pZCBfcmVwb3J0KExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKICAgIHJlcG9ydE1lc3NhZ2UobWVzc2FnZS51cmksIG1lc3NhZ2UuY2hhck9mZnNldCwgbWVzc2FnZS5tZXNzYWdlKTsKICB9CgogIHZvaWQgcmVwb3J0TWVzc2FnZShVcmkgdXJpLCBpbnQgb2Zmc2V0LCBTdHJpbmcgbWVzc2FnZSkgewogICAgaW8uZXhpdENvZGUgPSA0MjsKICAgIGlvLnN0ZGVyci53cml0ZWxuKCckdXJpOiRvZmZzZXQgQ29uc3RhbnQgZXZhbHVhdGlvbiBlcnJvcjogJG1lc3NhZ2UnKTsKICB9Cn0KCmNsYXNzIElzSW5zdGFudGlhdGVkVmlzaXRvciBleHRlbmRzIERhcnRUeXBlVmlzaXRvcjxib29sPiB7CiAgZmluYWwgX2F2YWlsYWJsZVZhcmlhYmxlcyA9IG5ldyBTZXQ8VHlwZVBhcmFtZXRlcj4oKTsKCiAgYm9vbCBpc0luc3RhbnRpYXRlZChEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gdHlwZS5hY2NlcHQodGhpcyk7CiAgfQoKICBib29sIGRlZmF1bHREYXJ0VHlwZShEYXJ0VHlwZSBub2RlKSB7CiAgICB0aHJvdyAnQSB2aXNpdG9yIG1ldGhvZCBzZWVtcyB0byBiZSB1bmltcGxlbWVudGVkISc7CiAgfQoKICBib29sIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgPT4gdHJ1ZTsKICBib29sIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSkgPT4gdHJ1ZTsKICBib29sIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgbm9kZSkgPT4gdHJ1ZTsKICBib29sIHZpc2l0Qm90dG9tVHlwZShCb3R0b21UeXBlIG5vZGUpID0+IHRydWU7CgogIGJvb2wgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICByZXR1cm4gX2F2YWlsYWJsZVZhcmlhYmxlcy5jb250YWlucyhub2RlLnBhcmFtZXRlcik7CiAgfQoKICBib29sIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIHJldHVybiBub2RlLnR5cGVBcmd1bWVudHMKICAgICAgICAuZXZlcnkoKERhcnRUeXBlIHR5cGVBcmd1bWVudCkgPT4gdHlwZUFyZ3VtZW50LmFjY2VwdCh0aGlzKSk7CiAgfQoKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBmaW5hbCBwYXJhbWV0ZXJzID0gbm9kZS50eXBlUGFyYW1ldGVyczsKICAgIF9hdmFpbGFibGVWYXJpYWJsZXMuYWRkQWxsKHBhcmFtZXRlcnMpOwogICAgZmluYWwgYm9vbCByZXN1bHQgPSBub2RlLnJldHVyblR5cGUuYWNjZXB0KHRoaXMpICYmCiAgICAgICAgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5ldmVyeSgocCkgPT4gcC5hY2NlcHQodGhpcykpICYmCiAgICAgICAgbm9kZS5uYW1lZFBhcmFtZXRlcnMuZXZlcnkoKHApID0+IHAudHlwZS5hY2NlcHQodGhpcykpOwogICAgX2F2YWlsYWJsZVZhcmlhYmxlcy5yZW1vdmVBbGwocGFyYW1ldGVycyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgYm9vbCB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUpIHsKICAgIHJldHVybiBub2RlLnVuYWxpYXMuYWNjZXB0KHRoaXMpOwogIH0KfQoKYm9vbCBfaXNGb3JtYWxQYXJhbWV0ZXIoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogIGZpbmFsIHBhcmVudCA9IHZhcmlhYmxlLnBhcmVudDsKICBpZiAocGFyZW50IGlzIEZ1bmN0aW9uTm9kZSkgewogICAgcmV0dXJuIHBhcmVudC5wb3NpdGlvbmFsUGFyYW1ldGVycy5jb250YWlucyh2YXJpYWJsZSkgfHwKICAgICAgICBwYXJlbnQubmFtZWRQYXJhbWV0ZXJzLmNvbnRhaW5zKHZhcmlhYmxlKTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CokMAE5OPAFQBFBKUQwETUwgBEtRLyIBIgEYASIuJCklKy8B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Q29uc3RhbnRCdWlsZGVyPEwgZXh0ZW5kcyBFeHByZXNzaW9uPiB7CiAgZmluYWwgQ29uc3RhbnRFdmFsdWF0b3IgZXZhbHVhdG9yOwogIGZpbmFsIEV4cHJlc3Npb24gb3JpZ2luYWw7CiAgZmluYWwgRGFydFR5cGUgZWxlbWVudFR5cGU7CgogIC8vIEVhY2ggZWxlbWVudCBvZiBbcGFydHNdIGlzIGVpdGhlciBhIGBMaXN0PENvbnN0YW50PmAgKGNvbnRhaW5pbmcgZnVsbHkKICAvLyBldmFsdWF0ZWQgY29uc3RhbnRzKSBvciBhIGBDb25zdGFudGAgKHBvdGVudGlhbGx5IHVuZXZhbHVhdGVkKS4KICBMaXN0PE9iamVjdD4gcGFydHMgPSA8T2JqZWN0Pls8Q29uc3RhbnQ+W11dOwoKICBfTGlzdE9yU2V0Q29uc3RhbnRCdWlsZGVyKHRoaXMub3JpZ2luYWwsIHRoaXMuZWxlbWVudFR5cGUsIHRoaXMuZXZhbHVhdG9yKTsKCiAgTCBtYWtlTGl0ZXJhbChMaXN0PEV4cHJlc3Npb24+IGVsZW1lbnRzKTsKCiAgLy8vIEFkZCBhbiBlbGVtZW50IHRvIHRoZSBjb25zdGFudCBsaXN0IGJlaW5nIGJ1aWx0IGJ5IHRoaXMgYnVpbGRlci4KICB2b2lkIGFkZChFeHByZXNzaW9uIGVsZW1lbnQpIHsKICAgIENvbnN0YW50IGNvbnN0YW50ID0gZXZhbHVhdG9yLl9ldmFsdWF0ZVN1YmV4cHJlc3Npb24oZWxlbWVudCk7CiAgICBpZiAoZXZhbHVhdG9yLnNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgcGFydHMuYWRkKGV2YWx1YXRvci51bmV2YWx1YXRlZCgKICAgICAgICAgIGVsZW1lbnQsIG1ha2VMaXRlcmFsKFtldmFsdWF0b3IuZXh0cmFjdChjb25zdGFudCldKSkpOwogICAgfSBlbHNlIHsKICAgICAgYWRkQ29uc3RhbnQoY29uc3RhbnQsIGVsZW1lbnQpOwogICAgfQogIH0KCiAgdm9pZCBhZGRTcHJlYWQoRXhwcmVzc2lvbiBzcHJlYWRFeHByZXNzaW9uKSB7CiAgICBDb25zdGFudCBzcHJlYWQgPQogICAgICAgIGV2YWx1YXRvci51bmxvd2VyKGV2YWx1YXRvci5fZXZhbHVhdGVTdWJleHByZXNzaW9uKHNwcmVhZEV4cHJlc3Npb24pKTsKICAgIGlmIChldmFsdWF0b3Iuc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICAvLyBVbmV2YWx1YXRlZCBzcHJlYWQKICAgICAgcGFydHMuYWRkKHNwcmVhZCk7CiAgICB9IGVsc2UgaWYgKHNwcmVhZCA9PSBldmFsdWF0b3IubnVsbENvbnN0YW50KSB7CiAgICAgIC8vIE51bGwgc3ByZWFkCiAgICAgIGV2YWx1YXRvci5yZXBvcnQoc3ByZWFkRXhwcmVzc2lvbiwgbWVzc2FnZUNvbnN0RXZhbE51bGxWYWx1ZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBGdWxseSBldmFsdWF0ZWQgc3ByZWFkCiAgICAgIExpc3Q8Q29uc3RhbnQ+IGVudHJpZXM7CiAgICAgIGlmIChzcHJlYWQgaXMgTGlzdENvbnN0YW50KSB7CiAgICAgICAgZW50cmllcyA9IHNwcmVhZC5lbnRyaWVzOwogICAgICB9IGVsc2UgaWYgKHNwcmVhZCBpcyBTZXRDb25zdGFudCkgewogICAgICAgIGVudHJpZXMgPSBzcHJlYWQuZW50cmllczsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBOb3QgbGlzdCBvciBzZXQgaW4gc3ByZWFkCiAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5yZXBvcnQoCiAgICAgICAgICAgIHNwcmVhZEV4cHJlc3Npb24sIG1lc3NhZ2VDb25zdEV2YWxOb3RMaXN0T3JTZXRJblNwcmVhZCk7CiAgICAgIH0KICAgICAgZm9yIChDb25zdGFudCBlbnRyeSBpbiBlbnRyaWVzKSB7CiAgICAgICAgYWRkQ29uc3RhbnQoZW50cnksIHNwcmVhZEV4cHJlc3Npb24pOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGFkZENvbnN0YW50KENvbnN0YW50IGNvbnN0YW50LCBUcmVlTm9kZSBjb250ZXh0KTsKCiAgQ29uc3RhbnQgYnVpbGQoKTsKfQoKY2xhc3MgTGlzdENvbnN0YW50QnVpbGRlciBleHRlbmRzIF9MaXN0T3JTZXRDb25zdGFudEJ1aWxkZXI8TGlzdExpdGVyYWw+IHsKICBMaXN0Q29uc3RhbnRCdWlsZGVyKAogICAgICBFeHByZXNzaW9uIG9yaWdpbmFsLCBEYXJ0VHlwZSBlbGVtZW50VHlwZSwgQ29uc3RhbnRFdmFsdWF0b3IgZXZhbHVhdG9yKQogICAgICA6IHN1cGVyKG9yaWdpbmFsLCBlbGVtZW50VHlwZSwgZXZhbHVhdG9yKTsKCiAgQG92ZXJyaWRlCiAgTGlzdExpdGVyYWwgbWFrZUxpdGVyYWwoTGlzdDxFeHByZXNzaW9uPiBlbGVtZW50cykgPT4KICAgICAgbmV3IExpc3RMaXRlcmFsKGVsZW1lbnRzLCBpc0NvbnN0OiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRDb25zdGFudChDb25zdGFudCBjb25zdGFudCwgVHJlZU5vZGUgY29udGV4dCkgewogICAgTGlzdDxDb25zdGFudD4gbGFzdFBhcnQ7CiAgICBpZiAocGFydHMubGFzdCBpcyBMaXN0PENvbnN0YW50PikgewogICAgICBsYXN0UGFydCA9IHBhcnRzLmxhc3Q7CiAgICB9IGVsc2UgewogICAgICBwYXJ0cy5hZGQobGFzdFBhcnQgPSA8Q29uc3RhbnQ+W10pOwogICAgfQogICAgbGFzdFBhcnQuYWRkKGV2YWx1YXRvci5lbnN1cmVJc1N1YnR5cGUoY29uc3RhbnQsIGVsZW1lbnRUeXBlLCBjb250ZXh0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCBidWlsZCgpIHsKICAgIGlmIChwYXJ0cy5sZW5ndGggPT0gMSkgewogICAgICAvLyBGdWxseSBldmFsdWF0ZWQKICAgICAgcmV0dXJuIGV2YWx1YXRvcgogICAgICAgICAgLmxvd2VyTGlzdENvbnN0YW50KG5ldyBMaXN0Q29uc3RhbnQoZWxlbWVudFR5cGUsIHBhcnRzLnNpbmdsZSkpOwogICAgfQogICAgTGlzdDxFeHByZXNzaW9uPiBsaXN0cyA9IDxFeHByZXNzaW9uPltdOwogICAgZm9yIChPYmplY3QgcGFydCBpbiBwYXJ0cykgewogICAgICBpZiAocGFydCBpcyBMaXN0PENvbnN0YW50PikgewogICAgICAgIGxpc3RzLmFkZChuZXcgQ29uc3RhbnRFeHByZXNzaW9uKG5ldyBMaXN0Q29uc3RhbnQoZWxlbWVudFR5cGUsIHBhcnQpKSk7CiAgICAgIH0gZWxzZSBpZiAocGFydCBpcyBDb25zdGFudCkgewogICAgICAgIGxpc3RzLmFkZChldmFsdWF0b3IuZXh0cmFjdChwYXJ0KSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgJ05vbi1jb25zdGFudCBpbiBjb25zdGFudCBsaXN0JzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGV2YWx1YXRvci51bmV2YWx1YXRlZCgKICAgICAgICBvcmlnaW5hbCwgbmV3IExpc3RDb25jYXRlbmF0aW9uKGxpc3RzLCB0eXBlQXJndW1lbnQ6IGVsZW1lbnRUeXBlKSk7CiAgfQp9CgpjbGFzcyBTZXRDb25zdGFudEJ1aWxkZXIgZXh0ZW5kcyBfTGlzdE9yU2V0Q29uc3RhbnRCdWlsZGVyPFNldExpdGVyYWw+IHsKICBmaW5hbCBTZXQ8Q29uc3RhbnQ+IHNlZW4gPSBuZXcgU2V0PENvbnN0YW50Pi5pZGVudGl0eSgpOwoKICBTZXRDb25zdGFudEJ1aWxkZXIoCiAgICAgIEV4cHJlc3Npb24gb3JpZ2luYWwsIERhcnRUeXBlIGVsZW1lbnRUeXBlLCBDb25zdGFudEV2YWx1YXRvciBldmFsdWF0b3IpCiAgICAgIDogc3VwZXIob3JpZ2luYWwsIGVsZW1lbnRUeXBlLCBldmFsdWF0b3IpOwoKICBAb3ZlcnJpZGUKICBTZXRMaXRlcmFsIG1ha2VMaXRlcmFsKExpc3Q8RXhwcmVzc2lvbj4gZWxlbWVudHMpID0+CiAgICAgIG5ldyBTZXRMaXRlcmFsKGVsZW1lbnRzLCBpc0NvbnN0OiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRDb25zdGFudChDb25zdGFudCBjb25zdGFudCwgVHJlZU5vZGUgY29udGV4dCkgewogICAgaWYgKCFldmFsdWF0b3IuaGFzUHJpbWl0aXZlRXF1YWwoY29uc3RhbnQpKSB7CiAgICAgIGV2YWx1YXRvci5yZXBvcnQoY29udGV4dCwKICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbC53aXRoQXJndW1lbnRzKGNvbnN0YW50KSk7CiAgICB9CiAgICBpZiAoIXNlZW4uYWRkKGNvbnN0YW50KSkgewogICAgICBldmFsdWF0b3IucmVwb3J0KAogICAgICAgICAgY29udGV4dCwgdGVtcGxhdGVDb25zdEV2YWxEdXBsaWNhdGVFbGVtZW50LndpdGhBcmd1bWVudHMoY29uc3RhbnQpKTsKICAgIH0KCiAgICBMaXN0PENvbnN0YW50PiBsYXN0UGFydDsKICAgIGlmIChwYXJ0cy5sYXN0IGlzIExpc3Q8Q29uc3RhbnQ+KSB7CiAgICAgIGxhc3RQYXJ0ID0gcGFydHMubGFzdDsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnRzLmFkZChsYXN0UGFydCA9IDxDb25zdGFudD5bXSk7CiAgICB9CiAgICBsYXN0UGFydC5hZGQoZXZhbHVhdG9yLmVuc3VyZUlzU3VidHlwZShjb25zdGFudCwgZWxlbWVudFR5cGUsIGNvbnRleHQpKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50IGJ1aWxkKCkgewogICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIC8vIEZ1bGx5IGV2YWx1YXRlZAogICAgICBMaXN0PENvbnN0YW50PiBlbnRyaWVzID0gcGFydHMuc2luZ2xlOwogICAgICBTZXRDb25zdGFudCByZXN1bHQgPSBuZXcgU2V0Q29uc3RhbnQoZWxlbWVudFR5cGUsIGVudHJpZXMpOwogICAgICBpZiAoZXZhbHVhdG9yLmRlc3VnYXJTZXRzKSB7CiAgICAgICAgZmluYWwgTGlzdDxDb25zdGFudE1hcEVudHJ5PiBtYXBFbnRyaWVzID0KICAgICAgICAgICAgbmV3IExpc3Q8Q29uc3RhbnRNYXBFbnRyeT4oZW50cmllcy5sZW5ndGgpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgbWFwRW50cmllc1tpXSA9CiAgICAgICAgICAgICAgbmV3IENvbnN0YW50TWFwRW50cnkoZW50cmllc1tpXSwgZXZhbHVhdG9yLm51bGxDb25zdGFudCk7CiAgICAgICAgfQogICAgICAgIENvbnN0YW50IG1hcCA9IGV2YWx1YXRvci5sb3dlck1hcENvbnN0YW50KG5ldyBNYXBDb25zdGFudCgKICAgICAgICAgICAgZWxlbWVudFR5cGUsIGV2YWx1YXRvci50eXBlRW52aXJvbm1lbnQubnVsbFR5cGUsIG1hcEVudHJpZXMpKTsKICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmxvd2VyKAogICAgICAgICAgICByZXN1bHQsCiAgICAgICAgICAgIG5ldyBJbnN0YW5jZUNvbnN0YW50KAogICAgICAgICAgICAgICAgZXZhbHVhdG9yLnVubW9kaWZpYWJsZVNldE1hcC5lbmNsb3NpbmdDbGFzcy5yZWZlcmVuY2UsIFsKICAgICAgICAgICAgICBlbGVtZW50VHlwZQogICAgICAgICAgICBdLCA8UmVmZXJlbmNlLCBDb25zdGFudD57CiAgICAgICAgICAgICAgZXZhbHVhdG9yLnVubW9kaWZpYWJsZVNldE1hcC5yZWZlcmVuY2U6IG1hcAogICAgICAgICAgICB9KSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5sb3dlclNldENvbnN0YW50KHJlc3VsdCk7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8RXhwcmVzc2lvbj4gc2V0cyA9IDxFeHByZXNzaW9uPltdOwogICAgZm9yIChPYmplY3QgcGFydCBpbiBwYXJ0cykgewogICAgICBpZiAocGFydCBpcyBMaXN0PENvbnN0YW50PikgewogICAgICAgIHNldHMuYWRkKG5ldyBDb25zdGFudEV4cHJlc3Npb24obmV3IFNldENvbnN0YW50KGVsZW1lbnRUeXBlLCBwYXJ0KSkpOwogICAgICB9IGVsc2UgaWYgKHBhcnQgaXMgQ29uc3RhbnQpIHsKICAgICAgICBzZXRzLmFkZChldmFsdWF0b3IuZXh0cmFjdChwYXJ0KSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgJ05vbi1jb25zdGFudCBpbiBjb25zdGFudCBzZXQnOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZXZhbHVhdG9yLnVuZXZhbHVhdGVkKAogICAgICAgIG9yaWdpbmFsLCBuZXcgU2V0Q29uY2F0ZW5hdGlvbihzZXRzLCB0eXBlQXJndW1lbnQ6IGVsZW1lbnRUeXBlKSk7CiAgfQp9CgpjbGFzcyBNYXBDb25zdGFudEJ1aWxkZXIgewogIGZpbmFsIENvbnN0YW50RXZhbHVhdG9yIGV2YWx1YXRvcjsKICBmaW5hbCBFeHByZXNzaW9uIG9yaWdpbmFsOwogIGZpbmFsIERhcnRUeXBlIGtleVR5cGU7CiAgZmluYWwgRGFydFR5cGUgdmFsdWVUeXBlOwoKICAvLy8gRWFjaCBlbGVtZW50IG9mIFtwYXJ0c10gaXMgZWl0aGVyIGEgYExpc3Q8Q29uc3RhbnRNYXBFbnRyeT5gIChjb250YWluaW5nCiAgLy8vIGZ1bGx5IGV2YWx1YXRlZCBtYXAgZW50cmllcykgb3IgYSBgQ29uc3RhbnRgIChwb3RlbnRpYWxseSB1bmV2YWx1YXRlZCkuCiAgTGlzdDxPYmplY3Q+IHBhcnRzID0gPE9iamVjdD5bPENvbnN0YW50TWFwRW50cnk+W11dOwoKICBmaW5hbCBTZXQ8Q29uc3RhbnQ+IHNlZW5LZXlzID0gbmV3IFNldDxDb25zdGFudD4uaWRlbnRpdHkoKTsKCiAgTWFwQ29uc3RhbnRCdWlsZGVyKAogICAgICB0aGlzLm9yaWdpbmFsLCB0aGlzLmtleVR5cGUsIHRoaXMudmFsdWVUeXBlLCB0aGlzLmV2YWx1YXRvcik7CgogIC8vLyBBZGQgYSBtYXAgZW50cnkgdG8gdGhlIGNvbnN0YW50IG1hcCBiZWluZyBidWlsdCBieSB0aGlzIGJ1aWxkZXIKICB2b2lkIGFkZChNYXBFbnRyeSBlbGVtZW50KSB7CiAgICBDb25zdGFudCBrZXkgPSBldmFsdWF0b3IuX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihlbGVtZW50LmtleSk7CiAgICBDb25zdGFudCB2YWx1ZSA9IGV2YWx1YXRvci5fZXZhbHVhdGVTdWJleHByZXNzaW9uKGVsZW1lbnQudmFsdWUpOwogICAgaWYgKGV2YWx1YXRvci5zaG91bGRCZVVuZXZhbHVhdGVkKSB7CiAgICAgIHBhcnRzLmFkZChldmFsdWF0b3IudW5ldmFsdWF0ZWQoCiAgICAgICAgICBlbGVtZW50LmtleSwKICAgICAgICAgIG5ldyBNYXBMaXRlcmFsKAogICAgICAgICAgICAgIFtuZXcgTWFwRW50cnkoZXZhbHVhdG9yLmV4dHJhY3Qoa2V5KSwgZXZhbHVhdG9yLmV4dHJhY3QodmFsdWUpKV0sCiAgICAgICAgICAgICAgaXNDb25zdDogdHJ1ZSkpKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZENvbnN0YW50KGtleSwgdmFsdWUsIGVsZW1lbnQua2V5LCBlbGVtZW50LnZhbHVlKTsKICAgIH0KICB9CgogIHZvaWQgYWRkU3ByZWFkKEV4cHJlc3Npb24gc3ByZWFkRXhwcmVzc2lvbikgewogICAgQ29uc3RhbnQgc3ByZWFkID0KICAgICAgICBldmFsdWF0b3IudW5sb3dlcihldmFsdWF0b3IuX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihzcHJlYWRFeHByZXNzaW9uKSk7CiAgICBpZiAoZXZhbHVhdG9yLnNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgLy8gVW5ldmFsdWF0ZWQgc3ByZWFkCiAgICAgIHBhcnRzLmFkZChzcHJlYWQpOwogICAgfSBlbHNlIGlmIChzcHJlYWQgPT0gZXZhbHVhdG9yLm51bGxDb25zdGFudCkgewogICAgICAvLyBOdWxsIHNwcmVhZAogICAgICBldmFsdWF0b3IucmVwb3J0KHNwcmVhZEV4cHJlc3Npb24sIG1lc3NhZ2VDb25zdEV2YWxOdWxsVmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgLy8gRnVsbHkgZXZhbHVhdGVkIHNwcmVhZAogICAgICBpZiAoc3ByZWFkIGlzIE1hcENvbnN0YW50KSB7CiAgICAgICAgZm9yIChDb25zdGFudE1hcEVudHJ5IGVudHJ5IGluIHNwcmVhZC5lbnRyaWVzKSB7CiAgICAgICAgICBhZGRDb25zdGFudCgKICAgICAgICAgICAgICBlbnRyeS5rZXksIGVudHJ5LnZhbHVlLCBzcHJlYWRFeHByZXNzaW9uLCBzcHJlYWRFeHByZXNzaW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTm90IG1hcCBpbiBzcHJlYWQKICAgICAgICByZXR1cm4gZXZhbHVhdG9yLnJlcG9ydCgKICAgICAgICAgICAgc3ByZWFkRXhwcmVzc2lvbiwgbWVzc2FnZUNvbnN0RXZhbE5vdE1hcEluU3ByZWFkKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBhZGRDb25zdGFudChDb25zdGFudCBrZXksIENvbnN0YW50IHZhbHVlLCBUcmVlTm9kZSBrZXlDb250ZXh0LAogICAgICBUcmVlTm9kZSB2YWx1ZUNvbnRleHQpIHsKICAgIExpc3Q8Q29uc3RhbnRNYXBFbnRyeT4gbGFzdFBhcnQ7CiAgICBpZiAocGFydHMubGFzdCBpcyBMaXN0PENvbnN0YW50TWFwRW50cnk+KSB7CiAgICAgIGxhc3RQYXJ0ID0gcGFydHMubGFzdDsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnRzLmFkZChsYXN0UGFydCA9IDxDb25zdGFudE1hcEVudHJ5PltdKTsKICAgIH0KICAgIGlmICghZXZhbHVhdG9yLmhhc1ByaW1pdGl2ZUVxdWFsKGtleSkpIHsKICAgICAgZXZhbHVhdG9yLnJlcG9ydCgKICAgICAgICAgIGtleUNvbnRleHQsIHRlbXBsYXRlQ29uc3RFdmFsS2V5SW1wbGVtZW50c0VxdWFsLndpdGhBcmd1bWVudHMoa2V5KSk7CiAgICB9CiAgICBpZiAoIXNlZW5LZXlzLmFkZChrZXkpKSB7CiAgICAgIGV2YWx1YXRvci5yZXBvcnQoCiAgICAgICAgICBrZXlDb250ZXh0LCB0ZW1wbGF0ZUNvbnN0RXZhbER1cGxpY2F0ZUtleS53aXRoQXJndW1lbnRzKGtleSkpOwogICAgfQogICAgbGFzdFBhcnQuYWRkKG5ldyBDb25zdGFudE1hcEVudHJ5KAogICAgICAgIGV2YWx1YXRvci5lbnN1cmVJc1N1YnR5cGUoa2V5LCBrZXlUeXBlLCBrZXlDb250ZXh0KSwKICAgICAgICBldmFsdWF0b3IuZW5zdXJlSXNTdWJ0eXBlKHZhbHVlLCB2YWx1ZVR5cGUsIHZhbHVlQ29udGV4dCkpKTsKICB9CgogIENvbnN0YW50IGJ1aWxkKCkgewogICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIC8vIEZ1bGx5IGV2YWx1YXRlZAogICAgICByZXR1cm4gZXZhbHVhdG9yCiAgICAgICAgICAubG93ZXJNYXBDb25zdGFudChuZXcgTWFwQ29uc3RhbnQoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJ0cy5zaW5nbGUpKTsKICAgIH0KICAgIExpc3Q8RXhwcmVzc2lvbj4gbWFwcyA9IDxFeHByZXNzaW9uPltdOwogICAgZm9yIChPYmplY3QgcGFydCBpbiBwYXJ0cykgewogICAgICBpZiAocGFydCBpcyBMaXN0PENvbnN0YW50TWFwRW50cnk+KSB7CiAgICAgICAgbWFwcy5hZGQoCiAgICAgICAgICAgIG5ldyBDb25zdGFudEV4cHJlc3Npb24obmV3IE1hcENvbnN0YW50KGtleVR5cGUsIHZhbHVlVHlwZSwgcGFydCkpKTsKICAgICAgfSBlbHNlIGlmIChwYXJ0IGlzIENvbnN0YW50KSB7CiAgICAgICAgbWFwcy5hZGQoZXZhbHVhdG9yLmV4dHJhY3QocGFydCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93ICdOb24tY29uc3RhbnQgaW4gY29uc3RhbnQgbWFwJzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGV2YWx1YXRvci51bmV2YWx1YXRlZChvcmlnaW5hbCwKICAgICAgICBuZXcgTWFwQ29uY2F0ZW5hdGlvbihtYXBzLCBrZXlUeXBlOiBrZXlUeXBlLCB2YWx1ZVR5cGU6IHZhbHVlVHlwZSkpOwogIH0KfQqBEwBOTjwBIwFBJR0eAUxFLwFOASwBRyFDKSdBDSYGBAEwFk8pHBkzFUUNIB4kIioiDyUhRQgoLggGBAE5ARQCAUsXTjEBDDgwAQw6HSgdDSoGTQQBDBUdGRdLBi0hJFAlLA8vCAYiTAQCAUk7ARZOMQEMNy8BDDoyIEwGHxhPBgEdKB0NKgZNBAEMFR0ZLUIjMjgzGkgKQ0sgFCJJGiY6EQ8zCAYsISROJSsPLggGIkoEAgEbJR0aHAFPTjcBPwEWRAFGH0JGKScXGlAgDTsGBAEwFk8pHBkzFUUNICM5F0sKDx0hPwgGBAFGHyUwHQ0yBi0YTwYeGEkGJz1FBAEVHRkXUAYsISwSUCUrDy4IBitNBAIBRHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvY29uc3RhbnRfY29sbGVjdGlvbl9idWlsZGVycy5kYXJ0QXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2NvbnN0YW50cy5kYXJ0g40vLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5rZXJuZWxfY29uc3RhbnRzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBJbnZhbGlkRXhwcmVzc2lvbjsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyBMb2NhdGVkTWVzc2FnZTsKCmltcG9ydCAnLi4vbG9hZGVyLmRhcnQnIHNob3cgTG9hZGVyOwoKaW1wb3J0ICdjb25zdGFudF9ldmFsdWF0b3IuZGFydCcgc2hvdyBFcnJvclJlcG9ydGVyOwoKY2xhc3MgS2VybmVsQ29uc3RhbnRFcnJvclJlcG9ydGVyIGV4dGVuZHMgRXJyb3JSZXBvcnRlciB7CiAgZmluYWwgTG9hZGVyIGxvYWRlcjsKCiAgS2VybmVsQ29uc3RhbnRFcnJvclJlcG9ydGVyKHRoaXMubG9hZGVyKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnQoTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCkgewogICAgbG9hZGVyLmFkZFByb2JsZW0oCiAgICAgICAgbWVzc2FnZS5tZXNzYWdlT2JqZWN0LCBtZXNzYWdlLmNoYXJPZmZzZXQsIG1lc3NhZ2UubGVuZ3RoLCBtZXNzYWdlLnVyaSwKICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVwb3J0SW52YWxpZEV4cHJlc3Npb24oSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgewogICAgLy8gQXNzdW1lZCB0byBiZSBhbHJlYWR5IHJlcG9ydGVkLgogIH0KfQohAE5OPAEgATkBMgElATUBOhcBLAEMRhdQGwQBDDknBAIBOHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2NvbnN0YW50cy5kYXJ0Q3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvbWV0YWRhdGFfY29sbGVjdG9yLmRhcnSCuy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JyBzaG93IE1lbWJlciwgTWV0YWRhdGFSZXBvc2l0b3J5LCBOYW1lZE5vZGU7CgovLy8gVGhlIGNvbGxlY3RvciB0byBhZGQgdGFyZ2V0IHNwZWNpZmljIG1ldGFkYXRhIHRvLgphYnN0cmFjdCBjbGFzcyBNZXRhZGF0YUNvbGxlY3RvciB7CiAgLy8vIE1ldGFkYXRhIGlzIHJlbWVtYmVyZWQgaW4gdGhpcyByZXBvc2l0b3J5LCBzbyB0aGF0IHdoZW4gaXQgaXMgYWRkZWQKICAvLy8gdG8gYSBjb21wb25lbnQsIG1ldGFkYXRhIGlzIHNlcmlhbGl6ZWQgd2l0aCB0aGUgY29tcG9uZW50LgogIE1ldGFkYXRhUmVwb3NpdG9yeTxkeW5hbWljPiBnZXQgcmVwb3NpdG9yeTsKCiAgdm9pZCBzZXRDb25zdHJ1Y3Rvck5hbWVPZmZzZXQoTWVtYmVyIG5vZGUsIE9iamVjdCBuYW1lKTsKCiAgdm9pZCBzZXREb2N1bWVudGF0aW9uQ29tbWVudChOYW1lZE5vZGUgbm9kZSwgU3RyaW5nIGNvbW1lbnQpOwp9ChIATk48AVABNiNKQS4BOwFAAgE6cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9tZXRhZGF0YV9jb2xsZWN0b3IuZGFydDlzZGtyb290Oi9wa2cva2VybmVsL2xpYi9iaW5hcnkvbGltaXRlZF9hc3RfdG9fYmluYXJ5LmRhcnSI8S8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9iaW5hcnkvYXN0X3RvX2JpbmFyeS5kYXJ0JzsKCi8vLyBXcml0ZXMgbGlicmFyaWVzIHRoYXQgc2F0aXNmeSB0aGUgW3ByZWRpY2F0ZV0uCi8vLwovLy8gT25seSB0aGUgcmVmZXJlbmNlZCBzdWJzZXQgb2YgY2Fub25pY2FsIG5hbWVzIGlzIGluZGV4ZWQgYW5kIHdyaXR0ZW4sCi8vLyBzbyB3ZSBkb24ndCB3YXN0ZSB0aW1lIGluZGV4aW5nIGFsbCBsaWJyYXJpZXMgb2YgYSBjb21wb25lbnQsIHdoZW4gb25seQovLy8gYSB0aW55IHN1YnNldCBpcyB1c2VkLgpjbGFzcyBMaW1pdGVkQmluYXJ5UHJpbnRlciBleHRlbmRzIEJpbmFyeVByaW50ZXIgewogIGZpbmFsIExpYnJhcnlGaWx0ZXIgcHJlZGljYXRlOwoKICAvLy8gRXhjbHVkZXMgYWxsIHVyaVRvU291cmNlIGluZm9ybWF0aW9uLgogIC8vLwogIC8vLyBCeSBkZWZhdWx0IHRoZSBbcHJlZGljYXRlXSBhYm92ZSB3aWxsIG9ubHkgZXhjbHVkZSBjYW5vbmljYWwgbmFtZXMgYW5kCiAgLy8vIGtlcm5lbCBsaWJyYXJpZXMsIGJ1dCBpdCB3aWxsIHN0aWxsIGVtaXQgdGhlIHNvdXJjZXMgZm9yIGFsbCBsaWJyYXJpZXMuCiAgLy8vIGZpbHRlcmVkIGJ5IGxpYnJhcmllcyBtYXRjaGluZyBbcHJlZGljYXRlXS4KICAvLyBUT0RPKHNpZ211bmQpOiBwcm92aWRlIGEgd2F5IHRvIGZpbHRlciBzb3VyY2VzIGRpcmVjdGx5IGJhc2VkIG9uCiAgLy8gW3ByZWRpY2F0ZV0uIFRoYXQgcmVxdWlyZXMgc3BlY2lhbCBsb2dpYyB0byBoYW5kbGUgc291cmNlcyBmcm9tIHBhcnQgZmlsZXMuCiAgZmluYWwgYm9vbCBleGNsdWRlVXJpVG9Tb3VyY2U7CgogIExpbWl0ZWRCaW5hcnlQcmludGVyKAogICAgICBTaW5rPExpc3Q8aW50Pj4gc2luaywgdGhpcy5wcmVkaWNhdGUsIHRoaXMuZXhjbHVkZVVyaVRvU291cmNlLAogICAgICB7Ym9vbCBpbmNsdWRlT2Zmc2V0cyA9IHRydWV9KQogICAgICA6IHN1cGVyKHNpbmssCiAgICAgICAgICAgIGluY2x1ZGVTb3VyY2VzOiAhZXhjbHVkZVVyaVRvU291cmNlLAogICAgICAgICAgICBpbmNsdWRlT2Zmc2V0czogaW5jbHVkZU9mZnNldHMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGNvbXB1dGVDYW5vbmljYWxOYW1lcyhDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgaWYgKHByZWRpY2F0ZShsaWJyYXJ5KSkgewogICAgICAgIGNvbXBvbmVudC5yb290CiAgICAgICAgICAgIC5nZXRDaGlsZEZyb21VcmkobGlicmFyeS5pbXBvcnRVcmkpCiAgICAgICAgICAgIC5iaW5kVG8obGlicmFyeS5yZWZlcmVuY2UpOwogICAgICAgIGxpYnJhcnkuY29tcHV0ZUNhbm9uaWNhbE5hbWVzKCk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgc2hvdWxkV3JpdGVMaWJyYXJ5Q2Fub25pY2FsTmFtZXMoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICByZXR1cm4gcHJlZGljYXRlKGxpYnJhcnkpOwogIH0KCiAgdm9pZCB3cml0ZUxpYnJhcmllcyhDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudC5saWJyYXJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgTGlicmFyeSBsaWJyYXJ5ID0gY29tcG9uZW50LmxpYnJhcmllc1tpXTsKICAgICAgaWYgKHByZWRpY2F0ZShsaWJyYXJ5KSkgd3JpdGVMaWJyYXJ5Tm9kZShsaWJyYXJ5KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVOb2RlKE5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgaXMgTGlicmFyeSAmJiAhcHJlZGljYXRlKG5vZGUpKSByZXR1cm47CiAgICBzdXBlci53cml0ZU5vZGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ29tcG9uZW50SW5kZXgoQ29tcG9uZW50IGNvbXBvbmVudCwgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMpIHsKICAgIHZhciBsaWJyYXJpZXNUb1dyaXRlID0gbGlicmFyaWVzLndoZXJlKHByZWRpY2F0ZSkudG9MaXN0KCk7CiAgICBzdXBlci53cml0ZUNvbXBvbmVudEluZGV4KGNvbXBvbmVudCwgbGlicmFyaWVzVG9Xcml0ZSk7CiAgfQp9CkUATk48ASIzATMESkwbMyEBLAZNTjJGUSEBGEUkFDEtAQw0LyAXMCgpCAYEAQw7HwQBLTswOQYEAQweNRsEAQxLQDwEAgEwcGFja2FnZTprZXJuZWwvYmluYXJ5L2xpbWl0ZWRfYXN0X3RvX2JpbmFyeS5kYXJ0JXNka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL3ZlcmlmaWVyLmRhcnTAAE52Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuY2hlY2tzOwoKaW1wb3J0ICdhc3QuZGFydCc7CmltcG9ydCAndHJhbnNmb3JtYXRpb25zL2ZsYWdzLmRhcnQnOwoKdm9pZCB2ZXJpZnlDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCkgewogIFZlcmlmeWluZ1Zpc2l0b3IuY2hlY2soY29tcG9uZW50KTsKfQoKY2xhc3MgVmVyaWZpY2F0aW9uRXJyb3IgewogIGZpbmFsIFRyZWVOb2RlIGNvbnRleHQ7CgogIGZpbmFsIFRyZWVOb2RlIG5vZGU7CgogIGZpbmFsIFN0cmluZyBkZXRhaWxzOwoKICBWZXJpZmljYXRpb25FcnJvcih0aGlzLmNvbnRleHQsIHRoaXMubm9kZSwgdGhpcy5kZXRhaWxzKTsKCiAgdG9TdHJpbmcoKSB7CiAgICBMb2NhdGlvbiBsb2NhdGlvbjsKICAgIHRyeSB7CiAgICAgIGxvY2F0aW9uID0gbm9kZT8ubG9jYXRpb24gPz8gY29udGV4dD8ubG9jYXRpb247CiAgICB9IGNhdGNoIChfKSB7CiAgICAgIC8vIFRPRE8oYWhlKTogRml4IHRoZSBjb21waWxlciBpbnN0ZWFkLgogICAgfQogICAgaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKICAgICAgU3RyaW5nIGZpbGUgPSBsb2NhdGlvbi5maWxlPy50b1N0cmluZygpID8/ICIiOwogICAgICByZXR1cm4gIiRmaWxlOiR7bG9jYXRpb24ubGluZX06JHtsb2NhdGlvbi5jb2x1bW59OiBWZXJpZmljYXRpb24gZXJyb3I6IgogICAgICAgICAgIiAkZGV0YWlscyI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gIlZlcmlmaWNhdGlvbiBlcnJvcjogJGRldGFpbHNcbiIKICAgICAgICAgICJDb250ZXh0OiAnJGNvbnRleHQnLlxuIgogICAgICAgICAgIk5vZGU6ICckbm9kZScuIjsKICAgIH0KICB9Cn0KCmVudW0gVHlwZWRlZlN0YXRlIHsgRG9uZSwgQmVpbmdDaGVja2VkIH0KCi8vLyBDaGVja3MgdGhhdCBhIGtlcm5lbCBjb21wb25lbnQgaXMgd2VsbC1mb3JtZWQuCi8vLwovLy8gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSBraW5kIG9mIHR5cGUgY2hlY2tpbmcuCmNsYXNzIFZlcmlmeWluZ1Zpc2l0b3IgZXh0ZW5kcyBSZWN1cnNpdmVWaXNpdG9yPHZvaWQ+IHsKICBmaW5hbCBTZXQ8Q2xhc3M+IGNsYXNzZXMgPSBuZXcgU2V0PENsYXNzPigpOwogIGZpbmFsIFNldDxUeXBlZGVmPiB0eXBlZGVmcyA9IG5ldyBTZXQ8VHlwZWRlZj4oKTsKICBTZXQ8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnNJblNjb3BlID0gbmV3IFNldDxUeXBlUGFyYW1ldGVyPigpOwogIGZpbmFsIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVTdGFjayA9IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdOwogIGZpbmFsIE1hcDxUeXBlZGVmLCBUeXBlZGVmU3RhdGU+IHR5cGVkZWZTdGF0ZSA9IDxUeXBlZGVmLCBUeXBlZGVmU3RhdGU+e307CiAgYm9vbCBjbGFzc1R5cGVQYXJhbWV0ZXJzQXJlSW5TY29wZSA9IGZhbHNlOwoKICAvLy8gSWYgdHJ1ZSwgcmVsYXggY2VydGFpbiBjaGVja3MgZm9yICpvdXRsaW5lKiBtb2RlLiBGb3IgZXhhbXBsZSwgZG9uJ3QKICAvLy8gYXR0ZW1wdCB0byB2YWxpZGF0ZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMuCiAgYm9vbCBpc091dGxpbmUgPSBmYWxzZTsKCiAgYm9vbCBpbkNhdGNoQmxvY2sgPSBmYWxzZTsKCiAgTGlicmFyeSBjdXJyZW50TGlicmFyeTsKCiAgTWVtYmVyIGN1cnJlbnRNZW1iZXI7CgogIENsYXNzIGN1cnJlbnRDbGFzczsKCiAgVHJlZU5vZGUgY3VycmVudFBhcmVudDsKCiAgVHJlZU5vZGUgZ2V0IGNvbnRleHQgPT4gY3VycmVudE1lbWJlciA/PyBjdXJyZW50Q2xhc3M7CgogIHN0YXRpYyB2b2lkIGNoZWNrKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIGNvbXBvbmVudC5hY2NlcHQobmV3IFZlcmlmeWluZ1Zpc2l0b3IoKSk7CiAgfQoKICBkZWZhdWx0VHJlZU5vZGUoVHJlZU5vZGUgbm9kZSkgewogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICB9CgogIHByb2JsZW0oVHJlZU5vZGUgbm9kZSwgU3RyaW5nIGRldGFpbHMsIHtUcmVlTm9kZSBjb250ZXh0fSkgewogICAgY29udGV4dCA/Pz0gdGhpcy5jb250ZXh0OwogICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKGNvbnRleHQsIG5vZGUsIGRldGFpbHMpOwogIH0KCiAgVHJlZU5vZGUgZW50ZXJQYXJlbnQoVHJlZU5vZGUgbm9kZSkgewogICAgaWYgKCFpZGVudGljYWwobm9kZS5wYXJlbnQsIGN1cnJlbnRQYXJlbnQpKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBub2RlLAogICAgICAgICAgIkluY29ycmVjdCBwYXJlbnQgcG9pbnRlciBvbiAke25vZGUucnVudGltZVR5cGV9OiIKICAgICAgICAgICIgZXhwZWN0ZWQgJyR7Y3VycmVudFBhcmVudC5ydW50aW1lVHlwZX0nLCIKICAgICAgICAgICIgYnV0IGZvdW5kOiAnJHtub2RlLnBhcmVudC5ydW50aW1lVHlwZX0nLiIsCiAgICAgICAgICBjb250ZXh0OiBjdXJyZW50UGFyZW50KTsKICAgIH0KICAgIHZhciBvbGRQYXJlbnQgPSBjdXJyZW50UGFyZW50OwogICAgY3VycmVudFBhcmVudCA9IG5vZGU7CiAgICByZXR1cm4gb2xkUGFyZW50OwogIH0KCiAgdm9pZCBleGl0UGFyZW50KFRyZWVOb2RlIG9sZFBhcmVudCkgewogICAgY3VycmVudFBhcmVudCA9IG9sZFBhcmVudDsKICB9CgogIGludCBlbnRlckxvY2FsU2NvcGUoKSA9PiB2YXJpYWJsZVN0YWNrLmxlbmd0aDsKCiAgdm9pZCBleGl0TG9jYWxTY29wZShpbnQgc3RhY2tIZWlnaHQpIHsKICAgIGZvciAoaW50IGkgPSBzdGFja0hlaWdodDsgaSA8IHZhcmlhYmxlU3RhY2subGVuZ3RoOyArK2kpIHsKICAgICAgdW5kZWNsYXJlVmFyaWFibGUodmFyaWFibGVTdGFja1tpXSk7CiAgICB9CiAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHN0YWNrSGVpZ2h0OwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuKFRyZWVOb2RlIG5vZGUpIHsKICAgIHZhciBvbGRQYXJlbnQgPSBlbnRlclBhcmVudChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIGV4aXRQYXJlbnQob2xkUGFyZW50KTsKICB9CgogIHZvaWQgdmlzaXRXaXRoTG9jYWxTY29wZShUcmVlTm9kZSBub2RlKSB7CiAgICBpbnQgc3RhY2tIZWlnaHQgPSBlbnRlckxvY2FsU2NvcGUoKTsKICAgIHZpc2l0Q2hpbGRyZW4obm9kZSk7CiAgICBleGl0TG9jYWxTY29wZShzdGFja0hlaWdodCk7CiAgfQoKICB2b2lkIGRlY2xhcmVNZW1iZXIoTWVtYmVyIG1lbWJlcikgewogICAgaWYgKG1lbWJlci50cmFuc2Zvcm1lckZsYWdzICYgVHJhbnNmb3JtZXJGbGFnLnNlZW5CeVZlcmlmaWVyICE9IDApIHsKICAgICAgcHJvYmxlbShtZW1iZXIuZnVuY3Rpb24sCiAgICAgICAgICAiTWVtYmVyICckbWVtYmVyJyBoYXMgYmVlbiBkZWNsYXJlZCBtb3JlIHRoYW4gb25jZS4iKTsKICAgIH0KICAgIG1lbWJlci50cmFuc2Zvcm1lckZsYWdzIHw9IFRyYW5zZm9ybWVyRmxhZy5zZWVuQnlWZXJpZmllcjsKICB9CgogIHZvaWQgdW5kZWNsYXJlTWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKICAgIG1lbWJlci50cmFuc2Zvcm1lckZsYWdzICY9IH5UcmFuc2Zvcm1lckZsYWcuc2VlbkJ5VmVyaWZpZXI7CiAgfQoKICB2b2lkIGRlY2xhcmVWYXJpYWJsZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICBpZiAodmFyaWFibGUuZmxhZ3MgJiBWYXJpYWJsZURlY2xhcmF0aW9uLkZsYWdJblNjb3BlICE9IDApIHsKICAgICAgcHJvYmxlbSh2YXJpYWJsZSwgIlZhcmlhYmxlICckdmFyaWFibGUnIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLiIpOwogICAgfQogICAgdmFyaWFibGUuZmxhZ3MgfD0gVmFyaWFibGVEZWNsYXJhdGlvbi5GbGFnSW5TY29wZTsKICAgIHZhcmlhYmxlU3RhY2suYWRkKHZhcmlhYmxlKTsKICB9CgogIHZvaWQgdW5kZWNsYXJlVmFyaWFibGUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgdmFyaWFibGUuZmxhZ3MgJj0gflZhcmlhYmxlRGVjbGFyYXRpb24uRmxhZ0luU2NvcGU7CiAgfQoKICB2b2lkIGRlY2xhcmVUeXBlUGFyYW1ldGVycyhMaXN0PFR5cGVQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgcGFyYW1ldGVyID0gcGFyYW1ldGVyc1tpXTsKICAgICAgaWYgKHBhcmFtZXRlci5ib3VuZCA9PSBudWxsKSB7CiAgICAgICAgcHJvYmxlbSgKICAgICAgICAgICAgY3VycmVudFBhcmVudCwgIk1pc3NpbmcgYm91bmQgZm9yIHR5cGUgcGFyYW1ldGVyICckcGFyYW1ldGVyJy4iKTsKICAgICAgfQogICAgICBpZiAoIXR5cGVQYXJhbWV0ZXJzSW5TY29wZS5hZGQocGFyYW1ldGVyKSkgewogICAgICAgIHByb2JsZW0ocGFyYW1ldGVyLCAiVHlwZSBwYXJhbWV0ZXIgJyRwYXJhbWV0ZXInIHJlZGVjbGFyZWQuIik7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgdW5kZWNsYXJlVHlwZVBhcmFtZXRlcnMoTGlzdDxUeXBlUGFyYW1ldGVyPiBwYXJhbWV0ZXJzKSB7CiAgICB0eXBlUGFyYW1ldGVyc0luU2NvcGUucmVtb3ZlQWxsKHBhcmFtZXRlcnMpOwogIH0KCiAgdm9pZCBjaGVja1ZhcmlhYmxlSW5TY29wZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBUcmVlTm9kZSB3aGVyZSkgewogICAgaWYgKHZhcmlhYmxlLmZsYWdzICYgVmFyaWFibGVEZWNsYXJhdGlvbi5GbGFnSW5TY29wZSA9PSAwKSB7CiAgICAgIHByb2JsZW0od2hlcmUsICJWYXJpYWJsZSAnJHZhcmlhYmxlJyB1c2VkIG91dCBvZiBzY29wZS4iKTsKICAgIH0KICB9CgogIHZpc2l0Q29tcG9uZW50KENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIHRyeSB7CiAgICAgIGZvciAodmFyIGxpYnJhcnkgaW4gY29tcG9uZW50LmxpYnJhcmllcykgewogICAgICAgIGZvciAodmFyIGNsYXNzXyBpbiBsaWJyYXJ5LmNsYXNzZXMpIHsKICAgICAgICAgIGlmICghY2xhc3Nlcy5hZGQoY2xhc3NfKSkgewogICAgICAgICAgICBwcm9ibGVtKGNsYXNzXywgIkNsYXNzICckY2xhc3NfJyBkZWNsYXJlZCBtb3JlIHRoYW4gb25jZS4iKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgdHlwZWRlZl8gaW4gbGlicmFyeS50eXBlZGVmcykgewogICAgICAgICAgaWYgKCF0eXBlZGVmcy5hZGQodHlwZWRlZl8pKSB7CiAgICAgICAgICAgIHByb2JsZW0odHlwZWRlZl8sICJUeXBlZGVmICckdHlwZWRlZl8nIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLiIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsaWJyYXJ5Lm1lbWJlcnMuZm9yRWFjaChkZWNsYXJlTWVtYmVyKTsKICAgICAgICBmb3IgKHZhciBjbGFzc18gaW4gbGlicmFyeS5jbGFzc2VzKSB7CiAgICAgICAgICBjbGFzc18ubWVtYmVycy5mb3JFYWNoKGRlY2xhcmVNZW1iZXIpOwogICAgICAgIH0KICAgICAgfQogICAgICB2aXNpdENoaWxkcmVuKGNvbXBvbmVudCk7CiAgICB9IGZpbmFsbHkgewogICAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgICBsaWJyYXJ5Lm1lbWJlcnMuZm9yRWFjaCh1bmRlY2xhcmVNZW1iZXIpOwogICAgICAgIGZvciAodmFyIGNsYXNzXyBpbiBsaWJyYXJ5LmNsYXNzZXMpIHsKICAgICAgICAgIGNsYXNzXy5tZW1iZXJzLmZvckVhY2godW5kZWNsYXJlTWVtYmVyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyaWFibGVTdGFjay5mb3JFYWNoKHVuZGVjbGFyZVZhcmlhYmxlKTsKICAgIH0KICB9CgogIHZvaWQgdmlzaXRMaWJyYXJ5KExpYnJhcnkgbm9kZSkgewogICAgY3VycmVudExpYnJhcnkgPSBub2RlOwogICAgc3VwZXIudmlzaXRMaWJyYXJ5KG5vZGUpOwogICAgY3VycmVudExpYnJhcnkgPSBudWxsOwogIH0KCiAgdm9pZCBjaGVja1R5cGVkZWYoVHlwZWRlZiBub2RlKSB7CiAgICB2YXIgc3RhdGUgPSB0eXBlZGVmU3RhdGVbbm9kZV07CiAgICBpZiAoc3RhdGUgPT0gVHlwZWRlZlN0YXRlLkRvbmUpIHJldHVybjsKICAgIGlmIChzdGF0ZSA9PSBUeXBlZGVmU3RhdGUuQmVpbmdDaGVja2VkKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlRoZSB0eXBlZGVmICckbm9kZScgcmVmZXJzIHRvIGl0c2VsZiIsIGNvbnRleHQ6IG5vZGUpOwogICAgfQogICAgYXNzZXJ0KHN0YXRlID09IG51bGwpOwogICAgdHlwZWRlZlN0YXRlW25vZGVdID0gVHlwZWRlZlN0YXRlLkJlaW5nQ2hlY2tlZDsKICAgIHZhciBzYXZlZFR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnNJblNjb3BlOwogICAgdHlwZVBhcmFtZXRlcnNJblNjb3BlID0gbm9kZS50eXBlUGFyYW1ldGVycy50b1NldCgpOwogICAgdmFyIHNhdmVkUGFyZW50ID0gY3VycmVudFBhcmVudDsKICAgIGN1cnJlbnRQYXJlbnQgPSBub2RlOwogICAgLy8gVmlzaXQgY2hpbGRyZW4gd2l0aG91dCBjaGVja2luZyB0aGUgcGFyZW50IHBvaW50ZXIgb24gdGhlIHR5cGVkZWYgaXRzZWxmCiAgICAvLyBzaW5jZSB0aGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBhIGNvbnRleHQgb3RoZXIgdGhhbiBpdHMgdHJ1ZSBwYXJlbnQuCiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICBjdXJyZW50UGFyZW50ID0gc2F2ZWRQYXJlbnQ7CiAgICB0eXBlUGFyYW1ldGVyc0luU2NvcGUgPSBzYXZlZFR5cGVQYXJhbWV0ZXJzOwogICAgdHlwZWRlZlN0YXRlW25vZGVdID0gVHlwZWRlZlN0YXRlLkRvbmU7CiAgfQoKICB2aXNpdFR5cGVkZWYoVHlwZWRlZiBub2RlKSB7CiAgICBjaGVja1R5cGVkZWYobm9kZSk7CiAgICAvLyBFbnRlciBhbmQgZXhpdCB0aGUgbm9kZSB0byBjaGVjayB0aGUgcGFyZW50IHBvaW50ZXIgb24gdGhlIHR5cGVkZWYgbm9kZS4KICAgIGV4aXRQYXJlbnQoZW50ZXJQYXJlbnQobm9kZSkpOwogIH0KCiAgdmlzaXRGaWVsZChGaWVsZCBub2RlKSB7CiAgICBjdXJyZW50TWVtYmVyID0gbm9kZTsKICAgIHZhciBvbGRQYXJlbnQgPSBlbnRlclBhcmVudChub2RlKTsKICAgIGJvb2wgaXNUb3BMZXZlbCA9IG5vZGUucGFyZW50ID09IGN1cnJlbnRMaWJyYXJ5OwogICAgaWYgKGlzVG9wTGV2ZWwgJiYgIW5vZGUuaXNTdGF0aWMpIHsKICAgICAgcHJvYmxlbShub2RlLCAiVGhlIHRvcC1sZXZlbCBmaWVsZCAnJHtub2RlLm5hbWUubmFtZX0nIHNob3VsZCBiZSBzdGF0aWMiLAogICAgICAgICAgY29udGV4dDogbm9kZSk7CiAgICB9CiAgICBpZiAobm9kZS5pc0NvbnN0ICYmICFub2RlLmlzU3RhdGljKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlRoZSBjb25zdCBmaWVsZCAnJHtub2RlLm5hbWUubmFtZX0nIHNob3VsZCBiZSBzdGF0aWMiLAogICAgICAgICAgY29udGV4dDogbm9kZSk7CiAgICB9CiAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzQXJlSW5TY29wZSA9ICFub2RlLmlzU3RhdGljOwogICAgbm9kZS5pbml0aWFsaXplcj8uYWNjZXB0KHRoaXMpOwogICAgbm9kZS50eXBlLmFjY2VwdCh0aGlzKTsKICAgIGNsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlID0gZmFsc2U7CiAgICB2aXNpdExpc3Qobm9kZS5hbm5vdGF0aW9ucywgdGhpcyk7CiAgICBleGl0UGFyZW50KG9sZFBhcmVudCk7CiAgICBjdXJyZW50TWVtYmVyID0gbnVsbDsKICB9CgogIHZpc2l0UHJvY2VkdXJlKFByb2NlZHVyZSBub2RlKSB7CiAgICBjdXJyZW50TWVtYmVyID0gbm9kZTsKICAgIHZhciBvbGRQYXJlbnQgPSBlbnRlclBhcmVudChub2RlKTsKICAgIGNsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlID0gIW5vZGUuaXNTdGF0aWM7CiAgICBub2RlLmZ1bmN0aW9uLmFjY2VwdCh0aGlzKTsKICAgIGNsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlID0gZmFsc2U7CiAgICB2aXNpdExpc3Qobm9kZS5hbm5vdGF0aW9ucywgdGhpcyk7CiAgICBleGl0UGFyZW50KG9sZFBhcmVudCk7CiAgICBjdXJyZW50TWVtYmVyID0gbnVsbDsKICB9CgogIHZpc2l0Q29uc3RydWN0b3IoQ29uc3RydWN0b3Igbm9kZSkgewogICAgY3VycmVudE1lbWJlciA9IG5vZGU7CiAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzQXJlSW5TY29wZSA9IHRydWU7CiAgICAvLyBUaGUgY29uc3RydWN0b3IgbWVtYmVyIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50IGR1ZSB0byBwYXJhbWV0ZXJzIGJlaW5nCiAgICAvLyBpbiBzY29wZSBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdC4KICAgIHZhciBvbGRQYXJlbnQgPSBlbnRlclBhcmVudChub2RlKTsKICAgIGludCBzdGFja0hlaWdodCA9IGVudGVyTG9jYWxTY29wZSgpOwogICAgdmlzaXRDaGlsZHJlbihub2RlLmZ1bmN0aW9uKTsKICAgIHZpc2l0TGlzdChub2RlLmluaXRpYWxpemVycywgdGhpcyk7CiAgICBpZiAoIWlzT3V0bGluZSkgewogICAgICBjaGVja0luaXRpYWxpemVycyhub2RlKTsKICAgIH0KICAgIGV4aXRMb2NhbFNjb3BlKHN0YWNrSGVpZ2h0KTsKICAgIGNsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlID0gZmFsc2U7CiAgICB2aXNpdExpc3Qobm9kZS5hbm5vdGF0aW9ucywgdGhpcyk7CiAgICBleGl0UGFyZW50KG9sZFBhcmVudCk7CiAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzQXJlSW5TY29wZSA9IGZhbHNlOwogICAgY3VycmVudE1lbWJlciA9IG51bGw7CiAgfQoKICB2aXNpdENsYXNzKENsYXNzIG5vZGUpIHsKICAgIGN1cnJlbnRDbGFzcyA9IG5vZGU7CiAgICBkZWNsYXJlVHlwZVBhcmFtZXRlcnMobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB2YXIgb2xkUGFyZW50ID0gZW50ZXJQYXJlbnQobm9kZSk7CiAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzQXJlSW5TY29wZSA9IGZhbHNlOwogICAgdmlzaXRMaXN0KG5vZGUuYW5ub3RhdGlvbnMsIHRoaXMpOwogICAgY2xhc3NUeXBlUGFyYW1ldGVyc0FyZUluU2NvcGUgPSB0cnVlOwogICAgdmlzaXRMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMsIHRoaXMpOwogICAgdmlzaXRMaXN0KG5vZGUuZmllbGRzLCB0aGlzKTsKICAgIHZpc2l0TGlzdChub2RlLmNvbnN0cnVjdG9ycywgdGhpcyk7CiAgICB2aXNpdExpc3Qobm9kZS5wcm9jZWR1cmVzLCB0aGlzKTsKICAgIGV4aXRQYXJlbnQob2xkUGFyZW50KTsKICAgIHVuZGVjbGFyZVR5cGVQYXJhbWV0ZXJzKG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgY3VycmVudENsYXNzID0gbnVsbDsKICB9CgogIHZpc2l0RnVuY3Rpb25Ob2RlKEZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBkZWNsYXJlVHlwZVBhcmFtZXRlcnMobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICBib29sIHNhdmVkSW5DYXRjaEJsb2NrID0gaW5DYXRjaEJsb2NrOwogICAgaW5DYXRjaEJsb2NrID0gZmFsc2U7CiAgICB2aXNpdFdpdGhMb2NhbFNjb3BlKG5vZGUpOwogICAgaW5DYXRjaEJsb2NrID0gc2F2ZWRJbkNhdGNoQmxvY2s7CiAgICB1bmRlY2xhcmVUeXBlUGFyYW1ldGVycyhub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICB9CgogIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IG5vZGUubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChub2RlLm5hbWVkUGFyYW1ldGVyc1tpIC0gMV0uY29tcGFyZVRvKG5vZGUubmFtZWRQYXJhbWV0ZXJzW2ldKSA+PSAwKSB7CiAgICAgICAgcHJvYmxlbShjdXJyZW50UGFyZW50LAogICAgICAgICAgICAiTmFtZWQgcGFyYW1ldGVycyBhcmUgbm90IHNvcnRlZCBvbiBmdW5jdGlvbiB0eXBlICgkbm9kZSkuIik7CiAgICAgIH0KICAgIH0KICAgIGRlY2xhcmVUeXBlUGFyYW1ldGVycyhub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIGZvciAodmFyIHR5cGVQYXJhbWV0ZXIgaW4gbm9kZS50eXBlUGFyYW1ldGVycykgewogICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kPy5hY2NlcHQodGhpcyk7CiAgICB9CiAgICB2aXNpdExpc3Qobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycywgdGhpcyk7CiAgICB2aXNpdExpc3Qobm9kZS5uYW1lZFBhcmFtZXRlcnMsIHRoaXMpOwogICAgbm9kZS5yZXR1cm5UeXBlLmFjY2VwdCh0aGlzKTsKICAgIHVuZGVjbGFyZVR5cGVQYXJhbWV0ZXJzKG5vZGUudHlwZVBhcmFtZXRlcnMpOwogIH0KCiAgdmlzaXRCbG9jayhCbG9jayBub2RlKSB7CiAgICB2aXNpdFdpdGhMb2NhbFNjb3BlKG5vZGUpOwogIH0KCiAgdmlzaXRGb3JTdGF0ZW1lbnQoRm9yU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0V2l0aExvY2FsU2NvcGUobm9kZSk7CiAgfQoKICB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0V2l0aExvY2FsU2NvcGUobm9kZSk7CiAgfQoKICB2aXNpdExldChMZXQgbm9kZSkgewogICAgdmlzaXRXaXRoTG9jYWxTY29wZShub2RlKTsKICB9CgogIHZpc2l0QmxvY2tFeHByZXNzaW9uKEJsb2NrRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpbnQgc3RhY2tIZWlnaHQgPSBlbnRlckxvY2FsU2NvcGUoKTsKICAgIC8vIERvIG5vdCB2aXNpdCB0aGUgYmxvY2sgZGlyZWN0bHkgYmVjYXVzZSB0aGUgdmFsdWUgZXhwcmVzc2lvbiBuZWVkcyB0bwogICAgLy8gYmUgaW4gaXRzIHNjb3BlLgogICAgVHJlZU5vZGUgb2xkUGFyZW50ID0gZW50ZXJQYXJlbnQobm9kZSk7CiAgICBlbnRlclBhcmVudChub2RlLmJvZHkpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmJvZHkuc3RhdGVtZW50cy5sZW5ndGg7ICsraSkgewogICAgICBub2RlLmJvZHkuc3RhdGVtZW50c1tpXS5hY2NlcHQodGhpcyk7CiAgICB9CiAgICBleGl0UGFyZW50KG5vZGUpOwogICAgbm9kZS52YWx1ZS5hY2NlcHQodGhpcyk7CiAgICBleGl0UGFyZW50KG9sZFBhcmVudCk7CiAgICBleGl0TG9jYWxTY29wZShzdGFja0hlaWdodCk7CiAgfQoKICB2aXNpdENhdGNoKENhdGNoIG5vZGUpIHsKICAgIGJvb2wgc2F2ZWRJbkNhdGNoQmxvY2sgPSBpbkNhdGNoQmxvY2s7CiAgICBpbkNhdGNoQmxvY2sgPSB0cnVlOwogICAgdmlzaXRXaXRoTG9jYWxTY29wZShub2RlKTsKICAgIGluQ2F0Y2hCbG9jayA9IHNhdmVkSW5DYXRjaEJsb2NrOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRSZXRocm93KFJldGhyb3cgbm9kZSkgewogICAgaWYgKCFpbkNhdGNoQmxvY2spIHsKICAgICAgcHJvYmxlbShub2RlLCAiUmV0aHJvdyBtdXN0IGJlIGluc2lkZSBhIENhdGNoIGJsb2NrLiIpOwogICAgfQogIH0KCiAgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50OwogICAgaWYgKHBhcmVudCBpcyEgQmxvY2sgJiYKICAgICAgICAhKHBhcmVudCBpcyBDYXRjaCAmJiBwYXJlbnQuYm9keSAhPSBub2RlKSAmJgogICAgICAgICEocGFyZW50IGlzIEZ1bmN0aW9uTm9kZSAmJiBwYXJlbnQuYm9keSAhPSBub2RlKSAmJgogICAgICAgIHBhcmVudCBpcyEgRnVuY3Rpb25EZWNsYXJhdGlvbiAmJgogICAgICAgICEocGFyZW50IGlzIEZvclN0YXRlbWVudCAmJiBwYXJlbnQuYm9keSAhPSBub2RlKSAmJgogICAgICAgICEocGFyZW50IGlzIEZvckluU3RhdGVtZW50ICYmIHBhcmVudC5ib2R5ICE9IG5vZGUpICYmCiAgICAgICAgcGFyZW50IGlzISBMZXQgJiYKICAgICAgICBwYXJlbnQgaXMhIExvY2FsSW5pdGlhbGl6ZXIpIHsKICAgICAgcHJvYmxlbSgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICAiVmFyaWFibGVEZWNsYXJhdGlvbiBtdXN0IGJlIGEgZGlyZWN0IGNoaWxkIG9mIGEgQmxvY2ssICIKICAgICAgICAgICJub3QgJHtwYXJlbnQucnVudGltZVR5cGV9LiIpOwogICAgfQogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICAgIGRlY2xhcmVWYXJpYWJsZShub2RlKTsKICB9CgogIHZpc2l0VmFyaWFibGVHZXQoVmFyaWFibGVHZXQgbm9kZSkgewogICAgY2hlY2tWYXJpYWJsZUluU2NvcGUobm9kZS52YXJpYWJsZSwgbm9kZSk7CiAgICB2aXNpdENoaWxkcmVuKG5vZGUpOwogIH0KCiAgdmlzaXRWYXJpYWJsZVNldChWYXJpYWJsZVNldCBub2RlKSB7CiAgICBjaGVja1ZhcmlhYmxlSW5TY29wZShub2RlLnZhcmlhYmxlLCBub2RlKTsKICAgIHZpc2l0Q2hpbGRyZW4obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgewogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICAgIGlmIChub2RlLnRhcmdldCA9PSBudWxsKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlN0YXRpY0dldCB3aXRob3V0IHRhcmdldC4iKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSBDb25zdHJ1Y3Rvci5oYXNHZXR0ZXIgcmV0dXJucyBgZmFsc2VgIGV2ZW4gdGhvdWdoIGZhc3RhIHVzZXMgaXQKICAgIC8vIGFzIGEgZ2V0dGVyIGZvciBpbnRlcm5hbCBwdXJwb3NlczoKICAgIC8vCiAgICAvLyBGYXN0YSBpcyBsZXR0aW5nIGFsbCBjYWxsIHNpdGUgb2YgYSByZWRpcmVjdGluZyBjb25zdHJ1Y3RvciBiZSByZXNvbHZlZAogICAgLy8gdG8gdGhlIHJlYWwgdGFyZ2V0LiAgSW4gb3JkZXIgdG8gcmVzb2x2ZSBpdCwgaXQgc2VlbXMgdG8gYWRkIGEgYm9keSBpbnRvCiAgICAvLyB0aGUgcmVkaXJlY3RpbmctZmFjdG9yeSBjb25zdHJ1Y3RvciB3aGljaCBjYWNoZXMgdGhlIHRhcmdldCBjb25zdHJ1Y3Rvci4KICAgIC8vIFRoYXQgY2FjaGUgaXMgdmlhIGEgYFN0YXRpY0dldChyZWFsLWNvbnN0cnVjdG9yKWAgbm9kZSwgd2hpY2ggd2UgbWFrZQogICAgLy8gaGVyZSBwYXNzIHRoZSB2ZXJpZmllci4KICAgIGlmICghbm9kZS50YXJnZXQuaGFzR2V0dGVyICYmIG5vZGUudGFyZ2V0IGlzISBDb25zdHJ1Y3RvcikgewogICAgICBwcm9ibGVtKG5vZGUsICJTdGF0aWNHZXQgb2YgJyR7bm9kZS50YXJnZXR9JyB3aXRob3V0IGdldHRlci4iKTsKICAgIH0KICAgIGlmIChub2RlLnRhcmdldC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlN0YXRpY0dldCBvZiAnJHtub2RlLnRhcmdldH0nIHRoYXQncyBhbiBpbnN0YW5jZSBtZW1iZXIuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY1NldChTdGF0aWNTZXQgbm9kZSkgewogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICAgIGlmIChub2RlLnRhcmdldCA9PSBudWxsKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlN0YXRpY1NldCB3aXRob3V0IHRhcmdldC4iKTsKICAgIH0KICAgIGlmICghbm9kZS50YXJnZXQuaGFzU2V0dGVyKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlN0YXRpY1NldCB0byAnJHtub2RlLnRhcmdldH0nIHdpdGhvdXQgc2V0dGVyLiIpOwogICAgfQogICAgaWYgKG5vZGUudGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgcHJvYmxlbShub2RlLCAiU3RhdGljU2V0IHRvICcke25vZGUudGFyZ2V0fScgdGhhdCdzIGFuIGluc3RhbmNlIG1lbWJlci4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3RhdGljSW52b2NhdGlvbihTdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGNoZWNrVGFyZ2V0ZWRJbnZvY2F0aW9uKG5vZGUudGFyZ2V0LCBub2RlKTsKICAgIGlmIChub2RlLnRhcmdldC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIHByb2JsZW0obm9kZSwKICAgICAgICAgICJTdGF0aWNJbnZvY2F0aW9uIG9mICcke25vZGUudGFyZ2V0fScgdGhhdCdzIGFuIGluc3RhbmNlIG1lbWJlci4iKTsKICAgIH0KICAgIGlmIChub2RlLmlzQ29uc3QgJiYKICAgICAgICAoIW5vZGUudGFyZ2V0LmlzQ29uc3QgfHwKICAgICAgICAgICAgIW5vZGUudGFyZ2V0LmlzRXh0ZXJuYWwgfHwKICAgICAgICAgICAgbm9kZS50YXJnZXQua2luZCAhPSBQcm9jZWR1cmVLaW5kLkZhY3RvcnkpKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBub2RlLAogICAgICAgICAgIkNvbnN0YW50IFN0YXRpY0ludm9jYXRpb24gb2YgJyR7bm9kZS50YXJnZXR9JyB0aGF0IGlzbid0IgogICAgICAgICAgIiBhIGNvbnN0IGV4dGVybmFsIGZhY3RvcnkuIik7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrVGFyZ2V0ZWRJbnZvY2F0aW9uKE1lbWJlciB0YXJnZXQsIEludm9jYXRpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIHZpc2l0Q2hpbGRyZW4obm9kZSk7CiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKICAgICAgcHJvYmxlbShub2RlLCAiJHtub2RlLnJ1bnRpbWVUeXBlfSB3aXRob3V0IHRhcmdldC4iKTsKICAgIH0KICAgIGlmICh0YXJnZXQuZnVuY3Rpb24gPT0gbnVsbCkgewogICAgICBwcm9ibGVtKG5vZGUsICIke25vZGUucnVudGltZVR5cGV9IHdpdGhvdXQgZnVuY3Rpb24uIik7CiAgICB9CiAgICBpZiAoIWFyZUFyZ3VtZW50c0NvbXBhdGlibGUobm9kZS5hcmd1bWVudHMsIHRhcmdldC5mdW5jdGlvbikpIHsKICAgICAgcHJvYmxlbShub2RlLAogICAgICAgICAgIiR7bm9kZS5ydW50aW1lVHlwZX0gd2l0aCBpbmNvbXBhdGlibGUgYXJndW1lbnRzIGZvciAnJHt0YXJnZXR9Jy4iKTsKICAgIH0KICAgIGludCBleHBlY3RlZFR5cGVQYXJhbWV0ZXJzID0gdGFyZ2V0IGlzIENvbnN0cnVjdG9yCiAgICAgICAgPyB0YXJnZXQuZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMubGVuZ3RoCiAgICAgICAgOiB0YXJnZXQuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoOwogICAgaWYgKG5vZGUuYXJndW1lbnRzLnR5cGVzLmxlbmd0aCAhPSBleHBlY3RlZFR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBub2RlLAogICAgICAgICAgIiR7bm9kZS5ydW50aW1lVHlwZX0gd2l0aCB3cm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMiCiAgICAgICAgICAiIGZvciAnJHt0YXJnZXR9Jy4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICAgIGlmIChub2RlLnRhcmdldCA9PSBudWxsKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIkRpcmVjdFByb3BlcnR5R2V0IHdpdGhvdXQgdGFyZ2V0LiIpOwogICAgfQogICAgaWYgKCFub2RlLnRhcmdldC5oYXNHZXR0ZXIpIHsKICAgICAgcHJvYmxlbShub2RlLCAiRGlyZWN0UHJvcGVydHlHZXQgb2YgJyR7bm9kZS50YXJnZXR9JyB3aXRob3V0IGdldHRlci4iKTsKICAgIH0KICAgIGlmICghbm9kZS50YXJnZXQuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICBwcm9ibGVtKAogICAgICAgICAgbm9kZSwKICAgICAgICAgICJEaXJlY3RQcm9wZXJ0eUdldCBvZiAnJHtub2RlLnRhcmdldH0nIHRoYXQgaXNuJ3QgYW4iCiAgICAgICAgICAiIGluc3RhbmNlIG1lbWJlci4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0RGlyZWN0UHJvcGVydHlTZXQoRGlyZWN0UHJvcGVydHlTZXQgbm9kZSkgewogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICAgIGlmIChub2RlLnRhcmdldCA9PSBudWxsKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIkRpcmVjdFByb3BlcnR5U2V0IHdpdGhvdXQgdGFyZ2V0LiIpOwogICAgfQogICAgaWYgKCFub2RlLnRhcmdldC5oYXNTZXR0ZXIpIHsKICAgICAgcHJvYmxlbShub2RlLCAiRGlyZWN0UHJvcGVydHlTZXQgb2YgJyR7bm9kZS50YXJnZXR9JyB3aXRob3V0IHNldHRlci4iKTsKICAgIH0KICAgIGlmICghbm9kZS50YXJnZXQuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICBwcm9ibGVtKG5vZGUsICJEaXJlY3RQcm9wZXJ0eVNldCBvZiAnJHtub2RlLnRhcmdldH0nIHRoYXQgaXMgc3RhdGljLiIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKERpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgY2hlY2tUYXJnZXRlZEludm9jYXRpb24obm9kZS50YXJnZXQsIG5vZGUpOwogICAgaWYgKG5vZGUucmVjZWl2ZXIgPT0gbnVsbCkgewogICAgICBwcm9ibGVtKG5vZGUsICJEaXJlY3RNZXRob2RJbnZvY2F0aW9uIHdpdGhvdXQgcmVjZWl2ZXIuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgY2hlY2tUYXJnZXRlZEludm9jYXRpb24obm9kZS50YXJnZXQsIG5vZGUpOwogICAgaWYgKG5vZGUudGFyZ2V0LmVuY2xvc2luZ0NsYXNzLmlzQWJzdHJhY3QpIHsKICAgICAgcHJvYmxlbShub2RlLCAiQ29uc3RydWN0b3JJbnZvY2F0aW9uIG9mIGFic3RyYWN0IGNsYXNzLiIpOwogICAgfQogICAgaWYgKG5vZGUuaXNDb25zdCAmJiAhbm9kZS50YXJnZXQuaXNDb25zdCkgewogICAgICBwcm9ibGVtKAogICAgICAgICAgbm9kZSwKICAgICAgICAgICJDb25zdGFudCBDb25zdHJ1Y3Rvckludm9jYXRpb24gZm8gJyR7bm9kZS50YXJnZXR9JyB0aGF0IgogICAgICAgICAgIiBpc24ndCBjb25zdC4iKTsKICAgIH0KICB9CgogIGJvb2wgYXJlQXJndW1lbnRzQ29tcGF0aWJsZShBcmd1bWVudHMgYXJndW1lbnRzLCBGdW5jdGlvbk5vZGUgZnVuY3Rpb24pIHsKICAgIGlmIChhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPCBmdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPiBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgbmFtZWRMb29wOgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubmFtZWQubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIGFyZ3VtZW50ID0gYXJndW1lbnRzLm5hbWVkW2ldOwogICAgICBTdHJpbmcgbmFtZSA9IGFyZ3VtZW50Lm5hbWU7CiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsgKytqKSB7CiAgICAgICAgaWYgKGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVyc1tqXS5uYW1lID09IG5hbWUpIGNvbnRpbnVlIG5hbWVkTG9vcDsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQoQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKG5vZGUudGFyZ2V0ID09IG51bGwpIHsKICAgICAgcHJvYmxlbShub2RlLCAiTm8gdGFyZ2V0LiIpOwogICAgfSBlbHNlIGlmIChub2RlLnRhcmdldC5wYXJlbnQgPT0gbnVsbCkgewogICAgICBwcm9ibGVtKG5vZGUsICJUYXJnZXQgaGFzIG5vIHBhcmVudC4iKTsKICAgIH0gZWxzZSB7CiAgICAgIFN3aXRjaFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBub2RlLnRhcmdldC5wYXJlbnQ7CiAgICAgIGZvciAoU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlIGluIHN0YXRlbWVudC5jYXNlcykgewogICAgICAgIGlmIChzd2l0Y2hDYXNlID09IG5vZGUudGFyZ2V0KSByZXR1cm47CiAgICAgIH0KICAgICAgcHJvYmxlbShub2RlLCAiU3dpdGNoIGNhc2UgaXNuJ3QgY2hpbGQgb2YgcGFyZW50LiIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgZGVmYXVsdE1lbWJlclJlZmVyZW5jZShNZW1iZXIgbm9kZSkgewogICAgaWYgKG5vZGUudHJhbnNmb3JtZXJGbGFncyAmIFRyYW5zZm9ybWVyRmxhZy5zZWVuQnlWZXJpZmllciA9PSAwKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBub2RlLCAiRGFuZ2xpbmcgcmVmZXJlbmNlIHRvICckbm9kZScsIHBhcmVudCBpczogJyR7bm9kZS5wYXJlbnR9Jy4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2xhc3NSZWZlcmVuY2UoQ2xhc3Mgbm9kZSkgewogICAgaWYgKCFjbGFzc2VzLmNvbnRhaW5zKG5vZGUpKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBub2RlLCAiRGFuZ2xpbmcgcmVmZXJlbmNlIHRvICckbm9kZScsIHBhcmVudCBpczogJyR7bm9kZS5wYXJlbnR9Jy4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHlwZWRlZlJlZmVyZW5jZShUeXBlZGVmIG5vZGUpIHsKICAgIGlmICghdHlwZWRlZnMuY29udGFpbnMobm9kZSkpIHsKICAgICAgcHJvYmxlbSgKICAgICAgICAgIG5vZGUsICJEYW5nbGluZyByZWZlcmVuY2UgdG8gJyRub2RlJywgcGFyZW50IGlzOiAnJHtub2RlLnBhcmVudH0nIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIHZhciBwYXJhbWV0ZXIgPSBub2RlLnBhcmFtZXRlcjsKICAgIGlmICghdHlwZVBhcmFtZXRlcnNJblNjb3BlLmNvbnRhaW5zKHBhcmFtZXRlcikpIHsKICAgICAgcHJvYmxlbSgKICAgICAgICAgIGN1cnJlbnRQYXJlbnQsCiAgICAgICAgICAiVHlwZSBwYXJhbWV0ZXIgJyRwYXJhbWV0ZXInIHJlZmVyZW5jZWQgb3V0IG9mIgogICAgICAgICAgIiBzY29wZSwgcGFyZW50IGlzOiAnJHtwYXJhbWV0ZXIucGFyZW50fScuIik7CiAgICB9CiAgICBpZiAocGFyYW1ldGVyLnBhcmVudCBpcyBDbGFzcyAmJiAhY2xhc3NUeXBlUGFyYW1ldGVyc0FyZUluU2NvcGUpIHsKICAgICAgcHJvYmxlbSgKICAgICAgICAgIGN1cnJlbnRQYXJlbnQsCiAgICAgICAgICAiVHlwZSBwYXJhbWV0ZXIgJyRwYXJhbWV0ZXInIHJlZmVyZW5jZWQgZnJvbSIKICAgICAgICAgICIgc3RhdGljIGNvbnRleHQsIHBhcmVudCBpczogJyR7cGFyYW1ldGVyLnBhcmVudH0nLiIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gbm9kZS5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBjdXJyZW50UGFyZW50LAogICAgICAgICAgIlR5cGUgJG5vZGUgcHJvdmlkZXMgJHtub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RofSIKICAgICAgICAgICIgdHlwZSBhcmd1bWVudHMgYnV0IHRoZSBjbGFzcyBkZWNsYXJlcyIKICAgICAgICAgICIgJHtub2RlLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGh9IHBhcmFtZXRlcnMuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUpIHsKICAgIGNoZWNrVHlwZWRlZihub2RlLnR5cGVkZWZOb2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG5vZGUudHlwZWRlZk5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBjdXJyZW50UGFyZW50LAogICAgICAgICAgIlRoZSB0eXBlZGVmIHR5cGUgJG5vZGUgcHJvdmlkZXMgJHtub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RofSIKICAgICAgICAgICIgdHlwZSBhcmd1bWVudHMgYnV0IHRoZSB0eXBlZGVmIGRlY2xhcmVzIgogICAgICAgICAgIiAke25vZGUudHlwZWRlZk5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RofSBwYXJhbWV0ZXJzLiIpOwogICAgfQogIH0KfQoKY2xhc3MgQ2hlY2tQYXJlbnRQb2ludGVycyBleHRlbmRzIFZpc2l0b3IgewogIHN0YXRpYyB2b2lkIGNoZWNrKFRyZWVOb2RlIG5vZGUpIHsKICAgIG5vZGUuYWNjZXB0KG5ldyBDaGVja1BhcmVudFBvaW50ZXJzKG5vZGUucGFyZW50KSk7CiAgfQoKICBUcmVlTm9kZSBwYXJlbnQ7CgogIENoZWNrUGFyZW50UG9pbnRlcnMoW3RoaXMucGFyZW50XSk7CgogIGRlZmF1bHRUcmVlTm9kZShUcmVlTm9kZSBub2RlKSB7CiAgICBpZiAobm9kZS5wYXJlbnQgIT0gcGFyZW50KSB7CiAgICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcigKICAgICAgICAgIHBhcmVudCwKICAgICAgICAgIG5vZGUsCiAgICAgICAgICAiUGFyZW50IHBvaW50ZXIgb24gJyR7bm9kZS5ydW50aW1lVHlwZX0nICIKICAgICAgICAgICJpcyAnJHtub2RlLnBhcmVudC5ydW50aW1lVHlwZX0nICIKICAgICAgICAgICJidXQgc2hvdWxkIGJlICcke3BhcmVudC5ydW50aW1lVHlwZX0nLiIpOwogICAgfQogICAgdmFyIG9sZFBhcmVudCA9IHBhcmVudDsKICAgIHBhcmVudCA9IG5vZGU7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICBwYXJlbnQgPSBvbGRQYXJlbnQ7CiAgfQp9Cgp2b2lkIGNoZWNrSW5pdGlhbGl6ZXJzKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB7CiAgLy8gVE9ETyhhaGUpOiBJJ2xsIGFkZCBtb3JlIGhlcmUgaW4gb3RoZXIgQ0xzLgp9CoKTAE5OPBcBEyUBLCUCARoaARcBGAE8AQ8XCjYSLgYcNU4XDS4jHAYEAgEpATMENTgvNEdLTS4BSzQaAR0BGgEYARYBGgE5ASsuBAEjGQQBPx45BAEoMg8QPTY3IwYjGhYEASgfBAExASk/KwYoBAEmJx4bBAEsKRkhBAEmSR9BBj8EAShABAE3QUoGNyEEATk4BAE/MiUlEU4IM0cIBgQBQTEEAUxBQQYEASgKMS4mSQwKMSlPDAowLjEKCCAQMTIuMwoIMAYEASQbHhsEASQkLC5MBhs0NTklGlBLHiExLAQBHxhQIwQBGxonNShQGgYqTBoGNCQcKycbGgQBIxonNCArJxsaBAEnGipOKScpIigWHwYhKycbKxoEARsZMCcrJyoqIigmGzIZBAEpMCsaHyYyBAEpPFEfSggGMDUpBjArIjIEARsfBAEpHwQBLR8EARcfBAEvKU0YLBw8LAYWHRshBAEbKxkfJgQBDB8ZPgYEATceHDU8Kjw+GicPEEQpBhkbBAEnLxkEAScvGQQBDCMZHzIGUSoHT1BQTR9BRgYoUQYEAQwjGR8yBiJGBihRBgQBDDEwKBROBhghJzoPEEUpBgQBSxkaPAYjPgZEFE8GNzYxQQ8QRCAGBAEMMxkfOgYiTgYpDxBAIAYEAQwzGR86BiJOBilOBgQBDD0wIUEGBAEMOzAxQQYwDxBEHAYEAUxJFAZOFAYPNykjQkoIFAYRBAEMPx8jLS4NNjcvCDsGBAEMKEcPUAYEAQwkIw9QBgQBDCgkD08GBAEMMyQ2Dxk6OAZHDxk4QQYEAQwrHk0PGT0zQwYEAQwnJB5PDxlJNUUGBAIBLCU3BAETASYBIyEjEhA1LTUGHBMeGAQCATIxAgEccGFja2FnZTprZXJuZWwvdmVyaWZpZXIuZGFydERzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWEuZGFydJClLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRS5tZCBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEYXJ0VHlwZVZpc2l0b3IsCiAgICAgICAgRGFydFR5cGVWaXNpdG9yMSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBUeXBlZGVmVHlwZSwKICAgICAgICBWaXNpdG9yOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9pbXBvcnRfdGFibGUuZGFydCcgc2hvdyBJbXBvcnRUYWJsZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGV4dC9hc3RfdG9fdGV4dC5kYXJ0JwogICAgc2hvdyBBbm5vdGF0b3IsIE5hbWVTeXN0ZW0sIFByaW50ZXIsIGdsb2JhbERlYnVnZ2luZ05hbWVzOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuc3VwcG9ydGVkOwoKLy8vIERldGVybWluZXMgd2hldGhlciBhIHR5cGUgc2NoZW1hIGNvbnRhaW5zIGA/YCBzb21ld2hlcmUgaW5zaWRlIGl0Lgpib29sIGlzS25vd24oRGFydFR5cGUgc2NoZW1hKSA9PiBzY2hlbWEuYWNjZXB0KG5ldyBfSXNLbm93blZpc2l0b3IoKSk7CgovLy8gQ29udmVydHMgYSBbRGFydFR5cGVdIHRvIGEgc3RyaW5nLCByZXByZXNlbnRpbmcgdGhlIHVua25vd24gdHlwZSBhcyBgP2AuClN0cmluZyB0eXBlU2NoZW1hVG9TdHJpbmcoRGFydFR5cGUgc2NoZW1hKSB7CiAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBuZXcgVHlwZVNjaGVtYVByaW50ZXIoYnVmZmVyLCBzeW50aGV0aWNOYW1lczogZ2xvYmFsRGVidWdnaW5nTmFtZXMpCiAgICAgIC53cml0ZU5vZGUoc2NoZW1hKTsKICByZXR1cm4gJyRidWZmZXInOwp9CgovLy8gRXh0ZW5zaW9uIG9mIFtQcmludGVyXSB0aGF0IHJlcHJlc2VudHMgdGhlIHVua25vd24gdHlwZSBhcyBgP2AuCmNsYXNzIFR5cGVTY2hlbWFQcmludGVyIGV4dGVuZHMgUHJpbnRlciBpbXBsZW1lbnRzIFR5cGVTY2hlbWFWaXNpdG9yPE51bGw+IHsKICBUeXBlU2NoZW1hUHJpbnRlcihTdHJpbmdTaW5rIHNpbmssCiAgICAgIHtOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzLAogICAgICBib29sIHNob3dFeHRlcm5hbCwKICAgICAgYm9vbCBzaG93T2Zmc2V0czogZmFsc2UsCiAgICAgIEltcG9ydFRhYmxlIGltcG9ydFRhYmxlLAogICAgICBBbm5vdGF0b3IgYW5ub3RhdG9yfSkKICAgICAgOiBzdXBlcihzaW5rLAogICAgICAgICAgICBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMsCiAgICAgICAgICAgIHNob3dFeHRlcm5hbDogc2hvd0V4dGVybmFsLAogICAgICAgICAgICBzaG93T2Zmc2V0czogc2hvd09mZnNldHMsCiAgICAgICAgICAgIGltcG9ydFRhYmxlOiBpbXBvcnRUYWJsZSwKICAgICAgICAgICAgYW5ub3RhdG9yOiBhbm5vdGF0b3IpOwoKICBAb3ZlcnJpZGUKICB2aXNpdFVua25vd25UeXBlKFVua25vd25UeXBlIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnPycpOwogIH0KfQoKLy8vIEV4dGVuc2lvbiBvZiBbRGFydFR5cGVWaXNpdG9yXSB3aGljaCBjYW4gdmlzaXQgW1Vua25vd25UeXBlXS4KY2xhc3MgVHlwZVNjaGVtYVZpc2l0b3I8Uj4gZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8Uj4gewogIC8vLyBDYWxsZWQgd2hlbiBbVW5rbm93blR5cGVdIGlzIHZpc2l0ZWQuCiAgUiB2aXNpdFVua25vd25UeXBlKFVua25vd25UeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKfQoKLy8vIFRoZSB1bmtub3duIHR5cGUgKGRlbm90ZWQgYD9gKSBpcyBhbiBvYmplY3Qgd2hpY2ggY2FuIGFwcGVhciBhbnl3aGVyZSB0aGF0Ci8vLyBhIHR5cGUgaXMgZXhwZWN0ZWQuICBJdCByZXByZXNlbnRzIGEgY29tcG9uZW50IG9mIGEgdHlwZSB3aGljaCBoYXMgbm90IHlldAovLy8gYmVlbiBmaXhlZCBieSBpbmZlcmVuY2UuCi8vLwovLy8gVGhlIHVua25vd24gdHlwZSBjYW5ub3QgYXBwZWFyIGluIHByb2dyYW1zIG9yIGluIGZpbmFsIGluZmVycmVkIHR5cGVzOiBpdCBpcwovLy8gcHVyZWx5IHBhcnQgb2YgdGhlIGxvY2FsIGluZmVyZW5jZSBwcm9jZXNzLgpjbGFzcyBVbmtub3duVHlwZSBleHRlbmRzIERhcnRUeXBlIHsKICBAb3ZlcnJpZGUKICBnZXQgbnVsbGFiaWxpdHkgPT4gdW5zdXBwb3J0ZWQoIm51bGxhYmlsaXR5IiwgLTEsIG51bGwpOwoKICBjb25zdCBVbmtub3duVHlwZSgpOwoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgLy8gVGhpcyBjbGFzcyBkb2Vzbid0IGhhdmUgYW55IGZpZWxkcyBzbyBhbGwgaW5zdGFuY2VzIG9mIGBVbmtub3duVHlwZWAgYXJlCiAgICAvLyBlcXVhbC4KICAgIHJldHVybiBvdGhlciBpcyBVbmtub3duVHlwZTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChEYXJ0VHlwZVZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgaWYgKHYgaXMgVHlwZVNjaGVtYVZpc2l0b3I8ZHluYW1pYz4pIHsKICAgICAgcmV0dXJuIHYudmlzaXRVbmtub3duVHlwZSh0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vdGU6IGluIHByaW5jaXBsZSBpdCBzZWVtcyBsaWtlIHRoaXMgc2hvdWxkIHRocm93LCBzaW5jZSBhbnkgdmlzaXRvcgogICAgICAvLyB0aGF0IG9wZXJhdGVzIG9uIGEgdHlwZSBzY2hlbWEgb3VnaHQgdG8gaW5oZXJpdCBmcm9tIFR5cGVTY2hlbWFWaXNpdG9yLgogICAgICAvLyBIb3dldmVyLCB0aGF0IHdvdWxkIG1ha2UgaXQgaW1wb3NzaWJsZSB0byB1c2UgdG9TdHJpbmcoKSBvbiBhbnkgdHlwZQogICAgICAvLyBzY2hlbWEsIHNpbmNlIHRvU3RyaW5nKCkgdXNlcyB0aGUga2VybmVsJ3MgUHJpbnRlciB2aXNpdG9yLCB3aGljaCBjYW4ndAogICAgICAvLyBwb3NzaWJseSBpbmhlcml0IGZyb20gVHlwZVNjaGVtYVZpc2l0b3Igc2luY2UgaXQncyBpbnNpZGUga2VybmVsLgogICAgICByZXR1cm4gdi5kZWZhdWx0RGFydFR5cGUodGhpcyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQxKERhcnRUeXBlVmlzaXRvcjE8ZHluYW1pYywgZHluYW1pYz4gdiwgYXJnKSA9PgogICAgICB2LmRlZmF1bHREYXJ0VHlwZSh0aGlzLCBhcmcpOwoKICBAb3ZlcnJpZGUKICB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikge30KfQoKLy8vIFZpc2l0b3IgdGhhdCBjb21wdXRlcyBbaXNLbm93bl0uCmNsYXNzIF9Jc0tub3duVmlzaXRvciBleHRlbmRzIFR5cGVTY2hlbWFWaXNpdG9yPGJvb2w+IHsKICBAb3ZlcnJpZGUKICBib29sIGRlZmF1bHREYXJ0VHlwZShEYXJ0VHlwZSBub2RlKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBpZiAoIW5vZGUucmV0dXJuVHlwZS5hY2NlcHQodGhpcykpIHJldHVybiBmYWxzZTsKICAgIGZvciAodmFyIHBhcmFtZXRlclR5cGUgaW4gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBpZiAoIXBhcmFtZXRlclR5cGUuYWNjZXB0KHRoaXMpKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmb3IgKHZhciBuYW1lZFBhcmFtZXRlclR5cGUgaW4gbm9kZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgaWYgKCFuYW1lZFBhcmFtZXRlclR5cGUudHlwZS5hY2NlcHQodGhpcykpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICBmb3IgKHZhciB0eXBlQXJndW1lbnQgaW4gbm9kZS50eXBlQXJndW1lbnRzKSB7CiAgICAgIGlmICghdHlwZUFyZ3VtZW50LmFjY2VwdCh0aGlzKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgZm9yICh2YXIgdHlwZUFyZ3VtZW50IGluIG5vZGUudHlwZUFyZ3VtZW50cykgewogICAgICBpZiAoIXR5cGVBcmd1bWVudC5hY2NlcHQodGhpcykpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFVua25vd25UeXBlKFVua25vd25UeXBlIG5vZGUpID0+IGZhbHNlOwp9CoCJAE1OPwEhCRIZGhYXFREBPAEuPwEsAUdHAU0tLEYaFAIBRE0lIhkfHxwULCgmJiMBDCcUBAIBQjgsQQIBT08dBFEwJQw7ARcBI1AOIQQBDCcrJw1PUU5RSyYGBAEMOCQBDCcCASU4DC8BDC41OzUGOz8GEQQBDDAzNAYRBAEMLDM0BhEEAQw0AgE7cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hLmRhcnRCc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfc2hhZG93X2FzdC5kYXJ0wAD03C8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gVGhpcyBmaWxlIGRlY2xhcmVzIGEgInNoYWRvdyBoaWVyYXJjaHkiIG9mIGNvbmNyZXRlIGNsYXNzZXMgd2hpY2ggZXh0ZW5kCi8vLyB0aGUga2VybmVsIGNsYXNzIGhpZXJhcmNoeSwgYWRkaW5nIG1ldGhvZHMgYW5kIGZpZWxkcyBuZWVkZWQgYnkgdGhlCi8vLyBCb2R5QnVpbGRlci4KLy8vCi8vLyBJbnN0YW5jZXMgb2YgdGhlc2UgY2xhc3NlcyBtYXkgYmUgY3JlYXRlZCB1c2luZyB0aGUgZmFjdG9yeSBtZXRob2RzIGluCi8vLyBgYXN0X2ZhY3RvcnkuZGFydGAuCi8vLwovLy8gTm90ZSB0aGF0IHRoZXNlIGNsYXNzZXMgcmVwcmVzZW50IHRoZSBEYXJ0IGxhbmd1YWdlIHByaW9yIHRvIGRlc3VnYXJpbmcuCi8vLyBXaGVuIGEgc2luZ2xlIERhcnQgY29uc3RydWN0IGRlc3VnYXJzIHRvIGEgdHJlZSBjb250YWluaW5nIG11bHRpcGxlIGtlcm5lbAovLy8gQVNUIG5vZGVzLCB0aGUgc2hhZG93IGNsYXNzIGV4dGVuZHMgdGhlIGtlcm5lbCBvYmplY3QgYXQgdGhlIHRvcCBvZiB0aGUKLy8vIGRlc3VnYXJlZCB0cmVlLgovLy8KLy8vIFRoaXMgbWVhbnMgdGhhdCBpbiBzb21lIGNhc2VzIG11bHRpcGxlIHNoYWRvdyBjbGFzc2VzIG1heSBleHRlbmQgdGhlIHNhbWUKLy8vIGtlcm5lbCBjbGFzcywgYmVjYXVzZSBtdWx0aXBsZSBjb25zdHJ1Y3RzIGluIERhcnQgbWF5IGRlc3VnYXIgdG8gYSB0cmVlCi8vLyB3aXRoIHRoZSBzYW1lIGtpbmQgb2Ygcm9vdCBub2RlLgoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBrZXJuZWwgc2hvdyBFeHByZXNzaW9uLCBJbml0aWFsaXplcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb247CgppbXBvcnQgJy4uLy4uL2Jhc2UvaW5zdHJ1bWVudGF0aW9uLmRhcnQnCiAgICBzaG93CiAgICAgICAgSW5zdHJ1bWVudGF0aW9uLAogICAgICAgIEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyLAogICAgICAgIEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZSwKICAgICAgICBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGVBcmdzOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIG1lc3NhZ2VDYW50RGlzYW1iaWd1YXRlQW1iaWd1b3VzSW5mb3JtYXRpb24sCiAgICAgICAgbWVzc2FnZUNhbnREaXNhbWJpZ3VhdGVOb3RFbm91Z2hJbmZvcm1hdGlvbiwKICAgICAgICBtZXNzYWdlTm9uTnVsbEF3YXJlU3ByZWFkSXNOdWxsLAogICAgICAgIG1lc3NhZ2VTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZUNhdXNlLAogICAgICAgIG1lc3NhZ2VWb2lkRXhwcmVzc2lvbiwKICAgICAgICBub0xlbmd0aCwKICAgICAgICB0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5LAogICAgICAgIHRlbXBsYXRlRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlLAogICAgICAgIHRlbXBsYXRlRm9ySW5Mb29wVHlwZU5vdEl0ZXJhYmxlLAogICAgICAgIHRlbXBsYXRlSW50ZWdlckxpdGVyYWxJc091dE9mUmFuZ2UsCiAgICAgICAgdGVtcGxhdGVTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoLAogICAgICAgIHRlbXBsYXRlU3ByZWFkTWFwRW50cnlFbGVtZW50S2V5VHlwZU1pc21hdGNoLAogICAgICAgIHRlbXBsYXRlU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2gsCiAgICAgICAgdGVtcGxhdGVTcHJlYWRNYXBFbnRyeVR5cGVNaXNtYXRjaCwKICAgICAgICB0ZW1wbGF0ZVNwcmVhZFR5cGVNaXNtYXRjaCwKICAgICAgICB0ZW1wbGF0ZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlLAogICAgICAgIHRlbXBsYXRlV2ViTGl0ZXJhbENhbm5vdEJlUmVwcmVzZW50ZWRFeGFjdGx5OwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IGdldEZpbGVVcmksIHVuaGFuZGxlZCwgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUNsYXNzQnVpbGRlcjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvaW5mZXJlbmNlX2hlbHBlci5kYXJ0JyBzaG93IEluZmVyZW5jZUhlbHBlcjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcmVuY2VfZW5naW5lLmRhcnQnCiAgICBzaG93IEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNOb25Db3ZhcmlhbnRseSwgVHlwZUluZmVyZW5jZUVuZ2luZTsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcnJlci5kYXJ0JwogICAgc2hvdyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0LCBUeXBlSW5mZXJyZXIsIFR5cGVJbmZlcnJlckltcGw7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfcHJvbW90aW9uLmRhcnQnCiAgICBzaG93IFR5cGVQcm9tb3RlciwgVHlwZVByb21vdGVySW1wbCwgVHlwZVByb21vdGlvbkZhY3QsIFR5cGVQcm9tb3Rpb25TY29wZTsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWEuZGFydCcgc2hvdyBVbmtub3duVHlwZTsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWFfZWxpbWluYXRpb24uZGFydCcgc2hvdyBncmVhdGVzdENsb3N1cmU7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hX2Vudmlyb25tZW50LmRhcnQnCiAgICBzaG93IFR5cGVTY2hlbWFFbnZpcm9ubWVudCwgZ2V0UG9zaXRpb25hbFBhcmFtZXRlclR5cGU7CgppbXBvcnQgJ2JvZHlfYnVpbGRlci5kYXJ0JyBzaG93IGNvbWJpbmVTdGF0ZW1lbnRzOwoKaW1wb3J0ICdjb2xsZWN0aW9ucy5kYXJ0JwogICAgc2hvdwogICAgICAgIENvbnRyb2xGbG93TWFwRW50cnksCiAgICAgICAgRm9yRWxlbWVudCwKICAgICAgICBGb3JJbkVsZW1lbnQsCiAgICAgICAgRm9ySW5NYXBFbnRyeSwKICAgICAgICBGb3JNYXBFbnRyeSwKICAgICAgICBJZkVsZW1lbnQsCiAgICAgICAgSWZNYXBFbnRyeSwKICAgICAgICBTcHJlYWRFbGVtZW50LAogICAgICAgIFNwcmVhZE1hcEVudHJ5LAogICAgICAgIGNvbnZlcnRUb0VsZW1lbnQ7CgppbXBvcnQgJ2V4cHJlc3Npb25fZ2VuZXJhdG9yLmRhcnQnIHNob3cgbWFrZUxldDsKCmltcG9ydCAnaW1wbGljaXRfdHlwZV9hcmd1bWVudC5kYXJ0JyBzaG93IEltcGxpY2l0VHlwZUFyZ3VtZW50OwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JyBzaG93IEtlcm5lbExpYnJhcnlCdWlsZGVyOwoKcGFydCAiaW5mZXJlbmNlX3Zpc2l0b3IuZGFydCI7CnBhcnQgImluZmVycmVkX3R5cGVfdmlzaXRvci5kYXJ0IjsKCi8vLyBDb21wdXRlcyB0aGUgcmV0dXJuIHR5cGUgb2YgYSAocG9zc2libHkgZmFjdG9yeSkgY29uc3RydWN0b3IuCkludGVyZmFjZVR5cGUgY29tcHV0ZUNvbnN0cnVjdG9yUmV0dXJuVHlwZShNZW1iZXIgY29uc3RydWN0b3IpIHsKICBpZiAoY29uc3RydWN0b3IgaXMgQ29uc3RydWN0b3IpIHsKICAgIHJldHVybiBjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzcy50aGlzVHlwZTsKICB9IGVsc2UgewogICAgcmV0dXJuIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLnJldHVyblR5cGU7CiAgfQp9CgpMaXN0PERhcnRUeXBlPiBnZXRFeHBsaWNpdFR5cGVBcmd1bWVudHMoQXJndW1lbnRzIGFyZ3VtZW50cykgewogIGlmIChhcmd1bWVudHMgaXMgQXJndW1lbnRzSnVkZ21lbnQpIHsKICAgIHJldHVybiBhcmd1bWVudHMuX2hhc0V4cGxpY2l0VHlwZUFyZ3VtZW50cyA/IGFyZ3VtZW50cy50eXBlcyA6IG51bGw7CiAgfSBlbHNlIHsKICAgIC8vIFRoaXMgY29kZSBwYXRoIHNob3VsZCBvbmx5IGJlIHRha2VuIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlcmUgYXJlIG5vCiAgICAvLyB0eXBlIGFyZ3VtZW50cyBhdCBhbGwsIGUuZy4gY2FsbGluZyBhIHVzZXItZGVmaW5hYmxlIG9wZXJhdG9yLgogICAgYXNzZXJ0KGFyZ3VtZW50cy50eXBlcy5pc0VtcHR5KTsKICAgIHJldHVybiBudWxsOwogIH0KfQoKLy8vIEluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIGNsYXNzIGR1cmluZyB0eXBlIGluZmVyZW5jZS4KY2xhc3MgQ2xhc3NJbmZlcmVuY2VJbmZvIHsKICAvLy8gVGhlIGJ1aWxkZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MuCiAgZmluYWwgU291cmNlQ2xhc3NCdWlsZGVyIGJ1aWxkZXI7CgogIC8vLyBUaGUgdmlzaXRvciBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBnaXZlbiB0eXBlIG1ha2VzIGNvdmFyaWFudCB1c2Ugb2Ygb25lIG9mCiAgLy8vIHRoZSBjbGFzcydzIGdlbmVyaWMgcGFyYW1ldGVycywgYW5kIHRoZXJlZm9yZSByZXF1aXJlcyBjb3ZhcmlhbnQgY2hlY2tzLgogIEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNOb25Db3ZhcmlhbnRseSBuZWVkc0NoZWNrVmlzaXRvcjsKCiAgLy8vIEdldHRlcnMgYW5kIG1ldGhvZHMgaW4gdGhlIGNsYXNzJ3MgQVBJLiAgTWF5IGluY2x1ZGUgZm9yd2FyZGluZyBub2Rlcy4KICBmaW5hbCBnZXR0ZXJzQW5kTWV0aG9kcyA9IDxNZW1iZXI+W107CgogIC8vLyBTZXR0ZXJzIGluIHRoZSBjbGFzcydzIEFQSS4gIE1heSBpbmNsdWRlIGZvcndhcmRpbmcgbm9kZXMuCiAgZmluYWwgc2V0dGVycyA9IDxNZW1iZXI+W107CgogIENsYXNzSW5mZXJlbmNlSW5mbyh0aGlzLmJ1aWxkZXIpOwp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBzZXQgb2YgaW52b2NhdGlvbiBhcmd1bWVudHMuCmNsYXNzIEFyZ3VtZW50c0p1ZGdtZW50IGV4dGVuZHMgQXJndW1lbnRzIHsKICBib29sIF9oYXNFeHBsaWNpdFR5cGVBcmd1bWVudHM7CgogIExpc3Q8RXhwcmVzc2lvbj4gZ2V0IHBvc2l0aW9uYWxKdWRnbWVudHMgPT4gcG9zaXRpb25hbC5jYXN0KCk7CgogIEFyZ3VtZW50c0p1ZGdtZW50KExpc3Q8RXhwcmVzc2lvbj4gcG9zaXRpb25hbCwKICAgICAge0xpc3Q8RGFydFR5cGU+IHR5cGVzLCBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gbmFtZWR9KQogICAgICA6IF9oYXNFeHBsaWNpdFR5cGVBcmd1bWVudHMgPSB0eXBlcyAhPSBudWxsICYmIHR5cGVzLmlzTm90RW1wdHksCiAgICAgICAgc3VwZXIocG9zaXRpb25hbCwgdHlwZXM6IHR5cGVzLCBuYW1lZDogbmFtZWQpOwoKICBzdGF0aWMgdm9pZCBzZXROb25JbmZlcnJhYmxlQXJndW1lbnRUeXBlcygKICAgICAgQXJndW1lbnRzSnVkZ21lbnQgYXJndW1lbnRzLCBMaXN0PERhcnRUeXBlPiB0eXBlcykgewogICAgYXJndW1lbnRzLnR5cGVzLmNsZWFyKCk7CiAgICBhcmd1bWVudHMudHlwZXMuYWRkQWxsKHR5cGVzKTsKICAgIGFyZ3VtZW50cy5faGFzRXhwbGljaXRUeXBlQXJndW1lbnRzID0gdHJ1ZTsKICB9CgogIHN0YXRpYyB2b2lkIHJlbW92ZU5vbkluZmVycmFibGVBcmd1bWVudFR5cGVzKEFyZ3VtZW50c0p1ZGdtZW50IGFyZ3VtZW50cykgewogICAgYXJndW1lbnRzLnR5cGVzLmNsZWFyKCk7CiAgICBhcmd1bWVudHMuX2hhc0V4cGxpY2l0VHlwZUFyZ3VtZW50cyA9IGZhbHNlOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGFzc2VydCBpbml0aWFsaXplciBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgQXNzZXJ0SW5pdGlhbGl6ZXJKdWRnbWVudCBleHRlbmRzIEFzc2VydEluaXRpYWxpemVyCiAgICBpbXBsZW1lbnRzIEluaXRpYWxpemVySnVkZ21lbnQgewogIEFzc2VydEluaXRpYWxpemVySnVkZ21lbnQoQXNzZXJ0U3RhdGVtZW50IHN0YXRlbWVudCkgOiBzdXBlcihzdGF0ZW1lbnQpOwoKICBBc3NlcnRTdGF0ZW1lbnRKdWRnbWVudCBnZXQganVkZ21lbnQgPT4gc3RhdGVtZW50OwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QXNzZXJ0SW5pdGlhbGl6ZXJKdWRnbWVudCh0aGlzKTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhbiBhc3NlcnRpb24gc3RhdGVtZW50IGluIGtlcm5lbCBmb3JtLgpjbGFzcyBBc3NlcnRTdGF0ZW1lbnRKdWRnbWVudCBleHRlbmRzIEFzc2VydFN0YXRlbWVudAogICAgaW1wbGVtZW50cyBTdGF0ZW1lbnRKdWRnbWVudCB7CiAgQXNzZXJ0U3RhdGVtZW50SnVkZ21lbnQoRXhwcmVzc2lvbiBjb25kaXRpb24sCiAgICAgIHtFeHByZXNzaW9uIG1lc3NhZ2UsIGludCBjb25kaXRpb25TdGFydE9mZnNldCwgaW50IGNvbmRpdGlvbkVuZE9mZnNldH0pCiAgICAgIDogc3VwZXIoY29uZGl0aW9uLAogICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLAogICAgICAgICAgICBjb25kaXRpb25TdGFydE9mZnNldDogY29uZGl0aW9uU3RhcnRPZmZzZXQsCiAgICAgICAgICAgIGNvbmRpdGlvbkVuZE9mZnNldDogY29uZGl0aW9uRW5kT2Zmc2V0KTsKCiAgRXhwcmVzc2lvbiBnZXQgY29uZGl0aW9uSnVkZ21lbnQgPT4gY29uZGl0aW9uOwoKICBFeHByZXNzaW9uIGdldCBtZXNzYWdlSnVkZ21lbnQgPT4gbWVzc2FnZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEFzc2VydFN0YXRlbWVudEp1ZGdtZW50KHRoaXMpOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgc3RhdGVtZW50IGJsb2NrIGluIGtlcm5lbCBmb3JtLgpjbGFzcyBCbG9ja0p1ZGdtZW50IGV4dGVuZHMgQmxvY2sgaW1wbGVtZW50cyBTdGF0ZW1lbnRKdWRnbWVudCB7CiAgQmxvY2tKdWRnbWVudChMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cykgOiBzdXBlcihzdGF0ZW1lbnRzKTsKCiAgTGlzdDxTdGF0ZW1lbnQ+IGdldCBqdWRnbWVudHMgPT4gc3RhdGVtZW50czsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEJsb2NrSnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBjYXNjYWRlIGV4cHJlc3Npb24uCi8vLwovLy8gQSBjYXNjYWRlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gYGEuLmIoKS4uYygpYCBpcyByZXByZXNlbnRlZCBhcyB0aGUga2VybmVsCi8vLyBleHByZXNzaW9uOgovLy8KLy8vICAgICBsZXQgdiA9IGEgaW4KLy8vICAgICAgICAgbGV0IF8gPSB2LmIoKSBpbgovLy8gICAgICAgICAgICAgbGV0IF8gPSB2LmMoKSBpbgovLy8gICAgICAgICAgICAgICAgIHYKLy8vCi8vLyBJbiB0aGUgZG9jdW1lbnRhdGlvbiB0aGF0IGZvbGxvd3MsIGB2YCBpcyByZWZlcnJlZCB0byBhcyB0aGUgImNhc2NhZGUKLy8vIHZhcmlhYmxlIi0tdGhpcyBpcyB0aGUgdmFyaWFibGUgdGhhdCByZW1lbWJlcnMgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uCi8vLyBwcmVjZWRpbmcgdGhlIGZpcnN0IGAuLmAgd2hpbGUgdGhlIGNhc2NhZGVzIGFyZSBiZWluZyBldmFsdWF0ZWQuCi8vLwovLy8gQWZ0ZXIgY29uc3RydWN0aW5nIGEgW0Nhc2NhZGVKdWRnbWVudF0sIHRoZSBjYWxsZXIgc2hvdWxkCi8vLyBjYWxsIFtmaW5hbGl6ZV0gd2l0aCBhbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgZXhwcmVzc2lvbiBhZnRlciB0aGUKLy8vIGAuLmAuICBJZiBhIGZ1cnRoZXIgYC4uYCBmb2xsb3dzIHRoYXQgZXhwcmVzc2lvbiwgdGhlIGNhbGxlciBzaG91bGQgY2FsbAovLy8gW2V4dGVuZF0gZm9sbG93ZWQgYnkgW2ZpbmFsaXplXSBmb3IgZWFjaCBzdWJzZXF1ZW50IGNhc2NhZGUuCmNsYXNzIENhc2NhZGVKdWRnbWVudCBleHRlbmRzIExldCBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICAvLy8gUG9pbnRlciB0byB0aGUgbGFzdCAibGV0IiBleHByZXNzaW9uIGluIHRoZSBjYXNjYWRlLgogIExldCBuZXh0Q2FzY2FkZTsKCiAgLy8vIENyZWF0ZXMgYSBbQ2FzY2FkZUp1ZGdtZW50XSB1c2luZyBbdmFyaWFibGVdIGFzIHRoZSBjYXNjYWRlCiAgLy8vIHZhcmlhYmxlLiAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IFt2YXJpYWJsZV0ncwogIC8vLyBpbml0aWFsaXplciBpcyB0aGUgZXhwcmVzc2lvbiBwcmVjZWRpbmcgdGhlIGZpcnN0IGAuLmAgb2YgdGhlIGNhc2NhZGUKICAvLy8gZXhwcmVzc2lvbi4KICBDYXNjYWRlSnVkZ21lbnQoVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50IHZhcmlhYmxlKQogICAgICA6IHN1cGVyKAogICAgICAgICAgICB2YXJpYWJsZSwKICAgICAgICAgICAgbWFrZUxldChuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZShuZXcgX1VuZmluaXNoZWRDYXNjYWRlKCkpLAogICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlKSkpIHsKICAgIG5leHRDYXNjYWRlID0gYm9keTsKICB9CgogIEV4cHJlc3Npb24gZ2V0IHRhcmdldEp1ZGdtZW50ID0+IHZhcmlhYmxlLmluaXRpYWxpemVyOwoKICBJdGVyYWJsZTxFeHByZXNzaW9uPiBnZXQgY2FzY2FkZUp1ZGdtZW50cyBzeW5jKiB7CiAgICBMZXQgc2VjdGlvbiA9IGJvZHk7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICB5aWVsZCBzZWN0aW9uLnZhcmlhYmxlLmluaXRpYWxpemVyOwogICAgICBpZiAoc2VjdGlvbi5ib2R5IGlzISBMZXQpIGJyZWFrOwogICAgICBzZWN0aW9uID0gc2VjdGlvbi5ib2R5OwogICAgfQogIH0KCiAgLy8vIEFkZHMgYSBuZXcgdW5maW5hbGl6ZWQgc2VjdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBjYXNjYWRlLiAgU2hvdWxkIGJlCiAgLy8vIGNhbGxlZCBhZnRlciB0aGUgcHJldmlvdXMgY2FzY2FkZSBzZWN0aW9uIGhhcyBiZWVuIGZpbmFsaXplZC4KICB2b2lkIGV4dGVuZCgpIHsKICAgIGFzc2VydChuZXh0Q2FzY2FkZS52YXJpYWJsZS5pbml0aWFsaXplciBpcyEgX1VuZmluaXNoZWRDYXNjYWRlKTsKICAgIExldCBuZXdDYXNjYWRlID0gbWFrZUxldCgKICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZShuZXcgX1VuZmluaXNoZWRDYXNjYWRlKCkpLAogICAgICAgIG5leHRDYXNjYWRlLmJvZHkpOwogICAgbmV4dENhc2NhZGUuYm9keSA9IG5ld0Nhc2NhZGU7CiAgICBuZXdDYXNjYWRlLnBhcmVudCA9IG5leHRDYXNjYWRlOwogICAgbmV4dENhc2NhZGUgPSBuZXdDYXNjYWRlOwogIH0KCiAgLy8vIEZpbmFsaXplcyB0aGUgbGFzdCBjYXNjYWRlIHNlY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gW2V4cHJlc3Npb25dLgogIHZvaWQgZmluYWxpemUoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICBhc3NlcnQobmV4dENhc2NhZGUudmFyaWFibGUuaW5pdGlhbGl6ZXIgaXMgX1VuZmluaXNoZWRDYXNjYWRlKTsKICAgIG5leHRDYXNjYWRlLnZhcmlhYmxlLmluaXRpYWxpemVyID0gZXhwcmVzc2lvbjsKICAgIGV4cHJlc3Npb24ucGFyZW50ID0gbmV4dENhc2NhZGUudmFyaWFibGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdENhc2NhZGVKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQWJzdHJhY3Qgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBjb21wbGV4IGFzc2lnbm1lbnQgaW4ga2VybmVsIGZvcm0uCi8vLwovLy8gU2luY2UgdGhlcmUgYXJlIG1hbnkgZm9ybXMgYSBjb21wbGV4IGFzc2lnbm1lbnQgbWlnaHQgaGF2ZSBiZWVuIGRlc3VnYXJlZAovLy8gdG8sIHRoaXMgY2xhc3Mgd3JhcHMgdGhlIGRlc3VnYXJlZCBhc3NpZ25tZW50IHJhdGhlciB0aGFuIGV4dGVuZGluZyBpdC4KLy8vCi8vLyBUT0RPKHBhdWxiZXJyeSk6IG9uY2Ugd2Uga25vdyBleGFjdGx5IHdoYXQgY29uc3RpdHV0ZXMgYSAiY29tcGxleAovLy8gYXNzaWdubWVudCIsIGRvY3VtZW50IGl0IGhlcmUuCmFic3RyYWN0IGNsYXNzIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgZXh0ZW5kcyBTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQgewogIC8vLyBJbiBhIGNvbXBvdW5kIGFzc2lnbm1lbnQsIHRoZSBleHByZXNzaW9uIHRoYXQgcmVhZHMgdGhlIG9sZCB2YWx1ZSwgb3IKICAvLy8gYG51bGxgIGlmIHRoaXMgaXMgbm90IGEgY29tcG91bmQgYXNzaWdubWVudC4KICBFeHByZXNzaW9uIHJlYWQ7CgogIC8vLyBUaGUgZXhwcmVzc2lvbiBhcHBlYXJpbmcgb24gdGhlIFJIUyBvZiB0aGUgYXNzaWdubWVudC4KICBmaW5hbCBFeHByZXNzaW9uIHJoczsKCiAgLy8vIFRoZSBleHByZXNzaW9uIHRoYXQgcGVyZm9ybXMgdGhlIHdyaXRlIChlLmcuIGBhLltdPShiLCBhLltdKGIpICsgMSlgIGluCiAgLy8vIGArK2FbYl1gKS4KICBFeHByZXNzaW9uIHdyaXRlOwoKICAvLy8gSW4gYSBjb21wb3VuZCBhc3NpZ25tZW50IHdpdGhvdXQgc2hvcnRjdXQgc2VtYW50aWNzLCB0aGUgZXhwcmVzc2lvbiB0aGF0CiAgLy8vIGNvbWJpbmVzIHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMsIG9yIGBudWxsYCBpZiB0aGlzIGlzIG5vdCBhIGNvbXBvdW5kCiAgLy8vIGFzc2lnbm1lbnQuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCBpbiBhIGNvbXBvdW5kIGFzc2lnbm1lbnQgd2l0aCBzaG9ydGN1dCBzZW1hbnRpY3MsIHRoaXMgaXMgbm90CiAgLy8vIHVzZWQ7IFtudWxsQXdhcmVDb21iaW5lcl0gaXMgdXNlZCBpbnN0ZWFkLgogIE1ldGhvZEludm9jYXRpb24gY29tYmluZXI7CgogIC8vLyBJbiBhIGNvbXBvdW5kIGFzc2lnbm1lbnQgd2l0aCBzaG9ydGN1dCBzZW1hbnRpY3MsIHRoZSBjb25kaXRpb25hbAogIC8vLyBleHByZXNzaW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBhc3NpZ25tZW50IG9jY3Vycy4KICAvLy8KICAvLy8gTm90ZSB0aGF0IGluIGEgY29tcG91bmQgYXNzaWdubWVudCB3aXRob3V0IHNob3J0Y3V0IHNlbWFudGljcywgdGhpcyBpcyBub3QKICAvLy8gdXNlZDsgW2NvbWJpbmVyXSBpcyB1c2VkIGluc3RlYWQuCiAgQ29uZGl0aW9uYWxFeHByZXNzaW9uIG51bGxBd2FyZUNvbWJpbmVyOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gYXJvc2UgZnJvbSBhIHBvc3QtaW5jcmVtZW50IG9yCiAgLy8vIHBvc3QtZGVjcmVtZW50LgogIGJvb2wgaXNQb3N0SW5jRGVjID0gZmFsc2U7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZXhwcmVzc2lvbiBhcm9zZSBmcm9tIGEgcHJlLWluY3JlbWVudCBvcgogIC8vLyBwcmUtZGVjcmVtZW50LgogIGJvb2wgaXNQcmVJbmNEZWMgPSBmYWxzZTsKCiAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudC5fKHRoaXMucmhzKSA6IHN1cGVyLl8obnVsbCk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHZhciBwYXJ0cyA9IF9nZXRUb1N0cmluZ1BhcnRzKCk7CiAgICByZXR1cm4gJyR7cnVudGltZVR5cGV9KCR7cGFydHMuam9pbignLCAnKX0pJzsKICB9CgogIExpc3Q8U3RyaW5nPiBfZ2V0VG9TdHJpbmdQYXJ0cygpIHsKICAgIExpc3Q8U3RyaW5nPiBwYXJ0cyA9IFtdOwogICAgaWYgKGRlc3VnYXJlZCAhPSBudWxsKSBwYXJ0cy5hZGQoJ2Rlc3VnYXJlZD0kZGVzdWdhcmVkJyk7CiAgICBpZiAocmVhZCAhPSBudWxsKSBwYXJ0cy5hZGQoJ3JlYWQ9JHJlYWQnKTsKICAgIGlmIChyaHMgIT0gbnVsbCkgcGFydHMuYWRkKCdyaHM9JHJocycpOwogICAgaWYgKHdyaXRlICE9IG51bGwpIHBhcnRzLmFkZCgnd3JpdGU9JHdyaXRlJyk7CiAgICBpZiAoY29tYmluZXIgIT0gbnVsbCkgcGFydHMuYWRkKCdjb21iaW5lcj0kY29tYmluZXInKTsKICAgIGlmIChudWxsQXdhcmVDb21iaW5lciAhPSBudWxsKSB7CiAgICAgIHBhcnRzLmFkZCgnbnVsbEF3YXJlQ29tYmluZXI9JG51bGxBd2FyZUNvbWJpbmVyJyk7CiAgICB9CiAgICBpZiAoaXNQb3N0SW5jRGVjKSBwYXJ0cy5hZGQoJ2lzUG9zdEluY0RlYz10cnVlJyk7CiAgICBpZiAoaXNQcmVJbmNEZWMpIHBhcnRzLmFkZCgnaXNQcmVJbmNEZWM9dHJ1ZScpOwogICAgcmV0dXJuIHBhcnRzOwogIH0KCiAgX0NvbXBsZXhBc3NpZ25tZW50SW5mZXJlbmNlUmVzdWx0IF9pbmZlclJocygKICAgICAgU2hhZG93VHlwZUluZmVycmVyIGluZmVycmVyLCBEYXJ0VHlwZSByZWFkVHlwZSwgRGFydFR5cGUgd3JpdGVDb250ZXh0KSB7CiAgICBhc3NlcnQod3JpdGVDb250ZXh0ICE9IG51bGwpOwogICAgaWYgKHJlYWRUeXBlIGlzIFZvaWRUeXBlICYmCiAgICAgICAgKGNvbWJpbmVyICE9IG51bGwgfHwgbnVsbEF3YXJlQ29tYmluZXIgIT0gbnVsbCkpIHsKICAgICAgaW5mZXJyZXIuaGVscGVyCiAgICAgICAgICA/LmFkZFByb2JsZW0obWVzc2FnZVZvaWRFeHByZXNzaW9uLCByZWFkLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKTsKICAgIH0KICAgIHZhciB3cml0ZU9mZnNldCA9IHdyaXRlID09IG51bGwgPyAtMSA6IHdyaXRlLmZpbGVPZmZzZXQ7CiAgICBQcm9jZWR1cmUgY29tYmluZXJNZW1iZXI7CiAgICBEYXJ0VHlwZSBjb21iaW5lZFR5cGU7CiAgICBpZiAoY29tYmluZXIgIT0gbnVsbCkgewogICAgICBib29sIGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvciA9IGZhbHNlOwogICAgICBjb21iaW5lck1lbWJlciA9IGluZmVycmVyLmZpbmRNZXRob2RJbnZvY2F0aW9uTWVtYmVyKHJlYWRUeXBlLCBjb21iaW5lciwKICAgICAgICAgIGluc3RydW1lbnRlZDogZmFsc2UpOwogICAgICBpZiAoY29tYmluZXJNZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgICAgIC5pc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3JBbmRUeXBlKGNvbWJpbmVyTWVtYmVyLCByZWFkVHlwZSk7CiAgICAgIH0KICAgICAgRGFydFR5cGUgcmhzVHlwZTsKICAgICAgdmFyIGNvbWJpbmVyVHlwZSA9IGluZmVycmVyLmdldENhbGxlZUZ1bmN0aW9uVHlwZSgKICAgICAgICAgIGluZmVycmVyLmdldENhbGxlZVR5cGUoY29tYmluZXJNZW1iZXIsIHJlYWRUeXBlKSwgZmFsc2UpOwogICAgICBpZiAoaXNQcmVJbmNEZWMgfHwgaXNQb3N0SW5jRGVjKSB7CiAgICAgICAgcmhzVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5pbnRDbGFzcy5yYXdUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEl0J3Mgbm90IG5lY2Vzc2FyeSB0byBjYWxsIF9zdG9yZUxldFR5cGUgZm9yIFtyaHNdIGJlY2F1c2UgdGhlIFJIUwogICAgICAgIC8vIGlzIGFsd2F5cyBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGNvbWJpbmVyOyBpdCdzIG5ldmVyIHN0b3JlZCBpbiBhCiAgICAgICAgLy8gdGVtcG9yYXJ5IHZhcmlhYmxlIGZpcnN0LgogICAgICAgIGFzc2VydChpZGVudGljYWwoY29tYmluZXIuYXJndW1lbnRzLnBvc2l0aW9uYWwuZmlyc3QsIHJocykpOwogICAgICAgIC8vIEFuYWx5emVyIHVzZXMgYSBudWxsIGNvbnRleHQgZm9yIHRoZSBSSFMgaGVyZS4KICAgICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGltcHJvdmUgb24gdGhpcy4KICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24ocmhzLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlKTsKICAgICAgICByaHNUeXBlID0gZ2V0SW5mZXJyZWRUeXBlKHJocywgaW5mZXJyZXIpOwogICAgICAgIC8vIERvIG5vdCB1c2UgcmhzIGFmdGVyIHRoaXMgcG9pbnQgYmVjYXVzZSBpdCBtYXkgYmUgYSBTaGFkb3cgbm9kZQogICAgICAgIC8vIHRoYXQgaGFzIGJlZW4gcmVwbGFjZWQgaW4gdGhlIHRyZWUgd2l0aCBpdHMgZGVzdWdhcmluZy4KICAgICAgICB2YXIgZXhwZWN0ZWRUeXBlID0gZ2V0UG9zaXRpb25hbFBhcmFtZXRlclR5cGUoY29tYmluZXJUeXBlLCAwKTsKICAgICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKGV4cGVjdGVkVHlwZSwgcmhzVHlwZSwKICAgICAgICAgICAgY29tYmluZXIuYXJndW1lbnRzLnBvc2l0aW9uYWwuZmlyc3QsIGNvbWJpbmVyLmZpbGVPZmZzZXQpOwogICAgICB9CiAgICAgIGlmIChpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3IpIHsKICAgICAgICBjb21iaW5lZFR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgLmdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljKHJlYWRUeXBlLCByaHNUeXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb21iaW5lZFR5cGUgPSBjb21iaW5lclR5cGUucmV0dXJuVHlwZTsKICAgICAgfQogICAgICB2YXIgY2hlY2tLaW5kID0gaW5mZXJyZXIucHJlQ2hlY2tJbnZvY2F0aW9uQ29udHJhdmFyaWFuY2UocmVhZCwgcmVhZFR5cGUsCiAgICAgICAgICBjb21iaW5lck1lbWJlciwgY29tYmluZXIsIGNvbWJpbmVyLmFyZ3VtZW50cywgY29tYmluZXIpOwogICAgICB2YXIgcmVwbGFjZWRDb21iaW5lciA9IGluZmVycmVyLmhhbmRsZUludm9jYXRpb25Db250cmF2YXJpYW5jZSgKICAgICAgICAgIGNoZWNrS2luZCwKICAgICAgICAgIGNvbWJpbmVyLAogICAgICAgICAgY29tYmluZXIuYXJndW1lbnRzLAogICAgICAgICAgY29tYmluZXIsCiAgICAgICAgICBjb21iaW5lZFR5cGUsCiAgICAgICAgICBjb21iaW5lclR5cGUsCiAgICAgICAgICBjb21iaW5lci5maWxlT2Zmc2V0KTsKICAgICAgdmFyIHJlcGxhY2VkQ29tYmluZXIyID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICAgIHdyaXRlQ29udGV4dCwgY29tYmluZWRUeXBlLCByZXBsYWNlZENvbWJpbmVyLCB3cml0ZU9mZnNldCk7CiAgICAgIGlmIChyZXBsYWNlZENvbWJpbmVyMiAhPSBudWxsKSB7CiAgICAgICAgcmVwbGFjZWRDb21iaW5lciA9IHJlcGxhY2VkQ29tYmluZXIyOwogICAgICB9CiAgICAgIF9zdG9yZUxldFR5cGUoaW5mZXJyZXIsIHJlcGxhY2VkQ29tYmluZXIsIGNvbWJpbmVkVHlwZSk7CiAgICB9IGVsc2UgewogICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24ocmhzLCB3cml0ZUNvbnRleHQgPz8gY29uc3QgVW5rbm93blR5cGUoKSwgdHJ1ZSwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICB2YXIgcmhzVHlwZSA9IGdldEluZmVycmVkVHlwZShyaHMsIGluZmVycmVyKTsKICAgICAgdmFyIHJlcGxhY2VkUmhzID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICAgIHdyaXRlQ29udGV4dCwgcmhzVHlwZSwgcmhzLCB3cml0ZU9mZnNldCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHdyaXRlQ29udGV4dCBpcyBWb2lkVHlwZSk7CiAgICAgIF9zdG9yZUxldFR5cGUoaW5mZXJyZXIsIHJlcGxhY2VkUmhzID8/IHJocywgcmhzVHlwZSk7CiAgICAgIGlmIChudWxsQXdhcmVDb21iaW5lciAhPSBudWxsKSB7CiAgICAgICAgTWV0aG9kSW52b2NhdGlvbiBlcXVhbHNJbnZvY2F0aW9uID0gbnVsbEF3YXJlQ29tYmluZXIuY29uZGl0aW9uOwogICAgICAgIGluZmVycmVyLmZpbmRNZXRob2RJbnZvY2F0aW9uTWVtYmVyKAogICAgICAgICAgICBncmVhdGVzdENsb3N1cmUoaW5mZXJyZXIuY29yZVR5cGVzLCB3cml0ZUNvbnRleHQpLCBlcXVhbHNJbnZvY2F0aW9uLAogICAgICAgICAgICBpbnN0cnVtZW50ZWQ6IGZhbHNlKTsKICAgICAgICAvLyBOb3RlOiB0aGUgY2FzZSBvZiByZWFkVHlwZT1udWxsIG9ubHkgaGFwcGVucyBmb3IgZXJyb25lb3VzIGNvZGUuCiAgICAgICAgY29tYmluZWRUeXBlID0gcmVhZFR5cGUgPT0gbnVsbAogICAgICAgICAgICA/IHJoc1R5cGUKICAgICAgICAgICAgOiBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgICAgIC5nZXRTdGFuZGFyZFVwcGVyQm91bmQocmVhZFR5cGUsIHJoc1R5cGUpOwogICAgICAgIG51bGxBd2FyZUNvbWJpbmVyLnN0YXRpY1R5cGUgPSBjb21iaW5lZFR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29tYmluZWRUeXBlID0gcmhzVHlwZTsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMgaXMgSW5kZXhBc3NpZ25tZW50SnVkZ21lbnQpIHsKICAgICAgX3N0b3JlTGV0VHlwZShpbmZlcnJlciwgd3JpdGUsIGNvbnN0IFZvaWRUeXBlKCkpOwogICAgfSBlbHNlIHsKICAgICAgX3N0b3JlTGV0VHlwZShpbmZlcnJlciwgd3JpdGUsIGNvbWJpbmVkVHlwZSk7CiAgICB9CiAgICBpbmZlcnJlZFR5cGUgPQogICAgICAgIGlzUG9zdEluY0RlYyA/IChyZWFkVHlwZSA/PyBjb25zdCBEeW5hbWljVHlwZSgpKSA6IGNvbWJpbmVkVHlwZTsKICAgIHJldHVybiBuZXcgX0NvbXBsZXhBc3NpZ25tZW50SW5mZXJlbmNlUmVzdWx0KGNvbWJpbmVyTWVtYmVyKTsKICB9Cn0KCi8vLyBBYnN0cmFjdCBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIGNvbXBsZXggYXNzaWdubWVudCBpbnZvbHZpbmcgYQovLy8gcmVjZWl2ZXIuCmFic3RyYWN0IGNsYXNzIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnRXaXRoUmVjZWl2ZXIKICAgIGV4dGVuZHMgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCB7CiAgLy8vIFRoZSByZWNlaXZlciBvZiB0aGUgYXNzaWdubWVudCB0YXJnZXQgKGUuZy4gYGFgIGluIGBhW2JdID0gY2ApLgogIGZpbmFsIEV4cHJlc3Npb24gcmVjZWl2ZXI7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGFzc2lnbm1lbnQgdXNlcyBgc3VwZXJgLgogIGZpbmFsIGJvb2wgaXNTdXBlcjsKCiAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudFdpdGhSZWNlaXZlci5fKAogICAgICB0aGlzLnJlY2VpdmVyLCBFeHByZXNzaW9uIHJocywgdGhpcy5pc1N1cGVyKQogICAgICA6IHN1cGVyLl8ocmhzKTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxTdHJpbmc+IF9nZXRUb1N0cmluZ1BhcnRzKCkgewogICAgdmFyIHBhcnRzID0gc3VwZXIuX2dldFRvU3RyaW5nUGFydHMoKTsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSBwYXJ0cy5hZGQoJ3JlY2VpdmVyPSRyZWNlaXZlcicpOwogICAgaWYgKGlzU3VwZXIpIHBhcnRzLmFkZCgnaXNTdXBlcj10cnVlJyk7CiAgICByZXR1cm4gcGFydHM7CiAgfQoKICBEYXJ0VHlwZSBfaW5mZXJSZWNlaXZlcihTaGFkb3dUeXBlSW5mZXJyZXIgaW5mZXJyZXIpIHsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihyZWNlaXZlciwgY29uc3QgVW5rbm93blR5cGUoKSwgdHJ1ZSk7CiAgICAgIHZhciByZWNlaXZlclR5cGUgPSBnZXRJbmZlcnJlZFR5cGUocmVjZWl2ZXIsIGluZmVycmVyKTsKICAgICAgX3N0b3JlTGV0VHlwZShpbmZlcnJlciwgcmVjZWl2ZXIsIHJlY2VpdmVyVHlwZSk7CiAgICAgIHJldHVybiByZWNlaXZlclR5cGU7CiAgICB9IGVsc2UgaWYgKGlzU3VwZXIpIHsKICAgICAgcmV0dXJuIGluZmVycmVyLmNsYXNzSGllcmFyY2h5LmdldFR5cGVBc0luc3RhbmNlT2YoCiAgICAgICAgICBpbmZlcnJlci50aGlzVHlwZSwgaW5mZXJyZXIudGhpc1R5cGUuY2xhc3NOb2RlLnN1cGVydHlwZS5jbGFzc05vZGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGluZmVycmVyLnRoaXNUeXBlOwogICAgfQogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgY29udGludWUgc3RhdGVtZW50IGZyb20gYSBzd2l0Y2gKLy8vIHN0YXRlbWVudCwgaW4ga2VybmVsIGZvcm0uCmNsYXNzIENvbnRpbnVlU3dpdGNoSnVkZ21lbnQgZXh0ZW5kcyBDb250aW51ZVN3aXRjaFN0YXRlbWVudAogICAgaW1wbGVtZW50cyBTdGF0ZW1lbnRKdWRnbWVudCB7CiAgQ29udGludWVTd2l0Y2hKdWRnbWVudChTd2l0Y2hDYXNlIHRhcmdldCkgOiBzdXBlcih0YXJnZXQpOwoKICBTd2l0Y2hDYXNlSnVkZ21lbnQgZ2V0IHRhcmdldEp1ZGdtZW50ID0+IHRhcmdldDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdENvbnRpbnVlU3dpdGNoSnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gU2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBkZWZlcnJlZCBjaGVjayBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgRGVmZXJyZWRDaGVja0p1ZGdtZW50IGV4dGVuZHMgTGV0IGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIERlZmVycmVkQ2hlY2tKdWRnbWVudChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBFeHByZXNzaW9uIGJvZHkpCiAgICAgIDogc3VwZXIodmFyaWFibGUsIGJvZHkpOwoKICBFeHByZXNzaW9uIGdldCBqdWRnbWVudCA9PiBib2R5OwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdERlZmVycmVkQ2hlY2tKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBkbyBsb29wIGluIGtlcm5lbCBmb3JtLgpjbGFzcyBEb0p1ZGdtZW50IGV4dGVuZHMgRG9TdGF0ZW1lbnQgaW1wbGVtZW50cyBTdGF0ZW1lbnRKdWRnbWVudCB7CiAgRG9KdWRnbWVudChTdGF0ZW1lbnQgYm9keSwgRXhwcmVzc2lvbiBjb25kaXRpb24pIDogc3VwZXIoYm9keSwgY29uZGl0aW9uKTsKCiAgRXhwcmVzc2lvbiBnZXQgY29uZGl0aW9uSnVkZ21lbnQgPT4gY29uZGl0aW9uOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RG9KdWRnbWVudCh0aGlzKTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIGRvdWJsZSBsaXRlcmFsIGluIGtlcm5lbCBmb3JtLgpjbGFzcyBEb3VibGVKdWRnbWVudCBleHRlbmRzIERvdWJsZUxpdGVyYWwgaW1wbGVtZW50cyBFeHByZXNzaW9uSnVkZ21lbnQgewogIERhcnRUeXBlIGluZmVycmVkVHlwZTsKCiAgRG91YmxlSnVkZ21lbnQoZG91YmxlIHZhbHVlKSA6IHN1cGVyKHZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXREb3VibGVKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29tbW9uIGJhc2UgY2xhc3MgZm9yIHNoYWRvdyBvYmplY3RzIHJlcHJlc2VudGluZyBleHByZXNzaW9ucyBpbiBrZXJuZWwKLy8vIGZvcm0uCmFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25KdWRnbWVudCBleHRlbmRzIEV4cHJlc3Npb24gewogIERhcnRUeXBlIGluZmVycmVkVHlwZTsKCiAgLy8vIENhbGxzIGJhY2sgdG8gW2luZmVycmVyXSB0byBwZXJmb3JtIHR5cGUgaW5mZXJlbmNlIGZvciB3aGF0ZXZlciBjb25jcmV0ZQogIC8vLyB0eXBlIG9mIFtFeHByZXNzaW9uXSB0aGlzIGlzLgogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpOwp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW1wdHkgc3RhdGVtZW50IGluIGtlcm5lbCBmb3JtLgpjbGFzcyBFbXB0eVN0YXRlbWVudEp1ZGdtZW50IGV4dGVuZHMgRW1wdHlTdGF0ZW1lbnQKICAgIGltcGxlbWVudHMgU3RhdGVtZW50SnVkZ21lbnQgewogIEVtcHR5U3RhdGVtZW50SnVkZ21lbnQoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEVtcHR5U3RhdGVtZW50SnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQgaW4ga2VybmVsIGZvcm0uCmNsYXNzIEV4cHJlc3Npb25TdGF0ZW1lbnRKdWRnbWVudCBleHRlbmRzIEV4cHJlc3Npb25TdGF0ZW1lbnQKICAgIGltcGxlbWVudHMgU3RhdGVtZW50SnVkZ21lbnQgewogIEV4cHJlc3Npb25TdGF0ZW1lbnRKdWRnbWVudChFeHByZXNzaW9uIGV4cHJlc3Npb24pIDogc3VwZXIoZXhwcmVzc2lvbik7CgogIEV4cHJlc3Npb24gZ2V0IGp1ZGdtZW50ID0+IGV4cHJlc3Npb247CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50SnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gU2hhZG93IG9iamVjdCBmb3IgW1N0YXRpY0ludm9jYXRpb25dIHdoZW4gdGhlIHByb2NlZHVyZSBiZWluZyBpbnZva2VkIGlzIGEKLy8vIGZhY3RvcnkgY29uc3RydWN0b3IuCmNsYXNzIEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudCBleHRlbmRzIFN0YXRpY0ludm9jYXRpb24KICAgIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudCgKICAgICAgUHJvY2VkdXJlIHRhcmdldCwgQXJndW1lbnRzSnVkZ21lbnQgYXJndW1lbnRzLAogICAgICB7Ym9vbCBpc0NvbnN0OiBmYWxzZX0pCiAgICAgIDogc3VwZXIodGFyZ2V0LCBhcmd1bWVudHMsIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBBcmd1bWVudHNKdWRnbWVudCBnZXQgYXJndW1lbnRKdWRnbWVudHMgPT4gYXJndW1lbnRzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWVsZCBpbml0aWFsaXplciBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgU2hhZG93RmllbGRJbml0aWFsaXplciBleHRlbmRzIEZpZWxkSW5pdGlhbGl6ZXIKICAgIGltcGxlbWVudHMgSW5pdGlhbGl6ZXJKdWRnbWVudCB7CiAgU2hhZG93RmllbGRJbml0aWFsaXplcihGaWVsZCBmaWVsZCwgRXhwcmVzc2lvbiB2YWx1ZSkgOiBzdXBlcihmaWVsZCwgdmFsdWUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U2hhZG93RmllbGRJbml0aWFsaXplcih0aGlzKTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIGNsYXNzaWMgZm9yIGxvb3AgaW4ga2VybmVsIGZvcm0uCmNsYXNzIEZvckp1ZGdtZW50IGV4dGVuZHMgRm9yU3RhdGVtZW50IGltcGxlbWVudHMgU3RhdGVtZW50SnVkZ21lbnQgewogIEZvckp1ZGdtZW50KExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzLCBFeHByZXNzaW9uIGNvbmRpdGlvbiwKICAgICAgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGVzLCBTdGF0ZW1lbnQgYm9keSkKICAgICAgOiBzdXBlcih2YXJpYWJsZXMgPz8gW10sIGNvbmRpdGlvbiwgdXBkYXRlcywgYm9keSk7CgogIEV4cHJlc3Npb24gZ2V0IGNvbmRpdGlvbkp1ZGdtZW50ID0+IGNvbmRpdGlvbjsKCiAgTGlzdDxFeHByZXNzaW9uPiBnZXQgdXBkYXRlSnVkZ21lbnRzID0+IHVwZGF0ZXMuY2FzdCgpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Rm9ySnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBmdW5jdGlvbiBleHByZXNzaW9uIGluIGtlcm5lbCBmb3JtLgpjbGFzcyBGdW5jdGlvbk5vZGVKdWRnbWVudCBleHRlbmRzIEZ1bmN0aW9uTm9kZSB7CiAgRnVuY3Rpb25Ob2RlSnVkZ21lbnQoU3RhdGVtZW50IGJvZHksCiAgICAgIHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycywKICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgIERhcnRUeXBlIHJldHVyblR5cGU6IGNvbnN0IER5bmFtaWNUeXBlKCksCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyOiBBc3luY01hcmtlci5TeW5jLAogICAgICBBc3luY01hcmtlciBkYXJ0QXN5bmNNYXJrZXJ9KQogICAgICA6IHN1cGVyKGJvZHksCiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5hbWVkUGFyYW1ldGVycywKICAgICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICAgICAgcmV0dXJuVHlwZTogcmV0dXJuVHlwZSwKICAgICAgICAgICAgYXN5bmNNYXJrZXI6IGFzeW5jTWFya2VyLAogICAgICAgICAgICBkYXJ0QXN5bmNNYXJrZXI6IGRhcnRBc3luY01hcmtlcik7Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIGxvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGluIGtlcm5lbAovLy8gZm9ybS4KY2xhc3MgRnVuY3Rpb25EZWNsYXJhdGlvbkp1ZGdtZW50IGV4dGVuZHMgRnVuY3Rpb25EZWNsYXJhdGlvbgogICAgaW1wbGVtZW50cyBTdGF0ZW1lbnRKdWRnbWVudCB7CiAgYm9vbCBfaGFzSW1wbGljaXRSZXR1cm5UeXBlID0gZmFsc2U7CgogIEZ1bmN0aW9uRGVjbGFyYXRpb25KdWRnbWVudCgKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50IHZhcmlhYmxlLCBGdW5jdGlvbk5vZGVKdWRnbWVudCBmdW5jdGlvbikKICAgICAgOiBzdXBlcih2YXJpYWJsZSwgZnVuY3Rpb24pOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQgZ2V0IHZhcmlhYmxlSnVkZ21lbnQgPT4gdmFyaWFibGU7CgogIEZ1bmN0aW9uTm9kZUp1ZGdtZW50IGdldCBmdW5jdGlvbkp1ZGdtZW50ID0+IGZ1bmN0aW9uOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbkp1ZGdtZW50KHRoaXMpOwogIH0KCiAgc3RhdGljIHZvaWQgc2V0SGFzSW1wbGljaXRSZXR1cm5UeXBlKAogICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uSnVkZ21lbnQgZGVjbGFyYXRpb24sIGJvb2wgaGFzSW1wbGljaXRSZXR1cm5UeXBlKSB7CiAgICBkZWNsYXJhdGlvbi5faGFzSW1wbGljaXRSZXR1cm5UeXBlID0gaGFzSW1wbGljaXRSZXR1cm5UeXBlOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgc3VwZXIgaW5pdGlhbGl6ZXIgaW4ga2VybmVsIGZvcm0uCmNsYXNzIEludmFsaWRTdXBlckluaXRpYWxpemVySnVkZ21lbnQgZXh0ZW5kcyBMb2NhbEluaXRpYWxpemVyCiAgICBpbXBsZW1lbnRzIEluaXRpYWxpemVySnVkZ21lbnQgewogIGZpbmFsIENvbnN0cnVjdG9yIHRhcmdldDsKICBmaW5hbCBBcmd1bWVudHNKdWRnbWVudCBhcmd1bWVudHNKdWRnbWVudDsKCiAgSW52YWxpZFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudCgKICAgICAgdGhpcy50YXJnZXQsIHRoaXMuYXJndW1lbnRzSnVkZ21lbnQsIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpCiAgICAgIDogc3VwZXIodmFyaWFibGUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SW52YWxpZFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudCh0aGlzKTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhbiBpZi1udWxsIGV4cHJlc3Npb24uCi8vLwovLy8gQW4gaWYtbnVsbCBleHByZXNzaW9uIG9mIHRoZSBmb3JtIGBhID8/IGJgIGlzIHJlcHJlc2VudGVkIGFzIHRoZSBrZXJuZWwKLy8vIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCB2ID0gYSBpbiB2ID09IG51bGwgPyBiIDogdgpjbGFzcyBJZk51bGxKdWRnbWVudCBleHRlbmRzIExldCBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICBJZk51bGxKdWRnbWVudChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBFeHByZXNzaW9uIGJvZHkpCiAgICAgIDogc3VwZXIodmFyaWFibGUsIGJvZHkpOwoKICBAb3ZlcnJpZGUKICBDb25kaXRpb25hbEV4cHJlc3Npb24gZ2V0IGJvZHkgPT4gc3VwZXIuYm9keTsKCiAgLy8vIFJldHVybnMgdGhlIGV4cHJlc3Npb24gdG8gdGhlIGxlZnQgb2YgYD8/YC4KICBFeHByZXNzaW9uIGdldCBsZWZ0SnVkZ21lbnQgPT4gdmFyaWFibGUuaW5pdGlhbGl6ZXI7CgogIC8vLyBSZXR1cm5zIHRoZSBleHByZXNzaW9uIHRvIHRoZSByaWdodCBvZiBgPz9gLgogIEV4cHJlc3Npb24gZ2V0IHJpZ2h0SnVkZ21lbnQgPT4gYm9keS50aGVuOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdElmTnVsbEp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhbiBpZiBzdGF0ZW1lbnQgaW4ga2VybmVsIGZvcm0uCmNsYXNzIElmSnVkZ21lbnQgZXh0ZW5kcyBJZlN0YXRlbWVudCBpbXBsZW1lbnRzIFN0YXRlbWVudEp1ZGdtZW50IHsKICBJZkp1ZGdtZW50KEV4cHJlc3Npb24gY29uZGl0aW9uLCBTdGF0ZW1lbnQgdGhlbiwgU3RhdGVtZW50IG90aGVyd2lzZSkKICAgICAgOiBzdXBlcihjb25kaXRpb24sIHRoZW4sIG90aGVyd2lzZSk7CgogIEV4cHJlc3Npb24gZ2V0IGNvbmRpdGlvbkp1ZGdtZW50ID0+IGNvbmRpdGlvbjsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdElmSnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gYXNzaWdubWVudCB0byBhIHRhcmdldCBmb3Igd2hpY2gKLy8vIGFzc2lnbm1lbnQgaXMgbm90IGFsbG93ZWQuCmNsYXNzIElsbGVnYWxBc3NpZ25tZW50SnVkZ21lbnQgZXh0ZW5kcyBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IHsKICAvLy8gVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgaW52YWxpZCBhc3NpZ25tZW50IHNob3VsZCBiZSBzdG9yZWQuCiAgLy8vIElmIGAtMWAsIHRoZW4gdGhlcmUgaXMgbm8gc2VwYXJhdGUgbG9jYXRpb24gZm9yIGludmFsaWQgYXNzaWdubWVudC4KICBmaW5hbCBpbnQgYXNzaWdubWVudE9mZnNldDsKCiAgSWxsZWdhbEFzc2lnbm1lbnRKdWRnbWVudC5fKEV4cHJlc3Npb24gcmhzLCB7dGhpcy5hc3NpZ25tZW50T2Zmc2V0OiAtMX0pCiAgICAgIDogc3VwZXIuXyhyaHMpIHsKICAgIHJocy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJbGxlZ2FsQXNzaWdubWVudEp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhbiBhc3NpZ25tZW50IHRvIGEgdGFyZ2V0IG9mIHRoZSBmb3JtCi8vLyBgYVtiXWAuCmNsYXNzIEluZGV4QXNzaWdubWVudEp1ZGdtZW50IGV4dGVuZHMgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudFdpdGhSZWNlaXZlciB7CiAgLy8vIEluIGFuIGFzc2lnbm1lbnQgdG8gYW4gaW5kZXggZXhwcmVzc2lvbiwgdGhlIGluZGV4IGV4cHJlc3Npb24uCiAgZmluYWwgRXhwcmVzc2lvbiBpbmRleDsKCiAgSW5kZXhBc3NpZ25tZW50SnVkZ21lbnQuXyhFeHByZXNzaW9uIHJlY2VpdmVyLCB0aGlzLmluZGV4LCBFeHByZXNzaW9uIHJocywKICAgICAge2Jvb2wgaXNTdXBlcjogZmFsc2V9KQogICAgICA6IHN1cGVyLl8ocmVjZWl2ZXIsIHJocywgaXNTdXBlcik7CgogIEFyZ3VtZW50cyBfZ2V0SW52b2NhdGlvbkFyZ3VtZW50cygKICAgICAgU2hhZG93VHlwZUluZmVycmVyIGluZmVycmVyLCBFeHByZXNzaW9uIGludm9jYXRpb24pIHsKICAgIGlmIChpbnZvY2F0aW9uIGlzIE1ldGhvZEludm9jYXRpb24pIHsKICAgICAgcmV0dXJuIGludm9jYXRpb24uYXJndW1lbnRzOwogICAgfSBlbHNlIGlmIChpbnZvY2F0aW9uIGlzIFN1cGVyTWV0aG9kSW52b2NhdGlvbikgewogICAgICByZXR1cm4gaW52b2NhdGlvbi5hcmd1bWVudHM7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyB1bmhhbmRsZWQoIiR7aW52b2NhdGlvbi5ydW50aW1lVHlwZX0iLCAiX2dldEludm9jYXRpb25Bcmd1bWVudHMiLAogICAgICAgICAgZmlsZU9mZnNldCwgaW5mZXJyZXIudXJpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIExpc3Q8U3RyaW5nPiBfZ2V0VG9TdHJpbmdQYXJ0cygpIHsKICAgIHZhciBwYXJ0cyA9IHN1cGVyLl9nZXRUb1N0cmluZ1BhcnRzKCk7CiAgICBpZiAoaW5kZXggIT0gbnVsbCkgcGFydHMuYWRkKCdpbmRleD0kaW5kZXgnKTsKICAgIHJldHVybiBwYXJ0czsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SW5kZXhBc3NpZ25tZW50SnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIENvbW1vbiBiYXNlIGNsYXNzIGZvciBzaGFkb3cgb2JqZWN0cyByZXByZXNlbnRpbmcgaW5pdGlhbGl6ZXJzIGluIGtlcm5lbAovLy8gZm9ybS4KYWJzdHJhY3QgY2xhc3MgSW5pdGlhbGl6ZXJKdWRnbWVudCBpbXBsZW1lbnRzIEluaXRpYWxpemVyIHsKICAvLy8gUGVyZm9ybXMgdHlwZSBpbmZlcmVuY2UgZm9yIHdoYXRldmVyIGNvbmNyZXRlIHR5cGUgb2YgW0luaXRpYWxpemVySnVkZ21lbnRdCiAgLy8vIHRoaXMgaXMuCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKTsKfQoKRXhwcmVzc2lvbiBjaGVja1dlYkludExpdGVyYWxzRXJyb3JJZlVuZXhhY3QoCiAgICBTaGFkb3dUeXBlSW5mZXJyZXIgaW5mZXJyZXIsIGludCB2YWx1ZSwgU3RyaW5nIGxpdGVyYWwsIGludCBjaGFyT2Zmc2V0KSB7CiAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gKDEgPDwgNTMpKSByZXR1cm4gbnVsbDsKICBpZiAoaW5mZXJyZXIubGlicmFyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICBpZiAoIWluZmVycmVyLmxpYnJhcnkubG9hZGVyLnRhcmdldC5iYWNrZW5kVGFyZ2V0CiAgICAgIC5lcnJvck9uVW5leGFjdFdlYkludExpdGVyYWxzKSByZXR1cm4gbnVsbDsKICBCaWdJbnQgYXNJbnQgPSBCaWdJbnQuZnJvbSh2YWx1ZSkudG9VbnNpZ25lZCg2NCk7CiAgQmlnSW50IGFzRG91YmxlID0gQmlnSW50LmZyb20oYXNJbnQudG9Eb3VibGUoKSk7CiAgaWYgKGFzSW50ID09IGFzRG91YmxlKSByZXR1cm4gbnVsbDsKICBTdHJpbmcgdGV4dCA9IGxpdGVyYWwgPz8gdmFsdWUudG9TdHJpbmcoKTsKICBTdHJpbmcgbmVhcmVzdCA9IHRleHQuc3RhcnRzV2l0aCgnMHgnKSB8fCB0ZXh0LnN0YXJ0c1dpdGgoJzBYJykKICAgICAgPyAnMHgke2FzRG91YmxlLnRvUmFkaXhTdHJpbmcoMTYpfScKICAgICAgOiBhc0RvdWJsZS50b1N0cmluZygpOwogIGludCBsZW5ndGggPSBsaXRlcmFsPy5sZW5ndGggPz8gbm9MZW5ndGg7CiAgcmV0dXJuIGluZmVycmVyLmhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihpbmZlcnJlci5oZWxwZXIKICAgICAgLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlV2ViTGl0ZXJhbENhbm5vdEJlUmVwcmVzZW50ZWRFeGFjdGx5LndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgdGV4dCwgbmVhcmVzdCksCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgbGVuZ3RoKSk7Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyIGxpdGVyYWwgaW4ga2VybmVsIGZvcm0uCmNsYXNzIEludEp1ZGdtZW50IGV4dGVuZHMgSW50TGl0ZXJhbCBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwogIGZpbmFsIFN0cmluZyBsaXRlcmFsOwoKICBJbnRKdWRnbWVudChpbnQgdmFsdWUsIHRoaXMubGl0ZXJhbCkgOiBzdXBlcih2YWx1ZSk7CgogIGRvdWJsZSBhc0RvdWJsZSh7Ym9vbCBuZWdhdGVkOiBmYWxzZX0pIHsKICAgIGlmICh2YWx1ZSA9PSAwICYmIG5lZ2F0ZWQpIHJldHVybiAtMC4wOwogICAgQmlnSW50IGludFZhbHVlID0gQmlnSW50LmZyb20obmVnYXRlZCA/IC12YWx1ZSA6IHZhbHVlKTsKICAgIGRvdWJsZSBkb3VibGVWYWx1ZSA9IGludFZhbHVlLnRvRG91YmxlKCk7CiAgICByZXR1cm4gaW50VmFsdWUgPT0gQmlnSW50LmZyb20oZG91YmxlVmFsdWUpID8gZG91YmxlVmFsdWUgOiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJbnRKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgpjbGFzcyBTaGFkb3dMYXJnZUludExpdGVyYWwgZXh0ZW5kcyBJbnRMaXRlcmFsIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKICBmaW5hbCBpbnQgZmlsZU9mZnNldDsKICBib29sIGlzUGFyZW50aGVzaXplZCA9IGZhbHNlOwoKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIFNoYWRvd0xhcmdlSW50TGl0ZXJhbCh0aGlzLmxpdGVyYWwsIHRoaXMuZmlsZU9mZnNldCkgOiBzdXBlcigwKTsKCiAgZG91YmxlIGFzRG91YmxlKHtib29sIG5lZ2F0ZWQ6IGZhbHNlfSkgewogICAgQmlnSW50IGludFZhbHVlID0gQmlnSW50LnRyeVBhcnNlKG5lZ2F0ZWQgPyAnLSR7bGl0ZXJhbH0nIDogbGl0ZXJhbCk7CiAgICBpZiAoaW50VmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBkb3VibGUgZG91YmxlVmFsdWUgPSBpbnRWYWx1ZS50b0RvdWJsZSgpOwogICAgcmV0dXJuICFkb3VibGVWYWx1ZS5pc05hTiAmJgogICAgICAgICAgICAhZG91YmxlVmFsdWUuaXNJbmZpbml0ZSAmJgogICAgICAgICAgICBpbnRWYWx1ZSA9PSBCaWdJbnQuZnJvbShkb3VibGVWYWx1ZSkKICAgICAgICA/IGRvdWJsZVZhbHVlCiAgICAgICAgOiBudWxsOwogIH0KCiAgaW50IGFzSW50NjQoe2Jvb2wgbmVnYXRlZDogZmFsc2V9KSB7CiAgICByZXR1cm4gaW50LnRyeVBhcnNlKG5lZ2F0ZWQgPyAnLSR7bGl0ZXJhbH0nIDogbGl0ZXJhbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFNoYWRvd0xhcmdlSW50TGl0ZXJhbCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gaW52YWxpZCBpbml0aWFsaXplciBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgU2hhZG93SW52YWxpZEluaXRpYWxpemVyIGV4dGVuZHMgTG9jYWxJbml0aWFsaXplcgogICAgaW1wbGVtZW50cyBJbml0aWFsaXplckp1ZGdtZW50IHsKICBTaGFkb3dJbnZhbGlkSW5pdGlhbGl6ZXIoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgOiBzdXBlcih2YXJpYWJsZSk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTaGFkb3dJbnZhbGlkSW5pdGlhbGl6ZXIodGhpcyk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gaW52YWxpZCBpbml0aWFsaXplciBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgU2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBMb2NhbEluaXRpYWxpemVyCiAgICBpbXBsZW1lbnRzIEluaXRpYWxpemVySnVkZ21lbnQgewogIGZpbmFsIEZpZWxkIGZpZWxkOwogIGZpbmFsIEV4cHJlc3Npb24gdmFsdWU7CgogIFNoYWRvd0ludmFsaWRGaWVsZEluaXRpYWxpemVyKAogICAgICB0aGlzLmZpZWxkLCB0aGlzLnZhbHVlLCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKQogICAgICA6IHN1cGVyKHZhcmlhYmxlKSB7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIEV4cHJlc3Npb24gZ2V0IGp1ZGdtZW50ID0+IHZhbHVlOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXIodGhpcyk7CiAgfQp9CgovLy8gVHlwZSBpbmZlcmVuY2UgZGVyaXZhdGlvbiBmb3IgW0xpc3RMaXRlcmFsXS4KY2xhc3MgTGlzdExpdGVyYWxKdWRnbWVudCBleHRlbmRzIExpc3RMaXRlcmFsIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIExpc3RMaXRlcmFsSnVkZ21lbnQoTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucywKICAgICAge0RhcnRUeXBlIHR5cGVBcmd1bWVudCwgYm9vbCBpc0NvbnN0OiBmYWxzZX0pCiAgICAgIDogYXNzZXJ0KHR5cGVBcmd1bWVudCAhPSBudWxsKSwKICAgICAgICBzdXBlcihleHByZXNzaW9ucywgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQsIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdExpc3RMaXRlcmFsSnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIFR5cGUgaW5mZXJlbmNlIGRlcml2YXRpb24gZm9yIFtTZXRMaXRlcmFsXS4KY2xhc3MgU2V0TGl0ZXJhbEp1ZGdtZW50IGV4dGVuZHMgU2V0TGl0ZXJhbCBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICBTZXRMaXRlcmFsSnVkZ21lbnQoTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucywKICAgICAge0RhcnRUeXBlIHR5cGVBcmd1bWVudCwgYm9vbCBpc0NvbnN0OiBmYWxzZX0pCiAgICAgIDogYXNzZXJ0KHR5cGVBcmd1bWVudCAhPSBudWxsKSwKICAgICAgICBzdXBlcihleHByZXNzaW9ucywgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQsIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFNldExpdGVyYWxKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gVHlwZSBpbmZlcmVuY2UgZGVyaXZhdGlvbiBmb3IgW01hcExpdGVyYWxdLgpjbGFzcyBNYXBMaXRlcmFsSnVkZ21lbnQgZXh0ZW5kcyBNYXBMaXRlcmFsIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIE1hcExpdGVyYWxKdWRnbWVudChMaXN0PE1hcEVudHJ5PiBqdWRnbWVudHMsCiAgICAgIHtEYXJ0VHlwZSBrZXlUeXBlLCBEYXJ0VHlwZSB2YWx1ZVR5cGUsIGJvb2wgaXNDb25zdDogZmFsc2V9KQogICAgICA6IGFzc2VydChrZXlUeXBlICE9IG51bGwpLAogICAgICAgIGFzc2VydCh2YWx1ZVR5cGUgIT0gbnVsbCksCiAgICAgICAgc3VwZXIoanVkZ21lbnRzLAogICAgICAgICAgICBrZXlUeXBlOiBrZXlUeXBlLCB2YWx1ZVR5cGU6IHZhbHVlVHlwZSwgaXNDb25zdDogaXNDb25zdCk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TWFwTGl0ZXJhbEp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBTaGFkb3cgb2JqZWN0IGZvciBbTWV0aG9kSW52b2NhdGlvbl0uCmNsYXNzIE1ldGhvZEludm9jYXRpb25KdWRnbWVudCBleHRlbmRzIE1ldGhvZEludm9jYXRpb24KICAgIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG1ldGhvZCBpbnZvY2F0aW9uIGlzIGEgY2FsbCB0byBhIGBjYWxsYCBtZXRob2QKICAvLy8gcmVzdWx0aW5nIGZyb20gdGhlIGludm9jYXRpb24gb2YgYSBmdW5jdGlvbiBleHByZXNzaW9uLgogIGZpbmFsIGJvb2wgX2lzSW1wbGljaXRDYWxsOwoKICBNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQoCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsIE5hbWUgbmFtZSwgQXJndW1lbnRzSnVkZ21lbnQgYXJndW1lbnRzLAogICAgICB7Ym9vbCBpc0ltcGxpY2l0Q2FsbDogZmFsc2UsIE1lbWJlciBpbnRlcmZhY2VUYXJnZXR9KQogICAgICA6IF9pc0ltcGxpY2l0Q2FsbCA9IGlzSW1wbGljaXRDYWxsLAogICAgICAgIHN1cGVyKHJlY2VpdmVyLCBuYW1lLCBhcmd1bWVudHMsIGludGVyZmFjZVRhcmdldCk7CgogIEFyZ3VtZW50c0p1ZGdtZW50IGdldCBhcmd1bWVudEp1ZGdtZW50cyA9PiBhcmd1bWVudHM7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIG5hbWVkIGZ1bmN0aW9uIGV4cHJlc3Npb24uCi8vLwovLy8gTmFtZWQgZnVuY3Rpb24gZXhwcmVzc2lvbnMgYXJlIG5vdCBsZWdhbCBpbiBEYXJ0LCBidXQgdGhleSBhcmUgYWNjZXB0ZWQgYnkKLy8vIHRoZSBwYXJzZXIgYW5kIEJvZHlCdWlsZGVyIGZvciBlcnJvciByZWNvdmVyeSBwdXJwb3Nlcy4KLy8vCi8vLyBBIG5hbWVkIGZ1bmN0aW9uIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gYGYoKSB7IC4uLiB9YCBpcyByZXByZXNlbnRlZCBhcyB0aGUKLy8vIGtlcm5lbCBleHByZXNzaW9uOgovLy8KLy8vICAgICBsZXQgZiA9ICgpIHsgLi4uIH0gaW4gZgpjbGFzcyBOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbkp1ZGdtZW50IGV4dGVuZHMgTGV0CiAgICBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICBOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbkp1ZGdtZW50KFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCB2YXJpYWJsZSkKICAgICAgOiBzdXBlcih2YXJpYWJsZSwgbmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlKSk7CgogIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCBnZXQgdmFyaWFibGVKdWRnbWVudCA9PiB2YXJpYWJsZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXROYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbkp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIG51bGwtYXdhcmUgbWV0aG9kIGludm9jYXRpb24uCi8vLwovLy8gQSBudWxsLWF3YXJlIG1ldGhvZCBpbnZvY2F0aW9uIG9mIHRoZSBmb3JtIGBhPy5iKC4uLilgIGlzIHJlcHJlc2VudGVkIGFzIHRoZQovLy8gZXhwcmVzc2lvbjoKLy8vCi8vLyAgICAgbGV0IHYgPSBhIGluIHYgPT0gbnVsbCA/IG51bGwgOiB2LmIoLi4uKQpjbGFzcyBOdWxsQXdhcmVNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQgZXh0ZW5kcyBMZXQKICAgIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIE51bGxBd2FyZU1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgRXhwcmVzc2lvbiBib2R5KQogICAgICA6IHN1cGVyKHZhcmlhYmxlLCBib2R5KTsKCiAgQG92ZXJyaWRlCiAgQ29uZGl0aW9uYWxFeHByZXNzaW9uIGdldCBib2R5ID0+IHN1cGVyLmJvZHk7CgogIE1ldGhvZEludm9jYXRpb24gZ2V0IF9kZXN1Z2FyZWRJbnZvY2F0aW9uID0+IGJvZHkub3RoZXJ3aXNlOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdE51bGxBd2FyZU1ldGhvZEludm9jYXRpb25KdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBudWxsLWF3YXJlIHJlYWQgZnJvbSBhIHByb3BlcnR5LgovLy8KLy8vIEEgbnVsbC1hd2FyZSBwcm9wZXJ0eSBnZXQgb2YgdGhlIGZvcm0gYGE/LmJgIGlzIHJlcHJlc2VudGVkIGFzIHRoZSBrZXJuZWwKLy8vIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCB2ID0gYSBpbiB2ID09IG51bGwgPyBudWxsIDogdi5iCmNsYXNzIE51bGxBd2FyZVByb3BlcnR5R2V0SnVkZ21lbnQgZXh0ZW5kcyBMZXQgaW1wbGVtZW50cyBFeHByZXNzaW9uSnVkZ21lbnQgewogIERhcnRUeXBlIGluZmVycmVkVHlwZTsKCiAgTnVsbEF3YXJlUHJvcGVydHlHZXRKdWRnbWVudCgKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgQ29uZGl0aW9uYWxFeHByZXNzaW9uIGJvZHkpCiAgICAgIDogc3VwZXIodmFyaWFibGUsIGJvZHkpOwoKICBAb3ZlcnJpZGUKICBDb25kaXRpb25hbEV4cHJlc3Npb24gZ2V0IGJvZHkgPT4gc3VwZXIuYm9keTsKCiAgUHJvcGVydHlHZXQgZ2V0IF9kZXN1Z2FyZWRHZXQgPT4gYm9keS5vdGhlcndpc2U7CgogIEV4cHJlc3Npb24gZ2V0IHJlY2VpdmVySnVkZ21lbnQgPT4gdmFyaWFibGUuaW5pdGlhbGl6ZXI7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TnVsbEF3YXJlUHJvcGVydHlHZXRKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gYXNzaWdubWVudCB0byBhIHByb3BlcnR5LgpjbGFzcyBQcm9wZXJ0eUFzc2lnbm1lbnRKdWRnbWVudCBleHRlbmRzIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnRXaXRoUmVjZWl2ZXIgewogIC8vLyBJZiB0aGlzIGFzc2lnbm1lbnQgdXNlcyBudWxsLWF3YXJlIGFjY2VzcyAoYD8uYCksIHRoZSBjb25kaXRpb25hbAogIC8vLyBleHByZXNzaW9uIHRoYXQgZ3VhcmRzIHRoZSBhY2Nlc3M7IG90aGVyd2lzZSBgbnVsbGAuCiAgQ29uZGl0aW9uYWxFeHByZXNzaW9uIG51bGxBd2FyZUd1YXJkOwoKICBQcm9wZXJ0eUFzc2lnbm1lbnRKdWRnbWVudC5fKEV4cHJlc3Npb24gcmVjZWl2ZXIsIEV4cHJlc3Npb24gcmhzLAogICAgICB7Ym9vbCBpc1N1cGVyOiBmYWxzZX0pCiAgICAgIDogc3VwZXIuXyhyZWNlaXZlciwgcmhzLCBpc1N1cGVyKTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxTdHJpbmc+IF9nZXRUb1N0cmluZ1BhcnRzKCkgewogICAgdmFyIHBhcnRzID0gc3VwZXIuX2dldFRvU3RyaW5nUGFydHMoKTsKICAgIGlmIChudWxsQXdhcmVHdWFyZCAhPSBudWxsKSBwYXJ0cy5hZGQoJ251bGxBd2FyZUd1YXJkPSRudWxsQXdhcmVHdWFyZCcpOwogICAgcmV0dXJuIHBhcnRzOwogIH0KCiAgT2JqZWN0IF9oYW5kbGVXcml0ZUNvbnRyYXZhcmlhbmNlKAogICAgICBTaGFkb3dUeXBlSW5mZXJyZXIgaW5mZXJyZXIsIERhcnRUeXBlIHJlY2VpdmVyVHlwZSkgewogICAgcmV0dXJuIGluZmVycmVyLmZpbmRQcm9wZXJ0eVNldE1lbWJlcihyZWNlaXZlclR5cGUsIHdyaXRlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0UHJvcGVydHlBc3NpZ25tZW50SnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgcmVkaXJlY3RpbmcgaW5pdGlhbGl6ZXIgaW4ga2VybmVsCi8vLyBmb3JtLgpjbGFzcyBSZWRpcmVjdGluZ0luaXRpYWxpemVySnVkZ21lbnQgZXh0ZW5kcyBSZWRpcmVjdGluZ0luaXRpYWxpemVyCiAgICBpbXBsZW1lbnRzIEluaXRpYWxpemVySnVkZ21lbnQgewogIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJKdWRnbWVudCgKICAgICAgQ29uc3RydWN0b3IgdGFyZ2V0LCBBcmd1bWVudHNKdWRnbWVudCBhcmd1bWVudHMpCiAgICAgIDogc3VwZXIodGFyZ2V0LCBhcmd1bWVudHMpOwoKICBBcmd1bWVudHNKdWRnbWVudCBnZXQgYXJndW1lbnRKdWRnbWVudHMgPT4gYXJndW1lbnRzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0UmVkaXJlY3RpbmdJbml0aWFsaXplckp1ZGdtZW50KHRoaXMpOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgcmV0dXJuIHN0YXRlbWVudCBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgUmV0dXJuSnVkZ21lbnQgZXh0ZW5kcyBSZXR1cm5TdGF0ZW1lbnQgaW1wbGVtZW50cyBTdGF0ZW1lbnRKdWRnbWVudCB7CiAgZmluYWwgU3RyaW5nIHJldHVybktleXdvcmRMZXhlbWU7CgogIFJldHVybkp1ZGdtZW50KHRoaXMucmV0dXJuS2V5d29yZExleGVtZSwgW0V4cHJlc3Npb24gZXhwcmVzc2lvbl0pCiAgICAgIDogc3VwZXIoZXhwcmVzc2lvbik7CgogIEV4cHJlc3Npb24gZ2V0IGp1ZGdtZW50ID0+IGV4cHJlc3Npb247CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRSZXR1cm5KdWRnbWVudCh0aGlzKTsKICB9Cn0KCi8vLyBDb21tb24gYmFzZSBjbGFzcyBmb3Igc2hhZG93IG9iamVjdHMgcmVwcmVzZW50aW5nIHN0YXRlbWVudHMgaW4ga2VybmVsCi8vLyBmb3JtLgphYnN0cmFjdCBjbGFzcyBTdGF0ZW1lbnRKdWRnbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAgLy8vIENhbGxzIGJhY2sgdG8gW2luZmVycmVyXSB0byBwZXJmb3JtIHR5cGUgaW5mZXJlbmNlIGZvciB3aGF0ZXZlciBjb25jcmV0ZQogIC8vLyB0eXBlIG9mIFtTdGF0ZW1lbnRKdWRnbWVudF0gdGhpcyBpcy4KICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpOwp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gYXNzaWdubWVudCB0byBhIHN0YXRpYyB2YXJpYWJsZS4KY2xhc3MgU3RhdGljQXNzaWdubWVudEp1ZGdtZW50IGV4dGVuZHMgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCB7CiAgU3RhdGljQXNzaWdubWVudEp1ZGdtZW50Ll8oRXhwcmVzc2lvbiByaHMpIDogc3VwZXIuXyhyaHMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFN0YXRpY0Fzc2lnbm1lbnRKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBzdXBlciBpbml0aWFsaXplciBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgU3VwZXJJbml0aWFsaXplckp1ZGdtZW50IGV4dGVuZHMgU3VwZXJJbml0aWFsaXplcgogICAgaW1wbGVtZW50cyBJbml0aWFsaXplckp1ZGdtZW50IHsKICBTdXBlckluaXRpYWxpemVySnVkZ21lbnQoQ29uc3RydWN0b3IgdGFyZ2V0LCBBcmd1bWVudHNKdWRnbWVudCBhcmd1bWVudHMpCiAgICAgIDogc3VwZXIodGFyZ2V0LCBhcmd1bWVudHMpOwoKICBBcmd1bWVudHNKdWRnbWVudCBnZXQgYXJndW1lbnRKdWRnbWVudHMgPT4gYXJndW1lbnRzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U3VwZXJJbml0aWFsaXplckp1ZGdtZW50KHRoaXMpOwogIH0KfQoKLy8vIFNoYWRvdyBvYmplY3QgZm9yIFtTdXBlck1ldGhvZEludm9jYXRpb25dLgpjbGFzcyBTdXBlck1ldGhvZEludm9jYXRpb25KdWRnbWVudCBleHRlbmRzIFN1cGVyTWV0aG9kSW52b2NhdGlvbgogICAgaW1wbGVtZW50cyBFeHByZXNzaW9uSnVkZ21lbnQgewogIERhcnRUeXBlIGluZmVycmVkVHlwZTsKCiAgU3VwZXJNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQoTmFtZSBuYW1lLCBBcmd1bWVudHNKdWRnbWVudCBhcmd1bWVudHMsCiAgICAgIHtQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0fSkKICAgICAgOiBzdXBlcihuYW1lLCBhcmd1bWVudHMsIGludGVyZmFjZVRhcmdldCk7CgogIEFyZ3VtZW50c0p1ZGdtZW50IGdldCBhcmd1bWVudEp1ZGdtZW50cyA9PiBhcmd1bWVudHM7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIFNoYWRvdyBvYmplY3QgZm9yIFtTdXBlclByb3BlcnR5R2V0XS4KY2xhc3MgU3VwZXJQcm9wZXJ0eUdldEp1ZGdtZW50IGV4dGVuZHMgU3VwZXJQcm9wZXJ0eUdldAogICAgaW1wbGVtZW50cyBFeHByZXNzaW9uSnVkZ21lbnQgewogIERhcnRUeXBlIGluZmVycmVkVHlwZTsKCiAgU3VwZXJQcm9wZXJ0eUdldEp1ZGdtZW50KE5hbWUgbmFtZSwge01lbWJlciBpbnRlcmZhY2VUYXJnZXR9KQogICAgICA6IHN1cGVyKG5hbWUsIGludGVyZmFjZVRhcmdldCk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U3VwZXJQcm9wZXJ0eUdldEp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIHN3aXRjaCBjYXNlLgpjbGFzcyBTd2l0Y2hDYXNlSnVkZ21lbnQgZXh0ZW5kcyBTd2l0Y2hDYXNlIHsKICBTd2l0Y2hDYXNlSnVkZ21lbnQoCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMsIExpc3Q8aW50PiBleHByZXNzaW9uT2Zmc2V0cywgU3RhdGVtZW50IGJvZHksCiAgICAgIHtib29sIGlzRGVmYXVsdDogZmFsc2V9KQogICAgICA6IHN1cGVyKGV4cHJlc3Npb25zLCBleHByZXNzaW9uT2Zmc2V0cywgYm9keSwgaXNEZWZhdWx0OiBpc0RlZmF1bHQpOwoKICBTd2l0Y2hDYXNlSnVkZ21lbnQuZGVmYXVsdENhc2UoU3RhdGVtZW50IGJvZHkpIDogc3VwZXIuZGVmYXVsdENhc2UoYm9keSk7CgogIFN3aXRjaENhc2VKdWRnbWVudC5lbXB0eSgpIDogc3VwZXIuZW1wdHkoKTsKCiAgTGlzdDxFeHByZXNzaW9uPiBnZXQgZXhwcmVzc2lvbkp1ZGdtZW50cyA9PiBleHByZXNzaW9ucy5jYXN0KCk7Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIHN3aXRjaCBzdGF0ZW1lbnQgaW4ga2VybmVsIGZvcm0uCmNsYXNzIFN3aXRjaFN0YXRlbWVudEp1ZGdtZW50IGV4dGVuZHMgU3dpdGNoU3RhdGVtZW50CiAgICBpbXBsZW1lbnRzIFN0YXRlbWVudEp1ZGdtZW50IHsKICBTd2l0Y2hTdGF0ZW1lbnRKdWRnbWVudChFeHByZXNzaW9uIGV4cHJlc3Npb24sIExpc3Q8U3dpdGNoQ2FzZT4gY2FzZXMpCiAgICAgIDogc3VwZXIoZXhwcmVzc2lvbiwgY2FzZXMpOwoKICBFeHByZXNzaW9uIGdldCBleHByZXNzaW9uSnVkZ21lbnQgPT4gZXhwcmVzc2lvbjsKCiAgTGlzdDxTd2l0Y2hDYXNlSnVkZ21lbnQ+IGdldCBjYXNlSnVkZ21lbnRzID0+IGNhc2VzLmNhc3QoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFN3aXRjaFN0YXRlbWVudEp1ZGdtZW50KHRoaXMpOwogIH0KfQoKLy8vIFNoYWRvdyBvYmplY3QgZm9yIFtTeW1ib2xMaXRlcmFsXS4KY2xhc3MgU3ltYm9sTGl0ZXJhbEp1ZGdtZW50IGV4dGVuZHMgU3ltYm9sTGl0ZXJhbAogICAgaW1wbGVtZW50cyBFeHByZXNzaW9uSnVkZ21lbnQgewogIERhcnRUeXBlIGluZmVycmVkVHlwZTsKCiAgU3ltYm9sTGl0ZXJhbEp1ZGdtZW50KFN0cmluZyB2YWx1ZSkgOiBzdXBlcih2YWx1ZSk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U3ltYm9sTGl0ZXJhbEp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBTeW50aGV0aWMganVkZ21lbnQgY2xhc3MgcmVwcmVzZW50aW5nIGFuIGF0dGVtcHQgdG8gaW52b2tlIGFuIHVucmVzb2x2ZWQKLy8vIGNvbnN0cnVjdG9yLCBvciBhIGNvbnN0cnVjdG9yIHRoYXQgY2Fubm90IGJlIGludm9rZWQsIG9yIGEgcmVzb2x2ZWQKLy8vIGNvbnN0cnVjdG9yIHdpdGggd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cy4KLy8gVE9ETyhhaGUpOiBSZW1vdmUgdGhpcz8KY2xhc3MgSW52YWxpZENvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50IGV4dGVuZHMgU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBmaW5hbCBNZW1iZXIgY29uc3RydWN0b3I7CiAgZmluYWwgQXJndW1lbnRzIGFyZ3VtZW50czsKCiAgSW52YWxpZENvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50Ll8oCiAgICAgIGtlcm5lbC5FeHByZXNzaW9uIGRlc3VnYXJlZCwgdGhpcy5jb25zdHJ1Y3RvciwgdGhpcy5hcmd1bWVudHMpCiAgICAgIDogc3VwZXIuXyhkZXN1Z2FyZWQpOwoKICBBcmd1bWVudHNKdWRnbWVudCBnZXQgYXJndW1lbnRKdWRnbWVudHMgPT4gYXJndW1lbnRzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEludmFsaWRDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gU3ludGhldGljIGp1ZGdtZW50IGNsYXNzIHJlcHJlc2VudGluZyBhbiBhdHRlbXB0IHRvIGFzc2lnbiB0byB0aGUKLy8vIFtleHByZXNzaW9uXSB3aGljaCBpcyBub3QgYXNzaWduYWJsZS4KY2xhc3MgSW52YWxpZFdyaXRlSnVkZ21lbnQgZXh0ZW5kcyBTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQgewogIGZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgSW52YWxpZFdyaXRlSnVkZ21lbnQuXyhrZXJuZWwuRXhwcmVzc2lvbiBkZXN1Z2FyZWQsIHRoaXMuZXhwcmVzc2lvbikKICAgICAgOiBzdXBlci5fKGRlc3VnYXJlZCk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SW52YWxpZFdyaXRlSnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIFNoYWRvdyBvYmplY3QgZm9yIGV4cHJlc3Npb25zIHRoYXQgYXJlIGludHJvZHVjZWQgYnkgdGhlIGZyb250IGVuZCBhcyBwYXJ0Ci8vLyBvZiBkZXN1Z2FyaW5nIG9yIHRoZSBoYW5kbGluZyBvZiBlcnJvciBjb25kaXRpb25zLgovLy8KLy8vIFRoZXNlIGV4cHJlc3Npb25zIGFyZSByZW1vdmVkIGJ5IHR5cGUgaW5mZXJlbmNlIGFuZCByZXBsYWNlZCB3aXRoIHRoZWlyCi8vLyBkZXN1Z2FyZWQgZXF1aXZhbGVudHMuCmNsYXNzIFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudCBleHRlbmRzIExldCBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICBTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQuXyhFeHByZXNzaW9uIGRlc3VnYXJlZCkKICAgICAgOiBzdXBlcihuZXcgVmFyaWFibGVEZWNsYXJhdGlvbignXycsIGluaXRpYWxpemVyOiBuZXcgTnVsbExpdGVyYWwoKSksCiAgICAgICAgICAgIGRlc3VnYXJlZCk7CgogIC8vLyBUaGUgZGVzdWdhcmVkIGtlcm5lbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHN5bnRoZXRpYyBleHByZXNzaW9uLgogIEV4cHJlc3Npb24gZ2V0IGRlc3VnYXJlZCA9PiBib2R5OwoKICB2b2lkIHNldCBkZXN1Z2FyZWQoRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgdGhpcy5ib2R5ID0gdmFsdWU7CiAgICB2YWx1ZS5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgLy8vIFJlbW92ZXMgdGhpcyBleHByZXNzaW9uIGZyb20gdGhlIGV4cHJlc3Npb24gdHJlZSwgcmVwbGFjaW5nIGl0IHdpdGgKICAvLy8gW2Rlc3VnYXJlZF0uCiAgdm9pZCBfcmVwbGFjZVdpdGhEZXN1Z2FyZWQoKSB7CiAgICBwYXJlbnQucmVwbGFjZUNoaWxkKHRoaXMsIGRlc3VnYXJlZCk7CiAgICBwYXJlbnQgPSBudWxsOwogIH0KCiAgLy8vIFVwZGF0ZXMgYW55IFtMZXRdIG5vZGVzIGluIHRoZSBkZXN1Z2FyZWQgZXhwcmVzc2lvbiB0byBhY2NvdW50IGZvciB0aGUKICAvLy8gZmFjdCB0aGF0IFtleHByZXNzaW9uXSBoYXMgdGhlIGdpdmVuIFt0eXBlXS4KICB2b2lkIF9zdG9yZUxldFR5cGUoCiAgICAgIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgRGFydFR5cGUgdHlwZSkgewogICAgRXhwcmVzc2lvbiBkZXN1Z2FyZWQgPSB0aGlzLmRlc3VnYXJlZDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChkZXN1Z2FyZWQgaXMgTGV0KSB7CiAgICAgICAgTGV0IGRlc3VnYXJlZExldCA9IGRlc3VnYXJlZDsKICAgICAgICB2YXIgdmFyaWFibGUgPSBkZXN1Z2FyZWRMZXQudmFyaWFibGU7CiAgICAgICAgaWYgKGlkZW50aWNhbCh2YXJpYWJsZS5pbml0aWFsaXplciwgZXhwcmVzc2lvbikpIHsKICAgICAgICAgIHZhcmlhYmxlLnR5cGUgPSB0eXBlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBkZXN1Z2FyZWQgPSBkZXN1Z2FyZWRMZXQuYm9keTsKICAgICAgfSBlbHNlIGlmIChkZXN1Z2FyZWQgaXMgQ29uZGl0aW9uYWxFeHByZXNzaW9uKSB7CiAgICAgICAgLy8gV2hlbiBhIG51bGwtYXdhcmUgYXNzaWdubWVudCBpcyBkZXN1Z2FyZWQsIG9mdGVuIHRoZSAidGhlbiIgb3IgImVsc2UiCiAgICAgICAgLy8gYnJhbmNoIG9mIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uIG9mdGVuIGNvbnRhaW5zICJsZXQiIG5vZGVzIHRoYXQKICAgICAgICAvLyBuZWVkIHRvIGJlIHVwZGF0ZWQuCiAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uIGRlc3VnYXJlZENvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IGRlc3VnYXJlZDsKICAgICAgICBpZiAoZGVzdWdhcmVkQ29uZGl0aW9uYWxFeHByZXNzaW9uLnRoZW4gaXMgTGV0KSB7CiAgICAgICAgICBkZXN1Z2FyZWQgPSBkZXN1Z2FyZWRDb25kaXRpb25hbEV4cHJlc3Npb24udGhlbjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGVzdWdhcmVkID0gZGVzdWdhcmVkQ29uZGl0aW9uYWxFeHByZXNzaW9uLm90aGVyd2lzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICAvLyBUaGlzIGlzIGRlc2lnbmVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBkdXJpbmcgc2VyaWFsaXphdGlvbi4gSXQgY2FuIGFsc28KICAgIC8vIGxlYWQgdG8gZXhjZXB0aW9ucyBkdXJpbmcgdHJhbnNmb3JtYXRpb25zLCBidXQgd2UgaGF2ZSB0byBhY2NlcHQgYQogICAgLy8gW1RyYW5zZm9ybWVyXSBhcyB0aGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IGByZXBsYWNlQ2hpbGRgLgogICAgaWYgKHYgaXMgVHJhbnNmb3JtZXIpIHJldHVybiBzdXBlci5hY2NlcHQodik7CiAgICB1bnN1cHBvcnRlZCgiYWNjZXB0IiwgZmlsZU9mZnNldCwgZ2V0RmlsZVVyaSh0aGlzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMTxkeW5hbWljLCBkeW5hbWljPiB2LCBhcmcpIHsKICAgIHVuc3VwcG9ydGVkKCJhY2NlcHQxIiwgZmlsZU9mZnNldCwgZ2V0RmlsZVVyaSh0aGlzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgdW5zdXBwb3J0ZWQoInZpc2l0Q2hpbGRyZW4iLCBmaWxlT2Zmc2V0LCBnZXRGaWxlVXJpKHRoaXMpKTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIGNhdGNoIGNsYXVzZS4KY2xhc3MgQ2F0Y2hKdWRnbWVudCBleHRlbmRzIENhdGNoIHsKICBDYXRjaEp1ZGdtZW50KFZhcmlhYmxlRGVjbGFyYXRpb24gZXhjZXB0aW9uLCBTdGF0ZW1lbnQgYm9keSwKICAgICAge0RhcnRUeXBlIGd1YXJkOiBjb25zdCBEeW5hbWljVHlwZSgpLCBWYXJpYWJsZURlY2xhcmF0aW9uIHN0YWNrVHJhY2V9KQogICAgICA6IHN1cGVyKGV4Y2VwdGlvbiwgYm9keSwgZ3VhcmQ6IGd1YXJkLCBzdGFja1RyYWNlOiBzdGFja1RyYWNlKTsKCiAgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50IGdldCBleGNlcHRpb25KdWRnbWVudCA9PiBleGNlcHRpb247CgogIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCBnZXQgc3RhY2tUcmFjZUp1ZGdtZW50ID0+IHN0YWNrVHJhY2U7Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIHRyeS1jYXRjaCBibG9jayBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgVHJ5Q2F0Y2hKdWRnbWVudCBleHRlbmRzIFRyeUNhdGNoIGltcGxlbWVudHMgU3RhdGVtZW50SnVkZ21lbnQgewogIFRyeUNhdGNoSnVkZ21lbnQoU3RhdGVtZW50IGJvZHksIExpc3Q8Q2F0Y2g+IGNhdGNoZXMpIDogc3VwZXIoYm9keSwgY2F0Y2hlcyk7CgogIExpc3Q8Q2F0Y2hKdWRnbWVudD4gZ2V0IGNhdGNoSnVkZ21lbnRzID0+IGNhdGNoZXMuY2FzdCgpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VHJ5Q2F0Y2hKdWRnbWVudCh0aGlzKTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIHRyeS1maW5hbGx5IGJsb2NrIGluIGtlcm5lbCBmb3JtLgpjbGFzcyBUcnlGaW5hbGx5SnVkZ21lbnQgZXh0ZW5kcyBUcnlGaW5hbGx5IGltcGxlbWVudHMgU3RhdGVtZW50SnVkZ21lbnQgewogIFRyeUZpbmFsbHlKdWRnbWVudChTdGF0ZW1lbnQgYm9keSwgU3RhdGVtZW50IGZpbmFsaXplcikKICAgICAgOiBzdXBlcihib2R5LCBmaW5hbGl6ZXIpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VHJ5RmluYWxseUp1ZGdtZW50KHRoaXMpOwogIH0KfQoKLy8vIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFtUeXBlSW5mZXJlbmNlRW5naW5lXSBzcGVjaWFsaXplZCB0byB3b3JrIHdpdGgKLy8vIGtlcm5lbCBvYmplY3RzLgpjbGFzcyBTaGFkb3dUeXBlSW5mZXJlbmNlRW5naW5lIGV4dGVuZHMgVHlwZUluZmVyZW5jZUVuZ2luZSB7CiAgU2hhZG93VHlwZUluZmVyZW5jZUVuZ2luZShJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uKQogICAgICA6IHN1cGVyKGluc3RydW1lbnRhdGlvbik7CgogIEBvdmVycmlkZQogIFNoYWRvd1R5cGVJbmZlcnJlciBjcmVhdGVMb2NhbFR5cGVJbmZlcnJlcigKICAgICAgVXJpIHVyaSwgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSwgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgcmV0dXJuIG5ldyBUeXBlSW5mZXJyZXIodGhpcywgdXJpLCBmYWxzZSwgdGhpc1R5cGUsIGxpYnJhcnkpOwogIH0KCiAgQG92ZXJyaWRlCiAgU2hhZG93VHlwZUluZmVycmVyIGNyZWF0ZVRvcExldmVsVHlwZUluZmVycmVyKAogICAgICBVcmkgdXJpLCBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlLCBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICByZXR1cm4gbmV3IFR5cGVJbmZlcnJlcih0aGlzLCB1cmksIHRydWUsIHRoaXNUeXBlLCBsaWJyYXJ5KTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBbVHlwZUluZmVycmVyXSBzcGVjaWFsaXplZCB0byB3b3JrIHdpdGgga2VybmVsCi8vLyBvYmplY3RzLgpjbGFzcyBTaGFkb3dUeXBlSW5mZXJyZXIgZXh0ZW5kcyBUeXBlSW5mZXJyZXJJbXBsIHsKICBAb3ZlcnJpZGUKICBmaW5hbCB0eXBlUHJvbW90ZXI7CgogIFNoYWRvd1R5cGVJbmZlcnJlci5wcml2YXRlKFNoYWRvd1R5cGVJbmZlcmVuY2VFbmdpbmUgZW5naW5lLCBVcmkgdXJpLAogICAgICBib29sIHRvcExldmVsLCBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlLCBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KQogICAgICA6IHR5cGVQcm9tb3RlciA9IG5ldyBUeXBlUHJvbW90ZXIoZW5naW5lLnR5cGVTY2hlbWFFbnZpcm9ubWVudCksCiAgICAgICAgc3VwZXIucHJpdmF0ZShlbmdpbmUsIHVyaSwgdG9wTGV2ZWwsIHRoaXNUeXBlLCBsaWJyYXJ5KTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBnZXRGaWVsZEluaXRpYWxpemVyKEZpZWxkIGZpZWxkKSB7CiAgICByZXR1cm4gZmllbGQuaW5pdGlhbGl6ZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBpbmZlckV4cHJlc3Npb24oCiAgICAgIGtlcm5lbC5FeHByZXNzaW9uIGV4cHJlc3Npb24sIERhcnRUeXBlIHR5cGVDb250ZXh0LCBib29sIHR5cGVOZWVkZWQsCiAgICAgIHtib29sIGlzVm9pZEFsbG93ZWQ6IGZhbHNlfSkgewogICAgLy8gYG51bGxgIHNob3VsZCBuZXZlciBiZSB1c2VkIGFzIHRoZSB0eXBlIGNvbnRleHQuICBBbiBpbnN0YW5jZSBvZgogICAgLy8gYFVua25vd25UeXBlYCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgogICAgYXNzZXJ0KHR5cGVDb250ZXh0ICE9IG51bGwpOwoKICAgIC8vIEl0IGlzbid0IHNhZmUgdG8gZG8gdHlwZSBpbmZlcmVuY2Ugb24gYW4gZXhwcmVzc2lvbiB3aXRob3V0IGEgcGFyZW50LAogICAgLy8gYmVjYXVzZSB0eXBlIGluZmVyZW5jZSBtaWdodCBjYXVzZSB1cyB0byBoYXZlIHRvIHJlcGxhY2Ugb25lIGV4cHJlc3Npb24KICAgIC8vIHdpdGggYW5vdGhlciwgYW5kIHdlIGNhbiBvbmx5IHJlcGxhY2UgYSBub2RlIGlmIGl0IGhhcyBhIHBhcmVudCBwb2ludGVyLgogICAgYXNzZXJ0KGV4cHJlc3Npb24ucGFyZW50ICE9IG51bGwpOwoKICAgIC8vIEZvciBmdWxsIChub24tdG9wIGxldmVsKSBpbmZlcmVuY2UsIHdlIG5lZWQgYWNjZXNzIHRvIHRoZQogICAgLy8gRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBzbyB0aGF0IHdlIGNhbiBwZXJmb3JtIGVycm9yIHJlY292ZXJ5LgogICAgYXNzZXJ0KGlzVG9wTGV2ZWwgfHwgaGVscGVyICE9IG51bGwpOwoKICAgIC8vIFdoZW4gZG9pbmcgdG9wIGxldmVsIGluZmVyZW5jZSwgd2Ugc2tpcCBzdWJleHByZXNzaW9ucyB3aG9zZSB0eXBlIGlzbid0CiAgICAvLyBuZWVkZWQgc28gdGhhdCB3ZSBkb24ndCBpbmR1Y2UgYm9ndXMgZGVwZW5kZW5jaWVzIG9uIGZpZWxkcyBtZW50aW9uZWQgaW4KICAgIC8vIHRob3NlIHN1YmV4cHJlc3Npb25zLgogICAgaWYgKCF0eXBlTmVlZGVkKSByZXR1cm4gbnVsbDsKCiAgICBJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSW5mZXJlbmNlVmlzaXRvcih0aGlzKTsKICAgIGlmIChleHByZXNzaW9uIGlzIEV4cHJlc3Npb25KdWRnbWVudCkgewogICAgICBleHByZXNzaW9uLmFjY2VwdEluZmVyZW5jZSh2aXNpdG9yLCB0eXBlQ29udGV4dCk7CiAgICB9IGVsc2UgewogICAgICBleHByZXNzaW9uLmFjY2VwdDEodmlzaXRvciwgdHlwZUNvbnRleHQpOwogICAgfQogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0gZ2V0SW5mZXJyZWRUeXBlKGV4cHJlc3Npb24sIHRoaXMpOwogICAgaWYgKGluZmVycmVkVHlwZSBpcyBWb2lkVHlwZSAmJiAhaXNWb2lkQWxsb3dlZCkgewogICAgICBpZiAoZXhwcmVzc2lvbi5wYXJlbnQgaXMhIEFyZ3VtZW50c0p1ZGdtZW50KSB7CiAgICAgICAgaGVscGVyPy5hZGRQcm9ibGVtKAogICAgICAgICAgICBtZXNzYWdlVm9pZEV4cHJlc3Npb24sIGV4cHJlc3Npb24uZmlsZU9mZnNldCwgbm9MZW5ndGgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaW5mZXJyZWRUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBpbmZlckluaXRpYWxpemVyKAogICAgICBJbmZlcmVuY2VIZWxwZXIgaGVscGVyLCBrZXJuZWwuSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpIHsKICAgIGFzc2VydChpbml0aWFsaXplciBpcyBJbml0aWFsaXplckp1ZGdtZW50KTsKICAgIHRoaXMuaGVscGVyID0gaGVscGVyOwogICAgLy8gVXNlIHBvbHltb3JwaGljIGRpc3BhdGNoIG9uIFtLZXJuZWxJbml0aWFsaXplcl0gdG8gcGVyZm9ybSB3aGF0ZXZlcgogICAgLy8ga2luZCBvZiB0eXBlIGluZmVyZW5jZSBpcyBjb3JyZWN0IGZvciB0aGlzIGtpbmQgb2YgaW5pdGlhbGl6ZXIuCiAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGV4cGVyaW1lbnQgdG8gc2VlIGlmIGR5bmFtaWMgZGlzcGF0Y2ggd291bGQgYmUgYmV0dGVyLAogICAgLy8gc28gdGhhdCB0aGUgdHlwZSBoaWVyYXJjaHkgd2lsbCBiZSBzaW1wbGVyICh3aGljaCBtYXkgc3BlZWQgdXAgImlzIgogICAgLy8gY2hlY2tzKS4KICAgIEluaXRpYWxpemVySnVkZ21lbnQga2VybmVsSW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcjsKICAgIGtlcm5lbEluaXRpYWxpemVyLmFjY2VwdEluZmVyZW5jZShuZXcgSW5mZXJlbmNlVmlzaXRvcih0aGlzKSk7CiAgICB0aGlzLmhlbHBlciA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGluZmVyU3RhdGVtZW50KFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIC8vIEZvciBmdWxsIChub24tdG9wIGxldmVsKSBpbmZlcmVuY2UsIHdlIG5lZWQgYWNjZXNzIHRvIHRoZQogICAgLy8gRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBzbyB0aGF0IHdlIGNhbiBwZXJmb3JtIGVycm9yIHJlY292ZXJ5LgogICAgaWYgKCFpc1RvcExldmVsKSBhc3NlcnQoaGVscGVyICE9IG51bGwpOwoKICAgIGlmIChzdGF0ZW1lbnQgaXMgU3RhdGVtZW50SnVkZ21lbnQpIHsKICAgICAgLy8gVXNlIHBvbHltb3JwaGljIGRpc3BhdGNoIG9uIFtLZXJuZWxTdGF0ZW1lbnRdIHRvIHBlcmZvcm0gd2hhdGV2ZXIga2luZAogICAgICAvLyBvZiB0eXBlIGluZmVyZW5jZSBpcyBjb3JyZWN0IGZvciB0aGlzIGtpbmQgb2Ygc3RhdGVtZW50LgogICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGV4cGVyaW1lbnQgdG8gc2VlIGlmIGR5bmFtaWMgZGlzcGF0Y2ggd291bGQgYmUgYmV0dGVyLAogICAgICAvLyBzbyB0aGF0IHRoZSB0eXBlIGhpZXJhcmNoeSB3aWxsIGJlIHNpbXBsZXIgKHdoaWNoIG1heSBzcGVlZCB1cCAiaXMiCiAgICAgIC8vIGNoZWNrcykuCiAgICAgIHJldHVybiBzdGF0ZW1lbnQuYWNjZXB0SW5mZXJlbmNlKG5ldyBJbmZlcmVuY2VWaXNpdG9yKHRoaXMpKTsKICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50IGlzIEZvckluU3RhdGVtZW50KSB7CiAgICAgIHJldHVybiBzdGF0ZW1lbnQuYWNjZXB0MShuZXcgSW5mZXJlbmNlVmlzaXRvcih0aGlzKSwgbnVsbCk7CiAgICB9IGVsc2UgaWYgKHN0YXRlbWVudCBpcyBMYWJlbGVkU3RhdGVtZW50KSB7CiAgICAgIHJldHVybiBzdGF0ZW1lbnQuYWNjZXB0MShuZXcgSW5mZXJlbmNlVmlzaXRvcih0aGlzKSwgbnVsbCk7CiAgICB9IGVsc2UgaWYgKHN0YXRlbWVudCBpcyBCcmVha1N0YXRlbWVudCkgewogICAgICByZXR1cm4gc3RhdGVtZW50LmFjY2VwdDEobmV3IEluZmVyZW5jZVZpc2l0b3IodGhpcyksIG51bGwpOwogICAgfSBlbHNlIHsKICAgICAgLy8gRW5jb3VudGVyZWQgYSBzdGF0ZW1lbnQgdHlwZSBmb3Igd2hpY2ggdHlwZSBpbmZlcmVuY2UgaXMgbm90IHlldAogICAgICAvLyBpbXBsZW1lbnRlZCwgc28ganVzdCBza2lwIGl0IGZvciBub3cuCiAgICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogb25jZSB0aGUgQm9keUJ1aWxkZXIgdXNlcyBzaGFkb3cgY2xhc3NlcyBmb3IKICAgICAgLy8gZXZlcnl0aGluZywgdGhpcyBjYXNlIHNob3VsZCBubyBsb25nZXIgYmUgbmVlZGVkLgogICAgfQogIH0KfQoKY2xhc3MgVHlwZUxpdGVyYWxKdWRnbWVudCBleHRlbmRzIFR5cGVMaXRlcmFsIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIFR5cGVMaXRlcmFsSnVkZ21lbnQoRGFydFR5cGUgdHlwZSkgOiBzdXBlcih0eXBlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRUeXBlTGl0ZXJhbEp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBbVHlwZVByb21vdGVyXSBzcGVjaWFsaXplZCB0byB3b3JrIHdpdGgga2VybmVsCi8vLyBvYmplY3RzLgpjbGFzcyBTaGFkb3dUeXBlUHJvbW90ZXIgZXh0ZW5kcyBUeXBlUHJvbW90ZXJJbXBsIHsKICBTaGFkb3dUeXBlUHJvbW90ZXIucHJpdmF0ZShUeXBlU2NoZW1hRW52aXJvbm1lbnQgdHlwZVNjaGVtYUVudmlyb25tZW50KQogICAgICA6IHN1cGVyLnByaXZhdGUodHlwZVNjaGVtYUVudmlyb25tZW50KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldFZhcmlhYmxlRnVuY3Rpb25OZXN0aW5nTGV2ZWwoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgaWYgKHZhcmlhYmxlIGlzIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCkgewogICAgICByZXR1cm4gdmFyaWFibGUuX2Z1bmN0aW9uTmVzdGluZ0xldmVsOwogICAgfSBlbHNlIHsKICAgICAgLy8gSGFjayB0byBkZWFsIHdpdGggdGhlIGZhY3QgdGhhdCBCb2R5QnVpbGRlciBzdGlsbCBjcmVhdGVzIHJhdwogICAgICAvLyBWYXJpYWJsZURlY2xhcmF0aW9uIG9iamVjdHMgc29tZXRpbWVzLgogICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGdldCByaWQgb2YgdGhpcyBvbmNlIHRoZSB0eXBlIHBhcmFtZXRlciBpcwogICAgICAvLyBLZXJuZWxWYXJpYWJsZURlY2xhcmF0aW9uLgogICAgICByZXR1cm4gMDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNQcm9tb3Rpb25DYW5kaWRhdGUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgYXNzZXJ0KHZhcmlhYmxlIGlzIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCk7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQga2VybmVsVmFyaWFibGVEZWNsYXJhdGlvbiA9IHZhcmlhYmxlOwogICAgcmV0dXJuICFrZXJuZWxWYXJpYWJsZURlY2xhcmF0aW9uLl9pc0xvY2FsRnVuY3Rpb247CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHNhbWVFeHByZXNzaW9ucyhFeHByZXNzaW9uIGEsIEV4cHJlc3Npb24gYikgewogICAgcmV0dXJuIGlkZW50aWNhbChhLCBiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgc2V0VmFyaWFibGVNdXRhdGVkQW55d2hlcmUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgaWYgKHZhcmlhYmxlIGlzIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCkgewogICAgICB2YXJpYWJsZS5fbXV0YXRlZEFueXdoZXJlID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEhhY2sgdG8gZGVhbCB3aXRoIHRoZSBmYWN0IHRoYXQgQm9keUJ1aWxkZXIgc3RpbGwgY3JlYXRlcyByYXcKICAgICAgLy8gVmFyaWFibGVEZWNsYXJhdGlvbiBvYmplY3RzIHNvbWV0aW1lcy4KICAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiBnZXQgcmlkIG9mIHRoaXMgb25jZSB0aGUgdHlwZSBwYXJhbWV0ZXIgaXMKICAgICAgLy8gS2VybmVsVmFyaWFibGVEZWNsYXJhdGlvbi4KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgc2V0VmFyaWFibGVNdXRhdGVkSW5DbG9zdXJlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgIGlmICh2YXJpYWJsZSBpcyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQpIHsKICAgICAgdmFyaWFibGUuX211dGF0ZWRJbkNsb3N1cmUgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgLy8gSGFjayB0byBkZWFsIHdpdGggdGhlIGZhY3QgdGhhdCBCb2R5QnVpbGRlciBzdGlsbCBjcmVhdGVzIHJhdwogICAgICAvLyBWYXJpYWJsZURlY2xhcmF0aW9uIG9iamVjdHMgc29tZXRpbWVzLgogICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGdldCByaWQgb2YgdGhpcyBvbmNlIHRoZSB0eXBlIHBhcmFtZXRlciBpcwogICAgICAvLyBLZXJuZWxWYXJpYWJsZURlY2xhcmF0aW9uLgogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB3YXNWYXJpYWJsZU11dGF0ZWRBbnl3aGVyZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICBpZiAodmFyaWFibGUgaXMgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50KSB7CiAgICAgIHJldHVybiB2YXJpYWJsZS5fbXV0YXRlZEFueXdoZXJlOwogICAgfSBlbHNlIHsKICAgICAgLy8gSGFjayB0byBkZWFsIHdpdGggdGhlIGZhY3QgdGhhdCBCb2R5QnVpbGRlciBzdGlsbCBjcmVhdGVzIHJhdwogICAgICAvLyBWYXJpYWJsZURlY2xhcmF0aW9uIG9iamVjdHMgc29tZXRpbWVzLgogICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGdldCByaWQgb2YgdGhpcyBvbmNlIHRoZSB0eXBlIHBhcmFtZXRlciBpcwogICAgICAvLyBLZXJuZWxWYXJpYWJsZURlY2xhcmF0aW9uLgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9Cn0KCmNsYXNzIFZhcmlhYmxlQXNzaWdubWVudEp1ZGdtZW50IGV4dGVuZHMgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCB7CiAgVmFyaWFibGVBc3NpZ25tZW50SnVkZ21lbnQuXyhFeHByZXNzaW9uIHJocykgOiBzdXBlci5fKHJocyk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VmFyaWFibGVBc3NpZ25tZW50SnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgdmFyaWFibGUgZGVjbGFyYXRpb24gaW4ga2VybmVsIGZvcm0uCmNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCBleHRlbmRzIFZhcmlhYmxlRGVjbGFyYXRpb24KICAgIGltcGxlbWVudHMgU3RhdGVtZW50SnVkZ21lbnQgewogIGZpbmFsIGJvb2wgZm9yU3ludGhldGljVG9rZW47CgogIGZpbmFsIGJvb2wgX2ltcGxpY2l0bHlUeXBlZDsKCiAgLy8gVE9ETyhhaGUpOiBSZW1vdmUgdGhpcyBmaWVsZC4gV2UgY2FuIGdldCByaWQgb2YgaXQgYnkgcmVjb3JkaW5nIGNsb3N1cmUKICAvLyBtdXRhdGlvbiBpbiBbQm9keUJ1aWxkZXJdLgogIGZpbmFsIGludCBfZnVuY3Rpb25OZXN0aW5nTGV2ZWw7CgogIC8vIFRPRE8oYWhlKTogUmVtb3ZlIHRoaXMgZmllbGQuIEl0J3Mgb25seSB1c2VkIGxvY2FsbHkgd2hlbiBjb21waWxpbmcgYQogIC8vIG1ldGhvZCwgYW5kIHRoaXMgY2FuIHRodXMgYmUgdHJhY2tlZCBpbiBhIFtTZXRdIChhY3R1YWxseSwgdHJhY2tpbmcgdGhpcwogIC8vIGluZm9ybWF0aW9uIGluIGEgW0xpc3RdIGlzIHByb2JhYmx5IGV2ZW4gZmFzdGVyIGFzIHRoZSBhdmVyYWdlIHNpemUgd2lsbAogIC8vIGJlIGNsb3NlIHRvIHplcm8pLgogIGJvb2wgX211dGF0ZWRJbkNsb3N1cmUgPSBmYWxzZTsKCiAgLy8gVE9ETyhhaGUpOiBJbnZlc3RpZ2F0ZSBpZiB0aGlzIGNhbiBiZSByZW1vdmVkLgogIGJvb2wgX211dGF0ZWRBbnl3aGVyZSA9IGZhbHNlOwoKICAvLyBUT0RPKGFoZSk6IEludmVzdGlnYXRlIGlmIHRoaXMgY2FuIGJlIHJlbW92ZWQuCiAgZmluYWwgYm9vbCBfaXNMb2NhbEZ1bmN0aW9uOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQoU3RyaW5nIG5hbWUsIHRoaXMuX2Z1bmN0aW9uTmVzdGluZ0xldmVsLAogICAgICB7dGhpcy5mb3JTeW50aGV0aWNUb2tlbjogZmFsc2UsCiAgICAgIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIsCiAgICAgIERhcnRUeXBlIHR5cGUsCiAgICAgIGJvb2wgaXNGaW5hbDogZmFsc2UsCiAgICAgIGJvb2wgaXNDb25zdDogZmFsc2UsCiAgICAgIGJvb2wgaXNGaWVsZEZvcm1hbDogZmFsc2UsCiAgICAgIGJvb2wgaXNDb3ZhcmlhbnQ6IGZhbHNlLAogICAgICBib29sIGlzTG9jYWxGdW5jdGlvbjogZmFsc2V9KQogICAgICA6IF9pbXBsaWNpdGx5VHlwZWQgPSB0eXBlID09IG51bGwsCiAgICAgICAgX2lzTG9jYWxGdW5jdGlvbiA9IGlzTG9jYWxGdW5jdGlvbiwKICAgICAgICBzdXBlcihuYW1lLAogICAgICAgICAgICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsCiAgICAgICAgICAgIHR5cGU6IHR5cGUgPz8gY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgICAgICAgaXNGaW5hbDogaXNGaW5hbCwKICAgICAgICAgICAgaXNDb25zdDogaXNDb25zdCwKICAgICAgICAgICAgaXNGaWVsZEZvcm1hbDogaXNGaWVsZEZvcm1hbCwKICAgICAgICAgICAgaXNDb3ZhcmlhbnQ6IGlzQ292YXJpYW50KTsKCiAgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50LmZvckVmZmVjdCgKICAgICAgRXhwcmVzc2lvbiBpbml0aWFsaXplciwgdGhpcy5fZnVuY3Rpb25OZXN0aW5nTGV2ZWwpCiAgICAgIDogZm9yU3ludGhldGljVG9rZW4gPSBmYWxzZSwKICAgICAgICBfaW1wbGljaXRseVR5cGVkID0gZmFsc2UsCiAgICAgICAgX2lzTG9jYWxGdW5jdGlvbiA9IGZhbHNlLAogICAgICAgIHN1cGVyLmZvclZhbHVlKGluaXRpYWxpemVyKTsKCiAgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50LmZvclZhbHVlKAogICAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyLCB0aGlzLl9mdW5jdGlvbk5lc3RpbmdMZXZlbCkKICAgICAgOiBmb3JTeW50aGV0aWNUb2tlbiA9IGZhbHNlLAogICAgICAgIF9pbXBsaWNpdGx5VHlwZWQgPSB0cnVlLAogICAgICAgIF9pc0xvY2FsRnVuY3Rpb24gPSBmYWxzZSwKICAgICAgICBzdXBlci5mb3JWYWx1ZShpbml0aWFsaXplcik7CgogIEV4cHJlc3Npb24gZ2V0IGluaXRpYWxpemVySnVkZ21lbnQgPT4gaW5pdGlhbGl6ZXI7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQodGhpcyk7CiAgfQoKICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIFtWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnRdIGhhZCBhbiBpbXBsaWNpdAogIC8vLyB0eXBlLgogIC8vLwogIC8vLyBUaGlzIGlzIHN0YXRpYyB0byBhdm9pZCBpbnRyb2R1Y2luZyBhIG1ldGhvZCB0aGF0IHdvdWxkIGJlIHZpc2libGUgdG8KICAvLy8gdGhlIGtlcm5lbC4KICBzdGF0aWMgYm9vbCBpc0ltcGxpY2l0bHlUeXBlZChWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQgdmFyaWFibGUpID0+CiAgICAgIHZhcmlhYmxlLl9pbXBsaWNpdGx5VHlwZWQ7CgogIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIFtWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnRdIHJlcHJlc2VudHMgYQogIC8vLyBsb2NhbCBmdW5jdGlvbi4KICAvLy8KICAvLy8gVGhpcyBpcyBzdGF0aWMgdG8gYXZvaWQgaW50cm9kdWNpbmcgYSBtZXRob2QgdGhhdCB3b3VsZCBiZSB2aXNpYmxlIHRvIHRoZQogIC8vLyBrZXJuZWwuCiAgc3RhdGljIGJvb2wgaXNMb2NhbEZ1bmN0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCB2YXJpYWJsZSkgPT4KICAgICAgdmFyaWFibGUuX2lzTG9jYWxGdW5jdGlvbjsKfQoKLy8vIFN5bnRoZXRpYyBqdWRnbWVudCBjbGFzcyByZXByZXNlbnRpbmcgYW4gYXR0ZW1wdCB0byBpbnZva2UgYW4gdW5yZXNvbHZlZAovLy8gdGFyZ2V0LgpjbGFzcyBVbnJlc29sdmVkVGFyZ2V0SW52b2NhdGlvbkp1ZGdtZW50IGV4dGVuZHMgU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBmaW5hbCBBcmd1bWVudHNKdWRnbWVudCBhcmd1bWVudHNKdWRnbWVudDsKCiAgVW5yZXNvbHZlZFRhcmdldEludm9jYXRpb25KdWRnbWVudC5fKAogICAgICBrZXJuZWwuRXhwcmVzc2lvbiBkZXN1Z2FyZWQsIHRoaXMuYXJndW1lbnRzSnVkZ21lbnQpCiAgICAgIDogc3VwZXIuXyhkZXN1Z2FyZWQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFVucmVzb2x2ZWRUYXJnZXRJbnZvY2F0aW9uSnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIFN5bnRoZXRpYyBqdWRnbWVudCBjbGFzcyByZXByZXNlbnRpbmcgYW4gYXR0ZW1wdCB0byBhc3NpZ24gdG8gYW4gdW5yZXNvbHZlZAovLy8gdmFyaWFibGUuCmNsYXNzIFVucmVzb2x2ZWRWYXJpYWJsZUFzc2lnbm1lbnRKdWRnbWVudCBleHRlbmRzIFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudCB7CiAgZmluYWwgYm9vbCBpc0NvbXBvdW5kOwogIGZpbmFsIEV4cHJlc3Npb24gcmhzOwoKICBVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50SnVkZ21lbnQuXygKICAgICAga2VybmVsLkV4cHJlc3Npb24gZGVzdWdhcmVkLCB0aGlzLmlzQ29tcG91bmQsIHRoaXMucmhzKQogICAgICA6IHN1cGVyLl8oZGVzdWdhcmVkKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50SnVkZ21lbnQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgcmVhZCBmcm9tIGEgdmFyaWFibGUgaW4ga2VybmVsIGZvcm0uCmNsYXNzIFZhcmlhYmxlR2V0SnVkZ21lbnQgZXh0ZW5kcyBWYXJpYWJsZUdldCBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICBmaW5hbCBUeXBlUHJvbW90aW9uRmFjdCBfZmFjdDsKCiAgZmluYWwgVHlwZVByb21vdGlvblNjb3BlIF9zY29wZTsKCiAgVmFyaWFibGVHZXRKdWRnbWVudChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCB0aGlzLl9mYWN0LCB0aGlzLl9zY29wZSkKICAgICAgOiBzdXBlcih2YXJpYWJsZSk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VmFyaWFibGVHZXRKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSB3aGlsZSBsb29wIGluIGtlcm5lbCBmb3JtLgpjbGFzcyBXaGlsZUp1ZGdtZW50IGV4dGVuZHMgV2hpbGVTdGF0ZW1lbnQgaW1wbGVtZW50cyBTdGF0ZW1lbnRKdWRnbWVudCB7CiAgV2hpbGVKdWRnbWVudChFeHByZXNzaW9uIGNvbmRpdGlvbiwgU3RhdGVtZW50IGJvZHkpIDogc3VwZXIoY29uZGl0aW9uLCBib2R5KTsKCiAgRXhwcmVzc2lvbiBnZXQgY29uZGl0aW9uSnVkZ21lbnQgPT4gY29uZGl0aW9uOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0V2hpbGVKdWRnbWVudCh0aGlzKTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIHlpZWxkIHN0YXRlbWVudCBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgWWllbGRKdWRnbWVudCBleHRlbmRzIFlpZWxkU3RhdGVtZW50IGltcGxlbWVudHMgU3RhdGVtZW50SnVkZ21lbnQgewogIFlpZWxkSnVkZ21lbnQoYm9vbCBpc1lpZWxkU3RhciwgRXhwcmVzc2lvbiBleHByZXNzaW9uKQogICAgICA6IHN1cGVyKGV4cHJlc3Npb24sIGlzWWllbGRTdGFyOiBpc1lpZWxkU3Rhcik7CgogIEV4cHJlc3Npb24gZ2V0IGp1ZGdtZW50ID0+IGV4cHJlc3Npb247CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRZaWVsZEp1ZGdtZW50KHRoaXMpOwogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgZGVmZXJyZWQgbG9hZCBsaWJyYXJ5IGNhbGwuCmNsYXNzIExvYWRMaWJyYXJ5SnVkZ21lbnQgZXh0ZW5kcyBMb2FkTGlicmFyeSBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgZmluYWwgQXJndW1lbnRzIGFyZ3VtZW50czsKCiAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICBMb2FkTGlicmFyeUp1ZGdtZW50KExpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCwgdGhpcy5hcmd1bWVudHMpIDogc3VwZXIoaW1wb3J0KTsKCiAgQXJndW1lbnRzSnVkZ21lbnQgZ2V0IGFyZ3VtZW50SnVkZ21lbnRzID0+IGFyZ3VtZW50czsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRMb2FkTGlicmFyeUp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBDb25jcmV0ZSBzaGFkb3cgb2JqZWN0IHJlcHJlc2VudGluZyBhIHRlYXItb2ZmIG9mIGEgYGxvYWRMaWJyYXJ5YCBmdW5jdGlvbi4KY2xhc3MgTG9hZExpYnJhcnlUZWFyT2ZmSnVkZ21lbnQgZXh0ZW5kcyBTdGF0aWNHZXQKICAgIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBmaW5hbCBMaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQ7CgogIERhcnRUeXBlIGluZmVycmVkVHlwZTsKCiAgTG9hZExpYnJhcnlUZWFyT2ZmSnVkZ21lbnQodGhpcy5pbXBvcnQsIFByb2NlZHVyZSB0YXJnZXQpIDogc3VwZXIodGFyZ2V0KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRMb2FkTGlicmFyeVRlYXJPZmZKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gVGhlIHJlc3VsdCBvZiBpbmZlcmVuY2UgZm9yIGEgUkhTIG9mIGFuIGFzc2lnbm1lbnQuCmNsYXNzIF9Db21wbGV4QXNzaWdubWVudEluZmVyZW5jZVJlc3VsdCB7CiAgLy8vIFRoZSByZXNvbHZlZCBjb21iaW5lciBbUHJvY2VkdXJlXSwgZS5nLiBgb3BlcmF0b3IrYCBmb3IgYGEgKz0gMmAsIG9yCiAgLy8vIGBudWxsYCBpZiB0aGUgYXNzaWdubWVudCBpcyBub3QgY29tcG91bmQuCiAgZmluYWwgUHJvY2VkdXJlIGNvbWJpbmVyOwoKICBfQ29tcGxleEFzc2lnbm1lbnRJbmZlcmVuY2VSZXN1bHQodGhpcy5jb21iaW5lcik7Cn0KCmNsYXNzIF9VbmZpbmlzaGVkQ2FzY2FkZSBleHRlbmRzIEV4cHJlc3Npb24gewogIGFjY2VwdCh2KSA9PiB1bnN1cHBvcnRlZCgiYWNjZXB0IiwgLTEsIG51bGwpOwoKICBhY2NlcHQxKHYsIGFyZykgPT4gdW5zdXBwb3J0ZWQoImFjY2VwdDEiLCAtMSwgbnVsbCk7CgogIGdldFN0YXRpY1R5cGUodHlwZXMpID0+IHVuc3VwcG9ydGVkKCJnZXRTdGF0aWNUeXBlIiwgLTEsIG51bGwpOwoKICB0cmFuc2Zvcm1DaGlsZHJlbih2KSA9PiB1bnN1cHBvcnRlZCgidHJhbnNmb3JtQ2hpbGRyZW4iLCAtMSwgbnVsbCk7CgogIHZpc2l0Q2hpbGRyZW4odikgPT4gdW5zdXBwb3J0ZWQoInZpc2l0Q2hpbGRyZW4iLCAtMSwgbnVsbCk7Cn0KCmNsYXNzIFN5bnRoZXRpY1dyYXBwZXIgewogIHN0YXRpYyBFeHByZXNzaW9uIHdyYXBJbGxlZ2FsQXNzaWdubWVudChFeHByZXNzaW9uIHJocywKICAgICAge2ludCBhc3NpZ25tZW50T2Zmc2V0OiAtMX0pIHsKICAgIHJldHVybiBuZXcgSWxsZWdhbEFzc2lnbm1lbnRKdWRnbWVudC5fKHJocywKICAgICAgICBhc3NpZ25tZW50T2Zmc2V0OiBhc3NpZ25tZW50T2Zmc2V0KQogICAgICAuLmZpbGVPZmZzZXQgPSByaHMuZmlsZU9mZnNldDsKICB9CgogIHN0YXRpYyBFeHByZXNzaW9uIHdyYXBJbmRleEFzc2lnbm1lbnQoCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsIEV4cHJlc3Npb24gaW5kZXgsIEV4cHJlc3Npb24gcmhzLAogICAgICB7Ym9vbCBpc1N1cGVyOiBmYWxzZX0pIHsKICAgIHJldHVybiBuZXcgSW5kZXhBc3NpZ25tZW50SnVkZ21lbnQuXyhyZWNlaXZlciwgaW5kZXgsIHJocywgaXNTdXBlcjogaXNTdXBlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gaW5kZXguZmlsZU9mZnNldDsKICB9CgogIHN0YXRpYyBFeHByZXNzaW9uIHdyYXBJbnZhbGlkQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICBrZXJuZWwuRXhwcmVzc2lvbiBkZXN1Z2FyZWQsIE1lbWJlciBjb25zdHJ1Y3RvciwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIG5ldyBJbnZhbGlkQ29uc3RydWN0b3JJbnZvY2F0aW9uSnVkZ21lbnQuXygKICAgICAgICBkZXN1Z2FyZWQsIGNvbnN0cnVjdG9yLCBhcmd1bWVudHMpCiAgICAgIC4uZmlsZU9mZnNldCA9IGRlc3VnYXJlZC5maWxlT2Zmc2V0OwogIH0KCiAgc3RhdGljIEV4cHJlc3Npb24gd3JhcEludmFsaWRXcml0ZSgKICAgICAgRXhwcmVzc2lvbiBkZXN1Z2FyZWQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgcmV0dXJuIG5ldyBJbnZhbGlkV3JpdGVKdWRnbWVudC5fKGRlc3VnYXJlZCwgZXhwcmVzc2lvbikKICAgICAgLi5maWxlT2Zmc2V0ID0gZGVzdWdhcmVkLmZpbGVPZmZzZXQ7CiAgfQoKICBzdGF0aWMgRXhwcmVzc2lvbiB3cmFwUHJvcGVydHlBc3NpZ25tZW50KEV4cHJlc3Npb24gcmVjZWl2ZXIsIEV4cHJlc3Npb24gcmhzLAogICAgICB7Ym9vbCBpc1N1cGVyOiBmYWxzZX0pIHsKICAgIHJldHVybiBuZXcgUHJvcGVydHlBc3NpZ25tZW50SnVkZ21lbnQuXyhyZWNlaXZlciwgcmhzLCBpc1N1cGVyOiBpc1N1cGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSByaHMuZmlsZU9mZnNldDsKICB9CgogIHN0YXRpYyBFeHByZXNzaW9uIHdyYXBTdGF0aWNBc3NpZ25tZW50KEV4cHJlc3Npb24gcmhzKSB7CiAgICByZXR1cm4gbmV3IFN0YXRpY0Fzc2lnbm1lbnRKdWRnbWVudC5fKHJocykuLmZpbGVPZmZzZXQgPSByaHMuZmlsZU9mZnNldDsKICB9CgogIHN0YXRpYyBFeHByZXNzaW9uIHdyYXBTeW50aGV0aWNFeHByZXNzaW9uKEV4cHJlc3Npb24gZGVzdWdhcmVkKSB7CiAgICByZXR1cm4gbmV3IFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudC5fKGRlc3VnYXJlZCkKICAgICAgLi5maWxlT2Zmc2V0ID0gZGVzdWdhcmVkLmZpbGVPZmZzZXQ7CiAgfQoKICBzdGF0aWMgRXhwcmVzc2lvbiB3cmFwVW5yZXNvbHZlZFRhcmdldEludm9jYXRpb24oCiAgICAgIEV4cHJlc3Npb24gZGVzdWdhcmVkLCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IFVucmVzb2x2ZWRUYXJnZXRJbnZvY2F0aW9uSnVkZ21lbnQuXyhkZXN1Z2FyZWQsIGFyZ3VtZW50cykKICAgICAgLi5maWxlT2Zmc2V0ID0gZGVzdWdhcmVkLmZpbGVPZmZzZXQ7CiAgfQoKICBzdGF0aWMgRXhwcmVzc2lvbiB3cmFwVW5yZXNvbHZlZFZhcmlhYmxlQXNzaWdubWVudCgKICAgICAgRXhwcmVzc2lvbiBkZXN1Z2FyZWQsIGJvb2wgaXNDb21wb3VuZCwgRXhwcmVzc2lvbiByaHMpIHsKICAgIHJldHVybiBuZXcgVW5yZXNvbHZlZFZhcmlhYmxlQXNzaWdubWVudEp1ZGdtZW50Ll8oCiAgICAgICAgZGVzdWdhcmVkLCBpc0NvbXBvdW5kLCByaHMpCiAgICAgIC4uZmlsZU9mZnNldCA9IGRlc3VnYXJlZC5maWxlT2Zmc2V0OwogIH0KCiAgc3RhdGljIEV4cHJlc3Npb24gd3JhcFZhcmlhYmxlQXNzaWdubWVudChFeHByZXNzaW9uIHJocykgewogICAgcmV0dXJuIG5ldyBWYXJpYWJsZUFzc2lnbm1lbnRKdWRnbWVudC5fKHJocykuLmZpbGVPZmZzZXQgPSByaHMu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TQQBRDgrBAE0M0orBAE2PzckKwQBPU8EAgE5cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfc2hhZG93X2FzdC5kYXJ0QnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvaW5mZXJlbmNlX3Zpc2l0b3IuZGFydMABQX4vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiAia2VybmVsX3NoYWRvd19hc3QuZGFydCI7CgpjbGFzcyBJbmZlcmVuY2VWaXNpdG9yIGV4dGVuZHMgQm9keVZpc2l0b3IxPHZvaWQsIERhcnRUeXBlPiB7CiAgZmluYWwgU2hhZG93VHlwZUluZmVycmVyIGluZmVycmVyOwoKICBDbGFzcyBtYXBFbnRyeUNsYXNzOwoKICAvLyBTdG9yZXMgdGhlIG9mZnNldCBvZiB0aGUgbWFwIGVudHJ5IGZvdW5kIGJ5IGluZmVyTWFwRW50cnkuCiAgaW50IG1hcEVudHJ5T2Zmc2V0ID0gbnVsbDsKCiAgLy8gU3RvcmVzIHRoZSBvZmZzZXQgb2YgdGhlIG1hcCBzcHJlYWQgZm91bmQgYnkgaW5mZXJNYXBFbnRyeS4KICBpbnQgbWFwU3ByZWFkT2Zmc2V0ID0gbnVsbDsKCiAgLy8gU3RvcmVzIHRoZSBvZmZzZXQgb2YgdGhlIGl0ZXJhYmxlIHNwcmVhZCBmb3VuZCBieSBpbmZlck1hcEVudHJ5LgogIGludCBpdGVyYWJsZVNwcmVhZE9mZnNldCA9IG51bGw7CgogIC8vIFN0b3JlcyB0aGUgdHlwZSBvZiB0aGUgaXRlcmFibGUgc3ByZWFkIGZvdW5kIGJ5IGluZmVyTWFwRW50cnkuCiAgRGFydFR5cGUgaXRlcmFibGVTcHJlYWRUeXBlID0gbnVsbDsKCiAgSW5mZXJlbmNlVmlzaXRvcih0aGlzLmluZmVycmVyKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0RXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICB1bmhhbmRsZWQoIiR7bm9kZS5ydW50aW1lVHlwZX0iLCAiSW5mZXJlbmNlVmlzaXRvciIsIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICBpbmZlcnJlci5oZWxwZXIudXJpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdFN0YXRlbWVudChTdGF0ZW1lbnQgbm9kZSwgXykgewogICAgdW5oYW5kbGVkKCIke25vZGUucnVudGltZVR5cGV9IiwgIkluZmVyZW5jZVZpc2l0b3IiLCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5mZXJyZXIuaGVscGVyLnVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW52YWxpZEV4cHJlc3Npb24oSW52YWxpZEV4cHJlc3Npb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRMaXRlcmFsKEludExpdGVyYWwgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREb3VibGVMaXRlcmFsKERvdWJsZUxpdGVyYWwgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS5vcGVyYW5kLCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICB9CgogIHZvaWQgdmlzaXRBc3NlcnRJbml0aWFsaXplckp1ZGdtZW50KEFzc2VydEluaXRpYWxpemVySnVkZ21lbnQgbm9kZSkgewogICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5qdWRnbWVudCk7CiAgfQoKICB2b2lkIHZpc2l0QXNzZXJ0U3RhdGVtZW50SnVkZ21lbnQoQXNzZXJ0U3RhdGVtZW50SnVkZ21lbnQgbm9kZSkgewogICAgdmFyIGNvbmRpdGlvbkp1ZGdtZW50ID0gbm9kZS5jb25kaXRpb25KdWRnbWVudDsKICAgIHZhciBtZXNzYWdlSnVkZ21lbnQgPSBub2RlLm1lc3NhZ2VKdWRnbWVudDsKICAgIHZhciBleHBlY3RlZFR5cGUgPSBpbmZlcnJlci5jb3JlVHlwZXMuYm9vbENsYXNzLnJhd1R5cGU7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgY29uZGl0aW9uSnVkZ21lbnQsIGV4cGVjdGVkVHlwZSwgIWluZmVycmVyLmlzVG9wTGV2ZWwpOwogICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICBleHBlY3RlZFR5cGUsCiAgICAgICAgZ2V0SW5mZXJyZWRUeXBlKGNvbmRpdGlvbkp1ZGdtZW50LCBpbmZlcnJlciksCiAgICAgICAgY29uZGl0aW9uSnVkZ21lbnQsCiAgICAgICAgY29uZGl0aW9uSnVkZ21lbnQuZmlsZU9mZnNldCk7CiAgICBpZiAobWVzc2FnZUp1ZGdtZW50ICE9IG51bGwpIHsKICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgbWVzc2FnZUp1ZGdtZW50LCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgaWYgKCFpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaXNFbXB0eUNvbnRleHQodHlwZUNvbnRleHQpKSB7CiAgICAgIHR5cGVDb250ZXh0ID0gaW5mZXJyZXIud3JhcEZ1dHVyZU9yVHlwZSh0eXBlQ29udGV4dCk7CiAgICB9CiAgICB2YXIgb3BlcmFuZCA9IG5vZGUub3BlcmFuZDsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihvcGVyYW5kLCB0eXBlQ29udGV4dCwgdHJ1ZSwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBpbmZlcnJlci5zdG9yZUluZmVycmVkVHlwZSgKICAgICAgICBub2RlLAogICAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgICAgICAudW5mdXR1cmVUeXBlKGdldEluZmVycmVkVHlwZShvcGVyYW5kLCBpbmZlcnJlcikpKTsKICB9CgogIHZvaWQgdmlzaXRCbG9ja0p1ZGdtZW50KEJsb2NrSnVkZ21lbnQgbm9kZSkgewogICAgZm9yICh2YXIganVkZ21lbnQgaW4gbm9kZS5qdWRnbWVudHMpIHsKICAgICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQoanVkZ21lbnQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJvb2xMaXRlcmFsKEJvb2xMaXRlcmFsIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QnJlYWtTdGF0ZW1lbnQoQnJlYWtTdGF0ZW1lbnQgbm9kZSwgXykgewogICAgLy8gTm8gaW5mZXJlbmNlIG5lZWRzIHRvIGJlIGRvbmUuCiAgfQoKICB2b2lkIHZpc2l0Q2FzY2FkZUp1ZGdtZW50KENhc2NhZGVKdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgbm9kZS5pbmZlcnJlZFR5cGUgPQogICAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihub2RlLnRhcmdldEp1ZGdtZW50LCB0eXBlQ29udGV4dCwgdHJ1ZSk7CiAgICBub2RlLnZhcmlhYmxlLnR5cGUgPSBnZXRJbmZlcnJlZFR5cGUobm9kZSwgaW5mZXJyZXIpOwogICAgZm9yICh2YXIganVkZ21lbnQgaW4gbm9kZS5jYXNjYWRlSnVkZ21lbnRzKSB7CiAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgIGp1ZGdtZW50LCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICBDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHZhciBjb25kaXRpb24gPSBub2RlLmNvbmRpdGlvbjsKICAgIHZhciB0aGVuID0gbm9kZS50aGVuOwogICAgdmFyIG90aGVyd2lzZSA9IG5vZGUub3RoZXJ3aXNlOwogICAgdmFyIGV4cGVjdGVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZTsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihjb25kaXRpb24sIGV4cGVjdGVkVHlwZSwgIWluZmVycmVyLmlzVG9wTGV2ZWwpOwogICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICBleHBlY3RlZFR5cGUsCiAgICAgICAgZ2V0SW5mZXJyZWRUeXBlKGNvbmRpdGlvbiwgaW5mZXJyZXIpLAogICAgICAgIG5vZGUuY29uZGl0aW9uLAogICAgICAgIG5vZGUuY29uZGl0aW9uLmZpbGVPZmZzZXQpOwogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKHRoZW4sIHR5cGVDb250ZXh0LCB0cnVlLCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihvdGhlcndpc2UsIHR5cGVDb250ZXh0LCB0cnVlLCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgIC5nZXRTdGFuZGFyZFVwcGVyQm91bmQoZ2V0SW5mZXJyZWRUeXBlKHRoZW4sIGluZmVycmVyKSwKICAgICAgICAgICAgZ2V0SW5mZXJyZWRUeXBlKG90aGVyd2lzZSwgaW5mZXJyZXIpKTsKICAgIG5vZGUuc3RhdGljVHlwZSA9IGluZmVycmVkVHlwZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgIENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgdmFyIGxpYnJhcnkgPSBpbmZlcnJlci5lbmdpbmUuYmVpbmdJbmZlcnJlZFtub2RlLnRhcmdldF07CiAgICBpZiAobGlicmFyeSAhPSBudWxsKSB7CiAgICAgIC8vIFRoZXJlIGlzIGEgY3ljbGljIGRlcGVuZGVuY3kgd2hlcmUgaW5mZXJyaW5nIHRoZSB0eXBlcyBvZiB0aGUKICAgICAgLy8gaW5pdGlhbGl6aW5nIGZvcm1hbHMgb2YgYSBjb25zdHJ1Y3RvciByZXF1aXJlZCB1cyB0byBpbmZlciB0aGUKICAgICAgLy8gY29ycmVzcG9uZGluZyBmaWVsZCB0eXBlIHdoaWNoIHJlcXVpcmVkIHVzIHRvIGtub3cgdGhlIHR5cGUgb2YgdGhlCiAgICAgIC8vIGNvbnN0cnVjdG9yLgogICAgICBTdHJpbmcgbmFtZSA9IG5vZGUudGFyZ2V0LmVuY2xvc2luZ0NsYXNzLm5hbWU7CiAgICAgIGlmIChub2RlLnRhcmdldC5uYW1lLm5hbWUuaXNOb3RFbXB0eSkgewogICAgICAgIC8vIFRPRE8oYWhlKTogVXNlIGBpbmZlcnJlci5oZWxwZXIuY29uc3RydWN0b3JOYW1lRm9yRGlhZ25vc3RpY3NgCiAgICAgICAgLy8gaW5zdGVhZC4gSG93ZXZlciwgYGluZmVycmVyLmhlbHBlcmAgbWF5IGJlIG51bGwuCiAgICAgICAgbmFtZSArPSAiLiR7bm9kZS50YXJnZXQubmFtZS5uYW1lfSI7CiAgICAgIH0KICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eS53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgbm9kZS50YXJnZXQuZmlsZU9mZnNldCwKICAgICAgICAgIG5hbWUubGVuZ3RoLAogICAgICAgICAgbm9kZS50YXJnZXQuZmlsZVVyaSk7CiAgICAgIGZvciAodmFyIGRlY2xhcmF0aW9uIGluIG5vZGUudGFyZ2V0LmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgICAgZGVjbGFyYXRpb24udHlwZSA/Pz0gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgICAgfQogICAgICBmb3IgKHZhciBkZWNsYXJhdGlvbiBpbiBub2RlLnRhcmdldC5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgICBkZWNsYXJhdGlvbi50eXBlID8/PSBjb25zdCBJbnZhbGlkVHlwZSgpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKChsaWJyYXJ5ID0gaW5mZXJyZXIuZW5naW5lLnRvQmVJbmZlcnJlZFtub2RlLnRhcmdldF0pICE9IG51bGwpIHsKICAgICAgaW5mZXJyZXIuZW5naW5lLnRvQmVJbmZlcnJlZC5yZW1vdmUobm9kZS50YXJnZXQpOwogICAgICBpbmZlcnJlci5lbmdpbmUuYmVpbmdJbmZlcnJlZFtub2RlLnRhcmdldF0gPSBsaWJyYXJ5OwogICAgICBmb3IgKHZhciBkZWNsYXJhdGlvbiBpbiBub2RlLnRhcmdldC5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICAgIGluZmVycmVyLmVuZ2luZS5pbmZlckluaXRpYWxpemluZ0Zvcm1hbChkZWNsYXJhdGlvbiwgbm9kZS50YXJnZXQpOwogICAgICB9CiAgICAgIGZvciAodmFyIGRlY2xhcmF0aW9uIGluIG5vZGUudGFyZ2V0LmZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgICAgIGluZmVycmVyLmVuZ2luZS5pbmZlckluaXRpYWxpemluZ0Zvcm1hbChkZWNsYXJhdGlvbiwgbm9kZS50YXJnZXQpOwogICAgICB9CiAgICAgIGluZmVycmVyLmVuZ2luZS5iZWluZ0luZmVycmVkLnJlbW92ZShub2RlLnRhcmdldCk7CiAgICB9CiAgICBib29sIGhhc0V4cGxpY2l0VHlwZUFyZ3VtZW50cyA9CiAgICAgICAgZ2V0RXhwbGljaXRUeXBlQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKSAhPSBudWxsOwogICAgdmFyIGluZmVyZW5jZVJlc3VsdCA9IGluZmVycmVyLmluZmVySW52b2NhdGlvbigKICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgbm9kZS50YXJnZXQuZnVuY3Rpb24uZnVuY3Rpb25UeXBlLAogICAgICAgIGNvbXB1dGVDb25zdHJ1Y3RvclJldHVyblR5cGUobm9kZS50YXJnZXQpLAogICAgICAgIG5vZGUuYXJndW1lbnRzLAogICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgICBpbmZlcnJlci5zdG9yZUluZmVycmVkVHlwZShub2RlLCBpbmZlcmVuY2VSZXN1bHQudHlwZSk7CiAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwpIHsKICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGluZmVycmVyLmxpYnJhcnk7CiAgICAgIGlmICghaGFzRXhwbGljaXRUeXBlQXJndW1lbnRzKSB7CiAgICAgICAgbGlicmFyeS5jaGVja0JvdW5kc0luQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgICAgICBub2RlLCBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQsIGluZmVycmVyLmhlbHBlci51cmksCiAgICAgICAgICAgIGluZmVycmVkOiB0cnVlKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCB2aXNpdENvbnRpbnVlU3dpdGNoSnVkZ21lbnQoQ29udGludWVTd2l0Y2hKdWRnbWVudCBub2RlKSB7CiAgICAvLyBObyBpbmZlcmVuY2UgbmVlZHMgdG8gYmUgZG9uZS4KICB9CiAgdm9pZCB2aXNpdERlZmVycmVkQ2hlY2tKdWRnbWVudCgKICAgICAgRGVmZXJyZWRDaGVja0p1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICAvLyBTaW5jZSB0aGUgdmFyaWFibGUgaXMgbm90IHVzZWQgaW4gdGhlIGJvZHkgd2UgZG9uJ3QgbmVlZCB0byB0eXBlIGluZmVyCiAgICAvLyBpdC4gIFdlIGNhbiBqdXN0IHR5cGUgaW5mZXIgdGhlIGJvZHkuCiAgICB2YXIganVkZ21lbnQgPSBub2RlLmp1ZGdtZW50OwogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGp1ZGdtZW50LCB0eXBlQ29udGV4dCwgdHJ1ZSwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBub2RlLmluZmVycmVkVHlwZSA9IGdldEluZmVycmVkVHlwZShqdWRnbWVudCwgaW5mZXJyZXIpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIHZpc2l0RG9KdWRnbWVudChEb0p1ZGdtZW50IG5vZGUpIHsKICAgIHZhciBjb25kaXRpb25KdWRnbWVudCA9IG5vZGUuY29uZGl0aW9uSnVkZ21lbnQ7CiAgICBpbmZlcnJlci5pbmZlclN0YXRlbWVudChub2RlLmJvZHkpOwogICAgdmFyIGJvb2xUeXBlID0gaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlOwogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGNvbmRpdGlvbkp1ZGdtZW50LCBib29sVHlwZSwgIWluZmVycmVyLmlzVG9wTGV2ZWwpOwogICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICBib29sVHlwZSwKICAgICAgICBnZXRJbmZlcnJlZFR5cGUoY29uZGl0aW9uSnVkZ21lbnQsIGluZmVycmVyKSwKICAgICAgICBub2RlLmNvbmRpdGlvbiwKICAgICAgICBub2RlLmNvbmRpdGlvbi5maWxlT2Zmc2V0KTsKICB9CgogIHZvaWQgdmlzaXREb3VibGVKdWRnbWVudChEb3VibGVKdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBpbmZlcnJlci5jb3JlVHlwZXMuZG91YmxlQ2xhc3MucmF3VHlwZTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdEVtcHR5U3RhdGVtZW50SnVkZ21lbnQoRW1wdHlTdGF0ZW1lbnRKdWRnbWVudCBub2RlKSB7CiAgICAvLyBObyBpbmZlcmVuY2UgbmVlZHMgdG8gYmUgZG9uZS4KICB9CiAgdm9pZCB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnRKdWRnbWVudChFeHByZXNzaW9uU3RhdGVtZW50SnVkZ21lbnQgbm9kZSkgewogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUuanVkZ21lbnQsIGNvbnN0IFVua25vd25UeXBlKCksICFpbmZlcnJlci5pc1RvcExldmVsLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogIH0KCiAgdm9pZCB2aXNpdEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudCgKICAgICAgRmFjdG9yeUNvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBib29sIGhhZEV4cGxpY2l0VHlwZUFyZ3VtZW50cyA9CiAgICAgICAgZ2V0RXhwbGljaXRUeXBlQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKSAhPSBudWxsOwogICAgdmFyIGluZmVyZW5jZVJlc3VsdCA9IGluZmVycmVyLmluZmVySW52b2NhdGlvbigKICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgbm9kZS50YXJnZXQuZnVuY3Rpb24uZnVuY3Rpb25UeXBlLAogICAgICAgIGNvbXB1dGVDb25zdHJ1Y3RvclJldHVyblR5cGUobm9kZS50YXJnZXQpLAogICAgICAgIG5vZGUuYXJndW1lbnRKdWRnbWVudHMsCiAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gaW5mZXJlbmNlUmVzdWx0LnR5cGU7CiAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwpIHsKICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGluZmVycmVyLmxpYnJhcnk7CiAgICAgIGlmICghaGFkRXhwbGljaXRUeXBlQXJndW1lbnRzKSB7CiAgICAgICAgbGlicmFyeS5jaGVja0JvdW5kc0luRmFjdG9yeUludm9jYXRpb24oCiAgICAgICAgICAgIG5vZGUsIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudCwgaW5mZXJyZXIuaGVscGVyLnVyaSwKICAgICAgICAgICAgaW5mZXJyZWQ6IHRydWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgdmlzaXRTaGFkb3dGaWVsZEluaXRpYWxpemVyKFNoYWRvd0ZpZWxkSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgdmFyIGluaXRpYWxpemVyVHlwZSA9CiAgICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKG5vZGUudmFsdWUsIG5vZGUuZmllbGQudHlwZSwgdHJ1ZSk7CiAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgIG5vZGUuZmllbGQudHlwZSwgaW5pdGlhbGl6ZXJUeXBlLCBub2RlLnZhbHVlLCBub2RlLmZpbGVPZmZzZXQpOwogIH0KCiAgdm9pZCBoYW5kbGVGb3JJbkRlY2xhcmluZ1ZhcmlhYmxlKAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBFeHByZXNzaW9uIGl0ZXJhYmxlLCBTdGF0ZW1lbnQgYm9keSwKICAgICAge2Jvb2wgaXNBc3luYzogZmFsc2V9KSB7CiAgICBEYXJ0VHlwZSBlbGVtZW50VHlwZTsKICAgIGJvb2wgdHlwZU5lZWRlZCA9IGZhbHNlOwogICAgYm9vbCB0eXBlQ2hlY2tzTmVlZGVkID0gIWluZmVycmVyLmlzVG9wTGV2ZWw7CiAgICBpZiAoVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50LmlzSW1wbGljaXRseVR5cGVkKHZhcmlhYmxlKSkgewogICAgICB0eXBlTmVlZGVkID0gdHJ1ZTsKICAgICAgZWxlbWVudFR5cGUgPSBjb25zdCBVbmtub3duVHlwZSgpOwogICAgfSBlbHNlIHsKICAgICAgZWxlbWVudFR5cGUgPSB2YXJpYWJsZS50eXBlOwogICAgfQoKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9IGluZmVyRm9ySW5JdGVyYWJsZSgKICAgICAgICBpdGVyYWJsZSwgZWxlbWVudFR5cGUsIHR5cGVOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICBpc0FzeW5jOiBpc0FzeW5jKTsKICAgIGlmICh0eXBlTmVlZGVkKSB7CiAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKGluZmVycmVyLnVyaSwgdmFyaWFibGUuZmlsZU9mZnNldCwKICAgICAgICAgICd0eXBlJywgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZShpbmZlcnJlZFR5cGUpKTsKICAgICAgdmFyaWFibGUudHlwZSA9IGluZmVycmVkVHlwZTsKICAgIH0KCiAgICBpZiAoYm9keSAhPSBudWxsKSBpbmZlcnJlci5pbmZlclN0YXRlbWVudChib2R5KTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHRlbXBWYXIgPQogICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKG51bGwsIHR5cGU6IGluZmVycmVkVHlwZSwgaXNGaW5hbDogdHJ1ZSk7CiAgICBWYXJpYWJsZUdldCB2YXJpYWJsZUdldCA9IG5ldyBWYXJpYWJsZUdldCh0ZW1wVmFyKQogICAgICAuLmZpbGVPZmZzZXQgPSB2YXJpYWJsZS5maWxlT2Zmc2V0OwogICAgVHJlZU5vZGUgcGFyZW50ID0gdmFyaWFibGUucGFyZW50OwogICAgRXhwcmVzc2lvbiBpbXBsaWNpdERvd25jYXN0ID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICB2YXJpYWJsZS50eXBlLCBpbmZlcnJlZFR5cGUsIHZhcmlhYmxlR2V0LCBwYXJlbnQuZmlsZU9mZnNldCwKICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVGb3JJbkxvb3BFbGVtZW50VHlwZU5vdEFzc2lnbmFibGUpOwogICAgaWYgKGltcGxpY2l0RG93bmNhc3QgIT0gbnVsbCkgewogICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKHZhcmlhYmxlLCB0ZW1wVmFyKTsKICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIgPSBpbXBsaWNpdERvd25jYXN0Li5wYXJlbnQgPSB2YXJpYWJsZTsKICAgICAgaWYgKGJvZHkgPT0gbnVsbCkgewogICAgICAgIGlmIChwYXJlbnQgaXMgRm9ySW5FbGVtZW50KSB7CiAgICAgICAgICBwYXJlbnQucHJvbG9ndWUgPSB2YXJpYWJsZTsKICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpcyBGb3JJbk1hcEVudHJ5KSB7CiAgICAgICAgICBwYXJlbnQucHJvbG9ndWUgPSB2YXJpYWJsZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdW5oYW5kbGVkKCIke3BhcmVudC5ydW50aW1lVHlwZX0iLCAiaGFuZGxlRm9ySW5EZWNsYXJpbmdWYXJpYWJsZSIsCiAgICAgICAgICAgICAgdmFyaWFibGUuZmlsZU9mZnNldCwgdmFyaWFibGUubG9jYXRpb24uZmlsZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoYm9keSwgY29tYmluZVN0YXRlbWVudHModmFyaWFibGUsIGJvZHkpKTsKICAgICAgfQogICAgfQogIH0KCiAgRGFydFR5cGUgaW5mZXJGb3JJbkl0ZXJhYmxlKAogICAgICBFeHByZXNzaW9uIGl0ZXJhYmxlLCBEYXJ0VHlwZSBlbGVtZW50VHlwZSwgYm9vbCB0eXBlTmVlZGVkLAogICAgICB7Ym9vbCBpc0FzeW5jOiBmYWxzZX0pIHsKICAgIENsYXNzIGl0ZXJhYmxlQ2xhc3MgPSBpc0FzeW5jCiAgICAgICAgPyBpbmZlcnJlci5jb3JlVHlwZXMuc3RyZWFtQ2xhc3MKICAgICAgICA6IGluZmVycmVyLmNvcmVUeXBlcy5pdGVyYWJsZUNsYXNzOwogICAgRGFydFR5cGUgY29udGV4dCA9IGluZmVycmVyLndyYXBUeXBlKGVsZW1lbnRUeXBlLCBpdGVyYWJsZUNsYXNzKTsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihpdGVyYWJsZSwgY29udGV4dCwgdHlwZU5lZWRlZCk7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZEV4cHJlc3Npb25UeXBlID0KICAgICAgICBpbmZlcnJlci5yZXNvbHZlVHlwZVBhcmFtZXRlcihnZXRJbmZlcnJlZFR5cGUoaXRlcmFibGUsIGluZmVycmVyKSk7CiAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgIGluZmVycmVyLndyYXBUeXBlKGNvbnN0IER5bmFtaWNUeXBlKCksIGl0ZXJhYmxlQ2xhc3MpLAogICAgICAgIGluZmVycmVkRXhwcmVzc2lvblR5cGUsCiAgICAgICAgaXRlcmFibGUsCiAgICAgICAgaXRlcmFibGUuZmlsZU9mZnNldCwKICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVGb3JJbkxvb3BUeXBlTm90SXRlcmFibGUpOwogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwogICAgaWYgKHR5cGVOZWVkZWQpIHsKICAgICAgaW5mZXJyZWRUeXBlID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgICAgaWYgKGluZmVycmVkRXhwcmVzc2lvblR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlID0gaW5mZXJyZXIuY2xhc3NIaWVyYXJjaHkKICAgICAgICAgICAgLmdldFR5cGVBc0luc3RhbmNlT2YoaW5mZXJyZWRFeHByZXNzaW9uVHlwZSwgaXRlcmFibGVDbGFzcyk7CiAgICAgICAgaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgICAgICBpbmZlcnJlZFR5cGUgPSBzdXBlcnR5cGUudHlwZUFyZ3VtZW50c1swXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpbmZlcnJlZFR5cGU7CiAgfQoKICB2b2lkIGhhbmRsZUZvckluV2l0aG91dFZhcmlhYmxlKAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBFeHByZXNzaW9uIGl0ZXJhYmxlLCBTdGF0ZW1lbnQgYm9keSwKICAgICAge2Jvb2wgaXNBc3luYzogZmFsc2V9KSB7CiAgICBEYXJ0VHlwZSBlbGVtZW50VHlwZTsKICAgIGJvb2wgdHlwZUNoZWNrc05lZWRlZCA9ICFpbmZlcnJlci5pc1RvcExldmVsOwogICAgRGFydFR5cGUgc3ludGhldGljV3JpdGVUeXBlOwogICAgRXhwcmVzc2lvbiBzeW50aGV0aWNBc3NpZ25tZW50OwogICAgRXhwcmVzc2lvbiByaHM7CiAgICBFeHByZXNzaW9uU3RhdGVtZW50IHN0YXRlbWVudCA9CiAgICAgICAgYm9keSBpcyBCbG9jayA/IGJvZHkuc3RhdGVtZW50cy5maXJzdCA6IGJvZHk7CiAgICBTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQganVkZ21lbnQgPSBzdGF0ZW1lbnQuZXhwcmVzc2lvbjsKICAgIHN5bnRoZXRpY0Fzc2lnbm1lbnQgPSBqdWRnbWVudC5kZXN1Z2FyZWQ7CiAgICBpZiAoc3ludGhldGljQXNzaWdubWVudCBpcyBWYXJpYWJsZVNldCkgewogICAgICBzeW50aGV0aWNXcml0ZVR5cGUgPSBlbGVtZW50VHlwZSA9IHN5bnRoZXRpY0Fzc2lnbm1lbnQudmFyaWFibGUudHlwZTsKICAgICAgcmhzID0gc3ludGhldGljQXNzaWdubWVudC52YWx1ZTsKICAgIH0gZWxzZSBpZiAoc3ludGhldGljQXNzaWdubWVudCBpcyBQcm9wZXJ0eVNldCB8fAogICAgICAgIHN5bnRoZXRpY0Fzc2lnbm1lbnQgaXMgU3VwZXJQcm9wZXJ0eVNldCkgewogICAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUgPSBpbmZlcnJlci50aGlzVHlwZTsKICAgICAgT2JqZWN0IHdyaXRlTWVtYmVyID0KICAgICAgICAgIGluZmVycmVyLmZpbmRQcm9wZXJ0eVNldE1lbWJlcihyZWNlaXZlclR5cGUsIHN5bnRoZXRpY0Fzc2lnbm1lbnQpOwogICAgICBzeW50aGV0aWNXcml0ZVR5cGUgPQogICAgICAgICAgZWxlbWVudFR5cGUgPSBpbmZlcnJlci5nZXRTZXR0ZXJUeXBlKHdyaXRlTWVtYmVyLCByZWNlaXZlclR5cGUpOwogICAgICBpZiAoc3ludGhldGljQXNzaWdubWVudCBpcyBQcm9wZXJ0eVNldCkgewogICAgICAgIHJocyA9IHN5bnRoZXRpY0Fzc2lnbm1lbnQudmFsdWU7CiAgICAgIH0gZWxzZSBpZiAoc3ludGhldGljQXNzaWdubWVudCBpcyBTdXBlclByb3BlcnR5U2V0KSB7CiAgICAgICAgcmhzID0gc3ludGhldGljQXNzaWdubWVudC52YWx1ZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzeW50aGV0aWNBc3NpZ25tZW50IGlzIFN0YXRpY1NldCkgewogICAgICBzeW50aGV0aWNXcml0ZVR5cGUgPSBlbGVtZW50VHlwZSA9IHN5bnRoZXRpY0Fzc2lnbm1lbnQudGFyZ2V0LnNldHRlclR5cGU7CiAgICAgIHJocyA9IHN5bnRoZXRpY0Fzc2lnbm1lbnQudmFsdWU7CiAgICB9IGVsc2UgaWYgKHN5bnRoZXRpY0Fzc2lnbm1lbnQgaXMgSW52YWxpZEV4cHJlc3Npb24pIHsKICAgICAgZWxlbWVudFR5cGUgPSBjb25zdCBVbmtub3duVHlwZSgpOwogICAgfSBlbHNlIHsKICAgICAgdW5oYW5kbGVkKAogICAgICAgICAgIiR7c3ludGhldGljQXNzaWdubWVudC5ydW50aW1lVHlwZX0iLAogICAgICAgICAgImhhbmRsZUZvckluU3RhdGVtZW50V2l0aG91dFZhcmlhYmxlIiwKICAgICAgICAgIHN5bnRoZXRpY0Fzc2lnbm1lbnQuZmlsZU9mZnNldCwKICAgICAgICAgIGluZmVycmVyLmhlbHBlci51cmkpOwogICAgfQoKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9IGluZmVyRm9ySW5JdGVyYWJsZSgKICAgICAgICBpdGVyYWJsZSwgZWxlbWVudFR5cGUsIHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgaXNBc3luYzogaXNBc3luYyk7CiAgICBpZiAodHlwZUNoZWNrc05lZWRlZCkgewogICAgICB2YXJpYWJsZS50eXBlID0gaW5mZXJyZWRUeXBlOwogICAgfQoKICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KGJvZHkpOwoKICAgIGlmIChzeW50aGV0aWNXcml0ZVR5cGUgIT0gbnVsbCkgewogICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgICAgZ3JlYXRlc3RDbG9zdXJlKGluZmVycmVyLmNvcmVUeXBlcywgc3ludGhldGljV3JpdGVUeXBlKSwKICAgICAgICAgIHZhcmlhYmxlLnR5cGUsCiAgICAgICAgICByaHMsCiAgICAgICAgICByaHMuZmlsZU9mZnNldCwKICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZUZvckluTG9vcEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZSwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUsIF8pIHsKICAgIGlmIChub2RlLnZhcmlhYmxlLm5hbWUgPT0gbnVsbCkgewogICAgICBoYW5kbGVGb3JJbldpdGhvdXRWYXJpYWJsZShub2RlLnZhcmlhYmxlLCBub2RlLml0ZXJhYmxlLCBub2RlLmJvZHksCiAgICAgICAgICBpc0FzeW5jOiBub2RlLmlzQXN5bmMpOwogICAgfSBlbHNlIHsKICAgICAgaGFuZGxlRm9ySW5EZWNsYXJpbmdWYXJpYWJsZShub2RlLnZhcmlhYmxlLCBub2RlLml0ZXJhYmxlLCBub2RlLmJvZHksCiAgICAgICAgICBpc0FzeW5jOiBub2RlLmlzQXN5bmMpOwogICAgfQogIH0KCiAgdm9pZCB2aXNpdEZvckp1ZGdtZW50KEZvckp1ZGdtZW50IG5vZGUpIHsKICAgIHZhciBjb25kaXRpb25KdWRnbWVudCA9IG5vZGUuY29uZGl0aW9uSnVkZ21lbnQ7CiAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgaW4gbm9kZS52YXJpYWJsZXMpIHsKICAgICAgaWYgKHZhcmlhYmxlLm5hbWUgPT0gbnVsbCkgewogICAgICAgIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIgPSB2YXJpYWJsZS5pbml0aWFsaXplcjsKICAgICAgICBpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgdmFyaWFibGUudHlwZSA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgICAgICBpbml0aWFsaXplciwgY29uc3QgVW5rbm93blR5cGUoKSwgdHJ1ZSwKICAgICAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQodmFyaWFibGUpOwogICAgICB9CiAgICB9CiAgICBpZiAoY29uZGl0aW9uSnVkZ21lbnQgIT0gbnVsbCkgewogICAgICB2YXIgZXhwZWN0ZWRUeXBlID0gaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlOwogICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBjb25kaXRpb25KdWRnbWVudCwgZXhwZWN0ZWRUeXBlLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCk7CiAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgICBleHBlY3RlZFR5cGUsCiAgICAgICAgICBnZXRJbmZlcnJlZFR5cGUoY29uZGl0aW9uSnVkZ21lbnQsIGluZmVycmVyKSwKICAgICAgICAgIG5vZGUuY29uZGl0aW9uLAogICAgICAgICAgbm9kZS5jb25kaXRpb24uZmlsZU9mZnNldCk7CiAgICB9CiAgICBmb3IgKHZhciB1cGRhdGUgaW4gbm9kZS51cGRhdGVKdWRnbWVudHMpIHsKICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgdXBkYXRlLCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgfQogICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRGdW5jdGlvbk5vZGVKdWRnbWVudCgKICAgICAgRnVuY3Rpb25Ob2RlSnVkZ21lbnQgbm9kZSwKICAgICAgRGFydFR5cGUgdHlwZUNvbnRleHQsCiAgICAgIERhcnRUeXBlIHJldHVybkNvbnRleHQsCiAgICAgIGludCByZXR1cm5UeXBlSW5zdHJ1bWVudGF0aW9uT2Zmc2V0KSB7CiAgICByZXR1cm4gaW5mZXJyZXIuaW5mZXJMb2NhbEZ1bmN0aW9uKAogICAgICAgIG5vZGUsIHR5cGVDb250ZXh0LCByZXR1cm5UeXBlSW5zdHJ1bWVudGF0aW9uT2Zmc2V0LCByZXR1cm5Db250ZXh0KTsKICB9CgogIHZvaWQgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uSnVkZ21lbnQoRnVuY3Rpb25EZWNsYXJhdGlvbkp1ZGdtZW50IG5vZGUpIHsKICAgIGluZmVycmVyLmluZmVyTWV0YWRhdGFLZWVwaW5nSGVscGVyKG5vZGUudmFyaWFibGUuYW5ub3RhdGlvbnMpOwogICAgRGFydFR5cGUgcmV0dXJuQ29udGV4dCA9CiAgICAgICAgbm9kZS5faGFzSW1wbGljaXRSZXR1cm5UeXBlID8gbnVsbCA6IG5vZGUuZnVuY3Rpb24ucmV0dXJuVHlwZTsKICAgIHZhciBpbmZlcmVuY2VSZXN1bHQgPSB2aXNpdEZ1bmN0aW9uTm9kZUp1ZGdtZW50KAogICAgICAgIG5vZGUuZnVuY3Rpb25KdWRnbWVudCwgbnVsbCwgcmV0dXJuQ29udGV4dCwgbm9kZS5maWxlT2Zmc2V0KTsKICAgIG5vZGUudmFyaWFibGUudHlwZSA9IGluZmVyZW5jZVJlc3VsdC50eXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihGdW5jdGlvbkV4cHJlc3Npb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHZhciBpbmZlcmVuY2VSZXN1bHQgPSB2aXNpdEZ1bmN0aW9uTm9kZUp1ZGdtZW50KAogICAgICAgIG5vZGUuZnVuY3Rpb24sIHR5cGVDb250ZXh0LCBudWxsLCBub2RlLmZpbGVPZmZzZXQpOwogICAgaW5mZXJyZXIuc3RvcmVJbmZlcnJlZFR5cGUobm9kZSwgaW5mZXJlbmNlUmVzdWx0LnR5cGUpOwogIH0KCiAgdm9pZCB2aXNpdEludmFsaWRTdXBlckluaXRpYWxpemVySnVkZ21lbnQoCiAgICAgIEludmFsaWRTdXBlckluaXRpYWxpemVySnVkZ21lbnQgbm9kZSkgewogICAgdmFyIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tU3VwZXJ0eXBlKGluZmVycmVyLmNsYXNzSGllcmFyY2h5CiAgICAgICAgLmdldENsYXNzQXNJbnN0YW5jZU9mKAogICAgICAgICAgICBpbmZlcnJlci50aGlzVHlwZS5jbGFzc05vZGUsIG5vZGUudGFyZ2V0LmVuY2xvc2luZ0NsYXNzKSk7CiAgICBpbmZlcnJlci5pbmZlckludm9jYXRpb24oCiAgICAgICAgbnVsbCwKICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKAogICAgICAgICAgICBub2RlLnRhcmdldC5mdW5jdGlvbi5mdW5jdGlvblR5cGUud2l0aG91dFR5cGVQYXJhbWV0ZXJzKSwKICAgICAgICBpbmZlcnJlci50aGlzVHlwZSwKICAgICAgICBub2RlLmFyZ3VtZW50c0p1ZGdtZW50LAogICAgICAgIHNraXBUeXBlQXJndW1lbnRJbmZlcmVuY2U6IHRydWUpOwogIH0KCiAgdm9pZCB2aXNpdElmTnVsbEp1ZGdtZW50KElmTnVsbEp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICB2YXIgbGVmdEp1ZGdtZW50ID0gbm9kZS5sZWZ0SnVkZ21lbnQ7CiAgICB2YXIgcmlnaHRKdWRnbWVudCA9IG5vZGUucmlnaHRKdWRnbWVudDsKICAgIC8vIFRvIGluZmVyIGBlMCA/PyBlMWAgaW4gY29udGV4dCBLOgogICAgLy8gLSBJbmZlciBlMCBpbiBjb250ZXh0IEsgdG8gZ2V0IFQwCiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24obGVmdEp1ZGdtZW50LCB0eXBlQ29udGV4dCwgdHJ1ZSk7CiAgICB2YXIgbGhzVHlwZSA9IGdldEluZmVycmVkVHlwZShsZWZ0SnVkZ21lbnQsIGluZmVycmVyKTsKICAgIG5vZGUudmFyaWFibGUudHlwZSA9IGxoc1R5cGU7CiAgICAvLyAtIExldCBKID0gVDAgaWYgSyBpcyBgP2AgZWxzZSBLLgogICAgLy8gLSBJbmZlciBlMSBpbiBjb250ZXh0IEogdG8gZ2V0IFQxCiAgICBpZiAodHlwZUNvbnRleHQgaXMgVW5rbm93blR5cGUpIHsKICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKHJpZ2h0SnVkZ21lbnQsIGxoc1R5cGUsIHRydWUsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihyaWdodEp1ZGdtZW50LCB0eXBlQ29udGV4dCwgdHJ1ZSwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgfQogICAgdmFyIHJoc1R5cGUgPSBnZXRJbmZlcnJlZFR5cGUocmlnaHRKdWRnbWVudCwgaW5mZXJyZXIpOwogICAgLy8gLSBMZXQgVCA9IGdyZWF0ZXN0IGNsb3N1cmUgb2YgSyB3aXRoIHJlc3BlY3QgdG8gYD9gIGlmIEsgaXMgbm90IGBfYCwgZWxzZQogICAgLy8gICBVUCh0MCwgdDEpCiAgICAvLyAtIFRoZW4gdGhlIGluZmVycmVkIHR5cGUgaXMgVC4KICAgIG5vZGUuaW5mZXJyZWRUeXBlID0KICAgICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuZ2V0U3RhbmRhcmRVcHBlckJvdW5kKGxoc1R5cGUsIHJoc1R5cGUpOwogICAgbm9kZS5ib2R5LnN0YXRpY1R5cGUgPSBnZXRJbmZlcnJlZFR5cGUobm9kZSwgaW5mZXJyZXIpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIHZpc2l0SWZKdWRnbWVudChJZkp1ZGdtZW50IG5vZGUpIHsKICAgIHZhciBjb25kaXRpb25KdWRnbWVudCA9IG5vZGUuY29uZGl0aW9uSnVkZ21lbnQ7CiAgICB2YXIgZXhwZWN0ZWRUeXBlID0gaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlOwogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIGNvbmRpdGlvbkp1ZGdtZW50LCBleHBlY3RlZFR5cGUsICFpbmZlcnJlci5pc1RvcExldmVsKTsKICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgZXhwZWN0ZWRUeXBlLAogICAgICAgIGdldEluZmVycmVkVHlwZShjb25kaXRpb25KdWRnbWVudCwgaW5mZXJyZXIpLAogICAgICAgIG5vZGUuY29uZGl0aW9uLAogICAgICAgIG5vZGUuY29uZGl0aW9uLmZpbGVPZmZzZXQpOwogICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS50aGVuKTsKICAgIGlmIChub2RlLm90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KG5vZGUub3RoZXJ3aXNlKTsKICAgIH0KICB9CgogIHZvaWQgdmlzaXRJbGxlZ2FsQXNzaWdubWVudEp1ZGdtZW50KAogICAgICBJbGxlZ2FsQXNzaWdubWVudEp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpZiAobm9kZS53cml0ZSAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgIG5vZGUud3JpdGUsIGNvbnN0IFVua25vd25UeXBlKCksICFpbmZlcnJlci5pc1RvcExldmVsKTsKICAgIH0KICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLnJocywgY29uc3QgVW5rbm93blR5cGUoKSwgIWluZmVycmVyLmlzVG9wTGV2ZWwpOwogICAgbm9kZS5fcmVwbGFjZVdpdGhEZXN1Z2FyZWQoKTsKICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdEluZGV4QXNzaWdubWVudEp1ZGdtZW50KAogICAgICBJbmRleEFzc2lnbm1lbnRKdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgdmFyIHJlY2VpdmVyVHlwZSA9IG5vZGUuX2luZmVyUmVjZWl2ZXIoaW5mZXJyZXIpOwogICAgdmFyIHdyaXRlTWVtYmVyID0KICAgICAgICBpbmZlcnJlci5maW5kTWV0aG9kSW52b2NhdGlvbk1lbWJlcihyZWNlaXZlclR5cGUsIG5vZGUud3JpdGUpOwogICAgLy8gVG8gcmVwbGljYXRlIGFuYWx5emVyIGJlaGF2aW9yLCB3ZSBiYXNlIHR5cGUgaW5mZXJlbmNlIG9uIHRoZSB3cml0ZQogICAgLy8gbWVtYmVyLiAgVE9ETyhwYXVsYmVycnkpOiB3b3VsZCBpdCBiZSBiZXR0ZXIgdG8gdXNlIHRoZSByZWFkIG1lbWJlcgogICAgLy8gd2hlbiBkb2luZyBjb21wb3VuZCBhc3NpZ25tZW50PwogICAgdmFyIGNhbGxlZVR5cGUgPSBpbmZlcnJlci5nZXRDYWxsZWVGdW5jdGlvblR5cGUoCiAgICAgICAgaW5mZXJyZXIuZ2V0Q2FsbGVlVHlwZSh3cml0ZU1lbWJlciwgcmVjZWl2ZXJUeXBlKSwgZmFsc2UpOwogICAgRGFydFR5cGUgZXhwZWN0ZWRJbmRleFR5cGVGb3JXcml0ZTsKICAgIERhcnRUeXBlIGluZGV4Q29udGV4dCA9IGNvbnN0IFVua25vd25UeXBlKCk7CiAgICBEYXJ0VHlwZSB3cml0ZUNvbnRleHQgPSBjb25zdCBVbmtub3duVHlwZSgpOwogICAgaWYgKGNhbGxlZVR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoID49IDIpIHsKICAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiB3ZSBvdWdodCB0byBnZXQgYSBjb250ZXh0IGZvciB0aGUgaW5kZXggZXhwcmVzc2lvbgogICAgICAvLyBmcm9tIHRoZSBpbmRleCBmb3JtYWwgcGFyYW1ldGVyLCBidXQgYW5hbHl6ZXIgZG9lc24ndCBzbyBmb3Igbm93IHdlCiAgICAgIC8vIHJlcGxpY2F0ZSBpdHMgYmVoYXZpb3IuCiAgICAgIGV4cGVjdGVkSW5kZXhUeXBlRm9yV3JpdGUgPSBjYWxsZWVUeXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzWzBdOwogICAgICB3cml0ZUNvbnRleHQgPSBjYWxsZWVUeXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzWzFdOwogICAgfQogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKG5vZGUuaW5kZXgsIGluZGV4Q29udGV4dCwgdHJ1ZSk7CiAgICB2YXIgaW5kZXhUeXBlID0gZ2V0SW5mZXJyZWRUeXBlKG5vZGUuaW5kZXgsIGluZmVycmVyKTsKICAgIG5vZGUuX3N0b3JlTGV0VHlwZShpbmZlcnJlciwgbm9kZS5pbmRleCwgaW5kZXhUeXBlKTsKICAgIGlmICh3cml0ZUNvbnRleHQgaXMhIFVua25vd25UeXBlKSB7CiAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgICBleHBlY3RlZEluZGV4VHlwZUZvcldyaXRlLAogICAgICAgICAgaW5kZXhUeXBlLAogICAgICAgICAgbm9kZS5fZ2V0SW52b2NhdGlvbkFyZ3VtZW50cyhpbmZlcnJlciwgbm9kZS53cml0ZSkucG9zaXRpb25hbFswXSwKICAgICAgICAgIG5vZGUud3JpdGUuZmlsZU9mZnNldCk7CiAgICB9CiAgICBJbnZvY2F0aW9uRXhwcmVzc2lvbiByZWFkID0gbm9kZS5yZWFkOwogICAgRGFydFR5cGUgcmVhZFR5cGU7CiAgICBpZiAocmVhZCAhPSBudWxsKSB7CiAgICAgIHZhciByZWFkTWVtYmVyID0gaW5mZXJyZXIuZmluZE1ldGhvZEludm9jYXRpb25NZW1iZXIocmVjZWl2ZXJUeXBlLCByZWFkLAogICAgICAgICAgaW5zdHJ1bWVudGVkOiBmYWxzZSk7CiAgICAgIHZhciBjYWxsZWVGdW5jdGlvblR5cGUgPSBpbmZlcnJlci5nZXRDYWxsZWVGdW5jdGlvblR5cGUoCiAgICAgICAgICBpbmZlcnJlci5nZXRDYWxsZWVUeXBlKHJlYWRNZW1iZXIsIHJlY2VpdmVyVHlwZSksIGZhbHNlKTsKICAgICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICAgIGdldFBvc2l0aW9uYWxQYXJhbWV0ZXJUeXBlKGNhbGxlZUZ1bmN0aW9uVHlwZSwgMCksCiAgICAgICAgICBpbmRleFR5cGUsCiAgICAgICAgICBub2RlLl9nZXRJbnZvY2F0aW9uQXJndW1lbnRzKGluZmVycmVyLCByZWFkKS5wb3NpdGlvbmFsWzBdLAogICAgICAgICAgcmVhZC5maWxlT2Zmc2V0KTsKICAgICAgcmVhZFR5cGUgPSBjYWxsZWVGdW5jdGlvblR5cGUucmV0dXJuVHlwZTsKICAgICAgdmFyIGRlc3VnYXJlZEludm9jYXRpb24gPSByZWFkIGlzIE1ldGhvZEludm9jYXRpb24gPyByZWFkIDogbnVsbDsKICAgICAgdmFyIGNoZWNrS2luZCA9IGluZmVycmVyLnByZUNoZWNrSW52b2NhdGlvbkNvbnRyYXZhcmlhbmNlKG5vZGUucmVjZWl2ZXIsCiAgICAgICAgICByZWNlaXZlclR5cGUsIHJlYWRNZW1iZXIsIGRlc3VnYXJlZEludm9jYXRpb24sIHJlYWQuYXJndW1lbnRzLCByZWFkKTsKICAgICAgdmFyIHJlcGxhY2VkUmVhZCA9IGluZmVycmVyLmhhbmRsZUludm9jYXRpb25Db250cmF2YXJpYW5jZSgKICAgICAgICAgIGNoZWNrS2luZCwKICAgICAgICAgIGRlc3VnYXJlZEludm9jYXRpb24sCiAgICAgICAgICByZWFkLmFyZ3VtZW50cywKICAgICAgICAgIHJlYWQsCiAgICAgICAgICByZWFkVHlwZSwKICAgICAgICAgIGNhbGxlZUZ1bmN0aW9uVHlwZSwKICAgICAgICAgIHJlYWQuZmlsZU9mZnNldCk7CiAgICAgIG5vZGUuX3N0b3JlTGV0VHlwZShpbmZlcnJlciwgcmVwbGFjZWRSZWFkLCByZWFkVHlwZSk7CiAgICB9CiAgICBub2RlLl9pbmZlclJocyhpbmZlcnJlciwgcmVhZFR5cGUsIHdyaXRlQ29udGV4dCk7CiAgICBub2RlLl9yZXBsYWNlV2l0aERlc3VnYXJlZCgpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIHZpc2l0SW50SnVkZ21lbnQoSW50SnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGlmIChpbmZlcnJlci5pc0RvdWJsZUNvbnRleHQodHlwZUNvbnRleHQpKSB7CiAgICAgIGRvdWJsZSBkb3VibGVWYWx1ZSA9IG5vZGUuYXNEb3VibGUoKTsKICAgICAgaWYgKGRvdWJsZVZhbHVlICE9IG51bGwpIHsKICAgICAgICBub2RlLnBhcmVudC5yZXBsYWNlQ2hpbGQoCiAgICAgICAgICAgIG5vZGUsIERvdWJsZUxpdGVyYWwoZG91YmxlVmFsdWUpLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0KTsKICAgICAgICBub2RlLmluZmVycmVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5kb3VibGVDbGFzcy5yYXdUeXBlOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBFeHByZXNzaW9uIGVycm9yID0gY2hlY2tXZWJJbnRMaXRlcmFsc0Vycm9ySWZVbmV4YWN0KAogICAgICAgIGluZmVycmVyLCBub2RlLnZhbHVlLCBub2RlLmxpdGVyYWwsIG5vZGUuZmlsZU9mZnNldCk7CiAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewogICAgICBub2RlLnBhcmVudC5yZXBsYWNlQ2hpbGQobm9kZSwgZXJyb3IpOwogICAgICBub2RlLmluZmVycmVkVHlwZSA9IGNvbnN0IEJvdHRvbVR5cGUoKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBub2RlLmluZmVycmVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5pbnRDbGFzcy5yYXdUeXBlOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIHZpc2l0U2hhZG93TGFyZ2VJbnRMaXRlcmFsKAogICAgICBTaGFkb3dMYXJnZUludExpdGVyYWwgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGlmIChpbmZlcnJlci5pc0RvdWJsZUNvbnRleHQodHlwZUNvbnRleHQpKSB7CiAgICAgIGRvdWJsZSBkb3VibGVWYWx1ZSA9IG5vZGUuYXNEb3VibGUoKTsKICAgICAgaWYgKGRvdWJsZVZhbHVlICE9IG51bGwpIHsKICAgICAgICBub2RlLnBhcmVudC5yZXBsYWNlQ2hpbGQoCiAgICAgICAgICAgIG5vZGUsIERvdWJsZUxpdGVyYWwoZG91YmxlVmFsdWUpLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0KTsKICAgICAgICBub2RlLmluZmVycmVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5kb3VibGVDbGFzcy5yYXdUeXBlOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CgogICAgaW50IGludFZhbHVlID0gbm9kZS5hc0ludDY0KCk7CiAgICBpZiAoaW50VmFsdWUgPT0gbnVsbCkgewogICAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50ID0gaW5mZXJyZXIuaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgICAgaW5mZXJyZXIuaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZUludGVnZXJMaXRlcmFsSXNPdXRPZlJhbmdlLndpdGhBcmd1bWVudHMobm9kZS5saXRlcmFsKSwKICAgICAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgbm9kZS5saXRlcmFsLmxlbmd0aCkpOwogICAgICBub2RlLnBhcmVudC5yZXBsYWNlQ2hpbGQobm9kZSwgcmVwbGFjZW1lbnQpOwogICAgICBub2RlLmluZmVycmVkVHlwZSA9IGNvbnN0IEJvdHRvbVR5cGUoKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBFeHByZXNzaW9uIGVycm9yID0gY2hlY2tXZWJJbnRMaXRlcmFsc0Vycm9ySWZVbmV4YWN0KAogICAgICAgIGluZmVycmVyLCBpbnRWYWx1ZSwgbm9kZS5saXRlcmFsLCBub2RlLmZpbGVPZmZzZXQpOwogICAgaWYgKGVycm9yICE9IG51bGwpIHsKICAgICAgbm9kZS5wYXJlbnQucmVwbGFjZUNoaWxkKG5vZGUsIGVycm9yKTsKICAgICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBjb25zdCBCb3R0b21UeXBlKCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbm9kZS5wYXJlbnQKICAgICAgICAucmVwbGFjZUNoaWxkKG5vZGUsIEludExpdGVyYWwoaW50VmFsdWUpLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0KTsKICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gaW5mZXJyZXIuY29yZVR5cGVzLmludENsYXNzLnJhd1R5cGU7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgdmlzaXRTaGFkb3dJbnZhbGlkSW5pdGlhbGl6ZXIoU2hhZG93SW52YWxpZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLnZhcmlhYmxlLmluaXRpYWxpemVyLCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCk7CiAgfQoKICB2b2lkIHZpc2l0U2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXIoU2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKG5vZGUudmFsdWUsIG5vZGUuZmllbGQudHlwZSwgIWluZmVycmVyLmlzVG9wTGV2ZWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdElzRXhwcmVzc2lvbihJc0V4cHJlc3Npb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLm9wZXJhbmQsIGNvbnN0IFVua25vd25UeXBlKCksICFpbmZlcnJlci5pc1RvcExldmVsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSwgXykgewogICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICB9CgogIERhcnRUeXBlIGdldFNwcmVhZEVsZW1lbnRUeXBlKERhcnRUeXBlIHNwcmVhZFR5cGUsIGJvb2wgaXNOdWxsQXdhcmUpIHsKICAgIGlmIChzcHJlYWRUeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgIC5nZXRUeXBlQXNJbnN0YW5jZU9mKHNwcmVhZFR5cGUsIGluZmVycmVyLmNvcmVUeXBlcy5pdGVyYWJsZUNsYXNzKTsKICAgICAgaWYgKHN1cGVydHlwZSAhPSBudWxsKSByZXR1cm4gc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHNbMF07CiAgICAgIGlmIChzcHJlYWRUeXBlLmNsYXNzTm9kZSA9PSBpbmZlcnJlci5jb3JlVHlwZXMubnVsbENsYXNzICYmIGlzTnVsbEF3YXJlKSB7CiAgICAgICAgcmV0dXJuIHNwcmVhZFR5cGU7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoc3ByZWFkVHlwZSBpcyBEeW5hbWljVHlwZSkgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIERhcnRUeXBlIGluZmVyRWxlbWVudCgKICAgICAgRXhwcmVzc2lvbiBlbGVtZW50LAogICAgICBUcmVlTm9kZSBwYXJlbnQsCiAgICAgIERhcnRUeXBlIGluZmVycmVkVHlwZUFyZ3VtZW50LAogICAgICBNYXA8VHJlZU5vZGUsIERhcnRUeXBlPiBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICBib29sIGluZmVyZW5jZU5lZWRlZCwKICAgICAgYm9vbCB0eXBlQ2hlY2tzTmVlZGVkKSB7CiAgICBpZiAoZWxlbWVudCBpcyBTcHJlYWRFbGVtZW50KSB7CiAgICAgIERhcnRUeXBlIHNwcmVhZFR5cGUgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBlbGVtZW50LmV4cHJlc3Npb24sCiAgICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShpbmZlcnJlci5jb3JlVHlwZXMuaXRlcmFibGVDbGFzcywKICAgICAgICAgICAgICA8RGFydFR5cGU+W2luZmVycmVkVHlwZUFyZ3VtZW50XSksCiAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzW2VsZW1lbnQuZXhwcmVzc2lvbl0gPSBzcHJlYWRUeXBlOwogICAgICBpZiAodHlwZUNoZWNrc05lZWRlZCkgewogICAgICAgIERhcnRUeXBlIHNwcmVhZEVsZW1lbnRUeXBlID0KICAgICAgICAgICAgZ2V0U3ByZWFkRWxlbWVudFR5cGUoc3ByZWFkVHlwZSwgZWxlbWVudC5pc051bGxBd2FyZSk7CiAgICAgICAgaWYgKHNwcmVhZEVsZW1lbnRUeXBlID09IG51bGwpIHsKICAgICAgICAgIGlmIChzcHJlYWRUeXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICAgICAgICBzcHJlYWRUeXBlLmNsYXNzTm9kZSA9PSBpbmZlcnJlci5jb3JlVHlwZXMubnVsbENsYXNzICYmCiAgICAgICAgICAgICAgIWVsZW1lbnQuaXNOdWxsQXdhcmUpIHsKICAgICAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZCgKICAgICAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICAgICBpbmZlcnJlci5oZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oaW5mZXJyZXIuaGVscGVyCiAgICAgICAgICAgICAgICAgICAgLmJ1aWxkUHJvYmxlbShtZXNzYWdlTm9uTnVsbEF3YXJlU3ByZWFkSXNOdWxsLAogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmV4cHJlc3Npb24uZmlsZU9mZnNldCwgMSkpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoCiAgICAgICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAgICAgaW5mZXJyZXIuaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGluZmVycmVyLmhlbHBlcgogICAgICAgICAgICAgICAgICAgIC5idWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU3ByZWFkVHlwZU1pc21hdGNoLndpdGhBcmd1bWVudHMoc3ByZWFkVHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAxKSkpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3ByZWFkVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICBpZiAoIWluZmVycmVyLmlzQXNzaWduYWJsZShpbmZlcnJlZFR5cGVBcmd1bWVudCwgc3ByZWFkRWxlbWVudFR5cGUpKSB7CiAgICAgICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoCiAgICAgICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAgICAgaW5mZXJyZXIuaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGluZmVycmVyLmhlbHBlcgogICAgICAgICAgICAgICAgICAgIC5idWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU3ByZWFkRWxlbWVudFR5cGVNaXNtYXRjaC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByZWFkRWxlbWVudFR5cGUsIGluZmVycmVkVHlwZUFyZ3VtZW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5leHByZXNzaW9uLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIDEpKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFVzZSAnZHluYW1pYycgZm9yIGVycm9yIHJlY292ZXJ5LgogICAgICByZXR1cm4gZWxlbWVudC5lbGVtZW50VHlwZSA9CiAgICAgICAgICBnZXRTcHJlYWRFbGVtZW50VHlwZShzcHJlYWRUeXBlLCBlbGVtZW50LmlzTnVsbEF3YXJlKSA/PwogICAgICAgICAgICAgIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgSWZFbGVtZW50KSB7CiAgICAgIERhcnRUeXBlIGJvb2xUeXBlID0gaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlOwogICAgICBEYXJ0VHlwZSBjb25kaXRpb25UeXBlID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgZWxlbWVudC5jb25kaXRpb24sIGJvb2xUeXBlLCB0eXBlQ2hlY2tzTmVlZGVkLAogICAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwogICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKGJvb2xUeXBlLCBjb25kaXRpb25UeXBlLCBlbGVtZW50LmNvbmRpdGlvbiwKICAgICAgICAgIGVsZW1lbnQuY29uZGl0aW9uLmZpbGVPZmZzZXQpOwogICAgICBEYXJ0VHlwZSB0aGVuVHlwZSA9IGluZmVyRWxlbWVudCgKICAgICAgICAgIGVsZW1lbnQudGhlbiwKICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICBpbmZlcnJlZFR5cGVBcmd1bWVudCwKICAgICAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMsCiAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQsCiAgICAgICAgICB0eXBlQ2hlY2tzTmVlZGVkKTsKICAgICAgRGFydFR5cGUgb3RoZXJ3aXNlVHlwZTsKICAgICAgaWYgKGVsZW1lbnQub3RoZXJ3aXNlICE9IG51bGwpIHsKICAgICAgICBvdGhlcndpc2VUeXBlID0gaW5mZXJFbGVtZW50KAogICAgICAgICAgICBlbGVtZW50Lm90aGVyd2lzZSwKICAgICAgICAgICAgZWxlbWVudCwKICAgICAgICAgICAgaW5mZXJyZWRUeXBlQXJndW1lbnQsCiAgICAgICAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMsCiAgICAgICAgICAgIGluZmVyZW5jZU5lZWRlZCwKICAgICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG90aGVyd2lzZVR5cGUgPT0gbnVsbAogICAgICAgICAgPyB0aGVuVHlwZQogICAgICAgICAgOiBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgICAuZ2V0U3RhbmRhcmRVcHBlckJvdW5kKHRoZW5UeXBlLCBvdGhlcndpc2VUeXBlKTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpcyBGb3JFbGVtZW50KSB7CiAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiBpbiBlbGVtZW50LnZhcmlhYmxlcykgewogICAgICAgIGlmIChkZWNsYXJhdGlvbi5uYW1lID09IG51bGwpIHsKICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgICAgIGRlY2xhcmF0aW9uLnR5cGUgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oZGVjbGFyYXRpb24uaW5pdGlhbGl6ZXIsCiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi50eXBlLCBpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbmZlcnJlci5pbmZlclN0YXRlbWVudChkZWNsYXJhdGlvbik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChlbGVtZW50LmNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgICBlbGVtZW50LmNvbmRpdGlvbiwKICAgICAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlLAogICAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwogICAgICB9CiAgICAgIGZvciAoRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGVsZW1lbnQudXBkYXRlcykgewogICAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihleHByZXNzaW9uLCBjb25zdCBVbmtub3duVHlwZSgpLAogICAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluZmVyRWxlbWVudChlbGVtZW50LmJvZHksIGVsZW1lbnQsIGluZmVycmVkVHlwZUFyZ3VtZW50LAogICAgICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcywgaW5mZXJlbmNlTmVlZGVkLCB0eXBlQ2hlY2tzTmVlZGVkKTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpcyBGb3JJbkVsZW1lbnQpIHsKICAgICAgaWYgKGVsZW1lbnQudmFyaWFibGUubmFtZSA9PSBudWxsKSB7CiAgICAgICAgaGFuZGxlRm9ySW5XaXRob3V0VmFyaWFibGUoCiAgICAgICAgICAgIGVsZW1lbnQudmFyaWFibGUsIGVsZW1lbnQuaXRlcmFibGUsIGVsZW1lbnQucHJvbG9ndWUsCiAgICAgICAgICAgIGlzQXN5bmM6IGVsZW1lbnQuaXNBc3luYyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaGFuZGxlRm9ySW5EZWNsYXJpbmdWYXJpYWJsZSgKICAgICAgICAgICAgZWxlbWVudC52YXJpYWJsZSwgZWxlbWVudC5pdGVyYWJsZSwgZWxlbWVudC5wcm9sb2d1ZSwKICAgICAgICAgICAgaXNBc3luYzogZWxlbWVudC5pc0FzeW5jKTsKICAgICAgfQogICAgICBpZiAoZWxlbWVudC5wcm9ibGVtICE9IG51bGwpIHsKICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oZWxlbWVudC5wcm9ibGVtLCBjb25zdCBVbmtub3duVHlwZSgpLAogICAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluZmVyRWxlbWVudChlbGVtZW50LmJvZHksIGVsZW1lbnQsIGluZmVycmVkVHlwZUFyZ3VtZW50LAogICAgICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcywgaW5mZXJlbmNlTmVlZGVkLCB0eXBlQ2hlY2tzTmVlZGVkKTsKICAgIH0gZWxzZSB7CiAgICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgIGVsZW1lbnQsIGluZmVycmVkVHlwZUFyZ3VtZW50LCBpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICBpZiAoaW5mZXJyZWRUeXBlQXJndW1lbnQgaXMhIFVua25vd25UeXBlKSB7CiAgICAgICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICAgICAgaW5mZXJyZWRUeXBlQXJndW1lbnQsIGluZmVycmVkVHlwZSwgZWxlbWVudCwgZWxlbWVudC5maWxlT2Zmc2V0LAogICAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiBpbmZlcnJlZFR5cGVBcmd1bWVudCBpcyBWb2lkVHlwZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluZmVycmVkVHlwZTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tFbGVtZW50KEV4cHJlc3Npb24gaXRlbSwgRXhwcmVzc2lvbiBwYXJlbnQsIERhcnRUeXBlIHR5cGVBcmd1bWVudCwKICAgICAgTWFwPFRyZWVOb2RlLCBEYXJ0VHlwZT4gaW5mZXJyZWRTcHJlYWRUeXBlcykgewogICAgaWYgKGl0ZW0gaXMgU3ByZWFkRWxlbWVudCkgewogICAgICBEYXJ0VHlwZSBzcHJlYWRUeXBlID0gaW5mZXJyZWRTcHJlYWRUeXBlc1tpdGVtLmV4cHJlc3Npb25dOwogICAgICBpZiAoc3ByZWFkVHlwZSBpcyBEeW5hbWljVHlwZSkgewogICAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoaW5mZXJyZXIuY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MucmF3VHlwZSwKICAgICAgICAgICAgc3ByZWFkVHlwZSwgaXRlbS5leHByZXNzaW9uLCBpdGVtLmV4cHJlc3Npb24uZmlsZU9mZnNldCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaXRlbSBpcyBJZkVsZW1lbnQpIHsKICAgICAgY2hlY2tFbGVtZW50KGl0ZW0udGhlbiwgaXRlbSwgdHlwZUFyZ3VtZW50LCBpbmZlcnJlZFNwcmVhZFR5cGVzKTsKICAgICAgaWYgKGl0ZW0ub3RoZXJ3aXNlICE9IG51bGwpIHsKICAgICAgICBjaGVja0VsZW1lbnQoaXRlbS5vdGhlcndpc2UsIGl0ZW0sIHR5cGVBcmd1bWVudCwgaW5mZXJyZWRTcHJlYWRUeXBlcyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaXRlbSBpcyBGb3JFbGVtZW50KSB7CiAgICAgIGlmIChpdGVtLmNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgICAgRGFydFR5cGUgY29uZGl0aW9uVHlwZSA9IGdldEluZmVycmVkVHlwZShpdGVtLmNvbmRpdGlvbiwgaW5mZXJyZXIpOwogICAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlLAogICAgICAgICAgICBjb25kaXRpb25UeXBlLCBpdGVtLmNvbmRpdGlvbiwgaXRlbS5jb25kaXRpb24uZmlsZU9mZnNldCk7CiAgICAgIH0KICAgICAgY2hlY2tFbGVtZW50KGl0ZW0uYm9keSwgaXRlbSwgdHlwZUFyZ3VtZW50LCBpbmZlcnJlZFNwcmVhZFR5cGVzKTsKICAgIH0gZWxzZSBpZiAoaXRlbSBpcyBGb3JJbkVsZW1lbnQpIHsKICAgICAgY2hlY2tFbGVtZW50KGl0ZW0uYm9keSwgaXRlbSwgdHlwZUFyZ3VtZW50LCBpbmZlcnJlZFNwcmVhZFR5cGVzKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIERvIG5vdGhpbmcuICBBc3NpZ25hYmlsaXR5IGNoZWNrcyBhcmUgZG9uZSBkdXJpbmcgdHlwZSBpbmZlcmVuY2UuCiAgICB9CiAgfQoKICB2b2lkIHZpc2l0TGlzdExpdGVyYWxKdWRnbWVudCgKICAgICAgTGlzdExpdGVyYWxKdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgdmFyIGxpc3RDbGFzcyA9IGluZmVycmVyLmNvcmVUeXBlcy5saXN0Q2xhc3M7CiAgICB2YXIgbGlzdFR5cGUgPSBsaXN0Q2xhc3MudGhpc1R5cGU7CiAgICBMaXN0PERhcnRUeXBlPiBpbmZlcnJlZFR5cGVzOwogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlQXJndW1lbnQ7CiAgICBMaXN0PERhcnRUeXBlPiBmb3JtYWxUeXBlczsKICAgIExpc3Q8RGFydFR5cGU+IGFjdHVhbFR5cGVzOwogICAgYm9vbCBpbmZlcmVuY2VOZWVkZWQgPSBub2RlLnR5cGVBcmd1bWVudCBpcyBJbXBsaWNpdFR5cGVBcmd1bWVudDsKICAgIGJvb2wgdHlwZUNoZWNrc05lZWRlZCA9ICFpbmZlcnJlci5pc1RvcExldmVsOwogICAgTWFwPFRyZWVOb2RlLCBEYXJ0VHlwZT4gaW5mZXJyZWRTcHJlYWRUeXBlczsKICAgIGlmIChpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCkgewogICAgICBmb3JtYWxUeXBlcyA9IFtdOwogICAgICBhY3R1YWxUeXBlcyA9IFtdOwogICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzID0gbmV3IE1hcDxUcmVlTm9kZSwgRGFydFR5cGU+LmlkZW50aXR5KCk7CiAgICB9CiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkKSB7CiAgICAgIGluZmVycmVkVHlwZXMgPSBbY29uc3QgVW5rbm93blR5cGUoKV07CiAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZShsaXN0VHlwZSwKICAgICAgICAgIGxpc3RDbGFzcy50eXBlUGFyYW1ldGVycywgbnVsbCwgbnVsbCwgdHlwZUNvbnRleHQsIGluZmVycmVkVHlwZXMsCiAgICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QpOwogICAgICBpbmZlcnJlZFR5cGVBcmd1bWVudCA9IGluZmVycmVkVHlwZXNbMF07CiAgICB9IGVsc2UgewogICAgICBpbmZlcnJlZFR5cGVBcmd1bWVudCA9IG5vZGUudHlwZUFyZ3VtZW50OwogICAgfQogICAgaWYgKGluZmVyZW5jZU5lZWRlZCB8fCB0eXBlQ2hlY2tzTmVlZGVkKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5leHByZXNzaW9ucy5sZW5ndGg7ICsraSkgewogICAgICAgIERhcnRUeXBlIHR5cGUgPSBpbmZlckVsZW1lbnQoCiAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbnNbaV0sCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50LAogICAgICAgICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQsCiAgICAgICAgICAgIHR5cGVDaGVja3NOZWVkZWQpOwogICAgICAgIGFjdHVhbFR5cGVzLmFkZCh0eXBlKTsKICAgICAgICBpZiAoaW5mZXJlbmNlTmVlZGVkKSB7CiAgICAgICAgICBmb3JtYWxUeXBlcy5hZGQobGlzdFR5cGUudHlwZUFyZ3VtZW50c1swXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkKSB7CiAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZSgKICAgICAgICAgIGxpc3RUeXBlLAogICAgICAgICAgbGlzdENsYXNzLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgZm9ybWFsVHlwZXMsCiAgICAgICAgICBhY3R1YWxUeXBlcywKICAgICAgICAgIHR5cGVDb250ZXh0LAogICAgICAgICAgaW5mZXJyZWRUeXBlcyk7CiAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50ID0gaW5mZXJyZWRUeXBlc1swXTsKICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQoCiAgICAgICAgICBpbmZlcnJlci51cmksCiAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICAndHlwZUFyZ3MnLAogICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZUFyZ3MoW2luZmVycmVkVHlwZUFyZ3VtZW50XSkpOwogICAgICBub2RlLnR5cGVBcmd1bWVudCA9IGluZmVycmVkVHlwZUFyZ3VtZW50OwogICAgfQogICAgaWYgKHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY2hlY2tFbGVtZW50KAogICAgICAgICAgICBub2RlLmV4cHJlc3Npb25zW2ldLCBub2RlLCBub2RlLnR5cGVBcmd1bWVudCwgaW5mZXJyZWRTcHJlYWRUeXBlcyk7CiAgICAgIH0KICAgIH0KICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gbmV3IEludGVyZmFjZVR5cGUobGlzdENsYXNzLCBbaW5mZXJyZWRUeXBlQXJndW1lbnRdKTsKICAgIGlmICghaW5mZXJyZXIuaXNUb3BMZXZlbCkgewogICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gaW5mZXJyZXIubGlicmFyeTsKICAgICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbkxpc3RMaXRlcmFsKAogICAgICAgICAgICBub2RlLCBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQsIGluZmVycmVyLmhlbHBlci51cmksCiAgICAgICAgICAgIGluZmVycmVkOiB0cnVlKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKExvZ2ljYWxFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICB2YXIgYm9vbFR5cGUgPSBpbmZlcnJlci5jb3JlVHlwZXMuYm9vbENsYXNzLnJhd1R5cGU7CiAgICB2YXIgbGVmdCA9IG5vZGUubGVmdDsKICAgIHZhciByaWdodCA9IG5vZGUucmlnaHQ7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24obGVmdCwgYm9vbFR5cGUsICFpbmZlcnJlci5pc1RvcExldmVsKTsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihyaWdodCwgYm9vbFR5cGUsICFpbmZlcnJlci5pc1RvcExldmVsKTsKICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoYm9vbFR5cGUsIGdldEluZmVycmVkVHlwZShsZWZ0LCBpbmZlcnJlciksCiAgICAgICAgbm9kZS5sZWZ0LCBub2RlLmxlZnQuZmlsZU9mZnNldCk7CiAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKGJvb2xUeXBlLCBnZXRJbmZlcnJlZFR5cGUocmlnaHQsIGluZmVycmVyKSwKICAgICAgICBub2RlLnJpZ2h0LCBub2RlLnJpZ2h0LmZpbGVPZmZzZXQpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLyBDYWxjdWxhdGVzIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSB0eXBlIG9mIGEgc3ByZWFkIG1hcCBlbnRyeSBvZiB0eXBlCiAgLy8gc3ByZWFkTWFwRW50cnlUeXBlIGFuZCBzdG9yZXMgdGhlbSBpbiBvdXRwdXQgaW4gcG9zaXRpb25zIG9mZnNldCBhbmQgb2Zmc2V0CiAgLy8gKyAxLiAgSWYgdGhlIHR5cGVzIGNhbid0IGJlIGNhbGN1bGF0ZWQsIGZvciBleGFtcGxlLCBpZiBzcHJlYWRNYXBFbnRyeVR5cGUKICAvLyBpcyBhIGZ1bmN0aW9uIHR5cGUsIHRoZSBvcmlnaW5hbCB2YWx1ZXMgaW4gb3V0cHV0IGFyZSBwcmVzZXJ2ZWQuCiAgdm9pZCBzdG9yZVNwcmVhZE1hcEVudHJ5RWxlbWVudFR5cGVzKERhcnRUeXBlIHNwcmVhZE1hcEVudHJ5VHlwZSwKICAgICAgYm9vbCBpc051bGxBd2FyZSwgTGlzdDxEYXJ0VHlwZT4gb3V0cHV0LCBpbnQgb2Zmc2V0KSB7CiAgICBpZiAoc3ByZWFkTWFwRW50cnlUeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgIC5nZXRUeXBlQXNJbnN0YW5jZU9mKHNwcmVhZE1hcEVudHJ5VHlwZSwgaW5mZXJyZXIuY29yZVR5cGVzLm1hcENsYXNzKTsKICAgICAgaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgICAgb3V0cHV0W29mZnNldF0gPSBzdXBlcnR5cGUudHlwZUFyZ3VtZW50c1swXTsKICAgICAgICBvdXRwdXRbb2Zmc2V0ICsgMV0gPSBzdXBlcnR5cGUudHlwZUFyZ3VtZW50c1sxXTsKICAgICAgfSBlbHNlIGlmIChzcHJlYWRNYXBFbnRyeVR5cGUuY2xhc3NOb2RlID09IGluZmVycmVyLmNvcmVUeXBlcy5udWxsQ2xhc3MgJiYKICAgICAgICAgIGlzTnVsbEF3YXJlKSB7CiAgICAgICAgb3V0cHV0W29mZnNldF0gPSBvdXRwdXRbb2Zmc2V0ICsgMV0gPSBzcHJlYWRNYXBFbnRyeVR5cGU7CiAgICAgIH0KICAgIH0KICAgIGlmIChzcHJlYWRNYXBFbnRyeVR5cGUgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgb3V0cHV0W29mZnNldF0gPSBvdXRwdXRbb2Zmc2V0ICsgMV0gPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfQogIH0KCiAgLy8gTm90ZSB0aGF0IGluZmVyTWFwRW50cnkgYWRkcyBleGFjdGx5IHR3byBlbGVtZW50cyB0byBhY3R1YWxUeXBlcyAtLSB0aGUKICAvLyBhY3R1YWwgdHlwZXMgb2YgdGhlIGtleSBhbmQgdGhlIHZhbHVlLiAgVGhlIHNhbWUgdGVjaG5pcXVlIGlzIHVzZWQgZm9yCiAgLy8gYWN0dWFsVHlwZXNGb3JTZXQsIG9ubHkgaW5mZXJNYXBFbnRyeSBhZGRzIGV4YWN0bHkgb25lIGVsZW1lbnQgdG8gdGhhdAogIC8vIGxpc3Q6IHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgaXRlcmFibGUgc3ByZWFkIGVsZW1lbnRzIGluIGNhc2UgdGhlIG1hcAogIC8vIGxpdGVyYWwgd2lsbCBiZSBkaXNhbWJpZ3VhdGVkIGFzIGEgc2V0IGxpdGVyYWwgbGF0ZXIuCiAgdm9pZCBpbmZlck1hcEVudHJ5KAogICAgICBNYXBFbnRyeSBlbnRyeSwKICAgICAgVHJlZU5vZGUgcGFyZW50LAogICAgICBEYXJ0VHlwZSBpbmZlcnJlZEtleVR5cGUsCiAgICAgIERhcnRUeXBlIGluZmVycmVkVmFsdWVUeXBlLAogICAgICBEYXJ0VHlwZSBzcHJlYWRDb250ZXh0LAogICAgICBMaXN0PERhcnRUeXBlPiBhY3R1YWxUeXBlcywKICAgICAgTGlzdDxEYXJ0VHlwZT4gYWN0dWFsVHlwZXNGb3JTZXQsCiAgICAgIE1hcDxUcmVlTm9kZSwgRGFydFR5cGU+IGluZmVycmVkU3ByZWFkVHlwZXMsCiAgICAgIGJvb2wgaW5mZXJlbmNlTmVlZGVkLAogICAgICBib29sIHR5cGVDaGVja3NOZWVkZWQpIHsKICAgIGlmIChlbnRyeSBpcyBTcHJlYWRNYXBFbnRyeSkgewogICAgICBEYXJ0VHlwZSBzcHJlYWRUeXBlID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgZW50cnkuZXhwcmVzc2lvbiwgc3ByZWFkQ29udGV4dCwgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlc1tlbnRyeS5leHByZXNzaW9uXSA9IHNwcmVhZFR5cGU7CiAgICAgIGludCBsZW5ndGggPSBhY3R1YWxUeXBlcy5sZW5ndGg7CiAgICAgIGFjdHVhbFR5cGVzLmFkZChudWxsKTsKICAgICAgYWN0dWFsVHlwZXMuYWRkKG51bGwpOwogICAgICBzdG9yZVNwcmVhZE1hcEVudHJ5RWxlbWVudFR5cGVzKAogICAgICAgICAgc3ByZWFkVHlwZSwgZW50cnkuaXNOdWxsQXdhcmUsIGFjdHVhbFR5cGVzLCBsZW5ndGgpOwogICAgICBEYXJ0VHlwZSBhY3R1YWxLZXlUeXBlID0gYWN0dWFsVHlwZXNbbGVuZ3RoXTsKICAgICAgRGFydFR5cGUgYWN0dWFsVmFsdWVUeXBlID0gYWN0dWFsVHlwZXNbbGVuZ3RoICsgMV07CiAgICAgIERhcnRUeXBlIGFjdHVhbEVsZW1lbnRUeXBlID0KICAgICAgICAgIGdldFNwcmVhZEVsZW1lbnRUeXBlKHNwcmVhZFR5cGUsIGVudHJ5LmlzTnVsbEF3YXJlKTsKCiAgICAgIGlmICh0eXBlQ2hlY2tzTmVlZGVkKSB7CiAgICAgICAgaWYgKGFjdHVhbEtleVR5cGUgPT0gbnVsbCkgewogICAgICAgICAgaWYgKHNwcmVhZFR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgICAgICAgIHNwcmVhZFR5cGUuY2xhc3NOb2RlID09IGluZmVycmVyLmNvcmVUeXBlcy5udWxsQ2xhc3MgJiYKICAgICAgICAgICAgICAhZW50cnkuaXNOdWxsQXdhcmUpIHsKICAgICAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZCgKICAgICAgICAgICAgICAgIGVudHJ5LAogICAgICAgICAgICAgICAgbmV3IE1hcEVudHJ5KAogICAgICAgICAgICAgICAgICAgIGluZmVycmVyLmhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihpbmZlcnJlci5oZWxwZXIKICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkUHJvYmxlbShtZXNzYWdlTm9uTnVsbEF3YXJlU3ByZWFkSXNOdWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LCAxKSksCiAgICAgICAgICAgICAgICAgICAgbmV3IE51bGxMaXRlcmFsKCkpCiAgICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGVudHJ5LmZpbGVPZmZzZXQpOwogICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxFbGVtZW50VHlwZSAhPSBudWxsKSB7CiAgICAgICAgICAgIC8vIERvbid0IHJlcG9ydCB0aGUgZXJyb3IgaGVyZSwgaXQgbWlnaHQgYmUgYW4gYW1iaWd1b3VzIFNldC4gIFRoZQogICAgICAgICAgICAvLyBlcnJvciBpcyByZXBvcnRlZCBpbiBjaGVja01hcEVudHJ5IGlmIGl0J3MgZGlzYW1iaWd1YXRlZCBhcyBtYXAuCiAgICAgICAgICAgIGl0ZXJhYmxlU3ByZWFkVHlwZSA9IHNwcmVhZFR5cGU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKAogICAgICAgICAgICAgICAgZW50cnksCiAgICAgICAgICAgICAgICBuZXcgTWFwRW50cnkoCiAgICAgICAgICAgICAgICAgICAgaW5mZXJyZXIuaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGluZmVycmVyLmhlbHBlcgogICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVTcHJlYWRNYXBFbnRyeVR5cGVNaXNtYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHNwcmVhZFR5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpLAogICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpKQogICAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBlbnRyeS5maWxlT2Zmc2V0KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHNwcmVhZFR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgRXhwcmVzc2lvbiBrZXlFcnJvcjsKICAgICAgICAgIEV4cHJlc3Npb24gdmFsdWVFcnJvcjsKICAgICAgICAgIGlmICghaW5mZXJyZXIuaXNBc3NpZ25hYmxlKGluZmVycmVkS2V5VHlwZSwgYWN0dWFsS2V5VHlwZSkpIHsKICAgICAgICAgICAga2V5RXJyb3IgPSBpbmZlcnJlci5oZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgICAgICAgICBpbmZlcnJlci5oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU3ByZWFkTWFwRW50cnlFbGVtZW50S2V5VHlwZU1pc21hdGNoLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbEtleVR5cGUsIGluZmVycmVkS2V5VHlwZSksCiAgICAgICAgICAgICAgICAgICAgZW50cnkuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgIDEpKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghaW5mZXJyZXIuaXNBc3NpZ25hYmxlKGluZmVycmVkVmFsdWVUeXBlLCBhY3R1YWxWYWx1ZVR5cGUpKSB7CiAgICAgICAgICAgIHZhbHVlRXJyb3IgPSBpbmZlcnJlci5oZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgICAgICAgICBpbmZlcnJlci5oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2gKICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoYWN0dWFsVmFsdWVUeXBlLCBpbmZlcnJlZFZhbHVlVHlwZSksCiAgICAgICAgICAgICAgICAgICAgZW50cnkuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgIDEpKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChrZXlFcnJvciAhPSBudWxsIHx8IHZhbHVlRXJyb3IgIT0gbnVsbCkgewogICAgICAgICAgICBrZXlFcnJvciA/Pz0gbmV3IE51bGxMaXRlcmFsKCk7CiAgICAgICAgICAgIHZhbHVlRXJyb3IgPz89IG5ldyBOdWxsTGl0ZXJhbCgpOwogICAgICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKAogICAgICAgICAgICAgICAgZW50cnksCiAgICAgICAgICAgICAgICBuZXcgTWFwRW50cnkoa2V5RXJyb3IsIHZhbHVlRXJyb3IpCiAgICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGVudHJ5LmZpbGVPZmZzZXQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gVXNlICdkeW5hbWljJyBmb3IgZXJyb3IgcmVjb3ZlcnkuCiAgICAgIGlmIChhY3R1YWxLZXlUeXBlID09IG51bGwpIHsKICAgICAgICBhY3R1YWxLZXlUeXBlID0gYWN0dWFsVHlwZXNbbGVuZ3RoXSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgICAgYWN0dWFsVmFsdWVUeXBlID0gYWN0dWFsVHlwZXNbbGVuZ3RoICsgMV0gPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICB9CiAgICAgIC8vIFN0b3JlIHRoZSB0eXBlIGluIGNhc2Ugb2YgYW4gYW1iaWd1b3VzIFNldC4gIFVzZSAnZHluYW1pYycgZm9yIGVycm9yCiAgICAgIC8vIHJlY292ZXJ5LgogICAgICBhY3R1YWxUeXBlc0ZvclNldC5hZGQoYWN0dWFsRWxlbWVudFR5cGUgPz8gY29uc3QgRHluYW1pY1R5cGUoKSk7CgogICAgICBtYXBFbnRyeUNsYXNzID8/PQogICAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLmluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnTWFwRW50cnknKTsKICAgICAgLy8gVE9ETyhkbWl0cnlhcyk6ICBIYW5kbGUgdGhlIGNhc2Ugb2YgYW4gYW1iaWd1b3VzIFNldC4KICAgICAgZW50cnkuZW50cnlUeXBlID0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICBtYXBFbnRyeUNsYXNzLCA8RGFydFR5cGU+W2FjdHVhbEtleVR5cGUsIGFjdHVhbFZhbHVlVHlwZV0pOwoKICAgICAgYm9vbCBpc01hcCA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgICAgLmlzU3VidHlwZU9mKHNwcmVhZFR5cGUsIGluZmVycmVyLmNvcmVUeXBlcy5tYXBDbGFzcy5yYXdUeXBlKTsKICAgICAgYm9vbCBpc0l0ZXJhYmxlID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgICAuaXNTdWJ0eXBlT2Yoc3ByZWFkVHlwZSwgaW5mZXJyZXIuY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MucmF3VHlwZSk7CiAgICAgIGlmIChpc01hcCAmJiAhaXNJdGVyYWJsZSkgewogICAgICAgIG1hcFNwcmVhZE9mZnNldCA9IGVudHJ5LmZpbGVPZmZzZXQ7CiAgICAgIH0KICAgICAgaWYgKCFpc01hcCAmJiBpc0l0ZXJhYmxlKSB7CiAgICAgICAgaXRlcmFibGVTcHJlYWRPZmZzZXQgPSBlbnRyeS5leHByZXNzaW9uLmZpbGVPZmZzZXQ7CiAgICAgIH0KCiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAoZW50cnkgaXMgSWZNYXBFbnRyeSkgewogICAgICBEYXJ0VHlwZSBib29sVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZTsKICAgICAgRGFydFR5cGUgY29uZGl0aW9uVHlwZSA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgIGVudHJ5LmNvbmRpdGlvbiwgYm9vbFR5cGUsIHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiBmYWxzZSk7CiAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgICBib29sVHlwZSwgY29uZGl0aW9uVHlwZSwgZW50cnkuY29uZGl0aW9uLCBlbnRyeS5jb25kaXRpb24uZmlsZU9mZnNldCk7CiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHJlY3Vyc2l2ZSBpbnZvY2F0aW9uIG9mIGluZmVyTWFwRW50cnkgd2lsbCBhZGQgdHdvIHR5cGVzCiAgICAgIC8vIHRvIGFjdHVhbFR5cGVzOyB0aGV5IGFyZSB0aGUgYWN0dWFsIHR5cGVzIG9mIHRoZSBjdXJyZW50IGludm9jYXRpb24gaWYKICAgICAgLy8gdGhlICdlbHNlJyBicmFuY2ggaXMgZW1wdHkuCiAgICAgIGluZmVyTWFwRW50cnkoCiAgICAgICAgICBlbnRyeS50aGVuLAogICAgICAgICAgZW50cnksCiAgICAgICAgICBpbmZlcnJlZEtleVR5cGUsCiAgICAgICAgICBpbmZlcnJlZFZhbHVlVHlwZSwKICAgICAgICAgIHNwcmVhZENvbnRleHQsCiAgICAgICAgICBhY3R1YWxUeXBlcywKICAgICAgICAgIGFjdHVhbFR5cGVzRm9yU2V0LAogICAgICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgICAgIGluZmVyZW5jZU5lZWRlZCwKICAgICAgICAgIHR5cGVDaGVja3NOZWVkZWQpOwogICAgICBpZiAoZW50cnkub3RoZXJ3aXNlICE9IG51bGwpIHsKICAgICAgICAvLyBXZSBuZWVkIHRvIG1vZGlmeSB0aGUgYWN0dWFsIHR5cGVzIGFkZGVkIGluIHRoZSByZWN1cnNpdmUgY2FsbCB0bwogICAgICAgIC8vIGluZmVyTWFwRW50cnkuCiAgICAgICAgRGFydFR5cGUgYWN0dWFsVmFsdWVUeXBlID0gYWN0dWFsVHlwZXMucmVtb3ZlTGFzdCgpOwogICAgICAgIERhcnRUeXBlIGFjdHVhbEtleVR5cGUgPSBhY3R1YWxUeXBlcy5yZW1vdmVMYXN0KCk7CiAgICAgICAgRGFydFR5cGUgYWN0dWFsVHlwZUZvclNldCA9IGFjdHVhbFR5cGVzRm9yU2V0LnJlbW92ZUxhc3QoKTsKICAgICAgICBpbmZlck1hcEVudHJ5KAogICAgICAgICAgICBlbnRyeS5vdGhlcndpc2UsCiAgICAgICAgICAgIGVudHJ5LAogICAgICAgICAgICBpbmZlcnJlZEtleVR5cGUsCiAgICAgICAgICAgIGluZmVycmVkVmFsdWVUeXBlLAogICAgICAgICAgICBzcHJlYWRDb250ZXh0LAogICAgICAgICAgICBhY3R1YWxUeXBlcywKICAgICAgICAgICAgYWN0dWFsVHlwZXNGb3JTZXQsCiAgICAgICAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMsCiAgICAgICAgICAgIGluZmVyZW5jZU5lZWRlZCwKICAgICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICAgICAgaW50IGxlbmd0aCA9IGFjdHVhbFR5cGVzLmxlbmd0aDsKICAgICAgICBhY3R1YWxUeXBlc1tsZW5ndGggLSAyXSA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgICAgICAuZ2V0U3RhbmRhcmRVcHBlckJvdW5kKGFjdHVhbEtleVR5cGUsIGFjdHVhbFR5cGVzW2xlbmd0aCAtIDJdKTsKICAgICAgICBhY3R1YWxUeXBlc1tsZW5ndGggLSAxXSA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgICAgICAuZ2V0U3RhbmRhcmRVcHBlckJvdW5kKGFjdHVhbFZhbHVlVHlwZSwgYWN0dWFsVHlwZXNbbGVuZ3RoIC0gMV0pOwogICAgICAgIGludCBsZW5ndGhGb3JTZXQgPSBhY3R1YWxUeXBlc0ZvclNldC5sZW5ndGg7CiAgICAgICAgYWN0dWFsVHlwZXNGb3JTZXRbbGVuZ3RoRm9yU2V0IC0gMV0gPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgLmdldFN0YW5kYXJkVXBwZXJCb3VuZCgKICAgICAgICAgICAgICAgIGFjdHVhbFR5cGVGb3JTZXQsIGFjdHVhbFR5cGVzRm9yU2V0W2xlbmd0aEZvclNldCAtIDFdKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKGVudHJ5IGlzIEZvck1hcEVudHJ5KSB7CiAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiBpbiBlbnRyeS52YXJpYWJsZXMpIHsKICAgICAgICBpZiAoZGVjbGFyYXRpb24ubmFtZSA9PSBudWxsKSB7CiAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgICBkZWNsYXJhdGlvbi50eXBlID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXRpYWxpemVyLAogICAgICAgICAgICAgICAgZGVjbGFyYXRpb24udHlwZSwgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQoZGVjbGFyYXRpb24pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZW50cnkuY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICAgIGVudHJ5LmNvbmRpdGlvbiwKICAgICAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlLAogICAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwogICAgICB9CiAgICAgIGZvciAoRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGVudHJ5LnVwZGF0ZXMpIHsKICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY29uc3QgVW5rbm93blR5cGUoKSwKICAgICAgICAgICAgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICB9CiAgICAgIC8vIEFjdHVhbCB0eXBlcyBhcmUgYWRkZWQgYnkgdGhlIHJlY3Vyc2l2ZSBjYWxsLgogICAgICByZXR1cm4gaW5mZXJNYXBFbnRyeSgKICAgICAgICAgIGVudHJ5LmJvZHksCiAgICAgICAgICBlbnRyeSwKICAgICAgICAgIGluZmVycmVkS2V5VHlwZSwKICAgICAgICAgIGluZmVycmVkVmFsdWVUeXBlLAogICAgICAgICAgc3ByZWFkQ29udGV4dCwKICAgICAgICAgIGFjdHVhbFR5cGVzLAogICAgICAgICAgYWN0dWFsVHlwZXNGb3JTZXQsCiAgICAgICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICAgICAgaW5mZXJlbmNlTmVlZGVkLAogICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICB9IGVsc2UgaWYgKGVudHJ5IGlzIEZvckluTWFwRW50cnkpIHsKICAgICAgaWYgKGVudHJ5LnZhcmlhYmxlLm5hbWUgPT0gbnVsbCkgewogICAgICAgIGhhbmRsZUZvckluV2l0aG91dFZhcmlhYmxlKAogICAgICAgICAgICBlbnRyeS52YXJpYWJsZSwgZW50cnkuaXRlcmFibGUsIGVudHJ5LnByb2xvZ3VlLAogICAgICAgICAgICBpc0FzeW5jOiBlbnRyeS5pc0FzeW5jKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBoYW5kbGVGb3JJbkRlY2xhcmluZ1ZhcmlhYmxlKAogICAgICAgICAgICBlbnRyeS52YXJpYWJsZSwgZW50cnkuaXRlcmFibGUsIGVudHJ5LnByb2xvZ3VlLAogICAgICAgICAgICBpc0FzeW5jOiBlbnRyeS5pc0FzeW5jKTsKICAgICAgfQogICAgICBpZiAoZW50cnkucHJvYmxlbSAhPSBudWxsKSB7CiAgICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGVudHJ5LnByb2JsZW0sIGNvbnN0IFVua25vd25UeXBlKCksCiAgICAgICAgICAgIGluZmVyZW5jZU5lZWRlZCB8fCB0eXBlQ2hlY2tzTmVlZGVkLAogICAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgfQogICAgICAvLyBBY3R1YWwgdHlwZXMgYXJlIGFkZGVkIGJ5IHRoZSByZWN1cnNpdmUgY2FsbC4KICAgICAgaW5mZXJNYXBFbnRyeSgKICAgICAgICAgIGVudHJ5LmJvZHksCiAgICAgICAgICBlbnRyeSwKICAgICAgICAgIGluZmVycmVkS2V5VHlwZSwKICAgICAgICAgIGluZmVycmVkVmFsdWVUeXBlLAogICAgICAgICAgc3ByZWFkQ29udGV4dCwKICAgICAgICAgIGFjdHVhbFR5cGVzLAogICAgICAgICAgYWN0dWFsVHlwZXNGb3JTZXQsCiAgICAgICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICAgICAgaW5mZXJlbmNlTmVlZGVkLAogICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICB9IGVsc2UgewogICAgICBEYXJ0VHlwZSBrZXlUeXBlID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgZW50cnkua2V5LCBpbmZlcnJlZEtleVR5cGUsIHRydWUsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgRGFydFR5cGUgdmFsdWVUeXBlID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgZW50cnkudmFsdWUsIGluZmVycmVkVmFsdWVUeXBlLCB0cnVlLAogICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgICBpbmZlcnJlZEtleVR5cGUsIGtleVR5cGUsIGVudHJ5LmtleSwgZW50cnkua2V5LmZpbGVPZmZzZXQsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiBpbmZlcnJlZEtleVR5cGUgaXMgVm9pZFR5cGUpOwogICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgICAgaW5mZXJyZWRWYWx1ZVR5cGUsIHZhbHVlVHlwZSwgZW50cnkudmFsdWUsIGVudHJ5LnZhbHVlLmZpbGVPZmZzZXQsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiBpbmZlcnJlZFZhbHVlVHlwZSBpcyBWb2lkVHlwZSk7CiAgICAgIGFjdHVhbFR5cGVzLmFkZChrZXlUeXBlKTsKICAgICAgYWN0dWFsVHlwZXMuYWRkKHZhbHVlVHlwZSk7CiAgICAgIC8vIFVzZSAnZHluYW1pYycgZm9yIGVycm9yIHJlY292ZXJ5LgogICAgICBhY3R1YWxUeXBlc0ZvclNldC5hZGQoY29uc3QgRHluYW1pY1R5cGUoKSk7CiAgICAgIG1hcEVudHJ5T2Zmc2V0ID0gZW50cnkuZmlsZU9mZnNldDsKICAgICAgcmV0dXJuOwogICAgfQogIH0KCiAgdm9pZCBjaGVja01hcEVudHJ5KAogICAgICBNYXBFbnRyeSBlbnRyeSwKICAgICAgVHJlZU5vZGUgcGFyZW50LAogICAgICBFeHByZXNzaW9uIGNhY2hlZEtleSwKICAgICAgRXhwcmVzc2lvbiBjYWNoZWRWYWx1ZSwKICAgICAgRGFydFR5cGUga2V5VHlwZSwKICAgICAgRGFydFR5cGUgdmFsdWVUeXBlLAogICAgICBNYXA8VHJlZU5vZGUsIERhcnRUeXBlPiBpbmZlcnJlZFNwcmVhZFR5cGVzKSB7CiAgICAvLyBJdCdzIGRpc2FtYmlndWF0ZWQgYXMgYSBtYXAgbGl0ZXJhbC4KICAgIGlmIChpdGVyYWJsZVNwcmVhZE9mZnNldCAhPSBudWxsKSB7CiAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoCiAgICAgICAgICBlbnRyeSwKICAgICAgICAgIG5ldyBNYXBFbnRyeSgKICAgICAgICAgICAgICBpbmZlcnJlci5oZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oaW5mZXJyZXIuaGVscGVyCiAgICAgICAgICAgICAgICAgIC5idWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoaXRlcmFibGVTcHJlYWRUeXBlKSwKICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhYmxlU3ByZWFkT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgMSkpLAogICAgICAgICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpKSk7CiAgICB9CiAgICBpZiAoZW50cnkgaXMgU3ByZWFkTWFwRW50cnkpIHsKICAgICAgRGFydFR5cGUgc3ByZWFkVHlwZSA9IGluZmVycmVkU3ByZWFkVHlwZXNbZW50cnkuZXhwcmVzc2lvbl07CiAgICAgIGlmIChzcHJlYWRUeXBlIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZShpbmZlcnJlci5jb3JlVHlwZXMubWFwQ2xhc3MucmF3VHlwZSwKICAgICAgICAgICAgc3ByZWFkVHlwZSwgZW50cnkuZXhwcmVzc2lvbiwgZW50cnkuZXhwcmVzc2lvbi5maWxlT2Zmc2V0KTsKICAgICAgfQogICAgfSBlbHNlIGlmIChlbnRyeSBpcyBJZk1hcEVudHJ5KSB7CiAgICAgIGNoZWNrTWFwRW50cnkoZW50cnkudGhlbiwgZW50cnksIGNhY2hlZEtleSwgY2FjaGVkVmFsdWUsIGtleVR5cGUsCiAgICAgICAgICB2YWx1ZVR5cGUsIGluZmVycmVkU3ByZWFkVHlwZXMpOwogICAgICBpZiAoZW50cnkub3RoZXJ3aXNlICE9IG51bGwpIHsKICAgICAgICBjaGVja01hcEVudHJ5KGVudHJ5Lm90aGVyd2lzZSwgZW50cnksIGNhY2hlZEtleSwgY2FjaGVkVmFsdWUsIGtleVR5cGUsCiAgICAgICAgICAgIHZhbHVlVHlwZSwgaW5mZXJyZWRTcHJlYWRUeXBlcyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZW50cnkgaXMgRm9yTWFwRW50cnkpIHsKICAgICAgaWYgKGVudHJ5LmNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgICAgRGFydFR5cGUgY29uZGl0aW9uVHlwZSA9IGdldEluZmVycmVkVHlwZShlbnRyeS5jb25kaXRpb24sIGluZmVycmVyKTsKICAgICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZSwKICAgICAgICAgICAgY29uZGl0aW9uVHlwZSwgZW50cnkuY29uZGl0aW9uLCBlbnRyeS5jb25kaXRpb24uZmlsZU9mZnNldCk7CiAgICAgIH0KICAgICAgY2hlY2tNYXBFbnRyeShlbnRyeS5ib2R5LCBlbnRyeSwgY2FjaGVkS2V5LCBjYWNoZWRWYWx1ZSwga2V5VHlwZSwKICAgICAgICAgIHZhbHVlVHlwZSwgaW5mZXJyZWRTcHJlYWRUeXBlcyk7CiAgICB9IGVsc2UgaWYgKGVudHJ5IGlzIEZvckluTWFwRW50cnkpIHsKICAgICAgY2hlY2tNYXBFbnRyeShlbnRyeS5ib2R5LCBlbnRyeSwgY2FjaGVkS2V5LCBjYWNoZWRWYWx1ZSwga2V5VHlwZSwKICAgICAgICAgIHZhbHVlVHlwZSwgaW5mZXJyZWRTcHJlYWRUeXBlcyk7CiAgICB9IGVsc2UgewogICAgICAvLyBEbyBub3RoaW5nLiAgQXNzaWduYWJpbGl0eSBjaGVja3MgYXJlIGRvbmUgZHVyaW5nIHR5cGUgaW5mZXJlbmNlLgogICAgfQogIH0KCiAgdm9pZCB2aXNpdE1hcExpdGVyYWxKdWRnbWVudChNYXBMaXRlcmFsSnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHZhciBtYXBDbGFzcyA9IGluZmVycmVyLmNvcmVUeXBlcy5tYXBDbGFzczsKICAgIHZhciBtYXBUeXBlID0gbWFwQ2xhc3MudGhpc1R5cGU7CiAgICBMaXN0PERhcnRUeXBlPiBpbmZlcnJlZFR5cGVzOwogICAgRGFydFR5cGUgaW5mZXJyZWRLZXlUeXBlOwogICAgRGFydFR5cGUgaW5mZXJyZWRWYWx1ZVR5cGU7CiAgICBMaXN0PERhcnRUeXBlPiBmb3JtYWxUeXBlczsKICAgIExpc3Q8RGFydFR5cGU+IGFjdHVhbFR5cGVzOwogICAgTGlzdDxEYXJ0VHlwZT4gYWN0dWFsVHlwZXNGb3JTZXQ7CiAgICBhc3NlcnQoKG5vZGUua2V5VHlwZSBpcyBJbXBsaWNpdFR5cGVBcmd1bWVudCkgPT0KICAgICAgICAobm9kZS52YWx1ZVR5cGUgaXMgSW1wbGljaXRUeXBlQXJndW1lbnQpKTsKICAgIGJvb2wgaW5mZXJlbmNlTmVlZGVkID0gbm9kZS5rZXlUeXBlIGlzIEltcGxpY2l0VHlwZUFyZ3VtZW50OwogICAgYm9vbCB0eXBlQ29udGV4dElzTWFwID0gbm9kZS5rZXlUeXBlIGlzISBJbXBsaWNpdFR5cGVBcmd1bWVudDsKICAgIGJvb2wgdHlwZUNvbnRleHRJc0l0ZXJhYmxlID0gZmFsc2U7CiAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwgJiYgaW5mZXJlbmNlTmVlZGVkKSB7CiAgICAgIC8vIEFtYmlndW91cyBzZXQvbWFwIGxpdGVyYWwKICAgICAgRGFydFR5cGUgY29udGV4dCA9CiAgICAgICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQudW5mdXR1cmVUeXBlKHR5cGVDb250ZXh0KTsKICAgICAgaWYgKGNvbnRleHQgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgIHR5cGVDb250ZXh0SXNNYXAgPSB0eXBlQ29udGV4dElzTWFwIHx8CiAgICAgICAgICAgIGluZmVycmVyLmNsYXNzSGllcmFyY2h5CiAgICAgICAgICAgICAgICAuaXNTdWJ0eXBlT2YoY29udGV4dC5jbGFzc05vZGUsIGluZmVycmVyLmNvcmVUeXBlcy5tYXBDbGFzcyk7CiAgICAgICAgdHlwZUNvbnRleHRJc0l0ZXJhYmxlID0gdHlwZUNvbnRleHRJc0l0ZXJhYmxlIHx8CiAgICAgICAgICAgIGluZmVycmVyLmNsYXNzSGllcmFyY2h5LmlzU3VidHlwZU9mKAogICAgICAgICAgICAgICAgY29udGV4dC5jbGFzc05vZGUsIGluZmVycmVyLmNvcmVUeXBlcy5pdGVyYWJsZUNsYXNzKTsKICAgICAgICBpZiAobm9kZS5lbnRyaWVzLmlzRW1wdHkgJiYKICAgICAgICAgICAgdHlwZUNvbnRleHRJc0l0ZXJhYmxlICYmCiAgICAgICAgICAgICF0eXBlQ29udGV4dElzTWFwKSB7CiAgICAgICAgICAvLyBTZXQgbGl0ZXJhbAogICAgICAgICAgU2V0TGl0ZXJhbEp1ZGdtZW50IHNldExpdGVyYWwgPSBuZXcgU2V0TGl0ZXJhbEp1ZGdtZW50KFtdLAogICAgICAgICAgICAgIHR5cGVBcmd1bWVudDogY29uc3QgSW1wbGljaXRUeXBlQXJndW1lbnQoKSwgaXNDb25zdDogbm9kZS5pc0NvbnN0KQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICAgICAgICBub2RlLnBhcmVudC5yZXBsYWNlQ2hpbGQobm9kZSwgc2V0TGl0ZXJhbCk7CiAgICAgICAgICB2aXNpdFNldExpdGVyYWxKdWRnbWVudChzZXRMaXRlcmFsLCB0eXBlQ29udGV4dCk7CiAgICAgICAgICBub2RlLmluZmVycmVkVHlwZSA9IHNldExpdGVyYWwuaW5mZXJyZWRUeXBlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYm9vbCB0eXBlQ2hlY2tzTmVlZGVkID0gIWluZmVycmVyLmlzVG9wTGV2ZWw7CiAgICBNYXA8VHJlZU5vZGUsIERhcnRUeXBlPiBpbmZlcnJlZFNwcmVhZFR5cGVzOwogICAgaWYgKGluZmVyZW5jZU5lZWRlZCB8fCB0eXBlQ2hlY2tzTmVlZGVkKSB7CiAgICAgIGZvcm1hbFR5cGVzID0gW107CiAgICAgIGFjdHVhbFR5cGVzID0gW107CiAgICAgIGFjdHVhbFR5cGVzRm9yU2V0ID0gW107CiAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMgPSBuZXcgTWFwPFRyZWVOb2RlLCBEYXJ0VHlwZT4uaWRlbnRpdHkoKTsKICAgIH0KICAgIGlmIChpbmZlcmVuY2VOZWVkZWQpIHsKICAgICAgaW5mZXJyZWRUeXBlcyA9IFtjb25zdCBVbmtub3duVHlwZSgpLCBjb25zdCBVbmtub3duVHlwZSgpXTsKICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmluZmVyR2VuZXJpY0Z1bmN0aW9uT3JUeXBlKG1hcFR5cGUsCiAgICAgICAgICBtYXBDbGFzcy50eXBlUGFyYW1ldGVycywgbnVsbCwgbnVsbCwgdHlwZUNvbnRleHQsIGluZmVycmVkVHlwZXMsCiAgICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QpOwogICAgICBpbmZlcnJlZEtleVR5cGUgPSBpbmZlcnJlZFR5cGVzWzBdOwogICAgICBpbmZlcnJlZFZhbHVlVHlwZSA9IGluZmVycmVkVHlwZXNbMV07CiAgICB9IGVsc2UgewogICAgICBpbmZlcnJlZEtleVR5cGUgPSBub2RlLmtleVR5cGU7CiAgICAgIGluZmVycmVkVmFsdWVUeXBlID0gbm9kZS52YWx1ZVR5cGU7CiAgICB9CiAgICBMaXN0PEV4cHJlc3Npb24+IGNhY2hlZEtleXMgPSBuZXcgTGlzdChub2RlLmVudHJpZXMubGVuZ3RoKTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gY2FjaGVkVmFsdWVzID0gbmV3IExpc3Qobm9kZS5lbnRyaWVzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZW50cmllcy5sZW5ndGg7IGkrKykgewogICAgICBNYXBFbnRyeSBlbnRyeSA9IG5vZGUuZW50cmllc1tpXTsKICAgICAgaWYgKGVudHJ5IGlzISBDb250cm9sRmxvd01hcEVudHJ5KSB7CiAgICAgICAgY2FjaGVkS2V5c1tpXSA9IG5vZGUuZW50cmllc1tpXS5rZXk7CiAgICAgICAgY2FjaGVkVmFsdWVzW2ldID0gbm9kZS5lbnRyaWVzW2ldLnZhbHVlOwogICAgICB9CiAgICB9CiAgICBib29sIGhhc01hcEVudHJ5ID0gZmFsc2U7CiAgICBib29sIGhhc01hcFNwcmVhZCA9IGZhbHNlOwogICAgYm9vbCBoYXNJdGVyYWJsZVNwcmVhZCA9IGZhbHNlOwogICAgaWYgKGluZmVyZW5jZU5lZWRlZCB8fCB0eXBlQ2hlY2tzTmVlZGVkKSB7CiAgICAgIG1hcEVudHJ5T2Zmc2V0ID0gbnVsbDsKICAgICAgbWFwU3ByZWFkT2Zmc2V0ID0gbnVsbDsKICAgICAgaXRlcmFibGVTcHJlYWRPZmZzZXQgPSBudWxsOwogICAgICBpdGVyYWJsZVNwcmVhZFR5cGUgPSBudWxsOwogICAgICBEYXJ0VHlwZSBzcHJlYWRUeXBlQ29udGV4dCA9IGNvbnN0IFVua25vd25UeXBlKCk7CiAgICAgIGlmICh0eXBlQ29udGV4dElzSXRlcmFibGUgJiYgIXR5cGVDb250ZXh0SXNNYXApIHsKICAgICAgICBzcHJlYWRUeXBlQ29udGV4dCA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgICAgICAuZ2V0VHlwZUFzSW5zdGFuY2VPZih0eXBlQ29udGV4dCwgaW5mZXJyZXIuY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MpOwogICAgICB9IGVsc2UgaWYgKCF0eXBlQ29udGV4dElzSXRlcmFibGUgJiYgdHlwZUNvbnRleHRJc01hcCkgewogICAgICAgIHNwcmVhZFR5cGVDb250ZXh0ID0gbmV3IEludGVyZmFjZVR5cGUoaW5mZXJyZXIuY29yZVR5cGVzLm1hcENsYXNzLAogICAgICAgICAgICA8RGFydFR5cGU+W2luZmVycmVkS2V5VHlwZSwgaW5mZXJyZWRWYWx1ZVR5cGVdKTsKICAgICAgfQogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZW50cmllcy5sZW5ndGg7ICsraSkgewogICAgICAgIE1hcEVudHJ5IGVudHJ5ID0gbm9kZS5lbnRyaWVzW2ldOwogICAgICAgIGluZmVyTWFwRW50cnkoCiAgICAgICAgICAgIGVudHJ5LAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICBpbmZlcnJlZEtleVR5cGUsCiAgICAgICAgICAgIGluZmVycmVkVmFsdWVUeXBlLAogICAgICAgICAgICBzcHJlYWRUeXBlQ29udGV4dCwKICAgICAgICAgICAgYWN0dWFsVHlwZXMsCiAgICAgICAgICAgIGFjdHVhbFR5cGVzRm9yU2V0LAogICAgICAgICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQsCiAgICAgICAgICAgIHR5cGVDaGVja3NOZWVkZWQpOwogICAgICAgIGlmIChpbmZlcmVuY2VOZWVkZWQpIHsKICAgICAgICAgIGZvcm1hbFR5cGVzLmFkZChtYXBUeXBlLnR5cGVBcmd1bWVudHNbMF0pOwogICAgICAgICAgZm9ybWFsVHlwZXMuYWRkKG1hcFR5cGUudHlwZUFyZ3VtZW50c1sxXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGhhc01hcEVudHJ5ID0gbWFwRW50cnlPZmZzZXQgIT0gbnVsbDsKICAgICAgaGFzTWFwU3ByZWFkID0gbWFwU3ByZWFkT2Zmc2V0ICE9IG51bGw7CiAgICAgIGhhc0l0ZXJhYmxlU3ByZWFkID0gaXRlcmFibGVTcHJlYWRPZmZzZXQgIT0gbnVsbDsKICAgIH0KICAgIGlmIChpbmZlcmVuY2VOZWVkZWQpIHsKICAgICAgYm9vbCBjYW5CZVNldCA9ICFoYXNNYXBTcHJlYWQgJiYgIWhhc01hcEVudHJ5ICYmICF0eXBlQ29udGV4dElzTWFwOwogICAgICBib29sIGNhbkJlTWFwID0gIWhhc0l0ZXJhYmxlU3ByZWFkICYmICF0eXBlQ29udGV4dElzSXRlcmFibGU7CiAgICAgIGlmIChjYW5CZVNldCAmJiAhY2FuQmVNYXApIHsKICAgICAgICBMaXN0PEV4cHJlc3Npb24+IHNldEVsZW1lbnRzID0gPEV4cHJlc3Npb24+W107CiAgICAgICAgTGlzdDxEYXJ0VHlwZT4gZm9ybWFsVHlwZXNGb3JTZXQgPSA8RGFydFR5cGU+W107CiAgICAgICAgSW50ZXJmYWNlVHlwZSBzZXRUeXBlID0gaW5mZXJyZXIuY29yZVR5cGVzLnNldENsYXNzLnRoaXNUeXBlOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5lbnRyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBzZXRFbGVtZW50cy5hZGQoY29udmVydFRvRWxlbWVudChub2RlLmVudHJpZXNbaV0sIGluZmVycmVyLmhlbHBlcikpOwogICAgICAgICAgZm9ybWFsVHlwZXNGb3JTZXQuYWRkKHNldFR5cGUudHlwZUFyZ3VtZW50c1swXSk7CiAgICAgICAgfQoKICAgICAgICBMaXN0PERhcnRUeXBlPiBpbmZlcnJlZFR5cGVzRm9yU2V0ID0gPERhcnRUeXBlPltjb25zdCBVbmtub3duVHlwZSgpXTsKICAgICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUoCiAgICAgICAgICAgIHNldFR5cGUsCiAgICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5zZXRDbGFzcy50eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgdHlwZUNvbnRleHQsCiAgICAgICAgICAgIGluZmVycmVkVHlwZXNGb3JTZXQsCiAgICAgICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmluZmVyR2VuZXJpY0Z1bmN0aW9uT3JUeXBlKAogICAgICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMuc2V0Q2xhc3MudGhpc1R5cGUsCiAgICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5zZXRDbGFzcy50eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgZm9ybWFsVHlwZXNGb3JTZXQsCiAgICAgICAgICAgIGFjdHVhbFR5cGVzRm9yU2V0LAogICAgICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICAgICAgaW5mZXJyZWRUeXBlc0ZvclNldCk7CiAgICAgICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlQXJndW1lbnQgPSBpbmZlcnJlZFR5cGVzRm9yU2V0WzBdOwogICAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKAogICAgICAgICAgICBpbmZlcnJlci51cmksCiAgICAgICAgICAgIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICAgICAgJ3R5cGVBcmdzJywKICAgICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZUFyZ3MoW2luZmVycmVkVHlwZUFyZ3VtZW50XSkpOwoKICAgICAgICBTZXRMaXRlcmFsSnVkZ21lbnQgc2V0TGl0ZXJhbCA9IG5ldyBTZXRMaXRlcmFsSnVkZ21lbnQoc2V0RWxlbWVudHMsCiAgICAgICAgICAgIHR5cGVBcmd1bWVudDogaW5mZXJyZWRUeXBlQXJndW1lbnQsIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgICAgICBub2RlLnBhcmVudC5yZXBsYWNlQ2hpbGQobm9kZSwgc2V0TGl0ZXJhbCk7CiAgICAgICAgaWYgKHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2V0TGl0ZXJhbC5leHByZXNzaW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBjaGVja0VsZW1lbnQoc2V0TGl0ZXJhbC5leHByZXNzaW9uc1tpXSwgc2V0TGl0ZXJhbCwKICAgICAgICAgICAgICAgIHNldExpdGVyYWwudHlwZUFyZ3VtZW50LCBpbmZlcnJlZFNwcmVhZFR5cGVzKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gc2V0TGl0ZXJhbC5pbmZlcnJlZFR5cGUgPQogICAgICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShpbmZlcnJlci5jb3JlVHlwZXMuc2V0Q2xhc3MsIGluZmVycmVkVHlwZXNGb3JTZXQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoY2FuQmVTZXQgJiYgY2FuQmVNYXAgJiYgbm9kZS5lbnRyaWVzLmlzTm90RW1wdHkpIHsKICAgICAgICBub2RlLnBhcmVudC5yZXBsYWNlQ2hpbGQoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIGluZmVycmVyLmhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihpbmZlcnJlci5oZWxwZXIKICAgICAgICAgICAgICAgIC5idWlsZFByb2JsZW0obWVzc2FnZUNhbnREaXNhbWJpZ3VhdGVOb3RFbm91Z2hJbmZvcm1hdGlvbiwKICAgICAgICAgICAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsIDEpKSk7CiAgICAgICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBjb25zdCBCb3R0b21UeXBlKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghY2FuQmVTZXQgJiYgIWNhbkJlTWFwKSB7CiAgICAgICAgaWYgKCFpbmZlcnJlci5pc1RvcExldmVsKSB7CiAgICAgICAgICBub2RlLnBhcmVudC5yZXBsYWNlQ2hpbGQoCiAgICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgICBpbmZlcnJlci5oZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oaW5mZXJyZXIuaGVscGVyCiAgICAgICAgICAgICAgICAgIC5idWlsZFByb2JsZW0obWVzc2FnZUNhbnREaXNhbWJpZ3VhdGVBbWJpZ3VvdXNJbmZvcm1hdGlvbiwKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZmlsZU9mZnNldCwgMSkpKTsKICAgICAgICB9CiAgICAgICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBjb25zdCBCb3R0b21UeXBlKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZSgKICAgICAgICAgIG1hcFR5cGUsCiAgICAgICAgICBtYXBDbGFzcy50eXBlUGFyYW1ldGVycywKICAgICAgICAgIGZvcm1hbFR5cGVzLAogICAgICAgICAgYWN0dWFsVHlwZXMsCiAgICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICAgIGluZmVycmVkVHlwZXMpOwogICAgICBpbmZlcnJlZEtleVR5cGUgPSBpbmZlcnJlZFR5cGVzWzBdOwogICAgICBpbmZlcnJlZFZhbHVlVHlwZSA9IGluZmVycmVkVHlwZXNbMV07CiAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKAogICAgICAgICAgaW5mZXJyZXIudXJpLAogICAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgJ3R5cGVBcmdzJywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGVBcmdzKAogICAgICAgICAgICAgIFtpbmZlcnJlZEtleVR5cGUsIGluZmVycmVkVmFsdWVUeXBlXSkpOwogICAgICBub2RlLmtleVR5cGUgPSBpbmZlcnJlZEtleVR5cGU7CiAgICAgIG5vZGUudmFsdWVUeXBlID0gaW5mZXJyZWRWYWx1ZVR5cGU7CiAgICB9CiAgICBpZiAodHlwZUNoZWNrc05lZWRlZCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZW50cmllcy5sZW5ndGg7ICsraSkgewogICAgICAgIGNoZWNrTWFwRW50cnkobm9kZS5lbnRyaWVzW2ldLCBub2RlLCBjYWNoZWRLZXlzW2ldLCBjYWNoZWRWYWx1ZXNbaV0sCiAgICAgICAgICAgIG5vZGUua2V5VHlwZSwgbm9kZS52YWx1ZVR5cGUsIGluZmVycmVkU3ByZWFkVHlwZXMpOwogICAgICB9CiAgICB9CiAgICBub2RlLmluZmVycmVkVHlwZSA9CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUobWFwQ2xhc3MsIFtpbmZlcnJlZEtleVR5cGUsIGluZmVycmVkVmFsdWVUeXBlXSk7CiAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwpIHsKICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGluZmVycmVyLmxpYnJhcnk7CiAgICAgIC8vIEVpdGhlciBib3RoIFtfZGVjbGFyZWRLZXlUeXBlXSBhbmQgW19kZWNsYXJlZFZhbHVlVHlwZV0gYXJlIG9taXR0ZWQgb3IKICAgICAgLy8gbm9uZSBvZiB0aGVtLCBzbyB3ZSBtYXkganVzdCBjaGVjayBvbmUuCiAgICAgIGlmIChpbmZlcmVuY2VOZWVkZWQpIHsKICAgICAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5NYXBMaXRlcmFsKAogICAgICAgICAgICBub2RlLCBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQsIGluZmVycmVyLmhlbHBlci51cmksCiAgICAgICAgICAgIGluZmVycmVkOiB0cnVlKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCB2aXNpdE1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpZiAobm9kZS5uYW1lLm5hbWUgPT0gJ3VuYXJ5LScgJiYKICAgICAgICBub2RlLmFyZ3VtZW50cy50eXBlcy5pc0VtcHR5ICYmCiAgICAgICAgbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5pc0VtcHR5ICYmCiAgICAgICAgbm9kZS5hcmd1bWVudHMubmFtZWQuaXNFbXB0eSkgewogICAgICAvLyBSZXBsYWNlIGludGVnZXIgbGl0ZXJhbHMgaW4gYSBkb3VibGUgY29udGV4dCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgIC8vIGRvdWJsZSBsaXRlcmFsIGlmIGl0J3MgZXhhY3QuICBGb3IgZG91YmxlIGxpdGVyYWxzLCB0aGUgbmVnYXRpb24gaXMKICAgICAgLy8gZm9sZGVkIGF3YXkuICBJbiBhbnkgbm9uLWRvdWJsZSBjb250ZXh0LCBvciBpZiB0aGVyZSBpcyBubyBleGFjdAogICAgICAvLyBkb3VibGUgdmFsdWUsIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgaW50ZWdlciBsaXRlcmFsIGlzIGxlZnQuICBUaGUKICAgICAgLy8gbmVnYXRpb24gaXMgbm90IGZvbGRlZCBhd2F5IHNvIHRoYXQgcGxhdGZvcm1zIHdpdGggd2ViIGxpdGVyYWxzIGNhbgogICAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIChub24tbmVnYXRlZCkgMHg4MDAwMDAwMDAwMDAwMDAwIHJlcHJlc2VudGVkIGFzCiAgICAgIC8vIGludGVnZXIgbGl0ZXJhbCAtOTIyMzM3MjAzNjg1NDc3NTgwOCB3aGljaCBzaG91bGQgYmUgYSBwb3NpdGl2ZSBudW1iZXIsCiAgICAgIC8vIGFuZCBuZWdhdGVkIDkyMjMzNzIwMzY4NTQ3NzU4MDggcmVwcmVzZW50ZWQgYXMKICAgICAgLy8gLTkyMjMzNzIwMzY4NTQ3NzU4MDgudW5hcnktKCkgd2hpY2ggc2hvdWxkIGJlIGEgbmVnYXRpdmUgbnVtYmVyLgogICAgICBpZiAobm9kZS5yZWNlaXZlciBpcyBJbnRKdWRnbWVudCkgewogICAgICAgIEludEp1ZGdtZW50IHJlY2VpdmVyID0gbm9kZS5yZWNlaXZlcjsKICAgICAgICBpZiAoaW5mZXJyZXIuaXNEb3VibGVDb250ZXh0KHR5cGVDb250ZXh0KSkgewogICAgICAgICAgZG91YmxlIGRvdWJsZVZhbHVlID0gcmVjZWl2ZXIuYXNEb3VibGUobmVnYXRlZDogdHJ1ZSk7CiAgICAgICAgICBpZiAoZG91YmxlVmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICBub2RlLnBhcmVudC5yZXBsYWNlQ2hpbGQoCiAgICAgICAgICAgICAgICBub2RlLCBEb3VibGVMaXRlcmFsKGRvdWJsZVZhbHVlKS4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldCk7CiAgICAgICAgICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gaW5mZXJyZXIuY29yZVR5cGVzLmRvdWJsZUNsYXNzLnJhd1R5cGU7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBFeHByZXNzaW9uIGVycm9yID0gY2hlY2tXZWJJbnRMaXRlcmFsc0Vycm9ySWZVbmV4YWN0KAogICAgICAgICAgICBpbmZlcnJlciwgcmVjZWl2ZXIudmFsdWUsIHJlY2VpdmVyLmxpdGVyYWwsIHJlY2VpdmVyLmZpbGVPZmZzZXQpOwogICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7CiAgICAgICAgICBub2RlLnBhcmVudC5yZXBsYWNlQ2hpbGQobm9kZSwgZXJyb3IpOwogICAgICAgICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBjb25zdCBCb3R0b21UeXBlKCk7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobm9kZS5yZWNlaXZlciBpcyBTaGFkb3dMYXJnZUludExpdGVyYWwpIHsKICAgICAgICBTaGFkb3dMYXJnZUludExpdGVyYWwgcmVjZWl2ZXIgPSBub2RlLnJlY2VpdmVyOwogICAgICAgIGlmICghcmVjZWl2ZXIuaXNQYXJlbnRoZXNpemVkKSB7CiAgICAgICAgICBpZiAoaW5mZXJyZXIuaXNEb3VibGVDb250ZXh0KHR5cGVDb250ZXh0KSkgewogICAgICAgICAgICBkb3VibGUgZG91YmxlVmFsdWUgPSByZWNlaXZlci5hc0RvdWJsZShuZWdhdGVkOiB0cnVlKTsKICAgICAgICAgICAgaWYgKGRvdWJsZVZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICBub2RlLnBhcmVudC5yZXBsYWNlQ2hpbGQobm9kZSwKICAgICAgICAgICAgICAgICAgRG91YmxlTGl0ZXJhbChkb3VibGVWYWx1ZSkuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQpOwogICAgICAgICAgICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gaW5mZXJyZXIuY29yZVR5cGVzLmRvdWJsZUNsYXNzLnJhd1R5cGU7CiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGludCBpbnRWYWx1ZSA9IHJlY2VpdmVyLmFzSW50NjQobmVnYXRlZDogdHJ1ZSk7CiAgICAgICAgICBpZiAoaW50VmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICBFeHByZXNzaW9uIGVycm9yID0gaW5mZXJyZXIuaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgICAgICAgICAgaW5mZXJyZXIuaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUludGVnZXJMaXRlcmFsSXNPdXRPZlJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHJlY2VpdmVyLmxpdGVyYWwpLAogICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXIubGl0ZXJhbC5sZW5ndGgpKTsKICAgICAgICAgICAgbm9kZS5wYXJlbnQucmVwbGFjZUNoaWxkKG5vZGUsIGVycm9yKTsKICAgICAgICAgICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBjb25zdCBCb3R0b21UeXBlKCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGludFZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgRXhwcmVzc2lvbiBlcnJvciA9IGNoZWNrV2ViSW50TGl0ZXJhbHNFcnJvcklmVW5leGFjdCgKICAgICAgICAgICAgICAgIGluZmVycmVyLCBpbnRWYWx1ZSwgcmVjZWl2ZXIubGl0ZXJhbCwgcmVjZWl2ZXIuZmlsZU9mZnNldCk7CiAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgbm9kZS5wYXJlbnQucmVwbGFjZUNoaWxkKG5vZGUsIGVycm9yKTsKICAgICAgICAgICAgICBub2RlLmluZmVycmVkVHlwZSA9IGNvbnN0IEJvdHRvbVR5cGUoKTsKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBub2RlLnJlY2VpdmVyID0gSW50TGl0ZXJhbCgtaW50VmFsdWUpCiAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5yZWNlaXZlci5maWxlT2Zmc2V0CiAgICAgICAgICAgICAgLi5wYXJlbnQgPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdmFyIGluZmVyZW5jZVJlc3VsdCA9IGluZmVycmVyLmluZmVyTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBub2RlLCBub2RlLnJlY2VpdmVyLCBub2RlLmZpbGVPZmZzZXQsIG5vZGUuX2lzSW1wbGljaXRDYWxsLCB0eXBlQ29udGV4dCwKICAgICAgICBkZXN1Z2FyZWRJbnZvY2F0aW9uOiBub2RlKTsKICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gaW5mZXJlbmNlUmVzdWx0LnR5cGU7CiAgfQoKICB2b2lkIHZpc2l0TmFtZWRGdW5jdGlvbkV4cHJlc3Npb25KdWRnbWVudCgKICAgICAgTmFtZWRGdW5jdGlvbkV4cHJlc3Npb25KdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgRXhwcmVzc2lvbiBpbml0aWFsaXplciA9IG5vZGUudmFyaWFibGVKdWRnbWVudC5pbml0aWFsaXplcjsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihpbml0aWFsaXplciwgdHlwZUNvbnRleHQsIHRydWUpOwogICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBnZXRJbmZlcnJlZFR5cGUoaW5pdGlhbGl6ZXIsIGluZmVycmVyKTsKICAgIG5vZGUudmFyaWFibGUudHlwZSA9IG5vZGUuaW5mZXJyZWRUeXBlOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Tm90KE5vdCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgdmFyIG9wZXJhbmQgPSBub2RlLm9wZXJhbmQ7CiAgICB2YXIgYm9vbFR5cGUgPSBpbmZlcnJlci5jb3JlVHlwZXMuYm9vbENsYXNzLnJhd1R5cGU7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24ob3BlcmFuZCwgYm9vbFR5cGUsICFpbmZlcnJlci5pc1RvcExldmVsKTsKICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoYm9vbFR5cGUsIGdldEluZmVycmVkVHlwZShvcGVyYW5kLCBpbmZlcnJlciksCiAgICAgICAgbm9kZS5vcGVyYW5kLCBub2RlLmZpbGVPZmZzZXQpOwogIH0KCiAgdm9pZCB2aXNpdE51bGxBd2FyZU1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgTnVsbEF3YXJlTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICB2YXIgaW5mZXJlbmNlUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJNZXRob2RJbnZvY2F0aW9uKAogICAgICAgIG5vZGUsIG5vZGUudmFyaWFibGUuaW5pdGlhbGl6ZXIsIG5vZGUuZmlsZU9mZnNldCwgZmFsc2UsIHR5cGVDb250ZXh0LAogICAgICAgIHJlY2VpdmVyVmFyaWFibGU6IG5vZGUudmFyaWFibGUsCiAgICAgICAgZGVzdWdhcmVkSW52b2NhdGlvbjogbm9kZS5fZGVzdWdhcmVkSW52b2NhdGlvbik7CiAgICBub2RlLmluZmVycmVkVHlwZSA9IGluZmVyZW5jZVJlc3VsdC50eXBlOwogICAgbm9kZS5ib2R5LnN0YXRpY1R5cGUgPSBub2RlLmluZmVycmVkVHlwZTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdE51bGxBd2FyZVByb3BlcnR5R2V0SnVkZ21lbnQoCiAgICAgIE51bGxBd2FyZVByb3BlcnR5R2V0SnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGluZmVycmVyLmluZmVyUHJvcGVydHlHZXQoCiAgICAgICAgbm9kZSwgbm9kZS5yZWNlaXZlckp1ZGdtZW50LCBub2RlLmZpbGVPZmZzZXQsIHR5cGVDb250ZXh0LAogICAgICAgIHJlY2VpdmVyVmFyaWFibGU6IG5vZGUudmFyaWFibGUsIGRlc3VnYXJlZEdldDogbm9kZS5fZGVzdWdhcmVkR2V0KTsKICAgIG5vZGUuYm9keS5zdGF0aWNUeXBlID0gbm9kZS5pbmZlcnJlZFR5cGU7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROdWxsTGl0ZXJhbChOdWxsTGl0ZXJhbCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExldChMZXQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIERhcnRUeXBlIHZhcmlhYmxlVHlwZSA9IG5vZGUudmFyaWFibGUudHlwZTsKICAgIGlmICh2YXJpYWJsZVR5cGUgPT0gY29uc3QgRHluYW1pY1R5cGUoKSkgewogICAgICByZXR1cm4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgdHlwZUNvbnRleHQpOwogICAgfQogICAgRXhwcmVzc2lvbiBpbml0aWFsaXplciA9IG5vZGUudmFyaWFibGUuaW5pdGlhbGl6ZXI7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oaW5pdGlhbGl6ZXIsIHZhcmlhYmxlVHlwZSwgdHJ1ZSwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIEV4cHJlc3Npb24gYm9keSA9IG5vZGUuYm9keTsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihib2R5LCB0eXBlQ29udGV4dCwgdHJ1ZSwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICAvLyBUT0RPKGFoZSk6IFRoaXMgc2hvdWxkbid0IGJlIG5lZWRlZC4gU2VlIEluZmVycmVkVHlwZVZpc2l0b3IudmlzaXRMZXQuCiAgICBpbmZlcnJlci5zdG9yZUluZmVycmVkVHlwZShub2RlLCBnZXRJbmZlcnJlZFR5cGUoYm9keSwgaW5mZXJyZXIpKTsKICB9CgogIHZvaWQgdmlzaXRQcm9wZXJ0eUFzc2lnbm1lbnRKdWRnbWVudCgKICAgICAgUHJvcGVydHlBc3NpZ25tZW50SnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHZhciByZWNlaXZlclR5cGUgPSBub2RlLl9pbmZlclJlY2VpdmVyKGluZmVycmVyKTsKCiAgICBEYXJ0VHlwZSByZWFkVHlwZTsKICAgIGlmIChub2RlLnJlYWQgIT0gbnVsbCkgewogICAgICB2YXIgcmVhZE1lbWJlciA9IGluZmVycmVyLmZpbmRQcm9wZXJ0eUdldE1lbWJlcihyZWNlaXZlclR5cGUsIG5vZGUucmVhZCwKICAgICAgICAgIGluc3RydW1lbnRlZDogZmFsc2UpOwogICAgICByZWFkVHlwZSA9IGluZmVycmVyLmdldENhbGxlZVR5cGUocmVhZE1lbWJlciwgcmVjZWl2ZXJUeXBlKTsKICAgICAgaW5mZXJyZXIuaGFuZGxlUHJvcGVydHlHZXRDb250cmF2YXJpYW5jZSgKICAgICAgICAgIG5vZGUucmVjZWl2ZXIsCiAgICAgICAgICByZWFkTWVtYmVyLAogICAgICAgICAgbm9kZS5yZWFkIGlzIFByb3BlcnR5R2V0ID8gbm9kZS5yZWFkIDogbnVsbCwKICAgICAgICAgIG5vZGUucmVhZCwKICAgICAgICAgIHJlYWRUeXBlLAogICAgICAgICAgbm9kZS5yZWFkLmZpbGVPZmZzZXQpOwogICAgICBub2RlLl9zdG9yZUxldFR5cGUoaW5mZXJyZXIsIG5vZGUucmVhZCwgcmVhZFR5cGUpOwogICAgfQogICAgTWVtYmVyIHdyaXRlTWVtYmVyOwogICAgaWYgKG5vZGUud3JpdGUgIT0gbnVsbCkgewogICAgICB3cml0ZU1lbWJlciA9IG5vZGUuX2hhbmRsZVdyaXRlQ29udHJhdmFyaWFuY2UoaW5mZXJyZXIsIHJlY2VpdmVyVHlwZSk7CiAgICB9CiAgICAvLyBUbyByZXBsaWNhdGUgYW5hbHl6ZXIgYmVoYXZpb3IsIHdlIGJhc2UgdHlwZSBpbmZlcmVuY2Ugb24gdGhlIHdyaXRlCiAgICAvLyBtZW1iZXIuICBUT0RPKHBhdWxiZXJyeSk6IHdvdWxkIGl0IGJlIGJldHRlciB0byB1c2UgdGhlIHJlYWQgbWVtYmVyIHdoZW4KICAgIC8vIGRvaW5nIGNvbXBvdW5kIGFzc2lnbm1lbnQ/CiAgICB2YXIgd3JpdGVDb250ZXh0ID0gaW5mZXJyZXIuZ2V0U2V0dGVyVHlwZSh3cml0ZU1lbWJlciwgcmVjZWl2ZXJUeXBlKTsKICAgIG5vZGUuX2luZmVyUmhzKGluZmVycmVyLCByZWFkVHlwZSwgd3JpdGVDb250ZXh0KTsKICAgIG5vZGUubnVsbEF3YXJlR3VhcmQ/LnN0YXRpY1R5cGUgPSBub2RlLmluZmVycmVkVHlwZTsKICAgIG5vZGUuX3JlcGxhY2VXaXRoRGVzdWdhcmVkKCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQcm9wZXJ0eUdldChQcm9wZXJ0eUdldCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgaW5mZXJyZXIuaW5mZXJQcm9wZXJ0eUdldChub2RlLCBub2RlLnJlY2VpdmVyLCBub2RlLmZpbGVPZmZzZXQsIHR5cGVDb250ZXh0LAogICAgICAgIGRlc3VnYXJlZEdldDogbm9kZSk7CiAgfQoKICB2b2lkIHZpc2l0UmVkaXJlY3RpbmdJbml0aWFsaXplckp1ZGdtZW50KAogICAgICBSZWRpcmVjdGluZ0luaXRpYWxpemVySnVkZ21lbnQgbm9kZSkgewogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBjbGFzc1R5cGVQYXJhbWV0ZXJzID0KICAgICAgICBub2RlLnRhcmdldC5lbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVyczsKICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPQogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPihjbGFzc1R5cGVQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgdHlwZUFyZ3VtZW50c1tpXSA9IG5ldyBUeXBlUGFyYW1ldGVyVHlwZShjbGFzc1R5cGVQYXJhbWV0ZXJzW2ldKTsKICAgIH0KICAgIEFyZ3VtZW50c0p1ZGdtZW50LnNldE5vbkluZmVycmFibGVBcmd1bWVudFR5cGVzKAogICAgICAgIG5vZGUuYXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKTsKICAgIGluZmVycmVyLmluZmVySW52b2NhdGlvbigKICAgICAgICBudWxsLAogICAgICAgIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICBub2RlLnRhcmdldC5mdW5jdGlvbi5mdW5jdGlvblR5cGUsCiAgICAgICAgbm9kZS50YXJnZXQuZW5jbG9zaW5nQ2xhc3MudGhpc1R5cGUsCiAgICAgICAgbm9kZS5hcmd1bWVudEp1ZGdtZW50cywKICAgICAgICBza2lwVHlwZUFyZ3VtZW50SW5mZXJlbmNlOiB0cnVlKTsKICAgIEFyZ3VtZW50c0p1ZGdtZW50LnJlbW92ZU5vbkluZmVycmFibGVBcmd1bWVudFR5cGVzKG5vZGUuYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRSZXRocm93KFJldGhyb3cgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHt9CgogIHZvaWQgdmlzaXRSZXR1cm5KdWRnbWVudChSZXR1cm5KdWRnbWVudCBub2RlKSB7CiAgICB2YXIganVkZ21lbnQgPSBub2RlLmp1ZGdtZW50OwogICAgdmFyIGNsb3N1cmVDb250ZXh0ID0gaW5mZXJyZXIuY2xvc3VyZUNvbnRleHQ7CiAgICBEYXJ0VHlwZSB0eXBlQ29udGV4dCA9ICFjbG9zdXJlQ29udGV4dC5pc0dlbmVyYXRvcgogICAgICAgID8gY2xvc3VyZUNvbnRleHQucmV0dXJuT3JZaWVsZENvbnRleHQKICAgICAgICA6IGNvbnN0IFVua25vd25UeXBlKCk7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CiAgICBpZiAobm9kZS5leHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGp1ZGdtZW50LCB0eXBlQ29udGV4dCwgdHJ1ZSwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICBpbmZlcnJlZFR5cGUgPSBnZXRJbmZlcnJlZFR5cGUoanVkZ21lbnQsIGluZmVycmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIGluZmVycmVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5udWxsQ2xhc3MucmF3VHlwZTsKICAgIH0KICAgIGNsb3N1cmVDb250ZXh0LmhhbmRsZVJldHVybihpbmZlcnJlciwgbm9kZSwgaW5mZXJyZWRUeXBlLAogICAgICAgICFpZGVudGljYWwobm9kZS5yZXR1cm5LZXl3b3JkTGV4ZW1lLCAicmV0dXJuIikpOwogIH0KCiAgdm9pZCB2aXNpdFNldExpdGVyYWxKdWRnbWVudChTZXRMaXRlcmFsSnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHZhciBzZXRDbGFzcyA9IGluZmVycmVyLmNvcmVUeXBlcy5zZXRDbGFzczsKICAgIHZhciBzZXRUeXBlID0gc2V0Q2xhc3MudGhpc1R5cGU7CiAgICBMaXN0PERhcnRUeXBlPiBpbmZlcnJlZFR5cGVzOwogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlQXJndW1lbnQ7CiAgICBMaXN0PERhcnRUeXBlPiBmb3JtYWxUeXBlczsKICAgIExpc3Q8RGFydFR5cGU+IGFjdHVhbFR5cGVzOwogICAgYm9vbCBpbmZlcmVuY2VOZWVkZWQgPSBub2RlLnR5cGVBcmd1bWVudCBpcyBJbXBsaWNpdFR5cGVBcmd1bWVudDsKICAgIGJvb2wgdHlwZUNoZWNrc05lZWRlZCA9ICFpbmZlcnJlci5pc1RvcExldmVsOwogICAgTWFwPFRyZWVOb2RlLCBEYXJ0VHlwZT4gaW5mZXJyZWRTcHJlYWRUeXBlczsKICAgIGlmIChpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCkgewogICAgICBmb3JtYWxUeXBlcyA9IFtdOwogICAgICBhY3R1YWxUeXBlcyA9IFtdOwogICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzID0gbmV3IE1hcDxUcmVlTm9kZSwgRGFydFR5cGU+LmlkZW50aXR5KCk7CiAgICB9CiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkKSB7CiAgICAgIGluZmVycmVkVHlwZXMgPSBbY29uc3QgVW5rbm93blR5cGUoKV07CiAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZShzZXRUeXBlLAogICAgICAgICAgc2V0Q2xhc3MudHlwZVBhcmFtZXRlcnMsIG51bGwsIG51bGwsIHR5cGVDb250ZXh0LCBpbmZlcnJlZFR5cGVzLAogICAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICAgICAgaW5mZXJyZWRUeXBlQXJndW1lbnQgPSBpbmZlcnJlZFR5cGVzWzBdOwogICAgfSBlbHNlIHsKICAgICAgaW5mZXJyZWRUeXBlQXJndW1lbnQgPSBub2RlLnR5cGVBcmd1bWVudDsKICAgIH0KICAgIGlmIChpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBEYXJ0VHlwZSB0eXBlID0gaW5mZXJFbGVtZW50KAogICAgICAgICAgICBub2RlLmV4cHJlc3Npb25zW2ldLAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICBpbmZlcnJlZFR5cGVBcmd1bWVudCwKICAgICAgICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgICAgICAgaW5mZXJlbmNlTmVlZGVkLAogICAgICAgICAgICB0eXBlQ2hlY2tzTmVlZGVkKTsKICAgICAgICBhY3R1YWxUeXBlcy5hZGQodHlwZSk7CiAgICAgICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICAgICAgZm9ybWFsVHlwZXMuYWRkKHNldFR5cGUudHlwZUFyZ3VtZW50c1swXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkKSB7CiAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZSgKICAgICAgICAgIHNldFR5cGUsCiAgICAgICAgICBzZXRDbGFzcy50eXBlUGFyYW1ldGVycywKICAgICAgICAgIGZvcm1hbFR5cGVzLAogICAgICAgICAgYWN0dWFsVHlwZXMsCiAgICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICAgIGluZmVycmVkVHlwZXMpOwogICAgICBpbmZlcnJlZFR5cGVBcmd1bWVudCA9IGluZmVycmVkVHlwZXNbMF07CiAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKAogICAgICAgICAgaW5mZXJyZXIudXJpLAogICAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgJ3R5cGVBcmdzJywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGVBcmdzKFtpbmZlcnJlZFR5cGVBcmd1bWVudF0pKTsKICAgICAgbm9kZS50eXBlQXJndW1lbnQgPSBpbmZlcnJlZFR5cGVBcmd1bWVudDsKICAgIH0KICAgIGlmICh0eXBlQ2hlY2tzTmVlZGVkKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5leHByZXNzaW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgIGNoZWNrRWxlbWVudCgKICAgICAgICAgICAgbm9kZS5leHByZXNzaW9uc1tpXSwgbm9kZSwgbm9kZS50eXBlQXJndW1lbnQsIGluZmVycmVkU3ByZWFkVHlwZXMpOwogICAgICB9CiAgICB9CiAgICBub2RlLmluZmVycmVkVHlwZSA9IG5ldyBJbnRlcmZhY2VUeXBlKHNldENsYXNzLCBbaW5mZXJyZWRUeXBlQXJndW1lbnRdKTsKICAgIGlmICghaW5mZXJyZXIuaXNUb3BMZXZlbCkgewogICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gaW5mZXJyZXIubGlicmFyeTsKICAgICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJblNldExpdGVyYWwoCiAgICAgICAgICAgIG5vZGUsIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudCwgaW5mZXJyZXIuaGVscGVyLnVyaSwKICAgICAgICAgICAgaW5mZXJyZWQ6IHRydWUpOwogICAgICB9CgogICAgICBpZiAoIWxpYnJhcnkubG9hZGVyLnRhcmdldC5iYWNrZW5kVGFyZ2V0LnN1cHBvcnRzU2V0TGl0ZXJhbHMpIHsKICAgICAgICBpbmZlcnJlci5oZWxwZXIudHJhbnNmb3JtU2V0TGl0ZXJhbHMgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0U3RhdGljQXNzaWdubWVudEp1ZGdtZW50KAogICAgICBTdGF0aWNBc3NpZ25tZW50SnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIERhcnRUeXBlIHJlYWRUeXBlID0gY29uc3QgRHluYW1pY1R5cGUoKTsgLy8gT25seSB1c2VkIGluIGVycm9yIHJlY292ZXJ5CiAgICB2YXIgcmVhZCA9IG5vZGUucmVhZDsKICAgIGlmIChyZWFkIGlzIFN0YXRpY0dldCkgewogICAgICByZWFkVHlwZSA9IHJlYWQudGFyZ2V0LmdldHRlclR5cGU7CiAgICAgIG5vZGUuX3N0b3JlTGV0VHlwZShpbmZlcnJlciwgcmVhZCwgcmVhZFR5cGUpOwogICAgfQogICAgTWVtYmVyIHdyaXRlTWVtYmVyOwogICAgRGFydFR5cGUgd3JpdGVDb250ZXh0ID0gY29uc3QgVW5rbm93blR5cGUoKTsKICAgIHZhciB3cml0ZSA9IG5vZGUud3JpdGU7CiAgICBpZiAod3JpdGUgaXMgU3RhdGljU2V0KSB7CiAgICAgIHdyaXRlQ29udGV4dCA9IHdyaXRlLnRhcmdldC5zZXR0ZXJUeXBlOwogICAgICB3cml0ZU1lbWJlciA9IHdyaXRlLnRhcmdldDsKICAgICAgVHlwZUluZmVyZW5jZUVuZ2luZS5yZXNvbHZlSW5mZXJlbmNlTm9kZSh3cml0ZU1lbWJlcik7CiAgICB9CiAgICBub2RlLl9pbmZlclJocyhpbmZlcnJlciwgcmVhZFR5cGUsIHdyaXRlQ29udGV4dCk7CiAgICBub2RlLl9yZXBsYWNlV2l0aERlc3VnYXJlZCgpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgdmFyIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgVHlwZUluZmVyZW5jZUVuZ2luZS5yZXNvbHZlSW5mZXJlbmNlTm9kZSh0YXJnZXQpOwogICAgdmFyIHR5cGUgPSB0YXJnZXQuZ2V0dGVyVHlwZTsKICAgIGlmICh0YXJnZXQgaXMgUHJvY2VkdXJlICYmIHRhcmdldC5raW5kID09IFByb2NlZHVyZUtpbmQuTWV0aG9kKSB7CiAgICAgIHR5cGUgPSBpbmZlcnJlci5pbnN0YW50aWF0ZVRlYXJPZmYodHlwZSwgdHlwZUNvbnRleHQsIG5vZGUpOwogICAgfQogICAgaW5mZXJyZXIuc3RvcmVJbmZlcnJlZFR5cGUobm9kZSwgdHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljSW52b2NhdGlvbihTdGF0aWNJbnZvY2F0aW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBGdW5jdGlvblR5cGUgY2FsbGVlVHlwZSA9IG5vZGUudGFyZ2V0ICE9IG51bGwKICAgICAgICA/IG5vZGUudGFyZ2V0LmZ1bmN0aW9uLmZ1bmN0aW9uVHlwZQogICAgICAgIDogbmV3IEZ1bmN0aW9uVHlwZShbXSwgY29uc3QgRHluYW1pY1R5cGUoKSk7CiAgICBib29sIGhhZEV4cGxpY2l0VHlwZUFyZ3VtZW50cyA9CiAgICAgICAgZ2V0RXhwbGljaXRUeXBlQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKSAhPSBudWxsOwogICAgdmFyIGluZmVyZW5jZVJlc3VsdCA9IGluZmVycmVyLmluZmVySW52b2NhdGlvbih0eXBlQ29udGV4dCwgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIGNhbGxlZVR5cGUsIGNhbGxlZVR5cGUucmV0dXJuVHlwZSwgbm9kZS5hcmd1bWVudHMpOwogICAgaW5mZXJyZXIuc3RvcmVJbmZlcnJlZFR5cGUobm9kZSwgaW5mZXJlbmNlUmVzdWx0LnR5cGUpOwogICAgaWYgKCFoYWRFeHBsaWNpdFR5cGVBcmd1bWVudHMgJiYgbm9kZS50YXJnZXQgIT0gbnVsbCkgewogICAgICBpbmZlcnJlci5saWJyYXJ5Py5jaGVja0JvdW5kc0luU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgIG5vZGUsIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudCwgaW5mZXJyZXIuaGVscGVyLnVyaSwKICAgICAgICAgIGluZmVycmVkOiB0cnVlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKAogICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwpIHsKICAgICAgZm9yICh2YXIgZXhwcmVzc2lvbiBpbiBub2RlLmV4cHJlc3Npb25zKSB7CiAgICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgICBleHByZXNzaW9uLCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHt9CgogIHZvaWQgdmlzaXRTdXBlckluaXRpYWxpemVySnVkZ21lbnQoU3VwZXJJbml0aWFsaXplckp1ZGdtZW50IG5vZGUpIHsKICAgIHZhciBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVN1cGVydHlwZShpbmZlcnJlci5jbGFzc0hpZXJhcmNoeQogICAgICAgIC5nZXRDbGFzc0FzSW5zdGFuY2VPZigKICAgICAgICAgICAgaW5mZXJyZXIudGhpc1R5cGUuY2xhc3NOb2RlLCBub2RlLnRhcmdldC5lbmNsb3NpbmdDbGFzcykpOwogICAgaW5mZXJyZXIuaW5mZXJJbnZvY2F0aW9uKAogICAgICAgIG51bGwsCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZSgKICAgICAgICAgICAgbm9kZS50YXJnZXQuZnVuY3Rpb24uZnVuY3Rpb25UeXBlLndpdGhvdXRUeXBlUGFyYW1ldGVycyksCiAgICAgICAgaW5mZXJyZXIudGhpc1R5cGUsCiAgICAgICAgbm9kZS5hcmd1bWVudEp1ZGdtZW50cywKICAgICAgICBza2lwVHlwZUFyZ3VtZW50SW5mZXJlbmNlOiB0cnVlKTsKICB9CgogIHZvaWQgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgU3VwZXJNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGlmIChub2RlLmludGVyZmFjZVRhcmdldCAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKGluZmVycmVyLnVyaSwgbm9kZS5maWxlT2Zmc2V0LCAndGFyZ2V0JywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihub2RlLmludGVyZmFjZVRhcmdldCkpOwogICAgfQogICAgdmFyIGluZmVyZW5jZVJlc3VsdCA9IGluZmVycmVyLmluZmVyTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBub2RlLCBudWxsLCBub2RlLmZpbGVPZmZzZXQsIGZhbHNlLCB0eXBlQ29udGV4dCwKICAgICAgICBpbnRlcmZhY2VNZW1iZXI6IG5vZGUuaW50ZXJmYWNlVGFyZ2V0LAogICAgICAgIG1ldGhvZE5hbWU6IG5vZGUubmFtZSwKICAgICAgICBhcmd1bWVudHM6IG5vZGUuYXJndW1lbnRzKTsKICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gaW5mZXJlbmNlUmVzdWx0LnR5cGU7CiAgfQoKICB2b2lkIHZpc2l0U3VwZXJQcm9wZXJ0eUdldEp1ZGdtZW50KAogICAgICBTdXBlclByb3BlcnR5R2V0SnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGlmIChub2RlLmludGVyZmFjZVRhcmdldCAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKGluZmVycmVyLnVyaSwgbm9kZS5maWxlT2Zmc2V0LCAndGFyZ2V0JywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihub2RlLmludGVyZmFjZVRhcmdldCkpOwogICAgfQogICAgaW5mZXJyZXIuaW5mZXJQcm9wZXJ0eUdldChub2RlLCBudWxsLCBub2RlLmZpbGVPZmZzZXQsIHR5cGVDb250ZXh0LAogICAgICAgIGludGVyZmFjZU1lbWJlcjogbm9kZS5pbnRlcmZhY2VUYXJnZXQsIHByb3BlcnR5TmFtZTogbm9kZS5uYW1lKTsKICB9CgogIHZvaWQgdmlzaXRTd2l0Y2hTdGF0ZW1lbnRKdWRnbWVudChTd2l0Y2hTdGF0ZW1lbnRKdWRnbWVudCBub2RlKSB7CiAgICB2YXIgZXhwcmVzc2lvbkp1ZGdtZW50ID0gbm9kZS5leHByZXNzaW9uSnVkZ21lbnQ7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oZXhwcmVzc2lvbkp1ZGdtZW50LCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlKTsKICAgIHZhciBleHByZXNzaW9uVHlwZSA9IGdldEluZmVycmVkVHlwZShleHByZXNzaW9uSnVkZ21lbnQsIGluZmVycmVyKTsKCiAgICBmb3IgKHZhciBzd2l0Y2hDYXNlIGluIG5vZGUuY2FzZUp1ZGdtZW50cykgewogICAgICBmb3IgKHZhciBjYXNlRXhwcmVzc2lvbiBpbiBzd2l0Y2hDYXNlLmV4cHJlc3Npb25KdWRnbWVudHMpIHsKICAgICAgICBEYXJ0VHlwZSBjYXNlRXhwcmVzc2lvblR5cGUgPQogICAgICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oY2FzZUV4cHJlc3Npb24sIGV4cHJlc3Npb25UeXBlLCB0cnVlKTsKCiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZXhwcmVzc2lvbiB0eXBlIGlzIGFzc2lnbmFibGUgdG8gdGhlIGNhc2UgZXhwcmVzc2lvbiB0eXBlLgogICAgICAgIGlmICghaW5mZXJyZXIuaXNBc3NpZ25hYmxlKGV4cHJlc3Npb25UeXBlLCBjYXNlRXhwcmVzc2lvblR5cGUpKSB7CiAgICAgICAgICBpbmZlcnJlci5oZWxwZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25UeXBlLCBjYXNlRXhwcmVzc2lvblR5cGUpLAogICAgICAgICAgICAgIGNhc2VFeHByZXNzaW9uLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICAgICAgbWVzc2FnZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlQ2F1c2Uud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgIGluZmVycmVyLnVyaSwgZXhwcmVzc2lvbkp1ZGdtZW50LmZpbGVPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgIF0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpbmZlcnJlci5pbmZlclN0YXRlbWVudChzd2l0Y2hDYXNlLmJvZHkpOwogICAgfQogIH0KCiAgdm9pZCB2aXNpdFN5bWJvbExpdGVyYWxKdWRnbWVudCgKICAgICAgU3ltYm9sTGl0ZXJhbEp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBub2RlLmluZmVycmVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5zeW1ib2xDbGFzcy5yYXdUeXBlOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIHZpc2l0SW52YWxpZENvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50KAogICAgICBJbnZhbGlkQ29uc3RydWN0b3JJbnZvY2F0aW9uSnVkZ21lbnQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIEZ1bmN0aW9uVHlwZSBjYWxsZWVUeXBlOwogICAgRGFydFR5cGUgcmV0dXJuVHlwZTsKICAgIGlmIChub2RlLmNvbnN0cnVjdG9yICE9IG51bGwpIHsKICAgICAgY2FsbGVlVHlwZSA9IG5vZGUuY29uc3RydWN0b3IuZnVuY3Rpb24uZnVuY3Rpb25UeXBlOwogICAgICByZXR1cm5UeXBlID0gY29tcHV0ZUNvbnN0cnVjdG9yUmV0dXJuVHlwZShub2RlLmNvbnN0cnVjdG9yKTsKICAgIH0gZWxzZSB7CiAgICAgIGNhbGxlZVR5cGUgPSBuZXcgRnVuY3Rpb25UeXBlKFtdLCBjb25zdCBEeW5hbWljVHlwZSgpKTsKICAgICAgcmV0dXJuVHlwZSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGluZmVyZW5jZVJlc3VsdCA9IGluZmVycmVyLmluZmVySW52b2NhdGlvbigKICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgY2FsbGVlVHlwZSwKICAgICAgICByZXR1cm5UeXBlLAogICAgICAgIG5vZGUuYXJndW1lbnRKdWRnbWVudHMpOwogICAgbm9kZS5pbmZlcnJlZFR5cGUgPSBpbmZlcmVuY2VSZXN1bHQudHlwZTsKICAgIHJldHVybiB2aXNpdFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudChub2RlLCB0eXBlQ29udGV4dCk7CiAgfQoKICB2b2lkIHZpc2l0SW52YWxpZFdyaXRlSnVkZ21lbnQoCiAgICAgIEludmFsaWRXcml0ZUp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICAvLyBXaGVuIGEgY29tcG91bmQgYXNzaWdubWVudCwgdGhlIGV4cHJlc3Npb24gaXMgYWxyZWFkeSB3cmFwcGluZyBpbgogICAgLy8gVmFyaWFibGVEZWNsYXJhdGlvbiBpbiBfbWFrZVJlYWQoKS4gT3RoZXJ3aXNlLCB0ZW1wb3JhcnkgYXNzb2NpYXRlCiAgICAvLyB0aGUgZXhwcmVzc2lvbiB3aXRoIHRoaXMgbm9kZS4KICAgIG5vZGUuZXhwcmVzc2lvbi5wYXJlbnQgPz89IG5vZGU7CgogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUuZXhwcmVzc2lvbiwgY29uc3QgVW5rbm93blR5cGUoKSwgIWluZmVycmVyLmlzVG9wTGV2ZWwpOwogICAgcmV0dXJuIHZpc2l0U3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50KG5vZGUsIHR5cGVDb250ZXh0KTsKICB9CgogIHZvaWQgdmlzaXRTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQoCiAgICAgIFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgbm9kZS5fcmVwbGFjZVdpdGhEZXN1Z2FyZWQoKTsKICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdFRoaXNFeHByZXNzaW9uKFRoaXNFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGhyb3coVGhyb3cgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLmV4cHJlc3Npb24sIGNvbnN0IFVua25vd25UeXBlKCksICFpbmZlcnJlci5pc1RvcExldmVsKTsKICB9CgogIHZvaWQgdmlzaXRDYXRjaEp1ZGdtZW50KENhdGNoSnVkZ21lbnQgbm9kZSkgewogICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICB9CgogIHZvaWQgdmlzaXRUcnlDYXRjaEp1ZGdtZW50KFRyeUNhdGNoSnVkZ21lbnQgbm9kZSkgewogICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICAgIGZvciAodmFyIGNhdGNoXyBpbiBub2RlLmNhdGNoSnVkZ21lbnRzKSB7CiAgICAgIHZpc2l0Q2F0Y2hKdWRnbWVudChjYXRjaF8pOwogICAgfQogIH0KCiAgdm9pZCB2aXNpdFRyeUZpbmFsbHlKdWRnbWVudChUcnlGaW5hbGx5SnVkZ21lbnQgbm9kZSkgewogICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KG5vZGUuZmluYWxpemVyKTsKICB9CgogIHZvaWQgdmlzaXRUeXBlTGl0ZXJhbEp1ZGdtZW50KAogICAgICBUeXBlTGl0ZXJhbEp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBub2RlLmluZmVycmVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy50eXBlQ2xhc3MucmF3VHlwZTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdFZhcmlhYmxlQXNzaWdubWVudEp1ZGdtZW50KAogICAgICBWYXJpYWJsZUFzc2lnbm1lbnRKdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgRGFydFR5cGUgcmVhZFR5cGU7CiAgICB2YXIgcmVhZCA9IG5vZGUucmVhZDsKICAgIGlmIChyZWFkIGlzIFZhcmlhYmxlR2V0KSB7CiAgICAgIHJlYWRUeXBlID0gcmVhZC5wcm9tb3RlZFR5cGUgPz8gcmVhZC52YXJpYWJsZS50eXBlOwogICAgfQogICAgRGFydFR5cGUgd3JpdGVDb250ZXh0ID0gY29uc3QgVW5rbm93blR5cGUoKTsKICAgIHZhciB3cml0ZSA9IG5vZGUud3JpdGU7CiAgICBpZiAod3JpdGUgaXMgVmFyaWFibGVTZXQpIHsKICAgICAgd3JpdGVDb250ZXh0ID0gd3JpdGUudmFyaWFibGUudHlwZTsKICAgICAgaWYgKHJlYWQgIT0gbnVsbCkgewogICAgICAgIG5vZGUuX3N0b3JlTGV0VHlwZShpbmZlcnJlciwgcmVhZCwgd3JpdGVDb250ZXh0KTsKICAgICAgfQogICAgfQogICAgbm9kZS5faW5mZXJSaHMoaW5mZXJyZXIsIHJlYWRUeXBlLCB3cml0ZUNvbnRleHQpOwogICAgbm9kZS5fcmVwbGFjZVdpdGhEZXN1Z2FyZWQoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudChWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQgbm9kZSkgewogICAgdmFyIGluaXRpYWxpemVySnVkZ21lbnQgPSBub2RlLmluaXRpYWxpemVySnVkZ21lbnQ7CiAgICB2YXIgZGVjbGFyZWRUeXBlID0gbm9kZS5faW1wbGljaXRseVR5cGVkID8gY29uc3QgVW5rbm93blR5cGUoKSA6IG5vZGUudHlwZTsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZTsKICAgIERhcnRUeXBlIGluaXRpYWxpemVyVHlwZTsKICAgIGlmIChpbml0aWFsaXplckp1ZGdtZW50ICE9IG51bGwpIHsKICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGluaXRpYWxpemVySnVkZ21lbnQsIGRlY2xhcmVkVHlwZSwKICAgICAgICAgICFpbmZlcnJlci5pc1RvcExldmVsIHx8IG5vZGUuX2ltcGxpY2l0bHlUeXBlZCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICBpbml0aWFsaXplclR5cGUgPSBnZXRJbmZlcnJlZFR5cGUoaW5pdGlhbGl6ZXJKdWRnbWVudCwgaW5mZXJyZXIpOwogICAgICBpbmZlcnJlZFR5cGUgPSBpbmZlcnJlci5pbmZlckRlY2xhcmF0aW9uVHlwZShpbml0aWFsaXplclR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgaW5mZXJyZWRUeXBlID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0KICAgIGlmIChub2RlLl9pbXBsaWNpdGx5VHlwZWQpIHsKICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQoaW5mZXJyZXIudXJpLCBub2RlLmZpbGVPZmZzZXQsICd0eXBlJywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUoaW5mZXJyZWRUeXBlKSk7CiAgICAgIG5vZGUudHlwZSA9IGluZmVycmVkVHlwZTsKICAgIH0KICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgdmFyIHJlcGxhY2VkSW5pdGlhbGl6ZXIgPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgICAgbm9kZS50eXBlLCBpbml0aWFsaXplclR5cGUsIG5vZGUuaW5pdGlhbGl6ZXIsIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IG5vZGUudHlwZSBpcyBWb2lkVHlwZSk7CiAgICAgIGlmIChyZXBsYWNlZEluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICBub2RlLmluaXRpYWxpemVyID0gcmVwbGFjZWRJbml0aWFsaXplcjsKICAgICAgfQogICAgfQogICAgaWYgKCFpbmZlcnJlci5pc1RvcExldmVsKSB7CiAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBpbmZlcnJlci5saWJyYXJ5OwogICAgICBpZiAobm9kZS5faW1wbGljaXRseVR5cGVkKSB7CiAgICAgICAgbGlicmFyeS5jaGVja0JvdW5kc0luVmFyaWFibGVEZWNsYXJhdGlvbigKICAgICAgICAgICAgbm9kZSwgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LCBpbmZlcnJlci5oZWxwZXIudXJpLAogICAgICAgICAgICBpbmZlcnJlZDogdHJ1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgdmlzaXRVbnJlc29sdmVkVGFyZ2V0SW52b2NhdGlvbkp1ZGdtZW50KAogICAgICBVbnJlc29sdmVkVGFyZ2V0SW52b2NhdGlvbkp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICB2YXIgcmVzdWx0ID0gdmlzaXRTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQobm9kZSwgdHlwZUNvbnRleHQpOwogICAgaW5mZXJyZXIuaW5mZXJJbnZvY2F0aW9uKAogICAgICAgIHR5cGVDb250ZXh0LAogICAgICAgIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICBUeXBlSW5mZXJyZXJJbXBsLnVua25vd25GdW5jdGlvbiwKICAgICAgICBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICAgIG5vZGUuYXJndW1lbnRzSnVkZ21lbnQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgdmlzaXRVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50SnVkZ21lbnQoCiAgICAgIFVucmVzb2x2ZWRWYXJpYWJsZUFzc2lnbm1lbnRKdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKG5vZGUucmhzLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlKTsKICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gbm9kZS5pc0NvbXBvdW5kCiAgICAgICAgPyBjb25zdCBEeW5hbWljVHlwZSgpCiAgICAgICAgOiBnZXRJbmZlcnJlZFR5cGUobm9kZS5yaHMsIGluZmVycmVyKTsKICAgIHJldHVybiB2aXNpdFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudChub2RlLCB0eXBlQ29udGV4dCk7CiAgfQoKICB2b2lkIHZpc2l0VmFyaWFibGVHZXRKdWRnbWVudCgKICAgICAgVmFyaWFibGVHZXRKdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50IHZhcmlhYmxlID0gbm9kZS52YXJpYWJsZTsKICAgIGJvb2wgbXV0YXRlZEluQ2xvc3VyZSA9IHZhcmlhYmxlLl9tdXRhdGVkSW5DbG9zdXJlOwogICAgRGFydFR5cGUgZGVjbGFyZWRPckluZmVycmVkVHlwZSA9IHZhcmlhYmxlLnR5cGU7CgogICAgRGFydFR5cGUgcHJvbW90ZWRUeXBlID0gaW5mZXJyZXIudHlwZVByb21vdGVyCiAgICAgICAgLmNvbXB1dGVQcm9tb3RlZFR5cGUobm9kZS5fZmFjdCwgbm9kZS5fc2NvcGUsIG11dGF0ZWRJbkNsb3N1cmUpOwogICAgaWYgKHByb21vdGVkVHlwZSAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKGluZmVycmVyLnVyaSwgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgJ3Byb21vdGVkVHlwZScsIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUocHJvbW90ZWRUeXBlKSk7CiAgICB9CiAgICBub2RlLnByb21vdGVkVHlwZSA9IHByb21vdGVkVHlwZTsKICAgIHZhciB0eXBlID0gcHJvbW90ZWRUeXBlID8/IGRlY2xhcmVkT3JJbmZlcnJlZFR5cGU7CiAgICBpZiAodmFyaWFibGUuX2lzTG9jYWxGdW5jdGlvbikgewogICAgICB0eXBlID0gaW5mZXJyZXIuaW5zdGFudGlhdGVUZWFyT2ZmKHR5cGUsIHR5cGVDb250ZXh0LCBub2RlKTsKICAgIH0KICAgIG5vZGUuaW5mZXJyZWRUeXBlID0gdHlwZTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCB2aXNpdFdoaWxlSnVkZ21lbnQoV2hpbGVKdWRnbWVudCBub2RlKSB7CiAgICB2YXIgY29uZGl0aW9uSnVkZ21lbnQgPSBub2RlLmNvbmRpdGlvbkp1ZGdtZW50OwogICAgdmFyIGV4cGVjdGVkVHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZTsKICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBjb25kaXRpb25KdWRnbWVudCwgZXhwZWN0ZWRUeXBlLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCk7CiAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgIGV4cGVjdGVkVHlwZSwKICAgICAgICBnZXRJbmZlcnJlZFR5cGUoY29uZGl0aW9uSnVkZ21lbnQsIGluZmVycmVyKSwKICAgICAgICBub2RlLmNvbmRpdGlvbiwKICAgICAgICBub2RlLmNvbmRpdGlvbi5maWxlT2Zmc2V0KTsKICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KG5vZGUuYm9keSk7CiAgfQoKICB2b2lkIHZpc2l0WWllbGRKdWRnbWVudChZaWVsZEp1ZGdtZW50IG5vZGUpIHsKICAgIHZhciBqdWRnbWVudCA9IG5vZGUuanVkZ21lbnQ7CiAgICB2YXIgY2xvc3VyZUNvbnRleHQgPSBpbmZlcnJlci5jbG9zdXJlQ29udGV4dDsKICAgIGlmIChjbG9zdXJlQ29udGV4dC5pc0dlbmVyYXRvcikgewogICAgICB2YXIgdHlwZUNvbnRleHQgPSBjbG9zdXJlQ29udGV4dC5yZXR1cm5PcllpZWxkQ29udGV4dDsKICAgICAgaWYgKG5vZGUuaXNZaWVsZFN0YXIgJiYgdHlwZUNvbnRleHQgIT0gbnVsbCkgewogICAgICAgIHR5cGVDb250ZXh0ID0gaW5mZXJyZXIud3JhcFR5cGUoCiAgICAgICAgICAgIHR5cGVDb250ZXh0LAogICAgICAgICAgICBjbG9zdXJlQ29udGV4dC5pc0FzeW5jCiAgICAgICAgICAgICAgICA/IGluZmVycmVyLmNvcmVUeXBlcy5zdHJlYW1DbGFzcwogICAgICAgICAgICAgICAgOiBpbmZlcnJlci5jb3JlVHlwZXMuaXRlcmFibGVDbGFzcyk7CiAgICAgIH0KICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKGp1ZGdtZW50LCB0eXBlQ29udGV4dCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oanVkZ21lbnQsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUpOwogICAgfQogICAgY2xvc3VyZUNvbnRleHQuaGFuZGxlWWllbGQoaW5mZXJyZXIsIG5vZGUuaXNZaWVsZFN0YXIsCiAgICAgICAgZ2V0SW5mZXJyZWRUeXBlKGp1ZGdtZW50LCBpbmZlcnJlciksIG5vZGUuZXhwcmVzc2lvbiwgbm9kZS5maWxlT2Zmc2V0KTsKICB9CgogIHZvaWQgdmlzaXRMb2FkTGlicmFyeUp1ZGdtZW50KAogICAgICBMb2FkTGlicmFyeUp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBub2RlLmluZmVycmVkVHlwZSA9CiAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmZ1dHVyZVR5cGUoY29uc3QgRHluYW1pY1R5cGUoKSk7CiAgICBpZiAobm9kZS5hcmd1bWVudHMgIT0gbnVsbCkgewogICAgICB2YXIgY2FsbGVl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ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvaW5mZXJlbmNlX3Zpc2l0b3IuZGFydEZzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2luZmVycmVkX3R5cGVfdmlzaXRvci5kYXJ0kkovLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiAia2VybmVsX3NoYWRvd19hc3QuZGFydCI7CgpEYXJ0VHlwZSBnZXRJbmZlcnJlZFR5cGUoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgaWYgKGV4cHJlc3Npb24gaXMgRXhwcmVzc2lvbkp1ZGdtZW50KSB7CiAgICByZXR1cm4gZXhwcmVzc2lvbi5pbmZlcnJlZFR5cGU7CiAgfSBlbHNlIHsKICAgIHJldHVybiBleHByZXNzaW9uLmFjY2VwdDEoY29uc3QgSW5mZXJyZWRUeXBlVmlzaXRvcigpLCBpbmZlcnJlcik7CiAgfQp9CgpEYXJ0VHlwZSBpbnZhbGlkVG9Cb3R0b20oRGFydFR5cGUgdHlwZSkgewogIC8vIFRPRE8oYWhlKTogVGhpcyBzaG91bGQgcmVhbGx5IHJldHVybiBbQm90dG9tVHlwZV0sIGJ1dCB0aGF0IHJlcXVpcmVzIG1vcmUKICAvLyB3b3JrIHRvIHRoZSBLZXJuZWwgdHlwZSBzeXN0ZW0gYW5kIGltcGxlbWVudGF0aW9uLgogIHJldHVybiAodHlwZSA9PSBudWxsIHx8IHR5cGUgaXMgSW52YWxpZFR5cGUpID8gY29uc3QgRHluYW1pY1R5cGUoKSA6IHR5cGU7Cn0KCkRhcnRUeXBlIGludmFsaWRUb1RvcChEYXJ0VHlwZSB0eXBlKSB7CiAgcmV0dXJuICh0eXBlID09IG51bGwgfHwgdHlwZSBpcyBJbnZhbGlkVHlwZSkgPyBjb25zdCBEeW5hbWljVHlwZSgpIDogdHlwZTsKfQoKY2xhc3MgSW5mZXJyZWRUeXBlVmlzaXRvcgogICAgZXh0ZW5kcyBFeHByZXNzaW9uVmlzaXRvcjE8RGFydFR5cGUsIFR5cGVJbmZlcnJlckltcGw+IHsKICBjb25zdCBJbmZlcnJlZFR5cGVWaXNpdG9yKCk7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGRlZmF1bHRFeHByZXNzaW9uKEV4cHJlc3Npb24gbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgdW5oYW5kbGVkKCIke25vZGUucnVudGltZVR5cGV9IiwgImdldEluZmVycmVkVHlwZSIsIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICBpbmZlcnJlci51cmkpOwogICAgcmV0dXJuIGNvbnN0IEludmFsaWRUeXBlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEludExpdGVyYWwoSW50TGl0ZXJhbCBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW5mZXJyZXIuY29yZVR5cGVzLmludENsYXNzLnJhd1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW5mZXJyZXIuY29yZVR5cGVzLmRvdWJsZUNsYXNzLnJhd1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEludmFsaWRFeHByZXNzaW9uKAogICAgICBJbnZhbGlkRXhwcmVzc2lvbiBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gY29uc3QgQm90dG9tVHlwZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUsIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbnZhbGlkVG9Cb3R0b20obm9kZS50eXBlKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0QXdhaXRFeHByZXNzaW9uKAogICAgICBBd2FpdEV4cHJlc3Npb24gbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLnJlYWRJbmZlcnJlZFR5cGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFRoaXNFeHByZXNzaW9uKFRoaXNFeHByZXNzaW9uIG5vZGUsIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbnZhbGlkVG9Cb3R0b20oaW5mZXJyZXIudGhpc1R5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRCb29sTGl0ZXJhbChCb29sTGl0ZXJhbCBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gbm9kZS5zdGF0aWNUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgIENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW5mZXJyZXIucmVhZEluZmVycmVkVHlwZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0SXNFeHByZXNzaW9uKElzRXhwcmVzc2lvbiBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xDbGFzcy5yYXdUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oCiAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW5mZXJyZXIucmVhZEluZmVycmVkVHlwZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0TG9naWNhbEV4cHJlc3Npb24oCiAgICAgIExvZ2ljYWxFeHByZXNzaW9uIG5vZGUsIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbmZlcnJlci5jb3JlVHlwZXMuYm9vbENsYXNzLnJhd1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdE5vdChOb3Qgbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLmNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0TnVsbExpdGVyYWwoTnVsbExpdGVyYWwgbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLmNvcmVUeXBlcy5udWxsQ2xhc3MucmF3VHlwZTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0UHJvcGVydHlHZXQoUHJvcGVydHlHZXQgbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLnJlYWRJbmZlcnJlZFR5cGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFJldGhyb3coUmV0aHJvdyBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gY29uc3QgQm90dG9tVHlwZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKAogICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUsIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbmZlcnJlci5jb3JlVHlwZXMuc3RyaW5nQ2xhc3MucmF3VHlwZTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0U3RyaW5nTGl0ZXJhbChTdHJpbmdMaXRlcmFsIG5vZGUsIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbmZlcnJlci5jb3JlVHlwZXMuc3RyaW5nQ2xhc3MucmF3VHlwZTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0TGV0KExldCBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICAvLyBUT0RPKGFoZSk6IFdlIHNob3VsZCBiZSBhYmxlIHRvIHJldHVybiB0aGUgaW5mZXJyZWQgdHlwZSBvZgogICAgLy8gbm9kZS5ib2R5LiBIb3dldmVyLCB0aGF0IHR5cGUgbWF5IGJlIGxvc3QsIGZvciBleGFtcGxlLCBpbgogICAgLy8gVmFyaWFibGVBc3NpZ25tZW50SnVkZ21lbnQuX3JlcGxhY2VXaXRoRGVzdWdhcmVkLgogICAgcmV0dXJuIGluZmVycmVyLnJlYWRJbmZlcnJlZFR5cGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLnJlYWRJbmZlcnJlZFR5cGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFN0YXRpY0ludm9jYXRpb24oCiAgICAgIFN0YXRpY0ludm9jYXRpb24gbm9kZSwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLnJlYWRJbmZlcnJlZFR5cGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFRocm93KFRocm93IG5vZGUsIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIpIHsKICAgIHJldHVybiBjb25zdCBCb3R0b21UeXBlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkKAogICAgICBDaGVja0xpYnJhcnlJc0xvYWRlZCBub2RlLCBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW5mZXJyZXIuY29yZVR5cGVzLm9iamVjdENsYXNzLnJhd1R5cGU7CiAgfQp9CoCkAE5OPAEiAU0qJAtGBAIBKk84TQIBJ00CARo9HwEMS0kXIAQBDEkwBAEMTzMEAQwjOx8EAQxNJwQBDCE5LAQBDFEvBAEMSzEEAQwnPxwEAQwnPywEAQxNMQQBDCQ8LAQBDCM7MQQBDDsxBAEMSzEEAQxLLAQBDEMfBAEMJT0zBAEMTzMEAQw7Q0I5LAQBDEcsBAEMIjosBAEMPx8EAQwmPjMEAgE9cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9pbmZlcnJlZF90eXBlX3Zpc2l0b3IuZGFydDlzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9idWlsZGVyLmRhcnSH2i8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmJ1aWxkZXI7CgpleHBvcnQgJy4uL2lkZW50aWZpZXJzLmRhcnQnCiAgICBzaG93CiAgICAgICAgSWRlbnRpZmllciwKICAgICAgICBJbml0aWFsaXplZElkZW50aWZpZXIsCiAgICAgICAgUXVhbGlmaWVkTmFtZSwKICAgICAgICBkZXByZWNhdGVkX2V4dHJhY3RUb2tlbiwKICAgICAgICBmbGF0dGVuTmFtZTsKCmV4cG9ydCAnLi4vc2NvcGUuZGFydCcgc2hvdyBBY2Nlc3NFcnJvckJ1aWxkZXIsIFNjb3BlLCBTY29wZUJ1aWxkZXI7CgpleHBvcnQgJ2J1aWx0aW5fdHlwZV9idWlsZGVyLmRhcnQnIHNob3cgQnVpbHRpblR5cGVCdWlsZGVyOwoKZXhwb3J0ICdjbGFzc19idWlsZGVyLmRhcnQnIHNob3cgQ2xhc3NCdWlsZGVyOwoKZXhwb3J0ICdjb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlci5kYXJ0JyBzaG93IENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlcjsKCmV4cG9ydCAnZGVjbGFyYXRpb24uZGFydCcgc2hvdyBEZWNsYXJhdGlvbjsKCmV4cG9ydCAnZHluYW1pY190eXBlX2J1aWxkZXIuZGFydCcgc2hvdyBEeW5hbWljVHlwZUJ1aWxkZXI7CgpleHBvcnQgJ2VudW1fYnVpbGRlci5kYXJ0JyBzaG93IEVudW1CdWlsZGVyLCBFbnVtQ29uc3RhbnRJbmZvOwoKZXhwb3J0ICdmaWVsZF9idWlsZGVyLmRhcnQnIHNob3cgRmllbGRCdWlsZGVyOwoKZXhwb3J0ICdmb3JtYWxfcGFyYW1ldGVyX2J1aWxkZXIuZGFydCcgc2hvdyBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyOwoKZXhwb3J0ICdwcm9jZWR1cmVfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIEZ1bmN0aW9uQnVpbGRlciwKICAgICAgICBDb25zdHJ1Y3RvckJ1aWxkZXIsCiAgICAgICAgUHJvY2VkdXJlQnVpbGRlciwKICAgICAgICBSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyOwoKZXhwb3J0ICdmdW5jdGlvbl90eXBlX2J1aWxkZXIuZGFydCcgc2hvdyBGdW5jdGlvblR5cGVCdWlsZGVyOwoKZXhwb3J0ICdpbnZhbGlkX3R5cGVfYnVpbGRlci5kYXJ0JyBzaG93IEludmFsaWRUeXBlQnVpbGRlcjsKCmV4cG9ydCAnbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgTGlicmFyeUJ1aWxkZXI7CgpleHBvcnQgJ21lbWJlcl9idWlsZGVyLmRhcnQnIHNob3cgTWVtYmVyQnVpbGRlcjsKCmV4cG9ydCAnbWV0YWRhdGFfYnVpbGRlci5kYXJ0JyBzaG93IE1ldGFkYXRhQnVpbGRlcjsKCmV4cG9ydCAnbWl4aW5fYXBwbGljYXRpb25fYnVpbGRlci5kYXJ0JyBzaG93IE1peGluQXBwbGljYXRpb25CdWlsZGVyOwoKZXhwb3J0ICdtb2RpZmllcl9idWlsZGVyLmRhcnQnIHNob3cgTW9kaWZpZXJCdWlsZGVyOwoKZXhwb3J0ICduYW1lX2l0ZXJhdG9yLmRhcnQnIHNob3cgTmFtZUl0ZXJhdG9yOwoKZXhwb3J0ICduYW1lZF90eXBlX2J1aWxkZXIuZGFydCcgc2hvdyBOYW1lZFR5cGVCdWlsZGVyOwoKZXhwb3J0ICdwcmVmaXhfYnVpbGRlci5kYXJ0JyBzaG93IFByZWZpeEJ1aWxkZXI7CgpleHBvcnQgJ3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0JyBzaG93IFR5cGVBbGlhc0J1aWxkZXI7CgpleHBvcnQgJ3R5cGVfYnVpbGRlci5kYXJ0JyBzaG93IFR5cGVCdWlsZGVyOwoKZXhwb3J0ICd0eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydCcgc2hvdyBUeXBlRGVjbGFyYXRpb25CdWlsZGVyOwoKZXhwb3J0ICd0eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydCcgc2hvdyBUeXBlVmFyaWFibGVCdWlsZGVyOwoKZXhwb3J0ICd1bnJlc29sdmVkX3R5cGUuZGFydCcgc2hvdyBVbnJlc29sdmVkVHlwZTsKCmV4cG9ydCAndm9pZF90eXBlX2J1aWxkZXIuZGFydCcgc2hvdyBWb2lkVHlwZUJ1aWxkZXI7CkgATk48ARcBHQkUHxchFQFFATwBLwFOASwBPAE/AS8BRAEgCRkcGiMBPgE8ATMBMQE1AUYBNQEvATgBMQE4AS0BRAE+ATMBNgEwcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvYnVpbGRlci5kYXJ0P3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zY2FubmVyL2tleXdvcmRfc3RhdGUuZGFydJCZLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuc2Nhbm5lci5rZXl3b3JkczsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBhcyBhbmFseXplcjsKCmltcG9ydCAnY2hhcmFjdGVycy5kYXJ0JyBzaG93ICRhLCAkeiwgJEEsICRaOwoKLyoqCiAqIEFic3RyYWN0IHN0YXRlIGluIGEgc3RhdGUgbWFjaGluZSBmb3Igc2Nhbm5pbmcga2V5d29yZHMuCiAqLwphYnN0cmFjdCBjbGFzcyBLZXl3b3JkU3RhdGUgewogIEtleXdvcmRTdGF0ZSBuZXh0KGludCBjKTsKICBLZXl3b3JkU3RhdGUgbmV4dENhcGl0YWwoaW50IGMpOwoKICBhbmFseXplci5LZXl3b3JkIGdldCBrZXl3b3JkOwoKICBzdGF0aWMgS2V5d29yZFN0YXRlIF9LRVlXT1JEX1NUQVRFOwogIHN0YXRpYyBLZXl3b3JkU3RhdGUgZ2V0IEtFWVdPUkRfU1RBVEUgewogICAgaWYgKF9LRVlXT1JEX1NUQVRFID09IG51bGwpIHsKICAgICAgTGlzdDxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgTGlzdDxTdHJpbmc+KGFuYWx5emVyLktleXdvcmQudmFsdWVzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5hbHl6ZXIuS2V5d29yZC52YWx1ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzdHJpbmdzW2ldID0gYW5hbHl6ZXIuS2V5d29yZC52YWx1ZXNbaV0ubGV4ZW1lOwogICAgICB9CiAgICAgIHN0cmluZ3Muc29ydCgoYSwgYikgPT4gYS5jb21wYXJlVG8oYikpOwogICAgICBfS0VZV09SRF9TVEFURSA9IGNvbXB1dGVLZXl3b3JkU3RhdGVUYWJsZSgwLCBzdHJpbmdzLCAwLCBzdHJpbmdzLmxlbmd0aCk7CiAgICB9CiAgICByZXR1cm4gX0tFWVdPUkRfU1RBVEU7CiAgfQoKICBzdGF0aWMgS2V5d29yZFN0YXRlIGNvbXB1dGVLZXl3b3JkU3RhdGVUYWJsZSgKICAgICAgaW50IHN0YXJ0LCBMaXN0PFN0cmluZz4gc3RyaW5ncywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewogICAgYm9vbCBpc0xvd2VyY2FzZSA9IHRydWU7CgogICAgTGlzdDxLZXl3b3JkU3RhdGU+IHRhYmxlID0gbmV3IExpc3Q8S2V5d29yZFN0YXRlPigkeiAtICRBICsgMSk7CiAgICBhc3NlcnQobGVuZ3RoICE9IDApOwogICAgaW50IGNodW5rID0gMDsKICAgIGludCBjaHVua1N0YXJ0ID0gLTE7CiAgICBib29sIGlzTGVhZiA9IGZhbHNlOwogICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IG9mZnNldCArIGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChzdHJpbmdzW2ldLmxlbmd0aCA9PSBzdGFydCkgewogICAgICAgIGlzTGVhZiA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKHN0cmluZ3NbaV0ubGVuZ3RoID4gc3RhcnQpIHsKICAgICAgICBpbnQgYyA9IHN0cmluZ3NbaV0uY29kZVVuaXRBdChzdGFydCk7CiAgICAgICAgaWYgKCRBIDw9IGMgJiYgYyA8PSAkWikgewogICAgICAgICAgaXNMb3dlcmNhc2UgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKGNodW5rICE9IGMpIHsKICAgICAgICAgIGlmIChjaHVua1N0YXJ0ICE9IC0xKSB7CiAgICAgICAgICAgIGFzc2VydCh0YWJsZVtjaHVuayAtICRBXSA9PSBudWxsKTsKICAgICAgICAgICAgdGFibGVbY2h1bmsgLSAkQV0gPSBjb21wdXRlS2V5d29yZFN0YXRlVGFibGUoCiAgICAgICAgICAgICAgICBzdGFydCArIDEsIHN0cmluZ3MsIGNodW5rU3RhcnQsIGkgLSBjaHVua1N0YXJ0KTsKICAgICAgICAgIH0KICAgICAgICAgIGNodW5rU3RhcnQgPSBpOwogICAgICAgICAgY2h1bmsgPSBjOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGNodW5rU3RhcnQgIT0gLTEpIHsKICAgICAgYXNzZXJ0KHRhYmxlW2NodW5rIC0gJEFdID09IG51bGwpOwogICAgICB0YWJsZVtjaHVuayAtICRBXSA9IGNvbXB1dGVLZXl3b3JkU3RhdGVUYWJsZSgKICAgICAgICAgIHN0YXJ0ICsgMSwgc3RyaW5ncywgY2h1bmtTdGFydCwgb2Zmc2V0ICsgbGVuZ3RoIC0gY2h1bmtTdGFydCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQobGVuZ3RoID09IDEpOwogICAgICByZXR1cm4gbmV3IExlYWZLZXl3b3JkU3RhdGUoc3RyaW5nc1tvZmZzZXRdKTsKICAgIH0KICAgIFN0cmluZyBzeW50YXggPSBpc0xlYWYgPyBzdHJpbmdzW29mZnNldF0gOiBudWxsOwogICAgaWYgKGlzTG93ZXJjYXNlKSB7CiAgICAgIHRhYmxlID0gdGFibGUuc3VibGlzdCgkYSAtICRBKTsKICAgICAgcmV0dXJuIG5ldyBMb3dlckNhc2VBcnJheUtleXdvcmRTdGF0ZSh0YWJsZSwgc3ludGF4KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgVXBwZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUodGFibGUsIHN5bnRheCk7CiAgICB9CiAgfQp9CgovKioKICogQSBzdGF0ZSB3aXRoIG11bHRpcGxlIG91dGdvaW5nIHRyYW5zaXRpb25zLgogKi8KYWJzdHJhY3QgY2xhc3MgQXJyYXlLZXl3b3JkU3RhdGUgaW1wbGVtZW50cyBLZXl3b3JkU3RhdGUgewogIGZpbmFsIExpc3Q8S2V5d29yZFN0YXRlPiB0YWJsZTsKICBmaW5hbCBhbmFseXplci5LZXl3b3JkIGtleXdvcmQ7CgogIEFycmF5S2V5d29yZFN0YXRlKHRoaXMudGFibGUsIFN0cmluZyBzeW50YXgpCiAgICAgIDoga2V5d29yZCA9ICgoc3ludGF4ID09IG51bGwpID8gbnVsbCA6IGFuYWx5emVyLktleXdvcmQua2V5d29yZHNbc3ludGF4XSk7CgogIEtleXdvcmRTdGF0ZSBuZXh0KGludCBjKTsKCiAgS2V5d29yZFN0YXRlIG5leHRDYXBpdGFsKGludCBjKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoIlsiKTsKICAgIGlmIChrZXl3b3JkICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoIioiKTsKICAgICAgc2Iud3JpdGUoa2V5d29yZCk7CiAgICAgIHNiLndyaXRlKCIgIik7CiAgICB9CiAgICBMaXN0PEtleXdvcmRTdGF0ZT4gZm9vID0gdGFibGU7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvby5sZW5ndGg7IGkrKykgewogICAgICBpZiAoZm9vW2ldICE9IG51bGwpIHsKICAgICAgICBzYi53cml0ZSgiJHtuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoW2kgKyAkYV0pfTogIgogICAgICAgICAgICAiJHtmb29baV19OyAiKTsKICAgICAgfQogICAgfQogICAgc2Iud3JpdGUoIl0iKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgTG93ZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUgZXh0ZW5kcyBBcnJheUtleXdvcmRTdGF0ZSB7CiAgTG93ZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUoTGlzdDxLZXl3b3JkU3RhdGU+IHRhYmxlLCBTdHJpbmcgc3ludGF4KQogICAgICA6IHN1cGVyKHRhYmxlLCBzeW50YXgpIHsKICAgIGFzc2VydCh0YWJsZS5sZW5ndGggPT0gJHogLSAkYSArIDEpOwogIH0KCiAgS2V5d29yZFN0YXRlIG5leHQoaW50IGMpID0+IHRhYmxlW2MgLSAkYV07CgogIEtleXdvcmRTdGF0ZSBuZXh0Q2FwaXRhbChpbnQgYykgPT4gbnVsbDsKfQoKY2xhc3MgVXBwZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUgZXh0ZW5kcyBBcnJheUtleXdvcmRTdGF0ZSB7CiAgVXBwZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUoTGlzdDxLZXl3b3JkU3RhdGU+IHRhYmxlLCBTdHJpbmcgc3ludGF4KQogICAgICA6IHN1cGVyKHRhYmxlLCBzeW50YXgpIHsKICAgIGFzc2VydCh0YWJsZS5sZW5ndGggPT0gJHogLSAkQSArIDEpOwogIH0KCiAgS2V5d29yZFN0YXRlIG5leHQoaW50IGMpID0+IHRhYmxlW2MgLSAkQV07CgogIEtleXdvcmRTdGF0ZSBuZXh0Q2FwaXRhbChpbnQgYykgPT4gdGFibGVbYyAtICRBXTsKfQoKLyoqCiAqIEEgc3RhdGUgdGhhdCBoYXMgbm8gb3V0Z29pbmcgdHJhbnNpdGlvbnMuCiAqLwpjbGFzcyBMZWFmS2V5d29yZFN0YXRlIGltcGxlbWVudHMgS2V5d29yZFN0YXRlIHsKICBmaW5hbCBhbmFseXplci5LZXl3b3JkIGtleXdvcmQ7CgogIExlYWZLZXl3b3JkU3RhdGUoU3RyaW5nIHN5bnRheCkgOiBrZXl3b3JkID0gYW5hbHl6ZXIuS2V5d29yZC5rZXl3b3Jkc1tzeW50YXhdOwoKICBLZXl3b3JkU3RhdGUgbmV4dChpbnQgYykgPT4gbnVsbDsKICBLZXl3b3JkU3RhdGUgbmV4dENhcGl0YWwoaW50IGMpID0+IG51bGw7CgogIFN0cmluZyB0b1N0cmluZygpID0+IGtleXdvcmQubGV4ZW1lOwp9CoCWAE5OPAEgAS8BLgEEPAQeHCMBIAEmKiJPQTgILlAGGwQBMEEdAUQZExkZNSgXCCcuIh8KGiIvOkEMGhUKCAYcKTRJDRs0BjUXJjwNPAYEAgEELwQ7IiIBL1EBHAEjARYqExsVGRUGJCscOxwIBhMaBAIBPUYfKQQBLQErAgE9Rh8pBAEtATQCAQQtBDEiAVEBJCsBJwIBNnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY2FubmVyL2tleXdvcmRfc3RhdGUuZGFydDpzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvY29uc3RhbnRfY29udGV4dC5kYXJ0hOEvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5jb25zdGFudF9jb250ZXh0OwoKZW51bSBDb25zdGFudENvbnRleHQgewogIC8vLyBOb3QgaW4gYSBjb25zdGFudCBjb250ZXh0LgogIC8vLwogIC8vLyBUaGlzIG1lYW5zIHRoYXQgYE9iamVjdCgpYCBhbmQgYFtdYCBhcmUgZXF1aXZhbGVudCB0byBgbmV3IE9iamVjdCgpYCBhbmQKICAvLy8gYFtdYCByZXNwZWN0aXZlbHkuIGBuZXcgT2JqZWN0KClgIGlzICoqbm90KiogYSBjb21waWxlLXRpbWUgZXJyb3IuCiAgLy8vCiAgLy8vIFRPRE8oYWhlKTogVXBkYXRlIHRoZSBhYm92ZSBzcGVjaWZpY2F0aW9uIGFuZCBjb3JyZXNwb25kaW5nCiAgLy8vIGltcGxlbWVudGF0aW9uIGJlY2F1c2UgYE9iamVjdCgpYCBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4gU2VlIFttYWdpYwogIC8vLyBjb25zdF0oCiAgLy8vIC4uLy4uLy4uLy4uLy4uLy4uL2RvY3MvbGFuZ3VhZ2UvaW5mb3JtYWwvZG9jcy9sYW5ndWFnZS9pbmZvcm1hbC9pbXBsaWNpdC1jcmVhdGlvbi5tZAogIC8vLyApLgogIG5vbmUsCgogIC8vLyBJbiBhIGNvbnRleHQgd2hlcmUgY29uc3RhbnQgZXhwcmVzc2lvbnMgYXJlIHJlcXVpcmVkLCBhbmQgYGNvbnN0YCBtYXkgYmUKICAvLy8gaW5mZXJyZWQuCiAgLy8vCiAgLy8vIFRoaXMgbWVhbnMgdGhhdCBgT2JqZWN0KClgIGFuZCBgW11gIGFyZSBlcXVpdmFsZW50IHRvIGBjb25zdCBPYmplY3QoKWAgYW5kCiAgLy8vIGBjb25zdCBbXWAgcmVzcGVjdGl2ZWx5LiBgbmV3IE9iamVjdCgpYCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvci4KICBpbmZlcnJlZCwKCiAgLy8vIEluIGEgY29udGV4dCB3aGVyZSBjb25zdGFudCBleHByZXNzaW9ucyBhcmUgcmVxdWlyZWQsIGJ1dCBgY29uc3RgIGlzIG5vdAogIC8vLyBpbmZlcnJlZC4gVGhpcyBpbmNsdWRlcyBkZWZhdWx0IHZhbHVlcyBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzIGFuZAogIC8vLyBpbml0aWFsaXppbmcgZXhwcmVzc2lvbnMgb24gZmllbGRzIGluIGNsYXNzZXMgd2l0aCBhIGBjb25zdGAgY29uc3RydWN0b3IuCiAgcmVxdWlyZWQsCn0KIQBOTjwBIAEXIQZPSQZCTw5bCQgBTxAGUUcMAU9IUAwCATFwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvY29uc3RhbnRfY29udGV4dC5kYXJ0MnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9tb2RpZmllci5kYXJ0jX4vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5tb2RpZmllcjsKCmltcG9ydCAncHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQ7CgplbnVtIE1vZGlmaWVyRW51bSB7CiAgQWJzdHJhY3QsCiAgQ29uc3QsCiAgQ292YXJpYW50LAogIEV4dGVybmFsLAogIEZpbmFsLAogIFN0YXRpYywKCiAgLy8gTm90IGEgcmVhbCBtb2RpZmllci4KICBWYXIsCn0KCmNvbnN0IGludCBhYnN0cmFjdE1hc2sgPSAxOwoKY29uc3QgaW50IGNvbnN0TWFzayA9IGFic3RyYWN0TWFzayA8PCAxOwoKY29uc3QgaW50IGNvdmFyaWFudE1hc2sgPSBjb25zdE1hc2sgPDwgMTsKCmNvbnN0IGludCBleHRlcm5hbE1hc2sgPSBjb3ZhcmlhbnRNYXNrIDw8IDE7Cgpjb25zdCBpbnQgZmluYWxNYXNrID0gZXh0ZXJuYWxNYXNrIDw8IDE7Cgpjb25zdCBpbnQgc3RhdGljTWFzayA9IGZpbmFsTWFzayA8PCAxOwoKY29uc3QgaW50IG5hbWVkTWl4aW5BcHBsaWNhdGlvbk1hc2sgPSBzdGF0aWNNYXNrIDw8IDE7CgovLy8gTm90IGEgbW9kaWZpZXIsIHVzZWQgZm9yIG1peGlucyBkZWNsYXJlZCBleHBsaWNpdGx5IGJ5IHVzaW5nIHRoZSBgbWl4aW5gCi8vLyBrZXl3b3JkLgpjb25zdCBpbnQgbWl4aW5EZWNsYXJhdGlvbk1hc2sgPSBuYW1lZE1peGluQXBwbGljYXRpb25NYXNrIDw8IDE7CgovLy8gTm90IGEgbW9kaWZpZXIsIHVzZWQgZm9yIGV4dGVuc2lvbiBkZWNsYXJhdGlvbnMuCmNvbnN0IGludCBleHRlbnNpb25EZWNsYXJhdGlvbk1hc2sgPSBtaXhpbkRlY2xhcmF0aW9uTWFzayA8PCAxOwoKLy8vIE5vdCBhIG1vZGlmaWVyLCB1c2VkIGJ5IGZpZWxkcyB0byB0cmFjayBpZiB0aGV5IGhhdmUgYW4gaW5pdGlhbGl6ZXIuCmNvbnN0IGludCBoYXNJbml0aWFsaXplck1hc2sgPSBleHRlbnNpb25EZWNsYXJhdGlvbk1hc2sgPDwgMTsKCi8vLyBOb3QgYSBtb2RpZmllciwgdXNlZCBieSBmb3JtYWwgcGFyYW1ldGVycyB0byB0cmFjayBpZiB0aGV5IGFyZSBpbml0aWFsaXppbmcuCmNvbnN0IGludCBpbml0aWFsaXppbmdGb3JtYWxNYXNrID0gaGFzSW5pdGlhbGl6ZXJNYXNrIDw8IDE7CgovLy8gTm90IGEgbW9kaWZpZXIsIHVzZWQgYnkgY2xhc3NlcyB0byB0cmFjayBpZiB0aGUgY2xhc3MgaGFzIGEgY29uc3QKLy8vIGNvbnN0cnVjdG9yLgpjb25zdCBpbnQgaGFzQ29uc3RDb25zdHJ1Y3Rvck1hc2sgPSBpbml0aWFsaXppbmdGb3JtYWxNYXNrIDw8IDE7CgovLy8gTm90IGEgcmVhbCBtb2RpZmllciwgYW5kIGJ5IHNldHRpbmcgaXQgdG8gemVybywgaXQgaXMgYXV0b21hdGljYWxseSBpZ25vcmVkCi8vLyBieSBbTW9kaWZpZXIudmFsaWRhdGVdIGJlbG93Lgpjb25zdCBpbnQgdmFyTWFzayA9IDA7Cgpjb25zdCBNb2RpZmllciBBYnN0cmFjdCA9IGNvbnN0IE1vZGlmaWVyKE1vZGlmaWVyRW51bS5BYnN0cmFjdCwgYWJzdHJhY3RNYXNrKTsKCmNvbnN0IE1vZGlmaWVyIENvbnN0ID0gY29uc3QgTW9kaWZpZXIoTW9kaWZpZXJFbnVtLkNvbnN0LCBjb25zdE1hc2spOwoKY29uc3QgTW9kaWZpZXIgQ292YXJpYW50ID0KICAgIGNvbnN0IE1vZGlmaWVyKE1vZGlmaWVyRW51bS5Db3ZhcmlhbnQsIGNvdmFyaWFudE1hc2spOwoKY29uc3QgTW9kaWZpZXIgRXh0ZXJuYWwgPSBjb25zdCBNb2RpZmllcihNb2RpZmllckVudW0uRXh0ZXJuYWwsIGV4dGVybmFsTWFzayk7Cgpjb25zdCBNb2RpZmllciBGaW5hbCA9IGNvbnN0IE1vZGlmaWVyKE1vZGlmaWVyRW51bS5GaW5hbCwgZmluYWxNYXNrKTsKCmNvbnN0IE1vZGlmaWVyIFN0YXRpYyA9IGNvbnN0IE1vZGlmaWVyKE1vZGlmaWVyRW51bS5TdGF0aWMsIHN0YXRpY01hc2spOwoKLy8vIE5vdCBhIHJlYWwgbW9kaWZpZXIuCmNvbnN0IE1vZGlmaWVyIFZhciA9IGNvbnN0IE1vZGlmaWVyKE1vZGlmaWVyRW51bS5WYXIsIHZhck1hc2spOwoKY2xhc3MgTW9kaWZpZXIgewogIGZpbmFsIE1vZGlmaWVyRW51bSBraW5kOwoKICBmaW5hbCBpbnQgbWFzazsKCiAgY29uc3QgTW9kaWZpZXIodGhpcy5raW5kLCB0aGlzLm1hc2spOwoKICBmYWN0b3J5IE1vZGlmaWVyLmZyb21TdHJpbmcoU3RyaW5nIHN0cmluZykgewogICAgaWYgKGlkZW50aWNhbCgnYWJzdHJhY3QnLCBzdHJpbmcpKSByZXR1cm4gQWJzdHJhY3Q7CiAgICBpZiAoaWRlbnRpY2FsKCdjb25zdCcsIHN0cmluZykpIHJldHVybiBDb25zdDsKICAgIGlmIChpZGVudGljYWwoJ2NvdmFyaWFudCcsIHN0cmluZykpIHJldHVybiBDb3ZhcmlhbnQ7CiAgICBpZiAoaWRlbnRpY2FsKCdleHRlcm5hbCcsIHN0cmluZykpIHJldHVybiBFeHRlcm5hbDsKICAgIGlmIChpZGVudGljYWwoJ2ZpbmFsJywgc3RyaW5nKSkgcmV0dXJuIEZpbmFsOwogICAgaWYgKGlkZW50aWNhbCgnc3RhdGljJywgc3RyaW5nKSkgcmV0dXJuIFN0YXRpYzsKICAgIGlmIChpZGVudGljYWwoJ3ZhcicsIHN0cmluZykpIHJldHVybiBWYXI7CiAgICByZXR1cm4gdW5oYW5kbGVkKHN0cmluZywgIk1vZGlmaWVyLmZyb21TdHJpbmciLCAtMSwgbnVsbCk7CiAgfQoKICB0b1N0cmluZygpID0+ICJtb2RpZmllcigkeycka2luZCcuc3Vic3RyaW5nKCdNb2RpZmllckVudW0uJy5sZW5ndGgpfSkiOwoKICBzdGF0aWMgaW50IHZhbGlkYXRlKExpc3Q8TW9kaWZpZXI+IG1vZGlmaWVycywge2Jvb2wgaXNBYnN0cmFjdDogZmFsc2V9KSB7CiAgICAvLyBUT0RPKGFoZSk6IFJlbmFtZSB0aGlzIG1ldGhvZCwgdmFsaWRhdGlvbiBpcyBub3cgdGFrZW4gY2FyZSBvZiBieSB0aGUKICAgIC8vIHBhcnNlci4KICAgIGludCByZXN1bHQgPSBpc0Fic3RyYWN0ID8gYWJzdHJhY3RNYXNrIDogMDsKICAgIGlmIChtb2RpZmllcnMgPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDsKICAgIGZvciAoTW9kaWZpZXIgbW9kaWZpZXIgaW4gbW9kaWZpZXJzKSB7CiAgICAgIHJlc3VsdCB8PSBtb2RpZmllci5tYXNrOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBpbnQgdmFsaWRhdGVWYXJGaW5hbE9yQ29uc3QoU3RyaW5nIGxleGVtZSkgewogICAgaWYgKGxleGVtZSA9PSBudWxsKSByZXR1cm4gMDsKICAgIGlmIChpZGVudGljYWwoJ2NvbnN0JywgbGV4ZW1lKSkgcmV0dXJuIENvbnN0Lm1hc2s7CiAgICBpZiAoaWRlbnRpY2FsKCdmaW5hbCcsIGxleGVtZSkpIHJldHVybiBGaW5hbC5tYXNrOwogICAgaWYgKGlkZW50aWNhbCgndmFyJywgbGV4ZW1lKSkgcmV0dXJuIFZhci5tYXNrOwogICAgcmV0dXJuIHVuaGFuZGxlZChsZXhlbWUsICJNb2RpZmllci52YWxpZGF0ZVZhckZpbmFsT3JDb25zdCIsIC0xLCBudWxsKTsKICB9Cn0KcABOTjwBGAEnARQMCQ0MCQoBGgcCARwBKQEqAS0BKQEnATcBTQ1BATVAAUk+AVE8AUYRQQFQIhcBTwFGARs7AU8BRgFJARlAAREbARIBKAEvODI6ODI0Lj8EAUoBTE0PMCorHwYTBAE2Ijc3M0wEAgEpcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL21vZGlmaWVyLmRhcnQvc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL25hbWVzLmRhcnSGVi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZyb250X2VuZC5zcmMuZmFzdGEubmFtZXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IE5hbWU7CgpmaW5hbCBOYW1lIGFtcGVyc2FuZE5hbWUgPSBuZXcgTmFtZSgiJiIpOwoKZmluYWwgTmFtZSBiYXJOYW1lID0gbmV3IE5hbWUoInwiKTsKCmZpbmFsIE5hbWUgY2FsbE5hbWUgPSBuZXcgTmFtZSgiY2FsbCIpOwoKZmluYWwgTmFtZSBjYXJldE5hbWUgPSBuZXcgTmFtZSgiXiIpOwoKZmluYWwgTmFtZSBkaXZpc2lvbk5hbWUgPSBuZXcgTmFtZSgiLyIpOwoKZmluYWwgTmFtZSBkb3VibGVBbXBlcnNhbmROYW1lID0gbmV3IE5hbWUoIiYmIik7CgpmaW5hbCBOYW1lIGRvdWJsZUJhck5hbWUgPSBuZXcgTmFtZSgifHwiKTsKCmZpbmFsIE5hbWUgZG91YmxlUXVlc3Rpb25OYW1lID0gbmV3IE5hbWUoIj8/Iik7CgpmaW5hbCBOYW1lIGVtcHR5TmFtZSA9IG5ldyBOYW1lKCIiKTsKCmZpbmFsIE5hbWUgZXF1YWxzTmFtZSA9IG5ldyBOYW1lKCc9PScpOwoKZmluYWwgTmFtZSBncmVhdGVyVGhhbk5hbWUgPSBuZXcgTmFtZSgiPiIpOwoKZmluYWwgTmFtZSBncmVhdGVyVGhhbk9yRXF1YWxzTmFtZSA9IG5ldyBOYW1lKCI+PSIpOwoKZmluYWwgTmFtZSBpZGVudGljYWxOYW1lID0gbmV3IE5hbWUoImlkZW50aWNhbCIpOwoKZmluYWwgTmFtZSBpbmRleEdldE5hbWUgPSBuZXcgTmFtZSgiW10iKTsKCmZpbmFsIE5hbWUgaW5kZXhTZXROYW1lID0gbmV3IE5hbWUoIltdPSIpOwoKZmluYWwgTmFtZSBsZWZ0U2hpZnROYW1lID0gbmV3IE5hbWUoIjw8Iik7CgpmaW5hbCBOYW1lIGxlbmd0aE5hbWUgPSBuZXcgTmFtZSgibGVuZ3RoIik7CgpmaW5hbCBOYW1lIGxlc3NUaGFuTmFtZSA9IG5ldyBOYW1lKCI8Iik7CgpmaW5hbCBOYW1lIGxlc3NUaGFuT3JFcXVhbHNOYW1lID0gbmV3IE5hbWUoIjw9Iik7CgpmaW5hbCBOYW1lIG1pbnVzTmFtZSA9IG5ldyBOYW1lKCItIik7CgpmaW5hbCBOYW1lIG11bHRpcGx5TmFtZSA9IG5ldyBOYW1lKCIqIik7CgpmaW5hbCBOYW1lIG11c3RhY2hlTmFtZSA9IG5ldyBOYW1lKCJ+LyIpOwoKZmluYWwgTmFtZSBuZWdhdGlvbk5hbWUgPSBuZXcgTmFtZSgiISIpOwoKZmluYWwgTmFtZSBub1N1Y2hNZXRob2ROYW1lID0gbmV3IE5hbWUoIm5vU3VjaE1ldGhvZCIpOwoKZmluYWwgTmFtZSBwZXJjZW50TmFtZSA9IG5ldyBOYW1lKCIlIik7CgpmaW5hbCBOYW1lIHBsdXNOYW1lID0gbmV3IE5hbWUoIisiKTsKCmZpbmFsIE5hbWUgcmlnaHRTaGlmdE5hbWUgPSBuZXcgTmFtZSgiPj4iKTsKCmZpbmFsIE5hbWUgdHJpcGxlU2hpZnROYW1lID0gbmV3IE5hbWUoIj4+PiIpOwoKZmluYWwgTmFtZSB0aWxkZU5hbWUgPSBuZXcgTmFtZSgifiIpOwoKZmluYWwgTmFtZSB1bmFyeU1pbnVzTmFtZSA9IG5ldyBOYW1lKCJ1bmFyeS0iKTsKRQBOTjwBIwEsASoBJAEoASYBKQExASsBMAElASgBLAE1ATIBKgErASsBLAEpATIBJgEpASoBKQE4ASgBJQEsAS4BJgEwASZwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvbmFtZXMuZGFydDBzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyLmRhcnSG7S8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmxpYnJhcnkgZmFzdGEucGFyc2VyOwoKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ3BhcnNlci9saXN0ZW5lci5kYXJ0JyBzaG93IExpc3RlbmVyOwoKaW1wb3J0ICdwYXJzZXIvcGFyc2VyLmRhcnQnIHNob3cgUGFyc2VyOwoKaW1wb3J0ICdwYXJzZXIvcGFyc2VyX2Vycm9yLmRhcnQnIHNob3cgUGFyc2VyRXJyb3I7CgppbXBvcnQgJ2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgTWVzc2FnZSwgbWVzc2FnZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbjsKCmV4cG9ydCAncGFyc2VyL2Fzc2VydC5kYXJ0JyBzaG93IEFzc2VydDsKCmV4cG9ydCAncGFyc2VyL2NsYXNzX21lbWJlcl9wYXJzZXIuZGFydCcgc2hvdyBDbGFzc01lbWJlclBhcnNlcjsKCmV4cG9ydCAncGFyc2VyL2Zvcm1hbF9wYXJhbWV0ZXJfa2luZC5kYXJ0JyBzaG93IEZvcm1hbFBhcmFtZXRlcktpbmQ7CgpleHBvcnQgJ3BhcnNlci9pZGVudGlmaWVyX2NvbnRleHQuZGFydCcgc2hvdyBJZGVudGlmaWVyQ29udGV4dDsKCmV4cG9ydCAncGFyc2VyL2xpc3RlbmVyLmRhcnQnIHNob3cgTGlzdGVuZXI7CgpleHBvcnQgJ3BhcnNlci9tZW1iZXJfa2luZC5kYXJ0JyBzaG93IE1lbWJlcktpbmQ7CgpleHBvcnQgJ3BhcnNlci9wYXJzZXIuZGFydCcgc2hvdyBQYXJzZXI7CgpleHBvcnQgJ3BhcnNlci9wYXJzZXJfZXJyb3IuZGFydCcgc2hvdyBQYXJzZXJFcnJvcjsKCmV4cG9ydCAncGFyc2VyL3RvcF9sZXZlbF9wYXJzZXIuZGFydCcgc2hvdyBUb3BMZXZlbFBhcnNlcjsKCmV4cG9ydCAncGFyc2VyL3V0aWwuZGFydCcKICAgIHNob3cgbGVuZ3RoRm9yVG9rZW4sIGxlbmd0aE9mU3Bhbiwgb2Zmc2V0Rm9yVG9rZW4sIG9wdGlvbmFsOwoKY2xhc3MgRXJyb3JDb2xsZWN0aW5nTGlzdGVuZXIgZXh0ZW5kcyBMaXN0ZW5lciB7CiAgZmluYWwgTGlzdDxQYXJzZXJFcnJvcj4gcmVjb3ZlcmFibGVFcnJvcnMgPSA8UGFyc2VyRXJyb3I+W107CgogIHZvaWQgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBUb2tlbiBzdGFydFRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgLy8vIFRPRE8oZGFucnViZWwpOiBJZ25vcmUgdGhpcyBlcnJvciB1bnRpbCB3ZSBkZXByZWNhdGUgYG5hdGl2ZWAgc3VwcG9ydC4KICAgIGlmIChtZXNzYWdlID09IG1lc3NhZ2VOYXRpdmVDbGF1c2VTaG91bGRCZUFubm90YXRpb24pIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgcmVjb3ZlcmFibGVFcnJvcnMKICAgICAgICAuYWRkKG5ldyBQYXJzZXJFcnJvci5mcm9tVG9rZW5zKHN0YXJ0VG9rZW4sIGVuZFRva2VuLCBtZXNzYWdlKSk7CiAgfQp9CgpMaXN0PFBhcnNlckVycm9yPiBwYXJzZShUb2tlbiB0b2tlbnMpIHsKICBFcnJvckNvbGxlY3RpbmdMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckNvbGxlY3RpbmdMaXN0ZW5lcigpOwogIFBhcnNlciBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpc3RlbmVyKTsKICBwYXJzZXIucGFyc2VVbml0KHRva2Vucyk7CiAgcmV0dXJuIGxpc3RlbmVyLnJlY292ZXJhYmxlRXJyb3JzOwp9CjsATU4/ARYBKwEtASkBNAFPASkBQQFFAUABLQEyASkBNAE7ARpBATE/AR87TzwOBhZJBAIBKEQoHCUCASdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyLmRhcnQvc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3F1b3RlLmRhcnSlay8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnF1b3RlOwoKaW1wb3J0ICdwcm9ibGVtcy5kYXJ0JyBzaG93IHVuaGFuZGxlZDsKCmltcG9ydCAnZmFzdGFfY29kZXMuZGFydCcgYXMgZmFzdGE7CgppbXBvcnQgJ3NjYW5uZXIvY2hhcmFjdGVycy5kYXJ0JwogICAgc2hvdwogICAgICAgICRCQUNLU0xBU0gsCiAgICAgICAgJEJTLAogICAgICAgICRDTE9TRV9DVVJMWV9CUkFDS0VULAogICAgICAgICRDUiwKICAgICAgICAkRkYsCiAgICAgICAgJExGLAogICAgICAgICRPUEVOX0NVUkxZX0JSQUNLRVQsCiAgICAgICAgJFNQQUNFLAogICAgICAgICRUQUIsCiAgICAgICAgJFZUQUIsCiAgICAgICAgJGIsCiAgICAgICAgJGYsCiAgICAgICAgJG4sCiAgICAgICAgJHIsCiAgICAgICAgJHQsCiAgICAgICAgJHUsCiAgICAgICAgJHYsCiAgICAgICAgJHgsCiAgICAgICAgaGV4RGlnaXRWYWx1ZSwKICAgICAgICBpc0hleERpZ2l0OwoKZW51bSBRdW90ZSB7CiAgU2luZ2xlLAogIERvdWJsZSwKICBNdWx0aUxpbmVTaW5nbGUsCiAgTXVsdGlMaW5lRG91YmxlLAogIFJhd1NpbmdsZSwKICBSYXdEb3VibGUsCiAgUmF3TXVsdGlMaW5lU2luZ2xlLAogIFJhd011bHRpTGluZURvdWJsZSwKfQoKUXVvdGUgYW5hbHl6ZVF1b3RlKFN0cmluZyBmaXJzdCkgewogIGlmIChmaXJzdC5zdGFydHNXaXRoKCciIiInKSkgcmV0dXJuIFF1b3RlLk11bHRpTGluZURvdWJsZTsKICBpZiAoZmlyc3Quc3RhcnRzV2l0aCgnciIiIicpKSByZXR1cm4gUXVvdGUuUmF3TXVsdGlMaW5lRG91YmxlOwogIGlmIChmaXJzdC5zdGFydHNXaXRoKCInJyciKSkgcmV0dXJuIFF1b3RlLk11bHRpTGluZVNpbmdsZTsKICBpZiAoZmlyc3Quc3RhcnRzV2l0aCgicicnJyIpKSByZXR1cm4gUXVvdGUuUmF3TXVsdGlMaW5lU2luZ2xlOwogIGlmIChmaXJzdC5zdGFydHNXaXRoKCciJykpIHJldHVybiBRdW90ZS5Eb3VibGU7CiAgaWYgKGZpcnN0LnN0YXJ0c1dpdGgoJ3IiJykpIHJldHVybiBRdW90ZS5SYXdEb3VibGU7CiAgaWYgKGZpcnN0LnN0YXJ0c1dpdGgoIiciKSkgcmV0dXJuIFF1b3RlLlNpbmdsZTsKICBpZiAoZmlyc3Quc3RhcnRzV2l0aCgiciciKSkgcmV0dXJuIFF1b3RlLlJhd1NpbmdsZTsKICByZXR1cm4gdW5oYW5kbGVkKGZpcnN0LCAiYW5hbHl6ZVF1b3RlIiwgLTEsIG51bGwpOwp9CgovLyBOb3RlOiBiYXNlZCBvbiBbU3RyaW5nVmFsaWRhdG9yLnF1b3RpbmdGcm9tU3RyaW5nXQovLyAocGtnL2NvbXBpbGVyL2xpYi9zcmMvc3RyaW5nX3ZhbGlkYXRvci5kYXJ0KS4KaW50IGxlbmd0aE9mT3B0aW9uYWxXaGl0ZXNwYWNlUHJlZml4KFN0cmluZyBmaXJzdCwgaW50IHN0YXJ0KSB7CiAgTGlzdDxpbnQ+IGNvZGVVbml0cyA9IGZpcnN0LmNvZGVVbml0czsKICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBjb2RlVW5pdHMubGVuZ3RoOyBpKyspIHsKICAgIGludCBjb2RlID0gY29kZVVuaXRzW2ldOwogICAgaWYgKGNvZGUgPT0gJEJBQ0tTTEFTSCkgewogICAgICBpKys7CiAgICAgIGlmIChpIDwgY29kZVVuaXRzLmxlbmd0aCkgewogICAgICAgIGNvZGUgPSBjb2RlVW5pdHNbaV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChjb2RlID09ICRUQUIgfHwgY29kZSA9PSAkU1BBQ0UpIGNvbnRpbnVlOwogICAgaWYgKGNvZGUgPT0gJENSKSB7CiAgICAgIGlmIChpICsgMSA8IGNvZGVVbml0cy5sZW5ndGggJiYgY29kZVVuaXRzW2kgKyAxXSA9PSAkTEYpIHsKICAgICAgICBpKys7CiAgICAgIH0KICAgICAgcmV0dXJuIGkgKyAxOwogICAgfQogICAgaWYgKGNvZGUgPT0gJExGKSB7CiAgICAgIHJldHVybiBpICsgMTsKICAgIH0KICAgIGJyZWFrOyAvLyBOb3QgYSB3aGl0ZS1zcGFjZSBjaGFyYWN0ZXIuCiAgfQogIHJldHVybiBzdGFydDsKfQoKaW50IGZpcnN0UXVvdGVMZW5ndGgoU3RyaW5nIGZpcnN0LCBRdW90ZSBxdW90ZSkgewogIHN3aXRjaCAocXVvdGUpIHsKICAgIGNhc2UgUXVvdGUuU2luZ2xlOgogICAgY2FzZSBRdW90ZS5Eb3VibGU6CiAgICAgIHJldHVybiAxOwoKICAgIGNhc2UgUXVvdGUuTXVsdGlMaW5lU2luZ2xlOgogICAgY2FzZSBRdW90ZS5NdWx0aUxpbmVEb3VibGU6CiAgICAgIHJldHVybiBsZW5ndGhPZk9wdGlvbmFsV2hpdGVzcGFjZVByZWZpeChmaXJzdCwgMyk7CgogICAgY2FzZSBRdW90ZS5SYXdTaW5nbGU6CiAgICBjYXNlIFF1b3RlLlJhd0RvdWJsZToKICAgICAgcmV0dXJuIDI7CgogICAgY2FzZSBRdW90ZS5SYXdNdWx0aUxpbmVTaW5nbGU6CiAgICBjYXNlIFF1b3RlLlJhd011bHRpTGluZURvdWJsZToKICAgICAgcmV0dXJuIGxlbmd0aE9mT3B0aW9uYWxXaGl0ZXNwYWNlUHJlZml4KGZpcnN0LCA0KTsKICB9CiAgcmV0dXJuIHVuaGFuZGxlZCgiJHF1b3RlIiwgImZpcnN0UXVvdGVMZW5ndGgiLCAtMSwgbnVsbCk7Cn0KCmludCBsYXN0UXVvdGVMZW5ndGgoUXVvdGUgcXVvdGUpIHsKICBzd2l0Y2ggKHF1b3RlKSB7CiAgICBjYXNlIFF1b3RlLlNpbmdsZToKICAgIGNhc2UgUXVvdGUuRG91YmxlOgogICAgY2FzZSBRdW90ZS5SYXdTaW5nbGU6CiAgICBjYXNlIFF1b3RlLlJhd0RvdWJsZToKICAgICAgcmV0dXJuIDE7CgogICAgY2FzZSBRdW90ZS5NdWx0aUxpbmVTaW5nbGU6CiAgICBjYXNlIFF1b3RlLk11bHRpTGluZURvdWJsZToKICAgIGNhc2UgUXVvdGUuUmF3TXVsdGlMaW5lU2luZ2xlOgogICAgY2FzZSBRdW90ZS5SYXdNdWx0aUxpbmVEb3VibGU6CiAgICAgIHJldHVybiAzOwogIH0KICByZXR1cm4gdW5oYW5kbGVkKCIkcXVvdGUiLCAibGFzdFF1b3RlTGVuZ3RoIiwgLTEsIG51bGwpOwp9CgpTdHJpbmcgdW5lc2NhcGVGaXJzdFN0cmluZ1BhcnQoU3RyaW5nIGZpcnN0LCBRdW90ZSBxdW90ZSwgT2JqZWN0IGxvY2F0aW9uLAogICAgVW5lc2NhcGVFcnJvckxpc3RlbmVyIGxpc3RlbmVyKSB7CiAgcmV0dXJuIHVuZXNjYXBlKGZpcnN0LnN1YnN0cmluZyhmaXJzdFF1b3RlTGVuZ3RoKGZpcnN0LCBxdW90ZSkpLCBxdW90ZSwKICAgICAgbG9jYXRpb24sIGxpc3RlbmVyKTsKfQoKU3RyaW5nIHVuZXNjYXBlTGFzdFN0cmluZ1BhcnQoU3RyaW5nIGxhc3QsIFF1b3RlIHF1b3RlLCBPYmplY3QgbG9jYXRpb24sCiAgICBib29sIGlzTGFzdFF1b3RlU3ludGhldGljLCBVbmVzY2FwZUVycm9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKICBpbnQgZW5kID0gbGFzdC5sZW5ndGggLSAoaXNMYXN0UXVvdGVTeW50aGV0aWMgPyAwIDogbGFzdFF1b3RlTGVuZ3RoKHF1b3RlKSk7CiAgcmV0dXJuIHVuZXNjYXBlKGxhc3Quc3Vic3RyaW5nKDAsIGVuZCksIHF1b3RlLCBsb2NhdGlvbiwgbGlzdGVuZXIpOwp9CgpTdHJpbmcgdW5lc2NhcGVTdHJpbmcoCiAgICBTdHJpbmcgc3RyaW5nLCBPYmplY3QgbG9jYXRpb24sIFVuZXNjYXBlRXJyb3JMaXN0ZW5lciBsaXN0ZW5lcikgewogIFF1b3RlIHF1b3RlID0gYW5hbHl6ZVF1b3RlKHN0cmluZyk7CiAgcmV0dXJuIHVuZXNjYXBlKAogICAgICBzdHJpbmcuc3Vic3RyaW5nKGZpcnN0UXVvdGVMZW5ndGgoc3RyaW5nLCBxdW90ZSksCiAgICAgICAgICBzdHJpbmcubGVuZ3RoIC0gbGFzdFF1b3RlTGVuZ3RoKHF1b3RlKSksCiAgICAgIHF1b3RlLAogICAgICBsb2NhdGlvbiwKICAgICAgbGlzdGVuZXIpOwp9CgpTdHJpbmcgdW5lc2NhcGUoU3RyaW5nIHN0cmluZywgUXVvdGUgcXVvdGUsIE9iamVjdCBsb2NhdGlvbiwKICAgIFVuZXNjYXBlRXJyb3JMaXN0ZW5lciBsaXN0ZW5lcikgewogIHN3aXRjaCAocXVvdGUpIHsKICAgIGNhc2UgUXVvdGUuU2luZ2xlOgogICAgY2FzZSBRdW90ZS5Eb3VibGU6CiAgICAgIHJldHVybiAhc3RyaW5nLmNvbnRhaW5zKCJcXCIpCiAgICAgICAgICA/IHN0cmluZwogICAgICAgICAgOiB1bmVzY2FwZUNvZGVVbml0cyhzdHJpbmcuY29kZVVuaXRzLCBmYWxzZSwgbG9jYXRpb24sIGxpc3RlbmVyKTsKCiAgICBjYXNlIFF1b3RlLk11bHRpTGluZVNpbmdsZToKICAgIGNhc2UgUXVvdGUuTXVsdGlMaW5lRG91YmxlOgogICAgICByZXR1cm4gIXN0cmluZy5jb250YWlucygiXFwiKSAmJiAhc3RyaW5nLmNvbnRhaW5zKCJcciIpCiAgICAgICAgICA/IHN0cmluZwogICAgICAgICAgOiB1bmVzY2FwZUNvZGVVbml0cyhzdHJpbmcuY29kZVVuaXRzLCBmYWxzZSwgbG9jYXRpb24sIGxpc3RlbmVyKTsKCiAgICBjYXNlIFF1b3RlLlJhd1NpbmdsZToKICAgIGNhc2UgUXVvdGUuUmF3RG91YmxlOgogICAgICByZXR1cm4gc3RyaW5nOwoKICAgIGNhc2UgUXVvdGUuUmF3TXVsdGlMaW5lU2luZ2xlOgogICAgY2FzZSBRdW90ZS5SYXdNdWx0aUxpbmVEb3VibGU6CiAgICAgIHJldHVybiAhc3RyaW5nLmNvbnRhaW5zKCJcciIpCiAgICAgICAgICA/IHN0cmluZwogICAgICAgICAgOiB1bmVzY2FwZUNvZGVVbml0cyhzdHJpbmcuY29kZVVuaXRzLCB0cnVlLCBsb2NhdGlvbiwgbGlzdGVuZXIpOwogIH0KICByZXR1cm4gdW5oYW5kbGVkKCIkcXVvdGUiLCAidW5lc2NhcGUiLCAtMSwgbnVsbCk7Cn0KCi8vIE5vdGU6IGJhc2VkIG9uCi8vIFtTdHJpbmdWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmddKHBrZy9jb21waWxlci9saWIvc3JjL3N0cmluZ192YWxpZGF0b3IuZGFydCkuClN0cmluZyB1bmVzY2FwZUNvZGVVbml0cyhMaXN0PGludD4gY29kZVVuaXRzLCBib29sIGlzUmF3LCBPYmplY3QgbG9jYXRpb24sCiAgICBVbmVzY2FwZUVycm9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAvLyBDYW4ndCB1c2UgVWludDhMaXN0IG9yIFVpbnQxNkxpc3QgaGVyZSwgdGhlIGNvZGUgdW5pdHMgbWF5IGJlIGxhcmdlci4KICBMaXN0PGludD4gcmVzdWx0ID0gbmV3IExpc3Q8aW50Pihjb2RlVW5pdHMubGVuZ3RoKTsKICBpbnQgcmVzdWx0T2Zmc2V0ID0gMDsKCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2RlVW5pdHMubGVuZ3RoOyBpKyspIHsKICAgIGludCBjb2RlID0gY29kZVVuaXRzW2ldOwogICAgaWYgKGNvZGUgPT0gJENSKSB7CiAgICAgIGlmIChpICsgMSA8IGNvZGVVbml0cy5sZW5ndGggJiYgY29kZVVuaXRzW2kgKyAxXSA9PSAkTEYpIHsKICAgICAgICBpKys7CiAgICAgIH0KICAgICAgY29kZSA9ICRMRjsKICAgIH0gZWxzZSBpZiAoIWlzUmF3ICYmIGNvZGUgPT0gJEJBQ0tTTEFTSCkgewogICAgICBpZiAoY29kZVVuaXRzLmxlbmd0aCA9PSArK2kpIHsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVVbmVzY2FwZUVycm9yKAogICAgICAgICAgICBmYXN0YS5tZXNzYWdlSW52YWxpZFVuaWNvZGVFc2NhcGUsIGxvY2F0aW9uLCBpLCAxKTsKICAgICAgICByZXR1cm4gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGNvZGVVbml0cyk7CiAgICAgIH0KICAgICAgY29kZSA9IGNvZGVVbml0c1tpXTsKCiAgICAgIC8vLyBgXG5gIGZvciBuZXdsaW5lLCBlcXVpdmFsZW50IHRvIGBceDBBYC4KICAgICAgLy8vIGBccmAgZm9yIGNhcnJpYWdlIHJldHVybiwgZXF1aXZhbGVudCB0byBgXHgwRGAuCiAgICAgIC8vLyBgXGZgIGZvciBmb3JtIGZlZWQsIGVxdWl2YWxlbnQgdG8gYFx4MENgLgogICAgICAvLy8gYFxiYCBmb3IgYmFja3NwYWNlLCBlcXVpdmFsZW50IHRvIGBceDA4YC4KICAgICAgLy8vIGBcdGAgZm9yIHRhYiwgZXF1aXZhbGVudCB0byBgXHgwOWAuCiAgICAgIC8vLyBgXHZgIGZvciB2ZXJ0aWNhbCB0YWIsIGVxdWl2YWxlbnQgdG8gYFx4MEJgLgogICAgICAvLy8gYFx4WFhgIGZvciBoZXggZXNjYXBlLgogICAgICAvLy8gYFx1WFhYWGAgb3IgYFx1e1hYP1g/WD9YP1g/fWAgZm9yIFVuaWNvZGUgaGV4IGVzY2FwZS4KICAgICAgaWYgKGNvZGUgPT0gJG4pIHsKICAgICAgICBjb2RlID0gJExGOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJHIpIHsKICAgICAgICBjb2RlID0gJENSOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJGYpIHsKICAgICAgICBjb2RlID0gJEZGOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJGIpIHsKICAgICAgICBjb2RlID0gJEJTOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJHQpIHsKICAgICAgICBjb2RlID0gJFRBQjsKICAgICAgfSBlbHNlIGlmIChjb2RlID09ICR2KSB7CiAgICAgICAgY29kZSA9ICRWVEFCOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJHgpIHsKICAgICAgICAvLyBFeHBlY3QgZXhhY3RseSAyIGhleCBkaWdpdHMuCiAgICAgICAgaW50IGJlZ2luID0gaTsKICAgICAgICBpZiAoY29kZVVuaXRzLmxlbmd0aCA8PSBpICsgMikgewogICAgICAgICAgbGlzdGVuZXIuaGFuZGxlVW5lc2NhcGVFcnJvcihmYXN0YS5tZXNzYWdlSW52YWxpZEhleEVzY2FwZSwgbG9jYXRpb24sCiAgICAgICAgICAgICAgYmVnaW4sIGNvZGVVbml0cy5sZW5ndGggKyAxIC0gYmVnaW4pOwogICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgIH0KICAgICAgICBjb2RlID0gMDsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKykgewogICAgICAgICAgaW50IGRpZ2l0ID0gY29kZVVuaXRzWysraV07CiAgICAgICAgICBpZiAoIWlzSGV4RGlnaXQoZGlnaXQpKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZVVuZXNjYXBlRXJyb3IoCiAgICAgICAgICAgICAgICBmYXN0YS5tZXNzYWdlSW52YWxpZEhleEVzY2FwZSwgbG9jYXRpb24sIGJlZ2luLCBpICsgMSAtIGJlZ2luKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgICAgfQogICAgICAgICAgY29kZSA9IChjb2RlIDw8IDQpICsgaGV4RGlnaXRWYWx1ZShkaWdpdCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJHUpIHsKICAgICAgICBpbnQgYmVnaW4gPSBpOwogICAgICAgIGlmIChjb2RlVW5pdHMubGVuZ3RoID09IGkgKyAxKSB7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVVbmVzY2FwZUVycm9yKGZhc3RhLm1lc3NhZ2VJbnZhbGlkVW5pY29kZUVzY2FwZSwKICAgICAgICAgICAgICBsb2NhdGlvbiwgYmVnaW4sIGNvZGVVbml0cy5sZW5ndGggKyAxIC0gYmVnaW4pOwogICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgIH0KICAgICAgICBjb2RlID0gY29kZVVuaXRzW2kgKyAxXTsKICAgICAgICBpZiAoY29kZSA9PSAkT1BFTl9DVVJMWV9CUkFDS0VUKSB7CiAgICAgICAgICAvLyBFeHBlY3QgMS02IGhleCBkaWdpdHMgZm9sbG93ZWQgYnkgJ30nLgogICAgICAgICAgaWYgKGNvZGVVbml0cy5sZW5ndGggPT0gKytpKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZVVuZXNjYXBlRXJyb3IoZmFzdGEubWVzc2FnZUludmFsaWRVbmljb2RlRXNjYXBlLAogICAgICAgICAgICAgICAgbG9jYXRpb24sIGJlZ2luLCBpICsgMSAtIGJlZ2luKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgICAgfQogICAgICAgICAgY29kZSA9IDA7CiAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDc7IGorKykgewogICAgICAgICAgICBpZiAoY29kZVVuaXRzLmxlbmd0aCA9PSArK2kpIHsKICAgICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVVbmVzY2FwZUVycm9yKGZhc3RhLm1lc3NhZ2VJbnZhbGlkVW5pY29kZUVzY2FwZSwKICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGJlZ2luLCBpICsgMSAtIGJlZ2luKTsKICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGNvZGVVbml0cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IGRpZ2l0ID0gY29kZVVuaXRzW2ldOwogICAgICAgICAgICBpZiAoaiAhPSAwICYmIGRpZ2l0ID09ICRDTE9TRV9DVVJMWV9CUkFDS0VUKSBicmVhazsKICAgICAgICAgICAgaWYgKCFpc0hleERpZ2l0KGRpZ2l0KSkgewogICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZVVuZXNjYXBlRXJyb3IoZmFzdGEubWVzc2FnZUludmFsaWRVbmljb2RlRXNjYXBlLAogICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgYmVnaW4sIGkgKyAyIC0gYmVnaW4pOwogICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoY29kZVVuaXRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb2RlID0gKGNvZGUgPDwgNCkgKyBoZXhEaWdpdFZhbHVlKGRpZ2l0KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gRXhwZWN0IGV4YWN0bHkgNCBoZXggZGlnaXRzLgogICAgICAgICAgaWYgKGNvZGVVbml0cy5sZW5ndGggPD0gaSArIDQpIHsKICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlVW5lc2NhcGVFcnJvcihmYXN0YS5tZXNzYWdlSW52YWxpZFVuaWNvZGVFc2NhcGUsCiAgICAgICAgICAgICAgICBsb2NhdGlvbiwgYmVnaW4sIGNvZGVVbml0cy5sZW5ndGggKyAxIC0gYmVnaW4pOwogICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGNvZGVVbml0cyk7CiAgICAgICAgICB9CiAgICAgICAgICBjb2RlID0gMDsKICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CiAgICAgICAgICAgIGludCBkaWdpdCA9IGNvZGVVbml0c1srK2ldOwogICAgICAgICAgICBpZiAoIWlzSGV4RGlnaXQoZGlnaXQpKSB7CiAgICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlVW5lc2NhcGVFcnJvcihmYXN0YS5tZXNzYWdlSW52YWxpZFVuaWNvZGVFc2NhcGUsCiAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCBiZWdpbiwgaSArIDEgLSBiZWdpbik7CiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvZGUgPSAoY29kZSA8PCA0KSArIGhleERpZ2l0VmFsdWUoZGlnaXQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY29kZSA+IDB4MTBGRkZGKSB7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVVbmVzY2FwZUVycm9yKAogICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VJbnZhbGlkQ29kZVBvaW50LCBsb2NhdGlvbiwgYmVnaW4sIGkgKyAxIC0gYmVnaW4pOwogICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBOb3RoaW5nLCBlc2NhcGVkIGNoYXJhY3RlciBpcyBwYXNzZWQgdGhyb3VnaDsKICAgICAgfQogICAgfQogICAgcmVzdWx0W3Jlc3VsdE9mZnNldCsrXSA9IGNvZGU7CiAgfQogIHJldHVybiBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMocmVzdWx0LCAwLCByZXN1bHRPZmZzZXQpOwp9CgphYnN0cmFjdCBjbGFzcyBVbmVzY2FwZUVycm9yTGlzdGVuZXIgewogIHZvaWQgaGFuZGxlVW5lc2NhcGVFcnJvcigKICAgICAgZmFzdGEuTWVzc2FnZSBtZXNzYWdlLCBjb3ZhcmlhbnQgbG9jYXRpb24sIGludCBvZmZzZXQsIGludCBsZW5ndGgpOwp9CoEwAE5OPAEVAScBJAEhCRQNHg0NDR0QDg8MDAwMDAwMDBcUAQ0KChMTDQ0WFgIBIz1BPUEyNjI2NQIBNjFAKTMdHgsiHQ8PCAYyF0ENCBQGFxQGKwQQAgEyExcXEAEgIDkBGhoQASMjOQQ8AgEjExcXGhoQASAgIyMQBDsCAUsmShsCAUlBT0YCARdGJhM4Mw0QEQIBPSYTFxckE0wBICA+E0wBGhoVASMjJBNLBDQCARJRSyZLNhgBLx0XQQ0IEi8lJkA0CBsBMjo0NC43IUAYFB8UHxQfFB8VHxYfKBcpUDQ2ChImJiQqUDgMNQofFylKPjYKISs0KUwxOAwUKCtOMzoOJkAmTjM6DjcMESorTEA4DBQoKCZOMzoONwwKHyhONgoPOQgGIwQ8AgEnHEoCASZwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcXVvdGUuZGFydD9zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc291cmNlL3Njb3BlX2xpc3RlbmVyLmRhcnSS4S8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnNjb3BlX2xpc3RlbmVyOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnIHNob3cgU2NvcGU7CgppbXBvcnQgJ3N0YWNrX2xpc3RlbmVyLmRhcnQnIHNob3cgTnVsbFZhbHVlLCBTdGFja0xpc3RlbmVyOwoKZXhwb3J0ICdzdGFja19saXN0ZW5lci5kYXJ0JwogICAgc2hvdyBGaXhlZE51bGxhYmxlTGlzdCwgR3Jvd2FibGVMaXN0LCBOdWxsVmFsdWUsIFBhcnNlclJlY292ZXJ5OwoKZW51bSBKdW1wVGFyZ2V0S2luZCB7CiAgQnJlYWssCiAgQ29udGludWUsCiAgR290bywgLy8gQ29udGludWUgbGFiZWwgaW4gc3dpdGNoLgp9CgphYnN0cmFjdCBjbGFzcyBTY29wZUxpc3RlbmVyPEo+IGV4dGVuZHMgU3RhY2tMaXN0ZW5lciB7CiAgU2NvcGUgc2NvcGU7CgogIEogYnJlYWtUYXJnZXQ7CgogIEogY29udGludWVUYXJnZXQ7CgogIFNjb3BlTGlzdGVuZXIoU2NvcGUgc2NvcGUpIDogc2NvcGUgPSBzY29wZSA/PyBuZXcgU2NvcGUuaW1tdXRhYmxlKCk7CgogIEogY3JlYXRlSnVtcFRhcmdldChKdW1wVGFyZ2V0S2luZCBraW5kLCBpbnQgY2hhck9mZnNldCk7CgogIEogY3JlYXRlQnJlYWtUYXJnZXQoaW50IGNoYXJPZmZzZXQpIHsKICAgIHJldHVybiBjcmVhdGVKdW1wVGFyZ2V0KEp1bXBUYXJnZXRLaW5kLkJyZWFrLCBjaGFyT2Zmc2V0KTsKICB9CgogIEogY3JlYXRlQ29udGludWVUYXJnZXQoaW50IGNoYXJPZmZzZXQpIHsKICAgIHJldHVybiBjcmVhdGVKdW1wVGFyZ2V0KEp1bXBUYXJnZXRLaW5kLkNvbnRpbnVlLCBjaGFyT2Zmc2V0KTsKICB9CgogIEogY3JlYXRlR290b1RhcmdldChpbnQgY2hhck9mZnNldCkgewogICAgcmV0dXJuIGNyZWF0ZUp1bXBUYXJnZXQoSnVtcFRhcmdldEtpbmQuR290bywgY2hhck9mZnNldCk7CiAgfQoKICB2b2lkIGVudGVyTG9jYWxTY29wZShTdHJpbmcgZGVidWdOYW1lLCBbU2NvcGUgbmV3U2NvcGVdKSB7CiAgICBwdXNoKHNjb3BlKTsKICAgIHNjb3BlID0gbmV3U2NvcGUgPz8gc2NvcGUuY3JlYXRlTmVzdGVkU2NvcGUoZGVidWdOYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZXhpdExvY2FsU2NvcGUoKSB7CiAgICBzY29wZSA9IHBvcCgpOwogICAgYXNzZXJ0KHNjb3BlICE9IG51bGwpOwogIH0KCiAgdm9pZCBlbnRlckJyZWFrVGFyZ2V0KGludCBjaGFyT2Zmc2V0LCBbSiB0YXJnZXRdKSB7CiAgICBwdXNoKGJyZWFrVGFyZ2V0ID8/IE51bGxWYWx1ZS5CcmVha1RhcmdldCk7CiAgICBicmVha1RhcmdldCA9IHRhcmdldCA/PyBjcmVhdGVCcmVha1RhcmdldChjaGFyT2Zmc2V0KTsKICB9CgogIHZvaWQgZW50ZXJDb250aW51ZVRhcmdldChpbnQgY2hhck9mZnNldCwgW0ogdGFyZ2V0XSkgewogICAgcHVzaChjb250aW51ZVRhcmdldCA/PyBOdWxsVmFsdWUuQ29udGludWVUYXJnZXQpOwogICAgY29udGludWVUYXJnZXQgPSB0YXJnZXQgPz8gY3JlYXRlQ29udGludWVUYXJnZXQoY2hhck9mZnNldCk7CiAgfQoKICBKIGV4aXRCcmVha1RhcmdldCgpIHsKICAgIEogY3VycmVudCA9IGJyZWFrVGFyZ2V0OwogICAgYnJlYWtUYXJnZXQgPSBwb3AoKTsKICAgIHJldHVybiBjdXJyZW50OwogIH0KCiAgSiBleGl0Q29udGludWVUYXJnZXQoKSB7CiAgICBKIGN1cnJlbnQgPSBjb250aW51ZVRhcmdldDsKICAgIGNvbnRpbnVlVGFyZ2V0ID0gcG9wKCk7CiAgICByZXR1cm4gY3VycmVudDsKICB9CgogIHZvaWQgZW50ZXJMb29wKGludCBjaGFyT2Zmc2V0KSB7CiAgICBlbnRlckJyZWFrVGFyZ2V0KGNoYXJPZmZzZXQpOwogICAgZW50ZXJDb250aW51ZVRhcmdldChjaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5CbG9ja0Z1bmN0aW9uQm9keShUb2tlbiBiZWdpbikgewogICAgZGVidWdFdmVudCgiYmVnaW5CbG9ja0Z1bmN0aW9uQm9keSIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJibG9jayBmdW5jdGlvbiBib2R5Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9yU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkZvclN0YXRlbWVudCIpOwogICAgZW50ZXJMb29wKHRva2VuLmNoYXJPZmZzZXQpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJmb3Igc3RhdG1lbnQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JDb250cm9sRmxvdyhUb2tlbiBhd2FpdFRva2VuLCBUb2tlbiBmb3JUb2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Gb3JDb250cm9sRmxvdyIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJmb3IgaW4gYSBjb2xsZWN0aW9uIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQmxvY2soVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luQmxvY2siKTsKICAgIGVudGVyTG9jYWxTY29wZSgiYmxvY2siKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Td2l0Y2hCbG9jayhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Td2l0Y2hCbG9jayIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJzd2l0Y2ggYmxvY2siKTsKICAgIGVudGVyQnJlYWtUYXJnZXQodG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRG9XaGlsZVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Eb1doaWxlU3RhdGVtZW50Iik7CiAgICBlbnRlckxvb3AodG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luV2hpbGVTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luV2hpbGVTdGF0ZW1lbnQiKTsKICAgIGVudGVyTG9vcCh0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Eb1doaWxlU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Eb1doaWxlU3RhdGVtZW50Qm9keSIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJkby13aGlsZSBzdGF0ZW1lbnQgYm9keSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmREb1doaWxlU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiZW5kRG9XaGlsZVN0YXRlbWVudEJvZHkiKTsKICAgIHZhciBib2R5ID0gcG9wKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgcHVzaChib2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5XaGlsZVN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luV2hpbGVTdGF0ZW1lbnRCb2R5Iik7CiAgICBlbnRlckxvY2FsU2NvcGUoIndoaWxlIHN0YXRlbWVudCBib2R5Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFdoaWxlU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiZW5kV2hpbGVTdGF0ZW1lbnRCb2R5Iik7CiAgICB2YXIgYm9keSA9IHBvcCgpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIHB1c2goYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9yU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Gb3JTdGF0ZW1lbnRCb2R5Iik7CiAgICBlbnRlckxvY2FsU2NvcGUoImZvciBzdGF0ZW1lbnQgYm9keSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRGb3JTdGF0ZW1lbnRCb2R5Iik7CiAgICB2YXIgYm9keSA9IHBvcCgpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIHB1c2goYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9ySW5Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkZvckluQm9keSIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJmb3ItaW4gYm9keSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JJbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZEZvckluQm9keSIpOwogICAgdmFyIGJvZHkgPSBwb3AoKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBwdXNoKGJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblRoZW5TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luVGhlblN0YXRlbWVudCIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJ0aGVuIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFRoZW5TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZFRoZW5TdGF0ZW1lbnQiKTsKICAgIHZhciBib2R5ID0gcG9wKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgcHVzaChib2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5FbHNlU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkVsc2VTdGF0ZW1lbnQiKTsKICAgIGVudGVyTG9jYWxTY29wZSgiZWxzZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFbHNlU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRFbHNlU3RhdGVtZW50Iik7CiAgICB2YXIgYm9keSA9IHBvcCgpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIHB1c2goYm9keSk7CiAgfQp9CoDUAE5OPAEeAS4BIwE8AR1FARYJDCUCATgPAREBFAFHATsBKD8EAStCBAEnPgQBPRE8BAEMGhMbBAE2MDsEATk2QQQBGB0ZFAQBGyAcFAQBIyIlBAEMLSosBAEMKCUhJQQBDD8nLAQBDCEeHgQBDCckJSgEAQwsKSEEAQwqJyEEAQwwLTAEAQwuKxYWEAQBDC4rLQQBDCwpFhYQBAEMLCkrBAEMKicWFhAEAQwlIiQEAQwjIBYWEAQBDCkmHQQBDCckFhYQBAEMKSYdBAEMJyQWFhAEAgE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9zY29wZV9saXN0ZW5lci5kYXJ0PHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2UvdmFsdWVfa2luZHMuZGFydI1ELy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIHR5cGUgc2hvdyBBcmd1bWVudHMsIEV4cHJlc3Npb247CgppbXBvcnQgJy4uL2J1aWxkZXIvYnVpbGRlci5kYXJ0JyBhcyB0eXBlOwoKaW1wb3J0ICcuLi9rZXJuZWwvZXhwcmVzc2lvbl9nZW5lcmF0b3IuZGFydCcgYXMgdHlwZTsKCmltcG9ydCAnLi4vc2Nhbm5lci5kYXJ0JyBhcyB0eXBlIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnIGFzIHR5cGU7CgppbXBvcnQgJ3N0YWNrX2xpc3RlbmVyLmRhcnQnIHNob3cgTnVsbFZhbHVlOwoKaW1wb3J0ICdzdGFja19saXN0ZW5lci5kYXJ0JyBhcyB0eXBlOwoKLy8vIFtWYWx1ZUtpbmRdIGlzIHVzZWQgaW4gW1N0YWNrTGlzdGVuZXIuY2hlY2tTdGF0ZV0gdG8gZG9jdW1lbnQgYW5kIGNoZWNrIHRoZQovLy8gZXhwZWN0ZWQgdmFsdWVzIG9mIHRoZSBzdGFjay4KLy8vCi8vLyBBZGQgbmV3IHZhbHVlIGtpbmRzIGFzIG5lZWRlZCBmb3IgZG9jdW1lbnRpbmcgYW5kIGNoZWNraW5nIHRoZSB2YXJpb3VzIHN0YWNrCi8vLyBsaXN0ZW5lciBpbXBsZW1lbnRhdGlvbnMuCmFic3RyYWN0IGNsYXNzIFZhbHVlS2luZCB7CiAgY29uc3QgVmFsdWVLaW5kKCk7CgogIC8vLyBDaGVja3MgdGhlIFt2YWx1ZV0gYW4gcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGlzIG9mIHRoZSBleHBlY3RlZCBraW5kLgogIGJvb2wgY2hlY2soT2JqZWN0IHZhbHVlKTsKCiAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBBcmd1bWVudHNPck51bGwgPQogICAgICBfU2luZ2xlVmFsdWVLaW5kPHR5cGUuQXJndW1lbnRzPihOdWxsVmFsdWUuQXJndW1lbnRzKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIEV4cHJlc3Npb24gPSBfU2luZ2xlVmFsdWVLaW5kPHR5cGUuRXhwcmVzc2lvbj4oKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIElkZW50aWZpZXIgPSBfU2luZ2xlVmFsdWVLaW5kPHR5cGUuSWRlbnRpZmllcj4oKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIEludGVnZXIgPSBfU2luZ2xlVmFsdWVLaW5kPGludD4oKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIEdlbmVyYXRvciA9IF9TaW5nbGVWYWx1ZUtpbmQ8dHlwZS5HZW5lcmF0b3I+KCk7CiAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBOYW1lID0gX1NpbmdsZVZhbHVlS2luZDxTdHJpbmc+KCk7CiAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBOYW1lT3JOdWxsID0gX1NpbmdsZVZhbHVlS2luZDxTdHJpbmc+KE51bGxWYWx1ZS5OYW1lKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIE5hbWVPclBhcnNlclJlY292ZXJ5ID0KICAgICAgX1VuaW9uVmFsdWVLaW5kKFtOYW1lLCBQYXJzZXJSZWNvdmVyeV0pOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgTWV0YWRhdGFMaXN0T3JOdWxsID0KICAgICAgX1NpbmdsZVZhbHVlS2luZDxMaXN0PHR5cGUuTWV0YWRhdGFCdWlsZGVyPj4oTnVsbFZhbHVlLk1ldGFkYXRhKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIFBhcnNlclJlY292ZXJ5ID0KICAgICAgX1NpbmdsZVZhbHVlS2luZDx0eXBlLlBhcnNlclJlY292ZXJ5PigpOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgUHJvYmxlbUJ1aWxkZXIgPQogICAgICBfU2luZ2xlVmFsdWVLaW5kPHR5cGUuUHJvYmxlbUJ1aWxkZXI+KCk7CiAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBUb2tlbiA9IF9TaW5nbGVWYWx1ZUtpbmQ8dHlwZS5Ub2tlbj4oKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIFRva2VuT3JOdWxsID0KICAgICAgX1NpbmdsZVZhbHVlS2luZDx0eXBlLlRva2VuPihOdWxsVmFsdWUuVG9rZW4pOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgVHlwZUFyZ3VtZW50c09yTnVsbCA9CiAgICAgIF9TaW5nbGVWYWx1ZUtpbmQ8TGlzdDx0eXBlLlVucmVzb2x2ZWRUeXBlPj4oTnVsbFZhbHVlLlR5cGVBcmd1bWVudHMpOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgVHlwZUJ1aWxkZXIgPSBfU2luZ2xlVmFsdWVLaW5kPHR5cGUuVHlwZUJ1aWxkZXI+KCk7CiAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBUeXBlVmFyaWFibGVMaXN0T3JOdWxsID0KICAgICAgX1NpbmdsZVZhbHVlS2luZDxMaXN0PHR5cGUuVHlwZVZhcmlhYmxlQnVpbGRlcj4+KE51bGxWYWx1ZS5UeXBlVmFyaWFibGVzKTsKfQoKLy8vIEEgW1ZhbHVlS2luZF0gZm9yIGEgcGFydGljdWxhciB0eXBlIFtUXSwgb3B0aW9uYWxseSB3aXRoIGEgcmVjb2duaXplZAovLy8gW051bGxWYWx1ZV0uCmNsYXNzIF9TaW5nbGVWYWx1ZUtpbmQ8VD4gaW1wbGVtZW50cyBWYWx1ZUtpbmQgewogIGZpbmFsIE51bGxWYWx1ZSBudWxsVmFsdWU7CgogIGNvbnN0IF9TaW5nbGVWYWx1ZUtpbmQoW3RoaXMubnVsbFZhbHVlXSk7CgogIEBvdmVycmlkZQogIGJvb2wgY2hlY2soT2JqZWN0IHZhbHVlKSB7CiAgICBpZiAobnVsbFZhbHVlICE9IG51bGwgJiYgdmFsdWUgPT0gbnVsbFZhbHVlKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIHZhbHVlIGlzIFQ7CiAgfQp9CgovLy8gQSBbVmFsdWVLaW5kXSBmb3IgdGhlIHVuaW9uIG9mIGEgbGlzdCBvZiBbVmFsdWVLaW5kXXMuCmNsYXNzIF9VbmlvblZhbHVlS2luZCBpbXBsZW1lbnRzIFZhbHVlS2luZCB7CiAgZmluYWwgTGlzdDxWYWx1ZUtpbmQ+IGtpbmRzOwoKICBjb25zdCBfVW5pb25WYWx1ZUtpbmQodGhpcy5raW5kcyk7CgogIEBvdmVycmlkZQogIGJvb2wgY2hlY2soT2JqZWN0IHZhbHVlKSB7CiAgICBmb3IgKFZhbHVlS2luZCBraW5kIGluIGtpbmRzKSB7CiAgICAgIGlmIChraW5kLmNoZWNrKHZhbHVlKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgovLy8gSGVscGVyIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBsaXN0IG9mIFtWYWx1ZUtpbmRdcyBvZiB0aGUgZ2l2ZW4gbGVuZ3RoCi8vLyBbY291bnRdLgpMaXN0PFZhbHVlS2luZD4gcmVwZWF0ZWRLaW5kcyhWYWx1ZUtpbmQga2luZCwgaW50IGNvdW50KSB7CiAgcmV0dXJuIG5ldyBMaXN0LmdlbmVyYXRlKGNvdW50LCAoXykgPT4ga2luZCk7Cn0KCi8vLyBIZWxwZXIgbWV0aG9kIGZvciBjcmVhdGluZyBhIHVuaW9uIG9mIGEgbGlzdCBvZiBbVmFsdWVLaW5kXXMuClZhbHVlS2luZCB1bmlvbk9mS2luZHMoTGlzdDxWYWx1ZUtpbmQ+IGtpbmRzKSB7CiAgcmV0dXJuIF9VbmlvblZhbHVlS2luZChraW5kcyk7Cn0KZABOTjwBRQEqATYBLQEgAS0BJgFQIgRRHhsVAVEcASs9S0s8STxQMC8uSCovKi9BJzUvTE0yUQIBShExHQEsAQwdMxMGFwQCATstHwElAQwdJB8VCAYSBAIBSg07MAIBQjAhAgEzcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS92YWx1ZV9raW5kcy5kYXJ0RnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnTAATzILy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRS5tZCBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMga2VybmVsOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHMsCiAgICAgICAgQXNFeHByZXNzaW9uLAogICAgICAgIEFzeW5jTWFya2VyLAogICAgICAgIEJvdHRvbVR5cGUsCiAgICAgICAgQ2xhc3MsCiAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uLAogICAgICAgIENvbnN0cnVjdG9ySW52b2NhdGlvbiwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZpZWxkLAogICAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbiwKICAgICAgICBGdW5jdGlvbk5vZGUsCiAgICAgICAgRnVuY3Rpb25UeXBlLAogICAgICAgIEluc3RhbnRpYXRpb24sCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBJbnZvY2F0aW9uRXhwcmVzc2lvbiwKICAgICAgICBMZXQsCiAgICAgICAgTGlzdExpdGVyYWwsCiAgICAgICAgTWFwTGl0ZXJhbCwKICAgICAgICBNZW1iZXIsCiAgICAgICAgTWV0aG9kSW52b2NhdGlvbiwKICAgICAgICBOYW1lLAogICAgICAgIE51bGxMaXRlcmFsLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBQcm9jZWR1cmVLaW5kLAogICAgICAgIFByb3BlcnR5R2V0LAogICAgICAgIFByb3BlcnR5U2V0LAogICAgICAgIFJldHVyblN0YXRlbWVudCwKICAgICAgICBTZXRMaXRlcmFsLAogICAgICAgIFN0YXRlbWVudCwKICAgICAgICBTdGF0aWNHZXQsCiAgICAgICAgU3VwZXJNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIFN1cGVyUHJvcGVydHlHZXQsCiAgICAgICAgU3VwZXJQcm9wZXJ0eVNldCwKICAgICAgICBTdXBlcnR5cGUsCiAgICAgICAgVGhpc0V4cHJlc3Npb24sCiAgICAgICAgVHJlZU5vZGUsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uLAogICAgICAgIFZhcmlhYmxlR2V0LAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnCiAgICBzaG93IGdldEZyZXNoVHlwZVBhcmFtZXRlcnMsIFN1YnN0aXR1dGlvbjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvc3JjL2JvdW5kc19jaGVja3MuZGFydCcgc2hvdyBjYWxjdWxhdGVCb3VuZHM7CgppbXBvcnQgJy4uLy4uL2Jhc2UvaW5zdHJ1bWVudGF0aW9uLmRhcnQnCiAgICBzaG93CiAgICAgICAgSW5zdHJ1bWVudGF0aW9uLAogICAgICAgIEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyLAogICAgICAgIEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZSwKICAgICAgICBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGVBcmdzOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgVGVtcGxhdGUsCiAgICAgICAgbWVzc2FnZVJldHVybkZyb21Wb2lkRnVuY3Rpb24sCiAgICAgICAgbWVzc2FnZVJldHVybldpdGhvdXRFeHByZXNzaW9uLAogICAgICAgIG1lc3NhZ2VWb2lkRXhwcmVzc2lvbiwKICAgICAgICBub0xlbmd0aCwKICAgICAgICB0ZW1wbGF0ZUFyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGUsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTmFtZWRBcmd1bWVudCwKICAgICAgICB0ZW1wbGF0ZUltcGxpY2l0Q2FsbE9mTm9uTWV0aG9kLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtTm9JbmZlcnJlZFR5cGVTdG9yZWQsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1TdG9yaW5nTXVsdGlwbGVJbmZlcnJlZFR5cGVzLAogICAgICAgIHRlbXBsYXRlSW52YWxpZEFzc2lnbm1lbnQsCiAgICAgICAgdGVtcGxhdGVJbnZhbGlkQ2FzdEZ1bmN0aW9uRXhwciwKICAgICAgICB0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbExpc3QsCiAgICAgICAgdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxNYXAsCiAgICAgICAgdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxTZXQsCiAgICAgICAgdGVtcGxhdGVJbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb24sCiAgICAgICAgdGVtcGxhdGVJbnZhbGlkQ2FzdE5ld0V4cHIsCiAgICAgICAgdGVtcGxhdGVJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZCwKICAgICAgICB0ZW1wbGF0ZUludmFsaWRDYXN0VG9wTGV2ZWxGdW5jdGlvbiwKICAgICAgICB0ZW1wbGF0ZUludm9rZU5vbkZ1bmN0aW9uLAogICAgICAgIHRlbXBsYXRlTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3MsCiAgICAgICAgdGVtcGxhdGVVbmRlZmluZWRHZXR0ZXIsCiAgICAgICAgdGVtcGxhdGVVbmRlZmluZWRNZXRob2QsCiAgICAgICAgdGVtcGxhdGVVbmRlZmluZWRTZXR0ZXI7CgppbXBvcnQgJy4uL2tlcm5lbC9leHByZXNzaW9uX2dlbmVyYXRvci5kYXJ0JyBzaG93IGJ1aWxkSXNOdWxsOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcgc2hvdyBLZXJuZWxMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9zaGFkb3dfYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgRXhwcmVzc2lvbkp1ZGdtZW50LAogICAgICAgIFNoYWRvd1R5cGVJbmZlcmVuY2VFbmdpbmUsCiAgICAgICAgU2hhZG93VHlwZUluZmVycmVyLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCwKICAgICAgICBnZXRFeHBsaWNpdFR5cGVBcmd1bWVudHMsCiAgICAgICAgZ2V0SW5mZXJyZWRUeXBlOwoKaW1wb3J0ICcuLi9rZXJuZWwvdHlwZV9hbGdvcml0aG1zLmRhcnQnIHNob3cgaGFzQW55VHlwZVZhcmlhYmxlczsKCmltcG9ydCAnLi4vbmFtZXMuZGFydCcgc2hvdyBjYWxsTmFtZSwgdW5hcnlNaW51c05hbWU7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgaW50ZXJuYWxQcm9ibGVtLCB1bmV4cGVjdGVkLCB1bmhhbmRsZWQ7CgppbXBvcnQgJ2luZmVyZW5jZV9oZWxwZXIuZGFydCcgc2hvdyBJbmZlcmVuY2VIZWxwZXI7CgppbXBvcnQgJ3R5cGVfY29uc3RyYWludF9nYXRoZXJlci5kYXJ0JyBzaG93IFR5cGVDb25zdHJhaW50R2F0aGVyZXI7CgppbXBvcnQgJ3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0JwogICAgc2hvdyBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzTm9uQ292YXJpYW50bHksIFR5cGVJbmZlcmVuY2VFbmdpbmUsIFZhcmlhbmNlOwoKaW1wb3J0ICd0eXBlX3Byb21vdGlvbi5kYXJ0JyBzaG93IFR5cGVQcm9tb3RlcjsKCmltcG9ydCAndHlwZV9zY2hlbWEuZGFydCcgc2hvdyBpc0tub3duLCBVbmtub3duVHlwZTsKCmltcG9ydCAndHlwZV9zY2hlbWFfZWxpbWluYXRpb24uZGFydCcgc2hvdyBncmVhdGVzdENsb3N1cmU7CgppbXBvcnQgJ3R5cGVfc2NoZW1hX2Vudmlyb25tZW50LmRhcnQnCiAgICBzaG93CiAgICAgICAgZ2V0TmFtZWRQYXJhbWV0ZXJUeXBlLAogICAgICAgIGdldFBvc2l0aW9uYWxQYXJhbWV0ZXJUeXBlLAogICAgICAgIFR5cGVWYXJpYWJsZUVsaW1pbmF0b3IsCiAgICAgICAgVHlwZVNjaGVtYUVudmlyb25tZW50OwoKLy8vIEdpdmVuIGEgW0Z1bmN0aW9uTm9kZV0sIGdldHMgdGhlIG5hbWVkIHBhcmFtZXRlciBpZGVudGlmaWVkIGJ5IFtuYW1lXSwgb3IKLy8vIGBudWxsYCBpZiB0aGVyZSBpcyBubyBwYXJhbWV0ZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KVmFyaWFibGVEZWNsYXJhdGlvbiBnZXROYW1lZEZvcm1hbChGdW5jdGlvbk5vZGUgZnVuY3Rpb24sIFN0cmluZyBuYW1lKSB7CiAgZm9yICh2YXIgZm9ybWFsIGluIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgaWYgKGZvcm1hbC5uYW1lID09IG5hbWUpIHJldHVybiBmb3JtYWw7CiAgfQogIHJldHVybiBudWxsOwp9CgovLy8gR2l2ZW4gYSBbRnVuY3Rpb25Ob2RlXSwgZ2V0cyB0aGUgW2lddGggcG9zaXRpb25hbCBmb3JtYWwgcGFyYW1ldGVyLCBvcgovLy8gYG51bGxgIGlmIHRoZXJlIGlzIG5vIHBhcmFtZXRlciB3aXRoIHRoYXQgaW5kZXguClZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0UG9zaXRpb25hbEZvcm1hbChGdW5jdGlvbk5vZGUgZnVuY3Rpb24sIGludCBpKSB7CiAgaWYgKGkgPCBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgIHJldHVybiBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICB9IGVsc2UgewogICAgcmV0dXJuIG51bGw7CiAgfQp9Cgpib29sIGlzT3ZlcmxvYWRhYmxlQXJpdGhtZXRpY09wZXJhdG9yKFN0cmluZyBuYW1lKSB7CiAgcmV0dXJuIGlkZW50aWNhbChuYW1lLCAnKycpIHx8CiAgICAgIGlkZW50aWNhbChuYW1lLCAnLScpIHx8CiAgICAgIGlkZW50aWNhbChuYW1lLCAnKicpIHx8CiAgICAgIGlkZW50aWNhbChuYW1lLCAnJScpOwp9CgovLy8gS2VlcHMgdHJhY2sgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGlubmVybW9zdCBmdW5jdGlvbiBvciBjbG9zdXJlIGJlaW5nCi8vLyBpbmZlcnJlZC4KY2xhc3MgQ2xvc3VyZUNvbnRleHQgewogIGZpbmFsIGJvb2wgaXNBc3luYzsKCiAgZmluYWwgYm9vbCBpc0dlbmVyYXRvcjsKCiAgLy8vIFRoZSB0eXBpbmcgZXhwZWN0YXRpb24gZm9yIHRoZSBzdWJleHByZXNzaW9uIG9mIGEgYHJldHVybmAgb3IgYHlpZWxkYAogIC8vLyBzdGF0ZW1lbnQgaW5zaWRlIHRoZSBmdW5jdGlvbi4KICAvLy8KICAvLy8gRm9yIG5vbi1nZW5lcmF0b3IgYXN5bmMgZnVuY3Rpb25zLCB0aGlzIHdpbGwgYmUgYSAiRnV0dXJlT3IiIHR5cGUgKHNpbmNlCiAgLy8vIGl0IGlzIHBlcm1pc3NpYmxlIGZvciBzdWNoIGEgZnVuY3Rpb24gdG8gcmV0dXJuIGVpdGhlciBhIGRpcmVjdCB2YWx1ZSBvcgogIC8vLyBhIGZ1dHVyZSkuCiAgLy8vCiAgLy8vIEZvciBnZW5lcmF0b3IgZnVuY3Rpb25zIGNvbnRhaW5pbmcgYSBgeWllbGQqYCBzdGF0ZW1lbnQsIHRoZSBleHBlY3RlZCB0eXBlCiAgLy8vIGZvciB0aGUgc3ViZXhwcmVzc2lvbiBvZiB0aGUgYHlpZWxkKmAgc3RhdGVtZW50IGlzIHRoZSByZXN1bHQgb2Ygd3JhcHBpbmcKICAvLy8gdGhpcyB0eXBpbmcgZXhwZWN0YXRpb24gaW4gYFN0cmVhbWAgb3IgYEl0ZXJhdG9yYCwgYXMgYXBwcm9wcmlhdGUuCiAgZmluYWwgRGFydFR5cGUgcmV0dXJuT3JZaWVsZENvbnRleHQ7CgogIGZpbmFsIERhcnRUeXBlIGRlY2xhcmVkUmV0dXJuVHlwZTsKCiAgZmluYWwgYm9vbCBfbmVlZFRvSW5mZXJSZXR1cm5UeXBlOwoKICAvLy8gVGhlIHR5cGUgdGhhdCBhY3R1YWxseSBhcHBlYXJlZCBhcyB0aGUgc3ViZXhwcmVzc2lvbiBvZiBgcmV0dXJuYCBvcgogIC8vLyBgeWllbGRgIHN0YXRlbWVudHMgaW5zaWRlIHRoZSBmdW5jdGlvbi4KICAvLy8KICAvLy8gRm9yIG5vbi1nZW5lcmF0b3IgYXN5bmMgZnVuY3Rpb25zLCB0aGlzIGlzIHRoZSAidW53cmFwcGVkIiB0eXBlIChlLmcuIGlmCiAgLy8vIHRoZSBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byByZXR1cm4gYEZ1dHVyZTxpbnQ+YCwgdGhpcyBpcyBgaW50YCkuCiAgLy8vCiAgLy8vIEZvciBnZW5lcmF0b3IgZnVuY3Rpb25zIGNvbnRhaW5pbmcgYSBgeWllbGQqYCBzdGF0ZW1lbnQsIHRoZSB0eXBlIHRoYXQKICAvLy8gYXBwZWFyZWQgYXMgdGhlIHN1YmV4cHJlc3Npb24gb2YgdGhlIGB5aWVsZCpgIHN0YXRlbWVudCB3YXMgdGhlIHJlc3VsdCBvZgogIC8vLyB3cmFwcGluZyB0aGlzIHR5cGUgaW4gYFN0cmVhbWAgb3IgYEl0ZXJhdG9yYCwgYXMgYXBwcm9wcmlhdGUuCiAgRGFydFR5cGUgX2luZmVycmVkVW53cmFwcGVkUmV0dXJuT3JZaWVsZFR5cGU7CgogIC8vLyBXaGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBhbiBhcnJvdyBmdW5jdGlvbi4KICBib29sIGlzQXJyb3c7CgogIC8vLyBBIGxpc3Qgb2YgcmV0dXJuIHN0YXRlbWVudHMgaW4gZnVuY3Rpb25zIHdob3NlIHJldHVybiB0eXBlIGlzIGJlaW5nCiAgLy8vIGluZmVycmVkLgogIC8vLwogIC8vLyBUaGUgcmV0dXJucyBhcmUgY2hlY2tlZCBmb3IgdmFsaWRpdHkgYWZ0ZXIgdGhlIHJldHVybiB0eXBlIGlzIGluZmVycmVkLgogIExpc3Q8UmV0dXJuU3RhdGVtZW50PiByZXR1cm5TdGF0ZW1lbnRzOwoKICAvLy8gQSBsaXN0IG9mIHJldHVybiBleHByZXNzaW9uIHR5cGVzIGluIGZ1bmN0aW9ucyB3aG9zZSByZXR1cm4gdHlwZSBpcwogIC8vLyBiZWluZyBpbmZlcnJlZC4KICBMaXN0PERhcnRUeXBlPiByZXR1cm5FeHByZXNzaW9uVHlwZXM7CgogIGZhY3RvcnkgQ2xvc3VyZUNvbnRleHQoVHlwZUluZmVycmVySW1wbCBpbmZlcnJlciwgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIsCiAgICAgIERhcnRUeXBlIHJldHVybkNvbnRleHQsIGJvb2wgbmVlZFRvSW5mZXJSZXR1cm5UeXBlKSB7CiAgICBhc3NlcnQocmV0dXJuQ29udGV4dCAhPSBudWxsKTsKICAgIERhcnRUeXBlIGRlY2xhcmVkUmV0dXJuVHlwZSA9CiAgICAgICAgZ3JlYXRlc3RDbG9zdXJlKGluZmVycmVyLmNvcmVUeXBlcywgcmV0dXJuQ29udGV4dCk7CiAgICBib29sIGlzQXN5bmMgPSBhc3luY01hcmtlciA9PSBBc3luY01hcmtlci5Bc3luYyB8fAogICAgICAgIGFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLkFzeW5jU3RhcjsKICAgIGJvb2wgaXNHZW5lcmF0b3IgPSBhc3luY01hcmtlciA9PSBBc3luY01hcmtlci5TeW5jU3RhciB8fAogICAgICAgIGFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLkFzeW5jU3RhcjsKICAgIGlmIChpc0dlbmVyYXRvcikgewogICAgICBpZiAoaXNBc3luYykgewogICAgICAgIHJldHVybkNvbnRleHQgPSBpbmZlcnJlci5nZXRUeXBlQXJndW1lbnRPZigKICAgICAgICAgICAgcmV0dXJuQ29udGV4dCwgaW5mZXJyZXIuY29yZVR5cGVzLnN0cmVhbUNsYXNzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm5Db250ZXh0ID0gaW5mZXJyZXIuZ2V0VHlwZUFyZ3VtZW50T2YoCiAgICAgICAgICAgIHJldHVybkNvbnRleHQsIGluZmVycmVyLmNvcmVUeXBlcy5pdGVyYWJsZUNsYXNzKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc0FzeW5jKSB7CiAgICAgIHJldHVybkNvbnRleHQgPSBpbmZlcnJlci53cmFwRnV0dXJlT3JUeXBlKAogICAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LnVuZnV0dXJlVHlwZShyZXR1cm5Db250ZXh0KSk7CiAgICB9CiAgICByZXR1cm4gbmV3IENsb3N1cmVDb250ZXh0Ll8oaXNBc3luYywgaXNHZW5lcmF0b3IsIHJldHVybkNvbnRleHQsCiAgICAgICAgZGVjbGFyZWRSZXR1cm5UeXBlLCBuZWVkVG9JbmZlclJldHVyblR5cGUpOwogIH0KCiAgQ2xvc3VyZUNvbnRleHQuXyh0aGlzLmlzQXN5bmMsIHRoaXMuaXNHZW5lcmF0b3IsIHRoaXMucmV0dXJuT3JZaWVsZENvbnRleHQsCiAgICAgIHRoaXMuZGVjbGFyZWRSZXR1cm5UeXBlLCB0aGlzLl9uZWVkVG9JbmZlclJldHVyblR5cGUpIHsKICAgIGlmIChfbmVlZFRvSW5mZXJSZXR1cm5UeXBlKSB7CiAgICAgIHJldHVyblN0YXRlbWVudHMgPSBbXTsKICAgICAgcmV0dXJuRXhwcmVzc2lvblR5cGVzID0gW107CiAgICB9CiAgfQoKICBib29sIGNoZWNrVmFsaWRSZXR1cm4oVHlwZUluZmVycmVySW1wbCBpbmZlcnJlciwgRGFydFR5cGUgcmV0dXJuVHlwZSwKICAgICAgUmV0dXJuU3RhdGVtZW50IHN0YXRlbWVudCwgRGFydFR5cGUgZXhwcmVzc2lvblR5cGUpIHsKICAgIC8vIFRoZSBydWxlcyBmb3IgdmFsaWQgcmV0dXJucyBmb3IgZnVuY3Rpb25zIHdpdGggcmV0dXJuIHR5cGUgVCBhbmQgcG9zc2libHkKICAgIC8vIGEgcmV0dXJuIGV4cHJlc3Npb24gd2l0aCBzdGF0aWMgdHlwZSBTLgogICAgdmFyIGZsYXR0ZW5lZFJldHVyblR5cGUgPSBpc0FzeW5jCiAgICAgICAgPyBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQudW5mdXR1cmVUeXBlKHJldHVyblR5cGUpCiAgICAgICAgOiByZXR1cm5UeXBlOwogICAgaWYgKHN0YXRlbWVudC5leHByZXNzaW9uID09IG51bGwpIHsKICAgICAgLy8gU3luYzogcmV0dXJuOyBpcyBhIHZhbGlkIHJldHVybiBpZiBUIGlzIHZvaWQsIGR5bmFtaWMsIG9yIE51bGwuCiAgICAgIC8vIEFzeW5jOiByZXR1cm47IGlzIGEgdmFsaWQgcmV0dXJuIGlmIGZsYXR0ZW4oVCkgaXMgdm9pZCwgZHluYW1pYywgb3IKICAgICAgLy8gTnVsbC4KICAgICAgaWYgKGZsYXR0ZW5lZFJldHVyblR5cGUgaXMgVm9pZFR5cGUgfHwKICAgICAgICAgIGZsYXR0ZW5lZFJldHVyblR5cGUgaXMgRHluYW1pY1R5cGUgfHwKICAgICAgICAgIGZsYXR0ZW5lZFJldHVyblR5cGUgPT0gaW5mZXJyZXIuY29yZVR5cGVzLm51bGxDbGFzcy5yYXdUeXBlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBpbmZlcnJlci5oZWxwZXIud3JhcEluUHJvYmxlbSgKICAgICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpLi5maWxlT2Zmc2V0ID0gc3RhdGVtZW50LmZpbGVPZmZzZXQsCiAgICAgICAgICBtZXNzYWdlUmV0dXJuV2l0aG91dEV4cHJlc3Npb24sCiAgICAgICAgICBub0xlbmd0aCkKICAgICAgICAuLnBhcmVudCA9IHN0YXRlbWVudDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIEFycm93IGZ1bmN0aW9ucyBhcmUgdmFsaWQgaWY6CiAgICAvLyBTeW5jOiBUIGlzIHZvaWQgb3IgcmV0dXJuIGV4cDsgaXMgYSB2YWxpZCBmb3IgYSBibG9jay1ib2RpZWQgZnVuY3Rpb24uCiAgICAvLyBBc3luYzogZmxhdHRlbihUKSBpcyB2b2lkIG9yIHJldHVybiBleHA7IGlzIHZhbGlkIGZvciBhIGJsb2NrLWJvZGllZAogICAgLy8gZnVuY3Rpb24uCiAgICBpZiAoaXNBcnJvdyAmJiBmbGF0dGVuZWRSZXR1cm5UeXBlIGlzIFZvaWRUeXBlKSByZXR1cm4gdHJ1ZTsKCiAgICAvLyBTeW5jOiBpbnZhbGlkIGlmIFQgaXMgdm9pZCBhbmQgUyBpcyBub3Qgdm9pZCwgZHluYW1pYywgb3IgTnVsbAogICAgLy8gQXN5bmM6IGludmFsaWQgaWYgVCBpcyB2b2lkIGFuZCBmbGF0dGVuKFMpIGlzIG5vdCB2b2lkLCBkeW5hbWljLCBvciBOdWxsLgogICAgdmFyIGZsYXR0ZW5lZEV4cHJlc3Npb25UeXBlID0gaXNBc3luYwogICAgICAgID8gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LnVuZnV0dXJlVHlwZShleHByZXNzaW9uVHlwZSkKICAgICAgICA6IGV4cHJlc3Npb25UeXBlOwogICAgaWYgKHJldHVyblR5cGUgaXMgVm9pZFR5cGUgJiYKICAgICAgICBmbGF0dGVuZWRFeHByZXNzaW9uVHlwZSBpcyEgVm9pZFR5cGUgJiYKICAgICAgICBmbGF0dGVuZWRFeHByZXNzaW9uVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICBmbGF0dGVuZWRFeHByZXNzaW9uVHlwZSAhPSBpbmZlcnJlci5jb3JlVHlwZXMubnVsbENsYXNzLnJhd1R5cGUpIHsKICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBpbmZlcnJlci5oZWxwZXIud3JhcEluUHJvYmxlbSgKICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uLCBtZXNzYWdlUmV0dXJuRnJvbVZvaWRGdW5jdGlvbiwgbm9MZW5ndGgpCiAgICAgICAgLi5wYXJlbnQgPSBzdGF0ZW1lbnQ7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBTeW5jOiBpbnZhbGlkIGlmIFMgaXMgdm9pZCBhbmQgVCBpcyBub3Qgdm9pZCwgZHluYW1pYywgb3IgTnVsbC4KICAgIC8vIEFzeW5jOiBpbnZhbGlkIGlmIGZsYXR0ZW4oUykgaXMgdm9pZCBhbmQgZmxhdHRlbihUKSBpcyBub3Qgdm9pZCwgZHluYW1pYywKICAgIC8vIG9yIE51bGwuCiAgICBpZiAoZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgaXMgVm9pZFR5cGUgJiYKICAgICAgICBmbGF0dGVuZWRSZXR1cm5UeXBlIGlzISBWb2lkVHlwZSAmJgogICAgICAgIGZsYXR0ZW5lZFJldHVyblR5cGUgaXMhIER5bmFtaWNUeXBlICYmCiAgICAgICAgZmxhdHRlbmVkUmV0dXJuVHlwZSAhPSBpbmZlcnJlci5jb3JlVHlwZXMubnVsbENsYXNzLnJhd1R5cGUpIHsKICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBpbmZlcnJlci5oZWxwZXIKICAgICAgICAgIC53cmFwSW5Qcm9ibGVtKHN0YXRlbWVudC5leHByZXNzaW9uLCBtZXNzYWdlVm9pZEV4cHJlc3Npb24sIG5vTGVuZ3RoKQogICAgICAgICAgICAuLnBhcmVudCA9IHN0YXRlbWVudDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIFRoZSBjYWxsZXIgd2lsbCBjaGVjayB0aGF0IHRoZSByZXR1cm4gZXhwcmVzc2lvbiBpcyBhc3NpZ25hYmxlIHRvIHRoZQogICAgLy8gcmV0dXJuIHR5cGUuCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBVcGRhdGVzIHRoZSBpbmZlcnJlZCByZXR1cm4gdHlwZSBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSByZXR1cm4KICAvLy8gc3RhdGVtZW50IHJldHVybmluZyB0aGUgZ2l2ZW4gW3R5cGVdLgogIHZvaWQgaGFuZGxlUmV0dXJuKFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIsIFJldHVyblN0YXRlbWVudCBzdGF0ZW1lbnQsCiAgICAgIERhcnRUeXBlIHR5cGUsIGJvb2wgaXNBcnJvdykgewogICAgaWYgKGlzR2VuZXJhdG9yKSByZXR1cm47CiAgICAvLyBUaGUgZmlyc3QgcmV0dXJuIHdlIHNlZSB0ZWxscyB1cyBpZiB3ZSBoYXZlIGFuIGFycm93IGZ1bmN0aW9uLgogICAgaWYgKHRoaXMuaXNBcnJvdyA9PSBudWxsKSB7CiAgICAgIHRoaXMuaXNBcnJvdyA9IGlzQXJyb3c7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQodGhpcy5pc0Fycm93ID09IGlzQXJyb3cpOwogICAgfQoKICAgIGlmIChfbmVlZFRvSW5mZXJSZXR1cm5UeXBlKSB7CiAgICAgIC8vIEFkZCB0aGUgcmV0dXJuIHRvIGEgbGlzdCB0byBiZSBjaGVja2VkIGZvciB2YWxpZGl0eSBhZnRlciB3ZSd2ZQogICAgICAvLyBpbmZlcnJlZCB0aGUgcmV0dXJuIHR5cGUuCiAgICAgIHJldHVyblN0YXRlbWVudHMuYWRkKHN0YXRlbWVudCk7CiAgICAgIHJldHVybkV4cHJlc3Npb25UeXBlcy5hZGQodHlwZSk7CgogICAgICAvLyBUaGUgcmV0dXJuIGV4cHJlc3Npb24gaGFzIHRvIGJlIGFzc2lnbmFibGUgdG8gdGhlIHJldHVybiB0eXBlCiAgICAgIC8vIGV4cGVjdGF0aW9uIGZyb20gdGhlIGRvd253YXJkcyBpbmZlcmVuY2UgY29udGV4dC4KICAgICAgaWYgKHN0YXRlbWVudC5leHByZXNzaW9uICE9IG51bGwgJiYKICAgICAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUocmV0dXJuT3JZaWVsZENvbnRleHQsIHR5cGUsCiAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uLCBzdGF0ZW1lbnQuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgICAgaXNSZXR1cm5Gcm9tQXN5bmM6IGlzQXN5bmMsIGlzVm9pZEFsbG93ZWQ6IHRydWUpICE9CiAgICAgICAgICAgICAgbnVsbCkgewogICAgICAgIC8vIE5vdCBhc3NpZ25hYmxlLCB1c2UgdGhlIGV4cGVjdGF0aW9uLgogICAgICAgIHR5cGUgPSBncmVhdGVzdENsb3N1cmUoaW5mZXJyZXIuY29yZVR5cGVzLCByZXR1cm5PcllpZWxkQ29udGV4dCk7CiAgICAgIH0KICAgICAgdmFyIHVud3JhcHBlZFR5cGUgPSB0eXBlOwogICAgICBpZiAoaXNBc3luYykgewogICAgICAgIHVud3JhcHBlZFR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQudW5mdXR1cmVUeXBlKHR5cGUpOwogICAgICB9CiAgICAgIGlmIChfaW5mZXJyZWRVbndyYXBwZWRSZXR1cm5PcllpZWxkVHlwZSA9PSBudWxsKSB7CiAgICAgICAgX2luZmVycmVkVW53cmFwcGVkUmV0dXJuT3JZaWVsZFR5cGUgPSB1bndyYXBwZWRUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIF9pbmZlcnJlZFVud3JhcHBlZFJldHVybk9yWWllbGRUeXBlID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgICAgIC5nZXRTdGFuZGFyZFVwcGVyQm91bmQoCiAgICAgICAgICAgICAgICBfaW5mZXJyZWRVbndyYXBwZWRSZXR1cm5PcllpZWxkVHlwZSwgdW53cmFwcGVkVHlwZSk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIElmIHdlIGFyZSBub3QgaW5mZXJyaW5nIGEgdHlwZSB3ZSBjYW4gaW1tZWRpYXRlbHkgY2hlY2sgdGhhdCB0aGUgcmV0dXJuCiAgICAvLyBpcyB2YWxpZC4KICAgIGlmIChjaGVja1ZhbGlkUmV0dXJuKGluZmVycmVyLCBkZWNsYXJlZFJldHVyblR5cGUsIHN0YXRlbWVudCwgdHlwZSkgJiYKICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUocmV0dXJuT3JZaWVsZENvbnRleHQsIHR5cGUsCiAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgc3RhdGVtZW50LmZpbGVPZmZzZXQsCiAgICAgICAgICBpc1JldHVybkZyb21Bc3luYzogaXNBc3luYywgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICB9CiAgfQoKICB2b2lkIGhhbmRsZVlpZWxkKFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIsIGJvb2wgaXNZaWVsZFN0YXIsIERhcnRUeXBlIHR5cGUsCiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgaW50IGZpbGVPZmZzZXQpIHsKICAgIGlmICghaXNHZW5lcmF0b3IpIHJldHVybjsKICAgIHZhciBleHBlY3RlZFR5cGUgPSBpc1lpZWxkU3RhcgogICAgICAgID8gX3dyYXBBc3luY09yR2VuZXJhdG9yKGluZmVycmVyLCByZXR1cm5PcllpZWxkQ29udGV4dCkKICAgICAgICA6IHJldHVybk9yWWllbGRDb250ZXh0OwogICAgaWYgKGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoZXhwZWN0ZWRUeXBlLCB0eXBlLCBleHByZXNzaW9uLCBmaWxlT2Zmc2V0LAogICAgICAgICAgICBpc1JldHVybkZyb21Bc3luYzogaXNBc3luYykgIT0KICAgICAgICBudWxsKSB7CiAgICAgIHR5cGUgPSBncmVhdGVzdENsb3N1cmUoaW5mZXJyZXIuY29yZVR5cGVzLCBleHBlY3RlZFR5cGUpOwogICAgfQogICAgaWYgKF9uZWVkVG9JbmZlclJldHVyblR5cGUpIHsKICAgICAgdmFyIHVud3JhcHBlZFR5cGUgPSB0eXBlOwogICAgICBpZiAoaXNZaWVsZFN0YXIpIHsKICAgICAgICB1bndyYXBwZWRUeXBlID0gaW5mZXJyZXIuZ2V0RGVyaXZlZFR5cGVBcmd1bWVudE9mKAogICAgICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgICAgIGlzQXN5bmMKICAgICAgICAgICAgICAgICAgICA/IGluZmVycmVyLmNvcmVUeXBlcy5zdHJlYW1DbGFzcwogICAgICAgICAgICAgICAgICAgIDogaW5mZXJyZXIuY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MpID8/CiAgICAgICAgICAgIHR5cGU7CiAgICAgIH0KICAgICAgaWYgKF9pbmZlcnJlZFVud3JhcHBlZFJldHVybk9yWWllbGRUeXBlID09IG51bGwpIHsKICAgICAgICBfaW5mZXJyZWRVbndyYXBwZWRSZXR1cm5PcllpZWxkVHlwZSA9IHVud3JhcHBlZFR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2luZmVycmVkVW53cmFwcGVkUmV0dXJuT3JZaWVsZFR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgLmdldFN0YW5kYXJkVXBwZXJCb3VuZCgKICAgICAgICAgICAgICAgIF9pbmZlcnJlZFVud3JhcHBlZFJldHVybk9yWWllbGRUeXBlLCB1bndyYXBwZWRUeXBlKTsKICAgICAgfQogICAgfQogIH0KCiAgRGFydFR5cGUgaW5mZXJSZXR1cm5UeXBlKFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIpIHsKICAgIGFzc2VydChfbmVlZFRvSW5mZXJSZXR1cm5UeXBlKTsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9CiAgICAgICAgaW5mZXJyZXIuaW5mZXJSZXR1cm5UeXBlKF9pbmZlcnJlZFVud3JhcHBlZFJldHVybk9yWWllbGRUeXBlKTsKICAgIGlmICghaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgLmlzU3VidHlwZU9mKGluZmVycmVkVHlwZSwgcmV0dXJuT3JZaWVsZENvbnRleHQpKSB7CiAgICAgIC8vIElmIHRoZSBpbmZlcnJlZCByZXR1cm4gdHlwZSBpc24ndCBhIHN1YnR5cGUgb2YgdGhlIGNvbnRleHQsIHdlIHVzZSB0aGUKICAgICAgLy8gY29udGV4dC4KICAgICAgaW5mZXJyZWRUeXBlID0gZ3JlYXRlc3RDbG9zdXJlKGluZmVycmVyLmNvcmVUeXBlcywgcmV0dXJuT3JZaWVsZENvbnRleHQpOwogICAgfQoKICAgIGluZmVycmVkVHlwZSA9IF93cmFwQXN5bmNPckdlbmVyYXRvcihpbmZlcnJlciwgaW5mZXJyZWRUeXBlKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmV0dXJuU3RhdGVtZW50cy5sZW5ndGg7ICsraSkgewogICAgICBjaGVja1ZhbGlkUmV0dXJuKGluZmVycmVyLCBpbmZlcnJlZFR5cGUsIHJldHVyblN0YXRlbWVudHNbaV0sCiAgICAgICAgICByZXR1cm5FeHByZXNzaW9uVHlwZXNbaV0pOwogICAgfQoKICAgIHJldHVybiBpbmZlcnJlZFR5cGU7CiAgfQoKICBEYXJ0VHlwZSBfd3JhcEFzeW5jT3JHZW5lcmF0b3IoVHlwZUluZmVycmVySW1wbCBpbmZlcnJlciwgRGFydFR5cGUgdHlwZSkgewogICAgaWYgKGlzR2VuZXJhdG9yKSB7CiAgICAgIGlmIChpc0FzeW5jKSB7CiAgICAgICAgcmV0dXJuIGluZmVycmVyLndyYXBUeXBlKHR5cGUsIGluZmVycmVyLmNvcmVUeXBlcy5zdHJlYW1DbGFzcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGluZmVycmVyLndyYXBUeXBlKHR5cGUsIGluZmVycmVyLmNvcmVUeXBlcy5pdGVyYWJsZUNsYXNzKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc0FzeW5jKSB7CiAgICAgIHJldHVybiBpbmZlcnJlci53cmFwRnV0dXJlVHlwZSh0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0eXBlOwogICAgfQogIH0KfQoKLy8vIEVudW0gZGVub3RpbmcgdGhlIGtpbmRzIG9mIGNvbnRyYXZhcmlhbmNlIGNoZWNrIHRoYXQgbWlnaHQgbmVlZCB0byBiZQovLy8gaW5zZXJ0ZWQgZm9yIGEgbWV0aG9kIGNhbGwuCmVudW0gTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQgewogIC8vLyBObyBjb250cmF2YXJpYW5jZSBjaGVjayBpcyBuZWVkZWQuCiAgbm9uZSwKCiAgLy8vIFRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgbWV0aG9kIGNhbGwgbmVlZHMgdG8gYmUgY2hlY2tlZC4KICBjaGVja01ldGhvZFJldHVybiwKCiAgLy8vIFRoZSBtZXRob2QgY2FsbCBuZWVkcyB0byBiZSBkZXN1Z2FyZWQgaW50byBhIGdldHRlciBjYWxsLCBmb2xsb3dlZCBieSBhbgogIC8vLyAiYXMiIGNoZWNrLCBmb2xsb3dlZCBieSBhbiBpbnZvY2F0aW9uIG9mIHRoZSByZXN1bHRpbmcgZnVuY3Rpb24gb2JqZWN0LgogIGNoZWNrR2V0dGVyUmV0dXJuLAp9CgovLy8gS2VlcHMgdHJhY2sgb2YgdGhlIGxvY2FsIHN0YXRlIGZvciB0aGUgdHlwZSBpbmZlcmVuY2UgdGhhdCBvY2N1cnMgZHVyaW5nCi8vLyBjb21waWxhdGlvbiBvZiBhIHNpbmdsZSBtZXRob2QgYm9keSBvciB0b3AgbGV2ZWwgaW5pdGlhbGl6ZXIuCi8vLwovLy8gVGhpcyBjbGFzcyBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBmb3IgdXNlIGJ5IGNsaWVudHMgb2YgdHlwZSBpbmZlcmVuY2UKLy8vIChlLmcuIEJvZHlCdWlsZGVyKS4gIERlcml2ZWQgY2xhc3NlcyBzaG91bGQgZGVyaXZlIGZyb20gW1R5cGVJbmZlcnJlckltcGxdLgphYnN0cmFjdCBjbGFzcyBUeXBlSW5mZXJyZXIgewogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CgogIFR5cGVJbmZlcnJlci5wcml2YXRlKHRoaXMuY29yZVR5cGVzKTsKCiAgZmFjdG9yeSBUeXBlSW5mZXJyZXIoCiAgICAgIFNoYWRvd1R5cGVJbmZlcmVuY2VFbmdpbmUgZW5naW5lLAogICAgICBVcmkgdXJpLAogICAgICBib29sIHRvcExldmVsLAogICAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlLAogICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSA9IFNoYWRvd1R5cGVJbmZlcnJlci5wcml2YXRlOwoKICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBnZXQgbGlicmFyeTsKCiAgLy8vIEdldHMgdGhlIFtUeXBlUHJvbW90ZXJdIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSB0eXBlIHByb21vdGlvbiB3aXRoaW4KICAvLy8gdGhpcyBtZXRob2QgYm9keSBvciBpbml0aWFsaXplci4KICBUeXBlUHJvbW90ZXIgZ2V0IHR5cGVQcm9tb3RlcjsKCiAgLy8vIEdldHMgdGhlIFtUeXBlU2NoZW1hRW52aXJvbm1lbnRdIGJlaW5nIHVzZWQgZm9yIHR5cGUgaW5mZXJlbmNlLgogIFR5cGVTY2hlbWFFbnZpcm9ubWVudCBnZXQgdHlwZVNjaGVtYUVudmlyb25tZW50OwoKICAvLy8gVGhlIFVSSSBvZiB0aGUgY29kZSBmb3Igd2hpY2ggdHlwZSBpbmZlcmVuY2UgaXMgY3VycmVudGx5IGJlaW5nCiAgLy8vIHBlcmZvcm1lZC0tdGhpcyBpcyB1c2VkIGZvciB0ZXN0aW5nLgogIFVyaSBnZXQgdXJpOwoKICAvLy8gUGVyZm9ybXMgZnVsbCB0eXBlIGluZmVyZW5jZSBvbiB0aGUgZ2l2ZW4gZmllbGQgaW5pdGlhbGl6ZXIuCiAgdm9pZCBpbmZlckZpZWxkSW5pdGlhbGl6ZXIoSW5mZXJlbmNlSGVscGVyIGhlbHBlciwgRGFydFR5cGUgZGVjbGFyZWRUeXBlLAogICAgICBrZXJuZWwuRXhwcmVzc2lvbiBpbml0aWFsaXplcik7CgogIC8vLyBQZXJmb3JtcyB0eXBlIGluZmVyZW5jZSBvbiB0aGUgZ2l2ZW4gZnVuY3Rpb24gYm9keS4KICB2b2lkIGluZmVyRnVuY3Rpb25Cb2R5KEluZmVyZW5jZUhlbHBlciBoZWxwZXIsIERhcnRUeXBlIHJldHVyblR5cGUsCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyLCBTdGF0ZW1lbnQgYm9keSk7CgogIC8vLyBQZXJmb3JtcyB0eXBlIGluZmVyZW5jZSBvbiB0aGUgZ2l2ZW4gY29uc3RydWN0b3IgaW5pdGlhbGl6ZXIuCiAgdm9pZCBpbmZlckluaXRpYWxpemVyKEluZmVyZW5jZUhlbHBlciBoZWxwZXIsIGtlcm5lbC5Jbml0aWFsaXplciBpbml0aWFsaXplcik7CgogIC8vLyBQZXJmb3JtcyB0eXBlIGluZmVyZW5jZSBvbiB0aGUgZ2l2ZW4gbWV0YWRhdGEgYW5ub3RhdGlvbnMuCiAgdm9pZCBpbmZlck1ldGFkYXRhKAogICAgICBJbmZlcmVuY2VIZWxwZXIgaGVscGVyLCBMaXN0PGtlcm5lbC5FeHByZXNzaW9uPiBhbm5vdGF0aW9ucyk7CgogIC8vLyBQZXJmb3JtcyB0eXBlIGluZmVyZW5jZSBvbiB0aGUgZ2l2ZW4gbWV0YWRhdGEgYW5ub3RhdGlvbnMga2VlcGluZyB0aGUKICAvLy8gZXhpc3RpbmcgaGVscGVyIGlmIHBvc3NpYmxlLgogIHZvaWQgaW5mZXJNZXRhZGF0YUtlZXBpbmdIZWxwZXIoTGlzdDxrZXJuZWwuRXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMpOwoKICAvLy8gUGVyZm9ybXMgdHlwZSBpbmZlcmVuY2Ugb24gdGhlIGdpdmVuIGZ1bmN0aW9uIHBhcmFtZXRlciBpbml0aWFsaXplcgogIC8vLyBleHByZXNzaW9uLgogIHZvaWQgaW5mZXJQYXJhbWV0ZXJJbml0aWFsaXplcihJbmZlcmVuY2VIZWxwZXIgaGVscGVyLAogICAgICBrZXJuZWwuRXhwcmVzc2lvbiBpbml0aWFsaXplciwgRGFydFR5cGUgZGVjbGFyZWRUeXBlKTsKfQoKLy8vIERlcml2ZWQgY2xhc3MgY29udGFpbmluZyBnZW5lcmljIGltcGxlbWVudGF0aW9ucyBvZiBbVHlwZUluZmVycmVyXS4KLy8vCi8vLyBUaGlzIGNsYXNzIGNvbnRhaW5zIGFzIG11Y2ggb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHR5cGUgaW5mZXJlbmNlIGFzCi8vLyBwb3NzaWJsZSB3aXRob3V0IGtub3dpbmcgdGhlIGlkZW50aXR5IG9mIHRoZSB0eXBlIHBhcmFtZXRlcnMuICBJdCBkZWZlcnMgdG8KLy8vIGFic3RyYWN0IG1ldGhvZHMgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KYWJzdHJhY3QgY2xhc3MgVHlwZUluZmVycmVySW1wbCBleHRlbmRzIFR5cGVJbmZlcnJlciB7CiAgLy8vIE1hcmtlciBvYmplY3QgdG8gaW5kaWNhdGUgdGhhdCBhIGZ1bmN0aW9uIHRha2VzIGFuIHVua25vd24gbnVtYmVyCiAgLy8vIG9mIGFyZ3VtZW50cy4KICBzdGF0aWMgZmluYWwgRnVuY3Rpb25UeXBlIHVua25vd25GdW5jdGlvbiA9CiAgICAgIG5ldyBGdW5jdGlvblR5cGUoY29uc3QgW10sIGNvbnN0IER5bmFtaWNUeXBlKCkpOwoKICBmaW5hbCBUeXBlSW5mZXJlbmNlRW5naW5lIGVuZ2luZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgVXJpIHVyaTsKCiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb25zdHJ1Y3Qgd2UgYXJlIGN1cnJlbnRseSBwZXJmb3JtaW5nIGluZmVyZW5jZSBmb3IKICAvLy8gaXMgb3V0c2lkZSBvZiBhIG1ldGhvZCBib2R5LCBhbmQgaGVuY2UgdG9wIGxldmVsIHR5cGUgaW5mZXJlbmNlIHJ1bGVzCiAgLy8vIHNob3VsZCBhcHBseS4KICBmaW5hbCBib29sIGlzVG9wTGV2ZWw7CgogIGZpbmFsIENsYXNzSGllcmFyY2h5IGNsYXNzSGllcmFyY2h5OwoKICBmaW5hbCBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uOwoKICBmaW5hbCBUeXBlU2NoZW1hRW52aXJvbm1lbnQgdHlwZVNjaGVtYUVudmlyb25tZW50OwoKICBmaW5hbCBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5OwoKICBmaW5hbCBNYXA8VHJlZU5vZGUsIERhcnRUeXBlPiBpbmZlcnJlZFR5cGVzTWFwID0gPFRyZWVOb2RlLCBEYXJ0VHlwZT57fTsKCiAgSW5mZXJlbmNlSGVscGVyIGhlbHBlcjsKCiAgLy8vIENvbnRleHQgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IGNsb3N1cmUsIG9yIGBudWxsYCBpZiB3ZSBhcmUgbm90CiAgLy8vIGluc2lkZSBhIGNsb3N1cmUuCiAgQ2xvc3VyZUNvbnRleHQgY2xvc3VyZUNvbnRleHQ7CgogIC8vLyBUaGUgW1N1YnN0aXR1dGlvbl0gaW5mZXJyZWQgYnkgdGhlIGxhc3QgW2luZmVySW52b2NhdGlvbl0sIG9yIGBudWxsYCBpZgogIC8vLyB0aGUgbGFzdCBpbnZvY2F0aW9uIGRpZG4ndCByZXF1aXJlIGFueSBpbmZlcmVuY2UuCiAgU3Vic3RpdHV0aW9uIGxhc3RJbmZlcnJlZFN1YnN0aXR1dGlvbjsKCiAgLy8vIFRoZSBbRnVuY3Rpb25UeXBlXSBvZiB0aGUgY2FsbGVlIGluIHRoZSBsYXN0IFtpbmZlckludm9jYXRpb25dLCBvciBgbnVsbGAKICAvLy8gaWYgdGhlIGxhc3QgaW52b2NhdGlvbiBkaWRuJ3QgcmVxdWlyZSBhbnkgaW5mZXJlbmNlLgogIEZ1bmN0aW9uVHlwZSBsYXN0Q2FsbGVlVHlwZTsKCiAgVHlwZUluZmVycmVySW1wbC5wcml2YXRlKAogICAgICB0aGlzLmVuZ2luZSwgdGhpcy51cmksIGJvb2wgdG9wTGV2ZWwsIHRoaXMudGhpc1R5cGUsIHRoaXMubGlicmFyeSkKICAgICAgOiBhc3NlcnQoKHRvcExldmVsICYmIGxpYnJhcnkgPT0gbnVsbCkgfHwgKCF0b3BMZXZlbCAmJiBsaWJyYXJ5ICE9IG51bGwpKSwKICAgICAgICBjbGFzc0hpZXJhcmNoeSA9IGVuZ2luZS5jbGFzc0hpZXJhcmNoeSwKICAgICAgICBpbnN0cnVtZW50YXRpb24gPSB0b3BMZXZlbCA/IG51bGwgOiBlbmdpbmUuaW5zdHJ1bWVudGF0aW9uLAogICAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudCA9IGVuZ2luZS50eXBlU2NoZW1hRW52aXJvbm1lbnQsCiAgICAgICAgaXNUb3BMZXZlbCA9IHRvcExldmVsLAogICAgICAgIHN1cGVyLnByaXZhdGUoZW5naW5lLmNvcmVUeXBlcyk7CgogIERhcnRUeXBlIHN0b3JlSW5mZXJyZWRUeXBlKFRyZWVOb2RlIG5vZGUsIERhcnRUeXBlIHR5cGUpIHsKICAgIGlmIChub2RlIGlzIEV4cHJlc3Npb25KdWRnbWVudCkgewogICAgICByZXR1cm4gbm9kZS5pbmZlcnJlZFR5cGUgPSB0eXBlOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGluZmVycmVkVHlwZXNNYXAuY29udGFpbnNLZXkobm9kZSkpIHsKICAgICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtU3RvcmluZ011bHRpcGxlSW5mZXJyZWRUeXBlcy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgaW5mZXJyZWRUeXBlc01hcFtub2RlXSwgIiR7bm9kZS5ydW50aW1lVHlwZX0iKSwKICAgICAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgICB1cmkpOwogICAgICB9CiAgICAgIHJldHVybiBpbmZlcnJlZFR5cGVzTWFwW25vZGVdID0gdHlwZTsKICAgIH0KICB9CgogIERhcnRUeXBlIHJlYWRJbmZlcnJlZFR5cGUoVHJlZU5vZGUgbm9kZSkgewogICAgaWYgKCFpbmZlcnJlZFR5cGVzTWFwLmNvbnRhaW5zS2V5KG5vZGUpICYmICFpc1RvcExldmVsKSB7CiAgICAgIGludGVybmFsUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtTm9JbmZlcnJlZFR5cGVTdG9yZWQKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cygiJHtub2RlLnJ1bnRpbWVUeXBlfSIpLAogICAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgdXJpKTsKICAgIH0KICAgIHJldHVybiBpbmZlcnJlZFR5cGVzTWFwW25vZGVdOwogIH0KCiAgLy8vIEdldHMgdGhlIHR5cGUgcHJvbW90ZXIgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBwcm9tb3RlIHR5cGVzIGR1cmluZwogIC8vLyBpbmZlcmVuY2UuCiAgVHlwZVByb21vdGVyIGdldCB0eXBlUHJvbW90ZXI7CgogIGJvb2wgaXNEb3VibGVDb250ZXh0KERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICAvLyBBIGNvbnRleHQgaXMgYSBkb3VibGUgY29udGV4dCBpZiBkb3VibGUgaXMgYXNzaWduYWJsZSB0byBpdCBidXQgaW50IGlzCiAgICAvLyBub3QuICBUaGF0IGlzIHRoZSB0eXBlIGNvbnRleHQgaXMgYSBkb3VibGUgY29udGV4dCBpZiBpdCBpczoKICAgIC8vICAgKiBkb3VibGUKICAgIC8vICAgKiBGdXR1cmVPcjxUPiB3aGVyZSBUIGlzIGEgZG91YmxlIGNvbnRleHQKICAgIC8vCiAgICAvLyBXZSBjaGVjayBkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcgaXNBc3NpZ25hYmxlIGJlY2F1c2UgaXQncyBzaW1wbGVyLgogICAgd2hpbGUgKHR5cGVDb250ZXh0IGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICB0eXBlQ29udGV4dC5jbGFzc05vZGUgPT0gY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MgJiYKICAgICAgICB0eXBlQ29udGV4dC50eXBlQXJndW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlID0gdHlwZUNvbnRleHQ7CiAgICAgIHR5cGVDb250ZXh0ID0gdHlwZS50eXBlQXJndW1lbnRzLmZpcnN0OwogICAgfQogICAgcmV0dXJuIHR5cGVDb250ZXh0ID09IGNvcmVUeXBlcy5kb3VibGVDbGFzcy5yYXdUeXBlOwogIH0KCiAgYm9vbCBpc0Fzc2lnbmFibGUoRGFydFR5cGUgZXhwZWN0ZWRUeXBlLCBEYXJ0VHlwZSBhY3R1YWxUeXBlKSB7CiAgICByZXR1cm4gdHlwZVNjaGVtYUVudmlyb25tZW50LmlzU3VidHlwZU9mKGV4cGVjdGVkVHlwZSwgYWN0dWFsVHlwZSkgfHwKICAgICAgICB0eXBlU2NoZW1hRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoYWN0dWFsVHlwZSwgZXhwZWN0ZWRUeXBlKTsKICB9CgogIC8vLyBDaGVja3Mgd2hldGhlciBbYWN0dWFsVHlwZV0gY2FuIGJlIGFzc2lnbmVkIHRvIHRoZSBncmVhdGVzdCBjbG9zdXJlIG9mCiAgLy8vIFtleHBlY3RlZFR5cGVdLCBhbmQgaW5zZXJ0cyBhbiBpbXBsaWNpdCBkb3duY2FzdCBpZiBhcHByb3ByaWF0ZS4KICBFeHByZXNzaW9uIGVuc3VyZUFzc2lnbmFibGUoRGFydFR5cGUgZXhwZWN0ZWRUeXBlLCBEYXJ0VHlwZSBhY3R1YWxUeXBlLAogICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGludCBmaWxlT2Zmc2V0LAogICAgICB7Ym9vbCBpc1JldHVybkZyb21Bc3luYzogZmFsc2UsCiAgICAgIGJvb2wgaXNWb2lkQWxsb3dlZDogZmFsc2UsCiAgICAgIFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUsIERhcnRUeXBlKT4gdGVtcGxhdGV9KSB7CiAgICBhc3NlcnQoZXhwZWN0ZWRUeXBlICE9IG51bGwpOwogICAgZXhwZWN0ZWRUeXBlID0gZ3JlYXRlc3RDbG9zdXJlKGNvcmVUeXBlcywgZXhwZWN0ZWRUeXBlKTsKCiAgICBEYXJ0VHlwZSBpbml0aWFsRXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlOwogICAgaWYgKGlzUmV0dXJuRnJvbUFzeW5jICYmICFpc0Fzc2lnbmFibGUoZXhwZWN0ZWRUeXBlLCBhY3R1YWxUeXBlKSkgewogICAgICAvLyBJZiB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24gaXMgYXN5bmMsIHRoZSBleHBlY3RlZCByZXR1cm4gdHlwZSBoYXMgdGhlCiAgICAgIC8vIHNoYXBlIEZ1dHVyZU9yPFQ+LiAgV2UgY2hlY2sgYm90aCBicmFuY2hlcyBmb3IgRnV0dXJlT3IgaGVyZTogYm90aCBUCiAgICAgIC8vIGFuZCBGdXR1cmU8VD4uCiAgICAgIERhcnRUeXBlIHVuZnV0dXJlZEV4cGVjdGVkVHlwZSA9CiAgICAgICAgICB0eXBlU2NoZW1hRW52aXJvbm1lbnQudW5mdXR1cmVUeXBlKGV4cGVjdGVkVHlwZSk7CiAgICAgIERhcnRUeXBlIGZ1dHVyZWRFeHBlY3RlZFR5cGUgPSB3cmFwRnV0dXJlVHlwZSh1bmZ1dHVyZWRFeHBlY3RlZFR5cGUpOwogICAgICBpZiAoaXNBc3NpZ25hYmxlKHVuZnV0dXJlZEV4cGVjdGVkVHlwZSwgYWN0dWFsVHlwZSkpIHsKICAgICAgICBleHBlY3RlZFR5cGUgPSB1bmZ1dHVyZWRFeHBlY3RlZFR5cGU7CiAgICAgIH0gZWxzZSBpZiAoaXNBc3NpZ25hYmxlKGZ1dHVyZWRFeHBlY3RlZFR5cGUsIGFjdHVhbFR5cGUpKSB7CiAgICAgICAgZXhwZWN0ZWRUeXBlID0gZnV0dXJlZEV4cGVjdGVkVHlwZTsKICAgICAgfQogICAgfQoKICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gaW5zZXJ0IGFzc2lnbmFiaWxpdHkgY2hlY2tzIHdoZW4gZG9pbmcgdG9wIGxldmVsIHR5cGUKICAgIC8vIGluZmVyZW5jZSBzaW5jZSB0b3AgbGV2ZWwgdHlwZSBpbmZlcmVuY2Ugb25seSBjYXJlcyBhYm91dCB0aGUgdHlwZSB0aGF0CiAgICAvLyBpcyBpbmZlcnJlZCAodGhlIGtlcm5lbCBjb2RlIGlzIGRpc2NhcmRlZCkuCiAgICBpZiAoaXNUb3BMZXZlbCkgcmV0dXJuIG51bGw7CgogICAgLy8gSWYgYW4gaW50ZXJmYWNlIHR5cGUgaXMgYmVpbmcgYXNzaWduZWQgdG8gYSBmdW5jdGlvbiB0eXBlLCBzZWUgaWYgd2UKICAgIC8vIHNob3VsZCB0ZWFyIG9mZiBgLmNhbGxgLgogICAgLy8gVE9ETyhwYXVsYmVycnkpOiB1c2UgcmVzb2x2ZVR5cGVQYXJhbWV0ZXIuICBTZWUgZmluZEludGVyZmFjZU1lbWJlci4KICAgIGlmIChhY3R1YWxUeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgdmFyIGNsYXNzTm9kZSA9IChhY3R1YWxUeXBlIGFzIEludGVyZmFjZVR5cGUpLmNsYXNzTm9kZTsKICAgICAgdmFyIGNhbGxNZW1iZXIgPSBjbGFzc0hpZXJhcmNoeS5nZXRJbnRlcmZhY2VNZW1iZXIoY2xhc3NOb2RlLCBjYWxsTmFtZSk7CiAgICAgIGlmIChjYWxsTWVtYmVyIGlzIFByb2NlZHVyZSAmJiBjYWxsTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5NZXRob2QpIHsKICAgICAgICBpZiAoX3Nob3VsZFRlYXJPZmZDYWxsKGV4cGVjdGVkVHlwZSwgYWN0dWFsVHlwZSkpIHsKICAgICAgICAgIC8vIFJlcGxhY2UgZXhwcmVzc2lvbiB3aXRoOgogICAgICAgICAgLy8gYGxldCB0ID0gZXhwcmVzc2lvbiBpbiB0ID09IG51bGwgPyBudWxsIDogdC5jYWxsYAogICAgICAgICAgdmFyIHBhcmVudCA9IGV4cHJlc3Npb24ucGFyZW50OwogICAgICAgICAgdmFyIHQgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZShleHByZXNzaW9uLCB0eXBlOiBhY3R1YWxUeXBlKQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICAgICAgdmFyIG51bGxDaGVjayA9IGJ1aWxkSXNOdWxsKG5ldyBWYXJpYWJsZUdldCh0KSwgZmlsZU9mZnNldCwgaGVscGVyKTsKICAgICAgICAgIHZhciB0ZWFyT2ZmID0KICAgICAgICAgICAgICBuZXcgUHJvcGVydHlHZXQobmV3IFZhcmlhYmxlR2V0KHQpLCBjYWxsTmFtZSwgY2FsbE1lbWJlcikKICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgICAgICBhY3R1YWxUeXBlID0gZ2V0Q2FsbGVlVHlwZShjYWxsTWVtYmVyLCBhY3R1YWxUeXBlKTsKICAgICAgICAgIHZhciBjb25kaXRpb25hbCA9IG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24obnVsbENoZWNrLAogICAgICAgICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwgdGVhck9mZiwgYWN0dWFsVHlwZSk7CiAgICAgICAgICB2YXIgbGV0ID0gbmV3IExldCh0LCBjb25kaXRpb25hbCkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICAgICAgcGFyZW50Py5yZXBsYWNlQ2hpbGQoZXhwcmVzc2lvbiwgbGV0KTsKICAgICAgICAgIGV4cHJlc3Npb24gPSBsZXQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGFjdHVhbFR5cGUgaXMgVm9pZFR5cGUgJiYgIWlzVm9pZEFsbG93ZWQpIHsKICAgICAgLy8gRXJyb3I6IG5vdCBhc3NpZ25hYmxlLiAgUGVyZm9ybSBlcnJvciByZWNvdmVyeS4KICAgICAgVHJlZU5vZGUgcGFyZW50ID0gZXhwcmVzc2lvbi5wYXJlbnQ7CiAgICAgIEV4cHJlc3Npb24gZXJyb3JOb2RlID0KICAgICAgICAgIGhlbHBlci53cmFwSW5Qcm9ibGVtKGV4cHJlc3Npb24sIG1lc3NhZ2VWb2lkRXhwcmVzc2lvbiwgbm9MZW5ndGgpOwogICAgICBwYXJlbnQ/LnJlcGxhY2VDaGlsZChleHByZXNzaW9uLCBlcnJvck5vZGUpOwogICAgICByZXR1cm4gZXJyb3JOb2RlOwogICAgfQoKICAgIGlmIChleHBlY3RlZFR5cGUgPT0gbnVsbCB8fAogICAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihhY3R1YWxUeXBlLCBleHBlY3RlZFR5cGUpKSB7CiAgICAgIC8vIFR5cGVzIGFyZSBjb21wYXRpYmxlLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZiAoIXR5cGVTY2hlbWFFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihleHBlY3RlZFR5cGUsIGFjdHVhbFR5cGUpKSB7CiAgICAgIC8vIEVycm9yOiBub3QgYXNzaWduYWJsZS4gIFBlcmZvcm0gZXJyb3IgcmVjb3ZlcnkuCiAgICAgIHZhciBwYXJlbnQgPSBleHByZXNzaW9uLnBhcmVudDsKICAgICAgRXhwcmVzc2lvbiBlcnJvck5vZGUgPSBuZXcgQXNFeHByZXNzaW9uKAogICAgICAgICAgZXhwcmVzc2lvbiwKICAgICAgICAgIC8vIFRPRE8oYWhlKTogVGhlIG91dGxpbmUgcGhhc2UgZG9lc24ndCBjb3JyZWN0bHkgcmVtb3ZlIGludmFsaWQKICAgICAgICAgIC8vIHVzZXMgb2YgdHlwZSB2YXJpYWJsZXMsIGZvciBleGFtcGxlLCBvbiBzdGF0aWMgbWVtYmVycy4gT25jZQogICAgICAgICAgLy8gdGhhdCBoYXMgYmVlbiBmaXhlZCwgd2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIHVzZQogICAgICAgICAgLy8gW2V4cGVjdGVkVHlwZV0gZGlyZWN0bHkgaGVyZS4KICAgICAgICAgIGhhc0FueVR5cGVWYXJpYWJsZXMoZXhwZWN0ZWRUeXBlKSA/IGNvbnN0IEJvdHRvbVR5cGUoKSA6IGV4cGVjdGVkVHlwZSkKICAgICAgICAuLmlzVHlwZUVycm9yID0gdHJ1ZQogICAgICAgIC4uZmlsZU9mZnNldCA9IGV4cHJlc3Npb24uZmlsZU9mZnNldDsKICAgICAgaWYgKGV4cGVjdGVkVHlwZSBpcyEgSW52YWxpZFR5cGUgJiYgYWN0dWFsVHlwZSBpcyEgSW52YWxpZFR5cGUpIHsKICAgICAgICBlcnJvck5vZGUgPSBoZWxwZXIud3JhcEluUHJvYmxlbSgKICAgICAgICAgICAgZXJyb3JOb2RlLAogICAgICAgICAgICAodGVtcGxhdGUgPz8gdGVtcGxhdGVJbnZhbGlkQXNzaWdubWVudCkKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGFjdHVhbFR5cGUsIGV4cGVjdGVkVHlwZSksCiAgICAgICAgICAgIG5vTGVuZ3RoKTsKICAgICAgfQogICAgICBwYXJlbnQ/LnJlcGxhY2VDaGlsZChleHByZXNzaW9uLCBlcnJvck5vZGUpOwogICAgICByZXR1cm4gZXJyb3JOb2RlOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHRlbXBsYXRlID0gX2dldFByZWNpc2VUeXBlRXJyb3JUZW1wbGF0ZShleHByZXNzaW9uKTsKICAgICAgaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKICAgICAgICAvLyBUaGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyBrbm93biBwcmVjaXNlbHksIHNvIGFuIGltcGxpY2l0CiAgICAgICAgLy8gZG93bmNhc3QgaXMgZ3VhcmFudGVlZCB0byBmYWlsLiAgSW5zZXJ0IGEgY29tcGlsZS10aW1lIGVycm9yLgogICAgICAgIHZhciBwYXJlbnQgPSBleHByZXNzaW9uLnBhcmVudDsKICAgICAgICB2YXIgZXJyb3JOb2RlID0gaGVscGVyLndyYXBJblByb2JsZW0oZXhwcmVzc2lvbiwKICAgICAgICAgICAgdGVtcGxhdGUud2l0aEFyZ3VtZW50cyhhY3R1YWxUeXBlLCBleHBlY3RlZFR5cGUpLCBub0xlbmd0aCk7CiAgICAgICAgcGFyZW50Py5yZXBsYWNlQ2hpbGQoZXhwcmVzc2lvbiwgZXJyb3JOb2RlKTsKICAgICAgICByZXR1cm4gZXJyb3JOb2RlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEluc2VydCBhbiBpbXBsaWNpdCBkb3duY2FzdC4KICAgICAgICB2YXIgcGFyZW50ID0gZXhwcmVzc2lvbi5wYXJlbnQ7CiAgICAgICAgdmFyIHR5cGVDaGVjayA9IG5ldyBBc0V4cHJlc3Npb24oZXhwcmVzc2lvbiwgaW5pdGlhbEV4cGVjdGVkVHlwZSkKICAgICAgICAgIC4uaXNUeXBlRXJyb3IgPSB0cnVlCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICAgIHBhcmVudD8ucmVwbGFjZUNoaWxkKGV4cHJlc3Npb24sIHR5cGVDaGVjayk7CiAgICAgICAgcmV0dXJuIHR5cGVDaGVjazsKICAgICAgfQogICAgfQogIH0KCiAgYm9vbCBpc051bGwoRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiB0eXBlLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMubnVsbENsYXNzOwogIH0KCiAgLy8vIEZpbmRzIGEgbWVtYmVyIG9mIFtyZWNlaXZlclR5cGVdIGNhbGxlZCBbbmFtZV0sIGFuZCBpZiBpdCBpcyBmb3VuZCwKICAvLy8gcmVwb3J0cyBpdCB0aHJvdWdoIGluc3RydW1lbnRhdGlvbiB1c2luZyBbZmlsZU9mZnNldF0uCiAgLy8vCiAgLy8vIEZvciB0aGUgY2FzZSB3aGVyZSBbcmVjZWl2ZXJUeXBlXSBpcyBhIFtGdW5jdGlvblR5cGVdLCBhbmQgdGhlIG5hbWUKICAvLy8gaXMgYGNhbGxgLCB0aGUgc3RyaW5nICdjYWxsJyBpcyByZXR1cm5lZCBhcyBhIHNlbnRpbmVsIG9iamVjdC4KICAvLy8KICAvLy8gRm9yIHRoZSBjYXNlIHdoZXJlIFtyZWNlaXZlclR5cGVdIGlzIGBkeW5hbWljYCwgYW5kIHRoZSBuYW1lIGlzIGRlY2xhcmVkCiAgLy8vIGluIE9iamVjdCwgdGhlIG1lbWJlciBmcm9tIE9iamVjdCBpcyByZXR1cm5lZCB0aG91Z2ggdGhlIGNhbGwgbWF5IG5vdCBlbmQKICAvLy8gdXAgdGFyZ2V0aW5nIGl0IGlmIHRoZSBhcmd1bWVudHMgZG8gbm90IG1hdGNoICh0aGUgYmFzaWMgcHJpbmNpcGxlIGlzIHRoYXQKICAvLy8gdGhlIE9iamVjdCBtZW1iZXIgaXMgdXNlZCBmb3IgaW5mZXJyaW5nIHR5cGVzIG9ubHkgaWYgbm9TdWNoTWV0aG9kIGNhbm5vdAogIC8vLyBiZSB0YXJnZXRlZCBkdWUgdG8sIGUuZy4sIGFuIGluY29ycmVjdCBhcmd1bWVudCBjb3VudCkuCiAgT2JqZWN0IGZpbmRJbnRlcmZhY2VNZW1iZXIoRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBOYW1lIG5hbWUsIGludCBmaWxlT2Zmc2V0LAogICAgICB7VGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcsIERhcnRUeXBlKT4gZXJyb3JUZW1wbGF0ZSwKICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBib29sIHNldHRlcjogZmFsc2UsCiAgICAgIGJvb2wgaW5zdHJ1bWVudGVkOiB0cnVlfSkgewogICAgYXNzZXJ0KHJlY2VpdmVyVHlwZSAhPSBudWxsICYmIGlzS25vd24ocmVjZWl2ZXJUeXBlKSk7CgogICAgcmVjZWl2ZXJUeXBlID0gcmVzb2x2ZVR5cGVQYXJhbWV0ZXIocmVjZWl2ZXJUeXBlKTsKCiAgICBpZiAocmVjZWl2ZXJUeXBlIGlzIEZ1bmN0aW9uVHlwZSAmJiBuYW1lLm5hbWUgPT0gJ2NhbGwnKSB7CiAgICAgIHJldHVybiAnY2FsbCc7CiAgICB9CgogICAgQ2xhc3MgY2xhc3NOb2RlID0gcmVjZWl2ZXJUeXBlIGlzIEludGVyZmFjZVR5cGUKICAgICAgICA/IHJlY2VpdmVyVHlwZS5jbGFzc05vZGUKICAgICAgICA6IGNvcmVUeXBlcy5vYmplY3RDbGFzczsKICAgIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIgPQogICAgICAgIF9nZXRJbnRlcmZhY2VNZW1iZXIoY2xhc3NOb2RlLCBuYW1lLCBzZXR0ZXIsIGZpbGVPZmZzZXQpOwogICAgaWYgKGluc3RydW1lbnRlZCAmJgogICAgICAgIHJlY2VpdmVyVHlwZSAhPSBjb25zdCBEeW5hbWljVHlwZSgpICYmCiAgICAgICAgaW50ZXJmYWNlTWVtYmVyICE9IG51bGwpIHsKICAgICAgaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQodXJpLCBmaWxlT2Zmc2V0LCAndGFyZ2V0JywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihpbnRlcmZhY2VNZW1iZXIpKTsKICAgIH0KCiAgICBpZiAoIWlzVG9wTGV2ZWwgJiYKICAgICAgICBpbnRlcmZhY2VNZW1iZXIgPT0gbnVsbCAmJgogICAgICAgIHJlY2VpdmVyVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICByZWNlaXZlclR5cGUgaXMhIEludmFsaWRUeXBlICYmCiAgICAgICAgIShyZWNlaXZlclR5cGUgPT0gY29yZVR5cGVzLmZ1bmN0aW9uQ2xhc3MucmF3VHlwZSAmJgogICAgICAgICAgICBuYW1lLm5hbWUgPT0gJ2NhbGwnKSAmJgogICAgICAgIGVycm9yVGVtcGxhdGUgIT0gbnVsbCkgewogICAgICBpbnQgbGVuZ3RoID0gbmFtZS5uYW1lLmxlbmd0aDsKICAgICAgaWYgKGlkZW50aWNhbChuYW1lLm5hbWUsIGNhbGxOYW1lLm5hbWUpIHx8CiAgICAgICAgICBpZGVudGljYWwobmFtZS5uYW1lLCB1bmFyeU1pbnVzTmFtZS5uYW1lKSkgewogICAgICAgIGxlbmd0aCA9IDE7CiAgICAgIH0KICAgICAgZXhwcmVzc2lvbi5wYXJlbnQucmVwbGFjZUNoaWxkKAogICAgICAgICAgZXhwcmVzc2lvbiwKICAgICAgICAgIGhlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihoZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgIGVycm9yVGVtcGxhdGUud2l0aEFyZ3VtZW50cyhuYW1lLm5hbWUsIHJlY2VpdmVyVHlwZSksCiAgICAgICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgICAgICBsZW5ndGgpKSk7CiAgICB9CiAgICByZXR1cm4gaW50ZXJmYWNlTWVtYmVyOwogIH0KCiAgLy8vIEZpbmRzIGEgbWVtYmVyIG9mIFtyZWNlaXZlclR5cGVdIGNhbGxlZCBbbmFtZV0gYW5kIHJlY29yZHMgaXQgaW4KICAvLy8gW21ldGhvZEludm9jYXRpb25dLgogIE9iamVjdCBmaW5kTWV0aG9kSW52b2NhdGlvbk1lbWJlcigKICAgICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBJbnZvY2F0aW9uRXhwcmVzc2lvbiBtZXRob2RJbnZvY2F0aW9uLAogICAgICB7Ym9vbCBpbnN0cnVtZW50ZWQ6IHRydWV9KSB7CiAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGNvdWxkIHdlIGFkZCBnZXR0ZXJzIHRvIEludm9jYXRpb25FeHByZXNzaW9uIHRvIG1ha2UKICAgIC8vIHRoZXNlIGlzLWNoZWNrcyB1bm5lY2Vzc2FyeT8KICAgIGlmIChtZXRob2RJbnZvY2F0aW9uIGlzIE1ldGhvZEludm9jYXRpb24pIHsKICAgICAgdmFyIGludGVyZmFjZU1lbWJlciA9IGZpbmRJbnRlcmZhY2VNZW1iZXIoCiAgICAgICAgICByZWNlaXZlclR5cGUsIG1ldGhvZEludm9jYXRpb24ubmFtZSwgbWV0aG9kSW52b2NhdGlvbi5maWxlT2Zmc2V0LAogICAgICAgICAgZXJyb3JUZW1wbGF0ZTogdGVtcGxhdGVVbmRlZmluZWRNZXRob2QsCiAgICAgICAgICBleHByZXNzaW9uOiBtZXRob2RJbnZvY2F0aW9uLAogICAgICAgICAgcmVjZWl2ZXI6IG1ldGhvZEludm9jYXRpb24ucmVjZWl2ZXIsCiAgICAgICAgICBpbnN0cnVtZW50ZWQ6IGluc3RydW1lbnRlZCk7CiAgICAgIGlmIChyZWNlaXZlclR5cGUgPT0gY29uc3QgRHluYW1pY1R5cGUoKSAmJiBpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgdmFyIGFyZ3VtZW50cyA9IG1ldGhvZEludm9jYXRpb24uYXJndW1lbnRzOwogICAgICAgIHZhciBzaWduYXR1cmUgPSBpbnRlcmZhY2VNZW1iZXIuZnVuY3Rpb247CiAgICAgICAgaWYgKGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA8IHNpZ25hdHVyZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50IHx8CiAgICAgICAgICAgIGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA+CiAgICAgICAgICAgICAgICBzaWduYXR1cmUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgYXJndW1lbnQgaW4gYXJndW1lbnRzLm5hbWVkKSB7CiAgICAgICAgICBpZiAoIXNpZ25hdHVyZS5uYW1lZFBhcmFtZXRlcnMKICAgICAgICAgICAgICAuYW55KChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24ubmFtZSA9PSBhcmd1bWVudC5uYW1lKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGluc3RydW1lbnRlZCAmJiBpbnN0cnVtZW50YXRpb24gIT0gbnVsbCkgewogICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJlY29yZCh1cmksIG1ldGhvZEludm9jYXRpb24uZmlsZU9mZnNldCwgJ3RhcmdldCcsCiAgICAgICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyKGludGVyZmFjZU1lbWJlcikpOwogICAgICAgIH0KICAgICAgICBtZXRob2RJbnZvY2F0aW9uLmludGVyZmFjZVRhcmdldCA9IGludGVyZmFjZU1lbWJlcjsKICAgICAgfSBlbHNlIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgTWVtYmVyKSB7CiAgICAgICAgbWV0aG9kSW52b2NhdGlvbi5pbnRlcmZhY2VUYXJnZXQgPSBpbnRlcmZhY2VNZW1iZXI7CiAgICAgIH0KICAgICAgcmV0dXJuIGludGVyZmFjZU1lbWJlcjsKICAgIH0gZWxzZSBpZiAobWV0aG9kSW52b2NhdGlvbiBpcyBTdXBlck1ldGhvZEludm9jYXRpb24pIHsKICAgICAgYXNzZXJ0KHJlY2VpdmVyVHlwZSAhPSBjb25zdCBEeW5hbWljVHlwZSgpKTsKICAgICAgdmFyIGludGVyZmFjZU1lbWJlciA9IGZpbmRJbnRlcmZhY2VNZW1iZXIoCiAgICAgICAgICByZWNlaXZlclR5cGUsIG1ldGhvZEludm9jYXRpb24ubmFtZSwgbWV0aG9kSW52b2NhdGlvbi5maWxlT2Zmc2V0LAogICAgICAgICAgaW5zdHJ1bWVudGVkOiBpbnN0cnVtZW50ZWQpOwogICAgICBpZiAoaW50ZXJmYWNlTWVtYmVyIGlzIE1lbWJlcikgewogICAgICAgIG1ldGhvZEludm9jYXRpb24uaW50ZXJmYWNlVGFyZ2V0ID0gaW50ZXJmYWNlTWVtYmVyOwogICAgICB9CiAgICAgIHJldHVybiBpbnRlcmZhY2VNZW1iZXI7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyB1bmhhbmRsZWQoIiR7bWV0aG9kSW52b2NhdGlvbi5ydW50aW1lVHlwZX0iLAogICAgICAgICAgImZpbmRNZXRob2RJbnZvY2F0aW9uTWVtYmVyIiwgbWV0aG9kSW52b2NhdGlvbi5maWxlT2Zmc2V0LCB1cmkpOwogICAgfQogIH0KCiAgLy8vIEZpbmRzIGEgbWVtYmVyIG9mIFtyZWNlaXZlclR5cGVdIGNhbGxlZCBbbmFtZV0sIGFuZCBpZiBpdCBpcyBmb3VuZCwKICAvLy8gcmVwb3J0cyBpdCB0aHJvdWdoIGluc3RydW1lbnRhdGlvbiBhbmQgcmVjb3JkcyBpdCBpbiBbcHJvcGVydHlHZXRdLgogIE9iamVjdCBmaW5kUHJvcGVydHlHZXRNZW1iZXIoRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBFeHByZXNzaW9uIHByb3BlcnR5R2V0LAogICAgICB7Ym9vbCBpbnN0cnVtZW50ZWQ6IHRydWV9KSB7CiAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGNvdWxkIHdlIGFkZCBhIGNvbW1vbiBiYXNlIGNsYXNzIHRvIFByb3BlcnR5R2V0IGFuZAogICAgLy8gU3VwZXJQcm9wZXJ0eUdldCB0byBtYWtlIHRoZXNlIGlzLWNoZWNrcyB1bm5lY2Vzc2FyeT8KICAgIGlmIChwcm9wZXJ0eUdldCBpcyBQcm9wZXJ0eUdldCkgewogICAgICB2YXIgaW50ZXJmYWNlTWVtYmVyID0gZmluZEludGVyZmFjZU1lbWJlcigKICAgICAgICAgIHJlY2VpdmVyVHlwZSwgcHJvcGVydHlHZXQubmFtZSwgcHJvcGVydHlHZXQuZmlsZU9mZnNldCwKICAgICAgICAgIGVycm9yVGVtcGxhdGU6IHRlbXBsYXRlVW5kZWZpbmVkR2V0dGVyLAogICAgICAgICAgZXhwcmVzc2lvbjogcHJvcGVydHlHZXQsCiAgICAgICAgICByZWNlaXZlcjogcHJvcGVydHlHZXQucmVjZWl2ZXIsCiAgICAgICAgICBpbnN0cnVtZW50ZWQ6IGluc3RydW1lbnRlZCk7CiAgICAgIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgTWVtYmVyKSB7CiAgICAgICAgaWYgKGluc3RydW1lbnRlZCAmJgogICAgICAgICAgICBpbnN0cnVtZW50YXRpb24gIT0gbnVsbCAmJgogICAgICAgICAgICByZWNlaXZlclR5cGUgPT0gY29uc3QgRHluYW1pY1R5cGUoKSkgewogICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJlY29yZCh1cmksIHByb3BlcnR5R2V0LmZpbGVPZmZzZXQsICd0YXJnZXQnLAogICAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihpbnRlcmZhY2VNZW1iZXIpKTsKICAgICAgICB9CiAgICAgICAgcHJvcGVydHlHZXQuaW50ZXJmYWNlVGFyZ2V0ID0gaW50ZXJmYWNlTWVtYmVyOwogICAgICB9CiAgICAgIHJldHVybiBpbnRlcmZhY2VNZW1iZXI7CiAgICB9IGVsc2UgaWYgKHByb3BlcnR5R2V0IGlzIFN1cGVyUHJvcGVydHlHZXQpIHsKICAgICAgYXNzZXJ0KHJlY2VpdmVyVHlwZSAhPSBjb25zdCBEeW5hbWljVHlwZSgpKTsKICAgICAgdmFyIGludGVyZmFjZU1lbWJlciA9IGZpbmRJbnRlcmZhY2VNZW1iZXIoCiAgICAgICAgICByZWNlaXZlclR5cGUsIHByb3BlcnR5R2V0Lm5hbWUsIHByb3BlcnR5R2V0LmZpbGVPZmZzZXQsCiAgICAgICAgICBpbnN0cnVtZW50ZWQ6IGluc3RydW1lbnRlZCk7CiAgICAgIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgTWVtYmVyKSB7CiAgICAgICAgcHJvcGVydHlHZXQuaW50ZXJmYWNlVGFyZ2V0ID0gaW50ZXJmYWNlTWVtYmVyOwogICAgICB9CiAgICAgIHJldHVybiBpbnRlcmZhY2VNZW1iZXI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdW5oYW5kbGVkKCIke3Byb3BlcnR5R2V0LnJ1bnRpbWVUeXBlfSIsICJmaW5kUHJvcGVydHlHZXRNZW1iZXIiLAogICAgICAgICAgcHJvcGVydHlHZXQuZmlsZU9mZnNldCwgdXJpKTsKICAgIH0KICB9CgogIC8vLyBGaW5kcyBhIG1lbWJlciBvZiBbcmVjZWl2ZXJUeXBlXSBjYWxsZWQgW25hbWVdLCBhbmQgaWYgaXQgaXMgZm91bmQsCiAgLy8vIHJlcG9ydHMgaXQgdGhyb3VnaCBpbnN0cnVtZW50YXRpb24gYW5kIHJlY29yZHMgaXQgaW4gW3Byb3BlcnR5U2V0XS4KICBPYmplY3QgZmluZFByb3BlcnR5U2V0TWVtYmVyKERhcnRUeXBlIHJlY2VpdmVyVHlwZSwgRXhwcmVzc2lvbiBwcm9wZXJ0eVNldCwKICAgICAge2Jvb2wgaW5zdHJ1bWVudGVkOiB0cnVlfSkgewogICAgaWYgKHByb3BlcnR5U2V0IGlzIFByb3BlcnR5U2V0KSB7CiAgICAgIHZhciBpbnRlcmZhY2VNZW1iZXIgPSBmaW5kSW50ZXJmYWNlTWVtYmVyKAogICAgICAgICAgcmVjZWl2ZXJUeXBlLCBwcm9wZXJ0eVNldC5uYW1lLCBwcm9wZXJ0eVNldC5maWxlT2Zmc2V0LAogICAgICAgICAgZXJyb3JUZW1wbGF0ZTogdGVtcGxhdGVVbmRlZmluZWRTZXR0ZXIsCiAgICAgICAgICBleHByZXNzaW9uOiBwcm9wZXJ0eVNldCwKICAgICAgICAgIHJlY2VpdmVyOiBwcm9wZXJ0eVNldC5yZWNlaXZlciwKICAgICAgICAgIHNldHRlcjogdHJ1ZSwKICAgICAgICAgIGluc3RydW1lbnRlZDogaW5zdHJ1bWVudGVkKTsKICAgICAgaWYgKGludGVyZmFjZU1lbWJlciBpcyBNZW1iZXIpIHsKICAgICAgICBpZiAoaW5zdHJ1bWVudGVkICYmCiAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbiAhPSBudWxsICYmCiAgICAgICAgICAgIHJlY2VpdmVyVHlwZSA9PSBjb25zdCBEeW5hbWljVHlwZSgpKSB7CiAgICAgICAgICBpbnN0cnVtZW50YXRpb24ucmVjb3JkKHVyaSwgcHJvcGVydHlTZXQuZmlsZU9mZnNldCwgJ3RhcmdldCcsCiAgICAgICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyKGludGVyZmFjZU1lbWJlcikpOwogICAgICAgIH0KICAgICAgICBwcm9wZXJ0eVNldC5pbnRlcmZhY2VUYXJnZXQgPSBpbnRlcmZhY2VNZW1iZXI7CiAgICAgIH0KICAgICAgcmV0dXJuIGludGVyZmFjZU1lbWJlcjsKICAgIH0gZWxzZSBpZiAocHJvcGVydHlTZXQgaXMgU3VwZXJQcm9wZXJ0eVNldCkgewogICAgICBhc3NlcnQocmVjZWl2ZXJUeXBlICE9IGNvbnN0IER5bmFtaWNUeXBlKCkpOwogICAgICB2YXIgaW50ZXJmYWNlTWVtYmVyID0gZmluZEludGVyZmFjZU1lbWJlcigKICAgICAgICAgIHJlY2VpdmVyVHlwZSwgcHJvcGVydHlTZXQubmFtZSwgcHJvcGVydHlTZXQuZmlsZU9mZnNldCwKICAgICAgICAgIHNldHRlcjogdHJ1ZSwgaW5zdHJ1bWVudGVkOiBpbnN0cnVtZW50ZWQpOwogICAgICBpZiAoaW50ZXJmYWNlTWVtYmVyIGlzIE1lbWJlcikgewogICAgICAgIHByb3BlcnR5U2V0LmludGVyZmFjZVRhcmdldCA9IGludGVyZmFjZU1lbWJlcjsKICAgICAgfQogICAgICByZXR1cm4gaW50ZXJmYWNlTWVtYmVyOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgdW5oYW5kbGVkKCIke3Byb3BlcnR5U2V0LnJ1bnRpbWVUeXBlfSIsICJmaW5kUHJvcGVydHlTZXRNZW1iZXIiLAogICAgICAgICAgcHJvcGVydHlTZXQuZmlsZU9mZnNldCwgdXJpKTsKICAgIH0KICB9CgogIEZ1bmN0aW9uVHlwZSBnZXRDYWxsZWVGdW5jdGlvblR5cGUoRGFydFR5cGUgY2FsbGVlVHlwZSwgYm9vbCBmb2xsb3dDYWxsKSB7CiAgICBpZiAoY2FsbGVlVHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgcmV0dXJuIGNhbGxlZVR5cGU7CiAgICB9IGVsc2UgaWYgKGZvbGxvd0NhbGwgJiYgY2FsbGVlVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIHZhciBtZW1iZXIgPQogICAgICAgICAgX2dldEludGVyZmFjZU1lbWJlcihjYWxsZWVUeXBlLmNsYXNzTm9kZSwgY2FsbE5hbWUsIGZhbHNlLCAtMSk7CiAgICAgIHZhciBjYWxsVHlwZSA9IGdldENhbGxlZVR5cGUobWVtYmVyLCBjYWxsZWVUeXBlKTsKICAgICAgaWYgKGNhbGxUeXBlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICAgIHJldHVybiBjYWxsVHlwZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHVua25vd25GdW5jdGlvbjsKICB9CgogIERhcnRUeXBlIGdldENhbGxlZVR5cGUoT2JqZWN0IGludGVyZmFjZU1lbWJlciwgRGFydFR5cGUgcmVjZWl2ZXJUeXBlKSB7CiAgICBpZiAoaWRlbnRpY2FsKGludGVyZmFjZU1lbWJlciwgJ2NhbGwnKSkgewogICAgICByZXR1cm4gcmVjZWl2ZXJUeXBlOwogICAgfSBlbHNlIGlmIChpbnRlcmZhY2VNZW1iZXIgPT0gbnVsbCkgewogICAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0gZWxzZSBpZiAoaW50ZXJmYWNlTWVtYmVyIGlzIE1lbWJlcikgewogICAgICB2YXIgbWVtYmVyQ2xhc3MgPSBpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIERhcnRUeXBlIGNhbGxlZVR5cGU7CiAgICAgIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgaWYgKGludGVyZmFjZU1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuR2V0dGVyKSB7CiAgICAgICAgICBjYWxsZWVUeXBlID0gaW50ZXJmYWNlTWVtYmVyLmZ1bmN0aW9uLnJldHVyblR5cGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNhbGxlZVR5cGUgPSBpbnRlcmZhY2VNZW1iZXIuZnVuY3Rpb24uZnVuY3Rpb25UeXBlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgRmllbGQpIHsKICAgICAgICBjYWxsZWVUeXBlID0gaW50ZXJmYWNlTWVtYmVyLnR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgdW5oYW5kbGVkKGludGVyZmFjZU1lbWJlci5ydW50aW1lVHlwZS50b1N0cmluZygpLCAnZ2V0Q2FsbGVlVHlwZScsCiAgICAgICAgICAgIG51bGwsIG51bGwpOwogICAgICB9CiAgICAgIGlmIChtZW1iZXJDbGFzcy50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgcmVjZWl2ZXJUeXBlID0gcmVzb2x2ZVR5cGVQYXJhbWV0ZXIocmVjZWl2ZXJUeXBlKTsKICAgICAgICBpZiAocmVjZWl2ZXJUeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICAgIHZhciBjYXN0ZWRUeXBlID0KICAgICAgICAgICAgICBjbGFzc0hpZXJhcmNoeS5nZXRUeXBlQXNJbnN0YW5jZU9mKHJlY2VpdmVyVHlwZSwgbWVtYmVyQ2xhc3MpOwogICAgICAgICAgY2FsbGVlVHlwZSA9IFN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZShjYXN0ZWRUeXBlKQogICAgICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZShjYWxsZWVUeXBlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGNhbGxlZVR5cGU7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyB1bmhhbmRsZWQoCiAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIucnVudGltZVR5cGUudG9TdHJpbmcoKSwgJ2dldENhbGxlZVR5cGUnLCBudWxsLCBudWxsKTsKICAgIH0KICB9CgogIERhcnRUeXBlIGdldERlcml2ZWRUeXBlQXJndW1lbnRPZihEYXJ0VHlwZSB0eXBlLCBDbGFzcyBjbGFzc18pIHsKICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgdmFyIHR5cGVBc0luc3RhbmNlT2ZDbGFzcyA9CiAgICAgICAgICBjbGFzc0hpZXJhcmNoeS5nZXRUeXBlQXNJbnN0YW5jZU9mKHR5cGUsIGNsYXNzXyk7CiAgICAgIGlmICh0eXBlQXNJbnN0YW5jZU9mQ2xhc3MgIT0gbnVsbCkgewogICAgICAgIHJldHVybiB0eXBlQXNJbnN0YW5jZU9mQ2xhc3MudHlwZUFyZ3VtZW50c1swXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8gR2V0cyB0aGUgaW5pdGlhbGl6ZXIgZm9yIHRoZSBnaXZlbiBbZmllbGRdLCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8KICAvLy8gaW5pdGlhbGl6ZXIuCiAgRXhwcmVzc2lvbiBnZXRGaWVsZEluaXRpYWxpemVyKEZpZWxkIGZpZWxkKTsKCiAgLy8vIElmIHRoZSBbbWVtYmVyXSBpcyBhIGZvcndhcmRpbmcgc3R1YiwgcmV0dXJuIHRoZSB0YXJnZXQgaXQgZm9yd2FyZHMgdG8uCiAgLy8vIE90aGVyd2lzZSByZXR1cm4gdGhlIGdpdmVuIFttZW1iZXJdLgogIE1lbWJlciBnZXRSZWFsVGFyZ2V0KE1lbWJlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlICYmIG1lbWJlci5pc0ZvcndhcmRpbmdTdHViKSB7CiAgICAgIHJldHVybiBtZW1iZXIuZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXQ7CiAgICB9CiAgICByZXR1cm4gbWVtYmVyOwogIH0KCiAgRGFydFR5cGUgZ2V0U2V0dGVyVHlwZShPYmplY3QgaW50ZXJmYWNlTWVtYmVyLCBEYXJ0VHlwZSByZWNlaXZlclR5cGUpIHsKICAgIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIHJldHVybiBpbnRlcmZhY2VNZW1iZXI7CiAgICB9IGVsc2UgaWYgKGludGVyZmFjZU1lbWJlciA9PSBudWxsKSB7CiAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfSBlbHNlIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgTWVtYmVyKSB7CiAgICAgIHZhciBtZW1iZXJDbGFzcyA9IGludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgICAgRGFydFR5cGUgc2V0dGVyVHlwZTsKICAgICAgaWYgKGludGVyZmFjZU1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgICBhc3NlcnQoaW50ZXJmYWNlTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXIpOwogICAgICAgIHZhciBzZXR0ZXJQYXJhbWV0ZXJzID0gaW50ZXJmYWNlTWVtYmVyLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgICAgIHNldHRlclR5cGUgPSBzZXR0ZXJQYXJhbWV0ZXJzLmxlbmd0aCA+IDAKICAgICAgICAgICAgPyBzZXR0ZXJQYXJhbWV0ZXJzWzBdLnR5cGUKICAgICAgICAgICAgOiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICB9IGVsc2UgaWYgKGludGVyZmFjZU1lbWJlciBpcyBGaWVsZCkgewogICAgICAgIHNldHRlclR5cGUgPSBpbnRlcmZhY2VNZW1iZXIudHlwZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyB1bmhhbmRsZWQoaW50ZXJmYWNlTWVtYmVyLnJ1bnRpbWVUeXBlLnRvU3RyaW5nKCksICdnZXRTZXR0ZXJUeXBlJywKICAgICAgICAgICAgbnVsbCwgbnVsbCk7CiAgICAgIH0KICAgICAgaWYgKG1lbWJlckNsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICByZWNlaXZlclR5cGUgPSByZXNvbHZlVHlwZVBhcmFtZXRlcihyZWNlaXZlclR5cGUpOwogICAgICAgIGlmIChyZWNlaXZlclR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgdmFyIGNhc3RlZFR5cGUgPQogICAgICAgICAgICAgIGNsYXNzSGllcmFyY2h5LmdldFR5cGVBc0luc3RhbmNlT2YocmVjZWl2ZXJUeXBlLCBtZW1iZXJDbGFzcyk7CiAgICAgICAgICBzZXR0ZXJUeXBlID0gU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKGNhc3RlZFR5cGUpCiAgICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHNldHRlclR5cGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc2V0dGVyVHlwZTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IHVuaGFuZGxlZCgKICAgICAgICAgIGludGVyZmFjZU1lbWJlci5ydW50aW1lVHlwZS50b1N0cmluZygpLCAnZ2V0U2V0dGVyVHlwZScsIG51bGwsIG51bGwpOwogICAgfQogIH0KCiAgRGFydFR5cGUgZ2V0VHlwZUFyZ3VtZW50T2YoRGFydFR5cGUgdHlwZSwgQ2xhc3MgY2xhc3NfKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmIGlkZW50aWNhbCh0eXBlLmNsYXNzTm9kZSwgY2xhc3NfKSkgewogICAgICByZXR1cm4gdHlwZS50eXBlQXJndW1lbnRzWzBdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGNvbnN0IFVua25vd25UeXBlKCk7CiAgICB9CiAgfQoKICAvLy8gQWRkcyBhbiAiYXMiIGNoZWNrIHRvIGEgW01ldGhvZEludm9jYXRpb25dIGlmIG5lY2Vzc2FyeSBkdWUgdG8KICAvLy8gY29udHJhdmFyaWFuY2UuCiAgLy8vCiAgLy8vIFRoZSByZXR1cm5lZCBleHByZXNzaW9uIGlzIHRoZSBbQXNFeHByZXNzaW9uXSwgaWYgb25lIHdhcyBhZGRlZDsgb3RoZXJ3aXNlCiAgLy8vIGl0IGlzIHRoZSBbTWV0aG9kSW52b2NhdGlvbl0uCiAgRXhwcmVzc2lvbiBoYW5kbGVJbnZvY2F0aW9uQ29udHJhdmFyaWFuY2UoCiAgICAgIE1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kIGNoZWNrS2luZCwKICAgICAgTWV0aG9kSW52b2NhdGlvbiBkZXN1Z2FyZWRJbnZvY2F0aW9uLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSwKICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSwKICAgICAgaW50IGZpbGVPZmZzZXQpIHsKICAgIHZhciBleHByZXNzaW9uVG9SZXBsYWNlID0gZGVzdWdhcmVkSW52b2NhdGlvbiA/PyBleHByZXNzaW9uOwogICAgc3dpdGNoIChjaGVja0tpbmQpIHsKICAgICAgY2FzZSBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZC5jaGVja01ldGhvZFJldHVybjoKICAgICAgICB2YXIgcGFyZW50ID0gZXhwcmVzc2lvblRvUmVwbGFjZS5wYXJlbnQ7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gbmV3IEFzRXhwcmVzc2lvbihleHByZXNzaW9uVG9SZXBsYWNlLCBpbmZlcnJlZFR5cGUpCiAgICAgICAgICAuLmlzVHlwZUVycm9yID0gdHJ1ZQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKGV4cHJlc3Npb25Ub1JlcGxhY2UsIHJlcGxhY2VtZW50KTsKICAgICAgICBpZiAoaW5zdHJ1bWVudGF0aW9uICE9IG51bGwpIHsKICAgICAgICAgIGludCBvZmZzZXQgPSBhcmd1bWVudHMuZmlsZU9mZnNldCA9PSAtMQogICAgICAgICAgICAgID8gZXhwcmVzc2lvbi5maWxlT2Zmc2V0CiAgICAgICAgICAgICAgOiBhcmd1bWVudHMuZmlsZU9mZnNldDsKICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5yZWNvcmQodXJpLCBvZmZzZXQsICdjaGVja1JldHVybicsCiAgICAgICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZShpbmZlcnJlZFR5cGUpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OwogICAgICBjYXNlIE1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kLmNoZWNrR2V0dGVyUmV0dXJuOgogICAgICAgIHZhciBwYXJlbnQgPSBleHByZXNzaW9uVG9SZXBsYWNlLnBhcmVudDsKICAgICAgICB2YXIgcHJvcGVydHlHZXQgPSBuZXcgUHJvcGVydHlHZXQoZGVzdWdhcmVkSW52b2NhdGlvbi5yZWNlaXZlciwKICAgICAgICAgICAgZGVzdWdhcmVkSW52b2NhdGlvbi5uYW1lLCBkZXN1Z2FyZWRJbnZvY2F0aW9uLmludGVyZmFjZVRhcmdldCk7CiAgICAgICAgdmFyIGFzRXhwcmVzc2lvbiA9IG5ldyBBc0V4cHJlc3Npb24ocHJvcGVydHlHZXQsIGZ1bmN0aW9uVHlwZSkKICAgICAgICAgIC4uaXNUeXBlRXJyb3IgPSB0cnVlCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICAgIHZhciByZXBsYWNlbWVudCA9IG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgICBhc0V4cHJlc3Npb24sIGNhbGxOYW1lLCBkZXN1Z2FyZWRJbnZvY2F0aW9uLmFyZ3VtZW50cyk7CiAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZChleHByZXNzaW9uVG9SZXBsYWNlLCByZXBsYWNlbWVudCk7CiAgICAgICAgaWYgKGluc3RydW1lbnRhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICBpbnQgb2Zmc2V0ID0gYXJndW1lbnRzLmZpbGVPZmZzZXQgPT0gLTEKICAgICAgICAgICAgICA/IGV4cHJlc3Npb24uZmlsZU9mZnNldAogICAgICAgICAgICAgIDogYXJndW1lbnRzLmZpbGVPZmZzZXQ7CiAgICAgICAgICBpbnN0cnVtZW50YXRpb24ucmVjb3JkKHVyaSwgb2Zmc2V0LCAnY2hlY2tHZXR0ZXJSZXR1cm4nLAogICAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUoZnVuY3Rpb25UeXBlKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXBsYWNlbWVudDsKICAgICAgY2FzZSBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZC5ub25lOgogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIGV4cHJlc3Npb25Ub1JlcGxhY2U7CiAgfQoKICAvLy8gQWRkIGFuICJhcyIgY2hlY2sgaWYgbmVjZXNzYXJ5IGR1ZSB0byBjb250cmF2YXJpYW5jZS4KICAvLy8KICAvLy8gUmV0dXJucyB0aGUgImFzIiBjaGVjayBpZiBpdCB3YXMgYWRkZWQ7IG90aGVyd2lzZSByZXR1cm5zIHRoZSBvcmlnaW5hbAogIC8vLyBleHByZXNzaW9uLgogIEV4cHJlc3Npb24gaGFuZGxlUHJvcGVydHlHZXRDb250cmF2YXJpYW5jZSgKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgT2JqZWN0IGludGVyZmFjZU1lbWJlciwKICAgICAgUHJvcGVydHlHZXQgZGVzdWdhcmVkR2V0LAogICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSwKICAgICAgaW50IGZpbGVPZmZzZXQpIHsKICAgIGJvb2wgY2hlY2tSZXR1cm4gPSBmYWxzZTsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsICYmCiAgICAgICAgaW50ZXJmYWNlTWVtYmVyICE9IG51bGwgJiYKICAgICAgICByZWNlaXZlciBpcyEgVGhpc0V4cHJlc3Npb24pIHsKICAgICAgaWYgKGludGVyZmFjZU1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgICBjaGVja1JldHVybiA9IHJldHVybmVkVHlwZVBhcmFtZXRlcnNPY2N1ck5vbkNvdmFyaWFudGx5KAogICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3MsCiAgICAgICAgICAgIGludGVyZmFjZU1lbWJlci5mdW5jdGlvbi5yZXR1cm5UeXBlKTsKICAgICAgfSBlbHNlIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgRmllbGQpIHsKICAgICAgICBjaGVja1JldHVybiA9IHJldHVybmVkVHlwZVBhcmFtZXRlcnNPY2N1ck5vbkNvdmFyaWFudGx5KAogICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3MsIGludGVyZmFjZU1lbWJlci50eXBlKTsKICAgICAgfQogICAgfQogICAgdmFyIHJlcGxhY2VkRXhwcmVzc2lvbiA9IGRlc3VnYXJlZEdldCA/PyBleHByZXNzaW9uOwogICAgaWYgKGNoZWNrUmV0dXJuKSB7CiAgICAgIHZhciBleHByZXNzaW9uVG9SZXBsYWNlID0gcmVwbGFjZWRFeHByZXNzaW9uOwogICAgICB2YXIgcGFyZW50ID0gZXhwcmVzc2lvblRvUmVwbGFjZS5wYXJlbnQ7CiAgICAgIHJlcGxhY2VkRXhwcmVzc2lvbiA9IG5ldyBBc0V4cHJlc3Npb24oZXhwcmVzc2lvblRvUmVwbGFjZSwgaW5mZXJyZWRUeXBlKQogICAgICAgIC4uaXNUeXBlRXJyb3IgPSB0cnVlCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZChleHByZXNzaW9uVG9SZXBsYWNlLCByZXBsYWNlZEV4cHJlc3Npb24pOwogICAgfQogICAgaWYgKGluc3RydW1lbnRhdGlvbiAhPSBudWxsICYmIGNoZWNrUmV0dXJuKSB7CiAgICAgIGluc3RydW1lbnRhdGlvbi5yZWNvcmQodXJpLCBleHByZXNzaW9uLmZpbGVPZmZzZXQsICdjaGVja1JldHVybicsCiAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlKGluZmVycmVkVHlwZSkpOwogICAgfQogICAgcmV0dXJuIHJlcGxhY2VkRXhwcmVzc2lvbjsKICB9CgogIC8vLyBNb2RpZmllcyBhIHR5cGUgYXMgYXBwcm9wcmlhdGUgd2hlbiBpbmZlcnJpbmcgYSBkZWNsYXJlZCB2YXJpYWJsZSdzIHR5cGUuCiAgRGFydFR5cGUgaW5mZXJEZWNsYXJhdGlvblR5cGUoRGFydFR5cGUgaW5pdGlhbGl6ZXJUeXBlKSB7CiAgICBpZiAoaW5pdGlhbGl6ZXJUeXBlIGlzIEJvdHRvbVR5cGUgfHwKICAgICAgICAoaW5pdGlhbGl6ZXJUeXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICAgICAgaW5pdGlhbGl6ZXJUeXBlLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMubnVsbENsYXNzKSkgewogICAgICAvLyBJZiB0aGUgaW5pdGlhbGl6ZXIgdHlwZSBpcyBOdWxsIG9yIGJvdHRvbSwgdGhlIGluZmVycmVkIHR5cGUgaXMKICAgICAgLy8gZHluYW1pYy4KICAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiB0aGlzIHJ1bGUgaXMgaW5oZXJpdGVkIGZyb20gYW5hbHl6ZXIgYmVoYXZpb3IgYnV0IGlzCiAgICAgIC8vIG5vdCBzcGVjJ2VkIGFueXdoZXJlLgogICAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0KICAgIHJldHVybiBpbml0aWFsaXplclR5cGU7CiAgfQoKICAvLy8gUGVyZm9ybXMgdHlwZSBpbmZlcmVuY2Ugb24gdGhlIGdpdmVuIFtleHByZXNzaW9uXS4KICAvLy8KICAvLy8gW3R5cGVDb250ZXh0XSBpcyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiwgYmFzZWQgb24gc3Vycm91bmRpbmcKICAvLy8gY29kZS4gIFt0eXBlTmVlZGVkXSBpbmRpY2F0ZXMgd2hldGhlciBpdCBpcyBuZWNlc3NhcnkgdG8gY29tcHV0ZSB0aGUKICAvLy8gYWN0dWFsIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uICBJZiBbdHlwZU5lZWRlZF0gaXMgYHRydWVgLCB0aGUgYWN0dWFsIHR5cGUKICAvLy8gb2YgdGhlIGV4cHJlc3Npb24gaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSBgbnVsbGAgaXMgcmV0dXJuZWQuCiAgLy8vCiAgLy8vIERlcml2ZWQgY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2l0aCBsb2dpYyB0aGF0IGRpc3BhdGNoZXMgb24KICAvLy8gdGhlIGV4cHJlc3Npb24gdHlwZSBhbmQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlIHNwZWNpYWxpemVkICJpbmZlciIgbWV0aG9kLgogIERhcnRUeXBlIGluZmVyRXhwcmVzc2lvbigKICAgICAga2VybmVsLkV4cHJlc3Npb24gZXhwcmVzc2lvbiwgRGFydFR5cGUgdHlwZUNvbnRleHQsIGJvb2wgdHlwZU5lZWRlZCwKICAgICAge2Jvb2wgaXNWb2lkQWxsb3dlZH0pOwoKICBAb3ZlcnJpZGUKICB2b2lkIGluZmVyRmllbGRJbml0aWFsaXplcigKICAgIEluZmVyZW5jZUhlbHBlciBoZWxwZXIsCiAgICBEYXJ0VHlwZSBjb250ZXh0LAogICAga2VybmVsLkV4cHJlc3Npb24gaW5pdGlhbGl6ZXIsCiAgKSB7CiAgICBhc3NlcnQoY2xvc3VyZUNvbnRleHQgPT0gbnVsbCk7CiAgICBhc3NlcnQoIWlzVG9wTGV2ZWwpOwogICAgdGhpcy5oZWxwZXIgPSBoZWxwZXI7CiAgICB2YXIgYWN0dWFsVHlwZSA9CiAgICAgICAgaW5mZXJFeHByZXNzaW9uKGluaXRpYWxpemVyLCBjb250ZXh0LCB0cnVlLCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIGVuc3VyZUFzc2lnbmFibGUoY29udGV4dCwgYWN0dWFsVHlwZSwgaW5pdGlhbGl6ZXIsIGluaXRpYWxpemVyLmZpbGVPZmZzZXQsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogY29udGV4dCBpcyBWb2lkVHlwZSk7CiAgICB0aGlzLmhlbHBlciA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGluZmVyRnVuY3Rpb25Cb2R5KEluZmVyZW5jZUhlbHBlciBoZWxwZXIsIERhcnRUeXBlIHJldHVyblR5cGUsCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyLCBTdGF0ZW1lbnQgYm9keSkgewogICAgYXNzZXJ0KGNsb3N1cmVDb250ZXh0ID09IG51bGwpOwogICAgdGhpcy5oZWxwZXIgPSBoZWxwZXI7CiAgICBjbG9zdXJlQ29udGV4dCA9IG5ldyBDbG9zdXJlQ29udGV4dCh0aGlzLCBhc3luY01hcmtlciwgcmV0dXJuVHlwZSwgZmFsc2UpOwogICAgaW5mZXJTdGF0ZW1lbnQoYm9keSk7CiAgICBjbG9zdXJlQ29udGV4dCA9IG51bGw7CiAgICB0aGlzLmhlbHBlciA9IG51bGw7CiAgfQoKICAvLy8gUGVyZm9ybXMgdGhlIHR5cGUgaW5mZXJlbmNlIHN0ZXBzIHRoYXQgYXJlIHNoYXJlZCBieSBhbGwga2luZHMgb2YKICAvLy8gaW52b2NhdGlvbnMgKGNvbnN0cnVjdG9ycywgaW5zdGFuY2UgbWV0aG9kcywgYW5kIHN0YXRpYyBtZXRob2RzKS4KICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGluZmVySW52b2NhdGlvbihEYXJ0VHlwZSB0eXBlQ29udGV4dCwgaW50IG9mZnNldCwKICAgICAgRnVuY3Rpb25UeXBlIGNhbGxlZVR5cGUsIERhcnRUeXBlIHJldHVyblR5cGUsIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIHtib29sIGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvcjogZmFsc2UsCiAgICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgYm9vbCBza2lwVHlwZUFyZ3VtZW50SW5mZXJlbmNlOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvbnN0OiBmYWxzZX0pIHsKICAgIGxhc3RJbmZlcnJlZFN1YnN0aXR1dGlvbiA9IG51bGw7CiAgICBsYXN0Q2FsbGVlVHlwZSA9IG51bGw7CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IGNhbGxlZVR5cGVQYXJhbWV0ZXJzID0gY2FsbGVlVHlwZS50eXBlUGFyYW1ldGVyczsKICAgIGlmIChjYWxsZWVUeXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCBvbmUgb2YgdGhlIGNhbGxlZSB0eXBlIHBhcmFtZXRlcnMgbWlnaHQgbWF0Y2ggYSB0eXBlCiAgICAgIC8vIHRoYXQgYWxyZWFkeSBleGlzdHMgYXMgcGFydCBvZiBpbmZlcmVuY2UgKGUuZy4gdGhlIHR5cGUgb2YgYW4KICAgICAgLy8gYXJndW1lbnQpLiAgVGhpcyBtaWdodCBoYXBwZW4sIGZvciBpbnN0YW5jZSwgaW4gdGhlIGNhc2Ugd2hlcmUgYQogICAgICAvLyBmdW5jdGlvbiBvciBtZXRob2QgbWFrZXMgYSByZWN1cnNpdmUgY2FsbCB0byBpdHNlbGYuICBUbyBhdm9pZCB0aGUKICAgICAgLy8gY2FsbGVlIHR5cGUgcGFyYW1ldGVycyBhY2NpZGVudGFsbHkgbWF0Y2hpbmcgYSB0eXBlIHRoYXQgYWxyZWFkeQogICAgICAvLyBleGlzdHMsIGFuZCBjcmVhdGluZyBpbnZhbGlkIGluZmVyZW5jZSByZXN1bHRzLCB3ZSBuZWVkIHRvIGNyZWF0ZSBmcmVzaAogICAgICAvLyB0eXBlIHBhcmFtZXRlcnMgZm9yIHRoZSBjYWxsZWUgKHNlZSBkYXJ0YnVnLmNvbS8zMTc1OSkuCiAgICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogaXMgaXQgcG9zc2libGUgdG8gZmluZCBhIG5hcnJvd2VyIHNldCBvZiBjaXJjdW1zdGFuY2VzCiAgICAgIC8vIGluIHdoaWNoIG1lIG11c3QgZG8gdGhpcywgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSByZWdyZXNzaW9uPwogICAgICB2YXIgZnJlc2ggPSBnZXRGcmVzaFR5cGVQYXJhbWV0ZXJzKGNhbGxlZVR5cGVQYXJhbWV0ZXJzKTsKICAgICAgY2FsbGVlVHlwZSA9IGZyZXNoLmFwcGx5VG9GdW5jdGlvblR5cGUoY2FsbGVlVHlwZSk7CiAgICAgIHJldHVyblR5cGUgPSBmcmVzaC5zdWJzdGl0dXRlKHJldHVyblR5cGUpOwogICAgICBjYWxsZWVUeXBlUGFyYW1ldGVycyA9IGZyZXNoLmZyZXNoVHlwZVBhcmFtZXRlcnM7CiAgICB9CiAgICBMaXN0PERhcnRUeXBlPiBleHBsaWNpdFR5cGVBcmd1bWVudHMgPSBnZXRFeHBsaWNpdFR5cGVBcmd1bWVudHMoYXJndW1lbnRzKTsKICAgIGJvb2wgaW5mZXJlbmNlTmVlZGVkID0gIXNraXBUeXBlQXJndW1lbnRJbmZlcmVuY2UgJiYKICAgICAgICBleHBsaWNpdFR5cGVBcmd1bWVudHMgPT0gbnVsbCAmJgogICAgICAgIGNhbGxlZVR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHk7CiAgICBib29sIHR5cGVDaGVja3NOZWVkZWQgPSAhaXNUb3BMZXZlbDsKICAgIExpc3Q8RGFydFR5cGU+IGluZmVycmVkVHlwZXM7CiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uOwogICAgTGlzdDxEYXJ0VHlwZT4gZm9ybWFsVHlwZXM7CiAgICBMaXN0PERhcnRUeXBlPiBhY3R1YWxUeXBlczsKICAgIGlmIChpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCkgewogICAgICBmb3JtYWxUeXBlcyA9IFtdOwogICAgICBhY3R1YWxUeXBlcyA9IFtdOwogICAgfQogICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICBpZiAoaXNDb25zdCAmJiB0eXBlQ29udGV4dCAhPSBudWxsKSB7CiAgICAgICAgdHlwZUNvbnRleHQgPQogICAgICAgICAgICBuZXcgVHlwZVZhcmlhYmxlRWxpbWluYXRvcihjb3JlVHlwZXMpLnN1YnN0aXR1dGVUeXBlKHR5cGVDb250ZXh0KTsKICAgICAgfQogICAgICBpbmZlcnJlZFR5cGVzID0gbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgIGNhbGxlZVR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgVW5rbm93blR5cGUoKSk7CiAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZShyZXR1cm5UeXBlLAogICAgICAgICAgY2FsbGVlVHlwZVBhcmFtZXRlcnMsIG51bGwsIG51bGwsIHR5cGVDb250ZXh0LCBpbmZlcnJlZFR5cGVzKTsKICAgICAgc3Vic3RpdHV0aW9uID0KICAgICAgICAgIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoY2FsbGVlVHlwZVBhcmFtZXRlcnMsIGluZmVycmVkVHlwZXMpOwogICAgfSBlbHNlIGlmIChleHBsaWNpdFR5cGVBcmd1bWVudHMgIT0gbnVsbCAmJgogICAgICAgIGNhbGxlZVR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA9PSBleHBsaWNpdFR5cGVBcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIHN1YnN0aXR1dGlvbiA9CiAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKGNhbGxlZVR5cGVQYXJhbWV0ZXJzLCBleHBsaWNpdFR5cGVBcmd1bWVudHMpOwogICAgfSBlbHNlIGlmIChjYWxsZWVUeXBlUGFyYW1ldGVycy5sZW5ndGggIT0gMCkgewogICAgICBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgY2FsbGVlVHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgICAgIGNhbGxlZVR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgRHluYW1pY1R5cGUoKSkpOwogICAgfQogICAgLy8gVE9ETyhwYXVsYmVycnkpOiBpZiB3ZSBhcmUgZG9pbmcgdG9wIGxldmVsIGluZmVyZW5jZSBhbmQgdHlwZSBhcmd1bWVudHMKICAgIC8vIHdlcmUgb21pdHRlZCwgcmVwb3J0IGFuIGVycm9yLgogICAgaW50IGkgPSAwOwogICAgX2ZvckVhY2hBcmd1bWVudChhcmd1bWVudHMsIChuYW1lLCBleHByZXNzaW9uKSB7CiAgICAgIERhcnRUeXBlIGZvcm1hbFR5cGUgPSBuYW1lICE9IG51bGwKICAgICAgICAgID8gZ2V0TmFtZWRQYXJhbWV0ZXJUeXBlKGNhbGxlZVR5cGUsIG5hbWUpCiAgICAgICAgICA6IGdldFBvc2l0aW9uYWxQYXJhbWV0ZXJUeXBlKGNhbGxlZVR5cGUsIGkrKyk7CiAgICAgIERhcnRUeXBlIGluZmVycmVkRm9ybWFsVHlwZSA9IHN1YnN0aXR1dGlvbiAhPSBudWxsCiAgICAgICAgICA/IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShmb3JtYWxUeXBlKQogICAgICAgICAgOiBmb3JtYWxUeXBlOwogICAgICB2YXIgZXhwcmVzc2lvblR5cGUgPSBpbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBleHByZXNzaW9uLAogICAgICAgICAgaW5mZXJyZWRGb3JtYWxUeXBlLAogICAgICAgICAgaW5mZXJlbmNlTmVlZGVkIHx8CiAgICAgICAgICAgICAgaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yIHx8CiAgICAgICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICAgIGlmIChpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCkgewogICAgICAgIGZvcm1hbFR5cGVzLmFkZChmb3JtYWxUeXBlKTsKICAgICAgICBhY3R1YWxUeXBlcy5hZGQoZXhwcmVzc2lvblR5cGUpOwogICAgICB9CiAgICAgIGlmIChpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3IpIHsKICAgICAgICByZXR1cm5UeXBlID0gdHlwZVNjaGVtYUVudmlyb25tZW50LmdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljKAogICAgICAgICAgICByZWNlaXZlclR5cGUsIGV4cHJlc3Npb25UeXBlKTsKICAgICAgfQogICAgfSk7CgogICAgLy8gQ2hlY2sgZm9yIGFuZCByZW1vdmUgZHVwbGljYXRlZCBuYW1lZCBhcmd1bWVudHMuCiAgICB2YXIgbmFtZWQgPSBhcmd1bWVudHMubmFtZWQ7CiAgICBpZiAobmFtZWQubGVuZ3RoID09IDIpIHsKICAgICAgaWYgKG5hbWVkWzBdLm5hbWUgPT0gbmFtZWRbMV0ubmFtZSkgewogICAgICAgIHZhciBuYW1lID0gbmFtZWRbMV0ubmFtZTsKICAgICAgICB2YXIgZXJyb3IgPSBoZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTmFtZWRBcmd1bWVudC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICBuYW1lZFsxXS5maWxlT2Zmc2V0LAogICAgICAgICAgICBuYW1lLmxlbmd0aCkpOwogICAgICAgIGFyZ3VtZW50cy5uYW1lZCA9IFtuZXcga2VybmVsLk5hbWVkRXhwcmVzc2lvbihuYW1lZFsxXS5uYW1lLCBlcnJvcildOwogICAgICAgIGZvcm1hbFR5cGVzLnJlbW92ZUxhc3QoKTsKICAgICAgICBhY3R1YWxUeXBlcy5yZW1vdmVMYXN0KCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobmFtZWQubGVuZ3RoID4gMikgewogICAgICB2YXIgc2Vlbk5hbWVzID0gPFN0cmluZywga2VybmVsLk5hbWVkRXhwcmVzc2lvbj57fTsKICAgICAgdmFyIGhhc1Byb2JsZW0gPSBmYWxzZTsKICAgICAgdmFyIG5hbWVkVHlwZUluZGV4ID0gYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoOwogICAgICB2YXIgdW5pcXVlTmFtZWQgPSA8a2VybmVsLk5hbWVkRXhwcmVzc2lvbj5bXTsKICAgICAgZm9yICh2YXIgZXhwcmVzc2lvbiBpbiBuYW1lZCkgewogICAgICAgIHZhciBuYW1lID0gZXhwcmVzc2lvbi5uYW1lOwogICAgICAgIGlmIChzZWVuTmFtZXMuY29udGFpbnNLZXkobmFtZSkpIHsKICAgICAgICAgIGhhc1Byb2JsZW0gPSB0cnVlOwogICAgICAgICAgdmFyIHByZXZOYW1lZEV4cHJlc3Npb24gPSBzZWVuTmFtZXNbbmFtZV07CiAgICAgICAgICBwcmV2TmFtZWRFeHByZXNzaW9uLnZhbHVlID0gaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgICAgICAgIGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZE5hbWVkQXJndW1lbnQud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICBuYW1lLmxlbmd0aCkpCiAgICAgICAgICAgIC4ucGFyZW50ID0gcHJldk5hbWVkRXhwcmVzc2lvbjsKICAgICAgICAgIGZvcm1hbFR5cGVzLnJlbW92ZUF0KG5hbWVkVHlwZUluZGV4KTsKICAgICAgICAgIGFjdHVhbFR5cGVzLnJlbW92ZUF0KG5hbWVkVHlwZUluZGV4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2Vlbk5hbWVzW25hbWVdID0gZXhwcmVzc2lvbjsKICAgICAgICAgIHVuaXF1ZU5hbWVkLmFkZChleHByZXNzaW9uKTsKICAgICAgICAgIG5hbWVkVHlwZUluZGV4Kys7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChoYXNQcm9ibGVtKSB7CiAgICAgICAgYXJndW1lbnRzLm5hbWVkID0gdW5pcXVlTmFtZWQ7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkKSB7CiAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZSgKICAgICAgICAgIHJldHVyblR5cGUsCiAgICAgICAgICBjYWxsZWVUeXBlUGFyYW1ldGVycywKICAgICAgICAgIGZvcm1hbFR5cGVzLAogICAgICAgICAgYWN0dWFsVHlwZXMsCiAgICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICAgIGluZmVycmVkVHlwZXMpOwogICAgICBzdWJzdGl0dXRpb24gPQogICAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21QYWlycyhjYWxsZWVUeXBlUGFyYW1ldGVycywgaW5mZXJyZWRUeXBlcyk7CiAgICAgIGluc3RydW1lbnRhdGlvbj8ucmVjb3JkKHVyaSwgb2Zmc2V0LCAndHlwZUFyZ3MnLAogICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZUFyZ3MoaW5mZXJyZWRUeXBlcykpOwogICAgICBhcmd1bWVudHMudHlwZXMuY2xlYXIoKTsKICAgICAgYXJndW1lbnRzLnR5cGVzLmFkZEFsbChpbmZlcnJlZFR5cGVzKTsKICAgIH0KICAgIGlmICh0eXBlQ2hlY2tzTmVlZGVkICYmICFpZGVudGljYWwoY2FsbGVlVHlwZSwgdW5rbm93bkZ1bmN0aW9uKSkgewogICAgICBMb2NhdGVkTWVzc2FnZSBhcmdNZXNzYWdlID0KICAgICAgICAgIGhlbHBlci5jaGVja0FyZ3VtZW50c0ZvclR5cGUoY2FsbGVlVHlwZSwgYXJndW1lbnRzLCBvZmZzZXQpOwogICAgICBpZiAoYXJnTWVzc2FnZSAhPSBudWxsKSB7CiAgICAgICAgaGVscGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgIGFyZ01lc3NhZ2UubWVzc2FnZU9iamVjdCwgYXJnTWVzc2FnZS5jaGFyT2Zmc2V0LCBhcmdNZXNzYWdlLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQXJndW1lbnQgY291bnRzIGFuZCBuYW1lcyBtYXRjaC4gQ29tcGFyZSB0eXBlcy4KICAgICAgICBpbnQgbnVtUG9zaXRpb25hbEFyZ3MgPSBhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGg7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JtYWxUeXBlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGZvcm1hbFR5cGUgPSBmb3JtYWxUeXBlc1tpXTsKICAgICAgICAgIHZhciBleHBlY3RlZFR5cGUgPSBzdWJzdGl0dXRpb24gIT0gbnVsbAogICAgICAgICAgICAgID8gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGZvcm1hbFR5cGUpCiAgICAgICAgICAgICAgOiBmb3JtYWxUeXBlOwogICAgICAgICAgdmFyIGFjdHVhbFR5cGUgPSBhY3R1YWxUeXBlc1tpXTsKICAgICAgICAgIHZhciBleHByZXNzaW9uID0gaSA8IG51bVBvc2l0aW9uYWxBcmdzCiAgICAgICAgICAgICAgPyBhcmd1bWVudHMucG9zaXRpb25hbFtpXQogICAgICAgICAgICAgIDogYXJndW1lbnRzLm5hbWVkW2kgLSBudW1Qb3NpdGlvbmFsQXJnc10udmFsdWU7CiAgICAgICAgICBlbnN1cmVBc3NpZ25hYmxlKAogICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSwgYWN0dWFsVHlwZSwgZXhwcmVzc2lvbiwgZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IGV4cGVjdGVkVHlwZSBpcyBWb2lkVHlwZSwKICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIERhcnRUeXBlIGluZmVycmVkVHlwZTsKICAgIGxhc3RJbmZlcnJlZFN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbjsKICAgIGxhc3RDYWxsZWVUeXBlID0gY2FsbGVlVHlwZTsKICAgIGluZmVycmVkVHlwZSA9IHN1YnN0aXR1dGlvbiA9PSBudWxsCiAgICAgICAgPyByZXR1cm5UeXBlCiAgICAgICAgOiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUocmV0dXJuVHlwZSk7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQobnVsbCwgaW5mZXJyZWRUeXBlKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgaW5mZXJMb2NhbEZ1bmN0aW9uKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwKICAgICAgRGFydFR5cGUgdHlwZUNvbnRleHQsIGludCBmaWxlT2Zmc2V0LCBEYXJ0VHlwZSByZXR1cm5Db250ZXh0KSB7CiAgICBib29sIGhhc0ltcGxpY2l0UmV0dXJuVHlwZSA9IGZhbHNlOwogICAgaWYgKHJldHVybkNvbnRleHQgPT0gbnVsbCkgewogICAgICBoYXNJbXBsaWNpdFJldHVyblR5cGUgPSB0cnVlOwogICAgICByZXR1cm5Db250ZXh0ID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0KICAgIGlmICghaXNUb3BMZXZlbCkgewogICAgICB2YXIgcG9zaXRpb25hbFBhcmFtZXRlcnMgPSBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyczsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBwYXJhbWV0ZXIgPSBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgICBpbmZlck1ldGFkYXRhS2VlcGluZ0hlbHBlcihwYXJhbWV0ZXIuYW5ub3RhdGlvbnMpOwogICAgICAgIGlmIChwYXJhbWV0ZXIuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgaW5mZXJFeHByZXNzaW9uKHBhcmFtZXRlci5pbml0aWFsaXplciwgcGFyYW1ldGVyLnR5cGUsICFpc1RvcExldmVsKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yICh2YXIgcGFyYW1ldGVyIGluIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgICAgIGluZmVyTWV0YWRhdGFLZWVwaW5nSGVscGVyKHBhcmFtZXRlci5hbm5vdGF0aW9ucyk7CiAgICAgICAgaW5mZXJFeHByZXNzaW9uKHBhcmFtZXRlci5pbml0aWFsaXplciwgcGFyYW1ldGVyLnR5cGUsICFpc1RvcExldmVsKTsKICAgICAgfQogICAgfQoKICAgIC8vIExldCBgPFQwLCAuLi4sIFRuPmAgYmUgdGhlIHNldCBvZiB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIGNsb3N1cmUgKHdpdGgKICAgIC8vIGBuYD0wIGlmIHRoZXJlIGFyZSBubyB0eXBlIHBhcmFtZXRlcnMpLgogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwoKICAgIC8vIExldCBgKFAwIHgwLCAuLi4sIFBtIHhtKWAgYmUgdGhlIHNldCBvZiBmb3JtYWwgcGFyYW1ldGVycyBvZiB0aGUgY2xvc3VyZQogICAgLy8gKGluY2x1ZGluZyByZXF1aXJlZCwgcG9zaXRpb25hbCBvcHRpb25hbCwgYW5kIG5hbWVkIG9wdGlvbmFsIHBhcmFtZXRlcnMpLgogICAgLy8gSWYgYW55IHR5cGUgYFBpYCBpcyBtaXNzaW5nLCBkZW5vdGUgaXQgYXMgYF9gLgogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBmb3JtYWxzID0gZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMudG9MaXN0KCkKICAgICAgLi5hZGRBbGwoZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKTsKCiAgICAvLyBMZXQgYEJgIGRlbm90ZSB0aGUgY2xvc3VyZSBib2R5LiAgSWYgYEJgIGlzIGFuIGV4cHJlc3Npb24gZnVuY3Rpb24gYm9keQogICAgLy8gKGA9PiBlYCksIHRyZWF0IGl0IGFzIGVxdWl2YWxlbnQgdG8gYSBibG9jayBmdW5jdGlvbiBib2R5IGNvbnRhaW5pbmcgYQogICAgLy8gc2luZ2xlIGByZXR1cm5gIHN0YXRlbWVudCAoYHsgcmV0dXJuIGU7IH1gKS4KCiAgICAvLyBBdHRlbXB0IHRvIG1hdGNoIGBLYCBhcyBhIGZ1bmN0aW9uIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBjbG9zdXJlICh0aGF0CiAgICAvLyBpcywgb25lIGhhdmluZyBuIHR5cGUgcGFyYW1ldGVycyBhbmQgYSBjb21wYXRpYmxlIHNldCBvZiBmb3JtYWwKICAgIC8vIHBhcmFtZXRlcnMpLiAgSWYgdGhlcmUgaXMgYSBzdWNjZXNzZnVsIG1hdGNoLCBsZXQgYDxTMCwgLi4uLCBTbj5gIGJlIHRoZQogICAgLy8gc2V0IG9mIG1hdGNoZWQgdHlwZSBwYXJhbWV0ZXJzIGFuZCBgKFEwLCAuLi4sIFFtKWAgYmUgdGhlIHNldCBvZiBtYXRjaGVkCiAgICAvLyBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgbGV0IGBOYCBiZSB0aGUgcmV0dXJuIHR5cGUuCiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uOwogICAgTGlzdDxEYXJ0VHlwZT4gZm9ybWFsVHlwZXNGcm9tQ29udGV4dCA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZChmb3JtYWxzLmxlbmd0aCwgbnVsbCk7CiAgICBpZiAodHlwZUNvbnRleHQgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9ybWFscy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpIDwgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgICBmb3JtYWxUeXBlc0Zyb21Db250ZXh0W2ldID0KICAgICAgICAgICAgICBnZXRQb3NpdGlvbmFsUGFyYW1ldGVyVHlwZSh0eXBlQ29udGV4dCwgaSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvcm1hbFR5cGVzRnJvbUNvbnRleHRbaV0gPQogICAgICAgICAgICAgIGdldE5hbWVkUGFyYW1ldGVyVHlwZSh0eXBlQ29udGV4dCwgZm9ybWFsc1tpXS5uYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuQ29udGV4dCA9IHR5cGVDb250ZXh0LnJldHVyblR5cGU7CgogICAgICAvLyBMZXQgYFtUL1NdYCBkZW5vdGUgdGhlIHR5cGUgc3Vic3RpdHV0aW9uIHdoZXJlIGVhY2ggYFNpYCBpcyByZXBsYWNlZAogICAgICAvLyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGBUaWAuCiAgICAgIHZhciBzdWJzdGl0dXRpb25NYXAgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUNvbnRleHQudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzdWJzdGl0dXRpb25NYXBbdHlwZUNvbnRleHQudHlwZVBhcmFtZXRlcnNbaV1dID0KICAgICAgICAgICAgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aAogICAgICAgICAgICAgICAgPyBuZXcgVHlwZVBhcmFtZXRlclR5cGUodHlwZVBhcmFtZXRlcnNbaV0pCiAgICAgICAgICAgICAgICA6IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIH0KICAgICAgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21NYXAoc3Vic3RpdHV0aW9uTWFwKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIElmIHRoZSBtYXRjaCBpcyBub3Qgc3VjY2Vzc2Z1bCBiZWNhdXNlICBgS2AgaXMgYF9gLCBsZXQgYWxsIGBTaWAsIGFsbAogICAgICAvLyBgUWlgLCBhbmQgYE5gIGFsbCBiZSBgX2AuCgogICAgICAvLyBJZiB0aGUgbWF0Y2ggaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGFueSBvdGhlciByZWFzb24sIHRoaXMgd2lsbCByZXN1bHQKICAgICAgLy8gaW4gYSB0eXBlIGVycm9yLCBzbyB0aGUgaW1wbGVtZW50YXRpb24gaXMgZnJlZSB0byBjaG9vc2UgdGhlIGJlc3QKICAgICAgLy8gZXJyb3IgcmVjb3ZlcnkgcGF0aC4KICAgICAgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmVtcHR5OwogICAgfQoKICAgIC8vIERlZmluZSBgUmlgIGFzIGZvbGxvd3M6IGlmIGBQaWAgaXMgbm90IGBfYCwgbGV0IGBSaWAgYmUgYFBpYC4KICAgIC8vIE90aGVyd2lzZSwgaWYgYFFpYCBpcyBub3QgYF9gLCBsZXQgYFJpYCBiZSB0aGUgZ3JlYXRlc3QgY2xvc3VyZSBvZgogICAgLy8gYFFpW1QvU11gIHdpdGggcmVzcGVjdCB0byBgP2AuICBPdGhlcndpc2UsIGxldCBgUmlgIGJlIGBkeW5hbWljYC4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9ybWFscy5sZW5ndGg7IGkrKykgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQgZm9ybWFsID0gZm9ybWFsc1tpXTsKICAgICAgaWYgKFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudC5pc0ltcGxpY2l0bHlUeXBlZChmb3JtYWwpKSB7CiAgICAgICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwogICAgICAgIGlmIChmb3JtYWxUeXBlc0Zyb21Db250ZXh0W2ldID09IGNvcmVUeXBlcy5udWxsQ2xhc3MucmF3VHlwZSkgewogICAgICAgICAgaW5mZXJyZWRUeXBlID0gY29yZVR5cGVzLm9iamVjdENsYXNzLnJhd1R5cGU7CiAgICAgICAgfSBlbHNlIGlmIChmb3JtYWxUeXBlc0Zyb21Db250ZXh0W2ldICE9IG51bGwpIHsKICAgICAgICAgIGluZmVycmVkVHlwZSA9IGdyZWF0ZXN0Q2xvc3VyZShjb3JlVHlwZXMsCiAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGZvcm1hbFR5cGVzRnJvbUNvbnRleHRbaV0pKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5mZXJyZWRUeXBlID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgICAgICB9CiAgICAgICAgaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQodXJpLCBmb3JtYWwuZmlsZU9mZnNldCwgJ3R5cGUnLAogICAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlKGluZmVycmVkVHlwZSkpOwogICAgICAgIGZvcm1hbC50eXBlID0gaW5mZXJyZWRUeXBlOwogICAgICB9CiAgICB9CgogICAgLy8gTGV0IGBOJ2AgYmUgYE5bVC9TXWAuICBUaGUgW0Nsb3N1cmVDb250ZXh0XSBjb25zdHJ1Y3RvciB3aWxsIGFkanVzdAogICAgLy8gYWNjb3JkaW5nbHkgaWYgdGhlIGNsb3N1cmUgaXMgZGVjbGFyZWQgd2l0aCBgYXN5bmNgLCBgYXN5bmMqYCwgb3IKICAgIC8vIGBzeW5jKmAuCiAgICBpZiAocmV0dXJuQ29udGV4dCBpcyEgVW5rbm93blR5cGUpIHsKICAgICAgcmV0dXJuQ29udGV4dCA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShyZXR1cm5Db250ZXh0KTsKICAgIH0KCiAgICAvLyBBcHBseSB0eXBlIGluZmVyZW5jZSB0byBgQmAgaW4gcmV0dXJuIGNvbnRleHQgYE7igJlgLCB3aXRoIGFueSByZWZlcmVuY2VzCiAgICAvLyB0byBgeGlgIGluIGBCYCBoYXZpbmcgdHlwZSBgUGlgLiAgVGhpcyBwcm9kdWNlcyBgQuKAmWAuCiAgICBib29sIG5lZWRUb1NldFJldHVyblR5cGUgPSBoYXNJbXBsaWNpdFJldHVyblR5cGU7CiAgICBDbG9zdXJlQ29udGV4dCBvbGRDbG9zdXJlQ29udGV4dCA9IHRoaXMuY2xvc3VyZUNvbnRleHQ7CiAgICBDbG9zdXJlQ29udGV4dCBjbG9zdXJlQ29udGV4dCA9IG5ldyBDbG9zdXJlQ29udGV4dCgKICAgICAgICB0aGlzLCBmdW5jdGlvbi5hc3luY01hcmtlciwgcmV0dXJuQ29udGV4dCwgbmVlZFRvU2V0UmV0dXJuVHlwZSk7CiAgICB0aGlzLmNsb3N1cmVDb250ZXh0ID0gY2xvc3VyZUNvbnRleHQ7CiAgICBpbmZlclN0YXRlbWVudChmdW5jdGlvbi5ib2R5KTsKCiAgICAvLyBJZiB0aGUgY2xvc3VyZSBpcyBkZWNsYXJlZCB3aXRoIGBhc3luYypgIG9yIGBzeW5jKmAsIGxldCBgTWAgYmUgdGhlCiAgICAvLyBsZWFzdCB1cHBlciBib3VuZCBvZiB0aGUgdHlwZXMgb2YgdGhlIGB5aWVsZGAgZXhwcmVzc2lvbnMgaW4gYELigJlgLCBvcgogICAgLy8gYHZvaWRgIGlmIGBC4oCZYCBjb250YWlucyBubyBgeWllbGRgIGV4cHJlc3Npb25zLiAgT3RoZXJ3aXNlLCBsZXQgYE1gIGJlCiAgICAvLyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgdGhlIHR5cGVzIG9mIHRoZSBgcmV0dXJuYCBleHByZXNzaW9ucyBpbiBgQuKAmWAsCiAgICAvLyBvciBgdm9pZGAgaWYgYELigJlgIGNvbnRhaW5zIG5vIGByZXR1cm5gIGV4cHJlc3Npb25zLgogICAgRGFydFR5cGUgaW5mZXJyZWRSZXR1cm5UeXBlOwogICAgaWYgKG5lZWRUb1NldFJldHVyblR5cGUpIHsKICAgICAgaW5mZXJyZWRSZXR1cm5UeXBlID0gY2xvc3VyZUNvbnRleHQuaW5mZXJSZXR1cm5UeXBlKHRoaXMpOwogICAgfQoKICAgIC8vIFRoZW4gdGhlIHJlc3VsdCBvZiBpbmZlcmVuY2UgaXMgYDxUMCwgLi4uLCBUbj4oUjAgeDAsIC4uLiwgUm4geG4pIEJgIHdpdGgKICAgIC8vIHR5cGUgYDxUMCwgLi4uLCBUbj4oUjAsIC4uLiwgUm4pIC0+IE3igJlgICh3aXRoIHNvbWUgb2YgdGhlIGBSaWAgYW5kIGB4aWAKICAgIC8vIGRlbm90ZWQgYXMgb3B0aW9uYWwgb3IgbmFtZWQgcGFyYW1ldGVycywgaWYgYXBwcm9wcmlhdGUpLgogICAgaWYgKG5lZWRUb1NldFJldHVyblR5cGUpIHsKICAgICAgaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQodXJpLCBmaWxlT2Zmc2V0LCAncmV0dXJuVHlwZScsCiAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlKGluZmVycmVkUmV0dXJuVHlwZSkpOwogICAgICBmdW5jdGlvbi5yZXR1cm5UeXBlID0gaW5mZXJyZWRSZXR1cm5UeXBlOwogICAgfQogICAgdGhpcy5jbG9zdXJlQ29udGV4dCA9IG9sZENsb3N1cmVDb250ZXh0OwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KG51bGwsIGZ1bmN0aW9uLmZ1bmN0aW9uVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGluZmVyTWV0YWRhdGEoCiAgICAgIEluZmVyZW5jZUhlbHBlciBoZWxwZXIsIExpc3Q8a2VybmVsLkV4cHJlc3Npb24+IGFubm90YXRpb25zKSB7CiAgICBpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogICAgICB0aGlzLmhlbHBlciA9IGhlbHBlcjsKICAgICAgaW5mZXJNZXRhZGF0YUtlZXBpbmdIZWxwZXIoYW5ub3RhdGlvbnMpOwogICAgICB0aGlzLmhlbHBlciA9IG51bGw7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGluZmVyTWV0YWRhdGFLZWVwaW5nSGVscGVyKExpc3Q8a2VybmVsLkV4cHJlc3Npb24+IGFubm90YXRpb25zKSB7CiAgICBpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogICAgICAvLyBQbGFjZSBhbm5vdGF0aW9ucyBpbiBhIHRlbXBvcmFyeSBsaXN0IGxpdGVyYWwgc28gdGhhdCB0aGV5IHdpbGwgaGF2ZSBhCiAgICAgIC8vIHBhcmVudC4gIFRoaXMgaXMgbmVjZXNzYXJ5IGluIGNhc2UgYW55IG9mIHRoZSBhbm5vdGF0aW9ucyBuZWVkIHRvIGdldAogICAgICAvLyByZXBsYWNlZCBkdXJpbmcgdHlwZSBpbmZlcmVuY2UuCiAgICAgIHZhciBwYXJlbnRzID0gYW5ub3RhdGlvbnMubWFwKChlKSA9PiBlLnBhcmVudCkudG9MaXN0KCk7CiAgICAgIG5ldyBMaXN0TGl0ZXJhbChhbm5vdGF0aW9ucyk7CiAgICAgIGZvciAodmFyIGFubm90YXRpb24gaW4gYW5ub3RhdGlvbnMpIHsKICAgICAgICBpbmZlckV4cHJlc3Npb24oYW5ub3RhdGlvbiwgY29uc3QgVW5rbm93blR5cGUoKSwgIWlzVG9wTGV2ZWwpOwogICAgICB9CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBhbm5vdGF0aW9uc1tpXS5wYXJlbnQgPSBwYXJlbnRzW2ldOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gUGVyZm9ybXMgdGhlIGNvcmUgdHlwZSBpbmZlcmVuY2UgYWxnb3JpdGhtIGZvciBtZXRob2QgaW52b2NhdGlvbnMgKHRoaXMKICAvLy8gaGFuZGxlcyBib3RoIG51bGwtYXdhcmUgYW5kIG5vbi1udWxsLWF3YXJlIG1ldGhvZCBpbnZvY2F0aW9ucykuCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBpbmZlck1ldGhvZEludm9jYXRpb24oCiAgICAgIGtlcm5lbC5FeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIGtlcm5lbC5FeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBpbnQgZmlsZU9mZnNldCwKICAgICAgYm9vbCBpc0ltcGxpY2l0Q2FsbCwKICAgICAgRGFydFR5cGUgdHlwZUNvbnRleHQsCiAgICAgIHtWYXJpYWJsZURlY2xhcmF0aW9uIHJlY2VpdmVyVmFyaWFibGUsCiAgICAgIE1ldGhvZEludm9jYXRpb24gZGVzdWdhcmVkSW52b2NhdGlvbiwKICAgICAgT2JqZWN0IGludGVyZmFjZU1lbWJlciwKICAgICAgTmFtZSBtZXRob2ROYW1lLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzfSkgewogICAgLy8gRmlyc3QgaW5mZXIgdGhlIHJlY2VpdmVyIHNvIHdlIGNhbiBsb29rIHVwIHRoZSBtZXRob2QgdGhhdCB3YXMgaW52b2tlZC4KICAgIHZhciByZWNlaXZlclR5cGUgPSByZWNlaXZlciA9PSBudWxsCiAgICAgICAgPyB0aGlzVHlwZQogICAgICAgIDogaW5mZXJFeHByZXNzaW9uKHJlY2VpdmVyLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlKTsKICAgIHJlY2VpdmVyVmFyaWFibGU/LnR5cGUgPSByZWNlaXZlclR5cGU7CiAgICBpZiAoZGVzdWdhcmVkSW52b2NhdGlvbiAhPSBudWxsKSB7CiAgICAgIGludGVyZmFjZU1lbWJlciA9CiAgICAgICAgICBmaW5kTWV0aG9kSW52b2NhdGlvbk1lbWJlcihyZWNlaXZlclR5cGUsIGRlc3VnYXJlZEludm9jYXRpb24pOwogICAgICBtZXRob2ROYW1lID0gZGVzdWdhcmVkSW52b2NhdGlvbi5uYW1lOwogICAgICBhcmd1bWVudHMgPSBkZXN1Z2FyZWRJbnZvY2F0aW9uLmFyZ3VtZW50czsKICAgIH0KICAgIGJvb2wgaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yID0gaW50ZXJmYWNlTWVtYmVyIGlzIFByb2NlZHVyZSAmJgogICAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudC5pc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3JBbmRUeXBlKAogICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIsIHJlY2VpdmVyVHlwZSk7CiAgICB2YXIgY2FsbGVlVHlwZSA9IGdldENhbGxlZVR5cGUoaW50ZXJmYWNlTWVtYmVyLCByZWNlaXZlclR5cGUpOwogICAgdmFyIGZ1bmN0aW9uVHlwZSA9IGdldENhbGxlZUZ1bmN0aW9uVHlwZShjYWxsZWVUeXBlLCAhaXNJbXBsaWNpdENhbGwpOwoKICAgIGlmIChpbnRlcmZhY2VNZW1iZXIgIT0gbnVsbCAmJgogICAgICAgIGNhbGxlZVR5cGUgaXMhIER5bmFtaWNUeXBlICYmCiAgICAgICAgY2FsbGVlVHlwZSAhPSBjb3JlVHlwZXMuZnVuY3Rpb25DbGFzcy5yYXdUeXBlICYmCiAgICAgICAgaWRlbnRpY2FsKGZ1bmN0aW9uVHlwZSwgdW5rbm93bkZ1bmN0aW9uKSkgewogICAgICB2YXIgcGFyZW50ID0gZXhwcmVzc2lvbi5wYXJlbnQ7CiAgICAgIGtlcm5lbC5FeHByZXNzaW9uIGVycm9yID0gaGVscGVyLndyYXBJblByb2JsZW0oZXhwcmVzc2lvbiwKICAgICAgICAgIHRlbXBsYXRlSW52b2tlTm9uRnVuY3Rpb24ud2l0aEFyZ3VtZW50cyhtZXRob2ROYW1lLm5hbWUpLCBub0xlbmd0aCk7CiAgICAgIHBhcmVudD8ucmVwbGFjZUNoaWxkKGV4cHJlc3Npb24sIGVycm9yKTsKICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KG51bGwsIGNvbnN0IER5bmFtaWNUeXBlKCkpOwogICAgfQogICAgdmFyIGNoZWNrS2luZCA9IHByZUNoZWNrSW52b2NhdGlvbkNvbnRyYXZhcmlhbmNlKHJlY2VpdmVyLCByZWNlaXZlclR5cGUsCiAgICAgICAgaW50ZXJmYWNlTWVtYmVyLCBkZXN1Z2FyZWRJbnZvY2F0aW9uLCBhcmd1bWVudHMsIGV4cHJlc3Npb24pOwogICAgdmFyIGluZmVyZW5jZVJlc3VsdCA9IGluZmVySW52b2NhdGlvbih0eXBlQ29udGV4dCwgZmlsZU9mZnNldCwgZnVuY3Rpb25UeXBlLAogICAgICAgIGZ1bmN0aW9uVHlwZS5yZXR1cm5UeXBlLCBhcmd1bWVudHMsCiAgICAgICAgaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yOiBpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3IsCiAgICAgICAgcmVjZWl2ZXJUeXBlOiByZWNlaXZlclR5cGUpOwogICAgdmFyIGluZmVycmVkVHlwZSA9IGluZmVyZW5jZVJlc3VsdC50eXBlOwogICAgaWYgKG1ldGhvZE5hbWUubmFtZSA9PSAnPT0nKSB7CiAgICAgIGluZmVycmVkVHlwZSA9IGNvcmVUeXBlcy5ib29sQ2xhc3MucmF3VHlwZTsKICAgIH0KICAgIGhhbmRsZUludm9jYXRpb25Db250cmF2YXJpYW5jZShjaGVja0tpbmQsIGRlc3VnYXJlZEludm9jYXRpb24sIGFyZ3VtZW50cywKICAgICAgICBleHByZXNzaW9uLCBpbmZlcnJlZFR5cGUsIGZ1bmN0aW9uVHlwZSwgZmlsZU9mZnNldCk7CiAgICBpZiAoIWlkZW50aWNhbChpbnRlcmZhY2VNZW1iZXIsICdjYWxsJykpIHsKICAgICAgaWYgKGlzSW1wbGljaXRDYWxsICYmCiAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIgIT0gbnVsbCAmJgogICAgICAgICAgIShpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5NZXRob2QpICYmCiAgICAgICAgICByZWNlaXZlclR5cGUgaXMhIER5bmFtaWNUeXBlICYmCiAgICAgICAgICByZWNlaXZlclR5cGUgIT0gdHlwZVNjaGVtYUVudmlyb25tZW50LnJhd0Z1bmN0aW9uVHlwZSkgewogICAgICAgIHZhciBwYXJlbnQgPSBleHByZXNzaW9uLnBhcmVudDsKICAgICAgICB2YXIgZXJyb3JOb2RlID0gaGVscGVyLndyYXBJblByb2JsZW0oCiAgICAgICAgICAgIGV4cHJlc3Npb24sCiAgICAgICAgICAgIHRlbXBsYXRlSW1wbGljaXRDYWxsT2ZOb25NZXRob2Qud2l0aEFyZ3VtZW50cyhyZWNlaXZlclR5cGUpLAogICAgICAgICAgICBub0xlbmd0aCk7CiAgICAgICAgcGFyZW50Py5yZXBsYWNlQ2hpbGQoZXhwcmVzc2lvbiwgZXJyb3JOb2RlKTsKICAgICAgfQogICAgfQoKICAgIC8vIElmIFthcmd1bWVudHNdIHdlcmUgaW5mZXJyZWQsIGNoZWNrIHRoZW0uCiAgICAvLyBUT0RPKGRtaXRyeWFzKTogRmlndXJlIG91dCB3aHkgW2xpYnJhcnldIGlzIHNvbWV0aW1lcyBudWxsLgogICAgaWYgKGxpYnJhcnkgIT0gbnVsbCkgewogICAgICAvLyBbYWN0dWFsUmVjZWl2ZXJUeXBlXSwgW2ludGVyZmFjZVRhcmdldF0sIGFuZCBbYWN0dWFsTWV0aG9kTmFtZV0gYmVsb3cKICAgICAgLy8gYXJlIGZvciBhIHdvcmthcm91bmQgZm9yIHRoZSBjYXNlcyBsaWtlIHRoZSBmb2xsb3dpbmc6CiAgICAgIC8vCiAgICAgIC8vICAgICBjbGFzcyBDMSB7IHZhciBmID0gbmV3IEMyKCk7IH0KICAgICAgLy8gICAgIGNsYXNzIEMyIHsgaW50IGNhbGw8WCBleHRlbmRzIG51bT4oWCB4KSA9PiA0MjsgfQogICAgICAvLyAgICAgbWFpbigpIHsgQzEgYyA9IG5ldyBDMSgpOyBjLmYoImZvb2JhciIpOyB9CiAgICAgIERhcnRUeXBlIGFjdHVhbFJlY2VpdmVyVHlwZTsKICAgICAgTWVtYmVyIGludGVyZmFjZVRhcmdldDsKICAgICAgTmFtZSBhY3R1YWxNZXRob2ROYW1lOwogICAgICBpZiAoY2FsbGVlVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgYWN0dWFsUmVjZWl2ZXJUeXBlID0gY2FsbGVlVHlwZTsKICAgICAgICBpbnRlcmZhY2VUYXJnZXQgPSBudWxsOwogICAgICAgIGFjdHVhbE1ldGhvZE5hbWUgPSBjYWxsTmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY3R1YWxSZWNlaXZlclR5cGUgPSByZWNlaXZlclR5cGU7CiAgICAgICAgaW50ZXJmYWNlVGFyZ2V0ID0gaW50ZXJmYWNlTWVtYmVyIGlzIE1lbWJlciA/IGludGVyZmFjZU1lbWJlciA6IG51bGw7CiAgICAgICAgYWN0dWFsTWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CiAgICAgIH0KICAgICAgbGlicmFyeS5jaGVja0JvdW5kc0luTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgIGFjdHVhbFJlY2VpdmVyVHlwZSwKICAgICAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudCwKICAgICAgICAgIGNsYXNzSGllcmFyY2h5LAogICAgICAgICAgdGhpcywKICAgICAgICAgIGFjdHVhbE1ldGhvZE5hbWUsCiAgICAgICAgICBpbnRlcmZhY2VUYXJnZXQsCiAgICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgICBoZWxwZXIudXJpLAogICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgIGluZmVycmVkOiBnZXRFeHBsaWNpdFR5cGVBcmd1bWVudHMoYXJndW1lbnRzKSA9PSBudWxsKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQobnVsbCwgaW5mZXJyZWRUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaW5mZXJQYXJhbWV0ZXJJbml0aWFsaXplcihJbmZlcmVuY2VIZWxwZXIgaGVscGVyLAogICAgICBrZXJuZWwuRXhwcmVzc2lvbiBpbml0aWFsaXplciwgRGFydFR5cGUgZGVjbGFyZWRUeXBlKSB7CiAgICBhc3NlcnQoY2xvc3VyZUNvbnRleHQgPT0gbnVsbCk7CiAgICB0aGlzLmhlbHBlciA9IGhlbHBlcjsKICAgIGFzc2VydChkZWNsYXJlZFR5cGUgIT0gbnVsbCk7CiAgICB2YXIgYWN0dWFsVHlwZSA9IGluZmVyRXhwcmVzc2lvbihpbml0aWFsaXplciwgZGVjbGFyZWRUeXBlLCB0cnVlKTsKICAgIGVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgZGVjbGFyZWRUeXBlLCBhY3R1YWxUeXBlLCBpbml0aWFsaXplciwgaW5pdGlhbGl6ZXIuZmlsZU9mZnNldCk7CiAgICB0aGlzLmhlbHBlciA9IG51bGw7CiAgfQoKICAvLy8gUGVyZm9ybXMgdGhlIGNvcmUgdHlwZSBpbmZlcmVuY2UgYWxnb3JpdGhtIGZvciBwcm9wZXJ0eSBnZXRzICh0aGlzIGhhbmRsZXMKICAvLy8gYm90aCBudWxsLWF3YXJlIGFuZCBub24tbnVsbC1hd2FyZSBwcm9wZXJ0eSBnZXRzKS4KICB2b2lkIGluZmVyUHJvcGVydHlHZXQoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBpbnQgZmlsZU9mZnNldCwgRGFydFR5cGUgdHlwZUNvbnRleHQsCiAgICAgIHtWYXJpYWJsZURlY2xhcmF0aW9uIHJlY2VpdmVyVmFyaWFibGUsCiAgICAgIFByb3BlcnR5R2V0IGRlc3VnYXJlZEdldCwKICAgICAgT2JqZWN0IGludGVyZmFjZU1lbWJlciwKICAgICAgTmFtZSBwcm9wZXJ0eU5hbWV9KSB7CiAgICAvLyBGaXJzdCBpbmZlciB0aGUgcmVjZWl2ZXIgc28gd2UgY2FuIGxvb2sgdXAgdGhlIGdldHRlciB0aGF0IHdhcyBpbnZva2VkLgogICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlOwogICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHsKICAgICAgcmVjZWl2ZXJUeXBlID0gdGhpc1R5cGU7CiAgICB9IGVsc2UgewogICAgICBpbmZlckV4cHJlc3Npb24ocmVjZWl2ZXIsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUpOwogICAgICByZWNlaXZlclR5cGUgPSBnZXRJbmZlcnJlZFR5cGUocmVjZWl2ZXIsIHRoaXMpOwogICAgfQogICAgcmVjZWl2ZXJWYXJpYWJsZT8udHlwZSA9IHJlY2VpdmVyVHlwZTsKICAgIHByb3BlcnR5TmFtZSA/Pz0gZGVzdWdhcmVkR2V0Lm5hbWU7CiAgICBpZiAoZGVzdWdhcmVkR2V0ICE9IG51bGwpIHsKICAgICAgaW50ZXJmYWNlTWVtYmVyID0gZmluZEludGVyZmFjZU1lbWJlcigKICAgICAgICAgIHJlY2VpdmVyVHlwZSwgcHJvcGVydHlOYW1lLCBmaWxlT2Zmc2V0LAogICAgICAgICAgZXJyb3JUZW1wbGF0ZTogdGVtcGxhdGVVbmRlZmluZWRHZXR0ZXIsCiAgICAgICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uLAogICAgICAgICAgcmVjZWl2ZXI6IHJlY2VpdmVyKTsKICAgICAgaWYgKGludGVyZmFjZU1lbWJlciBpcyBNZW1iZXIpIHsKICAgICAgICBpZiAoaW5zdHJ1bWVudGF0aW9uICE9IG51bGwgJiYgcmVjZWl2ZXJUeXBlID09IGNvbnN0IER5bmFtaWNUeXBlKCkpIHsKICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5yZWNvcmQodXJpLCBkZXN1Z2FyZWRHZXQuZmlsZU9mZnNldCwgJ3RhcmdldCcsCiAgICAgICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyKGludGVyZmFjZU1lbWJlcikpOwogICAgICAgIH0KICAgICAgICBkZXN1Z2FyZWRHZXQuaW50ZXJmYWNlVGFyZ2V0ID0gaW50ZXJmYWNlTWVtYmVyOwogICAgICB9CiAgICB9CiAgICB2YXIgaW5mZXJyZWRUeXBlID0gZ2V0Q2FsbGVlVHlwZShpbnRlcmZhY2VNZW1iZXIsIHJlY2VpdmVyVHlwZSk7CiAgICB2YXIgcmVwbGFjZWRFeHByZXNzaW9uID0gaGFuZGxlUHJvcGVydHlHZXRDb250cmF2YXJpYW5jZShyZWNlaXZlciwKICAgICAgICBpbnRlcmZhY2VNZW1iZXIsIGRlc3VnYXJlZEdldCwgZXhwcmVzc2lvbiwgaW5mZXJyZWRUeXBlLCBmaWxlT2Zmc2V0KTsKICAgIGlmICgoaW50ZXJmYWNlTWVtYmVyIGlzIFByb2NlZHVyZSAmJgogICAgICAgIGludGVyZmFjZU1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuTWV0aG9kKSkgewogICAgICBpbmZlcnJlZFR5cGUgPQogICAgICAgICAgaW5zdGFudGlhdGVUZWFyT2ZmKGluZmVycmVkVHlwZSwgdHlwZUNvbnRleHQsIHJlcGxhY2VkRXhwcmVzc2lvbik7CiAgICB9CiAgICBzdG9yZUluZmVycmVkVHlwZShleHByZXNzaW9uLCBpbmZlcnJlZFR5cGUpOwogIH0KCiAgLy8vIE1vZGlmaWVzIGEgdHlwZSBhcyBhcHByb3ByaWF0ZSB3aGVuIGluZmVycmluZyBhIGNsb3N1cmUgcmV0dXJuIHR5cGUuCiAgRGFydFR5cGUgaW5mZXJSZXR1cm5UeXBlKERhcnRUeXBlIHJldHVyblR5cGUpIHsKICAgIHJldHVybiByZXR1cm5UeXBlID8/IHR5cGVTY2hlbWFFbnZpcm9ubWVudC5udWxsVHlwZTsKICB9CgogIC8vLyBQZXJmb3JtcyB0eXBlIGluZmVyZW5jZSBvbiB0aGUgZ2l2ZW4gW3N0YXRlbWVudF0uCiAgLy8vCiAgLy8vIERlcml2ZWQgY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2l0aCBsb2dpYyB0aGF0IGRpc3BhdGNoZXMgb24KICAvLy8gdGhlIHN0YXRlbWVudCB0eXBlIGFuZCBjYWxscyB0aGUgYXBwcm9wcmlhdGUgc3BlY2lhbGl6ZWQgImluZmVyIiBtZXRob2QuCiAgdm9pZCBpbmZlclN0YXRlbWVudChTdGF0ZW1lbnQgc3RhdGVtZW50KTsKCiAgLy8vIFBlcmZvcm1zIHRoZSB0eXBlIGluZmVyZW5jZSBzdGVwcyBuZWNlc3NhcnkgdG8gaW5zdGFudGlhdGUgYSB0ZWFyLW9mZgogIC8vLyAoaWYgbmVjZXNzYXJ5KS4KICBEYXJ0VHlwZSBpbnN0YW50aWF0ZVRlYXJPZmYoCiAgICAgIERhcnRUeXBlIHRlYXJvZmZUeXBlLCBEYXJ0VHlwZSBjb250ZXh0LCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgIGlmICh0ZWFyb2ZmVHlwZSBpcyBGdW5jdGlvblR5cGUgJiYKICAgICAgICBjb250ZXh0IGlzIEZ1bmN0aW9uVHlwZSAmJgogICAgICAgIGNvbnRleHQudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICB2YXIgdHlwZVBhcmFtZXRlcnMgPSB0ZWFyb2ZmVHlwZS50eXBlUGFyYW1ldGVyczsKICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICB2YXIgaW5mZXJyZWRUeXBlcyA9IG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgVW5rbm93blR5cGUoKSk7CiAgICAgICAgdmFyIGluc3RhbnRpYXRlZFR5cGUgPSB0ZWFyb2ZmVHlwZS53aXRob3V0VHlwZVBhcmFtZXRlcnM7CiAgICAgICAgdHlwZVNjaGVtYUVudmlyb25tZW50LmluZmVyR2VuZXJpY0Z1bmN0aW9uT3JUeXBlKAogICAgICAgICAgICBpbnN0YW50aWF0ZWRUeXBlLCB0eXBlUGFyYW1ldGVycywgW10sIFtdLCBjb250ZXh0LCBpbmZlcnJlZFR5cGVzKTsKICAgICAgICBpZiAoIWlzVG9wTGV2ZWwpIHsKICAgICAgICAgIHZhciBwYXJlbnQgPSBleHByZXNzaW9uLnBhcmVudDsKICAgICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoCiAgICAgICAgICAgICAgZXhwcmVzc2lvbiwKICAgICAgICAgICAgICBuZXcgSW5zdGFudGlhdGlvbihleHByZXNzaW9uLCBpbmZlcnJlZFR5cGVzKQogICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZXhwcmVzc2lvbi5maWxlT2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgdmFyIHN1YnN0aXR1dGlvbiA9CiAgICAgICAgICAgIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnModHlwZVBhcmFtZXRlcnMsIGluZmVycmVkVHlwZXMpOwogICAgICAgIHJldHVybiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoaW5zdGFudGlhdGVkVHlwZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0ZWFyb2ZmVHlwZTsKICB9CgogIC8vLyBUcnVlIGlmIHRoZSByZXR1cm5lZCBbdHlwZV0gaGFzIG5vbi1jb3ZhcmlhbnQgb2NjdXJyZW5jZXMgb2YgYW55IG9mCiAgLy8vIFtjbGFzc19dJ3MgdHlwZSBwYXJhbWV0ZXJzLgogIC8vLwogIC8vLyBBIG5vbi1jb3ZhcmlhbnQgb2NjdXJyZW5jZSBvZiBhIHR5cGUgcGFyYW1ldGVyIGlzIGVpdGhlciBhIGNvbnRyYXZhcmlhbnQKICAvLy8gb3IgYW4gaW52YXJpYW50IHBvc2l0aW9uLgogIC8vLwogIC8vLyBBIGNvbnRyYXZhcmlhbnQgcG9zaXRpb24gaXMgdG8gdGhlIGxlZnQgb2YgYW4gb2RkIG51bWJlciBvZiBhcnJvd3MuIEZvcgogIC8vLyBleGFtcGxlLCBUIG9jY3VycyBjb250cmF2YXJpYW50bHkgaW4gVCAtPiBUMCwgVDAgLT4gKFQgLT4gVDEpLAogIC8vLyAoVDAgLT4gVCkgLT4gVDEgYnV0IG5vdCBpbiAoVCAtPiBUMCkgLT4gVDEuCiAgLy8vCiAgLy8vIEFuIGludmFyaWFudCBwb3NpdGlvbiBpcyB3aXRob3V0IGEgYm91bmQgb2YgYSB0eXBlIHBhcmFtZXRlci4gRm9yIGV4YW1wbGUsCiAgLy8vIFQgb2NjdXJzIGludmFyaWFudGx5IGluIGBTIEZ1bmN0aW9uPFMgZXh0ZW5kcyBUPigpYCBhbmQKICAvLy8gYHZvaWQgRnVuY3Rpb248UyBleHRlbmRzIEM8VD4+KFMpYC4KICBzdGF0aWMgYm9vbCByZXR1cm5lZFR5cGVQYXJhbWV0ZXJzT2NjdXJOb25Db3ZhcmlhbnRseSgKICAgICAgQ2xhc3MgY2xhc3NfLCBEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAoY2xhc3NfLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybiBmYWxzZTsKICAgIEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNOb25Db3ZhcmlhbnRseSBjaGVja2VyID0KICAgICAgICBuZXcgSW5jbHVkZXNUeXBlUGFyYW1ldGVyc05vbkNvdmFyaWFudGx5KGNsYXNzXy50eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgLy8gV2UgYXJlIGNoZWNraW5nIHRoZSByZXR1cm5lZCB0eXBlIChmaWVsZC9nZXR0ZXIgdHlwZSBvciByZXR1cm4KICAgICAgICAgICAgLy8gdHlwZSBvZiBhIG1ldGhvZCkgYW5kIHRoaXMgaXMgYSBjb3ZhcmlhbnQgcG9zaXRpb24uCiAgICAgICAgICAgIGluaXRpYWxWYXJpYW5jZTogVmFyaWFuY2UuY292YXJpYW50KTsKICAgIHJldHVybiB0eXBlLmFjY2VwdChjaGVja2VyKTsKICB9CgogIC8vLyBEZXRlcm1pbmVzIHRoZSBkaXNwYXRjaCBjYXRlZ29yeSBvZiBhIFtNZXRob2RJbnZvY2F0aW9uXSBhbmQgcmV0dXJucyBhCiAgLy8vIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFuICJhcyIgY2hlY2sgd2lsbCBuZWVkIHRvIGJlIGFkZGVkIGR1ZSB0bwogIC8vLyBjb250cmF2YXJpYW5jZS4KICBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZCBwcmVDaGVja0ludm9jYXRpb25Db250cmF2YXJpYW5jZSgKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlLAogICAgICBPYmplY3QgaW50ZXJmYWNlTWVtYmVyLAogICAgICBNZXRob2RJbnZvY2F0aW9uIGRlc3VnYXJlZEludm9jYXRpb24sCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgaWYgKGludGVyZmFjZU1lbWJlciBpcyBGaWVsZCB8fAogICAgICAgIGludGVyZmFjZU1lbWJlciBpcyBQcm9jZWR1cmUgJiYKICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5HZXR0ZXIpIHsKICAgICAgdmFyIGdldFR5cGUgPSBnZXRDYWxsZWVUeXBlKGludGVyZmFjZU1lbWJlciwgcmVjZWl2ZXJUeXBlKTsKICAgICAgaWYgKGdldFR5cGUgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgICByZXR1cm4gTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQubm9uZTsKICAgICAgfQogICAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCAmJiByZWNlaXZlciBpcyEgVGhpc0V4cHJlc3Npb24pIHsKICAgICAgICBpZiAoKGludGVyZmFjZU1lbWJlciBpcyBGaWVsZCAmJgogICAgICAgICAgICAgICAgcmV0dXJuZWRUeXBlUGFyYW1ldGVyc09jY3VyTm9uQ292YXJpYW50bHkoCiAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLCBpbnRlcmZhY2VNZW1iZXIudHlwZSkpIHx8CiAgICAgICAgICAgIChpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgICAgICAgICByZXR1cm5lZFR5cGVQYXJhbWV0ZXJzT2NjdXJOb25Db3ZhcmlhbnRseSgKICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZ1bmN0aW9uLnJldHVyblR5cGUpKSkgewogICAgICAgICAgcmV0dXJuIE1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kLmNoZWNrR2V0dGVyUmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChyZWNlaXZlciAhPSBudWxsICYmCiAgICAgICAgcmVjZWl2ZXIgaXMhIFRoaXNFeHByZXNzaW9uICYmCiAgICAgICAgaW50ZXJmYWNlTWVtYmVyIGlzIFByb2NlZHVyZSAmJgogICAgICAgIHJldHVybmVkVHlwZVBhcmFtZXRlcnNPY2N1ck5vbkNvdmFyaWFudGx5KAogICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3MsCiAgICAgICAgICAgIGludGVyZmFjZU1lbWJlci5mdW5jdGlvbi5yZXR1cm5UeXBlKSkgewogICAgICByZXR1cm4gTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQuY2hlY2tNZXRob2RSZXR1cm47CiAgICB9CiAgICByZXR1cm4gTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQubm9uZTsKICB9CgogIC8vLyBJZiB0aGUgZ2l2ZW4gW3R5cGVdIGlzIGEgW1R5cGVQYXJhbWV0ZXJUeXBlXSwgcmVzb2x2ZSBpdCB0byBpdHMgYm91bmQuCiAgRGFydFR5cGUgcmVzb2x2ZVR5cGVQYXJhbWV0ZXIoRGFydFR5cGUgdHlwZSkgewogICAgRGFydFR5cGUgcmVzb2x2ZU9uZVN0ZXAoRGFydFR5cGUgdHlwZSkgewogICAgICBpZiAodHlwZSBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICAgIHJldHVybiB0eXBlLmJvdW5kOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CgogICAgdmFyIHJlc29sdmVkID0gcmVzb2x2ZU9uZVN0ZXAodHlwZSk7CiAgICBpZiAocmVzb2x2ZWQgPT0gbnVsbCkgcmV0dXJuIHR5cGU7CgogICAgLy8gRGV0ZWN0IGNpcmN1bGFyaXRpZXMgdXNpbmcgdGhlIHRvcnRvaXNlLWFuZC1oYXJlIGFsZ29yaXRobS4KICAgIHR5cGUgPSByZXNvbHZlZDsKICAgIERhcnRUeXBlIGhhcmUgPSByZXNvbHZlT25lU3RlcCh0eXBlKTsKICAgIGlmIChoYXJlID09IG51bGwpIHJldHVybiB0eXBlOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKGlkZW50aWNhbCh0eXBlLCBoYXJlKSkgewogICAgICAgIC8vIFdlIGZvdW5kIGEgY2lyY3VsYXJpdHkuICBHaXZlIHVwIGFuZCByZXR1cm4gYGR5bmFtaWNgLgogICAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICB9CgogICAgICAvLyBIYXJlIHRha2VzIHR3byBzdGVwcwogICAgICB2YXIgc3RlcDEgPSByZXNvbHZlT25lU3RlcChoYXJlKTsKICAgICAgaWYgKHN0ZXAxID09IG51bGwpIHJldHVybiBoYXJlOwogICAgICB2YXIgc3RlcDIgPSByZXNvbHZlT25lU3RlcChzdGVwMSk7CiAgICAgIGlmIChzdGVwMiA9PSBudWxsKSByZXR1cm4gaGFyZTsKICAgICAgaGFyZSA9IHN0ZXAyOwoKICAgICAgLy8gVG9ydG9pc2UgdGFrZXMgb25lIHN0ZXAKICAgICAgdHlwZSA9IHJlc29sdmVPbmVTdGVwKHR5cGUpOwogICAgfQogIH0KCiAgRGFydFR5cGUgd3JhcEZ1dHVyZU9yVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgaWRlbnRpY2FsKHR5cGUuY2xhc3NOb2RlLCBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcykpIHsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CiAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IElmIFt0eXBlXSBpcyBhIHN1YnR5cGUgb2YgYEZ1dHVyZWAsIHNob3VsZCB3ZSBqdXN0CiAgICAvLyByZXR1cm4gaXQgdW5tb2RpZmllZD8KICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcywgPERhcnRUeXBlPlt0eXBlID8/IGNvbnN0IER5bmFtaWNUeXBlKCldKTsKICB9CgogIERhcnRUeXBlIHdyYXBGdXR1cmVUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIHZhciB0eXBlV2l0aG91dEZ1dHVyZU9yID0gdHlwZSA/PyBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgIGNvcmVUeXBlcy5mdXR1cmVDbGFzcywgPERhcnRUeXBlPlt0eXBlV2l0aG91dEZ1dHVyZU9yXSk7CiAgfQoKICBEYXJ0VHlwZSB3cmFwVHlwZShEYXJ0VHlwZSB0eXBlLCBDbGFzcyBjbGFzc18pIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShjbGFzc18sIDxEYXJ0VHlwZT5bdHlwZSA/PyBjb25zdCBEeW5hbWljVHlwZSgpXSk7CiAgfQoKICB2b2lkIF9mb3JFYWNoQXJndW1lbnQoCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsIHZvaWQgY2FsbGJhY2soU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikpIHsKICAgIGZvciAodmFyIGV4cHJlc3Npb24gaW4gYXJndW1lbnRzLnBvc2l0aW9uYWwpIHsKICAgICAgY2FsbGJhY2sobnVsbCwgZXhwcmVzc2lvbik7CiAgICB9CiAgICBmb3IgKHZhciBuYW1lZEV4cHJlc3Npb24gaW4gYXJndW1lbnRzLm5hbWVkKSB7CiAgICAgIGNhbGxiYWNrKG5hbWVkRXhwcmVzc2lvbi5uYW1lLCBuYW1lZEV4cHJlc3Npb24udmFsdWUpOwogICAgfQogIH0KCiAgTWVtYmVyIF9nZXRJbnRlcmZhY2VNZW1iZXIoCiAgICAgIENsYXNzIGNsYXNzXywgTmFtZSBuYW1lLCBib29sIHNldHRlciwgaW50IGNoYXJPZmZzZXQpIHsKICAgIE1lbWJlciBtZW1iZXIgPSBlbmdpbmUuaGllcmFyY2h5QnVpbGRlci5nZXRDb21iaW5lZE1lbWJlclNpZ25hdHVyZUtlcm5lbCgKICAgICAgICBjbGFzc18sIG5hbWUsIHNldHRlciwgY2hhck9mZnNldCwgbGlicmFyeSk7CiAgICBpZiAobWVtYmVyID09IG51bGwgJiYgKGxpYnJhcnk/LmlzUGF0Y2ggPz8gZmFsc2UpKSB7CiAgICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBIYWNrIGZvciBwYXJ0cy4KICAgICAgbWVtYmVyID8/PQogICAgICAgICAgY2xhc3NIaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVyKGNsYXNzXywgbmFtZSwgc2V0dGVyOiBzZXR0ZXIpOwogICAgfQogICAgcmV0dXJuIFR5cGVJbmZlcmVuY2VFbmdpbmUucmVzb2x2ZUluZmVyZW5jZU5vZGUobWVtYmVyKTsKICB9CgogIC8vLyBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBbZXhwcmVzc2lvbl0ncyB0eXBlIGlzIHByZWNpc2VseSBrbm93biBhdCBjb21waWxlCiAgLy8vIHRpbWUuCiAgLy8vCiAgLy8vIElmIGl0IGlzLCBhbiBlcnJvciBtZXNzYWdlIHRlbXBsYXRlIGlzIHJldHVybmVkLCB3aGljaCBjYW4gYmUgdXNlZCBieSB0aGUKICAvLy8gY2FsbGVyIHRvIHJlcG9ydCBhbiBpbnZhbGlkIGNhc3QuICBPdGhlcndpc2UsIGBudWxsYCBpcyByZXR1cm5lZC4KICBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlLCBEYXJ0VHlwZSk+IF9nZXRQcmVjaXNlVHlwZUVycm9yVGVtcGxhdGUoCiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgaWYgKGV4cHJlc3Npb24gaXMgTGlzdExpdGVyYWwpIHsKICAgICAgcmV0dXJuIHRlbXBsYXRlSW52YWxpZENhc3RMaXRlcmFsTGlzdDsKICAgIH0KICAgIGlmIChleHByZXNzaW9uIGlzIE1hcExpdGVyYWwpIHsKICAgICAgcmV0dXJuIHRlbXBsYXRlSW52YWxpZENhc3RMaXRlcmFsTWFwOwogICAgfQogICAgaWYgKGV4cHJlc3Npb24gaXMgU2V0TGl0ZXJhbCkgewogICAgICByZXR1cm4gdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxTZXQ7CiAgICB9CiAgICBpZiAoZXhwcmVzc2lvbiBpcyBGdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgcmV0dXJuIHRlbXBsYXRlSW52YWxpZENhc3RGdW5jdGlvbkV4cHI7CiAgICB9CiAgICBpZiAoZXhwcmVzc2lvbiBpcyBDb25zdHJ1Y3Rvckludm9jYXRpb24pIHsKICAgICAgcmV0dXJuIHRlbXBsYXRlSW52YWxpZENhc3ROZXdFeHByOwogICAgfQogICAgaWYgKGV4cHJlc3Npb24gaXMgU3RhdGljR2V0KSB7CiAgICAgIHZhciB0YXJnZXQgPSBleHByZXNzaW9uLnRhcmdldDsKICAgICAgaWYgKHRhcmdldCBpcyBQcm9jZWR1cmUgJiYgdGFyZ2V0LmtpbmQgPT0gUHJvY2VkdXJlS2luZC5NZXRob2QpIHsKICAgICAgICBpZiAodGFyZ2V0LmVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZUludmFsaWRDYXN0U3RhdGljTWV0aG9kOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gdGVtcGxhdGVJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb247CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGV4cHJlc3Npb24gaXMgVmFyaWFibGVHZXQpIHsKICAgICAgdmFyIHZhcmlhYmxlID0gZXhwcmVzc2lvbi52YXJpYWJsZTsKICAgICAgaWYgKHZhcmlhYmxlIGlzIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCAmJgogICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50LmlzTG9jYWxGdW5jdGlvbih2YXJpYWJsZSkpIHsKICAgICAgICByZXR1cm4gdGVtcGxhdGVJbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb247CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgYm9vbCBfc2hvdWxkVGVhck9mZkNhbGwoRGFydFR5cGUgZXhwZWN0ZWRUeXBlLCBEYXJ0VHlwZSBhY3R1YWxUeXBlKSB7CiAgICBpZiAoZXhwZWN0ZWRUeXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICBleHBlY3RlZFR5cGUuY2xhc3NOb2RlID09IHR5cGVTY2hlbWFFbnZpcm9ubWVudC5mdXR1cmVPckNsYXNzKSB7CiAgICAgIGV4cGVjdGVkVHlwZSA9IChleHBlY3RlZFR5cGUgYXMgSW50ZXJmYWNlVHlwZSkudHlwZUFyZ3VtZW50c1swXTsKICAgIH0KICAgIGlmIChleHBlY3RlZFR5cGUgaXMgRnVuY3Rpb25UeXBlKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChleHBlY3RlZFR5cGUgPT0gdHlwZVNjaGVtYUVudmlyb25tZW50LnJhd0Z1bmN0aW9uVHlwZSkgewogICAgICBpZiAoIXR5cGVTY2hlbWFFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihhY3R1YWxUeXBlLCBleHBlY3RlZFR5cGUpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIE1peGluSW5mZXJyZXIgewogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CiAgZmluYWwgVHlwZUNvbnN0cmFpbnRHYXRoZXJlciBnYXRoZXJlcjsKCiAgTWl4aW5JbmZlcnJlcih0aGlzLmNvcmVUeXBlcywgdGhpcy5nYXRoZXJlcik7CgogIFN1cGVydHlwZSBhc0luc3RhbnRpYXRpb25PZihTdXBlcnR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcyk7CgogIHZvaWQgcmVwb3J0UHJvYmxlbShNZXNzYWdlIG1lc3NhZ2UsIENsYXNzIGNscyk7CgogIHZvaWQgZ2VuZXJhdGVDb25zdHJhaW50cygKICAgICAgQ2xhc3MgbWl4aW5DbGFzcywgU3VwZXJ0eXBlIGJhc2VUeXBlLCBTdXBlcnR5cGUgbWl4aW5TdXBlcnR5cGUpIHsKICAgIGlmIChtaXhpblN1cGVydHlwZS50eXBlQXJndW1lbnRzLmlzRW1wdHkpIHsKICAgICAgLy8gVGhlIHN1cGVydHlwZSBjb25zdHJhaW50IGlzbid0IGdlbmVyaWM7IGl0IGRvZXNuJ3QgY29uc3RyYWluIGFueXRoaW5nLgogICAgfSBlbHNlIGlmIChtaXhpblN1cGVydHlwZS5jbGFzc05vZGUuaXNBbm9ueW1vdXNNaXhpbikgewogICAgICAvLyBXZSBoYXZlIGVpdGhlciBhIG1peGluIGRlY2xhcmF0aW9uIGBtaXhpbiBNPFgwLCAuLi4sIFhuPiBvbiBTMCwgUzFgIG9yCiAgICAgIC8vIGEgVk0tc3R5bGUgc3VwZXIgbWl4aW4gYGFic3RyYWN0IGNsYXNzIE08WDAsIC4uLiwgWG4+IGV4dGVuZHMgUzAgd2l0aAogICAgICAvLyBTMWAgd2hlcmUgUzAgYW5kIFMxIGFyZSBzdXBlcmNsYXNzIGNvbnN0cmFpbnRzIHRoYXQgcG9zc2libHkgaGF2ZSB0eXBlCiAgICAgIC8vIGFyZ3VtZW50cy4KICAgICAgLy8KICAgICAgLy8gSXQgaGFzIGJlZW4gY29tcGlsZWQgYnkgbmFtaW5nIHRoZSBzdXBlcmNsYXNzIHRvIGVpdGhlcjoKICAgICAgLy8KICAgICAgLy8gYWJzdHJhY3QgY2xhc3MgUzAmUzE8Li4uPiBleHRlbmRzIE9iamVjdCBpbXBsZW1lbnRzIFMwLCBTMSB7fQogICAgICAvLyBhYnN0cmFjdCBjbGFzcyBNPFgwLCAuLi4sIFhuPiBleHRlbmRzIFMwJlMxPC4uLj4gLi4uCiAgICAgIC8vCiAgICAgIC8vIGZvciBhIG1peGluIGRlY2xhcmF0aW9uLCBvciBlbHNlOgogICAgICAvLwogICAgICAvLyBhYnN0cmFjdCBjbGFzcyBTMCZTMTwuLi4+ID0gUzAgd2l0aCBTMTsKICAgICAgLy8gYWJzdHJhY3QgY2xhc3MgTTxYMCwgLi4uLCBYbj4gZXh0ZW5kcyBTMCZTMTwuLi4+CiAgICAgIC8vCiAgICAgIC8vIGZvciBhIFZNLXN0eWxlIHN1cGVyIG1peGluLiAgVGhlIHR5cGUgcGFyYW1ldGVycyBvZiBTMCZTMSBhcmUgdGhlIFgwLAogICAgICAvLyAuLi4sIFhuIHRoYXQgb2NjdXJlZCBmcmVlIGluIFMwIGFuZCBTMS4gIFRyZWF0IFMwIGFuZCBTMSBhcyBzZXBhcmF0ZQogICAgICAvLyBzdXBlcnR5cGUgY29uc3RyYWludHMgYnkgcmVjdXJzaXZlbHkgY2FsbGluZyB0aGlzIGFsZ29yaXRobS4KICAgICAgLy8KICAgICAgLy8gSW4gdGhlIERhcnQgVk0gdGhlIG1peGluIGFwcGxpY2F0aW9uIGNsYXNzZXMgdGhlbXNlbHZlcyBhcmUgYWxsCiAgICAgIC8vIGVsaW1pbmF0ZWQgYnkgdHJhbnNsYXRpbmcgdGhlbSB0byBub3JtYWwgY2xhc3Nlcy4gIEluIHRoYXQgY2FzZSwgdGhlCiAgICAgIC8vIG1peGluIGFwcGVhcnMgYXMgdGhlIG9ubHkgaW50ZXJmYWNlIGluIHRoZSBpbnRyb2R1Y2VkIGNsYXNzLiAgV2UKICAgICAgLy8gc3VwcG9ydCB0aHJlZSBmb3JtcyBmb3IgdGhlIHN1cGVyY2xhc3MgY29uc3RyYWludHM6CiAgICAgIC8vCiAgICAgIC8vIGFic3RyYWN0IGNsYXNzIFMwJlMxPC4uLj4gZXh0ZW5kcyBPYmplY3QgaW1wbGVtZW50cyBTMCwgUzEge30KICAgICAgLy8gYWJzdHJhY3QgY2xhc3MgUzAmUzE8Li4uPiA9IFMwIHdpdGggUzE7CiAgICAgIC8vIGFic3RyYWN0IGNsYXNzIFMwJlMxPC4uLj4gZXh0ZW5kcyBTMCBpbXBsZW1lbnRzIFMxIHt9CiAgICAgIHZhciBtaXhpblN1cGVyY2xhc3MgPSBtaXhpblN1cGVydHlwZS5jbGFzc05vZGU7CiAgICAgIGlmIChtaXhpblN1cGVyY2xhc3MubWl4ZWRJblR5cGUgPT0gbnVsbCAmJgogICAgICAgICAgbWl4aW5TdXBlcmNsYXNzLmltcGxlbWVudGVkVHlwZXMubGVuZ3RoICE9IDEgJiYKICAgICAgICAgIChtaXhpblN1cGVyY2xhc3Muc3VwZXJjbGFzcyAhPSBjb3JlVHlwZXMub2JqZWN0Q2xhc3MgfHwKICAgICAgICAgICAgICBtaXhpblN1cGVyY2xhc3MuaW1wbGVtZW50ZWRUeXBlcy5sZW5ndGggIT0gMikpIHsKICAgICAgICB1bmV4cGVjdGVkKAogICAgICAgICAgICAnQ29tcGlsZXItZ2VuZXJhdGVkIG1peGluIGFwcGxpY2F0aW9ucyBoYXZlIGEgbWl4aW4gb3IgZWxzZSAnCiAgICAgICAgICAgICAgICAnaW1wbGVtZW50IGV4YWN0bHkgb25lIHR5cGUnLAogICAgICAgICAgICAnJG1peGluU3VwZXJjbGFzcyBpbXBsZW1lbnRzICcKICAgICAgICAgICAgICAgICcke21peGluU3VwZXJjbGFzcy5pbXBsZW1lbnRlZFR5cGVzLmxlbmd0aH0gdHlwZXMnLAogICAgICAgICAgICBtaXhpblN1cGVyY2xhc3MuZmlsZU9mZnNldCwKICAgICAgICAgICAgbWl4aW5TdXBlcmNsYXNzLmZpbGVVcmkpOwogICAgICB9CiAgICAgIHZhciBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVN1cGVydHlwZShtaXhpblN1cGVydHlwZSk7CiAgICAgIFN1cGVydHlwZSBzMCwgczE7CiAgICAgIGlmIChtaXhpblN1cGVyY2xhc3MuaW1wbGVtZW50ZWRUeXBlcy5sZW5ndGggPT0gMikgewogICAgICAgIHMwID0gbWl4aW5TdXBlcmNsYXNzLmltcGxlbWVudGVkVHlwZXNbMF07CiAgICAgICAgczEgPSBtaXhpblN1cGVyY2xhc3MuaW1wbGVtZW50ZWRUeXBlc1sxXTsKICAgICAgfSBlbHNlIGlmIChtaXhpblN1cGVyY2xhc3MuaW1wbGVtZW50ZWRUeXBlcy5sZW5ndGggPT0gMSkgewogICAgICAgIHMwID0gbWl4aW5TdXBlcmNsYXNzLnN1cGVydHlwZTsKICAgICAgICBzMSA9IG1peGluU3VwZXJjbGFzcy5pbXBsZW1lbnRlZFR5cGVzLmZpcnN0OwogICAgICB9IGVsc2UgewogICAgICAgIHMwID0gbWl4aW5TdXBlcmNsYXNzLnN1cGVydHlwZTsKICAgICAgICBzMSA9IG1peGluU3VwZXJjbGFzcy5taXhlZEluVHlwZTsKICAgICAgfQogICAgICBzMCA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlU3VwZXJ0eXBlKHMwKTsKICAgICAgczEgPSBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVN1cGVydHlwZShzMSk7CiAgICAgIGdlbmVyYXRlQ29uc3RyYWludHMobWl4aW5DbGFzcywgYmFzZVR5cGUsIHMwKTsKICAgICAgZ2VuZXJhdGVDb25zdHJhaW50cyhtaXhpbkNsYXNzLCBiYXNlVHlwZSwgczEpOwogICAgfSBlbHNlIHsKICAgICAgLy8gRmluZCB0aGUgdHlwZSBVMCB3aGljaCBpcyBiYXNlVHlwZSBhcyBhbiBpbnN0YW5jZSBvZiBtaXhpblN1cGVydHlwZSdzCiAgICAgIC8vIGNsYXNzLgogICAgICBTdXBlcnR5cGUgc3VwZXJ0eXBlID0KICAgICAgICAgIGFzSW5zdGFudGlhdGlvbk9mKGJhc2VUeXBlLCBtaXhpblN1cGVydHlwZS5jbGFzc05vZGUpOwogICAgICBpZiAoc3VwZXJ0eXBlID09IG51bGwpIHsKICAgICAgICByZXBvcnRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZU1peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzLndpdGhBcmd1bWVudHMobWl4aW5DbGFzcy5uYW1lLAogICAgICAgICAgICAgICAgYmFzZVR5cGUuY2xhc3NOb2RlLm5hbWUsIG1peGluU3VwZXJ0eXBlLmFzSW50ZXJmYWNlVHlwZSksCiAgICAgICAgICAgIG1peGluQ2xhc3MpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBJbnRlcmZhY2VUeXBlIHUwID0gU3Vic3RpdHV0aW9uLmZyb21TdXBlcnR5cGUoYmFzZVR5cGUpCiAgICAgICAgICAuc3Vic3RpdHV0ZVN1cGVydHlwZShzdXBlcnR5cGUpCiAgICAgICAgICAuYXNJbnRlcmZhY2VUeXBlOwogICAgICAvLyBXZSB3YW50IHRvIHNvbHZlIFUwID0gUzAgd2hlcmUgUzAgaXMgbWl4aW5TdXBlcnR5cGUsIGJ1dCB3ZSBvbmx5IGhhdmUKICAgICAgLy8gYSBzdWJ0eXBlIGNvbnN0cmFpbnRzLiAgU29sdmUgZm9yIGVxdWFsaXR5IGJ5IHNvbHZpbmcKICAgICAgLy8gYm90aCBVMCA8OiBTMCBhbmQgUzAgPDogVTAuCiAgICAgIEludGVyZmFjZVR5cGUgczAgPSBtaXhpblN1cGVydHlwZS5hc0ludGVyZmFjZVR5cGU7CiAgICAgIGdhdGhlcmVyLnRyeVN1YnR5cGVNYXRjaCh1MCwgczApOwogICAgICBnYXRoZXJlci50cnlTdWJ0eXBlTWF0Y2goczAsIHUwKTsKICAgIH0KICB9CgogIHZvaWQgaW5mZXIoQ2xhc3MgY2xhc3NOb2RlKSB7CiAgICBTdXBlcnR5cGUgbWl4ZWRJblR5cGUgPSBjbGFzc05vZGUubWl4ZWRJblR5cGU7CiAgICBhc3NlcnQobWl4ZWRJblR5cGUudHlwZUFyZ3VtZW50cy5ldmVyeSgodCkgPT4gdCA9PSBjb25zdCBVbmtub3duVHlwZSgpKSk7CiAgICAvLyBOb3RlIHRoYXQgd2UgaGF2ZSBubyBhbm9ueW1vdXMgbWl4aW4gYXBwbGljYXRpb25zLCB0aGV5IGhhdmUgYWxsCiAgICAvLyBiZWVuIG5hbWVkLiAgTm90ZSBhbHNvIHRoYXQgbWl4aW4gY29tcG9zaXRpb24gaGFzIGJlZW4gdHJhbnNsYXRlZAogICAgLy8gc28gdGhhdCB3ZSBvbmx5IGhhdmUgbWl4aW4gYXBwbGljYXRpb25zIG9mIHRoZSBmb3JtIGBTIHdpdGggTWAuCiAgICBTdXBlcnR5cGUgYmFzZVR5cGUgPSBjbGFzc05vZGUuc3VwZXJ0eXBlOwogICAgQ2xhc3MgbWl4aW5DbGFzcyA9IG1peGVkSW5UeXBlLmNsYXNzTm9kZTsKICAgIFN1cGVydHlwZSBtaXhpblN1cGVydHlwZSA9IG1peGluQ2xhc3Muc3VwZXJ0eXBlOwogICAgLy8gR2VuZXJhdGUgY29uc3RyYWludHMgYmFzZWQgb24gdGhlIG1peGluJ3Mgc3VwZXJ0eXBlLgogICAgZ2VuZXJhdGVDb25zdHJhaW50cyhtaXhpbkNsYXNzLCBiYXNlVHlwZSwgbWl4aW5TdXBlcnR5cGUpOwogICAgLy8gU29sdmUgdGhlbSB0byBnZXQgYSBtYXAgZnJvbSB0eXBlIHBhcmFtZXRlcnMgdG8gdXBwZXIgYW5kIGxvd2VyCiAgICAvLyBib3VuZHMuCiAgICB2YXIgcmVzdWx0ID0gZ2F0aGVyZXIuY29tcHV0ZUNvbnN0cmFpbnRzKCk7CiAgICAvLyBHZW5lcmF0ZSBuZXcgdHlwZSBwYXJhbWV0ZXJzIHdpdGggdGhlIHNvbHV0aW9uIGFzIGJvdW5kcy4KICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG1peGluQ2xhc3MudHlwZVBhcmFtZXRlcnMubWFwKChwKSB7CiAgICAgIHZhciBjb25zdHJhaW50ID0gcmVzdWx0W3BdOwogICAgICAvLyBCZWNhdXNlIHdlIHNvbHZlZCBmb3IgZXF1YWxpdHksIGEgdmFsaWQgc29sdXRpb24gaGFzIGEgcGFyYW1ldGVyCiAgICAgIC8vIGVpdGhlciB1bmNvbnN0cmFpbmVkIG9yIGVsc2Ugd2l0aCBpZGVudGljYWwgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcy4KICAgICAgaWYgKGNvbnN0cmFpbnQgIT0gbnVsbCAmJiBjb25zdHJhaW50LnVwcGVyICE9IGNvbnN0cmFpbnQubG93ZXIpIHsKICAgICAgICByZXBvcnRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZU1peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzLndpdGhBcmd1bWVudHMobWl4aW5DbGFzcy5uYW1lLAogICAgICAgICAgICAgICAgYmFzZVR5cGUuY2xhc3NOb2RlLm5hbWUsIG1peGluU3VwZXJ0eXBlLmFzSW50ZXJmYWNlVHlwZSksCiAgICAgICAgICAgIG1peGluQ2xhc3MpOwogICAgICAgIHJldHVybiBwOwogICAgICB9CiAgICAgIGFzc2VydChjb25zdHJhaW50ID09IG51bGwgfHwgY29uc3RyYWludC51cHBlciA9PSBjb25zdHJhaW50Lmxvd2VyKTsKICAgICAgYm9vbCBleGFjdCA9CiAgICAgICAgICBjb25zdHJhaW50ICE9IG51bGwgJiYgY29uc3RyYWludC51cHBlciAhPSBjb25zdCBVbmtub3duVHlwZSgpOwogICAgICByZXR1cm4gbmV3IFR5cGVQYXJhbWV0ZXIoCiAgICAgICAgICBwLm5hbWUsIGV4YWN0ID8gY29uc3RyYWludC51cHBlciA6IHAuYm91bmQsIHAuZGVmYXVsdFR5cGUpOwogICAgfSkudG9MaXN0KCk7CiAgICAvLyBCb3VuZHMgbWlnaHQgbWVudGlvbiB0aGUgbWl4aW4gY2xhc3MncyB0eXBlIHBhcmFtZXRlcnMgc28gd2UgaGF2ZSB0bwogICAgLy8gc3Vic3RpdHV0ZSB0aGVtIGJlZm9yZSBjYWxsaW5nIGluc3RhbnRpYXRlIHRvIGJvdW5kcy4KICAgIHZhciBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKG1peGluQ2xhc3MudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgcGFyYW1ldGVycy5tYXAoKHApID0+IG5ldyBUeXBlUGFyYW1ldGVyVHlwZShwKSkudG9MaXN0KCkpOwogICAgZm9yICh2YXIgcCBpbiBwYXJhbWV0ZXJzKSB7CiAgICAgIHAuYm91bmQgPSBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUocC5ib3VuZCk7CiAgICB9CiAgICAvLyBVc2UgaW5zdGFudGlhdGUgdG8gYm91bmRzLgogICAgTGlzdDxEYXJ0VHlwZT4gYm91bmRzID0gY2FsY3VsYXRlQm91bmRzKHBhcmFtZXRlcnMsIGNvcmVUeXBlcy5vYmplY3RDbGFzcyk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG1peGVkSW5UeXBlLnR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgbWl4ZWRJblR5cGUudHlwZUFyZ3VtZW50c1tpXSA9IGJvdW5kc1tpXTsKICAgIH0KICB9Cn0KCi8vLyBUaGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24gaW5mZXJlbmNlLgpjbGFzcyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHsKICBmaW5hbCBFeHByZXNzaW9uIGV4cHJlc3Npb247CiAgZmluYWwgRGFydFR5cGUgdHlwZTsKCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCh0aGlzLmV4cHJlc3Npb24sIHRoaXMudHlwZSk7Cn0KiAwATU4/ASwBIQkTFhUUDx8fEhUUDxwWFhcXFR4NFRQQGg4VExcVFRkUExMfGhoTGBIXGx0VEgFCATgBKi8BRQEpCRknJSkBHQkYERInKB8SKykpNT0jKSgnJyokKS0jLyEhIQE/AUIBKgkcIxwlIhkBQgE2AUcBNQFEASROATABNQE8ASYJHyQgHwFOOUkxLAQPAgFLNUgyLQsRBAIBNSEeHhwCAU0O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GDoyMkEoNQ8oKggxMTU1DU8QHEEfF1FKGRAIPiocTz8lOSgoBgQBIDNOSElHLi41PD9HDzBBSSJKTUgXUUoZEghKE0kgRhFMPUlDIDYGIlBBMAYEAgErIh8XATkCAT1wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcnJlci5kYXJ0R3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX3Byb21vdGlvbi5kYXJ0wABxoy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93IERhcnRUeXBlLCBFeHByZXNzaW9uLCBUeXBlUGFyYW1ldGVyVHlwZSwgVmFyaWFibGVEZWNsYXJhdGlvbjsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHk7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgaW50ZXJuYWxQcm9ibGVtOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX3NoYWRvd19hc3QuZGFydCcgc2hvdyBTaGFkb3dUeXBlUHJvbW90ZXI7CgppbXBvcnQgJ3R5cGVfc2NoZW1hX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZVNjaGVtYUVudmlyb25tZW50OwoKLy8vIEtlZXBzIHRyYWNrIG9mIHRoZSBzdGF0ZSBuZWNlc3NhcnkgdG8gcGVyZm9ybSB0eXBlIHByb21vdGlvbi4KLy8vCi8vLyBUaGVvcnkgb2Ygb3BlcmF0aW9uOiBkdXJpbmcgcGFyc2luZywgdGhlIEJvZHlCdWlsZGVyIGNhbGxzIG1ldGhvZHMgaW4gdGhpcwovLy8gY2xhc3MgdG8gaW5mb3JtIGl0IG9mIHN5bnRhY3RpYyBjb25zdHJ1Y3RzIHRoYXQgYXJlIGVuY291bnRlcmVkLiAgVGhvc2UKLy8vIG1ldGhvZHMgbWFpbnRhaW4gYSBsaW5rZWQgbGlzdCBvZiBbVHlwZVByb21vdGlvbkZhY3RdIG9iamVjdHMgdHJhY2tpbmcgd2hhdAovLy8gaXMga25vd24gYWJvdXQgdGhlIHN0YXRlIG9mIGVhY2ggdmFyaWFibGUgYXQgdGhlIGN1cnJlbnQgcG9pbnQgaW4gdGhlIGNvZGUsCi8vLyBhcyB3ZWxsIGFzIGEgbGlua2VkIGxpc3Qgb2YgW1R5cGVQcm9tb3Rpb25TY29wZV0gb2JqZWN0cyB0cmFja2luZyB0aGUKLy8vIGNvbXBvbmVudCdzIG5lc3Rpbmcgc3RydWN0dXJlLiAgV2hlbmV2ZXIgYSB2YXJpYWJsZSBpcyByZWFkLCB0aGUgY3VycmVudAovLy8gW1R5cGVQcm9tb3Rpb25GYWN0XSBhbmQgW1R5cGVQcm9tb3Rpb25TY29wZV0gYXJlIHJlY29yZGVkIGZvciBsYXRlciB1c2UuCi8vLwovLy8gRHVyaW5nIHR5cGUgaW5mZXJlbmNlLCB0aGUgW1R5cGVJbmZlcnJlcl0gY2FsbHMgYmFjayBpbnRvIHRoaXMgY2xhc3MgdG8gYXNrCi8vLyB3aGV0aGVyIGVhY2ggdmFyaWFibGUgcmVhZCBpcyBhIHByb21vdGVkIHJlYWQuICBUaGlzIGlzIGRldGVybWluZWQgYnkKLy8vIGV4YW1pbmluZyB0aGUgW1R5cGVQcm9tb3Rpb25TY29wZV0gYW5kIFtUeXBlUHJvbW90aW9uRmFjdF0gb2JqZWN0cyB0aGF0IHdlcmUKLy8vIHJlY29yZGVkIGF0IHRoZSB0aW1lIHRoZSB2YXJpYWJsZSByZWFkIHdhcyBwYXJzZWQsIGFzIHdlbGwgYXMgb3RoZXIgc3RhdGUKLy8vIHRoYXQgbWF5IGhhdmUgYmVlbiB1cGRhdGVkIGxhdGVyIGR1cmluZyB0aGUgcGFyc2luZyBwcm9jZXNzLgovLy8KLy8vIFRoaXMgY2xhc3MgYWJzdHJhY3RzIGF3YXkgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIEFTVCB1c2luZwovLy8gZ2VuZXJpYyBwYXJhbWV0ZXJzLiAgRGVyaXZlZCBjbGFzc2VzIHNob3VsZCBzZXQgRSBhbmQgViB0byB0aGUgY2xhc3MgdGhleQovLy8gdXNlIHRvIHJlcHJlc2VudCBleHByZXNzaW9ucyBhbmQgdmFyaWFibGUgZGVjbGFyYXRpb25zLCByZXNwZWN0aXZlbHkuCmFic3RyYWN0IGNsYXNzIFR5cGVQcm9tb3RlciB7CiAgVHlwZVByb21vdGVyLnByaXZhdGUoKTsKCiAgZmFjdG9yeSBUeXBlUHJvbW90ZXIoVHlwZVNjaGVtYUVudmlyb25tZW50IHR5cGVTY2hlbWFFbnZpcm9ubWVudCkgPQogICAgICBTaGFkb3dUeXBlUHJvbW90ZXIucHJpdmF0ZTsKCiAgZmFjdG9yeSBUeXBlUHJvbW90ZXIuZGlzYWJsZWQoKSA9IFR5cGVQcm9tb3RlckRpc2FibGVkLnByaXZhdGU7CgogIC8vLyBSZXR1cm5zIHRoZSBjdXJyZW50IHR5cGUgcHJvbW90aW9uIHNjb3BlLgogIFR5cGVQcm9tb3Rpb25TY29wZSBnZXQgY3VycmVudFNjb3BlOwoKICAvLy8gQ29tcHV0ZXMgdGhlIHByb21vdGVkIHR5cGUgb2YgYSB2YXJpYWJsZSByZWFkIGhhdmluZyB0aGUgZ2l2ZW4gW2ZhY3RdIGFuZAogIC8vLyBbc2NvcGVdLiAgUmV0dXJucyBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gcHJvbW90aW9uLgogIC8vLwogIC8vLyBbbXV0YXRlZEluQ2xvc3VyZV0gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHZhcmlhYmxlIHdhcyBtdXRhdGVkIGluIGEgY2xvc3VyZQogIC8vLyBzb21ld2hlcmUgaW4gdGhlIG1ldGhvZC4KICBEYXJ0VHlwZSBjb21wdXRlUHJvbW90ZWRUeXBlKAogICAgICBUeXBlUHJvbW90aW9uRmFjdCBmYWN0LCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUsIGJvb2wgbXV0YXRlZEluQ2xvc3VyZSk7CgogIC8vLyBVcGRhdGVzIHRoZSBzdGF0ZSB0byByZWZsZWN0IHRoZSBmYWN0IHRoYXQgd2UgYXJlIGVudGVyaW5nIGFuICJlbHNlIgogIC8vLyBicmFuY2guCiAgdm9pZCBlbnRlckVsc2UoKTsKCiAgLy8vIFVwZGF0ZXMgdGhlIHN0YXRlIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB0aGUgTEhTIG9mIGFuICImJiIgb3IgInx8IgogIC8vLyBleHByZXNzaW9uIGhhcyBqdXN0IGJlZW4gcGFyc2VkLCBhbmQgd2UgYXJlIGVudGVyaW5nIHRoZSBSSFMuCiAgdm9pZCBlbnRlckxvZ2ljYWxFeHByZXNzaW9uKEV4cHJlc3Npb24gbGhzLCBTdHJpbmcgb3BlcmF0b3IpOwoKICAvLy8gVXBkYXRlcyB0aGUgc3RhdGUgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHRoZSAiY29uZGl0aW9uIiBwYXJ0IG9mIGFuICJpZiIKICAvLy8gc3RhdGVtZW50IG9yIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaGFzIGp1c3QgYmVlbiBwYXJzZWQsIGFuZCB3ZSBhcmUKICAvLy8gZW50ZXJpbmcgdGhlICJ0aGVuIiBicmFuY2guCiAgdm9pZCBlbnRlclRoZW4oRXhwcmVzc2lvbiBjb25kaXRpb24pOwoKICAvLy8gVXBkYXRlcyB0aGUgc3RhdGUgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgZXhpdGVkIHRoZSAiZWxzZSIKICAvLy8gYnJhbmNoIG9mIGFuICJpZiIgc3RhdGVtZW50IG9yIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCiAgdm9pZCBleGl0Q29uZGl0aW9uYWwoKTsKCiAgLy8vIFVwZGF0ZXMgdGhlIHN0YXRlIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIGV4aXRlZCB0aGUgUkhTIG9mIGFuCiAgLy8vICImJiIgb3IgInx8IiBleHByZXNzaW9uLgogIHZvaWQgZXhpdExvZ2ljYWxFeHByZXNzaW9uKEV4cHJlc3Npb24gcmhzLCBFeHByZXNzaW9uIGxvZ2ljYWxFeHByZXNzaW9uKTsKCiAgLy8vIFZlcmlmaWVzIHRoYXQgZW50ZXIvZXhpdCBjYWxscyB3ZXJlIHByb3Blcmx5IG5lc3RlZC4KICB2b2lkIGZpbmlzaGVkKCk7CgogIC8vLyBSZWNvcmRzIHRoYXQgdGhlIGdpdmVuIFt2YXJpYWJsZV0gd2FzIGFjY2Vzc2VkIGZvciByZWFkaW5nLCBhbmQgcmV0dXJucyBhCiAgLy8vIFtUeXBlUHJvbW90aW9uRmFjdF0gZGVzY3JpYmluZyB0aGUgdmFyaWFibGUncyBjdXJyZW50IHR5cGUgcHJvbW90aW9uCiAgLy8vIHN0YXRlLgogIC8vLwogIC8vLyBbZnVuY3Rpb25OZXN0aW5nTGV2ZWxdIHNob3VsZCBiZSB0aGUgY3VycmVudCBuZXN0aW5nIGxldmVsIG9mIGNsb3N1cmVzLgogIC8vLyBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YXJpYWJsZSB3YXMgYWNjZXNzZWQgaW4gYSBjbG9zdXJlLgogIFR5cGVQcm9tb3Rpb25GYWN0IGdldEZhY3RGb3JBY2Nlc3MoCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbCk7CgogIC8vLyBVcGRhdGVzIHRoZSBzdGF0ZSB0byByZWZsZWN0IHRoZSBmYWN0IHRoYXQgYW4gImlzIiBjaGVjayBvZiBhIGxvY2FsCiAgLy8vIHZhcmlhYmxlIHdhcyBqdXN0IHBhcnNlZC4KICB2b2lkIGhhbmRsZUlzQ2hlY2soRXhwcmVzc2lvbiBpc0V4cHJlc3Npb24sIGJvb2wgaXNJbnZlcnRlZCwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgRGFydFR5cGUgdHlwZSwgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKCiAgLy8vIFVwZGF0ZXMgdGhlIHN0YXRlIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB0aGUgZ2l2ZW4gW3ZhcmlhYmxlXSB3YXMKICAvLy8gbXV0YXRlZC4KICB2b2lkIG11dGF0ZVZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbCk7Cn0KCi8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbVHlwZVByb21vdGVyXSB3aGljaCBkb2Vzbid0IGRvIGFueSB0eXBlIHByb21vdGlvbi4KLy8vCi8vLyBUaGlzIGlzIGludGVuZGVkIGZvciBwcm9maWxpbmcsIHRvIGVuc3VyZSB0aGF0IHR5cGUgaW5mZXJlbmNlIGFuZCB0eXBlCi8vLyBwcm9tb3Rpb24gZG8gbm90IHNsb3cgZG93biBjb21waWxhdGlvbiB0b28gbXVjaC4KY2xhc3MgVHlwZVByb21vdGVyRGlzYWJsZWQgZXh0ZW5kcyBUeXBlUHJvbW90ZXIgewogIFR5cGVQcm9tb3RlckRpc2FibGVkLnByaXZhdGUoKSA6IHN1cGVyLnByaXZhdGUoKTsKCiAgQG92ZXJyaWRlCiAgVHlwZVByb21vdGlvblNjb3BlIGdldCBjdXJyZW50U2NvcGUgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgY29tcHV0ZVByb21vdGVkVHlwZShUeXBlUHJvbW90aW9uRmFjdCBmYWN0LCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUsCiAgICAgICAgICBib29sIG11dGF0ZWRJbkNsb3N1cmUpID0+CiAgICAgIG51bGw7CgogIEBvdmVycmlkZQogIHZvaWQgZW50ZXJFbHNlKCkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnRlckxvZ2ljYWxFeHByZXNzaW9uKEV4cHJlc3Npb24gbGhzLCBTdHJpbmcgb3BlcmF0b3IpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgZW50ZXJUaGVuKEV4cHJlc3Npb24gY29uZGl0aW9uKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIGV4aXRDb25kaXRpb25hbCgpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgZXhpdExvZ2ljYWxFeHByZXNzaW9uKEV4cHJlc3Npb24gcmhzLCBFeHByZXNzaW9uIGxvZ2ljYWxFeHByZXNzaW9uKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIGZpbmlzaGVkKCkge30KCiAgQG92ZXJyaWRlCiAgVHlwZVByb21vdGlvbkZhY3QgZ2V0RmFjdEZvckFjY2VzcygKICAgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbCkgPT4KICAgICAgbnVsbDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJc0NoZWNrKEV4cHJlc3Npb24gaXNFeHByZXNzaW9uLCBib29sIGlzSW52ZXJ0ZWQsCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIERhcnRUeXBlIHR5cGUsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbCkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCBtdXRhdGVWYXJpYWJsZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBpbnQgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpIHt9Cn0KCi8vLyBEZXJpdmVkIGNsYXNzIGNvbnRhaW5pbmcgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbnMgb2YgW1R5cGVQcm9tb3Rlcl0uCi8vLwovLy8gVGhpcyBjbGFzcyBjb250YWlucyBhcyBtdWNoIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlIHByb21vdGlvbiBhcwovLy8gcG9zc2libGUgd2l0aG91dCBuZWVkaW5nIGFjY2VzcyB0byBwcml2YXRlIG1lbWJlcnMgb2Ygc2hhZG93IG9iamVjdHMuICBJdAovLy8gZGVmZXJzIHRvIGFic3RyYWN0IG1ldGhvZHMgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KYWJzdHJhY3QgY2xhc3MgVHlwZVByb21vdGVySW1wbCBleHRlbmRzIFR5cGVQcm9tb3RlciB7CiAgZmluYWwgVHlwZVNjaGVtYUVudmlyb25tZW50IHR5cGVTY2hlbWFFbnZpcm9ubWVudDsKCiAgLy8vIFtUeXBlUHJvbW90aW9uRmFjdF0gcmVwcmVzZW50aW5nIHRoZSBpbml0aWFsIHN0YXRlIChubyBmYWN0cyBoYXZlIGJlZW4KICAvLy8gZGV0ZXJtaW5lZCB5ZXQpLgogIC8vLwogIC8vLyBBbGwgbGlua2VkIGxpc3RzIG9mIGZhY3RzIHRlcm1pbmF0ZSBpbiB0aGlzIG9iamVjdC4KICBmaW5hbCBfTnVsbEZhY3QgX251bGxGYWN0czsKCiAgLy8vIE1hcCBmcm9tIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHRvIHRoZSBtb3N0IHJlY2VudCBbVHlwZVByb21vdGlvbkZhY3RdCiAgLy8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFyaWFibGUuCiAgLy8vCiAgLy8vIFtUeXBlUHJvbW90aW9uRmFjdF1zIHRoYXQgYXJlIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHZhcmlhYmxlIHNob3cgdXAgaW4KICAvLy8gdGhpcyBtYXAgdW5kZXIgdGhlIGtleSBgbnVsbGAuCiAgZmluYWwgX2ZhY3RDYWNoZSA9IDxWYXJpYWJsZURlY2xhcmF0aW9uLCBUeXBlUHJvbW90aW9uRmFjdD57fTsKCiAgLy8vIExpbmtlZCBsaXN0IG9mIFtUeXBlUHJvbW90aW9uRmFjdF1zIHRoYXQgd2FzIGN1cnJlbnQgYXQgdGhlIHRpbWUgdGhlCiAgLy8vIFtfZmFjdENhY2hlXSB3YXMgbGFzdCB1cGRhdGVkLgogIFR5cGVQcm9tb3Rpb25GYWN0IF9mYWN0Q2FjaGVTdGF0ZTsKCiAgLy8vIExpbmtlZCBsaXN0IG9mIFtUeXBlUHJvbW90aW9uRmFjdF1zIGRlc2NyaWJpbmcgd2hhdCBpcyBrbm93biB0byBiZSB0cnVlCiAgLy8vIGFmdGVyIGV4ZWN1dGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBvciBzdGF0ZW1lbnQgdGhhdCB3YXMgbW9zdCByZWNlbnRseQogIC8vLyBwYXJzZWQuCiAgVHlwZVByb21vdGlvbkZhY3QgX2N1cnJlbnRGYWN0czsKCiAgLy8vIFRoZSBtb3N0IHJlY2VudGx5IHBhcnNlZCBleHByZXNzaW9uIHdob3NlIG91dGNvbWUgcG90ZW50aWFsbHkgYWZmZWN0cyB3aGF0CiAgLy8vIGlzIGtub3duIHRvIGJlIHRydWUgKGUuZy4gYW4gImlzIiBjaGVjayBvciBhIGxvZ2ljYWwgZXhwcmVzc2lvbikuICBNYXkgYmUKICAvLy8gYG51bGxgIGlmIG5vIHN1Y2ggZXhwcmVzc2lvbiBoYXMgYmVlbiBlbmNvdW50ZXJlZCB5ZXQuCiAgRXhwcmVzc2lvbiBfcHJvbW90aW9uRXhwcmVzc2lvbjsKCiAgLy8vIExpbmtlZCBsaXN0IG9mIFtUeXBlUHJvbW90aW9uRmFjdF1zIGRlc2NyaWJpbmcgd2hhdCBpcyBrbm93biB0byBiZSB0cnVlCiAgLy8vIGFmdGVyIGV4ZWN1dGlvbiBvZiBbX3Byb21vdGlvbkV4cHJlc3Npb25dLCBhc3N1bWluZyB0aGF0CiAgLy8vIFtfcHJvbW90aW9uRXhwcmVzc2lvbl0gZXZhbHVhdGVzIHRvIGB0cnVlYC4KICBUeXBlUHJvbW90aW9uRmFjdCBfdHJ1ZUZhY3RzRm9yUHJvbW90aW9uRXhwcmVzc2lvbjsKCiAgLy8vIExpbmtlZCBsaXN0IG9mIFtUeXBlUHJvbW90aW9uU2NvcGVdcyBkZXNjcmliaW5nIHRoZSBuZXN0aW5nIHN0cnVjdHVyZSB0aGF0CiAgLy8vIGNvbnRhaW5zIHRoZSBleHByZXNzb2luIG9yIHN0YXRlbWVudCB0aGF0IHdhcyBtb3N0IHJlY2VudGx5IHBhcnNlZC4KICBUeXBlUHJvbW90aW9uU2NvcGUgX2N1cnJlbnRTY29wZSA9IGNvbnN0IF9Ub3BMZXZlbFNjb3BlKCk7CgogIC8vLyBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBbVHlwZVByb21vdGlvbkZhY3RdIHRoYXQgd2FzIG1vc3QgcmVjZW50bHkKICAvLy8gY3JlYXRlZC4KICBpbnQgX2xhc3RGYWN0U2VxdWVuY2VOdW1iZXIgPSAwOwoKICBUeXBlUHJvbW90ZXJJbXBsLnByaXZhdGUoVHlwZVNjaGVtYUVudmlyb25tZW50IHR5cGVTY2hlbWFFbnZpcm9ubWVudCkKICAgICAgOiB0aGlzLl8odHlwZVNjaGVtYUVudmlyb25tZW50LCBuZXcgX051bGxGYWN0KCkpOwoKICBUeXBlUHJvbW90ZXJJbXBsLl8odGhpcy50eXBlU2NoZW1hRW52aXJvbm1lbnQsIF9OdWxsRmFjdCB0aGlzLl9udWxsRmFjdHMpCiAgICAgIDogX2ZhY3RDYWNoZVN0YXRlID0gX251bGxGYWN0cywKICAgICAgICBfY3VycmVudEZhY3RzID0gX251bGxGYWN0cywKICAgICAgICBzdXBlci5wcml2YXRlKCkgewogICAgX2ZhY3RDYWNoZVtudWxsXSA9IF9udWxsRmFjdHM7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlUHJvbW90aW9uU2NvcGUgZ2V0IGN1cnJlbnRTY29wZSA9PiBfY3VycmVudFNjb3BlOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBjb21wdXRlUHJvbW90ZWRUeXBlKAogICAgICBUeXBlUHJvbW90aW9uRmFjdCBmYWN0LCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUsIGJvb2wgbXV0YXRlZEluQ2xvc3VyZSkgewogICAgaWYgKG11dGF0ZWRJbkNsb3N1cmUpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGZhY3Q/Ll9jb21wdXRlUHJvbW90ZWRUeXBlKHRoaXMsIHNjb3BlKTsKICB9CgogIC8vLyBGb3IgaW50ZXJuYWwgZGVidWdnaW5nIHVzZSwgb3B0aW9uYWxseSBwcmludHMgdGhlIGN1cnJlbnQgc3RhdGUgZm9sbG93ZWQKICAvLy8gYnkgdGhlIGV2ZW50IG5hbWUuICBVbmNvbW1lbnQgdGhlIGNhbGwgdG8gW19wcmludEV2ZW50XSB0byBzZWUgdGhlCiAgLy8vIHNlcXVlbmNlIG9mIGNhbGxzIGludG8gdGhlIHR5cGUgcHJvbW90ZXIgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRlcy4KICB2b2lkIGRlYnVnRXZlbnQoU3RyaW5nIG5hbWUpIHsKICAgIC8vIF9wcmludEV2ZW50KG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnRlckVsc2UoKSB7CiAgICBkZWJ1Z0V2ZW50KCdlbnRlckVsc2UnKTsKICAgIF9Db25kaXRpb25hbFNjb3BlIHNjb3BlID0gX2N1cnJlbnRTY29wZTsKICAgIC8vIFJlY29yZCB0aGUgY3VycmVudCBmYWN0IHN0YXRlIHNvIHRoYXQgb25jZSB3ZSBleGl0IHRoZSAiZWxzZSIgYnJhbmNoLCB3ZQogICAgLy8gY2FuIG1lcmdlIGZhY3RzIGZyb20gdGhlIHR3byBicmFuY2hlcy4KICAgIHNjb3BlLmFmdGVyVHJ1ZSA9IF9jdXJyZW50RmFjdHM7CiAgICAvLyBXaGlsZSBwcm9jZXNzaW5nIHRoZSAiZWxzZSIgYmxvY2ssIGFzc3VtZSB0aGUgY29uZGl0aW9uIHdhcyBmYWxzZS4KICAgIF9jdXJyZW50RmFjdHMgPSBzY29wZS5iZWZvcmVFbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnRlckxvZ2ljYWxFeHByZXNzaW9uKEV4cHJlc3Npb24gbGhzLCBTdHJpbmcgb3BlcmF0b3IpIHsKICAgIGRlYnVnRXZlbnQoJ2VudGVyTG9naWNhbEV4cHJlc3Npb24nKTsKICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCB0aGUgZmFjdHMgYXJlIGJhc2VkIG9uIHBvc3NpYmxlIExIUyBvdXRjb21lcy4KICAgIHZhciB0cnVlRmFjdHMgPSBfZmFjdHNXaGVuVHJ1ZShsaHMpOwogICAgdmFyIGZhbHNlRmFjdHMgPSBfZmFjdHNXaGVuRmFsc2UobGhzKTsKICAgIC8vIFJlY29yZCB0aGUgZmFjdCB0aGF0IHdlIGFyZSBlbnRlcmluZyBhIG5ldyBzY29wZSwgYW5kIHNhdmUgdGhlCiAgICAvLyBhcHByb3ByaWF0ZSBmYWN0cyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGV4cHJlc3Npb24gZ2V0cyBzaG9ydC1jdXQuCiAgICBib29sIGlzQW5kID0gaWRlbnRpY2FsKG9wZXJhdG9yLCAnJiYnKTsKICAgIF9jdXJyZW50U2NvcGUgPQogICAgICAgIG5ldyBfTG9naWNhbFNjb3BlKF9jdXJyZW50U2NvcGUsIGlzQW5kLCBpc0FuZCA/IGZhbHNlRmFjdHMgOiB0cnVlRmFjdHMpOwogICAgLy8gV2hpbGUgcHJvY2Vzc2luZyB0aGUgUkhTLCBhc3N1bWUgdGhlIGNvbmRpdGlvbiB3YXMgZmFsc2Ugb3IgdHJ1ZSwKICAgIC8vIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBsb2dpY2FsIGV4cHJlc3Npb24uCiAgICBfY3VycmVudEZhY3RzID0gaXNBbmQgPyB0cnVlRmFjdHMgOiBmYWxzZUZhY3RzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnRlclRoZW4oRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKICAgIGRlYnVnRXZlbnQoJ2VudGVyVGhlbicpOwogICAgLy8gRmlndXJlIG91dCB3aGF0IHRoZSBmYWN0cyBhcmUgYmFzZWQgb24gcG9zc2libGUgY29uZGl0aW9uIG91dGNvbWVzLgogICAgdmFyIHRydWVGYWN0cyA9IF9mYWN0c1doZW5UcnVlKGNvbmRpdGlvbik7CiAgICB2YXIgZmFsc2VGYWN0cyA9IF9mYWN0c1doZW5GYWxzZShjb25kaXRpb24pOwogICAgLy8gUmVjb3JkIHRoZSBmYWN0IHRoYXQgd2UgYXJlIGVudGVyaW5nIGEgbmV3IHNjb3BlLCBhbmQgc2F2ZSB0aGUgImZhbHNlIgogICAgLy8gZmFjdHMgZm9yIHdoZW4gd2UgZW50ZXIgdGhlICJlbHNlIiBicmFuY2guCiAgICBfY3VycmVudFNjb3BlID0gbmV3IF9Db25kaXRpb25hbFNjb3BlKF9jdXJyZW50U2NvcGUsIGZhbHNlRmFjdHMpOwogICAgLy8gV2hpbGUgcHJvY2Vzc2luZyB0aGUgInRoZW4iIGJsb2NrLCBhc3N1bWUgdGhlIGNvbmRpdGlvbiB3YXMgdHJ1ZS4KICAgIF9jdXJyZW50RmFjdHMgPSB0cnVlRmFjdHM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGV4aXRDb25kaXRpb25hbCgpIHsKICAgIGRlYnVnRXZlbnQoJ2V4aXRDb25kaXRpb25hbCcpOwogICAgX0NvbmRpdGlvbmFsU2NvcGUgc2NvcGUgPSBfY3VycmVudFNjb3BlOwogICAgX2N1cnJlbnRTY29wZSA9IF9jdXJyZW50U2NvcGUuX2VuY2xvc2luZzsKICAgIF9jdXJyZW50RmFjdHMgPSBfbWVyZ2VGYWN0cyhzY29wZS5hZnRlclRydWUsIF9jdXJyZW50RmFjdHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBleGl0TG9naWNhbEV4cHJlc3Npb24oRXhwcmVzc2lvbiByaHMsIEV4cHJlc3Npb24gbG9naWNhbEV4cHJlc3Npb24pIHsKICAgIGRlYnVnRXZlbnQoJ2V4aXRMb2dpY2FsRXhwcmVzc2lvbicpOwogICAgX0xvZ2ljYWxTY29wZSBzY29wZSA9IF9jdXJyZW50U2NvcGU7CiAgICBfY3VycmVudFNjb3BlID0gX2N1cnJlbnRTY29wZS5fZW5jbG9zaW5nOwogICAgaWYgKHNjb3BlLmlzQW5kKSB7CiAgICAgIF9yZWNvcmRQcm9tb3Rpb25FeHByZXNzaW9uKGxvZ2ljYWxFeHByZXNzaW9uLCBfZmFjdHNXaGVuVHJ1ZShyaHMpLAogICAgICAgICAgX21lcmdlRmFjdHMoc2NvcGUuc2hvcnRjdXRGYWN0cywgX2N1cnJlbnRGYWN0cykpOwogICAgfSBlbHNlIHsKICAgICAgX3JlY29yZFByb21vdGlvbkV4cHJlc3Npb24oCiAgICAgICAgICBsb2dpY2FsRXhwcmVzc2lvbiwKICAgICAgICAgIF9tZXJnZUZhY3RzKHNjb3BlLnNob3J0Y3V0RmFjdHMsIF9jdXJyZW50RmFjdHMpLAogICAgICAgICAgX2ZhY3RzV2hlbkZhbHNlKHJocykpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmaW5pc2hlZCgpIHsKICAgIGRlYnVnRXZlbnQoJ2ZpbmlzaGVkJyk7CiAgICBpZiAoX2N1cnJlbnRTY29wZSBpcyEgX1RvcExldmVsU2NvcGUpIHsKICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1TdGFja05vdEVtcHR5LndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgIiRydW50aW1lVHlwZSIsICIkX2N1cnJlbnRTY29wZSIpLAogICAgICAgICAgLTEsCiAgICAgICAgICBudWxsKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFR5cGVQcm9tb3Rpb25GYWN0IGdldEZhY3RGb3JBY2Nlc3MoCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbCkgewogICAgZGVidWdFdmVudCgnZ2V0RmFjdEZvckFjY2VzcycpOwogICAgdmFyIGZhY3QgPSBfY29tcHV0ZUN1cnJlbnRGYWN0TWFwKClbdmFyaWFibGVdOwogICAgVHlwZVByb21vdGlvbkZhY3QuX3JlY29yZEFjY2Vzc2VkSW5TY29wZSgKICAgICAgICBmYWN0LCBfY3VycmVudFNjb3BlLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCk7CiAgICByZXR1cm4gZmFjdDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBuZXN0aW5nIGxldmVsIHRoYXQgd2FzIGluIGVmZmVjdCB3aGVuIFt2YXJpYWJsZV0gd2FzIGRlY2xhcmVkLgogIGludCBnZXRWYXJpYWJsZUZ1bmN0aW9uTmVzdGluZ0xldmVsKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUlzQ2hlY2soRXhwcmVzc2lvbiBpc0V4cHJlc3Npb24sIGJvb2wgaXNJbnZlcnRlZCwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgRGFydFR5cGUgdHlwZSwgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICBkZWJ1Z0V2ZW50KCdoYW5kbGVJc0NoZWNrJyk7CiAgICBpZiAoIWlzUHJvbW90aW9uQ2FuZGlkYXRlKHZhcmlhYmxlKSkgcmV0dXJuOwogICAgdmFyIGlzQ2hlY2sgPSBuZXcgX0lzQ2hlY2soCiAgICAgICAgKytfbGFzdEZhY3RTZXF1ZW5jZU51bWJlciwKICAgICAgICB2YXJpYWJsZSwKICAgICAgICBfY3VycmVudEZhY3RzLAogICAgICAgIF9jb21wdXRlQ3VycmVudEZhY3RNYXAoKVt2YXJpYWJsZV0sCiAgICAgICAgZnVuY3Rpb25OZXN0aW5nTGV2ZWwsCiAgICAgICAgdHlwZSk7CiAgICBpZiAoIWlzSW52ZXJ0ZWQpIHsKICAgICAgX3JlY29yZFByb21vdGlvbkV4cHJlc3Npb24oaXNFeHByZXNzaW9uLCBpc0NoZWNrLCBfY3VycmVudEZhY3RzKTsKICAgIH0KICB9CgogIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciBwcm9tb3Rpb24KICAvLy8gYXQgYWxsLgogIC8vLwogIC8vLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGluIGtlcm5lbCwgW1ZhcmlhYmxlRGVjbGFyYXRpb25dIG9iamVjdHMgYXJlCiAgLy8vIHNvbWV0aW1lcyB1c2VkIHRvIHJlcHJlc2VudCBsb2NhbCBmdW5jdGlvbnMsIHdoaWNoIGFyZSBub3Qgc3ViamVjdCB0bwogIC8vLyBwcm9tb3Rpb24uCiAgYm9vbCBpc1Byb21vdGlvbkNhbmRpZGF0ZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKTsKCiAgLy8vIFVwZGF0ZXMgdGhlIHN0YXRlIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB0aGUgZ2l2ZW4gW3ZhcmlhYmxlXSB3YXMKICAvLy8gbXV0YXRlZC4KICB2b2lkIG11dGF0ZVZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbCkgewogICAgZGVidWdFdmVudCgnbXV0YXRlVmFyaWFibGUnKTsKICAgIHZhciBmYWN0ID0gX2NvbXB1dGVDdXJyZW50RmFjdE1hcCgpW3ZhcmlhYmxlXTsKICAgIFR5cGVQcm9tb3Rpb25GYWN0Ll9yZWNvcmRNdXRhdGVkSW5TY29wZShmYWN0LCBfY3VycmVudFNjb3BlKTsKICAgIGlmIChnZXRWYXJpYWJsZUZ1bmN0aW9uTmVzdGluZ0xldmVsKHZhcmlhYmxlKSA8IGZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICAgIHNldFZhcmlhYmxlTXV0YXRlZEluQ2xvc3VyZSh2YXJpYWJsZSk7CiAgICB9CiAgICBzZXRWYXJpYWJsZU11dGF0ZWRBbnl3aGVyZSh2YXJpYWJsZSk7CiAgfQoKICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIFthXSBhbmQgW2JdIHJlcHJlc2VudCB0aGUgc2FtZSBleHByZXNzaW9uLCBhZnRlcgogIC8vLyBkcm9wcGluZyByZWR1bmRhbnQgZW5jbG9zaW5nIHBhcmVudGhlc2VzLgogIGJvb2wgc2FtZUV4cHJlc3Npb25zKEV4cHJlc3Npb24gYSwgRXhwcmVzc2lvbiBiKTsKCiAgLy8vIFJlY29yZHMgdGhhdCB0aGUgZ2l2ZW4gdmFyaWFibGUgd2FzIG11dGF0ZWQgc29tZXdoZXJlIGluc2lkZSB0aGUgbWV0aG9kLgogIHZvaWQgc2V0VmFyaWFibGVNdXRhdGVkQW55d2hlcmUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSk7CgogIC8vLyBSZWNvcmRzIHRoYXQgdGhlIGdpdmVuIHZhcmlhYmxlIHdhcyBtdXRhdGVkIGluc2lkZSBhIGNsb3N1cmUuCiAgdm9pZCBzZXRWYXJpYWJsZU11dGF0ZWRJbkNsb3N1cmUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSk7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciBbc2V0VmFyaWFibGVNdXRhdGVkQW55d2hlcmVdIGhhcyBiZWVuIGNhbGxlZCBmb3IgdGhlCiAgLy8vIGdpdmVuIFt2YXJpYWJsZV0uCiAgYm9vbCB3YXNWYXJpYWJsZU11dGF0ZWRBbnl3aGVyZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKTsKCiAgLy8vIFJldHVybnMgYSBtYXAgZnJvbSB2YXJpYWJsZSBkZWNsYXJhdGlvbiB0byB0aGUgbW9zdCByZWNlbnQKICAvLy8gW1R5cGVQcm9tb3Rpb25GYWN0XSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhcmlhYmxlLgogIE1hcDxWYXJpYWJsZURlY2xhcmF0aW9uLCBUeXBlUHJvbW90aW9uRmFjdD4gX2NvbXB1dGVDdXJyZW50RmFjdE1hcCgpIHsKICAgIC8vIFJvbGwgYmFjayBhbnkgbWFwIGVudHJpZXMgYXNzb2NpYXRlZCB3aXRoIGZhY3RzIHRoYXQgYXJlIG5vIGxvbmdlciBpbgogICAgLy8gZWZmZWN0LCBhbmQgc2V0IFtjb21tb25BbmNlc3Rvcl0gdG8gdGhlIGZhY3QgdGhhdCBpcyBhbiBhbmNlc3RvciBvZgogICAgLy8gdGhlIGN1cnJlbnQgc3RhdGUgYW5kIHRoZSBwcmV2aW91c2x5IGNhY2hlZCBzdGF0ZS4gIFRvIGRvIHRoaXMsIHdlIHNldCBhCiAgICAvLyB2YXJpYWJsZSBwb2ludGluZyB0byBbX2N1cnJlbnRGYWN0c10sIGFuZCB0aGVuIHdhbGsgYm90aCBpdCBhbmQKICAgIC8vIFtfZmFjdENhY2hlU3RhdGVdIGJhY2sgdG8gdGhlaXIgY29tbW9uIGFuY2VzdG9yLCB1cGRhdGluZyBbX2ZhY3RDYWNoZV0gYXMKICAgIC8vIHdlIGdvLgogICAgVHlwZVByb21vdGlvbkZhY3QgY29tbW9uQW5jZXN0b3IgPSBfY3VycmVudEZhY3RzOwogICAgd2hpbGUgKGNvbW1vbkFuY2VzdG9yLnNlcXVlbmNlTnVtYmVyICE9IF9mYWN0Q2FjaGVTdGF0ZS5zZXF1ZW5jZU51bWJlcikgewogICAgICBpZiAoY29tbW9uQW5jZXN0b3Iuc2VxdWVuY2VOdW1iZXIgPiBfZmFjdENhY2hlU3RhdGUuc2VxdWVuY2VOdW1iZXIpIHsKICAgICAgICAvLyBUaGUgY3VycmVudGx5IGNhY2hlZCBzdGF0ZSBpcyBvbGRlciB0aGFuIHRoZSBjb21tb24gYW5jZXN0b3IgZ3Vlc3MsCiAgICAgICAgLy8gc28gdGhlIGNvbW1vbiBhbmNlc3RvciBndWVzcyBuZWVkcyB0byBiZSB3YWxrZWQgYmFjay4KICAgICAgICBjb21tb25BbmNlc3RvciA9IGNvbW1vbkFuY2VzdG9yLnByZXZpb3VzOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoZSBjb21tb24gYW5jZXN0b3IgZ3Vlc3MgaXMgb2xkZXIgdGhhbiB0aGUgY3VycmVudGx5IGNhY2hlZCBzdGF0ZSwKICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIHJvbGwgYmFjayB0aGUgbWFwIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudGx5CiAgICAgICAgLy8gY2FjaGVkIHN0YXRlLgogICAgICAgIF9mYWN0Q2FjaGVbX2ZhY3RDYWNoZVN0YXRlLnZhcmlhYmxlXSA9CiAgICAgICAgICAgIF9mYWN0Q2FjaGVTdGF0ZS5wcmV2aW91c0ZvclZhcmlhYmxlOwogICAgICAgIF9mYWN0Q2FjaGVTdGF0ZSA9IF9mYWN0Q2FjaGVTdGF0ZS5wcmV2aW91czsKICAgICAgfQogICAgfQogICAgYXNzZXJ0KGlkZW50aWNhbChjb21tb25BbmNlc3RvciwgX2ZhY3RDYWNoZVN0YXRlKSk7CiAgICAvLyBSb2xsIGZvcndhcmQgYW55IG1hcCBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCBmYWN0cyB0aGF0IGFyZSBuZXdseSBpbgogICAgLy8gZWZmZWN0LiAgU2luY2UgbmV3ZXIgZmFjdHMgbGluayB0byBvbGRlciBvbmVzLCBpdCBpcyBlYXNpZXN0IHRvIGRvIHJvbGwKICAgIC8vIGZvcndhcmQgdGhlIG1vc3QgcmVjZW50IGZhY3RzIGZpcnN0LgogICAgZm9yIChUeXBlUHJvbW90aW9uRmFjdCBuZXdTdGF0ZSA9IF9jdXJyZW50RmFjdHM7CiAgICAgICAgIWlkZW50aWNhbChuZXdTdGF0ZSwgY29tbW9uQW5jZXN0b3IpOwogICAgICAgIG5ld1N0YXRlID0gbmV3U3RhdGUucHJldmlvdXMpIHsKICAgICAgdmFyIGN1cnJlbnRseUNhY2hlZCA9IF9mYWN0Q2FjaGVbbmV3U3RhdGUudmFyaWFibGVdOwogICAgICAvLyBOb3RlOiBTaW5jZSB3ZSByb2xsIGZvcndhcmQgdGhlIG1vc3QgcmVjZW50IGZhY3RzIGZpcnN0LCB3ZSBuZWVkIHRvIGJlCiAgICAgIC8vIGNhcmVmdWwgbm90IHdyaXRlIGFuIG9sZGVyIGZhY3Qgb3ZlciBhIG5ld2VyIG9uZS4KICAgICAgaWYgKGN1cnJlbnRseUNhY2hlZCA9PSBudWxsIHx8CiAgICAgICAgICBuZXdTdGF0ZS5zZXF1ZW5jZU51bWJlciA+IGN1cnJlbnRseUNhY2hlZC5zZXF1ZW5jZU51bWJlcikgewogICAgICAgIF9mYWN0Q2FjaGVbbmV3U3RhdGUudmFyaWFibGVdID0gbmV3U3RhdGU7CiAgICAgIH0KICAgIH0KICAgIF9mYWN0Q2FjaGVTdGF0ZSA9IF9jdXJyZW50RmFjdHM7CiAgICByZXR1cm4gX2ZhY3RDYWNoZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBzZXQgb2YgZmFjdHMga25vd24gdG8gYmUgdHJ1ZSBhZnRlciB0aGUgZXhlY3V0aW9uIG9mIFtlXQogIC8vLyBhc3N1bWluZyBpdCBldmFsdWF0ZXMgdG8gYGZhbHNlYC4KICAvLy8KICAvLy8gW2VdIG11c3QgYmUgdGhlIG1vc3QgcmVzZW50bHkgcGFyc2VkIGV4cHJlc3Npb24gb3Igc3RhdGVtZW50LgogIFR5cGVQcm9tb3Rpb25GYWN0IF9mYWN0c1doZW5GYWxzZShFeHByZXNzaW9uIGUpIHsKICAgIC8vIFR5cGUgcHJvbW90aW9uIGN1cnJlbnRseSBvbmx5IG9jY3VycyB3aGVuIGFuICJpcyIgb3IgbG9naWNhbCBleHByZXNzaW9uCiAgICAvLyBldmFsdWF0ZXMgdG8gYHRydWVgLCBzbyBubyBzcGVjaWFsIGxvZ2ljIGlzIHJlcXVpcmVkOyB3ZSBqdXN0IHVzZQogICAgLy8gW19jdXJyZW50RmFjdHNdLgogICAgLy8KICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogZXhwZXJpbWVudCB3aXRoIHN1cHBvcnRpbmcgcHJvbW90aW9uIGluIGNhc2VzIGxpa2UKICAgIC8vIGBpZiAoeCBpcyEgVCkgeyAuLi4gfSBlbHNlIHsgLi4uYWNjZXNzIHguLi4gfWAKICAgIHJldHVybiBfY3VycmVudEZhY3RzOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHNldCBvZiBmYWN0cyBrbm93biB0byBiZSB0cnVlIGFmdGVyIHRoZSBleGVjdXRpb24gb2YgW2VdCiAgLy8vIGFzc3VtaW5nIGl0IGV2YWx1YXRlcyB0byBgdHJ1ZWAuCiAgLy8vCiAgLy8vIFtlXSBtdXN0IGJlIHRoZSBtb3N0IHJlc2VudGx5IHBhcnNlZCBleHByZXNzaW9uIG9yIHN0YXRlbWVudC4KICBUeXBlUHJvbW90aW9uRmFjdCBfZmFjdHNXaGVuVHJ1ZShFeHByZXNzaW9uIGUpID0+CiAgICAgIHNhbWVFeHByZXNzaW9ucyhfcHJvbW90aW9uRXhwcmVzc2lvbiwgZSkKICAgICAgICAgID8gX3RydWVGYWN0c0ZvclByb21vdGlvbkV4cHJlc3Npb24KICAgICAgICAgIDogX2N1cnJlbnRGYWN0czsKCiAgLy8vIFJldHVybnMgdGhlIHNldCBvZiBmYWN0cyBrbm93biB0byBiZSB0cnVlIGFmdGVyIHR3byBicmFuY2hlcyBvZiBleGVjdXRpb24KICAvLy8gcmVqb2luLgogIFR5cGVQcm9tb3Rpb25GYWN0IF9tZXJnZUZhY3RzKFR5cGVQcm9tb3Rpb25GYWN0IGEsIFR5cGVQcm9tb3Rpb25GYWN0IGIpIHsKICAgIC8vIFR5cGUgcHJvbW90aW9uIGN1cnJlbnRseSBkb2Vzbid0IHN1cHBvcnQgYW55IG1lY2hhbmlzbSBmb3IgZmFjdHMgdG8KICAgIC8vIGFjY3VtdWxhdGUgYWxvbmcgYSBzdHJhaWdodC1saW5lIGV4ZWN1dGlvbiBwYXRoICh0aGV5IGNhbiBvbmx5IGFjY3VtdWxhdGUKICAgIC8vIHdoZW4gZW50ZXJpbmcgYSBzY29wZSksIHNvIHdlIGNhbiBzaW1wbHkgZmluZCB0aGUgY29tbW9uIGFuY2VzdG9yIGZhY3QuCiAgICAvLwogICAgLy8gVE9ETyhwYXVsYmVycnkpOiBleHBlcmltZW50IHdpdGggc3VwcG9ydGluZyBwcm9tb3Rpb24gaW4gY2FzZXMgbGlrZToKICAgIC8vICAgICBpZiAoLi4uKSB7CiAgICAvLyAgICAgICBpZiAoeCBpcyEgVCkgcmV0dXJuOwogICAgLy8gICAgIH0gZWxzZSB7CiAgICAvLyAgICAgICBpZiAoeCBpcyEgVCkgcmV0dXJuOwogICAgLy8gICAgIH0KICAgIC8vICAgICAuLi5hY2Nlc3MgeC4uLgogICAgd2hpbGUgKGEuc2VxdWVuY2VOdW1iZXIgIT0gYi5zZXF1ZW5jZU51bWJlcikgewogICAgICBpZiAoYS5zZXF1ZW5jZU51bWJlciA+IGIuc2VxdWVuY2VOdW1iZXIpIHsKICAgICAgICBhID0gYS5wcmV2aW91czsKICAgICAgfSBlbHNlIHsKICAgICAgICBiID0gYi5wcmV2aW91czsKICAgICAgfQogICAgfQogICAgYXNzZXJ0KGlkZW50aWNhbChhLCBiKSk7CiAgICByZXR1cm4gYTsKICB9CgogIC8vLyBGb3IgaW50ZXJuYWwgZGVidWdnaW5nIHVzZSwgcHJpbnRzIHRoZSBjdXJyZW50IHN0YXRlIGZvbGxvd2VkIGJ5IHRoZSBldmVudAogIC8vLyBuYW1lLgogIHZvaWQgX3ByaW50RXZlbnQoU3RyaW5nIG5hbWUpIHsKICAgIEl0ZXJhYmxlPFR5cGVQcm9tb3Rpb25GYWN0PiBmYWN0Q2hhaW4oVHlwZVByb21vdGlvbkZhY3QgZmFjdCkgc3luYyogewogICAgICB3aGlsZSAoZmFjdCAhPSBudWxsKSB7CiAgICAgICAgeWllbGQgZmFjdDsKICAgICAgICBmYWN0ID0gZmFjdC5wcmV2aW91c0ZvclZhcmlhYmxlOwogICAgICB9CiAgICB9CgogICAgX2NvbXB1dGVDdXJyZW50RmFjdE1hcCgpLmZvckVhY2goKHZhcmlhYmxlLCBmYWN0KSB7CiAgICAgIGlmIChmYWN0ID09IG51bGwpIHJldHVybjsKICAgICAgcHJpbnQoJyAgJHt2YXJpYWJsZSA/PyAnKG51bGwpJ306ICR7ZmFjdENoYWluKGZhY3QpLmpvaW4oJyAtPiAnKX0nKTsKICAgIH0pOwogICAgaWYgKF9wcm9tb3Rpb25FeHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgcHJpbnQoJyAgX3Byb21vdGlvbkV4cHJlc3Npb246ICRfcHJvbW90aW9uRXhwcmVzc2lvbicpOwogICAgICBpZiAoIWlkZW50aWNhbChfdHJ1ZUZhY3RzRm9yUHJvbW90aW9uRXhwcmVzc2lvbiwgX2N1cnJlbnRGYWN0cykpIHsKICAgICAgICBwcmludCgnICAgIGlmIHRydWU6ICRfdHJ1ZUZhY3RzRm9yUHJvbW90aW9uRXhwcmVzc2lvbicpOwogICAgICB9CiAgICB9CiAgICBwcmludChuYW1lKTsKICB9CgogIC8vLyBSZWNvcmRzIHRoYXQgYWZ0ZXIgdGhlIGV2YWx1YXRpb24gb2YgW2V4cHJlc3Npb25dLCB0aGUgZmFjdHMgd2lsbCBiZQogIC8vLyBbaWZUcnVlXSBvbiBhIGJyYW5jaCB3aGVyZSB0aGUgZXhwcmVzc2lvbiBldmFsdXRlZCB0byBgdHJ1ZWAsIGFuZAogIC8vLyBbaWZGYWxzZV0gb24gYSBicmFuY2ggd2hlcmUgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVkIHRvIGBmYWxzZWAgKG9yIHdoZXJlCiAgLy8vIHRoZSB0cnV0aCB2YWx1ZSBvZiB0aGUgZXhwcmVzaXNvbiBkb2Vzbid0IG1hdHRlcikuCiAgLy8vCiAgLy8vIFRPRE8ocGF1bGJlcnJ5KTogd2hlbiB3ZSBzdGFydCBoYW5kbGluZyBwcm9tb3Rpb24gaW4gImVsc2UiIGNsYXVzZXMsIHdlJ2xsCiAgLy8vIG5lZWQgdG8gc3BsaXQgW2lmRmFsc2VdIGludG8gdHdvIGNhc2VzLCBvbmUgZm9yIHdoZW4gdGhlIGV4cHJlc3Npb24KICAvLy8gZXZhbHVhdGVkIHRvIGBmYWxzZWAsIGFuZCBvbmUgd2hlcmUgdGhlIHRydXRoIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uCiAgLy8vIGRvZXNuJ3QgbWF0dGVyLgogIHZvaWQgX3JlY29yZFByb21vdGlvbkV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICBUeXBlUHJvbW90aW9uRmFjdCBpZlRydWUsIFR5cGVQcm9tb3Rpb25GYWN0IGlmRmFsc2UpIHsKICAgIF9wcm9tb3Rpb25FeHByZXNzaW9uID0gZXhwcmVzc2lvbjsKICAgIF90cnVlRmFjdHNGb3JQcm9tb3Rpb25FeHByZXNzaW9uID0gaWZUcnVlOwogICAgX2N1cnJlbnRGYWN0cyA9IGlmRmFsc2U7CiAgfQp9CgovLy8gQSBzaW5nbGUgZmFjdCB3aGljaCBpcyBrbm93biB0byB0aGUgdHlwZSBwcm9tb3Rpb24gZW5naW5lIGFib3V0IHRoZSBzdGF0ZSBvZgovLy8gYSB2YXJpYWJsZSAob3IgYWJvdXQgdGhlIGZsb3cgY29udHJvbCBvZiB0aGUgY29tcG9uZW50KS4KLy8vCi8vLyBUaGUgdHlwZSBhcmd1bWVudCBWIHJlcHJlc2VudHMgaXMgdGhlIGNsYXNzIHdoaWNoIHJlcHJlc2VudHMgbG9jYWwgdmFyaWFibGUKLy8vIGRlY2xhcmF0aW9ucy4KLy8vCi8vLyBGYWN0cyBhcmUgbGlua2VkIHRvZ2V0aGVyIGludG8gbGlua2VkIGxpc3RzIHZpYSB0aGUgW3ByZXZpb3VzXSBwb2ludGVyIGludG8KLy8vIGEgZGF0YSBzdHJ1Y3R1cmUgY2FsbGVkIGEgImZhY3QgY2hhaW4iIChvciBzb21ldGltZXMgYSAiZmFjdCBzdGF0ZSIpLCB3aGljaAovLy8gcmVwcmVzZW50cyBhbGwgZmFjdHMgdGhhdCBhcmUga25vd24gdG8gaG9sZCBhdCBhIGNlcnRhaW4gcG9pbnQgaW4gdGhlCi8vLyBjb21wb25lbnQuCi8vLwovLy8gVGhlIGZhY3QgaXMgc2FpZCB0byAiYXBwbHkiIHRvIGEgZ2l2ZW4gcG9pbnQgaW4gdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLy8vIGNvbXBvbmVudCBpZiB0aGUgZmFjdCBpcyBwYXJ0IG9mIHRoZSBjdXJyZW50IGZhY3Qgc3RhdGUgYXQgdGhlIHBvaW50IHRoZQovLy8gcGFyc2VyIHJlYWNoZXMgdGhhdCBwb2ludCBpbiB0aGUgY29tcG9uZW50LgovLy8KLy8vIE5vdGU6IGp1c3QgYmVjYXVzZSBhIGZhY3QgImFwcGxpZXMiIHRvIGEgZ2l2ZW4gcG9pbnQgaW4gdGhlIGV4ZWN1dGlvbiBvZgovLy8gdGhlIGNvbXBvbmVudCBkb2Vzbid0IG1lYW4gYSB0eXBlIHdpbGwgYmUgcHJvbW90ZWQtLWl0IHNpbXBseSBtZWFucyB0aGF0Ci8vLyB0aGUgZmFjdCB3YXMgZGVkdWNlZCBhdCBhIHByZXZpb3VzIHBvaW50IGluIHRoZSBzdHJhaWdodCBsaW5lIGV4ZWN1dGlvbiBvZgovLy8gdGhlIGNvZGUuICBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIGZhY3Qgd2lsbCBiZSBvdmVyc2hhZG93ZWQgYnkgYSBsYXRlcgovLy8gZmFjdCwgb3IgaXRzIGVmZmVjdCB3aWxsIGJlIGNhbmNlbGxlZCBieSBhIGxhdGVyIGFzc2lnbm1lbnQuICBUaGUgZmluYWwKLy8vIGRldGVtaW5hdGlvbiBvZiB3aGV0aGVyIHByb21vdGlvbiBvY2N1cnMgaXMgbGVmdCB0byBbX2NvbXB1dGVQcm9tb3RlZFR5cGVdLgphYnN0cmFjdCBjbGFzcyBUeXBlUHJvbW90aW9uRmFjdCB7CiAgLy8vIFRoZSB2YXJpYWJsZSB0aGlzIGZhY3QgcmVjb3JkcyBpbmZvcm1hdGlvbiBhYm91dCwgb3IgYG51bGxgIGlmIHRoaXMgZmFjdAogIC8vLyByZWNvcmRzIGluZm9ybWF0aW9uIGFib3V0IGdlbmVyYWwgZmxvdyBjb250cm9sLgogIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGU7CgogIC8vLyBUaGUgZmFjdCBjaGFpbiB0aGF0IHdhcyBpbiBlZmZlY3QgcHJpb3IgdG8gZXhlY3V0aW9uIG9mIHRoZSBzdGF0ZW1lbnQgb3IKICAvLy8gZXhwcmVzc2lvbiB0aGF0IGNhdXNlZCB0aGlzIGZhY3QgdG8gYmUgdHJ1ZS4KICBmaW5hbCBUeXBlUHJvbW90aW9uRmFjdCBwcmV2aW91czsKCiAgLy8vIEludGVnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmFjdC4gIEVhY2ggdGltZSBhIGZhY3QgaXMgY3JlYXRlZCBpdCBpcwogIC8vLyBnaXZlbiBhIHNlcXVlbmNlIG51bWJlciBvbmUgZ3JlYXRlciB0aGFuIHRoZSBwcmV2aW91c2x5IGdlbmVyYXRlZCBmYWN0LgogIC8vLyBUaGlzIHNpbXBsaWZpZXMgdGhlIGFsZ29yaXRobSBmb3IgZmluZGluZyB0aGUgY29tbW9uIGFuY2VzdG9yIG9mIHR3bwogIC8vLyBmYWN0czsgd2UgcmVwZWF0ZWRseSB3YWxrIGJhY2t3YXJkIHRoZSBmYWN0IHdpdGggdGhlIGxhcmdlciBzZXF1ZW5jZQogIC8vLyBudW1iZXIgdW50aWwgdGhlIHNlcXVlbmNlIG51bWJlcnMgYXJlIHRoZSBzYW1lLgogIGZpbmFsIGludCBzZXF1ZW5jZU51bWJlcjsKCiAgLy8vIFRoZSBtb3N0IHJlY2VudCBmYWN0IGFwcGVhcmluZyBpbiB0aGUgZmFjdCBjaGFpbiBbcHJldmlvdXNdIHdob3NlCiAgLy8vIFt2YXJpYWJsZV0gbWF0Y2hlcyB0aGlzIG9uZSwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZmFjdC4KICBmaW5hbCBUeXBlUHJvbW90aW9uRmFjdCBwcmV2aW91c0ZvclZhcmlhYmxlOwoKICAvLy8gVGhlIGZ1bmN0aW9uIG5lc3RpbmcgbGV2ZWwgb2YgdGhlIGV4cHJlc3Npb24gdGhhdCBsZWQgdG8gdGhpcyBmYWN0LgogIGZpbmFsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbDsKCiAgLy8vIElmIHRoaXMgZmFjdCdzIHZhcmlhYmxlIHdhcyBtdXRhdGVkIHdpdGhpbiBhbnkgc2NvcGVzIHRoZQogIC8vLyBmYWN0IGFwcGxpZXMgdG8sIGEgc2V0IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNjb3Blcy4gIE90aGVyd2lzZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRPRE8ocGF1bGJlcnJ5KTogdGhlIHNpemUgb2YgdGhpcyBzZXQgaXMgcHJvYmFibHkgdmVyeSBzbWFsbCBtb3N0IG9mIHRoZQogIC8vLyB0aW1lLiAgV291bGQgaXQgYmUgYmV0dGVyIHRvIHVzZSBhIGxpc3Q/CiAgU2V0PFR5cGVQcm9tb3Rpb25TY29wZT4gX211dGF0ZWRJblNjb3BlczsKCiAgLy8vIElmIHRoaXMgZmFjdCdzIHZhcmlhYmxlIHdhcyBhY2Nlc3NlZCBpbnNpZGUgYSBjbG9zdXJlIHdpdGhpbiBhbnkgc2NvcGVzCiAgLy8vIHRoZSBmYWN0IGFwcGxpZXMgdG8sIGEgc2V0IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNjb3Blcy4gIE90aGVyd2lzZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRPRE8ocGF1bGJlcnJ5KTogdGhlIHNpemUgb2YgdGhpcyBzZXQgaXMgcHJvYmFibHkgdmVyeSBzbWFsbCBtb3N0IG9mIHRoZQogIC8vLyB0aW1lLiAgV291bGQgaXQgYmUgYmV0dGVyIHRvIHVzZSBhIGxpc3Q/CiAgU2V0PFR5cGVQcm9tb3Rpb25TY29wZT4gX2FjY2Vzc2VkSW5DbG9zdXJlSW5TY29wZXM7CgogIFR5cGVQcm9tb3Rpb25GYWN0KHRoaXMuc2VxdWVuY2VOdW1iZXIsIHRoaXMudmFyaWFibGUsIHRoaXMucHJldmlvdXMsCiAgICAgIHRoaXMucHJldmlvdXNGb3JWYXJpYWJsZSwgdGhpcy5mdW5jdGlvbk5lc3RpbmdMZXZlbCk7CgogIC8vLyBDb21wdXRlcyB0aGUgcHJvbW90ZWQgdHlwZSBmb3IgW3ZhcmlhYmxlXSBhdCBhIGxvY2F0aW9uIGluIHRoZSBjb2RlIHdoZXJlCiAgLy8vIHRoaXMgZmFjdCBhcHBsaWVzLgogIC8vLwogIC8vLyBTaG91bGQgbm90IGJlIGNhbGxlZCB1bnRpbCBhZnRlciBwYXJzaW5nIG9mIHRoZSBlbnRpcmUgbWV0aG9kIGlzIGNvbXBsZXRlLgogIERhcnRUeXBlIF9jb21wdXRlUHJvbW90ZWRUeXBlKAogICAgICBUeXBlUHJvbW90ZXJJbXBsIHByb21vdGVyLCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUpOwoKICAvLy8gUmVjb3JkcyB0aGUgZmFjdCB0aGF0IHRoZSB2YXJpYWJsZSByZWZlcmVuY2VkIGJ5IFtmYWN0XSB3YXMgYWNjZXNzZWQKICAvLy8gd2l0aGluIHRoZSBnaXZlbiBzY29wZSwgYXQgdGhlIGdpdmVuIGZ1bmN0aW9uIG5lc3RpbmcgbGV2ZWwuCiAgLy8vCiAgLy8vIElmIGBudWxsYCBpcyBwYXNzZWQgaW4gZm9yIFtmYWN0XSwgdGhlcmUgaXMgbm8gZWZmZWN0LgogIHN0YXRpYyB2b2lkIF9yZWNvcmRBY2Nlc3NlZEluU2NvcGUoVHlwZVByb21vdGlvbkZhY3QgZmFjdCwKICAgICAgVHlwZVByb21vdGlvblNjb3BlIHNjb3BlLCBpbnQgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpIHsKICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogbWFrZSBzb21lIGludGVncmF0aW9uIHRlc3QgY2FzZXMgdGhhdCBleGVyY2lzZSB0aGUKICAgIC8vIGJlaGF2aW9ycyBvZiB0aGlzIGZ1bmN0aW9uLiAgSW4gcGFydGljdWxhciB2ZXJpZnkgdGhhdCBpdCdzIGNvcnJlY3QgdG8KICAgIC8vIHRlc3QgZnVuY3Rpb25OZXN0aW5nTGV2ZWwgYWdhaW5zdCBmYWN0LmZ1bmN0aW9uTmVzdGluZ0xldmVsIChhcyBvcHBvc2VkCiAgICAvLyB0byB0ZXN0aW5nIGl0IGFnYWluc3QgZ2V0VmFyaWFibGVGdW5jdGlvbk5lc3RpbmdMZXZlbCh2YXJpYWJsZSkpLgogICAgd2hpbGUgKGZhY3QgIT0gbnVsbCkgewogICAgICBpZiAoZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPiBmYWN0LmZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICAgICAgZmFjdC5fYWNjZXNzZWRJbkNsb3N1cmVJblNjb3BlcyA/Pz0KICAgICAgICAgICAgbmV3IFNldDxUeXBlUHJvbW90aW9uU2NvcGU+LmlkZW50aXR5KCk7CiAgICAgICAgaWYgKCFmYWN0Ll9hY2Nlc3NlZEluQ2xvc3VyZUluU2NvcGVzLmFkZChzY29wZSkpIHJldHVybjsKICAgICAgfQogICAgICBmYWN0ID0gZmFjdC5wcmV2aW91c0ZvclZhcmlhYmxlOwogICAgfQogIH0KCiAgLy8vIFJlY29yZHMgdGhlIGZhY3QgdGhhdCB0aGUgdmFyaWFibGUgcmVmZXJlbmNlZCBieSBbZmFjdF0gd2FzIG11dGF0ZWQKICAvLy8gd2l0aGluIHRoZSBnaXZlbiBzY29wZS4KICAvLy8KICAvLy8gSWYgYG51bGxgIGlzIHBhc3NlZCBpbiBmb3IgW2ZhY3RdLCB0aGVyZSBpcyBubyBlZmZlY3QuCiAgc3RhdGljIHZvaWQgX3JlY29yZE11dGF0ZWRJblNjb3BlKAogICAgICBUeXBlUHJvbW90aW9uRmFjdCBmYWN0LCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUpIHsKICAgIHdoaWxlIChmYWN0ICE9IG51bGwpIHsKICAgICAgZmFjdC5fbXV0YXRlZEluU2NvcGVzID8/PSBuZXcgU2V0PFR5cGVQcm9tb3Rpb25TY29wZT4uaWRlbnRpdHkoKTsKICAgICAgaWYgKCFmYWN0Ll9tdXRhdGVkSW5TY29wZXMuYWRkKHNjb3BlKSkgcmV0dXJuOwogICAgICBmYWN0ID0gZmFjdC5wcmV2aW91c0ZvclZhcmlhYmxlOwogICAgfQogIH0KfQoKLy8vIFJlcHJlc2VudHMgYSBjb250aWd1b3VzIGJsb2NrIG9mIHByb2dyYW0gdGV4dCBpbiB3aGljaCB2YXJpYWJsZXMgbWF5IG9yIG1heQovLy8gbm90IGJlIHByb21vdGVkLiAgQWxzbyB1c2VkIGFzIGEgc3RhY2sgdG8ga2VlcCB0cmFjayBvZiBzdGF0ZSB3aGlsZSB0aGUKLy8vIG1ldGhvZCBpcyBiZWluZyBwYXJzZWQuCmNsYXNzIFR5cGVQcm9tb3Rpb25TY29wZSB7CiAgLy8vIFRoZSBuZXN0aW5nIGRlcHRoIG9mIHRoaXMgc2NvcGUuICBUaGUgb3V0ZXJtb3N0IHNjb3BlIChyZXByZXNlbnRpbmcgdGhlCiAgLy8vIHdob2xlIG1ldGhvZCBib2R5KSBoYXMgYSBkZXB0aCBvZiAwLgogIGZpbmFsIGludCBfZGVwdGg7CgogIC8vLyBUaGUgW1R5cGVQcm9tb3Rpb25TY29wZV0gcmVwcmVzZW50aW5nIHRoZSBzY29wZSBlbmNsb3NpbmcgdGhpcyBvbmUuCiAgZmluYWwgVHlwZVByb21vdGlvblNjb3BlIF9lbmNsb3Npbmc7CgogIFR5cGVQcm9tb3Rpb25TY29wZSh0aGlzLl9lbmNsb3NpbmcpIDogX2RlcHRoID0gX2VuY2xvc2luZy5fZGVwdGggKyAxOwoKICBjb25zdCBUeXBlUHJvbW90aW9uU2NvcGUuX3RvcExldmVsKCkKICAgICAgOiBfZW5jbG9zaW5nID0gbnVsbCwKICAgICAgICBfZGVwdGggPSAwOwoKICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgc2NvcGUgY29tcGxldGVseSBlbmNsb3NlcyAob3IgaXMgdGhlIHNhbWUgYXMpCiAgLy8vIFtvdGhlcl0uCiAgYm9vbCBjb250YWluc1Njb3BlKFR5cGVQcm9tb3Rpb25TY29wZSBvdGhlcikgewogICAgaWYgKHRoaXMuX2RlcHRoID4gb3RoZXIuX2RlcHRoKSB7CiAgICAgIC8vIFdlIGNhbid0IHBvc3NpYmx5IGNvbnRhaW4gYSBzY29wZSBpZiB3ZSBhcmUgYXQgZ3JlYXRlciBuZXN0aW5nIGRlcHRoCiAgICAgIC8vIHRoYW4gaXQgaXMuCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHdoaWxlICh0aGlzLl9kZXB0aCA8IG90aGVyLl9kZXB0aCkgewogICAgICBvdGhlciA9IG90aGVyLl9lbmNsb3Npbmc7CiAgICB9CiAgICByZXR1cm4gaWRlbnRpY2FsKHRoaXMsIG90aGVyKTsKICB9Cn0KCi8vLyBbVHlwZVByb21vdGlvblNjb3BlXSByZXByZXNlbnRpbmcgdGhlICJ0aGVuIiBhbmQgImVsc2UiIGJvZGllcyBvZiBhbiAiaWYiCi8vLyBzdGF0ZW1lbnQgb3IgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KY2xhc3MgX0NvbmRpdGlvbmFsU2NvcGUgZXh0ZW5kcyBUeXBlUHJvbW90aW9uU2NvcGUgewogIC8vLyBUaGUgZmFjdCBzdGF0ZSBpbiBlZmZlY3QgYXQgdGhlIHRvcCBvZiB0aGUgImVsc2UiIGJsb2NrLgogIGZpbmFsIFR5cGVQcm9tb3Rpb25GYWN0IGJlZm9yZUVsc2U7CgogIC8vLyBUaGUgZmFjdCBzdGF0ZSB3aGljaCB3YXMgaW4gZWZmZWN0IGF0IHRoZSBib3R0b20gb2YgdGhlICJ0aGVuIiBibG9jay4KICBUeXBlUHJvbW90aW9uRmFjdCBhZnRlclRydWU7CgogIF9Db25kaXRpb25hbFNjb3BlKFR5cGVQcm9tb3Rpb25TY29wZSBlbmNsb3NpbmcsIHRoaXMuYmVmb3JlRWxzZSkKICAgICAgOiBzdXBlcihlbmNsb3NpbmcpOwp9CgovLy8gW1R5cGVQcm9tb3Rpb25GYWN0XSByZXByZXNlbnRpbmcgYW4gImlzIiBjaGVjayB3aGljaCBzdWNjZWVkZWQuCmNsYXNzIF9Jc0NoZWNrIGV4dGVuZHMgVHlwZVByb21vdGlvbkZhY3QgewogIC8vLyBUaGUgdHlwZSBhcHBlYXJpbmcgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiAiaXMiLgogIGZpbmFsIERhcnRUeXBlIGNoZWNrZWRUeXBlOwoKICBfSXNDaGVjaygKICAgICAgaW50IHNlcXVlbmNlTnVtYmVyLAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLAogICAgICBUeXBlUHJvbW90aW9uRmFjdCBwcmV2aW91cywKICAgICAgVHlwZVByb21vdGlvbkZhY3QgcHJldmlvdXNGb3JWYXJpYWJsZSwKICAgICAgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsLAogICAgICB0aGlzLmNoZWNrZWRUeXBlKQogICAgICA6IHN1cGVyKHNlcXVlbmNlTnVtYmVyLCB2YXJpYWJsZSwgcHJldmlvdXMsIHByZXZpb3VzRm9yVmFyaWFibGUsCiAgICAgICAgICAgIGZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ2lzQ2hlY2soJGNoZWNrZWRUeXBlKSc7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIF9jb21wdXRlUHJvbW90ZWRUeXBlKAogICAgICBUeXBlUHJvbW90ZXJJbXBsIHByb21vdGVyLCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUpIHsKICAgIHZhciBwcmV2aW91c1Byb21vdGVkVHlwZSA9CiAgICAgICAgcHJldmlvdXNGb3JWYXJpYWJsZT8uX2NvbXB1dGVQcm9tb3RlZFR5cGUocHJvbW90ZXIsIHNjb3BlKTsKCiAgICAvLyBJZiB0aGUgdmFyaWFibGUgd2FzIG11dGF0ZWQgc29tZXdoZXJlIGluIHRoZSBzY29wZSBvZiB0aGUgcG90ZW50aWFsCiAgICAvLyBwcm9tb3Rpb24sIHByb21vdGlvbiBkb2VzIG5vdCBvY2N1ci4KICAgIGlmIChfbXV0YXRlZEluU2NvcGVzICE9IG51bGwpIHsKICAgICAgZm9yICh2YXIgYXNzaWdubWVudFNjb3BlIGluIF9tdXRhdGVkSW5TY29wZXMpIHsKICAgICAgICBpZiAoYXNzaWdubWVudFNjb3BlLmNvbnRhaW5zU2NvcGUoc2NvcGUpKSB7CiAgICAgICAgICByZXR1cm4gcHJldmlvdXNQcm9tb3RlZFR5cGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gSWYgdGhlIHZhcmlhYmxlIHdhcyBtdXRhdGVkIGFueXdoZXJlLCBhbmQgaXQgd2FzIGFjY2Vzc2VkIGluc2lkZSBhCiAgICAvLyBjbG9zdXJlIHNvbWV3aGVyZSBpbiB0aGUgc2NvcGUgb2YgdGhlIHBvdGVudGlhbCBwcm9tb3Rpb24sIHByb21vdGlvbiBkb2VzCiAgICAvLyBub3Qgb2NjdXIuCiAgICBpZiAocHJvbW90ZXIud2FzVmFyaWFibGVNdXRhdGVkQW55d2hlcmUodmFyaWFibGUpICYmCiAgICAgICAgX2FjY2Vzc2VkSW5DbG9zdXJlSW5TY29wZXMgIT0gbnVsbCkgewogICAgICBmb3IgKHZhciBhY2Nlc3NTY29wZSBpbiBfYWNjZXNzZWRJbkNsb3N1cmVJblNjb3BlcykgewogICAgICAgIGlmIChhY2Nlc3NTY29wZS5jb250YWluc1Njb3BlKHNjb3BlKSkgewogICAgICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbW90ZWRUeXBlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIFdoYXQgd2UgZG8gbm93IGRlcGVuZHMgb24gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBwcmV2aW91cyB0eXBlIG9mCiAgICAvLyB0aGUgdmFyaWFibGUgYW5kIHRoZSB0eXBlIHdlIGFyZSBjaGVja2luZyBhZ2FpbnN0LgogICAgdmFyIHByZXZpb3VzVHlwZSA9IHByZXZpb3VzUHJvbW90ZWRUeXBlID8/IHZhcmlhYmxlLnR5cGU7CiAgICBpZiAocHJvbW90ZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmlzU3VidHlwZU9mKGNoZWNrZWRUeXBlLCBwcmV2aW91c1R5cGUpKSB7CiAgICAgIC8vIFRoZSB0eXBlIHdlIGFyZSBjaGVja2luZyBhZ2FpbnN0IGlzIGEgc3VidHlwZSBvZiB0aGUgcHJldmlvdXMgdHlwZSBvZgogICAgICAvLyB0aGUgdmFyaWFibGUsIHNvIHRoaXMgaXMgYSByZWZpbmVtZW50OyB3ZSBjYW4gcHJvbW90ZS4KICAgICAgcmV0dXJuIGNoZWNrZWRUeXBlOwogICAgfSBlbHNlIGlmIChwcmV2aW91c1R5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICBwcm9tb3Rlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgLmlzU3VidHlwZU9mKGNoZWNrZWRUeXBlLCBwcmV2aW91c1R5cGUuYm91bmQpKSB7CiAgICAgIC8vIFRoZSB0eXBlIHdlIGFyZSBjaGVja2luZyBhZ2FpbnN0IGlzIGEgc3VidHlwZSBvZiB0aGUgYm91bmQgb2YgdGhlCiAgICAgIC8vIHByZXZpb3VzIHR5cGUgb2YgdGhlIHZhcmlhYmxlOyB3ZSBjYW4gcHJvbW90ZSB0aGUgYm91bmQuCiAgICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUocHJldmlvdXNUeXBlLnBhcmFtZXRlciwgY2hlY2tlZFR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhlIHR5cGVzIGFyZW4ndCBzdWZmaWNpZW50bHkgcmVsYXRlZDsgd2UgY2FuJ3QgcHJvbW90ZS4KICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbW90ZWRUeXBlOwogICAgfQogIH0KfQoKLy8vIFtUeXBlUHJvbW90aW9uU2NvcGVdIHJlcHJlc2VudGluZyB0aGUgUkhTIG9mIGEgbG9naWNhbCBleHByZXNzaW9uLgpjbGFzcyBfTG9naWNhbFNjb3BlIGV4dGVuZHMgVHlwZVByb21vdGlvblNjb3BlIHsKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxvZ2ljYWwgb3BlcmF0aW9uIGlzIGFuIGAmJmAgb3IgYW4gYHx8YC4KICBmaW5hbCBib29sIGlzQW5kOwoKICAvLy8gVGhlIGZhY3Qgc3RhdGUgaW4gZWZmZWN0IGlmIHRoZSBsb2dpY2FsIGV4cHJlc3Npb24gZ2V0cyBzaG9ydC1jdXQuCiAgZmluYWwgVHlwZVByb21vdGlvbkZhY3Qgc2hvcnRjdXRGYWN0czsKCiAgX0xvZ2ljYWxTY29wZShUeXBlUHJvbW90aW9uU2NvcGUgZW5jbG9zaW5nLCB0aGlzLmlzQW5kLCB0aGlzLnNob3J0Y3V0RmFjdHMpCiAgICAgIDogc3VwZXIoZW5jbG9zaW5nKTsKfQoKLy8vIEluc3RhbmNlIG9mIFtUeXBlUHJvbW90aW9uRmFjdF0gcmVwcmVzZW50aW5nIHRoZSBmYWN0cyB3aGljaCBhcmUga25vd24gb24KLy8vIGVudHJ5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LAogICAgICAgIFRyZWVOb2RlLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24sCiAgICAgICAgc2V0UGFyZW50cywKICAgICAgICB0cmFuc2Zvcm1MaXN0LAogICAgICAgIHZpc2l0TGlzdDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBzaG93IFR5cGVFbnZpcm9ubWVudDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdmlzaXRvci5kYXJ0JwogICAgc2hvdwogICAgICAgIEV4cHJlc3Npb25WaXNpdG9yLAogICAgICAgIEV4cHJlc3Npb25WaXNpdG9yMSwKICAgICAgICBUcmFuc2Zvcm1lciwKICAgICAgICBUcmVlVmlzaXRvciwKICAgICAgICBWaXNpdG9yOwoKaW1wb3J0ICcuLi9tZXNzYWdlcy5kYXJ0JwogICAgc2hvdyB0ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3QsIHRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Q7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgZ2V0RmlsZVVyaSwgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL2luZmVyZW5jZV9oZWxwZXIuZGFydCcgc2hvdyBJbmZlcmVuY2VIZWxwZXI7CgovLy8gTWl4aW4gZm9yIHNwcmVhZCBhbmQgY29udHJvbC1mbG93IGVsZW1lbnRzLgovLy8KLy8vIFNwcmVhZCBhbmQgY29udHJvbC1mbG93IGVsZW1lbnRzIGFyZSBub3QgdHJ1bHkgZXhwcmVzc2lvbnMgYW5kIHRoZXkgY2Fubm90Ci8vLyBhcHBlYXIgaW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24gY29udGV4dHMgaW4gdGhlIEtlcm5lbCBwcm9ncmFtLiAgVGhleSBjYW4KLy8vIG9ubHkgYXBwZWFyIGFzIGVsZW1lbnRzIGluIGxpc3Qgb3Igc2V0IGxpdGVyYWxzLiAgVGhleSBhcmUgdHJhbnNsYXRlZCBpbnRvCi8vLyBhIGxvd2VyLWxldmVsIHJlcHJlc2VudGF0aW9uIGFuZCBuZXZlciBzZXJpYWxpemVkIHRvIC5kaWxsIGZpbGVzLgptaXhpbiBDb250cm9sRmxvd0VsZW1lbnQgb24gRXhwcmVzc2lvbiB7CiAgLy8vIFNwcmVhZCBhbmQgY29udG9sLWZsb3cgZWxlbWVudHMgYXJlIG5vdCBleHByZXNzaW9ucyBhbmQgZG8gbm90IGhhdmUgYQogIC8vLyBzdGF0aWMgdHlwZS4KICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCB0eXBlcykgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJnZXRTdGF0aWNUeXBlIiwgZmlsZU9mZnNldCwgZ2V0RmlsZVVyaSh0aGlzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3I8T2JqZWN0PiB2KSA9PiB2LmRlZmF1bHRFeHByZXNzaW9uKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQxKEV4cHJlc3Npb25WaXNpdG9yMTxPYmplY3QsIE9iamVjdD4gdiwgYXJnKSA9PgogICAgICB2LmRlZmF1bHRFeHByZXNzaW9uKHRoaXMsIGFyZyk7Cn0KCi8vLyBBIHNwcmVhZCBlbGVtZW50IGluIGEgbGlzdCBvciBzZXQgbGl0ZXJhbC4KY2xhc3MgU3ByZWFkRWxlbWVudCBleHRlbmRzIEV4cHJlc3Npb24gd2l0aCBDb250cm9sRmxvd0VsZW1lbnQgewogIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKICBib29sIGlzTnVsbEF3YXJlOwoKICAvLy8gVGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgW2V4cHJlc3Npb25dIGV2YWx1YXRlcyB0by4KICAvLy8KICAvLy8gSXQgaXMgc2V0IGR1cmluZyB0eXBlIGluZmVyZW5jZSBhbmQgaXMgdXNlZCB0byBhZGQgYXBwcm9wcmlhdGUgdHlwZSBjYXN0cwogIC8vLyBkdXJpbmcgdGhlIGRlc3VnYXJpbmcuCiAgRGFydFR5cGUgZWxlbWVudFR5cGU7CgogIFNwcmVhZEVsZW1lbnQodGhpcy5leHByZXNzaW9uLCB0aGlzLmlzTnVsbEF3YXJlKSB7CiAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yPE9iamVjdD4gdikgewogICAgZXhwcmVzc2lvbj8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgewogICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5hY2NlcHQodik7CiAgICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQW4gJ2lmJyBlbGVtZW50IGluIGEgbGlzdCBvciBzZXQgbGl0ZXJhbC4KY2xhc3MgSWZFbGVtZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB3aXRoIENvbnRyb2xGbG93RWxlbWVudCB7CiAgRXhwcmVzc2lvbiBjb25kaXRpb247CiAgRXhwcmVzc2lvbiB0aGVuOwogIEV4cHJlc3Npb24gb3RoZXJ3aXNlOwoKICBJZkVsZW1lbnQodGhpcy5jb25kaXRpb24sIHRoaXMudGhlbiwgdGhpcy5vdGhlcndpc2UpIHsKICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIHRoZW4/LnBhcmVudCA9IHRoaXM7CiAgICBvdGhlcndpc2U/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENoaWxkcmVuKFZpc2l0b3I8T2JqZWN0PiB2KSB7CiAgICBjb25kaXRpb24/LmFjY2VwdCh2KTsKICAgIHRoZW4/LmFjY2VwdCh2KTsKICAgIG90aGVyd2lzZT8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5hY2NlcHQodik7CiAgICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh0aGVuICE9IG51bGwpIHsKICAgICAgdGhlbiA9IHRoZW4uYWNjZXB0KHYpOwogICAgICB0aGVuPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKG90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIG90aGVyd2lzZSA9IG90aGVyd2lzZS5hY2NlcHQodik7CiAgICAgIG90aGVyd2lzZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBBICdmb3InIGVsZW1lbnQgaW4gYSBsaXN0IG9yIHNldCBsaXRlcmFsLgpjbGFzcyBGb3JFbGVtZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB3aXRoIENvbnRyb2xGbG93RWxlbWVudCB7CiAgZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXM7IC8vIE1heSBiZSBlbXB0eSwgYnV0IG5vdCBudWxsLgogIEV4cHJlc3Npb24gY29uZGl0aW9uOyAvLyBNYXkgYmUgbnVsbC4KICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZXM7IC8vIE1heSBiZSBlbXB0eSwgYnV0IG5vdCBudWxsLgogIEV4cHJlc3Npb24gYm9keTsKCiAgRm9yRWxlbWVudCh0aGlzLnZhcmlhYmxlcywgdGhpcy5jb25kaXRpb24sIHRoaXMudXBkYXRlcywgdGhpcy5ib2R5KSB7CiAgICBzZXRQYXJlbnRzKHZhcmlhYmxlcywgdGhpcyk7CiAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICBzZXRQYXJlbnRzKHVwZGF0ZXMsIHRoaXMpOwogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxPYmplY3Q+IHYpIHsKICAgIHZpc2l0TGlzdCh2YXJpYWJsZXMsIHYpOwogICAgY29uZGl0aW9uPy5hY2NlcHQodik7CiAgICB2aXNpdExpc3QodXBkYXRlcywgdik7CiAgICBib2R5Py5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KHZhcmlhYmxlcywgdiwgdGhpcyk7CiAgICBpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFjY2VwdCh2KTsKICAgICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgdHJhbnNmb3JtTGlzdCh1cGRhdGVzLCB2LCB0aGlzKTsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEEgJ2Zvci1pbicgZWxlbWVudCBpbiBhIGxpc3Qgb3Igc2V0IGxpdGVyYWwuCmNsYXNzIEZvckluRWxlbWVudCBleHRlbmRzIEV4cHJlc3Npb24gd2l0aCBDb250cm9sRmxvd0VsZW1lbnQgewogIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGU7IC8vIEhhcyBubyBpbml0aWFsaXplci4KICBFeHByZXNzaW9uIGl0ZXJhYmxlOwogIFN0YXRlbWVudCBwcm9sb2d1ZTsgLy8gTWF5IGJlIG51bGwuCiAgRXhwcmVzc2lvbiBib2R5OwogIEV4cHJlc3Npb24gcHJvYmxlbTsgLy8gTWF5IGJlIG51bGwuCiAgYm9vbCBpc0FzeW5jOyAvLyBUcnVlIGlmIHRoaXMgaXMgYW4gJ2F3YWl0IGZvcicgbG9vcC4KCiAgRm9ySW5FbGVtZW50KAogICAgICB0aGlzLnZhcmlhYmxlLCB0aGlzLml0ZXJhYmxlLCB0aGlzLnByb2xvZ3VlLCB0aGlzLmJvZHksIHRoaXMucHJvYmxlbSwKICAgICAge3RoaXMuaXNBc3luYzogZmFsc2V9KSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIGl0ZXJhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgcHJvbG9ndWU/LnBhcmVudCA9IHRoaXM7CiAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgcHJvYmxlbT8ucGFyZW50ID0gdGhpczsKICB9CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxPYmplY3Q+IHYpIHsKICAgIHZhcmlhYmxlPy5hY2NlcHQodik7CiAgICBpdGVyYWJsZT8uYWNjZXB0KHYpOwogICAgcHJvbG9ndWU/LmFjY2VwdCh2KTsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICAgIHByb2JsZW0/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmICh2YXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIHZhcmlhYmxlID0gdmFyaWFibGUuYWNjZXB0KHYpOwogICAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChpdGVyYWJsZSAhPSBudWxsKSB7CiAgICAgIGl0ZXJhYmxlID0gaXRlcmFibGUuYWNjZXB0KHYpOwogICAgICBpdGVyYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChwcm9sb2d1ZSAhPSBudWxsKSB7CiAgICAgIHByb2xvZ3VlID0gcHJvbG9ndWUuYWNjZXB0KHYpOwogICAgICBwcm9sb2d1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHByb2JsZW0gIT0gbnVsbCkgewogICAgICBwcm9ibGVtID0gcHJvYmxlbS5hY2NlcHQodik7CiAgICAgIHByb2JsZW0/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgptaXhpbiBDb250cm9sRmxvd01hcEVudHJ5IGltcGxlbWVudHMgTWFwRW50cnkgewogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZ2V0IGtleSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCdDb250cm9sRmxvd01hcEVudHJ5LmtleSBnZXR0ZXInKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgc2V0IGtleShFeHByZXNzaW9uIGV4cHIpIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoJ0NvbnRyb2xGbG93TWFwRW50cnkua2V5IHNldHRlcicpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBnZXQgdmFsdWUgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcignQ29udHJvbEZsb3dNYXBFbnRyeS52YWx1ZSBnZXR0ZXInKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgc2V0IHZhbHVlKEV4cHJlc3Npb24gZXhwcikgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcignQ29udHJvbEZsb3dNYXBFbnRyeS52YWx1ZSBzZXR0ZXInKTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChUcmVlVmlzaXRvcjxPYmplY3Q+IHYpID0+IHYuZGVmYXVsdFRyZWVOb2RlKHRoaXMpOwp9CgovLy8gQSBzcHJlYWQgZWxlbWVudCBpbiBhIG1hcCBsaXRlcmFsLgpjbGFzcyBTcHJlYWRNYXBFbnRyeSBleHRlbmRzIFRyZWVOb2RlIHdpdGggQ29udHJvbEZsb3dNYXBFbnRyeSB7CiAgRXhwcmVzc2lvbiBleHByZXNzaW9uOwogIGJvb2wgaXNOdWxsQXdhcmU7CgogIC8vLyBUaGUgdHlwZSBvZiB0aGUgbWFwIGVudHJpZXMgb2YgdGhlIG1hcCB0aGF0IFtleHByZXNzaW9uXSBldmFsdWF0ZXMgdG8uCiAgLy8vCiAgLy8vIEl0IGlzIHNldCBkdXJpbmcgdHlwZSBpbmZlcmVuY2UgYW5kIGlzIHVzZWQgdG8gYWRkIGFwcHJvcHJpYXRlIHR5cGUgY2FzdHMKICAvLy8gZHVyaW5nIHRoZSBkZXN1Z2FyaW5nLgogIERhcnRUeXBlIGVudHJ5VHlwZTsKCiAgU3ByZWFkTWFwRW50cnkodGhpcy5leHByZXNzaW9uLCB0aGlzLmlzTnVsbEF3YXJlKSB7CiAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yPE9iamVjdD4gdikgewogICAgZXhwcmVzc2lvbj8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgewogICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5hY2NlcHQodik7CiAgICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQW4gJ2lmJyBlbGVtZW50IGluIGEgbWFwIGxpdGVyYWwuCmNsYXNzIElmTWFwRW50cnkgZXh0ZW5kcyBUcmVlTm9kZSB3aXRoIENvbnRyb2xGbG93TWFwRW50cnkgewogIEV4cHJlc3Npb24gY29uZGl0aW9uOwogIE1hcEVudHJ5IHRoZW47CiAgTWFwRW50cnkgb3RoZXJ3aXNlOwoKICBJZk1hcEVudHJ5KHRoaXMuY29uZGl0aW9uLCB0aGlzLnRoZW4sIHRoaXMub3RoZXJ3aXNlKSB7CiAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICB0aGVuPy5wYXJlbnQgPSB0aGlzOwogICAgb3RoZXJ3aXNlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yPE9iamVjdD4gdikgewogICAgY29uZGl0aW9uPy5hY2NlcHQodik7CiAgICB0aGVuPy5hY2NlcHQodik7CiAgICBvdGhlcndpc2U/LmFjY2VwdCh2KTsKICB9CgogIEBvdmVycmlkZQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkgewogICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uYWNjZXB0KHYpOwogICAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAodGhlbiAhPSBudWxsKSB7CiAgICAgIHRoZW4gPSB0aGVuLmFjY2VwdCh2KTsKICAgICAgdGhlbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChvdGhlcndpc2UgIT0gbnVsbCkgewogICAgICBvdGhlcndpc2UgPSBvdGhlcndpc2UuYWNjZXB0KHYpOwogICAgICBvdGhlcndpc2U/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQSAnZm9yJyBlbGVtZW50IGluIGEgbWFwIGxpdGVyYWwuCmNsYXNzIEZvck1hcEVudHJ5IGV4dGVuZHMgVHJlZU5vZGUgd2l0aCBDb250cm9sRmxvd01hcEVudHJ5IHsKICBmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlczsgLy8gTWF5IGJlIGVtcHR5LCBidXQgbm90IG51bGwuCiAgRXhwcmVzc2lvbiBjb25kaXRpb247IC8vIE1heSBiZSBudWxsLgogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gdXBkYXRlczsgLy8gTWF5IGJlIGVtcHR5LCBidXQgbm90IG51bGwuCiAgTWFwRW50cnkgYm9keTsKCiAgRm9yTWFwRW50cnkodGhpcy52YXJpYWJsZXMsIHRoaXMuY29uZGl0aW9uLCB0aGlzLnVwZGF0ZXMsIHRoaXMuYm9keSkgewogICAgc2V0UGFyZW50cyh2YXJpYWJsZXMsIHRoaXMpOwogICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgc2V0UGFyZW50cyh1cGRhdGVzLCB0aGlzKTsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENoaWxkcmVuKFZpc2l0b3I8T2JqZWN0PiB2KSB7CiAgICB2aXNpdExpc3QodmFyaWFibGVzLCB2KTsKICAgIGNvbmRpdGlvbj8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KHVwZGF0ZXMsIHYpOwogICAgYm9keT8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdCh2YXJpYWJsZXMsIHYsIHRoaXMpOwogICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5hY2NlcHQodik7CiAgICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHRyYW5zZm9ybUxpc3QodXBkYXRlcywgdiwgdGhpcyk7CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdCh2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBBICdmb3ItaW4nIGVsZW1lbnQgaW4gYSBtYXAgbGl0ZXJhbC4KY2xhc3MgRm9ySW5NYXBFbnRyeSBleHRlbmRzIFRyZWVOb2RlIHdpdGggQ29udHJvbEZsb3dNYXBFbnRyeSB7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsgLy8gSGFzIG5vIGluaXRpYWxpemVyLgogIEV4cHJlc3Npb24gaXRlcmFibGU7CiAgU3RhdGVtZW50IHByb2xvZ3VlOyAvLyBNYXkgYmUgbnVsbC4KICBNYXBFbnRyeSBib2R5OwogIEV4cHJlc3Npb24gcHJvYmxlbTsgLy8gTWF5IGJlIG51bGwuCiAgYm9vbCBpc0FzeW5jOyAvLyBUcnVlIGlmIHRoaXMgaXMgYW4gJ2F3YWl0IGZvcicgbG9vcC4KCiAgRm9ySW5NYXBFbnRyeSgKICAgICAgdGhpcy52YXJpYWJsZSwgdGhpcy5pdGVyYWJsZSwgdGhpcy5wcm9sb2d1ZSwgdGhpcy5ib2R5LCB0aGlzLnByb2JsZW0sCiAgICAgIHt0aGlzLmlzQXN5bmM6IGZhbHNlfSkgewogICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICBpdGVyYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIHByb2xvZ3VlPy5wYXJlbnQgPSB0aGlzOwogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIHByb2JsZW0/LnBhcmVudCA9IHRoaXM7CiAgfQoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3I8T2JqZWN0PiB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogICAgaXRlcmFibGU/LmFjY2VwdCh2KTsKICAgIHByb2xvZ3VlPy5hY2NlcHQodik7CiAgICBib2R5Py5hY2NlcHQodik7CiAgICBwcm9ibGVtPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAodmFyaWFibGUgIT0gbnVsbCkgewogICAgICB2YXJpYWJsZSA9IHZhcmlhYmxlLmFjY2VwdCh2KTsKICAgICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoaXRlcmFibGUgIT0gbnVsbCkgewogICAgICBpdGVyYWJsZSA9IGl0ZXJhYmxlLmFjY2VwdCh2KTsKICAgICAgaXRlcmFibGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAocHJvbG9ndWUgIT0gbnVsbCkgewogICAgICBwcm9sb2d1ZSA9IHByb2xvZ3VlLmFjY2VwdCh2KTsKICAgICAgcHJvbG9ndWU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdCh2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChwcm9ibGVtICE9IG51bGwpIHsKICAgICAgcHJvYmxlbSA9IHByb2JsZW0uYWNjZXB0KHYpOwogICAgICBwcm9ibGVtPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKRXhwcmVzc2lvbiBjb252ZXJ0VG9FbGVtZW50KE1hcEVudHJ5IGVudHJ5LCBJbmZlcmVuY2VIZWxwZXIgaGVscGVyKSB7CiAgaWYgKGVudHJ5IGlzIFNwcmVhZE1hcEVudHJ5KSB7CiAgICByZXR1cm4gbmV3IFNwcmVhZEVsZW1lbnQoZW50cnkuZXhwcmVzc2lvbiwgZW50cnkuaXNOdWxsQXdhcmUpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVudHJ5LmV4cHJlc3Npb24uZmlsZU9mZnNldDsKICB9CiAgaWYgKGVudHJ5IGlzIElmTWFwRW50cnkpIHsKICAgIHJldHVybiBuZXcgSWZFbGVtZW50KAogICAgICAgIGVudHJ5LmNvbmRpdGlvbiwKICAgICAgICBjb252ZXJ0VG9FbGVtZW50KGVudHJ5LnRoZW4sIGhlbHBlciksCiAgICAgICAgZW50cnkub3RoZXJ3aXNlID09IG51bGwKICAgICAgICAgICAgPyBudWxsCiAgICAgICAgICAgIDogY29udmVydFRvRWxlbWVudChlbnRyeS5vdGhlcndpc2UsIGhlbHBlcikpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVudHJ5LmZpbGVPZmZzZXQ7CiAgfQogIGlmIChlbnRyeSBpcyBGb3JNYXBFbnRyeSkgewogICAgcmV0dXJuIG5ldyBGb3JFbGVtZW50KGVudHJ5LnZhcmlhYmxlcywgZW50cnkuY29uZGl0aW9uLCBlbnRyeS51cGRhdGVzLAogICAgICAgIGNvbnZlcnRUb0VsZW1lbnQoZW50cnkuYm9keSwgaGVscGVyKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZW50cnkuZmlsZU9mZnNldDsKICB9CiAgaWYgKGVudHJ5IGlzIEZvckluTWFwRW50cnkpIHsKICAgIHJldHVybiBuZXcgRm9ySW5FbGVtZW50KGVudHJ5LnZhcmlhYmxlLCBlbnRyeS5pdGVyYWJsZSwgZW50cnkucHJvbG9ndWUsCiAgICAgICAgY29udmVydFRvRWxlbWVudChlbnRyeS5ib2R5LCBoZWxwZXIpLCBlbnRyeS5wcm9ibGVtLAogICAgICAgIGlzQXN5bmM6IGVudHJ5LmlzQXN5bmMpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVudHJ5LmZpbGVPZmZzZXQ7CiAgfQogIHJldHVybiBoZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgIHRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnLCcpLAogICAgZW50cnkuZmlsZU9mZnNldCwKICAgIDEsCiAgKSk7Cn0KCmJvb2wgaXNDb252ZXJ0aWJsZVRvTWFwRW50cnkoRXhwcmVzc2lvbiBlbGVtZW50KSB7CiAgaWYgKGVsZW1lbnQgaXMgU3ByZWFkRWxlbWVudCkgcmV0dXJuIHRydWU7CiAgaWYgKGVsZW1lbnQgaXMgSWZFbGVtZW50KSB7CiAgICByZXR1cm4gaXNDb252ZXJ0aWJsZVRvTWFwRW50cnkoZWxlbWVudC50aGVuKSAmJgogICAgICAgIChlbGVtZW50Lm90aGVyd2lzZSA9PSBudWxsIHx8CiAgICAgICAgICAgIGlzQ29udmVydGlibGVUb01hcEVudHJ5KGVsZW1lbnQub3RoZXJ3aXNlKSk7CiAgfQogIGlmIChlbGVtZW50IGlzIEZvckVsZW1lbnQpIHsKICAgIHJldHVybiBpc0NvbnZlcnRpYmxlVG9NYXBFbnRyeShlbGVtZW50LmJvZHkpOwogIH0KICBpZiAoZWxlbWVudCBpcyBGb3JJbkVsZW1lbnQpIHsKICAgIHJldHVybiBpc0NvbnZlcnRpYmxlVG9NYXBFbnRyeShlbGVtZW50LmJvZHkpOwogIH0KICByZXR1cm4gZmFsc2U7Cn0KCk1hcEVudHJ5IGNvbnZlcnRUb01hcEVudHJ5KEV4cHJlc3Npb24gZWxlbWVudCwgSW5mZXJlbmNlSGVscGVyIGhlbHBlcikgewogIGlmIChlbGVtZW50IGlzIFNwcmVhZEVsZW1lbnQpIHsKICAgIHJldHVybiBuZXcgU3ByZWFkTWFwRW50cnkoZWxlbWVudC5leHByZXNzaW9uLCBlbGVtZW50LmlzTnVsbEF3YXJlKQogICAgICAuLmZpbGVPZmZzZXQgPSBlbGVtZW50LmV4cHJlc3Npb24uZmlsZU9mZnNldDsKICB9CiAgaWYgKGVsZW1lbnQgaXMgSWZFbGVtZW50KSB7CiAgICByZXR1cm4gbmV3IElmTWFwRW50cnkoCiAgICAgICAgZWxlbWVudC5jb25kaXRpb24sCiAgICAgICAgY29udmVydFRvTWFwRW50cnkoZWxlbWVudC50aGVuLCBoZWxwZXIpLAogICAgICAgIGVsZW1lbnQub3RoZXJ3aXNlID09IG51bGwKICAgICAgICAgICAgPyBudWxsCiAgICAgICAgICAgIDogY29udmVydFRvTWFwRW50cnkoZWxlbWVudC5vdGhlcndpc2UsIGhlbHBlcikpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVsZW1lbnQuZmlsZU9mZnNldDsKICB9CiAgaWYgKGVsZW1lbnQgaXMgRm9yRWxlbWVudCkgewogICAgcmV0dXJuIG5ldyBGb3JNYXBFbnRyeShlbGVtZW50LnZhcmlhYmxlcywgZWxlbWVudC5jb25kaXRpb24sCiAgICAgICAgZWxlbWVudC51cGRhdGVzLCBjb252ZXJ0VG9NYXBFbnRyeShlbGVtZW50LmJvZHksIGhlbHBlcikpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVsZW1lbnQuZmlsZU9mZnNldDsKICB9CiAgaWYgKGVsZW1lbnQgaXMgRm9ySW5FbGVtZW50KSB7CiAgICByZXR1cm4gbmV3IEZvckluTWFwRW50cnkoCiAgICAgICAgZWxlbWVudC52YXJpYWJsZSwKICAgICAgICBlbGVtZW50Lml0ZXJhYmxlLAogICAgICAgIGVsZW1lbnQucHJvbG9ndWUsCiAgICAgICAgY29udmVydFRvTWFwRW50cnkoZWxlbWVudC5ib2R5LCBoZWxwZXIpLAogICAgICAgIGVsZW1lbnQucHJvYmxlbSwKICAgICAgICBpc0FzeW5jOiBlbGVtZW50LmlzQXN5bmMpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVsZW1lbnQuZmlsZU9mZnNldDsKICB9CiAgcmV0dXJuIG5ldyBNYXBFbnRyeSgKICAgICAgaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgdGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJzonKSwKICAgICAgICBlbGVtZW50LmZpbGVPZmZzZXQsCiAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IHdoYXQgaXMgdGhlIGxlbmd0aCBvZiB0aGUgZXhwcmVzc2lvbj8KICAgICAgICAxLAogICAgICApKSwKICAgICAgbmV3IE51bGxMaXRlcmFsKCkpOwp9CoHeAE5OPBsBIgEhCRIUEhUTEh0UFxMBRAElCRscFRURARo+ATgBRwEwBE9NT0YpTBMMMkcEAQxEAQw4JgIBL0EZFAFRBlAdGAE1HwQBDCUbBAEMJR4pIQYEAgEuPRgTGAE5HhkeBAEMJRoVGgQBDCUdJyAGGB0bBh0nIAYEAgEuPkwoQRMBSCEeHxkEAQwlHRobFQQBDCUnHScgBiUYHRsGBAIBMUA3FyYTJjgBEEwfHR0dGRwEASUZGRkVGAQBJRwlHwYcJR8GHCUfBhgdGwYbIx4GBAIBMAwXPgQBDCI+BAEMGUAEAQwkQAQBDDwCASdBGRQBTQZQHRYBNh8EAQwlGwQBDCUeKSEGBAIBJj0YERYBOh4ZHgQBDCUaFRoEAQwlHScgBhgdGwYdJyAGBAIBJj5MKEERAUkhHh8ZBAEMJR0aGxUEAQwlJx0nIAYlGB0bBgQCASlANxcmESY4ARFMHx0dHRkcBAElGRkZFRgEASUcJR8GHCUfBhwlHwYYHRsGGyMeBgQCAUYhQjIEHRoZLiATOScEHksuJwQgTD0gJwRALxYHBgIBMy0eNCY5BB8yBCEyBBACAUkiRzQEHhsbMSITPCkEH0FCKQQhHhoaGjEZIikEFz04HEELChoCATNwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2NvbGxlY3Rpb25zLmRhcnQ6c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9jb25zdG5lc3MuZGFydIEyLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuY29uc3RuZXNzOwoKZW51bSBDb25zdG5lc3MgewogIGV4cGxpY2l0Q29uc3QsCiAgZXhwbGljaXROZXcsCiAgaW1wbGljaXQsCn0KDQBOTjwBGQEREQ8MAgExcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9jb25zdG5lc3MuZGFydEVzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2V4cHJlc3Npb25fZ2VuZXJhdG9yLmRhcnTAAZrsLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBBIGxpYnJhcnkgdG8gaGVscCBnZW5lcmF0ZSBleHByZXNzaW9uLgpsaWJyYXJ5IGZhc3RhLmV4cHJlc3Npb25fZ2VuZXJhdG9yOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBDb25zdHJ1Y3RvciwKICAgICAgICBGaWVsZCwKICAgICAgICBJbnZhbGlkRXhwcmVzc2lvbiwKICAgICAgICBMZXQsCiAgICAgICAgTm9kZSwKICAgICAgICBQcm9wZXJ0eUdldCwKICAgICAgICBQcm9wZXJ0eVNldCwKICAgICAgICBTdGF0aWNTZXQsCiAgICAgICAgU3VwZXJNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIFN1cGVyUHJvcGVydHlTZXQsCiAgICAgICAgVHJlZU5vZGUsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBWYXJpYWJsZUdldCwKICAgICAgICBWYXJpYWJsZVNldDsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICcuLi9jb25zdGFudF9jb250ZXh0LmRhcnQnIHNob3cgQ29uc3RhbnRDb250ZXh0OwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgVGVtcGxhdGUsCiAgICAgICAgbWVzc2FnZUNhbm5vdEFzc2lnblRvU3VwZXIsCiAgICAgICAgbWVzc2FnZUNhbm5vdEFzc2lnblRvUGFyZW50aGVzaXplZEV4cHJlc3Npb24sCiAgICAgICAgbWVzc2FnZUNhbnRVc2VQcmVmaXhBc0V4cHJlc3Npb24sCiAgICAgICAgbWVzc2FnZUNhbnRVc2VQcmVmaXhXaXRoTnVsbEF3YXJlLAogICAgICAgIG1lc3NhZ2VJbGxlZ2FsQXNzaWdubWVudFRvTm9uQXNzaWduYWJsZSwKICAgICAgICBtZXNzYWdlSW52YWxpZEluaXRpYWxpemVyLAogICAgICAgIG1lc3NhZ2VJbnZhbGlkVXNlT2ZOdWxsQXdhcmVBY2Nlc3MsCiAgICAgICAgbWVzc2FnZUxvYWRMaWJyYXJ5VGFrZXNOb0FyZ3VtZW50cywKICAgICAgICBtZXNzYWdlTm90QUNvbnN0YW50RXhwcmVzc2lvbiwKICAgICAgICBtZXNzYWdlTm90QW5MdmFsdWUsCiAgICAgICAgbWVzc2FnZVN1cGVyQXNFeHByZXNzaW9uLAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlQ2FudFVzZURlZmVycmVkUHJlZml4QXNDb25zdGFudCwKICAgICAgICB0ZW1wbGF0ZUNvbnN0cnVjdG9yTm90Rm91bmQsCiAgICAgICAgdGVtcGxhdGVEZWZlcnJlZFR5cGVBbm5vdGF0aW9uLAogICAgICAgIHRlbXBsYXRlTWlzc2luZ0V4cGxpY2l0VHlwZUFyZ3VtZW50cywKICAgICAgICB0ZW1wbGF0ZU5vdENvbnN0YW50RXhwcmVzc2lvbiwKICAgICAgICB0ZW1wbGF0ZU5vdEFQcmVmaXhJblR5cGVBbm5vdGF0aW9uLAogICAgICAgIHRlbXBsYXRlTm90QVR5cGUsCiAgICAgICAgdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9Db25zdHJ1Y3RvciwKICAgICAgICB0ZW1wbGF0ZVRoaXNPclN1cGVyQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyLAogICAgICAgIHRlbXBsYXRlVW5yZXNvbHZlZFByZWZpeEluVHlwZUFubm90YXRpb247CgppbXBvcnQgJy4uL25hbWVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgYW1wZXJzYW5kTmFtZSwKICAgICAgICBiYXJOYW1lLAogICAgICAgIGNhbGxOYW1lLAogICAgICAgIGNhcmV0TmFtZSwKICAgICAgICBkaXZpc2lvbk5hbWUsCiAgICAgICAgZXF1YWxzTmFtZSwKICAgICAgICBpbmRleEdldE5hbWUsCiAgICAgICAgaW5kZXhTZXROYW1lLAogICAgICAgIGxlZnRTaGlmdE5hbWUsCiAgICAgICAgbGVuZ3RoTmFtZSwKICAgICAgICBtaW51c05hbWUsCiAgICAgICAgbXVsdGlwbHlOYW1lLAogICAgICAgIG11c3RhY2hlTmFtZSwKICAgICAgICBwZXJjZW50TmFtZSwKICAgICAgICBwbHVzTmFtZSwKICAgICAgICByaWdodFNoaWZ0TmFtZSwKICAgICAgICB0cmlwbGVTaGlmdE5hbWU7CgppbXBvcnQgJy4uL3BhcnNlci5kYXJ0JyBzaG93IGxlbmd0aEZvclRva2VuLCBsZW5ndGhPZlNwYW4sIG9mZnNldEZvclRva2VuOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuaGFuZGxlZCwgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnOwoKaW1wb3J0ICdib2R5X2J1aWxkZXIuZGFydCcgc2hvdyBub0xvY2F0aW9uOwoKaW1wb3J0ICdjb25zdG5lc3MuZGFydCcgc2hvdyBDb25zdG5lc3M7CgppbXBvcnQgJ2V4cHJlc3Npb25fZ2VuZXJhdG9yX2hlbHBlci5kYXJ0JyBzaG93IEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXI7CgppbXBvcnQgJ2ZvcmVzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEZvcmVzdCwKICAgICAgICBMb2FkTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgUHJlZml4QnVpbGRlciwKICAgICAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyLAogICAgICAgIFVubGlua2VkRGVjbGFyYXRpb247CgppbXBvcnQgJ2tlcm5lbF9hcGkuZGFydCcgc2hvdyBOYW1lU3lzdGVtLCBwcmludE5vZGVPbiwgcHJpbnRRdWFsaWZpZWROYW1lT247CgppbXBvcnQgJ2tlcm5lbF9hc3RfYXBpLmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgSW5pdGlhbGl6ZXIsCiAgICAgICAgTWVtYmVyLAogICAgICAgIE5hbWUsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb247CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQWNjZXNzRXJyb3JCdWlsZGVyLAogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIENsYXNzQnVpbGRlciwKICAgICAgICBJbnZhbGlkVHlwZUJ1aWxkZXIsCiAgICAgICAgTmFtZWRUeXBlQnVpbGRlciwKICAgICAgICBUeXBlQnVpbGRlciwKICAgICAgICBVbnJlc29sdmVkVHlwZTsKCmltcG9ydCAna2VybmVsX3NoYWRvd19hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50LAogICAgICAgIExvYWRMaWJyYXJ5VGVhck9mZkp1ZGdtZW50LAogICAgICAgIE1ldGhvZEludm9jYXRpb25KdWRnbWVudCwKICAgICAgICBOdWxsQXdhcmVQcm9wZXJ0eUdldEp1ZGdtZW50LAogICAgICAgIFByb3BlcnR5QXNzaWdubWVudEp1ZGdtZW50LAogICAgICAgIFN1cGVyTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50LAogICAgICAgIFN1cGVyUHJvcGVydHlHZXRKdWRnbWVudCwKICAgICAgICBTeW50aGV0aWNXcmFwcGVyLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudCwKICAgICAgICBWYXJpYWJsZUdldEp1ZGdtZW50OwoKLy8vIEEgZ2VuZXJhdG9yIHJlcHJlc2VudHMgYSBzdWJleHByZXNzaW9uIGZvciB3aGljaCB3ZSBjYW4ndCB5ZXQgYnVpbGQgYW4KLy8vIGV4cHJlc3Npb24gYmVjYXVzZSB3ZSBkb24ndCB5ZXQga25vdyB0aGUgY29udGV4dCBpbiB3aGljaCBpdCdzIHVzZWQuCi8vLwovLy8gT25jZSB0aGUgY29udGV4dCBpcyBrbm93biwgYSBnZW5lcmF0b3IgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGFuIGV4cHJlc3Npb24KLy8vIGJ5IGNhbGxpbmcgYSBgYnVpbGRgIG1ldGhvZC4KLy8vCi8vLyBGb3IgZXhhbXBsZSwgd2hlbiBidWlsZGluZyBhIGtlcm5lbCByZXByZXNlbnRhdGlvbiBmb3IgYGFbeF0gPSBiYCwgYWZ0ZXIKLy8vIHBhcnNpbmcgYGFbeF1gIGJ1dCBiZWZvcmUgcGFyc2luZyBgPSBiYCwgd2UgZG9uJ3QgeWV0IGtub3cgd2hldGhlciB0bwovLy8gZ2VuZXJhdGUgYW4gaW52b2NhdGlvbiBvZiBgb3BlcmF0b3JbXWAgb3IgYG9wZXJhdG9yW109YCwgc28gd2UgY3JlYXRlIGEKLy8vIFtHZW5lcmF0b3JdIG9iamVjdC4gIExhdGVyLCBhZnRlciBgPSBiYCBpcyBwYXJzZWQsIFtidWlsZEFzc2lnbm1lbnRdIHdpbGwKLy8vIGJlIGNhbGxlZC4KYWJzdHJhY3QgY2xhc3MgR2VuZXJhdG9yIHsKICAvLy8gSGVscGVyIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uCiAgZmluYWwgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBfaGVscGVyOwoKICAvLy8gQSB0b2tlbiB0aGF0IGRlZmluZXMgYSBwb3NpdGlvbiBzdWJleHByZXNzaW9uIHRoYXQgYmVpbmcgYnVpbHQuCiAgZmluYWwgVG9rZW4gdG9rZW47CgogIEdlbmVyYXRvcih0aGlzLl9oZWxwZXIsIHRoaXMudG9rZW4pOwoKICAvLy8gRWFzeSBhY2Nlc3MgdG8gdGhlIFtGb3Jlc3RdIGZhY3Rvcnkgb2JqZWN0LgogIEZvcmVzdCBnZXQgX2ZvcmVzdCA9PiBfaGVscGVyLmZvcmVzdDsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW1wcm92ZSB0aGUgc2VtYW50aWMgcHJlY2lzaW9uIG9mIHRoaXMgcHJvcGVydHkgb3IKICAvLyByZW1vdmUgaXQuIEl0J3MgdW5jbGVhciBpZiB0aGUgc2VtYW50aWNzIGlzIGluY29uc2lzdGVudC4gSXQncyBmb3IgaW5zdGFuY2UKICAvLyB1c2VkIGJvdGggZm9yIHRoZSBuYW1lIG9mIGEgdmFyaWFibGUgaW4gW1ZhcmlhYmxlVXNlR2VuZXJhdG9yXSBhbmQgZm9yCiAgLy8gYFtdYCBpbiBbSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcl0sIGFuZCB3aGlsZSB0aGUgZm9ybWVyIHRleHQgb2NjdXJzIGluIHRoZQogIC8vIHVuZGVybHlpbmcgc291cmNlIGNvZGUsIHRoZSBsYXR0ZXIgZG9lc24ndC4KICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkOwoKICAvLy8gSW50ZXJuYWwgbmFtZSB1c2VkIGZvciBkZWJ1Z2dpbmcuCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lOwoKICAvLy8gVGhlIHNvdXJjZSB1cmkgZm9yIHVzZSBpbiBlcnJvciBtZXNzYWdpbmcuCiAgVXJpIGdldCBfdXJpID0+IF9oZWxwZXIudXJpOwoKICAvLy8gQnVpbGRzIGEgW0V4cHJlc3Npb25dIHJlcHJlc2VudGluZyBhIHJlYWQgZnJvbSB0aGUgZ2VuZXJhdG9yLgogIC8vLwogIC8vLyBUaGUgcmVhZCBvZiB0aGlzIHN1YmV4cHJlc3Npb24gZG9lcyBfbm90XyBuZWVkIHRvIHN1cHBvcnQgYSBzaW11bHRhbmVvdXMKICAvLy8gd3JpdGUgb2YgdGhlIHNhbWUgc3ViZXhwcmVzc2lvbi4KICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiBfZmluaXNoKF9tYWtlU2ltcGxlUmVhZCgpLCBudWxsKTsKICB9CgogIC8vLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBmb3IgW2J1aWxkU2ltcGxlUmVhZF0uCiAgLy8vCiAgLy8vIFRoZSByZWFkIG9mIHRoZSB0aGlzIHN1YmV4cHJlc3Npb24gZG9lcyBfbm90XyBuZWVkIHRvIHN1cHBvcnQgYQogIC8vLyBzaW11bHRhbmVvdXMgd3JpdGUgb2YgdGhlIHNhbWUgc3ViZXhwcmVzc2lvbi4KICAvLy8KICAvLy8gVGhpcyBpcyBpbiBjb250cmFzdCB0byBbX21ha2VSZWFkXSB3aGljaCBpcyB1c2VkIGZvciBpbnN0YW5jZSBpbiBjb21wb3VuZAogIC8vLyBhc3NpZ25tZW50cyBsaWtlIGBhLmIgKz0gY2Agd2hlcmUgYm90aCBhIHJlYWQgYW5kIGEgd3JpdGUgb2YgdGhlCiAgLy8vIHN1YmV4cHJlc3Npb24gYGEuYmAgb2NjdXJzLgogIC8vLwogIC8vLyBTdWJjbGFzc2VzIHRoYXQgY2FuIGJlbmVmaXQgZnJvbSB0aGlzIGRpc3RpbmN0aW9uIHNob3VsZCBvdmVycmlkZSB0aGlzCiAgLy8vIG1ldGhvZC4KICBFeHByZXNzaW9uIF9tYWtlU2ltcGxlUmVhZCgpID0+IF9tYWtlUmVhZChudWxsKTsKCiAgLy8vIEJ1aWxkcyBhIFtFeHByZXNzaW9uXSByZXByZXNlbnRpbmcgYW4gYXNzaWdubWVudCB3aXRoIHRoZSBnZW5lcmF0b3Igb24KICAvLy8gdGhlIExIUyBhbmQgW3ZhbHVlXSBvbiB0aGUgUkhTLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdGhlIGFzc2lnbmVkIHZhbHVlLCB1bmxlc3MKICAvLy8gW3ZvaWRDb250ZXh0XSBpcyB0cnVlLCBpbiB3aGljaCBjYXNlIGl0IG1heSBldmFsdWF0ZSB0byBhbnl0aGluZy4KICBFeHByZXNzaW9uIGJ1aWxkQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICB2YXIgY29tcGxleEFzc2lnbm1lbnQgPSBzdGFydENvbXBsZXhBc3NpZ25tZW50KHZhbHVlKTsKICAgIHJldHVybiBfZmluaXNoKF9tYWtlU2ltcGxlV3JpdGUodmFsdWUsIHZvaWRDb250ZXh0LCBjb21wbGV4QXNzaWdubWVudCksCiAgICAgICAgY29tcGxleEFzc2lnbm1lbnQpOwogIH0KCiAgLy8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIGZvciBbYnVpbGRBc3NpZ25tZW50XS4KICBFeHByZXNzaW9uIF9tYWtlU2ltcGxlV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSwgYm9vbCB2b2lkQ29udGV4dCwKICAgICAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgcmV0dXJuIF9tYWtlV3JpdGUodmFsdWUsIHZvaWRDb250ZXh0LCBjb21wbGV4QXNzaWdubWVudCk7CiAgfQoKICAvLy8gUmV0dXJucyBhIFtFeHByZXNzaW9uXSByZXByZXNlbnRpbmcgYSBudWxsLWF3YXJlIGFzc2lnbm1lbnQgKGA/Pz1gKSB3aXRoCiAgLy8vIHRoZSBnZW5lcmF0b3Igb24gdGhlIExIUyBhbmQgW3ZhbHVlXSBvbiB0aGUgUkhTLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdGhlIGFzc2lnbmVkIHZhbHVlLCB1bmxlc3MKICAvLy8gW3ZvaWRDb250ZXh0XSBpcyB0cnVlLCBpbiB3aGljaCBjYXNlIGl0IG1heSBldmFsdWF0ZSB0byBhbnl0aGluZy4KICAvLy8KICAvLy8gW3R5cGVdIGlzIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgUkhTLgogIEV4cHJlc3Npb24gYnVpbGROdWxsQXdhcmVBc3NpZ25tZW50KAogICAgICBFeHByZXNzaW9uIHZhbHVlLCBEYXJ0VHlwZSB0eXBlLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICB2YXIgY29tcGxleEFzc2lnbm1lbnQgPSBzdGFydENvbXBsZXhBc3NpZ25tZW50KHZhbHVlKTsKICAgIGlmICh2b2lkQ29udGV4dCkgewogICAgICB2YXIgbnVsbEF3YXJlQ29tYmluZXIgPSBfZm9yZXN0LmNvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICAgIGJ1aWxkSXNOdWxsKF9tYWtlUmVhZChjb21wbGV4QXNzaWdubWVudCksIG9mZnNldCwgX2hlbHBlciksCiAgICAgICAgICBudWxsLAogICAgICAgICAgX21ha2VXcml0ZSh2YWx1ZSwgZmFsc2UsIGNvbXBsZXhBc3NpZ25tZW50KSwKICAgICAgICAgIG51bGwsCiAgICAgICAgICBfZm9yZXN0LmxpdGVyYWxOdWxsKG51bGwpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY29tcGxleEFzc2lnbm1lbnQ/Lm51bGxBd2FyZUNvbWJpbmVyID0gbnVsbEF3YXJlQ29tYmluZXI7CiAgICAgIHJldHVybiBfZmluaXNoKG51bGxBd2FyZUNvbWJpbmVyLCBjb21wbGV4QXNzaWdubWVudCk7CiAgICB9CiAgICB2YXIgdG1wID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoX21ha2VSZWFkKGNvbXBsZXhBc3NpZ25tZW50KSk7CiAgICB2YXIgbnVsbEF3YXJlQ29tYmluZXIgPSBfZm9yZXN0LmNvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICBidWlsZElzTnVsbChuZXcgVmFyaWFibGVHZXQodG1wKSwgb2Zmc2V0LCBfaGVscGVyKSwKICAgICAgICBudWxsLAogICAgICAgIF9tYWtlV3JpdGUodmFsdWUsIGZhbHNlLCBjb21wbGV4QXNzaWdubWVudCksCiAgICAgICAgbnVsbCwKICAgICAgICBuZXcgVmFyaWFibGVHZXQodG1wKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgY29tcGxleEFzc2lnbm1lbnQ/Lm51bGxBd2FyZUNvbWJpbmVyID0gbnVsbEF3YXJlQ29tYmluZXI7CiAgICByZXR1cm4gX2ZpbmlzaChtYWtlTGV0KHRtcCwgbnVsbEF3YXJlQ29tYmluZXIpLCBjb21wbGV4QXNzaWdubWVudCk7CiAgfQoKICAvLy8gUmV0dXJucyBhIFtFeHByZXNzaW9uXSByZXByZXNlbnRpbmcgYSBjb21wb3VuZCBhc3NpZ25tZW50IChlLmcuIGArPWApCiAgLy8vIHdpdGggdGhlIGdlbmVyYXRvciBvbiB0aGUgTEhTIGFuZCBbdmFsdWVdIG9uIHRoZSBSSFMuCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0LAogICAgICBib29sIGlzUHJlSW5jRGVjOiBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWM6IGZhbHNlfSkgewogICAgdmFyIGNvbXBsZXhBc3NpZ25tZW50ID0gc3RhcnRDb21wbGV4QXNzaWdubWVudCh2YWx1ZSk7CiAgICBjb21wbGV4QXNzaWdubWVudD8uaXNQcmVJbmNEZWMgPSBpc1ByZUluY0RlYzsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py5pc1Bvc3RJbmNEZWMgPSBpc1Bvc3RJbmNEZWM7CiAgICB2YXIgY29tYmluZXIgPSBtYWtlQmluYXJ5KF9tYWtlUmVhZChjb21wbGV4QXNzaWdubWVudCksIGJpbmFyeU9wZXJhdG9yLAogICAgICAgIGludGVyZmFjZVRhcmdldCwgdmFsdWUsIF9oZWxwZXIsCiAgICAgICAgb2Zmc2V0OiBvZmZzZXQpOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LmNvbWJpbmVyID0gY29tYmluZXI7CiAgICByZXR1cm4gX2ZpbmlzaChfbWFrZVdyaXRlKGNvbWJpbmVyLCB2b2lkQ29udGV4dCwgY29tcGxleEFzc2lnbm1lbnQpLAogICAgICAgIGNvbXBsZXhBc3NpZ25tZW50KTsKICB9CgogIC8vLyBSZXR1cm5zIGEgW0V4cHJlc3Npb25dIHJlcHJlc2VudGluZyBhIHByZS1pbmNyZW1lbnQgb3IgcHJlLWRlY3JlbWVudCBvZgogIC8vLyB0aGUgZ2VuZXJhdG9yLgogIEV4cHJlc3Npb24gYnVpbGRQcmVmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldH0pIHsKICAgIHJldHVybiBidWlsZENvbXBvdW5kQXNzaWdubWVudCgKICAgICAgICBiaW5hcnlPcGVyYXRvciwgX2ZvcmVzdC5saXRlcmFsSW50KDEsIG51bGwpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgIG9mZnNldDogb2Zmc2V0LAogICAgICAgIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCwKICAgICAgICBpbnRlcmZhY2VUYXJnZXQ6IGludGVyZmFjZVRhcmdldCwKICAgICAgICBpc1ByZUluY0RlYzogdHJ1ZSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIFtFeHByZXNzaW9uXSByZXByZXNlbnRpbmcgYSBwb3N0LWluY3JlbWVudCBvciBwb3N0LWRlY3JlbWVudCBvZgogIC8vLyB0aGUgZ2VuZXJhdG9yLgogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KSB7CiAgICBpZiAodm9pZENvbnRleHQpIHsKICAgICAgcmV0dXJuIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KAogICAgICAgICAgYmluYXJ5T3BlcmF0b3IsIF9mb3Jlc3QubGl0ZXJhbEludCgxLCBudWxsKS4uZmlsZU9mZnNldCA9IG9mZnNldCwKICAgICAgICAgIG9mZnNldDogb2Zmc2V0LAogICAgICAgICAgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0LAogICAgICAgICAgaW50ZXJmYWNlVGFyZ2V0OiBpbnRlcmZhY2VUYXJnZXQsCiAgICAgICAgICBpc1Bvc3RJbmNEZWM6IHRydWUpOwogICAgfQogICAgdmFyIHJocyA9IF9mb3Jlc3QubGl0ZXJhbEludCgxLCBudWxsKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgIHZhciBjb21wbGV4QXNzaWdubWVudCA9IHN0YXJ0Q29tcGxleEFzc2lnbm1lbnQocmhzKTsKICAgIHZhciB2YWx1ZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKF9tYWtlUmVhZChjb21wbGV4QXNzaWdubWVudCkpOwogICAgdmFsdWVBY2Nlc3MoKSA9PiBuZXcgVmFyaWFibGVHZXQodmFsdWUpOwogICAgdmFyIGNvbWJpbmVyID0gbWFrZUJpbmFyeSgKICAgICAgICB2YWx1ZUFjY2VzcygpLCBiaW5hcnlPcGVyYXRvciwgaW50ZXJmYWNlVGFyZ2V0LCByaHMsIF9oZWxwZXIsCiAgICAgICAgb2Zmc2V0OiBvZmZzZXQpOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LmNvbWJpbmVyID0gY29tYmluZXI7CiAgICBjb21wbGV4QXNzaWdubWVudD8uaXNQb3N0SW5jRGVjID0gdHJ1ZTsKICAgIHZhciBkdW1teSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQuZm9yVmFsdWUoCiAgICAgICAgX21ha2VXcml0ZShjb21iaW5lciwgdHJ1ZSwgY29tcGxleEFzc2lnbm1lbnQpLAogICAgICAgIF9oZWxwZXIuZnVuY3Rpb25OZXN0aW5nTGV2ZWwpOwogICAgcmV0dXJuIF9maW5pc2goCiAgICAgICAgbWFrZUxldCh2YWx1ZSwgbWFrZUxldChkdW1teSwgdmFsdWVBY2Nlc3MoKSkpLCBjb21wbGV4QXNzaWdubWVudCk7CiAgfQoKICAvLy8gUmV0dXJucyBhIFtFeHByZXNzaW9uXSByZXByZXNlbnRpbmcgYSBjb21waWxlLXRpbWUgZXJyb3IuCiAgLy8vCiAgLy8vIEF0IHJ1bnRpbWUsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KICBFeHByZXNzaW9uIF9tYWtlSW52YWxpZFJlYWQoKSB7CiAgICByZXR1cm4gX2hlbHBlci53cmFwU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICBfaGVscGVyLnRocm93Tm9TdWNoTWV0aG9kRXJyb3IoCiAgICAgICAgICAgIF9mb3Jlc3QubGl0ZXJhbE51bGwodG9rZW4pLAogICAgICAgICAgICBfcGxhaW5OYW1lRm9yUmVhZCwKICAgICAgICAgICAgX2ZvcmVzdC5hcmd1bWVudHNFbXB0eShub0xvY2F0aW9uKSwKICAgICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLAogICAgICAgICAgICBpc0dldHRlcjogdHJ1ZSksCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgW0V4cHJlc3Npb25dIHJlcHJlc2VudGluZyBhIGNvbXBpbGUtdGltZSBlcnJvciB3cmFwcGluZwogIC8vLyBbdmFsdWVdLgogIC8vLwogIC8vLyBBdCBydW50aW1lLCBbdmFsdWVdIHdpbGwgYmUgZXZhbHVhdGVkIGJlZm9yZSB0aHJvd2luZyBhbiBleGNlcHRpb24uCiAgRXhwcmVzc2lvbiBfbWFrZUludmFsaWRXcml0ZShFeHByZXNzaW9uIHZhbHVlKSB7CiAgICByZXR1cm4gX2hlbHBlci53cmFwU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICBfaGVscGVyLnRocm93Tm9TdWNoTWV0aG9kRXJyb3IoCiAgICAgICAgICAgIF9mb3Jlc3QubGl0ZXJhbE51bGwodG9rZW4pLAogICAgICAgICAgICBfcGxhaW5OYW1lRm9yUmVhZCwKICAgICAgICAgICAgX2ZvcmVzdC5hcmd1bWVudHMoPEV4cHJlc3Npb24+W3ZhbHVlXSwgbm9Mb2NhdGlvbiksCiAgICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICAgICAgaXNTZXR0ZXI6IHRydWUpLAogICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSk7CiAgfQoKICAvLy8gUmV0dXJucyBhbiBbRXhwcmVzc2lvbl0gdGhlIHJlYWRzIHRoaXMgc3ViZXhwcmVzc2lvbi4KICAvLy8KICAvLy8gVGhlIGNyZWF0ZWQgcmVhZCBleHByZXNzaW9uIG11c3Qgc3VwcG9ydCBhIHNpbXVsdGFuZW91cyB3cml0ZSBvZiB0aGUgc2FtZQogIC8vLyBleHByZXNzaW9uIHdpdGggdmFsaWQgc2VtYW50aWNzLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgaW4gYGEuYiArPSBjYCwgYm90aCBhIHJlYWQgYW5kIGEgd3JpdGUgb2YgdGhlIHN1YmV4cHJlc3Npb24KICAvLy8gYGEuYmAgaXMgY3JlYXRlZCwgYnV0IGBhYCBtdXN0IF9ub3RfIGJlIGV2YWx1YXRlZCB0d2ljZS4gRm9yIHRoaXMgcmVhc29uCiAgLy8vIFtQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcl0gY3JlYXRlcyBhIHN5bnRoZXRpYyBsb2NhbCB2YXJpYWJsZSBmb3IgYGFgIGFuZAogIC8vLyB1c2VzIHRoaXMgZm9yIHRoZSBib3RoIHRoZSBbUHJvcGVydHlHZXRdIGFuZCBbUHJvcGVydHlTZXRdIG9mIHByb3BlcnR5CiAgLy8vIGBiYC4KICAvLy8KICAvLy8gSWYgW2NvbXBsZXhBc3NpZ25tZW50XSBpcyBwcm92aWRlZCwgdGhlIGNyZWF0ZWQgZXhwcmVzc2lvbiBpcyByZWdpc3RlcmVkCiAgLy8vIGFzIHRoZSBgcmVhZGAgb2YgdGhlIGNvbXBsZXggYXNzaWdubWVudC4KICAvLy8KICAvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY3JlYXRlcyB0aGUgZXhwcmVzc2lvbiB0aHJvdWdoCiAgLy8vIFtfbWFrZUludmFsaWRSZWFkXS4gU3ViY2xhc3NlcyB3aXRoIHZhbGlkIHJlYWQgb3BlcmF0aW9ucyBtdXN0IG92ZXJyaWRlCiAgLy8vIHRoaXMgbWV0aG9kIHdpdGggYSB2YWxpZCBpbXBsZW1lbnRhdGlvbi4KICBFeHByZXNzaW9uIF9tYWtlUmVhZChDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICBFeHByZXNzaW9uIHJlYWQgPSBfbWFrZUludmFsaWRSZWFkKCk7CiAgICBpZiAoY29tcGxleEFzc2lnbm1lbnQgIT0gbnVsbCkgewogICAgICByZWFkID0gX2hlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihyZWFkKTsKICAgICAgY29tcGxleEFzc2lnbm1lbnQucmVhZCA9IHJlYWQ7CiAgICB9CiAgICByZXR1cm4gcmVhZDsKICB9CgogIC8vLyBSZXR1cm5zIGFuIFtFeHByZXNzaW9uXSB0aGUgd3JpdGUgW3ZhbHVlXSB0byB0aGlzIHN1YmV4cHJlc3Npb24uCiAgLy8vCiAgLy8vIFRoZSBjcmVhdGVkIHJlYWQgZXhwcmVzc2lvbiBtdXN0IHN1cHBvcnQgYSBzaW11bHRhbmVvdXMgcmVhZCBvZiB0aGUgc2FtZQogIC8vLyBleHByZXNzaW9uIHdpdGggdmFsaWQgc2VtYW50aWNzLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgaW4gYGEuYiArPSBjYCwgYm90aCBhIHJlYWQgYW5kIGEgd3JpdGUgb2YgdGhlIHN1YmV4cHJlc3Npb24KICAvLy8gYGEuYmAgaXMgY3JlYXRlZCwgYnV0IGBhYCBtdXN0IF9ub3RfIGJlIGV2YWx1YXRlZCB0d2ljZS4gRm9yIHRoaXMgcmVhc29uCiAgLy8vIFtQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcl0gY3JlYXRlcyBhIHN5bnRoZXRpYyBsb2NhbCB2YXJpYWJsZSBmb3IgYGFgIGFuZAogIC8vLyB1c2VzIHRoaXMgZm9yIHRoZSBib3RoIHRoZSBbUHJvcGVydHlHZXRdIGFuZCBbUHJvcGVydHlTZXRdIG9mIHByb3BlcnR5CiAgLy8vIGBiYC4KICAvLy8KICAvLy8gSWYgW2NvbXBsZXhBc3NpZ25tZW50XSBpcyBwcm92aWRlZCwgdGhlIGNyZWF0ZWQgZXhwcmVzc2lvbiBpcyByZWdpc3RlcmVkCiAgLy8vIGFzIHRoZSBgd3JpdGVgIG9mIHRoZSBjb21wbGV4IGFzc2lnbm1lbnQuCiAgLy8vCiAgLy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNyZWF0ZXMgdGhlIGV4cHJlc3Npb24gdGhyb3VnaAogIC8vLyBbX21ha2VJbnZhbGlkV3JpdGVdLiBTdWJjbGFzc2VzIHdpdGggdmFsaWQgd3JpdGUgb3BlcmF0aW9ucyBtdXN0IG92ZXJyaWRlCiAgLy8vIHRoaXMgbWV0aG9kIHdpdGggYSB2YWxpZCBpbXBsZW1lbnRhdGlvbi4KICBFeHByZXNzaW9uIF9tYWtlV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSwgYm9vbCB2b2lkQ29udGV4dCwKICAgICAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgRXhwcmVzc2lvbiB3cml0ZSA9IF9tYWtlSW52YWxpZFdyaXRlKHZhbHVlKTsKICAgIGlmIChjb21wbGV4QXNzaWdubWVudCAhPSBudWxsKSB7CiAgICAgIHdyaXRlID0gX2hlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbih3cml0ZSk7CiAgICAgIGNvbXBsZXhBc3NpZ25tZW50LndyaXRlID0gd3JpdGU7CiAgICB9CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBFeHByZXNzaW9uIF9maW5pc2goCiAgICAgIEV4cHJlc3Npb24gYm9keSwgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgaWYgKCFfaGVscGVyLmxlZ2FjeU1vZGUgJiYgY29tcGxleEFzc2lnbm1lbnQgIT0gbnVsbCkgewogICAgICBjb21wbGV4QXNzaWdubWVudC5kZXN1Z2FyZWQgPSBib2R5OwogICAgICByZXR1cm4gY29tcGxleEFzc2lnbm1lbnQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gYm9keTsKICAgIH0KICB9CgogIC8vLyBDcmVhdGVzIGEgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRyYWNraW5nIHRoZSBkZXN1Z2FyaW5nIG9mIGEgY29tcGxleAogIC8vLyBhc3NpZ25tZW50IGV4cHJlc3Npb24gd2hvc2UgcmlnaHQgaGFuZCBzaWRlIGlzIFtyaHNdLgogIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgc3RhcnRDb21wbGV4QXNzaWdubWVudChFeHByZXNzaW9uIHJocykgPT4KICAgICAgU3ludGhldGljV3JhcHBlci53cmFwSWxsZWdhbEFzc2lnbm1lbnQocmhzKTsKCiAgRXhwcmVzc2lvbiBidWlsZEZvckVmZmVjdCgpID0+IGJ1aWxkU2ltcGxlUmVhZCgpOwoKICBJbml0aWFsaXplciBidWlsZEZpZWxkSW5pdGlhbGl6ZXIoTWFwPFN0cmluZywgaW50PiBpbml0aWFsaXplZEZpZWxkcykgewogICAgaW50IG9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIHJldHVybiBfaGVscGVyLmJ1aWxkSW52YWxpZEluaXRpYWxpemVyKAogICAgICAgIF9oZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oX2hlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2VJbnZhbGlkSW5pdGlhbGl6ZXIsIG9mZnNldCwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKSksCiAgICAgICAgb2Zmc2V0KTsKICB9CgogIC8vLyBSZXR1cm5zIGFuIGV4cHJlc3Npb24sIGdlbmVyYXRvciBvciBpbml0aWFsaXplciBmb3IgYW4gaW52b2NhdGlvbiBvZiB0aGlzCiAgLy8vIHN1YmV4cHJlc3Npb24gd2l0aCBbYXJndW1lbnRzXSBhdCBbb2Zmc2V0XS4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlOgogIC8vLyAqIElmIHRoaXMgaXMgYSBbUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3JdIGZvciBgYS5iYCwgdGhpcyB3aWxsIGNyZWF0ZQogIC8vLyAgIGEgW01ldGhvZEludm9jYXRpb25dIGZvciBgYS5iKC4uLilgLgogIC8vLyAqIElmIHRoaXMgaXMgYSBbVGhpc0FjY2Vzc0dlbmVyYXRvcl0gZm9yIGB0aGlzYCBpbiBhbiBpbml0aWFsaXplciBsaXN0LAogIC8vLyAgIHRoaXMgd2lsbCBjcmVhdGUgYSBbUmVkaXJlY3RpbmdJbml0aWFsaXplcl0gZm9yIGB0aGlzKC4uLilgLgogIC8vLyAqIElmIHRoaXMgaXMgYW4gW0luY29tcGxldGVFcnJvckdlbmVyYXRvcl0sIHRoaXMgd2lsbCByZXR1cm4gdGhlIGVycm9yCiAgLy8vICAgZ2VuZXJhdG9yIGl0c2VsZi4KICAvLy8KICAvKiBFeHByZXNzaW9uIHwgR2VuZXJhdG9yIHwgSW5pdGlhbGl6ZXIgKi8gZG9JbnZvY2F0aW9uKAogICAgICBpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKTsKCiAgLyogRXhwcmVzc2lvbiB8IEdlbmVyYXRvciAqLyBidWlsZFByb3BlcnR5QWNjZXNzKAogICAgICBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvciBzZW5kLCBpbnQgb3BlcmF0b3JPZmZzZXQsIGJvb2wgaXNOdWxsQXdhcmUpIHsKICAgIGlmIChzZW5kIGlzIFNlbmRBY2Nlc3NHZW5lcmF0b3IpIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRNZXRob2RJbnZvY2F0aW9uKGJ1aWxkU2ltcGxlUmVhZCgpLCBzZW5kLm5hbWUsCiAgICAgICAgICBzZW5kLmFyZ3VtZW50cywgb2Zmc2V0Rm9yVG9rZW4oc2VuZC50b2tlbiksCiAgICAgICAgICBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKF9oZWxwZXIuY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lICYmCiAgICAgICAgICBzZW5kLm5hbWUgIT0gbGVuZ3RoTmFtZSkgewogICAgICAgIF9oZWxwZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgbWVzc2FnZU5vdEFDb25zdGFudEV4cHJlc3Npb24sIG9mZnNldEZvclRva2VuKHRva2VuKSwgdG9rZW4ubGVuZ3RoKTsKICAgICAgfQogICAgICByZXR1cm4gUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IubWFrZShfaGVscGVyLCBzZW5kLnRva2VuLAogICAgICAgICAgYnVpbGRTaW1wbGVSZWFkKCksIHNlbmQubmFtZSwgbnVsbCwgbnVsbCwgaXNOdWxsQXdhcmUpOwogICAgfQogIH0KCiAgLy8vIFJldHVybnMgYSBbVHlwZUJ1aWxkZXJdIGZvciB0aGlzIHN1YmV4cHJlc3Npb24gaW5zdGFudGlhdGVkIHdpdGggdGhlCiAgLy8vIHR5cGUgW2FyZ3VtZW50c10uIElmIG5vIHR5cGUgYXJndW1lbnRzIGFyZSBwcm92aWRlZCBbYXJndW1lbnRzXSBpcyBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoZSB0eXBlIGFyZ3VtZW50cyBoYXZlIG5vdCBiZWVuIHJlc29sdmVkIGFuZCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8KICAvLy8gY3JlYXRlIGEgW1R5cGVCdWlsZGVyXSBmb3IgYSB2YWxpZCB0eXBlLgogIFR5cGVCdWlsZGVyIGJ1aWxkVHlwZVdpdGhSZXNvbHZlZEFyZ3VtZW50cyhMaXN0PFVucmVzb2x2ZWRUeXBlPiBhcmd1bWVudHMpIHsKICAgIE5hbWVkVHlwZUJ1aWxkZXIgcmVzdWx0ID0gbmV3IE5hbWVkVHlwZUJ1aWxkZXIodG9rZW4ubGV4ZW1lLCBudWxsKTsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlTm90QVR5cGUud2l0aEFyZ3VtZW50cyh0b2tlbi5sZXhlbWUpOwogICAgX2hlbHBlci5saWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgbWVzc2FnZSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBsZW5ndGhGb3JUb2tlbih0b2tlbiksIF91cmkpOwogICAgcmVzdWx0LmJpbmQocmVzdWx0LmJ1aWxkSW52YWxpZFR5cGUobWVzc2FnZS53aXRoTG9jYXRpb24oCiAgICAgICAgX3VyaSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBsZW5ndGhGb3JUb2tlbih0b2tlbikpKSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyogRXhwcmVzc2lvbiB8IEdlbmVyYXRvciAqLyBPYmplY3QgcXVhbGlmaWVkTG9va3VwKFRva2VuIG5hbWUpIHsKICAgIHJldHVybiBuZXcgVW5leHBlY3RlZFF1YWxpZmllZFVzZUdlbmVyYXRvcihfaGVscGVyLCBuYW1lLCB0aGlzLCBmYWxzZSk7CiAgfQoKICBFeHByZXNzaW9uIGludm9rZUNvbnN0cnVjdG9yKAogICAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgVG9rZW4gbmFtZVRva2VuLAogICAgICBUb2tlbiBuYW1lTGFzdFRva2VuLAogICAgICBDb25zdG5lc3MgY29uc3RuZXNzKSB7CiAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFzc2VydChfZm9yZXN0LmFyZ3VtZW50c1R5cGVBcmd1bWVudHMoYXJndW1lbnRzKS5pc0VtcHR5KTsKICAgICAgX2ZvcmVzdC5hcmd1bWVudHNTZXRUeXBlQXJndW1lbnRzKAogICAgICAgICAgYXJndW1lbnRzLCBfaGVscGVyLmJ1aWxkRGFydFR5cGVBcmd1bWVudHModHlwZUFyZ3VtZW50cykpOwogICAgfQogICAgcmV0dXJuIF9oZWxwZXIud3JhcEludmFsaWRDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgICAgX2hlbHBlci50aHJvd05vU3VjaE1ldGhvZEVycm9yKAogICAgICAgICAgICBfZm9yZXN0LmxpdGVyYWxOdWxsKHRva2VuKSwKICAgICAgICAgICAgX2hlbHBlci5jb25zdHJ1Y3Rvck5hbWVGb3JEaWFnbm9zdGljcyhuYW1lLAogICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBfcGxhaW5OYW1lRm9yUmVhZCksCiAgICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgICAgbmFtZVRva2VuLmNoYXJPZmZzZXQpLAogICAgICAgIG51bGwsCiAgICAgICAgYXJndW1lbnRzLAogICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSk7CiAgfQoKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGJ1ZmZlci53cml0ZShfZGVidWdOYW1lKTsKICAgIGJ1ZmZlci53cml0ZSgiKG9mZnNldDogIik7CiAgICBidWZmZXIud3JpdGUoIiR7b2Zmc2V0Rm9yVG9rZW4odG9rZW4pfSIpOwogICAgcHJpbnRPbihidWZmZXIpOwogICAgYnVmZmVyLndyaXRlKCIpIik7CiAgICByZXR1cm4gIiRidWZmZXIiOwogIH0KfQoKLy8vIFtWYXJpYWJsZVVzZUdlbmVyYXRvcl0gcmVwcmVzZW50cyB0aGUgc3ViZXhwcmVzc2lvbiB3aG9zZSBwcmVmaXggaXMgYQovLy8gbG9jYWwgdmFyaWFibGUgb3IgcGFyYW1ldGVyIG5hbWUuCi8vLwovLy8gRm9yIGluc3RhbmNlOgovLy8KLy8vICAgbWV0aG9kKGEpIHsKLy8vICAgICB2YXIgYjsKLy8vICAgICBhOyAgICAgICAgIC8vIGEgVmFyaWFibGVVc2VHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYGFgLgovLy8gICAgIGIgPSBhW107ICAgLy8gYSBWYXJpYWJsZVVzZUdlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgYWAgYW5kIGBiYC4KLy8vICAgICBiKCk7ICAgICAgIC8vIGEgVmFyaWFibGVVc2VHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYGJgLgovLy8gICAgIGIuYyA9IGEuZDsgLy8gYSBWYXJpYWJsZVVzZUdlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgYWAgYW5kIGBiYC4KLy8vICAgfQovLy8KLy8vIElmIHRoZSB2YXJpYWJsZSBpcyBmaW5hbCBvciByZWFkLW9ubHkgKGxpa2UgYSBwYXJhbWV0ZXIgaW4gYSBjYXRjaCBjbGF1c2UpIGEKLy8vIFtSZWFkT25seUFjY2Vzc0dlbmVyYXRvcl0gaXMgY3JlYXRlZCBpbnN0ZWFkLgpjbGFzcyBWYXJpYWJsZVVzZUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKCiAgZmluYWwgRGFydFR5cGUgcHJvbW90ZWRUeXBlOwoKICBWYXJpYWJsZVVzZUdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCB0aGlzLnZhcmlhYmxlLAogICAgICBbdGhpcy5wcm9tb3RlZFR5cGVdKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlZhcmlhYmxlVXNlR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfcGxhaW5OYW1lRm9yUmVhZCA9PiB2YXJpYWJsZS5uYW1lOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlUmVhZChDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICB2YXIgZmFjdCA9IF9oZWxwZXIudHlwZVByb21vdGVyCiAgICAgICAgPy5nZXRGYWN0Rm9yQWNjZXNzKHZhcmlhYmxlLCBfaGVscGVyLmZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKICAgIHZhciBzY29wZSA9IF9oZWxwZXIudHlwZVByb21vdGVyPy5jdXJyZW50U2NvcGU7CiAgICB2YXIgcmVhZCA9IG5ldyBWYXJpYWJsZUdldEp1ZGdtZW50KHZhcmlhYmxlLCBmYWN0LCBzY29wZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LnJlYWQgPSByZWFkOwogICAgcmV0dXJuIHJlYWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSwgYm9vbCB2b2lkQ29udGV4dCwKICAgICAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgX2hlbHBlci50eXBlUHJvbW90ZXIKICAgICAgICA/Lm11dGF0ZVZhcmlhYmxlKHZhcmlhYmxlLCBfaGVscGVyLmZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKICAgIEV4cHJlc3Npb24gd3JpdGU7CiAgICBpZiAodmFyaWFibGUuaXNGaW5hbCB8fCB2YXJpYWJsZS5pc0NvbnN0KSB7CiAgICAgIHdyaXRlID0gX21ha2VJbnZhbGlkV3JpdGUodmFsdWUpOwogICAgICBpZiAoY29tcGxleEFzc2lnbm1lbnQgIT0gbnVsbCkgewogICAgICAgIHdyaXRlID0gX2hlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbih3cml0ZSk7CiAgICAgICAgY29tcGxleEFzc2lnbm1lbnQud3JpdGUgPSB3cml0ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgd3JpdGUgPSBuZXcgVmFyaWFibGVTZXQodmFyaWFibGUsIHZhbHVlKQogICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgICAgY29tcGxleEFzc2lnbm1lbnQ/LndyaXRlID0gd3JpdGU7CiAgICB9CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gX2hlbHBlci5idWlsZE1ldGhvZEludm9jYXRpb24oYnVpbGRTaW1wbGVSZWFkKCksIGNhbGxOYW1lLCBhcmd1bWVudHMsCiAgICAgICAgYWRqdXN0Rm9ySW1wbGljaXRDYWxsKF9wbGFpbk5hbWVGb3JSZWFkLCBvZmZzZXQpLAogICAgICAgIGlzSW1wbGljaXRDYWxsOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgc3RhcnRDb21wbGV4QXNzaWdubWVudChFeHByZXNzaW9uIHJocykgewogICAgcmV0dXJuIFN5bnRoZXRpY1dyYXBwZXIud3JhcFZhcmlhYmxlQXNzaWdubWVudChyaHMpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIE5hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMgPSBuZXcgTmFtZVN5c3RlbSgpOwogICAgc2luay53cml0ZSgiLCB2YXJpYWJsZTogIik7CiAgICBwcmludE5vZGVPbih2YXJpYWJsZSwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgcHJvbW90ZWRUeXBlOiAiKTsKICAgIHByaW50Tm9kZU9uKHByb21vdGVkVHlwZSwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICB9Cn0KCi8vLyBBIFtQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcl0gcmVwcmVzZW50cyBhIHN1YmV4cHJlc3Npb24gd2hvc2UgcHJlZml4IGlzCi8vLyBhbiBleHBsaWNpdCBwcm9wZXJ0eSBhY2Nlc3MuCi8vLwovLy8gRm9yIGluc3RhbmNlCi8vLwovLy8gICBtZXRob2QoYSkgewovLy8gICAgIGEuYjsgICAgICAvLyBhIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBhLmJgLgovLy8gICAgIGEuYigpOyAgICAvLyBhIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBhLmJgLgovLy8gICAgIGEuYiA9IGM7ICAvLyBhIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBhLmJgLgovLy8gICAgIGEuYiArPSBjOyAvLyBhIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBhLmJgLgovLy8gICB9Ci8vLwovLy8gSWYgdGhlIHJlY2VpdmVyIGlzIGB0aGlzYCwgYSBbVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yXSBpcyBjcmVhdGVkCi8vLyBpbnN0ZWFkLiBJZiB0aGUgYWNjZXNzIGlzIG51bGwtYXdhcmUsIGUuZy4gYGE/LmJgLCBhCi8vLyBbTnVsbEF3YXJlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3JdIGlzIGNyZWF0ZWQgaW5zdGVhZC4KY2xhc3MgUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogIC8vLyBUaGUgcmVjZWl2ZXIgZXhwcmVzc2lvbi4gYGFgIGluIHRoZSBleGFtcGxlcyBpbiB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbi4KICBmaW5hbCBFeHByZXNzaW9uIHJlY2VpdmVyOwoKICAvLy8gVGhlIG5hbWUgZm9yIHRoZSBhY2Nlc3NlZCBwcm9wZXJ0eS4gYGJgIGluIHRoZSBleGFtcGxlcyBpbiB0aGUgY2xhc3MKICAvLy8gZG9jdW1lbnRhdGlvbi4KICBmaW5hbCBOYW1lIG5hbWU7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSBbZ2V0dGVyXSBhbmQgW3NldHRlcl0/IFRoZXNlIGFyZSBuZXZlcgogIC8vIHBhc3NlZC4KICBmaW5hbCBNZW1iZXIgZ2V0dGVyOwoKICBmaW5hbCBNZW1iZXIgc2V0dGVyOwoKICAvLy8gU3ludGhldGljIHZhcmlhYmxlIGNyZWF0ZWQgZm9yIFtyZWNlaXZlcl0gaWYgbmVlZC4KICBWYXJpYWJsZURlY2xhcmF0aW9uIF9yZWNlaXZlclZhcmlhYmxlOwoKICBQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMucmVjZWl2ZXIsIHRoaXMubmFtZSwgdGhpcy5nZXR0ZXIsIHRoaXMuc2V0dGVyKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfcGxhaW5OYW1lRm9yUmVhZCA9PiBuYW1lLm5hbWU7CgogIHJlY2VpdmVyQWNjZXNzKCkgewogICAgX3JlY2VpdmVyVmFyaWFibGUgPz89IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKHJlY2VpdmVyKTsKICAgIHJldHVybiBuZXcgVmFyaWFibGVHZXQoX3JlY2VpdmVyVmFyaWFibGUpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBfaGVscGVyLmJ1aWxkTWV0aG9kSW52b2NhdGlvbihyZWNlaXZlciwgbmFtZSwgYXJndW1lbnRzLCBvZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBzdGFydENvbXBsZXhBc3NpZ25tZW50KEV4cHJlc3Npb24gcmhzKSA9PgogICAgICBTeW50aGV0aWNXcmFwcGVyLndyYXBQcm9wZXJ0eUFzc2lnbm1lbnQocmVjZWl2ZXIsIHJocyk7CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIE5hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMgPSBuZXcgTmFtZVN5c3RlbSgpOwogICAgc2luay53cml0ZSgiLCBfcmVjZWl2ZXJWYXJpYWJsZTogIik7CiAgICBwcmludE5vZGVPbihfcmVjZWl2ZXJWYXJpYWJsZSwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgcmVjZWl2ZXI6ICIpOwogICAgcHJpbnROb2RlT24ocmVjZWl2ZXIsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIG5hbWU6ICIpOwogICAgc2luay53cml0ZShuYW1lLm5hbWUpOwogICAgc2luay53cml0ZSgiLCBnZXR0ZXI6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24oZ2V0dGVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCBzZXR0ZXI6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24oc2V0dGVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVNpbXBsZVJlYWQoKSB7CiAgICByZXR1cm4gbmV3IFByb3BlcnR5R2V0KHJlY2VpdmVyLCBuYW1lLCBnZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VTaW1wbGVXcml0ZShFeHByZXNzaW9uIHZhbHVlLCBib29sIHZvaWRDb250ZXh0LAogICAgICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICB2YXIgd3JpdGUgPSBuZXcgUHJvcGVydHlTZXQocmVjZWl2ZXIsIG5hbWUsIHZhbHVlLCBzZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py53cml0ZSA9IHdyaXRlOwogICAgcmV0dXJuIHdyaXRlOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVJlYWQoQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgdmFyIHJlYWQgPSBuZXcgUHJvcGVydHlHZXQocmVjZWl2ZXJBY2Nlc3MoKSwgbmFtZSwgZ2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ucmVhZCA9IHJlYWQ7CiAgICByZXR1cm4gcmVhZDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VXcml0ZShFeHByZXNzaW9uIHZhbHVlLCBib29sIHZvaWRDb250ZXh0LAogICAgICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICB2YXIgd3JpdGUgPSBuZXcgUHJvcGVydHlTZXQocmVjZWl2ZXJBY2Nlc3MoKSwgbmFtZSwgdmFsdWUsIHNldHRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LndyaXRlID0gd3JpdGU7CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9maW5pc2goCiAgICAgIEV4cHJlc3Npb24gYm9keSwgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgcmV0dXJuIHN1cGVyLl9maW5pc2gobWFrZUxldChfcmVjZWl2ZXJWYXJpYWJsZSwgYm9keSksIGNvbXBsZXhBc3NpZ25tZW50KTsKICB9CgogIC8vLyBDcmVhdGVzIGEgW0dlbmVyYXRvcl0gZm9yIHRoZSBhY2Nlc3Mgb2YgcHJvcGVydHkgW25hbWVdIG9uIFtyZWNlaXZlcl0uCiAgc3RhdGljIEdlbmVyYXRvciBtYWtlKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsCiAgICAgIE5hbWUgbmFtZSwKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIFtnZXR0ZXJdIGFuZCBbc2V0dGVyXT8gVGhlc2UgYXJlIG5ldmVyCiAgICAgIC8vIHBhc3NlZC4KICAgICAgTWVtYmVyIGdldHRlciwKICAgICAgTWVtYmVyIHNldHRlciwKICAgICAgYm9vbCBpc051bGxBd2FyZSkgewogICAgaWYgKGhlbHBlci5mb3Jlc3QuaXNUaGlzRXhwcmVzc2lvbihyZWNlaXZlcikpIHsKICAgICAgZ2V0dGVyID8/PSBoZWxwZXIubG9va3VwSW5zdGFuY2VNZW1iZXIobmFtZSk7CiAgICAgIHNldHRlciA/Pz0gaGVscGVyLmxvb2t1cEluc3RhbmNlTWVtYmVyKG5hbWUsIGlzU2V0dGVyOiB0cnVlKTsKICAgICAgcmV0dXJuIG5ldyBUaGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgICBoZWxwZXIsIHRva2VuLCBuYW1lLCBnZXR0ZXIsIHNldHRlcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gaXNOdWxsQXdhcmUKICAgICAgICAgID8gbmV3IE51bGxBd2FyZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yKAogICAgICAgICAgICAgIGhlbHBlciwgdG9rZW4sIHJlY2VpdmVyLCBuYW1lLCBnZXR0ZXIsIHNldHRlciwgbnVsbCkKICAgICAgICAgIDogbmV3IFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yKAogICAgICAgICAgICAgIGhlbHBlciwgdG9rZW4sIHJlY2VpdmVyLCBuYW1lLCBnZXR0ZXIsIHNldHRlcik7CiAgICB9CiAgfQp9CgovLy8gQSBbVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yXSByZXByZXNlbnRzIGEgc3ViZXhwcmVzc2lvbiB3aG9zZSBwcmVmaXggaXMKLy8vIGFuIGltcGxpY2l0IG9yIGV4cGxpY2l0IGFjY2VzcyBvbiBgdGhpc2AuCi8vLwovLy8gRm9yIGluc3RhbmNlCi8vLwovLy8gICBjbGFzcyBDIHsKLy8vICAgICB2YXIgYjsKLy8vICAgICBtZXRob2QoKSB7Ci8vLyAgICAgICBiOyAgICAgICAgICAgLy8gYSBUaGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYGJgLgovLy8gICAgICAgYigpOyAgICAgICAgIC8vIGEgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBiYC4KLy8vICAgICAgIGIgPSBjOyAgICAgICAvLyBhIFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgYmAuCi8vLyAgICAgICBiICs9IGM7ICAgICAgLy8gYSBUaGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYGJgLgovLy8gICAgICAgdGhpcy5iOyAgICAgIC8vIGEgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGB0aGlzLmJgLgovLy8gICAgICAgdGhpcy5iKCk7ICAgIC8vIGEgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGB0aGlzLmJgLgovLy8gICAgICAgdGhpcy5iID0gYzsgIC8vIGEgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGB0aGlzLmJgLgovLy8gICAgICAgdGhpcy5iICs9IGM7IC8vIGEgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGB0aGlzLmJgLgovLy8gICAgIH0KLy8vICAgfQovLy8KLy8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgW1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yXSB0byBhdm9pZCBjcmVhdGluZyBhbgovLy8gaW5kaXJlY3QgYWNjZXNzIHRvICd0aGlzJyBpbiBmb3IgaW5zdGFuY2UgYHRoaXMuYiArPSBjYCB3aGljaCBieQovLy8gW1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yXSB3b3VsZCBoYXZlIGJlZW4gY3JlYXRlZCBhcwovLy8KLy8vICAgICBsZXQgIzEgPSB0aGlzIGluICMuYiA9ICMuYiArIGMKLy8vCi8vLyBpbnN0ZWFkIG9mCi8vLwovLy8gICAgIHRoaXMuYiA9IHRoaXMuYiArIGMKLy8vCmNsYXNzIFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgLy8vIFRoZSBuYW1lIGZvciB0aGUgYWNjZXNzZWQgcHJvcGVydHkuIGBiYCBpbiB0aGUgZXhhbXBsZXMgaW4gdGhlIGNsYXNzCiAgLy8vIGRvY3VtZW50YXRpb24uCiAgZmluYWwgTmFtZSBuYW1lOwoKICAvLy8gVGhlIG1lbWJlciBhY2Nlc3NlZCBpZiB0aGlzIHN1YmV4cHJlc3Npb24gaGFzIGEgcmVhZC4KICAvLy8KICAvLy8gVGhpcyBpcyBgbnVsbGAgaWYgdGhlIGB0aGlzYCBjbGFzcyBkb2VzIG5vdCBoYXZlIGEgcmVhZGFibGUgcHJvcGVydHkgbmFtZWQKICAvLy8gW25hbWVdLgogIGZpbmFsIE1lbWJlciBnZXR0ZXI7CgogIC8vLyBUaGUgbWVtYmVyIGFjY2Vzc2VkIGlmIHRoaXMgc3ViZXhwcmVzc2lvbiBoYXMgYSB3cml0ZS4KICAvLy8KICAvLy8gVGhpcyBpcyBgbnVsbGAgaWYgdGhlIGB0aGlzYCBjbGFzcyBkb2VzIG5vdCBoYXZlIGEgd3JpdGFibGUgcHJvcGVydHkgbmFtZWQKICAvLy8gW25hbWVdLgogIGZpbmFsIE1lbWJlciBzZXR0ZXI7CgogIFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMubmFtZSwgdGhpcy5nZXR0ZXIsIHRoaXMuc2V0dGVyKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgPT4gbmFtZS5uYW1lOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlUmVhZChDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICBpZiAoZ2V0dGVyID09IG51bGwpIHsKICAgICAgX2hlbHBlci53YXJuVW5yZXNvbHZlZEdldChuYW1lLCBvZmZzZXRGb3JUb2tlbih0b2tlbikpOwogICAgfQogICAgdmFyIHJlYWQgPSBuZXcgUHJvcGVydHlHZXQoX2ZvcmVzdC50aGlzRXhwcmVzc2lvbih0b2tlbiksIG5hbWUsIGdldHRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LnJlYWQgPSByZWFkOwogICAgcmV0dXJuIHJlYWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSwgYm9vbCB2b2lkQ29udGV4dCwKICAgICAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgaWYgKHNldHRlciA9PSBudWxsKSB7CiAgICAgIF9oZWxwZXIud2FyblVucmVzb2x2ZWRTZXQobmFtZSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pKTsKICAgIH0KICAgIHZhciB3cml0ZSA9CiAgICAgICAgbmV3IFByb3BlcnR5U2V0KF9mb3Jlc3QudGhpc0V4cHJlc3Npb24odG9rZW4pLCBuYW1lLCB2YWx1ZSwgc2V0dGVyKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LndyaXRlID0gd3JpdGU7CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0ID0gZ2V0dGVyOwogICAgaWYgKGludGVyZmFjZVRhcmdldCA9PSBudWxsKSB7CiAgICAgIF9oZWxwZXIud2FyblVucmVzb2x2ZWRNZXRob2QobmFtZSwgb2Zmc2V0KTsKICAgIH0KICAgIGlmIChpbnRlcmZhY2VUYXJnZXQgaXMgRmllbGQpIHsKICAgICAgLy8gVE9ETyhhaGUpOiBJbiBzdHJvbmcgbW9kZSB3ZSBzaG91bGQgcHJvYmFibHkgcmV3cml0ZSB0aGlzIHRvCiAgICAgIC8vIGB0aGlzLm5hbWUuY2FsbChhcmd1bWVudHMpYC4KICAgICAgaW50ZXJmYWNlVGFyZ2V0ID0gbnVsbDsKICAgIH0KICAgIHJldHVybiBfaGVscGVyLmJ1aWxkTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBfZm9yZXN0LnRoaXNFeHByZXNzaW9uKG51bGwpLCBuYW1lLCBhcmd1bWVudHMsIG9mZnNldCwKICAgICAgICBpbnRlcmZhY2VUYXJnZXQ6IGludGVyZmFjZVRhcmdldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IHN0YXJ0Q29tcGxleEFzc2lnbm1lbnQoRXhwcmVzc2lvbiByaHMpID0+CiAgICAgIFN5bnRoZXRpY1dyYXBwZXIud3JhcFByb3BlcnR5QXNzaWdubWVudChudWxsLCByaHMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzID0gbmV3IE5hbWVTeXN0ZW0oKTsKICAgIHNpbmsud3JpdGUoIiwgbmFtZTogIik7CiAgICBzaW5rLndyaXRlKG5hbWUubmFtZSk7CiAgICBzaW5rLndyaXRlKCIsIGdldHRlcjogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbihnZXR0ZXIsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIHNldHRlcjogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbihzZXR0ZXIsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgfQp9CgpjbGFzcyBOdWxsQXdhcmVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbiByZWNlaXZlcjsKCiAgZmluYWwgRXhwcmVzc2lvbiByZWNlaXZlckV4cHJlc3Npb247CgogIGZpbmFsIE5hbWUgbmFtZTsKCiAgZmluYWwgTWVtYmVyIGdldHRlcjsKCiAgZmluYWwgTWVtYmVyIHNldHRlcjsKCiAgZmluYWwgRGFydFR5cGUgdHlwZTsKCiAgTnVsbEF3YXJlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiB0b2tlbiwKICAgICAgdGhpcy5yZWNlaXZlckV4cHJlc3Npb24sCiAgICAgIHRoaXMubmFtZSwKICAgICAgdGhpcy5nZXR0ZXIsCiAgICAgIHRoaXMuc2V0dGVyLAogICAgICB0aGlzLnR5cGUpCiAgICAgIDogdGhpcy5yZWNlaXZlciA9IG1ha2VPclJldXNlVmFyaWFibGUocmVjZWl2ZXJFeHByZXNzaW9uKSwKICAgICAgICBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lID0+ICJOdWxsQXdhcmVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciI7CgogIEV4cHJlc3Npb24gcmVjZWl2ZXJBY2Nlc3MoKSA9PiBuZXcgVmFyaWFibGVHZXQocmVjZWl2ZXIpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+IG5hbWUubmFtZTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVJlYWQoQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgdmFyIHJlYWQgPSBuZXcgUHJvcGVydHlHZXQocmVjZWl2ZXJBY2Nlc3MoKSwgbmFtZSwgZ2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ucmVhZCA9IHJlYWQ7CiAgICByZXR1cm4gcmVhZDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VXcml0ZShFeHByZXNzaW9uIHZhbHVlLCBib29sIHZvaWRDb250ZXh0LAogICAgICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICB2YXIgd3JpdGUgPSBuZXcgUHJvcGVydHlTZXQocmVjZWl2ZXJBY2Nlc3MoKSwgbmFtZSwgdmFsdWUsIHNldHRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LndyaXRlID0gd3JpdGU7CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9maW5pc2goCiAgICAgIEV4cHJlc3Npb24gYm9keSwgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgdmFyIG9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIHZhciBudWxsQXdhcmVHdWFyZCA9IF9mb3Jlc3QuY29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICAgIGJ1aWxkSXNOdWxsKHJlY2VpdmVyQWNjZXNzKCksIG9mZnNldCwgX2hlbHBlciksCiAgICAgICAgbnVsbCwKICAgICAgICBfZm9yZXN0LmxpdGVyYWxOdWxsKG51bGwpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgIG51bGwsCiAgICAgICAgYm9keSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgaWYgKGNvbXBsZXhBc3NpZ25tZW50ICE9IG51bGwpIHsKICAgICAgYm9keSA9IG1ha2VMZXQocmVjZWl2ZXIsIG51bGxBd2FyZUd1YXJkKTsKICAgICAgaWYgKF9oZWxwZXIubGVnYWN5TW9kZSkgcmV0dXJuIGJvZHk7CiAgICAgIFByb3BlcnR5QXNzaWdubWVudEp1ZGdtZW50IGtlcm5lbFByb3BlcnR5QXNzaWduID0gY29tcGxleEFzc2lnbm1lbnQ7CiAgICAgIGtlcm5lbFByb3BlcnR5QXNzaWduLm51bGxBd2FyZUd1YXJkID0gbnVsbEF3YXJlR3VhcmQ7CiAgICAgIGtlcm5lbFByb3BlcnR5QXNzaWduLmRlc3VnYXJlZCA9IGJvZHk7CiAgICAgIHJldHVybiBrZXJuZWxQcm9wZXJ0eUFzc2lnbjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgTnVsbEF3YXJlUHJvcGVydHlHZXRKdWRnbWVudChyZWNlaXZlciwgbnVsbEF3YXJlR3VhcmQpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJkb0ludm9jYXRpb24iLCBvZmZzZXQsIF91cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBzdGFydENvbXBsZXhBc3NpZ25tZW50KEV4cHJlc3Npb24gcmhzKSA9PgogICAgICBTeW50aGV0aWNXcmFwcGVyLndyYXBQcm9wZXJ0eUFzc2lnbm1lbnQocmVjZWl2ZXJFeHByZXNzaW9uLCByaHMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzID0gbmV3IE5hbWVTeXN0ZW0oKTsKICAgIHNpbmsud3JpdGUoIiwgcmVjZWl2ZXI6ICIpOwogICAgcHJpbnROb2RlT24ocmVjZWl2ZXIsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIHJlY2VpdmVyRXhwcmVzc2lvbjogIik7CiAgICBwcmludE5vZGVPbihyZWNlaXZlckV4cHJlc3Npb24sIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIG5hbWU6ICIpOwogICAgc2luay53cml0ZShuYW1lLm5hbWUpOwogICAgc2luay53cml0ZSgiLCBnZXR0ZXI6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24oZ2V0dGVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCBzZXR0ZXI6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24oc2V0dGVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCB0eXBlOiAiKTsKICAgIHByaW50Tm9kZU9uKHR5cGUsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgfQp9CgpjbGFzcyBTdXBlclByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKICBmaW5hbCBOYW1lIG5hbWU7CgogIGZpbmFsIE1lbWJlciBnZXR0ZXI7CgogIGZpbmFsIE1lbWJlciBzZXR0ZXI7CgogIFN1cGVyUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLAogICAgICB0aGlzLm5hbWUsIHRoaXMuZ2V0dGVyLCB0aGlzLnNldHRlcikKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lID0+ICJTdXBlclByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfcGxhaW5OYW1lRm9yUmVhZCA9PiBuYW1lLm5hbWU7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VSZWFkKENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIGlmIChnZXR0ZXIgPT0gbnVsbCkgewogICAgICBfaGVscGVyLndhcm5VbnJlc29sdmVkR2V0KG5hbWUsIG9mZnNldEZvclRva2VuKHRva2VuKSwgaXNTdXBlcjogdHJ1ZSk7CiAgICB9CiAgICAvLyBUT0RPKGFoZSk6IFVzZSBbRGlyZWN0UHJvcGVydHlHZXRdIHdoZW4gcG9zc2libGUuCiAgICB2YXIgcmVhZCA9IG5ldyBTdXBlclByb3BlcnR5R2V0SnVkZ21lbnQobmFtZSwgaW50ZXJmYWNlVGFyZ2V0OiBnZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py5yZWFkID0gcmVhZDsKICAgIHJldHVybiByZWFkOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUsIGJvb2wgdm9pZENvbnRleHQsCiAgICAgIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIGlmIChzZXR0ZXIgPT0gbnVsbCkgewogICAgICBfaGVscGVyLndhcm5VbnJlc29sdmVkU2V0KG5hbWUsIG9mZnNldEZvclRva2VuKHRva2VuKSwgaXNTdXBlcjogdHJ1ZSk7CiAgICB9CiAgICAvLyBUT0RPKGFoZSk6IFVzZSBbRGlyZWN0UHJvcGVydHlTZXRdIHdoZW4gcG9zc2libGUuCiAgICB2YXIgd3JpdGUgPSBuZXcgU3VwZXJQcm9wZXJ0eVNldChuYW1lLCB2YWx1ZSwgc2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ud3JpdGUgPSB3cml0ZTsKICAgIHJldHVybiB3cml0ZTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIGlmIChfaGVscGVyLmNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSkgewogICAgICAvLyBUT0RPKGJyaWFud2lsa2Vyc29uKSBGaXggdGhlIGxlbmd0aAogICAgICBfaGVscGVyLmFkZFByb2JsZW0obWVzc2FnZU5vdEFDb25zdGFudEV4cHJlc3Npb24sIG9mZnNldCwgMSk7CiAgICB9CiAgICBpZiAoZ2V0dGVyID09IG51bGwgfHwgaXNGaWVsZE9yR2V0dGVyKGdldHRlcikpIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgYnVpbGRTaW1wbGVSZWFkKCksIGNhbGxOYW1lLCBhcmd1bWVudHMsIG9mZnNldCwKICAgICAgICAgIC8vIFRoaXMgaXNuJ3QgYSBjb25zdGFudCBleHByZXNzaW9uLCBidXQgd2UgaGF2ZSBjaGVja2VkIGlmIGEKICAgICAgICAgIC8vIGNvbnN0YW50IGV4cHJlc3Npb24gZXJyb3Igc2hvdWxkIGJlIGVtaXR0ZWQgYWxyZWFkeS4KICAgICAgICAgIGlzQ29uc3RhbnRFeHByZXNzaW9uOiB0cnVlLAogICAgICAgICAgaXNJbXBsaWNpdENhbGw6IHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgLy8gVE9ETyhhaGUpOiBUaGlzIGNvdWxkIGJlIHNvbWV0aGluZyBsaWtlICJzdXBlci5wcm9wZXJ0eSguLi4pIiB3aGVyZQogICAgICAvLyBwcm9wZXJ0eSBpcyBhIHNldHRlci4KICAgICAgcmV0dXJuIHVuaGFuZGxlZCgiJHtnZXR0ZXIucnVudGltZVR5cGV9IiwgImRvSW52b2NhdGlvbiIsIG9mZnNldCwgX3VyaSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IHN0YXJ0Q29tcGxleEFzc2lnbm1lbnQoRXhwcmVzc2lvbiByaHMpID0+CiAgICAgIFN5bnRoZXRpY1dyYXBwZXIud3JhcFByb3BlcnR5QXNzaWdubWVudChudWxsLCByaHMsIGlzU3VwZXI6IHRydWUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzID0gbmV3IE5hbWVTeXN0ZW0oKTsKICAgIHNpbmsud3JpdGUoIiwgbmFtZTogIik7CiAgICBzaW5rLndyaXRlKG5hbWUubmFtZSk7CiAgICBzaW5rLndyaXRlKCIsIGdldHRlcjogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbihnZXR0ZXIsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIHNldHRlcjogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbihzZXR0ZXIsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgfQp9CgpjbGFzcyBJbmRleGVkQWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKICBmaW5hbCBFeHByZXNzaW9uIHJlY2VpdmVyOwoKICBmaW5hbCBFeHByZXNzaW9uIGluZGV4OwoKICBmaW5hbCBQcm9jZWR1cmUgZ2V0dGVyOwoKICBmaW5hbCBQcm9jZWR1cmUgc2V0dGVyOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlY2VpdmVyVmFyaWFibGU7CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gaW5kZXhWYXJpYWJsZTsKCiAgSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMucmVjZWl2ZXIsIHRoaXMuaW5kZXgsIHRoaXMuZ2V0dGVyLCB0aGlzLnNldHRlcikKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfcGxhaW5OYW1lRm9yUmVhZCA9PiAiW10iOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIkluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IiOwoKICBFeHByZXNzaW9uIGluZGV4QWNjZXNzKCkgewogICAgaW5kZXhWYXJpYWJsZSA/Pz0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoaW5kZXgpOwogICAgcmV0dXJuIG5ldyBWYXJpYWJsZUdldChpbmRleFZhcmlhYmxlKS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEV4cHJlc3Npb24gcmVjZWl2ZXJBY2Nlc3MoKSB7CiAgICAvLyBXZSBjYW5ub3QgcmV1c2UgdGhlIHJlY2VpdmVyIGlmIGl0IGlzIGEgdmFyaWFibGUgc2luY2UgaXQgbWlnaHQgYmUKICAgIC8vIHJlYXNzaWduZWQgaW4gdGhlIGluZGV4IGV4cHJlc3Npb24uCiAgICByZWNlaXZlclZhcmlhYmxlID8/PSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZShyZWNlaXZlcik7CiAgICByZXR1cm4gbmV3IFZhcmlhYmxlR2V0KHJlY2VpdmVyVmFyaWFibGUpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VTaW1wbGVSZWFkKCkgewogICAgdmFyIHJlYWQgPSBuZXcgTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50KHJlY2VpdmVyLCBpbmRleEdldE5hbWUsCiAgICAgICAgX2ZvcmVzdC5jYXN0QXJndW1lbnRzKF9mb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPltpbmRleF0sIHRva2VuKSksCiAgICAgICAgaW50ZXJmYWNlVGFyZ2V0OiBnZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIHJldHVybiByZWFkOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVNpbXBsZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUsIGJvb2wgdm9pZENvbnRleHQsCiAgICAgIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIGlmICghdm9pZENvbnRleHQpIHJldHVybiBfbWFrZVdyaXRlQW5kUmV0dXJuKHZhbHVlLCBjb21wbGV4QXNzaWdubWVudCk7CiAgICB2YXIgd3JpdGUgPSBuZXcgTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50KAogICAgICAgIHJlY2VpdmVyLAogICAgICAgIGluZGV4U2V0TmFtZSwKICAgICAgICBfZm9yZXN0LmNhc3RBcmd1bWVudHMoCiAgICAgICAgICAgIF9mb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPltpbmRleCwgdmFsdWVdLCB0b2tlbikpLAogICAgICAgIGludGVyZmFjZVRhcmdldDogc2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ud3JpdGUgPSB3cml0ZTsKICAgIHJldHVybiB3cml0ZTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VSZWFkKENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIHZhciByZWFkID0gbmV3IE1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgICByZWNlaXZlckFjY2VzcygpLAogICAgICAgIGluZGV4R2V0TmFtZSwKICAgICAgICBfZm9yZXN0LmNhc3RBcmd1bWVudHMoCiAgICAgICAgICAgIF9mb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPltpbmRleEFjY2VzcygpXSwgdG9rZW4pKSwKICAgICAgICBpbnRlcmZhY2VUYXJnZXQ6IGdldHRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LnJlYWQgPSByZWFkOwogICAgcmV0dXJuIHJlYWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSwgYm9vbCB2b2lkQ29udGV4dCwKICAgICAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgaWYgKCF2b2lkQ29udGV4dCkgcmV0dXJuIF9tYWtlV3JpdGVBbmRSZXR1cm4odmFsdWUsIGNvbXBsZXhBc3NpZ25tZW50KTsKICAgIHZhciB3cml0ZSA9IG5ldyBNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQoCiAgICAgICAgcmVjZWl2ZXJBY2Nlc3MoKSwKICAgICAgICBpbmRleFNldE5hbWUsCiAgICAgICAgX2ZvcmVzdC5jYXN0QXJndW1lbnRzKAogICAgICAgICAgICBfZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5baW5kZXhBY2Nlc3MoKSwgdmFsdWVdLCB0b2tlbikpLAogICAgICAgIGludGVyZmFjZVRhcmdldDogc2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ud3JpdGUgPSB3cml0ZTsKICAgIHJldHVybiB3cml0ZTsKICB9CgogIC8vIFRPRE8oZG1pdHJ5YXMpOiByZW1vdmUgdGhpcyBtZXRob2QgYWZ0ZXIgdGhlICJbXT0iIG9wZXJhdG9yIG9mIHRoZSBDb250ZXh0CiAgLy8gY2xhc3MgaXMgbWFkZSB0byByZXR1cm4gYSB2YWx1ZS4KICBFeHByZXNzaW9uIF9tYWtlV3JpdGVBbmRSZXR1cm4oCiAgICAgIEV4cHJlc3Npb24gdmFsdWUsIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIC8vIFRoZSBjYWxsIHRvIFtdPSBkb2VzIG5vdCByZXR1cm4gdGhlIHZhbHVlIGxpa2UgZGlyZWN0LXN0eWxlIGFzc2lnbm1lbnRzCiAgICAvLyBkby4gIFdlIG5lZWQgdG8gYmluZCB0aGUgdmFsdWUgaW4gYSBsZXQuCiAgICB2YXIgdmFsdWVWYXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKHZhbHVlKTsKICAgIHZhciB3cml0ZSA9IG5ldyBNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQoCiAgICAgICAgcmVjZWl2ZXJBY2Nlc3MoKSwKICAgICAgICBpbmRleFNldE5hbWUsCiAgICAgICAgX2ZvcmVzdC5jYXN0QXJndW1lbnRzKF9mb3Jlc3QuYXJndW1lbnRzKAogICAgICAgICAgICA8RXhwcmVzc2lvbj5baW5kZXhBY2Nlc3MoKSwgbmV3IFZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpXSwKICAgICAgICAgICAgdG9rZW4pKSwKICAgICAgICBpbnRlcmZhY2VUYXJnZXQ6IHNldHRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LndyaXRlID0gd3JpdGU7CiAgICB2YXIgZHVtbXkgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50LmZvclZhbHVlKAogICAgICAgIHdyaXRlLCBfaGVscGVyLmZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKICAgIHJldHVybiBtYWtlTGV0KAogICAgICAgIHZhbHVlVmFyaWFibGUsIG1ha2VMZXQoZHVtbXksIG5ldyBWYXJpYWJsZUdldCh2YWx1ZVZhcmlhYmxlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfZmluaXNoKAogICAgICBFeHByZXNzaW9uIGJvZHksIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIGludCBvZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICByZXR1cm4gc3VwZXIuX2ZpbmlzaCgKICAgICAgICBtYWtlTGV0KAogICAgICAgICAgICByZWNlaXZlclZhcmlhYmxlLCBtYWtlTGV0KGluZGV4VmFyaWFibGUsIGJvZHkpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0KQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgIGNvbXBsZXhBc3NpZ25tZW50KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBfaGVscGVyLmJ1aWxkTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBidWlsZFNpbXBsZVJlYWQoKSwgY2FsbE5hbWUsIGFyZ3VtZW50cywgX2ZvcmVzdC5yZWFkT2Zmc2V0KGFyZ3VtZW50cyksCiAgICAgICAgaXNJbXBsaWNpdENhbGw6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBzdGFydENvbXBsZXhBc3NpZ25tZW50KEV4cHJlc3Npb24gcmhzKSA9PgogICAgICBTeW50aGV0aWNXcmFwcGVyLndyYXBJbmRleEFzc2lnbm1lbnQocmVjZWl2ZXIsIGluZGV4LCByaHMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzID0gbmV3IE5hbWVTeXN0ZW0oKTsKICAgIHNpbmsud3JpdGUoIiwgcmVjZWl2ZXI6ICIpOwogICAgcHJpbnROb2RlT24ocmVjZWl2ZXIsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIGluZGV4OiAiKTsKICAgIHByaW50Tm9kZU9uKGluZGV4LCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCBnZXR0ZXI6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24oZ2V0dGVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCBzZXR0ZXI6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24oc2V0dGVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCByZWNlaXZlclZhcmlhYmxlOiAiKTsKICAgIHByaW50Tm9kZU9uKHJlY2VpdmVyVmFyaWFibGUsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIGluZGV4VmFyaWFibGU6ICIpOwogICAgcHJpbnROb2RlT24oaW5kZXhWYXJpYWJsZSwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICB9CgogIHN0YXRpYyBHZW5lcmF0b3IgbWFrZSgKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBFeHByZXNzaW9uIGluZGV4LAogICAgICBQcm9jZWR1cmUgZ2V0dGVyLAogICAgICBQcm9jZWR1cmUgc2V0dGVyKSB7CiAgICBpZiAoaGVscGVyLmZvcmVzdC5pc1RoaXNFeHByZXNzaW9uKHJlY2VpdmVyKSkgewogICAgICByZXR1cm4gbmV3IFRoaXNJbmRleGVkQWNjZXNzR2VuZXJhdG9yKAogICAgICAgICAgaGVscGVyLCB0b2tlbiwgaW5kZXgsIGdldHRlciwgc2V0dGVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcigKICAgICAgICAgIGhlbHBlciwgdG9rZW4sIHJlY2VpdmVyLCBpbmRleCwgZ2V0dGVyLCBzZXR0ZXIpOwogICAgfQogIH0KfQoKLy8vIFNwZWNpYWwgY2FzZSBvZiBbSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcl0gdG8gYXZvaWQgY3JlYXRpbmcgYW4gaW5kaXJlY3QKLy8vIGFjY2VzcyB0byAndGhpcycuCmNsYXNzIFRoaXNJbmRleGVkQWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKICBmaW5hbCBFeHByZXNzaW9uIGluZGV4OwoKICBmaW5hbCBQcm9jZWR1cmUgZ2V0dGVyOwoKICBmaW5hbCBQcm9jZWR1cmUgc2V0dGVyOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uIGluZGV4VmFyaWFibGU7CgogIFRoaXNJbmRleGVkQWNjZXNzR2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwKICAgICAgdGhpcy5pbmRleCwgdGhpcy5nZXR0ZXIsIHRoaXMuc2V0dGVyKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+ICJbXSI7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3IiOwoKICBFeHByZXNzaW9uIGluZGV4QWNjZXNzKCkgewogICAgaW5kZXhWYXJpYWJsZSA/Pz0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoaW5kZXgpOwogICAgcmV0dXJuIG5ldyBWYXJpYWJsZUdldChpbmRleFZhcmlhYmxlKTsKICB9CgogIEV4cHJlc3Npb24gX21ha2VXcml0ZUFuZFJldHVybigKICAgICAgRXhwcmVzc2lvbiB2YWx1ZSwgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgdmFyIHZhbHVlVmFyaWFibGUgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZSh2YWx1ZSk7CiAgICB2YXIgd3JpdGUgPSBuZXcgTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50KAogICAgICAgIF9mb3Jlc3QudGhpc0V4cHJlc3Npb24odG9rZW4pLAogICAgICAgIGluZGV4U2V0TmFtZSwKICAgICAgICBfZm9yZXN0LmNhc3RBcmd1bWVudHMoX2ZvcmVzdC5hcmd1bWVudHMoCiAgICAgICAgICAgIDxFeHByZXNzaW9uPltpbmRleEFjY2VzcygpLCBuZXcgVmFyaWFibGVHZXQodmFsdWVWYXJpYWJsZSldLAogICAgICAgICAgICB0b2tlbikpLAogICAgICAgIGludGVyZmFjZVRhcmdldDogc2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ud3JpdGUgPSB3cml0ZTsKICAgIHZhciBkdW1teSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKHdyaXRlKTsKICAgIHJldHVybiBtYWtlTGV0KAogICAgICAgIHZhbHVlVmFyaWFibGUsIG1ha2VMZXQoZHVtbXksIG5ldyBWYXJpYWJsZUdldCh2YWx1ZVZhcmlhYmxlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVNpbXBsZVJlYWQoKSB7CiAgICByZXR1cm4gbmV3IE1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgICBfZm9yZXN0LnRoaXNFeHByZXNzaW9uKHRva2VuKSwKICAgICAgICBpbmRleEdldE5hbWUsCiAgICAgICAgX2ZvcmVzdC5jYXN0QXJndW1lbnRzKF9mb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPltpbmRleF0sIHRva2VuKSksCiAgICAgICAgaW50ZXJmYWNlVGFyZ2V0OiBnZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VTaW1wbGVXcml0ZShFeHByZXNzaW9uIHZhbHVlLCBib29sIHZvaWRDb250ZXh0LAogICAgICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICBpZiAoIXZvaWRDb250ZXh0KSByZXR1cm4gX21ha2VXcml0ZUFuZFJldHVybih2YWx1ZSwgY29tcGxleEFzc2lnbm1lbnQpOwogICAgdmFyIHdyaXRlID0gbmV3IE1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgICBfZm9yZXN0LnRoaXNFeHByZXNzaW9uKHRva2VuKSwKICAgICAgICBpbmRleFNldE5hbWUsCiAgICAgICAgX2ZvcmVzdC5jYXN0QXJndW1lbnRzKAogICAgICAgICAgICBfZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5baW5kZXgsIHZhbHVlXSwgdG9rZW4pKSwKICAgICAgICBpbnRlcmZhY2VUYXJnZXQ6IHNldHRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LndyaXRlID0gd3JpdGU7CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlUmVhZChDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICB2YXIgcmVhZCA9IG5ldyBNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQoCiAgICAgICAgX2ZvcmVzdC50aGlzRXhwcmVzc2lvbih0b2tlbiksCiAgICAgICAgaW5kZXhHZXROYW1lLAogICAgICAgIF9mb3Jlc3QuY2FzdEFyZ3VtZW50cygKICAgICAgICAgICAgX2ZvcmVzdC5hcmd1bWVudHMoPEV4cHJlc3Npb24+W2luZGV4QWNjZXNzKCldLCB0b2tlbikpLAogICAgICAgIGludGVyZmFjZVRhcmdldDogZ2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ucmVhZCA9IHJlYWQ7CiAgICByZXR1cm4gcmVhZDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VXcml0ZShFeHByZXNzaW9uIHZhbHVlLCBib29sIHZvaWRDb250ZXh0LAogICAgICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICBpZiAoIXZvaWRDb250ZXh0KSByZXR1cm4gX21ha2VXcml0ZUFuZFJldHVybih2YWx1ZSwgY29tcGxleEFzc2lnbm1lbnQpOwogICAgdmFyIHdyaXRlID0gbmV3IE1ldGhvZEludm9jYXRpb25KdWRnbWVudCgKICAgICAgICBfZm9yZXN0LnRoaXNFeHByZXNzaW9uKHRva2VuKSwKICAgICAgICBpbmRleFNldE5hbWUsCiAgICAgICAgX2ZvcmVzdC5jYXN0QXJndW1lbnRzKAogICAgICAgICAgICBfZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5baW5kZXhBY2Nlc3MoKSwgdmFsdWVdLCB0b2tlbikpLAogICAgICAgIGludGVyZmFjZVRhcmdldDogc2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ud3JpdGUgPSB3cml0ZTsKICAgIHJldHVybiB3cml0ZTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX2ZpbmlzaCgKICAgICAgRXhwcmVzc2lvbiBib2R5LCBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICByZXR1cm4gc3VwZXIuX2ZpbmlzaChtYWtlTGV0KGluZGV4VmFyaWFibGUsIGJvZHkpLCBjb21wbGV4QXNzaWdubWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gX2hlbHBlci5idWlsZE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgYnVpbGRTaW1wbGVSZWFkKCksIGNhbGxOYW1lLCBhcmd1bWVudHMsIG9mZnNldCwKICAgICAgICBpc0ltcGxpY2l0Q2FsbDogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IHN0YXJ0Q29tcGxleEFzc2lnbm1lbnQoRXhwcmVzc2lvbiByaHMpID0+CiAgICAgIFN5bnRoZXRpY1dyYXBwZXIud3JhcEluZGV4QXNzaWdubWVudChudWxsLCBpbmRleCwgcmhzKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgTmFtZVN5c3RlbSBzeW50aGV0aWNOYW1lcyA9IG5ldyBOYW1lU3lzdGVtKCk7CiAgICBzaW5rLndyaXRlKCIsIGluZGV4OiAiKTsKICAgIHByaW50Tm9kZU9uKGluZGV4LCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCBnZXR0ZXI6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24oZ2V0dGVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCBzZXR0ZXI6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24oc2V0dGVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCBpbmRleFZhcmlhYmxlOiAiKTsKICAgIHByaW50Tm9kZU9uKGluZGV4VmFyaWFibGUsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgfQp9CgpjbGFzcyBTdXBlckluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogIGZpbmFsIEV4cHJlc3Npb24gaW5kZXg7CgogIGZpbmFsIE1lbWJlciBnZXR0ZXI7CgogIGZpbmFsIE1lbWJlciBzZXR0ZXI7CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gaW5kZXhWYXJpYWJsZTsKCiAgU3VwZXJJbmRleGVkQWNjZXNzR2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwKICAgICAgdGhpcy5pbmRleCwgdGhpcy5nZXR0ZXIsIHRoaXMuc2V0dGVyKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+ICJbXSI7CgogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiU3VwZXJJbmRleGVkQWNjZXNzR2VuZXJhdG9yIjsKCiAgRXhwcmVzc2lvbiBpbmRleEFjY2VzcygpIHsKICAgIGluZGV4VmFyaWFibGUgPz89IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKGluZGV4KTsKICAgIHJldHVybiBuZXcgVmFyaWFibGVHZXQoaW5kZXhWYXJpYWJsZSk7CiAgfQoKICBFeHByZXNzaW9uIF9tYWtlV3JpdGVBbmRSZXR1cm4oCiAgICAgIEV4cHJlc3Npb24gdmFsdWUsIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIHZhciB2YWx1ZVZhcmlhYmxlID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUodmFsdWUpOwogICAgaWYgKHNldHRlciA9PSBudWxsKSB7CiAgICAgIF9oZWxwZXIud2FyblVucmVzb2x2ZWRNZXRob2QoaW5kZXhTZXROYW1lLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICBpc1N1cGVyOiB0cnVlKTsKICAgIH0KICAgIHZhciB3cml0ZSA9IG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24oCiAgICAgICAgaW5kZXhTZXROYW1lLAogICAgICAgIF9mb3Jlc3QuY2FzdEFyZ3VtZW50cyhfZm9yZXN0LmFyZ3VtZW50cygKICAgICAgICAgICAgPEV4cHJlc3Npb24+W2luZGV4QWNjZXNzKCksIG5ldyBWYXJpYWJsZUdldCh2YWx1ZVZhcmlhYmxlKV0sCiAgICAgICAgICAgIHRva2VuKSksCiAgICAgICAgc2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ud3JpdGUgPSB3cml0ZTsKICAgIHZhciBkdW1teSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKHdyaXRlKTsKICAgIHJldHVybiBtYWtlTGV0KAogICAgICAgIHZhbHVlVmFyaWFibGUsIG1ha2VMZXQoZHVtbXksIG5ldyBWYXJpYWJsZUdldCh2YWx1ZVZhcmlhYmxlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVNpbXBsZVJlYWQoKSB7CiAgICBpZiAoZ2V0dGVyID09IG51bGwpIHsKICAgICAgX2hlbHBlci53YXJuVW5yZXNvbHZlZE1ldGhvZChpbmRleEdldE5hbWUsIG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICAgIGlzU3VwZXI6IHRydWUpOwogICAgfQogICAgLy8gVE9ETyhhaGUpOiBVc2UgW0RpcmVjdE1ldGhvZEludm9jYXRpb25dIHdoZW4gcG9zc2libGUuCiAgICByZXR1cm4gbmV3IFN1cGVyTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50KGluZGV4R2V0TmFtZSwKICAgICAgICBfZm9yZXN0LmNhc3RBcmd1bWVudHMoX2ZvcmVzdC5hcmd1bWVudHMoPEV4cHJlc3Npb24+W2luZGV4XSwgdG9rZW4pKSwKICAgICAgICBpbnRlcmZhY2VUYXJnZXQ6IGdldHRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVNpbXBsZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUsIGJvb2wgdm9pZENvbnRleHQsCiAgICAgIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIGlmICghdm9pZENvbnRleHQpIHJldHVybiBfbWFrZVdyaXRlQW5kUmV0dXJuKHZhbHVlLCBjb21wbGV4QXNzaWdubWVudCk7CiAgICBpZiAoc2V0dGVyID09IG51bGwpIHsKICAgICAgX2hlbHBlci53YXJuVW5yZXNvbHZlZE1ldGhvZChpbmRleFNldE5hbWUsIG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICAgIGlzU3VwZXI6IHRydWUpOwogICAgfQogICAgdmFyIHdyaXRlID0gbmV3IFN1cGVyTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBpbmRleFNldE5hbWUsCiAgICAgICAgX2ZvcmVzdC5jYXN0QXJndW1lbnRzKAogICAgICAgICAgICBfZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5baW5kZXgsIHZhbHVlXSwgdG9rZW4pKSwKICAgICAgICBzZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py53cml0ZSA9IHdyaXRlOwogICAgcmV0dXJuIHdyaXRlOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVJlYWQoQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgaWYgKGdldHRlciA9PSBudWxsKSB7CiAgICAgIF9oZWxwZXIud2FyblVucmVzb2x2ZWRNZXRob2QoaW5kZXhHZXROYW1lLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICBpc1N1cGVyOiB0cnVlKTsKICAgIH0KICAgIHZhciByZWFkID0gbmV3IFN1cGVyTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBpbmRleEdldE5hbWUsCiAgICAgICAgX2ZvcmVzdC5jYXN0QXJndW1lbnRzKAogICAgICAgICAgICBfZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5baW5kZXhBY2Nlc3MoKV0sIHRva2VuKSksCiAgICAgICAgZ2V0dGVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICBjb21wbGV4QXNzaWdubWVudD8ucmVhZCA9IHJlYWQ7CiAgICByZXR1cm4gcmVhZDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VXcml0ZShFeHByZXNzaW9uIHZhbHVlLCBib29sIHZvaWRDb250ZXh0LAogICAgICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICBpZiAoIXZvaWRDb250ZXh0KSByZXR1cm4gX21ha2VXcml0ZUFuZFJldHVybih2YWx1ZSwgY29tcGxleEFzc2lnbm1lbnQpOwogICAgaWYgKHNldHRlciA9PSBudWxsKSB7CiAgICAgIF9oZWxwZXIud2FyblVucmVzb2x2ZWRNZXRob2QoaW5kZXhTZXROYW1lLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICBpc1N1cGVyOiB0cnVlKTsKICAgIH0KICAgIHZhciB3cml0ZSA9IG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24oCiAgICAgICAgaW5kZXhTZXROYW1lLAogICAgICAgIF9mb3Jlc3QuY2FzdEFyZ3VtZW50cygKICAgICAgICAgICAgX2ZvcmVzdC5hcmd1bWVudHMoPEV4cHJlc3Npb24+W2luZGV4QWNjZXNzKCksIHZhbHVlXSwgdG9rZW4pKSwKICAgICAgICBzZXR0ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGNvbXBsZXhBc3NpZ25tZW50Py53cml0ZSA9IHdyaXRlOwogICAgcmV0dXJuIHdyaXRlOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfZmluaXNoKAogICAgICBFeHByZXNzaW9uIGJvZHksIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIHJldHVybiBzdXBlci5fZmluaXNoKAogICAgICAgIG1ha2VMZXQoaW5kZXhWYXJpYWJsZSwgYm9keSkuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgY29tcGxleEFzc2lnbm1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRNZXRob2RJbnZvY2F0aW9uKAogICAgICAgIGJ1aWxkU2ltcGxlUmVhZCgpLCBjYWxsTmFtZSwgYXJndW1lbnRzLCBvZmZzZXQsCiAgICAgICAgaXNJbXBsaWNpdENhbGw6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBzdGFydENvbXBsZXhBc3NpZ25tZW50KEV4cHJlc3Npb24gcmhzKSA9PgogICAgICBTeW50aGV0aWNXcmFwcGVyLndyYXBJbmRleEFzc2lnbm1lbnQobnVsbCwgaW5kZXgsIHJocywgaXNTdXBlcjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIE5hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMgPSBuZXcgTmFtZVN5c3RlbSgpOwogICAgc2luay53cml0ZSgiLCBpbmRleDogIik7CiAgICBwcmludE5vZGVPbihpbmRleCwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgZ2V0dGVyOiAiKTsKICAgIHByaW50UXVhbGlmaWVkTmFtZU9uKGdldHRlciwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgc2V0dGVyOiAiKTsKICAgIHByaW50UXVhbGlmaWVkTmFtZU9uKHNldHRlciwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgaW5kZXhWYXJpYWJsZTogIik7CiAgICBwcmludE5vZGVPbihpbmRleFZhcmlhYmxlLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogIH0KfQoKY2xhc3MgU3RhdGljQWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKICBmaW5hbCBNZW1iZXIgcmVhZFRhcmdldDsKCiAgZmluYWwgTWVtYmVyIHdyaXRlVGFyZ2V0OwoKICBTdGF0aWNBY2Nlc3NHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLAogICAgICB0aGlzLnJlYWRUYXJnZXQsIHRoaXMud3JpdGVUYXJnZXQpCiAgICAgIDogYXNzZXJ0KHJlYWRUYXJnZXQgIT0gbnVsbCB8fCB3cml0ZVRhcmdldCAhPSBudWxsKSwKICAgICAgICBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgZmFjdG9yeSBTdGF0aWNBY2Nlc3NHZW5lcmF0b3IuZnJvbUJ1aWxkZXIoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBUb2tlbiB0b2tlbiwgRGVjbGFyYXRpb24gYnVpbGRlclNldHRlcikgewogICAgaWYgKGRlY2xhcmF0aW9uIGlzIEFjY2Vzc0Vycm9yQnVpbGRlcikgewogICAgICBBY2Nlc3NFcnJvckJ1aWxkZXIgZXJyb3IgPSBkZWNsYXJhdGlvbjsKICAgICAgZGVjbGFyYXRpb24gPSBlcnJvci5idWlsZGVyOwogICAgICAvLyBXZSBzaG91bGQgb25seSBzZWUgYW4gYWNjZXNzIGVycm9yIGhlcmUgaWYgd2UndmUgbG9va2VkIHVwIGEgc2V0dGVyCiAgICAgIC8vIHdoZW4gbm90IGV4cGxpY2l0bHkgbG9va2luZyBmb3IgYSBzZXR0ZXIuCiAgICAgIGFzc2VydChkZWNsYXJhdGlvbi5pc1NldHRlcik7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uLnRhcmdldCA9PSBudWxsKSB7CiAgICAgIHJldHVybiB1bmhhbmRsZWQoCiAgICAgICAgICAiJHtkZWNsYXJhdGlvbi5ydW50aW1lVHlwZX0iLAogICAgICAgICAgIlN0YXRpY0FjY2Vzc0dlbmVyYXRvci5mcm9tQnVpbGRlciIsCiAgICAgICAgICBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICBoZWxwZXIudXJpKTsKICAgIH0KICAgIE1lbWJlciBnZXR0ZXIgPSBkZWNsYXJhdGlvbi50YXJnZXQuaGFzR2V0dGVyID8gZGVjbGFyYXRpb24udGFyZ2V0IDogbnVsbDsKICAgIE1lbWJlciBzZXR0ZXIgPSBkZWNsYXJhdGlvbi50YXJnZXQuaGFzU2V0dGVyID8gZGVjbGFyYXRpb24udGFyZ2V0IDogbnVsbDsKICAgIGlmIChzZXR0ZXIgPT0gbnVsbCkgewogICAgICBpZiAoYnVpbGRlclNldHRlcj8udGFyZ2V0Py5oYXNTZXR0ZXIgPz8gZmFsc2UpIHsKICAgICAgICBzZXR0ZXIgPSBidWlsZGVyU2V0dGVyLnRhcmdldDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBTdGF0aWNBY2Nlc3NHZW5lcmF0b3IoaGVscGVyLCB0b2tlbiwgZ2V0dGVyLCBzZXR0ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lID0+ICJTdGF0aWNBY2Nlc3NHZW5lcmF0b3IiOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+IChyZWFkVGFyZ2V0ID8/IHdyaXRlVGFyZ2V0KS5uYW1lLm5hbWU7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VSZWFkKENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpIHsKICAgIEV4cHJlc3Npb24gcmVhZDsKICAgIGlmIChyZWFkVGFyZ2V0ID09IG51bGwpIHsKICAgICAgcmVhZCA9IF9tYWtlSW52YWxpZFJlYWQoKTsKICAgICAgaWYgKGNvbXBsZXhBc3NpZ25tZW50ICE9IG51bGwpIHsKICAgICAgICByZWFkID0gX2hlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihyZWFkKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVhZCA9IF9oZWxwZXIubWFrZVN0YXRpY0dldChyZWFkVGFyZ2V0LCB0b2tlbik7CiAgICB9CiAgICBjb21wbGV4QXNzaWdubWVudD8ucmVhZCA9IHJlYWQ7CiAgICByZXR1cm4gcmVhZDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VXcml0ZShFeHByZXNzaW9uIHZhbHVlLCBib29sIHZvaWRDb250ZXh0LAogICAgICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICBFeHByZXNzaW9uIHdyaXRlOwogICAgaWYgKHdyaXRlVGFyZ2V0ID09IG51bGwpIHsKICAgICAgd3JpdGUgPSBfbWFrZUludmFsaWRXcml0ZSh2YWx1ZSk7CiAgICAgIGlmIChjb21wbGV4QXNzaWdubWVudCAhPSBudWxsKSB7CiAgICAgICAgd3JpdGUgPSBfaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKHdyaXRlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgd3JpdGUgPSBuZXcgU3RhdGljU2V0KHdyaXRlVGFyZ2V0LCB2YWx1ZSk7CiAgICB9CiAgICBjb21wbGV4QXNzaWdubWVudD8ud3JpdGUgPSB3cml0ZTsKICAgIHdyaXRlLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBpZiAoX2hlbHBlci5jb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUgJiYKICAgICAgICAhX2hlbHBlci5pc0lkZW50aWNhbChyZWFkVGFyZ2V0KSkgewogICAgICByZXR1cm4gX2hlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZU5vdENvbnN0YW50RXhwcmVzc2lvbi53aXRoQXJndW1lbnRzKCdNZXRob2QgaW52b2NhdGlvbicpLAogICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgcmVhZFRhcmdldD8ubmFtZT8ubmFtZT8ubGVuZ3RoID8/IDApOwogICAgfQogICAgaWYgKHJlYWRUYXJnZXQgPT0gbnVsbCB8fCBpc0ZpZWxkT3JHZXR0ZXIocmVhZFRhcmdldCkpIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRNZXRob2RJbnZvY2F0aW9uKGJ1aWxkU2ltcGxlUmVhZCgpLCBjYWxsTmFtZSwKICAgICAgICAgIGFyZ3VtZW50cywgb2Zmc2V0ICsgKHJlYWRUYXJnZXQ/Lm5hbWU/Lm5hbWU/Lmxlbmd0aCA/PyAwKSwKICAgICAgICAgIC8vIFRoaXMgaXNuJ3QgYSBjb25zdGFudCBleHByZXNzaW9uLCBidXQgd2UgaGF2ZSBjaGVja2VkIGlmIGEKICAgICAgICAgIC8vIGNvbnN0YW50IGV4cHJlc3Npb24gZXJyb3Igc2hvdWxkIGJlIGVtaXR0ZWQgYWxyZWFkeS4KICAgICAgICAgIGlzQ29uc3RhbnRFeHByZXNzaW9uOiB0cnVlLAogICAgICAgICAgaXNJbXBsaWNpdENhbGw6IHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRTdGF0aWNJbnZvY2F0aW9uKHJlYWRUYXJnZXQsIGFyZ3VtZW50cywKICAgICAgICAgIGNoYXJPZmZzZXQ6IG9mZnNldCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IHN0YXJ0Q29tcGxleEFzc2lnbm1lbnQoRXhwcmVzc2lvbiByaHMpID0+CiAgICAgIFN5bnRoZXRpY1dyYXBwZXIud3JhcFN0YXRpY0Fzc2lnbm1lbnQocmhzKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgTmFtZVN5c3RlbSBzeW50aGV0aWNOYW1lcyA9IG5ldyBOYW1lU3lzdGVtKCk7CiAgICBzaW5rLndyaXRlKCIsIHJlYWRUYXJnZXQ6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24ocmVhZFRhcmdldCwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgd3JpdGVUYXJnZXQ6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24od3JpdGVUYXJnZXQsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgfQp9CgpjbGFzcyBMb2FkTGlicmFyeUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgZmluYWwgTG9hZExpYnJhcnlCdWlsZGVyIGJ1aWxkZXI7CgogIExvYWRMaWJyYXJ5R2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIHRoaXMuYnVpbGRlcikKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfcGxhaW5OYW1lRm9yUmVhZCA9PiAnbG9hZExpYnJhcnknOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIkxvYWRMaWJyYXJ5R2VuZXJhdG9yIjsKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlUmVhZChDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICBidWlsZGVyLmltcG9ydERlcGVuZGVuY3kudGFyZ2V0TGlicmFyeTsKICAgIHZhciByZWFkID0gbmV3IExvYWRMaWJyYXJ5VGVhck9mZkp1ZGdtZW50KAogICAgICAgIGJ1aWxkZXIuaW1wb3J0RGVwZW5kZW5jeSwgYnVpbGRlci5jcmVhdGVUZWFyb2ZmTWV0aG9kKF9oZWxwZXIuZm9yZXN0KSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgY29tcGxleEFzc2lnbm1lbnQ/LnJlYWQgPSByZWFkOwogICAgcmV0dXJuIHJlYWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBpZiAoX2ZvcmVzdC5hcmd1bWVudHNQb3NpdGlvbmFsKGFyZ3VtZW50cykubGVuZ3RoID4gMCB8fAogICAgICAgIF9mb3Jlc3QuYXJndW1lbnRzTmFtZWQoYXJndW1lbnRzKS5sZW5ndGggPiAwKSB7CiAgICAgIF9oZWxwZXIuYWRkUHJvYmxlbUVycm9ySWZDb25zdCgKICAgICAgICAgIG1lc3NhZ2VMb2FkTGlicmFyeVRha2VzTm9Bcmd1bWVudHMsIG9mZnNldCwgJ2xvYWRMaWJyYXJ5Jy5sZW5ndGgpOwogICAgfQogICAgcmV0dXJuIGJ1aWxkZXIuY3JlYXRlTG9hZExpYnJhcnkob2Zmc2V0LCBfZm9yZXN0LCBhcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBidWlsZGVyOiAiKTsKICAgIHNpbmsud3JpdGUoYnVpbGRlcik7CiAgfQp9CgpjbGFzcyBEZWZlcnJlZEFjY2Vzc0dlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgZmluYWwgUHJlZml4VXNlR2VuZXJhdG9yIHByZWZpeEdlbmVyYXRvcjsKCiAgZmluYWwgR2VuZXJhdG9yIHN1ZmZpeEdlbmVyYXRvcjsKCiAgRGVmZXJyZWRBY2Nlc3NHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLAogICAgICB0aGlzLnByZWZpeEdlbmVyYXRvciwgdGhpcy5zdWZmaXhHZW5lcmF0b3IpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VTaW1wbGVSZWFkKCkgewogICAgcmV0dXJuIF9oZWxwZXIud3JhcEluRGVmZXJyZWRDaGVjayhzdWZmaXhHZW5lcmF0b3IuX21ha2VTaW1wbGVSZWFkKCksCiAgICAgICAgcHJlZml4R2VuZXJhdG9yLnByZWZpeCwgdG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlUmVhZChDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50IGNvbXBsZXhBc3NpZ25tZW50KSB7CiAgICByZXR1cm4gX2hlbHBlci53cmFwSW5EZWZlcnJlZENoZWNrKAogICAgICAgIHN1ZmZpeEdlbmVyYXRvci5fbWFrZVJlYWQoY29tcGxleEFzc2lnbm1lbnQpLAogICAgICAgIHByZWZpeEdlbmVyYXRvci5wcmVmaXgsCiAgICAgICAgdG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSwgYm9vbCB2b2lkQ29udGV4dCwKICAgICAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgcmV0dXJuIF9oZWxwZXIud3JhcEluRGVmZXJyZWRDaGVjaygKICAgICAgICBzdWZmaXhHZW5lcmF0b3IuX21ha2VXcml0ZSh2YWx1ZSwgdm9pZENvbnRleHQsIGNvbXBsZXhBc3NpZ25tZW50KSwKICAgICAgICBwcmVmaXhHZW5lcmF0b3IucHJlZml4LAogICAgICAgIHRva2VuLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBzdGFydENvbXBsZXhBc3NpZ25tZW50KEV4cHJlc3Npb24gcmhzKSA9PgogICAgICBTeW50aGV0aWNXcmFwcGVyLndyYXBTdGF0aWNBc3NpZ25tZW50KHJocyk7CgogIEBvdmVycmlkZQogIGJ1aWxkUHJvcGVydHlBY2Nlc3MoCiAgICAgIEluY29tcGxldGVTZW5kR2VuZXJhdG9yIHNlbmQsIGludCBvcGVyYXRvck9mZnNldCwgYm9vbCBpc051bGxBd2FyZSkgewogICAgT2JqZWN0IHByb3BlcnR5QWNjZXNzID0KICAgICAgICBzdWZmaXhHZW5lcmF0b3IuYnVpbGRQcm9wZXJ0eUFjY2VzcyhzZW5kLCBvcGVyYXRvck9mZnNldCwgaXNOdWxsQXdhcmUpOwogICAgaWYgKHByb3BlcnR5QWNjZXNzIGlzIEdlbmVyYXRvcikgewogICAgICByZXR1cm4gbmV3IERlZmVycmVkQWNjZXNzR2VuZXJhdG9yKAogICAgICAgICAgX2hlbHBlciwgdG9rZW4sIHByZWZpeEdlbmVyYXRvciwgcHJvcGVydHlBY2Nlc3MpOwogICAgfSBlbHNlIHsKICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcHJvcGVydHlBY2Nlc3M7CiAgICAgIHJldHVybiBfaGVscGVyLndyYXBJbkRlZmVycmVkQ2hlY2soCiAgICAgICAgICBleHByZXNzaW9uLCBwcmVmaXhHZW5lcmF0b3IucHJlZml4LCB0b2tlbi5jaGFyT2Zmc2V0KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKAogICAgICAgICJkZWZlcnJlZEFjY2Vzc29yLnBsYWluTmFtZUZvclJlYWQiLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksIF91cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lID0+ICJEZWZlcnJlZEFjY2Vzc0dlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIFR5cGVCdWlsZGVyIGJ1aWxkVHlwZVdpdGhSZXNvbHZlZEFyZ3VtZW50cyhMaXN0PFVucmVzb2x2ZWRUeXBlPiBhcmd1bWVudHMpIHsKICAgIFN0cmluZyBuYW1lID0gIiR7cHJlZml4R2VuZXJhdG9yLl9wbGFpbk5hbWVGb3JSZWFkfS4iCiAgICAgICAgIiR7c3VmZml4R2VuZXJhdG9yLl9wbGFpbk5hbWVGb3JSZWFkfSI7CiAgICBUeXBlQnVpbGRlciB0eXBlID0KICAgICAgICBzdWZmaXhHZW5lcmF0b3IuYnVpbGRUeXBlV2l0aFJlc29sdmVkQXJndW1lbnRzKGFyZ3VtZW50cyk7CiAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlOwogICAgaWYgKHR5cGUgaXMgTmFtZWRUeXBlQnVpbGRlciAmJiB0eXBlLmRlY2xhcmF0aW9uIGlzIEludmFsaWRUeXBlQnVpbGRlcikgewogICAgICBJbnZhbGlkVHlwZUJ1aWxkZXIgZGVjbGFyYXRpb24gPSB0eXBlLmRlY2xhcmF0aW9uOwogICAgICBtZXNzYWdlID0gZGVjbGFyYXRpb24ubWVzc2FnZTsKICAgIH0gZWxzZSB7CiAgICAgIGludCBjaGFyT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4ocHJlZml4R2VuZXJhdG9yLnRva2VuKTsKICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlRGVmZXJyZWRUeXBlQW5ub3RhdGlvbgogICAgICAgICAgLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgX2hlbHBlci5idWlsZERhcnRUeXBlKG5ldyBVbnJlc29sdmVkVHlwZSh0eXBlLCBjaGFyT2Zmc2V0LCBfdXJpKSksCiAgICAgICAgICAgICAgcHJlZml4R2VuZXJhdG9yLl9wbGFpbk5hbWVGb3JSZWFkKQogICAgICAgICAgLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICBfdXJpLCBjaGFyT2Zmc2V0LCBsZW5ndGhPZlNwYW4ocHJlZml4R2VuZXJhdG9yLnRva2VuLCB0b2tlbikpOwogICAgfQogICAgTmFtZWRUeXBlQnVpbGRlciByZXN1bHQgPSBuZXcgTmFtZWRUeXBlQnVpbGRlcihuYW1lLCBudWxsKTsKICAgIF9oZWxwZXIubGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgIG1lc3NhZ2UubWVzc2FnZU9iamVjdCwgbWVzc2FnZS5jaGFyT2Zmc2V0LCBtZXNzYWdlLmxlbmd0aCwgbWVzc2FnZS51cmkpOwogICAgcmVzdWx0LmJpbmQocmVzdWx0LmJ1aWxkSW52YWxpZFR5cGUobWVzc2FnZSkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBfaGVscGVyLndyYXBJbkRlZmVycmVkQ2hlY2soCiAgICAgICAgc3VmZml4R2VuZXJhdG9yLmRvSW52b2NhdGlvbihvZmZzZXQsIGFyZ3VtZW50cyksCiAgICAgICAgcHJlZml4R2VuZXJhdG9yLnByZWZpeCwKICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gaW52b2tlQ29uc3RydWN0b3IoCiAgICAgIExpc3Q8VW5yZXNvbHZlZFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBUb2tlbiBuYW1lVG9rZW4sCiAgICAgIFRva2VuIG5hbWVMYXN0VG9rZW4sCiAgICAgIENvbnN0bmVzcyBjb25zdG5lc3MpIHsKICAgIHJldHVybiBfaGVscGVyLndyYXBJbkRlZmVycmVkQ2hlY2soCiAgICAgICAgc3VmZml4R2VuZXJhdG9yLmludm9rZUNvbnN0cnVjdG9yKHR5cGVBcmd1bWVudHMsIG5hbWUsIGFyZ3VtZW50cywKICAgICAgICAgICAgbmFtZVRva2VuLCBuYW1lTGFzdFRva2VuLCBjb25zdG5lc3MpLAogICAgICAgIHByZWZpeEdlbmVyYXRvci5wcmVmaXgsCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4oc3VmZml4R2VuZXJhdG9yLnRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlKCIsIHByZWZpeEdlbmVyYXRvcjogIik7CiAgICBzaW5rLndyaXRlKHByZWZpeEdlbmVyYXRvcik7CiAgICBzaW5rLndyaXRlKCIsIHN1ZmZpeEdlbmVyYXRvcjogIik7CiAgICBzaW5rLndyaXRlKHN1ZmZpeEdlbmVyYXRvcik7CiAgfQp9CgovLy8gW1R5cGVVc2VHZW5lcmF0b3JdIHJlcHJlc2VudHMgdGhlIHN1YmV4cHJlc3Npb24gd2hvc2UgcHJlZml4IGlzIHRoZSBuYW1lIG9mCi8vLyBhIGNsYXNzLCBlbnVtLCB0eXBlIHZhcmlhYmxlLCB0eXBlZGVmLCBtaXhpbiBkZWNsYXJhdGlvbiwgZXh0ZW5zaW9uCi8vLyBkZWNsYXJhdGlvbiBvciBidWlsdC1pbiB0eXBlLCBsaWtlIGR5bmFtaWMgYW5kIHZvaWQuCi8vLwovLy8gRm9yIGluc3RhbmNlOgovLy8KLy8vICAgY2xhc3MgQTxUPiB7fQovLy8gICB0eXBlZGVmIEIgPSBGdW5jdGlvbigpOwovLy8gICBtaXhpbiBDPFQ+IG9uIEE8VD4ge30KLy8vICAgZXh0ZW5zaW9uIEQ8VD4gb24gQTxUPiB7fQovLy8KLy8vICAgbWV0aG9kPFQ+KCkgewovLy8gICAgIEM8Qj4gICAgICAgIC8vIGEgVHlwZVVzZUdlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgQ2AgYW5kIGBCYC4KLy8vICAgICBCIGI7ICAgICAgICAvLyBhIFR5cGVVc2VHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYEJgLgovLy8gICAgIEQuZm9vKCk7ICAgIC8vIGEgVHlwZVVzZUdlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgRGAuCi8vLyAgICAgbmV3IEE8VD4oKTsgLy8gYSBUeXBlVXNlR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBBYCBhbmQgYFRgLgovLy8gICAgIFQoKTsgICAgICAgIC8vIGEgVHlwZVVzZUdlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgVGAuCi8vLyAgIH0KLy8vCmNsYXNzIFR5cGVVc2VHZW5lcmF0b3IgZXh0ZW5kcyBSZWFkT25seUFjY2Vzc0dlbmVyYXRvciB7CiAgZmluYWwgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbjsKCiAgVHlwZVVzZUdlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMuZGVjbGFyYXRpb24sIFN0cmluZyBwbGFpbk5hbWVGb3JSZWFkKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4sIG51bGwsIHBsYWluTmFtZUZvclJlYWQpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlR5cGVVc2VHZW5lcmF0b3IiOwoKICBAb3ZlcnJpZGUKICBUeXBlQnVpbGRlciBidWlsZFR5cGVXaXRoUmVzb2x2ZWRBcmd1bWVudHMoTGlzdDxVbnJlc29sdmVkVHlwZT4gYXJndW1lbnRzKSB7CiAgICBpZiAoZGVjbGFyYXRpb24uaXNFeHRlbnNpb24pIHsKICAgICAgLy8gRXh0ZW5zaW9uIGRlY2xhcmF0aW9ucyBjYW5ub3QgYmUgdXNlZCBhcyB0eXBlcy4KICAgICAgcmV0dXJuIHN1cGVyLmJ1aWxkVHlwZVdpdGhSZXNvbHZlZEFyZ3VtZW50cyhhcmd1bWVudHMpOwogICAgfQogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGludCBleHBlY3RlZCA9IGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXNDb3VudDsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggIT0gZXhwZWN0ZWQpIHsKICAgICAgICAvLyBCdWlsZCB0aGUgdHlwZSBhcmd1bWVudHMgdG8gcmVwb3J0IGFueSBlcnJvcnMgdGhleSBtYXkgaGF2ZS4KICAgICAgICBfaGVscGVyLmJ1aWxkRGFydFR5cGVBcmd1bWVudHMoYXJndW1lbnRzKTsKICAgICAgICBfaGVscGVyLndhcm5UeXBlQXJndW1lbnRzTWlzbWF0Y2goCiAgICAgICAgICAgIGRlY2xhcmF0aW9uLm5hbWUsIGV4cGVjdGVkLCBvZmZzZXRGb3JUb2tlbih0b2tlbikpOwogICAgICAgIC8vIFdlIGlnbm9yZSB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLCB3aGljaCB3aWxsIGluIHR1cm4gcmV0dXJuIHRoZQogICAgICAgIC8vIHJhdyB0eXBlIGJlbG93LgogICAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IGNoYW5nZSB0byB1c2UgYW4gSW52YWxpZFR5cGUgYW5kIGluY2x1ZGUgdGhlIHJhdyB0eXBlCiAgICAgICAgLy8gYXMgYSByZWNvdmVyeSBub2RlIG9uY2UgdGhlIElSIGNhbiByZXByZXNlbnQgaXQgKElzc3VlICMyOTg0MCkuCiAgICAgICAgYXJndW1lbnRzID0gbnVsbDsKICAgICAgfQogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzQ291bnQgIT0gMCkgewogICAgICBfaGVscGVyLmFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZU1pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHMKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzQ291bnQpLAogICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLAogICAgICAgICAgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKTsKICAgIH0KCiAgICBMaXN0PFR5cGVCdWlsZGVyPiBhcmd1bWVudEJ1aWxkZXJzOwogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFyZ3VtZW50QnVpbGRlcnMgPSBuZXcgTGlzdDxUeXBlQnVpbGRlcj4oYXJndW1lbnRzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRCdWlsZGVycy5sZW5ndGg7IGkrKykgewogICAgICAgIGFyZ3VtZW50QnVpbGRlcnNbaV0gPQogICAgICAgICAgICBfaGVscGVyLnZhbGlkYXRlVHlwZVVzZShhcmd1bWVudHNbaV0sIGZhbHNlKS5idWlsZGVyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IE5hbWVkVHlwZUJ1aWxkZXIoX3BsYWluTmFtZUZvclJlYWQsIGFyZ3VtZW50QnVpbGRlcnMpCiAgICAgIC4uYmluZChkZWNsYXJhdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGludm9rZUNvbnN0cnVjdG9yKAogICAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgVG9rZW4gbmFtZVRva2VuLAogICAgICBUb2tlbiBuYW1lTGFzdFRva2VuLAogICAgICBDb25zdG5lc3MgY29uc3RuZXNzKSB7CiAgICByZXR1cm4gX2hlbHBlci5idWlsZENvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICBkZWNsYXJhdGlvbiwKICAgICAgICBuYW1lVG9rZW4sCiAgICAgICAgbmFtZUxhc3RUb2tlbiwKICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgbmFtZSwKICAgICAgICB0eXBlQXJndW1lbnRzLAogICAgICAgIG9mZnNldEZvclRva2VuKG5hbWVUb2tlbiA/PyB0b2tlbiksCiAgICAgICAgY29uc3RuZXNzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGUoIiwgZGVjbGFyYXRpb246ICIpOwogICAgc2luay53cml0ZShkZWNsYXJhdGlvbik7CiAgICBzaW5rLndyaXRlKCIsIHBsYWluTmFtZUZvclJlYWQ6ICIpOwogICAgc2luay53cml0ZShfcGxhaW5OYW1lRm9yUmVhZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGdldCBleHByZXNzaW9uIHsKICAgIGlmIChzdXBlci5leHByZXNzaW9uID09IG51bGwpIHsKICAgICAgaW50IG9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIEludmFsaWRUeXBlQnVpbGRlcikgewogICAgICAgIEludmFsaWRUeXBlQnVpbGRlciBkZWNsYXJhdGlvbiA9IHRoaXMuZGVjbGFyYXRpb247CiAgICAgICAgX2hlbHBlci5hZGRQcm9ibGVtRXJyb3JJZkNvbnN0KAogICAgICAgICAgICBkZWNsYXJhdGlvbi5tZXNzYWdlLm1lc3NhZ2VPYmplY3QsIG9mZnNldCwgdG9rZW4ubGVuZ3RoKTsKICAgICAgICBzdXBlci5leHByZXNzaW9uID0gX2hlbHBlci53cmFwU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICAgICAgX2ZvcmVzdC50aHJvd0V4cHJlc3Npb24oCiAgICAgICAgICAgICAgICBudWxsLCBfZm9yZXN0LmxpdGVyYWxTdHJpbmcoZGVjbGFyYXRpb24ubWVzc2FnZS5tZXNzYWdlLCB0b2tlbikpCiAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgICAgICBvZmZzZXQpOwogICAgICB9IGVsc2UgewogICAgICAgIHN1cGVyLmV4cHJlc3Npb24gPSBfZm9yZXN0LmxpdGVyYWxUeXBlKAogICAgICAgICAgICBfaGVscGVyLmJ1aWxkRGFydFR5cGUoCiAgICAgICAgICAgICAgICBuZXcgVW5yZXNvbHZlZFR5cGUoCiAgICAgICAgICAgICAgICAgICAgYnVpbGRUeXBlV2l0aFJlc29sdmVkQXJndW1lbnRzKG51bGwpLCBvZmZzZXQsIF91cmkpLAogICAgICAgICAgICAgICAgbm9uSW5zdGFuY2VBY2Nlc3NJc0Vycm9yOiB0cnVlKSwKICAgICAgICAgICAgdG9rZW4pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3VwZXIuZXhwcmVzc2lvbjsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VJbnZhbGlkV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgcmV0dXJuIF9oZWxwZXIud3JhcFN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgX2hlbHBlci50aHJvd05vU3VjaE1ldGhvZEVycm9yKAogICAgICAgICAgICBfZm9yZXN0LmxpdGVyYWxOdWxsKHRva2VuKSwKICAgICAgICAgICAgX3BsYWluTmFtZUZvclJlYWQsCiAgICAgICAgICAgIF9mb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPlt2YWx1ZV0sIG51bGwpCiAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gdmFsdWUuZmlsZU9mZnNldCwKICAgICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLAogICAgICAgICAgICBpc1NldHRlcjogdHJ1ZSksCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pKTsKICB9CgogIEBvdmVycmlkZQogIGJ1aWxkUHJvcGVydHlBY2Nlc3MoCiAgICAgIEluY29tcGxldGVTZW5kR2VuZXJhdG9yIHNlbmQsIGludCBvcGVyYXRvck9mZnNldCwgYm9vbCBpc051bGxBd2FyZSkgewogICAgLy8gYFNvbWVUeXBlPy50b1N0cmluZ2AgaXMgdGhlIHNhbWUgYXMgYFNvbWVUeXBlLnRvU3RyaW5nYCwgbm90CiAgICAvLyBgKFNvbWVUeXBlKS50b1N0cmluZ2AuCiAgICBpc051bGxBd2FyZSA9IGZhbHNlOwoKICAgIE5hbWUgbmFtZSA9IHNlbmQubmFtZTsKICAgIEFyZ3VtZW50cyBhcmd1bWVudHMgPSBzZW5kLmFyZ3VtZW50czsKCiAgICBpZiAoZGVjbGFyYXRpb24gaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgIENsYXNzQnVpbGRlciBkZWNsYXJhdGlvbiA9IHRoaXMuZGVjbGFyYXRpb247CiAgICAgIERlY2xhcmF0aW9uIG1lbWJlciA9IGRlY2xhcmF0aW9uLmZpbmRTdGF0aWNCdWlsZGVyKAogICAgICAgICAgbmFtZS5uYW1lLCBvZmZzZXRGb3JUb2tlbihzZW5kLnRva2VuKSwgX3VyaSwgX2hlbHBlci5saWJyYXJ5KTsKCiAgICAgIEdlbmVyYXRvciBnZW5lcmF0b3I7CiAgICAgIGlmIChtZW1iZXIgPT0gbnVsbCkgewogICAgICAgIC8vIElmIHdlIGZpbmQgYSBzZXR0ZXIsIFttZW1iZXJdIGlzIGFuIFtBY2Nlc3NFcnJvckJ1aWxkZXJdLCBub3QgbnVsbC4KICAgICAgICBpZiAoc2VuZCBpcyBJbmNvbXBsZXRlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IpIHsKICAgICAgICAgIGdlbmVyYXRvciA9IG5ldyBVbnJlc29sdmVkTmFtZUdlbmVyYXRvcihfaGVscGVyLCBzZW5kLnRva2VuLCBuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgICAgICAgICAgZGVjbGFyYXRpb24sCiAgICAgICAgICAgICAgc2VuZC50b2tlbiwKICAgICAgICAgICAgICBzZW5kLnRva2VuLAogICAgICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgICAgICBuYW1lLm5hbWUsCiAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgIENvbnN0bmVzcy5pbXBsaWNpdCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG1lbWJlciBpcyBBbWJpZ3VvdXNCdWlsZGVyKSB7CiAgICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICBtZW1iZXIubWVzc2FnZSwgbWVtYmVyLmNoYXJPZmZzZXQsIG5hbWUubmFtZS5sZW5ndGgpOwogICAgICB9IGVsc2UgewogICAgICAgIERlY2xhcmF0aW9uIHNldHRlcjsKICAgICAgICBpZiAobWVtYmVyLmlzU2V0dGVyKSB7CiAgICAgICAgICBzZXR0ZXIgPSBtZW1iZXI7CiAgICAgICAgfSBlbHNlIGlmIChtZW1iZXIuaXNHZXR0ZXIpIHsKICAgICAgICAgIHNldHRlciA9IGRlY2xhcmF0aW9uLmZpbmRTdGF0aWNCdWlsZGVyKAogICAgICAgICAgICAgIG5hbWUubmFtZSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBfdXJpLCBfaGVscGVyLmxpYnJhcnksCiAgICAgICAgICAgICAgaXNTZXR0ZXI6IHRydWUpOwogICAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzRmllbGQpIHsKICAgICAgICAgIGlmIChtZW1iZXIuaXNGaW5hbCB8fCBtZW1iZXIuaXNDb25zdCkgewogICAgICAgICAgICBzZXR0ZXIgPSBkZWNsYXJhdGlvbi5maW5kU3RhdGljQnVpbGRlcigKICAgICAgICAgICAgICAgIG5hbWUubmFtZSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBfdXJpLCBfaGVscGVyLmxpYnJhcnksCiAgICAgICAgICAgICAgICBpc1NldHRlcjogdHJ1ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXR0ZXIgPSBtZW1iZXI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdlbmVyYXRvciA9IG5ldyBTdGF0aWNBY2Nlc3NHZW5lcmF0b3IuZnJvbUJ1aWxkZXIoCiAgICAgICAgICAgIF9oZWxwZXIsIG1lbWJlciwgc2VuZC50b2tlbiwgc2V0dGVyKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGFyZ3VtZW50cyA9PSBudWxsCiAgICAgICAgICA/IGdlbmVyYXRvcgogICAgICAgICAgOiBnZW5lcmF0b3IuZG9JbnZvY2F0aW9uKG9mZnNldEZvclRva2VuKHNlbmQudG9rZW4pLCBhcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHN1cGVyLmJ1aWxkUHJvcGVydHlBY2Nlc3Moc2VuZCwgb3BlcmF0b3JPZmZzZXQsIGlzTnVsbEF3YXJlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBfaGVscGVyLmJ1aWxkQ29uc3RydWN0b3JJbnZvY2F0aW9uKGRlY2xhcmF0aW9uLCB0b2tlbiwgdG9rZW4sCiAgICAgICAgYXJndW1lbnRzLCAiIiwgbnVsbCwgdG9rZW4uY2hhck9mZnNldCwgQ29uc3RuZXNzLmltcGxpY2l0KTsKICB9Cn0KCi8vLyBbUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3JdIHJlcHJlc2VudHMgdGhlIHN1YmV4cHJlc3Npb24gd2hvc2UgcHJlZml4IGlzIHRoZQovLy8gbmFtZSBvZiBmaW5hbCBsb2NhbCB2YXJpYWJsZSwgZmluYWwgcGFyYW1ldGVyLCBvciBjYXRjaCBjbGF1c2UgdmFyaWFibGUgb3IKLy8vIGB0aGlzYCBpbiBhbiBpbnN0YW5jZSBtZXRob2QgaW4gYW4gZXh0ZW5zaW9uIGRlY2xhcmF0aW9uLgovLy8KLy8vIEZvciBpbnN0YW5jZToKLy8vCi8vLyAgIG1ldGhvZChmaW5hbCBhKSB7Ci8vLyAgICAgZmluYWwgYiA9IG51bGw7Ci8vLyAgICAgYTsgICAgICAgICAvLyBhIFJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBhYC4KLy8vICAgICBhW107ICAgICAgIC8vIGEgUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYGFgLgovLy8gICAgIGIoKTsgICAgICAgLy8gYSBSZWFkT25seUFjY2Vzc0dlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgYmAuCi8vLyAgICAgYi5jID0gYS5kOyAvLyBhIFJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBhYCBhbmQgYGJgLgovLy8KLy8vICAgICB0cnkgewovLy8gICAgIH0gY2F0Y2ggKGEpIHsKLy8vICAgICAgIGE7ICAgICAgIC8vIGEgUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYGFgLgovLy8gICAgIH0KLy8vICAgfQovLy8KLy8vICAgZXh0ZW5zaW9uIG9uIEZvbyB7Ci8vLyAgICAgbWV0aG9kKCkgewovLy8gICAgICAgdGhpczsgICAgICAgICAvLyBhIFJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGB0aGlzYC4KLy8vICAgICAgIHRoaXMuYTsgICAgICAgLy8gYSBSZWFkT25seUFjY2Vzc0dlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgdGhpc2AuCi8vLyAgICAgICB0aGlzLmIoKTsgICAgIC8vIGEgUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYHRoaXNgLgovLy8gICAgIH0KLy8vICAgfQovLy8KY2xhc3MgUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBfcGxhaW5OYW1lRm9yUmVhZDsKCiAgRXhwcmVzc2lvbiBleHByZXNzaW9uOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhbHVlOwoKICBSZWFkT25seUFjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMuZXhwcmVzc2lvbiwgdGhpcy5fcGxhaW5OYW1lRm9yUmVhZCkKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lID0+ICJSZWFkT25seUFjY2Vzc0dlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VTaW1wbGVSZWFkKCkgPT4gZXhwcmVzc2lvbjsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZVJlYWQoQ29tcGxleEFzc2lnbm1lbnRKdWRnbWVudCBjb21wbGV4QXNzaWdubWVudCkgewogICAgdmFsdWUgPz89IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKGV4cHJlc3Npb24pOwogICAgcmV0dXJuIG5ldyBWYXJpYWJsZUdldCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9maW5pc2goCiAgICAgICAgICBFeHByZXNzaW9uIGJvZHksIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgY29tcGxleEFzc2lnbm1lbnQpID0+CiAgICAgIHN1cGVyLl9maW5pc2gobWFrZUxldCh2YWx1ZSwgYm9keSksIGNvbXBsZXhBc3NpZ25tZW50KTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRNZXRob2RJbnZvY2F0aW9uKGJ1aWxkU2ltcGxlUmVhZCgpLCBjYWxsTmFtZSwgYXJndW1lbnRzLAogICAgICAgIGFkanVzdEZvckltcGxpY2l0Q2FsbChfcGxhaW5OYW1lRm9yUmVhZCwgb2Zmc2V0KSwKICAgICAgICBpc0ltcGxpY2l0Q2FsbDogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzID0gbmV3IE5hbWVTeXN0ZW0oKTsKICAgIHNpbmsud3JpdGUoIiwgZXhwcmVzc2lvbjogIik7CiAgICBwcmludE5vZGVPbihleHByZXNzaW9uLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCBwbGFpbk5hbWVGb3JSZWFkOiAiKTsKICAgIHNpbmsud3JpdGUoX3BsYWluTmFtZUZvclJlYWQpOwogICAgc2luay53cml0ZSgiLCB2YWx1ZTogIik7CiAgICBwcmludE5vZGVPbih2YWx1ZSwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEVycm9uZW91c0V4cHJlc3Npb25HZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogIEVycm9uZW91c0V4cHJlc3Npb25HZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICAvLy8gUGFzcyBbYXJndW1lbnRzXSB0aGF0IG11c3QgYmUgZXZhbHVhdGVkIGJlZm9yZSB0aHJvd2luZyBhbiBlcnJvci4gIEF0CiAgLy8vIG1vc3Qgb25lIG9mIFtpc0dldHRlcl0gYW5kIFtpc1NldHRlcl0gc2hvdWxkIGJlIHRydWUgYW5kIHRoZXkncmUgcGFzc2VkCiAgLy8vIHRvIFtFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyLnRocm93Tm9TdWNoTWV0aG9kRXJyb3JdIGlmIGl0IGlzIHVzZWQuCiAgRXhwcmVzc2lvbiBidWlsZEVycm9yKEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIHtib29sIGlzR2V0dGVyOiBmYWxzZSwgYm9vbCBpc1NldHRlcjogZmFsc2UsIGludCBvZmZzZXR9KTsKCiAgTmFtZSBnZXQgbmFtZSA9PiB1bnN1cHBvcnRlZCgibmFtZSIsIG9mZnNldEZvclRva2VuKHRva2VuKSwgX3VyaSk7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgPT4gbmFtZS5uYW1lOwoKICB3aXRoUmVjZWl2ZXIoT2JqZWN0IHJlY2VpdmVyLCBpbnQgb3BlcmF0b3JPZmZzZXQsIHtib29sIGlzTnVsbEF3YXJlfSkgPT4gdGhpczsKCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXIgYnVpbGRGaWVsZEluaXRpYWxpemVyKE1hcDxTdHJpbmcsIGludD4gaW5pdGlhbGl6ZWRGaWVsZHMpIHsKICAgIHJldHVybiBfaGVscGVyLmJ1aWxkSW52YWxpZEluaXRpYWxpemVyKF9oZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgYnVpbGRFcnJvcihfZm9yZXN0LmFyZ3VtZW50c0VtcHR5KHRva2VuKSwgaXNTZXR0ZXI6IHRydWUpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIGJ1aWxkRXJyb3IoYXJndW1lbnRzLCBvZmZzZXQ6IG9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBidWlsZFByb3BlcnR5QWNjZXNzKAogICAgICBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvciBzZW5kLCBpbnQgb3BlcmF0b3JPZmZzZXQsIGJvb2wgaXNOdWxsQXdhcmUpIHsKICAgIHJldHVybiBzZW5kLndpdGhSZWNlaXZlcihidWlsZFNpbXBsZVJlYWQoKSwgb3BlcmF0b3JPZmZzZXQsCiAgICAgICAgaXNOdWxsQXdhcmU6IGlzTnVsbEF3YXJlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZEVycm9yKF9mb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPlt2YWx1ZV0sIHRva2VuKSwKICAgICAgICBpc1NldHRlcjogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtpbnQgb2Zmc2V0OiAtMSwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXQsCiAgICAgIGJvb2wgaXNQcmVJbmNEZWM6IGZhbHNlLAogICAgICBib29sIGlzUG9zdEluY0RlYzogZmFsc2V9KSB7CiAgICByZXR1cm4gYnVpbGRFcnJvcihfZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bdmFsdWVdLCB0b2tlbiksCiAgICAgICAgaXNHZXR0ZXI6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFByZWZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldDogLTEsIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLCBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0fSkgewogICAgcmV0dXJuIGJ1aWxkRXJyb3IoCiAgICAgICAgX2ZvcmVzdC5hcmd1bWVudHMoCiAgICAgICAgICAgIDxFeHByZXNzaW9uPltfZm9yZXN0LmxpdGVyYWxJbnQoMSwgbnVsbCkuLmZpbGVPZmZzZXQgPSBvZmZzZXRdLAogICAgICAgICAgICB0b2tlbiksCiAgICAgICAgaXNHZXR0ZXI6IHRydWUpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiAtMSwgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KSB7CiAgICByZXR1cm4gYnVpbGRFcnJvcigKICAgICAgICBfZm9yZXN0LmFyZ3VtZW50cygKICAgICAgICAgICAgPEV4cHJlc3Npb24+W19mb3Jlc3QubGl0ZXJhbEludCgxLCBudWxsKS4uZmlsZU9mZnNldCA9IG9mZnNldF0sCiAgICAgICAgICAgIHRva2VuKSwKICAgICAgICBpc0dldHRlcjogdHJ1ZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZE51bGxBd2FyZUFzc2lnbm1lbnQoCiAgICAgIEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZEVycm9yKF9mb3Jlc3QuYXJndW1lbnRzKDxFeHByZXNzaW9uPlt2YWx1ZV0sIHRva2VuKSwKICAgICAgICBpc1NldHRlcjogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiBidWlsZEVycm9yKF9mb3Jlc3QuYXJndW1lbnRzRW1wdHkodG9rZW4pLCBpc0dldHRlcjogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlSW52YWxpZFJlYWQoKSB7CiAgICByZXR1cm4gYnVpbGRFcnJvcihfZm9yZXN0LmFyZ3VtZW50c0VtcHR5KHRva2VuKSwgaXNHZXR0ZXI6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZUludmFsaWRXcml0ZShFeHByZXNzaW9uIHZhbHVlKSB7CiAgICByZXR1cm4gYnVpbGRFcnJvcihfZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bdmFsdWVdLCB0b2tlbiksCiAgICAgICAgaXNTZXR0ZXI6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBpbnZva2VDb25zdHJ1Y3RvcigKICAgICAgTGlzdDxVbnJlc29sdmVkVHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIFRva2VuIG5hbWVUb2tlbiwKICAgICAgVG9rZW4gbmFtZUxhc3RUb2tlbiwKICAgICAgQ29uc3RuZXNzIGNvbnN0bmVzcykgewogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhc3NlcnQoX2ZvcmVzdC5hcmd1bWVudHNUeXBlQXJndW1lbnRzKGFyZ3VtZW50cykuaXNFbXB0eSk7CiAgICAgIF9mb3Jlc3QuYXJndW1lbnRzU2V0VHlwZUFyZ3VtZW50cygKICAgICAgICAgIGFyZ3VtZW50cywgX2hlbHBlci5idWlsZERhcnRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpKTsKICAgIH0KICAgIHJldHVybiBfaGVscGVyLndyYXBJbnZhbGlkQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgIF9oZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oYnVpbGRFcnJvcihhcmd1bWVudHMpKSwKICAgICAgICBudWxsLAogICAgICAgIGFyZ3VtZW50cywKICAgICAgICBvZmZzZXRGb3JUb2tlbih0b2tlbikpOwogIH0KfQoKY2xhc3MgVW5yZXNvbHZlZE5hbWVHZW5lcmF0b3IgZXh0ZW5kcyBFcnJvbmVvdXNFeHByZXNzaW9uR2VuZXJhdG9yIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBOYW1lIG5hbWU7CgogIGZhY3RvcnkgVW5yZXNvbHZlZE5hbWVHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwgTmFtZSBuYW1lKSB7CiAgICBpZiAobmFtZS5uYW1lLmlzRW1wdHkpIHsKICAgICAgdW5oYW5kbGVkKCJlbXB0eSIsICJuYW1lIiwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBoZWxwZXIudXJpKTsKICAgIH0KICAgIHJldHVybiBuZXcgVW5yZXNvbHZlZE5hbWVHZW5lcmF0b3IuaW50ZXJuYWwoaGVscGVyLCB0b2tlbiwgbmFtZSk7CiAgfQoKICBVbnJlc29sdmVkTmFtZUdlbmVyYXRvci5pbnRlcm5hbCgKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCB0aGlzLm5hbWUpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiVW5yZXNvbHZlZE5hbWVHZW5lcmF0b3IiOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgY2hhck9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIF9oZWxwZXIud3JhcFVucmVzb2x2ZWRUYXJnZXRJbnZvY2F0aW9uKAogICAgICAgIF9oZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgICAgIGJ1aWxkRXJyb3IoYXJndW1lbnRzLCBvZmZzZXQ6IGNoYXJPZmZzZXQpKSwKICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgYXJndW1lbnRzLmZpbGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZEVycm9yKEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIHtib29sIGlzR2V0dGVyOiBmYWxzZSwgYm9vbCBpc1NldHRlcjogZmFsc2UsIGludCBvZmZzZXR9KSB7CiAgICBvZmZzZXQgPz89IG9mZnNldEZvclRva2VuKHRoaXMudG9rZW4pOwogICAgcmV0dXJuIF9oZWxwZXIud3JhcFN5bnRoZXRpY0V4cHJlc3Npb24oCiAgICAgICAgX2hlbHBlci50aHJvd05vU3VjaE1ldGhvZEVycm9yKAogICAgICAgICAgICBfZm9yZXN0LmxpdGVyYWxOdWxsKG51bGwpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgICAgICBfcGxhaW5OYW1lRm9yUmVhZCwKICAgICAgICAgICAgYXJndW1lbnRzLAogICAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICAgIGlzR2V0dGVyOiBpc0dldHRlciwKICAgICAgICAgICAgaXNTZXR0ZXI6IGlzU2V0dGVyKSwKICAgICAgICBvZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgLyogRXhwcmVzc2lvbiB8IEdlbmVyYXRvciAqLyBPYmplY3QgcXVhbGlmaWVkTG9va3VwKFRva2VuIG5hbWUpIHsKICAgIHJldHVybiBuZXcgVW5leHBlY3RlZFF1YWxpZmllZFVzZUdlbmVyYXRvcihfaGVscGVyLCBuYW1lLCB0aGlzLCB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBfYnVpbGRVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50KGZhbHNlLCB2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXQsCiAgICAgIGJvb2wgaXNQcmVJbmNEZWM6IGZhbHNlLAogICAgICBib29sIGlzUG9zdEluY0RlYzogZmFsc2V9KSB7CiAgICByZXR1cm4gX2J1aWxkVW5yZXNvbHZlZFZhcmlhYmxlQXNzaWdubWVudCh0cnVlLCB2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiBidWlsZEVycm9yKF9mb3Jlc3QuYXJndW1lbnRzRW1wdHkodG9rZW4pLCBpc0dldHRlcjogdHJ1ZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gdG9rZW4uY2hhck9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGUoIiwgbmFtZTogIik7CiAgICBzaW5rLndyaXRlKG5hbWUubmFtZSk7CiAgfQoKICBFeHByZXNzaW9uIF9idWlsZFVucmVzb2x2ZWRWYXJpYWJsZUFzc2lnbm1lbnQoCiAgICAgIGJvb2wgaXNDb21wb3VuZCwgRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgcmV0dXJuIF9oZWxwZXIud3JhcFVucmVzb2x2ZWRWYXJpYWJsZUFzc2lnbm1lbnQoCiAgICAgICAgX2hlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihidWlsZEVycm9yKAogICAgICAgICAgICBfZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bdmFsdWVdLCB0b2tlbiksCiAgICAgICAgICAgIGlzU2V0dGVyOiB0cnVlKSksCiAgICAgICAgaXNDb21wb3VuZCwKICAgICAgICB2YWx1ZSwKICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0KTsKICB9Cn0KCmNsYXNzIFVubGlua2VkR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKICBmaW5hbCBVbmxpbmtlZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uOwoKICBmaW5hbCBFeHByZXNzaW9uIHJlY2VpdmVyOwoKICBmaW5hbCBOYW1lIG5hbWU7CgogIFVubGlua2VkR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIHRoaXMuZGVjbGFyYXRpb24pCiAgICAgIDogbmFtZSA9IG5ldyBOYW1lKGRlY2xhcmF0aW9uLm5hbWUsIGhlbHBlci5saWJyYXJ5LnRhcmdldCksCiAgICAgICAgcmVjZWl2ZXIgPSBuZXcgSW52YWxpZEV4cHJlc3Npb24oZGVjbGFyYXRpb24ubmFtZSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfcGxhaW5OYW1lRm9yUmVhZCA9PiBkZWNsYXJhdGlvbi5uYW1lOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlVubGlua2VkR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBuYW1lOiAiKTsKICAgIHNpbmsud3JpdGUoZGVjbGFyYXRpb24ubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gbmV3IFByb3BlcnR5U2V0KHJlY2VpdmVyLCBuYW1lLCB2YWx1ZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFNpbXBsZVJlYWQoKSB7CiAgICByZXR1cm4gbmV3IFByb3BlcnR5R2V0KHJlY2VpdmVyLCBuYW1lKS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiZG9JbnZvY2F0aW9uIiwgb2Zmc2V0LCBfdXJpKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIENvbnRleHRBd2FyZUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgZmluYWwgR2VuZXJhdG9yIGdlbmVyYXRvcjsKCiAgQ29udGV4dEF3YXJlR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIHRoaXMuZ2VuZXJhdG9yKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgicGxhaW5OYW1lRm9yUmVhZCIsIHRva2VuLmNoYXJPZmZzZXQsIF9oZWxwZXIudXJpKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBjaGFyT2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gdW5oYW5kbGVkKCIke3J1bnRpbWVUeXBlfSIsICJkb0ludm9jYXRpb24iLCBjaGFyT2Zmc2V0LCBfdXJpKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBfbWFrZUludmFsaWRXcml0ZSh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkTnVsbEF3YXJlQXNzaWdubWVudCgKICAgICAgRXhwcmVzc2lvbiB2YWx1ZSwgRGFydFR5cGUgdHlwZSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIF9tYWtlSW52YWxpZFdyaXRlKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IC0xLAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldCwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pIHsKICAgIHJldHVybiBfbWFrZUludmFsaWRXcml0ZSh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkUHJlZml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiAtMSwgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KSB7CiAgICByZXR1cm4gX21ha2VJbnZhbGlkV3JpdGUobnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkUG9zdGZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldDogLTEsIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLCBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0fSkgewogICAgcmV0dXJuIF9tYWtlSW52YWxpZFdyaXRlKG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgX21ha2VJbnZhbGlkUmVhZCgpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgibWFrZUludmFsaWRSZWFkIiwgdG9rZW4uY2hhck9mZnNldCwgX2hlbHBlci51cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZUludmFsaWRXcml0ZShFeHByZXNzaW9uIHZhbHVlKSB7CiAgICByZXR1cm4gX2hlbHBlci5idWlsZFByb2JsZW0obWVzc2FnZUlsbGVnYWxBc3NpZ25tZW50VG9Ob25Bc3NpZ25hYmxlLAogICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKTsKICB9Cn0KCmNsYXNzIERlbGF5ZWRBc3NpZ25tZW50IGV4dGVuZHMgQ29udGV4dEF3YXJlR2VuZXJhdG9yIHsKICBmaW5hbCBFeHByZXNzaW9uIHZhbHVlOwoKICBTdHJpbmcgYXNzaWdubWVudE9wZXJhdG9yOwoKICBEZWxheWVkQXNzaWdubWVudChFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIEdlbmVyYXRvciBnZW5lcmF0b3IsIHRoaXMudmFsdWUsIHRoaXMuYXNzaWdubWVudE9wZXJhdG9yKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4sIGdlbmVyYXRvcik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiRGVsYXllZEFzc2lnbm1lbnQiOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiBoYW5kbGVBc3NpZ25tZW50KGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRGb3JFZmZlY3QoKSB7CiAgICByZXR1cm4gaGFuZGxlQXNzaWdubWVudCh0cnVlKTsKICB9CgogIEV4cHJlc3Npb24gaGFuZGxlQXNzaWdubWVudChib29sIHZvaWRDb250ZXh0KSB7CiAgICBpZiAoX2hlbHBlci5jb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUpIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgbWVzc2FnZU5vdEFDb25zdGFudEV4cHJlc3Npb24sIG9mZnNldEZvclRva2VuKHRva2VuKSwgdG9rZW4ubGVuZ3RoKTsKICAgIH0KICAgIGlmIChpZGVudGljYWwoIj0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRBc3NpZ25tZW50KHZhbHVlLCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoIis9IiwgYXNzaWdubWVudE9wZXJhdG9yKSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KHBsdXNOYW1lLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoIi09IiwgYXNzaWdubWVudE9wZXJhdG9yKSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KG1pbnVzTmFtZSwgdmFsdWUsCiAgICAgICAgICBvZmZzZXQ6IG9mZnNldEZvclRva2VuKHRva2VuKSwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCIqPSIsIGFzc2lnbm1lbnRPcGVyYXRvcikpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZENvbXBvdW5kQXNzaWdubWVudChtdWx0aXBseU5hbWUsIHZhbHVlLAogICAgICAgICAgb2Zmc2V0OiBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgiJT0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQocGVyY2VudE5hbWUsIHZhbHVlLAogICAgICAgICAgb2Zmc2V0OiBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgiJj0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoYW1wZXJzYW5kTmFtZSwgdmFsdWUsCiAgICAgICAgICBvZmZzZXQ6IG9mZnNldEZvclRva2VuKHRva2VuKSwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCIvPSIsIGFzc2lnbm1lbnRPcGVyYXRvcikpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZENvbXBvdW5kQXNzaWdubWVudChkaXZpc2lvbk5hbWUsIHZhbHVlLAogICAgICAgICAgb2Zmc2V0OiBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgiPDw9IiwgYXNzaWdubWVudE9wZXJhdG9yKSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KGxlZnRTaGlmdE5hbWUsIHZhbHVlLAogICAgICAgICAgb2Zmc2V0OiBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgiPj49IiwgYXNzaWdubWVudE9wZXJhdG9yKSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KHJpZ2h0U2hpZnROYW1lLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoIj4+Pj0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQodHJpcGxlU2hpZnROYW1lLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoIj8/PSIsIGFzc2lnbm1lbnRPcGVyYXRvcikpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZE51bGxBd2FyZUFzc2lnbm1lbnQoCiAgICAgICAgICB2YWx1ZSwgY29uc3QgRHluYW1pY1R5cGUoKSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLAogICAgICAgICAgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCJePSIsIGFzc2lnbm1lbnRPcGVyYXRvcikpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZENvbXBvdW5kQXNzaWdubWVudChjYXJldE5hbWUsIHZhbHVlLAogICAgICAgICAgb2Zmc2V0OiBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgifD0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoYmFyTmFtZSwgdmFsdWUsCiAgICAgICAgICBvZmZzZXQ6IG9mZnNldEZvclRva2VuKHRva2VuKSwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCJ+Lz0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQobXVzdGFjaGVOYW1lLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHVuaGFuZGxlZChhc3NpZ25tZW50T3BlcmF0b3IsICJoYW5kbGVBc3NpZ25tZW50IiwgdG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgIF9oZWxwZXIudXJpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyIGJ1aWxkRmllbGRJbml0aWFsaXplcihNYXA8U3RyaW5nLCBpbnQ+IGluaXRpYWxpemVkRmllbGRzKSB7CiAgICBpZiAoIWlkZW50aWNhbCgiPSIsIGFzc2lnbm1lbnRPcGVyYXRvcikgfHwKICAgICAgICBnZW5lcmF0b3IgaXMhIFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcikgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkRmllbGRJbml0aWFsaXplcihpbml0aWFsaXplZEZpZWxkcyk7CiAgICB9CiAgICByZXR1cm4gX2hlbHBlci5idWlsZEZpZWxkSW5pdGlhbGl6ZXIoZmFsc2UsIGdlbmVyYXRvci5fcGxhaW5OYW1lRm9yUmVhZCwKICAgICAgICBvZmZzZXRGb3JUb2tlbihnZW5lcmF0b3IudG9rZW4pLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGUoIiwgdmFsdWU6ICIpOwogICAgcHJpbnROb2RlT24odmFsdWUsIHNpbmspOwogICAgc2luay53cml0ZSgiLCBhc3NpZ25tZW50T3BlcmF0b3I6ICIpOwogICAgc2luay53cml0ZShhc3NpZ25tZW50T3BlcmF0b3IpOwogIH0KfQoKY2xhc3MgRGVsYXllZFBvc3RmaXhJbmNyZW1lbnQgZXh0ZW5kcyBDb250ZXh0QXdhcmVHZW5lcmF0b3IgewogIGZpbmFsIE5hbWUgYmluYXJ5T3BlcmF0b3I7CgogIGZpbmFsIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXQ7CgogIERlbGF5ZWRQb3N0Zml4SW5jcmVtZW50KEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwKICAgICAgR2VuZXJhdG9yIGdlbmVyYXRvciwgdGhpcy5iaW5hcnlPcGVyYXRvciwgdGhpcy5pbnRlcmZhY2VUYXJnZXQpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbiwgZ2VuZXJhdG9yKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lID0+ICJEZWxheWVkUG9zdGZpeEluY3JlbWVudCI7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgewogICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZFBvc3RmaXhJbmNyZW1lbnQoYmluYXJ5T3BlcmF0b3IsCiAgICAgICAgb2Zmc2V0OiBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICAgIGludGVyZmFjZVRhcmdldDogaW50ZXJmYWNlVGFyZ2V0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRGb3JFZmZlY3QoKSB7CiAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkUG9zdGZpeEluY3JlbWVudChiaW5hcnlPcGVyYXRvciwKICAgICAgICBvZmZzZXQ6IG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICB2b2lkQ29udGV4dDogdHJ1ZSwKICAgICAgICBpbnRlcmZhY2VUYXJnZXQ6IGludGVyZmFjZVRhcmdldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlKCIsIGJpbmFyeU9wZXJhdG9yOiAiKTsKICAgIHNpbmsud3JpdGUoYmluYXJ5T3BlcmF0b3IubmFtZSk7CiAgICBzaW5rLndyaXRlKCIsIGludGVyZmFjZVRhcmdldDogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbihpbnRlcmZhY2VUYXJnZXQsIHNpbmspOwogIH0KfQoKY2xhc3MgUHJlZml4VXNlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKICBmaW5hbCBQcmVmaXhCdWlsZGVyIHByZWZpeDsKCiAgUHJlZml4VXNlR2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwgdGhpcy5wcmVmaXgpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgPT4gcHJlZml4Lm5hbWU7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiUHJlZml4VXNlR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFNpbXBsZVJlYWQoKSA9PiBfbWFrZUludmFsaWRSZWFkKCk7CgogIEBvdmVycmlkZQogIC8qIEV4cHJlc3Npb24gfCBHZW5lcmF0b3IgKi8gT2JqZWN0IHF1YWxpZmllZExvb2t1cChUb2tlbiBuYW1lKSB7CiAgICBpZiAoX2hlbHBlci5jb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUgJiYgcHJlZml4LmRlZmVycmVkKSB7CiAgICAgIF9oZWxwZXIuYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlQ2FudFVzZURlZmVycmVkUHJlZml4QXNDb25zdGFudC53aXRoQXJndW1lbnRzKHRva2VuKSwKICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICAgIGxlbmd0aEZvclRva2VuKHRva2VuKSk7CiAgICB9CiAgICBPYmplY3QgcmVzdWx0ID0gX2hlbHBlci5zY29wZUxvb2t1cChwcmVmaXguZXhwb3J0U2NvcGUsIG5hbWUubGV4ZW1lLCBuYW1lLAogICAgICAgIGlzUXVhbGlmaWVkOiB0cnVlLCBwcmVmaXg6IHByZWZpeCk7CiAgICBpZiAocHJlZml4LmRlZmVycmVkKSB7CiAgICAgIGlmIChyZXN1bHQgaXMgR2VuZXJhdG9yKSB7CiAgICAgICAgaWYgKHJlc3VsdCBpcyEgTG9hZExpYnJhcnlHZW5lcmF0b3IpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBEZWZlcnJlZEFjY2Vzc0dlbmVyYXRvcihfaGVscGVyLCBuYW1lLCB0aGlzLCByZXN1bHQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBfaGVscGVyLndyYXBJbkRlZmVycmVkQ2hlY2socmVzdWx0LCBwcmVmaXgsIG9mZnNldEZvclRva2VuKHRva2VuKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICAvKiBFeHByZXNzaW9uIHwgR2VuZXJhdG9yIHwgSW5pdGlhbGl6ZXIgKi8gZG9JbnZvY2F0aW9uKAogICAgICBpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gX2hlbHBlci53cmFwSW5Mb2NhdGVkUHJvYmxlbSgKICAgICAgICBfaGVscGVyLmV2YWx1YXRlQXJndW1lbnRzQmVmb3JlKGFyZ3VtZW50cywgX2ZvcmVzdC5saXRlcmFsTnVsbCh0b2tlbikpLAogICAgICAgIG1lc3NhZ2VDYW50VXNlUHJlZml4QXNFeHByZXNzaW9uLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgX2hlbHBlci51cmksIG9mZnNldEZvclRva2VuKHRva2VuKSwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKSk7CiAgfQoKICBAb3ZlcnJpZGUKICAvKiBFeHByZXNzaW9uIHwgR2VuZXJhdG9yICovIGJ1aWxkUHJvcGVydHlBY2Nlc3MoCiAgICAgIEluY29tcGxldGVTZW5kR2VuZXJhdG9yIHNlbmQsIGludCBvcGVyYXRvck9mZnNldCwgYm9vbCBpc051bGxBd2FyZSkgewogICAgaWYgKHNlbmQgaXMgSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3IpIHsKICAgICAgYXNzZXJ0KHNlbmQubmFtZS5uYW1lID09IHNlbmQudG9rZW4ubGV4ZW1lLAogICAgICAgICAgIicke3NlbmQubmFtZS5uYW1lfScgIT0gJHtzZW5kLnRva2VuLmxleGVtZX0iKTsKICAgICAgT2JqZWN0IHJlc3VsdCA9IHF1YWxpZmllZExvb2t1cChzZW5kLnRva2VuKTsKICAgICAgaWYgKHNlbmQgaXMgU2VuZEFjY2Vzc0dlbmVyYXRvcikgewogICAgICAgIHJlc3VsdCA9IF9oZWxwZXIuZmluaXNoU2VuZCgKICAgICAgICAgICAgcmVzdWx0LAogICAgICAgICAgICBzZW5kLmFyZ3VtZW50cyBhcyBkeW5hbWljIC8qIFRPRE8oYWhlKTogUmVtb3ZlIHRoaXMgY2FzdC4gKi8sCiAgICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSk7CiAgICAgIH0KICAgICAgaWYgKGlzTnVsbEF3YXJlKSB7CiAgICAgICAgcmVzdWx0ID0gX2hlbHBlci53cmFwSW5Mb2NhdGVkUHJvYmxlbSgKICAgICAgICAgICAgX2hlbHBlci50b1ZhbHVlKHJlc3VsdCksCiAgICAgICAgICAgIG1lc3NhZ2VDYW50VXNlUHJlZml4V2l0aE51bGxBd2FyZS53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICBfaGVscGVyLnVyaSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBsZW5ndGhGb3JUb2tlbih0b2tlbikpKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGJ1aWxkU2ltcGxlUmVhZCgpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZUludmFsaWRSZWFkKCkgewogICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRQcm9ibGVtKG1lc3NhZ2VDYW50VXNlUHJlZml4QXNFeHByZXNzaW9uLAogICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VJbnZhbGlkV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSkgPT4gX21ha2VJbnZhbGlkUmVhZCgpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlKCIsIHByZWZpeDogIik7CiAgICBzaW5rLndyaXRlKHByZWZpeC5uYW1lKTsKICAgIHNpbmsud3JpdGUoIiwgZGVmZXJyZWQ6ICIpOwogICAgc2luay53cml0ZShwcmVmaXguZGVmZXJyZWQpOwogIH0KfQoKY2xhc3MgVW5leHBlY3RlZFF1YWxpZmllZFVzZUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgZmluYWwgR2VuZXJhdG9yIHByZWZpeEdlbmVyYXRvcjsKCiAgZmluYWwgYm9vbCBpc1VucmVzb2x2ZWQ7CgogIFVuZXhwZWN0ZWRRdWFsaWZpZWRVc2VHZW5lcmF0b3IoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLAogICAgICB0aGlzLnByZWZpeEdlbmVyYXRvciwgdGhpcy5pc1VucmVzb2x2ZWQpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgewogICAgcmV0dXJuICIke3ByZWZpeEdlbmVyYXRvci5fcGxhaW5OYW1lRm9yUmVhZH0uJHt0b2tlbi5sZXhlbWV9IjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiVW5leHBlY3RlZFF1YWxpZmllZFVzZUdlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgPT4gX21ha2VJbnZhbGlkUmVhZCgpOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gX2hlbHBlci53cmFwU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICBfaGVscGVyLnRocm93Tm9TdWNoTWV0aG9kRXJyb3IoCiAgICAgICAgICAgIF9mb3Jlc3QubGl0ZXJhbE51bGwobnVsbCkuLmZpbGVPZmZzZXQgPSBvZmZzZXQsCiAgICAgICAgICAgIF9wbGFpbk5hbWVGb3JSZWFkLAogICAgICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSksCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVCdWlsZGVyIGJ1aWxkVHlwZVdpdGhSZXNvbHZlZEFyZ3VtZW50cyhMaXN0PFVucmVzb2x2ZWRUeXBlPiBhcmd1bWVudHMpIHsKICAgIFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nLCBTdHJpbmcpPiB0ZW1wbGF0ZSA9IGlzVW5yZXNvbHZlZAogICAgICAgID8gdGVtcGxhdGVVbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvbgogICAgICAgIDogdGVtcGxhdGVOb3RBUHJlZml4SW5UeXBlQW5ub3RhdGlvbjsKICAgIE5hbWVkVHlwZUJ1aWxkZXIgcmVzdWx0ID0gbmV3IE5hbWVkVHlwZUJ1aWxkZXIoX3BsYWluTmFtZUZvclJlYWQsIG51bGwpOwogICAgTWVzc2FnZSBtZXNzYWdlID0KICAgICAgICB0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKHByZWZpeEdlbmVyYXRvci50b2tlbi5sZXhlbWUsIHRva2VuLmxleGVtZSk7CiAgICBfaGVscGVyLmxpYnJhcnkuYWRkUHJvYmxlbShtZXNzYWdlLCBvZmZzZXRGb3JUb2tlbihwcmVmaXhHZW5lcmF0b3IudG9rZW4pLAogICAgICAgIGxlbmd0aE9mU3BhbihwcmVmaXhHZW5lcmF0b3IudG9rZW4sIHRva2VuKSwgX3VyaSk7CiAgICByZXN1bHQuYmluZChyZXN1bHQuYnVpbGRJbnZhbGlkVHlwZShtZXNzYWdlLndpdGhMb2NhdGlvbigKICAgICAgICBfdXJpLAogICAgICAgIG9mZnNldEZvclRva2VuKHByZWZpeEdlbmVyYXRvci50b2tlbiksCiAgICAgICAgbGVuZ3RoT2ZTcGFuKHByZWZpeEdlbmVyYXRvci50b2tlbiwgdG9rZW4pKSkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGUoIiwgcHJlZml4R2VuZXJhdG9yOiAiKTsKICAgIHByZWZpeEdlbmVyYXRvci5wcmludE9uKHNpbmspOwogIH0KfQoKY2xhc3MgUGFyc2VyRXJyb3JHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZTsKCiAgUGFyc2VyRXJyb3JHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwgdGhpcy5tZXNzYWdlKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+ICIjcGFyc2VyLWVycm9yIjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lID0+ICJQYXJzZXJFcnJvckdlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHt9CgogIEV4cHJlc3Npb24gYnVpbGRQcm9ibGVtKCkgewogICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRQcm9ibGVtKG1lc3NhZ2UsIG9mZnNldEZvclRva2VuKHRva2VuKSwgbm9MZW5ndGgsCiAgICAgICAgc3VwcHJlc3NNZXNzYWdlOiB0cnVlKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgPT4gYnVpbGRQcm9ibGVtKCk7CgogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZFByb2JsZW0oKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGROdWxsQXdhcmVBc3NpZ25tZW50KAogICAgICBFeHByZXNzaW9uIHZhbHVlLCBEYXJ0VHlwZSB0eXBlLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gYnVpbGRQcm9ibGVtKCk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXQsCiAgICAgIGJvb2wgaXNQcmVJbmNEZWM6IGZhbHNlLAogICAgICBib29sIGlzUG9zdEluY0RlYzogZmFsc2V9KSB7CiAgICByZXR1cm4gYnVpbGRQcm9ibGVtKCk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkUHJlZml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KSB7CiAgICByZXR1cm4gYnVpbGRQcm9ibGVtKCk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkUG9zdGZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0fSkgewogICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgpOwogIH0KCiAgRXhwcmVzc2lvbiBfbWFrZUludmFsaWRSZWFkKCkgPT4gYnVpbGRQcm9ibGVtKCk7CgogIEV4cHJlc3Npb24gX21ha2VJbnZhbGlkV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSkgPT4gYnVpbGRQcm9ibGVtKCk7CgogIEluaXRpYWxpemVyIGJ1aWxkRmllbGRJbml0aWFsaXplcihNYXA8U3RyaW5nLCBpbnQ+IGluaXRpYWxpemVkRmllbGRzKSB7CiAgICByZXR1cm4gX2hlbHBlci5idWlsZEludmFsaWRJbml0aWFsaXplcigKICAgICAgICBfaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGJ1aWxkUHJvYmxlbSgpKSk7CiAgfQoKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gYnVpbGRQcm9ibGVtKCk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkUHJvcGVydHlBY2Nlc3MoCiAgICAgIEluY29tcGxldGVTZW5kR2VuZXJhdG9yIHNlbmQsIGludCBvcGVyYXRvck9mZnNldCwgYm9vbCBpc051bGxBd2FyZSkgewogICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgpOwogIH0KCiAgVHlwZUJ1aWxkZXIgYnVpbGRUeXBlV2l0aFJlc29sdmVkQXJndW1lbnRzKExpc3Q8VW5yZXNvbHZlZFR5cGU+IGFyZ3VtZW50cykgewogICAgTmFtZWRUeXBlQnVpbGRlciByZXN1bHQgPSBuZXcgTmFtZWRUeXBlQnVpbGRlcih0b2tlbi5sZXhlbWUsIG51bGwpOwogICAgX2hlbHBlci5saWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBub0xlbmd0aCwgX3VyaSk7CiAgICByZXN1bHQuYmluZChyZXN1bHQuYnVpbGRJbnZhbGlkVHlwZSgKICAgICAgICBtZXNzYWdlLndpdGhMb2NhdGlvbihfdXJpLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksIG5vTGVuZ3RoKSkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEV4cHJlc3Npb24gcXVhbGlmaWVkTG9va3VwKFRva2VuIG5hbWUpIHsKICAgIHJldHVybiBidWlsZFByb2JsZW0oKTsKICB9CgogIEV4cHJlc3Npb24gaW52b2tlQ29uc3RydWN0b3IoCiAgICAgIExpc3Q8VW5yZXNvbHZlZFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBUb2tlbiBuYW1lVG9rZW4sCiAgICAgIFRva2VuIG5hbWVMYXN0VG9rZW4sCiAgICAgIENvbnN0bmVzcyBjb25zdG5lc3MpIHsKICAgIHJldHVybiBidWlsZFByb2JsZW0oKTsKICB9Cn0KCi8vLyBBIFtUaGlzQWNjZXNzR2VuZXJhdG9yXSByZXByZXNlbnRzIGEgc3ViZXhwcmVzc2lvbiB3aG9zZSBwcmVmaXggaXMgYHRoaXNgCi8vLyBvciBgc3VwZXJgLgovLy8KLy8vIEZvciBpbnN0YW5jZQovLy8KLy8vICAgY2xhc3MgQyB7Ci8vLyAgICAgdmFyIGIgPSB0aGlzLmM7IC8vIGEgVGhpc0FjY2Vzc0dlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgdGhpc2AuCi8vLyAgICAgdmFyIGM7Ci8vLyAgICAgQyh0aGlzLmMpIDogICAgIC8vIGEgVGhpc0FjY2Vzc0dlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgdGhpc2AuCi8vLyAgICAgICB0aGlzLmIgPSBjOyAgIC8vIGEgVGhpc0FjY2Vzc0dlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgdGhpc2AuCi8vLyAgICAgbWV0aG9kKCkgewovLy8gICAgICAgdGhpcy5iOyAgICAgICAvLyBhIFRoaXNBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYHRoaXNgLgovLy8gICAgICAgc3VwZXIuYigpOyAgICAvLyBhIFRoaXNBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYHN1cGVyYC4KLy8vICAgICAgIHRoaXMuYiA9IGM7ICAgLy8gYSBUaGlzQWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGB0aGlzYC4KLy8vICAgICAgIHRoaXMuYiArPSBjOyAgLy8gYSBUaGlzQWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGB0aGlzYC4KLy8vICAgICB9Ci8vLyAgIH0KLy8vCi8vLyBJZiB0aGlzIGB0aGlzYCBvY2N1cnMgaW4gYW4gaW5zdGFuY2UgbWVtYmVyIG9uIGFuIGV4dGVuc2lvbiBkZWNsYXJhdGlvbiwKLy8vIGEgW1JlYWRPbmx5QWNjZXNzR2VuZXJhdG9yXSBpcyBjcmVhdGVkIGluc3RlYWQuCi8vLwpjbGFzcyBUaGlzQWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKICAvLy8gYHRydWVgIGlmIHRoaXMgYWNjZXNzIGlzIGluIGFuIGluaXRpYWxpemVyIGxpc3QuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBpbiBgPGluaXQ+YCBpbgogIC8vLwogIC8vLyAgICBjbGFzcyBDbGFzcyB7CiAgLy8vICAgICAgQ2xhc3MoKSA6IDxpbml0PjsKICAvLy8gICAgfQogIC8vLwogIGZpbmFsIGJvb2wgaXNJbml0aWFsaXplcjsKCiAgLy8vIGB0cnVlYCBpZiB0aGlzIGFjY2VzcyBpcyBpbiBhIGZpZWxkIGluaXRpYWxpemVyIGVpdGhlciBkaXJlY3RseSBvciB3aXRoaW4KICAvLy8gYW4gaW5pdGlhbGl6ZXIgbGlzdC4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGluIGA8aW5pdD5gIGluCiAgLy8vCiAgLy8vICAgIHZhciBmb28gPSA8aW5pdD47CiAgLy8vICAgIGNsYXNzIENsYXNzIHsKICAvLy8gICAgICB2YXIgYmFyID0gPGluaXQ+OwogIC8vLyAgICAgIENsYXNzKCkgOiA8aW5pdD47CiAgLy8vICAgIH0KICAvLy8KICBmaW5hbCBib29sIGluRmllbGRJbml0aWFsaXplcjsKCiAgLy8vIGB0cnVlYCBpZiB0aGlzIHN1YmV4cHJlc3Npb24gcmVwcmVzZW50cyBhIGBzdXBlcmAgcHJlZml4LgogIGZpbmFsIGJvb2wgaXNTdXBlcjsKCiAgVGhpc0FjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMuaXNJbml0aWFsaXplciwgdGhpcy5pbkZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgIHt0aGlzLmlzU3VwZXI6IGZhbHNlfSkKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgU3RyaW5nIGdldCBfcGxhaW5OYW1lRm9yUmVhZCB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoIiR7aXNTdXBlciA/ICdzdXBlcicgOiAndGhpcyd9LnBsYWluTmFtZUZvclJlYWQiLAogICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwgX3VyaSk7CiAgfQoKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlRoaXNBY2Nlc3NHZW5lcmF0b3IiOwoKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIGlmICghaXNTdXBlcikgewogICAgICBpZiAoaW5GaWVsZEluaXRpYWxpemVyKSB7CiAgICAgICAgcmV0dXJuIGJ1aWxkRmllbGRJbml0aWFsaXplckVycm9yKG51bGwpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBfZm9yZXN0LnRoaXNFeHByZXNzaW9uKHRva2VuKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRQcm9ibGVtKG1lc3NhZ2VTdXBlckFzRXhwcmVzc2lvbiwKICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKTsKICAgIH0KICB9CgogIEV4cHJlc3Npb24gYnVpbGRGaWVsZEluaXRpYWxpemVyRXJyb3IoTWFwPFN0cmluZywgaW50PiBpbml0aWFsaXplZEZpZWxkcykgewogICAgU3RyaW5nIGtleXdvcmQgPSBpc1N1cGVyID8gInN1cGVyIiA6ICJ0aGlzIjsKICAgIHJldHVybiBfaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICB0ZW1wbGF0ZVRoaXNPclN1cGVyQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyLndpdGhBcmd1bWVudHMoa2V5d29yZCksCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLAogICAgICAgIGtleXdvcmQubGVuZ3RoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyIGJ1aWxkRmllbGRJbml0aWFsaXplcihNYXA8U3RyaW5nLCBpbnQ+IGluaXRpYWxpemVkRmllbGRzKSB7CiAgICBFeHByZXNzaW9uIGVycm9yID0gX2hlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbigKICAgICAgICBidWlsZEZpZWxkSW5pdGlhbGl6ZXJFcnJvcihpbml0aWFsaXplZEZpZWxkcykpOwogICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoZXJyb3IsIGVycm9yLmZpbGVPZmZzZXQpOwogIH0KCiAgYnVpbGRQcm9wZXJ0eUFjY2VzcygKICAgICAgSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3Igc2VuZCwgaW50IG9wZXJhdG9yT2Zmc2V0LCBib29sIGlzTnVsbEF3YXJlKSB7CiAgICBOYW1lIG5hbWUgPSBzZW5kLm5hbWU7CiAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gc2VuZC5hcmd1bWVudHM7CiAgICBpbnQgb2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4oc2VuZC50b2tlbik7CiAgICBpZiAoaXNJbml0aWFsaXplciAmJiBzZW5kIGlzIFNlbmRBY2Nlc3NHZW5lcmF0b3IpIHsKICAgICAgaWYgKGlzTnVsbEF3YXJlKSB7CiAgICAgICAgX2hlbHBlci5hZGRQcm9ibGVtKAogICAgICAgICAgICBtZXNzYWdlSW52YWxpZFVzZU9mTnVsbEF3YXJlQWNjZXNzLCBvcGVyYXRvck9mZnNldCwgMik7CiAgICAgIH0KICAgICAgcmV0dXJuIGJ1aWxkQ29uc3RydWN0b3JJbml0aWFsaXplcihvZmZzZXQsIG5hbWUsIGFyZ3VtZW50cyk7CiAgICB9CiAgICBpZiAoaW5GaWVsZEluaXRpYWxpemVyICYmICFpc0luaXRpYWxpemVyKSB7CiAgICAgIHJldHVybiBidWlsZEZpZWxkSW5pdGlhbGl6ZXJFcnJvcihudWxsKTsKICAgIH0KICAgIE1lbWJlciBnZXR0ZXIgPSBfaGVscGVyLmxvb2t1cEluc3RhbmNlTWVtYmVyKG5hbWUsIGlzU3VwZXI6IGlzU3VwZXIpOwogICAgaWYgKHNlbmQgaXMgU2VuZEFjY2Vzc0dlbmVyYXRvcikgewogICAgICAvLyBOb3RpY2UgdGhhdCAndGhpcycgb3IgJ3N1cGVyJyBjYW4ndCBiZSBudWxsLiBTbyB3ZSBjYW4gaWdub3JlIHRoZQogICAgICAvLyB2YWx1ZSBvZiBbaXNOdWxsQXdhcmVdLgogICAgICBpZiAoZ2V0dGVyID09IG51bGwpIHsKICAgICAgICBfaGVscGVyLndhcm5VbnJlc29sdmVkTWV0aG9kKG5hbWUsIG9mZnNldEZvclRva2VuKHNlbmQudG9rZW4pLAogICAgICAgICAgICBpc1N1cGVyOiBpc1N1cGVyKTsKICAgICAgfQogICAgICByZXR1cm4gX2hlbHBlci5idWlsZE1ldGhvZEludm9jYXRpb24oX2ZvcmVzdC50aGlzRXhwcmVzc2lvbihudWxsKSwgbmFtZSwKICAgICAgICAgIHNlbmQuYXJndW1lbnRzLCBvZmZzZXRGb3JUb2tlbihzZW5kLnRva2VuKSwKICAgICAgICAgIGlzU3VwZXI6IGlzU3VwZXIsIGludGVyZmFjZVRhcmdldDogZ2V0dGVyKTsKICAgIH0gZWxzZSB7CiAgICAgIE1lbWJlciBzZXR0ZXIgPQogICAgICAgICAgX2hlbHBlci5sb29rdXBJbnN0YW5jZU1lbWJlcihuYW1lLCBpc1N1cGVyOiBpc1N1cGVyLCBpc1NldHRlcjogdHJ1ZSk7CiAgICAgIGlmIChpc1N1cGVyKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTdXBlclByb3BlcnR5QWNjZXNzR2VuZXJhdG9yKAogICAgICAgICAgICBfaGVscGVyLAogICAgICAgICAgICAvLyBUT0RPKGFoZSk6IFRoaXMgaXMgbm90IHRoZSAnc3VwZXInIHRva2VuLgogICAgICAgICAgICBzZW5kLnRva2VuLAogICAgICAgICAgICBuYW1lLAogICAgICAgICAgICBnZXR0ZXIsCiAgICAgICAgICAgIHNldHRlcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG5ldyBUaGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgICAgIF9oZWxwZXIsCiAgICAgICAgICAgIC8vIFRPRE8oYWhlKTogVGhpcyBpcyBub3QgdGhlICd0aGlzJyB0b2tlbi4KICAgICAgICAgICAgc2VuZC50b2tlbiwKICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgZ2V0dGVyLAogICAgICAgICAgICBzZXR0ZXIpOwogICAgICB9CiAgICB9CiAgfQoKICBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgaWYgKGlzSW5pdGlhbGl6ZXIpIHsKICAgICAgcmV0dXJuIGJ1aWxkQ29uc3RydWN0b3JJbml0aWFsaXplcihvZmZzZXQsIG5ldyBOYW1lKCIiKSwgYXJndW1lbnRzKTsKICAgIH0gZWxzZSBpZiAoaXNTdXBlcikgewogICAgICByZXR1cm4gX2hlbHBlci5idWlsZFByb2JsZW0obWVzc2FnZVN1cGVyQXNFeHByZXNzaW9uLCBvZmZzZXQsIG5vTGVuZ3RoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfaGVscGVyLmJ1aWxkTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgIF9mb3Jlc3QudGhpc0V4cHJlc3Npb24obnVsbCksIGNhbGxOYW1lLCBhcmd1bWVudHMsIG9mZnNldCwKICAgICAgICAgIGlzSW1wbGljaXRDYWxsOiB0cnVlKTsKICAgIH0KICB9CgogIEluaXRpYWxpemVyIGJ1aWxkQ29uc3RydWN0b3JJbml0aWFsaXplcigKICAgICAgaW50IG9mZnNldCwgTmFtZSBuYW1lLCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IF9oZWxwZXIubG9va3VwQ29uc3RydWN0b3IobmFtZSwgaXNTdXBlcjogaXNTdXBlcik7CiAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlOwogICAgaWYgKGNvbnN0cnVjdG9yICE9IG51bGwpIHsKICAgICAgbWVzc2FnZSA9IF9oZWxwZXIuY2hlY2tBcmd1bWVudHNGb3JGdW5jdGlvbigKICAgICAgICAgIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLCBhcmd1bWVudHMsIG9mZnNldCwgPFR5cGVQYXJhbWV0ZXI+W10pOwogICAgfSBlbHNlIHsKICAgICAgU3RyaW5nIGZ1bGxOYW1lID0KICAgICAgICAgIF9oZWxwZXIuY29uc3RydWN0b3JOYW1lRm9yRGlhZ25vc3RpY3MobmFtZS5uYW1lLCBpc1N1cGVyOiBpc1N1cGVyKTsKICAgICAgbWVzc2FnZSA9IChpc1N1cGVyCiAgICAgICAgICAgICAgPyB0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb0NvbnN0cnVjdG9yCiAgICAgICAgICAgICAgOiB0ZW1wbGF0ZUNvbnN0cnVjdG9yTm90Rm91bmQpCiAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmdWxsTmFtZSkKICAgICAgICAgIC53aXRoTG9jYXRpb24oX3VyaSwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBsZW5ndGhGb3JUb2tlbih0b2tlbikpOwogICAgfQogICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewogICAgICByZXR1cm4gX2hlbHBlci5idWlsZEludmFsaWRJbml0aWFsaXplcihfaGVscGVyLndyYXBTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgICAgX2hlbHBlci50aHJvd05vU3VjaE1ldGhvZEVycm9yKAogICAgICAgICAgICAgIF9mb3Jlc3QubGl0ZXJhbE51bGwobnVsbCkuLmZpbGVPZmZzZXQgPSBvZmZzZXQsCiAgICAgICAgICAgICAgX2hlbHBlci5jb25zdHJ1Y3Rvck5hbWVGb3JEaWFnbm9zdGljcyhuYW1lLm5hbWUsCiAgICAgICAgICAgICAgICAgIGlzU3VwZXI6IGlzU3VwZXIpLAogICAgICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICAgICAgaXNTdXBlcjogaXNTdXBlciwKICAgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlKSwKICAgICAgICAgIG9mZnNldCkpOwogICAgfSBlbHNlIGlmIChpc1N1cGVyKSB7CiAgICAgIHJldHVybiBfaGVscGVyLmJ1aWxkU3VwZXJJbml0aWFsaXplcigKICAgICAgICAgIGZhbHNlLCBjb25zdHJ1Y3RvciwgYXJndW1lbnRzLCBvZmZzZXQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRSZWRpcmVjdGluZ0luaXRpYWxpemVyKAogICAgICAgICAgY29uc3RydWN0b3IsIGFyZ3VtZW50cywgb2Zmc2V0KTsKICAgIH0KICB9CgogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZEFzc2lnbm1lbnRFcnJvcigpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZE51bGxBd2FyZUFzc2lnbm1lbnQoCiAgICAgIEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZEFzc2lnbm1lbnRFcnJvcigpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0LAogICAgICBib29sIGlzUHJlSW5jRGVjOiBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWM6IGZhbHNlfSkgewogICAgcmV0dXJuIGJ1aWxkQXNzaWdubWVudEVycm9yKCk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkUHJlZml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KSB7CiAgICByZXR1cm4gYnVpbGRBc3NpZ25tZW50RXJyb3IoKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KSB7CiAgICByZXR1cm4gYnVpbGRBc3NpZ25tZW50RXJyb3IoKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50RXJyb3IoKSB7CiAgICByZXR1cm4gX2hlbHBlci5kZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihfaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICBpc1N1cGVyID8gbWVzc2FnZUNhbm5vdEFzc2lnblRvU3VwZXIgOiBtZXNzYWdlTm90QW5MdmFsdWUsCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLAogICAgICAgIHRva2VuLmxlbmd0aCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBpc0luaXRpYWxpemVyOiAiKTsKICAgIHNpbmsud3JpdGUoaXNJbml0aWFsaXplcik7CiAgICBzaW5rLndyaXRlKCIsIGluRmllbGRJbml0aWFsaXplcjogIik7CiAgICBzaW5rLndyaXRlKGluRmllbGRJbml0aWFsaXplcik7CiAgICBzaW5rLndyaXRlKCIsIGlzU3VwZXI6ICIpOwogICAgc2luay53cml0ZShpc1N1cGVyKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEluY29tcGxldGVTZW5kR2VuZXJhdG9yIGltcGxlbWVudHMgR2VuZXJhdG9yIHsKICBOYW1lIGdldCBuYW1lOwoKICB3aXRoUmVjZWl2ZXIoT2JqZWN0IHJlY2VpdmVyLCBpbnQgb3BlcmF0b3JPZmZzZXQsIHtib29sIGlzTnVsbEF3YXJlfSk7CgogIEFyZ3VtZW50cyBnZXQgYXJndW1lbnRzID0+IG51bGw7Cn0KCmNsYXNzIEluY29tcGxldGVFcnJvckdlbmVyYXRvciBleHRlbmRzIEVycm9uZW91c0V4cHJlc3Npb25HZW5lcmF0b3IKICAgIHdpdGggSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3IgewogIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZTsKCiAgSW5jb21wbGV0ZUVycm9yR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIHRoaXMubWVzc2FnZSkKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgTmFtZSBnZXQgbmFtZSA9PiBudWxsOwoKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+IHRva2VuLmxleGVtZTsKCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lID0+ICJJbmNvbXBsZXRlRXJyb3JHZW5lcmF0b3IiOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkRXJyb3IoQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAge2Jvb2wgaXNHZXR0ZXI6IGZhbHNlLCBib29sIGlzU2V0dGVyOiBmYWxzZSwgaW50IG9mZnNldH0pIHsKICAgIGludCBsZW5ndGggPSBub0xlbmd0aDsKICAgIGlmIChvZmZzZXQgPT0gbnVsbCkgewogICAgICBvZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICAgIGxlbmd0aCA9IGxlbmd0aEZvclRva2VuKHRva2VuKTsKICAgIH0KICAgIHJldHVybiBfaGVscGVyLmJ1aWxkUHJvYmxlbShtZXNzYWdlLCBvZmZzZXQsIGxlbmd0aCk7CiAgfQoKICBAb3ZlcnJpZGUKICBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgPT4gdGhpczsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFNpbXBsZVJlYWQoKSB7CiAgICByZXR1cm4gYnVpbGRFcnJvcihfZm9yZXN0LmFyZ3VtZW50c0VtcHR5KHRva2VuKSwgaXNHZXR0ZXI6IHRydWUpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGUoIiwgbWVzc2FnZTogIik7CiAgICBzaW5rLndyaXRlKG1lc3NhZ2UuY29kZS5uYW1lKTsKICB9Cn0KCi8vIFRPRE8oYWhlKTogUmVuYW1lIHRvIFNlbmRHZW5lcmF0b3IuCmNsYXNzIFNlbmRBY2Nlc3NHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3Igd2l0aCBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTmFtZSBuYW1lOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBBcmd1bWVudHMgYXJndW1lbnRzOwoKICBTZW5kQWNjZXNzR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIHRoaXMubmFtZSwgdGhpcy5hcmd1bWVudHMpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbikgewogICAgYXNzZXJ0KGFyZ3VtZW50cyAhPSBudWxsKTsKICB9CgogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgPT4gbmFtZS5uYW1lOwoKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlNlbmRBY2Nlc3NHZW5lcmF0b3IiOwoKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRTaW1wbGVSZWFkIiwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBfdXJpKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRBc3NpZ25tZW50Iiwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBfdXJpKTsKICB9CgogIHdpdGhSZWNlaXZlcihPYmplY3QgcmVjZWl2ZXIsIGludCBvcGVyYXRvck9mZnNldCwge2Jvb2wgaXNOdWxsQXdhcmU6IGZhbHNlfSkgewogICAgaWYgKHJlY2VpdmVyIGlzIEdlbmVyYXRvcikgewogICAgICByZXR1cm4gcmVjZWl2ZXIuYnVpbGRQcm9wZXJ0eUFjY2Vzcyh0aGlzLCBvcGVyYXRvck9mZnNldCwgaXNOdWxsQXdhcmUpOwogICAgfQogICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRNZXRob2RJbnZvY2F0aW9uKAogICAgICAgIF9oZWxwZXIudG9WYWx1ZShyZWNlaXZlciksIG5hbWUsIGFyZ3VtZW50cywgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLAogICAgICAgIGlzTnVsbEF3YXJlOiBpc051bGxBd2FyZSk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkTnVsbEF3YXJlQXNzaWdubWVudCgKICAgICAgRXhwcmVzc2lvbiB2YWx1ZSwgRGFydFR5cGUgdHlwZSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJidWlsZE51bGxBd2FyZUFzc2lnbm1lbnQiLCBvZmZzZXQsIF91cmkpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0LAogICAgICBib29sIGlzUHJlSW5jRGVjOiBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWM6IGZhbHNlfSkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKAogICAgICAgICJidWlsZENvbXBvdW5kQXNzaWdubWVudCIsIG9mZnNldCA/PyBvZmZzZXRGb3JUb2tlbih0b2tlbiksIF91cmkpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZFByZWZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0fSkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKAogICAgICAgICJidWlsZFByZWZpeEluY3JlbWVudCIsIG9mZnNldCA/PyBvZmZzZXRGb3JUb2tlbih0b2tlbiksIF91cmkpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZFBvc3RmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldH0pIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgKICAgICAgICAiYnVpbGRQb3N0Zml4SW5jcmVtZW50Iiwgb2Zmc2V0ID8/IG9mZnNldEZvclRva2VuKHRva2VuKSwgX3VyaSk7CiAgfQoKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImRvSW52b2NhdGlvbiIsIG9mZnNldCwgX3VyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlKCIsIG5hbWU6ICIpOwogICAgc2luay53cml0ZShuYW1lLm5hbWUpOwogICAgc2luay53cml0ZSgiLCBhcmd1bWVudHM6ICIpOwogICAgdmFyIG5vZGUgPSBhcmd1bWVudHM7CiAgICBpZiAobm9kZSBpcyBOb2RlKSB7CiAgICAgIHByaW50Tm9kZU9uKG5vZGUsIHNpbmspOwogICAgfSBlbHNlIHsKICAgICAgc2luay53cml0ZShub2RlKTsKICAgIH0KICB9Cn0KCmNsYXNzIEluY29tcGxldGVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvcgogICAgd2l0aCBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvciB7CiAgZmluYWwgTmFtZSBuYW1lOwoKICBJbmNvbXBsZXRlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwgdGhpcy5uYW1lKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+IG5hbWUubmFtZTsKCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lID0+ICJJbmNvbXBsZXRlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IiOwoKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRTaW1wbGVSZWFkIiwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBfdXJpKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRBc3NpZ25tZW50Iiwgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBfdXJpKTsKICB9CgogIHdpdGhSZWNlaXZlcihPYmplY3QgcmVjZWl2ZXIsIGludCBvcGVyYXRvck9mZnNldCwge2Jvb2wgaXNOdWxsQXdhcmU6IGZhbHNlfSkgewogICAgaWYgKHJlY2VpdmVyIGlzIEdlbmVyYXRvcikgewogICAgICByZXR1cm4gcmVjZWl2ZXIuYnVpbGRQcm9wZXJ0eUFjY2Vzcyh0aGlzLCBvcGVyYXRvck9mZnNldCwgaXNOdWxsQXdhcmUpOwogICAgfQogICAgcmV0dXJuIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yLm1ha2UoX2hlbHBlciwgdG9rZW4sCiAgICAgICAgX2hlbHBlci50b1ZhbHVlKHJlY2VpdmVyKSwgbmFtZSwgbnVsbCwgbnVsbCwgaXNOdWxsQXdhcmUpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZE51bGxBd2FyZUFzc2lnbm1lbnQoCiAgICAgIEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGROdWxsQXdhcmVBc3NpZ25tZW50Iiwgb2Zmc2V0LCBfdXJpKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldCwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgKICAgICAgICAiYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQiLCBvZmZzZXQgPz8gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBfdXJpKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRQcmVmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgUHJvY2VkdXJlIGludGVyZmFjZVRhcmdldH0pIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgKICAgICAgICAiYnVpbGRQcmVmaXhJbmNyZW1lbnQiLCBvZmZzZXQgPz8gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBfdXJpKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXR9KSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoCiAgICAgICAgImJ1aWxkUG9zdGZpeEluY3JlbWVudCIsIG9mZnNldCA/PyBvZmZzZXRGb3JUb2tlbih0b2tlbiksIF91cmkpOwogIH0KCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJkb0ludm9jYXRpb24iLCBvZmZzZXQsIF91cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBuYW1lOiAiKTsKICAgIHNpbmsud3JpdGUobmFtZS5uYW1lKTsKICB9Cn0KCmNsYXNzIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uR2VuZXJhdG9yIGV4dGVuZHMgUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IgewogIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIEV4cHJlc3Npb24gZXhwcmVzc2lvbikKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuLCBleHByZXNzaW9uLCBudWxsKTsKCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lID0+ICJQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkdlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQgc3RhcnRDb21wbGV4QXNzaWdubWVudChFeHByZXNzaW9uIHJocykgewogICAgcmV0dXJuIFN5bnRoZXRpY1dyYXBwZXIud3JhcElsbGVnYWxBc3NpZ25tZW50KHJocywKICAgICAgICBhc3NpZ25tZW50T2Zmc2V0OiBvZmZzZXRGb3JUb2tlbih0b2tlbikpOwogIH0KCiAgRXhwcmVzc2lvbiBfbWFrZUludmFsaWRXcml0ZShFeHByZXNzaW9uIHZhbHVlKSB7CiAgICByZXR1cm4gX2hlbHBlci53cmFwSW52YWxpZFdyaXRlKAogICAgICAgIF9oZWxwZXIuZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb24oX2hlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2VDYW5ub3RBc3NpZ25Ub1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uLAogICAgICAgICAgICBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICAgIGxlbmd0aEZvclRva2VuKHRva2VuKSkpLAogICAgICAgIGV4cHJlc3Npb24sCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pKTsKICB9Cn0KCkV4cHJlc3Npb24gbWFrZUxldChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBFeHByZXNzaW9uIGJvZHkpIHsKICBpZiAodmFyaWFibGUgPT0gbnVsbCkgcmV0dXJuIGJvZHk7CiAgcmV0dXJuIG5ldyBMZXQodmFyaWFibGUsIGJvZHkpOwp9CgpFeHByZXNzaW9uIG1ha2VCaW5hcnkoRXhwcmVzc2lvbiBsZWZ0LCBOYW1lIG9wZXJhdG9yLCBQcm9jZWR1cmUgaW50ZXJmYWNlVGFyZ2V0LAogICAgRXhwcmVzc2lvbiByaWdodCwgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXR9KSB7CiAgcmV0dXJuIG5ldyBNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnQoCiAgICAgIGxlZnQsCiAgICAgIG9wZXJhdG9yLAogICAgICBoZWxwZXIuZm9yZXN0CiAgICAgICAgICAuY2FzdEFyZ3VtZW50cyhoZWxwZXIuZm9yZXN0LmFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bcmlnaHRdLCBudWxsKSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICBpbnRlcmZhY2VUYXJnZXQ6IGludGVyZmFjZVRhcmdldCkKICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKfQoKRXhwcmVzc2lvbiBidWlsZElzTnVsbCgKICAgIEV4cHJlc3Npb24gdmFsdWUsIGludCBvZmZzZXQsIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyKSB7CiAgcmV0dXJuIG1ha2VCaW5hcnkodmFsdWUsIGVxdWFsc05hbWUsIG51bGwsCiAgICAgIGhlbHBlci5mb3Jlc3QubGl0ZXJhbE51bGwobnVsbCkuLmZpbGVPZmZzZXQgPSBvZmZzZXQsIGhlbHBlciwKICAgICAgb2Zmc2V0OiBvZmZzZXQpOwp9CgpWYXJpYWJsZURlY2xhcmF0aW9uIG1ha2VPclJldXNlVmFyaWFibGUoRXhwcmVzc2lvbiB2YWx1ZSkgewogIC8vIFRPRE86IERldmlzZSBhIHdheSB0byByZW1lbWJlciBpZiBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHdhcyByZXVzZWQKICAvLyBvciBpcyBmcmVzaCAoaGVuY2UgbmVlZHMgYSBsZXQgYmluZGluZykuCiAgcmV0dXJuIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKHZhbHVlKTsKfQoKaW50IGFkanVzdEZvckltcGxpY2l0Q2FsbChTdHJpbmcgbmFtZSwgaW50IG9mZnNldCkgewogIC8vIE5vcm1hbGx5IHRoZSBvZmZzZXQgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0b2tlbiwgYnV0IGluIHRoaXMgY2FzZSwKICAvLyBiZWNhdXNlIHdlIGluc2VydCBhICcuY2FsbCcsIHdlIHdhbnQgaXQgYXQgdGhlIGVuZCBpbnN0ZWFkLgogIHJldHVybiBvZmZzZXQgKyAobmFtZT8ubGVuZ3RoID8/IDApOwp9Cgpib29sIGlzRmllbGRPckdldHRlcihNZW1iZXIgbWVtYmVyKSB7CiAgcmV0dXJuIG1lbWJlciBpcyBGaWVsZCB8fCAobWVtYmVyIGlzIFByb2NlZHVyZSAmJiBtZW1iZXIuaXNHZXR0ZXIpOwp9CoxpAE5OPAErJAEhCRUPGw0OFRUTHxoSFxUVAS4BOAEdCRgREiQ2KisxIywsJxwiEjElKC4nLBosNTIBFwkXERITFhQWFhcUExYWFRIYGQFLATcBGAEsASgBSgEVCRAcFyAdAU0BHQkTEhUUFRAOEx0BHQkcFRYcGhUYASAJIyQiJiQnIholHQFLSQRPIQRNSkxODxs9KwFGFQEnATIoAU1RTE8xIAEoGQExHwFEBk8nIS0EATUG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BAE4Jh8kIwQBJkRDHxgEAQwiJR8qJB8ZBAIBPhEBSQEjAgFEIxkBHEMeARkBMAE3AQwtQhsaJiYGOgQBDDkBDCFFLAQBDCIfIwQCASdLDBMBDB0BF1AfHwQBLQEyASFIBAFMSAQBUSFOBipLIwQBJzMjQgQBTCYfIR8jGEsEATcmHyQYSAQBOCYfJBhJBAE9NgQBDCIcGyEaGB8NGAYEAgE6IxMBJUAeAS0BQAEhSAQBTEgEAVEhTgY4QwQBJzMjQgQBTCYfIR8jGEsEATcmHyQYSAQBOCYfJBhJBAE9NgQBDCIcGwQCAUkkTDABPwEMRTcyBAEzJUE6IyUUIAQCAUQlIgIBUTgnJwwQFE0jKBsCARhGLUQXAgE8SS4yAgE1SUEnAgEmRgIBPHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvZXhwcmVzc2lvbl9nZW5lcmF0b3IuZGFydExzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2V4cHJlc3Npb25fZ2VuZXJhdG9yX2hlbHBlci5kYXJ0k5YvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5leHByZXNzaW9uX2dlbmVyYXRvcl9oZWxwZXI7CgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnLi4vY29uc3RhbnRfY29udGV4dC5kYXJ0JyBzaG93IENvbnN0YW50Q29udGV4dDsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyBMb2NhdGVkTWVzc2FnZTsKCmltcG9ydCAnLi4vbWVzc2FnZXMuZGFydCcgc2hvdyBNZXNzYWdlOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JyBzaG93IFNjb3BlOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS9pbmZlcmVuY2VfaGVscGVyLmRhcnQnIHNob3cgSW5mZXJlbmNlSGVscGVyOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX3Byb21vdGlvbi5kYXJ0JyBzaG93IFR5cGVQcm9tb3RlcjsKCmltcG9ydCAnY29uc3RuZXNzLmRhcnQnIHNob3cgQ29uc3RuZXNzOwoKaW1wb3J0ICdmb3Jlc3QuZGFydCcgc2hvdyBGb3Jlc3Q7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnIHNob3cgRGVjbGFyYXRpb24sIFByZWZpeEJ1aWxkZXIsIFVucmVzb2x2ZWRUeXBlOwoKaW1wb3J0ICdrZXJuZWxfYXN0X2FwaS5kYXJ0JwogICAgc2hvdwogICAgICAgIEFyZ3VtZW50cywKICAgICAgICBDb25zdHJ1Y3RvciwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBJbml0aWFsaXplciwKICAgICAgICBNZW1iZXIsCiAgICAgICAgTmFtZSwKICAgICAgICBQcm9jZWR1cmUsCiAgICAgICAgU3RhdGljR2V0LAogICAgICAgIFR5cGVQYXJhbWV0ZXI7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgS2VybmVsUHJlZml4QnVpbGRlciwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBQcmVmaXhCdWlsZGVyLAogICAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXI7CgphYnN0cmFjdCBjbGFzcyBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGltcGxlbWVudHMgSW5mZXJlbmNlSGVscGVyIHsKICBMaWJyYXJ5QnVpbGRlciBnZXQgbGlicmFyeTsKCiAgVHlwZVByb21vdGVyIGdldCB0eXBlUHJvbW90ZXI7CgogIGludCBnZXQgZnVuY3Rpb25OZXN0aW5nTGV2ZWw7CgogIENvbnN0YW50Q29udGV4dCBnZXQgY29uc3RhbnRDb250ZXh0OwoKICBGb3Jlc3QgZ2V0IGZvcmVzdDsKCiAgYm9vbCBnZXQgbGVnYWN5TW9kZTsKCiAgQ29uc3RydWN0b3IgbG9va3VwQ29uc3RydWN0b3IoTmFtZSBuYW1lLCB7Ym9vbCBpc1N1cGVyfSk7CgogIEV4cHJlc3Npb24gdG9WYWx1ZShub2RlKTsKCiAgTWVtYmVyIGxvb2t1cEluc3RhbmNlTWVtYmVyKE5hbWUgbmFtZSwge2Jvb2wgaXNTZXR0ZXIsIGJvb2wgaXNTdXBlcn0pOwoKICBzY29wZUxvb2t1cChTY29wZSBzY29wZSwgU3RyaW5nIG5hbWUsIFRva2VuIHRva2VuLAogICAgICB7Ym9vbCBpc1F1YWxpZmllZDogZmFsc2UsIFByZWZpeEJ1aWxkZXIgcHJlZml4fSk7CgogIGZpbmlzaFNlbmQoT2JqZWN0IHJlY2VpdmVyLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgb2Zmc2V0KTsKCiAgSW5pdGlhbGl6ZXIgYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBbaW50IG9mZnNldF0pOwoKICBJbml0aWFsaXplciBidWlsZEZpZWxkSW5pdGlhbGl6ZXIoYm9vbCBpc1N5bnRoZXRpYywgU3RyaW5nIG5hbWUsCiAgICAgIGludCBmaWVsZE5hbWVPZmZzZXQsIGludCBhc3NpZ25tZW50T2Zmc2V0LCBFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIHtEYXJ0VHlwZSBmb3JtYWxUeXBlfSk7CgogIEluaXRpYWxpemVyIGJ1aWxkU3VwZXJJbml0aWFsaXplcigKICAgICAgYm9vbCBpc1N5bnRoZXRpYywgQ29uc3RydWN0b3IgY29uc3RydWN0b3IsIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIFtpbnQgb2Zmc2V0XSk7CgogIEluaXRpYWxpemVyIGJ1aWxkUmVkaXJlY3RpbmdJbml0aWFsaXplcigKICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IsIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIFtpbnQgY2hhck9mZnNldCA9IC0xXSk7CgogIEV4cHJlc3Npb24gYnVpbGRTdGF0aWNJbnZvY2F0aW9uKFByb2NlZHVyZSB0YXJnZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIHtDb25zdG5lc3MgY29uc3RuZXNzLCBpbnQgY2hhck9mZnNldH0pOwoKICBFeHByZXNzaW9uIHRocm93Tm9TdWNoTWV0aG9kRXJyb3IoCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsIFN0cmluZyBuYW1lLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgb2Zmc2V0LAogICAgICB7TWVtYmVyIGNhbmRpZGF0ZSwKICAgICAgYm9vbCBpc1N1cGVyLAogICAgICBib29sIGlzR2V0dGVyLAogICAgICBib29sIGlzU2V0dGVyLAogICAgICBib29sIGlzU3RhdGljLAogICAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlfSk7CgogIExvY2F0ZWRNZXNzYWdlIGNoZWNrQXJndW1lbnRzRm9yRnVuY3Rpb24oRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgb2Zmc2V0LCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKTsKCiAgU3RhdGljR2V0IG1ha2VTdGF0aWNHZXQoTWVtYmVyIHJlYWRUYXJnZXQsIFRva2VuIHRva2VuKTsKCiAgRXhwcmVzc2lvbiB3cmFwSW5EZWZlcnJlZENoZWNrKAogICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24sIEtlcm5lbFByZWZpeEJ1aWxkZXIgcHJlZml4LCBpbnQgY2hhck9mZnNldCk7CgogIGJvb2wgaXNJZGVudGljYWwoTWVtYmVyIG1lbWJlcik7CgogIEV4cHJlc3Npb24gYnVpbGRNZXRob2RJbnZvY2F0aW9uKAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLCBOYW1lIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQsCiAgICAgIHtib29sIGlzQ29uc3RhbnRFeHByZXNzaW9uLAogICAgICBib29sIGlzTnVsbEF3YXJlLAogICAgICBib29sIGlzSW1wbGljaXRDYWxsLAogICAgICBib29sIGlzU3VwZXIsCiAgICAgIE1lbWJlciBpbnRlcmZhY2VUYXJnZXR9KTsKCiAgRXhwcmVzc2lvbiBidWlsZENvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciB0eXBlLAogICAgICBUb2tlbiBuYW1lVG9rZW4sCiAgICAgIFRva2VuIG5hbWVMYXN0VG9rZW4sCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgQ29uc3RuZXNzIGNvbnN0bmVzcyk7CgogIFVucmVzb2x2ZWRUeXBlIHZhbGlkYXRlVHlwZVVzZSgKICAgICAgVW5yZXNvbHZlZFR5cGUgdW5yZXNvbHZlZCwgYm9vbCBub25JbnN0YW5jZUFjY2Vzc0lzRXJyb3IpOwoKICB2b2lkIGFkZFByb2JsZW1FcnJvcklmQ29uc3QoTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCk7CgogIE1lc3NhZ2Ugd2FyblVucmVzb2x2ZWRHZXQoTmFtZSBuYW1lLCBpbnQgY2hhck9mZnNldCwge2Jvb2wgaXNTdXBlcn0pOwoKICBNZXNzYWdlIHdhcm5VbnJlc29sdmVkU2V0KE5hbWUgbmFtZSwgaW50IGNoYXJPZmZzZXQsIHtib29sIGlzU3VwZXJ9KTsKCiAgTWVzc2FnZSB3YXJuVW5yZXNvbHZlZE1ldGhvZChOYW1lIG5hbWUsIGludCBjaGFyT2Zmc2V0LCB7Ym9vbCBpc1N1cGVyfSk7CgogIHZvaWQgd2FyblR5cGVBcmd1bWVudHNNaXNtYXRjaChTdHJpbmcgbmFtZSwgaW50IGV4cGVjdGVkLCBpbnQgY2hhck9mZnNldCk7CgogIEV4cHJlc3Npb24gd3JhcEluTG9jYXRlZFByb2JsZW0oRXhwcmVzc2lvbiBleHByZXNzaW9uLCBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLAogICAgICB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pOwoKICBFeHByZXNzaW9uIGV2YWx1YXRlQXJndW1lbnRzQmVmb3JlKAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pOwoKICBEYXJ0VHlwZSBidWlsZERhcnRUeXBlKFVucmVzb2x2ZWRUeXBlIHVucmVzb2x2ZWRUeXBlLAogICAgICB7Ym9vbCBub25JbnN0YW5jZUFjY2Vzc0lzRXJyb3J9KTsKCiAgTGlzdDxEYXJ0VHlwZT4gYnVpbGREYXJ0VHlwZUFyZ3VtZW50cyhMaXN0PFVucmVzb2x2ZWRUeXBlPiB1bnJlc29sdmVkVHlwZXMpOwoKICB2b2lkIHJlcG9ydER1cGxpY2F0ZWREZWNsYXJhdGlvbigKICAgICAgRGVjbGFyYXRpb24gZXhpc3RpbmcsIFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCk7CgogIEV4cHJlc3Npb24gd3JhcFN5bnRoZXRpY0V4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlLCBpbnQgY2hhck9mZnNldCk7CgogIEV4cHJlc3Npb24gd3JhcEludmFsaWRDb25zdHJ1Y3Rvckludm9jYXRpb24oRXhwcmVzc2lvbiBkZXN1Z2FyZWQsCiAgICAgIE1lbWJlciBjb25zdHJ1Y3RvciwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IGNoYXJPZmZzZXQpOwoKICBFeHByZXNzaW9uIHdyYXBJbnZhbGlkV3JpdGUoCiAgICAgIEV4cHJlc3Npb24gZGVzdWdhcmVkLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGludCBjaGFyT2Zmc2V0KTsKCiAgRXhwcmVzc2lvbiB3cmFwVW5yZXNvbHZlZFRhcmdldEludm9jYXRpb24oCiAgICAgIEV4cHJlc3Npb24gZGVzdWdhcmVkLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgY2hhck9mZnNldCk7CgogIEV4cHJlc3Npb24gd3JhcFVucmVzb2x2ZWRWYXJpYWJsZUFzc2lnbm1lbnQoCiAgICAgIEV4cHJlc3Npb24gZGVzdWdhcmVkLCBib29sIGlzQ29tcG91bmQsIEV4cHJlc3Npb24gcmhzLCBpbnQgY2hhck9mZnNldCk7Cn0KgKgATk48ASsBLgE4ATIBKAEjAUcBQgEoASIBTgEdCRMVEhQWFRAOExMXAR0JHRgXIAFGHgEhASABJwEVARcBPAEcAUkBNTgBQAFMAUNIHgElRhUBKzQeAUouASVJGRQVFRUgAUJMATsBIkoBIwEkRyIYGxQgASkjFxsbEyoWHAEiQQFMAUgBSAFLAU0BUScBJjMBOCgBTwEkOgFHAURAAR9EAS1CAS9OAgFDcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9leHByZXNzaW9uX2dlbmVyYXRvcl9oZWxwZXIuZGFydDhzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2Zhbmdvcm4uZGFydMAAS4EvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5mYW5nb3JuOwoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEFyZ3VtZW50cywKICAgICAgICBBc0V4cHJlc3Npb24sCiAgICAgICAgQXNzZXJ0SW5pdGlhbGl6ZXIsCiAgICAgICAgQXdhaXRFeHByZXNzaW9uLAogICAgICAgIEJsb2NrLAogICAgICAgIEJvb2xMaXRlcmFsLAogICAgICAgIEJyZWFrU3RhdGVtZW50LAogICAgICAgIENhdGNoLAogICAgICAgIENoZWNrTGlicmFyeUlzTG9hZGVkLAogICAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbiwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBFbXB0eVN0YXRlbWVudCwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQsCiAgICAgICAgSW52YWxpZEV4cHJlc3Npb24sCiAgICAgICAgSXNFeHByZXNzaW9uLAogICAgICAgIExhYmVsZWRTdGF0ZW1lbnQsCiAgICAgICAgTGV0LAogICAgICAgIExpYnJhcnlEZXBlbmRlbmN5LAogICAgICAgIExvZ2ljYWxFeHByZXNzaW9uLAogICAgICAgIE1hcEVudHJ5LAogICAgICAgIE5hbWVkRXhwcmVzc2lvbiwKICAgICAgICBOb3QsCiAgICAgICAgTnVsbExpdGVyYWwsCiAgICAgICAgUmV0aHJvdywKICAgICAgICBTdGF0ZW1lbnQsCiAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiwKICAgICAgICBTdHJpbmdMaXRlcmFsLAogICAgICAgIFRoaXNFeHByZXNzaW9uLAogICAgICAgIFRocm93LAogICAgICAgIFRyZWVOb2RlLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24sCiAgICAgICAgc2V0UGFyZW50czsKCmltcG9ydCAnLi4vcGFyc2VyLmRhcnQnIHNob3cgb2Zmc2V0Rm9yVG9rZW4sIG9wdGlvbmFsOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuc3VwcG9ydGVkOwoKaW1wb3J0ICcuLi9zY2FubmVyLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ2JvZHlfYnVpbGRlci5kYXJ0JyBzaG93IExhYmVsVGFyZ2V0OwoKaW1wb3J0ICdjb2xsZWN0aW9ucy5kYXJ0JwogICAgc2hvdwogICAgICAgIEZvckVsZW1lbnQsCiAgICAgICAgRm9ySW5FbGVtZW50LAogICAgICAgIEZvckluTWFwRW50cnksCiAgICAgICAgRm9yTWFwRW50cnksCiAgICAgICAgSWZFbGVtZW50LAogICAgICAgIElmTWFwRW50cnksCiAgICAgICAgU3ByZWFkRWxlbWVudDsKCmltcG9ydCAna2VybmVsX3NoYWRvd19hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHNKdWRnbWVudCwKICAgICAgICBBc3NlcnRJbml0aWFsaXplckp1ZGdtZW50LAogICAgICAgIEFzc2VydFN0YXRlbWVudEp1ZGdtZW50LAogICAgICAgIEJsb2NrSnVkZ21lbnQsCiAgICAgICAgQ2F0Y2hKdWRnbWVudCwKICAgICAgICBEb0p1ZGdtZW50LAogICAgICAgIERvdWJsZUp1ZGdtZW50LAogICAgICAgIEVtcHR5U3RhdGVtZW50SnVkZ21lbnQsCiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudEp1ZGdtZW50LAogICAgICAgIEZvckp1ZGdtZW50LAogICAgICAgIElmSnVkZ21lbnQsCiAgICAgICAgSW50SnVkZ21lbnQsCiAgICAgICAgTGlzdExpdGVyYWxKdWRnbWVudCwKICAgICAgICBMb2FkTGlicmFyeUp1ZGdtZW50LAogICAgICAgIE1hcExpdGVyYWxKdWRnbWVudCwKICAgICAgICBSZXR1cm5KdWRnbWVudCwKICAgICAgICBTZXRMaXRlcmFsSnVkZ21lbnQsCiAgICAgICAgU2hhZG93TGFyZ2VJbnRMaXRlcmFsLAogICAgICAgIFN5bWJvbExpdGVyYWxKdWRnbWVudCwKICAgICAgICBTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQsCiAgICAgICAgVHJ5Q2F0Y2hKdWRnbWVudCwKICAgICAgICBUcnlGaW5hbGx5SnVkZ21lbnQsCiAgICAgICAgVHlwZUxpdGVyYWxKdWRnbWVudCwKICAgICAgICBXaGlsZUp1ZGdtZW50LAogICAgICAgIFlpZWxkSnVkZ21lbnQ7CgppbXBvcnQgJ2ZvcmVzdC5kYXJ0JyBzaG93IEZvcmVzdDsKCi8vLyBBIHNoYWRvdyB0cmVlIGZhY3RvcnkuCmNsYXNzIEZhbmdvcm4gZXh0ZW5kcyBGb3Jlc3QgewogIGNvbnN0IEZhbmdvcm4oKTsKCiAgQG92ZXJyaWRlCiAgQXJndW1lbnRzSnVkZ21lbnQgYXJndW1lbnRzKExpc3Q8RXhwcmVzc2lvbj4gcG9zaXRpb25hbCwgVG9rZW4gdG9rZW4sCiAgICAgIHtMaXN0PERhcnRUeXBlPiB0eXBlcywgTGlzdDxOYW1lZEV4cHJlc3Npb24+IG5hbWVkfSkgewogICAgcmV0dXJuIG5ldyBBcmd1bWVudHNKdWRnbWVudChwb3NpdGlvbmFsLCB0eXBlczogdHlwZXMsIG5hbWVkOiBuYW1lZCkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgQXJndW1lbnRzSnVkZ21lbnQgYXJndW1lbnRzRW1wdHkoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBhcmd1bWVudHMoPEV4cHJlc3Npb24+W10sIHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8TmFtZWRFeHByZXNzaW9uPiBhcmd1bWVudHNOYW1lZChBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLm5hbWVkOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxFeHByZXNzaW9uPiBhcmd1bWVudHNQb3NpdGlvbmFsKEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBhcmd1bWVudHMucG9zaXRpb25hbDsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50c1R5cGVBcmd1bWVudHMoQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIGFyZ3VtZW50cy50eXBlczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYXJndW1lbnRzU2V0VHlwZUFyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzLCBMaXN0PERhcnRUeXBlPiB0eXBlcykgewogICAgQXJndW1lbnRzSnVkZ21lbnQuc2V0Tm9uSW5mZXJyYWJsZUFyZ3VtZW50VHlwZXMoYXJndW1lbnRzLCB0eXBlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmdMaXRlcmFsIGFzTGl0ZXJhbFN0cmluZyhFeHByZXNzaW9uIHZhbHVlKSA9PiB2YWx1ZTsKCiAgQG92ZXJyaWRlCiAgQm9vbExpdGVyYWwgbGl0ZXJhbEJvb2woYm9vbCB2YWx1ZSwgVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBuZXcgQm9vbExpdGVyYWwodmFsdWUpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgRG91YmxlSnVkZ21lbnQgbGl0ZXJhbERvdWJsZShkb3VibGUgdmFsdWUsIFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gbmV3IERvdWJsZUp1ZGdtZW50KHZhbHVlKS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIEludEp1ZGdtZW50IGxpdGVyYWxJbnQoaW50IHZhbHVlLCBUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG5ldyBJbnRKdWRnbWVudCh2YWx1ZSwgdG9rZW4/LmxleGVtZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgU2hhZG93TGFyZ2VJbnRMaXRlcmFsIGxpdGVyYWxMYXJnZUludChTdHJpbmcgbGl0ZXJhbCwgVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBuZXcgU2hhZG93TGFyZ2VJbnRMaXRlcmFsKGxpdGVyYWwsIG9mZnNldEZvclRva2VuKHRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0TGl0ZXJhbEp1ZGdtZW50IGxpdGVyYWxMaXN0KAogICAgICBUb2tlbiBjb25zdEtleXdvcmQsCiAgICAgIGJvb2wgaXNDb25zdCwKICAgICAgT2JqZWN0IHR5cGVBcmd1bWVudCwKICAgICAgT2JqZWN0IHR5cGVBcmd1bWVudHMsCiAgICAgIFRva2VuIGxlZnRCcmFja2V0LAogICAgICBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zLAogICAgICBUb2tlbiByaWdodEJyYWNrZXQpIHsKICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pOiBUaGUgZmlsZSBvZmZzZXQgY29tcHV0ZWQgYmVsb3cgd2lsbCBub3QgYmUgY29ycmVjdAogICAgLy8gaWYgdGhlcmUgYXJlIHR5cGUgYXJndW1lbnRzIGJ1dCBubyBgY29uc3RgIGtleXdvcmQuCiAgICByZXR1cm4gbmV3IExpc3RMaXRlcmFsSnVkZ21lbnQoZXhwcmVzc2lvbnMsCiAgICAgICAgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQsIGlzQ29uc3Q6IGlzQ29uc3QpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKGNvbnN0S2V5d29yZCA/PyBsZWZ0QnJhY2tldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTZXRMaXRlcmFsSnVkZ21lbnQgbGl0ZXJhbFNldCgKICAgICAgVG9rZW4gY29uc3RLZXl3b3JkLAogICAgICBib29sIGlzQ29uc3QsCiAgICAgIE9iamVjdCB0eXBlQXJndW1lbnQsCiAgICAgIE9iamVjdCB0eXBlQXJndW1lbnRzLAogICAgICBUb2tlbiBsZWZ0QnJhY2UsCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMsCiAgICAgIFRva2VuIHJpZ2h0QnJhY2UpIHsKICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pOiBUaGUgZmlsZSBvZmZzZXQgY29tcHV0ZWQgYmVsb3cgd2lsbCBub3QgYmUgY29ycmVjdAogICAgLy8gaWYgdGhlcmUgYXJlIHR5cGUgYXJndW1lbnRzIGJ1dCBubyBgY29uc3RgIGtleXdvcmQuCiAgICByZXR1cm4gbmV3IFNldExpdGVyYWxKdWRnbWVudChleHByZXNzaW9ucywKICAgICAgICB0eXBlQXJndW1lbnQ6IHR5cGVBcmd1bWVudCwgaXNDb25zdDogaXNDb25zdCkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4oY29uc3RLZXl3b3JkID8/IGxlZnRCcmFjZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXBMaXRlcmFsSnVkZ21lbnQgbGl0ZXJhbE1hcCgKICAgICAgVG9rZW4gY29uc3RLZXl3b3JkLAogICAgICBib29sIGlzQ29uc3QsCiAgICAgIERhcnRUeXBlIGtleVR5cGUsCiAgICAgIERhcnRUeXBlIHZhbHVlVHlwZSwKICAgICAgT2JqZWN0IHR5cGVBcmd1bWVudHMsCiAgICAgIFRva2VuIGxlZnRCcmFjZSwKICAgICAgTGlzdDxNYXBFbnRyeT4gZW50cmllcywKICAgICAgVG9rZW4gcmlnaHRCcmFjZSkgewogICAgLy8gVE9ETyhicmlhbndpbGtlcnNvbik6IFRoZSBmaWxlIG9mZnNldCBjb21wdXRlZCBiZWxvdyB3aWxsIG5vdCBiZSBjb3JyZWN0CiAgICAvLyBpZiB0aGVyZSBhcmUgdHlwZSBhcmd1bWVudHMgYnV0IG5vIGBjb25zdGAga2V5d29yZC4KICAgIHJldHVybiBuZXcgTWFwTGl0ZXJhbEp1ZGdtZW50KGVudHJpZXMsCiAgICAgICAga2V5VHlwZToga2V5VHlwZSwgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsIGlzQ29uc3Q6IGlzQ29uc3QpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKGNvbnN0S2V5d29yZCA/PyBsZWZ0QnJhY2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgTnVsbExpdGVyYWwgbGl0ZXJhbE51bGwoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBuZXcgTnVsbExpdGVyYWwoKS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZ0xpdGVyYWwgbGl0ZXJhbFN0cmluZyhTdHJpbmcgdmFsdWUsIFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gbmV3IFN0cmluZ0xpdGVyYWwodmFsdWUpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgU3ltYm9sTGl0ZXJhbEp1ZGdtZW50IGxpdGVyYWxTeW1ib2xNdWx0aXBsZShTdHJpbmcgdmFsdWUsIFRva2VuIGhhc2gsIF8pIHsKICAgIHJldHVybiBuZXcgU3ltYm9sTGl0ZXJhbEp1ZGdtZW50KHZhbHVlKS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKGhhc2gpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3ltYm9sTGl0ZXJhbEp1ZGdtZW50IGxpdGVyYWxTeW1ib2xTaW5nbHVhcihTdHJpbmcgdmFsdWUsIFRva2VuIGhhc2gsIF8pIHsKICAgIHJldHVybiBuZXcgU3ltYm9sTGl0ZXJhbEp1ZGdtZW50KHZhbHVlKS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKGhhc2gpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUxpdGVyYWxKdWRnbWVudCBsaXRlcmFsVHlwZShEYXJ0VHlwZSB0eXBlLCBUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG5ldyBUeXBlTGl0ZXJhbEp1ZGdtZW50KHR5cGUpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwRW50cnkgbWFwRW50cnkoRXhwcmVzc2lvbiBrZXksIFRva2VuIGNvbG9uLCBFeHByZXNzaW9uIHZhbHVlKSB7CiAgICByZXR1cm4gbmV3IE1hcEVudHJ5KGtleSwgdmFsdWUpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4oY29sb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHJlYWRPZmZzZXQoVHJlZU5vZGUgbm9kZSkgPT4gbm9kZS5maWxlT2Zmc2V0OwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGxvYWRMaWJyYXJ5KExpYnJhcnlEZXBlbmRlbmN5IGRlcGVuZGVuY3ksIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgTG9hZExpYnJhcnlKdWRnbWVudChkZXBlbmRlbmN5LCBhcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBjaGVja0xpYnJhcnlJc0xvYWRlZChMaWJyYXJ5RGVwZW5kZW5jeSBkZXBlbmRlbmN5KSB7CiAgICByZXR1cm4gbmV3IENoZWNrTGlicmFyeUlzTG9hZGVkKGRlcGVuZGVuY3kpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBhc0V4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uLCBEYXJ0VHlwZSB0eXBlLCBUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG5ldyBBc0V4cHJlc3Npb24oZXhwcmVzc2lvbiwgdHlwZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBzcHJlYWRFbGVtZW50KEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBuZXcgU3ByZWFkRWxlbWVudChleHByZXNzaW9uLCB0b2tlbi5sZXhlbWUgPT0gJy4uLj8nKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGlmRWxlbWVudChFeHByZXNzaW9uIGNvbmRpdGlvbiwgRXhwcmVzc2lvbiB0aGVuLAogICAgICBFeHByZXNzaW9uIG90aGVyd2lzZSwgVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBuZXcgSWZFbGVtZW50KGNvbmRpdGlvbiwgdGhlbiwgb3RoZXJ3aXNlKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXBFbnRyeSBpZk1hcEVudHJ5KAogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiwgTWFwRW50cnkgdGhlbiwgTWFwRW50cnkgb3RoZXJ3aXNlLCBUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG5ldyBJZk1hcEVudHJ5KGNvbmRpdGlvbiwgdGhlbiwgb3RoZXJ3aXNlKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGZvckVsZW1lbnQoCiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzLAogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiwKICAgICAgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGVzLAogICAgICBFeHByZXNzaW9uIGJvZHksCiAgICAgIFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gbmV3IEZvckVsZW1lbnQodmFyaWFibGVzLCBjb25kaXRpb24sIHVwZGF0ZXMsIGJvZHkpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIE1hcEVudHJ5IGZvck1hcEVudHJ5KAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcywKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24sCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gdXBkYXRlcywKICAgICAgTWFwRW50cnkgYm9keSwKICAgICAgVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBuZXcgRm9yTWFwRW50cnkodmFyaWFibGVzLCBjb25kaXRpb24sIHVwZGF0ZXMsIGJvZHkpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZm9ySW5FbGVtZW50KFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIEV4cHJlc3Npb24gaXRlcmFibGUsCiAgICAgIFN0YXRlbWVudCBwcm9sb2d1ZSwgRXhwcmVzc2lvbiBib2R5LCBFeHByZXNzaW9uIHByb2JsZW0sIFRva2VuIHRva2VuLAogICAgICB7Ym9vbCBpc0FzeW5jOiBmYWxzZX0pIHsKICAgIHJldHVybiBuZXcgRm9ySW5FbGVtZW50KHZhcmlhYmxlLCBpdGVyYWJsZSwgcHJvbG9ndWUsIGJvZHksIHByb2JsZW0sCiAgICAgICAgaXNBc3luYzogaXNBc3luYykKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwRW50cnkgZm9ySW5NYXBFbnRyeShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBFeHByZXNzaW9uIGl0ZXJhYmxlLAogICAgICBTdGF0ZW1lbnQgcHJvbG9ndWUsIE1hcEVudHJ5IGJvZHksIEV4cHJlc3Npb24gcHJvYmxlbSwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzQXN5bmM6IGZhbHNlfSkgewogICAgcmV0dXJuIG5ldyBGb3JJbk1hcEVudHJ5KHZhcmlhYmxlLCBpdGVyYWJsZSwgcHJvbG9ndWUsIGJvZHksIHByb2JsZW0sCiAgICAgICAgaXNBc3luYzogaXNBc3luYykKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgQXNzZXJ0SW5pdGlhbGl6ZXIgYXNzZXJ0SW5pdGlhbGl6ZXIoCiAgICAgIFRva2VuIGFzc2VydEtleXdvcmQsCiAgICAgIFRva2VuIGxlZnRQYXJlbnRoZXNpcywKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24sCiAgICAgIFRva2VuIGNvbW1hLAogICAgICBFeHByZXNzaW9uIG1lc3NhZ2UpIHsKICAgIHJldHVybiBuZXcgQXNzZXJ0SW5pdGlhbGl6ZXJKdWRnbWVudChhc3NlcnRTdGF0ZW1lbnQoCiAgICAgICAgYXNzZXJ0S2V5d29yZCwgbGVmdFBhcmVudGhlc2lzLCBjb25kaXRpb24sIGNvbW1hLCBtZXNzYWdlLCBudWxsKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50KFRva2VuIGFzc2VydEtleXdvcmQsIFRva2VuIGxlZnRQYXJlbnRoZXNpcywKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24sIFRva2VuIGNvbW1hLCBFeHByZXNzaW9uIG1lc3NhZ2UsIFRva2VuIHNlbWljb2xvbikgewogICAgLy8gQ29tcHV0ZSBzdGFydCBhbmQgZW5kIG9mZnNldHMgZm9yIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbi4KICAgIC8vIFRoaXMgY29kZSBpcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGJlY2F1c2UgZXhwcmVzc2lvbnMgZG9uJ3QgY2FycnkKICAgIC8vIHRoZWlyIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0cyBjdXJyZW50bHkuCiAgICAvLwogICAgLy8gVGhlIHRva2VuIHRoYXQgZm9sbG93cyBsZWZ0UGFyZW50aGVzaXMgaXMgY29uc2lkZXJlZCB0byBiZSB0aGUKICAgIC8vIGZpcnN0IHRva2VuIG9mIHRoZSBjb25kaXRpb24uCiAgICAvLyBUT0RPKGFoZSk6IHRoaXMgcmVhbGx5IHNob3VsZCBiZSBjb25kaXRpb24uZmlsZU9mZnNldC4KICAgIGludCBzdGFydE9mZnNldCA9IGxlZnRQYXJlbnRoZXNpcy5uZXh0Lm9mZnNldDsKICAgIGludCBlbmRPZmZzZXQ7CiAgICB7CiAgICAgIC8vIFNlYXJjaCBmb3J3YXJkIGZyb20gbGVmdFBhcmVudGhlc2lzIHRvIGZpbmQgdGhlIGxhc3QgdG9rZW4gb2YKICAgICAgLy8gdGhlIGNvbmRpdGlvbiAtIHdoaWNoIGlzIGEgdG9rZW4gaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBjb21tYVRva2VuLAogICAgICAvLyByaWdodCBwYXJlbnRoZXNpcyBvciBhIHRyYWlsaW5nIGNvbW1hLgogICAgICBUb2tlbiBjb25kaXRpb25Cb3VuZGFyeSA9IGNvbW1hID8/IGxlZnRQYXJlbnRoZXNpcy5lbmRHcm91cDsKICAgICAgVG9rZW4gY29uZGl0aW9uTGFzdFRva2VuID0gbGVmdFBhcmVudGhlc2lzOwogICAgICB3aGlsZSAoIWNvbmRpdGlvbkxhc3RUb2tlbi5pc0VvZikgewogICAgICAgIFRva2VuIG5leHRUb2tlbiA9IGNvbmRpdGlvbkxhc3RUb2tlbi5uZXh0OwogICAgICAgIGlmIChuZXh0VG9rZW4gPT0gY29uZGl0aW9uQm91bmRhcnkpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJywnLCBuZXh0VG9rZW4pICYmCiAgICAgICAgICAgIG5leHRUb2tlbi5uZXh0ID09IGNvbmRpdGlvbkJvdW5kYXJ5KSB7CiAgICAgICAgICAvLyBUaGUgbmV4dCB0b2tlbiBpcyB0cmFpbGluZyBjb21tYSwgd2hpY2ggbWVhbnMgY3VycmVudCB0b2tlbiBpcwogICAgICAgICAgLy8gdGhlIGxhc3QgdG9rZW4gb2YgdGhlIGNvbmRpdGlvbi4KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjb25kaXRpb25MYXN0VG9rZW4gPSBuZXh0VG9rZW47CiAgICAgIH0KICAgICAgaWYgKGNvbmRpdGlvbkxhc3RUb2tlbi5pc0VvZikgewogICAgICAgIGVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ID0gLTE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZW5kT2Zmc2V0ID0gY29uZGl0aW9uTGFzdFRva2VuLm9mZnNldCArIGNvbmRpdGlvbkxhc3RUb2tlbi5sZW5ndGg7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgQXNzZXJ0U3RhdGVtZW50SnVkZ21lbnQoY29uZGl0aW9uLAogICAgICAgIGNvbmRpdGlvblN0YXJ0T2Zmc2V0OiBzdGFydE9mZnNldCwKICAgICAgICBjb25kaXRpb25FbmRPZmZzZXQ6IGVuZE9mZnNldCwKICAgICAgICBtZXNzYWdlOiBtZXNzYWdlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYXdhaXRFeHByZXNzaW9uKEV4cHJlc3Npb24gb3BlcmFuZCwgVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBuZXcgQXdhaXRFeHByZXNzaW9uKG9wZXJhbmQpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IGJsb2NrKAogICAgICBUb2tlbiBvcGVuQnJhY2UsIExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzLCBUb2tlbiBjbG9zZUJyYWNlKSB7CiAgICBMaXN0PFN0YXRlbWVudD4gY29weTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gc3RhdGVtZW50c1tpXTsKICAgICAgaWYgKHN0YXRlbWVudCBpcyBfVmFyaWFibGVzRGVjbGFyYXRpb24pIHsKICAgICAgICBjb3B5ID8/PSBuZXcgTGlzdDxTdGF0ZW1lbnQ+LmZyb20oc3RhdGVtZW50cy5nZXRSYW5nZSgwLCBpKSk7CiAgICAgICAgY29weS5hZGRBbGwoc3RhdGVtZW50LmRlY2xhcmF0aW9ucyk7CiAgICAgIH0gZWxzZSBpZiAoY29weSAhPSBudWxsKSB7CiAgICAgICAgY29weS5hZGQoc3RhdGVtZW50KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBCbG9ja0p1ZGdtZW50KGNvcHkgPz8gc3RhdGVtZW50cykKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4ob3BlbkJyYWNlKTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudCBicmVha1N0YXRlbWVudChUb2tlbiBicmVha0tleXdvcmQsIE9iamVjdCBsYWJlbCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICByZXR1cm4gbmV3IEJyZWFrU3RhdGVtZW50KG51bGwpLi5maWxlT2Zmc2V0ID0gYnJlYWtLZXl3b3JkLmNoYXJPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBDYXRjaCBjYXRjaENsYXVzZSgKICAgICAgVG9rZW4gb25LZXl3b3JkLAogICAgICBEYXJ0VHlwZSBleGNlcHRpb25UeXBlLAogICAgICBUb2tlbiBjYXRjaEtleXdvcmQsCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZXhjZXB0aW9uUGFyYW1ldGVyLAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHN0YWNrVHJhY2VQYXJhbWV0ZXIsCiAgICAgIERhcnRUeXBlIHN0YWNrVHJhY2VUeXBlLAogICAgICBTdGF0ZW1lbnQgYm9keSkgewogICAgcmV0dXJuIG5ldyBDYXRjaEp1ZGdtZW50KGV4Y2VwdGlvblBhcmFtZXRlciwgYm9keSwKICAgICAgICBndWFyZDogZXhjZXB0aW9uVHlwZSwgc3RhY2tUcmFjZTogc3RhY2tUcmFjZVBhcmFtZXRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4ob25LZXl3b3JkID8/IGNhdGNoS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGNvbmRpdGlvbmFsRXhwcmVzc2lvbihFeHByZXNzaW9uIGNvbmRpdGlvbiwgVG9rZW4gcXVlc3Rpb24sCiAgICAgIEV4cHJlc3Npb24gdGhlbkV4cHJlc3Npb24sIFRva2VuIGNvbG9uLCBFeHByZXNzaW9uIGVsc2VFeHByZXNzaW9uKSB7CiAgICByZXR1cm4gbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICBjb25kaXRpb24sIHRoZW5FeHByZXNzaW9uLCBlbHNlRXhwcmVzc2lvbiwgbnVsbCkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4ocXVlc3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IGNvbnRpbnVlU3RhdGVtZW50KAogICAgICBUb2tlbiBjb250aW51ZUtleXdvcmQsIE9iamVjdCBsYWJlbCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICByZXR1cm4gbmV3IEJyZWFrU3RhdGVtZW50KG51bGwpLi5maWxlT2Zmc2V0ID0gY29udGludWVLZXl3b3JkLmNoYXJPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnQgZG9TdGF0ZW1lbnQoVG9rZW4gZG9LZXl3b3JkLCBTdGF0ZW1lbnQgYm9keSwgVG9rZW4gd2hpbGVLZXl3b3JkLAogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICByZXR1cm4gbmV3IERvSnVkZ21lbnQoYm9keSwgY29uZGl0aW9uKS4uZmlsZU9mZnNldCA9IGRvS2V5d29yZC5jaGFyT2Zmc2V0OwogIH0KCiAgU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblN0YXRlbWVudEp1ZGdtZW50KGV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IGVtcHR5U3RhdGVtZW50KFRva2VuIHNlbWljb2xvbikgewogICAgcmV0dXJuIG5ldyBFbXB0eVN0YXRlbWVudEp1ZGdtZW50KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnQgZm9yU3RhdGVtZW50KAogICAgICBUb2tlbiBmb3JLZXl3b3JkLAogICAgICBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsCiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzLAogICAgICBUb2tlbiBsZWZ0U2VwYXJhdG9yLAogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiwKICAgICAgU3RhdGVtZW50IGNvbmRpdGlvblN0YXRlbWVudCwKICAgICAgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGVycywKICAgICAgVG9rZW4gcmlnaHRQYXJlbnRoZXNpcywKICAgICAgU3RhdGVtZW50IGJvZHkpIHsKICAgIHJldHVybiBuZXcgRm9ySnVkZ21lbnQodmFyaWFibGVzLCBjb25kaXRpb24sIHVwZGF0ZXJzLCBib2R5KQogICAgICAuLmZpbGVPZmZzZXQgPSBmb3JLZXl3b3JkLmNoYXJPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnQgaWZTdGF0ZW1lbnQoVG9rZW4gaWZLZXl3b3JkLCBFeHByZXNzaW9uIGNvbmRpdGlvbiwKICAgICAgU3RhdGVtZW50IHRoZW5TdGF0ZW1lbnQsIFRva2VuIGVsc2VLZXl3b3JkLCBTdGF0ZW1lbnQgZWxzZVN0YXRlbWVudCkgewogICAgcmV0dXJuIG5ldyBJZkp1ZGdtZW50KGNvbmRpdGlvbiwgdGhlblN0YXRlbWVudCwgZWxzZVN0YXRlbWVudCkKICAgICAgLi5maWxlT2Zmc2V0ID0gaWZLZXl3b3JkLmNoYXJPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGlzRXhwcmVzc2lvbigKICAgICAgRXhwcmVzc2lvbiBvcGVyYW5kLCBUb2tlbiBpc09wZXJhdG9yLCBUb2tlbiBub3RPcGVyYXRvciwgRGFydFR5cGUgdHlwZSkgewogICAgRXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgSXNFeHByZXNzaW9uKG9wZXJhbmQsIHR5cGUpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKGlzT3BlcmF0b3IpOwogICAgaWYgKG5vdE9wZXJhdG9yICE9IG51bGwpIHsKICAgICAgcmVzdWx0ID0gbm90RXhwcmVzc2lvbihyZXN1bHQsIG5vdE9wZXJhdG9yLCBmYWxzZSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IGxhYmVsZWRTdGF0ZW1lbnQoTGFiZWxUYXJnZXQgdGFyZ2V0LCBTdGF0ZW1lbnQgc3RhdGVtZW50KSA9PgogICAgICBzdGF0ZW1lbnQ7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gbG9naWNhbEV4cHJlc3Npb24oCiAgICAgIEV4cHJlc3Npb24gbGVmdE9wZXJhbmQsIFRva2VuIG9wZXJhdG9yLCBFeHByZXNzaW9uIHJpZ2h0T3BlcmFuZCkgewogICAgcmV0dXJuIG5ldyBMb2dpY2FsRXhwcmVzc2lvbigKICAgICAgICBsZWZ0T3BlcmFuZCwgb3BlcmF0b3Iuc3RyaW5nVmFsdWUsIHJpZ2h0T3BlcmFuZCkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4ob3BlcmF0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBub3RFeHByZXNzaW9uKEV4cHJlc3Npb24gb3BlcmFuZCwgVG9rZW4gdG9rZW4sIGJvb2wgaXNTeW50aGV0aWMpIHsKICAgIHJldHVybiBuZXcgTm90KG9wZXJhbmQpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBwYXJlbnRoZXNpemVkQ29uZGl0aW9uKAogICAgICBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVG9rZW4gcmlnaHRQYXJlbnRoZXNpcykgewogICAgcmV0dXJuIGV4cHJlc3Npb247CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnQgcmV0aHJvd1N0YXRlbWVudChUb2tlbiByZXRocm93S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnRKdWRnbWVudCgKICAgICAgICBuZXcgUmV0aHJvdygpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4ocmV0aHJvd0tleXdvcmQpKTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQoCiAgICAgIFRva2VuIHJldHVybktleXdvcmQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICByZXR1cm4gbmV3IFJldHVybkp1ZGdtZW50KHJldHVybktleXdvcmQ/LmxleGVtZSwgZXhwcmVzc2lvbikKICAgICAgLi5maWxlT2Zmc2V0ID0gcmV0dXJuS2V5d29yZC5jaGFyT2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBzdHJpbmdDb25jYXRlbmF0aW9uRXhwcmVzc2lvbigKICAgICAgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucywgVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbihleHByZXNzaW9ucykKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IHN5bnRoZXRpY0xhYmVsZWRTdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgcmV0dXJuIG5ldyBMYWJlbGVkU3RhdGVtZW50KHN0YXRlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHRoaXNFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gbmV3IFRoaXNFeHByZXNzaW9uKCkuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHRocm93RXhwcmVzc2lvbihUb2tlbiB0aHJvd0tleXdvcmQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgcmV0dXJuIG5ldyBUaHJvdyhleHByZXNzaW9uKS4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRocm93S2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVGhyb3coT2JqZWN0IG8pID0+IG8gaXMgVGhyb3c7CgogIEBvdmVycmlkZQogIFN0YXRlbWVudCB0cnlTdGF0ZW1lbnQoVG9rZW4gdHJ5S2V5d29yZCwgU3RhdGVtZW50IGJvZHksCiAgICAgIExpc3Q8Q2F0Y2g+IGNhdGNoQ2xhdXNlcywgVG9rZW4gZmluYWxseUtleXdvcmQsIFN0YXRlbWVudCBmaW5hbGx5QmxvY2spIHsKICAgIFN0YXRlbWVudCByZXN1bHQgPSBib2R5OwogICAgaWYgKGNhdGNoQ2xhdXNlcyAhPSBudWxsKSB7CiAgICAgIHJlc3VsdCA9IG5ldyBUcnlDYXRjaEp1ZGdtZW50KHJlc3VsdCwgY2F0Y2hDbGF1c2VzKTsKICAgIH0KICAgIGlmIChmaW5hbGx5QmxvY2sgIT0gbnVsbCkgewogICAgICByZXN1bHQgPSBuZXcgVHJ5RmluYWxseUp1ZGdtZW50KHJlc3VsdCwgZmluYWxseUJsb2NrKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBfVmFyaWFibGVzRGVjbGFyYXRpb24gdmFyaWFibGVzRGVjbGFyYXRpb24oCiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gZGVjbGFyYXRpb25zLCBVcmkgdXJpKSB7CiAgICByZXR1cm4gbmV3IF9WYXJpYWJsZXNEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsIHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlc0RlY2xhcmF0aW9uRXh0cmFjdERlY2xhcmF0aW9ucygKICAgICAgX1ZhcmlhYmxlc0RlY2xhcmF0aW9uIHZhcmlhYmxlc0RlY2xhcmF0aW9uKSB7CiAgICByZXR1cm4gdmFyaWFibGVzRGVjbGFyYXRpb24uZGVjbGFyYXRpb25zOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IHdyYXBWYXJpYWJsZXMoU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgaWYgKHN0YXRlbWVudCBpcyBfVmFyaWFibGVzRGVjbGFyYXRpb24pIHsKICAgICAgcmV0dXJuIG5ldyBCbG9ja0p1ZGdtZW50KAogICAgICAgICAgbmV3IExpc3Q8U3RhdGVtZW50Pi5mcm9tKHN0YXRlbWVudC5kZWNsYXJhdGlvbnMsIGdyb3dhYmxlOiB0cnVlKSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBzdGF0ZW1lbnQuZmlsZU9mZnNldDsKICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50IGlzIFZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgcmV0dXJuIG5ldyBCbG9ja0p1ZGdtZW50KDxTdGF0ZW1lbnQ+W3N0YXRlbWVudF0pCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gc3RhdGVtZW50LmZpbGVPZmZzZXQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gc3RhdGVtZW50OwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IHdoaWxlU3RhdGVtZW50KAogICAgICBUb2tlbiB3aGlsZUtleXdvcmQsIEV4cHJlc3Npb24gY29uZGl0aW9uLCBTdGF0ZW1lbnQgYm9keSkgewogICAgcmV0dXJuIG5ldyBXaGlsZUp1ZGdtZW50KGNvbmRpdGlvbiwgYm9keSkKICAgICAgLi5maWxlT2Zmc2V0ID0gd2hpbGVLZXl3b3JkLmNoYXJPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnQgeWllbGRTdGF0ZW1lbnQoCiAgICAgIFRva2VuIHlpZWxkS2V5d29yZCwgVG9rZW4gc3RhciwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIHJldHVybiBuZXcgWWllbGRKdWRnbWVudChzdGFyICE9IG51bGwsIGV4cHJlc3Npb24pCiAgICAgIC4uZmlsZU9mZnNldCA9IHlpZWxkS2V5d29yZC5jaGFyT2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uRnJvbUV4cHJlc3Npb25TdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgcmV0dXJuIChzdGF0ZW1lbnQgYXMgRXhwcmVzc2lvblN0YXRlbWVudCkuZXhwcmVzc2lvbjsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNCbG9jayhPYmplY3Qgbm9kZSkgPT4gbm9kZSBpcyBCbG9jazsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0VtcHR5U3RhdGVtZW50KFN0YXRlbWVudCBzdGF0ZW1lbnQpID0+IHN0YXRlbWVudCBpcyBFbXB0eVN0YXRlbWVudDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Vycm9uZW91c05vZGUoT2JqZWN0IG5vZGUpIHsKICAgIGlmIChub2RlIGlzIEV4cHJlc3Npb25TdGF0ZW1lbnQpIHsKICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSBub2RlOwogICAgICBub2RlID0gc3RhdGVtZW50LmV4cHJlc3Npb247CiAgICB9CiAgICBpZiAobm9kZSBpcyBWYXJpYWJsZURlY2xhcmF0aW9uKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBub2RlOwogICAgICBub2RlID0gdmFyaWFibGUuaW5pdGlhbGl6ZXI7CiAgICB9CiAgICBpZiAobm9kZSBpcyBTeW50aGV0aWNFeHByZXNzaW9uSnVkZ21lbnQpIHsKICAgICAgU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50IHN5bnRoID0gbm9kZTsKICAgICAgbm9kZSA9IHN5bnRoLmRlc3VnYXJlZDsKICAgIH0KICAgIGlmIChub2RlIGlzIExldCkgewogICAgICBMZXQgbGV0ID0gbm9kZTsKICAgICAgbm9kZSA9IGxldC52YXJpYWJsZS5pbml0aWFsaXplcjsKICAgIH0KICAgIHJldHVybiBub2RlIGlzIEludmFsaWRFeHByZXNzaW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0V4cHJlc3Npb25TdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCkgPT4KICAgICAgc3RhdGVtZW50IGlzIEV4cHJlc3Npb25TdGF0ZW1lbnQ7CgogIEBvdmVycmlkZQogIGJvb2wgaXNUaGlzRXhwcmVzc2lvbihPYmplY3Qgbm9kZSkgPT4gbm9kZSBpcyBUaGlzRXhwcmVzc2lvbjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1ZhcmlhYmxlc0RlY2xhcmF0aW9uKE9iamVjdCBub2RlKSA9PiBub2RlIGlzIF9WYXJpYWJsZXNEZWNsYXJhdGlvbjsKfQoKY2xhc3MgX1ZhcmlhYmxlc0RlY2xhcmF0aW9uIGV4dGVuZHMgU3RhdGVtZW50IHsKICBmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IGRlY2xhcmF0aW9uczsKICBmaW5hbCBVcmkgdXJpOwoKICBfVmFyaWFibGVzRGVjbGFyYXRpb24odGhpcy5kZWNsYXJhdGlvbnMsIHRoaXMudXJpKSB7CiAgICBzZXRQYXJlbnRzKGRlY2xhcmF0aW9ucywgdGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQodikgewogICAgdW5zdXBwb3J0ZWQoImFjY2VwdCIsIGZpbGVPZmZzZXQsIHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQxKHYsIGFyZykgewogICAgdW5zdXBwb3J0ZWQoImFjY2VwdDEiLCBmaWxlT2Zmc2V0LCB1cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDaGlsZHJlbih2KSB7CiAgICB1bnN1cHBvcnRlZCgidmlzaXRDaGlsZHJlbiIsIGZpbGVPZmZzZXQsIHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB0cmFuc2Zvcm1DaGlsZHJlbih2KSB7CiAgICB1bnN1cHBvcnRlZCgidHJhbnNmb3JtQ2hpbGRyZW4iLCBmaWxlT2Zmc2V0LCB1cmkpOwogIH0KfQqCjQBOTjwBFwEiASEJExYbGQ8VGA8eHxIYFB0bFhoNGxsSGQ0VERMdFxgPEh0UATcBLAElAS0BGgkUFhcVExQXASAJGyMhFxcUGCAlFRQVHR0cGBwfHyUaHB0XFwEiARsfEwEMSD1JLAQBDDItBAEMPhwEAQw+IQQBDD8cBAEMTkcEAQw8AQw1RwQBDDxKBAEMMzEsBAEMR0YEAQwjGhQbHBkkHFA7MDZCBAEMIRoUGxwXJBpQOy82QAQBDCEaFBgaHBceGlA7K0JABAEMKUIEAQw7SQQBDE1QBAEMTVAEAQxATgQBDEVJBAEMNAEMTjsEAQxCMQQBDE8uLAQBDEFBLAQBDD4rNSwEAQwXTjYsBAEMGSscIBcVPywEAQwYKxwgFRVALAQBDE1MH0kaLAQBDExKH0oaLAQBDCcbHRwTHDpLBAEMSFBDSy4HRiU+MxMGR1AwQzIqMy4RLzNMLhEKKAgmJg9LCAYyKycbBAEMQE0EAQwTRxoyKzBGLSEdCAYxMAQBDFBLBAEMFRceGi4vHxg3P0AEAQxJSyY5LwQBDB8+TgQBDE0vTwQBSjgEAQwuKQQBDBoYHSsbHCQhHhhBLAQBDD9NQysEAQwbUDgxHzoGEwQBDEkRAQwgSSI5LwQBDFBBBAEMJU4XBAEMRixFBAEMHUVBLwQBDCwzMCwEAQw9LAQBDCtFBAEMSk0EAQwoAQw7UB0gOwYgPQYTBAEMLjk5BAEMRTQuBAEMMS4gTC0zNy0NGAYEAQwcQi4uBAEMHFA3LgQBDEk6BAEMLgEMTQEMJicsIwYnKyMGLzAeBhcWJwYmBAEMNSgBDEABDE0CATAwEQE3JAQBDA4sBAEMFC0EAQwVMwQBDBk3BAIBL3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvZmFuZ29ybi5kYXJ0N3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvZm9yZXN0LmRhcnS8DS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmZvcmVzdDsKCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHMsCiAgICAgICAgQ2F0Y2gsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRXhwcmVzc2lvbiwKICAgICAgICBMaWJyYXJ5RGVwZW5kZW5jeSwKICAgICAgICBNYXBFbnRyeSwKICAgICAgICBOYW1lZEV4cHJlc3Npb24sCiAgICAgICAgU3RhdGVtZW50LAogICAgICAgIFRyZWVOb2RlLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb247CgppbXBvcnQgJ2JvZHlfYnVpbGRlci5kYXJ0JyBzaG93IExhYmVsVGFyZ2V0OwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JyBzaG93IElkZW50aWZpZXI7CgppbXBvcnQgJy4uL3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbjsKCmV4cG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyBNZXNzYWdlOwoKZXhwb3J0ICdib2R5X2J1aWxkZXIuZGFydCcgc2hvdyBPcGVyYXRvcjsKCmV4cG9ydCAnY29uc3RuZXNzLmRhcnQnIHNob3cgQ29uc3RuZXNzOwoKZXhwb3J0ICdleHByZXNzaW9uX2dlbmVyYXRvci5kYXJ0JyBzaG93IEdlbmVyYXRvciwgUHJlZml4VXNlR2VuZXJhdG9yOwoKZXhwb3J0ICdleHByZXNzaW9uX2dlbmVyYXRvcl9oZWxwZXIuZGFydCcgc2hvdyBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyOwoKZXhwb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIElkZW50aWZpZXIsCiAgICAgICAgTG9hZExpYnJhcnlCdWlsZGVyLAogICAgICAgIFByZWZpeEJ1aWxkZXIsCiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciwKICAgICAgICBVbmxpbmtlZERlY2xhcmF0aW9uOwoKLy8vIEEgdHJlZSBmYWN0b3J5LgphYnN0cmFjdCBjbGFzcyBGb3Jlc3QgewogIGNvbnN0IEZvcmVzdCgpOwoKICBBcmd1bWVudHMgYXJndW1lbnRzKExpc3Q8RXhwcmVzc2lvbj4gcG9zaXRpb25hbCwgVG9rZW4gbG9jYXRpb24sCiAgICAgIHtMaXN0PERhcnRUeXBlPiB0eXBlcywgTGlzdDxOYW1lZEV4cHJlc3Npb24+IG5hbWVkfSk7CgogIEFyZ3VtZW50cyBhcmd1bWVudHNFbXB0eShUb2tlbiBsb2NhdGlvbik7CgogIExpc3Q8T2JqZWN0PiBhcmd1bWVudHNOYW1lZChBcmd1bWVudHMgYXJndW1lbnRzKTsKCiAgTGlzdDxFeHByZXNzaW9uPiBhcmd1bWVudHNQb3NpdGlvbmFsKEFyZ3VtZW50cyBhcmd1bWVudHMpOwoKICBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHNUeXBlQXJndW1lbnRzKEFyZ3VtZW50cyBhcmd1bWVudHMpOwoKICB2b2lkIGFyZ3VtZW50c1NldFR5cGVBcmd1bWVudHMoQXJndW1lbnRzIGFyZ3VtZW50cywgTGlzdDxEYXJ0VHlwZT4gdHlwZXMpOwoKICBFeHByZXNzaW9uIGFzTGl0ZXJhbFN0cmluZyhFeHByZXNzaW9uIHZhbHVlKTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgYm9vbGVhbiBsaXRlcmFsIGF0IHRoZSBnaXZlbiBbbG9jYXRpb25dLiBUaGUKICAvLy8gbGl0ZXJhbCBoYXMgdGhlIGdpdmVuIFt2YWx1ZV0uCiAgRXhwcmVzc2lvbiBsaXRlcmFsQm9vbChib29sIHZhbHVlLCBUb2tlbiBsb2NhdGlvbik7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIGRvdWJsZSBsaXRlcmFsIGF0IHRoZSBnaXZlbiBbbG9jYXRpb25dLiBUaGUKICAvLy8gbGl0ZXJhbCBoYXMgdGhlIGdpdmVuIFt2YWx1ZV0uCiAgRXhwcmVzc2lvbiBsaXRlcmFsRG91YmxlKGRvdWJsZSB2YWx1ZSwgVG9rZW4gbG9jYXRpb24pOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciBsaXRlcmFsIGF0IHRoZSBnaXZlbiBbbG9jYXRpb25dLiBUaGUKICAvLy8gbGl0ZXJhbCBoYXMgdGhlIGdpdmVuIFt2YWx1ZV0uCiAgRXhwcmVzc2lvbiBsaXRlcmFsSW50KGludCB2YWx1ZSwgVG9rZW4gbG9jYXRpb24pOwoKICBFeHByZXNzaW9uIGxpdGVyYWxMYXJnZUludChTdHJpbmcgbGl0ZXJhbCwgVG9rZW4gbG9jYXRpb24pOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBsaXN0IGxpdGVyYWwuIFRoZSBbY29uc3RLZXl3b3JkXSBpcyB0aGUKICAvLy8gbG9jYXRpb24gb2YgdGhlIGBjb25zdGAga2V5d29yZCwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIGtleXdvcmQuIFRoZQogIC8vLyBbaXNDb25zdF0gaXMgYHRydWVgIGlmIHRoZSBsaXRlcmFsIGlzIGVpdGhlciBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkgYQogIC8vLyBjb25zdGFudC4gVGhlIFt0eXBlQXJndW1lbnRdIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2luZ2xlIHZhbGlkCiAgLy8vIHR5cGUgYXJndW1lbnQgcHJlY2VkaW5nIHRoZSBsaXN0IGxpdGVyYWwsIG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyB0eXBlCiAgLy8vIGFyZ3VtZW50LCB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHR5cGUgYXJndW1lbnQsIG9yIGlmIHRoZSB0eXBlIGFyZ3VtZW50CiAgLy8vIGNhbm5vdCBiZSByZXNvbHZlZC4gVGhlIFt0eXBlQXJndW1lbnRzXSBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYWxsIG9mCiAgLy8vIHRoZSB0eXBlIGFyZ3VtZW50cyBwcmVjZWRpbmcgdGhlIGxpc3QgbGl0ZXJhbCwgb3IgYG51bGxgIGlmIHRoZXJlIGFyZSBubwogIC8vLyB0eXBlIGFyZ3VtZW50cy4gVGhlIFtsZWZ0QnJhY2tldF0gaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBgW2AuIFRoZSBsaXN0IG9mCiAgLy8vIFtleHByZXNzaW9uc10gaXMgYSBsaXN0IG9mIHRoZSByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGxpc3QgZWxlbWVudHMuIFRoZQogIC8vLyBbcmlnaHRCcmFja2V0XSBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGBdYC4KICBFeHByZXNzaW9uIGxpdGVyYWxMaXN0KAogICAgICBUb2tlbiBjb25zdEtleXdvcmQsCiAgICAgIGJvb2wgaXNDb25zdCwKICAgICAgT2JqZWN0IHR5cGVBcmd1bWVudCwKICAgICAgT2JqZWN0IHR5cGVBcmd1bWVudHMsCiAgICAgIFRva2VuIGxlZnRCcmFja2V0LAogICAgICBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zLAogICAgICBUb2tlbiByaWdodEJyYWNrZXQpOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBzZXQgbGl0ZXJhbC4gVGhlIFtjb25zdEtleXdvcmRdIGlzIHRoZQogIC8vLyBsb2NhdGlvbiBvZiB0aGUgYGNvbnN0YCBrZXl3b3JkLCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8ga2V5d29yZC4gVGhlCiAgLy8vIFtpc0NvbnN0XSBpcyBgdHJ1ZWAgaWYgdGhlIGxpdGVyYWwgaXMgZWl0aGVyIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSBhCiAgLy8vIGNvbnN0YW50LiBUaGUgW3R5cGVBcmd1bWVudF0gaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzaW5nbGUgdmFsaWQKICAvLy8gdHlwZSBhcmd1bWVudCBwcmVjZWRpbmcgdGhlIHNldCBsaXRlcmFsLCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gdHlwZQogIC8vLyBhcmd1bWVudCwgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSB0eXBlIGFyZ3VtZW50LCBvciBpZiB0aGUgdHlwZSBhcmd1bWVudAogIC8vLyBjYW5ub3QgYmUgcmVzb2x2ZWQuIFRoZSBbdHlwZUFyZ3VtZW50c10gaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBvZgogIC8vLyB0aGUgdHlwZSBhcmd1bWVudHMgcHJlY2VkaW5nIHRoZSBzZXQgbGl0ZXJhbCwgb3IgYG51bGxgIGlmIHRoZXJlIGFyZSBubwogIC8vLyB0eXBlIGFyZ3VtZW50cy4gVGhlIFtsZWZ0QnJhY2VdIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgYHtgLiBUaGUgbGlzdCBvZgogIC8vLyBbZXhwcmVzc2lvbnNdIGlzIGEgbGlzdCBvZiB0aGUgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBzZXQgZWxlbWVudHMuIFRoZQogIC8vLyBbcmlnaHRCcmFjZV0gaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBgfWAuCiAgRXhwcmVzc2lvbiBsaXRlcmFsU2V0KAogICAgICBUb2tlbiBjb25zdEtleXdvcmQsCiAgICAgIGJvb2wgaXNDb25zdCwKICAgICAgT2JqZWN0IHR5cGVBcmd1bWVudCwKICAgICAgT2JqZWN0IHR5cGVBcmd1bWVudHMsCiAgICAgIFRva2VuIGxlZnRCcmFjZSwKICAgICAgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucywKICAgICAgVG9rZW4gcmlnaHRCcmFjZSk7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIG1hcCBsaXRlcmFsLiBUaGUgW2NvbnN0S2V5d29yZF0gaXMgdGhlCiAgLy8vIGxvY2F0aW9uIG9mIHRoZSBgY29uc3RgIGtleXdvcmQsIG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBrZXl3b3JkLiBUaGUKICAvLy8gW2lzQ29uc3RdIGlzIGB0cnVlYCBpZiB0aGUgbGl0ZXJhbCBpcyBlaXRoZXIgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5IGEKICAvLy8gY29uc3RhbnQuIFRoZSBba2V5VHlwZV0gaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmaXJzdCB0eXBlIGFyZ3VtZW50CiAgLy8vIHByZWNlZGluZyB0aGUgbWFwIGxpdGVyYWwsIG9yIGBudWxsYCBpZiB0aGVyZSBhcmUgbm90IGV4YWN0bHkgdHdvIHR5cGUKICAvLy8gYXJndW1lbnRzIG9yIGlmIHRoZSBmaXJzdCB0eXBlIGFyZ3VtZW50IGNhbm5vdCBiZSByZXNvbHZlZC4gVGhlCiAgLy8vIFt2YWx1ZVR5cGVdIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2Vjb25kIHR5cGUgYXJndW1lbnQgcHJlY2VkaW5nCiAgLy8vIHRoZSBtYXAgbGl0ZXJhbCwgb3IgYG51bGxgIGlmIHRoZXJlIGFyZSBub3QgZXhhY3RseSB0d28gdHlwZSBhcmd1bWVudHMgb3IKICAvLy8gaWYgdGhlIHNlY29uZCB0eXBlIGFyZ3VtZW50IGNhbm5vdCBiZSByZXNvbHZlZC4gVGhlIFt0eXBlQXJndW1lbnRzXSBpcyB0aGUKICAvLy8gcmVwcmVzZW50YXRpb24gb2YgYWxsIG9mIHRoZSB0eXBlIGFyZ3VtZW50cyBwcmVjZWRpbmcgdGhlIG1hcCBsaXRlcmFsLCBvcgogIC8vLyBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vIHR5cGUgYXJndW1lbnRzLiBUaGUgW2xlZnRCcmFjZV0gaXMgdGhlIGxvY2F0aW9uCiAgLy8vIG9mIHRoZSBge2AuIFRoZSBsaXN0IG9mIFtlbnRyaWVzXSBpcyBhIGxpc3Qgb2YgdGhlIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUKICAvLy8gbWFwIGVudHJpZXMuIFRoZSBbcmlnaHRCcmFjZV0gaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBgfWAuCiAgRXhwcmVzc2lvbiBsaXRlcmFsTWFwKAogICAgICBUb2tlbiBjb25zdEtleXdvcmQsCiAgICAgIGJvb2wgaXNDb25zdCwKICAgICAgRGFydFR5cGUga2V5VHlwZSwKICAgICAgRGFydFR5cGUgdmFsdWVUeXBlLAogICAgICBPYmplY3QgdHlwZUFyZ3VtZW50cywKICAgICAgVG9rZW4gbGVmdEJyYWNlLAogICAgICBMaXN0PE1hcEVudHJ5PiBlbnRyaWVzLAogICAgICBUb2tlbiByaWdodEJyYWNlKTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgbnVsbCBsaXRlcmFsIGF0IHRoZSBnaXZlbiBbbG9jYXRpb25dLgogIEV4cHJlc3Npb24gbGl0ZXJhbE51bGwoVG9rZW4gbG9jYXRpb24pOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBzaW1wbGUgc3RyaW5nIGxpdGVyYWwgYXQgdGhlIGdpdmVuCiAgLy8vIFtsb2NhdGlvbl0uIFRoZSBsaXRlcmFsIGhhcyB0aGUgZ2l2ZW4gW3ZhbHVlXS4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlCiAgLy8vIGVpdGhlciBhZGphY2VudCBzdHJpbmdzIG9yIGludGVycG9sYXRlZCBzdHJpbmdzLgogIEV4cHJlc3Npb24gbGl0ZXJhbFN0cmluZyhTdHJpbmcgdmFsdWUsIFRva2VuIGxvY2F0aW9uKTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgc3ltYm9sIGxpdGVyYWwgZGVmaW5lZCBieSB0aGUgW2hhc2hdIGFuZCB0aGUKICAvLy8gbGlzdCBvZiBbY29tcG9uZW50c10uIFRoZSBbdmFsdWVdIGlzIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHN5bWJvbC4KICBFeHByZXNzaW9uIGxpdGVyYWxTeW1ib2xNdWx0aXBsZSgKICAgICAgU3RyaW5nIHZhbHVlLCBUb2tlbiBoYXNoLCBMaXN0PElkZW50aWZpZXI+IGNvbXBvbmVudHMpOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBzeW1ib2wgbGl0ZXJhbCBkZWZpbmVkIGJ5IHRoZSBbaGFzaF0gYW5kIHRoZQogIC8vLyBzaW5nbGUgW2NvbXBvbmVudF0uIFRoZSBjb21wb25lbnQgY2FuIGJlIGVpdGhlciBhbiBbSWRlbnRpZmllcl0gb3IgYW4KICAvLy8gW09wZXJhdG9yXS4gVGhlIFt2YWx1ZV0gaXMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgc3ltYm9sLgogIEV4cHJlc3Npb24gbGl0ZXJhbFN5bWJvbFNpbmdsdWFyKFN0cmluZyB2YWx1ZSwgVG9rZW4gaGFzaCwgT2JqZWN0IGNvbXBvbmVudCk7CgogIEV4cHJlc3Npb24gbGl0ZXJhbFR5cGUoRGFydFR5cGUgdHlwZSwgVG9rZW4gbG9jYXRpb24pOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBrZXkvdmFsdWUgcGFpciBpbiBhIGxpdGVyYWwgbWFwLiBUaGUgW2tleV0gaXMKICAvLy8gdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBleHByZXNzaW9uIHVzZWQgdG8gY29tcHV0ZSB0aGUga2V5LiBUaGUgW2NvbG9uXQogIC8vLyBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGNvbG9uIHNlcGFyYXRpbmcgdGhlIGtleSBhbmQgdGhlIHZhbHVlLiBUaGUgW3ZhbHVlXQogIC8vLyBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGV4cHJlc3Npb24gdXNlZCB0byBjb21wdXRlIHRoZSB2YWx1ZS4KICBPYmplY3QgbWFwRW50cnkoRXhwcmVzc2lvbiBrZXksIFRva2VuIGNvbG9uLCBFeHByZXNzaW9uIHZhbHVlKTsKCiAgaW50IHJlYWRPZmZzZXQoVHJlZU5vZGUgbm9kZSk7CgogIEV4cHJlc3Npb24gbG9hZExpYnJhcnkoTGlicmFyeURlcGVuZGVuY3kgZGVwZW5kZW5jeSwgQXJndW1lbnRzIGFyZ3VtZW50cyk7CgogIEV4cHJlc3Npb24gY2hlY2tMaWJyYXJ5SXNMb2FkZWQoTGlicmFyeURlcGVuZGVuY3kgZGVwZW5kZW5jeSk7CgogIEV4cHJlc3Npb24gYXNFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgRGFydFR5cGUgdHlwZSwgVG9rZW4gbG9jYXRpb24pOwoKICBFeHByZXNzaW9uIHNwcmVhZEVsZW1lbnQoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBUb2tlbiB0b2tlbik7CgogIEV4cHJlc3Npb24gaWZFbGVtZW50KAogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiwgRXhwcmVzc2lvbiB0aGVuLCBFeHByZXNzaW9uIG90aGVyd2lzZSwgVG9rZW4gdG9rZW4pOwoKICBNYXBFbnRyeSBpZk1hcEVudHJ5KAogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiwgTWFwRW50cnkgdGhlbiwgTWFwRW50cnkgb3RoZXJ3aXNlLCBUb2tlbiB0b2tlbik7CgogIEV4cHJlc3Npb24gZm9yRWxlbWVudCgKICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMsCiAgICAgIEV4cHJlc3Npb24gY29uZGl0aW9uLAogICAgICBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZXMsCiAgICAgIEV4cHJlc3Npb24gYm9keSwKICAgICAgVG9rZW4gdG9rZW4pOwoKICBNYXBFbnRyeSBmb3JNYXBFbnRyeSgKICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMsCiAgICAgIEV4cHJlc3Npb24gY29uZGl0aW9uLAogICAgICBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZXMsCiAgICAgIE1hcEVudHJ5IGJvZHksCiAgICAgIFRva2VuIHRva2VuKTsKCiAgRXhwcmVzc2lvbiBmb3JJbkVsZW1lbnQoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgRXhwcmVzc2lvbiBpdGVyYWJsZSwKICAgICAgU3RhdGVtZW50IHByb2xvZ3VlLCBFeHByZXNzaW9uIGJvZHksIEV4cHJlc3Npb24gcHJvYmxlbSwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzQXN5bmM6IGZhbHNlfSk7CgogIE1hcEVudHJ5IGZvckluTWFwRW50cnkoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgRXhwcmVzc2lvbiBpdGVyYWJsZSwKICAgICAgU3RhdGVtZW50IHByb2xvZ3VlLCBNYXBFbnRyeSBib2R5LCBFeHByZXNzaW9uIHByb2JsZW0sIFRva2VuIHRva2VuLAogICAgICB7Ym9vbCBpc0FzeW5jOiBmYWxzZX0pOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gYXNzZXJ0IHRoYXQgYXBwZWFycyBpbiBhIGNvbnN0cnVjdG9yJ3MKICAvLy8gaW5pdGlhbGl6ZXIgbGlzdC4KICBPYmplY3QgYXNzZXJ0SW5pdGlhbGl6ZXIoVG9rZW4gYXNzZXJ0S2V5d29yZCwgVG9rZW4gbGVmdFBhcmVudGhlc2lzLAogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiwgVG9rZW4gY29tbWEsIEV4cHJlc3Npb24gbWVzc2FnZSk7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBhc3NlcnQgdGhhdCBhcHBlYXJzIGFzIGEgc3RhdGVtZW50LgogIFN0YXRlbWVudCBhc3NlcnRTdGF0ZW1lbnQoVG9rZW4gYXNzZXJ0S2V5d29yZCwgVG9rZW4gbGVmdFBhcmVudGhlc2lzLAogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiwgVG9rZW4gY29tbWEsIEV4cHJlc3Npb24gbWVzc2FnZSwgVG9rZW4gc2VtaWNvbG9uKTsKCiAgRXhwcmVzc2lvbiBhd2FpdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBvcGVyYW5kLCBUb2tlbiBsb2NhdGlvbik7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIGJsb2NrIG9mIFtzdGF0ZW1lbnRzXSBlbmNsb3NlZCBiZXR3ZWVuIHRoZQogIC8vLyBbb3BlbkJyYWNrZXRdIGFuZCBbY2xvc2VCcmFja2V0XS4KICBTdGF0ZW1lbnQgYmxvY2soCiAgICAgIFRva2VuIG9wZW5CcmFjZSwgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHMsIFRva2VuIGNsb3NlQnJhY2UpOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBicmVhayBzdGF0ZW1lbnQuCiAgU3RhdGVtZW50IGJyZWFrU3RhdGVtZW50KAogICAgICBUb2tlbiBicmVha0tleXdvcmQsIElkZW50aWZpZXIgbGFiZWwsIFRva2VuIHNlbWljb2xvbik7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIGNhdGNoIGNsYXVzZS4KICBPYmplY3QgY2F0Y2hDbGF1c2UoCiAgICAgIFRva2VuIG9uS2V5d29yZCwKICAgICAgRGFydFR5cGUgZXhjZXB0aW9uVHlwZSwKICAgICAgVG9rZW4gY2F0Y2hLZXl3b3JkLAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGV4Y2VwdGlvblBhcmFtZXRlciwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBzdGFja1RyYWNlUGFyYW1ldGVyLAogICAgICBEYXJ0VHlwZSBzdGFja1RyYWNlVHlwZSwKICAgICAgU3RhdGVtZW50IGJvZHkpOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBjb25kaXRpb25hbCBleHByZXNzaW9uLiBUaGUgW2NvbmRpdGlvbl0gaXMKICAvLy8gdGhlIGV4cHJlc3Npb24gcHJlY2VkaW5nIHRoZSBxdWVzdGlvbiBtYXJrLiBUaGUgW3F1ZXN0aW9uXSBpcyB0aGUgYD9gLiBUaGUKICAvLy8gW3RoZW5FeHByZXNzaW9uXSBpcyB0aGUgZXhwcmVzc2lvbiBmb2xsb3dpbmcgdGhlIHF1ZXN0aW9uIG1hcmsuIFRoZQogIC8vLyBbY29sb25dIGlzIHRoZSBgOmAuIFRoZSBbZWxzZUV4cHJlc3Npb25dIGlzIHRoZSBleHByZXNzaW9uIGZvbGxvd2luZyB0aGUKICAvLy8gY29sb24uCiAgRXhwcmVzc2lvbiBjb25kaXRpb25hbEV4cHJlc3Npb24oRXhwcmVzc2lvbiBjb25kaXRpb24sIFRva2VuIHF1ZXN0aW9uLAogICAgICBFeHByZXNzaW9uIHRoZW5FeHByZXNzaW9uLCBUb2tlbiBjb2xvbiwgRXhwcmVzc2lvbiBlbHNlRXhwcmVzc2lvbik7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIGNvbnRpbnVlIHN0YXRlbWVudC4KICBTdGF0ZW1lbnQgY29udGludWVTdGF0ZW1lbnQoCiAgICAgIFRva2VuIGNvbnRpbnVlS2V5d29yZCwgSWRlbnRpZmllciBsYWJlbCwgVG9rZW4gc2VtaWNvbG9uKTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgZG8gc3RhdGVtZW50LgogIFN0YXRlbWVudCBkb1N0YXRlbWVudChUb2tlbiBkb0tleXdvcmQsIFN0YXRlbWVudCBib2R5LCBUb2tlbiB3aGlsZUtleXdvcmQsCiAgICAgIEV4cHJlc3Npb24gY29uZGl0aW9uLCBUb2tlbiBzZW1pY29sb24pOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQgY29tcG9zZWQgZnJvbSB0aGUKICAvLy8gW2V4cHJlc3Npb25dIGFuZCBbc2VtaWNvbG9uXS4KICBTdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uIGV4cHJlc3Npb24sIFRva2VuIHNlbWljb2xvbik7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBlbXB0eSBzdGF0ZW1lbnQgY29uc2lzdGluZyBvZiB0aGUgZ2l2ZW4KICAvLy8gW3NlbWljb2xvbl0uCiAgU3RhdGVtZW50IGVtcHR5U3RhdGVtZW50KFRva2VuIHNlbWljb2xvbik7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIGZvciBzdGF0ZW1lbnQuCiAgU3RhdGVtZW50IGZvclN0YXRlbWVudCgKICAgICAgVG9rZW4gZm9yS2V5d29yZCwKICAgICAgVG9rZW4gbGVmdFBhcmVudGhlc2lzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcywKICAgICAgVG9rZW4gbGVmdFNlcGFyYXRvciwKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24sCiAgICAgIFN0YXRlbWVudCBjb25kaXRpb25TdGF0ZW1lbnQsCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gdXBkYXRlcnMsCiAgICAgIFRva2VuIHJpZ2h0UGFyZW50aGVzaXMsCiAgICAgIFN0YXRlbWVudCBib2R5KTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIGBpZmAgc3RhdGVtZW50LgogIFN0YXRlbWVudCBpZlN0YXRlbWVudChUb2tlbiBpZktleXdvcmQsIEV4cHJlc3Npb24gY29uZGl0aW9uLAogICAgICBTdGF0ZW1lbnQgdGhlblN0YXRlbWVudCwgVG9rZW4gZWxzZUtleXdvcmQsIFN0YXRlbWVudCBlbHNlU3RhdGVtZW50KTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIGBpc2AgZXhwcmVzc2lvbi4gVGhlIFtvcGVyYW5kXSBpcyB0aGUKICAvLy8gcmVwcmVzZW50YXRpb24gb2YgdGhlIGxlZnQgb3BlcmFuZC4gVGhlIFtpc09wZXJhdG9yXSBpcyB0aGUgYGlzYCBvcGVyYXRvci4KICAvLy8gVGhlIFtub3RPcGVyYXRvcl0gaXMgZWl0aGVyIHRoZSBgIWAgb3IgYG51bGxgIGlmIHRoZSB0ZXN0IGlzIG5vdCBuZWdhdGVkLgogIC8vLyBUaGUgW3R5cGVdIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGUgdGhhdCBpcyB0aGUgcmlnaHQgb3BlcmFuZC4KICBFeHByZXNzaW9uIGlzRXhwcmVzc2lvbigKICAgICAgRXhwcmVzc2lvbiBvcGVyYW5kLCBUb2tlbiBpc09wZXJhdG9yLCBUb2tlbiBub3RPcGVyYXRvciwgRGFydFR5cGUgdHlwZSk7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIFtzdGF0ZW1lbnRdIHRoYXQgaGFzIG9uZSBvciBtb3JlIGxhYmVscyAoZnJvbQogIC8vLyB0aGUgW3RhcmdldF0pIGFzc29jaWF0ZWQgd2l0aCBpdC4KICBTdGF0ZW1lbnQgbGFiZWxlZFN0YXRlbWVudChMYWJlbFRhcmdldCB0YXJnZXQsIFN0YXRlbWVudCBzdGF0ZW1lbnQpOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBsb2dpY2FsIGV4cHJlc3Npb24gaGF2aW5nIHRoZSBbbGVmdE9wZXJhbmRdLAogIC8vLyBbcmlnaHRPcGVyYW5kXSBhbmQgdGhlIFtvcGVyYXRvcl0gKGVpdGhlciBgJiZgIG9yIGB8fGApLgogIEV4cHJlc3Npb24gbG9naWNhbEV4cHJlc3Npb24oCiAgICAgIEV4cHJlc3Npb24gbGVmdE9wZXJhbmQsIFRva2VuIG9wZXJhdG9yLCBFeHByZXNzaW9uIHJpZ2h0T3BlcmFuZCk7CgogIEV4cHJlc3Npb24gbm90RXhwcmVzc2lvbigKICAgICAgRXhwcmVzc2lvbiBvcGVyYW5kLCBUb2tlbiBsb2NhdGlvbiwgYm9vbCBpc1N5bnRoZXRpYyk7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIHBhcmVudGhlc2l6ZWQgY29uZGl0aW9uIGNvbnNpc3Rpbmcgb2YgdGhlCiAgLy8vIGdpdmVuIFtleHByZXNzaW9uXSBiZXR3ZWVuIHRoZSBbbGVmdFBhcmVudGhlc2lzXSBhbmQgW3JpZ2h0UGFyZW50aGVzaXNdLgogIE9iamVjdCBwYXJlbnRoZXNpemVkQ29uZGl0aW9uKAogICAgICBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVG9rZW4gcmlnaHRQYXJlbnRoZXNpcyk7CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIHJldGhyb3cgc3RhdGVtZW50IGNvbnNpc3Rpbmcgb2YgdGhlCiAgLy8vIFtyZXRocm93S2V5d29yZF0gZm9sbG93ZWQgYnkgdGhlIFtzZW1pY29sb25dLgogIFN0YXRlbWVudCByZXRocm93U3RhdGVtZW50KFRva2VuIHJldGhyb3dLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSByZXR1cm4gc3RhdGVtZW50LgogIFN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQoCiAgICAgIFRva2VuIHJldHVybktleXdvcmQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVG9rZW4gc2VtaWNvbG9uKTsKCiAgRXhwcmVzc2lvbiBzdHJpbmdDb25jYXRlbmF0aW9uRXhwcmVzc2lvbigKICAgICAgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucywgVG9rZW4gbG9jYXRpb24pOwoKICAvLy8gVGhlIGdpdmVuIFtzdGF0ZW1lbnRdIGlzIGJlaW5nIHVzZWQgYXMgdGhlIHRhcmdldCBvZiBlaXRoZXIgYSBicmVhayBvcgogIC8vLyBjb250aW51ZSBzdGF0ZW1lbnQuIFJldHVybiB0aGUgc3RhdGVtZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGFjdHVhbAogIC8vLyB0YXJnZXQuCiAgU3RhdGVtZW50IHN5bnRoZXRpY0xhYmVsZWRTdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCk7CgogIEV4cHJlc3Npb24gdGhpc0V4cHJlc3Npb24oVG9rZW4gbG9jYXRpb24pOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSB0aHJvdyBleHByZXNzaW9uIGNvbnNpc3Rpbmcgb2YgdGhlCiAgLy8vIFt0aHJvd0tleXdvcmRdLgogIEV4cHJlc3Npb24gdGhyb3dFeHByZXNzaW9uKFRva2VuIHRocm93S2V5d29yZCwgRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKCiAgYm9vbCBpc1Rocm93KE9iamVjdCBvKTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJ5IHN0YXRlbWVudC4gVGhlIHN0YXRlbWVudCBpcyBpbnRyb2R1Y2VkIGJ5CiAgLy8vIHRoZSBbdHJ5S2V5d29yZF0gYW5kIHRoZSBnaXZlbiBbYm9keV0uIElmIGNhdGNoIGNsYXVzZXMgd2VyZSBpbmNsdWRlZCwKICAvLy8gdGhlbiB0aGUgW2NhdGNoQ2xhdXNlc10gd2lsbCByZXByZXNlbnQgdGhlbSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYG51bGxgLgogIC8vLyBTaW1pbGFybHksIGlmIGEgZmluYWxseSBibG9jayB3YXMgaW5jbHVkZWQsIHRoZW4gdGhlIFtmaW5hbGx5S2V5d29yZF0gYW5kCiAgLy8vIFtmaW5hbGx5QmxvY2tdIHdpbGwgYmUgbm9uLWBudWxsYCwgb3RoZXJ3aXNlIGJvdGggd2lsbCBiZSBgbnVsbGAuIElmIHRoZXJlCiAgLy8vIHdhcyBhbiBlcnJvciBpbiBzb21lIHBhcnQgb2YgdGhlIHRyeSBzdGF0ZW1lbnQsIHRoZW4gYW4gW2Vycm9yUmVwbGFjZW1lbnRdCiAgLy8vIG1pZ2h0IGJlIHByb3ZpZGVkLCBpbiB3aGljaCBjYXNlIGl0IGNvdWxkIGJlIHJldHVybmVkIGluc3RlYWQgb2YgdGhlCiAgLy8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cnkgc3RhdGVtZW50LgogIFN0YXRlbWVudCB0cnlTdGF0ZW1lbnQoVG9rZW4gdHJ5S2V5d29yZCwgU3RhdGVtZW50IGJvZHksCiAgICAgIExpc3Q8Q2F0Y2g+IGNhdGNoQ2xhdXNlcywgVG9rZW4gZmluYWxseUtleXdvcmQsIFN0YXRlbWVudCBmaW5hbGx5QmxvY2spOwoKICBTdGF0ZW1lbnQgdmFyaWFibGVzRGVjbGFyYXRpb24oCiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gZGVjbGFyYXRpb25zLCBVcmkgdXJpKTsKCiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXNEZWNsYXJhdGlvbkV4dHJhY3REZWNsYXJhdGlvbnMoCiAgICAgIGNvdmFyaWFudCBTdGF0ZW1lbnQgdmFyaWFibGVzRGVjbGFyYXRpb24pOwoKICBTdGF0ZW1lbnQgd3JhcFZhcmlhYmxlcyhTdGF0ZW1lbnQgc3RhdGVtZW50KTsKCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgd2hpbGUgc3RhdGVtZW50IGludHJvZHVjZWQgYnkgdGhlCiAgLy8vIFt3aGlsZUtleXdvcmRdIGFuZCBjb25zaXN0aW5nIG9mIHRoZSBnaXZlbiBbY29uZGl0aW9uXSBhbmQgW2JvZHldLgogIFN0YXRlbWVudCB3aGlsZVN0YXRlbWVudCgKICAgICAgVG9rZW4gd2hpbGVLZXl3b3JkLCBFeHByZXNzaW9uIGNvbmRpdGlvbiwgU3RhdGVtZW50IGJvZHkpOwoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSB5aWVsZCBzdGF0ZW1lbnQgY29uc2lzdGluZyBvZiB0aGUKICAvLy8gW3lpZWxkS2V5d29yZF0sIFtzdGFyXSwgW2V4cHJlc3Npb25dLCBhbmQgW3NlbWljb2xvbl0uIFRoZSBbc3Rhcl0gaXMgbnVsbAogIC8vLyB3aGVuIG5vIHN0YXIgd2FzIGluY2x1ZGVkIGluIHRoZSBzb3VyY2UgY29kZS4KICBTdGF0ZW1lbnQgeWllbGRTdGF0ZW1lbnQoCiAgICAgIFRva2VuIHlpZWxkS2V5d29yZCwgVG9rZW4gc3RhciwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBUb2tlbiBzZW1pY29sb24pOwoKICAvLy8gUmV0dXJuIHRoZSBleHByZXNzaW9uIGZyb20gdGhlIGdpdmVuIGV4cHJlc3Npb24gW3N0YXRlbWVudF0uCiAgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uRnJvbUV4cHJlc3Npb25TdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCk7CgogIGJvb2wgaXNCbG9jayhPYmplY3Qgbm9kZSk7CgogIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbc3RhdGVtZW50XSBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW4gZW1wdHkKICAvLy8gc3RhdGVtZW50LgogIGJvb2wgaXNFbXB0eVN0YXRlbWVudChTdGF0ZW1lbnQgc3RhdGVtZW50KTsKCiAgYm9vbCBpc0Vycm9uZW91c05vZGUoT2JqZWN0IG5vZGUpOwoKICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW3N0YXRlbWVudF0gaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFuCiAgLy8vIGV4cHJlc3Npb24gc3RhdGVtZW50LgogIGJvb2wgaXNFeHByZXNzaW9uU3RhdGVtZW50KFN0YXRlbWVudCBzdGF0ZW1lbnQpOwoKICBib29sIGlzVGhpc0V4cHJlc3Npb24oT2JqZWN0IG5vZGUpOwoKICBib29sIGlzVmFyaWFibGVzRGVjbGFyYXRpb24oT2JqZWN0IG5vZGUpOwoKICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIG1ldGhvZCB3aGVuIGFsbCB1c2VycyBhcmUgbW92ZWQgaGVyZS4KICBBcmd1bWVudHMgY2FzdEFyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gYXJndW1lbnRzOwogIH0KfQqBewBOTjwBFgEiASEJEw8SFBsSGRMSHQEtAS4BJQErASoBKAFHAUoBHQkUHBcgHQEUGBIBQzwBLAE0AT0BPgFNATABUCU2AU8lOgFRJTQBPgFLTU5NTk5OT1BPMRoaFBscGSQbAUpNTk1NTk5OTk4vGRoUGxwXJBkBSk1OT01GTlBRUE1QQBkaFBgaHBceGQFJKgFGSzc6AVBLJD4BUExBUAE5AVFQUUlCASEBTQFBAVEBQAEYUQEXTQEZKxwgFxQBGCscIBUUAU1MHgFMSh4BSxhHPgFISE8BQgFOKBNGATQcPgExFhceGi4vHxcBTlFKTw1JSgE3H0EBMU0uAUskSQFMEy0BMhoYHSsbHCQhHhcBND9MAUpRUEwbTwFRKEcBUD8gSAEcPQFNTyFNAUc0RQE1HUQBLDUBTVEOPAEtAUYWSQEaAVFNUFBRUUsrO08BIjgBRTEBMAFFSRxBAUVQNBxPAUNIAR0BTxEuASUBSRwzASYBLAFCMRYEAgEucGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9mb3Jlc3QuZGFydEdzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2ltcGxpY2l0X3R5cGVfYXJndW1lbnQuZGFydISYLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRS5tZCBmaWxlLgoKbGlicmFyeSBmYXN0YS5pbXBsaWNpdF90eXBlX2FyZ3VtZW50OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cgRGFydFR5cGUsIERhcnRUeXBlVmlzaXRvciwgRGFydFR5cGVWaXNpdG9yMSwgVmlzaXRvcjsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQsIHVuc3VwcG9ydGVkOwoKLy8vIE1hcmtlciB0eXBlIHVzZWQgYXMgdHlwZSBhcmd1bWVudCBvbiBsaXN0LCBzZXQgYW5kIG1hcCBsaXRlcmFscyB3aGVuZXZlcgovLy8gdHlwZSBhcmd1bWVudHMgYXJlIG9taXR0ZWQgaW4gdGhlIHNvdXJjZS4KLy8vCi8vLyBBbGwgb2YgdGhlc2UgdHlwZXMgYXJlIHJlcGxhY2VkIGJ5IHRoZSB0eXBlIGluZmVyZW5jZS4gSXQgaXMgYW4gaW50ZXJuYWwKLy8vIGVycm9yIGlmIG9uZSBzdXJ2aXZlcyB0byB0aGUgZmluYWwgb3V0cHV0LgpjbGFzcyBJbXBsaWNpdFR5cGVBcmd1bWVudCBleHRlbmRzIERhcnRUeXBlIHsKICBjb25zdCBJbXBsaWNpdFR5cGVBcmd1bWVudCgpOwoKICBAb3ZlcnJpZGUKICBnZXQgbnVsbGFiaWxpdHkgPT4gdW5zdXBwb3J0ZWQoIm51bGxhYmlsaXR5IiwgLTEsIG51bGwpOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoRGFydFR5cGVWaXNpdG9yPE9iamVjdD4gdikgewogICAgdW5oYW5kbGVkKCIkcnVudGltZVR5cGUiLCAiJHt2LnJ1bnRpbWVUeXBlfSIsIC0xLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdDEoRGFydFR5cGVWaXNpdG9yMTxPYmplY3QsIE9iamVjdD4gdiwgYXJnKSB7CiAgICB1bmhhbmRsZWQoIiRydW50aW1lVHlwZSIsICIke3YucnVudGltZVR5cGV9IiwgLTEsIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yPE9iamVjdD4gdikgewogICAgdW5oYW5kbGVkKCIkcnVudGltZVR5cGUiLCAiJHt2LnJ1bnRpbWVUeXBlfSIsIC0xLCBudWxsKTsKICB9Cn0KJwBNTj8BJgEhPwE3AU0uBE0vLiABDDsBDCY9BAEMNT0EAQwlPQQCAT5wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2ltcGxpY2l0X3R5cGVfYXJndW1lbnQuZGFydEBzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL3R5cGVfYWxnb3JpdGhtcy5kYXJ0wAB++i8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQm90dG9tVHlwZSwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEYXJ0VHlwZVZpc2l0b3IsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRnVuY3Rpb25UeXBlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgSW52YWxpZFR5cGUsCiAgICAgICAgTmFtZWRUeXBlLAogICAgICAgIFR5cGVQYXJhbWV0ZXIsCiAgICAgICAgVHlwZVBhcmFtZXRlclR5cGUsCiAgICAgICAgVHlwZWRlZlR5cGUsCiAgICAgICAgVm9pZFR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBzaG93IGNvbnRhaW5zVHlwZVZhcmlhYmxlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9zcmMvYm91bmRzX2NoZWNrcy5kYXJ0JyBzaG93IFZhcmlhbmNlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC91dGlsL2dyYXBoLmRhcnQnIHNob3cgR3JhcGgsIGNvbXB1dGVTdHJvbmdDb21wb25lbnRzOwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIENsYXNzQnVpbGRlciwKICAgICAgICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyLAogICAgICAgIEZ1bmN0aW9uVHlwZUJ1aWxkZXIsCiAgICAgICAgTmFtZWRUeXBlQnVpbGRlciwKICAgICAgICBUeXBlQWxpYXNCdWlsZGVyLAogICAgICAgIFR5cGVCdWlsZGVyLAogICAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIsCiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlcjsKCmltcG9ydCAnLi4vZGlsbC9kaWxsX2NsYXNzX2J1aWxkZXIuZGFydCcgc2hvdyBEaWxsQ2xhc3NCdWlsZGVyOwoKaW1wb3J0ICcuLi9kaWxsL2RpbGxfdHlwZV9hbGlhc19idWlsZGVyLmRhcnQnIHNob3cgRGlsbFR5cGVBbGlhc0J1aWxkZXI7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgTG9jYXRlZE1lc3NhZ2UsCiAgICAgICAgdGVtcGxhdGVCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5LAogICAgICAgIHRlbXBsYXRlQm91bmRJc3N1ZVZpYUxvb3BOb25TaW1wbGljaXR5LAogICAgICAgIHRlbXBsYXRlQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzLAogICAgICAgIHRlbXBsYXRlTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2UsCiAgICAgICAgdGVtcGxhdGVOb25TaW1wbGVCb3VuZFZpYVZhcmlhYmxlOwoKZXhwb3J0ICdwYWNrYWdlOmtlcm5lbC9zcmMvYm91bmRzX2NoZWNrcy5kYXJ0JyBzaG93IFZhcmlhbmNlOwoKLy8gQ29tcHV0ZXMgdGhlIHZhcmlhbmNlIG9mIGEgdmFyaWFibGUgaW4gYSB0eXBlLiAgVGhlIGZ1bmN0aW9uIGNhbiBiZSBydW4KLy8gYmVmb3JlIHRoZSB0eXBlcyBhcmUgcmVzb2x2ZWQgdG8gY29tcHV0ZSB2YXJpYW5jZXMgb2YgdHlwZWRlZnMnIHR5cGUKLy8gdmFyaWFibGVzLiAgRm9yIHRoYXQgY2FzZSBpZiB0aGUgdHlwZSBoYXMgaXRzIGRlY2xhcmF0aW9uIHNldCB0byBudWxsIGFuZCBpdHMKLy8gbmFtZSBtYXRjaGVzIHRoYXQgb2YgdGhlIHZhcmlhYmxlLCBpdCdzIGludGVycHJldGVkIGFzIGFuIG9jY3VycmVuY2Ugb2YgYQovLyB0eXBlIHZhcmlhYmxlLgppbnQgY29tcHV0ZVZhcmlhbmNlKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUsIFR5cGVCdWlsZGVyIHR5cGUpIHsKICBpZiAodHlwZSBpcyBOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGRlY2xhcmF0aW9uID0gdHlwZS5kZWNsYXJhdGlvbjsKICAgIGlmIChkZWNsYXJhdGlvbiA9PSBudWxsIHx8IGRlY2xhcmF0aW9uIGlzIFR5cGVWYXJpYWJsZUJ1aWxkZXIpIHsKICAgICAgaWYgKHR5cGUubmFtZSA9PSB2YXJpYWJsZS5uYW1lKSB7CiAgICAgICAgcmV0dXJuIFZhcmlhbmNlLmNvdmFyaWFudDsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gVmFyaWFuY2UudW5yZWxhdGVkOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgICAgaW50IHJlc3VsdCA9IFZhcmlhbmNlLnVucmVsYXRlZDsKICAgICAgICBpZiAodHlwZS5hcmd1bWVudHMgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChUeXBlQnVpbGRlciBhcmd1bWVudCBpbiB0eXBlLmFyZ3VtZW50cykgewogICAgICAgICAgICByZXN1bHQgPSBWYXJpYW5jZS5tZWV0KHJlc3VsdCwgY29tcHV0ZVZhcmlhbmNlKHZhcmlhYmxlLCBhcmd1bWVudCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIFR5cGVBbGlhc0J1aWxkZXIpIHsKICAgICAgICBpbnQgcmVzdWx0ID0gVmFyaWFuY2UudW5yZWxhdGVkOwogICAgICAgIGlmICh0eXBlLmFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUuYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IFZhcmlhbmNlLm1lZXQoCiAgICAgICAgICAgICAgICByZXN1bHQsCiAgICAgICAgICAgICAgICBWYXJpYW5jZS5jb21iaW5lKAogICAgICAgICAgICAgICAgICAgIGNvbXB1dGVWYXJpYW5jZSh2YXJpYWJsZSwgdHlwZS5hcmd1bWVudHNbaV0pLAogICAgICAgICAgICAgICAgICAgIGNvbXB1dGVWYXJpYW5jZSgKICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlc1tpXSwgZGVjbGFyYXRpb24udHlwZSkpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICBpbnQgcmVzdWx0ID0gVmFyaWFuY2UudW5yZWxhdGVkOwogICAgaWYgKHR5cGUucmV0dXJuVHlwZSAhPSBudWxsKSB7CiAgICAgIHJlc3VsdCA9CiAgICAgICAgICBWYXJpYW5jZS5tZWV0KHJlc3VsdCwgY29tcHV0ZVZhcmlhbmNlKHZhcmlhYmxlLCB0eXBlLnJldHVyblR5cGUpKTsKICAgIH0KICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdHlwZVZhcmlhYmxlIGluIHR5cGUudHlwZVZhcmlhYmxlcykgewogICAgICAgIC8vIElmIFt2YXJpYWJsZV0gaXMgcmVmZXJlbmNlZCBpbiB0aGUgYm91bmQgYXQgYWxsLCBpdCBtYWtlcyB0aGUKICAgICAgICAvLyB2YXJpYW5jZSBvZiBbdmFyaWFibGVdIGluIHRoZSBlbnRpcmUgdHlwZSBpbnZhcmlhbnQuICBUaGUgaW52b2NhdGlvbgogICAgICAgIC8vIG9mIFtjb21wdXRlVmFyaWFuY2VdIGJlbG93IGlzIG1hZGUgdG8gc2ltcGx5IGZpZ3VyZSBvdXQgaWYgW3ZhcmlhYmxlXQogICAgICAgIC8vIG9jY3VycyBpbiB0aGUgYm91bmQuCiAgICAgICAgaWYgKHR5cGVWYXJpYWJsZS5ib3VuZCAhPSBudWxsICYmCiAgICAgICAgICAgIGNvbXB1dGVWYXJpYW5jZSh2YXJpYWJsZSwgdHlwZVZhcmlhYmxlLmJvdW5kKSAhPQogICAgICAgICAgICAgICAgVmFyaWFuY2UudW5yZWxhdGVkKSB7CiAgICAgICAgICByZXN1bHQgPSBWYXJpYW5jZS5pbnZhcmlhbnQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAodHlwZS5mb3JtYWxzICE9IG51bGwpIHsKICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiB0eXBlLmZvcm1hbHMpIHsKICAgICAgICByZXN1bHQgPSBWYXJpYW5jZS5tZWV0KAogICAgICAgICAgICByZXN1bHQsCiAgICAgICAgICAgIFZhcmlhbmNlLmNvbWJpbmUoVmFyaWFuY2UuY29udHJhdmFyaWFudCwKICAgICAgICAgICAgICAgIGNvbXB1dGVWYXJpYW5jZSh2YXJpYWJsZSwgZm9ybWFsLnR5cGUpKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIHJldHVybiBWYXJpYW5jZS51bnJlbGF0ZWQ7Cn0KClR5cGVCdWlsZGVyIHN1YnN0aXR1dGVSYW5nZSgKICAgIFR5cGVCdWlsZGVyIHR5cGUsCiAgICBNYXA8VHlwZVZhcmlhYmxlQnVpbGRlciwgVHlwZUJ1aWxkZXI+IHVwcGVyU3Vic3RpdHV0aW9uLAogICAgTWFwPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIFR5cGVCdWlsZGVyPiBsb3dlclN1YnN0aXR1dGlvbiwKICAgIHtib29sIGlzQ292YXJpYW50ID0gdHJ1ZX0pIHsKICBpZiAodHlwZSBpcyBOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICBpZiAodHlwZS5kZWNsYXJhdGlvbiBpcyBUeXBlVmFyaWFibGVCdWlsZGVyKSB7CiAgICAgIGlmIChpc0NvdmFyaWFudCkgewogICAgICAgIHJldHVybiB1cHBlclN1YnN0aXR1dGlvblt0eXBlLmRlY2xhcmF0aW9uXSA/PyB0eXBlOwogICAgICB9CiAgICAgIHJldHVybiBsb3dlclN1YnN0aXR1dGlvblt0eXBlLmRlY2xhcmF0aW9uXSA/PyB0eXBlOwogICAgfQogICAgaWYgKHR5cGUuYXJndW1lbnRzID09IG51bGwgfHwgdHlwZS5hcmd1bWVudHMubGVuZ3RoID09IDApIHsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CiAgICBMaXN0PFR5cGVCdWlsZGVyPiBhcmd1bWVudHM7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUuYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFR5cGVCdWlsZGVyIHN1YnN0aXR1dGVkQXJndW1lbnQgPSBzdWJzdGl0dXRlUmFuZ2UoCiAgICAgICAgICB0eXBlLmFyZ3VtZW50c1tpXSwgdXBwZXJTdWJzdGl0dXRpb24sIGxvd2VyU3Vic3RpdHV0aW9uLAogICAgICAgICAgaXNDb3ZhcmlhbnQ6IGlzQ292YXJpYW50KTsKICAgICAgaWYgKHN1YnN0aXR1dGVkQXJndW1lbnQgIT0gdHlwZS5hcmd1bWVudHNbaV0pIHsKICAgICAgICBhcmd1bWVudHMgPz89IHR5cGUuYXJndW1lbnRzLnRvTGlzdCgpOwogICAgICAgIGFyZ3VtZW50c1tpXSA9IHN1YnN0aXR1dGVkQXJndW1lbnQ7CiAgICAgIH0KICAgIH0KICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IE5hbWVkVHlwZUJ1aWxkZXIodHlwZS5uYW1lLCBhcmd1bWVudHMpLi5iaW5kKHR5cGUuZGVjbGFyYXRpb24pOwogICAgfQogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHZhcmlhYmxlczsKICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICB2YXJpYWJsZXMgPSBuZXcgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPih0eXBlLnR5cGVWYXJpYWJsZXMubGVuZ3RoKTsKICAgIH0KICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFsczsKICAgIGlmICh0eXBlLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICBmb3JtYWxzID0gbmV3IExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4odHlwZS5mb3JtYWxzLmxlbmd0aCk7CiAgICB9CiAgICBUeXBlQnVpbGRlciByZXR1cm5UeXBlOwogICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CgogICAgaWYgKHR5cGUudHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSA9IHR5cGUudHlwZVZhcmlhYmxlc1tpXTsKICAgICAgICBUeXBlQnVpbGRlciBib3VuZCA9IHN1YnN0aXR1dGVSYW5nZSgKICAgICAgICAgICAgdmFyaWFibGUuYm91bmQsIHVwcGVyU3Vic3RpdHV0aW9uLCBsb3dlclN1YnN0aXR1dGlvbiwKICAgICAgICAgICAgaXNDb3ZhcmlhbnQ6IGlzQ292YXJpYW50KTsKICAgICAgICBpZiAoYm91bmQgIT0gdmFyaWFibGUuYm91bmQpIHsKICAgICAgICAgIHZhcmlhYmxlc1tpXSA9IG5ldyBUeXBlVmFyaWFibGVCdWlsZGVyKAogICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUsIHZhcmlhYmxlLnBhcmVudCwgdmFyaWFibGUuY2hhck9mZnNldCwgYm91bmQpOwogICAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhcmlhYmxlc1tpXSA9IHZhcmlhYmxlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmICh0eXBlLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvcm1hbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCA9IHR5cGUuZm9ybWFsc1tpXTsKICAgICAgICBUeXBlQnVpbGRlciBwYXJhbWV0ZXJUeXBlID0gc3Vic3RpdHV0ZVJhbmdlKAogICAgICAgICAgICBmb3JtYWwudHlwZSwgdXBwZXJTdWJzdGl0dXRpb24sIGxvd2VyU3Vic3RpdHV0aW9uLAogICAgICAgICAgICBpc0NvdmFyaWFudDogIWlzQ292YXJpYW50KTsKICAgICAgICBpZiAocGFyYW1ldGVyVHlwZSAhPSBmb3JtYWwudHlwZSkgewogICAgICAgICAgZm9ybWFsc1tpXSA9IG5ldyBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyKAogICAgICAgICAgICAgIGZvcm1hbC5tZXRhZGF0YSwKICAgICAgICAgICAgICBmb3JtYWwubW9kaWZpZXJzLAogICAgICAgICAgICAgIHBhcmFtZXRlclR5cGUsCiAgICAgICAgICAgICAgZm9ybWFsLm5hbWUsCiAgICAgICAgICAgICAgZm9ybWFsLnBhcmVudCwKICAgICAgICAgICAgICBmb3JtYWwuY2hhck9mZnNldCk7CiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9ybWFsc1tpXSA9IGZvcm1hbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm5UeXBlID0gc3Vic3RpdHV0ZVJhbmdlKAogICAgICAgIHR5cGUucmV0dXJuVHlwZSwgdXBwZXJTdWJzdGl0dXRpb24sIGxvd2VyU3Vic3RpdHV0aW9uLAogICAgICAgIGlzQ292YXJpYW50OiB0cnVlKTsKICAgIGlmIChyZXR1cm5UeXBlICE9IHR5cGUucmV0dXJuVHlwZSkgewogICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgIH0KCiAgICBpZiAoY2hhbmdlZCkgewogICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZUJ1aWxkZXIocmV0dXJuVHlwZSwgdmFyaWFibGVzLCBmb3JtYWxzKTsKICAgIH0KCiAgICByZXR1cm4gdHlwZTsKICB9CiAgcmV0dXJuIHR5cGU7Cn0KClR5cGVCdWlsZGVyIHN1YnN0aXR1dGUoCiAgICBUeXBlQnVpbGRlciB0eXBlLCBNYXA8VHlwZVZhcmlhYmxlQnVpbGRlciwgVHlwZUJ1aWxkZXI+IHN1YnN0aXR1dGlvbikgewogIHJldHVybiBzdWJzdGl0dXRlUmFuZ2UodHlwZSwgc3Vic3RpdHV0aW9uLCBzdWJzdGl0dXRpb24sIGlzQ292YXJpYW50OiB0cnVlKTsKfQoKLy8vIENhbGN1bGF0ZXMgYm91bmRzIHRvIGJlIHByb3ZpZGVkIGFzIHR5cGUgYXJndW1lbnRzIGluIHBsYWNlIG9mIG1pc3NpbmcgdHlwZQovLy8gYXJndW1lbnRzIG9uIHJhdyB0eXBlcyB3aXRoIHRoZSBnaXZlbiB0eXBlIHBhcmFtZXRlcnMuCi8vLwovLy8gU2VlIHRoZSBbZGVzY3JpcHRpb25dCi8vLyAoaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvYmxvYi9tYXN0ZXIvZG9jcy9sYW5ndWFnZS9pbmZvcm1hbC9pbnN0YW50aWF0ZS10by1ib3VuZC5tZCkKLy8vIG9mIHRoZSBhbGdvcml0aG0gZm9yIGRldGFpbHMuCkxpc3Q8VHlwZUJ1aWxkZXI+IGNhbGN1bGF0ZUJvdW5kcyhMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHZhcmlhYmxlcywKICAgIFR5cGVCdWlsZGVyIGR5bmFtaWNUeXBlLCBUeXBlQnVpbGRlciBib3R0b21UeXBlLCBDbGFzc0J1aWxkZXIgb2JqZWN0Q2xhc3MpIHsKICBMaXN0PFR5cGVCdWlsZGVyPiBib3VuZHMgPSBuZXcgTGlzdDxUeXBlQnVpbGRlcj4odmFyaWFibGVzLmxlbmd0aCk7CgogIGZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7CiAgICBib3VuZHNbaV0gPSB2YXJpYWJsZXNbaV0uYm91bmQgPz8gZHluYW1pY1R5cGU7CiAgfQoKICBUeXBlVmFyaWFibGVzR3JhcGggZ3JhcGggPSBuZXcgVHlwZVZhcmlhYmxlc0dyYXBoKHZhcmlhYmxlcywgYm91bmRzKTsKICBMaXN0PExpc3Q8aW50Pj4gc3Ryb25nbHlDb25uZWN0ZWQgPSBjb21wdXRlU3Ryb25nQ29tcG9uZW50cyhncmFwaCk7CiAgZm9yIChMaXN0PGludD4gY29tcG9uZW50IGluIHN0cm9uZ2x5Q29ubmVjdGVkKSB7CiAgICBNYXA8VHlwZVZhcmlhYmxlQnVpbGRlciwgVHlwZUJ1aWxkZXI+IGR5bmFtaWNTdWJzdGl0dXRpb24gPQogICAgICAgIDxUeXBlVmFyaWFibGVCdWlsZGVyLCBUeXBlQnVpbGRlcj57fTsKICAgIE1hcDxUeXBlVmFyaWFibGVCdWlsZGVyLCBUeXBlQnVpbGRlcj4gbnVsbFN1YnN0aXR1dGlvbiA9CiAgICAgICAgPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIFR5cGVCdWlsZGVyPnt9OwogICAgZm9yIChpbnQgdmFyaWFibGVJbmRleCBpbiBjb21wb25lbnQpIHsKICAgICAgZHluYW1pY1N1YnN0aXR1dGlvblt2YXJpYWJsZXNbdmFyaWFibGVJbmRleF1dID0gZHluYW1pY1R5cGU7CiAgICAgIG51bGxTdWJzdGl0dXRpb25bdmFyaWFibGVzW3ZhcmlhYmxlSW5kZXhdXSA9IGJvdHRvbVR5cGU7CiAgICB9CiAgICBmb3IgKGludCB2YXJpYWJsZUluZGV4IGluIGNvbXBvbmVudCkgewogICAgICBib3VuZHNbdmFyaWFibGVJbmRleF0gPSBzdWJzdGl0dXRlUmFuZ2UoCiAgICAgICAgICBib3VuZHNbdmFyaWFibGVJbmRleF0sIGR5bmFtaWNTdWJzdGl0dXRpb24sIG51bGxTdWJzdGl0dXRpb24sCiAgICAgICAgICBpc0NvdmFyaWFudDogdHJ1ZSk7CiAgICB9CiAgfQoKICBmb3IgKGludCBpID0gMDsgaSA8IHZhcmlhYmxlcy5sZW5ndGg7IGkrKykgewogICAgTWFwPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIFR5cGVCdWlsZGVyPiBzdWJzdGl0dXRpb24gPQogICAgICAgIDxUeXBlVmFyaWFibGVCdWlsZGVyLCBUeXBlQnVpbGRlcj57fTsKICAgIE1hcDxUeXBlVmFyaWFibGVCdWlsZGVyLCBUeXBlQnVpbGRlcj4gbnVsbFN1YnN0aXR1dGlvbiA9CiAgICAgICAgPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIFR5cGVCdWlsZGVyPnt9OwogICAgc3Vic3RpdHV0aW9uW3ZhcmlhYmxlc1tpXV0gPSBib3VuZHNbaV07CiAgICBudWxsU3Vic3RpdHV0aW9uW3ZhcmlhYmxlc1tpXV0gPSBib3R0b21UeXBlOwogICAgZm9yIChpbnQgaiA9IDA7IGogPCB2YXJpYWJsZXMubGVuZ3RoOyBqKyspIHsKICAgICAgYm91bmRzW2pdID0gc3Vic3RpdHV0ZVJhbmdlKGJvdW5kc1tqXSwgc3Vic3RpdHV0aW9uLCBudWxsU3Vic3RpdHV0aW9uLAogICAgICAgICAgaXNDb3ZhcmlhbnQ6IHRydWUpOwogICAgfQogIH0KCiAgcmV0dXJuIGJvdW5kczsKfQoKLy8vIEdyYXBoIG9mIG11dHVhbCBkZXBlbmRlbmNpZXMgb2YgdHlwZSB2YXJpYWJsZXMgZnJvbSB0aGUgc2FtZSBkZWNsYXJhdGlvbi4KLy8vIFR5cGUgdmFyaWFibGVzIGFyZSByZXByZXNlbnRlZCBieSB0aGVpciBpbmRpY2VzIGluIHRoZSBjb3JyZXNwb25kaW5nCi8vLyBkZWNsYXJhdGlvbi4KY2xhc3MgVHlwZVZhcmlhYmxlc0dyYXBoIGltcGxlbWVudHMgR3JhcGg8aW50PiB7CiAgTGlzdDxpbnQ+IHZlcnRpY2VzOwogIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdmFyaWFibGVzOwogIExpc3Q8VHlwZUJ1aWxkZXI+IGJvdW5kczsKCiAgLy8gYGVkZ2VzW2ldYCBpcyB0aGUgbGlzdCBvZiBpbmRpY2VzIG9mIHR5cGUgdmFyaWFibGVzIHRoYXQgcmVmZXJlbmNlIHRoZSB0eXBlCiAgLy8gdmFyaWFibGUgd2l0aCB0aGUgaW5kZXggYGlgIGluIHRoZWlyIGJvdW5kcy4KICBMaXN0PExpc3Q8aW50Pj4gZWRnZXM7CgogIFR5cGVWYXJpYWJsZXNHcmFwaCh0aGlzLnZhcmlhYmxlcywgdGhpcy5ib3VuZHMpIHsKICAgIGFzc2VydCh2YXJpYWJsZXMubGVuZ3RoID09IGJvdW5kcy5sZW5ndGgpOwoKICAgIHZlcnRpY2VzID0gbmV3IExpc3Q8aW50Pih2YXJpYWJsZXMubGVuZ3RoKTsKICAgIE1hcDxUeXBlVmFyaWFibGVCdWlsZGVyLCBpbnQ+IHZhcmlhYmxlSW5kaWNlcyA9CiAgICAgICAgPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIGludD57fTsKICAgIGVkZ2VzID0gbmV3IExpc3Q8TGlzdDxpbnQ+Pih2YXJpYWJsZXMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmVydGljZXNbaV0gPSBpOwogICAgICB2YXJpYWJsZUluZGljZXNbdmFyaWFibGVzW2ldXSA9IGk7CiAgICAgIGVkZ2VzW2ldID0gPGludD5bXTsKICAgIH0KCiAgICB2b2lkIGNvbGxlY3RSZWZlcmVuY2VzRnJvbShpbnQgaW5kZXgsIFR5cGVCdWlsZGVyIHR5cGUpIHsKICAgICAgaWYgKHR5cGUgaXMgTmFtZWRUeXBlQnVpbGRlcikgewogICAgICAgIGlmICh0eXBlLmRlY2xhcmF0aW9uIGlzIFR5cGVWYXJpYWJsZUJ1aWxkZXIgJiYKICAgICAgICAgICAgdGhpcy52YXJpYWJsZXMuY29udGFpbnModHlwZS5kZWNsYXJhdGlvbikpIHsKICAgICAgICAgIGVkZ2VzW3ZhcmlhYmxlSW5kaWNlc1t0eXBlLmRlY2xhcmF0aW9uXV0uYWRkKGluZGV4KTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUuYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoVHlwZUJ1aWxkZXIgYXJndW1lbnQgaW4gdHlwZS5hcmd1bWVudHMpIHsKICAgICAgICAgICAgY29sbGVjdFJlZmVyZW5jZXNGcm9tKGluZGV4LCBhcmd1bWVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHR5cGVWYXJpYWJsZSBpbiB0eXBlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgICAgICAgY29sbGVjdFJlZmVyZW5jZXNGcm9tKGluZGV4LCB0eXBlVmFyaWFibGUuYm91bmQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodHlwZS5mb3JtYWxzICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBwYXJhbWV0ZXIgaW4gdHlwZS5mb3JtYWxzKSB7CiAgICAgICAgICAgIGNvbGxlY3RSZWZlcmVuY2VzRnJvbShpbmRleCwgcGFyYW1ldGVyLnR5cGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb2xsZWN0UmVmZXJlbmNlc0Zyb20oaW5kZXgsIHR5cGUucmV0dXJuVHlwZSk7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbGxlY3RSZWZlcmVuY2VzRnJvbShpLCBib3VuZHNbaV0pOwogICAgfQogIH0KCiAgLy8vIFJldHVybnMgaW5kaWNlcyBvZiB0eXBlIHZhcmlhYmxlcyB0aGF0IGRlcGVuZCBvbiB0aGUgdHlwZSB2YXJpYWJsZSB3aXRoCiAgLy8vIFtpbmRleF0uCiAgSXRlcmFibGU8aW50PiBuZWlnaGJvcnNPZihpbnQgaW5kZXgpIHsKICAgIHJldHVybiBlZGdlc1tpbmRleF07CiAgfQp9CgovLy8gRmluZHMgYWxsIHR5cGUgYnVpbGRlcnMgZm9yIFt2YXJpYWJsZV0gaW4gW3R5cGVdLgovLy8KLy8vIFJldHVybnMgbGlzdCBvZiB0aGUgZm91bmQgdHlwZSBidWlsZGVycy4KTGlzdDxOYW1lZFR5cGVCdWlsZGVyPiBmaW5kVmFyaWFibGVVc2VzSW5UeXBlKAogIFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUsCiAgVHlwZUJ1aWxkZXIgdHlwZSwKKSB7CiAgdmFyIHVzZXMgPSA8TmFtZWRUeXBlQnVpbGRlcj5bXTsKICBpZiAodHlwZSBpcyBOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICBpZiAodHlwZS5kZWNsYXJhdGlvbiA9PSB2YXJpYWJsZSkgewogICAgICB1c2VzLmFkZCh0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh0eXBlLmFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgICAgZm9yIChUeXBlQnVpbGRlciBhcmd1bWVudCBpbiB0eXBlLmFyZ3VtZW50cykgewogICAgICAgICAgdXNlcy5hZGRBbGwoZmluZFZhcmlhYmxlVXNlc0luVHlwZSh2YXJpYWJsZSwgYXJndW1lbnQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9IGVsc2UgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgdXNlcy5hZGRBbGwoZmluZFZhcmlhYmxlVXNlc0luVHlwZSh2YXJpYWJsZSwgdHlwZS5yZXR1cm5UeXBlKSk7CiAgICBpZiAodHlwZS50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIGRlcGVuZGVudFZhcmlhYmxlIGluIHR5cGUudHlwZVZhcmlhYmxlcykgewogICAgICAgIGlmIChkZXBlbmRlbnRWYXJpYWJsZS5ib3VuZCAhPSBudWxsKSB7CiAgICAgICAgICB1c2VzLmFkZEFsbCgKICAgICAgICAgICAgICBmaW5kVmFyaWFibGVVc2VzSW5UeXBlKHZhcmlhYmxlLCBkZXBlbmRlbnRWYXJpYWJsZS5ib3VuZCkpOwogICAgICAgIH0KICAgICAgICBpZiAoZGVwZW5kZW50VmFyaWFibGUuZGVmYXVsdFR5cGUgIT0gbnVsbCkgewogICAgICAgICAgdXNlcy5hZGRBbGwoCiAgICAgICAgICAgICAgZmluZFZhcmlhYmxlVXNlc0luVHlwZSh2YXJpYWJsZSwgZGVwZW5kZW50VmFyaWFibGUuZGVmYXVsdFR5cGUpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsIGluIHR5cGUuZm9ybWFscykgewogICAgICAgIHVzZXMuYWRkQWxsKGZpbmRWYXJpYWJsZVVzZXNJblR5cGUodmFyaWFibGUsIGZvcm1hbC50eXBlKSk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHVzZXM7Cn0KCi8vLyBGaW5kcyB0aG9zZSBvZiBbdmFyaWFibGVzXSB0aGF0IHJlZmVyZW5jZSBvdGhlciBbdmFyaWFibGVzXSBpbiB0aGVpciBib3VuZHMuCi8vLwovLy8gUmV0dXJucyBmbGF0dGVuZWQgbGlzdCBvZiBwYWlycy4gIFRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBwYWlyIGlzIHRoZSB0eXBlCi8vLyB2YXJpYWJsZSBidWlsZGVyIGZyb20gW3ZhcmlhYmxlc10gdGhhdCByZWZlcmVuY2VzIG90aGVyIFt2YXJpYWJsZXNdIGluIGl0cwovLy8gYm91bmQuICBUaGUgc2Vjb25kIGVsZW1lbnQgaW4gdGhlIHBhaXIgaXMgdGhlIGxpc3Qgb2YgZm91bmQgcmVmZXJlbmNlcwovLy8gcmVwcmVzZW50ZWQgYXMgdHlwZSBidWlsZGVycy4KTGlzdDxPYmplY3Q+IGZpbmRJbmJvdW5kUmVmZXJlbmNlcyhMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHZhcmlhYmxlcykgewogIHZhciB2YXJpYWJsZXNBbmREZXBlbmRlbmNpZXMgPSA8T2JqZWN0PltdOwogIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciBkZXBlbmRlbnQgaW4gdmFyaWFibGVzKSB7CiAgICB2YXIgZGVwZW5kZW5jaWVzID0gPE5hbWVkVHlwZUJ1aWxkZXI+W107CiAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgZGVwZW5kZW5jZSBpbiB2YXJpYWJsZXMpIHsKICAgICAgTGlzdDxOYW1lZFR5cGVCdWlsZGVyPiB1c2VzID0KICAgICAgICAgIGZpbmRWYXJpYWJsZVVzZXNJblR5cGUoZGVwZW5kZW5jZSwgZGVwZW5kZW50LmJvdW5kKTsKICAgICAgaWYgKHVzZXMubGVuZ3RoICE9IDApIHsKICAgICAgICBkZXBlbmRlbmNpZXMuYWRkQWxsKHVzZXMpOwogICAgICB9CiAgICB9CiAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCAhPSAwKSB7CiAgICAgIHZhcmlhYmxlc0FuZERlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW50KTsKICAgICAgdmFyaWFibGVzQW5kRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmNpZXMpOwogICAgfQogIH0KICByZXR1cm4gdmFyaWFibGVzQW5kRGVwZW5kZW5jaWVzOwp9CgovLy8gRmluZHMgcmF3IGdlbmVyaWMgdHlwZXMgaW4gW3R5cGVdIHdpdGggaW5ib3VuZCByZWZlcmVuY2VzIGluIHR5cGUgdmFyaWFibGVzLgovLy8KLy8vIFJldHVybnMgZmxhdHRlbmVkIGxpc3Qgb2YgcGFpcnMuICBUaGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgcGFpciBpcyB0aGUgZm91bmQKLy8vIHJhdyBnZW5lcmljIHR5cGUuICBUaGUgc2Vjb25kIGVsZW1lbnQgaW4gdGhlIHBhaXIgaXMgdGhlIGxpc3Qgb2YgdHlwZQovLy8gdmFyaWFibGVzIG9mIHRoYXQgdHlwZSB3aXRoIGluYm91bmQgcmVmZXJlbmNlcyBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBpbgovLy8gW2ZpbmRJbmJvdW5kUmVmZXJlbmNlc10uCkxpc3Q8T2JqZWN0PiBmaW5kUmF3VHlwZXNXaXRoSW5ib3VuZFJlZmVyZW5jZXMoVHlwZUJ1aWxkZXIgdHlwZSkgewogIHZhciB0eXBlc0FuZERlcGVuZGVuY2llcyA9IDxPYmplY3Q+W107CiAgaWYgKHR5cGUgaXMgTmFtZWRUeXBlQnVpbGRlcikgewogICAgaWYgKHR5cGUuYXJndW1lbnRzID09IG51bGwpIHsKICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbiA9IHR5cGUuZGVjbGFyYXRpb247CiAgICAgIGlmIChkZWNsYXJhdGlvbiBpcyBEaWxsQ2xhc3NCdWlsZGVyKSB7CiAgICAgICAgYm9vbCBoYXNJbmJvdW5kID0gZmFsc2U7CiAgICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IGRlY2xhcmF0aW9uLnRhcmdldC50eXBlUGFyYW1ldGVyczsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAmJiAhaGFzSW5ib3VuZDsgKytpKSB7CiAgICAgICAgICBpZiAoY29udGFpbnNUeXBlVmFyaWFibGUoCiAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnNbaV0uYm91bmQsIHR5cGVQYXJhbWV0ZXJzLnRvU2V0KCkpKSB7CiAgICAgICAgICAgIGhhc0luYm91bmQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaGFzSW5ib3VuZCkgewogICAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMuYWRkKHR5cGUpOwogICAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMuYWRkKGNvbnN0IDxPYmplY3Q+W10pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBEaWxsVHlwZUFsaWFzQnVpbGRlcikgewogICAgICAgIGJvb2wgaGFzSW5ib3VuZCA9IGZhbHNlOwogICAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBkZWNsYXJhdGlvbi50YXJnZXQudHlwZVBhcmFtZXRlcnM7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVycy5sZW5ndGggJiYgIWhhc0luYm91bmQ7ICsraSkgewogICAgICAgICAgaWYgKGNvbnRhaW5zVHlwZVZhcmlhYmxlKAogICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzW2ldLmJvdW5kLCB0eXBlUGFyYW1ldGVycy50b1NldCgpKSkgewogICAgICAgICAgICBoYXNJbmJvdW5kID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc0luYm91bmQpIHsKICAgICAgICAgIHR5cGVzQW5kRGVwZW5kZW5jaWVzLmFkZCh0eXBlKTsKICAgICAgICAgIHR5cGVzQW5kRGVwZW5kZW5jaWVzLmFkZChjb25zdCA8T2JqZWN0PltdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgQ2xhc3NCdWlsZGVyICYmCiAgICAgICAgICBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgICBMaXN0PE9iamVjdD4gZGVwZW5kZW5jaWVzID0KICAgICAgICAgICAgZmluZEluYm91bmRSZWZlcmVuY2VzKGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMpOwogICAgICAgIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoICE9IDApIHsKICAgICAgICAgIHR5cGVzQW5kRGVwZW5kZW5jaWVzLmFkZCh0eXBlKTsKICAgICAgICAgIHR5cGVzQW5kRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmNpZXMpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgICAgTGlzdDxPYmplY3Q+IGRlcGVuZGVuY2llcyA9CiAgICAgICAgICAgICAgZmluZEluYm91bmRSZWZlcmVuY2VzKGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMpOwogICAgICAgICAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggIT0gMCkgewogICAgICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcy5hZGQodHlwZSk7CiAgICAgICAgICAgIHR5cGVzQW5kRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmNpZXMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGVjbGFyYXRpb24udHlwZSBpcyBGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICAgICAgICBGdW5jdGlvblR5cGVCdWlsZGVyIHR5cGUgPSBkZWNsYXJhdGlvbi50eXBlOwogICAgICAgICAgaWYgKHR5cGUudHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgICAgICAgIExpc3Q8T2JqZWN0PiBkZXBlbmRlbmNpZXMgPQogICAgICAgICAgICAgICAgZmluZEluYm91bmRSZWZlcmVuY2VzKHR5cGUudHlwZVZhcmlhYmxlcyk7CiAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoICE9IDApIHsKICAgICAgICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcy5hZGQodHlwZSk7CiAgICAgICAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoVHlwZUJ1aWxkZXIgYXJndW1lbnQgaW4gdHlwZS5hcmd1bWVudHMpIHsKICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcwogICAgICAgICAgICAuYWRkQWxsKGZpbmRSYXdUeXBlc1dpdGhJbmJvdW5kUmVmZXJlbmNlcyhhcmd1bWVudCkpOwogICAgICB9CiAgICB9CiAgfSBlbHNlIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZUJ1aWxkZXIpIHsKICAgIHR5cGVzQW5kRGVwZW5kZW5jaWVzCiAgICAgICAgLmFkZEFsbChmaW5kUmF3VHlwZXNXaXRoSW5ib3VuZFJlZmVyZW5jZXModHlwZS5yZXR1cm5UeXBlKSk7CiAgICBpZiAodHlwZS50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHZhcmlhYmxlIGluIHR5cGUudHlwZVZhcmlhYmxlcykgewogICAgICAgIGlmICh2YXJpYWJsZS5ib3VuZCAhPSBudWxsKSB7CiAgICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcwogICAgICAgICAgICAgIC5hZGRBbGwoZmluZFJhd1R5cGVzV2l0aEluYm91bmRSZWZlcmVuY2VzKHZhcmlhYmxlLmJvdW5kKSk7CiAgICAgICAgfQogICAgICAgIGlmICh2YXJpYWJsZS5kZWZhdWx0VHlwZSAhPSBudWxsKSB7CiAgICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcwogICAgICAgICAgICAgIC5hZGRBbGwoZmluZFJhd1R5cGVzV2l0aEluYm91bmRSZWZlcmVuY2VzKHZhcmlhYmxlLmRlZmF1bHRUeXBlKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAodHlwZS5mb3JtYWxzICE9IG51bGwpIHsKICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiB0eXBlLmZvcm1hbHMpIHsKICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcwogICAgICAgICAgICAuYWRkQWxsKGZpbmRSYXdUeXBlc1dpdGhJbmJvdW5kUmVmZXJlbmNlcyhmb3JtYWwudHlwZSkpOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiB0eXBlc0FuZERlcGVuZGVuY2llczsKfQoKLy8vIEZpbmRzIGlzc3VlcyBieSByYXcgZ2VuZXJpYyB0eXBlcyB3aXRoIGluYm91bmQgcmVmZXJlbmNlcyBpbiB0eXBlIHZhcmlhYmxlcy4KLy8vCi8vLyBSZXR1cm5zIGZsYXR0ZW5lZCBsaXN0IG9mIHRyaXBsZXRzLiAgVGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHRyaXBsZXQgaXMgdGhlCi8vLyBbVHlwZURlY2xhcmF0aW9uQnVpbGRlcl0gZm9yIHRoZSB0eXBlIHZhcmlhYmxlIGZyb20gW3ZhcmlhYmxlc10gdGhhdCBoYXMgcmF3Ci8vLyBnZW5lcmljIHR5cGVzIHdpdGggaW5ib3VuZCByZWZlcmVuY2VzIGluIGl0cyBib3VuZC4gIFRoZSBzZWNvbmQgZWxlbWVudCBvZgovLy8gdGhlIHRyaXBsZXQgaXMgdGhlIGVycm9yIG1lc3NhZ2UuICBUaGUgdGhpcmQgZWxlbWVudCBpcyB0aGUgY29udGV4dC4KTGlzdDxPYmplY3Q+IGdldEluYm91bmRSZWZlcmVuY2VJc3N1ZXMoTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB2YXJpYWJsZXMpIHsKICB2YXIgaXNzdWVzID0gPE9iamVjdD5bXTsKICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgaW4gdmFyaWFibGVzKSB7CiAgICBpZiAodmFyaWFibGUuYm91bmQgIT0gbnVsbCkgewogICAgICBMaXN0PE9iamVjdD4gcmF3VHlwZXNBbmRNdXR1YWxEZXBlbmRlbmNpZXMgPQogICAgICAgICAgZmluZFJhd1R5cGVzV2l0aEluYm91bmRSZWZlcmVuY2VzKHZhcmlhYmxlLmJvdW5kKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYXdUeXBlc0FuZE11dHVhbERlcGVuZGVuY2llcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgIE5hbWVkVHlwZUJ1aWxkZXIgdHlwZSA9IHJhd1R5cGVzQW5kTXV0dWFsRGVwZW5kZW5jaWVzW2ldOwogICAgICAgIExpc3Q8T2JqZWN0PiB2YXJpYWJsZXNBbmREZXBlbmRlbmNpZXMgPQogICAgICAgICAgICByYXdUeXBlc0FuZE11dHVhbERlcGVuZGVuY2llc1tpICsgMV07CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB2YXJpYWJsZXNBbmREZXBlbmRlbmNpZXMubGVuZ3RoOyBqICs9IDIpIHsKICAgICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIgZGVwZW5kZW50ID0gdmFyaWFibGVzQW5kRGVwZW5kZW5jaWVzW2pdOwogICAgICAgICAgTGlzdDxOYW1lZFR5cGVCdWlsZGVyPiBkZXBlbmRlbmNpZXMgPSB2YXJpYWJsZXNBbmREZXBlbmRlbmNpZXNbaiArIDFdOwogICAgICAgICAgZm9yIChOYW1lZFR5cGVCdWlsZGVyIGRlcGVuZGVuY3kgaW4gZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgICAgIGlzc3Vlcy5hZGQodmFyaWFibGUpOwogICAgICAgICAgICBpc3N1ZXMuYWRkKHRlbXBsYXRlQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0eXBlLmRlY2xhcmF0aW9uLm5hbWUpKTsKICAgICAgICAgICAgaXNzdWVzLmFkZCg8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgICAgICAgIHRlbXBsYXRlTm9uU2ltcGxlQm91bmRWaWFWYXJpYWJsZQogICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhkZXBlbmRlbmN5LmRlY2xhcmF0aW9uLm5hbWUpCiAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oZGVwZW5kZW50LmZpbGVVcmksIGRlcGVuZGVudC5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50Lm5hbWUubGVuZ3RoKQogICAgICAgICAgICBdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHZhcmlhYmxlc0FuZERlcGVuZGVuY2llcy5sZW5ndGggPT0gMCkgewogICAgICAgICAgLy8gVGhlIGluYm91bmQgcmVmZXJlbmNlcyBhcmUgaW4gYSBjb21waWxlZCBkZWNsYXJhdGlvbiBpbiBhIC5kaWxsLgogICAgICAgICAgaXNzdWVzLmFkZCh2YXJpYWJsZSk7CiAgICAgICAgICBpc3N1ZXMuYWRkKHRlbXBsYXRlQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzCiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHModHlwZS5kZWNsYXJhdGlvbi5uYW1lKSk7CiAgICAgICAgICBpc3N1ZXMuYWRkKGNvbnN0IDxMb2NhdGVkTWVzc2FnZT5bXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBpc3N1ZXM7Cn0KCi8vLyBGaW5kcyByYXcgdHlwZSBwYXRocyBzdGFydGluZyBmcm9tIHRob3NlIGluIFtzdGFydF0gYW5kIGVuZGluZyB3aXRoIFtlbmRdLgovLy8KLy8vIFJldHVybnMgbGlzdCBvZiBmb3VuZCBwYXRocy4gIEVhY2ggcGF0aCBpcyByZXByZXNlbnRlZCBhcyBhIGxpc3Qgb2YKLy8vIGFsdGVybmF0aW5nIGJ1aWxkZXJzIG9mIHRoZSByYXcgZ2VuZXJpYyB0eXBlcyBmcm9tIHRoZSBwYXRoIGFuZCBidWlsZGVycyBvZgovLy8gdHlwZSB2YXJpYWJsZXMgb2YgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0eXBlcyB0aGF0IGNvbnRhaW4gdGhlIHJlZmVyZW5jZQovLy8gdG8gdGhlIG5leHQgcmF3IGdlbmVyaWMgdHlwZSBpbiB0aGUgcGF0aC4gIFRoZSBsaXN0IGVuZHMgd2l0aCB0aGUgdHlwZQovLy8gYnVpbGRlciBmb3IgW2VuZF0uCi8vLwovLy8gVGhlIHJlYXNvbiBmb3IgcHV0dGluZyB0aGUgdHlwZSB2YXJpYWJsZXMgaW50byB0aGUgcGF0aHMgYXMgd2VsbCBhcyBmb3IKLy8vIHVzaW5nIHR5cGUgZm9yIFtzdGFydF0sIGFuZCBub3QgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBkZWNsYXJhdGlvbiwKLy8vIGlzIGJldHRlciBlcnJvciByZXBvcnRpbmcuCkxpc3Q8TGlzdDxPYmplY3Q+PiBmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbigKICAgIFR5cGVCdWlsZGVyIHN0YXJ0LCBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGVuZCwKICAgIFtTZXQ8VHlwZURlY2xhcmF0aW9uQnVpbGRlcj4gdmlzaXRlZF0pIHsKICB2aXNpdGVkID8/PSBuZXcgU2V0PFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXI+LmlkZW50aXR5KCk7CiAgdmFyIHBhdGhzID0gPExpc3Q8T2JqZWN0Pj5bXTsKICBpZiAoc3RhcnQgaXMgTmFtZWRUeXBlQnVpbGRlcikgewogICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbiA9IHN0YXJ0LmRlY2xhcmF0aW9uOwogICAgaWYgKHN0YXJ0LmFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIGlmIChzdGFydC5kZWNsYXJhdGlvbiA9PSBlbmQpIHsKICAgICAgICBwYXRocy5hZGQoPE9iamVjdD5bc3RhcnRdKTsKICAgICAgfSBlbHNlIGlmICh2aXNpdGVkLmFkZChzdGFydC5kZWNsYXJhdGlvbikpIHsKICAgICAgICBpZiAoZGVjbGFyYXRpb24gaXMgQ2xhc3NCdWlsZGVyICYmIGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHZhcmlhYmxlIGluIGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmJvdW5kICE9IG51bGwpIHsKICAgICAgICAgICAgICBmb3IgKExpc3Q8T2JqZWN0PiBwYXRoIGluIGZpbmRSYXdUeXBlUGF0aHNUb0RlY2xhcmF0aW9uKAogICAgICAgICAgICAgICAgICB2YXJpYWJsZS5ib3VuZCwgZW5kLCB2aXNpdGVkKSkgewogICAgICAgICAgICAgICAgcGF0aHMuYWRkKDxPYmplY3Q+W3N0YXJ0LCB2YXJpYWJsZV0uLmFkZEFsbChwYXRoKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgICAgICBpZiAoZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgICAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSBpbiBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzKSB7CiAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmJvdW5kICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGZvciAoTGlzdDxPYmplY3Q+IGRlcGVuZGVuY3lQYXRoCiAgICAgICAgICAgICAgICAgICAgaW4gZmluZFJhd1R5cGVQYXRoc1RvRGVjbGFyYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmJvdW5kLCBlbmQsIHZpc2l0ZWQpKSB7CiAgICAgICAgICAgICAgICAgIHBhdGhzLmFkZCg8T2JqZWN0PltzdGFydCwgdmFyaWFibGVdLi5hZGRBbGwoZGVwZW5kZW5jeVBhdGgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi50eXBlIGlzIEZ1bmN0aW9uVHlwZUJ1aWxkZXIpIHsKICAgICAgICAgICAgRnVuY3Rpb25UeXBlQnVpbGRlciB0eXBlID0gZGVjbGFyYXRpb24udHlwZTsKICAgICAgICAgICAgaWYgKHR5cGUudHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHZhcmlhYmxlIGluIHR5cGUudHlwZVZhcmlhYmxlcykgewogICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmJvdW5kICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgZm9yIChMaXN0PE9iamVjdD4gZGVwZW5kZW5jeVBhdGgKICAgICAgICAgICAgICAgICAgICAgIGluIGZpbmRSYXdUeXBlUGF0aHNUb0RlY2xhcmF0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmJvdW5kLCBlbmQsIHZpc2l0ZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aHMKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCg8T2JqZWN0PltzdGFydCwgdmFyaWFibGVdLi5hZGRBbGwoZGVwZW5kZW5jeVBhdGgpKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2aXNpdGVkLnJlbW92ZShzdGFydC5kZWNsYXJhdGlvbik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoVHlwZUJ1aWxkZXIgYXJndW1lbnQgaW4gc3RhcnQuYXJndW1lbnRzKSB7CiAgICAgICAgcGF0aHMuYWRkQWxsKGZpbmRSYXdUeXBlUGF0aHNUb0RlY2xhcmF0aW9uKGFyZ3VtZW50LCBlbmQsIHZpc2l0ZWQpKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAoc3RhcnQgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgcGF0aHMuYWRkQWxsKGZpbmRSYXdUeXBlUGF0aHNUb0RlY2xhcmF0aW9uKHN0YXJ0LnJldHVyblR5cGUsIGVuZCwgdmlzaXRlZCkpOwogICAgaWYgKHN0YXJ0LnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgaW4gc3RhcnQudHlwZVZhcmlhYmxlcykgewogICAgICAgIGlmICh2YXJpYWJsZS5ib3VuZCAhPSBudWxsKSB7CiAgICAgICAgICBwYXRocy5hZGRBbGwoCiAgICAgICAgICAgICAgZmluZFJhd1R5cGVQYXRoc1RvRGVjbGFyYXRpb24odmFyaWFibGUuYm91bmQsIGVuZCwgdmlzaXRlZCkpOwogICAgICAgIH0KICAgICAgICBpZiAodmFyaWFibGUuZGVmYXVsdFR5cGUgIT0gbnVsbCkgewogICAgICAgICAgcGF0aHMuYWRkQWxsKGZpbmRSYXdUeXBlUGF0aHNUb0RlY2xhcmF0aW9uKAogICAgICAgICAgICAgIHZhcmlhYmxlLmRlZmF1bHRUeXBlLCBlbmQsIHZpc2l0ZWQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChzdGFydC5mb3JtYWxzICE9IG51bGwpIHsKICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiBzdGFydC5mb3JtYWxzKSB7CiAgICAgICAgcGF0aHMuYWRkQWxsKGZpbmRSYXdUeXBlUGF0aHNUb0RlY2xhcmF0aW9uKGZvcm1hbC50eXBlLCBlbmQsIHZpc2l0ZWQpKTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gcGF0aHM7Cn0KCi8vLyBGaW5kcyByYXcgZ2VuZXJpYyB0eXBlIGN5Y2xlcyBlbmRpbmcgYW5kIHN0YXJ0aW5nIHdpdGggW2RlY2xhcmF0aW9uXS4KLy8vCi8vLyBSZXR1cm5zIGxpc3Qgb2YgZm91bmQgY3ljbGVzLiAgRWFjaCBjeWNsZSBpcyByZXByZXNlbnRlZCBhcyBhIGxpc3Qgb2YKLy8vIGFsdGVybmF0aW5nIHJhdyBnZW5lcmljIHR5cGVzIGZyb20gdGhlIGN5Y2xlIGFuZCB0eXBlIHZhcmlhYmxlcyBvZiB0aGUKLy8vIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0eXBlIHRoYXQgcmVmZXJlbmNlIHRoZSBuZXh0IHR5cGUgaW4gdGhlIGN5Y2xlLiAgVGhlCi8vLyBjeWNsZSBzdGFydHMgd2l0aCBhIHR5cGUgdmFyaWFibGUgZnJvbSBbZGVjbGFyYXRpb25dIGFuZCBlbmRzIHdpdGggYSB0eXBlCi8vLyB0aGF0IGhhcyBbZGVjbGFyYXRpb25dIGFzIGl0cyBkZWNsYXJhdGlvbi4KLy8vCi8vLyBUaGUgcmVhc29uIGZvciBwdXR0aW5nIHRoZSB0eXBlIHZhcmlhYmxlcyBpbnRvIHRoZSBjeWNsZXMgaXMgYmV0dGVyIGVycm9yCi8vLyByZXBvcnRpbmcuCkxpc3Q8TGlzdDxPYmplY3Q+PiBmaW5kUmF3VHlwZUN5Y2xlcyhUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGRlY2xhcmF0aW9uKSB7CiAgdmFyIGN5Y2xlcyA9IDxMaXN0PE9iamVjdD4+W107CiAgaWYgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlciAmJiBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSBpbiBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzKSB7CiAgICAgIGlmICh2YXJpYWJsZS5ib3VuZCAhPSBudWxsKSB7CiAgICAgICAgZm9yIChMaXN0PE9iamVjdD4gcGF0aAogICAgICAgICAgICBpbiBmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbih2YXJpYWJsZS5ib3VuZCwgZGVjbGFyYXRpb24pKSB7CiAgICAgICAgICBjeWNsZXMuYWRkKDxPYmplY3Q+W3ZhcmlhYmxlXS4uYWRkQWxsKHBhdGgpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIFR5cGVBbGlhc0J1aWxkZXIpIHsKICAgIGlmIChkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHZhcmlhYmxlIGluIGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgICBpZiAodmFyaWFibGUuYm91bmQgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChMaXN0PE9iamVjdD4gZGVwZW5kZW5jeVBhdGgKICAgICAgICAgICAgICBpbiBmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbih2YXJpYWJsZS5ib3VuZCwgZGVjbGFyYXRpb24pKSB7CiAgICAgICAgICAgIGN5Y2xlcy5hZGQoPE9iamVjdD5bdmFyaWFibGVdLi5hZGRBbGwoZGVwZW5kZW5jeVBhdGgpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChkZWNsYXJhdGlvbi50eXBlIGlzIEZ1bmN0aW9uVHlwZUJ1aWxkZXIpIHsKICAgICAgRnVuY3Rpb25UeXBlQnVpbGRlciB0eXBlID0gZGVjbGFyYXRpb24udHlwZTsKICAgICAgaWYgKHR5cGUudHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHZhcmlhYmxlIGluIHR5cGUudHlwZVZhcmlhYmxlcykgewogICAgICAgICAgaWYgKHZhcmlhYmxlLmJvdW5kICE9IG51bGwpIHsKICAgICAgICAgICAgZm9yIChMaXN0PE9iamVjdD4gZGVwZW5kZW5jeVBhdGgKICAgICAgICAgICAgICAgIGluIGZpbmRSYXdUeXBlUGF0aHNUb0RlY2xhcmF0aW9uKHZhcmlhYmxlLmJvdW5kLCBkZWNsYXJhdGlvbikpIHsKICAgICAgICAgICAgICBjeWNsZXMuYWRkKDxPYmplY3Q+W3ZhcmlhYmxlXS4uYWRkQWxsKGRlcGVuZGVuY3lQYXRoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGN5Y2xlczsKfQoKLy8vIENvbnZlcnRzIHJhdyBnZW5lcmljIHR5cGUgW2N5Y2xlc10gZm9yIFtkZWNsYXJhdGlvbl0gaW50byByZXBvcnRhYmxlIGlzc3Vlcy4KLy8vCi8vLyBUaGUgW2N5Y2xlc10gYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGZvciB0aGUgcmV0dXJuIHZhbHVlCi8vLyBvZiBbZmluZFJhd1R5cGVDeWNsZXNdLgovLy8KLy8vIFJldHVybnMgZmxhdHRlbmVkIGxpc3Qgb2YgdHJpcGxldHMuICBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgdHJpcGxldCBpcyB0aGUKLy8vIFtUeXBlRGVjbGFyYXRpb25CdWlsZGVyXSBmb3IgdGhlIHR5cGUgdmFyaWFibGUgZnJvbSBbdmFyaWFibGVzXSB0aGF0IGhhcyByYXcKLy8vIGdlbmVyaWMgdHlwZXMgd2l0aCBpbmJvdW5kIHJlZmVyZW5jZXMgaW4gaXRzIGJvdW5kLiAgVGhlIHNlY29uZCBlbGVtZW50IG9mCi8vLyB0aGUgdHJpcGxldCBpcyB0aGUgZXJyb3IgbWVzc2FnZS4gIFRoZSB0aGlyZCBlbGVtZW50IGlzIHRoZSBjb250ZXh0LgpMaXN0PE9iamVjdD4gY29udmVydFJhd1R5cGVDeWNsZXNJbnRvSXNzdWVzKAogICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbiwgTGlzdDxMaXN0PE9iamVjdD4+IGN5Y2xlcykgewogIExpc3Q8T2JqZWN0PiBpc3N1ZXMgPSA8T2JqZWN0PltdOwogIGZvciAoTGlzdDxPYmplY3Q+IGN5Y2xlIGluIGN5Y2xlcykgewogICAgaWYgKGN5Y2xlLmxlbmd0aCA9PSAyKSB7CiAgICAgIC8vIExvb3AuCiAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgPSBjeWNsZVswXTsKICAgICAgTmFtZWRUeXBlQnVpbGRlciB0eXBlID0gY3ljbGVbMV07CiAgICAgIGlzc3Vlcy5hZGQodmFyaWFibGUpOwogICAgICBpc3N1ZXMuYWRkKHRlbXBsYXRlQm91bmRJc3N1ZVZpYUxvb3BOb25TaW1wbGljaXR5CiAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0eXBlLmRlY2xhcmF0aW9uLm5hbWUpKTsKICAgICAgaXNzdWVzLmFkZChudWxsKTsgLy8gQ29udGV4dC4KICAgIH0gZWxzZSB7CiAgICAgIHZhciBjb250ZXh0ID0gPExvY2F0ZWRNZXNzYWdlPltdOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN5Y2xlLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSA9IGN5Y2xlW2ldOwogICAgICAgIE5hbWVkVHlwZUJ1aWxkZXIgdHlwZSA9IGN5Y2xlW2kgKyAxXTsKICAgICAgICBjb250ZXh0LmFkZCh0ZW1wbGF0ZU5vblNpbXBsZUJvdW5kVmlhUmVmZXJlbmNlCiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHR5cGUuZGVjbGFyYXRpb24ubmFtZSkKICAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZpbGVVcmksIHZhcmlhYmxlLmNoYXJPZmZzZXQsIHZhcmlhYmxlLm5hbWUubGVuZ3RoKSk7CiAgICAgIH0KICAgICAgTmFtZWRUeXBlQnVpbGRlciBmaXJzdEVuY291bnRlcmVkVHlwZSA9IGN5Y2xlWzFdOwoKICAgICAgaXNzdWVzLmFkZChkZWNsYXJhdGlvbik7CiAgICAgIGlzc3Vlcy5hZGQodGVtcGxhdGVCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5LndpdGhBcmd1bWVudHMoCiAgICAgICAgICBkZWNsYXJhdGlvbi5uYW1lLCBmaXJzdEVuY291bnRlcmVkVHlwZS5kZWNsYXJhdGlvbi5uYW1lKSk7CiAgICAgIGlzc3Vlcy5hZGQoY29udGV4dCk7CiAgICB9CiAgfQogIHJldHVybiBpc3N1ZXM7Cn0KCi8vLyBGaW5kcyBub24tc2ltcGxpY2l0eSBpc3N1ZXMgZm9yIHRoZSBnaXZlbiBzZXQgb2YgW3ZhcmlhYmxlc10uCi8vLwovLy8gVGhlIGlzc3VlcyBhcmUgdGhvc2UgY2F1c2VkIGJ5IHJhdyB0eXBlcyB3aXRoIGluYm91bmQgcmVmZXJlbmNlcyBpbiB0aGUKLy8vIGJvdW5kcyBvZiB0aGVpciB0eXBlIHZhcmlhYmxlcy4KLy8vCi8vLyBSZXR1cm5zIGZsYXR0ZW5lZCBsaXN0IG9mIHRyaXBsZXRzLCBlYWNoIHRyaXBsZXQgcmVwcmVzZW50aW5nIGFuIGlzc3VlLiAgVGhlCi8vLyBmaXJzdCBlbGVtZW50IGluIHRoZSB0cmlwbGV0IGlzIHRoZSB0eXBlIGRlY2xhcmF0aW9uIHRoYXQgaGFzIHRoZSBpc3N1ZS4KLy8vIFRoZSBzZWNvbmQgZWxlbWVudCBpbiB0aGUgdHJpcGxldCBpcyB0aGUgZXJyb3IgbWVzc2FnZS4gIFRoZSB0aGlyZCBlbGVtZW50Ci8vLyBpbiB0aGUgdHJpcGxldCBpcyB0aGUgY29udGV4dC4KTGlzdDxPYmplY3Q+IGdldE5vblNpbXBsaWNpdHlJc3N1ZXNGb3JUeXBlVmFyaWFibGVzKAogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB2YXJpYWJsZXMpIHsKICBpZiAodmFyaWFibGVzID09IG51bGwpIHJldHVybiA8T2JqZWN0PltdOwogIHJldHVybiBnZXRJbmJvdW5kUmVmZXJlbmNlSXNzdWVzKHZhcmlhYmxlcyk7Cn0KCi8vLyBGaW5kcyBub24tc2ltcGxpY2l0eSBpc3N1ZXMgZm9yIHRoZSBnaXZlbiBbZGVjbGFyYXRpb25dLgovLy8KLy8vIFRoZSBpc3N1ZXMgYXJlIHRob3NlIGNhdXNlZCBieSByYXcgdHlwZXMgd2l0aCBpbmJvdW5kIHJlZmVyZW5jZXMgaW4gdGhlCi8vLyBib3VuZHMgb2YgdHlwZSB2YXJpYWJsZXMgZnJvbSBbZGVjbGFyYXRpb25dIGFuZCBieSBjeWNsZXMgb2YgcmF3IHR5cGVzCi8vLyBjb250YWluaW5nIFtkZWNsYXJhdGlvbl0uCi8vLwovLy8gUmV0dXJucyBmbGF0dGVuZWQgbGlzdCBvZiB0cmlwbGV0cywgZWFjaCB0cmlwbGV0IHJlcHJlc2VudGluZyBhbiBpc3N1ZS4gIFRoZQovLy8gZmlyc3QgZWxlbWVudCBpbiB0aGUgdHJpcGxldCBpcyB0aGUgdHlwZSBkZWNsYXJhdGlvbiB0aGF0IGhhcyB0aGUgaXNzdWUuCi8vLyBUaGUgc2Vjb25kIGVsZW1lbnQgaW4gdGhlIHRyaXBsZXQgaXMgdGhlIGVycm9yIG1lc3NhZ2UuICBUaGUgdGhpcmQgZWxlbWVudAovLy8gaW4gdGhlIHRyaXBsZXQgaXMgdGhlIGNvbnRleHQuCkxpc3Q8T2JqZWN0PiBnZXROb25TaW1wbGljaXR5SXNzdWVzRm9yRGVjbGFyYXRpb24oCiAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGRlY2xhcmF0aW9uLAogICAge2Jvb2wgcGVyZm9ybUVycm9yUmVjb3Zlcnk6IHRydWV9KSB7CiAgdmFyIGlzc3VlcyA9IDxPYmplY3Q+W107CiAgaWYgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlciAmJiBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgIGlzc3Vlcy5hZGRBbGwoZ2V0SW5ib3VuZFJlZmVyZW5jZUlzc3VlcyhkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzKSk7CiAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBUeXBlQWxpYXNCdWlsZGVyICYmCiAgICAgIGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgaXNzdWVzLmFkZEFsbChnZXRJbmJvdW5kUmVmZXJlbmNlSXNzdWVzKGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMpKTsKICB9CiAgTGlzdDxMaXN0PE9iamVjdD4+IGN5Y2xlc1RvUmVwb3J0ID0gPExpc3Q8T2JqZWN0Pj5bXTsKICBmb3IgKExpc3Q8T2JqZWN0PiBjeWNsZSBpbiBmaW5kUmF3VHlwZUN5Y2xlcyhkZWNsYXJhdGlvbikpIHsKICAgIC8vIFRvIGF2b2lkIHJlcG9ydGluZyB0aGUgc2FtZSBlcnJvciBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBjeWNsZSwgd2Ugb25seQogICAgLy8gZG8gc28gaWYgaXQgY29tZXMgdGhlIGZpcnN0IGluIHRoZSBsZXhpY29ncmFwaGljYWwgb3JkZXIuICBOb3RlIHRoYXQKICAgIC8vIG9uZS1lbGVtZW50IGN5Y2xlcyBzaG91bGRuJ3QgYmUgY2hlY2tlZCwgYXMgdGhleSBhcmUgbG9vcHMuCiAgICBpZiAoY3ljbGUubGVuZ3RoID09IDIpIHsKICAgICAgY3ljbGVzVG9SZXBvcnQuYWRkKGN5Y2xlKTsKICAgIH0gZWxzZSB7CiAgICAgIFN0cmluZyBkZWNsYXJhdGlvblBhdGhBbmROYW1lID0KICAgICAgICAgICIke2RlY2xhcmF0aW9uLmZpbGVVcml9OiR7ZGVjbGFyYXRpb24ubmFtZX0iOwogICAgICBTdHJpbmcgbGV4TWluUGF0aEFuZE5hbWUgPSBudWxsOwogICAgICBmb3IgKGludCBpID0gMTsgaSA8IGN5Y2xlLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgTmFtZWRUeXBlQnVpbGRlciB0eXBlID0gY3ljbGVbaV07CiAgICAgICAgU3RyaW5nIHBhdGhBbmROYW1lID0KICAgICAgICAgICAgIiR7dHlwZS5kZWNsYXJhdGlvbi5maWxlVXJpfToke3R5cGUuZGVjbGFyYXRpb24ubmFtZX0iOwogICAgICAgIGlmIChsZXhNaW5QYXRoQW5kTmFtZSA9PSBudWxsIHx8CiAgICAgICAgICAgIGxleE1pblBhdGhBbmROYW1lLmNvbXBhcmVUbyhwYXRoQW5kTmFtZSkgPiAwKSB7CiAgICAgICAgICBsZXhNaW5QYXRoQW5kTmFtZSA9IHBhdGhBbmROYW1lOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGVjbGFyYXRpb25QYXRoQW5kTmFtZSA9PSBsZXhNaW5QYXRoQW5kTmFtZSkgewogICAgICAgIGN5Y2xlc1RvUmVwb3J0LmFkZChjeWNsZSk7CiAgICAgIH0KICAgIH0KICB9CiAgTGlzdDxPYmplY3Q+IHJhd1R5cGVDeWNsZXNBc0lzc3VlcyA9CiAgICAgIGNvbnZlcnRSYXdUeXBlQ3ljbGVzSW50b0lzc3VlcyhkZWNsYXJhdGlvbiwgY3ljbGVzVG9SZXBvcnQpOwogIGlzc3Vlcy5hZGRBbGwocmF3VHlwZUN5Y2xlc0FzSXNzdWVzKTsKCiAgaWYgKHBlcmZvcm1FcnJvclJlY292ZXJ5KSB7CiAgICBicmVha0N5Y2xlcyhjeWNsZXNUb1JlcG9ydCk7CiAgfQoKICByZXR1cm4gaXNzdWVzOwp9CgovLy8gQnJlYWsgcmF3IGdlbmVyaWMgdHlwZSBbY3ljbGVzXSBhcyBlcnJvciByZWNvdmVyeS4KLy8vCi8vLyBUaGUgW2N5Y2xlc10gYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGZvciB0aGUgcmV0dXJuIHZhbHVlCi8vLyBvZiBbZmluZFJhd1R5cGVDeWNsZXNdLgp2b2lkIGJyZWFrQ3ljbGVzKExpc3Q8TGlzdDxPYmplY3Q+PiBjeWNsZXMpIHsKICBmb3IgKExpc3Q8T2JqZWN0PiBjeWNsZSBpbiBjeWNsZXMpIHsKICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgPSBjeWNsZVswXTsKICAgIHZhcmlhYmxlLmJvdW5kID0gbnVsbDsKICB9Cn0KCnZvaWQgZmluZEdlbmVyaWNGdW5jdGlvblR5cGVzKFR5cGVCdWlsZGVyIHR5cGUsIHtMaXN0PFR5cGVCdWlsZGVyPiByZXN1bHR9KSB7CiAgcmVzdWx0ID8/PSA8VHlwZUJ1aWxkZXI+W107CiAgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgaWYgKHR5cGUudHlwZVZhcmlhYmxlcyAhPSBudWxsICYmIHR5cGUudHlwZVZhcmlhYmxlcy5sZW5ndGggPiAwKSB7CiAgICAgIHJlc3VsdC5hZGQodHlwZSk7CgogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdHlwZVZhcmlhYmxlIGluIHR5cGUudHlwZVZhcmlhYmxlcykgewogICAgICAgIGZpbmRHZW5lcmljRnVuY3Rpb25UeXBlcyh0eXBlVmFyaWFibGUuYm91bmQsIHJlc3VsdDogcmVzdWx0KTsKICAgICAgICBmaW5kR2VuZXJpY0Z1bmN0aW9uVHlwZXModHlwZVZhcmlhYmxlLmRlZmF1bHRUeXBlLCByZXN1bHQ6IHJlc3VsdCk7CiAgICAgIH0KICAgIH0KICAgIGZpbmRHZW5lcmljRnVuY3Rpb25UeXBlcyh0eXBlLnJldHVyblR5cGUsIHJlc3VsdDogcmVzdWx0KTsKICAgIGlmICh0eXBlLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsIGluIHR5cGUuZm9ybWFscykgewogICAgICAgIGZpbmRHZW5lcmljRnVuY3Rpb25UeXBlcyhmb3JtYWwudHlwZSwgcmVzdWx0OiByZXN1bHQpOwogICAgICB9CiAgICB9CiAgfSBlbHNlIGlmICh0eXBlIGlzIE5hbWVkVHlwZUJ1aWxkZXIgJiYgdHlwZS5hcmd1bWVudHMgIT0gbnVsbCkgewogICAgZm9yIChUeXBlQnVpbGRlciBhcmd1bWVudCBpbiB0eXBlLmFyZ3VtZW50cykgewogICAgICBmaW5kR2VuZXJpY0Z1bmN0aW9uVHlwZXMoYXJndW1lbnQsIHJlc3VsdDogcmVzdWx0KTsKICAgIH0KICB9Cn0KCi8vLyBSZXR1cm5zIHRydWUgaWYgW3R5cGVdIGNvbnRhaW5zIGFueSB0eXBlIHZhcmlhYmxlcyB3aGF0c29ldmVyLiBUaGlzIHNob3VsZAovLy8gb25seSBiZSB1c2VkIGZvciB3b3JraW5nIGFyb3VuZCB0cmFuc2l0aW9uYWwgaXNzdWVzLgovLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIG1ldGhvZC4KYm9vbCBoYXNBbnlUeXBlVmFyaWFibGVzKERhcnRUeXBlIHR5cGUpIHsKICByZXR1cm4gdHlwZS5hY2NlcHQoY29uc3QgVHlwZVZhcmlhYmxlU2VhcmNoKCkpOwp9CgovLy8gRG9uJ3QgdXNlIHRoaXMgZGlyZWN0bHksIHVzZSBbaGFzQW55VHlwZVZhcmlhYmxlc10gaW5zdGVhZC4gQnV0IGRvbid0IHVzZQovLy8gdGhhdCBlaXRoZXIuCi8vIFRPRE8oYWhlKTogUmVtb3ZlIHRoaXMgY2xhc3MuCmNsYXNzIFR5cGVWYXJpYWJsZVNlYXJjaCBpbXBsZW1lbnRzIERhcnRUeXBlVmlzaXRvcjxib29sPiB7CiAgY29uc3QgVHlwZVZhcmlhYmxlU2VhcmNoKCk7CgogIGJvb2wgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUpID0+IHRocm93ICJ1bnN1cHBvcnRlZCI7CgogIGJvb2wgYW55VHlwZVZhcmlhYmxlcyhMaXN0PERhcnRUeXBlPiB0eXBlcykgewogICAgZm9yIChEYXJ0VHlwZSB0eXBlIGluIHR5cGVzKSB7CiAgICAgIGlmICh0eXBlLmFjY2VwdCh0aGlzKSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgPT4gZmFsc2U7CgogIGJvb2wgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBub2RlKSA9PiBmYWxzZTsKCiAgYm9vbCB2aXNpdFZvaWRUeXBlKFZvaWRUeXBlIG5vZGUpID0+IGZhbHNlOwoKICBib29sIHZpc2l0Qm90dG9tVHlwZShCb3R0b21UeXBlIG5vZGUpID0+IGZhbHNlOwoKICBib29sIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIHJldHVybiBhbnlUeXBlVmFyaWFibGVzKG5vZGUudHlwZUFyZ3VtZW50cyk7CiAgfQoKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBpZiAoYW55VHlwZVZhcmlhYmxlcyhub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSkgcmV0dXJuIHRydWU7CiAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgdmFyaWFibGUgaW4gbm9kZS50eXBlUGFyYW1ldGVycykgewogICAgICBpZiAodmFyaWFibGUuYm91bmQuYWNjZXB0KHRoaXMpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZvciAoTmFtZWRUeXBlIHR5cGUgaW4gbm9kZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgaWYgKHR5cGUudHlwZS5hY2NlcHQodGhpcykpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpID0+IHRydWU7CgogIGJvb2wgdmlzaXRUeXBlZGVmVHlwZShUeXBlZGVmVHlwZSBub2RlKSB7CiAgICByZXR1cm4gYW55VHlwZVZhcmlhYmxlcyhub2RlLnR5cGVBcmd1bWVudHMpOwogIH0KfQqDbwBNTj8BIQkUEhkVFhcVExcbFRIBRQE+AU0BHQkWIB0aGhUgHQFAAUkBHQkYMTA5LCsBPgFLSFFNEkYiO0UoIw8jCA0pKSY5UQwKFzQpJjwkGCJCJUsMChcIBiwlIw9NBiZFSVBRICo9JicKCAYgPCAUNToIBhMEHQIBHRY9PSEiMxk8CDoGQBMGITY5QyU2LywIBh1RBhEEASUpJkwGKiBHBhwaASYzPi1CJycySxoRIwoIBgEgMTk1PygsMx8gHRsdIhoRHwoIBgEiPxwpFgYBE0YGAREEDwIBGExPAgFQOwQaYiJHUUYBLzMEAUhGM0AuPS4rQz8GKy9IHgYEAS85Lj0uLDExTR4GBAERAgFOSRExFiccAVEyGQE0LwEwNCYzMBcpGgYBPiY3OT8KJjk0DAowKkk+DAokQzoMCjcIBgEwKwYEAU4PKRkEAgE2BC0vIBQEIyIoFg0kN0MKCAYsRCZKLxdKCjUXUAoIBiA8RAgGBA8CAVEEUE9LIkotNS04JD8eIwgGJC8yBgQjAgFRBFFKTh1DKSIiPS0hUEkkQh8MChoqNgo4IVBJJEIfDAoaKjYKMC8kPigqMgo0MSZAKiw0DAo3NywoOywuNg4MCggNNR1CCAYsGUUmQSYfSgosH1AKCAYgPB1FCAYEHwIBUQRRUU9JThs0IjM9SkIwMkdHUT4iRzgpMD5JLRAMCjROIEU2MAoIBgQRAgFPBEhQUUsXBExIHzIzLTogIzwjJiQzUEwqRzNEEA4MNjNOLDE2OVASEA4MOTkuSS4zODsaURQSEA4MCisIDTZNCAYtUSdCJhhMCiw2NAoIBiE9UAgGBBACAUoESktPTi8ETg9LIUpGJB9NOAoIBjAtSCYrT0QMCggGMzMoQygtUUYODAoIBgQRAgFRBFEcBFFRT0ktRSQnHQ8vKBw4MiQNKDIxLjcyG08IOAEfSEUbBgQRAgFCBEwkBFFNTyM1KywvAgE9BExLHgRRTU8jMygpG0pJMCtJBDg/UExDHSENJjgnMiodRCk8KwoIOSMIBgQnQygBHiEEARECATcEURwuJy0bBAIBTh4lRxgBRUZMCAY/IDw/CAZDMzoGBAIBTzkiKjICAU4RITweAT4BMCMqBhIEATQBNAEuATIBMDEEAS5COjQGMy8GEgQBPwEsMQQCATdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3R5cGVfYWxnb3JpdGhtcy5kYXJ0O3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2FwaS5kYXJ0hswvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIFRoaXMgbGlicmFyeSBleHBvcnRzIGFsbCBBUEkgZnJvbSBLZXJuZWwgdGhhdCBjYW4gYmUgdXNlZCB0aHJvdWdob3V0IGZhc3RhLgpsaWJyYXJ5IGZhc3RhLmtlcm5lbF9hcGk7CgpleHBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBzaG93IFN1YnN0aXR1dGlvbiwgc3Vic3RpdHV0ZTsKCmV4cG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHk7CgpleHBvcnQgJ3BhY2thZ2U6a2VybmVsL2Nsb25lLmRhcnQnIHNob3cgQ2xvbmVWaXNpdG9yOwoKZXhwb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKZXhwb3J0ICdwYWNrYWdlOmtlcm5lbC90cmFuc2Zvcm1hdGlvbnMvZmxhZ3MuZGFydCcgc2hvdyBUcmFuc2Zvcm1lckZsYWc7CgpleHBvcnQgJ3BhY2thZ2U6a2VybmVsL3RleHQvYXN0X3RvX3RleHQuZGFydCcgc2hvdyBOYW1lU3lzdGVtOwoKZXhwb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZUVudmlyb25tZW50OwoKZXhwb3J0ICdwYWNrYWdlOmtlcm5lbC9zcmMvYm91bmRzX2NoZWNrcy5kYXJ0JyBzaG93IGluc3RhbnRpYXRlVG9Cb3VuZHM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RleHQvYXN0X3RvX3RleHQuZGFydCcgc2hvdyBOYW1lU3lzdGVtLCBQcmludGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBDbGFzcywgTWVtYmVyLCBOb2RlOwoKdm9pZCBwcmludE5vZGVPbihOb2RlIG5vZGUsIFN0cmluZ1Npbmsgc2luaywge05hbWVTeXN0ZW0gc3ludGhldGljTmFtZXN9KSB7CiAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgc2luay53cml0ZSgibnVsbCIpOwogIH0gZWxzZSB7CiAgICBzeW50aGV0aWNOYW1lcyA/Pz0gbmV3IE5hbWVTeXN0ZW0oKTsKICAgIG5ldyBQcmludGVyKHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcykud3JpdGVOb2RlKG5vZGUpOwogIH0KfQoKdm9pZCBwcmludFF1YWxpZmllZE5hbWVPbihNZW1iZXIgbWVtYmVyLCBTdHJpbmdTaW5rIHNpbmssCiAgICB7TmFtZVN5c3RlbSBzeW50aGV0aWNOYW1lc30pIHsKICBpZiAobWVtYmVyID09IG51bGwpIHsKICAgIHNpbmsud3JpdGUoIm51bGwiKTsKICB9IGVsc2UgewogICAgc3ludGhldGljTmFtZXMgPz89IG5ldyBOYW1lU3lzdGVtKCk7CiAgICBzaW5rLndyaXRlKG1lbWJlci5lbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaSk7CiAgICBzaW5rLndyaXRlKCI6OiIpOwogICAgQ2xhc3MgY2xzID0gbWVtYmVyLmVuY2xvc2luZ0NsYXNzOwogICAgaWYgKGNscyAhPSBudWxsKSB7CiAgICAgIHNpbmsud3JpdGUoY2xzLm5hbWUgPz8gc3ludGhldGljTmFtZXMubmFtZUNsYXNzKGNscykpOwogICAgICBzaW5rLndyaXRlKCI6OiIpOwogICAgfQogICAgc2luay53cml0ZShtZW1iZXIubmFtZT8ubmFtZSA/PyBzeW50aGV0aWNOYW1lcy5uYW1lTWVtYmVyKG1lbWJlcikpOwogIH0KfQo2AE5OPAFQGgFJAUIBNgE4AUkBPwFEAUkBSAE7AUwWGAspRwQCATojGBgLKTMWJxc9GAZIBAIBMnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2FwaS5kYXJ0P3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2FzdF9hcGkuZGFydIxOLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBUaGlzIGxpYnJhcnkgZXhwb3J0cyBhbGwgQVBJIGZyb20gS2VybmVsJ3MgYXN0LmRhcnQgdGhhdCBjYW4gYmUgdXNlZAovLy8gdGhyb3VnaG91dCBmYXN0YS4KbGlicmFyeSBmYXN0YS5rZXJuZWxfYXN0X2FwaTsKCmV4cG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIEFzRXhwcmVzc2lvbiwKICAgICAgICBBc3NlcnRTdGF0ZW1lbnQsCiAgICAgICAgQXN5bmNNYXJrZXIsCiAgICAgICAgQmxvY2ssCiAgICAgICAgQm90dG9tVHlwZSwKICAgICAgICBCcmVha1N0YXRlbWVudCwKICAgICAgICBDYXRjaCwKICAgICAgICBDaGVja0xpYnJhcnlJc0xvYWRlZCwKICAgICAgICBDbGFzcywKICAgICAgICBDb21wb25lbnQsCiAgICAgICAgQ29uc3RydWN0b3IsCiAgICAgICAgQ29uc3RydWN0b3JJbnZvY2F0aW9uLAogICAgICAgIENvbnRpbnVlU3dpdGNoU3RhdGVtZW50LAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEVtcHR5U3RhdGVtZW50LAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCwKICAgICAgICBGaWVsZCwKICAgICAgICBGb3JJblN0YXRlbWVudCwKICAgICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uLAogICAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbiwKICAgICAgICBGdW5jdGlvbk5vZGUsCiAgICAgICAgRnVuY3Rpb25UeXBlLAogICAgICAgIEluaXRpYWxpemVyLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgSW52YWxpZEV4cHJlc3Npb24sCiAgICAgICAgSW52YWxpZFR5cGUsCiAgICAgICAgSXNFeHByZXNzaW9uLAogICAgICAgIExhYmVsZWRTdGF0ZW1lbnQsCiAgICAgICAgTGV0LAogICAgICAgIExpYnJhcnksCiAgICAgICAgTGlicmFyeURlcGVuZGVuY3ksCiAgICAgICAgTGlicmFyeVBhcnQsCiAgICAgICAgTGlzdExpdGVyYWwsCiAgICAgICAgTG9jYWxJbml0aWFsaXplciwKICAgICAgICBMb2NhdGlvbiwKICAgICAgICBNYXBFbnRyeSwKICAgICAgICBNYXBMaXRlcmFsLAogICAgICAgIE1lbWJlciwKICAgICAgICBNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIE5hbWUsCiAgICAgICAgTmFtZWRFeHByZXNzaW9uLAogICAgICAgIE5hbWVkVHlwZSwKICAgICAgICBOb2RlLAogICAgICAgIE51bGxMaXRlcmFsLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBQcm9jZWR1cmVLaW5kLAogICAgICAgIFByb3BlcnR5R2V0LAogICAgICAgIFByb3BlcnR5U2V0LAogICAgICAgIFJldGhyb3csCiAgICAgICAgUmV0dXJuU3RhdGVtZW50LAogICAgICAgIFN0YXRlbWVudCwKICAgICAgICBTdGF0aWNHZXQsCiAgICAgICAgU3RhdGljSW52b2NhdGlvbiwKICAgICAgICBTdGF0aWNTZXQsCiAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiwKICAgICAgICBTdXBlckluaXRpYWxpemVyLAogICAgICAgIFN1cGVyTWV0aG9kSW52b2NhdGlvbiwKICAgICAgICBTdXBlclByb3BlcnR5U2V0LAogICAgICAgIFN3aXRjaENhc2UsCiAgICAgICAgVGhpc0V4cHJlc3Npb24sCiAgICAgICAgVHJlZU5vZGUsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBUeXBlZGVmLAogICAgICAgIFR5cGVkZWZUeXBlLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24sCiAgICAgICAgVmFyaWFibGVHZXQsCiAgICAgICAgVmFyaWFibGVTZXQsCiAgICAgICAgVm9pZFR5cGUsCiAgICAgICAgc2V0UGFyZW50czsKCmV4cG9ydCAna2VybmVsX3NoYWRvd19hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHNKdWRnbWVudCwKICAgICAgICBBc3NlcnRJbml0aWFsaXplckp1ZGdtZW50LAogICAgICAgIEFzc2VydFN0YXRlbWVudEp1ZGdtZW50LAogICAgICAgIEJsb2NrSnVkZ21lbnQsCiAgICAgICAgQ2FzY2FkZUp1ZGdtZW50LAogICAgICAgIENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnQsCiAgICAgICAgQ29udGludWVTd2l0Y2hKdWRnbWVudCwKICAgICAgICBEZWZlcnJlZENoZWNrSnVkZ21lbnQsCiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudEp1ZGdtZW50LAogICAgICAgIEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudCwKICAgICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uSnVkZ21lbnQsCiAgICAgICAgRnVuY3Rpb25Ob2RlSnVkZ21lbnQsCiAgICAgICAgSWZKdWRnbWVudCwKICAgICAgICBJZk51bGxKdWRnbWVudCwKICAgICAgICBJbnZhbGlkU3VwZXJJbml0aWFsaXplckp1ZGdtZW50LAogICAgICAgIExvYWRMaWJyYXJ5VGVhck9mZkp1ZGdtZW50LAogICAgICAgIE1ldGhvZEludm9jYXRpb25KdWRnbWVudCwKICAgICAgICBOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbkp1ZGdtZW50LAogICAgICAgIE51bGxBd2FyZU1ldGhvZEludm9jYXRpb25KdWRnbWVudCwKICAgICAgICBOdWxsQXdhcmVQcm9wZXJ0eUdldEp1ZGdtZW50LAogICAgICAgIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJKdWRnbWVudCwKICAgICAgICBSZXR1cm5KdWRnbWVudCwKICAgICAgICBTaGFkb3dGaWVsZEluaXRpYWxpemVyLAogICAgICAgIFNoYWRvd0ludmFsaWRGaWVsZEluaXRpYWxpemVyLAogICAgICAgIFNoYWRvd0ludmFsaWRJbml0aWFsaXplciwKICAgICAgICBTaGFkb3dMYXJnZUludExpdGVyYWwsCiAgICAgICAgU3VwZXJJbml0aWFsaXplckp1ZGdtZW50LAogICAgICAgIFN1cGVyTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50LAogICAgICAgIFN1cGVyUHJvcGVydHlHZXRKdWRnbWVudCwKICAgICAgICBTd2l0Y2hDYXNlSnVkZ21lbnQsCiAgICAgICAgU3dpdGNoU3RhdGVtZW50SnVkZ21lbnQsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50LAogICAgICAgIFZhcmlhYmxlR2V0SnVkZ21lbnQsCiAgICAgICAgWWllbGRKdWRnbWVudDsKegBOTjwBSRYeASEJExYZFQ8UGA8eDxMVHyESFRgUHQ8YHRwWFhUXGxUWGg0RGxUVGhISFBAaDhkTDhUTFxUVERkTExoTHRofGhQYEhcbERUdFRUSFAEgCRsjIRcZIyAfJS4lHhQYKSQiKSsmKBggJyIfIiciHCElHRcBNnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2FzdF9hcGkuZGFydE5zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Byb3RvdHlwZS9pbmNyZW1lbnRhbF9rZXJuZWxfZ2VuZXJhdG9yLmRhcnSSzC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwva2VybmVsLmRhcnQnCiAgICBzaG93IENvbXBvbmVudCwgUHJvY2VkdXJlLCBEYXJ0VHlwZSwgVHlwZVBhcmFtZXRlcjsKCmltcG9ydCAnLi4vYmFzZS9wcm9jZXNzZWRfb3B0aW9ucy5kYXJ0JyBzaG93IFByb2Nlc3NlZE9wdGlvbnM7CgppbXBvcnQgJy4uL2Zhc3RhL2NvbXBpbGVyX2NvbnRleHQuZGFydCcgc2hvdyBDb21waWxlckNvbnRleHQ7CgppbXBvcnQgJy4uL2Zhc3RhL2luY3JlbWVudGFsX2NvbXBpbGVyLmRhcnQnIHNob3cgSW5jcmVtZW50YWxDb21waWxlcjsKCmltcG9ydCAnLi4vZmFzdGEvc2Nhbm5lci9zdHJpbmdfc2Nhbm5lci5kYXJ0JyBzaG93IFN0cmluZ1NjYW5uZXI7CgppbXBvcnQgJ2NvbXBpbGVyX29wdGlvbnMuZGFydCcgc2hvdyBDb21waWxlck9wdGlvbnM7CgphYnN0cmFjdCBjbGFzcyBJbmNyZW1lbnRhbEtlcm5lbEdlbmVyYXRvciB7CiAgZmFjdG9yeSBJbmNyZW1lbnRhbEtlcm5lbEdlbmVyYXRvcihDb21waWxlck9wdGlvbnMgb3B0aW9ucywgVXJpIGVudHJ5UG9pbnQsCiAgICAgIFtVcmkgaW5pdGlhbGl6ZUZyb21EaWxsVXJpLCBib29sIG91dGxpbmVPbmx5XSkgewogICAgcmV0dXJuIG5ldyBJbmNyZW1lbnRhbENvbXBpbGVyKAogICAgICAgIG5ldyBDb21waWxlckNvbnRleHQoCiAgICAgICAgICAgIG5ldyBQcm9jZXNzZWRPcHRpb25zKG9wdGlvbnM6IG9wdGlvbnMsIGlucHV0czogW2VudHJ5UG9pbnRdKSksCiAgICAgICAgaW5pdGlhbGl6ZUZyb21EaWxsVXJpLAogICAgICAgIG91dGxpbmVPbmx5KTsKICB9CgogIC8vLyBJbml0aWFsaXplIHRoZSBpbmNyZW1lbnRhbCBjb21waWxlciBmcm9tIGEgY29tcG9uZW50LgogIC8vLwogIC8vLyBOb3RpY2UgdGhhdCB0aGUgY29tcG9uZW50IGhhcyB0byBpbmNsdWRlIHRoZSBwbGF0Zm9ybSwgYW5kIHRoYXQgbm8gb3RoZXIKICAvLy8gcGxhdGZvcm0gd2lsbCBiZSBsb2FkZWQuCiAgZmFjdG9yeSBJbmNyZW1lbnRhbEtlcm5lbEdlbmVyYXRvci5mcm9tQ29tcG9uZW50KAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywgVXJpIGVudHJ5UG9pbnQsIENvbXBvbmVudCBjb21wb25lbnQsCiAgICAgIFtib29sIG91dGxpbmVPbmx5XSkgewogICAgcmV0dXJuIG5ldyBJbmNyZW1lbnRhbENvbXBpbGVyLmZyb21Db21wb25lbnQoCiAgICAgICAgbmV3IENvbXBpbGVyQ29udGV4dCgKICAgICAgICAgICAgbmV3IFByb2Nlc3NlZE9wdGlvbnMob3B0aW9uczogb3B0aW9ucywgaW5wdXRzOiBbZW50cnlQb2ludF0pKSwKICAgICAgICBjb21wb25lbnQsCiAgICAgICAgb3V0bGluZU9ubHkpOwogIH0KCiAgLy8vIFJldHVybnMgYSBjb21wb25lbnQgd2hvc2UgbGlicmFyaWVzIGFyZSB0aGUgcmVjb21waWxlZCBsaWJyYXJpZXMsCiAgLy8vIG9yIC0gaW4gdGhlIGNhc2Ugb2YgW2Z1bGxDb21wb25lbnRdIC0gYSBmdWxsIENvbXBvbmVudC4KICBGdXR1cmU8Q29tcG9uZW50PiBjb21wdXRlRGVsdGEoe0xpc3Q8VXJpPiBlbnRyeVBvaW50cywgYm9vbCBmdWxsQ29tcG9uZW50fSk7CgogIC8vLyBSZXR1cm5zIFtDb3JlVHlwZXNdIHVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uLgogIC8vLyBWYWxpZCBhZnRlciBbY29tcHV0ZURlbHRhXSBpcyBjYWxsZWQuCiAgQ29yZVR5cGVzIGdldENvcmVUeXBlcygpOwoKICAvLy8gUmV0dXJucyBbQ2xhc3NIaWVyYXJjaHldIHVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uLgogIC8vLyBWYWxpZCBhZnRlciBbY29tcHV0ZURlbHRhXSBpcyBjYWxsZWQuCiAgQ2xhc3NIaWVyYXJjaHkgZ2V0Q2xhc3NIaWVyYXJjaHkoKTsKCiAgLy8vIFJlbW92ZSB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpbGUgW3VyaV0gZnJvbSB0aGUgc2V0IG9mCiAgLy8vIHZhbGlkIGZpbGVzLiAgVGhpcyBndWFyYW50ZWVzIHRoYXQgdGhvc2UgZmlsZXMgd2lsbCBiZSByZS1yZWFkIG9uIHRoZQogIC8vLyBuZXh0IGNhbGwgdG8gW2NvbXB1dGVEZWx0YV0pLgogIHZvaWQgaW52YWxpZGF0ZShVcmkgdXJpKTsKCiAgLy8vIEludmFsaWRhdGUgYWxsIGxpYnJhcmllcyB0aGF0IHdlcmUgYnVpbGQgZnJvbSBzb3VyY2UuCiAgLy8vCiAgLy8vIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhIG51bWJlciBvZiBjYWxscyB0byBbaW52YWxpZGF0ZV06IE9uZSBmb3IgZWFjaCBVUkkKICAvLy8gdGhhdCBoYXBwZW5zIHRvIGhhdmUgYmVlbiByZWFkIGZyb20gc291cmNlLgogIC8vLyBTYWlkIGFub3RoZXIgd2F5LCB0aGlzIGludmFsaWRhdGVzIGV2ZXJ5dGhpbmcgbm90IGxvYWRlZCBmcm9tIGRpbGwKICAvLy8gKGF0IHN0YXJ0dXApIG9yIHZpYSBbc2V0TW9kdWxlc1RvTG9hZE9uTmV4dENvbXB1dGVEZWx0YV0uCiAgdm9pZCBpbnZhbGlkYXRlQWxsU291cmNlcygpOwoKICAvLy8gU2V0IHRoZSBnaXZlbiBbY29tcG9uZW50c10gYXMgY29tcG9uZW50cyB0byBsb2FkIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbgogIC8vLyBvZiBbY29tcHV0ZURlbHRhXS4KICAvLy8KICAvLy8gSWYgc3BlY2lmaWVkLCBhbGwgbGlicmFyaWVzIG5vdCBjb21waWxlZCBmcm9tIHNvdXJjZSBhbmQgbm90IGluY2x1ZGVkIGluCiAgLy8vIHRoZXNlIGNvbXBvbmVudHMgd2lsbCBiZSBpbnZhbGlkYXRlZCBhbmQgdGhlIGxpYnJhcmllcyBpbnNpZGUgdGhlc2UKICAvLy8gY29tcG9uZW50cyB3aWxsIGJlIGxvYWRlZCBpbnN0ZWFkLgogIC8vLwogIC8vLyBVc2VmdWwgZm9yLCBmb3IgaW5zdGFuY2UsIG1vZHVsYXIgY29tcGlsYXRpb24sIHdoZXJlIG1vZHVsZXMKICAvLy8gKGNyZWF0ZWQgZXh0ZXJuYWxseSkgdmlhIHRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWRkZWQsIGNoYW5nZWQgb3IKICAvLy8gcmVtb3ZlZC4KICB2b2lkIHNldE1vZHVsZXNUb0xvYWRPbk5leHRDb21wdXRlRGVsdGEoTGlzdDxDb21wb25lbnQ+IGNvbXBvbmVudHMpOwoKICAvLy8gQ29tcGlsZSBbZXhwcmVzc2lvbl0gYXMgYW4gW0V4cHJlc3Npb25dLiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGF0CiAgLy8vIGV4cHJlc3Npb24gaXMgY29tcGlsZWQuCiAgLy8vCiAgLy8vIFtleHByZXNzaW9uXSBtYXkgdXNlIHRoZSB2YXJpYWJsZXMgc3VwcGxpZWQgaW4gW2RlZmluaXRpb25zXSBhcyBmcmVlCiAgLy8vIHZhcmlhYmxlcyBhbmQgW3R5cGVEZWZpbml0aW9uc10gYXMgZnJlZSB0eXBlIHZhcmlhYmxlcy4gVGhlc2Ugd2lsbCBiZWNvbWUKICAvLy8gcmVxdWlyZWQgcGFyYW1ldGVycyB0byB0aGUgY29tcGlsZWQgZnVuY3Rpb24uIEFsbCBlbGVtZW50cyBvZgogIC8vLyBbZGVmaW5pdGlvbnNdIGFuZCBbdHlwZURlZmluaXRpb25zXSB3aWxsIGJlY29tZSBwYXJhbWV0ZXJzL3R5cGUKICAvLy8gcGFyYW1ldGVycywgd2hldGhlciBvciBub3QgdGhleSBhcHBlYXIgZnJlZSBpbiBbZXhwcmVzc2lvbl0uIFRoZSB0eXBlCiAgLy8vIHBhcmFtZXRlcnMgc2hvdWxkIGhhdmUgYSBudWxsIHBhcmVudCBwb2ludGVyLgogIC8vLwogIC8vLyBbbGlicmFyeVVyaV0gbXVzdCByZWZlciB0byBlaXRoZXIgYSBwcmV2aW91c2x5IGNvbXBpbGVkIGxpYnJhcnkuCiAgLy8vIFtjbGFzc05hbWVdIG1heSBvcHRpb25hbGx5IHJlZmVyIHRvIGEgY2xhc3Mgd2l0aGluIHN1Y2ggbGlicmFyeSB0byB1c2UgZm9yCiAgLy8vIHRoZSBzY29wZSBvZiB0aGUgZXhwcmVzc2lvbi4gSW4gdGhhdCBjYXNlLCBbaXNTdGF0aWNdIGluZGljYXRlcyB3aGV0aGVyCiAgLy8vIHRoZSBzY29wZSBjYW4gYWNjZXNzIFt0aGlzXS4KICAvLy8KICAvLy8gSXQgaXMgaWxsZWdhbCB0byB1c2UgImF3YWl0IiBpbiBbZXhwcmVzc2lvbl0gYW5kIHRoZSBjb21waWxlZCBmdW5jdGlvbgogIC8vLyB3aWxsIGFsd2F5cyBiZSBzeW5jaHJvbm91cy4KICAvLy8KICAvLy8gW2NvbXB1dGVEZWx0YV0gbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2UgcHJpb3IuCiAgLy8vCiAgLy8vIFtjb21waWxlRXhwcmVzc2lvbl0gd2lsbCByZXR1cm4gW251bGxdIGlmIHRoZSBsaWJyYXJ5IG9yIGNsYXNzIGZvcgogIC8vLyBbZW5jbG9zaW5nTm9kZV0gY291bGQgbm90IGJlIGZvdW5kLiBPdGhlcndpc2UsIGVycm9ycyBhcmUgcmVwb3J0ZWQgaW4gdGhlCiAgLy8vIG5vcm1hbCB3YXkuCiAgRnV0dXJlPFByb2NlZHVyZT4gY29tcGlsZUV4cHJlc3Npb24oCiAgICAgIFN0cmluZyBleHByZXNzaW9uLAogICAgICBNYXA8U3RyaW5nLCBEYXJ0VHlwZT4gZGVmaW5pdGlvbnMsCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZURlZmluaXRpb25zLAogICAgICBTdHJpbmcgc3ludGhldGljUHJvY2VkdXJlTmFtZSwKICAgICAgVXJpIGxpYnJhcnlVcmksCiAgICAgIFtTdHJpbmcgY2xhc3NOYW1lLAogICAgICBib29sIGlzU3RhdGljID0gZmFsc2VdKTsKfQoKYm9vbCBpc0xlZ2FsSWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewogIHJldHVybiBTdHJpbmdTY2FubmVyLmlzTGVnYWxJZGVudGlmaWVyKGlkZW50aWZpZXIpOwp9CnoATk48ASEBQgE4ASQ4AT8BPgFGAUIBNQEsTjckHUsfFgQBPAZPHzREHDIdSxMWBAFIPk8BMywcATgsJgFLTCQcATwGUDJJQB8BTRkGT0opBkNLD0cBSR4GS1BERkw0BkdRTiMGTSIGQAZJUBInGSkrJRYZHwIBLDYCAUVwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9pbmNyZW1lbnRhbF9rZXJuZWxfZ2VuZXJhdG9yLmRhcnREc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2FwaV9wcm90b3R5cGUvbWVtb3J5X2ZpbGVfc3lzdGVtLmRhcnSPYC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZyb250X2VuZC5tZW1vcnlfZmlsZV9zeXN0ZW07CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCmltcG9ydCAnZmlsZV9zeXN0ZW0uZGFydCc7CgovLy8gQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgW0ZpbGVTeXN0ZW1dIHdoaWNoIHBlcmZvcm1zIGl0cyBvcGVyYXRpb25zIG9uIGFuCi8vLyBpbi1tZW1vcnkgdmlydHVhbCBmaWxlIHN5c3RlbS4KLy8vCi8vLyBOb3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQgYnkgY2xpZW50cy4KY2xhc3MgTWVtb3J5RmlsZVN5c3RlbSBpbXBsZW1lbnRzIEZpbGVTeXN0ZW0gewogIGZpbmFsIE1hcDxVcmksIFVpbnQ4TGlzdD4gX2ZpbGVzID0ge307CiAgZmluYWwgU2V0PFVyaT4gX2RpcmVjdG9yaWVzID0gbmV3IFNldDxVcmk+KCk7CgogIC8vLyBUaGUgImN1cnJlbnQgZGlyZWN0b3J5IiBpbiB0aGUgaW4tbWVtb3J5IHZpcnR1YWwgZmlsZSBzeXN0ZW0uCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCB0byBjb252ZXJ0IHJlbGF0aXZlIFVSSXMgdG8gYWJzb2x1dGUgVVJJcy4KICAvLy8KICAvLy8gQWx3YXlzIGVuZHMgaW4gYSB0cmFpbGluZyAnLycuCiAgVXJpIGN1cnJlbnREaXJlY3Rvcnk7CgogIE1lbW9yeUZpbGVTeXN0ZW0oVXJpIGN1cnJlbnREaXJlY3RvcnkpCiAgICAgIDogY3VycmVudERpcmVjdG9yeSA9IF9hZGRUcmFpbGluZ1NsYXNoKGN1cnJlbnREaXJlY3RvcnkpOwoKICBAb3ZlcnJpZGUKICBNZW1vcnlGaWxlU3lzdGVtRW50aXR5IGVudGl0eUZvclVyaShVcmkgdXJpKSB7CiAgICByZXR1cm4gbmV3IE1lbW9yeUZpbGVTeXN0ZW1FbnRpdHkuXygKICAgICAgICB0aGlzLCBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmVVcmkodXJpKS5ub3JtYWxpemVQYXRoKCkpOwogIH0KCiAgU3RyaW5nIGdldCBkZWJ1Z1N0cmluZyB7CiAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBfZmlsZXMuZm9yRWFjaCgodXJpLCBfKSA9PiBzYi53cml0ZSgiLSAkdXJpXG4iKSk7CiAgICBfZGlyZWN0b3JpZXMuZm9yRWFjaCgodXJpKSA9PiBzYi53cml0ZSgiLSAkdXJpXG4iKSk7CiAgICByZXR1cm4gJyRzYic7CiAgfQoKICBzdGF0aWMgVXJpIF9hZGRUcmFpbGluZ1NsYXNoKFVyaSB1cmkpIHsKICAgIGlmICghdXJpLnBhdGguZW5kc1dpdGgoJy8nKSkgewogICAgICB1cmkgPSB1cmkucmVwbGFjZShwYXRoOiB1cmkucGF0aCArICcvJyk7CiAgICB9CiAgICByZXR1cm4gdXJpOwogIH0KfQoKLy8vIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFtGaWxlU3lzdGVtRW50aXR5XSBmb3IgdXNlIGJ5Ci8vLyBbTWVtb3J5RmlsZVN5c3RlbV0uCmNsYXNzIE1lbW9yeUZpbGVTeXN0ZW1FbnRpdHkgaW1wbGVtZW50cyBGaWxlU3lzdGVtRW50aXR5IHsKICBmaW5hbCBNZW1vcnlGaWxlU3lzdGVtIF9maWxlU3lzdGVtOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBVcmkgdXJpOwoKICBNZW1vcnlGaWxlU3lzdGVtRW50aXR5Ll8odGhpcy5fZmlsZVN5c3RlbSwgdGhpcy51cmkpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHVyaS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIG90aGVyIGlzIE1lbW9yeUZpbGVTeXN0ZW1FbnRpdHkgJiYKICAgICAgb3RoZXIudXJpID09IHVyaSAmJgogICAgICBpZGVudGljYWwob3RoZXIuX2ZpbGVTeXN0ZW0sIF9maWxlU3lzdGVtKTsKCiAgLy8vIENyZWF0ZSBhIGRpcmVjdG9yeSBmb3IgdGhpcyBmaWxlIHN5c3RlbSBlbnRyeS4KICAvLy8KICAvLy8gSWYgdGhlIGVudHJ5IGlzIGFuIGV4aXN0aW5nIGZpbGUsIHRoaXMgaXMgYW4gZXJyb3IuCiAgdm9pZCBjcmVhdGVEaXJlY3RvcnkoKSB7CiAgICBpZiAoX2ZpbGVTeXN0ZW0uX2ZpbGVzW3VyaV0gIT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbih1cmksICdFbnRyeSAkdXJpIGlzIGEgZmlsZS4nKTsKICAgIH0KICAgIF9maWxlU3lzdGVtLl9kaXJlY3Rvcmllcy5hZGQodXJpKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxib29sPiBleGlzdHMoKSBhc3luYyB7CiAgICByZXR1cm4gX2ZpbGVTeXN0ZW0uX2ZpbGVzW3VyaV0gIT0gbnVsbCB8fAogICAgICAgIF9maWxlU3lzdGVtLl9kaXJlY3Rvcmllcy5jb250YWlucyh1cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPExpc3Q8aW50Pj4gcmVhZEFzQnl0ZXMoKSBhc3luYyB7CiAgICBVaW50OExpc3QgY29udGVudHMgPSBfZmlsZVN5c3RlbS5fZmlsZXNbdXJpXTsKICAgIGlmIChjb250ZW50cyA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKHVyaSwgJ0ZpbGUgJHVyaSBkb2VzIG5vdCBleGlzdC4nKTsKICAgIH0KICAgIHJldHVybiBjb250ZW50czsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxTdHJpbmc+IHJlYWRBc1N0cmluZygpIGFzeW5jIHsKICAgIExpc3Q8aW50PiBieXRlcyA9IGF3YWl0IHJlYWRBc0J5dGVzKCk7CiAgICB0cnkgewogICAgICByZXR1cm4gdXRmOC5kZWNvZGUoYnl0ZXMpOwogICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24odXJpLCBlLm1lc3NhZ2UpOwogICAgfQogIH0KCiAgLy8vIFdyaXRlcyB0aGUgZ2l2ZW4gcmF3IGJ5dGVzIHRvIHRoaXMgZmlsZSBzeXN0ZW0gZW50aXR5LgogIC8vLwogIC8vLyBJZiBubyBmaWxlIGV4aXN0cywgb25lIGlzIGNyZWF0ZWQuICBJZiBhIGZpbGUgZXhpc3RzIGFscmVhZHksIGl0IGlzCiAgLy8vIG92ZXJ3cml0dGVuLgogIHZvaWQgd3JpdGVBc0J5dGVzU3luYyhMaXN0PGludD4gYnl0ZXMpIHsKICAgIGlmIChieXRlcyBpcyBVaW50OExpc3QpIHsKICAgICAgX3VwZGF0ZSh1cmksIGJ5dGVzKTsKICAgIH0gZWxzZSB7CiAgICAgIF91cGRhdGUodXJpLCBuZXcgVWludDhMaXN0LmZyb21MaXN0KGJ5dGVzKSk7CiAgICB9CiAgfQoKICAvLy8gV3JpdGVzIHRoZSBnaXZlbiBzdHJpbmcgdG8gdGhpcyBmaWxlIHN5c3RlbSBlbnRpdHkuCiAgLy8vCiAgLy8vIFRoZSBzdHJpbmcgaXMgZW5jb2RlZCBhcyBVVEYtOC4KICAvLy8KICAvLy8gSWYgbm8gZmlsZSBleGlzdHMsIG9uZSBpcyBjcmVhdGVkLiAgSWYgYSBmaWxlIGV4aXN0cyBhbHJlYWR5LCBpdCBpcwogIC8vLyBvdmVyd3JpdHRlbi4KICB2b2lkIHdyaXRlQXNTdHJpbmdTeW5jKFN0cmluZyBzKSB7CiAgICAvLyBOb3RlOiB0aGUgcmV0dXJuIHR5cGUgb2YgdXRmOC5lbmNvZGUgaXMgTGlzdDxpbnQ+LCBidXQgaW4gcHJhY3RpY2UgaXQKICAgIC8vIGFsd2F5cyByZXR1cm5zIFVpbnQ4TGlzdC4gIFdlIHJlbHkgb24gdGhhdCBmb3IgZWZmaWNpZW5jeSwgc28gdGhhdCB3ZQogICAgLy8gZG9uJ3QgaGF2ZSB0byBtYWtlIGFuIGV4dHJhIGNvcHkuCiAgICBfdXBkYXRlKHVyaSwgdXRmOC5lbmNvZGUocykgYXMgVWludDhMaXN0KTsKICB9CgogIHZvaWQgX3VwZGF0ZShVcmkgdXJpLCBVaW50OExpc3QgZGF0YSkgewogICAgaWYgKF9maWxlU3lzdGVtLl9kaXJlY3Rvcmllcy5jb250YWlucyh1cmkpKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKHVyaSwgJ0VudHJ5ICR1cmkgaXMgYSBkaXJlY3RvcnkuJyk7CiAgICB9CiAgICBfZmlsZVN5c3RlbS5fZmlsZXNbdXJpXSA9IGRhdGE7CiAgfQp9CoCLAE5OPAEmARUXGgEbAVAjBDsvKTABRAY+BiUYASlAAQwxKUEEARshNjkSBAEqIy8GEAQCAT0YOyYBDBEBOAEMJAEMJCkaMQE1BjobK0MGJwQBDCAuMAQBDCoyHEcGFQQBDCgrCiElNQYEAT0GShMrHhsNMwYEAToGJgZKEyVNTSkvBAEqMkgGJAQCATtwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9tZW1vcnlfZmlsZV9zeXN0ZW0uZGFydDdzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlcl9ncmFwaC5kYXJ0iF4vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5idWlsZGVyX2dyYXBoOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydCcgc2hvdyBMaWJyYXJ5RGVwZW5kZW5jeSwgTGlicmFyeVBhcnQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3V0aWwvZ3JhcGguZGFydCcgc2hvdyBHcmFwaDsKCmltcG9ydCAnYnVpbGRlci9idWlsZGVyLmRhcnQnIHNob3cgTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJ2V4cG9ydC5kYXJ0JyBzaG93IEV4cG9ydDsKCmltcG9ydCAnaW1wb3J0LmRhcnQnIHNob3cgSW1wb3J0OwoKaW1wb3J0ICdkaWxsL2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgRGlsbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdzb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUxpYnJhcnlCdWlsZGVyOwoKY2xhc3MgQnVpbGRlckdyYXBoIGltcGxlbWVudHMgR3JhcGg8VXJpPiB7CiAgZmluYWwgTWFwPFVyaSwgTGlicmFyeUJ1aWxkZXI+IGJ1aWxkZXJzOwoKICBCdWlsZGVyR3JhcGgodGhpcy5idWlsZGVycyk7CgogIEl0ZXJhYmxlPFVyaT4gZ2V0IHZlcnRpY2VzID0+IGJ1aWxkZXJzLmtleXM7CgogIEl0ZXJhYmxlPFVyaT4gbmVpZ2hib3JzT2YoVXJpIHZlcnRleCkgc3luYyogewogICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGJ1aWxkZXJzW3ZlcnRleF07CiAgICBpZiAobGlicmFyeSA9PSBudWxsKSB7CiAgICAgIHRocm93ICJMaWJyYXJ5IG5vdCBmb3VuZDogJHZlcnRleCI7CiAgICB9CiAgICBpZiAobGlicmFyeSBpcyBTb3VyY2VMaWJyYXJ5QnVpbGRlcikgewogICAgICBmb3IgKEltcG9ydCBpbXBvcnQgaW4gbGlicmFyeS5pbXBvcnRzKSB7CiAgICAgICAgLy8gJ2ltcG9ydGVkJyBjYW4gYmUgbnVsbCBmb3IgZmFrZSBpbXBvcnRzLCBzdWNoIGFzIGRhcnQtZXh0Oi4KICAgICAgICBpZiAoaW1wb3J0LmltcG9ydGVkICE9IG51bGwpIHsKICAgICAgICAgIFVyaSB1cmkgPSBpbXBvcnQuaW1wb3J0ZWQudXJpOwogICAgICAgICAgaWYgKGJ1aWxkZXJzLmNvbnRhaW5zS2V5KHVyaSkpIHsKICAgICAgICAgICAgeWllbGQgdXJpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKEV4cG9ydCBleHBvcnQgaW4gbGlicmFyeS5leHBvcnRzKSB7CiAgICAgICAgVXJpIHVyaSA9IGV4cG9ydC5leHBvcnRlZC51cmk7CiAgICAgICAgaWYgKGJ1aWxkZXJzLmNvbnRhaW5zS2V5KHVyaSkpIHsKICAgICAgICAgIHlpZWxkIHVyaTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChTb3VyY2VMaWJyYXJ5QnVpbGRlciBwYXJ0IGluIGxpYnJhcnkucGFydHMpIHsKICAgICAgICBVcmkgdXJpID0gcGFydC51cmk7CiAgICAgICAgaWYgKGJ1aWxkZXJzLmNvbnRhaW5zS2V5KHVyaSkpIHsKICAgICAgICAgIHlpZWxkIHVyaTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobGlicmFyeSBpcyBEaWxsTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgLy8gSW1wb3J0cyBhbmQgZXhwb3J0cwogICAgICBmb3IgKExpYnJhcnlEZXBlbmRlbmN5IGRlcGVuZGVuY3kgaW4gbGlicmFyeS5saWJyYXJ5LmRlcGVuZGVuY2llcykgewogICAgICAgIFVyaSB1cmkgPSBkZXBlbmRlbmN5LnRhcmdldExpYnJhcnkuaW1wb3J0VXJpOwogICAgICAgIGlmIChidWlsZGVycy5jb250YWluc0tleSh1cmkpKSB7CiAgICAgICAgICB5aWVsZCB1cmk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBQYXJ0cwogICAgICBmb3IgKExpYnJhcnlQYXJ0IHBhcnQgaW4gbGlicmFyeS5saWJyYXJ5LnBhcnRzKSB7CiAgICAgICAgVXJpIHVyaSA9IGxpYnJhcnkudXJpLnJlc29sdmUocGFydC5wYXJ0VXJpKTsKICAgICAgICBpZiAoYnVpbGRlcnMuY29udGFpbnNLZXkodXJpKSkgewogICAgICAgICAgeWllbGQgdXJpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQpLAE5OPAEdAUkBNAEzASIBIgFBAUcBKysBHwEvATAvGyoGKy9HJykrFwwKCC8nKRUKCDkcKRUKCDAdSzYpFQoIAQ84NSkVCggGBAIBLnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyX2dyYXBoLmRhcnQ0c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2NvbWJpbmF0b3IuZGFydIK7Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuY29tYmluYXRvcjsKCmNsYXNzIENvbWJpbmF0b3IgewogIGZpbmFsIGJvb2wgaXNTaG93OwoKICBmaW5hbCBTZXQ8U3RyaW5nPiBuYW1lczsKCiAgQ29tYmluYXRvcih0aGlzLmlzU2hvdywgdGhpcy5uYW1lcywgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKTsKCiAgQ29tYmluYXRvci5zaG93KEl0ZXJhYmxlPFN0cmluZz4gbmFtZXMsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkKICAgICAgOiB0aGlzKHRydWUsIG5ldyBTZXQ8U3RyaW5nPi5mcm9tKG5hbWVzKSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CgogIENvbWJpbmF0b3IuaGlkZShJdGVyYWJsZTxTdHJpbmc+IG5hbWVzLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpCiAgICAgIDogdGhpcyhmYWxzZSwgbmV3IFNldDxTdHJpbmc+LmZyb20obmFtZXMpLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKCiAgYm9vbCBnZXQgaXNIaWRlID0+ICFpc1Nob3c7Cn0KFwBOTjwBGgETFQEbAUQBR0YBR0cBHgIBK3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9jb21iaW5hdG9yLmRhcnRJc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3V0aWwvZXJyb3JfcmVwb3J0ZXJfZmlsZV9jb3BpZXIuZGFydILlLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDppbycgc2hvdyBEaXJlY3RvcnksIEZpbGUsIEdaaXBDb2RlYzsKClVyaSBzYXZlQXNHemlwKExpc3Q8aW50PiBkYXRhLCBTdHJpbmcgZmlsZW5hbWUpIHsKICAvLyBUT0RPKGplbnNqKTogVGhpcyBzaG91bGQgYmUgZG9uZSB2aWEgdGhlIEZpbGVTeXN0ZW0gaW5zdGVhZCwgYnV0IGl0CiAgLy8gY3VycmVudGx5IGRvZXNuJ3Qgc3VwcG9ydCB3cml0aW5nLgogIEdaaXBDb2RlYyBnWmlwQ29kZWMgPSBuZXcgR1ppcENvZGVjKCk7CiAgTGlzdDxpbnQ+IGd6aXBwZWRJbml0aWFsaXplZEZyb21EYXRhID0gZ1ppcENvZGVjLmVuY29kZShkYXRhKTsKICBEaXJlY3RvcnkgdGVtcERpciA9IERpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKCIkZmlsZW5hbWUiKTsKICBGaWxlIGZpbGUgPSBuZXcgRmlsZSgiJHt0ZW1wRGlyLnBhdGh9LyR7ZmlsZW5hbWV9Lmd6Iik7CiAgZmlsZS53cml0ZUFzQnl0ZXNTeW5jKGd6aXBwZWRJbml0aWFsaXplZEZyb21EYXRhKTsKICByZXR1cm4gZmlsZS51cmk7Cn0KEgBOTjwBMgEySSgpQUg6NRMCAUBwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXRpbC9lcnJvcl9yZXBvcnRlcl9maWxlX2NvcGllci5kYXJ0PHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9oeWJyaWRfZmlsZV9zeXN0ZW0uZGFydIeSLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBBIG1lbW9yeSArIHBoeXNpY2FsIGZpbGUgc3lzdGVtIHVzZWQgdG8gbW9jayBpbnB1dCBmb3IgdGVzdHMgYnV0IHByb3ZpZGUKLy8vIHNkayBzb3VyY2VzIGZyb20gZGlzay4KbGlicmFyeSBmcm9udF9lbmQuc3JjLmh5YnJpZF9maWxlX3N5c3RlbTsKCmltcG9ydCAnZGFydDphc3luYyc7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydCc7CmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9tZW1vcnlfZmlsZV9zeXN0ZW0uZGFydCc7CmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9zdGFuZGFyZF9maWxlX3N5c3RlbS5kYXJ0JzsKCi8vLyBBIGZpbGUgc3lzdGVtIHRoYXQgbWl4ZXMgZmlsZXMgZnJvbSBtZW1vcnkgYW5kIGEgcGh5c2ljYWwgZmlsZSBzeXN0ZW0uIEFsbAovLy8gbWVtb3J5IGVudGl0aWVzIHRha2UgcHJpb3RpdHkgb3ZlciBmaWxlIHN5c3RlbSBlbnRpdGllcy4KY2xhc3MgSHlicmlkRmlsZVN5c3RlbSBpbXBsZW1lbnRzIEZpbGVTeXN0ZW0gewogIGZpbmFsIE1lbW9yeUZpbGVTeXN0ZW0gbWVtb3J5OwogIGZpbmFsIEZpbGVTeXN0ZW0gcGh5c2ljYWw7CgogIEh5YnJpZEZpbGVTeXN0ZW0odGhpcy5tZW1vcnksIFtGaWxlU3lzdGVtIF9waHlzaWNhbF0pCiAgICAgIDogcGh5c2ljYWwgPSBfcGh5c2ljYWwgPz8gU3RhbmRhcmRGaWxlU3lzdGVtLmluc3RhbmNlOwoKICBAb3ZlcnJpZGUKICBGaWxlU3lzdGVtRW50aXR5IGVudGl0eUZvclVyaShVcmkgdXJpKSA9PgogICAgICBuZXcgSHlicmlkRmlsZVN5c3RlbUVudGl0eSh1cmksIHRoaXMpOwp9CgovLy8gRW50aXR5IHRoYXQgZGVsZWdhdGVzIHRvIGFuIHVuZGVybHlpbmcgbWVtb3J5IG9yIHBoaXNpY2FsIGZpbGUgc3lzdGVtCi8vLyBlbnRpdHkuCmNsYXNzIEh5YnJpZEZpbGVTeXN0ZW1FbnRpdHkgaW1wbGVtZW50cyBGaWxlU3lzdGVtRW50aXR5IHsKICBmaW5hbCBVcmkgdXJpOwogIEZpbGVTeXN0ZW1FbnRpdHkgX2RlbGVnYXRlOwogIGZpbmFsIEh5YnJpZEZpbGVTeXN0ZW0gX2ZzOwoKICBIeWJyaWRGaWxlU3lzdGVtRW50aXR5KHRoaXMudXJpLCB0aGlzLl9mcyk7CgogIEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5PiBnZXQgZGVsZWdhdGUgYXN5bmMgewogICAgaWYgKF9kZWxlZ2F0ZSAhPSBudWxsKSByZXR1cm4gX2RlbGVnYXRlOwogICAgRmlsZVN5c3RlbUVudGl0eSBlbnRpdHkgPSBfZnMubWVtb3J5LmVudGl0eUZvclVyaSh1cmkpOwogICAgaWYgKCgodXJpLnNjaGVtZSAhPSAnZmlsZScgJiYgdXJpLnNjaGVtZSAhPSAnZGF0YScpICYmCiAgICAgICAgICAgIF9mcy5waHlzaWNhbCBpcyBTdGFuZGFyZEZpbGVTeXN0ZW0pIHx8CiAgICAgICAgYXdhaXQgZW50aXR5LmV4aXN0cygpKSB7CiAgICAgIF9kZWxlZ2F0ZSA9IGVudGl0eTsKICAgICAgcmV0dXJuIF9kZWxlZ2F0ZTsKICAgIH0KICAgIHJldHVybiBfZGVsZWdhdGUgPSBfZnMucGh5c2ljYWwuZW50aXR5Rm9yVXJpKHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBGdXR1cmU8Ym9vbD4gZXhpc3RzKCkgYXN5bmMgPT4gKGF3YWl0IGRlbGVnYXRlKS5leGlzdHMoKTsKCiAgQG92ZXJyaWRlCiAgRnV0dXJlPExpc3Q8aW50Pj4gcmVhZEFzQnl0ZXMoKSBhc3luYyA9PiAoYXdhaXQgZGVsZWdhdGUpLnJlYWRBc0J5dGVzKCk7CgogIEBvdmVycmlkZQogIEZ1dHVyZTxTdHJpbmc+IHJlYWRBc1N0cmluZygpIGFzeW5jID0+IChhd2FpdCBkZWxlZ2F0ZSkucmVhZEFzU3RyaW5nKCk7Cn0KPABOTjwBTRsqARUBLDM1AU89LyEdATg9AQwsLQIBSgw7ER4eAS4BMC08OzMhGhgGNwQBDDwBDEsBDEoCATNwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaHlicmlkX2ZpbGVfc3lzdGVtLmRhcnRHc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfbGlicmFyeV9idWlsZGVyLmRhcnTAARRbLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEua2VybmVsX2xpYnJhcnlfYnVpbGRlcjsKCmltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IGpzb25FbmNvZGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEFyZ3VtZW50cywKICAgICAgICBDbGFzcywKICAgICAgICBDb25zdHJ1Y3RvciwKICAgICAgICBDb25zdHJ1Y3Rvckludm9jYXRpb24sCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRXhwcmVzc2lvbiwKICAgICAgICBGaWVsZCwKICAgICAgICBGdW5jdGlvbk5vZGUsCiAgICAgICAgRnVuY3Rpb25UeXBlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBMaWJyYXJ5RGVwZW5kZW5jeSwKICAgICAgICBMaWJyYXJ5UGFydCwKICAgICAgICBMaXN0TGl0ZXJhbCwKICAgICAgICBNYXBMaXRlcmFsLAogICAgICAgIE1lbWJlciwKICAgICAgICBOYW1lLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBQcm9jZWR1cmVLaW5kLAogICAgICAgIFNldExpdGVyYWwsCiAgICAgICAgU3RhdGljSW52b2NhdGlvbiwKICAgICAgICBTdHJpbmdMaXRlcmFsLAogICAgICAgIFN1cGVydHlwZSwKICAgICAgICBUeXBlZGVmLAogICAgICAgIFR5cGVQYXJhbWV0ZXIsCiAgICAgICAgVHlwZVBhcmFtZXRlclR5cGUsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiwKICAgICAgICBWb2lkVHlwZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2Nsb25lLmRhcnQnIHNob3cgQ2xvbmVWaXNpdG9yOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9zcmMvYm91bmRzX2NoZWNrcy5kYXJ0JwogICAgc2hvdwogICAgICAgIFR5cGVBcmd1bWVudElzc3VlLAogICAgICAgIGZpbmRUeXBlQXJndW1lbnRJc3N1ZXMsCiAgICAgICAgZmluZFR5cGVBcmd1bWVudElzc3Vlc0Zvckludm9jYXRpb24sCiAgICAgICAgZ2V0R2VuZXJpY1R5cGVOYW1lOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBzdWJzdGl0dXRlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZUVudmlyb25tZW50OwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL2V4cG9ydC5kYXJ0JyBzaG93IEV4cG9ydDsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBGb3JtYXR0ZWRNZXNzYWdlLAogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGVDYXVzZSwKICAgICAgICBtZXNzYWdlR2VuZXJpY0Z1bmN0aW9uVHlwZUluQm91bmQsCiAgICAgICAgbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnQsCiAgICAgICAgbWVzc2FnZUluY29ycmVjdFR5cGVBcmd1bWVudFZhcmlhYmxlLAogICAgICAgIG1lc3NhZ2VUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZSwKICAgICAgICBtZXNzYWdlVHlwZVZhcmlhYmxlU2FtZU5hbWVBc0VuY2xvc2luZywKICAgICAgICBub0xlbmd0aCwKICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGUsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRXhwb3J0LAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZEV4cG9ydEluVHlwZSwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRJbXBvcnQsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkSW1wb3J0SW5UeXBlLAogICAgICAgIHRlbXBsYXRlRXhwb3J0SGlkZXNFeHBvcnQsCiAgICAgICAgdGVtcGxhdGVHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudCwKICAgICAgICB0ZW1wbGF0ZUltcG9ydEhpZGVzSW1wb3J0LAogICAgICAgIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50LAogICAgICAgIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5SZXR1cm5UeXBlLAogICAgICAgIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5mZXJyZWQsCiAgICAgICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWQsCiAgICAgICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZCwKICAgICAgICB0ZW1wbGF0ZUludGVyc2VjdGlvblR5cGVBc1R5cGVBcmd1bWVudCwKICAgICAgICB0ZW1wbGF0ZUxvYWRMaWJyYXJ5SGlkZXNNZW1iZXIsCiAgICAgICAgdGVtcGxhdGVMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydCwKICAgICAgICB0ZW1wbGF0ZUxvY2FsRGVmaW5pdGlvbkhpZGVzSW1wb3J0LAogICAgICAgIHRlbXBsYXRlUGF0Y2hJbmplY3Rpb25GYWlsZWQsCiAgICAgICAgdGVtcGxhdGVUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlOwoKaW1wb3J0ICcuLi9pbXBvcnQuZGFydCcgc2hvdyBJbXBvcnQ7CgppbXBvcnQgJy4uL2xvYWRlci5kYXJ0JyBzaG93IExvYWRlcjsKCmltcG9ydCAnLi4vbW9kaWZpZXIuZGFydCcKICAgIHNob3cKICAgICAgICBhYnN0cmFjdE1hc2ssCiAgICAgICAgaGFzQ29uc3RDb25zdHJ1Y3Rvck1hc2ssCiAgICAgICAgaGFzSW5pdGlhbGl6ZXJNYXNrLAogICAgICAgIGluaXRpYWxpemluZ0Zvcm1hbE1hc2ssCiAgICAgICAgbWl4aW5EZWNsYXJhdGlvbk1hc2ssCiAgICAgICAgbmFtZWRNaXhpbkFwcGxpY2F0aW9uTWFzaywKICAgICAgICBzdGF0aWNNYXNrOwoKaW1wb3J0ICcuLi9uYW1lcy5kYXJ0JyBzaG93IGluZGV4U2V0TmFtZTsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmV4cGVjdGVkLCB1bmhhbmRsZWQ7CgppbXBvcnQgJy4uL3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUNsYXNzQnVpbGRlcjsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcKICAgIHNob3cgRGVjbGFyYXRpb25CdWlsZGVyLCBTb3VyY2VMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcnJlci5kYXJ0JyBzaG93IFR5cGVJbmZlcnJlckltcGw7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQWNjZXNzRXJyb3JCdWlsZGVyLAogICAgICAgIEJ1aWx0aW5UeXBlQnVpbGRlciwKICAgICAgICBDbGFzc0J1aWxkZXIsCiAgICAgICAgQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyLAogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIER5bmFtaWNUeXBlQnVpbGRlciwKICAgICAgICBFbnVtQ29uc3RhbnRJbmZvLAogICAgICAgIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIsCiAgICAgICAgRnVuY3Rpb25UeXBlQnVpbGRlciwKICAgICAgICBJbXBsaWNpdEZpZWxkVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZUJ1aWxkZXIsCiAgICAgICAgQ29uc3RydWN0b3JCdWlsZGVyLAogICAgICAgIEVudW1CdWlsZGVyLAogICAgICAgIEZ1bmN0aW9uQnVpbGRlciwKICAgICAgICBUeXBlQWxpYXNCdWlsZGVyLAogICAgICAgIEtlcm5lbEZpZWxkQnVpbGRlciwKICAgICAgICBLZXJuZWxNZXRhZGF0YUJ1aWxkZXIsCiAgICAgICAgTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIsCiAgICAgICAgTmFtZWRUeXBlQnVpbGRlciwKICAgICAgICBQcm9jZWR1cmVCdWlsZGVyLAogICAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTG9hZExpYnJhcnlCdWlsZGVyLAogICAgICAgIE1lbWJlckJ1aWxkZXIsCiAgICAgICAgTWV0YWRhdGFCdWlsZGVyLAogICAgICAgIE5hbWVJdGVyYXRvciwKICAgICAgICBQcmVmaXhCdWlsZGVyLAogICAgICAgIFF1YWxpZmllZE5hbWUsCiAgICAgICAgU2NvcGUsCiAgICAgICAgVHlwZUJ1aWxkZXIsCiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyLAogICAgICAgIFVucmVzb2x2ZWRUeXBlLAogICAgICAgIFZvaWRUeXBlQnVpbGRlciwKICAgICAgICBjb21wYXJlUHJvY2VkdXJlcywKICAgICAgICB0b0tlcm5lbENvbWJpbmF0b3JzOwoKaW1wb3J0ICdtZXRhZGF0YV9jb2xsZWN0b3IuZGFydCc7CgppbXBvcnQgJ3R5cGVfYWxnb3JpdGhtcy5kYXJ0JwogICAgc2hvdwogICAgICAgIGNhbGN1bGF0ZUJvdW5kcywKICAgICAgICBmaW5kR2VuZXJpY0Z1bmN0aW9uVHlwZXMsCiAgICAgICAgZ2V0Tm9uU2ltcGxpY2l0eUlzc3Vlc0ZvckRlY2xhcmF0aW9uLAogICAgICAgIGdldE5vblNpbXBsaWNpdHlJc3N1ZXNGb3JUeXBlVmFyaWFibGVzOwoKY2xhc3MgS2VybmVsTGlicmFyeUJ1aWxkZXIgZXh0ZW5kcyBTb3VyY2VMaWJyYXJ5QnVpbGRlciB7CiAgZmluYWwgTGlicmFyeSBsaWJyYXJ5OwoKICBmaW5hbCBLZXJuZWxMaWJyYXJ5QnVpbGRlciBhY3R1YWxPcmlnaW47CgogIGZpbmFsIExpc3Q8RnVuY3Rpb25CdWlsZGVyPiBuYXRpdmVNZXRob2RzID0gPEZ1bmN0aW9uQnVpbGRlcj5bXTsKCiAgZmluYWwgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiBib3VuZGxlc3NUeXBlVmFyaWFibGVzID0KICAgICAgPFR5cGVWYXJpYWJsZUJ1aWxkZXI+W107CgogIC8vIEEgbGlzdCBvZiBhbHRlcm5hdGluZyBmb3J3YXJkZXJzIGFuZCB0aGUgcHJvY2VkdXJlcyB0aGV5IHdlcmUgZ2VuZXJhdGVkCiAgLy8gZm9yLiAgTm90ZSB0aGF0IGl0IG1heSBub3QgaW5jbHVkZSBhIGZvcndhcmRlci1vcmlnaW4gcGFpciBpbiBjYXNlcyB3aGVuCiAgLy8gdGhlIGZvcm1lciBkb2VzIG5vdCBuZWVkIHRvIGJlIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJvZHkgb2YgdGhlIGxhdHRlciB3YXMKICAvLyBidWlsdC4KICBmaW5hbCBMaXN0PFByb2NlZHVyZT4gZm9yd2FyZGVyc09yaWdpbnMgPSA8UHJvY2VkdXJlPltdOwoKICAvLyBMaXN0IG9mIHR5cGVzIGluZmVycmVkIGluIHRoZSBvdXRsaW5lLiAgRXJyb3JzIGluIHRoZXNlIHNob3VsZCBiZSByZXBvcnRlZAogIC8vIGRpZmZlcmVudGx5IHRoYW4gZm9yIHNwZWNpZmllZCB0eXBlcy4KICAvLyBUT0RPKGRtaXRyeWFzKTogIEZpbmQgYSB3YXkgdG8gbWFyayBpbmZlcnJlZCB0eXBlcy4KICBmaW5hbCBTZXQ8RGFydFR5cGU+IGluZmVycmVkVHlwZXMgPSBuZXcgU2V0PERhcnRUeXBlPi5pZGVudGl0eSgpOwoKICAvLyBBIGxpYnJhcnkgdG8gdXNlIGZvciBOYW1lcyBnZW5lcmF0ZWQgd2hlbiBjb21waWxpbmcgY29kZSBpbiB0aGlzIGxpYnJhcnkuCiAgLy8gVGhpcyBhbGxvd3MgY29kZSBnZW5lcmF0ZWQgaW4gb25lIGxpYnJhcnkgdG8gdXNlIHRoZSBwcml2YXRlIG5hbWVzcGFjZSBvZgogIC8vIGFub3RoZXIsIGZvciBleGFtcGxlIGR1cmluZyBleHByZXNzaW9uIGNvbXBpbGF0aW9uIChkZWJ1Z2dpbmcpLgogIExpYnJhcnkgZ2V0IG5hbWVPcmlnaW4gPT4gX25hbWVPcmlnaW4gPz8gbGlicmFyeTsKICBmaW5hbCBMaWJyYXJ5IF9uYW1lT3JpZ2luOwoKICAvLy8gRXhwb3J0cyB0aGF0IGNhbid0IGJlIHNlcmlhbGl6ZWQuCiAgLy8vCiAgLy8vIFRoZSBrZXkgaXMgdGhlIG5hbWUgb2YgdGhlIGV4cG9ydGVkIG1lbWJlci4KICAvLy8KICAvLy8gSWYgdGhlIG5hbWUgaXMgYGR5bmFtaWNgIG9yIGB2b2lkYCwgdGhpcyBsaWJyYXJ5IHJlZXhwb3J0cyB0aGUKICAvLy8gY29ycmVzcG9uZGluZyB0eXBlIGZyb20gYGRhcnQ6Y29yZWAsIGFuZCB0aGUgdmFsdWUgaXMgbnVsbC4KICAvLy8KICAvLy8gT3RoZXJ3aXNlLCB0aGlzIHJlcHJlc2VudHMgYW4gZXJyb3IgKGFuIGFtYmlndW91cyBleHBvcnQpLiBJbiB0aGlzIGNhc2UsCiAgLy8vIHRoZSBlcnJvciBtZXNzYWdlIGlzIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBtYXAuCiAgTWFwPFN0cmluZywgU3RyaW5nPiB1bnNlcmlhbGl6YWJsZUV4cG9ydHM7CgogIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gdW50eXBlZEluaXRpYWxpemluZ0Zvcm1hbHM7CgogIExpc3Q8S2VybmVsRmllbGRCdWlsZGVyPiBpbXBsaWNpdGx5VHlwZWRGaWVsZHM7CgogIEtlcm5lbExpYnJhcnlCdWlsZGVyKFVyaSB1cmksIFVyaSBmaWxlVXJpLCBMb2FkZXIgbG9hZGVyLCB0aGlzLmFjdHVhbE9yaWdpbiwKICAgICAge1Njb3BlIHNjb3BlLCBMaWJyYXJ5IHRhcmdldCwgTGlicmFyeSBuYW1lT3JpZ2lufSkKICAgICAgOiBsaWJyYXJ5ID0gdGFyZ2V0ID8/CiAgICAgICAgICAgIChhY3R1YWxPcmlnaW4/LmxpYnJhcnkgPz8gbmV3IExpYnJhcnkodXJpLCBmaWxlVXJpOiBmaWxlVXJpKSksCiAgICAgICAgX25hbWVPcmlnaW4gPSBuYW1lT3JpZ2luLAogICAgICAgIHN1cGVyKGxvYWRlciwgZmlsZVVyaSwgc2NvcGUpOwoKICBAb3ZlcnJpZGUKICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBnZXQgb3JpZ2luID0+IGFjdHVhbE9yaWdpbiA/PyB0aGlzOwoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5IGdldCB0YXJnZXQgPT4gbGlicmFyeTsKCiAgVXJpIGdldCB1cmkgPT4gbGlicmFyeS5pbXBvcnRVcmk7CgogIHZvaWQgc2V0TGFuZ3VhZ2VWZXJzaW9uKGludCBtYWpvciwgaW50IG1pbm9yKSB7CiAgICBpZiAobGlicmFyeS5sYW5ndWFnZVZlcnNpb25NYWpvciAhPSBudWxsKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxpYnJhcnkubGFuZ3VhZ2VWZXJzaW9uTWFqb3IgPSBtYWpvcjsKICAgIGxpYnJhcnkubGFuZ3VhZ2VWZXJzaW9uTWlub3IgPSBtaW5vcjsKICB9CgogIHZvaWQgYWRkU3ludGhldGljRGVjbGFyYXRpb25PZkR5bmFtaWMoKSB7CiAgICBhZGRCdWlsZGVyKAogICAgICAgICJkeW5hbWljIiwgbmV3IER5bmFtaWNUeXBlQnVpbGRlcihjb25zdCBEeW5hbWljVHlwZSgpLCB0aGlzLCAtMSksIC0xKTsKICB9CgogIFR5cGVCdWlsZGVyIGFkZE5hbWVkVHlwZSgKICAgICAgT2JqZWN0IG5hbWUsIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50cywgaW50IGNoYXJPZmZzZXQpIHsKICAgIHJldHVybiBhZGRUeXBlKG5ldyBOYW1lZFR5cGVCdWlsZGVyKG5hbWUsIGFyZ3VtZW50cyksIGNoYXJPZmZzZXQpOwogIH0KCiAgVHlwZUJ1aWxkZXIgYWRkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlLCBMaXN0PFR5cGVCdWlsZGVyPiBtaXhpbnMsIGludCBjaGFyT2Zmc2V0KSB7CiAgICByZXR1cm4gYWRkVHlwZShuZXcgTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIoc3VwZXJ0eXBlLCBtaXhpbnMpLCBjaGFyT2Zmc2V0KTsKICB9CgogIFR5cGVCdWlsZGVyIGFkZFZvaWRUeXBlKGludCBjaGFyT2Zmc2V0KSB7CiAgICByZXR1cm4gYWRkTmFtZWRUeXBlKCJ2b2lkIiwgbnVsbCwgY2hhck9mZnNldCkKICAgICAgLi5iaW5kKG5ldyBWb2lkVHlwZUJ1aWxkZXIoY29uc3QgVm9pZFR5cGUoKSwgdGhpcywgY2hhck9mZnNldCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRm9ybWF0dGVkTWVzc2FnZSBhZGRQcm9ibGVtKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLCBVcmkgZmlsZVVyaSwKICAgICAge2Jvb2wgd2FzSGFuZGxlZDogZmFsc2UsCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQsCiAgICAgIFNldmVyaXR5IHNldmVyaXR5LAogICAgICBib29sIHByb2JsZW1PbkxpYnJhcnk6IGZhbHNlfSkgewogICAgRm9ybWF0dGVkTWVzc2FnZSBmb3JtYXR0ZWRNZXNzYWdlID0gc3VwZXIuYWRkUHJvYmxlbSgKICAgICAgICBtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIGZpbGVVcmksCiAgICAgICAgd2FzSGFuZGxlZDogd2FzSGFuZGxlZCwKICAgICAgICBjb250ZXh0OiBjb250ZXh0LAogICAgICAgIHNldmVyaXR5OiBzZXZlcml0eSwKICAgICAgICBwcm9ibGVtT25MaWJyYXJ5OiB0cnVlKTsKICAgIGlmIChmb3JtYXR0ZWRNZXNzYWdlICE9IG51bGwpIHsKICAgICAgdGFyZ2V0LnByb2JsZW1zQXNKc29uID8/PSA8U3RyaW5nPltdOwogICAgICB0YXJnZXQucHJvYmxlbXNBc0pzb24uYWRkKGZvcm1hdHRlZE1lc3NhZ2UudG9Kc29uU3RyaW5nKCkpOwogICAgfQogICAgcmV0dXJuIGZvcm1hdHRlZE1lc3NhZ2U7CiAgfQoKICB2b2lkIGFkZENsYXNzKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgU3RyaW5nIGNsYXNzTmFtZSwKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLAogICAgICBUeXBlQnVpbGRlciBzdXBlcnR5cGUsCiAgICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZXMsCiAgICAgIGludCBzdGFydE9mZnNldCwKICAgICAgaW50IG5hbWVPZmZzZXQsCiAgICAgIGludCBlbmRPZmZzZXQsCiAgICAgIGludCBzdXBlcnR5cGVPZmZzZXQpIHsKICAgIC8vIE5lc3RlZCBkZWNsYXJhdGlvbiBiZWdhbiBpbiBgT3V0bGluZUJ1aWxkZXIuYmVnaW5DbGFzc0RlY2xhcmF0aW9uYC4KICAgIERlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbiA9IGVuZE5lc3RlZERlY2xhcmF0aW9uKGNsYXNzTmFtZSkKICAgICAgLi5yZXNvbHZlVHlwZXModHlwZVZhcmlhYmxlcywgdGhpcyk7CiAgICBhc3NlcnQoZGVjbGFyYXRpb24ucGFyZW50ID09IGxpYnJhcnlEZWNsYXJhdGlvbik7CiAgICBNYXA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPiBtZW1iZXJzID0gZGVjbGFyYXRpb24ubWVtYmVyczsKICAgIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IGNvbnN0cnVjdG9ycyA9IGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yczsKICAgIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IHNldHRlcnMgPSBkZWNsYXJhdGlvbi5zZXR0ZXJzOwoKICAgIFNjb3BlIGNsYXNzU2NvcGUgPSBuZXcgU2NvcGUobWVtYmVycywgc2V0dGVycywKICAgICAgICBzY29wZS53aXRoVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzKSwgImNsYXNzICRjbGFzc05hbWUiLAogICAgICAgIGlzTW9kaWZpYWJsZTogZmFsc2UpOwoKICAgIC8vIFdoZW4gbG9va2luZyB1cCBhIGNvbnN0cnVjdG9yLCB3ZSBkb24ndCBjb25zaWRlciB0eXBlIHZhcmlhYmxlcyBvciB0aGUKICAgIC8vIGxpYnJhcnkgc2NvcGUuCiAgICBTY29wZSBjb25zdHJ1Y3RvclNjb3BlID0KICAgICAgICBuZXcgU2NvcGUoY29uc3RydWN0b3JzLCBudWxsLCBudWxsLCBjbGFzc05hbWUsIGlzTW9kaWZpYWJsZTogZmFsc2UpOwogICAgYm9vbCBpc01peGluRGVjbGFyYXRpb24gPSBmYWxzZTsKICAgIGlmIChtb2RpZmllcnMgJiBtaXhpbkRlY2xhcmF0aW9uTWFzayAhPSAwKSB7CiAgICAgIGlzTWl4aW5EZWNsYXJhdGlvbiA9IHRydWU7CiAgICAgIG1vZGlmaWVycyA9IChtb2RpZmllcnMgJiB+bWl4aW5EZWNsYXJhdGlvbk1hc2spIHwgYWJzdHJhY3RNYXNrOwogICAgfQogICAgaWYgKGRlY2xhcmF0aW9uLmhhc0NvbnN0Q29uc3RydWN0b3IpIHsKICAgICAgbW9kaWZpZXJzIHw9IGhhc0NvbnN0Q29uc3RydWN0b3JNYXNrOwogICAgfQogICAgQ2xhc3NCdWlsZGVyIGNscyA9IG5ldyBTb3VyY2VDbGFzc0J1aWxkZXIoCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgbW9kaWZpZXJzLAogICAgICAgIGNsYXNzTmFtZSwKICAgICAgICB0eXBlVmFyaWFibGVzLAogICAgICAgIGFwcGx5TWl4aW5zKHN1cGVydHlwZSwgc3RhcnRPZmZzZXQsIG5hbWVPZmZzZXQsIGVuZE9mZnNldCwgY2xhc3NOYW1lLAogICAgICAgICAgICBpc01peGluRGVjbGFyYXRpb24sCiAgICAgICAgICAgIHR5cGVWYXJpYWJsZXM6IHR5cGVWYXJpYWJsZXMpLAogICAgICAgIGludGVyZmFjZXMsCiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQWRkIHRoZSBgb25gIGNsYXVzZSB0eXBlcyBvZiBhIG1peGluIGRlY2xhcmF0aW9uCiAgICAgICAgLy8gaGVyZS4KICAgICAgICBudWxsLAogICAgICAgIGNsYXNzU2NvcGUsCiAgICAgICAgY29uc3RydWN0b3JTY29wZSwKICAgICAgICB0aGlzLAogICAgICAgIG5ldyBMaXN0PENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlcj4uZnJvbShjb25zdHJ1Y3RvclJlZmVyZW5jZXMpLAogICAgICAgIHN0YXJ0T2Zmc2V0LAogICAgICAgIG5hbWVPZmZzZXQsCiAgICAgICAgZW5kT2Zmc2V0LAogICAgICAgIGlzTWl4aW5EZWNsYXJhdGlvbjogaXNNaXhpbkRlY2xhcmF0aW9uKTsKICAgIGxvYWRlci50YXJnZXQubWV0YWRhdGFDb2xsZWN0b3IKICAgICAgICA/LnNldERvY3VtZW50YXRpb25Db21tZW50KGNscy50YXJnZXQsIGRvY3VtZW50YXRpb25Db21tZW50KTsKCiAgICBjb25zdHJ1Y3RvclJlZmVyZW5jZXMuY2xlYXIoKTsKICAgIE1hcDxTdHJpbmcsIFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXNCeU5hbWUgPQogICAgICAgIGNoZWNrVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzLCBjbHMpOwogICAgdm9pZCBzZXRQYXJlbnQoU3RyaW5nIG5hbWUsIE1lbWJlckJ1aWxkZXIgbWVtYmVyKSB7CiAgICAgIHdoaWxlIChtZW1iZXIgIT0gbnVsbCkgewogICAgICAgIG1lbWJlci5wYXJlbnQgPSBjbHM7CiAgICAgICAgbWVtYmVyID0gbWVtYmVyLm5leHQ7CiAgICAgIH0KICAgIH0KCiAgICB2b2lkIHNldFBhcmVudEFuZENoZWNrQ29uZmxpY3RzKFN0cmluZyBuYW1lLCBNZW1iZXJCdWlsZGVyIG1lbWJlcikgewogICAgICBpZiAodHlwZVZhcmlhYmxlc0J5TmFtZSAhPSBudWxsKSB7CiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciB0diA9IHR5cGVWYXJpYWJsZXNCeU5hbWVbbmFtZV07CiAgICAgICAgaWYgKHR2ICE9IG51bGwpIHsKICAgICAgICAgIGNscy5hZGRQcm9ibGVtKHRlbXBsYXRlQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZS53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICAgIG1lbWJlci5jaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCwKICAgICAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICBtZXNzYWdlQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZUNhdXNlLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICB0di5maWxlVXJpLCB0di5jaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCkKICAgICAgICAgICAgICBdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0UGFyZW50KG5hbWUsIG1lbWJlcik7CiAgICB9CgogICAgbWVtYmVycy5mb3JFYWNoKHNldFBhcmVudEFuZENoZWNrQ29uZmxpY3RzKTsKICAgIGNvbnN0cnVjdG9ycy5mb3JFYWNoKHNldFBhcmVudEFuZENoZWNrQ29uZmxpY3RzKTsKICAgIHNldHRlcnMuZm9yRWFjaChzZXRQYXJlbnRBbmRDaGVja0NvbmZsaWN0cyk7CiAgICBhZGRCdWlsZGVyKGNsYXNzTmFtZSwgY2xzLCBuYW1lT2Zmc2V0KTsKICB9CgogIE1hcDxTdHJpbmcsIFR5cGVWYXJpYWJsZUJ1aWxkZXI+IGNoZWNrVHlwZVZhcmlhYmxlcygKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLCBEZWNsYXJhdGlvbiBvd25lcikgewogICAgaWYgKHR5cGVWYXJpYWJsZXM/LmlzRW1wdHkgPz8gdHJ1ZSkgcmV0dXJuIG51bGw7CiAgICBNYXA8U3RyaW5nLCBUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzQnlOYW1lID0KICAgICAgICA8U3RyaW5nLCBUeXBlVmFyaWFibGVCdWlsZGVyPnt9OwogICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHR2IGluIHR5cGVWYXJpYWJsZXMpIHsKICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciBleGlzdGluZyA9IHR5cGVWYXJpYWJsZXNCeU5hbWVbdHYubmFtZV07CiAgICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWUsIHR2LmNoYXJPZmZzZXQsCiAgICAgICAgICAgIHR2Lm5hbWUubGVuZ3RoLCBmaWxlVXJpLAogICAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlCiAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHR2Lm5hbWUpCiAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICBmaWxlVXJpLCBleGlzdGluZy5jaGFyT2Zmc2V0LCBleGlzdGluZy5uYW1lLmxlbmd0aCkKICAgICAgICAgICAgXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHlwZVZhcmlhYmxlc0J5TmFtZVt0di5uYW1lXSA9IHR2OwogICAgICAgIGlmIChvd25lciBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgICAgIC8vIE9ubHkgY2xhc3NlcyBhbmQgdHlwZSB2YXJpYWJsZXMgY2FuJ3QgaGF2ZSB0aGUgc2FtZSBuYW1lLiBTZWUKICAgICAgICAgIC8vIFsjMjk1NTVdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8yOTU1NSkuCiAgICAgICAgICBpZiAodHYubmFtZSA9PSBvd25lci5uYW1lKSB7CiAgICAgICAgICAgIGFkZFByb2JsZW0obWVzc2FnZVR5cGVWYXJpYWJsZVNhbWVOYW1lQXNFbmNsb3NpbmcsIHR2LmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICB0di5uYW1lLmxlbmd0aCwgZmlsZVVyaSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHlwZVZhcmlhYmxlc0J5TmFtZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkRXh0ZW5zaW9uRGVjbGFyYXRpb24oCiAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBpbnQgbW9kaWZpZXJzLAogICAgICBTdHJpbmcgZXh0ZW5zaW9uTmFtZSwKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLAogICAgICBUeXBlQnVpbGRlciB0eXBlLAogICAgICBpbnQgc3RhcnRPZmZzZXQsCiAgICAgIGludCBuYW1lT2Zmc2V0LAogICAgICBpbnQgZW5kT2Zmc2V0KSB7CiAgICAvLyBOZXN0ZWQgZGVjbGFyYXRpb24gYmVnYW4gaW4gYE91dGxpbmVCdWlsZGVyLmJlZ2luRXh0ZW5zaW9uRGVjbGFyYXRpb25gLgogICAgRGVjbGFyYXRpb25CdWlsZGVyIGRlY2xhcmF0aW9uID0gZW5kTmVzdGVkRGVjbGFyYXRpb24oZXh0ZW5zaW9uTmFtZSkKICAgICAgLi5yZXNvbHZlVHlwZXModHlwZVZhcmlhYmxlcywgdGhpcyk7CiAgICBhc3NlcnQoZGVjbGFyYXRpb24ucGFyZW50ID09IGxpYnJhcnlEZWNsYXJhdGlvbik7CiAgICBNYXA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPiBtZW1iZXJzID0gZGVjbGFyYXRpb24ubWVtYmVyczsKICAgIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IGNvbnN0cnVjdG9ycyA9IGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yczsKICAgIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IHNldHRlcnMgPSBkZWNsYXJhdGlvbi5zZXR0ZXJzOwoKICAgIFNjb3BlIGNsYXNzU2NvcGUgPSBuZXcgU2NvcGUobWVtYmVycywgc2V0dGVycywKICAgICAgICBzY29wZS53aXRoVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzKSwgImV4dGVuc2lvbiAkZXh0ZW5zaW9uTmFtZSIsCiAgICAgICAgaXNNb2RpZmlhYmxlOiBmYWxzZSk7CgogICAgLy8gV2hlbiBsb29raW5nIHVwIGEgY29uc3RydWN0b3IsIHdlIGRvbid0IGNvbnNpZGVyIHR5cGUgdmFyaWFibGVzIG9yIHRoZQogICAgLy8gbGlicmFyeSBzY29wZS4KICAgIFNjb3BlIGNvbnN0cnVjdG9yU2NvcGUgPQogICAgICAgIG5ldyBTY29wZShjb25zdHJ1Y3RvcnMsIG51bGwsIG51bGwsIGV4dGVuc2lvbk5hbWUsIGlzTW9kaWZpYWJsZTogZmFsc2UpOwogICAgYm9vbCBpc01peGluRGVjbGFyYXRpb24gPSBmYWxzZTsKICAgIGlmIChtb2RpZmllcnMgJiBtaXhpbkRlY2xhcmF0aW9uTWFzayAhPSAwKSB7CiAgICAgIGlzTWl4aW5EZWNsYXJhdGlvbiA9IHRydWU7CiAgICAgIG1vZGlmaWVycyA9IChtb2RpZmllcnMgJiB+bWl4aW5EZWNsYXJhdGlvbk1hc2spIHwgYWJzdHJhY3RNYXNrOwogICAgfQogICAgaWYgKGRlY2xhcmF0aW9uLmhhc0NvbnN0Q29uc3RydWN0b3IpIHsKICAgICAgbW9kaWZpZXJzIHw9IGhhc0NvbnN0Q29uc3RydWN0b3JNYXNrOwogICAgfQogICAgQ2xhc3NCdWlsZGVyIGNscyA9IG5ldyBTb3VyY2VDbGFzc0J1aWxkZXIoCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgbW9kaWZpZXJzLAogICAgICAgIGV4dGVuc2lvbk5hbWUsCiAgICAgICAgdHlwZVZhcmlhYmxlcywKICAgICAgICBudWxsLCAvLyBObyBleHBsaWNpdCBzdXBlcnR5cGUuCiAgICAgICAgbnVsbCwgLy8gTm8gaW1wbGVtZW50ZWQgaW50ZXJmYWNlcy4KICAgICAgICBbdHlwZV0sCiAgICAgICAgY2xhc3NTY29wZSwKICAgICAgICBjb25zdHJ1Y3RvclNjb3BlLAogICAgICAgIHRoaXMsCiAgICAgICAgbmV3IExpc3Q8Q29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyPi5mcm9tKGNvbnN0cnVjdG9yUmVmZXJlbmNlcyksCiAgICAgICAgc3RhcnRPZmZzZXQsCiAgICAgICAgbmFtZU9mZnNldCwKICAgICAgICBlbmRPZmZzZXQsCiAgICAgICAgaXNNaXhpbkRlY2xhcmF0aW9uOiBpc01peGluRGVjbGFyYXRpb24pOwogICAgbG9hZGVyLnRhcmdldC5tZXRhZGF0YUNvbGxlY3RvcgogICAgICAgID8uc2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoY2xzLnRhcmdldCwgZG9jdW1lbnRhdGlvbkNvbW1lbnQpOwoKICAgIGNvbnN0cnVjdG9yUmVmZXJlbmNlcy5jbGVhcigpOwogICAgTWFwPFN0cmluZywgVHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlc0J5TmFtZSA9CiAgICAgICAgY2hlY2tUeXBlVmFyaWFibGVzKHR5cGVWYXJpYWJsZXMsIGNscyk7CiAgICB2b2lkIHNldFBhcmVudChTdHJpbmcgbmFtZSwgTWVtYmVyQnVpbGRlciBtZW1iZXIpIHsKICAgICAgd2hpbGUgKG1lbWJlciAhPSBudWxsKSB7CiAgICAgICAgbWVtYmVyLnBhcmVudCA9IGNsczsKICAgICAgICBtZW1iZXIgPSBtZW1iZXIubmV4dDsKICAgICAgfQogICAgfQoKICAgIHZvaWQgc2V0UGFyZW50QW5kQ2hlY2tDb25mbGljdHMoU3RyaW5nIG5hbWUsIE1lbWJlckJ1aWxkZXIgbWVtYmVyKSB7CiAgICAgIGlmICh0eXBlVmFyaWFibGVzQnlOYW1lICE9IG51bGwpIHsKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyIHR2ID0gdHlwZVZhcmlhYmxlc0J5TmFtZVtuYW1lXTsKICAgICAgICBpZiAodHYgIT0gbnVsbCkgewogICAgICAgICAgY2xzLmFkZFByb2JsZW0odGVtcGxhdGVDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICAgICAgbWVtYmVyLmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoLAogICAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICAgIG1lc3NhZ2VDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ2F1c2Uud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgIHR2LmZpbGVVcmksIHR2LmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoKQogICAgICAgICAgICAgIF0pOwogICAgICAgIH0KICAgICAgfQogICAgICBzZXRQYXJlbnQobmFtZSwgbWVtYmVyKTsKICAgIH0KCiAgICBtZW1iZXJzLmZvckVhY2goc2V0UGFyZW50QW5kQ2hlY2tDb25mbGljdHMpOwogICAgY29uc3RydWN0b3JzLmZvckVhY2goc2V0UGFyZW50QW5kQ2hlY2tDb25mbGljdHMpOwogICAgc2V0dGVycy5mb3JFYWNoKHNldFBhcmVudEFuZENoZWNrQ29uZmxpY3RzKTsKICAgIGFkZEJ1aWxkZXIoZXh0ZW5zaW9uTmFtZSwgY2xzLCBuYW1lT2Zmc2V0KTsKICB9CgogIFR5cGVCdWlsZGVyIGFwcGx5TWl4aW5zKFR5cGVCdWlsZGVyIHR5cGUsIGludCBzdGFydENoYXJPZmZzZXQsIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCwgU3RyaW5nIHN1YmNsYXNzTmFtZSwgYm9vbCBpc01peGluRGVjbGFyYXRpb24sCiAgICAgIHtTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgTGlzdDxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlc30pIHsKICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgLy8gVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBidWlsZGluZyBhIG5hbWVkCiAgICAgIC8vIG1peGluIGFwcGxpY2F0aW9uLgogICAgICBpZiAoZG9jdW1lbnRhdGlvbkNvbW1lbnQgIT0gbnVsbCkgewogICAgICAgIHVuaGFuZGxlZCgiZG9jdW1lbnRhdGlvbkNvbW1lbnQiLCAidW5uYW1lZCBtaXhpbiBhcHBsaWNhdGlvbiIsCiAgICAgICAgICAgIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgICB9IGVsc2UgaWYgKG1ldGFkYXRhICE9IG51bGwpIHsKICAgICAgICB1bmhhbmRsZWQoIm1ldGFkYXRhIiwgInVubmFtZWQgbWl4aW4gYXBwbGljYXRpb24iLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgfSBlbHNlIGlmIChpbnRlcmZhY2VzICE9IG51bGwpIHsKICAgICAgICB1bmhhbmRsZWQoCiAgICAgICAgICAgICJpbnRlcmZhY2VzIiwgInVubmFtZWQgbWl4aW4gYXBwbGljYXRpb24iLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgfQogICAgfQogICAgaWYgKHR5cGUgaXMgTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIpIHsKICAgICAgLy8gRG9jdW1lbnRhdGlvbiBiZWxvdyBhc3N1bWVzIHRoZSBnaXZlbiBtaXhpbiBhcHBsaWNhdGlvbiBpcyBpbiBvbmUgb2YKICAgICAgLy8gdGhlc2UgZm9ybXM6CiAgICAgIC8vCiAgICAgIC8vICAgICBjbGFzcyBDIGV4dGVuZHMgUyB3aXRoIE0xLCBNMiwgTTM7CiAgICAgIC8vICAgICBjbGFzcyBOYW1lZCA9IFMgd2l0aCBNMSwgTTIsIE0zOwogICAgICAvLwogICAgICAvLyBXaGVuIHdlIHJlZmVyIHRvIHRoZSBzdWJjbGFzcywgd2UgbWVhbiBgQ2Agb3IgYE5hbWVkYC4KCiAgICAgIC8vLyBUaGUgY3VycmVudCBzdXBlcnR5cGUuCiAgICAgIC8vLwogICAgICAvLy8gU3RhcnRzIG91dCBoYXZpbmcgdGhlIHZhbHVlIGBTYCBhbmQgb24gZWFjaCBpdGVyYXRpb24gb2YgdGhlIGxvb3AKICAgICAgLy8vIGJlbG93LCBpdCB3aWxsIHRha2Ugb24gdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG86CiAgICAgIC8vLwogICAgICAvLy8gMS4gYFMgd2l0aCBNMWAuCiAgICAgIC8vLyAyLiBgKFMgd2l0aCBNMSkgd2l0aCBNMmAuCiAgICAgIC8vLyAzLiBgKChTIHdpdGggTTEpIHdpdGggTTIpIHdpdGggTTNgLgogICAgICBUeXBlQnVpbGRlciBzdXBlcnR5cGUgPSB0eXBlLnN1cGVydHlwZSA/PyBsb2FkZXIudGFyZ2V0Lm9iamVjdFR5cGU7CgogICAgICAvLy8gVGhlIHZhcmlhYmxlIHBhcnQgb2YgdGhlIG1peGluIGFwcGxpY2F0aW9uJ3Mgc3ludGhldGljIG5hbWUuIEl0CiAgICAgIC8vLyBzdGFydHMgb3V0IGFzIHRoZSBuYW1lIG9mIHRoZSBzdXBlcmNsYXNzLCBidXQgaXMgb25seSB1c2VkIGFmdGVyIGl0CiAgICAgIC8vLyBoYXMgYmVlbiBjb21iaW5lZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IG1peGluLiBJbiB0aGUgZXhhbXBsZXMKICAgICAgLy8vIGZyb20gYWJvdmUsIGl0IHdpbGwgdGFrZSB0aGVzZSB2YWx1ZXM6CiAgICAgIC8vLwogICAgICAvLy8gMS4gYFMmTTFgCiAgICAgIC8vLyAyLiBgUyZNMSZNMmAKICAgICAgLy8vIDMuIGBTJk0xJk0yJk0zYC4KICAgICAgLy8vCiAgICAgIC8vLyBUaGUgZnVsbCBuYW1lIG9mIHRoZSBtaXhpbiBhcHBsaWNhdGlvbiBpcyBvYnRhaW5lZCBieSBwcmVwZW5kaW5nIHRoZQogICAgICAvLy8gbmFtZSBvZiB0aGUgc3ViY2xhc3MgKGBDYCBvciBgTmFtZWRgIGluIHRoZSBhYm92ZSBleGFtcGxlcykgdG8gdGhlCiAgICAgIC8vLyBydW5uaW5nIG5hbWUuIEZvciB0aGUgZXhhbXBsZSBgQ2AsIHRoYXQgbGVhZHMgdG8gdGhlc2UgZnVsbCBuYW1lczoKICAgICAgLy8vCiAgICAgIC8vLyAxLiBgX0MmUyZNMWAKICAgICAgLy8vIDIuIGBfQyZTJk0xJk0yYAogICAgICAvLy8gMy4gYF9DJlMmTTEmTTImTTNgLgogICAgICAvLy8KICAgICAgLy8vIEZvciBhIG5hbWVkIG1peGluIGFwcGxpY2F0aW9uLCB0aGUgbGFzdCBuYW1lIGhhcyBiZWVuIGdpdmVuIGJ5IHRoZQogICAgICAvLy8gcHJvZ3JhbW1lciwgc28gZm9yIHRoZSBleGFtcGxlIGBOYW1lZGAgd2Ugc2VlIHRoZXNlIGZ1bGwgbmFtZXM6CiAgICAgIC8vLwogICAgICAvLy8gMS4gYF9OYW1lZCZTJk0xYAogICAgICAvLy8gMi4gYF9OYW1lZCZTJk0xJk0yYAogICAgICAvLy8gMy4gYE5hbWVkYC4KICAgICAgU3RyaW5nIHJ1bm5pbmdOYW1lID0gZXh0cmFjdE5hbWUoc3VwZXJ0eXBlLm5hbWUpOwoKICAgICAgLy8vIFRydWUgd2hlbiB3ZSdyZSBidWlsZGluZyBhIG5hbWVkIG1peGluIGFwcGxpY2F0aW9uLiBOb3RpY2UgdGhhdCBmb3IKICAgICAgLy8vIHRoZSBgTmFtZWRgIGV4YW1wbGUgYWJvdmUsIHRoaXMgaXMgb25seSB0cnVlIG9uIHRoZSBsYXN0CiAgICAgIC8vLyBpdGVyYXRpb24gYmVjYXVzZSBvbmx5IHRoZSBmdWxsIG1peGluIGFwcGxpY2F0aW9uIGlzIG5hbWVkLgogICAgICBib29sIGlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uOwoKICAgICAgLy8vIFRoZSBuYW1lcyBvZiB0aGUgdHlwZSB2YXJpYWJsZXMgb2YgdGhlIHN1YmNsYXNzLgogICAgICBTZXQ8U3RyaW5nPiB0eXBlVmFyaWFibGVOYW1lczsKICAgICAgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgIHR5cGVWYXJpYWJsZU5hbWVzID0gbmV3IFNldDxTdHJpbmc+KCk7CiAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHR5cGVWYXJpYWJsZSBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgICB0eXBlVmFyaWFibGVOYW1lcy5hZGQodHlwZVZhcmlhYmxlLm5hbWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8vIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHRydWVgIGlmIGEgdHlwZSB2YXJpYWJsZSB3aXRoIGEgbmFtZQogICAgICAvLy8gZnJvbSBbdHlwZVZhcmlhYmxlTmFtZXNdIGlzIHJlZmVyZW5jZWQgaW4gW3R5cGVdLgogICAgICBib29sIHVzZXNUeXBlVmFyaWFibGVzKFR5cGVCdWlsZGVyIHR5cGUpIHsKICAgICAgICBpZiAodHlwZSBpcyBOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICAgICAgICBpZiAodHlwZS5kZWNsYXJhdGlvbiBpcyBUeXBlVmFyaWFibGVCdWlsZGVyKSB7CiAgICAgICAgICAgIHJldHVybiB0eXBlVmFyaWFibGVOYW1lcy5jb250YWlucyh0eXBlLmRlY2xhcmF0aW9uLm5hbWUpOwogICAgICAgICAgfQoKICAgICAgICAgIExpc3Q8VHlwZUJ1aWxkZXI+IHR5cGVBcmd1bWVudHMgPSB0eXBlLmFyZ3VtZW50czsKICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRzICE9IG51bGwgJiYgdHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgICAgICAgIGZvciAoVHlwZUJ1aWxkZXIgYXJndW1lbnQgaW4gdHlwZUFyZ3VtZW50cykgewogICAgICAgICAgICAgIGlmICh1c2VzVHlwZVZhcmlhYmxlcyhhcmd1bWVudCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICAgICAgICBpZiAodHlwZS5mb3JtYWxzICE9IG51bGwpIHsKICAgICAgICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiB0eXBlLmZvcm1hbHMpIHsKICAgICAgICAgICAgICBpZiAodXNlc1R5cGVWYXJpYWJsZXMoZm9ybWFsLnR5cGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB1c2VzVHlwZVZhcmlhYmxlcyh0eXBlLnJldHVyblR5cGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8vLyBJdGVyYXRlIG92ZXIgdGhlIG1peGlucyBmcm9tIGxlZnQgdG8gcmlnaHQuIEF0IHRoZSBlbmQgb2YgZWFjaAogICAgICAvLy8gaXRlcmF0aW9uLCBhIG5ldyBbc3VwZXJ0eXBlXSBpcyBjb21wdXRlZCB0aGF0IGlzIHRoZSBtaXhpbgogICAgICAvLy8gYXBwbGljYXRpb24gb2YgW3N1cGVydHlwZV0gd2l0aCB0aGUgY3VycmVudCBtaXhpbi4KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLm1peGlucy5sZW5ndGg7IGkrKykgewogICAgICAgIFR5cGVCdWlsZGVyIG1peGluID0gdHlwZS5taXhpbnNbaV07CiAgICAgICAgaXNOYW1lZE1peGluQXBwbGljYXRpb24gPSBuYW1lICE9IG51bGwgJiYgbWl4aW4gPT0gdHlwZS5taXhpbnMubGFzdDsKICAgICAgICBib29sIGlzR2VuZXJpYyA9IGZhbHNlOwogICAgICAgIGlmICghaXNOYW1lZE1peGluQXBwbGljYXRpb24pIHsKICAgICAgICAgIGlmIChzdXBlcnR5cGUgaXMgTmFtZWRUeXBlQnVpbGRlcikgewogICAgICAgICAgICBpc0dlbmVyaWMgPSBpc0dlbmVyaWMgfHwgdXNlc1R5cGVWYXJpYWJsZXMoc3VwZXJ0eXBlKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtaXhpbiBpcyBOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICAgICAgICAgIHJ1bm5pbmdOYW1lICs9ICImJHtleHRyYWN0TmFtZShtaXhpbi5uYW1lKX0iOwogICAgICAgICAgICBpc0dlbmVyaWMgPSBpc0dlbmVyaWMgfHwgdXNlc1R5cGVWYXJpYWJsZXMobWl4aW4pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTdHJpbmcgZnVsbG5hbWUgPQogICAgICAgICAgICBpc05hbWVkTWl4aW5BcHBsaWNhdGlvbiA/IG5hbWUgOiAiXyRzdWJjbGFzc05hbWUmJHJ1bm5pbmdOYW1lIjsKICAgICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IGFwcGxpY2F0aW9uVHlwZVZhcmlhYmxlczsKICAgICAgICBMaXN0PFR5cGVCdWlsZGVyPiBhcHBsaWNhdGlvblR5cGVBcmd1bWVudHM7CiAgICAgICAgaWYgKGlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbmFtZWQgbWl4aW4gYXBwbGljYXRpb24sIGl0IG11c3QgYmUgZ2l2ZW4gYWxsIHRoZQogICAgICAgICAgLy8gZGVjbGFyYXRlZCB0eXBlIHZhcmlhYmxlcy4KICAgICAgICAgIGFwcGxpY2F0aW9uVHlwZVZhcmlhYmxlcyA9IHR5cGVWYXJpYWJsZXM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgcGFzcyB0aGUgZnJlc2ggdHlwZSB2YXJpYWJsZXMgdG8gdGhlIG1peGluCiAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5J3JlIGRlY2xhcmVkIG9uIHRoZSBzdWJjbGFzcy4KICAgICAgICAgIGlmIChpc0dlbmVyaWMpIHsKICAgICAgICAgICAgdGhpcy5iZWdpbk5lc3RlZERlY2xhcmF0aW9uKCJtaXhpbiBhcHBsaWNhdGlvbiIpOwoKICAgICAgICAgICAgYXBwbGljYXRpb25UeXBlVmFyaWFibGVzID0KICAgICAgICAgICAgICAgIGNvcHlUeXBlVmFyaWFibGVzKHR5cGVWYXJpYWJsZXMsIGN1cnJlbnREZWNsYXJhdGlvbik7CgogICAgICAgICAgICBMaXN0PFR5cGVCdWlsZGVyPiBuZXdUeXBlcyA9IDxUeXBlQnVpbGRlcj5bXTsKICAgICAgICAgICAgaWYgKHN1cGVydHlwZSBpcyBOYW1lZFR5cGVCdWlsZGVyICYmIHN1cGVydHlwZS5hcmd1bWVudHMgIT0gbnVsbCkgewogICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJ0eXBlLmFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgc3VwZXJ0eXBlLmFyZ3VtZW50c1tpXSA9IHN1cGVydHlwZS5hcmd1bWVudHNbaV0uY2xvbmUobmV3VHlwZXMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobWl4aW4gaXMgTmFtZWRUeXBlQnVpbGRlciAmJiBtaXhpbi5hcmd1bWVudHMgIT0gbnVsbCkgewogICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWl4aW4uYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICBtaXhpbi5hcmd1bWVudHNbaV0gPSBtaXhpbi5hcmd1bWVudHNbaV0uY2xvbmUobmV3VHlwZXMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKFR5cGVCdWlsZGVyIG5ld1R5cGUgaW4gbmV3VHlwZXMpIHsKICAgICAgICAgICAgICBjdXJyZW50RGVjbGFyYXRpb24uYWRkVHlwZShuZXcgVW5yZXNvbHZlZFR5cGUobmV3VHlwZSwgLTEsIG51bGwpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgRGVjbGFyYXRpb25CdWlsZGVyIG1peGluRGVjbGFyYXRpb24gPQogICAgICAgICAgICAgICAgdGhpcy5lbmROZXN0ZWREZWNsYXJhdGlvbigibWl4aW4gYXBwbGljYXRpb24iKTsKICAgICAgICAgICAgbWl4aW5EZWNsYXJhdGlvbi5yZXNvbHZlVHlwZXMoYXBwbGljYXRpb25UeXBlVmFyaWFibGVzLCB0aGlzKTsKCiAgICAgICAgICAgIGFwcGxpY2F0aW9uVHlwZUFyZ3VtZW50cyA9IDxUeXBlQnVpbGRlcj5bXTsKICAgICAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHR5cGVWYXJpYWJsZSBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgICAgICAgYXBwbGljYXRpb25UeXBlQXJndW1lbnRzCiAgICAgICAgICAgICAgICAgIC5hZGQoYWRkTmFtZWRUeXBlKHR5cGVWYXJpYWJsZS5uYW1lLCBudWxsLCBjaGFyT2Zmc2V0KS4uYmluZCgKICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0eXBlIHZhcmlhYmxlIHR5cGVzIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmljIGNsYXNzIHJlcHJlc2VudGluZyB0aGUgYW5vbnltb3VzIG1peGluCiAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBzaG91bGQgcmVmZXIgYmFjayB0byB0aGUgdHlwZSB2YXJpYWJsZXMgb2YKICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjbGFzcyB0aGF0IGV4dGVuZCB0aGUgYW5vbnltb3VzIG1peGluIGFwcGxpY2F0aW9uLgogICAgICAgICAgICAgICAgICAgICAgdHlwZVZhcmlhYmxlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZmluYWwgaW50IGNvbXB1dGVkU3RhcnRDaGFyT2Zmc2V0ID0KICAgICAgICAgICAgKGlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uID8gbWV0YWRhdGEgOiBudWxsKSA9PSBudWxsCiAgICAgICAgICAgICAgICA/IHN0YXJ0Q2hhck9mZnNldAogICAgICAgICAgICAgICAgOiBtZXRhZGF0YS5maXJzdC5jaGFyT2Zmc2V0OwogICAgICAgIFNvdXJjZUNsYXNzQnVpbGRlciBhcHBsaWNhdGlvbiA9IG5ldyBTb3VyY2VDbGFzc0J1aWxkZXIoCiAgICAgICAgICAgIGlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uID8gbWV0YWRhdGEgOiBudWxsLAogICAgICAgICAgICBpc05hbWVkTWl4aW5BcHBsaWNhdGlvbgogICAgICAgICAgICAgICAgPyBtb2RpZmllcnMgfCBuYW1lZE1peGluQXBwbGljYXRpb25NYXNrCiAgICAgICAgICAgICAgICA6IGFic3RyYWN0TWFzaywKICAgICAgICAgICAgZnVsbG5hbWUsCiAgICAgICAgICAgIGFwcGxpY2F0aW9uVHlwZVZhcmlhYmxlcywKICAgICAgICAgICAgaXNNaXhpbkRlY2xhcmF0aW9uID8gbnVsbCA6IHN1cGVydHlwZSwKICAgICAgICAgICAgaXNOYW1lZE1peGluQXBwbGljYXRpb24KICAgICAgICAgICAgICAgID8gaW50ZXJmYWNlcwogICAgICAgICAgICAgICAgOiBpc01peGluRGVjbGFyYXRpb24gPyBbc3VwZXJ0eXBlLCBtaXhpbl0gOiBudWxsLAogICAgICAgICAgICBudWxsLCAvLyBObyBgb25gIGNsYXVzZSB0eXBlcy4KICAgICAgICAgICAgbmV3IFNjb3BlKDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e30sIDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e30sCiAgICAgICAgICAgICAgICBzY29wZS53aXRoVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzKSwKICAgICAgICAgICAgICAgICJtaXhpbiAkZnVsbG5hbWUgIiwgaXNNb2RpZmlhYmxlOiBmYWxzZSksCiAgICAgICAgICAgIG5ldyBTY29wZSg8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPnt9LCBudWxsLCBudWxsLCBmdWxsbmFtZSwKICAgICAgICAgICAgICAgIGlzTW9kaWZpYWJsZTogZmFsc2UpLAogICAgICAgICAgICB0aGlzLAogICAgICAgICAgICA8Q29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyPltdLAogICAgICAgICAgICBjb21wdXRlZFN0YXJ0Q2hhck9mZnNldCwKICAgICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgICAgY2hhckVuZE9mZnNldCwKICAgICAgICAgICAgbWl4ZWRJblR5cGU6IGlzTWl4aW5EZWNsYXJhdGlvbiA/IG51bGwgOiBtaXhpbik7CiAgICAgICAgaWYgKGlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgICBsb2FkZXIudGFyZ2V0Lm1ldGFkYXRhQ29sbGVjdG9yPy5zZXREb2N1bWVudGF0aW9uQ29tbWVudCgKICAgICAgICAgICAgICBhcHBsaWNhdGlvbi50YXJnZXQsIGRvY3VtZW50YXRpb25Db21tZW50KTsKICAgICAgICB9CiAgICAgICAgLy8gVE9ETyhhaGUsIGttaWxsaWtpbik6IFNob3VsZCBhbHdheXMgYmUgdHJ1ZT8KICAgICAgICAvLyBwa2cvYW5hbHl6ZXIvdGVzdC9zcmMvc3VtbWFyeS9yZXN5bnRoZXNpemVfa2VybmVsX3Rlc3QuZGFydCBjYW4ndAogICAgICAgIC8vIGhhbmRsZSB0aGF0IDooCiAgICAgICAgYXBwbGljYXRpb24uY2xzLmlzQW5vbnltb3VzTWl4aW4gPSAhaXNOYW1lZE1peGluQXBwbGljYXRpb247CiAgICAgICAgYWRkQnVpbGRlcihmdWxsbmFtZSwgYXBwbGljYXRpb24sIGNoYXJPZmZzZXQpOwogICAgICAgIHN1cGVydHlwZSA9CiAgICAgICAgICAgIGFkZE5hbWVkVHlwZShmdWxsbmFtZSwgYXBwbGljYXRpb25UeXBlQXJndW1lbnRzLCBjaGFyT2Zmc2V0KTsKICAgICAgfQogICAgICByZXR1cm4gc3VwZXJ0eXBlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CiAgfQoKICB2b2lkIGFkZE5hbWVkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFR5cGVCdWlsZGVyIG1peGluQXBwbGljYXRpb24sCiAgICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZXMsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCkgewogICAgLy8gTmVzdGVkIGRlY2xhcmF0aW9uIGJlZ2FuIGluIGBPdXRsaW5lQnVpbGRlci5iZWdpbk5hbWVkTWl4aW5BcHBsaWNhdGlvbmAuCiAgICBlbmROZXN0ZWREZWNsYXJhdGlvbihuYW1lKS5yZXNvbHZlVHlwZXModHlwZVZhcmlhYmxlcywgdGhpcyk7CiAgICBOYW1lZFR5cGVCdWlsZGVyIHN1cGVydHlwZSA9IGFwcGx5TWl4aW5zKG1peGluQXBwbGljYXRpb24sIHN0YXJ0Q2hhck9mZnNldCwKICAgICAgICBjaGFyT2Zmc2V0LCBjaGFyRW5kT2Zmc2V0LCBuYW1lLCBmYWxzZSwKICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudDogZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhLAogICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgdHlwZVZhcmlhYmxlczogdHlwZVZhcmlhYmxlcywKICAgICAgICBtb2RpZmllcnM6IG1vZGlmaWVycywKICAgICAgICBpbnRlcmZhY2VzOiBpbnRlcmZhY2VzKTsKICAgIGNoZWNrVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzLCBzdXBlcnR5cGUuZGVjbGFyYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRGaWVsZCgKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFR5cGVCdWlsZGVyIHR5cGUsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICAgIFRva2VuIGluaXRpYWxpemVyVG9rZW4sCiAgICAgIGJvb2wgaGFzSW5pdGlhbGl6ZXIsCiAgICAgIHtUb2tlbiBjb25zdEluaXRpYWxpemVyVG9rZW59KSB7CiAgICBpZiAoaGFzSW5pdGlhbGl6ZXIpIHsKICAgICAgbW9kaWZpZXJzIHw9IGhhc0luaXRpYWxpemVyTWFzazsKICAgIH0KICAgIEtlcm5lbEZpZWxkQnVpbGRlciBmaWVsZCA9IG5ldyBLZXJuZWxGaWVsZEJ1aWxkZXIoCiAgICAgICAgbWV0YWRhdGEsIHR5cGUsIG5hbWUsIG1vZGlmaWVycywgdGhpcywgY2hhck9mZnNldCwgY2hhckVuZE9mZnNldCk7CiAgICBmaWVsZC5jb25zdEluaXRpYWxpemVyVG9rZW4gPSBjb25zdEluaXRpYWxpemVyVG9rZW47CiAgICBhZGRCdWlsZGVyKG5hbWUsIGZpZWxkLCBjaGFyT2Zmc2V0KTsKICAgIGlmICghbGVnYWN5TW9kZSAmJiB0eXBlID09IG51bGwgJiYgaW5pdGlhbGl6ZXJUb2tlbiAhPSBudWxsKSB7CiAgICAgIGZpZWxkLnRhcmdldC50eXBlID0gbmV3IEltcGxpY2l0RmllbGRUeXBlKGZpZWxkLCBpbml0aWFsaXplclRva2VuKTsKICAgICAgKGltcGxpY2l0bHlUeXBlZEZpZWxkcyA/Pz0gPEtlcm5lbEZpZWxkQnVpbGRlcj5bXSkuYWRkKGZpZWxkKTsKICAgIH0KICAgIGxvYWRlci50YXJnZXQubWV0YWRhdGFDb2xsZWN0b3IKICAgICAgICA/LnNldERvY3VtZW50YXRpb25Db21tZW50KGZpZWxkLnRhcmdldCwgZG9jdW1lbnRhdGlvbkNvbW1lbnQpOwogIH0KCiAgdm9pZCBhZGRDb25zdHJ1Y3RvcigKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFR5cGVCdWlsZGVyIHJldHVyblR5cGUsCiAgICAgIGZpbmFsIE9iamVjdCBuYW1lLAogICAgICBTdHJpbmcgY29uc3RydWN0b3JOYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscywKICAgICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT3BlblBhcmVuT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCwKICAgICAgU3RyaW5nIG5hdGl2ZU1ldGhvZE5hbWUsCiAgICAgIHtUb2tlbiBiZWdpbkluaXRpYWxpemVyc30pIHsKICAgIE1ldGFkYXRhQ29sbGVjdG9yIG1ldGFkYXRhQ29sbGVjdG9yID0gbG9hZGVyLnRhcmdldC5tZXRhZGF0YUNvbGxlY3RvcjsKICAgIENvbnN0cnVjdG9yQnVpbGRlciBwcm9jZWR1cmUgPSBuZXcgQ29uc3RydWN0b3JCdWlsZGVyKAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIG1vZGlmaWVycyAmIH5hYnN0cmFjdE1hc2ssCiAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICBjb25zdHJ1Y3Rvck5hbWUsCiAgICAgICAgdHlwZVZhcmlhYmxlcywKICAgICAgICBmb3JtYWxzLAogICAgICAgIHRoaXMsCiAgICAgICAgc3RhcnRDaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgY2hhck9wZW5QYXJlbk9mZnNldCwKICAgICAgICBjaGFyRW5kT2Zmc2V0LAogICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUpOwogICAgbWV0YWRhdGFDb2xsZWN0b3I/LnNldERvY3VtZW50YXRpb25Db21tZW50KAogICAgICAgIHByb2NlZHVyZS50YXJnZXQsIGRvY3VtZW50YXRpb25Db21tZW50KTsKICAgIG1ldGFkYXRhQ29sbGVjdG9yPy5zZXRDb25zdHJ1Y3Rvck5hbWVPZmZzZXQocHJvY2VkdXJlLnRhcmdldCwgbmFtZSk7CiAgICBjaGVja1R5cGVWYXJpYWJsZXModHlwZVZhcmlhYmxlcywgcHJvY2VkdXJlKTsKICAgIGFkZEJ1aWxkZXIoY29uc3RydWN0b3JOYW1lLCBwcm9jZWR1cmUsIGNoYXJPZmZzZXQpOwogICAgaWYgKG5hdGl2ZU1ldGhvZE5hbWUgIT0gbnVsbCkgewogICAgICBhZGROYXRpdmVNZXRob2QocHJvY2VkdXJlKTsKICAgIH0KICAgIGlmIChwcm9jZWR1cmUuaXNDb25zdCkgewogICAgICBjdXJyZW50RGVjbGFyYXRpb24/Lmhhc0NvbnN0Q29uc3RydWN0b3IgPSB0cnVlOwogICAgICAvLyBjb25zdCBjb25zdHJ1Y3RvcnMgd2lsbCBoYXZlIHRoZWlyIGluaXRpYWxpemVycyBjb21waWxlZCBhbmQgd3JpdHRlbgogICAgICAvLyBpbnRvIHRoZSBvdXRsaW5lLgogICAgICBwcm9jZWR1cmUuYmVnaW5Jbml0aWFsaXplcnMgPSBiZWdpbkluaXRpYWxpemVycyA/PyBUb2tlbi5lb2YoLTEpOwogICAgfQogIH0KCiAgdm9pZCBhZGRQcm9jZWR1cmUoCiAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBpbnQgbW9kaWZpZXJzLAogICAgICBUeXBlQnVpbGRlciByZXR1cm5UeXBlLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLAogICAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGZvcm1hbHMsCiAgICAgIFByb2NlZHVyZUtpbmQga2luZCwKICAgICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT3BlblBhcmVuT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCwKICAgICAgU3RyaW5nIG5hdGl2ZU1ldGhvZE5hbWUsCiAgICAgIHtib29sIGlzVG9wTGV2ZWx9KSB7CiAgICBNZXRhZGF0YUNvbGxlY3RvciBtZXRhZGF0YUNvbGxlY3RvciA9IGxvYWRlci50YXJnZXQubWV0YWRhdGFDb2xsZWN0b3I7CiAgICBpZiAocmV0dXJuVHlwZSA9PSBudWxsKSB7CiAgICAgIGlmIChraW5kID09IFByb2NlZHVyZUtpbmQuT3BlcmF0b3IgJiYKICAgICAgICAgIGlkZW50aWNhbChuYW1lLCBpbmRleFNldE5hbWUubmFtZSkpIHsKICAgICAgICByZXR1cm5UeXBlID0gYWRkVm9pZFR5cGUoY2hhck9mZnNldCk7CiAgICAgIH0gZWxzZSBpZiAoa2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcikgewogICAgICAgIHJldHVyblR5cGUgPSBhZGRWb2lkVHlwZShjaGFyT2Zmc2V0KTsKICAgICAgfQogICAgfQogICAgRnVuY3Rpb25CdWlsZGVyIHByb2NlZHVyZSA9IG5ldyBQcm9jZWR1cmVCdWlsZGVyKAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIG1vZGlmaWVycywKICAgICAgICByZXR1cm5UeXBlLAogICAgICAgIG5hbWUsCiAgICAgICAgdHlwZVZhcmlhYmxlcywKICAgICAgICBmb3JtYWxzLAogICAgICAgIGtpbmQsCiAgICAgICAgdGhpcywKICAgICAgICBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBjaGFyT3BlblBhcmVuT2Zmc2V0LAogICAgICAgIGNoYXJFbmRPZmZzZXQsCiAgICAgICAgbmF0aXZlTWV0aG9kTmFtZSk7CiAgICBtZXRhZGF0YUNvbGxlY3Rvcj8uc2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoCiAgICAgICAgcHJvY2VkdXJlLnRhcmdldCwgZG9jdW1lbnRhdGlvbkNvbW1lbnQpOwogICAgY2hlY2tUeXBlVmFyaWFibGVzKHR5cGVWYXJpYWJsZXMsIHByb2NlZHVyZSk7CiAgICBhZGRCdWlsZGVyKG5hbWUsIHByb2NlZHVyZSwgY2hhck9mZnNldCk7CiAgICBpZiAobmF0aXZlTWV0aG9kTmFtZSAhPSBudWxsKSB7CiAgICAgIGFkZE5hdGl2ZU1ldGhvZChwcm9jZWR1cmUpOwogICAgfQogIH0KCiAgdm9pZCBhZGRGYWN0b3J5TWV0aG9kKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgT2JqZWN0IG5hbWUsCiAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscywKICAgICAgQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyIHJlZGlyZWN0aW9uVGFyZ2V0LAogICAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBTdHJpbmcgbmF0aXZlTWV0aG9kTmFtZSkgewogICAgVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSA9IGFkZE5hbWVkVHlwZSgKICAgICAgICBjdXJyZW50RGVjbGFyYXRpb24ucGFyZW50Lm5hbWUsIDxUeXBlQnVpbGRlcj5bXSwgY2hhck9mZnNldCk7CiAgICAvLyBOZXN0ZWQgZGVjbGFyYXRpb24gYmVnYW4gaW4gYE91dGxpbmVCdWlsZGVyLmJlZ2luRmFjdG9yeU1ldGhvZGAuCiAgICBEZWNsYXJhdGlvbkJ1aWxkZXIgZmFjdG9yeURlY2xhcmF0aW9uID0KICAgICAgICBlbmROZXN0ZWREZWNsYXJhdGlvbigiI2ZhY3RvcnlfbWV0aG9kIik7CgogICAgLy8gUHJlcGFyZSB0aGUgc2ltcGxlIHByb2NlZHVyZSBuYW1lLgogICAgU3RyaW5nIHByb2NlZHVyZU5hbWU7CiAgICBTdHJpbmcgY29uc3RydWN0b3JOYW1lID0KICAgICAgICBjb21wdXRlQW5kVmFsaWRhdGVDb25zdHJ1Y3Rvck5hbWUobmFtZSwgY2hhck9mZnNldCwgaXNGYWN0b3J5OiB0cnVlKTsKICAgIGlmIChjb25zdHJ1Y3Rvck5hbWUgIT0gbnVsbCkgewogICAgICBwcm9jZWR1cmVOYW1lID0gY29uc3RydWN0b3JOYW1lOwogICAgfSBlbHNlIHsKICAgICAgcHJvY2VkdXJlTmFtZSA9IG5hbWU7CiAgICB9CgogICAgUHJvY2VkdXJlQnVpbGRlciBwcm9jZWR1cmU7CiAgICBpZiAocmVkaXJlY3Rpb25UYXJnZXQgIT0gbnVsbCkgewogICAgICBwcm9jZWR1cmUgPSBuZXcgUmVkaXJlY3RpbmdGYWN0b3J5QnVpbGRlcigKICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgc3RhdGljTWFzayB8IG1vZGlmaWVycywKICAgICAgICAgIHJldHVyblR5cGUsCiAgICAgICAgICBwcm9jZWR1cmVOYW1lLAogICAgICAgICAgY29weVR5cGVWYXJpYWJsZXMoCiAgICAgICAgICAgICAgY3VycmVudERlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMgPz8gPFR5cGVWYXJpYWJsZUJ1aWxkZXI+W10sCiAgICAgICAgICAgICAgZmFjdG9yeURlY2xhcmF0aW9uKSwKICAgICAgICAgIGZvcm1hbHMsCiAgICAgICAgICB0aGlzLAogICAgICAgICAgc3RhcnRDaGFyT2Zmc2V0LAogICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgIGNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgICAgICBjaGFyRW5kT2Zmc2V0LAogICAgICAgICAgbmF0aXZlTWV0aG9kTmFtZSwKICAgICAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIHByb2NlZHVyZSA9IG5ldyBQcm9jZWR1cmVCdWlsZGVyKAogICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICBzdGF0aWNNYXNrIHwgbW9kaWZpZXJzLAogICAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICAgIHByb2NlZHVyZU5hbWUsCiAgICAgICAgICBjb3B5VHlwZVZhcmlhYmxlcygKICAgICAgICAgICAgICBjdXJyZW50RGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcyA/PyA8VHlwZVZhcmlhYmxlQnVpbGRlcj5bXSwKICAgICAgICAgICAgICBmYWN0b3J5RGVjbGFyYXRpb24pLAogICAgICAgICAgZm9ybWFscywKICAgICAgICAgIFByb2NlZHVyZUtpbmQuRmFjdG9yeSwKICAgICAgICAgIHRoaXMsCiAgICAgICAgICBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgY2hhck9wZW5QYXJlbk9mZnNldCwKICAgICAgICAgIGNoYXJFbmRPZmZzZXQsCiAgICAgICAgICBuYXRpdmVNZXRob2ROYW1lKTsKICAgIH0KCiAgICB2YXIgbWV0YWRhdGFDb2xsZWN0b3IgPSBsb2FkZXIudGFyZ2V0Lm1ldGFkYXRhQ29sbGVjdG9yOwogICAgbWV0YWRhdGFDb2xsZWN0b3I/LnNldERvY3VtZW50YXRpb25Db21tZW50KAogICAgICAgIHByb2NlZHVyZS50YXJnZXQsIGRvY3VtZW50YXRpb25Db21tZW50KTsKICAgIG1ldGFkYXRhQ29sbGVjdG9yPy5zZXRDb25zdHJ1Y3Rvck5hbWVPZmZzZXQocHJvY2VkdXJlLnRhcmdldCwgbmFtZSk7CgogICAgRGVjbGFyYXRpb25CdWlsZGVyIHNhdmVkRGVjbGFyYXRpb24gPSBjdXJyZW50RGVjbGFyYXRpb247CiAgICBjdXJyZW50RGVjbGFyYXRpb24gPSBmYWN0b3J5RGVjbGFyYXRpb247CiAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdHYgaW4gcHJvY2VkdXJlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgTmFtZWRUeXBlQnVpbGRlciB0ID0gcHJvY2VkdXJlLnJldHVyblR5cGU7CiAgICAgIHQuYXJndW1lbnRzLmFkZChhZGROYW1lZFR5cGUodHYubmFtZSwgbnVsbCwgcHJvY2VkdXJlLmNoYXJPZmZzZXQpKTsKICAgIH0KICAgIGN1cnJlbnREZWNsYXJhdGlvbiA9IHNhdmVkRGVjbGFyYXRpb247CgogICAgZmFjdG9yeURlY2xhcmF0aW9uLnJlc29sdmVUeXBlcyhwcm9jZWR1cmUudHlwZVZhcmlhYmxlcywgdGhpcyk7CiAgICBhZGRCdWlsZGVyKHByb2NlZHVyZU5hbWUsIHByb2NlZHVyZSwgY2hhck9mZnNldCk7CiAgICBpZiAobmF0aXZlTWV0aG9kTmFtZSAhPSBudWxsKSB7CiAgICAgIGFkZE5hdGl2ZU1ldGhvZChwcm9jZWR1cmUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRFbnVtKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8RW51bUNvbnN0YW50SW5mbz4gZW51bUNvbnN0YW50SW5mb3MsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCkgewogICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IgPSBsb2FkZXIudGFyZ2V0Lm1ldGFkYXRhQ29sbGVjdG9yOwogICAgRW51bUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBFbnVtQnVpbGRlcihtZXRhZGF0YUNvbGxlY3RvciwgbWV0YWRhdGEsIG5hbWUsCiAgICAgICAgZW51bUNvbnN0YW50SW5mb3MsIHRoaXMsIHN0YXJ0Q2hhck9mZnNldCwgY2hhck9mZnNldCwgY2hhckVuZE9mZnNldCk7CiAgICBhZGRCdWlsZGVyKG5hbWUsIGJ1aWxkZXIsIGNoYXJPZmZzZXQpOwogICAgbWV0YWRhdGFDb2xsZWN0b3I/LnNldERvY3VtZW50YXRpb25Db21tZW50KAogICAgICAgIGJ1aWxkZXIudGFyZ2V0LCBkb2N1bWVudGF0aW9uQ29tbWVudCk7CiAgfQoKICB2b2lkIGFkZEZ1bmN0aW9uVHlwZUFsaWFzKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgRnVuY3Rpb25UeXBlQnVpbGRlciB0eXBlLAogICAgICBpbnQgY2hhck9mZnNldCkgewogICAgVHlwZUFsaWFzQnVpbGRlciB0eXBlZGVmID0gbmV3IFR5cGVBbGlhc0J1aWxkZXIoCiAgICAgICAgbWV0YWRhdGEsIG5hbWUsIHR5cGVWYXJpYWJsZXMsIHR5cGUsIHRoaXMsIGNoYXJPZmZzZXQpOwogICAgbG9hZGVyLnRhcmdldC5tZXRhZGF0YUNvbGxlY3RvcgogICAgICAgID8uc2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQodHlwZWRlZi50YXJnZXQsIGRvY3VtZW50YXRpb25Db21tZW50KTsKICAgIGNoZWNrVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzLCB0eXBlZGVmKTsKICAgIC8vIE5lc3RlZCBkZWNsYXJhdGlvbiBiZWdhbiBpbiBgT3V0bGluZUJ1aWxkZXIuYmVnaW5GdW5jdGlvblR5cGVBbGlhc2AuCiAgICBlbmROZXN0ZWREZWNsYXJhdGlvbigiI3R5cGVkZWYiKS5yZXNvbHZlVHlwZXModHlwZVZhcmlhYmxlcywgdGhpcyk7CiAgICBhZGRCdWlsZGVyKG5hbWUsIHR5cGVkZWYsIGNoYXJPZmZzZXQpOwogIH0KCiAgRnVuY3Rpb25UeXBlQnVpbGRlciBhZGRGdW5jdGlvblR5cGUoCiAgICAgIFR5cGVCdWlsZGVyIHJldHVyblR5cGUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzLAogICAgICBpbnQgY2hhck9mZnNldCkgewogICAgdmFyIGJ1aWxkZXIgPSBuZXcgRnVuY3Rpb25UeXBlQnVpbGRlcihyZXR1cm5UeXBlLCB0eXBlVmFyaWFibGVzLCBmb3JtYWxzKTsKICAgIGNoZWNrVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzLCBudWxsKTsKICAgIC8vIE5lc3RlZCBkZWNsYXJhdGlvbiBiZWdhbiBpbiBgT3V0bGluZUJ1aWxkZXIuYmVnaW5GdW5jdGlvblR5cGVgIG9yCiAgICAvLyBgT3V0bGluZUJ1aWxkZXIuYmVnaW5GdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyYC4KICAgIGVuZE5lc3RlZERlY2xhcmF0aW9uKCIjZnVuY3Rpb25fdHlwZSIpLnJlc29sdmVUeXBlcyh0eXBlVmFyaWFibGVzLCB0aGlzKTsKICAgIHJldHVybiBhZGRUeXBlKGJ1aWxkZXIsIGNoYXJPZmZzZXQpOwogIH0KCiAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBhZGRGb3JtYWxQYXJhbWV0ZXIoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgVHlwZUJ1aWxkZXIgdHlwZSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIGJvb2wgaGFzVGhpcywKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIFRva2VuIGluaXRpYWxpemVyVG9rZW4pIHsKICAgIGlmIChoYXNUaGlzKSB7CiAgICAgIG1vZGlmaWVycyB8PSBpbml0aWFsaXppbmdGb3JtYWxNYXNrOwogICAgfQogICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgPSBuZXcgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcigKICAgICAgICBtZXRhZGF0YSwgbW9kaWZpZXJzLCB0eXBlLCBuYW1lLCB0aGlzLCBjaGFyT2Zmc2V0KTsKICAgIGZvcm1hbC5pbml0aWFsaXplclRva2VuID0gaW5pdGlhbGl6ZXJUb2tlbjsKICAgIGlmIChsZWdhY3lNb2RlICYmIGhhc1RoaXMgJiYgdHlwZSA9PSBudWxsKSB7CiAgICAgICh1bnR5cGVkSW5pdGlhbGl6aW5nRm9ybWFscyA/Pz0gPEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+W10pLmFkZChmb3JtYWwpOwogICAgfQogICAgcmV0dXJuIGZvcm1hbDsKICB9CgogIFR5cGVWYXJpYWJsZUJ1aWxkZXIgYWRkVHlwZVZhcmlhYmxlKAogICAgICBTdHJpbmcgbmFtZSwgVHlwZUJ1aWxkZXIgYm91bmQsIGludCBjaGFyT2Zmc2V0KSB7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBUeXBlVmFyaWFibGVCdWlsZGVyKG5hbWUsIHRoaXMsIGNoYXJPZmZzZXQsIGJvdW5kKTsKICAgIGJvdW5kbGVzc1R5cGVWYXJpYWJsZXMuYWRkKGJ1aWxkZXIpOwogICAgcmV0dXJuIGJ1aWxkZXI7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJ1aWxkT3V0bGluZUV4cHJlc3Npb25zKCkgewogICAgS2VybmVsTWV0YWRhdGFCdWlsZGVyLmJ1aWxkQW5ub3RhdGlvbnMobGlicmFyeSwgbWV0YWRhdGEsIHRoaXMsIG51bGwsIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBidWlsZEJ1aWxkZXIoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIExpYnJhcnlCdWlsZGVyIGNvcmVMaWJyYXJ5KSB7CiAgICBDbGFzcyBjbHM7CiAgICBNZW1iZXIgbWVtYmVyOwogICAgVHlwZWRlZiB0eXBlZGVmOwogICAgaWYgKGRlY2xhcmF0aW9uIGlzIFNvdXJjZUNsYXNzQnVpbGRlcikgewogICAgICBjbHMgPSBkZWNsYXJhdGlvbi5idWlsZCh0aGlzLCBjb3JlTGlicmFyeSk7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIEtlcm5lbEZpZWxkQnVpbGRlcikgewogICAgICBtZW1iZXIgPSBkZWNsYXJhdGlvbi5idWlsZCh0aGlzKS4uaXNTdGF0aWMgPSB0cnVlOwogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBQcm9jZWR1cmVCdWlsZGVyKSB7CiAgICAgIG1lbWJlciA9IGRlY2xhcmF0aW9uLmJ1aWxkKHRoaXMpLi5pc1N0YXRpYyA9IHRydWU7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIFR5cGVBbGlhc0J1aWxkZXIpIHsKICAgICAgdHlwZWRlZiA9IGRlY2xhcmF0aW9uLmJ1aWxkKHRoaXMpOwogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBFbnVtQnVpbGRlcikgewogICAgICBjbHMgPSBkZWNsYXJhdGlvbi5idWlsZCh0aGlzLCBjb3JlTGlicmFyeSk7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIFByZWZpeEJ1aWxkZXIpIHsKICAgICAgLy8gSWdub3JlZC4gS2VybmVsIGRvZXNuJ3QgcmVwcmVzZW50IHByZWZpeGVzLgogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIEJ1aWx0aW5UeXBlQnVpbGRlcikgewogICAgICAvLyBOb3RoaW5nIG5lZWRlZC4KICAgICAgcmV0dXJuOwogICAgfSBlbHNlIHsKICAgICAgdW5oYW5kbGVkKCIke2RlY2xhcmF0aW9uLnJ1bnRpbWVUeXBlfSIsICJidWlsZEJ1aWxkZXIiLAogICAgICAgICAgZGVjbGFyYXRpb24uY2hhck9mZnNldCwgZGVjbGFyYXRpb24uZmlsZVVyaSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChkZWNsYXJhdGlvbi5pc1BhdGNoKSB7CiAgICAgIC8vIFRoZSBrZXJuZWwgbm9kZSBvZiBhIHBhdGNoIGlzIHNoYXJlZCB3aXRoIHRoZSBvcmlnaW4gZGVjbGFyYXRpb24uIFdlCiAgICAgIC8vIGhhdmUgdHdvIGJ1aWxkZXJzOiB0aGUgb3JpZ2luLCBhbmQgdGhlIHBhdGNoLCBidXQgb25seSBvbmUga2VybmVsIG5vZGUKICAgICAgLy8gKHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBmaW5hbCBvdXRwdXQpLiBDb25zZXF1ZW50bHksIHRoZSBub2RlCiAgICAgIC8vIHNob3VsZG4ndCBiZSBhZGRlZCB0byBpdHMgYXBwYXJlbnQga2VybmVsIHBhcmVudCBhcyB0aGlzIHdvdWxkIGNyZWF0ZQogICAgICAvLyBhIGR1cGxpY2F0ZSBlbnRyeSBpbiB0aGUgcGFyZW50J3MgbGlzdCBvZiBjaGlsZHJlbi9tZW1iZXJzLgogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoY2xzICE9IG51bGwpIHsKICAgICAgaWYgKGRlY2xhcmF0aW9uLm5leHQgIT0gbnVsbCkgewogICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgRGVjbGFyYXRpb24gY3VycmVudCA9IGRlY2xhcmF0aW9uLm5leHQ7CiAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgewogICAgICAgICAgY291bnQrKzsKICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICAgICAgfQogICAgICAgIGNscy5uYW1lICs9ICIjJGNvdW50IjsKICAgICAgfQogICAgICBsaWJyYXJ5LmFkZENsYXNzKGNscyk7CiAgICB9IGVsc2UgaWYgKG1lbWJlciAhPSBudWxsKSB7CiAgICAgIGlmIChkZWNsYXJhdGlvbi5uZXh0ID09IG51bGwpIHsKICAgICAgICBsaWJyYXJ5LmFkZE1lbWJlcihtZW1iZXIpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHR5cGVkZWYgIT0gbnVsbCkgewogICAgICBpZiAoZGVjbGFyYXRpb24ubmV4dCA9PSBudWxsKSB7CiAgICAgICAgbGlicmFyeS5hZGRUeXBlZGVmKHR5cGVkZWYpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGFkZE5hdGl2ZURlcGVuZGVuY3koU3RyaW5nIG5hdGl2ZUltcG9ydFBhdGgpIHsKICAgIERlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0gbG9hZGVyLmdldE5hdGl2ZUFubm90YXRpb24oKTsKICAgIEFyZ3VtZW50cyBhcmd1bWVudHMgPQogICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+W25ldyBTdHJpbmdMaXRlcmFsKG5hdGl2ZUltcG9ydFBhdGgpXSk7CiAgICBFeHByZXNzaW9uIGFubm90YXRpb247CiAgICBpZiAoY29uc3RydWN0b3IuaXNDb25zdHJ1Y3RvcikgewogICAgICBhbm5vdGF0aW9uID0gbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbihjb25zdHJ1Y3Rvci50YXJnZXQsIGFyZ3VtZW50cykKICAgICAgICAuLmlzQ29uc3QgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgYW5ub3RhdGlvbiA9IG5ldyBTdGF0aWNJbnZvY2F0aW9uKGNvbnN0cnVjdG9yLnRhcmdldCwgYXJndW1lbnRzKQogICAgICAgIC4uaXNDb25zdCA9IHRydWU7CiAgICB9CiAgICBsaWJyYXJ5LmFkZEFubm90YXRpb24oYW5ub3RhdGlvbik7CiAgfQoKICB2b2lkIGFkZERlcGVuZGVuY2llcyhMaWJyYXJ5IGxpYnJhcnksIFNldDxLZXJuZWxMaWJyYXJ5QnVpbGRlcj4gc2VlbikgewogICAgaWYgKCFzZWVuLmFkZCh0aGlzKSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gTWVyZ2UgaW1wb3J0IGFuZCBleHBvcnQgbGlzdHMgdG8gaGF2ZSB0aGUgZGVwZW5kZW5jaWVzIGluIHNvdXJjZSBvcmRlci4KICAgIC8vIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBEaWV0TGlzdGVuZXIgdG8gY29ycmVjdGx5IG1hdGNoIHVwIG1ldGFkYXRhLgogICAgaW50IGltcG9ydEluZGV4ID0gMDsKICAgIGludCBleHBvcnRJbmRleCA9IDA7CiAgICB3aGlsZSAoaW1wb3J0SW5kZXggPCBpbXBvcnRzLmxlbmd0aCB8fCBleHBvcnRJbmRleCA8IGV4cG9ydHMubGVuZ3RoKSB7CiAgICAgIGlmIChleHBvcnRJbmRleCA+PSBleHBvcnRzLmxlbmd0aCB8fAogICAgICAgICAgKGltcG9ydEluZGV4IDwgaW1wb3J0cy5sZW5ndGggJiYKICAgICAgICAgICAgICBpbXBvcnRzW2ltcG9ydEluZGV4XS5jaGFyT2Zmc2V0IDwKICAgICAgICAgICAgICAgICAgZXhwb3J0c1tleHBvcnRJbmRleF0uY2hhck9mZnNldCkpIHsKICAgICAgICAvLyBBZGQgaW1wb3J0CiAgICAgICAgSW1wb3J0IGltcG9ydCA9IGltcG9ydHNbaW1wb3J0SW5kZXgrK107CgogICAgICAgIC8vIFJhdGhlciB0aGFuIGFkZCBhIExpYnJhcnlEZXBlbmRlbmN5LCB3ZSBhdHRhY2ggYW4gYW5ub3RhdGlvbi4KICAgICAgICBpZiAoaW1wb3J0Lm5hdGl2ZUltcG9ydFBhdGggIT0gbnVsbCkgewogICAgICAgICAgYWRkTmF0aXZlRGVwZW5kZW5jeShpbXBvcnQubmF0aXZlSW1wb3J0UGF0aCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmIChpbXBvcnQuZGVmZXJyZWQgJiYgaW1wb3J0LnByZWZpeEJ1aWxkZXI/LmRlcGVuZGVuY3kgIT0gbnVsbCkgewogICAgICAgICAgbGlicmFyeS5hZGREZXBlbmRlbmN5KGltcG9ydC5wcmVmaXhCdWlsZGVyLmRlcGVuZGVuY3kpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsaWJyYXJ5LmFkZERlcGVuZGVuY3kobmV3IExpYnJhcnlEZXBlbmRlbmN5LmltcG9ydCgKICAgICAgICAgICAgICBpbXBvcnQuaW1wb3J0ZWQudGFyZ2V0LAogICAgICAgICAgICAgIG5hbWU6IGltcG9ydC5wcmVmaXgsCiAgICAgICAgICAgICAgY29tYmluYXRvcnM6IHRvS2VybmVsQ29tYmluYXRvcnMoaW1wb3J0LmNvbWJpbmF0b3JzKSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gaW1wb3J0LmNoYXJPZmZzZXQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBBZGQgZXhwb3J0CiAgICAgICAgRXhwb3J0IGV4cG9ydCA9IGV4cG9ydHNbZXhwb3J0SW5kZXgrK107CiAgICAgICAgbGlicmFyeS5hZGREZXBlbmRlbmN5KG5ldyBMaWJyYXJ5RGVwZW5kZW5jeS5leHBvcnQoCiAgICAgICAgICAgIGV4cG9ydC5leHBvcnRlZC50YXJnZXQsCiAgICAgICAgICAgIGNvbWJpbmF0b3JzOiB0b0tlcm5lbENvbWJpbmF0b3JzKGV4cG9ydC5jb21iaW5hdG9ycykpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBleHBvcnQuY2hhck9mZnNldCk7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKEtlcm5lbExpYnJhcnlCdWlsZGVyIHBhcnQgaW4gcGFydHMpIHsKICAgICAgcGFydC5hZGREZXBlbmRlbmNpZXMobGlicmFyeSwgc2Vlbik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFBhcnQoTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLCBTdHJpbmcgdXJpLCBpbnQgY2hhck9mZnNldCkgewogICAgc3VwZXIuYWRkUGFydChtZXRhZGF0YSwgdXJpLCBjaGFyT2Zmc2V0KTsKICAgIC8vIFRPRE8oYWhlKTogW21ldGFkYXRhXSBzaG91bGQgYmUgc3RvcmVkLCBldmFsdWF0ZWQsIGFuZCBhZGRlZCB0byBbcGFydF0uCiAgICBMaWJyYXJ5UGFydCBwYXJ0ID0gbmV3IExpYnJhcnlQYXJ0KDxFeHByZXNzaW9uPltdLCB1cmkpCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICBsaWJyYXJ5LmFkZFBhcnQocGFydCk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5IGJ1aWxkKExpYnJhcnlCdWlsZGVyIGNvcmVMaWJyYXJ5LCB7Ym9vbCBtb2RpZnlUYXJnZXR9KSB7CiAgICBzdXBlci5idWlsZChjb3JlTGlicmFyeSk7CgogICAgaWYgKG1vZGlmeVRhcmdldCA9PSBmYWxzZSkgcmV0dXJuIGxpYnJhcnk7CgogICAgbGlicmFyeS5pc1N5bnRoZXRpYyA9IGlzU3ludGhldGljOwogICAgYWRkRGVwZW5kZW5jaWVzKGxpYnJhcnksIG5ldyBTZXQ8S2VybmVsTGlicmFyeUJ1aWxkZXI+KCkpOwoKICAgIGxvYWRlci50YXJnZXQubWV0YWRhdGFDb2xsZWN0b3IKICAgICAgICA/LnNldERvY3VtZW50YXRpb25Db21tZW50KGxpYnJhcnksIGRvY3VtZW50YXRpb25Db21tZW50KTsKCiAgICBsaWJyYXJ5Lm5hbWUgPSBuYW1lOwogICAgbGlicmFyeS5wcm9jZWR1cmVzLnNvcnQoY29tcGFyZVByb2NlZHVyZXMpOwoKICAgIGlmICh1bnNlcmlhbGl6YWJsZUV4cG9ydHMgIT0gbnVsbCkgewogICAgICBsaWJyYXJ5LmFkZE1lbWJlcihuZXcgRmllbGQobmV3IE5hbWUoIl9leHBvcnRzIyIsIGxpYnJhcnkpLAogICAgICAgICAgaW5pdGlhbGl6ZXI6IG5ldyBTdHJpbmdMaXRlcmFsKGpzb25FbmNvZGUodW5zZXJpYWxpemFibGVFeHBvcnRzKSksCiAgICAgICAgICBpc1N0YXRpYzogdHJ1ZSwKICAgICAgICAgIGlzQ29uc3Q6IHRydWUpKTsKICAgIH0KCiAgICByZXR1cm4gbGlicmFyeTsKICB9CgogIEBvdmVycmlkZQogIERlY2xhcmF0aW9uIGNvbXB1dGVBbWJpZ3VvdXNEZWNsYXJhdGlvbigKICAgICAgU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBEZWNsYXJhdGlvbiBvdGhlciwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtib29sIGlzRXhwb3J0OiBmYWxzZSwgYm9vbCBpc0ltcG9ydDogZmFsc2V9KSB7CiAgICAvLyBUT0RPKGFoZSk6IENhbiBJIG1vdmUgdGhpcyB0byBTY29wZSBvciBQcmVmaXg/CiAgICBpZiAoZGVjbGFyYXRpb24gPT0gb3RoZXIpIHJldHVybiBkZWNsYXJhdGlvbjsKICAgIGlmIChkZWNsYXJhdGlvbiBpcyBJbnZhbGlkVHlwZUJ1aWxkZXIpIHJldHVybiBkZWNsYXJhdGlvbjsKICAgIGlmIChvdGhlciBpcyBJbnZhbGlkVHlwZUJ1aWxkZXIpIHJldHVybiBvdGhlcjsKICAgIGlmIChkZWNsYXJhdGlvbiBpcyBBY2Nlc3NFcnJvckJ1aWxkZXIpIHsKICAgICAgQWNjZXNzRXJyb3JCdWlsZGVyIGVycm9yID0gZGVjbGFyYXRpb247CiAgICAgIGRlY2xhcmF0aW9uID0gZXJyb3IuYnVpbGRlcjsKICAgIH0KICAgIGlmIChvdGhlciBpcyBBY2Nlc3NFcnJvckJ1aWxkZXIpIHsKICAgICAgQWNjZXNzRXJyb3JCdWlsZGVyIGVycm9yID0gb3RoZXI7CiAgICAgIG90aGVyID0gZXJyb3IuYnVpbGRlcjsKICAgIH0KICAgIGJvb2wgaXNMb2NhbCA9IGZhbHNlOwogICAgYm9vbCBpc0xvYWRMaWJyYXJ5ID0gZmFsc2U7CiAgICBEZWNsYXJhdGlvbiBwcmVmZXJyZWQ7CiAgICBVcmkgdXJpOwogICAgVXJpIG90aGVyVXJpOwogICAgVXJpIHByZWZlcnJlZFVyaTsKICAgIFVyaSBoaWRkZW5Vcmk7CiAgICBpZiAoc2NvcGUubG9jYWxbbmFtZV0gPT0gZGVjbGFyYXRpb24pIHsKICAgICAgaXNMb2NhbCA9IHRydWU7CiAgICAgIHByZWZlcnJlZCA9IGRlY2xhcmF0aW9uOwogICAgICBoaWRkZW5VcmkgPSBjb21wdXRlTGlicmFyeVVyaShvdGhlcik7CiAgICB9IGVsc2UgewogICAgICB1cmkgPSBjb21wdXRlTGlicmFyeVVyaShkZWNsYXJhdGlvbik7CiAgICAgIG90aGVyVXJpID0gY29tcHV0ZUxpYnJhcnlVcmkob3RoZXIpOwogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgTG9hZExpYnJhcnlCdWlsZGVyKSB7CiAgICAgICAgaXNMb2FkTGlicmFyeSA9IHRydWU7CiAgICAgICAgcHJlZmVycmVkID0gZGVjbGFyYXRpb247CiAgICAgICAgcHJlZmVycmVkVXJpID0gb3RoZXJVcmk7CiAgICAgIH0gZWxzZSBpZiAob3RoZXIgaXMgTG9hZExpYnJhcnlCdWlsZGVyKSB7CiAgICAgICAgaXNMb2FkTGlicmFyeSA9IHRydWU7CiAgICAgICAgcHJlZmVycmVkID0gb3RoZXI7CiAgICAgICAgcHJlZmVycmVkVXJpID0gdXJpOwogICAgICB9IGVsc2UgaWYgKG90aGVyVXJpPy5zY2hlbWUgPT0gImRhcnQiICYmIHVyaT8uc2NoZW1lICE9ICJkYXJ0IikgewogICAgICAgIHByZWZlcnJlZCA9IGRlY2xhcmF0aW9uOwogICAgICAgIHByZWZlcnJlZFVyaSA9IHVyaTsKICAgICAgICBoaWRkZW5VcmkgPSBvdGhlclVyaTsKICAgICAgfSBlbHNlIGlmICh1cmk/LnNjaGVtZSA9PSAiZGFydCIgJiYgb3RoZXJVcmk/LnNjaGVtZSAhPSAiZGFydCIpIHsKICAgICAgICBwcmVmZXJyZWQgPSBvdGhlcjsKICAgICAgICBwcmVmZXJyZWRVcmkgPSBvdGhlclVyaTsKICAgICAgICBoaWRkZW5VcmkgPSB1cmk7CiAgICAgIH0KICAgIH0KICAgIGlmIChwcmVmZXJyZWQgIT0gbnVsbCkgewogICAgICBpZiAoaXNMb2NhbCkgewogICAgICAgIHZhciB0ZW1wbGF0ZSA9IGlzRXhwb3J0CiAgICAgICAgICAgID8gdGVtcGxhdGVMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydAogICAgICAgICAgICA6IHRlbXBsYXRlTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnQ7CiAgICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKG5hbWUsIGhpZGRlblVyaSksIGNoYXJPZmZzZXQsCiAgICAgICAgICAgIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgICAgfSBlbHNlIGlmIChpc0xvYWRMaWJyYXJ5KSB7CiAgICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZUxvYWRMaWJyYXJ5SGlkZXNNZW1iZXIud2l0aEFyZ3VtZW50cyhwcmVmZXJyZWRVcmkpLAogICAgICAgICAgICBjaGFyT2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHRlbXBsYXRlID0KICAgICAgICAgICAgaXNFeHBvcnQgPyB0ZW1wbGF0ZUV4cG9ydEhpZGVzRXhwb3J0IDogdGVtcGxhdGVJbXBvcnRIaWRlc0ltcG9ydDsKICAgICAgICBhZGRQcm9ibGVtKHRlbXBsYXRlLndpdGhBcmd1bWVudHMobmFtZSwgcHJlZmVycmVkVXJpLCBoaWRkZW5VcmkpLAogICAgICAgICAgICBjaGFyT2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHByZWZlcnJlZDsKICAgIH0KICAgIGlmIChkZWNsYXJhdGlvbi5uZXh0ID09IG51bGwgJiYgb3RoZXIubmV4dCA9PSBudWxsKSB7CiAgICAgIGlmIChpc0ltcG9ydCAmJiBkZWNsYXJhdGlvbiBpcyBQcmVmaXhCdWlsZGVyICYmIG90aGVyIGlzIFByZWZpeEJ1aWxkZXIpIHsKICAgICAgICAvLyBIYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBzYW1lIHByZWZpeCBpcyB1c2VkIGZvciBkaWZmZXJlbnQKICAgICAgICAvLyBpbXBvcnRzLgogICAgICAgIHJldHVybiBkZWNsYXJhdGlvbgogICAgICAgICAgLi5leHBvcnRTY29wZS5tZXJnZShvdGhlci5leHBvcnRTY29wZSwKICAgICAgICAgICAgICAoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIGV4aXN0aW5nLCBEZWNsYXJhdGlvbiBtZW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVBbWJpZ3VvdXNEZWNsYXJhdGlvbigKICAgICAgICAgICAgICAgIG5hbWUsIGV4aXN0aW5nLCBtZW1iZXIsIGNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICBpc0V4cG9ydDogaXNFeHBvcnQsIGlzSW1wb3J0OiBpc0ltcG9ydCk7CiAgICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgdmFyIHRlbXBsYXRlID0KICAgICAgICBpc0V4cG9ydCA/IHRlbXBsYXRlRHVwbGljYXRlZEV4cG9ydCA6IHRlbXBsYXRlRHVwbGljYXRlZEltcG9ydDsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlLndpdGhBcmd1bWVudHMobmFtZSwgdXJpLCBvdGhlclVyaSk7CiAgICBhZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgIHZhciBidWlsZGVyVGVtcGxhdGUgPSBpc0V4cG9ydAogICAgICAgID8gdGVtcGxhdGVEdXBsaWNhdGVkRXhwb3J0SW5UeXBlCiAgICAgICAgOiB0ZW1wbGF0ZUR1cGxpY2F0ZWRJbXBvcnRJblR5cGU7CiAgICBtZXNzYWdlID0gYnVpbGRlclRlbXBsYXRlLndpdGhBcmd1bWVudHMoCiAgICAgICAgbmFtZSwKICAgICAgICAvLyBUT0RPKGFoZSk6IFdlIHNob3VsZCBwcm9iYWJseSB1c2UgYSBjb250ZXh0IG9iamVjdCBoZXJlCiAgICAgICAgLy8gaW5zdGVhZCBvZiBpbmNsdWRpbmcgVVJJcyBpbiB0aGlzIG1lc3NhZ2UuCiAgICAgICAgdXJpLAogICAgICAgIG90aGVyVXJpKTsKICAgIC8vIFdlIHJlcG9ydCB0aGUgZXJyb3IgbGF6aWx5IChzZXR0aW5nIHN1cHByZXNzTWVzc2FnZSB0byBmYWxzZSkgYmVjYXVzZSB0aGUKICAgIC8vIHNwZWMgMTguMSBzdGF0ZXMgdGhhdCAnSXQgaXMgbm90IGFuIGVycm9yIGlmIE4gaXMgaW50cm9kdWNlZCBieSB0d28gb3IKICAgIC8vIG1vcmUgaW1wb3J0cyBidXQgbmV2ZXIgcmVmZXJyZWQgdG8uJwogICAgcmV0dXJuIG5ldyBJbnZhbGlkVHlwZUJ1aWxkZXIoCiAgICAgICAgbmFtZSwgbWVzc2FnZS53aXRoTG9jYXRpb24oZmlsZVVyaSwgY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpLAogICAgICAgIHN1cHByZXNzTWVzc2FnZTogZmFsc2UpOwogIH0KCiAgaW50IGZpbmlzaERlZmVycmVkTG9hZFRlYXJvZmZzKCkgewogICAgaW50IHRvdGFsID0gMDsKICAgIGZvciAodmFyIGltcG9ydCBpbiBpbXBvcnRzKSB7CiAgICAgIGlmIChpbXBvcnQuZGVmZXJyZWQpIHsKICAgICAgICBQcm9jZWR1cmUgdGVhcm9mZiA9IGltcG9ydC5wcmVmaXhCdWlsZGVyLmxvYWRMaWJyYXJ5QnVpbGRlci50ZWFyb2ZmOwogICAgICAgIGlmICh0ZWFyb2ZmICE9IG51bGwpIGxpYnJhcnkuYWRkTWVtYmVyKHRlYXJvZmYpOwogICAgICAgIHRvdGFsKys7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b3RhbDsKICB9CgogIGludCBmaW5pc2hGb3J3YXJkZXJzKCkgewogICAgaW50IGNvdW50ID0gMDsKICAgIENsb25lVmlzaXRvciBjbG9uZXIgPSBuZXcgQ2xvbmVWaXNpdG9yKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvcndhcmRlcnNPcmlnaW5zLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgIFByb2NlZHVyZSBmb3J3YXJkZXIgPSBmb3J3YXJkZXJzT3JpZ2luc1tpXTsKICAgICAgUHJvY2VkdXJlIG9yaWdpbiA9IGZvcndhcmRlcnNPcmlnaW5zW2kgKyAxXTsKCiAgICAgIGludCBwb3NpdGlvbmFsQ291bnQgPSBvcmlnaW4uZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOwogICAgICBpZiAoZm9yd2FyZGVyLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCAhPSBwb3NpdGlvbmFsQ291bnQpIHsKICAgICAgICByZXR1cm4gdW5leHBlY3RlZCgKICAgICAgICAgICAgIiRwb3NpdGlvbmFsQ291bnQiLAogICAgICAgICAgICAiJHtmb3J3YXJkZXIuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RofSIsCiAgICAgICAgICAgIG9yaWdpbi5maWxlT2Zmc2V0LAogICAgICAgICAgICBvcmlnaW4uZmlsZVVyaSk7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwb3NpdGlvbmFsQ291bnQ7ICsraikgewogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZm9yd2FyZGVyUGFyYW1ldGVyID0KICAgICAgICAgICAgZm9yd2FyZGVyLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2pdOwogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gb3JpZ2luUGFyYW1ldGVyID0KICAgICAgICAgICAgb3JpZ2luLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2pdOwogICAgICAgIGlmIChvcmlnaW5QYXJhbWV0ZXIuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgZm9yd2FyZGVyUGFyYW1ldGVyLmluaXRpYWxpemVyID0KICAgICAgICAgICAgICBjbG9uZXIuY2xvbmUob3JpZ2luUGFyYW1ldGVyLmluaXRpYWxpemVyKTsKICAgICAgICAgIGZvcndhcmRlclBhcmFtZXRlci5pbml0aWFsaXplci5wYXJlbnQgPSBmb3J3YXJkZXJQYXJhbWV0ZXI7CiAgICAgICAgfQogICAgICB9CgogICAgICBNYXA8U3RyaW5nLCBWYXJpYWJsZURlY2xhcmF0aW9uPiBvcmlnaW5OYW1lZE1hcCA9CiAgICAgICAgICA8U3RyaW5nLCBWYXJpYWJsZURlY2xhcmF0aW9uPnt9OwogICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gb3JpZ2luTmFtZWQgaW4gb3JpZ2luLmZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgICAgIG9yaWdpbk5hbWVkTWFwW29yaWdpbk5hbWVkLm5hbWVdID0gb3JpZ2luTmFtZWQ7CiAgICAgIH0KICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIGZvcndhcmRlck5hbWVkCiAgICAgICAgICBpbiBmb3J3YXJkZXIuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBvcmlnaW5OYW1lZCA9IG9yaWdpbk5hbWVkTWFwW2ZvcndhcmRlck5hbWVkLm5hbWVdOwogICAgICAgIGlmIChvcmlnaW5OYW1lZCA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gdW5oYW5kbGVkKAogICAgICAgICAgICAgICJudWxsIiwgZm9yd2FyZGVyLm5hbWUubmFtZSwgb3JpZ2luLmZpbGVPZmZzZXQsIG9yaWdpbi5maWxlVXJpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9yaWdpbk5hbWVkLmluaXRpYWxpemVyID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgIGZvcndhcmRlck5hbWVkLmluaXRpYWxpemVyID0gY2xvbmVyLmNsb25lKG9yaWdpbk5hbWVkLmluaXRpYWxpemVyKTsKICAgICAgICBmb3J3YXJkZXJOYW1lZC5pbml0aWFsaXplci5wYXJlbnQgPSBmb3J3YXJkZXJOYW1lZDsKICAgICAgfQoKICAgICAgKytjb3VudDsKICAgIH0KICAgIGZvcndhcmRlcnNPcmlnaW5zLmNsZWFyKCk7CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICB2b2lkIGFkZE5hdGl2ZU1ldGhvZChGdW5jdGlvbkJ1aWxkZXIgbWV0aG9kKSB7CiAgICBuYXRpdmVNZXRob2RzLmFkZChtZXRob2QpOwogIH0KCiAgaW50IGZpbmlzaE5hdGl2ZU1ldGhvZHMoKSB7CiAgICBmb3IgKEZ1bmN0aW9uQnVpbGRlciBtZXRob2QgaW4gbmF0aXZlTWV0aG9kcykgewogICAgICBtZXRob2QuYmVjb21lTmF0aXZlKGxvYWRlcik7CiAgICB9CiAgICByZXR1cm4gbmF0aXZlTWV0aG9kcy5sZW5ndGg7CiAgfQoKICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IGNvcHlUeXBlVmFyaWFibGVzKAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IG9yaWdpbmFsLCBEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb24pIHsKICAgIExpc3Q8VHlwZUJ1aWxkZXI+IG5ld1R5cGVzID0gPFR5cGVCdWlsZGVyPltdOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiBjb3B5ID0gPFR5cGVWYXJpYWJsZUJ1aWxkZXI+W107CiAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgaW4gb3JpZ2luYWwpIHsKICAgICAgdmFyIG5ld1ZhcmlhYmxlID0gbmV3IFR5cGVWYXJpYWJsZUJ1aWxkZXIodmFyaWFibGUubmFtZSwgdGhpcywKICAgICAgICAgIHZhcmlhYmxlLmNoYXJPZmZzZXQsIHZhcmlhYmxlLmJvdW5kPy5jbG9uZShuZXdUeXBlcykpOwogICAgICBjb3B5LmFkZChuZXdWYXJpYWJsZSk7CiAgICAgIGJvdW5kbGVzc1R5cGVWYXJpYWJsZXMuYWRkKG5ld1ZhcmlhYmxlKTsKICAgIH0KICAgIGZvciAoVHlwZUJ1aWxkZXIgbmV3VHlwZSBpbiBuZXdUeXBlcykgewogICAgICBkZWNsYXJhdGlvbi5hZGRUeXBlKG5ldyBVbnJlc29sdmVkVHlwZShuZXdUeXBlLCAtMSwgbnVsbCkpOwogICAgfQogICAgcmV0dXJuIGNvcHk7CiAgfQoKICBpbnQgZmluaXNoVHlwZVZhcmlhYmxlcyhDbGFzc0J1aWxkZXIgb2JqZWN0LCBUeXBlQnVpbGRlciBkeW5hbWljVHlwZSkgewogICAgaW50IGNvdW50ID0gYm91bmRsZXNzVHlwZVZhcmlhYmxlcy5sZW5ndGg7CiAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgYnVpbGRlciBpbiBib3VuZGxlc3NUeXBlVmFyaWFibGVzKSB7CiAgICAgIGJ1aWxkZXIuZmluaXNoKHRoaXMsIG9iamVjdCwgZHluYW1pY1R5cGUpOwogICAgfQogICAgYm91bmRsZXNzVHlwZVZhcmlhYmxlcy5jbGVhcigpOwogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgaW50IGNvbXB1dGVEZWZhdWx0VHlwZXMoVHlwZUJ1aWxkZXIgZHluYW1pY1R5cGUsIFR5cGVCdWlsZGVyIGJvdHRvbVR5cGUsCiAgICAgIENsYXNzQnVpbGRlciBvYmplY3RDbGFzcykgewogICAgaW50IGNvdW50ID0gMDsKCiAgICBpbnQgY29tcHV0ZURlZmF1bHRUeXBlc0ZvclZhcmlhYmxlcygKICAgICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHZhcmlhYmxlcywgYm9vbCBsZWdhY3lNb2RlKSB7CiAgICAgIGlmICh2YXJpYWJsZXMgPT0gbnVsbCkgcmV0dXJuIDA7CgogICAgICBib29sIGhhdmVFcnJvbmVvdXNCb3VuZHMgPSBmYWxzZTsKICAgICAgaWYgKCFsZWdhY3lNb2RlKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJpYWJsZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgPSB2YXJpYWJsZXNbaV07CiAgICAgICAgICBMaXN0PFR5cGVCdWlsZGVyPiBnZW5lcmljRnVuY3Rpb25UeXBlcyA9IDxUeXBlQnVpbGRlcj5bXTsKICAgICAgICAgIGZpbmRHZW5lcmljRnVuY3Rpb25UeXBlcyh2YXJpYWJsZS5ib3VuZCwKICAgICAgICAgICAgICByZXN1bHQ6IGdlbmVyaWNGdW5jdGlvblR5cGVzKTsKICAgICAgICAgIGlmIChnZW5lcmljRnVuY3Rpb25UeXBlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGhhdmVFcnJvbmVvdXNCb3VuZHMgPSB0cnVlOwogICAgICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VHZW5lcmljRnVuY3Rpb25UeXBlSW5Cb3VuZCwgdmFyaWFibGUuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUubGVuZ3RoLCB2YXJpYWJsZS5maWxlVXJpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghaGF2ZUVycm9uZW91c0JvdW5kcykgewogICAgICAgICAgTGlzdDxUeXBlQnVpbGRlcj4gY2FsY3VsYXRlZEJvdW5kcyA9CiAgICAgICAgICAgICAgY2FsY3VsYXRlQm91bmRzKHZhcmlhYmxlcywgZHluYW1pY1R5cGUsIGJvdHRvbVR5cGUsIG9iamVjdENsYXNzKTsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgIHZhcmlhYmxlc1tpXS5kZWZhdWx0VHlwZSA9IGNhbGN1bGF0ZWRCb3VuZHNbaV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAobGVnYWN5TW9kZSB8fCBoYXZlRXJyb25lb3VzQm91bmRzKSB7CiAgICAgICAgLy8gSW4gRGFydCAxLCBwdXQgYGR5bmFtaWNgIGV2ZXJ5d2hlcmUuCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJpYWJsZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIHZhcmlhYmxlc1tpXS5kZWZhdWx0VHlwZSA9IGR5bmFtaWNUeXBlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHZhcmlhYmxlcy5sZW5ndGg7CiAgICB9CgogICAgdm9pZCByZXBvcnRJc3N1ZXMoTGlzdDxPYmplY3Q+IGlzc3VlcykgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlzc3Vlcy5sZW5ndGg7IGkgKz0gMykgewogICAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb24gPSBpc3N1ZXNbaV07CiAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gaXNzdWVzW2kgKyAxXTsKICAgICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0ID0gaXNzdWVzW2kgKyAyXTsKCiAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlLCBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0LCBkZWNsYXJhdGlvbi5uYW1lLmxlbmd0aCwKICAgICAgICAgICAgZGVjbGFyYXRpb24uZmlsZVVyaSwKICAgICAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgICAgIH0KICAgIH0KCiAgICBib29sIGxlZ2FjeU1vZGUgPSBsb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGU7CiAgICBmb3IgKHZhciBkZWNsYXJhdGlvbiBpbiBsaWJyYXJ5RGVjbGFyYXRpb24ubWVtYmVycy52YWx1ZXMpIHsKICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlcikgewogICAgICAgIHsKICAgICAgICAgIExpc3Q8T2JqZWN0PiBpc3N1ZXMgPSBsZWdhY3lNb2RlCiAgICAgICAgICAgICAgPyBjb25zdCA8T2JqZWN0PltdCiAgICAgICAgICAgICAgOiBnZXROb25TaW1wbGljaXR5SXNzdWVzRm9yRGVjbGFyYXRpb24oZGVjbGFyYXRpb24sCiAgICAgICAgICAgICAgICAgIHBlcmZvcm1FcnJvclJlY292ZXJ5OiB0cnVlKTsKICAgICAgICAgIHJlcG9ydElzc3Vlcyhpc3N1ZXMpOwogICAgICAgICAgLy8gSW4gY2FzZSBvZiBpc3N1ZXMsIHVzZSBsZWdhY3kgbW9kZSBmb3IgZXJyb3IgcmVjb3ZlcnkuCiAgICAgICAgICBjb3VudCArPSBjb21wdXRlRGVmYXVsdFR5cGVzRm9yVmFyaWFibGVzKAogICAgICAgICAgICAgIGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMsIGxlZ2FjeU1vZGUgfHwgaXNzdWVzLmlzTm90RW1wdHkpOwogICAgICAgIH0KICAgICAgICBkZWNsYXJhdGlvbi5mb3JFYWNoKChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gbWVtYmVyKSB7CiAgICAgICAgICBpZiAobWVtYmVyIGlzIFByb2NlZHVyZUJ1aWxkZXIpIHsKICAgICAgICAgICAgTGlzdDxPYmplY3Q+IGlzc3VlcyA9IGxlZ2FjeU1vZGUKICAgICAgICAgICAgICAgID8gY29uc3QgPE9iamVjdD5bXQogICAgICAgICAgICAgICAgOiBnZXROb25TaW1wbGljaXR5SXNzdWVzRm9yVHlwZVZhcmlhYmxlcyhtZW1iZXIudHlwZVZhcmlhYmxlcyk7CiAgICAgICAgICAgIHJlcG9ydElzc3Vlcyhpc3N1ZXMpOwogICAgICAgICAgICAvLyBJbiBjYXNlIG9mIGlzc3VlcywgdXNlIGxlZ2FjeSBtb2RlIGZvciBlcnJvciByZWNvdmVyeS4KICAgICAgICAgICAgY291bnQgKz0gY29tcHV0ZURlZmF1bHRUeXBlc0ZvclZhcmlhYmxlcygKICAgICAgICAgICAgICAgIG1lbWJlci50eXBlVmFyaWFibGVzLCBsZWdhY3lNb2RlIHx8IGlzc3Vlcy5pc05vdEVtcHR5KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgICAgTGlzdDxPYmplY3Q+IGlzc3VlcyA9IGxlZ2FjeU1vZGUKICAgICAgICAgICAgPyBjb25zdCA8T2JqZWN0PltdCiAgICAgICAgICAgIDogZ2V0Tm9uU2ltcGxpY2l0eUlzc3Vlc0ZvckRlY2xhcmF0aW9uKGRlY2xhcmF0aW9uLAogICAgICAgICAgICAgICAgcGVyZm9ybUVycm9yUmVjb3Zlcnk6IHRydWUpOwogICAgICAgIHJlcG9ydElzc3Vlcyhpc3N1ZXMpOwogICAgICAgIC8vIEluIGNhc2Ugb2YgaXNzdWVzLCB1c2UgbGVnYWN5IG1vZGUgZm9yIGVycm9yIHJlY292ZXJ5LgogICAgICAgIGNvdW50ICs9IGNvbXB1dGVEZWZhdWx0VHlwZXNGb3JWYXJpYWJsZXMoCiAgICAgICAgICAgIGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMsIGxlZ2FjeU1vZGUgfHwgaXNzdWVzLmlzTm90RW1wdHkpOwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIEZ1bmN0aW9uQnVpbGRlcikgewogICAgICAgIExpc3Q8T2JqZWN0PiBpc3N1ZXMgPSBsZWdhY3lNb2RlCiAgICAgICAgICAgID8gY29uc3QgPE9iamVjdD5bXQogICAgICAgICAgICA6IGdldE5vblNpbXBsaWNpdHlJc3N1ZXNGb3JUeXBlVmFyaWFibGVzKGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMpOwogICAgICAgIHJlcG9ydElzc3Vlcyhpc3N1ZXMpOwogICAgICAgIC8vIEluIGNhc2Ugb2YgaXNzdWVzLCB1c2UgbGVnYWN5IG1vZGUgZm9yIGVycm9yIHJlY292ZXJ5LgogICAgICAgIGNvdW50ICs9IGNvbXB1dGVEZWZhdWx0VHlwZXNGb3JWYXJpYWJsZXMoCiAgICAgICAgICAgIGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMsIGxlZ2FjeU1vZGUgfHwgaXNzdWVzLmlzTm90RW1wdHkpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpbmNsdWRlUGFydCgKICAgICAgY292YXJpYW50IEtlcm5lbExpYnJhcnlCdWlsZGVyIHBhcnQsIFNldDxVcmk+IHVzZWRQYXJ0cywgaW50IHBhcnRPZmZzZXQpIHsKICAgIGlmICghc3VwZXIuaW5jbHVkZVBhcnQocGFydCwgdXNlZFBhcnRzLCBwYXJ0T2Zmc2V0KSkgcmV0dXJuIGZhbHNlOwogICAgbmF0aXZlTWV0aG9kcy5hZGRBbGwocGFydC5uYXRpdmVNZXRob2RzKTsKICAgIGJvdW5kbGVzc1R5cGVWYXJpYWJsZXMuYWRkQWxsKHBhcnQuYm91bmRsZXNzVHlwZVZhcmlhYmxlcyk7CiAgICAvLyBDaGVjayB0aGF0IHRoZSB0YXJnZXRzIGFyZSBkaWZmZXJlbnQuIFRoaXMgaXMgbm90IG5vcm1hbGx5IGEgcHJvYmxlbQogICAgLy8gYnV0IGlzIGZvciBwYXRjaCBmaWxlcy4KICAgIGlmICh0YXJnZXQgIT0gcGFydC50YXJnZXQgJiYgcGFydC50YXJnZXQucHJvYmxlbXNBc0pzb24gIT0gbnVsbCkgewogICAgICB0YXJnZXQucHJvYmxlbXNBc0pzb24gPz89IDxTdHJpbmc+W107CiAgICAgIHRhcmdldC5wcm9ibGVtc0FzSnNvbi5hZGRBbGwocGFydC50YXJnZXQucHJvYmxlbXNBc0pzb24pOwogICAgfQogICAgTGlzdDxLZXJuZWxGaWVsZEJ1aWxkZXI+IHBhcnRJbXBsaWNpdGx5VHlwZWRGaWVsZHMgPQogICAgICAgIHBhcnQudGFrZUltcGxpY2l0bHlUeXBlZEZpZWxkcygpOwogICAgaWYgKHBhcnRJbXBsaWNpdGx5VHlwZWRGaWVsZHMgIT0gbnVsbCkgewogICAgICBpZiAoaW1wbGljaXRseVR5cGVkRmllbGRzID09IG51bGwpIHsKICAgICAgICBpbXBsaWNpdGx5VHlwZWRGaWVsZHMgPSBwYXJ0SW1wbGljaXRseVR5cGVkRmllbGRzOwogICAgICB9IGVsc2UgewogICAgICAgIGltcGxpY2l0bHlUeXBlZEZpZWxkcy5hZGRBbGwocGFydEltcGxpY2l0bHlUeXBlZEZpZWxkcyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRJbXBvcnRzVG9TY29wZSgpIHsKICAgIHN1cGVyLmFkZEltcG9ydHNUb1Njb3BlKCk7CiAgICBleHBvcnRTY29wZS5mb3JFYWNoKChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gbWVtYmVyKSB7CiAgICAgIGlmIChtZW1iZXIucGFyZW50ICE9IHRoaXMpIHsKICAgICAgICBzd2l0Y2ggKG5hbWUpIHsKICAgICAgICAgIGNhc2UgImR5bmFtaWMiOgogICAgICAgICAgY2FzZSAidm9pZCI6CiAgICAgICAgICAgIHVuc2VyaWFsaXphYmxlRXhwb3J0cyA/Pz0gPFN0cmluZywgU3RyaW5nPnt9OwogICAgICAgICAgICB1bnNlcmlhbGl6YWJsZUV4cG9ydHNbbmFtZV0gPSBudWxsOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZiAobWVtYmVyIGlzIEludmFsaWRUeXBlQnVpbGRlcikgewogICAgICAgICAgICAgIHVuc2VyaWFsaXphYmxlRXhwb3J0cyA/Pz0gPFN0cmluZywgU3RyaW5nPnt9OwogICAgICAgICAgICAgIHVuc2VyaWFsaXphYmxlRXhwb3J0c1tuYW1lXSA9IG1lbWJlci5tZXNzYWdlLm1lc3NhZ2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gRXZlbnR1YWxseSAoaW4gI2J1aWxkQnVpbGRlcikgbWVtYmVycyBhcmVuJ3QgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgICAgLy8gbGlicmFyeSBpZiB0aGUgaGF2ZSAnbmV4dCcgcG9pbnRlcnMsIHNvIGRvbid0IGFkZCB0aGVtIGFzCiAgICAgICAgICAgICAgLy8gYWRkaXRpb25hbEV4cG9ydHMgZWl0aGVyLiBBZGQgdGhlIGxhc3Qgb25lIG9ubHkgKHRoZSBvbmUgdGhhdAogICAgICAgICAgICAgIC8vIHdpbGwgZXZlbnR1YWxseSBiZSBhZGRlZCB0byB0aGUgbGlicmFyeSkuCiAgICAgICAgICAgICAgRGVjbGFyYXRpb24gbWVtYmVyTGFzdCA9IG1lbWJlcjsKICAgICAgICAgICAgICB3aGlsZSAobWVtYmVyTGFzdC5uZXh0ICE9IG51bGwpIG1lbWJlckxhc3QgPSBtZW1iZXJMYXN0Lm5leHQ7CiAgICAgICAgICAgICAgbGlicmFyeS5hZGRpdGlvbmFsRXhwb3J0cy5hZGQobWVtYmVyTGFzdC50YXJnZXQucmVmZXJlbmNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFwcGx5UGF0Y2hlcygpIHsKICAgIGlmICghaXNQYXRjaCkgcmV0dXJuOwogICAgTmFtZUl0ZXJhdG9yIG9yaWdpbkRlY2xhcmF0aW9ucyA9IG9yaWdpbi5uYW1lSXRlcmF0b3I7CiAgICB3aGlsZSAob3JpZ2luRGVjbGFyYXRpb25zLm1vdmVOZXh0KCkpIHsKICAgICAgU3RyaW5nIG5hbWUgPSBvcmlnaW5EZWNsYXJhdGlvbnMubmFtZTsKICAgICAgRGVjbGFyYXRpb24gbWVtYmVyID0gb3JpZ2luRGVjbGFyYXRpb25zLmN1cnJlbnQ7CiAgICAgIGJvb2wgaXNTZXR0ZXIgPSBtZW1iZXIuaXNTZXR0ZXI7CiAgICAgIERlY2xhcmF0aW9uIHBhdGNoID0gaXNTZXR0ZXIgPyBzY29wZS5zZXR0ZXJzW25hbWVdIDogc2NvcGUubG9jYWxbbmFtZV07CiAgICAgIGlmIChwYXRjaCAhPSBudWxsKSB7CiAgICAgICAgLy8gW3BhdGNoXSBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIFttZW1iZXJdIGluIFtvcmlnaW5dIGxpYnJhcnksIHNvIGl0CiAgICAgICAgLy8gbXVzdCBiZSBhIHBhdGNoIHRvIFttZW1iZXJdLgogICAgICAgIG1lbWJlci5hcHBseVBhdGNoKHBhdGNoKTsKICAgICAgICAvLyBUT0RPKGFoZSk6IFZlcmlmeSB0aGF0IHBhdGNoIGhhcyB0aGUgQHBhdGNoIGFubm90YXRpb24uCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTm8gbWVtYmVyIHdpdGggW25hbWVdIGV4aXN0cyBpbiB0aGlzIGxpYnJhcnkgYWxyZWFkeS4gU28gd2UgbmVlZCB0bwogICAgICAgIC8vIGltcG9ydCBpdCBpbnRvIHRoZSBwYXRjaCBsaWJyYXJ5LiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgb3JpZ2luCiAgICAgICAgLy8gbGlicmFyeSBpcyBpbiBzY29wZSBvZiB0aGUgcGF0Y2ggbGlicmFyeS4KICAgICAgICBpZiAoaXNTZXR0ZXIpIHsKICAgICAgICAgIHNjb3BlQnVpbGRlci5hZGRTZXR0ZXIobmFtZSwgbWVtYmVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2NvcGVCdWlsZGVyLmFkZE1lbWJlcihuYW1lLCBtZW1iZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgTmFtZUl0ZXJhdG9yIHBhdGNoRGVjbGFyYXRpb25zID0gbmFtZUl0ZXJhdG9yOwogICAgd2hpbGUgKHBhdGNoRGVjbGFyYXRpb25zLm1vdmVOZXh0KCkpIHsKICAgICAgU3RyaW5nIG5hbWUgPSBwYXRjaERlY2xhcmF0aW9ucy5uYW1lOwogICAgICBEZWNsYXJhdGlvbiBtZW1iZXIgPSBwYXRjaERlY2xhcmF0aW9ucy5jdXJyZW50OwogICAgICAvLyBXZSBuZWVkIHRvIGluamVjdCBhbGwgbm9uLXBhdGNoIG1lbWJlcnMgaW50byB0aGUgb3JpZ2luIGxpYnJhcnkuIFRoaXMKICAgICAgLy8gc2hvdWxkIG9ubHkgYXBwbHkgdG8gcHJpdmF0ZSBtZW1iZXJzLgogICAgICBpZiAobWVtYmVyLmlzUGF0Y2gpIHsKICAgICAgICAvLyBJZ25vcmUgcGF0Y2hlcy4KICAgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoIl8iKSkgewogICAgICAgIG9yaWdpbi5pbmplY3RNZW1iZXJGcm9tUGF0Y2gobmFtZSwgbWVtYmVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvcmlnaW4uZXhwb3J0TWVtYmVyRnJvbVBhdGNoKG5hbWUsIG1lbWJlcik7CiAgICAgIH0KICAgIH0KICB9CgogIGludCBmaW5pc2hQYXRjaE1ldGhvZHMoKSB7CiAgICBpZiAoIWlzUGF0Y2gpIHJldHVybiAwOwogICAgaW50IGNvdW50ID0gMDsKICAgIEl0ZXJhdG9yPERlY2xhcmF0aW9uPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICBjb3VudCArPSBpdGVyYXRvci5jdXJyZW50LmZpbmlzaFBhdGNoKCk7CiAgICB9CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICB2b2lkIGluamVjdE1lbWJlckZyb21QYXRjaChTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyLmlzU2V0dGVyKSB7CiAgICAgIGFzc2VydChzY29wZS5zZXR0ZXJzW25hbWVdID09IG51bGwpOwogICAgICBzY29wZUJ1aWxkZXIuYWRkU2V0dGVyKG5hbWUsIG1lbWJlcik7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoc2NvcGUubG9jYWxbbmFtZV0gPT0gbnVsbCk7CiAgICAgIHNjb3BlQnVpbGRlci5hZGRNZW1iZXIobmFtZSwgbWVtYmVyKTsKICAgIH0KICB9CgogIHZvaWQgZXhwb3J0TWVtYmVyRnJvbVBhdGNoKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBtZW1iZXIpIHsKICAgIGlmICh1cmkuc2NoZW1lICE9ICJkYXJ0IiB8fCAhdXJpLnBhdGguc3RhcnRzV2l0aCgiXyIpKSB7CiAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVQYXRjaEluamVjdGlvbkZhaWxlZC53aXRoQXJndW1lbnRzKG5hbWUsIHVyaSksCiAgICAgICAgICBtZW1iZXIuY2hhck9mZnNldCwgbm9MZW5ndGgsIG1lbWJlci5maWxlVXJpKTsKICAgIH0KICAgIC8vIFBsYXRmb3JtLXByaXZhdGUgbGlicmFyaWVzLCBzdWNoIGFzICJkYXJ0Ol9pbnRlcm5hbCIgaGF2ZSBzcGVjaWFsCiAgICAvLyBzZW1hbnRpY3M6IHB1YmxpYyBtZW1iZXJzIGFyZSBpbmplY3RlZCBpbnRvIHRoZSBvcmlnaW4gbGlicmFyeS4KICAgIC8vIFRPRE8oYWhlKTogU2VlIGlmIHdlIGNhbiByZW1vdmUgdGhpcyBzcGVjaWFsIGNhc2UuCgogICAgLy8gSWYgdGhpcyBtZW1iZXIgYWxyZWFkeSBleGlzdCBpbiB0aGUgb3JpZ2luIGxpYnJhcnkgc2NvcGUsIGl0IHNob3VsZAogICAgLy8gaGF2ZSBiZWVuIG1hcmtlZCBhcyBwYXRjaC4KICAgIGFzc2VydCgobWVtYmVyLmlzU2V0dGVyICYmIHNjb3BlLnNldHRlcnNbbmFtZV0gPT0gbnVsbCkgfHwKICAgICAgICAoIW1lbWJlci5pc1NldHRlciAmJiBzY29wZS5sb2NhbFtuYW1lXSA9PSBudWxsKSk7CiAgICBhZGRUb0V4cG9ydFNjb3BlKG5hbWUsIG1lbWJlcik7CiAgfQoKICB2b2lkIHJlcG9ydFR5cGVBcmd1bWVudElzc3VlcygKICAgICAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gaXNzdWVzLCBVcmkgZmlsZVVyaSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgaW5mZXJyZWQsIERhcnRUeXBlIHRhcmdldFJlY2VpdmVyLCBTdHJpbmcgdGFyZ2V0TmFtZX0pIHsKICAgIGZvciAoVHlwZUFyZ3VtZW50SXNzdWUgaXNzdWUgaW4gaXNzdWVzKSB7CiAgICAgIERhcnRUeXBlIGFyZ3VtZW50ID0gaXNzdWUuYXJndW1lbnQ7CiAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGlzc3VlLnR5cGVQYXJhbWV0ZXI7CgogICAgICBNZXNzYWdlIG1lc3NhZ2U7CiAgICAgIGJvb2wgaXNzdWVJbmZlcnJlZCA9IGluZmVycmVkID8/IGluZmVycmVkVHlwZXMuY29udGFpbnMoYXJndW1lbnQpOwogICAgICBpZiAoYXJndW1lbnQgaXMgRnVuY3Rpb25UeXBlICYmIGFyZ3VtZW50LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgICBpZiAoaXNzdWVJbmZlcnJlZCkgewogICAgICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnQKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhhcmd1bWVudCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlR2VuZXJpY0Z1bmN0aW9uVHlwZVVzZWRBc0FjdHVhbFR5cGVBcmd1bWVudDsKICAgICAgICB9CiAgICAgICAgdHlwZVBhcmFtZXRlciA9IG51bGw7CiAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnQgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICAgIGFyZ3VtZW50LnByb21vdGVkQm91bmQgIT0gbnVsbCkgewogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlSW50ZXJzZWN0aW9uVHlwZUFzVHlwZUFyZ3VtZW50LndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLm5hbWUsIGFyZ3VtZW50LCBhcmd1bWVudC5wcm9tb3RlZEJvdW5kKSwKICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgZmlsZVVyaSk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzc3VlLmVuY2xvc2luZ1R5cGUgPT0gbnVsbCAmJiB0YXJnZXRSZWNlaXZlciAhPSBudWxsKSB7CiAgICAgICAgICBpZiAoaXNzdWVJbmZlcnJlZCkgewogICAgICAgICAgICBtZXNzYWdlID0KICAgICAgICAgICAgICAgIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkSW5mZXJyZWQud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICBhcmd1bWVudCwKICAgICAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kLAogICAgICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIubmFtZSwKICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWNlaXZlciwKICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgYXJndW1lbnQsCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kLAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5uYW1lLAogICAgICAgICAgICAgICAgdGFyZ2V0UmVjZWl2ZXIsCiAgICAgICAgICAgICAgICB0YXJnZXROYW1lKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgU3RyaW5nIGVuY2xvc2luZ05hbWUgPSBpc3N1ZS5lbmNsb3NpbmdUeXBlID09IG51bGwKICAgICAgICAgICAgICA/IHRhcmdldE5hbWUKICAgICAgICAgICAgICA6IGdldEdlbmVyaWNUeXBlTmFtZShpc3N1ZS5lbmNsb3NpbmdUeXBlKTsKICAgICAgICAgIGFzc2VydChlbmNsb3NpbmdOYW1lICE9IG51bGwpOwogICAgICAgICAgaWYgKGlzc3VlSW5mZXJyZWQpIHsKICAgICAgICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5mZXJyZWQud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIGFyZ3VtZW50LAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5ib3VuZCwKICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIubmFtZSwKICAgICAgICAgICAgICAgIGVuY2xvc2luZ05hbWUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50LndpdGhBcmd1bWVudHMoYXJndW1lbnQsCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kLCB0eXBlUGFyYW1ldGVyLm5hbWUsIGVuY2xvc2luZ05hbWUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmVwb3J0VHlwZUFyZ3VtZW50SXNzdWUobWVzc2FnZSwgZmlsZVVyaSwgb2Zmc2V0LCB0eXBlUGFyYW1ldGVyKTsKICAgIH0KICB9CgogIHZvaWQgcmVwb3J0VHlwZUFyZ3VtZW50SXNzdWUoTWVzc2FnZSBtZXNzYWdlLCBVcmkgZmlsZVVyaSwgaW50IGZpbGVPZmZzZXQsCiAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlcikgewogICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dDsKICAgIGlmICh0eXBlUGFyYW1ldGVyICE9IG51bGwgJiYgdHlwZVBhcmFtZXRlci5maWxlT2Zmc2V0ICE9IC0xKSB7CiAgICAgIC8vIEl0IGxvb2tzIGxpa2Ugd2hlbiBwYXJhbWV0ZXJzIGNvbWUgZnJvbSBwYXRjaCBmaWxlcywgdGhleSBkb24ndAogICAgICAvLyBoYXZlIGEgcmVwb3J0YWJsZSBsb2NhdGlvbi4KICAgICAgY29udGV4dCA9IDxMb2NhdGVkTWVzc2FnZT5bCiAgICAgICAgbWVzc2FnZUluY29ycmVjdFR5cGVBcmd1bWVudFZhcmlhYmxlLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5sb2NhdGlvbi5maWxlLCB0eXBlUGFyYW1ldGVyLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKQogICAgICBdOwogICAgfQogICAgYWRkUHJvYmxlbShtZXNzYWdlLCBmaWxlT2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSwgY29udGV4dDogY29udGV4dCk7CiAgfQoKICB2b2lkIGNoZWNrQm91bmRzSW5GaWVsZChGaWVsZCBmaWVsZCwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCkgewogICAgaWYgKGxvYWRlci50YXJnZXQubGVnYWN5TW9kZSkgcmV0dXJuOwogICAgY2hlY2tCb3VuZHNJblR5cGUoCiAgICAgICAgZmllbGQudHlwZSwgdHlwZUVudmlyb25tZW50LCBmaWVsZC5maWxlVXJpLCBmaWVsZC5maWxlT2Zmc2V0LAogICAgICAgIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKTsKICB9CgogIHZvaWQgY2hlY2tCb3VuZHNJbkZ1bmN0aW9uTm9kZVBhcnRzKAogICAgICBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBVcmkgZmlsZVVyaSwgaW50IGZpbGVPZmZzZXQsCiAgICAgIHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycywKICAgICAgRGFydFR5cGUgcmV0dXJuVHlwZX0pIHsKICAgIGlmIChsb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGUpIHJldHVybjsKICAgIGlmICh0eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIGZvciAoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIgaW4gdHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICBjaGVja0JvdW5kc0luVHlwZSgKICAgICAgICAgICAgcGFyYW1ldGVyLmJvdW5kLCB0eXBlRW52aXJvbm1lbnQsIGZpbGVVcmksIHBhcmFtZXRlci5maWxlT2Zmc2V0LAogICAgICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChwb3NpdGlvbmFsUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBmb3JtYWwgaW4gcG9zaXRpb25hbFBhcmFtZXRlcnMpIHsKICAgICAgICBjaGVja0JvdW5kc0luVHlwZSgKICAgICAgICAgICAgZm9ybWFsLnR5cGUsIHR5cGVFbnZpcm9ubWVudCwgZmlsZVVyaSwgZm9ybWFsLmZpbGVPZmZzZXQsCiAgICAgICAgICAgIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKTsKICAgICAgfQogICAgfQogICAgaWYgKG5hbWVkUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBuYW1lZCBpbiBuYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgICBjaGVja0JvdW5kc0luVHlwZSgKICAgICAgICAgICAgbmFtZWQudHlwZSwgdHlwZUVudmlyb25tZW50LCBmaWxlVXJpLCBuYW1lZC5maWxlT2Zmc2V0LAogICAgICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChyZXR1cm5UeXBlICE9IG51bGwpIHsKICAgICAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gaXNzdWVzID0gZmluZFR5cGVBcmd1bWVudElzc3VlcygKICAgICAgICAgIHJldHVyblR5cGUsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICAgIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKTsKICAgICAgaWYgKGlzc3VlcyAhPSBudWxsKSB7CiAgICAgICAgaW50IG9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgICAgZm9yIChUeXBlQXJndW1lbnRJc3N1ZSBpc3N1ZSBpbiBpc3N1ZXMpIHsKICAgICAgICAgIERhcnRUeXBlIGFyZ3VtZW50ID0gaXNzdWUuYXJndW1lbnQ7CiAgICAgICAgICBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBpc3N1ZS50eXBlUGFyYW1ldGVyOwoKICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgW2FyZ3VtZW50XSB3YXMgaW5mZXJyZWQgb3Igc3BlY2lmaWVkCiAgICAgICAgICAvLyBoZXJlLCBiZWNhdXNlIGluZmVyZW5jZSBpbiByZXR1cm4gdHlwZXMgYm9pbHMgZG93biB0byBpbnN0YW50aWF0ZS0KICAgICAgICAgIC8vIC10by1ib3VuZCwgYW5kIGl0IGNhbid0IHByb3ZpZGUgYSB0eXBlIHRoYXQgdmlvbGF0ZXMgdGhlIGJvdW5kLgogICAgICAgICAgTWVzc2FnZSBtZXNzYWdlOwogICAgICAgICAgaWYgKGFyZ3VtZW50IGlzIEZ1bmN0aW9uVHlwZSAmJiBhcmd1bWVudC50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlR2VuZXJpY0Z1bmN0aW9uVHlwZVVzZWRBc0FjdHVhbFR5cGVBcmd1bWVudDsKICAgICAgICAgICAgdHlwZVBhcmFtZXRlciA9IG51bGw7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtZXNzYWdlID0gdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblJldHVyblR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIGFyZ3VtZW50LAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5ib3VuZCwKICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIubmFtZSwKICAgICAgICAgICAgICAgIGdldEdlbmVyaWNUeXBlTmFtZShpc3N1ZS5lbmNsb3NpbmdUeXBlKSk7CiAgICAgICAgICB9CgogICAgICAgICAgcmVwb3J0VHlwZUFyZ3VtZW50SXNzdWUobWVzc2FnZSwgZmlsZVVyaSwgb2Zmc2V0LCB0eXBlUGFyYW1ldGVyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgY2hlY2tCb3VuZHNJbkZ1bmN0aW9uTm9kZSgKICAgICAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBVcmkgZmlsZVVyaSkgewogICAgaWYgKGxvYWRlci50YXJnZXQubGVnYWN5TW9kZSkgcmV0dXJuOwogICAgY2hlY2tCb3VuZHNJbkZ1bmN0aW9uTm9kZVBhcnRzKAogICAgICAgIHR5cGVFbnZpcm9ubWVudCwgZmlsZVVyaSwgZnVuY3Rpb24uZmlsZU9mZnNldCwKICAgICAgICB0eXBlUGFyYW1ldGVyczogZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMsCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHJldHVyblR5cGU6IGZ1bmN0aW9uLnJldHVyblR5cGUpOwogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luTGlzdExpdGVyYWwoCiAgICAgIExpc3RMaXRlcmFsIG5vZGUsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsIFVyaSBmaWxlVXJpLAogICAgICB7Ym9vbCBpbmZlcnJlZCA9IGZhbHNlfSkgewogICAgaWYgKGxvYWRlci50YXJnZXQubGVnYWN5TW9kZSkgcmV0dXJuOwogICAgY2hlY2tCb3VuZHNJblR5cGUoCiAgICAgICAgbm9kZS50eXBlQXJndW1lbnQsIHR5cGVFbnZpcm9ubWVudCwgZmlsZVVyaSwgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIGluZmVycmVkOiBpbmZlcnJlZCwgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpOwogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luU2V0TGl0ZXJhbCgKICAgICAgU2V0TGl0ZXJhbCBub2RlLCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBVcmkgZmlsZVVyaSwKICAgICAge2Jvb2wgaW5mZXJyZWQgPSBmYWxzZX0pIHsKICAgIGlmIChsb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGUpIHJldHVybjsKICAgIGNoZWNrQm91bmRzSW5UeXBlKAogICAgICAgIG5vZGUudHlwZUFyZ3VtZW50LCB0eXBlRW52aXJvbm1lbnQsIGZpbGVVcmksIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICBpbmZlcnJlZDogaW5mZXJyZWQsIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKTsKICB9CgogIHZvaWQgY2hlY2tCb3VuZHNJbk1hcExpdGVyYWwoCiAgICAgIE1hcExpdGVyYWwgbm9kZSwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwgVXJpIGZpbGVVcmksCiAgICAgIHtib29sIGluZmVycmVkID0gZmFsc2V9KSB7CiAgICBpZiAobG9hZGVyLnRhcmdldC5sZWdhY3lNb2RlKSByZXR1cm47CiAgICBjaGVja0JvdW5kc0luVHlwZShub2RlLmtleVR5cGUsIHR5cGVFbnZpcm9ubWVudCwgZmlsZVVyaSwgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIGluZmVycmVkOiBpbmZlcnJlZCwgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpOwogICAgY2hlY2tCb3VuZHNJblR5cGUobm9kZS52YWx1ZVR5cGUsIHR5cGVFbnZpcm9ubWVudCwgZmlsZVVyaSwgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIGluZmVycmVkOiBpbmZlcnJlZCwgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpOwogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luVHlwZSgKICAgICAgRGFydFR5cGUgdHlwZSwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwgVXJpIGZpbGVVcmksIGludCBvZmZzZXQsCiAgICAgIHtib29sIGluZmVycmVkLCBib29sIGFsbG93U3VwZXJCb3VuZGVkID0gdHJ1ZX0pIHsKICAgIGlmIChsb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGUpIHJldHVybjsKICAgIExpc3Q8VHlwZUFyZ3VtZW50SXNzdWU+IGlzc3VlcyA9IGZpbmRUeXBlQXJndW1lbnRJc3N1ZXMoCiAgICAgICAgdHlwZSwgdHlwZUVudmlyb25tZW50LAogICAgICAgIGFsbG93U3VwZXJCb3VuZGVkOiBhbGxvd1N1cGVyQm91bmRlZCk7CiAgICBpZiAoaXNzdWVzICE9IG51bGwpIHsKICAgICAgcmVwb3J0VHlwZUFyZ3VtZW50SXNzdWVzKGlzc3VlcywgZmlsZVVyaSwgb2Zmc2V0LCBpbmZlcnJlZDogaW5mZXJyZWQpOwogICAgfQogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luVmFyaWFibGVEZWNsYXJhdGlvbigKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlLCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBVcmkgZmlsZVVyaSwKICAgICAge2Jvb2wgaW5mZXJyZWQgPSBmYWxzZX0pIHsKICAgIGlmIChsb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGUpIHJldHVybjsKICAgIGlmIChub2RlLnR5cGUgPT0gbnVsbCkgcmV0dXJuOwogICAgY2hlY2tCb3VuZHNJblR5cGUobm9kZS50eXBlLCB0eXBlRW52aXJvbm1lbnQsIGZpbGVVcmksIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICBpbmZlcnJlZDogaW5mZXJyZWQsIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKTsKICB9CgogIHZvaWQgY2hlY2tCb3VuZHNJbkNvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsIFVyaSBmaWxlVXJpLAogICAgICB7Ym9vbCBpbmZlcnJlZCA9IGZhbHNlfSkgewogICAgaWYgKGxvYWRlci50YXJnZXQubGVnYWN5TW9kZSkgcmV0dXJuOwogICAgaWYgKG5vZGUuYXJndW1lbnRzLnR5cGVzLmlzRW1wdHkpIHJldHVybjsKICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gbm9kZS50YXJnZXQ7CiAgICBDbGFzcyBrbGFzcyA9IGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzOwogICAgRGFydFR5cGUgY29uc3RydWN0ZWRUeXBlID0gbmV3IEludGVyZmFjZVR5cGUoa2xhc3MsIG5vZGUuYXJndW1lbnRzLnR5cGVzKTsKICAgIGNoZWNrQm91bmRzSW5UeXBlKAogICAgICAgIGNvbnN0cnVjdGVkVHlwZSwgdHlwZUVudmlyb25tZW50LCBmaWxlVXJpLCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5mZXJyZWQ6IGluZmVycmVkLCBhbGxvd1N1cGVyQm91bmRlZDogZmFsc2UpOwogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luRmFjdG9yeUludm9jYXRpb24oCiAgICAgIFN0YXRpY0ludm9jYXRpb24gbm9kZSwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwgVXJpIGZpbGVVcmksCiAgICAgIHtib29sIGluZmVycmVkID0gZmFsc2V9KSB7CiAgICBpZiAobG9hZGVyLnRhcmdldC5sZWdhY3lNb2RlKSByZXR1cm47CiAgICBpZiAobm9kZS5hcmd1bWVudHMudHlwZXMuaXNFbXB0eSkgcmV0dXJuOwogICAgUHJvY2VkdXJlIGZhY3RvcnkgPSBub2RlLnRhcmdldDsKICAgIGFzc2VydChmYWN0b3J5LmlzRmFjdG9yeSk7CiAgICBDbGFzcyBrbGFzcyA9IGZhY3RvcnkuZW5jbG9zaW5nQ2xhc3M7CiAgICBEYXJ0VHlwZSBjb25zdHJ1Y3RlZFR5cGUgPSBuZXcgSW50ZXJmYWNlVHlwZShrbGFzcywgbm9kZS5hcmd1bWVudHMudHlwZXMpOwogICAgY2hlY2tCb3VuZHNJblR5cGUoCiAgICAgICAgY29uc3RydWN0ZWRUeXBlLCB0eXBlRW52aXJvbm1lbnQsIGZpbGVVcmksIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICBpbmZlcnJlZDogaW5mZXJyZWQsIGFsbG93U3VwZXJCb3VuZGVkOiBmYWxzZSk7CiAgfQoKICB2b2lkIGNoZWNrQm91bmRzSW5TdGF0aWNJbnZvY2F0aW9uKAogICAgICBTdGF0aWNJbnZvY2F0aW9uIG5vZGUsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsIFVyaSBmaWxlVXJpLAogICAgICB7Ym9vbCBpbmZlcnJlZCA9IGZhbHNlfSkgewogICAgaWYgKGxvYWRlci50YXJnZXQubGVnYWN5TW9kZSkgcmV0dXJuOwogICAgaWYgKG5vZGUuYXJndW1lbnRzLnR5cGVzLmlzRW1wdHkpIHJldHVybjsKICAgIENsYXNzIGtsYXNzID0gbm9kZS50YXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBub2RlLnRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVyczsKICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cyA9IG5vZGUuYXJndW1lbnRzLnR5cGVzOwogICAgLy8gVGhlIGZvbGxvd2luZyBlcnJvciBpcyB0byBiZSByZXBvcnRlZCBlbHNld2hlcmUuCiAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggIT0gYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuOwogICAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gaXNzdWVzID0gZmluZFR5cGVBcmd1bWVudElzc3Vlc0Zvckludm9jYXRpb24oCiAgICAgICAgcGFyYW1ldGVycywgYXJndW1lbnRzLCB0eXBlRW52aXJvbm1lbnQpOwogICAgaWYgKGlzc3VlcyAhPSBudWxsKSB7CiAgICAgIERhcnRUeXBlIHRhcmdldFJlY2VpdmVyOwogICAgICBpZiAoa2xhc3MgIT0gbnVsbCkgewogICAgICAgIHRhcmdldFJlY2VpdmVyID0gbmV3IEludGVyZmFjZVR5cGUoa2xhc3MpOwogICAgICB9CiAgICAgIFN0cmluZyB0YXJnZXROYW1lID0gbm9kZS50YXJnZXQubmFtZS5uYW1lOwogICAgICByZXBvcnRUeXBlQXJndW1lbnRJc3N1ZXMoaXNzdWVzLCBmaWxlVXJpLCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICBpbmZlcnJlZDogaW5mZXJyZWQsCiAgICAgICAgICB0YXJnZXRSZWNlaXZlcjogdGFyZ2V0UmVjZWl2ZXIsCiAgICAgICAgICB0YXJnZXROYW1lOiB0YXJnZXROYW1lKTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tCb3VuZHNJbk1ldGhvZEludm9jYXRpb24oCiAgICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwKICAgICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgICBUeXBlSW5mZXJyZXJJbXBsIHR5cGVJbmZlcnJlciwKICAgICAgTmFtZSBuYW1lLAogICAgICBNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0LAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBVcmkgZmlsZVVyaSwKICAgICAgaW50IG9mZnNldCwKICAgICAge2Jvb2wgaW5mZXJyZWQgPSBmYWxzZX0pIHsKICAgIGlmIChsb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGUpIHJldHVybjsKICAgIGlmIChhcmd1bWVudHMudHlwZXMuaXNFbXB0eSkgcmV0dXJuOwogICAgQ2xhc3Mga2xhc3M7CiAgICBMaXN0PERhcnRUeXBlPiByZWNlaXZlclR5cGVBcmd1bWVudHM7CiAgICBpZiAocmVjZWl2ZXJUeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAga2xhc3MgPSByZWNlaXZlclR5cGUuY2xhc3NOb2RlOwogICAgICByZWNlaXZlclR5cGVBcmd1bWVudHMgPSByZWNlaXZlclR5cGUudHlwZUFyZ3VtZW50czsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBGaW5kIGEgYmV0dGVyIHdheSB0aGFuIHJlbHlpbmcgb24gW2ludGVyZmFjZVRhcmdldF0uCiAgICBNZW1iZXIgbWV0aG9kID0gaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0KGtsYXNzLCBuYW1lKSA/PyBpbnRlcmZhY2VUYXJnZXQ7CiAgICBpZiAobWV0aG9kID09IG51bGwgfHwgbWV0aG9kIGlzISBQcm9jZWR1cmUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGtsYXNzICE9IG1ldGhvZC5lbmNsb3NpbmdDbGFzcykgewogICAgICBTdXBlcnR5cGUgcGFyZW50ID0KICAgICAgICAgIGhpZXJhcmNoeS5nZXRDbGFzc0FzSW5zdGFuY2VPZihrbGFzcywgbWV0aG9kLmVuY2xvc2luZ0NsYXNzKTsKICAgICAga2xhc3MgPSBtZXRob2QuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIHJlY2VpdmVyVHlwZUFyZ3VtZW50cyA9IHBhcmVudC50eXBlQXJndW1lbnRzOwogICAgfQogICAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBzdWJzdGl0dXRpb25NYXAgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY2VpdmVyVHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICBzdWJzdGl0dXRpb25NYXBba2xhc3MudHlwZVBhcmFtZXRlcnNbaV1dID0gcmVjZWl2ZXJUeXBlQXJndW1lbnRzW2ldOwogICAgfQogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBtZXRob2RQYXJhbWV0ZXJzID0gbWV0aG9kLmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwogICAgLy8gVGhlIGVycm9yIGlzIHRvIGJlIHJlcG9ydGVkIGVsc2V3aGVyZS4KICAgIGlmIChtZXRob2RQYXJhbWV0ZXJzLmxlbmd0aCAhPSBhcmd1bWVudHMudHlwZXMubGVuZ3RoKSByZXR1cm47CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IGluc3RhbnRpYXRlZE1ldGhvZFBhcmFtZXRlcnMgPQogICAgICAgIG5ldyBMaXN0PFR5cGVQYXJhbWV0ZXI+LmZpbGxlZChtZXRob2RQYXJhbWV0ZXJzLmxlbmd0aCwgbnVsbCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbnRpYXRlZE1ldGhvZFBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgaW5zdGFudGlhdGVkTWV0aG9kUGFyYW1ldGVyc1tpXSA9CiAgICAgICAgICBuZXcgVHlwZVBhcmFtZXRlcihtZXRob2RQYXJhbWV0ZXJzW2ldLm5hbWUpOwogICAgICBzdWJzdGl0dXRpb25NYXBbbWV0aG9kUGFyYW1ldGVyc1tpXV0gPQogICAgICAgICAgbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKGluc3RhbnRpYXRlZE1ldGhvZFBhcmFtZXRlcnNbaV0pOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW50aWF0ZWRNZXRob2RQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIGluc3RhbnRpYXRlZE1ldGhvZFBhcmFtZXRlcnNbaV0uYm91bmQgPQogICAgICAgICAgc3Vic3RpdHV0ZShtZXRob2RQYXJhbWV0ZXJzW2ldLmJvdW5kLCBzdWJzdGl0dXRpb25NYXApOwogICAgfQogICAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gaXNzdWVzID0gZmluZFR5cGVBcmd1bWVudElzc3Vlc0Zvckludm9jYXRpb24oCiAgICAgICAgaW5zdGFudGlhdGVkTWV0aG9kUGFyYW1ldGVycywgYXJndW1lbnRzLnR5cGVzLCB0eXBlRW52aXJvbm1lbnQpOwogICAgaWYgKGlzc3VlcyAhPSBudWxsKSB7CiAgICAgIHJlcG9ydFR5cGVBcmd1bWVudElzc3Vlcyhpc3N1ZXMsIGZpbGVVcmksIG9mZnNldCwKICAgICAgICAgIGluZmVycmVkOiBpbmZlcnJlZCwKICAgICAgICAgIHRhcmdldFJlY2VpdmVyOiByZWNlaXZlclR5cGUsCiAgICAgICAgICB0YXJnZXROYW1lOiBuYW1lLm5hbWUpOwogICAgfQogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luT3V0bGluZShUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50KSB7CiAgICBpZiAobG9hZGVyLnRhcmdldC5sZWdhY3lNb2RlKSByZXR1cm47CiAgICBJdGVyYXRvcjxEZWNsYXJhdGlvbj4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBpdGVyYXRvci5jdXJyZW50OwogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgS2VybmVsRmllbGRCdWlsZGVyKSB7CiAgICAgICAgY2hlY2tCb3VuZHNJbkZpZWxkKGRlY2xhcmF0aW9uLnRhcmdldCwgdHlwZUVudmlyb25tZW50KTsKICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBQcm9jZWR1cmVCdWlsZGVyKSB7CiAgICAgICAgY2hlY2tCb3VuZHNJbkZ1bmN0aW9uTm9kZSgKICAgICAgICAgICAgZGVjbGFyYXRpb24udGFyZ2V0LmZ1bmN0aW9uLCB0eXBlRW52aXJvbm1lbnQsIGRlY2xhcmF0aW9uLmZpbGVVcmkpOwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlcikgewogICAgICAgIGRlY2xhcmF0aW9uLmNoZWNrQm91bmRzSW5PdXRsaW5lKHR5cGVFbnZpcm9ubWVudCk7CiAgICAgIH0KICAgIH0KICAgIGluZmVycmVkVHlwZXMuY2xlYXIoKTsKICB9CgogIEBvdmVycmlkZQogIGludCBmaW5hbGl6ZUluaXRpYWxpemluZ0Zvcm1hbHMoKSB7CiAgICBpZiAoIWxlZ2FjeU1vZGUgfHwgdW50eXBlZEluaXRpYWxpemluZ0Zvcm1hbHMgPT0gbnVsbCkgcmV0dXJuIDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHVudHlwZWRJbml0aWFsaXppbmdGb3JtYWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHVudHlwZWRJbml0aWFsaXppbmdGb3JtYWxzW2ldLmZpbmFsaXplSW5pdGlhbGl6aW5nRm9ybWFsKCk7CiAgICB9CiAgICBpbnQgY291bnQgPSB1bnR5cGVkSW5pdGlhbGl6aW5nRm9ybWFscy5sZW5ndGg7CiAgICB1bnR5cGVkSW5pdGlhbGl6aW5nRm9ybWFscyA9IG51bGw7CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PEtlcm5lbEZpZWxkQnVpbGRlcj4gdGFrZUltcGxpY2l0bHlUeXBlZEZpZWxkcygpIHsKICAgIExpc3Q8S2VybmVsRmllbGRCdWlsZGVyPiByZXN1bHQgPSBpbXBsaWNpdGx5VHlwZWRGaWVsZHM7CiAgICBpbXBsaWNpdGx5VHlwZWRGaWVsZHMgPSBudWxsOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KClVyaSBjb21wdXRlTGlicmFyeVVyaShEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewogIERlY2xhcmF0aW9uIGN1cnJlbnQgPSBkZWNsYXJhdGlvbjsKICBkbyB7CiAgICBpZiAoY3VycmVudCBpcyBMaWJyYXJ5QnVpbGRlcikgcmV0dXJuIGN1cnJlbnQudXJpOwogICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50OwogIH0gd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCk7CiAgcmV0dXJuIHVuaGFuZGxlZCgibm8gbGlicmFyeSBwYXJlbnQiLCAiJHtkZWNsYXJhdGlvbi5ydW50aW1lVHlwZX0iLAogICAgICBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0LCBkZWNsYXJhdGlvbi5maWxlVXJpKTsKfQoKU3RyaW5nIGV4dHJhY3ROYW1lKG5hbWUpID0+IG5hbWUgaXMgUXVhbGlmaWVkTmFtZSA/IG5hbWUubmFtZSA6IG5hbWU7CoeeAE5OPAEmAScBIQkTDxUfEhUUDxYWFxEbFRUUEA4TFxQaFxMRFxsdEgFCATYBLwkbIC0cATsBRAEuASUBHQkaGBEvKzwuKzASKyIoIigjQSMnMy8wODAoLCwmMQElASUBGgkWIRwgHiMUASoBNgEpAUYBLzMBRQEdCRwcFiUVHBogHRscHBUZGhwfIRoaIxgcFxkWFxcPFSAdGBkbHQEiAR4JGSIuMAE6GQErAUMBOx8BTU5NDDsBUCs5RAFPT0U0HQEoBjIGRUIGTz8tATsBMgFPORxL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N3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9saWJyYXJ5X2dyYXBoLmRhcnSGPS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmxpYnJhcnlfZ3JhcGg7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JwogICAgc2hvdyBMaWJyYXJ5LCBMaWJyYXJ5RGVwZW5kZW5jeSwgTGlicmFyeVBhcnQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3V0aWwvZ3JhcGguZGFydCcgc2hvdyBHcmFwaDsKCmNsYXNzIExpYnJhcnlHcmFwaCBpbXBsZW1lbnRzIEdyYXBoPFVyaT4gewogIGZpbmFsIE1hcDxVcmksIExpYnJhcnk+IGxpYnJhcmllczsKCiAgTGlicmFyeUdyYXBoKHRoaXMubGlicmFyaWVzKTsKCiAgSXRlcmFibGU8VXJpPiBnZXQgdmVydGljZXMgPT4gbGlicmFyaWVzLmtleXM7CgogIEl0ZXJhYmxlPFVyaT4gbmVpZ2hib3JzT2YoVXJpIHZlcnRleCkgc3luYyogewogICAgTGlicmFyeSBsaWJyYXJ5ID0gbGlicmFyaWVzW3ZlcnRleF07CiAgICBpZiAobGlicmFyeSA9PSBudWxsKSB7CiAgICAgIHRocm93ICJMaWJyYXJ5IG5vdCBmb3VuZDogJHZlcnRleCI7CiAgICB9CgogICAgLy8gSW1wb3J0cyBhbmQgZXhwb3J0cy4KICAgIGZvciAoTGlicmFyeURlcGVuZGVuY3kgZGVwZW5kZW5jeSBpbiBsaWJyYXJ5LmRlcGVuZGVuY2llcykgewogICAgICBVcmkgdXJpMSA9IGRlcGVuZGVuY3kudGFyZ2V0TGlicmFyeS5pbXBvcnRVcmk7CiAgICAgIFVyaSB1cmkyID0gZGVwZW5kZW5jeS50YXJnZXRMaWJyYXJ5LmZpbGVVcmk7CiAgICAgIGlmIChsaWJyYXJpZXMuY29udGFpbnNLZXkodXJpMSkpIHsKICAgICAgICB5aWVsZCB1cmkxOwogICAgICB9IGVsc2UgaWYgKHVyaTIgIT0gbnVsbCkgewogICAgICAgIGlmIChsaWJyYXJpZXMuY29udGFpbnNLZXkodXJpMikpIHsKICAgICAgICAgIHlpZWxkIHVyaTI7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gUGFydHMuCiAgICAvLyBOb3JtYWxseSB0aGVyZSB3b24ndCBiZSBsaWJyYXJpZXMgZm9yIHRoZXNlLCBidXQgaWYsIGZvciBpbnN0YW5jZSwKICAgIC8vIHRoZSBwYXJ0IGRpZG4ndCBleGlzdCB0aGVyZSB3aWxsIGJlIGEgc3ludGhldGljIGxpYnJhcnkuCiAgICBmb3IgKExpYnJhcnlQYXJ0IHBhcnQgaW4gbGlicmFyeS5wYXJ0cykgewogICAgICBVcmkgcGFydFVyaSA9IGxpYnJhcnkuaW1wb3J0VXJpLnJlc29sdmUocGFydC5wYXJ0VXJpKTsKICAgICAgVXJpIGZpbGVVcmkgPSBsaWJyYXJ5LmZpbGVVcmkucmVzb2x2ZShwYXJ0LnBhcnRVcmkpOwogICAgICBpZiAobGlicmFyaWVzLmNvbnRhaW5zS2V5KHBhcnRVcmkpKSB7CiAgICAgICAgeWllbGQgcGFydFVyaTsKICAgICAgfSBlbHNlIGlmIChmaWxlVXJpICE9IHBhcnRVcmkgJiYgbGlicmFyaWVzLmNvbnRhaW5zS2V5KGZpbGVVcmkpKSB7CiAgICAgICAgeWllbGQgZmlsZVVyaTsKICAgICAgfQogICAgfQogIH0KfQo1AE5OPAEdASQyATQBKyUBIAEwATApGyoGARxBNTMpFCErFgoIBgEOSkAuPTssF0kXCAYEAgEucGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2xpYnJhcnlfZ3JhcGguZGFydEdzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydMAAiz0vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5zb3VyY2VfbGlicmFyeV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBMaWJyYXJ5LCBQcm9jZWR1cmVLaW5kOwoKaW1wb3J0ICcuLi8uLi9iYXNlL3Jlc29sdmVfcmVsYXRpdmVfdXJpLmRhcnQnIHNob3cgcmVzb2x2ZVJlbGF0aXZlVXJpOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL2J1aWxkZXIvYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIENsYXNzQnVpbGRlciwKICAgICAgICBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIsCiAgICAgICAgRGVjbGFyYXRpb24sCiAgICAgICAgRW51bUNvbnN0YW50SW5mbywKICAgICAgICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyLAogICAgICAgIEZ1bmN0aW9uVHlwZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTWVtYmVyQnVpbGRlciwKICAgICAgICBNZXRhZGF0YUJ1aWxkZXIsCiAgICAgICAgTmFtZUl0ZXJhdG9yLAogICAgICAgIFByZWZpeEJ1aWxkZXIsCiAgICAgICAgRnVuY3Rpb25CdWlsZGVyLAogICAgICAgIFF1YWxpZmllZE5hbWUsCiAgICAgICAgU2NvcGUsCiAgICAgICAgVHlwZUJ1aWxkZXIsCiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyLAogICAgICAgIFVucmVzb2x2ZWRUeXBlLAogICAgICAgIGZsYXR0ZW5OYW1lOwoKaW1wb3J0ICcuLi9jb21iaW5hdG9yLmRhcnQnIHNob3cgQ29tYmluYXRvcjsKCmltcG9ydCAnLi4vY29uZmlndXJhdGlvbi5kYXJ0JyBzaG93IENvbmZpZ3VyYXRpb247CgppbXBvcnQgJy4uL2V4cG9ydC5kYXJ0JyBzaG93IEV4cG9ydDsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICBNZXNzYWdlLAogICAgICAgIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWUsCiAgICAgICAgbWVzc2FnZUV4cGVjdGVkVXJpLAogICAgICAgIG1lc3NhZ2VNZW1iZXJXaXRoU2FtZU5hbWVBc0NsYXNzLAogICAgICAgIG1lc3NhZ2VQYXJ0RXhwb3J0LAogICAgICAgIG1lc3NhZ2VQYXJ0RXhwb3J0Q29udGV4dCwKICAgICAgICBtZXNzYWdlUGFydEluUGFydCwKICAgICAgICBtZXNzYWdlUGFydEluUGFydExpYnJhcnlDb250ZXh0LAogICAgICAgIG1lc3NhZ2VQYXJ0T2ZTZWxmLAogICAgICAgIG1lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXMsCiAgICAgICAgbWVzc2FnZVBhcnRPZlR3b0xpYnJhcmllc0NvbnRleHQsCiAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgdGVtcGxhdGVDb25mbGljdHNXaXRoTWVtYmVyLAogICAgICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aFNldHRlciwKICAgICAgICB0ZW1wbGF0ZUNvbnN0cnVjdG9yV2l0aFdyb25nTmFtZUNvbnRleHQsCiAgICAgICAgdGVtcGxhdGVDb3VsZE5vdFBhcnNlVXJpLAogICAgICAgIHRlbXBsYXRlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkLAogICAgICAgIHRlbXBsYXRlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2UsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24sCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZSwKICAgICAgICB0ZW1wbGF0ZU1pc3NpbmdQYXJ0T2YsCiAgICAgICAgdGVtcGxhdGVOb3RBUHJlZml4SW5UeXBlQW5ub3RhdGlvbiwKICAgICAgICB0ZW1wbGF0ZVBhcnRPZkluTGlicmFyeSwKICAgICAgICB0ZW1wbGF0ZVBhcnRPZkxpYnJhcnlOYW1lTWlzbWF0Y2gsCiAgICAgICAgdGVtcGxhdGVQYXJ0T2ZVcmlNaXNtYXRjaCwKICAgICAgICB0ZW1wbGF0ZVBhcnRPZlVzZVVyaSwKICAgICAgICB0ZW1wbGF0ZVBhcnRUd2ljZTsKCmltcG9ydCAnLi4vaW1wb3J0LmRhcnQnIHNob3cgSW1wb3J0OwoKaW1wb3J0ICcuLi9tb2RpZmllci5kYXJ0JyBzaG93IGNvbnN0TWFzaywgZmluYWxNYXNrOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuZXhwZWN0ZWQsIHVuaGFuZGxlZDsKCmltcG9ydCAnc291cmNlX2xvYWRlci5kYXJ0JyBzaG93IFNvdXJjZUxvYWRlcjsKCmFic3RyYWN0IGNsYXNzIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGV4dGVuZHMgTGlicmFyeUJ1aWxkZXIgewogIHN0YXRpYyBjb25zdCBTdHJpbmcgTUFMRk9STUVEX1VSSV9TQ0hFTUUgPSAib3JnLWRhcnRsYW5nLW1hbGZvcm1lZC11cmkiOwoKICBmaW5hbCBTb3VyY2VMb2FkZXIgbG9hZGVyOwoKICBmaW5hbCBEZWNsYXJhdGlvbkJ1aWxkZXIgbGlicmFyeURlY2xhcmF0aW9uOwoKICBmaW5hbCBMaXN0PENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlcj4gY29uc3RydWN0b3JSZWZlcmVuY2VzID0KICAgICAgPENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlcj5bXTsKCiAgZmluYWwgTGlzdDxTb3VyY2VMaWJyYXJ5QnVpbGRlcj4gcGFydHMgPSA8U291cmNlTGlicmFyeUJ1aWxkZXI+W107CgogIC8vIENhbiBJIHVzZSBsaWJyYXJ5LnBhcnRzIGluc3RlYWQ/IFNlZSBLZXJuZWxMaWJyYXJ5QnVpbGRlci5hZGRQYXJ0LgogIGZpbmFsIExpc3Q8aW50PiBwYXJ0T2Zmc2V0cyA9IDxpbnQ+W107CgogIGZpbmFsIExpc3Q8SW1wb3J0PiBpbXBvcnRzID0gPEltcG9ydD5bXTsKCiAgZmluYWwgTGlzdDxFeHBvcnQ+IGV4cG9ydHMgPSA8RXhwb3J0PltdOwoKICBmaW5hbCBTY29wZSBpbXBvcnRTY29wZTsKCiAgZmluYWwgVXJpIGZpbGVVcmk7CgogIGZpbmFsIExpc3Q8SW1wbGVtZW50YXRpb25JbmZvPiBpbXBsZW1lbnRhdGlvbkJ1aWxkZXJzID0KICAgICAgPEltcGxlbWVudGF0aW9uSW5mbz5bXTsKCiAgZmluYWwgTGlzdDxPYmplY3Q+IGFjY2Vzc29ycyA9IDxPYmplY3Q+W107CgogIGZpbmFsIGJvb2wgbGVnYWN5TW9kZTsKCiAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50OwoKICBTdHJpbmcgbmFtZTsKCiAgU3RyaW5nIHBhcnRPZk5hbWU7CgogIFVyaSBwYXJ0T2ZVcmk7CgogIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YTsKCiAgLy8vIFRoZSBjdXJyZW50IGRlY2xhcmF0aW9uIHRoYXQgaXMgYmVpbmcgYnVpbHQuIFdoZW4gd2Ugc3RhcnQgcGFyc2luZyBhCiAgLy8vIGRlY2xhcmF0aW9uIChjbGFzcywgbWV0aG9kLCBhbmQgc28gb24pLCB3ZSBkb24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbgogIC8vLyB0byBjcmVhdGUgYSBidWlsZGVyIGFuZCB0aGlzIG9iamVjdCByZWNvcmRzIGl0cyBtZW1iZXJzIGFuZCB0eXBlcyB1bnRpbCwKICAvLy8gZm9yIGV4YW1wbGUsIFthZGRDbGFzc10gaXMgY2FsbGVkLgogIERlY2xhcmF0aW9uQnVpbGRlciBjdXJyZW50RGVjbGFyYXRpb247CgogIGJvb2wgY2FuQWRkSW1wbGVtZW50YXRpb25CdWlsZGVycyA9IGZhbHNlOwoKICAvLy8gTm9uLW51bGwgaWYgdGhpcyBsaWJyYXJ5IGNhdXNlcyBhbiBlcnJvciB1cG9uIGFjY2VzcywgdGhhdCBpcywgdGhlcmUgd2FzCiAgLy8vIGFuIGVycm9yIHJlYWRpbmcgaXRzIHNvdXJjZS4KICBNZXNzYWdlIGFjY2Vzc1Byb2JsZW07CgogIFNvdXJjZUxpYnJhcnlCdWlsZGVyKFNvdXJjZUxvYWRlciBsb2FkZXIsIFVyaSBmaWxlVXJpLCBTY29wZSBzY29wZSkKICAgICAgOiB0aGlzLmZyb21TY29wZXMobG9hZGVyLCBmaWxlVXJpLCBuZXcgRGVjbGFyYXRpb25CdWlsZGVyLmxpYnJhcnkoKSwKICAgICAgICAgICAgc2NvcGUgPz8gbmV3IFNjb3BlLnRvcCgpKTsKCiAgU291cmNlTGlicmFyeUJ1aWxkZXIuZnJvbVNjb3BlcygKICAgICAgdGhpcy5sb2FkZXIsIHRoaXMuZmlsZVVyaSwgdGhpcy5saWJyYXJ5RGVjbGFyYXRpb24sIHRoaXMuaW1wb3J0U2NvcGUpCiAgICAgIDogY3VycmVudERlY2xhcmF0aW9uID0gbGlicmFyeURlY2xhcmF0aW9uLAogICAgICAgIGxlZ2FjeU1vZGUgPSBsb2FkZXIudGFyZ2V0LmxlZ2FjeU1vZGUsCiAgICAgICAgc3VwZXIoCiAgICAgICAgICAgIGZpbGVVcmksIGxpYnJhcnlEZWNsYXJhdGlvbi50b1Njb3BlKGltcG9ydFNjb3BlKSwgbmV3IFNjb3BlLnRvcCgpKTsKCiAgVXJpIGdldCB1cmk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUGFydCA9PiBwYXJ0T2ZOYW1lICE9IG51bGwgfHwgcGFydE9mVXJpICE9IG51bGw7CgogIExpc3Q8VW5yZXNvbHZlZFR5cGU+IGdldCB0eXBlcyA9PiBsaWJyYXJ5RGVjbGFyYXRpb24udHlwZXM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3ludGhldGljID0+IGFjY2Vzc1Byb2JsZW0gIT0gbnVsbDsKCiAgVHlwZUJ1aWxkZXIgYWRkTmFtZWRUeXBlKAogICAgICBPYmplY3QgbmFtZSwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzLCBpbnQgY2hhck9mZnNldCk7CgogIFR5cGVCdWlsZGVyIGFkZE1peGluQXBwbGljYXRpb24oCiAgICAgIFR5cGVCdWlsZGVyIHN1cGVydHlwZSwgTGlzdDxUeXBlQnVpbGRlcj4gbWl4aW5zLCBpbnQgY2hhck9mZnNldCk7CgogIFR5cGVCdWlsZGVyIGFkZFR5cGUoVHlwZUJ1aWxkZXIgdHlwZSwgaW50IGNoYXJPZmZzZXQpIHsKICAgIGN1cnJlbnREZWNsYXJhdGlvbi5hZGRUeXBlKG5ldyBVbnJlc29sdmVkVHlwZSh0eXBlLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKSk7CiAgICByZXR1cm4gdHlwZTsKICB9CgogIFR5cGVCdWlsZGVyIGFkZFZvaWRUeXBlKGludCBjaGFyT2Zmc2V0KTsKCiAgdm9pZCBzZXRMYW5ndWFnZVZlcnNpb24oaW50IG1ham9yLCBpbnQgbWlub3IpOwoKICBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIgYWRkQ29uc3RydWN0b3JSZWZlcmVuY2UoT2JqZWN0IG5hbWUsCiAgICAgIExpc3Q8VHlwZUJ1aWxkZXI+IHR5cGVBcmd1bWVudHMsIFN0cmluZyBzdWZmaXgsIGludCBjaGFyT2Zmc2V0KSB7CiAgICBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIgcmVmID0gbmV3IENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlcigKICAgICAgICBuYW1lLCB0eXBlQXJndW1lbnRzLCBzdWZmaXgsIHRoaXMsIGNoYXJPZmZzZXQpOwogICAgY29uc3RydWN0b3JSZWZlcmVuY2VzLmFkZChyZWYpOwogICAgcmV0dXJuIHJlZjsKICB9CgogIHZvaWQgYmVnaW5OZXN0ZWREZWNsYXJhdGlvbihTdHJpbmcgbmFtZSwge2Jvb2wgaGFzTWVtYmVyczogdHJ1ZX0pIHsKICAgIGN1cnJlbnREZWNsYXJhdGlvbiA9IGN1cnJlbnREZWNsYXJhdGlvbi5jcmVhdGVOZXN0ZWQobmFtZSwgaGFzTWVtYmVycyk7CiAgfQoKICBEZWNsYXJhdGlvbkJ1aWxkZXIgZW5kTmVzdGVkRGVjbGFyYXRpb24oU3RyaW5nIG5hbWUpIHsKICAgIGFzc2VydCgKICAgICAgICAobmFtZT8uc3RhcnRzV2l0aChjdXJyZW50RGVjbGFyYXRpb24ubmFtZSkgPz8KICAgICAgICAgICAgICAgIChuYW1lID09IGN1cnJlbnREZWNsYXJhdGlvbi5uYW1lKSkgfHwKICAgICAgICAgICAgY3VycmVudERlY2xhcmF0aW9uLm5hbWUgPT0gIm9wZXJhdG9yIiB8fAogICAgICAgICAgICBpZGVudGljYWwobmFtZSwgIjxzeW50YXgtZXJyb3I+IiksCiAgICAgICAgIiR7bmFtZX0gIT0gJHtjdXJyZW50RGVjbGFyYXRpb24ubmFtZX0iKTsKICAgIERlY2xhcmF0aW9uQnVpbGRlciBwcmV2aW91cyA9IGN1cnJlbnREZWNsYXJhdGlvbjsKICAgIGN1cnJlbnREZWNsYXJhdGlvbiA9IGN1cnJlbnREZWNsYXJhdGlvbi5wYXJlbnQ7CiAgICByZXR1cm4gcHJldmlvdXM7CiAgfQoKICBib29sIHVyaUlzVmFsaWQoVXJpIHVyaSkgPT4gdXJpLnNjaGVtZSAhPSBNQUxGT1JNRURfVVJJX1NDSEVNRTsKCiAgVXJpIHJlc29sdmUoVXJpIGJhc2VVcmksIFN0cmluZyB1cmksIGludCB1cmlPZmZzZXQsIHtpc1BhcnQ6IGZhbHNlfSkgewogICAgaWYgKHVyaSA9PSBudWxsKSB7CiAgICAgIGFkZFByb2JsZW0obWVzc2FnZUV4cGVjdGVkVXJpLCB1cmlPZmZzZXQsIG5vTGVuZ3RoLCB0aGlzLnVyaSk7CiAgICAgIHJldHVybiBuZXcgVXJpKHNjaGVtZTogTUFMRk9STUVEX1VSSV9TQ0hFTUUpOwogICAgfQogICAgVXJpIHBhcnNlZFVyaTsKICAgIHRyeSB7CiAgICAgIHBhcnNlZFVyaSA9IFVyaS5wYXJzZSh1cmkpOwogICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgLy8gUG9pbnQgdG8gcG9zaXRpb24gaW4gc3RyaW5nIGluZGljYXRlZCBieSB0aGUgZXhjZXB0aW9uLAogICAgICAvLyBvciB0byB0aGUgaW5pdGlhbCBxdW90ZSBpZiBubyBwb3NpdGlvbiBpcyBnaXZlbi4KICAgICAgLy8gKEFzc3VtZXMgdGhlIGRpcmVjdGl2ZSBpcyB1c2luZyBhIHNpbmdsZS1saW5lIHN0cmluZy4pCiAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVDb3VsZE5vdFBhcnNlVXJpLndpdGhBcmd1bWVudHModXJpLCBlLm1lc3NhZ2UpLAogICAgICAgICAgdXJpT2Zmc2V0ICsgMSArIChlLm9mZnNldCA/PyAtMSksIDEsIHRoaXMudXJpKTsKICAgICAgcmV0dXJuIG5ldyBVcmkoCiAgICAgICAgICBzY2hlbWU6IE1BTEZPUk1FRF9VUklfU0NIRU1FLCBxdWVyeTogVXJpLmVuY29kZVF1ZXJ5Q29tcG9uZW50KHVyaSkpOwogICAgfQogICAgaWYgKGlzUGFydCAmJiBiYXNlVXJpLnNjaGVtZSA9PSAiZGFydCIpIHsKICAgICAgLy8gUmVzb2x2ZSB1c2luZyBzcGVjaWFsIHJ1bGVzIGZvciBkYXJ0OiBVUklzCiAgICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVVcmkoYmFzZVVyaSwgcGFyc2VkVXJpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBiYXNlVXJpLnJlc29sdmVVcmkocGFyc2VkVXJpKTsKICAgIH0KICB9CgogIFN0cmluZyBjb21wdXRlQW5kVmFsaWRhdGVDb25zdHJ1Y3Rvck5hbWUoT2JqZWN0IG5hbWUsIGludCBjaGFyT2Zmc2V0LAogICAgICB7aXNGYWN0b3J5OiBmYWxzZX0pIHsKICAgIFN0cmluZyBjbGFzc05hbWUgPSBjdXJyZW50RGVjbGFyYXRpb24ubmFtZTsKICAgIFN0cmluZyBwcmVmaXg7CiAgICBTdHJpbmcgc3VmZml4OwogICAgaWYgKG5hbWUgaXMgUXVhbGlmaWVkTmFtZSkgewogICAgICBwcmVmaXggPSBuYW1lLnF1YWxpZmllcjsKICAgICAgc3VmZml4ID0gbmFtZS5uYW1lOwogICAgfSBlbHNlIHsKICAgICAgcHJlZml4ID0gbmFtZTsKICAgICAgc3VmZml4ID0gbnVsbDsKICAgIH0KICAgIGlmIChwcmVmaXggPT0gY2xhc3NOYW1lKSB7CiAgICAgIHJldHVybiBzdWZmaXggPz8gIiI7CiAgICB9CiAgICBpZiAoc3VmZml4ID09IG51bGwgJiYgIWlzRmFjdG9yeSkgewogICAgICAvLyBBIGxlZ2FsIG5hbWUgZm9yIGEgcmVndWxhciBtZXRob2QsIGJ1dCBub3QgZm9yIGEgY29uc3RydWN0b3IuCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGFkZFByb2JsZW0oCiAgICAgICAgbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFdyb25nTmFtZSwgY2hhck9mZnNldCwgcHJlZml4Lmxlbmd0aCwgZmlsZVVyaSwKICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICB0ZW1wbGF0ZUNvbnN0cnVjdG9yV2l0aFdyb25nTmFtZUNvbnRleHQKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhjdXJyZW50RGVjbGFyYXRpb24ubmFtZSkKICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgY3VycmVudERlY2xhcmF0aW9uLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGN1cnJlbnREZWNsYXJhdGlvbi5uYW1lLmxlbmd0aCkKICAgICAgICBdKTsKCiAgICByZXR1cm4gc3VmZml4OwogIH0KCiAgdm9pZCBhZGRFeHBvcnQoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIHVyaSwKICAgICAgTGlzdDxDb25maWd1cmF0aW9uPiBjb25maWd1cmF0aW9ucywKICAgICAgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9ycywKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCB1cmlPZmZzZXQpIHsKICAgIGlmIChjb25maWd1cmF0aW9ucyAhPSBudWxsKSB7CiAgICAgIGZvciAoQ29uZmlndXJhdGlvbiBjb25maWcgaW4gY29uZmlndXJhdGlvbnMpIHsKICAgICAgICBpZiAobG9va3VwSW1wb3J0Q29uZGl0aW9uKGNvbmZpZy5kb3R0ZWROYW1lKSA9PSBjb25maWcuY29uZGl0aW9uKSB7CiAgICAgICAgICB1cmkgPSBjb25maWcuaW1wb3J0VXJpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdmFyIGV4cG9ydGVkTGlicmFyeSA9IGxvYWRlcgogICAgICAgIC5yZWFkKHJlc29sdmUodGhpcy51cmksIHVyaSwgdXJpT2Zmc2V0KSwgY2hhck9mZnNldCwgYWNjZXNzb3I6IHRoaXMpOwogICAgZXhwb3J0ZWRMaWJyYXJ5LmFkZEV4cG9ydGVyKHRoaXMsIGNvbWJpbmF0b3JzLCBjaGFyT2Zmc2V0KTsKICAgIGV4cG9ydHMuYWRkKG5ldyBFeHBvcnQodGhpcywgZXhwb3J0ZWRMaWJyYXJ5LCBjb21iaW5hdG9ycywgY2hhck9mZnNldCkpOwogIH0KCiAgU3RyaW5nIGxvb2t1cEltcG9ydENvbmRpdGlvbihTdHJpbmcgZG90dGVkTmFtZSkgewogICAgY29uc3QgU3RyaW5nIHByZWZpeCA9ICJkYXJ0LmxpYnJhcnkuIjsKICAgIGlmICghZG90dGVkTmFtZS5zdGFydHNXaXRoKHByZWZpeCkpIHJldHVybiAiIjsKICAgIGRvdHRlZE5hbWUgPSBkb3R0ZWROYW1lLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKTsKICAgIGlmICghbG9hZGVyLnRhcmdldC51cmlUcmFuc2xhdG9yLmlzTGlicmFyeVN1cHBvcnRlZChkb3R0ZWROYW1lKSkgcmV0dXJuICIiOwoKICAgIExpYnJhcnlCdWlsZGVyIGltcG9ydGVkID0KICAgICAgICBsb2FkZXIuYnVpbGRlcnNbbmV3IFVyaShzY2hlbWU6ICJkYXJ0IiwgcGF0aDogZG90dGVkTmFtZSldOwoKICAgIGlmIChpbXBvcnRlZCA9PSBudWxsKSB7CiAgICAgIExpYnJhcnlCdWlsZGVyIGNvcmVMaWJyYXJ5ID0gbG9hZGVyLnJlYWQoCiAgICAgICAgICByZXNvbHZlKAogICAgICAgICAgICAgIHRoaXMudXJpLCBuZXcgVXJpKHNjaGVtZTogImRhcnQiLCBwYXRoOiAiY29yZSIpLnRvU3RyaW5nKCksIC0xKSwKICAgICAgICAgIC0xKTsKICAgICAgaW1wb3J0ZWQgPSBjb3JlTGlicmFyeQogICAgICAgICAgLmxvYWRlci5idWlsZGVyc1tuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiBkb3R0ZWROYW1lKV07CiAgICB9CiAgICByZXR1cm4gaW1wb3J0ZWQgIT0gbnVsbCA/ICJ0cnVlIiA6ICIiOwogIH0KCiAgdm9pZCBhZGRJbXBvcnQoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIHVyaSwKICAgICAgTGlzdDxDb25maWd1cmF0aW9uPiBjb25maWd1cmF0aW9ucywKICAgICAgU3RyaW5nIHByZWZpeCwKICAgICAgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9ycywKICAgICAgYm9vbCBkZWZlcnJlZCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBwcmVmaXhDaGFyT2Zmc2V0LAogICAgICBpbnQgdXJpT2Zmc2V0LAogICAgICBpbnQgaW1wb3J0SW5kZXgpIHsKICAgIGlmIChjb25maWd1cmF0aW9ucyAhPSBudWxsKSB7CiAgICAgIGZvciAoQ29uZmlndXJhdGlvbiBjb25maWcgaW4gY29uZmlndXJhdGlvbnMpIHsKICAgICAgICBpZiAobG9va3VwSW1wb3J0Q29uZGl0aW9uKGNvbmZpZy5kb3R0ZWROYW1lKSA9PSBjb25maWcuY29uZGl0aW9uKSB7CiAgICAgICAgICB1cmkgPSBjb25maWcuaW1wb3J0VXJpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgTGlicmFyeUJ1aWxkZXIgYnVpbGRlciA9IG51bGw7CgogICAgVXJpIHJlc29sdmVkVXJpOwogICAgU3RyaW5nIG5hdGl2ZVBhdGg7CiAgICBjb25zdCBTdHJpbmcgbmF0aXZlRXh0ZW5zaW9uU2NoZW1lID0gImRhcnQtZXh0OiI7CiAgICBpZiAodXJpLnN0YXJ0c1dpdGgobmF0aXZlRXh0ZW5zaW9uU2NoZW1lKSkgewogICAgICBTdHJpbmcgc3RyaXBwZWRVcmkgPSB1cmkuc3Vic3RyaW5nKG5hdGl2ZUV4dGVuc2lvblNjaGVtZS5sZW5ndGgpOwogICAgICBpZiAoc3RyaXBwZWRVcmkuc3RhcnRzV2l0aCgicGFja2FnZSIpKSB7CiAgICAgICAgcmVzb2x2ZWRVcmkgPSByZXNvbHZlKAogICAgICAgICAgICB0aGlzLnVyaSwgc3RyaXBwZWRVcmksIHVyaU9mZnNldCArIG5hdGl2ZUV4dGVuc2lvblNjaGVtZS5sZW5ndGgpOwogICAgICAgIHJlc29sdmVkVXJpID0gbG9hZGVyLnRhcmdldC50cmFuc2xhdGVVcmkocmVzb2x2ZWRVcmkpOwogICAgICAgIG5hdGl2ZVBhdGggPSByZXNvbHZlZFVyaS50b1N0cmluZygpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc29sdmVkVXJpID0gbmV3IFVyaShzY2hlbWU6ICJkYXJ0LWV4dCIsIHBhdGhTZWdtZW50czogW3VyaV0pOwogICAgICAgIG5hdGl2ZVBhdGggPSB1cmk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc29sdmVkVXJpID0gcmVzb2x2ZSh0aGlzLnVyaSwgdXJpLCB1cmlPZmZzZXQpOwogICAgICBidWlsZGVyID0gbG9hZGVyLnJlYWQocmVzb2x2ZWRVcmksIHVyaU9mZnNldCwgYWNjZXNzb3I6IHRoaXMpOwogICAgfQoKICAgIGltcG9ydHMuYWRkKG5ldyBJbXBvcnQodGhpcywgYnVpbGRlciwgZGVmZXJyZWQsIHByZWZpeCwgY29tYmluYXRvcnMsCiAgICAgICAgY29uZmlndXJhdGlvbnMsIGNoYXJPZmZzZXQsIHByZWZpeENoYXJPZmZzZXQsIGltcG9ydEluZGV4LAogICAgICAgIG5hdGl2ZUltcG9ydFBhdGg6IG5hdGl2ZVBhdGgpKTsKICB9CgogIHZvaWQgYWRkUGFydChMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsIFN0cmluZyB1cmksIGludCBjaGFyT2Zmc2V0KSB7CiAgICBVcmkgcmVzb2x2ZWRVcmk7CiAgICBVcmkgbmV3RmlsZVVyaTsKICAgIHJlc29sdmVkVXJpID0gcmVzb2x2ZSh0aGlzLnVyaSwgdXJpLCBjaGFyT2Zmc2V0LCBpc1BhcnQ6IHRydWUpOwogICAgbmV3RmlsZVVyaSA9IHJlc29sdmUoZmlsZVVyaSwgdXJpLCBjaGFyT2Zmc2V0KTsKICAgIHBhcnRzLmFkZChsb2FkZXIucmVhZChyZXNvbHZlZFVyaSwgY2hhck9mZnNldCwKICAgICAgICBmaWxlVXJpOiBuZXdGaWxlVXJpLCBhY2Nlc3NvcjogdGhpcykpOwogICAgcGFydE9mZnNldHMuYWRkKGNoYXJPZmZzZXQpOwogIH0KCiAgdm9pZCBhZGRQYXJ0T2YoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwgU3RyaW5nIG5hbWUsIFN0cmluZyB1cmksIGludCB1cmlPZmZzZXQpIHsKICAgIHBhcnRPZk5hbWUgPSBuYW1lOwogICAgaWYgKHVyaSAhPSBudWxsKSB7CiAgICAgIHBhcnRPZlVyaSA9IHJlc29sdmUodGhpcy51cmksIHVyaSwgdXJpT2Zmc2V0KTsKICAgICAgVXJpIG5ld0ZpbGVVcmkgPSByZXNvbHZlKGZpbGVVcmksIHVyaSwgdXJpT2Zmc2V0KTsKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGxvYWRlci5yZWFkKHBhcnRPZlVyaSwgdXJpT2Zmc2V0LAogICAgICAgICAgZmlsZVVyaTogbmV3RmlsZVVyaSwgYWNjZXNzb3I6IHRoaXMpOwogICAgICBpZiAobG9hZGVyLmZpcnN0ID09IHRoaXMpIHsKICAgICAgICAvLyBUaGlzIGlzIGEgcGFydCwgYW5kIGl0IHdhcyB0aGUgZmlyc3QgaW5wdXQuIExldCB0aGUgbG9hZGVyIGtub3cKICAgICAgICAvLyBhYm91dCB0aGF0LgogICAgICAgIGxvYWRlci5maXJzdCA9IGxpYnJhcnk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgYWRkQ2xhc3MoCiAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBpbnQgbW9kaWZpZXJzLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLAogICAgICBUeXBlQnVpbGRlciBzdXBlcnR5cGUsCiAgICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZXMsCiAgICAgIGludCBzdGFydE9mZnNldCwKICAgICAgaW50IG5hbWVPZmZzZXQsCiAgICAgIGludCBlbmRPZmZzZXQsCiAgICAgIGludCBzdXBlcnR5cGVPZmZzZXQpOwoKICB2b2lkIGFkZEV4dGVuc2lvbkRlY2xhcmF0aW9uKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgU3RyaW5nIGV4dGVuc2lvbk5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgVHlwZUJ1aWxkZXIgdHlwZSwKICAgICAgaW50IHN0YXJ0T2Zmc2V0LAogICAgICBpbnQgbmFtZU9mZnNldCwKICAgICAgaW50IGVuZE9mZnNldCk7CgogIHZvaWQgYWRkTmFtZWRNaXhpbkFwcGxpY2F0aW9uKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgVHlwZUJ1aWxkZXIgbWl4aW5BcHBsaWNhdGlvbiwKICAgICAgTGlzdDxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlcywKICAgICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0KTsKCiAgdm9pZCBhZGRGaWVsZCgKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFR5cGVCdWlsZGVyIHR5cGUsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICAgIFRva2VuIGluaXRpYWxpemVyVG9rZW4sCiAgICAgIGJvb2wgaGFzSW5pdGlhbGl6ZXIsCiAgICAgIHtUb2tlbiBjb25zdEluaXRpYWxpemVyVG9rZW59KTsKCiAgdm9pZCBhZGRGaWVsZHMoU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LCBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsIFR5cGVCdWlsZGVyIHR5cGUsIExpc3Q8RmllbGRJbmZvPiBmaWVsZEluZm9zKSB7CiAgICBmb3IgKEZpZWxkSW5mbyBpbmZvIGluIGZpZWxkSW5mb3MpIHsKICAgICAgYm9vbCBpc0NvbnN0ID0gbW9kaWZpZXJzICYgY29uc3RNYXNrICE9IDA7CiAgICAgIGJvb2wgaXNGaW5hbCA9IG1vZGlmaWVycyAmIGZpbmFsTWFzayAhPSAwOwogICAgICBib29sIHBvdGVudGlhbGx5TmVlZEluaXRpYWxpemVySW5PdXRsaW5lID0gaXNDb25zdCB8fCBpc0ZpbmFsOwogICAgICBUb2tlbiBzdGFydFRva2VuOwogICAgICBpZiAocG90ZW50aWFsbHlOZWVkSW5pdGlhbGl6ZXJJbk91dGxpbmUgfHwKICAgICAgICAgICh0eXBlID09IG51bGwgJiYgIWxlZ2FjeU1vZGUpKSB7CiAgICAgICAgc3RhcnRUb2tlbiA9IGluZm8uaW5pdGlhbGl6ZXJUb2tlbjsKICAgICAgfQogICAgICBpZiAoc3RhcnRUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgLy8gRXh0cmFjdCBvbmx5IHRoZSB0b2tlbnMgZm9yIHRoZSBpbml0aWFsaXplciBleHByZXNzaW9uIGZyb20gdGhlCiAgICAgICAgLy8gdG9rZW4gc3RyZWFtLgogICAgICAgIFRva2VuIGVuZFRva2VuID0gaW5mby5iZWZvcmVMYXN0OwogICAgICAgIGVuZFRva2VuLnNldE5leHQobmV3IFRva2VuLmVvZihlbmRUb2tlbi5uZXh0Lm9mZnNldCkpOwogICAgICAgIG5ldyBUb2tlbi5lb2Yoc3RhcnRUb2tlbi5wcmV2aW91cy5vZmZzZXQpLnNldE5leHQoc3RhcnRUb2tlbik7CiAgICAgIH0KICAgICAgYm9vbCBoYXNJbml0aWFsaXplciA9IGluZm8uaW5pdGlhbGl6ZXJUb2tlbiAhPSBudWxsOwogICAgICBhZGRGaWVsZChkb2N1bWVudGF0aW9uQ29tbWVudCwgbWV0YWRhdGEsIG1vZGlmaWVycywgdHlwZSwgaW5mby5uYW1lLAogICAgICAgICAgaW5mby5jaGFyT2Zmc2V0LCBpbmZvLmNoYXJFbmRPZmZzZXQsIHN0YXJ0VG9rZW4sIGhhc0luaXRpYWxpemVyLAogICAgICAgICAgY29uc3RJbml0aWFsaXplclRva2VuOgogICAgICAgICAgICAgIHBvdGVudGlhbGx5TmVlZEluaXRpYWxpemVySW5PdXRsaW5lID8gc3RhcnRUb2tlbiA6IG51bGwpOwogICAgfQogIH0KCiAgdm9pZCBhZGRDb25zdHJ1Y3RvcigKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFR5cGVCdWlsZGVyIHJldHVyblR5cGUsCiAgICAgIGZpbmFsIE9iamVjdCBuYW1lLAogICAgICBTdHJpbmcgY29uc3RydWN0b3JOYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscywKICAgICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT3BlblBhcmVuT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCwKICAgICAgU3RyaW5nIG5hdGl2ZU1ldGhvZE5hbWUsCiAgICAgIHtUb2tlbiBiZWdpbkluaXRpYWxpemVyc30pOwoKICB2b2lkIGFkZFByb2NlZHVyZSgKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFR5cGVCdWlsZGVyIHJldHVyblR5cGUsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscywKICAgICAgUHJvY2VkdXJlS2luZCBraW5kLAogICAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBTdHJpbmcgbmF0aXZlTWV0aG9kTmFtZSwKICAgICAge2Jvb2wgaXNUb3BMZXZlbH0pOwoKICB2b2lkIGFkZEVudW0oCiAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgTGlzdDxFbnVtQ29uc3RhbnRJbmZvPiBlbnVtQ29uc3RhbnRJbmZvcywKICAgICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0KTsKCiAgdm9pZCBhZGRGdW5jdGlvblR5cGVBbGlhcygKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIEZ1bmN0aW9uVHlwZUJ1aWxkZXIgdHlwZSwKICAgICAgaW50IGNoYXJPZmZzZXQpOwoKICBGdW5jdGlvblR5cGVCdWlsZGVyIGFkZEZ1bmN0aW9uVHlwZSgKICAgICAgVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSwKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLAogICAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGZvcm1hbHMsCiAgICAgIGludCBjaGFyT2Zmc2V0KTsKCiAgdm9pZCBhZGRGYWN0b3J5TWV0aG9kKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgT2JqZWN0IG5hbWUsCiAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscywKICAgICAgQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyIHJlZGlyZWN0aW9uVGFyZ2V0LAogICAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBTdHJpbmcgbmF0aXZlTWV0aG9kTmFtZSk7CgogIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgYWRkRm9ybWFsUGFyYW1ldGVyKAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFR5cGVCdWlsZGVyIHR5cGUsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBib29sIGhhc1RoaXMsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBUb2tlbiBpbml0aWFsaXplclRva2VuKTsKCiAgVHlwZVZhcmlhYmxlQnVpbGRlciBhZGRUeXBlVmFyaWFibGUoCiAgICAgIFN0cmluZyBuYW1lLCBUeXBlQnVpbGRlciBib3VuZCwgaW50IGNoYXJPZmZzZXQpOwoKICBEZWNsYXJhdGlvbiBhZGRCdWlsZGVyKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGNoYXJPZmZzZXQpIHsKICAgIC8vIFRPRE8oYWhlKTogU2V0IHRoZSBwYXJlbnQgY29ycmVjdGx5IGhlcmUuIENvdWxkIHRoZW4gY2hhbmdlIHRoZQogICAgLy8gaW1wbGVtZW50YXRpb24gb2YgTWVtYmVyQnVpbGRlci5pc1RvcExldmVsIHRvIHRlc3QgZXhwbGljaXRseSBmb3IgYQogICAgLy8gTGlicmFyeUJ1aWxkZXIuCiAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgIHVuaGFuZGxlZCgibnVsbCIsICJuYW1lIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CiAgICBpZiAoY3VycmVudERlY2xhcmF0aW9uID09IGxpYnJhcnlEZWNsYXJhdGlvbikgewogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgTWVtYmVyQnVpbGRlcikgewogICAgICAgIGRlY2xhcmF0aW9uLnBhcmVudCA9IHRoaXM7CiAgICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgVHlwZURlY2xhcmF0aW9uQnVpbGRlcikgewogICAgICAgIGRlY2xhcmF0aW9uLnBhcmVudCA9IHRoaXM7CiAgICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgUHJlZml4QnVpbGRlcikgewogICAgICAgIGFzc2VydChkZWNsYXJhdGlvbi5wYXJlbnQgPT0gdGhpcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHVuaGFuZGxlZCgKICAgICAgICAgICAgIiR7ZGVjbGFyYXRpb24ucnVudGltZVR5cGV9IiwgImFkZEJ1aWxkZXIiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGN1cnJlbnREZWNsYXJhdGlvbi5wYXJlbnQgPT0gbGlicmFyeURlY2xhcmF0aW9uKTsKICAgIH0KICAgIGJvb2wgaXNDb25zdHJ1Y3RvciA9IGRlY2xhcmF0aW9uIGlzIEZ1bmN0aW9uQnVpbGRlciAmJgogICAgICAgIChkZWNsYXJhdGlvbi5pc0NvbnN0cnVjdG9yIHx8IGRlY2xhcmF0aW9uLmlzRmFjdG9yeSk7CiAgICBpZiAoIWlzQ29uc3RydWN0b3IgJiYgbmFtZSA9PSBjdXJyZW50RGVjbGFyYXRpb24ubmFtZSkgewogICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgbWVzc2FnZU1lbWJlcldpdGhTYW1lTmFtZUFzQ2xhc3MsIGNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgIH0KICAgIE1hcDxTdHJpbmcsIERlY2xhcmF0aW9uPiBtZW1iZXJzID0gaXNDb25zdHJ1Y3RvcgogICAgICAgID8gY3VycmVudERlY2xhcmF0aW9uLmNvbnN0cnVjdG9ycwogICAgICAgIDogKGRlY2xhcmF0aW9uLmlzU2V0dGVyCiAgICAgICAgICAgID8gY3VycmVudERlY2xhcmF0aW9uLnNldHRlcnMKICAgICAgICAgICAgOiBjdXJyZW50RGVjbGFyYXRpb24ubWVtYmVycyk7CiAgICBEZWNsYXJhdGlvbiBleGlzdGluZyA9IG1lbWJlcnNbbmFtZV07CiAgICBpZiAoZGVjbGFyYXRpb24ubmV4dCAhPSBudWxsICYmIGRlY2xhcmF0aW9uLm5leHQgIT0gZXhpc3RpbmcpIHsKICAgICAgdW5leHBlY3RlZCgKICAgICAgICAgICIke2RlY2xhcmF0aW9uLm5leHQuZmlsZVVyaX1AJHtkZWNsYXJhdGlvbi5uZXh0LmNoYXJPZmZzZXR9IiwKICAgICAgICAgICIke2V4aXN0aW5nPy5maWxlVXJpfUAke2V4aXN0aW5nPy5jaGFyT2Zmc2V0fSIsCiAgICAgICAgICBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0LAogICAgICAgICAgZGVjbGFyYXRpb24uZmlsZVVyaSk7CiAgICB9CiAgICBkZWNsYXJhdGlvbi5uZXh0ID0gZXhpc3Rpbmc7CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgUHJlZml4QnVpbGRlciAmJiBleGlzdGluZyBpcyBQcmVmaXhCdWlsZGVyKSB7CiAgICAgIGFzc2VydChleGlzdGluZy5uZXh0IGlzISBQcmVmaXhCdWlsZGVyKTsKICAgICAgRGVjbGFyYXRpb24gZGVmZXJyZWQ7CiAgICAgIERlY2xhcmF0aW9uIG90aGVyOwogICAgICBpZiAoZGVjbGFyYXRpb24uZGVmZXJyZWQpIHsKICAgICAgICBkZWZlcnJlZCA9IGRlY2xhcmF0aW9uOwogICAgICAgIG90aGVyID0gZXhpc3Rpbmc7CiAgICAgIH0gZWxzZSBpZiAoZXhpc3RpbmcuZGVmZXJyZWQpIHsKICAgICAgICBkZWZlcnJlZCA9IGV4aXN0aW5nOwogICAgICAgIG90aGVyID0gZGVjbGFyYXRpb247CiAgICAgIH0KICAgICAgaWYgKGRlZmVycmVkICE9IG51bGwpIHsKICAgICAgICBhZGRQcm9ibGVtKHRlbXBsYXRlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICAgIGRlZmVycmVkLmNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpLAogICAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgdGVtcGxhdGVEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYXVzZQogICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhuYW1lKQogICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKGZpbGVVcmksIG90aGVyLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICBdKTsKICAgICAgfQogICAgICByZXR1cm4gZXhpc3RpbmcKICAgICAgICAuLmV4cG9ydFNjb3BlLm1lcmdlKGRlY2xhcmF0aW9uLmV4cG9ydFNjb3BlLAogICAgICAgICAgICAoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIGV4aXN0aW5nLCBEZWNsYXJhdGlvbiBtZW1iZXIpIHsKICAgICAgICAgIHJldHVybiBjb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb24oCiAgICAgICAgICAgICAgbmFtZSwgZXhpc3RpbmcsIG1lbWJlciwgY2hhck9mZnNldCk7CiAgICAgICAgfSk7CiAgICB9IGVsc2UgaWYgKGlzRHVwbGljYXRlZERlY2xhcmF0aW9uKGV4aXN0aW5nLCBkZWNsYXJhdGlvbikpIHsKICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gbmFtZTsKICAgICAgaWYgKGlzQ29uc3RydWN0b3IpIHsKICAgICAgICBpZiAobmFtZS5pc0VtcHR5KSB7CiAgICAgICAgICBmdWxsTmFtZSA9IGN1cnJlbnREZWNsYXJhdGlvbi5uYW1lOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmdWxsTmFtZSA9ICIke2N1cnJlbnREZWNsYXJhdGlvbi5uYW1lfS4kbmFtZSI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24ud2l0aEFyZ3VtZW50cyhmdWxsTmFtZSksCiAgICAgICAgICBjaGFyT2Zmc2V0LCBmdWxsTmFtZS5sZW5ndGgsIGRlY2xhcmF0aW9uLmZpbGVVcmksCiAgICAgICAgICBjb250ZXh0OiA8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmdWxsTmFtZSkKICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZmlsZVVyaSwgZXhpc3RpbmcuY2hhck9mZnNldCwgZnVsbE5hbWUubGVuZ3RoKQogICAgICAgICAgXSk7CiAgICB9CiAgICByZXR1cm4gbWVtYmVyc1tuYW1lXSA9IGRlY2xhcmF0aW9uOwogIH0KCiAgYm9vbCBpc0R1cGxpY2F0ZWREZWNsYXJhdGlvbihEZWNsYXJhdGlvbiBleGlzdGluZywgRGVjbGFyYXRpb24gb3RoZXIpIHsKICAgIGlmIChleGlzdGluZyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBEZWNsYXJhdGlvbiBuZXh0ID0gZXhpc3RpbmcubmV4dDsKICAgIGlmIChuZXh0ID09IG51bGwpIHsKICAgICAgaWYgKGV4aXN0aW5nLmlzR2V0dGVyICYmIG90aGVyLmlzU2V0dGVyKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChleGlzdGluZy5pc1NldHRlciAmJiBvdGhlci5pc0dldHRlcikgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgaWYgKG5leHQgaXMgQ2xhc3NCdWlsZGVyICYmICFuZXh0LmlzTWl4aW5BcHBsaWNhdGlvbikgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoZXhpc3RpbmcgaXMgQ2xhc3NCdWlsZGVyICYmIG90aGVyIGlzIENsYXNzQnVpbGRlcikgewogICAgICAvLyBXZSBhbGxvdyBtdWx0aXBsZSBtaXhpbiBhcHBsaWNhdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLiBBbgogICAgICAvLyBhbHRlcm5hdGl2ZSBpcyB0byBzaGFyZSB0aGVzZSBtaXhpbiBhcHBsaWNhdGlvbnMuIFRoaXMgc2l0dWF0aW9uIGNhbgogICAgICAvLyBoYXBwZW4gaWYgeW91IGhhdmUgYGNsYXNzIEEgZXh0ZW5kcyBPYmplY3Qgd2l0aCBNaXhpbiB7fWAgYW5kIGBjbGFzcyBCCiAgICAgIC8vIGV4dGVuZHMgT2JqZWN0IHdpdGggTWl4aW4ge31gIGluIHRoZSBzYW1lIGxpYnJhcnkuCiAgICAgIHJldHVybiAhZXhpc3RpbmcuaXNNaXhpbkFwcGxpY2F0aW9uIHx8ICFvdGhlci5pc01peGluQXBwbGljYXRpb247CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgYnVpbGRCdWlsZGVyKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBMaWJyYXJ5QnVpbGRlciBjb3JlTGlicmFyeSk7CgogIExpYnJhcnkgYnVpbGQoTGlicmFyeUJ1aWxkZXIgY29yZUxpYnJhcnkpIHsKICAgIGFzc2VydChpbXBsZW1lbnRhdGlvbkJ1aWxkZXJzLmlzRW1wdHkpOwogICAgY2FuQWRkSW1wbGVtZW50YXRpb25CdWlsZGVycyA9IHRydWU7CiAgICBJdGVyYXRvcjxEZWNsYXJhdGlvbj4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgYnVpbGRCdWlsZGVyKGl0ZXJhdG9yLmN1cnJlbnQsIGNvcmVMaWJyYXJ5KTsKICAgIH0KICAgIGZvciAoSW1wbGVtZW50YXRpb25JbmZvIGluZm8gaW4gaW1wbGVtZW50YXRpb25CdWlsZGVycykgewogICAgICBTdHJpbmcgbmFtZSA9IGluZm8ubmFtZTsKICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBpbmZvLmRlY2xhcmF0aW9uOwogICAgICBpbnQgY2hhck9mZnNldCA9IGluZm8uY2hhck9mZnNldDsKICAgICAgYWRkQnVpbGRlcihuYW1lLCBkZWNsYXJhdGlvbiwgY2hhck9mZnNldCk7CiAgICAgIGJ1aWxkQnVpbGRlcihkZWNsYXJhdGlvbiwgY29yZUxpYnJhcnkpOwogICAgfQogICAgY2FuQWRkSW1wbGVtZW50YXRpb25CdWlsZGVycyA9IGZhbHNlOwoKICAgIHNjb3BlLnNldHRlcnMuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIHNldHRlcikgewogICAgICBEZWNsYXJhdGlvbiBtZW1iZXIgPSBzY29wZUJ1aWxkZXJbbmFtZV07CiAgICAgIGlmIChtZW1iZXIgPT0gbnVsbCB8fAogICAgICAgICAgIW1lbWJlci5pc0ZpZWxkIHx8CiAgICAgICAgICBtZW1iZXIuaXNGaW5hbCB8fAogICAgICAgICAgbWVtYmVyLmlzQ29uc3QpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXIud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIHNldHRlci5jaGFyT2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICAgIC8vIFRPRE8oYWhlKTogQ29udGV4dCB0byBwcmV2aW91cyBtZXNzYWdlPwogICAgICBhZGRQcm9ibGVtKHRlbXBsYXRlQ29uZmxpY3RzV2l0aFNldHRlci53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgbWVtYmVyLmNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgIH0pOwoKICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIFVzZWQgdG8gYWRkIGltcGxlbWVudGF0aW9uIGJ1aWxkZXIgZHVyaW5nIHRoZSBjYWxsIHRvIFtidWlsZF0gYWJvdmUuCiAgLy8vIEN1cnJlbnRseSwgb25seSBhbm9ueW1vdXMgbWl4aW5zIGFyZSB1c2luZyBpbXBsZW1lbnRhdGlvbiBidWlsZGVycyAoc2VlCiAgLy8vIFtNaXhpbkFwcGxpY2F0aW9uQnVpbGRlcl0KICAvLy8gKC4uL2tlcm5lbC9rZXJuZWxfbWl4aW5fYXBwbGljYXRpb25fYnVpbGRlci5kYXJ0KSkuCiAgdm9pZCBhZGRJbXBsZW1lbnRhdGlvbkJ1aWxkZXIoCiAgICAgIFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGNoYXJPZmZzZXQpIHsKICAgIGFzc2VydChjYW5BZGRJbXBsZW1lbnRhdGlvbkJ1aWxkZXJzLCAiJHVyaSIpOwogICAgaW1wbGVtZW50YXRpb25CdWlsZGVycwogICAgICAgIC5hZGQobmV3IEltcGxlbWVudGF0aW9uSW5mbyhuYW1lLCBkZWNsYXJhdGlvbiwgY2hhck9mZnNldCkpOwogIH0KCiAgdm9pZCB2YWxpZGF0ZVBhcnQoU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgU2V0PFVyaT4gdXNlZFBhcnRzKSB7CiAgICBpZiAobGlicmFyeSAhPSBudWxsICYmIHBhcnRzLmlzTm90RW1wdHkpIHsKICAgICAgLy8gSWYgW2xpYnJhcnldIGlzIG51bGwsIHdlIGhhdmUgYWxyZWFkeSByZXBvcnRlZCBhIHByb2JsZW0gdGhhdCB0aGlzCiAgICAgIC8vIHBhcnQgaXMgb3JwaGFuZWQuCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQgPSA8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgIG1lc3NhZ2VQYXJ0SW5QYXJ0TGlicmFyeUNvbnRleHQud2l0aExvY2F0aW9uKGxpYnJhcnkuZmlsZVVyaSwgLTEsIDEpLAogICAgICBdOwogICAgICBmb3IgKGludCBvZmZzZXQgaW4gcGFydE9mZnNldHMpIHsKICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VQYXJ0SW5QYXJ0LCBvZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpLAogICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgfQogICAgICBmb3IgKFNvdXJjZUxpYnJhcnlCdWlsZGVyIHBhcnQgaW4gcGFydHMpIHsKICAgICAgICAvLyBNYXJrIHRoaXMgcGFydCBhcyB1c2VkIHNvIHdlIGRvbid0IHJlcG9ydCBpdCBhcyBvcnBoYW5lZC4KICAgICAgICB1c2VkUGFydHMuYWRkKHBhcnQudXJpKTsKICAgICAgfQogICAgfQogICAgcGFydHMuY2xlYXIoKTsKICAgIGlmIChleHBvcnRlcnMuaXNOb3RFbXB0eSkgewogICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0ID0gPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICBtZXNzYWdlUGFydEV4cG9ydENvbnRleHQud2l0aExvY2F0aW9uKGZpbGVVcmksIC0xLCAxKSwKICAgICAgXTsKICAgICAgZm9yIChFeHBvcnQgZXhwb3J0IGluIGV4cG9ydGVycykgewogICAgICAgIGV4cG9ydC5leHBvcnRlci5hZGRQcm9ibGVtKAogICAgICAgICAgICBtZXNzYWdlUGFydEV4cG9ydCwgZXhwb3J0LmNoYXJPZmZzZXQsICJleHBvcnQiLmxlbmd0aCwgbnVsbCwKICAgICAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgaW5jbHVkZVBhcnRzKFNldDxVcmk+IHVzZWRQYXJ0cykgewogICAgU2V0PFVyaT4gc2VlblBhcnRzID0gbmV3IFNldDxVcmk+KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgaW50IHBhcnRPZmZzZXQgPSBwYXJ0T2Zmc2V0c1tpXTsKICAgICAgaWYgKHBhcnQgPT0gdGhpcykgewogICAgICAgIGFkZFByb2JsZW0obWVzc2FnZVBhcnRPZlNlbGYsIC0xLCBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICAgIH0gZWxzZSBpZiAoc2VlblBhcnRzLmFkZChwYXJ0LmZpbGVVcmkpKSB7CiAgICAgICAgaWYgKHBhcnQucGFydE9mTGlicmFyeSAhPSBudWxsKSB7CiAgICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXMsIC0xLCBub0xlbmd0aCwgcGFydC5maWxlVXJpLAogICAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXNDb250ZXh0LndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICBwYXJ0LnBhcnRPZkxpYnJhcnkuZmlsZVVyaSwgLTEsIG5vTGVuZ3RoKSwKICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXNDb250ZXh0LndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVVcmksIC0xLCBub0xlbmd0aCkKICAgICAgICAgICAgICBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGlzUGF0Y2gpIHsKICAgICAgICAgICAgdXNlZFBhcnRzLmFkZChwYXJ0LmZpbGVVcmkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdXNlZFBhcnRzLmFkZChwYXJ0LnVyaSk7CiAgICAgICAgICB9CiAgICAgICAgICBpbmNsdWRlUGFydChwYXJ0LCB1c2VkUGFydHMsIHBhcnRPZmZzZXQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBhZGRQcm9ibGVtKHRlbXBsYXRlUGFydFR3aWNlLndpdGhBcmd1bWVudHMocGFydC5maWxlVXJpKSwgLTEsIG5vTGVuZ3RoLAogICAgICAgICAgICBmaWxlVXJpKTsKICAgICAgfQogICAgfQogIH0KCiAgYm9vbCBpbmNsdWRlUGFydCgKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgcGFydCwgU2V0PFVyaT4gdXNlZFBhcnRzLCBpbnQgcGFydE9mZnNldCkgewogICAgaWYgKHBhcnQucGFydE9mVXJpICE9IG51bGwpIHsKICAgICAgaWYgKHVyaUlzVmFsaWQocGFydC5wYXJ0T2ZVcmkpICYmIHBhcnQucGFydE9mVXJpICE9IHVyaSkgewogICAgICAgIC8vIFRoaXMgaXMgYW4gZXJyb3IsIGJ1dCB0aGUgcGFydCBpcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIHBhcnRzLAogICAgICAgIC8vIHNvIHRoYXQgbWV0YWRhdGEgYW5ub3RhdGlvbnMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBpdC4KICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZVBhcnRPZlVyaU1pc21hdGNoLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBwYXJ0LmZpbGVVcmksIHVyaSwgcGFydC5wYXJ0T2ZVcmkpLAogICAgICAgICAgICBwYXJ0T2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgZmlsZVVyaSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBhcnQucGFydE9mTmFtZSAhPSBudWxsKSB7CiAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKICAgICAgICBpZiAocGFydC5wYXJ0T2ZOYW1lICE9IG5hbWUpIHsKICAgICAgICAgIC8vIFRoaXMgaXMgYW4gZXJyb3IsIGJ1dCB0aGUgcGFydCBpcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mCiAgICAgICAgICAvLyBwYXJ0cywgc28gdGhhdCBtZXRhZGF0YSBhbm5vdGF0aW9ucyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGl0LgogICAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcnRPZkxpYnJhcnlOYW1lTWlzbWF0Y2gud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgcGFydC5maWxlVXJpLCBuYW1lLCBwYXJ0LnBhcnRPZk5hbWUpLAogICAgICAgICAgICAgIHBhcnRPZmZzZXQsCiAgICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgICAgZmlsZVVyaSk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoaXMgaXMgYW4gZXJyb3IsIGJ1dCB0aGUgcGFydCBpcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIHBhcnRzLAogICAgICAgIC8vIHNvIHRoYXQgbWV0YWRhdGEgYW5ub3RhdGlvbnMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBpdC4KICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZVBhcnRPZlVzZVVyaS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgcGFydC5maWxlVXJpLCBmaWxlVXJpLCBwYXJ0LnBhcnRPZk5hbWUpLAogICAgICAgICAgICBwYXJ0T2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgZmlsZVVyaSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBUaGlzIGlzIGFuIGVycm9yLCBidXQgdGhlIHBhcnQgaXMgbm90IHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBwYXJ0cywKICAgICAgLy8gc28gdGhhdCBtZXRhZGF0YSBhbm5vdGF0aW9ucyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGl0LgogICAgICBhc3NlcnQoIXBhcnQuaXNQYXJ0KTsKICAgICAgaWYgKHVyaUlzVmFsaWQocGFydC5maWxlVXJpKSkgewogICAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVNaXNzaW5nUGFydE9mLndpdGhBcmd1bWVudHMocGFydC5maWxlVXJpKSwKICAgICAgICAgICAgcGFydE9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmkpOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHBhcnQudmFsaWRhdGVQYXJ0KHRoaXMsIHVzZWRQYXJ0cyk7CiAgICBOYW1lSXRlcmF0b3IgcGFydERlY2xhcmF0aW9ucyA9IHBhcnQubmFtZUl0ZXJhdG9yOwogICAgd2hpbGUgKHBhcnREZWNsYXJhdGlvbnMubW92ZU5leHQoKSkgewogICAgICBTdHJpbmcgbmFtZSA9IHBhcnREZWNsYXJhdGlvbnMubmFtZTsKICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBwYXJ0RGVjbGFyYXRpb25zLmN1cnJlbnQ7CgogICAgICBpZiAoZGVjbGFyYXRpb24ubmV4dCAhPSBudWxsKSB7CiAgICAgICAgTGlzdDxEZWNsYXJhdGlvbj4gZHVwbGljYXRlZCA9IDxEZWNsYXJhdGlvbj5bXTsKICAgICAgICB3aGlsZSAoZGVjbGFyYXRpb24ubmV4dCAhPSBudWxsKSB7CiAgICAgICAgICBkdXBsaWNhdGVkLmFkZChkZWNsYXJhdGlvbik7CiAgICAgICAgICBwYXJ0RGVjbGFyYXRpb25zLm1vdmVOZXh0KCk7CiAgICAgICAgICBkZWNsYXJhdGlvbiA9IHBhcnREZWNsYXJhdGlvbnMuY3VycmVudDsKICAgICAgICB9CiAgICAgICAgZHVwbGljYXRlZC5hZGQoZGVjbGFyYXRpb24pOwogICAgICAgIC8vIEhhbmRsZSBkdXBsaWNhdGVkIGRlY2xhcmF0aW9ucyBpbiB0aGUgcGFydC4KICAgICAgICAvLwogICAgICAgIC8vIER1cGxpY2F0ZWQgZGVjbGFyYXRpb25zIGFyZSBoYW5kbGVkIGJ5IGNyZWF0aW5nIGEgbGlua2VkIGxpc3QgdXNpbmcKICAgICAgICAvLyB0aGUgYG5leHRgIGZpZWxkLiBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIG1ha2luZyBhbGwgc2NvcGUgZW50cmllcyBiZQogICAgICAgIC8vIGEgYExpc3Q8RGVjbGFyYXRpb24+YC4KICAgICAgICAvLwogICAgICAgIC8vIFdlIG1haW50YWluIHRoZSBsaW5rZWQgbGlzdCBzbyB0aGF0IHRoZSBsYXN0IGVudHJ5IGlzIGVhc3kgdG8KICAgICAgICAvLyByZWNvZ25pemUgKGl0J3MgYG5leHRgIGZpZWxkIGlzIG51bGwpLiBUaGlzIG1lYW5zIHRoYXQgaXQgaXMKICAgICAgICAvLyByZXZlcnNlZCB3aXRoIHJlc3BlY3QgdG8gc291cmNlIGNvZGUgb3JkZXIuIFNpbmNlIGtlcm5lbCBkb2Vzbid0CiAgICAgICAgLy8gYWxsb3cgZHVwbGljYXRlZCBkZWNsYXJhdGlvbnMsIHdlIGVuc3VyZSB0aGF0IHdlIG9ubHkgYWRkIHRoZSBmaXJzdAogICAgICAgIC8vIGRlY2xhcmF0aW9uIHRvIHRoZSBrZXJuZWwgdHJlZS4KICAgICAgICAvLwogICAgICAgIC8vIFNpbmNlIHRoZSBkdXBsaWNhdGVkIGRlY2xhcmF0aW9ucyBhcmUgc3RvcmVkIGluIHJldmVyc2Ugb3JkZXIsIHdlCiAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZW0gaW4gcmV2ZXJzZSBvcmRlciBhcyB0aGlzIGlzIHNpbXBsZXIgYW5kIG5vcm1hbGx5CiAgICAgICAgLy8gbm90IGEgcHJvYmxlbS4gSG93ZXZlciwgaW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gY2FsbCBbYWRkQnVpbGRlcl0gaW4KICAgICAgICAvLyBzb3VyY2Ugb3JkZXIgYXMgaXQgd291bGQgb3RoZXJ3aXNlIGNyZWF0ZSBjeWNsZXMuCiAgICAgICAgLy8KICAgICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gYmUgY2FyZWZ1bCBwcmVzZXJ2aW5nIHRoZSBvcmRlciBvZiB0aGUgbGlua3MuIFRoZQogICAgICAgIC8vIHBhcnQgbGlicmFyeSBzdGlsbCBrZWVwcyB0aGVzZSBkZWNsYXJhdGlvbnMgaW4gaXRzIHNjb3BlIHNvIHRoYXQKICAgICAgICAvLyBEaWV0TGlzdGVuZXIgY2FuIGZpbmQgdGhlbS4KICAgICAgICBmb3IgKGludCBpID0gZHVwbGljYXRlZC5sZW5ndGg7IGkgPiAwOyBpLS0pIHsKICAgICAgICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gZHVwbGljYXRlZFtpIC0gMV07CiAgICAgICAgICBhZGRCdWlsZGVyKG5hbWUsIGRlY2xhcmF0aW9uLCBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWRkQnVpbGRlcihuYW1lLCBkZWNsYXJhdGlvbiwgZGVjbGFyYXRpb24uY2hhck9mZnNldCk7CiAgICAgIH0KICAgIH0KICAgIHR5cGVzLmFkZEFsbChwYXJ0LnR5cGVzKTsKICAgIGNvbnN0cnVjdG9yUmVmZXJlbmNlcy5hZGRBbGwocGFydC5jb25zdHJ1Y3RvclJlZmVyZW5jZXMpOwogICAgcGFydC5wYXJ0T2ZMaWJyYXJ5ID0gdGhpczsKICAgIHBhcnQuc2NvcGUuYmVjb21lUGFydE9mKHNjb3BlKTsKICAgIC8vIFRPRE8oYWhlKTogSW5jbHVkZSBtZXRhZGF0YSBmcm9tIHBhcnQ/CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgYnVpbGRJbml0aWFsU2NvcGVzKCkgewogICAgTmFtZUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZUl0ZXJhdG9yOwogICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgYWRkVG9FeHBvcnRTY29wZShpdGVyYXRvci5uYW1lLCBpdGVyYXRvci5jdXJyZW50KTsKICAgIH0KICB9CgogIHZvaWQgYWRkSW1wb3J0c1RvU2NvcGUoKSB7CiAgICBib29sIGV4cGxpY2l0Q29yZUltcG9ydCA9IHRoaXMgPT0gbG9hZGVyLmNvcmVMaWJyYXJ5OwogICAgZm9yIChJbXBvcnQgaW1wb3J0IGluIGltcG9ydHMpIHsKICAgICAgaWYgKGltcG9ydC5pbXBvcnRlZCA9PSBsb2FkZXIuY29yZUxpYnJhcnkpIHsKICAgICAgICBleHBsaWNpdENvcmVJbXBvcnQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChpbXBvcnQuaW1wb3J0ZWQ/LmlzUGFydCA/PyBmYWxzZSkgewogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlUGFydE9mSW5MaWJyYXJ5LndpdGhBcmd1bWVudHMoaW1wb3J0LmltcG9ydGVkLmZpbGVVcmkpLAogICAgICAgICAgICBpbXBvcnQuY2hhck9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgIGZpbGVVcmkpOwogICAgICB9CiAgICAgIGltcG9ydC5maW5hbGl6ZUltcG9ydHModGhpcyk7CiAgICB9CiAgICBpZiAoIWV4cGxpY2l0Q29yZUltcG9ydCkgewogICAgICBsb2FkZXIuY29yZUxpYnJhcnkuZXhwb3J0U2NvcGUuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgICAgIGFkZFRvU2NvcGUobmFtZSwgbWVtYmVyLCAtMSwgdHJ1ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRUb1Njb3BlKAogICAgICBTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gbWVtYmVyLCBpbnQgY2hhck9mZnNldCwgYm9vbCBpc0ltcG9ydCkgewogICAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IG1hcCA9CiAgICAgICAgbWVtYmVyLmlzU2V0dGVyID8gaW1wb3J0U2NvcGUuc2V0dGVycyA6IGltcG9ydFNjb3BlLmxvY2FsOwogICAgRGVjbGFyYXRpb24gZXhpc3RpbmcgPSBtYXBbbmFtZV07CiAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewogICAgICBpZiAoZXhpc3RpbmcgIT0gbWVtYmVyKSB7CiAgICAgICAgbWFwW25hbWVdID0gY29tcHV0ZUFtYmlndW91c0RlY2xhcmF0aW9uKAogICAgICAgICAgICBuYW1lLCBleGlzdGluZywgbWVtYmVyLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICBpc0ltcG9ydDogaXNJbXBvcnQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBtYXBbbmFtZV0gPSBtZW1iZXI7CiAgICB9CiAgfQoKICAvLy8gUmVzb2x2ZXMgYWxsIHVucmVzb2x2ZWQgdHlwZXMgaW4gW3R5cGVzXS4gVGhlIGxpc3Qgb2YgdHlwZXMgaXMgY2xlYXJlZAogIC8vLyB3aGVuIGRvbmUuCiAgaW50IHJlc29sdmVUeXBlcygpIHsKICAgIGludCB0eXBlQ291bnQgPSB0eXBlcy5sZW5ndGg7CiAgICBmb3IgKFVucmVzb2x2ZWRUeXBlIHQgaW4gdHlwZXMpIHsKICAgICAgdC5yZXNvbHZlSW4oc2NvcGUsIHRoaXMpOwogICAgICBpZiAoIWxvYWRlci50YXJnZXQubGVnYWN5TW9kZSkgewogICAgICAgIHQuY2hlY2tUeXBlKHRoaXMpOwogICAgICB9IGVsc2UgewogICAgICAgIHQubm9ybWFsaXplVHlwZSgpOwogICAgICB9CiAgICB9CiAgICB0eXBlcy5jbGVhcigpOwogICAgcmV0dXJuIHR5cGVDb3VudDsKICB9CgogIEBvdmVycmlkZQogIGludCByZXNvbHZlQ29uc3RydWN0b3JzKF8pIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBJdGVyYXRvcjxEZWNsYXJhdGlvbj4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgY291bnQgKz0gaXRlcmF0b3IuY3VycmVudC5yZXNvbHZlQ29uc3RydWN0b3JzKHRoaXMpOwogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiBjb3B5VHlwZVZhcmlhYmxlcygKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiBvcmlnaW5hbCwgRGVjbGFyYXRpb25CdWlsZGVyIGRlY2xhcmF0aW9uKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBmdWxsTmFtZUZvckVycm9ycyB7CiAgICAvLyBUT0RPKGFoZSk6IENvbnNpZGVyIGlmIHdlIHNob3VsZCB1c2UgcmVsYXRpdml6ZVVyaSBoZXJlLiBUaGUgZG93bnNpZGUgdG8KICAgIC8vIGRvaW5nIHRoYXQgaXMgdGhhdCB0aGlzIFVSSSBtYXkgYmUgdXNlZCBpbiBhbiBlcnJvciBtZXNzYWdlLiBJZGVhbGx5LCB3ZQogICAgLy8gc2hvdWxkIGNyZWF0ZSBhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBxdWFsaWZpZWQgbmFtZXMgdGhhdCB3ZSBjYW4KICAgIC8vIHJlbGF0aXZpemUgd2hlbiBwcmludGluZyBhIG1lc3NhZ2UsIGJ1dCBzdGlsbCBzdG9yZSB0aGUgZnVsbCBVUkkgaW4KICAgIC8vIC5kaWxsIGZpbGVzLgogICAgcmV0dXJuIG5hbWUgPz8gIjxsaWJyYXJ5ICckZmlsZVVyaSc+IjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVjb3JkQWNjZXNzKGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLCBVcmkgZmlsZVVyaSkgewogICAgYWNjZXNzb3JzLmFkZChmaWxlVXJpKTsKICAgIGFjY2Vzc29ycy5hZGQoY2hhck9mZnNldCk7CiAgICBhY2Nlc3NvcnMuYWRkKGxlbmd0aCk7CiAgICBpZiAoYWNjZXNzUHJvYmxlbSAhPSBudWxsKSB7CiAgICAgIGFkZFByb2JsZW0oYWNjZXNzUHJvYmxlbSwgY2hhck9mZnNldCwgbGVuZ3RoLCBmaWxlVXJpKTsKICAgIH0KICB9CgogIHZvaWQgYWRkUHJvYmxlbUF0QWNjZXNzb3JzKE1lc3NhZ2UgbWVzc2FnZSkgewogICAgaWYgKGFjY2Vzc1Byb2JsZW0gPT0gbnVsbCkgewogICAgICBpZiAoYWNjZXNzb3JzLmlzRW1wdHkgJiYgdGhpcyA9PSBsb2FkZXIuZmlyc3QpIHsKICAgICAgICAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBsaWJyYXJ5LCBhbmQgbm9ib2R5IGFjY2VzcyBpdCBkaXJlY3RseS4gU28KICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlcG9ydCBhIHByb2JsZW0uCiAgICAgICAgbG9hZGVyLmFkZFByb2JsZW0obWVzc2FnZSwgLTEsIDEsIG51bGwpOwogICAgICB9CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWNjZXNzb3JzLmxlbmd0aDsgaSArPSAzKSB7CiAgICAgICAgVXJpIGFjY2Vzc29yID0gYWNjZXNzb3JzW2ldOwogICAgICAgIGludCBjaGFyT2Zmc2V0ID0gYWNjZXNzb3JzW2kgKyAxXTsKICAgICAgICBpbnQgbGVuZ3RoID0gYWNjZXNzb3JzW2kgKyAyXTsKICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwgYWNjZXNzb3IpOwogICAgICB9CiAgICAgIGFjY2Vzc1Byb2JsZW0gPSBtZXNzYWdlOwogICAgfQogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luT3V0bGluZShjb3ZhcmlhbnQgdHlwZUVudmlyb25tZW50KTsKCiAgaW50IGZpbmFsaXplSW5pdGlhbGl6aW5nRm9ybWFscygpOwp9CgovLy8gVW5saWtlIFtTY29wZV0sIHRoaXMgc2NvcGUgaXMgdXNlZCBkdXJpbmcgY29uc3RydWN0aW9uIG9mIGJ1aWxkZXJzIHRvCi8vLyBlbnN1cmUgdHlwZXMgYW5kIG1lbWJlcnMgYXJlIGFkZGVkIHRvIGFuZCByZXNvbHZlZCBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbi4KY2xhc3MgRGVjbGFyYXRpb25CdWlsZGVyIHsKICBmaW5hbCBEZWNsYXJhdGlvbkJ1aWxkZXIgcGFyZW50OwoKICBmaW5hbCBNYXA8U3RyaW5nLCBEZWNsYXJhdGlvbj4gbWVtYmVyczsKCiAgZmluYWwgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IGNvbnN0cnVjdG9yczsKCiAgZmluYWwgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IHNldHRlcnM7CgogIGZpbmFsIExpc3Q8VW5yZXNvbHZlZFR5cGU+IHR5cGVzID0gPFVucmVzb2x2ZWRUeXBlPltdOwoKICBTdHJpbmcgbmFtZTsKCiAgLy8gT2Zmc2V0IG9mIG5hbWUgdG9rZW4sIHVwZGF0ZWQgYnkgdGhlIG91dGxpbmUgYnVpbGRlciBhbG9uZwogIC8vIHdpdGggdGhlIG5hbWUgYXMgdGhlIGN1cnJlbnQgZGVjbGFyYXRpb24gY2hhbmdlcy4KICBpbnQgY2hhck9mZnNldDsKCiAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzOwoKICBib29sIGhhc0NvbnN0Q29uc3RydWN0b3IgPSBmYWxzZTsKCiAgRGVjbGFyYXRpb25CdWlsZGVyKHRoaXMubWVtYmVycywgdGhpcy5zZXR0ZXJzLCB0aGlzLmNvbnN0cnVjdG9ycywgdGhpcy5uYW1lLAogICAgICB0aGlzLmNoYXJPZmZzZXQsIHRoaXMucGFyZW50KSB7CiAgICBhc3NlcnQobmFtZSAhPSBudWxsKTsKICB9CgogIERlY2xhcmF0aW9uQnVpbGRlci5saWJyYXJ5KCkKICAgICAgOiB0aGlzKDxTdHJpbmcsIERlY2xhcmF0aW9uPnt9LCA8U3RyaW5nLCBEZWNsYXJhdGlvbj57fSwgbnVsbCwKICAgICAgICAgICAgIjxsaWJyYXJ5PiIsIC0xLCBudWxsKTsKCiAgRGVjbGFyYXRpb25CdWlsZGVyIGNyZWF0ZU5lc3RlZChTdHJpbmcgbmFtZSwgYm9vbCBoYXNNZW1iZXJzKSB7CiAgICByZXR1cm4gbmV3IERlY2xhcmF0aW9uQnVpbGRlcigKICAgICAgICBoYXNNZW1iZXJzID8gPFN0cmluZywgTWVtYmVyQnVpbGRlcj57fSA6IG51bGwsCiAgICAgICAgaGFzTWVtYmVycyA/IDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e30gOiBudWxsLAogICAgICAgIGhhc01lbWJlcnMgPyA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPnt9IDogbnVsbCwKICAgICAgICBuYW1lLAogICAgICAgIC0xLAogICAgICAgIHRoaXMpOwogIH0KCiAgdm9pZCBhZGRUeXBlKFVucmVzb2x2ZWRUeXBlIHR5cGUpIHsKICAgIHR5cGVzLmFkZCh0eXBlKTsKICB9CgogIC8vLyBSZXNvbHZlcyB0eXBlIHZhcmlhYmxlcyBpbiBbdHlwZXNdIGFuZCBwcm9wYWdhdGUgb3RoZXIgdHlwZXMgdG8gW3BhcmVudF0uCiAgdm9pZCByZXNvbHZlVHlwZXMoCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgTWFwPFN0cmluZywgVHlwZVZhcmlhYmxlQnVpbGRlcj4gbWFwOwogICAgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBtYXAgPSA8U3RyaW5nLCBUeXBlVmFyaWFibGVCdWlsZGVyPnt9OwogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgYnVpbGRlciBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgbWFwW2J1aWxkZXIubmFtZV0gPSBidWlsZGVyOwogICAgICB9CiAgICB9CiAgICBTY29wZSBzY29wZTsKICAgIGZvciAoVW5yZXNvbHZlZFR5cGUgdHlwZSBpbiB0eXBlcykgewogICAgICBPYmplY3QgbmFtZU9yUXVhbGlmaWVkID0gdHlwZS5idWlsZGVyLm5hbWU7CiAgICAgIFN0cmluZyBuYW1lID0gbmFtZU9yUXVhbGlmaWVkIGlzIFF1YWxpZmllZE5hbWUKICAgICAgICAgID8gbmFtZU9yUXVhbGlmaWVkLnF1YWxpZmllcgogICAgICAgICAgOiBuYW1lT3JRdWFsaWZpZWQ7CiAgICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uOwogICAgICBpZiAobmFtZSAhPSBudWxsKSB7CiAgICAgICAgaWYgKG1lbWJlcnMgIT0gbnVsbCkgewogICAgICAgICAgZGVjbGFyYXRpb24gPSBtZW1iZXJzW25hbWVdOwogICAgICAgIH0KICAgICAgICBpZiAoZGVjbGFyYXRpb24gPT0gbnVsbCAmJiBtYXAgIT0gbnVsbCkgewogICAgICAgICAgZGVjbGFyYXRpb24gPSBtYXBbbmFtZV07CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChkZWNsYXJhdGlvbiA9PSBudWxsKSB7CiAgICAgICAgLy8gU2luY2UgbmFtZSBkaWRuJ3QgcmVzb2x2ZSBpbiB0aGlzIHNjb3BlLCBwcm9wYWdhdGUgaXQgdG8gdGhlCiAgICAgICAgLy8gcGFyZW50IGRlY2xhcmF0aW9uLgogICAgICAgIHBhcmVudC5hZGRUeXBlKHR5cGUpOwogICAgICB9IGVsc2UgaWYgKG5hbWVPclF1YWxpZmllZCBpcyBRdWFsaWZpZWROYW1lKSB7CiAgICAgICAgLy8gQXR0ZW1wdCB0byB1c2UgYSBtZW1iZXIgb3IgdHlwZSB2YXJpYWJsZSBhcyBhIHByZWZpeC4KICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSB0ZW1wbGF0ZU5vdEFQcmVmaXhJblR5cGVBbm5vdGF0aW9uLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgIGZsYXR0ZW5OYW1lKAogICAgICAgICAgICAgICAgbmFtZU9yUXVhbGlmaWVkLnF1YWxpZmllciwgdHlwZS5jaGFyT2Zmc2V0LCB0eXBlLmZpbGVVcmkpLAogICAgICAgICAgICBuYW1lT3JRdWFsaWZpZWQubmFtZSk7CiAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2UsIHR5cGUuY2hhck9mZnNldCwKICAgICAgICAgICAgbmFtZU9yUXVhbGlmaWVkLmVuZENoYXJPZmZzZXQgLSB0eXBlLmNoYXJPZmZzZXQsIHR5cGUuZmlsZVVyaSk7CiAgICAgICAgdHlwZS5idWlsZGVyLmJpbmQodHlwZS5idWlsZGVyLmJ1aWxkSW52YWxpZFR5cGUobWVzc2FnZS53aXRoTG9jYXRpb24oCiAgICAgICAgICAgIHR5cGUuZmlsZVVyaSwKICAgICAgICAgICAgdHlwZS5jaGFyT2Zmc2V0LAogICAgICAgICAgICBuYW1lT3JRdWFsaWZpZWQuZW5kQ2hhck9mZnNldCAtIHR5cGUuY2hhck9mZnNldCkpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzY29wZSA/Pz0gdG9TY29wZShudWxsKS53aXRoVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzKTsKICAgICAgICB0eXBlLnJlc29sdmVJbihzY29wZSwgbGlicmFyeSk7CiAgICAgIH0KICAgIH0KICAgIHR5cGVzLmNsZWFyKCk7CiAgfQoKICBTY29wZSB0b1Njb3BlKFNjb3BlIHBhcmVudCkgewogICAgcmV0dXJuIG5ldyBTY29wZShtZW1iZXJzLCBzZXR0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dCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBOdWxsIHBhdHRlcm4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFtDb21waWxlck91dHB1dF0gaW50ZXJmYWNlLgoKbGlicmFyeSBjb21waWxlci5udWxsX2FwaTsKCmltcG9ydCAnLi4vY29tcGlsZXJfbmV3LmRhcnQnOwoKLy8vIE51bGwgcGF0dGVybiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW0NvbXBpbGVyT3V0cHV0XSBpbnRlcmZhY2UuCmNsYXNzIE51bGxDb21waWxlck91dHB1dCBpbXBsZW1lbnRzIENvbXBpbGVyT3V0cHV0IHsKICBjb25zdCBOdWxsQ29tcGlsZXJPdXRwdXQoKTsKCiAgQG92ZXJyaWRlCiAgT3V0cHV0U2luayBjcmVhdGVPdXRwdXRTaW5rKFN0cmluZyBuYW1lLCBTdHJpbmcgZXh0ZW5zaW9uLCBPdXRwdXRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBOdWxsU2luay5vdXRwdXRQcm92aWRlcihuYW1lLCBleHRlbnNpb24sIHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQmluYXJ5T3V0cHV0U2luayBjcmVhdGVCaW5hcnlTaW5rKFVyaSB1cmkpIHsKICAgIHJldHVybiBuZXcgTnVsbEJpbmFyeVNpbmsodXJpKTsKICB9Cn0KCi8vLyBBIHNpbmsgdGhhdCBkcmFpbnMgaW50byAvZGV2L251bGwuCmNsYXNzIE51bGxTaW5rIGltcGxlbWVudHMgT3V0cHV0U2luayB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIE51bGxTaW5rKHRoaXMubmFtZSk7CgogIEBvdmVycmlkZQogIHZvaWQgYWRkKFN0cmluZyB2YWx1ZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHt9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7CgogIC8vLyBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgYW4gW2FwaS5Db21waWxlck91dHB1dFByb3ZpZGVyXS4KICBzdGF0aWMgTnVsbFNpbmsgb3V0cHV0UHJvdmlkZXIoCiAgICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgZXh0ZW5zaW9uLCBPdXRwdXRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBuZXcgTnVsbFNpbmsoJyRuYW1lLiRleHRlbnNpb24uJHR5cGUnKTsKICB9Cn0KCmNsYXNzIE51bGxCaW5hcnlTaW5rIGltcGxlbWVudHMgQmluYXJ5T3V0cHV0U2luayB7CiAgZmluYWwgVXJpIHVyaTsKCiAgTnVsbEJpbmFyeVNpbmsodGhpcy51cmkpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHt9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdOdWxsQmluYXJ5U2luaygkdXJpKSc7Cn0KPwBOTjwBQwEbAR8BQzUeAQxQOwQBDC8kBAIBJycVARcBDBwBDBIBDB0BRiI4MwQCATMRARwBDDwBDBIBDC8CAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9udWxsX2NvbXBpbGVyX291dHB1dC5kYXJ0QnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2RpYWdub3N0aWNzL2RpYWdub3N0aWNfbGlzdGVuZXIuZGFydIraLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5kaWFnbm9zdGljX2xpc3RlbmVyOwoKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnIHNob3cgRGlhZ25vc3RpY09wdGlvbnM7CmltcG9ydCAnbWVzc2FnZXMuZGFydCc7CmltcG9ydCAnc291cmNlX3NwYW4uZGFydCcgc2hvdyBTb3VyY2VTcGFuOwppbXBvcnQgJ3NwYW5uYWJsZS5kYXJ0JyBzaG93IFNwYW5uYWJsZTsKCi8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbmFtZSBhbmQgY2xlYW51cCB0aGlzIGludGVyZmFjZS4gQWRkIHNldmVyaXR5IGVudW0uCmFic3RyYWN0IGNsYXNzIERpYWdub3N0aWNSZXBvcnRlciB7CiAgRGlhZ25vc3RpY09wdGlvbnMgZ2V0IG9wdGlvbnM7CgogIC8vIFRPRE8oa2FybGtsb3NlKTogcmVuYW1lIGxvZyB0byBzb21ldGhpbmcgbGlrZSByZXBvcnRJbmZvLgogIHZvaWQgbG9nKG1lc3NhZ2UpOwoKICBpbnRlcm5hbEVycm9yKFNwYW5uYWJsZSBzcGFubmFibGUsIG1lc3NhZ2UpOwoKICAvLy8gQ3JlYXRlcyBhIFtTb3VyY2VTcGFuXSBmb3IgW25vZGVdIGluIHNjb3BlIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQuCiAgLy8vCiAgLy8vIElmIFtub2RlXSBpcyBhIFtOb2RlXSB3ZSBhc3NlcnQgaW4gY2hlY2tlZCBtb2RlIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcKICAvLy8gdG9rZW5zIGNhbiBiZSBmb3VuZCB3aXRoaW4gdGhlIHRva2VucyBvZiB0aGUgY3VycmVudCBlbGVtZW50LgogIFNvdXJjZVNwYW4gc3BhbkZyb21TcGFubmFibGUoU3Bhbm5hYmxlIG5vZGUpOwoKICB2b2lkIHJlcG9ydEVycm9yTWVzc2FnZShTcGFubmFibGUgc3Bhbm5hYmxlLCBNZXNzYWdlS2luZCBtZXNzYWdlS2luZCwKICAgICAgW01hcCBhcmd1bWVudHMgPSBjb25zdCB7fV0pIHsKICAgIHJlcG9ydEVycm9yKGNyZWF0ZU1lc3NhZ2Uoc3Bhbm5hYmxlLCBtZXNzYWdlS2luZCwgYXJndW1lbnRzKSk7CiAgfQoKICB2b2lkIHJlcG9ydEVycm9yKERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIFtMaXN0PERpYWdub3N0aWNNZXNzYWdlPiBpbmZvcyA9IGNvbnN0IDxEaWFnbm9zdGljTWVzc2FnZT5bXV0pOwoKICB2b2lkIHJlcG9ydFdhcm5pbmdNZXNzYWdlKFNwYW5uYWJsZSBzcGFubmFibGUsIE1lc3NhZ2VLaW5kIG1lc3NhZ2VLaW5kLAogICAgICBbTWFwIGFyZ3VtZW50cyA9IGNvbnN0IHt9XSkgewogICAgcmVwb3J0V2FybmluZyhjcmVhdGVNZXNzYWdlKHNwYW5uYWJsZSwgbWVzc2FnZUtpbmQsIGFyZ3VtZW50cykpOwogIH0KCiAgdm9pZCByZXBvcnRXYXJuaW5nKERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIFtMaXN0PERpYWdub3N0aWNNZXNzYWdlPiBpbmZvcyA9IGNvbnN0IDxEaWFnbm9zdGljTWVzc2FnZT5bXV0pOwoKICB2b2lkIHJlcG9ydEhpbnRNZXNzYWdlKFNwYW5uYWJsZSBzcGFubmFibGUsIE1lc3NhZ2VLaW5kIG1lc3NhZ2VLaW5kLAogICAgICBbTWFwIGFyZ3VtZW50cyA9IGNvbnN0IHt9XSkgewogICAgcmVwb3J0SGludChjcmVhdGVNZXNzYWdlKHNwYW5uYWJsZSwgbWVzc2FnZUtpbmQsIGFyZ3VtZW50cykpOwogIH0KCiAgdm9pZCByZXBvcnRIaW50KERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIFtMaXN0PERpYWdub3N0aWNNZXNzYWdlPiBpbmZvcyA9IGNvbnN0IDxEaWFnbm9zdGljTWVzc2FnZT5bXV0pOwoKICBAZGVwcmVjYXRlZAogIHZvaWQgcmVwb3J0SW5mbyhTcGFubmFibGUgbm9kZSwgTWVzc2FnZUtpbmQgZXJyb3JDb2RlLAogICAgICBbTWFwIGFyZ3VtZW50cyA9IGNvbnN0IHt9XSk7CgogIC8vLyBTZXQgY3VycmVudCBlbGVtZW50IG9mIHRoaXMgcmVwb3J0ZXIgdG8gW2VsZW1lbnRdLiBUaGlzIGlzIHVzZWQgZm9yCiAgLy8vIGNyZWF0aW5nIFtTb3VyY2VTcGFuXSBpbiBbc3BhbkZyb21TcGFubmFibGVdLgogIHdpdGhDdXJyZW50RWxlbWVudChFbnRpdHkgZWxlbWVudCwgZigpKTsKCiAgRGlhZ25vc3RpY01lc3NhZ2UgY3JlYXRlTWVzc2FnZShTcGFubmFibGUgc3Bhbm5hYmxlLCBNZXNzYWdlS2luZCBtZXNzYWdlS2luZCwKICAgICAgW01hcCBhcmd1bWVudHMgPSBjb25zdCB7fV0pOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYSBjcmFzaCwgYW4gZXJyb3Igb3IgYSBmYXRhbCB3YXJuaW5nIGhhcyBiZWVuIHJlcG9ydGVkLgogIGJvb2wgZ2V0IGhhc1JlcG9ydGVkRXJyb3I7CgogIC8vLyBDYWxsZWQgd2hlbiBhbiBbZXhjZXB0aW9uXSBpcyB0aHJvd24gZnJvbSB1c2VyLXByb3ZpZGVkIGNvZGUsIGxpa2UgZnJvbQogIC8vLyB0aGUgaW5wdXQgcHJvdmlkZXIgb3IgZGlhZ25vc3RpY3MgaGFuZGxlci4KICB2b2lkIG9uQ3Jhc2hJblVzZXJDb2RlKFN0cmluZyBtZXNzYWdlLCBleGNlcHRpb24sIHN0YWNrVHJhY2UpIHt9Cn0KCmNsYXNzIERpYWdub3N0aWNNZXNzYWdlIHsKICBmaW5hbCBTb3VyY2VTcGFuIHNvdXJjZVNwYW47CiAgZmluYWwgU3Bhbm5hYmxlIHNwYW5uYWJsZTsKICBmaW5hbCBNZXNzYWdlIG1lc3NhZ2U7CgogIERpYWdub3N0aWNNZXNzYWdlKHRoaXMuc291cmNlU3BhbiwgdGhpcy5zcGFubmFibGUsIHRoaXMubWVzc2FnZSk7Cn0KTwBOTjwBJQEkMRgrKAFOJCEBPxUBLwFJBk1EMAFIJEMEAS5GAUokRQQBMEYBRyRCBAEtRgEOOSMBSjQrAVAjAVAdAU4xQwIBGh8dGQFEAgE5cGFja2FnZTpjb21waWxlci9zcmMvZGlhZ25vc3RpY3MvZGlhZ25vc3RpY19saXN0ZW5lci5kYXJ0OHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2RpYWdub3N0aWNzL2ludmFyaWFudC5kYXJ0hykvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmRpYWdub3N0aWNzLmludmFyaWFudDsKCmltcG9ydCAnc3Bhbm5hYmxlLmRhcnQnOwoKLy8vIEZsYWcgdGhhdCBjYW4gYmUgdXNlZCBpbiBhc3NlcnRpb25zIHRvIGFzc2VydCB0aGF0IGEgY29kZSBwYXRoIGlzIG9ubHkKLy8vIGV4ZWN1dGVkIGFzIHBhcnQgb2YgZGV2ZWxvcG1lbnQuCi8vLwovLy8gVGhpcyBmbGFnIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHRydWUgaWYgaGVscGVyIG1ldGhvZHMgbGlrZSwgW2RlYnVnUHJpbnRdLAovLy8gW2RlYnVnV3JhcFByaW50XSwgW3RyYWNlXSwgYW5kIFtyZXBvcnRIZXJlXSBhcmUgY2FsbGVkLgpib29sIERFQlVHX01PREUgPSBmYWxzZTsKCi8vLyBBc3NlcnQgdGhhdCBbREVCVUdfTU9ERV0gaXMgYHRydWVgIGFuZCBwcm92aWRlIFttZXNzYWdlXSBhcyBwYXJ0IG9mIHRoZQovLy8gZXJyb3IgbWVzc2FnZS4KYXNzZXJ0RGVidWdNb2RlKFN0cmluZyBtZXNzYWdlKSB7CiAgYXNzZXJ0KERFQlVHX01PREUsCiAgICAgIGZhaWxlZEF0KE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwgJ0RlYnVnIG1vZGUgaXMgbm90IGVuYWJsZWQ6ICRtZXNzYWdlJykpOwp9CgovLy8gVGhyb3dzIGEgW1NwYW5uYWJsZUFzc2VydGlvbkZhaWx1cmVdLgovLy8KLy8vIFVzZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGJldHRlciBpbmZvcm1hdGlvbiBmb3IgYXNzZXJ0aW9uIGJ5IGNhbGxpbmcKLy8vIFtmYWlsZWRBdF0gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBhbiBgYXNzZXJ0YCBzdGF0ZW1lbnQ6Ci8vLwovLy8gICAgIGFzc2VydChjb25kaXRpb24sIGZhaWxlZEF0KHBvc2l0aW9uLCBtZXNzYWdlKSk7Ci8vLwovLy8gW3NwYW5uYWJsZV0gbXVzdCBiZSBub24tbnVsbCBhbmQgd2lsbCBiZSB1c2VkIHRvIHByb3ZpZGUgcG9zaXRpb25hbAovLy8gaW5mb3JtYXRpb24gaW4gdGhlIGdlbmVyYXRlZCBlcnJvciBtZXNzYWdlLgovLy8KLy8vIFRoaXMgbWV0aG9kIGNhbiBhbHNvIGJlIHVzZWQgdG8gdGhyb3cgYSBbU3Bhbm5hYmxlQXNzZXJ0aW9uRmFpbHVyZV0gb3V0c2lkZQovLy8gYW4gYXNzZXJ0OgovLy8KLy8vICAgICBmYWlsZWRBdChwb3NpdGlvbiwgbWVzc2FnZSk7Ci8vLwovLy8gb3IsIGlmIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24gcmVxdWlyZXMgYSByZXN1bHQgb3IgY29udHJvbCBmbG93OgovLy8KLy8vICAgICB0aHJvdyBmYWlsZWRBdChwb3NpdGlvbiwgbWVzc2FnZSk7Ci8vLwpib29sIGZhaWxlZEF0KFNwYW5uYWJsZSBzcGFubmFibGUsIFtTdHJpbmcgbWVzc2FnZV0pIHsKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgW3NwYW5uYWJsZV0gYW5kIFttZXNzYWdlXSB0byBwcm92aWRlIGJldHRlcgogIC8vIGluZm9ybWF0aW9uIG9uIGFzc2VydGlvbiBlcnJvcnMuCiAgaWYgKHNwYW5uYWJsZSA9PSBudWxsKSB7CiAgICB0aHJvdyBuZXcgU3Bhbm5hYmxlQXNzZXJ0aW9uRmFpbHVyZShDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICdTcGFubmFibGUgd2FzIG51bGwgZm9yIGZhaWxlZEF0LiBVc2UgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRS4nKTsKICB9CiAgdGhyb3cgbmV3IFNwYW5uYWJsZUFzc2VydGlvbkZhaWx1cmUoc3Bhbm5hYmxlLCBtZXNzYWdlKTsKfQo0AE5OPAEnARkBSyUEUTwZAUwTIhVPAgEqBEtABDgESDAEUA8EJQRFBCsEN0omG0NMBDsCAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy9kaWFnbm9zdGljcy9pbnZhcmlhbnQuZGFydDpzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9kaWFnbm9zdGljcy9zb3VyY2Vfc3Bhbi5kYXJ0g0MvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmRpYWdub3N0aWNzLnNvdXJjZV9zcGFuOwoKaW1wb3J0ICdzcGFubmFibGUuZGFydCcgc2hvdyBTcGFubmFibGU7CgpjbGFzcyBTb3VyY2VTcGFuIGltcGxlbWVudHMgU3Bhbm5hYmxlIHsKICBmaW5hbCBVcmkgdXJpOwogIGZpbmFsIGludCBiZWdpbjsKICBmaW5hbCBpbnQgZW5kOwoKICBjb25zdCBTb3VyY2VTcGFuKHRoaXMudXJpLCB0aGlzLmJlZ2luLCB0aGlzLmVuZCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIDEzICogdXJpLmhhc2hDb2RlICsgMTcgKiBiZWdpbi5oYXNoQ29kZSArIDE5ICogZW5kLmhhc2hDb2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBTb3VyY2VTcGFuKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdXJpID09IG90aGVyLnVyaSAmJiBiZWdpbiA9PSBvdGhlci5iZWdpbiAmJiBlbmQgPT0gb3RoZXIuZW5kOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1NvdXJjZVNwYW4oJHVyaSwgJGJlZ2luLCAkZW5kKSc7Cn0KIABOTjwBKQEoASgRExEBNAEMFUgEAQwcLSxJBAEMOQIBMXBhY2thZ2U6Y29tcGlsZXIvc3JjL2RpYWdub3N0aWNzL3NvdXJjZV9zcGFuLmRhcnQ4c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvZGlhZ25vc3RpY3Mvc3Bhbm5hYmxlLmRhcnSFSC8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuZGlhZ25vc3RpY3Muc3Bhbm5hYmxlOwoKLy8vIFRhZ2dpbmcgaW50ZXJmYWNlIGZvciBjbGFzc2VzIGZyb20gd2hpY2ggc291cmNlIHNwYW5zIGNhbiBiZSBnZW5lcmF0ZWQuCi8vIFRPRE8oam9obm5pd2ludGhlcik6IEZpbmQgYSBiZXR0ZXIgbmFtZS4KLy8gVE9ETyhhaGUpOiBIb3cgYWJvdXQgIkJvbHQiPwphYnN0cmFjdCBjbGFzcyBTcGFubmFibGUge30KCmNsYXNzIF9TcGFubmFibGVTZW50aW5lbCBpbXBsZW1lbnRzIFNwYW5uYWJsZSB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIGNvbnN0IF9TcGFubmFibGVTZW50aW5lbCh0aGlzLm5hbWUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBuYW1lOwp9CgovLy8gU2VudGluZWwgc3Bhbm5hYmxlIHVzZWQgdG8gbWFyayB0aGF0IGRpYWdub3N0aWNzIHNob3VsZCBwb2ludCB0byB0aGUKLy8vIGN1cnJlbnQgZWxlbWVudC4gTm90ZSB0aGF0IHRoZSBkaWFnbm9zdGljIHJlcG9ydGluZyB3aWxsIGZhaWwgaWYgdGhlIGN1cnJlbnQKLy8vIGVsZW1lbnQgaXMgYG51bGxgLgpjb25zdCBTcGFubmFibGUgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSA9CiAgICBjb25zdCBfU3Bhbm5hYmxlU2VudGluZWwoIkN1cnJlbnQgZWxlbWVudCIpOwoKLy8vIFNlbnRpbmVsIHNwYW5uYWJsZSB1c2VkIHRvIG1hcmsgdGhhdCB0aGVyZSBtaWdodCBiZSBubyBsb2NhdGlvbiBmb3IgdGhlCi8vLyBkaWFnbm9zdGljLiBVc2UgdGhpcyBvbmx5IHdoZW4gaXQgaXMgbm90IGFuIGVycm9yIG5vdCB0byBoYXZlIGEgY3VycmVudAovLy8gZWxlbWVudC4KY29uc3QgU3Bhbm5hYmxlIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSA9IGNvbnN0IF9TcGFubmFibGVTZW50aW5lbCgiTm8gbG9jYXRpb24iKTsKCmNsYXNzIFNwYW5uYWJsZUFzc2VydGlvbkZhaWx1cmUgewogIGZpbmFsIFNwYW5uYWJsZSBub2RlOwogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIFNwYW5uYWJsZUFzc2VydGlvbkZhaWx1cmUodGhpcy5ub2RlLCB0aGlzLm1lc3NhZ2UpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnQXNzZXJ0aW9uIGZhaWx1cmUnCiAgICAgICcke21lc3NhZ2UgIT0gbnVsbCA/ICc6ICRtZXNzYWdlJyA6ICcnfSc7Cn0KKgBOTjwBJwFMLCAcATAVAScBDB0CAUlRFywxAUxMDVEBIhgYNgEMKzACAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy9kaWFnbm9zdGljcy9zcGFubmFibGUuZGFydDJzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9oZWxwZXJzL2hlbHBlcnMuZGFydJC+Ly8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBMaWJyYXJ5IGZvciBkZWJ1Z2dpbmcgaGVscGVycy4gVGhlIHVuaXR0ZXN0IGFuYWx5emVfdW51c2VkX3Rlc3QgY2hlY2tzIHRoYXQKLy8vIHRoZSBoZWxwZXIgYXJlIG5vdCB1c2VkIGluIHByb2R1Y3Rpb24gY29kZS4KCmxpYnJhcnkgZGFydDJqcy5oZWxwZXJzOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vZGlhZ25vc3RpY3MvaW52YXJpYW50LmRhcnQnIHNob3cgREVCVUdfTU9ERTsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCc7CmltcG9ydCAndHJhY2UuZGFydCc7CgpleHBvcnQgJ2RlYnVnX2NvbGxlY3Rpb24uZGFydCc7CmV4cG9ydCAnZXhwZW5zaXZlX21hcC5kYXJ0JzsKZXhwb3J0ICdleHBlbnNpdmVfc2V0LmRhcnQnOwpleHBvcnQgJ3N0YXRzLmRhcnQnOwpleHBvcnQgJ3RyYWNlLmRhcnQnOwpleHBvcnQgJ3RyYWNrX21hcC5kYXJ0JzsKCi8vLyBHbG9iYWwgZmxhZyB0byBlbmFibGUgW2RlYnVnUHJpbnRdLiBUaGlzIHNob3VsZCBhbHdheXMgYmUgYHRydWVgIGJ5IGRlZmF1bHQKLy8vIGFuZCBiZSBzZXQgdG8gYGZhbHNlYCBhcyBhIG1lYW5zIHRvIHRlbXBvcmFyaWx5IHR1cm4gb2ZmIGFsbCBkZWJ1Z2dpbmcKLy8vIHByaW50b3V0cy4KY29uc3QgYm9vbCBERUJVR19QUklOVF9FTkFCTEVEID0gdHJ1ZTsKCi8vLyBFbmFibGVzIGRlYnVnIG1vZGUuCi8vLwovLy8gU2V0cyB0aGUgW0RFQlVHX01PREVdIHRvIGB0cnVlYC4Kdm9pZCBlbmFibGVEZWJ1Z01vZGUoKSB7CiAgREVCVUdfTU9ERSA9IHRydWU7Cn0KCmNsYXNzIF9EZWJ1Z0luZGVudGF0aW9uIGV4dGVuZHMgSW5kZW50YXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBpbmRlbnRhdGlvblVuaXQgPSAiICI7Cn0KCl9EZWJ1Z0luZGVudGF0aW9uIF9pbmRlbnRhdGlvbiA9IG5ldyBfRGVidWdJbmRlbnRhdGlvbigpOwoKLy8vIEZ1bmN0aW9uIHNpZ25hdHVyZSBvZiBbZGVidWdQcmludF0uCnR5cGVkZWYgRGVidWdQcmludChzKTsKCi8vLyBJZiBbREVCVUdfUFJJTlRfRU5BQkxFRF0gaXMgYHRydWVgIHByaW50IFtzXSB1c2luZyB0aGUgY3VycmVudCBpbmRlbnRhdGlvbi4KRGVidWdQcmludCBnZXQgZGVidWdQcmludCB7CiAgZW5hYmxlRGVidWdNb2RlKCk7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWF5YmUgZGlzYWJsZSBkZWJ1ZyBtb2RlIGFmdGVyIHRoZSBjYWxsLgogIHJldHVybiBfZGVidWdQcmludDsKfQoKLy8vIEltcGxlbWVudGF0aW9uIG9mIFtkZWJ1Z1ByaW50XS4KX2RlYnVnUHJpbnQocykgewogIGlmIChERUJVR19QUklOVF9FTkFCTEVEKSBwcmludCgnJHtfaW5kZW50YXRpb24uaW5kZW50YXRpb259JHMnKTsKfQoKLy8vIEZ1bmN0aW9uIHNpZ25hdHVyZSBvZiBbZGVidWdXcmFwUHJpbnRdLgp0eXBlZGVmIERlYnVnV3JhcFByaW50KHMsIGYoKSk7CgovLy8gV3JhcHMgdGhlIGNhbGwgdG8gW2ZdIHdpdGggYSBwcmludCBvZiAnc3RhcnQ6JHMnIGFuZCAnZW5kOiRzJyBpbmNyZW1lbnRpbmcKLy8vIHRoZSBjdXJyZW50IGluZGVudGF0aW9uIHVzZWQgYnkgW2RlYnVnUHJpbnRdIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIFtmXS4KLy8vCi8vLyBVc2UgdGhpcyB0byBnZXQgYSB0cmVlLWxpa2UgZGVidWcgcHJpbnRvdXQgZm9yIG5lc3RlZCBjYWxscy4KRGVidWdXcmFwUHJpbnQgZ2V0IGRlYnVnV3JhcFByaW50IHsKICBlbmFibGVEZWJ1Z01vZGUoKTsKICByZXR1cm4gX2RlYnVnV3JhcFByaW50Owp9CgovLy8gSW1wbGVtZW50YXRpb24gb2YgW2RlYnVnV3JhcFByaW50XS4KX2RlYnVnV3JhcFByaW50KHMsIGYoKSkgewogIGRlYnVnUHJpbnQoJ3N0YXJ0OiRzJyk7CiAgdmFyIHJlc3VsdCA9IF9pbmRlbnRhdGlvbi5pbmRlbnRCbG9jayhmKTsKICBkZWJ1Z1ByaW50KCdlbmQ6JHMnKTsKICByZXR1cm4gcmVzdWx0Owp9CgovLy8gRHVtbXkgbWV0aG9kIHRvIG1hcmsgYnJlYWtwb2ludHMuCmRlYnVnQnJlYWsoKSB7CiAgZW5hYmxlRGVidWdNb2RlKCk7Cn0KCi8vLyBGdW5jdGlvbiBzaWduYXR1cmUgb2YgW3JlcG9ydEhlcmVdLgp0eXBlZGVmIFJlcG9ydEhlcmUoCiAgICBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIsIFNwYW5uYWJsZSBub2RlLCBTdHJpbmcgZGVidWdNZXNzYWdlKTsKCi8vLyBQcmludCBhIG1lc3NhZ2Ugd2l0aCBhIHNvdXJjZSBsb2NhdGlvbi4KUmVwb3J0SGVyZSBnZXQgcmVwb3J0SGVyZSB7CiAgZW5hYmxlRGVidWdNb2RlKCk7CiAgcmV0dXJuIF9yZXBvcnRIZXJlOwp9CgovLy8gSW1wbGVtZW50YXRpb24gb2YgW3JlcG9ydEhlcmVdCl9yZXBvcnRIZXJlKERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgU3Bhbm5hYmxlIG5vZGUsIFN0cmluZyBkZWJ1Z01lc3NhZ2UpIHsKICByZXBvcnRlcgogICAgICAucmVwb3J0SW5mbyhub2RlLCBNZXNzYWdlS2luZC5HRU5FUklDLCB7J3RleHQnOiAnSEVSRTogJGRlYnVnTWVzc2FnZSd9KTsKfQoKLy8vIFNldCBvZiB0cmFja2VkIG9iamVjdHMgdXNlZCBieSBbdHJhY2tdIGFuZCBbaWZUcmFja2VkXS4KdmFyIF90cmFja2VkT2JqZWN0cyA9IG5ldyBTZXQ8T2JqZWN0PigpOwoKLy8vIEdsb2JhbCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYHByaW50VHJhY2VgIG9wdGlvbiBvZiBbdHJhY2tdIGFuZCBbaWZUcmFja2VkXS4KYm9vbCB0cmFja1dpdGhUcmFjZSA9IGZhbHNlOwoKLy8vIElmIFtkb1RyYWNrXSBpcyBgdHJ1ZWAsIGFkZCBbb2JqZWN0XSB0byB0aGUgc2V0IG9mIHRyYWNrZWQgb2JqZWN0cy4KLy8vCi8vLyBJZiB0cmFja2VkLCBbbWVzc2FnZV0gaXMgcHJpbnRlZCBhbG9uZyB0aGUgaGFzaCBjb2RlIGFuZCB0b1N0cmluZyBvZgovLy8gW29iamVjdF0uIElmIFtwcmludFRyYWNlXSBpcyBgdHJ1ZWAgYSB0cmFjZSBwcmludGVkIGFkZGl0aW9uYWxseS4KLy8vIElmIFtwcmludFRyYWNlXSBpcyBgbnVsbGAsIFt0cmFja1dpdGhUcmFjZV0gZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdHJhY2UgaXMKLy8vIHByaW50ZWQuCi8vLwovLy8gW29iamVjdF0gaXMgcmV0dXJuZWQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kLgp0cmFjayhib29sIGRvVHJhY2ssIE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlLCB7Ym9vbCBwcmludFRyYWNlfSkgewogIGlmICghZG9UcmFjaykgcmV0dXJuIG9iamVjdDsKICBfdHJhY2tlZE9iamVjdHMuYWRkKG9iamVjdCk7CiAgU3RyaW5nIG1zZyA9ICd0cmFjazogJHtvYmplY3QuaGFzaENvZGV9OiRvYmplY3Q6JG1lc3NhZ2UnOwogIGlmIChwcmludFRyYWNlID09IG51bGwpIHByaW50VHJhY2UgPSB0cmFja1dpdGhUcmFjZTsKICBpZiAocHJpbnRUcmFjZSkgewogICAgdHJhY2UobXNnKTsKICB9IGVsc2UgewogICAgZGVidWdQcmludChtc2cpOwogIH0KICByZXR1cm4gb2JqZWN0Owp9CgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW29iamVjdF0gaXMgaW4gdGhlIHNldCBvZiB0cmFja2VkIG9iamVjdHMuCi8vLwovLy8gSWYgW21lc3NhZ2VdIGlzIHByb3ZpZGVkIGl0IGlzIHByaW50ZWQgYWxvbmcgdGhlIGhhc2ggY29kZSBhbmQgdG9TdHJpbmcgb2YKLy8vIFtvYmplY3RdLiBJZiBbcHJpbnRUcmFjZV0gaXMgYHRydWVgIGEgdHJhY2UgcHJpbnRlZCBhZGRpdGlvbmFsbHkuIElmCi8vLyBbcHJpbnRUcmFjZV0gaXMgYG51bGxgLCBbdHJhY2tXaXRoVHJhY2VdIGRldGVybWluZXMgd2hldGhlciBhIHRyYWNlIGlzCi8vLyBwcmludGVkLgpib29sIGlmVHJhY2tlZChPYmplY3Qgb2JqZWN0LCB7U3RyaW5nIG1lc3NhZ2UsIGJvb2wgcHJpbnRUcmFjZX0pIHsKICBpZiAoX3RyYWNrZWRPYmplY3RzLmNvbnRhaW5zKG9iamVjdCkpIHsKICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKICAgICAgU3RyaW5nIG1zZyA9ICd0cmFja2VkOiAke29iamVjdC5oYXNoQ29kZX06JG9iamVjdDokbWVzc2FnZSc7CiAgICAgIGlmIChwcmludFRyYWNlID09IG51bGwpIHByaW50VHJhY2UgPSB0cmFja1dpdGhUcmFjZTsKICAgICAgaWYgKHByaW50VHJhY2UpIHsKICAgICAgICB0cmFjZShtc2cpOwogICAgICB9IGVsc2UgewogICAgICAgIGRlYnVnUHJpbnQobXNnKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBmYWxzZTsKfQqAkgBOTjwBUDABGQEZOBwVASAdHRUVGQFQSw8nARgEJRkVAgEuDCYCAToBKBcBUBwVQxYCASQRQwIBLCABT04EQSQVGgIBKBoaLBgRAgEmDxUCASgURwEsHBUWAgEjUAtPAgE8KQFRHQFIBElGTg0ENkgfHz03FBALFQQRAgFBBE9JSw1DKhtDOxgUDxkIBhEEEAIBKXBhY2thZ2U6Y29tcGlsZXIvc3JjL2hlbHBlcnMvaGVscGVycy5kYXJ0M3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2JhY2tlbmRfc3RyYXRlZ3kuZGFydIzNLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5iYWNrZW5kX3N0cmF0ZWd5OwoKaW1wb3J0ICdjb21tb24uZGFydCc7CmltcG9ydCAnY29tbW9uL2NvZGVnZW4uZGFydCc7CmltcG9ydCAnY29tbW9uL3Rhc2tzLmRhcnQnOwppbXBvcnQgJ2RlZmVycmVkX2xvYWQuZGFydCcgc2hvdyBPdXRwdXRVbml0RGF0YTsKaW1wb3J0ICdlbnF1ZXVlLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJ2luZmVycmVyL3R5cGVzLmRhcnQnOwppbXBvcnQgJ2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKaW1wb3J0ICdqc19iYWNrZW5kL2JhY2tlbmQuZGFydCc7CmltcG9ydCAnanNfYmFja2VuZC9lbnF1ZXVlci5kYXJ0JzsKaW1wb3J0ICdqc19iYWNrZW5kL2luZmVycmVkX2RhdGEuZGFydCc7CmltcG9ydCAnanNfZW1pdHRlci9jb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JzsKaW1wb3J0ICdzZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnc3NhL3NzYS5kYXJ0JzsKaW1wb3J0ICd1bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnd29ybGQuZGFydCc7CgovLy8gU3RyYXRlZ3kgcGF0dGVybiB0aGF0IGRlZmluZXMgdGhlIGVsZW1lbnQgbW9kZWwgdXNlZCBpbiB0eXBlIGluZmVyZW5jZQovLy8gYW5kIGNvZGUgZ2VuZXJhdGlvbi4KYWJzdHJhY3QgY2xhc3MgQmFja2VuZFN0cmF0ZWd5IHsKICBMaXN0PENvbXBpbGVyVGFzaz4gZ2V0IHRhc2tzOwoKICBGdW5jdGlvbkNvbXBpbGVyIGdldCBmdW5jdGlvbkNvbXBpbGVyOwoKICBDb2RlRW1pdHRlclRhc2sgZ2V0IGVtaXR0ZXJUYXNrOwoKICAvLy8gQ3JlYXRlIHRoZSBbSkNsb3NlZFdvcmxkXSBmcm9tIFtjbG9zZWRXb3JsZF0uCiAgSkNsb3NlZFdvcmxkIGNyZWF0ZUpDbG9zZWRXb3JsZCgKICAgICAgS0Nsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBPdXRwdXRVbml0RGF0YSBvdXRwdXRVbml0RGF0YSk7CgogIC8vLyBSZWdpc3RlcnMgW2Nsb3NlZFdvcmxkXSBhcyB0aGUgY3VycmVudCBjbG9zZWQgd29ybGQgdXNlZCBieSB0aGlzIGJhY2tlbmQKICAvLy8gc3RyYXRlZ3kuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IHNlcmlhbGl6YXRpb24gYWZ0ZXIgdHlwZSBpbmZlcmVuY2UuCiAgdm9pZCByZWdpc3RlckpDbG9zZWRXb3JsZChKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwoKICAvLy8gQ2FsbGVkIHdoZW4gdGhlIGNvbXBpbGVyIHN0YXJ0cyBydW5uaW5nIHRoZSBjb2RlZ2VuLgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSBbQ29kZWdlbklucHV0c10gb2JqZWN0cyB3aXRoIHRoZSBuZWVkZWQgZGF0YS4KICBDb2RlZ2VuSW5wdXRzIG9uQ29kZWdlblN0YXJ0KAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyk7CgogIC8vLyBDcmVhdGVzIGFuIFtFbnF1ZXVlcl0gZm9yIGNvZGUgZ2VuZXJhdGlvbiBzcGVjaWZpYyB0byB0aGlzIGJhY2tlbmQuCiAgQ29kZWdlbkVucXVldWVyIGNyZWF0ZUNvZGVnZW5FbnF1ZXVlcigKICAgICAgQ29tcGlsZXJUYXNrIHRhc2ssCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywKICAgICAgQ29kZWdlbklucHV0cyBjb2RlZ2VuLAogICAgICBDb2RlZ2VuUmVzdWx0cyBjb2RlZ2VuUmVzdWx0cyk7CgogIC8vLyBDYWxsZWQgd2hlbiBjb2RlIGdlbmVyYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLgogIHZvaWQgb25Db2RlZ2VuRW5kKENvZGVnZW5JbnB1dHMgY29kZWdlbik7CgogIC8vLyBDcmVhdGVzIHRoZSBbU3NhQnVpbGRlcl0gdXNlZCBmb3IgdGhlIGVsZW1lbnQgbW9kZWwuCiAgU3NhQnVpbGRlciBjcmVhdGVTc2FCdWlsZGVyKAogICAgICBDb21waWxlclRhc2sgdGFzaywgU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSBzb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5KTsKCiAgLy8vIENyZWF0ZXMgYSBbU291cmNlU3Bhbl0gZnJvbSBbc3Bhbm5hYmxlXSBpbiBjb250ZXh0IG9mIFtjdXJyZW50RWxlbWVudF0uCiAgU291cmNlU3BhbiBzcGFuRnJvbVNwYW5uYWJsZShTcGFubmFibGUgc3Bhbm5hYmxlLCBFbnRpdHkgY3VycmVudEVsZW1lbnQpOwoKICAvLy8gQ3JlYXRlcyB0aGUgW1R5cGVzSW5mZXJyZXJdIHVzZWQgYnkgdGhpcyBzdHJhdGVneS4KICBUeXBlc0luZmVycmVyIGNyZWF0ZVR5cGVzSW5mZXJyZXIoCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwgSW5mZXJyZWREYXRhQnVpbGRlciBpbmZlcnJlZERhdGFCdWlsZGVyKTsKCiAgLy8vIENhbGxzIFtmXSBmb3IgZXZlcnkgbWVtYmVyIHRoYXQgbmVlZHMgdG8gYmUgc2VyaWFsaXplZCBmb3IgbW9kdWxhciBjb2RlCiAgLy8vIGdlbmVyYXRpb24gYW5kIHJldHVybnMgYW4gW0VudGl0eVdyaXRlcl0gZm9yIGVuY29kaW5nIHRoZXNlIG1lbWJlcnMgaW4KICAvLy8gdGhlIHNlcmlhbGl6ZWQgZGF0YS4KICAvLy8KICAvLy8gVGhlIG5lZWRlZCBtZW1iZXJzIGluY2x1ZGUgbWVtYmVycyBjb21wdXRlZCBvbiBkZW1hbmQgZHVyaW5nIG5vbi1tb2R1bGFyCiAgLy8vIGNvZGUgZ2VuZXJhdGlvbiwgc3VjaCBhcyBjb25zdHJ1Y3RvciBib2RpZXMgYW5kIGFuZCBnZW5lcmF0b3IgYm9kaWVzLgogIEVudGl0eVdyaXRlciBmb3JFYWNoQ29kZWdlbk1lbWJlcih2b2lkIEZ1bmN0aW9uKE1lbWJlckVudGl0eSBtZW1iZXIpIGYpOwoKICAvLy8gUHJlcGFyZSBbc291cmNlXSB0byBkZXNlcmlhbGl6ZSBtb2R1bGFyIGNvZGUgZ2VuZXJhdGlvbiBkYXRhLgogIHZvaWQgcHJlcGFyZUNvZGVnZW5SZWFkZXIoRGF0YVNvdXJjZSBzb3VyY2UpOwoKICAvLy8gR2VuZXJhdGVzIHRoZSBvdXRwdXQgYW5kIHJldHVybnMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlLgogIGludCBhc3NlbWJsZVByb2dyYW0oSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBJbmZlcnJlZERhdGEgaW5mZXJyZWREYXRhLAogICAgICBDb2RlZ2VuSW5wdXRzIGNvZGVnZW5JbnB1dHMsIENvZGVnZW5Xb3JsZCBjb2RlZ2VuV29ybGQpOwp9ClcATk48ASIBFh4cMRchHiUiIygsKxcuFQFLGSEgASkBIwE0I0ABTxAGQjcBOwZAID4BSikZIDkdJgE2LAE7H08BTkwBOSVKAU5NGwZPTEsBRDABTUs/AgEqcGFja2FnZTpjb21waWxlci9zcmMvYmFja2VuZF9zdHJhdGVneS5kYXJ0MXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbW1vbi9jb2RlZ2VuLmRhcnTAARAXLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5jb21tb24uY29kZWdlbjsKCmltcG9ydCAncGFja2FnZTpqc19hc3Qvc3JjL3ByZWNlZGVuY2UuZGFydCcgYXMganMgc2hvdyBQUklNQVJZOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZGVmZXJyZWRfbG9hZC5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JyBzaG93IERhcnRUeXBlLCBJbnRlcmZhY2VUeXBlOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9iYWNrZW5kLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmFtZXIuZGFydCc7CmltcG9ydCAnLi4vanNfZW1pdHRlci9jb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JyBzaG93IEVtaXR0ZXI7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9zc2Evc3NhLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2ZlYXR1cmUuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvdXNlLmRhcnQnIHNob3cgQ29uc3RhbnRVc2UsIER5bmFtaWNVc2UsIFN0YXRpY1VzZSwgVHlwZVVzZTsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydCcKICAgIHNob3cgV29ybGRJbXBhY3QsIFdvcmxkSW1wYWN0QnVpbGRlckltcGwsIFdvcmxkSW1wYWN0VmlzaXRvcjsKaW1wb3J0ICcuLi91dGlsL2VudW1zZXQuZGFydCc7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnOwoKY2xhc3MgQ29kZWdlbkltcGFjdCBleHRlbmRzIFdvcmxkSW1wYWN0IHsKICBjb25zdCBDb2RlZ2VuSW1wYWN0KCk7CgogIGZhY3RvcnkgQ29kZWdlbkltcGFjdC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpID0KICAgICAgX0NvZGVnZW5JbXBhY3QucmVhZEZyb21EYXRhU291cmNlOwoKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignQ29kZWdlbkltcGFjdC53cml0ZVRvRGF0YVNpbmsnKTsKICB9CgogIEl0ZXJhYmxlPFBhaXI8RGFydFR5cGUsIERhcnRUeXBlPj4gZ2V0IHR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVja3MgewogICAgcmV0dXJuIGNvbnN0IDxQYWlyPERhcnRUeXBlLCBEYXJ0VHlwZT4+W107CiAgfQoKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBjb25zdFN5bWJvbHMgPT4gY29uc3QgPFN0cmluZz5bXTsKCiAgSXRlcmFibGU8U2V0PENsYXNzRW50aXR5Pj4gZ2V0IHNwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JzIHsKICAgIHJldHVybiBjb25zdCA8U2V0PENsYXNzRW50aXR5Pj5bXTsKICB9CgogIGJvb2wgZ2V0IHVzZXNJbnRlcmNlcHRvciA9PiBmYWxzZTsKCiAgSXRlcmFibGU8QXN5bmNNYXJrZXI+IGdldCBhc3luY01hcmtlcnMgPT4gY29uc3QgPEFzeW5jTWFya2VyPltdOwoKICBJdGVyYWJsZTxHZW5lcmljSW5zdGFudGlhdGlvbj4gZ2V0IGdlbmVyaWNJbnN0YW50aWF0aW9ucyA9PgogICAgICBjb25zdCA8R2VuZXJpY0luc3RhbnRpYXRpb24+W107CgogIEl0ZXJhYmxlPE5hdGl2ZUJlaGF2aW9yPiBnZXQgbmF0aXZlQmVoYXZpb3JzID0+IGNvbnN0IFtdOwoKICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZ2V0IG5hdGl2ZU1ldGhvZHMgPT4gY29uc3QgW107CgogIEl0ZXJhYmxlPFNlbGVjdG9yPiBnZXQgb25lU2hvdEludGVyY2VwdG9ycyA9PiBjb25zdCBbXTsKfQoKY2xhc3MgX0NvZGVnZW5JbXBhY3QgZXh0ZW5kcyBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgQ29kZWdlbkltcGFjdCB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY29kZWdlbi1pbXBhY3QnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBNZW1iZXJFbnRpdHkgbWVtYmVyOwogIFNldDxQYWlyPERhcnRUeXBlLCBEYXJ0VHlwZT4+IF90eXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2tzOwogIFNldDxTdHJpbmc+IF9jb25zdFN5bWJvbHM7CiAgTGlzdDxTZXQ8Q2xhc3NFbnRpdHk+PiBfc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnM7CiAgYm9vbCBfdXNlc0ludGVyY2VwdG9yID0gZmFsc2U7CiAgRW51bVNldDxBc3luY01hcmtlcj4gX2FzeW5jTWFya2VyczsKICBTZXQ8R2VuZXJpY0luc3RhbnRpYXRpb24+IF9nZW5lcmljSW5zdGFudGlhdGlvbnM7CiAgTGlzdDxOYXRpdmVCZWhhdmlvcj4gX25hdGl2ZUJlaGF2aW9yczsKICBTZXQ8RnVuY3Rpb25FbnRpdHk+IF9uYXRpdmVNZXRob2RzOwogIFNldDxTZWxlY3Rvcj4gX29uZVNob3RJbnRlcmNlcHRvcnM7CgogIF9Db2RlZ2VuSW1wYWN0KHRoaXMubWVtYmVyKTsKCiAgX0NvZGVnZW5JbXBhY3QuaW50ZXJuYWwoCiAgICAgIHRoaXMubWVtYmVyLAogICAgICBTZXQ8RHluYW1pY1VzZT4gZHluYW1pY1VzZXMsCiAgICAgIFNldDxTdGF0aWNVc2U+IHN0YXRpY1VzZXMsCiAgICAgIFNldDxUeXBlVXNlPiB0eXBlVXNlcywKICAgICAgU2V0PENvbnN0YW50VXNlPiBjb25zdGFudFVzZXMsCiAgICAgIHRoaXMuX3R5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVja3MsCiAgICAgIHRoaXMuX2NvbnN0U3ltYm9scywKICAgICAgdGhpcy5fc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnMsCiAgICAgIHRoaXMuX3VzZXNJbnRlcmNlcHRvciwKICAgICAgdGhpcy5fYXN5bmNNYXJrZXJzLAogICAgICB0aGlzLl9nZW5lcmljSW5zdGFudGlhdGlvbnMsCiAgICAgIHRoaXMuX25hdGl2ZUJlaGF2aW9ycywKICAgICAgdGhpcy5fbmF0aXZlTWV0aG9kcywKICAgICAgdGhpcy5fb25lU2hvdEludGVyY2VwdG9ycykKICAgICAgOiBzdXBlci5pbnRlcm5hbChkeW5hbWljVXNlcywgc3RhdGljVXNlcywgdHlwZVVzZXMsIGNvbnN0YW50VXNlcyk7CgogIGZhY3RvcnkgX0NvZGVnZW5JbXBhY3QucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPSBzb3VyY2UucmVhZE1lbWJlcigpOwogICAgU2V0PER5bmFtaWNVc2U+IGR5bmFtaWNVc2VzID0gc291cmNlCiAgICAgICAgLnJlYWRMaXN0KCgpID0+IER5bmFtaWNVc2UucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKQogICAgICAgID8udG9TZXQoKTsKICAgIFNldDxTdGF0aWNVc2U+IHN0YXRpY1VzZXMgPSBzb3VyY2UKICAgICAgICAucmVhZExpc3QoKCkgPT4gU3RhdGljVXNlLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpLCBlbXB0eUFzTnVsbDogdHJ1ZSkKICAgICAgICA/LnRvU2V0KCk7CiAgICBTZXQ8VHlwZVVzZT4gdHlwZVVzZXMgPSBzb3VyY2UKICAgICAgICAucmVhZExpc3QoKCkgPT4gVHlwZVVzZS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKSwgZW1wdHlBc051bGw6IHRydWUpCiAgICAgICAgPy50b1NldCgpOwogICAgU2V0PENvbnN0YW50VXNlPiBjb25zdGFudFVzZXMgPSBzb3VyY2UKICAgICAgICAucmVhZExpc3QoKCkgPT4gQ29uc3RhbnRVc2UucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKQogICAgICAgID8udG9TZXQoKTsKICAgIFNldDxQYWlyPERhcnRUeXBlLCBEYXJ0VHlwZT4+IHR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVja3MgPQogICAgICAgIHNvdXJjZS5yZWFkTGlzdCgoKSB7CiAgICAgIHJldHVybiBuZXcgUGFpcihzb3VyY2UucmVhZERhcnRUeXBlKCksIHNvdXJjZS5yZWFkRGFydFR5cGUoKSk7CiAgICB9LCBlbXB0eUFzTnVsbDogdHJ1ZSk/LnRvU2V0KCk7CiAgICBTZXQ8U3RyaW5nPiBjb25zdFN5bWJvbHMgPSBzb3VyY2UucmVhZFN0cmluZ3MoZW1wdHlBc051bGw6IHRydWUpPy50b1NldCgpOwogICAgTGlzdDxTZXQ8Q2xhc3NFbnRpdHk+PiBzcGVjaWFsaXplZEdldEludGVyY2VwdG9ycyA9IHNvdXJjZS5yZWFkTGlzdCgoKSB7CiAgICAgIHJldHVybiBzb3VyY2UucmVhZENsYXNzZXMoKS50b1NldCgpOwogICAgfSwgZW1wdHlBc051bGw6IHRydWUpOwogICAgYm9vbCB1c2VzSW50ZXJjZXB0b3IgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGludCBhc3luY01hcmtlcnNWYWx1ZSA9IHNvdXJjZS5yZWFkSW50T3JOdWxsKCk7CiAgICBFbnVtU2V0PEFzeW5jTWFya2VyPiBhc3luY01hcmtlcnMgPSBhc3luY01hcmtlcnNWYWx1ZSAhPSBudWxsCiAgICAgICAgPyBuZXcgRW51bVNldC5mcm9tVmFsdWUoYXN5bmNNYXJrZXJzVmFsdWUpCiAgICAgICAgOiBudWxsOwogICAgU2V0PEdlbmVyaWNJbnN0YW50aWF0aW9uPiBnZW5lcmljSW5zdGFudGlhdGlvbnMgPSBzb3VyY2UKICAgICAgICAucmVhZExpc3QoKCkgPT4gR2VuZXJpY0luc3RhbnRpYXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKQogICAgICAgID8udG9TZXQoKTsKICAgIExpc3Q8TmF0aXZlQmVoYXZpb3I+IG5hdGl2ZUJlaGF2aW9ycyA9IHNvdXJjZS5yZWFkTGlzdCgKICAgICAgICAoKSA9PiBOYXRpdmVCZWhhdmlvci5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IG5hdGl2ZU1ldGhvZHMgPQogICAgICAgIHNvdXJjZS5yZWFkTWVtYmVyczxGdW5jdGlvbkVudGl0eT4oZW1wdHlBc051bGw6IHRydWUpPy50b1NldCgpOwogICAgU2V0PFNlbGVjdG9yPiBvbmVTaG90SW50ZXJjZXB0b3JzID0gc291cmNlCiAgICAgICAgLnJlYWRMaXN0KCgpID0+IFNlbGVjdG9yLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpLCBlbXB0eUFzTnVsbDogdHJ1ZSkKICAgICAgICA/LnRvU2V0KCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9Db2RlZ2VuSW1wYWN0LmludGVybmFsKAogICAgICAgIG1lbWJlciwKICAgICAgICBkeW5hbWljVXNlcywKICAgICAgICBzdGF0aWNVc2VzLAogICAgICAgIHR5cGVVc2VzLAogICAgICAgIGNvbnN0YW50VXNlcywKICAgICAgICB0eXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2tzLAogICAgICAgIGNvbnN0U3ltYm9scywKICAgICAgICBzcGVjaWFsaXplZEdldEludGVyY2VwdG9ycywKICAgICAgICB1c2VzSW50ZXJjZXB0b3IsCiAgICAgICAgYXN5bmNNYXJrZXJzLAogICAgICAgIGdlbmVyaWNJbnN0YW50aWF0aW9ucywKICAgICAgICBuYXRpdmVCZWhhdmlvcnMsCiAgICAgICAgbmF0aXZlTWV0aG9kcywKICAgICAgICBvbmVTaG90SW50ZXJjZXB0b3JzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXIobWVtYmVyKTsKICAgIHNpbmsud3JpdGVMaXN0KGR5bmFtaWNVc2VzLCAoRHluYW1pY1VzZSB1c2UpID0+IHVzZS53cml0ZVRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KHN0YXRpY1VzZXMsIChTdGF0aWNVc2UgdXNlKSA9PiB1c2Uud3JpdGVUb0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdCh0eXBlVXNlcywgKFR5cGVVc2UgdXNlKSA9PiB1c2Uud3JpdGVUb0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChjb25zdGFudFVzZXMsIChDb25zdGFudFVzZSB1c2UpID0+IHVzZS53cml0ZVRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0PFBhaXI8RGFydFR5cGUsIERhcnRUeXBlPj4oX3R5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVja3MsCiAgICAgICAgKHBhaXIpIHsKICAgICAgc2luay53cml0ZURhcnRUeXBlKHBhaXIuYSk7CiAgICAgIHNpbmsud3JpdGVEYXJ0VHlwZShwYWlyLmIpOwogICAgfSwgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVTdHJpbmdzKF9jb25zdFN5bWJvbHMsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChfc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnMsIHNpbmsud3JpdGVDbGFzc2VzLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlQm9vbChfdXNlc0ludGVyY2VwdG9yKTsKICAgIHNpbmsud3JpdGVJbnRPck51bGwoX2FzeW5jTWFya2Vycz8udmFsdWUpOwogICAgc2luay53cml0ZUxpc3QoCiAgICAgICAgX2dlbmVyaWNJbnN0YW50aWF0aW9ucywKICAgICAgICAoR2VuZXJpY0luc3RhbnRpYXRpb24gaW5zdGFudGlhdGlvbikgPT4KICAgICAgICAgICAgaW5zdGFudGlhdGlvbi53cml0ZVRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KF9uYXRpdmVCZWhhdmlvcnMsCiAgICAgICAgKE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yKSA9PiBiZWhhdmlvci53cml0ZVRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVNZW1iZXJzKF9uYXRpdmVNZXRob2RzLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX29uZVNob3RJbnRlcmNlcHRvcnMsCiAgICAgICAgKFNlbGVjdG9yIHNlbGVjdG9yKSA9PiBzZWxlY3Rvci53cml0ZVRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFwcGx5KFdvcmxkSW1wYWN0VmlzaXRvciB2aXNpdG9yKSB7CiAgICBzdGF0aWNVc2VzLmZvckVhY2goKFN0YXRpY1VzZSB1c2UpID0+IHZpc2l0b3IudmlzaXRTdGF0aWNVc2UobWVtYmVyLCB1c2UpKTsKICAgIGR5bmFtaWNVc2VzLmZvckVhY2goKER5bmFtaWNVc2UgdXNlKSA9PiB2aXNpdG9yLnZpc2l0RHluYW1pY1VzZSk7CiAgICB0eXBlVXNlcy5mb3JFYWNoKChUeXBlVXNlIHVzZSkgPT4gdmlzaXRvci52aXNpdFR5cGVVc2UobWVtYmVyLCB1c2UpKTsKICAgIGNvbnN0YW50VXNlcwogICAgICAgIC5mb3JFYWNoKChDb25zdGFudFVzZSB1c2UpID0+IHZpc2l0b3IudmlzaXRDb25zdGFudFVzZShtZW1iZXIsIHVzZSkpOwogIH0KCiAgdm9pZCByZWdpc3RlclR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVjaygKICAgICAgRGFydFR5cGUgc3VidHlwZSwgRGFydFR5cGUgc3VwZXJ0eXBlKSB7CiAgICBfdHlwZVZhcmlhYmxlQm91bmRzU3VidHlwZUNoZWNrcyA/Pz0ge307CiAgICBfdHlwZVZhcmlhYmxlQm91bmRzU3VidHlwZUNoZWNrcwogICAgICAgIC5hZGQobmV3IFBhaXI8RGFydFR5cGUsIERhcnRUeXBlPihzdWJ0eXBlLCBzdXBlcnR5cGUpKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFBhaXI8RGFydFR5cGUsIERhcnRUeXBlPj4gZ2V0IHR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVja3MgewogICAgcmV0dXJuIF90eXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2tzICE9IG51bGwKICAgICAgICA/IF90eXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2tzCiAgICAgICAgOiBjb25zdCA8UGFpcjxEYXJ0VHlwZSwgRGFydFR5cGU+PltdOwogIH0KCiAgdm9pZCByZWdpc3RlckNvbnN0U3ltYm9sKFN0cmluZyBuYW1lKSB7CiAgICBfY29uc3RTeW1ib2xzID8/PSB7fTsKICAgIF9jb25zdFN5bWJvbHMuYWRkKG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgY29uc3RTeW1ib2xzIHsKICAgIHJldHVybiBfY29uc3RTeW1ib2xzICE9IG51bGwgPyBfY29uc3RTeW1ib2xzIDogY29uc3QgPFN0cmluZz5bXTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTcGVjaWFsaXplZEdldEludGVyY2VwdG9yKFNldDxDbGFzc0VudGl0eT4gY2xhc3NlcykgewogICAgX3NwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JzID8/PSA8U2V0PENsYXNzRW50aXR5Pj5bXTsKICAgIF9zcGVjaWFsaXplZEdldEludGVyY2VwdG9ycy5hZGQoY2xhc3Nlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxTZXQ8Q2xhc3NFbnRpdHk+PiBnZXQgc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnMgewogICAgcmV0dXJuIF9zcGVjaWFsaXplZEdldEludGVyY2VwdG9ycyAhPSBudWxsCiAgICAgICAgPyBfc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnMKICAgICAgICA6IGNvbnN0IDxTZXQ8Q2xhc3NFbnRpdHk+PltdOwogIH0KCiAgdm9pZCByZWdpc3RlclVzZUludGVyY2VwdG9yKCkgewogICAgX3VzZXNJbnRlcmNlcHRvciA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCB1c2VzSW50ZXJjZXB0b3IgPT4gX3VzZXNJbnRlcmNlcHRvcjsKCiAgdm9pZCByZWdpc3RlckFzeW5jTWFya2VyKEFzeW5jTWFya2VyIGFzeW5jTWFya2VyKSB7CiAgICBfYXN5bmNNYXJrZXJzID8/PSBuZXcgRW51bVNldDxBc3luY01hcmtlcj4oKTsKICAgIF9hc3luY01hcmtlcnMuYWRkKGFzeW5jTWFya2VyKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEFzeW5jTWFya2VyPiBnZXQgYXN5bmNNYXJrZXJzIHsKICAgIHJldHVybiBfYXN5bmNNYXJrZXJzICE9IG51bGwKICAgICAgICA/IF9hc3luY01hcmtlcnMuaXRlcmFibGUoQXN5bmNNYXJrZXIudmFsdWVzKQogICAgICAgIDogY29uc3QgPEFzeW5jTWFya2VyPltdOwogIH0KCiAgdm9pZCByZWdpc3RlckdlbmVyaWNJbnN0YW50aWF0aW9uKEdlbmVyaWNJbnN0YW50aWF0aW9uIGluc3RhbnRpYXRpb24pIHsKICAgIF9nZW5lcmljSW5zdGFudGlhdGlvbnMgPz89IHt9OwogICAgX2dlbmVyaWNJbnN0YW50aWF0aW9ucy5hZGQoaW5zdGFudGlhdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxHZW5lcmljSW5zdGFudGlhdGlvbj4gZ2V0IGdlbmVyaWNJbnN0YW50aWF0aW9ucyB7CiAgICByZXR1cm4gX2dlbmVyaWNJbnN0YW50aWF0aW9ucyA/PyBjb25zdCA8R2VuZXJpY0luc3RhbnRpYXRpb24+W107CiAgfQoKICB2b2lkIHJlZ2lzdGVyTmF0aXZlQmVoYXZpb3IoTmF0aXZlQmVoYXZpb3IgbmF0aXZlQmVoYXZpb3IpIHsKICAgIF9uYXRpdmVCZWhhdmlvcnMgPz89IFtdOwogICAgX25hdGl2ZUJlaGF2aW9ycy5hZGQobmF0aXZlQmVoYXZpb3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8TmF0aXZlQmVoYXZpb3I+IGdldCBuYXRpdmVCZWhhdmlvcnMgewogICAgcmV0dXJuIF9uYXRpdmVCZWhhdmlvcnMgPz8gY29uc3QgPE5hdGl2ZUJlaGF2aW9yPltdOwogIH0KCiAgdm9pZCByZWdpc3Rlck5hdGl2ZU1ldGhvZChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgX25hdGl2ZU1ldGhvZHMgPz89IHt9OwogICAgX25hdGl2ZU1ldGhvZHMuYWRkKGZ1bmN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEZ1bmN0aW9uRW50aXR5PiBnZXQgbmF0aXZlTWV0aG9kcyB7CiAgICByZXR1cm4gX25hdGl2ZU1ldGhvZHMgPz8gY29uc3QgW107CiAgfQoKICB2b2lkIHJlZ2lzdGVyT25lU2hvdEludGVyY2VwdG9yKFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICBfb25lU2hvdEludGVyY2VwdG9ycyA/Pz0ge307CiAgICBfb25lU2hvdEludGVyY2VwdG9ycy5hZGQoc2VsZWN0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8U2VsZWN0b3I+IGdldCBvbmVTaG90SW50ZXJjZXB0b3JzIHsKICAgIHJldHVybiBfb25lU2hvdEludGVyY2VwdG9ycyA/PyBjb25zdCBbXTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdDb2RlZ2VuSW1wYWN0OicpOwogICAgV29ybGRJbXBhY3QucHJpbnRPbihzYiwgdGhpcyk7CgogICAgdm9pZCBhZGQoU3RyaW5nIHRpdGxlLCBJdGVyYWJsZSBpdGVyYWJsZSkgewogICAgICBpZiAoaXRlcmFibGUuaXNOb3RFbXB0eSkgewogICAgICAgIHNiLndyaXRlKCdcbiAkdGl0bGU6Jyk7CiAgICAgICAgaXRlcmFibGUuZm9yRWFjaCgoZSkgPT4gc2Iud3JpdGUoJ1xuICAkZScpKTsKICAgICAgfQogICAgfQoKICAgIGFkZCgndHlwZVZhcmlhYmxlQm91bmRzU3VidHlwZUNoZWNrcycsIHR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVja3MpOwogICAgYWRkKCdjb25zdFN5bWJvbHMnLCBjb25zdFN5bWJvbHMpOwogICAgYWRkKCdzcGVjaWFsaXplZEdldEludGVyY2VwdG9ycycsIHNwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JzKTsKICAgIGlmICh1c2VzSW50ZXJjZXB0b3IpIHsKICAgICAgc2Iud3JpdGUoJ1xuIHVzZXNJbnRlcmNlcHRvcjogdHJ1ZScpOwogICAgfQogICAgYWRkKCdhc3luY01hcmtlcnMnLCBhc3luY01hcmtlcnMpOwogICAgYWRkKCdnZW5lcmljSW5zdGFudGlhdGlvbnMnLCBnZW5lcmljSW5zdGFudGlhdGlvbnMpOwogICAgYWRkKCduYXRpdmVCZWhhdmlvcnMnLCBuYXRpdmVCZWhhdmlvcnMpOwogICAgYWRkKCduYXRpdmVNZXRob2RzJywgbmF0aXZlTWV0aG9kcyk7CiAgICBhZGQoJ29uZVNob3RJbnRlcmNlcHRvcnMnLCBvbmVTaG90SW50ZXJjZXB0b3JzKTsKCiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vIFRPRE8oam9obm5pd2ludGhlcik6IFNwbGl0IHRoaXMgY2xhc3MgaW50byBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNb3ZlIHRoaXMgaW1wbGVtZW50YXRpb24gdG8gdGhlIEpTIGJhY2tlbmQuCmNsYXNzIENvZGVnZW5SZWdpc3RyeSB7CiAgZmluYWwgRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CiAgZmluYWwgTWVtYmVyRW50aXR5IF9jdXJyZW50RWxlbWVudDsKICBmaW5hbCBfQ29kZWdlbkltcGFjdCBfd29ybGRJbXBhY3Q7CiAgTGlzdDxNb2R1bGFyTmFtZT4gX25hbWVzOwogIExpc3Q8TW9kdWxhckV4cHJlc3Npb24+IF9leHByZXNzaW9uczsKCiAgQ29kZWdlblJlZ2lzdHJ5KHRoaXMuX2VsZW1lbnRFbnZpcm9ubWVudCwgdGhpcy5fY3VycmVudEVsZW1lbnQpCiAgICAgIDogdGhpcy5fd29ybGRJbXBhY3QgPSBuZXcgX0NvZGVnZW5JbXBhY3QoX2N1cnJlbnRFbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0NvZGVnZW5SZWdpc3RyeSBmb3IgJF9jdXJyZW50RWxlbWVudCc7CgogIEBkZXByZWNhdGVkCiAgdm9pZCByZWdpc3Rlckluc3RhbnRpYXRlZENsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfZWxlbWVudEVudmlyb25tZW50LmdldFJhd1R5cGUoZWxlbWVudCkpOwogIH0KCiAgdm9pZCByZWdpc3RlclN0YXRpY1VzZShTdGF0aWNVc2Ugc3RhdGljVXNlKSB7CiAgICBfd29ybGRJbXBhY3QucmVnaXN0ZXJTdGF0aWNVc2Uoc3RhdGljVXNlKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJEeW5hbWljVXNlKER5bmFtaWNVc2UgZHluYW1pY1VzZSkgewogICAgX3dvcmxkSW1wYWN0LnJlZ2lzdGVyRHluYW1pY1VzZShkeW5hbWljVXNlKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJUeXBlVXNlKFR5cGVVc2UgdHlwZVVzZSkgewogICAgX3dvcmxkSW1wYWN0LnJlZ2lzdGVyVHlwZVVzZSh0eXBlVXNlKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJDb25zdGFudFVzZShDb25zdGFudFVzZSBjb25zdGFudFVzZSkgewogICAgX3dvcmxkSW1wYWN0LnJlZ2lzdGVyQ29uc3RhbnRVc2UoY29uc3RhbnRVc2UpOwogIH0KCiAgdm9pZCByZWdpc3RlclR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVjaygKICAgICAgRGFydFR5cGUgc3VidHlwZSwgRGFydFR5cGUgc3VwZXJ0eXBlKSB7CiAgICBfd29ybGRJbXBhY3QucmVnaXN0ZXJUeXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2soc3VidHlwZSwgc3VwZXJ0eXBlKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJJbnN0YW50aWF0ZWRDbG9zdXJlKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIF93b3JsZEltcGFjdC5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLmNhbGxNZXRob2QoZWxlbWVudCkpOwogIH0KCiAgdm9pZCByZWdpc3RlckNvbnN0U3ltYm9sKFN0cmluZyBuYW1lKSB7CiAgICBfd29ybGRJbXBhY3QucmVnaXN0ZXJDb25zdFN5bWJvbChuYW1lKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTcGVjaWFsaXplZEdldEludGVyY2VwdG9yKFNldDxDbGFzc0VudGl0eT4gY2xhc3NlcykgewogICAgX3dvcmxkSW1wYWN0LnJlZ2lzdGVyU3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcihjbGFzc2VzKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJPbmVTaG90SW50ZXJjZXB0b3IoU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgIF93b3JsZEltcGFjdC5yZWdpc3Rlck9uZVNob3RJbnRlcmNlcHRvcihzZWxlY3Rvcik7CiAgfQoKICB2b2lkIHJlZ2lzdGVyVXNlSW50ZXJjZXB0b3IoKSB7CiAgICBfd29ybGRJbXBhY3QucmVnaXN0ZXJVc2VJbnRlcmNlcHRvcigpOwogIH0KCiAgdm9pZCByZWdpc3Rlckluc3RhbnRpYXRpb24oSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICByZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaW5zdGFudGlhdGlvbih0eXBlKSk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQXN5bmNNYXJrZXIoQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIpIHsKICAgIF93b3JsZEltcGFjdC5yZWdpc3RlckFzeW5jTWFya2VyKGFzeW5jTWFya2VyKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJHZW5lcmljSW5zdGFudGlhdGlvbihHZW5lcmljSW5zdGFudGlhdGlvbiBpbnN0YW50aWF0aW9uKSB7CiAgICBfd29ybGRJbXBhY3QucmVnaXN0ZXJHZW5lcmljSW5zdGFudGlhdGlvbihpbnN0YW50aWF0aW9uKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJOYXRpdmVCZWhhdmlvcihOYXRpdmVCZWhhdmlvciBuYXRpdmVCZWhhdmlvcikgewogICAgX3dvcmxkSW1wYWN0LnJlZ2lzdGVyTmF0aXZlQmVoYXZpb3IobmF0aXZlQmVoYXZpb3IpOwogIH0KCiAgdm9pZCByZWdpc3Rlck5hdGl2ZU1ldGhvZChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgX3dvcmxkSW1wYWN0LnJlZ2lzdGVyTmF0aXZlTWV0aG9kKGZ1bmN0aW9uKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJNb2R1bGFyTmFtZShNb2R1bGFyTmFtZSBuYW1lKSB7CiAgICBfbmFtZXMgPz89IFtdOwogICAgX25hbWVzLmFkZChuYW1lKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJNb2R1bGFyRXhwcmVzc2lvbihNb2R1bGFyRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICBfZXhwcmVzc2lvbnMgPz89IFtdOwogICAgX2V4cHJlc3Npb25zLmFkZChleHByZXNzaW9uKTsKICB9CgogIENvZGVnZW5SZXN1bHQgY2xvc2UoanMuRnVuIGNvZGUpIHsKICAgIHJldHVybiBuZXcgQ29kZWdlblJlc3VsdCgKICAgICAgICBjb2RlLCBfd29ybGRJbXBhY3QsIF9uYW1lcyA/PyBjb25zdCBbXSwgX2V4cHJlc3Npb25zID8/IGNvbnN0IFtdKTsKICB9Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIHJlYWRpbmcgdGhlIGNvZGUgZ2VuZXJhdGlvbiByZXN1bHRzIGZvciBhbGwgW01lbWJlckVudGl0eV1zLgphYnN0cmFjdCBjbGFzcyBDb2RlZ2VuUmVzdWx0cyB7CiAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZ2V0IGdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzOwogIENvZGVnZW5JbnB1dHMgZ2V0IGNvZGVnZW5JbnB1dHM7CiAgQ29kZWdlblJlc3VsdCBnZXRDb2RlZ2VuUmVzdWx0cyhNZW1iZXJFbnRpdHkgbWVtYmVyKTsKfQoKLy8vIENvZGUgZ2VuZXJhdGlvbiByZXN1bHRzIGNvbXB1dGVkIG9uLWRlbWFuZC4KLy8vCi8vLyBUaGlzIGlzIHVzZWQgaW4gdGhlIG5vbi1tb2R1bGFyIGNvZGVnZW4gZW5xdWV1ZXIgZHJpdmluZyBjb2RlIGdlbmVyYXRpb24uCmNsYXNzIE9uRGVtYW5kQ29kZWdlblJlc3VsdHMgZXh0ZW5kcyBDb2RlZ2VuUmVzdWx0cyB7CiAgQG92ZXJyaWRlCiAgZmluYWwgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZ2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHM7CiAgQG92ZXJyaWRlCiAgZmluYWwgQ29kZWdlbklucHV0cyBjb2RlZ2VuSW5wdXRzOwogIGZpbmFsIFNzYUZ1bmN0aW9uQ29tcGlsZXIgX2Z1bmN0aW9uQ29tcGlsZXI7CgogIE9uRGVtYW5kQ29kZWdlblJlc3VsdHModGhpcy5nbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cywgdGhpcy5jb2RlZ2VuSW5wdXRzLAogICAgICB0aGlzLl9mdW5jdGlvbkNvbXBpbGVyKTsKCiAgQG92ZXJyaWRlCiAgQ29kZWdlblJlc3VsdCBnZXRDb2RlZ2VuUmVzdWx0cyhNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gX2Z1bmN0aW9uQ29tcGlsZXIuY29tcGlsZShtZW1iZXIpOwogIH0KfQoKLy8vIERlc2VyaWFsaXplZCBjb2RlIGdlbmVyYXRpb24gcmVzdWx0cy4KLy8vCi8vLyBUaGlzIGlzIHVzZWQgZm9yIG1vZHVsYXIgY29kZSBnZW5lcmF0aW9uLgpjbGFzcyBEZXNlcmlhbGl6ZWRDb2RlZ2VuUmVzdWx0cyBleHRlbmRzIENvZGVnZW5SZXN1bHRzIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0czsKICBAb3ZlcnJpZGUKICBmaW5hbCBDb2RlZ2VuSW5wdXRzIGNvZGVnZW5JbnB1dHM7CgogIGZpbmFsIE1hcDxNZW1iZXJFbnRpdHksIENvZGVnZW5SZXN1bHQ+IF9tYXA7CgogIERlc2VyaWFsaXplZENvZGVnZW5SZXN1bHRzKAogICAgICB0aGlzLmdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzLCB0aGlzLmNvZGVnZW5JbnB1dHMsIHRoaXMuX21hcCk7CgogIEBvdmVycmlkZQogIENvZGVnZW5SZXN1bHQgZ2V0Q29kZWdlblJlc3VsdHMoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgQ29kZWdlblJlc3VsdCByZXN1bHQgPSBfbWFwW21lbWJlcl07CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgZmFpbGVkQXQobWVtYmVyLAogICAgICAgICAgIk5vIGNvZGVnZW4gcmVzdWx0cyBmcm9tICRtZW1iZXIgKCR7aWRlbnRpdHlIYXNoQ29kZShtZW1iZXIpfSkuIik7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKLy8vIFRoZSBjb2RlIGdlbmVyYXRpb24gcmVzdWx0IGZvciBhIHNpbmdsZSBbTWVtYmVyRW50aXR5XS4KY2xhc3MgQ29kZWdlblJlc3VsdCB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY29kZWdlbi1yZXN1bHQnOwoKICBmaW5hbCBqcy5GdW4gY29kZTsKICBmaW5hbCBDb2RlZ2VuSW1wYWN0IGltcGFjdDsKICBmaW5hbCBJdGVyYWJsZTxNb2R1bGFyTmFtZT4gbW9kdWxhck5hbWVzOwogIGZpbmFsIEl0ZXJhYmxlPE1vZHVsYXJFeHByZXNzaW9uPiBtb2R1bGFyRXhwcmVzc2lvbnM7CgogIENvZGVnZW5SZXN1bHQoCiAgICAgIHRoaXMuY29kZSwgdGhpcy5pbXBhY3QsIHRoaXMubW9kdWxhck5hbWVzLCB0aGlzLm1vZHVsYXJFeHByZXNzaW9ucyk7CgogIC8vLyBSZWFkcyBhIFtDb2RlZ2VuUmVzdWx0XSBvYmplY3QgZnJvbSBbc291cmNlXS4KICAvLy8KICAvLy8gVGhlIFtNb2R1bGFyTmFtZV0gYW5kIFtNb2R1bGFyRXhwcmVzc2lvbl0gbm9kZXMgcmVhZCBkdXJpbmcKICAvLy8gZGVzZXJpYWxpemF0aW9uIGFyZSBjb2xsZWN0ZWQgaW4gW21vZHVsYXJOYW1lc10gYW5kIFttb2R1bGFyRXhwcmVzc2lvbnNdCiAgLy8vIHRvIGF2b2lkIHRoZSBuZWVkIGZvciB2aXNpdGluZyB0aGUgW2NvZGVdIG5vZGUgcG9zdCBkZXNlcmlhbGl6YXRpb24uCiAgZmFjdG9yeSBDb2RlZ2VuUmVzdWx0LnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsCiAgICAgIExpc3Q8TW9kdWxhck5hbWU+IG1vZHVsYXJOYW1lcywKICAgICAgTGlzdDxNb2R1bGFyRXhwcmVzc2lvbj4gbW9kdWxhckV4cHJlc3Npb25zKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGpzLkZ1biBjb2RlID0gc291cmNlLnJlYWRKc05vZGVPck51bGwoKTsKICAgIENvZGVnZW5JbXBhY3QgaW1wYWN0ID0gQ29kZWdlbkltcGFjdC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgQ29kZWdlblJlc3VsdChjb2RlLCBpbXBhY3QsIG1vZHVsYXJOYW1lcywgbW9kdWxhckV4cHJlc3Npb25zKTsKICB9CgogIC8vLyBXcml0ZXMgdGhlIFtDb2RlZ2VuUmVzdWx0XSBvYmplY3QgdG8gW3NpbmtdLgogIC8vLwogIC8vLyBUaGUgW21vZHVsYXJOYW1lc10gYW5kIFttb2R1bGFyRXhwcmVzc2lvbnNdIGZpZWxkcyBhcmUgbm90IGRpcmVjdGx5CiAgLy8vIHNlcmlhbGl6ZXMgYmVjYXVzZSB0aGVzZSBhcmUgZW1iZWRkZWQgaW4gdGhlIFtjb2RlXSBub2RlIGFuZCBjb2xsZWN0ZWQKICAvLy8gdGhyb3VnaCB0aGlzIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUpzTm9kZU9yTnVsbChjb2RlKTsKICAgIGltcGFjdC53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgdm9pZCBhcHBseU1vZHVsYXJTdGF0ZShOYW1lciBuYW1lciwgRW1pdHRlciBlbWl0dGVyKSB7CiAgICBmb3IgKE1vZHVsYXJOYW1lIG5hbWUgaW4gbW9kdWxhck5hbWVzKSB7CiAgICAgIHN3aXRjaCAobmFtZS5raW5kKSB7CiAgICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQucnRpRmllbGQ6CiAgICAgICAgICBuYW1lLnZhbHVlID0gbmFtZXIucnRpRmllbGRKc05hbWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5ydW50aW1lVHlwZU5hbWU6CiAgICAgICAgICBuYW1lLnZhbHVlID0gbmFtZXIucnVudGltZVR5cGVOYW1lKG5hbWUuZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5jbGFzc05hbWU6CiAgICAgICAgICBuYW1lLnZhbHVlID0gbmFtZXIuY2xhc3NOYW1lKG5hbWUuZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5hbGlhc2VkU3VwZXJNZW1iZXI6CiAgICAgICAgICBuYW1lLnZhbHVlID0gbmFtZXIuYWxpYXNlZFN1cGVyTWVtYmVyUHJvcGVydHlOYW1lKG5hbWUuZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5zdGF0aWNDbG9zdXJlOgogICAgICAgICAgbmFtZS52YWx1ZSA9IG5hbWVyLnN0YXRpY0Nsb3N1cmVOYW1lKG5hbWUuZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5tZXRob2RQcm9wZXJ0eToKICAgICAgICAgIG5hbWUudmFsdWUgPSBuYW1lci5tZXRob2RQcm9wZXJ0eU5hbWUobmFtZS5kYXRhKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLm9wZXJhdG9ySXM6CiAgICAgICAgICBuYW1lLnZhbHVlID0gbmFtZXIub3BlcmF0b3JJcyhuYW1lLmRhdGEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQub3BlcmF0b3JJc1R5cGU6CiAgICAgICAgICBuYW1lLnZhbHVlID0gbmFtZXIub3BlcmF0b3JJc1R5cGUobmFtZS5kYXRhKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLnN1YnN0aXR1dGlvbjoKICAgICAgICAgIG5hbWUudmFsdWUgPSBuYW1lci5zdWJzdGl0dXRpb25OYW1lKG5hbWUuZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5pbnN0YW5jZU1ldGhvZDoKICAgICAgICAgIG5hbWUudmFsdWUgPSBuYW1lci5pbnN0YW5jZU1ldGhvZE5hbWUobmFtZS5kYXRhKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLmluc3RhbmNlRmllbGQ6CiAgICAgICAgICBuYW1lLnZhbHVlID0gbmFtZXIuaW5zdGFuY2VGaWVsZFByb3BlcnR5TmFtZShuYW1lLmRhdGEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQuaW52b2NhdGlvbjoKICAgICAgICAgIG5hbWUudmFsdWUgPSBuYW1lci5pbnZvY2F0aW9uTmFtZShuYW1lLmRhdGEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQubGF6eUluaXRpYWxpemVyOgogICAgICAgICAgbmFtZS52YWx1ZSA9IG5hbWVyLmxhenlJbml0aWFsaXplck5hbWUobmFtZS5kYXRhKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLmdsb2JhbFByb3BlcnR5TmFtZUZvckNsYXNzOgogICAgICAgICAgbmFtZS52YWx1ZSA9IG5hbWVyLmdsb2JhbFByb3BlcnR5TmFtZUZvckNsYXNzKG5hbWUuZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5nbG9iYWxQcm9wZXJ0eU5hbWVGb3JUeXBlOgogICAgICAgICAgbmFtZS52YWx1ZSA9IG5hbWVyLmdsb2JhbFByb3BlcnR5TmFtZUZvclR5cGUobmFtZS5kYXRhKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLmdsb2JhbFByb3BlcnR5TmFtZUZvck1lbWJlcjoKICAgICAgICAgIG5hbWUudmFsdWUgPSBuYW1lci5nbG9iYWxQcm9wZXJ0eU5hbWVGb3JNZW1iZXIobmFtZS5kYXRhKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLmdsb2JhbE5hbWVGb3JJbnRlcmZhY2VUeXBlVmFyaWFibGU6CiAgICAgICAgICBuYW1lLnZhbHVlID0gbmFtZXIuZ2xvYmFsTmFtZUZvckludGVyZmFjZVR5cGVWYXJpYWJsZShuYW1lLmRhdGEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQubmFtZUZvckdldEludGVyY2VwdG9yOgogICAgICAgICAgbmFtZS52YWx1ZSA9IG5hbWVyLm5hbWVGb3JHZXRJbnRlcmNlcHRvcihuYW1lLnNldCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5uYW1lRm9yT25lU2hvdEludGVyY2VwdG9yOgogICAgICAgICAgbmFtZS52YWx1ZSA9IG5hbWVyLm5hbWVGb3JPbmVTaG90SW50ZXJjZXB0b3IobmFtZS5kYXRhLCBuYW1lLnNldCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5hc05hbWU6CiAgICAgICAgICBuYW1lLnZhbHVlID0gbmFtZXIuYXNOYW1lKG5hbWUuZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgZm9yIChNb2R1bGFyRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIG1vZHVsYXJFeHByZXNzaW9ucykgewogICAgICBzd2l0Y2ggKGV4cHJlc3Npb24ua2luZCkgewogICAgICAgIGNhc2UgTW9kdWxhckV4cHJlc3Npb25LaW5kLmdsb2JhbE9iamVjdEZvckxpYnJhcnk6CiAgICAgICAgICBleHByZXNzaW9uLnZhbHVlID0gbmFtZXIKICAgICAgICAgICAgICAucmVhZEdsb2JhbE9iamVjdEZvckxpYnJhcnkoZXhwcmVzc2lvbi5kYXRhKQogICAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oZXhwcmVzc2lvbi5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1vZHVsYXJFeHByZXNzaW9uS2luZC5nbG9iYWxPYmplY3RGb3JDbGFzczoKICAgICAgICAgIGV4cHJlc3Npb24udmFsdWUgPSBuYW1lcgogICAgICAgICAgICAgIC5yZWFkR2xvYmFsT2JqZWN0Rm9yQ2xhc3MoZXhwcmVzc2lvbi5kYXRhKQogICAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oZXhwcmVzc2lvbi5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1vZHVsYXJFeHByZXNzaW9uS2luZC5nbG9iYWxPYmplY3RGb3JUeXBlOgogICAgICAgICAgZXhwcmVzc2lvbi52YWx1ZSA9IG5hbWVyCiAgICAgICAgICAgICAgLnJlYWRHbG9iYWxPYmplY3RGb3JUeXBlKGV4cHJlc3Npb24uZGF0YSkKICAgICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKGV4cHJlc3Npb24uc291cmNlSW5mb3JtYXRpb24pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNb2R1bGFyRXhwcmVzc2lvbktpbmQuZ2xvYmFsT2JqZWN0Rm9yTWVtYmVyOgogICAgICAgICAgZXhwcmVzc2lvbi52YWx1ZSA9IG5hbWVyCiAgICAgICAgICAgICAgLnJlYWRHbG9iYWxPYmplY3RGb3JNZW1iZXIoZXhwcmVzc2lvbi5kYXRhKQogICAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oZXhwcmVzc2lvbi5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1vZHVsYXJFeHByZXNzaW9uS2luZC5jb25zdGFudDoKICAgICAgICAgIGV4cHJlc3Npb24udmFsdWUgPSBlbWl0dGVyCiAgICAgICAgICAgICAgLmNvbnN0YW50UmVmZXJlbmNlKGV4cHJlc3Npb24uZGF0YSkKICAgICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKGV4cHJlc3Npb24uc291cmNlSW5mb3JtYXRpb24pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNb2R1bGFyRXhwcmVzc2lvbktpbmQuZW1iZWRkZWRHbG9iYWxBY2Nlc3M6CiAgICAgICAgICBleHByZXNzaW9uLnZhbHVlID0gZW1pdHRlcgogICAgICAgICAgICAgIC5nZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzKGV4cHJlc3Npb24uZGF0YSkKICAgICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKGV4cHJlc3Npb24uc291cmNlSW5mb3JtYXRpb24pOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdDb2RlZ2VuUmVzdWx0KGNvZGU9Jyk7CiAgICBzYi53cml0ZShjb2RlICE9IG51bGwgPyBqcy5EZWJ1Z1ByaW50KGNvZGUpIDogJzxudWxsPiwnKTsKICAgIHNiLndyaXRlKCdpbXBhY3Q9JGltcGFjdCwnKTsKICAgIHNiLndyaXRlKCdtb2R1bGFyTmFtZXM9JG1vZHVsYXJOYW1lcywnKTsKICAgIHNiLndyaXRlKCdtb2R1bGFyRXhwcmVzc2lvbnM9JG1vZHVsYXJFeHByZXNzaW9ucycpOwogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKZW51bSBNb2R1bGFyTmFtZUtpbmQgewogIHJ0aUZpZWxkLAogIHJ1bnRpbWVUeXBlTmFtZSwKICBjbGFzc05hbWUsCiAgYWxpYXNlZFN1cGVyTWVtYmVyLAogIHN0YXRpY0Nsb3N1cmUsCiAgbWV0aG9kUHJvcGVydHksCiAgb3BlcmF0b3JJcywKICBvcGVyYXRvcklzVHlwZSwKICBzdWJzdGl0dXRpb24sCiAgaW5zdGFuY2VNZXRob2QsCiAgaW5zdGFuY2VGaWVsZCwKICBpbnZvY2F0aW9uLAogIGxhenlJbml0aWFsaXplciwKICBnbG9iYWxQcm9wZXJ0eU5hbWVGb3JDbGFzcywKICBnbG9iYWxQcm9wZXJ0eU5hbWVGb3JUeXBlLAogIGdsb2JhbFByb3BlcnR5TmFtZUZvck1lbWJlciwKICBnbG9iYWxOYW1lRm9ySW50ZXJmYWNlVHlwZVZhcmlhYmxlLAogIG5hbWVGb3JHZXRJbnRlcmNlcHRvciwKICBuYW1lRm9yT25lU2hvdEludGVyY2VwdG9yLAogIGFzTmFtZSwKfQoKY2xhc3MgTW9kdWxhck5hbWUgZXh0ZW5kcyBqcy5OYW1lIGltcGxlbWVudHMganMuQXN0Q29udGFpbmVyIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdtb2R1bGFyLW5hbWUnOwoKICBmaW5hbCBNb2R1bGFyTmFtZUtpbmQga2luZDsKICBqcy5OYW1lIF92YWx1ZTsKICBmaW5hbCBPYmplY3QgZGF0YTsKICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IHNldDsKCiAgTW9kdWxhck5hbWUodGhpcy5raW5kLCB7dGhpcy5kYXRhLCB0aGlzLnNldH0pOwoKICBmYWN0b3J5IE1vZHVsYXJOYW1lLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBNb2R1bGFyTmFtZUtpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShNb2R1bGFyTmFtZUtpbmQudmFsdWVzKTsKICAgIE9iamVjdCBkYXRhOwogICAgU2V0PENsYXNzRW50aXR5PiBzZXQ7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQucnRpRmllbGQ6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLmdsb2JhbFByb3BlcnR5TmFtZUZvclR5cGU6CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLnJ1bnRpbWVUeXBlTmFtZToKICAgICAgICBib29sIGRhdGFJc0NsYXNzRW50aXR5ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICAgICAgaWYgKGRhdGFJc0NsYXNzRW50aXR5KSB7CiAgICAgICAgICBkYXRhID0gc291cmNlLnJlYWRDbGFzcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkYXRhID0gc291cmNlLnJlYWRUeXBlZGVmKCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5jbGFzc05hbWU6CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLm9wZXJhdG9ySXM6CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLnN1YnN0aXR1dGlvbjoKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQuZ2xvYmFsUHJvcGVydHlOYW1lRm9yQ2xhc3M6CiAgICAgICAgZGF0YSA9IHNvdXJjZS5yZWFkQ2xhc3MoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQuYWxpYXNlZFN1cGVyTWVtYmVyOgogICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5zdGF0aWNDbG9zdXJlOgogICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5tZXRob2RQcm9wZXJ0eToKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQuaW5zdGFuY2VGaWVsZDoKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQuaW5zdGFuY2VNZXRob2Q6CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLmxhenlJbml0aWFsaXplcjoKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQuZ2xvYmFsUHJvcGVydHlOYW1lRm9yTWVtYmVyOgogICAgICAgIGRhdGEgPSBzb3VyY2UucmVhZE1lbWJlcigpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5vcGVyYXRvcklzVHlwZToKICAgICAgICBkYXRhID0gc291cmNlLnJlYWREYXJ0VHlwZSgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5pbnZvY2F0aW9uOgogICAgICAgIGRhdGEgPSBTZWxlY3Rvci5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQuZ2xvYmFsTmFtZUZvckludGVyZmFjZVR5cGVWYXJpYWJsZToKICAgICAgICBkYXRhID0gc291cmNlLnJlYWRUeXBlVmFyaWFibGUoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQubmFtZUZvckdldEludGVyY2VwdG9yOgogICAgICAgIHNldCA9IHNvdXJjZS5yZWFkQ2xhc3NlcygpLnRvU2V0KCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLm5hbWVGb3JPbmVTaG90SW50ZXJjZXB0b3I6CiAgICAgICAgZGF0YSA9IFNlbGVjdG9yLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICAgIHNldCA9IHNvdXJjZS5yZWFkQ2xhc3NlcygpLnRvU2V0KCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLmFzTmFtZToKICAgICAgICBkYXRhID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgTW9kdWxhck5hbWUoa2luZCwgZGF0YTogZGF0YSwgc2V0OiBzZXQpOwogIH0KCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUVudW0oa2luZCk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQucnRpRmllbGQ6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLmdsb2JhbFByb3BlcnR5TmFtZUZvclR5cGU6CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLnJ1bnRpbWVUeXBlTmFtZToKICAgICAgICBzaW5rLndyaXRlQm9vbChkYXRhIGlzIENsYXNzRW50aXR5KTsKICAgICAgICBpZiAoZGF0YSBpcyBDbGFzc0VudGl0eSkgewogICAgICAgICAgc2luay53cml0ZUNsYXNzKGRhdGEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzaW5rLndyaXRlVHlwZWRlZihkYXRhKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLmNsYXNzTmFtZToKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQub3BlcmF0b3JJczoKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQuc3Vic3RpdHV0aW9uOgogICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5nbG9iYWxQcm9wZXJ0eU5hbWVGb3JDbGFzczoKICAgICAgICBzaW5rLndyaXRlQ2xhc3MoZGF0YSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLmFsaWFzZWRTdXBlck1lbWJlcjoKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQuc3RhdGljQ2xvc3VyZToKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQubWV0aG9kUHJvcGVydHk6CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLmluc3RhbmNlRmllbGQ6CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLmluc3RhbmNlTWV0aG9kOgogICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5sYXp5SW5pdGlhbGl6ZXI6CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLmdsb2JhbFByb3BlcnR5TmFtZUZvck1lbWJlcjoKICAgICAgICBzaW5rLndyaXRlTWVtYmVyKGRhdGEpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5vcGVyYXRvcklzVHlwZToKICAgICAgICBzaW5rLndyaXRlRGFydFR5cGUoZGF0YSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLmludm9jYXRpb246CiAgICAgICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBkYXRhOwogICAgICAgIHNlbGVjdG9yLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQuZ2xvYmFsTmFtZUZvckludGVyZmFjZVR5cGVWYXJpYWJsZToKICAgICAgICBUeXBlVmFyaWFibGVFbnRpdHkgdHlwZVZhcmlhYmxlID0gZGF0YTsKICAgICAgICBzaW5rLndyaXRlVHlwZVZhcmlhYmxlKHR5cGVWYXJpYWJsZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTW9kdWxhck5hbWVLaW5kLm5hbWVGb3JHZXRJbnRlcmNlcHRvcjoKICAgICAgICBzaW5rLndyaXRlQ2xhc3NlcyhzZXQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1vZHVsYXJOYW1lS2luZC5uYW1lRm9yT25lU2hvdEludGVyY2VwdG9yOgogICAgICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gZGF0YTsKICAgICAgICBzZWxlY3Rvci53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICAgICAgc2luay53cml0ZUNsYXNzZXMoc2V0KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNb2R1bGFyTmFtZUtpbmQuYXNOYW1lOgogICAgICAgIHNpbmsud3JpdGVTdHJpbmcoZGF0YSk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAganMuTmFtZSBnZXQgdmFsdWUgewogICAgYXNzZXJ0KF92YWx1ZSAhPSBudWxsLCAndmFsdWUgbm90IHNldCBmb3IgJHRoaXMnKTsKICAgIHJldHVybiBfdmFsdWU7CiAgfQoKICB2b2lkIHNldCB2YWx1ZShqcy5OYW1lIG5vZGUpIHsKICAgIGFzc2VydChfdmFsdWUgPT0gbnVsbCk7CiAgICBhc3NlcnQobm9kZSAhPSBudWxsKTsKICAgIF92YWx1ZSA9IG5vZGUud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQga2V5IHsKICAgIGFzc2VydChfdmFsdWUgIT0gbnVsbCk7CiAgICByZXR1cm4gX3ZhbHVlLmtleTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSB7CiAgICBhc3NlcnQoX3ZhbHVlICE9IG51bGwsICd2YWx1ZSBub3Qgc2V0IGZvciAkdGhpcycpOwogICAgcmV0dXJuIF92YWx1ZS5uYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgYWxsb3dSZW5hbWUgewogICAgYXNzZXJ0KF92YWx1ZSAhPSBudWxsLCAndmFsdWUgbm90IHNldCBmb3IgJHRoaXMnKTsKICAgIHJldHVybiBfdmFsdWUuYWxsb3dSZW5hbWU7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgY29tcGFyZVRvKGpzLk5hbWUgb3RoZXIpIHsKICAgIGFzc2VydChfdmFsdWUgIT0gbnVsbCwgJ3ZhbHVlIG5vdCBzZXQgZm9yICR0aGlzJyk7CiAgICByZXR1cm4gX3ZhbHVlLmNvbXBhcmVUbyhvdGhlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxqcy5Ob2RlPiBnZXQgY29udGFpbmVkTm9kZXMgewogICAgcmV0dXJuIF92YWx1ZSAhPSBudWxsID8gW192YWx1ZV0gOiBjb25zdCBbXTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIEhhc2hpbmcuc2V0SGFzaChzZXQsIEhhc2hpbmcub2JqZWN0c0hhc2goa2luZCwgZGF0YSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBvdGhlciBpcyBNb2R1bGFyTmFtZSAmJgogICAgICAgIGtpbmQgPT0gb3RoZXIua2luZCAmJgogICAgICAgIGRhdGEgPT0gb3RoZXIuZGF0YSAmJgogICAgICAgIGVxdWFsU2V0cyhzZXQsIG90aGVyLnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnTW9kdWxhck5hbWUoa2luZD0ka2luZCwgZGF0YT0kZGF0YSwgdmFsdWU9JHtfdmFsdWU/LmtleX0pJzsKfQoKZW51bSBNb2R1bGFyRXhwcmVzc2lvbktpbmQgewogIGdsb2JhbE9iamVjdEZvckxpYnJhcnksCiAgZ2xvYmFsT2JqZWN0Rm9yQ2xhc3MsCiAgZ2xvYmFsT2JqZWN0Rm9yVHlwZSwKICBnbG9iYWxPYmplY3RGb3JNZW1iZXIsCiAgY29uc3RhbnQsCiAgZW1iZWRkZWRHbG9iYWxBY2Nlc3MsCn0KCmNsYXNzIE1vZHVsYXJFeHByZXNzaW9uIGV4dGVuZHMganMuRGVmZXJyZWRFeHByZXNzaW9uCiAgICBpbXBsZW1lbnRzIGpzLkFzdENvbnRhaW5lciB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnbW9kdWxhci1leHByZXNzaW9uJzsKCiAgZmluYWwgTW9kdWxhckV4cHJlc3Npb25LaW5kIGtpbmQ7CiAgZmluYWwgT2JqZWN0IGRhdGE7CiAganMuRXhwcmVzc2lvbiBfdmFsdWU7CgogIE1vZHVsYXJFeHByZXNzaW9uKHRoaXMua2luZCwgdGhpcy5kYXRhKTsKCiAgZmFjdG9yeSBNb2R1bGFyRXhwcmVzc2lvbi5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgTW9kdWxhckV4cHJlc3Npb25LaW5kIGtpbmQgPSBzb3VyY2UucmVhZEVudW0oTW9kdWxhckV4cHJlc3Npb25LaW5kLnZhbHVlcyk7CiAgICBPYmplY3QgZGF0YTsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIE1vZHVsYXJFeHByZXNzaW9uS2luZC5nbG9iYWxPYmplY3RGb3JMaWJyYXJ5OgogICAgICAgIGRhdGEgPSBzb3VyY2UucmVhZExpYnJhcnkoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNb2R1bGFyRXhwcmVzc2lvbktpbmQuZ2xvYmFsT2JqZWN0Rm9yQ2xhc3M6CiAgICAgICAgZGF0YSA9IHNvdXJjZS5yZWFkQ2xhc3MoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNb2R1bGFyRXhwcmVzc2lvbktpbmQuZ2xvYmFsT2JqZWN0Rm9yVHlwZToKICAgICAgICBib29sIGRhdGFJc0NsYXNzRW50aXR5ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICAgICAgaWYgKGRhdGFJc0NsYXNzRW50aXR5KSB7CiAgICAgICAgICBkYXRhID0gc291cmNlLnJlYWRDbGFzcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkYXRhID0gc291cmNlLnJlYWRUeXBlZGVmKCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1vZHVsYXJFeHByZXNzaW9uS2luZC5nbG9iYWxPYmplY3RGb3JNZW1iZXI6CiAgICAgICAgZGF0YSA9IHNvdXJjZS5yZWFkTWVtYmVyKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTW9kdWxhckV4cHJlc3Npb25LaW5kLmNvbnN0YW50OgogICAgICAgIGRhdGEgPSBzb3VyY2UucmVhZENvbnN0YW50KCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTW9kdWxhckV4cHJlc3Npb25LaW5kLmVtYmVkZGVkR2xvYmFsQWNjZXNzOgogICAgICAgIGRhdGEgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBNb2R1bGFyRXhwcmVzc2lvbihraW5kLCBkYXRhKTsKICB9CgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVFbnVtKGtpbmQpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgTW9kdWxhckV4cHJlc3Npb25LaW5kLmdsb2JhbE9iamVjdEZvckxpYnJhcnk6CiAgICAgICAgc2luay53cml0ZUxpYnJhcnkoZGF0YSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTW9kdWxhckV4cHJlc3Npb25LaW5kLmdsb2JhbE9iamVjdEZvckNsYXNzOgogICAgICAgIHNpbmsud3JpdGVDbGFzcyhkYXRhKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNb2R1bGFyRXhwcmVzc2lvbktpbmQuZ2xvYmFsT2JqZWN0Rm9yVHlwZToKICAgICAgICBzaW5rLndyaXRlQm9vbChkYXRhIGlzIENsYXNzRW50aXR5KTsKICAgICAgICBpZiAoZGF0YSBpcyBDbGFzc0VudGl0eSkgewogICAgICAgICAgc2luay53cml0ZUNsYXNzKGRhdGEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzaW5rLndyaXRlVHlwZWRlZihkYXRhKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTW9kdWxhckV4cHJlc3Npb25LaW5kLmdsb2JhbE9iamVjdEZvck1lbWJlcjoKICAgICAgICBzaW5rLndyaXRlTWVtYmVyKGRhdGEpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1vZHVsYXJFeHByZXNzaW9uS2luZC5jb25zdGFudDoKICAgICAgICBzaW5rLndyaXRlQ29uc3RhbnQoZGF0YSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTW9kdWxhckV4cHJlc3Npb25LaW5kLmVtYmVkZGVkR2xvYmFsQWNjZXNzOgogICAgICAgIHNpbmsud3JpdGVTdHJpbmcoZGF0YSk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiBnZXQgdmFsdWUgewogICAgYXNzZXJ0KF92YWx1ZSAhPSBudWxsKTsKICAgIHJldHVybiBfdmFsdWU7CiAgfQoKICB2b2lkIHNldCB2YWx1ZShqcy5FeHByZXNzaW9uIG5vZGUpIHsKICAgIGFzc2VydChfdmFsdWUgPT0gbnVsbCk7CiAgICBhc3NlcnQobm9kZSAhPSBudWxsKTsKICAgIF92YWx1ZSA9IG5vZGUud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsID0+IF92YWx1ZT8ucHJlY2VkZW5jZUxldmVsID8/IGpzLlBSSU1BUlk7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPGpzLk5vZGU+IGdldCBjb250YWluZWROb2RlcyB7CiAgICByZXR1cm4gX3ZhbHVlICE9IG51bGwgPyBbX3ZhbHVlXSA6IGNvbnN0IFtdOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gSGFzaGluZy5vYmplY3RzSGFzaChraW5kLCBkYXRhKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gb3RoZXIgaXMgTW9kdWxhckV4cHJlc3Npb24gJiYKICAgICAgICBraW5kID09IG90aGVyLmtpbmQgJiYKICAgICAgICBkYXRhID09IG90aGVyLmRhdGE7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnTW9kdWxhckV4cHJlc3Npb24oa2luZD0ka2luZCxkYXRhPScpOwogICAgaWYgKGRhdGEgaXMgQ29uc3RhbnRWYWx1ZSkgewogICAgICBzYi53cml0ZSgoZGF0YSBhcyBDb25zdGFudFZhbHVlKS50b1N0cnVjdHVyZWRUZXh0KCkpOwogICAgfSBlbHNlIHsKICAgICAgc2Iud3JpdGUoZGF0YSk7CiAgICB9CiAgICBzYi53cml0ZSgnLHZhbHVlPSRfdmFsdWUpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCmVudW0gSnNOb2RlS2luZCB7CiAgY29tbWVudCwKICBhd2FpdCwKICByZWdFeHBMaXRlcmFsLAogIHByb3BlcnR5LAogIG9iamVjdEluaXRpYWxpemVyLAogIGFycmF5SG9sZSwKICBhcnJheUluaXRpYWxpemVyLAogIHBhcmVudGhlc2VzLAogIG1vZHVsYXJOYW1lLAogIGFzeW5jTmFtZSwKICBzdHJpbmdCYWNrZWROYW1lLAogIHN0cmluZ0NvbmNhdGVuYXRpb24sCiAgbGl0ZXJhbE51bGwsCiAgbGl0ZXJhbE51bWJlciwKICBsaXRlcmFsU3RyaW5nLAogIGxpdGVyYWxTdHJpbmdGcm9tTmFtZSwKICBsaXRlcmFsQm9vbCwKICBtb2R1bGFyRXhwcmVzc2lvbiwKICBmdW5jdGlvbiwKICBuYW1lZEZ1bmN0aW9uLAogIGFjY2VzcywKICBwYXJhbWV0ZXIsCiAgdmFyaWFibGVEZWNsYXJhdGlvbiwKICB0aGlzRXhwcmVzc2lvbiwKICB2YXJpYWJsZVVzZSwKICBwb3N0Zml4LAogIHByZWZpeCwKICBiaW5hcnksCiAgY2FsbEV4cHJlc3Npb24sCiAgbmV3RXhwcmVzc2lvbiwKICBjb25kaXRpb25hbCwKICB2YXJpYWJsZUluaXRpYWxpemF0aW9uLAogIGFzc2lnbm1lbnQsCiAgdmFyaWFibGVEZWNsYXJhdGlvbkxpc3QsCiAgbGl0ZXJhbEV4cHJlc3Npb24sCiAgZGFydFlpZWxkLAogIGxpdGVyYWxTdGF0ZW1lbnQsCiAgbGFiZWxlZFN0YXRlbWVudCwKICBmdW5jdGlvbkRlY2xhcmF0aW9uLAogIHN3aXRjaERlZmF1bHQsCiAgc3dpdGNoQ2FzZSwKICBzd2l0Y2hTdGF0ZW1lbnQsCiAgY2F0Y2hDbGF1c2UsCiAgdHJ5U3RhdGVtZW50LAogIHRocm93U3RhdGVtZW50LAogIHJldHVyblN0YXRlbWVudCwKICBicmVha1N0YXRlbWVudCwKICBjb250aW51ZVN0YXRlbWVudCwKICBkb1N0YXRlbWVudCwKICB3aGlsZVN0YXRlbWVudCwKICBmb3JJblN0YXRlbWVudCwKICBmb3JTdGF0ZW1lbnQsCiAgaWZTdGF0ZW1lbnQsCiAgZW1wdHlTdGF0ZW1lbnQsCiAgZXhwcmVzc2lvblN0YXRlbWVudCwKICBibG9jaywKICBwcm9ncmFtLAp9CgovLy8gVGFncyB1c2VkIGZvciBkZWJ1Z2dpbmcgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gYm91bmRhcnkgbWlzbWF0Y2hlcy4KY2xhc3MgSnNOb2RlVGFncyB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnanMtbm9kZSc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBjb21tZW50ID0gJ2pzLWNvbW1lbnQnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgYXdhaXQgPSAnanMtYXdhaXQnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgcmVnRXhwTGl0ZXJhbCA9ICdqcy1yZWdFeHBMaXRlcmFsJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHByb3BlcnR5ID0gJ2pzLXByb3BlcnR5JzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIG9iamVjdEluaXRpYWxpemVyID0gJ2pzLW9iamVjdEluaXRpYWxpemVyJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGFycmF5SG9sZSA9ICdqcy1hcnJheUhvbGUnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgYXJyYXlJbml0aWFsaXplciA9ICdqcy1hcnJheUluaXRpYWxpemVyJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHBhcmVudGhlc2VzID0gJ2pzLXBhcmVudGhlc2VzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIG1vZHVsYXJOYW1lID0gJ2pzLW1vZHVsYXJOYW1lJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGFzeW5jTmFtZSA9ICdqcy1hc3luY05hbWUnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgc3RyaW5nQmFja2VkTmFtZSA9ICdqcy1zdHJpbmdCYWNrZWROYW1lJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHN0cmluZ0NvbmNhdGVuYXRpb24gPSAnanMtc3RyaW5nQ29uY2F0ZW5hdGlvbic7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBsaXRlcmFsTnVsbCA9ICdqcy1saXRlcmFsTnVsbCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBsaXRlcmFsTnVtYmVyID0gJ2pzLWxpdGVyYWxOdW1iZXInOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgbGl0ZXJhbFN0cmluZyA9ICdqcy1saXRlcmFsU3RyaW5nJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGxpdGVyYWxTdHJpbmdGcm9tTmFtZSA9ICdqcy1saXRlcmFsU3RyaW5nRnJvbU5hbWUnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgbGl0ZXJhbEJvb2wgPSAnanMtbGl0ZXJhbEJvb2wnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgbW9kdWxhckV4cHJlc3Npb24gPSAnanMtbW9kdWxhckV4cHJlc3Npb24nOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZnVuY3Rpb24gPSAnanMtZnVuY3Rpb24nOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgbmFtZWRGdW5jdGlvbiA9ICdqcy1uYW1lZEZ1bmN0aW9uJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGFjY2VzcyA9ICdqcy1hY2Nlc3MnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgcGFyYW1ldGVyID0gJ2pzLXBhcmFtZXRlcic7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB2YXJpYWJsZURlY2xhcmF0aW9uID0gJ2pzLXZhcmlhYmxlRGVjbGFyYXRpb24nOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGhpc0V4cHJlc3Npb24gPSAnanMtdGhpc0V4cHJlc3Npb24nOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgdmFyaWFibGVVc2UgPSAnanMtdmFyaWFibGVVc2UnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgcG9zdGZpeCA9ICdqcy1wb3N0Zml4JzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHByZWZpeCA9ICdqcy1wcmVmaXgnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgYmluYXJ5ID0gJ2pzLWJpbmFyeSc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBjYWxsRXhwcmVzc2lvbiA9ICdqcy1jYWxsRXhwcmVzc2lvbic7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBuZXdFeHByZXNzaW9uID0gJ2pzLW5ld0V4cHJlc3Npb24nOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgY29uZGl0aW9uYWwgPSAnanMtY29uZGl0aW9uYWwnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgdmFyaWFibGVJbml0aWFsaXphdGlvbiA9ICdqcy12YXJpYWJsZUluaXRpYWxpemF0aW9uJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGFzc2lnbm1lbnQgPSAnanMtYXNzaWdubWVudCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB2YXJpYWJsZURlY2xhcmF0aW9uTGlzdCA9ICdqcy12YXJpYWJsZURlY2xhcmF0aW9uTGlzdCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBsaXRlcmFsRXhwcmVzc2lvbiA9ICdqcy1saXRlcmFsRXhwcmVzc2lvbic7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBkYXJ0WWllbGQgPSAnanMtZGFydFlpZWxkJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGxpdGVyYWxTdGF0ZW1lbnQgPSAnanMtbGl0ZXJhbFN0YXRlbWVudCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBsYWJlbGVkU3RhdGVtZW50ID0gJ2pzLWxhYmVsZWRTdGF0ZW1lbnQnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZnVuY3Rpb25EZWNsYXJhdGlvbiA9ICdqcy1mdW5jdGlvbkRlY2xhcmF0aW9uJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHN3aXRjaERlZmF1bHQgPSAnanMtc3dpdGNoRGVmYXVsdCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBzd2l0Y2hDYXNlID0gJ2pzLXN3aXRjaENhc2UnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgc3dpdGNoU3RhdGVtZW50ID0gJ2pzLXN3aXRjaFN0YXRlbWVudCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBjYXRjaENsYXVzZSA9ICdqcy1jYXRjaENsYXVzZSc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0cnlTdGF0ZW1lbnQgPSAnanMtdHJ5U3RhdGVtZW50JzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRocm93U3RhdGVtZW50ID0gJ2pzLXRocm93U3RhdGVtZW50JzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHJldHVyblN0YXRlbWVudCA9ICdqcy1yZXR1cm5TdGF0ZW1lbnQnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgYnJlYWtTdGF0ZW1lbnQgPSAnanMtYnJlYWtTdGF0ZW1lbnQnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgY29udGludWVTdGF0ZW1lbnQgPSAnanMtY29udGludWVTdGF0ZW1lbnQnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZG9TdGF0ZW1lbnQgPSAnanMtZG9TdGF0ZW1lbnQnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgd2hpbGVTdGF0ZW1lbnQgPSAnanMtd2hpbGVTdGF0ZW1lbnQnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZm9ySW5TdGF0ZW1lbnQgPSAnanMtZm9ySW5TdGF0ZW1lbnQnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZm9yU3RhdGVtZW50ID0gJ2pzLWZvclN0YXRlbWVudCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBpZlN0YXRlbWVudCA9ICdqcy1pZlN0YXRlbWVudCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBlbXB0eVN0YXRlbWVudCA9ICdqcy1lbXB0eVN0YXRlbWVudCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBleHByZXNzaW9uU3RhdGVtZW50ID0gJ2pzLWV4cHJlc3Npb25TdGF0ZW1lbnQnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgYmxvY2sgPSAnanMtYmxvY2snOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgcHJvZ3JhbSA9ICdqcy1wcm9ncmFtJzsKfQoKLy8vIFZpc2l0b3IgdGhhdCBzZXJpYWxpemVzIGEgW2pzLk5vZGVdIGludG8gYSBbRGF0YVNpbmtdLgpjbGFzcyBKc05vZGVTZXJpYWxpemVyIGltcGxlbWVudHMganMuTm9kZVZpc2l0b3I8dm9pZD4gewogIGZpbmFsIERhdGFTaW5rIHNpbms7CgogIEpzTm9kZVNlcmlhbGl6ZXIuXyh0aGlzLnNpbmspOwoKICBzdGF0aWMgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaywganMuTm9kZSBub2RlKSB7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MudGFnKTsKICAgIEpzTm9kZVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBKc05vZGVTZXJpYWxpemVyLl8oc2luayk7CiAgICBzZXJpYWxpemVyLnZpc2l0KG5vZGUpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy50YWcpOwogIH0KCiAgdm9pZCB2aXNpdChqcy5Ob2RlIG5vZGUsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAoYWxsb3dOdWxsKSB7CiAgICAgIHNpbmsud3JpdGVCb29sKG5vZGUgIT0gbnVsbCk7CiAgICAgIGlmIChub2RlICE9IG51bGwpIHsKICAgICAgICBub2RlLmFjY2VwdCh0aGlzKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0TGlzdChJdGVyYWJsZTxqcy5Ob2RlPiBub2RlcykgewogICAgc2luay53cml0ZUxpc3Qobm9kZXMsIHZpc2l0KTsKICB9CgogIHZvaWQgX3dyaXRlSW5mbyhqcy5Ob2RlIG5vZGUpIHsKICAgIHNpbmsud3JpdGVDYWNoZWQ8U291cmNlSW5mb3JtYXRpb24+KG5vZGUuc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgKFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAgIFNvdXJjZUluZm9ybWF0aW9uLndyaXRlVG9EYXRhU2luayhzaW5rLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbihqcy5JbnRlcnBvbGF0ZWREZWNsYXJhdGlvbiBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignSnNOb2RlU2VyaWFsaXplci52aXNpdEludGVycG9sYXRlZERlY2xhcmF0aW9uJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50ZXJwb2xhdGVkU3RhdGVtZW50KGpzLkludGVycG9sYXRlZFN0YXRlbWVudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignSnNOb2RlU2VyaWFsaXplci52aXNpdEludGVycG9sYXRlZFN0YXRlbWVudCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVycG9sYXRlZFNlbGVjdG9yKGpzLkludGVycG9sYXRlZFNlbGVjdG9yIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdKc05vZGVTZXJpYWxpemVyLnZpc2l0SW50ZXJwb2xhdGVkRGVjbGFyYXRpb24nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIoanMuSW50ZXJwb2xhdGVkUGFyYW1ldGVyIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdKc05vZGVTZXJpYWxpemVyLnZpc2l0SW50ZXJwb2xhdGVkUGFyYW1ldGVyJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50ZXJwb2xhdGVkTGl0ZXJhbChqcy5JbnRlcnBvbGF0ZWRMaXRlcmFsIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdKc05vZGVTZXJpYWxpemVyLnZpc2l0SW50ZXJwb2xhdGVkTGl0ZXJhbCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVycG9sYXRlZEV4cHJlc3Npb24oanMuSW50ZXJwb2xhdGVkRXhwcmVzc2lvbiBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignSnNOb2RlU2VyaWFsaXplci52aXNpdEludGVycG9sYXRlZEV4cHJlc3Npb24nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb21tZW50KGpzLkNvbW1lbnQgbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5jb21tZW50KTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5jb21tZW50KTsKICAgIHNpbmsud3JpdGVTdHJpbmcobm9kZS5jb21tZW50KTsKICAgIHNpbmsuZW5kKEpzTm9kZVRhZ3MuY29tbWVudCk7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEF3YWl0KGpzLkF3YWl0IG5vZGUpIHsKICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQuYXdhaXQpOwogICAgc2luay5iZWdpbihKc05vZGVUYWdzLmF3YWl0KTsKICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLmF3YWl0KTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UmVnRXhwTGl0ZXJhbChqcy5SZWdFeHBMaXRlcmFsIG5vZGUpIHsKICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQucmVnRXhwTGl0ZXJhbCk7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MucmVnRXhwTGl0ZXJhbCk7CiAgICBzaW5rLndyaXRlU3RyaW5nKG5vZGUucGF0dGVybik7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLnJlZ0V4cExpdGVyYWwpOwogICAgX3dyaXRlSW5mbyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQcm9wZXJ0eShqcy5Qcm9wZXJ0eSBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLnByb3BlcnR5KTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5wcm9wZXJ0eSk7CiAgICB2aXNpdChub2RlLm5hbWUpOwogICAgdmlzaXQobm9kZS52YWx1ZSk7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLnByb3BlcnR5KTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0T2JqZWN0SW5pdGlhbGl6ZXIoanMuT2JqZWN0SW5pdGlhbGl6ZXIgbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5vYmplY3RJbml0aWFsaXplcik7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3Mub2JqZWN0SW5pdGlhbGl6ZXIpOwogICAgdmlzaXRMaXN0KG5vZGUucHJvcGVydGllcyk7CiAgICBzaW5rLndyaXRlQm9vbChub2RlLmlzT25lTGluZXIpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5vYmplY3RJbml0aWFsaXplcik7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEFycmF5SG9sZShqcy5BcnJheUhvbGUgbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5hcnJheUhvbGUpOwogICAgc2luay5iZWdpbihKc05vZGVUYWdzLmFycmF5SG9sZSk7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLmFycmF5SG9sZSk7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEFycmF5SW5pdGlhbGl6ZXIoanMuQXJyYXlJbml0aWFsaXplciBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLmFycmF5SW5pdGlhbGl6ZXIpOwogICAgc2luay5iZWdpbihKc05vZGVUYWdzLmFycmF5SW5pdGlhbGl6ZXIpOwogICAgdmlzaXRMaXN0KG5vZGUuZWxlbWVudHMpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5hcnJheUluaXRpYWxpemVyKTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UGFyZW50aGVzZXMoanMuUGFyZW50aGVzZXMgbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5wYXJlbnRoZXNlcyk7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MucGFyZW50aGVzZXMpOwogICAgdmlzaXQobm9kZS5lbmNsb3NlZCk7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLnBhcmVudGhlc2VzKTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmFtZShqcy5OYW1lIG5vZGUpIHsKICAgIGlmIChub2RlIGlzIE1vZHVsYXJOYW1lKSB7CiAgICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQubW9kdWxhck5hbWUpOwogICAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MubW9kdWxhck5hbWUpOwogICAgICBub2RlLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgICAgc2luay5lbmQoSnNOb2RlVGFncy5tb2R1bGFyTmFtZSk7CiAgICAgIF93cml0ZUluZm8obm9kZSk7CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgQXN5bmNOYW1lKSB7CiAgICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQuYXN5bmNOYW1lKTsKICAgICAgc2luay5iZWdpbihKc05vZGVUYWdzLmFzeW5jTmFtZSk7CiAgICAgIHZpc2l0KG5vZGUucHJlZml4KTsKICAgICAgdmlzaXQobm9kZS5iYXNlKTsKICAgICAgc2luay5lbmQoSnNOb2RlVGFncy5hc3luY05hbWUpOwogICAgICBfd3JpdGVJbmZvKG5vZGUpOwogICAgfSBlbHNlIGlmIChub2RlIGlzIFN0cmluZ0JhY2tlZE5hbWUpIHsKICAgICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5zdHJpbmdCYWNrZWROYW1lKTsKICAgICAgc2luay5iZWdpbihKc05vZGVUYWdzLnN0cmluZ0JhY2tlZE5hbWUpOwogICAgICBzaW5rLndyaXRlU3RyaW5nKG5vZGUubmFtZSk7CiAgICAgIHNpbmsuZW5kKEpzTm9kZVRhZ3Muc3RyaW5nQmFja2VkTmFtZSk7CiAgICAgIF93cml0ZUluZm8obm9kZSk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICdVbmV4cGVjdGVkIGRlZmVycmVkIGV4cHJlc3Npb246ICR7bm9kZS5ydW50aW1lVHlwZX0uJyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihqcy5TdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQuc3RyaW5nQ29uY2F0ZW5hdGlvbik7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3Muc3RyaW5nQ29uY2F0ZW5hdGlvbik7CiAgICB2aXNpdExpc3Qobm9kZS5wYXJ0cyk7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLnN0cmluZ0NvbmNhdGVuYXRpb24pOwogICAgX3dyaXRlSW5mbyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXRlcmFsTnVsbChqcy5MaXRlcmFsTnVsbCBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLmxpdGVyYWxOdWxsKTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5saXRlcmFsTnVsbCk7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLmxpdGVyYWxOdWxsKTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGl0ZXJhbE51bWJlcihqcy5MaXRlcmFsTnVtYmVyIG5vZGUpIHsKICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQubGl0ZXJhbE51bWJlcik7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MubGl0ZXJhbE51bWJlcik7CiAgICBzaW5rLndyaXRlU3RyaW5nKG5vZGUudmFsdWUpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5saXRlcmFsTnVtYmVyKTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGl0ZXJhbFN0cmluZyhqcy5MaXRlcmFsU3RyaW5nIG5vZGUpIHsKICAgIGlmIChub2RlIGlzIGpzLkxpdGVyYWxTdHJpbmdGcm9tTmFtZSkgewogICAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLmxpdGVyYWxTdHJpbmdGcm9tTmFtZSk7CiAgICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5saXRlcmFsU3RyaW5nRnJvbU5hbWUpOwogICAgICB2aXNpdChub2RlLm5hbWUpOwogICAgICBzaW5rLmVuZChKc05vZGVUYWdzLmxpdGVyYWxTdHJpbmdGcm9tTmFtZSk7CiAgICB9IGVsc2UgewogICAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLmxpdGVyYWxTdHJpbmcpOwogICAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MubGl0ZXJhbFN0cmluZyk7CiAgICAgIHNpbmsud3JpdGVTdHJpbmcobm9kZS52YWx1ZSk7CiAgICAgIHNpbmsuZW5kKEpzTm9kZVRhZ3MubGl0ZXJhbFN0cmluZyk7CiAgICB9CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpdGVyYWxCb29sKGpzLkxpdGVyYWxCb29sIG5vZGUpIHsKICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQubGl0ZXJhbEJvb2wpOwogICAgc2luay5iZWdpbihKc05vZGVUYWdzLmxpdGVyYWxCb29sKTsKICAgIHNpbmsud3JpdGVCb29sKG5vZGUudmFsdWUpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5saXRlcmFsQm9vbCk7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERlZmVycmVkU3RyaW5nKGpzLkRlZmVycmVkU3RyaW5nIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdKc05vZGVTZXJpYWxpemVyLnZpc2l0RGVmZXJyZWRTdHJpbmcnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREZWZlcnJlZE51bWJlcihqcy5EZWZlcnJlZE51bWJlciBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignSnNOb2RlU2VyaWFsaXplci52aXNpdERlZmVycmVkTnVtYmVyJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RGVmZXJyZWRFeHByZXNzaW9uKGpzLkRlZmVycmVkRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpZiAobm9kZSBpcyBNb2R1bGFyRXhwcmVzc2lvbikgewogICAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLm1vZHVsYXJFeHByZXNzaW9uKTsKICAgICAgc2luay5iZWdpbihKc05vZGVUYWdzLm1vZHVsYXJFeHByZXNzaW9uKTsKICAgICAgbm9kZS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICAgIHNpbmsuZW5kKEpzTm9kZVRhZ3MubW9kdWxhckV4cHJlc3Npb24pOwogICAgICBfd3JpdGVJbmZvKG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAnVW5leHBlY3RlZCBkZWZlcnJlZCBleHByZXNzaW9uOiAke25vZGUucnVudGltZVR5cGV9LicpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZ1bihqcy5GdW4gbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5mdW5jdGlvbik7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MuZnVuY3Rpb24pOwogICAgdmlzaXRMaXN0KG5vZGUucGFyYW1zKTsKICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgICBzaW5rLndyaXRlRW51bShub2RlLmFzeW5jTW9kaWZpZXIpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5mdW5jdGlvbik7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE5hbWVkRnVuY3Rpb24oanMuTmFtZWRGdW5jdGlvbiBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLm5hbWVkRnVuY3Rpb24pOwogICAgc2luay5iZWdpbihKc05vZGVUYWdzLm5hbWVkRnVuY3Rpb24pOwogICAgdmlzaXQobm9kZS5uYW1lKTsKICAgIHZpc2l0KG5vZGUuZnVuY3Rpb24pOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5uYW1lZEZ1bmN0aW9uKTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QWNjZXNzKGpzLlByb3BlcnR5QWNjZXNzIG5vZGUpIHsKICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQuYWNjZXNzKTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5hY2Nlc3MpOwogICAgdmlzaXQobm9kZS5yZWNlaXZlcik7CiAgICB2aXNpdChub2RlLnNlbGVjdG9yKTsKICAgIHNpbmsuZW5kKEpzTm9kZVRhZ3MuYWNjZXNzKTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UGFyYW1ldGVyKGpzLlBhcmFtZXRlciBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLnBhcmFtZXRlcik7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MucGFyYW1ldGVyKTsKICAgIHNpbmsud3JpdGVTdHJpbmcobm9kZS5uYW1lKTsKICAgIHNpbmsuZW5kKEpzTm9kZVRhZ3MucGFyYW1ldGVyKTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihqcy5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQudmFyaWFibGVEZWNsYXJhdGlvbik7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MudmFyaWFibGVEZWNsYXJhdGlvbik7CiAgICBzaW5rLndyaXRlU3RyaW5nKG5vZGUubmFtZSk7CiAgICBzaW5rLndyaXRlQm9vbChub2RlLmFsbG93UmVuYW1lKTsKICAgIHNpbmsuZW5kKEpzTm9kZVRhZ3MudmFyaWFibGVEZWNsYXJhdGlvbik7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRoaXMoanMuVGhpcyBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLnRoaXNFeHByZXNzaW9uKTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy50aGlzRXhwcmVzc2lvbik7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLnRoaXNFeHByZXNzaW9uKTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VmFyaWFibGVVc2UoanMuVmFyaWFibGVVc2Ugbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC52YXJpYWJsZVVzZSk7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MudmFyaWFibGVVc2UpOwogICAgc2luay53cml0ZVN0cmluZyhub2RlLm5hbWUpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy52YXJpYWJsZVVzZSk7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFBvc3RmaXgoanMuUG9zdGZpeCBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLnBvc3RmaXgpOwogICAgc2luay5iZWdpbihKc05vZGVUYWdzLnBvc3RmaXgpOwogICAgc2luay53cml0ZVN0cmluZyhub2RlLm9wKTsKICAgIHZpc2l0KG5vZGUuYXJndW1lbnQpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5wb3N0Zml4KTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJlZml4KGpzLlByZWZpeCBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLnByZWZpeCk7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MucHJlZml4KTsKICAgIHNpbmsud3JpdGVTdHJpbmcobm9kZS5vcCk7CiAgICB2aXNpdChub2RlLmFyZ3VtZW50KTsKICAgIHNpbmsuZW5kKEpzTm9kZVRhZ3MucHJlZml4KTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmluYXJ5KGpzLkJpbmFyeSBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLmJpbmFyeSk7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MuYmluYXJ5KTsKICAgIHNpbmsud3JpdGVTdHJpbmcobm9kZS5vcCk7CiAgICB2aXNpdChub2RlLmxlZnQpOwogICAgdmlzaXQobm9kZS5yaWdodCk7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLmJpbmFyeSk7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENhbGwoanMuQ2FsbCBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLmNhbGxFeHByZXNzaW9uKTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5jYWxsRXhwcmVzc2lvbik7CiAgICB2aXNpdChub2RlLnRhcmdldCk7CiAgICB2aXNpdExpc3Qobm9kZS5hcmd1bWVudHMpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5jYWxsRXhwcmVzc2lvbik7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE5ldyhqcy5OZXcgbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5uZXdFeHByZXNzaW9uKTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5uZXdFeHByZXNzaW9uKTsKICAgIHZpc2l0KG5vZGUudGFyZ2V0KTsKICAgIHZpc2l0TGlzdChub2RlLmFyZ3VtZW50cyk7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLm5ld0V4cHJlc3Npb24pOwogICAgX3dyaXRlSW5mbyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25kaXRpb25hbChqcy5Db25kaXRpb25hbCBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLmNvbmRpdGlvbmFsKTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5jb25kaXRpb25hbCk7CiAgICB2aXNpdChub2RlLmNvbmRpdGlvbik7CiAgICB2aXNpdChub2RlLnRoZW4pOwogICAgdmlzaXQobm9kZS5vdGhlcndpc2UpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5jb25kaXRpb25hbCk7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlSW5pdGlhbGl6YXRpb24oanMuVmFyaWFibGVJbml0aWFsaXphdGlvbiBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLnZhcmlhYmxlSW5pdGlhbGl6YXRpb24pOwogICAgc2luay5iZWdpbihKc05vZGVUYWdzLnZhcmlhYmxlSW5pdGlhbGl6YXRpb24pOwogICAgdmlzaXQobm9kZS5kZWNsYXJhdGlvbik7CiAgICB2aXNpdChub2RlLnZhbHVlLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy52YXJpYWJsZUluaXRpYWxpemF0aW9uKTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXNzaWdubWVudChqcy5Bc3NpZ25tZW50IG5vZGUpIHsKICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQuYXNzaWdubWVudCk7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MuYXNzaWdubWVudCk7CiAgICB2aXNpdChub2RlLmxlZnRIYW5kU2lkZSk7CiAgICBzaW5rLndyaXRlU3RyaW5nT3JOdWxsKG5vZGUub3ApOwogICAgdmlzaXQobm9kZS52YWx1ZSk7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLmFzc2lnbm1lbnQpOwogICAgX3dyaXRlSW5mbyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLnZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy52YXJpYWJsZURlY2xhcmF0aW9uTGlzdCk7CiAgICB2aXNpdExpc3Qobm9kZS5kZWNsYXJhdGlvbnMpOwogICAgc2luay53cml0ZUJvb2wobm9kZS5pbmRlbnRTcGxpdHMpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy52YXJpYWJsZURlY2xhcmF0aW9uTGlzdCk7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpdGVyYWxFeHByZXNzaW9uKGpzLkxpdGVyYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQubGl0ZXJhbEV4cHJlc3Npb24pOwogICAgc2luay5iZWdpbihKc05vZGVUYWdzLmxpdGVyYWxFeHByZXNzaW9uKTsKICAgIHNpbmsud3JpdGVTdHJpbmcobm9kZS50ZW1wbGF0ZSk7CiAgICB2aXNpdExpc3Qobm9kZS5pbnB1dHMpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5saXRlcmFsRXhwcmVzc2lvbik7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERhcnRZaWVsZChqcy5EYXJ0WWllbGQgbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5kYXJ0WWllbGQpOwogICAgc2luay5iZWdpbihKc05vZGVUYWdzLmRhcnRZaWVsZCk7CiAgICB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogICAgc2luay53cml0ZUJvb2wobm9kZS5oYXNTdGFyKTsKICAgIHNpbmsuZW5kKEpzTm9kZVRhZ3MuZGFydFlpZWxkKTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGl0ZXJhbFN0YXRlbWVudChqcy5MaXRlcmFsU3RhdGVtZW50IG5vZGUpIHsKICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQubGl0ZXJhbFN0YXRlbWVudCk7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MubGl0ZXJhbFN0YXRlbWVudCk7CiAgICBzaW5rLndyaXRlU3RyaW5nKG5vZGUuY29kZSk7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLmxpdGVyYWxTdGF0ZW1lbnQpOwogICAgX3dyaXRlSW5mbyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMYWJlbGVkU3RhdGVtZW50KGpzLkxhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5sYWJlbGVkU3RhdGVtZW50KTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5sYWJlbGVkU3RhdGVtZW50KTsKICAgIHNpbmsud3JpdGVTdHJpbmcobm9kZS5sYWJlbCk7CiAgICB2aXNpdChub2RlLmJvZHkpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5sYWJlbGVkU3RhdGVtZW50KTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihqcy5GdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQuZnVuY3Rpb25EZWNsYXJhdGlvbik7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MuZnVuY3Rpb25EZWNsYXJhdGlvbik7CiAgICB2aXNpdChub2RlLm5hbWUpOwogICAgdmlzaXQobm9kZS5mdW5jdGlvbik7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLmZ1bmN0aW9uRGVjbGFyYXRpb24pOwogICAgX3dyaXRlSW5mbyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREZWZhdWx0KGpzLkRlZmF1bHQgbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5zd2l0Y2hEZWZhdWx0KTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5zd2l0Y2hEZWZhdWx0KTsKICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLnN3aXRjaERlZmF1bHQpOwogICAgX3dyaXRlSW5mbyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDYXNlKGpzLkNhc2Ugbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5zd2l0Y2hDYXNlKTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5zd2l0Y2hDYXNlKTsKICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICB2aXNpdChub2RlLmJvZHkpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5zd2l0Y2hDYXNlKTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3dpdGNoKGpzLlN3aXRjaCBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLnN3aXRjaFN0YXRlbWVudCk7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3Muc3dpdGNoU3RhdGVtZW50KTsKICAgIHZpc2l0KG5vZGUua2V5KTsKICAgIHZpc2l0TGlzdChub2RlLmNhc2VzKTsKICAgIHNpbmsuZW5kKEpzTm9kZVRhZ3Muc3dpdGNoU3RhdGVtZW50KTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2F0Y2goanMuQ2F0Y2ggbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5jYXRjaENsYXVzZSk7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MuY2F0Y2hDbGF1c2UpOwogICAgdmlzaXQobm9kZS5kZWNsYXJhdGlvbik7CiAgICB2aXNpdChub2RlLmJvZHkpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5jYXRjaENsYXVzZSk7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRyeShqcy5Ucnkgbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC50cnlTdGF0ZW1lbnQpOwogICAgc2luay5iZWdpbihKc05vZGVUYWdzLnRyeVN0YXRlbWVudCk7CiAgICB2aXNpdChub2RlLmJvZHkpOwogICAgdmlzaXQobm9kZS5jYXRjaFBhcnQsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICB2aXNpdChub2RlLmZpbmFsbHlQYXJ0LCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy50cnlTdGF0ZW1lbnQpOwogICAgX3dyaXRlSW5mbyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUaHJvdyhqcy5UaHJvdyBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLnRocm93U3RhdGVtZW50KTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy50aHJvd1N0YXRlbWVudCk7CiAgICB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogICAgc2luay5lbmQoSnNOb2RlVGFncy50aHJvd1N0YXRlbWVudCk7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJldHVybihqcy5SZXR1cm4gbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5yZXR1cm5TdGF0ZW1lbnQpOwogICAgc2luay5iZWdpbihKc05vZGVUYWdzLnJldHVyblN0YXRlbWVudCk7CiAgICB2aXNpdChub2RlLnZhbHVlLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5yZXR1cm5TdGF0ZW1lbnQpOwogICAgX3dyaXRlSW5mbyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCcmVhayhqcy5CcmVhayBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLmJyZWFrU3RhdGVtZW50KTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5icmVha1N0YXRlbWVudCk7CiAgICBzaW5rLndyaXRlU3RyaW5nT3JOdWxsKG5vZGUudGFyZ2V0TGFiZWwpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5icmVha1N0YXRlbWVudCk7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnRpbnVlKGpzLkNvbnRpbnVlIG5vZGUpIHsKICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQuY29udGludWVTdGF0ZW1lbnQpOwogICAgc2luay5iZWdpbihKc05vZGVUYWdzLmNvbnRpbnVlU3RhdGVtZW50KTsKICAgIHNpbmsud3JpdGVTdHJpbmdPck51bGwobm9kZS50YXJnZXRMYWJlbCk7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLmNvbnRpbnVlU3RhdGVtZW50KTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RG8oanMuRG8gbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5kb1N0YXRlbWVudCk7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MuZG9TdGF0ZW1lbnQpOwogICAgdmlzaXQobm9kZS5ib2R5KTsKICAgIHZpc2l0KG5vZGUuY29uZGl0aW9uKTsKICAgIHNpbmsuZW5kKEpzTm9kZVRhZ3MuZG9TdGF0ZW1lbnQpOwogICAgX3dyaXRlSW5mbyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRXaGlsZShqcy5XaGlsZSBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLndoaWxlU3RhdGVtZW50KTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy53aGlsZVN0YXRlbWVudCk7CiAgICB2aXNpdChub2RlLmNvbmRpdGlvbik7CiAgICB2aXNpdChub2RlLmJvZHkpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy53aGlsZVN0YXRlbWVudCk7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZvckluKGpzLkZvckluIG5vZGUpIHsKICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQuZm9ySW5TdGF0ZW1lbnQpOwogICAgc2luay5iZWdpbihKc05vZGVUYWdzLmZvckluU3RhdGVtZW50KTsKICAgIHZpc2l0KG5vZGUubGVmdEhhbmRTaWRlKTsKICAgIHZpc2l0KG5vZGUub2JqZWN0KTsKICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLmZvckluU3RhdGVtZW50KTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Rm9yKGpzLkZvciBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLmZvclN0YXRlbWVudCk7CiAgICBzaW5rLmJlZ2luKEpzTm9kZVRhZ3MuZm9yU3RhdGVtZW50KTsKICAgIHZpc2l0KG5vZGUuaW5pdCwgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHZpc2l0KG5vZGUuY29uZGl0aW9uLCBhbGxvd051bGw6IHRydWUpOwogICAgdmlzaXQobm9kZS51cGRhdGUsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICB2aXNpdChub2RlLmJvZHkpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5mb3JTdGF0ZW1lbnQpOwogICAgX3dyaXRlSW5mbyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJZihqcy5JZiBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLmlmU3RhdGVtZW50KTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5pZlN0YXRlbWVudCk7CiAgICB2aXNpdChub2RlLmNvbmRpdGlvbik7CiAgICB2aXNpdChub2RlLnRoZW4pOwogICAgdmlzaXQobm9kZS5vdGhlcndpc2UpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5pZlN0YXRlbWVudCk7CiAgICBfd3JpdGVJbmZvKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEVtcHR5U3RhdGVtZW50KGpzLkVtcHR5U3RhdGVtZW50IG5vZGUpIHsKICAgIHNpbmsud3JpdGVFbnVtKEpzTm9kZUtpbmQuZW1wdHlTdGF0ZW1lbnQpOwogICAgc2luay5iZWdpbihKc05vZGVUYWdzLmVtcHR5U3RhdGVtZW50KTsKICAgIHNpbmsuZW5kKEpzTm9kZVRhZ3MuZW1wdHlTdGF0ZW1lbnQpOwogICAgX3dyaXRlSW5mbyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KGpzLkV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5leHByZXNzaW9uU3RhdGVtZW50KTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5leHByZXNzaW9uU3RhdGVtZW50KTsKICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICBzaW5rLmVuZChKc05vZGVUYWdzLmV4cHJlc3Npb25TdGF0ZW1lbnQpOwogICAgX3dyaXRlSW5mbyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCbG9jayhqcy5CbG9jayBub2RlKSB7CiAgICBzaW5rLndyaXRlRW51bShKc05vZGVLaW5kLmJsb2NrKTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5ibG9jayk7CiAgICB2aXNpdExpc3Qobm9kZS5zdGF0ZW1lbnRzKTsKICAgIHNpbmsuZW5kKEpzTm9kZVRhZ3MuYmxvY2spOwogICAgX3dyaXRlSW5mbyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQcm9ncmFtKGpzLlByb2dyYW0gbm9kZSkgewogICAgc2luay53cml0ZUVudW0oSnNOb2RlS2luZC5wcm9ncmFtKTsKICAgIHNpbmsuYmVnaW4oSnNOb2RlVGFncy5wcm9ncmFtKTsKICAgIHZpc2l0TGlzdChub2RlLmJvZHkpOwogICAgc2luay5lbmQoSnNOb2RlVGFncy5wcm9ncmFtKTsKICAgIF93cml0ZUluZm8obm9kZSk7CiAgfQp9CgovLy8gSGVscGVyIGNsYXNzIHRoYXQgZGVzZXJpYWxpemVzIGEgW2pzLk5vZGVdIGZyb20gW0RhdGFTb3VyY2VdLgovLy8KLy8vIERlc2VyaWFsaXplZCBbTW9kdWxhck5hbWVdcyBhbmQgW01vZHVsYXJFeHByZXNzaW9uXXMgYXJlIGNvbGxlY3RlZCBpbiB0aGUKLy8vIFttb2R1bGFyTmFtZXNdIGFuZCBbbW9kdWxhckV4cHJlc3Npb25zXSBsaXN0cy4KY2xhc3MgSnNOb2RlRGVzZXJpYWxpemVyIHsKICBmaW5hbCBEYXRhU291cmNlIHNvdXJjZTsKICBmaW5hbCBMaXN0PE1vZHVsYXJOYW1lPiBtb2R1bGFyTmFtZXM7CiAgZmluYWwgTGlzdDxNb2R1bGFyRXhwcmVzc2lvbj4gbW9kdWxhckV4cHJlc3Npb25zOwoKICBKc05vZGVEZXNlcmlhbGl6ZXIuXyh0aGlzLnNvdXJjZSwgdGhpcy5tb2R1bGFyTmFtZXMsIHRoaXMubW9kdWxhckV4cHJlc3Npb25zKTsKCiAgc3RhdGljIGpzLk5vZGUgcmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwKICAgICAgTGlzdDxNb2R1bGFyTmFtZT4gbW9kdWxhck5hbWVzLAogICAgICBMaXN0PE1vZHVsYXJFeHByZXNzaW9uPiBtb2R1bGFyRXhwcmVzc2lvbnMpIHsKICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLnRhZyk7CiAgICBKc05vZGVEZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyID0KICAgICAgICBuZXcgSnNOb2RlRGVzZXJpYWxpemVyLl8oc291cmNlLCBtb2R1bGFyTmFtZXMsIG1vZHVsYXJFeHByZXNzaW9ucyk7CiAgICBqcy5Ob2RlIG5vZGUgPSBkZXNlcmlhbGl6ZXIucmVhZCgpOwogICAgc291cmNlLmVuZChKc05vZGVUYWdzLnRhZyk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIFQgcmVhZDxUIGV4dGVuZHMganMuTm9kZT4oe2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChhbGxvd051bGwpIHsKICAgICAgYm9vbCBoYXNWYWx1ZSA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgICBpZiAoIWhhc1ZhbHVlKSByZXR1cm4gbnVsbDsKICAgIH0KICAgIEpzTm9kZUtpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShKc05vZGVLaW5kLnZhbHVlcyk7CiAgICBqcy5Ob2RlIG5vZGU7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBKc05vZGVLaW5kLmNvbW1lbnQ6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MuY29tbWVudCk7CiAgICAgICAgbm9kZSA9IG5ldyBqcy5Db21tZW50KHNvdXJjZS5yZWFkU3RyaW5nKCkpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5jb21tZW50KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLmF3YWl0OgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmF3YWl0KTsKICAgICAgICBub2RlID0gbmV3IGpzLkF3YWl0KHJlYWQoKSk7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLmF3YWl0KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLnJlZ0V4cExpdGVyYWw6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MucmVnRXhwTGl0ZXJhbCk7CiAgICAgICAgbm9kZSA9IG5ldyBqcy5SZWdFeHBMaXRlcmFsKHNvdXJjZS5yZWFkU3RyaW5nKCkpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5yZWdFeHBMaXRlcmFsKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLnByb3BlcnR5OgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLnByb3BlcnR5KTsKICAgICAgICBqcy5FeHByZXNzaW9uIG5hbWUgPSByZWFkKCk7CiAgICAgICAganMuRXhwcmVzc2lvbiB2YWx1ZSA9IHJlYWQoKTsKICAgICAgICBub2RlID0gbmV3IGpzLlByb3BlcnR5KG5hbWUsIHZhbHVlKTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MucHJvcGVydHkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQub2JqZWN0SW5pdGlhbGl6ZXI6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3Mub2JqZWN0SW5pdGlhbGl6ZXIpOwogICAgICAgIExpc3Q8anMuUHJvcGVydHk+IHByb3BlcnRpZXMgPSByZWFkTGlzdCgpOwogICAgICAgIGJvb2wgaXNPbmVMaW5lciA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgICAgIG5vZGUgPSBuZXcganMuT2JqZWN0SW5pdGlhbGl6ZXIocHJvcGVydGllcywgaXNPbmVMaW5lcjogaXNPbmVMaW5lcik7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLm9iamVjdEluaXRpYWxpemVyKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLmFycmF5SG9sZToKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy5hcnJheUhvbGUpOwogICAgICAgIG5vZGUgPSBuZXcganMuQXJyYXlIb2xlKCk7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLmFycmF5SG9sZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5hcnJheUluaXRpYWxpemVyOgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmFycmF5SW5pdGlhbGl6ZXIpOwogICAgICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gZWxlbWVudHMgPSByZWFkTGlzdCgpOwogICAgICAgIG5vZGUgPSBuZXcganMuQXJyYXlJbml0aWFsaXplcihlbGVtZW50cyk7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLmFycmF5SW5pdGlhbGl6ZXIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQucGFyZW50aGVzZXM6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MucGFyZW50aGVzZXMpOwogICAgICAgIG5vZGUgPSBuZXcganMuUGFyZW50aGVzZXMocmVhZCgpKTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MucGFyZW50aGVzZXMpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQubW9kdWxhck5hbWU6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MubW9kdWxhck5hbWUpOwogICAgICAgIE1vZHVsYXJOYW1lIG1vZHVsYXJOYW1lID0gTW9kdWxhck5hbWUucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgICAgbW9kdWxhck5hbWVzLmFkZChtb2R1bGFyTmFtZSk7CiAgICAgICAgbm9kZSA9IG1vZHVsYXJOYW1lOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5tb2R1bGFyTmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5hc3luY05hbWU6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MuYXN5bmNOYW1lKTsKICAgICAgICBqcy5OYW1lIHByZWZpeCA9IHJlYWQoKTsKICAgICAgICBqcy5OYW1lIGJhc2UgPSByZWFkKCk7CiAgICAgICAgbm9kZSA9IG5ldyBBc3luY05hbWUocHJlZml4LCBiYXNlKTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MuYXN5bmNOYW1lKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLnN0cmluZ0JhY2tlZE5hbWU6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3Muc3RyaW5nQmFja2VkTmFtZSk7CiAgICAgICAgbm9kZSA9IG5ldyBTdHJpbmdCYWNrZWROYW1lKHNvdXJjZS5yZWFkU3RyaW5nKCkpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5zdHJpbmdCYWNrZWROYW1lKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLnN0cmluZ0NvbmNhdGVuYXRpb246CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3Muc3RyaW5nQ29uY2F0ZW5hdGlvbik7CiAgICAgICAgTGlzdDxqcy5MaXRlcmFsPiBwYXJ0cyA9IHJlYWRMaXN0KCk7CiAgICAgICAgbm9kZSA9IG5ldyBqcy5TdHJpbmdDb25jYXRlbmF0aW9uKHBhcnRzKTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3Muc3RyaW5nQ29uY2F0ZW5hdGlvbik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5saXRlcmFsTnVsbDoKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy5saXRlcmFsTnVsbCk7CiAgICAgICAgbm9kZSA9IG5ldyBqcy5MaXRlcmFsTnVsbCgpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5saXRlcmFsTnVsbCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5saXRlcmFsTnVtYmVyOgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmxpdGVyYWxOdW1iZXIpOwogICAgICAgIG5vZGUgPSBuZXcganMuTGl0ZXJhbE51bWJlcihzb3VyY2UucmVhZFN0cmluZygpKTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MubGl0ZXJhbE51bWJlcik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5saXRlcmFsU3RyaW5nOgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmxpdGVyYWxTdHJpbmcpOwogICAgICAgIG5vZGUgPSBuZXcganMuTGl0ZXJhbFN0cmluZyhzb3VyY2UucmVhZFN0cmluZygpKTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MubGl0ZXJhbFN0cmluZyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5saXRlcmFsU3RyaW5nRnJvbU5hbWU6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MubGl0ZXJhbFN0cmluZ0Zyb21OYW1lKTsKICAgICAgICBqcy5OYW1lIG5hbWUgPSByZWFkKCk7CiAgICAgICAgbm9kZSA9IG5ldyBqcy5MaXRlcmFsU3RyaW5nRnJvbU5hbWUobmFtZSk7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLmxpdGVyYWxTdHJpbmdGcm9tTmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5saXRlcmFsQm9vbDoKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy5saXRlcmFsQm9vbCk7CiAgICAgICAgbm9kZSA9IG5ldyBqcy5MaXRlcmFsQm9vbChzb3VyY2UucmVhZEJvb2woKSk7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLmxpdGVyYWxCb29sKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLm1vZHVsYXJFeHByZXNzaW9uOgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLm1vZHVsYXJFeHByZXNzaW9uKTsKICAgICAgICBNb2R1bGFyRXhwcmVzc2lvbiBtb2R1bGFyRXhwcmVzc2lvbiA9CiAgICAgICAgICAgIE1vZHVsYXJFeHByZXNzaW9uLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICAgIG1vZHVsYXJFeHByZXNzaW9ucy5hZGQobW9kdWxhckV4cHJlc3Npb24pOwogICAgICAgIG5vZGUgPSBtb2R1bGFyRXhwcmVzc2lvbjsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MubW9kdWxhckV4cHJlc3Npb24pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQuZnVuY3Rpb246CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MuZnVuY3Rpb24pOwogICAgICAgIExpc3Q8anMuUGFyYW1ldGVyPiBwYXJhbXMgPSByZWFkTGlzdCgpOwogICAgICAgIGpzLkJsb2NrIGJvZHkgPSByZWFkKCk7CiAgICAgICAganMuQXN5bmNNb2RpZmllciBhc3luY01vZGlmaWVyID0KICAgICAgICAgICAgc291cmNlLnJlYWRFbnVtKGpzLkFzeW5jTW9kaWZpZXIudmFsdWVzKTsKICAgICAgICBub2RlID0gbmV3IGpzLkZ1bihwYXJhbXMsIGJvZHksIGFzeW5jTW9kaWZpZXI6IGFzeW5jTW9kaWZpZXIpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5mdW5jdGlvbik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5uYW1lZEZ1bmN0aW9uOgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLm5hbWVkRnVuY3Rpb24pOwogICAgICAgIGpzLkRlY2xhcmF0aW9uIG5hbWUgPSByZWFkKCk7CiAgICAgICAganMuRnVuIGZ1bmN0aW9uID0gcmVhZCgpOwogICAgICAgIG5vZGUgPSBuZXcganMuTmFtZWRGdW5jdGlvbihuYW1lLCBmdW5jdGlvbik7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLm5hbWVkRnVuY3Rpb24pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQuYWNjZXNzOgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmFjY2Vzcyk7CiAgICAgICAganMuRXhwcmVzc2lvbiByZWNlaXZlciA9IHJlYWQoKTsKICAgICAgICBqcy5FeHByZXNzaW9uIHNlbGVjdG9yID0gcmVhZCgpOwogICAgICAgIG5vZGUgPSBuZXcganMuUHJvcGVydHlBY2Nlc3MocmVjZWl2ZXIsIHNlbGVjdG9yKTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MuYWNjZXNzKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLnBhcmFtZXRlcjoKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy5wYXJhbWV0ZXIpOwogICAgICAgIG5vZGUgPSBuZXcganMuUGFyYW1ldGVyKHNvdXJjZS5yZWFkU3RyaW5nKCkpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5wYXJhbWV0ZXIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQudmFyaWFibGVEZWNsYXJhdGlvbjoKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy52YXJpYWJsZURlY2xhcmF0aW9uKTsKICAgICAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgICAgYm9vbCBhbGxvd1JlbmFtZSA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgICAgIG5vZGUgPSBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbihuYW1lLCBhbGxvd1JlbmFtZTogYWxsb3dSZW5hbWUpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy52YXJpYWJsZURlY2xhcmF0aW9uKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLnRoaXNFeHByZXNzaW9uOgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLnRoaXNFeHByZXNzaW9uKTsKICAgICAgICBub2RlID0gbmV3IGpzLlRoaXMoKTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MudGhpc0V4cHJlc3Npb24pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQudmFyaWFibGVVc2U6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MudmFyaWFibGVVc2UpOwogICAgICAgIG5vZGUgPSBuZXcganMuVmFyaWFibGVVc2Uoc291cmNlLnJlYWRTdHJpbmcoKSk7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLnZhcmlhYmxlVXNlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLnBvc3RmaXg6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MucG9zdGZpeCk7CiAgICAgICAgU3RyaW5nIG9wID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgICBqcy5FeHByZXNzaW9uIGFyZ3VtZW50ID0gcmVhZCgpOwogICAgICAgIG5vZGUgPSBuZXcganMuUG9zdGZpeChvcCwgYXJndW1lbnQpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5wb3N0Zml4KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLnByZWZpeDoKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy5wcmVmaXgpOwogICAgICAgIFN0cmluZyBvcCA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgICAganMuRXhwcmVzc2lvbiBhcmd1bWVudCA9IHJlYWQoKTsKICAgICAgICBub2RlID0gbmV3IGpzLlByZWZpeChvcCwgYXJndW1lbnQpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5wcmVmaXgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQuYmluYXJ5OgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmJpbmFyeSk7CiAgICAgICAgU3RyaW5nIG9wID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgICBqcy5FeHByZXNzaW9uIGxlZnQgPSByZWFkKCk7CiAgICAgICAganMuRXhwcmVzc2lvbiByaWdodCA9IHJlYWQoKTsKICAgICAgICBub2RlID0gbmV3IGpzLkJpbmFyeShvcCwgbGVmdCwgcmlnaHQpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5iaW5hcnkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQuY2FsbEV4cHJlc3Npb246CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MuY2FsbEV4cHJlc3Npb24pOwogICAgICAgIGpzLkV4cHJlc3Npb24gdGFyZ2V0ID0gcmVhZCgpOwogICAgICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gYXJndW1lbnRzID0gcmVhZExpc3QoKTsKICAgICAgICBub2RlID0gbmV3IGpzLkNhbGwodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5jYWxsRXhwcmVzc2lvbik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5uZXdFeHByZXNzaW9uOgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLm5ld0V4cHJlc3Npb24pOwogICAgICAgIGpzLkV4cHJlc3Npb24gY2xzID0gcmVhZCgpOwogICAgICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gYXJndW1lbnRzID0gcmVhZExpc3QoKTsKICAgICAgICBub2RlID0gbmV3IGpzLk5ldyhjbHMsIGFyZ3VtZW50cyk7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLm5ld0V4cHJlc3Npb24pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQuY29uZGl0aW9uYWw6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MuY29uZGl0aW9uYWwpOwogICAgICAgIGpzLkV4cHJlc3Npb24gY29uZGl0aW9uID0gcmVhZCgpOwogICAgICAgIGpzLkV4cHJlc3Npb24gdGhlbiA9IHJlYWQoKTsKICAgICAgICBqcy5FeHByZXNzaW9uIG90aGVyd2lzZSA9IHJlYWQoKTsKICAgICAgICBub2RlID0gbmV3IGpzLkNvbmRpdGlvbmFsKGNvbmRpdGlvbiwgdGhlbiwgb3RoZXJ3aXNlKTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MuY29uZGl0aW9uYWwpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQudmFyaWFibGVJbml0aWFsaXphdGlvbjoKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy52YXJpYWJsZUluaXRpYWxpemF0aW9uKTsKICAgICAgICBqcy5EZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IHJlYWQoKTsKICAgICAgICBqcy5FeHByZXNzaW9uIHZhbHVlID0gc291cmNlLnJlYWRWYWx1ZU9yTnVsbChyZWFkKTsKICAgICAgICBub2RlID0gbmV3IGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24oZGVjbGFyYXRpb24sIHZhbHVlKTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MudmFyaWFibGVJbml0aWFsaXphdGlvbik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5hc3NpZ25tZW50OgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmFzc2lnbm1lbnQpOwogICAgICAgIGpzLkV4cHJlc3Npb24gbGVmdEhhbmRTaWRlID0gcmVhZCgpOwogICAgICAgIFN0cmluZyBvcCA9IHNvdXJjZS5yZWFkU3RyaW5nT3JOdWxsKCk7CiAgICAgICAganMuRXhwcmVzc2lvbiB2YWx1ZSA9IHJlYWQoKTsKICAgICAgICBub2RlID0gbmV3IGpzLkFzc2lnbm1lbnQuY29tcG91bmQobGVmdEhhbmRTaWRlLCBvcCwgdmFsdWUpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5hc3NpZ25tZW50KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLnZhcmlhYmxlRGVjbGFyYXRpb25MaXN0OgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLnZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KTsKICAgICAgICBMaXN0PGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24+IGRlY2xhcmF0aW9ucyA9IHJlYWRMaXN0KCk7CiAgICAgICAgYm9vbCBpbmRlbnRTcGxpdHMgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgICAgICBub2RlID0gbmV3IGpzLlZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KGRlY2xhcmF0aW9ucywKICAgICAgICAgICAgaW5kZW50U3BsaXRzOiBpbmRlbnRTcGxpdHMpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy52YXJpYWJsZURlY2xhcmF0aW9uTGlzdCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5saXRlcmFsRXhwcmVzc2lvbjoKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy5saXRlcmFsRXhwcmVzc2lvbik7CiAgICAgICAgU3RyaW5nIHRlbXBsYXRlID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgICBMaXN0PGpzLkV4cHJlc3Npb24+IGlucHV0cyA9IHJlYWRMaXN0KCk7CiAgICAgICAgbm9kZSA9IG5ldyBqcy5MaXRlcmFsRXhwcmVzc2lvbi53aXRoRGF0YSh0ZW1wbGF0ZSwgaW5wdXRzKTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MubGl0ZXJhbEV4cHJlc3Npb24pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQuZGFydFlpZWxkOgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmRhcnRZaWVsZCk7CiAgICAgICAganMuRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcmVhZCgpOwogICAgICAgIGJvb2wgaGFzU3RhciA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgICAgIG5vZGUgPSBuZXcganMuRGFydFlpZWxkKGV4cHJlc3Npb24sIGhhc1N0YXIpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5kYXJ0WWllbGQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQubGl0ZXJhbFN0YXRlbWVudDoKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy5saXRlcmFsU3RhdGVtZW50KTsKICAgICAgICBub2RlID0gbmV3IGpzLkxpdGVyYWxTdGF0ZW1lbnQoc291cmNlLnJlYWRTdHJpbmcoKSk7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLmxpdGVyYWxTdGF0ZW1lbnQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQubGFiZWxlZFN0YXRlbWVudDoKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy5sYWJlbGVkU3RhdGVtZW50KTsKICAgICAgICBTdHJpbmcgbGFiZWwgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgIGpzLlN0YXRlbWVudCBib2R5ID0gcmVhZCgpOwogICAgICAgIG5vZGUgPSBuZXcganMuTGFiZWxlZFN0YXRlbWVudChsYWJlbCwgYm9keSk7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLmxhYmVsZWRTdGF0ZW1lbnQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQuZnVuY3Rpb25EZWNsYXJhdGlvbjoKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy5mdW5jdGlvbkRlY2xhcmF0aW9uKTsKICAgICAgICBqcy5EZWNsYXJhdGlvbiBuYW1lID0gcmVhZCgpOwogICAgICAgIGpzLkZ1biBmdW5jdGlvbiA9IHJlYWQoKTsKICAgICAgICBub2RlID0gbmV3IGpzLkZ1bmN0aW9uRGVjbGFyYXRpb24obmFtZSwgZnVuY3Rpb24pOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5mdW5jdGlvbkRlY2xhcmF0aW9uKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLnN3aXRjaERlZmF1bHQ6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3Muc3dpdGNoRGVmYXVsdCk7CiAgICAgICAganMuQmxvY2sgYm9keSA9IHJlYWQoKTsKICAgICAgICBub2RlID0gbmV3IGpzLkRlZmF1bHQoYm9keSk7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLnN3aXRjaERlZmF1bHQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQuc3dpdGNoQ2FzZToKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy5zd2l0Y2hDYXNlKTsKICAgICAgICBqcy5FeHByZXNzaW9uIGV4cHJlc3Npb24gPSByZWFkKCk7CiAgICAgICAganMuQmxvY2sgYm9keSA9IHJlYWQoKTsKICAgICAgICBub2RlID0gbmV3IGpzLkNhc2UoZXhwcmVzc2lvbiwgYm9keSk7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLnN3aXRjaENhc2UpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQuc3dpdGNoU3RhdGVtZW50OgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLnN3aXRjaFN0YXRlbWVudCk7CiAgICAgICAganMuRXhwcmVzc2lvbiBrZXkgPSByZWFkKCk7CiAgICAgICAgTGlzdDxqcy5Td2l0Y2hDbGF1c2U+IGNhc2VzID0gcmVhZExpc3QoKTsKICAgICAgICBub2RlID0gbmV3IGpzLlN3aXRjaChrZXksIGNhc2VzKTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3Muc3dpdGNoU3RhdGVtZW50KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLmNhdGNoQ2xhdXNlOgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmNhdGNoQ2xhdXNlKTsKICAgICAgICBqcy5EZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IHJlYWQoKTsKICAgICAgICBqcy5CbG9jayBib2R5ID0gcmVhZCgpOwogICAgICAgIG5vZGUgPSBuZXcganMuQ2F0Y2goZGVjbGFyYXRpb24sIGJvZHkpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5jYXRjaENsYXVzZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC50cnlTdGF0ZW1lbnQ6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MudHJ5U3RhdGVtZW50KTsKICAgICAgICBqcy5CbG9jayBib2R5ID0gcmVhZCgpOwogICAgICAgIGpzLkNhdGNoIGNhdGNoUGFydCA9IHNvdXJjZS5yZWFkVmFsdWVPck51bGwocmVhZCk7CiAgICAgICAganMuQmxvY2sgZmluYWxseVBhcnQgPSBzb3VyY2UucmVhZFZhbHVlT3JOdWxsKHJlYWQpOwogICAgICAgIG5vZGUgPSBuZXcganMuVHJ5KGJvZHksIGNhdGNoUGFydCwgZmluYWxseVBhcnQpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy50cnlTdGF0ZW1lbnQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQudGhyb3dTdGF0ZW1lbnQ6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MudGhyb3dTdGF0ZW1lbnQpOwogICAgICAgIGpzLkV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJlYWQoKTsKICAgICAgICBub2RlID0gbmV3IGpzLlRocm93KGV4cHJlc3Npb24pOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy50aHJvd1N0YXRlbWVudCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5yZXR1cm5TdGF0ZW1lbnQ6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MucmV0dXJuU3RhdGVtZW50KTsKICAgICAgICBqcy5FeHByZXNzaW9uIHZhbHVlID0gc291cmNlLnJlYWRWYWx1ZU9yTnVsbChyZWFkKTsKICAgICAgICBub2RlID0gbmV3IGpzLlJldHVybih2YWx1ZSk7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLnJldHVyblN0YXRlbWVudCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5icmVha1N0YXRlbWVudDoKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy5icmVha1N0YXRlbWVudCk7CiAgICAgICAgU3RyaW5nIHRhcmdldExhYmVsID0gc291cmNlLnJlYWRTdHJpbmdPck51bGwoKTsKICAgICAgICBub2RlID0gbmV3IGpzLkJyZWFrKHRhcmdldExhYmVsKTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MuYnJlYWtTdGF0ZW1lbnQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQuY29udGludWVTdGF0ZW1lbnQ6CiAgICAgICAgc291cmNlLmJlZ2luKEpzTm9kZVRhZ3MuY29udGludWVTdGF0ZW1lbnQpOwogICAgICAgIFN0cmluZyB0YXJnZXRMYWJlbCA9IHNvdXJjZS5yZWFkU3RyaW5nT3JOdWxsKCk7CiAgICAgICAgbm9kZSA9IG5ldyBqcy5Db250aW51ZSh0YXJnZXRMYWJlbCk7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLmNvbnRpbnVlU3RhdGVtZW50KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLmRvU3RhdGVtZW50OgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmRvU3RhdGVtZW50KTsKICAgICAgICBqcy5TdGF0ZW1lbnQgYm9keSA9IHJlYWQoKTsKICAgICAgICBqcy5FeHByZXNzaW9uIGNvbmRpdGlvbiA9IHJlYWQoKTsKICAgICAgICBub2RlID0gbmV3IGpzLkRvKGJvZHksIGNvbmRpdGlvbik7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLmRvU3RhdGVtZW50KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLndoaWxlU3RhdGVtZW50OgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLndoaWxlU3RhdGVtZW50KTsKICAgICAgICBqcy5FeHByZXNzaW9uIGNvbmRpdGlvbiA9IHJlYWQoKTsKICAgICAgICBqcy5TdGF0ZW1lbnQgYm9keSA9IHJlYWQoKTsKICAgICAgICBub2RlID0gbmV3IGpzLldoaWxlKGNvbmRpdGlvbiwgYm9keSk7CiAgICAgICAgc291cmNlLmVuZChKc05vZGVUYWdzLndoaWxlU3RhdGVtZW50KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLmZvckluU3RhdGVtZW50OgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmZvckluU3RhdGVtZW50KTsKICAgICAgICBqcy5FeHByZXNzaW9uIGxlZnRIYW5kU2lkZSA9IHJlYWQoKTsKICAgICAgICBqcy5FeHByZXNzaW9uIG9iamVjdCA9IHJlYWQoKTsKICAgICAgICBqcy5TdGF0ZW1lbnQgYm9keSA9IHJlYWQoKTsKICAgICAgICBub2RlID0gbmV3IGpzLkZvckluKGxlZnRIYW5kU2lkZSwgb2JqZWN0LCBib2R5KTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MuZm9ySW5TdGF0ZW1lbnQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQuZm9yU3RhdGVtZW50OgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmZvclN0YXRlbWVudCk7CiAgICAgICAganMuRXhwcmVzc2lvbiBpbml0ID0gcmVhZChhbGxvd051bGw6IHRydWUpOwogICAgICAgIGpzLkV4cHJlc3Npb24gY29uZGl0aW9uID0gcmVhZChhbGxvd051bGw6IHRydWUpOwogICAgICAgIGpzLkV4cHJlc3Npb24gdXBkYXRlID0gcmVhZChhbGxvd051bGw6IHRydWUpOwogICAgICAgIGpzLlN0YXRlbWVudCBib2R5ID0gcmVhZCgpOwogICAgICAgIG5vZGUgPSBuZXcganMuRm9yKGluaXQsIGNvbmRpdGlvbiwgdXBkYXRlLCBib2R5KTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MuZm9yU3RhdGVtZW50KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLmlmU3RhdGVtZW50OgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmlmU3RhdGVtZW50KTsKICAgICAgICBqcy5FeHByZXNzaW9uIGNvbmRpdGlvbiA9IHJlYWQoKTsKICAgICAgICBqcy5TdGF0ZW1lbnQgdGhlbiA9IHJlYWQoKTsKICAgICAgICBqcy5TdGF0ZW1lbnQgb3RoZXJ3aXNlID0gcmVhZCgpOwogICAgICAgIG5vZGUgPSBuZXcganMuSWYoY29uZGl0aW9uLCB0aGVuLCBvdGhlcndpc2UpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5pZlN0YXRlbWVudCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5lbXB0eVN0YXRlbWVudDoKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy5lbXB0eVN0YXRlbWVudCk7CiAgICAgICAgbm9kZSA9IG5ldyBqcy5FbXB0eVN0YXRlbWVudCgpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5lbXB0eVN0YXRlbWVudCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSnNOb2RlS2luZC5leHByZXNzaW9uU3RhdGVtZW50OgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmV4cHJlc3Npb25TdGF0ZW1lbnQpOwogICAgICAgIG5vZGUgPSBuZXcganMuRXhwcmVzc2lvblN0YXRlbWVudChyZWFkKCkpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5leHByZXNzaW9uU3RhdGVtZW50KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKc05vZGVLaW5kLmJsb2NrOgogICAgICAgIHNvdXJjZS5iZWdpbihKc05vZGVUYWdzLmJsb2NrKTsKICAgICAgICBMaXN0PGpzLlN0YXRlbWVudD4gc3RhdGVtZW50cyA9IHJlYWRMaXN0KCk7CiAgICAgICAgbm9kZSA9IG5ldyBqcy5CbG9jayhzdGF0ZW1lbnRzKTsKICAgICAgICBzb3VyY2UuZW5kKEpzTm9kZVRhZ3MuYmxvY2spOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpzTm9kZUtpbmQucHJvZ3JhbToKICAgICAgICBzb3VyY2UuYmVnaW4oSnNOb2RlVGFncy5wcm9ncmFtKTsKICAgICAgICBMaXN0PGpzLlN0YXRlbWVudD4gYm9keSA9IHJlYWRMaXN0KCk7CiAgICAgICAgbm9kZSA9IG5ldyBqcy5Qcm9ncmFtKGJvZHkpOwogICAgICAgIHNvdXJjZS5lbmQoSnNOb2RlVGFncy5wcm9ncmFtKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBzb3VyY2UucmVhZENhY2hlZDxTb3VyY2VJbmZvcm1hdGlvbj4oKCkgewogICAgICByZXR1cm4gU291cmNlSW5mb3JtYXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICB9KTsKICAgIGlmIChzb3VyY2VJbmZvcm1hdGlvbiAhPSBudWxsKSB7CiAgICAgIG5vZGUgPSBub2RlLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIExpc3Q8VD4gcmVhZExpc3Q8VCBleHRlbmRzIGpzLk5vZGU+KHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pIHsKICAgIHJldHVybiBzb3VyY2UucmVhZExpc3QocmVhZCwgZW1wdHlBc051bGw6IGVtcHR5QXNOdWxsKTsKICB9Cn0KCmNsYXNzIENvZGVnZW5SZWFkZXJJbXBsIGltcGxlbWVudHMgQ29kZWdlblJlYWRlciB7CiAgZmluYWwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkOwogIGZpbmFsIExpc3Q8TW9kdWxhck5hbWU+IG1vZHVsYXJOYW1lczsKICBmaW5hbCBMaXN0PE1vZHVsYXJFeHByZXNzaW9uPiBtb2R1bGFyRXhwcmVzc2lvbnM7CgogIENvZGVnZW5SZWFkZXJJbXBsKAogICAgICB0aGlzLmNsb3NlZFdvcmxkLCB0aGlzLm1vZHVsYXJOYW1lcywgdGhpcy5tb2R1bGFyRXhwcmVzc2lvbnMpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHJlYWRBYnN0cmFjdFZhbHVlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgIC5yZWFkQWJzdHJhY3RWYWx1ZUZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5Ob2RlIHJlYWRKc05vZGUoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHJldHVybiBKc05vZGVEZXNlcmlhbGl6ZXIucmVhZEZyb21EYXRhU291cmNlKAogICAgICAgIHNvdXJjZSwgbW9kdWxhck5hbWVzLCBtb2R1bGFyRXhwcmVzc2lvbnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgT3V0cHV0VW5pdCByZWFkT3V0cHV0VW5pdFJlZmVyZW5jZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgcmV0dXJuIGNsb3NlZFdvcmxkLm91dHB1dFVuaXREYXRhLm91dHB1dFVuaXRzW3NvdXJjZS5yZWFkSW50KCldOwogIH0KfQoKY2xhc3MgQ29kZWdlbldyaXRlckltcGwgaW1wbGVtZW50cyBDb2RlZ2VuV3JpdGVyIHsKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CgogIENvZGVnZW5Xcml0ZXJJbXBsKHRoaXMuY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQWJzdHJhY3RWYWx1ZShEYXRhU2luayBzaW5rLCBBYnN0cmFjdFZhbHVlIHZhbHVlKSB7CiAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLndyaXRlQWJzdHJh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aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YganNfYXN0OwoKYWJzdHJhY3QgY2xhc3MgTm9kZVZpc2l0b3I8VD4gewogIFQgdmlzaXRQcm9ncmFtKFByb2dyYW0gbm9kZSk7CgogIFQgdmlzaXRCbG9jayhCbG9jayBub2RlKTsKICBUIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpOwogIFQgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlKTsKICBUIHZpc2l0SWYoSWYgbm9kZSk7CiAgVCB2aXNpdEZvcihGb3Igbm9kZSk7CiAgVCB2aXNpdEZvckluKEZvckluIG5vZGUpOwogIFQgdmlzaXRXaGlsZShXaGlsZSBub2RlKTsKICBUIHZpc2l0RG8oRG8gbm9kZSk7CiAgVCB2aXNpdENvbnRpbnVlKENvbnRpbnVlIG5vZGUpOwogIFQgdmlzaXRCcmVhayhCcmVhayBub2RlKTsKICBUIHZpc2l0UmV0dXJuKFJldHVybiBub2RlKTsKICBUIHZpc2l0VGhyb3coVGhyb3cgbm9kZSk7CiAgVCB2aXNpdFRyeShUcnkgbm9kZSk7CiAgVCB2aXNpdENhdGNoKENhdGNoIG5vZGUpOwogIFQgdmlzaXRTd2l0Y2goU3dpdGNoIG5vZGUpOwogIFQgdmlzaXRDYXNlKENhc2Ugbm9kZSk7CiAgVCB2aXNpdERlZmF1bHQoRGVmYXVsdCBub2RlKTsKICBUIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpOwogIFQgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSk7CiAgVCB2aXNpdExpdGVyYWxTdGF0ZW1lbnQoTGl0ZXJhbFN0YXRlbWVudCBub2RlKTsKICBUIHZpc2l0RGFydFlpZWxkKERhcnRZaWVsZCBub2RlKTsKCiAgVCB2aXNpdExpdGVyYWxFeHByZXNzaW9uKExpdGVyYWxFeHByZXNzaW9uIG5vZGUpOwogIFQgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBub2RlKTsKICBUIHZpc2l0QXNzaWdubWVudChBc3NpZ25tZW50IG5vZGUpOwogIFQgdmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKFZhcmlhYmxlSW5pdGlhbGl6YXRpb24gbm9kZSk7CiAgVCB2aXNpdENvbmRpdGlvbmFsKENvbmRpdGlvbmFsIGNvbmQpOwogIFQgdmlzaXROZXcoTmV3IG5vZGUpOwogIFQgdmlzaXRDYWxsKENhbGwgbm9kZSk7CiAgVCB2aXNpdEJpbmFyeShCaW5hcnkgbm9kZSk7CiAgVCB2aXNpdFByZWZpeChQcmVmaXggbm9kZSk7CiAgVCB2aXNpdFBvc3RmaXgoUG9zdGZpeCBub2RlKTsKCiAgVCB2aXNpdFZhcmlhYmxlVXNlKFZhcmlhYmxlVXNlIG5vZGUpOwogIFQgdmlzaXRUaGlzKFRoaXMgbm9kZSk7CiAgVCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKTsKICBUIHZpc2l0UGFyYW1ldGVyKFBhcmFtZXRlciBub2RlKTsKICBUIHZpc2l0QWNjZXNzKFByb3BlcnR5QWNjZXNzIG5vZGUpOwoKICBUIHZpc2l0TmFtZWRGdW5jdGlvbihOYW1lZEZ1bmN0aW9uIG5vZGUpOwogIFQgdmlzaXRGdW4oRnVuIG5vZGUpOwoKICBUIHZpc2l0RGVmZXJyZWRFeHByZXNzaW9uKERlZmVycmVkRXhwcmVzc2lvbiBub2RlKTsKICBUIHZpc2l0RGVmZXJyZWROdW1iZXIoRGVmZXJyZWROdW1iZXIgbm9kZSk7CiAgVCB2aXNpdERlZmVycmVkU3RyaW5nKERlZmVycmVkU3RyaW5nIG5vZGUpOwoKICBUIHZpc2l0TGl0ZXJhbEJvb2woTGl0ZXJhbEJvb2wgbm9kZSk7CiAgVCB2aXNpdExpdGVyYWxTdHJpbmcoTGl0ZXJhbFN0cmluZyBub2RlKTsKICBUIHZpc2l0TGl0ZXJhbE51bWJlcihMaXRlcmFsTnVtYmVyIG5vZGUpOwogIFQgdmlzaXRMaXRlcmFsTnVsbChMaXRlcmFsTnVsbCBub2RlKTsKCiAgVCB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKTsKCiAgVCB2aXNpdE5hbWUoTmFtZSBub2RlKTsKCiAgVCB2aXNpdFBhcmVudGhlc2VzKFBhcmVudGhlc2VzIG5vZGUpOwoKICBUIHZpc2l0QXJyYXlJbml0aWFsaXplcihBcnJheUluaXRpYWxpemVyIG5vZGUpOwogIFQgdmlzaXRBcnJheUhvbGUoQXJyYXlIb2xlIG5vZGUpOwogIFQgdmlzaXRPYmplY3RJbml0aWFsaXplcihPYmplY3RJbml0aWFsaXplciBub2RlKTsKICBUIHZpc2l0UHJvcGVydHkoUHJvcGVydHkgbm9kZSk7CiAgVCB2aXNpdFJlZ0V4cExpdGVyYWwoUmVnRXhwTGl0ZXJhbCBub2RlKTsKCiAgVCB2aXNpdEF3YWl0KEF3YWl0IG5vZGUpOwoKICBUIHZpc2l0Q29tbWVudChDb21tZW50IG5vZGUpOwoKICBUIHZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbihJbnRlcnBvbGF0ZWRFeHByZXNzaW9uIG5vZGUpOwogIFQgdmlzaXRJbnRlcnBvbGF0ZWRMaXRlcmFsKEludGVycG9sYXRlZExpdGVyYWwgbm9kZSk7CiAgVCB2aXNpdEludGVycG9sYXRlZFBhcmFtZXRlcihJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIgbm9kZSk7CiAgVCB2aXNpdEludGVycG9sYXRlZFNlbGVjdG9yKEludGVycG9sYXRlZFNlbGVjdG9yIG5vZGUpOwogIFQgdmlzaXRJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQoSW50ZXJwb2xhdGVkU3RhdGVtZW50IG5vZGUpOwogIFQgdmlzaXRJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbihJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbiBub2RlKTsKfQoKY2xhc3MgQmFzZVZpc2l0b3I8VD4gaW1wbGVtZW50cyBOb2RlVmlzaXRvcjxUPiB7CiAgY29uc3QgQmFzZVZpc2l0b3IoKTsKCiAgVCB2aXNpdE5vZGUoTm9kZSBub2RlKSB7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIFQgdmlzaXRQcm9ncmFtKFByb2dyYW0gbm9kZSkgPT4gdmlzaXROb2RlKG5vZGUpOwoKICBUIHZpc2l0U3RhdGVtZW50KFN0YXRlbWVudCBub2RlKSA9PiB2aXNpdE5vZGUobm9kZSk7CiAgVCB2aXNpdExvb3AoTG9vcCBub2RlKSA9PiB2aXNpdFN0YXRlbWVudChub2RlKTsKICBUIHZpc2l0SnVtcChTdGF0ZW1lbnQgbm9kZSkgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSk7CgogIFQgdmlzaXRCbG9jayhCbG9jayBub2RlKSA9PiB2aXNpdFN0YXRlbWVudChub2RlKTsKICBUIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpID0+IHZpc2l0U3RhdGVtZW50KG5vZGUpOwogIFQgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlKSA9PiB2aXNpdFN0YXRlbWVudChub2RlKTsKICBUIHZpc2l0SWYoSWYgbm9kZSkgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSk7CiAgVCB2aXNpdEZvcihGb3Igbm9kZSkgPT4gdmlzaXRMb29wKG5vZGUpOwogIFQgdmlzaXRGb3JJbihGb3JJbiBub2RlKSA9PiB2aXNpdExvb3Aobm9kZSk7CiAgVCB2aXNpdFdoaWxlKFdoaWxlIG5vZGUpID0+IHZpc2l0TG9vcChub2RlKTsKICBUIHZpc2l0RG8oRG8gbm9kZSkgPT4gdmlzaXRMb29wKG5vZGUpOwogIFQgdmlzaXRDb250aW51ZShDb250aW51ZSBub2RlKSA9PiB2aXNpdEp1bXAobm9kZSk7CiAgVCB2aXNpdEJyZWFrKEJyZWFrIG5vZGUpID0+IHZpc2l0SnVtcChub2RlKTsKICBUIHZpc2l0UmV0dXJuKFJldHVybiBub2RlKSA9PiB2aXNpdEp1bXAobm9kZSk7CiAgVCB2aXNpdFRocm93KFRocm93IG5vZGUpID0+IHZpc2l0SnVtcChub2RlKTsKICBUIHZpc2l0VHJ5KFRyeSBub2RlKSA9PiB2aXNpdFN0YXRlbWVudChub2RlKTsKICBUIHZpc2l0U3dpdGNoKFN3aXRjaCBub2RlKSA9PiB2aXNpdFN0YXRlbWVudChub2RlKTsKICBUIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpID0+IHZpc2l0U3RhdGVtZW50KG5vZGUpOwogIFQgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSk7CiAgVCB2aXNpdExpdGVyYWxTdGF0ZW1lbnQoTGl0ZXJhbFN0YXRlbWVudCBub2RlKSA9PiB2aXNpdFN0YXRlbWVudChub2RlKTsKCiAgVCB2aXNpdENhdGNoKENhdGNoIG5vZGUpID0+IHZpc2l0Tm9kZShub2RlKTsKICBUIHZpc2l0Q2FzZShDYXNlIG5vZGUpID0+IHZpc2l0Tm9kZShub2RlKTsKICBUIHZpc2l0RGVmYXVsdChEZWZhdWx0IG5vZGUpID0+IHZpc2l0Tm9kZShub2RlKTsKCiAgVCB2aXNpdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSA9PiB2aXNpdE5vZGUobm9kZSk7CiAgVCB2aXNpdFZhcmlhYmxlUmVmZXJlbmNlKFZhcmlhYmxlUmVmZXJlbmNlIG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKCiAgVCB2aXNpdExpdGVyYWxFeHByZXNzaW9uKExpdGVyYWxFeHByZXNzaW9uIG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICBUIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qgbm9kZSkgPT4KICAgICAgdmlzaXRFeHByZXNzaW9uKG5vZGUpOwogIFQgdmlzaXRBc3NpZ25tZW50KEFzc2lnbm1lbnQgbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwogIFQgdmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKFZhcmlhYmxlSW5pdGlhbGl6YXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUudmFsdWUgIT0gbnVsbCkgewogICAgICByZXR1cm4gdmlzaXRBc3NpZ25tZW50KG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICAgIH0KICB9CgogIFQgdmlzaXRDb25kaXRpb25hbChDb25kaXRpb25hbCBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgVCB2aXNpdE5ldyhOZXcgbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwogIFQgdmlzaXRDYWxsKENhbGwgbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwogIFQgdmlzaXRCaW5hcnkoQmluYXJ5IG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICBUIHZpc2l0UHJlZml4KFByZWZpeCBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgVCB2aXNpdFBvc3RmaXgoUG9zdGZpeCBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgVCB2aXNpdEFjY2VzcyhQcm9wZXJ0eUFjY2VzcyBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CgogIFQgdmlzaXRWYXJpYWJsZVVzZShWYXJpYWJsZVVzZSBub2RlKSA9PiB2aXNpdFZhcmlhYmxlUmVmZXJlbmNlKG5vZGUpOwogIFQgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgPT4KICAgICAgdmlzaXRWYXJpYWJsZVJlZmVyZW5jZShub2RlKTsKICBUIHZpc2l0UGFyYW1ldGVyKFBhcmFtZXRlciBub2RlKSA9PiB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSk7CiAgVCB2aXNpdFRoaXMoVGhpcyBub2RlKSA9PiB2aXNpdFBhcmFtZXRlcihub2RlKTsKCiAgVCB2aXNpdE5hbWVkRnVuY3Rpb24oTmFtZWRGdW5jdGlvbiBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgVCB2aXNpdEZ1bihGdW4gbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwoKICBUIHZpc2l0VG9rZW4oRGVmZXJyZWRUb2tlbiBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CgogIFQgdmlzaXREZWZlcnJlZEV4cHJlc3Npb24oRGVmZXJyZWRFeHByZXNzaW9uIG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICBUIHZpc2l0RGVmZXJyZWROdW1iZXIoRGVmZXJyZWROdW1iZXIgbm9kZSkgPT4gdmlzaXRUb2tlbihub2RlKTsKICBUIHZpc2l0RGVmZXJyZWRTdHJpbmcoRGVmZXJyZWRTdHJpbmcgbm9kZSkgPT4gdmlzaXRUb2tlbihub2RlKTsKCiAgVCB2aXNpdExpdGVyYWwoTGl0ZXJhbCBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CgogIFQgdmlzaXRMaXRlcmFsQm9vbChMaXRlcmFsQm9vbCBub2RlKSA9PiB2aXNpdExpdGVyYWwobm9kZSk7CiAgVCB2aXNpdExpdGVyYWxTdHJpbmcoTGl0ZXJhbFN0cmluZyBub2RlKSA9PiB2aXNpdExpdGVyYWwobm9kZSk7CiAgVCB2aXNpdExpdGVyYWxOdW1iZXIoTGl0ZXJhbE51bWJlciBub2RlKSA9PiB2aXNpdExpdGVyYWwobm9kZSk7CiAgVCB2aXNpdExpdGVyYWxOdWxsKExpdGVyYWxOdWxsIG5vZGUpID0+IHZpc2l0TGl0ZXJhbChub2RlKTsKCiAgVCB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSA9PiB2aXNpdExpdGVyYWwobm9kZSk7CgogIFQgdmlzaXROYW1lKE5hbWUgbm9kZSkgPT4gdmlzaXROb2RlKG5vZGUpOwoKICBUIHZpc2l0UGFyZW50aGVzZXMoUGFyZW50aGVzZXMgbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwoKICBUIHZpc2l0QXJyYXlJbml0aWFsaXplcihBcnJheUluaXRpYWxpemVyIG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICBUIHZpc2l0QXJyYXlIb2xlKEFycmF5SG9sZSBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgVCB2aXNpdE9iamVjdEluaXRpYWxpemVyKE9iamVjdEluaXRpYWxpemVyIG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICBUIHZpc2l0UHJvcGVydHkoUHJvcGVydHkgbm9kZSkgPT4gdmlzaXROb2RlKG5vZGUpOwogIFQgdmlzaXRSZWdFeHBMaXRlcmFsKFJlZ0V4cExpdGVyYWwgbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwoKICBUIHZpc2l0SW50ZXJwb2xhdGVkTm9kZShJbnRlcnBvbGF0ZWROb2RlIG5vZGUpID0+IHZpc2l0Tm9kZShub2RlKTsKCiAgVCB2aXNpdEludGVycG9sYXRlZEV4cHJlc3Npb24oSW50ZXJwb2xhdGVkRXhwcmVzc2lvbiBub2RlKSA9PgogICAgICB2aXNpdEludGVycG9sYXRlZE5vZGUobm9kZSk7CiAgVCB2aXNpdEludGVycG9sYXRlZExpdGVyYWwoSW50ZXJwb2xhdGVkTGl0ZXJhbCBub2RlKSA9PgogICAgICB2aXNpdEludGVycG9sYXRlZE5vZGUobm9kZSk7CiAgVCB2aXNpdEludGVycG9sYXRlZFBhcmFtZXRlcihJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIgbm9kZSkgPT4KICAgICAgdmlzaXRJbnRlcnBvbGF0ZWROb2RlKG5vZGUpOwogIFQgdmlzaXRJbnRlcnBvbGF0ZWRTZWxlY3RvcihJbnRlcnBvbGF0ZWRTZWxlY3RvciBub2RlKSA9PgogICAgICB2aXNpdEludGVycG9sYXRlZE5vZGUobm9kZSk7CiAgVCB2aXNpdEludGVycG9sYXRlZFN0YXRlbWVudChJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQgbm9kZSkgPT4KICAgICAgdmlzaXRJbnRlcnBvbGF0ZWROb2RlKG5vZGUpOwogIFQgdmlzaXRJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbihJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gdmlzaXRJbnRlcnBvbGF0ZWROb2RlKG5vZGUpOwogIH0KCiAgLy8gSWdub3JlIGNvbW1lbnRzIGJ5IGRlZmF1bHQuCiAgVCB2aXNpdENvbW1lbnQoQ29tbWVudCBub2RlKSA9PiBudWxsOwoKICBUIHZpc2l0QXdhaXQoQXdhaXQgbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwogIFQgdmlzaXREYXJ0WWllbGQoRGFydFlpZWxkIG5vZGUpID0+IHZpc2l0U3RhdGVtZW50KG5vZGUpOwp9CgphYnN0cmFjdCBjbGFzcyBOb2RlVmlzaXRvcjE8UiwgQT4gewogIFIgdmlzaXRQcm9ncmFtKFByb2dyYW0gbm9kZSwgQSBhcmcpOwoKICBSIHZpc2l0QmxvY2soQmxvY2sgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdElmKElmIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0Rm9yKEZvciBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdEZvckluKEZvckluIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0V2hpbGUoV2hpbGUgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXREbyhEbyBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdENvbnRpbnVlKENvbnRpbnVlIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0QnJlYWsoQnJlYWsgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRSZXR1cm4oUmV0dXJuIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0VGhyb3coVGhyb3cgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRUcnkoVHJ5IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0Q2F0Y2goQ2F0Y2ggbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRTd2l0Y2goU3dpdGNoIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0Q2FzZShDYXNlIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0RGVmYXVsdChEZWZhdWx0IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0TGFiZWxlZFN0YXRlbWVudChMYWJlbGVkU3RhdGVtZW50IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0TGl0ZXJhbFN0YXRlbWVudChMaXRlcmFsU3RhdGVtZW50IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0RGFydFlpZWxkKERhcnRZaWVsZCBub2RlLCBBIGFyZyk7CgogIFIgdmlzaXRMaXRlcmFsRXhwcmVzc2lvbihMaXRlcmFsRXhwcmVzc2lvbiBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0QXNzaWdubWVudChBc3NpZ25tZW50IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0VmFyaWFibGVJbml0aWFsaXphdGlvbihWYXJpYWJsZUluaXRpYWxpemF0aW9uIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0Q29uZGl0aW9uYWwoQ29uZGl0aW9uYWwgY29uZCwgQSBhcmcpOwogIFIgdmlzaXROZXcoTmV3IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0Q2FsbChDYWxsIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0QmluYXJ5KEJpbmFyeSBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdFByZWZpeChQcmVmaXggbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRQb3N0Zml4KFBvc3RmaXggbm9kZSwgQSBhcmcpOwoKICBSIHZpc2l0VmFyaWFibGVVc2UoVmFyaWFibGVVc2Ugbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRUaGlzKFRoaXMgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRQYXJhbWV0ZXIoUGFyYW1ldGVyIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0QWNjZXNzKFByb3BlcnR5QWNjZXNzIG5vZGUsIEEgYXJnKTsKCiAgUiB2aXNpdE5hbWVkRnVuY3Rpb24oTmFtZWRGdW5jdGlvbiBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdEZ1bihGdW4gbm9kZSwgQSBhcmcpOwoKICBSIHZpc2l0RGVmZXJyZWRFeHByZXNzaW9uKERlZmVycmVkRXhwcmVzc2lvbiBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdERlZmVycmVkTnVtYmVyKERlZmVycmVkTnVtYmVyIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0RGVmZXJyZWRTdHJpbmcoRGVmZXJyZWRTdHJpbmcgbm9kZSwgQSBhcmcpOwoKICBSIHZpc2l0TGl0ZXJhbEJvb2woTGl0ZXJhbEJvb2wgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRMaXRlcmFsU3RyaW5nKExpdGVyYWxTdHJpbmcgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRMaXRlcmFsTnVtYmVyKExpdGVyYWxOdW1iZXIgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRMaXRlcmFsTnVsbChMaXRlcmFsTnVsbCBub2RlLCBBIGFyZyk7CgogIFIgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSwgQSBhcmcpOwoKICBSIHZpc2l0TmFtZShOYW1lIG5vZGUsIEEgYXJnKTsKCiAgUiB2aXNpdFBhcmVudGhlc2VzKFBhcmVudGhlc2VzIG5vZGUsIEEgYXJnKTsKCiAgUiB2aXNpdEFycmF5SW5pdGlhbGl6ZXIoQXJyYXlJbml0aWFsaXplciBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdEFycmF5SG9sZShBcnJheUhvbGUgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRPYmplY3RJbml0aWFsaXplcihPYmplY3RJbml0aWFsaXplciBub2RlLCBBIGFyZyk7CiAgUiB2aXNpdFByb3BlcnR5KFByb3BlcnR5IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0UmVnRXhwTGl0ZXJhbChSZWdFeHBMaXRlcmFsIG5vZGUsIEEgYXJnKTsKCiAgUiB2aXNpdEF3YWl0KEF3YWl0IG5vZGUsIEEgYXJnKTsKCiAgUiB2aXNpdENvbW1lbnQoQ29tbWVudCBub2RlLCBBIGFyZyk7CgogIFIgdmlzaXRJbnRlcnBvbGF0ZWRFeHByZXNzaW9uKEludGVycG9sYXRlZEV4cHJlc3Npb24gbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRJbnRlcnBvbGF0ZWRMaXRlcmFsKEludGVycG9sYXRlZExpdGVyYWwgbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIoSW50ZXJwb2xhdGVkUGFyYW1ldGVyIG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0SW50ZXJwb2xhdGVkU2VsZWN0b3IoSW50ZXJwb2xhdGVkU2VsZWN0b3Igbm9kZSwgQSBhcmcpOwogIFIgdmlzaXRJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQoSW50ZXJwb2xhdGVkU3RhdGVtZW50IG5vZGUsIEEgYXJnKTsKICBSIHZpc2l0SW50ZXJwb2xhdGVkRGVjbGFyYXRpb24oSW50ZXJwb2xhdGVkRGVjbGFyYXRpb24gbm9kZSwgQSBhcmcpOwp9CgpjbGFzcyBCYXNlVmlzaXRvcjE8UiwgQT4gaW1wbGVtZW50cyBOb2RlVmlzaXRvcjE8UiwgQT4gewogIGNvbnN0IEJhc2VWaXNpdG9yMSgpOwoKICBSIHZpc2l0Tm9kZShOb2RlIG5vZGUsIEEgYXJnKSB7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4xKHRoaXMsIGFyZyk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIFIgdmlzaXRQcm9ncmFtKFByb2dyYW0gbm9kZSwgQSBhcmcpID0+IHZpc2l0Tm9kZShub2RlLCBhcmcpOwoKICBSIHZpc2l0U3RhdGVtZW50KFN0YXRlbWVudCBub2RlLCBBIGFyZykgPT4gdmlzaXROb2RlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdExvb3AoTG9vcCBub2RlLCBBIGFyZykgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0SnVtcChTdGF0ZW1lbnQgbm9kZSwgQSBhcmcpID0+IHZpc2l0U3RhdGVtZW50KG5vZGUsIGFyZyk7CgogIFIgdmlzaXRCbG9jayhCbG9jayBub2RlLCBBIGFyZykgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlLCBBIGFyZykgPT4KICAgICAgdmlzaXRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0SWYoSWYgbm9kZSwgQSBhcmcpID0+IHZpc2l0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEZvcihGb3Igbm9kZSwgQSBhcmcpID0+IHZpc2l0TG9vcChub2RlLCBhcmcpOwogIFIgdmlzaXRGb3JJbihGb3JJbiBub2RlLCBBIGFyZykgPT4gdmlzaXRMb29wKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFdoaWxlKFdoaWxlIG5vZGUsIEEgYXJnKSA9PiB2aXNpdExvb3Aobm9kZSwgYXJnKTsKICBSIHZpc2l0RG8oRG8gbm9kZSwgQSBhcmcpID0+IHZpc2l0TG9vcChub2RlLCBhcmcpOwogIFIgdmlzaXRDb250aW51ZShDb250aW51ZSBub2RlLCBBIGFyZykgPT4gdmlzaXRKdW1wKG5vZGUsIGFyZyk7CiAgUiB2aXNpdEJyZWFrKEJyZWFrIG5vZGUsIEEgYXJnKSA9PiB2aXNpdEp1bXAobm9kZSwgYXJnKTsKICBSIHZpc2l0UmV0dXJuKFJldHVybiBub2RlLCBBIGFyZykgPT4gdmlzaXRKdW1wKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFRocm93KFRocm93IG5vZGUsIEEgYXJnKSA9PiB2aXNpdEp1bXAobm9kZSwgYXJnKTsKICBSIHZpc2l0VHJ5KFRyeSBub2RlLCBBIGFyZykgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0U3dpdGNoKFN3aXRjaCBub2RlLCBBIGFyZykgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSwgQSBhcmcpID0+CiAgICAgIHZpc2l0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdExpdGVyYWxTdGF0ZW1lbnQoTGl0ZXJhbFN0YXRlbWVudCBub2RlLCBBIGFyZykgPT4KICAgICAgdmlzaXRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKCiAgUiB2aXNpdENhdGNoKENhdGNoIG5vZGUsIEEgYXJnKSA9PiB2aXNpdE5vZGUobm9kZSwgYXJnKTsKICBSIHZpc2l0Q2FzZShDYXNlIG5vZGUsIEEgYXJnKSA9PiB2aXNpdE5vZGUobm9kZSwgYXJnKTsKICBSIHZpc2l0RGVmYXVsdChEZWZhdWx0IG5vZGUsIEEgYXJnKSA9PiB2aXNpdE5vZGUobm9kZSwgYXJnKTsKCiAgUiB2aXNpdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlLCBBIGFyZykgPT4gdmlzaXROb2RlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFZhcmlhYmxlUmVmZXJlbmNlKFZhcmlhYmxlUmVmZXJlbmNlIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKCiAgUiB2aXNpdExpdGVyYWxFeHByZXNzaW9uKExpdGVyYWxFeHByZXNzaW9uIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qgbm9kZSwgQSBhcmcpID0+CiAgICAgIHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRBc3NpZ25tZW50KEFzc2lnbm1lbnQgbm9kZSwgQSBhcmcpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKFZhcmlhYmxlSW5pdGlhbGl6YXRpb24gbm9kZSwgQSBhcmcpIHsKICAgIGlmIChub2RlLnZhbHVlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHZpc2l0QXNzaWdubWVudChub2RlLCBhcmcpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogICAgfQogIH0KCiAgUiB2aXNpdENvbmRpdGlvbmFsKENvbmRpdGlvbmFsIG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0TmV3KE5ldyBub2RlLCBBIGFyZykgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdENhbGwoQ2FsbCBub2RlLCBBIGFyZykgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdEJpbmFyeShCaW5hcnkgbm9kZSwgQSBhcmcpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRQcmVmaXgoUHJlZml4IG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0UG9zdGZpeChQb3N0Zml4IG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0QWNjZXNzKFByb3BlcnR5QWNjZXNzIG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKCiAgUiB2aXNpdFZhcmlhYmxlVXNlKFZhcmlhYmxlVXNlIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdFZhcmlhYmxlUmVmZXJlbmNlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlLCBBIGFyZykgPT4KICAgICAgdmlzaXRWYXJpYWJsZVJlZmVyZW5jZShub2RlLCBhcmcpOwogIFIgdmlzaXRQYXJhbWV0ZXIoUGFyYW1ldGVyIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSwgYXJnKTsKICBSIHZpc2l0VGhpcyhUaGlzIG5vZGUsIEEgYXJnKSA9PiB2aXNpdFBhcmFtZXRlcihub2RlLCBhcmcpOwoKICBSIHZpc2l0TmFtZWRGdW5jdGlvbihOYW1lZEZ1bmN0aW9uIG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0RnVuKEZ1biBub2RlLCBBIGFyZykgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CgogIFIgdmlzaXRUb2tlbihEZWZlcnJlZFRva2VuIG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKCiAgUiB2aXNpdERlZmVycmVkRXhwcmVzc2lvbihEZWZlcnJlZEV4cHJlc3Npb24gbm9kZSwgQSBhcmcpID0+CiAgICAgIHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXREZWZlcnJlZE51bWJlcihEZWZlcnJlZE51bWJlciBub2RlLCBBIGFyZykgPT4gdmlzaXRUb2tlbihub2RlLCBhcmcpOwogIFIgdmlzaXREZWZlcnJlZFN0cmluZyhEZWZlcnJlZFN0cmluZyBub2RlLCBBIGFyZykgPT4gdmlzaXRUb2tlbihub2RlLCBhcmcpOwoKICBSIHZpc2l0TGl0ZXJhbChMaXRlcmFsIG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKCiAgUiB2aXNpdExpdGVyYWxCb29sKExpdGVyYWxCb29sIG5vZGUsIEEgYXJnKSA9PiB2aXNpdExpdGVyYWwobm9kZSwgYXJnKTsKICBSIHZpc2l0TGl0ZXJhbFN0cmluZyhMaXRlcmFsU3RyaW5nIG5vZGUsIEEgYXJnKSA9PiB2aXNpdExpdGVyYWwobm9kZSwgYXJnKTsKICBSIHZpc2l0TGl0ZXJhbE51bWJlcihMaXRlcmFsTnVtYmVyIG5vZGUsIEEgYXJnKSA9PiB2aXNpdExpdGVyYWwobm9kZSwgYXJnKTsKICBSIHZpc2l0TGl0ZXJhbE51bGwoTGl0ZXJhbE51bGwgbm9kZSwgQSBhcmcpID0+IHZpc2l0TGl0ZXJhbChub2RlLCBhcmcpOwoKICBSIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdExpdGVyYWwobm9kZSwgYXJnKTsKCiAgUiB2aXNpdE5hbWUoTmFtZSBub2RlLCBBIGFyZykgPT4gdmlzaXROb2RlKG5vZGUsIGFyZyk7CgogIFIgdmlzaXRQYXJlbnRoZXNlcyhQYXJlbnRoZXNlcyBub2RlLCBBIGFyZykgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CgogIFIgdmlzaXRBcnJheUluaXRpYWxpemVyKEFycmF5SW5pdGlhbGl6ZXIgbm9kZSwgQSBhcmcpID0+CiAgICAgIHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRBcnJheUhvbGUoQXJyYXlIb2xlIG5vZGUsIEEgYXJnKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0T2JqZWN0SW5pdGlhbGl6ZXIoT2JqZWN0SW5pdGlhbGl6ZXIgbm9kZSwgQSBhcmcpID0+CiAgICAgIHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRQcm9wZXJ0eShQcm9wZXJ0eSBub2RlLCBBIGFyZykgPT4gdmlzaXROb2RlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFJlZ0V4cExpdGVyYWwoUmVnRXhwTGl0ZXJhbCBub2RlLCBBIGFyZykgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CgogIFIgdmlzaXRJbnRlcnBvbGF0ZWROb2RlKEludGVycG9sYXRlZE5vZGUgbm9kZSwgQSBhcmcpID0+IHZpc2l0Tm9kZShub2RlLCBhcmcpOwoKICBSIHZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbihJbnRlcnBvbGF0ZWRFeHByZXNzaW9uIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdEludGVycG9sYXRlZE5vZGUobm9kZSwgYXJnKTsKICBSIHZpc2l0SW50ZXJwb2xhdGVkTGl0ZXJhbChJbnRlcnBvbGF0ZWRMaXRlcmFsIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdEludGVycG9sYXRlZE5vZGUobm9kZSwgYXJnKTsKICBSIHZpc2l0SW50ZXJwb2xhdGVkUGFyYW1ldGVyKEludGVycG9sYXRlZFBhcmFtZXRlciBub2RlLCBBIGFyZykgPT4KICAgICAgdmlzaXRJbnRlcnBvbGF0ZWROb2RlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdEludGVycG9sYXRlZFNlbGVjdG9yKEludGVycG9sYXRlZFNlbGVjdG9yIG5vZGUsIEEgYXJnKSA9PgogICAgICB2aXNpdEludGVycG9sYXRlZE5vZGUobm9kZSwgYXJnKTsKICBSIHZpc2l0SW50ZXJwb2xhdGVkU3RhdGVtZW50KEludGVycG9sYXRlZFN0YXRlbWVudCBub2RlLCBBIGFyZykgPT4KICAgICAgdmlzaXRJbnRlcnBvbGF0ZWROb2RlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdEludGVycG9sYXRlZERlY2xhcmF0aW9uKEludGVycG9sYXRlZERlY2xhcmF0aW9uIG5vZGUsIEEgYXJnKSB7CiAgICByZXR1cm4gdmlzaXRJbnRlcnBvbGF0ZWROb2RlKG5vZGUsIGFyZyk7CiAgfQoKICAvLyBJZ25vcmUgY29tbWVudHMgYnkgZGVmYXVsdC4KICBSIHZpc2l0Q29tbWVudChDb21tZW50IG5vZGUsIEEgYXJnKSA9PiBudWxsOwoKICBSIHZpc2l0QXdhaXQoQXdhaXQgbm9kZSwgQSBhcmcpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXREYXJ0WWllbGQoRGFydFlpZWxkIG5vZGUsIEEgYXJnKSA9PiB2aXNpdFN0YXRlbWVudChub2RlLCBhcmcpOwp9CgovLy8gVGhpcyB0YWcgaW50ZXJmYWNlIGhhcyBubyBiZWhhdmlvdXIgYnV0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYW55IGNsYXNzCi8vLyB0aGF0IGlzIHRvIGJlIHN0b3JlZCBvbiBhIFtOb2RlXSBhcyBzb3VyY2UgaW5mb3JtYXRpb24uCmFic3RyYWN0IGNsYXNzIEphdmFTY3JpcHROb2RlU291cmNlSW5mb3JtYXRpb24gewogIGNvbnN0IEphdmFTY3JpcHROb2RlU291cmNlSW5mb3JtYXRpb24oKTsKfQoKYWJzdHJhY3QgY2xhc3MgTm9kZSB7CiAgSmF2YVNjcmlwdE5vZGVTb3VyY2VJbmZvcm1hdGlvbiBnZXQgc291cmNlSW5mb3JtYXRpb24gPT4gX3NvdXJjZUluZm9ybWF0aW9uOwoKICBKYXZhU2NyaXB0Tm9kZVNvdXJjZUluZm9ybWF0aW9uIF9zb3VyY2VJbmZvcm1hdGlvbjsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcik7CiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKTsKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZyk7CgogIC8vIFNoYWxsb3cgY2xvbmUgb2Ygbm9kZS4gIERvZXMgbm90IGNsb25lIHBvc2l0aW9ucyBzaW5jZSB0aGUgb25seSB1c2Ugb2YgdGhpcwogIC8vIHByaXZhdGUgbWV0aG9kIGlzIGNyZWF0ZSBhIGNvcHkgd2l0aCBhIG5ldyBwb3NpdGlvbi4KICBOb2RlIF9jbG9uZSgpOwoKICAvLyBSZXR1cm5zIGEgbm9kZSBlcXVpdmFsZW50IHRvIFt0aGlzXSwgYnV0IHdpdGggbmV3IHNvdXJjZSBwb3NpdGlvbiBhbmQgZW5kCiAgLy8gc291cmNlIHBvc2l0aW9uLgogIE5vZGUgd2l0aFNvdXJjZUluZm9ybWF0aW9uKAogICAgICBKYXZhU2NyaXB0Tm9kZVNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBpZiAoc291cmNlSW5mb3JtYXRpb24gPT0gX3NvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgTm9kZSBjbG9uZSA9IF9jbG9uZSgpOwogICAgLy8gVE9ETyhzcmEpOiBTaG91bGQgZXhpc3RpbmcgZGF0YSBiZSAnc3RpY2t5JyBpZiB3ZSB0cnkgdG8gb3ZlcndyaXRlIHdpdGgKICAgIC8vIGBudWxsYD8KICAgIGNsb25lLl9zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgcmV0dXJuIGNsb25lOwogIH0KCiAgVmFyaWFibGVVc2UgYXNWYXJpYWJsZVVzZSgpID0+IG51bGw7CgogIGJvb2wgZ2V0IGlzQ29tbWFPcGVyYXRvciA9PiBmYWxzZTsKCiAgU3RhdGVtZW50IHRvU3RhdGVtZW50KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3RvU3RhdGVtZW50Jyk7CiAgfQoKICBTdHJpbmcgZGVidWdQcmludCgpID0+IERlYnVnUHJpbnQodGhpcyk7Cn0KCmNsYXNzIFByb2dyYW0gZXh0ZW5kcyBOb2RlIHsKICBmaW5hbCBMaXN0PFN0YXRlbWVudD4gYm9keTsKICBQcm9ncmFtKHRoaXMuYm9keSk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRQcm9ncmFtKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0UHJvZ3JhbSh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZm9yIChTdGF0ZW1lbnQgc3RhdGVtZW50IGluIGJvZHkpIHN0YXRlbWVudC5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgZm9yIChTdGF0ZW1lbnQgc3RhdGVtZW50IGluIGJvZHkpIHN0YXRlbWVudC5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBQcm9ncmFtIF9jbG9uZSgpID0+IG5ldyBQcm9ncmFtKGJvZHkpOwp9CgphYnN0cmFjdCBjbGFzcyBTdGF0ZW1lbnQgZXh0ZW5kcyBOb2RlIHsKICBTdGF0ZW1lbnQgdG9TdGF0ZW1lbnQoKSA9PiB0aGlzOwp9CgpjbGFzcyBCbG9jayBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHM7CgogIEJsb2NrKHRoaXMuc3RhdGVtZW50cyk7CgogIEJsb2NrLmVtcHR5KCkgOiB0aGlzLnN0YXRlbWVudHMgPSA8U3RhdGVtZW50PltdOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0QmxvY2sodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRCbG9jayh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZm9yIChTdGF0ZW1lbnQgc3RhdGVtZW50IGluIHN0YXRlbWVudHMpIHN0YXRlbWVudC5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgZm9yIChTdGF0ZW1lbnQgc3RhdGVtZW50IGluIHN0YXRlbWVudHMpIHN0YXRlbWVudC5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBCbG9jayBfY2xvbmUoKSA9PiBuZXcgQmxvY2soc3RhdGVtZW50cyk7Cn0KCmNsYXNzIEV4cHJlc3Npb25TdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIGZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgRXhwcmVzc2lvblN0YXRlbWVudCh0aGlzLmV4cHJlc3Npb24pIHsKICAgIGFzc2VydCh0aGlzLmV4cHJlc3Npb24gIT0gbnVsbCk7CiAgfQoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGV4cHJlc3Npb24uYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHsKICAgIGV4cHJlc3Npb24uYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgRXhwcmVzc2lvblN0YXRlbWVudCBfY2xvbmUoKSA9PiBuZXcgRXhwcmVzc2lvblN0YXRlbWVudChleHByZXNzaW9uKTsKfQoKY2xhc3MgRW1wdHlTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIEVtcHR5U3RhdGVtZW50KCk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRFbXB0eVN0YXRlbWVudCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEVtcHR5U3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7fQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykge30KCiAgRW1wdHlTdGF0ZW1lbnQgX2Nsb25lKCkgPT4gbmV3IEVtcHR5U3RhdGVtZW50KCk7Cn0KCmNsYXNzIElmIGV4dGVuZHMgU3RhdGVtZW50IHsKICBmaW5hbCBFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBmaW5hbCBTdGF0ZW1lbnQgdGhlbjsKICBmaW5hbCBTdGF0ZW1lbnQgb3RoZXJ3aXNlOwoKICBJZih0aGlzLmNvbmRpdGlvbiwgdGhpcy50aGVuLCB0aGlzLm90aGVyd2lzZSk7CgogIElmLm5vRWxzZSh0aGlzLmNvbmRpdGlvbiwgdGhpcy50aGVuKSA6IHRoaXMub3RoZXJ3aXNlID0gbmV3IEVtcHR5U3RhdGVtZW50KCk7CgogIGJvb2wgZ2V0IGhhc0Vsc2UgPT4gb3RoZXJ3aXNlIGlzISBFbXB0eVN0YXRlbWVudDsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdElmKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0SWYodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGNvbmRpdGlvbi5hY2NlcHQodmlzaXRvcik7CiAgICB0aGVuLmFjY2VwdCh2aXNpdG9yKTsKICAgIG90aGVyd2lzZS5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgY29uZGl0aW9uLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIHRoZW4uYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogICAgb3RoZXJ3aXNlLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIElmIF9jbG9uZSgpID0+IG5ldyBJZihjb25kaXRpb24sIHRoZW4sIG90aGVyd2lzZSk7Cn0KCmFic3RyYWN0IGNsYXNzIExvb3AgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIGZpbmFsIFN0YXRlbWVudCBib2R5OwoKICBMb29wKHRoaXMuYm9keSk7Cn0KCmNsYXNzIEZvciBleHRlbmRzIExvb3AgewogIGZpbmFsIEV4cHJlc3Npb24gaW5pdDsKICBmaW5hbCBFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBmaW5hbCBFeHByZXNzaW9uIHVwZGF0ZTsKCiAgRm9yKHRoaXMuaW5pdCwgdGhpcy5jb25kaXRpb24sIHRoaXMudXBkYXRlLCBTdGF0ZW1lbnQgYm9keSkgOiBzdXBlcihib2R5KTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEZvcih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEZvcih0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgaWYgKGluaXQgIT0gbnVsbCkgaW5pdC5hY2NlcHQodmlzaXRvcik7CiAgICBpZiAoY29uZGl0aW9uICE9IG51bGwpIGNvbmRpdGlvbi5hY2NlcHQodmlzaXRvcik7CiAgICBpZiAodXBkYXRlICE9IG51bGwpIHVwZGF0ZS5hY2NlcHQodmlzaXRvcik7CiAgICBib2R5LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBpZiAoaW5pdCAhPSBudWxsKSBpbml0LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkgY29uZGl0aW9uLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGlmICh1cGRhdGUgIT0gbnVsbCkgdXBkYXRlLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGJvZHkuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgRm9yIF9jbG9uZSgpID0+IG5ldyBGb3IoaW5pdCwgY29uZGl0aW9uLCB1cGRhdGUsIGJvZHkpOwp9CgpjbGFzcyBGb3JJbiBleHRlbmRzIExvb3AgewogIC8vIE5vdGUgdGhhdCBbVmFyaWFibGVEZWNsYXJhdGlvbkxpc3RdIGlzIGEgc3ViY2xhc3Mgb2YgW0V4cHJlc3Npb25dLgogIC8vIFRoZXJlZm9yZSB3ZSBjYW4gdHlwZSB0aGUgbGVmdEhhbmRTaWRlIGFzIFtFeHByZXNzaW9uXS4KICBmaW5hbCBFeHByZXNzaW9uIGxlZnRIYW5kU2lkZTsKICBmaW5hbCBFeHByZXNzaW9uIG9iamVjdDsKCiAgRm9ySW4odGhpcy5sZWZ0SGFuZFNpZGUsIHRoaXMub2JqZWN0LCBTdGF0ZW1lbnQgYm9keSkgOiBzdXBlcihib2R5KTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEZvckluKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0Rm9ySW4odGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGxlZnRIYW5kU2lkZS5hY2NlcHQodmlzaXRvcik7CiAgICBvYmplY3QuYWNjZXB0KHZpc2l0b3IpOwogICAgYm9keS5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgbGVmdEhhbmRTaWRlLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIG9iamVjdC5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICBib2R5LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIEZvckluIF9jbG9uZSgpID0+IG5ldyBGb3JJbihsZWZ0SGFuZFNpZGUsIG9iamVjdCwgYm9keSk7Cn0KCmNsYXNzIFdoaWxlIGV4dGVuZHMgTG9vcCB7CiAgZmluYWwgTm9kZSBjb25kaXRpb247CgogIFdoaWxlKHRoaXMuY29uZGl0aW9uLCBTdGF0ZW1lbnQgYm9keSkgOiBzdXBlcihib2R5KTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFdoaWxlKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0V2hpbGUodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGNvbmRpdGlvbi5hY2NlcHQodmlzaXRvcik7CiAgICBib2R5LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBjb25kaXRpb24uYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogICAgYm9keS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBXaGlsZSBfY2xvbmUoKSA9PiBuZXcgV2hpbGUoY29uZGl0aW9uLCBib2R5KTsKfQoKY2xhc3MgRG8gZXh0ZW5kcyBMb29wIHsKICBmaW5hbCBFeHByZXNzaW9uIGNvbmRpdGlvbjsKCiAgRG8oU3RhdGVtZW50IGJvZHksIHRoaXMuY29uZGl0aW9uKSA6IHN1cGVyKGJvZHkpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0RG8odGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXREbyh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgYm9keS5hY2NlcHQodmlzaXRvcik7CiAgICBjb25kaXRpb24uYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHsKICAgIGJvZHkuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogICAgY29uZGl0aW9uLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIERvIF9jbG9uZSgpID0+IG5ldyBEbyhib2R5LCBjb25kaXRpb24pOwp9CgpjbGFzcyBDb250aW51ZSBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgU3RyaW5nIHRhcmdldExhYmVsOyAvLyBDYW4gYmUgbnVsbC4KCiAgQ29udGludWUodGhpcy50YXJnZXRMYWJlbCk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDb250aW51ZSh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdENvbnRpbnVlKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7fQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykge30KCiAgQ29udGludWUgX2Nsb25lKCkgPT4gbmV3IENvbnRpbnVlKHRhcmdldExhYmVsKTsKfQoKY2xhc3MgQnJlYWsgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIGZpbmFsIFN0cmluZyB0YXJnZXRMYWJlbDsgLy8gQ2FuIGJlIG51bGwuCgogIEJyZWFrKHRoaXMudGFyZ2V0TGFiZWwpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0QnJlYWsodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRCcmVhayh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikge30KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHt9CgogIEJyZWFrIF9jbG9uZSgpID0+IG5ldyBCcmVhayh0YXJnZXRMYWJlbCk7Cn0KCmNsYXNzIFJldHVybiBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgRXhwcmVzc2lvbiB2YWx1ZTsgLy8gQ2FuIGJlIG51bGwuCgogIFJldHVybihbdGhpcy52YWx1ZSA9IG51bGxdKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFJldHVybih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdFJldHVybih0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgaWYgKHZhbHVlICE9IG51bGwpIHZhbHVlLmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgdmFsdWUuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgUmV0dXJuIF9jbG9uZSgpID0+IG5ldyBSZXR1cm4odmFsdWUpOwp9CgpjbGFzcyBUaHJvdyBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uOwoKICBUaHJvdyh0aGlzLmV4cHJlc3Npb24pOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0VGhyb3codGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRUaHJvdyh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZXhwcmVzc2lvbi5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgZXhwcmVzc2lvbi5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBUaHJvdyBfY2xvbmUoKSA9PiBuZXcgVGhyb3coZXhwcmVzc2lvbik7Cn0KCmNsYXNzIFRyeSBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgQmxvY2sgYm9keTsKICBmaW5hbCBDYXRjaCBjYXRjaFBhcnQ7IC8vIENhbiBiZSBudWxsIGlmIFtmaW5hbGx5UGFydF0gaXMgbm9uLW51bGwuCiAgZmluYWwgQmxvY2sgZmluYWxseVBhcnQ7IC8vIENhbiBiZSBudWxsIGlmIFtjYXRjaFBhcnRdIGlzIG5vbi1udWxsLgoKICBUcnkodGhpcy5ib2R5LCB0aGlzLmNhdGNoUGFydCwgdGhpcy5maW5hbGx5UGFydCkgewogICAgYXNzZXJ0KGNhdGNoUGFydCAhPSBudWxsIHx8IGZpbmFsbHlQYXJ0ICE9IG51bGwpOwogIH0KCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFRyeSh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdFRyeSh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgYm9keS5hY2NlcHQodmlzaXRvcik7CiAgICBpZiAoY2F0Y2hQYXJ0ICE9IG51bGwpIGNhdGNoUGFydC5hY2NlcHQodmlzaXRvcik7CiAgICBpZiAoZmluYWxseVBhcnQgIT0gbnVsbCkgZmluYWxseVBhcnQuYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHsKICAgIGJvZHkuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogICAgaWYgKGNhdGNoUGFydCAhPSBudWxsKSBjYXRjaFBhcnQuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogICAgaWYgKGZpbmFsbHlQYXJ0ICE9IG51bGwpIGZpbmFsbHlQYXJ0LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIFRyeSBfY2xvbmUoKSA9PiBuZXcgVHJ5KGJvZHksIGNhdGNoUGFydCwgZmluYWxseVBhcnQpOwp9CgpjbGFzcyBDYXRjaCBleHRlbmRzIE5vZGUgewogIGZpbmFsIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uOwogIGZpbmFsIEJsb2NrIGJvZHk7CgogIENhdGNoKHRoaXMuZGVjbGFyYXRpb24sIHRoaXMuYm9keSk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDYXRjaCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdENhdGNoKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBkZWNsYXJhdGlvbi5hY2NlcHQodmlzaXRvcik7CiAgICBib2R5LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBkZWNsYXJhdGlvbi5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICBib2R5LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIENhdGNoIF9jbG9uZSgpID0+IG5ldyBDYXRjaChkZWNsYXJhdGlvbiwgYm9keSk7Cn0KCmNsYXNzIFN3aXRjaCBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgRXhwcmVzc2lvbiBrZXk7CiAgZmluYWwgTGlzdDxTd2l0Y2hDbGF1c2U+IGNhc2VzOwoKICBTd2l0Y2godGhpcy5rZXksIHRoaXMuY2FzZXMpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0U3dpdGNoKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0U3dpdGNoKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBrZXkuYWNjZXB0KHZpc2l0b3IpOwogICAgZm9yIChTd2l0Y2hDbGF1c2UgY2xhdXNlIGluIGNhc2VzKSBjbGF1c2UuYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHsKICAgIGtleS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICBmb3IgKFN3aXRjaENsYXVzZSBjbGF1c2UgaW4gY2FzZXMpIGNsYXVzZS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBTd2l0Y2ggX2Nsb25lKCkgPT4gbmV3IFN3aXRjaChrZXksIGNhc2VzKTsKfQoKYWJzdHJhY3QgY2xhc3MgU3dpdGNoQ2xhdXNlIGV4dGVuZHMgTm9kZSB7CiAgZmluYWwgQmxvY2sgYm9keTsKCiAgU3dpdGNoQ2xhdXNlKHRoaXMuYm9keSk7Cn0KCmNsYXNzIENhc2UgZXh0ZW5kcyBTd2l0Y2hDbGF1c2UgewogIGZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgQ2FzZSh0aGlzLmV4cHJlc3Npb24sIEJsb2NrIGJvZHkpIDogc3VwZXIoYm9keSk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDYXNlKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0Q2FzZSh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZXhwcmVzc2lvbi5hY2NlcHQodmlzaXRvcik7CiAgICBib2R5LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBleHByZXNzaW9uLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGJvZHkuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgQ2FzZSBfY2xvbmUoKSA9PiBuZXcgQ2FzZShleHByZXNzaW9uLCBib2R5KTsKfQoKY2xhc3MgRGVmYXVsdCBleHRlbmRzIFN3aXRjaENsYXVzZSB7CiAgRGVmYXVsdChCbG9jayBib2R5KSA6IHN1cGVyKGJvZHkpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0RGVmYXVsdCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdERlZmF1bHQodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGJvZHkuYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHsKICAgIGJvZHkuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgRGVmYXVsdCBfY2xvbmUoKSA9PiBuZXcgRGVmYXVsdChib2R5KTsKfQoKY2xhc3MgRnVuY3Rpb25EZWNsYXJhdGlvbiBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgRGVjbGFyYXRpb24gbmFtZTsKICBmaW5hbCBGdW4gZnVuY3Rpb247CgogIEZ1bmN0aW9uRGVjbGFyYXRpb24odGhpcy5uYW1lLCB0aGlzLmZ1bmN0aW9uKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24odGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBuYW1lLmFjY2VwdCh2aXNpdG9yKTsKICAgIGZ1bmN0aW9uLmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBuYW1lLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGZ1bmN0aW9uLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIEZ1bmN0aW9uRGVjbGFyYXRpb24gX2Nsb25lKCkgPT4gbmV3IEZ1bmN0aW9uRGVjbGFyYXRpb24obmFtZSwgZnVuY3Rpb24pOwp9CgpjbGFzcyBMYWJlbGVkU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBmaW5hbCBTdHJpbmcgbGFiZWw7CiAgZmluYWwgU3RhdGVtZW50IGJvZHk7CgogIExhYmVsZWRTdGF0ZW1lbnQodGhpcy5sYWJlbCwgdGhpcy5ib2R5KTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdExhYmVsZWRTdGF0ZW1lbnQodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRMYWJlbGVkU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBib2R5LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBib2R5LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIExhYmVsZWRTdGF0ZW1lbnQgX2Nsb25lKCkgPT4gbmV3IExhYmVsZWRTdGF0ZW1lbnQobGFiZWwsIGJvZHkpOwp9CgpjbGFzcyBMaXRlcmFsU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBmaW5hbCBTdHJpbmcgY29kZTsKCiAgTGl0ZXJhbFN0YXRlbWVudCh0aGlzLmNvZGUpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0TGl0ZXJhbFN0YXRlbWVudCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdExpdGVyYWxTdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHt9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7fQoKICBMaXRlcmFsU3RhdGVtZW50IF9jbG9uZSgpID0+IG5ldyBMaXRlcmFsU3RhdGVtZW50KGNvZGUpOwp9CgovLyBOb3QgYSByZWFsIEphdmFTY3JpcHQgbm9kZSwgYnV0IHJlcHJlc2VudHMgdGhlIHlpZWxkIHN0YXRlbWVudCBmcm9tIGEgZGFydAovLyBwcm9ncmFtIHRyYW5zbGF0ZWQgdG8gSmF2YVNjcmlwdC4KY2xhc3MgRGFydFlpZWxkIGV4dGVuZHMgU3RhdGVtZW50IHsKICBmaW5hbCBFeHByZXNzaW9uIGV4cHJlc3Npb247CgogIGZpbmFsIGJvb2wgaGFzU3RhcjsKCiAgRGFydFlpZWxkKHRoaXMuZXhwcmVzc2lvbiwgdGhpcy5oYXNTdGFyKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdERhcnRZaWVsZCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdERhcnRZaWVsZCh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZXhwcmVzc2lvbi5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgZXhwcmVzc2lvbi5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBEYXJ0WWllbGQgX2Nsb25lKCkgPT4gbmV3IERhcnRZaWVsZChleHByZXNzaW9uLCBoYXNTdGFyKTsKfQoKYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvbiBleHRlbmRzIE5vZGUgewogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsOwoKICBTdGF0ZW1lbnQgdG9TdGF0ZW1lbnQoKSA9PiBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCh0aGlzKTsKfQoKYWJzdHJhY3QgY2xhc3MgRGVjbGFyYXRpb24gaW1wbGVtZW50cyBWYXJpYWJsZVJlZmVyZW5jZSB7fQoKLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIFtOYW1lXSByZXByZXNlbnRzIGEgcG90ZW50aWFsbHkgbGF0ZSBib3VuZCBuYW1lIGluCi8vLyB0aGUgZ2VuZXJhdGVkIGFzdC4KLy8vCi8vLyBXaGlsZSBbTmFtZV0gaW1wbGVtZW50cyBjb21wYXJhYmxlLCB0aGVyZSBpcyBubyByZXF1aXJlbWVudCBvbiB0aGUgYWN0dWFsCi8vLyBpbXBsZW1lbnRhdGlvbiBvZiBbY29tcGFyZVRvXSBvdGhlciB0aGFuIHRoYXQgaXQgbmVlZHMgdG8gYmUgc3RhYmxlLgovLy8gSW4gcGFydGljdWxhciwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mIFtjb21wYXJlVG9dCi8vLyB3aWxsIGltcGxlbWVudCBzb21lIGZvcm0gb2YgbGV4aWNvZ3JhcGhpYyBvcmRlcmluZyBsaWtlIFtTdHJpbmcuY29tcGFyZVRvXS4KYWJzdHJhY3QgY2xhc3MgTmFtZSBleHRlbmRzIExpdGVyYWwKICAgIGltcGxlbWVudHMgRGVjbGFyYXRpb24sIFBhcmFtZXRlciwgQ29tcGFyYWJsZTxOYW1lPiB7CiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdE5hbWUodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXROYW1lKHRoaXMsIGFyZyk7CgogIE5hbWUgX2Nsb25lKCk7CgogIC8vLyBSZXR1cm5zIGEgdW5pcXVlIFtrZXldIGZvciB0aGlzIG5hbWUuCiAgLy8vCiAgLy8vIFRoZSBrZXkgaXMgdW5yZWxhdGVkIHRvIHRoZSBhY3R1YWwgbmFtZSBhbmQgaXMgbm90IGludGVuZGVkIGZvciBodW1hbgogIC8vLyBjb25zdW1wdGlvbi4gQXMgc3VjaCwgaXQgbWlnaHQgYmUgbG9uZyBvciBjcnlwdGljLgogIFN0cmluZyBnZXQga2V5OwoKICBib29sIGdldCBhbGxvd1JlbmFtZSA9PiBmYWxzZTsKfQoKY2xhc3MgTGl0ZXJhbFN0cmluZ0Zyb21OYW1lIGV4dGVuZHMgTGl0ZXJhbFN0cmluZyB7CiAgTmFtZSBuYW1lOwoKICBMaXRlcmFsU3RyaW5nRnJvbU5hbWUodGhpcy5uYW1lKSA6IHN1cGVyKG51bGwpOwoKICBTdHJpbmcgZ2V0IHZhbHVlID0+ICciJHtuYW1lLm5hbWV9Iic7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBuYW1lLmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBuYW1lLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9Cn0KCmNsYXNzIExpdGVyYWxFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgZmluYWwgU3RyaW5nIHRlbXBsYXRlOwogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gaW5wdXRzOwoKICBMaXRlcmFsRXhwcmVzc2lvbih0aGlzLnRlbXBsYXRlKSA6IGlucHV0cyA9IGNvbnN0IFtdOwoKICBMaXRlcmFsRXhwcmVzc2lvbi53aXRoRGF0YSh0aGlzLnRlbXBsYXRlLCB0aGlzLmlucHV0cyk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRMaXRlcmFsRXhwcmVzc2lvbih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdExpdGVyYWxFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBpZiAoaW5wdXRzICE9IG51bGwpIHsKICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHIgaW4gaW5wdXRzKSBleHByLmFjY2VwdCh2aXNpdG9yKTsKICAgIH0KICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBpZiAoaW5wdXRzICE9IG51bGwpIHsKICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHIgaW4gaW5wdXRzKSBleHByLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIH0KICB9CgogIExpdGVyYWxFeHByZXNzaW9uIF9jbG9uZSgpID0+CiAgICAgIG5ldyBMaXRlcmFsRXhwcmVzc2lvbi53aXRoRGF0YSh0ZW1wbGF0ZSwgaW5wdXRzKTsKCiAgLy8gQ29kZSB0aGF0IHVzZXMgSlMgbXVzdCB0YWtlIGNhcmUgb2Ygb3BlcmF0b3IgcHJlY2VkZW5jZXMsIGFuZAogIC8vIHB1dCBwYXJlbnRoZXNpcyBpZiBuZWVkZWQuCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gUFJJTUFSWTsKfQoKLyoqCiAqIFtWYXJpYWJsZURlY2xhcmF0aW9uTGlzdF0gaXMgYSBzdWJjbGFzcyBvZiBbRXhwcmVzc2lvbl0gdG8gc2ltcGxpZnkgdGhlCiAqIEFTVC4KICovCmNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgZmluYWwgTGlzdDxWYXJpYWJsZUluaXRpYWxpemF0aW9uPiBkZWNsYXJhdGlvbnM7CgogIC8vLyBXaGVuIHByZXR0eS1wcmludGluZyBhIGRlY2xhcmF0aW9uIGxpc3Qgd2l0aCBtdWx0aXBsZSBkZWNsYXJhdGlvbnMgb3ZlcgogIC8vLyBzZXZlcmFsIGxpbmVzLCB0aGUgZGVjbGFyYXRpb25zIGFyZSB1c3VhbGx5IGluZGVudGVkIHdpdGggcmVzcGVjdCB0byB0aGUKICAvLy8gYHZhcmAga2V5d29yZC4gU2V0IFtpbmRlbnRTcGxpdHNdIHRvIGBmYWxzZWAgdG8gc3VwcHJlc3MgdGhlIGluZGVudGF0aW9uLgogIGZpbmFsIGJvb2wgaW5kZW50U3BsaXRzOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCh0aGlzLmRlY2xhcmF0aW9ucywge3RoaXMuaW5kZW50U3BsaXRzID0gdHJ1ZX0pOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PgogICAgICB2aXNpdG9yLnZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbkxpc3QodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZm9yIChWYXJpYWJsZUluaXRpYWxpemF0aW9uIGRlY2xhcmF0aW9uIGluIGRlY2xhcmF0aW9ucykgewogICAgICBkZWNsYXJhdGlvbi5hY2NlcHQodmlzaXRvcik7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgZm9yIChWYXJpYWJsZUluaXRpYWxpemF0aW9uIGRlY2xhcmF0aW9uIGluIGRlY2xhcmF0aW9ucykgewogICAgICBkZWNsYXJhdGlvbi5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICB9CiAgfQoKICBWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBfY2xvbmUoKSA9PiBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoZGVjbGFyYXRpb25zKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gRVhQUkVTU0lPTjsKfQoKLy8vIEZvcmNlZCBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uIFByZXR0eS1wcmludGluZyB3aWxsIGVtaXQgcGFyZW50aGVzZXMgYmFzZWQKLy8vIG9uIG5lZWQsIHNvIHRoaXMgbm9kZSBpcyB2ZXJ5IHJhcmVseSBuZWVkZWQuCmNsYXNzIFBhcmVudGhlc2VzIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgZmluYWwgRXhwcmVzc2lvbiBlbmNsb3NlZDsKCiAgUGFyZW50aGVzZXModGhpcy5lbmNsb3NlZCk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRQYXJlbnRoZXNlcyh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdFBhcmVudGhlc2VzKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBlbmNsb3NlZC5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgZW5jbG9zZWQuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgUGFyZW50aGVzZXMgX2Nsb25lKCkgPT4gbmV3IFBhcmVudGhlc2VzKGVuY2xvc2VkKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gUFJJTUFSWTsKfQoKY2xhc3MgQXNzaWdubWVudCBleHRlbmRzIEV4cHJlc3Npb24gewogIGZpbmFsIEV4cHJlc3Npb24gbGVmdEhhbmRTaWRlOwogIGZpbmFsIFN0cmluZyBvcDsgLy8gTnVsbCwgaWYgdGhlIGFzc2lnbm1lbnQgaXMgbm90IGNvbXBvdW5kLgogIGZpbmFsIEV4cHJlc3Npb24gdmFsdWU7IC8vIE1heSBiZSBudWxsLCBmb3IgW1ZhcmlhYmxlSW5pdGlhbGl6YXRpb25dcy4KCiAgQXNzaWdubWVudChsZWZ0SGFuZFNpZGUsIHZhbHVlKSA6IHRoaXMuY29tcG91bmQobGVmdEhhbmRTaWRlLCBudWxsLCB2YWx1ZSk7CgogIC8vIElmIGB0aGlzLm9wID09IG51bGxgIHRoaXMgd2lsbCBiZSBhIG5vbi1jb21wb3VuZCBhc3NpZ25tZW50LgogIEFzc2lnbm1lbnQuY29tcG91bmQodGhpcy5sZWZ0SGFuZFNpZGUsIHRoaXMub3AsIHRoaXMudmFsdWUpOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBBU1NJR05NRU5UOwoKICBib29sIGdldCBpc0NvbXBvdW5kID0+IG9wICE9IG51bGw7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRBc3NpZ25tZW50KHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0QXNzaWdubWVudCh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgbGVmdEhhbmRTaWRlLmFjY2VwdCh2aXNpdG9yKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB2YWx1ZS5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgbGVmdEhhbmRTaWRlLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB2YWx1ZS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBBc3NpZ25tZW50IF9jbG9uZSgpID0+IG5ldyBBc3NpZ25tZW50LmNvbXBvdW5kKGxlZnRIYW5kU2lkZSwgb3AsIHZhbHVlKTsKfQoKY2xhc3MgVmFyaWFibGVJbml0aWFsaXphdGlvbiBleHRlbmRzIEFzc2lnbm1lbnQgewogIC8qKiBbdmFsdWVdIG1heSBiZSBudWxsLiAqLwogIFZhcmlhYmxlSW5pdGlhbGl6YXRpb24oRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEV4cHJlc3Npb24gdmFsdWUpCiAgICAgIDogc3VwZXIoZGVjbGFyYXRpb24sIHZhbHVlKTsKCiAgRGVjbGFyYXRpb24gZ2V0IGRlY2xhcmF0aW9uID0+IGxlZnRIYW5kU2lkZTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4KICAgICAgdmlzaXRvci52aXNpdFZhcmlhYmxlSW5pdGlhbGl6YXRpb24odGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKHRoaXMsIGFyZyk7CgogIFZhcmlhYmxlSW5pdGlhbGl6YXRpb24gX2Nsb25lKCkgPT4KICAgICAgbmV3IFZhcmlhYmxlSW5pdGlhbGl6YXRpb24oZGVjbGFyYXRpb24sIHZhbHVlKTsKfQoKY2xhc3MgQ29uZGl0aW9uYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBmaW5hbCBFeHByZXNzaW9uIHRoZW47CiAgZmluYWwgRXhwcmVzc2lvbiBvdGhlcndpc2U7CgogIENvbmRpdGlvbmFsKHRoaXMuY29uZGl0aW9uLCB0aGlzLnRoZW4sIHRoaXMub3RoZXJ3aXNlKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdENvbmRpdGlvbmFsKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0Q29uZGl0aW9uYWwodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGNvbmRpdGlvbi5hY2NlcHQodmlzaXRvcik7CiAgICB0aGVuLmFjY2VwdCh2aXNpdG9yKTsKICAgIG90aGVyd2lzZS5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgY29uZGl0aW9uLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIHRoZW4uYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogICAgb3RoZXJ3aXNlLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIENvbmRpdGlvbmFsIF9jbG9uZSgpID0+IG5ldyBDb25kaXRpb25hbChjb25kaXRpb24sIHRoZW4sIG90aGVyd2lzZSk7CgogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsID0+IEFTU0lHTk1FTlQ7Cn0KCmNsYXNzIENhbGwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIHRhcmdldDsKICBMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50czsKCiAgQ2FsbCh0aGlzLnRhcmdldCwgdGhpcy5hcmd1bWVudHMsCiAgICAgIHtKYXZhU2NyaXB0Tm9kZVNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAgdGhpcy5fc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICB9CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDYWxsKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0Q2FsbCh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgdGFyZ2V0LmFjY2VwdCh2aXNpdG9yKTsKICAgIGZvciAoRXhwcmVzc2lvbiBhcmcgaW4gYXJndW1lbnRzKSB7CiAgICAgIGFyZy5hY2NlcHQodmlzaXRvcik7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgdGFyZ2V0LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGZvciAoRXhwcmVzc2lvbiBhcmcgaW4gYXJndW1lbnRzKSB7CiAgICAgIGFyZy5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICB9CiAgfQoKICBDYWxsIF9jbG9uZSgpID0+IG5ldyBDYWxsKHRhcmdldCwgYXJndW1lbnRzKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gQ0FMTDsKfQoKY2xhc3MgTmV3IGV4dGVuZHMgQ2FsbCB7CiAgTmV3KEV4cHJlc3Npb24gY2xzLCBMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50cykgOiBzdXBlcihjbHMsIGFyZ3VtZW50cyk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXROZXcodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXROZXcodGhpcywgYXJnKTsKCiAgTmV3IF9jbG9uZSgpID0+IG5ldyBOZXcodGFyZ2V0LCBhcmd1bWVudHMpOwp9CgpjbGFzcyBCaW5hcnkgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBTdHJpbmcgb3A7CiAgZmluYWwgRXhwcmVzc2lvbiBsZWZ0OwogIGZpbmFsIEV4cHJlc3Npb24gcmlnaHQ7CgogIEJpbmFyeSh0aGlzLm9wLCB0aGlzLmxlZnQsIHRoaXMucmlnaHQpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0QmluYXJ5KHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0QmluYXJ5KHRoaXMsIGFyZyk7CgogIEJpbmFyeSBfY2xvbmUoKSA9PiBuZXcgQmluYXJ5KG9wLCBsZWZ0LCByaWdodCk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBsZWZ0LmFjY2VwdCh2aXNpdG9yKTsKICAgIHJpZ2h0LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBsZWZ0LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIHJpZ2h0LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIGJvb2wgZ2V0IGlzQ29tbWFPcGVyYXRvciA9PiBvcCA9PSAnLCc7CgogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsIHsKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBzd2l0Y2ggdG8gY29uc3RhbnQgbWFwLgogICAgc3dpdGNoIChvcCkgewogICAgICBjYXNlICIqIjoKICAgICAgY2FzZSAiLyI6CiAgICAgIGNhc2UgIiUiOgogICAgICAgIHJldHVybiBNVUxUSVBMSUNBVElWRTsKICAgICAgY2FzZSAiKyI6CiAgICAgIGNhc2UgIi0iOgogICAgICAgIHJldHVybiBBRERJVElWRTsKICAgICAgY2FzZSAiPDwiOgogICAgICBjYXNlICI+PiI6CiAgICAgIGNhc2UgIj4+PiI6CiAgICAgICAgcmV0dXJuIFNISUZUOwogICAgICBjYXNlICI8IjoKICAgICAgY2FzZSAiPiI6CiAgICAgIGNhc2UgIjw9IjoKICAgICAgY2FzZSAiPj0iOgogICAgICBjYXNlICJpbnN0YW5jZW9mIjoKICAgICAgY2FzZSAiaW4iOgogICAgICAgIHJldHVybiBSRUxBVElPTkFMOwogICAgICBjYXNlICI9PSI6CiAgICAgIGNhc2UgIj09PSI6CiAgICAgIGNhc2UgIiE9IjoKICAgICAgY2FzZSAiIT09IjoKICAgICAgICByZXR1cm4gRVFVQUxJVFk7CiAgICAgIGNhc2UgIiYiOgogICAgICAgIHJldHVybiBCSVRfQU5EOwogICAgICBjYXNlICJeIjoKICAgICAgICByZXR1cm4gQklUX1hPUjsKICAgICAgY2FzZSAifCI6CiAgICAgICAgcmV0dXJuIEJJVF9PUjsKICAgICAgY2FzZSAiJiYiOgogICAgICAgIHJldHVybiBMT0dJQ0FMX0FORDsKICAgICAgY2FzZSAifHwiOgogICAgICAgIHJldHVybiBMT0dJQ0FMX09SOwogICAgICBjYXNlICcsJzoKICAgICAgICByZXR1cm4gRVhQUkVTU0lPTjsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyAiSW50ZXJuYWwgRXJyb3I6IFVuaGFuZGxlZCBiaW5hcnkgb3BlcmF0b3I6ICRvcCI7CiAgICB9CiAgfQp9CgpjbGFzcyBQcmVmaXggZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBTdHJpbmcgb3A7CiAgZmluYWwgRXhwcmVzc2lvbiBhcmd1bWVudDsKCiAgUHJlZml4KHRoaXMub3AsIHRoaXMuYXJndW1lbnQpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0UHJlZml4KHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0UHJlZml4KHRoaXMsIGFyZyk7CgogIFByZWZpeCBfY2xvbmUoKSA9PiBuZXcgUHJlZml4KG9wLCBhcmd1bWVudCk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBhcmd1bWVudC5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgYXJndW1lbnQuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gVU5BUlk7Cn0KCmNsYXNzIFBvc3RmaXggZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBTdHJpbmcgb3A7CiAgZmluYWwgRXhwcmVzc2lvbiBhcmd1bWVudDsKCiAgUG9zdGZpeCh0aGlzLm9wLCB0aGlzLmFyZ3VtZW50KTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFBvc3RmaXgodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRQb3N0Zml4KHRoaXMsIGFyZyk7CgogIFBvc3RmaXggX2Nsb25lKCkgPT4gbmV3IFBvc3RmaXgob3AsIGFyZ3VtZW50KTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGFyZ3VtZW50LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBhcmd1bWVudC5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBVTkFSWTsKfQoKYWJzdHJhY3QgY2xhc3MgVmFyaWFibGVSZWZlcmVuY2UgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgVmFyaWFibGVSZWZlcmVuY2UodGhpcy5uYW1lKSB7CiAgICBhc3NlcnQoX2lkZW50aWZpZXJSRS5oYXNNYXRjaChuYW1lKSwgIk5vbi1pZGVudGlmaWVyIG5hbWUgJyRuYW1lJyIpOwogIH0KCiAgc3RhdGljIFJlZ0V4cCBfaWRlbnRpZmllclJFID0gbmV3IFJlZ0V4cChyJ15bQS1aYS16XyRdW0EtWmEtel8kMC05XSokJyk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBQUklNQVJZOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikge30KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHt9Cn0KCmNsYXNzIFZhcmlhYmxlVXNlIGV4dGVuZHMgVmFyaWFibGVSZWZlcmVuY2UgewogIFZhcmlhYmxlVXNlKFN0cmluZyBuYW1lKSA6IHN1cGVyKG5hbWUpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0VmFyaWFibGVVc2UodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZVVzZSh0aGlzLCBhcmcpOwoKICBWYXJpYWJsZVVzZSBfY2xvbmUoKSA9PiBuZXcgVmFyaWFibGVVc2UobmFtZSk7CgogIFZhcmlhYmxlVXNlIGFzVmFyaWFibGVVc2UoKSA9PiB0aGlzOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnVmFyaWFibGVVc2UoJG5hbWUpJzsKfQoKY2xhc3MgVmFyaWFibGVEZWNsYXJhdGlvbiBleHRlbmRzIFZhcmlhYmxlUmVmZXJlbmNlIGltcGxlbWVudHMgRGVjbGFyYXRpb24gewogIGZpbmFsIGJvb2wgYWxsb3dSZW5hbWU7CgogIFZhcmlhYmxlRGVjbGFyYXRpb24oU3RyaW5nIG5hbWUsIHt0aGlzLmFsbG93UmVuYW1lOiB0cnVlfSkgOiBzdXBlcihuYW1lKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24odGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKHRoaXMsIGFyZyk7CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gX2Nsb25lKCkgPT4gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24obmFtZSk7Cn0KCmNsYXNzIFBhcmFtZXRlciBleHRlbmRzIFZhcmlhYmxlRGVjbGFyYXRpb24gewogIFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgOiBzdXBlcihuYW1lKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFBhcmFtZXRlcih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdFBhcmFtZXRlcih0aGlzLCBhcmcpOwoKICBQYXJhbWV0ZXIgX2Nsb25lKCkgPT4gbmV3IFBhcmFtZXRlcihuYW1lKTsKfQoKY2xhc3MgVGhpcyBleHRlbmRzIFBhcmFtZXRlciB7CiAgVGhpcygpIDogc3VwZXIoInRoaXMiKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFRoaXModGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRUaGlzKHRoaXMsIGFyZyk7CgogIFRoaXMgX2Nsb25lKCkgPT4gbmV3IFRoaXMoKTsKfQoKY2xhc3MgTmFtZWRGdW5jdGlvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIGZpbmFsIERlY2xhcmF0aW9uIG5hbWU7CiAgZmluYWwgRnVuIGZ1bmN0aW9uOwoKICBOYW1lZEZ1bmN0aW9uKHRoaXMubmFtZSwgdGhpcy5mdW5jdGlvbik7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXROYW1lZEZ1bmN0aW9uKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0TmFtZWRGdW5jdGlvbih0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgbmFtZS5hY2NlcHQodmlzaXRvcik7CiAgICBmdW5jdGlvbi5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgbmFtZS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICBmdW5jdGlvbi5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBOYW1lZEZ1bmN0aW9uIF9jbG9uZSgpID0+IG5ldyBOYW1lZEZ1bmN0aW9uKG5hbWUsIGZ1bmN0aW9uKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gTEVGVF9IQU5EX1NJREU7Cn0KCmNsYXNzIEZ1biBleHRlbmRzIEV4cHJlc3Npb24gewogIGZpbmFsIExpc3Q8UGFyYW1ldGVyPiBwYXJhbXM7CiAgZmluYWwgQmxvY2sgYm9keTsKICBmaW5hbCBBc3luY01vZGlmaWVyIGFzeW5jTW9kaWZpZXI7CgogIEZ1bih0aGlzLnBhcmFtcywgdGhpcy5ib2R5LCB7dGhpcy5hc3luY01vZGlmaWVyOiBBc3luY01vZGlmaWVyLnN5bmN9KTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEZ1bih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEZ1bih0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZm9yIChQYXJhbWV0ZXIgcGFyYW0gaW4gcGFyYW1zKSBwYXJhbS5hY2NlcHQodmlzaXRvcik7CiAgICBib2R5LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBmb3IgKFBhcmFtZXRlciBwYXJhbSBpbiBwYXJhbXMpIHBhcmFtLmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICAgIGJvZHkuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgRnVuIF9jbG9uZSgpID0+IG5ldyBGdW4ocGFyYW1zLCBib2R5LCBhc3luY01vZGlmaWVyOiBhc3luY01vZGlmaWVyKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gTEVGVF9IQU5EX1NJREU7Cn0KCmNsYXNzIEFzeW5jTW9kaWZpZXIgewogIGZpbmFsIGludCBpbmRleDsKICBmaW5hbCBib29sIGlzQXN5bmM7CiAgZmluYWwgYm9vbCBpc1lpZWxkaW5nOwogIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKCiAgY29uc3QgQXN5bmNNb2RpZmllcih0aGlzLmluZGV4LCB0aGlzLmRlc2NyaXB0aW9uLAogICAgICB7dGhpcy5pc0FzeW5jLCB0aGlzLmlzWWllbGRpbmd9KTsKCiAgc3RhdGljIGNvbnN0IEFzeW5jTW9kaWZpZXIgc3luYyA9CiAgICAgIGNvbnN0IEFzeW5jTW9kaWZpZXIoMCwgInN5bmMiLCBpc0FzeW5jOiBmYWxzZSwgaXNZaWVsZGluZzogZmFsc2UpOwogIHN0YXRpYyBjb25zdCBBc3luY01vZGlmaWVyIGFzeW5jID0KICAgICAgY29uc3QgQXN5bmNNb2RpZmllcigxLCAiYXN5bmMiLCBpc0FzeW5jOiB0cnVlLCBpc1lpZWxkaW5nOiBmYWxzZSk7CiAgc3RhdGljIGNvbnN0IEFzeW5jTW9kaWZpZXIgYXN5bmNTdGFyID0KICAgICAgY29uc3QgQXN5bmNNb2RpZmllcigyLCAiYXN5bmMqIiwgaXNBc3luYzogdHJ1ZSwgaXNZaWVsZGluZzogdHJ1ZSk7CiAgc3RhdGljIGNvbnN0IEFzeW5jTW9kaWZpZXIgc3luY1N0YXIgPQogICAgICBjb25zdCBBc3luY01vZGlmaWVyKDMsICJzeW5jKiIsIGlzQXN5bmM6IGZhbHNlLCBpc1lpZWxkaW5nOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IExpc3Q8QXN5bmNNb2RpZmllcj4gdmFsdWVzID0gW3N5bmMsIGFzeW5jLCBhc3luY1N0YXIsIHN5bmNTdGFyXTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gZGVzY3JpcHRpb247Cn0KCmNsYXNzIFByb3BlcnR5QWNjZXNzIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgZmluYWwgRXhwcmVzc2lvbiByZWNlaXZlcjsKICBmaW5hbCBFeHByZXNzaW9uIHNlbGVjdG9yOwoKICBQcm9wZXJ0eUFjY2Vzcyh0aGlzLnJlY2VpdmVyLCB0aGlzLnNlbGVjdG9yKTsKCiAgUHJvcGVydHlBY2Nlc3MuZmllbGQodGhpcy5yZWNlaXZlciwgU3RyaW5nIGZpZWxkTmFtZSkKICAgICAgOiBzZWxlY3RvciA9IG5ldyBMaXRlcmFsU3RyaW5nKCciJGZpZWxkTmFtZSInKTsKCiAgUHJvcGVydHlBY2Nlc3MuaW5kZXhlZCh0aGlzLnJlY2VpdmVyLCBpbnQgaW5kZXgpCiAgICAgIDogc2VsZWN0b3IgPSBuZXcgTGl0ZXJhbE51bWJlcignJGluZGV4Jyk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRBY2Nlc3ModGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRBY2Nlc3ModGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIHJlY2VpdmVyLmFjY2VwdCh2aXNpdG9yKTsKICAgIHNlbGVjdG9yLmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICByZWNlaXZlci5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICBzZWxlY3Rvci5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBQcm9wZXJ0eUFjY2VzcyBfY2xvbmUoKSA9PiBuZXcgUHJvcGVydHlBY2Nlc3MocmVjZWl2ZXIsIHNlbGVjdG9yKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gTEVGVF9IQU5EX1NJREU7Cn0KCi8vLyBBIFtEZWZlcnJlZFRva2VuXSBpcyBhIHBsYWNlaG9sZGVyIGZvciBzb21lIFtFeHByZXNzaW9uXSB0aGF0IGlzIG5vdCBrbm93bgovLy8gYXQgY29uc3RydWN0aW9uIHRpbWUgb2YgYW4gYXN0LiBVbmxpa2UgW0ludGVycG9sYXRlZEV4cHJlc3Npb25dLAovLy8gW0RlZmVycmVkVG9rZW5dIGlzIG5vdCBsaW1pdGVkIHRvIHRlbXBsYXRlcyBidXQgbWF5IGFsc28gb2NjdXIgaW4KLy8vIGZ1bGx5IGluc3RhbnRpYXRlZCBhc3RzLgphYnN0cmFjdCBjbGFzcyBEZWZlcnJlZFRva2VuIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHt9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7fQoKICBEZWZlcnJlZFRva2VuIF9jbG9uZSgpID0+IHRoaXM7Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIGEgZGVmZXJyZWQgaW50ZWdlciB2YWx1ZS4gQW4gaW1wbGVtZW50YXRpb24gaGFzIHRvIHByb3ZpZGUKLy8vIGEgdmFsdWUgdmlhIHRoZSBbdmFsdWVdIGdldHRlciB0aGUgbGF0ZXN0IHdoZW4gdGhlIGFzdCBpcyBwcmludGVkLgphYnN0cmFjdCBjbGFzcyBEZWZlcnJlZE51bWJlciBleHRlbmRzIERlZmVycmVkVG9rZW4gaW1wbGVtZW50cyBMaXRlcmFsIHsKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0RGVmZXJyZWROdW1iZXIodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXREZWZlcnJlZE51bWJlcih0aGlzLCBhcmcpOwoKICBpbnQgZ2V0IHZhbHVlOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiB2YWx1ZS5pc05lZ2F0aXZlID8gVU5BUlkgOiBQUklNQVJZOwp9CgovLy8gSW50ZXJmYWNlIGZvciBhIGRlZmVycmVkIHN0cmluZyB2YWx1ZS4gQW4gaW1wbGVtZW50YXRpb24gaGFzIHRvIHByb3ZpZGUKLy8vIGEgdmFsdWUgdmlhIHRoZSBbdmFsdWVdIGdldHRlciB0aGUgbGF0ZXN0IHdoZW4gdGhlIGFzdCBpcyBwcmludGVkLgphYnN0cmFjdCBjbGFzcyBEZWZlcnJlZFN0cmluZyBleHRlbmRzIERlZmVycmVkVG9rZW4gaW1wbGVtZW50cyBMaXRlcmFsIHsKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0RGVmZXJyZWRTdHJpbmcodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXREZWZlcnJlZFN0cmluZyh0aGlzLCBhcmcpOwoKICBTdHJpbmcgZ2V0IHZhbHVlOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBQUklNQVJZOwp9CgovLy8gSW50ZXJmYWNlIGZvciBhIGRlZmVycmVkIFtFeHByZXNzaW9uXSB2YWx1ZS4gQW4gaW1wbGVtZW50YXRpb24gaGFzIHRvIHByb3ZpZGUKLy8vIGEgdmFsdWUgdmlhIHRoZSBbdmFsdWVdIGdldHRlciB0aGUgbGF0ZXN0IHdoZW4gdGhlIGFzdCBpcyBwcmludGVkLgovLy8gQWxzbywgW3ByZWNlZGVuY2VMZXZlbF0gaGFzIHRvIHJldHVybiB0aGUgc2FtZSB2YWx1ZSB0aGF0Ci8vLyBbdmFsdWUucHJlY2VkZW5jZUxldmVsXSByZXR1cm5zIG9uY2UgW3ZhbHVlXSBpcyBib3VuZCB0byBhbiBbRXhwcmVzc2lvbl0uCmFic3RyYWN0IGNsYXNzIERlZmVycmVkRXhwcmVzc2lvbiBleHRlbmRzIERlZmVycmVkVG9rZW4gewogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXREZWZlcnJlZEV4cHJlc3Npb24odGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXREZWZlcnJlZEV4cHJlc3Npb24odGhpcywgYXJnKTsKCiAgRXhwcmVzc2lvbiBnZXQgdmFsdWU7Cn0KCmFic3RyYWN0IGNsYXNzIExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikge30KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHt9CgogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsID0+IFBSSU1BUlk7Cn0KCmNsYXNzIExpdGVyYWxCb29sIGV4dGVuZHMgTGl0ZXJhbCB7CiAgZmluYWwgYm9vbCB2YWx1ZTsKCiAgTGl0ZXJhbEJvb2wodGhpcy52YWx1ZSk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRMaXRlcmFsQm9vbCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdExpdGVyYWxCb29sKHRoaXMsIGFyZyk7CgogIC8vIFt2aXNpdENoaWxkcmVuXSBpbmhlcml0ZWQgZnJvbSBbTGl0ZXJhbF0uCgogIExpdGVyYWxCb29sIF9jbG9uZSgpID0+IG5ldyBMaXRlcmFsQm9vbCh2YWx1ZSk7Cn0KCmNsYXNzIExpdGVyYWxOdWxsIGV4dGVuZHMgTGl0ZXJhbCB7CiAgTGl0ZXJhbE51bGwoKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdExpdGVyYWxOdWxsKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0TGl0ZXJhbE51bGwodGhpcywgYXJnKTsKCiAgTGl0ZXJhbE51bGwgX2Nsb25lKCkgPT4gbmV3IExpdGVyYWxOdWxsKCk7Cn0KCmNsYXNzIExpdGVyYWxTdHJpbmcgZXh0ZW5kcyBMaXRlcmFsIHsKICBmaW5hbCBTdHJpbmcgdmFsdWU7CgogIC8qKgogICAqIENvbnN0cnVjdHMgYSBMaXRlcmFsU3RyaW5nIGZyb20gYSBzdHJpbmcgdmFsdWUuCiAgICoKICAgKiBUaGUgY29uc3RydWN0b3IgZG9lcyBub3QgYWRkIHRoZSByZXF1aXJlZCBxdW90ZXMuICBJZiBbdmFsdWVdIGlzIG5vdAogICAqIHN1cnJvdW5kZWQgYnkgcXVvdGVzIGFuZCBwcm9wZXJseSBlc2NhcGVkLCB0aGUgcmVzdWx0aW5nIG9iamVjdCBpcyBpbnZhbGlkCiAgICogYXMgYSBKUyB2YWx1ZS4KICAgKgogICAqIFRPRE8oc3JhKTogSW50cm9kdWNlIHZhcmlhbnRzIGZvciBrbm93biB2YWxpZCBzdHJpbmdzIHRoYXQgZG9uJ3QgYWxsb2NhdGUgYQogICAqIG5ldyBzdHJpbmcganVzdCB0byBhZGQgcXVvdGVzLgogICAqLwogIExpdGVyYWxTdHJpbmcodGhpcy52YWx1ZSk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRMaXRlcmFsU3RyaW5nKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0TGl0ZXJhbFN0cmluZyh0aGlzLCBhcmcpOwoKICBMaXRlcmFsU3RyaW5nIF9jbG9uZSgpID0+IG5ldyBMaXRlcmFsU3RyaW5nKHZhbHVlKTsKfQoKY2xhc3MgU3RyaW5nQ29uY2F0ZW5hdGlvbiBleHRlbmRzIExpdGVyYWwgewogIGZpbmFsIExpc3Q8TGl0ZXJhbD4gcGFydHM7CgogIC8qKgogICAqIENvbnN0cnVjdHMgYSBTdHJpbmdDb25jYXRlbmF0aW9uIGZyb20gYSBsaXN0IG9mIExpdGVyYWwgZWxlbWVudHMuCiAgICogVGhlIGNvbnN0cnVjdG9yIGRvZXMgbm90IGFkZCBzdXJyb3VuZGluZyBxdW90ZXMgdG8gdGhlIHJlc3VsdGluZwogICAqIGNvbmNhdGVuYXRlZCBzdHJpbmcuCiAgICovCiAgU3RyaW5nQ29uY2F0ZW5hdGlvbih0aGlzLnBhcnRzKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24odGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7CiAgICBmb3IgKExpdGVyYWwgcGFydCBpbiBwYXJ0cykgcGFydC5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgZm9yIChMaXRlcmFsIHBhcnQgaW4gcGFydHMpIHBhcnQuYWNjZXB0MSh2aXNpdG9yLCBhcmcpOwogIH0KCiAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfY2xvbmUoKSA9PiBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbih0aGlzLnBhcnRzKTsKfQoKY2xhc3MgTGl0ZXJhbE51bWJlciBleHRlbmRzIExpdGVyYWwgewogIGZpbmFsIFN0cmluZyB2YWx1ZTsgLy8gTXVzdCBiZSBhIHZhbGlkIEphdmFTY3JpcHQgbnVtYmVyIGxpdGVyYWwuCgogIExpdGVyYWxOdW1iZXIodGhpcy52YWx1ZSk7CgogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsID0+IHZhbHVlLnN0YXJ0c1dpdGgoJy0nKSA/IFVOQVJZIDogUFJJTUFSWTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdExpdGVyYWxOdW1iZXIodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRMaXRlcmFsTnVtYmVyKHRoaXMsIGFyZyk7CgogIExpdGVyYWxOdW1iZXIgX2Nsb25lKCkgPT4gbmV3IExpdGVyYWxOdW1iZXIodmFsdWUpOwp9CgpjbGFzcyBBcnJheUluaXRpYWxpemVyIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBlbGVtZW50czsKCiAgQXJyYXlJbml0aWFsaXplcih0aGlzLmVsZW1lbnRzKSA6IGFzc2VydCghZWxlbWVudHMuY29udGFpbnMobnVsbCkpOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0QXJyYXlJbml0aWFsaXplcih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEFycmF5SW5pdGlhbGl6ZXIodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKICAgIGZvciAoRXhwcmVzc2lvbiBlbGVtZW50IGluIGVsZW1lbnRzKSBlbGVtZW50LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7CiAgICBmb3IgKEV4cHJlc3Npb24gZWxlbWVudCBpbiBlbGVtZW50cykgZWxlbWVudC5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBBcnJheUluaXRpYWxpemVyIF9jbG9uZSgpID0+IG5ldyBBcnJheUluaXRpYWxpemVyKGVsZW1lbnRzKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gUFJJTUFSWTsKfQoKLyoqCiAqIEFuIGVtcHR5IHBsYWNlIGluIGFuIFtBcnJheUluaXRpYWxpemVyXS4KICogRm9yIGV4YW1wbGUgdGhlIGxpc3QgWzEsICwgLCAyXSB3b3VsZCBjb250YWluIHR3byBob2xlcy4KICovCmNsYXNzIEFycmF5SG9sZSBleHRlbmRzIEV4cHJlc3Npb24gewogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRBcnJheUhvbGUodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRBcnJheUhvbGUodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHt9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7fQoKICBBcnJheUhvbGUgX2Nsb25lKCkgPT4gbmV3IEFycmF5SG9sZSgpOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBQUklNQVJZOwp9CgpjbGFzcyBPYmplY3RJbml0aWFsaXplciBleHRlbmRzIEV4cHJlc3Npb24gewogIGZpbmFsIExpc3Q8UHJvcGVydHk+IHByb3BlcnRpZXM7CiAgZmluYWwgYm9vbCBpc09uZUxpbmVyOwoKICAvKioKICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG9iamVjdC1pbml0aWFsaXplciBjb250YWluaW5nIHRoZSBnaXZlbiBbcHJvcGVydGllc10uCiAgICoKICAgKiBbaXNPbmVMaW5lcl0gZGVzY3JpYmVzIHRoZSBiZWhhdmlvdXIgd2hlbiBwcmV0dHktcHJpbnRpbmcgKG5vbi1taW5pZmllZCkuCiAgICogSWYgdHJ1ZSBwcmludCBhbGwgcHJvcGVydGllcyBvbiB0aGUgc2FtZSBsaW5lLgogICAqIElmIGZhbHNlIHByaW50IGVhY2ggcHJvcGVydHkgb24gYSBzZXBlcmF0ZSBsaW5lLgogICAqLwogIE9iamVjdEluaXRpYWxpemVyKHRoaXMucHJvcGVydGllcywge3RoaXMuaXNPbmVMaW5lcjogdHJ1ZX0pOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0T2JqZWN0SW5pdGlhbGl6ZXIodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRPYmplY3RJbml0aWFsaXplcih0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgZm9yIChQcm9wZXJ0eSBpbml0IGluIHByb3BlcnRpZXMpIGluaXQuYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHsKICAgIGZvciAoUHJvcGVydHkgaW5pdCBpbiBwcm9wZXJ0aWVzKSBpbml0LmFjY2VwdDEodmlzaXRvciwgYXJnKTsKICB9CgogIE9iamVjdEluaXRpYWxpemVyIF9jbG9uZSgpID0+CiAgICAgIG5ldyBPYmplY3RJbml0aWFsaXplcihwcm9wZXJ0aWVzLCBpc09uZUxpbmVyOiBpc09uZUxpbmVyKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gUFJJTUFSWTsKfQoKY2xhc3MgUHJvcGVydHkgZXh0ZW5kcyBOb2RlIHsKICBmaW5hbCBFeHByZXNzaW9uIG5hbWU7CiAgZmluYWwgRXhwcmVzc2lvbiB2YWx1ZTsKCiAgUHJvcGVydHkodGhpcy5uYW1lLCB0aGlzLnZhbHVlKQogICAgICA6IGFzc2VydChuYW1lIGlzIExpdGVyYWwgfHwgbmFtZSBpcyBEZWZlcnJlZEV4cHJlc3Npb24pOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0UHJvcGVydHkodGhpcyk7CgogIFIgYWNjZXB0MTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRQcm9wZXJ0eSh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgewogICAgbmFtZS5hY2NlcHQodmlzaXRvcik7CiAgICB2YWx1ZS5hY2NlcHQodmlzaXRvcik7CiAgfQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgewogICAgbmFtZS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgICB2YWx1ZS5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CiAgfQoKICBQcm9wZXJ0eSBfY2xvbmUoKSA9PiBuZXcgUHJvcGVydHkobmFtZSwgdmFsdWUpOwp9CgovLy8gVGFnIGNsYXNzIGZvciBhbGwgaW50ZXJwb2xhdGVkIHBvc2l0aW9ucy4KYWJzdHJhY3QgY2xhc3MgSW50ZXJwb2xhdGVkTm9kZSBpbXBsZW1lbnRzIE5vZGUgewogIGdldCBuYW1lT3JQb3NpdGlvbjsKCiAgYm9vbCBnZXQgaXNOYW1lZCA9PiBuYW1lT3JQb3NpdGlvbiBpcyBTdHJpbmc7CgogIGJvb2wgZ2V0IGlzUG9zaXRpb25hbCA9PiBuYW1lT3JQb3NpdGlvbiBpcyBpbnQ7Cn0KCmNsYXNzIEludGVycG9sYXRlZEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHdpdGggSW50ZXJwb2xhdGVkTm9kZSB7CiAgZmluYWwgbmFtZU9yUG9zaXRpb247CgogIEludGVycG9sYXRlZEV4cHJlc3Npb24odGhpcy5uYW1lT3JQb3NpdGlvbik7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+CiAgICAgIHZpc2l0b3IudmlzaXRJbnRlcnBvbGF0ZWRFeHByZXNzaW9uKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbih0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikge30KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHt9CgogIEludGVycG9sYXRlZEV4cHJlc3Npb24gX2Nsb25lKCkgPT4gbmV3IEludGVycG9sYXRlZEV4cHJlc3Npb24obmFtZU9yUG9zaXRpb24pOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBQUklNQVJZOwp9CgpjbGFzcyBJbnRlcnBvbGF0ZWRMaXRlcmFsIGV4dGVuZHMgTGl0ZXJhbCB3aXRoIEludGVycG9sYXRlZE5vZGUgewogIGZpbmFsIG5hbWVPclBvc2l0aW9uOwoKICBJbnRlcnBvbGF0ZWRMaXRlcmFsKHRoaXMubmFtZU9yUG9zaXRpb24pOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0SW50ZXJwb2xhdGVkTGl0ZXJhbCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEludGVycG9sYXRlZExpdGVyYWwodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHt9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7fQoKICBJbnRlcnBvbGF0ZWRMaXRlcmFsIF9jbG9uZSgpID0+IG5ldyBJbnRlcnBvbGF0ZWRMaXRlcmFsKG5hbWVPclBvc2l0aW9uKTsKfQoKY2xhc3MgSW50ZXJwb2xhdGVkUGFyYW1ldGVyIGV4dGVuZHMgRXhwcmVzc2lvbgogICAgd2l0aCBJbnRlcnBvbGF0ZWROb2RlCiAgICBpbXBsZW1lbnRzIFBhcmFtZXRlciB7CiAgZmluYWwgbmFtZU9yUG9zaXRpb247CgogIEludGVycG9sYXRlZFBhcmFtZXRlcih0aGlzLm5hbWVPclBvc2l0aW9uKTsKCiAgU3RyaW5nIGdldCBuYW1lIHsKICAgIHRocm93ICJJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIubmFtZSBtdXN0IG5vdCBiZSBpbnZva2VkIjsKICB9CgogIGJvb2wgZ2V0IGFsbG93UmVuYW1lID0+IGZhbHNlOwoKICBUIGFjY2VwdDxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSA9PgogICAgICB2aXNpdG9yLnZpc2l0SW50ZXJwb2xhdGVkUGFyYW1ldGVyKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0SW50ZXJwb2xhdGVkUGFyYW1ldGVyKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7fQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykge30KCiAgSW50ZXJwb2xhdGVkUGFyYW1ldGVyIF9jbG9uZSgpID0+IG5ldyBJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIobmFtZU9yUG9zaXRpb24pOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBQUklNQVJZOwp9CgpjbGFzcyBJbnRlcnBvbGF0ZWRTZWxlY3RvciBleHRlbmRzIEV4cHJlc3Npb24gd2l0aCBJbnRlcnBvbGF0ZWROb2RlIHsKICBmaW5hbCBuYW1lT3JQb3NpdGlvbjsKCiAgSW50ZXJwb2xhdGVkU2VsZWN0b3IodGhpcy5uYW1lT3JQb3NpdGlvbik7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+CiAgICAgIHZpc2l0b3IudmlzaXRJbnRlcnBvbGF0ZWRTZWxlY3Rvcih0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEludGVycG9sYXRlZFNlbGVjdG9yKHRoaXMsIGFyZyk7CgogIHZvaWQgdmlzaXRDaGlsZHJlbjxUPihOb2RlVmlzaXRvcjxUPiB2aXNpdG9yKSB7fQoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykge30KCiAgSW50ZXJwb2xhdGVkU2VsZWN0b3IgX2Nsb25lKCkgPT4gbmV3IEludGVycG9sYXRlZFNlbGVjdG9yKG5hbWVPclBvc2l0aW9uKTsKCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gUFJJTUFSWTsKfQoKY2xhc3MgSW50ZXJwb2xhdGVkU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHdpdGggSW50ZXJwb2xhdGVkTm9kZSB7CiAgZmluYWwgbmFtZU9yUG9zaXRpb247CgogIEludGVycG9sYXRlZFN0YXRlbWVudCh0aGlzLm5hbWVPclBvc2l0aW9uKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4KICAgICAgdmlzaXRvci52aXNpdEludGVycG9sYXRlZFN0YXRlbWVudCh0aGlzKTsKCiAgUiBhY2NlcHQxPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgdmlzaXRvci52aXNpdEludGVycG9sYXRlZFN0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikge30KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHt9CgogIEludGVycG9sYXRlZFN0YXRlbWVudCBfY2xvbmUoKSA9PiBuZXcgSW50ZXJwb2xhdGVkU3RhdGVtZW50KG5hbWVPclBvc2l0aW9uKTsKfQoKY2xhc3MgSW50ZXJwb2xhdGVkRGVjbGFyYXRpb24gZXh0ZW5kcyBFeHByZXNzaW9uCiAgICB3aXRoIEludGVycG9sYXRlZE5vZGUKICAgIGltcGxlbWVudHMgRGVjbGFyYXRpb24gewogIGZpbmFsIG5hbWVPclBvc2l0aW9uOwoKICBJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbih0aGlzLm5hbWVPclBvc2l0aW9uKTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4KICAgICAgdmlzaXRvci52aXNpdEludGVycG9sYXRlZERlY2xhcmF0aW9uKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0SW50ZXJwb2xhdGVkRGVjbGFyYXRpb24odGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpIHt9CgogIHZvaWQgdmlzaXRDaGlsZHJlbjE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSB7fQoKICBJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbiBfY2xvbmUoKSB7CiAgICByZXR1cm4gbmV3IEludGVycG9sYXRlZERlY2xhcmF0aW9uKG5hbWVPclBvc2l0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiB0aHJvdyAiTm8gbmFtZSBmb3IgdGhlIGludGVycG9sYXRlZCBub2RlIjsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4gUFJJTUFSWTsKfQoKLyoqCiAqIFtSZWdFeHBMaXRlcmFsXXMsIGRlc3BpdGUgYmVpbmcgY2FsbGVkICJMaXRlcmFsIiwgZG8gbm90IGluaGVyaXQgZnJvbQogKiBbTGl0ZXJhbF0uIEluZGVlZCwgcmVndWxhciBleHByZXNzaW9ucyBpbiBKYXZhU2NyaXB0IGhhdmUgYSBzaWRlLWVmZmVjdCBhbmQKICogYXJlIHRodXMgbm90IGluIHRoZSBzYW1lIGNhdGVnb3J5IGFzIG51bWJlcnMgb3Igc3RyaW5ncy4KICovCmNsYXNzIFJlZ0V4cExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICAvKiogQ29udGFpbnMgdGhlIHBhdHRlcm4gYW5kIHRoZSBmbGFncy4qLwogIGZpbmFsIFN0cmluZyBwYXR0ZXJuOwoKICBSZWdFeHBMaXRlcmFsKHRoaXMucGF0dGVybik7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRSZWdFeHBMaXRlcmFsKHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0UmVnRXhwTGl0ZXJhbCh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikge30KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHt9CgogIFJlZ0V4cExpdGVyYWwgX2Nsb25lKCkgPT4gbmV3IFJlZ0V4cExpdGVyYWwocGF0dGVybik7CgogIGludCBnZXQgcHJlY2VkZW5jZUxldmVsID0+IFBSSU1BUlk7Cn0KCi8qKgogKiBBbiBhc3luY2hyb25vdXMgYXdhaXQuCiAqCiAqIE5vdCBwYXJ0IG9mIEphdmFTY3JpcHQuIFdlIGRlc3VnYXIgdGhpcyBleHByZXNzaW9uIGJlZm9yZSBvdXRwdXR0aW5nLgogKiBTaG91bGQgb25seSBvY2N1ciBpbiBhIFtGdW5dIHdpdGggYGFzeW5jTW9kaWZpZXJgIGFzeW5jIG9yIGFzeW5jU3Rhci4KICovCmNsYXNzIEF3YWl0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgLyoqIFRoZSBhd2FpdGVkIGV4cHJlc3Npb24uICovCiAgZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uOwoKICBBd2FpdCh0aGlzLmV4cHJlc3Npb24pOwoKICBpbnQgZ2V0IHByZWNlZGVuY2VMZXZlbCA9PiBVTkFSWTsKCiAgVCBhY2NlcHQ8VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEF3YWl0KHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0QXdhaXQodGhpcywgYXJnKTsKCiAgdm9pZCB2aXNpdENoaWxkcmVuPFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IGV4cHJlc3Npb24uYWNjZXB0KHZpc2l0b3IpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW4xPFIsIEE+KE5vZGVWaXNpdG9yMTxSLCBBPiB2aXNpdG9yLCBBIGFyZykgPT4KICAgICAgZXhwcmVzc2lvbi5hY2NlcHQxKHZpc2l0b3IsIGFyZyk7CgogIEF3YWl0IF9jbG9uZSgpID0+IG5ldyBBd2FpdChleHByZXNzaW9uKTsKfQoKLyoqCiAqIEEgY29tbWVudC4KICoKICogRXh0ZW5kcyBbU3RhdGVtZW50XSBzbyB3ZSBjYW4gYWRkIGNvbW1lbnRzIGJlZm9yZSBzdGF0ZW1lbnRzIGluCiAqIFtCbG9ja10gYW5kIFtQcm9ncmFtXS4KICovCmNsYXNzIENvbW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIGZpbmFsIFN0cmluZyBjb21tZW50OwoKICBDb21tZW50KHRoaXMuY29tbWVudCk7CgogIFQgYWNjZXB0PFQ+KE5vZGVWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDb21tZW50KHRoaXMpOwoKICBSIGFjY2VwdDE8UiwgQT4oTm9kZVZpc2l0b3IxPFIsIEE+IHZpc2l0b3IsIEEgYXJnKSA9PgogICAgICB2aXNpdG9yLnZpc2l0Q29tbWVudCh0aGlzLCBhcmcpOwoKICBDb21tZW50IF9jbG9uZSgpID0+IG5ldyBDb21tZW50KGNvbW1lbnQpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW48VD4oTm9kZVZpc2l0b3I8VD4gdmlzaXRvcikge30KCiAgdm9pZCB2aXNpdENoaWxkcmVuMTxSLCBBPihOb2RlVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpIHt9Cn0KCi8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBbbm9kZV0gaWYgaXQgaXMgYSBbRGVmZXJyZWRFeHByZXNzaW9uXS4gT3RoZXJ3aXNlCi8vLyBy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ZWxlY3RvcjsKCi8vLyBbU3RyaW5nXXMgY29tbW9ubHkgdXNlZC4KY2xhc3MgSWRlbnRpZmllcnMgewogIC8vLyBUaGUgbmFtZSBvZiB0aGUgY2FsbCBvcGVyYXRvci4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGNhbGwgPSAnY2FsbCc7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBlbGVtZW50IHByb3BlcnR5IHVzZWQgb24gaXRlcmF0b3JzIGluIGZvci1lYWNoCiAgLy8vIGxvb3BzLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgY3VycmVudCA9ICdjdXJyZW50JzsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBmcm9tIGVudmlyb25tZW50IGNvbnN0cnVjdG9ycyBvbiAnaW50JywgJ2Jvb2wnIGFuZAogIC8vLyAnU3RyaW5nJy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGZyb21FbnZpcm9ubWVudCA9ICdmcm9tRW52aXJvbm1lbnQnOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlIGl0ZXJhdG9yIHByb3BlcnR5IHVzZWQgaW4gZm9yLWVhY2ggbG9vcHMuCiAgc3RhdGljIGNvbnN0IFN0cmluZyBpdGVyYXRvciA9ICdpdGVyYXRvcic7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgYGxvYWRMaWJyYXJ5YCBnZXR0ZXIgZGVmaW5lZCBvbiBkZWZlcnJlZCBwcmVmaXhlcy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGxvYWRMaWJyYXJ5ID0gJ2xvYWRMaWJyYXJ5JzsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBtYWluIG1ldGhvZC4KICBzdGF0aWMgY29uc3QgU3RyaW5nIG1haW4gPSAnbWFpbic7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgbm8gc3VjaCBtZXRob2QgaGFuZGxlciBvbiAnT2JqZWN0Jy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIG5vU3VjaE1ldGhvZF8gPSAnbm9TdWNoTWV0aG9kJzsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBydW50aW1lIHR5cGUgcHJvcGVydHkgb24gJ09iamVjdCcuCiAgc3RhdGljIGNvbnN0IFN0cmluZyBydW50aW1lVHlwZV8gPSAncnVudGltZVR5cGUnOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlIGdldHRlciByZXR1cm5pbmcgdGhlIHNpemUgb2YgY29udGFpbmVycyBhbmQgc3RyaW5ncy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGxlbmd0aCA9ICdsZW5ndGgnOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlIHNpZ25hdHVyZSBmdW5jdGlvbiBpbiBjbG9zdXJlIGNsYXNzZXMuCiAgc3RhdGljIGNvbnN0IFN0cmluZyBzaWduYXR1cmUgPSAnOnNpZ25hdHVyZSc7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgJ0pTJyBmb3JlaWduIGZ1bmN0aW9uLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgSlMgPSAnSlMnOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlICdKU19CVUlMVElOJyBmb3JlaWduIGZ1bmN0aW9uLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgSlNfQlVJTFRJTiA9ICdKU19CVUlMVElOJzsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSAnSlNfRU1CRURERURfR0xPQkFMJyBmb3JlaWduIGZ1bmN0aW9uLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgSlNfRU1CRURERURfR0xPQkFMID0gJ0pTX0VNQkVEREVEX0dMT0JBTCc7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgJ0pTX0lOVEVSQ0VQVE9SX0NPTlNUQU5UJyBmb3JlaWduIGZ1bmN0aW9uLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgSlNfSU5URVJDRVBUT1JfQ09OU1RBTlQgPSAnSlNfSU5URVJDRVBUT1JfQ09OU1RBTlQnOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlICdKU19TVFJJTkdfQ09OQ0FUJyBmb3JlaWduIGZ1bmN0aW9uLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgSlNfU1RSSU5HX0NPTkNBVCA9ICdKU19TVFJJTkdfQ09OQ0FUJzsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSAnREFSVF9DTE9TVVJFX1RPX0pTJyBmb3JlaWduIGZ1bmN0aW9uLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgREFSVF9DTE9TVVJFX1RPX0pTID0gJ0RBUlRfQ0xPU1VSRV9UT19KUyc7Cn0KCi8vLyBbTmFtZV1zIGNvbW1vbmx5IHVzZWQuCmNsYXNzIE5hbWVzIHsKICAvLy8gVGhlIG5hbWUgb2YgdGhlIGNhbGwgb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IE5hbWUgY2FsbCA9IGNvbnN0IFB1YmxpY05hbWUoSWRlbnRpZmllcnMuY2FsbCk7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBlbGVtZW50IHByb3BlcnR5IHVzZWQgb24gaXRlcmF0b3JzIGluIGZvci1lYWNoCiAgLy8vIGxvb3BzLgogIHN0YXRpYyBjb25zdCBOYW1lIGN1cnJlbnQgPSBjb25zdCBQdWJsaWNOYW1lKElkZW50aWZpZXJzLmN1cnJlbnQpOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgdHlwZS4KICBzdGF0aWMgY29uc3QgTmFtZSBkeW5hbWljXyA9IGNvbnN0IFB1YmxpY05hbWUoJ2R5bmFtaWMnKTsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBpdGVyYXRvciBwcm9wZXJ0eSB1c2VkIGluIGZvci1lYWNoIGxvb3BzLgogIHN0YXRpYyBjb25zdCBOYW1lIGl0ZXJhdG9yID0gY29uc3QgUHVibGljTmFtZShJZGVudGlmaWVycy5pdGVyYXRvcik7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgbW92ZSBuZXh0IG1ldGhvZCB1c2VkIG9uIGl0ZXJhdG9ycyBpbiBmb3ItZWFjaCBsb29wcy4KICBzdGF0aWMgY29uc3QgTmFtZSBtb3ZlTmV4dCA9IGNvbnN0IFB1YmxpY05hbWUoJ21vdmVOZXh0Jyk7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgbm8gc3VjaCBtZXRob2QgaGFuZGxlciBvbiAnT2JqZWN0Jy4KICBzdGF0aWMgY29uc3QgTmFtZSBub1N1Y2hNZXRob2RfID0gY29uc3QgUHVibGljTmFtZShJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfKTsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSB0by1zdHJpbmcgbWV0aG9kIG9uICdPYmplY3QnLgogIHN0YXRpYyBjb25zdCBOYW1lIHRvU3RyaW5nXyA9IGNvbnN0IFB1YmxpY05hbWUoJ3RvU3RyaW5nJyk7CgogIHN0YXRpYyBjb25zdCBOYW1lIElOREVYX05BTUUgPSBjb25zdCBQdWJsaWNOYW1lKCJbXSIpOwogIHN0YXRpYyBjb25zdCBOYW1lIElOREVYX1NFVF9OQU1FID0gY29uc3QgUHVibGljTmFtZSgiW109Iik7CiAgc3RhdGljIGNvbnN0IE5hbWUgQ0FMTF9OQU1FID0gTmFtZXMuY2FsbDsKCiAgc3RhdGljIGNvbnN0IE5hbWUgbGVuZ3RoID0gY29uc3QgUHVibGljTmFtZShJZGVudGlmaWVycy5sZW5ndGgpOwoKICBzdGF0aWMgY29uc3QgTmFtZSBydW50aW1lVHlwZV8gPSBjb25zdCBQdWJsaWNOYW1lKElkZW50aWZpZXJzLnJ1bnRpbWVUeXBlXyk7CgogIHN0YXRpYyBjb25zdCBOYW1lIGdlbmVyaWNJbnN0YW50aWF0aW9uID0gY29uc3QgUHVibGljTmFtZSgnaW5zdGFudGlhdGUnKTsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBzaWduYXR1cmUgZnVuY3Rpb24gaW4gY2xvc3VyZSBjbGFzc2VzLgogIHN0YXRpYyBjb25zdCBOYW1lIHNpZ25hdHVyZSA9IGNvbnN0IFB1YmxpY05hbWUoSWRlbnRpZmllcnMuc2lnbmF0dXJlKTsKfQoKLy8vIFtTZWxlY3Rvcl1zIGNvbW1vbmx5IHVzZWQuCmNsYXNzIFNlbGVjdG9ycyB7CiAgLy8vIFRoZSBzZWxlY3RvciBmb3IgY2FsbGluZyB0aGUgY2FuY2VsIG1ldGhvZCBvbiAnU3RyZWFtSXRlcmF0b3InLgogIHN0YXRpYyBmaW5hbCBTZWxlY3RvciBjYW5jZWwgPQogICAgICBuZXcgU2VsZWN0b3IuY2FsbChjb25zdCBQdWJsaWNOYW1lKCdjYW5jZWwnKSwgQ2FsbFN0cnVjdHVyZS5OT19BUkdTKTsKCiAgLy8vIFRoZSBzZWxlY3RvciBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBlbGVtZW50IHByb3BlcnR5IHVzZWQgaW4gZm9yLWVhY2gKICAvLy8gbG9vcHMuCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIGN1cnJlbnQgPSBuZXcgU2VsZWN0b3IuZ2V0dGVyKE5hbWVzLmN1cnJlbnQpOwoKICAvLy8gVGhlIHNlbGVjdG9yIGZvciBnZXR0aW5nIHRoZSBpdGVyYXRvciBwcm9wZXJ0eSB1c2VkIGluIGZvci1lYWNoIGxvb3BzLgogIHN0YXRpYyBmaW5hbCBTZWxlY3RvciBpdGVyYXRvciA9IG5ldyBTZWxlY3Rvci5nZXR0ZXIoTmFtZXMuaXRlcmF0b3IpOwoKICAvLy8gVGhlIHNlbGVjdG9yIGZvciBjYWxsaW5nIHRoZSBtb3ZlIG5leHQgbWV0aG9kIHVzZWQgaW4gZm9yLWVhY2ggbG9vcHMuCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIG1vdmVOZXh0ID0KICAgICAgbmV3IFNlbGVjdG9yLmNhbGwoTmFtZXMubW92ZU5leHQsIENhbGxTdHJ1Y3R1cmUuTk9fQVJHUyk7CgogIC8vLyBUaGUgc2VsZWN0b3IgZm9yIGNhbGxpbmcgdGhlIG5vIHN1Y2ggbWV0aG9kIGhhbmRsZXIgb24gJ09iamVjdCcuCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIG5vU3VjaE1ldGhvZF8gPQogICAgICBuZXcgU2VsZWN0b3IuY2FsbChOYW1lcy5ub1N1Y2hNZXRob2RfLCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpOwoKICAvLy8gVGhlIHNlbGVjdG9yIGZvciB0ZWFyaW5nIG9mZiBub1N1Y2hNZXRob2QuCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIG5vU3VjaE1ldGhvZEdldHRlciA9CiAgICAgIG5ldyBTZWxlY3Rvci5nZXR0ZXIoTmFtZXMubm9TdWNoTWV0aG9kXyk7CgogIC8vLyBUaGUgc2VsZWN0b3IgZm9yIGNhbGxpbmcgdGhlIHRvLXN0cmluZyBtZXRob2Qgb24gJ09iamVjdCcuCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIHRvU3RyaW5nXyA9CiAgICAgIG5ldyBTZWxlY3Rvci5jYWxsKE5hbWVzLnRvU3RyaW5nXywgQ2FsbFN0cnVjdHVyZS5OT19BUkdTKTsKCiAgLy8vIFRoZSBzZWxlY3RvciBmb3IgdGVhcmluZyBvZmYgdG9TdHJpbmcuCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIHRvU3RyaW5nR2V0dGVyID0gbmV3IFNlbGVjdG9yLmdldHRlcihOYW1lcy50b1N0cmluZ18pOwoKICBzdGF0aWMgZmluYWwgU2VsZWN0b3IgaGFzaENvZGVfID0KICAgICAgbmV3IFNlbGVjdG9yLmdldHRlcihjb25zdCBQdWJsaWNOYW1lKCdoYXNoQ29kZScpKTsKCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIGNvbXBhcmVUbyA9CiAgICAgIG5ldyBTZWxlY3Rvci5jYWxsKGNvbnN0IFB1YmxpY05hbWUoImNvbXBhcmVUbyIpLCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpOwoKICBzdGF0aWMgZmluYWwgU2VsZWN0b3IgZXF1YWxzID0gbmV3IFNlbGVjdG9yLmJpbmFyeU9wZXJhdG9yKCc9PScpOwoKICBzdGF0aWMgZmluYWwgU2VsZWN0b3IgbGVuZ3RoID0gbmV3IFNlbGVjdG9yLmdldHRlcihOYW1lcy5sZW5ndGgpOwoKICBzdGF0aWMgZmluYWwgU2VsZWN0b3IgY29kZVVuaXRBdCA9CiAgICAgIG5ldyBTZWxlY3Rvci5jYWxsKGNvbnN0IFB1YmxpY05hbWUoJ2NvZGVVbml0QXQnKSwgQ2FsbFN0cnVjdHVyZS5PTkVfQVJHKTsKCiAgc3RhdGljIGZpbmFsIFNlbGVjdG9yIGluZGV4ID0gbmV3IFNlbGVjdG9yLmluZGV4KCk7CgogIHN0YXRpYyBmaW5hbCBTZWxlY3RvciBydW50aW1lVHlwZV8gPSBuZXcgU2VsZWN0b3IuZ2V0dGVyKE5hbWVzLnJ1bnRpbWVUeXBlXyk7CgogIC8vLyBMaXN0IG9mIGFsbCB0aGUgc2VsZWN0b3JzIGhlbGQgaW4gc3RhdGljIGZpZWxkcy4KICAvLy8KICAvLy8gVGhlc2Ugb2JqZWN0cyBhcmUgc2hhcmVkIGJldHdlZW4gZGlmZmVyZW50IHJ1bnMgaW4gYmF0Y2gtbW9kZSBhbmQgbXVzdAogIC8vLyB0aHVzIHJlbWFpbiBpbiB0aGUgW1NlbGVjdG9yLmNhbm9uaWNhbGl6ZWRWYWx1ZXNdIG1hcC4KICBzdGF0aWMgZmluYWwgTGlzdDxTZWxlY3Rvcj4gQUxMID0gPFNlbGVjdG9yPlsKICAgIGNhbmNlbCwKICAgIGN1cnJlbnQsCiAgICBpdGVyYXRvciwKICAgIG1vdmVOZXh0LAogICAgbm9TdWNoTWV0aG9kXywKICAgIG5vU3VjaE1ldGhvZEdldHRlciwKICAgIHRvU3RyaW5nXywKICAgIHRvU3RyaW5nR2V0dGVyLAogICAgaGFzaENvZGVfLAogICAgY29tcGFyZVRvLAogICAgZXF1YWxzLAogICAgbGVuZ3RoLAogICAgY29kZVVuaXRBdCwKICAgIGluZGV4LAogICAgcnVudGltZVR5cGVfCiAgXTsKfQoKLy8vIFtVcmldcyBjb21tb25seSB1c2VkLgpjbGFzcyBVcmlzIHsKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6YXN5bmMnLgogIHN0YXRpYyBmaW5hbCBVcmkgZGFydF9hc3luYyA9IG5ldyBVcmkoc2NoZW1lOiAnZGFydCcsIHBhdGg6ICdhc3luYycpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6Y29sbGVjdGlvbicuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X2NvbGxlY3Rpb24gPQogICAgICBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnY29sbGVjdGlvbicpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6Y29yZScuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X2NvcmUgPSBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnY29yZScpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6aHRtbCcuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X2h0bWwgPSBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnaHRtbCcpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6aHRtbF9jb21tb24nLgogIHN0YXRpYyBmaW5hbCBVcmkgZGFydF9odG1sX2NvbW1vbiA9CiAgICAgIG5ldyBVcmkoc2NoZW1lOiAnZGFydCcsIHBhdGg6ICdodG1sX2NvbW1vbicpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6aW5kZXhlZF9kYicuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X2luZGV4ZWRfZGIgPQogICAgICBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnaW5kZXhlZF9kYicpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6aXNvbGF0ZScuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X2lzb2xhdGUgPSBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnaXNvbGF0ZScpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6bWF0aCcuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X21hdGggPSBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnbWF0aCcpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6bWlycm9ycycuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X21pcnJvcnMgPSBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnbWlycm9ycycpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X2ludGVybmFsJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfX2ludGVybmFsID0gbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ19pbnRlcm5hbCcpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X25hdGl2ZV90eXBlZF9kYXRhJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfX25hdGl2ZV90eXBlZF9kYXRhID0KICAgICAgbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ19uYXRpdmVfdHlwZWRfZGF0YScpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6dHlwZWRfZGF0YScuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X3R5cGVkX2RhdGEgPQogICAgICBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAndHlwZWRfZGF0YScpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6c3ZnJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfc3ZnID0gbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ3N2ZycpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6d2ViX2F1ZGlvJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfd2ViX2F1ZGlvID0gbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ3dlYl9hdWRpbycpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6d2ViX2dsJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfd2ViX2dsID0gbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ3dlYl9nbCcpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6d2ViX3NxbCcuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X3dlYl9zcWwgPSBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnd2ViX3NxbCcpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X2pzX2hlbHBlcicuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X19qc19oZWxwZXIgPQogICAgICBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnX2pzX2hlbHBlcicpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X3J0aScuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X19ydGkgPSBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnX3J0aScpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X2ludGVyY2VwdG9ycycuCiAgc3RhdGljIGZpbmFsIFVyaSBkYXJ0X19pbnRlcmNlcHRvcnMgPQogICAgICBuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiAnX2ludGVyY2VwdG9ycycpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X2ZvcmVpZ25faGVscGVyJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfX2ZvcmVpZ25faGVscGVyID0KICAgICAgbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ19mb3JlaWduX2hlbHBlcicpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X2pzX25hbWVzJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfX2pzX25hbWVzID0gbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ19qc19uYW1lcycpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ2RhcnQ6X2pzX2VtYmVkZGVkX25hbWVzJy4KICBzdGF0aWMgZmluYWwgVXJpIGRhcnRfX2pzX2VtYmVkZGVkX25hbWVzID0KICAgICAgbmV3IFVyaShzY2hlbWU6ICdkYXJ0JywgcGF0aDogJ19qc19lbWJlZGRlZF9uYW1lcycpOwoKICAvLy8gVGhlIFVSSSBmb3IgJ3BhY2thZ2U6anMnLgogIHN0YXRpYyBmaW5hbCBVcmkgcGFja2FnZV9qcyA9IG5ldyBVcmkoc2NoZW1lOiAncGFja2FnZScsIHBhdGg6ICdqcy9qcy5kYXJ0Jyk7CgogIC8vLyBUaGUgVVJJIGZvciAncGFja2FnZTptZXRhL2RhcnQyanMuZGFydCcuCiAgc3RhdGljIGZpbmFsIFVyaSBwYWNrYWdlX21ldGFfZGFydDJqcyA9CiAgICAgIG5ldyBVcmkoc2NoZW1lOiAncGFja2FnZScsIHBhdGg6ICdtZXRhL2RhcnQyanMuZGFydCcpOwp9CoEFAE5OPAFOEh4BNz0yAR0UJSUBTQ0rAUkQOwFALQFJMwEjJQE6NgE5NAFLKQE9MAEtIQE1MQE9QQFCSwE7PQE9QQIBGw4lPwFNDUUBJDwBQEcBTD0BOlEBND4BOT4sAUMBTwFMAT1JAgEfEkYhTAFNDUYBTUgBTCNAAUcoRQExLTABQSRBAS1PASQ5ASRPAUQBRAElUAE2AVABNwZNPTAMDQ4OExgPFA8PDAwQCxEFAgEaDSBIASUlMwEfRgEfRgEmJjQBJSUzASJMAR9GASJMASRQAS0tOwElJTMBHkQBJFABIUoBIkwBJSUzAR9GASgoNgEqKjgBJFABLS07ASBQAS8qPQIBJnBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbW1vbi9uYW1lcy5kYXJ0LnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbW1vbi93b3JrLmRhcnSB4y8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuY29tbW9uLndvcms7CgppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnIHNob3cgTWVtYmVyRW50aXR5OwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0JyBzaG93IFdvcmxkSW1wYWN0OwoKYWJzdHJhY3QgY2xhc3MgV29ya0l0ZW0gewogIC8vLyBFbGVtZW50IG9uIHdoaWNoIHRoZSB3b3JrIHdpbGwgYmUgZG9uZS4KICBNZW1iZXJFbnRpdHkgZ2V0IGVsZW1lbnQ7CgogIFdvcmxkSW1wYWN0IHJ1bigpOwp9ChEATk48AR0BNjkBGi4cARUCASVwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21tb24vd29yay5kYXJ0MnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbW1vbl9lbGVtZW50cy5kYXJ0wAEgiS8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBUT0RPKHNpZ211bmQpOiByZW5hbWUgYW5kIG1vdmUgdG8gY29tbW9uL2VsZW1lbnRzLmRhcnQKbGlicmFyeSBkYXJ0MmpzLnR5cGVfc3lzdGVtOwoKaW1wb3J0ICdjb21tb24uZGFydCc7CmltcG9ydCAnY29tbW9uL25hbWVzLmRhcnQnIHNob3cgSWRlbnRpZmllcnMsIFVyaXM7CmltcG9ydCAnY29uc3RhbnRzL2NvbnN0YW50X3N5c3RlbS5kYXJ0JyBhcyBjb25zdGFudF9zeXN0ZW07CmltcG9ydCAnY29uc3RhbnRzL2V4cHJlc3Npb25zLmRhcnQnIHNob3cgQ29uc3RhbnRFeHByZXNzaW9uOwppbXBvcnQgJ2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJ2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCcgc2hvdyBOYXRpdmVCYXNpY0RhdGE7CmltcG9ydCAnanNfbW9kZWwvbG9jYWxzLmRhcnQnOwppbXBvcnQgJ2tlcm5lbC9kYXJ0MmpzX3RhcmdldC5kYXJ0JzsKaW1wb3J0ICdvcHRpb25zLmRhcnQnOwppbXBvcnQgJ3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CgovLy8gVGhlIGNvbW1vbiBlbGVtZW50cyBhbmQgdHlwZXMgaW4gRGFydC4KYWJzdHJhY3QgY2xhc3MgQ29tbW9uRWxlbWVudHMgewogIC8vLyBUaGUgYE9iamVjdGAgY2xhc3MgZGVmaW5lZCBpbiAnZGFydDpjb3JlJy4KICBDbGFzc0VudGl0eSBnZXQgb2JqZWN0Q2xhc3M7CgogIC8vLyBUaGUgYGJvb2xgIGNsYXNzIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgQ2xhc3NFbnRpdHkgZ2V0IGJvb2xDbGFzczsKCiAgLy8vIFRoZSBgbnVtYCBjbGFzcyBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIENsYXNzRW50aXR5IGdldCBudW1DbGFzczsKCiAgLy8vIFRoZSBgaW50YCBjbGFzcyBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIENsYXNzRW50aXR5IGdldCBpbnRDbGFzczsKCiAgLy8vIFRoZSBgZG91YmxlYCBjbGFzcyBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIENsYXNzRW50aXR5IGdldCBkb3VibGVDbGFzczsKCiAgLy8vIFRoZSBgU3RyaW5nYCBjbGFzcyBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIENsYXNzRW50aXR5IGdldCBzdHJpbmdDbGFzczsKCiAgLy8vIFRoZSBgRnVuY3Rpb25gIGNsYXNzIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgQ2xhc3NFbnRpdHkgZ2V0IGZ1bmN0aW9uQ2xhc3M7CgogIC8vLyBUaGUgYFJlc291cmNlYCBjbGFzcyBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIENsYXNzRW50aXR5IGdldCByZXNvdXJjZUNsYXNzOwoKICAvLy8gVGhlIGBTeW1ib2xgIGNsYXNzIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgQ2xhc3NFbnRpdHkgZ2V0IHN5bWJvbENsYXNzOwoKICAvLy8gVGhlIGBOdWxsYCBjbGFzcyBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIENsYXNzRW50aXR5IGdldCBudWxsQ2xhc3M7CgogIC8vLyBUaGUgYFR5cGVgIGNsYXNzIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgQ2xhc3NFbnRpdHkgZ2V0IHR5cGVDbGFzczsKCiAgLy8vIFRoZSBgU3RhY2tUcmFjZWAgY2xhc3MgZGVmaW5lZCBpbiAnZGFydDpjb3JlJzsKICBDbGFzc0VudGl0eSBnZXQgc3RhY2tUcmFjZUNsYXNzOwoKICAvLy8gVGhlIGBMaXN0YCBjbGFzcyBkZWZpbmVkIGluICdkYXJ0OmNvcmUnOwogIENsYXNzRW50aXR5IGdldCBsaXN0Q2xhc3M7CgogIC8vLyBUaGUgYFNldGAgY2xhc3MgZGVmaW5lZCBpbiAnZGFydDpjb3JlJzsKICBDbGFzc0VudGl0eSBnZXQgc2V0Q2xhc3M7CgogIC8vLyBUaGUgYE1hcGAgY2xhc3MgZGVmaW5lZCBpbiAnZGFydDpjb3JlJzsKICBDbGFzc0VudGl0eSBnZXQgbWFwQ2xhc3M7CgogIC8vLyBUaGUgYFNldGAgY2xhc3MgZGVmaW5lZCBpbiAnZGFydDpjb3JlJzsKICBDbGFzc0VudGl0eSBnZXQgdW5tb2RpZmlhYmxlU2V0Q2xhc3M7CgogIC8vLyBUaGUgYEl0ZXJhYmxlYCBjbGFzcyBkZWZpbmVkIGluICdkYXJ0OmNvcmUnOwogIENsYXNzRW50aXR5IGdldCBpdGVyYWJsZUNsYXNzOwoKICAvLy8gVGhlIGBGdXR1cmVgIGNsYXNzIGRlZmluZWQgaW4gJ2FzeW5jJzsuCiAgQ2xhc3NFbnRpdHkgZ2V0IGZ1dHVyZUNsYXNzOwoKICAvLy8gVGhlIGBTdHJlYW1gIGNsYXNzIGRlZmluZWQgaW4gJ2FzeW5jJzsKICBDbGFzc0VudGl0eSBnZXQgc3RyZWFtQ2xhc3M7CgogIC8vLyBUaGUgZGFydDpjb3JlIGxpYnJhcnkuCiAgTGlicmFyeUVudGl0eSBnZXQgY29yZUxpYnJhcnk7CgogIC8vLyBUaGUgZGFydDphc3luYyBsaWJyYXJ5LgogIExpYnJhcnlFbnRpdHkgZ2V0IGFzeW5jTGlicmFyeTsKCiAgLy8vIFRoZSBkYXJ0Om1pcnJvcnMgbGlicmFyeS4KICBMaWJyYXJ5RW50aXR5IGdldCBtaXJyb3JzTGlicmFyeTsKCiAgLy8vIFRoZSBkYXJ0OnR5cGVkX2RhdGEgbGlicmFyeS4KICBMaWJyYXJ5RW50aXR5IGdldCB0eXBlZERhdGFMaWJyYXJ5OwoKICAvLy8gVGhlIGRhcnQ6X2pzX2hlbHBlciBsaWJyYXJ5LgogIExpYnJhcnlFbnRpdHkgZ2V0IGpzSGVscGVyTGlicmFyeTsKCiAgLy8vIFRoZSBkYXJ0Ol9pbnRlcmNlcHRvcnMgbGlicmFyeS4KICBMaWJyYXJ5RW50aXR5IGdldCBpbnRlcmNlcHRvcnNMaWJyYXJ5OwoKICAvLy8gVGhlIGRhcnQ6X2ZvcmVpZ25faGVscGVyIGxpYnJhcnkuCiAgTGlicmFyeUVudGl0eSBnZXQgZm9yZWlnbkxpYnJhcnk7CgogIC8vLyBUaGUgZGFydDpfaW50ZXJuYWwgbGlicmFyeS4KICBMaWJyYXJ5RW50aXR5IGdldCBydGlMaWJyYXJ5OwoKICAvLy8gVGhlIGRhcnQ6X2ludGVybmFsIGxpYnJhcnkuCiAgTGlicmFyeUVudGl0eSBnZXQgaW50ZXJuYWxMaWJyYXJ5OwoKICAvLy8gVGhlIGBOYXRpdmVUeXBlZERhdGFgIGNsYXNzIGZyb20gZGFydDp0eXBlZF9kYXRhLgogIENsYXNzRW50aXR5IGdldCB0eXBlZERhdGFDbGFzczsKCiAgLy8vIENvbnN0cnVjdG9yIG9mIHRoZSBgU3ltYm9sYCBjbGFzcyBpbiBkYXJ0OmludGVybmFsLgogIC8vLwogIC8vLyBUaGlzIGdldHRlciB3aWxsIGVuc3VyZSB0aGF0IGBTeW1ib2xgIGlzIHJlc29sdmVkIGFuZCBsb29rdXAgdGhlCiAgLy8vIGNvbnN0cnVjdG9yIG9uIGRlbWFuZC4KICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgc3ltYm9sQ29uc3RydWN0b3JUYXJnZXQ7CgogIC8vLyBXaGV0aGVyIFtlbGVtZW50XSBpcyB0aGUgc2FtZSBhcyBbc3ltYm9sQ29uc3RydWN0b3JdLgogIC8vLwogIC8vLyBVc2VkIHRvIGNoZWNrIGZvciB0aGUgY29uc3RydWN0b3Igd2l0aG91dCBjb21wdXRpbmcgaXQgdW50aWwgaXQgaXMgbGlrZWx5CiAgLy8vIHRvIGJlIHNlZW4uCiAgYm9vbCBpc1N5bWJvbENvbnN0cnVjdG9yKENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gVGhlIGZ1bmN0aW9uIGBpZGVudGljYWxgIGluIGRhcnQ6Y29yZS4KICBGdW5jdGlvbkVudGl0eSBnZXQgaWRlbnRpY2FsRnVuY3Rpb247CgogIC8vLyBXaGV0aGVyIFtlbGVtZW50XSBpcyB0aGUgYEZ1bmN0aW9uLmFwcGx5YCBtZXRob2QuCiAgLy8vCiAgLy8vIFRoaXMgd2lsbCBub3QgcmVzb2x2ZSB0aGUgYXBwbHkgbWV0aG9kIGlmIGl0IGhhc24ndCBiZWVuIHNlZW4geWV0IGR1cmluZwogIC8vLyBjb21waWxhdGlvbi4KICBib29sIGlzRnVuY3Rpb25BcHBseU1ldGhvZChNZW1iZXJFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBUaGUgYGR5bmFtaWNgIHR5cGUuCiAgRHluYW1pY1R5cGUgZ2V0IGR5bmFtaWNUeXBlOwoKICAvLy8gVGhlIGBPYmplY3RgIHR5cGUgZGVmaW5lZCBpbiAnZGFydDpjb3JlJy4KICBJbnRlcmZhY2VUeXBlIGdldCBvYmplY3RUeXBlOwoKICAvLy8gVGhlIGBib29sYCB0eXBlIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgSW50ZXJmYWNlVHlwZSBnZXQgYm9vbFR5cGU7CgogIC8vLyBUaGUgYG51bWAgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIEludGVyZmFjZVR5cGUgZ2V0IG51bVR5cGU7CgogIC8vLyBUaGUgYGludGAgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIEludGVyZmFjZVR5cGUgZ2V0IGludFR5cGU7CgogIC8vLyBUaGUgYGRvdWJsZWAgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIEludGVyZmFjZVR5cGUgZ2V0IGRvdWJsZVR5cGU7CgogIC8vLyBUaGUgYFN0cmluZ2AgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIEludGVyZmFjZVR5cGUgZ2V0IHN0cmluZ1R5cGU7CgogIC8vLyBUaGUgYFN5bWJvbGAgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIEludGVyZmFjZVR5cGUgZ2V0IHN5bWJvbFR5cGU7CgogIC8vLyBUaGUgYEZ1bmN0aW9uYCB0eXBlIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgSW50ZXJmYWNlVHlwZSBnZXQgZnVuY3Rpb25UeXBlOwoKICAvLy8gVGhlIGBOdWxsYCB0eXBlIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgSW50ZXJmYWNlVHlwZSBnZXQgbnVsbFR5cGU7CgogIC8vLyBUaGUgYFR5cGVgIHR5cGUgZGVmaW5lZCBpbiAnZGFydDpjb3JlJy4KICBJbnRlcmZhY2VUeXBlIGdldCB0eXBlVHlwZTsKCiAgSW50ZXJmYWNlVHlwZSBnZXQgdHlwZUxpdGVyYWxUeXBlOwoKICAvLy8gVGhlIGBTdGFja1RyYWNlYCB0eXBlIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZSc7CiAgSW50ZXJmYWNlVHlwZSBnZXQgc3RhY2tUcmFjZVR5cGU7CgogIC8vLyBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBgTGlzdGAgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmNvcmUnIHdpdGgKICAvLy8gW2VsZW1lbnRUeXBlXSBhcyBpdHMgdHlwZSBhcmd1bWVudC4KICAvLy8KICAvLy8gSWYgbm8gdHlwZSBhcmd1bWVudCBpcyBwcm92aWRlZCwgdGhlIGNhbm9uaWNhbCByYXcgdHlwZSBpcyByZXR1cm5lZC4KICBJbnRlcmZhY2VUeXBlIGxpc3RUeXBlKFtEYXJ0VHlwZSBlbGVtZW50VHlwZV0pOwoKICAvLy8gUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgYFNldGAgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmNvcmUnIHdpdGgKICAvLy8gW2VsZW1lbnRUeXBlXSBhcyBpdHMgdHlwZSBhcmd1bWVudC4KICAvLy8KICAvLy8gSWYgbm8gdHlwZSBhcmd1bWVudCBpcyBwcm92aWRlZCwgdGhlIGNhbm9uaWNhbCByYXcgdHlwZSBpcyByZXR1cm5lZC4KICBJbnRlcmZhY2VUeXBlIHNldFR5cGUoW0RhcnRUeXBlIGVsZW1lbnRUeXBlXSk7CgogIC8vLyBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBgTWFwYCB0eXBlIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScgd2l0aAogIC8vLyBba2V5VHlwZV0gYW5kIFt2YWx1ZVR5cGVdIGFzIGl0cyB0eXBlIGFyZ3VtZW50cy4KICAvLy8KICAvLy8gSWYgbm8gdHlwZSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgY2Fub25pY2FsIHJhdyB0eXBlIGlzIHJldHVybmVkLgogIEludGVyZmFjZVR5cGUgbWFwVHlwZShbRGFydFR5cGUga2V5VHlwZSwgRGFydFR5cGUgdmFsdWVUeXBlXSk7CgogIC8vLyBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBgSXRlcmFibGVgIHR5cGUgZGVmaW5lZCBpbiAnZGFydDpjb3JlJyB3aXRoCiAgLy8vIFtlbGVtZW50VHlwZV0gYXMgaXRzIHR5cGUgYXJndW1lbnQuCiAgLy8vCiAgLy8vIElmIG5vIHR5cGUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIHRoZSBjYW5vbmljYWwgcmF3IHR5cGUgaXMgcmV0dXJuZWQuCiAgSW50ZXJmYWNlVHlwZSBpdGVyYWJsZVR5cGUoW0RhcnRUeXBlIGVsZW1lbnRUeXBlXSk7CgogIC8vLyBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBgRnV0dXJlYCB0eXBlIGRlZmluZWQgaW4gJ2RhcnQ6YXN5bmMnIHdpdGgKICAvLy8gW2VsZW1lbnRUeXBlXSBhcyBpdHMgdHlwZSBhcmd1bWVudC4KICAvLy8KICAvLy8gSWYgbm8gdHlwZSBhcmd1bWVudCBpcyBwcm92aWRlZCwgdGhlIGNhbm9uaWNhbCByYXcgdHlwZSBpcyByZXR1cm5lZC4KICBJbnRlcmZhY2VUeXBlIGZ1dHVyZVR5cGUoW0RhcnRUeXBlIGVsZW1lbnRUeXBlXSk7CgogIC8vLyBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBgU3RyZWFtYCB0eXBlIGRlZmluZWQgaW4gJ2RhcnQ6YXN5bmMnIHdpdGgKICAvLy8gW2VsZW1lbnRUeXBlXSBhcyBpdHMgdHlwZSBhcmd1bWVudC4KICAvLy8KICAvLy8gSWYgbm8gdHlwZSBhcmd1bWVudCBpcyBwcm92aWRlZCwgdGhlIGNhbm9uaWNhbCByYXcgdHlwZSBpcyByZXR1cm5lZC4KICBJbnRlcmZhY2VUeXBlIHN0cmVhbVR5cGUoW0RhcnRUeXBlIGVsZW1lbnRUeXBlXSk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gaXMgYSBzdXBlcmNsYXNzIG9mIGBTdHJpbmdgIG9yIGBudW1gLgogIGJvb2wgaXNOdW1iZXJPclN0cmluZ1N1cGVydHlwZShDbGFzc0VudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtlbGVtZW50XSBpcyBhIHN1cGVyY2xhc3Mgb2YgYFN0cmluZ2AuCiAgYm9vbCBpc1N0cmluZ09ubHlTdXBlcnR5cGUoQ2xhc3NFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gaXMgYSBzdXBlcmNsYXNzIG9mIGBMaXN0YC4KICBib29sIGlzTGlzdFN1cGVydHlwZShDbGFzc0VudGl0eSBlbGVtZW50KTsKCiAgSW50ZXJmYWNlVHlwZSBnZXRDb25zdGFudE1hcFR5cGVGb3IoSW50ZXJmYWNlVHlwZSBzb3VyY2VUeXBlLAogICAgICB7Ym9vbCBoYXNQcm90b0tleTogZmFsc2UsIGJvb2wgb25seVN0cmluZ0tleXM6IGZhbHNlfSk7CgogIEludGVyZmFjZVR5cGUgZ2V0Q29uc3RhbnRTZXRUeXBlRm9yKEludGVyZmFjZVR5cGUgc291cmNlVHlwZSk7CgogIEZpZWxkRW50aXR5IGdldCBzeW1ib2xGaWVsZDsKCiAgSW50ZXJmYWNlVHlwZSBnZXQgc3ltYm9sSW1wbGVtZW50YXRpb25UeXBlOwoKICAvLyBGcm9tIGRhcnQ6Y29yZQogIENsYXNzRW50aXR5IGdldCBtYXBMaXRlcmFsQ2xhc3M7CiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0IG1hcExpdGVyYWxDb25zdHJ1Y3RvcjsKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgbWFwTGl0ZXJhbENvbnN0cnVjdG9yRW1wdHk7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IG1hcExpdGVyYWxVbnR5cGVkTWFrZXI7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IG1hcExpdGVyYWxVbnR5cGVkRW1wdHlNYWtlcjsKCiAgQ2xhc3NFbnRpdHkgZ2V0IHNldExpdGVyYWxDbGFzczsKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgc2V0TGl0ZXJhbENvbnN0cnVjdG9yOwogIENvbnN0cnVjdG9yRW50aXR5IGdldCBzZXRMaXRlcmFsQ29uc3RydWN0b3JFbXB0eTsKICBGdW5jdGlvbkVudGl0eSBnZXQgc2V0TGl0ZXJhbFVudHlwZWRNYWtlcjsKICBGdW5jdGlvbkVudGl0eSBnZXQgc2V0TGl0ZXJhbFVudHlwZWRFbXB0eU1ha2VyOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgb2JqZWN0Tm9TdWNoTWV0aG9kOwoKICBib29sIGlzRGVmYXVsdE5vU3VjaE1ldGhvZEltcGxlbWVudGF0aW9uKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpOwoKICAvLyBGcm9tIGRhcnQ6YXN5bmMKICBGdW5jdGlvbkVudGl0eSBnZXQgYXN5bmNIZWxwZXJTdGFydFN5bmM7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzeW5jSGVscGVyQXdhaXQ7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzeW5jSGVscGVyUmV0dXJuOwogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3luY0hlbHBlclJldGhyb3c7CgogIEZ1bmN0aW9uRW50aXR5IGdldCB3cmFwQm9keTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHlpZWxkU3RhcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHlpZWxkU2luZ2xlOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgc3luY1N0YXJVbmNhdWdodEVycm9yOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgYXN5bmNTdGFySGVscGVyOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgc3RyZWFtT2ZDb250cm9sbGVyOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgZW5kT2ZJdGVyYXRpb247CgogIENsYXNzRW50aXR5IGdldCBzeW5jU3Rhckl0ZXJhYmxlOwoKICBDbGFzc0VudGl0eSBnZXQgZnV0dXJlSW1wbGVtZW50YXRpb247CgogIENsYXNzRW50aXR5IGdldCBjb250cm9sbGVyU3RyZWFtOwoKICBDbGFzc0VudGl0eSBnZXQgc3RyZWFtSXRlcmF0b3I7CgogIENvbnN0cnVjdG9yRW50aXR5IGdldCBzdHJlYW1JdGVyYXRvckNvbnN0cnVjdG9yOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgc3luY1N0YXJJdGVyYWJsZUZhY3Rvcnk7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3luY0F3YWl0Q29tcGxldGVyRmFjdG9yeTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJGYWN0b3J5OwoKICBDbGFzc0VudGl0eSBnZXQganNJbnRlcmNlcHRvckNsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQganNTdHJpbmdDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzQXJyYXlDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzTnVtYmVyQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBqc0ludENsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQganNEb3VibGVDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzTnVsbENsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQganNCb29sQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBqc1BsYWluSmF2YVNjcmlwdE9iamVjdENsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQganNVbmtub3duSmF2YVNjcmlwdE9iamVjdENsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQganNKYXZhU2NyaXB0RnVuY3Rpb25DbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzSmF2YVNjcmlwdE9iamVjdENsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQganNJbmRleGFibGVDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzTXV0YWJsZUluZGV4YWJsZUNsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQganNNdXRhYmxlQXJyYXlDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzRml4ZWRBcnJheUNsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQganNFeHRlbmRhYmxlQXJyYXlDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzVW5tb2RpZmlhYmxlQXJyYXlDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzUG9zaXRpdmVJbnRDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzVUludDMyQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBqc1VJbnQzMUNsYXNzOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgbWVtYmVyIGlzIHRoZSAnZmluZEluZGV4Rm9yTmF0aXZlU3ViY2xhc3NUeXBlJyBtZXRob2QKICAvLy8gZGVjbGFyZWQgaW4gYGRhcnQ6X2ludGVyY2VwdG9yc2AuCiAgYm9vbCBpc0ZpbmRJbmRleEZvck5hdGl2ZVN1YmNsYXNzVHlwZShNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGdldE5hdGl2ZUludGVyY2VwdG9yTWV0aG9kOwoKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQganNBcnJheVR5cGVkQ29uc3RydWN0b3I7CgogIC8vIEZyb20gZGFydDpfanNfaGVscGVyCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXZvaWQgdGhlIG5lZWQgZm9yIHRoaXMgKGZyb20gW0NoZWNrZWRNb2RlSGVscGVyXSkuCiAgRnVuY3Rpb25FbnRpdHkgZmluZEhlbHBlckZ1bmN0aW9uKFN0cmluZyBuYW1lKTsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGNsb3N1cmVDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGJvdW5kQ2xvc3VyZUNsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQgdHlwZUxpdGVyYWxDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGNvbnN0TWFwTGl0ZXJhbENsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQgY29uc3RTZXRMaXRlcmFsQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCB0eXBlVmFyaWFibGVDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzSW52b2NhdGlvbk1pcnJvckNsYXNzOwoKICBNZW1iZXJFbnRpdHkgZ2V0IGludm9jYXRpb25UeXBlQXJndW1lbnRHZXR0ZXI7CgogIC8vLyBJbnRlcmZhY2UgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGhhcyB0aGUgSmF2YVNjcmlwdAogIC8vLyBpbmRleGluZyBiZWhhdmlvci4gVGhlIGludGVyZmFjZSBpcyBvbmx5IHZpc2libGUgdG8gc3BlY2lmaWMgbGlicmFyaWVzLgogIENsYXNzRW50aXR5IGdldCBqc0luZGV4aW5nQmVoYXZpb3JJbnRlcmZhY2U7CgogIENsYXNzRW50aXR5IGdldCBzdGFja1RyYWNlSGVscGVyQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBjb25zdGFudE1hcENsYXNzOwogIENsYXNzRW50aXR5IGdldCBjb25zdGFudFN0cmluZ01hcENsYXNzOwogIENsYXNzRW50aXR5IGdldCBjb25zdGFudFByb3RvTWFwQ2xhc3M7CiAgQ2xhc3NFbnRpdHkgZ2V0IGdlbmVyYWxDb25zdGFudE1hcENsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQgYW5ub3RhdGlvbkNyZWF0ZXNDbGFzczsKCiAgQ2xhc3NFbnRpdHkgZ2V0IGFubm90YXRpb25SZXR1cm5zQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBhbm5vdGF0aW9uSlNOYW1lQ2xhc3M7CgogIC8vLyBUaGUgY2xhc3MgZm9yIG5hdGl2ZSBhbm5vdGF0aW9ucyBkZWZpbmVkIGluIGRhcnQ6X2pzX2hlbHBlci4KICBDbGFzc0VudGl0eSBnZXQgbmF0aXZlQW5ub3RhdGlvbkNsYXNzOwoKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgdHlwZVZhcmlhYmxlQ29uc3RydWN0b3I7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3NlcnRUZXN0OwoKICBGdW5jdGlvbkVudGl0eSBnZXQgYXNzZXJ0VGhyb3c7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3NlcnRIZWxwZXI7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3NlcnRVbnJlYWNoYWJsZU1ldGhvZDsKCiAgLy8vIEhvbGRzIHRoZSBtZXRob2QgImdldElzb2xhdGVBZmZpbml0eVRhZyIgd2hlbiBkYXJ0Ol9qc19oZWxwZXIgaGFzIGJlZW4KICAvLy8gbG9hZGVkLgogIEZ1bmN0aW9uRW50aXR5IGdldCBnZXRJc29sYXRlQWZmaW5pdHlUYWdNYXJrZXI7CgogIC8vLyBIb2xkcyB0aGUgbWV0aG9kICJyZXF1aXJlc1ByZWFtYmxlIiBpbiBfanNfaGVscGVyLgogIEZ1bmN0aW9uRW50aXR5IGdldCByZXF1aXJlc1ByZWFtYmxlTWFya2VyOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgbG9hZExpYnJhcnlXcmFwcGVyOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgbG9hZERlZmVycmVkTGlicmFyeTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGJvb2xDb252ZXJzaW9uQ2hlY2s7CgogIEZ1bmN0aW9uRW50aXR5IGdldCB0cmFjZUhlbHBlcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNsb3N1cmVGcm9tVGVhck9mZjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGlzSnNJbmRleGFibGU7CgogIEZ1bmN0aW9uRW50aXR5IGdldCB0aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHRocm93SW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgZXhjZXB0aW9uVW53cmFwcGVyOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgdGhyb3dSdW50aW1lRXJyb3I7CgogIEZ1bmN0aW9uRW50aXR5IGdldCB0aHJvd1Vuc3VwcG9ydGVkRXJyb3I7CgogIEZ1bmN0aW9uRW50aXR5IGdldCB0aHJvd1R5cGVFcnJvcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHRocm93QWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgdGhyb3dDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3I7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBzdHJpbmdJbnRlcnBvbGF0aW9uSGVscGVyOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgd3JhcEV4Y2VwdGlvbkhlbHBlcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHRocm93RXhwcmVzc2lvbkhlbHBlcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNsb3N1cmVDb252ZXJ0ZXI7CgogIEZ1bmN0aW9uRW50aXR5IGdldCB0cmFjZUZyb21FeGNlcHRpb247CgogIEZ1bmN0aW9uRW50aXR5IGdldCBzZXRSdW50aW1lVHlwZUluZm87CgogIEZ1bmN0aW9uRW50aXR5IGdldCBnZXRSdW50aW1lVHlwZUluZm87CgogIEZ1bmN0aW9uRW50aXR5IGdldCBnZXRUeXBlQXJndW1lbnRCeUluZGV4OwoKICBGdW5jdGlvbkVudGl0eSBnZXQgY29tcHV0ZVNpZ25hdHVyZTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGdldFJ1bnRpbWVUeXBlQXJndW1lbnRzOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgZ2V0UnVudGltZVR5cGVBcmd1bWVudDsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGdldFJ1bnRpbWVUeXBlQXJndW1lbnRJbnRlcmNlcHRlZDsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzc2VydElzU3VidHlwZTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNoZWNrU3VidHlwZTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzc2VydFN1YnR5cGU7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBzdWJ0eXBlQ2FzdDsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGZ1bmN0aW9uVHlwZVRlc3Q7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBmdXR1cmVPclRlc3Q7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBjaGVja1N1YnR5cGVPZlJ1bnRpbWVUeXBlOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgYXNzZXJ0U3VidHlwZU9mUnVudGltZVR5cGU7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBzdWJ0eXBlT2ZSdW50aW1lVHlwZUNhc3Q7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBjaGVja0RlZmVycmVkSXNMb2FkZWQ7CgogIEZ1bmN0aW9uRW50aXR5IGdldCB0aHJvd05vU3VjaE1ldGhvZDsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNyZWF0ZVJ1bnRpbWVUeXBlOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgZmFsbFRocm91Z2hFcnJvcjsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNyZWF0ZUludm9jYXRpb25NaXJyb3I7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBjcmVhdGVVbm1hbmdsZWRJbnZvY2F0aW9uTWlycm9yOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgY3ljbGljVGhyb3dIZWxwZXI7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBkZWZpbmVQcm9wZXJ0eTsKCiAgYm9vbCBpc0V4dHJhY3RUeXBlQXJndW1lbnRzKEZ1bmN0aW9uRW50aXR5IG1lbWJlcik7CgogIENsYXNzRW50aXR5IGdldEluc3RhbnRpYXRpb25DbGFzcyhpbnQgdHlwZUFyZ3VtZW50Q291bnQpOwoKICBGdW5jdGlvbkVudGl0eSBnZXRJbnN0YW50aWF0ZUZ1bmN0aW9uKGludCB0eXBlQXJndW1lbnRDb3VudCk7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBpbnN0YW50aWF0ZWRHZW5lcmljRnVuY3Rpb25UeXBlOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgZXh0cmFjdEZ1bmN0aW9uVHlwZU9iamVjdEZyb21JbnRlcm5hbDsKCiAgLy8gRnJvbSBkYXJ0Ol9ydGkKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGZpbmRUeXBlOwogIEZ1bmN0aW9uRW50aXR5IGdldCBpbnN0YW5jZVR5cGU7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHR5cGVMaXRlcmFsTWFrZXI7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNoZWNrVHlwZUJvdW5kOwogIEZpZWxkRW50aXR5IGdldCBydGlBc0ZpZWxkOwogIEZpZWxkRW50aXR5IGdldCBydGlDaGVja0ZpZWxkOwogIEZpZWxkRW50aXR5IGdldCBydGlJc0ZpZWxkOwogIEZ1bmN0aW9uRW50aXR5IGdldCBydGlFdmFsTWV0aG9kOwogIEZ1bmN0aW9uRW50aXR5IGdldCBydGlCaW5kTWV0aG9kOwogIEZ1bmN0aW9uRW50aXR5IGdldCBydGlBZGRSdWxlc01ldGhvZDsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGdlbmVyYWxJc1Rlc3RJbXBsZW1lbnRhdGlvbjsKICBGdW5jdGlvbkVudGl0eSBnZXQgZ2VuZXJhbEFzQ2hlY2tJbXBsZW1lbnRhdGlvbjsKICBGdW5jdGlvbkVudGl0eSBnZXQgZ2VuZXJhbFR5cGVDaGVja0ltcGxlbWVudGF0aW9uOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgc3BlY2lhbGl6ZWRJc0Jvb2w7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHNwZWNpYWxpemVkQXNCb29sTnVsbGFibGU7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHNwZWNpYWxpemVkQ2hlY2tCb29sTnVsbGFibGU7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHNwZWNpYWxpemVkQXNEb3VibGVOdWxsYWJsZTsKICBGdW5jdGlvbkVudGl0eSBnZXQgc3BlY2lhbGl6ZWRDaGVja0RvdWJsZU51bGxhYmxlOwogIEZ1bmN0aW9uRW50aXR5IGdldCBzcGVjaWFsaXplZElzSW50OwogIEZ1bmN0aW9uRW50aXR5IGdldCBzcGVjaWFsaXplZEFzSW50TnVsbGFibGU7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHNwZWNpYWxpemVkQ2hlY2tJbnROdWxsYWJsZTsKICBGdW5jdGlvbkVudGl0eSBnZXQgc3BlY2lhbGl6ZWRJc051bTsKICBGdW5jdGlvbkVudGl0eSBnZXQgc3BlY2lhbGl6ZWRBc051bU51bGxhYmxlOwogIEZ1bmN0aW9uRW50aXR5IGdldCBzcGVjaWFsaXplZENoZWNrTnVtTnVsbGFibGU7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHNwZWNpYWxpemVkSXNTdHJpbmc7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHNwZWNpYWxpemVkQXNTdHJpbmdOdWxsYWJsZTsKICBGdW5jdGlvbkVudGl0eSBnZXQgc3BlY2lhbGl6ZWRDaGVja1N0cmluZ051bGxhYmxlOwoKICAvLyBGcm9tIGRhcnQ6X2ludGVybmFsCgogIENsYXNzRW50aXR5IGdldCBzeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzOwoKICAvLy8gVXNlZCB0byBhbm5vdGF0ZSBpdGVtcyB0aGF0IGhhdmUgdGhlIGtleXdvcmQgIm5hdGl2ZSIuCiAgQ2xhc3NFbnRpdHkgZ2V0IGV4dGVybmFsTmFtZUNsYXNzOwoKICBJbnRlcmZhY2VUeXBlIGdldCBleHRlcm5hbE5hbWVUeXBlOwoKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgc3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3I7CgogIC8vIEZyb20gZGFydDpfanNfZW1iZWRkZWRfbmFtZXMKCiAgLy8vIEhvbGRzIHRoZSBjbGFzcyBmb3IgdGhlIFtKc0dldE5hbWVdIGVudW0uCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzR2V0TmFtZUVudW07CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbWVtYmVyXSBpcyBhICJmb3JlaWduIGhlbHBlciIsIHRoYXQgaXMsIGEgbWVtYmVyIHdob3NlCiAgLy8vIHNlbWFudGljcyBpcyBkZWZpbmVkIHN5bnRoZXRpY2FsbHkgYW5kIG5vdCB0aHJvdWdoIERhcnQgY29kZS4KICAvLy8KICAvLy8gTW9zdCBmb3JlaWduIGhlbHBlcnMgYXJlIGxvY2F0ZWQgaW4gdGhlIGBkYXJ0Ol9mb3JlaWduX2hlbHBlcmAgbGlicmFyeS4KICBib29sIGlzRm9yZWlnbkhlbHBlcihNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgQ2xhc3NFbnRpdHkgZ2V0RGVmYXVsdFN1cGVyY2xhc3MoCiAgICAgIENsYXNzRW50aXR5IGNscywgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZUJhc2ljRGF0YSk7Cn0KCmFic3RyYWN0IGNsYXNzIEtDb21tb25FbGVtZW50cyBpbXBsZW1lbnRzIENvbW1vbkVsZW1lbnRzIHsKICAvLyBGcm9tIHBhY2thZ2U6anMKICBDbGFzc0VudGl0eSBnZXQganNBbm5vdGF0aW9uQ2xhc3M7CgogIENsYXNzRW50aXR5IGdldCBqc0Fub255bW91c0NsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQgcHJhZ21hQ2xhc3M7CiAgRmllbGRFbnRpdHkgZ2V0IHByYWdtYUNsYXNzTmFtZUZpZWxkOwogIEZpZWxkRW50aXR5IGdldCBwcmFnbWFDbGFzc09wdGlvbnNGaWVsZDsKCiAgYm9vbCBpc0NyZWF0ZUludm9jYXRpb25NaXJyb3JIZWxwZXIoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIGJvb2wgaXNTeW1ib2xWYWxpZGF0ZWRDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvckVudGl0eSBlbGVtZW50KTsKCiAgQ2xhc3NFbnRpdHkgZ2V0IG1ldGFOb0lubGluZUNsYXNzOwoKICBDbGFzc0VudGl0eSBnZXQgbWV0YVRyeUlubGluZUNsYXNzOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2Z1bmN0aW9uXSBpcyBhbGxvd2VkIHRvIGJlIGV4dGVybmFsLgogIC8vLwogIC8vLyBUaGlzIHJldHVybnMgYHRydWVgIGZvciBmb3JlaWduIGhlbHBlcnMsIGZyb20gZW52aXJvbm1lbnQgY29uc3RydWN0b3JzIGFuZAogIC8vLyBtZW1iZXJzIG9mIGxpYnJhcmllcyB0aGF0IHN1cHBvcnQgbmF0aXZlLgogIC8vLwogIC8vLyBUaGlzIHJldHVybnMgYGZhbHNlYCBmb3IgSlMgaW50ZXJvcCBtZW1iZXJzIHdoaWNoIHRoZXJlZm9yZSBtdXN0IGJlCiAgLy8vIGFsbG93ZWQgdG8gYmUgZXh0ZXJuYWwgdGhyb3VnaCB0aGUgSlMgaW50ZXJvcCBhbm5vdGF0aW9uIGhhbmRsaW5nLgogIGJvb2wgaXNFeHRlcm5hbEFsbG93ZWQoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pOwp9CgphYnN0cmFjdCBjbGFzcyBKQ29tbW9uRWxlbWVudHMgaW1wbGVtZW50cyBDb21tb25FbGVtZW50cyB7CiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtlbGVtZW50XSBpcyB0aGUgdW5uYW1lZCBjb25zdHJ1Y3RvciBvZiBgTGlzdGAuCiAgLy8vCiAgLy8vIFRoaXMgd2lsbCBub3QgcmVzb2x2ZSB0aGUgY29uc3RydWN0b3IgaWYgaXQgaGFzbid0IGJlZW4gc2VlbiB5ZXQgZHVyaW5nCiAgLy8vIGNvbXBpbGF0aW9uLgogIGJvb2wgaXNVbm5hbWVkTGlzdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VsZW1lbnRdIGlzIHRoZSAnZmlsbGVkJyBjb25zdHJ1Y3RvciBvZiBgTGlzdGAuCiAgLy8vCiAgLy8vIFRoaXMgd2lsbCBub3QgcmVzb2x2ZSB0aGUgY29uc3RydWN0b3IgaWYgaXQgaGFzbid0IGJlZW4gc2VlbiB5ZXQgZHVyaW5nCiAgLy8vIGNvbXBpbGF0aW9uLgogIGJvb2wgaXNGaWxsZWRMaXN0Q29uc3RydWN0b3IoQ29uc3RydWN0b3JFbnRpdHkgZWxlbWVudCk7CgogIGJvb2wgaXNEZWZhdWx0RXF1YWxpdHlJbXBsZW1lbnRhdGlvbihNZW1iZXJFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbc2VsZWN0b3JdIGFwcGxpZXMgdG8gYEpTSW5kZXhhYmxlLmxlbmd0aGAuCiAgYm9vbCBhcHBsaWVzVG9Kc0luZGV4YWJsZUxlbmd0aChTZWxlY3RvciBzZWxlY3Rvcik7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBqc0FycmF5UmVtb3ZlTGFzdDsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGpzQXJyYXlBZGQ7CgogIGJvb2wgaXNKc1N0cmluZ1NwbGl0KE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW3NlbGVjdG9yXSBhcHBsaWVzIHRvIGBKU1N0cmluZy5zcGxpdGAgb24gW3JlY2VpdmVyXQogIC8vLyBpbiB0aGUgZ2l2ZW4gW3dvcmxkXS4KICAvLy8KICAvLy8gUmV0dXJucyBgZmFsc2VgIGlmIGBKU1N0cmluZy5zcGxpdGAgaXMgbm90IGF2YWlsYWJsZS4KICBib29sIGFwcGxpZXNUb0pzU3RyaW5nU3BsaXQoU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIsCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbik7CgogIEZ1bmN0aW9uRW50aXR5IGdldCBqc1N0cmluZ1NwbGl0OwoKICBGdW5jdGlvbkVudGl0eSBnZXQganNTdHJpbmdUb1N0cmluZzsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGpzU3RyaW5nT3BlcmF0b3JBZGQ7CgogIENsYXNzRW50aXR5IGdldCBqc0NvbnN0Q2xhc3M7CgogIC8vLyBSZXR1cm4gYHRydWVgIGlmIFttZW1iZXJdIGlzIHRoZSAnY2hlY2tJbnQnIGZ1bmN0aW9uIGRlZmluZWQgaW4KICAvLy8gZGFydDpfanNfaGVscGVycy4KICBib29sIGlzQ2hlY2tJbnQoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBSZXR1cm4gYHRydWVgIGlmIFttZW1iZXJdIGlzIHRoZSAnY2hlY2tOdW0nIGZ1bmN0aW9uIGRlZmluZWQgaW4KICAvLy8gZGFydDpfanNfaGVscGVycy4KICBib29sIGlzQ2hlY2tOdW0oTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBSZXR1cm4gYHRydWVgIGlmIFttZW1iZXJdIGlzIHRoZSAnY2hlY2tTdHJpbmcnIGZ1bmN0aW9uIGRlZmluZWQgaW4KICAvLy8gZGFydDpfanNfaGVscGVycy4KICBib29sIGlzQ2hlY2tTdHJpbmcoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIGJvb2wgaXNJbnN0YW50aWF0aW9uQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8gRnJvbSBkYXJ0Ol9uYXRpdmVfdHlwZWRfZGF0YQoKICBDbGFzc0VudGl0eSBnZXQgdHlwZWRBcnJheU9mSW50Q2xhc3M7CgogIENsYXNzRW50aXR5IGdldCB0eXBlZEFycmF5T2ZEb3VibGVDbGFzczsKCiAgLy8vIEhvbGRzIHRoZSBjbGFzcyBmb3IgdGhlIFtKc0J1aWx0aW5zXSBlbnVtLgogIENsYXNzRW50aXR5IGdldCBqc0J1aWx0aW5FbnVtOwoKICBib29sIGlzRm9yZWlnbihNZW1iZXJFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlICdvcGVyYXRvciA9PScgW2Z1bmN0aW9uXSBpcwogIC8vLyBrbm93biB0byBoYW5kbGUgYG51bGxgIGFzIGFyZ3VtZW50LgogIGJvb2wgb3BlcmF0b3JFcUhhbmRsZXNOdWxsQXJndW1lbnQoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pOwp9CgpjbGFzcyBDb21tb25FbGVtZW50c0ltcGwKICAgIGltcGxlbWVudHMgQ29tbW9uRWxlbWVudHMsIEtDb21tb25FbGVtZW50cywgSkNvbW1vbkVsZW1lbnRzIHsKICBmaW5hbCBFbGVtZW50RW52aXJvbm1lbnQgX2VudjsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CgogIENvbW1vbkVsZW1lbnRzSW1wbCh0aGlzLl9lbnYsIHRoaXMuX29wdGlvbnMpOwoKICBDbGFzc0VudGl0eSBfb2JqZWN0Q2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IG9iamVjdENsYXNzID0+CiAgICAgIF9vYmplY3RDbGFzcyA/Pz0gX2ZpbmRDbGFzcyhjb3JlTGlicmFyeSwgJ09iamVjdCcpOwoKICBDbGFzc0VudGl0eSBfYm9vbENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBib29sQ2xhc3MgPT4gX2Jvb2xDbGFzcyA/Pz0gX2ZpbmRDbGFzcyhjb3JlTGlicmFyeSwgJ2Jvb2wnKTsKCiAgQ2xhc3NFbnRpdHkgX251bUNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBudW1DbGFzcyA9PiBfbnVtQ2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdudW0nKTsKCiAgQ2xhc3NFbnRpdHkgX2ludENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBpbnRDbGFzcyA9PiBfaW50Q2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdpbnQnKTsKCiAgQ2xhc3NFbnRpdHkgX2RvdWJsZUNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBkb3VibGVDbGFzcyA9PgogICAgICBfZG91YmxlQ2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdkb3VibGUnKTsKCiAgQ2xhc3NFbnRpdHkgX3N0cmluZ0NsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBzdHJpbmdDbGFzcyA9PgogICAgICBfc3RyaW5nQ2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdTdHJpbmcnKTsKCiAgQ2xhc3NFbnRpdHkgX2Z1bmN0aW9uQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGZ1bmN0aW9uQ2xhc3MgPT4KICAgICAgX2Z1bmN0aW9uQ2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdGdW5jdGlvbicpOwoKICBDbGFzc0VudGl0eSBfcmVzb3VyY2VDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgcmVzb3VyY2VDbGFzcyA9PgogICAgICBfcmVzb3VyY2VDbGFzcyA/Pz0gX2ZpbmRDbGFzcyhjb3JlTGlicmFyeSwgJ1Jlc291cmNlJyk7CgogIENsYXNzRW50aXR5IF9zeW1ib2xDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgc3ltYm9sQ2xhc3MgPT4KICAgICAgX3N5bWJvbENsYXNzID8/PSBfZmluZENsYXNzKGNvcmVMaWJyYXJ5LCAnU3ltYm9sJyk7CgogIENsYXNzRW50aXR5IF9udWxsQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IG51bGxDbGFzcyA9PiBfbnVsbENsYXNzID8/PSBfZmluZENsYXNzKGNvcmVMaWJyYXJ5LCAnTnVsbCcpOwoKICBDbGFzc0VudGl0eSBfdHlwZUNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCB0eXBlQ2xhc3MgPT4gX3R5cGVDbGFzcyA/Pz0gX2ZpbmRDbGFzcyhjb3JlTGlicmFyeSwgJ1R5cGUnKTsKCiAgQ2xhc3NFbnRpdHkgX3N0YWNrVHJhY2VDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgc3RhY2tUcmFjZUNsYXNzID0+CiAgICAgIF9zdGFja1RyYWNlQ2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdTdGFja1RyYWNlJyk7CgogIENsYXNzRW50aXR5IF9saXN0Q2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGxpc3RDbGFzcyA9PiBfbGlzdENsYXNzID8/PSBfZmluZENsYXNzKGNvcmVMaWJyYXJ5LCAnTGlzdCcpOwoKICBDbGFzc0VudGl0eSBfc2V0Q2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IHNldENsYXNzID0+IF9zZXRDbGFzcyA/Pz0gX2ZpbmRDbGFzcyhjb3JlTGlicmFyeSwgJ1NldCcpOwoKICBDbGFzc0VudGl0eSBfbWFwQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IG1hcENsYXNzID0+IF9tYXBDbGFzcyA/Pz0gX2ZpbmRDbGFzcyhjb3JlTGlicmFyeSwgJ01hcCcpOwoKICBDbGFzc0VudGl0eSBfdW5tb2RpZmlhYmxlU2V0Q2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IHVubW9kaWZpYWJsZVNldENsYXNzID0+IF91bm1vZGlmaWFibGVTZXRDbGFzcyA/Pz0KICAgICAgX2ZpbmRDbGFzcyhfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5kYXJ0X2NvbGxlY3Rpb24pLCAnX1VubW9kaWZpYWJsZVNldCcpOwoKICBDbGFzc0VudGl0eSBfaXRlcmFibGVDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgaXRlcmFibGVDbGFzcyA9PgogICAgICBfaXRlcmFibGVDbGFzcyA/Pz0gX2ZpbmRDbGFzcyhjb3JlTGlicmFyeSwgJ0l0ZXJhYmxlJyk7CgogIENsYXNzRW50aXR5IF9mdXR1cmVDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgZnV0dXJlQ2xhc3MgPT4KICAgICAgX2Z1dHVyZUNsYXNzID8/PSBfZmluZENsYXNzKGFzeW5jTGlicmFyeSwgJ0Z1dHVyZScpOwoKICBDbGFzc0VudGl0eSBfc3RyZWFtQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IHN0cmVhbUNsYXNzID0+CiAgICAgIF9zdHJlYW1DbGFzcyA/Pz0gX2ZpbmRDbGFzcyhhc3luY0xpYnJhcnksICdTdHJlYW0nKTsKCiAgTGlicmFyeUVudGl0eSBfY29yZUxpYnJhcnk7CiAgQG92ZXJyaWRlCiAgTGlicmFyeUVudGl0eSBnZXQgY29yZUxpYnJhcnkgPT4KICAgICAgX2NvcmVMaWJyYXJ5ID8/PSBfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5kYXJ0X2NvcmUsIHJlcXVpcmVkOiB0cnVlKTsKCiAgTGlicmFyeUVudGl0eSBfYXN5bmNMaWJyYXJ5OwogIEBvdmVycmlkZQogIExpYnJhcnlFbnRpdHkgZ2V0IGFzeW5jTGlicmFyeSA9PgogICAgICBfYXN5bmNMaWJyYXJ5ID8/PSBfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5kYXJ0X2FzeW5jKTsKCiAgLy8vIFRoZSBkYXJ0Om1pcnJvcnMgbGlicmFyeS4KICAvLy8KICAvLy8gTnVsbCBpZiB0aGUgcHJvZ3JhbSBkb2Vzbid0IGFjY2VzcyBkYXJ0Om1pcnJvcnMuCiAgTGlicmFyeUVudGl0eSBfbWlycm9yc0xpYnJhcnk7CiAgQG92ZXJyaWRlCiAgTGlicmFyeUVudGl0eSBnZXQgbWlycm9yc0xpYnJhcnkgPT4KICAgICAgX21pcnJvcnNMaWJyYXJ5ID8/PSBfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5kYXJ0X21pcnJvcnMpOwoKICBMaWJyYXJ5RW50aXR5IF90eXBlZERhdGFMaWJyYXJ5OwogIEBvdmVycmlkZQogIExpYnJhcnlFbnRpdHkgZ2V0IHR5cGVkRGF0YUxpYnJhcnkgPT4KICAgICAgX3R5cGVkRGF0YUxpYnJhcnkgPz89IF9lbnYubG9va3VwTGlicmFyeShVcmlzLmRhcnRfX25hdGl2ZV90eXBlZF9kYXRhKTsKCiAgTGlicmFyeUVudGl0eSBfanNIZWxwZXJMaWJyYXJ5OwogIEBvdmVycmlkZQogIExpYnJhcnlFbnRpdHkgZ2V0IGpzSGVscGVyTGlicmFyeSA9PgogICAgICBfanNIZWxwZXJMaWJyYXJ5ID8/PSBfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5kYXJ0X19qc19oZWxwZXIpOwoKICBMaWJyYXJ5RW50aXR5IF9pbnRlcmNlcHRvcnNMaWJyYXJ5OwogIEBvdmVycmlkZQogIExpYnJhcnlFbnRpdHkgZ2V0IGludGVyY2VwdG9yc0xpYnJhcnkgPT4KICAgICAgX2ludGVyY2VwdG9yc0xpYnJhcnkgPz89IF9lbnYubG9va3VwTGlicmFyeShVcmlzLmRhcnRfX2ludGVyY2VwdG9ycyk7CgogIExpYnJhcnlFbnRpdHkgX2ZvcmVpZ25MaWJyYXJ5OwogIEBvdmVycmlkZQogIExpYnJhcnlFbnRpdHkgZ2V0IGZvcmVpZ25MaWJyYXJ5ID0+CiAgICAgIF9mb3JlaWduTGlicmFyeSA/Pz0gX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMuZGFydF9fZm9yZWlnbl9oZWxwZXIpOwoKICBMaWJyYXJ5RW50aXR5IF9ydGlMaWJyYXJ5OwogIEBvdmVycmlkZQogIExpYnJhcnlFbnRpdHkgZ2V0IHJ0aUxpYnJhcnkgPT4KICAgICAgX3J0aUxpYnJhcnkgPz89IF9lbnYubG9va3VwTGlicmFyeShVcmlzLmRhcnRfX3J0aSwgcmVxdWlyZWQ6IHRydWUpOwoKICAvLy8gUmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBsaWJyYXJ5IHRvIGxvb2t1cCBmdW5jdGlvbnMgdG8gYWx3YXlzIGlubGluZS4KICBMaWJyYXJ5RW50aXR5IF9pbnRlcm5hbExpYnJhcnk7CiAgQG92ZXJyaWRlCiAgTGlicmFyeUVudGl0eSBnZXQgaW50ZXJuYWxMaWJyYXJ5ID0+IF9pbnRlcm5hbExpYnJhcnkgPz89CiAgICAgIF9lbnYubG9va3VwTGlicmFyeShVcmlzLmRhcnRfX2ludGVybmFsLCByZXF1aXJlZDogdHJ1ZSk7CgogIENsYXNzRW50aXR5IF90eXBlZERhdGFDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgdHlwZWREYXRhQ2xhc3MgPT4KICAgICAgX3R5cGVkRGF0YUNsYXNzID8/PSBfZmluZENsYXNzKHR5cGVkRGF0YUxpYnJhcnksICdOYXRpdmVUeXBlZERhdGEnKTsKCiAgQ29uc3RydWN0b3JFbnRpdHkgX3N5bWJvbENvbnN0cnVjdG9yVGFyZ2V0OwogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yRW50aXR5IGdldCBzeW1ib2xDb25zdHJ1Y3RvclRhcmdldCB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBLZXJuZWwgZG9lcyBub3QgaW5jbHVkZSByZWRpcmVjdGluZyBmYWN0b3JpZXMKICAgIC8vIHNvIHRoaXMgY2Fubm90IGJlIGZvdW5kIGluIGtlcm5lbC4gRmluZCBhIGNvbnNpc3RlbnQgd2F5IHRvIGhhbmRsZQogICAgLy8gdGhpcyBhbmQgc2ltaWxhciBjYXNlcy4KICAgIHJldHVybiBfc3ltYm9sQ29uc3RydWN0b3JUYXJnZXQgPz89CiAgICAgICAgX2ZpbmRDb25zdHJ1Y3RvcihzeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzLCAnJyk7CiAgfQoKICBib29sIF9jb21wdXRlZFN5bWJvbENvbnN0cnVjdG9yRGVwZW5kZW5jaWVzID0gZmFsc2U7CiAgQ29uc3RydWN0b3JFbnRpdHkgX3N5bWJvbENvbnN0cnVjdG9ySW1wbGVtZW50YXRpb25UYXJnZXQ7CgogIHZvaWQgX2Vuc3VyZVN5bWJvbENvbnN0cnVjdG9yRGVwZW5kZW5jaWVzKCkgewogICAgaWYgKF9jb21wdXRlZFN5bWJvbENvbnN0cnVjdG9yRGVwZW5kZW5jaWVzKSByZXR1cm47CiAgICBfY29tcHV0ZWRTeW1ib2xDb25zdHJ1Y3RvckRlcGVuZGVuY2llcyA9IHRydWU7CiAgICBpZiAoX3N5bWJvbENvbnN0cnVjdG9yVGFyZ2V0ID09IG51bGwpIHsKICAgICAgaWYgKF9zeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzID09IG51bGwpIHsKICAgICAgICBfc3ltYm9sSW1wbGVtZW50YXRpb25DbGFzcyA9CiAgICAgICAgICAgIF9maW5kQ2xhc3MoaW50ZXJuYWxMaWJyYXJ5LCAnU3ltYm9sJywgcmVxdWlyZWQ6IGZhbHNlKTsKICAgICAgfQogICAgICBpZiAoX3N5bWJvbEltcGxlbWVudGF0aW9uQ2xhc3MgIT0gbnVsbCkgewogICAgICAgIF9zeW1ib2xDb25zdHJ1Y3RvclRhcmdldCA9CiAgICAgICAgICAgIF9maW5kQ29uc3RydWN0b3IoX3N5bWJvbEltcGxlbWVudGF0aW9uQ2xhc3MsICcnLCByZXF1aXJlZDogZmFsc2UpOwogICAgICB9CiAgICB9CiAgICBpZiAoX3N5bWJvbENsYXNzID09IG51bGwpIHsKICAgICAgX3N5bWJvbENsYXNzID0gX2ZpbmRDbGFzcyhjb3JlTGlicmFyeSwgJ1N5bWJvbCcsIHJlcXVpcmVkOiBmYWxzZSk7CiAgICB9CiAgICBpZiAoX3N5bWJvbENsYXNzID09IG51bGwpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgX3N5bWJvbENvbnN0cnVjdG9ySW1wbGVtZW50YXRpb25UYXJnZXQgPQogICAgICAgIF9maW5kQ29uc3RydWN0b3Ioc3ltYm9sQ2xhc3MsICcnLCByZXF1aXJlZDogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1N5bWJvbENvbnN0cnVjdG9yKENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChlbGVtZW50ICE9IG51bGwpOwogICAgX2Vuc3VyZVN5bWJvbENvbnN0cnVjdG9yRGVwZW5kZW5jaWVzKCk7CiAgICByZXR1cm4gZWxlbWVudCA9PSBfc3ltYm9sQ29uc3RydWN0b3JJbXBsZW1lbnRhdGlvblRhcmdldCB8fAogICAgICAgIGVsZW1lbnQgPT0gX3N5bWJvbENvbnN0cnVjdG9yVGFyZ2V0OwogIH0KCiAgRnVuY3Rpb25FbnRpdHkgX2lkZW50aWNhbEZ1bmN0aW9uOwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBpZGVudGljYWxGdW5jdGlvbiA9PgogICAgICBfaWRlbnRpY2FsRnVuY3Rpb24gPz89IF9maW5kTGlicmFyeU1lbWJlcihjb3JlTGlicmFyeSwgJ2lkZW50aWNhbCcpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzRnVuY3Rpb25BcHBseU1ldGhvZChNZW1iZXJFbnRpdHkgZWxlbWVudCkgPT4KICAgICAgZWxlbWVudC5uYW1lID09ICdhcHBseScgJiYgZWxlbWVudC5lbmNsb3NpbmdDbGFzcyA9PSBmdW5jdGlvbkNsYXNzOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VsZW1lbnRdIGlzIHRoZSB1bm5hbWVkIGNvbnN0cnVjdG9yIG9mIGBMaXN0YC4KICAvLy8KICAvLy8gVGhpcyB3aWxsIG5vdCByZXNvbHZlIHRoZSBjb25zdHJ1Y3RvciBpZiBpdCBoYXNuJ3QgYmVlbiBzZWVuIHlldCBkdXJpbmcKICAvLy8gY29tcGlsYXRpb24uCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1VubmFtZWRMaXN0Q29uc3RydWN0b3IoQ29uc3RydWN0b3JFbnRpdHkgZWxlbWVudCkgPT4KICAgICAgKGVsZW1lbnQubmFtZSA9PSAnJyAmJiBlbGVtZW50LmVuY2xvc2luZ0NsYXNzID09IGxpc3RDbGFzcykgfHwKICAgICAgKGVsZW1lbnQubmFtZSA9PSAnbGlzdCcgJiYgZWxlbWVudC5lbmNsb3NpbmdDbGFzcyA9PSBqc0FycmF5Q2xhc3MpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VsZW1lbnRdIGlzIHRoZSAnZmlsbGVkJyBjb25zdHJ1Y3RvciBvZiBgTGlzdGAuCiAgLy8vCiAgLy8vIFRoaXMgd2lsbCBub3QgcmVzb2x2ZSB0aGUgY29uc3RydWN0b3IgaWYgaXQgaGFzbid0IGJlZW4gc2VlbiB5ZXQgZHVyaW5nCiAgLy8vIGNvbXBpbGF0aW9uLgogIEBvdmVycmlkZQogIGJvb2wgaXNGaWxsZWRMaXN0Q29uc3RydWN0b3IoQ29uc3RydWN0b3JFbnRpdHkgZWxlbWVudCkgPT4KICAgICAgZWxlbWVudC5uYW1lID09ICdmaWxsZWQnICYmIGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MgPT0gbGlzdENsYXNzOwoKICBAb3ZlcnJpZGUKICBEeW5hbWljVHlwZSBnZXQgZHluYW1pY1R5cGUgPT4gX2Vudi5keW5hbWljVHlwZTsKCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgb2JqZWN0VHlwZSA9PiBfZ2V0UmF3VHlwZShvYmplY3RDbGFzcyk7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IGJvb2xUeXBlID0+IF9nZXRSYXdUeXBlKGJvb2xDbGFzcyk7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IG51bVR5cGUgPT4gX2dldFJhd1R5cGUobnVtQ2xhc3MpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCBpbnRUeXBlID0+IF9nZXRSYXdUeXBlKGludENsYXNzKTsKCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgZG91YmxlVHlwZSA9PiBfZ2V0UmF3VHlwZShkb3VibGVDbGFzcyk7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IHN0cmluZ1R5cGUgPT4gX2dldFJhd1R5cGUoc3RyaW5nQ2xhc3MpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCBzeW1ib2xUeXBlID0+IF9nZXRSYXdUeXBlKHN5bWJvbENsYXNzKTsKCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgZnVuY3Rpb25UeXBlID0+IF9nZXRSYXdUeXBlKGZ1bmN0aW9uQ2xhc3MpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCBudWxsVHlwZSA9PiBfZ2V0UmF3VHlwZShudWxsQ2xhc3MpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCB0eXBlVHlwZSA9PiBfZ2V0UmF3VHlwZSh0eXBlQ2xhc3MpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCB0eXBlTGl0ZXJhbFR5cGUgPT4gX2dldFJhd1R5cGUodHlwZUxpdGVyYWxDbGFzcyk7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IHN0YWNrVHJhY2VUeXBlID0+IF9nZXRSYXdUeXBlKHN0YWNrVHJhY2VDbGFzcyk7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgbGlzdFR5cGUoW0RhcnRUeXBlIGVsZW1lbnRUeXBlXSkgewogICAgaWYgKGVsZW1lbnRUeXBlID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9nZXRSYXdUeXBlKGxpc3RDbGFzcyk7CiAgICB9CiAgICByZXR1cm4gX2NyZWF0ZUludGVyZmFjZVR5cGUobGlzdENsYXNzLCBbZWxlbWVudFR5cGVdKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgc2V0VHlwZShbRGFydFR5cGUgZWxlbWVudFR5cGVdKSB7CiAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2dldFJhd1R5cGUoc2V0Q2xhc3MpOwogICAgfQogICAgcmV0dXJuIF9jcmVhdGVJbnRlcmZhY2VUeXBlKHNldENsYXNzLCBbZWxlbWVudFR5cGVdKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgbWFwVHlwZShbRGFydFR5cGUga2V5VHlwZSwgRGFydFR5cGUgdmFsdWVUeXBlXSkgewogICAgaWYgKGtleVR5cGUgPT0gbnVsbCAmJiB2YWx1ZVR5cGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2dldFJhd1R5cGUobWFwQ2xhc3MpOwogICAgfSBlbHNlIGlmIChrZXlUeXBlID09IG51bGwpIHsKICAgICAga2V5VHlwZSA9IGR5bmFtaWNUeXBlOwogICAgfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gbnVsbCkgewogICAgICB2YWx1ZVR5cGUgPSBkeW5hbWljVHlwZTsKICAgIH0KICAgIHJldHVybiBfY3JlYXRlSW50ZXJmYWNlVHlwZShtYXBDbGFzcywgW2tleVR5cGUsIHZhbHVlVHlwZV0pOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBpdGVyYWJsZVR5cGUoW0RhcnRUeXBlIGVsZW1lbnRUeXBlXSkgewogICAgaWYgKGVsZW1lbnRUeXBlID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9nZXRSYXdUeXBlKGl0ZXJhYmxlQ2xhc3MpOwogICAgfQogICAgcmV0dXJuIF9jcmVhdGVJbnRlcmZhY2VUeXBlKGl0ZXJhYmxlQ2xhc3MsIFtlbGVtZW50VHlwZV0pOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBmdXR1cmVUeXBlKFtEYXJ0VHlwZSBlbGVtZW50VHlwZV0pIHsKICAgIGlmIChlbGVtZW50VHlwZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZ2V0UmF3VHlwZShmdXR1cmVDbGFzcyk7CiAgICB9CiAgICByZXR1cm4gX2NyZWF0ZUludGVyZmFjZVR5cGUoZnV0dXJlQ2xhc3MsIFtlbGVtZW50VHlwZV0pOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBzdHJlYW1UeXBlKFtEYXJ0VHlwZSBlbGVtZW50VHlwZV0pIHsKICAgIGlmIChlbGVtZW50VHlwZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZ2V0UmF3VHlwZShzdHJlYW1DbGFzcyk7CiAgICB9CiAgICByZXR1cm4gX2NyZWF0ZUludGVyZmFjZVR5cGUoc3RyZWFtQ2xhc3MsIFtlbGVtZW50VHlwZV0pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc051bWJlck9yU3RyaW5nU3VwZXJ0eXBlKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBlbGVtZW50ID09IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdDb21wYXJhYmxlJywgcmVxdWlyZWQ6IGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNTdHJpbmdPbmx5U3VwZXJ0eXBlKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBlbGVtZW50ID09IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdQYXR0ZXJuJywgcmVxdWlyZWQ6IGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNMaXN0U3VwZXJ0eXBlKENsYXNzRW50aXR5IGVsZW1lbnQpID0+IGVsZW1lbnQgPT0gaXRlcmFibGVDbGFzczsKCiAgQ2xhc3NFbnRpdHkgX2ZpbmRDbGFzcyhMaWJyYXJ5RW50aXR5IGxpYnJhcnksIFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCByZXF1aXJlZDogdHJ1ZX0pIHsKICAgIGlmIChsaWJyYXJ5ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9lbnYubG9va3VwQ2xhc3MobGlicmFyeSwgbmFtZSwgcmVxdWlyZWQ6IHJlcXVpcmVkKTsKICB9CgogIE1lbWJlckVudGl0eSBfZmluZExpYnJhcnlNZW1iZXIoTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZSwgYm9vbCByZXF1aXJlZDogdHJ1ZX0pIHsKICAgIGlmIChsaWJyYXJ5ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9lbnYubG9va3VwTGlicmFyeU1lbWJlcihsaWJyYXJ5LCBuYW1lLAogICAgICAgIHNldHRlcjogc2V0dGVyLCByZXF1aXJlZDogcmVxdWlyZWQpOwogIH0KCiAgTWVtYmVyRW50aXR5IF9maW5kQ2xhc3NNZW1iZXIoQ2xhc3NFbnRpdHkgY2xzLCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZSwgYm9vbCByZXF1aXJlZDogdHJ1ZX0pIHsKICAgIHJldHVybiBfZW52Lmxvb2t1cExvY2FsQ2xhc3NNZW1iZXIoY2xzLCBuYW1lLAogICAgICAgIHNldHRlcjogc2V0dGVyLCByZXF1aXJlZDogcmVxdWlyZWQpOwogIH0KCiAgQ29uc3RydWN0b3JFbnRpdHkgX2ZpbmRDb25zdHJ1Y3RvcihDbGFzc0VudGl0eSBjbHMsIFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCByZXF1aXJlZDogdHJ1ZX0pIHsKICAgIHJldHVybiBfZW52Lmxvb2t1cENvbnN0cnVjdG9yKGNscywgbmFtZSwgcmVxdWlyZWQ6IHJlcXVpcmVkKTsKICB9CgogIC8vLyBSZXR1cm4gdGhlIHJhdyB0eXBlIG9mIFtjbHNdLgogIEludGVyZmFjZVR5cGUgX2dldFJhd1R5cGUoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gX2Vudi5nZXRSYXdUeXBlKGNscyk7CiAgfQoKICAvLy8gQ3JlYXRlIHRoZSBpbnN0YW50aWF0aW9uIG9mIFtjbHNdIHdpdGggdGhlIGdpdmVuIFt0eXBlQXJndW1lbnRzXS4KICBJbnRlcmZhY2VUeXBlIF9jcmVhdGVJbnRlcmZhY2VUeXBlKAogICAgICBDbGFzc0VudGl0eSBjbHMsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIHJldHVybiBfZW52LmNyZWF0ZUludGVyZmFjZVR5cGUoY2xzLCB0eXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0Q29uc3RhbnRNYXBUeXBlRm9yKEludGVyZmFjZVR5cGUgc291cmNlVHlwZSwKICAgICAge2Jvb2wgaGFzUHJvdG9LZXk6IGZhbHNlLCBib29sIG9ubHlTdHJpbmdLZXlzOiBmYWxzZX0pIHsKICAgIENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCA9IG9ubHlTdHJpbmdLZXlzCiAgICAgICAgPyAoaGFzUHJvdG9LZXkgPyBjb25zdGFudFByb3RvTWFwQ2xhc3MgOiBjb25zdGFudFN0cmluZ01hcENsYXNzKQogICAgICAgIDogZ2VuZXJhbENvbnN0YW50TWFwQ2xhc3M7CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnQgPSBzb3VyY2VUeXBlLnR5cGVBcmd1bWVudHM7CiAgICBpZiAoc291cmNlVHlwZS50cmVhdEFzUmF3KSB7CiAgICAgIHJldHVybiBfZW52LmdldFJhd1R5cGUoY2xhc3NFbGVtZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfZW52LmNyZWF0ZUludGVyZmFjZVR5cGUoY2xhc3NFbGVtZW50LCB0eXBlQXJndW1lbnQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRDb25zdGFudFNldFR5cGVGb3IoSW50ZXJmYWNlVHlwZSBzb3VyY2VUeXBlKSA9PgogICAgICBzb3VyY2VUeXBlLnRyZWF0QXNSYXcKICAgICAgICAgID8gX2Vudi5nZXRSYXdUeXBlKGNvbnN0U2V0TGl0ZXJhbENsYXNzKQogICAgICAgICAgOiBfZW52LmNyZWF0ZUludGVyZmFjZVR5cGUoCiAgICAgICAgICAgICAgY29uc3RTZXRMaXRlcmFsQ2xhc3MsIHNvdXJjZVR5cGUudHlwZUFyZ3VtZW50cyk7CgogIEBvdmVycmlkZQogIEZpZWxkRW50aXR5IGdldCBzeW1ib2xGaWVsZCA9PiBzeW1ib2xJbXBsZW1lbnRhdGlvbkZpZWxkOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCBzeW1ib2xJbXBsZW1lbnRhdGlvblR5cGUgPT4KICAgICAgX2Vudi5nZXRSYXdUeXBlKHN5bWJvbEltcGxlbWVudGF0aW9uQ2xhc3MpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzRGVmYXVsdEVxdWFsaXR5SW1wbGVtZW50YXRpb24oTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChlbGVtZW50Lm5hbWUgPT0gJz09Jyk7CiAgICBDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQgPSBlbGVtZW50LmVuY2xvc2luZ0NsYXNzOwogICAgcmV0dXJuIGNsYXNzRWxlbWVudCA9PSBvYmplY3RDbGFzcyB8fAogICAgICAgIGNsYXNzRWxlbWVudCA9PSBqc0ludGVyY2VwdG9yQ2xhc3MgfHwKICAgICAgICBjbGFzc0VsZW1lbnQgPT0ganNOdWxsQ2xhc3M7CiAgfQoKICAvLyBGcm9tIGRhcnQ6Y29yZQoKICBDbGFzc0VudGl0eSBfbWFwTGl0ZXJhbENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBtYXBMaXRlcmFsQ2xhc3MgewogICAgaWYgKF9tYXBMaXRlcmFsQ2xhc3MgPT0gbnVsbCkgewogICAgICBfbWFwTGl0ZXJhbENsYXNzID0gX2Vudi5sb29rdXBDbGFzcyhjb3JlTGlicmFyeSwgJ0xpbmtlZEhhc2hNYXAnKTsKICAgICAgaWYgKF9tYXBMaXRlcmFsQ2xhc3MgPT0gbnVsbCkgewogICAgICAgIF9tYXBMaXRlcmFsQ2xhc3MgPSBfZmluZENsYXNzKAogICAgICAgICAgICBfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5kYXJ0X2NvbGxlY3Rpb24pLCAnTGlua2VkSGFzaE1hcCcpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX21hcExpdGVyYWxDbGFzczsKICB9CgogIENvbnN0cnVjdG9yRW50aXR5IF9tYXBMaXRlcmFsQ29uc3RydWN0b3I7CiAgQ29uc3RydWN0b3JFbnRpdHkgX21hcExpdGVyYWxDb25zdHJ1Y3RvckVtcHR5OwogIEZ1bmN0aW9uRW50aXR5IF9tYXBMaXRlcmFsVW50eXBlZE1ha2VyOwogIEZ1bmN0aW9uRW50aXR5IF9tYXBMaXRlcmFsVW50eXBlZEVtcHR5TWFrZXI7CiAgdm9pZCBfZW5zdXJlTWFwTGl0ZXJhbEhlbHBlcnMoKSB7CiAgICBpZiAoX21hcExpdGVyYWxDb25zdHJ1Y3RvciAhPSBudWxsKSByZXR1cm47CgogICAgX21hcExpdGVyYWxDb25zdHJ1Y3RvciA9CiAgICAgICAgX2Vudi5sb29rdXBDb25zdHJ1Y3RvcihtYXBMaXRlcmFsQ2xhc3MsICdfbGl0ZXJhbCcpOwogICAgX21hcExpdGVyYWxDb25zdHJ1Y3RvckVtcHR5ID0KICAgICAgICBfZW52Lmxvb2t1cENvbnN0cnVjdG9yKG1hcExpdGVyYWxDbGFzcywgJ19lbXB0eScpOwogICAgX21hcExpdGVyYWxVbnR5cGVkTWFrZXIgPQogICAgICAgIF9lbnYubG9va3VwTG9jYWxDbGFzc01lbWJlcihtYXBMaXRlcmFsQ2xhc3MsICdfbWFrZUxpdGVyYWwnKTsKICAgIF9tYXBMaXRlcmFsVW50eXBlZEVtcHR5TWFrZXIgPQogICAgICAgIF9lbnYubG9va3VwTG9jYWxDbGFzc01lbWJlcihtYXBMaXRlcmFsQ2xhc3MsICdfbWFrZUVtcHR5Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgbWFwTGl0ZXJhbENvbnN0cnVjdG9yIHsKICAgIF9lbnN1cmVNYXBMaXRlcmFsSGVscGVycygpOwogICAgcmV0dXJuIF9tYXBMaXRlcmFsQ29uc3RydWN0b3I7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgbWFwTGl0ZXJhbENvbnN0cnVjdG9yRW1wdHkgewogICAgX2Vuc3VyZU1hcExpdGVyYWxIZWxwZXJzKCk7CiAgICByZXR1cm4gX21hcExpdGVyYWxDb25zdHJ1Y3RvckVtcHR5OwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IG1hcExpdGVyYWxVbnR5cGVkTWFrZXIgewogICAgX2Vuc3VyZU1hcExpdGVyYWxIZWxwZXJzKCk7CiAgICByZXR1cm4gX21hcExpdGVyYWxVbnR5cGVkTWFrZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgbWFwTGl0ZXJhbFVudHlwZWRFbXB0eU1ha2VyIHsKICAgIF9lbnN1cmVNYXBMaXRlcmFsSGVscGVycygpOwogICAgcmV0dXJuIF9tYXBMaXRlcmFsVW50eXBlZEVtcHR5TWFrZXI7CiAgfQoKICBDbGFzc0VudGl0eSBfc2V0TGl0ZXJhbENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBzZXRMaXRlcmFsQ2xhc3MgPT4gX3NldExpdGVyYWxDbGFzcyA/Pz0KICAgICAgX2ZpbmRDbGFzcyhfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5kYXJ0X2NvbGxlY3Rpb24pLCAnTGlua2VkSGFzaFNldCcpOwoKICBDb25zdHJ1Y3RvckVudGl0eSBfc2V0TGl0ZXJhbENvbnN0cnVjdG9yOwogIENvbnN0cnVjdG9yRW50aXR5IF9zZXRMaXRlcmFsQ29uc3RydWN0b3JFbXB0eTsKICBGdW5jdGlvbkVudGl0eSBfc2V0TGl0ZXJhbFVudHlwZWRNYWtlcjsKICBGdW5jdGlvbkVudGl0eSBfc2V0TGl0ZXJhbFVudHlwZWRFbXB0eU1ha2VyOwoKICB2b2lkIF9lbnN1cmVTZXRMaXRlcmFsSGVscGVycygpIHsKICAgIGlmIChfc2V0TGl0ZXJhbENvbnN0cnVjdG9yICE9IG51bGwpIHJldHVybjsKCiAgICBfc2V0TGl0ZXJhbENvbnN0cnVjdG9yID0KICAgICAgICBfZW52Lmxvb2t1cENvbnN0cnVjdG9yKHNldExpdGVyYWxDbGFzcywgJ19saXRlcmFsJyk7CiAgICBfc2V0TGl0ZXJhbENvbnN0cnVjdG9yRW1wdHkgPQogICAgICAgIF9lbnYubG9va3VwQ29uc3RydWN0b3Ioc2V0TGl0ZXJhbENsYXNzLCAnX2VtcHR5Jyk7CiAgICBfc2V0TGl0ZXJhbFVudHlwZWRNYWtlciA9CiAgICAgICAgX2Vudi5sb29rdXBMb2NhbENsYXNzTWVtYmVyKHNldExpdGVyYWxDbGFzcywgJ19tYWtlTGl0ZXJhbCcpOwogICAgX3NldExpdGVyYWxVbnR5cGVkRW1wdHlNYWtlciA9CiAgICAgICAgX2Vudi5sb29rdXBMb2NhbENsYXNzTWVtYmVyKHNldExpdGVyYWxDbGFzcywgJ19tYWtlRW1wdHknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yRW50aXR5IGdldCBzZXRMaXRlcmFsQ29uc3RydWN0b3IgewogICAgX2Vuc3VyZVNldExpdGVyYWxIZWxwZXJzKCk7CiAgICByZXR1cm4gX3NldExpdGVyYWxDb25zdHJ1Y3RvcjsKICB9CgogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yRW50aXR5IGdldCBzZXRMaXRlcmFsQ29uc3RydWN0b3JFbXB0eSB7CiAgICBfZW5zdXJlU2V0TGl0ZXJhbEhlbHBlcnMoKTsKICAgIHJldHVybiBfc2V0TGl0ZXJhbENvbnN0cnVjdG9yRW1wdHk7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc2V0TGl0ZXJhbFVudHlwZWRNYWtlciB7CiAgICBfZW5zdXJlU2V0TGl0ZXJhbEhlbHBlcnMoKTsKICAgIHJldHVybiBfc2V0TGl0ZXJhbFVudHlwZWRNYWtlcjsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBzZXRMaXRlcmFsVW50eXBlZEVtcHR5TWFrZXIgewogICAgX2Vuc3VyZVNldExpdGVyYWxIZWxwZXJzKCk7CiAgICByZXR1cm4gX3NldExpdGVyYWxVbnR5cGVkRW1wdHlNYWtlcjsKICB9CgogIEZ1bmN0aW9uRW50aXR5IF9vYmplY3ROb1N1Y2hNZXRob2Q7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IG9iamVjdE5vU3VjaE1ldGhvZCB7CiAgICByZXR1cm4gX29iamVjdE5vU3VjaE1ldGhvZCA/Pz0KICAgICAgICBfZW52Lmxvb2t1cExvY2FsQ2xhc3NNZW1iZXIob2JqZWN0Q2xhc3MsIElkZW50aWZpZXJzLm5vU3VjaE1ldGhvZF8pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0RlZmF1bHROb1N1Y2hNZXRob2RJbXBsZW1lbnRhdGlvbihGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQgPSBlbGVtZW50LmVuY2xvc2luZ0NsYXNzOwogICAgcmV0dXJuIGNsYXNzRWxlbWVudCA9PSBvYmplY3RDbGFzcyB8fAogICAgICAgIGNsYXNzRWxlbWVudCA9PSBqc0ludGVyY2VwdG9yQ2xhc3MgfHwKICAgICAgICBjbGFzc0VsZW1lbnQgPT0ganNOdWxsQ2xhc3M7CiAgfQoKICAvLyBGcm9tIGRhcnQ6YXN5bmMKICBDbGFzc0VudGl0eSBfZmluZEFzeW5jSGVscGVyQ2xhc3MoU3RyaW5nIG5hbWUpID0+CiAgICAgIF9maW5kQ2xhc3MoYXN5bmNMaWJyYXJ5LCBuYW1lKTsKCiAgRnVuY3Rpb25FbnRpdHkgX2ZpbmRBc3luY0hlbHBlckZ1bmN0aW9uKFN0cmluZyBuYW1lKSA9PgogICAgICBfZmluZExpYnJhcnlNZW1iZXIoYXN5bmNMaWJyYXJ5LCBuYW1lKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzeW5jSGVscGVyU3RhcnRTeW5jID0+CiAgICAgIF9maW5kQXN5bmNIZWxwZXJGdW5jdGlvbigiX2FzeW5jU3RhcnRTeW5jIik7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzeW5jSGVscGVyQXdhaXQgPT4KICAgICAgX2ZpbmRBc3luY0hlbHBlckZ1bmN0aW9uKCJfYXN5bmNBd2FpdCIpOwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3luY0hlbHBlclJldHVybiA9PgogICAgICBfZmluZEFzeW5jSGVscGVyRnVuY3Rpb24oIl9hc3luY1JldHVybiIpOwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3luY0hlbHBlclJldGhyb3cgPT4KICAgICAgX2ZpbmRBc3luY0hlbHBlckZ1bmN0aW9uKCJfYXN5bmNSZXRocm93Iik7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCB3cmFwQm9keSA9PgogICAgICBfZmluZEFzeW5jSGVscGVyRnVuY3Rpb24oIl93cmFwSnNGdW5jdGlvbkZvckFzeW5jIik7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCB5aWVsZFN0YXIgPT4gX2Vudi5sb29rdXBMb2NhbENsYXNzTWVtYmVyKAogICAgICBfZmluZEFzeW5jSGVscGVyQ2xhc3MoIl9JdGVyYXRpb25NYXJrZXIiKSwgInlpZWxkU3RhciIpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgeWllbGRTaW5nbGUgPT4gX2Vudi5sb29rdXBMb2NhbENsYXNzTWVtYmVyKAogICAgICBfZmluZEFzeW5jSGVscGVyQ2xhc3MoIl9JdGVyYXRpb25NYXJrZXIiKSwgInlpZWxkU2luZ2xlIik7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBzeW5jU3RhclVuY2F1Z2h0RXJyb3IgPT4gX2Vudi5sb29rdXBMb2NhbENsYXNzTWVtYmVyKAogICAgICBfZmluZEFzeW5jSGVscGVyQ2xhc3MoIl9JdGVyYXRpb25NYXJrZXIiKSwgInVuY2F1Z2h0RXJyb3IiKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzeW5jU3RhckhlbHBlciA9PgogICAgICBfZmluZEFzeW5jSGVscGVyRnVuY3Rpb24oIl9hc3luY1N0YXJIZWxwZXIiKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHN0cmVhbU9mQ29udHJvbGxlciA9PgogICAgICBfZmluZEFzeW5jSGVscGVyRnVuY3Rpb24oIl9zdHJlYW1PZkNvbnRyb2xsZXIiKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGVuZE9mSXRlcmF0aW9uID0+IF9lbnYubG9va3VwTG9jYWxDbGFzc01lbWJlcigKICAgICAgX2ZpbmRBc3luY0hlbHBlckNsYXNzKCJfSXRlcmF0aW9uTWFya2VyIiksICJlbmRPZkl0ZXJhdGlvbiIpOwoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgc3luY1N0YXJJdGVyYWJsZSA9PgogICAgICBfZmluZEFzeW5jSGVscGVyQ2xhc3MoIl9TeW5jU3Rhckl0ZXJhYmxlIik7CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBmdXR1cmVJbXBsZW1lbnRhdGlvbiA9PiBfZmluZEFzeW5jSGVscGVyQ2xhc3MoJ19GdXR1cmUnKTsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGNvbnRyb2xsZXJTdHJlYW0gPT4KICAgICAgX2ZpbmRBc3luY0hlbHBlckNsYXNzKCJfQ29udHJvbGxlclN0cmVhbSIpOwoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgc3RyZWFtSXRlcmF0b3IgPT4gX2ZpbmRBc3luY0hlbHBlckNsYXNzKCJTdHJlYW1JdGVyYXRvciIpOwoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgc3RyZWFtSXRlcmF0b3JDb25zdHJ1Y3RvciA9PgogICAgICBfZW52Lmxvb2t1cENvbnN0cnVjdG9yKHN0cmVhbUl0ZXJhdG9yLCAiIik7CgogIEZ1bmN0aW9uRW50aXR5IF9zeW5jU3Rhckl0ZXJhYmxlRmFjdG9yeTsKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc3luY1N0YXJJdGVyYWJsZUZhY3RvcnkgPT4gX3N5bmNTdGFySXRlcmFibGVGYWN0b3J5ID8/PQogICAgICBfZmluZEFzeW5jSGVscGVyRnVuY3Rpb24oJ19tYWtlU3luY1N0YXJJdGVyYWJsZScpOwoKICBGdW5jdGlvbkVudGl0eSBfYXN5bmNBd2FpdENvbXBsZXRlckZhY3Rvcnk7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzeW5jQXdhaXRDb21wbGV0ZXJGYWN0b3J5ID0+CiAgICAgIF9hc3luY0F3YWl0Q29tcGxldGVyRmFjdG9yeSA/Pz0KICAgICAgICAgIF9maW5kQXN5bmNIZWxwZXJGdW5jdGlvbignX21ha2VBc3luY0F3YWl0Q29tcGxldGVyJyk7CgogIEZ1bmN0aW9uRW50aXR5IF9hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyRmFjdG9yeTsKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckZhY3RvcnkgPT4KICAgICAgX2FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJGYWN0b3J5ID8/PQogICAgICAgICAgX2ZpbmRBc3luY0hlbHBlckZ1bmN0aW9uKCdfbWFrZUFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXInKTsKCiAgLy8gRnJvbSBkYXJ0Ol9pbnRlcmNlcHRvcnMKICBDbGFzc0VudGl0eSBfZmluZEludGVyY2VwdG9yc0NsYXNzKFN0cmluZyBuYW1lKSA9PgogICAgICBfZmluZENsYXNzKGludGVyY2VwdG9yc0xpYnJhcnksIG5hbWUpOwoKICBGdW5jdGlvbkVudGl0eSBfZmluZEludGVyY2VwdG9yc0Z1bmN0aW9uKFN0cmluZyBuYW1lKSA9PgogICAgICBfZmluZExpYnJhcnlNZW1iZXIoaW50ZXJjZXB0b3JzTGlicmFyeSwgbmFtZSk7CgogIENsYXNzRW50aXR5IF9qc0ludGVyY2VwdG9yQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzSW50ZXJjZXB0b3JDbGFzcyA9PgogICAgICBfanNJbnRlcmNlcHRvckNsYXNzID8/PSBfZmluZEludGVyY2VwdG9yc0NsYXNzKCdJbnRlcmNlcHRvcicpOwoKICBDbGFzc0VudGl0eSBfanNTdHJpbmdDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNTdHJpbmdDbGFzcyA9PgogICAgICBfanNTdHJpbmdDbGFzcyA/Pz0gX2ZpbmRJbnRlcmNlcHRvcnNDbGFzcygnSlNTdHJpbmcnKTsKCiAgQ2xhc3NFbnRpdHkgX2pzQXJyYXlDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNBcnJheUNsYXNzID0+CiAgICAgIF9qc0FycmF5Q2xhc3MgPz89IF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0pTQXJyYXknKTsKCiAgQ2xhc3NFbnRpdHkgX2pzTnVtYmVyQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzTnVtYmVyQ2xhc3MgPT4KICAgICAgX2pzTnVtYmVyQ2xhc3MgPz89IF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0pTTnVtYmVyJyk7CgogIENsYXNzRW50aXR5IF9qc0ludENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc0ludENsYXNzID0+IF9qc0ludENsYXNzID8/PSBfZmluZEludGVyY2VwdG9yc0NsYXNzKCdKU0ludCcpOwoKICBDbGFzc0VudGl0eSBfanNEb3VibGVDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNEb3VibGVDbGFzcyA9PgogICAgICBfanNEb3VibGVDbGFzcyA/Pz0gX2ZpbmRJbnRlcmNlcHRvcnNDbGFzcygnSlNEb3VibGUnKTsKCiAgQ2xhc3NFbnRpdHkgX2pzTnVsbENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc051bGxDbGFzcyA9PgogICAgICBfanNOdWxsQ2xhc3MgPz89IF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0pTTnVsbCcpOwoKICBDbGFzc0VudGl0eSBfanNCb29sQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzQm9vbENsYXNzID0+CiAgICAgIF9qc0Jvb2xDbGFzcyA/Pz0gX2ZpbmRJbnRlcmNlcHRvcnNDbGFzcygnSlNCb29sJyk7CgogIENsYXNzRW50aXR5IF9qc1BsYWluSmF2YVNjcmlwdE9iamVjdENsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc1BsYWluSmF2YVNjcmlwdE9iamVjdENsYXNzID0+CiAgICAgIF9qc1BsYWluSmF2YVNjcmlwdE9iamVjdENsYXNzID8/PQogICAgICAgICAgX2ZpbmRJbnRlcmNlcHRvcnNDbGFzcygnUGxhaW5KYXZhU2NyaXB0T2JqZWN0Jyk7CgogIENsYXNzRW50aXR5IF9qc1Vua25vd25KYXZhU2NyaXB0T2JqZWN0Q2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzVW5rbm93bkphdmFTY3JpcHRPYmplY3RDbGFzcyA9PgogICAgICBfanNVbmtub3duSmF2YVNjcmlwdE9iamVjdENsYXNzID8/PQogICAgICAgICAgX2ZpbmRJbnRlcmNlcHRvcnNDbGFzcygnVW5rbm93bkphdmFTY3JpcHRPYmplY3QnKTsKCiAgQ2xhc3NFbnRpdHkgX2pzSmF2YVNjcmlwdEZ1bmN0aW9uQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzSmF2YVNjcmlwdEZ1bmN0aW9uQ2xhc3MgPT4gX2pzSmF2YVNjcmlwdEZ1bmN0aW9uQ2xhc3MgPz89CiAgICAgIF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0phdmFTY3JpcHRGdW5jdGlvbicpOwoKICBDbGFzc0VudGl0eSBfanNKYXZhU2NyaXB0T2JqZWN0Q2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzSmF2YVNjcmlwdE9iamVjdENsYXNzID0+CiAgICAgIF9qc0phdmFTY3JpcHRPYmplY3RDbGFzcyA/Pz0gX2ZpbmRJbnRlcmNlcHRvcnNDbGFzcygnSmF2YVNjcmlwdE9iamVjdCcpOwoKICBDbGFzc0VudGl0eSBfanNJbmRleGFibGVDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNJbmRleGFibGVDbGFzcyA9PgogICAgICBfanNJbmRleGFibGVDbGFzcyA/Pz0gX2ZpbmRJbnRlcmNlcHRvcnNDbGFzcygnSlNJbmRleGFibGUnKTsKCiAgQ2xhc3NFbnRpdHkgX2pzTXV0YWJsZUluZGV4YWJsZUNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc011dGFibGVJbmRleGFibGVDbGFzcyA9PgogICAgICBfanNNdXRhYmxlSW5kZXhhYmxlQ2xhc3MgPz89IF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0pTTXV0YWJsZUluZGV4YWJsZScpOwoKICBDbGFzc0VudGl0eSBfanNNdXRhYmxlQXJyYXlDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNNdXRhYmxlQXJyYXlDbGFzcyA9PgogICAgICBfanNNdXRhYmxlQXJyYXlDbGFzcyA/Pz0gX2ZpbmRJbnRlcmNlcHRvcnNDbGFzcygnSlNNdXRhYmxlQXJyYXknKTsKCiAgQ2xhc3NFbnRpdHkgX2pzRml4ZWRBcnJheUNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc0ZpeGVkQXJyYXlDbGFzcyA9PgogICAgICBfanNGaXhlZEFycmF5Q2xhc3MgPz89IF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0pTRml4ZWRBcnJheScpOwoKICBDbGFzc0VudGl0eSBfanNFeHRlbmRhYmxlQXJyYXlDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNFeHRlbmRhYmxlQXJyYXlDbGFzcyA9PgogICAgICBfanNFeHRlbmRhYmxlQXJyYXlDbGFzcyA/Pz0gX2ZpbmRJbnRlcmNlcHRvcnNDbGFzcygnSlNFeHRlbmRhYmxlQXJyYXknKTsKCiAgQ2xhc3NFbnRpdHkgX2pzVW5tb2RpZmlhYmxlQXJyYXlDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNVbm1vZGlmaWFibGVBcnJheUNsYXNzID0+IF9qc1VubW9kaWZpYWJsZUFycmF5Q2xhc3MgPz89CiAgICAgIF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0pTVW5tb2RpZmlhYmxlQXJyYXknKTsKCiAgQ2xhc3NFbnRpdHkgX2pzUG9zaXRpdmVJbnRDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNQb3NpdGl2ZUludENsYXNzID0+CiAgICAgIF9qc1Bvc2l0aXZlSW50Q2xhc3MgPz89IF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0pTUG9zaXRpdmVJbnQnKTsKCiAgQ2xhc3NFbnRpdHkgX2pzVUludDMyQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzVUludDMyQ2xhc3MgPT4KICAgICAgX2pzVUludDMyQ2xhc3MgPz89IF9maW5kSW50ZXJjZXB0b3JzQ2xhc3MoJ0pTVUludDMyJyk7CgogIENsYXNzRW50aXR5IF9qc1VJbnQzMUNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc1VJbnQzMUNsYXNzID0+CiAgICAgIF9qc1VJbnQzMUNsYXNzID8/PSBfZmluZEludGVyY2VwdG9yc0NsYXNzKCdKU1VJbnQzMScpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzRmluZEluZGV4Rm9yTmF0aXZlU3ViY2xhc3NUeXBlKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBtZW1iZXIubmFtZSA9PSAnZmluZEluZGV4Rm9yTmF0aXZlU3ViY2xhc3NUeXBlJyAmJgogICAgICAgIG1lbWJlci5pc1RvcExldmVsICYmCiAgICAgICAgbWVtYmVyLmxpYnJhcnkgPT0gaW50ZXJjZXB0b3JzTGlicmFyeTsKICB9CgogIEZ1bmN0aW9uRW50aXR5IF9nZXROYXRpdmVJbnRlcmNlcHRvck1ldGhvZDsKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgZ2V0TmF0aXZlSW50ZXJjZXB0b3JNZXRob2QgPT4KICAgICAgX2dldE5hdGl2ZUludGVyY2VwdG9yTWV0aG9kID8/PQogICAgICAgICAgX2ZpbmRJbnRlcmNlcHRvcnNGdW5jdGlvbignZ2V0TmF0aXZlSW50ZXJjZXB0b3InKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBhcHBsaWVzVG9Kc0luZGV4YWJsZUxlbmd0aChTZWxlY3RvciBzZWxlY3RvcikgewogICAgcmV0dXJuIHNlbGVjdG9yLm5hbWUgPT0gJ2xlbmd0aCcgJiYgKHNlbGVjdG9yLmlzR2V0dGVyIHx8IHNlbGVjdG9yLmlzQ2FsbCk7CiAgfQoKICBDb25zdHJ1Y3RvckVudGl0eSBfanNBcnJheVR5cGVkQ29uc3RydWN0b3I7CiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0IGpzQXJyYXlUeXBlZENvbnN0cnVjdG9yID0+CiAgICAgIF9qc0FycmF5VHlwZWRDb25zdHJ1Y3RvciA/Pz0gX2ZpbmRDb25zdHJ1Y3Rvcihqc0FycmF5Q2xhc3MsICd0eXBlZCcpOwoKICBGdW5jdGlvbkVudGl0eSBfanNBcnJheVJlbW92ZUxhc3Q7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGpzQXJyYXlSZW1vdmVMYXN0ID0+CiAgICAgIF9qc0FycmF5UmVtb3ZlTGFzdCA/Pz0gX2ZpbmRDbGFzc01lbWJlcihqc0FycmF5Q2xhc3MsICdyZW1vdmVMYXN0Jyk7CgogIEZ1bmN0aW9uRW50aXR5IF9qc0FycmF5QWRkOwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBqc0FycmF5QWRkID0+CiAgICAgIF9qc0FycmF5QWRkID8/PSBfZmluZENsYXNzTWVtYmVyKGpzQXJyYXlDbGFzcywgJ2FkZCcpOwoKICBib29sIF9pc0pzU3RyaW5nQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gY2xzLm5hbWUgPT0gJ0pTU3RyaW5nJyAmJiBjbHMubGlicmFyeSA9PSBpbnRlcmNlcHRvcnNMaWJyYXJ5OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0pzU3RyaW5nU3BsaXQoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgcmV0dXJuIG1lbWJlci5uYW1lID09ICdzcGxpdCcgJiYKICAgICAgICBtZW1iZXIuaXNJbnN0YW5jZU1lbWJlciAmJgogICAgICAgIF9pc0pzU3RyaW5nQ2xhc3MobWVtYmVyLmVuY2xvc2luZ0NsYXNzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgYXBwbGllc1RvSnNTdHJpbmdTcGxpdChTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlciwKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKSB7CiAgICBpZiAoX2pzU3RyaW5nU3BsaXQgPT0gbnVsbCkgewogICAgICBDbGFzc0VudGl0eSBjbHMgPQogICAgICAgICAgX2ZpbmRDbGFzcyhpbnRlcmNlcHRvcnNMaWJyYXJ5LCAnSlNTdHJpbmcnLCByZXF1aXJlZDogZmFsc2UpOwogICAgICBpZiAoY2xzID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgX2pzU3RyaW5nU3BsaXQgPSBfZmluZENsYXNzTWVtYmVyKGNscywgJ3NwbGl0JywgcmVxdWlyZWQ6IGZhbHNlKTsKICAgICAgaWYgKF9qc1N0cmluZ1NwbGl0ID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiBzZWxlY3Rvci5hcHBsaWVzKF9qc1N0cmluZ1NwbGl0KSAmJgogICAgICAgIChyZWNlaXZlciA9PSBudWxsIHx8CiAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgICAgICAgIC5pc1RhcmdldGluZ01lbWJlcihyZWNlaXZlciwganNTdHJpbmdTcGxpdCwgc2VsZWN0b3IubWVtYmVyTmFtZSkKICAgICAgICAgICAgICAgIC5pc1BvdGVudGlhbGx5VHJ1ZSk7CiAgfQoKICBGdW5jdGlvbkVudGl0eSBfanNTdHJpbmdTcGxpdDsKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQganNTdHJpbmdTcGxpdCA9PgogICAgICBfanNTdHJpbmdTcGxpdCA/Pz0gX2ZpbmRDbGFzc01lbWJlcihqc1N0cmluZ0NsYXNzLCAnc3BsaXQnKTsKCiAgRnVuY3Rpb25FbnRpdHkgX2pzU3RyaW5nVG9TdHJpbmc7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGpzU3RyaW5nVG9TdHJpbmcgPT4KICAgICAgX2pzU3RyaW5nVG9TdHJpbmcgPz89IF9maW5kQ2xhc3NNZW1iZXIoanNTdHJpbmdDbGFzcywgJ3RvU3RyaW5nJyk7CgogIEZ1bmN0aW9uRW50aXR5IF9qc1N0cmluZ09wZXJhdG9yQWRkOwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBqc1N0cmluZ09wZXJhdG9yQWRkID0+CiAgICAgIF9qc1N0cmluZ09wZXJhdG9yQWRkID8/PSBfZmluZENsYXNzTWVtYmVyKGpzU3RyaW5nQ2xhc3MsICcrJyk7CgogIENsYXNzRW50aXR5IF9qc0NvbnN0Q2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzQ29uc3RDbGFzcyA9PgogICAgICBfanNDb25zdENsYXNzID8/PSBfZmluZENsYXNzKGZvcmVpZ25MaWJyYXJ5LCAnSlNfQ09OU1QnKTsKCiAgLy8gRnJvbSBwYWNrYWdlOmpzCiAgQ2xhc3NFbnRpdHkgX2pzQW5ub3RhdGlvbkNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc0Fubm90YXRpb25DbGFzcyB7CiAgICBpZiAoX2pzQW5ub3RhdGlvbkNsYXNzID09IG51bGwpIHsKICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5ID0gX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMucGFja2FnZV9qcyk7CiAgICAgIGlmIChsaWJyYXJ5ID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBfanNBbm5vdGF0aW9uQ2xhc3MgPSBfZmluZENsYXNzKGxpYnJhcnksICdKUycpOwogICAgfQogICAgcmV0dXJuIF9qc0Fubm90YXRpb25DbGFzczsKICB9CgogIENsYXNzRW50aXR5IF9qc0Fub255bW91c0NsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc0Fub255bW91c0NsYXNzIHsKICAgIGlmIChfanNBbm9ueW1vdXNDbGFzcyA9PSBudWxsKSB7CiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSA9IF9lbnYubG9va3VwTGlicmFyeShVcmlzLnBhY2thZ2VfanMpOwogICAgICBpZiAobGlicmFyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgX2pzQW5vbnltb3VzQ2xhc3MgPSBfZmluZENsYXNzKGxpYnJhcnksICdfQW5vbnltb3VzJyk7CiAgICB9CiAgICByZXR1cm4gX2pzQW5vbnltb3VzQ2xhc3M7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBmaW5kSGVscGVyRnVuY3Rpb24oU3RyaW5nIG5hbWUpID0+IF9maW5kSGVscGVyRnVuY3Rpb24obmFtZSk7CgogIEZ1bmN0aW9uRW50aXR5IF9maW5kSGVscGVyRnVuY3Rpb24oU3RyaW5nIG5hbWUpID0+CiAgICAgIF9maW5kTGlicmFyeU1lbWJlcihqc0hlbHBlckxpYnJhcnksIG5hbWUpOwoKICBDbGFzc0VudGl0eSBfZmluZEhlbHBlckNsYXNzKFN0cmluZyBuYW1lKSA9PgogICAgICBfZmluZENsYXNzKGpzSGVscGVyTGlicmFyeSwgbmFtZSk7CgogIENsYXNzRW50aXR5IF9jbG9zdXJlQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGNsb3N1cmVDbGFzcyA9PiBfY2xvc3VyZUNsYXNzID8/PSBfZmluZEhlbHBlckNsYXNzKCdDbG9zdXJlJyk7CgogIENsYXNzRW50aXR5IF9ib3VuZENsb3N1cmVDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgYm91bmRDbG9zdXJlQ2xhc3MgPT4KICAgICAgX2JvdW5kQ2xvc3VyZUNsYXNzID8/PSBfZmluZEhlbHBlckNsYXNzKCdCb3VuZENsb3N1cmUnKTsKCiAgQ2xhc3NFbnRpdHkgX3R5cGVMaXRlcmFsQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IHR5cGVMaXRlcmFsQ2xhc3MgPT4KICAgICAgX3R5cGVMaXRlcmFsQ2xhc3MgPz89IF9vcHRpb25zLmV4cGVyaW1lbnROZXdSdGkKICAgICAgICAgID8gX2ZpbmRSdGlDbGFzcygnX1R5cGUnKQogICAgICAgICAgOiBfZmluZEhlbHBlckNsYXNzKCdUeXBlSW1wbCcpOwoKICBDbGFzc0VudGl0eSBfY29uc3RNYXBMaXRlcmFsQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGNvbnN0TWFwTGl0ZXJhbENsYXNzID0+CiAgICAgIF9jb25zdE1hcExpdGVyYWxDbGFzcyA/Pz0gX2ZpbmRIZWxwZXJDbGFzcygnQ29uc3RhbnRNYXAnKTsKCiAgLy8gVE9ETyhmaXNoeXRoZWZpc2gpOiBJbXBsZW1lbnQgYSBgQ29uc3RhbnRTZXRgIGNsYXNzIGFuZCB1cGRhdGUgdGhlIGJhY2tlbmQKICAvLyBpbXBhY3RzICsgY29uc3RhbnQgZW1pdHRlciBhY2NvcmRpbmdseS4KICBDbGFzc0VudGl0eSBfY29uc3RTZXRMaXRlcmFsQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGNvbnN0U2V0TGl0ZXJhbENsYXNzID0+CiAgICAgIF9jb25zdFNldExpdGVyYWxDbGFzcyA/Pz0gdW5tb2RpZmlhYmxlU2V0Q2xhc3M7CgogIENsYXNzRW50aXR5IF90eXBlVmFyaWFibGVDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgdHlwZVZhcmlhYmxlQ2xhc3MgPT4KICAgICAgX3R5cGVWYXJpYWJsZUNsYXNzID8/PSBfZmluZEhlbHBlckNsYXNzKCdUeXBlVmFyaWFibGUnKTsKCiAgQ2xhc3NFbnRpdHkgX3ByYWdtYUNsYXNzOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBwcmFnbWFDbGFzcyA9PgogICAgICBfcHJhZ21hQ2xhc3MgPz89IF9maW5kQ2xhc3MoY29yZUxpYnJhcnksICdwcmFnbWEnKTsKCiAgRmllbGRFbnRpdHkgX3ByYWdtYUNsYXNzTmFtZUZpZWxkOwogIEBvdmVycmlkZQogIEZpZWxkRW50aXR5IGdldCBwcmFnbWFDbGFzc05hbWVGaWVsZCA9PgogICAgICBfcHJhZ21hQ2xhc3NOYW1lRmllbGQgPz89IF9maW5kQ2xhc3NNZW1iZXIocHJhZ21hQ2xhc3MsICduYW1lJyk7CgogIEZpZWxkRW50aXR5IF9wcmFnbWFDbGFzc09wdGlvbnNGaWVsZDsKICBAb3ZlcnJpZGUKICBGaWVsZEVudGl0eSBnZXQgcHJhZ21hQ2xhc3NPcHRpb25zRmllbGQgPT4KICAgICAgX3ByYWdtYUNsYXNzT3B0aW9uc0ZpZWxkID8/PSBfZmluZENsYXNzTWVtYmVyKHByYWdtYUNsYXNzLCAnb3B0aW9ucycpOwoKICBDbGFzc0VudGl0eSBfanNJbnZvY2F0aW9uTWlycm9yQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGpzSW52b2NhdGlvbk1pcnJvckNsYXNzID0+CiAgICAgIF9qc0ludm9jYXRpb25NaXJyb3JDbGFzcyA/Pz0gX2ZpbmRIZWxwZXJDbGFzcygnSlNJbnZvY2F0aW9uTWlycm9yJyk7CgogIE1lbWJlckVudGl0eSBfaW52b2NhdGlvblR5cGVBcmd1bWVudEdldHRlcjsKICBAb3ZlcnJpZGUKICBNZW1iZXJFbnRpdHkgZ2V0IGludm9jYXRpb25UeXBlQXJndW1lbnRHZXR0ZXIgPT4KICAgICAgX2ludm9jYXRpb25UeXBlQXJndW1lbnRHZXR0ZXIgPz89CiAgICAgICAgICBfZmluZENsYXNzTWVtYmVyKGpzSW52b2NhdGlvbk1pcnJvckNsYXNzLCAndHlwZUFyZ3VtZW50cycpOwoKICBDbGFzc0VudGl0eSBfanNJbmRleGluZ0JlaGF2aW9ySW50ZXJmYWNlOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBqc0luZGV4aW5nQmVoYXZpb3JJbnRlcmZhY2UgPT4KICAgICAgX2pzSW5kZXhpbmdCZWhhdmlvckludGVyZmFjZSA/Pz0KICAgICAgICAgIF9maW5kSGVscGVyQ2xhc3MoJ0phdmFTY3JpcHRJbmRleGluZ0JlaGF2aW9yJyk7CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBzdGFja1RyYWNlSGVscGVyQ2xhc3MgPT4gX2ZpbmRIZWxwZXJDbGFzcygnX1N0YWNrVHJhY2UnKTsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGNvbnN0YW50TWFwQ2xhc3MgPT4KICAgICAgX2ZpbmRIZWxwZXJDbGFzcyhjb25zdGFudF9zeXN0ZW0uSmF2YVNjcmlwdE1hcENvbnN0YW50LkRBUlRfQ0xBU1MpOwogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBjb25zdGFudFN0cmluZ01hcENsYXNzID0+CiAgICAgIF9maW5kSGVscGVyQ2xhc3MoY29uc3RhbnRfc3lzdGVtLkphdmFTY3JpcHRNYXBDb25zdGFudC5EQVJUX1NUUklOR19DTEFTUyk7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGNvbnN0YW50UHJvdG9NYXBDbGFzcyA9PgogICAgICBfZmluZEhlbHBlckNsYXNzKGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQuREFSVF9QUk9UT19DTEFTUyk7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGdlbmVyYWxDb25zdGFudE1hcENsYXNzID0+IF9maW5kSGVscGVyQ2xhc3MoCiAgICAgIGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQuREFSVF9HRU5FUkFMX0NMQVNTKTsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IGFubm90YXRpb25DcmVhdGVzQ2xhc3MgPT4gX2ZpbmRIZWxwZXJDbGFzcygnQ3JlYXRlcycpOwoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgYW5ub3RhdGlvblJldHVybnNDbGFzcyA9PiBfZmluZEhlbHBlckNsYXNzKCdSZXR1cm5zJyk7CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBhbm5vdGF0aW9uSlNOYW1lQ2xhc3MgPT4gX2ZpbmRIZWxwZXJDbGFzcygnSlNOYW1lJyk7CgogIENsYXNzRW50aXR5IF9uYXRpdmVBbm5vdGF0aW9uQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IG5hdGl2ZUFubm90YXRpb25DbGFzcyA9PgogICAgICBfbmF0aXZlQW5ub3RhdGlvbkNsYXNzID8/PSBfZmluZEhlbHBlckNsYXNzKCdOYXRpdmUnKTsKCiAgQ29uc3RydWN0b3JFbnRpdHkgX3R5cGVWYXJpYWJsZUNvbnN0cnVjdG9yOwogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yRW50aXR5IGdldCB0eXBlVmFyaWFibGVDb25zdHJ1Y3RvciA9PiBfdHlwZVZhcmlhYmxlQ29uc3RydWN0b3IgPz89CiAgICAgIF9lbnYubG9va3VwQ29uc3RydWN0b3IodHlwZVZhcmlhYmxlQ2xhc3MsICcnKTsKCiAgRnVuY3Rpb25FbnRpdHkgX2Fzc2VydFRlc3Q7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzc2VydFRlc3QgPT4KICAgICAgX2Fzc2VydFRlc3QgPz89IF9maW5kSGVscGVyRnVuY3Rpb24oJ2Fzc2VydFRlc3QnKTsKCiAgRnVuY3Rpb25FbnRpdHkgX2Fzc2VydFRocm93OwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3NlcnRUaHJvdyA9PgogICAgICBfYXNzZXJ0VGhyb3cgPz89IF9maW5kSGVscGVyRnVuY3Rpb24oJ2Fzc2VydFRocm93Jyk7CgogIEZ1bmN0aW9uRW50aXR5IF9hc3NlcnRIZWxwZXI7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzc2VydEhlbHBlciA9PgogICAgICBfYXNzZXJ0SGVscGVyID8/PSBfZmluZEhlbHBlckZ1bmN0aW9uKCdhc3NlcnRIZWxwZXInKTsKCiAgRnVuY3Rpb25FbnRpdHkgX2Fzc2VydFVucmVhY2hhYmxlTWV0aG9kOwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3NlcnRVbnJlYWNoYWJsZU1ldGhvZCA9PgogICAgICBfYXNzZXJ0VW5yZWFjaGFibGVNZXRob2QgPz89IF9maW5kSGVscGVyRnVuY3Rpb24oJ2Fzc2VydFVucmVhY2hhYmxlJyk7CgogIEZ1bmN0aW9uRW50aXR5IF9nZXRJc29sYXRlQWZmaW5pdHlUYWdNYXJrZXI7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGdldElzb2xhdGVBZmZpbml0eVRhZ01hcmtlciA9PgogICAgICBfZ2V0SXNvbGF0ZUFmZmluaXR5VGFnTWFya2VyID8/PQogICAgICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbignZ2V0SXNvbGF0ZUFmZmluaXR5VGFnJyk7CgogIEZ1bmN0aW9uRW50aXR5IF9yZXF1aXJlc1ByZWFtYmxlTWFya2VyOwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCByZXF1aXJlc1ByZWFtYmxlTWFya2VyID0+CiAgICAgIF9yZXF1aXJlc1ByZWFtYmxlTWFya2VyID8/PSBfZmluZEhlbHBlckZ1bmN0aW9uKCdyZXF1aXJlc1ByZWFtYmxlJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBsb2FkTGlicmFyeVdyYXBwZXIgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbigiX2xvYWRMaWJyYXJ5V3JhcHBlciIpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgbG9hZERlZmVycmVkTGlicmFyeSA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCJsb2FkRGVmZXJyZWRMaWJyYXJ5Iik7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBib29sQ29udmVyc2lvbkNoZWNrID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2Jvb2xDb252ZXJzaW9uQ2hlY2snKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHRyYWNlSGVscGVyID0+IF9maW5kSGVscGVyRnVuY3Rpb24oJ3RyYWNlSGVscGVyJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBjbG9zdXJlRnJvbVRlYXJPZmYgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbignY2xvc3VyZUZyb21UZWFyT2ZmJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBpc0pzSW5kZXhhYmxlID0+IF9maW5kSGVscGVyRnVuY3Rpb24oJ2lzSnNJbmRleGFibGUnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2lhZScpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgdGhyb3dJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24gPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbignaW9vcmUnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGV4Y2VwdGlvblVud3JhcHBlciA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCd1bndyYXBFeGNlcHRpb24nKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHRocm93UnVudGltZUVycm9yID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ3Rocm93UnVudGltZUVycm9yJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCB0aHJvd1Vuc3VwcG9ydGVkRXJyb3IgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbigndGhyb3dVbnN1cHBvcnRlZEVycm9yJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCB0aHJvd1R5cGVFcnJvciA9PiBfZmluZEhlbHBlckZ1bmN0aW9uKCd0aHJvd1R5cGVFcnJvcicpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgdGhyb3dBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ3Rocm93QWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcicpOwoKICBGdW5jdGlvbkVudGl0eSBfY2FjaGVkQ2hlY2tDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3I7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yID0+CiAgICAgIF9jYWNoZWRDaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvciA/Pz0KICAgICAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2NoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCB0aHJvd0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvciA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCd0aHJvd0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcicpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzQ2hlY2tJbnQoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgcmV0dXJuIG1lbWJlci5pc0Z1bmN0aW9uICYmCiAgICAgICAgbWVtYmVyLmlzVG9wTGV2ZWwgJiYKICAgICAgICBtZW1iZXIubGlicmFyeSA9PSBqc0hlbHBlckxpYnJhcnkgJiYKICAgICAgICBtZW1iZXIubmFtZSA9PSAnY2hlY2tJbnQnOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NoZWNrTnVtKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBtZW1iZXIuaXNGdW5jdGlvbiAmJgogICAgICAgIG1lbWJlci5pc1RvcExldmVsICYmCiAgICAgICAgbWVtYmVyLmxpYnJhcnkgPT0ganNIZWxwZXJMaWJyYXJ5ICYmCiAgICAgICAgbWVtYmVyLm5hbWUgPT0gJ2NoZWNrTnVtJzsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNDaGVja1N0cmluZyhNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gbWVtYmVyLmlzRnVuY3Rpb24gJiYKICAgICAgICBtZW1iZXIuaXNUb3BMZXZlbCAmJgogICAgICAgIG1lbWJlci5saWJyYXJ5ID09IGpzSGVscGVyTGlicmFyeSAmJgogICAgICAgIG1lbWJlci5uYW1lID09ICdjaGVja1N0cmluZyc7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc3RyaW5nSW50ZXJwb2xhdGlvbkhlbHBlciA9PiBfZmluZEhlbHBlckZ1bmN0aW9uKCdTJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCB3cmFwRXhjZXB0aW9uSGVscGVyID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ3dyYXBFeGNlcHRpb24nKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHRocm93RXhwcmVzc2lvbkhlbHBlciA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCd0aHJvd0V4cHJlc3Npb24nKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNsb3N1cmVDb252ZXJ0ZXIgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbignY29udmVydERhcnRDbG9zdXJlVG9KUycpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgdHJhY2VGcm9tRXhjZXB0aW9uID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2dldFRyYWNlRnJvbUV4Y2VwdGlvbicpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc2V0UnVudGltZVR5cGVJbmZvID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ3NldFJ1bnRpbWVUeXBlSW5mbycpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgZ2V0UnVudGltZVR5cGVJbmZvID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2dldFJ1bnRpbWVUeXBlSW5mbycpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgZ2V0VHlwZUFyZ3VtZW50QnlJbmRleCA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCdnZXRUeXBlQXJndW1lbnRCeUluZGV4Jyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBjb21wdXRlU2lnbmF0dXJlID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2NvbXB1dGVTaWduYXR1cmUnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGdldFJ1bnRpbWVUeXBlQXJndW1lbnRzID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2dldFJ1bnRpbWVUeXBlQXJndW1lbnRzJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBnZXRSdW50aW1lVHlwZUFyZ3VtZW50ID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2dldFJ1bnRpbWVUeXBlQXJndW1lbnQnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGdldFJ1bnRpbWVUeXBlQXJndW1lbnRJbnRlcmNlcHRlZCA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCdnZXRSdW50aW1lVHlwZUFyZ3VtZW50SW50ZXJjZXB0ZWQnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzc2VydElzU3VidHlwZSA9PiBfZmluZEhlbHBlckZ1bmN0aW9uKCdhc3NlcnRJc1N1YnR5cGUnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNoZWNrU3VidHlwZSA9PiBfZmluZEhlbHBlckZ1bmN0aW9uKCdjaGVja1N1YnR5cGUnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGFzc2VydFN1YnR5cGUgPT4gX2ZpbmRIZWxwZXJGdW5jdGlvbignYXNzZXJ0U3VidHlwZScpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc3VidHlwZUNhc3QgPT4gX2ZpbmRIZWxwZXJGdW5jdGlvbignc3VidHlwZUNhc3QnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGZ1bmN0aW9uVHlwZVRlc3QgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbignZnVuY3Rpb25UeXBlVGVzdCcpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgZnV0dXJlT3JUZXN0ID0+IF9maW5kSGVscGVyRnVuY3Rpb24oJ2Z1dHVyZU9yVGVzdCcpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgY2hlY2tTdWJ0eXBlT2ZSdW50aW1lVHlwZSA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCdjaGVja1N1YnR5cGVPZlJ1bnRpbWVUeXBlJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBhc3NlcnRTdWJ0eXBlT2ZSdW50aW1lVHlwZSA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCdhc3NlcnRTdWJ0eXBlT2ZSdW50aW1lVHlwZScpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc3VidHlwZU9mUnVudGltZVR5cGVDYXN0ID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ3N1YnR5cGVPZlJ1bnRpbWVUeXBlQ2FzdCcpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgY2hlY2tEZWZlcnJlZElzTG9hZGVkID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oJ2NoZWNrRGVmZXJyZWRJc0xvYWRlZCcpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgdGhyb3dOb1N1Y2hNZXRob2QgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbigndGhyb3dOb1N1Y2hNZXRob2QnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNyZWF0ZVJ1bnRpbWVUeXBlID0+IF9vcHRpb25zLmV4cGVyaW1lbnROZXdSdGkKICAgICAgPyBfZmluZFJ0aUZ1bmN0aW9uKCdfY3JlYXRlUnVudGltZVR5cGUnKQogICAgICA6IF9maW5kSGVscGVyRnVuY3Rpb24oJ2NyZWF0ZVJ1bnRpbWVUeXBlJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBmYWxsVGhyb3VnaEVycm9yID0+CiAgICAgIF9maW5kSGVscGVyRnVuY3Rpb24oImdldEZhbGxUaHJvdWdoRXJyb3IiKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGNyZWF0ZUludm9jYXRpb25NaXJyb3IgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbignY3JlYXRlSW52b2NhdGlvbk1pcnJvcicpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzQ3JlYXRlSW52b2NhdGlvbk1pcnJvckhlbHBlcihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gbWVtYmVyLmlzVG9wTGV2ZWwgJiYKICAgICAgICBtZW1iZXIubmFtZSA9PSAnX2NyZWF0ZUludm9jYXRpb25NaXJyb3InICYmCiAgICAgICAgbWVtYmVyLmxpYnJhcnkgPT0gY29yZUxpYnJhcnk7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgY3JlYXRlVW5tYW5nbGVkSW52b2NhdGlvbk1pcnJvciA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCdjcmVhdGVVbm1hbmdsZWRJbnZvY2F0aW9uTWlycm9yJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBjeWNsaWNUaHJvd0hlbHBlciA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCJ0aHJvd0N5Y2xpY0luaXQiKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGRlZmluZVByb3BlcnR5ID0+IF9maW5kSGVscGVyRnVuY3Rpb24oJ2RlZmluZVByb3BlcnR5Jyk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNFeHRyYWN0VHlwZUFyZ3VtZW50cyhGdW5jdGlvbkVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBtZW1iZXIubmFtZSA9PSAnZXh0cmFjdFR5cGVBcmd1bWVudHMnICYmCiAgICAgICAgbWVtYmVyLmxpYnJhcnkgPT0gaW50ZXJuYWxMaWJyYXJ5OwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyLHNyYSk6IFN1cHBvcnQgYXJiaXRyYXJ5IHR5cGUgYXJndW1lbnQgY291bnQuCiAgdm9pZCBfY2hlY2tUeXBlQXJndW1lbnRDb3VudChpbnQgdHlwZUFyZ3VtZW50Q291bnQpIHsKICAgIGFzc2VydCh0eXBlQXJndW1lbnRDb3VudCA+IDApOwogICAgaWYgKHR5cGVBcmd1bWVudENvdW50ID4gMjApIHsKICAgICAgZmFpbGVkQXQoCiAgICAgICAgICBOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAiVW5zdXBwb3J0ZWQgaW5zdGFudGlhdGlvbiBhcmd1bWVudCBjb3VudDogIgogICAgICAgICAgIiR7dHlwZUFyZ3VtZW50Q291bnR9Iik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXRJbnN0YW50aWF0aW9uQ2xhc3MoaW50IHR5cGVBcmd1bWVudENvdW50KSB7CiAgICBfY2hlY2tUeXBlQXJndW1lbnRDb3VudCh0eXBlQXJndW1lbnRDb3VudCk7CiAgICByZXR1cm4gX2ZpbmRIZWxwZXJDbGFzcygnSW5zdGFudGlhdGlvbiR0eXBlQXJndW1lbnRDb3VudCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0SW5zdGFudGlhdGVGdW5jdGlvbihpbnQgdHlwZUFyZ3VtZW50Q291bnQpIHsKICAgIF9jaGVja1R5cGVBcmd1bWVudENvdW50KHR5cGVBcmd1bWVudENvdW50KTsKICAgIHJldHVybiBfZmluZEhlbHBlckZ1bmN0aW9uKCdpbnN0YW50aWF0ZSR0eXBlQXJndW1lbnRDb3VudCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGluc3RhbnRpYXRlZEdlbmVyaWNGdW5jdGlvblR5cGUgPT4KICAgICAgX2ZpbmRIZWxwZXJGdW5jdGlvbignaW5zdGFudGlhdGVkR2VuZXJpY0Z1bmN0aW9uVHlwZScpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgZXh0cmFjdEZ1bmN0aW9uVHlwZU9iamVjdEZyb21JbnRlcm5hbCA9PgogICAgICBfZmluZEhlbHBlckZ1bmN0aW9uKCdleHRyYWN0RnVuY3Rpb25UeXBlT2JqZWN0RnJvbUludGVybmFsJyk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbnN0YW50aWF0aW9uQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gY2xzLmxpYnJhcnkgPT0gX2pzSGVscGVyTGlicmFyeSAmJgogICAgICAgIGNscy5uYW1lICE9ICdJbnN0YW50aWF0aW9uJyAmJgogICAgICAgIGNscy5uYW1lLnN0YXJ0c1dpdGgoJ0luc3RhbnRpYXRpb24nKTsKICB9CgogIC8vIEZyb20gZGFydDpfcnRpCgogIENsYXNzRW50aXR5IF9maW5kUnRpQ2xhc3MoU3RyaW5nIG5hbWUpID0+IF9maW5kQ2xhc3MocnRpTGlicmFyeSwgbmFtZSk7CgogIEZ1bmN0aW9uRW50aXR5IF9maW5kUnRpRnVuY3Rpb24oU3RyaW5nIG5hbWUpID0+CiAgICAgIF9maW5kTGlicmFyeU1lbWJlcihydGlMaWJyYXJ5LCBuYW1lKTsKCiAgRnVuY3Rpb25FbnRpdHkgX2ZpbmRUeXBlOwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBmaW5kVHlwZSA9PiBfZmluZFR5cGUgPz89IF9maW5kUnRpRnVuY3Rpb24oJ2ZpbmRUeXBlJyk7CgogIEZ1bmN0aW9uRW50aXR5IF9pbnN0YW5jZVR5cGU7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IGluc3RhbmNlVHlwZSA9PgogICAgICBfaW5zdGFuY2VUeXBlID8/PSBfZmluZFJ0aUZ1bmN0aW9uKCdpbnN0YW5jZVR5cGUnKTsKCiAgRnVuY3Rpb25FbnRpdHkgX3R5cGVMaXRlcmFsTWFrZXI7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHR5cGVMaXRlcmFsTWFrZXIgPT4KICAgICAgX3R5cGVMaXRlcmFsTWFrZXIgPz89IF9maW5kUnRpRnVuY3Rpb24oJ3R5cGVMaXRlcmFsJyk7CgogIEZ1bmN0aW9uRW50aXR5IF9jaGVja1R5cGVCb3VuZDsKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgY2hlY2tUeXBlQm91bmQgPT4KICAgICAgX2NoZWNrVHlwZUJvdW5kID8/PSBfZmluZFJ0aUZ1bmN0aW9uKCdjaGVja1R5cGVCb3VuZCcpOwoKICBDbGFzc0VudGl0eSBnZXQgX3J0aUltcGxDbGFzcyA9PiBfZmluZENsYXNzKHJ0aUxpYnJhcnksICdSdGknKTsKICBDbGFzc0VudGl0eSBnZXQgX3J0aVVuaXZlcnNlQ2xhc3MgPT4gX2ZpbmRDbGFzcyhydGlMaWJyYXJ5LCAnX1VuaXZlcnNlJyk7CiAgRmllbGRFbnRpdHkgX2ZpbmRSdGlDbGFzc0ZpZWxkKFN0cmluZyBuYW1lKSA9PgogICAgICBfZmluZENsYXNzTWVtYmVyKF9ydGlJbXBsQ2xhc3MsIG5hbWUpOwoKICBGaWVsZEVudGl0eSBfcnRpQXNGaWVsZDsKICBAb3ZlcnJpZGUKICBGaWVsZEVudGl0eSBnZXQgcnRpQXNGaWVsZCA9PiBfcnRpQXNGaWVsZCA/Pz0gX2ZpbmRSdGlDbGFzc0ZpZWxkKCdfYXMnKTsKCiAgRmllbGRFbnRpdHkgX3J0aUlzRmllbGQ7CiAgQG92ZXJyaWRlCiAgRmllbGRFbnRpdHkgZ2V0IHJ0aUlzRmllbGQgPT4gX3J0aUlzRmllbGQgPz89IF9maW5kUnRpQ2xhc3NGaWVsZCgnX2lzJyk7CgogIEZpZWxkRW50aXR5IF9ydGlDaGVja0ZpZWxkOwogIEBvdmVycmlkZQogIEZpZWxkRW50aXR5IGdldCBydGlDaGVja0ZpZWxkID0+CiAgICAgIF9ydGlDaGVja0ZpZWxkID8/PSBfZmluZFJ0aUNsYXNzRmllbGQoJ19jaGVjaycpOwoKICBGdW5jdGlvbkVudGl0eSBfcnRpRXZhbE1ldGhvZDsKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgcnRpRXZhbE1ldGhvZCA9PgogICAgICBfcnRpRXZhbE1ldGhvZCA/Pz0gX2ZpbmRDbGFzc01lbWJlcihfcnRpSW1wbENsYXNzLCAnX2V2YWwnKTsKCiAgRnVuY3Rpb25FbnRpdHkgX3J0aUJpbmRNZXRob2Q7CiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHJ0aUJpbmRNZXRob2QgPT4KICAgICAgX3J0aUJpbmRNZXRob2QgPz89IF9maW5kQ2xhc3NNZW1iZXIoX3J0aUltcGxDbGFzcywgJ19iaW5kJyk7CgogIEZ1bmN0aW9uRW50aXR5IF9ydGlBZGRSdWxlc01ldGhvZDsKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgcnRpQWRkUnVsZXNNZXRob2QgPT4KICAgICAgX3J0aUFkZFJ1bGVzTWV0aG9kID8/PSBfZmluZENsYXNzTWVtYmVyKF9ydGlVbml2ZXJzZUNsYXNzLCAnYWRkUnVsZXMnKTsKCiAgRnVuY3Rpb25FbnRpdHkgX2dlbmVyYWxJc1Rlc3RJbXBsZW1lbnRhdGlvbjsKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgZ2VuZXJhbElzVGVzdEltcGxlbWVudGF0aW9uID0+CiAgICAgIF9nZW5lcmFsSXNUZXN0SW1wbGVtZW50YXRpb24gPz89CiAgICAgICAgICBfZmluZFJ0aUZ1bmN0aW9uKCdfZ2VuZXJhbElzVGVzdEltcGxlbWVudGF0aW9uJyk7CgogIEZ1bmN0aW9uRW50aXR5IF9nZW5lcmFsQXNDaGVja0ltcGxlbWVudGF0aW9uOwogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBnZW5lcmFsQXNDaGVja0ltcGxlbWVudGF0aW9uID0+CiAgICAgIF9nZW5lcmFsQXNDaGVja0ltcGxlbWVudGF0aW9uID8/PQogICAgICAgICAgX2ZpbmRSdGlGdW5jdGlvbignX2dlbmVyYWxBc0NoZWNrSW1wbGVtZW50YXRpb24nKTsKCiAgRnVuY3Rpb25FbnRpdHkgX2dlbmVyYWxUeXBlQ2hlY2tJbXBsZW1lbnRhdGlvbjsKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgZ2VuZXJhbFR5cGVDaGVja0ltcGxlbWVudGF0aW9uID0+CiAgICAgIF9nZW5lcmFsVHlwZUNoZWNrSW1wbGVtZW50YXRpb24gPz89CiAgICAgICAgICBfZmluZFJ0aUZ1bmN0aW9uKCdfZ2VuZXJhbFR5cGVDaGVja0ltcGxlbWVudGF0aW9uJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBzcGVjaWFsaXplZElzQm9vbCA9PiBfZmluZFJ0aUZ1bmN0aW9uKCdfaXNCb29sJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBzcGVjaWFsaXplZEFzQm9vbE51bGxhYmxlID0+CiAgICAgIF9maW5kUnRpRnVuY3Rpb24oJ19hc0Jvb2xOdWxsYWJsZScpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc3BlY2lhbGl6ZWRDaGVja0Jvb2xOdWxsYWJsZSA9PgogICAgICBfZmluZFJ0aUZ1bmN0aW9uKCdfY2hlY2tCb29sTnVsbGFibGUnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHNwZWNpYWxpemVkQXNEb3VibGVOdWxsYWJsZSA9PgogICAgICBfZmluZFJ0aUZ1bmN0aW9uKCdfYXNEb3VibGVOdWxsYWJsZScpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc3BlY2lhbGl6ZWRDaGVja0RvdWJsZU51bGxhYmxlID0+CiAgICAgIF9maW5kUnRpRnVuY3Rpb24oJ19jaGVja0RvdWJsZU51bGxhYmxlJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBzcGVjaWFsaXplZElzSW50ID0+IF9maW5kUnRpRnVuY3Rpb24oJ19pc0ludCcpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc3BlY2lhbGl6ZWRBc0ludE51bGxhYmxlID0+CiAgICAgIF9maW5kUnRpRnVuY3Rpb24oJ19hc0ludE51bGxhYmxlJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBzcGVjaWFsaXplZENoZWNrSW50TnVsbGFibGUgPT4KICAgICAgX2ZpbmRSdGlGdW5jdGlvbignX2NoZWNrSW50TnVsbGFibGUnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHNwZWNpYWxpemVkSXNOdW0gPT4gX2ZpbmRSdGlGdW5jdGlvbignX2lzTnVtJyk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldCBzcGVjaWFsaXplZEFzTnVtTnVsbGFibGUgPT4KICAgICAgX2ZpbmRSdGlGdW5jdGlvbignX2FzTnVtTnVsbGFibGUnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHNwZWNpYWxpemVkQ2hlY2tOdW1OdWxsYWJsZSA9PgogICAgICBfZmluZFJ0aUZ1bmN0aW9uKCdfY2hlY2tOdW1OdWxsYWJsZScpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc3BlY2lhbGl6ZWRJc1N0cmluZyA9PiBfZmluZFJ0aUZ1bmN0aW9uKCdfaXNTdHJpbmcnKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHNwZWNpYWxpemVkQXNTdHJpbmdOdWxsYWJsZSA9PgogICAgICBfZmluZFJ0aUZ1bmN0aW9uKCdfYXNTdHJpbmdOdWxsYWJsZScpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgc3BlY2lhbGl6ZWRDaGVja1N0cmluZ051bGxhYmxlID0+CiAgICAgIF9maW5kUnRpRnVuY3Rpb24oJ19jaGVja1N0cmluZ051bGxhYmxlJyk7CgogIC8vIEZyb20gZGFydDpfaW50ZXJuYWwKCiAgQ2xhc3NFbnRpdHkgX3N5bWJvbEltcGxlbWVudGF0aW9uQ2xhc3M7CiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IHN5bWJvbEltcGxlbWVudGF0aW9uQ2xhc3MgPT4KICAgICAgX3N5bWJvbEltcGxlbWVudGF0aW9uQ2xhc3MgPz89IF9maW5kQ2xhc3MoaW50ZXJuYWxMaWJyYXJ5LCAnU3ltYm9sJyk7CgogIENsYXNzRW50aXR5IF9leHRlcm5hbE5hbWVDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgZXh0ZXJuYWxOYW1lQ2xhc3MgPT4KICAgICAgX2V4dGVybmFsTmFtZUNsYXNzID8/PSBfZmluZENsYXNzKGludGVybmFsTGlicmFyeSwgJ0V4dGVybmFsTmFtZScpOwogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IGV4dGVybmFsTmFtZVR5cGUgPT4gX2dldFJhd1R5cGUoZXh0ZXJuYWxOYW1lQ2xhc3MpOwoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgc3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3IgPT4KICAgICAgX3N5bWJvbFZhbGlkYXRlZENvbnN0cnVjdG9yID8/PQogICAgICAgICAgX2ZpbmRDb25zdHJ1Y3RvcihzeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzLCAndmFsaWRhdGVkJyk7CgogIC8vLyBSZXR1cm5zIHRoZSBmaWVsZCB0aGF0IGhvbGRzIHRoZSBpbnRlcm5hbCBuYW1lIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwogIC8vLyBmb3IgYFN5bWJvbGAuCiAgRmllbGRFbnRpdHkgX3N5bWJvbEltcGxlbWVudGF0aW9uRmllbGQ7CiAgRmllbGRFbnRpdHkgZ2V0IHN5bWJvbEltcGxlbWVudGF0aW9uRmllbGQgPT4gX3N5bWJvbEltcGxlbWVudGF0aW9uRmllbGQgPz89CiAgICAgIF9lbnYubG9va3VwTG9jYWxDbGFzc01lbWJlcihzeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzLCAnX25hbWUnLAogICAgICAgICAgcmVxdWlyZWQ6IHRydWUpOwoKICBDb25zdHJ1Y3RvckVudGl0eSBfc3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3I7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc1N5bWJvbFZhbGlkYXRlZENvbnN0cnVjdG9yKENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChfc3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3IgIT0gbnVsbCkgewogICAgICByZXR1cm4gZWxlbWVudCA9PSBfc3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3I7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLyBGcm9tIGRhcnQ6X25hdGl2ZV90eXBlZF9kYXRhCgogIENsYXNzRW50aXR5IF90eXBlZEFycmF5T2ZJbnRDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgdHlwZWRBcnJheU9mSW50Q2xhc3MgPT4gX3R5cGVkQXJyYXlPZkludENsYXNzID8/PSBfZmluZENsYXNzKAogICAgICBfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5kYXJ0X19uYXRpdmVfdHlwZWRfZGF0YSwgcmVxdWlyZWQ6IHRydWUpLAogICAgICAnTmF0aXZlVHlwZWRBcnJheU9mSW50Jyk7CgogIENsYXNzRW50aXR5IF90eXBlZEFycmF5T2ZEb3VibGVDbGFzczsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgdHlwZWRBcnJheU9mRG91YmxlQ2xhc3MgPT4KICAgICAgX3R5cGVkQXJyYXlPZkRvdWJsZUNsYXNzID8/PSBfZmluZENsYXNzKAogICAgICAgICAgX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMuZGFydF9fbmF0aXZlX3R5cGVkX2RhdGEsIHJlcXVpcmVkOiB0cnVlKSwKICAgICAgICAgICdOYXRpdmVUeXBlZEFycmF5T2ZEb3VibGUnKTsKCiAgLy8gRnJvbSBkYXJ0Ol9qc19lbWJlZGRlZF9uYW1lcwoKICBDbGFzc0VudGl0eSBfanNHZXROYW1lRW51bTsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNHZXROYW1lRW51bSA9PiBfanNHZXROYW1lRW51bSA/Pz0gX2ZpbmRDbGFzcygKICAgICAgX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMuZGFydF9fanNfZW1iZWRkZWRfbmFtZXMsIHJlcXVpcmVkOiB0cnVlKSwKICAgICAgJ0pzR2V0TmFtZScpOwoKICBDbGFzc0VudGl0eSBfanNCdWlsdGluRW51bTsKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQganNCdWlsdGluRW51bSA9PiBfanNCdWlsdGluRW51bSA/Pz0gX2ZpbmRDbGFzcygKICAgICAgX2Vudi5sb29rdXBMaWJyYXJ5KFVyaXMuZGFydF9fanNfZW1iZWRkZWRfbmFtZXMsIHJlcXVpcmVkOiB0cnVlKSwKICAgICAgJ0pzQnVpbHRpbicpOwoKICBib29sIF9tZXRhQW5ub3RhdGlvbkNoZWNrZWQgPSBmYWxzZTsKICBDbGFzc0VudGl0eSBfbWV0YU5vSW5saW5lQ2xhc3M7CiAgQ2xhc3NFbnRpdHkgX21ldGFUcnlJbmxpbmVDbGFzczsKCiAgdm9pZCBfZW5zdXJlTWV0YUFubm90YXRpb25zKCkgewogICAgaWYgKCFfbWV0YUFubm90YXRpb25DaGVja2VkKSB7CiAgICAgIF9tZXRhQW5ub3RhdGlvbkNoZWNrZWQgPSB0cnVlOwogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnkgPSBfZW52Lmxvb2t1cExpYnJhcnkoVXJpcy5wYWNrYWdlX21ldGFfZGFydDJqcyk7CiAgICAgIGlmIChsaWJyYXJ5ICE9IG51bGwpIHsKICAgICAgICBfbWV0YU5vSW5saW5lQ2xhc3MgPSBfZW52Lmxvb2t1cENsYXNzKGxpYnJhcnksICdfTm9JbmxpbmUnKTsKICAgICAgICBfbWV0YVRyeUlubGluZUNsYXNzID0gX2Vudi5sb29rdXBDbGFzcyhsaWJyYXJ5LCAnX1RyeUlubGluZScpOwogICAgICAgIGlmIChfbWV0YU5vSW5saW5lQ2xhc3MgPT0gbnVsbCB8fCBfbWV0YVRyeUlubGluZUNsYXNzID09IG51bGwpIHsKICAgICAgICAgIC8vIFRoaXMgaXMgbm90IHRoZSBwYWNrYWdlIHlvdSdyZSBsb29raW5nIGZvci4KICAgICAgICAgIF9tZXRhTm9JbmxpbmVDbGFzcyA9IG51bGw7CiAgICAgICAgICBfbWV0YVRyeUlubGluZUNsYXNzID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldCBtZXRhTm9JbmxpbmVDbGFzcyB7CiAgICBfZW5zdXJlTWV0YUFubm90YXRpb25zKCk7CiAgICByZXR1cm4gX21ldGFOb0lubGluZUNsYXNzOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0IG1ldGFUcnlJbmxpbmVDbGFzcyB7CiAgICBfZW5zdXJlTWV0YUFubm90YXRpb25zKCk7CiAgICByZXR1cm4gX21ldGFUcnlJbmxpbmVDbGFzczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNGb3JlaWduKE1lbWJlckVudGl0eSBlbGVtZW50KSA9PiBlbGVtZW50LmxpYnJhcnkgPT0gZm9yZWlnbkxpYnJhcnk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNGb3JlaWduSGVscGVyKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBtZW1iZXIubGlicmFyeSA9PSBmb3JlaWduTGlicmFyeSB8fAogICAgICAgIGlzQ3JlYXRlSW52b2NhdGlvbk1pcnJvckhlbHBlcihtZW1iZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0V4dGVybmFsQWxsb3dlZChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgcmV0dXJuIGlzRm9yZWlnbkhlbHBlcihmdW5jdGlvbikgfHwKICAgICAgICAoZnVuY3Rpb24gaXMgQ29uc3RydWN0b3JFbnRpdHkgJiYKICAgICAgICAgICAgZnVuY3Rpb24uaXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3RvcikgfHwKICAgICAgICBtYXliZUVuYWJsZU5hdGl2ZShmdW5jdGlvbi5saWJyYXJ5LmNhbm9uaWNhbFVyaSkgfHwKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyB3aGVuIGltcG9ydGluZyBkYXJ0Om1pcnJvcnMgaXMKICAgICAgICAvLyBhIGNvbXBpbGUtdGltZSBlcnJvci4KICAgICAgICBmdW5jdGlvbi5saWJyYXJ5LmNhbm9uaWNhbFVyaSA9PSBVcmlzLmRhcnRfbWlycm9yczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3JFcUhhbmRsZXNOdWxsQXJndW1lbnQoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgIGFzc2VydChmdW5jdGlvbi5uYW1lID09ICc9PScsCiAgICAgICAgZmFpbGVkQXQoZnVuY3Rpb24sICJVbmV4cGVjdGVkIGZ1bmN0aW9uICRmdW5jdGlvbi4iKSk7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBmdW5jdGlvbi5lbmNsb3NpbmdDbGFzczsKICAgIHJldHVybiBjbHMgPT0gb2JqZWN0Q2xhc3MgfHwKICAgICAgICBjbHMgPT0ganNJbnRlcmNlcHRvckNsYXNzIHx8CiAgICAgICAgY2xzID09IGpzTnVsbENsYXNzOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0RGVmYXVsdFN1cGVyY2xhc3MoCiAgICAgIENsYXNzRW50aXR5IGNscywgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZUJhc2ljRGF0YSkgewogICAgaWYgKG5hdGl2ZUJhc2ljRGF0YS5pc0pzSW50ZXJvcENsYXNzKGNscykpIHsKICAgICAgcmV0dXJuIGpzSmF2YVNjcmlwdE9iamVjdENsYXNzOwogICAgfQogICAgLy8gTmF0aXZlIGNsYXNzZXMgaW5oZXJpdCBmcm9tIEludGVyY2VwdG9yLgogICAgcmV0dXJuIG5hdGl2ZUJhc2ljRGF0YS5pc05hdGl2ZUNsYXNzKGNscykKICAgICAgICA/IGpzSW50ZXJjZXB0b3JDbGFzcwogICAgICAgIDogb2JqZWN0Q2xhc3M7CiAgfQp9CgovLy8gSW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgbGlicmFyaWVzLCBjbGFzc2VzIGFuZCBtZW1iZXJzLgovLy8KLy8vIFRoZSBlbGVtZW50IGVudmlyb25tZW50IG1ha2VzIHByaXZhdGUgYW5kIGluamVjdGVkIG1lbWJlcnMgZGlyZWN0bHkKLy8vIGF2YWlsYWJsZSBhbmQgc2hvdWxkIHRoZXJlZm9yZSBub3QgYmUgdXNlZCB0byBkZXRlcm1pbmUgc2NvcGVzLgovLy8KLy8vIFRoZSBwcm9wZXJ0aWVzIGV4cG9zZWQgYXJlIERhcnQtY2VudHJpYyBhbmQgc2hvdWxkIHRoZXJlZm9yZSwgbG9uZy10ZXJtLCBub3QKLy8vIGJlIHVzZWQgZHVyaW5nIGNvZGVnZW4sIGV4cGVjdCBmb3IgbWlycm9ycy4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3BsaXQgdGhpcyBpbnRvIGFuIGVsZW1lbnQgZW52aXJvbm1lbnQgYW5kIGEgdHlwZSBxdWVyeQovLyBpbnRlcmZhY2UsIHRoZSBmaXJzdCBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyByZXNvbHV0aW9uIGFuZCB0aGUgbGF0dGVyIGluCi8vIGJvdGggcmVzb2x1dGlvbiBhbmQgY29kZWdlbi4KYWJzdHJhY3QgY2xhc3MgRWxlbWVudEVudmlyb25tZW50IHsKICAvLy8gUmV0dXJucyB0aGUgbWFpbiBsaWJyYXJ5IGZvciB0aGUgY29tcGlsYXRpb24uCiAgTGlicmFyeUVudGl0eSBnZXQgbWFpbkxpYnJhcnk7CgogIC8vLyBSZXR1cm5zIHRoZSBtYWluIG1ldGhvZCBmb3IgdGhlIGNvbXBpbGF0aW9uLgogIEZ1bmN0aW9uRW50aXR5IGdldCBtYWluRnVuY3Rpb247CgogIC8vLyBSZXR1cm5zIGFsbCBrbm93biBsaWJyYXJpZXMuCiAgSXRlcmFibGU8TGlicmFyeUVudGl0eT4gZ2V0IGxpYnJhcmllczsKCiAgLy8vIFJldHVybnMgdGhlIGxpYnJhcnkgbmFtZSBvZiBbbGlicmFyeV0gb3IgJycgaWYgdGhlIGxpYnJhcnkgaXMgdW5uYW1lZC4KICBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoTGlicmFyeUVudGl0eSBsaWJyYXJ5KTsKCiAgLy8vIExvb2t1cCB0aGUgbGlicmFyeSB3aXRoIHRoZSBjYW5vbmljYWwgW3VyaV0sIGZhaWwgaWYgdGhlIGxpYnJhcnkgaXMKICAvLy8gbWlzc2luZyBhbmQgW3JlcXVpcmVkXTsKICBMaWJyYXJ5RW50aXR5IGxvb2t1cExpYnJhcnkoVXJpIHVyaSwge2Jvb2wgcmVxdWlyZWQ6IGZhbHNlfSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGV2ZXJ5IGNsYXNzIGRlY2xhcmVkIGluIFtsaWJyYXJ5XS4KICB2b2lkIGZvckVhY2hDbGFzcyhMaWJyYXJ5RW50aXR5IGxpYnJhcnksIHZvaWQgZihDbGFzc0VudGl0eSBjbHMpKTsKCiAgLy8vIExvb2t1cCB0aGUgY2xhc3MgW25hbWVdIGluIFtsaWJyYXJ5XSwgZmFpbCBpZiB0aGUgY2xhc3MgaXMgbWlzc2luZyBhbmQKICAvLy8gW3JlcXVpcmVkXS4KICBDbGFzc0VudGl0eSBsb29rdXBDbGFzcyhMaWJyYXJ5RW50aXR5IGxpYnJhcnksIFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCByZXF1aXJlZDogZmFsc2V9KTsKCiAgLy8vIENhbGxzIFtmXSBmb3IgZXZlcnkgdG9wIGxldmVsIG1lbWJlciBpbiBbbGlicmFyeV0uCiAgdm9pZCBmb3JFYWNoTGlicmFyeU1lbWJlcihMaWJyYXJ5RW50aXR5IGxpYnJhcnksIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSk7CgogIC8vLyBMb29rdXAgdGhlIG1lbWJlciBbbmFtZV0gaW4gW2xpYnJhcnldLCBmYWlsIGlmIHRoZSBjbGFzcyBpcyBtaXNzaW5nIGFuZAogIC8vLyBbcmVxdWlyZWRdLgogIE1lbWJlckVudGl0eSBsb29rdXBMaWJyYXJ5TWVtYmVyKExpYnJhcnlFbnRpdHkgbGlicmFyeSwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2UsIGJvb2wgcmVxdWlyZWQ6IGZhbHNlfSk7CgogIC8vLyBMb29rdXAgdGhlIG1lbWJlciBbbmFtZV0gaW4gW2Nsc10sIGZhaWwgaWYgdGhlIGNsYXNzIGlzIG1pc3NpbmcgYW5kCiAgLy8vIFtyZXF1aXJlZF0uCiAgTWVtYmVyRW50aXR5IGxvb2t1cExvY2FsQ2xhc3NNZW1iZXIoQ2xhc3NFbnRpdHkgY2xzLCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZSwgYm9vbCByZXF1aXJlZDogZmFsc2V9KTsKCiAgLy8vIExvb2t1cCB0aGUgbWVtYmVyIFtuYW1lXSBpbiBbY2xzXSBhbmQgaXRzIHN1cGVyY2xhc3Nlcy4KICAvLy8KICAvLy8gUmV0dXJuIGBudWxsYCBpZiB0aGUgbWVtYmVyIGlzIG5vdCBmb3VuZCBpbiB0aGUgY2xhc3Mgb3IgYW55IHN1cGVyY2xhc3MuCiAgTWVtYmVyRW50aXR5IGxvb2t1cENsYXNzTWVtYmVyKENsYXNzRW50aXR5IGNscywgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICB2YXIgZW50aXR5ID0gbG9va3VwTG9jYWxDbGFzc01lbWJlcihjbHMsIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgcmV0dXJuIGVudGl0eTsKCiAgICB2YXIgc3VwZXJjbGFzcyA9IGdldFN1cGVyQ2xhc3MoY2xzKTsKICAgIGlmIChzdXBlcmNsYXNzID09IG51bGwpIHJldHVybiBudWxsOwoKICAgIHJldHVybiBsb29rdXBDbGFzc01lbWJlcihzdXBlcmNsYXNzLCBuYW1lLCBzZXR0ZXI6IHNldHRlcik7CiAgfQoKICAvLy8gTG9va3VwIHRoZSBjb25zdHJ1Y3RvciBbbmFtZV0gaW4gW2Nsc10sIGZhaWwgaWYgdGhlIGNsYXNzIGlzIG1pc3NpbmcgYW5kCiAgLy8vIFtyZXF1aXJlZF0uCiAgQ29uc3RydWN0b3JFbnRpdHkgbG9va3VwQ29uc3RydWN0b3IoQ2xhc3NFbnRpdHkgY2xzLCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgcmVxdWlyZWQ6IGZhbHNlfSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggY2xhc3MgbWVtYmVyIGRlY2xhcmVkIGluIFtjbHNdLgogIHZvaWQgZm9yRWFjaExvY2FsQ2xhc3NNZW1iZXIoQ2xhc3NFbnRpdHkgY2xzLCB2b2lkIGYoTWVtYmVyRW50aXR5IG1lbWJlcikpOwoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGNsYXNzIG1lbWJlciBkZWNsYXJlZCBvciBpbmhlcml0ZWQgaW4gW2Nsc10gdG9nZXRoZXIKICAvLy8gd2l0aCB0aGUgY2xhc3MgdGhhdCBkZWNsYXJlZCB0aGUgbWVtYmVyLgogIC8vLwogIC8vLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIHNob3VsZCBub3QgaW5jbHVkZSBzdGF0aWMgbWVtYmVycyBvZgogIC8vLyBzdXBlcmNsYXNzZXMuCiAgdm9pZCBmb3JFYWNoQ2xhc3NNZW1iZXIoCiAgICAgIENsYXNzRW50aXR5IGNscywgdm9pZCBmKENsYXNzRW50aXR5IGRlY2xhcmVyLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGV2ZXJ5IGNvbnN0cnVjdG9yIGRlY2xhcmVkIGluIFtjbHNdLgogIC8vLwogIC8vLyBXaWxsIGVuc3VyZSB0aGF0IHRoZSBjbGFzcyBhbmQgYWxsIGNvbnN0cnVjdG9ycyBhcmUgcmVzb2x2ZWQgaWYKICAvLy8gW2Vuc3VyZVJlc29sdmVkXSBpcyBgdHJ1ZWAuCiAgdm9pZCBmb3JFYWNoQ29uc3RydWN0b3IoCiAgICAgIENsYXNzRW50aXR5IGNscywgdm9pZCBmKENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yKSk7CgogIC8vLyBSZXR1cm5zIHRoZSBzdXBlcmNsYXNzIG9mIFtjbHNdLgogIC8vLwogIC8vLyBJZiBbc2tpcFVubmFtZWRNaXhpbkFwcGxpY2F0aW9uc10gaXMgYHRydWVgLCB1bm5hbWVkIG1peGluIGFwcGxpY2F0aW9ucwogIC8vLyBhcmUgZXhjbHVkZWQsIGZvciBpbnN0YW5jZSBmb3IgdGhlc2UgY2xhc3NlcwogIC8vLwogIC8vLyAgICAgY2xhc3MgUyB7fQogIC8vLyAgICAgY2xhc3MgTSB7fQogIC8vLyAgICAgY2xhc3MgQyBleHRlbmRzIFMgd2l0aCBNIHt9CiAgLy8vCiAgLy8vIHRoZSByZXN1bHQgb2YgYGdldFN1cGVyQ2xhc3MoQylgIGlzIHRoZSB1bm5hbWVkIG1peGluIGFwcGxpY2F0aW9uCiAgLy8vIHR5cGljYWxseSBuYW1lZCBgUytNYCBhbmQgYGdldFN1cGVyQ2xhc3MoUytNKWAgaXMgYFNgLCB3aGVyZWFzCiAgLy8vIHRoZSByZXN1bHQgb2YgYGdldFN1cGVyQ2xhc3MoQywgc2tpcFVubmFtZWRNaXhpbkFwcGxpY2F0aW9uczogZmFsc2UpYCBpcwogIC8vLyBgU2AuCiAgQ2xhc3NFbnRpdHkgZ2V0U3VwZXJDbGFzcyhDbGFzc0VudGl0eSBjbHMsCiAgICAgIHtib29sIHNraXBVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbnM6IGZhbHNlfSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggc3VwZXJ0eXBlIG9mIFtjbHNdLgogIHZvaWQgZm9yRWFjaFN1cGVydHlwZShDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSkpOwoKICAvLy8gQ3JlYXRlIHRoZSBpbnN0YW50aWF0aW9uIG9mIFtjbHNdIHdpdGggdGhlIGdpdmVuIFt0eXBlQXJndW1lbnRzXS4KICBJbnRlcmZhY2VUeXBlIGNyZWF0ZUludGVyZmFjZVR5cGUoCiAgICAgIENsYXNzRW50aXR5IGNscywgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyk7CgogIC8vLyBSZXR1cm5zIHRoZSBgZHluYW1pY2AgdHlwZS4KICBEYXJ0VHlwZSBnZXQgZHluYW1pY1R5cGU7CgogIC8vLyBSZXR1cm5zIHRoZSAncmF3IHR5cGUnIG9mIFtjbHNdLiBUaGF0IGlzLCB0aGUgaW5zdGFudGlhdGlvbiBvZiBbY2xzXQogIC8vLyB3aGVyZSBhbGwgdHlwZXMgYXJndW1lbnRzIGFyZSBgZHluYW1pY2AuCiAgSW50ZXJmYWNlVHlwZSBnZXRSYXdUeXBlKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSAndGhpcyB0eXBlJyBvZiBbY2xzXS4gVGhhdCBpcywgdGhlIGluc3RhbnRpYXRpb24gb2YgW2Nsc10KICAvLy8gd2hlcmUgdGhlIHR5cGUgYXJndW1lbnRzIGFyZSB0aGUgdHlwZSB2YXJpYWJsZXMgb2YgW2Nsc10uCiAgSW50ZXJmYWNlVHlwZSBnZXRUaGlzVHlwZShDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2Nsc10gaXMgZ2VuZXJpYy4KICBib29sIGlzR2VuZXJpY0NsYXNzKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBpcyBhIG1peGluIGFwcGxpY2F0aW9uIChuYW1lZCBvciB1bm5hbWVkKS4KICBib29sIGlzTWl4aW5BcHBsaWNhdGlvbihDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2Nsc10gaXMgYW4gdW5uYW1lZCBtaXhpbiBhcHBsaWNhdGlvbi4KICBib29sIGlzVW5uYW1lZE1peGluQXBwbGljYXRpb24oQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFRoZSB1cHBlciBib3VuZCBvbiB0aGUgW3R5cGVWYXJpYWJsZV0uIElmIG5vdCBleHBsaWNpdGx5IGRlY2xhcmVkLCB0aGlzIGlzCiAgLy8vIGBPYmplY3RgLgogIERhcnRUeXBlIGdldFR5cGVWYXJpYWJsZUJvdW5kKFR5cGVWYXJpYWJsZUVudGl0eSB0eXBlVmFyaWFibGUpOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiBbZnVuY3Rpb25dLgogIEZ1bmN0aW9uVHlwZSBnZXRGdW5jdGlvblR5cGUoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pOwoKICAvLy8gUmV0dXJucyB0aGUgZnVuY3Rpb24gdHlwZSB2YXJpYWJsZXMgZGVmaW5lZCBvbiBbZnVuY3Rpb25dLgogIExpc3Q8VHlwZVZhcmlhYmxlVHlwZT4gZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIFtsb2NhbF0gZnVuY3Rpb24uCiAgRnVuY3Rpb25UeXBlIGdldExvY2FsRnVuY3Rpb25UeXBlKExvY2FsIGxvY2FsKTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgW2ZpZWxkXS4KICBEYXJ0VHlwZSBnZXRGaWVsZFR5cGUoRmllbGRFbnRpdHkgZmllbGQpOwoKICAvLy8gUmV0dXJucyB0aGUgJ3VuYWxpYXNlZCcgdHlwZSBvZiBbdHlwZV0uIEZvciB0eXBlZGVmcyB0aGlzIGlzIHRoZSBmdW5jdGlvbgogIC8vLyB0eXBlIGl0IGlzIGFuIGFsaWFzIG9mLCBmb3Igb3RoZXIgdHlwZXMgaXQgaXMgdGhlIHR5cGUgaXRzZWxmLgogIC8vLwogIC8vLyBVc2UgdGhpcyBkdXJpbmcgcmVzb2x1dGlvbiB0byBlbnN1cmUgdGhhdCB0aGUgYWxpYXMgaGFzIGJlZW4gY29tcHV0ZWQuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiB0aGUgcmVzb2x2ZXIgaXMgcmVtb3ZlZC4KICBEYXJ0VHlwZSBnZXRVbmFsaWFzZWRUeXBlKERhcnRUeXBlIHR5cGUpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2Nsc10gaXMgYSBEYXJ0IGVudW0gY2xhc3MuCiAgYm9vbCBpc0VudW1DbGFzcyhDbGFzc0VudGl0eSBjbHMpOwp9CgphYnN0cmFjdCBjbGFzcyBLRWxlbWVudEVudmlyb25tZW50IGV4dGVuZHMgRWxlbWVudEVudmlyb25tZW50IHsKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGNsYXNzIHRoYXQgaXMgbWl4ZWQgaW50byBbY2xzXSBvciBvbmUgb2YgaXRzCiAgLy8vIHN1cGVyY2xhc3Nlcy4KICB2b2lkIGZvckVhY2hNaXhpbihDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihDbGFzc0VudGl0eSBtaXhpbikpOwoKICAvLy8gR2V0cyB0aGUgY29uc3RhbnQgdmFsdWUgb2YgW2ZpZWxkXSwgb3IgYG51bGxgIGlmIFtmaWVsZF0gaXMgbm9uLWNvbnN0LgogIENvbnN0YW50RXhwcmVzc2lvbiBnZXRGaWVsZENvbnN0YW50Rm9yVGVzdGluZyhGaWVsZEVudGl0eSBmaWVsZCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbWVtYmVyXSBhIHRoZSBzeW50aGV0aWMgZ2V0dGVyIGBsb2FkTGlicmFyeWAgaW5qZWN0ZWQKICAvLy8gb24gZGVmZXJyZWQgbGlicmFyaWVzLgogIGJvb2wgaXNEZWZlcnJlZExvYWRMaWJyYXJ5R2V0dGVyKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICAvLy8gUmV0dXJucyB0aGUgaW1wb3J0cyBzZWVuIGluIFtsaWJyYXJ5XQogIEl0ZXJhYmxlPEltcG9ydEVudGl0eT4gZ2V0SW1wb3J0cyhMaWJyYXJ5RW50aXR5IGxpYnJhcnkpOwoKICAvLy8gUmV0dXJucyB0aGUgbWV0YWRhdGEgY29uc3RhbnRzIGRlY2xhcmVkIG9uIFtsaWJyYXJ5XS4KICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBnZXRMaWJyYXJ5TWV0YWRhdGEoTGlicmFyeUVudGl0eSBsaWJyYXJ5KTsKCiAgLy8vIFJldHVybnMgdGhlIG1ldGFkYXRhIGNvbnN0YW50cyBkZWNsYXJlZCBvbiBbY2xzXS4KICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBnZXRDbGFzc01ldGFkYXRhKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSBtZXRhZGF0YSBjb25zdGFudHMgZGVjbGFyZWQgb24gW21lbWJlcl0uCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gZ2V0TWVtYmVyTWV0YWRhdGEoTWVtYmVyRW50aXR5IG1lbWJlciwKICAgICAge2Jvb2wgaW5jbHVkZVBhcmFtZXRlck1ldGFkYXRhOiBmYWxzZX0pOwp9CgphYnN0cmFjdCBjbGFzcyBKRWxlbWVudEVudmlyb25tZW50IGV4dGVuZHMgRWxlbWVudEVudmlyb25tZW50IHsKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGNsYXNzIG1lbWJlciBhZGRlZCB0byBbY2xzXSBkdXJpbmcgY29tcGlsYXRpb24uCiAgdm9pZCBmb3JFYWNoSW5qZWN0ZWRDbGFzc01lbWJlcihDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGV2ZXJ5IGNvbnN0cnVjdG9yIGJvZHkgaW4gW2Nsc10uCiAgdm9pZCBmb3JFYWNoQ29uc3RydWN0b3JCb2R5KAogICAgICBDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihDb25zdHJ1Y3RvckJvZHlFbnRpdHkgY29uc3RydWN0b3JCb2R5KSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggbmVzdGVkIGNsb3N1cmUgaW4gW21lbWJlcl0uCiAgdm9pZCBmb3JFYWNoTmVzdGVkQ2xvc3VyZSgKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwgdm9pZCBmKEZ1bmN0aW9uRW50aXR5IGNsb3N1cmUpKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtjbHNdIGlzIGEgbWl4aW4gYXBwbGljYXRpb24gdGhhdCBtaXhlcyBpbiBtZXRob2RzIHdpdGgKICAvLy8gc3VwZXIgY2FsbHMuCiAgYm9vbCBpc1N1cGVyTWl4aW5BcHBsaWNhdGlvbihDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyB0aGUgJ2VmZmVjdGl2ZScgbWl4aW4gY2xhc3MgaWYgW2Nsc10gaXMgYSBtaXhpbiBhcHBsaWNhdGlvbiwgYW5kCiAgLy8vIGBudWxsYCBvdGhlcndpc2UuCiAgLy8vCiAgLy8vIFRoZSAnZWZmZWN0aXZlJyBtaXhpbiBjbGFzcyBpcyB0aGUgY2xhc3MgZnJvbSB3aGljaCBtZW1iZXJzIGFyZSBtaXhlZCBpbi4KICAvLy8gTm9ybWFsbHkgdGhpcyBpcyB0aGUgbWl4aW4gY2xhc3MgaXRzZWxmLCBidXQgbm90IGlmIHRoZSBtaXhpbiBjbGFzcyBpdHNlbGYKICAvLy8gaXMgYSBtaXhpbiBhcHBsaWNhdGlvbi4KICAvLy8KICAvLy8gQ29uc2lkZXIgdGhpcyBoaWVyYXJjaHk6CiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHt9CiAgLy8vICAgICBjbGFzcyBCID0gT2JqZWN0IHdpdGggQSB7fQogIC8vLyAgICAgY2xhc3MgQyA9IE9iamVjdCB3aXRoIEIge30KICAvLy8KICAvLy8gVGhlIG1peGluIGNsYXNzZXMgb2YgYEJgIGFuZCBgQ2AgYXJlIGBBYCBhbmQgYEJgLCByZXNwZWN0aXZlbHksIGJ1dCB0aGUKICAvLy8gX2VmZmVjdGl2ZV8gbWl4aW4gY2xhc3Mgb2YgYm90aCBpcyBgQWAuCiAgQ2xhc3NFbnRpdHkgZ2V0RWZmZWN0aXZlTWl4aW5DbGFzcyhDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gVGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgW3R5cGVWYXJpYWJsZV0uCiAgLy8vCiAgLy8vIFRoaXMgaXMgdGhlIHR5cGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB0eXBlIGFyZ3VtZW50IHdoZW4gbm8gZXhwbGljaXQgdHlwZQogIC8vLyBhcmd1bWVudCBpcyBwYXNzZWQuCiAgRGFydFR5cGUgZ2V0VHlwZVZhcmlhYmxlRGVmYXVsdFR5cGUoVHlwZVZhcmlhYmxlRW50aXR5IHR5cGVWYXJpYWJsZSk7CgogIC8vLyBSZXR1cm5zIHRoZSAnZWxlbWVudCcgdHlwZSBvZiBhIGZ1bmN0aW9uIHdpdGggdGhlIGFzeW5jLCBhc3luYyogb3Igc3luYyoKICAvLy8gbWFya2VyIFttYXJrZXJdLiBbcmV0dXJuVHlwZV0gaXMgdGhlIHJldHVybiB0eXBlIG1hcmtlZCBmdW5jdGlvbi4KICBEYXJ0VHlwZSBnZXRBc3luY09yU3luY1N0YXJFbGVtZW50VHlwZSgKICAgICAgQXN5bmNNYXJrZXIgbWFya2VyLCBEYXJ0VHlwZSByZXR1cm5UeXBlKTsKCiAgLy8vIFJldHVybnMgdGhlICdlbGVtZW50JyB0eXBlIG9mIGEgZnVuY3Rpb24gd2l0aCBhbiBhc3luYywgYXN5bmMqIG9yIHN5bmMqCiAgLy8vIG1hcmtlci4gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgaXMgaW5zcGVjdGVkIHRvIGRldGVybWluZSB0aGUgdHlwZQogIC8vLyBwYXJhbWV0ZXIgb2YgdGhlIEZ1dHVyZSwgU3RyZWFtIG9yIEl0ZXJhYmxlLgogIERhcnRUeXBlIGdldEZ1bmN0aW9uQXN5bmNPclN5bmNTdGFyRWxlbWVudFR5cGUoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pOwoKICAvLy8gQ2FsbHMgW2ZdIHdpdGggZXZlcnkgaW5zdGFuY2UgZmllbGQsIHRvZ2V0aGVyIHdpdGggaXRzIGRlY2xhcmVyLCBpbiBhbgogIC8vLyBpbnN0YW5jZSBvZiBbY2xzXS4gQWxsIGZpZWxkcyBpbmhlcml0ZWQgZnJvbSBzdXBlcmNsYXNzZXMgYW5kIG1peGlucyBhcmUKICAvLy8gaW5jbHVkZWQuCiAgLy8vCiAgLy8vIElmIFtpc0VsaWRlZF0gaXMgYHRydWVgLCB0aGUgZmllbGQgaXMgbm90IHJlYWQgYW5kIHNob3VsZCB0aGVyZWZvcmUgbm90CiAgLy8vIGJlIGVtaXR0ZWQuCiAgdm9pZCBmb3JFYWNoSW5zdGFuY2VGaWVsZCgKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCB2b2lkIGYoQ2xhc3NFbnRpdHkgZGVjbGFyZXIsIEZpZWxkRW50aXR5IGZpZWxkKSk7CgogIC8vLyBDYWxscyBbZl0gd2l0aCBldmVyeSBpbnN0YW5jZSBmaWVsZCBkZWNsYXJlZCBkaXJlY3RseSBpbiBjbGFzcyBbY2xzXQogIC8vLyAoaS5lLiBubyBpbmhlcml0ZWQgZmllbGRzKS4gRmllbGRzIGFyZSBwcmVzZW50ZWQgaW4gaW5pdGlhbGl6YXRpb24KICAvLy8gKGkuZS4gdGV4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bWVudEVudmlyb25tZW50LCBLRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJ2NvbXBpbGVyLmRhcnQnIHNob3cgQ29tcGlsZXI7CmltcG9ydCAnY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIENvbnN0YW50VmFsdWUsCiAgICAgICAgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlLAogICAgICAgIFR5cGVDb25zdGFudFZhbHVlLAogICAgICAgIERlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZSwKICAgICAgICBJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZTsKaW1wb3J0ICdlbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICdrZXJuZWwva2VsZW1lbnRzLmRhcnQnIHNob3cgS0xvY2FsRnVuY3Rpb247CmltcG9ydCAnc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJ29wdGlvbnMuZGFydCc7CmltcG9ydCAndW5pdmVyc2UvdXNlLmRhcnQnOwppbXBvcnQgJ3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0JwogICAgc2hvdyBJbXBhY3RVc2VDYXNlLCBXb3JsZEltcGFjdCwgV29ybGRJbXBhY3RWaXNpdG9ySW1wbDsKaW1wb3J0ICd1dGlsL3V0aWwuZGFydCcgc2hvdyBtYWtlVW5pcXVlOwppbXBvcnQgJ3dvcmxkLmRhcnQnIHNob3cgS0Nsb3NlZFdvcmxkOwoKLy8vIEEgImh1bmsiIG9mIHRoZSBwcm9ncmFtIHRoYXQgd2lsbCBiZSBsb2FkZWQgd2hlbmV2ZXIgb25lIG9mIGl0cyBbaW1wb3J0c10KLy8vIGFyZSBsb2FkZWQuCi8vLwovLy8gRWxlbWVudHMgdGhhdCBhcmUgb25seSB1c2VkIGluIG9uZSBkZWZlcnJlZCBpbXBvcnQsIGlzIGluIGFuIE91dHB1dFVuaXQgd2l0aAovLy8gdGhlIGRlZmVycmVkIGltcG9ydCBhcyBzaW5nbGUgZWxlbWVudCBpbiB0aGUgW2ltcG9ydHNdIHNldC4KLy8vCi8vLyBXaGVuZXZlciBhIGRlZmVycmVkIEVsZW1lbnQgaXMgc2hhcmVkIGJldHdlZW4gc2V2ZXJhbCBkZWZlcnJlZCBpbXBvcnRzIGl0IGlzCi8vLyBpbiBhbiBvdXRwdXQgdW5pdCB3aXRoIHRob3NlIGltcG9ydHMgaW4gdGhlIFtpbXBvcnRzXSBTZXQuCi8vLwovLy8gV2UgbmV2ZXIgY3JlYXRlIHR3byBPdXRwdXRVbml0cyBzaGFyaW5nIHRoZSBzYW1lIHNldCBvZiBbaW1wb3J0c10uCmNsYXNzIE91dHB1dFVuaXQgaW1wbGVtZW50cyBDb21wYXJhYmxlPE91dHB1dFVuaXQ+IHsKICAvLy8gYHRydWVgIGlmIHRoaXMgb3V0cHV0IHVuaXQgaXMgZm9yIHRoZSBtYWluIG91dHB1dCBmaWxlLgogIGZpbmFsIGJvb2wgaXNNYWluT3V0cHV0OwoKICAvLy8gQSB1bmlxdWUgbmFtZSByZXByZXNlbnRpbmcgdGhpcyBbT3V0cHV0VW5pdF0uCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8vLyBUaGUgZGVmZXJyZWQgaW1wb3J0cyB0aGF0IHVzZSB0aGUgZWxlbWVudHMgaW4gdGhpcyBvdXRwdXQgdW5pdC4KICBmaW5hbCBTZXQ8SW1wb3J0RW50aXR5PiBfaW1wb3J0czsKCiAgT3V0cHV0VW5pdCh0aGlzLmlzTWFpbk91dHB1dCwgdGhpcy5uYW1lLCB0aGlzLl9pbXBvcnRzKTsKCiAgQG92ZXJyaWRlCiAgaW50IGNvbXBhcmVUbyhPdXRwdXRVbml0IG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIDA7CiAgICBpZiAoaXNNYWluT3V0cHV0ICYmICFvdGhlci5pc01haW5PdXRwdXQpIHJldHVybiAtMTsKICAgIGlmICghaXNNYWluT3V0cHV0ICYmIG90aGVyLmlzTWFpbk91dHB1dCkgcmV0dXJuIDE7CiAgICB2YXIgc2l6ZSA9IF9pbXBvcnRzLmxlbmd0aDsKICAgIHZhciBvdGhlclNpemUgPSBvdGhlci5faW1wb3J0cy5sZW5ndGg7CiAgICBpZiAoc2l6ZSAhPSBvdGhlclNpemUpIHJldHVybiBzaXplLmNvbXBhcmVUbyhvdGhlclNpemUpOwogICAgdmFyIGltcG9ydHMgPSBfaW1wb3J0cy50b0xpc3QoKTsKICAgIHZhciBvdGhlckltcG9ydHMgPSBvdGhlci5faW1wb3J0cy50b0xpc3QoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgIGlmIChpbXBvcnRzW2ldID09IG90aGVySW1wb3J0c1tpXSkgY29udGludWU7CiAgICAgIHZhciBhID0gaW1wb3J0c1tpXS51cmkucGF0aDsKICAgICAgdmFyIGIgPSBvdGhlckltcG9ydHNbaV0udXJpLnBhdGg7CiAgICAgIHZhciBjbXAgPSBhLmNvbXBhcmVUbyhiKTsKICAgICAgaWYgKGNtcCAhPSAwKSByZXR1cm4gY21wOwogICAgfQogICAgLy8gVE9ETyhzaWdtdW5kKTogbWFrZSBjb21wYXJlIHN0YWJsZS4gIElmIHdlIGhpdCB0aGlzIHBvaW50LCBhbGwgaW1wb3J0ZWQKICAgIC8vIGxpYnJhcmllcyBhcmUgdGhlIHNhbWUsIGhvd2V2ZXIgW3RoaXNdIGFuZCBbb3RoZXJdIHVzZSBkaWZmZXJlbnQgZGVmZXJyZWQKICAgIC8vIGltcG9ydHMgaW4gdGhlIHByb2dyYW0uIFdlIGNhbiBtYWtlIHRoaXMgc3RhYmxlIGlmIHdlIHNvcnQgYmFzZWQgb24gdGhlCiAgICAvLyBkZWZlcnJlZCBpbXBvcnRzIHRoZW1zZWx2ZXMgKGUuZy4gdGhlaXIgZGVjbGFyYXRpb24gbG9jYXRpb24pLgogICAgcmV0dXJuIG5hbWUuY29tcGFyZVRvKG90aGVyLm5hbWUpOwogIH0KCiAgU2V0PEltcG9ydEVudGl0eT4gZ2V0IGltcG9ydHNGb3JUZXN0aW5nID0+IF9pbXBvcnRzOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiT3V0cHV0VW5pdCgkbmFtZSwgJF9pbXBvcnRzKSI7Cn0KCi8vLyBGb3IgZWFjaCBkZWZlcnJlZCBpbXBvcnQsIGZpbmQgZWxlbWVudHMgYW5kIGNvbnN0YW50cyB0byBiZSBsb2FkZWQgd2hlbiB0aGF0Ci8vLyBpbXBvcnQgaXMgbG9hZGVkLiBFbGVtZW50cyB0aGF0IGFyZSB1c2VkIGJ5IHNldmVyYWwgZGVmZXJyZWQgaW1wb3J0cyBhcmUgaW4KLy8vIHNoYXJlZCBPdXRwdXRVbml0cy4KYWJzdHJhY3QgY2xhc3MgRGVmZXJyZWRMb2FkVGFzayBleHRlbmRzIENvbXBpbGVyVGFzayB7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICdEZWZlcnJlZCBMb2FkaW5nJzsKCiAgLy8vIFRoZSBPdXRwdXRVbml0IHRoYXQgd2lsbCBiZSBsb2FkZWQgd2hlbiB0aGUgcHJvZ3JhbSBzdGFydHMuCiAgT3V0cHV0VW5pdCBfbWFpbk91dHB1dFVuaXQ7CgogIC8vLyBBIHNldCBjb250YWluaW5nIChldmVudHVhbGx5KSBhbGwgb3V0cHV0IHVuaXRzIHRoYXQgd2lsbCByZXN1bHQgZnJvbSB0aGUKICAvLy8gcHJvZ3JhbS4KICBmaW5hbCBMaXN0PE91dHB1dFVuaXQ+IF9hbGxPdXRwdXRVbml0cyA9IG5ldyBMaXN0PE91dHB1dFVuaXQ+KCk7CgogIC8vLyBXaWxsIGJlIGB0cnVlYCBpZiB0aGUgcHJvZ3JhbSBjb250YWlucyBkZWZlcnJlZCBsaWJyYXJpZXMuCiAgYm9vbCBpc1Byb2dyYW1TcGxpdCA9IGZhbHNlOwoKICBzdGF0aWMgY29uc3QgSW1wYWN0VXNlQ2FzZSBJTVBBQ1RfVVNFID0gY29uc3QgSW1wYWN0VXNlQ2FzZSgnRGVmZXJyZWQgbG9hZCcpOwoKICAvLy8gQSBjYWNoZSBvZiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYGNvbXB1dGVJbXBvcnREZWZlck5hbWVgIG9uIHRoZSBrZXlzIG9mCiAgLy8vIHRoaXMgbWFwLgogIGZpbmFsIE1hcDxJbXBvcnRFbnRpdHksIFN0cmluZz4gX2ltcG9ydERlZmVyTmFtZSA9IDxJbXBvcnRFbnRpdHksIFN0cmluZz57fTsKCiAgLy8vIEEgbWFwcGluZyBmcm9tIGNsYXNzZXMgdG8gdGhlaXIgaW1wb3J0IHNldC4KICBNYXA8Q2xhc3NFbnRpdHksIEltcG9ydFNldD4gX2NsYXNzVG9TZXQgPSBuZXcgTWFwPENsYXNzRW50aXR5LCBJbXBvcnRTZXQ+KCk7CgogIC8vLyBBIG1hcHBpbmcgZnJvbSBtZW1iZXJzIHRvIHRoZWlyIGltcG9ydCBzZXQuCiAgTWFwPE1lbWJlckVudGl0eSwgSW1wb3J0U2V0PiBfbWVtYmVyVG9TZXQgPQogICAgICBuZXcgTWFwPE1lbWJlckVudGl0eSwgSW1wb3J0U2V0PigpOwoKICAvLy8gQSBtYXBwaW5nIGZyb20gbG9jYWwgZnVuY3Rpb25zIHRvIHRoZWlyIGltcG9ydCBzZXQuCiAgTWFwPExvY2FsLCBJbXBvcnRTZXQ+IF9sb2NhbEZ1bmN0aW9uVG9TZXQgPSBuZXcgTWFwPExvY2FsLCBJbXBvcnRTZXQ+KCk7CgogIC8vLyBBIG1hcHBpbmcgZnJvbSBjb25zdGFudHMgdG8gdGhlaXIgaW1wb3J0IHNldC4KICBNYXA8Q29uc3RhbnRWYWx1ZSwgSW1wb3J0U2V0PiBfY29uc3RhbnRUb1NldCA9CiAgICAgIG5ldyBNYXA8Q29uc3RhbnRWYWx1ZSwgSW1wb3J0U2V0PigpOwoKICBJdGVyYWJsZTxJbXBvcnRFbnRpdHk+IGdldCBfYWxsRGVmZXJyZWRJbXBvcnRzID0+CiAgICAgIF9kZWZlcnJlZEltcG9ydERlc2NyaXB0aW9ucy5rZXlzOwoKICAvLy8gQmVjYXVzZSB0aGUgdG9rZW4tc3RyZWFtIGlzIGZvcmdvdHRlbiBsYXRlciBpbiB0aGUgcHJvZ3JhbSwgd2UgY2FjaGUgYQogIC8vLyBkZXNjcmlwdGlvbiBvZiBlYWNoIGRlZmVycmVkIGltcG9ydC4KICBmaW5hbCBNYXA8SW1wb3J0RW50aXR5LCBJbXBvcnREZXNjcmlwdGlvbj4gX2RlZmVycmVkSW1wb3J0RGVzY3JpcHRpb25zID0KICAgICAgPEltcG9ydEVudGl0eSwgSW1wb3J0RGVzY3JpcHRpb24+e307CgogIC8vLyBBIGxhdHRpY2UgdG8gY29tcGFjdGx5IHJlcHJlc2VudCBtdWx0aXBsZSBzdWJzZXRzIG9mIGltcG9ydHMuCiAgZmluYWwgSW1wb3J0U2V0TGF0dGljZSBpbXBvcnRTZXRzID0gbmV3IEltcG9ydFNldExhdHRpY2UoKTsKCiAgZmluYWwgQ29tcGlsZXIgY29tcGlsZXI7CgogIGJvb2wgZ2V0IGRpc2FibGVQcm9ncmFtU3BsaXQgPT4gY29tcGlsZXIub3B0aW9ucy5kaXNhYmxlUHJvZ3JhbVNwbGl0OwogIGJvb2wgZ2V0IG5ld0RlZmVycmVkU3BsaXQgPT4gY29tcGlsZXIub3B0aW9ucy5uZXdEZWZlcnJlZFNwbGl0OwogIGJvb2wgZ2V0IHJlcG9ydEludmFsaWRJbmZlcnJlZERlZmVycmVkVHlwZXMgPT4KICAgICAgY29tcGlsZXIub3B0aW9ucy5yZXBvcnRJbnZhbGlkSW5mZXJyZWREZWZlcnJlZFR5cGVzOwoKICBEZWZlcnJlZExvYWRUYXNrKHRoaXMuY29tcGlsZXIpIDogc3VwZXIoY29tcGlsZXIubWVhc3VyZXIpIHsKICAgIF9tYWluT3V0cHV0VW5pdCA9IG5ldyBPdXRwdXRVbml0KHRydWUsICdtYWluJywgbmV3IFNldDxJbXBvcnRFbnRpdHk+KCkpOwogICAgaW1wb3J0U2V0cy5tYWluU2V0LnVuaXQgPSBfbWFpbk91dHB1dFVuaXQ7CiAgICBfYWxsT3V0cHV0VW5pdHMuYWRkKF9tYWluT3V0cHV0VW5pdCk7CiAgfQoKICBLRWxlbWVudEVudmlyb25tZW50IGdldCBlbGVtZW50RW52aXJvbm1lbnQgPT4KICAgICAgY29tcGlsZXIuZnJvbnRlbmRTdHJhdGVneS5lbGVtZW50RW52aXJvbm1lbnQ7CgogIENvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50cyA9PiBjb21waWxlci5mcm9udGVuZFN0cmF0ZWd5LmNvbW1vbkVsZW1lbnRzOwoKICBEaWFnbm9zdGljUmVwb3J0ZXIgZ2V0IHJlcG9ydGVyID0+IGNvbXBpbGVyLnJlcG9ydGVyOwoKICAvLy8gR2l2ZW4gW2ltcG9ydHNdIHRoYXQgcmVmZXIgdG8gYW4gZWxlbWVudCBmcm9tIGEgbGlicmFyeSwgZGV0ZXJtaW5lIHdoZXRoZXIKICAvLy8gdGhlIGVsZW1lbnQgaXMgZXhwbGljaXRseSBkZWZlcnJlZC4KICBzdGF0aWMgYm9vbCBfaXNFeHBsaWNpdGx5RGVmZXJyZWQoSXRlcmFibGU8SW1wb3J0RW50aXR5PiBpbXBvcnRzKSB7CiAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBub3QgaW1wb3J0ZWQgZXhwbGljaXRseSwgaXQgaXMgaW1wbGljaXRseSBpbXBvcnRlZAogICAgLy8gbm90IGRlZmVycmVkLgogICAgaWYgKGltcG9ydHMuaXNFbXB0eSkgcmV0dXJuIGZhbHNlOwogICAgLy8gQW4gZWxlbWVudCBjb3VsZCBwb3RlbnRpYWxseSBiZSBsb2FkZWQgYnkgc2V2ZXJhbCBpbXBvcnRzLiBJZiBhbGwgb2YgdGhlbQogICAgLy8gaXMgZXhwbGljaXRseSBkZWZlcnJlZCwgd2Ugc2F5IHRoZSBlbGVtZW50IGlzIGV4cGxpY2l0bHkgZGVmZXJyZWQuCiAgICAvLyBUT0RPKHNpZ3VyZG0pOiBXZSBtaWdodCB3YW50IHRvIGdpdmUgYSB3YXJuaW5nIGlmIHRoZSBpbXBvcnRzIGRvIG5vdAogICAgLy8gYWdyZWUuCiAgICByZXR1cm4gaW1wb3J0cy5ldmVyeSgoSW1wb3J0RW50aXR5IGltcG9ydCkgPT4gaW1wb3J0LmlzRGVmZXJyZWQpOwogIH0KCiAgLy8vIFJldHVybnMgZXZlcnkgW0ltcG9ydEVudGl0eV0gdGhhdCBpbXBvcnRzIFtlbGVtZW50XSBpbnRvIFtsaWJyYXJ5XS4KICBJdGVyYWJsZTxJbXBvcnRFbnRpdHk+IGNsYXNzSW1wb3J0c1RvKAogICAgICBDbGFzc0VudGl0eSBlbGVtZW50LCBMaWJyYXJ5RW50aXR5IGxpYnJhcnkpOwoKICAvLy8gUmV0dXJucyBldmVyeSBbSW1wb3J0RW50aXR5XSB0aGF0IGltcG9ydHMgW2VsZW1lbnRdIGludG8gW2xpYnJhcnldLgogIEl0ZXJhYmxlPEltcG9ydEVudGl0eT4gbWVtYmVySW1wb3J0c1RvKAogICAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCwgTGlicmFyeUVudGl0eSBsaWJyYXJ5KTsKCiAgLy8vIFJldHVybnMgZXZlcnkgW0ltcG9ydEVudGl0eV0gdGhhdCBpbXBvcnRzIFtlbGVtZW50XSBpbnRvIFtsaWJyYXJ5XS4KICBJdGVyYWJsZTxJbXBvcnRFbnRpdHk+IHR5cGVkZWZJbXBvcnRzVG8oCiAgICAgIFR5cGVkZWZFbnRpdHkgZWxlbWVudCwgTGlicmFyeUVudGl0eSBsaWJyYXJ5KTsKCiAgLy8vIENvbGxlY3RzIGFsbCBkaXJlY3QgZGVwZW5kZW5jaWVzIG9mIFtlbGVtZW50XS4KICAvLy8KICAvLy8gVGhlIGNvbGxlY3RlZCBkZXBlbmRlbnQgZWxlbWVudHMgYW5kIGNvbnN0YW50cyBhcmUgYXJlIGFkZGVkIHRvCiAgLy8vIFtlbGVtZW50c10gYW5kIFtjb25zdGFudHNdIHJlc3BlY3RpdmVseS4KICB2b2lkIF9jb2xsZWN0RGlyZWN0TWVtYmVyRGVwZW5kZW5jaWVzKEtDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgTWVtYmVyRW50aXR5IGVsZW1lbnQsIERlcGVuZGVuY2llcyBkZXBlbmRlbmNpZXMpIHsKICAgIC8vIFRPRE8oc2lndXJkbSk6IFdlIHdhbnQgdG8gYmUgbW9yZSBzcGVjaWZpYyBhYm91dCB0aGlzIC0gbmVlZCBhIGJldHRlcgogICAgLy8gd2F5IHRvIHF1ZXJ5ICJsaXZlbmVzcyIuCiAgICBpZiAoIWNvbXBpbGVyLnJlc29sdXRpb25Xb3JsZEJ1aWxkZXIuaXNNZW1iZXJVc2VkKGVsZW1lbnQpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIF9jb2xsZWN0RGVwZW5kZW5jaWVzRnJvbUltcGFjdChjbG9zZWRXb3JsZCwgZWxlbWVudCwgZGVwZW5kZW5jaWVzKTsKICAgIGNvbGxlY3RDb25zdGFudHNJbkJvZHkoZWxlbWVudCwgZGVwZW5kZW5jaWVzKTsKICB9CgogIC8vLyBGaW5kcyBhbGwgZWxlbWVudHMgYW5kIGNvbnN0YW50cyB0aGF0IFtlbGVtZW50XSBkZXBlbmRzIGRpcmVjdGx5IG9uLgogIC8vLyAobm90IHRoZSB0cmFuc2l0aXZlIGNsb3N1cmUuKQogIC8vLwogIC8vLyBBZGRzIHRoZSByZXN1bHRzIHRvIFtlbGVtZW50c10gYW5kIFtjb25zdGFudHNdLgogIHZvaWQgX2NvbGxlY3RBbGxFbGVtZW50c0FuZENvbnN0YW50c1Jlc29sdmVkRnJvbUNsYXNzKAogICAgICBLQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIENsYXNzRW50aXR5IGVsZW1lbnQsCiAgICAgIERlcGVuZGVuY2llcyBkZXBlbmRlbmNpZXMpIHsKICAgIC8vIElmIHdlIHNlZSBhIGNsYXNzLCBhZGQgZXZlcnl0aGluZyBpdHMgbGl2ZSBpbnN0YW5jZSBtZW1iZXJzIHJlZmVyCiAgICAvLyB0by4gIFN0YXRpYyBtZW1iZXJzIGFyZSBub3QgcmVsZXZhbnQsIHVubGVzcyB3ZSBhcmUgcHJvY2Vzc2luZwogICAgLy8gZXh0cmEgZGVwZW5kZW5jaWVzIGR1ZSB0byBtaXJyb3JzLgogICAgdm9pZCBhZGRMaXZlSW5zdGFuY2VNZW1iZXIoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICBpZiAoIWNvbXBpbGVyLnJlc29sdXRpb25Xb3JsZEJ1aWxkZXIuaXNNZW1iZXJVc2VkKG1lbWJlcikpIHJldHVybjsKICAgICAgaWYgKCFtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgcmV0dXJuOwogICAgICBkZXBlbmRlbmNpZXMuYWRkTWVtYmVyKG1lbWJlcik7CiAgICAgIF9jb2xsZWN0RGlyZWN0TWVtYmVyRGVwZW5kZW5jaWVzKGNsb3NlZFdvcmxkLCBtZW1iZXIsIGRlcGVuZGVuY2llcyk7CiAgICB9CgogICAgQ2xhc3NFbnRpdHkgY2xzID0gZWxlbWVudDsKICAgIGVsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoTG9jYWxDbGFzc01lbWJlcihjbHMsIGFkZExpdmVJbnN0YW5jZU1lbWJlcik7CiAgICBlbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaFN1cGVydHlwZShjbHMsIChJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgICAgX2NvbGxlY3RUeXBlRGVwZW5kZW5jaWVzKHR5cGUsIGRlcGVuZGVuY2llcyk7CiAgICB9KTsKICAgIGRlcGVuZGVuY2llcy5hZGRDbGFzcyhjbHMpOwogIH0KCiAgLy8vIEZpbmRzIGFsbCBlbGVtZW50cyBhbmQgY29uc3RhbnRzIHRoYXQgW2VsZW1lbnRdIGRlcGVuZHMgZGlyZWN0bHkgb24uCiAgLy8vIChub3QgdGhlIHRyYW5zaXRpdmUgY2xvc3VyZS4pCiAgLy8vCiAgLy8vIEFkZHMgdGhlIHJlc3VsdHMgdG8gW2VsZW1lbnRzXSBhbmQgW2NvbnN0YW50c10uCiAgdm9pZCBfY29sbGVjdEFsbEVsZW1lbnRzQW5kQ29uc3RhbnRzUmVzb2x2ZWRGcm9tTWVtYmVyKAogICAgICBLQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIE1lbWJlckVudGl0eSBlbGVtZW50LAogICAgICBEZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzKSB7CiAgICBpZiAoZWxlbWVudCBpcyBGdW5jdGlvbkVudGl0eSkgewogICAgICBfY29sbGVjdFR5cGVEZXBlbmRlbmNpZXMoCiAgICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKGVsZW1lbnQpLCBkZXBlbmRlbmNpZXMpOwogICAgfQogICAgaWYgKGVsZW1lbnQuaXNTdGF0aWMgfHwgZWxlbWVudC5pc1RvcExldmVsIHx8IGVsZW1lbnQuaXNDb25zdHJ1Y3RvcikgewogICAgICBkZXBlbmRlbmNpZXMuYWRkTWVtYmVyKGVsZW1lbnQpOwogICAgICBfY29sbGVjdERpcmVjdE1lbWJlckRlcGVuZGVuY2llcyhjbG9zZWRXb3JsZCwgZWxlbWVudCwgZGVwZW5kZW5jaWVzKTsKICAgIH0KICAgIGlmIChlbGVtZW50IGlzIENvbnN0cnVjdG9yRW50aXR5ICYmIGVsZW1lbnQuaXNHZW5lcmF0aXZlQ29uc3RydWN0b3IpIHsKICAgICAgLy8gV2hlbiBpbnN0YW50aWF0aW5nIGEgY2xhc3MsIHdlIHJlY29yZCBhIHJlZmVyZW5jZSB0byB0aGUKICAgICAgLy8gY29uc3RydWN0b3IsIG5vdCB0aGUgY2xhc3MgaXRzZWxmLiAgV2UgbXVzdCBhZGQgYWxsIHRoZQogICAgICAvLyBpbnN0YW5jZSBtZW1iZXJzIG9mIHRoZSBjb25zdHJ1Y3RvcidzIGNsYXNzLgogICAgICBDbGFzc0VudGl0eSBjbHMgPSBlbGVtZW50LmVuY2xvc2luZ0NsYXNzOwogICAgICBfY29sbGVjdEFsbEVsZW1lbnRzQW5kQ29uc3RhbnRzUmVzb2x2ZWRGcm9tQ2xhc3MoCiAgICAgICAgICBjbG9zZWRXb3JsZCwgY2xzLCBkZXBlbmRlbmNpZXMpOwogICAgfQoKICAgIC8vIE90aGVyIGVsZW1lbnRzLCBpbiBwYXJ0aWN1bGFyIGluc3RhbmNlIG1lbWJlcnMsIGFyZSBpZ25vcmVkIGFzCiAgICAvLyB0aGV5IGFyZSBwcm9jZXNzZWQgYXMgcGFydCBvZiB0aGUgY2xhc3MuCiAgfQoKICAvLy8gRXh0cmFjdCB0aGUgc2V0IG9mIGNvbnN0YW50cyB0aGF0IGFyZSB1c2VkIGluIGFubm90YXRpb25zIG9mIFtlbGVtZW50XS4KICAvLy8KICAvLy8gSWYgdGhlIHVuZGVybHlpbmcgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBtaXJyb3JzLCB0aGVuIG5vIGNvbnN0YW50cyBhcmUKICAvLy8gYWRkZWQuCiAgdm9pZCBjb2xsZWN0Q29uc3RhbnRzRnJvbU1ldGFkYXRhKAogICAgICBFbnRpdHkgZWxlbWVudCwgU2V0PENvbnN0YW50VmFsdWU+IGNvbnN0YW50cyk7CgogIC8vLyBFeHRyYWN0IHRoZSBzZXQgb2YgY29uc3RhbnRzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGJvZHkgb2YgW2VsZW1lbnRdLgogIHZvaWQgY29sbGVjdENvbnN0YW50c0luQm9keShNZW1iZXJFbnRpdHkgZWxlbWVudCwgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcyk7CgogIC8vLyBSZWN1cnNpdmVseSBjb2xsZWN0cyBhbGwgdGhlIGRlcGVuZGVuY2llcyBvZiBbdHlwZV0uCiAgdm9pZCBfY29sbGVjdFR5cGVEZXBlbmRlbmNpZXMoRGFydFR5cGUgdHlwZSwgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcywKICAgICAgW0ltcG9ydEVudGl0eSBpbXBvcnRdKSB7CiAgICBuZXcgVHlwZURlcGVuZGVuY3lWaXNpdG9yKGRlcGVuZGVuY2llcywgaW1wb3J0LCBjb21tb25FbGVtZW50cykudmlzaXQodHlwZSk7CiAgfQoKICB2b2lkIF9jb2xsZWN0VHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzKAogICAgICBJdGVyYWJsZTxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcywKICAgICAgW0ltcG9ydEVudGl0eSBpbXBvcnRdKSB7CiAgICBpZiAodHlwZUFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm47CiAgICBuZXcgVHlwZURlcGVuZGVuY3lWaXNpdG9yKGRlcGVuZGVuY2llcywgaW1wb3J0LCBjb21tb25FbGVtZW50cykKICAgICAgICAudmlzaXRMaXN0KHR5cGVBcmd1bWVudHMpOwogIH0KCiAgLy8vIEV4dHJhY3QgYW55IGRlcGVuZGVuY2llcyB0aGF0IGFyZSBrbm93biBmcm9tIHRoZSBpbXBhY3Qgb2YgW2VsZW1lbnRdLgogIHZvaWQgX2NvbGxlY3REZXBlbmRlbmNpZXNGcm9tSW1wYWN0KEtDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgTWVtYmVyRW50aXR5IGVsZW1lbnQsIERlcGVuZGVuY2llcyBkZXBlbmRlbmNpZXMpIHsKICAgIFdvcmxkSW1wYWN0IHdvcmxkSW1wYWN0ID0gY29tcGlsZXIuaW1wYWN0Q2FjaGVbZWxlbWVudF07CiAgICBjb21waWxlci5pbXBhY3RTdHJhdGVneS52aXNpdEltcGFjdCgKICAgICAgICBlbGVtZW50LAogICAgICAgIHdvcmxkSW1wYWN0LAogICAgICAgIG5ldyBXb3JsZEltcGFjdFZpc2l0b3JJbXBsKAogICAgICAgICAgICB2aXNpdFN0YXRpY1VzZTogKE1lbWJlckVudGl0eSBtZW1iZXIsIFN0YXRpY1VzZSBzdGF0aWNVc2UpIHsKICAgICAgICAgIEVudGl0eSB1c2VkRW50aXR5ID0gc3RhdGljVXNlLmVsZW1lbnQ7CiAgICAgICAgICBpZiAodXNlZEVudGl0eSBpcyBNZW1iZXJFbnRpdHkpIHsKICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZE1lbWJlcih1c2VkRW50aXR5LCBzdGF0aWNVc2UuZGVmZXJyZWRJbXBvcnQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXNzZXJ0KHVzZWRFbnRpdHkgaXMgS0xvY2FsRnVuY3Rpb24sCiAgICAgICAgICAgICAgICBmYWlsZWRBdCh1c2VkRW50aXR5LCAiVW5leHBlY3RlZCBzdGF0aWMgdXNlICRzdGF0aWNVc2UuIikpOwogICAgICAgICAgICBLTG9jYWxGdW5jdGlvbiBsb2NhbEZ1bmN0aW9uID0gdXNlZEVudGl0eTsKICAgICAgICAgICAgLy8gVE9ETyhzcmEpOiBDb25zdWx0IEtDbG9zZWRXb3JsZCB0byBzZWUgaWYgc2lnbmF0dXJlIGlzIG5lZWRlZC4KICAgICAgICAgICAgX2NvbGxlY3RUeXBlRGVwZW5kZW5jaWVzKGxvY2FsRnVuY3Rpb24uZnVuY3Rpb25UeXBlLCBkZXBlbmRlbmNpZXMpOwogICAgICAgICAgICBkZXBlbmRlbmNpZXMubG9jYWxGdW5jdGlvbnMuYWRkKGxvY2FsRnVuY3Rpb24pOwogICAgICAgICAgfQogICAgICAgICAgc3dpdGNoIChzdGF0aWNVc2Uua2luZCkgewogICAgICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuQ09OU1RSVUNUT1JfSU5WT0tFOgogICAgICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuQ09OU1RfQ09OU1RSVUNUT1JfSU5WT0tFOgogICAgICAgICAgICAgIC8vIFRoZSByZWNlaXZlciB0eXBlIG9mIGdlbmVyYXRpdmUgY29uc3RydWN0b3JzIGlzIGEgZGVwZW5kZW5jeSBvZgogICAgICAgICAgICAgIC8vIHRoZSBjb25zdHJ1Y3RvciAoaGFuZGxlZCBieSBgYWRkTWVtYmVyYCBhYm92ZSkgYW5kIG5vdCBhCiAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jeSBhdCB0aGUgY2FsbCBzaXRlLgogICAgICAgICAgICAgIC8vIEZhY3RvcnkgbWV0aG9kcywgb24gdGhlIG90aGVyIGhhbmQsIGFyZSBsaWtlIHN0YXRpYyBtZXRob2RzIHNvCiAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCB0eXBlIGlzIG5vdCByZWxldmFudC4KICAgICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgcnRpIG5lZWQgZGF0YSB0byBza2lwIHVubmVlZGVkIHR5cGUKICAgICAgICAgICAgICAvLyBhcmd1bWVudHMuCiAgICAgICAgICAgICAgX2NvbGxlY3RUeXBlQXJndW1lbnREZXBlbmRlbmNpZXMoCiAgICAgICAgICAgICAgICAgIHN0YXRpY1VzZS50eXBlLnR5cGVBcmd1bWVudHMsIGRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVEFUSUNfSU5WT0tFOgogICAgICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuQ0xPU1VSRV9DQUxMOgogICAgICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuRElSRUNUX0lOVk9LRToKICAgICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgcnRpIG5lZWQgZGF0YSB0byBza2lwIHVubmVlZGVkIHR5cGUKICAgICAgICAgICAgICAvLyBhcmd1bWVudHMuCiAgICAgICAgICAgICAgX2NvbGxlY3RUeXBlQXJndW1lbnREZXBlbmRlbmNpZXMoCiAgICAgICAgICAgICAgICAgIHN0YXRpY1VzZS50eXBlQXJndW1lbnRzLCBkZXBlbmRlbmNpZXMpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgfQogICAgICAgIH0sIHZpc2l0VHlwZVVzZTogKE1lbWJlckVudGl0eSBtZW1iZXIsIFR5cGVVc2UgdHlwZVVzZSkgewogICAgICAgICAgRGFydFR5cGUgdHlwZSA9IHR5cGVVc2UudHlwZTsKICAgICAgICAgIHN3aXRjaCAodHlwZVVzZS5raW5kKSB7CiAgICAgICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuVFlQRV9MSVRFUkFMOgogICAgICAgICAgICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgICAgICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2UgPSB0eXBlOwogICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZENsYXNzKAogICAgICAgICAgICAgICAgICAgIGludGVyZmFjZS5lbGVtZW50LCB0eXBlVXNlLmRlZmVycmVkSW1wb3J0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuQ09OU1RfSU5TVEFOVElBVElPTjoKICAgICAgICAgICAgICBfY29sbGVjdFR5cGVEZXBlbmRlbmNpZXMoCiAgICAgICAgICAgICAgICAgIHR5cGUsIGRlcGVuZGVuY2llcywgdHlwZVVzZS5kZWZlcnJlZEltcG9ydCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuSU5TVEFOVElBVElPTjoKICAgICAgICAgICAgY2FzZSBUeXBlVXNlS2luZC5OQVRJVkVfSU5TVEFOVElBVElPTjoKICAgICAgICAgICAgY2FzZSBUeXBlVXNlS2luZC5JU19DSEVDSzoKICAgICAgICAgICAgY2FzZSBUeXBlVXNlS2luZC5DQVRDSF9UWVBFOgogICAgICAgICAgICAgIF9jb2xsZWN0VHlwZURlcGVuZGVuY2llcyh0eXBlLCBkZXBlbmRlbmNpZXMpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFR5cGVVc2VLaW5kLkFTX0NBU1Q6CiAgICAgICAgICAgICAgaWYgKGNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YQogICAgICAgICAgICAgICAgICAuZ2V0RXhwbGljaXRDYXN0Q2hlY2tQb2xpY3koZWxlbWVudCkKICAgICAgICAgICAgICAgICAgLmlzRW1pdHRlZCkgewogICAgICAgICAgICAgICAgX2NvbGxlY3RUeXBlRGVwZW5kZW5jaWVzKHR5cGUsIGRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFR5cGVVc2VLaW5kLklNUExJQ0lUX0NBU1Q6CiAgICAgICAgICAgICAgaWYgKGNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YQogICAgICAgICAgICAgICAgICAuZ2V0SW1wbGljaXREb3duY2FzdENoZWNrUG9saWN5KGVsZW1lbnQpCiAgICAgICAgICAgICAgICAgIC5pc0VtaXR0ZWQpIHsKICAgICAgICAgICAgICAgIF9jb2xsZWN0VHlwZURlcGVuZGVuY2llcyh0eXBlLCBkZXBlbmRlbmNpZXMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBUeXBlVXNlS2luZC5QQVJBTUVURVJfQ0hFQ0s6CiAgICAgICAgICAgICAgaWYgKGNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YQogICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyQ2hlY2tQb2xpY3koZWxlbWVudCkKICAgICAgICAgICAgICAgICAgLmlzRW1pdHRlZCkgewogICAgICAgICAgICAgICAgX2NvbGxlY3RUeXBlRGVwZW5kZW5jaWVzKHR5cGUsIGRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFR5cGVVc2VLaW5kLlJUSV9WQUxVRToKICAgICAgICAgICAgY2FzZSBUeXBlVXNlS2luZC5UWVBFX0FSR1VNRU5UOgogICAgICAgICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICJVbmV4cGVjdGVkIHR5cGUgdXNlOiAkdHlwZVVzZS4iKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9LCB2aXNpdER5bmFtaWNVc2U6IChNZW1iZXJFbnRpdHkgbWVtYmVyLCBEeW5hbWljVXNlIGR5bmFtaWNVc2UpIHsKICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSBydGkgbmVlZCBkYXRhIHRvIHNraXAgdW5uZWVkZWQgdHlwZQogICAgICAgICAgLy8gYXJndW1lbnRzLgogICAgICAgICAgX2NvbGxlY3RUeXBlQXJndW1lbnREZXBlbmRlbmNpZXMoCiAgICAgICAgICAgICAgZHluYW1pY1VzZS50eXBlQXJndW1lbnRzLCBkZXBlbmRlbmNpZXMpOwogICAgICAgIH0pLAogICAgICAgIERlZmVycmVkTG9hZFRhc2suSU1QQUNUX1VTRSk7CiAgfQoKICAvLy8gVXBkYXRlIHRoZSBpbXBvcnQgc2V0IG9mIGFsbCBjb25zdGFudHMgcmVhY2hhYmxlIGZyb20gW2NvbnN0YW50XSwgYXMgbG9uZwogIC8vLyBhcyB0aGV5IGhhZCB0aGUgW29sZFNldF0uIEFzIHNvb24gYXMgd2Ugc2VlIGEgY29uc3RhbnQgd2l0aCBhIGRpZmZlcmVudAogIC8vLyBpbXBvcnQgc2V0LCB3ZSBzdG9wIGFuZCBlbnF1ZXVlIGEgbmV3IHJlY3Vyc2l2ZSB1cGRhdGUgaW4gW3F1ZXVlXS4KICAvLy8KICAvLy8gSW52YXJpYW50czogb2xkU2V0IGlzIGVpdGhlciBudWxsIG9yIGEgc3Vic2V0IG9mIG5ld1NldC4KICB2b2lkIF91cGRhdGVDb25zdGFudFJlY3Vyc2l2ZSgKICAgICAgS0Nsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50LAogICAgICBJbXBvcnRTZXQgb2xkU2V0LAogICAgICBJbXBvcnRTZXQgbmV3U2V0LAogICAgICBXb3JrUXVldWUgcXVldWUpIHsKICAgIGlmIChjb25zdGFudCA9PSBudWxsKSByZXR1cm47CiAgICB2YXIgY3VycmVudFNldCA9IF9jb25zdGFudFRvU2V0W2NvbnN0YW50XTsKCiAgICAvLyBBbHJlYWR5IHZpc2l0ZWQuCiAgICBpZiAoY3VycmVudFNldCA9PSBuZXdTZXQpIHJldHVybjsKCiAgICAvLyBFbGVtZW50cyBpbiB0aGUgbWFpbiBvdXRwdXQgdW5pdCBhbHdheXMgcmVtYWluIHRoZXJlLgogICAgaWYgKGN1cnJlbnRTZXQgPT0gaW1wb3J0U2V0cy5tYWluU2V0KSByZXR1cm47CgogICAgaWYgKGN1cnJlbnRTZXQgPT0gb2xkU2V0KSB7CiAgICAgIF9jb25zdGFudFRvU2V0W2NvbnN0YW50XSA9IG5ld1NldDsKICAgICAgaWYgKGNvbnN0YW50IGlzIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSkgewogICAgICAgIENsYXNzRW50aXR5IGNscyA9IGNvbnN0YW50LnR5cGUuZWxlbWVudDsKICAgICAgICBfdXBkYXRlQ2xhc3NSZWN1cnNpdmUoY2xvc2VkV29ybGQsIGNscywgb2xkU2V0LCBuZXdTZXQsIHF1ZXVlKTsKICAgICAgfQogICAgICBpZiAoY29uc3RhbnQgaXMgSW5zdGFudGlhdGlvbkNvbnN0YW50VmFsdWUpIHsKICAgICAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gY29uc3RhbnQudHlwZUFyZ3VtZW50cykgewogICAgICAgICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgICBfdXBkYXRlQ2xhc3NSZWN1cnNpdmUoCiAgICAgICAgICAgICAgICBjbG9zZWRXb3JsZCwgdHlwZS5lbGVtZW50LCBvbGRTZXQsIG5ld1NldCwgcXVldWUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdGFudC5nZXREZXBlbmRlbmNpZXMoKS5mb3JFYWNoKChDb25zdGFudFZhbHVlIGRlcGVuZGVuY3kpIHsKICAgICAgICAvLyBDb25zdGFudHMgYXJlIG5vdCBhbGxvd2VkIHRvIHJlZmVyIHRvIGRlZmVycmVkIGNvbnN0YW50cywgc28KICAgICAgICAvLyBubyBuZWVkIHRvIGNoZWNrIGZvciBhIGRlZmVycmVkIHR5cGUgbGl0ZXJhbCBoZXJlLgogICAgICAgIF91cGRhdGVDb25zdGFudFJlY3Vyc2l2ZSgKICAgICAgICAgICAgY2xvc2VkV29ybGQsIGRlcGVuZGVuY3ksIG9sZFNldCwgbmV3U2V0LCBxdWV1ZSk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KAogICAgICAgICAgLy8gSW52YXJpYW50OiB3ZSBtdXN0IG1hcmsgbWFpbiBiZWZvcmUgd2UgbWFyayBhbnkgZGVmZXJyZWQgaW1wb3J0LgogICAgICAgICAgbmV3U2V0ICE9IGltcG9ydFNldHMubWFpblNldCB8fCBvbGRTZXQgIT0gbnVsbCwKICAgICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICAgIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICAgICAiVHJpZWQgdG8gYXNzaWduICR7Y29uc3RhbnQudG9EYXJ0VGV4dCgpfSB0byB0aGUgbWFpbiBvdXRwdXQgIgogICAgICAgICAgICAgICJ1bml0LCBidXQgaXQgd2FzIGFzc2lnbmVkIHRvICRjdXJyZW50U2V0LiIpKTsKICAgICAgcXVldWUuYWRkQ29uc3RhbnQoY29uc3RhbnQsIG5ld1NldCk7CiAgICB9CiAgfQoKICB2b2lkIF91cGRhdGVDbGFzc1JlY3Vyc2l2ZShLQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIENsYXNzRW50aXR5IGVsZW1lbnQsCiAgICAgIEltcG9ydFNldCBvbGRTZXQsIEltcG9ydFNldCBuZXdTZXQsIFdvcmtRdWV1ZSBxdWV1ZSkgewogICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuOwoKICAgIEltcG9ydFNldCBjdXJyZW50U2V0ID0gX2NsYXNzVG9TZXRbZWxlbWVudF07CgogICAgLy8gQWxyZWFkeSB2aXNpdGVkLiBXZSBtYXkgdmlzaXQgc29tZSByb290IG5vZGVzIGEgc2Vjb25kIHRpbWUgd2l0aAogICAgLy8gW2lzTWlycm9yVXNhZ2VdIGluIG9yZGVyIHRvIG1hcmsgc3RhdGljIG1lbWJlcnMgdXNlZCByZWZsZWN0aXZlbHkuCiAgICBpZiAoY3VycmVudFNldCA9PSBuZXdTZXQpIHJldHVybjsKCiAgICAvLyBFbGVtZW50cyBpbiB0aGUgbWFpbiBvdXRwdXQgdW5pdCBhbHdheXMgcmVtYWluIHRoZXJlLgogICAgaWYgKGN1cnJlbnRTZXQgPT0gaW1wb3J0U2V0cy5tYWluU2V0KSByZXR1cm47CgogICAgaWYgKGN1cnJlbnRTZXQgPT0gb2xkU2V0KSB7CiAgICAgIC8vIENvbnRpbnVlIHJlY3Vyc2l2ZWx5IHVwZGF0aW5nIGZyb20gW29sZFNldF0gdG8gW25ld1NldF0uCiAgICAgIF9jbGFzc1RvU2V0W2VsZW1lbnRdID0gbmV3U2V0OwoKICAgICAgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcyA9IG5ldyBEZXBlbmRlbmNpZXMoKTsKICAgICAgX2NvbGxlY3RBbGxFbGVtZW50c0FuZENvbnN0YW50c1Jlc29sdmVkRnJvbUNsYXNzKAogICAgICAgICAgY2xvc2VkV29ybGQsIGVsZW1lbnQsIGRlcGVuZGVuY2llcyk7CiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSA9IGVsZW1lbnQubGlicmFyeTsKICAgICAgX3Byb2Nlc3NEZXBlbmRlbmNpZXMoCiAgICAgICAgICBjbG9zZWRXb3JsZCwgbGlicmFyeSwgZGVwZW5kZW5jaWVzLCBvbGRTZXQsIG5ld1NldCwgcXVldWUsIGVsZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgcXVldWUuYWRkQ2xhc3MoZWxlbWVudCwgbmV3U2V0KTsKICAgIH0KICB9CgogIHZvaWQgX3VwZGF0ZU1lbWJlclJlY3Vyc2l2ZShLQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIE1lbWJlckVudGl0eSBlbGVtZW50LAogICAgICBJbXBvcnRTZXQgb2xkU2V0LCBJbXBvcnRTZXQgbmV3U2V0LCBXb3JrUXVldWUgcXVldWUpIHsKICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybjsKCiAgICBJbXBvcnRTZXQgY3VycmVudFNldCA9IF9tZW1iZXJUb1NldFtlbGVtZW50XTsKCiAgICAvLyBBbHJlYWR5IHZpc2l0ZWQuIFdlIG1heSB2aXNpdCBzb21lIHJvb3Qgbm9kZXMgYSBzZWNvbmQgdGltZSB3aXRoCiAgICAvLyBbaXNNaXJyb3JVc2FnZV0gaW4gb3JkZXIgdG8gbWFyayBzdGF0aWMgbWVtYmVycyB1c2VkIHJlZmxlY3RpdmVseS4KICAgIGlmIChjdXJyZW50U2V0ID09IG5ld1NldCkgcmV0dXJuOwoKICAgIC8vIEVsZW1lbnRzIGluIHRoZSBtYWluIG91dHB1dCB1bml0IGFsd2F5cyByZW1haW4gdGhlcmUuCiAgICBpZiAoY3VycmVudFNldCA9PSBpbXBvcnRTZXRzLm1haW5TZXQpIHJldHVybjsKCiAgICBpZiAoY3VycmVudFNldCA9PSBvbGRTZXQpIHsKICAgICAgLy8gQ29udGludWUgcmVjdXJzaXZlbHkgdXBkYXRpbmcgZnJvbSBbb2xkU2V0XSB0byBbbmV3U2V0XS4KICAgICAgX21lbWJlclRvU2V0W2VsZW1lbnRdID0gbmV3U2V0OwoKICAgICAgRGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcyA9IG5ldyBEZXBlbmRlbmNpZXMoKTsKICAgICAgX2NvbGxlY3RBbGxFbGVtZW50c0FuZENvbnN0YW50c1Jlc29sdmVkRnJvbU1lbWJlcigKICAgICAgICAgIGNsb3NlZFdvcmxkLCBlbGVtZW50LCBkZXBlbmRlbmNpZXMpOwoKICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5ID0gZWxlbWVudC5saWJyYXJ5OwogICAgICBfcHJvY2Vzc0RlcGVuZGVuY2llcygKICAgICAgICAgIGNsb3NlZFdvcmxkLCBsaWJyYXJ5LCBkZXBlbmRlbmNpZXMsIG9sZFNldCwgbmV3U2V0LCBxdWV1ZSwgZWxlbWVudCk7CiAgICB9IGVsc2UgewogICAgICBxdWV1ZS5hZGRNZW1iZXIoZWxlbWVudCwgbmV3U2V0KTsKICAgIH0KICB9CgogIHZvaWQgX3VwZGF0ZUxvY2FsRnVuY3Rpb24oCiAgICAgIExvY2FsIGxvY2FsRnVuY3Rpb24sIEltcG9ydFNldCBvbGRTZXQsIEltcG9ydFNldCBuZXdTZXQpIHsKICAgIEltcG9ydFNldCBjdXJyZW50U2V0ID0gX2xvY2FsRnVuY3Rpb25Ub1NldFtsb2NhbEZ1bmN0aW9uXTsKICAgIGlmIChjdXJyZW50U2V0ID09IG5ld1NldCkgcmV0dXJuOwoKICAgIC8vIEVsZW1lbnRzIGluIHRoZSBtYWluIG91dHB1dCB1bml0IGFsd2F5cyByZW1haW4gdGhlcmUuCiAgICBpZiAoY3VycmVudFNldCA9PSBpbXBvcnRTZXRzLm1haW5TZXQpIHJldHVybjsKCiAgICBpZiAoY3VycmVudFNldCA9PSBvbGRTZXQpIHsKICAgICAgX2xvY2FsRnVuY3Rpb25Ub1NldFtsb2NhbEZ1bmN0aW9uXSA9IG5ld1NldDsKICAgIH0gZWxzZSB7CiAgICAgIF9sb2NhbEZ1bmN0aW9uVG9TZXRbbG9jYWxGdW5jdGlvbl0gPSBpbXBvcnRTZXRzLnVuaW9uKGN1cnJlbnRTZXQsIG5ld1NldCk7CiAgICB9CiAgICAvLyBOb3RlOiBsb2NhbCBmdW5jdGlvbnMgYXJlIG5vdCB1cGRhdGVkIHJlY3Vyc2l2ZWx5IGJlY2F1c2UgdGhlCiAgICAvLyBkZXBlbmRlbmNpZXMgYXJlIGFscmVhZHkgdmlzaXRlZCBhcyBkZXBlbmRlbmNpZXMgb2YgdGhlIGVuY2xvc2luZyBtZW1iZXIuCiAgfQoKICAvLy8gV2hldGhlciB0byBlbnF1ZXVlIGEgZGVmZXJyZWQgZGVwZW5kZW5jeS4KICAvLy8KICAvLy8gRHVlIHRvIHRoZSBuYXR1cmUgb2YgdGhlIGFsZ29yaXRobSwgc29tZSBkZXBlbmRlbmNpZXMgbWF5IGJlIHZpc2l0ZWQgbW9yZQogIC8vLyB0aGFuIG9uY2UuIEhvd2V2ZXIsIHdlIGtub3cgdGhhdCBuZXcgZGVmZXJyZWQtaW1wb3J0cyBhcmUgb25seSBkaXNjb3ZlcmVkCiAgLy8vIHdoZW4gd2UgYXJlIHZpc2l0aW5nIHRoZSBtYWluIG91dHB1dCB1bml0IChzaXplID09IDApIG9yIGNvZGUgcmVhY2hhYmxlCiAgLy8vIGZyb20gYSBkZWZlcnJlZCBpbXBvcnQgKHNpemUgPT0gMSkuIEFmdGVyIHRoYXQsIHdlIGFyZSByZWRpc2NvdmVyaW5nIHRoZQogIC8vLyBzYW1lIG5vZGVzIHdlIGhhdmUgYWxyZWFkeSBzZWVuLgogIF9zaG91bGRBZGREZWZlcnJlZERlcGVuZGVuY3koSW1wb3J0U2V0IG5ld1NldCkgPT4gbmV3U2V0Lmxlbmd0aCA8PSAxOwoKICB2b2lkIF9maXhEZXBlbmRlbmN5SW5mbyhEZXBlbmRlbmN5SW5mbyBpbmZvLCBMaXN0PEltcG9ydEVudGl0eT4gaW1wb3J0cywKICAgICAgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUsIFNwYW5uYWJsZSBjb250ZXh0KSB7CiAgICB2YXIgaXNEZWZlcnJlZCA9IF9pc0V4cGxpY2l0bHlEZWZlcnJlZChpbXBvcnRzKTsKICAgIGlmIChpc0RlZmVycmVkKSB7CiAgICAgIGlmICghbmV3RGVmZXJyZWRTcGxpdCkgewogICAgICAgIGluZm8uaXNEZWZlcnJlZCA9IHRydWU7CiAgICAgICAgaW5mby5pbXBvcnRzID0gaW1wb3J0czsKICAgICAgfQogICAgICBpZiAocmVwb3J0SW52YWxpZEluZmVycmVkRGVmZXJyZWRUeXBlcykgewogICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZShjb250ZXh0LCBNZXNzYWdlS2luZC5HRU5FUklDLCB7CiAgICAgICAgICAndGV4dCc6ICIkcHJlZml4ICckbmFtZScgaXMgZGVmZXJyZWQgYnV0IGFwcGVhcnMgdG8gYmUgaW5mZXJyZWQgYXMiCiAgICAgICAgICAgICAgIiBhIHJldHVybiB0eXBlIG9yIGEgdHlwZSBwYXJhbWV0ZXIgKGRhcnRidWcuY29tLzM1MzExKS4iCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFRoZSBmb2xsb3dpbmcgMyBtZXRob2RzIGFyZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIG5ldyBkZWZlcnJlZCBzcGxpdAogIC8vIGFsZ29yaXRobSBhbmQgdGhlIG9sZCBvbmUgbWF0Y2guIEJlY2F1c2Ugb2YgYSBzb3VuZG5lc3MgYnVnIGluIHRoZSBvbGQKICAvLyBhbGdvcml0aG0gdGhlIG5ldyBhbGdvcml0aG0gY2FuIHB1bGwgaW4gYSBsb3Qgb2YgY29kZSB0byB0aGUgbWFpbiBvdXRwdXQKICAvLyB1bml0LiBUaGlzIGxvZ2ljIGRldGVjdHMgaXQgYW5kIHdpbGwgbWFrZSBpdCBlYXNpZXIgZm9yIHVzIHRvIG1pZ3JhdGUgY29kZQogIC8vIG9mZiBpdCBpbmNyZW1lbnRhbGx5LgogIC8vIE5vdGU6IHdlIG9ubHkgZXhwZWN0IGRpc2NyZXBhbmNpZXMgb24gY2xhc3MtZGVwZW5kZW5jeS1pbmZvIGR1ZSB0byBob3cKICAvLyBpbmZlcnJlZCB0eXBlcyBleHBvc2UgZGVmZXJyZWQgdHlwZXMgaW4gdHlwZS12YXJpYWJsZXMgYW5kIHJldHVybiB0eXBlcwogIC8vIChJc3N1ZSAjMzUzMTEpLiBXZSBhZGRlZCB0aGUgb3RoZXIgdHdvIG1ldGhvZHMgdG8gdGVzdCBvdXIgdHJhbnNpdGlvbiwgYnV0CiAgLy8gd2UgZG9uJ3QgZXhwZWN0IHRvIGRldGVjdCBhbnkgbWlzbWF0Y2hlcyB0aGVyZS4KICAvLwogIC8vIFRPRE8oc2lnbXVuZCk6IGRlbGV0ZSBvbmNlIHRoZSBuZXcgaW1wbGVtZW50YXRpb24gaXMgb24gYnkgZGVmYXVsdC4KICB2b2lkIF9maXhDbGFzc0RlcGVuZGVuY3lJbmZvKERlcGVuZGVuY3lJbmZvIGluZm8sIENsYXNzRW50aXR5IGNscywKICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBTcGFubmFibGUgY29udGV4dCkgewogICAgaWYgKGluZm8uaXNEZWZlcnJlZCkgcmV0dXJuOwogICAgaWYgKG5ld0RlZmVycmVkU3BsaXQgJiYgIXJlcG9ydEludmFsaWRJbmZlcnJlZERlZmVycmVkVHlwZXMpIHJldHVybjsKICAgIHZhciBpbXBvcnRzID0gY2xhc3NJbXBvcnRzVG8oY2xzLCBsaWJyYXJ5KTsKICAgIF9maXhEZXBlbmRlbmN5SW5mbyhpbmZvLCBpbXBvcnRzLCAiQ2xhc3MiLCBjbHMubmFtZSwgY29udGV4dCk7CiAgfQoKICB2b2lkIF9maXhNZW1iZXJEZXBlbmRlbmN5SW5mbyhEZXBlbmRlbmN5SW5mbyBpbmZvLCBNZW1iZXJFbnRpdHkgbWVtYmVyLAogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnksIFNwYW5uYWJsZSBjb250ZXh0KSB7CiAgICBpZiAoaW5mby5pc0RlZmVycmVkIHx8IGNvbXBpbGVyLm9wdGlvbnMubmV3RGVmZXJyZWRTcGxpdCkgcmV0dXJuOwogICAgdmFyIGltcG9ydHMgPSBtZW1iZXJJbXBvcnRzVG8obWVtYmVyLCBsaWJyYXJ5KTsKICAgIF9maXhEZXBlbmRlbmN5SW5mbyhpbmZvLCBpbXBvcnRzLCAiTWVtYmVyIiwgbWVtYmVyLm5hbWUsIGNvbnRleHQpOwogIH0KCiAgdm9pZCBfZml4Q29uc3RhbnREZXBlbmRlbmN5SW5mbyhEZXBlbmRlbmN5SW5mbyBpbmZvLCBDb25zdGFudFZhbHVlIGNvbnN0YW50LAogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnksIFNwYW5uYWJsZSBjb250ZXh0KSB7CiAgICBpZiAoaW5mby5pc0RlZmVycmVkIHx8IGNvbXBpbGVyLm9wdGlvbnMubmV3RGVmZXJyZWRTcGxpdCkgcmV0dXJuOwogICAgaWYgKGNvbnN0YW50IGlzIFR5cGVDb25zdGFudFZhbHVlKSB7CiAgICAgIHZhciB0eXBlID0gY29uc3RhbnQucmVwcmVzZW50ZWRUeXBlOwogICAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgdmFyIGltcG9ydHMgPSBjbGFzc0ltcG9ydHNUbyh0eXBlLmVsZW1lbnQsIGxpYnJhcnkpOwogICAgICAgIF9maXhEZXBlbmRlbmN5SW5mbygKICAgICAgICAgICAgaW5mbywgaW1wb3J0cywgIkNsYXNzIChpbiBjb25zdGFudCkgIiwgdHlwZS5lbGVtZW50Lm5hbWUsIGNvbnRleHQpOwogICAgICB9IGVsc2UgaWYgKHR5cGUgaXMgVHlwZWRlZlR5cGUpIHsKICAgICAgICB2YXIgaW1wb3J0cyA9IHR5cGVkZWZJbXBvcnRzVG8odHlwZS5lbGVtZW50LCBsaWJyYXJ5KTsKICAgICAgICBfZml4RGVwZW5kZW5jeUluZm8oCiAgICAgICAgICAgIGluZm8sIGltcG9ydHMsICJUeXBlZGVmICIsIHR5cGUuZWxlbWVudC5uYW1lLCBjb250ZXh0KTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfcHJvY2Vzc0RlcGVuZGVuY2llcygKICAgICAgS0Nsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnksCiAgICAgIERlcGVuZGVuY2llcyBkZXBlbmRlbmNpZXMsCiAgICAgIEltcG9ydFNldCBvbGRTZXQsCiAgICAgIEltcG9ydFNldCBuZXdTZXQsCiAgICAgIFdvcmtRdWV1ZSBxdWV1ZSwKICAgICAgU3Bhbm5hYmxlIGNvbnRleHQpIHsKICAgIGRlcGVuZGVuY2llcy5jbGFzc2VzLmZvckVhY2goKENsYXNzRW50aXR5IGNscywgRGVwZW5kZW5jeUluZm8gaW5mbykgewogICAgICBfZml4Q2xhc3NEZXBlbmRlbmN5SW5mbyhpbmZvLCBjbHMsIGxpYnJhcnksIGNvbnRleHQpOwogICAgICBpZiAoaW5mby5pc0RlZmVycmVkKSB7CiAgICAgICAgaWYgKF9zaG91bGRBZGREZWZlcnJlZERlcGVuZGVuY3kobmV3U2V0KSkgewogICAgICAgICAgZm9yIChJbXBvcnRFbnRpdHkgZGVmZXJyZWRJbXBvcnQgaW4gaW5mby5pbXBvcnRzKSB7CiAgICAgICAgICAgIHF1ZXVlLmFkZENsYXNzKGNscywgaW1wb3J0U2V0cy5zaW5nbGV0b24oZGVmZXJyZWRJbXBvcnQpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3VwZGF0ZUNsYXNzUmVjdXJzaXZlKGNsb3NlZFdvcmxkLCBjbHMsIG9sZFNldCwgbmV3U2V0LCBxdWV1ZSk7CiAgICAgIH0KICAgIH0pOwoKICAgIGRlcGVuZGVuY2llcy5tZW1iZXJzLmZvckVhY2goKE1lbWJlckVudGl0eSBtZW1iZXIsIERlcGVuZGVuY3lJbmZvIGluZm8pIHsKICAgICAgX2ZpeE1lbWJlckRlcGVuZGVuY3lJbmZvKGluZm8sIG1lbWJlciwgbGlicmFyeSwgY29udGV4dCk7CiAgICAgIGlmIChpbmZvLmlzRGVmZXJyZWQpIHsKICAgICAgICBpZiAoX3Nob3VsZEFkZERlZmVycmVkRGVwZW5kZW5jeShuZXdTZXQpKSB7CiAgICAgICAgICBmb3IgKEltcG9ydEVudGl0eSBkZWZlcnJlZEltcG9ydCBpbiBpbmZvLmltcG9ydHMpIHsKICAgICAgICAgICAgcXVldWUuYWRkTWVtYmVyKG1lbWJlciwgaW1wb3J0U2V0cy5zaW5nbGV0b24oZGVmZXJyZWRJbXBvcnQpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3VwZGF0ZU1lbWJlclJlY3Vyc2l2ZShjbG9zZWRXb3JsZCwgbWVtYmVyLCBvbGRTZXQsIG5ld1NldCwgcXVldWUpOwogICAgICB9CiAgICB9KTsKCiAgICBmb3IgKExvY2FsIGxvY2FsRnVuY3Rpb24gaW4gZGVwZW5kZW5jaWVzLmxvY2FsRnVuY3Rpb25zKSB7CiAgICAgIF91cGRhdGVMb2NhbEZ1bmN0aW9uKGxvY2FsRnVuY3Rpb24sIG9sZFNldCwgbmV3U2V0KTsKICAgIH0KCiAgICBkZXBlbmRlbmNpZXMuY29uc3RhbnRzCiAgICAgICAgLmZvckVhY2goKENvbnN0YW50VmFsdWUgY29uc3RhbnQsIERlcGVuZGVuY3lJbmZvIGluZm8pIHsKICAgICAgX2ZpeENvbnN0YW50RGVwZW5kZW5jeUluZm8oaW5mbywgY29uc3RhbnQsIGxpYnJhcnksIGNvbnRleHQpOwogICAgICBpZiAoaW5mby5pc0RlZmVycmVkKSB7CiAgICAgICAgaWYgKF9zaG91bGRBZGREZWZlcnJlZERlcGVuZGVuY3kobmV3U2V0KSkgewogICAgICAgICAgZm9yIChJbXBvcnRFbnRpdHkgZGVmZXJyZWRJbXBvcnQgaW4gaW5mby5pbXBvcnRzKSB7CiAgICAgICAgICAgIHF1ZXVlLmFkZENvbnN0YW50KGNvbnN0YW50LCBpbXBvcnRTZXRzLnNpbmdsZXRvbihkZWZlcnJlZEltcG9ydCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBfdXBkYXRlQ29uc3RhbnRSZWN1cnNpdmUoY2xvc2VkV29ybGQsIGNvbnN0YW50LCBvbGRTZXQsIG5ld1NldCwgcXVldWUpOwogICAgICB9CiAgICB9KTsKICB9CgogIC8vLyBDb21wdXRlcyBhIHVuaXF1ZSBzdHJpbmcgZm9yIHRoZSBuYW1lIGZpZWxkIGZvciBlYWNoIG91dHB1dFVuaXQuCiAgdm9pZCBfY3JlYXRlT3V0cHV0VW5pdHMoKSB7CiAgICBpbnQgY291bnRlciA9IDE7CiAgICB2b2lkIGFkZFVuaXQoSW1wb3J0U2V0IGltcG9ydFNldCkgewogICAgICBpZiAoaW1wb3J0U2V0LnVuaXQgIT0gbnVsbCkgcmV0dXJuOwogICAgICB2YXIgdW5pdCA9IG5ldyBPdXRwdXRVbml0KGZhbHNlLCAnJGNvdW50ZXInLAogICAgICAgICAgaW1wb3J0U2V0Ll9pbXBvcnRzLm1hcCgoaSkgPT4gaS5kZWNsYXJhdGlvbikudG9TZXQoKSk7CiAgICAgIGNvdW50ZXIrKzsKICAgICAgaW1wb3J0U2V0LnVuaXQgPSB1bml0OwogICAgICBfYWxsT3V0cHV0VW5pdHMuYWRkKHVuaXQpOwogICAgfQoKICAgIC8vIEdlbmVyYXRlIGFuIG91dHB1dCB1bml0IGZvciBhbGwgaW1wb3J0IHNldHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGFuCiAgICAvLyBlbGVtZW50IG9yIGNvbnN0YW50LgogICAgX2NsYXNzVG9TZXQudmFsdWVzLmZvckVhY2goYWRkVW5pdCk7CiAgICBfbWVtYmVyVG9TZXQudmFsdWVzLmZvckVhY2goYWRkVW5pdCk7CiAgICBfbG9jYWxGdW5jdGlvblRvU2V0LnZhbHVlcy5mb3JFYWNoKGFkZFVuaXQpOwogICAgX2NvbnN0YW50VG9TZXQudmFsdWVzLmZvckVhY2goYWRkVW5pdCk7CgogICAgLy8gU29ydCBvdXRwdXQgdW5pdHMgdG8gbWFrZSB0aGUgb3V0cHV0IG9mIHRoZSBjb21waWxlciBtb3JlIHN0YWJsZS4KICAgIF9hbGxPdXRwdXRVbml0cy5zb3J0KCk7CiAgfQoKICBNYXA8U3RyaW5nLCBMaXN0PE91dHB1dFVuaXQ+PiBfc2V0dXBIdW5rc1RvTG9hZCgpIHsKICAgIE1hcDxTdHJpbmcsIExpc3Q8T3V0cHV0VW5pdD4+IGh1bmtzVG9Mb2FkID0ge307CiAgICBTZXQ8U3RyaW5nPiB1c2VkSW1wb3J0TmFtZXMgPSBuZXcgU2V0PFN0cmluZz4oKTsKCiAgICBmb3IgKEltcG9ydEVudGl0eSBpbXBvcnQgaW4gX2FsbERlZmVycmVkSW1wb3J0cykgewogICAgICBTdHJpbmcgcmVzdWx0ID0gY29tcHV0ZUltcG9ydERlZmVyTmFtZShpbXBvcnQsIGNvbXBpbGVyKTsKICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKTsKICAgICAgLy8gTm90ZTogdG9vbHMgdGhhdCBwcm9jZXNzIHRoZSBqc29uIGZpbGUgdG8gYnVpbGQgbXVsdGktcGFydCBpbml0aWFsIGxvYWQKICAgICAgLy8gYnVuZGxlcyBkZXBlbmQgb24gdGhlIGZhY3QgdGhhdCBtYWtlVW5pcXVlIGFwcGVuZHMgb25seSBkaWdpdHMsIG9yIGEKICAgICAgLy8gcGVyaW9kIGZvbGxvd2VkIGJ5IGRpZ2l0cy4KICAgICAgX2ltcG9ydERlZmVyTmFtZVtpbXBvcnRdID0gbWFrZVVuaXF1ZShyZXN1bHQsIHVzZWRJbXBvcnROYW1lcywgJy4nKTsKICAgIH0KCiAgICAvLyBTb3J0IHRoZSBvdXRwdXQgdW5pdHMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0aGUgbnVtYmVyIG9mIGltcG9ydHMgdGhleQogICAgLy8gaW5jbHVkZS4KCiAgICAvLyBUaGUgbG9hZGluZyBvZiB0aGUgb3V0cHV0IHVuaXRzIG11c3QgYmUgb3JkZXJlZCBiZWNhdXNlIGEgc3VwZXJjbGFzcwogICAgLy8gbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGl0cyBzdWJjbGFzcy4KICAgIC8vIEJ1dCBhIGNsYXNzIGNhbiBvbmx5IGRlcGVuZCBvbiBhbm90aGVyIGNsYXNzIGluIGFuIG91dHB1dCB1bml0IHNoYXJlZCBieQogICAgLy8gYSBzdHJpY3Qgc3VwZXJzZXQgb2YgdGhlIGltcG9ydHM6CiAgICAvLyBCeSBjb250cmFkaWN0aW9uOiBBc3N1bWUgYSBjbGFzcyBDIGluIG91dHB1dCB1bml0IHNoYXJlZCBieSBpbXBvcnRzIGluCiAgICAvLyB0aGUgc2V0IFMxID0gKGxpYjEsLi4sIGxpYl9uKSBkZXBlbmRzIG9uIGEgY2xhc3MgRCBpbiBhbiBvdXRwdXQgdW5pdAogICAgLy8gc2hhcmVkIGJ5IFMyIHN1Y2ggdGhhdCBTMiBub3QgYSBzdXBlcnNldCBvZiBTMS4gTGV0IGxpYl9zIGJlIGEgbGlicmFyeSBpbgogICAgLy8gUzEgbm90IGluIFMyLiBsaWJfcyBtdXN0IGRlcGVuZCBvbiBDLCBhbmQgdGhlbiBpbiB0dXJuIG9uIEQuIFRoZXJlZm9yZSBECiAgICAvLyBpcyBub3QgaW4gdGhlIHJpZ2h0IG91dHB1dCB1bml0LgogICAgTGlzdDxPdXRwdXRVbml0PiBzb3J0ZWRPdXRwdXRVbml0cyA9IF9hbGxPdXRwdXRVbml0cy5yZXZlcnNlZC50b0xpc3QoKTsKCiAgICAvLyBGb3IgZWFjaCBkZWZlcnJlZCBpbXBvcnQgd2UgZmluZCBvdXQgd2hpY2ggb3V0cHV0VW5pdHMgdG8gbG9hZC4KICAgIGZvciAoSW1wb3J0RW50aXR5IGltcG9ydCBpbiBfYWxsRGVmZXJyZWRJbXBvcnRzKSB7CiAgICAgIC8vIFdlIGV4cGVjdCB0byBmaW5kIGFuIGVudHJ5IGZvciBhbnkgY2FsbCB0byBgbG9hZExpYnJhcnlgLCBldmVuIGlmCiAgICAgIC8vIHRoZXJlIGlzIG5vIGNvZGUgdG8gbG9hZC4gSW4gdGhhdCBjYXNlLCB0aGUgZW50cnkgd2lsbCBiZSBhbiBlbXB0eQogICAgICAvLyBsaXN0LgogICAgICBodW5rc1RvTG9hZFtfaW1wb3J0RGVmZXJOYW1lW2ltcG9ydF1dID0gbmV3IExpc3Q8T3V0cHV0VW5pdD4oKTsKICAgICAgZm9yIChPdXRwdXRVbml0IG91dHB1dFVuaXQgaW4gc29ydGVkT3V0cHV0VW5pdHMpIHsKICAgICAgICBpZiAob3V0cHV0VW5pdCA9PSBfbWFpbk91dHB1dFVuaXQpIGNvbnRpbnVlOwogICAgICAgIGlmIChvdXRwdXRVbml0Ll9pbXBvcnRzLmNvbnRhaW5zKGltcG9ydCkpIHsKICAgICAgICAgIGh1bmtzVG9Mb2FkW19pbXBvcnREZWZlck5hbWVbaW1wb3J0XV0uYWRkKG91dHB1dFVuaXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGh1bmtzVG9Mb2FkOwogIH0KCiAgLy8vIFJldHVybnMgYSBuYW1lIGZvciBhIGRlZmVycmVkIGltcG9ydC4KICBTdHJpbmcgY29tcHV0ZUltcG9ydERlZmVyTmFtZShJbXBvcnRFbnRpdHkgZGVjbGFyYXRpb24sIENvbXBpbGVyIGNvbXBpbGVyKSB7CiAgICBhc3NlcnQoZGVjbGFyYXRpb24uaXNEZWZlcnJlZCk7CiAgICBpZiAoZGVjbGFyYXRpb24ubmFtZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbi5uYW1lOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGRlZmVycmVkIGltcG9ydCBpc24ndCBkZWNsYXJlZCB3aXRoIGEgcHJlZml4LgogICAgICBhc3NlcnQoY29tcGlsZXIuY29tcGlsYXRpb25GYWlsZWQpOwogICAgICByZXR1cm4gJyc7CiAgICB9CiAgfQoKICAvLy8gUGVyZm9ybXMgdGhlIGRlZmVycmVkIGxvYWRpbmcgYWxnb3JpdGhtLgogIC8vLwogIC8vLyBUaGUgZGVmZXJyZWQgbG9hZGluZyBhbGdvcml0aG0gbWFwcyBlbGVtZW50cyBhbmQgY29uc3RhbnRzIHRvIGFuIG91dHB1dAogIC8vLyB1bml0LiBFYWNoIG91dHB1dCB1bml0IGlzIGlkZW50aWZpZWQgYnkgYSBzdWJzZXQgb2YgZGVmZXJyZWQgaW1wb3J0cyAoYW4KICAvLy8gW0ltcG9ydFNldF0pLCBhbmQgdGhleSB3aWxsIGNvbnRhaW4gdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGluaGVyZW50bHkgdXNlZAogIC8vLyBieSBhbGwgdGhvc2UgZGVmZXJyZWQgaW1wb3J0cy4gQW4gZWxlbWVudCBpcyB1c2VkIGJ5IGEgZGVmZXJyZWQgaW1wb3J0IGlmCiAgLy8vIGl0IGlzIGVpdGhlciBsb2FkZWQgYnkgdGhhdCBpbXBvcnQgb3IgdHJhbnNpdGl2ZWx5IGFjY2Vzc2VkIGJ5IGFuIGVsZW1lbnQKICAvLy8gdGhhdCB0aGUgaW1wb3J0IGxvYWRzLiAgQW4gZW1wdHkgc2V0IHJlcHJlc2VudHMgdGhlIG1haW4gb3V0cHV0IHVuaXQsCiAgLy8vIHdoaWNoIGNvbnRhaW5zIGFueSBlbGVtZW50cyB0aGF0IGFyZSBhY2Nlc3NlZCBkaXJlY3RseSBhbmQgYXJlIG5vdAogIC8vLyBkZWZlcnJlZC4KICAvLy8KICAvLy8gVGhlIGFsZ29yaXRobSB0cmF2ZXJzZXMgdGhlIGVsZW1lbnQgbW9kZWwgcmVjdXJzaXZlbHkgbG9va2luZyBmb3IKICAvLy8gZGVwZW5kZW5jaWVzIGJldHdlZW4gZWxlbWVudHMuIFRoZXNlIGRlcGVuZGVuY2llcyBtYXkgYmUgZGVmZXJyZWQgb3IKICAvLy8gbm9uLWRlZmVycmVkLiBEZWZlcnJlZCBkZXBlbmRlbmNpZXMgYXJlIG1haW5seSB1c2VkIHRvIGRpc2NvdmVyIHRoZSByb290CiAgLy8vIGVsZW1lbnRzIHRoYXQgYXJlIGxvYWRlZCBmcm9tIGRlZmVycmVkIGltcG9ydHMsIHdoaWxlIG5vbi1kZWZlcnJlZAogIC8vLyBkZXBlbmRlbmNpZXMgYXJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgYXNzb2NpYXRlIG1vcmUgZWxlbWVudHMgdG8gb3V0cHV0CiAgLy8vIHVuaXRzLgogIC8vLwogIC8vLyBOYWl2ZWx5LCB0aGUgYWxnb3JpdGhtIHRyYXZlcnNlcyBlYWNoIHJvb3Qgb2YgYSBkZWZlcnJlZCBpbXBvcnQgYW5kIG1hcmtzCiAgLy8vIGV2ZXJ5dGhpbmcgaXQgY2FuIHJlYWNoIGFzIGJlaW5nIHVzZWQgYnkgdGhhdCBpbXBvcnQuIFRvIHJlZHVjZSBob3cgbWFueQogIC8vLyB0aW1lcyB3ZSB2aXNpdCBhbiBlbGVtZW50LCB3ZSB1c2UgYW4gYWxnb3JpdGhtIHRoYXQgd29ya3MgaW4gc2VnbWVudHM6IGl0CiAgLy8vIG1hcmtzIGVsZW1lbnRzIHdpdGggYSBzdWJzZXQgb2YgZGVmZXJyZWQgaW1wb3J0cyBhdCBhIHRpbWUsIHVudGlsIGl0CiAgLy8vIGRldGVjdHMgYSBtZXJnZSBwb2ludCB3aGVyZSBtb3JlIGRlZmVycmVkIGltcG9ydHMgY291bGQgYmUgY29uc2lkZXJlZCBhdAogIC8vLyBvbmNlLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhpcyBkZXBlbmRlbmN5IGdyYXBoIChpZ25vcmluZyBlbGVtZW50cyBpbiB0aGUgbWFpbgogIC8vLyBvdXRwdXQgdW5pdCk6CiAgLy8vCiAgLy8vICAgZGVmZXJyZWQgaW1wb3J0IEE6IGExIC0tLT4gczEgLS0tPiBzMiAgLT4gczMKICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgIF4KICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKICAvLy8gICBkZWZlcnJlZCBpbXBvcnQgQjogYjEgLS0tLS0rICAgICAgIHwKICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAvLy8gICBkZWZlcnJlZCBpbXBvcnQgQzogYzEgLS0tPiBjMiAtLS0+IGMzCiAgLy8vCiAgLy8vIFRoZSBhbGdvcml0aG0gd2lsbCBjb21wdXRlIGEgcmVzdWx0IHdpdGggNSBkZWZlcnJlZCBvdXRwdXQgdW5pdHM6CiAgLy8KICAvLy8gICAqIHVuaXQge0F9OiAgICAgICAgY29udGFpbnMgYTEKICAvLy8gICAqIHVuaXQge0J9OiAgICAgICAgY29udGFpbnMgYjEKICAvLy8gICAqIHVuaXQge0N9OiAgICAgICAgY29udGFpbnMgYzEsIGMyLCBhbmQgYzMKICAvLy8gICAqIHVuaXQge0EsIEJ9OiAgICAgY29udGFpbnMgczEKICAvLy8gICAqIHVuaXQge0EsIEIsIEN9OiAgY29udGFpbnMgczIsIGFuZCBzMwogIC8vLwogIC8vLyBBZnRlciBtYXJraW5nIGV2ZXJ5dGhpbmcgcmVhY2hhYmxlIGZyb20gbWFpbiBhcyBwYXJ0IG9mIHRoZSBtYWluIG91dHB1dAogIC8vLyB1bml0LCBvdXIgYWxnb3JpdGhtIHdpbGwgd29yayBhcyBmb2xsb3dzOgogIC8vLwogIC8vLyAgICogSW5pdGlhbGx5IGFsbCBkZWZlcnJlZCBlbGVtZW50cyBoYXZlIG5vIG1hcHBpbmcuCiAgLy8vICAgKiBXZSBtYWtlIG5vdGUgb2Ygd29yayB0byBkbywgaW5pdGlhbGx5IHRvIG1hcmsgdGhlIHJvb3Qgb2YgZWFjaAogIC8vLyAgICAgZGVmZXJyZWQgaW1wb3J0OgogIC8vLyAgICAgICAgKiBhMSB3aXRoIEEsIGFuZCByZWN1cnNlIGZyb20gdGhlcmUuCiAgLy8vICAgICAgICAqIGIxIHdpdGggQiwgYW5kIHJlY3Vyc2UgZnJvbSB0aGVyZS4KICAvLy8gICAgICAgICogYzEgd2l0aCBDLCBhbmQgcmVjdXJzZSBmcm9tIHRoZXJlLgogIC8vLyAgICogd2UgdXBkYXRlIGExLCBzMSwgczIsIHMzIGZyb20gbm8gbWFwcGluZyB0byB7QX0KICAvLy8gICAqIHdlIHVwZGF0ZSBiMSBmcm9tIG5vIG1hcHBpbmcgdG8ge0J9LCBhbmQgd2hlbiB3ZSBmaW5kIHMxIHdlIG5vdGljZQogIC8vLyAgICAgdGhhdCBzMSBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhbm90aGVyIGltcG9ydCBzZXQge0F9LCBzbyB3ZSBtYWtlCiAgLy8vICAgICBub3RlIG9mIGFkZGl0aW9uYWwgd29yayBmb3IgbGF0ZXIgdG8gbWFyayBzMSB3aXRoIHtBLCBCfQogIC8vLyAgICogd2UgdXBkYXRlIGMxLCBjMiwgYzMgdG8ge0N9LCBhbmQgbWFrZSBhIG5vdGUgdG8gdXBkYXRlIHMyIHdpdGgge0EsIEN9CiAgLy8vICAgKiB3ZSB1cGRhdGUgczEgdG8ge0EsIEJ9LCBhbmQgdXBkYXRlIHRoZSBleGlzdGluZyBub3RlIHRvIHVwZGF0ZSBzMiwgbm93CiAgLy8vICAgICB3aXRoIHtBLCBCLCBDfQogIC8vLyAgICogZmluYWxseSB3ZSB1cGRhdGUgczIgYW5kIHMzIHdpdGgge0EsIEIsIEN9IGluIG9uZSBnbywgd2l0aG91dCBldmVyCiAgLy8vICAgICB1cGRhdGluZyB0aGVtIHRvIHRoZSBpbnRlcm1lZGlhdGUgc3RhdGUge0EsIEN9LgogIC8vLwogIC8vLyBUaGUgaW1wbGVtZW50YXRpb24gYmVsb3cgZG9lcyBhdG9taWMgdXBkYXRlcyBmcm9tIG9uZSBpbXBvcnQtc2V0IHRvCiAgLy8vIGFub3RoZXIuICBBdCBmaXJzdCB3ZSBhZGQgb25lIGRlZmVycmVkIGltcG9ydCBhdCBhIHRpbWUsIGJ1dCBhcyB0aGUKICAvLy8gYWxnb3JpdGhtIHByb2dlc3NlcyBpdCBtYXkgdXBkYXRlIGEgc21hbGwgaW1wb3J0LXNldCB3aXRoIGEgbGFyZ2VyCiAgLy8vIGltcG9ydC1zZXQgaW4gb25lIGdvLiBUaGUga2V5IG9mIHRoaXMgYWxnb3JpdGhtIGlzIHRvIGRldGVjdCB3aGVuIHNoYXJpbmcKICAvLy8gYmVnaW5zLCBzbyB3ZSBjYW4gdXBkYXRlIHRob3NlIGVsZW1lbnRzIG1vcmUgZWZmaWNlbnRseS4KICAvLy8KICAvLy8gVG8gZGV0ZWN0IHRoZXNlIG1lcmdlIHBvaW50cyB3aGVyZSBzaGFyaW5nIGJlZ2lucywgdGhlIGltcGxlbWVudGF0aW9uCiAgLy8vIGJlbG93IHVzZXMgYGEgc3dhcCBvcGVyYXRpb25gOiB3ZSBmaXJzdCBjb21wYXJlIHdoYXQgdGhlIG9sZCBpbXBvcnQtc2V0CiAgLy8vIGlzLCBhbmQgaWYgaXQgbWF0Y2hlcyBvdXIgZXhwZWN0YXRpb24sIHRoZSBzd2FwIGlzIGRvbmUgYW5kIHdlIHJlY3Vyc2UsCiAgLy8vIG90aGVyd2lzZSBhIG1lcmdlIHJvb3Qgd2FzIGRldGVjdGVkIGFuZCB3ZSBlbnF1ZXVlIGEgbmV3IHNlZ21lbnQgb2YKICAvLy8gdXBkYXRlcyBmb3IgbGF0ZXIuCiAgLy8vCiAgLy8vIFRPRE8oc2lnbXVuZCk6IGludmVzdGlnYXRlIGRpZmZlcmVudCBoZXVyaXN0aWNzIGZvciBob3cgdG8gc2VsZWN0IHRoZSBuZXh0CiAgLy8vIHdvcmsgaXRlbSAoZS5nLiB3ZSBtaWdodCBjb252ZXJnZSBmYXN0ZXIgaWYgd2UgcGljayBmaXJzdCB0aGUgdXBkYXRlIHRoYXQKICAvLy8gY29udGFpbnMgYSBiaWdnZXIgZGVsdGEuKQogIE91dHB1dFVuaXREYXRhIHJ1bihGdW5jdGlvbkVudGl0eSBtYWluLCBLQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmICghaXNQcm9ncmFtU3BsaXQgfHwgbWFpbiA9PSBudWxsIHx8IGRpc2FibGVQcm9ncmFtU3BsaXQpIHsKICAgICAgcmV0dXJuIF9idWlsZFJlc3VsdCgpOwogICAgfQoKICAgIHdvcmsoKSB7CiAgICAgIHZhciBxdWV1ZSA9IG5ldyBXb3JrUXVldWUodGhpcy5pbXBvcnRTZXRzKTsKCiAgICAgIC8vIEFkZCBgbWFpbmAgYW5kIHRoZWlyIHJlY3Vyc2l2ZSBkZXBlbmRlbmNpZXMgdG8gdGhlIG1haW4gb3V0cHV0IHVuaXQuCiAgICAgIC8vIFdlIGRvIHRoaXMgdXBmcm9udCB0byBhdm9pZCB3YXN0aW5nIHRpbWUgdmlzaXRpbmcgdGhlc2UgZWxlbWVudHMgd2hlbgogICAgICAvLyBhbmFseXppbmcgZGVmZXJyZWQgaW1wb3J0cy4KICAgICAgcXVldWUuYWRkTWVtYmVyKG1haW4sIGltcG9ydFNldHMubWFpblNldCk7CgogICAgICAvLyBBbHNvIGFkZCAiZ2xvYmFsIiBkZXBlbmRlbmNpZXMgdG8gdGhlIG1haW4gb3V0cHV0IHVuaXQuICBUaGVzZSBhcmUKICAgICAgLy8gdGhpbmdzIHRoYXQgdGhlIGJhY2tlbmQgbmVlZHMgYnV0IGNhbm5vdCBhc3NvY2lhdGUgd2l0aCBhIHBhcnRpY3VsYXIKICAgICAgLy8gZWxlbWVudC4gVGhpcyBzZXQgYWxzbyBjb250YWlucyBlbGVtZW50cyBmb3Igd2hpY2ggd2UgbGFjayBwcmVjaXNlCiAgICAgIC8vIGluZm9ybWF0aW9uLgogICAgICBmb3IgKE1lbWJlckVudGl0eSBlbGVtZW50CiAgICAgICAgICBpbiBjbG9zZWRXb3JsZC5iYWNrZW5kVXNhZ2UuZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXMpIHsKICAgICAgICBxdWV1ZS5hZGRNZW1iZXIoZWxlbWVudCwgaW1wb3J0U2V0cy5tYWluU2V0KTsKICAgICAgfQogICAgICBmb3IgKENsYXNzRW50aXR5IGVsZW1lbnQKICAgICAgICAgIGluIGNsb3NlZFdvcmxkLmJhY2tlbmRVc2FnZS5nbG9iYWxDbGFzc0RlcGVuZGVuY2llcykgewogICAgICAgIHF1ZXVlLmFkZENsYXNzKGVsZW1lbnQsIGltcG9ydFNldHMubWFpblNldCk7CiAgICAgIH0KCiAgICAgIHZvaWQgZW1wdHlRdWV1ZSgpIHsKICAgICAgICB3aGlsZSAocXVldWUuaXNOb3RFbXB0eSkgewogICAgICAgICAgV29ya0l0ZW0gaXRlbSA9IHF1ZXVlLm5leHRJdGVtKCk7CiAgICAgICAgICBpdGVtLnVwZGF0ZSh0aGlzLCBjbG9zZWRXb3JsZCwgcXVldWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZW1wdHlRdWV1ZSgpOwogICAgfQoKICAgIHJlcG9ydGVyLndpdGhDdXJyZW50RWxlbWVudChtYWluLmxpYnJhcnksICgpID0+IG1lYXN1cmUod29yaykpOwoKICAgIC8vIE5vdGlmeSB0aGF0IHdlIG5vIGxvbmdlciBuZWVkIGltcGFjdHMgZm9yIGRlZmVycmVkIGxvYWQsIHNvIHRoZXkgY2FuIGJlCiAgICAvLyBkaXNjYXJkZWQgYXQgdGhpcyB0aW1lLgogICAgY29tcGlsZXIuaW1wYWN0U3RyYXRlZ3kub25JbXBhY3RVc2VkKERlZmVycmVkTG9hZFRhc2suSU1QQUNUX1VTRSk7CiAgICByZXR1cm4gX2J1aWxkUmVzdWx0KCk7CiAgfQoKICBPdXRwdXRVbml0RGF0YSBfYnVpbGRSZXN1bHQoKSB7CiAgICBfY3JlYXRlT3V0cHV0VW5pdHMoKTsKICAgIE1hcDxTdHJpbmcsIExpc3Q8T3V0cHV0VW5pdD4+IGh1bmtzVG9Mb2FkID0gX3NldHVwSHVua3NUb0xvYWQoKTsKICAgIE1hcDxDbGFzc0VudGl0eSwgT3V0cHV0VW5pdD4gY2xhc3NNYXAgPSA8Q2xhc3NFbnRpdHksIE91dHB1dFVuaXQ+e307CiAgICBNYXA8TWVtYmVyRW50aXR5LCBPdXRwdXRVbml0PiBtZW1iZXJNYXAgPSA8TWVtYmVyRW50aXR5LCBPdXRwdXRVbml0Pnt9OwogICAgTWFwPExvY2FsLCBPdXRwdXRVbml0PiBsb2NhbEZ1bmN0aW9uTWFwID0gPExvY2FsLCBPdXRwdXRVbml0Pnt9OwogICAgTWFwPENvbnN0YW50VmFsdWUsIE91dHB1dFVuaXQ+IGNvbnN0YW50TWFwID0gPENvbnN0YW50VmFsdWUsIE91dHB1dFVuaXQ+e307CiAgICBfY2xhc3NUb1NldC5mb3JFYWNoKChjbHMsIHMpID0+IGNsYXNzTWFwW2Nsc10gPSBzLnVuaXQpOwogICAgX21lbWJlclRvU2V0LmZvckVhY2goKG1lbWJlciwgcykgPT4gbWVtYmVyTWFwW21lbWJlcl0gPSBzLnVuaXQpOwogICAgX2xvY2FsRnVuY3Rpb25Ub1NldC5mb3JFYWNoKAogICAgICAgIChsb2NhbEZ1bmN0aW9uLCBzKSA9PiBsb2NhbEZ1bmN0aW9uTWFwW2xvY2FsRnVuY3Rpb25dID0gcy51bml0KTsKICAgIF9jb25zdGFudFRvU2V0LmZvckVhY2goKGNvbnN0YW50LCBzKSA9PiBjb25zdGFudE1hcFtjb25zdGFudF0gPSBzLnVuaXQpOwoKICAgIF9jbGFzc1RvU2V0ID0gbnVsbDsKICAgIF9tZW1iZXJUb1NldCA9IG51bGw7CiAgICBfbG9jYWxGdW5jdGlvblRvU2V0ID0gbnVsbDsKICAgIF9jb25zdGFudFRvU2V0ID0gbnVsbDsKICAgIGNsZWFudXAoKTsKICAgIHJldHVybiBuZXcgT3V0cHV0VW5pdERhdGEoCiAgICAgICAgdGhpcy5pc1Byb2dyYW1TcGxpdCAmJiAhZGlzYWJsZVByb2dyYW1TcGxpdCwKICAgICAgICB0aGlzLl9tYWluT3V0cHV0VW5pdCwKICAgICAgICBjbGFzc01hcCwKICAgICAgICBtZW1iZXJNYXAsCiAgICAgICAgbG9jYWxGdW5jdGlvbk1hcCwKICAgICAgICBjb25zdGFudE1hcCwKICAgICAgICBfYWxsT3V0cHV0VW5pdHMsCiAgICAgICAgX2ltcG9ydERlZmVyTmFtZSwKICAgICAgICBodW5rc1RvTG9hZCwKICAgICAgICBfZGVmZXJyZWRJbXBvcnREZXNjcmlwdGlvbnMpOwogIH0KCiAgLy8vIEZyZWVzIHVwIHN0cmF0ZWd5LXNwZWNpZmljIHRlbXBvcmFyeSBkYXRhLgogIHZvaWQgY2xlYW51cCgpIHt9CgogIHZvaWQgYmVmb3JlUmVzb2x1dGlvbihVcmkgcm9vdExpYnJhcnlVcmksIEl0ZXJhYmxlPFVyaT4gbGlicmFyaWVzKSB7CiAgICBtZWFzdXJlU3VidGFzaygncHJlcGFyZScsICgpIHsKICAgICAgZm9yIChVcmkgdXJpIGluIGxpYnJhcmllcykgewogICAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSA9IGVsZW1lbnRFbnZpcm9ubWVudC5sb29rdXBMaWJyYXJ5KHVyaSk7CiAgICAgICAgcmVwb3J0ZXIud2l0aEN1cnJlbnRFbGVtZW50KGxpYnJhcnksICgpIHsKICAgICAgICAgIGNoZWNrRm9yRGVmZXJyZWRFcnJvckNhc2VzKGxpYnJhcnkpOwogICAgICAgICAgZm9yIChJbXBvcnRFbnRpdHkgaW1wb3J0IGluIGVsZW1lbnRFbnZpcm9ubWVudC5nZXRJbXBvcnRzKGxpYnJhcnkpKSB7CiAgICAgICAgICAgIGlmIChpbXBvcnQuaXNEZWZlcnJlZCkgewogICAgICAgICAgICAgIF9kZWZlcnJlZEltcG9ydERlc2NyaXB0aW9uc1tpbXBvcnRdID0KICAgICAgICAgICAgICAgICAgbmV3IEltcG9ydERlc2NyaXB0aW9uKGltcG9ydCwgbGlicmFyeSwgcm9vdExpYnJhcnlVcmkpOwogICAgICAgICAgICAgIGlzUHJvZ3JhbVNwbGl0ID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9KTsKICB9CgogIC8vLyBEZXRlY3RzIGVycm9ycyBsaWtlIGR1cGxpY2F0ZSB1c2VzIG9mIGEgcHJlZml4IG9yIHVzaW5nIHRoZSBvbGQgZGVmZXJyZWQKICAvLy8gbG9hZGluZyBzeW50YXguCiAgLy8vCiAgLy8vIFRoZXNlIGNoZWNrcyBhcmUgYWxyZWFkeSBkb25lIGJ5IHRoZSBzaGFyZWQgZnJvbnQtZW5kLCBzbyB0aGV5IGNhbiBiZQogIC8vLyBza2lwcGVkIGJ5IHRoZSBuZXcgY29tcGlsZXIgcGlwZWxpbmUuCiAgdm9pZCBjaGVja0ZvckRlZmVycmVkRXJyb3JDYXNlcyhMaWJyYXJ5RW50aXR5IGxpYnJhcnkpOwoKICBib29sIGlnbm9yZUVudGl0eUluRHVtcChFbnRpdHkgZWxlbWVudCkgPT4gZmFsc2U7CgogIC8vLyBDcmVhdGVzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb3V0cHV0IHVuaXQgY29udGVudC4KICBTdHJpbmcgZHVtcCgpIHsKICAgIE1hcDxPdXRwdXRVbml0LCBMaXN0PFN0cmluZz4+IGVsZW1lbnRNYXAgPSA8T3V0cHV0VW5pdCwgTGlzdDxTdHJpbmc+Pnt9OwogICAgTWFwPE91dHB1dFVuaXQsIExpc3Q8U3RyaW5nPj4gY29uc3RhbnRNYXAgPSA8T3V0cHV0VW5pdCwgTGlzdDxTdHJpbmc+Pnt9OwogICAgX2NsYXNzVG9TZXQuZm9yRWFjaCgoQ2xhc3NFbnRpdHkgZWxlbWVudCwgSW1wb3J0U2V0IGltcG9ydFNldCkgewogICAgICBpZiAoaWdub3JlRW50aXR5SW5EdW1wKGVsZW1lbnQpKSByZXR1cm47CiAgICAgIHZhciBlbGVtZW50cyA9IGVsZW1lbnRNYXAucHV0SWZBYnNlbnQoaW1wb3J0U2V0LnVuaXQsICgpID0+IDxTdHJpbmc+W10pOwogICAgICB2YXIgaWQgPSBlbGVtZW50Lm5hbWUgPz8gJyRlbGVtZW50JzsKICAgICAgaWQgPSAnJGlkIGNscyc7CiAgICAgIGVsZW1lbnRzLmFkZChpZCk7CiAgICB9KTsKICAgIF9tZW1iZXJUb1NldC5mb3JFYWNoKChNZW1iZXJFbnRpdHkgZWxlbWVudCwgSW1wb3J0U2V0IGltcG9ydFNldCkgewogICAgICBpZiAoaWdub3JlRW50aXR5SW5EdW1wKGVsZW1lbnQpKSByZXR1cm47CiAgICAgIHZhciBlbGVtZW50cyA9IGVsZW1lbnRNYXAucHV0SWZBYnNlbnQoaW1wb3J0U2V0LnVuaXQsICgpID0+IDxTdHJpbmc+W10pOwogICAgICB2YXIgaWQgPSBlbGVtZW50Lm5hbWUgPz8gJyRlbGVtZW50JzsKICAgICAgdmFyIGNscyA9IGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3M/Lm5hbWU7CiAgICAgIGlmIChjbHMgIT0gbnVsbCkgaWQgPSAnJGNscy4kaWQnOwogICAgICBpZiAoZWxlbWVudC5pc1NldHRlcikgaWQgPSAnJGlkPSc7CiAgICAgIGlkID0gJyRpZCBtZW1iZXInOwogICAgICBlbGVtZW50cy5hZGQoaWQpOwogICAgfSk7CiAgICBfbG9jYWxGdW5jdGlvblRvU2V0LmZvckVhY2goKExvY2FsIGVsZW1lbnQsIEltcG9ydFNldCBpbXBvcnRTZXQpIHsKICAgICAgaWYgKGlnbm9yZUVudGl0eUluRHVtcChlbGVtZW50KSkgcmV0dXJuOwogICAgICB2YXIgZWxlbWVudHMgPSBlbGVtZW50TWFwLnB1dElmQWJzZW50KGltcG9ydFNldC51bml0LCAoKSA9PiA8U3RyaW5nPltdKTsKICAgICAgdmFyIGlkID0gZWxlbWVudC5uYW1lID8/ICckZWxlbWVudCc7CiAgICAgIHZhciBjb250ZXh0ID0gKGVsZW1lbnQgYXMgZHluYW1pYykubWVtYmVyQ29udGV4dC5uYW1lOwogICAgICBpZCA9IGVsZW1lbnQubmFtZSA9PSBudWxsIHx8IGVsZW1lbnQubmFtZSA9PSAnJyA/ICc8YW5vbnltb3VzPicgOiBpZDsKICAgICAgaWQgPSAnJGNvbnRleHQuJGlkJzsKICAgICAgaWQgPSAnJGlkIGxvY2FsJzsKICAgICAgZWxlbWVudHMuYWRkKGlkKTsKICAgIH0pOwogICAgX2NvbnN0YW50VG9TZXQuZm9yRWFjaCgoQ29uc3RhbnRWYWx1ZSB2YWx1ZSwgSW1wb3J0U2V0IGltcG9ydFNldCkgewogICAgICAvLyBTa2lwIHByaW1pdGl2ZSB2YWx1ZXM6IHRoZXkgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIGNvbnN0YW50IHRhYmxlcyBhbmQKICAgICAgLy8gaWYgdGhleSBhcmUgc2hhcmVkLCB0aGV5IGVuZCB1cCBkdXBsaWNhdGVkIGFueXdheXMgYWNyb3NzIG91dHB1dCB1bml0cy4KICAgICAgaWYgKHZhbHVlLmlzUHJpbWl0aXZlKSByZXR1cm47CiAgICAgIGNvbnN0YW50TWFwCiAgICAgICAgICAucHV0SWZBYnNlbnQoaW1wb3J0U2V0LnVuaXQsICgpID0+IDxTdHJpbmc+W10pCiAgICAgICAgICAuYWRkKHZhbHVlLnRvU3RydWN0dXJlZFRleHQoKSk7CiAgICB9KTsKCiAgICBNYXA8T3V0cHV0VW5pdCwgU3RyaW5nPiB0ZXh0ID0ge307CiAgICBmb3IgKE91dHB1dFVuaXQgb3V0cHV0VW5pdCBpbiBfYWxsT3V0cHV0VW5pdHMpIHsKICAgICAgU3RyaW5nQnVmZmVyIHVuaXRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICBpZiAob3V0cHV0VW5pdC5pc01haW5PdXRwdXQpIHsKICAgICAgICB1bml0VGV4dC53cml0ZSgnIDxNQUlOIFVOSVQ+Jyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdW5pdFRleHQud3JpdGUoJyBpbXBvcnRzOicpOwogICAgICAgIHZhciBpbXBvcnRzID0gb3V0cHV0VW5pdC5faW1wb3J0cwogICAgICAgICAgICAubWFwKChpKSA9PiAnJHtpLmVuY2xvc2luZ0xpYnJhcnlVcmkucmVzb2x2ZVVyaShpLnVyaSl9JykKICAgICAgICAgICAgLnRvTGlzdCgpOwogICAgICAgIGZvciAodmFyIGkgaW4gaW1wb3J0cy4uc29ydCgpKSB7CiAgICAgICAgICB1bml0VGV4dC53cml0ZSgnXG4gICAkaTonKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgTGlzdDxTdHJpbmc+IGVsZW1lbnRzID0gZWxlbWVudE1hcFtvdXRwdXRVbml0XTsKICAgICAgaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKICAgICAgICB1bml0VGV4dC53cml0ZSgnXG4gZWxlbWVudHM6Jyk7CiAgICAgICAgZm9yIChTdHJpbmcgZWxlbWVudCBpbiBlbGVtZW50cy4uc29ydCgpKSB7CiAgICAgICAgICB1bml0VGV4dC53cml0ZSgnXG4gICRlbGVtZW50Jyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIExpc3Q8U3RyaW5nPiBjb25zdGFudHMgPSBjb25zdGFudE1hcFtvdXRwdXRVbml0XTsKICAgICAgaWYgKGNvbnN0YW50cyAhPSBudWxsKSB7CiAgICAgICAgdW5pdFRleHQud3JpdGUoJ1xuIGNvbnN0YW50czonKTsKICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSBpbiBjb25zdGFudHMuLnNvcnQoKSkgewogICAgICAgICAgdW5pdFRleHQud3JpdGUoJ1xuICAkdmFsdWUnKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGV4dFtvdXRwdXRVbml0XSA9ICckdW5pdFRleHQnOwogICAgfQoKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAoT3V0cHV0VW5pdCBvdXRwdXRVbml0IGluIF9hbGxPdXRwdXRVbml0cy50b0xpc3QoKQogICAgICAuLnNvcnQoKGEsIGIpID0+IHRleHRbYV0uY29tcGFyZVRvKHRleHRbYl0pKSkgewogICAgICBzYi53cml0ZSgnXG5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicpOwogICAgICBzYi53cml0ZSgnT3V0cHV0IHVuaXQ6ICR7b3V0cHV0VW5pdC5uYW1lfScpOwogICAgICBzYi53cml0ZSgnXG4gJHt0ZXh0W291dHB1dFVuaXRdfScpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBJbXBvcnREZXNjcmlwdGlvbiB7CiAgLy8vIFJlbGF0aXZlIHVyaSB0byB0aGUgaW1wb3J0aW5nIGxpYnJhcnkuCiAgZmluYWwgU3RyaW5nIGltcG9ydGluZ1VyaTsKCiAgLy8vIFRoZSBwcmVmaXggdGhpcyBpbXBvcnQgaXMgaW1wb3J0ZWQgYXMuCiAgZmluYWwgU3RyaW5nIHByZWZpeDsKCiAgZmluYWwgTGlicmFyeUVudGl0eSBfaW1wb3J0aW5nTGlicmFyeTsKCiAgSW1wb3J0RGVzY3JpcHRpb24uaW50ZXJuYWwoCiAgICAgIHRoaXMuaW1wb3J0aW5nVXJpLCB0aGlzLnByZWZpeCwgdGhpcy5faW1wb3J0aW5nTGlicmFyeSk7CgogIEltcG9ydERlc2NyaXB0aW9uKAogICAgICBJbXBvcnRFbnRpdHkgaW1wb3J0LCBMaWJyYXJ5RW50aXR5IGltcG9ydGluZ0xpYnJhcnksIFVyaSBtYWluTGlicmFyeVVyaSkKICAgICAgOiB0aGlzLmludGVybmFsKAogICAgICAgICAgICBmZS5yZWxhdGl2aXplVXJpKAogICAgICAgICAgICAgICAgbWFpbkxpYnJhcnlVcmksIGltcG9ydGluZ0xpYnJhcnkuY2Fub25pY2FsVXJpLCBmYWxzZSksCiAgICAgICAgICAgIGltcG9ydC5uYW1lLAogICAgICAgICAgICBpbXBvcnRpbmdMaWJyYXJ5KTsKfQoKLy8vIEluZGlyZWN0bHkgcmVwcmVzZW50cyBhIGRlZmVycmVkIGltcG9ydCBpbiBhbiBbSW1wb3J0U2V0XS4KLy8vCi8vLyBXZSBjb3VsZCBkaXJlY3RseSBzdG9yZSB0aGUgW2RlY2xhcmF0aW9uXSBpbiBbSW1wb3J0U2V0XSwgYnV0IGFkZGluZyB0aGlzCi8vLyBjbGFzcyBtYWtlcyBzb21lIG9mIHRoZSBpbXBvcnQgc2V0IG9wZXJhdGlvbnMgbW9yZSBlZmZpY2llbnQuCmNsYXNzIF9EZWZlcnJlZEltcG9ydCB7CiAgZmluYWwgSW1wb3J0RW50aXR5IGRlY2xhcmF0aW9uOwoKICAvLy8gQ2Fub25pY2FsIGluZGV4IGFzc29jaWF0ZWQgd2l0aCBbZGVjbGFyYXRpb25dLiBUaGlzIGlzIHVzZWQgdG8gZWZmaWNpZW50bHkKICAvLy8gaW1wbGVtZW50IFtJbXBvcnRTZXRMYXR0aWNlLnVuaW9uXS4KICBmaW5hbCBpbnQgaW5kZXg7CgogIF9EZWZlcnJlZEltcG9ydCh0aGlzLmRlY2xhcmF0aW9uLCB0aGlzLmluZGV4KTsKfQoKLy8vIEEgY29tcGFjdCBsYXR0aWNlIHJlcHJlc2VudGF0aW9uIG9mIGltcG9ydCBzZXRzIGFuZCBzdWJzZXRzLgovLy8KLy8vIFdlIHVzZSBhIGdyYXBoIG9mIG5vZGVzIHRvIHJlcHJlc2VudCBlbGVtZW50cyBvZiB0aGUgbGF0dGljZSwgYnV0IG9ubHkKLy8vIGNyZWF0ZSBuZXcgbm9kZXMgb24tZGVtYW5kIGFzIHRoZXkgYXJlIG5lZWRlZCBieSB0aGUgZGVmZXJyZWQgbG9hZGluZwovLy8gYWxnb3JpdGhtLgovLy8KLy8vIFRoZSBjb25zdHJ1Y3Rpb25zIG9mIG5vZGVzIGlzIGNhcmVmdWxseSBkb25lIGJ5IHN0b3JpbmcgaW1wb3J0cyBpbiBhCi8vLyBzcGVjaWZpYyBvcmRlci4gVGhpcyBlbnN1cmVzIHRoYXQgd2UgaGF2ZSBhIHVuaXF1ZSBhbmQgY2Fub25pY2FsCi8vLyByZXByZXNlbnRhdGlvbiBmb3IgZWFjaCBzdWJzZXQuCmNsYXNzIEltcG9ydFNldExhdHRpY2UgewogIC8vLyBJbmRleCBvZiBkZWZlcnJlZCBpbXBvcnRzIHRoYXQgZGVmaW5lcyB0aGUgY2Fub25pY2FsIG9yZGVyIHVzZWQgYnkgdGhlCiAgLy8vIG9wZXJhdGlvbnMgYmVsb3cuCiAgTWFwPEltcG9ydEVudGl0eSwgX0RlZmVycmVkSW1wb3J0PiBfaW1wb3J0SW5kZXggPSB7fTsKCiAgLy8vIFRoZSBjYW5vbmljYWwgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSBlbXB0eSBpbXBvcnQgc2V0LgogIEltcG9ydFNldCBfZW1wdHlTZXQgPSBuZXcgSW1wb3J0U2V0KCk7CgogIC8vLyBUaGUgaW1wb3J0IHNldCByZXByZXNlbnRpbmcgdGhlIG1haW4gb3V0cHV0IHVuaXQsIHdoaWNoIGhhcHBlbnMgdG8gYmUKICAvLy8gaW1wbGVtZW50ZWQgYXMgYW4gZW1wdHkgc2V0IGluIG91ciBhbGdvcml0aG0uCiAgSW1wb3J0U2V0IGdldCBtYWluU2V0ID0+IF9lbXB0eVNldDsKCiAgLy8vIEdldCB0aGUgc2luZ2xldG9uIGltcG9ydCBzZXQgdGhhdCBvbmx5IGNvbnRhaW5zIFtpbXBvcnRdLgogIEltcG9ydFNldCBzaW5nbGV0b24oSW1wb3J0RW50aXR5IGltcG9ydCkgewogICAgLy8gRW5zdXJlIHdlIGhhdmUgaW1wb3J0IGluIHRoZSBpbmRleC4KICAgIHJldHVybiBfZW1wdHlTZXQuX2FkZChfd3JhcChpbXBvcnQpKTsKICB9CgogIC8vLyBHZXQgdGhlIGltcG9ydCBzZXQgdGhhdCBpbmNsdWRlcyB0aGUgdW5pb24gb2YgW2FdIGFuZCBbYl0uCiAgSW1wb3J0U2V0IHVuaW9uKEltcG9ydFNldCBhLCBJbXBvcnRTZXQgYikgewogICAgaWYgKGEgPT0gbnVsbCB8fCBhID09IF9lbXB0eVNldCkgcmV0dXJuIGI7CiAgICBpZiAoYiA9PSBudWxsIHx8IGIgPT0gX2VtcHR5U2V0KSByZXR1cm4gYTsKCiAgICAvLyBXZSBjcmVhdGUgdGhlIHVuaW9uIGJ5IG1lcmdpbmcgdGhlIGltcG9ydHMgaW4gY2Fub25pY2FsIG9yZGVyIGZpcnN0LCBhbmQKICAgIC8vIHRoZW4gZ2V0dGluZyAob3IgY3JlYXRpbmcpIHRoZSBjYW5vbmljYWwgc2V0cyBieSBhZGRpbmcgYW4gaW1wb3J0IGF0IGEKICAgIC8vIHRpbWUuCiAgICBMaXN0PF9EZWZlcnJlZEltcG9ydD4gYUltcG9ydHMgPSBhLl9pbXBvcnRzOwogICAgTGlzdDxfRGVmZXJyZWRJbXBvcnQ+IGJJbXBvcnRzID0gYi5faW1wb3J0czsKICAgIGludCBpID0gMCwgaiA9IDAsIGxhc3RBSW5kZXggPSAwLCBsYXN0QkluZGV4ID0gMDsKICAgIHZhciByZXN1bHQgPSBfZW1wdHlTZXQ7CiAgICB3aGlsZSAoaSA8IGFJbXBvcnRzLmxlbmd0aCAmJiBqIDwgYkltcG9ydHMubGVuZ3RoKSB7CiAgICAgIHZhciBpbXBvcnRBID0gYUltcG9ydHNbaV07CiAgICAgIHZhciBpbXBvcnRCID0gYkltcG9ydHNbal07CiAgICAgIGFzc2VydChsYXN0QUluZGV4IDw9IGltcG9ydEEuaW5kZXgpOwogICAgICBhc3NlcnQobGFzdEJJbmRleCA8PSBpbXBvcnRCLmluZGV4KTsKICAgICAgaWYgKGltcG9ydEEuaW5kZXggPCBpbXBvcnRCLmluZGV4KSB7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0Ll9hZGQoaW1wb3J0QSk7CiAgICAgICAgaSsrOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5fYWRkKGltcG9ydEIpOwogICAgICAgIGorKzsKICAgICAgfQogICAgfQogICAgZm9yICg7IGkgPCBhSW1wb3J0cy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHQgPSByZXN1bHQuX2FkZChhSW1wb3J0c1tpXSk7CiAgICB9CiAgICBmb3IgKDsgaiA8IGJJbXBvcnRzLmxlbmd0aDsgaisrKSB7CiAgICAgIHJlc3VsdCA9IHJlc3VsdC5fYWRkKGJJbXBvcnRzW2pdKTsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIEdldCB0aGUgaW5kZXggZm9yIGFuIFtpbXBvcnRdIGFjY29yZGluZyB0byB0aGUgY2Fub25pY2FsIG9yZGVyLgogIF9EZWZlcnJlZEltcG9ydCBfd3JhcChJbXBvcnRFbnRpdHkgaW1wb3J0KSB7CiAgICByZXR1cm4gX2ltcG9ydEluZGV4LnB1dElmQWJzZW50KAogICAgICAgIGltcG9ydCwgKCkgPT4gbmV3IF9EZWZlcnJlZEltcG9ydChpbXBvcnQsIF9pbXBvcnRJbmRleC5sZW5ndGgpKTsKICB9Cn0KCi8vLyBBIGNhbm9uaWNhbCBzZXQgb2YgZGVmZXJyZWQgaW1wb3J0cy4KY2xhc3MgSW1wb3J0U2V0IHsKICAvLy8gSW1wb3J0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgc2V0LgogIC8vLwogIC8vLyBJbnZhcmlhbnQ6IHRoZSBvcmRlciBpbiB3aGljaCBlbGVtZW50cyBhcmUgYWRkZWQgbXVzdCByZXNwZWN0IHRoZQogIC8vLyBjYW5vbmljYWwgb3JkZXIgb2YgYWxsIGltcG9ydHMgaW4gW0ltcG9ydFNldExhdHRpY2VdLgogIGZpbmFsIExpc3Q8X0RlZmVycmVkSW1wb3J0PiBfaW1wb3J0czsKCiAgLy8vIExpbmtzIHRvIG90aGVyIGltcG9ydCBzZXRzIGluIHRoZSBsYXR0aWNlIGJ5IGFkZGluZyBvbmUgaW1wb3J0LgogIGZpbmFsIE1hcDxfRGVmZXJyZWRJbXBvcnQsIEltcG9ydFNldD4gX3RyYW5zaXRpb25zID0KICAgICAgPF9EZWZlcnJlZEltcG9ydCwgSW1wb3J0U2V0Pnt9OwoKICBJbXBvcnRTZXQoW3RoaXMuX2ltcG9ydHMgPSBjb25zdCA8X0RlZmVycmVkSW1wb3J0PltdXSk7CgogIC8vLyBUaGUgb3V0cHV0IHVuaXQgY29ycmVzcG9uZGluZyB0byB0aGlzIHNldCBvZiBpbXBvcnRzLCBpZiBhbnkuCiAgT3V0cHV0VW5pdCB1bml0OwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfaW1wb3J0cy5sZW5ndGg7CgogIC8vLyBDcmVhdGUgYW4gaW1wb3J0IHNldCB0aGF0IGFkZHMgW2ltcG9ydF0gdG8gYWxsIHRoZSBpbXBvcnRzIG9uIHRoaXMgc2V0LgogIC8vLyBUaGlzIGFzc3VtZXMgdGhhdCBpbXBvcnQncyBjYW5vbmljYWwgb3JkZXIgY29tZXMgYWZ0ZXIgYWxsIGltcG9ydHMgaW4KICAvLy8gdGhpcyBjdXJyZW50IHNldC4gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBbSW1wb3J0U2V0TGF0dGljZV0sCiAgLy8vIHNpbmNlIGl0IGlzIHdoZXJlIHdlIHByZXNlcnZlIHRoaXMgaW52YXJpYW50LgogIEltcG9ydFNldCBfYWRkKF9EZWZlcnJlZEltcG9ydCBpbXBvcnQpIHsKICAgIEltcG9ydFNldCByZXN1bHQgPSBfdHJhbnNpdGlvbnNbaW1wb3J0XTsKICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewogICAgICByZXN1bHQgPSBuZXcgSW1wb3J0U2V0KG5ldyBMaXN0LmZyb20oX2ltcG9ydHMpLi5hZGQoaW1wb3J0KSk7CiAgICAgIHJlc3VsdC5fdHJhbnNpdGlvbnNbaW1wb3J0XSA9IHJlc3VsdDsKICAgICAgX3RyYW5zaXRpb25zW2ltcG9ydF0gPSByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ0ltcG9ydFNldChzaXplOiAkbGVuZ3RoLCAnKTsKICAgIGZvciAodmFyIGltcG9ydCBpbiBfaW1wb3J0cykgewogICAgICBzYi53cml0ZSgnJHtpbXBvcnQuZGVjbGFyYXRpb24ubmFtZX0gJyk7CiAgICB9CiAgICBzYi53cml0ZSgnKScpOwogICAgcmV0dXJuICckc2InOwogIH0KfQoKLy8vIFRoZSBhbGdvcml0aG0gd29yayBxdWV1ZS4KY2xhc3MgV29ya1F1ZXVlIHsKICAvLy8gVGhlIGFjdHVhbCBxdWV1ZSBvZiB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZS4KICBmaW5hbCBRdWV1ZTxXb3JrSXRlbT4gcXVldWUgPSBuZXcgUXVldWU8V29ya0l0ZW0+KCk7CgogIC8vLyBBbiBpbmRleCB0byBmaW5kIHdvcmsgaXRlbXMgaW4gdGhlIHF1ZXVlIGNvcnJlc3BvbmRpbmcgdG8gYSBjbGFzcy4KICBmaW5hbCBNYXA8Q2xhc3NFbnRpdHksIFdvcmtJdGVtPiBwZW5kaW5nQ2xhc3NlcyA9IDxDbGFzc0VudGl0eSwgV29ya0l0ZW0+e307CgogIC8vLyBBbiBpbmRleCB0byBmaW5kIHdvcmsgaXRlbXMgaW4gdGhlIHF1ZXVlIGNvcnJlc3BvbmRpbmcgdG8gYSBtZW1iZXIuCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgV29ya0l0ZW0+IHBlbmRpbmdNZW1iZXJzID0gPE1lbWJlckVudGl0eSwgV29ya0l0ZW0+e307CgogIC8vLyBBbiBpbmRleCB0byBmaW5kIHdvcmsgaXRlbXMgaW4gdGhlIHF1ZXVlIGNvcnJlc3BvbmRpbmcgdG8gYSBjb25zdGFudC4KICBmaW5hbCBNYXA8Q29uc3RhbnRWYWx1ZSwgV29ya0l0ZW0+IHBlbmRpbmdDb25zdGFudHMgPQogICAgICA8Q29uc3RhbnRWYWx1ZSwgV29ya0l0ZW0+e307CgogIC8vLyBMYXR0aWNlIHVzZWQgdG8gY29tcHV0ZSB1bmlvbnMgb2YgW0ltcG9ydFNldF1zLgogIGZpbmFsIEltcG9ydFNldExhdHRpY2UgX2ltcG9ydFNldHM7CgogIFdvcmtRdWV1ZSh0aGlzLl9pbXBvcnRTZXRzKTsKCiAgLy8vIFdoZXRoZXIgdGhlcmUgYXJlIG5vIG1vcmUgd29yayBpdGVtcyBpbiB0aGUgcXVldWUuCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBxdWV1ZS5pc05vdEVtcHR5OwoKICAvLy8gUG9wIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIHF1ZXVlLgogIFdvcmtJdGVtIG5leHRJdGVtKCkgewogICAgYXNzZXJ0KGlzTm90RW1wdHkpOwogICAgcmV0dXJuIHF1ZXVlLnJlbW92ZUZpcnN0KCk7CiAgfQoKICAvLy8gQWRkIHRvIHRoZSBxdWV1ZSB0aGF0IFtlbGVtZW50XSBzaG91bGQgYmUgdXBkYXRlZCB0byBpbmNsdWRlIGFsbCBpbXBvcnRzCiAgLy8vIGluIFtpbXBvcnRTZXRdLiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgd29yayBpdGVtIGluIHRoZSBxdWV1ZSBmb3IKICAvLy8gW2VsZW1lbnRdLCB0aGlzIG1ha2VzIHN1cmUgdGhhdCB0aGUgd29yayBpdGVtIG5vdyBpbmNsdWRlcyB0aGUgdW5pb24gb2YKICAvLy8gW2ltcG9ydFNldF0gYW5kIHRoZSBleGlzdGluZyB3b3JrIGl0ZW0ncyBpbXBvcnQgc2V0LgogIHZvaWQgYWRkQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCwgSW1wb3J0U2V0IGltcG9ydFNldCkgewogICAgdmFyIGl0ZW0gPSBwZW5kaW5nQ2xhc3Nlc1tlbGVtZW50XTsKICAgIGlmIChpdGVtID09IG51bGwpIHsKICAgICAgaXRlbSA9IG5ldyBDbGFzc1dvcmtJdGVtKGVsZW1lbnQsIGltcG9ydFNldCk7CiAgICAgIHBlbmRpbmdDbGFzc2VzW2VsZW1lbnRdID0gaXRlbTsKICAgICAgcXVldWUuYWRkKGl0ZW0pOwogICAgfSBlbHNlIHsKICAgICAgaXRlbS5pbXBvcnRzVG9BZGQgPSBfaW1wb3J0U2V0cy51bmlvbihpdGVtLmltcG9ydHNUb0FkZCwgaW1wb3J0U2V0KTsKICAgIH0KICB9CgogIC8vLyBBZGQgdG8gdGhlIHF1ZXVlIHRoYXQgW2VsZW1lbnRdIHNob3VsZCBiZSB1cGRhdGVkIHRvIGluY2x1ZGUgYWxsIGltcG9ydHMKICAvLy8gaW4gW2ltcG9ydFNldF0uIElmIHRoZXJlIGlzIGFscmVhZHkgYSB3b3JrIGl0ZW0gaW4gdGhlIHF1ZXVlIGZvcgogIC8vLyBbZWxlbWVudF0sIHRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSB3b3JrIGl0ZW0gbm93IGluY2x1ZGVzIHRoZSB1bmlvbiBvZgogIC8vLyBbaW1wb3J0U2V0XSBhbmQgdGhlIGV4aXN0aW5nIHdvcmsgaXRlbSdzIGltcG9ydCBzZXQuCiAgdm9pZCBhZGRNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQsIEltcG9ydFNldCBpbXBvcnRTZXQpIHsKICAgIHZhciBpdGVtID0gcGVuZGluZ01lbWJlcnNbZWxlbWVudF07CiAgICBpZiAoaXRlbSA9PSBudWxsKSB7CiAgICAgIGl0ZW0gPSBuZXcgTWVtYmVyV29ya0l0ZW0oZWxlbWVudCwgaW1wb3J0U2V0KTsKICAgICAgcGVuZGluZ01lbWJlcnNbZWxlbWVudF0gPSBpdGVtOwogICAgICBxdWV1ZS5hZGQoaXRlbSk7CiAgICB9IGVsc2UgewogICAgICBpdGVtLmltcG9ydHNUb0FkZCA9IF9pbXBvcnRTZXRzLnVuaW9uKGl0ZW0uaW1wb3J0c1RvQWRkLCBpbXBvcnRTZXQpOwogICAgfQogIH0KCiAgLy8vIEFkZCB0byB0aGUgcXVldWUgdGhhdCBbY29uc3RhbnRdIHNob3VsZCBiZSB1cGRhdGVkIHRvIGluY2x1ZGUgYWxsIGltcG9ydHMKICAvLy8gaW4gW2ltcG9ydFNldF0uIElmIHRoZXJlIGlzIGFscmVhZHkgYSB3b3JrIGl0ZW0gaW4gdGhlIHF1ZXVlIGZvcgogIC8vLyBbY29uc3RhbnRdLCB0aGlzIG1ha2VzIHN1cmUgdGhhdCB0aGUgd29yayBpdGVtIG5vdyBpbmNsdWRlcyB0aGUgdW5pb24gb2YKICAvLy8gW2ltcG9ydFNldF0gYW5kIHRoZSBleGlzdGluZyB3b3JrIGl0ZW0ncyBpbXBvcnQgc2V0LgogIHZvaWQgYWRkQ29uc3RhbnQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSW1wb3J0U2V0IGltcG9ydFNldCkgewogICAgdmFyIGl0ZW0gPSBwZW5kaW5nQ29uc3RhbnRzW2NvbnN0YW50XTsKICAgIGlmIChpdGVtID09IG51bGwpIHsKICAgICAgaXRlbSA9IG5ldyBDb25zdGFudFdvcmtJdGVtKGNvbnN0YW50LCBpbXBvcnRTZXQpOwogICAgICBwZW5kaW5nQ29uc3RhbnRzW2NvbnN0YW50XSA9IGl0ZW07CiAgICAgIHF1ZXVlLmFkZChpdGVtKTsKICAgIH0gZWxzZSB7CiAgICAgIGl0ZW0uaW1wb3J0c1RvQWRkID0gX2ltcG9ydFNldHMudW5pb24oaXRlbS5pbXBvcnRzVG9BZGQsIGltcG9ydFNldCk7CiAgICB9CiAgfQp9CgovLy8gU3VtbWFyeSBvZiB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgb24gYSBjbGFzcywgbWVtYmVyLCBvciBjb25zdGFudC4KYWJzdHJhY3QgY2xhc3MgV29ya0l0ZW0gewogIC8vLyBBZGRpdGlvbmFsIGltcG9ydHMgdGhhdCB1c2UgW2VsZW1lbnRdIG9yIFt2YWx1ZV0gYW5kIG5lZWQgdG8gYmUgYWRkZWQgYnkKICAvLy8gdGhlIGFsZ29yaXRobS4KICAvLy8KICAvLy8gVGhpcyBpcyBub24tZmluYWwgaW4gY2FzZSB3ZSBhZGQgbW9yZSBkZWZlcnJlZCBpbXBvcnRzIHRvIHRoZSBzZXQgYmVmb3JlCiAgLy8vIHRoZSB3b3JrIGl0ZW0gaXMgYXBwbGllZCAoc2VlIFtXb3JrUXVldWUuYWRkRWxlbWVudF0gYW5kCiAgLy8vIFtXb3JrUXVldWUuYWRkQ29uc3RhbnRdKS4KICBJbXBvcnRTZXQgaW1wb3J0c1RvQWRkOwoKICBXb3JrSXRlbSh0aGlzLmltcG9ydHNUb0FkZCk7CgogIHZvaWQgdXBkYXRlKERlZmVycmVkTG9hZFRhc2sgdGFzaywgS0Nsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBXb3JrUXVldWUgcXVldWUpOwp9CgovLy8gU3VtbWFyeSBvZiB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgb24gYSBjbGFzcy4KY2xhc3MgQ2xhc3NXb3JrSXRlbSBleHRlbmRzIFdvcmtJdGVtIHsKICAvLy8gQ2xhc3MgdG8gYmUgcmVjdXJzaXZlbHkgdXBkYXRlZC4KICBmaW5hbCBDbGFzc0VudGl0eSBjbHM7CgogIENsYXNzV29ya0l0ZW0odGhpcy5jbHMsIEltcG9ydFNldCBuZXdTZXQpIDogc3VwZXIobmV3U2V0KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB1cGRhdGUoCiAgICAgIERlZmVycmVkTG9hZFRhc2sgdGFzaywgS0Nsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBXb3JrUXVldWUgcXVldWUpIHsKICAgIHF1ZXVlLnBlbmRpbmdDbGFzc2VzLnJlbW92ZShjbHMpOwogICAgSW1wb3J0U2V0IG9sZFNldCA9IHRhc2suX2NsYXNzVG9TZXRbY2xzXTsKICAgIEltcG9ydFNldCBuZXdTZXQgPSB0YXNrLmltcG9ydFNldHMudW5pb24ob2xkU2V0LCBpbXBvcnRzVG9BZGQpOwogICAgdGFzay5fdXBkYXRlQ2xhc3NSZWN1cnNpdmUoY2xvc2VkV29ybGQsIGNscywgb2xkU2V0LCBuZXdTZXQsIHF1ZXVlKTsKICB9Cn0KCi8vLyBTdW1tYXJ5IG9mIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBvbiBhIG1lbWJlci4KY2xhc3MgTWVtYmVyV29ya0l0ZW0gZXh0ZW5kcyBXb3JrSXRlbSB7CiAgLy8vIE1lbWJlciB0byBiZSByZWN1cnNpdmVseSB1cGRhdGVkLgogIGZpbmFsIE1lbWJlckVudGl0eSBtZW1iZXI7CgogIE1lbWJlcldvcmtJdGVtKHRoaXMubWVtYmVyLCBJbXBvcnRTZXQgbmV3U2V0KSA6IHN1cGVyKG5ld1NldCk7CgogIEBvdmVycmlkZQogIHZvaWQgdXBkYXRlKAogICAgICBEZWZlcnJlZExvYWRUYXNrIHRhc2ssIEtDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwgV29ya1F1ZXVlIHF1ZXVlKSB7CiAgICBxdWV1ZS5wZW5kaW5nTWVtYmVycy5yZW1vdmUobWVtYmVyKTsKICAgIEltcG9ydFNldCBvbGRTZXQgPSB0YXNrLl9tZW1iZXJUb1NldFttZW1iZXJdOwogICAgSW1wb3J0U2V0IG5ld1NldCA9IHRhc2suaW1wb3J0U2V0cy51bmlvbihvbGRTZXQsIGltcG9ydHNUb0FkZCk7CiAgICB0YXNrLl91cGRhdGVNZW1iZXJSZWN1cnNpdmUoY2xvc2VkV29ybGQsIG1lbWJlciwgb2xkU2V0LCBuZXdTZXQsIHF1ZXVlKTsKICB9Cn0KCi8vLyBTdW1tYXJ5IG9mIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBvbiBhIGNvbnN0YW50LgpjbGFzcyBDb25zdGFudFdvcmtJdGVtIGV4dGVuZHMgV29ya0l0ZW0gewogIC8vLyBDb25zdGFudCB0byBiZSByZWN1cnNpdmVseSB1cGRhdGVkLgogIGZpbmFsIENvbnN0YW50VmFsdWUgY29uc3RhbnQ7CgogIENvbnN0YW50V29ya0l0ZW0odGhpcy5jb25zdGFudCwgSW1wb3J0U2V0IG5ld1NldCkgOiBzdXBlcihuZXdTZXQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHVwZGF0ZSgKICAgICAgRGVmZXJyZWRMb2FkVGFzayB0YXNrLCBLQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIFdvcmtRdWV1ZSBxdWV1ZSkgewogICAgcXVldWUucGVuZGluZ0NvbnN0YW50cy5yZW1vdmUoY29uc3RhbnQpOwogICAgSW1wb3J0U2V0IG9sZFNldCA9IHRhc2suX2NvbnN0YW50VG9TZXRbY29uc3RhbnRdOwogICAgSW1wb3J0U2V0IG5ld1NldCA9IHRhc2suaW1wb3J0U2V0cy51bmlvbihvbGRTZXQsIGltcG9ydHNUb0FkZCk7CiAgICB0YXNrLl91cGRhdGVDb25zdGFudFJlY3Vyc2l2ZShjbG9zZWRXb3JsZCwgY29uc3RhbnQsIG9sZFNldCwgbmV3U2V0LCBxdWV1ZSk7CiAgfQp9CgovLy8gSW50ZXJmYWNlIGZvciB1cGRhdGluZyBhbiBbT3V0cHV0VW5pdERhdGFdIG9iamVjdCB3aXRoIGRhdGEgZm9yIGxhdGUKLy8vIG1lbWJlcnMsIHRoYXQgaXMsIG1lbWJlcnMgY3JlYXRlZCBvbiBkZW1hbmQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KY2xhc3MgTGF0ZU91dHB1dFVuaXREYXRhQnVpbGRlciB7CiAgZmluYWwgT3V0cHV0VW5pdERhdGEgX291dHB1dFVuaXREYXRhOwoKICBMYXRlT3V0cHV0VW5pdERhdGFCdWlsZGVyKHRoaXMuX291dHB1dFVuaXREYXRhKTsKCiAgLy8vIFJlZ2lzdGVycyBbbmV3RW50aXR5XSB0byBiZSBlbWl0dGVkIGluIHRoZSBzYW1lIG91dHB1dCB1bml0IGFzCiAgLy8vIFtleGlzdGluZ0VudGl0eV07CiAgdm9pZCByZWdpc3RlckNvbG9jYXRlZE1lbWJlcnMoCiAgICAgIE1lbWJlckVudGl0eSBleGlzdGluZ0VudGl0eSwgTWVtYmVyRW50aXR5IG5ld0VudGl0eSkgewogICAgYXNzZXJ0KF9vdXRwdXRVbml0RGF0YS5fbWVtYmVyVG9Vbml0W25ld0VudGl0eV0gPT0gbnVsbCk7CiAgICBfb3V0cHV0VW5pdERhdGEuX21lbWJlclRvVW5pdFtuZXdFbnRpdHldID0KICAgICAgICBfb3V0cHV0VW5pdERhdGEub3V0cHV0VW5pdEZvck1lbWJlcihleGlzdGluZ0VudGl0eSk7CiAgfQp9CgovLy8gUmVzdWx0cyBvZiB0aGUgZGVmZXJyZWQgbG9hZGluZyBhbGdvcml0aG0uCi8vLwovLy8gUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG91dHB1dCB1bml0IGFzc29jaWF0ZWQgd2l0aCBlbnRpdGllcyBhbmQKLy8vIGNvbnN0YW50cywgYXMgd2VsbCBhcyBvdGhlciBoZWxwZXIgbWV0aG9kcy4KLy8gVE9ETyhzaWdtdW5kKTogY29uc2lkZXIgbW92aW5nIGhlcmUgZXZlcnkgcGllY2Ugb2YgZGF0YSB1c2VkIGFzIGEgcmVzdWx0IG9mCi8vIGRlZmVycmVkIGxvYWRpbmcgKGluY2x1ZGluZyBodW5rc1RvTG9hZCwgZXRjKS4KY2xhc3MgT3V0cHV0VW5pdERhdGEgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbT3V0cHV0VW5pdERhdGFdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnb3V0cHV0LXVuaXQtZGF0YSc7CgogIGZpbmFsIGJvb2wgaXNQcm9ncmFtU3BsaXQ7CiAgZmluYWwgT3V0cHV0VW5pdCBtYWluT3V0cHV0VW5pdDsKICBmaW5hbCBNYXA8Q2xhc3NFbnRpdHksIE91dHB1dFVuaXQ+IF9jbGFzc1RvVW5pdDsKICBmaW5hbCBNYXA8TWVtYmVyRW50aXR5LCBPdXRwdXRVbml0PiBfbWVtYmVyVG9Vbml0OwogIGZpbmFsIE1hcDxMb2NhbCwgT3V0cHV0VW5pdD4gX2xvY2FsRnVuY3Rpb25Ub1VuaXQ7CiAgZmluYWwgTWFwPENvbnN0YW50VmFsdWUsIE91dHB1dFVuaXQ+IF9jb25zdGFudFRvVW5pdDsKICBmaW5hbCBMaXN0PE91dHB1dFVuaXQ+IG91dHB1dFVuaXRzOwogIGZpbmFsIE1hcDxJbXBvcnRFbnRpdHksIFN0cmluZz4gX2ltcG9ydERlZmVyTmFtZTsKCiAgLy8vIEEgbWFwcGluZyBmcm9tIHRoZSBuYW1lIG9mIGEgZGVmZXIgaW1wb3J0IHRvIGFsbCB0aGUgb3V0cHV0IHVuaXRzIGl0CiAgLy8vIGRlcGVuZHMgb24gaW4gYSBsaXN0IG9mIGxpc3RzIHRvIGJlIGxvYWRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlIHsibGliMSI6IFtbbGliMV9saWIyX2xpYjNdLCBbbGliMV9saWIyLCBsaWIxX2xpYjNdLAogIC8vLyBbbGliMV1dfSB3b3VsZCBtZWFuIHRoYXQgaW4gb3JkZXIgdG8gbG9hZCAibGliMSIgZmlyc3QgdGhlIGh1bmsKICAvLy8gbGliMV9saWIyX2xpYjIgc2hvdWxkIGJlIGxvYWRlZCwgdGhlbiB0aGUgaHVua3MgbGliMV9saWIyIGFuZCBsaWIxX2xpYjMKICAvLy8gY2FuIGJlIGxvYWRlZCBpbiBwYXJhbGxlbC4gQW5kIGZpbmFsbHkgbGliMSBjYW4gYmUgbG9hZGVkLgogIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8T3V0cHV0VW5pdD4+IGh1bmtzVG9Mb2FkOwoKICAvLy8gQmVjYXVzZSB0aGUgdG9rZW4tc3RyZWFtIGlzIGZvcmdvdHRlbiBsYXRlciBpbiB0aGUgcHJvZ3JhbSwgd2UgY2FjaGUgYQogIC8vLyBkZXNjcmlwdGlvbiBvZiBlYWNoIGRlZmVycmVkIGltcG9ydC4KICBmaW5hbCBNYXA8SW1wb3J0RW50aXR5LCBJbXBvcnREZXNjcmlwdGlvbj4gX2RlZmVycmVkSW1wb3J0RGVzY3JpcHRpb25zOwoKICBPdXRwdXRVbml0RGF0YSgKICAgICAgdGhpcy5pc1Byb2dyYW1TcGxpdCwKICAgICAgdGhpcy5tYWluT3V0cHV0VW5pdCwKICAgICAgdGhpcy5fY2xhc3NUb1VuaXQsCiAgICAgIHRoaXMuX21lbWJlclRvVW5pdCwKICAgICAgdGhpcy5fbG9jYWxGdW5jdGlvblRvVW5pdCwKICAgICAgdGhpcy5fY29uc3RhbnRUb1VuaXQsCiAgICAgIHRoaXMub3V0cHV0VW5pdHMsCiAgICAgIHRoaXMuX2ltcG9ydERlZmVyTmFtZSwKICAgICAgdGhpcy5odW5rc1RvTG9hZCwKICAgICAgdGhpcy5fZGVmZXJyZWRJbXBvcnREZXNjcmlwdGlvbnMpOwoKICAvLyBDcmVhdGVzIEotd29ybGQgZGF0YSBmcm9tIHRoZSBLLXdvcmxkIGRhdGEuCiAgZmFjdG9yeSBPdXRwdXRVbml0RGF0YS5mcm9tKAogICAgICBPdXRwdXRVbml0RGF0YSBvdGhlciwKICAgICAgTGlicmFyeUVudGl0eSBjb252ZXJ0TGlicmFyeShMaWJyYXJ5RW50aXR5IGxpYnJhcnkpLAogICAgICBNYXA8Q2xhc3NFbnRpdHksIE91dHB1dFVuaXQ+IEZ1bmN0aW9uKAogICAgICAgICAgICAgIE1hcDxDbGFzc0VudGl0eSwgT3V0cHV0VW5pdD4sIE1hcDxMb2NhbCwgT3V0cHV0VW5pdD4pCiAgICAgICAgICBjb252ZXJ0Q2xhc3NNYXAsCiAgICAgIE1hcDxNZW1iZXJFbnRpdHksIE91dHB1dFVuaXQ+IEZ1bmN0aW9uKAogICAgICAgICAgICAgIE1hcDxNZW1iZXJFbnRpdHksIE91dHB1dFVuaXQ+LCBNYXA8TG9jYWwsIE91dHB1dFVuaXQ+KQogICAgICAgICAgY29udmVydE1lbWJlck1hcCwKICAgICAgTWFwPENvbnN0YW50VmFsdWUsIE91dHB1dFVuaXQ+IEZ1bmN0aW9uKE1hcDxDb25zdGFudFZhbHVlLCBPdXRwdXRVbml0PikKICAgICAgICAgIGNvbnZlcnRDb25zdGFudE1hcCkgewogICAgTWFwPENsYXNzRW50aXR5LCBPdXRwdXRVbml0PiBjbGFzc1RvVW5pdCA9CiAgICAgICAgY29udmVydENsYXNzTWFwKG90aGVyLl9jbGFzc1RvVW5pdCwgb3RoZXIuX2xvY2FsRnVuY3Rpb25Ub1VuaXQpOwogICAgTWFwPE1lbWJlckVudGl0eSwgT3V0cHV0VW5pdD4gbWVtYmVyVG9Vbml0ID0KICAgICAgICBjb252ZXJ0TWVtYmVyTWFwKG90aGVyLl9tZW1iZXJUb1VuaXQsIG90aGVyLl9sb2NhbEZ1bmN0aW9uVG9Vbml0KTsKICAgIE1hcDxDb25zdGFudFZhbHVlLCBPdXRwdXRVbml0PiBjb25zdGFudFRvVW5pdCA9CiAgICAgICAgY29udmVydENvbnN0YW50TWFwKG90aGVyLl9jb25zdGFudFRvVW5pdCk7CiAgICBNYXA8SW1wb3J0RW50aXR5LCBJbXBvcnREZXNjcmlwdGlvbj4gZGVmZXJyZWRJbXBvcnREZXNjcmlwdGlvbnMgPSB7fTsKICAgIG90aGVyLl9kZWZlcnJlZEltcG9ydERlc2NyaXB0aW9ucwogICAgICAgIC5mb3JFYWNoKChJbXBvcnRFbnRpdHkgaW1wb3J0LCBJbXBvcnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewogICAgICBkZWZlcnJlZEltcG9ydERlc2NyaXB0aW9uc1tpbXBvcnRdID0gbmV3IEltcG9ydERlc2NyaXB0aW9uLmludGVybmFsKAogICAgICAgICAgZGVzY3JpcHRpb24uaW1wb3J0aW5nVXJpLAogICAgICAgICAgZGVzY3JpcHRpb24ucHJlZml4LAogICAgICAgICAgY29udmVydExpYnJhcnkoZGVzY3JpcHRpb24uX2ltcG9ydGluZ0xpYnJhcnkpKTsKICAgIH0pOwoKICAgIHJldHVybiBuZXcgT3V0cHV0VW5pdERhdGEoCiAgICAgICAgb3RoZXIuaXNQcm9ncmFtU3BsaXQsCiAgICAgICAgb3RoZXIubWFpbk91dHB1dFVuaXQsCiAgICAgICAgY2xhc3NUb1VuaXQsCiAgICAgICAgbWVtYmVyVG9Vbml0LAogICAgICAgIC8vIExvY2FsIGZ1bmN0aW9ucyBvbmx5IG1ha2Ugc2Vuc2UgaW4gdGhlIEstd29ybGQgbW9kZWwuCiAgICAgICAgY29uc3QgPExvY2FsLCBPdXRwdXRVbml0Pnt9LAogICAgICAgIGNvbnN0YW50VG9Vbml0LAogICAgICAgIG90aGVyLm91dHB1dFVuaXRzLAogICAgICAgIG90aGVyLl9pbXBvcnREZWZlck5hbWUsCiAgICAgICAgb3RoZXIuaHVua3NUb0xvYWQsCiAgICAgICAgZGVmZXJyZWRJbXBvcnREZXNjcmlwdGlvbnMpOwogIH0KCiAgLy8vIERlc2VyaWFsaXplcyBhbiBbT3V0cHV0VW5pdERhdGFdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgT3V0cHV0VW5pdERhdGEucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGJvb2wgaXNQcm9ncmFtU3BsaXQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIExpc3Q8T3V0cHV0VW5pdD4gb3V0cHV0VW5pdHMgPSBzb3VyY2UucmVhZExpc3QoKCkgewogICAgICBib29sIGlzTWFpbk91dHB1dCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgIFNldDxJbXBvcnRFbnRpdHk+IGltcG9ydFNldCA9IHNvdXJjZS5yZWFkSW1wb3J0cygpLnRvU2V0KCk7CiAgICAgIHJldHVybiBuZXcgT3V0cHV0VW5pdChpc01haW5PdXRwdXQsIG5hbWUsIGltcG9ydFNldCk7CiAgICB9KTsKICAgIE91dHB1dFVuaXQgbWFpbk91dHB1dFVuaXQgPSBvdXRwdXRVbml0c1tzb3VyY2UucmVhZEludCgpXTsKCiAgICBNYXA8Q2xhc3NFbnRpdHksIE91dHB1dFVuaXQ+IGNsYXNzVG9Vbml0ID0gc291cmNlLnJlYWRDbGFzc01hcCgoKSB7CiAgICAgIHJldHVybiBvdXRwdXRVbml0c1tzb3VyY2UucmVhZEludCgpXTsKICAgIH0pOwogICAgTWFwPE1lbWJlckVudGl0eSwgT3V0cHV0VW5pdD4gbWVtYmVyVG9Vbml0ID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlck1hcCgoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICByZXR1cm4gb3V0cHV0VW5pdHNbc291cmNlLnJlYWRJbnQoKV07CiAgICB9KTsKICAgIE1hcDxDb25zdGFudFZhbHVlLCBPdXRwdXRVbml0PiBjb25zdGFudFRvVW5pdCA9IHNvdXJjZS5yZWFkQ29uc3RhbnRNYXAoKCkgewogICAgICByZXR1cm4gb3V0cHV0VW5pdHNbc291cmNlLnJlYWRJbnQoKV07CiAgICB9KTsKICAgIE1hcDxJbXBvcnRFbnRpdHksIFN0cmluZz4gaW1wb3J0RGVmZXJOYW1lID0KICAgICAgICBzb3VyY2UucmVhZEltcG9ydE1hcChzb3VyY2UucmVhZFN0cmluZyk7CiAgICBNYXA8U3RyaW5nLCBMaXN0PE91dHB1dFVuaXQ+PiBodW5rc1RvTG9hZCA9IHNvdXJjZS5yZWFkU3RyaW5nTWFwKCgpIHsKICAgICAgcmV0dXJuIHNvdXJjZS5yZWFkTGlzdCgoKSB7CiAgICAgICAgcmV0dXJuIG91dHB1dFVuaXRzW3NvdXJjZS5yZWFkSW50KCldOwogICAgICB9KTsKICAgIH0pOwogICAgTWFwPEltcG9ydEVudGl0eSwgSW1wb3J0RGVzY3JpcHRpb24+IGRlZmVycmVkSW1wb3J0RGVzY3JpcHRpb25zID0KICAgICAgICBzb3VyY2UucmVhZEltcG9ydE1hcCgoKSB7CiAgICAgIFN0cmluZyBpbXBvcnRpbmdVcmkgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICBTdHJpbmcgcHJlZml4ID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgTGlicmFyeUVudGl0eSBpbXBvcnRpbmdMaWJyYXJ5ID0gc291cmNlLnJlYWRMaWJyYXJ5KCk7CiAgICAgIHJldHVybiBuZXcgSW1wb3J0RGVzY3JpcHRpb24uaW50ZXJuYWwoCiAgICAgICAgICBpbXBvcnRpbmdVcmksIHByZWZpeCwgaW1wb3J0aW5nTGlicmFyeSk7CiAgICB9KTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgT3V0cHV0VW5pdERhdGEoCiAgICAgICAgaXNQcm9ncmFtU3BsaXQsCiAgICAgICAgbWFpbk91dHB1dFVuaXQsCiAgICAgICAgY2xhc3NUb1VuaXQsCiAgICAgICAgbWVtYmVyVG9Vbml0LAogICAgICAgIC8vIExvY2FsIGZ1bmN0aW9ucyBvbmx5IG1ha2Ugc2Vuc2UgaW4gdGhlIEstd29ybGQgbW9kZWwuCiAgICAgICAgY29uc3QgPExvY2FsLCBPdXRwdXRVbml0Pnt9LAogICAgICAgIGNvbnN0YW50VG9Vbml0LAogICAgICAgIG91dHB1dFVuaXRzLAogICAgICAgIGltcG9ydERlZmVyTmFtZSwKICAgICAgICBodW5rc1RvTG9hZCwKICAgICAgICBkZWZlcnJlZEltcG9ydERlc2NyaXB0aW9ucyk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtPdXRwdXRVbml0RGF0YV0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVCb29sKGlzUHJvZ3JhbVNwbGl0KTsKICAgIE1hcDxPdXRwdXRVbml0LCBpbnQ+IG91dHB1dFVuaXRJbmRpY2VzID0ge307CiAgICBzaW5rLndyaXRlTGlzdChvdXRwdXRVbml0cywgKE91dHB1dFVuaXQgb3V0cHV0VW5pdCkgewogICAgICBvdXRwdXRVbml0SW5kaWNlc1tvdXRwdXRVbml0XSA9IG91dHB1dFVuaXRJbmRpY2VzLmxlbmd0aDsKICAgICAgc2luay53cml0ZUJvb2wob3V0cHV0VW5pdC5pc01haW5PdXRwdXQpOwogICAgICBzaW5rLndyaXRlU3RyaW5nKG91dHB1dFVuaXQubmFtZSk7CiAgICAgIHNpbmsud3JpdGVJbXBvcnRzKG91dHB1dFVuaXQuX2ltcG9ydHMpOwogICAgfSk7CiAgICBzaW5rLndyaXRlSW50KG91dHB1dFVuaXRJbmRpY2VzW21haW5PdXRwdXRVbml0XSk7CiAgICBzaW5rLndyaXRlQ2xhc3NNYXAoX2NsYXNzVG9Vbml0LCAoT3V0cHV0VW5pdCBvdXRwdXRVbml0KSB7CiAgICAgIHNpbmsud3JpdGVJbnQob3V0cHV0VW5pdEluZGljZXNbb3V0cHV0VW5pdF0pOwogICAgfSk7CiAgICBzaW5rLndyaXRlTWVtYmVyTWFwKF9tZW1iZXJUb1VuaXQsCiAgICAgICAgKE1lbWJlckVudGl0eSBtZW1iZXIsIE91dHB1dFVuaXQgb3V0cHV0VW5pdCkgewogICAgICBzaW5rLndyaXRlSW50KG91dHB1dFVuaXRJbmRpY2VzW291dHB1dFVuaXRdKTsKICAgIH0pOwogICAgc2luay53cml0ZUNvbnN0YW50TWFwKF9jb25zdGFudFRvVW5pdCwgKE91dHB1dFVuaXQgb3V0cHV0VW5pdCkgewogICAgICBzaW5rLndyaXRlSW50KG91dHB1dFVuaXRJbmRpY2VzW291dHB1dFVuaXRdKTsKICAgIH0pOwogICAgc2luay53cml0ZUltcG9ydE1hcChfaW1wb3J0RGVmZXJOYW1lLCBzaW5rLndyaXRlU3RyaW5nKTsKICAgIHNpbmsud3JpdGVTdHJpbmdNYXAoaHVua3NUb0xvYWQsIChMaXN0PE91dHB1dFVuaXQ+IG91dHB1dFVuaXRzKSB7CiAgICAgIHNpbmsud3JpdGVMaXN0KAogICAgICAgICAgb3V0cHV0VW5pdHMsCiAgICAgICAgICAoT3V0cHV0VW5pdCBvdXRwdXRVbml0KSA9PgogICAgICAgICAgICAgIHNpbmsud3JpdGVJbnQob3V0cHV0VW5pdEluZGljZXNbb3V0cHV0VW5pdF0pKTsKICAgIH0pOwogICAgc2luay53cml0ZUltcG9ydE1hcChfZGVmZXJyZWRJbXBvcnREZXNjcmlwdGlvbnMsCiAgICAgICAgKEltcG9ydERlc2NyaXB0aW9uIGltcG9ydERlc2NyaXB0aW9uKSB7CiAgICAgIHNpbmsud3JpdGVTdHJpbmcoaW1wb3J0RGVzY3JpcHRpb24uaW1wb3J0aW5nVXJpKTsKICAgICAgc2luay53cml0ZVN0cmluZyhpbXBvcnREZXNjcmlwdGlvbi5wcmVmaXgpOwogICAgICBzaW5rLndyaXRlTGlicmFyeShpbXBvcnREZXNjcmlwdGlvbi5faW1wb3J0aW5nTGlicmFyeSk7CiAgICB9KTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgW091dHB1dFVuaXRdIHdoZXJlIFtjbHNdIGJlbG9uZ3MuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoZSBuZWVkIGZvciBbYWxsb3dOdWxsXS4gRHVtcC1pbmZvIGN1cnJlbnRseQogIC8vIG5lZWRzIGl0LgogIE91dHB1dFVuaXQgb3V0cHV0VW5pdEZvckNsYXNzKENsYXNzRW50aXR5IGNscywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmICghaXNQcm9ncmFtU3BsaXQpIHJldHVybiBtYWluT3V0cHV0VW5pdDsKICAgIE91dHB1dFVuaXQgdW5pdCA9IF9jbGFzc1RvVW5pdFtjbHNdOwogICAgYXNzZXJ0KGFsbG93TnVsbCB8fCB1bml0ICE9IG51bGwsICdObyBvdXRwdXQgdW5pdCBmb3IgY2xhc3MgJGNscycpOwogICAgcmV0dXJuIHVuaXQgPz8gbWFpbk91dHB1dFVuaXQ7CiAgfQoKICBPdXRwdXRVbml0IG91dHB1dFVuaXRGb3JDbGFzc0ZvclRlc3RpbmcoQ2xhc3NFbnRpdHkgY2xzKSA9PiBfY2xhc3NUb1VuaXRbY2xzXTsKCiAgLy8vIFJldHVybnMgdGhlIFtPdXRwdXRVbml0XSB3aGVyZSBbbWVtYmVyXSBiZWxvbmdzLgogIE91dHB1dFVuaXQgb3V0cHV0VW5pdEZvck1lbWJlcihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBpZiAoIWlzUHJvZ3JhbVNwbGl0KSByZXR1cm4gbWFpbk91dHB1dFVuaXQ7CiAgICBPdXRwdXRVbml0IHVuaXQgPSBfbWVtYmVyVG9Vbml0W21lbWJlcl07CiAgICBhc3NlcnQodW5pdCAhPSBudWxsLCAnTm8gb3V0cHV0IHVuaXQgZm9yIG1lbWJlciAkbWVtYmVyJyk7CiAgICByZXR1cm4gdW5pdCA/PyBtYWluT3V0cHV0VW5pdDsKICB9CgogIE91dHB1dFVuaXQgb3V0cHV0VW5pdEZvck1lbWJlckZvclRlc3RpbmcoTWVtYmVyRW50aXR5IG1lbWJlcikgPT4KICAgICAgX21lbWJlclRvVW5pdFttZW1iZXJdOwoKICAvLy8gRGlyZWN0IGFjY2VzcyB0byB0aGUgb3V0cHV0LXVuaXQgdG8gY29uc3RhbnRzIG1hcCB1c2VkIGZvciB0ZXN0aW5nLgogIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IGdldCBjb25zdGFudHNGb3JUZXN0aW5nID0+IF9jb25zdGFudFRvVW5pdC5rZXlzOwoKICAvLy8gUmV0dXJucyB0aGUgW091dHB1dFVuaXRdIHdoZXJlIFtjb25zdGFudF0gYmVsb25ncy4KICBPdXRwdXRVbml0IG91dHB1dFVuaXRGb3JDb25zdGFudChDb25zdGFudFZhbHVlIGNvbnN0YW50KSB7CiAgICBpZiAoIWlzUHJvZ3JhbVNwbGl0KSByZXR1cm4gbWFpbk91dHB1dFVuaXQ7CiAgICByZXR1cm4gX2NvbnN0YW50VG9Vbml0W2NvbnN0YW50XTsKICB9CgogIE91dHB1dFVuaXQgb3V0cHV0VW5pdEZvckNvbnN0YW50Rm9yVGVzdGluZyhDb25zdGFudFZhbHVlIGNvbnN0YW50KSA9PgogICAgICBfY29uc3RhbnRUb1VuaXRbY29uc3RhbnRdOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgW2VsZW1lbnRdIGlzIGRlZmVycmVkLgogIGJvb2wgaXNEZWZlcnJlZENsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBvdXRwdXRVbml0Rm9yQ2xhc3MoZWxlbWVudCkgIT0gbWFpbk91dHB1dFVuaXQ7CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgZWxlbWVudCBbdG9dIGlzIHJlYWNoYWJsZSBmcm9tIGVsZW1lbnQgW2Zyb21dIHdpdGhvdXQKICAvLy8gY3Jvc3NpbmcgYSBkZWZlcnJlZCBpbXBvcnQuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIHR3byBkZWZlcnJlZCBsaWJyYXJpZXMgYEFgIGFuZCBgQmAgdGhhdCBib3RoCiAgLy8vIGltcG9ydCBhIGxpYnJhcnkgYENgLCB0aGVuIGV2ZW4gdGhvdWdoIGVsZW1lbnRzIGZyb20gYEFgIGFuZCBgQ2AgZW5kIHVwIGluCiAgLy8vIGRpZmZlcmVudCBvdXRwdXQgdW5pdHMsIHRoZXJlIGlzIGEgbm9uLWRlZmVycmVkIHBhdGggYmV0d2VlbiBgQWAgYW5kIGBDYC4KICBib29sIGhhc09ubHlOb25EZWZlcnJlZEltcG9ydFBhdGhzKE1lbWJlckVudGl0eSBmcm9tLCBNZW1iZXJFbnRpdHkgdG8pIHsKICAgIE91dHB1dFVuaXQgb3V0cHV0VW5pdEZyb20gPSBvdXRwdXRVbml0Rm9yTWVtYmVyKGZyb20pOwogICAgT3V0cHV0VW5pdCBvdXRwdXRVbml0VG8gPSBvdXRwdXRVbml0Rm9yTWVtYmVyKHRvKTsKICAgIGlmIChvdXRwdXRVbml0VG8gPT0gbWFpbk91dHB1dFVuaXQpIHJldHVybiB0cnVlOwogICAgaWYgKG91dHB1dFVuaXRGcm9tID09IG1haW5PdXRwdXRVbml0KSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gb3V0cHV0VW5pdFRvLl9pbXBvcnRzLmNvbnRhaW5zQWxsKG91dHB1dFVuaXRGcm9tLl9pbXBvcnRzKTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBjb25zdGFudCBbdG9dIGlzIHJlYWNoYWJsZSBmcm9tIGVsZW1lbnQgW2Zyb21dIHdpdGhvdXQKICAvLy8gY3Jvc3NpbmcgYSBkZWZlcnJlZCBpbXBvcnQuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIHR3byBkZWZlcnJlZCBsaWJyYXJpZXMgYEFgIGFuZCBgQmAgdGhhdCBib3RoCiAgLy8vIGltcG9ydCBhIGxpYnJhcnkgYENgLCB0aGVuIGV2ZW4gdGhvdWdoIGVsZW1lbnRzIGZyb20gYEFgIGFuZCBgQ2AgZW5kIHVwIGluCiAgLy8vIGRpZmZlcmVudCBvdXRwdXQgdW5pdHMsIHRoZXJlIGlzIGEgbm9uLWRlZmVycmVkIHBhdGggYmV0d2VlbiBgQWAgYW5kIGBDYC4KICBib29sIGhhc09ubHlOb25EZWZlcnJlZEltcG9ydFBhdGhzVG9Db25zdGFudCgKICAgICAgTWVtYmVyRW50aXR5IGZyb20sIENvbnN0YW50VmFsdWUgdG8pIHsKICAgIE91dHB1dFVuaXQgb3V0cHV0VW5pdEZyb20gPSBvdXRwdXRVbml0Rm9yTWVtYmVyKGZyb20pOwogICAgT3V0cHV0VW5pdCBvdXRwdXRVbml0VG8gPSBvdXRwdXRVbml0Rm9yQ29uc3RhbnQodG8pOwogICAgaWYgKG91dHB1dFVuaXRUbyA9PSBtYWluT3V0cHV0VW5pdCkgcmV0dXJuIHRydWU7CiAgICBpZiAob3V0cHV0VW5pdEZyb20gPT0gbWFpbk91dHB1dFVuaXQpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBvdXRwdXRVbml0VG8uX2ltcG9ydHMuY29udGFpbnNBbGwob3V0cHV0VW5pdEZyb20uX2ltcG9ydHMpOwogIH0KCiAgLy8vIFJlZ2lzdGVycyB0aGF0IGEgY29uc3RhbnQgaXMgdXNlZCBpbiB0aGUgc2FtZSBkZWZlcnJlZCBvdXRwdXQgdW5pdCBhcwogIC8vLyBbZmllbGRdLgogIHZvaWQgcmVnaXN0ZXJDb25zdGFudERlZmVycmVkVXNlKERlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgaWYgKCFpc1Byb2dyYW1TcGxpdCkgcmV0dXJuOwogICAgT3V0cHV0VW5pdCB1bml0ID0gY29uc3RhbnQudW5pdDsKICAgIGFzc2VydCgKICAgICAgICBfY29uc3RhbnRUb1VuaXRbY29uc3RhbnRdID09IG51bGwgfHwgX2NvbnN0YW50VG9Vbml0W2NvbnN0YW50XSA9PSB1bml0KTsKICAgIF9jb25zdGFudFRvVW5pdFtjb25zdGFudF0gPSB1bml0OwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHVuaXF1ZSBuYW1lIGZvciB0aGUgZ2l2ZW4gZGVmZXJyZWQgW2ltcG9ydF0uCiAgU3RyaW5nIGdldEltcG9ydERlZmVyTmFtZShTcGFubmFibGUgbm9kZSwgSW1wb3J0RW50aXR5IGltcG9ydCkgewogICAgU3RyaW5nIG5hbWUgPSBfaW1wb3J0RGVmZXJOYW1lW2ltcG9ydF07CiAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBTcGFubmFibGVBc3NlcnRpb25GYWlsdXJlKAogICAgICAgICAgbm9kZSwgIk5vIGRlZmVycmVkIG5hbWUgZm9yICRpbXBvcnQuIik7CiAgICB9CiAgICByZXR1cm4gbmFtZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBuYW1lcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBkZWZlcnJlZCBpbXBvcnQgaW4gW3VuaXRdLgogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SW1wb3J0TmFtZXMoT3V0cHV0VW5pdCB1bml0KSB7CiAgICByZXR1cm4gdW5pdC5faW1wb3J0cy5tYXAoKGkpID0+IF9pbXBvcnREZWZlck5hbWVbaV0pOwogIH0KCiAgLy8vIFJldHVybnMgYSBqc29uLXN0eWxlIG1hcCBmb3IgZGVzY3JpYmluZyB3aGF0IGZpbGVzIHRoYXQgYXJlIGxvYWRlZCBieSBhCiAgLy8vIGdpdmVuIGRlZmVycmVkIGltcG9ydC4KICAvLy8gVGhlIG1hcHBpbmcgaXMgc3RydWN0dXJlZCBhczoKICAvLy8gbGlicmFyeSB1cmkgLT4geyJuYW1lIjogbGlicmFyeSBuYW1lLCAiZmlsZXMiOiAocHJlZml4IC0+IGxpc3Qgb2YgZmlsZXMpfQogIC8vLyBXaGVyZQogIC8vLwogIC8vLyAtIDxsaWJyYXJ5IHVyaT4gaXMgdGhlIHJlbGF0aXZlIHVyaSBvZiB0aGUgbGlicmFyeSBtYWtpbmcgYSBkZWZlcnJlZAogIC8vLyAgIGltcG9ydC4KICAvLy8gLSA8bGlicmFyeSBuYW1lPiBpcyB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSwgb3IgIjx1bm5hbWVkPiIgaWYgaXQgaXMKICAvLy8gICB1bm5hbWVkLgogIC8vLyAtIDxwcmVmaXg+IGlzIHRoZSBgYXNgIHByZWZpeCB1c2VkIGZvciBhIGdpdmVuIGRlZmVycmVkIGltcG9ydC4KICAvLy8gLSA8bGlzdCBvZiBmaWxlcz4gaXMgYSBsaXN0IG9mIHRoZSBmaWxlbmFtZXMgdGhlIG11c3QgYmUgbG9hZGVkIHdoZW4gdGhhdAogIC8vLyAgIGltcG9ydCBpcyBsb2FkZWQuCiAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgZHluYW1pYz4+IGNvbXB1dGVEZWZlcnJlZE1hcCgKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIHtTZXQ8T3V0cHV0VW5pdD4gb21pdHRlZFVuaXRzfSkgewogICAgb21pdHRlZFVuaXRzID8/PSBTZXQoKTsKICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIGR5bmFtaWM+PiBtYXBwaW5nID0ge307CgogICAgX2RlZmVycmVkSW1wb3J0RGVzY3JpcHRpb25zLmtleXMuZm9yRWFjaCgoSW1wb3J0RW50aXR5IGltcG9ydCkgewogICAgICBMaXN0PE91dHB1dFVuaXQ+IG91dHB1dFVuaXRzID0gaHVua3NUb0xvYWRbX2ltcG9ydERlZmVyTmFtZVtpbXBvcnRdXTsKICAgICAgSW1wb3J0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBfZGVmZXJyZWRJbXBvcnREZXNjcmlwdGlvbnNbaW1wb3J0XTsKICAgICAgU3RyaW5nIGdldE5hbWUoTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICAgICAgdmFyIG5hbWUgPSBlbGVtZW50RW52aXJvbm1lbnQuZ2V0TGlicmFyeU5hbWUobGlicmFyeSk7CiAgICAgICAgcmV0dXJuIG5hbWUgPT0gJycgPyAnPHVubmFtZWQ+JyA6IG5hbWU7CiAgICAgIH0KCiAgICAgIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGxpYnJhcnlNYXAgPSBtYXBwaW5nLnB1dElmQWJzZW50KAogICAgICAgICAgZGVzY3JpcHRpb24uaW1wb3J0aW5nVXJpLAogICAgICAgICAgKCkgPT4gPFN0cmluZywgZHluYW1pYz57CiAgICAgICAgICAgICAgICAibmFtZSI6IGdldE5hbWUoZGVzY3JpcHRpb24uX2ltcG9ydGluZ0xpYnJhcnkpLAogICAgICAgICAgICAgICAgImltcG9ydHMiOiA8U3RyaW5nLCBMaXN0PFN0cmluZz4+e30KICAgICAgICAgICAgICB9KTsKCiAgICAgIExpc3Q8U3RyaW5nPiBwYXJ0RmlsZU5hbWVzID0gb3V0cHV0VW5pdHMKICAgICAgICAgIC53aGVyZSgob3V0cHV0VW5pdCkgPT4gIW9taXR0ZWRVbml0cy5jb250YWlucyhvdXRwdXRVbml0KSkKICAgICAgICAgIC5tYXAoKG91dHB1dFVuaXQpID0+IGRlZmVycmVkUGFydEZpbGVOYW1lKG9wdGlvbnMsIG91dHB1dFVuaXQubmFtZSkpCiAgICAgICAgICAudG9MaXN0KCk7CiAgICAgIGxpYnJhcnlNYXBbImltcG9ydHMiXVtfaW1wb3J0RGVmZXJOYW1lW2ltcG9ydF1dID0gcGFydEZpbGVOYW1lczsKICAgIH0pOwogICAgcmV0dXJuIG1hcHBpbmc7CiAgfQp9CgovLy8gUmV0dXJucyB0aGUgZmlsZW5hbWUgZm9yIHRoZSBvdXRwdXQtdW5pdCBuYW1lZCBbbmFtZV0uCi8vLwovLy8gVGhlIGZpbGVuYW1lIGlzIG9mIHRoZSBmb3JtICI8bWFpbiBvdXRwdXQgZmlsZT5fPG5hbWU+LnBhcnQuanMiLgovLy8gSWYgW2FkZEV4dGVuc2lvbl0gaXMgZmFsc2UsIHRoZSAiLnBhcnQuanMiIHN1ZmZpeCBpcyBsZWZ0IG91dC4KU3RyaW5nIGRlZmVycmVkUGFydEZpbGVOYW1lKENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgbmFtZSwKICAgIHtib29sIGFkZEV4dGVuc2lvbjogdHJ1ZX0pIHsKICBhc3NlcnQobmFtZSAhPSAiIik7CiAgU3RyaW5nIG91dFBhdGggPSBvcHRpb25zLm91dHB1dFVyaSAhPSBudWxsID8gb3B0aW9ucy5vdXRwdXRVcmkucGF0aCA6ICJvdXQiOwogIFN0cmluZyBvdXROYW1lID0gb3V0UGF0aC5zdWJzdHJpbmcob3V0UGF0aC5sYXN0SW5kZXhPZignLycpICsgMSk7CiAgU3RyaW5nIGV4dGVuc2lvbiA9IGFkZEV4dGVuc2lvbiA/ICIucGFydC5qcyIgOiAiIjsKICByZXR1cm4gIiR7b3V0TmFtZX1fJG5hbWUkZXh0ZW5zaW9uIjsKfQoKY2xhc3MgRGVwZW5kZW5jaWVzIHsKICBmaW5hbCBNYXA8Q2xhc3NFbnRpdHksIERlcGVuZGVuY3lJbmZvPiBjbGFzc2VzID0ge307CiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgRGVwZW5kZW5jeUluZm8+IG1lbWJlcnMgPSB7fTsKICBmaW5hbCBTZXQ8TG9jYWw+IGxvY2FsRnVuY3Rpb25zID0gbmV3IFNldDxMb2NhbD4oKTsKICBmaW5hbCBNYXA8Q29uc3RhbnRWYWx1ZSwgRGVwZW5kZW5jeUluZm8+IGNvbnN0YW50cyA9IHt9OwoKICB2b2lkIGFkZENsYXNzKENsYXNzRW50aXR5IGNscywgW0ltcG9ydEVudGl0eSBpbXBvcnRdKSB7CiAgICAoY2xhc3Nlc1tjbHNdID8/PSBuZXcgRGVwZW5kZW5jeUluZm8oKSkucmVnaXN0ZXJJbXBvcnQoaW1wb3J0KTsKICB9CgogIHZvaWQgYWRkTWVtYmVyKE1lbWJlckVudGl0eSBtLCBbSW1wb3J0RW50aXR5IGltcG9ydF0pIHsKICAgIChtZW1iZXJzW21dID8/PSBuZXcgRGVwZW5kZW5jeUluZm8oKSkucmVnaXN0ZXJJbXBvcnQoaW1wb3J0KTsKICB9CgogIHZvaWQgYWRkQ29uc3RhbnQoQ29uc3RhbnRWYWx1ZSBjLCBbSW1wb3J0RW50aXR5IGltcG9ydF0pIHsKICAgIChjb25zdGFudHNbY10gPz89IG5ldyBEZXBlbmRlbmN5SW5mbygpKS5yZWdpc3RlckltcG9ydChpbXBvcnQpOwogIH0KfQoKY2xhc3MgRGVwZW5kZW5jeUluZm8gewogIGJvb2wgaXNEZWZlcnJlZCA9IHRydWU7CiAgTGlzdDxJbXBvcnRFbnRpdHk+IGltcG9ydHM7CgogIHJlZ2lzdGVySW1wb3J0KEltcG9ydEVudGl0eSBpbXBvcnQpIHsKICAgIGlmICghaXNEZWZlcnJlZCkgcmV0dXJuOwogICAgLy8gQSBudWxsIGltcG9ydCByZXByZXNlbnRzIGEgZGlyZWN0IG5vbi1kZWZlcnJlZCBkZXBlbmRlbmN5LgogICAgaWYgKGltcG9ydCAhPSBudWxsKSB7CiAgICAgIChpbXBvcnRzID8/PSBbXSkuYWRkKGltcG9ydCk7CiAgICB9IGVsc2UgewogICAgICBpbXBvcnRzID0gbnVsbDsKICAgICAgaXNEZWZlcnJlZCA9IGZhbHNlOwogICAgfQogIH0KfQoKY2xhc3MgVHlwZURlcGVuZGVuY3lWaXNpdG9yIGltcGxlbWVudHMgRGFydFR5cGVWaXNpdG9yPHZvaWQsIE51bGw+IHsKICBmaW5hbCBEZXBlbmRlbmNpZXMgX2RlcGVuZGVuY2llczsKICBmaW5hbCBJbXBvcnRFbnRpdHkgX2ltcG9ydDsKICBmaW5hbCBDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CgogIFR5cGVEZXBlbmRlbmN5VmlzaXRvcih0aGlzLl9kZXBlbmRlbmNpZXMsIHRoaXMuX2ltcG9ydCwgdGhpcy5fY29tbW9uRWxlbWVudHMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0KERhcnRUeXBlIHR5cGUsIFtfXSkgewogICAgdHlwZS5hY2NlcHQodGhpcywgbnVsbCk7CiAgfQoKICB2b2lkIHZpc2l0TGlzdChMaXN0PERhcnRUeXBlPiB0eXBlcykgewogICAgdHlwZXMuZm9yRWFjaCh2aXNpdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnV0dXJlT3JUeXBlKEZ1dHVyZU9yVHlwZSB0eXBlLCBOdWxsIGFyZ3VtZW50KSB7CiAgICBfZGVwZW5kZW5jaWVzLmFkZENsYXNzKF9jb21tb25FbGVtZW50cy5mdXR1cmVDbGFzcyk7CiAgICB2aXNpdCh0eXBlLnR5cGVBcmd1bWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgdHlwZSwgTnVsbCBhcmd1bWVudCkgewogICAgLy8gTm90aGluZyB0byBhZGQuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgdHlwZSwgTnVsbCBhcmd1bWVudCkgewogICAgdmlzaXRMaXN0KHR5cGUudHlwZUFyZ3VtZW50cyk7CiAgICB2aXNpdCh0eXBlLnVuYWxpYXNlZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUsIE51bGwgYXJndW1lbnQpIHsKICAgIHZpc2l0TGlzdCh0eXBlLnR5cGVBcmd1bWVudHMpOwogICAgLy8gVE9ETyhzaWdtdW5kKTogd2hlbiB3ZSBhcmUgYWJsZSB0byBzcGxpdCBjbGFzc2VzIGZyb20gdHlwZXMgaW4gb3VyCiAgICAvLyBydW50aW1lLXR5cGUgcmVwcmVzZW50YXRpb24sIHRoaXMgc2hvdWxkIHRyYWNrIHR5cGUuZWxlbWVudCBhcyBhIHR5cGUKICAgIC8vIGRlcGVuZGVuY3kgaW5zdGVhZC4KICAgIF9kZXBlbmRlbmNpZXMuYWRkQ2xhc3ModHlwZS5lbGVtZW50LCBfaW1wb3J0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIHR5cGUsIE51bGwgYXJndW1lbnQpIHsKICAgIGZvciAoRnVuY3Rpb25UeXBlVmFyaWFibGUgdHlwZVZhcmlhYmxlIGluIHR5cGUudHlwZVZhcmlhYmxl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MmpzLmRhcnQnIGFzIGZlOwoKLy8vIFtDb2RlTG9jYXRpb25dIGRpdmlkZXMgdXJpcyBpbnRvIGRpZmZlcmVudCBjbGFzc2VzLgovLy8KLy8vIFRoZXNlIGFyZSB1c2VkIHRvIGdyb3VwIHVyaXMgZnJvbSB1c2VyIGNvZGUsIHBsYXRmb3JtIGxpYnJhcmllcyBhbmQKLy8vIHBhY2thZ2VzLgphYnN0cmFjdCBjbGFzcyBDb2RlTG9jYXRpb24gewogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbdXJpXSBpcyBpbiB0aGlzIGNvZGUgbG9jYXRpb24uCiAgYm9vbCBpblNhbWVMb2NhdGlvbihVcmkgdXJpKTsKCiAgLy8vIFJldHVybnMgdGhlIHVyaSBvZiB0aGlzIGxvY2F0aW9uIHJlbGF0aXZlIHRvIFtiYXNlVXJpXS4KICBTdHJpbmcgcmVsYXRpdml6ZShVcmkgYmFzZVVyaSk7CgogIGZhY3RvcnkgQ29kZUxvY2F0aW9uKFVyaSB1cmkpIHsKICAgIGlmICh1cmkuc2NoZW1lID09ICdwYWNrYWdlJykgewogICAgICBpbnQgc2xhc2hQb3MgPSB1cmkucGF0aC5pbmRleE9mKCcvJyk7CiAgICAgIGlmIChzbGFzaFBvcyAhPSAtMSkgewogICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IHVyaS5wYXRoLnN1YnN0cmluZygwLCBzbGFzaFBvcyk7CiAgICAgICAgcmV0dXJuIG5ldyBQYWNrYWdlTG9jYXRpb24ocGFja2FnZU5hbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgVXJpTG9jYXRpb24odXJpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBTY2hlbWVMb2NhdGlvbih1cmkpOwogICAgfQogIH0KfQoKLy8vIEEgY29kZSBsb2NhdGlvbiBkZWZpbmVkIGJ5IHRoZSBzY2hlbWUgb2YgdGhlIHVyaS4KLy8vCi8vLyBVc2VkIGZvciBub24tcGFja2FnZSB1cmlzLCBzdWNoIGFzICdkYXJ0JywgJ2ZpbGUnLCBhbmQgJ2h0dHAnLgpjbGFzcyBTY2hlbWVMb2NhdGlvbiBpbXBsZW1lbnRzIENvZGVMb2NhdGlvbiB7CiAgZmluYWwgVXJpIHVyaTsKCiAgU2NoZW1lTG9jYXRpb24odGhpcy51cmkpOwoKICBAb3ZlcnJpZGUKICBib29sIGluU2FtZUxvY2F0aW9uKFVyaSB1cmkpIHsKICAgIHJldHVybiB0aGlzLnVyaS5zY2hlbWUgPT0gdXJpLnNjaGVtZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyByZWxhdGl2aXplKFVyaSBiYXNlVXJpKSB7CiAgICByZXR1cm4gZmUucmVsYXRpdml6ZVVyaShiYXNlVXJpLCB1cmksIGZhbHNlKTsKICB9Cn0KCi8vLyBBIGNvZGUgbG9jYXRpb24gZGVmaW5lZCBieSB0aGUgcGFja2FnZSBuYW1lLgovLy8KLy8vIFVzZWQgZm9yIHBhY2thZ2UgdXJpcywgc2VwYXJhdGVkIGJ5IHRoZWlyIGBwYWNrYWdlIG5hbWVzYCwgdGhhdCBpcywgdGhlCi8vLyAnZm9vJyBvZiAncGFja2FnZTpmb28vYmFyLmRhcnQnLgpjbGFzcyBQYWNrYWdlTG9jYXRpb24gaW1wbGVtZW50cyBDb2RlTG9jYXRpb24gewogIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZTsKCiAgUGFja2FnZUxvY2F0aW9uKHRoaXMucGFja2FnZU5hbWUpOwoKICBAb3ZlcnJpZGUKICBib29sIGluU2FtZUxvY2F0aW9uKFVyaSB1cmkpIHsKICAgIHJldHVybiB1cmkuc2NoZW1lID09ICdwYWNrYWdlJyAmJiB1cmkucGF0aC5zdGFydHNXaXRoKCckcGFja2FnZU5hbWUvJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgcmVsYXRpdml6ZShVcmkgYmFzZVVyaSkgPT4gJ3BhY2thZ2U6JHBhY2thZ2VOYW1lJzsKfQoKLy8vIEEgY29kZSBsb2NhdGlvbiBkZWZpbmVkIGJ5IHRoZSB3aG9sZSB1cmkuCi8vLwovLy8gVXNlZCBmb3IgcGFja2FnZSB1cmlzIHdpdGggbm8gcGFja2FnZSBuYW1lLiBGb3IgaW5zdGFuY2UgJ3BhY2thZ2U6Zm9vLmRhcnQnLgpjbGFzcyBVcmlMb2NhdGlvbiBpbXBsZW1lbnRzIENvZGVMb2NhdGlvbiB7CiAgZmluYWwgVXJpIHVyaTsKCiAgVXJpTG9jYXRpb24odGhpcy51cmkpOwoKICBAb3ZlcnJpZGUKICBib29sIGluU2FtZUxvY2F0aW9uKFVyaSB1cmkpID0+IHRoaXMudXJpID09IHVyaTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHJlbGF0aXZpemUoVXJpIGJhc2VVcmkpIHsKICAgIHJldHVybiBmZS5yZWxhdGl2aXplVXJpKGJhc2VVcmksIHVyaSwgZmFsc2UpOwogIH0KfQoKLy8vIEEgY29kZSBsb2NhdGlvbiB0aGF0IGNvbnRhaW5zIGFueSB1cmkuCmNsYXNzIEFueUxvY2F0aW9uIGltcGxlbWVudHMgQ29kZUxvY2F0aW9uIHsKICBjb25zdCBBbnlMb2NhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBib29sIGluU2FtZUxvY2F0aW9uKFVyaSB1cmkpID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyByZWxhdGl2aXplKFVyaSBiYXNlVXJpKSA9PiAnJGJhc2VVcmknOwp9CmQATk48ASsBQAE4BEgOHjggAT4iASIjLBw+MQ8lCA0mBgQCATYEQy8RARwBDCEqBAEMIzIEAgExBEwlMBwBJQEMIUwEAQw8AgEuBFEsEQEZAQwzAQwjMgQCASssFwEMKAEMMAIBM3BhY2thZ2U6Y29tcGlsZXIvc3JjL2RpYWdub3N0aWNzL2NvZGVfbG9jYXRpb24uZGFydCxzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9kdW1wX2luZm8uZGFydMAAYM4vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkdW1wX2luZm87CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcKICAgIHNob3cgQ2h1bmtlZENvbnZlcnNpb25TaW5rLCBKc29uRW5jb2RlciwgU3RyaW5nQ29udmVyc2lvblNpbms7CgppbXBvcnQgJ3BhY2thZ2U6ZGFydDJqc19pbmZvL2luZm8uZGFydCc7CmltcG9ydCAncGFja2FnZTpkYXJ0MmpzX2luZm8vanNvbl9pbmZvX2NvZGVjLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6ZGFydDJqc19pbmZvL2JpbmFyeV9zZXJpYWxpemF0aW9uLmRhcnQnIGFzIGR1bXBfaW5mbzsKCmltcG9ydCAnLi4vY29tcGlsZXJfbmV3LmRhcnQnOwppbXBvcnQgJ2JhY2tlbmRfc3RyYXRlZ3kuZGFydCc7CmltcG9ydCAnY29tbW9uL25hbWVzLmRhcnQnOwppbXBvcnQgJ2NvbW1vbi90YXNrcy5kYXJ0JyBzaG93IENvbXBpbGVyVGFzazsKaW1wb3J0ICdjb21tb24uZGFydCc7CmltcG9ydCAnY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgSkVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICdjb21waWxlci5kYXJ0JyBzaG93IENvbXBpbGVyOwppbXBvcnQgJ2NvbnN0YW50cy92YWx1ZXMuZGFydCcgc2hvdyBDb25zdGFudFZhbHVlLCBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWU7CmltcG9ydCAnZGVmZXJyZWRfbG9hZC5kYXJ0JyBzaG93IE91dHB1dFVuaXQsIGRlZmVycmVkUGFydEZpbGVOYW1lOwppbXBvcnQgJ2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJ2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICdpbmZlcnJlci90eXBlcy5kYXJ0JwogICAgc2hvdyBHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0LCBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0czsKaW1wb3J0ICdqcy9qcy5kYXJ0JyBhcyBqc0FzdDsKaW1wb3J0ICdqc19iYWNrZW5kL2ZpZWxkX2FuYWx5c2lzLmRhcnQnOwppbXBvcnQgJ3VuaXZlcnNlL2NvZGVnZW5fd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd1bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydCcKICAgIHNob3cgSW1wYWN0VXNlQ2FzZSwgV29ybGRJbXBhY3QsIFdvcmxkSW1wYWN0VmlzaXRvckltcGw7CmltcG9ydCAndXRpbC9zaW5rX2FkYXB0ZXIuZGFydCc7CmltcG9ydCAnd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CgpjbGFzcyBFbGVtZW50SW5mb0NvbGxlY3RvciB7CiAgZmluYWwgQ29tcGlsZXIgY29tcGlsZXI7CiAgZmluYWwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkOwogIGZpbmFsIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIF9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzOwogIGZpbmFsIER1bXBJbmZvVGFzayBkdW1wSW5mb1Rhc2s7CgogIEpFbGVtZW50RW52aXJvbm1lbnQgZ2V0IGVudmlyb25tZW50ID0+IGNsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudDsKICBDb2RlZ2VuV29ybGRCdWlsZGVyIGdldCBjb2RlZ2VuV29ybGRCdWlsZGVyID0+IGNvbXBpbGVyLmNvZGVnZW5Xb3JsZEJ1aWxkZXI7CgogIGZpbmFsIEFsbEluZm8gcmVzdWx0ID0gbmV3IEFsbEluZm8oKTsKICBmaW5hbCBNYXA8RW50aXR5LCBJbmZvPiBfZW50aXR5VG9JbmZvID0gPEVudGl0eSwgSW5mbz57fTsKICBmaW5hbCBNYXA8Q29uc3RhbnRWYWx1ZSwgSW5mbz4gX2NvbnN0YW50VG9JbmZvID0gPENvbnN0YW50VmFsdWUsIEluZm8+e307CiAgZmluYWwgTWFwPE91dHB1dFVuaXQsIE91dHB1dFVuaXRJbmZvPiBfb3V0cHV0VG9JbmZvID0ge307CgogIEVsZW1lbnRJbmZvQ29sbGVjdG9yKHRoaXMuY29tcGlsZXIsIHRoaXMuZHVtcEluZm9UYXNrLCB0aGlzLmNsb3NlZFdvcmxkLAogICAgICB0aGlzLl9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzKTsKCiAgdm9pZCBydW4oKSB7CiAgICBkdW1wSW5mb1Rhc2suX2NvbnN0YW50VG9Ob2RlLmZvckVhY2goKGNvbnN0YW50LCBub2RlKSB7CiAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IGFkZCBkZXBlbmRlbmNpZXMgb24gb3RoZXIgY29uc3RhbnRzCiAgICAgIHZhciBzcGFuID0gZHVtcEluZm9UYXNrLl9ub2RlRGF0YVtub2RlXTsKICAgICAgdmFyIGluZm8gPSBuZXcgQ29uc3RhbnRJbmZvKAogICAgICAgICAgc2l6ZTogc3Bhbi5lbmQgLSBzcGFuLnN0YXJ0LAogICAgICAgICAgY29kZTogW3NwYW5dLAogICAgICAgICAgb3V0cHV0VW5pdDogX3VuaXRJbmZvRm9yQ29uc3RhbnQoY29uc3RhbnQpKTsKICAgICAgX2NvbnN0YW50VG9JbmZvW2NvbnN0YW50XSA9IGluZm87CiAgICAgIHJlc3VsdC5jb25zdGFudHMuYWRkKGluZm8pOwogICAgfSk7CiAgICBlbnZpcm9ubWVudC5saWJyYXJpZXMuZm9yRWFjaCh2aXNpdExpYnJhcnkpOwogIH0KCiAgLy8vIFdoZXRoZXIgdG8gZW1pdCBpbmZvcm1hdGlvbiBhYm91dCBbZW50aXR5XS4KICAvLy8KICAvLy8gQnkgZGVmYXVsdCB3ZSBlbWl0IGluZm9ybWF0aW9uIGZvciBhbnkgZW50aXR5IHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlCiAgLy8vIG91dHB1dCBzaXplLiBFaXRoZXIgYmVjYXVzZSBpdCBpcyBhIGZ1bmN0aW9uIGJlaW5nIGVtaXR0ZWQgb3IgaW5saW5lZCwKICAvLy8gb3IgYmVjYXVzZSBpdCBpcyBhbiBlbnRpdHkgdGhhdCBob2xkcyBkZXBlbmRlbmNpZXMgdG8gb3RoZXIgZW50aXRpZXMuCiAgYm9vbCBzaG91bGRLZWVwKEVudGl0eSBlbnRpdHkpIHsKICAgIHJldHVybiBkdW1wSW5mb1Rhc2suaW1wYWN0cy5jb250YWluc0tleShlbnRpdHkpIHx8CiAgICAgICAgZHVtcEluZm9UYXNrLmlubGluZUNvdW50LmNvbnRhaW5zS2V5KGVudGl0eSk7CiAgfQoKICBMaWJyYXJ5SW5mbyB2aXNpdExpYnJhcnkoTGlicmFyeUVudGl0eSBsaWIpIHsKICAgIFN0cmluZyBsaWJuYW1lID0gZW52aXJvbm1lbnQuZ2V0TGlicmFyeU5hbWUobGliKTsKICAgIGlmIChsaWJuYW1lLmlzRW1wdHkpIHsKICAgICAgbGlibmFtZSA9ICc8dW5uYW1lZD4nOwogICAgfQogICAgaW50IHNpemUgPSBkdW1wSW5mb1Rhc2suc2l6ZU9mKGxpYik7CiAgICBMaWJyYXJ5SW5mbyBpbmZvID0gbmV3IExpYnJhcnlJbmZvKGxpYm5hbWUsIGxpYi5jYW5vbmljYWxVcmksIG51bGwsIHNpemUpOwogICAgX2VudGl0eVRvSW5mb1tsaWJdID0gaW5mbzsKCiAgICBlbnZpcm9ubWVudC5mb3JFYWNoTGlicmFyeU1lbWJlcihsaWIsIChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgIGlmIChtZW1iZXIuaXNGdW5jdGlvbiB8fCBtZW1iZXIuaXNHZXR0ZXIgfHwgbWVtYmVyLmlzU2V0dGVyKSB7CiAgICAgICAgRnVuY3Rpb25JbmZvIGZ1bmN0aW9uSW5mbyA9IHZpc2l0RnVuY3Rpb24obWVtYmVyKTsKICAgICAgICBpZiAoZnVuY3Rpb25JbmZvICE9IG51bGwpIHsKICAgICAgICAgIGluZm8udG9wTGV2ZWxGdW5jdGlvbnMuYWRkKGZ1bmN0aW9uSW5mbyk7CiAgICAgICAgICBmdW5jdGlvbkluZm8ucGFyZW50ID0gaW5mbzsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzRmllbGQpIHsKICAgICAgICBGaWVsZEluZm8gZmllbGRJbmZvID0gdmlzaXRGaWVsZChtZW1iZXIpOwogICAgICAgIGlmIChmaWVsZEluZm8gIT0gbnVsbCkgewogICAgICAgICAgaW5mby50b3BMZXZlbFZhcmlhYmxlcy5hZGQoZmllbGRJbmZvKTsKICAgICAgICAgIGZpZWxkSW5mby5wYXJlbnQgPSBpbmZvOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgZW52aXJvbm1lbnQuZm9yRWFjaENsYXNzKGxpYiwgKENsYXNzRW50aXR5IGNsYXp6KSB7CiAgICAgIENsYXNzSW5mbyBjbGFzc0luZm8gPSB2aXNpdENsYXNzKGNsYXp6KTsKICAgICAgaWYgKGNsYXNzSW5mbyAhPSBudWxsKSB7CiAgICAgICAgaW5mby5jbGFzc2VzLmFkZChjbGFzc0luZm8pOwogICAgICAgIGNsYXNzSW5mby5wYXJlbnQgPSBpbmZvOwogICAgICB9CiAgICB9KTsKCiAgICBpZiAoaW5mby5pc0VtcHR5ICYmICFzaG91bGRLZWVwKGxpYikpIHJldHVybiBudWxsOwogICAgcmVzdWx0LmxpYnJhcmllcy5hZGQoaW5mbyk7CiAgICByZXR1cm4gaW5mbzsKICB9CgogIEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQgX3Jlc3VsdE9mTWVtYmVyKE1lbWJlckVudGl0eSBlKSA9PgogICAgICBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cy5yZXN1bHRPZk1lbWJlcihlKTsKCiAgQWJzdHJhY3RWYWx1ZSBfcmVzdWx0T2ZQYXJhbWV0ZXIoTG9jYWwgZSkgPT4KICAgICAgX2dsb2JhbEluZmVyZW5jZVJlc3VsdHMucmVzdWx0T2ZQYXJhbWV0ZXIoZSk7CgogIEZpZWxkSW5mbyB2aXNpdEZpZWxkKEZpZWxkRW50aXR5IGZpZWxkLCB7Q2xhc3NFbnRpdHkgY29udGFpbmluZ0NsYXNzfSkgewogICAgQWJzdHJhY3RWYWx1ZSBpbmZlcnJlZFR5cGUgPSBfcmVzdWx0T2ZNZW1iZXIoZmllbGQpLnR5cGU7CiAgICAvLyBJZiBhIGZpZWxkIGhhcyBhbiBlbXB0eSBpbmZlcnJlZCB0eXBlIGl0IGlzIG5ldmVyIHVzZWQuCiAgICBpZiAoaW5mZXJyZWRUeXBlID09IG51bGwgfHwKICAgICAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAgIC5pc0VtcHR5KGluZmVycmVkVHlwZSkKICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgaW50IHNpemUgPSBkdW1wSW5mb1Rhc2suc2l6ZU9mKGZpZWxkKTsKICAgIExpc3Q8Q29kZVNwYW4+IGNvZGUgPSBkdW1wSW5mb1Rhc2suY29kZU9mKGZpZWxkKTsKCiAgICAvLyBUT0RPKGhldCk6IFdoeSBkb2Vzbid0IGBzaXplYCBhY2NvdW50IGZvciB0aGUgY29kZSBzaXplIGFscmVhZHk/CiAgICBpZiAoY29kZSAhPSBudWxsKSBzaXplICs9IGNvZGUubGVuZ3RoOwoKICAgIEZpZWxkSW5mbyBpbmZvID0gbmV3IEZpZWxkSW5mbygKICAgICAgICBuYW1lOiBmaWVsZC5uYW1lLAogICAgICAgIHR5cGU6ICcke2Vudmlyb25tZW50LmdldEZpZWxkVHlwZShmaWVsZCl9JywKICAgICAgICBpbmZlcnJlZFR5cGU6ICckaW5mZXJyZWRUeXBlJywKICAgICAgICBjb2RlOiBjb2RlLAogICAgICAgIG91dHB1dFVuaXQ6IF91bml0SW5mb0Zvck1lbWJlcihmaWVsZCksCiAgICAgICAgaXNDb25zdDogZmllbGQuaXNDb25zdCk7CiAgICBfZW50aXR5VG9JbmZvW2ZpZWxkXSA9IGluZm87CiAgICBGaWVsZEFuYWx5c2lzRGF0YSBmaWVsZERhdGEgPSBjbG9zZWRXb3JsZC5maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShmaWVsZCk7CiAgICBpZiAoZmllbGREYXRhLmluaXRpYWxWYWx1ZSAhPSBudWxsKSB7CiAgICAgIGluZm8uaW5pdGlhbGl6ZXIgPSBfY29uc3RhbnRUb0luZm9bZmllbGREYXRhLmluaXRpYWxWYWx1ZV07CiAgICB9CgogICAgaWYgKGNvbXBpbGVyLm9wdGlvbnMuZXhwZXJpbWVudENhbGxJbnN0cnVtZW50YXRpb24pIHsKICAgICAgLy8gV2UgdXNlIGZpZWxkLmhhc2hDb2RlIGJlY2F1c2UgaXQgaXMgZ2xvYmFsbHkgdW5pcXVlIGFuZCBpdCBpcwogICAgICAvLyBhdmFpbGFibGUgd2hpbGUgd2UgYXJlIGRvaW5nIGNvZGVnZW4uCiAgICAgIGluZm8uY292ZXJhZ2VJZCA9ICcke2ZpZWxkLmhhc2hDb2RlfSc7CiAgICB9CgogICAgaW50IGNsb3N1cmVTaXplID0gX2FkZENsb3N1cmVJbmZvKGluZm8sIGZpZWxkKTsKICAgIGluZm8uc2l6ZSA9IHNpemUgKyBjbG9zdXJlU2l6ZTsKCiAgICByZXN1bHQuZmllbGRzLmFkZChpbmZvKTsKICAgIHJldHVybiBpbmZvOwogIH0KCiAgQ2xhc3NJbmZvIHZpc2l0Q2xhc3MoQ2xhc3NFbnRpdHkgY2xhenopIHsKICAgIC8vIE9taXQgY2xhc3MgaWYgaXQgaXMgbm90IG5lZWRlZC4KICAgIENsYXNzSW5mbyBjbGFzc0luZm8gPSBuZXcgQ2xhc3NJbmZvKAogICAgICAgIG5hbWU6IGNsYXp6Lm5hbWUsCiAgICAgICAgaXNBYnN0cmFjdDogY2xhenouaXNBYnN0cmFjdCwKICAgICAgICBvdXRwdXRVbml0OiBfdW5pdEluZm9Gb3JDbGFzcyhjbGF6eikpOwogICAgX2VudGl0eVRvSW5mb1tjbGF6el0gPSBjbGFzc0luZm87CgogICAgaW50IHNpemUgPSBkdW1wSW5mb1Rhc2suc2l6ZU9mKGNsYXp6KTsKICAgIGVudmlyb25tZW50LmZvckVhY2hMb2NhbENsYXNzTWVtYmVyKGNsYXp6LCAobWVtYmVyKSB7CiAgICAgIGlmIChtZW1iZXIuaXNGdW5jdGlvbiB8fCBtZW1iZXIuaXNHZXR0ZXIgfHwgbWVtYmVyLmlzU2V0dGVyKSB7CiAgICAgICAgRnVuY3Rpb25JbmZvIGZ1bmN0aW9uSW5mbyA9IHZpc2l0RnVuY3Rpb24obWVtYmVyKTsKICAgICAgICBpZiAoZnVuY3Rpb25JbmZvICE9IG51bGwpIHsKICAgICAgICAgIGNsYXNzSW5mby5mdW5jdGlvbnMuYWRkKGZ1bmN0aW9uSW5mbyk7CiAgICAgICAgICBmdW5jdGlvbkluZm8ucGFyZW50ID0gY2xhc3NJbmZvOwogICAgICAgICAgZm9yICh2YXIgY2xvc3VyZUluZm8gaW4gZnVuY3Rpb25JbmZvLmNsb3N1cmVzKSB7CiAgICAgICAgICAgIHNpemUgKz0gY2xvc3VyZUluZm8uc2l6ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzRmllbGQpIHsKICAgICAgICBGaWVsZEluZm8gZmllbGRJbmZvID0gdmlzaXRGaWVsZChtZW1iZXIsIGNvbnRhaW5pbmdDbGFzczogY2xhenopOwogICAgICAgIGlmIChmaWVsZEluZm8gIT0gbnVsbCkgewogICAgICAgICAgY2xhc3NJbmZvLmZpZWxkcy5hZGQoZmllbGRJbmZvKTsKICAgICAgICAgIGZpZWxkSW5mby5wYXJlbnQgPSBjbGFzc0luZm87CiAgICAgICAgICBmb3IgKHZhciBjbG9zdXJlSW5mbyBpbiBmaWVsZEluZm8uY2xvc3VyZXMpIHsKICAgICAgICAgICAgc2l6ZSArPSBjbG9zdXJlSW5mby5zaXplOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcignQ2xhc3MgbWVtYmVyIG5vdCBhIGZ1bmN0aW9uIG9yIGZpZWxkJyk7CiAgICAgIH0KICAgIH0pOwogICAgZW52aXJvbm1lbnQuZm9yRWFjaENvbnN0cnVjdG9yKGNsYXp6LCAoY29uc3RydWN0b3IpIHsKICAgICAgRnVuY3Rpb25JbmZvIGZ1bmN0aW9uSW5mbyA9IHZpc2l0RnVuY3Rpb24oY29uc3RydWN0b3IpOwogICAgICBpZiAoZnVuY3Rpb25JbmZvICE9IG51bGwpIHsKICAgICAgICBjbGFzc0luZm8uZnVuY3Rpb25zLmFkZChmdW5jdGlvbkluZm8pOwogICAgICAgIGZ1bmN0aW9uSW5mby5wYXJlbnQgPSBjbGFzc0luZm87CiAgICAgICAgZm9yICh2YXIgY2xvc3VyZUluZm8gaW4gZnVuY3Rpb25JbmZvLmNsb3N1cmVzKSB7CiAgICAgICAgICBzaXplICs9IGNsb3N1cmVJbmZvLnNpemU7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICBjbGFzc0luZm8uc2l6ZSA9IHNpemU7CgogICAgaWYgKCFjb21waWxlci5iYWNrZW5kU3RyYXRlZ3kuZW1pdHRlclRhc2submVlZGVkQ2xhc3Nlcy5jb250YWlucyhjbGF6eikgJiYKICAgICAgICBjbGFzc0luZm8uZmllbGRzLmlzRW1wdHkgJiYKICAgICAgICBjbGFzc0luZm8uZnVuY3Rpb25zLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcmVzdWx0LmNsYXNzZXMuYWRkKGNsYXNzSW5mbyk7CiAgICByZXR1cm4gY2xhc3NJbmZvOwogIH0KCiAgQ2xvc3VyZUluZm8gdmlzaXRDbG9zdXJlQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAgQ2xvc3VyZUluZm8gY2xvc3VyZUluZm8gPSBuZXcgQ2xvc3VyZUluZm8oCiAgICAgICAgbmFtZTogZWxlbWVudC5uYW1lLAogICAgICAgIG91dHB1dFVuaXQ6IF91bml0SW5mb0ZvckNsYXNzKGVsZW1lbnQpLAogICAgICAgIHNpemU6IGR1bXBJbmZvVGFzay5zaXplT2YoZWxlbWVudCkpOwogICAgX2VudGl0eVRvSW5mb1tlbGVtZW50XSA9IGNsb3N1cmVJbmZvOwoKICAgIEZ1bmN0aW9uRW50aXR5IGNhbGxNZXRob2QgPSBjbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQKICAgICAgICAubG9va3VwQ2xhc3NNZW1iZXIoZWxlbWVudCwgSWRlbnRpZmllcnMuY2FsbCk7CgogICAgRnVuY3Rpb25JbmZvIGZ1bmN0aW9uSW5mbyA9IHZpc2l0RnVuY3Rpb24oY2FsbE1ldGhvZCk7CiAgICBpZiAoZnVuY3Rpb25JbmZvID09IG51bGwpIHJldHVybiBudWxsOwogICAgY2xvc3VyZUluZm8uZnVuY3Rpb24gPSBmdW5jdGlvbkluZm87CiAgICBmdW5jdGlvbkluZm8ucGFyZW50ID0gY2xvc3VyZUluZm87CgogICAgcmVzdWx0LmNsb3N1cmVzLmFkZChjbG9zdXJlSW5mbyk7CiAgICByZXR1cm4gY2xvc3VyZUluZm87CiAgfQoKICBGdW5jdGlvbkluZm8gdmlzaXRGdW5jdGlvbihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgaW50IHNpemUgPSBkdW1wSW5mb1Rhc2suc2l6ZU9mKGZ1bmN0aW9uKTsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IGNvbnNpZGVyIGFkZGluZyBhIHNtYWxsIGluZm8gdG8gcmVwcmVzZW50IHVucmVhY2hhYmxlCiAgICAvLyBjb2RlIGhlcmUuCiAgICBpZiAoc2l6ZSA9PSAwICYmICFzaG91bGRLZWVwKGZ1bmN0aW9uKSkgcmV0dXJuIG51bGw7CgogICAgLy8gVE9ETyhoZXQpOiB1c2UgJ3RvU3RyaW5nJyBpbnN0ZWFkIG9mICd0ZXh0Jz8gSXQgd2lsbCBhZGQgJz0nIGZvciBzZXR0ZXJzCiAgICBTdHJpbmcgbmFtZSA9IGZ1bmN0aW9uLm1lbWJlck5hbWUudGV4dDsKICAgIGludCBraW5kOwogICAgaWYgKGZ1bmN0aW9uLmlzU3RhdGljIHx8IGZ1bmN0aW9uLmlzVG9wTGV2ZWwpIHsKICAgICAga2luZCA9IEZ1bmN0aW9uSW5mby5UT1BfTEVWRUxfRlVOQ1RJT05fS0lORDsKICAgIH0gZWxzZSBpZiAoZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICBraW5kID0gRnVuY3Rpb25JbmZvLk1FVEhPRF9GVU5DVElPTl9LSU5EOwogICAgfQoKICAgIGlmIChmdW5jdGlvbi5pc0NvbnN0cnVjdG9yKSB7CiAgICAgIG5hbWUgPSBuYW1lID09ICIiCiAgICAgICAgICA/ICIke2Z1bmN0aW9uLmVuY2xvc2luZ0NsYXNzLm5hbWV9IgogICAgICAgICAgOiAiJHtmdW5jdGlvbi5lbmNsb3NpbmdDbGFzcy5uYW1lfS4ke2Z1bmN0aW9uLm5hbWV9IjsKICAgICAga2luZCA9IEZ1bmN0aW9uSW5mby5DT05TVFJVQ1RPUl9GVU5DVElPTl9LSU5EOwogICAgfQoKICAgIGFzc2VydChraW5kICE9IG51bGwpOwoKICAgIEZ1bmN0aW9uTW9kaWZpZXJzIG1vZGlmaWVycyA9IG5ldyBGdW5jdGlvbk1vZGlmaWVycygKICAgICAgaXNTdGF0aWM6IGZ1bmN0aW9uLmlzU3RhdGljLAogICAgICBpc0NvbnN0OiBmdW5jdGlvbi5pc0NvbnN0LAogICAgICBpc0ZhY3Rvcnk6IGZ1bmN0aW9uLmlzQ29uc3RydWN0b3IKICAgICAgICAgID8gKGZ1bmN0aW9uIGFzIENvbnN0cnVjdG9yRW50aXR5KS5pc0ZhY3RvcnlDb25zdHJ1Y3RvcgogICAgICAgICAgOiBmYWxzZSwKICAgICAgaXNFeHRlcm5hbDogZnVuY3Rpb24uaXNFeHRlcm5hbCwKICAgICk7CiAgICBMaXN0PENvZGVTcGFuPiBjb2RlID0gZHVtcEluZm9UYXNrLmNvZGVPZihmdW5jdGlvbik7CgogICAgTGlzdDxQYXJhbWV0ZXJJbmZvPiBwYXJhbWV0ZXJzID0gPFBhcmFtZXRlckluZm8+W107CiAgICBMaXN0PFN0cmluZz4gaW5mZXJyZWRQYXJhbWV0ZXJUeXBlcyA9IDxTdHJpbmc+W107CgogICAgY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hQYXJhbWV0ZXJBc0xvY2FsKAogICAgICAgIGNsb3NlZFdvcmxkLmdsb2JhbExvY2Fsc01hcCwgZnVuY3Rpb24sIChwYXJhbWV0ZXIpIHsKICAgICAgaW5mZXJyZWRQYXJhbWV0ZXJUeXBlcy5hZGQoJyR7X3Jlc3VsdE9mUGFyYW1ldGVyKHBhcmFtZXRlcil9Jyk7CiAgICB9KTsKICAgIGludCBwYXJhbWV0ZXJJbmRleCA9IDA7CiAgICBjbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaFBhcmFtZXRlcihmdW5jdGlvbiwgKHR5cGUsIG5hbWUsIF8pIHsKICAgICAgcGFyYW1ldGVycy5hZGQobmV3IFBhcmFtZXRlckluZm8oCiAgICAgICAgICBuYW1lLCBpbmZlcnJlZFBhcmFtZXRlclR5cGVzW3BhcmFtZXRlckluZGV4KytdLCAnJHR5cGUnKSk7CiAgICB9KTsKCiAgICB2YXIgZnVuY3Rpb25UeXBlID0gZW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKGZ1bmN0aW9uKTsKICAgIFN0cmluZyByZXR1cm5UeXBlID0gJyR7ZnVuY3Rpb25UeXBlLnJldHVyblR5cGV9JzsKCiAgICBTdHJpbmcgaW5mZXJyZWRSZXR1cm5UeXBlID0gJyR7X3Jlc3VsdE9mTWVtYmVyKGZ1bmN0aW9uKS5yZXR1cm5UeXBlfSc7CiAgICBTdHJpbmcgc2lkZUVmZmVjdHMgPQogICAgICAgICcke19nbG9iYWxJbmZlcmVuY2VSZXN1bHRzLmluZmVycmVkRGF0YS5nZXRTaWRlRWZmZWN0c09mRWxlbWVudChmdW5jdGlvbil9JzsKCiAgICBpbnQgaW5saW5lZENvdW50ID0gZHVtcEluZm9UYXNrLmlubGluZUNvdW50W2Z1bmN0aW9uXTsKICAgIGlmIChpbmxpbmVkQ291bnQgPT0gbnVsbCkgaW5saW5lZENvdW50ID0gMDsKCiAgICBGdW5jdGlvbkluZm8gaW5mbyA9IG5ldyBGdW5jdGlvbkluZm8oCiAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICBmdW5jdGlvbktpbmQ6IGtpbmQsCiAgICAgICAgbW9kaWZpZXJzOiBtb2RpZmllcnMsCiAgICAgICAgcmV0dXJuVHlwZTogcmV0dXJuVHlwZSwKICAgICAgICBpbmZlcnJlZFJldHVyblR5cGU6IGluZmVycmVkUmV0dXJuVHlwZSwKICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzLAogICAgICAgIHNpZGVFZmZlY3RzOiBzaWRlRWZmZWN0cywKICAgICAgICBpbmxpbmVkQ291bnQ6IGlubGluZWRDb3VudCwKICAgICAgICBjb2RlOiBjb2RlLAogICAgICAgIHR5cGU6IGZ1bmN0aW9uVHlwZS50b1N0cmluZygpLAogICAgICAgIG91dHB1dFVuaXQ6IF91bml0SW5mb0Zvck1lbWJlcihmdW5jdGlvbikpOwogICAgX2VudGl0eVRvSW5mb1tmdW5jdGlvbl0gPSBpbmZvOwoKICAgIGludCBjbG9zdXJlU2l6ZSA9IF9hZGRDbG9zdXJlSW5mbyhpbmZvLCBmdW5jdGlvbik7CiAgICBzaXplICs9IGNsb3N1cmVTaXplOwoKICAgIGlmIChjb21waWxlci5vcHRpb25zLmV4cGVyaW1lbnRDYWxsSW5zdHJ1bWVudGF0aW9uKSB7CiAgICAgIC8vIFdlIHVzZSBmdW5jdGlvbi5oYXNoQ29kZSBiZWNhdXNlIGl0IGlzIGdsb2JhbGx5IHVuaXF1ZSBhbmQgaXQgaXMKICAgICAgLy8gYXZhaWxhYmxlIHdoaWxlIHdlIGFyZSBkb2luZyBjb2RlZ2VuLgogICAgICBpbmZvLmNvdmVyYWdlSWQgPSAnJHtmdW5jdGlvbi5oYXNoQ29kZX0nOwogICAgfQoKICAgIGluZm8uc2l6ZSA9IHNpemU7CgogICAgcmVzdWx0LmZ1bmN0aW9ucy5hZGQoaW5mbyk7CiAgICByZXR1cm4gaW5mbzsKICB9CgogIC8vLyBBZGRzIGNsb3N1cmUgaW5mb3JtYXRpb24gdG8gW2luZm9dLCB1c2luZyBhbGwgbmVzdGVkIGNsb3N1cmVzIGluIFttZW1iZXJdLgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBuZXN0ZWQgY2xvc3VyZXMsIHRvIGFkZCB0byB0aGUgaW5mbyBzaXplLgogIGludCBfYWRkQ2xvc3VyZUluZm8oSW5mbyBpbmZvLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBhc3NlcnQoaW5mbyBpcyBGdW5jdGlvbkluZm8gfHwgaW5mbyBpcyBGaWVsZEluZm8pOwogICAgaW50IHNpemUgPSAwOwogICAgTGlzdDxDbG9zdXJlSW5mbz4gbmVzdGVkQ2xvc3VyZXMgPSA8Q2xvc3VyZUluZm8+W107CiAgICBlbnZpcm9ubWVudC5mb3JFYWNoTmVzdGVkQ2xvc3VyZShtZW1iZXIsIChjbG9zdXJlKSB7CiAgICAgIENsb3N1cmVJbmZvIGNsb3N1cmVJbmZvID0gdmlzaXRDbG9zdXJlQ2xhc3MoY2xvc3VyZS5lbmNsb3NpbmdDbGFzcyk7CiAgICAgIGlmIChjbG9zdXJlSW5mbyAhPSBudWxsKSB7CiAgICAgICAgY2xvc3VyZUluZm8ucGFyZW50ID0gaW5mbzsKICAgICAgICBuZXN0ZWRDbG9zdXJlcy5hZGQoY2xvc3VyZUluZm8pOwogICAgICAgIHNpemUgKz0gY2xvc3VyZUluZm8uc2l6ZTsKICAgICAgfQogICAgfSk7CiAgICBpZiAoaW5mbyBpcyBGdW5jdGlvbkluZm8pIGluZm8uY2xvc3VyZXMgPSBuZXN0ZWRDbG9zdXJlczsKICAgIGlmIChpbmZvIGlzIEZpZWxkSW5mbykgaW5mby5jbG9zdXJlcyA9IG5lc3RlZENsb3N1cmVzOwoKICAgIHJldHVybiBzaXplOwogIH0KCiAgT3V0cHV0VW5pdEluZm8gX2luZm9Gcm9tT3V0cHV0VW5pdChPdXRwdXRVbml0IG91dHB1dFVuaXQpIHsKICAgIHJldHVybiBfb3V0cHV0VG9JbmZvLnB1dElmQWJzZW50KG91dHB1dFVuaXQsICgpIHsKICAgICAgLy8gRHVtcC1pbmZvIGN1cnJlbnRseSBvbmx5IHdvcmtzIHdpdGggdGhlIGZ1bGwgZW1pdHRlci4gSWYgYW5vdGhlcgogICAgICAvLyBlbWl0dGVyIGlzIHVzZWQgaXQgd2lsbCBmYWlsIGhlcmUuCiAgICAgIEJhY2tlbmRTdHJhdGVneSBiYWNrZW5kU3RyYXRlZ3kgPSBjb21waWxlci5iYWNrZW5kU3RyYXRlZ3k7CiAgICAgIGFzc2VydChvdXRwdXRVbml0Lm5hbWUgIT0gbnVsbCB8fCBvdXRwdXRVbml0LmlzTWFpbk91dHB1dCk7CiAgICAgIHZhciBmaWxlbmFtZSA9IG91dHB1dFVuaXQuaXNNYWluT3V0cHV0CiAgICAgICAgICA/IGNvbXBpbGVyLm9wdGlvbnMub3V0cHV0VXJpLnBhdGhTZWdtZW50cy5sYXN0CiAgICAgICAgICA6IGRlZmVycmVkUGFydEZpbGVOYW1lKGNvbXBpbGVyLm9wdGlvbnMsIG91dHB1dFVuaXQubmFtZSk7CiAgICAgIE91dHB1dFVuaXRJbmZvIGluZm8gPSBuZXcgT3V0cHV0VW5pdEluZm8oZmlsZW5hbWUsIG91dHB1dFVuaXQubmFtZSwKICAgICAgICAgIGJhY2tlbmRTdHJhdGVneS5lbWl0dGVyVGFzay5lbWl0dGVyLmdlbmVyYXRlZFNpemUob3V0cHV0VW5pdCkpOwogICAgICBpbmZvLmltcG9ydHMKICAgICAgICAgIC5hZGRBbGwoY2xvc2VkV29ybGQub3V0cHV0VW5pdERhdGEuZ2V0SW1wb3J0TmFtZXMob3V0cHV0VW5pdCkpOwogICAgICByZXN1bHQub3V0cHV0VW5pdHMuYWRkKGluZm8pOwogICAgICByZXR1cm4gaW5mbzsKICAgIH0pOwogIH0KCiAgT3V0cHV0VW5pdEluZm8gX3VuaXRJbmZvRm9yTWVtYmVyKE1lbWJlckVudGl0eSBlbnRpdHkpIHsKICAgIHJldHVybiBfaW5mb0Zyb21PdXRwdXRVbml0KAogICAgICAgIGNsb3NlZFdvcmxkLm91dHB1dFVuaXREYXRhLm91dHB1dFVuaXRGb3JNZW1iZXIoZW50aXR5KSk7CiAgfQoKICBPdXRwdXRVbml0SW5mbyBfdW5pdEluZm9Gb3JDbGFzcyhDbGFzc0VudGl0eSBlbnRpdHkpIHsKICAgIHJldHVybiBfaW5mb0Zyb21PdXRwdXRVbml0KAogICAgICAgIGNsb3NlZFdvcmxkLm91dHB1dFVuaXREYXRhLm91dHB1dFVuaXRGb3JDbGFzcyhlbnRpdHksIGFsbG93TnVsbDogdHJ1ZSkpOwogIH0KCiAgT3V0cHV0VW5pdEluZm8gX3VuaXRJbmZvRm9yQ29uc3RhbnQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgT3V0cHV0VW5pdCBvdXRwdXRVbml0ID0KICAgICAgICBjbG9zZWRXb3JsZC5vdXRwdXRVbml0RGF0YS5vdXRwdXRVbml0Rm9yQ29uc3RhbnQoY29uc3RhbnQpOwogICAgaWYgKG91dHB1dFVuaXQgPT0gbnVsbCkgewogICAgICBhc3NlcnQoY29uc3RhbnQgaXMgSW50ZXJjZXB0b3JDb25zdGFudFZhbHVlKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gX2luZm9Gcm9tT3V0cHV0VW5pdChvdXRwdXRVbml0KTsKICB9Cn0KCmNsYXNzIFNlbGVjdGlvbiB7CiAgZmluYWwgRW50aXR5IHNlbGVjdGVkRW50aXR5OwogIGZpbmFsIE9iamVjdCByZWNlaXZlckNvbnN0cmFpbnQ7CiAgU2VsZWN0aW9uKHRoaXMuc2VsZWN0ZWRFbnRpdHksIHRoaXMucmVjZWl2ZXJDb25zdHJhaW50KTsKfQoKLy8vIEludGVyZmFjZSB1c2VkIHRvIHJlY29yZCBpbmZvcm1hdGlvbiBmcm9tIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgY29tcGlsZXIgc28KLy8vIHdlIGNhbiBlbWl0IHRoZW0gaW4gdGhlIGR1bXAtaW5mbyB0YXNrLgovLyBUT0RPKHNpZ211bmQsaGV0KTogbW92ZSBtb3JlIGZlYXR1cmVzIGhlcmUuIElkZWFsbHkgdGhlIGR1bXAtaW5mbyB0YXNrCi8vIHNob3VsZG4ndCByZWFjaCBpbnRvIGludGVybmFscyBvZiBvdGhlciBwYXJ0cyBvZiB0aGUgY29tcGlsZXIuIEZvciBleGFtcGxlLAovLyB3ZSBjdXJyZW50bHkgcmVhY2ggaW50byB0aGUgZnVsbCBlbWl0dGVyIGFuZCBhcyBhIHJlc3VsdCB3ZSBkb24ndCBzdXBwb3J0Ci8vIGR1bXAtaW5mbyB3aGVuIHVzaW5nIHRoZSBzdGFydHVwLWVtaXR0ZXIgKGlzc3VlICMyNDE5MCkuCmFic3RyYWN0IGNsYXNzIEluZm9SZXBvcnRlciB7CiAgdm9pZCByZXBvcnRJbmxpbmVkKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsIE1lbWJlckVudGl0eSBpbmxpbmVkRnJvbSk7Cn0KCmNsYXNzIER1bXBJbmZvVGFzayBleHRlbmRzIENvbXBpbGVyVGFzayBpbXBsZW1lbnRzIEluZm9SZXBvcnRlciB7CiAgc3RhdGljIGNvbnN0IEltcGFjdFVzZUNhc2UgSU1QQUNUX1VTRSA9IGNvbnN0IEltcGFjdFVzZUNhc2UoJ0R1bXAgaW5mbycpOwogIGZpbmFsIENvbXBpbGVyIGNvbXBpbGVyOwogIGZpbmFsIGJvb2wgdXNlQmluYXJ5Rm9ybWF0OwoKICBEdW1wSW5mb1Rhc2sodGhpcy5jb21waWxlcikKICAgICAgOiB1c2VCaW5hcnlGb3JtYXQgPSBjb21waWxlci5vcHRpb25zLnVzZUR1bXBJbmZvQmluYXJ5Rm9ybWF0LAogICAgICAgIHN1cGVyKGNvbXBpbGVyLm1lYXN1cmVyKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICJEdW1wIEluZm8iOwoKICBFbGVtZW50SW5mb0NvbGxlY3RvciBpbmZvQ29sbGVjdG9yOwoKICAvLy8gVGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBvdXRwdXQuCiAgaW50IF9wcm9ncmFtU2l6ZTsKCiAgLy8vIERhdGEgYXNzb2NpYXRlZCB3aXRoIGphdmFzY3JpcHQgQVNUIG5vZGVzLiBUaGUgbWFwIG9ubHkgY29udGFpbnMga2V5cyBmb3IKICAvLy8gbm9kZXMgdGhhdCB3ZSBjYXJlIGFib3V0LiAgS2V5cyBhcmUgYXV0b21hdGljYWxseSBhZGRlZCB3aGVuCiAgLy8vIFtyZWdpc3RlckVudGl0eUFzdF0gaXMgY2FsbGVkLgogIGZpbmFsIE1hcDxqc0FzdC5Ob2RlLCBDb2RlU3Bhbj4gX25vZGVEYXRhID0gPGpzQXN0Lk5vZGUsIENvZGVTcGFuPnt9OwoKICAvLyBBIG1hcHBpbmcgZnJvbSBEYXJ0IEVudGl0aWVzIHRvIEphdmFzY3JpcHQgQVNUIE5vZGVzLgogIGZpbmFsIE1hcDxFbnRpdHksIExpc3Q8anNBc3QuTm9kZT4+IF9lbnRpdHlUb05vZGVzID0KICAgICAgPEVudGl0eSwgTGlzdDxqc0FzdC5Ob2RlPj57fTsKICBmaW5hbCBNYXA8Q29uc3RhbnRWYWx1ZSwganNBc3QuTm9kZT4gX2NvbnN0YW50VG9Ob2RlID0KICAgICAgPENvbnN0YW50VmFsdWUsIGpzQXN0Lk5vZGU+e307CgogIGZpbmFsIE1hcDxFbnRpdHksIGludD4gaW5saW5lQ291bnQgPSA8RW50aXR5LCBpbnQ+e307CgogIC8vIEEgbWFwcGluZyBmcm9tIGFuIGVudGl0eSB0byBhIGxpc3Qgb2YgZW50aXRpZXMgdGhhdCBhcmUKICAvLyBpbmxpbmVkIGluc2lkZSBvZiBpdC4KICBmaW5hbCBNYXA8RW50aXR5LCBMaXN0PEVudGl0eT4+IGlubGluZU1hcCA9IDxFbnRpdHksIExpc3Q8RW50aXR5Pj57fTsKCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgV29ybGRJbXBhY3Q+IGltcGFjdHMgPSA8TWVtYmVyRW50aXR5LCBXb3JsZEltcGFjdD57fTsKCiAgLy8vIFJlZ2lzdGVyIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LgogIHZvaWQgcmVwb3J0U2l6ZShpbnQgcHJvZ3JhbVNpemUpIHsKICAgIF9wcm9ncmFtU2l6ZSA9IHByb2dyYW1TaXplOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnRJbmxpbmVkKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsIE1lbWJlckVudGl0eSBpbmxpbmVkRnJvbSkgewogICAgaW5saW5lQ291bnQucHV0SWZBYnNlbnQoZWxlbWVudCwgKCkgPT4gMCk7CiAgICBpbmxpbmVDb3VudFtlbGVtZW50XSArPSAxOwogICAgaW5saW5lTWFwLnB1dElmQWJzZW50KGlubGluZWRGcm9tLCAoKSA9PiBuZXcgTGlzdDxFbnRpdHk+KCkpOwogICAgaW5saW5lTWFwW2lubGluZWRGcm9tXS5hZGQoZWxlbWVudCk7CiAgfQoKICB2b2lkIHJlZ2lzdGVySW1wYWN0KE1lbWJlckVudGl0eSBtZW1iZXIsIFdvcmxkSW1wYWN0IGltcGFjdCkgewogICAgaWYgKGNvbXBpbGVyLm9wdGlvbnMuZHVtcEluZm8pIHsKICAgICAgaW1wYWN0c1ttZW1iZXJdID0gaW1wYWN0OwogICAgfQogIH0KCiAgdm9pZCB1bnJlZ2lzdGVySW1wYWN0KHZhciBpbXBhY3RTb3VyY2UpIHsKICAgIGltcGFjdHMucmVtb3ZlKGltcGFjdFNvdXJjZSk7CiAgfQoKICAvLy8gUmV0dXJucyBhbiBpdGVyYWJsZSBvZiBbU2VsZWN0aW9uXXMgdGhhdCBhcmUgdXNlZCBieSBbZW50aXR5XS4gRWFjaAogIC8vLyBbU2VsZWN0aW9uXSBjb250YWlucyBhbiBlbnRpdHkgdGhhdCBpcyB1c2VkIGFuZCB0aGUgc2VsZWN0b3IgdGhhdAogIC8vLyBzZWxlY3RlZCB0aGUgZW50aXR5LgogIEl0ZXJhYmxlPFNlbGVjdGlvbj4gZ2V0UmV0YWluaW5nKEVudGl0eSBlbnRpdHksIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgV29ybGRJbXBhY3QgaW1wYWN0ID0gaW1wYWN0c1tlbnRpdHldOwogICAgaWYgKGltcGFjdCA9PSBudWxsKSByZXR1cm4gY29uc3QgPFNlbGVjdGlvbj5bXTsKCiAgICB2YXIgc2VsZWN0aW9ucyA9IDxTZWxlY3Rpb24+W107CiAgICBjb21waWxlci5pbXBhY3RTdHJhdGVneS52aXNpdEltcGFjdCgKICAgICAgICBlbnRpdHksCiAgICAgICAgaW1wYWN0LAogICAgICAgIG5ldyBXb3JsZEltcGFjdFZpc2l0b3JJbXBsKHZpc2l0RHluYW1pY1VzZTogKG1lbWJlciwgZHluYW1pY1VzZSkgewogICAgICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gZHluYW1pY1VzZS5yZWNlaXZlckNvbnN0cmFpbnQ7CiAgICAgICAgICBzZWxlY3Rpb25zLmFkZEFsbChjbG9zZWRXb3JsZAogICAgICAgICAgICAgIC8vIFRPRE8oaGV0KTogSGFuZGxlIGBjYWxsYCBvbiBgQ2xvc3VyZWAgdGhyb3VnaAogICAgICAgICAgICAgIC8vIGB3b3JsZC5pbmNsdWRlc0Nsb3N1cmVDYWxsYC4KICAgICAgICAgICAgICAubG9jYXRlTWVtYmVycyhkeW5hbWljVXNlLnNlbGVjdG9yLCBtYXNrKQogICAgICAgICAgICAgIC5tYXAoKE1lbWJlckVudGl0eSBlKSA9PiBuZXcgU2VsZWN0aW9uKGUsIG1hc2spKSk7CiAgICAgICAgfSwgdmlzaXRTdGF0aWNVc2U6IChtZW1iZXIsIHN0YXRpY1VzZSkgewogICAgICAgICAgc2VsZWN0aW9ucy5hZGQobmV3IFNlbGVjdGlvbihzdGF0aWNVc2UuZWxlbWVudCwgbnVsbCkpOwogICAgICAgIH0pLAogICAgICAgIElNUEFDVF9VU0UpOwogICAgcmV0dXJuIHNlbGVjdGlvbnM7CiAgfQoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgYSBqYXZhc2NyaXB0IEFTVCBub2RlIFtjb2RlXSB3YXMgcHJvZHVjZWQgYnkgdGhlIGRhcnQKICAvLy8gRW50aXR5IFtlbnRpdHldLgogIHZvaWQgcmVnaXN0ZXJFbnRpdHlBc3QoRW50aXR5IGVudGl0eSwganNBc3QuTm9kZSBjb2RlLAogICAgICB7TGlicmFyeUVudGl0eSBsaWJyYXJ5fSkgewogICAgaWYgKGNvbXBpbGVyLm9wdGlvbnMuZHVtcEluZm8pIHsKICAgICAgX2VudGl0eVRvTm9kZXMKICAgICAgICAgIC5wdXRJZkFic2VudChlbnRpdHksICgpID0+IG5ldyBMaXN0PGpzQXN0Lk5vZGU+KCkpCiAgICAgICAgICAuYWRkKGNvZGUpOwogICAgICBfbm9kZURhdGFbY29kZV0gPz89IHVzZUJpbmFyeUZvcm1hdCA/IG5ldyBDb2RlU3BhbigpIDogbmV3IF9Db2RlRGF0YSgpOwogICAgfQogIH0KCiAgdm9pZCByZWdpc3RlckNvbnN0YW50QXN0KENvbnN0YW50VmFsdWUgY29uc3RhbnQsIGpzQXN0Lk5vZGUgY29kZSkgewogICAgaWYgKGNvbXBpbGVyLm9wdGlvbnMuZHVtcEluZm8pIHsKICAgICAgYXNzZXJ0KF9jb25zdGFudFRvTm9kZVtjb25zdGFudF0gPT0gbnVsbCB8fAogICAgICAgICAgX2NvbnN0YW50VG9Ob2RlW2NvbnN0YW50XSA9PSBjb2RlKTsKICAgICAgX2NvbnN0YW50VG9Ob2RlW2NvbnN0YW50XSA9IGNvZGU7CiAgICAgIF9ub2RlRGF0YVtjb2RlXSA/Pz0gdXNlQmluYXJ5Rm9ybWF0ID8gbmV3IENvZGVTcGFuKCkgOiBuZXcgX0NvZGVEYXRhKCk7CiAgICB9CiAgfQoKICBib29sIGdldCBzaG91bGRFbWl0VGV4dCA9PiAhdXNlQmluYXJ5Rm9ybWF0OwogIC8vIFRPRE8oc2lnbXVuZCk6IGRlbGV0ZSB0aGUgc3RhY2sgb25jZSB3ZSBzdG9wIGVtaXR0aW5nIHRoZSBzb3VyY2UgdGV4dC4KICBMaXN0PF9Db2RlRGF0YT4gX3N0YWNrID0gW107CiAgdm9pZCBlbnRlck5vZGUoanNBc3QuTm9kZSBub2RlLCBpbnQgc3RhcnQpIHsKICAgIHZhciBkYXRhID0gX25vZGVEYXRhW25vZGVdOwogICAgZGF0YT8uc3RhcnQgPSBzdGFydDsKCiAgICBpZiAoc2hvdWxkRW1pdFRleHQgJiYgZGF0YSAhPSBudWxsKSB7CiAgICAgIF9zdGFjay5hZGQoZGF0YSk7CiAgICB9CiAgfQoKICB2b2lkIGVtaXQoU3RyaW5nIHN0cmluZykgewogICAgaWYgKHNob3VsZEVtaXRUZXh0KSB7CiAgICAgIC8vIE5vdGU6IGhpc3RvcmljYWxseSB3ZSBlbWl0dGVkIHRoZSBmdWxsIGJvZHkgb2YgY2xhc3NlcyBhbmQgbWV0aG9kcywgc28KICAgICAgLy8gaW5zdGFuY2UgbWV0aG9kcyBlbmRlZCB1cCBlbWl0dGVkIHR3aWNlLiAgT25jZSB3ZSB1c2UgYSBkaWZmZXJlbnQKICAgICAgLy8gZW5jb2Rpbmcgb2YgZHVtcCBpbmZvLCB3ZSBhbHNvIHBsYW4gdG8gcmVtb3ZlIHRoaXMgZHVwbGljYXRpb24uCiAgICAgIF9zdGFjay5mb3JFYWNoKChmKSA9PiBmLl90ZXh0LndyaXRlKHN0cmluZykpOwogICAgfQogIH0KCiAgdm9pZCBleGl0Tm9kZShqc0FzdC5Ob2RlIG5vZGUsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNsb3NpbmcpIHsKICAgIHZhciBkYXRhID0gX25vZGVEYXRhW25vZGVdOwogICAgZGF0YT8uZW5kID0gZW5kOwogICAgaWYgKHNob3VsZEVtaXRUZXh0ICYmIGRhdGEgIT0gbnVsbCkgewogICAgICB2YXIgbGFzdCA9IF9zdGFjay5yZW1vdmVMYXN0KCk7CiAgICAgIGFzc2VydChkYXRhID09IGxhc3QpOwogICAgICBhc3NlcnQoZGF0YS5zdGFydCA9PSBzdGFydCk7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgc291cmNlIGNvZGUgdGhhdCB3YXMgZ2VuZXJhdGVkIGZvciBhbiBlbnRpdHkuCiAgLy8vIElmIG5vIHNvdXJjZSBjb2RlIHdhcyBwcm9kdWNlZCwgcmV0dXJuIDAuCiAgaW50IHNpemVPZihFbnRpdHkgZW50aXR5KSB7CiAgICBpZiAoX2VudGl0eVRvTm9kZXMuY29udGFpbnNLZXkoZW50aXR5KSkgewogICAgICByZXR1cm4gX2VudGl0eVRvTm9kZXNbZW50aXR5XS5tYXAoc2l6ZU9mTm9kZSkuZm9sZCgwLCAoYSwgYikgPT4gYSArIGIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgfQoKICBpbnQgc2l6ZU9mTm9kZShqc0FzdC5Ob2RlIG5vZGUpIHsKICAgIENvZGVTcGFuIHNwYW4gPSBfbm9kZURhdGFbbm9kZV07CiAgICBpZiAoc3BhbiA9PSBudWxsKSByZXR1cm4gMDsKICAgIHJldHVybiBzcGFuLmVuZCAtIHNwYW4uc3RhcnQ7CiAgfQoKICBMaXN0PENvZGVTcGFuPiBjb2RlT2YoTWVtYmVyRW50aXR5IGVudGl0eSkgewogICAgTGlzdDxqc0FzdC5Ob2RlPiBjb2RlID0gX2VudGl0eVRvTm9kZXNbZW50aXR5XTsKICAgIGlmIChjb2RlID09IG51bGwpIHJldHVybiBjb25zdCBbXTsKICAgIHJldHVybiBjb2RlLm1hcCgoYXN0KSA9PiBfbm9kZURhdGFbYXN0XSkudG9MaXN0KCk7CiAgfQoKICB2b2lkIGR1bXBJbmZvKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cykgewogICAgbWVhc3VyZSgoKSB7CiAgICAgIGluZm9Db2xsZWN0b3IgPSBuZXcgRWxlbWVudEluZm9Db2xsZWN0b3IoCiAgICAgICAgICBjb21waWxlciwgdGhpcywgY2xvc2VkV29ybGQsIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMpCiAgICAgICAgLi5ydW4oKTsKCiAgICAgIHZhciBhbGxJbmZvID0gYnVpbGREdW1wSW5mb0RhdGEoY2xvc2VkV29ybGQpOwogICAgICBpZiAodXNlQmluYXJ5Rm9ybWF0KSB7CiAgICAgICAgZHVtcEluZm9CaW5hcnkoYWxsSW5mbyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZHVtcEluZm9Kc29uKGFsbEluZm8pOwogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgZHVtcEluZm9Kc29uKEFsbEluZm8gZGF0YSkgewogICAgU3RyaW5nQnVmZmVyIGpzb25CdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBKc29uRW5jb2RlciBlbmNvZGVyID0gY29uc3QgSnNvbkVuY29kZXIud2l0aEluZGVudCgnICAnKTsKICAgIENodW5rZWRDb252ZXJzaW9uU2luazxPYmplY3Q+IHNpbmsgPSBlbmNvZGVyLnN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oCiAgICAgICAgbmV3IFN0cmluZ0NvbnZlcnNpb25TaW5rLmZyb21TdHJpbmdTaW5rKGpzb25CdWZmZXIpKTsKICAgIHNpbmsuYWRkKG5ldyBBbGxJbmZvSnNvbkNvZGVjKGlzQmFja3dhcmRDb21wYXRpYmxlOiB0cnVlKS5lbmNvZGUoZGF0YSkpOwogICAgY29tcGlsZXIub3V0cHV0UHJvdmlkZXIuY3JlYXRlT3V0cHV0U2luaygKICAgICAgICBjb21waWxlci5vcHRpb25zLm91dHB1dFVyaS5wYXRoU2VnbWVudHMubGFzdCwKICAgICAgICAnaW5mby5qc29uJywKICAgICAgICBPdXRwdXRUeXBlLmR1bXBJbmZvKQogICAgICAuLmFkZChqc29uQnVmZmVyLnRvU3RyaW5nKCkpCiAgICAgIC4uY2xvc2UoKTsKICAgIGNvbXBpbGVyLnJlcG9ydGVyLnJlcG9ydEluZm8oTk9fTE9DQVRJT05fU1BBTk5BQkxFLCBNZXNzYWdlS2luZC5HRU5FUklDLCB7CiAgICAgICd0ZXh0JzogIlZpZXcgdGhlIGR1bXBlZCAuaW5mby5qc29uIGZpbGUgYXQgIgogICAgICAgICAgImh0dHBzOi8vZGFydC1sYW5nLmdpdGh1Yi5pby9kdW1wLWluZm8tdmlzdWFsaXplciIKICAgIH0pOwogIH0KCiAgdm9pZCBkdW1wSW5mb0JpbmFyeShBbGxJbmZvIGRhdGEpIHsKICAgIHZhciBuYW1lID0gY29tcGlsZXIub3B0aW9ucy5vdXRwdXRVcmkucGF0aFNlZ21lbnRzLmxhc3QgKyAiLmluZm8uZGF0YSI7CiAgICBTaW5rPExpc3Q8aW50Pj4gc2luayA9IG5ldyBCaW5hcnlPdXRwdXRTaW5rQWRhcHRlcihjb21waWxlci5vdXRwdXRQcm92aWRlcgogICAgICAgIC5jcmVhdGVCaW5hcnlTaW5rKGNvbXBpbGVyLm9wdGlvbnMub3V0cHV0VXJpLnJlc29sdmUobmFtZSkpKTsKICAgIGR1bXBfaW5mby5lbmNvZGUoZGF0YSwgc2luayk7CiAgICBjb21waWxlci5yZXBvcnRlci5yZXBvcnRJbmZvKE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwgTWVzc2FnZUtpbmQuR0VORVJJQywgewogICAgICAndGV4dCc6ICJVc2UgYHBhY2thZ2U6ZGFydDJqc19pbmZvYCB0byBwYXJzZSBhbmQgcHJvY2VzcyB0aGUgZHVtcGVkICIKICAgICAgICAgICIuaW5mby5kYXRhIGZpbGUuIgogICAgfSk7CiAgfQoKICBBbGxJbmZvIGJ1aWxkRHVtcEluZm9EYXRhKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgU3RvcHdhdGNoIHN0b3B3YXRjaCA9IG5ldyBTdG9wd2F0Y2goKTsKICAgIHN0b3B3YXRjaC5zdGFydCgpOwoKICAgIEFsbEluZm8gcmVzdWx0ID0gaW5mb0NvbGxlY3Rvci5yZXN1bHQ7CgogICAgLy8gUmVjdXJzaXZlbHkgYnVpbGQgbGlua3MgdG8gZnVuY3Rpb24gdXNlcwogICAgSXRlcmFibGU8RW50aXR5PiBmdW5jdGlvbkVudGl0aWVzID0KICAgICAgICBpbmZvQ29sbGVjdG9yLl9lbnRpdHlUb0luZm8ua2V5cy53aGVyZSgoaykgPT4gayBpcyBGdW5jdGlvbkVudGl0eSk7CiAgICBmb3IgKEZ1bmN0aW9uRW50aXR5IGVudGl0eSBpbiBmdW5jdGlvbkVudGl0aWVzKSB7CiAgICAgIEZ1bmN0aW9uSW5mbyBpbmZvID0gaW5mb0NvbGxlY3Rvci5fZW50aXR5VG9JbmZvW2VudGl0eV07CiAgICAgIEl0ZXJhYmxlPFNlbGVjdGlvbj4gdXNlcyA9IGdldFJldGFpbmluZyhlbnRpdHksIGNsb3NlZFdvcmxkKTsKICAgICAgLy8gRG9uJ3QgYm90aGVyIHJlY29yZGluZyBhbiBlbXB0eSBsaXN0IG9mIGRlcGVuZGVuY2llcy4KICAgICAgZm9yIChTZWxlY3Rpb24gc2VsZWN0aW9uIGluIHVzZXMpIHsKICAgICAgICAvLyBEb24ndCByZWdpc3RlciBkYXJ0MmpzIGJ1aWx0aW4gZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCByZWNvcmRlZC4KICAgICAgICBJbmZvIHVzZUluZm8gPSBpbmZvQ29sbGVjdG9yLl9lbnRpdHlUb0luZm9bc2VsZWN0aW9uLnNlbGVjdGVkRW50aXR5XTsKICAgICAgICBpZiAodXNlSW5mbyA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICBpbmZvLnVzZXMuYWRkKG5ldyBEZXBlbmRlbmN5SW5mbygKICAgICAgICAgICAgdXNlSW5mbywgc2VsZWN0aW9uLnJlY2VpdmVyQ29uc3RyYWludD8udG9TdHJpbmcoKSkpOwogICAgICB9CiAgICB9CgogICAgLy8gUmVjdXJzaXZlbHkgYnVpbGQgbGlua3MgdG8gZmllbGQgdXNlcwogICAgSXRlcmFibGU8RW50aXR5PiBmaWVsZEVudGl0eSA9CiAgICAgICAgaW5mb0NvbGxlY3Rvci5fZW50aXR5VG9JbmZvLmtleXMud2hlcmUoKGspID0+IGsgaXMgRmllbGRFbnRpdHkpOwogICAgZm9yIChGaWVsZEVudGl0eSBlbnRpdHkgaW4gZmllbGRFbnRpdHkpIHsKICAgICAgRmllbGRJbmZvIGluZm8gPSBpbmZvQ29sbGVjdG9yLl9lbnRpdHlUb0luZm9bZW50aXR5XTsKICAgICAgSXRlcmFibGU8U2VsZWN0aW9uPiB1c2VzID0gZ2V0UmV0YWluaW5nKGVudGl0eSwgY2xvc2VkV29ybGQpOwogICAgICAvLyBEb24ndCBib3RoZXIgcmVjb3JkaW5nIGFuIGVtcHR5IGxpc3Qgb2YgZGVwZW5kZW5jaWVzLgogICAgICBmb3IgKFNlbGVjdGlvbiBzZWxlY3Rpb24gaW4gdXNlcykgewogICAgICAgIEluZm8gdXNlSW5mbyA9IGluZm9Db2xsZWN0b3IuX2VudGl0eVRvSW5mb1tzZWxlY3Rpb24uc2VsZWN0ZWRFbnRpdHldOwogICAgICAgIGlmICh1c2VJbmZvID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgIGluZm8udXNlcy5hZGQobmV3IERlcGVuZGVuY3lJbmZvKAogICAgICAgICAgICB1c2VJbmZvLCBzZWxlY3Rpb24ucmVjZWl2ZXJDb25zdHJhaW50Py50b1N0cmluZygpKSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBOb3RpZnkgdGhlIGltcGFjdCBzdHJhdGVneSBpbXBhY3RzIGFyZSBubyBsb25nZXIgbmVlZGVkIGZvciBkdW1wIGluZm8uCiAgICBjb21waWxlci5pbXBhY3RTdHJhdGVneS5vbkltcGFjdFVzZWQoSU1QQUNUX1VTRSk7CgogICAgLy8gVHJhY2sgZGVwZW5kZW5jaWVzIHRoYXQgY29tZSBmcm9tIGlubGluaW5nLgogICAgZm9yIChFbnRpdHkgZW50aXR5IGluIGlubGluZU1hcC5rZXlzKSB7CiAgICAgIENvZGVJbmZvIG91dGVySW5mbyA9IGluZm9Db2xsZWN0b3IuX2VudGl0eVRvSW5mb1tlbnRpdHldOwogICAgICBpZiAob3V0ZXJJbmZvID09IG51bGwpIGNvbnRpbnVlOwogICAgICBmb3IgKEVudGl0eSBpbmxpbmVkIGluIGlubGluZU1hcFtlbnRpdHldKSB7CiAgICAgICAgSW5mbyBpbmxpbmVkSW5mbyA9IGluZm9Db2xsZWN0b3IuX2VudGl0eVRvSW5mb1tpbmxpbmVkXTsKICAgICAgICBpZiAoaW5saW5lZEluZm8gPT0gbnVsbCkgY29udGludWU7CiAgICAgICAgb3V0ZXJJbmZvLnVzZXMuYWRkKG5ldyBEZXBlbmRlbmN5SW5mbyhpbmxpbmVkSW5mbywgJ2lubGluZWQnKSk7CiAgICAgIH0KICAgIH0KCiAgICByZXN1bHQuZGVmZXJyZWRGaWxlcyA9IGNsb3NlZFdvcmxkLm91dHB1dFVuaXREYXRhCiAgICAgICAgLmNvbXB1dGVEZWZlcnJlZE1hcChjb21waWxlci5vcHRpb25zLCBjbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQpOwogICAgc3RvcHdhdGNoLnN0b3AoKTsKCiAgICByZXN1bHQucHJvZ3JhbSA9IG5ldyBQcm9ncmFtSW5mbygKICAgICAgICBlbnRyeXBvaW50OiBpbmZvQ29sbGVjdG9yCiAgICAgICAgICAgIC5fZW50aXR5VG9JbmZvW2Nsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudC5tYWluRnVuY3Rpb25dLAogICAgICAgIHNpemU6IF9wcm9ncmFtU2l6ZSwKICAgICAgICBkYXJ0MmpzVmVyc2lvbjoKICAgICAgICAgICAgY29tcGlsZXIub3B0aW9ucy5oYXNCdWlsZElkID8gY29tcGlsZXIub3B0aW9ucy5idWlsZElkIDogbnVsbCwKICAgICAgICBjb21waWxhdGlvbk1vbWVudDogbmV3IERhdGVUaW1lLm5vdygpLAogICAgICAgIGNvbXBpbGF0aW9uRHVyYXRpb246IGNvbXBpbGVyLm1lYXN1cmVyLmVsYXBzZWRXYWxsQ2xvY2ssCiAgICAgICAgdG9Kc29uRHVyYXRpb246CiAgICAgICAgICAgIG5ldyBEdXJhdGlvbihtaWxsaXNlY29uZHM6IHN0b3B3YXRjaC5lbGFwc2VkTWlsbGlzZWNvbmRzKSwKICAgICAgICBkdW1wSW5mb0R1cmF0aW9uOiBuZXcgRHVyYXRpb24obWlsbGlzZWNvbmRzOiB0aGlzLnRpbWluZyksCiAgICAgICAgbm9TdWNoTWV0aG9kRW5hYmxlZDogY2xvc2VkV29ybGQuYmFja2VuZFVzYWdlLmlzTm9TdWNoTWV0aG9kVXNlZCwKICAgICAgICBpc1J1bnRpbWVUeXBlVXNlZDogY2xvc2VkV29ybGQuYmFja2VuZFVzYWdlLmlzUnVudGltZVR5cGVVc2VkLAogICAgICAgIGlzSXNvbGF0ZUluVXNlOiBmYWxzZSwKICAgICAgICBpc0Z1bmN0aW9uQXBwbHlVc2VkOiBjbG9zZWRXb3JsZC5iYWNrZW5kVXNhZ2UuaXNGdW5jdGlvbkFwcGx5VXNlZCwKICAgICAgICBpc01pcnJvcnNVc2VkOiBjbG9zZWRXb3JsZC5iYWNrZW5kVXNhZ2UuaXNNaXJyb3JzVXNlZCwKICAgICAgICBtaW5pZmllZDogY29tcGlsZXIub3B0aW9ucy5lbmFibGVNaW5pZmljYXRpb24pOwoKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgovLy8gSGVscGVyIGNsYXNzIHRvIHN0b3JlIHdoYXQgZHVtcC1pbmZvIHdpbGwgc2hvdyBmb3IgYSBwaWVjZSBvZiBjb2RlLgovLyBUT0RPKHNpZ211bmQpOiBkZWxldGUgb25jZSB3ZSBubyBsb25nZXIgZW1pdCB0ZXh0IGJ5IGRlZmF1bHQuCmNsYXNzIF9Db2RlRGF0YSBleHRlbmRzIENvZGVTcGFuIHsKICBTdHJpbmdCdWZmZXIgX3RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCB0ZXh0ID0+ICckX3RleHQnOwogIGludCBnZXQgbGVuZ3RoID0+IGVuZCAtIHN0YXJ0Owp9CoKvAE5OPAETARZDASk0RgEfIBwuFjgmTUMhLh1GHikuJD0hJwEdGyI8IwFJTwEoPEw8AUslAQ88PC8jJxg3KCIIMQQBMgZMTUwjNzYEATA2Gx0GKU8fAUJFOyQ0JgojMiExIwoICAE4Lx8lIQgIATcgEQQBRTEBLzQBSz4/ICgjIRMGASs2AUgrASQaNCcULyEhUSpCBgE6Ry8tBgE0JAEdEQQBLCcpGiYvJgErOkU7JDErOyYMCiNKISsoOCYMCg9GCAg6PiIvKTkkCggIARsBTyQnEwYBIxYEATcvHDAtKgE/NwE7KyknASYYBAE4LkwSOQFQLA40MzIwBgEiGC5ANQYBGgE5IyEoQRMnBzkBODYBPD1GCBxQKEUIAT42AUsZVQE7MAEqFBweIDAgIiQUJzMkATcZATpKLzAGARYBIBEEAVEGTjg3Ejg5SyEjKSIICD47AREEAT42SixCQi05RUpKE0okEwgEATsgQQQBOSBRBAFAHEQeNBMGLAQCARIfIzsCAVEsSk9NPB5IAgFCTBseAR5EIgEMIgEmASgUAVBDJUgBOzckOSUBOAE9G0gBUAExJSAEAQxJLx9CKQQBQSUgBgQBLCIEAUpIG04qNAEkKRAQSz4oPy44QTFCDBUXBAFLFzkhJRU9Fk4GBAFGJTIuKE4GBAEvTB8vIBkBKhgGBAEdGlBLSTQGBAFEIBUqJhwjBgQBTDAeLk4NEAYEASQlICIEAS80JzcEASo7ETA/EQE0HSEPHwgIBAEkMj5JPk0uNhUdIxFPND0IBAEmTE9GIk9MHQgEATgrFwErATAoTDY/RD8qS04nKkEIBgEtI0kuPEQ/Kk4nKkEIBgFONgEzLEAnMkErSAgGATZPFgEmIkkcGEsvQRhHQ0pHH0s/OAETBAIBSEEjKwwfIQIBI3BhY2thZ2U6Y29tcGlsZXIvc3JjL2R1bXBfaW5mby5kYXJ0NHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2VsZW1lbnRzL2VudGl0aWVzLmRhcnSygy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGVudGl0aWVzOwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgc2hvdyBBc3luY01vZGlmaWVyOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnIHNob3cgQ2FsbFN0cnVjdHVyZTsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCc7CmltcG9ydCAnbmFtZXMuZGFydCc7CmltcG9ydCAndHlwZXMuZGFydCc7CgovLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBlbnRpdGllcy4KLy8vCi8vLyBJbXBsZW1lbnQgdGhpcyBkaXJlY3RseSBpZiB0aGUgZW50aXR5IGlzIG5vdCBhIERhcnQgbGFuZ3VhZ2UgZW50aXR5LgovLy8gRW50aXRpZXMgZGVmaW5lZCB3aXRoaW4gdGhlIERhcnQgbGFuZ3VhZ2Ugc2hvdWxkIGltcGxlbWVudCBbRWxlbWVudF0uCi8vLwovLy8gRm9yIGluc3RhbmNlLCB0aGUgSmF2YVNjcmlwdCBiYWNrZW5kIG5lZWQgdG8gY3JlYXRlIHN5bnRoZXRpYyB2YXJpYWJsZXMgZm9yCi8vLyBjYWxsaW5nIGludGVyY2VwdGVkIGNsYXNzZXMgYW5kIHN1Y2ggdmFyaWFibGVzIGRvIG5vdCBjb3JyZXNwb25kIHRvIGFuCi8vLyBlbnRpdHkgaW4gdGhlIERhcnQgc291cmNlIGNvZGUgbm9yIGluIHRoZSB0ZXJtaW5vbG9neSBvZiB0aGUgRGFydCBsYW5ndWFnZQovLy8gYW5kIHNob3VsZCB0aGVyZWZvcmUgaW1wbGVtZW50IFtFbnRpdHldIGRpcmVjdGx5LgphYnN0cmFjdCBjbGFzcyBFbnRpdHkgaW1wbGVtZW50cyBTcGFubmFibGUgewogIFN0cmluZyBnZXQgbmFtZTsKfQoKLy8vIFN0cmlwcGVkIGRvd24gc3VwZXIgaW50ZXJmYWNlIGZvciBsaWJyYXJ5IGxpa2UgZW50aXRpZXMuCi8vLwovLy8gQ3VycmVudGx5IG9ubHkgW0xpYnJhcnlFbGVtZW50XSBidXQgbGF0ZXIgYWxzbyBrZXJuZWwgYmFzZWQgRGFydCBjbGFzc2VzCi8vLyBhbmQvb3IgRGFydC1pbi1KUyBjbGFzc2VzLgphYnN0cmFjdCBjbGFzcyBMaWJyYXJ5RW50aXR5IGV4dGVuZHMgRW50aXR5IHsKICAvLy8gUmV0dXJuIHRoZSBjYW5vbmljYWwgdXJpIHRoYXQgaWRlbnRpZmllcyB0aGlzIGxpYnJhcnkuCiAgVXJpIGdldCBjYW5vbmljYWxVcmk7Cn0KCi8vLyBTdHJpcHBlZCBkb3duIHN1cGVyIGludGVyZmFjZSBmb3IgaW1wb3J0IGVudGl0aWVzLgovLy8KLy8vIFRoZSBbbmFtZV0gcHJvcGVydHkgY29ycmVzcG9uZHMgdG8gdGhlIHByZWZpeCBuYW1lLCBpZiBhbnkuCmNsYXNzIEltcG9ydEVudGl0eSB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8vLyBUaGUgY2Fub25pY2FsIFVSSSBvZiB0aGUgbGlicmFyeSB3aGVyZSB0aGlzIGltcG9ydCBvY2N1cnMKICAvLy8gKHdoZXJlIHRoZSBpbXBvcnQgaXMgZGVjbGFyZWQpLgogIGZpbmFsIFVyaSBlbmNsb3NpbmdMaWJyYXJ5VXJpOwoKICAvLy8gV2hldGhlciB0aGUgaW1wb3J0IGlzIGEgZGVmZXJyZWQgaW1wb3J0LgogIGZpbmFsIGJvb2wgaXNEZWZlcnJlZDsKCiAgLy8vIFRoZSB0YXJnZXQgaW1wb3J0IFVSSS4KICBmaW5hbCBVcmkgdXJpOwoKICBJbXBvcnRFbnRpdHkodGhpcy5pc0RlZmVycmVkLCB0aGlzLm5hbWUsIHRoaXMudXJpLCB0aGlzLmVuY2xvc2luZ0xpYnJhcnlVcmkpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnaW1wb3J0KCRuYW1lOiR7aXNEZWZlcnJlZCA/ICcgZGVmZXJyZWQnIDogJyd9KSc7Cn0KCi8vLyBTdHJpcHBlZCBkb3duIHN1cGVyIGludGVyZmFjZSBmb3IgY2xhc3MgbGlrZSBlbnRpdGllcy4KLy8vCi8vLyBDdXJyZW50bHkgb25seSBbQ2xhc3NFbGVtZW50XSBidXQgbGF0ZXIgYWxzbyBrZXJuZWwgYmFzZWQgRGFydCBjbGFzc2VzCi8vLyBhbmQvb3IgRGFydC1pbi1KUyBjbGFzc2VzLgphYnN0cmFjdCBjbGFzcyBDbGFzc0VudGl0eSBleHRlbmRzIEVudGl0eSB7CiAgLy8vIElmIHRoaXMgaXMgYSBub3JtYWwgY2xhc3MsIHRoZSBlbmNsb3NpbmcgbGlicmFyeSBmb3IgdGhpcyBjbGFzcy4gSWYgdGhpcwogIC8vLyBpcyBhIGNsb3N1cmUgY2xhc3MsIHRoZSBlbmNsb3NpbmcgY2xhc3Mgb2YgdGhlIGNsb3N1cmUgZm9yIHdoaWNoIGl0IHdhcwogIC8vLyBjcmVhdGVkLgogIExpYnJhcnlFbnRpdHkgZ2V0IGxpYnJhcnk7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSBzeW50aGVzaXplZCBjbGFzcyBmb3IgYSBjbG9zdXJpemVkIG1ldGhvZCBvciBsb2NhbAogIC8vLyBmdW5jdGlvbi4KICBib29sIGdldCBpc0Nsb3N1cmU7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MuCiAgYm9vbCBnZXQgaXNBYnN0cmFjdDsKfQoKYWJzdHJhY3QgY2xhc3MgVHlwZWRlZkVudGl0eSBleHRlbmRzIEVudGl0eSB7CiAgLy8vIFRoZSBsaWJyYXJ5IGluIHdoaWNoIHRoZSB0eXBlZGVmIHdhcyBkZWNsYXJlZC4KICBMaWJyYXJ5RW50aXR5IGdldCBsaWJyYXJ5Owp9CgphYnN0cmFjdCBjbGFzcyBUeXBlVmFyaWFibGVFbnRpdHkgZXh0ZW5kcyBFbnRpdHkgewogIC8vLyBUaGUgY2xhc3Mgb3IgZ2VuZXJpYyBtZXRob2QgdGhhdCBkZWNsYXJlZCB0aGlzIHR5cGUgdmFyaWFibGUuCiAgRW50aXR5IGdldCB0eXBlRGVjbGFyYXRpb247CgogIC8vLyBUaGUgaW5kZXggb2YgdGhpcyB0eXBlIHZhcmlhYmxlIGluIHRoZSB0eXBlIHZhcmlhYmxlcyBvZiBpdHMKICAvLy8gW3R5cGVEZWNsYXJhdGlvbl0uCiAgaW50IGdldCBpbmRleDsKfQoKLy8vIFN0cmlwcGVkIGRvd24gc3VwZXIgaW50ZXJmYWNlIGZvciBtZW1iZXIgbGlrZSBlbnRpdGllcywgdGhhdCBpcywKLy8vIGNvbnN0cnVjdG9ycywgbWV0aG9kcywgZmllbGRzIGV0Yy4KLy8vCi8vLyBDdXJyZW50bHkgb25seSBbTWVtYmVyRWxlbWVudF0gYnV0IGxhdGVyIGFsc28ga2VybmVsIGJhc2VkIERhcnQgbWVtYmVycwovLy8gYW5kL29yIERhcnQtaW4tSlMgcHJvcGVydGllcy4KYWJzdHJhY3QgY2xhc3MgTWVtYmVyRW50aXR5IGV4dGVuZHMgRW50aXR5IHsKICAvLy8gVGhlIFtOYW1lXSBvZiBtZW1iZXIgd2hpY2ggdGFrZXMgcHJpdmFjeSBhbmQgZ2V0dGVyL3NldHRlciBuYW1pbmcgaW50bwogIC8vLyBhY2NvdW50LgogIE5hbWUgZ2V0IG1lbWJlck5hbWU7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSBtZW1iZXIgb2YgYSBsaWJyYXJ5LgogIGJvb2wgZ2V0IGlzVG9wTGV2ZWw7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSBzdGF0aWMgbWVtYmVyIG9mIGEgY2xhc3MuCiAgYm9vbCBnZXQgaXNTdGF0aWM7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYW4gaW5zdGFuY2UgbWVtYmVyIG9mIGEgY2xhc3MuCiAgYm9vbCBnZXQgaXNJbnN0YW5jZU1lbWJlcjsKCiAgLy8vIFdoZXRoZXIgdGhpcyBpcyBhIGNvbnN0cnVjdG9yLgogIGJvb2wgZ2V0IGlzQ29uc3RydWN0b3I7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSBmaWVsZC4KICBib29sIGdldCBpc0ZpZWxkOwoKICAvLy8gV2hldGhlciB0aGlzIGlzIGEgbm9ybWFsIG1ldGhvZCAobmVpdGhlciBjb25zdHJ1Y3RvciwgZ2V0dGVyIG9yIHNldHRlcikKICAvLy8gb3Igb3BlcmF0b3IgbWV0aG9kLgogIGJvb2wgZ2V0IGlzRnVuY3Rpb247CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSBnZXR0ZXIuCiAgYm9vbCBnZXQgaXNHZXR0ZXI7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSBzZXR0ZXIuCiAgYm9vbCBnZXQgaXNTZXR0ZXI7CgogIC8vLyBXaGV0aGVyIHRoaXMgbWVtYmVyIGlzIGFzc2lnbmFibGUsIGkuZS4gYSBub24tZmluYWwsIG5vbi1jb25zdCBmaWVsZC4KICBib29sIGdldCBpc0Fzc2lnbmFibGU7CgogIC8vLyBXaGV0aGVyIHRoaXMgbWVtYmVyIGlzIGNvbnN0YW50LCBpLmUuIGEgY29uc3RhbnQgZmllbGQgb3IgY29uc3RydWN0b3IuCiAgYm9vbCBnZXQgaXNDb25zdDsKCiAgLy8vIFdoZXRoZXIgdGhpcyBtZW1iZXIgaXMgYWJzdHJhY3QsIGkuZS4gYW4gYWJzdHJhY3QgbWV0aG9kLCBnZXR0ZXIgb3IKICAvLy8gc2V0dGVyLgogIGJvb2wgZ2V0IGlzQWJzdHJhY3Q7CgogIC8vLyBUaGUgZW5jbG9zaW5nIGNsYXNzIGlmIHRoaXMgaXMgYSBjb25zdHJ1Y3RvciwgaW5zdGFuY2UgbWVtYmVyIG9yCiAgLy8vIHN0YXRpYyBtZW1iZXIgb2YgYSBjbGFzcy4KICBDbGFzc0VudGl0eSBnZXQgZW5jbG9zaW5nQ2xhc3M7CgogIC8vLyBUaGUgZW5jbG9zaW5nIGxpYnJhcnkgaWYgdGhpcyBpcyBhIGxpYnJhcnkgbWVtYmVyLCBvdGhlcndpc2UgdGhlCiAgLy8vIGVuY2xvc2luZyBsaWJyYXJ5IG9mIHRoZSBbZW5jbG9zaW5nQ2xhc3NdLgogIExpYnJhcnlFbnRpdHkgZ2V0IGxpYnJhcnk7Cn0KCi8vLyBTdHJpcHBlZCBkb3duIHN1cGVyIGludGVyZmFjZSBmb3IgZmllbGQgbGlrZSBlbnRpdGllcy4KLy8vCi8vLyBDdXJyZW50bHkgb25seSBbRmllbGRFbGVtZW50XSBidXQgbGF0ZXIgYWxzbyBrZXJuZWwgYmFzZWQgRGFydCBmaWVsZHMKLy8vIGFuZC9vciBEYXJ0LWluLUpTIGZpZWxkLWxpa2UgcHJvcGVydGllcy4KYWJzdHJhY3QgY2xhc3MgRmllbGRFbnRpdHkgZXh0ZW5kcyBNZW1iZXJFbnRpdHkge30KCi8vLyBTdHJpcHBlZCBkb3duIHN1cGVyIGludGVyZmFjZSBmb3IgZnVuY3Rpb24gbGlrZSBlbnRpdGllcy4KLy8vCi8vLyBDdXJyZW50bHkgb25seSBbTWV0aG9kRWxlbWVudF0gYnV0IGxhdGVyIGFsc28ga2VybmVsIGJhc2VkIERhcnQgY29uc3RydWN0b3JzCi8vLyBhbmQgbWV0aG9kcyBhbmQvb3IgRGFydC1pbi1KUyBmdW5jdGlvbi1saWtlIHByb3BlcnRpZXMuCmFic3RyYWN0IGNsYXNzIEZ1bmN0aW9uRW50aXR5IGV4dGVuZHMgTWVtYmVyRW50aXR5IHsKICAvLy8gV2hldGhlciB0aGlzIGZ1bmN0aW9uIGlzIGV4dGVybmFsLCBpLmUuIHRoZSBib2R5IGlzIG5vdCBkZWZpbmVkIGluIHRlcm1zCiAgLy8vIG9mIERhcnQgY29kZS4KICBib29sIGdldCBpc0V4dGVybmFsOwoKICAvLy8gVGhlIHN0cnVjdHVyZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycy4KICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZTsKCiAgLy8vIFRoZSBzeW5jaHJvbm91cy9hc3luY2hyb25vdXMgbWFya2VyIG9uIHRoaXMgZnVuY3Rpb24uCiAgQXN5bmNNYXJrZXIgZ2V0IGFzeW5jTWFya2VyOwp9CgovLy8gRW51bSBmb3IgdGhlIHN5bmNocm9ub3VzL2FzeW5jaHJvbm91cyBmdW5jdGlvbiBib2R5IG1vZGlmaWVycy4KY2xhc3MgQXN5bmNNYXJrZXIgewogIC8vLyBUaGUgZGVmYXVsdCBmdW5jdGlvbiBib2R5IG1hcmtlci4KICBzdGF0aWMgY29uc3QgQXN5bmNNYXJrZXIgU1lOQyA9IGNvbnN0IEFzeW5jTWFya2VyLl8oQXN5bmNNb2RpZmllci5TeW5jKTsKCiAgLy8vIFRoZSBgc3luYypgIGZ1bmN0aW9uIGJvZHkgbWFya2VyLgogIHN0YXRpYyBjb25zdCBBc3luY01hcmtlciBTWU5DX1NUQVIgPQogICAgICBjb25zdCBBc3luY01hcmtlci5fKEFzeW5jTW9kaWZpZXIuU3luY1N0YXIsIGlzWWllbGRpbmc6IHRydWUpOwoKICAvLy8gVGhlIGBhc3luY2AgZnVuY3Rpb24gYm9keSBtYXJrZXIuCiAgc3RhdGljIGNvbnN0IEFzeW5jTWFya2VyIEFTWU5DID0KICAgICAgY29uc3QgQXN5bmNNYXJrZXIuXyhBc3luY01vZGlmaWVyLkFzeW5jLCBpc0FzeW5jOiB0cnVlKTsKCiAgLy8vIFRoZSBgYXN5bmMqYCBmdW5jdGlvbiBib2R5IG1hcmtlci4KICBzdGF0aWMgY29uc3QgQXN5bmNNYXJrZXIgQVNZTkNfU1RBUiA9IGNvbnN0IEFzeW5jTWFya2VyLl8oCiAgICAgIEFzeW5jTW9kaWZpZXIuQXN5bmNTdGFyLAogICAgICBpc0FzeW5jOiB0cnVlLAogICAgICBpc1lpZWxkaW5nOiB0cnVlKTsKCiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIG1hcmtlciBkZWZpbmVzIHRoZSBmdW5jdGlvbiBib2R5IHRvIGhhdmUgYW4KICAvLy8gYXN5bmNocm9ub3VzIHJlc3VsdCwgdGhhdCBpcywgZWl0aGVyIGEgW0Z1dHVyZV0gb3IgYSBbU3RyZWFtXS4KICBmaW5hbCBib29sIGlzQXN5bmM7CgogIC8vLyBJcyBgdHJ1ZWAgaWYgdGhpcyBtYXJrZXIgZGVmaW5lcyB0aGUgZnVuY3Rpb24gYm9keSB0byBoYXZlIGEgcGx1cmFsCiAgLy8vIHJlc3VsdCwgdGhhdCBpcywgZWl0aGVyIGFuIFtJdGVyYWJsZV0gb3IgYSBbU3RyZWFtXS4KICBmaW5hbCBib29sIGlzWWllbGRpbmc7CgogIGZpbmFsIEFzeW5jTW9kaWZpZXIgYXN5bmNQYXJzZXJTdGF0ZTsKCiAgY29uc3QgQXN5bmNNYXJrZXIuXyh0aGlzLmFzeW5jUGFyc2VyU3RhdGUsCiAgICAgIHt0aGlzLmlzQXN5bmM6IGZhbHNlLCB0aGlzLmlzWWllbGRpbmc6IGZhbHNlfSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnJHtpc0FzeW5jID8gJ2FzeW5jJyA6ICdzeW5jJ30ke2lzWWllbGRpbmcgPyAnKicgOiAnJ30nOwogIH0KCiAgLy8vIENhbm9uaWNhbCBsaXN0IG9mIG1hcmtlciB2YWx1ZXMuCiAgLy8vCiAgLy8vIEFkZGVkIHRvIG1ha2UgW0FzeW5jTWFya2VyXSBlbnVtLWxpa2UuCiAgc3RhdGljIGNvbnN0IExpc3Q8QXN5bmNNYXJrZXI+IHZhbHVlcyA9IGNvbnN0IDxBc3luY01hcmtlcj5bCiAgICBTWU5DLAogICAgU1lOQ19TVEFSLAogICAgQVNZTkMsCiAgICBBU1lOQ19TVEFSCiAgXTsKCiAgLy8vIEluZGV4IHRvIHRoaXMgbWFya2VyIHdpdGhpbiBbdmFsdWVzXS4KICAvLy8KICAvLy8gQWRkZWQgdG8gbWFrZSBbQXN5bmNNYXJrZXJdIGVudW0tbGlrZS4KICBpbnQgZ2V0IGluZGV4ID0+IHZhbHVlcy5pbmRleE9mKHRoaXMpOwp9CgovLy8gU3RyaXBwZWQgZG93biBzdXBlciBpbnRlcmZhY2UgZm9yIGNvbnN0cnVjdG9yIGxpa2UgZW50aXRpZXMuCi8vLwovLy8gQ3VycmVudGx5IG9ubHkgW0NvbnN0cnVjdG9yRWxlbWVudF0gYnV0IGxhdGVyIGFsc28ga2VybmVsIGJhc2VkIERhcnQKLy8vIGNvbnN0cnVjdG9ycyBhbmQvb3IgRGFydC1pbi1KUyBjb25zdHJ1Y3Rvci1saWtlIHByb3BlcnRpZXMuCi8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSBmYWN0b3J5IGNvbnN0cnVjdG9ycyBmcm9tIHRoZSBzZXQgb2YKLy8gY29uc3RydWN0b3JzLgphYnN0cmFjdCBjbGFzcyBDb25zdHJ1Y3RvckVudGl0eSBleHRlbmRzIEZ1bmN0aW9uRW50aXR5IHsKICAvLy8gV2hldGhlciB0aGlzIGlzIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciwgcG9zc2libHkgcmVkaXJlY3RpbmcuCiAgYm9vbCBnZXQgaXNHZW5lcmF0aXZlQ29uc3RydWN0b3I7CgogIC8vLyBXaGV0aGVyIHRoaXMgaXMgYSBmYWN0b3J5IGNvbnN0cnVjdG9yLCBwb3NzaWJseSByZWRpcmVjdGluZy4KICBib29sIGdldCBpc0ZhY3RvcnlDb25zdHJ1Y3RvcjsKCiAgLy8vIFdoZXRoZXIgdGhpcyBpcyBhIGBmcm9tRW52aXJvbm1lbnRgIGNvbnN0IGNvbnN0cnVjdG9yIGluIGBpbnRgLCBgYm9vbGAgb3IKICAvLy8gYFN0cmluZ2AuCiAgYm9vbCBnZXQgaXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3RvcjsKfQoKLy8vIFRoZSBjb25zdHJ1Y3RvciBib2R5IGZvciBhIFtDb25zdHJ1Y3RvckVudGl0eV0uCi8vLwovLy8gVGhpcyBpcyB1c2VkIG9ubHkgaW4gdGhlIGJhY2tlbmQgdG8gc3BsaXQgZW5jb2Rpbmcgb2YgYSBEYXJ0IGNvbnN0cnVjdG9yCi8vLyBpbnRvIHR3byBKYXZhU2NyaXB0IGZ1bmN0aW9uczsgdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGUgY29uc3RydWN0b3IgYm9keS4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiBtb2RlbHggaXMgcmVtb3ZlZC4gQ29uc3RydWN0b3IgYm9kaWVzCi8vIHNob3VsZCB0aGVuIGJlIGNyZWF0ZWQgZGlyZWN0bHkgd2l0aCB0aGUgSi1tb2RlbC4KYWJzdHJhY3QgY2xhc3MgQ29uc3RydWN0b3JCb2R5RW50aXR5IGV4dGVuZHMgRnVuY3Rpb25FbnRpdHkgewogIC8vLyBUaGUgY29uc3RydWN0b3IgZm9yIHdoaWNoIHRoaXMgY29uc3RydWN0b3IgYm9keSB3YXMgY3JlYXRlZC4KICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgY29uc3RydWN0b3I7Cn0KCi8vLyBBbiBlbnRpdHkgdGhhdCBkZWZpbmVzIGEgbG9jYWwgZW50aXR5IChtZW1vcnkgc2xvdCkgaW4gZ2VuZXJhdGVkIGNvZGUuCi8vLwovLy8gUGFyYW1ldGVycywgbG9jYWwgdmFyaWFibGVzIGFuZCBsb2NhbCBmdW5jdGlvbnMgKGNhbikgZGVmaW5lIGxvY2FsIGVudGl0eQovLy8gYW5kIHRodXMgaW1wbGVtZW50IFtMb2NhbF0gdGhyb3VnaCBbTG9jYWxFbGVtZW50XS4gRm9yIG5vbi1lbGVtZW50IGxvY2FscywKLy8vIGxpa2UgYHRoaXNgIGFuZCBib3hlcywgc3BlY2lhbGl6ZWQgW0xvY2FsXSBjbGFzc2VzIGFyZSBjcmVhdGVkLgovLy8KLy8vIFR5cGUgdmFyaWFibGVzIGNhbiBpbnRyb2R1Y2UgbG9jYWxzIGluIGZhY3RvcmllcyBhbmQgY29uc3RydWN0b3JzCi8vLyBidXQgc2luY2Ugb25lIHR5cGUgdmFyaWFibGUgY2FuIGludHJvZHVjZSBkaWZmZXJlbnQgbG9jYWxzIGluIGRpZmZlcmVudAovLy8gZmFjdG9yaWVzIGFuZCBjb25zdHJ1Y3RvcnMgaXQgaXMgbm90IGl0c2VsZiBhIFtMb2NhbF0gYnV0IGluc3RlYWQKLy8vIGEgbm9uLWVsZW1lbnQgW0xvY2FsXSBpcyBjcmVhdGVkIHRocm91Z2ggYSBzcGVjaWFsaXplZCBjbGFzcy4KYWJzdHJhY3QgY2xhc3MgTG9jYWwgZXh0ZW5kcyBFbnRpdHkge30KCi8vLyBUaGUgc3RydWN0dXJlIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCmNsYXNzIFBhcmFtZXRlclN0cnVjdHVyZSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtQYXJhbWV0ZXJTdHJ1Y3R1cmVdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAncGFyYW1ldGVyLXN0cnVjdHVyZSc7CgogIC8vLyBUaGUgbnVtYmVyIG9mIHJlcXVpcmVkIChwb3NpdGlvbmFsKSBwYXJhbWV0ZXJzLgogIGZpbmFsIGludCByZXF1aXJlZFBhcmFtZXRlcnM7CgogIC8vLyBUaGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4KICBmaW5hbCBpbnQgcG9zaXRpb25hbFBhcmFtZXRlcnM7CgogIC8vLyBUaGUgbmFtZWQgcGFyYW1ldGVycyBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuCiAgZmluYWwgTGlzdDxTdHJpbmc+IG5hbWVkUGFyYW1ldGVyczsKCiAgLy8vIFRoZSBudW1iZXIgb2YgdHlwZSBwYXJhbWV0ZXJzLgogIGZpbmFsIGludCB0eXBlUGFyYW1ldGVyczsKCiAgY29uc3QgUGFyYW1ldGVyU3RydWN0dXJlKHRoaXMucmVxdWlyZWRQYXJhbWV0ZXJzLCB0aGlzLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICB0aGlzLm5hbWVkUGFyYW1ldGVycywgdGhpcy50eXBlUGFyYW1ldGVycyk7CgogIGNvbnN0IFBhcmFtZXRlclN0cnVjdHVyZS5nZXR0ZXIoKSA6IHRoaXMoMCwgMCwgY29uc3QgPFN0cmluZz5bXSwgMCk7CgogIGNvbnN0IFBhcmFtZXRlclN0cnVjdHVyZS5zZXR0ZXIoKSA6IHRoaXMoMSwgMSwgY29uc3QgPFN0cmluZz5bXSwgMCk7CgogIGZhY3RvcnkgUGFyYW1ldGVyU3RydWN0dXJlLmZyb21UeXBlKEZ1bmN0aW9uVHlwZSB0eXBlKSB7CiAgICByZXR1cm4gbmV3IFBhcmFtZXRlclN0cnVjdHVyZSgKICAgICAgICB0eXBlLnBhcmFtZXRlclR5cGVzLmxlbmd0aCwKICAgICAgICB0eXBlLnBhcmFtZXRlclR5cGVzLmxlbmd0aCArIHR5cGUub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcy5sZW5ndGgsCiAgICAgICAgdHlwZS5uYW1lZFBhcmFtZXRlcnMsCiAgICAgICAgdHlwZS50eXBlVmFyaWFibGVzLmxlbmd0aCk7CiAgfQoKICAvLy8gRGVzZXJpYWxpemVzIGEgW1BhcmFtZXRlclN0cnVjdHVyZV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBQYXJhbWV0ZXJTdHJ1Y3R1cmUucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGludCByZXF1aXJlZFBhcmFtZXRlcnMgPSBzb3VyY2UucmVhZEludCgpOwogICAgaW50IHBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gc291cmNlLnJlYWRJbnQoKTsKICAgIExpc3Q8U3RyaW5nPiBuYW1lZFBhcmFtZXRlcnMgPSBzb3VyY2UucmVhZFN0cmluZ3MoKTsKICAgIGludCB0eXBlUGFyYW1ldGVycyA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IFBhcmFtZXRlclN0cnVjdHVyZShyZXF1aXJlZFBhcmFtZXRlcnMsIHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgIG5hbWVkUGFyYW1ldGVycywgdHlwZVBhcmFtZXRlcnMpOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbUGFyYW1ldGVyU3RydWN0dXJlXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUludChyZXF1aXJlZFBhcmFtZXRlcnMpOwogICAgc2luay53cml0ZUludChwb3NpdGlvbmFsUGFyYW1ldGVycyk7CiAgICBzaW5rLndyaXRlU3RyaW5ncyhuYW1lZFBhcmFtZXRlcnMpOwogICAgc2luay53cml0ZUludCh0eXBlUGFyYW1ldGVycyk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgLy8vIFRoZSBudW1iZXIgb2Ygb3B0aW9uYWwgcGFyYW1ldGVycyAocG9zaXRpb25hbCBvciBuYW1lZCkuCiAgaW50IGdldCBvcHRpb25hbFBhcmFtZXRlcnMgPT4KICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnMgLSByZXF1aXJlZFBhcmFtZXRlcnMgKyBuYW1lZFBhcmFtZXRlcnMubGVuZ3RoOwoKICAvLy8gVGhlIHRvdGFsIG51bWJlciBvZiBwYXJhbWV0ZXJzIChyZXF1aXJlZCBvciBvcHRpb25hbCkuCiAgaW50IGdldCB0b3RhbFBhcmFtZXRlcnMgPT4gcG9zaXRpb25hbFBhcmFtZXRlcnMgKyBuYW1lZFBhcmFtZXRlcnMubGVuZ3RoOwoKICAvLy8gUmV0dXJucyB0aGUgW0NhbGxTdHJ1Y3R1cmVdIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWxsIHNpdGUgcGFzc2luZyBhbGwKICAvLy8gcGFyYW1ldGVycyBib3RoIHJlcXVpcmVkIGFuZCBvcHRpb25hbC4KICBDYWxsU3RydWN0dXJlIGdldCBjYWxsU3RydWN0dXJlIHsKICAgIHJldHVybiBuZXcgQ2FsbFN0cnVjdHVyZShwb3NpdGlvbmFsUGFyYW1ldGVycyArIG5hbWVkUGFyYW1ldGVycy5sZW5ndGgsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLCB0eXBlUGFyYW1ldGVycyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IEhhc2hpbmcubGlzdEhhc2goCiAgICAgIG5hbWVkUGFyYW1ldGVycywKICAgICAgSGFzaGluZy5vYmplY3RIYXNoKAogICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgICBIYXNoaW5nLm9iamVjdEhhc2goCiAgICAgICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJzLCBIYXNoaW5nLm9iamVjdEhhc2godHlwZVBhcmFtZXRlcnMpKSkpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIFBhcmFtZXRlclN0cnVjdHVyZSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKHJlcXVpcmVkUGFyYW1ldGVycyAhPSBvdGhlci5yZXF1aXJlZFBhcmFtZXRlcnMgfHwKICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycyAhPSBvdGhlci5wb3NpdGlvbmFsUGFyYW1ldGVycyB8fAogICAgICAgIHR5cGVQYXJhbWV0ZXJzICE9IG90aGVyLnR5cGVQYXJhbWV0ZXJzIHx8CiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCAhPSBvdGhlci5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChuYW1lZFBhcmFtZXRlcnNbaV0gIT0gb3RoZXIubmFtZWRQYXJhbWV0ZXJzW2ldKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBTaG9ydCB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIHVzZSBmb3IgdGVzdGluZy4KICBTdHJpbmcgZ2V0IHNob3J0VGV4dCB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMgIT0gMCkgewogICAgICBzYi53cml0ZSgnPCcpOwogICAgICBzYi53cml0ZSh0eXBlUGFyYW1ldGVycyk7CiAgICAgIHNiLndyaXRlKCc+Jyk7CiAgICB9CiAgICBzYi53cml0ZSgnKCcpOwogICAgc2Iud3JpdGUocG9zaXRpb25hbFBhcmFtZXRlcnMpOwogICAgaWYgKG5hbWVkUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CiAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgIHNiLndyaXRlKG5hbWVkUGFyYW1ldGVycy5qb2luKCcsJykpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ1BhcmFtZXRlclN0cnVjdHVyZSgnKTsKICAgIHNiLndyaXRlKCdyZXF1aXJlZFBhcmFtZXRlcnM9JHJlcXVpcmVkUGFyYW1ldGVycywnKTsKICAgIHNiLndyaXRlKCdwb3NpdGlvbmFsUGFyYW1ldGVycz0kcG9zaXRpb25hbFBhcmFtZXRlcnMsJyk7CiAgICBzYi53cml0ZSgnbmFtZWRQYXJhbWV0ZXJzPXske25hbWVkUGFyYW1ldGVycy5qb2luKCcsJyl9fSwnKTsKICAgIHNiLndyaXRlKCd0eXBlUGFyYW1ldGVycz0kdHlwZVBhcmFtZXRlcnMpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIGludCBnZXQgc2l6ZSA9PgogICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycyArIHR5cGVQYXJhbWV0ZXJzICsgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsKfQqBhgBOTjwBEgFNARkuPRwVFQElBElKBFBLTzYtEwIBPQRNHy49GAIBNwRAFRUBQCYhAS8ZAR0RAVABDEkCATsESx8sT04PHQFLEBYBKRcCAS41HQIBM0QeAUMZEQIBRScETCItTQ8XAS0XATIVATUdASUaAR8UAU4aFwEgFQEgFQFMGQFNFAFKDhcBRyAiAUcxHQIBOwRKLTMBPgRRPDVPFBcBMC0BPB8CAUMUKEsBKCdFASgjPwEpPR8VGQFERRYBSjsZASgBLTYBDBZEBAEnBi0/Cg8LDwUBLAYtKQIBQQRJQEQROkYkAUMhAVAQKQIBNARNTU81PkMlAgFLBE5PRARGTEZCJwEqG0wdMwE2IAErIgEyJgElHAFPMgFHAUcBOyMkSR4kBAFARRcvMTkrFUwqBAE2KBUnKSgjEwQBPyBKAT1MAUstJEwqBAEMKBcaIB5JAQwcLTQ6PjJCFAY3PBYIBhEEATQZKh8VIBUGEyQmFSsGExoEAQwWKiU5PUExGgQBEkYCAStwYWNrYWdlOmNvbXBpbGVyL3NyYy9lbGVtZW50cy9lbnRpdGllcy5kYXJ0KnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2VucXVldWUuZGFydMAASHgvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmVucXVldWU7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgc2hvdyBRdWV1ZTsKCmltcG9ydCAnY29tbW9uL2NvZGVnZW4uZGFydCc7CmltcG9ydCAnY29tbW9uL3Rhc2tzLmRhcnQnIHNob3cgQ29tcGlsZXJUYXNrOwppbXBvcnQgJ2NvbW1vbi93b3JrLmRhcnQnIHNob3cgV29ya0l0ZW07CmltcG9ydCAnY29tbW9uLmRhcnQnOwppbXBvcnQgJ2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IEVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICdjb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJ2NvbXBpbGVyLmRhcnQnIHNob3cgQ29tcGlsZXI7CmltcG9ydCAnZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnaW5mZXJyZXIvdHlwZXMuZGFydCc7CmltcG9ydCAnanNfYmFja2VuZC9hbm5vdGF0aW9ucy5kYXJ0JzsKaW1wb3J0ICdqc19iYWNrZW5kL2JhY2tlbmQuZGFydCcgc2hvdyBDb2RlZ2VuSW5wdXRzOwppbXBvcnQgJ2pzX2JhY2tlbmQvZW5xdWV1ZXIuZGFydCc7CmltcG9ydCAndW5pdmVyc2UvbWVtYmVyX3VzYWdlLmRhcnQnOwppbXBvcnQgJ3VuaXZlcnNlL3Jlc29sdXRpb25fd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd1bml2ZXJzZS93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3VuaXZlcnNlL3VzZS5kYXJ0JwogICAgc2hvdwogICAgICAgIENvbnN0YW50VXNlLAogICAgICAgIER5bmFtaWNVc2UsCiAgICAgICAgU3RhdGljVXNlLAogICAgICAgIFN0YXRpY1VzZUtpbmQsCiAgICAgICAgVHlwZVVzZSwKICAgICAgICBUeXBlVXNlS2luZDsKaW1wb3J0ICd1bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydCcKICAgIHNob3cgSW1wYWN0U3RyYXRlZ3ksIEltcGFjdFVzZUNhc2UsIFdvcmxkSW1wYWN0LCBXb3JsZEltcGFjdFZpc2l0b3I7CmltcG9ydCAndXRpbC9lbnVtc2V0LmRhcnQnOwppbXBvcnQgJ3V0aWwvdXRpbC5kYXJ0JyBzaG93IFNldGxldDsKaW1wb3J0ICd3b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKCmNsYXNzIEVucXVldWVUYXNrIGV4dGVuZHMgQ29tcGlsZXJUYXNrIHsKICBSZXNvbHV0aW9uRW5xdWV1ZXIgX3Jlc29sdXRpb247CiAgQ29kZWdlbkVucXVldWVyIGNvZGVnZW5FbnF1ZXVlckZvclRlc3Rpbmc7CiAgZmluYWwgQ29tcGlsZXIgY29tcGlsZXI7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiAnRW5xdWV1ZSc7CgogIEVucXVldWVUYXNrKENvbXBpbGVyIGNvbXBpbGVyKQogICAgICA6IHRoaXMuY29tcGlsZXIgPSBjb21waWxlciwKICAgICAgICBzdXBlcihjb21waWxlci5tZWFzdXJlcik7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGUgbmVlZCBmb3IgdGhpcy4KICBib29sIGdldCBoYXNSZXNvbHV0aW9uID0+IF9yZXNvbHV0aW9uICE9IG51bGw7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGUgbmVlZCBmb3IgdGhpcy4KICBSZXNvbHV0aW9uRW5xdWV1ZXIgZ2V0IHJlc29sdXRpb24gewogICAgYXNzZXJ0KAogICAgICAgIF9yZXNvbHV0aW9uICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAiUmVzb2x1dGlvbkVucXVldWVyIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC4iKSk7CiAgICByZXR1cm4gX3Jlc29sdXRpb247CiAgfQoKICBSZXNvbHV0aW9uRW5xdWV1ZXIgY3JlYXRlUmVzb2x1dGlvbkVucXVldWVyKCkgewogICAgcmV0dXJuIF9yZXNvbHV0aW9uID8/PSBjb21waWxlci5mcm9udGVuZFN0cmF0ZWd5CiAgICAgICAgLmNyZWF0ZVJlc29sdXRpb25FbnF1ZXVlcih0aGlzLCBjb21waWxlcikKICAgICAgICAgIC4ub25FbXB0eUZvclRlc3RpbmcgPSBjb21waWxlci5vblJlc29sdXRpb25RdWV1ZUVtcHR5Rm9yVGVzdGluZzsKICB9CgogIEVucXVldWVyIGNyZWF0ZUNvZGVnZW5FbnF1ZXVlcigKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzLAogICAgICBDb2RlZ2VuSW5wdXRzIGNvZGVnZW5JbnB1dHMsCiAgICAgIENvZGVnZW5SZXN1bHRzIGNvZGVnZW5SZXN1bHRzKSB7CiAgICBFbnF1ZXVlciBlbnF1ZXVlciA9IGNvbXBpbGVyLmJhY2tlbmRTdHJhdGVneS5jcmVhdGVDb2RlZ2VuRW5xdWV1ZXIodGhpcywKICAgICAgICBjbG9zZWRXb3JsZCwgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywgY29kZWdlbklucHV0cywgY29kZWdlblJlc3VsdHMpCiAgICAgIC4ub25FbXB0eUZvclRlc3RpbmcgPSBjb21waWxlci5vbkNvZGVnZW5RdWV1ZUVtcHR5Rm9yVGVzdGluZzsKICAgIGlmIChyZXRhaW5EYXRhRm9yVGVzdGluZykgewogICAgICBjb2RlZ2VuRW5xdWV1ZXJGb3JUZXN0aW5nID0gZW5xdWV1ZXI7CiAgICB9CiAgICByZXR1cm4gZW5xdWV1ZXI7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBFbnF1ZXVlciB7CiAgLy8vIElmIGB0cnVlYCB0aGUgY2hlY2tpbmcgZm9yIHVuZW5xdWV1ZWQgbWVtYmVycyBpcyBza2lwcGVkLiBUaGUgY3VycmVudAogIC8vLyBpbXBsZW1lbnRhdGlvbiByZWdpc3RlcnMgcGFyYW1ldGVyIHVzYWdlcyBhcyBhIHNpZGUtZWZmZWN0IHNvIHVuaXQKICAvLy8gdGVzdGluZyBvZiBtZW1iZXIgdXNhZ2Ugd2UgbmVlZCB0byB0ZXN0IGJvdGggd2l0aCBhbmQgd2l0aG91dCB0aGUKICAvLy8gZW5xdWV1ZXIgY2hlY2suCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogW2NoZWNrRW5xdWV1ZXJDb25zaXN0ZW5jeV0gc2hvdWxkIG5vdCBoYXZlCiAgLy8gc2lkZS1lZmZlY3RzLgogIHN0YXRpYyBib29sIHNraXBFbnF1ZXVlckNoZWNrRm9yVGVzdGluZyA9IGZhbHNlOwoKICBXb3JsZEJ1aWxkZXIgZ2V0IHdvcmxkQnVpbGRlcjsKCiAgdm9pZCBvcGVuKEltcGFjdFN0cmF0ZWd5IGltcGFjdFN0cmF0ZWd5LCBGdW5jdGlvbkVudGl0eSBtYWluTWV0aG9kLAogICAgICBJdGVyYWJsZTxVcmk+IGxpYnJhcmllcyk7CiAgdm9pZCBjbG9zZSgpOwoKICAvLy8gUmV0dXJucyBbOnRydWU6XSBpZiB0aGlzIGVucXVldWVyIGlzIHRoZSByZXNvbHV0aW9uIGVucXVldWVyLgogIGJvb2wgZ2V0IGlzUmVzb2x1dGlvblF1ZXVlOwoKICBib29sIHF1ZXVlSXNDbG9zZWQ7CgogIGJvb2wgZ2V0IHF1ZXVlSXNFbXB0eTsKCiAgSW1wYWN0VXNlQ2FzZSBnZXQgaW1wYWN0VXNlOwoKICB2b2lkIGZvckVhY2godm9pZCBmKFdvcmtJdGVtIHdvcmspKTsKCiAgLy8vIEFwcGx5IHRoZSBbd29ybGRJbXBhY3RdIHRvIHRoaXMgZW5xdWV1ZXIuIElmIHRoZSBbaW1wYWN0U291cmNlXSBpcwogIC8vLyBwcm92aWRlZCB0aGUgaW1wYWN0IHN0cmF0ZWd5IHdpbGwgcmVtb3ZlIGl0IGZyb20gdGhlIGVsZW1lbnQgaW1wYWN0IGNhY2hlLAogIC8vLyBpZiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgogIHZvaWQgYXBwbHlJbXBhY3QoV29ybGRJbXBhY3Qgd29ybGRJbXBhY3QsIHt2YXIgaW1wYWN0U291cmNlfSk7CiAgYm9vbCBjaGVja05vRW5xdWV1ZWRJbnZva2VkSW5zdGFuY2VNZXRob2RzKAogICAgICBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50KTsKCiAgLy8vIENoZWNrIHRoZSBlbnF1ZXVlciBxdWV1ZSBpcyBlbXB0eSBvciBmYWlsIG90aGVyd2lzZS4KICB2b2lkIGNoZWNrUXVldWVJc0VtcHR5KCk7CiAgdm9pZCBsb2dTdW1tYXJ5KHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSk7CgogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZ2V0IHByb2Nlc3NlZEVudGl0aWVzOwoKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IHByb2Nlc3NlZENsYXNzZXM7Cn0KCmFic3RyYWN0IGNsYXNzIEVucXVldWVyTGlzdGVuZXIgewogIC8vLyBDYWxsZWQgdG8gaW5zdHJ1Y3QgdG8gdGhlIGJhY2tlbmQgdGhhdCBbdHlwZV0gaGFzIGJlZW4gaW5zdGFudGlhdGVkLgogIHZvaWQgcmVnaXN0ZXJJbnN0YW50aWF0ZWRUeXBlKEludGVyZmFjZVR5cGUgdHlwZSwKICAgICAge2Jvb2wgaXNHbG9iYWw6IGZhbHNlLCBib29sIG5hdGl2ZVVzYWdlOiBmYWxzZX0pOwoKICAvLy8gQ2FsbGVkIHRvIG5vdGlmeSB0byB0aGUgYmFja2VuZCB0aGF0IGEgY2xhc3MgaXMgYmVpbmcgaW5zdGFudGlhdGVkLiBBbnkKICAvLy8gYmFja2VuZCBzcGVjaWZpYyBbV29ybGRJbXBhY3RdIG9mIHRoaXMgaXMgcmV0dXJuZWQuCiAgV29ybGRJbXBhY3QgcmVnaXN0ZXJJbnN0YW50aWF0ZWRDbGFzcyhDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gQ2FsbGVkIHRvIG5vdGlmeSB0byB0aGUgYmFja2VuZCB0aGF0IGEgY2xhc3MgaXMgaW1wbGVtZW50ZWQgYnkgYW4KICAvLy8gaW5zdGFudGlhdGVkIGNsYXNzLiBBbnkgYmFja2VuZCBzcGVjaWZpYyBbV29ybGRJbXBhY3RdIG9mIHRoaXMgaXMKICAvLy8gcmV0dXJuZWQuCiAgV29ybGRJbXBhY3QgcmVnaXN0ZXJJbXBsZW1lbnRlZENsYXNzKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBDYWxsZWQgdG8gcmVnaXN0ZXIgdGhhdCBhIHN0YXRpYyBmdW5jdGlvbiBoYXMgYmVlbiBjbG9zdXJpemVkLiBBbnkgYmFja2VuZAogIC8vLyBzcGVjaWZpYyBbV29ybGRJbXBhY3RdIG9mIHRoaXMgaXMgcmV0dXJuZWQuCiAgV29ybGRJbXBhY3QgcmVnaXN0ZXJHZXRPZlN0YXRpY0Z1bmN0aW9uKCk7CgogIC8vLyBDYWxsZWQgdG8gcmVnaXN0ZXIgdGhhdCBbZnVuY3Rpb25dIGhhcyBiZWVuIGNsb3N1cml6ZWQuIEFueSBiYWNrZW5kCiAgLy8vIHNwZWNpZmljIFtXb3JsZEltcGFjdF0gb2YgdGhpcyBpcyByZXR1cm5lZC4KICBXb3JsZEltcGFjdCByZWdpc3RlckNsb3N1cml6ZWRNZW1iZXIoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pOwoKICAvLy8gQ2FsbGVkIHRvIHJlZ2lzdGVyIHRoYXQgW2VsZW1lbnRdIGlzIHN0YXRpY2FsbHkga25vd24gdG8gYmUgdXNlZC4gQW55CiAgLy8vIGJhY2tlbmQgc3BlY2lmaWMgW1dvcmxkSW1wYWN0XSBvZiB0aGlzIGlzIHJldHVybmVkLgogIFdvcmxkSW1wYWN0IHJlZ2lzdGVyVXNlZEVsZW1lbnQoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBDYWxsZWQgdG8gcmVnaXN0ZXIgdGhhdCBbdmFsdWVdIGlzIHN0YXRpY2FsbHkga25vd24gdG8gYmUgdXNlZC4gQW55CiAgLy8vIGJhY2tlbmQgc3BlY2lmaWMgW1dvcmxkSW1wYWN0XSBvZiB0aGlzIGlzIHJldHVybmVkLgogIFdvcmxkSW1wYWN0IHJlZ2lzdGVyVXNlZENvbnN0YW50KENvbnN0YW50VmFsdWUgdmFsdWUpOwoKICB2b2lkIG9uUXVldWVPcGVuKAogICAgICBFbnF1ZXVlciBlbnF1ZXVlciwgRnVuY3Rpb25FbnRpdHkgbWFpbk1ldGhvZCwgSXRlcmFibGU8VXJpPiBsaWJyYXJpZXMpOwoKICAvLy8gQ2FsbGVkIHdoZW4gW2VucXVldWVyXSdzIHF1ZXVlIGlzIGVtcHR5LCBidXQgYmVmb3JlIGl0IGlzIGNsb3NlZC4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwgYnkgdGhlIEpTIGJhY2tlbmQgdG8gZW5xdWV1ZSBhZGRpdGlvbmFsCiAgLy8vIGVsZW1lbnRzIG5lZWRlZCBmb3IgcmVmbGVjdGlvbi4gW3JlY2VudENsYXNzZXNdIGlzIGEgY29sbGVjdGlvbiBvZgogIC8vLyBhbGwgY2xhc3NlcyBzZWVuIGZvciB0aGUgZmlyc3QgdGltZSBieSB0aGUgW2VucXVldWVyXSBzaW5jZSB0aGUgbGFzdCBjYWxsCiAgLy8vIHRvIFtvblF1ZXVlRW1wdHldLgogIC8vLwogIC8vLyBBIHJldHVybiB2YWx1ZSBvZiBgdHJ1ZWAgaW5kaWNhdGVzIHRoYXQgW3JlY2VudENsYXNzZXNdIGhhcyBiZWVuCiAgLy8vIHByb2Nlc3NlZCBhbmQgaXRzIGVsZW1lbnRzIGRvIG5vdCBuZWVkIHRvIGJlIHNlZW4gaW4gdGhlIG5leHQgcm91bmQuIFdoZW4KICAvLy8gYGZhbHNlYCBpcyByZXR1cm5lZCwgW29uUXVldWVFbXB0eV0gd2lsbCBiZSBjYWxsZWQgYWdhaW4gb25jZSB0aGUKICAvLy8gcmVzb2x1dGlvbiBxdWV1ZSBoYXMgZHJhaW5lZCBhbmQgW3JlY2VudENsYXNzZXNdIHdpbGwgYmUgYSBzdXBlcnNldCBvZiB0aGUKICAvLy8gY3VycmVudCB2YWx1ZS4KICAvLy8KICAvLy8gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYSBjbGFzcyBpcyBvbmx5IHByZXNlbnQgb25jZSBpbgogIC8vLyBbcmVjZW50Q2xhc3Nlc10sIGJ1dCBldmVyeSBjbGFzcyBzZWVuIGJ5IHRoZSBbZW5xdWV1ZXJdIHdpbGwgYmUgcHJlc2VudCBpbgogIC8vLyBbcmVjZW50Q2xhc3Nlc10gYXQgbGVhc3Qgb25jZS4KICBib29sIG9uUXVldWVFbXB0eShFbnF1ZXVlciBlbnF1ZXVlciwgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHJlY2VudENsYXNzZXMpOwoKICAvLy8gQ2FsbGVkIHdoZW4gdG8gdGhlIHF1ZXVlIGhhcyBiZWVuIGNsb3NlZC4KICB2b2lkIG9uUXVldWVDbG9zZWQoKTsKCiAgLy8vIENhbGxlZCBhZnRlciB0aGUgcXVldWUgaGFzIGJlZW4gZW1wdGllZC4KICB2b2lkIGxvZ1N1bW1hcnkodm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpKTsKfQoKYWJzdHJhY3QgY2xhc3MgRW5xdWV1ZXJJbXBsIGV4dGVuZHMgRW5xdWV1ZXIgewogIENvbXBpbGVyVGFzayBnZXQgdGFzazsKICB2b2lkIGNoZWNrQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKTsKICB2b2lkIHByb2Nlc3NTdGF0aWNVc2UoTWVtYmVyRW50aXR5IG1lbWJlciwgU3RhdGljVXNlIHN0YXRpY1VzZSk7CiAgdm9pZCBwcm9jZXNzVHlwZVVzZShNZW1iZXJFbnRpdHkgbWVtYmVyLCBUeXBlVXNlIHR5cGVVc2UpOwogIHZvaWQgcHJvY2Vzc0R5bmFtaWNVc2UoRHluYW1pY1VzZSBkeW5hbWljVXNlKTsKICB2b2lkIHByb2Nlc3NDb25zdGFudFVzZShDb25zdGFudFVzZSBjb25zdGFudFVzZSk7CiAgRW5xdWV1ZXJMaXN0ZW5lciBnZXQgbGlzdGVuZXI7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEluaXRpYWxpemUgW19pbXBhY3RTdHJhdGVneV0gdG8gYG51bGxgLgogIEltcGFjdFN0cmF0ZWd5IF9pbXBhY3RTdHJhdGVneSA9IGNvbnN0IEltcGFjdFN0cmF0ZWd5KCk7CgogIEltcGFjdFN0cmF0ZWd5IGdldCBpbXBhY3RTdHJhdGVneSA9PiBfaW1wYWN0U3RyYXRlZ3k7CgogIEBvdmVycmlkZQogIHZvaWQgb3BlbihJbXBhY3RTdHJhdGVneSBpbXBhY3RTdHJhdGVneSwgRnVuY3Rpb25FbnRpdHkgbWFpbk1ldGhvZCwKICAgICAgSXRlcmFibGU8VXJpPiBsaWJyYXJpZXMpIHsKICAgIF9pbXBhY3RTdHJhdGVneSA9IGltcGFjdFN0cmF0ZWd5OwogICAgbGlzdGVuZXIub25RdWV1ZU9wZW4odGhpcywgbWFpbk1ldGhvZCwgbGlicmFyaWVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTZXQgW19pbXBhY3RTdHJhdGVneV0gdG8gYG51bGxgIGFuZCBbcXVldWVJc0Nsb3NlZF0KICAgIC8vIHRvIGB0cnVlYCBoZXJlLgogICAgX2ltcGFjdFN0cmF0ZWd5ID0gY29uc3QgSW1wYWN0U3RyYXRlZ3koKTsKICAgIGxpc3RlbmVyLm9uUXVldWVDbG9zZWQoKTsKICB9CgogIC8vLyBDaGVjayBlbnF1ZXVlciBjb25zaXN0ZW5jeSBhZnRlciB0aGUgcXVldWUgaGFzIGJlZW4gY2xvc2VkLgogIGJvb2wgY2hlY2tFbnF1ZXVlckNvbnNpc3RlbmN5KEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQpIHsKICAgIHRhc2subWVhc3VyZVN1YnRhc2soJ3Jlc29sdXRpb24uY2hlY2snLCAoKSB7CiAgICAgIC8vIFJ1biB0aHJvdWdoIHRoZSBjbGFzc2VzIGFuZCBzZWUgaWYgd2UgbmVlZCB0byBlbnF1ZXVlIG1vcmUgbWV0aG9kcy4KICAgICAgZm9yIChDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQKICAgICAgICAgIGluIHdvcmxkQnVpbGRlci5kaXJlY3RseUluc3RhbnRpYXRlZENsYXNzZXMpIHsKICAgICAgICBmb3IgKENsYXNzRW50aXR5IGN1cnJlbnRDbGFzcyA9IGNsYXNzRWxlbWVudDsKICAgICAgICAgICAgY3VycmVudENsYXNzICE9IG51bGw7CiAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGVsZW1lbnRFbnZpcm9ubWVudC5nZXRTdXBlckNsYXNzKGN1cnJlbnRDbGFzcykpIHsKICAgICAgICAgIGNoZWNrQ2xhc3MoY3VycmVudENsYXNzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHRydWU7CiAgfQp9CgovLy8gW0VucXVldWVyXSB3aGljaCBpcyBzcGVjaWZpYyB0byByZXNvbHV0aW9uLgpjbGFzcyBSZXNvbHV0aW9uRW5xdWV1ZXIgZXh0ZW5kcyBFbnF1ZXVlckltcGwgewogIHN0YXRpYyBjb25zdCBJbXBhY3RVc2VDYXNlIElNUEFDVF9VU0UgPQogICAgICBjb25zdCBJbXBhY3RVc2VDYXNlKCdSZXNvbHV0aW9uRW5xdWV1ZXInKTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgQ29tcGlsZXJUYXNrIHRhc2s7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgQG92ZXJyaWRlCiAgZmluYWwgRW5xdWV1ZXJMaXN0ZW5lciBsaXN0ZW5lcjsKCiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBfcmVjZW50Q2xhc3NlcyA9IG5ldyBTZXRsZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgYm9vbCBfcmVjZW50Q29uc3RhbnRzID0gZmFsc2U7CiAgZmluYWwgUmVzb2x1dGlvbkVucXVldWVyV29ybGRCdWlsZGVyIF93b3JsZEJ1aWxkZXI7CiAgZmluYWwgV29ya0l0ZW1CdWlsZGVyIF93b3JrSXRlbUJ1aWxkZXI7CiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIF9yZXBvcnRlcjsKICBmaW5hbCBBbm5vdGF0aW9uc0RhdGEgX2Fubm90YXRpb25zRGF0YTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBxdWV1ZUlzQ2xvc2VkID0gZmFsc2U7CgogIFdvcmxkSW1wYWN0VmlzaXRvciBfaW1wYWN0VmlzaXRvcjsKCiAgZmluYWwgUXVldWU8V29ya0l0ZW0+IF9xdWV1ZSA9IG5ldyBRdWV1ZTxXb3JrSXRlbT4oKTsKCiAgLy8gSWYgbm90IGBudWxsYCB0aGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBxdWV1ZSBoYXMgYmVlbiBlbXB0aWVkLiBJdCBhbGxvd3MgZm9yCiAgLy8gYXBwbHlpbmcgYWRkaXRpb25hbCBpbXBhY3RzIGJlZm9yZSByZS1lbXB0eWluZyB0aGUgcXVldWUuCiAgdm9pZCBGdW5jdGlvbigpIG9uRW1wdHlGb3JUZXN0aW5nOwoKICBSZXNvbHV0aW9uRW5xdWV1ZXIodGhpcy50YXNrLCB0aGlzLl9yZXBvcnRlciwgdGhpcy5saXN0ZW5lciwKICAgICAgdGhpcy5fd29ybGRCdWlsZGVyLCB0aGlzLl93b3JrSXRlbUJ1aWxkZXIsIHRoaXMuX2Fubm90YXRpb25zRGF0YSwKICAgICAgW3RoaXMubmFtZSA9ICdyZXNvbHV0aW9uIGVucXVldWVyJ10pIHsKICAgIF9pbXBhY3RWaXNpdG9yID0gbmV3IEVucXVldWVySW1wbEltcGFjdFZpc2l0b3IodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBSZXNvbHV0aW9uV29ybGRCdWlsZGVyIGdldCB3b3JsZEJ1aWxkZXIgPT4gX3dvcmxkQnVpbGRlcjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgcXVldWVJc0VtcHR5ID0+IF9xdWV1ZS5pc0VtcHR5OwoKICBAb3ZlcnJpZGUKICB2b2lkIGNoZWNrUXVldWVJc0VtcHR5KCkgewogICAgaWYgKF9xdWV1ZS5pc05vdEVtcHR5KSB7CiAgICAgIGZhaWxlZEF0KF9xdWV1ZS5maXJzdC5lbGVtZW50LCAiJG5hbWUgcXVldWUgaXMgbm90IGVtcHR5LiIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCBwcm9jZXNzZWRDbGFzc2VzID0+IF93b3JsZEJ1aWxkZXIucHJvY2Vzc2VkQ2xhc3NlczsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhcHBseUltcGFjdChXb3JsZEltcGFjdCB3b3JsZEltcGFjdCwge3ZhciBpbXBhY3RTb3VyY2V9KSB7CiAgICBpZiAod29ybGRJbXBhY3QuaXNFbXB0eSkgcmV0dXJuOwogICAgaW1wYWN0U3RyYXRlZ3kudmlzaXRJbXBhY3QoCiAgICAgICAgaW1wYWN0U291cmNlLCB3b3JsZEltcGFjdCwgX2ltcGFjdFZpc2l0b3IsIGltcGFjdFVzZSk7CiAgfQoKICB2b2lkIF9yZWdpc3Rlckluc3RhbnRpYXRlZFR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlLAogICAgICB7Q29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IsCiAgICAgIGJvb2wgbmF0aXZlVXNhZ2U6IGZhbHNlLAogICAgICBib29sIGdsb2JhbERlcGVuZGVuY3k6IGZhbHNlfSkgewogICAgdGFzay5tZWFzdXJlU3VidGFzaygncmVzb2x1dGlvbi50eXBlVXNlJywgKCkgewogICAgICBfd29ybGRCdWlsZGVyLnJlZ2lzdGVyVHlwZUluc3RhbnRpYXRpb24odHlwZSwgX2FwcGx5Q2xhc3NVc2UsCiAgICAgICAgICBjb25zdHJ1Y3RvcjogY29uc3RydWN0b3IpOwogICAgICBsaXN0ZW5lci5yZWdpc3Rlckluc3RhbnRpYXRlZFR5cGUodHlwZSwKICAgICAgICAgIGlzR2xvYmFsOiBnbG9iYWxEZXBlbmRlbmN5LCBuYXRpdmVVc2FnZTogbmF0aXZlVXNhZ2UpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNoZWNrTm9FbnF1ZXVlZEludm9rZWRJbnN0YW5jZU1ldGhvZHMoCiAgICAgIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQpIHsKICAgIGlmIChFbnF1ZXVlci5za2lwRW5xdWV1ZXJDaGVja0ZvclRlc3RpbmcpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGNoZWNrRW5xdWV1ZXJDb25zaXN0ZW5jeShlbGVtZW50RW52aXJvbm1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjaGVja0NsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgX3dvcmxkQnVpbGRlci5wcm9jZXNzQ2xhc3NNZW1iZXJzKGNscywKICAgICAgICAoTWVtYmVyRW50aXR5IG1lbWJlciwgRW51bVNldDxNZW1iZXJVc2U+IHVzZVNldCkgewogICAgICBpZiAodXNlU2V0LmlzTm90RW1wdHkpIHsKICAgICAgICBfcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcihtZW1iZXIsCiAgICAgICAgICAgICdVbmVucXVldWVkIHVzZSBvZiAkbWVtYmVyOiAke3VzZVNldC5pdGVyYWJsZShNZW1iZXJVc2UudmFsdWVzKX0nKTsKICAgICAgfQogICAgfSwgY2hlY2tFbnF1ZXVlckNvbnNpc3RlbmN5OiB0cnVlKTsKICB9CgogIC8vLyBDYWxsYmFjayBmb3IgYXBwbHlpbmcgdGhlIHVzZSBvZiBhIFttZW1iZXJdLgogIHZvaWQgX2FwcGx5TWVtYmVyVXNlKEVudGl0eSBtZW1iZXIsIEVudW1TZXQ8TWVtYmVyVXNlPiB1c2VTZXQpIHsKICAgIGlmICh1c2VTZXQuY29udGFpbnMoTWVtYmVyVXNlLk5PUk1BTCkpIHsKICAgICAgX2FkZFRvV29ya0xpc3QobWVtYmVyKTsKICAgIH0KICAgIGlmICh1c2VTZXQuY29udGFpbnMoTWVtYmVyVXNlLkNMT1NVUklaRV9JTlNUQU5DRSkpIHsKICAgICAgX3JlZ2lzdGVyQ2xvc3VyaXplZE1lbWJlcihtZW1iZXIpOwogICAgfQogICAgaWYgKHVzZVNldC5jb250YWlucyhNZW1iZXJVc2UuQ0xPU1VSSVpFX1NUQVRJQykpIHsKICAgICAgYXBwbHlJbXBhY3QobGlzdGVuZXIucmVnaXN0ZXJHZXRPZlN0YXRpY0Z1bmN0aW9uKCksCiAgICAgICAgICBpbXBhY3RTb3VyY2U6ICdnZXQgb2Ygc3RhdGljIGZ1bmN0aW9uJyk7CiAgICB9CiAgfQoKICAvLy8gQ2FsbGJhY2sgZm9yIGFwcGx5aW5nIHRoZSB1c2Ugb2YgYSBbY2xzXS4KICB2b2lkIF9hcHBseUNsYXNzVXNlKENsYXNzRW50aXR5IGNscywgRW51bVNldDxDbGFzc1VzZT4gdXNlU2V0KSB7CiAgICBpZiAodXNlU2V0LmNvbnRhaW5zKENsYXNzVXNlLklOU1RBTlRJQVRFRCkpIHsKICAgICAgX3JlY2VudENsYXNzZXMuYWRkKGNscyk7CiAgICAgIF93b3JsZEJ1aWxkZXIucHJvY2Vzc0NsYXNzTWVtYmVycyhjbHMsIF9hcHBseU1lbWJlclVzZSk7CiAgICAgIC8vIFdlIG9ubHkgdGVsbCB0aGUgYmFja2VuZCBvbmNlIHRoYXQgW2Nsc10gd2FzIGluc3RhbnRpYXRlZCwgc28KICAgICAgLy8gYW55IGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG11c3QgYmUgdHJlYXRlZCBhcyBnbG9iYWwKICAgICAgLy8gZGVwZW5kZW5jaWVzLgogICAgICBhcHBseUltcGFjdChsaXN0ZW5lci5yZWdpc3Rlckluc3RhbnRpYXRlZENsYXNzKGNscyksCiAgICAgICAgICBpbXBhY3RTb3VyY2U6ICdpbnN0YW50aWF0ZWQgY2xhc3MnKTsKICAgIH0KICAgIGlmICh1c2VTZXQuY29udGFpbnMoQ2xhc3NVc2UuSU1QTEVNRU5URUQpKSB7CiAgICAgIGFwcGx5SW1wYWN0KGxpc3RlbmVyLnJlZ2lzdGVySW1wbGVtZW50ZWRDbGFzcyhjbHMpLAogICAgICAgICAgaW1wYWN0U291cmNlOiAnaW1wbGVtZW50ZWQgY2xhc3MnKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJvY2Vzc0R5bmFtaWNVc2UoRHluYW1pY1VzZSBkeW5hbWljVXNlKSB7CiAgICB0YXNrLm1lYXN1cmVTdWJ0YXNrKCdyZXNvbHV0aW9uLmR5bmFtaWNVc2UnLCAoKSB7CiAgICAgIF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKGR5bmFtaWNVc2UsIF9hcHBseU1lbWJlclVzZSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJvY2Vzc0NvbnN0YW50VXNlKENvbnN0YW50VXNlIGNvbnN0YW50VXNlKSB7CiAgICB0YXNrLm1lYXN1cmVTdWJ0YXNrKCdyZXNvbHV0aW9uLmNvbnN0YW50VXNlJywgKCkgewogICAgICBpZiAoX3dvcmxkQnVpbGRlci5yZWdpc3RlckNvbnN0YW50VXNlKGNvbnN0YW50VXNlKSkgewogICAgICAgIGFwcGx5SW1wYWN0KGxpc3RlbmVyLnJlZ2lzdGVyVXNlZENvbnN0YW50KGNvbnN0YW50VXNlLnZhbHVlKSwKICAgICAgICAgICAgaW1wYWN0U291cmNlOiAnY29uc3RhbnQgdXNlJyk7CiAgICAgICAgX3JlY2VudENvbnN0YW50cyA9IHRydWU7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcm9jZXNzU3RhdGljVXNlKE1lbWJlckVudGl0eSBtZW1iZXIsIFN0YXRpY1VzZSBzdGF0aWNVc2UpIHsKICAgIHRhc2subWVhc3VyZVN1YnRhc2soJ3Jlc29sdXRpb24uc3RhdGljVXNlJywgKCkgewogICAgICBfd29ybGRCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKHN0YXRpY1VzZSwgX2FwcGx5TWVtYmVyVXNlKTsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQWRkIGBSZXNvbHV0aW9uV29ybGRCdWlsZGVyLnJlZ2lzdGVyQ29uc3RydWN0b3JVc2VgCiAgICAgIC8vIGZvciB0aGVzZToKICAgICAgc3dpdGNoIChzdGF0aWNVc2Uua2luZCkgewogICAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DT05TVFJVQ1RPUl9JTlZPS0U6CiAgICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNPTlNUX0NPTlNUUlVDVE9SX0lOVk9LRToKICAgICAgICAgIF9yZWdpc3Rlckluc3RhbnRpYXRlZFR5cGUoc3RhdGljVXNlLnR5cGUsCiAgICAgICAgICAgICAgY29uc3RydWN0b3I6IHN0YXRpY1VzZS5lbGVtZW50LCBnbG9iYWxEZXBlbmRlbmN5OiBmYWxzZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcm9jZXNzVHlwZVVzZShNZW1iZXJFbnRpdHkgbWVtYmVyLCBUeXBlVXNlIHR5cGVVc2UpIHsKICAgIERhcnRUeXBlIHR5cGUgPSB0eXBlVXNlLnR5cGU7CiAgICBzd2l0Y2ggKHR5cGVVc2Uua2luZCkgewogICAgICBjYXNlIFR5cGVVc2VLaW5kLklOU1RBTlRJQVRJT046CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuQ09OU1RfSU5TVEFOVElBVElPTjoKICAgICAgICBfcmVnaXN0ZXJJbnN0YW50aWF0ZWRUeXBlKHR5cGUsIGdsb2JhbERlcGVuZGVuY3k6IGZhbHNlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5OQVRJVkVfSU5TVEFOVElBVElPTjoKICAgICAgICBfcmVnaXN0ZXJJbnN0YW50aWF0ZWRUeXBlKHR5cGUsCiAgICAgICAgICAgIG5hdGl2ZVVzYWdlOiB0cnVlLCBnbG9iYWxEZXBlbmRlbmN5OiB0cnVlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5JU19DSEVDSzoKICAgICAgY2FzZSBUeXBlVXNlS2luZC5DQVRDSF9UWVBFOgogICAgICAgIF9yZWdpc3RlcklzQ2hlY2sodHlwZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuQVNfQ0FTVDoKICAgICAgICBpZiAoX2Fubm90YXRpb25zRGF0YS5nZXRFeHBsaWNpdENhc3RDaGVja1BvbGljeShtZW1iZXIpLmlzRW1pdHRlZCkgewogICAgICAgICAgX3JlZ2lzdGVySXNDaGVjayh0eXBlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuSU1QTElDSVRfQ0FTVDoKICAgICAgICBpZiAoX2Fubm90YXRpb25zRGF0YS5nZXRJbXBsaWNpdERvd25jYXN0Q2hlY2tQb2xpY3kobWVtYmVyKS5pc0VtaXR0ZWQpIHsKICAgICAgICAgIF9yZWdpc3RlcklzQ2hlY2sodHlwZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFR5cGVVc2VLaW5kLlBBUkFNRVRFUl9DSEVDSzoKICAgICAgICBpZiAoX2Fubm90YXRpb25zRGF0YS5nZXRQYXJhbWV0ZXJDaGVja1BvbGljeShtZW1iZXIpLmlzRW1pdHRlZCkgewogICAgICAgICAgX3JlZ2lzdGVySXNDaGVjayh0eXBlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuVFlQRV9MSVRFUkFMOgogICAgICAgIGlmICh0eXBlIGlzIFR5cGVWYXJpYWJsZVR5cGUpIHsKICAgICAgICAgIF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJUeXBlVmFyaWFibGVUeXBlTGl0ZXJhbCh0eXBlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuUlRJX1ZBTFVFOgogICAgICBjYXNlIFR5cGVVc2VLaW5kLlRZUEVfQVJHVU1FTlQ6CiAgICAgICAgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgIlVuZXhwZWN0ZWQgdHlwZSB1c2U6ICR0eXBlVXNlLiIpOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgdm9pZCBfcmVnaXN0ZXJJc0NoZWNrKERhcnRUeXBlIHR5cGUpIHsKICAgIF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJJc0NoZWNrKHR5cGUpOwogIH0KCiAgdm9pZCBfcmVnaXN0ZXJDbG9zdXJpemVkTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyKTsKICAgIGFwcGx5SW1wYWN0KGxpc3RlbmVyLnJlZ2lzdGVyQ2xvc3VyaXplZE1lbWJlcihlbGVtZW50KSwKICAgICAgICBpbXBhY3RTb3VyY2U6ICdjbG9zdXJpemVkIG1lbWJlcicpOwogICAgX3dvcmxkQnVpbGRlci5yZWdpc3RlckNsb3N1cml6ZWRNZW1iZXIoZWxlbWVudCk7CiAgfQoKICB2b2lkIF9mb3JFYWNoKHZvaWQgZihXb3JrSXRlbSB3b3JrKSkgewogICAgZG8gewogICAgICB3aGlsZSAoX3F1ZXVlLmlzTm90RW1wdHkpIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBGaW5kIGFuIG9wdGltYWwgcHJvY2VzcyBvcmRlci4KICAgICAgICBXb3JrSXRlbSB3b3JrID0gX3F1ZXVlLnJlbW92ZUxhc3QoKTsKICAgICAgICBpZiAoIV93b3JsZEJ1aWxkZXIuaXNNZW1iZXJQcm9jZXNzZWQod29yay5lbGVtZW50KSkgewogICAgICAgICAgZih3b3JrKTsKICAgICAgICAgIF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJQcm9jZXNzZWRNZW1iZXIod29yay5lbGVtZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgTGlzdDxDbGFzc0VudGl0eT4gcmVjZW50cyA9IF9yZWNlbnRDbGFzc2VzLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgICBfcmVjZW50Q2xhc3Nlcy5jbGVhcigpOwogICAgICBfcmVjZW50Q29uc3RhbnRzID0gZmFsc2U7CiAgICAgIGlmICghX29uUXVldWVFbXB0eShyZWNlbnRzKSkgewogICAgICAgIF9yZWNlbnRDbGFzc2VzLmFkZEFsbChyZWNlbnRzKTsKICAgICAgfQogICAgfSB3aGlsZSAoCiAgICAgICAgX3F1ZXVlLmlzTm90RW1wdHkgfHwgX3JlY2VudENsYXNzZXMuaXNOb3RFbXB0eSB8fCBfcmVjZW50Q29uc3RhbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaCh2b2lkIGYoV29ya0l0ZW0gd29yaykpIHsKICAgIF9mb3JFYWNoKGYpOwogICAgaWYgKG9uRW1wdHlGb3JUZXN0aW5nICE9IG51bGwpIHsKICAgICAgb25FbXB0eUZvclRlc3RpbmcoKTsKICAgICAgX2ZvckVhY2goZik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGxvZ1N1bW1hcnkodm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpKSB7CiAgICBsb2coJ1Jlc29sdmVkICR7cHJvY2Vzc2VkRW50aXRpZXMubGVuZ3RofSBlbGVtZW50cy4nKTsKICAgIGxpc3RlbmVyLmxvZ1N1bW1hcnkobG9nKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdFbnF1ZXVlcigkbmFtZSknOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGdldCBwcm9jZXNzZWRFbnRpdGllcyA9PgogICAgICBfd29ybGRCdWlsZGVyLnByb2Nlc3NlZE1lbWJlcnM7CgogIEBvdmVycmlkZQogIEltcGFjdFVzZUNhc2UgZ2V0IGltcGFjdFVzZSA9PiBJTVBBQ1RfVVNFOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1Jlc29sdXRpb25RdWV1ZSA9PiB0cnVlOwoKICAvLy8gUmVnaXN0ZXJzIFtlbnRpdHldIGFzIHByb2Nlc3NlZCBieSB0aGUgcmVzb2x1dGlvbiBlbnF1ZXVlci4gVXNlZCBvbmx5IGZvcgogIC8vLyB0ZXN0aW5nLgogIHZvaWQgcmVnaXN0ZXJQcm9jZXNzZWRFbGVtZW50SW50ZXJuYWwoTWVtYmVyRW50aXR5IGVudGl0eSkgewogICAgX3dvcmxkQnVpbGRlci5yZWdpc3RlclByb2Nlc3NlZE1lbWJlcihlbnRpdHkpOwogIH0KCiAgLy8vIENyZWF0ZSBhIFtXb3JrSXRlbV0gZm9yIFtlbnRpdHldIGFuZCBhZGQgaXQgdG8gdGhlIHdvcmsgbGlzdCBpZiBpdCBoYXMgbm90CiAgLy8vIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQuCiAgdm9pZCBfYWRkVG9Xb3JrTGlzdChNZW1iZXJFbnRpdHkgZW50aXR5KSB7CiAgICBpZiAoX3dvcmxkQnVpbGRlci5pc01lbWJlclByb2Nlc3NlZChlbnRpdHkpKSByZXR1cm47CiAgICBXb3JrSXRlbSB3b3JrSXRlbSA9IF93b3JrSXRlbUJ1aWxkZXIuY3JlYXRlV29ya0l0ZW0oZW50aXR5KTsKICAgIGlmICh3b3JrSXRlbSA9PSBudWxsKSByZXR1cm47CgogICAgaWYgKHF1ZXVlSXNDbG9zZWQpIHsKICAgICAgZmFpbGVkQXQoCiAgICAgICAgICBlbnRpdHksICJSZXNvbHV0aW9uIHdvcmsgbGlzdCBpcyBjbG9zZWQuIFRyeWluZyB0byBhZGQgJGVudGl0eS4iKTsKICAgIH0KCiAgICBhcHBseUltcGFjdChsaXN0ZW5lci5yZWdpc3RlclVzZWRFbGVtZW50KGVudGl0eSksCiAgICAgICAgaW1wYWN0U291cmNlOiAndXNlZCBlbGVtZW50Jyk7CiAgICBfd29ybGRCdWlsZGVyLnJlZ2lzdGVyVXNlZEVsZW1lbnQoZW50aXR5KTsKICAgIF9xdWV1ZS5hZGQod29ya0l0ZW0pOwogIH0KCiAgLy8vIFtfb25RdWV1ZUVtcHR5XSBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHF1ZXVlIGlzIGRyYWluZWQuIFtyZWNlbnRDbGFzc2VzXQogIC8vLyBjb250YWlucyB0aGUgc2V0IG9mIGFsbCBjbGFzc2VzIHNlZW4gZm9yIHRoZSBmaXJzdCB0aW1lIHNpbmNlCiAgLy8vIFtfb25RdWV1ZUVtcHR5XSB3YXMgY2FsbGVkIGxhc3QuIEEgcmV0dXJuIHZhbHVlIG9mIFt0cnVlXSBpbmRpY2F0ZXMgdGhhdAogIC8vLyB0aGUgW3JlY2VudENsYXNzZXNdIGhhdmUgYmVlbiBwcm9jZXNzZWQgYW5kIG1heSBiZSBjbGVhcmVkLiBJZiBbZmFsc2VdIGlzCiAgLy8vIHJldHVybmVkLCBbX29uUXVldWVFbXB0eV0gd2lsbCBiZSBjYWxsZWQgb25jZSB0aGUgcXVldWUgaXMgZW1wdHkgYWdhaW4gKG9yCiAgLy8vIHN0aWxsIGVtcHR5KSBhbmQgW3JlY2VudENsYXNzZXNdIHdpbGwgYmUgYSBzdXBlcnNldCBvZiB0aGUgY3VycmVudCB2YWx1ZS4KICBib29sIF9vblF1ZXVlRW1wdHkoSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHJlY2VudENsYXNzZXMpIHsKICAgIHJldHVybiBsaXN0ZW5lci5vblF1ZXVlRW1wdHkodGhpcywgcmVjZW50Q2xhc3Nlcyk7CiAgfQp9CgpjbGFzcyBFbnF1ZXVlckltcGxJbXBhY3RWaXNpdG9yIGltcGxlbWVudHMgV29ybGRJbXBhY3RWaXNpdG9yIHsKICBmaW5hbCBFbnF1ZXVlckltcGwgZW5xdWV1ZXI7CgogIEVucXVldWVySW1wbEltcGFjdFZpc2l0b3IodGhpcy5lbnF1ZXVlcik7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREeW5hbWljVXNlKE1lbWJlckVudGl0eSBtZW1iZXIsIER5bmFtaWNVc2UgZHluYW1pY1VzZSkgewogICAgZW5xdWV1ZXIucHJvY2Vzc0R5bmFtaWNVc2UoZHluYW1pY1VzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljVXNlKE1lbWJlckVudGl0eSBtZW1iZXIsIFN0YXRpY1VzZSBzdGF0aWNVc2UpIHsKICAgIGVucXVldWVyLnByb2Nlc3NTdGF0aWNVc2UobWVtYmVyLCBzdGF0aWNVc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVVc2UoTWVtYmVyRW50aXR5IG1lbWJlciwgVHlwZVVzZSB0eXBlVXNlKSB7CiAgICBlbnF1ZXVlci5wcm9jZXNzVHlwZVVzZShtZW1iZXIsIHR5cGVVc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0YW50VXNlKE1lbWJlckVudGl0eSBtZW1iZXIsIENvbnN0YW50VXNlIGNvbnN0YW50VXNlKSB7CiAgICBlbnF1ZXVlci5wcm9jZXNzQ29uc3RhbnRVc2UoY29uc3RhbnRVc2UpOwogIH0KfQoKLy8vIEludGVyZmFjZSBmb3IgY3JlYXRpbmcgd29yayBpdGVtcyBmb3IgZW5xdWV1ZWQgbWVtYmVyIGVudGl0aWVzLgphYnN0cmFjdCBjbGFzcyBXb3JrSXRlbUJ1aWxkZXIgewogIFdvcmtJdGVtIGNyZWF0ZVdvcmtJdGVtKGNvdmFyaWFudCBNZW1iZXJFbnRpdHkgZW50aXR5KTsKfQqCKQBOTjwBGQElAR4uKRY3ICYhHh4mNSMlMSYbCRUUExcRFSRJHCUnASkiLRsBDCABISIiATQxATQmDB0oPhgEATI1MksEASIgOSMnTUxEICwGFQQCARpMSUgWRRMzASEBRiAQAUQeARYBGQEfAScBSVEhQS4uATscLQEwAS4CASJLNDgBTjo6AUhIEDkBUTItAUoyQQFMOjgBSjo5ARROAUgGSUlQGQZHUEhRFQZBUSVNATAYAS8tAgEvGSRDPTE0IQFCOwE4AQxGISY3BAEMEVAXLh4EAUJJMU0kOTYiTSQKCAgRBAIBMDAqMQEMGxUMIwFFITYqJioBDB4BJQE4AVE/JQE/SC06BAEMPAEMKwEMHR1DBgQBDFABDEIlID8EATUmHyczRCUuQQgEAQwuLzs5BAEMJSs7HyhQCCgEATNDLR4GOSkGNzozBgQBMEMyHz9HPxc7LwYxOi4GBAEMMjZFCAQBDDU3PEYrIQgIBAEMRDVDUhQgLzU0SBEREQgIBAEMPiIcJixCDy0oOA8hIyAPIE0iCg8mUSIKDyhKIgoPJSg/Cg8iJk8PBgQBKSkEATkmPCw1BAEpCSI/LT4TPwoISh4gJSgIDk0EAQwoESUbEwYEAQwuOx4EAQwqAQwyJgEMLQEMJgFQDz8zBAFRHi05QSIBGRBNBgE2Jy8aBAFPRE9QUVA8NwQCAUAfASwBDEUsBAEMQjIEAQw8LgQBDEguBAIBRCE6AgEhcGFja2FnZTpjb21waWxlci9zcmMvZW5xdWV1ZS5kYXJ0NHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2Zyb250ZW5kX3N0cmF0ZWd5LmRhcnSLnS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuZnJvbnRlbmRfc3RyYXRlZ3k7CgppbXBvcnQgJ2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICdjb21tb24vdGFza3MuZGFydCc7CmltcG9ydCAnY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJ2NvbXBpbGVyLmRhcnQnIHNob3cgQ29tcGlsZXI7CmltcG9ydCAnZGVmZXJyZWRfbG9hZC5kYXJ0JyBzaG93IERlZmVycmVkTG9hZFRhc2s7CmltcG9ydCAnZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnZW5xdWV1ZS5kYXJ0JzsKaW1wb3J0ICdqc19iYWNrZW5kL25hdGl2ZV9kYXRhLmRhcnQnOwppbXBvcnQgJ2pzX2JhY2tlbmQvbm9fc3VjaF9tZXRob2RfcmVnaXN0cnkuZGFydCc7CmltcG9ydCAna2VybmVsL2xvYWRlci5kYXJ0JzsKaW1wb3J0ICd1bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydCc7CgovLy8gU3RyYXRlZ3kgcGF0dGVybiB0aGF0IGRlZmluZXMgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgaW5wdXQgZm9ybWF0IGFuZAovLy8gdGhlIHJlc29sdmVkIGVsZW1lbnQgbW9kZWwuCmFic3RyYWN0IGNsYXNzIEZyb250ZW5kU3RyYXRlZ3kgewogIC8vLyBSZWdpc3RlcnMgYSBzZXQgb2YgbG9hZGVkIGxpYnJhcmllcyB3aXRoIHRoaXMgc3RyYXRlZ3kuCiAgdm9pZCByZWdpc3RlckxvYWRlZExpYnJhcmllcyhLZXJuZWxSZXN1bHQgcmVzdWx0KTsKCiAgLy8vIFJldHVybnMgdGhlIFtFbGVtZW50RW52aXJvbm1lbnRdIGZvciB0aGUgZWxlbWVudCBtb2RlbCB1c2VkIGluIHRoaXMKICAvLy8gc3RyYXRlZ3kuCiAgRWxlbWVudEVudmlyb25tZW50IGdldCBlbGVtZW50RW52aXJvbm1lbnQ7CgogIC8vLyBSZXR1cm5zIHRoZSBbQ29tbW9uRWxlbWVudHNdIGZvciB0aGUgZWxlbWVudCBtb2RlbCB1c2VkIGluIHRoaXMKICAvLy8gc3RyYXRlZ3kuCiAgQ29tbW9uRWxlbWVudHMgZ2V0IGNvbW1vbkVsZW1lbnRzOwoKICBOYXRpdmVCYXNpY0RhdGEgZ2V0IG5hdGl2ZUJhc2ljRGF0YTsKCiAgLy8vIENyZWF0ZXMgYSBbRGVmZXJyZWRMb2FkVGFza10gZm9yIHRoZSBlbGVtZW50IG1vZGVsIHVzZWQgaW4gdGhpcyBzdHJhdGVneS4KICBEZWZlcnJlZExvYWRUYXNrIGNyZWF0ZURlZmVycmVkTG9hZFRhc2soQ29tcGlsZXIgY29tcGlsZXIpOwoKICAvLy8gU3VwcG9ydCBmb3IgY2xhc3NpZnlpbmcgYG5vU3VjaE1ldGhvZGAgaW1wbGVtZW50YXRpb25zLgogIE5vU3VjaE1ldGhvZFJlZ2lzdHJ5IGdldCBub1N1Y2hNZXRob2RSZWdpc3RyeTsKCiAgLy8vIENhbGxlZCBiZWZvcmUgcHJvY2Vzc2luZyBvZiB0aGUgcmVzb2x1dGlvbiBxdWV1ZSBpcyBzdGFydGVkLgogIHZvaWQgb25SZXNvbHV0aW9uU3RhcnQoKTsKCiAgUmVzb2x1dGlvbkVucXVldWVyIGNyZWF0ZVJlc29sdXRpb25FbnF1ZXVlcigKICAgICAgQ29tcGlsZXJUYXNrIHRhc2ssIENvbXBpbGVyIGNvbXBpbGVyKTsKCiAgLy8vIENhbGxlZCB3aGVuIHRoZSByZXNvbHV0aW9uIHF1ZXVlIGhhcyBiZWVuIGNsb3NlZC4KICB2b2lkIG9uUmVzb2x1dGlvbkVuZCgpOwoKICAvLy8gQ29tcHV0ZXMgdGhlIG1haW4gZnVuY3Rpb24gZnJvbSBbbWFpbkxpYnJhcnldIGFkZGluZyBhZGRpdGlvbmFsIHdvcmxkCiAgLy8vIGltcGFjdCB0byBbaW1wYWN0QnVpbGRlcl0uCiAgRnVuY3Rpb25FbnRpdHkgY29tcHV0ZU1haW4oV29ybGRJbXBhY3RCdWlsZGVyIGltcGFjdEJ1aWxkZXIpOwoKICAvLy8gQ3JlYXRlcyBhIFtTb3VyY2VTcGFuXSBmcm9tIFtzcGFubmFibGVdIGluIGNvbnRleHQgb2YgW2N1cnJlbnRFbGVtZW50XS4KICBTb3VyY2VTcGFuIHNwYW5Gcm9tU3Bhbm5hYmxlKFNwYW5uYWJsZSBzcGFubmFibGUsIEVudGl0eSBjdXJyZW50RWxlbWVudCk7Cn0KCi8vLyBDbGFzcyB0aGF0IHBlcmZvcm1zIHRoZSBtZWNoYW5pY3MgdG8gaW52ZXN0aWdhdGUgYW5ub3RhdGlvbnMgaW4gdGhlIGNvZGUuCmFic3RyYWN0IGNsYXNzIEFubm90YXRpb25Qcm9jZXNzb3IgewogIHZvaWQgZXh0cmFjdE5hdGl2ZUFubm90YXRpb25zKExpYnJhcnlFbnRpdHkgbGlicmFyeSk7CgogIHZvaWQgZXh0cmFjdEpzSW50ZXJvcEFubm90YXRpb25zKExpYnJhcnlFbnRpdHkgbGlicmFyeSk7CgogIHZvaWQgcHJvY2Vzc0pzSW50ZXJvcEFubm90YXRpb25zKAogICAgICBOYXRpdmVCYXNpY0RhdGEgbmF0aXZlQmFzaWNEYXRhLCBOYXRpdmVEYXRhQnVpbGRlciBuYXRpdmVEYXRhQnVpbGRlcik7Cn0KCi8vLyBDbGFzcyB0aGF0IGRlbGV0ZXMgdGhlIGNvbnRlbnRzIG9mIGFuIFtXb3JsZEltcGFjdF0gY2FjaGUuCi8vIFRPRE8ocmVkZW1wdGlvbik6IHRoaXMgY2FuIGJlIGRlbGV0ZWQgd2hlbiB3ZSBzdW5zZXQgdGhlIG9sZCBmcm9udCBlbmQuCmFic3RyYWN0IGNsYXNzIEltcGFjdENhY2hlRGVsZXRlciB7CiAgLy8vIFJlbW92ZXMgdGhlIFtXb3JsZEltcGFjdF0gZm9yIFtlbGVtZW50XSBmcm9tIHRoZSByZXNvbHV0aW9uIGNhY2hlLiBMYXRlcgogIC8vLyBjYWxscyB0byBbZ2V0V29ybGRJbXBhY3RdIG9yIFtjb21wdXRlV29ybGRJbXBhY3RdIHJldHVybnMgYW4gZW1wdHkgaW1wYWN0LgogIHZvaWQgdW5jYWNoZVdvcmxkSW1wYWN0KEVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJlbW92ZXMgdGhlIFtXb3JsZEltcGFjdF1zIGZvciBhbGwgW0VsZW1lbnRdcyBpbiB0aGUgcmVzb2x1dGlvbiBjYWNoZS4gLAogIC8vLyBMYXRlciBjYWxscyB0byBbZ2V0V29ybGRJbXBhY3RdIG9yIFtjb21wdXRlV29ybGRJbXBhY3RdIHJldHVybnMgYW4gZW1wdHkKICAvLy8gaW1wYWN0LgogIHZvaWQgZW1wdHlDYWNoZSgpOwp9ClEATk48ASMBFhwfJjMhFyYyHSUBTiAiPjUBShAtAUYQJQEnAVA+AT4xAUMcAS8tATgaAUwhQAFOTAIBTiU4ATsBJE0CAT9LJE9RKwFPTw4VAgErcGFja2FnZTpjb21waWxlci9zcmMvZnJvbnRlbmRfc3RyYXRlZ3kuZGFydEFzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydMAAYXgvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmFic3RyYWN0X3ZhbHVlX2RvbWFpbjsKCmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JyBzaG93IENvbnN0YW50VmFsdWUsIFByaW1pdGl2ZUNvbnN0YW50VmFsdWU7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCcgc2hvdyBEYXJ0VHlwZTsKaW1wb3J0ICcuLi9pci9zdGF0aWNfdHlwZS5kYXJ0JzsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JzsKCi8vLyBFbnVtLWxpa2UgdmFsdWVzIHVzZWQgZm9yIHJlcG9ydGluZyBrbm93biBhbmQgdW5rbm93biB0cnV0aCB2YWx1ZXMuCmNsYXNzIEFic3RyYWN0Qm9vbCB7CiAgZmluYWwgYm9vbCBfdmFsdWU7CgogIGNvbnN0IEFic3RyYWN0Qm9vbC5fKHRoaXMuX3ZhbHVlKTsKCiAgYm9vbCBnZXQgaXNEZWZpbml0ZWx5VHJ1ZSA9PiBfdmFsdWUgPT0gdHJ1ZTsKCiAgYm9vbCBnZXQgaXNQb3RlbnRpYWxseVRydWUgPT4gX3ZhbHVlICE9IGZhbHNlOwoKICBib29sIGdldCBpc0RlZmluaXRlbHlGYWxzZSA9PiBfdmFsdWUgPT0gZmFsc2U7CgogIGJvb2wgZ2V0IGlzUG90ZW50aWFsbHlGYWxzZSA9PiBfdmFsdWUgIT0gdHJ1ZTsKCiAgLy8vIEEgdmFsdWUgb2YgYEFic3RyYWN0LlRydWVgIGlzIHVzZWQgd2hlbiB0aGUgcHJvcGVydHkgaXMga25vd24gX2Fsd2F5c18gdG8KICAvLy8gYmUgdHJ1ZS4KICBzdGF0aWMgY29uc3QgQWJzdHJhY3RCb29sIFRydWUgPSBjb25zdCBBYnN0cmFjdEJvb2wuXyh0cnVlKTsKCiAgLy8vIEEgdmFsdWUgb2YgYEFic3RyYWN0LkZhbHNlYCBpcyB1c2VkIHdoZW4gdGhlIHByb3BlcnR5IGlzIGtub3duIF9uZXZlcl8gdG8KICAvLy8gYmUgdHJ1ZS4KICBzdGF0aWMgY29uc3QgQWJzdHJhY3RCb29sIEZhbHNlID0gY29uc3QgQWJzdHJhY3RCb29sLl8oZmFsc2UpOwoKICAvLy8gQSB2YWx1ZSBvZiBgQWJzdHJhY3QuTWF5YmVgIGlzIHVzZWQgd2hlbiB0aGUgcHJvcGVydHkgbWlnaHQgb3IgbWlnaHQgbm90CiAgLy8vIGJlIHRydWUuCiAgc3RhdGljIGNvbnN0IEFic3RyYWN0Qm9vbCBNYXliZSA9IGNvbnN0IEFic3RyYWN0Qm9vbC5fKG51bGwpOwoKICBzdGF0aWMgQWJzdHJhY3RCb29sIHRydWVPck1heWJlKGJvb2wgdmFsdWUpID0+IHZhbHVlID8gVHJ1ZSA6IE1heWJlOwoKICBzdGF0aWMgQWJzdHJhY3RCb29sIHRydWVPckZhbHNlKGJvb2wgdmFsdWUpID0+IHZhbHVlID8gVHJ1ZSA6IEZhbHNlOwoKICBzdGF0aWMgQWJzdHJhY3RCb29sIG1heWJlT3JGYWxzZShib29sIHZhbHVlKSA9PiB2YWx1ZSA/IE1heWJlIDogRmFsc2U7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICdBYnN0cmFjdEJvb2wuJHtfdmFsdWUgPT0gbnVsbCA/ICdNYXliZScgOiAoX3ZhbHVlID8gJ1RydWUnIDogJ0ZhbHNlJyl9JzsKfQoKLy8vIFN0cmF0ZWd5IGZvciB0aGUgYWJzdHJhY3Rpb24gb2YgcnVudGltZSB2YWx1ZXMgdXNlZCBieSB0aGUgZ2xvYmFsIHR5cGUKLy8vIGluZmVyZW5jZS4KYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5IHsKICAvLy8gQ3JlYXRlcyB0aGUgYWJzdHJhY3QgdmFsdWUgZG9tYWluIGZvciBbY2xvc2VkV29ybGRdLgogIEFic3RyYWN0VmFsdWVEb21haW4gY3JlYXRlRG9tYWluKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CgogIC8vLyBDcmVhdGVzIHRoZSBbU2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5XSB1c2VkIGJ5IHRoZSBiYWNrZW5kIGVucXVldWVyLgogIFNlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneSBjcmVhdGVTZWxlY3RvclN0cmF0ZWd5KCk7Cn0KCi8vLyBBIHZhbHVlIGluIGFuIGFic3RyYWN0aW9uIG9mIHJ1bnRpbWUgdmFsdWVzLgphYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbHVlIHt9CgovLy8gQSBwYWlyIG9mIGFuIEFic3RyYWN0VmFsdWUgYW5kIGEgcHJlY2lzaW9uIGZsYWcuIFNlZQovLy8gW0Fic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlRnJvbVN0YXRpY1R5cGVdIGZvciBzZW1hbnRpY3Mgb2YgW2lzUHJlY2lzZV0uCmNsYXNzIEFic3RyYWN0VmFsdWVXaXRoUHJlY2lzaW9uIHsKICBmaW5hbCBBYnN0cmFjdFZhbHVlIGFic3RyYWN0VmFsdWU7CiAgZmluYWwgYm9vbCBpc1ByZWNpc2U7CgogIGNvbnN0IEFic3RyYWN0VmFsdWVXaXRoUHJlY2lzaW9uKHRoaXMuYWJzdHJhY3RWYWx1ZSwgdGhpcy5pc1ByZWNpc2UpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnQWJzdHJhY3RWYWx1ZVdpdGhQcmVjaXNpb24oJGFic3RyYWN0VmFsdWUsIGlzUHJlY2lzZTogJGlzUHJlY2lzZSknOwp9CgovLy8gQSBzeXN0ZW0gdGhhdCBpbXBsZW1lbnRzIGFuIGFic3RyYWN0aW9uIG92ZXIgcnVudGltZSB2YWx1ZXMuCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsdWVEb21haW4gewogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhbiB1bmtub3duIHJ1bnRpbWUgdmFsdWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgZHluYW1pY1R5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIHN1YnR5cGUgb2YgYFR5cGVgIGF0CiAgLy8vIHJ1bnRpbWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgdHlwZVR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIHN1YnR5cGUgb2YgYEZ1bmN0aW9uYCBhdAogIC8vLyBydW50aW1lLgogIEFic3RyYWN0VmFsdWUgZ2V0IGZ1bmN0aW9uVHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgc3VidHlwZSBvZiBgYm9vbGAgYXQKICAvLy8gcnVudGltZS4KICBBYnN0cmFjdFZhbHVlIGdldCBib29sVHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgc3VidHlwZSBvZiBgaW50YCBhdAogIC8vLyBydW50aW1lLgogIEFic3RyYWN0VmFsdWUgZ2V0IGludFR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIHN1YnR5cGUgb2YgYGRvdWJsZWAgYXQKICAvLy8gcnVudGltZS4KICBBYnN0cmFjdFZhbHVlIGdldCBkb3VibGVUeXBlOwoKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgYSBub24tbnVsbCBzdWJ0eXBlIG9mIGBudW1gIGF0CiAgLy8vIHJ1bnRpbWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgbnVtVHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgc3VidHlwZSBvZiBgU3RyaW5nYCBhdAogIC8vLyBydW50aW1lLgogIEFic3RyYWN0VmFsdWUgZ2V0IHN0cmluZ1R5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIHN1YnR5cGUgb2YgYExpc3RgIGF0CiAgLy8vIHJ1bnRpbWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgbGlzdFR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIHN1YnR5cGUgb2YgYFNldGAgYXQKICAvLy8gcnVudGltZS4KICBBYnN0cmFjdFZhbHVlIGdldCBzZXRUeXBlOwoKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgYSBub24tbnVsbCBzdWJ0eXBlIG9mIGBNYXBgIGF0CiAgLy8vIHJ1bnRpbWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgbWFwVHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgdmFsdWUgYXQgcnVudGltZS4KICBBYnN0cmFjdFZhbHVlIGdldCBub25OdWxsVHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIHRoZSBgbnVsbGAgYXQgcnVudGltZS4KICBBYnN0cmFjdFZhbHVlIGdldCBudWxsVHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgZ3Jvd2FibGUgSmF2YVNjcmlwdCBhcnJheQogIC8vLyBhdCBydW50aW1lLgogIEFic3RyYWN0VmFsdWUgZ2V0IGdyb3dhYmxlTGlzdFR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIGZpeGVkIHNpemUgSmF2YVNjcmlwdCBhcnJheQogIC8vLyBhdCBydW50aW1lLgogIEFic3RyYWN0VmFsdWUgZ2V0IGZpeGVkTGlzdFR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyBhIG5vbi1udWxsIDMxLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGF0CiAgLy8vIHJ1bnRpbWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgdWludDMxVHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgMzItYml0IHVuc2lnbmVkIGludGVnZXIgYXQKICAvLy8gcnVudGltZS4KICBBYnN0cmFjdFZhbHVlIGdldCB1aW50MzJUeXBlOwoKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgYSBub24tbnVsbCB1bnNpZ25lZCBpbnRlZ2VyIGF0CiAgLy8vIHJ1bnRpbWUuCiAgQWJzdHJhY3RWYWx1ZSBnZXQgcG9zaXRpdmVJbnRUeXBlOwoKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgYSBub24tbnVsbCBjb25zdGFudCBsaXN0IGxpdGVyYWwgYXQKICAvLy8gcnVudGltZS4KICBBYnN0cmFjdFZhbHVlIGdldCBjb25zdExpc3RUeXBlOwoKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgYSBub24tbnVsbCBjb25zdGFudCBzZXQgbGl0ZXJhbCBhdAogIC8vLyBydW50aW1lLgogIEFic3RyYWN0VmFsdWUgZ2V0IGNvbnN0U2V0VHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgY29uc3RhbnQgbWFwIGxpdGVyYWwgYXQKICAvLy8gcnVudGltZS4KICBBYnN0cmFjdFZhbHVlIGdldCBjb25zdE1hcFR5cGU7CgogIC8vLyBUaGUgW0Fic3RyYWN0VmFsdWVdIHRoYXQgcmVwcmVzZW50cyB0aGUgZW1wdHkgc2V0IG9mIHJ1bnRpbWUgdmFsdWVzLgogIEFic3RyYWN0VmFsdWUgZ2V0IGVtcHR5VHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgaW5zdGFuY2UgYXQgcnVudGltZSBvZiB0aGUKICAvLy8gYEl0ZXJhYmxlYCBjbGFzcyB1c2VkIGZvciB0aGUgYHN5bmMqYCBpbXBsZW1lbnRhdGlvbi4KICBBYnN0cmFjdFZhbHVlIGdldCBzeW5jU3Rhckl0ZXJhYmxlVHlwZTsKCiAgLy8vIFRoZSBbQWJzdHJhY3RWYWx1ZV0gdGhhdCByZXByZXNlbnRzIGEgbm9uLW51bGwgaW5zdGFuY2UgYXQgcnVudGltZSBvZiB0aGUKICAvLy8gYEZ1dHVyZWAgY2xhc3MgdXNlZCBmb3IgdGhlIGBhc3luY2AgaW1wbGVtZW50YXRpb24uCiAgQWJzdHJhY3RWYWx1ZSBnZXQgYXN5bmNGdXR1cmVUeXBlOwoKICAvLy8gVGhlIFtBYnN0cmFjdFZhbHVlXSB0aGF0IHJlcHJlc2VudHMgYSBub24tbnVsbCBpbnN0YW5jZSBhdCBydW50aW1lIG9mIHRoZQogIC8vLyBgU3RyZWFtYCBjbGFzcyB1c2VkIGZvciB0aGUgYGFzeW5jKmAgaW1wbGVtZW50YXRpb24uCiAgQWJzdHJhY3RWYWx1ZSBnZXQgYXN5bmNTdGFyU3RyZWFtVHlwZTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0VmFsdWVdIGFuZCBhIHByZWNpc2lvbiBmbGFnLgogIC8vLwogIC8vLyBDcmVhdGVzIGFuIFtBYnN0cmFjdFZhbHVlXSBjb3JyZXNwb25kaW5nIHRvIGFuIGV4cHJlc3Npb24gb2YgdGhlIGdpdmVuCiAgLy8vIHN0YXRpYyBbdHlwZV0gYW5kIFtjbGFzc1JlbGF0aW9uXSwgYW5kIGFuIGBpc1ByZWNpc2VgIGZsYWcgdGhhdCBpcyBgdHJ1ZWAKICAvLy8gaWYgdGhlIFtBYnN0cmFjdFZhbHVlXSBwcmVjaXNlbHkgcmVwcmVzZW50cyB0aGUgW3R5cGVdLCBvciBgZmFsc2VgIGlmIHRoZQogIC8vLyBbQWJzdHJhY3RWYWx1ZV0gaXMgYW4gYXBwcm94aW1hdGlvbi4KICAvLy8KICAvLy8gSWYgYGlzUHJlY2lzZWAgaXMgYHRydWVgLCB0aGVuIHRoZSBhYnN0cmFjdCB2YWx1ZSBpcyBlcXVpdmFsZW50IHRvIFt0eXBlXS4KICAvLy8KICAvLy8gSWYgYGlzUHJlY2lzZWAgaXMgYGZhbHNlYCB0aGVuIHRoZSBhYnN0cmFjdCB2YWx1ZSBjb250YWlucyBhbGwgdHlwZXMgaW4KICAvLy8gW3R5cGVdIGJ1dCBtaWdodCBjb250YWluIG1vcmUuIFR3byBkaWZmZXJlbnQgRGFydCB0eXBlcyBjYW4gaGF2ZSB0aGUgc2FtZQogIC8vLyBhcHByb3hpbWF0aW9uLCBzbyBjYXJlIG11c3QgYmUgdGFrZW4gbm90IHRvIG1ha2Ugc3VidHlwZSBqdWRnZW1lbnRzIGZyb20KICAvLy8gaW1wcmVjaXNlIGFic3RyYWN0IHZhbHVlcy4KICAvLy8KICAvLy8gVGhlIHR5cGUgYFRgIHdoZXJlIGBUYCBpcyBhIHR5cGUgcGFyYW1ldGVyIHdvdWxkIGJlIG1vZGVsbGVkIGJ5IGFuCiAgLy8vIGltcHJlY2lzZSBhYnN0cmFjdCB2YWx1ZSB0eXBlIHNpbmNlIHdlIGRvbid0IGtub3cgaG93IGBUYCBpcwogIC8vLyBpbnN0YW50aWF0ZWQuIEl0IG1pZ2h0IGJlIGFwcHJveGltYXRlZCBieSB0aGUgYm91bmQgb2YgYFRgLiAgYExpc3Q8VD5gCiAgLy8vIHdoZXJlIGBUYCBpcyBhIHR5cGUgcGFyYW1ldGVyIHdvdWxkIGJlIG1vZGVsbGVkIGFzIGltcHJlY2lzZSBmb3IgdGhlIHNhbWUKICAvLy8gcmVhc29uLgogIC8vLwogIC8vLyBJZiB0aGUgYWJzdHJhY3QgdmFsdWUgZG9tYWluIGRvZXMgbm90IHRyYWNrIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzIChlLmcuCiAgLy8vIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHR5cGUtbWFza3MpLCB0aGVuIGBMaXN0PGludD5gIHdvdWxkIG5lZWQgdG8KICAvLy8gYmUgbW9kZWxsZWQgYnkgYW4gaW1wcmVjaXNlIGFic3RyYWN0IHZhbHVlLiBgTGlzdDxkeW5hbWljPmAgbWlnaHQgYmUgdGhlCiAgLy8vIGltcHJlY2lzZSBhcHByb3hpbWF0aW9uLgogIC8vLwogIC8vLyBJbiB0aGUgY29udGV4dCBvZiBhIHJ1bi10aW1lIHR5cGUgY2hlY2ssIGFuIGltcHJlY2lzZSBhYnN0cmFjdCB2YWx1ZSBjYW4KICAvLy8gYmUgdXNlZCB0byBjb21wdXRlIGFuIG91dHB1dCB0eXBlIGJ5IG5hcnJvd2luZyB0aGUgaW5wdXQgdHlwZSwgYnV0IG9ubHkgYQogIC8vLyBwcmVjaXNlIGFic3RyYWN0IHZhbHVlIGNvdWxkIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSBjaGVjayBvbiB0aGUgYmFzaXMgb2YKICAvLy8gdGhlIGlucHV0J3MgYWJzdHJhY3QgdHlwZS4gVGhlIGNoZWNrIGNhbiBvbmx5IGJlIHJlbW92ZWQgd2l0aCBhZGRpdGlvbmFsCiAgLy8vIHJlYXNvbmluZywgZm9yIGV4YW1wbGUsIHRoYXQgYSBkb21pbmF0aW5nIGNoZWNrIHVzZXMgdGhlIHNhbWUgdHlwZQogIC8vLyBleHByZXNzaW9uLgogIEFic3RyYWN0VmFsdWVXaXRoUHJlY2lzaW9uIGNyZWF0ZUZyb21TdGF0aWNUeXBlKERhcnRUeXBlIHR5cGUsCiAgICAgIFtDbGFzc1JlbGF0aW9uIGNsYXNzUmVsYXRpb24gPSBDbGFzc1JlbGF0aW9uLnN1YnR5cGVdKTsKCiAgLy8vIENyZWF0ZXMgYW4gW0Fic3RyYWN0VmFsdWVdIGZvciBhIG5vbi1udWxsIGV4YWN0IGluc3RhbmNlIG9mIFtjbHNdLgogIEFic3RyYWN0VmFsdWUgY3JlYXRlTm9uTnVsbEV4YWN0KENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBDcmVhdGVzIGFuIFtBYnN0cmFjdFZhbHVlXSBmb3IgYSBwb3RlbnRpYWxseSBudWxsIGV4YWN0IGluc3RhbmNlIG9mIFtjbHNdLgogIEFic3RyYWN0VmFsdWUgY3JlYXRlTnVsbGFibGVFeGFjdChDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gQ3JlYXRlcyBhbiBbQWJzdHJhY3RWYWx1ZV0gZm9yIGEgbm9uLW51bGwgaW5zdGFuY2UgdGhhdCBleHRlbmRzIFtjbHNdLgogIEFic3RyYWN0VmFsdWUgY3JlYXRlTm9uTnVsbFN1YmNsYXNzKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBDcmVhdGVzIGFuIFtBYnN0cmFjdFZhbHVlXSBmb3IgYSBub24tbnVsbCBpbnN0YW5jZSB0aGF0IGltcGxlbWVudHMgW2Nsc10uCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVOb25OdWxsU3VidHlwZShDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gQ3JlYXRlcyBhbiBbQWJzdHJhY3RWYWx1ZV0gZm9yIGEgcG90ZW50aWFsbHkgbnVsbCBpbnN0YW5jZSB0aGF0IGltcGxlbWVudHMKICAvLy8gW2Nsc10uCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVOdWxsYWJsZVN1YnR5cGUoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGEgbmF0aXZlIHR5cGVkCiAgLy8vIGFycmF5IG9yIGBudWxsYCBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc1R5cGVkQXJyYXkoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gY291bGQgYmUgYSBuYXRpdmUKICAvLy8gdHlwZWQgYXJyYXkgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgY291bGRCZVR5cGVkQXJyYXkoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgYWJzdHJhY3QgW3ZhbHVlXSB0aGF0IGV4Y2x1ZGVzIGBudWxsYC4KICBBYnN0cmFjdFZhbHVlIGV4Y2x1ZGVOdWxsKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIGFic3RyYWN0IFt2YWx1ZV0gdGhhdCBpbmNsdWRlcyBgbnVsbGAuCiAgQWJzdHJhY3RWYWx1ZSBpbmNsdWRlTnVsbChjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBjb250YWlucwogIC8vLyBpbnN0YW5jZXMgb2YgW2Nsc10gYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgY29udGFpbnNUeXBlKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlLCBDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gb25seSBjb250YWlucwogIC8vLyBzdWJ0eXBlcyBvZiBbY2xzXSBvciBgbnVsbGAgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgY29udGFpbnNPbmx5VHlwZShjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSwgQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGFuIGluc3RhbmNlIG9mCiAgLy8vIFtjbHNdIG9yIGBudWxsYCBhdCBydW50aW1lLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1lcmdlIHRoaXMgd2l0aCBbaXNJbnN0YW5jZU9mXS4KICBBYnN0cmFjdEJvb2wgaXNJbnN0YW5jZU9mT3JOdWxsKAogICAgICBjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSwgQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGtub3duIHRvIGJlIGFuCiAgLy8vIGluc3RhbmNlIG9mIFtjbHNdIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzSW5zdGFuY2VPZihBYnN0cmFjdFZhbHVlIHZhbHVlLCBDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgZW1wdHkgc2V0IG9mCiAgLy8vIHJ1bnRpbWUgdmFsdWVzLgogIEFic3RyYWN0Qm9vbCBpc0VtcHR5KGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGEgbm9uLW51bGwKICAvLy8gZXhhY3QgY2xhc3MgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgaXNFeGFjdChjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhbiBleGFjdCBjbGFzcwogIC8vLyBvciBgbnVsbGAgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgaXNFeGFjdE9yTnVsbChjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbQ2xhc3NFbnRpdHldIGlmIHRoaXMgW3ZhbHVlXSBpcyBhIG5vbi1udWxsIGluc3RhbmNlIG9mIGFuCiAgLy8vIGV4YWN0IGNsYXNzIGF0IHJ1bnRpbWUsIGFuZCBgbnVsbGAgb3RoZXJ3aXNlLgogIENsYXNzRW50aXR5IGdldEV4YWN0Q2xhc3MoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYG51bGxgIGF0CiAgLy8vIHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzTnVsbChjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIEphdmFTY3JpcHQKICAvLy8gYm9vbCwgbnVtYmVyLCBzdHJpbmcsIGFycmF5IG9yIGBudWxsYCBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZShjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIEphdmFTY3JpcHQKICAvLy8gbnVtYmVyIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzUHJpbWl0aXZlTnVtYmVyKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGEgSmF2YVNjcmlwdAogIC8vLyBib29sIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzUHJpbWl0aXZlQm9vbGVhbihjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIEphdmFTY3JpcHQKICAvLy8gYXJyYXkgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgaXNQcmltaXRpdmVBcnJheShjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIEphdmFTY3JpcHQKICAvLy8gc3RyaW5nLCBhcnJheSwgbmF0aXZlIEhUTUwgbGlzdCBvciBgbnVsbGAgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgaXNJbmRleGFibGVQcmltaXRpdmUoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBmaXhlZC1zaXplCiAgLy8vIG9yIGNvbnN0YW50IEphdmFTY3JpcHQgYXJyYXkgb3IgYG51bGxgIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzRml4ZWRBcnJheShjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIGdyb3dhYmxlCiAgLy8vIEphdmFTY3JpcHQgYXJyYXkgb3IgYG51bGxgIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzRXh0ZW5kYWJsZUFycmF5KGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGEgbXV0YWJsZQogIC8vLyBKYXZhU2NyaXB0IGFycmF5IG9yIGBudWxsYCBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc011dGFibGVBcnJheShjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIG11dGFibGUKICAvLy8gSmF2YVNjcmlwdCBhcnJheSwgbmF0aXZlIEhUTUwgbGlzdCBvciBgbnVsbGAgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgaXNNdXRhYmxlSW5kZXhhYmxlKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGEgSmF2YVNjcmlwdAogIC8vLyBhcnJheSBvciBgbnVsbGAgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgaXNBcnJheShjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIEphdmFTY3JpcHQKICAvLy8gc3RyaW5nIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzUHJpbWl0aXZlU3RyaW5nKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGFuIGludGVyY2VwdG9yCiAgLy8vIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzSW50ZXJjZXB0b3IoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBub24tbnVsbAogIC8vLyBpbnRlZ2VyIHZhbHVlIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzSW50ZWdlcihjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIG5vbi1udWxsIDMyCiAgLy8vIGJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzVUludDMyKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGEgbm9uLW51bGwgMzEKICAvLy8gYml0IHVuc2lnbmVkIGludGVnZXIgdmFsdWUgYXQgcnVudGltZS4KICBBYnN0cmFjdEJvb2wgaXNVSW50MzEoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBub24tbnVsbAogIC8vLyB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzUG9zaXRpdmVJbnRlZ2VyKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGFuIHVuc2lnbmVkCiAgLy8vIGludGVnZXIgdmFsdWUgb3IgYG51bGxgIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzUG9zaXRpdmVJbnRlZ2VyT3JOdWxsKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGFuIGludGVnZXIKICAvLy8gdmFsdWUgb3IgYG51bGxgIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzSW50ZWdlck9yTnVsbChjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIG5vbi1udWxsCiAgLy8vIEphdmFTY3JpcHQgbnVtYmVyIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzTnVtYmVyKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGEgSmF2YVNjcmlwdAogIC8vLyBudW1iZXIgb3IgYG51bGxgIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzTnVtYmVyT3JOdWxsKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGEgbm9uLWludGVnZXIKICAvLy8gbnVtYmVyIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzRG91YmxlKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGEgbm9uLWludGVnZXIKICAvLy8gbnVtYmVyIG9yIGBudWxsYCBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc0RvdWJsZU9yTnVsbChjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIEphdmFTY3JpcHQKICAvLy8gYm9vbCBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc0Jvb2xlYW4oY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFt2YWx1ZV0gaXMgYSBKYXZhU2NyaXB0CiAgLy8vIGJvb2wgb3IgYG51bGxgIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzQm9vbGVhbk9yTnVsbChjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW3ZhbHVlXSBpcyBhIEphdmFTY3JpcHQKICAvLy8gc3RyaW5nIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzU3RyaW5nKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGlzIGEgSmF2YVNjcmlwdAogIC8vLyBzdHJpbmcgb3IgYG51bGxgIGF0IHJ1bnRpbWUuCiAgQWJzdHJhY3RCb29sIGlzU3RyaW5nT3JOdWxsKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbdmFsdWVdIGEgSmF2YVNjcmlwdAogIC8vLyBwcmltaXRpdmUsIHBvc3NpYmxlIGBudWxsYC4KICBBYnN0cmFjdEJvb2wgaXNQcmltaXRpdmVPck51bGwoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBbQWJzdHJhY3RWYWx1ZV0gZm9yIHRoZSBydW50aW1lIHZhbHVlcyBjb250YWluZWQgaW4gZWl0aGVyIFthXSBvcgogIC8vLyBbYl0uCiAgQWJzdHJhY3RWYWx1ZSB1bmlvbihjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSBhLCBjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSBiKTsKCiAgLy8vIFJldHVybnMgW0Fic3RyYWN0VmFsdWVdIGZvciB0aGUgcnVudGltZSB2YWx1ZXMgY29udGFpbmVkIGluIGF0IGxlYXN0IG9uZQogIC8vLyBvZiBbdmFsdWVzXS4KICBBYnN0cmFjdFZhbHVlIHVuaW9uT2ZNYW55KEl0ZXJhYmxlPEFic3RyYWN0VmFsdWU+IHZhbHVlcyk7CgogIC8vLyBSZXR1cm5zIFtBYnN0cmFjdFZhbHVlXSBmb3IgdGhlIHJ1bnRpbWUgdmFsdWVzIHRoYXQgW2FdIGFuZCBbYl0gaGF2ZSBpbgogIC8vLyBjb21tb24uCiAgQWJzdHJhY3RWYWx1ZSBpbnRlcnNlY3Rpb24oCiAgICAgIGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIGEsIGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIGIpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyB3aGV0aGVyIFthXSBhbmQgW2JdIGhhdmUgbm8KICAvLy8gcnVudGltZSB2YWx1ZXMgaW4gY29tbW9uLgogIEFic3RyYWN0Qm9vbCBhcmVEaXNqb2ludCgKICAgICAgY292YXJpYW50IEFic3RyYWN0VmFsdWUgYSwgY292YXJpYW50IEFic3RyYWN0VmFsdWUgYik7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW2FdIGNvbnRhaW5zIGFsbCBub24tbnVsbAogIC8vLyBydW50aW1lIHZhbHVlcy4KICBBYnN0cmFjdEJvb2wgY29udGFpbnNBbGwoY292YXJpYW50IEFic3RyYWN0VmFsdWUgYSk7CgogIC8vLyBDb21wdXRlcyB0aGUgW0Fic3RyYWN0VmFsdWVdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnN0YW50IFt2YWx1ZV0uCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlQWJzdHJhY3RWYWx1ZUZvckNvbnN0YW50KENvbnN0YW50VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW3ZhbHVlXSByZXByZXNlbnRzIGEgY29udGFpbmVyIHZhbHVlIGF0IHJ1bnRpbWUuCiAgYm9vbCBpc0NvbnRhaW5lcihjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBDcmVhdGVzIGEgY29udGFpbmVyIHZhbHVlIHNwZWNpYWxpemF0aW9uIG9mIFtvcmlnaW5hbFZhbHVlXSB3aXRoIHRoZQogIC8vLyBpbmZlcnJlZCBbZWxlbWVudF0gcnVudGltZSB2YWx1ZSBhbmQgaW5mZXJyZWQgcnVudGltZSBbbGVuZ3RoXS4KICAvLy8KICAvLy8gVGhlIFthbGxvY2F0aW9uTm9kZV0gaXMgdXNlZCB0byBpZGVudGlmeSB0aGlzIHBhcnRpY3VsYXIgbWFwIGFsbG9jYXRpb24uCiAgLy8vIFRoZSBbYWxsb2NhdGlvbkVsZW1lbnRdIGlzIHVzZWQgb25seSBmb3IgZGVidWdnaW5nLgogIEFic3RyYWN0VmFsdWUgY3JlYXRlQ29udGFpbmVyVmFsdWUoCiAgICAgIEFic3RyYWN0VmFsdWUgb3JpZ2luYWxWYWx1ZSwKICAgICAgT2JqZWN0IGFsbG9jYXRpb25Ob2RlLAogICAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgIEFic3RyYWN0VmFsdWUgZWxlbWVudFR5cGUsCiAgICAgIGludCBsZW5ndGgpOwoKICAvLy8gUmV0dXJucyB0aGUgZWxlbWVudCB0eXBlIG9mIFt2YWx1ZV0gaWYgaXQgcmVwcmVzZW50cyBhIGNvbnRhaW5lciB2YWx1ZQogIC8vLyBhdCBydW50aW1lLiBSZXR1cm5zIFtkeW5hbWljVHlwZV0gb3RoZXJ3aXNlLgogIEFic3RyYWN0VmFsdWUgZ2V0Q29udGFpbmVyRWxlbWVudFR5cGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm4gdGhlIGtub3duIGxlbmd0aCBvZiBbdmFsdWVdIGlmIGl0IHJlcHJlc2VudHMgYSBjb250YWluZXIgdmFsdWUKICAvLy8gYXQgcnVudGltZS4gUmV0dXJucyBgbnVsbGAgaWYgdGhlIGxlbmd0aCBpcyB1bmtub3duIG9yIGlmIFt2YWx1ZV0gZG9lc24ndAogIC8vLyByZXByZXNlbnQgYSBjb250YWluZXIgdmFsdWUgYXQgcnVudGltZS4KICBpbnQgZ2V0Q29udGFpbmVyTGVuZ3RoKEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW3ZhbHVlXSByZXByZXNlbnRzIGEgc2V0IHZhbHVlIGF0IHJ1bnRpbWUuCiAgYm9vbCBpc1NldChjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBDcmVhdGVzIGEgc2V0IHZhbHVlIHNwZWNpYWxpemF0aW9uIG9mIFtvcmlnaW5hbFZhbHVlXSB3aXRoIHRoZSBpbmZlcnJlZAogIC8vLyBbZWxlbWVudFR5cGVdIHJ1bnRpbWUgdmFsdWUuCiAgLy8vCiAgLy8vIFRoZSBbYWxsb2NhdGlvbk5vZGVdIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBwYXJ0aWN1bGFyIHNldCBhbGxvY2F0aW9uLgogIC8vLyBUaGUgW2FsbG9jYXRpb25FbGVtZW50XSBpcyB1c2VkIG9ubHkgZm9yIGRlYnVnZ2luZy4KICBBYnN0cmFjdFZhbHVlIGNyZWF0ZVNldFZhbHVlKAogICAgICBBYnN0cmFjdFZhbHVlIG9yaWdpbmFsVmFsdWUsCiAgICAgIE9iamVjdCBhbGxvY2F0aW9uTm9kZSwKICAgICAgTWVtYmVyRW50aXR5IGFsbG9jYXRpb25FbGVtZW50LAogICAgICBBYnN0cmFjdFZhbHVlIGVsZW1lbnRUeXBlKTsKCiAgLy8vIFJldHVybnMgdGhlIGVsZW1lbnQgdHlwZSBvZiBbdmFsdWVdIGlmIGl0IHJlcHJlc2VudHMgYSBzZXQgdmFsdWUgYXQKICAvLy8gcnVudGltZS4gUmV0dXJucyBbZHluYW1pY1R5cGVdIG90aGVyd2lzZS4KICBBYnN0cmFjdFZhbHVlIGdldFNldEVsZW1lbnRUeXBlKEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW3ZhbHVlXSByZXByZXNlbnRzIGEgbWFwIHZhbHVlIGF0IHJ1bnRpbWUuCiAgYm9vbCBpc01hcChjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBDcmVhdGVzIGEgbWFwIHZhbHVlIHNwZWNpYWxpemF0aW9uIG9mIFtvcmlnaW5hbFZhbHVlXSB3aXRoIHRoZSBpbmZlcnJlZAogIC8vLyBba2V5XSBhbmQgW3ZhbHVlXSBydW50aW1lIHZhbHVlcy4KICAvLy8KICAvLy8gVGhlIFthbGxvY2F0aW9uTm9kZV0gaXMgdXNlZCB0byBpZGVudGlmeSB0aGlzIHBhcnRpY3VsYXIgbWFwIGFsbG9jYXRpb24uCiAgLy8vIFRoZSBbYWxsb2NhdGlvbkVsZW1lbnRdIGlzIHVzZWQgb25seSBmb3IgZGVidWdnaW5nLgogIEFic3RyYWN0VmFsdWUgY3JlYXRlTWFwVmFsdWUoCiAgICAgIEFic3RyYWN0VmFsdWUgb3JpZ2luYWxWYWx1ZSwKICAgICAgT2JqZWN0IGFsbG9jYXRpb25Ob2RlLAogICAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgIEFic3RyYWN0VmFsdWUga2V5LAogICAgICBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgdGhlIGtleSB0eXBlIG9mIFt2YWx1ZV0gaWYgaXQgcmVwcmVzZW50cyBhIG1hcCB2YWx1ZSBhdCBydW50aW1lLgogIC8vLyBSZXR1cm5zIFtkeW5hbWljVHlwZV0gb3RoZXJ3aXNlLgogIEFic3RyYWN0VmFsdWUgZ2V0TWFwS2V5VHlwZShBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgdGhlIHZhbHVlIHR5cGUgb2YgW3ZhbHVlXSBpZiBpdCByZXByZXNlbnRzIGEgbWFwIHZhbHVlIGF0IHJ1bnRpbWUuCiAgLy8vIFJldHVybnMgW2R5bmFtaWNUeXBlXSBvdGhlcndpc2UuCiAgQWJzdHJhY3RWYWx1ZSBnZXRNYXBWYWx1ZVR5cGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbdmFsdWVdIHJlcHJlc2VudHMgYSBkaWN0aW9uYXJ5IHZhbHVlLCB0aGF0IGlzLCBhIG1hcAogIC8vLyB3aXRoIHN0cmluZ3MgYXMga2V5cywgYXQgcnVudGltZS4KICBib29sIGlzRGljdGlvbmFyeShjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBDcmVhdGVzIGEgZGljdGlvbmFyeSB2YWx1ZSBzcGVjaWFsaXphdGlvbiBvZiBbb3JpZ2luYWxWYWx1ZV0gd2l0aCB0aGUKICAvLy8gaW5mZXJyZWQgW2tleV0gYW5kIFt2YWx1ZV0gcnVudGltZSB2YWx1ZXMuCiAgLy8vCiAgLy8vIFRoZSBbYWxsb2NhdGlvbk5vZGVdIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBwYXJ0aWN1bGFyIG1hcCBhbGxvY2F0aW9uLgogIC8vLyBUaGUgW2FsbG9jYXRpb25FbGVtZW50XSBpcyB1c2VkIG9ubHkgZm9yIGRlYnVnZ2luZy4KICBBYnN0cmFjdFZhbHVlIGNyZWF0ZURpY3Rpb25hcnlWYWx1ZSgKICAgICAgQWJzdHJhY3RWYWx1ZSBvcmlnaW5hbFZhbHVlLAogICAgICBPYmplY3QgYWxsb2NhdGlvbk5vZGUsCiAgICAgIE1lbWJlckVudGl0eSBhbGxvY2F0aW9uRWxlbWVudCwKICAgICAgQWJzdHJhY3RWYWx1ZSBrZXksCiAgICAgIEFic3RyYWN0VmFsdWUgdmFsdWUsCiAgICAgIE1hcDxTdHJpbmcsIEFic3RyYWN0VmFsdWU+IG1hcHBpbmdzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFt2YWx1ZV0gaXMgYSBkaWN0aW9uYXJ5IHZhbHVlIHdoaWNoIGNvbnRhaW5zIFtrZXldIGFzCiAgLy8vIGEga2V5LgogIGJvb2wgY29udGFpbnNEaWN0aW9uYXJ5S2V5KEFic3RyYWN0VmFsdWUgdmFsdWUsIFN0cmluZyBrZXkpOwoKICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgdHlwZSBmb3IgW2tleV0gaW4gW3ZhbHVlXSBpZiBpdCByZXByZXNlbnRzIGEgZGljdGlvbmFyeQogIC8vLyB2YWx1ZSBhdCBydW50aW1lLiBSZXR1cm5zIFtkeW5hbWljVHlwZV0gb3RoZXJ3aXNlLgogIEFic3RyYWN0VmFsdWUgZ2V0RGljdGlvbmFyeVZhbHVlRm9yS2V5KEFic3RyYWN0VmFsdWUgdmFsdWUsIFN0cmluZyBrZXkpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW3NwZWNpYWxpemF0aW9uXSBpcyBhIHNwZWNpYWxpemF0aW9uIG9mCiAgLy8vIFtnZW5lcmFsaXphdGlvbl0uCiAgLy8vCiAgLy8vIFNwZWNpYWxpemF0aW9ucyBhcmUgY3JlYXRlZCB0aHJvdWdoIFtjcmVhdGVQcmltaXRpdmVWYWx1ZV0sCiAgLy8vIFtjcmVhdGVNYXBWYWx1ZV0sIFtjcmVhdGVEaWN0aW9uYXJ5VmFsdWVdIGFuZCBbY3JlYXRlQ29udGFpbmVyVmFsdWVdLgogIGJvb2wgaXNTcGVjaWFsaXphdGlvbk9mKAogICAgICBBYnN0cmFjdFZhbHVlIHNwZWNpYWxpemF0aW9uLCBBYnN0cmFjdFZhbHVlIGdlbmVyYWxpemF0aW9uKTsKCiAgLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHdoaWNoIFt2YWx1ZV0gaXMgYSBzcGVjaWFsaXphdGlvbi4gUmV0dXJuIGBudWxsYCBpZgogIC8vLyBbdmFsdWVdIGlzIG5vdCBhIHNwZWNpYWxpemF0aW9uLgogIC8vLwogIC8vLyBTcGVjaWFsaXphdGlvbnMgYXJlIGNyZWF0ZWQgdGhyb3VnaCBbY3JlYXRlUHJpbWl0aXZlVmFsdWVdLAogIC8vLyBbY3JlYXRlTWFwVmFsdWVdLCBbY3JlYXRlRGljdGlvbmFyeVZhbHVlXSBhbmQgW2NyZWF0ZUNvbnRhaW5lclZhbHVlXS4KICBBYnN0cmFjdFZhbHVlIGdldEdlbmVyYWxpemF0aW9uKEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJuIHRoZSBvYmplY3QgaWRlbnRpZnlpbmcgdGhlIGFsbG9jYXRpb24gb2YgW3ZhbHVlXSBpZiBpdCBpcyBhbgogIC8vLyBhbGxvY2F0aW9uIGJhc2VkIHNwZWNpYWxpemF0aW9uLiBPdGhlcndpc2UgcmV0dXJucyBgbnVsbGAuCiAgLy8vCiAgLy8vIEFsbG9jYXRpb24gYmFzZWQgc3BlY2lhbGl6YXRpb25zIGFyZSBjcmVhdGVkIHRocm91Z2ggW2NyZWF0ZU1hcFZhbHVlXSwKICAvLy8gW2NyZWF0ZURpY3Rpb25hcnlWYWx1ZV0gYW5kIFtjcmVhdGVDb250YWluZXJWYWx1ZV0KICBPYmplY3QgZ2V0QWxsb2NhdGlvbk5vZGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBSZXR1cm4gdGhlIGFsbG9jYXRpb24gZWxlbWVudCBvZiBbdmFsdWVdIGlmIGl0IGlzIGFuIGFsbG9jYXRpb24gYmFzZWQKICAvLy8gc3BlY2lhbGl6YXRpb24uIE90aGVyd2lzZSByZXR1cm5zIGBudWxsYC4KICAvLy8KICAvLy8gQWxsb2NhdGlvbiBiYXNlZCBzcGVjaWFsaXphdGlvbnMgYXJlIGNyZWF0ZWQgdGhyb3VnaCBbY3JlYXRlTWFwVmFsdWVdLAogIC8vLyBbY3JlYXRlRGljdGlvbmFyeVZhbHVlXSBhbmQgW2NyZWF0ZUNvbnRhaW5lclZhbHVlXQogIE1lbWJlckVudGl0eSBnZXRBbGxvY2F0aW9uRWxlbWVudChBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFt2YWx1ZV0gYSBrbm93biBwcmltaXRpdmUgSmF2YVNjcmlwdCB2YWx1ZSBhdCBydW50aW1lLgogIGJvb2wgaXNQcmltaXRpdmVWYWx1ZShjb3ZhcmlhbnQgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBDcmVhdGVzIGEgcHJpbWl0aXZlIHZhbHVlIHNwZWNpYWxpemF0aW9uIG9mIFtvcmlnaW5hbFZhbHVlXSB3aXRoIHRoZQogIC8vLyBpbmZlcnJlZCBwcmltaXRpdmUgY29uc3RhbnQgW3ZhbHVlXS4KICBBYnN0cmFjdFZhbHVlIGNyZWF0ZVByaW1pdGl2ZVZhbHVlKAogICAgICBBYnN0cmFjdFZhbHVlIG9yaWdpbmFsVmFsdWUsIFByaW1pdGl2ZUNvbnN0YW50VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyB0aGUgcHJpbWl0aXZlIEphdmFTY3JpcHQgdmFsdWUgb2YgW3ZhbHVlXSBpZiBpdCByZXByZXNlbnRzIGEKICAvLy8gcHJpbWl0aXZlIEphdmFTY3JpcHQgdmFsdWUgYXQgcnVudGltZSwgdmFsdWUgYXQgcnVudGltZS4gUmV0dXJucyBgbnVsbGAKICAvLy8gb3RoZXJ3aXNlLgogIFByaW1pdGl2ZUNvbnN0YW50VmFsdWUgZ2V0UHJpbWl0aXZlVmFsdWUoY292YXJpYW50IEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gQ29tcHV0ZSB0aGUgdHlwZSBvZiBhbGwgcG90ZW50aWFsIHJlY2VpdmVycyBvZiB0aGUgc2V0IG9mIGxpdmUgW21lbWJlcnNdLgogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVJlY2VpdmVyKEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gbWVtYmVycyk7CgogIC8vLyBSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIHdoZXRoZXIgW21lbWJlcl0gaXMgYSBwb3RlbnRpYWwKICAvLy8gdGFyZ2V0IHdoZW4gYmVpbmcgaW52b2tlZCBvbiBhIFtyZWNlaXZlcl0uIFtuYW1lXSBpcyB1c2VkIHRvIGVuc3VyZQogIC8vLyBsaWJyYXJ5IHByaXZhY3kgaXMgdGFrZW4gaW50byBhY2NvdW50LgogIEFic3RyYWN0Qm9vbCBpc1RhcmdldGluZ01lbWJlcigKICAgICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlciwgTWVtYmVyRW50aXR5IG1lbWJlciwgTmFtZSBuYW1lKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgd2hldGhlciBbc2VsZWN0b3JdIGludm9rZWQgb24gYQogIC8vLyBbcmVjZWl2ZXJdIGNhbiBoaXQgYSBbbm9TdWNoTWV0aG9kXS4KICBBYnN0cmFjdEJvb2wgbmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZygKICAgICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlciwgU2VsZWN0b3Igc2VsZWN0b3IpOwoKICAvLy8gUmV0dXJucyB0aGUgW0Fic3RyYWN0VmFsdWVdIGZvciB0aGUgW3BhcmFtZXRlclR5cGVdIG9mIGEgbmF0aXZlCiAgLy8vIG1ldGhvZC4gTWF5IHJldHVybiBgbnVsbGAsIGZvciBleGFtcGxlLCBpZiBbcGFyYW1ldGVyVHlwZV0gaXMgbm90IG1vZGVsbGVkCiAgLy8vIHByZWNpc2VseSBieSBhbiBbQWJzdHJhY3RWYWx1ZV0uCiAgQWJzdHJhY3RWYWx1ZSBnZXRBYnN0cmFjdFZhbHVlRm9yTmF0aXZlTWV0aG9kUGFyYW1ldGVyVHlwZShEYXJ0VHlwZSB0eXBlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgaWYgdGhlIHNldCBvZiBydW50aW1lIHZhbHVlcyBvZgogIC8vLyBbc3Vic2V0XSBhcmUga25vd24gdG8gYWxsIGJlIGluIHRoZSBzZXQgb2YgcnVudGltZSB2YWx1ZXMgb2YgW3N1cGVyc2V0XS4KICBBYnN0cmFjdEJvb2wgY29udGFpbnMoQWJzdHJhY3RWYWx1ZSBzdXBlcnNldCwgQWJzdHJhY3RWYWx1ZSBzdWJzZXQpOwoKICAvLy8gUmV0dXJucyBhbiBbQWJzdHJhY3RCb29sXSB0aGF0IGRlc2NyaWJlcyBpZiB0aGUgc2V0IG9mIHJ1bnRpbWUgdmFsdWVzIG9mCiAgLy8vIFtzdWJzZXRdIGFyZSBrbm93biB0byBhbGwgYmUgaW4gdGhlIHNldCBvZiBydW50aW1lIHZhbHVlcyBvZiBbc3VwZXJzZXRdLgogIEFic3RyYWN0Qm9vbCBpc0luKEFic3RyYWN0VmFsdWUgc3Vic2V0LCBBYnN0cmFjdFZhbHVlIHN1cGVyc2V0KTsKCiAgLy8vIFJldHVybnMgdGhlIFtNZW1iZXJFbnRpdHldIHRoYXQgaXMga25vd24gdG8gYWx3YXlzIGJlIGhpdCBhdCBydW50aW1lCiAgLy8vIFtyZWNlaXZlcl0uCiAgLy8vCiAgLy8vIFJldHVybnMgYG51bGxgIGlmIDAgb3IgbW9yZSB0aGFuIDEgbWVtYmVyIGNhbiBiZSBoaXQgYXQgcnVudGltZS4KICBNZW1iZXJFbnRpdHkgbG9jYXRlU2luZ2xlTWVtYmVyKEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIsIFNlbGVjdG9yIHNlbGVjdG9yKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgaWYgW3ZhbHVlXSBpcyBrbm93biB0byBiZSBhbgogIC8vLyBpbmRleGFibGUgSmF2YVNjcmlwdCB2YWx1ZSBhdCBydW50aW1lLgogIEFic3RyYWN0Qm9vbCBpc0pzSW5kZXhhYmxlKGNvdmFyaWFudCBBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJSZXR1cm5zIGFuIFtBYnN0cmFjdEJvb2xdIHRoYXQgZGVzY3JpYmVzIGlmIFt2YWx1ZV0gaXMga25vd24gdG8gYmUgYW4KICAvLy8gaW5kZXhhYmxlIG9yIGl0ZXJhYmxlIEphdmFTY3JpcHQgdmFsdWUgYXQgcnVudGltZS4KICAvLy8KICAvLy8gSmF2YVNjcmlwdCBhcnJheXMgYXJlIGJvdGggaW5kZXhhYmxlIGFuZCBpdGVyYWJsZSB3aGVyZWFzIEphdmFTY3JpcHQKICAvLy8gc3RyaW5ncyBhcmUgaW5kZXhhYmxlIGJ1dCBub3QgaXRlcmFibGUuCiAgQWJzdHJhY3RCb29sIGlzSnNJbmRleGFibGVBbmRJdGVyYWJsZShBYnN0cmFjdFZhbHVlIHZhbHVlKTsKCiAgLy8vIFJldHVybnMgYW4gW0Fic3RyYWN0Qm9vbF0gdGhhdCBkZXNjcmliZXMgaWYgW3ZhbHVlXSBpcyBrbm93biB0byBiZSBhCiAgLy8vIEphdmFTY3JpcHQgaW5kZXhhYmxlIG9mIGZpeGVkIGxlbmd0aC4KICBBYnN0cmFjdEJvb2wgaXNGaXhlZExlbmd0aEpzSW5kZXhhYmxlKEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gUmV0dXJucyBjb21wYWN0IGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBmb3IgW3ZhbHVlXSB1c2VkIGZvciBkZWJ1Z2dpbmcuCiAgU3RyaW5nIGdldENvbXBhY3RUZXh0KEFic3RyYWN0VmFsdWUgdmFsdWUpOwoKICAvLy8gRGVzZXJpYWxpemVzIGFuIFtBYnN0cmFjdFZhbHVlXSBmb3IgdGhpcyBkb21haW4gZnJvbSBbc291cmNlXS4KICBBYnN0cmFjdFZhbHVlIHJlYWRBYnN0cmFjdFZhbHVlRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpOwoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFt2YWx1ZV0gZm9yIHRoaXMgZG9tYWluIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlQWJzdHJhY3RWYWx1ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaywgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7Cn0KglsATk48AScBTiQhLyEuJCkYAUgVFQElAS8BMQExATEBUA8/AVAPQQFPD0ABRwFHAUkBDBdQAgFLDyc7PgFOOAIBMSABOU0jJRgBSAEMF0sCAUElRCEBSg8eAU4PIgFKDx4BSQ8dAUwPIAFJDx0BTA8gAUoPHgFJDx0BSQ8dAUchAUEeAU8SJgFREiMBUA8gAVAPIAFJDyUBTg8jAU0PIgFNDyIBSx8BUDwqAVA6JQFQOykBNwZNUFArBlEGTlBPIQZJQ01QDgZQUE8fBk9QT09JEkE+AUk1AVE2AU04AVA3AVENOAFRIjwBUR5BAUg8AUg8AUglTQFNLlEBUSI6IzcBUSRDAU8WNwFNHjcBURw9AU00PAFMDzYBTzg7AU8ZQQFPF0IBTxhAAU88RAFPOTwBTS1BAUwtPgFMP0IBTyI3AU8ZQQFREj0BTSA5AVAtOAFQLTgBTSlBAU4qRwFNIj8BTSQ4AU8jPgFQGTgBUCM+AU8XOQFPIT8BTxk4AU8jPgFMIkEBUAtNAU8TPQFODh49AUsgHD0BURY3AUpGAUkzAUtGBk86JiMdJiETAU0zPgFMUC4vAUMtAU4jBk86ICMdJiIBSjA4AUMtAU4oBk86ICMdJhkcAU8nNAFRJzYBTig0AUwxBk86JyMdJhkbLAFODT8BUDlLAUAYBkJMG0MBTycGQkw4AUpBBk05MQFMMAZNOToBTzgBSysmQgFLThFLAVBBAU9KLSI/AU8rKjIBRlEnTQFPT0cBT09DAUsSBkdOAUwtPQFNOQZLLj4BSyw+AU8uAUVEATlJAgE4cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQzc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaW5mZXJyZXIvdHJpdmlhbC5kYXJ0tNwvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnIHNob3cgQ29uc3RhbnRWYWx1ZSwgUHJpbWl0aXZlQ29uc3RhbnRWYWx1ZTsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JyBzaG93IERhcnRUeXBlOwppbXBvcnQgJy4uL2lyL3N0YXRpY190eXBlLmRhcnQnOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JzsKaW1wb3J0ICdhYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CgpjbGFzcyBUcml2aWFsQWJzdHJhY3RWYWx1ZSBpbXBsZW1lbnRzIEFic3RyYWN0VmFsdWUgewogIGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICc/JzsKfQoKY2xhc3MgVHJpdmlhbEFic3RyYWN0VmFsdWVEb21haW4gaW1wbGVtZW50cyBBYnN0cmFjdFZhbHVlRG9tYWluIHsKICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZURvbWFpbigpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBkeW5hbWljVHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQWJzdHJhY3RWYWx1ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaywgQWJzdHJhY3RWYWx1ZSB2YWx1ZSkge30KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSByZWFkQWJzdHJhY3RWYWx1ZUZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0Q29tcGFjdFRleHQoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gJz8nOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNGaXhlZExlbmd0aEpzSW5kZXhhYmxlKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+CiAgICAgIEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzSnNJbmRleGFibGVBbmRJdGVyYWJsZShBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PgogICAgICBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0pzSW5kZXhhYmxlKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGxvY2F0ZVNpbmdsZU1lbWJlcihBYnN0cmFjdFZhbHVlIHJlY2VpdmVyLCBTZWxlY3RvciBzZWxlY3RvcikgPT4KICAgICAgbnVsbDsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzSW4oQWJzdHJhY3RWYWx1ZSBzdWJzZXQsIEFic3RyYWN0VmFsdWUgc3VwZXJzZXQpID0+CiAgICAgIEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGNvbnRhaW5zKEFic3RyYWN0VmFsdWUgc3VwZXJzZXQsIEFic3RyYWN0VmFsdWUgc3Vic2V0KSA9PgogICAgICBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBuZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKAogICAgICAgICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlciwgU2VsZWN0b3Igc2VsZWN0b3IpID0+CiAgICAgIEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzVGFyZ2V0aW5nTWVtYmVyKAogICAgICAgICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlciwgTWVtYmVyRW50aXR5IG1lbWJlciwgTmFtZSBuYW1lKSA9PgogICAgICBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVJlY2VpdmVyKEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gbWVtYmVycykgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgUHJpbWl0aXZlQ29uc3RhbnRWYWx1ZSBnZXRQcmltaXRpdmVWYWx1ZShBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNyZWF0ZVByaW1pdGl2ZVZhbHVlKAogICAgICAgICAgQWJzdHJhY3RWYWx1ZSBvcmlnaW5hbFZhbHVlLCBQcmltaXRpdmVDb25zdGFudFZhbHVlIHZhbHVlKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzUHJpbWl0aXZlVmFsdWUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBnZXRBbGxvY2F0aW9uRWxlbWVudChBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBPYmplY3QgZ2V0QWxsb2NhdGlvbk5vZGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXRHZW5lcmFsaXphdGlvbihBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzU3BlY2lhbGl6YXRpb25PZigKICAgICAgICAgIEFic3RyYWN0VmFsdWUgc3BlY2lhbGl6YXRpb24sIEFic3RyYWN0VmFsdWUgZ2VuZXJhbGl6YXRpb24pID0+CiAgICAgIGZhbHNlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldERpY3Rpb25hcnlWYWx1ZUZvcktleShBYnN0cmFjdFZhbHVlIHZhbHVlLCBTdHJpbmcga2V5KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiVHJpdmlhbEFic3RyYWN0VmFsdWVEb21haW4uZ2V0RGljdGlvbmFyeVZhbHVlRm9yS2V5Iik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zRGljdGlvbmFyeUtleShBYnN0cmFjdFZhbHVlIHZhbHVlLCBTdHJpbmcga2V5KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiVHJpdmlhbEFic3RyYWN0VmFsdWVEb21haW4uY29udGFpbnNEaWN0aW9uYXJ5S2V5Iik7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNyZWF0ZURpY3Rpb25hcnlWYWx1ZSgKICAgICAgICAgIEFic3RyYWN0VmFsdWUgb3JpZ2luYWxWYWx1ZSwKICAgICAgICAgIE9iamVjdCBhbGxvY2F0aW9uTm9kZSwKICAgICAgICAgIE1lbWJlckVudGl0eSBhbGxvY2F0aW9uRWxlbWVudCwKICAgICAgICAgIEFic3RyYWN0VmFsdWUga2V5LAogICAgICAgICAgQWJzdHJhY3RWYWx1ZSB2YWx1ZSwKICAgICAgICAgIE1hcDxTdHJpbmcsIEFic3RyYWN0VmFsdWU+IG1hcHBpbmdzKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzRGljdGlvbmFyeShBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXRNYXBWYWx1ZVR5cGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLmdldE1hcFZhbHVlVHlwZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXRNYXBLZXlUeXBlKEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJUcml2aWFsQWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRNYXBLZXlUeXBlIik7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNyZWF0ZU1hcFZhbHVlKAogICAgICAgICAgQWJzdHJhY3RWYWx1ZSBvcmlnaW5hbFZhbHVlLAogICAgICAgICAgT2JqZWN0IGFsbG9jYXRpb25Ob2RlLAogICAgICAgICAgTWVtYmVyRW50aXR5IGFsbG9jYXRpb25FbGVtZW50LAogICAgICAgICAgQWJzdHJhY3RWYWx1ZSBrZXksCiAgICAgICAgICBBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzTWFwKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldFNldEVsZW1lbnRUeXBlKEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJUcml2aWFsQWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRTZXRFbGVtZW50VHlwZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVTZXRWYWx1ZSgKICAgICAgICAgIEFic3RyYWN0VmFsdWUgb3JpZ2luYWxWYWx1ZSwKICAgICAgICAgIE9iamVjdCBhbGxvY2F0aW9uTm9kZSwKICAgICAgICAgIE1lbWJlckVudGl0eSBhbGxvY2F0aW9uRWxlbWVudCwKICAgICAgICAgIEFic3RyYWN0VmFsdWUgZWxlbWVudFR5cGUpID0+CiAgICAgIGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNTZXQoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGludCBnZXRDb250YWluZXJMZW5ndGgoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXRDb250YWluZXJFbGVtZW50VHlwZShBYnN0cmFjdFZhbHVlIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiVHJpdmlhbEFic3RyYWN0VmFsdWVEb21haW4uZ2V0Q29udGFpbmVyRWxlbWVudFR5cGUiKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY3JlYXRlQ29udGFpbmVyVmFsdWUoCiAgICAgICAgICBBYnN0cmFjdFZhbHVlIG9yaWdpbmFsVmFsdWUsCiAgICAgICAgICBPYmplY3QgYWxsb2NhdGlvbk5vZGUsCiAgICAgICAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgICAgICBBYnN0cmFjdFZhbHVlIGVsZW1lbnRUeXBlLAogICAgICAgICAgaW50IGxlbmd0aCkgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnRhaW5lcihBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlQWJzdHJhY3RWYWx1ZUZvckNvbnN0YW50KENvbnN0YW50VmFsdWUgdmFsdWUpID0+CiAgICAgIGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0QWJzdHJhY3RWYWx1ZUZvck5hdGl2ZU1ldGhvZFBhcmFtZXRlclR5cGUoRGFydFR5cGUgdHlwZSkgPT4KICAgICAgbnVsbDsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGNvbnRhaW5zQWxsKEFic3RyYWN0VmFsdWUgYSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgYXJlRGlzam9pbnQoQWJzdHJhY3RWYWx1ZSBhLCBBYnN0cmFjdFZhbHVlIGIpID0+CiAgICAgIEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBpbnRlcnNlY3Rpb24oQWJzdHJhY3RWYWx1ZSBhLCBBYnN0cmFjdFZhbHVlIGIpID0+CiAgICAgIGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdW5pb25PZk1hbnkoSXRlcmFibGU8QWJzdHJhY3RWYWx1ZT4gdmFsdWVzKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHVuaW9uKEFic3RyYWN0VmFsdWUgYSwgQWJzdHJhY3RWYWx1ZSBiKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNQcmltaXRpdmVPck51bGwoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNTdHJpbmdPck51bGwoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNTdHJpbmcoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNCb29sZWFuT3JOdWxsKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzQm9vbGVhbihBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0RvdWJsZU9yTnVsbChBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0RvdWJsZShBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc051bWJlck9yTnVsbChBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc051bWJlcihBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0ludGVnZXJPck51bGwoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNQb3NpdGl2ZUludGVnZXJPck51bGwoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4KICAgICAgQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNQb3NpdGl2ZUludGVnZXIoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNVSW50MzEoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNVSW50MzIoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNJbnRlZ2VyKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzSW50ZXJjZXB0b3IoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNQcmltaXRpdmVTdHJpbmcoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNBcnJheShBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc011dGFibGVJbmRleGFibGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNNdXRhYmxlQXJyYXkoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNFeHRlbmRhYmxlQXJyYXkoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNGaXhlZEFycmF5KEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzSW5kZXhhYmxlUHJpbWl0aXZlKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzUHJpbWl0aXZlQXJyYXkoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNQcmltaXRpdmVCb29sZWFuKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzUHJpbWl0aXZlTnVtYmVyKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzUHJpbWl0aXZlKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzTnVsbChBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldEV4YWN0Q2xhc3MoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzRXhhY3RPck51bGwoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNFeGFjdChBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0VtcHR5KEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzSW5zdGFuY2VPZihBYnN0cmFjdFZhbHVlIHZhbHVlLCBDbGFzc0VudGl0eSBjbHMpID0+CiAgICAgIEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzSW5zdGFuY2VPZk9yTnVsbChBYnN0cmFjdFZhbHVlIHZhbHVlLCBDbGFzc0VudGl0eSBjbHMpID0+CiAgICAgIEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGNvbnRhaW5zT25seVR5cGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSwgQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBjb250YWluc1R5cGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSwgQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBBYnN0cmFjdEJvb2wuTWF5YmU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgaW5jbHVkZU51bGwoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBleGNsdWRlTnVsbChBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgY291bGRCZVR5cGVkQXJyYXkoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4gQWJzdHJhY3RCb29sLk1heWJlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNUeXBlZEFycmF5KEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IEFic3RyYWN0Qm9vbC5NYXliZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVOdWxsYWJsZVN1YnR5cGUoQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNyZWF0ZU5vbk51bGxTdWJ0eXBlKENsYXNzRW50aXR5IGNscykgPT4KICAgICAgY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVOb25OdWxsU3ViY2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNyZWF0ZU51bGxhYmxlRXhhY3QoQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNyZWF0ZU5vbk51bGxFeGFjdChDbGFzc0VudGl0eSBjbHMpID0+CiAgICAgIGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWVXaXRoUHJlY2lzaW9uIGNyZWF0ZUZyb21TdGF0aWNUeXBlKERhcnRUeXBlIHR5cGUsCiAgICAgICAgICBbQ2xhc3NSZWxhdGlvbiBjbGFzc1JlbGF0aW9uID0gQ2xhc3NSZWxhdGlvbi5zdWJ0eXBlXSkgPT4KICAgICAgY29uc3QgQWJzdHJhY3RWYWx1ZVdpdGhQcmVjaXNpb24oY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKSwgZmFsc2UpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBhc3luY1N0YXJTdHJlYW1UeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IGFzeW5jRnV0dXJlVHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBzeW5jU3Rhckl0ZXJhYmxlVHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBlbXB0eVR5cGUgPT4gY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXQgY29uc3RNYXBUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IGNvbnN0U2V0VHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBjb25zdExpc3RUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IHBvc2l0aXZlSW50VHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCB1aW50MzJUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IHVpbnQzMVR5cGUgPT4gY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXQgZml4ZWRMaXN0VHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBncm93YWJsZUxpc3RUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IG51bGxUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IG5vbk51bGxUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IG1hcFR5cGUgPT4gY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXQgc2V0VHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBsaXN0VHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBzdHJpbmdUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IG51bVR5cGUgPT4gY29uc3QgVHJpdmlhbEFic3RyYWN0VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXQgZG91YmxlVHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCBpbnRUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IGJvb2xUeXBlID0+IGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IGZ1bmN0aW9uVHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCB0eXBlVHlwZSA9PiBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZSgpOwp9CgpjbGFzcyBUcml2aWFsQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5IGltcGxlbWVudHMgQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5IHsKICBjb25zdCBUcml2aWFsQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5KCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWVEb21haW4gY3JlYXRlRG9tYWluKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGNvbnN0IFRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kgY3JlYXRlU2VsZWN0b3JTdHJhdGVneSgpIHsKICAgIHJldHVybiBjb25zdCBUcml2aWFsU2VsZWN0b3JTdHJhdGVneSgpOwogIH0KfQoKY2xhc3MgVHJpdmlhbFNlbGVjdG9yU3RyYXRlZ3kgaW1wbGVtZW50cyBTZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kgewogIGNvbnN0IFRyaXZpYWxTZWxlY3RvclN0cmF0ZWd5KCk7CgogIEBvdmVycmlkZQogIFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50cyBjcmVhdGVTZWxlY3RvckNvbnN0cmFpbnRzKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgT2JqZWN0IGluaXRpYWxDb25zdHJhaW50KSB7CiAgICByZXR1cm4gY29uc3QgVHJpdmlhbFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50cygpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhcHBsaWVkVW5uYW1lZChEeW5hbWljVXNlIGR5bmFtaWNVc2UsIE1lbWJlckVudGl0eSBtZW1iZXIsCiAgICAgIGNvdmFyaWFudCBKQ2xvc2VkV29ybGQgd29ybGQpIHsKICAgIHJldHVybiBkeW5hbWljVXNlLnNlbGVjdG9yLmFwcGxpZXNVbm5hbWVkKG1lbWJlcik7CiAgfQp9CgpjbGFzcyBUcml2aWFsVW5pdmVyc2VTZWxlY3RvckNvbnN0cmFpbnRzCiAgICBpbXBsZW1lbnRzIFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50cyB7CiAgY29uc3QgVHJpdmlhbFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50cygpOwoKICBAb3ZlcnJpZGUKICBib29sIGFkZFJlY2VpdmVyQ29uc3RyYWludChPYmplY3QgY29uc3RyYWludCkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgbmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZyhTZWxlY3RvciBzZWxlY3RvciwgV29ybGQgd29ybGQpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgY2FuSGl0KE1lbWJlckVudGl0eSBlbGVtZW50LCBOYW1lIG5hbWUsIFdvcmxkIHdvcmxkKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnVHJpdmlhbFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50czokaGFzaENvZGUnOwp9CoHmAE5OPAFOJCEvIS4kKR8YJQE2IAEMHAIBQiYBDEEBDEsBDEYkAQw1AQxAGgEMQBoBDEkBDFAMAQxFGgEMSRoBDCo4GgEMIkUaAQxDJAEMSQEMJkgkAQw3AQxCAQw5AQw6JAEMG0kNAQxMIEAEAQxAID0EAQwnJyEqHR8yJAEMMwEMN04EAQw1TAQBDCAnISodIiQBDCwBDDlQBAEMICchKigkAQwsAQw3AQw/ID8EAQwmJyEqJRkkAQwyAQxIJAEMTwwBDEMBDEAaAQxCJAEMPyQBDDskAQxNAQxKAQxEAQxLAQxFAQxKAQxEAQxKAQxEAQxLAQw/GgEMTQEMRAEMRAEMRQEMSQEMTQEMQwEMTgEMSgEMTQEMSAEMUAEMTAEMTgEMTQEMRwEMQgEMOgEMSQEMQwEMQwEMRRoBDEsaAQxJGgEMRRoBDDQkAQw0JAEMTQEMSAEMOiQBDDkkAQw6JAEMOCQBDDckAQxBRE0BDEkBDEUBDEoBDD8BDEIBDEIBDEMBDEUBDEABDEABDEMBDEYBDD4BDEEBDD0BDD0BDD4BDEABDD0BDEABDD0BDD4BDEIBDD4CAUYoAQw/LwQBDDksBAIBRyMBDDk1NwQBDEImNwQCASktLgEMOgEMSgEMRQEMRwIBKnBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3RyaXZpYWwuZGFydDtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci90eXBlbWFza3MvbWFza3MuZGFydMAAdDQvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBtYXNrczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi8uLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9lbGVtZW50cy9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9pci9zdGF0aWNfdHlwZS5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vLi4vdW5pdmVyc2UvY2xhc3NfaGllcmFyY2h5LmRhcnQnOwppbXBvcnQgJy4uLy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vLi4vdW5pdmVyc2UvdXNlLmRhcnQnIHNob3cgRHluYW1pY1VzZTsKaW1wb3J0ICcuLi8uLi91bml2ZXJzZS93b3JsZF9idWlsZGVyLmRhcnQnCiAgICBzaG93IFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50cywgU2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5OwppbXBvcnQgJy4uLy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICcuLi8uLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICcuLi9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vdHlwZV9ncmFwaF9pbmZlcnJlci5kYXJ0JyBzaG93IFR5cGVHcmFwaEluZmVycmVyOwppbXBvcnQgJ2NvbnN0YW50cy5kYXJ0JzsKCnBhcnQgJ2NvbnRhaW5lcl90eXBlX21hc2suZGFydCc7CnBhcnQgJ2RpY3Rpb25hcnlfdHlwZV9tYXNrLmRhcnQnOwpwYXJ0ICdmbGF0X3R5cGVfbWFzay5kYXJ0JzsKcGFydCAnZm9yd2FyZGluZ190eXBlX21hc2suZGFydCc7CnBhcnQgJ21hcF90eXBlX21hc2suZGFydCc7CnBhcnQgJ3NldF90eXBlX21hc2suZGFydCc7CnBhcnQgJ3R5cGVfbWFzay5kYXJ0JzsKcGFydCAndW5pb25fdHlwZV9tYXNrLmRhcnQnOwpwYXJ0ICd2YWx1ZV90eXBlX21hc2suZGFydCc7CgpjbGFzcyBDb21tb25NYXNrcyBpbXBsZW1lbnRzIEFic3RyYWN0VmFsdWVEb21haW4gewogIC8vIFRPRE8oc2lnbXVuZCk6IG9uY2Ugd2Ugc3BsaXQgb3V0IHRoZSBiYWNrZW5kIGNvbW1vbiBlbGVtZW50cywgZGVwZW5kCiAgLy8gZGlyZWN0bHkgb24gdGhvc2UgaW5zdGVhZC4KICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwoKICBDb21tb25NYXNrcyh0aGlzLl9jbG9zZWRXb3JsZCk7CgogIENvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50cyA9PiBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHM7CgogIFR5cGVNYXNrIF9keW5hbWljVHlwZTsKICBUeXBlTWFzayBfbm9uTnVsbFR5cGU7CiAgVHlwZU1hc2sgX251bGxUeXBlOwogIFR5cGVNYXNrIF9pbnRUeXBlOwogIFR5cGVNYXNrIF91aW50MzJUeXBlOwogIFR5cGVNYXNrIF91aW50MzFUeXBlOwogIFR5cGVNYXNrIF9wb3NpdGl2ZUludFR5cGU7CiAgVHlwZU1hc2sgX2RvdWJsZVR5cGU7CiAgVHlwZU1hc2sgX251bVR5cGU7CiAgVHlwZU1hc2sgX2Jvb2xUeXBlOwogIFR5cGVNYXNrIF9mdW5jdGlvblR5cGU7CiAgVHlwZU1hc2sgX2xpc3RUeXBlOwogIFR5cGVNYXNrIF9jb25zdExpc3RUeXBlOwogIFR5cGVNYXNrIF9maXhlZExpc3RUeXBlOwogIFR5cGVNYXNrIF9ncm93YWJsZUxpc3RUeXBlOwogIFR5cGVNYXNrIF9zZXRUeXBlOwogIFR5cGVNYXNrIF9jb25zdFNldFR5cGU7CiAgVHlwZU1hc2sgX21hcFR5cGU7CiAgVHlwZU1hc2sgX2NvbnN0TWFwVHlwZTsKICBUeXBlTWFzayBfc3RyaW5nVHlwZTsKICBUeXBlTWFzayBfdHlwZVR5cGU7CiAgVHlwZU1hc2sgX3N5bmNTdGFySXRlcmFibGVUeXBlOwogIFR5cGVNYXNrIF9hc3luY0Z1dHVyZVR5cGU7CiAgVHlwZU1hc2sgX2FzeW5jU3RhclN0cmVhbVR5cGU7CiAgVHlwZU1hc2sgX2luZGV4YWJsZVByaW1pdGl2ZVR5cGU7CiAgVHlwZU1hc2sgX3JlYWRhYmxlQXJyYXlUeXBlOwogIFR5cGVNYXNrIF9tdXRhYmxlQXJyYXlUeXBlOwogIFR5cGVNYXNrIF91bm1vZGlmaWFibGVBcnJheVR5cGU7CiAgVHlwZU1hc2sgX2ludGVyY2VwdG9yVHlwZTsKCiAgLy8vIENhY2hlIG9mIFtGbGF0VHlwZU1hc2tdcyBncm91cGVkIGJ5IHRoZSA4IHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUKICAvLy8gYEZsYXRUeXBlTWFzay5mbGFnc2AgcHJvcGVydHkuCiAgZmluYWwgTGlzdDxNYXA8Q2xhc3NFbnRpdHksIFR5cGVNYXNrPj4gX2Nhbm9uaWNhbGl6ZWRUeXBlTWFza3MgPQogICAgICBuZXcgTGlzdDxNYXA8Q2xhc3NFbnRpdHksIFR5cGVNYXNrPj4uZmlsbGVkKDgsIG51bGwpOwoKICAvLy8gUmV0dXJuIHRoZSBjYWNoZWQgbWFzayBmb3IgW2Jhc2VdIHdpdGggdGhlIGdpdmVuIGZsYWdzLCBvcgogIC8vLyBjYWxscyBbY3JlYXRlTWFza10gdG8gY3JlYXRlIHRoZSBtYXNrIGFuZCBjYWNoZSBpdC4KICBUeXBlTWFzayBnZXRDYWNoZWRNYXNrKENsYXNzRW50aXR5IGJhc2UsIGludCBmbGFncywgVHlwZU1hc2sgY3JlYXRlTWFzaygpKSB7CiAgICBNYXA8Q2xhc3NFbnRpdHksIFR5cGVNYXNrPiBjYWNoZWRNYXNrcyA9CiAgICAgICAgX2Nhbm9uaWNhbGl6ZWRUeXBlTWFza3NbZmxhZ3NdID8/PSA8Q2xhc3NFbnRpdHksIFR5cGVNYXNrPnt9OwogICAgcmV0dXJuIGNhY2hlZE1hc2tzLnB1dElmQWJzZW50KGJhc2UsIGNyZWF0ZU1hc2spOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IGR5bmFtaWNUeXBlID0+IF9keW5hbWljVHlwZSA/Pz0gbmV3IFR5cGVNYXNrLnN1YmNsYXNzKAogICAgICBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MsIF9jbG9zZWRXb3JsZCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGdldCBub25OdWxsVHlwZSA9PiBfbm9uTnVsbFR5cGUgPz89IG5ldyBUeXBlTWFzay5ub25OdWxsU3ViY2xhc3MoCiAgICAgIF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IGludFR5cGUgPT4gX2ludFR5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsU3ViY2xhc3MoY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IHVpbnQzMlR5cGUgPT4gX3VpbnQzMlR5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsU3ViY2xhc3MoY29tbW9uRWxlbWVudHMuanNVSW50MzJDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IHVpbnQzMVR5cGUgPT4gX3VpbnQzMVR5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsRXhhY3QoY29tbW9uRWxlbWVudHMuanNVSW50MzFDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IHBvc2l0aXZlSW50VHlwZSA9PgogICAgICBfcG9zaXRpdmVJbnRUeXBlID8/PSBuZXcgVHlwZU1hc2subm9uTnVsbFN1YmNsYXNzKAogICAgICAgICAgY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBnZXQgZG91YmxlVHlwZSA9PiBfZG91YmxlVHlwZSA/Pz0KICAgICAgbmV3IFR5cGVNYXNrLm5vbk51bGxFeGFjdChjb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBnZXQgbnVtVHlwZSA9PiBfbnVtVHlwZSA/Pz0KICAgICAgbmV3IFR5cGVNYXNrLm5vbk51bGxTdWJjbGFzcyhjb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBnZXQgYm9vbFR5cGUgPT4gX2Jvb2xUeXBlID8/PQogICAgICBuZXcgVHlwZU1hc2subm9uTnVsbEV4YWN0KGNvbW1vbkVsZW1lbnRzLmpzQm9vbENsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBnZXQgZnVuY3Rpb25UeXBlID0+IF9mdW5jdGlvblR5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsU3VidHlwZShjb21tb25FbGVtZW50cy5mdW5jdGlvbkNsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBnZXQgbGlzdFR5cGUgPT4gX2xpc3RUeXBlID8/PQogICAgICBuZXcgVHlwZU1hc2subm9uTnVsbEV4YWN0KGNvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IGNvbnN0TGlzdFR5cGUgPT4gX2NvbnN0TGlzdFR5cGUgPz89IG5ldyBUeXBlTWFzay5ub25OdWxsRXhhY3QoCiAgICAgIGNvbW1vbkVsZW1lbnRzLmpzVW5tb2RpZmlhYmxlQXJyYXlDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IGZpeGVkTGlzdFR5cGUgPT4gX2ZpeGVkTGlzdFR5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsRXhhY3QoY29tbW9uRWxlbWVudHMuanNGaXhlZEFycmF5Q2xhc3MsIF9jbG9zZWRXb3JsZCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGdldCBncm93YWJsZUxpc3RUeXBlID0+CiAgICAgIF9ncm93YWJsZUxpc3RUeXBlID8/PSBuZXcgVHlwZU1hc2subm9uTnVsbEV4YWN0KAogICAgICAgICAgY29tbW9uRWxlbWVudHMuanNFeHRlbmRhYmxlQXJyYXlDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IHNldFR5cGUgPT4gX3NldFR5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsU3VidHlwZShjb21tb25FbGVtZW50cy5zZXRMaXRlcmFsQ2xhc3MsIF9jbG9zZWRXb3JsZCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGdldCBjb25zdFNldFR5cGUgPT4gX2NvbnN0U2V0VHlwZSA/Pz0gbmV3IFR5cGVNYXNrLm5vbk51bGxTdWJ0eXBlKAogICAgICBjb21tb25FbGVtZW50cy5jb25zdFNldExpdGVyYWxDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IG1hcFR5cGUgPT4gX21hcFR5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsU3VidHlwZShjb21tb25FbGVtZW50cy5tYXBMaXRlcmFsQ2xhc3MsIF9jbG9zZWRXb3JsZCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGdldCBjb25zdE1hcFR5cGUgPT4gX2NvbnN0TWFwVHlwZSA/Pz0gbmV3IFR5cGVNYXNrLm5vbk51bGxTdWJ0eXBlKAogICAgICBjb21tb25FbGVtZW50cy5jb25zdE1hcExpdGVyYWxDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IHN0cmluZ1R5cGUgPT4gX3N0cmluZ1R5cGUgPz89CiAgICAgIG5ldyBUeXBlTWFzay5ub25OdWxsRXhhY3QoY29tbW9uRWxlbWVudHMuanNTdHJpbmdDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgZ2V0IHR5cGVUeXBlID0+IF90eXBlVHlwZSA/Pz0KICAgICAgbmV3IFR5cGVNYXNrLm5vbk51bGxFeGFjdChjb21tb25FbGVtZW50cy50eXBlTGl0ZXJhbENsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBnZXQgc3luY1N0YXJJdGVyYWJsZVR5cGUgPT4gX3N5bmNTdGFySXRlcmFibGVUeXBlID8/PQogICAgICBuZXcgVHlwZU1hc2subm9uTnVsbEV4YWN0KGNvbW1vbkVsZW1lbnRzLnN5bmNTdGFySXRlcmFibGUsIF9jbG9zZWRXb3JsZCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGdldCBhc3luY0Z1dHVyZVR5cGUgPT4KICAgICAgX2FzeW5jRnV0dXJlVHlwZSA/Pz0gbmV3IFR5cGVNYXNrLm5vbk51bGxFeGFjdCgKICAgICAgICAgIGNvbW1vbkVsZW1lbnRzLmZ1dHVyZUltcGxlbWVudGF0aW9uLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBnZXQgYXN5bmNTdGFyU3RyZWFtVHlwZSA9PiBfYXN5bmNTdGFyU3RyZWFtVHlwZSA/Pz0KICAgICAgbmV3IFR5cGVNYXNrLm5vbk51bGxFeGFjdChjb21tb25FbGVtZW50cy5jb250cm9sbGVyU3RyZWFtLCBfY2xvc2VkV29ybGQpOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBc3NlcnQgdGhhdCB0aGUgbnVsbCB0eXBlIGhhcyBiZWVuIHJlc29sdmVkLgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGdldCBudWxsVHlwZSA9PiBfbnVsbFR5cGUgPz89IGNvbnN0IFR5cGVNYXNrLmVtcHR5KCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGdldCBlbXB0eVR5cGUgPT4gY29uc3QgVHlwZU1hc2subm9uTnVsbEVtcHR5KCk7CgogIFR5cGVNYXNrIGdldCBpbmRleGFibGVQcmltaXRpdmVUeXBlID0+CiAgICAgIF9pbmRleGFibGVQcmltaXRpdmVUeXBlID8/PSBuZXcgVHlwZU1hc2subm9uTnVsbFN1YnR5cGUoCiAgICAgICAgICBjb21tb25FbGVtZW50cy5qc0luZGV4YWJsZUNsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBUeXBlTWFzayBnZXQgcmVhZGFibGVBcnJheVR5cGUgPT4gX3JlYWRhYmxlQXJyYXlUeXBlID8/PQogICAgICBuZXcgVHlwZU1hc2subm9uTnVsbFN1YmNsYXNzKGNvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgVHlwZU1hc2sgZ2V0IG11dGFibGVBcnJheVR5cGUgPT4KICAgICAgX211dGFibGVBcnJheVR5cGUgPz89IG5ldyBUeXBlTWFzay5ub25OdWxsU3ViY2xhc3MoCiAgICAgICAgICBjb21tb25FbGVtZW50cy5qc011dGFibGVBcnJheUNsYXNzLCBfY2xvc2VkV29ybGQpOwoKICBUeXBlTWFzayBnZXQgdW5tb2RpZmlhYmxlQXJyYXlUeXBlID0+CiAgICAgIF91bm1vZGlmaWFibGVBcnJheVR5cGUgPz89IG5ldyBUeXBlTWFzay5ub25OdWxsRXhhY3QoCiAgICAgICAgICBjb21tb25FbGVtZW50cy5qc1VubW9kaWZpYWJsZUFycmF5Q2xhc3MsIF9jbG9zZWRXb3JsZCk7CgogIFR5cGVNYXNrIGdldCBpbnRlcmNlcHRvclR5cGUgPT4KICAgICAgX2ludGVyY2VwdG9yVHlwZSA/Pz0gbmV3IFR5cGVNYXNrLm5vbk51bGxTdWJjbGFzcygKICAgICAgICAgIGNvbW1vbkVsZW1lbnRzLmpzSW50ZXJjZXB0b3JDbGFzcywgX2Nsb3NlZFdvcmxkKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzVHlwZWRBcnJheShUeXBlTWFzayBtYXNrKSB7CiAgICAvLyBKdXN0IGNoZWNraW5nIGZvciBgVHlwZWREYXRhYCBpcyBub3Qgc3VmZmljaWVudCwgYXMgaXQgaXMgYW4gYWJzdHJhY3QKICAgIC8vIGNsYXNzIGFueSB1c2VyLWRlZmluZWQgY2xhc3MgY2FuIGltcGxlbWVudC4gU28gd2UgYWxzbyBjaGVjayBmb3IgdGhlCiAgICAvLyBpbnRlcmZhY2UgYEphdmFTY3JpcHRJbmRleGluZ0JlaGF2aW9yYC4KICAgIENsYXNzRW50aXR5IHR5cGVkRGF0YUNsYXNzID0gX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLnR5cGVkRGF0YUNsYXNzOwogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSh0eXBlZERhdGFDbGFzcyAhPSBudWxsICYmCiAgICAgICAgX2Nsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzSW5zdGFudGlhdGVkKHR5cGVkRGF0YUNsYXNzKSAmJgogICAgICAgIG1hc2suc2F0aXNmaWVzKHR5cGVkRGF0YUNsYXNzLCBfY2xvc2VkV29ybGQpICYmCiAgICAgICAgbWFzay5zYXRpc2ZpZXMoX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzSW5kZXhpbmdCZWhhdmlvckludGVyZmFjZSwKICAgICAgICAgICAgX2Nsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgY291bGRCZVR5cGVkQXJyYXkoVHlwZU1hc2sgbWFzaykgewogICAgYm9vbCBpbnRlcnNlY3RzKFR5cGVNYXNrIHR5cGUxLCBUeXBlTWFzayB0eXBlMikgPT4KICAgICAgICAhdHlwZTEuaW50ZXJzZWN0aW9uKHR5cGUyLCBfY2xvc2VkV29ybGQpLmlzRW1wdHk7CiAgICAvLyBUT0RPKGhlcmh1dCk6IE1heWJlIGNhY2hlIHRoZSBUeXBlTWFzayBmb3IgdHlwZWREYXRhQ2xhc3MgYW5kCiAgICAvLyAgICAgICAgICAgICAgIGpzSW5kZXhpbmdCZWhhdmlvdXJJbnRlcmZhY2UuCiAgICBDbGFzc0VudGl0eSB0eXBlZERhdGFDbGFzcyA9IF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy50eXBlZERhdGFDbGFzczsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wubWF5YmVPckZhbHNlKHR5cGVkRGF0YUNsYXNzICE9IG51bGwgJiYKICAgICAgICBfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQodHlwZWREYXRhQ2xhc3MpICYmCiAgICAgICAgaW50ZXJzZWN0cyhtYXNrLCBuZXcgVHlwZU1hc2suc3VidHlwZSh0eXBlZERhdGFDbGFzcywgX2Nsb3NlZFdvcmxkKSkgJiYKICAgICAgICBpbnRlcnNlY3RzKAogICAgICAgICAgICBtYXNrLAogICAgICAgICAgICBuZXcgVHlwZU1hc2suc3VidHlwZSgKICAgICAgICAgICAgICAgIF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5qc0luZGV4aW5nQmVoYXZpb3JJbnRlcmZhY2UsCiAgICAgICAgICAgICAgICBfY2xvc2VkV29ybGQpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBjcmVhdGVOb25OdWxsRXhhY3QoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gbmV3IFR5cGVNYXNrLm5vbk51bGxFeGFjdChjbHMsIF9jbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBjcmVhdGVOdWxsYWJsZUV4YWN0KENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIG5ldyBUeXBlTWFzay5leGFjdChjbHMsIF9jbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBjcmVhdGVOb25OdWxsU3ViY2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gbmV3IFR5cGVNYXNrLm5vbk51bGxTdWJjbGFzcyhjbHMsIF9jbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBjcmVhdGVOb25OdWxsU3VidHlwZShDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBuZXcgVHlwZU1hc2subm9uTnVsbFN1YnR5cGUoY2xzLCBfY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgY3JlYXRlTnVsbGFibGVTdWJ0eXBlKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIG5ldyBUeXBlTWFzay5zdWJ0eXBlKGNscywgX2Nsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWVXaXRoUHJlY2lzaW9uIGNyZWF0ZUZyb21TdGF0aWNUeXBlKERhcnRUeXBlIHR5cGUsCiAgICAgIFtDbGFzc1JlbGF0aW9uIGNsYXNzUmVsYXRpb24gPSBDbGFzc1JlbGF0aW9uLnN1YnR5cGVdKSB7CiAgICBib29sIGlzUHJlY2lzZSA9IHRydWU7CiAgICB3aGlsZSAodHlwZSBpcyBUeXBlVmFyaWFibGVUeXBlKSB7CiAgICAgIFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlID0gdHlwZTsKICAgICAgdHlwZSA9IF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQKICAgICAgICAgIC5nZXRUeXBlVmFyaWFibGVCb3VuZCh0eXBlVmFyaWFibGUuZWxlbWVudCk7CiAgICAgIGNsYXNzUmVsYXRpb24gPSBDbGFzc1JlbGF0aW9uLnN1YnR5cGU7CiAgICAgIGlzUHJlY2lzZSA9IGZhbHNlOwogICAgfQogICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBpZiAoaXNQcmVjaXNlKSB7CiAgICAgICAgLy8gVE9ETyhzcmEpOiBDb3VsZCBiZSBwcmVjaXNlIGlmIGluc3RhbnRpYXRlZC10by1ib3VuZHMuCiAgICAgICAgZm9yIChEYXJ0VHlwZSBhcmd1bWVudCBpbiB0eXBlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgICAgIGlmIChhcmd1bWVudCBpcyBEeW5hbWljVHlwZSkgY29udGludWU7CiAgICAgICAgICBpc1ByZWNpc2UgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3dpdGNoIChjbGFzc1JlbGF0aW9uKSB7CiAgICAgICAgY2FzZSBDbGFzc1JlbGF0aW9uLmV4YWN0OgogICAgICAgICAgcmV0dXJuIEFic3RyYWN0VmFsdWVXaXRoUHJlY2lzaW9uKAogICAgICAgICAgICAgIFR5cGVNYXNrLmV4YWN0KHR5cGUuZWxlbWVudCwgX2Nsb3NlZFdvcmxkKSwgaXNQcmVjaXNlKTsKICAgICAgICBjYXNlIENsYXNzUmVsYXRpb24udGhpc0V4cHJlc3Npb246CiAgICAgICAgICBpZiAoIV9jbG9zZWRXb3JsZC5pc1VzZWRBc01peGluKHR5cGUuZWxlbWVudCkpIHsKICAgICAgICAgICAgcmV0dXJuIEFic3RyYWN0VmFsdWVXaXRoUHJlY2lzaW9uKAogICAgICAgICAgICAgICAgVHlwZU1hc2suc3ViY2xhc3ModHlwZS5lbGVtZW50LCBfY2xvc2VkV29ybGQpLCBpc1ByZWNpc2UpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDbGFzc1JlbGF0aW9uLnN1YnR5cGU6CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICByZXR1cm4gQWJzdHJhY3RWYWx1ZVdpdGhQcmVjaXNpb24oCiAgICAgICAgICBUeXBlTWFzay5zdWJ0eXBlKHR5cGUuZWxlbWVudCwgX2Nsb3NlZFdvcmxkKSwgaXNQcmVjaXNlKTsKICAgIH0gZWxzZSBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgcmV0dXJuIEFic3RyYWN0VmFsdWVXaXRoUHJlY2lzaW9uKAogICAgICAgICAgVHlwZU1hc2suc3VidHlwZShjb21tb25FbGVtZW50cy5mdW5jdGlvbkNsYXNzLCBfY2xvc2VkV29ybGQpLCBmYWxzZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gQWJzdHJhY3RWYWx1ZVdpdGhQcmVjaXNpb24oZHluYW1pY1R5cGUsIGZhbHNlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGV4Y2x1ZGVOdWxsKFR5cGVNYXNrIG1hc2spID0+IG1hc2subm9uTnVsbGFibGUoKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgaW5jbHVkZU51bGwoVHlwZU1hc2sgbWFzaykgPT4gbWFzay5udWxsYWJsZSgpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgY29udGFpbnNUeXBlKFR5cGVNYXNrIHR5cGVNYXNrLCBDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUoX2NvbnRhaW5zVHlwZSh0eXBlTWFzaywgY2xzKSk7CiAgfQoKICBib29sIF9jb250YWluc1R5cGUoVHlwZU1hc2sgdHlwZU1hc2ssIENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIF9jbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc0luc3RhbnRpYXRlZChjbHMpICYmCiAgICAgICAgdHlwZU1hc2suY29udGFpbnMoY2xzLCBfY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGNvbnRhaW5zT25seVR5cGUoVHlwZU1hc2sgdHlwZU1hc2ssIENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZShfY29udGFpbnNPbmx5VHlwZSh0eXBlTWFzaywgY2xzKSk7CiAgfQoKICBib29sIF9jb250YWluc09ubHlUeXBlKFR5cGVNYXNrIHR5cGVNYXNrLCBDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQoY2xzKSAmJgogICAgICAgIHR5cGVNYXNrLmNvbnRhaW5zT25seShjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzSW5zdGFuY2VPZk9yTnVsbChUeXBlTWFzayB0eXBlTWFzaywgQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUoX2lzSW5zdGFuY2VPZk9yTnVsbCh0eXBlTWFzaywgY2xzKSk7CgogIGJvb2wgX2lzSW5zdGFuY2VPZk9yTnVsbChUeXBlTWFzayB0eXBlTWFzaywgQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gX2Nsb3NlZFdvcmxkLmlzSW1wbGVtZW50ZWQoY2xzKSAmJgogICAgICAgIHR5cGVNYXNrLnNhdGlzZmllcyhjbHMsIF9jbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNJbnN0YW5jZU9mKAogICAgICBjb3ZhcmlhbnQgVHlwZU1hc2sgZXhwcmVzc2lvbk1hc2ssIENsYXNzRW50aXR5IGNscykgewogICAgQWJzdHJhY3RWYWx1ZSB0eXBlTWFzayA9IChjbHMgPT0gY29tbW9uRWxlbWVudHMubnVsbENsYXNzKQogICAgICAgID8gY3JlYXRlTnVsbGFibGVTdWJ0eXBlKGNscykKICAgICAgICA6IGNyZWF0ZU5vbk51bGxTdWJ0eXBlKGNscyk7CiAgICBpZiAoZXhwcmVzc2lvbk1hc2sudW5pb24odHlwZU1hc2ssIF9jbG9zZWRXb3JsZCkgPT0gdHlwZU1hc2spIHsKICAgICAgcmV0dXJuIEFic3RyYWN0Qm9vbC5UcnVlOwogICAgfSBlbHNlIGlmIChleHByZXNzaW9uTWFzay5pc0Rpc2pvaW50KHR5cGVNYXNrLCBfY2xvc2VkV29ybGQpKSB7CiAgICAgIHJldHVybiBBYnN0cmFjdEJvb2wuRmFsc2U7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gQWJzdHJhY3RCb29sLk1heWJlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzRW1wdHkoVHlwZU1hc2sgdmFsdWUpID0+CiAgICAgIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSh2YWx1ZS5pc0VtcHR5KTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzRXhhY3QoVHlwZU1hc2sgdmFsdWUpID0+CiAgICAgIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSh2YWx1ZS5pc0V4YWN0ICYmICF2YWx1ZS5pc051bGxhYmxlKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzRXhhY3RPck51bGwoVHlwZU1hc2sgdmFsdWUpID0+CiAgICAgIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSh2YWx1ZS5pc0V4YWN0IHx8IF9pc051bGwodmFsdWUpKTsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NFbnRpdHkgZ2V0RXhhY3RDbGFzcyhUeXBlTWFzayBtYXNrKSB7CiAgICByZXR1cm4gbWFzay5zaW5nbGVDbGFzcyhfY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1ByaW1pdGl2ZVZhbHVlKFR5cGVNYXNrIHZhbHVlKSA9PiB2YWx1ZS5pc1ZhbHVlOwoKICBAb3ZlcnJpZGUKICBQcmltaXRpdmVDb25zdGFudFZhbHVlIGdldFByaW1pdGl2ZVZhbHVlKFR5cGVNYXNrIG1hc2spIHsKICAgIGlmIChtYXNrLmlzVmFsdWUpIHsKICAgICAgVmFsdWVUeXBlTWFzayB2YWx1ZU1hc2sgPSBtYXNrOwogICAgICByZXR1cm4gdmFsdWVNYXNrLnZhbHVlOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNyZWF0ZVByaW1pdGl2ZVZhbHVlKAogICAgICBjb3ZhcmlhbnQgVHlwZU1hc2sgb3JpZ2luYWxWYWx1ZSwgUHJpbWl0aXZlQ29uc3RhbnRWYWx1ZSB2YWx1ZSkgewogICAgcmV0dXJuIG5ldyBWYWx1ZVR5cGVNYXNrKG9yaWdpbmFsVmFsdWUsIHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc051bGwoVHlwZU1hc2sgdmFsdWUpIHsKICAgIGlmICh2YWx1ZS5pc051bGwpIHsKICAgICAgcmV0dXJuIEFic3RyYWN0Qm9vbC5UcnVlOwogICAgfSBlbHNlIGlmICh2YWx1ZS5pc051bGxhYmxlKSB7CiAgICAgIHJldHVybiBBYnN0cmFjdEJvb2wuTWF5YmU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gQWJzdHJhY3RCb29sLkZhbHNlOwogICAgfQogIH0KCiAgYm9vbCBfaXNOdWxsKFR5cGVNYXNrIHZhbHVlKSA9PiB2YWx1ZS5pc051bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZShUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC5tYXliZU9yRmFsc2UoX2NhbkJlUHJpbWl0aXZlTnVtYmVyKHZhbHVlKSB8fAogICAgICAgIF9jYW5CZVByaW1pdGl2ZUFycmF5KHZhbHVlKSB8fAogICAgICAgIF9jYW5CZVByaW1pdGl2ZUJvb2xlYW4odmFsdWUpIHx8CiAgICAgICAgX2NhbkJlUHJpbWl0aXZlU3RyaW5nKHZhbHVlKSB8fAogICAgICAgIF9pc051bGwodmFsdWUpKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZU51bWJlcihUeXBlTWFzayB2YWx1ZSkgPT4KICAgICAgQWJzdHJhY3RCb29sLm1heWJlT3JGYWxzZShfY2FuQmVQcmltaXRpdmVOdW1iZXIodmFsdWUpKTsKCiAgYm9vbCBfY2FuQmVQcmltaXRpdmVOdW1iZXIoVHlwZU1hc2sgdmFsdWUpIHsKICAgIC8vIFRPRE8oc3JhKTogSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHRlc3Qgb25seSBqc0RvdWJsZUNsYXNzIGFuZAogICAgLy8ganNVSW50MzFDbGFzcywgc2luY2UgYWxsIG90aGVycyBhcmUgc3VwZXJjbGFzc2VzIG9mIHRoZXNlIHR3by4KICAgIHJldHVybiBfY29udGFpbnNUeXBlKHZhbHVlLCBjb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzKSB8fAogICAgICAgIF9jb250YWluc1R5cGUodmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzSW50Q2xhc3MpIHx8CiAgICAgICAgX2NvbnRhaW5zVHlwZSh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzKSB8fAogICAgICAgIF9jb250YWluc1R5cGUodmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzVUludDMyQ2xhc3MpIHx8CiAgICAgICAgX2NvbnRhaW5zVHlwZSh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNVSW50MzFDbGFzcykgfHwKICAgICAgICBfY29udGFpbnNUeXBlKHZhbHVlLCBjb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZUJvb2xlYW4oVHlwZU1hc2sgdmFsdWUpID0+CiAgICAgIEFic3RyYWN0Qm9vbC5tYXliZU9yRmFsc2UoX2NhbkJlUHJpbWl0aXZlQm9vbGVhbih2YWx1ZSkpOwoKICBib29sIF9jYW5CZVByaW1pdGl2ZUJvb2xlYW4oVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBfY29udGFpbnNUeXBlKHZhbHVlLCBjb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNQcmltaXRpdmVBcnJheShUeXBlTWFzayB2YWx1ZSkgPT4KICAgICAgQWJzdHJhY3RCb29sLm1heWJlT3JGYWxzZShfY2FuQmVQcmltaXRpdmVBcnJheSh2YWx1ZSkpOwoKICBib29sIF9jYW5CZVByaW1pdGl2ZUFycmF5KFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gX2NvbnRhaW5zVHlwZSh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzKSB8fAogICAgICAgIF9jb250YWluc1R5cGUodmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzRml4ZWRBcnJheUNsYXNzKSB8fAogICAgICAgIF9jb250YWluc1R5cGUodmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzRXh0ZW5kYWJsZUFycmF5Q2xhc3MpIHx8CiAgICAgICAgX2NvbnRhaW5zVHlwZSh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNVbm1vZGlmaWFibGVBcnJheUNsYXNzKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0luZGV4YWJsZVByaW1pdGl2ZShUeXBlTWFzayB2YWx1ZSkgPT4KICAgICAgQWJzdHJhY3RCb29sLnRydWVPck1heWJlKF9pc0luZGV4YWJsZVByaW1pdGl2ZSh2YWx1ZSkpOwoKICBib29sIF9pc0luZGV4YWJsZVByaW1pdGl2ZShUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlLmNvbnRhaW5zT25seVN0cmluZyhfY2xvc2VkV29ybGQpIHx8CiAgICAgICAgX2lzSW5zdGFuY2VPZk9yTnVsbCh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNJbmRleGFibGVDbGFzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNGaXhlZEFycmF5KFR5cGVNYXNrIHZhbHVlKSB7CiAgICAvLyBUT0RPKHNyYSk6IFJlY29nbml6ZSB0aGUgdW5pb24gb2YgdGhlc2UgdHlwZXMgYXMgd2VsbC4KICAgIHJldHVybiBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUoCiAgICAgICAgX2NvbnRhaW5zT25seVR5cGUodmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzRml4ZWRBcnJheUNsYXNzKSB8fAogICAgICAgICAgICBfY29udGFpbnNPbmx5VHlwZSh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNVbm1vZGlmaWFibGVBcnJheUNsYXNzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNFeHRlbmRhYmxlQXJyYXkoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUoCiAgICAgICAgX2NvbnRhaW5zT25seVR5cGUodmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzRXh0ZW5kYWJsZUFycmF5Q2xhc3MpKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc011dGFibGVBcnJheShUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSgKICAgICAgICBfaXNJbnN0YW5jZU9mT3JOdWxsKHZhbHVlLCBjb21tb25FbGVtZW50cy5qc011dGFibGVBcnJheUNsYXNzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNNdXRhYmxlSW5kZXhhYmxlKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLnRydWVPck1heWJlKAogICAgICAgIF9pc0luc3RhbmNlT2ZPck51bGwodmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzTXV0YWJsZUluZGV4YWJsZUNsYXNzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNBcnJheShUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSgKICAgICAgICBfaXNJbnN0YW5jZU9mT3JOdWxsKHZhbHVlLCBjb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MpKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZVN0cmluZyhUeXBlTWFzayB2YWx1ZSkgPT4KICAgICAgQWJzdHJhY3RCb29sLm1heWJlT3JGYWxzZShfY2FuQmVQcmltaXRpdmVTdHJpbmcodmFsdWUpKTsKCiAgYm9vbCBfY2FuQmVQcmltaXRpdmVTdHJpbmcoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBfY29udGFpbnNUeXBlKHZhbHVlLCBjb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0ludGVnZXIoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUoCiAgICAgICAgdmFsdWUuY29udGFpbnNPbmx5SW50KF9jbG9zZWRXb3JsZCkgJiYgIXZhbHVlLmlzTnVsbGFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzVUludDMyKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLnRydWVPck1heWJlKCF2YWx1ZS5pc051bGxhYmxlICYmCiAgICAgICAgX2lzSW5zdGFuY2VPZk9yTnVsbCh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNVSW50MzJDbGFzcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzVUludDMxKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLnRydWVPck1heWJlKCF2YWx1ZS5pc051bGxhYmxlICYmCiAgICAgICAgX2lzSW5zdGFuY2VPZk9yTnVsbCh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNVSW50MzFDbGFzcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzUG9zaXRpdmVJbnRlZ2VyKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLnRydWVPck1heWJlKCF2YWx1ZS5pc051bGxhYmxlICYmCiAgICAgICAgX2lzSW5zdGFuY2VPZk9yTnVsbCh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNQb3NpdGl2ZUludGVnZXJPck51bGwoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUoCiAgICAgICAgX2lzSW5zdGFuY2VPZk9yTnVsbCh2YWx1ZSwgY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNJbnRlZ2VyT3JOdWxsKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLnRydWVPck1heWJlKHZhbHVlLmNvbnRhaW5zT25seUludChfY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc051bWJlcihUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSgKICAgICAgICB2YWx1ZS5jb250YWluc09ubHlOdW0oX2Nsb3NlZFdvcmxkKSAmJiAhdmFsdWUuaXNOdWxsYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNOdW1iZXJPck51bGwoVHlwZU1hc2sgdmFsdWUpID0+CiAgICAgIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZShfaXNOdW1iZXJPck51bGwodmFsdWUpKTsKCiAgYm9vbCBfaXNOdW1iZXJPck51bGwoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZS5jb250YWluc09ubHlOdW0oX2Nsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0RvdWJsZShUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSgKICAgICAgICB2YWx1ZS5jb250YWluc09ubHlEb3VibGUoX2Nsb3NlZFdvcmxkKSAmJiAhdmFsdWUuaXNOdWxsYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNEb3VibGVPck51bGwoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUodmFsdWUuY29udGFpbnNPbmx5RG91YmxlKF9jbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzQm9vbGVhbihUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSgKICAgICAgICB2YWx1ZS5jb250YWluc09ubHlCb29sKF9jbG9zZWRXb3JsZCkgJiYgIXZhbHVlLmlzTnVsbGFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzQm9vbGVhbk9yTnVsbChUeXBlTWFzayB2YWx1ZSkgPT4KICAgICAgQWJzdHJhY3RCb29sLnRydWVPck1heWJlKF9pc0Jvb2xlYW5Pck51bGwodmFsdWUpKTsKCiAgYm9vbCBfaXNCb29sZWFuT3JOdWxsKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUuY29udGFpbnNPbmx5Qm9vbChfY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzU3RyaW5nKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLnRydWVPck1heWJlKAogICAgICAgIHZhbHVlLmNvbnRhaW5zT25seVN0cmluZyhfY2xvc2VkV29ybGQpICYmICF2YWx1ZS5pc051bGxhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc1N0cmluZ09yTnVsbChUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZSh2YWx1ZS5jb250YWluc09ubHlTdHJpbmcoX2Nsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNQcmltaXRpdmVPck51bGwoVHlwZU1hc2sgdmFsdWUpID0+CiAgICAgIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZShfaXNQcmltaXRpdmVPck51bGwodmFsdWUpKTsKCiAgYm9vbCBfaXNQcmltaXRpdmVPck51bGwoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBfaXNJbmRleGFibGVQcmltaXRpdmUodmFsdWUpIHx8CiAgICAgICAgX2lzTnVtYmVyT3JOdWxsKHZhbHVlKSB8fAogICAgICAgIF9pc0Jvb2xlYW5Pck51bGwodmFsdWUpIHx8CiAgICAgICAgX2lzTnVsbCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB1bmlvbihUeXBlTWFzayBhLCBUeXBlTWFzayBiKSA9PiBhLnVuaW9uKGIsIF9jbG9zZWRXb3JsZCk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGludGVyc2VjdGlvbihUeXBlTWFzayBhLCBUeXBlTWFzayBiKSA9PgogICAgICBhLmludGVyc2VjdGlvbihiLCBfY2xvc2VkV29ybGQpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgYXJlRGlzam9pbnQoVHlwZU1hc2sgYSwgVHlwZU1hc2sgYikgPT4KICAgICAgQWJzdHJhY3RCb29sLnRydWVPck1heWJlKGEuaXNEaXNqb2ludChiLCBfY2xvc2VkV29ybGQpKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGNvbnRhaW5zQWxsKFR5cGVNYXNrIGEpID0+CiAgICAgIEFic3RyYWN0Qm9vbC5tYXliZU9yRmFsc2UoYS5jb250YWluc0FsbChfY2xvc2VkV29ybGQpKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlQWJzdHJhY3RWYWx1ZUZvckNvbnN0YW50KENvbnN0YW50VmFsdWUgdmFsdWUpIHsKICAgIHJldHVybiBjb21wdXRlVHlwZU1hc2soX2Nsb3NlZFdvcmxkLCB2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldE1hcEtleVR5cGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgewogICAgaWYgKHZhbHVlIGlzIE1hcFR5cGVNYXNrKSB7CiAgICAgIHJldHVybiB2YWx1ZS5rZXlUeXBlOwogICAgfQogICAgcmV0dXJuIGR5bmFtaWNUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXRNYXBWYWx1ZVR5cGUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgewogICAgaWYgKHZhbHVlIGlzIE1hcFR5cGVNYXNrKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEFzc2VydCB0aGUgYHZhbHVlLnZhbHVlVHlwZWAgaXMgbm90IG51bGwuCiAgICAgIHJldHVybiB2YWx1ZS52YWx1ZVR5cGUgPz8gZHluYW1pY1R5cGU7CiAgICB9CiAgICByZXR1cm4gZHluYW1pY1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldENvbnRhaW5lckVsZW1lbnRUeXBlKEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpcyBDb250YWluZXJUeXBlTWFzaykgewogICAgICByZXR1cm4gdmFsdWUuZWxlbWVudFR5cGUgPz8gZHluYW1pY1R5cGU7CiAgICB9CiAgICByZXR1cm4gZHluYW1pY1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0Q29udGFpbmVyTGVuZ3RoKEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSBpcyBDb250YWluZXJUeXBlTWFzayA/IHZhbHVlLmxlbmd0aCA6IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNyZWF0ZUNvbnRhaW5lclZhbHVlKAogICAgICBBYnN0cmFjdFZhbHVlIGZvcndhcmRUbywKICAgICAgT2JqZWN0IGFsbG9jYXRpb25Ob2RlLAogICAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgIEFic3RyYWN0VmFsdWUgZWxlbWVudFR5cGUsCiAgICAgIGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgQ29udGFpbmVyVHlwZU1hc2soCiAgICAgICAgZm9yd2FyZFRvLCBhbGxvY2F0aW9uTm9kZSwgYWxsb2NhdGlvbkVsZW1lbnQsIGVsZW1lbnRUeXBlLCBsZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB1bmlvbk9mTWFueShJdGVyYWJsZTxBYnN0cmFjdFZhbHVlPiB2YWx1ZXMpIHsKICAgIFR5cGVNYXNrIHJlc3VsdCA9IGNvbnN0IFR5cGVNYXNrLm5vbk51bGxFbXB0eSgpOwogICAgZm9yIChUeXBlTWFzayB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgcmVzdWx0ID0gcmVzdWx0LnVuaW9uKHZhbHVlLCBfY2xvc2VkV29ybGQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVJlY2VpdmVyKEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gbWVtYmVycykgewogICAgYXNzZXJ0KF9jbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeQogICAgICAgIC5oYXNBbnlTdHJpY3RTdWJjbGFzcyhfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpKTsKICAgIHJldHVybiBuZXcgVHlwZU1hc2sudW5pb25PZigKICAgICAgICBtZW1iZXJzLmV4cGFuZCgoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgICAgICAgIENsYXNzRW50aXR5IGNscyA9IGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgICByZXR1cm4gW2Nsc10uLmFkZEFsbChfY2xvc2VkV29ybGQubWl4aW5Vc2VzT2YoY2xzKSk7CiAgICAgICAgfSkubWFwKChjbHMpIHsKICAgICAgICAgIGlmIChfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuanNOdWxsQ2xhc3MgPT0gY2xzKSB7CiAgICAgICAgICAgIHJldHVybiBjb25zdCBUeXBlTWFzay5lbXB0eSgpOwogICAgICAgICAgfSBlbHNlIGlmIChfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQoY2xzKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFR5cGVNYXNrLm5vbk51bGxTdWJjbGFzcyhjbHMsIF9jbG9zZWRXb3JsZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB0aGUgbmVlZCBmb3IgdGhpcyBjYXNlLgogICAgICAgICAgICByZXR1cm4gY29uc3QgVHlwZU1hc2suZW1wdHkoKTsKICAgICAgICAgIH0KICAgICAgICB9KSwKICAgICAgICBfY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzVGFyZ2V0aW5nTWVtYmVyKAogICAgICBjb3ZhcmlhbnQgVHlwZU1hc2sgcmVjZWl2ZXIsIE1lbWJlckVudGl0eSBtZW1iZXIsIE5hbWUgbmFtZSkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC5tYXliZU9yRmFsc2UoCiAgICAgICAgcmVjZWl2ZXIuY2FuSGl0KG1lbWJlciwgbmFtZSwgX2Nsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgbmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZygKICAgICAgY292YXJpYW50IFR5cGVNYXNrIHJlY2VpdmVyLCBTZWxlY3RvciBzZWxlY3RvcikgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JGYWxzZSgKICAgICAgICByZWNlaXZlci5uZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKHNlbGVjdG9yLCBfY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBjb250YWlucygKICAgICAgY292YXJpYW50IFR5cGVNYXNrIHN1cGVyc2V0LCBjb3ZhcmlhbnQgVHlwZU1hc2sgc3Vic2V0KSB7CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLm1heWJlT3JGYWxzZSgKICAgICAgICBzdXBlcnNldC5jb250YWluc01hc2soc3Vic2V0LCBfY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0luKGNvdmFyaWFudCBUeXBlTWFzayBzdWJzZXQsIGNvdmFyaWFudCBUeXBlTWFzayBzdXBlcnNldCkgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZShzdWJzZXQuaXNJbk1hc2soc3VwZXJzZXQsIF9jbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGxvY2F0ZVNpbmdsZU1lbWJlcigKICAgICAgY292YXJpYW50IFR5cGVNYXNrIHJlY2VpdmVyLCBTZWxlY3RvciBzZWxlY3RvcikgewogICAgcmV0dXJuIHJlY2VpdmVyLmxvY2F0ZVNpbmdsZU1lbWJlcihzZWxlY3RvciwgX2Nsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0Qm9vbCBpc0pzSW5kZXhhYmxlKFR5cGVNYXNrIG1hc2spIHsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wudHJ1ZU9yTWF5YmUobWFzay5zYXRpc2ZpZXMoCiAgICAgICAgX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzSW5kZXhhYmxlQ2xhc3MsIF9jbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzSnNJbmRleGFibGVBbmRJdGVyYWJsZShjb3ZhcmlhbnQgVHlwZU1hc2sgbWFzaykgewogICAgcmV0dXJuIEFic3RyYWN0Qm9vbC50cnVlT3JNYXliZShtYXNrICE9IG51bGwgJiYKICAgICAgICBtYXNrLnNhdGlzZmllcygKICAgICAgICAgICAgX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzSW5kZXhhYmxlQ2xhc3MsIF9jbG9zZWRXb3JsZCkgJiYKICAgICAgICAvLyBTdHJpbmcgaXMgaW5kZXhhYmxlIGJ1dCBub3QgaXRlcmFibGUuCiAgICAgICAgIW1hc2suc2F0aXNmaWVzKAogICAgICAgICAgICBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuanNTdHJpbmdDbGFzcywgX2Nsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdEJvb2wgaXNGaXhlZExlbmd0aEpzSW5kZXhhYmxlKGNvdmFyaWFudCBUeXBlTWFzayBtYXNrKSB7CiAgICBpZiAobWFzay5pc0NvbnRhaW5lciAmJiAobWFzayBhcyBDb250YWluZXJUeXBlTWFzaykubGVuZ3RoICE9IG51bGwpIHsKICAgICAgLy8gQSBjb250YWluZXIgb24gd2hpY2ggd2UgaGF2ZSBpbmZlcnJlZCB0aGUgbGVuZ3RoLgogICAgICByZXR1cm4gQWJzdHJhY3RCb29sLlRydWU7CiAgICB9CiAgICAvLyBUT0RPKHNyYSk6IFJlY29nbml6ZSBhbnkgY29tYmluYXRpb24gb2YgZml4ZWQgbGVuZ3RoIGluZGV4YWJsZXMuCiAgICBpZiAobWFzay5jb250YWluc09ubHkoX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzRml4ZWRBcnJheUNsYXNzKSB8fAogICAgICAgIG1hc2suY29udGFpbnNPbmx5KAogICAgICAgICAgICBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuanNVbm1vZGlmaWFibGVBcnJheUNsYXNzKSB8fAogICAgICAgIG1hc2suY29udGFpbnNPbmx5U3RyaW5nKF9jbG9zZWRXb3JsZCkgfHwKICAgICAgICBfY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5pc1R5cGVkQXJyYXkobWFzaykuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gQWJzdHJhY3RCb29sLlRydWU7CiAgICB9CiAgICByZXR1cm4gQWJzdHJhY3RCb29sLk1heWJlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RCb29sIGlzSW50ZXJjZXB0b3IoVHlwZU1hc2sgdmFsdWUpIHsKICAgIHJldHVybiBBYnN0cmFjdEJvb2wubWF5YmVPckZhbHNlKAogICAgICAgICFpbnRlcmNlcHRvclR5cGUuaXNEaXNqb2ludCh2YWx1ZSwgX2Nsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzTWFwKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUuaXNNYXA7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU2V0KFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUuaXNTZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzQ29udGFpbmVyKFR5cGVNYXNrIHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUuaXNDb250YWluZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRGljdGlvbmFyeShUeXBlTWFzayB2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlLmlzRGljdGlvbmFyeTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNEaWN0aW9uYXJ5S2V5KEFic3RyYWN0VmFsdWUgdmFsdWUsIFN0cmluZyBrZXkpIHsKICAgIHJldHVybiB2YWx1ZSBpcyBEaWN0aW9uYXJ5VHlwZU1hc2sgJiYgdmFsdWUuY29udGFpbnNLZXkoa2V5KTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0RGljdGlvbmFyeVZhbHVlRm9yS2V5KEFic3RyYWN0VmFsdWUgdmFsdWUsIFN0cmluZyBrZXkpIHsKICAgIGlmICh2YWx1ZSBpcyBEaWN0aW9uYXJ5VHlwZU1hc2spIHJldHVybiB2YWx1ZS5nZXRWYWx1ZUZvcktleShrZXkpOwogICAgcmV0dXJuIGR5bmFtaWNUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjcmVhdGVNYXBWYWx1ZShBYnN0cmFjdFZhbHVlIGZvcndhcmRUbywgT2JqZWN0IGFsbG9jYXRpb25Ob2RlLAogICAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQsIEFic3RyYWN0VmFsdWUga2V5LCBBYnN0cmFjdFZhbHVlIHZhbHVlKSB7CiAgICByZXR1cm4gbmV3IE1hcFR5cGVNYXNrKAogICAgICAgIGZvcndhcmRUbywgYWxsb2NhdGlvbk5vZGUsIGFsbG9jYXRpb25FbGVtZW50LCBrZXksIHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY3JlYXRlRGljdGlvbmFyeVZhbHVlKAogICAgICBBYnN0cmFjdFZhbHVlIGZvcndhcmRUbywKICAgICAgT2JqZWN0IGFsbG9jYXRpb25Ob2RlLAogICAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgIEFic3RyYWN0VmFsdWUga2V5LAogICAgICBBYnN0cmFjdFZhbHVlIHZhbHVlLAogICAgICBNYXA8U3RyaW5nLCBBYnN0cmFjdFZhbHVlPiBtYXBwaW5ncykgewogICAgcmV0dXJuIG5ldyBEaWN0aW9uYXJ5VHlwZU1hc2soCiAgICAgICAgZm9yd2FyZFRvLCBhbGxvY2F0aW9uTm9kZSwgYWxsb2NhdGlvbkVsZW1lbnQsIGtleSwgdmFsdWUsIG1hcHBpbmdzKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY3JlYXRlU2V0VmFsdWUoQWJzdHJhY3RWYWx1ZSBmb3J3YXJkVG8sIE9iamVjdCBhbGxvY2F0aW9uTm9kZSwKICAgICAgTWVtYmVyRW50aXR5IGFsbG9jYXRpb25FbGVtZW50LCBBYnN0cmFjdFZhbHVlIGVsZW1lbnRUeXBlKSB7CiAgICByZXR1cm4gbmV3IFNldFR5cGVNYXNrKAogICAgICAgIGZvcndhcmRUbywgYWxsb2NhdGlvbk5vZGUsIGFsbG9jYXRpb25FbGVtZW50LCBlbGVtZW50VHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldFNldEVsZW1lbnRUeXBlKEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpcyBTZXRUeXBlTWFzaykgewogICAgICByZXR1cm4gdmFsdWUuZWxlbWVudFR5cGUgPz8gZHluYW1pY1R5cGU7CiAgICB9CiAgICByZXR1cm4gZHluYW1pY1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU3BlY2lhbGl6YXRpb25PZigKICAgICAgQWJzdHJhY3RWYWx1ZSBzcGVjaWFsaXphdGlvbiwgQWJzdHJhY3RWYWx1ZSBnZW5lcmFsaXphdGlvbikgewogICAgcmV0dXJuIHNwZWNpYWxpemF0aW9uIGlzIEZvcndhcmRpbmdUeXBlTWFzayAmJgogICAgICAgIHNwZWNpYWxpemF0aW9uLmZvcndhcmRUbyA9PSBnZW5lcmFsaXphdGlvbjsKICB9CgogIEBvdmVycmlkZQogIE9iamVjdCBnZXRBbGxvY2F0aW9uTm9kZShBYnN0cmFjdFZhbHVlIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgaXMgQWxsb2NhdGlvblR5cGVNYXNrKSB7CiAgICAgIHJldHVybiB2YWx1ZS5hbGxvY2F0aW9uTm9kZTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGdldEFsbG9jYXRpb25FbGVtZW50KEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpcyBBbGxvY2F0aW9uVHlwZU1hc2spIHsKICAgICAgcmV0dXJuIHZhbHVlLmFsbG9jYXRpb25FbGVtZW50OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldEdlbmVyYWxpemF0aW9uKEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpcyBBbGxvY2F0aW9uVHlwZU1hc2spIHsKICAgICAgcmV0dXJuIHZhbHVlLmZvcndhcmRUbzsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXRBYnN0cmFjdFZhbHVlRm9yTmF0aXZlTWV0aG9kUGFyYW1ldGVyVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgcmV0dXJuIG51bGw7CiAgICAgIC8vIFRPRE8oc3JhKTogQ29uc2lkZXIgdXNpbmcgYSBzdHJlbmd0aGVuZWQgdHlwZSBjaGVjayB0byBhdm9pZCBwYXNzaW5nCiAgICAgIC8vIGBudWxsYCB0byBwcmltaXRpdmUgdHlwZXMgc2luY2UgdGhlIG5hdGl2ZSBtZXRob2RzIHVzdWFsbHkgaGF2ZQogICAgICAvLyBub24tbnVsbGFibGUgcHJpbWl0aXZlIHBhcmFtZXRlciB0eXBlcy4KICAgICAgcmV0dXJuIGNyZWF0ZU51bGxhYmxlU3VidHlwZSh0eXBlLmVsZW1lbnQpOwogICAgfQogICAgaWYgKHR5cGUgaXMgRHluYW1pY1R5cGUpIHJldHVybiBkeW5hbWljVHlwZTsKICAgIC8vIFRPRE8oc3JhKTogQ29udmVydCBvdGhlciBbRGFydFR5cGVdcyB0byBbQWJzdHJhY3RWYWx1ZV1zCiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXRDb21wYWN0VGV4dChBYnN0cmFjdFZhbHVlIHZhbHVlKSB7CiAgICByZXR1cm4gZm9ybWF0VHlwZSh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayByZWFkQWJzdHJhY3RWYWx1ZUZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICByZXR1cm4gc291cmNlLnJlYWRDYWNoZWQ8VHlwZU1hc2s+KAogICAgICAgICgpID0+IG5ldyBUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBfY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVBYnN0cmFjdFZhbHVlVG9EYXRhU2luayhEYXRhU2luayBzaW5rLCBjb3ZhcmlhbnQgVHlwZU1hc2sgdmFsdWUpIHsKICAgIHNpbmsud3JpdGVDYWNoZWQ8VHlwZU1hc2s+KAogICAgICAgIHZhbHVlLCAoVHlwZU1hc2sgdmFsdWUpID0+IHZhbHVlLndyaXRlVG9EYXRhU2luayhzaW5rKSk7CiAgfQp9CgovLy8gQ29udmVydCB0aGUgZ2l2ZW4gVHlwZU1hc2sgdG8gYSBjb21wYWN0IHN0cmluZyBmb3JtYXQuCi8vLwovLy8gVGhlIGRlZmF1bHQgZm9ybWF0IGlzIHRvbyB2ZXJib3NlIGZvciB0aGUgZ3JhcGggZm9ybWF0IHNpbmNlIGxvbmcgc3RyaW5ncwovLy8gY3JlYXRlIG9ibG9uZyBub2RlcyB0aGF0IG9ic3RydWN0IHRoZSBncmFwaCBsYXlvdXQuClN0cmluZyBmb3JtYXRUeXBlKFR5cGVNYXNrIHR5cGUpIHsKICBpZiAodHlwZSBpcyBGbGF0VHlwZU1hc2spIHsKICAgIC8vIFRPRE8oYXNnZXJmKTogRGlzYW1iaWd1YXRlIGNsYXNzZXMgd2hvc2UgbmFtZSBpcyBub3QgdW5pcXVlLiBVc2luZyB0aGUKICAgIC8vICAgICBsaWJyYXJ5IG5hbWUgZm9yIGFsbCBjbGFzc2VzIGlzIG5vdCBhIGdvb2QgaWRlYSwgc2luY2UgbGlicmFyeSBuYW1lcwogICAgLy8gICAgIGNhbiBiZSByZWFsbHkgbG9uZyBhbmQgbWVzcyB1cCB0aGUgbGF5b3V0LgogICAgLy8gQ2FwaXRhbGl6ZSBOdWxsIHRvIGVtcGhhc2l6ZSB0aGF0IGl0J3MgdGhlIG51bGwgdHlwZSBtYXNrIGFuZCBub3QKICAgIC8vIGEgbnVsbCB2YWx1ZSB3ZSBhY2NpZGVudGFsbHkgcHJpbnRlZCBvdXQuCiAgICBpZiAodHlwZS5pc0VtcHR5T3JOdWxsKSByZXR1cm4gdHlwZS5pc051bGxhYmxlID8gJ051bGwnIDogJ0VtcHR5JzsKICAgIFN0cmluZyBudWxsRmxhZyA9IHR5cGUuaXNOdWxsYWJsZSA/ICc/JyA6ICcnOwogICAgU3RyaW5nIHN1YkZsYWcgPSB0eXBlLmlzRXhhY3QgPyAnJyA6IHR5cGUuaXNTdWJjbGFzcyA/ICcrJyA6ICcqJzsKICAgIHJldHVybiAnJHt0eXBlLmJhc2UubmFtZX0kbnVsbEZsYWckc3ViRmxhZyc7CiAgfQogIGlmICh0eXBlIGlzIFVuaW9uVHlwZU1hc2spIHsKICAgIHJldHVybiB0eXBlLmRpc2pvaW50TWFza3MubWFwKGZvcm1hdFR5cGUpLmpvaW4oJyB8ICcpOwogIH0KICBpZiAodHlwZSBpcyBDb250YWluZXJUeXBlTWFzaykgewogICAgU3RyaW5nIGNvbnRhaW5lciA9IGZvcm1hdFR5cGUodHlwZS5mb3J3YXJkVG8pOwogICAgU3RyaW5nIG1lbWJlciA9IGZvcm1hdFR5cGUodHlwZS5lbGVtZW50VHlwZSk7CiAgICByZXR1cm4gJyRjb250YWluZXI8JG1lbWJlcj4nOwogIH0KICBpZiAodHlwZSBpcyBNYXBUeXBlTWFzaykgewogICAgU3RyaW5nIGNvbnRhaW5lciA9IGZvcm1hdFR5cGUodHlwZS5mb3J3YXJkVG8pOwogICAgU3RyaW5nIGtleSA9IGZvcm1hdFR5cGUodHlwZS5rZXlUeXBlKTsKICAgIFN0cmluZyB2YWx1ZSA9IGZvcm1hdFR5cGUodHlwZS52YWx1ZVR5cGUpOwogICAgcmV0dXJuICckY29udGFpbmVyPCRrZXksJHZhbHVlPic7CiAgfQogIGlmICh0eXBlIGlzIFZhbHVlVHlwZU1hc2spIHsKICAgIFN0cmluZyBiYXNlVHlwZSA9IGZvcm1hdFR5cGUodHlwZS5mb3J3YXJkVG8pOwogICAgU3RyaW5nIHZhbHVlID0gdHlwZS52YWx1ZS50b1N0cnVjdHVyZWRUZXh0KCk7CiAgICByZXR1cm4gJyRiYXNlVHlwZT0kdmFsdWUnOwogIH0KICByZXR1cm4gJyR0eXBlJzsgLy8gRmFsbCBiYWNrIG9uIHRvU3RyaW5nIGlmIG5vdCBzdXBwb3J0ZWQgaGVyZS4KfQqDmgBOTjwBDwEoARw5JickJCQxLjUyK0MfLSg9GQEhIhwiGxsXHR0BM0ogIwEiAUQBGRkWFRgYHRgVFhoWGxseFRoVGhgWIh0hJB8eIx0BRyVDPAFBOk8tRjYEAQxGPgEMTT4BDCdNAQwtUAEMLU0BDCI5PAEMLU0BDCdQAQwpSwEMMU8BDClMAQxOPgEMM1EBDCM3QAEMJ1EBDE46AQwnUQEMTjoBDC1NAQwpUAEMQVABDCI2PgEMP1ABRwxBAQw7ASk/OgE7TwEjOj0BKDxCASI5PAEMLU1ML00+RjhQHAQBDDI3OkUzTT9GUBQSIkkhBAEMMTkEAQwyMgQBDDQ8BAEMMzsEAQw0NAQBDEE/GycsLTctGQYhF0I4MR0KCB8iLUYrOy9LDBEkEQgpRCcpUA09BgQBDD0BDDoBDEJDBAE7Pi4EAQxGRwQBPz4kBAEMSUQBQS4vBAEMHTw/JSVEIEQhDSEGBAEMKi8BDCpEAQwwQQEMLSsEAQw6AQw8GCYeBhEEAQwmSDQEAQwoGCAjIQ0hBgQBMAEMLUUnKSgZBAEMND8BL0dGQTtDPj48BAEMNUABMD0EAQwzPgEuQEJHRwQBDDc+AS81RQQBDC4+JUZQBAEMMyVKBAEMMCVJBAEMNCVNBAEMKSVCBAEMND8BLz8EAQwrJUMEAQwqOUMEAQwqOUMEAQwzOUgEAQw5JUgEAQwxSgQBDColQwQBDDE4ASkwBAEMKiVGBAEMME0EAQwrJUQEAQwyOQEqMQQBDColRgQBDDBNBAEMNDsBLCsiIxgEAQxGAQwzJwEMNj8BDCo+AQxHMQQBDDUgHAYYBAEMNyBILQYYBAEMPyYvBhgEAQwwPQQBDCYfHSYhFCJMBAEMPjUlMgYTBAEMQidJITA0PxdAK0hEE0IrDAwXBAEMIkUmNgQBDCo4JUUEAQwZQCY2BAEMTk4EAQwjOEAEAQwuNEYEAQxDNBhLMRlHBAEMQ0o7IAZITBtFMVAgBh8EAQwvJjsEAQwfGAQBDB8YBAEMJR4EAQwmHwQBDEBCBAEMTEcYBAEMT1AcQwQBDCcfHSYZGy0jTQQBDE9DHEQEAQw5IC8GGAQBDBtEMzQEAQwyJyMGEQQBDDsnJgYRBAEMOSceBhEEAQxOITZOSTEyBjFAEQQBDC8eBAEMQChGBAEMTyBBBAIBOwROOCMeTlA2STFHMkYxBB87BCMzMiIEHTMrLyYEHzIyHwRCAgEycGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvdHlwZW1hc2tzL21hc2tzLmRhcnRJc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaW5mZXJyZXIvdHlwZW1hc2tzL2NvbnRhaW5lcl90eXBlX21hc2suZGFydJFiLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgbWFza3M7CgovLy8gQSBbVHlwZU1hc2tdIGZvciBhIHNwZWNpZmljIGFsbG9jYXRpb24gc2l0ZSBvZiBhIGNvbnRhaW5lciAoY3VycmVudGx5IG9ubHkKLy8vIExpc3QpIHRoYXQgd2lsbCBnZXQgc3BlY2lhbGl6ZWQgb25jZSB0aGUgW1R5cGVHcmFwaEluZmVycmVyXSBwaGFzZSBmaW5kcyBhbgovLy8gZWxlbWVudCB0eXBlIGZvciBpdC4KY2xhc3MgQ29udGFpbmVyVHlwZU1hc2sgZXh0ZW5kcyBBbGxvY2F0aW9uVHlwZU1hc2sgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbQ29udGFpbmVyVHlwZU1hc2tdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY29udGFpbmVyLXR5cGUtbWFzayc7CgogIEBvdmVycmlkZQogIGZpbmFsIFR5cGVNYXNrIGZvcndhcmRUbzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaXIuTm9kZSBhbGxvY2F0aW9uTm9kZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyRW50aXR5IGFsbG9jYXRpb25FbGVtZW50OwoKICAvLyBUaGUgZWxlbWVudCB0eXBlIG9mIHRoaXMgY29udGFpbmVyLgogIGZpbmFsIFR5cGVNYXNrIGVsZW1lbnRUeXBlOwoKICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBjb250YWluZXIuCiAgZmluYWwgaW50IGxlbmd0aDsKCiAgQ29udGFpbmVyVHlwZU1hc2sodGhpcy5mb3J3YXJkVG8sIHRoaXMuYWxsb2NhdGlvbk5vZGUsIHRoaXMuYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgIHRoaXMuZWxlbWVudFR5cGUsIHRoaXMubGVuZ3RoKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtDb250YWluZXJUeXBlTWFza10gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBDb250YWluZXJUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgVHlwZU1hc2sgZm9yd2FyZFRvID0gbmV3IFR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsb3NlZFdvcmxkKTsKICAgIGlyLlRyZWVOb2RlIGFsbG9jYXRpb25Ob2RlID0gc291cmNlLnJlYWRUcmVlTm9kZU9yTnVsbCgpOwogICAgTWVtYmVyRW50aXR5IGFsbG9jYXRpb25FbGVtZW50ID0gc291cmNlLnJlYWRNZW1iZXJPck51bGwoKTsKICAgIFR5cGVNYXNrIGVsZW1lbnRUeXBlID0gbmV3IFR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsb3NlZFdvcmxkKTsKICAgIGludCBsZW5ndGggPSBzb3VyY2UucmVhZEludE9yTnVsbCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBDb250YWluZXJUeXBlTWFzaygKICAgICAgICBmb3J3YXJkVG8sIGFsbG9jYXRpb25Ob2RlLCBhbGxvY2F0aW9uRWxlbWVudCwgZWxlbWVudFR5cGUsIGxlbmd0aCk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtDb250YWluZXJUeXBlTWFza10gdG8gW3NpbmtdLgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKFR5cGVNYXNrS2luZC5jb250YWluZXIpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgZm9yd2FyZFRvLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsud3JpdGVUcmVlTm9kZU9yTnVsbChhbGxvY2F0aW9uTm9kZSk7CiAgICBzaW5rLndyaXRlTWVtYmVyT3JOdWxsKGFsbG9jYXRpb25FbGVtZW50KTsKICAgIGVsZW1lbnRUeXBlLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsud3JpdGVJbnRPck51bGwobGVuZ3RoKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBudWxsYWJsZSgpIHsKICAgIHJldHVybiBpc051bGxhYmxlCiAgICAgICAgPyB0aGlzCiAgICAgICAgOiBuZXcgQ29udGFpbmVyVHlwZU1hc2soZm9yd2FyZFRvLm51bGxhYmxlKCksIGFsbG9jYXRpb25Ob2RlLAogICAgICAgICAgICBhbGxvY2F0aW9uRWxlbWVudCwgZWxlbWVudFR5cGUsIGxlbmd0aCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBub25OdWxsYWJsZSgpIHsKICAgIHJldHVybiBpc051bGxhYmxlCiAgICAgICAgPyBuZXcgQ29udGFpbmVyVHlwZU1hc2soZm9yd2FyZFRvLm5vbk51bGxhYmxlKCksIGFsbG9jYXRpb25Ob2RlLAogICAgICAgICAgICBhbGxvY2F0aW9uRWxlbWVudCwgZWxlbWVudFR5cGUsIGxlbmd0aCkKICAgICAgICA6IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnRhaW5lciA9PiB0cnVlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRXhhY3QgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBlcXVhbHNEaXNyZWdhcmROdWxsKG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIENvbnRhaW5lclR5cGVNYXNrKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gc3VwZXIuZXF1YWxzRGlzcmVnYXJkTnVsbChvdGhlcikgJiYKICAgICAgICBhbGxvY2F0aW9uTm9kZSA9PSBvdGhlci5hbGxvY2F0aW9uTm9kZSAmJgogICAgICAgIGVsZW1lbnRUeXBlID09IG90aGVyLmVsZW1lbnRUeXBlICYmCiAgICAgICAgbGVuZ3RoID09IG90aGVyLmxlbmd0aDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGludGVyc2VjdGlvbihUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBUeXBlTWFzayBmb3J3YXJkSW50ZXJzZWN0aW9uID0gZm9yd2FyZFRvLmludGVyc2VjdGlvbihvdGhlciwgY2xvc2VkV29ybGQpOwogICAgaWYgKGZvcndhcmRJbnRlcnNlY3Rpb24uaXNFbXB0eU9yTnVsbCkgcmV0dXJuIGZvcndhcmRJbnRlcnNlY3Rpb247CiAgICByZXR1cm4gZm9yd2FyZEludGVyc2VjdGlvbi5pc051bGxhYmxlID8gbnVsbGFibGUoKSA6IG5vbk51bGxhYmxlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB1bmlvbihkeW5hbWljIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmICh0aGlzID09IG90aGVyKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIGlmIChlcXVhbHNEaXNyZWdhcmROdWxsKG90aGVyKSkgewogICAgICByZXR1cm4gb3RoZXIuaXNOdWxsYWJsZSA/IG90aGVyIDogdGhpczsKICAgIH0gZWxzZSBpZiAob3RoZXIuaXNFbXB0eU9yTnVsbCkgewogICAgICByZXR1cm4gb3RoZXIuaXNOdWxsYWJsZSA/IHRoaXMubnVsbGFibGUoKSA6IHRoaXM7CiAgICB9IGVsc2UgaWYgKG90aGVyLmlzQ29udGFpbmVyICYmCiAgICAgICAgZWxlbWVudFR5cGUgIT0gbnVsbCAmJgogICAgICAgIG90aGVyLmVsZW1lbnRUeXBlICE9IG51bGwpIHsKICAgICAgVHlwZU1hc2sgbmV3RWxlbWVudFR5cGUgPQogICAgICAgICAgZWxlbWVudFR5cGUudW5pb24ob3RoZXIuZWxlbWVudFR5cGUsIGNsb3NlZFdvcmxkKTsKICAgICAgaW50IG5ld0xlbmd0aCA9IChsZW5ndGggPT0gb3RoZXIubGVuZ3RoKSA/IGxlbmd0aCA6IG51bGw7CiAgICAgIFR5cGVNYXNrIG5ld0ZvcndhcmRUbyA9IGZvcndhcmRUby51bmlvbihvdGhlci5mb3J3YXJkVG8sIGNsb3NlZFdvcmxkKTsKICAgICAgcmV0dXJuIG5ldyBDb250YWluZXJUeXBlTWFzaygKICAgICAgICAgIG5ld0ZvcndhcmRUbywKICAgICAgICAgIGFsbG9jYXRpb25Ob2RlID09IG90aGVyLmFsbG9jYXRpb25Ob2RlID8gYWxsb2NhdGlvbk5vZGUgOiBudWxsLAogICAgICAgICAgYWxsb2NhdGlvbkVsZW1lbnQgPT0gb3RoZXIuYWxsb2NhdGlvbkVsZW1lbnQKICAgICAgICAgICAgICA/IGFsbG9jYXRpb25FbGVtZW50CiAgICAgICAgICAgICAgOiBudWxsLAogICAgICAgICAgbmV3RWxlbWVudFR5cGUsCiAgICAgICAgICBuZXdMZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZvcndhcmRUby51bmlvbihvdGhlciwgY2xvc2VkV29ybGQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4gc3VwZXIgPT0gb3RoZXI7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIGNvbXB1dGVIYXNoQ29kZSgKICAgICAgICBhbGxvY2F0aW9uTm9kZSwgaXNOdWxsYWJsZSwgZWxlbWVudFR5cGUsIGxlbmd0aCwgZm9yd2FyZFRvKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnQ29udGFpbmVyKCRmb3J3YXJkVG8sIGVsZW1lbnQ6ICRlbGVtZW50VHlwZSwgbGVuZ3RoOiAkbGVuZ3RoKSc7CiAgfQp9CoCMAE5OPAEPAU9QGTVLHTMBDBwBDCABDCgBKR4BIhQBUSYBPzA1F08+QFEpFSJMBAE1DCgsFSUuLychEwQBDBgWD0Y1BAEMGxZJNBAEAQwgDBwBDCQzLzIsIAQBDERPR0gEAQw8GRMtLiY4JB8lID1ATSQYSjciFhoWDTIGBAEMLQEMFRxFBAEMFkwEAgFAcGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvdHlwZW1hc2tzL2NvbnRhaW5lcl90eXBlX21hc2suZGFydEpzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci90eXBlbWFza3MvZGljdGlvbmFyeV90eXBlX21hc2suZGFydJa7Ly8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgbWFza3M7CgovLy8gQSBbRGljdGlvbmFyeVR5cGVNYXNrXSBpcyBhIFtUeXBlTWFza10gZm9yIGEgc3BlY2lmaWMgYWxsb2NhdGlvbgovLy8gc2l0ZSBvZiBhIG1hcCAoY3VycmVudGx5IG9ubHkgaW50ZXJuYWwgTWFwIGNsYXNzKSB0aGF0IGlzIHVzZWQgYXMKLy8vIGEgZGljdGlvbmFyeSwgaS5lLiBhIG1hcHBpbmcgZnJvbSBhIHNldCBvZiBzdGF0aWNhbGx5IGtub3duIHN0cmluZ3MKLy8vIHRvIHZhbHVlcy4gVGhlc2UgdHlwZW1hc2tzIG9ubHkgY29tZSBpbnRvIGV4aXN0ZW5jZSBhZnRlciB0aGUKLy8vIFtUeXBlR3JhcGhJbmZlcnJlcl0gaGFzIHN1Y2Nlc3NmdWxseSBpZGVudGlmaWVkIHN1Y2ggYSB1c2FnZS4gT3RoZXJ3aXNlLAovLy8gdGhlIG1vcmUgZ2VuZXJhbCBbTWFwVHlwZU1hc2tdIGlzIHVzZWQuCmNsYXNzIERpY3Rpb25hcnlUeXBlTWFzayBleHRlbmRzIE1hcFR5cGVNYXNrIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0RpY3Rpb25hcnlUeXBlTWFza10gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdkaWN0aW9uYXJ5LXR5cGUtbWFzayc7CgogIC8vIFRoZSB1bmRlcmx5aW5nIGtleS92YWx1ZSBtYXAgb2YgdGhpcyBkaWN0aW9uYXJ5LgogIGZpbmFsIE1hcDxTdHJpbmcsIEFic3RyYWN0VmFsdWU+IF90eXBlTWFwOwoKICBEaWN0aW9uYXJ5VHlwZU1hc2soCiAgICAgIFR5cGVNYXNrIGZvcndhcmRUbywKICAgICAgaXIuTm9kZSBhbGxvY2F0aW9uTm9kZSwKICAgICAgTWVtYmVyRW50aXR5IGFsbG9jYXRpb25FbGVtZW50LAogICAgICBUeXBlTWFzayBrZXlUeXBlLAogICAgICBUeXBlTWFzayB2YWx1ZVR5cGUsCiAgICAgIHRoaXMuX3R5cGVNYXApCiAgICAgIDogc3VwZXIoZm9yd2FyZFRvLCBhbGxvY2F0aW9uTm9kZSwgYWxsb2NhdGlvbkVsZW1lbnQsIGtleVR5cGUsIHZhbHVlVHlwZSk7CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbRGljdGlvbmFyeVR5cGVNYXNrXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IERpY3Rpb25hcnlUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgVHlwZU1hc2sgZm9yd2FyZFRvID0gbmV3IFR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsb3NlZFdvcmxkKTsKICAgIGlyLlRyZWVOb2RlIGFsbG9jYXRpb25Ob2RlID0gc291cmNlLnJlYWRUcmVlTm9kZU9yTnVsbCgpOwogICAgTWVtYmVyRW50aXR5IGFsbG9jYXRpb25FbGVtZW50ID0gc291cmNlLnJlYWRNZW1iZXJPck51bGwoKTsKICAgIFR5cGVNYXNrIGtleVR5cGUgPSBuZXcgVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpOwogICAgVHlwZU1hc2sgdmFsdWVUeXBlID0gbmV3IFR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsb3NlZFdvcmxkKTsKICAgIE1hcDxTdHJpbmcsIEFic3RyYWN0VmFsdWU+IHR5cGVNYXAgPSBzb3VyY2UucmVhZFN0cmluZ01hcCgKICAgICAgICAoKSA9PiBuZXcgVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgRGljdGlvbmFyeVR5cGVNYXNrKGZvcndhcmRUbywgYWxsb2NhdGlvbk5vZGUsIGFsbG9jYXRpb25FbGVtZW50LAogICAgICAgIGtleVR5cGUsIHZhbHVlVHlwZSwgdHlwZU1hcCk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtEaWN0aW9uYXJ5VHlwZU1hc2tdIHRvIFtzaW5rXS4KICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShUeXBlTWFza0tpbmQuZGljdGlvbmFyeSk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBmb3J3YXJkVG8ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZVRyZWVOb2RlT3JOdWxsKGFsbG9jYXRpb25Ob2RlKTsKICAgIHNpbmsud3JpdGVNZW1iZXJPck51bGwoYWxsb2NhdGlvbkVsZW1lbnQpOwogICAga2V5VHlwZS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB2YWx1ZVR5cGUud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZVN0cmluZ01hcChfdHlwZU1hcCwgKEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgICAgVHlwZU1hc2sgdHlwZU1hc2sgPSB2YWx1ZTsKICAgICAgdHlwZU1hc2sud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgfSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgbnVsbGFibGUoKSB7CiAgICByZXR1cm4gaXNOdWxsYWJsZQogICAgICAgID8gdGhpcwogICAgICAgIDogbmV3IERpY3Rpb25hcnlUeXBlTWFzayhmb3J3YXJkVG8ubnVsbGFibGUoKSwgYWxsb2NhdGlvbk5vZGUsCiAgICAgICAgICAgIGFsbG9jYXRpb25FbGVtZW50LCBrZXlUeXBlLCB2YWx1ZVR5cGUsIF90eXBlTWFwKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIG5vbk51bGxhYmxlKCkgewogICAgcmV0dXJuIGlzTnVsbGFibGUKICAgICAgICA/IG5ldyBEaWN0aW9uYXJ5VHlwZU1hc2soZm9yd2FyZFRvLm5vbk51bGxhYmxlKCksIGFsbG9jYXRpb25Ob2RlLAogICAgICAgICAgICBhbGxvY2F0aW9uRWxlbWVudCwga2V5VHlwZSwgdmFsdWVUeXBlLCBfdHlwZU1hcCkKICAgICAgICA6IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0RpY3Rpb25hcnkgPT4gdHJ1ZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0V4YWN0ID0+IHRydWU7CgogIGJvb2wgY29udGFpbnNLZXkoU3RyaW5nIGtleSkgPT4gX3R5cGVNYXAuY29udGFpbnNLZXkoa2V5KTsKCiAgVHlwZU1hc2sgZ2V0VmFsdWVGb3JLZXkoU3RyaW5nIGtleSkgPT4gX3R5cGVNYXBba2V5XTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBlcXVhbHNEaXNyZWdhcmROdWxsKG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIERpY3Rpb25hcnlUeXBlTWFzaykgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGFsbG9jYXRpb25Ob2RlID09IG90aGVyLmFsbG9jYXRpb25Ob2RlICYmCiAgICAgICAga2V5VHlwZSA9PSBvdGhlci5rZXlUeXBlICYmCiAgICAgICAgdmFsdWVUeXBlID09IG90aGVyLnZhbHVlVHlwZSAmJgogICAgICAgIF90eXBlTWFwLmtleXMuZXZlcnkoKGspID0+IG90aGVyLl90eXBlTWFwLmNvbnRhaW5zS2V5KGspKSAmJgogICAgICAgIG90aGVyLl90eXBlTWFwLmtleXMuZXZlcnkoCiAgICAgICAgICAgIChrKSA9PiBfdHlwZU1hcC5jb250YWluc0tleShrKSAmJiBfdHlwZU1hcFtrXSA9PSBvdGhlci5fdHlwZU1hcFtrXSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBpbnRlcnNlY3Rpb24oVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgVHlwZU1hc2sgZm9yd2FyZEludGVyc2VjdGlvbiA9IGZvcndhcmRUby5pbnRlcnNlY3Rpb24ob3RoZXIsIGNsb3NlZFdvcmxkKTsKICAgIGlmIChmb3J3YXJkSW50ZXJzZWN0aW9uLmlzRW1wdHlPck51bGwpIHJldHVybiBmb3J3YXJkSW50ZXJzZWN0aW9uOwogICAgcmV0dXJuIGZvcndhcmRJbnRlcnNlY3Rpb24uaXNOdWxsYWJsZSA/IG51bGxhYmxlKCkgOiBub25OdWxsYWJsZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdW5pb24oZHluYW1pYyBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAodGhpcyA9PSBvdGhlcikgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSBpZiAoZXF1YWxzRGlzcmVnYXJkTnVsbChvdGhlcikpIHsKICAgICAgcmV0dXJuIG90aGVyLmlzTnVsbGFibGUgPyBvdGhlciA6IHRoaXM7CiAgICB9IGVsc2UgaWYgKG90aGVyLmlzRW1wdHlPck51bGwpIHsKICAgICAgcmV0dXJuIG90aGVyLmlzTnVsbGFibGUgPyB0aGlzLm51bGxhYmxlKCkgOiB0aGlzOwogICAgfSBlbHNlIGlmIChvdGhlci5pc0RpY3Rpb25hcnkpIHsKICAgICAgVHlwZU1hc2sgbmV3Rm9yd2FyZFRvID0gZm9yd2FyZFRvLnVuaW9uKG90aGVyLmZvcndhcmRUbywgY2xvc2VkV29ybGQpOwogICAgICBUeXBlTWFzayBuZXdLZXlUeXBlID0ga2V5VHlwZS51bmlvbihvdGhlci5rZXlUeXBlLCBjbG9zZWRXb3JsZCk7CiAgICAgIFR5cGVNYXNrIG5ld1ZhbHVlVHlwZSA9IHZhbHVlVHlwZS51bmlvbihvdGhlci52YWx1ZVR5cGUsIGNsb3NlZFdvcmxkKTsKICAgICAgTWFwPFN0cmluZywgVHlwZU1hc2s+IG1hcHBpbmdzID0gPFN0cmluZywgVHlwZU1hc2s+e307CiAgICAgIF90eXBlTWFwLmZvckVhY2goKGssIGR5bmFtaWMgdikgewogICAgICAgIGlmICghb3RoZXIuX3R5cGVNYXAuY29udGFpbnNLZXkoaykpIHsKICAgICAgICAgIG1hcHBpbmdzW2tdID0gdi5udWxsYWJsZSgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIG90aGVyLl90eXBlTWFwLmZvckVhY2goKGssIHYpIHsKICAgICAgICBpZiAoX3R5cGVNYXAuY29udGFpbnNLZXkoaykpIHsKICAgICAgICAgIG1hcHBpbmdzW2tdID0gdi51bmlvbihfdHlwZU1hcFtrXSwgY2xvc2VkV29ybGQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtYXBwaW5nc1trXSA9IHYubnVsbGFibGUoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3IERpY3Rpb25hcnlUeXBlTWFzaygKICAgICAgICAgIG5ld0ZvcndhcmRUbywgbnVsbCwgbnVsbCwgbmV3S2V5VHlwZSwgbmV3VmFsdWVUeXBlLCBtYXBwaW5ncyk7CiAgICB9IGVsc2UgaWYgKG90aGVyLmlzTWFwICYmCiAgICAgICAgKG90aGVyLmtleVR5cGUgIT0gbnVsbCkgJiYKICAgICAgICAob3RoZXIudmFsdWVUeXBlICE9IG51bGwpKSB7CiAgICAgIFR5cGVNYXNrIG5ld0ZvcndhcmRUbyA9IGZvcndhcmRUby51bmlvbihvdGhlci5mb3J3YXJkVG8sIGNsb3NlZFdvcmxkKTsKICAgICAgVHlwZU1hc2sgbmV3S2V5VHlwZSA9IGtleVR5cGUudW5pb24ob3RoZXIua2V5VHlwZSwgY2xvc2VkV29ybGQpOwogICAgICBUeXBlTWFzayBuZXdWYWx1ZVR5cGUgPSB2YWx1ZVR5cGUudW5pb24ob3RoZXIudmFsdWVUeXBlLCBjbG9zZWRXb3JsZCk7CiAgICAgIHJldHVybiBuZXcgTWFwVHlwZU1hc2soCiAgICAgICAgICBuZXdGb3J3YXJkVG8sIG51bGwsIG51bGwsIG5ld0tleVR5cGUsIG5ld1ZhbHVlVHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZm9yd2FyZFRvLnVuaW9uKG90aGVyLCBjbG9zZWRXb3JsZCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PiBzdXBlciA9PSBvdGhlcjsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gY29tcHV0ZUhhc2hDb2RlKGFsbG9jYXRpb25Ob2RlLCBpc051bGxhYmxlLCBfdHlwZU1hcCwgZm9yd2FyZFRvKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnRGljdGlvbmFyeSgkZm9yd2FyZFRvLCBrZXk6ICRrZXlUeXBlLCAnCiAgICAgICAgJ3ZhbHVlOiAkdmFsdWVUeXBlLCBtYXA6ICRfdHlwZU1hcCknOwogIH0KfQqAoQBOTjwBDwFFRkhCTSwvTB00ATYtARYaHiYYGhVRAUAxNRdPPkBNTz9FFVAmBAE2DCgtFSUuLyMlOiEmCBMEAQwYFg9HPgQBDBsWSj0QBAEMIQwcAT0BOAEMJDQ1JChFI1EEAQxET0dIBAEMPBkTLS4mOCVNR009KC4mCgomJzsRJgoKJUkeIyVNR00ePw0yBgQBDC0BDBVNBAEMFjQuBAIBQXBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy9kaWN0aW9uYXJ5X3R5cGVfbWFzay5kYXJ0RHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy9mbGF0X3R5cGVfbWFzay5kYXJ0wABesy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIG1hc2tzOwoKLy8vIEEgZmxhdCB0eXBlIG1hc2sgaXMgYSB0eXBlIG1hc2sgdGhhdCBoYXMgYmVlbiBmbGF0dGVuZWQgdG8gY29udGFpbiBhCi8vLyBiYXNlIHR5cGUuCmNsYXNzIEZsYXRUeXBlTWFzayBpbXBsZW1lbnRzIFR5cGVNYXNrIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0ZsYXRUeXBlTWFza10gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdmbGF0LXR5cGUtbWFzayc7CgogIHN0YXRpYyBjb25zdCBpbnQgRU1QVFkgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgRVhBQ1QgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgU1VCQ0xBU1MgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgU1VCVFlQRSA9IDM7CgogIGZpbmFsIENsYXNzRW50aXR5IGJhc2U7CiAgZmluYWwgaW50IGZsYWdzOwoKICBGbGF0VHlwZU1hc2soQ2xhc3NFbnRpdHkgYmFzZSwgaW50IGtpbmQsIGJvb2wgaXNOdWxsYWJsZSkKICAgICAgOiB0aGlzLmludGVybmFsKGJhc2UsIChraW5kIDw8IDEpIHwgKGlzTnVsbGFibGUgPyAxIDogMCkpOwoKICBGbGF0VHlwZU1hc2suZXhhY3QoQ2xhc3NFbnRpdHkgYmFzZSkgOiB0aGlzLmludGVybmFsKGJhc2UsIChFWEFDVCA8PCAxKSB8IDEpOwogIEZsYXRUeXBlTWFzay5zdWJjbGFzcyhDbGFzc0VudGl0eSBiYXNlKQogICAgICA6IHRoaXMuaW50ZXJuYWwoYmFzZSwgKFNVQkNMQVNTIDw8IDEpIHwgMSk7CiAgRmxhdFR5cGVNYXNrLnN1YnR5cGUoQ2xhc3NFbnRpdHkgYmFzZSkKICAgICAgOiB0aGlzLmludGVybmFsKGJhc2UsIChTVUJUWVBFIDw8IDEpIHwgMSk7CgogIGNvbnN0IEZsYXRUeXBlTWFzay5ub25OdWxsRW1wdHkoKQogICAgICA6IGJhc2UgPSBudWxsLAogICAgICAgIGZsYWdzID0gMDsKICBjb25zdCBGbGF0VHlwZU1hc2suZW1wdHkoKQogICAgICA6IGJhc2UgPSBudWxsLAogICAgICAgIGZsYWdzID0gMTsKCiAgRmxhdFR5cGVNYXNrLm5vbk51bGxFeGFjdChDbGFzc0VudGl0eSBiYXNlKSA6IHRoaXMuaW50ZXJuYWwoYmFzZSwgRVhBQ1QgPDwgMSk7CiAgRmxhdFR5cGVNYXNrLm5vbk51bGxTdWJjbGFzcyhDbGFzc0VudGl0eSBiYXNlKQogICAgICA6IHRoaXMuaW50ZXJuYWwoYmFzZSwgU1VCQ0xBU1MgPDwgMSk7CiAgRmxhdFR5cGVNYXNrLm5vbk51bGxTdWJ0eXBlKENsYXNzRW50aXR5IGJhc2UpCiAgICAgIDogdGhpcy5pbnRlcm5hbChiYXNlLCBTVUJUWVBFIDw8IDEpOwoKICBGbGF0VHlwZU1hc2suaW50ZXJuYWwodGhpcy5iYXNlLCB0aGlzLmZsYWdzKTsKCiAgLy8vIEVuc3VyZXMgdGhhdCB0aGUgZ2VuZXJhdGVkIG1hc2sgaXMgbm9ybWFsaXplZCwgaS5lLiwgYSBjYWxsIHRvCiAgLy8vIFtUeXBlTWFzay5hc3NlcnRJc05vcm1hbGl6ZWRdIHdpdGggdGhlIGZhY3RvcnkncyByZXN1bHQgcmV0dXJucyBgdHJ1ZWAuCiAgZmFjdG9yeSBGbGF0VHlwZU1hc2subm9ybWFsaXplZCgKICAgICAgQ2xhc3NFbnRpdHkgYmFzZSwgaW50IGZsYWdzLCBKQ2xvc2VkV29ybGQgd29ybGQpIHsKICAgIGlmICgoZmxhZ3MgPj4gMSkgPT0gRU1QVFkgfHwgKChmbGFncyA+PiAxKSA9PSBFWEFDVCkpIHsKICAgICAgcmV0dXJuIG5ldyBGbGF0VHlwZU1hc2suaW50ZXJuYWwoYmFzZSwgZmxhZ3MpOwogICAgfQogICAgaWYgKChmbGFncyA+PiAxKSA9PSBTVUJUWVBFKSB7CiAgICAgIGlmICghd29ybGQuY2xhc3NIaWVyYXJjaHkuaGFzQW55U3RyaWN0U3VidHlwZShiYXNlKSB8fAogICAgICAgICAgd29ybGQuY2xhc3NIaWVyYXJjaHkuaGFzT25seVN1YmNsYXNzZXMoYmFzZSkpIHsKICAgICAgICBmbGFncyA9IChmbGFncyAmIDB4MSkgfCAoU1VCQ0xBU1MgPDwgMSk7CiAgICAgIH0KICAgIH0KICAgIGlmICgoKGZsYWdzID4+IDEpID09IFNVQkNMQVNTKSAmJgogICAgICAgICF3b3JsZC5jbGFzc0hpZXJhcmNoeS5oYXNBbnlTdHJpY3RTdWJjbGFzcyhiYXNlKSkgewogICAgICBmbGFncyA9IChmbGFncyAmIDB4MSkgfCAoRVhBQ1QgPDwgMSk7CiAgICB9CiAgICBDb21tb25NYXNrcyBjb21tb25NYXNrcyA9IHdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CiAgICByZXR1cm4gY29tbW9uTWFza3MuZ2V0Q2FjaGVkTWFzaygKICAgICAgICBiYXNlLCBmbGFncywgKCkgPT4gbmV3IEZsYXRUeXBlTWFzay5pbnRlcm5hbChiYXNlLCBmbGFncykpOwogIH0KCiAgLy8vIERlc2VyaWFsaXplcyBhIFtGbGF0VHlwZU1hc2tdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgRmxhdFR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBDbGFzc0VudGl0eSBiYXNlID0gc291cmNlLnJlYWRDbGFzc09yTnVsbCgpOwogICAgaW50IGZsYWdzID0gc291cmNlLnJlYWRJbnQoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIENvbW1vbk1hc2tzIGNvbW1vbk1hc2tzID0gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbjsKICAgIHJldHVybiBjb21tb25NYXNrcy5nZXRDYWNoZWRNYXNrKAogICAgICAgIGJhc2UsIGZsYWdzLCAoKSA9PiBuZXcgRmxhdFR5cGVNYXNrLmludGVybmFsKGJhc2UsIGZsYWdzKSk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtGbGF0VHlwZU1hc2tdIHRvIFtzaW5rXS4KICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShUeXBlTWFza0tpbmQuZmxhdCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlQ2xhc3NPck51bGwoYmFzZSk7CiAgICBzaW5rLndyaXRlSW50KGZsYWdzKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBDbGFzc1F1ZXJ5IGdldCBfY2xhc3NRdWVyeSA9PiBpc0V4YWN0CiAgICAgID8gQ2xhc3NRdWVyeS5FWEFDVAogICAgICA6IChpc1N1YmNsYXNzID8gQ2xhc3NRdWVyeS5TVUJDTEFTUyA6IENsYXNzUXVlcnkuU1VCVFlQRSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gaXNFbXB0eU9yTnVsbCAmJiAhaXNOdWxsYWJsZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc051bGwgPT4gaXNFbXB0eU9yTnVsbCAmJiBpc051bGxhYmxlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW1wdHlPck51bGwgPT4gKGZsYWdzID4+IDEpID09IEVNUFRZOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRXhhY3QgPT4gKGZsYWdzID4+IDEpID09IEVYQUNUOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTnVsbGFibGUgPT4gKGZsYWdzICYgMSkgIT0gMDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNVbmlvbiA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnRhaW5lciA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1NldCA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc01hcCA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0RpY3Rpb25hcnkgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNGb3J3YXJkaW5nID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVmFsdWUgPT4gZmFsc2U7CgogIC8vIFRPRE8oa2FzcGVybCk6IEdldCByaWQgb2YgdGhlc2UuIFRoZXkgc2hvdWxkIG5vdCBiZSBhIHZpc2libGUKICAvLyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWNhdXNlIHRoZXkgbWFrZSBpdCBoYXJkIHRvIGFkZAogIC8vIHByb3BlciB1bmlvbiB0eXBlcyBpZiB3ZSBldmVyIHdhbnQgdG8uCiAgYm9vbCBnZXQgaXNTdWJjbGFzcyA9PiAoZmxhZ3MgPj4gMSkgPT0gU1VCQ0xBU1M7CiAgYm9vbCBnZXQgaXNTdWJ0eXBlID0+IChmbGFncyA+PiAxKSA9PSBTVUJUWVBFOwoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBudWxsYWJsZSgpIHsKICAgIHJldHVybiBpc051bGxhYmxlID8gdGhpcyA6IG5ldyBGbGF0VHlwZU1hc2suaW50ZXJuYWwoYmFzZSwgZmxhZ3MgfCAxKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIG5vbk51bGxhYmxlKCkgewogICAgcmV0dXJuIGlzTnVsbGFibGUgPyBuZXcgRmxhdFR5cGVNYXNrLmludGVybmFsKGJhc2UsIGZsYWdzICYgfjEpIDogdGhpczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnMoQ2xhc3NFbnRpdHkgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKGlzRW1wdHlPck51bGwpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoYmFzZSwgb3RoZXIpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChpc0V4YWN0KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAoaXNTdWJjbGFzcykgewogICAgICByZXR1cm4gY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJjbGFzc09mKG90aGVyLCBiYXNlKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChpc1N1YnR5cGUpOwogICAgICByZXR1cm4gY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJ0eXBlT2Yob3RoZXIsIGJhc2UpOwogICAgfQogIH0KCiAgYm9vbCBpc1NpbmdsZUltcGxlbWVudGF0aW9uT2YoQ2xhc3NFbnRpdHkgY2xzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIC8vIFNwZWNpYWwgY2FzZSBiYXNpYyB0eXBlcyBzbyB0aGF0LCBmb3IgZXhhbXBsZSwgSlNTdHJpbmcgaXMgdGhlCiAgICAvLyBzaW5nbGUgaW1wbGVtZW50YXRpb24gb2YgU3RyaW5nLgogICAgLy8gVGhlIGdlbmVyYWwgb3B0aW1pemF0aW9uIGlzIHRvIHJlYWxpemUgdGhlcmUgaXMgb25seSBvbmUgY2xhc3MgdGhhdAogICAgLy8gaW1wbGVtZW50cyBbYmFzZV0gYW5kIFtiYXNlXSBpcyBub3QgaW5zdGFudGlhdGVkLiBXZSBob3dldmVyIGRvCiAgICAvLyBub3QgdHJhY2sgY29ycmVjdGx5IHRoZSBsaXN0IG9mIHRydWx5IGluc3RhbnRpYXRlZCBjbGFzc2VzLgogICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMgPSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50czsKICAgIGlmIChjb250YWluc09ubHlTdHJpbmcoY2xvc2VkV29ybGQpKSB7CiAgICAgIHJldHVybiBjbHMgPT0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuc3RyaW5nQ2xhc3MgfHwKICAgICAgICAgIGNscyA9PSBjb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzOwogICAgfQogICAgaWYgKGNvbnRhaW5zT25seUJvb2woY2xvc2VkV29ybGQpKSB7CiAgICAgIHJldHVybiBjbHMgPT0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuYm9vbENsYXNzIHx8CiAgICAgICAgICBjbHMgPT0gY29tbW9uRWxlbWVudHMuanNCb29sQ2xhc3M7CiAgICB9CiAgICBpZiAoY29udGFpbnNPbmx5SW50KGNsb3NlZFdvcmxkKSkgewogICAgICByZXR1cm4gY2xzID09IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmludENsYXNzIHx8CiAgICAgICAgICBjbHMgPT0gY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcyB8fAogICAgICAgICAgY2xzID09IGNvbW1vbkVsZW1lbnRzLmpzUG9zaXRpdmVJbnRDbGFzcyB8fAogICAgICAgICAgY2xzID09IGNvbW1vbkVsZW1lbnRzLmpzVUludDMyQ2xhc3MgfHwKICAgICAgICAgIGNscyA9PSBjb21tb25FbGVtZW50cy5qc1VJbnQzMUNsYXNzOwogICAgfQogICAgaWYgKGNvbnRhaW5zT25seURvdWJsZShjbG9zZWRXb3JsZCkpIHsKICAgICAgcmV0dXJuIGNscyA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5kb3VibGVDbGFzcyB8fAogICAgICAgICAgY2xzID09IGNvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3M7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW5NYXNrKFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmIChpc0VtcHR5T3JOdWxsKSByZXR1cm4gaXNOdWxsYWJsZSA/IG90aGVyLmlzTnVsbGFibGUgOiB0cnVlOwogICAgLy8gVGhlIGVtcHR5IHR5cGUgY29udGFpbnMgbm8gY2xhc3Nlcy4KICAgIGlmIChvdGhlci5pc0VtcHR5T3JOdWxsKSByZXR1cm4gZmFsc2U7CiAgICAvLyBRdWljayBjaGVjayB3aGV0aGVyIHRvIGhhbmRsZSBudWxsLgogICAgaWYgKGlzTnVsbGFibGUgJiYgIW90aGVyLmlzTnVsbGFibGUpIHJldHVybiBmYWxzZTsKICAgIG90aGVyID0gVHlwZU1hc2subm9uRm9yd2FyZGluZ01hc2sob3RoZXIpOwogICAgLy8gSWYgb3RoZXIgaXMgdW5pb24sIGRlbGVnYXRlIHRvIFVuaW9uVHlwZU1hc2suY29udGFpbnNNYXNrLgogICAgaWYgKG90aGVyIGlzISBGbGF0VHlwZU1hc2spIHJldHVybiBvdGhlci5jb250YWluc01hc2sodGhpcywgY2xvc2VkV29ybGQpOwogICAgLy8gVGhlIG90aGVyIG11c3QgYmUgZmxhdCwgc28gY29tcGFyZSBiYXNlIGFuZCBmbGFncy4KICAgIEZsYXRUeXBlTWFzayBmbGF0T3RoZXIgPSBvdGhlcjsKICAgIENsYXNzRW50aXR5IG90aGVyQmFzZSA9IGZsYXRPdGhlci5iYXNlOwogICAgLy8gSWYgb3RoZXIgaXMgZXhhY3QsIGl0IG9ubHkgY29udGFpbnMgaXRzIGJhc2UuCiAgICAvLyBUT0RPKGhlcmh1dCk6IEdldCByaWQgb2YgaXNTaW5nbGVJbXBsZW1lbnRhdGlvbk9mLgogICAgaWYgKGZsYXRPdGhlci5pc0V4YWN0KSB7CiAgICAgIHJldHVybiAoaXNFeGFjdCAmJiBiYXNlID09IG90aGVyQmFzZSkgfHwKICAgICAgICAgIGlzU2luZ2xlSW1wbGVtZW50YXRpb25PZihvdGhlckJhc2UsIGNsb3NlZFdvcmxkKTsKICAgIH0KICAgIC8vIElmIG90aGVyIGlzIHN1YmNsYXNzLCB0aGlzIGhhcyB0byBiZSBzdWJjbGFzcywgYXMgd2VsbC4gVW5sZXNzCiAgICAvLyBmbGF0T3RoZXIuYmFzZSBjb3ZlcnMgYWxsIHN1YnR5cGVzIG9mIHRoaXMuIEN1cnJlbnRseSwgd2Ugb25seQogICAgLy8gY29uc2lkZXIgb2JqZWN0IHRvIGJlaGF2ZSB0aGF0IHdheS4KICAgIC8vIFRPRE8oaGVyaHV0KTogQWRkIGNoZWNrIHdoZXRoZXIgZmxhdE90aGVyLmJhc2UgaXMgc3VwZXJjbGFzcyBvZgogICAgLy8gICAgICAgICAgICAgICBhbGwgc3ViY2xhc3NlcyBvZiB0aGlzLmJhc2UuCiAgICBpZiAoZmxhdE90aGVyLmlzU3ViY2xhc3MpIHsKICAgICAgaWYgKGlzU3VidHlwZSkKICAgICAgICByZXR1cm4gKG90aGVyQmFzZSA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcyk7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc1N1YmNsYXNzT2YoYmFzZSwgb3RoZXJCYXNlKTsKICAgIH0KICAgIGFzc2VydChmbGF0T3RoZXIuaXNTdWJ0eXBlKTsKICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBUeXBlTWFzayBzYXRpc2ZpZXMgb3RoZXJCYXNlJ3MgaW50ZXJmYWNlLgogICAgcmV0dXJuIHNhdGlzZmllcyhvdGhlckJhc2UsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNNYXNrKFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBvdGhlci5pc0luTWFzayh0aGlzLCBjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zT25seUludChKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzID0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHM7CiAgICByZXR1cm4gYmFzZSA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5pbnRDbGFzcyB8fAogICAgICAgIGJhc2UgPT0gY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcyB8fAogICAgICAgIGJhc2UgPT0gY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzIHx8CiAgICAgICAgYmFzZSA9PSBjb21tb25FbGVtZW50cy5qc1VJbnQzMUNsYXNzIHx8CiAgICAgICAgYmFzZSA9PSBjb21tb25FbGVtZW50cy5qc1VJbnQzMkNsYXNzOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc09ubHlEb3VibGUoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gYmFzZSA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5kb3VibGVDbGFzcyB8fAogICAgICAgIGJhc2UgPT0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNPbmx5TnVtKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGNvbnRhaW5zT25seUludChjbG9zZWRXb3JsZCkgfHwKICAgICAgICBjb250YWluc09ubHlEb3VibGUoY2xvc2VkV29ybGQpIHx8CiAgICAgICAgYmFzZSA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5udW1DbGFzcyB8fAogICAgICAgIGJhc2UgPT0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuanNOdW1iZXJDbGFzczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNPbmx5Qm9vbChKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBiYXNlID09IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmJvb2xDbGFzcyB8fAogICAgICAgIGJhc2UgPT0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuanNCb29sQ2xhc3M7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zT25seVN0cmluZyhKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBiYXNlID09IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLnN0cmluZ0NsYXNzIHx8CiAgICAgICAgYmFzZSA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc09ubHkoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gYmFzZSA9PSBjbHM7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHNhdGlzZmllcyhDbGFzc0VudGl0eSBjbHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKGlzRW1wdHlPck51bGwpIHJldHVybiBmYWxzZTsKICAgIGlmIChjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc1N1YnR5cGVPZihiYXNlLCBjbHMpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IHNpbmdsZUNsYXNzKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKGlzRW1wdHlPck51bGwpIHJldHVybiBudWxsOwogICAgaWYgKGlzTnVsbGFibGUpIHJldHVybiBudWxsOyAvLyBJdCBpcyBOdWxsIGFuZCBzb21lIG90aGVyIGNsYXNzLgogICAgaWYgKGlzRXhhY3QpIHsKICAgICAgcmV0dXJuIGJhc2U7CiAgICB9IGVsc2UgaWYgKGlzU3ViY2xhc3MpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5Lmhhc0FueVN0cmljdFN1YmNsYXNzKGJhc2UpCiAgICAgICAgICA/IG51bGwKICAgICAgICAgIDogYmFzZTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChpc1N1YnR5cGUpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNBbGwoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoaXNFbXB0eU9yTnVsbCB8fCBpc0V4YWN0KSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gaWRlbnRpY2FsKGJhc2UsIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHVuaW9uKFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGFzc2VydChvdGhlciAhPSBudWxsKTsKICAgIGFzc2VydChUeXBlTWFzay5hc3NlcnRJc05vcm1hbGl6ZWQodGhpcywgY2xvc2VkV29ybGQpKTsKICAgIGFzc2VydChUeXBlTWFzay5hc3NlcnRJc05vcm1hbGl6ZWQob3RoZXIsIGNsb3NlZFdvcmxkKSk7CiAgICBpZiAob3RoZXIgaXMhIEZsYXRUeXBlTWFzaykgcmV0dXJuIG90aGVyLnVuaW9uKHRoaXMsIGNsb3NlZFdvcmxkKTsKICAgIEZsYXRUeXBlTWFzayBmbGF0T3RoZXIgPSBvdGhlcjsKICAgIGlmIChpc0VtcHR5T3JOdWxsKSB7CiAgICAgIHJldHVybiBpc051bGxhYmxlID8gZmxhdE90aGVyLm51bGxhYmxlKCkgOiBmbGF0T3RoZXI7CiAgICB9IGVsc2UgaWYgKGZsYXRPdGhlci5pc0VtcHR5T3JOdWxsKSB7CiAgICAgIHJldHVybiBmbGF0T3RoZXIuaXNOdWxsYWJsZSA/IG51bGxhYmxlKCkgOiB0aGlzOwogICAgfSBlbHNlIGlmIChiYXNlID09IGZsYXRPdGhlci5iYXNlKSB7CiAgICAgIHJldHVybiB1bmlvblNhbWUoZmxhdE90aGVyLCBjbG9zZWRXb3JsZCk7CiAgICB9IGVsc2UgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzU3ViY2xhc3NPZihmbGF0T3RoZXIuYmFzZSwgYmFzZSkpIHsKICAgICAgcmV0dXJuIHVuaW9uU3RyaWN0U3ViY2xhc3MoZmxhdE90aGVyLCBjbG9zZWRXb3JsZCk7CiAgICB9IGVsc2UgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzU3ViY2xhc3NPZihiYXNlLCBmbGF0T3RoZXIuYmFzZSkpIHsKICAgICAgcmV0dXJuIGZsYXRPdGhlci51bmlvblN0cmljdFN1YmNsYXNzKHRoaXMsIGNsb3NlZFdvcmxkKTsKICAgIH0gZWxzZSBpZiAoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJ0eXBlT2YoZmxhdE90aGVyLmJhc2UsIGJhc2UpKSB7CiAgICAgIHJldHVybiB1bmlvblN0cmljdFN1YnR5cGUoZmxhdE90aGVyLCBjbG9zZWRXb3JsZCk7CiAgICB9IGVsc2UgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzU3VidHlwZU9mKGJhc2UsIGZsYXRPdGhlci5iYXNlKSkgewogICAgICByZXR1cm4gZmxhdE90aGVyLnVuaW9uU3RyaWN0U3VidHlwZSh0aGlzLCBjbG9zZWRXb3JsZCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IFVuaW9uVHlwZU1hc2suX2ludGVybmFsKDxGbGF0VHlwZU1hc2s+W3RoaXMsIGZsYXRPdGhlcl0pOwogICAgfQogIH0KCiAgVHlwZU1hc2sgdW5pb25TYW1lKEZsYXRUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBhc3NlcnQoYmFzZSA9PSBvdGhlci5iYXNlKTsKICAgIGFzc2VydChUeXBlTWFzay5hc3NlcnRJc05vcm1hbGl6ZWQodGhpcywgY2xvc2VkV29ybGQpKTsKICAgIGFzc2VydChUeXBlTWFzay5hc3NlcnRJc05vcm1hbGl6ZWQob3RoZXIsIGNsb3NlZFdvcmxkKSk7CiAgICAvLyBUaGUgdHdvIG1hc2tzIHNoYXJlIHRoZSBiYXNlIHR5cGUsIHNvIHdlIG11c3QgY2hvc2UgdGhlIGxlYXN0CiAgICAvLyBjb25zdHJhaW5pbmcga2luZCAodGhlIGhpZ2hlc3QpIG9mIHRoZSB0d28uIElmIGVpdGhlciBvbmUgb2YKICAgIC8vIHRoZSBtYXNrcyBhcmUgbnVsbGFibGUgdGhlIHJlc3VsdCBzaG91bGQgYmUgbnVsbGFibGUgdG9vLgogICAgLy8gQXMgYm90aCBtYXNrcyBhcmUgbm9ybWFsaXplZCwgdGhlIHJlc3VsdCB3aWxsIGJlLCB0b28uCiAgICBpbnQgY29tYmluZWQgPSAoZmxhZ3MgPiBvdGhlci5mbGFncykKICAgICAgICA/IGZsYWdzIHwgKG90aGVyLmZsYWdzICYgMSkKICAgICAgICA6IG90aGVyLmZsYWdzIHwgKGZsYWdzICYgMSk7CiAgICBpZiAoZmxhZ3MgPT0gY29tYmluZWQpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgaWYgKG90aGVyLmZsYWdzID09IGNvbWJpbmVkKSB7CiAgICAgIHJldHVybiBvdGhlcjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgRmxhdFR5cGVNYXNrLm5vcm1hbGl6ZWQoYmFzZSwgY29tYmluZWQsIGNsb3NlZFdvcmxkKTsKICAgIH0KICB9CgogIFR5cGVNYXNrIHVuaW9uU3RyaWN0U3ViY2xhc3MoRmxhdFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGFzc2VydChiYXNlICE9IG90aGVyLmJhc2UpOwogICAgYXNzZXJ0KGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzU3ViY2xhc3NPZihvdGhlci5iYXNlLCBiYXNlKSk7CiAgICBhc3NlcnQoVHlwZU1hc2suYXNzZXJ0SXNOb3JtYWxpemVkKHRoaXMsIGNsb3NlZFdvcmxkKSk7CiAgICBhc3NlcnQoVHlwZU1hc2suYXNzZXJ0SXNOb3JtYWxpemVkKG90aGVyLCBjbG9zZWRXb3JsZCkpOwogICAgaW50IGNvbWJpbmVkOwogICAgaWYgKChpc0V4YWN0ICYmIG90aGVyLmlzRXhhY3QpIHx8CiAgICAgICAgYmFzZSA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcykgewogICAgICAvLyBTaW5jZSB0aGUgb3RoZXIgbWFzayBpcyBhIHN1YmNsYXNzIG9mIHRoaXMgbWFzaywgd2UgbmVlZCB0aGUKICAgICAgLy8gcmVzdWx0aW5nIHVuaW9uIHRvIGJlIGEgc3ViY2xhc3MgdG9vLiBJZiBlaXRoZXIgb25lIG9mIHRoZQogICAgICAvLyBtYXNrcyBhcmUgbnVsbGFibGUgdGhlIHJlc3VsdCBzaG91bGQgYmUgbnVsbGFibGUgdG9vLgogICAgICBjb21iaW5lZCA9IChTVUJDTEFTUyA8PCAxKSB8ICgoZmxhZ3MgfCBvdGhlci5mbGFncykgJiAxKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEJvdGggbWFza3MgYXJlIGF0IGxlYXN0IHN1YmNsYXNzIG1hc2tzLCBzbyB3ZSBwaWNrIHRoZSBsZWFzdAogICAgICAvLyBjb25zdHJhaW5pbmcga2luZCAodGhlIGhpZ2hlc3QpIG9mIHRoZSB0d28uIElmIGVpdGhlciBvbmUgb2YKICAgICAgLy8gdGhlIG1hc2tzIGFyZSBudWxsYWJsZSB0aGUgcmVzdWx0IHNob3VsZCBiZSBudWxsYWJsZSB0b28uCiAgICAgIGNvbWJpbmVkID0gKGZsYWdzID4gb3RoZXIuZmxhZ3MpCiAgICAgICAgICA/IGZsYWdzIHwgKG90aGVyLmZsYWdzICYgMSkKICAgICAgICAgIDogb3RoZXIuZmxhZ3MgfCAoZmxhZ3MgJiAxKTsKICAgIH0KICAgIC8vIElmIHdlIHdlYWtlbiB0aGUgY29uc3RyYWludCBvbiB0aGlzIHR5cGUsIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQKICAgIC8vIHRoZSByZXN1bHQgaXMgbm9ybWFsaXplZC4KICAgIHJldHVybiAoZmxhZ3MgIT0gY29tYmluZWQpCiAgICAgICAgPyBuZXcgRmxhdFR5cGVNYXNrLm5vcm1hbGl6ZWQoYmFzZSwgY29tYmluZWQsIGNsb3NlZFdvcmxkKQogICAgICAgIDogdGhpczsKICB9CgogIFR5cGVNYXNrIHVuaW9uU3RyaWN0U3VidHlwZShGbGF0VHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgYXNzZXJ0KGJhc2UgIT0gb3RoZXIuYmFzZSk7CiAgICBhc3NlcnQoIWNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzU3ViY2xhc3NPZihvdGhlci5iYXNlLCBiYXNlKSk7CiAgICBhc3NlcnQoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJ0eXBlT2Yob3RoZXIuYmFzZSwgYmFzZSkpOwogICAgYXNzZXJ0KFR5cGVNYXNrLmFzc2VydElzTm9ybWFsaXplZCh0aGlzLCBjbG9zZWRXb3JsZCkpOwogICAgYXNzZXJ0KFR5cGVNYXNrLmFzc2VydElzTm9ybWFsaXplZChvdGhlciwgY2xvc2VkV29ybGQpKTsKICAgIC8vIFNpbmNlIHRoZSBvdGhlciBtYXNrIGlzIGEgc3VidHlwZSBvZiB0aGlzIG1hc2ssIHdlIG5lZWQgdGhlCiAgICAvLyByZXN1bHRpbmcgdW5pb24gdG8gYmUgYSBzdWJ0eXBlIHRvby4gSWYgZWl0aGVyIG9uZSBvZiB0aGUgbWFza3MKICAgIC8vIGFyZSBudWxsYWJsZSB0aGUgcmVzdWx0IHNob3VsZCBiZSBudWxsYWJsZSB0b28uCiAgICBpbnQgY29tYmluZWQgPSAoU1VCVFlQRSA8PCAxKSB8ICgoZmxhZ3MgfCBvdGhlci5mbGFncykgJiAxKTsKICAgIC8vIFdlIGtub3cgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHN1YnR5cGUsIFtvdGhlci5iYXNlXSwgc28gbm8gbmVlZAogICAgLy8gdG8gbm9ybWFsaXplLgogICAgcmV0dXJuIChmbGFncyAhPSBjb21iaW5lZCkKICAgICAgICA/IG5ldyBGbGF0VHlwZU1hc2subm9ybWFsaXplZChiYXNlLCBjb21iaW5lZCwgY2xvc2VkV29ybGQpCiAgICAgICAgOiB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgaW50ZXJzZWN0aW9uKFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGFzc2VydChvdGhlciAhPSBudWxsKTsKICAgIGlmIChvdGhlciBpcyEgRmxhdFR5cGVNYXNrKSByZXR1cm4gb3RoZXIuaW50ZXJzZWN0aW9uKHRoaXMsIGNsb3NlZFdvcmxkKTsKICAgIGFzc2VydChUeXBlTWFzay5hc3NlcnRJc05vcm1hbGl6ZWQodGhpcywgY2xvc2VkV29ybGQpKTsKICAgIGFzc2VydChUeXBlTWFzay5hc3NlcnRJc05vcm1hbGl6ZWQob3RoZXIsIGNsb3NlZFdvcmxkKSk7CiAgICBGbGF0VHlwZU1hc2sgZmxhdE90aGVyID0gb3RoZXI7CgogICAgQ2xhc3NFbnRpdHkgb3RoZXJCYXNlID0gZmxhdE90aGVyLmJhc2U7CgogICAgYm9vbCBpbmNsdWRlTnVsbCA9IGlzTnVsbGFibGUgJiYgZmxhdE90aGVyLmlzTnVsbGFibGU7CgogICAgaWYgKGlzRW1wdHlPck51bGwpIHsKICAgICAgcmV0dXJuIGluY2x1ZGVOdWxsID8gdGhpcyA6IG5vbk51bGxhYmxlKCk7CiAgICB9IGVsc2UgaWYgKGZsYXRPdGhlci5pc0VtcHR5T3JOdWxsKSB7CiAgICAgIHJldHVybiBpbmNsdWRlTnVsbCA/IG90aGVyIDogb3RoZXIubm9uTnVsbGFibGUoKTsKICAgIH0KCiAgICBTdWJjbGFzc1Jlc3VsdCByZXN1bHQgPSBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeQogICAgICAgIC5jb21tb25TdWJjbGFzc2VzKGJhc2UsIF9jbGFzc1F1ZXJ5LCBvdGhlckJhc2UsIGZsYXRPdGhlci5fY2xhc3NRdWVyeSk7CgogICAgc3dpdGNoIChyZXN1bHQua2luZCkgewogICAgICBjYXNlIFN1YmNsYXNzUmVzdWx0S2luZC5FTVBUWToKICAgICAgICByZXR1cm4gaW5jbHVkZU51bGwKICAgICAgICAgICAgPyBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLm51bGxUeXBlCiAgICAgICAgICAgIDogY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5lbXB0eVR5cGU7CiAgICAgIGNhc2UgU3ViY2xhc3NSZXN1bHRLaW5kLkVYQUNUMToKICAgICAgICBhc3NlcnQoaXNFeGFjdCk7CiAgICAgICAgcmV0dXJuIGluY2x1ZGVOdWxsID8gdGhpcyA6IG5vbk51bGxhYmxlKCk7CiAgICAgIGNhc2UgU3ViY2xhc3NSZXN1bHRLaW5kLkVYQUNUMjoKICAgICAgICBhc3NlcnQob3RoZXIuaXNFeGFjdCk7CiAgICAgICAgcmV0dXJuIGluY2x1ZGVOdWxsID8gb3RoZXIgOiBvdGhlci5ub25OdWxsYWJsZSgpOwogICAgICBjYXNlIFN1YmNsYXNzUmVzdWx0S2luZC5TVUJDTEFTUzE6CiAgICAgICAgYXNzZXJ0KGlzU3ViY2xhc3MpOwogICAgICAgIHJldHVybiBpbmNsdWRlTnVsbCA/IHRoaXMgOiBub25OdWxsYWJsZSgpOwogICAgICBjYXNlIFN1YmNsYXNzUmVzdWx0S2luZC5TVUJDTEFTUzI6CiAgICAgICAgYXNzZXJ0KGZsYXRPdGhlci5pc1N1YmNsYXNzKTsKICAgICAgICByZXR1cm4gaW5jbHVkZU51bGwgPyBvdGhlciA6IG90aGVyLm5vbk51bGxhYmxlKCk7CiAgICAgIGNhc2UgU3ViY2xhc3NSZXN1bHRLaW5kLlNVQlRZUEUxOgogICAgICAgIGFzc2VydChpc1N1YnR5cGUpOwogICAgICAgIHJldHVybiBpbmNsdWRlTnVsbCA/IHRoaXMgOiBub25OdWxsYWJsZSgpOwogICAgICBjYXNlIFN1YmNsYXNzUmVzdWx0S2luZC5TVUJUWVBFMjoKICAgICAgICBhc3NlcnQoZmxhdE90aGVyLmlzU3VidHlwZSk7CiAgICAgICAgcmV0dXJuIGluY2x1ZGVOdWxsID8gb3RoZXIgOiBvdGhlci5ub25OdWxsYWJsZSgpOwogICAgICBjYXNlIFN1YmNsYXNzUmVzdWx0S2luZC5TRVQ6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgaWYgKHJlc3VsdC5jbGFzc2VzLmlzRW1wdHkpIHsKICAgICAgICAgIHJldHVybiBpbmNsdWRlTnVsbAogICAgICAgICAgICAgID8gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5udWxsVHlwZQogICAgICAgICAgICAgIDogY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5lbXB0eVR5cGU7CiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuY2xhc3Nlcy5sZW5ndGggPT0gMSkgewogICAgICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gcmVzdWx0LmNsYXNzZXMuZmlyc3Q7CiAgICAgICAgICByZXR1cm4gaW5jbHVkZU51bGwKICAgICAgICAgICAgICA/IG5ldyBUeXBlTWFzay5zdWJjbGFzcyhjbHMsIGNsb3NlZFdvcmxkKQogICAgICAgICAgICAgIDogbmV3IFR5cGVNYXNrLm5vbk51bGxTdWJjbGFzcyhjbHMsIGNsb3NlZFdvcmxkKTsKICAgICAgICB9CgogICAgICAgIExpc3Q8RmxhdFR5cGVNYXNrPiBtYXNrcyA9IDxGbGF0VHlwZU1hc2s+W107CiAgICAgICAgaWYgKGluY2x1ZGVOdWxsKSB7CiAgICAgICAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiByZXN1bHQuY2xhc3NlcykgewogICAgICAgICAgICBtYXNrcy5hZGQobmV3IFR5cGVNYXNrLnN1YmNsYXNzKGNscywgY2xvc2VkV29ybGQpKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gcmVzdWx0LmNsYXNzZXMpIHsKICAgICAgICAgICAgbWFza3MuYWRkKG5ldyBUeXBlTWFzay5ub25OdWxsU3ViY2xhc3MoY2xzLCBjbG9zZWRXb3JsZCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobWFza3MubGVuZ3RoID4gVW5pb25UeXBlTWFzay5NQVhfVU5JT05fTEVOR1RIKSB7CiAgICAgICAgICByZXR1cm4gVW5pb25UeXBlTWFzay5mbGF0dGVuKG1hc2tzLCBjbG9zZWRXb3JsZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgVW5pb25UeXBlTWFzay5faW50ZXJuYWwobWFza3MpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Rpc2pvaW50KFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmIChvdGhlciBpcyEgRmxhdFR5cGVNYXNrKSByZXR1cm4gb3RoZXIuaXNEaXNqb2ludCh0aGlzLCBjbG9zZWRXb3JsZCk7CiAgICBGbGF0VHlwZU1hc2sgZmxhdE90aGVyID0gb3RoZXI7CgogICAgaWYgKGlzTnVsbGFibGUgJiYgZmxhdE90aGVyLmlzTnVsbGFibGUpIHJldHVybiBmYWxzZTsKICAgIGlmIChpc0VtcHR5T3JOdWxsIHx8IGZsYXRPdGhlci5pc0VtcHR5T3JOdWxsKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChiYXNlID09IGZsYXRPdGhlci5iYXNlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoaXNFeGFjdCAmJiBmbGF0T3RoZXIuaXNFeGFjdCkgcmV0dXJuIHRydWU7CgogICAgaWYgKGlzRXhhY3QpIHJldHVybiAhZmxhdE90aGVyLmNvbnRhaW5zKGJhc2UsIGNsb3NlZFdvcmxkKTsKICAgIGlmIChmbGF0T3RoZXIuaXNFeGFjdCkgcmV0dXJuICFjb250YWlucyhmbGF0T3RoZXIuYmFzZSwgY2xvc2VkV29ybGQpOwoKICAgIC8vIE5vcm1hbGl6YXRpb24gZ3VhcmFudGVlcyB0aGF0IGlzRXhhY3QgPT09ICFpc1N1YmNsYXNzICYmICFpc1N1YnR5cGUuCiAgICAvLyBCb3RoIGFyZSBzdWJjbGFzcyBvciBzdWJ0eXBlIG1hc2tzLCBzbyBpZiB0aGVyZSBpcyBhIHN1YmNsYXNzCiAgICAvLyByZWxhdGlvbnNoaXAsIHRoZXkgYXJlIG5vdCBkaXNqb2ludC4KICAgIGlmIChjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc1N1YmNsYXNzT2YoZmxhdE90aGVyLmJhc2UsIGJhc2UpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc1N1YmNsYXNzT2YoYmFzZSwgZmxhdE90aGVyLmJhc2UpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBUd28gZGlmZmVyZW50IGJhc2UgY2xhc3NlcyBoYXZlIG5vIGNvbW1vbiBzdWJjbGFzcyB1bmxlc3Mgb25lIGlzIGEKICAgIC8vIHN1YmNsYXNzIG9mIHRoZSBvdGhlciAoY2hlY2tlZCBhYm92ZSkuCiAgICBpZiAoaXNTdWJjbGFzcyAmJiBmbGF0T3RoZXIuaXNTdWJjbGFzcykgcmV0dXJuIHRydWU7CgogICAgcmV0dXJuIF9pc0Rpc2pvaW50SGVscGVyKHRoaXMsIGZsYXRPdGhlciwgY2xvc2VkV29ybGQpOwogIH0KCiAgc3RhdGljIGJvb2wgX2lzRGlzam9pbnRIZWxwZXIoCiAgICAgIEZsYXRUeXBlTWFzayBhLCBGbGF0VHlwZU1hc2sgYiwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoIWEuaXNTdWJjbGFzcyAmJiBiLmlzU3ViY2xhc3MpIHsKICAgICAgcmV0dXJuIF9pc0Rpc2pvaW50SGVscGVyKGIsIGEsIGNsb3NlZFdvcmxkKTsKICAgIH0KICAgIGFzc2VydChhLmlzU3ViY2xhc3MgfHwgYS5pc1N1YnR5cGUpOwogICAgYXNzZXJ0KGIuaXNTdWJ0eXBlKTsKICAgIHZhciBlbGVtZW50cyA9IGEuaXNTdWJjbGFzcwogICAgICAgID8gY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuc3RyaWN0U3ViY2xhc3Nlc09mKGEuYmFzZSkKICAgICAgICA6IGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LnN0cmljdFN1YnR5cGVzT2YoYS5iYXNlKTsKICAgIGZvciAodmFyIGVsZW1lbnQgaW4gZWxlbWVudHMpIHsKICAgICAgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzU3VidHlwZU9mKGVsZW1lbnQsIGIuYmFzZSkpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgVHlwZU1hc2sgaW50ZXJzZWN0aW9uU2FtZShGbGF0VHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgYXNzZXJ0KGJhc2UgPT0gb3RoZXIuYmFzZSk7CiAgICAvLyBUaGUgdHdvIG1hc2tzIHNoYXJlIHRoZSBiYXNlIHR5cGUsIHNvIHdlIG11c3QgY2hvc2UgdGhlIG1vc3QKICAgIC8vIGNvbnN0cmFpbmluZyBraW5kICh0aGUgbG93ZXN0KSBvZiB0aGUgdHdvLiBPbmx5IGlmIGJvdGggbWFza3MKICAgIC8vIGFyZSBudWxsYWJsZSwgd2lsbCB0aGUgcmVzdWx0IGJlIG51bGxhYmxlIHRvby4KICAgIC8vIFRoZSByZXN1bHQgd2lsbCBiZSBub3JtYWxpemVkLCBhcyB0aGUgdHdvIGlucHV0cyBhcmUgbm9ybWFsaXplZCwgdG9vLgogICAgaW50IGNvbWJpbmVkID0gKGZsYWdzIDwgb3RoZXIuZmxhZ3MpCiAgICAgICAgPyBmbGFncyAmICgob3RoZXIuZmxhZ3MgJiAxKSB8IH4xKQogICAgICAgIDogb3RoZXIuZmxhZ3MgJiAoKGZsYWdzICYgMSkgfCB+MSk7CiAgICBpZiAoZmxhZ3MgPT0gY29tYmluZWQpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgaWYgKG90aGVyLmZsYWdzID09IGNvbWJpbmVkKSB7CiAgICAgIHJldHVybiBvdGhlcjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgRmxhdFR5cGVNYXNrLm5vcm1hbGl6ZWQoYmFzZSwgY29tYmluZWQsIGNsb3NlZFdvcmxkKTsKICAgIH0KICB9CgogIFR5cGVNYXNrIGludGVyc2VjdGlvblN0cmljdFN1YmNsYXNzKAogICAgICBGbGF0VHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgYXNzZXJ0KGJhc2UgIT0gb3RoZXIuYmFzZSk7CiAgICBhc3NlcnQoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJjbGFzc09mKG90aGVyLmJhc2UsIGJhc2UpKTsKICAgIC8vIElmIHRoaXMgbWFzayBpc24ndCBhdCBsZWFzdCBhIHN1YmNsYXNzIG1hc2ssIHRoZW4gdGhlCiAgICAvLyBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgb3RoZXIgbWFzayBpcyBlbXB0eS4KICAgIGlmIChpc0V4YWN0KSByZXR1cm4gaW50ZXJzZWN0aW9uRW1wdHkob3RoZXIpOwogICAgLy8gT25seSB0aGUgb3RoZXIgbWFzayBwdXRzIGNvbnN0cmFpbnRzIG9uIHRoZSBpbnRlcnNlY3Rpb24gbWFzaywKICAgIC8vIHNvIGJhc2UgdGhlIGNvbWJpbmVkIGZsYWdzIG9uIHRoZSBvdGhlciBtYXNrLiBPbmx5IGlmIGJvdGgKICAgIC8vIG1hc2tzIGFyZSBudWxsYWJsZSwgd2lsbCB0aGUgcmVzdWx0IGJlIG51bGxhYmxlIHRvby4KICAgIC8vIFRoZSByZXN1bHQgaXMgZ3VhcmFudGVlZCB0byBiZSBub3JtYWxpemVkLCBhcyB0aGUgb3RoZXIgdHlwZQogICAgLy8gd2FzIG5vcm1hbGl6ZWQuCiAgICBpbnQgY29tYmluZWQgPSBvdGhlci5mbGFncyAmICgoZmxhZ3MgJiAxKSB8IH4xKTsKICAgIGlmIChvdGhlci5mbGFncyA9PSBjb21iaW5lZCkgewogICAgICByZXR1cm4gb3RoZXI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IEZsYXRUeXBlTWFzay5ub3JtYWxpemVkKG90aGVyLmJhc2UsIGNvbWJpbmVkLCBjbG9zZWRXb3JsZCk7CiAgICB9CiAgfQoKICBUeXBlTWFzayBpbnRlcnNlY3Rpb25FbXB0eShGbGF0VHlwZU1hc2sgb3RoZXIpIHsKICAgIHJldHVybiBpc051bGxhYmxlICYmIG90aGVyLmlzTnVsbGFibGUKICAgICAgICA/IG5ldyBUeXBlTWFzay5lbXB0eSgpCiAgICAgICAgOiBuZXcgVHlwZU1hc2subm9uTnVsbEVtcHR5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNhbkhpdChNZW1iZXJFbnRpdHkgZWxlbWVudCwgTmFtZSBuYW1lLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzID0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHM7CiAgICBhc3NlcnQoZWxlbWVudC5uYW1lID09IG5hbWUudGV4dCk7CiAgICBpZiAoaXNFbXB0eSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGlzTnVsbCkgewogICAgICByZXR1cm4gY2xvc2VkV29ybGQuaGFzRWxlbWVudEluKAogICAgICAgICAgY29tbW9uRWxlbWVudHMuanNOdWxsQ2xhc3MsIG5hbWUsIGVsZW1lbnQpOwogICAgfQoKICAgIENsYXNzRW50aXR5IG90aGVyID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzczsKICAgIGlmIChvdGhlciA9PSBjb21tb25FbGVtZW50cy5qc051bGxDbGFzcykgewogICAgICByZXR1cm4gaXNOdWxsYWJsZTsKICAgIH0gZWxzZSBpZiAoaXNFeGFjdCkgewogICAgICByZXR1cm4gY2xvc2VkV29ybGQuaGFzRWxlbWVudEluKGJhc2UsIG5hbWUsIGVsZW1lbnQpOwogICAgfSBlbHNlIGlmIChpc1N1YmNsYXNzKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5oYXNFbGVtZW50SW4oYmFzZSwgbmFtZSwgZWxlbWVudCkgfHwKICAgICAgICAgIGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzU3ViY2xhc3NPZihvdGhlciwgYmFzZSkgfHwKICAgICAgICAgIGNsb3NlZFdvcmxkLmhhc0FueVN1YmNsYXNzVGhhdE1peGVzKGJhc2UsIG90aGVyKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChpc1N1YnR5cGUpOwogICAgICBib29sIHJlc3VsdCA9IGNsb3NlZFdvcmxkLmhhc0VsZW1lbnRJbihiYXNlLCBuYW1lLCBlbGVtZW50KSB8fAogICAgICAgICAgY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJ0eXBlT2Yob3RoZXIsIGJhc2UpIHx8CiAgICAgICAgICBjbG9zZWRXb3JsZC5oYXNBbnlTdWJjbGFzc1RoYXRJbXBsZW1lbnRzKG90aGVyLCBiYXNlKSB8fAogICAgICAgICAgY2xvc2VkV29ybGQuaGFzQW55U3ViY2xhc3NPZk1peGluVXNlVGhhdEltcGxlbWVudHMob3RoZXIsIGJhc2UpOwogICAgICBpZiAocmVzdWx0KSByZXR1cm4gdHJ1ZTsKICAgICAgLy8gSWYgdGhlIGNsYXNzIGlzIHVzZWQgYXMgYSBtaXhpbiwgd2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgZWxlbWVudAogICAgICAvLyBjYW4gYmUgaGl0IGZyb20gYW55IG9mIHRoZSBtaXhpbiBhcHBsaWNhdGlvbnMuCiAgICAgIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBtaXhpblVzZXMgPSBjbG9zZWRXb3JsZC5taXhpblVzZXNPZihiYXNlKTsKICAgICAgcmV0dXJuIG1peGluVXNlcy5hbnkoKG1peGluQXBwbGljYXRpb24pID0+CiAgICAgICAgICBjbG9zZWRXb3JsZC5oYXNFbGVtZW50SW4obWl4aW5BcHBsaWNhdGlvbiwgbmFtZSwgZWxlbWVudCkgfHwKICAgICAgICAgIGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzU3ViY2xhc3NPZihvdGhlciwgbWl4aW5BcHBsaWNhdGlvbikgfHwKICAgICAgICAgIGNsb3NlZFdvcmxkLmhhc0FueVN1YmNsYXNzVGhhdE1peGVzKG1peGluQXBwbGljYXRpb24sIG90aGVyKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG5lZWRzTm9TdWNoTWV0aG9kSGFuZGxpbmcoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBjb3ZhcmlhbnQgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICAvLyBBIGNhbGwgb24gYW4gZW1wdHkgdHlwZSBtYXNrIGlzIGVpdGhlciBkZWFkIGNvZGUsIG9yIGEgY2FsbCBvbgogICAgLy8gYG51bGxgLgogICAgaWYgKGlzRW1wdHlPck51bGwpIHJldHVybiBmYWxzZTsKICAgIC8vIEEgY2FsbCBvbiBhbiBleGFjdCBtYXNrIGZvciBhbiBhYnN0cmFjdCBjbGFzcyBpcyBkZWFkIGNvZGUuCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBIHR5cGUgbWFzayBjYW5ub3QgYmUgYWJzdHJhY3QuIFJlbW92ZSB0aGUgbmVlZAogICAgLy8gZm9yIHRoaXMgbm9pc2UgKGN1cnJlbnRseSB1c2VkIGZvciBzdXBlci1jYWxscyBpbiBpbmZlcmVuY2UgYW5kIG1pcnJvcgogICAgLy8gdXNhZ2UpLgogICAgaWYgKGlzRXhhY3QgJiYgYmFzZS5pc0Fic3RyYWN0KSByZXR1cm4gZmFsc2U7CgogICAgcmV0dXJuIGNsb3NlZFdvcmxkLm5lZWRzTm9TdWNoTWV0aG9kKGJhc2UsIHNlbGVjdG9yLCBfY2xhc3NRdWVyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXJFbnRpdHkgbG9jYXRlU2luZ2xlTWVtYmVyKFNlbGVjdG9yIHNlbGVjdG9yLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmIChpc0VtcHR5T3JOdWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChjbG9zZWRXb3JsZC5pbmNsdWRlc0Nsb3N1cmVDYWxsKHNlbGVjdG9yLCB0aGlzKSkgcmV0dXJuIG51bGw7CiAgICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IHRhcmdldHMgPSBjbG9zZWRXb3JsZC5sb2NhdGVNZW1iZXJzKHNlbGVjdG9yLCB0aGlzKTsKICAgIGlmICh0YXJnZXRzLmxlbmd0aCAhPSAxKSByZXR1cm4gbnVsbDsKICAgIE1lbWJlckVudGl0eSByZXN1bHQgPSB0YXJnZXRzLmZpcnN0OwogICAgQ2xhc3NFbnRpdHkgZW5jbG9zaW5nID0gcmVzdWx0LmVuY2xvc2luZ0NsYXNzOwogICAgLy8gV2Ugb25seSByZXR1cm4gdGhlIGZvdW5kIGVsZW1lbnQgaWYgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSBpbXBsZW1lbnRlZCBvbgogICAgLy8gYWxsIGNsYXNzZXMgaW4gdGhlIHJlY2VpdmVyIHR5cGUgW3RoaXNdLiBJdCBjb3VsZCBiZSBmb3VuZCBvbmx5IGluIGEKICAgIC8vIHN1YmNsYXNzIG9yIGluIGFuIGluaGVyaXRhbmNlLXdpc2UgdW5yZWxhdGVkIGNsYXNzIGluIGNhc2Ugb2Ygc3VidHlwZQogICAgLy8gc2VsZWN0b3JzLgogICAgaWYgKGlzU3VidHlwZSkgewogICAgICAvLyBpZiAoY2xvc2VkV29ybGQuaXNVc2VkQXNNaXhpbihlbmNsb3NpbmcpKSB7CiAgICAgIGlmIChjbG9zZWRXb3JsZC5ldmVyeVN1YnR5cGVJc1N1YmNsYXNzT2ZPck1peGluVXNlT2YoYmFzZSwgZW5jbG9zaW5nKSkgewogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgLy99CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzU3ViY2xhc3NPZihiYXNlLCBlbmNsb3NpbmcpKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBpZiAoY2xvc2VkV29ybGQuaXNTdWJjbGFzc09mTWl4aW5Vc2VPZihiYXNlLCBlbmNsb3NpbmcpKSByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KHZhciBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBGbGF0VHlwZU1hc2spIHJldHVybiBmYWxzZTsKICAgIEZsYXRUeXBlTWFzayBvdGhlck1hc2sgPSBvdGhlcjsKICAgIHJldHVybiAoZmxhZ3MgPT0gb3RoZXJNYXNrLmZsYWdzKSAmJiAoYmFzZSA9PSBvdGhlck1hc2suYmFzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiAoYmFzZSA9PSBudWxsID8gMCA6IGJhc2UuaGFzaENvZGUpICsgMzEgKiBmbGFncy5oYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmIChpc0VtcHR5T3JOdWxsKSByZXR1cm4gaXNOdWxsYWJsZSA/ICdbbnVsbF0nIDogJ1tlbXB0eV0nOwogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGlmIChpc051bGxhYmxlKSBidWZmZXIud3JpdGUoJ251bGx8Jyk7CiAgICBpZiAoaXNFeGFjdCkgYnVmZmVyLndyaXRlKCdleGFjdD0nKTsKICAgIGlmIChpc1N1YmNsYXNzKSBidWZmZXIud3JpdGUoJ3N1YmNsYXNzPScpOwogICAgaWYgKGlzU3VidHlwZSkgYnVmZmVyLndyaXRlKCdzdWJ0eXBlPScpOwogICAgYnVmZmVyLndyaXRlKGJhc2UubmFtZSk7CiAgICByZXR1cm4gIlskYnVmZmVyXSI7CiAgfQp9CoKJAE5OPAEPAUkPKUYdLgEeHiEgARoTATxBAVAqMikxASQVEx0VEwFRMSwwKwEwAUVOIzk8NQYjPToxCAYmPCwGOSZEBAE6KzUXMSIVPyZEBAEwDCgnFSEaEwQBKBlBAQw0DDIMMwwtDCsBDB0MIQwbDBsMIgwiDB0BQ0EsMzEBDBhLBAEMG0wEAQw/GRQpExoUHUMNGUIGBAFNRihLR0NAKz4vBik8LQYoOy42MS8GKz4vBhIEAQw8RCsrKzcvQk46JCw1Oh0vPAZGRitHMiAVRkcGIUQuBAEMQC4EAQwzQDotNTAuBAEMNj06BAEMMysrNzoEAQw0OzgEAQw2PToEAQwnGAQBDD4lSBIEAQw2JEUTEx1DERINGRMGBAEMLzBEBAEMPRs8PUckGTwqNykwUDpQP085Tz4NSwYEAUUgPD1FREE+KSQlHRMqFA1HBgQBTyBHPD0SJjpGRD9ADUZGQycmJwZLIR9DEAQBTiBIRjw9Q0c3QUcVH0MQBAEMRBtOPD0kASwBOwEZMSo4BgE3UAEbJRs3OSYZMyYfOikcMykmOigbMyglOiMPJh05OzEyHThACgE1GzRADBE0RwwKPTwKMwYEAQw+TCQBOj8uMwFASgFMRSxJFAZJFAYBSi45ATwEASFCKTMGKRkgQD8kUQYRBAFMIERFNk0pKywdEyoUDUcGBAEnNiBHPTIyRkI8RBc1IxQNTQYEATMqHycEAQxLQCcfEic2BgEwLxkaPB0+QjwNGUVBQ0sfSjhHMUdOSQYEAQwiP0YPJUNMTg8yAUcEAQxRJEZQKikzUUxNEhU1TxcIChMNRhcITgYRBAEMIC0uJEMEAQwVRQQBDBZBLispLy0dGAQCATtwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlbWFza3MvZmxhdF90eXBlX21hc2suZGFydEpzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci90eXBlbWFza3MvZm9yd2FyZGluZ190eXBlX21hc2suZGFydJDCLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgbWFza3M7CgovLy8gQSB0eXBlIG1hc2sgdGhhdCB3cmFwcyBhbiBvdGhlciBvbmUsIGFuZCBkZWxlZ2F0ZSBhbGwgaXRzCi8vLyBpbXBsZW1lbnRhdGlvbiBtZXRob2RzIHRvIGl0LgphYnN0cmFjdCBjbGFzcyBGb3J3YXJkaW5nVHlwZU1hc2sgaW1wbGVtZW50cyBUeXBlTWFzayB7CiAgVHlwZU1hc2sgZ2V0IGZvcndhcmRUbzsKCiAgRm9yd2FyZGluZ1R5cGVNYXNrKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW1wdHlPck51bGwgPT4gZm9yd2FyZFRvLmlzRW1wdHlPck51bGw7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBmb3J3YXJkVG8uaXNFbXB0eTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc051bGxhYmxlID0+IGZvcndhcmRUby5pc051bGxhYmxlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTnVsbCA9PiBmb3J3YXJkVG8uaXNOdWxsOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRXhhY3QgPT4gZm9yd2FyZFRvLmlzRXhhY3Q7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVW5pb24gPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDb250YWluZXIgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTZXQgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNNYXAgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNEaWN0aW9uYXJ5ID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVmFsdWUgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNGb3J3YXJkaW5nID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbk1hc2soVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGZvcndhcmRUby5pc0luTWFzayhvdGhlciwgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc01hc2soVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGZvcndhcmRUby5jb250YWluc01hc2sob3RoZXIsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNPbmx5SW50KEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGZvcndhcmRUby5jb250YWluc09ubHlJbnQoY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc09ubHlEb3VibGUoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZm9yd2FyZFRvLmNvbnRhaW5zT25seURvdWJsZShjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zT25seU51bShKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBmb3J3YXJkVG8uY29udGFpbnNPbmx5TnVtKGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNPbmx5Qm9vbChKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBmb3J3YXJkVG8uY29udGFpbnNPbmx5Qm9vbChjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zT25seVN0cmluZyhKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBmb3J3YXJkVG8uY29udGFpbnNPbmx5U3RyaW5nKGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNPbmx5KENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGZvcndhcmRUby5jb250YWluc09ubHkoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgc2F0aXNmaWVzKENsYXNzRW50aXR5IGNscywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZm9yd2FyZFRvLnNhdGlzZmllcyhjbHMsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnMoQ2xhc3NFbnRpdHkgY2xzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBmb3J3YXJkVG8uY29udGFpbnMoY2xzLCBjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zQWxsKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGZvcndhcmRUby5jb250YWluc0FsbChjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBzaW5nbGVDbGFzcyhKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBmb3J3YXJkVG8uc2luZ2xlQ2xhc3MoY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdW5pb24ob3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKHRoaXMgPT0gb3RoZXIpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgaWYgKGVxdWFsc0Rpc3JlZ2FyZE51bGwob3RoZXIpKSB7CiAgICAgIHJldHVybiBvdGhlci5pc051bGxhYmxlID8gb3RoZXIgOiB0aGlzOwogICAgfSBlbHNlIGlmIChvdGhlci5pc0VtcHR5T3JOdWxsKSB7CiAgICAgIHJldHVybiBvdGhlci5pc051bGxhYmxlID8gdGhpcy5udWxsYWJsZSgpIDogdGhpczsKICAgIH0KICAgIHJldHVybiBmb3J3YXJkVG8udW5pb24ob3RoZXIsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNEaXNqb2ludChUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZm9yd2FyZFRvLmlzRGlzam9pbnQob3RoZXIsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIGludGVyc2VjdGlvbihUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZm9yd2FyZFRvLmludGVyc2VjdGlvbihvdGhlciwgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBuZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgY292YXJpYW50IEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGZvcndhcmRUby5uZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKHNlbGVjdG9yLCBjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNhbkhpdChNZW1iZXJFbnRpdHkgZWxlbWVudCwgTmFtZSBuYW1lLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBmb3J3YXJkVG8uY2FuSGl0KGVsZW1lbnQsIG5hbWUsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBsb2NhdGVTaW5nbGVNZW1iZXIoU2VsZWN0b3Igc2VsZWN0b3IsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGZvcndhcmRUby5sb2NhdGVTaW5nbGVNZW1iZXIoc2VsZWN0b3IsIGNsb3NlZFdvcmxkKTsKICB9CgogIGJvb2wgZXF1YWxzRGlzcmVnYXJkTnVsbChvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBGb3J3YXJkaW5nVHlwZU1hc2spIHJldHVybiBmYWxzZTsKICAgIGlmIChmb3J3YXJkVG8uaXNOdWxsYWJsZSkgewogICAgICByZXR1cm4gZm9yd2FyZFRvID09IG90aGVyLmZvcndhcmRUby5udWxsYWJsZSgpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZvcndhcmRUbyA9PSBvdGhlci5mb3J3YXJkVG8ubm9uTnVsbGFibGUoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIHJldHVybiBlcXVhbHNEaXNyZWdhcmROdWxsKG90aGVyKSAmJiBpc051bGxhYmxlID09IG90aGVyLmlzTnVsbGFibGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRocm93ICJTdWJjbGFzcyBzaG91bGQgaW1wbGVtZW50IGhhc2hDb2RlIGdldHRlciI7Cn0KCmFic3RyYWN0IGNsYXNzIEFsbG9jYXRpb25UeXBlTWFzayBleHRlbmRzIEZvcndhcmRpbmdUeXBlTWFzayB7CiAgLy8gVGhlIFtpci5Ob2RlXSB3aGVyZSB0aGlzIHR5cGUgbWFzayB3YXMgY3JlYXRlZC4KICBpci5Ob2RlIGdldCBhbGxvY2F0aW9uTm9kZTsKCiAgLy8gVGhlIFtFbnRpdHldIHdoZXJlIHRoaXMgdHlwZSBtYXNrIHdhcyBjcmVhdGVkLgogIE1lbWJlckVudGl0eSBnZXQgYWxsb2NhdGlvbkVsZW1lbnQ7Cn0KgKQATk48AQ8BPiI4GgEYAQw1DCkMLwwnDCkBDB0MIQwbDBsMIgwdDCEBDDwzBAEMQDcEAQwzMwQBDDY2BAEMMzMEAQw0NAQBDDY2BAEMJygEAQw+MgQBDD0xBAEMLy8EAQw2LwQBDDQZEy0uJjgGMAQBDD41BAEMRDcEAQwiP0cEAQxLOQQBDFFABAEkNCA2DTkGBAEMHEkEAQxJAgE/NR4BNCYCAUFwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlbWFza3MvZm9yd2FyZGluZ190eXBlX21hc2suZGFydENzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci90eXBlbWFza3MvbWFwX3R5cGVfbWFzay5kYXJ0lEAvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBtYXNrczsKCi8vLyBBIFtNYXBUeXBlTWFza10gaXMgYSBbVHlwZU1hc2tdIGZvciBhIHNwZWNpZmljIGFsbG9jYXRpb24KLy8vIHNpdGUgb2YgYSBtYXAgKGN1cnJlbnRseSBvbmx5IGludGVybmFsIE1hcCBjbGFzcykgdGhhdCB3aWxsIGdldCBzcGVjaWFsaXplZAovLy8gb25jZSB0aGUgW1R5cGVHcmFwaEluZmVycmVyXSBwaGFzZSBmaW5kcyBhIGtleSBhbmQvb3IgdmFsdWUgdHlwZSBmb3IgaXQuCmNsYXNzIE1hcFR5cGVNYXNrIGV4dGVuZHMgQWxsb2NhdGlvblR5cGVNYXNrIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW01hcFR5cGVNYXNrXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ21hcC10eXBlLW1hc2snOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBUeXBlTWFzayBmb3J3YXJkVG87CgogIEBvdmVycmlkZQogIGZpbmFsIGlyLk5vZGUgYWxsb2NhdGlvbk5vZGU7CgogIEBvdmVycmlkZQogIGZpbmFsIE1lbWJlckVudGl0eSBhbGxvY2F0aW9uRWxlbWVudDsKCiAgLy8gVGhlIHZhbHVlIHR5cGUgb2YgdGhpcyBtYXAuCiAgZmluYWwgVHlwZU1hc2sgdmFsdWVUeXBlOwoKICAvLyBUaGUga2V5IHR5cGUgb2YgdGhpcyBtYXAuCiAgZmluYWwgVHlwZU1hc2sga2V5VHlwZTsKCiAgTWFwVHlwZU1hc2sodGhpcy5mb3J3YXJkVG8sIHRoaXMuYWxsb2NhdGlvbk5vZGUsIHRoaXMuYWxsb2NhdGlvbkVsZW1lbnQsCiAgICAgIHRoaXMua2V5VHlwZSwgdGhpcy52YWx1ZVR5cGUpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW01hcFR5cGVNYXNrXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IE1hcFR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBUeXBlTWFzayBmb3J3YXJkVG8gPSBuZXcgVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpOwogICAgaXIuVHJlZU5vZGUgYWxsb2NhdGlvbk5vZGUgPSBzb3VyY2UucmVhZFRyZWVOb2RlT3JOdWxsKCk7CiAgICBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQgPSBzb3VyY2UucmVhZE1lbWJlck9yTnVsbCgpOwogICAgVHlwZU1hc2sga2V5VHlwZSA9IG5ldyBUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBjbG9zZWRXb3JsZCk7CiAgICBUeXBlTWFzayB2YWx1ZVR5cGUgPSBuZXcgVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBNYXBUeXBlTWFzaygKICAgICAgICBmb3J3YXJkVG8sIGFsbG9jYXRpb25Ob2RlLCBhbGxvY2F0aW9uRWxlbWVudCwga2V5VHlwZSwgdmFsdWVUeXBlKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW01hcFR5cGVNYXNrXSB0byBbc2lua10uCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oVHlwZU1hc2tLaW5kLm1hcCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBmb3J3YXJkVG8ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZVRyZWVOb2RlT3JOdWxsKGFsbG9jYXRpb25Ob2RlKTsKICAgIHNpbmsud3JpdGVNZW1iZXJPck51bGwoYWxsb2NhdGlvbkVsZW1lbnQpOwogICAga2V5VHlwZS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB2YWx1ZVR5cGUud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIG51bGxhYmxlKCkgewogICAgcmV0dXJuIGlzTnVsbGFibGUKICAgICAgICA/IHRoaXMKICAgICAgICA6IG5ldyBNYXBUeXBlTWFzayhmb3J3YXJkVG8ubnVsbGFibGUoKSwgYWxsb2NhdGlvbk5vZGUsCiAgICAgICAgICAgIGFsbG9jYXRpb25FbGVtZW50LCBrZXlUeXBlLCB2YWx1ZVR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgbm9uTnVsbGFibGUoKSB7CiAgICByZXR1cm4gaXNOdWxsYWJsZQogICAgICAgID8gbmV3IE1hcFR5cGVNYXNrKGZvcndhcmRUby5ub25OdWxsYWJsZSgpLCBhbGxvY2F0aW9uTm9kZSwKICAgICAgICAgICAgYWxsb2NhdGlvbkVsZW1lbnQsIGtleVR5cGUsIHZhbHVlVHlwZSkKICAgICAgICA6IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnRhaW5lciA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc01hcCA9PiB0cnVlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRXhhY3QgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBlcXVhbHNEaXNyZWdhcmROdWxsKG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIE1hcFR5cGVNYXNrKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gc3VwZXIuZXF1YWxzRGlzcmVnYXJkTnVsbChvdGhlcikgJiYKICAgICAgICBhbGxvY2F0aW9uTm9kZSA9PSBvdGhlci5hbGxvY2F0aW9uTm9kZSAmJgogICAgICAgIGtleVR5cGUgPT0gb3RoZXIua2V5VHlwZSAmJgogICAgICAgIHZhbHVlVHlwZSA9PSBvdGhlci52YWx1ZVR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBpbnRlcnNlY3Rpb24oVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgVHlwZU1hc2sgZm9yd2FyZEludGVyc2VjdGlvbiA9IGZvcndhcmRUby5pbnRlcnNlY3Rpb24ob3RoZXIsIGNsb3NlZFdvcmxkKTsKICAgIGlmIChmb3J3YXJkSW50ZXJzZWN0aW9uLmlzRW1wdHlPck51bGwpIHJldHVybiBmb3J3YXJkSW50ZXJzZWN0aW9uOwogICAgcmV0dXJuIGZvcndhcmRJbnRlcnNlY3Rpb24uaXNOdWxsYWJsZSA/IG51bGxhYmxlKCkgOiBub25OdWxsYWJsZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdW5pb24oZHluYW1pYyBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAodGhpcyA9PSBvdGhlcikgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSBpZiAoZXF1YWxzRGlzcmVnYXJkTnVsbChvdGhlcikpIHsKICAgICAgcmV0dXJuIG90aGVyLmlzTnVsbGFibGUgPyBvdGhlciA6IHRoaXM7CiAgICB9IGVsc2UgaWYgKG90aGVyLmlzRW1wdHlPck51bGwpIHsKICAgICAgcmV0dXJuIG90aGVyLmlzTnVsbGFibGUgPyB0aGlzLm51bGxhYmxlKCkgOiB0aGlzOwogICAgfSBlbHNlIGlmIChvdGhlci5pc01hcCAmJgogICAgICAgIGtleVR5cGUgIT0gbnVsbCAmJgogICAgICAgIG90aGVyLmtleVR5cGUgIT0gbnVsbCAmJgogICAgICAgIHZhbHVlVHlwZSAhPSBudWxsICYmCiAgICAgICAgb3RoZXIudmFsdWVUeXBlICE9IG51bGwpIHsKICAgICAgVHlwZU1hc2sgbmV3S2V5VHlwZSA9IGtleVR5cGUudW5pb24ob3RoZXIua2V5VHlwZSwgY2xvc2VkV29ybGQpOwogICAgICBUeXBlTWFzayBuZXdWYWx1ZVR5cGUgPSB2YWx1ZVR5cGUudW5pb24ob3RoZXIudmFsdWVUeXBlLCBjbG9zZWRXb3JsZCk7CiAgICAgIFR5cGVNYXNrIG5ld0ZvcndhcmRUbyA9IGZvcndhcmRUby51bmlvbihvdGhlci5mb3J3YXJkVG8sIGNsb3NlZFdvcmxkKTsKICAgICAgcmV0dXJuIG5ldyBNYXBUeXBlTWFzaygKICAgICAgICAgIG5ld0ZvcndhcmRUbywgbnVsbCwgbnVsbCwgbmV3S2V5VHlwZSwgbmV3VmFsdWVUeXBlKTsKICAgIH0gZWxzZSBpZiAob3RoZXIuaXNEaWN0aW9uYXJ5KSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEZpbmQgYW5vdGhlciB3YXkgdG8gY2hlY2sgdGhpcyBpbnZhcmlhbnQgdGhhdAogICAgICAvLyBkb2Vzbid0IG5lZWQgdGhlIGNvbXBpbGVyLgogICAgICBhc3NlcnQob3RoZXIua2V5VHlwZSA9PQogICAgICAgICAgbmV3IFR5cGVNYXNrLm5vbk51bGxFeGFjdCgKICAgICAgICAgICAgICBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzLCBjbG9zZWRXb3JsZCkpOwogICAgICBUeXBlTWFzayBuZXdLZXlUeXBlID0ga2V5VHlwZS51bmlvbihvdGhlci5rZXlUeXBlLCBjbG9zZWRXb3JsZCk7CiAgICAgIFR5cGVNYXNrIG5ld1ZhbHVlVHlwZSA9CiAgICAgICAgICBvdGhlci50eXBlTWFwLnZhbHVlcy5mb2xkKGtleVR5cGUsIChwLCBuKSA9PiBwLnVuaW9uKG4sIGNsb3NlZFdvcmxkKSk7CiAgICAgIFR5cGVNYXNrIG5ld0ZvcndhcmRUbyA9IGZvcndhcmRUby51bmlvbihvdGhlci5mb3J3YXJkVG8sIGNsb3NlZFdvcmxkKTsKICAgICAgTWFwVHlwZU1hc2sgbmV3TWFwVHlwZU1hc2sgPSBuZXcgTWFwVHlwZU1hc2soCiAgICAgICAgICBuZXdGb3J3YXJkVG8sCiAgICAgICAgICBhbGxvY2F0aW9uTm9kZSA9PSBvdGhlci5hbGxvY2F0aW9uTm9kZSA/IGFsbG9jYXRpb25Ob2RlIDogbnVsbCwKICAgICAgICAgIGFsbG9jYXRpb25FbGVtZW50ID09IG90aGVyLmFsbG9jYXRpb25FbGVtZW50CiAgICAgICAgICAgICAgPyBhbGxvY2F0aW9uRWxlbWVudAogICAgICAgICAgICAgIDogbnVsbCwKICAgICAgICAgIG5ld0tleVR5cGUsCiAgICAgICAgICBuZXdWYWx1ZVR5cGUpOwogICAgICByZXR1cm4gbmV3TWFwVHlwZU1hc2s7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZm9yd2FyZFRvLnVuaW9uKG90aGVyLCBjbG9zZWRXb3JsZCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PiBzdXBlciA9PSBvdGhlcjsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gY29tcHV0ZUhhc2hDb2RlKAogICAgICAgIGFsbG9jYXRpb25Ob2RlLCBpc051bGxhYmxlLCBrZXlUeXBlLCB2YWx1ZVR5cGUsIGZvcndhcmRUbyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ01hcCgkZm9yd2FyZFRvLCBrZXk6ICRrZXlUeXBlLCB2YWx1ZTogJHZhbHVlVHlwZSknOwogIH0KfQqAnABOTjwBDwE+UE0vRR0tAQwcAQwgAQwoASEcAR8aAUslATkqNRdPPkBNTxUcSwQBLwwoJhUlLi8jJRMEAQwYFg9ANAQBDBsWQzMQBAEMIQwaDBwBDCQtLzIkJgQBDERPR0gEAQw8GRMtLiY4HhshHSNHTU0ePyVMJB4lR0ceUU00GEo3IhYWGR0NMgYEAQwtAQwVHEQEAQwWQAQCATpwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlbWFza3MvbWFwX3R5cGVfbWFzay5kYXJ0Q3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy9zZXRfdHlwZV9tYXNrLmRhcnSO3i8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIG1hc2tzOwoKLy8vIEEgW1NldFR5cGVNYXNrXSBpcyBhIFtUeXBlTWFza10gZm9yIGEgc3BlY2lmaWMgYWxsb2NhdGlvbiBzaXRlIG9mIGEgc2V0Ci8vLyAoY3VycmVudGx5IG9ubHkgdGhlIGludGVybmFsIFNldCBjbGFzcykgdGhhdCB3aWxsIGdldCBzcGVjaWFsaXplZCBvbmNlIHRoZQovLy8gW1R5cGVHcmFwaEluZmVycmVyXSBwaGFzZSBmaW5kcyBhbiBlbGVtZW50IHR5cGUgZm9yIGl0LgpjbGFzcyBTZXRUeXBlTWFzayBleHRlbmRzIEFsbG9jYXRpb25UeXBlTWFzayB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtTZXRUeXBlTWFza10gb2JqZWN0cyBpbiBhIGRlYnVnZ2luZwogIC8vLyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdzZXQtdHlwZS1tYXNrJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgVHlwZU1hc2sgZm9yd2FyZFRvOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBpci5Ob2RlIGFsbG9jYXRpb25Ob2RlOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBNZW1iZXJFbnRpdHkgYWxsb2NhdGlvbkVsZW1lbnQ7CgogIC8vIFRoZSBlbGVtZW50IHR5cGUgb2YgdGhpcyBzZXQuCiAgZmluYWwgVHlwZU1hc2sgZWxlbWVudFR5cGU7CgogIFNldFR5cGVNYXNrKHRoaXMuZm9yd2FyZFRvLCB0aGlzLmFsbG9jYXRpb25Ob2RlLCB0aGlzLmFsbG9jYXRpb25FbGVtZW50LAogICAgICB0aGlzLmVsZW1lbnRUeXBlKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtTZXRUeXBlTWFza10gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBTZXRUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgVHlwZU1hc2sgZm9yd2FyZFRvID0gbmV3IFR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsb3NlZFdvcmxkKTsKICAgIGlyLlRyZWVOb2RlIGFsbG9jYXRpb25Ob2RlID0gc291cmNlLnJlYWRUcmVlTm9kZU9yTnVsbCgpOwogICAgTWVtYmVyRW50aXR5IGFsbG9jYXRpb25FbGVtZW50ID0gc291cmNlLnJlYWRNZW1iZXJPck51bGwoKTsKICAgIFR5cGVNYXNrIGVsZW1lbnRUeXBlID0gbmV3IFR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsb3NlZFdvcmxkKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgU2V0VHlwZU1hc2soCiAgICAgICAgZm9yd2FyZFRvLCBhbGxvY2F0aW9uTm9kZSwgYWxsb2NhdGlvbkVsZW1lbnQsIGVsZW1lbnRUeXBlKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW1NldFR5cGVNYXNrXSB0byBbc2lua10uCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oVHlwZU1hc2tLaW5kLnNldCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBmb3J3YXJkVG8ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZVRyZWVOb2RlT3JOdWxsKGFsbG9jYXRpb25Ob2RlKTsKICAgIHNpbmsud3JpdGVNZW1iZXJPck51bGwoYWxsb2NhdGlvbkVsZW1lbnQpOwogICAgZWxlbWVudFR5cGUud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIG51bGxhYmxlKCkgPT4gaXNOdWxsYWJsZQogICAgICA/IHRoaXMKICAgICAgOiBuZXcgU2V0VHlwZU1hc2soCiAgICAgICAgICBmb3J3YXJkVG8ubnVsbGFibGUoKSwgYWxsb2NhdGlvbk5vZGUsIGFsbG9jYXRpb25FbGVtZW50LCBlbGVtZW50VHlwZSk7CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIG5vbk51bGxhYmxlKCkgPT4gaXNOdWxsYWJsZQogICAgICA/IG5ldyBTZXRUeXBlTWFzayhmb3J3YXJkVG8ubm9uTnVsbGFibGUoKSwgYWxsb2NhdGlvbk5vZGUsCiAgICAgICAgICBhbGxvY2F0aW9uRWxlbWVudCwgZWxlbWVudFR5cGUpCiAgICAgIDogdGhpczsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTZXQgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFeGFjdCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGVxdWFsc0Rpc3JlZ2FyZE51bGwob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgU2V0VHlwZU1hc2spIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBzdXBlci5lcXVhbHNEaXNyZWdhcmROdWxsKG90aGVyKSAmJgogICAgICAgIGFsbG9jYXRpb25Ob2RlID09IG90aGVyLmFsbG9jYXRpb25Ob2RlICYmCiAgICAgICAgZWxlbWVudFR5cGUgPT0gb3RoZXIuZWxlbWVudFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBpbnRlcnNlY3Rpb24oVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgVHlwZU1hc2sgZm9yd2FyZEludGVyc2VjdGlvbiA9IGZvcndhcmRUby5pbnRlcnNlY3Rpb24ob3RoZXIsIGNsb3NlZFdvcmxkKTsKICAgIGlmIChmb3J3YXJkSW50ZXJzZWN0aW9uLmlzRW1wdHlPck51bGwpIHJldHVybiBmb3J3YXJkSW50ZXJzZWN0aW9uOwogICAgcmV0dXJuIGZvcndhcmRJbnRlcnNlY3Rpb24uaXNOdWxsYWJsZSA/IG51bGxhYmxlKCkgOiBub25OdWxsYWJsZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdW5pb24oZHluYW1pYyBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAodGhpcyA9PSBvdGhlcikgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSBpZiAoZXF1YWxzRGlzcmVnYXJkTnVsbChvdGhlcikpIHsKICAgICAgcmV0dXJuIG90aGVyLmlzTnVsbGFibGUgPyBvdGhlciA6IHRoaXM7CiAgICB9IGVsc2UgaWYgKG90aGVyLmlzRW1wdHlPck51bGwpIHsKICAgICAgcmV0dXJuIG90aGVyLmlzTnVsbGFibGUgPyB0aGlzLm51bGxhYmxlKCkgOiB0aGlzOwogICAgfSBlbHNlIGlmIChvdGhlci5pc1NldCAmJgogICAgICAgIGVsZW1lbnRUeXBlICE9IG51bGwgJiYKICAgICAgICBvdGhlci5lbGVtZW50VHlwZSAhPSBudWxsKSB7CiAgICAgIFR5cGVNYXNrIG5ld0VsZW1lbnRUeXBlID0KICAgICAgICAgIGVsZW1lbnRUeXBlLnVuaW9uKG90aGVyLmVsZW1lbnRUeXBlLCBjbG9zZWRXb3JsZCk7CiAgICAgIFR5cGVNYXNrIG5ld0ZvcndhcmRUbyA9IGZvcndhcmRUby51bmlvbihvdGhlci5mb3J3YXJkVG8sIGNsb3NlZFdvcmxkKTsKICAgICAgcmV0dXJuIG5ldyBTZXRUeXBlTWFzayhuZXdGb3J3YXJkVG8sIG51bGwsIG51bGwsIG5ld0VsZW1lbnRUeXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmb3J3YXJkVG8udW5pb24ob3RoZXIsIGNsb3NlZFdvcmxkKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+IHN1cGVyID09IG90aGVyOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+CiAgICAgIGNvbXB1dGVIYXNoQ29kZShhbGxvY2F0aW9uTm9kZSwgaXNOdWxsYWJsZSwgZWxlbWVudFR5cGUsIGZvcndhcmRUbyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdTZXQoJGZvcndhcmRUbywgZWxlbWVudDogJGVsZW1lbnRUeXBlKSc7Cn0KdwBOTjwBDwFMTzwvTxMtAQwcAQwgAQwoASMeAUsZATkqNRdPPkBRFRxEBAEvDCgmFSUuLycTBAEMJA0ZUQEMJ0EqDgEMGgEMHAEMJC0vMioEAQxET0dIBAEMPBkTLS4mOB4fJSA9TUgNMgYEAQwtAQwWSwEMQQIBOnBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy9zZXRfdHlwZV9tYXNrLmRhcnQ/c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaW5mZXJyZXIvdHlwZW1hc2tzL3R5cGVfbWFzay5kYXJ0uVovLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBtYXNrczsKCi8vLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIFtVbml2ZXJzZVNlbGVjdG9yQ29uc3RyYWludHNdIHRoYXQgaXMgY29uc2lzdHMgaWYgYW4KLy8vIG9ubHkgaW5jcmVhc2luZyBzZXQgb2YgW1R5cGVNYXNrXXMsIHRoYXQgaXMsIG9uY2UgYSBtYXNrIGlzIGFkZGVkIGl0IGNhbm5vdAovLy8gYmUgcmVtb3ZlZC4KY2xhc3MgSW5jcmVhc2luZ1R5cGVNYXNrU2V0IGV4dGVuZHMgVW5pdmVyc2VTZWxlY3RvckNvbnN0cmFpbnRzIHsKICBib29sIGlzQWxsID0gZmFsc2U7CiAgU2V0PFR5cGVNYXNrPiBfbWFza3M7CgogIEBvdmVycmlkZQogIGJvb2wgY2FuSGl0KE1lbWJlckVudGl0eSBlbGVtZW50LCBOYW1lIG5hbWUsIEpDbG9zZWRXb3JsZCB3b3JsZCkgewogICAgaWYgKGlzQWxsKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChfbWFza3MgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgZm9yIChUeXBlTWFzayBtYXNrIGluIF9tYXNrcykgewogICAgICBpZiAobWFzay5jYW5IaXQoZWxlbWVudCwgbmFtZSwgd29ybGQpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgbmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZyhTZWxlY3RvciBzZWxlY3RvciwgSkNsb3NlZFdvcmxkIHdvcmxkKSB7CiAgICBpZiAoaXNBbGwpIHsKICAgICAgVHlwZU1hc2sgbWFzayA9CiAgICAgICAgICBuZXcgVHlwZU1hc2suc3ViY2xhc3Mod29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MsIHdvcmxkKTsKICAgICAgcmV0dXJuIG1hc2submVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZyhzZWxlY3Rvciwgd29ybGQpOwogICAgfQogICAgZm9yIChUeXBlTWFzayBtYXNrIGluIF9tYXNrcykgewogICAgICBpZiAobWFzay5uZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKHNlbGVjdG9yLCB3b3JsZCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhZGRSZWNlaXZlckNvbnN0cmFpbnQoVHlwZU1hc2sgbWFzaykgewogICAgaWYgKGlzQWxsKSByZXR1cm4gZmFsc2U7CiAgICBpZiAobWFzayA9PSBudWxsKSB7CiAgICAgIGlzQWxsID0gdHJ1ZTsKICAgICAgX21hc2tzID0gbnVsbDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBfbWFza3MgPz89IG5ldyBTZXQ8VHlwZU1hc2s+KCk7CiAgICByZXR1cm4gX21hc2tzLmFkZChtYXNrKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmIChpc0FsbCkgewogICAgICByZXR1cm4gJzxhbGw+JzsKICAgIH0gZWxzZSBpZiAoX21hc2tzICE9IG51bGwpIHsKICAgICAgcmV0dXJuICckX21hc2tzJzsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAnPG5vbmU+JzsKICAgIH0KICB9Cn0KCmNsYXNzIFR5cGVNYXNrU3RyYXRlZ3kgaW1wbGVtZW50cyBBYnN0cmFjdFZhbHVlU3RyYXRlZ3kgewogIGNvbnN0IFR5cGVNYXNrU3RyYXRlZ3koKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBjcmVhdGVEb21haW4oSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbmV3IENvbW1vbk1hc2tzKGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIFNlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneSBjcmVhdGVTZWxlY3RvclN0cmF0ZWd5KCkgewogICAgcmV0dXJuIG5ldyBUeXBlTWFza1NlbGVjdG9yU3RyYXRlZ3koKTsKICB9Cn0KCmNsYXNzIFR5cGVNYXNrU2VsZWN0b3JTdHJhdGVneSBpbXBsZW1lbnRzIFNlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneSB7CiAgY29uc3QgVHlwZU1hc2tTZWxlY3RvclN0cmF0ZWd5KCk7CgogIEBvdmVycmlkZQogIFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50cyBjcmVhdGVTZWxlY3RvckNvbnN0cmFpbnRzKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgT2JqZWN0IGluaXRpYWxDb25zdHJhaW50KSB7CiAgICByZXR1cm4gbmV3IEluY3JlYXNpbmdUeXBlTWFza1NldCgpCiAgICAgIC4uYWRkUmVjZWl2ZXJDb25zdHJhaW50KGluaXRpYWxDb25zdHJhaW50KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgYXBwbGllZFVubmFtZWQoRHluYW1pY1VzZSBkeW5hbWljVXNlLCBNZW1iZXJFbnRpdHkgbWVtYmVyLAogICAgICBjb3ZhcmlhbnQgSkNsb3NlZFdvcmxkIHdvcmxkKSB7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IGR5bmFtaWNVc2Uuc2VsZWN0b3I7CiAgICBUeXBlTWFzayBtYXNrID0gZHluYW1pY1VzZS5yZWNlaXZlckNvbnN0cmFpbnQ7CiAgICByZXR1cm4gc2VsZWN0b3IuYXBwbGllc1VubmFtZWQobWVtYmVyKSAmJgogICAgICAgIChtYXNrID09IG51bGwgfHwgbWFzay5jYW5IaXQobWVtYmVyLCBzZWxlY3Rvci5tZW1iZXJOYW1lLCB3b3JsZCkpOwogIH0KfQoKLy8vIEVudW0gdXNlZCBmb3IgaWRlbnRpZnlpbmcgW1R5cGVNYXNrXSBzdWJjbGFzc2VzIGluIHNlcmlhbGl6YXRpb24uCmVudW0gVHlwZU1hc2tLaW5kIHsKICBmbGF0LAogIHVuaW9uLAogIGNvbnRhaW5lciwKICBzZXQsCiAgbWFwLAogIGRpY3Rpb25hcnksCiAgdmFsdWUsCn0KCi8vLyBBIHR5cGUgbWFzayByZXByZXNlbnRzIGEgc2V0IG9mIGNvbnRhaW5lZCBjbGFzc2VzLCBidXQgdGhlCi8vLyBvcGVyYXRpb25zIG9uIGl0IGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBwcmVjaXNlIGFuZCB0aGV5IG1heQovLy8geWllbGQgY29uc2VydmF0aXZlIGFuc3dlcnMgdGhhdCBjb250YWluIHRvbyBtYW55IGNsYXNzZXMuCmFic3RyYWN0IGNsYXNzIFR5cGVNYXNrIGltcGxlbWVudHMgQWJzdHJhY3RWYWx1ZSB7CiAgZmFjdG9yeSBUeXBlTWFzaygKICAgICAgQ2xhc3NFbnRpdHkgYmFzZSwgaW50IGtpbmQsIGJvb2wgaXNOdWxsYWJsZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbmV3IEZsYXRUeXBlTWFzay5ub3JtYWxpemVkKAogICAgICAgIGJhc2UsIChraW5kIDw8IDEpIHwgKGlzTnVsbGFibGUgPyAxIDogMCksIGNsb3NlZFdvcmxkKTsKICB9CgogIGNvbnN0IGZhY3RvcnkgVHlwZU1hc2suZW1wdHkoKSA9IEZsYXRUeXBlTWFzay5lbXB0eTsKCiAgZmFjdG9yeSBUeXBlTWFzay5leGFjdChDbGFzc0VudGl0eSBiYXNlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGFzc2VydCgKICAgICAgICBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc0luc3RhbnRpYXRlZChiYXNlKSwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgYmFzZSA/PyBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBleGFjdCB0eXBlIG1hc2sgZm9yIHVuaW5zdGFudGlhdGVkICIKICAgICAgICAgICAgImNsYXNzICRiYXNlLlxuJHtjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5kdW1wKGJhc2UpfSIpKTsKICAgIHJldHVybiBuZXcgRmxhdFR5cGVNYXNrLmV4YWN0KGJhc2UpOwogIH0KCiAgZmFjdG9yeSBUeXBlTWFzay5leGFjdE9yRW1wdHkoQ2xhc3NFbnRpdHkgYmFzZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQoYmFzZSkpCiAgICAgIHJldHVybiBuZXcgRmxhdFR5cGVNYXNrLmV4YWN0KGJhc2UpOwogICAgcmV0dXJuIGNvbnN0IFR5cGVNYXNrLmVtcHR5KCk7CiAgfQoKICBmYWN0b3J5IFR5cGVNYXNrLnN1YmNsYXNzKENsYXNzRW50aXR5IGJhc2UsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgYXNzZXJ0KAogICAgICAgIGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzSW5zdGFudGlhdGVkKGJhc2UpLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBiYXNlID8/IENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIHN1YmNsYXNzIHR5cGUgbWFzayBmb3IgdW5pbnN0YW50aWF0ZWQgIgogICAgICAgICAgICAiY2xhc3MgJGJhc2UuXG4ke2Nsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmR1bXAoYmFzZSl9IikpOwogICAgQ2xhc3NFbnRpdHkgdG9wbW9zdCA9IGNsb3NlZFdvcmxkLmdldEx1Yk9mSW5zdGFudGlhdGVkU3ViY2xhc3NlcyhiYXNlKTsKICAgIGlmICh0b3Btb3N0ID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBUeXBlTWFzay5lbXB0eSgpOwogICAgfSBlbHNlIGlmIChjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5oYXNBbnlTdHJpY3RTdWJjbGFzcyh0b3Btb3N0KSkgewogICAgICByZXR1cm4gbmV3IEZsYXRUeXBlTWFzay5zdWJjbGFzcyh0b3Btb3N0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgVHlwZU1hc2suZXhhY3QodG9wbW9zdCwgY2xvc2VkV29ybGQpOwogICAgfQogIH0KCiAgZmFjdG9yeSBUeXBlTWFzay5zdWJ0eXBlKENsYXNzRW50aXR5IGJhc2UsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgQ2xhc3NFbnRpdHkgdG9wbW9zdCA9IGNsb3NlZFdvcmxkLmdldEx1Yk9mSW5zdGFudGlhdGVkU3VidHlwZXMoYmFzZSk7CiAgICBpZiAodG9wbW9zdCA9PSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgVHlwZU1hc2suZW1wdHkoKTsKICAgIH0KICAgIGlmIChjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5oYXNPbmx5U3ViY2xhc3Nlcyh0b3Btb3N0KSkgewogICAgICByZXR1cm4gbmV3IFR5cGVNYXNrLnN1YmNsYXNzKHRvcG1vc3QsIGNsb3NlZFdvcmxkKTsKICAgIH0KICAgIGlmIChjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5oYXNBbnlTdHJpY3RTdWJ0eXBlKHRvcG1vc3QpKSB7CiAgICAgIHJldHVybiBuZXcgRmxhdFR5cGVNYXNrLnN1YnR5cGUodG9wbW9zdCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IFR5cGVNYXNrLmV4YWN0KHRvcG1vc3QsIGNsb3NlZFdvcmxkKTsKICAgIH0KICB9CgogIGNvbnN0IGZhY3RvcnkgVHlwZU1hc2subm9uTnVsbEVtcHR5KCkgPSBGbGF0VHlwZU1hc2subm9uTnVsbEVtcHR5OwoKICBmYWN0b3J5IFR5cGVNYXNrLm5vbk51bGxFeGFjdChDbGFzc0VudGl0eSBiYXNlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGFzc2VydCgKICAgICAgICBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc0luc3RhbnRpYXRlZChiYXNlKSwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgYmFzZSA/PyBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBleGFjdCB0eXBlIG1hc2sgZm9yIHVuaW5zdGFudGlhdGVkICIKICAgICAgICAgICAgImNsYXNzICRiYXNlLlxuJHtjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5kdW1wKGJhc2UpfSIpKTsKICAgIHJldHVybiBuZXcgRmxhdFR5cGVNYXNrLm5vbk51bGxFeGFjdChiYXNlKTsKICB9CgogIGZhY3RvcnkgVHlwZU1hc2subm9uTnVsbEV4YWN0T3JFbXB0eSgKICAgICAgQ2xhc3NFbnRpdHkgYmFzZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQoYmFzZSkpIHsKICAgICAgcmV0dXJuIG5ldyBGbGF0VHlwZU1hc2subm9uTnVsbEV4YWN0KGJhc2UpOwogICAgfQogICAgcmV0dXJuIGNvbnN0IFR5cGVNYXNrLm5vbk51bGxFbXB0eSgpOwogIH0KCiAgZmFjdG9yeSBUeXBlTWFzay5ub25OdWxsU3ViY2xhc3MoQ2xhc3NFbnRpdHkgYmFzZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBhc3NlcnQoCiAgICAgICAgY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQoYmFzZSksCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGJhc2UgPz8gQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgc3ViY2xhc3MgdHlwZSBtYXNrIGZvciB1bmluc3RhbnRpYXRlZCAiCiAgICAgICAgICAgICJjbGFzcyAkYmFzZS5cbiR7Y2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuZHVtcChiYXNlKX0iKSk7CiAgICBDbGFzc0VudGl0eSB0b3Btb3N0ID0gY2xvc2VkV29ybGQuZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJjbGFzc2VzKGJhc2UpOwogICAgaWYgKHRvcG1vc3QgPT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IFR5cGVNYXNrLm5vbk51bGxFbXB0eSgpOwogICAgfSBlbHNlIGlmIChjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5oYXNBbnlTdHJpY3RTdWJjbGFzcyh0b3Btb3N0KSkgewogICAgICByZXR1cm4gbmV3IEZsYXRUeXBlTWFzay5ub25OdWxsU3ViY2xhc3ModG9wbW9zdCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IFR5cGVNYXNrLm5vbk51bGxFeGFjdCh0b3Btb3N0LCBjbG9zZWRXb3JsZCk7CiAgICB9CiAgfQoKICBmYWN0b3J5IFR5cGVNYXNrLm5vbk51bGxTdWJ0eXBlKENsYXNzRW50aXR5IGJhc2UsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgQ2xhc3NFbnRpdHkgdG9wbW9zdCA9IGNsb3NlZFdvcmxkLmdldEx1Yk9mSW5zdGFudGlhdGVkU3VidHlwZXMoYmFzZSk7CiAgICBpZiAodG9wbW9zdCA9PSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgVHlwZU1hc2subm9uTnVsbEVtcHR5KCk7CiAgICB9CiAgICBpZiAoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaGFzT25seVN1YmNsYXNzZXModG9wbW9zdCkpIHsKICAgICAgcmV0dXJuIG5ldyBUeXBlTWFzay5ub25OdWxsU3ViY2xhc3ModG9wbW9zdCwgY2xvc2VkV29ybGQpOwogICAgfQogICAgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5Lmhhc0FueVN0cmljdFN1YnR5cGUodG9wbW9zdCkpIHsKICAgICAgcmV0dXJuIG5ldyBGbGF0VHlwZU1hc2subm9uTnVsbFN1YnR5cGUodG9wbW9zdCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IFR5cGVNYXNrLm5vbk51bGxFeGFjdCh0b3Btb3N0LCBjbG9zZWRXb3JsZCk7CiAgICB9CiAgfQoKICBmYWN0b3J5IFR5cGVNYXNrLnVuaW9uT2YoSXRlcmFibGU8VHlwZU1hc2s+IG1hc2tzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBVbmlvblR5cGVNYXNrLnVuaW9uT2YobWFza3MsIGNsb3NlZFdvcmxkKTsKICB9CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbVHlwZU1hc2tdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBUeXBlTWFza0tpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShUeXBlTWFza0tpbmQudmFsdWVzKTsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIFR5cGVNYXNrS2luZC5mbGF0OgogICAgICAgIHJldHVybiBuZXcgRmxhdFR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsb3NlZFdvcmxkKTsKICAgICAgY2FzZSBUeXBlTWFza0tpbmQudW5pb246CiAgICAgICAgcmV0dXJuIG5ldyBVbmlvblR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsb3NlZFdvcmxkKTsKICAgICAgY2FzZSBUeXBlTWFza0tpbmQuY29udGFpbmVyOgogICAgICAgIHJldHVybiBuZXcgQ29udGFpbmVyVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpOwogICAgICBjYXNlIFR5cGVNYXNrS2luZC5zZXQ6CiAgICAgICAgcmV0dXJuIG5ldyBTZXRUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBjbG9zZWRXb3JsZCk7CiAgICAgIGNhc2UgVHlwZU1hc2tLaW5kLm1hcDoKICAgICAgICByZXR1cm4gbmV3IE1hcFR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIGNsb3NlZFdvcmxkKTsKICAgICAgY2FzZSBUeXBlTWFza0tpbmQuZGljdGlvbmFyeToKICAgICAgICByZXR1cm4gbmV3IERpY3Rpb25hcnlUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBjbG9zZWRXb3JsZCk7CiAgICAgIGNhc2UgVHlwZU1hc2tLaW5kLnZhbHVlOgogICAgICAgIHJldHVybiBuZXcgVmFsdWVUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBjbG9zZWRXb3JsZCk7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBUeXBlTWFza0tpbmQgJGtpbmQuIik7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtUeXBlTWFza10gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspOwoKICAvLy8gSWYgW21hc2tdIGlzIGZvcndhcmRpbmcsIHJldHVybnMgdGhlIGZpcnN0IG5vbi1mb3J3YXJkaW5nIFtUeXBlTWFza10gaW4KICAvLy8gW21hc2tdJ3MgZm9yd2FyZGluZyBjaGFpbi4KICBzdGF0aWMgVHlwZU1hc2sgbm9uRm9yd2FyZGluZ01hc2sobWFzaykgewogICAgd2hpbGUgKG1hc2suaXNGb3J3YXJkaW5nKSB7CiAgICAgIG1hc2sgPSBtYXNrLmZvcndhcmRUbzsKICAgIH0KICAgIHJldHVybiBtYXNrOwogIH0KCiAgLy8vIEFzc2VydHMgdGhhdCB0aGlzIG1hc2sgdXNlcyB0aGUgc21hbGxlc3QgcG9zc2libGUgcmVwcmVzZW50YXRpb24gZm9yCiAgLy8vIGl0cyB0eXBlcy4gQ3VycmVudGx5LCB3ZSBub3JtYWxpemUgc3VidHlwZSBhbmQgc3ViY2xhc3MgdG8gZXhhY3QgaWYgbm8KICAvLy8gc3VidHlwZXMgb3Igc3ViY2xhc3NlcyBhcmUgcHJlc2VudCBhbmQgc3VidHlwZSB0byBzdWJjbGFzcyBpZiBvbmx5CiAgLy8vIHN1YmNsYXNzZXMgZXhpc3QuIFdlIGFsc28gbm9ybWFsaXplIGV4YWN0IHRvIGVtcHR5IGlmIHRoZSBjb3JyZXNwb25kaW5nCiAgLy8vIGJhc2VjbGFzcyB3YXMgbmV2ZXIgaW5zdGFudGlhdGVkLgogIHN0YXRpYyBib29sIGFzc2VydElzTm9ybWFsaXplZChUeXBlTWFzayBtYXNrLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIFN0cmluZyByZWFzb24gPSBnZXROb3ROb3JtYWxpemVkUmVhc29uKG1hc2ssIGNsb3NlZFdvcmxkKTsKICAgIGFzc2VydChyZWFzb24gPT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsICckbWFzayBpcyBub3Qgbm9ybWFsaXplZDogJHJlYXNvbicpKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgc3RhdGljIFN0cmluZyBnZXROb3ROb3JtYWxpemVkUmVhc29uKAogICAgICBUeXBlTWFzayBtYXNrLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIG1hc2sgPSBub25Gb3J3YXJkaW5nTWFzayhtYXNrKTsKICAgIGlmIChtYXNrIGlzIEZsYXRUeXBlTWFzaykgewogICAgICBpZiAobWFzay5pc0VtcHR5T3JOdWxsKSByZXR1cm4gbnVsbDsKICAgICAgaWYgKG1hc2suaXNFeGFjdCkgewogICAgICAgIGlmICghY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQobWFzay5iYXNlKSkgewogICAgICAgICAgcmV0dXJuICdFeGFjdCAke21hc2suYmFzZX0gaXMgbm90IGluc3RhbnRpYXRlZC4nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAobWFzay5pc1N1YmNsYXNzKSB7CiAgICAgICAgaWYgKCFjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5oYXNBbnlTdHJpY3RTdWJjbGFzcyhtYXNrLmJhc2UpKSB7CiAgICAgICAgICByZXR1cm4gJ1N1YmNsYXNzICR7bWFzay5iYXNlfSBkb2VzIG5vdCBoYXZlIGFueSBzdWJjbGFzc2VzLic7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGFzc2VydChtYXNrLmlzU3VidHlwZSk7CiAgICAgIGlmICghY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaGFzQW55U3RyaWN0U3VidHlwZShtYXNrLmJhc2UpKSB7CiAgICAgICAgcmV0dXJuICdTdWJ0eXBlICR7bWFzay5iYXNlfSBkb2VzIG5vdCBoYXZlIGFueSBzdWJjbGFzc2VzLic7CiAgICAgIH0KICAgICAgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5Lmhhc09ubHlTdWJjbGFzc2VzKG1hc2suYmFzZSkpIHsKICAgICAgICByZXR1cm4gJ1N1YnR5cGUgJHttYXNrLmJhc2V9IG9ubHkgaGFzIHN1YmNsYXNzZXMuJzsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSBpZiAobWFzayBpcyBVbmlvblR5cGVNYXNrKSB7CiAgICAgIGZvciAoVHlwZU1hc2sgc3VibWFzayBpbiBtYXNrLmRpc2pvaW50TWFza3MpIHsKICAgICAgICBTdHJpbmcgc3VibWFza1JlYXNvbiA9IGdldE5vdE5vcm1hbGl6ZWRSZWFzb24oc3VibWFzaywgY2xvc2VkV29ybGQpOwogICAgICAgIGlmIChzdWJtYXNrUmVhc29uICE9IG51bGwpIHsKICAgICAgICAgIHJldHVybiAnU3VibWFzayAkc3VibWFzayBpbiAkbWFzazogJHN1Ym1hc2tSZWFzb24uJzsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gJ1Vua25vd24gdHlwZSBtYXNrICRtYXNrLic7CiAgfQoKICAvLy8gUmV0dXJucyBhIG51bGxhYmxlIHZhcmlhbnQgb2YgW3RoaXNdIHR5cGUgbWFzay4KICBUeXBlTWFzayBudWxsYWJsZSgpOwoKICAvLy8gUmV0dXJucyBhIG5vbi1udWxsYWJsZSB2YXJpYW50IG9mIFt0aGlzXSB0eXBlIG1hc2suCiAgVHlwZU1hc2sgbm9uTnVsbGFibGUoKTsKCiAgLy8vIFdoZXRoZXIgbm90aGluZyBtYXRjaGVzIHRoaXMgbWFzaywgbm90IGV2ZW4gbnVsbC4KICBib29sIGdldCBpc0VtcHR5OwoKICAvLy8gV2hldGhlciBudWxsIGlzIGEgdmFsaWQgdmFsdWUgb2YgdGhpcyBtYXNrLgogIGJvb2wgZ2V0IGlzTnVsbGFibGU7CgogIC8vLyBXaGV0aGVyIHRoZSBvbmx5IHBvc3NpYmxlIHZhbHVlIGluIHRoaXMgbWFzayBpcyBOdWxsLgogIGJvb2wgZ2V0IGlzTnVsbDsKCiAgLy8vIFdoZXRoZXIgW2lzRW1wdHldIG9yIFtpc051bGxdIGlzIHRydWUuCiAgYm9vbCBnZXQgaXNFbXB0eU9yTnVsbDsKCiAgLy8vIFdoZXRoZXIgdGhpcyBtYXNrIG9ubHkgaW5jbHVkZXMgaW5zdGFuY2VzIG9mIGFuIGV4YWN0IGNsYXNzLCBhbmQgbm9uZSBvZgogIC8vLyBpdCdzIHN1YmNsYXNzZXMgb3Igc3VidHlwZXMuCiAgYm9vbCBnZXQgaXNFeGFjdDsKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hc2sgaXMgYSB1bmlvbiB0eXBlLgogIGJvb2wgZ2V0IGlzVW5pb247CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIG1hc2sgaXMgYSBbQ29udGFpbmVyVHlwZU1hc2tdLgogIGJvb2wgZ2V0IGlzQ29udGFpbmVyOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBtYXNrIGlzIGEgW1NldFR5cGVNYXNrXS4KICBib29sIGdldCBpc1NldDsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgbWFzayBpcyBhIFtNYXBUeXBlTWFza10uCiAgYm9vbCBnZXQgaXNNYXA7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIG1hc2sgaXMgYSBbTWFwVHlwZU1hc2tdIGluIGRpY3Rpb25hcnkgbW9kZSwgaS5lLiwKICAvLy8gYWxsIGtleXMgYXJlIGtub3duIHN0cmluZyB2YWx1ZXMgYW5kIHdlIGhhdmUgc3BlY2lmaWMgdHlwZSBpbmZvcm1hdGlvbiBmb3IKICAvLy8gY29ycmVzcG9uZGluZyB2YWx1ZXMuCiAgYm9vbCBnZXQgaXNEaWN0aW9uYXJ5OwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBtYXNrIGlzIHdyYXBwaW5nIGFub3RoZXIgbWFzayBmb3IgdGhlIHB1cnBvc2Ugb2YKICAvLy8gdHJhY2luZy4KICBib29sIGdldCBpc0ZvcndhcmRpbmc7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIG1hc2sgaG9sZHMgZW5jb2RlcyBhbiBleGFjdCB2YWx1ZSB3aXRoaW4gYSB0eXBlLgogIGJvb2wgZ2V0IGlzVmFsdWU7CgogIGJvb2wgY29udGFpbnNPbmx5SW50KEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CiAgYm9vbCBjb250YWluc09ubHlEb3VibGUoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKICBib29sIGNvbnRhaW5zT25seU51bShKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwogIGJvb2wgY29udGFpbnNPbmx5Qm9vbChKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwogIGJvb2wgY29udGFpbnNPbmx5U3RyaW5nKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CiAgYm9vbCBjb250YWluc09ubHkoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIENvbXBhcmVzIHR3byBbVHlwZU1hc2tdIG9iamVjdHMgZm9yIHN0cnVjdHVyYWwgZXF1YWxpdHkuCiAgLy8vCiAgLy8vIE5vdGU6IFRoaXMgbWF5IGRpZmZlciBmcm9tIHNlbWFudGljIGVxdWFsaXR5IGluIHRoZSBzZXQgY29udGFpbm1lbnQgc2Vuc2UuCiAgLy8vICAgVXNlIFtjb250YWluc01hc2tdIGFuZCBbaXNJbk1hc2tdIGZvciB0aGF0LCBpbnN0ZWFkLgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpOwoKICAvLy8gSWYgdGhpcyByZXR1cm5zIGB0cnVlYCwgW290aGVyXSBpcyBndWFyYW50ZWVkIHRvIGJlIGEgc3VwZXJ0eXBlIG9mIHRoaXMKICAvLy8gbWFzaywgaS5lLiwgdGhpcyBtYXNrIGlzIGluIFtvdGhlcl0uIEhvd2V2ZXIsIHRoZSBpbnZlcnNlIGRvZXMgbm90IGhvbGQuCiAgLy8vIEVuYWJsZSBbVW5pb25UeXBlTWFzay5QRVJGT1JNX0VYVFJBX0NPTlRBSU5TX0NIRUNLXSB0byBiZSBub3RpZmllZCBvZgogIC8vLyBmYWxzZSBuZWdhdGl2ZXMuCiAgYm9vbCBpc0luTWFzayhUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKCiAgLy8vIElmIHRoaXMgcmV0dXJucyBgdHJ1ZWAsIFtvdGhlcl0gaXMgZ3VhcmFudGVlZCB0byBiZSBhIHN1YnR5cGUgb2YgdGhpcwogIC8vLyBtYXNrLCBpLmUuIHRoaXMgbWFzayBjb250YWlucyBbb3RoZXJdLiBIb3dldmVyLCB0aGUgaW52ZXJzZSBkb2VzIG5vdCBob2xkLgogIC8vLyBFbmFibGUgW1VuaW9uVHlwZU1hc2suUEVSRk9STV9FWFRSQV9DT05UQUlOU19DSEVDS10gdG8gYmUgbm90aWZpZWQgb2YKICAvLy8gZmFsc2UgbmVnYXRpdmVzLgogIGJvb2wgY29udGFpbnNNYXNrKFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBtYXNrIGlzIGFuIGluc3RhbmNlIG9mIFtjbHNdLgogIGJvb2wgc2F0aXNmaWVzKENsYXNzRW50aXR5IGNscywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKCiAgLy8vIFJldHVybnMgd2hldGhlciBvciBub3QgdGhpcyB0eXBlIG1hc2sgY29udGFpbnMgdGhlIGdpdmVuIGNsYXNzIFtjbHNdLgogIGJvb2wgY29udGFpbnMoQ2xhc3NFbnRpdHkgY2xzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIHR5cGUgbWFzayBjb250YWlucyBhbGwgdHlwZXMuCiAgYm9vbCBjb250YWluc0FsbChKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NsYXNzRW50aXR5XSBpZiB0aGlzIHR5cGUgcmVwcmVzZW50cyBhIHNpbmdsZSBjbGFzcywKICAvLy8gb3RoZXJ3aXNlIHJldHVybnMgYG51bGxgLiAgVGhpcyBtZXRob2QgaXMgY29uc2VydmF0aXZlLgogIENsYXNzRW50aXR5IHNpbmdsZUNsYXNzKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CgogIC8vLyBSZXR1cm5zIGEgdHlwZSBtYXNrIHJlcHJlc2VudGluZyB0aGUgdW5pb24gb2YgW3RoaXNdIGFuZCBbb3RoZXJdLgogIFR5cGVNYXNrIHVuaW9uKFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBhbmQgW290aGVyXSBpcyBlbXB0eS4KICBib29sIGlzRGlzam9pbnQoVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CgogIC8vLyBSZXR1cm5zIGEgdHlwZSBtYXNrIHJlcHJlc2VudGluZyB0aGUgaW50ZXJzZWN0aW9uIG9mIFt0aGlzXSBhbmQgW290aGVyXS4KICBUeXBlTWFzayBpbnRlcnNlY3Rpb24oVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgW2VsZW1lbnRdIGlzIGEgcG90ZW50aWFsIHRhcmdldCB3aGVuIGJlaW5nIGludm9rZWQgb24gdGhpcwogIC8vLyB0eXBlIG1hc2suCiAgLy8vCiAgLy8vCiAgLy8vIFtuYW1lXSBpcyB1c2VkIHRvIGVuc3VyZSBsaWJyYXJ5IHByaXZhY3kgaXMgdGFrZW4gaW50byBhY2NvdW50LgogIGJvb2wgY2FuSGl0KE1lbWJlckVudGl0eSBlbGVtZW50LCBOYW1lIG5hbWUsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCk7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGhpcyBbVHlwZU1hc2tdIGFwcGxpZWQgdG8gW3NlbGVjdG9yXSBjYW4gaGl0IGEKICAvLy8gW25vU3VjaE1ldGhvZF0uCiAgYm9vbCBuZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKFNlbGVjdG9yIHNlbGVjdG9yLCBKQ2xvc2VkV29ybGQgd29ybGQpOwoKICAvLy8gUmV0dXJucyB0aGUgW2VsZW1lbnRdIHRoYXQgaXMga25vd24gdG8gYWx3YXlzIGJlIGhpdCBhdCBydW50aW1lCiAgLy8vIG9uIHRoaXMgbWFzay4gUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCiAgTWVtYmVyRW50aXR5IGxvY2F0ZVNpbmdsZU1lbWJlcihTZWxlY3RvciBzZWxlY3RvciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKfQqBogBOTjwBDwFQUBBCFhgBDEUcJiQ6BhIEAQxKERZKPgYkPRUIBhIEAQwuHRgUFRMGJB0EAQwWERYhGA0XBgQCATocAQw/KQQBDDkrBAIBSCQBDDk1JzIEAQxCJi0zLksEAgFGFAgJDQcHDgkCAT9DPjMUTyhABAE3AUcMORIvQEgpBAFOOSsjBAFKDDkSL0NITBsjSzENNwYEAUlKGyMGQToGQzANNwYEAUUBTgw5Ei9ASDAEASg0OzIGKgQBUQw5Ei9DSEwbKks4DT4GBAFQShsqBkFBBkM3DT4GBAFRNgQBNic1PhQeSR9KI04dSB1IJE8fSgZCBAEsJwFOISwgHQYRBAFLTUlOKEw/G04RBAEoMSQgKxpFPAoVCB1LSAoVCB5IRQhFPAgTKDVNJT8KCBMGJwQBNhcBOhoBOBQBMhcBPBMBLRoBTyMUATEUATwYATYSATYSAU9RHBkBTg8ZAU4UATI1MjM1JgE/BlE9DBsBTk9MFzsBTFFMFz8BPj0BTDwBQC4BSD41AUg8AUU9AU9DAVERBgZGSgFGFkkBRjNQAgE2cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvdHlwZW1hc2tzL3R5cGVfbWFzay5kYXJ0RXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy91bmlvbl90eXBlX21hc2suZGFydLyBLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgbWFza3M7CgpjbGFzcyBVbmlvblR5cGVNYXNrIGltcGxlbWVudHMgVHlwZU1hc2sgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbVW5pb25UeXBlTWFza10gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICd1bmlvbi10eXBlLW1hc2snOwoKICBzdGF0aWMgY29uc3QgaW50IE1BWF9VTklPTl9MRU5HVEggPSA0OwoKICAvLyBTZXQgdGhpcyBmbGFnIHRvIGB0cnVlYCB0byBwZXJmb3JtIGEgc2V0LW1lbWJlcnNoaXAgYmFzZWQgY29udGFpbm1lbnQgY2hlY2sKICAvLyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gbm9ybWFsaXplZCB0eXBlcy4gVGhpcyBpcyBxdWl0ZSBzbG93IGJ1dCBjYW4gYmUKICAvLyBoZWxwZnVsIGluIGRlYnVnZ2luZy4KICBzdGF0aWMgY29uc3QgYm9vbCBQRVJGT1JNX0VYVFJBX0NPTlRBSU5TX0NIRUNLID0gZmFsc2U7CgogIGZpbmFsIExpc3Q8RmxhdFR5cGVNYXNrPiBkaXNqb2ludE1hc2tzOwoKICBVbmlvblR5cGVNYXNrLl9pbnRlcm5hbCh0aGlzLmRpc2pvaW50TWFza3MpIHsKICAgIGFzc2VydChkaXNqb2ludE1hc2tzLmxlbmd0aCA+IDEpOwogICAgYXNzZXJ0KGRpc2pvaW50TWFza3MuZXZlcnkoKFR5cGVNYXNrIG1hc2spID0+ICFtYXNrLmlzVW5pb24pKTsKICB9CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbVW5pb25UeXBlTWFza10gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBVbmlvblR5cGVNYXNrLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBMaXN0PEZsYXRUeXBlTWFzaz4gZGlzam9pbnRNYXNrcyA9IHNvdXJjZQogICAgICAgIC5yZWFkTGlzdCgoKSA9PiBuZXcgVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xvc2VkV29ybGQpKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgVW5pb25UeXBlTWFzay5faW50ZXJuYWwoZGlzam9pbnRNYXNrcyk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtVbmlvblR5cGVNYXNrXSB0byBbc2lua10uCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oVHlwZU1hc2tLaW5kLnVuaW9uKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVMaXN0KAogICAgICAgIGRpc2pvaW50TWFza3MsIChGbGF0VHlwZU1hc2sgbWFzaykgPT4gbWFzay53cml0ZVRvRGF0YVNpbmsoc2luaykpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIHN0YXRpYyBUeXBlTWFzayB1bmlvbk9mKEl0ZXJhYmxlPFR5cGVNYXNrPiBtYXNrcywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBhc3NlcnQoCiAgICAgICAgbWFza3MuZXZlcnkoKG1hc2spID0+IFR5cGVNYXNrLmFzc2VydElzTm9ybWFsaXplZChtYXNrLCBjbG9zZWRXb3JsZCkpKTsKICAgIExpc3Q8RmxhdFR5cGVNYXNrPiBkaXNqb2ludCA9IDxGbGF0VHlwZU1hc2s+W107CiAgICB1bmlvbk9mSGVscGVyKG1hc2tzLCBkaXNqb2ludCwgY2xvc2VkV29ybGQpOwogICAgaWYgKGRpc2pvaW50LmlzRW1wdHkpIHJldHVybiBuZXcgVHlwZU1hc2subm9uTnVsbEVtcHR5KCk7CiAgICBpZiAoZGlzam9pbnQubGVuZ3RoID4gTUFYX1VOSU9OX0xFTkdUSCkgewogICAgICByZXR1cm4gZmxhdHRlbihkaXNqb2ludCwgY2xvc2VkV29ybGQpOwogICAgfQogICAgaWYgKGRpc2pvaW50Lmxlbmd0aCA9PSAxKSByZXR1cm4gZGlzam9pbnRbMF07CiAgICBVbmlvblR5cGVNYXNrIHVuaW9uID0gbmV3IFVuaW9uVHlwZU1hc2suX2ludGVybmFsKGRpc2pvaW50KTsKICAgIGFzc2VydChUeXBlTWFzay5hc3NlcnRJc05vcm1hbGl6ZWQodW5pb24sIGNsb3NlZFdvcmxkKSk7CiAgICByZXR1cm4gdW5pb247CiAgfQoKICBzdGF0aWMgdm9pZCB1bmlvbk9mSGVscGVyKEl0ZXJhYmxlPFR5cGVNYXNrPiBtYXNrcywKICAgICAgTGlzdDxGbGF0VHlwZU1hc2s+IGRpc2pvaW50LCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEltcG9zZSBhbiBvcmRlciBvbiB0aGUgbWFzayB0byBlbnN1cmUgc3ViY2xhc3MgbWFza3MKICAgIC8vIGFyZSBwcmVmZXJyZWQgdG8gc3VidHlwZSBtYXNrcy4KICAgIGZvciAoVHlwZU1hc2sgbWFzayBpbiBtYXNrcykgewogICAgICBtYXNrID0gVHlwZU1hc2subm9uRm9yd2FyZGluZ01hc2sobWFzayk7CiAgICAgIGlmIChtYXNrLmlzVW5pb24pIHsKICAgICAgICBVbmlvblR5cGVNYXNrIHVuaW9uID0gbWFzazsKICAgICAgICB1bmlvbk9mSGVscGVyKHVuaW9uLmRpc2pvaW50TWFza3MsIGRpc2pvaW50LCBjbG9zZWRXb3JsZCk7CiAgICAgIH0gZWxzZSBpZiAobWFzay5pc0VtcHR5KSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgRmxhdFR5cGVNYXNrIGZsYXRNYXNrID0gbWFzazsKICAgICAgICBpbnQgaW5MaXN0SW5kZXggPSAtMTsKICAgICAgICBib29sIGNvdmVyZWQgPSBmYWxzZTsKCiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIFtkaXNqb2ludF0gdG8gZmluZCBvdXQgaWYgb25lIG9mIHRoZSBtYXNrCiAgICAgICAgLy8gYWxyZWFkeSBjb3ZlcnMgW21hc2tdLgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlzam9pbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIEZsYXRUeXBlTWFzayBjdXJyZW50ID0gZGlzam9pbnRbaV07CiAgICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICAgIFR5cGVNYXNrIG5ld01hc2sgPSBmbGF0TWFzay51bmlvbihjdXJyZW50LCBjbG9zZWRXb3JsZCk7CiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGZvdW5kIGEgZGlzam9pbnQgdW5pb24sIGNvbnRpbnVlIGl0ZXJhdGluZy4KICAgICAgICAgIGlmIChuZXdNYXNrLmlzVW5pb24pIGNvbnRpbnVlOwogICAgICAgICAgY292ZXJlZCA9IHRydWU7CiAgICAgICAgICAvLyBXZSBmb3VuZCBhIG1hc2sgdGhhdCBpcyBlaXRoZXIgZXF1YWwgdG8gW21hc2tdIG9yIGlzIGEKICAgICAgICAgIC8vIHN1cGVydHlwZSBvZiBbbWFza10uCiAgICAgICAgICBpZiAoY3VycmVudCA9PSBuZXdNYXNrKSBicmVhazsKCiAgICAgICAgICAvLyBbbWFza10gaXMgYSBzdXBlcnR5cGUgb2YgW2N1cnJlbnRdLCByZXBsYWNlIHRoZSBbZGlzam9pbnRdCiAgICAgICAgICAvLyBsaXN0IHdpdGggW25ld01hc2tdIGluc3RlYWQgb2YgW2N1cnJlbnRdLiBOb3RlIHRoYXQKICAgICAgICAgIC8vIFtuZXdNYXNrXSBtYXkgY29udGFpbiBkaWZmZXJlbnQgaW5mb3JtYXRpb24gdGhhbiBbbWFza10sCiAgICAgICAgICAvLyBsaWtlIG51bGxhYmlsaXR5LgogICAgICAgICAgZGlzam9pbnRbaV0gPSBuZXdNYXNrOwogICAgICAgICAgZmxhdE1hc2sgPSBuZXdNYXNrOwoKICAgICAgICAgIGlmIChpbkxpc3RJbmRleCAhPSAtMSkgewogICAgICAgICAgICAvLyBJZiB0aGUgbWFzayB3YXMgYWxyZWFkeSBjb3ZlcmVkLCB3ZSByZW1vdmUgdGhlIHByZXZpb3VzCiAgICAgICAgICAgIC8vIHBsYWNlIHdoZXJlIGl0IHdhcyBpbnNlcnRlZC4gVGhpcyBuZXcgbWFzayBzdWJzdW1lcyB0aGUKICAgICAgICAgICAgLy8gcHJldmlvdXNseSBjb3ZlcmVkIG9uZS4KICAgICAgICAgICAgZGlzam9pbnQucmVtb3ZlQXQoaW5MaXN0SW5kZXgpOwogICAgICAgICAgICBpLS07CiAgICAgICAgICB9CiAgICAgICAgICAvLyBSZWNvcmQgd2hlcmUgdGhlIG1hc2sgd2FzIGluc2VydGVkLgogICAgICAgICAgaW5MaXN0SW5kZXggPSBpOwogICAgICAgIH0KICAgICAgICAvLyBJZiBub25lIG9mIHRoZSBtYXNrcyBpbiBbZGlzam9pbnRdIGNvdmVycyBbbWFza10sIHdlIGp1c3QKICAgICAgICAvLyBhZGQgW21hc2tdIHRvIHRoZSBsaXN0LgogICAgICAgIGlmICghY292ZXJlZCkgZGlzam9pbnQuYWRkKGZsYXRNYXNrKTsKICAgICAgfQogICAgfQogIH0KCiAgc3RhdGljIFR5cGVNYXNrIGZsYXR0ZW4oTGlzdDxGbGF0VHlwZU1hc2s+IG1hc2tzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1vdmUgdGhpcyBjb21wdXRhdGlvbiB0byBbQ2xvc2VkV29ybGRdIGFuZCB1c2UgdGhlCiAgICAvLyBjbGFzcyBzZXQgc3RydWN0dXJlcy4KICAgIGlmIChtYXNrcy5pc0VtcHR5KSB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKG1hc2tzLCAnbWFza3MnKTsKICAgIC8vIElmIGVpdGhlciB0eXBlIG1hc2sgaXMgYSBzdWJ0eXBlIHR5cGUgbWFzaywgd2UgY2Fubm90IHVzZSBhCiAgICAvLyBzdWJjbGFzcyB0eXBlIG1hc2sgdG8gcmVwcmVzZW50IHRoZWlyIHVuaW9uLgogICAgYm9vbCB1c2VTdWJjbGFzcyA9IG1hc2tzLmV2ZXJ5KChlKSA9PiAhZS5pc1N1YnR5cGUpOwogICAgYm9vbCBpc051bGxhYmxlID0gbWFza3MuYW55KChlKSA9PiBlLmlzTnVsbGFibGUpOwoKICAgIExpc3Q8Q2xhc3NFbnRpdHk+IG1hc2tzQmFzZXMgPSBtYXNrcy5tYXAoKG1hc2spID0+IG1hc2suYmFzZSkudG9MaXN0KCk7CiAgICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gY2FuZGlkYXRlcyA9CiAgICAgICAgY2xvc2VkV29ybGQuY29tbW9uU3VwZXJ0eXBlc09mKG1hc2tzQmFzZXMpOwoKICAgIC8vIENvbXB1dGUgdGhlIGJlc3QgY2FuZGlkYXRlIGFuZCBpdHMga2luZC4KICAgIENsYXNzRW50aXR5IGJlc3RFbGVtZW50OwogICAgaW50IGJlc3RLaW5kOwogICAgaW50IGJlc3RTaXplOwogICAgZm9yIChDbGFzc0VudGl0eSBjYW5kaWRhdGUgaW4gY2FuZGlkYXRlcykgewogICAgICBib29sIGlzSW5zdGFudGlhdGVkU3RyaWN0U3ViY2xhc3MoY2xzKSA9PgogICAgICAgICAgY2xzICE9IGNhbmRpZGF0ZSAmJgogICAgICAgICAgY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNFeHBsaWNpdGx5SW5zdGFudGlhdGVkKGNscykgJiYKICAgICAgICAgIGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzU3ViY2xhc3NPZihjbHMsIGNhbmRpZGF0ZSk7CgogICAgICBpbnQgc2l6ZTsKICAgICAgaW50IGtpbmQ7CiAgICAgIGlmICh1c2VTdWJjbGFzcyAmJiBtYXNrc0Jhc2VzLmV2ZXJ5KGlzSW5zdGFudGlhdGVkU3RyaWN0U3ViY2xhc3MpKSB7CiAgICAgICAgLy8gSWYgYm90aCBbdGhpc10gYW5kIFtvdGhlcl0gYXJlIHN1YmNsYXNzZXMgb2YgdGhlIHN1cGVydHlwZSwKICAgICAgICAvLyB0aGVuIHdlIHByZWZlciB0byBjb25zdHJ1Y3QgYSBzdWJjbGFzcyB0eXBlIG1hc2sgYmVjYXVzZSBpdAogICAgICAgIC8vIHdpbGwgYWx3YXlzIGJlIGF0IGxlYXN0IGFzIHNtYWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgICAgLy8gc3VidHlwZSB0eXBlIG1hc2suCiAgICAgICAga2luZCA9IEZsYXRUeXBlTWFzay5TVUJDTEFTUzsKICAgICAgICAvLyBUT0RPKHNpZ211bmQsIGpvaG5uaXdpbnRoZXIpOiBjb21wdXRpbmcgbGVuZ3RoIGhlcmUgKGFuZCBiZWxvdykgaXMKICAgICAgICAvLyBleHBlbnNpdmUuIElmIHdlIGNhbid0IHByZXZlbnQgYGZsYXR0ZW5gIGZyb20gYmVpbmcgY2FsbGVkIGEgbG90LCBpdAogICAgICAgIC8vIG1pZ2h0IGJlIHdvcnRoIGNhY2hpbmcgcmVzdWx0cy4KICAgICAgICBzaXplID0gY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuc3RyaWN0U3ViY2xhc3NDb3VudChjYW5kaWRhdGUpOwogICAgICAgIGFzc2VydCgKICAgICAgICAgICAgc2l6ZSA8PSBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5zdHJpY3RTdWJ0eXBlQ291bnQoY2FuZGlkYXRlKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAga2luZCA9IEZsYXRUeXBlTWFzay5TVUJUWVBFOwogICAgICAgIHNpemUgPSBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5zdHJpY3RTdWJ0eXBlQ291bnQoY2FuZGlkYXRlKTsKICAgICAgfQogICAgICAvLyBVcGRhdGUgdGhlIGJlc3QgY2FuZGlkYXRlIGlmIHRoZSBuZXcgb25lIGlzIGJldHRlci4KICAgICAgaWYgKGJlc3RFbGVtZW50ID09IG51bGwgfHwgc2l6ZSA8IGJlc3RTaXplKSB7CiAgICAgICAgYmVzdEVsZW1lbnQgPSBjYW5kaWRhdGU7CiAgICAgICAgYmVzdFNpemUgPSBzaXplOwogICAgICAgIGJlc3RLaW5kID0ga2luZDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBUeXBlTWFzayhiZXN0RWxlbWVudCwgYmVzdEtpbmQsIGlzTnVsbGFibGUsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHVuaW9uKGR5bmFtaWMgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgb3RoZXIgPSBUeXBlTWFzay5ub25Gb3J3YXJkaW5nTWFzayhvdGhlcik7CiAgICBpZiAoIW90aGVyLmlzVW5pb24gJiYgZGlzam9pbnRNYXNrcy5jb250YWlucyhvdGhlcikpIHJldHVybiB0aGlzOwoKICAgIExpc3Q8RmxhdFR5cGVNYXNrPiBuZXdMaXN0ID0gbmV3IExpc3Q8RmxhdFR5cGVNYXNrPi5mcm9tKGRpc2pvaW50TWFza3MpOwogICAgaWYgKCFvdGhlci5pc1VuaW9uKSB7CiAgICAgIG5ld0xpc3QuYWRkKG90aGVyKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChvdGhlciBpcyBVbmlvblR5cGVNYXNrKTsKICAgICAgbmV3TGlzdC5hZGRBbGwob3RoZXIuZGlzam9pbnRNYXNrcyk7CiAgICB9CiAgICByZXR1cm4gbmV3IFR5cGVNYXNrLnVuaW9uT2YobmV3TGlzdCwgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgaW50ZXJzZWN0aW9uKGR5bmFtaWMgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgb3RoZXIgPSBUeXBlTWFzay5ub25Gb3J3YXJkaW5nTWFzayhvdGhlcik7CiAgICBpZiAoIW90aGVyLmlzVW5pb24gJiYgZGlzam9pbnRNYXNrcy5jb250YWlucyhvdGhlcikpIHJldHVybiBvdGhlcjsKICAgIGlmIChvdGhlci5pc1VuaW9uICYmIHRoaXMgPT0gb3RoZXIpIHJldHVybiB0aGlzOwoKICAgIExpc3Q8VHlwZU1hc2s+IGludGVyc2VjdGlvbnMgPSA8VHlwZU1hc2s+W107CiAgICBmb3IgKFR5cGVNYXNrIGN1cnJlbnQgaW4gZGlzam9pbnRNYXNrcykgewogICAgICBpZiAob3RoZXIuaXNVbmlvbikgewogICAgICAgIGlmIChvdGhlci5kaXNqb2ludE1hc2tzLmNvbnRhaW5zKGN1cnJlbnQpKSB7CiAgICAgICAgICBpbnRlcnNlY3Rpb25zLmFkZChjdXJyZW50KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9yIChGbGF0VHlwZU1hc2sgZmxhdE90aGVyIGluIG90aGVyLmRpc2pvaW50TWFza3MpIHsKICAgICAgICAgICAgaW50ZXJzZWN0aW9ucy5hZGQoY3VycmVudC5pbnRlcnNlY3Rpb24oZmxhdE90aGVyLCBjbG9zZWRXb3JsZCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpbnRlcnNlY3Rpb25zLmFkZChjdXJyZW50LmludGVyc2VjdGlvbihvdGhlciwgY2xvc2VkV29ybGQpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBUeXBlTWFzay51bmlvbk9mKGludGVyc2VjdGlvbnMsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNEaXNqb2ludChUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBmb3IgKHZhciBjdXJyZW50IGluIGRpc2pvaW50TWFza3MpIHsKICAgICAgaWYgKCFjdXJyZW50LmlzRGlzam9pbnQob3RoZXIsIGNsb3NlZFdvcmxkKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBudWxsYWJsZSgpIHsKICAgIGlmIChpc051bGxhYmxlKSByZXR1cm4gdGhpczsKICAgIExpc3Q8RmxhdFR5cGVNYXNrPiBuZXdMaXN0ID0gbmV3IExpc3Q8RmxhdFR5cGVNYXNrPi5mcm9tKGRpc2pvaW50TWFza3MpOwogICAgbmV3TGlzdFswXSA9IG5ld0xpc3RbMF0ubnVsbGFibGUoKTsKICAgIHJldHVybiBuZXcgVW5pb25UeXBlTWFzay5faW50ZXJuYWwobmV3TGlzdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBub25OdWxsYWJsZSgpIHsKICAgIGlmICghaXNOdWxsYWJsZSkgcmV0dXJuIHRoaXM7CiAgICBJdGVyYWJsZTxGbGF0VHlwZU1hc2s+IG5ld0l0ZXJhYmxlID0gZGlzam9pbnRNYXNrcy5tYXAoKGUpIHsKICAgICAgRmxhdFR5cGVNYXNrIHIgPSBlLm5vbk51bGxhYmxlKCk7CiAgICAgIHJldHVybiByOwogICAgfSkudG9MaXN0KCk7CiAgICByZXR1cm4gbmV3IFVuaW9uVHlwZU1hc2suX2ludGVybmFsKG5ld0l0ZXJhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW1wdHlPck51bGwgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc051bGwgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsYWJsZSA9PiBkaXNqb2ludE1hc2tzLmFueSgoZSkgPT4gZS5pc051bGxhYmxlKTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0V4YWN0ID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVW5pb24gPT4gdHJ1ZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnRhaW5lciA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1NldCA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc01hcCA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0RpY3Rpb25hcnkgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNGb3J3YXJkaW5nID0+IGZhbHNlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVmFsdWUgPT4gZmFsc2U7CgogIC8vLyBDaGVja3Mgd2hldGhlciBbb3RoZXJdIGlzIGNvbnRhaW5lZCBpbiB0aGlzIHVuaW9uLgogIC8vLwogIC8vLyBJbnZhcmlhbnRzOgogIC8vLyAtIFtvdGhlcl0gbWF5IG5vdCBiZSBhIFtVbmlvblR5cGVNYXNrXSBpdHNlbGYKICAvLy8gLSB0aGUgY2hlYXAgdGVzdCBtYXRjaGluZyBhZ2FpbnN0IGluZGl2aWR1YWwgbWVtYmVycyBvZiBbZGlzam9pbnRNYXNrc10KICAvLy8gICBtdXN0IGhhdmUgZmFpbGVkLgogIGJvb2wgc2xvd0NvbnRhaW5zQ2hlY2soVHlwZU1hc2sgb3RoZXIsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgLy8gVW5pb25zIHNob3VsZCBuZXZlciBtYWtlIGl0IGhlcmUuCiAgICBhc3NlcnQoIW90aGVyLmlzVW5pb24pOwogICAgLy8gRW5zdXJlIHRoZSBjaGVhcCB0ZXN0IGZhaWxzLgogICAgYXNzZXJ0KCFkaXNqb2ludE1hc2tzLmFueSgobWFzaykgPT4gbWFzay5jb250YWluc01hc2sob3RoZXIsIGNsb3NlZFdvcmxkKSkpOwogICAgLy8gSWYgd2UgY292ZXIgb2JqZWN0LCB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuCiAgICBhc3NlcnQoIWNvbnRhaW5zKGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzLCBjbG9zZWRXb3JsZCkpOwogICAgLy8gTGlrZXdpc2UsIG51bGxuZXNzIHNob3VsZCBiZSBjb3ZlcmVkLgogICAgYXNzZXJ0KGlzTnVsbGFibGUgfHwgIW90aGVyLmlzTnVsbGFibGUpOwogICAgLy8gVGhlIGZhc3QgdGVzdCBpcyBwcmVjaXNlIGZvciBleGFjdCB0eXBlcy4KICAgIGlmIChvdGhlci5pc0V4YWN0KSByZXR1cm4gZmFsc2U7CiAgICAvLyBXZSBjYW5ub3QgY29udGFpbiBvYmplY3QuCiAgICBpZiAob3RoZXIuY29udGFpbnMoY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MsIGNsb3NlZFdvcmxkKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBGbGF0VHlwZU1hc2sgZmxhdCA9IFR5cGVNYXNrLm5vbkZvcndhcmRpbmdNYXNrKG90aGVyKTsKICAgIC8vIENoZWNrIHdlIGNvdmVyIHRoZSBiYXNlIGNsYXNzLgogICAgaWYgKCFjb250YWlucyhmbGF0LmJhc2UsIGNsb3NlZFdvcmxkKSkgcmV0dXJuIGZhbHNlOwogICAgLy8gQ2hlY2sgZm9yIG90aGVyIG1lbWJlcnMuCiAgICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gbWVtYmVyczsKICAgIGlmIChmbGF0LmlzU3ViY2xhc3MpIHsKICAgICAgbWVtYmVycyA9IGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LnN0cmljdFN1YmNsYXNzZXNPZihmbGF0LmJhc2UpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGZsYXQuaXNTdWJ0eXBlKTsKICAgICAgbWVtYmVycyA9IGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LnN0cmljdFN1YnR5cGVzT2YoZmxhdC5iYXNlKTsKICAgIH0KICAgIHJldHVybiBtZW1iZXJzLmV2ZXJ5KChDbGFzc0VudGl0eSBjbHMpID0+IHRoaXMuY29udGFpbnMoY2xzLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0luTWFzayhUeXBlTWFzayBvdGhlciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBvdGhlciA9IFR5cGVNYXNrLm5vbkZvcndhcmRpbmdNYXNrKG90aGVyKTsKICAgIGlmIChpc051bGxhYmxlICYmICFvdGhlci5pc051bGxhYmxlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAob3RoZXIuaXNVbmlvbikgewogICAgICBVbmlvblR5cGVNYXNrIHVuaW9uID0gb3RoZXI7CiAgICAgIGJvb2wgY29udGFpbmVkSW5BbnlPZihGbGF0VHlwZU1hc2sgbWFzaywgSXRlcmFibGU8RmxhdFR5cGVNYXNrPiBtYXNrcykgewogICAgICAgIC8vIG51bGwgaXMgbm90IGNhbm9uaWNhbGl6ZWQgZm9yIHRoZSB1bmlvbiBidXQgc3RvcmVkIG9ubHkgb24gc29tZQogICAgICAgIC8vIG1hc2tzIGluIFtkaXNqb2ludE1hc2tdLiBJdCBoYXMgYmVlbiBjaGVja2VkIGluIHRoZSBzdXJyb3VuZGluZwogICAgICAgIC8vIGNvbnRleHQsIHNvIHdlIGNhbiBzYWZlbHkgaWdub3JlIGl0IGhlcmUuCiAgICAgICAgRmxhdFR5cGVNYXNrIG1hc2tEaXNyZWdhcmROdWxsID0gbWFzay5ub25OdWxsYWJsZSgpOwogICAgICAgIHJldHVybiBtYXNrcy5hbnkoKEZsYXRUeXBlTWFzayBvdGhlcikgewogICAgICAgICAgcmV0dXJuIG90aGVyLmNvbnRhaW5zTWFzayhtYXNrRGlzcmVnYXJkTnVsbCwgY2xvc2VkV29ybGQpOwogICAgICAgIH0pOwogICAgICB9CgogICAgICByZXR1cm4gZGlzam9pbnRNYXNrcy5ldmVyeSgoRmxhdFR5cGVNYXNrIGRpc2pvaW50TWFzaykgewogICAgICAgIGJvb2wgY29udGFpbmVkID0gY29udGFpbmVkSW5BbnlPZihkaXNqb2ludE1hc2ssIHVuaW9uLmRpc2pvaW50TWFza3MpOwogICAgICAgIGlmIChQRVJGT1JNX0VYVFJBX0NPTlRBSU5TX0NIRUNLICYmCiAgICAgICAgICAgICFjb250YWluZWQgJiYKICAgICAgICAgICAgdW5pb24uc2xvd0NvbnRhaW5zQ2hlY2soZGlzam9pbnRNYXNrLCBjbG9zZWRXb3JsZCkpIHsKICAgICAgICAgIHRocm93ICJUeXBlTWFzayBiYXNlZCBjb250YWlubWVudCBjaGVjayBmYWlsZWQgZm9yICR0aGlzIGFuZCAkb3RoZXIuIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbnRhaW5lZDsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gZGlzam9pbnRNYXNrcy5ldmVyeSgobWFzaykgPT4gbWFzay5pc0luTWFzayhvdGhlciwgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNNYXNrKFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIG90aGVyID0gVHlwZU1hc2subm9uRm9yd2FyZGluZ01hc2sob3RoZXIpOwogICAgaWYgKG90aGVyLmlzTnVsbGFibGUgJiYgIWlzTnVsbGFibGUpIHJldHVybiBmYWxzZTsKICAgIGlmIChvdGhlci5pc1VuaW9uKSByZXR1cm4gb3RoZXIuaXNJbk1hc2sodGhpcywgY2xvc2VkV29ybGQpOwogICAgb3RoZXIgPSBvdGhlci5ub25OdWxsYWJsZSgpOyAvLyBudWxsYWJsZSBpcyBub3QgY2Fub25pY2FsaXplZCwgc28gZHJvcCBpdC4KICAgIGJvb2wgY29udGFpbmVkID0KICAgICAgICBkaXNqb2ludE1hc2tzLmFueSgobWFzaykgPT4gbWFzay5jb250YWluc01hc2sob3RoZXIsIGNsb3NlZFdvcmxkKSk7CiAgICBpZiAoUEVSRk9STV9FWFRSQV9DT05UQUlOU19DSEVDSyAmJgogICAgICAgICFjb250YWluZWQgJiYKICAgICAgICBzbG93Q29udGFpbnNDaGVjayhvdGhlciwgY2xvc2VkV29ybGQpKSB7CiAgICAgIHRocm93ICJUeXBlTWFzayBiYXNlZCBjb250YWlubWVudCBjaGVjayBmYWlsZWQgZm9yICR0aGlzIGFuZCAkb3RoZXIuIjsKICAgIH0KICAgIHJldHVybiBjb250YWluZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zT25seUludChKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBkaXNqb2ludE1hc2tzLmV2ZXJ5KChtYXNrKSA9PiBtYXNrLmNvbnRhaW5zT25seUludChjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc09ubHlEb3VibGUoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZGlzam9pbnRNYXNrcy5ldmVyeSgobWFzaykgPT4gbWFzay5jb250YWluc09ubHlEb3VibGUoY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNPbmx5TnVtKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGRpc2pvaW50TWFza3MuZXZlcnkoKG1hc2spIHsKICAgICAgcmV0dXJuIG1hc2suY29udGFpbnNPbmx5TnVtKGNsb3NlZFdvcmxkKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc09ubHlCb29sKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGRpc2pvaW50TWFza3MuZXZlcnkoKG1hc2spID0+IG1hc2suY29udGFpbnNPbmx5Qm9vbChjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc09ubHlTdHJpbmcoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZGlzam9pbnRNYXNrcy5ldmVyeSgobWFzaykgPT4gbWFzay5jb250YWluc09ubHlTdHJpbmcoY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNPbmx5KENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBkaXNqb2ludE1hc2tzLmV2ZXJ5KChtYXNrKSA9PiBtYXNrLmNvbnRhaW5zT25seShlbGVtZW50KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHNhdGlzZmllcyhDbGFzc0VudGl0eSBjbHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGRpc2pvaW50TWFza3MuZXZlcnkoKG1hc2spID0+IG1hc2suc2F0aXNmaWVzKGNscywgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnMoQ2xhc3NFbnRpdHkgY2xzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBkaXNqb2ludE1hc2tzLmFueSgoZSkgPT4gZS5jb250YWlucyhjbHMsIGNsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zQWxsKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGRpc2pvaW50TWFza3MuYW55KChtYXNrKSA9PiBtYXNrLmNvbnRhaW5zQWxsKGNsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBzaW5nbGVDbGFzcyhKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpID0+IG51bGw7CgogIEBvdmVycmlkZQogIGJvb2wgbmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZyhTZWxlY3RvciBzZWxlY3RvciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gZGlzam9pbnRNYXNrcwogICAgICAgIC5hbnkoKGUpID0+IGUubmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZyhzZWxlY3RvciwgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY2FuSGl0KE1lbWJlckVudGl0eSBlbGVtZW50LCBOYW1lIG5hbWUsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGRpc2pvaW50TWFza3MuYW55KChlKSA9PiBlLmNhbkhpdChlbGVtZW50LCBuYW1lLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGxvY2F0ZVNpbmdsZU1lbWJlcihTZWxlY3RvciBzZWxlY3RvciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBNZW1iZXJFbnRpdHkgY2FuZGlkYXRlOwogICAgZm9yIChGbGF0VHlwZU1hc2sgbWFzayBpbiBkaXNqb2ludE1hc2tzKSB7CiAgICAgIE1lbWJlckVudGl0eSBjdXJyZW50ID0gbWFzay5sb2NhdGVTaW5nbGVNZW1iZXIoc2VsZWN0b3IsIGNsb3NlZFdvcmxkKTsKICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9IGVsc2UgaWYgKGNhbmRpZGF0ZSA9PSBudWxsKSB7CiAgICAgICAgY2FuZGlkYXRlID0gY3VycmVudDsKICAgICAgfSBlbHNlIGlmIChjYW5kaWRhdGUgIT0gY3VycmVudCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY2FuZGlkYXRlOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nIG1hc2tzU3RyaW5nID0KICAgICAgICAoZGlzam9pbnRNYXNrcy5tYXAoKFR5cGVNYXNrIG1hc2spID0+IG1hc2sudG9TdHJpbmcoKSkudG9MaXN0KCkuLnNvcnQoKSkKICAgICAgICAgICAgLmpvaW4oIiwgIik7CiAgICByZXR1cm4gJ1VuaW9uKCRtYXNrc1N0cmluZyknOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwoKICAgIGJvb2wgY29udGFpbnNBbGwoKSB7CiAgICAgIHJldHVybiBvdGhlci5kaXNqb2ludE1hc2tzLmV2ZXJ5KChlKSB7CiAgICAgICAgdmFyIG1hcCA9IGRpc2pvaW50TWFza3MubWFwKChlKSA9PiBlLm5vbk51bGxhYmxlKCkpOwogICAgICAgIHJldHVybiBtYXAuY29udGFpbnMoZS5ub25OdWxsYWJsZSgpKTsKICAgICAgfSk7CiAgICB9CgogICAgcmV0dXJuIG90aGVyIGlzIFVuaW9uVHlwZU1hc2sgJiYKICAgICAgICBvdGhlci5pc051bGxhYmxlID09IGlzTnVsbGFibGUgJiYKICAgICAgICBvdGhlci5kaXNqb2ludE1hc2tzLmxlbmd0aCA9PSBkaXNqb2ludE1hc2tzLmxlbmd0aCAmJgogICAgICAgIGNvbnRhaW5zQWxsKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIGludCBoYXNoQ29kZSA9IGlzTnVsbGFibGUgPyA4NiA6IDQzOwogICAgLy8gVGhlIG9yZGVyIG9mIHRoZSBtYXNrcyBpbiBbZGlzam9pbnRNYXNrc10gbXVzdCBub3QgYWZmZWN0IHRoZQogICAgLy8gaGFzaENvZGUuCiAgICBmb3IgKHZhciBtYXNrIGluIGRpc2pvaW50TWFza3MpIHsKICAgICAgaGFzaENvZGUgPSAoaGFzaENvZGUgXiBtYXNrLm5vbk51bGxhYmxlKCkuaGFzaENvZGUpICYgMHgzZmZmZmZmZjsKICAgIH0KICAgIHJldHVybiBoYXNoQ29kZTsKICB9Cn0KgcAATk48AQ8BKkcdLwEpAVFLGzoBKgEwJkMEATssNRcuTxU3BAExDCgoFRRLEwQBUAxQNDE+Li0GMkE9EgQBNj9RJyMvGiRDIRIPJh4eAUIiNC4pQ0QpGkQiKQFIQUYfIR4BI0dHJywRDDEbCkUjLggGBAFQTx1CQzQ5NgFMJzQBMB0SEjAwHkZDARAQS0dHQR4mTlArShBPDyVJCD00IRkZCAZJBAEMPC9GAU0aGg0mKwY3BAEMQy9HNQExLhs1JhFATQwKD0UIBj0EAQw+KUEGEQQBDBghTSgxBAEMGyJBKBARNQQBDCMMHQwcDEEMHQwcDCEMGwwbDCIMIgwdATkGEjROGkUpHCRRNUwtLTElIU8UBjsmOSAjG0oNHkgGUAQBDDwvNxkjT0tLNT0wRQwIAT9OLBpCUQoaCgZNBAEMQC83QU8VTCgWMU0GFgQBDDNNBAEMNlAEAQwzKDAIBAEMNE4EAQw2UAQBDCtGBAEMPkwEAQw9QwQBDC9HBAEMPQEMUBlJBAEMS0sEAQxRHC9NHRUmHSkVCAYWBAEMFhlRGSIEAQwcLQEZLT0uCgYBJSo+FwQBDBUpRREmSAYVBAIBPHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy91bmlvbl90eXBlX21hc2suZGFydEVzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci90eXBlbWFza3MvdmFsdWVfdHlwZV9tYXNrLmRhcnSIty8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIG1hc2tzOwoKY2xhc3MgVmFsdWVUeXBlTWFzayBleHRlbmRzIEZvcndhcmRpbmdUeXBlTWFzayB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtWYWx1ZVR5cGVNYXNrXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ3ZhbHVlLXR5cGUtbWFzayc7CgogIEBvdmVycmlkZQogIGZpbmFsIFR5cGVNYXNrIGZvcndhcmRUbzsKICBmaW5hbCBQcmltaXRpdmVDb25zdGFudFZhbHVlIHZhbHVlOwoKICBWYWx1ZVR5cGVNYXNrKHRoaXMuZm9yd2FyZFRvLCB0aGlzLnZhbHVlKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtWYWx1ZVR5cGVNYXNrXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IFZhbHVlVHlwZU1hc2sucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIFR5cGVNYXNrIGZvcndhcmRUbyA9IG5ldyBUeXBlTWFzay5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBjbG9zZWRXb3JsZCk7CiAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gc291cmNlLnJlYWRDb25zdGFudCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBWYWx1ZVR5cGVNYXNrKGZvcndhcmRUbywgY29uc3RhbnQpOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbVmFsdWVUeXBlTWFza10gdG8gW3NpbmtdLgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKFR5cGVNYXNrS2luZC52YWx1ZSk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBmb3J3YXJkVG8ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZUNvbnN0YW50KHZhbHVlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBudWxsYWJsZSgpIHsKICAgIHJldHVybiBpc051bGxhYmxlID8gdGhpcyA6IG5ldyBWYWx1ZVR5cGVNYXNrKGZvcndhcmRUby5udWxsYWJsZSgpLCB2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayBub25OdWxsYWJsZSgpIHsKICAgIHJldHVybiBpc051bGxhYmxlCiAgICAgICAgPyBuZXcgVmFsdWVUeXBlTWFzayhmb3J3YXJkVG8ubm9uTnVsbGFibGUoKSwgdmFsdWUpCiAgICAgICAgOiB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNWYWx1ZSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGVxdWFsc0Rpc3JlZ2FyZE51bGwob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgVmFsdWVUeXBlTWFzaykgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHN1cGVyLmVxdWFsc0Rpc3JlZ2FyZE51bGwob3RoZXIpICYmIHZhbHVlID09IG90aGVyLnZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgaW50ZXJzZWN0aW9uKFR5cGVNYXNrIG90aGVyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIFR5cGVNYXNrIGZvcndhcmRJbnRlcnNlY3Rpb24gPSBmb3J3YXJkVG8uaW50ZXJzZWN0aW9uKG90aGVyLCBjbG9zZWRXb3JsZCk7CiAgICBpZiAoZm9yd2FyZEludGVyc2VjdGlvbi5pc0VtcHR5T3JOdWxsKSByZXR1cm4gZm9yd2FyZEludGVyc2VjdGlvbjsKICAgIHJldHVybiBmb3J3YXJkSW50ZXJzZWN0aW9uLmlzTnVsbGFibGUgPyBudWxsYWJsZSgpIDogbm9uTnVsbGFibGUoKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+IHN1cGVyID09IG90aGVyOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBjb21wdXRlSGFzaENvZGUodmFsdWUsIGlzTnVsbGFibGUsIGZvcndhcmRUbyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ1ZhbHVlKCRmb3J3YXJkVG8sIHZhbHVlOiAke3ZhbHVlLnRvRGFydFRleHQoKX0pJzsKICB9Cn0KUABOTjwBDwExRx0vAQwcJgEtATssNRdPNBUzBAExDCgoFSUfEwQBDBhPBAEMGxY8EAQBDBwBDCQvRQQBDERPR0gEAQwtAQwVOgQBDBY+BAIBPHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy92YWx1ZV90eXBlX21hc2suZGFydDFzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci90eXBlcy5kYXJ0wABXhC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHR5cGVzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAnLi4vY29tbW9uLmRhcnQnIHNob3cgZmFpbGVkQXQsIHJldGFpbkRhdGFGb3JUZXN0aW5nOwppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vdGFza3MuZGFydCcgc2hvdyBDb21waWxlclRhc2s7CmltcG9ydCAnLi4vY29tcGlsZXIuZGFydCcgc2hvdyBDb21waWxlcjsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2luZmVycmVkX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvdHlwZV9ncmFwaF9pbmZlcnJlci5kYXJ0JyBzaG93IFR5cGVHcmFwaEluZmVycmVyOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwppbXBvcnQgJ2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9pbmZlcnJlcl9lbmdpbmUuZGFydCc7CgovLy8gUmVzdWx0cyBhYm91dCBhIHNpbmdsZSBlbGVtZW50IChlLmcuIGEgbWV0aG9kLCBwYXJhbWV0ZXIsIG9yIGZpZWxkKQovLy8gcHJvZHVjZWQgYnkgdGhlIGdsb2JhbCB0eXBlLWluZmVyZW5jZSBhbGdvcml0aG0uCi8vLwovLy8gQWxsIHF1ZXJpZXMgaW4gdGhpcyBjbGFzcyBtYXkgY29udGFpbiByZXN1bHRzIHRoYXQgYXNzdW1lIHdob2xlLXByb2dyYW0KLy8vIGNsb3NlZC13b3JsZCBzZW1hbnRpY3MuIEFueSBbVHlwZU1hc2tdIGZvciBhbiBlbGVtZW50IG9yIG5vZGUgdGhhdCB3ZSByZXR1cm4KLy8vIHdhcyBpbmZlcnJlZCB0byBiZSBhICJndWFyYW50ZWVkIHR5cGUiLCB0aGF0IG1lYW5zLCBpdCBpcyBhIHR5cGUgdGhhdCB3ZQovLy8gY2FuIHByb3ZlIHRvIGJlIGNvcnJlY3QgZm9yIGFsbCBleGVjdXRpb25zIG9mIHRoZSBwcm9ncmFtLiAgQSB0cml2aWFsCi8vLyBpbXBsZW1lbnRhdGlvbiB3b3VsZCByZXR1cm4gZmFsc2Ugb24gYWxsIGJvb2xlYW4gcHJvcGVydGllcyAoZ2l2aW5nIG5vCi8vLyBndWFyYW50ZWVzKSBhbmQgdGhlIGBzdWJjbGFzcyBvZiBPYmplY3Qgb3IgbnVsbGAgdHlwZSBtYXNrIGZvciB0aGUgdHlwZQovLy8gYmFzZWQgcXVlcmllcyAodGhlIHJ1bnRpbWUgdmFsdWUgY291bGQgYmUgYW55dGhpbmcpLgphYnN0cmFjdCBjbGFzcyBHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0IHsKICAvLy8gRGVzZXJpYWxpemVzIGEgW0dsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHRdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UsCiAgICAgICAgICBpci5NZW1iZXIgY29udGV4dCwgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKSA9CiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHRJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZTsKCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdF0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmssIGlyLk1lbWJlciBjb250ZXh0LAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4pOwoKICAvLy8gVGhlIGluZmVycmVkIHR5cGUgd2hlbiB0aGlzIHJlc3VsdCBiZWxvbmdzIHRvIGEgZmllbGQsIG51bGwgb3RoZXJ3aXNlLgogIEFic3RyYWN0VmFsdWUgZ2V0IHR5cGU7CgogIC8vLyBXaGV0aGVyIHRoZSBtZW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzdWx0IGlzIG9ubHkgY2FsbGVkIG9uY2UgaW4gb25lCiAgLy8vIGxvY2F0aW9uIGluIHRoZSBlbnRpcmUgcHJvZ3JhbS4KICBib29sIGdldCBpc0NhbGxlZE9uY2U7CgogIC8vLyBXaGV0aGVyIHRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXN1bHQgYWx3YXlzIHRocm93cy4KICBib29sIGdldCB0aHJvd3NBbHdheXM7CgogIC8vLyBUaGUgaW5mZXJyZWQgcmV0dXJuIHR5cGUgd2hlbiB0aGlzIHJlc3VsdCBiZWxvbmdzIHRvIGEgZnVuY3Rpb24gZWxlbWVudC4KICBBYnN0cmFjdFZhbHVlIGdldCByZXR1cm5UeXBlOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiBhIHNlbmQgW25vZGVdLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbmFtZSB0aGlzLgogIEFic3RyYWN0VmFsdWUgdHlwZU9mU2VuZChpci5UcmVlTm9kZSBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGdldHRlciBpbiBhIGNvbXBsZXggc2VuZC1zZXQgW25vZGVdLCBmb3IgZXhhbXBsZSwKICAvLy8gdGhlIHR5cGUgb2YgdGhlIGBhLmZgIGdldHRlciBpbiBgYS5mICs9IGJgLgogIEFic3RyYWN0VmFsdWUgdHlwZU9mR2V0dGVyKGlyLlRyZWVOb2RlIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgaXRlcmF0b3IgaW4gYSBbbG9vcF0uCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZJdGVyYXRvcihpci5UcmVlTm9kZSBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGBtb3ZlTmV4dGAgY2FsbCBvZiBhbiBpdGVyYXRvciBpbiBhIFtsb29wXS4KICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yTW92ZU5leHQoaXIuVHJlZU5vZGUgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBgY3VycmVudGAgZ2V0dGVyIG9mIGFuIGl0ZXJhdG9yIGluIGEgW2xvb3BdLgogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JDdXJyZW50KGlyLlRyZWVOb2RlIG5vZGUpOwp9CgovLy8gSW50ZXJuYWwgZGF0YSB1c2VkIGR1cmluZyB0eXBlLWluZmVyZW5jZSB0byBzdG9yZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBhYm91dAovLy8gYSBzaW5nbGUgZWxlbWVudC4KYWJzdHJhY3QgY2xhc3MgR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhIHsKICAvLy8gRGVzZXJpYWxpemVzIGEgW0dsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGEucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlLAogICAgICAgICAgaXIuTWVtYmVyIGNvbnRleHQsIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbikgPQogICAgICBLZXJuZWxHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGEucmVhZEZyb21EYXRhU291cmNlOwoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGFdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rLCBpci5NZW1iZXIgY29udGV4dCwKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKTsKCiAgLy8vIENvbXByZXNzZXMgdGhlIGlubmVyIHJlcHJlc2VudGF0aW9uIGJ5IHJlbW92aW5nIFtBYnN0cmFjdFZhbHVlXSBtYXBwaW5ncwogIC8vLyB0byBgbnVsbGAuIFJldHVybnMgdGhlIGRhdGEgb2JqZWN0IGl0c2VsZiBvciBgbnVsbGAgaWYgdGhlIGRhdGEgb2JqZWN0CiAgLy8vIHdhcyBlbXB0eSBhZnRlciBjb21wcmVzc2lvbi4KICBHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGEgY29tcHJlc3MoKTsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMuIE1heWJlIHNwbGl0IGJ5IGFjY2Vzcy9pbnZva2UuCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZTZW5kKGlyLlRyZWVOb2RlIG5vZGUpOwogIEFic3RyYWN0VmFsdWUgdHlwZU9mR2V0dGVyKGlyLlRyZWVOb2RlIG5vZGUpOwoKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yKGlyLlRyZWVOb2RlIG5vZGUpOwoKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yTW92ZU5leHQoaXIuVHJlZU5vZGUgbm9kZSk7CgogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JDdXJyZW50KGlyLlRyZWVOb2RlIG5vZGUpOwp9CgovLy8gQVBJIHRvIGludGVyYWN0IHdpdGggdGhlIGdsb2JhbCB0eXBlLWluZmVyZW5jZSBlbmdpbmUuCmFic3RyYWN0IGNsYXNzIFR5cGVzSW5mZXJyZXIgewogIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGFuYWx5emVNYWluKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpOwp9CgovLy8gUmVzdWx0cyBwcm9kdWNlZCBieSB0aGUgZ2xvYmFsIHR5cGUtaW5mZXJlbmNlIGFsZ29yaXRobS4KLy8vCi8vLyBBbGwgcXVlcmllcyBpbiB0aGlzIGNsYXNzIG1heSBjb250YWluIHJlc3VsdHMgdGhhdCBhc3N1bWUgd2hvbGUtcHJvZ3JhbQovLy8gY2xvc2VkLXdvcmxkIHNlbWFudGljcy4gQW55IFtBYnN0cmFjdFZhbHVlXSBmb3IgYW4gZWxlbWVudCBvciBub2RlIHRoYXQgd2UKLy8vIHJldHVybiB3YXMgaW5mZXJyZWQgdG8gYmUgYSAiZ3VhcmFudGVlZCB0eXBlIiwgdGhhdCBtZWFucywgaXQgaXMgYSB0eXBlIHRoYXQKLy8vIHdlIGNhbiBwcm92ZSB0byBiZSBjb3JyZWN0IGZvciBhbGwgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbS4KYWJzdHJhY3QgY2xhc3MgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgewogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHNdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwKICAgICAgSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBJbmZlcnJlZERhdGEgaW5mZXJyZWREYXRhKSB7CiAgICBib29sIGlzVHJpdmlhbCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgaWYgKGlzVHJpdmlhbCkgewogICAgICByZXR1cm4gbmV3IFRyaXZpYWxHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyhjbG9zZWRXb3JsZCk7CiAgICB9CiAgICByZXR1cm4gbmV3IEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzSW1wbC5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgICAgc291cmNlLCBlbGVtZW50TWFwLCBjbG9zZWRXb3JsZCwgaW5mZXJyZWREYXRhKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0dsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaywgSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCk7CgogIEpDbG9zZWRXb3JsZCBnZXQgY2xvc2VkV29ybGQ7CgogIEluZmVycmVkRGF0YSBnZXQgaW5mZXJyZWREYXRhOwoKICBHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0IHJlc3VsdE9mTWVtYmVyKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICBBYnN0cmFjdFZhbHVlIHJlc3VsdE9mUGFyYW1ldGVyKExvY2FsIHBhcmFtZXRlcik7CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgW3NlbGVjdG9yXSB0byBhIHJlY2VpdmVyIHdpdGgKICAvLy8gdGhlIGdpdmVuIFtyZWNlaXZlcl0gdHlwZS4KICBBYnN0cmFjdFZhbHVlIHJlc3VsdFR5cGVPZlNlbGVjdG9yKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyKTsKCiAgLy8vIFJldHVybnMgd2hldGhlciBhIGZpeGVkLWxlbmd0aCBjb25zdHJ1Y3RvciBjYWxsIGdvZXMgdGhyb3VnaCBhIGdyb3dhYmxlCiAgLy8vIGNoZWNrLgogIGJvb2wgaXNGaXhlZEFycmF5Q2hlY2tlZEZvckdyb3dhYmxlKGlyLlRyZWVOb2RlIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiBhIGxpc3QgbmV3IGV4cHJlc3Npb24gW25vZGVdLgogIEFic3RyYWN0VmFsdWUgdHlwZU9mTmV3TGlzdChpci5UcmVlTm9kZSBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgYSBsaXN0IGxpdGVyYWwgW25vZGVdLgogIEFic3RyYWN0VmFsdWUgdHlwZU9mTGlzdExpdGVyYWwoaXIuVHJlZU5vZGUgbm9kZSk7Cn0KCi8vLyBHbG9iYWwgYW5hbHlzaXMgdGhhdCBpbmZlcnMgY29uY3JldGUgdHlwZXMuCmNsYXNzIEdsb2JhbFR5cGVJbmZlcmVuY2VUYXNrIGV4dGVuZHMgQ29tcGlsZXJUYXNrIHsKICAvLyBUT0RPKHNpZ211bmQpOiByZW5hbWUgYXQgdGhlIHNhbWUgdGltZSBhcyBvdXIgYmVuY2htYXJraW5nIHRvb2xzLgogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJ1R5cGUgaW5mZXJlbmNlJzsKCiAgZmluYWwgQ29tcGlsZXIgY29tcGlsZXI7CgogIC8vLyBUaGUgW1R5cGVHcmFwaEluZmVycmVyXSB1c2VkIGJ5IHRoZSBnbG9iYWwgdHlwZSBpbmZlcmVuY2UuIFRoaXMgc2hvdWxkIGJ5CiAgLy8vIGFjY2Vzc2VkIGZyb20gb3V0c2lkZSB0aGlzIGNsYXNzIGZvciB0ZXN0aW5nIG9ubHkuCiAgVHlwZUdyYXBoSW5mZXJyZXIgdHlwZXNJbmZlcnJlckludGVybmFsOwoKICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzRm9yVGVzdGluZzsKCiAgR2xvYmFsVHlwZUluZmVyZW5jZVRhc2soQ29tcGlsZXIgY29tcGlsZXIpCiAgICAgIDogY29tcGlsZXIgPSBjb21waWxlciwKICAgICAgICBzdXBlcihjb21waWxlci5tZWFzdXJlcik7CgogIC8vLyBSdW5zIHRoZSBnbG9iYWwgdHlwZS1pbmZlcmVuY2UgYWxnb3JpdGhtIG9uY2UuCiAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcnVuR2xvYmFsVHlwZUluZmVyZW5jZShGdW5jdGlvbkVudGl0eSBtYWluRWxlbWVudCwKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBJbmZlcnJlZERhdGFCdWlsZGVyIGluZmVycmVkRGF0YUJ1aWxkZXIpIHsKICAgIHJldHVybiBtZWFzdXJlKCgpIHsKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0czsKICAgICAgaWYgKGNvbXBpbGVyLmRpc2FibGVUeXBlSW5mZXJlbmNlKSB7CiAgICAgICAgcmVzdWx0cyA9IG5ldyBUcml2aWFsR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMoY2xvc2VkV29ybGQpOwogICAgICB9IGVsc2UgewogICAgICAgIHR5cGVzSW5mZXJyZXJJbnRlcm5hbCA/Pz0gY29tcGlsZXIuYmFja2VuZFN0cmF0ZWd5CiAgICAgICAgICAgIC5jcmVhdGVUeXBlc0luZmVycmVyKGNsb3NlZFdvcmxkLCBpbmZlcnJlZERhdGFCdWlsZGVyKTsKICAgICAgICByZXN1bHRzID0gdHlwZXNJbmZlcnJlckludGVybmFsLmFuYWx5emVNYWluKG1haW5FbGVtZW50KTsKICAgICAgfQogICAgICBjbG9zZWRXb3JsZC5ub1N1Y2hNZXRob2REYXRhLmNhdGVnb3JpemVDb21wbGV4SW1wbGVtZW50YXRpb25zKHJlc3VsdHMpOwogICAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgICByZXN1bHRzRm9yVGVzdGluZyA9IHJlc3VsdHM7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9KTsKICB9Cn0KCmNsYXNzIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzSW1wbCBpbXBsZW1lbnRzIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0dsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzXSBvYmplY3RzCiAgLy8vIGluIGEgZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2dsb2JhbC10eXBlLWluZmVyZW5jZS1yZXN1bHRzJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkOwogIEBvdmVycmlkZQogIGZpbmFsIEluZmVycmVkRGF0YSBpbmZlcnJlZERhdGE7CiAgZmluYWwgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCBfZGVhZEZpZWxkUmVzdWx0OwogIGZpbmFsIEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQgX2RlYWRNZXRob2RSZXN1bHQ7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZSBfdHJpdmlhbFBhcmFtZXRlclJlc3VsdDsKCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdD4gbWVtYmVyUmVzdWx0czsKICBmaW5hbCBNYXA8TG9jYWwsIEFic3RyYWN0VmFsdWU+IHBhcmFtZXRlclJlc3VsdHM7CiAgZmluYWwgU2V0PGlyLlRyZWVOb2RlPiBjaGVja2VkRm9yR3Jvd2FibGVMaXN0czsKICBmaW5hbCBTZXQ8U2VsZWN0b3I+IHJldHVybnNMaXN0RWxlbWVudFR5cGVTZXQ7CiAgZmluYWwgTWFwPGlyLlRyZWVOb2RlLCBBYnN0cmFjdFZhbHVlPiBfYWxsb2NhdGVkTGlzdHM7CgogIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzSW1wbCgKICAgICAgdGhpcy5jbG9zZWRXb3JsZCwKICAgICAgdGhpcy5pbmZlcnJlZERhdGEsCiAgICAgIHRoaXMubWVtYmVyUmVzdWx0cywKICAgICAgdGhpcy5wYXJhbWV0ZXJSZXN1bHRzLAogICAgICB0aGlzLmNoZWNrZWRGb3JHcm93YWJsZUxpc3RzLAogICAgICB0aGlzLnJldHVybnNMaXN0RWxlbWVudFR5cGVTZXQsCiAgICAgIHRoaXMuX2FsbG9jYXRlZExpc3RzKQogICAgICA6IF9kZWFkRmllbGRSZXN1bHQgPSBuZXcgRGVhZEZpZWxkR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdCgKICAgICAgICAgICAgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbiksCiAgICAgICAgX2RlYWRNZXRob2RSZXN1bHQgPSBuZXcgRGVhZE1ldGhvZEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLAogICAgICAgIF90cml2aWFsUGFyYW1ldGVyUmVzdWx0ID0gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZTsKCiAgZmFjdG9yeSBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0c0ltcGwucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwKICAgICAgSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBJbmZlcnJlZERhdGEgaW5mZXJyZWREYXRhKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIE1hcDxNZW1iZXJFbnRpdHksIEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQ+IG1lbWJlclJlc3VsdHMgPQogICAgICAgIHNvdXJjZS5yZWFkTWVtYmVyTWFwKChNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PgogICAgICAgICAgICBuZXcgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdC5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgICAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICAgICAgICBlbGVtZW50TWFwLmdldE1lbWJlckNvbnRleHROb2RlKG1lbWJlciksCiAgICAgICAgICAgICAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKSk7CiAgICBNYXA8TG9jYWwsIEFic3RyYWN0VmFsdWU+IHBhcmFtZXRlclJlc3VsdHMgPSBzb3VyY2UucmVhZExvY2FsTWFwKCgpID0+CiAgICAgICAgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgICAucmVhZEFic3RyYWN0VmFsdWVGcm9tRGF0YVNvdXJjZShzb3VyY2UpKTsKICAgIFNldDxpci5UcmVlTm9kZT4gY2hlY2tlZEZvckdyb3dhYmxlTGlzdHMgPSBzb3VyY2UucmVhZFRyZWVOb2RlcygpLnRvU2V0KCk7CiAgICBTZXQ8U2VsZWN0b3I+IHJldHVybnNMaXN0RWxlbWVudFR5cGVTZXQgPQogICAgICAgIHNvdXJjZS5yZWFkTGlzdCgoKSA9PiBuZXcgU2VsZWN0b3IucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSkpLnRvU2V0KCk7CiAgICBNYXA8aXIuVHJlZU5vZGUsIEFic3RyYWN0VmFsdWU+IGFsbG9jYXRlZExpc3RzID0gc291cmNlLnJlYWRUcmVlTm9kZU1hcCgKICAgICAgICAoKSA9PiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAgIC5yZWFkQWJzdHJhY3RWYWx1ZUZyb21EYXRhU291cmNlKHNvdXJjZSkpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0c0ltcGwoCiAgICAgICAgY2xvc2VkV29ybGQsCiAgICAgICAgaW5mZXJyZWREYXRhLAogICAgICAgIG1lbWJlclJlc3VsdHMsCiAgICAgICAgcGFyYW1ldGVyUmVzdWx0cywKICAgICAgICBjaGVja2VkRm9yR3Jvd2FibGVMaXN0cywKICAgICAgICByZXR1cm5zTGlzdEVsZW1lbnRUeXBlU2V0LAogICAgICAgIGFsbG9jYXRlZExpc3RzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmssIEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIHNpbmsud3JpdGVCb29sKGZhbHNlKTsgLy8gSXMgX25vdF8gdHJpdmlhbC4KICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXJNYXAoCiAgICAgICAgbWVtYmVyUmVzdWx0cywKICAgICAgICAoTWVtYmVyRW50aXR5IG1lbWJlciwgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCByZXN1bHQpID0+CiAgICAgICAgICAgIHJlc3VsdC53cml0ZVRvRGF0YVNpbmsoCiAgICAgICAgICAgICAgICBzaW5rLAogICAgICAgICAgICAgICAgZWxlbWVudE1hcC5nZXRNZW1iZXJDb250ZXh0Tm9kZShtZW1iZXIpLAogICAgICAgICAgICAgICAgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikpOwogICAgc2luay53cml0ZUxvY2FsTWFwKAogICAgICAgIHBhcmFtZXRlclJlc3VsdHMsCiAgICAgICAgKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgICAgLndyaXRlQWJzdHJhY3RWYWx1ZVRvRGF0YVNpbmsoc2luaywgdmFsdWUpKTsKICAgIHNpbmsud3JpdGVUcmVlTm9kZXMoY2hlY2tlZEZvckdyb3dhYmxlTGlzdHMpOwogICAgc2luay53cml0ZUxpc3QocmV0dXJuc0xpc3RFbGVtZW50VHlwZVNldCwKICAgICAgICAoU2VsZWN0b3Igc2VsZWN0b3IpID0+IHNlbGVjdG9yLndyaXRlVG9EYXRhU2luayhzaW5rKSk7CiAgICBzaW5rLndyaXRlVHJlZU5vZGVNYXAoCiAgICAgICAgX2FsbG9jYXRlZExpc3RzLAogICAgICAgIChBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAgIC53cml0ZUFic3RyYWN0VmFsdWVUb0RhdGFTaW5rKHNpbmssIHZhbHVlKSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCByZXN1bHRPZk1lbWJlcihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBhc3NlcnQoCiAgICAgICAgbWVtYmVyIGlzISBDb25zdHJ1Y3RvckJvZHlFbnRpdHksCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIG1lbWJlciwKICAgICAgICAgICAgInVuZXhwZWN0ZWQgaW5wdXQ6IENvbnN0cnVjdG9yQm9keUVsZW1lbnRzIGFyZSBjcmVhdGVkIgogICAgICAgICAgICAiIGFmdGVyIGdsb2JhbCB0eXBlIGluZmVyZW5jZSwgbm8gZGF0YSBpcyBhdmFpYWJsZSBmb3IgdGhlbS4iKSk7CiAgICAvLyBUT0RPKHNpZ211bmQsam9obm5pd2ludGhlcik6IE1ha2UgaXQgYW4gZXJyb3IgdG8gcXVlcnkgZm9yIHJlc3VsdHMgdGhhdAogICAgLy8gZG9uJ3QgZXhpc3QuLgogICAgLyphc3NlcnQobWVtYmVyUmVzdWx0cy5jb250YWluc0tleShtZW1iZXIpIHx8IG1lbWJlciBpcyBKU2lnbmF0dXJlTWV0aG9kLAogICAgICAgICJObyBpbmZlcmVuY2UgcmVzdWx0IGZvciBtZW1iZXIgJG1lbWJlciIpOyovCiAgICByZXR1cm4gbWVtYmVyUmVzdWx0c1ttZW1iZXJdID8/CiAgICAgICAgKG1lbWJlciBpcyBGdW5jdGlvbkVudGl0eSA/IF9kZWFkTWV0aG9kUmVzdWx0IDogX2RlYWRGaWVsZFJlc3VsdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHJlc3VsdE9mUGFyYW1ldGVyKExvY2FsIHBhcmFtZXRlcikgewogICAgLy8gVE9ETyhzaWdtdW5kLGpvaG5uaXdpbnRoZXIpOiBNYWtlIGl0IGFuIGVycm9yIHRvIHF1ZXJ5IGZvciByZXN1bHRzIHRoYXQKICAgIC8vIGRvbid0IGV4aXN0LgogICAgLyphc3NlcnQocGFyYW1ldGVyUmVzdWx0cy5jb250YWluc0tleShwYXJhbWV0ZXIpLAogICAgICAgICJObyBpbmZlcmVuY2UgcmVzdWx0IGZvciBwYXJhbWV0ZXIgJHBhcmFtZXRlciIpOyovCiAgICByZXR1cm4gcGFyYW1ldGVyUmVzdWx0c1twYXJhbWV0ZXJdID8/IF90cml2aWFsUGFyYW1ldGVyUmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSByZXN1bHRUeXBlT2ZTZWxlY3RvcigKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIpIHsKICAgIC8vIEJhaWxvdXQgZm9yIGNsb3N1cmUgY2FsbHMuIFdlJ3JlIG5vdCB0cmFja2luZyB0eXBlcyBvZgogICAgLy8gY2xvc3VyZXMuCiAgICBpZiAoc2VsZWN0b3IuaXNDbG9zdXJlQ2FsbCkKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgICBpZiAoc2VsZWN0b3IuaXNTZXR0ZXIgfHwgc2VsZWN0b3IuaXNJbmRleFNldCkgewogICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZTsKICAgIH0KICAgIGlmIChyZXR1cm5zTGlzdEVsZW1lbnRUeXBlKHNlbGVjdG9yLCByZWNlaXZlcikpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZ2V0Q29udGFpbmVyRWxlbWVudFR5cGUocmVjZWl2ZXIpOwogICAgfQogICAgaWYgKHJldHVybnNNYXBWYWx1ZVR5cGUoc2VsZWN0b3IsIHJlY2VpdmVyKSkgewogICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRNYXBWYWx1ZVR5cGUocmVjZWl2ZXIpOwogICAgfQoKICAgIGlmIChjbG9zZWRXb3JsZC5pbmNsdWRlc0Nsb3N1cmVDYWxsKHNlbGVjdG9yLCByZWNlaXZlcikpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgICB9IGVsc2UgewogICAgICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGVsZW1lbnRzID0KICAgICAgICAgIGNsb3NlZFdvcmxkLmxvY2F0ZU1lbWJlcnMoc2VsZWN0b3IsIHJlY2VpdmVyKTsKICAgICAgTGlzdDxBYnN0cmFjdFZhbHVlPiB0eXBlcyA9IDxBYnN0cmFjdFZhbHVlPltdOwogICAgICBmb3IgKE1lbWJlckVudGl0eSBlbGVtZW50IGluIGVsZW1lbnRzKSB7CiAgICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlID0gdHlwZU9mTWVtYmVyV2l0aFNlbGVjdG9yKGVsZW1lbnQsIHNlbGVjdG9yKTsKICAgICAgICB0eXBlcy5hZGQodHlwZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4udW5pb25PZk1hbnkodHlwZXMpOwogICAgfQogIH0KCiAgYm9vbCByZXR1cm5zTGlzdEVsZW1lbnRUeXBlKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIHJldHVybiBtYXNrICE9IG51bGwgJiYKICAgICAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmlzQ29udGFpbmVyKG1hc2spICYmCiAgICAgICAgcmV0dXJuc0xpc3RFbGVtZW50VHlwZVNldC5jb250YWlucyhzZWxlY3Rvcik7CiAgfQoKICBib29sIHJldHVybnNNYXBWYWx1ZVR5cGUoU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgcmV0dXJuIG1hc2sgIT0gbnVsbCAmJgogICAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uaXNNYXAobWFzaykgJiYKICAgICAgICBzZWxlY3Rvci5pc0luZGV4OwogIH0KCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZNZW1iZXJXaXRoU2VsZWN0b3IoCiAgICAgIE1lbWJlckVudGl0eSBlbGVtZW50LCBTZWxlY3RvciBzZWxlY3RvcikgewogICAgaWYgKGVsZW1lbnQubmFtZSA9PSBJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfICYmCiAgICAgICAgc2VsZWN0b3IubmFtZSAhPSBlbGVtZW50Lm5hbWUpIHsKICAgICAgLy8gQW4gaW52b2NhdGlvbiBjYW4gcmVzb2x2ZSB0byBhIFtub1N1Y2hNZXRob2RdLCBpbiB3aGljaCBjYXNlCiAgICAgIC8vIHdlIGdldCB0aGUgcmV0dXJuIHR5cGUgb2YgW25vU3VjaE1ldGhvZF0uCiAgICAgIHJldHVybiByZXN1bHRPZk1lbWJlcihlbGVtZW50KS5yZXR1cm5UeXBlOwogICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pc0dldHRlcikgewogICAgICBpZiAoZWxlbWVudC5pc0Z1bmN0aW9uKSB7CiAgICAgICAgLy8gW2Z1bmN0aW9uVHlwZV0gaXMgbnVsbCBpZiB0aGUgaW5mZXJyZXIgZGlkIG5vdCBydW4uCiAgICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZnVuY3Rpb25UeXBlOwogICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaXNGaWVsZCkgewogICAgICAgIHJldHVybiByZXN1bHRPZk1lbWJlcihlbGVtZW50KS50eXBlOwogICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaXNHZXR0ZXIpIHsKICAgICAgICByZXR1cm4gcmVzdWx0T2ZNZW1iZXIoZWxlbWVudCkucmV0dXJuVHlwZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoZmFsc2UsIGZhaWxlZEF0KGVsZW1lbnQsICJVbmV4cGVjdGVkIG1lbWJlciAkZWxlbWVudCIpKTsKICAgICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChlbGVtZW50LmlzR2V0dGVyIHx8IGVsZW1lbnQuaXNGaWVsZCkgewogICAgICBhc3NlcnQoc2VsZWN0b3IuaXNDYWxsIHx8IHNlbGVjdG9yLmlzU2V0dGVyKTsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gcmVzdWx0T2ZNZW1iZXIoZWxlbWVudCkucmV0dXJuVHlwZTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgYSBmaXhlZC1sZW5ndGggY29uc3RydWN0b3IgY2FsbCBnb2VzIHRocm91Z2ggYSBncm93YWJsZQogIC8vLyBjaGVjay4KICAvLyBUT0RPKHNpZ211bmQpOiBtb3ZlIGludG8gdGhlIHJlc3VsdCBvZiB0aGUgZWxlbWVudCBjb250YWluaW5nIHN1Y2gKICAvLyBjb25zdHJ1Y3RvciBjYWxsLgogIEBvdmVycmlkZQogIGJvb2wgaXNGaXhlZEFycmF5Q2hlY2tlZEZvckdyb3dhYmxlKGlyLk5vZGUgY3RvckNhbGwpID0+CiAgICAgIGNoZWNrZWRGb3JHcm93YWJsZUxpc3RzLmNvbnRhaW5zKGN0b3JDYWxsKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZOZXdMaXN0KGlyLk5vZGUgbm9kZSkgPT4gX2FsbG9jYXRlZExpc3RzW25vZGVdOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkxpc3RMaXRlcmFsKGlyLk5vZGUgbm9kZSkgPT4gX2FsbG9jYXRlZExpc3RzW25vZGVdOwp9CgpjbGFzcyBHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0SW1wbAogICAgaW1wbGVtZW50cyBHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0IHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0dsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHRdCiAgLy8vIG9iamVjdHMgaW4gYSBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnZ2xvYmFsLXR5cGUtaW5mZXJlbmNlLW1lbWJlci1yZXN1bHQnOwoKICBmaW5hbCBHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGEgX2RhdGE7CiAgQG92ZXJyaWRlCiAgZmluYWwgQWJzdHJhY3RWYWx1ZSByZXR1cm5UeXBlOwogIEBvdmVycmlkZQogIGZpbmFsIEFic3RyYWN0VmFsdWUgdHlwZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIHRocm93c0Fsd2F5czsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQ2FsbGVkT25jZTsKCiAgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdEltcGwodGhpcy5fZGF0YSwgdGhpcy5yZXR1cm5UeXBlLCB0aGlzLnR5cGUsCiAgICAgIHt0aGlzLnRocm93c0Fsd2F5cywgdGhpcy5pc0NhbGxlZE9uY2V9KTsKCiAgZmFjdG9yeSBHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0SW1wbC5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLAogICAgICBpci5NZW1iZXIgY29udGV4dCwKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YSBkYXRhID0gc291cmNlLnJlYWRWYWx1ZU9yTnVsbCgoKSB7CiAgICAgIHJldHVybiBuZXcgR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgICAgIHNvdXJjZSwgY29udGV4dCwgYWJzdHJhY3RWYWx1ZURvbWFpbik7CiAgICB9KTsKICAgIEFic3RyYWN0VmFsdWUgcmV0dXJuVHlwZSA9CiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5yZWFkQWJzdHJhY3RWYWx1ZUZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBBYnN0cmFjdFZhbHVlIHR5cGUgPQogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4ucmVhZEFic3RyYWN0VmFsdWVGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgYm9vbCB0aHJvd3NBbHdheXMgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNDYWxsZWRPbmNlID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHRJbXBsKGRhdGEsIHJldHVyblR5cGUsIHR5cGUsCiAgICAgICAgdGhyb3dzQWx3YXlzOiB0aHJvd3NBbHdheXMsIGlzQ2FsbGVkT25jZTogaXNDYWxsZWRPbmNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmssIGlyLk1lbWJlciBjb250ZXh0LAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4pIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVWYWx1ZU9yTnVsbChfZGF0YSwgKEdsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YSBkYXRhKSB7CiAgICAgIGRhdGEud3JpdGVUb0RhdGFTaW5rKHNpbmssIGNvbnRleHQsIGFic3RyYWN0VmFsdWVEb21haW4pOwogICAgfSk7CiAgICBhYnN0cmFjdFZhbHVlRG9tYWluLndyaXRlQWJzdHJhY3RWYWx1ZVRvRGF0YVNpbmsoc2luaywgcmV0dXJuVHlwZSk7CiAgICBhYnN0cmFjdFZhbHVlRG9tYWluLndyaXRlQWJzdHJhY3RWYWx1ZVRvRGF0YVNpbmsoc2luaywgdHlwZSk7CiAgICBzaW5rLndyaXRlQm9vbCh0aHJvd3NBbHdheXMpOwogICAgc2luay53cml0ZUJvb2woaXNDYWxsZWRPbmNlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZlNlbmQoaXIuTm9kZSBub2RlKSA9PiBfZGF0YT8udHlwZU9mU2VuZChub2RlKTsKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkdldHRlcihpci5Ob2RlIG5vZGUpID0+IF9kYXRhPy50eXBlT2ZHZXR0ZXIobm9kZSk7CiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZJdGVyYXRvcihpci5Ob2RlIG5vZGUpID0+IF9kYXRhPy50eXBlT2ZJdGVyYXRvcihub2RlKTsKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yTW92ZU5leHQoaXIuTm9kZSBub2RlKSA9PgogICAgICBfZGF0YT8udHlwZU9mSXRlcmF0b3JNb3ZlTmV4dChub2RlKTsKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yQ3VycmVudChpci5Ob2RlIG5vZGUpID0+CiAgICAgIF9kYXRhPy50eXBlT2ZJdGVyYXRvckN1cnJlbnQobm9kZSk7Cn0KCmNsYXNzIFRyaXZpYWxHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBpbXBsZW1lbnRzIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CiAgZmluYWwgVHJpdmlhbEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQgX3RyaXZpYWxNZW1iZXJSZXN1bHQ7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZSBfdHJpdmlhbFBhcmFtZXRlclJlc3VsdDsKICBAb3ZlcnJpZGUKICBmaW5hbCBJbmZlcnJlZERhdGEgaW5mZXJyZWREYXRhID0gbmV3IFRyaXZpYWxJbmZlcnJlZERhdGEoKTsKCiAgVHJpdmlhbEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzKHRoaXMuY2xvc2VkV29ybGQpCiAgICAgIDogX3RyaXZpYWxNZW1iZXJSZXN1bHQgPSBuZXcgVHJpdmlhbEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQoCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpLAogICAgICAgIF90cml2aWFsUGFyYW1ldGVyUmVzdWx0ID0gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaywgSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgc2luay53cml0ZUJvb2wodHJ1ZSk7IC8vIElzIHRyaXZpYWwuCiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRml4ZWRBcnJheUNoZWNrZWRGb3JHcm93YWJsZShpci5Ob2RlIG5vZGUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHJlc3VsdFR5cGVPZlNlbGVjdG9yKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSByZXN1bHRPZlBhcmFtZXRlcihMb2NhbCBwYXJhbWV0ZXIpIHsKICAgIHJldHVybiBfdHJpdmlhbFBhcmFtZXRlclJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQgcmVzdWx0T2ZNZW1iZXIoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgcmV0dXJuIF90cml2aWFsTWVtYmVyUmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZMaXN0TGl0ZXJhbChpci5UcmVlTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZk5ld0xpc3QoaXIuVHJlZU5vZGUgbm9kZSkgPT4gbnVsbDsKfQoKY2xhc3MgVHJpdmlhbEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQKICAgIGltcGxlbWVudHMgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCB7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZSBkeW5hbWljVHlwZTsKCiAgVHJpdmlhbEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQodGhpcy5keW5hbWljVHlwZSk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IHR5cGUgPT4gZHluYW1pY1R5cGU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IHJldHVyblR5cGUgPT4gZHluYW1pY1R5cGU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IHRocm93c0Fsd2F5cyA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZJdGVyYXRvckN1cnJlbnQoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yTW92ZU5leHQoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZHZXR0ZXIoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZlNlbmQoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NhbGxlZE9uY2UgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmssIGlyLk1lbWJlciBjb250ZXh0LAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4pIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJUcml2aWFsR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdC53cml0ZVRvRGF0YVNpbmsiKTsKICB9Cn0KCmNsYXNzIERlYWRGaWVsZEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHQKICAgIGltcGxlbWVudHMgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCB7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZSBkeW5hbWljVHlwZTsKICBmaW5hbCBBYnN0cmFjdFZhbHVlIGVtcHR5VHlwZTsKCiAgRGVhZEZpZWxkR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdChBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikKICAgICAgOiB0aGlzLmR5bmFtaWNUeXBlID0gZG9tYWluLmR5bmFtaWNUeXBlLAogICAgICAgIHRoaXMuZW1wdHlUeXBlID0gZG9tYWluLmVtcHR5VHlwZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXQgdHlwZSA9PiBlbXB0eVR5cGU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IHJldHVyblR5cGUgPT4gZHluYW1pY1R5cGU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IHRocm93c0Fsd2F5cyA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZJdGVyYXRvckN1cnJlbnQoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yTW92ZU5leHQoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZHZXR0ZXIoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZlNlbmQoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NhbGxlZE9uY2UgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmssIGlyLk1lbWJlciBjb250ZXh0LAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4pIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJEZWFkRmllbGRHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0LndyaXRlVG9EYXRhU2luayIpOwogIH0KfQoKY2xhc3MgRGVhZE1ldGhvZEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHQKICAgIGltcGxlbWVudHMgR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdCB7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZSBlbXB0eVR5cGU7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZSBmdW5jdGlvblR5cGU7CgogIERlYWRNZXRob2RHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKQogICAgICA6IHRoaXMuZnVuY3Rpb25UeXBlID0gZG9tYWluLmZ1bmN0aW9uVHlwZSwKICAgICAgICB0aGlzLmVtcHR5VHlwZSA9IGRvbWFpbi5lbXB0eVR5cGU7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgZ2V0IHR5cGUgPT4gZnVuY3Rpb25UeXBlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldCByZXR1cm5UeXBlID0+IGVtcHR5VHlwZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgdGhyb3dzQWx3YXlzID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yQ3VycmVudChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JNb3ZlTmV4dChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3IoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkdldHRlcihpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mU2VuZChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ2FsbGVkT25jZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaywgaXIuTWVtYmVyIGNvbnRleHQsCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbikgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkRlYWRGaWVsZEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHQud3JpdGVUb0RhdGFTaW5rIik7CiAgfQp9CoJ3AE5OPAEPASg9HzEpJCsnRi4yKiUrAUg1BExRTUpLTDkxTVBIPgFDOTABTRoBUCYZAUwZAU8gASknLgFQMjABNDIBSjoBSzkCAVEWMExPSD8BQjkwAU9NIy0BRS4wATIBOgE5AgE7H0ICAT0ETE9RQixIORkhICMoFUEGQjgEAT5CASABIQFHATQBTyFRAU4NOQE4MQExNQIBMDVHDCgBGwFQOSsBMAEtHSIBNVBLGCorRg87REIITiIlCBYIBAIBTU8iPQEMIgwjOjsvAUo0MjE5ASIYGRodJCYcQy5FLk8BPRkhICMXRzZEGDkzSyg3Ty5QTS43FS8VFhcaISMZBAEMQzAVGRdJJBY5MxgaQTkyLkAbGUE5EwQBDEgMKhIURE1PFU41JEsEAQw1TxQ2O0MEAQwmMz4RIDo0OgY2UAYzSAYBPzoNKDk1L0oZCEEGBAFHGz02BAFEGzcaBAEqMTUpRjMxJCA/PSQtJTMPSDwINjQ6DTEGBAFODUgXDDsyAQxGAQxKAgEqMUwqQwEuDCIMHAwbDBsBTi8BQhkZMRdGRDEIH0UZRSsrFUtBBAEMOTEVSUAISEIiIhMEAQxFDEkMTQw4Kww3KgIBUAwiRS8MPwE2SzpPAQxDKQQBDD4BDE44BAEMNSQEAQxIIQQBDD0BDDkCAS0xIwE8AQwpAQwvAQwiAQw9AQw+AQw2AQw0AQwyAQwiAQw5MSBDBAIBKTEjIQFBLysBDCcBDC8BDCIBDD0BDD4BDDYBDDQBDDIBDCIBDDkxID8EAgEqMSEkAUIxKwEMKgEMLQEMIgEMPQEMPgEMNgEMNAEMMgEMIgEMOTEgPwQCAShwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlcy5kYXJ0OHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0wABAXS8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuc291cmNlX2luZm9ybWF0aW9uOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIHNob3cgSmF2YVNjcmlwdE5vZGVTb3VyY2VJbmZvcm1hdGlvbjsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCc7CmltcG9ydCAnc291cmNlX2ZpbGUuZGFydCc7CmltcG9ydCAncG9zaXRpb25faW5mb3JtYXRpb24uZGFydCc7CgovLy8gSW50ZXJmYWNlIGZvciBwYXNzaW5nIHNvdXJjZSBpbmZvcm1hdGlvbiwgZm9yIGluc3RhbmNlIGZvciB1c2UgaW4gc291cmNlCi8vLyBtYXBzLCB0aHJvdWdoIHRoZSBiYWNrZW5kLgphYnN0cmFjdCBjbGFzcyBTb3VyY2VJbmZvcm1hdGlvbiBleHRlbmRzIEphdmFTY3JpcHROb2RlU291cmNlSW5mb3JtYXRpb24gewogIGNvbnN0IFNvdXJjZUluZm9ybWF0aW9uKCk7CgogIHN0YXRpYyBTb3VyY2VJbmZvcm1hdGlvbiByZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIGludCBoYXNTb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBpZiAoaGFzU291cmNlSW5mb3JtYXRpb24gPT0gMCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSBpZiAoaGFzU291cmNlSW5mb3JtYXRpb24gPT0gMSkgewogICAgICByZXR1cm4gY29uc3QgU291cmNlTWFwcGVkTWFya2VyKCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoaGFzU291cmNlSW5mb3JtYXRpb24gPT0gMik7CiAgICAgIHJldHVybiBQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgfQogIH0KCiAgc3RhdGljIHZvaWQgd3JpdGVUb0RhdGFTaW5rKAogICAgICBEYXRhU2luayBzaW5rLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaWYgKHNvdXJjZUluZm9ybWF0aW9uID09IG51bGwpIHsKICAgICAgc2luay53cml0ZUludCgwKTsKICAgIH0gZWxzZSBpZiAoc291cmNlSW5mb3JtYXRpb24gaXMgU291cmNlTWFwcGVkTWFya2VyKSB7CiAgICAgIHNpbmsud3JpdGVJbnQoMSk7CiAgICB9IGVsc2UgewogICAgICBzaW5rLndyaXRlSW50KDIpOwogICAgICBQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uIHBvc2l0aW9uU291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgcG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvbi53cml0ZVRvRGF0YVNpbmtJbnRlcm5hbChzaW5rKTsKICAgIH0KICB9CgogIFNvdXJjZVNwYW4gZ2V0IHNvdXJjZVNwYW47CgogIC8vLyBUaGUgc291cmNlIGxvY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIEpTIG5vZGUuCiAgU291cmNlTG9jYXRpb24gZ2V0IHN0YXJ0UG9zaXRpb24gPT4gbnVsbDsKCiAgLy8vIFRoZSBzb3VyY2UgbG9jYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGlubmVyIG9mIHRoZSBKUyBub2RlLgogIC8vLwogIC8vLyBUaGUgaW5uZXIgcG9zaXRpb24gaXMgZm9yIGluc3RhbmNlIGBmb28oKWAgaW4gYG8uZm9vKClgLgogIFNvdXJjZUxvY2F0aW9uIGdldCBpbm5lclBvc2l0aW9uID0+IG51bGw7CgogIC8vLyBUaGUgc291cmNlIGxvY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kIG9mIHRoZSBKUyBub2RlLgogIFNvdXJjZUxvY2F0aW9uIGdldCBlbmRQb3NpdGlvbiA9PiBudWxsOwoKICAvLy8gQSBsaXN0IGNvbnRhaW5pbmcgc3RhcnQsIGlubmVyLCBhbmQgZW5kIHBvc2l0aW9ucy4KICBMaXN0PFNvdXJjZUxvY2F0aW9uPiBnZXQgc291cmNlTG9jYXRpb25zOwoKICAvLy8gQSBsaXN0IG9mIGlubGluaW5nIGNvbnRleHQgbG9jYXRpb25zLgogIExpc3Q8RnJhbWVDb250ZXh0PiBnZXQgaW5saW5pbmdDb250ZXh0ID0+IG51bGw7CgogIC8vLyBSZXR1cm4gYSBzaG9ydCB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzb3VyY2UgbG9jYXRpb24uCiAgU3RyaW5nIGdldCBzaG9ydFRleHQ7Cn0KCi8vLyBDb250ZXh0IGluZm9ybWF0aW9uIGFib3V0IGlubGluZWQgY2FsbHMuCi8vLwovLy8gVGhpcyBpcyBhc3NvY2lhdGVkIHdpdGggU291cmNlSW5mb3JtYXRpb24gb2JqZWN0cyB0byBiZSBhYmxlIHRvIGVtaXQKLy8vIHByZWNpc2UgZGF0YSBhYm91dCBpbmxpbmluZyB0aGF0IGNhbiB0aGVuIGJlIHVzZWQgYnkgZGVmb2J1c2NhdGlvbiB0b29scwovLy8gd2hlbiByZWNvbnN0cnVjdGluZyBhIHNvdXJjZSBzdGFjayBmcm9tIGEgcHJvZHVjdGlvbiBzdGFjayB0cmFjZS4KY2xhc3MgRnJhbWVDb250ZXh0IHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdmcmFtZS1jb250ZXh0JzsKCiAgLy8vIExvY2F0aW9uIG9mIHRoZSBjYWxsIHRoYXQgd2FzIGlubGluZWQuCiAgZmluYWwgU291cmNlSW5mb3JtYXRpb24gY2FsbEluZm9ybWF0aW9uOwoKICAvLy8gTmFtZSBvZiB0aGUgbWV0aG9kIHRoYXQgd2FzIGlubGluZWQuCiAgZmluYWwgU3RyaW5nIGlubGluZWRNZXRob2ROYW1lOwoKICBGcmFtZUNvbnRleHQodGhpcy5jYWxsSW5mb3JtYXRpb24sIHRoaXMuaW5saW5lZE1ldGhvZE5hbWUpOwoKICBmYWN0b3J5IEZyYW1lQ29udGV4dC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgU291cmNlSW5mb3JtYXRpb24gY2FsbEluZm9ybWF0aW9uID0gc291cmNlLnJlYWRDYWNoZWQ8U291cmNlSW5mb3JtYXRpb24+KAogICAgICAgICgpID0+IFNvdXJjZUluZm9ybWF0aW9uLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpKTsKICAgIFN0cmluZyBpbmxpbmVkTWV0aG9kTmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEZyYW1lQ29udGV4dChjYWxsSW5mb3JtYXRpb24sIGlubGluZWRNZXRob2ROYW1lKTsKICB9CgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVDYWNoZWQ8U291cmNlSW5mb3JtYXRpb24+KAogICAgICAgIGNhbGxJbmZvcm1hdGlvbiwKICAgICAgICAoU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pID0+CiAgICAgICAgICAgIFNvdXJjZUluZm9ybWF0aW9uLndyaXRlVG9EYXRhU2luayhzaW5rLCBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgc2luay53cml0ZVN0cmluZyhpbmxpbmVkTWV0aG9kTmFtZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIihGcmFtZUNvbnRleHQ6ICRjYWxsSW5mb3JtYXRpb24sICRpbmxpbmVkTWV0aG9kTmFtZSkiOwp9CgovLy8gU3RyYXRlZ3kgZm9yIGNyZWF0aW5nLCBwcm9jZXNzaW5nIGFuZCBhcHBseWluZyBbU291cmNlSW5mb3JtYXRpb25dLgpjbGFzcyBTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5IHsKICBjb25zdCBTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5KCk7CgogIC8vLyBDcmVhdGUgYSBbU291cmNlSW5mb3JtYXRpb25CdWlsZGVyXSBmb3IgW21lbWJlcl0uCiAgU291cmNlSW5mb3JtYXRpb25CdWlsZGVyIGNyZWF0ZUJ1aWxkZXJGb3JDb250ZXh0KAogICAgICBjb3ZhcmlhbnQgTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgcmV0dXJuIG5ldyBTb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIoKTsKICB9CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIG1hcmtlciBmb3Igbm9uLXByZWFtYmxlIGNvZGUuCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRTb3VyY2VNYXBwZWRNYXJrZXIoKSA9PiBudWxsOwoKICAvLy8gQ2FsbGVkIHdoZW4gY29tcGlsYXRpb24gaGFzIGNvbXBsZXRlZC4KICB2b2lkIG9uQ29tcGxldGUoKSB7fQp9CgovLy8gSW50ZXJmYWNlIGZvciBnZW5lcmF0aW5nIFtTb3VyY2VJbmZvcm1hdGlvbl0uCmNsYXNzIFNvdXJjZUluZm9ybWF0aW9uQnVpbGRlciB7CiAgY29uc3QgU291cmNlSW5mb3JtYXRpb25CdWlsZGVyKCk7CgogIC8vLyBDcmVhdGUgYSBbU291cmNlSW5mb3JtYXRpb25CdWlsZGVyXSBmb3IgW21lbWJlcl0gd2l0aCBhZGRpdGlvbmFsIGlubGluaW5nCiAgLy8vIFtjb250ZXh0XS4KICBTb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIgZm9yQ29udGV4dCgKICAgICAgICAgIGNvdmFyaWFudCBNZW1iZXJFbnRpdHkgbWVtYmVyLCBTb3VyY2VJbmZvcm1hdGlvbiBjb250ZXh0KSA9PgogICAgICB0aGlzOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBbbWVtYmVyXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZERlY2xhcmF0aW9uKGNvdmFyaWFudCBNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIHN0dWIgb2YgW2NhbGxTdHJ1Y3R1cmVdIGZvciBbbWVtYmVyXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZFN0dWIoCiAgICAgICAgICBjb3ZhcmlhbnQgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24sIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgPT4KICAgICAgbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSBnZW5lcmljIFtub2RlXS4KICBAZGVwcmVjYXRlZAogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkR2VuZXJpYyhpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciBhbiBpbnN0YW50aWF0aW9uIG9mIGEgY2xhc3MgdXNpbmcgW25vZGVdCiAgLy8vIGZvciB0aGUgc291cmNlIHBvc2l0aW9uLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQ3JlYXRlKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSByZXR1cm4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkUmV0dXJuKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIGFuIGltcGxpY2l0IHJldHVybiBpbiBbZWxlbWVudF0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRJbXBsaWNpdFJldHVybihjb3ZhcmlhbnQgTWVtYmVyRW50aXR5IGVsZW1lbnQpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgbG9vcCBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRMb29wKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIGEgcmVhZCBhY2Nlc3MgbGlrZSBgYS5iYC4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEdldChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciBhIHdyaXRlIGFjY2VzcyBsaWtlIGBhLmIgPSAzYC4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZFNldChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciBhIGNhbGwgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQ2FsbChpci5Ob2RlIHJlY2VpdmVyLCBpci5Ob2RlIGNhbGwpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgaWYgc3RhdGVtZW50IGluIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZElmKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIGluIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZE5ldyhpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgdGhyb3cgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkVGhyb3coaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIGFzc2VydCBpbiBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRBc3NlcnQoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIGFzc2lnbm1lbnQgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQXNzaWdubWVudChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gaW5zZXJ0ZWQgYXMKICAvLy8gZmlyc3Qgc3RhdGVtZW50IG9mIGEgZnVuY3Rpb24uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRWYXJpYWJsZURlY2xhcmF0aW9uKCkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSBhd2FpdCBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRBd2FpdChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgeWllbGQgb3IgeWllbGQqIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZFlpZWxkKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIGFzeW5jL2F3YWl0IGJvaWxlciBwbGF0ZSBjb2RlLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQXN5bmNCb2R5KCkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIGV4aXRpbmcgYXN5bmMvYXdhaXQgY29kZS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEFzeW5jRXhpdCgpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciBhbiBpbnZvY2F0aW9uIG9mIGEgZm9yZWlnbiBtZXRob2QuCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRGb3JlaWduQ29kZShpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciBhIHN0cmluZyBpbnRlcnBvbGF0aW9uIG9mIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZFN0cmluZ0ludGVycG9sYXRpb24oaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIGZvci1pbiBgaXRlcmF0b3JgIGFjY2VzcyBpbiBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRGb3JJbkl0ZXJhdG9yKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSBmb3ItaW4gYG1vdmVOZXh0YCBjYWxsIGluIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEZvckluTW92ZU5leHQoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIGZvci1pbiBgY3VycmVudGAgYWNjZXNzIGluIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEZvckluQ3VycmVudChpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgZm9yLWluIHZhcmlhYmxlIGFzc2lnbm1lbnQgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkRm9ySW5TZXQoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIG9wZXJhdG9yIGBbXWAgYWNjZXNzIGluIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEluZGV4KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSBvcGVyYXRvciBgW109YCBhc3NpZ25tZW50IGluIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEluZGV4U2V0KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSBiaW5hcnkgb3BlcmF0aW9uIGluIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEJpbmFyeShpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgdW5hcnkgb3BlcmF0aW9uIGluIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZFVuYXJ5KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSB0cnkgc3RhdGVtZW50IGluIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZFRyeShpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIC8vLyBHZW5lcmF0ZSBbU291cmNlSW5mb3JtYXRpb25dIGZvciB0aGUgdW5hcnkgb3BlcmF0b3IgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQ2F0Y2goaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIGlzLXRlc3QgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkSXMoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIGFzLWNhc3QgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQXMoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkU3dpdGNoKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSBzd2l0Y2ggY2FzZSBpbiBbbm9kZV0uCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRTd2l0Y2hDYXNlKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8vIEdlbmVyYXRlIFtTb3VyY2VJbmZvcm1hdGlvbl0gZm9yIHRoZSBsaXN0IGxpdGVyYWwgaW4gW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkTGlzdExpdGVyYWwoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICAvLy8gR2VuZXJhdGUgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgdGhlIGJyZWFrL2NvbnRpbnVlIGluIFtub2RlXS4KICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEdvdG8oaXIuTm9kZSBub2RlKSA9PiBudWxsOwp9CgovLy8gQSBsb2NhdGlvbiBpbiBhIHNvdXJjZSBmaWxlLgphYnN0cmFjdCBjbGFzcyBTb3VyY2VMb2NhdGlvbiB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnc291cmNlLWxvY2F0aW9uJzsKCiAgY29uc3QgU291cmNlTG9jYXRpb24oKTsKCiAgLy8vIFRoZSBhYnNvbHV0ZSBVUkkgb2YgdGhlIHNvdXJjZSBmaWxlIG9mIHRoaXMgc291cmNlIGxvY2F0aW9uLgogIFVyaSBnZXQgc291cmNlVXJpOwoKICAvLy8gVGhlIGNoYXJhY3RlciBvZmZzZXQgb2YgdGhlIHRoaXMgc291cmNlIGxvY2F0aW9uIGludG8gdGhlIHNvdXJjZSBmaWxlLgogIGludCBnZXQgb2Zmc2V0OwoKICAvLy8gVGhlIDEtYmFzZWQgbGluZSBudW1iZXIgb2YgdGhlIFtvZmZzZXRdLgogIGludCBnZXQgbGluZTsKCiAgLy8vIFRoZSAxLWJhc2VkIGNvbHVtbiBudW1iZXIgb2YgdGhlIFtvZmZzZXRdIHdpdGggaXRzIGxpbmUuCiAgaW50IGdldCBjb2x1bW47CgogIC8vLyBUaGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzb3VyY2UgbG9jYXRpb24sIGlmIGFueS4KICBTdHJpbmcgZ2V0IHNvdXJjZU5hbWU7CgogIHN0YXRpYyBTb3VyY2VMb2NhdGlvbiByZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIGludCBoYXNTb3VyY2VMb2NhdGlvbiA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBpZiAoaGFzU291cmNlTG9jYXRpb24gPT0gMCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSBpZiAoaGFzU291cmNlTG9jYXRpb24gPT0gMSkgewogICAgICByZXR1cm4gY29uc3QgTm9Tb3VyY2VMb2NhdGlvbk1hcmtlcigpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGhhc1NvdXJjZUxvY2F0aW9uID09IDIpOwogICAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgICAgVXJpIHNvdXJjZVVyaSA9IHNvdXJjZS5yZWFkVXJpKCk7CiAgICAgIGludCBvZmZzZXQgPSBzb3VyY2UucmVhZEludCgpOwogICAgICBpbnQgbGluZSA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgIGludCBjb2x1bW4gPSBzb3VyY2UucmVhZEludCgpOwogICAgICBTdHJpbmcgc291cmNlTmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgIHNvdXJjZS5lbmQodGFnKTsKICAgICAgcmV0dXJuIG5ldyBEaXJlY3RTb3VyY2VMb2NhdGlvbigKICAgICAgICAgIHNvdXJjZVVyaSwgb2Zmc2V0LCBsaW5lLCBjb2x1bW4sIHNvdXJjZU5hbWUpOwogICAgfQogIH0KCiAgc3RhdGljIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmssIFNvdXJjZUxvY2F0aW9uIHNvdXJjZUxvY2F0aW9uKSB7CiAgICBpZiAoc291cmNlTG9jYXRpb24gPT0gbnVsbCkgewogICAgICBzaW5rLndyaXRlSW50KDApOwogICAgfSBlbHNlIGlmIChzb3VyY2VMb2NhdGlvbiBpcyBOb1NvdXJjZUxvY2F0aW9uTWFya2VyKSB7CiAgICAgIHNpbmsud3JpdGVJbnQoMSk7CiAgICB9IGVsc2UgewogICAgICBzaW5rLndyaXRlSW50KDIpOwogICAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICAgIHNpbmsud3JpdGVVcmkoc291cmNlTG9jYXRpb24uc291cmNlVXJpKTsKICAgICAgc2luay53cml0ZUludChzb3VyY2VMb2NhdGlvbi5vZmZzZXQpOwogICAgICBzaW5rLndyaXRlSW50KHNvdXJjZUxvY2F0aW9uLmxpbmUpOwogICAgICBzaW5rLndyaXRlSW50KHNvdXJjZUxvY2F0aW9uLmNvbHVtbik7CiAgICAgIHNpbmsud3JpdGVTdHJpbmcoc291cmNlTG9jYXRpb24uc291cmNlTmFtZSk7CiAgICAgIHNpbmsuZW5kKHRhZyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBzb3VyY2VVcmkuaGFzaENvZGUgKiAxNyArCiAgICAgICAgb2Zmc2V0Lmhhc2hDb2RlICogMTkgKwogICAgICAgIHNvdXJjZU5hbWUuaGFzaENvZGUgKiAyMzsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBvdGhlciBpcyBTb3VyY2VMb2NhdGlvbiAmJgogICAgICAgIHNvdXJjZVVyaSA9PSBvdGhlci5zb3VyY2VVcmkgJiYKICAgICAgICBvZmZzZXQgPT0gb3RoZXIub2Zmc2V0ICYmCiAgICAgICAgc291cmNlTmFtZSA9PSBvdGhlci5zb3VyY2VOYW1lOwogIH0KCiAgU3RyaW5nIGdldCBzaG9ydFRleHQgPT4gJyR7c291cmNlVXJpPy5wYXRoU2VnbWVudHM/Lmxhc3R9OlskbGluZSwkY29sdW1uXSc7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICcke3NvdXJjZVVyaX06WyR7bGluZX0sJHtjb2x1bW59XSc7Cn0KCmNsYXNzIERpcmVjdFNvdXJjZUxvY2F0aW9uIGV4dGVuZHMgU291cmNlTG9jYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFVyaSBzb3VyY2VVcmk7CgogIEBvdmVycmlkZQogIGZpbmFsIGludCBvZmZzZXQ7CgogIEBvdmVycmlkZQogIGZpbmFsIGludCBsaW5lOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgY29sdW1uOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgc291cmNlTmFtZTsKCiAgRGlyZWN0U291cmNlTG9jYXRpb24oCiAgICAgIHRoaXMuc291cmNlVXJpLCB0aGlzLm9mZnNldCwgdGhpcy5saW5lLCB0aGlzLmNvbHVtbiwgdGhpcy5zb3VyY2VOYW1lKTsKfQoKLy8vIEEgbG9jYXRpb24gaW4gYSBzb3VyY2UgZmlsZS4KYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTb3VyY2VMb2NhdGlvbiBleHRlbmRzIFNvdXJjZUxvY2F0aW9uIHsKICBmaW5hbCBTb3VyY2VGaWxlIF9zb3VyY2VGaWxlOwogIGlyLkxvY2F0aW9uIF9sb2NhdGlvbjsKCiAgQWJzdHJhY3RTb3VyY2VMb2NhdGlvbih0aGlzLl9zb3VyY2VGaWxlKSB7CiAgICBhc3NlcnQoCiAgICAgICAgb2Zmc2V0IDwgX3NvdXJjZUZpbGUubGVuZ3RoLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBuZXcgU291cmNlU3Bhbihzb3VyY2VVcmksIDAsIDApLAogICAgICAgICAgICAiSW52YWxpZCBzb3VyY2UgbG9jYXRpb24gaW4gJHtzb3VyY2VVcml9OiAiCiAgICAgICAgICAgICJvZmZzZXQ9JG9mZnNldCwgbGVuZ3RoPSR7X3NvdXJjZUZpbGUubGVuZ3RofS4iKSk7CiAgfQoKICBBYnN0cmFjdFNvdXJjZUxvY2F0aW9uLmZyb21Mb2NhdGlvbih0aGlzLl9sb2NhdGlvbikgOiBfc291cmNlRmlsZSA9IG51bGw7CgogIEFic3RyYWN0U291cmNlTG9jYXRpb24uZnJvbU90aGVyKEFic3RyYWN0U291cmNlTG9jYXRpb24gbG9jYXRpb24pCiAgICAgIDogdGhpcy5mcm9tTG9jYXRpb24obG9jYXRpb24uX2xvY2F0aW9uKTsKCiAgQG92ZXJyaWRlCiAgVXJpIGdldCBzb3VyY2VVcmkgPT4gX3NvdXJjZUZpbGUudXJpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IG9mZnNldDsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsaW5lID0+IChfbG9jYXRpb24gPz89IF9zb3VyY2VGaWxlLmdldExvY2F0aW9uKG9mZnNldCkpLmxpbmU7CgogIEBvdmVycmlkZQogIGludCBnZXQgY29sdW1uID0+IChfbG9jYXRpb24gPz89IF9zb3VyY2VGaWxlLmdldExvY2F0aW9uKG9mZnNldCkpLmNvbHVtbjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBzb3VyY2VOYW1lOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHNob3J0VGV4dCA9PiAnJHtzb3VyY2VVcmkucGF0aFNlZ21lbnRzLmxhc3R9OlskbGluZSwkY29sdW1uXSc7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICcke3NvdXJjZVVyaX06WyRsaW5lLCRjb2x1bW5dJzsKfQoKY2xhc3MgT2Zmc2V0U291cmNlTG9jYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFNvdXJjZUxvY2F0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgb2Zmc2V0OwogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBzb3VyY2VOYW1lOwoKICBPZmZzZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VGaWxlIHNvdXJjZUZpbGUsIHRoaXMub2Zmc2V0LCB0aGlzLnNvdXJjZU5hbWUpCiAgICAgIDogc3VwZXIoc291cmNlRmlsZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgc2hvcnRUZXh0ID0+ICcke3N1cGVyLnNob3J0VGV4dH06JHNvdXJjZU5hbWUnOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtzdXBlci50b1N0cmluZygpfTokc291cmNlTmFtZSc7Cn0KCi8vLyBDb21wdXRlIHRoZSBzb3VyY2UgbWFwIG5hbWUgZm9yIFtlbGVtZW50XS4gSWYgW2NhbGxTdHJ1Y3R1cmVdIGlzIG5vbi1udWxsCi8vLyBpdCBpcyB1c2VkIHRvIG5hbWUgdGhlIHBhcmFtZXRlciBzdHViIGZvciBbZWxlbWVudF0uCi8vIFRPRE8oam9obm5pd2ludGhlcik6IE1lcmdlIHRoaXMgd2l0aCBgY29tcHV0ZUtlcm5lbEVsZW1lbnROYW1lRm9yU291cmNlTWFwc2AKLy8gd2hlbiB0aGUgb2xkIGZyb250ZW5kIGlzIHJlbW92ZWQuClN0cmluZyBjb21wdXRlRWxlbWVudE5hbWVGb3JTb3VyY2VNYXBzKEVudGl0eSBlbGVtZW50LAogICAgW0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZV0pIHsKICBpZiAoZWxlbWVudCBpcyBDbGFzc0VudGl0eSkgewogICAgcmV0dXJuIGVsZW1lbnQubmFtZTsKICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgTWVtYmVyRW50aXR5KSB7CiAgICBTdHJpbmcgc3VmZml4ID0gY29tcHV0ZVN0dWJTdWZmaXgoY2FsbFN0cnVjdHVyZSk7CiAgICBpZiAoZWxlbWVudCBpcyBDb25zdHJ1Y3RvckVudGl0eSB8fCBlbGVtZW50IGlzIENvbnN0cnVjdG9yQm9keUVudGl0eSkgewogICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzcy5uYW1lOwogICAgICBpZiAoZWxlbWVudC5uYW1lID09ICcnKSB7CiAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKICAgICAgfQogICAgICByZXR1cm4gJyRjbGFzc05hbWUuJHtlbGVtZW50Lm5hbWV9JHN1ZmZpeCc7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICBpZiAoZWxlbWVudC5lbmNsb3NpbmdDbGFzcy5pc0Nsb3N1cmUpIHsKICAgICAgICByZXR1cm4gY29tcHV0ZUVsZW1lbnROYW1lRm9yU291cmNlTWFwcygKICAgICAgICAgICAgZWxlbWVudC5lbmNsb3NpbmdDbGFzcywgY2FsbFN0cnVjdHVyZSk7CiAgICAgIH0KICAgICAgcmV0dXJuICcke2VsZW1lbnQuZW5jbG9zaW5nQ2xhc3MubmFtZX0uJHtlbGVtZW50Lm5hbWV9JHN1ZmZpeCc7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJyR7ZWxlbWVudC5uYW1lfSRzdWZmaXgnOwogICAgfQogIH0KICAvLyBUT0RPKHJlZGVtcHRpb24pOiBDcmVhdGUgZWxlbWVudCBuYW1lcyBmcm9tIGtlcm5lbCBsb2NhbHMgYW5kIGNsb3N1cmVzLgogIHJldHVybiBlbGVtZW50Lm5hbWU7Cn0KCi8vLyBDb21wdXRlIHRoZSBzdWZmaXggdXNlZCBmb3IgYSBwYXJhbWV0ZXIgc3R1YiBmb3IgW2NhbGxTdHJ1Y3R1cmVdLgpTdHJpbmcgY29tcHV0ZVN0dWJTdWZmaXgoQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgaWYgKGNhbGxTdHJ1Y3R1cmUgPT0gbnVsbCkgcmV0dXJuICcnOwogIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBzYi53cml0ZShyJ1tmdW5jdGlvbi1lbnRyeSQnKTsKICBzYi53cml0ZShjYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudENvdW50KTsKICBpZiAoY2FsbFN0cnVjdHVyZS5uYW1lZEFyZ3VtZW50cy5pc05vdEVtcHR5KSB7CiAgICBzYi53cml0ZShyJyQnKTsKICAgIHNiLndyaXRlKGNhbGxTdHJ1Y3R1cmUuZ2V0T3JkZXJlZE5hbWVkQXJndW1lbnRzKCkuam9pbihyJyQnKSk7CiAgfQogIHNiLndyaXRlKCddJyk7CiAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Cn0KCmNsYXNzIE5vU291cmNlTG9jYXRpb25NYXJrZXIgZXh0ZW5kcyBTb3VyY2VMb2NhdGlvbiB7CiAgY29uc3QgTm9Tb3VyY2VMb2NhdGlvbk1hcmtlcigpOwoKICBAb3ZlcnJpZGUKICBVcmkgZ2V0IHNvdXJjZVVyaSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHNvdXJjZU5hbWUgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBjb2x1bW4gPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsaW5lID0+IG51bGw7CgogIEBvdmVycmlkZQogIGludCBnZXQgb2Zmc2V0ID0+IG51bGw7CgogIFN0cmluZyBnZXQgc2hvcnROYW1lID0+ICc8bm8tbG9jYXRpb24+JzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJzxuby1sb2NhdGlvbj4nOwp9CgovLy8gSW5mb3JtYXRpb24gdHJhY2tlZCBhYm91dCBpbmxpbmVkIGZyYW1lcy4KLy8vCi8vLyBEYXJ0MmpzIGFkZHMgYW4gZXh0ZW5zaW9uIHRvIHNvdXJjZS1tYXAgZmlsZXMgdG8gdHJhY2sgd2hlcmUgY2FsbHMgYXJlCi8vLyBpbmxpbmVkLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gaW1wcm92ZSB0aGUgcHJlY2lzaW9uIG9mIHRvb2xzIHRoYXQKLy8vIGRlb2JmdXNjYXRlIHByb2R1Y3Rpb24gc3RhY2sgdHJhY2VzLgpjbGFzcyBGcmFtZUVudHJ5IHsKICAvLy8gRm9yIHB1c2ggb3BlcmF0aW9ucywgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbmxpbmluZyBjYWxsLCBvdGhlcndpc2UgbnVsbC4KICBmaW5hbCBTb3VyY2VMb2NhdGlvbiBwdXNoTG9jYXRpb247CgogIC8vLyBGb3IgcHVzaCBvcGVyYXRpb25zLCB0aGUgaW5saW5lZCBtZXRob2QgbmFtZSwgb3RoZXJ3aXNlIG51bGwuCiAgZmluYWwgU3RyaW5nIGlubGluZWRNZXRob2ROYW1lOwoKICAvLy8gV2hldGhlciBhIHBvcCBpcyB0aGUgbGFzdCBwb3AgdGhhdCBtYWtlcyB0aGUgaW5saW5pbmcgc3RhY2sgZW1wdHkuCiAgZmluYWwgYm9vbCBpc0VtcHR5UG9wOwoKICBGcmFtZUVudHJ5LnB1c2godGhpcy5wdXNoTG9jYXRpb24sIHRoaXMuaW5saW5lZE1ldGhvZE5hbWUpCiAgICAgIDogaXNFbXB0eVBvcCA9IGZhbHNlOwoKICBGcmFtZUVudHJ5LnBvcCh0aGlzLmlzRW1wdHlQb3ApCiAgICAgIDogcHVzaExvY2F0aW9uID0gbnVsbCwKICAgICAgICBpbmxpbmVkTWV0aG9kTmFtZSA9IG51bGw7CgogIGJvb2wgZ2V0IGlzUHVzaCA9PiBwdXNoTG9jYXRpb24gIT0gbnVsbDsKICBib29sIGdldCBpc1BvcCA9PiBwdXNoTG9jYXRpb24gPT0gbnVsbDsKfQqB+gBOTjwBJAEoGSQ9LiobJAFNH0sdAUMxJRMsKQ0pQwYEAR88JRg6GA0YTz8GBAEdAUQsAUMGPywBQioBOSwBLDIBRBgCAS0ESU1GFS0BLSsBKyIBPgE/F049NBVBBAEoFSkZMUkpEwQBDE8CAUgiJQE4NCcrBAFBNwEtFwIBMiEkAVARJ0cMAUhNAVEfTQwBOw44AVAfNwE6NwFIUQE4NQFBNAFGNAE5RwFDMwFNNAE8NgE9NwFBOwFMJTgBOTYBQzYBRi4BQS4BSjwBSUQBTz4BTT4BTj0BUTkBSzYBUDkBRzcBRjYBRDQBRTYBPjMBPjMBRDcBQjsBQzwBRTUCASEgLwEaAUMVAU0SAS8QAT8SAT0ZAUAuIhMpLQ0mGSglIyUvFyc4BgQBTiIYOxgNGBcvLCosMxUGBAEMFSUfIgQBDBwtJigiKAQBTgEMOwIBNAwXAQwUAQwSAQwUAQwbARhNAgEhPyAZAS0MJRItOD8EAUwBRC8BDCgBDBIBDEgBDEwBDBkBDEwBDDcCATwMFAwbAUwbAQw8AQw6AgFOOVAlNyUgGSg2TDYgGggyMS4wNAhGDScGBE0XAgFGOCgoITMxFEMEERgCATYiAQwdAQwhAQwaAQwYAQwaASsBDCgCAS4ES00pE04lAUQiAUkZAT0cASIdIgErKgIBL3BhY2thZ2U6Y29tcGlsZXIvc3JjL2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0NXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvYmFja2VuZC5kYXJ0qcsvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBqc19iYWNrZW5kLmJhY2tlbmQ7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vY29kZWdlbi5kYXJ0JzsKaW1wb3J0ICcuLi9kZWZlcnJlZF9sb2FkLmRhcnQnIHNob3cgRGVmZXJyZWRMb2FkVGFzazsKaW1wb3J0ICcuLi9kdW1wX2luZm8uZGFydCcgc2hvdyBEdW1wSW5mb1Rhc2s7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZW5xdWV1ZS5kYXJ0JyBzaG93IFJlc29sdXRpb25FbnF1ZXVlcjsKaW1wb3J0ICcuLi9mcm9udGVuZF9zdHJhdGVneS5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi90cmFjZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfaW1wYWN0LmRhcnQnCiAgICBzaG93IEltcGFjdFN0cmF0ZWd5LCBJbXBhY3RVc2VDYXNlLCBXb3JsZEltcGFjdCwgV29ybGRJbXBhY3RWaXNpdG9yOwppbXBvcnQgJ2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJ2NoZWNrZWRfbW9kZV9oZWxwZXJzLmRhcnQnOwppbXBvcnQgJ25hbWVyLmRhcnQnOwppbXBvcnQgJ3J1bnRpbWVfdHlwZXMuZGFydCc7CmltcG9ydCAncnVudGltZV90eXBlc19jb2RlZ2VuLmRhcnQnOwppbXBvcnQgJ3J1bnRpbWVfdHlwZXNfbmV3LmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgRnVuY3Rpb25Db21waWxlciB7CiAgdm9pZCBpbml0aWFsaXplKAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzLCBDb2RlZ2VuSW5wdXRzIGNvZGVnZW4pOwoKICAvLy8gR2VuZXJhdGVzIEphdmFTY3JpcHQgY29kZSBmb3IgW21lbWJlcl0uCiAgQ29kZWdlblJlc3VsdCBjb21waWxlKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICBJdGVyYWJsZSBnZXQgdGFza3M7Cn0KCi8qCiAqIEludmFyaWFudHM6CiAqICAgY2FuSW5saW5lKGZ1bmN0aW9uKSBpbXBsaWVzIGNhbklubGluZShmdW5jdGlvbiwgaW5zaWRlTG9vcDp0cnVlKQogKiAgICFjYW5JbmxpbmUoZnVuY3Rpb24sIGluc2lkZUxvb3A6IHRydWUpIGltcGxpZXMgIWNhbklubGluZShmdW5jdGlvbikKICovCmNsYXNzIEZ1bmN0aW9uSW5saW5lQ2FjaGUgewogIHN0YXRpYyBjb25zdCBpbnQgX3Vua25vd24gPSAtMTsKICBzdGF0aWMgY29uc3QgaW50IF9tdXN0Tm90SW5saW5lID0gMDsKICAvLyBNYXktaW5saW5lLWluLWxvb3AgbWVhbnMgdGhhdCB0aGUgZnVuY3Rpb24gbWF5IG5vdCBiZSBpbmxpbmVkIG91dHNpZGUgbG9vcHMKICAvLyBidXQgbWF5IGJlIGlubGluZWQgaW4gYSBsb29wLgogIHN0YXRpYyBjb25zdCBpbnQgX21heUlubGluZUluTG9vcE11c3ROb3RPdXRzaWRlID0gMTsKICAvLyBUaGUgZnVuY3Rpb24gY2FuIGJlIGlubGluZWQgaW4gYSBsb29wLCBidXQgbm90IG91dHNpZGUuCiAgc3RhdGljIGNvbnN0IGludCBfY2FuSW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGUgPSAyOwogIC8vIE1heS1pbmxpbmUgbWVhbnMgdGhhdCB3ZSBrbm93IHRoYXQgaXQgY2FuIGJlIGlubGluZWQgaW5zaWRlIGEgbG9vcCwgYnV0CiAgLy8gZG9uJ3Qga25vdyBhYm91dCB0aGUgZ2VuZXJhbCBjYXNlIHlldC4KICBzdGF0aWMgY29uc3QgaW50IF9jYW5JbmxpbmVJbkxvb3BNYXlJbmxpbmVPdXRzaWRlID0gMzsKICBzdGF0aWMgY29uc3QgaW50IF9jYW5JbmxpbmUgPSA0OwoKICBmaW5hbCBNYXA8RnVuY3Rpb25FbnRpdHksIGludD4gX2NhY2hlZERlY2lzaW9ucyA9CiAgICAgIG5ldyBNYXA8RnVuY3Rpb25FbnRpdHksIGludD4oKTsKCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBfbm9JbmxpbmVGdW5jdGlvbnMgPSBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gX3RyeUlubGluZUZ1bmN0aW9ucyA9IG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CgogIEZ1bmN0aW9uSW5saW5lQ2FjaGUoQW5ub3RhdGlvbnNEYXRhIGFubm90YXRpb25zRGF0YSkgewogICAgYW5ub3RhdGlvbnNEYXRhLmZvckVhY2hOb0lubGluZSgoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgICAgbWFya0FzTm9JbmxpbmUoZnVuY3Rpb24pOwogICAgfSk7CiAgICBhbm5vdGF0aW9uc0RhdGEuZm9yRWFjaFRyeUlubGluZSgoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgICAgbWFya0FzVHJ5SW5saW5lKGZ1bmN0aW9uKTsKICAgIH0pOwogIH0KCiAgLy8vIENoZWNrcyB0aGF0IFttZXRob2RdIGlzIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpdmUgZm9yIHRoaXMgbWV0aG9kLgogIC8vLwogIC8vLyBGb3IgYSBbTWV0aG9kRWxlbWVudF0gdGhpcyBtZWFucyBpdCBtdXN0IGJlIHRoZSBkZWNsYXJhdGlvbiBlbGVtZW50LgogIGJvb2wgY2hlY2tGdW5jdGlvbihGdW5jdGlvbkVudGl0eSBtZXRob2QpIHsKICAgIHJldHVybiAnJG1ldGhvZCcuc3RhcnRzV2l0aChqc0VsZW1lbnRQcmVmaXgpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgY2FjaGUgZGVjaXNpb24uIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdGVzdGluZy4KICBpbnQgZ2V0Q3VycmVudENhY2hlRGVjaXNpb25Gb3JUZXN0aW5nKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChjaGVja0Z1bmN0aW9uKGVsZW1lbnQpLCBmYWlsZWRBdChlbGVtZW50KSk7CiAgICByZXR1cm4gX2NhY2hlZERlY2lzaW9uc1tlbGVtZW50XTsKICB9CgogIC8vIFJldHVybnMgYHRydWVgL2BmYWxzZWAgaWYgd2UgaGF2ZSBhIGNhY2hlZCBkZWNpc2lvbi4KICAvLyBSZXR1cm5zIGBudWxsYCBvdGhlcndpc2UuCiAgYm9vbCBjYW5JbmxpbmUoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwge2Jvb2wgaW5zaWRlTG9vcH0pIHsKICAgIGFzc2VydChjaGVja0Z1bmN0aW9uKGVsZW1lbnQpLCBmYWlsZWRBdChlbGVtZW50KSk7CiAgICBpbnQgZGVjaXNpb24gPSBfY2FjaGVkRGVjaXNpb25zW2VsZW1lbnRdOwoKICAgIGlmIChkZWNpc2lvbiA9PSBudWxsKSB7CiAgICAgIC8vIFRPRE8oc3JhKTogSGF2ZSBhbm5vdGF0aW9ucyBmb3IgbXVzdElubGluZSAvIG5vSW5saW5lIGZvciBjb25zdHJ1Y3RvcgogICAgICAvLyBib2RpZXMuIChUaGVyZSB1c2VkIHRvIGJlIHNvbWUgbG9naWMgaGVyZSB0byBoYXZlIGNvbnN0cnVjdG9yIGJvZGllcywKICAgICAgLy8gaW5oZXJpdCB0aGUgc2V0dGluZ3MgZnJvbSBhbm5vdGF0aW9ucyBvbiB0aGUgZ2VuZXJhdGl2ZQogICAgICAvLyBjb25zdHJ1Y3Rvci4gVGhpcyB3YXMgY29uZmxhdGVkIHdpdGggdGhlIGhldXJpc3RpYyBkZWNpc2lvbnMsIGxlYWRpbmcKICAgICAgLy8gdG8gbGFjayBvZiBpbmxpbmluZyB3aGVyZSBpdCB3YXMgYmVuZWZpY2lhbC4pCiAgICAgIGRlY2lzaW9uID0gX3Vua25vd247CiAgICB9CgogICAgaWYgKGluc2lkZUxvb3ApIHsKICAgICAgc3dpdGNoIChkZWNpc2lvbikgewogICAgICAgIGNhc2UgX211c3ROb3RJbmxpbmU6CiAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIGNhc2UgX3Vua25vd246CiAgICAgICAgY2FzZSBfbWF5SW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGU6CiAgICAgICAgICAvLyBXZSBrbm93IHdlIGNhbid0IGlubGluZSBvdXRzaWRlIGEgbG9vcCwgYnV0IGRvbid0IGtub3cgZm9yIHRoZQogICAgICAgICAgLy8gbG9vcCBjYXNlLiBSZXR1cm4gYG51bGxgIHRvIGluZGljYXRlIHRoYXQgd2UgZG9uJ3Qga25vdyB5ZXQuCiAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgY2FzZSBfY2FuSW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGU6CiAgICAgICAgY2FzZSBfY2FuSW5saW5lSW5Mb29wTWF5SW5saW5lT3V0c2lkZToKICAgICAgICBjYXNlIF9jYW5JbmxpbmU6CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgc3dpdGNoIChkZWNpc2lvbikgewogICAgICAgIGNhc2UgX211c3ROb3RJbmxpbmU6CiAgICAgICAgY2FzZSBfbWF5SW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGU6CiAgICAgICAgY2FzZSBfY2FuSW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGU6CiAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIGNhc2UgX3Vua25vd246CiAgICAgICAgY2FzZSBfY2FuSW5saW5lSW5Mb29wTWF5SW5saW5lT3V0c2lkZToKICAgICAgICAgIC8vIFdlIGtub3cgd2UgY2FuIGlubGluZSBpbnNpZGUgYSBsb29wLCBidXQgZG9uJ3Qga25vdyBmb3IgdGhlCiAgICAgICAgICAvLyBub24tbG9vcCBjYXNlLiBSZXR1cm4gYG51bGxgIHRvIGluZGljYXRlIHRoYXQgd2UgZG9uJ3Qga25vdyB5ZXQuCiAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgY2FzZSBfY2FuSW5saW5lOgogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvLyBRdWlldCBzdGF0aWMgY2hlY2tlci4KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBtYXJrQXNJbmxpbmFibGUoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwge2Jvb2wgaW5zaWRlTG9vcH0pIHsKICAgIGFzc2VydChjaGVja0Z1bmN0aW9uKGVsZW1lbnQpLCBmYWlsZWRBdChlbGVtZW50KSk7CiAgICBpbnQgb2xkRGVjaXNpb24gPSBfY2FjaGVkRGVjaXNpb25zW2VsZW1lbnRdOwoKICAgIGlmIChvbGREZWNpc2lvbiA9PSBudWxsKSB7CiAgICAgIG9sZERlY2lzaW9uID0gX3Vua25vd247CiAgICB9CgogICAgaWYgKGluc2lkZUxvb3ApIHsKICAgICAgc3dpdGNoIChvbGREZWNpc2lvbikgewogICAgICAgIGNhc2UgX211c3ROb3RJbmxpbmU6CiAgICAgICAgICB0aHJvdyBmYWlsZWRBdCgKICAgICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAgICJDYW4ndCBtYXJrICRlbGVtZW50IGFzIG5vbi1pbmxpbmFibGUgYW5kIGlubGluYWJsZSBhdCB0aGUgIgogICAgICAgICAgICAgICJzYW1lIHRpbWUuIik7CgogICAgICAgIGNhc2UgX3Vua25vd246CiAgICAgICAgICAvLyBXZSBrbm93IHRoYXQgaXQgY2FuIGJlIGlubGluZWQgaW4gYSBsb29wLCBidXQgZG9uJ3Qga25vdyBhYm91dCB0aGUKICAgICAgICAgIC8vIG5vbi1sb29wIGNhc2UgeWV0LgogICAgICAgICAgX2NhY2hlZERlY2lzaW9uc1tlbGVtZW50XSA9IF9jYW5JbmxpbmVJbkxvb3BNYXlJbmxpbmVPdXRzaWRlOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX21heUlubGluZUluTG9vcE11c3ROb3RPdXRzaWRlOgogICAgICAgICAgX2NhY2hlZERlY2lzaW9uc1tlbGVtZW50XSA9IF9jYW5JbmxpbmVJbkxvb3BNdXN0Tm90T3V0c2lkZTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9jYW5JbmxpbmVJbkxvb3BNdXN0Tm90T3V0c2lkZToKICAgICAgICBjYXNlIF9jYW5JbmxpbmVJbkxvb3BNYXlJbmxpbmVPdXRzaWRlOgogICAgICAgIGNhc2UgX2NhbklubGluZToKICAgICAgICAgIC8vIERvIG5vdGhpbmcuCiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgc3dpdGNoIChvbGREZWNpc2lvbikgewogICAgICAgIGNhc2UgX211c3ROb3RJbmxpbmU6CiAgICAgICAgY2FzZSBfbWF5SW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGU6CiAgICAgICAgY2FzZSBfY2FuSW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGU6CiAgICAgICAgICB0aHJvdyBmYWlsZWRBdCgKICAgICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAgICJDYW4ndCBtYXJrICRlbGVtZW50IGFzIG5vbi1pbmxpbmFibGUgYW5kIGlubGluYWJsZSBhdCB0aGUgIgogICAgICAgICAgICAgICJzYW1lIHRpbWUuIik7CgogICAgICAgIGNhc2UgX3Vua25vd246CiAgICAgICAgY2FzZSBfY2FuSW5saW5lSW5Mb29wTWF5SW5saW5lT3V0c2lkZToKICAgICAgICAgIF9jYWNoZWREZWNpc2lvbnNbZWxlbWVudF0gPSBfY2FuSW5saW5lOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX2NhbklubGluZToKICAgICAgICAgIC8vIERvIG5vdGhpbmcuCiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBtYXJrQXNOb25JbmxpbmFibGUoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwge2Jvb2wgaW5zaWRlTG9vcDogdHJ1ZX0pIHsKICAgIGFzc2VydChjaGVja0Z1bmN0aW9uKGVsZW1lbnQpLCBmYWlsZWRBdChlbGVtZW50KSk7CiAgICBpbnQgb2xkRGVjaXNpb24gPSBfY2FjaGVkRGVjaXNpb25zW2VsZW1lbnRdOwoKICAgIGlmIChvbGREZWNpc2lvbiA9PSBudWxsKSB7CiAgICAgIG9sZERlY2lzaW9uID0gX3Vua25vd247CiAgICB9CgogICAgaWYgKGluc2lkZUxvb3ApIHsKICAgICAgc3dpdGNoIChvbGREZWNpc2lvbikgewogICAgICAgIGNhc2UgX2NhbklubGluZUluTG9vcE11c3ROb3RPdXRzaWRlOgogICAgICAgIGNhc2UgX2NhbklubGluZUluTG9vcE1heUlubGluZU91dHNpZGU6CiAgICAgICAgY2FzZSBfY2FuSW5saW5lOgogICAgICAgICAgdGhyb3cgZmFpbGVkQXQoCiAgICAgICAgICAgICAgZWxlbWVudCwKICAgICAgICAgICAgICAiQ2FuJ3QgbWFyayAkZWxlbWVudCBhcyBub24taW5saW5hYmxlIGFuZCBpbmxpbmFibGUgYXQgdGhlICIKICAgICAgICAgICAgICAic2FtZSB0aW1lLiIpOwoKICAgICAgICBjYXNlIF9tYXlJbmxpbmVJbkxvb3BNdXN0Tm90T3V0c2lkZToKICAgICAgICBjYXNlIF91bmtub3duOgogICAgICAgICAgX2NhY2hlZERlY2lzaW9uc1tlbGVtZW50XSA9IF9tdXN0Tm90SW5saW5lOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX211c3ROb3RJbmxpbmU6CiAgICAgICAgICAvLyBEbyBub3RoaW5nLgogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHN3aXRjaCAob2xkRGVjaXNpb24pIHsKICAgICAgICBjYXNlIF9jYW5JbmxpbmU6CiAgICAgICAgICB0aHJvdyBmYWlsZWRBdCgKICAgICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAgICJDYW4ndCBtYXJrICRlbGVtZW50IGFzIG5vbi1pbmxpbmFibGUgYW5kIGlubGluYWJsZSBhdCB0aGUgIgogICAgICAgICAgICAgICJzYW1lIHRpbWUuIik7CgogICAgICAgIGNhc2UgX3Vua25vd246CiAgICAgICAgICAvLyBXZSBjYW4ndCBpbmxpbmUgb3V0c2lkZSBhIGxvb3AsIGJ1dCB3ZSBtaWdodCBzdGlsbCBiZSBhbGxvd2VkIHRvIGRvCiAgICAgICAgICAvLyBzbyBvdXRzaWRlLgogICAgICAgICAgX2NhY2hlZERlY2lzaW9uc1tlbGVtZW50XSA9IF9tYXlJbmxpbmVJbkxvb3BNdXN0Tm90T3V0c2lkZTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9jYW5JbmxpbmVJbkxvb3BNYXlJbmxpbmVPdXRzaWRlOgogICAgICAgICAgLy8gV2UgYWxyZWFkeSBrbmV3IHRoYXQgdGhlIGZ1bmN0aW9uIGNvdWxkIGJlIGlubGluZWQgaW5zaWRlIGEgbG9vcCwKICAgICAgICAgIC8vIGJ1dCBkaWRuJ3QgaGF2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbm9uLWxvb3AgY2FzZS4gTm93IHdlIGtub3cKICAgICAgICAgIC8vIHRoYXQgaXQgY2FuJ3QgYmUgaW5saW5lZCBvdXRzaWRlIGEgbG9vcC4KICAgICAgICAgIF9jYWNoZWREZWNpc2lvbnNbZWxlbWVudF0gPSBfY2FuSW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGU7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBfbWF5SW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGU6CiAgICAgICAgY2FzZSBfY2FuSW5saW5lSW5Mb29wTXVzdE5vdE91dHNpZGU6CiAgICAgICAgY2FzZSBfbXVzdE5vdElubGluZToKICAgICAgICAgIC8vIERvIG5vdGhpbmcuCiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBtYXJrQXNOb0lubGluZShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoY2hlY2tGdW5jdGlvbihlbGVtZW50KSwgZmFpbGVkQXQoZWxlbWVudCkpOwogICAgX25vSW5saW5lRnVuY3Rpb25zLmFkZChlbGVtZW50KTsKICB9CgogIGJvb2wgbWFya2VkQXNOb0lubGluZShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoY2hlY2tGdW5jdGlvbihlbGVtZW50KSwgZmFpbGVkQXQoZWxlbWVudCkpOwogICAgcmV0dXJuIF9ub0lubGluZUZ1bmN0aW9ucy5jb250YWlucyhlbGVtZW50KTsKICB9CgogIHZvaWQgbWFya0FzVHJ5SW5saW5lKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChjaGVja0Z1bmN0aW9uKGVsZW1lbnQpLCBmYWlsZWRBdChlbGVtZW50KSk7CiAgICBfdHJ5SW5saW5lRnVuY3Rpb25zLmFkZChlbGVtZW50KTsKICB9CgogIGJvb2wgbWFya2VkQXNUcnlJbmxpbmUoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KGNoZWNrRnVuY3Rpb24oZWxlbWVudCksIGZhaWxlZEF0KGVsZW1lbnQpKTsKICAgIHJldHVybiBfdHJ5SW5saW5lRnVuY3Rpb25zLmNvbnRhaW5zKGVsZW1lbnQpOwogIH0KfQoKY2xhc3MgSmF2YVNjcmlwdEltcGFjdFN0cmF0ZWd5IGV4dGVuZHMgSW1wYWN0U3RyYXRlZ3kgewogIGZpbmFsIEltcGFjdENhY2hlRGVsZXRlciBpbXBhY3RDYWNoZURlbGV0ZXI7CiAgZmluYWwgRHVtcEluZm9UYXNrIGR1bXBJbmZvVGFzazsKICBmaW5hbCBib29sIHN1cHBvcnREZWZlcnJlZExvYWQ7CiAgZmluYWwgYm9vbCBzdXBwb3J0RHVtcEluZm87CgogIEphdmFTY3JpcHRJbXBhY3RTdHJhdGVneSh0aGlzLmltcGFjdENhY2hlRGVsZXRlciwgdGhpcy5kdW1wSW5mb1Rhc2ssCiAgICAgIHt0aGlzLnN1cHBvcnREZWZlcnJlZExvYWQsIHRoaXMuc3VwcG9ydER1bXBJbmZvfSk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbXBhY3QodmFyIGltcGFjdFNvdXJjZSwgV29ybGRJbXBhY3QgaW1wYWN0LAogICAgICBXb3JsZEltcGFjdFZpc2l0b3IgdmlzaXRvciwgSW1wYWN0VXNlQ2FzZSBpbXBhY3RVc2UpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENvbXB1dGUgdGhlIGFwcGxpY2F0aW9uIHN0cmF0ZWd5IG9uY2UgZm9yIGVhY2ggdXNlLgogICAgaWYgKGltcGFjdFVzZSA9PSBSZXNvbHV0aW9uRW5xdWV1ZXIuSU1QQUNUX1VTRSkgewogICAgICBpZiAoc3VwcG9ydERlZmVycmVkTG9hZCkgewogICAgICAgIGltcGFjdC5hcHBseSh2aXNpdG9yKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbXBhY3QuYXBwbHkodmlzaXRvcik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW1wYWN0VXNlID09IERlZmVycmVkTG9hZFRhc2suSU1QQUNUX1VTRSkgewogICAgICBpbXBhY3QuYXBwbHkodmlzaXRvcik7CiAgICAgIC8vIEltcGFjdHMgYXJlIHVuY2FjaGVkIGdsb2JhbGx5IGluIFtvbkltcGFjdFVzZWRdLgogICAgfSBlbHNlIGlmIChpbXBhY3RVc2UgPT0gRHVtcEluZm9UYXNrLklNUEFDVF9VU0UpIHsKICAgICAgaW1wYWN0LmFwcGx5KHZpc2l0b3IpOwogICAgICBkdW1wSW5mb1Rhc2sudW5yZWdpc3RlckltcGFjdChpbXBhY3RTb3VyY2UpOwogICAgfSBlbHNlIHsKICAgICAgaW1wYWN0LmFwcGx5KHZpc2l0b3IpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBvbkltcGFjdFVzZWQoSW1wYWN0VXNlQ2FzZSBpbXBhY3RVc2UpIHsKICAgIGlmIChpbXBhY3RVc2UgPT0gRGVmZXJyZWRMb2FkVGFzay5JTVBBQ1RfVVNFKSB7CiAgICAgIGltcGFjdENhY2hlRGVsZXRlci5lbXB0eUNhY2hlKCk7CiAgICB9CiAgfQp9CgovLy8gSW50ZXJmYWNlIGZvciByZXNvdXJjZXMgb25seSB1c2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCmFic3RyYWN0IGNsYXNzIENvZGVnZW5JbnB1dHMgewogIENoZWNrZWRNb2RlSGVscGVycyBnZXQgY2hlY2tlZE1vZGVIZWxwZXJzOwogIFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnMgZ2V0IHJ0aVN1YnN0aXR1dGlvbnM7CiAgUnVudGltZVR5cGVzRW5jb2RlciBnZXQgcnRpRW5jb2RlcjsKICBSZWNpcGVFbmNvZGVyIGdldCBydGlSZWNpcGVFbmNvZGVyOwogIFRyYWNlciBnZXQgdHJhY2VyOwogIFJ1bnRpbWVUeXBlVGFncyBnZXQgcnRpVGFnczsKICBGaXhlZE5hbWVzIGdldCBmaXhlZE5hbWVzOwp9CgpjbGFzcyBDb2RlZ2VuSW5wdXRzSW1wbCBpbXBsZW1lbnRzIENvZGVnZW5JbnB1dHMgewogIEBvdmVycmlkZQogIGZpbmFsIENoZWNrZWRNb2RlSGVscGVycyBjaGVja2VkTW9kZUhlbHBlcnMgPSBuZXcgQ2hlY2tlZE1vZGVIZWxwZXJzKCk7CgogIEBvdmVycmlkZQogIGZpbmFsIFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnMgcnRpU3Vic3RpdHV0aW9uczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgUnVudGltZVR5cGVzRW5jb2RlciBydGlFbmNvZGVyOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBSZWNpcGVFbmNvZGVyIHJ0aVJlY2lwZUVuY29kZXI7CgogIEBvdmVycmlkZQogIGZpbmFsIFRyYWNlciB0cmFjZXI7CgogIEBvdmVycmlkZQogIGZpbmFsIFJ1bnRpbWVUeXBlVGFncyBydGlUYWdzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBGaXhlZE5hbWVzIGZpeGVkTmFtZXM7CgogIENvZGVnZW5JbnB1dHNJbXBsKHRoaXMucnRpU3Vic3RpdHV0aW9ucywgdGhpcy5ydGlFbmNvZGVyLAogICAgICB0aGlzLnJ0aVJlY2lwZUVuY29kZXIsIHRoaXMudHJhY2VyLCB0aGlzLnJ0aVRhZ3MsIHRoaXMuZml4ZWROYW1lcyk7Cn0KgVYATk48ARwBGSE2LiQyJCEkGSdJGyQVHSUhASITUQEuLgEWAgEDD0ZJBBwiJ1EjNz03TSw5IwE0JgFMTQE5QCAIQSEIBAFMBksuMgQBUEI3JgQBOh8+Ny4BHE9PQU83GwYBFhodGAEXLUxKFwEtLxkXCA0aHS0tGAEXL0lOFwEZFwgGAR0RBAFENzEBHx4GARYdHRoXSx0BF1AgSBEBLUYRAS0vGRkRCA0dHS0tGhdLHQEXLzIRARkZEQgGBAFNNzEBHx4GARYdLS8ZGhdLHQEtFzYRAR0ZEQgNHRkaF0sdARdRGUYRAS9PTjZGEQEtLR0ZEQgGBAEwNyUEATI3MQQBMTcmBAEzNzIEAgE4LyMiHgFHOQEMOT1QNiEfDx8IOx06Nx0zDR0GBAEMLzQnBgQCAT4fLTImJhUfHQIBMwxKAQw0AQwoAQwoAQwXAQwhAQwfATxKAgEscGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9iYWNrZW5kLmRhcnQ7c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfYmFja2VuZC9pbmZlcnJlZF9kYXRhLmRhcnSt6i8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgc2hvdyBRdWV1ZTsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2lkZV9lZmZlY3RzLmRhcnQnOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnOwppbXBvcnQgJ2Fubm90YXRpb25zLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgSW5mZXJyZWREYXRhIHsKICAvLy8gRGVzZXJpYWxpemVzIGEgW0luZmVycmVkRGF0YV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBJbmZlcnJlZERhdGEucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBib29sIGlzVHJpdmlhbCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgaWYgKGlzVHJpdmlhbCkgewogICAgICByZXR1cm4gbmV3IFRyaXZpYWxJbmZlcnJlZERhdGEoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgSW5mZXJyZWREYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBjbG9zZWRXb3JsZCk7CiAgICB9CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtJbmZlcnJlZERhdGFdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKTsKCiAgLy8vIFJldHVybnMgdGhlIHNpZGUgZWZmZWN0cyBvZiBleGVjdXRpbmcgW2VsZW1lbnRdLgogIFNpZGVFZmZlY3RzIGdldFNpZGVFZmZlY3RzT2ZFbGVtZW50KEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyB0aGUgc2lkZSBlZmZlY3RzIG9mIGNhbGxpbmcgW3NlbGVjdG9yXSBvbiB0aGUgW3JlY2VpdmVyXS4KICBTaWRlRWZmZWN0cyBnZXRTaWRlRWZmZWN0c09mU2VsZWN0b3IoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtlbGVtZW50XSBpcyBndWFyYW50ZWVkIG5vdCB0byB0aHJvdyBhbiBleGNlcHRpb24uCiAgYm9vbCBnZXRDYW5ub3RUaHJvdyhGdW5jdGlvbkVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtlbGVtZW50XSBpcyBjYWxsZWQgaW4gYSBsb29wLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IElzIHRoaXMgJ3BvdGVudGlhbGx5IGNhbGxlZCcgb3IgJ2tub3duIHRvIGJlIGNhbGxlZCc/CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2hhbmdlIFtNZW1iZXJFbnRpdHldIHRvIFtGdW5jdGlvbkVudGl0eV0uCiAgYm9vbCBpc0NhbGxlZEluTG9vcChNZW1iZXJFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gbWlnaHQgYmUgcGFzc2VkIHRvIGBGdW5jdGlvbi5hcHBseWAuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSXMgdGhpcyAncGFzc2VkIGludm9jYXRpb24gdGFyZ2V0YCBvcgogIC8vIGBwYXNzZWQgYXMgYXJndW1lbnRgPwogIGJvb2wgZ2V0TWlnaHRCZVBhc3NlZFRvQXBwbHkoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCk7Cn0KCmFic3RyYWN0IGNsYXNzIEluZmVycmVkRGF0YUJ1aWxkZXIgewogIC8vLyBSZWdpc3RlcnMgdGhlIGV4ZWN1dGluZyBvZiBbZWxlbWVudF0gYXMgd2l0aG91dCBzaWRlIGVmZmVjdHMuCiAgdm9pZCByZWdpc3RlclNpZGVFZmZlY3RzRnJlZShGdW5jdGlvbkVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIFtTaWRlRWZmZWN0QnVpbGRlcl0gYXNzb2NpYXRlZCB3aXRoIFtlbGVtZW50XS4KICBTaWRlRWZmZWN0c0J1aWxkZXIgZ2V0U2lkZUVmZmVjdHNCdWlsZGVyKEZ1bmN0aW9uRW50aXR5IG1lbWJlcik7CgogIC8vLyBSZWdpc3RlcnMgdGhhdCBbZWxlbWVudF0gbWlnaHQgYmUgcGFzc2VkIHRvIGBGdW5jdGlvbi5hcHBseWAuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSXMgdGhpcyAncGFzc2VkIGludm9jYXRpb24gdGFyZ2V0YCBvcgogIC8vIGBwYXNzZWQgYXMgYXJndW1lbnRgPwogIHZvaWQgcmVnaXN0ZXJNaWdodEJlUGFzc2VkVG9BcHBseShGdW5jdGlvbkVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtlbGVtZW50XSBtaWdodCBiZSBwYXNzZWQgdG8gYEZ1bmN0aW9uLmFwcGx5YCBnaXZlbiB0aGUKICAvLy8gY3VycmVudGx5IGluZmVycmVkIGluZm9ybWF0aW9uLgogIGJvb2wgZ2V0Q3VycmVudGx5S25vd25NaWdodEJlUGFzc2VkVG9BcHBseShGdW5jdGlvbkVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJlZ2lzdGVycyB0aGF0IFtlbGVtZW50XSBpcyBjYWxsZWQgaW4gYSBsb29wLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IElzIHRoaXMgJ3BvdGVudGlhbGx5IGNhbGxlZCcgb3IgJ2tub3duIHRvIGJlIGNhbGxlZCc/CiAgdm9pZCBhZGRGdW5jdGlvbkNhbGxlZEluTG9vcChNZW1iZXJFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZWdpc3RlcnMgdGhhdCBbZWxlbWVudF0gaXMgZ3VhcmFudGVlZCBub3QgdG8gdGhyb3cgYW4gZXhjZXB0aW9uLgogIHZvaWQgcmVnaXN0ZXJDYW5ub3RUaHJvdyhGdW5jdGlvbkVudGl0eSBlbGVtZW50KTsKCiAgLy8vIENyZWF0ZSBhIFtJbmZlcnJlZERhdGFdIG9iamVjdCBmb3IgdGhlIGNvbGxlY3RlZCBpbmZvcm1hdGlvbi4KICBJbmZlcnJlZERhdGEgY2xvc2UoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKfQoKY2xhc3MgSW5mZXJyZWREYXRhSW1wbCBpbXBsZW1lbnRzIEluZmVycmVkRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtJbmZlcnJlZERhdGFdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnaW5mZXJyZWQtZGF0YSc7CgogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CiAgZmluYWwgU2V0PE1lbWJlckVudGl0eT4gX2Z1bmN0aW9uc0NhbGxlZEluTG9vcDsKICBmaW5hbCBNYXA8RnVuY3Rpb25FbnRpdHksIFNpZGVFZmZlY3RzPiBfc2lkZUVmZmVjdHM7CgogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gX3NpZGVFZmZlY3RzRnJlZUVsZW1lbnRzOwoKICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IF9lbGVtZW50c1RoYXRDYW5ub3RUaHJvdzsKCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBfZnVuY3Rpb25zVGhhdE1pZ2h0QmVQYXNzZWRUb0FwcGx5OwoKICBJbmZlcnJlZERhdGFJbXBsKAogICAgICB0aGlzLl9jbG9zZWRXb3JsZCwKICAgICAgdGhpcy5fZnVuY3Rpb25zQ2FsbGVkSW5Mb29wLAogICAgICB0aGlzLl9zaWRlRWZmZWN0cywKICAgICAgdGhpcy5fc2lkZUVmZmVjdHNGcmVlRWxlbWVudHMsCiAgICAgIHRoaXMuX2VsZW1lbnRzVGhhdENhbm5vdFRocm93LAogICAgICB0aGlzLl9mdW5jdGlvbnNUaGF0TWlnaHRCZVBhc3NlZFRvQXBwbHkpOwoKICBmYWN0b3J5IEluZmVycmVkRGF0YUltcGwucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIFNldDxNZW1iZXJFbnRpdHk+IGZ1bmN0aW9uc0NhbGxlZEluTG9vcCA9IHNvdXJjZS5yZWFkTWVtYmVycygpLnRvU2V0KCk7CiAgICBNYXA8RnVuY3Rpb25FbnRpdHksIFNpZGVFZmZlY3RzPiBzaWRlRWZmZWN0cyA9IHNvdXJjZS5yZWFkTWVtYmVyTWFwKAogICAgICAgIChNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PiBuZXcgU2lkZUVmZmVjdHMucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSkpOwogICAgU2V0PEZ1bmN0aW9uRW50aXR5PiBzaWRlRWZmZWN0c0ZyZWVFbGVtZW50cyA9CiAgICAgICAgc291cmNlLnJlYWRNZW1iZXJzPEZ1bmN0aW9uRW50aXR5PigpLnRvU2V0KCk7CiAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IGVsZW1lbnRzVGhhdENhbm5vdFRocm93ID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RnVuY3Rpb25FbnRpdHk+KCkudG9TZXQoKTsKICAgIFNldDxGdW5jdGlvbkVudGl0eT4gZnVuY3Rpb25zVGhhdE1pZ2h0QmVQYXNzZWRUb0FwcGx5ID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RnVuY3Rpb25FbnRpdHk+KCkudG9TZXQoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSW5mZXJyZWREYXRhSW1wbCgKICAgICAgICBjbG9zZWRXb3JsZCwKICAgICAgICBmdW5jdGlvbnNDYWxsZWRJbkxvb3AsCiAgICAgICAgc2lkZUVmZmVjdHMsCiAgICAgICAgc2lkZUVmZmVjdHNGcmVlRWxlbWVudHMsCiAgICAgICAgZWxlbWVudHNUaGF0Q2Fubm90VGhyb3csCiAgICAgICAgZnVuY3Rpb25zVGhhdE1pZ2h0QmVQYXNzZWRUb0FwcGx5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVCb29sKGZhbHNlKTsgLy8gSXMgX25vdF8gdHJpdmlhbC4KICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXJzKF9mdW5jdGlvbnNDYWxsZWRJbkxvb3ApOwogICAgc2luay53cml0ZU1lbWJlck1hcCgKICAgICAgICBfc2lkZUVmZmVjdHMsCiAgICAgICAgKE1lbWJlckVudGl0eSBtZW1iZXIsIFNpZGVFZmZlY3RzIHNpZGVFZmZlY3RzKSA9PgogICAgICAgICAgICBzaWRlRWZmZWN0cy53cml0ZVRvRGF0YVNpbmsoc2luaykpOwogICAgc2luay53cml0ZU1lbWJlcnMoX3NpZGVFZmZlY3RzRnJlZUVsZW1lbnRzKTsKICAgIHNpbmsud3JpdGVNZW1iZXJzKF9lbGVtZW50c1RoYXRDYW5ub3RUaHJvdyk7CiAgICBzaW5rLndyaXRlTWVtYmVycyhfZnVuY3Rpb25zVGhhdE1pZ2h0QmVQYXNzZWRUb0FwcGx5KTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTaWRlRWZmZWN0cyBnZXRTaWRlRWZmZWN0c09mU2VsZWN0b3IoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyKSB7CiAgICAvLyBXZSdyZSBub3QgdHJhY2tpbmcgc2lkZSBlZmZlY3RzIG9mIGNsb3N1cmVzLgogICAgaWYgKHNlbGVjdG9yLmlzQ2xvc3VyZUNhbGwgfHwKICAgICAgICBfY2xvc2VkV29ybGQuaW5jbHVkZXNDbG9zdXJlQ2FsbChzZWxlY3RvciwgcmVjZWl2ZXIpKSB7CiAgICAgIHJldHVybiBuZXcgU2lkZUVmZmVjdHMoKTsKICAgIH0KICAgIFNpZGVFZmZlY3RzIHNpZGVFZmZlY3RzID0gbmV3IFNpZGVFZmZlY3RzLmVtcHR5KCk7CiAgICBmb3IgKE1lbWJlckVudGl0eSBlIGluIF9jbG9zZWRXb3JsZC5sb2NhdGVNZW1iZXJzKHNlbGVjdG9yLCByZWNlaXZlcikpIHsKICAgICAgaWYgKGUuaXNGaWVsZCkgewogICAgICAgIGlmIChzZWxlY3Rvci5pc0dldHRlcikgewogICAgICAgICAgaWYgKCFfY2xvc2VkV29ybGQuZmllbGROZXZlckNoYW5nZXMoZSkpIHsKICAgICAgICAgICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uSW5zdGFuY2VQcm9wZXJ0eVN0b3JlKCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pc1NldHRlcikgewogICAgICAgICAgc2lkZUVmZmVjdHMuc2V0Q2hhbmdlc0luc3RhbmNlUHJvcGVydHkoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXNzZXJ0KHNlbGVjdG9yLmlzQ2FsbCk7CiAgICAgICAgICBzaWRlRWZmZWN0cy5zZXRBbGxTaWRlRWZmZWN0cygpOwogICAgICAgICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uU29tZXRoaW5nKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHNpZGVFZmZlY3RzLmFkZChnZXRTaWRlRWZmZWN0c09mRWxlbWVudChlKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaWRlRWZmZWN0czsKICB9CgogIEBvdmVycmlkZQogIFNpZGVFZmZlY3RzIGdldFNpZGVFZmZlY3RzT2ZFbGVtZW50KEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChfc2lkZUVmZmVjdHMgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LCAiU2lkZSBlZmZlY3RzIGhhdmUgbm90IGJlZW4gY29tcHV0ZWQgeWV0LiIpKTsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENoZWNrIHRoYXQgW19tYWtlU2lkZUVmZmVjdHNdIGlzIG9ubHkgY2FsbGVkIGlmCiAgICAvLyB0eXBlIGluZmVyZW5jZSBoYXMgYmVlbiBkaXNhYmxlZCAoZXhwbGljaXRseSBvciBiZWNhdXNlIG9mIGNvbXBpbGUgdGltZQogICAgLy8gZXJyb3JzKS4KICAgIHJldHVybiBfc2lkZUVmZmVjdHMucHV0SWZBYnNlbnQoZWxlbWVudCwgX21ha2VTaWRlRWZmZWN0cyk7CiAgfQoKICBzdGF0aWMgU2lkZUVmZmVjdHMgX21ha2VTaWRlRWZmZWN0cygpID0+IG5ldyBTaWRlRWZmZWN0cygpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzQ2FsbGVkSW5Mb29wKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gX2Z1bmN0aW9uc0NhbGxlZEluTG9vcC5jb250YWlucyhlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0Q2Fubm90VGhyb3coRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIF9lbGVtZW50c1RoYXRDYW5ub3RUaHJvdy5jb250YWlucyhlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0TWlnaHRCZVBhc3NlZFRvQXBwbHkoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgLy8gV2UgYXNzdW1lIGFsbCBmdW5jdGlvbnMgcmVhY2ggRnVuY3Rpb24uYXBwbHkgaWYgbm8gZnVuY3Rpb25zIGFyZQogICAgLy8gcmVnaXN0ZXJlZCBzby4gIFdlIGdldCBhbiBlbXB0eSBzZXQgaW4gdHdvIGNpcmN1bXN0YW5jZXMgKDEpIGEgdHJpdmlhbAogICAgLy8gcHJvZ3JhbSBhbmQgKDIpIHdoZW4gY29tcGlsaW5nIHdpdGhvdXQgdHlwZSBpbmZlcmVuY2UKICAgIC8vIChpLmUuIC0tZGlzYWJsZS10eXBlLWluZmVyZW5jZSkuIFJldHVybmluZyBgdHJ1ZWAgaGFzIGNvbnNlcXVlbmNlcyAoZXh0cmEKICAgIC8vIG1ldGFkYXRhIGZvciBGdW5jdGlvbi5hcHBseSkgb25seSB3aGVuIEZ1bmN0aW9uLmFwcGx5IGlzIGFsc28gcGFydCBvZiB0aGUKICAgIC8vIHByb2dyYW0uIEl0IGlzIGFuIHVudXN1YWwgdHJpdmlhbCBwcm9ncmFtIHRoYXQgaW5jbHVkZXMgRnVuY3Rpb24uYXBwbHkKICAgIC8vIGJ1dCBkb2VzIG5vdCBjYWxsIGl0IG9uIGEgZnVuY3Rpb24uCiAgICAvLwogICAgLy8gVE9ETyhzcmEpOiBXZSBzaG91bGQgcmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhpcyBzZXQgYW5kIHJlZ2lzdGVyIGZ1bmN0aW9ucwogICAgLy8gdGhhdCB3ZSBoYXZlIHByb3ZlbiBkbyBub3QgcmVhY2ggRnVuY3Rpb24uYXBwbHkuCiAgICBpZiAoX2Z1bmN0aW9uc1RoYXRNaWdodEJlUGFzc2VkVG9BcHBseS5pc0VtcHR5KSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBfZnVuY3Rpb25zVGhhdE1pZ2h0QmVQYXNzZWRUb0FwcGx5LmNvbnRhaW5zKGVsZW1lbnQpOwogIH0KfQoKY2xhc3MgSW5mZXJyZWREYXRhQnVpbGRlckltcGwgaW1wbGVtZW50cyBJbmZlcnJlZERhdGFCdWlsZGVyIHsKICBmaW5hbCBTZXQ8TWVtYmVyRW50aXR5PiBfZnVuY3Rpb25zQ2FsbGVkSW5Mb29wID0gbmV3IFNldDxNZW1iZXJFbnRpdHk+KCk7CiAgTWFwPE1lbWJlckVudGl0eSwgU2lkZUVmZmVjdHNCdWlsZGVyPiBfc2lkZUVmZmVjdHNCdWlsZGVycyA9CiAgICAgIDxNZW1iZXJFbnRpdHksIFNpZGVFZmZlY3RzQnVpbGRlcj57fTsKICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IHByZW1hdHVyZVNpZGVFZmZlY3RBY2Nlc3NlcyA9CiAgICAgIG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CgogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gX3NpZGVFZmZlY3RzRnJlZUVsZW1lbnRzID0KICAgICAgbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBfZWxlbWVudHNUaGF0Q2Fubm90VGhyb3cgPQogICAgICBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwoKICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IF9mdW5jdGlvbnNUaGF0TWlnaHRCZVBhc3NlZFRvQXBwbHkgPQogICAgICBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwoKICBJbmZlcnJlZERhdGFCdWlsZGVySW1wbChBbm5vdGF0aW9uc0RhdGEgYW5ub3RhdGlvbnNEYXRhKSB7CiAgICBhbm5vdGF0aW9uc0RhdGEuZm9yRWFjaE5vVGhyb3dzKHJlZ2lzdGVyQ2Fubm90VGhyb3cpOwogICAgYW5ub3RhdGlvbnNEYXRhLmZvckVhY2hOb1NpZGVFZmZlY3RzKHJlZ2lzdGVyU2lkZUVmZmVjdHNGcmVlKTsKICB9CgogIEBvdmVycmlkZQogIFNpZGVFZmZlY3RzQnVpbGRlciBnZXRTaWRlRWZmZWN0c0J1aWxkZXIoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgcmV0dXJuIF9zaWRlRWZmZWN0c0J1aWxkZXJzW21lbWJlcl0gPz89IG5ldyBTaWRlRWZmZWN0c0J1aWxkZXIobWVtYmVyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTaWRlRWZmZWN0c0ZyZWUoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgX3NpZGVFZmZlY3RzRnJlZUVsZW1lbnRzLmFkZChlbGVtZW50KTsKICAgIGFzc2VydCghX3NpZGVFZmZlY3RzQnVpbGRlcnMuY29udGFpbnNLZXkoZWxlbWVudCkpOwogICAgX3NpZGVFZmZlY3RzQnVpbGRlcnNbZWxlbWVudF0gPSBuZXcgU2lkZUVmZmVjdHNCdWlsZGVyLmZyZWUoZWxlbWVudCk7CiAgfQoKICAvLy8gQ29tcHV0ZSBbU2lkZUVmZmVjdHNdIGZvciBhbGwgcmVnaXN0ZXJlZCBbU2lkZUVmZmVjdEJ1aWxkZXJdcy4KICBAb3ZlcnJpZGUKICBJbmZlcnJlZERhdGEgY2xvc2UoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBhc3NlcnQoX3NpZGVFZmZlY3RzQnVpbGRlcnMgIT0gbnVsbCwKICAgICAgICAiSW5mZXJyZWQgZGF0YSBoYXMgYWxyZWFkeSBiZWVuIGNvbXB1dGVkLiIpOwogICAgTWFwPEZ1bmN0aW9uRW50aXR5LCBTaWRlRWZmZWN0cz4gX3NpZGVFZmZlY3RzID0KICAgICAgICA8RnVuY3Rpb25FbnRpdHksIFNpZGVFZmZlY3RzPnt9OwogICAgSXRlcmFibGU8U2lkZUVmZmVjdHNCdWlsZGVyPiBzaWRlRWZmZWN0c0J1aWxkZXJzID0KICAgICAgICBfc2lkZUVmZmVjdHNCdWlsZGVycy52YWx1ZXM7CiAgICBlbXB0eVdvcmtMaXN0KHNpZGVFZmZlY3RzQnVpbGRlcnMpOwogICAgZm9yIChTaWRlRWZmZWN0c0J1aWxkZXIgc2lkZUVmZmVjdHNCdWlsZGVyIGluIHNpZGVFZmZlY3RzQnVpbGRlcnMpIHsKICAgICAgX3NpZGVFZmZlY3RzW3NpZGVFZmZlY3RzQnVpbGRlci5tZW1iZXJdID0gc2lkZUVmZmVjdHNCdWlsZGVyLnNpZGVFZmZlY3RzOwogICAgfQogICAgX3NpZGVFZmZlY3RzQnVpbGRlcnMgPSBudWxsOwoKICAgIHJldHVybiBuZXcgSW5mZXJyZWREYXRhSW1wbCgKICAgICAgICBjbG9zZWRXb3JsZCwKICAgICAgICBfZnVuY3Rpb25zQ2FsbGVkSW5Mb29wLAogICAgICAgIF9zaWRlRWZmZWN0cywKICAgICAgICBfc2lkZUVmZmVjdHNGcmVlRWxlbWVudHMsCiAgICAgICAgX2VsZW1lbnRzVGhhdENhbm5vdFRocm93LAogICAgICAgIF9mdW5jdGlvbnNUaGF0TWlnaHRCZVBhc3NlZFRvQXBwbHkpOwogIH0KCiAgc3RhdGljIHZvaWQgZW1wdHlXb3JrTGlzdChJdGVyYWJsZTxTaWRlRWZmZWN0c0J1aWxkZXI+IHNpZGVFZmZlY3RzQnVpbGRlcnMpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE9wdGltaXplIHRoaXMgYWxnb3JpdGhtLgogICAgUXVldWU8U2lkZUVmZmVjdHNCdWlsZGVyPiBxdWV1ZSA9IG5ldyBRdWV1ZTxTaWRlRWZmZWN0c0J1aWxkZXI+KCk7CiAgICBTZXQ8U2lkZUVmZmVjdHNCdWlsZGVyPiBpblF1ZXVlID0gbmV3IFNldDxTaWRlRWZmZWN0c0J1aWxkZXI+KCk7CgogICAgZm9yIChTaWRlRWZmZWN0c0J1aWxkZXIgYnVpbGRlciBpbiBzaWRlRWZmZWN0c0J1aWxkZXJzKSB7CiAgICAgIHF1ZXVlLmFkZExhc3QoYnVpbGRlcik7CiAgICAgIGluUXVldWUuYWRkKGJ1aWxkZXIpOwogICAgfQogICAgd2hpbGUgKHF1ZXVlLmlzTm90RW1wdHkpIHsKICAgICAgU2lkZUVmZmVjdHNCdWlsZGVyIHNpZGVFZmZlY3RzQnVpbGRlciA9IHF1ZXVlLnJlbW92ZUZpcnN0KCk7CiAgICAgIGluUXVldWUucmVtb3ZlKHNpZGVFZmZlY3RzQnVpbGRlcik7CiAgICAgIGZvciAoU2lkZUVmZmVjdHNCdWlsZGVyIGRlcGVuZGVudCBpbiBzaWRlRWZmZWN0c0J1aWxkZXIuZGVwZW5kaW5nKSB7CiAgICAgICAgaWYgKGRlcGVuZGVudC5hZGQoc2lkZUVmZmVjdHNCdWlsZGVyLnNpZGVFZmZlY3RzKSkgewogICAgICAgICAgaWYgKGluUXVldWUuYWRkKGRlcGVuZGVudCkpIHsKICAgICAgICAgICAgcXVldWUuYWRkTGFzdChkZXBlbmRlbnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRGdW5jdGlvbkNhbGxlZEluTG9vcChNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgX2Z1bmN0aW9uc0NhbGxlZEluTG9vcC5hZGQoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQ2Fubm90VGhyb3coRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgX2VsZW1lbnRzVGhhdENhbm5vdFRocm93LmFkZChlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJNaWdodEJlUGFzc2VkVG9BcHBseShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBfZnVuY3Rpb25zVGhhdE1pZ2h0QmVQYXNzZWRUb0FwcGx5LmFkZChlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0Q3VycmVudGx5S25vd25NaWdodEJlUGFzc2VkVG9BcHBseShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gX2Z1bmN0aW9uc1RoYXRNaWdodEJlUGFzc2VkVG9BcHBseS5jb250YWlucyhlbGVtZW50KTsKICB9Cn0KCmNsYXNzIFRyaXZpYWxJbmZlcnJlZERhdGEgaW1wbGVtZW50cyBJbmZlcnJlZERhdGEgewogIGZpbmFsIFNpZGVFZmZlY3RzIF9hbGxTaWRlRWZmZWN0cyA9IG5ldyBTaWRlRWZmZWN0cygpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlQm9vbCh0cnVlKTsgLy8gSXMgdHJpdmlhbC4KICB9CgogIEBvdmVycmlkZQogIFNpZGVFZmZlY3RzIGdldFNpZGVFZmZlY3RzT2ZFbGVtZW50KEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBfYWxsU2lkZUVmZmVjdHM7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldE1pZ2h0QmVQYXNzZWRUb0FwcGx5KEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgaXNDYWxsZWRJbkxvb3AoTWVtYmVyRW50aXR5IGVsZW1lbnQpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0Q2Fubm90VGhyb3coRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFNpZGVFZmZlY3RzIGdldFNpZGVFZmZlY3RzT2ZTZWxlY3RvcigKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIpIHsKICAgIHJldHVybiBfYWxsU2lkZUVmZmVjdHM7CiAgfQp9CoFQAE5OPAElARkkMS4kKBgbAR46KzUoFSgNSwYEATAnATc/AUgoMgFLLwE3UEUtAUdAGzgCASVEOAFBQwFEQBs9AVAmRgE0UDYBSDQBRDACATFGHS0BIzI3ATYBNgFAARQZIxklJTABLzUXTElOMjYyNjw2FSEVHxUhISwEAQwoMBUvGRY6MDExOxMEAQwoMzQiQCAGN00XITQ9DCg0ESMrLwoPNQgGGAQBDEAhSExPEEAEAT4BDC41BAEMMDcEAQw5SE49UVFOKwdROEFBBAIBP0w/LDohATchATchAUEhAT06QwQBDEJMBAEMOSs4SgQBRQwxKTU0KTclKElQBiEBIRUgFiIiLQQBUDVHRQE+HhwGH0MqSz0oJgwKCAYEAQw3KQQBDDUrBAEMPjUEAQxHQQQCATQ5AQwoKQQBDEAcBAEMQAEMNQEMOAEMKDMcBAIBMnBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvaW5mZXJyZWRfZGF0YS5kYXJ0N3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX21vZGVsL2pzX3N0cmF0ZWd5LmRhcnTAAFRaLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19tb2RlbC5zdHJhdGVneTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi9iYWNrZW5kX3N0cmF0ZWd5LmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vY29kZWdlbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vdGFza3MuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL3dvcmsuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHMsIEVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICcuLi9jb21waWxlci5kYXJ0JzsKaW1wb3J0ICcuLi9kZWZlcnJlZF9sb2FkLmRhcnQnIGhpZGUgV29ya0l0ZW07CmltcG9ydCAnLi4vZHVtcF9pbmZvLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VucXVldWUuZGFydCc7CmltcG9ydCAnLi4vaW8va2VybmVsX3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JwogICAgc2hvdyBLZXJuZWxTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5OwppbXBvcnQgJy4uL2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvdHlwZV9ncmFwaF9pbmZlcnJlci5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qc19zb3VyY2VfbWFwcGluZy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2JhY2tlbmQuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9iYWNrZW5kX2ltcGFjdC5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2NvZGVnZW5fbGlzdGVuZXIuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9jdXN0b21fZWxlbWVudHNfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9lbnF1ZXVlci5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ltcGFjdF90cmFuc2Zvcm1lci5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2luZmVycmVkX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmFtZXIuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ydW50aW1lX3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvcnVudGltZV90eXBlc19jb2RlZ2VuLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvcnVudGltZV90eXBlc19uZXcuZGFydCcKICAgIHNob3cgUmVjaXBlRW5jb2RlciwgUmVjaXBlRW5jb2RlckltcGw7CmltcG9ydCAnLi4vanNfZW1pdHRlci9jb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JyBzaG93IE1vZHVsYXJFbWl0dGVyOwppbXBvcnQgJy4uL2pzX2VtaXR0ZXIvanNfZW1pdHRlci5kYXJ0JyBzaG93IENvZGVFbWl0dGVyVGFzazsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqczsKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX3N0cmF0ZWd5LmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9iZWhhdmlvci5kYXJ0JzsKaW1wb3J0ICcuLi9uYXRpdmUvZW5xdWV1ZS5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9zc2EvYnVpbGRlcl9rZXJuZWwuZGFydCc7CmltcG9ydCAnLi4vc3NhL25vZGVzLmRhcnQnOwppbXBvcnQgJy4uL3NzYS9zc2EuZGFydCc7CmltcG9ydCAnLi4vc3NhL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL3RyYWNlci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfaW1wYWN0LmRhcnQnOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnOwppbXBvcnQgJ2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnZWxlbWVudF9tYXBfaW1wbC5kYXJ0JzsKaW1wb3J0ICdqc193b3JsZC5kYXJ0JzsKaW1wb3J0ICdqc193b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2xvY2Fscy5kYXJ0JzsKCmNsYXNzIEpzQmFja2VuZFN0cmF0ZWd5IGltcGxlbWVudHMgQmFja2VuZFN0cmF0ZWd5IHsKICBmaW5hbCBDb21waWxlciBfY29tcGlsZXI7CiAgSnNLZXJuZWxUb0VsZW1lbnRNYXAgX2VsZW1lbnRNYXA7CgogIC8vLyBDb2RlZ2VuIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgdGFibGUgb2YgaW50ZXJjZXB0b3JzIGFuZAogIC8vLyBjb25zdHJ1Y3RvcnMgZm9yIGN1c3RvbSBlbGVtZW50cy4KICBDdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpcyBfY3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXM7CgogIE5hdGl2ZUNvZGVnZW5FbnF1ZXVlciBfbmF0aXZlQ29kZWdlbkVucXVldWVyOwoKICBOYW1lciBfbmFtZXI7CgogIENvZGVnZW5JbXBhY3RUcmFuc2Zvcm1lciBfY29kZWdlbkltcGFjdFRyYW5zZm9ybWVyOwoKICBDb2RlRW1pdHRlclRhc2sgX2VtaXR0ZXJUYXNrOwoKICBSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyIF9ydGlDaGVja3NCdWlsZGVyOwoKICBGdW5jdGlvbkNvbXBpbGVyIF9mdW5jdGlvbkNvbXBpbGVyOwoKICBTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5IHNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3k7CgogIC8vLyBUaGUgZ2VuZXJhdGVkIGNvZGUgYXMgYSBqcyBBU1QgZm9yIGNvbXBpbGVkIG1ldGhvZHMuCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwganMuRXhwcmVzc2lvbj4gZ2VuZXJhdGVkQ29kZSA9CiAgICAgIDxNZW1iZXJFbnRpdHksIGpzLkV4cHJlc3Npb24+e307CgogIEpzQmFja2VuZFN0cmF0ZWd5KHRoaXMuX2NvbXBpbGVyKSB7CiAgICBib29sIGdlbmVyYXRlU291cmNlTWFwID0gX2NvbXBpbGVyLm9wdGlvbnMuZ2VuZXJhdGVTb3VyY2VNYXA7CiAgICBpZiAoIWdlbmVyYXRlU291cmNlTWFwKSB7CiAgICAgIHNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kgPSBjb25zdCBKYXZhU2NyaXB0U291cmNlSW5mb3JtYXRpb25TdHJhdGVneSgpOwogICAgfSBlbHNlIHsKICAgICAgc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSA9IG5ldyBLZXJuZWxTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5KHRoaXMpOwogICAgfQogICAgX2VtaXR0ZXJUYXNrID0gbmV3IENvZGVFbWl0dGVyVGFzayhfY29tcGlsZXIsIGdlbmVyYXRlU291cmNlTWFwKTsKICAgIF9mdW5jdGlvbkNvbXBpbGVyID0gbmV3IFNzYUZ1bmN0aW9uQ29tcGlsZXIoCiAgICAgICAgX2NvbXBpbGVyLm9wdGlvbnMsCiAgICAgICAgX2NvbXBpbGVyLnJlcG9ydGVyLAogICAgICAgIHRoaXMsCiAgICAgICAgX2NvbXBpbGVyLm1lYXN1cmVyLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxDb21waWxlclRhc2s+IGdldCB0YXNrcyB7CiAgICBMaXN0PENvbXBpbGVyVGFzaz4gcmVzdWx0ID0gZnVuY3Rpb25Db21waWxlci50YXNrczsKICAgIHJlc3VsdC5hZGQoZW1pdHRlclRhc2spOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uQ29tcGlsZXIgZ2V0IGZ1bmN0aW9uQ29tcGlsZXIgPT4gX2Z1bmN0aW9uQ29tcGlsZXI7CgogIEBvdmVycmlkZQogIENvZGVFbWl0dGVyVGFzayBnZXQgZW1pdHRlclRhc2sgPT4gX2VtaXR0ZXJUYXNrOwoKICBOYW1lciBnZXQgbmFtZXJGb3JUZXN0aW5nID0+IF9uYW1lcjsKCiAgTmF0aXZlRW5xdWV1ZXIgZ2V0IG5hdGl2ZUNvZGVnZW5FbnF1ZXVlciA9PiBfbmF0aXZlQ29kZWdlbkVucXVldWVyOwoKICBSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyIGdldCBydGlDaGVja3NCdWlsZGVyRm9yVGVzdGluZyA9PiBfcnRpQ2hlY2tzQnVpbGRlcjsKCiAgTWFwPE1lbWJlckVudGl0eSwgV29ybGRJbXBhY3Q+IGNvZGVnZW5JbXBhY3RzRm9yVGVzdGluZzsKCiAgU3RyaW5nIGdldEdlbmVyYXRlZENvZGVGb3JUZXN0aW5nKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4ganMucHJldHR5UHJpbnQoZ2VuZXJhdGVkQ29kZVtlbGVtZW50XSwKICAgICAgICBlbmFibGVNaW5pZmljYXRpb246IF9jb21waWxlci5vcHRpb25zLmVuYWJsZU1pbmlmaWNhdGlvbik7CiAgfQoKICBAZGVwcmVjYXRlZAogIEpzVG9FbGVtZW50TWFwIGdldCBlbGVtZW50TWFwIHsKICAgIGFzc2VydChfZWxlbWVudE1hcCAhPSBudWxsLAogICAgICAgICJKc0JhY2tlbmRTdHJhdGVneS5lbGVtZW50TWFwIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC4iKTsKICAgIHJldHVybiBfZWxlbWVudE1hcDsKICB9CgogIC8vLyBDb2RlZ2VuIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgdGFibGUgb2YgaW50ZXJjZXB0b3JzIGFuZAogIC8vLyBjb25zdHJ1Y3RvcnMgZm9yIGN1c3RvbSBlbGVtZW50cy4KICBDdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpcyBnZXQgY3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXMgewogICAgYXNzZXJ0KAogICAgICAgIF9jdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpcyAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICAgIkN1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC4iKSk7CiAgICByZXR1cm4gX2N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzOwogIH0KCiAgUnVudGltZVR5cGVzQ2hlY2tzQnVpbGRlciBnZXQgcnRpQ2hlY2tzQnVpbGRlciB7CiAgICBhc3NlcnQoCiAgICAgICAgX3J0aUNoZWNrc0J1aWxkZXIgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAgICJSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC4iKSk7CiAgICBhc3NlcnQoCiAgICAgICAgIV9ydGlDaGVja3NCdWlsZGVyLnJ0aUNoZWNrc0J1aWxkZXJDbG9zZWQsCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAiUnVudGltZVR5cGVzQ2hlY2tzIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQuIikpOwogICAgcmV0dXJuIF9ydGlDaGVja3NCdWlsZGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgSkNsb3NlZFdvcmxkIGNyZWF0ZUpDbG9zZWRXb3JsZCgKICAgICAgS0Nsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBPdXRwdXRVbml0RGF0YSBvdXRwdXRVbml0RGF0YSkgewogICAgS2VybmVsRnJvbnRlbmRTdHJhdGVneSBzdHJhdGVneSA9IF9jb21waWxlci5mcm9udGVuZFN0cmF0ZWd5OwogICAgX2VsZW1lbnRNYXAgPSBuZXcgSnNLZXJuZWxUb0VsZW1lbnRNYXAoCiAgICAgICAgX2NvbXBpbGVyLnJlcG9ydGVyLAogICAgICAgIF9jb21waWxlci5lbnZpcm9ubWVudCwKICAgICAgICBzdHJhdGVneS5lbGVtZW50TWFwLAogICAgICAgIGNsb3NlZFdvcmxkLmxpdmVNZW1iZXJVc2FnZSwKICAgICAgICBjbG9zZWRXb3JsZC5hbm5vdGF0aW9uc0RhdGEpOwogICAgR2xvYmFsTG9jYWxzTWFwIF9nbG9iYWxMb2NhbHNNYXAgPSBuZXcgR2xvYmFsTG9jYWxzTWFwKCk7CiAgICBDbG9zdXJlRGF0YUJ1aWxkZXIgY2xvc3VyZURhdGFCdWlsZGVyID0gbmV3IENsb3N1cmVEYXRhQnVpbGRlcigKICAgICAgICBfZWxlbWVudE1hcCwgX2dsb2JhbExvY2Fsc01hcCwgY2xvc2VkV29ybGQuYW5ub3RhdGlvbnNEYXRhKTsKICAgIEpzQ2xvc2VkV29ybGRCdWlsZGVyIGNsb3NlZFdvcmxkQnVpbGRlciA9IG5ldyBKc0Nsb3NlZFdvcmxkQnVpbGRlcigKICAgICAgICBfZWxlbWVudE1hcCwKICAgICAgICBfZ2xvYmFsTG9jYWxzTWFwLAogICAgICAgIGNsb3N1cmVEYXRhQnVpbGRlciwKICAgICAgICBfY29tcGlsZXIub3B0aW9ucywKICAgICAgICBfY29tcGlsZXIuYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5KTsKICAgIEpDbG9zZWRXb3JsZCBqQ2xvc2VkV29ybGQgPSBjbG9zZWRXb3JsZEJ1aWxkZXIuY29udmVydENsb3NlZFdvcmxkKAogICAgICAgIGNsb3NlZFdvcmxkLCBzdHJhdGVneS5jbG9zdXJlTW9kZWxzLCBvdXRwdXRVbml0RGF0YSk7CiAgICBfZWxlbWVudE1hcC5sYXRlT3V0cHV0VW5pdERhdGFCdWlsZGVyID0KICAgICAgICBuZXcgTGF0ZU91dHB1dFVuaXREYXRhQnVpbGRlcihqQ2xvc2VkV29ybGQub3V0cHV0VW5pdERhdGEpOwogICAgcmV0dXJuIGpDbG9zZWRXb3JsZDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJKQ2xvc2VkV29ybGQoY292YXJpYW50IEpzQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIF9lbGVtZW50TWFwID0gY2xvc2VkV29ybGQuZWxlbWVudE1hcDsKICB9CgogIEBvdmVycmlkZQogIENvZGVnZW5JbnB1dHMgb25Db2RlZ2VuU3RhcnQoCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzKSB7CiAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQgPSBnbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cy5jbG9zZWRXb3JsZDsKICAgIFJ1bnRpbWVUeXBlVGFncyBydGlUYWdzID0gY29uc3QgUnVudGltZVR5cGVUYWdzKCk7CiAgICBGaXhlZE5hbWVzIGZpeGVkTmFtZXMgPSBfY29tcGlsZXIub3B0aW9ucy5lbmFibGVNaW5pZmljYXRpb24KICAgICAgICA/IGNvbnN0IE1pbmlmaWVkRml4ZWROYW1lcygpCiAgICAgICAgOiBjb25zdCBGaXhlZE5hbWVzKCk7CgogICAgVHJhY2VyIHRyYWNlciA9IG5ldyBUcmFjZXIoY2xvc2VkV29ybGQsIF9jb21waWxlci5vdXRwdXRQcm92aWRlcik7CiAgICBSdW50aW1lVHlwZXNFbmNvZGVyIHJ0aUVuY29kZXIgPSBuZXcgUnVudGltZVR5cGVzRW5jb2RlckltcGwoCiAgICAgICAgcnRpVGFncywKICAgICAgICBjbG9zZWRXb3JsZC5uYXRpdmVEYXRhLAogICAgICAgIGNsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cywKICAgICAgICBjbG9zZWRXb3JsZC5ydGlOZWVkKTsKCiAgICBSdW50aW1lVHlwZXNTdWJzdGl0dXRpb25zIHJ0aVN1YnN0aXR1dGlvbnM7CiAgICBpZiAoX2NvbXBpbGVyLm9wdGlvbnMuZGlzYWJsZVJ0aU9wdGltaXphdGlvbikgewogICAgICBydGlTdWJzdGl0dXRpb25zID0gbmV3IFRyaXZpYWxSdW50aW1lVHlwZXNTdWJzdGl0dXRpb25zKGNsb3NlZFdvcmxkKTsKICAgICAgX3J0aUNoZWNrc0J1aWxkZXIgPQogICAgICAgICAgbmV3IFRyaXZpYWxSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyKGNsb3NlZFdvcmxkLCBydGlTdWJzdGl0dXRpb25zKTsKICAgIH0gZWxzZSB7CiAgICAgIFJ1bnRpbWVUeXBlc0ltcGwgcnVudGltZVR5cGVzSW1wbCA9IG5ldyBSdW50aW1lVHlwZXNJbXBsKGNsb3NlZFdvcmxkKTsKICAgICAgX3J0aUNoZWNrc0J1aWxkZXIgPSBydW50aW1lVHlwZXNJbXBsOwogICAgICBydGlTdWJzdGl0dXRpb25zID0gcnVudGltZVR5cGVzSW1wbDsKICAgIH0KCiAgICBSZWNpcGVFbmNvZGVyIHJ0aVJlY2lwZUVuY29kZXIgPSBfY29tcGlsZXIub3B0aW9ucy5leHBlcmltZW50TmV3UnRpCiAgICAgICAgPyBuZXcgUmVjaXBlRW5jb2RlckltcGwoCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLAogICAgICAgICAgICBydGlTdWJzdGl0dXRpb25zLAogICAgICAgICAgICBjbG9zZWRXb3JsZC5uYXRpdmVEYXRhLAogICAgICAgICAgICBjbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLAogICAgICAgICAgICBjbG9zZWRXb3JsZC5ydGlOZWVkKQogICAgICAgIDogbnVsbDsKCiAgICBDb2RlZ2VuSW5wdXRzIGNvZGVnZW4gPSBuZXcgQ29kZWdlbklucHV0c0ltcGwocnRpU3Vic3RpdHV0aW9ucywgcnRpRW5jb2RlciwKICAgICAgICBydGlSZWNpcGVFbmNvZGVyLCB0cmFjZXIsIHJ0aVRhZ3MsIGZpeGVkTmFtZXMpOwoKICAgIGZ1bmN0aW9uQ29tcGlsZXIuaW5pdGlhbGl6ZShnbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cywgY29kZWdlbik7CiAgICByZXR1cm4gY29kZWdlbjsKICB9CgogIEBvdmVycmlkZQogIENvZGVnZW5FbnF1ZXVlciBjcmVhdGVDb2RlZ2VuRW5xdWV1ZXIoCiAgICAgIENvbXBpbGVyVGFzayB0YXNrLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMsCiAgICAgIENvZGVnZW5JbnB1dHMgY29kZWdlbiwKICAgICAgQ29kZWdlblJlc3VsdHMgY29kZWdlblJlc3VsdHMpIHsKICAgIGFzc2VydChfZWxlbWVudE1hcCAhPSBudWxsLAogICAgICAgICJKc0JhY2tlbmRTdHJhdGVneS5lbGVtZW50TWFwIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC4iKTsKICAgIE9uZVNob3RJbnRlcmNlcHRvckRhdGEgb25lU2hvdEludGVyY2VwdG9yRGF0YSA9IG5ldyBPbmVTaG90SW50ZXJjZXB0b3JEYXRhKAogICAgICAgIGNsb3NlZFdvcmxkLmludGVyY2VwdG9yRGF0YSwKICAgICAgICBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cywKICAgICAgICBjbG9zZWRXb3JsZC5uYXRpdmVEYXRhKTsKICAgIF9vbkNvZGVnZW5FbnF1ZXVlclN0YXJ0KAogICAgICAgIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMsIGNvZGVnZW4sIG9uZVNob3RJbnRlcmNlcHRvckRhdGEpOwogICAgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCA9IGNsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudDsKICAgIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzID0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHM7CiAgICBCYWNrZW5kSW1wYWN0cyBpbXBhY3RzID0KICAgICAgICBuZXcgQmFja2VuZEltcGFjdHMoY29tbW9uRWxlbWVudHMsIF9jb21waWxlci5vcHRpb25zLmV4cGVyaW1lbnROZXdSdGkpOwogICAgX2N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzID0gbmV3IEN1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzKAogICAgICAgIGNvbW1vbkVsZW1lbnRzLCBlbGVtZW50RW52aXJvbm1lbnQsIGNsb3NlZFdvcmxkLm5hdGl2ZURhdGEpOwogICAgcmV0dXJuIG5ldyBDb2RlZ2VuRW5xdWV1ZXIoCiAgICAgICAgdGFzaywKICAgICAgICBuZXcgQ29kZWdlbldvcmxkQnVpbGRlckltcGwoCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLAogICAgICAgICAgICBfY29tcGlsZXIuYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5LmNyZWF0ZVNlbGVjdG9yU3RyYXRlZ3koKSwKICAgICAgICAgICAgb25lU2hvdEludGVyY2VwdG9yRGF0YSksCiAgICAgICAgbmV3IEtlcm5lbENvZGVnZW5Xb3JrSXRlbUJ1aWxkZXIoCiAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLAogICAgICAgICAgICBjb2RlZ2VuUmVzdWx0cywKICAgICAgICAgICAgbmV3IENsb3NlZEVudGl0eUxvb2t1cChfZWxlbWVudE1hcCksCiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIHRoZSBuZWVkIGZvciBhIFtDb21wb25lbnRMb29rdXBdLiBUaGlzCiAgICAgICAgICAgIC8vIGlzIGNhdXNlZCBieSBzb21lIHR5cGUgbWFza3MgaG9sZGluZyBhIGtlcm5lbCBub2RlIGZvciB1c2luZyBpbgogICAgICAgICAgICAvLyB0cmFjaW5nLgogICAgICAgICAgICBuZXcgQ29tcG9uZW50TG9va3VwKF9lbGVtZW50TWFwLnByb2dyYW1FbnYubWFpbkNvbXBvbmVudCkpLAogICAgICAgIG5ldyBDb2RlZ2VuRW5xdWV1ZXJMaXN0ZW5lcigKICAgICAgICAgICAgX2NvbXBpbGVyLm9wdGlvbnMsCiAgICAgICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICAgICAgY29tbW9uRWxlbWVudHMsCiAgICAgICAgICAgIGltcGFjdHMsCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLmJhY2tlbmRVc2FnZSwKICAgICAgICAgICAgY2xvc2VkV29ybGQucnRpTmVlZCwKICAgICAgICAgICAgY3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXMsCiAgICAgICAgICAgIG5hdGl2ZUNvZGVnZW5FbnF1ZXVlciksCiAgICAgICAgY2xvc2VkV29ybGQuYW5ub3RhdGlvbnNEYXRhKTsKICB9CgogIC8vLyBDYWxsZWQgYmVmb3JlIHRoZSBjb21waWxlciBzdGFydHMgcnVubmluZyB0aGUgY29kZWdlbiBlbnF1ZXVlci4KICB2b2lkIF9vbkNvZGVnZW5FbnF1ZXVlclN0YXJ0KAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cywKICAgICAgQ29kZWdlbklucHV0cyBjb2RlZ2VuLAogICAgICBPbmVTaG90SW50ZXJjZXB0b3JEYXRhIG9uZVNob3RJbnRlcmNlcHRvckRhdGEpIHsKICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCA9IGdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzLmNsb3NlZFdvcmxkOwogICAgUnVudGltZVR5cGVUYWdzIHJ0aVRhZ3MgPSBjb2RlZ2VuLnJ0aVRhZ3M7CiAgICBGaXhlZE5hbWVzIGZpeGVkTmFtZXMgPSBjb2RlZ2VuLmZpeGVkTmFtZXM7CiAgICBfbmFtZXIgPSBfY29tcGlsZXIub3B0aW9ucy5lbmFibGVNaW5pZmljYXRpb24KICAgICAgICA/IF9jb21waWxlci5vcHRpb25zLnVzZUZyZXF1ZW5jeU5hbWVyCiAgICAgICAgICAgID8gbmV3IEZyZXF1ZW5jeUJhc2VkTmFtZXIoY2xvc2VkV29ybGQsIHJ0aVRhZ3MsIGZpeGVkTmFtZXMpCiAgICAgICAgICAgIDogbmV3IE1pbmlmeU5hbWVyKGNsb3NlZFdvcmxkLCBydGlUYWdzLCBmaXhlZE5hbWVzKQogICAgICAgIDogbmV3IE5hbWVyKGNsb3NlZFdvcmxkLCBydGlUYWdzLCBmaXhlZE5hbWVzKTsKICAgIF9uYXRpdmVDb2RlZ2VuRW5xdWV1ZXIgPSBuZXcgTmF0aXZlQ29kZWdlbkVucXVldWVyKAogICAgICAgIF9jb21waWxlci5vcHRpb25zLAogICAgICAgIGNsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cywKICAgICAgICBjbG9zZWRXb3JsZC5kYXJ0VHlwZXMsCiAgICAgICAgZW1pdHRlclRhc2ssCiAgICAgICAgY2xvc2VkV29ybGQubGl2ZU5hdGl2ZUNsYXNzZXMsCiAgICAgICAgY2xvc2VkV29ybGQubmF0aXZlRGF0YSk7CiAgICBlbWl0dGVyVGFzay5jcmVhdGVFbWl0dGVyKF9uYW1lciwgY29kZWdlbiwgY2xvc2VkV29ybGQpOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hhcmUgdGhlIGltcGFjdCBvYmplY3QgY3JlYXRlZCBpbgogICAgLy8gY3JlYXRlQ29kZWdlbkVucXVldWVyLgogICAgQmFja2VuZEltcGFjdHMgaW1wYWN0cyA9IG5ldyBCYWNrZW5kSW1wYWN0cygKICAgICAgICBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cywgX2NvbXBpbGVyLm9wdGlvbnMuZXhwZXJpbWVudE5ld1J0aSk7CgogICAgX2NvZGVnZW5JbXBhY3RUcmFuc2Zvcm1lciA9IG5ldyBDb2RlZ2VuSW1wYWN0VHJhbnNmb3JtZXIoCiAgICAgICAgY2xvc2VkV29ybGQsCiAgICAgICAgY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LAogICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLAogICAgICAgIGltcGFjdHMsCiAgICAgICAgY2xvc2VkV29ybGQubmF0aXZlRGF0YSwKICAgICAgICBjbG9zZWRXb3JsZC5iYWNrZW5kVXNhZ2UsCiAgICAgICAgY2xvc2VkV29ybGQucnRpTmVlZCwKICAgICAgICBuYXRpdmVDb2RlZ2VuRW5xdWV1ZXIsCiAgICAgICAgX25hbWVyLAogICAgICAgIG9uZVNob3RJbnRlcmNlcHRvckRhdGEsCiAgICAgICAgcnRpQ2hlY2tzQnVpbGRlciwKICAgICAgICBlbWl0dGVyVGFzay5uYXRpdmVFbWl0dGVyKTsKICB9CgogIFdvcmxkSW1wYWN0IGdlbmVyYXRlQ29kZSgKICAgICAgV29ya0l0ZW0gd29yaywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBDb2RlZ2VuUmVzdWx0cyBjb2RlZ2VuUmVzdWx0cywKICAgICAgRW50aXR5TG9va3VwIGVudGl0eUxvb2t1cCwKICAgICAgQ29tcG9uZW50TG9va3VwIGNvbXBvbmVudExvb2t1cCkgewogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IHdvcmsuZWxlbWVudDsKICAgIENvZGVnZW5SZXN1bHQgcmVzdWx0ID0gY29kZWdlblJlc3VsdHMuZ2V0Q29kZWdlblJlc3VsdHMobWVtYmVyKTsKICAgIGlmIChfY29tcGlsZXIub3B0aW9ucy50ZXN0TW9kZSkgewogICAgICBib29sIHVzZURhdGFLaW5kcyA9IHRydWU7CiAgICAgIExpc3Q8T2JqZWN0PiBkYXRhID0gW107CiAgICAgIERhdGFTaW5rIHNpbmsgPSBuZXcgT2JqZWN0U2luayhkYXRhLCB1c2VEYXRhS2luZHM6IHVzZURhdGFLaW5kcyk7CiAgICAgIHNpbmsucmVnaXN0ZXJDb2RlZ2VuV3JpdGVyKG5ldyBDb2RlZ2VuV3JpdGVySW1wbChjbG9zZWRXb3JsZCkpOwogICAgICByZXN1bHQud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgICBEYXRhU291cmNlIHNvdXJjZSA9IG5ldyBPYmplY3RTb3VyY2UoZGF0YSwgdXNlRGF0YUtpbmRzOiB1c2VEYXRhS2luZHMpOwogICAgICBMaXN0PE1vZHVsYXJOYW1lPiBtb2R1bGFyTmFtZXMgPSBbXTsKICAgICAgTGlzdDxNb2R1bGFyRXhwcmVzc2lvbj4gbW9kdWxhckV4cHJlc3Npb24gPSBbXTsKICAgICAgc291cmNlLnJlZ2lzdGVyQ29kZWdlblJlYWRlcigKICAgICAgICAgIG5ldyBDb2RlZ2VuUmVhZGVySW1wbChjbG9zZWRXb3JsZCwgbW9kdWxhck5hbWVzLCBtb2R1bGFyRXhwcmVzc2lvbikpOwogICAgICBzb3VyY2UucmVnaXN0ZXJFbnRpdHlMb29rdXAoZW50aXR5TG9va3VwKTsKICAgICAgc291cmNlLnJlZ2lzdGVyQ29tcG9uZW50TG9va3VwKGNvbXBvbmVudExvb2t1cCk7CiAgICAgIHJlc3VsdCA9IENvZGVnZW5SZXN1bHQucmVhZEZyb21EYXRhU291cmNlKAogICAgICAgICAgc291cmNlLCBtb2R1bGFyTmFtZXMsIG1vZHVsYXJFeHByZXNzaW9uKTsKICAgIH0KICAgIGlmIChyZXN1bHQuY29kZSAhPSBudWxsKSB7CiAgICAgIGdlbmVyYXRlZENvZGVbbWVtYmVyXSA9IHJlc3VsdC5jb2RlOwogICAgfQogICAgaWYgKHJldGFpbkRhdGFGb3JUZXN0aW5nKSB7CiAgICAgIGNvZGVnZW5JbXBhY3RzRm9yVGVzdGluZyA/Pz0gPE1lbWJlckVudGl0eSwgV29ybGRJbXBhY3Q+e307CiAgICAgIGNvZGVnZW5JbXBhY3RzRm9yVGVzdGluZ1ttZW1iZXJdID0gcmVzdWx0LmltcGFjdDsKICAgIH0KICAgIFdvcmxkSW1wYWN0IHdvcmxkSW1wYWN0ID0KICAgICAgICBfY29kZWdlbkltcGFjdFRyYW5zZm9ybWVyLnRyYW5zZm9ybUNvZGVnZW5JbXBhY3QocmVzdWx0LmltcGFjdCk7CiAgICBfY29tcGlsZXIuZHVtcEluZm9UYXNrLnJlZ2lzdGVySW1wYWN0KG1lbWJlciwgd29ybGRJbXBhY3QpOwogICAgcmVzdWx0LmFwcGx5TW9kdWxhclN0YXRlKF9uYW1lciwgZW1pdHRlclRhc2suZW1pdHRlcik7CiAgICByZXR1cm4gd29ybGRJbXBhY3Q7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG9uQ29kZWdlbkVuZChDb2RlZ2VuSW5wdXRzIGNvZGVnZW4pIHsKICAgIHNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kub25Db21wbGV0ZSgpOwogICAgY29kZWdlbi50cmFjZXIuY2xvc2UoKTsKICB9CgogIEBvdmVycmlkZQogIGludCBhc3NlbWJsZVByb2dyYW0oSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBJbmZlcnJlZERhdGEgaW5mZXJyZWREYXRhLAogICAgICBDb2RlZ2VuSW5wdXRzIGNvZGVnZW5JbnB1dHMsIENvZGVnZW5Xb3JsZCBjb2RlZ2VuV29ybGQpIHsKICAgIGludCBwcm9ncmFtU2l6ZSA9IGVtaXR0ZXJUYXNrLmFzc2VtYmxlUHJvZ3JhbSgKICAgICAgICBfbmFtZXIsIGNsb3NlZFdvcmxkLCBpbmZlcnJlZERhdGEsIGNvZGVnZW5JbnB1dHMsIGNvZGVnZW5Xb3JsZCk7CiAgICBjbG9zZWRXb3JsZC5ub1N1Y2hNZXRob2REYXRhLmVtaXREaWFnbm9zdGljKF9jb21waWxlci5yZXBvcnRlcik7CiAgICByZXR1cm4gcHJvZ3JhbVNpemU7CiAgfQoKICBAb3ZlcnJpZGUKICBTc2FCdWlsZGVyIGNyZWF0ZVNzYUJ1aWxkZXIoCiAgICAgIENvbXBpbGVyVGFzayB0YXNrLCBTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5IHNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kpIHsKICAgIHJldHVybiBuZXcgS2VybmVsU3NhQnVpbGRlcigKICAgICAgICB0YXNrLAogICAgICAgIF9jb21waWxlci5vcHRpb25zLAogICAgICAgIF9jb21waWxlci5yZXBvcnRlciwKICAgICAgICBfY29tcGlsZXIuZHVtcEluZm9UYXNrLAogICAgICAgIC8vIGlnbm9yZTpkZXByZWNhdGVkX21lbWJlcl91c2VfZnJvbV9zYW1lX3BhY2thZ2UKICAgICAgICBlbGVtZW50TWFwLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlU3BhbiBzcGFuRnJvbVNwYW5uYWJsZShTcGFubmFibGUgc3Bhbm5hYmxlLCBFbnRpdHkgY3VycmVudEVsZW1lbnQpIHsKICAgIHJldHVybiBfZWxlbWVudE1hcC5nZXRTb3VyY2VTcGFuKHNwYW5uYWJsZSwgY3VycmVudEVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZXNJbmZlcnJlciBjcmVhdGVUeXBlc0luZmVycmVyKAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIEluZmVycmVkRGF0YUJ1aWxkZXIgaW5mZXJyZWREYXRhQnVpbGRlcikgewogICAgcmV0dXJuIG5ldyBUeXBlR3JhcGhJbmZlcnJlcihfY29tcGlsZXIsIGNsb3NlZFdvcmxkLCBpbmZlcnJlZERhdGFCdWlsZGVyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJlcGFyZUNvZGVnZW5SZWFkZXIoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5yZWdpc3RlckVudGl0eVJlYWRlcihuZXcgQ2xvc2VkRW50aXR5UmVhZGVyKF9lbGVtZW50TWFwKSk7CiAgICBzb3VyY2UucmVnaXN0ZXJFbnRpdHlMb29rdXAobmV3IENsb3NlZEVudGl0eUxvb2t1cChfZWxlbWVudE1hcCkpOwogICAgc291cmNlLnJlZ2lzdGVyQ29tcG9uZW50TG9va3VwKAogICAgICAgIG5ldyBDb21wb25lbnRMb29rdXAoX2VsZW1lbnRNYXAucHJvZ3JhbUVudi5tYWluQ29tcG9uZW50KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFbnRpdHlXcml0ZXIgZm9yRWFjaENvZGVnZW5NZW1iZXIodm9pZCBGdW5jdGlvbihNZW1iZXJFbnRpdHkgbWVtYmVyKSBmKSB7CiAgICBpbnQgZWFybHlNZW1iZXJJbmRleExpbWl0ID0gX2VsZW1lbnRNYXAucHJlcGFyZUZvckNvZGVnZW5TZXJpYWxpemF0aW9uKCk7CiAgICBDbG9zZWRFbnRpdHlXcml0ZXIgZW50aXR5V3JpdGVyID0KICAgICAgICBuZXcgQ2xvc2VkRW50aXR5V3JpdGVyKF9lbGVtZW50TWFwLCBlYXJseU1lbWJlckluZGV4TGltaXQpOwogICAgZm9yIChpbnQgbWVtYmVySW5kZXggPSAwOwogICAgICAgIG1lbWJlckluZGV4IDwgX2VsZW1lbnRNYXAubWVtYmVycy5sZW5ndGg7CiAgICAgICAgbWVtYmVySW5kZXgrKykgewogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gX2VsZW1lbnRNYXAubWVtYmVycy5nZXRFbnRpdHkobWVtYmVySW5kZXgpOwogICAgICBpZiAobWVtYmVyID09IG51bGwgfHwgbWVtYmVyLmlzQWJzdHJhY3QpIGNvbnRpbnVlOwogICAgICBmKG1lbWJlcik7CiAgICB9CiAgICByZXR1cm4gZW50aXR5V3JpdGVyOwogIH0KfQoKY2xhc3MgS2VybmVsQ29kZWdlbldvcmtJdGVtQnVpbGRlciBpbXBsZW1lbnRzIFdvcmtJdGVtQnVpbGRlciB7CiAgZmluYWwgSnNCYWNrZW5kU3RyYXRlZ3kgX2JhY2tlbmRTdHJhdGVneTsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIENvZGVnZW5SZXN1bHRzIF9jb2RlZ2VuUmVzdWx0czsKICBmaW5hbCBFbnRpdHlMb29rdXAgX2VudGl0eUxvb2t1cDsKICBmaW5hbCBDb21wb25lbnRMb29rdXAgX2NvbXBvbmVudExvb2t1cDsKCiAgS2VybmVsQ29kZWdlbldvcmtJdGVtQnVpbGRlcih0aGlzLl9iYWNrZW5kU3RyYXRlZ3ksIHRoaXMuX2Nsb3NlZFdvcmxkLAogICAgICB0aGlzLl9jb2RlZ2VuUmVzdWx0cywgdGhpcy5fZW50aXR5TG9va3VwLCB0aGlzLl9jb21wb25lbnRMb29rdXApOwoKICBAb3ZlcnJpZGUKICBXb3JrSXRlbSBjcmVhdGVXb3JrSXRlbShNZW1iZXJFbnRpdHkgZW50aXR5KSB7CiAgICBpZiAoZW50aXR5LmlzQWJzdHJhY3QpIHJldHVybiBudWxsOwogICAgcmV0dXJuIG5ldyBLZXJuZWxDb2RlZ2VuV29ya0l0ZW0oX2JhY2tlbmRTdHJhdGVneSwgX2Nsb3NlZFdvcmxkLAogICAgICAgIF9jb2RlZ2VuUmVzdWx0cywgX2VudGl0eUxvb2t1cCwgX2NvbXBvbmVudExvb2t1cCwgZW50aXR5KTsKICB9Cn0KCmNsYXNzIEtlcm5lbENvZGVnZW5Xb3JrSXRlbSBleHRlbmRzIFdvcmtJdGVtIHsKICBmaW5hbCBKc0JhY2tlbmRTdHJhdGVneSBfYmFja2VuZFN0cmF0ZWd5OwogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CiAgZmluYWwgQ29kZWdlblJlc3VsdHMgX2NvZGVnZW5SZXN1bHRzOwogIGZpbmFsIEVudGl0eUxvb2t1cCBfZW50aXR5TG9va3VwOwogIGZpbmFsIENvbXBvbmVudExvb2t1cCBfY29tcG9uZW50TG9va3VwOwogIEBvdmVycmlkZQogIGZpbmFsIE1lbWJlckVudGl0eSBlbGVtZW50OwoKICBLZXJuZWxDb2RlZ2VuV29ya0l0ZW0oCiAgICAgIHRoaXMuX2JhY2tlbmRTdHJhdGVneSwKICAgICAgdGhpcy5fY2xvc2VkV29ybGQsCiAgICAgIHRoaXMuX2NvZGVnZW5SZXN1bHRzLAogICAgICB0aGlzLl9lbnRpdHlMb29rdXAsCiAgICAgIHRoaXMuX2NvbXBvbmVudExvb2t1cCwKICAgICAgdGhpcy5lbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgV29ybGRJbXBhY3QgcnVuKCkgewogICAgcmV0dXJuIF9iYWNrZW5kU3RyYXRlZ3kuZ2VuZXJhdGVDb2RlKAogICAgICAgIHRoaXMsIF9jbG9zZWRXb3JsZCwgX2NvZGVnZW5SZXN1bHRzLCBfZW50aXR5TG9va3VwLCBfY29tcG9uZW50TG9va3VwKTsKICB9Cn0KCi8vLyBUYXNrIGZvciBidWlsZGluZyBTU0EgZnJvbSBrZXJuZWwgSVIgbG9hZGVkIGZyb20gLmRpbGwuCmNsYXNzIEtlcm5lbFNzYUJ1aWxkZXIgaW1wbGVtZW50cyBTc2FCdWlsZGVyIHsKICBmaW5hbCBDb21waWxlclRhc2sgX3Rhc2s7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIGZpbmFsIERpYWdub3N0aWNSZXBvcnRlciBfcmVwb3J0ZXI7CiAgZmluYWwgRHVtcEluZm9UYXNrIF9kdW1wSW5mb1Rhc2s7CiAgZmluYWwgSnNUb0VsZW1lbnRNYXAgX2VsZW1lbnRNYXA7CiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSBfc291cmNlSW5mb3JtYXRpb25TdHJhdGVneTsKCiAgRnVuY3Rpb25JbmxpbmVDYWNoZSBfaW5saW5lQ2FjaGU7CiAgSW5saW5lRGF0YUNhY2hlIF9pbmxpbmVEYXRhQ2FjaGU7CgogIEtlcm5lbFNzYUJ1aWxkZXIodGhpcy5fdGFzaywgdGhpcy5fb3B0aW9ucywgdGhpcy5fcmVwb3J0ZXIsCiAgICAgIHRoaXMuX2R1bXBJbmZvVGFzaywgdGhpcy5fZWxlbWVudE1hcCwgdGhpcy5fc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSk7CgogIEBvdmVycmlkZQogIEhHcmFwaCBidWlsZCgKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBDb2RlZ2VuSW5wdXRzIGNvZGVnZW4sCiAgICAgIENvZGVnZW5SZWdpc3RyeSByZWdpc3RyeSwKICAgICAgTW9kdWxhck5hbWVyIG5hbWVyLAogICAgICBNb2R1bGFyRW1pdHRlciBlbWl0dGVyKSB7CiAgICBfaW5saW5lQ2FjaGUgPz89IG5ldyBGdW5jdGlvbklubGluZUNhY2hlKGNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YSk7CiAgICBfaW5saW5lRGF0YUNhY2hlID8/PSBuZXcgSW5saW5lRGF0YUNhY2hlKAogICAgICAgIGVuYWJsZVVzZXJBc3NlcnRpb25zOiBfb3B0aW9ucy5lbmFibGVVc2VyQXNzZXJ0aW9ucywKICAgICAgICBvbWl0SW1wbGljaXRDYXN0czogX29wdGlvbnMub21pdEltcGxpY2l0Q2hlY2tzKTsKICAgIHJldHVybiBfdGFzay5tZWFzdXJlKCgpIHsKICAgICAgS2VybmVsU3NhR3JhcGhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgS2VybmVsU3NhR3JhcGhCdWlsZGVyKAogICAgICAgICAgX29wdGlvbnMsCiAgICAgICAgICBfcmVwb3J0ZXIsCiAgICAgICAgICBtZW1iZXIsCiAgICAgICAgICBfZWxlbWVudE1hcC5nZXRNZW1iZXJUaGlzVHlwZShtZW1iZXIpLAogICAgICAgICAgX2R1bXBJbmZvVGFzaywKICAgICAgICAgIF9lbGVtZW50TWFwLAogICAgICAgICAgcmVzdWx0cywKICAgICAgICAgIGNsb3NlZFdvcmxkLAogICAgICAgICAgcmVnaXN0cnksCiAgICAgICAgICBuYW1lciwKICAgICAgICAgIGVtaXR0ZXIsCiAgICAgICAgICBjb2RlZ2VuLnRyYWNlciwKICAgICAgICAgIGNvZGVnZW4ucnRpRW5jb2RlciwKICAgICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5LAogICAgICAgICAgX2lubGluZUNhY2hlLAogICAgICAgICAgX2lubGluZURhdGFDYWNoZSk7CiAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CiAgICB9KTsKICB9Cn0KCmNsYXNzIEtlcm5lbFRvVHlwZUluZmVyZW5jZU1hcEltcGwgaW1wbGVtZW50cyBLZXJuZWxUb1R5cGVJbmZlcmVuY2VNYXAgewogIGZpbmFsIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIF9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzOwogIEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQgX3RhcmdldFJlc3VsdHM7CgogIEtlcm5lbFRvVHlwZUluZmVyZW5jZU1hcEltcGwoCiAgICAgIE1lbWJlckVudGl0eSB0YXJnZXQsIHRoaXMuX2dsb2JhbEluZmVyZW5jZVJlc3VsdHMpIHsKICAgIF90YXJnZXRSZXN1bHRzID0gX3Jlc3VsdE9mKHRhcmdldCk7CiAgfQoKICBHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0IF9yZXN1bHRPZihNZW1iZXJFbnRpdHkgZSkgPT4KICAgICAgX2dsb2JhbEluZmVyZW5jZVJlc3VsdHMKICAgICAgICAgIC5yZXN1bHRPZk1lbWJlcihlIGlzIENvbnN0cnVjdG9yQm9keUVudGl0eSA/IGUuY29uc3RydWN0b3IgOiBlKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBnZXRSZXR1cm5UeXBlT2YoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgIHJldHVybiBBYnN0cmFjdFZhbHVlRmFjdG9yeS5pbmZlcnJlZFJldHVyblR5cGVGb3JFbGVtZW50KAogICAgICAgIGZ1bmN0aW9uLCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyVHlwZU9mSW52b2NhdGlvbigKICAgICAgaXIuTWV0aG9kSW52b2NhdGlvbiBub2RlLCBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4pIHsKICAgIHJldHVybiBfdGFyZ2V0UmVzdWx0cy50eXBlT2ZTZW5kKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGVPZkdldChpci5Qcm9wZXJ0eUdldCBub2RlKSB7CiAgICByZXR1cm4gX3RhcmdldFJlc3VsdHMudHlwZU9mU2VuZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXJUeXBlT2ZEaXJlY3RHZXQoaXIuRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgcmV0dXJuIF90YXJnZXRSZXN1bHRzLnR5cGVPZlNlbmQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyVHlwZU9mU2V0KAogICAgICBpci5Qcm9wZXJ0eVNldCBub2RlLCBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4pIHsKICAgIHJldHVybiBfdGFyZ2V0UmVzdWx0cy50eXBlT2ZTZW5kKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZMaXN0TGl0ZXJhbCgKICAgICAgaXIuTGlzdExpdGVyYWwgbGlzdExpdGVyYWwsIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbikgewogICAgcmV0dXJuIF9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzLnR5cGVPZkxpc3RMaXRlcmFsKGxpc3RMaXRlcmFsKSA/PwogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yKGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBfdGFyZ2V0UmVzdWx0cy50eXBlT2ZJdGVyYXRvcihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JDdXJyZW50KGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBfdGFyZ2V0UmVzdWx0cy50eXBlT2ZJdGVyYXRvckN1cnJlbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yTW92ZU5leHQoaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIF90YXJnZXRSZXN1bHRzLnR5cGVPZkl0ZXJhdG9yTW92ZU5leHQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSnNJbmRleGFibGVJdGVyYXRvcigKICAgICAgaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSwgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKSB7CiAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPSB0eXBlT2ZJdGVyYXRvcihub2RlKTsKICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmlzSnNJbmRleGFibGVBbmRJdGVyYWJsZShtYXNrKS5pc0RlZmluaXRlbHlUcnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBpbmZlcnJlZEluZGV4VHlwZShpci5Gb3JJblN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gQWJzdHJhY3RWYWx1ZUZhY3RvcnkuaW5mZXJyZWRSZXN1bHRUeXBlRm9yU2VsZWN0b3IoCiAgICAgICAgbmV3IFNlbGVjdG9yLmluZGV4KCksIHR5cGVPZkl0ZXJhdG9yKG5vZGUpLCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldEluZmVycmVkVHlwZU9mKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBBYnN0cmFjdFZhbHVlRmFjdG9yeS5pbmZlcnJlZFR5cGVGb3JNZW1iZXIoCiAgICAgICAgbWVtYmVyLCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGdldEluZmVycmVkVHlwZU9mUGFyYW1ldGVyKExvY2FsIHBhcmFtZXRlcikgewogICAgcmV0dXJuIEFic3RyYWN0VmFsdWVGYWN0b3J5LmluZmVycmVkVHlwZUZvclBhcmFtZXRlcigKICAgICAgICBwYXJhbWV0ZXIsIF9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgcmVzdWx0VHlwZU9mU2VsZWN0b3IoU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgcmV0dXJuIEFic3RyYWN0VmFsdWVGYWN0b3J5LmluZmVycmVkUmVzdWx0VHlwZUZvclNlbGVjdG9yKAogICAgICAgIHNlbGVjdG9yLCBtYXNrLCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVGcm9tTmF0aXZlQmVoYXZpb3IoCiAgICAgIE5hdGl2ZUJlaGF2aW9yIG5hdGl2ZUJlaGF2aW9yLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBBYnN0cmFjdFZhbHVlRmFjdG9yeS5mcm9tTmF0aXZlQmVoYXZpb3IobmF0aXZlQmVoYXZpb3IsIGNsb3NlZFdvcmxkKTsKICB9Cn0Kgm4ATk48ASMBKAEjGSEfHkobLhwkGi4qKDEvISclLC42JjArLiMrMy4rQz0eKSIhGi4lHBocGTEkKBgXGyAYIBYBNRwkAT8oQAEwARABNgEgAS8BJgE3ATs5JwEmQh5PDU0GRjEbHA4cJAQBDCE4HRMEAQw+AQwzAScBRgFRATsBPDJDBAEOIiBDGAQBPyhEDDAoSSsEATMMIyhFDDMoPx4EAQwjQUIsHB8dJSY+REVIFRocGypHPixEGQQBDEMqBAEMID9HN0ElHgFHQhEgKCQeATA0TBpPDU0sKwYBSCEZHiQsKCEQAVA4AUYUBAEMKRkgOR0nIENQJSQhHUJMQB1QSEUgDiUZRiUqEhkcMVFPGEglHyAcFSYhKyQmBAFGID0dN0cvMDIuSEA3OBsoJB8VJyE9Px4xSQE+FSgkESAiHR8QIBokBAEcFSAlISkoRSYgHkhGJE4rNiRQMTcxNAYfKwYgQjgGHklAOxgEAQwtLBwEAQxLQDNJRRgEAQwfUCEOGxwgOhQkBAEMTUEEAQwlS08EAQwxRkYkRAQBDExOJkQeMhlIOREGGQQCAUAsIygkKgFJSAEMMShFQwQCAS8sIygkKgweARkdGRwaHRUBDBYqTwQCATwvHCImJCQ+ASQkAT5OAQwQGyAqHSAaIEsuPTkeQRQVEjEZFxMXFBETGh4mGB0eCAQCAUk8MgEgOygEAT8eSwEMOz4sBAEMKkssBAEMOSwEAQxFLAQBDCNGLAQBDCNNRSkEAQw5MAQBDEA3BAEMQTgEAQweSS9QBAEMPD9OBAEMOTcqBAEMPjotBAEMTj8yBAEMKEFRBAIBLnBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX21vZGVsL2pzX3N0cmF0ZWd5LmRhcnQ5c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMva2VybmVsL2tlcm5lbF9zdHJhdGVneS5kYXJ0wABD4y8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMua2VybmVsLmZyb250ZW5kX3N0cmF0ZWd5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vYmFja2VuZF9hcGkuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgVXJpczsKaW1wb3J0ICcuLi9jb21tb24vcmVzb2x1dGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vdGFza3MuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL3dvcmsuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbXBpbGVyLmRhcnQnOwppbXBvcnQgJy4uL2RlZmVycmVkX2xvYWQuZGFydCcgc2hvdyBEZWZlcnJlZExvYWRUYXNrOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VucXVldWUuZGFydCc7CmltcG9ydCAnLi4vZW52aXJvbm1lbnQuZGFydCcgYXMgZW52OwppbXBvcnQgJy4uL2Zyb250ZW5kX3N0cmF0ZWd5LmRhcnQnOwppbXBvcnQgJy4uL2lyL2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJy4uL2lyL2Nsb3N1cmUuZGFydCcgc2hvdyBDbG9zdXJlU2NvcGVNb2RlbDsKaW1wb3J0ICcuLi9pci9pbXBhY3QuZGFydCc7CmltcG9ydCAnLi4vaXIvbW9kdWxhci5kYXJ0JzsKaW1wb3J0ICcuLi9pci9zY29wZS5kYXJ0JyBzaG93IFNjb3BlTW9kZWw7CmltcG9ydCAnLi4vanNfYmFja2VuZC9hbm5vdGF0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2JhY2tlbmRfaW1wYWN0LmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYmFja2VuZF91c2FnZS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2N1c3RvbV9lbGVtZW50c19hbmFseXNpcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ZpZWxkX2FuYWx5c2lzLmRhcnQnIHNob3cgS0ZpZWxkQW5hbHlzaXM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbXBhY3RfdHJhbnNmb3JtZXIuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ub19zdWNoX21ldGhvZF9yZWdpc3RyeS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3Jlc29sdXRpb25fbGlzdGVuZXIuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ydW50aW1lX3R5cGVzX3Jlc29sdXRpb24uZGFydCc7CmltcG9ydCAnLi4va2VybmVsL2RhcnQyanNfdGFyZ2V0LmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9lbnF1ZXVlLmRhcnQnIHNob3cgTmF0aXZlUmVzb2x1dGlvbkVucXVldWVyOwppbXBvcnQgJy4uL25hdGl2ZS9yZXNvbHZlci5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9yZXNvbHV0aW9uX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydCc7CmltcG9ydCAnLi4vdXRpbC9lbnVtc2V0LmRhcnQnOwppbXBvcnQgJ2RlZmVycmVkX2xvYWQuZGFydCc7CmltcG9ydCAnZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnZWxlbWVudF9tYXBfaW1wbC5kYXJ0JzsKaW1wb3J0ICdsb2FkZXIuZGFydCc7CgovLy8gRnJvbnQgZW5kIHN0cmF0ZWd5IHRoYXQgbG9hZHMgJy5kaWxsJyBmaWxlcyBhbmQgYnVpbGRzIGEgcmVzb2x2ZWQgZWxlbWVudAovLy8gbW9kZWwgZnJvbSBrZXJuZWwgSVIgbm9kZXMuCmNsYXNzIEtlcm5lbEZyb250ZW5kU3RyYXRlZ3kgZXh0ZW5kcyBGcm9udGVuZFN0cmF0ZWd5IHsKICBmaW5hbCBOYXRpdmVCYXNpY0RhdGFCdWlsZGVySW1wbCBuYXRpdmVCYXNpY0RhdGFCdWlsZGVyID0KICAgICAgbmV3IE5hdGl2ZUJhc2ljRGF0YUJ1aWxkZXJJbXBsKCk7CiAgTmF0aXZlQmFzaWNEYXRhIF9uYXRpdmVCYXNpY0RhdGE7CiAgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIENvbXBpbGVyVGFzayBfY29tcGlsZXJUYXNrOwogIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgX2VsZW1lbnRNYXA7CiAgUnVudGltZVR5cGVzTmVlZEJ1aWxkZXIgX3J1bnRpbWVUeXBlc05lZWRCdWlsZGVyOwoKICBLZXJuZWxBbm5vdGF0aW9uUHJvY2Vzc29yIF9hbm5vdGF0aW9uUHJvY2Vzc29yOwoKICBmaW5hbCBNYXA8TWVtYmVyRW50aXR5LCBDbG9zdXJlU2NvcGVNb2RlbD4gY2xvc3VyZU1vZGVscyA9IHt9OwoKICBNb2R1bGFyU3RyYXRlZ3kgX21vZHVsYXJTdHJhdGVneTsKICBJckFubm90YXRpb25EYXRhIF9pckFubm90YXRpb25EYXRhOwoKICBOYXRpdmVEYXRhQnVpbGRlckltcGwgX25hdGl2ZURhdGFCdWlsZGVyOwogIE5hdGl2ZURhdGFCdWlsZGVyIGdldCBuYXRpdmVEYXRhQnVpbGRlciA9PiBfbmF0aXZlRGF0YUJ1aWxkZXI7CgogIEJhY2tlbmRVc2FnZUJ1aWxkZXIgX2JhY2tlbmRVc2FnZUJ1aWxkZXI7CgogIE5hdGl2ZVJlc29sdXRpb25FbnF1ZXVlciBfbmF0aXZlUmVzb2x1dGlvbkVucXVldWVyOwoKICAvLy8gUmVzb2x1dGlvbiBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIHRhYmxlIG9mIGludGVyY2VwdG9ycyBhbmQKICAvLy8gY29uc3RydWN0b3JzIGZvciBjdXN0b20gZWxlbWVudHMuCiAgQ3VzdG9tRWxlbWVudHNSZXNvbHV0aW9uQW5hbHlzaXMgX2N1c3RvbUVsZW1lbnRzUmVzb2x1dGlvbkFuYWx5c2lzOwoKICBLRmllbGRBbmFseXNpcyBfZmllbGRBbmFseXNpczsKCiAgLy8vIEJhY2tlbmQgdHJhbnNmb3JtYXRpb24gbWV0aG9kcyBmb3IgdGhlIHdvcmxkIGltcGFjdHMuCiAgSW1wYWN0VHJhbnNmb3JtZXIgaW1wYWN0VHJhbnNmb3JtZXI7CgogIEBvdmVycmlkZQogIE5vU3VjaE1ldGhvZFJlZ2lzdHJ5IG5vU3VjaE1ldGhvZFJlZ2lzdHJ5OwoKICBLZXJuZWxGcm9udGVuZFN0cmF0ZWd5KHRoaXMuX2NvbXBpbGVyVGFzaywgdGhpcy5fb3B0aW9ucywKICAgICAgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyLCBlbnYuRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIGFzc2VydChfY29tcGlsZXJUYXNrICE9IG51bGwpOwogICAgX2VsZW1lbnRNYXAgPQogICAgICAgIG5ldyBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsKHJlcG9ydGVyLCBlbnZpcm9ubWVudCwgdGhpcywgX29wdGlvbnMpOwogICAgX21vZHVsYXJTdHJhdGVneSA9IG5ldyBLZXJuZWxNb2R1bGFyU3RyYXRlZ3koX2NvbXBpbGVyVGFzaywgX2VsZW1lbnRNYXApOwogICAgX2JhY2tlbmRVc2FnZUJ1aWxkZXIgPSBuZXcgQmFja2VuZFVzYWdlQnVpbGRlckltcGwodGhpcyk7CiAgICBub1N1Y2hNZXRob2RSZWdpc3RyeSA9IG5ldyBOb1N1Y2hNZXRob2RSZWdpc3RyeUltcGwoCiAgICAgICAgY29tbW9uRWxlbWVudHMsIG5ldyBLZXJuZWxOb1N1Y2hNZXRob2RSZXNvbHZlcihfZWxlbWVudE1hcCkpOwogIH0KCiAgTmF0aXZlUmVzb2x1dGlvbkVucXVldWVyIGdldCBuYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXJGb3JUZXN0aW5nID0+CiAgICAgIF9uYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXI7CgogIEtGaWVsZEFuYWx5c2lzIGdldCBmaWVsZEFuYWx5c2lzRm9yVGVzdGluZyA9PiBfZmllbGRBbmFseXNpczsKCiAgQG92ZXJyaWRlCiAgdm9pZCBvblJlc29sdXRpb25TdGFydCgpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIHRoZSBjb21waWxlci5lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUKICAgIC8vIGNhbGxzLiBDdXJyZW50bHkgbmVlZGVkIHRvIGVuc3VyZSByZXNvbHV0aW9uIG9mIHRoZSBjbGFzc2VzIGZvciB2YXJpb3VzCiAgICAvLyBxdWVyaWVzIGluIG5hdGl2ZSBiZWhhdmlvciBjb21wdXRhdGlvbiwgaW5mZXJlbmNlIGFuZCBjb2RlZ2VuLgogICAgZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKGNvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcyk7CiAgICBlbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoY29tbW9uRWxlbWVudHMuanNFeHRlbmRhYmxlQXJyYXlDbGFzcyk7CgogICAgX3ZhbGlkYXRlSW50ZXJjZXB0b3JJbXBsZW1lbnRzQWxsT2JqZWN0TWV0aG9kcygKICAgICAgICBjb21tb25FbGVtZW50cy5qc0ludGVyY2VwdG9yQ2xhc3MpOwogICAgLy8gVGhlIG51bGwtaW50ZXJjZXB0b3IgbXVzdCBhbHNvIGltcGxlbWVudCAqYWxsKiBtZXRob2RzLgogICAgX3ZhbGlkYXRlSW50ZXJjZXB0b3JJbXBsZW1lbnRzQWxsT2JqZWN0TWV0aG9kcyhjb21tb25FbGVtZW50cy5qc051bGxDbGFzcyk7CiAgfQoKICB2b2lkIF92YWxpZGF0ZUludGVyY2VwdG9ySW1wbGVtZW50c0FsbE9iamVjdE1ldGhvZHMoCiAgICAgIENsYXNzRW50aXR5IGludGVyY2VwdG9yQ2xhc3MpIHsKICAgIGlmIChpbnRlcmNlcHRvckNsYXNzID09IG51bGwpIHJldHVybjsKICAgIENsYXNzRW50aXR5IG9iamVjdENsYXNzID0gY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3M7CiAgICBlbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaENsYXNzTWVtYmVyKG9iamVjdENsYXNzLAogICAgICAgIChfLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgIE1lbWJlckVudGl0eSBpbnRlcmNlcHRvck1lbWJlciA9IGVsZW1lbnRFbnZpcm9ubWVudAogICAgICAgICAgLmxvb2t1cExvY2FsQ2xhc3NNZW1iZXIoaW50ZXJjZXB0b3JDbGFzcywgbWVtYmVyLm5hbWUpOwogICAgICAvLyBJbnRlcmNlcHRvcnMgbXVzdCBvdmVycmlkZSBhbGwgT2JqZWN0IG1ldGhvZHMgZHVlIHRvIGNhbGxpbmcgY29udmVudGlvbgogICAgICAvLyBkaWZmZXJlbmNlcy4KICAgICAgYXNzZXJ0KAogICAgICAgICAgaW50ZXJjZXB0b3JNZW1iZXIuZW5jbG9zaW5nQ2xhc3MgPT0gaW50ZXJjZXB0b3JDbGFzcywKICAgICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICAgIGludGVyY2VwdG9yTWVtYmVyLAogICAgICAgICAgICAgICJNZW1iZXIgJHttZW1iZXIubmFtZX0gbm90IG92ZXJyaWRkZW4gaW4gJHtpbnRlcmNlcHRvckNsYXNzfS4gIgogICAgICAgICAgICAgICJGb3VuZCAkaW50ZXJjZXB0b3JNZW1iZXIgZnJvbSAiCiAgICAgICAgICAgICAgIiR7aW50ZXJjZXB0b3JNZW1iZXIuZW5jbG9zaW5nQ2xhc3N9LiIpKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgUmVzb2x1dGlvbkVucXVldWVyIGNyZWF0ZVJlc29sdXRpb25FbnF1ZXVlcigKICAgICAgQ29tcGlsZXJUYXNrIHRhc2ssIENvbXBpbGVyIGNvbXBpbGVyKSB7CiAgICBSdW50aW1lVHlwZXNOZWVkQnVpbGRlciBydGlOZWVkQnVpbGRlciA9IF9jcmVhdGVSdW50aW1lVHlwZXNOZWVkQnVpbGRlcigpOwogICAgQmFja2VuZEltcGFjdHMgaW1wYWN0cyA9CiAgICAgICAgbmV3IEJhY2tlbmRJbXBhY3RzKGNvbW1vbkVsZW1lbnRzLCBjb21waWxlci5vcHRpb25zLmV4cGVyaW1lbnROZXdSdGkpOwogICAgX25hdGl2ZVJlc29sdXRpb25FbnF1ZXVlciA9IG5ldyBOYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXIoCiAgICAgICAgY29tcGlsZXIub3B0aW9ucywKICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgY29tbW9uRWxlbWVudHMsCiAgICAgICAgX2VsZW1lbnRNYXAudHlwZXMsCiAgICAgICAgbmV3IEJhc2VOYXRpdmVDbGFzc0ZpbmRlcihlbGVtZW50RW52aXJvbm1lbnQsIG5hdGl2ZUJhc2ljRGF0YSkpOwogICAgX25hdGl2ZURhdGFCdWlsZGVyID0gbmV3IE5hdGl2ZURhdGFCdWlsZGVySW1wbChuYXRpdmVCYXNpY0RhdGEpOwogICAgX2N1c3RvbUVsZW1lbnRzUmVzb2x1dGlvbkFuYWx5c2lzID0gbmV3IEN1c3RvbUVsZW1lbnRzUmVzb2x1dGlvbkFuYWx5c2lzKAogICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICBjb21tb25FbGVtZW50cywKICAgICAgICBuYXRpdmVCYXNpY0RhdGEsCiAgICAgICAgX2JhY2tlbmRVc2FnZUJ1aWxkZXIpOwogICAgX2ZpZWxkQW5hbHlzaXMgPSBuZXcgS0ZpZWxkQW5hbHlzaXModGhpcyk7CiAgICBDbGFzc1F1ZXJpZXMgY2xhc3NRdWVyaWVzID0gbmV3IEtlcm5lbENsYXNzUXVlcmllcyhlbGVtZW50TWFwKTsKICAgIENsYXNzSGllcmFyY2h5QnVpbGRlciBjbGFzc0hpZXJhcmNoeUJ1aWxkZXIgPQogICAgICAgIG5ldyBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIoY29tbW9uRWxlbWVudHMsIGNsYXNzUXVlcmllcyk7CiAgICBBbm5vdGF0aW9uc0RhdGFCdWlsZGVyIGFubm90YXRpb25zRGF0YUJ1aWxkZXIgPQogICAgICAgIG5ldyBBbm5vdGF0aW9uc0RhdGFCdWlsZGVyKCk7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIGlzIGEgaGFjay4gVGhlIGFubm90YXRpb24gZGF0YSBpcyBidWlsdCB3aGlsZQogICAgLy8gdXNpbmcgaXQuIFdpdGggQ0ZFIGNvbnN0YW50cyB0aGUgYW5ub3RhdGlvbnMgZGF0YSBjYW4gYmUgYnVpbHQgZnVsbHkKICAgIC8vIGJlZm9yZSBjcmVhdGluZyB0aGUgcmVzb2x1dGlvbiBlbnF1ZXVlci4KICAgIEFubm90YXRpb25zRGF0YSBhbm5vdGF0aW9uc0RhdGEgPSBuZXcgQW5ub3RhdGlvbnNEYXRhSW1wbCgKICAgICAgICBjb21waWxlci5vcHRpb25zLCBhbm5vdGF0aW9uc0RhdGFCdWlsZGVyLnByYWdtYUFubm90YXRpb25zKTsKICAgIGltcGFjdFRyYW5zZm9ybWVyID0gbmV3IEphdmFTY3JpcHRJbXBhY3RUcmFuc2Zvcm1lcigKICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgY29tbW9uRWxlbWVudHMsCiAgICAgICAgaW1wYWN0cywKICAgICAgICBuYXRpdmVCYXNpY0RhdGEsCiAgICAgICAgX25hdGl2ZVJlc29sdXRpb25FbnF1ZXVlciwKICAgICAgICBfYmFja2VuZFVzYWdlQnVpbGRlciwKICAgICAgICBfY3VzdG9tRWxlbWVudHNSZXNvbHV0aW9uQW5hbHlzaXMsCiAgICAgICAgcnRpTmVlZEJ1aWxkZXIsCiAgICAgICAgY2xhc3NIaWVyYXJjaHlCdWlsZGVyLAogICAgICAgIGFubm90YXRpb25zRGF0YSk7CiAgICBJbnRlcmNlcHRvckRhdGFCdWlsZGVyIGludGVyY2VwdG9yRGF0YUJ1aWxkZXIgPQogICAgICAgIG5ldyBJbnRlcmNlcHRvckRhdGFCdWlsZGVySW1wbCgKICAgICAgICAgICAgbmF0aXZlQmFzaWNEYXRhLCBlbGVtZW50RW52aXJvbm1lbnQsIGNvbW1vbkVsZW1lbnRzKTsKICAgIHJldHVybiBuZXcgUmVzb2x1dGlvbkVucXVldWVyKAogICAgICAgIHRhc2ssCiAgICAgICAgY29tcGlsZXIucmVwb3J0ZXIsCiAgICAgICAgbmV3IFJlc29sdXRpb25FbnF1ZXVlckxpc3RlbmVyKAogICAgICAgICAgICBjb21waWxlci5vcHRpb25zLAogICAgICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgICAgIGNvbW1vbkVsZW1lbnRzLAogICAgICAgICAgICBpbXBhY3RzLAogICAgICAgICAgICBuYXRpdmVCYXNpY0RhdGEsCiAgICAgICAgICAgIGludGVyY2VwdG9yRGF0YUJ1aWxkZXIsCiAgICAgICAgICAgIF9iYWNrZW5kVXNhZ2VCdWlsZGVyLAogICAgICAgICAgICBub1N1Y2hNZXRob2RSZWdpc3RyeSwKICAgICAgICAgICAgX2N1c3RvbUVsZW1lbnRzUmVzb2x1dGlvbkFuYWx5c2lzLAogICAgICAgICAgICBfbmF0aXZlUmVzb2x1dGlvbkVucXVldWVyLAogICAgICAgICAgICBfZmllbGRBbmFseXNpcywKICAgICAgICAgICAgY29tcGlsZXIuZGVmZXJyZWRMb2FkVGFzayksCiAgICAgICAgbmV3IFJlc29sdXRpb25Xb3JsZEJ1aWxkZXJJbXBsKAogICAgICAgICAgICBfb3B0aW9ucywKICAgICAgICAgICAgZWxlbWVudE1hcCwKICAgICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LAogICAgICAgICAgICBfZWxlbWVudE1hcC50eXBlcywKICAgICAgICAgICAgY29tbW9uRWxlbWVudHMsCiAgICAgICAgICAgIG5hdGl2ZUJhc2ljRGF0YSwKICAgICAgICAgICAgbmF0aXZlRGF0YUJ1aWxkZXIsCiAgICAgICAgICAgIGludGVyY2VwdG9yRGF0YUJ1aWxkZXIsCiAgICAgICAgICAgIF9iYWNrZW5kVXNhZ2VCdWlsZGVyLAogICAgICAgICAgICBydGlOZWVkQnVpbGRlciwKICAgICAgICAgICAgX2ZpZWxkQW5hbHlzaXMsCiAgICAgICAgICAgIF9uYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXIsCiAgICAgICAgICAgIG5vU3VjaE1ldGhvZFJlZ2lzdHJ5LAogICAgICAgICAgICBhbm5vdGF0aW9uc0RhdGFCdWlsZGVyLAogICAgICAgICAgICBjb25zdCBTdHJvbmdNb2RlV29ybGRTdHJhdGVneSgpLAogICAgICAgICAgICBjbGFzc0hpZXJhcmNoeUJ1aWxkZXIsCiAgICAgICAgICAgIGNsYXNzUXVlcmllcyksCiAgICAgICAgbmV3IEtlcm5lbFdvcmtJdGVtQnVpbGRlcigKICAgICAgICAgICAgX2NvbXBpbGVyVGFzaywKICAgICAgICAgICAgZWxlbWVudE1hcCwKICAgICAgICAgICAgbmF0aXZlQmFzaWNEYXRhLAogICAgICAgICAgICBuYXRpdmVEYXRhQnVpbGRlciwKICAgICAgICAgICAgYW5ub3RhdGlvbnNEYXRhQnVpbGRlciwKICAgICAgICAgICAgaW1wYWN0VHJhbnNmb3JtZXIsCiAgICAgICAgICAgIGNsb3N1cmVNb2RlbHMsCiAgICAgICAgICAgIGNvbXBpbGVyLmltcGFjdENhY2hlLAogICAgICAgICAgICBfZmllbGRBbmFseXNpcywKICAgICAgICAgICAgX21vZHVsYXJTdHJhdGVneSwKICAgICAgICAgICAgX2lyQW5ub3RhdGlvbkRhdGEpLAogICAgICAgIGFubm90YXRpb25zRGF0YSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG9uUmVzb2x1dGlvbkVuZCgpIHsKICAgIGFzc2VydChfYW5ub3RhdGlvblByb2Nlc3NvciAhPSBudWxsLAogICAgICAgICJBbm5vdGF0aW9uUHJvY2Vzc29yIGhhcyBub3QgYmVlbiBjcmVhdGVkLiIpOwogICAgX2Fubm90YXRpb25Qcm9jZXNzb3IucHJvY2Vzc0pzSW50ZXJvcEFubm90YXRpb25zKAogICAgICAgIG5hdGl2ZUJhc2ljRGF0YSwgbmF0aXZlRGF0YUJ1aWxkZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgTmF0aXZlQmFzaWNEYXRhIGdldCBuYXRpdmVCYXNpY0RhdGEgewogICAgaWYgKF9uYXRpdmVCYXNpY0RhdGEgPT0gbnVsbCkgewogICAgICBfbmF0aXZlQmFzaWNEYXRhID0gbmF0aXZlQmFzaWNEYXRhQnVpbGRlci5jbG9zZShlbGVtZW50RW52aXJvbm1lbnQpOwogICAgICBhc3NlcnQoCiAgICAgICAgICBfbmF0aXZlQmFzaWNEYXRhICE9IG51bGwsCiAgICAgICAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAgICAgIk5hdGl2ZUJhc2ljRGF0YSBoYXMgbm90IGJlZW4gY29tcHV0ZWQgeWV0LiIpKTsKICAgIH0KICAgIHJldHVybiBfbmF0aXZlQmFzaWNEYXRhOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckxvYWRlZExpYnJhcmllcyhLZXJuZWxSZXN1bHQga2VybmVsUmVzdWx0KSB7CiAgICBfZWxlbWVudE1hcC5hZGRDb21wb25lbnQoa2VybmVsUmVzdWx0LmNvbXBvbmVudCk7CiAgICBpZiAoX29wdGlvbnMudXNlQ0ZFQ29uc3RhbnRzKSB7CiAgICAgIF9pckFubm90YXRpb25EYXRhID0gcHJvY2Vzc0Fubm90YXRpb25zKG5ldyBNb2R1bGFyQ29yZSgKICAgICAgICAgIGtlcm5lbFJlc3VsdC5jb21wb25lbnQsIF9lbGVtZW50TWFwLmNvbnN0YW50RXZhbHVhdG9yKSk7CiAgICB9CiAgICBfYW5ub3RhdGlvblByb2Nlc3NvciA9IG5ldyBLZXJuZWxBbm5vdGF0aW9uUHJvY2Vzc29yKAogICAgICAgIGVsZW1lbnRNYXAsIG5hdGl2ZUJhc2ljRGF0YUJ1aWxkZXIsIF9pckFubm90YXRpb25EYXRhKTsKICAgIGZvciAoVXJpIHVyaSBpbiBrZXJuZWxSZXN1bHQubGlicmFyaWVzKSB7CiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSA9IGVsZW1lbnRFbnZpcm9ubWVudC5sb29rdXBMaWJyYXJ5KHVyaSk7CiAgICAgIGlmIChtYXliZUVuYWJsZU5hdGl2ZShsaWJyYXJ5LmNhbm9uaWNhbFVyaSkpIHsKICAgICAgICBfYW5ub3RhdGlvblByb2Nlc3Nvci5leHRyYWN0TmF0aXZlQW5ub3RhdGlvbnMobGlicmFyeSk7CiAgICAgIH0KICAgICAgX2Fubm90YXRpb25Qcm9jZXNzb3IuZXh0cmFjdEpzSW50ZXJvcEFubm90YXRpb25zKGxpYnJhcnkpOwogICAgICBpZiAodXJpID09IFVyaXMuZGFydF9odG1sKSB7CiAgICAgICAgX2JhY2tlbmRVc2FnZUJ1aWxkZXIucmVnaXN0ZXJIdG1sSXNMb2FkZWQoKTsKICAgICAgfQogICAgfQogIH0KCiAgSXJBbm5vdGF0aW9uRGF0YSBnZXQgaXJBbm5vdGF0aW9uRGF0YUZvclRlc3RpbmcgPT4gX2lyQW5ub3RhdGlvbkRhdGE7CgogIE1vZHVsYXJTdHJhdGVneSBnZXQgbW9kdWxhclN0cmF0ZWd5Rm9yVGVzdGluZyA9PiBfbW9kdWxhclN0cmF0ZWd5OwoKICBAb3ZlcnJpZGUKICBFbGVtZW50RW52aXJvbm1lbnQgZ2V0IGVsZW1lbnRFbnZpcm9ubWVudCA9PiBfZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQ7CgogIEBvdmVycmlkZQogIENvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50cyA9PiBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgS2VybmVsVG9FbGVtZW50TWFwIGdldCBlbGVtZW50TWFwID0+IF9lbGVtZW50TWFwOwoKICBAb3ZlcnJpZGUKICBEZWZlcnJlZExvYWRUYXNrIGNyZWF0ZURlZmVycmVkTG9hZFRhc2soQ29tcGlsZXIgY29tcGlsZXIpID0+CiAgICAgIG5ldyBLZXJuZWxEZWZlcnJlZExvYWRUYXNrKGNvbXBpbGVyLCBfZWxlbWVudE1hcCk7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGNvbXB1dGVNYWluKFdvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyKSB7CiAgICByZXR1cm4gZWxlbWVudEVudmlyb25tZW50Lm1haW5GdW5jdGlvbjsKICB9CgogIFJ1bnRpbWVUeXBlc05lZWRCdWlsZGVyIF9jcmVhdGVSdW50aW1lVHlwZXNOZWVkQnVpbGRlcigpIHsKICAgIHJldHVybiBfcnVudGltZVR5cGVzTmVlZEJ1aWxkZXIgPz89IF9vcHRpb25zLmRpc2FibGVSdGlPcHRpbWl6YXRpb24KICAgICAgICA/IGNvbnN0IFRyaXZpYWxSdW50aW1lVHlwZXNOZWVkQnVpbGRlcigpCiAgICAgICAgOiBuZXcgUnVudGltZVR5cGVzTmVlZEJ1aWxkZXJJbXBsKGVsZW1lbnRFbnZpcm9ubWVudCk7CiAgfQoKICBSdW50aW1lVHlwZXNOZWVkQnVpbGRlciBnZXQgcnVudGltZVR5cGVzTmVlZEJ1aWxkZXJGb3JUZXN0aW5nID0+CiAgICAgIF9ydW50aW1lVHlwZXNOZWVkQnVpbGRlcjsKCiAgQG92ZXJyaWRlCiAgU291cmNlU3BhbiBzcGFuRnJvbVNwYW5uYWJsZShTcGFubmFibGUgc3Bhbm5hYmxlLCBFbnRpdHkgY3VycmVudEVsZW1lbnQpIHsKICAgIHJldHVybiBfZWxlbWVudE1hcC5nZXRTb3VyY2VTcGFuKHNwYW5uYWJsZSwgY3VycmVudEVsZW1lbnQpOwogIH0KfQoKY2xhc3MgS2VybmVsV29ya0l0ZW1CdWlsZGVyIGltcGxlbWVudHMgV29ya0l0ZW1CdWlsZGVyIHsKICBmaW5hbCBDb21waWxlclRhc2sgX2NvbXBpbGVyVGFzazsKICBmaW5hbCBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIF9lbGVtZW50TWFwOwogIGZpbmFsIEltcGFjdFRyYW5zZm9ybWVyIF9pbXBhY3RUcmFuc2Zvcm1lcjsKICBmaW5hbCBOYXRpdmVNZW1iZXJSZXNvbHZlciBfbmF0aXZlTWVtYmVyUmVzb2x2ZXI7CiAgZmluYWwgQW5ub3RhdGlvbnNEYXRhQnVpbGRlciBfYW5ub3RhdGlvbnNEYXRhQnVpbGRlcjsKICBmaW5hbCBNYXA8TWVtYmVyRW50aXR5LCBDbG9zdXJlU2NvcGVNb2RlbD4gX2Nsb3N1cmVNb2RlbHM7CiAgZmluYWwgTWFwPEVudGl0eSwgV29ybGRJbXBhY3Q+IF9pbXBhY3RDYWNoZTsKICBmaW5hbCBLRmllbGRBbmFseXNpcyBfZmllbGRBbmFseXNpczsKICBmaW5hbCBNb2R1bGFyU3RyYXRlZ3kgX21vZHVsYXJTdHJhdGVneTsKICBmaW5hbCBJckFubm90YXRpb25EYXRhIF9pckFubm90YXRpb25EYXRhOwoKICBLZXJuZWxXb3JrSXRlbUJ1aWxkZXIoCiAgICAgIHRoaXMuX2NvbXBpbGVyVGFzaywKICAgICAgdGhpcy5fZWxlbWVudE1hcCwKICAgICAgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZUJhc2ljRGF0YSwKICAgICAgTmF0aXZlRGF0YUJ1aWxkZXIgbmF0aXZlRGF0YUJ1aWxkZXIsCiAgICAgIHRoaXMuX2Fubm90YXRpb25zRGF0YUJ1aWxkZXIsCiAgICAgIHRoaXMuX2ltcGFjdFRyYW5zZm9ybWVyLAogICAgICB0aGlzLl9jbG9zdXJlTW9kZWxzLAogICAgICB0aGlzLl9pbXBhY3RDYWNoZSwKICAgICAgdGhpcy5fZmllbGRBbmFseXNpcywKICAgICAgdGhpcy5fbW9kdWxhclN0cmF0ZWd5LAogICAgICB0aGlzLl9pckFubm90YXRpb25EYXRhKQogICAgICA6IF9uYXRpdmVNZW1iZXJSZXNvbHZlciA9IG5ldyBLZXJuZWxOYXRpdmVNZW1iZXJSZXNvbHZlcigKICAgICAgICAgICAgX2VsZW1lbnRNYXAsIG5hdGl2ZUJhc2ljRGF0YSwgbmF0aXZlRGF0YUJ1aWxkZXIpOwoKICBAb3ZlcnJpZGUKICBXb3JrSXRlbSBjcmVhdGVXb3JrSXRlbShNZW1iZXJFbnRpdHkgZW50aXR5KSB7CiAgICByZXR1cm4gbmV3IEtlcm5lbFdvcmtJdGVtKAogICAgICAgIF9jb21waWxlclRhc2ssCiAgICAgICAgX2VsZW1lbnRNYXAsCiAgICAgICAgX2ltcGFjdFRyYW5zZm9ybWVyLAogICAgICAgIF9uYXRpdmVNZW1iZXJSZXNvbHZlciwKICAgICAgICBfYW5ub3RhdGlvbnNEYXRhQnVpbGRlciwKICAgICAgICBlbnRpdHksCiAgICAgICAgX2Nsb3N1cmVNb2RlbHMsCiAgICAgICAgX2ltcGFjdENhY2hlLAogICAgICAgIF9maWVsZEFuYWx5c2lzLAogICAgICAgIF9tb2R1bGFyU3RyYXRlZ3ksCiAgICAgICAgX2lyQW5ub3RhdGlvbkRhdGEpOwogIH0KfQoKY2xhc3MgS2VybmVsV29ya0l0ZW0gaW1wbGVtZW50cyBXb3JrSXRlbSB7CiAgZmluYWwgQ29tcGlsZXJUYXNrIF9jb21waWxlclRhc2s7CiAgZmluYWwgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBfZWxlbWVudE1hcDsKICBmaW5hbCBJbXBhY3RUcmFuc2Zvcm1lciBfaW1wYWN0VHJhbnNmb3JtZXI7CiAgZmluYWwgTmF0aXZlTWVtYmVyUmVzb2x2ZXIgX25hdGl2ZU1lbWJlclJlc29sdmVyOwogIGZpbmFsIEFubm90YXRpb25zRGF0YUJ1aWxkZXIgX2Fubm90YXRpb25zRGF0YUJ1aWxkZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyRW50aXR5IGVsZW1lbnQ7CiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgQ2xvc3VyZVNjb3BlTW9kZWw+IF9jbG9zdXJlTW9kZWxzOwogIGZpbmFsIE1hcDxFbnRpdHksIFdvcmxkSW1wYWN0PiBfaW1wYWN0Q2FjaGU7CiAgZmluYWwgS0ZpZWxkQW5hbHlzaXMgX2ZpZWxkQW5hbHlzaXM7CiAgZmluYWwgTW9kdWxhclN0cmF0ZWd5IF9tb2R1bGFyU3RyYXRlZ3k7CiAgZmluYWwgSXJBbm5vdGF0aW9uRGF0YSBfaXJBbm5vdGF0aW9uRGF0YTsKCiAgS2VybmVsV29ya0l0ZW0oCiAgICAgIHRoaXMuX2NvbXBpbGVyVGFzaywKICAgICAgdGhpcy5fZWxlbWVudE1hcCwKICAgICAgdGhpcy5faW1wYWN0VHJhbnNmb3JtZXIsCiAgICAgIHRoaXMuX25hdGl2ZU1lbWJlclJlc29sdmVyLAogICAgICB0aGlzLl9hbm5vdGF0aW9uc0RhdGFCdWlsZGVyLAogICAgICB0aGlzLmVsZW1lbnQsCiAgICAgIHRoaXMuX2Nsb3N1cmVNb2RlbHMsCiAgICAgIHRoaXMuX2ltcGFjdENhY2hlLAogICAgICB0aGlzLl9maWVsZEFuYWx5c2lzLAogICAgICB0aGlzLl9tb2R1bGFyU3RyYXRlZ3ksCiAgICAgIHRoaXMuX2lyQW5ub3RhdGlvbkRhdGEpOwoKICBAb3ZlcnJpZGUKICBXb3JsZEltcGFjdCBydW4oKSB7CiAgICByZXR1cm4gX2NvbXBpbGVyVGFzay5tZWFzdXJlKCgpIHsKICAgICAgaXIuTWVtYmVyIG5vZGUgPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJOb2RlKGVsZW1lbnQpOwogICAgICBfbmF0aXZlTWVtYmVyUmVzb2x2ZXIucmVzb2x2ZU5hdGl2ZU1lbWJlcihub2RlLCBfaXJBbm5vdGF0aW9uRGF0YSk7CgogICAgICBMaXN0PFByYWdtYUFubm90YXRpb25EYXRhPiBwcmFnbWFBbm5vdGF0aW9uRGF0YSA9CiAgICAgICAgICBfbW9kdWxhclN0cmF0ZWd5LmdldFByYWdtYUFubm90YXRpb25EYXRhKG5vZGUpOwoKICAgICAgRW51bVNldDxQcmFnbWFBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IHByb2Nlc3NNZW1iZXJBbm5vdGF0aW9ucygKICAgICAgICAgIF9lbGVtZW50TWFwLm9wdGlvbnMsCiAgICAgICAgICBfZWxlbWVudE1hcC5yZXBvcnRlciwKICAgICAgICAgIF9lbGVtZW50TWFwLmdldE1lbWJlck5vZGUoZWxlbWVudCksCiAgICAgICAgICBwcmFnbWFBbm5vdGF0aW9uRGF0YSk7CiAgICAgIF9hbm5vdGF0aW9uc0RhdGFCdWlsZGVyLnJlZ2lzdGVyUHJhZ21hQW5ub3RhdGlvbnMoZWxlbWVudCwgYW5ub3RhdGlvbnMpOwoKICAgICAgTW9kdWxhck1lbWJlckRhdGEgbW9kdWxhck1lbWJlckRhdGEgPQogICAgICAgICAgX21vZHVsYXJTdHJhdGVneS5nZXRNb2R1bGFyTWVtYmVyRGF0YShub2RlLCBhbm5vdGF0aW9ucyk7CiAgICAgIFNjb3BlTW9kZWwgc2NvcGVNb2RlbCA9IG1vZHVsYXJNZW1iZXJEYXRhLnNjb3BlTW9kZWw7CiAgICAgIGlmIChzY29wZU1vZGVsLmNsb3N1cmVTY29wZU1vZGVsICE9IG51bGwpIHsKICAgICAgICBfY2xvc3VyZU1vZGVsc1tlbGVtZW50XSA9IHNjb3BlTW9kZWwuY2xvc3VyZVNjb3BlTW9kZWw7CiAgICAgIH0KICAgICAgaWYgKGVsZW1lbnQuaXNGaWVsZCAmJiAhZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgX2ZpZWxkQW5hbHlzaXMucmVnaXN0ZXJTdGF0aWNGaWVsZCgKICAgICAgICAgICAgZWxlbWVudCwgc2NvcGVNb2RlbC5pbml0aWFsaXplckNvbXBsZXhpdHkpOwogICAgICB9CiAgICAgIEltcGFjdEJ1aWxkZXJEYXRhIGltcGFjdEJ1aWxkZXJEYXRhID0gbW9kdWxhck1lbWJlckRhdGEuaW1wYWN0QnVpbGRlckRhdGE7CiAgICAgIHJldHVybiBfY29tcGlsZXJUYXNrLm1lYXN1cmVTdWJ0YXNrKCd3b3JsZEltcGFjdCcsICgpIHsKICAgICAgICBSZXNvbHV0aW9uSW1wYWN0IGltcGFjdCA9IF9lbGVtZW50TWFwLmNvbXB1dGVXb3JsZEltcGFjdCgKICAgICAgICAgICAgZWxlbWVudCwKICAgICAgICAgICAgc2NvcGVNb2RlbC52YXJpYWJsZVNjb3BlTW9kZWwsCiAgICAgICAgICAgIG5ldyBTZXQ8UHJhZ21hQW5ub3RhdGlvbj4uZnJvbSgKICAgICAgICAgICAgICAgIGFubm90YXRpb25zLml0ZXJhYmxlKFByYWdtYUFubm90YXRpb24udmFsdWVzKSksCiAgICAgICAgICAgIGltcGFjdEJ1aWxkZXJEYXRhOiBpbXBhY3RCdWlsZGVyRGF0YSk7CiAgICAgICAgV29ybGRJbXBhY3Qgd29ybGRJbXBhY3QgPQogICAgICAgICAgICBfaW1wYWN0VHJhbnNmb3JtZXIudHJhbnNmb3JtUmVzb2x1dGlvbkltcGFjdChpbXBhY3QpOwogICAgICAgIGlmIChfaW1wYWN0Q2FjaGUgIT0gbnVsbCkgewogICAgICAgICAgX2ltcGFjdENhY2hlW2VsZW1lbnRdID0gd29ybGRJbXBhY3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiB3b3JsZEltcGFjdDsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdLZXJuZWxXb3JrSXRlbSgkZWxlbWVudCknOwp9CgovLy8gSWYgYHRydWVgIGtlcm5lbCBpbXBhY3RzIGFyZSBjb21wdXRlZCBhcyBbSW1wYWN0RGF0YV0gZGlyZWN0bHkgb24ga2VybmVsCi8vLyBhbmQgY29udmVydGVkIHRvIHRoZSBLIG1vZGVsIGFmdGVyd2FyZHMuIFRoaXMgaXMgYSBwcmUtc3RlcCB0byBtb2R1bGFyaXppbmcKLy8vIHRoZSB3b3JsZCBpbXBhY3QgY29tcHV0YXRpb24uCmJvb2wgdXNlSW1wYWN0RGF0YUZvclRlc3RpbmcgPSBmYWxzZTsKCmNsYXNzIEtlcm5lbE1vZHVsYXJTdHJhdGVneSBleHRlbmRzIE1vZHVsYXJTdHJhdGVneSB7CiAgZmluYWwgQ29tcGlsZXJUYXNrIF9jb21waWxlclRhc2s7CiAgZmluYWwgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBfZWxlbWVudE1hcDsKCiAgS2VybmVsTW9kdWxhclN0cmF0ZWd5KHRoaXMuX2NvbXBpbGVyVGFzaywgdGhpcy5fZWxlbWVudE1hcCk7CgogIEBvdmVycmlkZQogIExpc3Q8UHJhZ21hQW5ub3RhdGlvbkRhdGE+IGdldFByYWdtYUFubm90YXRpb25EYXRhKGlyLk1lbWJlciBub2RlKSB7CiAgICBpZiAoX2VsZW1lbnRNYXAub3B0aW9ucy51c2VDRkVDb25zdGFudHMpIHsKICAgICAgcmV0dXJuIGNvbXB1dGVQcmFnbWFBbm5vdGF0aW9uRGF0YUZyb21Jcihub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBjb21wdXRlUHJhZ21hQW5ub3RhdGlvbkRhdGEoX2VsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMsCiAgICAgICAgICBfZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQsIF9lbGVtZW50TWFwLmdldE1lbWJlcihub2RlKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBNb2R1bGFyTWVtYmVyRGF0YSBnZXRNb2R1bGFyTWVtYmVyRGF0YSgKICAgICAgaXIuTWVtYmVyIG5vZGUsIEVudW1TZXQ8UHJhZ21hQW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMpIHsKICAgIFNjb3BlTW9kZWwgc2NvcGVNb2RlbCA9IF9jb21waWxlclRhc2subWVhc3VyZVN1YnRhc2soJ2Nsb3N1cmVzJywKICAgICAgICAoKSA9PiBuZXcgU2NvcGVNb2RlbC5mcm9tKG5vZGUsIF9lbGVtZW50TWFwLmNvbnN0YW50RXZhbHVhdG9yKSk7CiAgICBJbXBhY3RCdWlsZGVyRGF0YSBpbXBhY3RCdWlsZGVyRGF0YTsKICAgIGlmICh1c2VJbXBhY3REYXRhRm9yVGVzdGluZykgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBbHdheXMgY3JlYXRlIGFuZCB1c2UgdGhlIFtJbXBhY3RCdWlsZGVyRGF0YV0uCiAgICAgIC8vIEN1cnJlbnRseSBpdCBpcyBhIGJpdCBoYWxmLWJha2VkIHNpbmNlIHdlIGNhbm5vdCBjb21wdXRlIGRhdGEgdGhhdAogICAgICAvLyBkZXBlbmQgb24gbWV0YWRhdGEsIHNvIHRoZXNlIHBhcnRzIG9mIHRoZSBpbXBhY3QgZGF0YSBuZWVkIHRvIGJlCiAgICAgIC8vIGNvbXB1dGVkIGR1cmluZyBjb252ZXJzaW9uIHRvIFtSZXNvbHV0aW9uSW1wYWN0XS4KICAgICAgaW1wYWN0QnVpbGRlckRhdGEgPSBfY29tcGlsZXJUYXNrLm1lYXN1cmVTdWJ0YXNrKCd3b3JsZEltcGFjdCcsICgpIHsKICAgICAgICBJbXBhY3RCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSW1wYWN0QnVpbGRlcihfZWxlbWVudE1hcC50eXBlRW52aXJvbm1lbnQsCiAgICAgICAgICAgIF9lbGVtZW50TWFwLmNsYXNzSGllcmFyY2h5LCBzY29wZU1vZGVsLnZhcmlhYmxlU2NvcGVNb2RlbCwKICAgICAgICAgICAgdXNlQXNzZXJ0czogX2VsZW1lbnRNYXAub3B0aW9ucy5lbmFibGVVc2VyQXNzZXJ0aW9ucywKICAgICAgICAgICAgaW5mZXJFZmZlY3RpdmVseUZpbmFsVmFyaWFibGVUeXBlczoKICAgICAgICAgICAgICAgICFhbm5vdGF0aW9ucy5jb250YWlucyhQcmFnbWFBbm5vdGF0aW9uLmRpc2FibGVGaW5hbCkpOwogICAgICAgIHJldHVybiBidWlsZGVyLmNvbXB1dGVJbXBhY3Qobm9kZSk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIG5ldyBNb2R1bGFyTWVtYmVyRGF0YShzY29wZU1vZGVsLCBpbXBhY3RCdWlsZGVyRGF0YSk7CiAgfQp9CoHYAE5OPAEqASgBGSUpJB8eIhs2JBolJCE0HB0rKSwrNkAwLik1MTYoPyIaKzQpKB8dGyAWAU4gODwoJBweJjQBMgFBASQmASxBASwBNgFCKEYBIQE8JwEMLQE8QiMSS04+OUYEAUUhAUABDB1OT0ZBSwE0LD9QBAE3Jio6NyM6QlEWDkAUIU4vOAgEAQwvLk8dTz4aHBgbSUVOHBgZHy9EMkE0Jk9MMD9FORwYERkjHisYHxo0KEIjDhsoHiAcFR0kIiIvJxwoKBYYIB8cHR8kIhwcJyIkLSMbIxsYHR8kHxsiHB4gGgQBDBspNjYtBAEMKCRLDiQqPgYdBAEMPDYkPkMGOkAuRTVACEEjNQgGBAFIAUUBDE8BDEMBNAEMQDkBDEEsBAE9SDE/BAFDIAEMTUEEAgE5JCwuNDg9LycqLAEZGhgnKyQfGxkbHR5APgEMMR8XFRwfIRAYFhgaHAQCASskLC40OAwePS8nKiwBEhoYHyIkFBsZGx0fAQwWJjtKATg6AUgfIC4hTwEsRDwyQAg6LDgIUT5CFSssQDMiQiQvChwKCAQBDDMCAU1QIiYBNiQsAT8BDEcvNg1FSAYEAQwqP0VJKSNNTEo7S09HQjBHLAoGQQQCATBwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwva2VybmVsX3N0cmF0ZWd5LmRhcnQwc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMva2VybmVsL2xvYWRlci5kYXJ0nEgvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmxpYnJhcnlfbG9hZGVyOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC91dGlscy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYmluYXJ5L2FzdF9mcm9tX2JpbmFyeS5kYXJ0JyBzaG93IEJpbmFyeUJ1aWxkZXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYmluYXJ5L2FzdF90b19iaW5hcnkuZGFydCcgc2hvdyBCaW5hcnlQcmludGVyOwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgYXMgZmU7CmltcG9ydCAncGFja2FnZTprZXJuZWwva2VybmVsLmRhcnQnIGhpZGUgTGlicmFyeURlcGVuZGVuY3ksIENvbWJpbmF0b3I7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCcgaGlkZSBEaWFnbm9zdGljUmVwb3J0ZXI7CgppbXBvcnQgJy4uLy4uL2NvbXBpbGVyX25ldy5kYXJ0JyBhcyBhcGk7CmltcG9ydCAnLi4vY29tbW9uL3Rhc2tzLmRhcnQnIHNob3cgQ29tcGlsZXJUYXNrLCBNZWFzdXJlcjsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL3NpbmtfYWRhcHRlci5kYXJ0JzsKCmltcG9ydCAnZnJvbnRfZW5kX2FkYXB0ZXIuZGFydCc7CmltcG9ydCAnZGFydDJqc190YXJnZXQuZGFydCcgc2hvdyBEYXJ0MmpzVGFyZ2V0OwoKLy8vIEEgdGFzayB0aGF0IHByb2R1Y2VzIHRoZSBrZXJuZWwgSVIgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFwcGxpY2F0aW9uLgovLy8KLy8vIEl0IHN1cHBvcnRzIGxvYWRpbmcgYm90aCAuZGFydCBzb3VyY2UgZmlsZXMgb3IgcHJlLWNvbXBpbGVkIC5kaWxsIGZpbGVzLgovLy8gV2hlbiBnaXZlbiAuZGFydCBzb3VyY2UgZmlsZXMsIGl0IGludm9rZXMgdGhlIGNvbW1vbiBmcm9udC1lbmQgKENGRSkKLy8vIHRvIHByb2R1Y2UgdGhlIGNvcnJlc3BvbmRpbmcga2VybmVsIElSIHJlcHJlc2VudGF0aW9uLgpjbGFzcyBLZXJuZWxMb2FkZXJUYXNrIGV4dGVuZHMgQ29tcGlsZXJUYXNrIHsKICBmaW5hbCBEaWFnbm9zdGljUmVwb3J0ZXIgX3JlcG9ydGVyOwoKICBmaW5hbCBhcGkuQ29tcGlsZXJJbnB1dCBfY29tcGlsZXJJbnB1dDsKICBmaW5hbCBhcGkuQ29tcGlsZXJPdXRwdXQgX2NvbXBpbGVyT3V0cHV0OwoKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CgogIC8vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBjb21waWxhdGlvbnMuCiAgZmUuSW5pdGlhbGl6ZWRDb21waWxlclN0YXRlIGluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZTsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiAjMzQ5NDIgaXMgZml4ZWQuCiAgLy8vIEZvcmNlIGluLW1lbW9yeSBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBvZiB0aGUgbG9hZGVkIGNvbXBvbmVudC4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIGZvciB0ZXN0aW5nLgogIGJvb2wgZm9yY2VTZXJpYWxpemF0aW9uID0gZmFsc2U7CgogIEtlcm5lbExvYWRlclRhc2sodGhpcy5fb3B0aW9ucywgdGhpcy5fY29tcGlsZXJJbnB1dCwgdGhpcy5fY29tcGlsZXJPdXRwdXQsCiAgICAgIHRoaXMuX3JlcG9ydGVyLCBNZWFzdXJlciBtZWFzdXJlcikKICAgICAgOiBpbml0aWFsaXplZENvbXBpbGVyU3RhdGUgPSBfb3B0aW9ucy5rZXJuZWxJbml0aWFsaXplZENvbXBpbGVyU3RhdGUsCiAgICAgICAgc3VwZXIobWVhc3VyZXIpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJ2tlcm5lbCBsb2FkZXInOwoKICAvLy8gTG9hZHMgYW4gZW50aXJlIEtlcm5lbCBbQ29tcG9uZW50XSBmcm9tIGEgZmlsZSBvbiBkaXNrLgogIEZ1dHVyZTxLZXJuZWxSZXN1bHQ+IGxvYWQoVXJpIHJlc29sdmVkVXJpKSB7CiAgICByZXR1cm4gbWVhc3VyZSgoKSBhc3luYyB7CiAgICAgIFN0cmluZyB0YXJnZXROYW1lID0KICAgICAgICAgIF9vcHRpb25zLmNvbXBpbGVGb3JTZXJ2ZXIgPyAiZGFydDJqc19zZXJ2ZXIiIDogImRhcnQyanMiOwogICAgICBTdHJpbmcgcGxhdGZvcm0gPSAnJHt0YXJnZXROYW1lfV9wbGF0Zm9ybS5kaWxsJzsKICAgICAgdmFyIGlzRGlsbCA9IHJlc29sdmVkVXJpLnBhdGguZW5kc1dpdGgoJy5kaWxsJyk7CiAgICAgIGlyLkNvbXBvbmVudCBjb21wb25lbnQ7CiAgICAgIGlmIChpc0RpbGwpIHsKICAgICAgICBjb21wb25lbnQgPSBuZXcgaXIuQ29tcG9uZW50KCk7CiAgICAgICAgRnV0dXJlPHZvaWQ+IHJlYWQoVXJpIHVyaSkgYXN5bmMgewogICAgICAgICAgYXBpLklucHV0IGlucHV0ID0gYXdhaXQgX2NvbXBpbGVySW5wdXQucmVhZEZyb21VcmkodXJpLAogICAgICAgICAgICAgIGlucHV0S2luZDogYXBpLklucHV0S2luZC5iaW5hcnkpOwogICAgICAgICAgbmV3IEJpbmFyeUJ1aWxkZXIoaW5wdXQuZGF0YSkucmVhZENvbXBvbmVudChjb21wb25lbnQpOwogICAgICAgIH0KCiAgICAgICAgYXdhaXQgcmVhZChyZXNvbHZlZFVyaSk7CiAgICAgICAgaWYgKF9vcHRpb25zLmRpbGxEZXBlbmRlbmNpZXMgIT0gbnVsbCkgewogICAgICAgICAgLy8gTW9kdWxhciBjb21waWxlcyBkbyBub3QgaW5jbHVkZSB0aGUgcGxhdGZvcm0gb24gdGhlIGlucHV0IGRpbGwKICAgICAgICAgIC8vIGVpdGhlci4KICAgICAgICAgIGlmIChfb3B0aW9ucy5wbGF0Zm9ybUJpbmFyaWVzICE9IG51bGwpIHsKICAgICAgICAgICAgYXdhaXQgcmVhZChfb3B0aW9ucy5wbGF0Zm9ybUJpbmFyaWVzLnJlc29sdmUocGxhdGZvcm0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAoVXJpIGRlcGVuZGVuY3kgaW4gX29wdGlvbnMuZGlsbERlcGVuZGVuY2llcykgewogICAgICAgICAgICBhd2FpdCByZWFkKGRlcGVuZGVuY3kpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVGhpcyBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgbnVsbCB3aGVuIGNyZWF0aW5nIGEgd2hvbGUtcHJvZ3JhbSAuZGlsbAogICAgICAgIC8vIGZpbGUsIGJ1dCBuZWVkcyB0byBiZSBjaGVja2VkIGZvciBtb2R1bGFyIGlucHV0cy4KICAgICAgICBpZiAoY29tcG9uZW50Lm1haW5NZXRob2QgPT0gbnVsbCkgewogICAgICAgICAgLy8gVE9ETyhzaWdtdW5kKTogbW92ZSB0aGlzIHNvIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGVycm9yIHRlbXBsYXRlCiAgICAgICAgICAvLyBmcm9tIHRoZSBDRkUuCiAgICAgICAgICBfcmVwb3J0ZXIucmVwb3J0RXJyb3IoX3JlcG9ydGVyLmNyZWF0ZU1lc3NhZ2UoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLkdFTkVSSUMsIHsndGV4dCc6ICJObyAnbWFpbicgbWV0aG9kIGZvdW5kLiJ9KSk7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgTGlzdDxVcmk+IGRlcGVuZGVuY2llcyA9IFtdOwogICAgICAgIGlmIChfb3B0aW9ucy5wbGF0Zm9ybUJpbmFyaWVzICE9IG51bGwpIHsKICAgICAgICAgIGRlcGVuZGVuY2llcy5hZGQoX29wdGlvbnMucGxhdGZvcm1CaW5hcmllcy5yZXNvbHZlKHBsYXRmb3JtKSk7CiAgICAgICAgfQogICAgICAgIGlmIChfb3B0aW9ucy5kaWxsRGVwZW5kZW5jaWVzICE9IG51bGwpIHsKICAgICAgICAgIGRlcGVuZGVuY2llcy5hZGRBbGwoX29wdGlvbnMuZGlsbERlcGVuZGVuY2llcyk7CiAgICAgICAgfQogICAgICAgIGluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSA9IGZlLmluaXRpYWxpemVDb21waWxlcigKICAgICAgICAgICAgaW5pdGlhbGl6ZWRDb21waWxlclN0YXRlLAogICAgICAgICAgICBuZXcgRGFydDJqc1RhcmdldCh0YXJnZXROYW1lLCBuZXcgVGFyZ2V0RmxhZ3MoKSksCiAgICAgICAgICAgIF9vcHRpb25zLmxpYnJhcmllc1NwZWNpZmljYXRpb25VcmksCiAgICAgICAgICAgIGRlcGVuZGVuY2llcywKICAgICAgICAgICAgX29wdGlvbnMucGFja2FnZUNvbmZpZywKICAgICAgICAgICAgZXhwZXJpbWVudGFsRmxhZ3M6IF9vcHRpb25zLmxhbmd1YWdlRXhwZXJpbWVudHMpOwogICAgICAgIGNvbXBvbmVudCA9IGF3YWl0IGZlLmNvbXBpbGUoCiAgICAgICAgICAgIGluaXRpYWxpemVkQ29tcGlsZXJTdGF0ZSwKICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgIG5ldyBDb21waWxlckZpbGVTeXN0ZW0oX2NvbXBpbGVySW5wdXQpLAogICAgICAgICAgICAoZSkgPT4gcmVwb3J0RnJvbnRFbmRNZXNzYWdlKF9yZXBvcnRlciwgZSksCiAgICAgICAgICAgIHJlc29sdmVkVXJpKTsKICAgICAgfQogICAgICBpZiAoY29tcG9uZW50ID09IG51bGwpIHJldHVybiBudWxsOwoKICAgICAgaWYgKF9vcHRpb25zLmNmZU9ubHkpIHsKICAgICAgICBtZWFzdXJlU3VidGFzaygnc2VyaWFsaXplIGRpbGwnLCAoKSB7CiAgICAgICAgICBfcmVwb3J0ZXIubG9nKCdXcml0aW5nIGRpbGwgdG8gJHtfb3B0aW9ucy5vdXRwdXRVcml9Jyk7CiAgICAgICAgICBhcGkuQmluYXJ5T3V0cHV0U2luayBkaWxsT3V0cHV0ID0KICAgICAgICAgICAgICBfY29tcGlsZXJPdXRwdXQuY3JlYXRlQmluYXJ5U2luayhfb3B0aW9ucy5vdXRwdXRVcmkpOwogICAgICAgICAgQmluYXJ5T3V0cHV0U2lua0FkYXB0ZXIgaXJTaW5rID0KICAgICAgICAgICAgICBuZXcgQmluYXJ5T3V0cHV0U2lua0FkYXB0ZXIoZGlsbE91dHB1dCk7CiAgICAgICAgICBCaW5hcnlQcmludGVyIHByaW50ZXIgPSBuZXcgQmluYXJ5UHJpbnRlcihpclNpbmspOwogICAgICAgICAgcHJpbnRlci53cml0ZUNvbXBvbmVudEZpbGUoY29tcG9uZW50KTsKICAgICAgICAgIGlyU2luay5jbG9zZSgpOwogICAgICAgIH0pOwogICAgICB9CgogICAgICBpZiAoZm9yY2VTZXJpYWxpemF0aW9uKSB7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiAjMzQ5NDIgaXMgZml4ZWQuCiAgICAgICAgTGlzdDxpbnQ+IGRhdGEgPSBzZXJpYWxpemVDb21wb25lbnQoY29tcG9uZW50KTsKICAgICAgICBjb21wb25lbnQgPSBuZXcgaXIuQ29tcG9uZW50KCk7CiAgICAgICAgbmV3IEJpbmFyeUJ1aWxkZXIoZGF0YSkucmVhZENvbXBvbmVudChjb21wb25lbnQpOwogICAgICB9CiAgICAgIHJldHVybiBfdG9SZXN1bHQoY29tcG9uZW50KTsKICAgIH0pOwogIH0KCiAgS2VybmVsUmVzdWx0IF90b1Jlc3VsdChpci5Db21wb25lbnQgY29tcG9uZW50KSB7CiAgICBVcmkgcm9vdExpYnJhcnlVcmkgPSBudWxsOwogICAgSXRlcmFibGU8aXIuTGlicmFyeT4gbGlicmFyaWVzID0gY29tcG9uZW50LmxpYnJhcmllczsKICAgIGlmIChjb21wb25lbnQubWFpbk1ldGhvZCAhPSBudWxsKSB7CiAgICAgIHZhciByb290ID0gY29tcG9uZW50Lm1haW5NZXRob2QuZW5jbG9zaW5nTGlicmFyeTsKICAgICAgcm9vdExpYnJhcnlVcmkgPSByb290LmltcG9ydFVyaTsKCiAgICAgIC8vIEZpbHRlciB1bnJlYWNoYWJsZSBsaWJyYXJpZXM6IFtDb21wb25lbnRdIHdhcyBidWlsdCBieSBsaW5raW5nIGluIHRoZQogICAgICAvLyBlbnRpcmUgU0RLIGxpYnJhcmllcywgbm90IGFsbCBvZiB0aGVtIGFyZSB1c2VkLiBXZSBpbmNsdWRlIGFueXRoaW5nCiAgICAgIC8vIHRoYXQgaXMgcmVhY2hhYmxlIGZyb20gYG1haW5gLiBOb3RlIHRoYXQgYWxsIGludGVybmFsIGxpYnJhcmllcyB0aGF0CiAgICAgIC8vIHRoZSBjb21waWxlciByZWxpZXMgb24gYXJlIHJlYWNoYWJsZSBmcm9tIGBkYXJ0OmNvcmVgLgogICAgICB2YXIgc2VlbiA9IG5ldyBTZXQ8TGlicmFyeT4oKTsKICAgICAgc2VhcmNoKGlyLkxpYnJhcnkgY3VycmVudCkgewogICAgICAgIGlmICghc2Vlbi5hZGQoY3VycmVudCkpIHJldHVybjsKICAgICAgICBmb3IgKGlyLkxpYnJhcnlEZXBlbmRlbmN5IGRlcCBpbiBjdXJyZW50LmRlcGVuZGVuY2llcykgewogICAgICAgICAgc2VhcmNoKGRlcC50YXJnZXRMaWJyYXJ5KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHNlYXJjaChyb290KTsKCiAgICAgIC8vIExpYnJhcmllcyBkZXBlbmRlbmNpZXMgZG8gbm90IHNob3cgaW1wbGljaXQgaW1wb3J0cyB0byBgZGFydDpjb3JlYC4KICAgICAgdmFyIGRhcnRDb3JlID0gY29tcG9uZW50LmxpYnJhcmllcy5maXJzdFdoZXJlKChsaWIpIHsKICAgICAgICByZXR1cm4gbGliLmltcG9ydFVyaS5zY2hlbWUgPT0gJ2RhcnQnICYmIGxpYi5pbXBvcnRVcmkucGF0aCA9PSAnY29yZSc7CiAgICAgIH0pOwogICAgICBzZWFyY2goZGFydENvcmUpOwoKICAgICAgbGlicmFyaWVzID0gbGlicmFyaWVzLndoZXJlKHNlZW4uY29udGFpbnMpOwogICAgfQogICAgcmV0dXJuIG5ldyBLZXJuZWxSZXN1bHQoY29tcG9uZW50LCByb290TGlicmFyeVVyaSwKICAgICAgICBsaWJyYXJpZXMubWFwKChsaWIpID0+IGxpYi5pbXBvcnRVcmkpLnRvTGlzdCgpKTsKICB9Cn0KCi8vLyBSZXN1bHQgb2YgaW52b2tpbmcgdGhlIENGRSB0byBwcm9kdWNlIHRoZSBrZXJuZWwgSVIuCmNsYXNzIEtlcm5lbFJlc3VsdCB7CiAgZmluYWwgaXIuQ29tcG9uZW50IGNvbXBvbmVudDsKCiAgLy8vIFRoZSBbVXJpXSBvZiB0aGUgcm9vdCBsaWJyYXJ5IGNvbnRhaW5pbmcgbWFpbi4KICBmaW5hbCBVcmkgcm9vdExpYnJhcnlVcmk7CgogIC8vLyBSZXR1cm5zIHRoZSBbVXJpXXMgb2YgYWxsIGxpYnJhcmllcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgdGhhdCBhcmUKICAvLy8gcmVhY2hhYmxlIGZyb20gdGhlIFtyb290TGlicmFyeVVyaV0uCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCBbY29tcG9uZW50XSBtYXkgY29udGFpbiBzb21lIGxpYnJhcmllcyB0aGF0IGFyZSBleGNsdWRlZCBoZXJlLgogIGZpbmFsIEl0ZXJhYmxlPFVyaT4gbGlicmFyaWVzOwoKICBLZXJuZWxSZXN1bHQodGhpcy5jb21wb25lbnQsIHRoaXMucm9vdExpYnJhcnlVcmksIHRoaXMubGlicmFyaWVzKSB7CiAgICBhc3NlcnQocm9vdExpYnJhcnlVcmkgIT0gbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAncm9vdD0kcm9vdExpYnJhcnlVcmksbGlicmFyaWVzPSR7bGlicmFyaWVzfSc7Cn0KgMQATk48ASABFQE4KEhGAUBIRQEpOxkaJAEhMQFKBE1JOy4mASosASIBKTgBPE0GICMBTSlMGQEMJgE+Lx4aRDc3HhQoK0IwQgoBITFMFTNFDD4kDAoBTz0sTRtPShcKDyUxSQoxOgo6Jj4wGiQ+JiYTNDgaCCoBHi5CLEQrNz0xGgwIASBCOCg6CCMIBAEzHzooOCcBT01OQCUjKEElCggBFAFNPE8KGAEyBjc5BAIBORUgATUcAUkrBk8hAUYkBAEMRgIBJ3BhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9sb2FkZXIuZGFydDVzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zZXJpYWxpemF0aW9uL3Rhc2suZGFydJ3yLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDphc3luYyc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2JpbmFyeS9hc3RfZnJvbV9iaW5hcnkuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYmluYXJ5L2FzdF90b19iaW5hcnkuZGFydCcgYXMgaXI7CmltcG9ydCAnLi4vLi4vY29tcGlsZXJfbmV3LmRhcnQnIGFzIGFwaTsKaW1wb3J0ICcuLi9iYWNrZW5kX3N0cmF0ZWd5LmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi9jb2RlZ2VuLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi90YXNrcy5kYXJ0JzsKaW1wb3J0ICcuLi9kaWFnbm9zdGljcy9kaWFnbm9zdGljX2xpc3RlbmVyLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2Vudmlyb25tZW50LmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2JhY2tlbmQuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbmZlcnJlZF9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2pzX3dvcmxkLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vdXRpbC9zaW5rX2FkYXB0ZXIuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCc7CmltcG9ydCAnc2VyaWFsaXphdGlvbi5kYXJ0JzsKCnZvaWQgc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMoCiAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLCBEYXRhU2luayBzaW5rKSB7CiAgSnNDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCA9IHJlc3VsdHMuY2xvc2VkV29ybGQ7CiAgSW5mZXJyZWREYXRhIGluZmVycmVkRGF0YSA9IHJlc3VsdHMuaW5mZXJyZWREYXRhOwogIGNsb3NlZFdvcmxkLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICBpbmZlcnJlZERhdGEud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogIHJlc3VsdHMud3JpdGVUb0RhdGFTaW5rKHNpbmssIGNsb3NlZFdvcmxkLmVsZW1lbnRNYXApOwogIHNpbmsuY2xvc2UoKTsKfQoKR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZGVzZXJpYWxpemVHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cygKICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyLAogICAgRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCiAgICBBYnN0cmFjdFZhbHVlU3RyYXRlZ3kgYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5LAogICAgaXIuQ29tcG9uZW50IGNvbXBvbmVudCwKICAgIERhdGFTb3VyY2Ugc291cmNlKSB7CiAgSnNDbG9zZWRXb3JsZCBuZXdDbG9zZWRXb3JsZCA9IG5ldyBKc0Nsb3NlZFdvcmxkLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgb3B0aW9ucywgcmVwb3J0ZXIsIGVudmlyb25tZW50LCBhYnN0cmFjdFZhbHVlU3RyYXRlZ3ksIGNvbXBvbmVudCwgc291cmNlKTsKICBJbmZlcnJlZERhdGEgbmV3SW5mZXJyZWREYXRhID0KICAgICAgbmV3IEluZmVycmVkRGF0YS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBuZXdDbG9zZWRXb3JsZCk7CiAgcmV0dXJuIG5ldyBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cy5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIHNvdXJjZSwgbmV3Q2xvc2VkV29ybGQuZWxlbWVudE1hcCwgbmV3Q2xvc2VkV29ybGQsIG5ld0luZmVycmVkRGF0YSk7Cn0KCmNsYXNzIFNlcmlhbGl6YXRpb25UYXNrIGV4dGVuZHMgQ29tcGlsZXJUYXNrIHsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIF9yZXBvcnRlcjsKICBmaW5hbCBhcGkuQ29tcGlsZXJJbnB1dCBfcHJvdmlkZXI7CiAgZmluYWwgYXBpLkNvbXBpbGVyT3V0cHV0IF9vdXRwdXRQcm92aWRlcjsKCiAgU2VyaWFsaXphdGlvblRhc2sodGhpcy5fb3B0aW9ucywgdGhpcy5fcmVwb3J0ZXIsIHRoaXMuX3Byb3ZpZGVyLAogICAgICB0aGlzLl9vdXRwdXRQcm92aWRlciwgTWVhc3VyZXIgbWVhc3VyZXIpCiAgICAgIDogc3VwZXIobWVhc3VyZXIpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJ1NlcmlhbGl6YXRpb24nOwoKICB2b2lkIHNlcmlhbGl6ZUdsb2JhbFR5cGVJbmZlcmVuY2UoR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cykgewogICAgbWVhc3VyZVN1YnRhc2soJ3NlcmlhbGl6ZSBkaWxsJywgKCkgewogICAgICAvLyBUT0RPKHNpZ211bmQpOiByZW1vdmUgZW50aXJlbHk6IHdlIHdpbGwgZG8gdGhpcyBpbW1lZGlhdGVseSBhcyBzb29uIGFzCiAgICAgIC8vIHdlIGdldCB0aGUgY29tcG9uZW50IGluIHRoZSBrZXJuZWwvbG9hZGVyLmRhcnQgdGFzayBvbmNlIHdlIHJlZmFjdG9yCiAgICAgIC8vIGhvdyB3ZSBhcHBseSBvdXIgbW9kdWxhciBrZXJuZWwgdHJhbnNmb3JtYXRpb24gZm9yIHN1cGVyIG1peGluIGNhbGxzLgogICAgICBfcmVwb3J0ZXIubG9nKCdXcml0aW5nIGRpbGwgdG8gJHtfb3B0aW9ucy5vdXRwdXRVcml9Jyk7CiAgICAgIGFwaS5CaW5hcnlPdXRwdXRTaW5rIGRpbGxPdXRwdXQgPQogICAgICAgICAgX291dHB1dFByb3ZpZGVyLmNyZWF0ZUJpbmFyeVNpbmsoX29wdGlvbnMub3V0cHV0VXJpKTsKICAgICAgSnNDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCA9IHJlc3VsdHMuY2xvc2VkV29ybGQ7CiAgICAgIGlyLkNvbXBvbmVudCBjb21wb25lbnQgPSBjbG9zZWRXb3JsZC5lbGVtZW50TWFwLnByb2dyYW1FbnYubWFpbkNvbXBvbmVudDsKICAgICAgQmluYXJ5T3V0cHV0U2lua0FkYXB0ZXIgaXJTaW5rID0gbmV3IEJpbmFyeU91dHB1dFNpbmtBZGFwdGVyKGRpbGxPdXRwdXQpOwogICAgICBpci5CaW5hcnlQcmludGVyIHByaW50ZXIgPSBuZXcgaXIuQmluYXJ5UHJpbnRlcihpclNpbmspOwogICAgICBwcmludGVyLndyaXRlQ29tcG9uZW50RmlsZShjb21wb25lbnQpOwogICAgICBpclNpbmsuY2xvc2UoKTsKICAgIH0pOwoKICAgIG1lYXN1cmVTdWJ0YXNrKCdzZXJpYWxpemUgZGF0YScsICgpIHsKICAgICAgX3JlcG9ydGVyLmxvZygnV3JpdGluZyBkYXRhIHRvICR7X29wdGlvbnMud3JpdGVEYXRhVXJpfScpOwogICAgICBhcGkuQmluYXJ5T3V0cHV0U2luayBkYXRhT3V0cHV0ID0KICAgICAgICAgIF9vdXRwdXRQcm92aWRlci5jcmVhdGVCaW5hcnlTaW5rKF9vcHRpb25zLndyaXRlRGF0YVVyaSk7CiAgICAgIERhdGFTaW5rIHNpbmsgPSBuZXcgQmluYXJ5U2luayhuZXcgQmluYXJ5T3V0cHV0U2lua0FkYXB0ZXIoZGF0YU91dHB1dCkpOwogICAgICBzZXJpYWxpemVHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyhyZXN1bHRzLCBzaW5rKTsKICAgIH0pOwogIH0KCiAgRnV0dXJlPEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzPiBkZXNlcmlhbGl6ZUdsb2JhbFR5cGVJbmZlcmVuY2UoCiAgICAgIEVudmlyb25tZW50IGVudmlyb25tZW50LAogICAgICBBYnN0cmFjdFZhbHVlU3RyYXRlZ3kgYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5KSBhc3luYyB7CiAgICBpci5Db21wb25lbnQgY29tcG9uZW50ID0KICAgICAgICBhd2FpdCBtZWFzdXJlSW9TdWJ0YXNrKCdkZXNlcmlhbGl6ZSBkaWxsJywgKCkgYXN5bmMgewogICAgICBfcmVwb3J0ZXIubG9nKCdSZWFkaW5nIGRpbGwgZnJvbSAke19vcHRpb25zLmVudHJ5UG9pbnR9Jyk7CiAgICAgIGFwaS5JbnB1dDxMaXN0PGludD4+IGRpbGxJbnB1dCA9IGF3YWl0IF9wcm92aWRlcgogICAgICAgICAgLnJlYWRGcm9tVXJpKF9vcHRpb25zLmVudHJ5UG9pbnQsIGlucHV0S2luZDogYXBpLklucHV0S2luZC5iaW5hcnkpOwogICAgICBpci5Db21wb25lbnQgY29tcG9uZW50ID0gbmV3IGlyLkNvbXBvbmVudCgpOwogICAgICBuZXcgaXIuQmluYXJ5QnVpbGRlcihkaWxsSW5wdXQuZGF0YSkucmVhZENvbXBvbmVudChjb21wb25lbnQpOwogICAgICByZXR1cm4gY29tcG9uZW50OwogICAgfSk7CgogICAgcmV0dXJuIGF3YWl0IG1lYXN1cmVJb1N1YnRhc2soJ2Rlc2VyaWFsaXplIGRhdGEnLCAoKSBhc3luYyB7CiAgICAgIF9yZXBvcnRlci5sb2coJ1JlYWRpbmcgZGF0YSBmcm9tICR7X29wdGlvbnMucmVhZERhdGFVcml9Jyk7CiAgICAgIGFwaS5JbnB1dDxMaXN0PGludD4+IGRhdGFJbnB1dCA9IGF3YWl0IF9wcm92aWRlcgogICAgICAgICAgLnJlYWRGcm9tVXJpKF9vcHRpb25zLnJlYWREYXRhVXJpLCBpbnB1dEtpbmQ6IGFwaS5JbnB1dEtpbmQuYmluYXJ5KTsKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UgPSBuZXcgQmluYXJ5U291cmNlSW1wbChkYXRhSW5wdXQuZGF0YSk7CiAgICAgIHJldHVybiBkZXNlcmlhbGl6ZUdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzKF9vcHRpb25zLCBfcmVwb3J0ZXIsCiAgICAgICAgICBlbnZpcm9ubWVudCwgYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5LCBjb21wb25lbnQsIHNvdXJjZSk7CiAgICB9KTsKICB9CgogIHZvaWQgc2VyaWFsaXplQ29kZWdlbigKICAgICAgQmFja2VuZFN0cmF0ZWd5IGJhY2tlbmRTdHJhdGVneSwgQ29kZWdlblJlc3VsdHMgY29kZWdlblJlc3VsdHMpIHsKICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzID0KICAgICAgICBjb2RlZ2VuUmVzdWx0cy5nbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0czsKICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCA9IGdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzLmNsb3NlZFdvcmxkOwogICAgaW50IHNoYXJkID0gX29wdGlvbnMuY29kZWdlblNoYXJkOwogICAgaW50IHNoYXJkcyA9IF9vcHRpb25zLmNvZGVnZW5TaGFyZHM7CiAgICBNYXA8TWVtYmVyRW50aXR5LCBDb2RlZ2VuUmVzdWx0PiByZXN1bHRzID0ge307CiAgICBpbnQgaW5kZXggPSAwOwogICAgRW50aXR5V3JpdGVyIGVudGl0eVdyaXRlciA9CiAgICAgICAgYmFja2VuZFN0cmF0ZWd5LmZvckVhY2hDb2RlZ2VuTWVtYmVyKChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgIGlmIChpbmRleCAlIHNoYXJkcyA9PSBzaGFyZCkgewogICAgICAgIENvZGVnZW5SZXN1bHQgY29kZWdlblJlc3VsdCA9IGNvZGVnZW5SZXN1bHRzLmdldENvZGVnZW5SZXN1bHRzKG1lbWJlcik7CiAgICAgICAgcmVzdWx0c1ttZW1iZXJdID0gY29kZWdlblJlc3VsdDsKICAgICAgfQogICAgICBpbmRleCsrOwogICAgfSk7CiAgICBtZWFzdXJlU3VidGFzaygnc2VyaWFsaXplIGNvZGVnZW4nLCAoKSB7CiAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoJyR7X29wdGlvbnMud3JpdGVDb2RlZ2VuVXJpfSRzaGFyZCcpOwogICAgICBhcGkuQmluYXJ5T3V0cHV0U2luayBkYXRhT3V0cHV0ID0gX291dHB1dFByb3ZpZGVyLmNyZWF0ZUJpbmFyeVNpbmsodXJpKTsKICAgICAgRGF0YVNpbmsgc2luayA9IG5ldyBCaW5hcnlTaW5rKG5ldyBCaW5hcnlPdXRwdXRTaW5rQWRhcHRlcihkYXRhT3V0cHV0KSk7CiAgICAgIF9yZXBvcnRlci5sb2coJ1dyaXRpbmcgZGF0YSB0byAke3VyaX0nKTsKICAgICAgc2luay5yZWdpc3RlckVudGl0eVdyaXRlcihlbnRpdHlXcml0ZXIpOwogICAgICBzaW5rLnJlZ2lzdGVyQ29kZWdlbldyaXRlcihuZXcgQ29kZWdlbldyaXRlckltcGwoY2xvc2VkV29ybGQpKTsKICAgICAgc2luay53cml0ZU1lbWJlck1hcCgKICAgICAgICAgIHJlc3VsdHMsCiAgICAgICAgICAoTWVtYmVyRW50aXR5IG1lbWJlciwgQ29kZWdlblJlc3VsdCByZXN1bHQpID0+CiAgICAgICAgICAgICAgcmVzdWx0LndyaXRlVG9EYXRhU2luayhzaW5rKSk7CiAgICAgIHNpbmsuY2xvc2UoKTsKICAgIH0pOwogIH0KCiAgRnV0dXJlPENvZGVnZW5SZXN1bHRzPiBkZXNlcmlhbGl6ZUNvZGVnZW4oCiAgICAgIEJhY2tlbmRTdHJhdGVneSBiYWNrZW5kU3RyYXRlZ3ksCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzLAogICAgICBDb2RlZ2VuSW5wdXRzIGNvZGVnZW5JbnB1dHMpIGFzeW5jIHsKICAgIGludCBzaGFyZHMgPSBfb3B0aW9ucy5jb2RlZ2VuU2hhcmRzOwogICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkID0gZ2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMuY2xvc2VkV29ybGQ7CiAgICBNYXA8TWVtYmVyRW50aXR5LCBDb2RlZ2VuUmVzdWx0PiByZXN1bHRzID0ge307CiAgICBmb3IgKGludCBzaGFyZCA9IDA7IHNoYXJkIDwgc2hhcmRzOyBzaGFyZCsrKSB7CiAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoJyR7X29wdGlvbnMucmVhZENvZGVnZW5Vcml9JHNoYXJkJyk7CiAgICAgIGF3YWl0IG1lYXN1cmVJb1N1YnRhc2soJ2Rlc2VyaWFsaXplIGNvZGVnZW4nLCAoKSBhc3luYyB7CiAgICAgICAgX3JlcG9ydGVyLmxvZygnUmVhZGluZyBkYXRhIGZyb20gJHt1cml9Jyk7CiAgICAgICAgYXBpLklucHV0PExpc3Q8aW50Pj4gZGF0YUlucHV0ID0KICAgICAgICAgICAgYXdhaXQgX3Byb3ZpZGVyLnJlYWRGcm9tVXJpKHVyaSwgaW5wdXRLaW5kOiBhcGkuSW5wdXRLaW5kLmJpbmFyeSk7CiAgICAgICAgRGF0YVNvdXJjZSBzb3VyY2UgPSBuZXcgQmluYXJ5U291cmNlSW1wbChkYXRhSW5wdXQuZGF0YSk7CiAgICAgICAgYmFja2VuZFN0cmF0ZWd5LnByZXBhcmVDb2RlZ2VuUmVhZGVyKHNvdXJjZSk7CiAgICAgICAgTWFwPE1lbWJlckVudGl0eSwgQ29kZWdlblJlc3VsdD4gY29kZWdlblJlc3VsdHMgPQogICAgICAgICAgICBzb3VyY2UucmVhZE1lbWJlck1hcCgoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICAgICAgTGlzdDxNb2R1bGFyTmFtZT4gbW9kdWxhck5hbWVzID0gW107CiAgICAgICAgICBMaXN0PE1vZHVsYXJFeHByZXNzaW9uPiBtb2R1bGFyRXhwcmVzc2lvbnMgPSBbXTsKICAgICAgICAgIENvZGVnZW5SZWFkZXIgcmVhZGVyID0gbmV3IENvZGVnZW5SZWFkZXJJbXBsKAogICAgICAgICAgICAgIGNsb3NlZFdvcmxkLCBtb2R1bGFyTmFtZXMsIG1vZHVsYXJFeHByZXNzaW9ucyk7CiAgICAgICAgICBzb3VyY2UucmVnaXN0ZXJDb2RlZ2VuUmVhZGVyKHJlYWRlcik7CiAgICAgICAgICBDb2RlZ2VuUmVzdWx0IHJlc3VsdCA9IENvZGVnZW5SZXN1bHQucmVhZEZyb21EYXRhU291cmNlKAogICAgICAgICAgICAgIHNvdXJjZSwgbW9kdWxhck5hbWVzLCBtb2R1bGFyRXhwcmVzc2lvbnMpOwogICAgICAgICAgc291cmNlLmRlcmVnaXN0ZXJDb2RlZ2VuUmVhZGVyKHJlYWRlcik7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0pOwogICAgICAgIF9yZXBvcnRlci5sb2coJ1JlYWQgJHtjb2RlZ2VuUmVzdWx0cy5sZW5ndGh9IG1lbWJlcnMgZnJvbSAke3VyaX0nKTsKICAgICAgICByZXN1bHRzLmFkZEFsbChjb2RlZ2VuUmVzdWx0cyk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIG5ldyBEZXNlcmlhbGl6ZWRDb2RlZ2VuUmVzdWx0cygKICAgICAgICBnbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cywgY29kZWdlbklucHV0cywgcmVzdWx0cyk7CiAgfQp9CoC0AE5OPAEVKDs5KSMhHzIkHjEhJSskGiQYHQEqOTM0JSY5EAIBQh0hHTEcGUdRIUM8SwIBLyImJSwBQy8ZAQwmAUoqUE5PPihAN1BQPy0WCAEqQShDTzoIBAFFHzsdPkE3TjNFGAgBQUI3T0BIQggEARlIPDNHJykzEyBFJVApCA8ILUBPTy8vRhsTOS0UCAQBLSc9KylHMzM/PzMpT0I2OjkvOzg+MEM5MhkMTCgKBis9BAIBLHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NlcmlhbGl6YXRpb24vdGFzay5kYXJ0O3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NlcmlhbGl6YXRpb24vc3RyYXRlZ2llcy5kYXJ0kd0vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC91dGlscy5kYXJ0JyBhcyBpcgogICAgc2hvdyBzZXJpYWxpemVDb21wb25lbnQ7CmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC91dGlscy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYmluYXJ5L2FzdF9mcm9tX2JpbmFyeS5kYXJ0JyBzaG93IEJpbmFyeUJ1aWxkZXI7CgppbXBvcnQgJy4uL2RpYWdub3N0aWNzL2RpYWdub3N0aWNfbGlzdGVuZXIuZGFydCc7CmltcG9ydCAnLi4vZW52aXJvbm1lbnQuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2pzX3dvcmxkLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vc291cmNlX2ZpbGVfcHJvdmlkZXIuZGFydCc7CmltcG9ydCAnLi4vdXRpbC9zaW5rX2FkYXB0ZXIuZGFydCc7CmltcG9ydCAnc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICd0YXNrLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgU2VyaWFsaXphdGlvblN0cmF0ZWd5PFQ+IHsKICBjb25zdCBTZXJpYWxpemF0aW9uU3RyYXRlZ3koKTsKCiAgTGlzdDxpbnQ+IHNlcmlhbGl6ZUNvbXBvbmVudChHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzKSB7CiAgICBKc0Nsb3NlZFdvcmxkIGNsb3NlZFdvcmxkID0gcmVzdWx0cy5jbG9zZWRXb3JsZDsKICAgIGlyLkNvbXBvbmVudCBjb21wb25lbnQgPSBjbG9zZWRXb3JsZC5lbGVtZW50TWFwLnByb2dyYW1FbnYubWFpbkNvbXBvbmVudDsKICAgIHJldHVybiBpci5zZXJpYWxpemVDb21wb25lbnQoY29tcG9uZW50KTsKICB9CgogIExpc3Q8VD4gc2VyaWFsaXplRGF0YShHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzKTsKCiAgaXIuQ29tcG9uZW50IGRlc2VyaWFsaXplQ29tcG9uZW50KExpc3Q8aW50PiBkYXRhKSB7CiAgICBpci5Db21wb25lbnQgY29tcG9uZW50ID0gbmV3IGlyLkNvbXBvbmVudCgpOwogICAgbmV3IEJpbmFyeUJ1aWxkZXIoZGF0YSkucmVhZENvbXBvbmVudChjb21wb25lbnQpOwogICAgcmV0dXJuIGNvbXBvbmVudDsKICB9CgogIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGRlc2VyaWFsaXplRGF0YSgKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwKICAgICAgRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCiAgICAgIEFic3RyYWN0VmFsdWVTdHJhdGVneSBhYnN0cmFjdFZhbHVlU3RyYXRlZ3ksCiAgICAgIGlyLkNvbXBvbmVudCBjb21wb25lbnQsCiAgICAgIExpc3Q8VD4gZGF0YSk7Cn0KCmNsYXNzIEJ5dGVzSW5NZW1vcnlTZXJpYWxpemF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBTZXJpYWxpemF0aW9uU3RyYXRlZ3k8aW50PiB7CiAgZmluYWwgYm9vbCB1c2VEYXRhS2luZHM7CgogIGNvbnN0IEJ5dGVzSW5NZW1vcnlTZXJpYWxpemF0aW9uU3RyYXRlZ3koe3RoaXMudXNlRGF0YUtpbmRzOiBmYWxzZX0pOwoKICBAb3ZlcnJpZGUKICBMaXN0PGludD4gc2VyaWFsaXplRGF0YShHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzKSB7CiAgICBCeXRlU2luayBieXRlU2luayA9IG5ldyBCeXRlU2luaygpOwogICAgRGF0YVNpbmsgc2luayA9IG5ldyBCaW5hcnlTaW5rKGJ5dGVTaW5rLCB1c2VEYXRhS2luZHM6IHVzZURhdGFLaW5kcyk7CiAgICBzZXJpYWxpemVHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyhyZXN1bHRzLCBzaW5rKTsKICAgIHJldHVybiBieXRlU2luay5idWlsZGVyLnRha2VCeXRlcygpOwogIH0KCiAgQG92ZXJyaWRlCiAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZGVzZXJpYWxpemVEYXRhKAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyLAogICAgICBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKICAgICAgQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5IGFic3RyYWN0VmFsdWVTdHJhdGVneSwKICAgICAgaXIuQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAgTGlzdDxpbnQ+IGRhdGEpIHsKICAgIERhdGFTb3VyY2Ugc291cmNlID0gbmV3IEJpbmFyeVNvdXJjZUltcGwoZGF0YSwgdXNlRGF0YUtpbmRzOiB1c2VEYXRhS2luZHMpOwogICAgcmV0dXJuIGRlc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMob3B0aW9ucywgcmVwb3J0ZXIsIGVudmlyb25tZW50LAogICAgICAgIGFic3RyYWN0VmFsdWVTdHJhdGVneSwgY29tcG9uZW50LCBzb3VyY2UpOwogIH0KfQoKY2xhc3MgQnl0ZXNPbkRpc2tTZXJpYWxpemF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBTZXJpYWxpemF0aW9uU3RyYXRlZ3k8aW50PiB7CiAgZmluYWwgYm9vbCB1c2VEYXRhS2luZHM7CgogIGNvbnN0IEJ5dGVzT25EaXNrU2VyaWFsaXphdGlvblN0cmF0ZWd5KHt0aGlzLnVzZURhdGFLaW5kczogZmFsc2V9KTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxpbnQ+IHNlcmlhbGl6ZURhdGEoR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cykgewogICAgVXJpIHVyaSA9IFVyaS5iYXNlLnJlc29sdmUoJ3dvcmxkLmRhdGEnKTsKICAgIERhdGFTaW5rIHNpbmsgPSBuZXcgQmluYXJ5U2luaygKICAgICAgICBuZXcgQmluYXJ5T3V0cHV0U2lua0FkYXB0ZXIobmV3IFJhbmRvbUFjY2Vzc0JpbmFyeU91dHB1dFNpbmsodXJpKSksCiAgICAgICAgdXNlRGF0YUtpbmRzOiB1c2VEYXRhS2luZHMpOwogICAgc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMocmVzdWx0cywgc2luayk7CiAgICByZXR1cm4gbmV3IEZpbGUuZnJvbVVyaSh1cmkpLnJlYWRBc0J5dGVzU3luYygpOwogIH0KCiAgQG92ZXJyaWRlCiAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZGVzZXJpYWxpemVEYXRhKAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyLAogICAgICBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKICAgICAgQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5IGFic3RyYWN0VmFsdWVTdHJhdGVneSwKICAgICAgaXIuQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAgTGlzdDxpbnQ+IGRhdGEpIHsKICAgIERhdGFTb3VyY2Ugc291cmNlID0gbmV3IEJpbmFyeVNvdXJjZUltcGwoZGF0YSwgdXNlRGF0YUtpbmRzOiB1c2VEYXRhS2luZHMpOwogICAgcmV0dXJuIGRlc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMob3B0aW9ucywgcmVwb3J0ZXIsIGVudmlyb25tZW50LAogICAgICAgIGFic3RyYWN0VmFsdWVTdHJhdGVneSwgY29tcG9uZW50LCBzb3VyY2UpOwogIH0KfQoKY2xhc3MgT2JqZWN0c0luTWVtb3J5U2VyaWFsaXphdGlvblN0cmF0ZWd5CiAgICBleHRlbmRzIFNlcmlhbGl6YXRpb25TdHJhdGVneTxPYmplY3Q+IHsKICBmaW5hbCBib29sIHVzZURhdGFLaW5kczsKCiAgY29uc3QgT2JqZWN0c0luTWVtb3J5U2VyaWFsaXphdGlvblN0cmF0ZWd5KHt0aGlzLnVzZURhdGFLaW5kczogdHJ1ZX0pOwoKICBAb3ZlcnJpZGUKICBMaXN0PE9iamVjdD4gc2VyaWFsaXplRGF0YShHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzKSB7CiAgICBMaXN0PE9iamVjdD4gZGF0YSA9IFtdOwogICAgRGF0YVNpbmsgc2luayA9IG5ldyBPYmplY3RTaW5rKGRhdGEsIHVzZURhdGFLaW5kczogdXNlRGF0YUtpbmRzKTsKICAgIHNlcmlhbGl6ZUdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzKHJlc3VsdHMsIHNpbmspOwogICAgcmV0dXJuIGRhdGE7CiAgfQoKICBAb3ZlcnJpZGUKICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBkZXNlcmlhbGl6ZURhdGEoCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIsCiAgICAgIEVudmlyb25tZW50IGVudmlyb25tZW50LAogICAgICBBYnN0cmFjdFZhbHVlU3RyYXRlZ3kgYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5LAogICAgICBpci5Db21wb25lbnQgY29tcG9uZW50LAogICAgICBMaXN0PE9iamVjdD4gZGF0YSkgewogICAgRGF0YVNvdXJjZSBzb3VyY2UgPSBuZXcgT2JqZWN0U291cmNlKGRhdGEsIHVzZURhdGFLaW5kczogdXNlRGF0YUtpbmRzKTsKICAgIHJldHVybiBkZXNlcmlhbGl6ZUdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzKG9wdGlvbnMsIHJlcG9ydGVyLCBlbnZpcm9ubWVudCwKICAgICAgICBhYnN0cmFjdFZhbHVlU3RyYXRlZ3ksIGNvbXBvbmVudCwgc291cmNlKTsKICB9Cn0KgIYATk48ARIBPR04KEgBMh4xISQaJyQdFAEqIQFFNU4tBAE9ATYxNhYEAS4fIx8zHhUCAU4bAUgBDEAoSjgpBAEMLh8jHzMeGFBRMwQCAUwbAUYBDEAuJEwlODQEAQwuHyMfMx4YUFEzBAIBKywbAUkBDEMcRjgRBAEMLh8jHzMeG0xRMwQCATJwYWNrYWdlOmNvbXBpbGVyL3NyYy9zZXJpYWxpemF0aW9uL3N0cmF0ZWdpZXMuZGFydCxzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zc2Evbm9kZXMuZGFydMACPMAvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgc2hvdyBMaW5rOwoKaW1wb3J0ICcuLi9jbG9zdXJlLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvY29uc3RhbnRfc3lzdGVtLmRhcnQnIGFzIGNvbnN0YW50X3N5c3RlbTsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2p1bXBzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganM7CmltcG9ydCAnLi4vanNfbW9kZWwvdHlwZV9yZWNpcGUuZGFydCcgc2hvdyBUeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUsIFR5cGVSZWNpcGU7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2lkZV9lZmZlY3RzLmRhcnQnIHNob3cgU2lkZUVmZmVjdHM7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwppbXBvcnQgJ2ludm9rZV9keW5hbWljX3NwZWNpYWxpemVycy5kYXJ0JzsKaW1wb3J0ICd2YWxpZGF0ZS5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIEhWaXNpdG9yPFI+IHsKICBSIHZpc2l0QWJzKEhBYnMgbm9kZSk7CiAgUiB2aXNpdEFkZChIQWRkIG5vZGUpOwogIFIgdmlzaXRBd2FpdChIQXdhaXQgbm9kZSk7CiAgUiB2aXNpdEJpdEFuZChIQml0QW5kIG5vZGUpOwogIFIgdmlzaXRCaXROb3QoSEJpdE5vdCBub2RlKTsKICBSIHZpc2l0Qml0T3IoSEJpdE9yIG5vZGUpOwogIFIgdmlzaXRCaXRYb3IoSEJpdFhvciBub2RlKTsKICBSIHZpc2l0Qm91bmRzQ2hlY2soSEJvdW5kc0NoZWNrIG5vZGUpOwogIFIgdmlzaXRCcmVhayhIQnJlYWsgbm9kZSk7CiAgUiB2aXNpdENvbnN0YW50KEhDb25zdGFudCBub2RlKTsKICBSIHZpc2l0Q29udGludWUoSENvbnRpbnVlIG5vZGUpOwogIFIgdmlzaXRDcmVhdGUoSENyZWF0ZSBub2RlKTsKICBSIHZpc2l0Q3JlYXRlQm94KEhDcmVhdGVCb3ggbm9kZSk7CiAgUiB2aXNpdERpdmlkZShIRGl2aWRlIG5vZGUpOwogIFIgdmlzaXRFeGl0KEhFeGl0IG5vZGUpOwogIFIgdmlzaXRFeGl0VHJ5KEhFeGl0VHJ5IG5vZGUpOwogIFIgdmlzaXRGaWVsZEdldChIRmllbGRHZXQgbm9kZSk7CiAgUiB2aXNpdEZpZWxkU2V0KEhGaWVsZFNldCBub2RlKTsKICBSIHZpc2l0Rm9yZWlnbkNvZGUoSEZvcmVpZ25Db2RlIG5vZGUpOwogIFIgdmlzaXRHZXRMZW5ndGgoSEdldExlbmd0aCBub2RlKTsKICBSIHZpc2l0R290byhIR290byBub2RlKTsKICBSIHZpc2l0R3JlYXRlcihIR3JlYXRlciBub2RlKTsKICBSIHZpc2l0R3JlYXRlckVxdWFsKEhHcmVhdGVyRXF1YWwgbm9kZSk7CiAgUiB2aXNpdElkZW50aXR5KEhJZGVudGl0eSBub2RlKTsKICBSIHZpc2l0SWYoSElmIG5vZGUpOwogIFIgdmlzaXRJbmRleChISW5kZXggbm9kZSk7CiAgUiB2aXNpdEluZGV4QXNzaWduKEhJbmRleEFzc2lnbiBub2RlKTsKICBSIHZpc2l0SW50ZXJjZXB0b3IoSEludGVyY2VwdG9yIG5vZGUpOwogIFIgdmlzaXRJbnZva2VDbG9zdXJlKEhJbnZva2VDbG9zdXJlIG5vZGUpOwogIFIgdmlzaXRJbnZva2VEeW5hbWljR2V0dGVyKEhJbnZva2VEeW5hbWljR2V0dGVyIG5vZGUpOwogIFIgdmlzaXRJbnZva2VEeW5hbWljTWV0aG9kKEhJbnZva2VEeW5hbWljTWV0aG9kIG5vZGUpOwogIFIgdmlzaXRJbnZva2VEeW5hbWljU2V0dGVyKEhJbnZva2VEeW5hbWljU2V0dGVyIG5vZGUpOwogIFIgdmlzaXRJbnZva2VTdGF0aWMoSEludm9rZVN0YXRpYyBub2RlKTsKICBSIHZpc2l0SW52b2tlU3VwZXIoSEludm9rZVN1cGVyIG5vZGUpOwogIFIgdmlzaXRJbnZva2VDb25zdHJ1Y3RvckJvZHkoSEludm9rZUNvbnN0cnVjdG9yQm9keSBub2RlKTsKICBSIHZpc2l0SW52b2tlR2VuZXJhdG9yQm9keShISW52b2tlR2VuZXJhdG9yQm9keSBub2RlKTsKICBSIHZpc2l0SXMoSElzIG5vZGUpOwogIFIgdmlzaXRJc1ZpYUludGVyY2VwdG9yKEhJc1ZpYUludGVyY2VwdG9yIG5vZGUpOwogIFIgdmlzaXRMYXRlVmFsdWUoSExhdGVWYWx1ZSBub2RlKTsKICBSIHZpc2l0TGF6eVN0YXRpYyhITGF6eVN0YXRpYyBub2RlKTsKICBSIHZpc2l0TGVzcyhITGVzcyBub2RlKTsKICBSIHZpc2l0TGVzc0VxdWFsKEhMZXNzRXF1YWwgbm9kZSk7CiAgUiB2aXNpdExpdGVyYWxMaXN0KEhMaXRlcmFsTGlzdCBub2RlKTsKICBSIHZpc2l0TG9jYWxHZXQoSExvY2FsR2V0IG5vZGUpOwogIFIgdmlzaXRMb2NhbFNldChITG9jYWxTZXQgbm9kZSk7CiAgUiB2aXNpdExvY2FsVmFsdWUoSExvY2FsVmFsdWUgbm9kZSk7CiAgUiB2aXNpdExvb3BCcmFuY2goSExvb3BCcmFuY2ggbm9kZSk7CiAgUiB2aXNpdE11bHRpcGx5KEhNdWx0aXBseSBub2RlKTsKICBSIHZpc2l0TmVnYXRlKEhOZWdhdGUgbm9kZSk7CiAgUiB2aXNpdE5vdChITm90IG5vZGUpOwogIFIgdmlzaXRPbmVTaG90SW50ZXJjZXB0b3IoSE9uZVNob3RJbnRlcmNlcHRvciBub2RlKTsKICBSIHZpc2l0UGFyYW1ldGVyVmFsdWUoSFBhcmFtZXRlclZhbHVlIG5vZGUpOwogIFIgdmlzaXRQaGkoSFBoaSBub2RlKTsKICBSIHZpc2l0UmFuZ2VDb252ZXJzaW9uKEhSYW5nZUNvbnZlcnNpb24gbm9kZSk7CiAgUiB2aXNpdFJlYWRNb2RpZnlXcml0ZShIUmVhZE1vZGlmeVdyaXRlIG5vZGUpOwogIFIgdmlzaXRSZWYoSFJlZiBub2RlKTsKICBSIHZpc2l0UmVtYWluZGVyKEhSZW1haW5kZXIgbm9kZSk7CiAgUiB2aXNpdFJldHVybihIUmV0dXJuIG5vZGUpOwogIFIgdmlzaXRTaGlmdExlZnQoSFNoaWZ0TGVmdCBub2RlKTsKICBSIHZpc2l0U2hpZnRSaWdodChIU2hpZnRSaWdodCBub2RlKTsKICBSIHZpc2l0U3RhdGljKEhTdGF0aWMgbm9kZSk7CiAgUiB2aXNpdFN0YXRpY1N0b3JlKEhTdGF0aWNTdG9yZSBub2RlKTsKICBSIHZpc2l0U3RyaW5nQ29uY2F0KEhTdHJpbmdDb25jYXQgbm9kZSk7CiAgUiB2aXNpdFN0cmluZ2lmeShIU3RyaW5naWZ5IG5vZGUpOwogIFIgdmlzaXRTdWJ0cmFjdChIU3VidHJhY3Qgbm9kZSk7CiAgUiB2aXNpdFN3aXRjaChIU3dpdGNoIG5vZGUpOwogIFIgdmlzaXRUaGlzKEhUaGlzIG5vZGUpOwogIFIgdmlzaXRUaHJvdyhIVGhyb3cgbm9kZSk7CiAgUiB2aXNpdFRocm93RXhwcmVzc2lvbihIVGhyb3dFeHByZXNzaW9uIG5vZGUpOwogIFIgdmlzaXRUcnVuY2F0aW5nRGl2aWRlKEhUcnVuY2F0aW5nRGl2aWRlIG5vZGUpOwogIFIgdmlzaXRUcnkoSFRyeSBub2RlKTsKICBSIHZpc2l0VHlwZUNvbnZlcnNpb24oSFR5cGVDb252ZXJzaW9uIG5vZGUpOwogIFIgdmlzaXRQcmltaXRpdmVDaGVjayhIUHJpbWl0aXZlQ2hlY2sgbm9kZSk7CiAgUiB2aXNpdEJvb2xDb252ZXJzaW9uKEhCb29sQ29udmVyc2lvbiBub2RlKTsKICBSIHZpc2l0VHlwZUtub3duKEhUeXBlS25vd24gbm9kZSk7CiAgUiB2aXNpdFlpZWxkKEhZaWVsZCBub2RlKTsKCiAgUiB2aXNpdFR5cGVJbmZvUmVhZFJhdyhIVHlwZUluZm9SZWFkUmF3IG5vZGUpOwogIFIgdmlzaXRUeXBlSW5mb1JlYWRWYXJpYWJsZShIVHlwZUluZm9SZWFkVmFyaWFibGUgbm9kZSk7CiAgUiB2aXNpdFR5cGVJbmZvRXhwcmVzc2lvbihIVHlwZUluZm9FeHByZXNzaW9uIG5vZGUpOwoKICAvLyBJbnN0cnVjdGlvbnMgZm9yICdkYXJ0Ol9ydGknLgogIFIgdmlzaXRJc1Rlc3QoSElzVGVzdCBub2RlKTsKICBSIHZpc2l0QXNDaGVjayhIQXNDaGVjayBub2RlKTsKICBSIHZpc2l0QXNDaGVja1NpbXBsZShIQXNDaGVja1NpbXBsZSBub2RlKTsKICBSIHZpc2l0U3VidHlwZUNoZWNrKEhTdWJ0eXBlQ2hlY2sgbm9kZSk7CiAgUiB2aXNpdExvYWRUeXBlKEhMb2FkVHlwZSBub2RlKTsKICBSIHZpc2l0SW5zdGFuY2VFbnZpcm9ubWVudChISW5zdGFuY2VFbnZpcm9ubWVudCBub2RlKTsKICBSIHZpc2l0VHlwZUV2YWwoSFR5cGVFdmFsIG5vZGUpOwogIFIgdmlzaXRUeXBlQmluZChIVHlwZUJpbmQgbm9kZSk7Cn0KCmFic3RyYWN0IGNsYXNzIEhHcmFwaFZpc2l0b3IgewogIHZpc2l0RG9taW5hdG9yVHJlZShIR3JhcGggZ3JhcGgpIHsKICAgIC8vIFJlY3Vyc2lvbiBmcmVlIHZlcnNpb24gb2Y6CiAgICAvLwogICAgLy8gICAgIHZvaWQgdmlzaXRCYXNpY0Jsb2NrQW5kU3VjY2Vzc29ycyhIQmFzaWNCbG9jayBibG9jaykgewogICAgLy8gICAgICAgdmlzaXRCYXNpY0Jsb2NrKGJsb2NrKTsKICAgIC8vICAgICAgIExpc3QgZG9taW5hdGVkID0gYmxvY2suZG9taW5hdGVkQmxvY2tzOwogICAgLy8gICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb21pbmF0ZWQubGVuZ3RoOyBpKyspIHsKICAgIC8vICAgICAgICAgdmlzaXRCYXNpY0Jsb2NrQW5kU3VjY2Vzc29ycyhkb21pbmF0ZWRbaV0pOwogICAgLy8gICAgICAgfQogICAgLy8gICAgIH0KICAgIC8vICAgICB2aXNpdEJhc2ljQmxvY2tBbmRTdWNjZXNzb3JzKGdyYXBoLmVudHJ5KTsKCiAgICBfRnJhbWUgZnJhbWUgPSBuZXcgX0ZyYW1lKG51bGwpOwogICAgZnJhbWUuYmxvY2sgPSBncmFwaC5lbnRyeTsKICAgIGZyYW1lLmluZGV4ID0gMDsKCiAgICB2aXNpdEJhc2ljQmxvY2soZnJhbWUuYmxvY2spOwoKICAgIHdoaWxlIChmcmFtZSAhPSBudWxsKSB7CiAgICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gZnJhbWUuYmxvY2s7CiAgICAgIGludCBpbmRleCA9IGZyYW1lLmluZGV4OwogICAgICBpZiAoaW5kZXggPCBibG9jay5kb21pbmF0ZWRCbG9ja3MubGVuZ3RoKSB7CiAgICAgICAgZnJhbWUuaW5kZXggPSBpbmRleCArIDE7CiAgICAgICAgZnJhbWUgPSBmcmFtZS5uZXh0ID8/PSBuZXcgX0ZyYW1lKGZyYW1lKTsKICAgICAgICBmcmFtZS5ibG9jayA9IGJsb2NrLmRvbWluYXRlZEJsb2Nrc1tpbmRleF07CiAgICAgICAgZnJhbWUuaW5kZXggPSAwOwogICAgICAgIHZpc2l0QmFzaWNCbG9jayhmcmFtZS5ibG9jayk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZnJhbWUgPSBmcmFtZS5wcmV2aW91czsKICAgIH0KICB9CgogIHZpc2l0UG9zdERvbWluYXRvclRyZWUoSEdyYXBoIGdyYXBoKSB7CiAgICAvLyBSZWN1c2lvbiBmcmVlIHZlcnNpb24gb2Y6CiAgICAvLwogICAgLy8gICAgIHZvaWQgdmlzaXRCYXNpY0Jsb2NrQW5kU3VjY2Vzc29ycyhIQmFzaWNCbG9jayBibG9jaykgewogICAgLy8gICAgICAgTGlzdCBkb21pbmF0ZWQgPSBibG9jay5kb21pbmF0ZWRCbG9ja3M7CiAgICAvLyAgICAgICBmb3IgKGludCBpID0gZG9taW5hdGVkLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAvLyAgICAgICAgIHZpc2l0QmFzaWNCbG9ja0FuZFN1Y2Nlc3NvcnMoZG9taW5hdGVkW2ldKTsKICAgIC8vICAgICAgIH0KICAgIC8vICAgICAgIHZpc2l0QmFzaWNCbG9jayhibG9jayk7CiAgICAvLyAgICAgfQogICAgLy8gICAgIHZpc2l0QmFzaWNCbG9ja0FuZFN1Y2Nlc3NvcnMoZ3JhcGguZW50cnkpOwoKICAgIF9GcmFtZSBmcmFtZSA9IG5ldyBfRnJhbWUobnVsbCk7CiAgICBmcmFtZS5ibG9jayA9IGdyYXBoLmVudHJ5OwogICAgZnJhbWUuaW5kZXggPSBmcmFtZS5ibG9jay5kb21pbmF0ZWRCbG9ja3MubGVuZ3RoOwoKICAgIHdoaWxlIChmcmFtZSAhPSBudWxsKSB7CiAgICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gZnJhbWUuYmxvY2s7CiAgICAgIGludCBpbmRleCA9IGZyYW1lLmluZGV4OwogICAgICBpZiAoaW5kZXggPiAwKSB7CiAgICAgICAgZnJhbWUuaW5kZXggPSBpbmRleCAtIDE7CiAgICAgICAgZnJhbWUgPSBmcmFtZS5uZXh0ID8/PSBuZXcgX0ZyYW1lKGZyYW1lKTsKICAgICAgICBmcmFtZS5ibG9jayA9IGJsb2NrLmRvbWluYXRlZEJsb2Nrc1tpbmRleCAtIDFdOwogICAgICAgIGZyYW1lLmluZGV4ID0gZnJhbWUuYmxvY2suZG9taW5hdGVkQmxvY2tzLmxlbmd0aDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB2aXNpdEJhc2ljQmxvY2soYmxvY2spOwogICAgICBmcmFtZSA9IGZyYW1lLnByZXZpb3VzOwogICAgfQogIH0KCiAgdmlzaXRCYXNpY0Jsb2NrKEhCYXNpY0Jsb2NrIGJsb2NrKTsKfQoKY2xhc3MgX0ZyYW1lIHsKICBmaW5hbCBfRnJhbWUgcHJldmlvdXM7CiAgX0ZyYW1lIG5leHQ7CiAgSEJhc2ljQmxvY2sgYmxvY2s7CiAgaW50IGluZGV4OwogIF9GcmFtZSh0aGlzLnByZXZpb3VzKTsKfQoKYWJzdHJhY3QgY2xhc3MgSEluc3RydWN0aW9uVmlzaXRvciBleHRlbmRzIEhHcmFwaFZpc2l0b3IgewogIEhCYXNpY0Jsb2NrIGN1cnJlbnRCbG9jazsKCiAgdmlzaXRJbnN0cnVjdGlvbihISW5zdHJ1Y3Rpb24gbm9kZSk7CgogIEBvdmVycmlkZQogIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBub2RlKSB7CiAgICB2b2lkIHZpc2l0SW5zdHJ1Y3Rpb25MaXN0KEhJbnN0cnVjdGlvbkxpc3QgbGlzdCkgewogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBsaXN0LmZpcnN0OwogICAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICAgIHZpc2l0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pOwogICAgICAgIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24ubmV4dDsKICAgICAgICBhc3NlcnQoaW5zdHJ1Y3Rpb24gIT0gbGlzdC5maXJzdCk7CiAgICAgIH0KICAgIH0KCiAgICBjdXJyZW50QmxvY2sgPSBub2RlOwogICAgdmlzaXRJbnN0cnVjdGlvbkxpc3Qobm9kZSk7CiAgfQp9CgpjbGFzcyBIR3JhcGggewogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1heWJlIHRoaXMgc2hvdWxkIGJlIFtNZW1iZXJMaWtlXS4KICBFbnRpdHkgZWxlbWVudDsgLy8gVXNlZCBmb3IgZGVidWcgcHJpbnRpbmcuCiAgSEJhc2ljQmxvY2sgZW50cnk7CiAgSEJhc2ljQmxvY2sgZXhpdDsKICBIVGhpcyB0aGlzSW5zdHJ1Y3Rpb247CgogIC8vLyBgdHJ1ZWAgaWYgdGhpcyBncmFwaCBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnkgYSBzeW5jKi9hc3luYy9hc3luYyoKICAvLy8gcmV3cml0ZS4KICBib29sIG5lZWRzQXN5bmNSZXdyaXRlID0gZmFsc2U7CgogIC8vLyBJZiB0aGlzIGZ1bmN0aW9uIHJlcXVpcmVzIGFuIGFzeW5jIHJld3JpdGUsIHRoaXMgaXMgdGhlIGVsZW1lbnQgdHlwZSBvZgogIC8vLyB0aGUgZ2VuZXJhdG9yLgogIERhcnRUeXBlIGFzeW5jRWxlbWVudFR5cGU7CgogIC8vLyBSZWNlaXZlciBwYXJhbWV0ZXIsIHNldCBmb3IgbWV0aG9kcyB1c2luZyBpbnRlcmNlcHRvciBjYWxsaW5nIGNvbnZlbnRpb24uCiAgSFBhcmFtZXRlclZhbHVlIGV4cGxpY2l0UmVjZWl2ZXJQYXJhbWV0ZXI7CiAgYm9vbCBpc1JlY3Vyc2l2ZU1ldGhvZCA9IGZhbHNlOwogIGJvb2wgY2FsbGVkSW5Mb29wID0gZmFsc2U7CgogIGZpbmFsIExpc3Q8SEJhc2ljQmxvY2s+IGJsb2NrcyA9IDxIQmFzaWNCbG9jaz5bXTsKCiAgLy8vIE5vZGVzIGNvbnRhaW5pbmcgbGlzdCBhbGxvY2F0aW9ucyBmb3Igd2hpY2ggdGhlcmUgaXMgYSBrbm93biBmaXhlZCBsZW5ndGguCiAgLy8gVE9ETyhzaWdtdW5kLHNyYSk6IGNvbnNpZGVyIG5vdCBzdG9yaW5nIHRoaXMgZXhwbGljaXRseSBoZXJlIChlLmcuIG1heWJlCiAgLy8gc3RvcmUgaXQgb24gSEluc3RydWN0aW9uLCBvciBtYXliZSB0aGlzIGNhbiBiZSBjb21wdXRlZCBvbiBkZW1hbmQpLgogIGZpbmFsIFNldDxISW5zdHJ1Y3Rpb24+IGFsbG9jYXRlZEZpeGVkTGlzdHMgPSBuZXcgU2V0PEhJbnN0cnVjdGlvbj4oKTsKCiAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb247CgogIC8vIFdlIGNhbm9uaWNhbGl6ZSBhbGwgY29uc3RhbnRzIHVzZWQgd2l0aGluIGEgZ3JhcGggc28gd2UgZG8gbm90CiAgLy8gaGF2ZSB0byB3b3JyeSBhYm91dCB0aGVtIGZvciBnbG9iYWwgdmFsdWUgbnVtYmVyaW5nLgogIE1hcDxDb25zdGFudFZhbHVlLCBIQ29uc3RhbnQ+IGNvbnN0YW50cyA9IG5ldyBNYXA8Q29uc3RhbnRWYWx1ZSwgSENvbnN0YW50PigpOwoKICBIR3JhcGgoKSB7CiAgICBlbnRyeSA9IGFkZE5ld0Jsb2NrKCk7CiAgICAvLyBUaGUgZXhpdCBibG9jayB3aWxsIGJlIGFkZGVkIGxhdGVyLCBzbyBpdCBoYXMgYW4gaWQgdGhhdCBpcwogICAgLy8gYWZ0ZXIgYWxsIG90aGVycyBpbiB0aGUgc3lzdGVtLgogICAgZXhpdCA9IG5ldyBIQmFzaWNCbG9jaygpOwogIH0KCiAgdm9pZCBhZGRCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgaW50IGlkID0gYmxvY2tzLmxlbmd0aDsKICAgIGJsb2NrLmlkID0gaWQ7CiAgICBibG9ja3MuYWRkKGJsb2NrKTsKICAgIGFzc2VydChpZGVudGljYWwoYmxvY2tzW2lkXSwgYmxvY2spKTsKICB9CgogIEhCYXNpY0Jsb2NrIGFkZE5ld0Jsb2NrKCkgewogICAgSEJhc2ljQmxvY2sgcmVzdWx0ID0gbmV3IEhCYXNpY0Jsb2NrKCk7CiAgICBhZGRCbG9jayhyZXN1bHQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEhCYXNpY0Jsb2NrIGFkZE5ld0xvb3BIZWFkZXJCbG9jaygKICAgICAgSnVtcFRhcmdldCB0YXJnZXQsIExpc3Q8TGFiZWxEZWZpbml0aW9uPiBsYWJlbHMpIHsKICAgIEhCYXNpY0Jsb2NrIHJlc3VsdCA9IGFkZE5ld0Jsb2NrKCk7CiAgICByZXN1bHQubG9vcEluZm9ybWF0aW9uID0gbmV3IEhMb29wSW5mb3JtYXRpb24ocmVzdWx0LCB0YXJnZXQsIGxhYmVscyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgSENvbnN0YW50IGFkZENvbnN0YW50KENvbnN0YW50VmFsdWUgY29uc3RhbnQsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAge1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAgSENvbnN0YW50IHJlc3VsdCA9IGNvbnN0YW50c1tjb25zdGFudF07CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IHNvdXJjZSBpbmZvcm1hdGlvbiBwZXIgY29uc3RhbnQgcmVmZXJlbmNlLgogICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAgICAgIGlmICghY29uc3RhbnQuaXNDb25zdGFudCkgewogICAgICAgIC8vIFdlIHVzZSBgbnVsbGAgYXMgdGhlIHZhbHVlIGZvciBpbnZhbGlkIGNvbnN0YW50IGV4cHJlc3Npb25zLgogICAgICAgIGNvbnN0YW50ID0gY29uc3QgTnVsbENvbnN0YW50VmFsdWUoKTsKICAgICAgfQogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUgPSBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAuY29tcHV0ZUFic3RyYWN0VmFsdWVGb3JDb25zdGFudChjb25zdGFudCk7CiAgICAgIHJlc3VsdCA9IG5ldyBIQ29uc3RhbnQuaW50ZXJuYWwoY29uc3RhbnQsIHR5cGUpCiAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgICBlbnRyeS5hZGRBdEV4aXQocmVzdWx0KTsKICAgICAgY29uc3RhbnRzW2NvbnN0YW50XSA9IHJlc3VsdDsKICAgIH0gZWxzZSBpZiAocmVzdWx0LmJsb2NrID09IG51bGwpIHsKICAgICAgLy8gVGhlIGNvbnN0YW50IHdhcyBub3QgdXNlZCBhbnltb3JlLgogICAgICBlbnRyeS5hZGRBdEV4aXQocmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBIQ29uc3RhbnQgYWRkRGVmZXJyZWRDb25zdGFudChEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgY29uc3RhbnQsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBhZGRDb25zdGFudChjb25zdGFudCwgY2xvc2VkV29ybGQsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEhDb25zdGFudCBhZGRDb25zdGFudEludChpbnQgaSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gYWRkQ29uc3RhbnQoY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUludEZyb21JbnQoaSksIGNsb3NlZFdvcmxkKTsKICB9CgogIEhDb25zdGFudCBhZGRDb25zdGFudEludEFzVW5zaWduZWQoaW50IGksIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGFkZENvbnN0YW50KAogICAgICAgIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVJbnQobmV3IEJpZ0ludC5mcm9tKGkpLnRvVW5zaWduZWQoNjQpKSwKICAgICAgICBjbG9zZWRXb3JsZCk7CiAgfQoKICBIQ29uc3RhbnQgYWRkQ29uc3RhbnREb3VibGUoZG91YmxlIGQsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGFkZENvbnN0YW50KGNvbnN0YW50X3N5c3RlbS5jcmVhdGVEb3VibGUoZCksIGNsb3NlZFdvcmxkKTsKICB9CgogIEhDb25zdGFudCBhZGRDb25zdGFudFN0cmluZyhTdHJpbmcgc3RyLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBhZGRDb25zdGFudChjb25zdGFudF9zeXN0ZW0uY3JlYXRlU3RyaW5nKHN0ciksIGNsb3NlZFdvcmxkKTsKICB9CgogIEhDb25zdGFudCBhZGRDb25zdGFudFN0cmluZ0Zyb21OYW1lKGpzLk5hbWUgbmFtZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gYWRkQ29uc3RhbnQoCiAgICAgICAgbmV3IEpzTmFtZUNvbnN0YW50VmFsdWUoanMucXVvdGVOYW1lKG5hbWUpKSwgY2xvc2VkV29ybGQpOwogIH0KCiAgSENvbnN0YW50IGFkZENvbnN0YW50Qm9vbChib29sIHZhbHVlLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBhZGRDb25zdGFudChjb25zdGFudF9zeXN0ZW0uY3JlYXRlQm9vbCh2YWx1ZSksIGNsb3NlZFdvcmxkKTsKICB9CgogIEhDb25zdGFudCBhZGRDb25zdGFudE51bGwoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gYWRkQ29uc3RhbnQoY29uc3RhbnRfc3lzdGVtLmNyZWF0ZU51bGwoKSwgY2xvc2VkV29ybGQpOwogIH0KCiAgSENvbnN0YW50IGFkZENvbnN0YW50VW5yZWFjaGFibGUoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICAvLyBBIGNvbnN0YW50IHdpdGggYW4gZW1wdHkgdHlwZSB1c2VkIGFzIHRoZSBISW5zdHJ1Y3Rpb24gb2YgYW4gZXhwcmVzc2lvbgogICAgLy8gaW4gYW4gdW5yZWFjaGFibGUgY29udGV4dC4KICAgIHJldHVybiBhZGRDb25zdGFudChjb25zdCBVbnJlYWNoYWJsZUNvbnN0YW50VmFsdWUoKSwgY2xvc2VkV29ybGQpOwogIH0KCiAgdm9pZCBmaW5hbGl6ZShBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgewogICAgYWRkQmxvY2soZXhpdCk7CiAgICBleGl0Lm9wZW4oKTsKICAgIGV4aXQuY2xvc2UobmV3IEhFeGl0KGRvbWFpbikpOwogICAgYXNzaWduRG9taW5hdG9ycygpOwogIH0KCiAgdm9pZCBhc3NpZ25Eb21pbmF0b3JzKCkgewogICAgLy8gUnVuIHRocm91Z2ggdGhlIGJsb2NrcyBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIGlkcyBzbyB3ZSBhcmUKICAgIC8vIGd1YXJhbnRlZWQgdGhhdCB3ZSBoYXZlIGNvbXB1dGVkIGRvbWluYXRvcnMgZm9yIGFsbCBibG9ja3MKICAgIC8vIGhpZ2hlciB1cCBpbiB0aGUgZG9taW5hdG9yIHRyZWUuCiAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYmxvY2tzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gYmxvY2tzW2ldOwogICAgICBMaXN0PEhCYXNpY0Jsb2NrPiBwcmVkZWNlc3NvcnMgPSBibG9jay5wcmVkZWNlc3NvcnM7CiAgICAgIGlmIChibG9jay5pc0xvb3BIZWFkZXIoKSkgewogICAgICAgIGJsb2NrLmFzc2lnbkNvbW1vbkRvbWluYXRvcihwcmVkZWNlc3NvcnNbMF0pOwogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoaW50IGogPSBwcmVkZWNlc3NvcnMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHsKICAgICAgICAgIGJsb2NrLmFzc2lnbkNvbW1vbkRvbWluYXRvcihwcmVkZWNlc3NvcnNbal0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXNzaWduRG9taW5hdG9yUmFuZ2VzKCk7CiAgfQoKICB2b2lkIGFzc2lnbkRvbWluYXRvclJhbmdlcygpIHsKICAgIC8vIERGUyB3YWxrIG9mIGRvbWluYXRvciB0cmVlIHRvIGFzc2lnbiBkZnMtaW4gYW5kIGRmcy1vdXQgbnVtYmVycyB0byBiYXNpYwogICAgLy8gYmxvY2tzLiBBIGRvbWluYXRvciBoYXMgYSBkZnMtaW4uLmRmcy1vdXQgcmFuZ2UgdGhhdCBpbmNsdWRlcyB0aGUgcmFuZ2UKICAgIC8vIG9mIHRoZSBkb21pbmF0ZWQgYmxvY2suIFNlZSBbSEdyYXBoVmlzaXRvci52aXNpdERvbWluYXRvclRyZWVdIGZvcgogICAgLy8gcmVjdXJzaW9uLWZyZWUgc2NoZW1hLgogICAgX0ZyYW1lIGZyYW1lID0gbmV3IF9GcmFtZShudWxsKTsKICAgIGZyYW1lLmJsb2NrID0gZW50cnk7CiAgICBmcmFtZS5pbmRleCA9IDA7CgogICAgaW50IGRmc051bWJlciA9IDA7CiAgICBmcmFtZS5ibG9jay5kb21pbmF0b3JEZnNJbiA9IGRmc051bWJlcjsKCiAgICB3aGlsZSAoZnJhbWUgIT0gbnVsbCkgewogICAgICBIQmFzaWNCbG9jayBibG9jayA9IGZyYW1lLmJsb2NrOwogICAgICBpbnQgaW5kZXggPSBmcmFtZS5pbmRleDsKICAgICAgaWYgKGluZGV4IDwgYmxvY2suZG9taW5hdGVkQmxvY2tzLmxlbmd0aCkgewogICAgICAgIGZyYW1lLmluZGV4ID0gaW5kZXggKyAxOwogICAgICAgIGZyYW1lID0gZnJhbWUubmV4dCA/Pz0gbmV3IF9GcmFtZShmcmFtZSk7CiAgICAgICAgZnJhbWUuYmxvY2sgPSBibG9jay5kb21pbmF0ZWRCbG9ja3NbaW5kZXhdOwogICAgICAgIGZyYW1lLmluZGV4ID0gMDsKICAgICAgICBmcmFtZS5ibG9jay5kb21pbmF0b3JEZnNJbiA9ICsrZGZzTnVtYmVyOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGJsb2NrLmRvbWluYXRvckRmc091dCA9IGRmc051bWJlcjsKICAgICAgZnJhbWUgPSBmcmFtZS5wcmV2aW91czsKICAgIH0KICB9CgogIGJvb2wgaXNWYWxpZCgpIHsKICAgIEhWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IEhWYWxpZGF0b3IoKTsKICAgIHZhbGlkYXRvci52aXNpdEdyYXBoKHRoaXMpOwogICAgcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkOwogIH0KCiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnSEdyYXBoKCRlbGVtZW50KSc7Cn0KCmNsYXNzIEhCYXNlVmlzaXRvciBleHRlbmRzIEhHcmFwaFZpc2l0b3IgaW1wbGVtZW50cyBIVmlzaXRvciB7CiAgSEJhc2ljQmxvY2sgY3VycmVudEJsb2NrOwoKICBAb3ZlcnJpZGUKICB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgbm9kZSkgewogICAgY3VycmVudEJsb2NrID0gbm9kZTsKCiAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBub2RlLmZpcnN0OwogICAgd2hpbGUgKGluc3RydWN0aW9uICE9IG51bGwpIHsKICAgICAgaW5zdHJ1Y3Rpb24uYWNjZXB0KHRoaXMpOwogICAgICBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLm5leHQ7CiAgICB9CiAgfQoKICB2aXNpdEluc3RydWN0aW9uKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikge30KCiAgdmlzaXRCaW5hcnlBcml0aG1ldGljKEhCaW5hcnlBcml0aG1ldGljIG5vZGUpID0+IHZpc2l0SW52b2tlQmluYXJ5KG5vZGUpOwogIHZpc2l0QmluYXJ5Qml0T3AoSEJpbmFyeUJpdE9wIG5vZGUpID0+IHZpc2l0SW52b2tlQmluYXJ5KG5vZGUpOwogIHZpc2l0SW52b2tlKEhJbnZva2Ugbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICB2aXNpdEludm9rZUJpbmFyeShISW52b2tlQmluYXJ5IG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgdmlzaXRJbnZva2VEeW5hbWljKEhJbnZva2VEeW5hbWljIG5vZGUpID0+IHZpc2l0SW52b2tlKG5vZGUpOwogIHZpc2l0SW52b2tlRHluYW1pY0ZpZWxkKEhJbnZva2VEeW5hbWljRmllbGQgbm9kZSkgPT4gdmlzaXRJbnZva2VEeW5hbWljKG5vZGUpOwogIHZpc2l0SW52b2tlVW5hcnkoSEludm9rZVVuYXJ5IG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgdmlzaXRDb25kaXRpb25hbEJyYW5jaChIQ29uZGl0aW9uYWxCcmFuY2ggbm9kZSkgPT4gdmlzaXRDb250cm9sRmxvdyhub2RlKTsKICB2aXNpdENvbnRyb2xGbG93KEhDb250cm9sRmxvdyBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIHZpc2l0RmllbGRBY2Nlc3MoSEZpZWxkQWNjZXNzIG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgdmlzaXRSZWxhdGlvbmFsKEhSZWxhdGlvbmFsIG5vZGUpID0+IHZpc2l0SW52b2tlQmluYXJ5KG5vZGUpOwoKICBAb3ZlcnJpZGUKICB2aXNpdEFicyhIQWJzIG5vZGUpID0+IHZpc2l0SW52b2tlVW5hcnkobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRBZGQoSEFkZCBub2RlKSA9PiB2aXNpdEJpbmFyeUFyaXRobWV0aWMobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRCaXRBbmQoSEJpdEFuZCBub2RlKSA9PiB2aXNpdEJpbmFyeUJpdE9wKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0Qml0Tm90KEhCaXROb3Qgbm9kZSkgPT4gdmlzaXRJbnZva2VVbmFyeShub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEJpdE9yKEhCaXRPciBub2RlKSA9PiB2aXNpdEJpbmFyeUJpdE9wKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0Qml0WG9yKEhCaXRYb3Igbm9kZSkgPT4gdmlzaXRCaW5hcnlCaXRPcChub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEJvdW5kc0NoZWNrKEhCb3VuZHNDaGVjayBub2RlKSA9PiB2aXNpdENoZWNrKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0QnJlYWsoSEJyZWFrIG5vZGUpID0+IHZpc2l0SnVtcChub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdENvbnRpbnVlKEhDb250aW51ZSBub2RlKSA9PiB2aXNpdEp1bXAobm9kZSk7CiAgdmlzaXRDaGVjayhIQ2hlY2sgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdENvbnN0YW50KEhDb25zdGFudCBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0Q3JlYXRlKEhDcmVhdGUgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdENyZWF0ZUJveChIQ3JlYXRlQm94IG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXREaXZpZGUoSERpdmlkZSBub2RlKSA9PiB2aXNpdEJpbmFyeUFyaXRobWV0aWMobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRFeGl0KEhFeGl0IG5vZGUpID0+IHZpc2l0Q29udHJvbEZsb3cobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRFeGl0VHJ5KEhFeGl0VHJ5IG5vZGUpID0+IHZpc2l0Q29udHJvbEZsb3cobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRGaWVsZEdldChIRmllbGRHZXQgbm9kZSkgPT4gdmlzaXRGaWVsZEFjY2Vzcyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEZpZWxkU2V0KEhGaWVsZFNldCBub2RlKSA9PiB2aXNpdEZpZWxkQWNjZXNzKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0Rm9yZWlnbkNvZGUoSEZvcmVpZ25Db2RlIG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRHZXRMZW5ndGgoSEdldExlbmd0aCBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0R290byhIR290byBub2RlKSA9PiB2aXNpdENvbnRyb2xGbG93KG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0R3JlYXRlcihIR3JlYXRlciBub2RlKSA9PiB2aXNpdFJlbGF0aW9uYWwobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRHcmVhdGVyRXF1YWwoSEdyZWF0ZXJFcXVhbCBub2RlKSA9PiB2aXNpdFJlbGF0aW9uYWwobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRJZGVudGl0eShISWRlbnRpdHkgbm9kZSkgPT4gdmlzaXRSZWxhdGlvbmFsKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0SWYoSElmIG5vZGUpID0+IHZpc2l0Q29uZGl0aW9uYWxCcmFuY2gobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRJbmRleChISW5kZXggbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEluZGV4QXNzaWduKEhJbmRleEFzc2lnbiBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0SW50ZXJjZXB0b3IoSEludGVyY2VwdG9yIG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRJbnZva2VDbG9zdXJlKEhJbnZva2VDbG9zdXJlIG5vZGUpID0+IHZpc2l0SW52b2tlRHluYW1pYyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEludm9rZUNvbnN0cnVjdG9yQm9keShISW52b2tlQ29uc3RydWN0b3JCb2R5IG5vZGUpID0+CiAgICAgIHZpc2l0SW52b2tlU3RhdGljKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0SW52b2tlR2VuZXJhdG9yQm9keShISW52b2tlR2VuZXJhdG9yQm9keSBub2RlKSA9PgogICAgICB2aXNpdEludm9rZVN0YXRpYyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEludm9rZUR5bmFtaWNNZXRob2QoSEludm9rZUR5bmFtaWNNZXRob2Qgbm9kZSkgPT4KICAgICAgdmlzaXRJbnZva2VEeW5hbWljKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0SW52b2tlRHluYW1pY0dldHRlcihISW52b2tlRHluYW1pY0dldHRlciBub2RlKSA9PgogICAgICB2aXNpdEludm9rZUR5bmFtaWNGaWVsZChub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEludm9rZUR5bmFtaWNTZXR0ZXIoSEludm9rZUR5bmFtaWNTZXR0ZXIgbm9kZSkgPT4KICAgICAgdmlzaXRJbnZva2VEeW5hbWljRmllbGQobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRJbnZva2VTdGF0aWMoSEludm9rZVN0YXRpYyBub2RlKSA9PiB2aXNpdEludm9rZShub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEludm9rZVN1cGVyKEhJbnZva2VTdXBlciBub2RlKSA9PiB2aXNpdEludm9rZVN0YXRpYyhub2RlKTsKICB2aXNpdEp1bXAoSEp1bXAgbm9kZSkgPT4gdmlzaXRDb250cm9sRmxvdyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdExhenlTdGF0aWMoSExhenlTdGF0aWMgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdExlc3MoSExlc3Mgbm9kZSkgPT4gdmlzaXRSZWxhdGlvbmFsKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0TGVzc0VxdWFsKEhMZXNzRXF1YWwgbm9kZSkgPT4gdmlzaXRSZWxhdGlvbmFsKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0TGl0ZXJhbExpc3QoSExpdGVyYWxMaXN0IG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgdmlzaXRMb2NhbEFjY2VzcyhITG9jYWxBY2Nlc3Mgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdExvY2FsR2V0KEhMb2NhbEdldCBub2RlKSA9PiB2aXNpdExvY2FsQWNjZXNzKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0TG9jYWxTZXQoSExvY2FsU2V0IG5vZGUpID0+IHZpc2l0TG9jYWxBY2Nlc3Mobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRMb2NhbFZhbHVlKEhMb2NhbFZhbHVlIG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRMb29wQnJhbmNoKEhMb29wQnJhbmNoIG5vZGUpID0+IHZpc2l0Q29uZGl0aW9uYWxCcmFuY2gobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXROZWdhdGUoSE5lZ2F0ZSBub2RlKSA9PiB2aXNpdEludm9rZVVuYXJ5KG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0Tm90KEhOb3Qgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdE9uZVNob3RJbnRlcmNlcHRvcihIT25lU2hvdEludGVyY2VwdG9yIG5vZGUpID0+IHZpc2l0SW52b2tlRHluYW1pYyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFBoaShIUGhpIG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRNdWx0aXBseShITXVsdGlwbHkgbm9kZSkgPT4gdmlzaXRCaW5hcnlBcml0aG1ldGljKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0UGFyYW1ldGVyVmFsdWUoSFBhcmFtZXRlclZhbHVlIG5vZGUpID0+IHZpc2l0TG9jYWxWYWx1ZShub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFJhbmdlQ29udmVyc2lvbihIUmFuZ2VDb252ZXJzaW9uIG5vZGUpID0+IHZpc2l0Q2hlY2sobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRSZWFkTW9kaWZ5V3JpdGUoSFJlYWRNb2RpZnlXcml0ZSBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0UmVmKEhSZWYgbm9kZSkgPT4gbm9kZS52YWx1ZS5hY2NlcHQodGhpcyk7CiAgQG92ZXJyaWRlCiAgdmlzaXRSZW1haW5kZXIoSFJlbWFpbmRlciBub2RlKSA9PiB2aXNpdEJpbmFyeUFyaXRobWV0aWMobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRSZXR1cm4oSFJldHVybiBub2RlKSA9PiB2aXNpdENvbnRyb2xGbG93KG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0U2hpZnRMZWZ0KEhTaGlmdExlZnQgbm9kZSkgPT4gdmlzaXRCaW5hcnlCaXRPcChub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFNoaWZ0UmlnaHQoSFNoaWZ0UmlnaHQgbm9kZSkgPT4gdmlzaXRCaW5hcnlCaXRPcChub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFN1YnRyYWN0KEhTdWJ0cmFjdCBub2RlKSA9PiB2aXNpdEJpbmFyeUFyaXRobWV0aWMobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRTd2l0Y2goSFN3aXRjaCBub2RlKSA9PiB2aXNpdENvbnRyb2xGbG93KG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0U3RhdGljKEhTdGF0aWMgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY1N0b3JlKEhTdGF0aWNTdG9yZSBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0U3RyaW5nQ29uY2F0KEhTdHJpbmdDb25jYXQgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFN0cmluZ2lmeShIU3RyaW5naWZ5IG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRUaGlzKEhUaGlzIG5vZGUpID0+IHZpc2l0UGFyYW1ldGVyVmFsdWUobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRUaHJvdyhIVGhyb3cgbm9kZSkgPT4gdmlzaXRDb250cm9sRmxvdyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFRocm93RXhwcmVzc2lvbihIVGhyb3dFeHByZXNzaW9uIG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRUcnVuY2F0aW5nRGl2aWRlKEhUcnVuY2F0aW5nRGl2aWRlIG5vZGUpID0+IHZpc2l0QmluYXJ5QXJpdGhtZXRpYyhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdFRyeShIVHJ5IG5vZGUpID0+IHZpc2l0Q29udHJvbEZsb3cobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRJcyhISXMgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdExhdGVWYWx1ZShITGF0ZVZhbHVlIG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRJc1ZpYUludGVyY2VwdG9yKEhJc1ZpYUludGVyY2VwdG9yIG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRUeXBlQ29udmVyc2lvbihIVHlwZUNvbnZlcnNpb24gbm9kZSkgPT4gdmlzaXRDaGVjayhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdEJvb2xDb252ZXJzaW9uKEhCb29sQ29udmVyc2lvbiBub2RlKSA9PiB2aXNpdENoZWNrKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0UHJpbWl0aXZlQ2hlY2soSFByaW1pdGl2ZUNoZWNrIG5vZGUpID0+IHZpc2l0Q2hlY2sobm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRUeXBlS25vd24oSFR5cGVLbm93biBub2RlKSA9PiB2aXNpdENoZWNrKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0QXdhaXQoSEF3YWl0IG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRZaWVsZChIWWllbGQgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKCiAgQG92ZXJyaWRlCiAgdmlzaXRUeXBlSW5mb1JlYWRSYXcoSFR5cGVJbmZvUmVhZFJhdyBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0VHlwZUluZm9SZWFkVmFyaWFibGUoSFR5cGVJbmZvUmVhZFZhcmlhYmxlIG5vZGUpID0+CiAgICAgIHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CgogIEBvdmVycmlkZQogIHZpc2l0VHlwZUluZm9FeHByZXNzaW9uKEhUeXBlSW5mb0V4cHJlc3Npb24gbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKCiAgQG92ZXJyaWRlCiAgdmlzaXRJc1Rlc3QoSElzVGVzdCBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0QXNDaGVjayhIQXNDaGVjayBub2RlKSA9PiB2aXNpdENoZWNrKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0QXNDaGVja1NpbXBsZShIQXNDaGVja1NpbXBsZSBub2RlKSA9PiB2aXNpdENoZWNrKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0U3VidHlwZUNoZWNrKEhTdWJ0eXBlQ2hlY2sgbm9kZSkgPT4gdmlzaXRDaGVjayhub2RlKTsKICBAb3ZlcnJpZGUKICB2aXNpdExvYWRUeXBlKEhMb2FkVHlwZSBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0SW5zdGFuY2VFbnZpcm9ubWVudChISW5zdGFuY2VFbnZpcm9ubWVudCBub2RlKSA9PiB2aXNpdEluc3RydWN0aW9uKG5vZGUpOwogIEBvdmVycmlkZQogIHZpc2l0VHlwZUV2YWwoSFR5cGVFdmFsIG5vZGUpID0+IHZpc2l0SW5zdHJ1Y3Rpb24obm9kZSk7CiAgQG92ZXJyaWRlCiAgdmlzaXRUeXBlQmluZChIVHlwZUJpbmQgbm9kZSkgPT4gdmlzaXRJbnN0cnVjdGlvbihub2RlKTsKfQoKY2xhc3MgU3ViR3JhcGggewogIC8vIFRoZSBmaXJzdCBhbmQgbGFzdCBibG9jayBvZiB0aGUgc3ViLWdyYXBoLgogIGZpbmFsIEhCYXNpY0Jsb2NrIHN0YXJ0OwogIGZpbmFsIEhCYXNpY0Jsb2NrIGVuZDsKCiAgY29uc3QgU3ViR3JhcGgodGhpcy5zdGFydCwgdGhpcy5lbmQpOwoKICBib29sIGNvbnRhaW5zKEhCYXNpY0Jsb2NrIGJsb2NrKSB7CiAgICBhc3NlcnQoc3RhcnQgIT0gbnVsbCk7CiAgICBhc3NlcnQoZW5kICE9IG51bGwpOwogICAgYXNzZXJ0KGJsb2NrICE9IG51bGwpOwogICAgcmV0dXJuIHN0YXJ0LmlkIDw9IGJsb2NrLmlkICYmIGJsb2NrLmlkIDw9IGVuZC5pZDsKICB9Cn0KCmNsYXNzIFN1YkV4cHJlc3Npb24gZXh0ZW5kcyBTdWJHcmFwaCB7CiAgY29uc3QgU3ViRXhwcmVzc2lvbihIQmFzaWNCbG9jayBzdGFydCwgSEJhc2ljQmxvY2sgZW5kKSA6IHN1cGVyKHN0YXJ0LCBlbmQpOwoKICAvLy8gRmluZCB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24gaWYgdGhpcyBzdWItZXhwcmVzc2lvbiBpcyBhIGNvbmRpdGlvbi4KICBISW5zdHJ1Y3Rpb24gZ2V0IGNvbmRpdGlvbkV4cHJlc3Npb24gewogICAgSEluc3RydWN0aW9uIGxhc3QgPSBlbmQubGFzdDsKICAgIGlmIChsYXN0IGlzIEhDb25kaXRpb25hbEJyYW5jaCB8fCBsYXN0IGlzIEhTd2l0Y2gpIHJldHVybiBsYXN0LmlucHV0c1swXTsKICAgIHJldHVybiBudWxsOwogIH0KfQoKY2xhc3MgSEluc3RydWN0aW9uTGlzdCB7CiAgSEluc3RydWN0aW9uIGZpcnN0ID0gbnVsbDsKICBISW5zdHJ1Y3Rpb24gbGFzdCA9IG51bGw7CgogIGJvb2wgZ2V0IGlzRW1wdHkgewogICAgcmV0dXJuIGZpcnN0ID09IG51bGw7CiAgfQoKICB2b2lkIGludGVybmFsQWRkQWZ0ZXIoSEluc3RydWN0aW9uIGN1cnNvciwgSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGlzRW1wdHkpOwogICAgICBmaXJzdCA9IGxhc3QgPSBpbnN0cnVjdGlvbjsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKGN1cnNvciwgbGFzdCkpIHsKICAgICAgbGFzdC5uZXh0ID0gaW5zdHJ1Y3Rpb247CiAgICAgIGluc3RydWN0aW9uLnByZXZpb3VzID0gbGFzdDsKICAgICAgbGFzdCA9IGluc3RydWN0aW9uOwogICAgfSBlbHNlIHsKICAgICAgaW5zdHJ1Y3Rpb24ucHJldmlvdXMgPSBjdXJzb3I7CiAgICAgIGluc3RydWN0aW9uLm5leHQgPSBjdXJzb3IubmV4dDsKICAgICAgY3Vyc29yLm5leHQucHJldmlvdXMgPSBpbnN0cnVjdGlvbjsKICAgICAgY3Vyc29yLm5leHQgPSBpbnN0cnVjdGlvbjsKICAgIH0KICB9CgogIHZvaWQgaW50ZXJuYWxBZGRCZWZvcmUoSEluc3RydWN0aW9uIGN1cnNvciwgSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGlzRW1wdHkpOwogICAgICBmaXJzdCA9IGxhc3QgPSBpbnN0cnVjdGlvbjsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKGN1cnNvciwgZmlyc3QpKSB7CiAgICAgIGZpcnN0LnByZXZpb3VzID0gaW5zdHJ1Y3Rpb247CiAgICAgIGluc3RydWN0aW9uLm5leHQgPSBmaXJzdDsKICAgICAgZmlyc3QgPSBpbnN0cnVjdGlvbjsKICAgIH0gZWxzZSB7CiAgICAgIGluc3RydWN0aW9uLm5leHQgPSBjdXJzb3I7CiAgICAgIGluc3RydWN0aW9uLnByZXZpb3VzID0gY3Vyc29yLnByZXZpb3VzOwogICAgICBjdXJzb3IucHJldmlvdXMubmV4dCA9IGluc3RydWN0aW9uOwogICAgICBjdXJzb3IucHJldmlvdXMgPSBpbnN0cnVjdGlvbjsKICAgIH0KICB9CgogIHZvaWQgZGV0YWNoKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgYXNzZXJ0KF90cnVuY2F0ZWRDb250YWluc0ZvckFzc2VydChpbnN0cnVjdGlvbikpOwogICAgYXNzZXJ0KGluc3RydWN0aW9uLmlzSW5CYXNpY0Jsb2NrKCkpOwogICAgaWYgKGluc3RydWN0aW9uLnByZXZpb3VzID09IG51bGwpIHsKICAgICAgZmlyc3QgPSBpbnN0cnVjdGlvbi5uZXh0OwogICAgfSBlbHNlIHsKICAgICAgaW5zdHJ1Y3Rpb24ucHJldmlvdXMubmV4dCA9IGluc3RydWN0aW9uLm5leHQ7CiAgICB9CiAgICBpZiAoaW5zdHJ1Y3Rpb24ubmV4dCA9PSBudWxsKSB7CiAgICAgIGxhc3QgPSBpbnN0cnVjdGlvbi5wcmV2aW91czsKICAgIH0gZWxzZSB7CiAgICAgIGluc3RydWN0aW9uLm5leHQucHJldmlvdXMgPSBpbnN0cnVjdGlvbi5wcmV2aW91czsKICAgIH0KICAgIGluc3RydWN0aW9uLnByZXZpb3VzID0gbnVsbDsKICAgIGluc3RydWN0aW9uLm5leHQgPSBudWxsOwogIH0KCiAgdm9pZCByZW1vdmUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBhc3NlcnQoaW5zdHJ1Y3Rpb24udXNlZEJ5LmlzRW1wdHkpOwogICAgZGV0YWNoKGluc3RydWN0aW9uKTsKICB9CgogIC8vLyBMaW5lYXIgc2VhcmNoIGZvciBbaW5zdHJ1Y3Rpb25dLgogIGJvb2wgY29udGFpbnMoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBISW5zdHJ1Y3Rpb24gY3Vyc29yID0gZmlyc3Q7CiAgICB3aGlsZSAoY3Vyc29yICE9IG51bGwpIHsKICAgICAgaWYgKGlkZW50aWNhbChjdXJzb3IsIGluc3RydWN0aW9uKSkgcmV0dXJuIHRydWU7CiAgICAgIGN1cnNvciA9IGN1cnNvci5uZXh0OwogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBMaW5lYXIgc2VhcmNoIGZvciBbaW5zdHJ1Y3Rpb25dLCB1cCB0byBhIGxpbWl0IG9mIDEwMC4gUmV0dXJucyB3aGV0aGVyCiAgLy8vIHRoZSBpbnN0cnVjdGlvbiBpcyBmb3VuZCBvciB0aGUgbGlzdCBpcyB0b28gYmlnLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgZm9yIGFzc2VydGlvbnMgb25seTogc29tZSB0ZXN0cyBoYXZlIHBhdGhvbG9naWNhbCBjYXNlcyB3aGVyZQogIC8vLyB0aGUgYmFzaWMgYmxvY2tzIGFyZSBodWdlICg1MEsgbm9kZXMhKSwgYW5kIHdlIGZvdW5kIHRoYXQgY2hlY2tpbmcgZm9yCiAgLy8vIFtjb250YWluc10gd2l0aGluIG91ciBhc3NlcnRpb25zIG1hZGUgY29tcGlsYXRpb24gcmVhbGx5IHNsb3cuCiAgYm9vbCBfdHJ1bmNhdGVkQ29udGFpbnNGb3JBc3NlcnQoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBISW5zdHJ1Y3Rpb24gY3Vyc29yID0gZmlyc3Q7CiAgICBpbnQgY291bnQgPSAwOwogICAgd2hpbGUgKGN1cnNvciAhPSBudWxsKSB7CiAgICAgIGNvdW50Kys7CiAgICAgIGlmIChjb3VudCA+IDEwMCkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChpZGVudGljYWwoY3Vyc29yLCBpbnN0cnVjdGlvbikpIHJldHVybiB0cnVlOwogICAgICBjdXJzb3IgPSBjdXJzb3IubmV4dDsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgpjbGFzcyBIQmFzaWNCbG9jayBleHRlbmRzIEhJbnN0cnVjdGlvbkxpc3QgewogIC8vIFRoZSBbaWRdIG11c3QgYmUgc3VjaCB0aGF0IGFueSBzdWNjZXNzb3IncyBpZCBpcyBncmVhdGVyIHRoYW4KICAvLyB0aGlzIFtpZF0uIFRoZSBleGNlcHRpb24gYXJlIGJhY2stZWRnZXMuCiAgaW50IGlkOwoKICBzdGF0aWMgY29uc3QgaW50IFNUQVRVU19ORVcgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgU1RBVFVTX09QRU4gPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgU1RBVFVTX0NMT1NFRCA9IDI7CiAgaW50IHN0YXR1cyA9IFNUQVRVU19ORVc7CgogIEhJbnN0cnVjdGlvbkxpc3QgcGhpczsKCiAgSExvb3BJbmZvcm1hdGlvbiBsb29wSW5mb3JtYXRpb24gPSBudWxsOwogIEhCbG9ja0Zsb3cgYmxvY2tGbG93ID0gbnVsbDsKICBIQmFzaWNCbG9jayBwYXJlbnRMb29wSGVhZGVyID0gbnVsbDsKICBib29sIGlzTGl2ZSA9IHRydWU7CgogIGZpbmFsIExpc3Q8SEJhc2ljQmxvY2s+IHByZWRlY2Vzc29yczsKICBMaXN0PEhCYXNpY0Jsb2NrPiBzdWNjZXNzb3JzOwoKICBIQmFzaWNCbG9jayBkb21pbmF0b3IgPSBudWxsOwogIGZpbmFsIExpc3Q8SEJhc2ljQmxvY2s+IGRvbWluYXRlZEJsb2NrczsKICBpbnQgZG9taW5hdG9yRGZzSW47CiAgaW50IGRvbWluYXRvckRmc091dDsKCiAgSEJhc2ljQmxvY2soKSA6IHRoaXMud2l0aElkKG51bGwpOwogIEhCYXNpY0Jsb2NrLndpdGhJZCh0aGlzLmlkKQogICAgICA6IHBoaXMgPSBuZXcgSEluc3RydWN0aW9uTGlzdCgpLAogICAgICAgIHByZWRlY2Vzc29ycyA9IDxIQmFzaWNCbG9jaz5bXSwKICAgICAgICBzdWNjZXNzb3JzID0gY29uc3QgPEhCYXNpY0Jsb2NrPltdLAogICAgICAgIGRvbWluYXRlZEJsb2NrcyA9IDxIQmFzaWNCbG9jaz5bXTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBpZDsKCiAgYm9vbCBpc05ldygpID0+IHN0YXR1cyA9PSBTVEFUVVNfTkVXOwogIGJvb2wgaXNPcGVuKCkgPT4gc3RhdHVzID09IFNUQVRVU19PUEVOOwogIGJvb2wgaXNDbG9zZWQoKSA9PiBzdGF0dXMgPT0gU1RBVFVTX0NMT1NFRDsKCiAgYm9vbCBpc0xvb3BIZWFkZXIoKSB7CiAgICByZXR1cm4gbG9vcEluZm9ybWF0aW9uICE9IG51bGw7CiAgfQoKICB2b2lkIHNldEJsb2NrRmxvdyhIQmxvY2tJbmZvcm1hdGlvbiBibG9ja0luZm8sIEhCYXNpY0Jsb2NrIGNvbnRpbnVhdGlvbikgewogICAgYmxvY2tGbG93ID0gbmV3IEhCbG9ja0Zsb3coYmxvY2tJbmZvLCBjb250aW51YXRpb24pOwogIH0KCiAgYm9vbCBpc0xhYmVsZWRCbG9jaygpID0+CiAgICAgIGJsb2NrRmxvdyAhPSBudWxsICYmIGJsb2NrRmxvdy5ib2R5IGlzIEhMYWJlbGVkQmxvY2tJbmZvcm1hdGlvbjsKCiAgSEJhc2ljQmxvY2sgZ2V0IGVuY2xvc2luZ0xvb3BIZWFkZXIgewogICAgaWYgKGlzTG9vcEhlYWRlcigpKSByZXR1cm4gdGhpczsKICAgIHJldHVybiBwYXJlbnRMb29wSGVhZGVyOwogIH0KCiAgdm9pZCBvcGVuKCkgewogICAgYXNzZXJ0KGlzTmV3KCkpOwogICAgc3RhdHVzID0gU1RBVFVTX09QRU47CiAgfQoKICB2b2lkIGNsb3NlKEhDb250cm9sRmxvdyBlbmQpIHsKICAgIGFzc2VydChpc09wZW4oKSk7CiAgICBhZGRBZnRlcihsYXN0LCBlbmQpOwogICAgc3RhdHVzID0gU1RBVFVTX0NMT1NFRDsKICB9CgogIHZvaWQgYWRkQXRFbnRyeShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGFzc2VydChpbnN0cnVjdGlvbiBpcyEgSFBoaSk7CiAgICBpbnRlcm5hbEFkZEJlZm9yZShmaXJzdCwgaW5zdHJ1Y3Rpb24pOwogICAgaW5zdHJ1Y3Rpb24ubm90aWZ5QWRkZWRUb0Jsb2NrKHRoaXMpOwogIH0KCiAgdm9pZCBhZGRBdEV4aXQoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBhc3NlcnQoaXNDbG9zZWQoKSk7CiAgICBhc3NlcnQobGFzdCBpcyBIQ29udHJvbEZsb3cpOwogICAgYXNzZXJ0KGluc3RydWN0aW9uIGlzISBIUGhpKTsKICAgIGludGVybmFsQWRkQmVmb3JlKGxhc3QsIGluc3RydWN0aW9uKTsKICAgIGluc3RydWN0aW9uLm5vdGlmeUFkZGVkVG9CbG9jayh0aGlzKTsKICB9CgogIHZvaWQgbW92ZUF0RXhpdChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGFzc2VydChpbnN0cnVjdGlvbiBpcyEgSFBoaSk7CiAgICBhc3NlcnQoaW5zdHJ1Y3Rpb24uaXNJbkJhc2ljQmxvY2soKSk7CiAgICBhc3NlcnQoaXNDbG9zZWQoKSk7CiAgICBhc3NlcnQobGFzdCBpcyBIQ29udHJvbEZsb3cpOwogICAgaW50ZXJuYWxBZGRCZWZvcmUobGFzdCwgaW5zdHJ1Y3Rpb24pOwogICAgaW5zdHJ1Y3Rpb24uYmxvY2sgPSB0aGlzOwogICAgYXNzZXJ0KGlzVmFsaWQoKSk7CiAgfQoKICB2b2lkIGFkZChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGFzc2VydChpbnN0cnVjdGlvbiBpcyEgSENvbnRyb2xGbG93KTsKICAgIGFzc2VydChpbnN0cnVjdGlvbiBpcyEgSFBoaSk7CiAgICBpbnRlcm5hbEFkZEFmdGVyKGxhc3QsIGluc3RydWN0aW9uKTsKICAgIGluc3RydWN0aW9uLm5vdGlmeUFkZGVkVG9CbG9jayh0aGlzKTsKICB9CgogIHZvaWQgYWRkUGhpKEhQaGkgcGhpKSB7CiAgICBhc3NlcnQocGhpLmlucHV0cy5sZW5ndGggPT0gMCB8fCBwaGkuaW5wdXRzLmxlbmd0aCA9PSBwcmVkZWNlc3NvcnMubGVuZ3RoKTsKICAgIGFzc2VydChwaGkuYmxvY2sgPT0gbnVsbCk7CiAgICBwaGlzLmludGVybmFsQWRkQWZ0ZXIocGhpcy5sYXN0LCBwaGkpOwogICAgcGhpLm5vdGlmeUFkZGVkVG9CbG9jayh0aGlzKTsKICB9CgogIHZvaWQgcmVtb3ZlUGhpKEhQaGkgcGhpKSB7CiAgICBwaGlzLnJlbW92ZShwaGkpOwogICAgYXNzZXJ0KHBoaS5ibG9jayA9PSB0aGlzKTsKICAgIHBoaS5ub3RpZnlSZW1vdmVkRnJvbUJsb2NrKCk7CiAgfQoKICB2b2lkIGFkZEFmdGVyKEhJbnN0cnVjdGlvbiBjdXJzb3IsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgYXNzZXJ0KGN1cnNvciBpcyEgSFBoaSk7CiAgICBhc3NlcnQoaW5zdHJ1Y3Rpb24gaXMhIEhQaGkpOwogICAgYXNzZXJ0KGlzT3BlbigpIHx8IGlzQ2xvc2VkKCkpOwogICAgaW50ZXJuYWxBZGRBZnRlcihjdXJzb3IsIGluc3RydWN0aW9uKTsKICAgIGluc3RydWN0aW9uLm5vdGlmeUFkZGVkVG9CbG9jayh0aGlzKTsKICB9CgogIHZvaWQgYWRkQmVmb3JlKEhJbnN0cnVjdGlvbiBjdXJzb3IsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgYXNzZXJ0KGN1cnNvciBpcyEgSFBoaSk7CiAgICBhc3NlcnQoaW5zdHJ1Y3Rpb24gaXMhIEhQaGkpOwogICAgYXNzZXJ0KGlzT3BlbigpIHx8IGlzQ2xvc2VkKCkpOwogICAgaW50ZXJuYWxBZGRCZWZvcmUoY3Vyc29yLCBpbnN0cnVjdGlvbik7CiAgICBpbnN0cnVjdGlvbi5ub3RpZnlBZGRlZFRvQmxvY2sodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGFzc2VydChpc09wZW4oKSB8fCBpc0Nsb3NlZCgpKTsKICAgIGFzc2VydChpbnN0cnVjdGlvbiBpcyEgSFBoaSk7CiAgICBzdXBlci5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogICAgYXNzZXJ0KGluc3RydWN0aW9uLmJsb2NrID09IHRoaXMpOwogICAgaW5zdHJ1Y3Rpb24ubm90aWZ5UmVtb3ZlZEZyb21CbG9jaygpOwogIH0KCiAgdm9pZCBhZGRTdWNjZXNzb3IoSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGlmIChzdWNjZXNzb3JzLmlzRW1wdHkpIHsKICAgICAgc3VjY2Vzc29ycyA9IFtibG9ja107CiAgICB9IGVsc2UgewogICAgICBzdWNjZXNzb3JzLmFkZChibG9jayk7CiAgICB9CiAgICBibG9jay5wcmVkZWNlc3NvcnMuYWRkKHRoaXMpOwogIH0KCiAgdm9pZCBwb3N0UHJvY2Vzc0xvb3BIZWFkZXIoKSB7CiAgICBhc3NlcnQoaXNMb29wSGVhZGVyKCkpOwogICAgLy8gT25seSB0aGUgZmlyc3QgZW50cnkgaW50byB0aGUgbG9vcCBpcyBmcm9tIG91dHNpZGUgdGhlCiAgICAvLyBsb29wLiBBbGwgb3RoZXIgZW50cmllcyBtdXN0IGJlIGJhY2sgZWRnZXMuCiAgICBmb3IgKGludCBpID0gMSwgbGVuZ3RoID0gcHJlZGVjZXNzb3JzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGxvb3BJbmZvcm1hdGlvbi5hZGRCYWNrRWRnZShwcmVkZWNlc3NvcnNbaV0pOwogICAgfQogIH0KCiAgLy8vIFJld3JpdGVzIGFsbCB1c2VzIG9mIHRoZSBbZnJvbV0gaW5zdHJ1Y3Rpb24gdG8gdXNpbmcgdGhlIFt0b10KICAvLy8gaW5zdHJ1Y3Rpb24gaW5zdGVhZC4KICB2b2lkIHJld3JpdGUoSEluc3RydWN0aW9uIGZyb20sIEhJbnN0cnVjdGlvbiB0bykgewogICAgZm9yIChISW5zdHJ1Y3Rpb24gdXNlIGluIGZyb20udXNlZEJ5KSB7CiAgICAgIHVzZS5yZXdyaXRlSW5wdXQoZnJvbSwgdG8pOwogICAgfQogICAgdG8udXNlZEJ5LmFkZEFsbChmcm9tLnVzZWRCeSk7CiAgICBmcm9tLnVzZWRCeS5jbGVhcigpOwogIH0KCiAgLy8vIFJld3JpdGVzIGFsbCB1c2VzIG9mIHRoZSBbZnJvbV0gaW5zdHJ1Y3Rpb24gdG8gdXNpbmcgZWl0aGVyIHRoZQogIC8vLyBbdG9dIGluc3RydWN0aW9uLCBvciBhIFtIQ2hlY2tdIGluc3RydWN0aW9uIHRoYXQgaGFzIGJldHRlciB0eXBlCiAgLy8vIGluZm9ybWF0aW9uIG9uIFt0b10sIGFuZCB0aGF0IGRvbWluYXRlcyB0aGUgdXNlci4KICB2b2lkIHJld3JpdGVXaXRoQmV0dGVyVXNlcihISW5zdHJ1Y3Rpb24gZnJvbSwgSEluc3RydWN0aW9uIHRvKSB7CiAgICAvLyBCVUcoMTE4NDEpOiBUdXJuIHRoaXMgbWV0aG9kIGludG8gYSBwaGFzZSB0byBiZSBydW4gYWZ0ZXIgR1ZOIHBoYXNlcy4KICAgIExpbms8SENoZWNrPiBiZXR0ZXIgPSBjb25zdCBMaW5rPEhDaGVjaz4oKTsKICAgIGZvciAoSEluc3RydWN0aW9uIHVzZXIgaW4gdG8udXNlZEJ5KSB7CiAgICAgIGlmICh1c2VyID09IGZyb20gfHwgdXNlciBpcyEgSENoZWNrKSBjb250aW51ZTsKICAgICAgSENoZWNrIGNoZWNrID0gdXNlcjsKICAgICAgaWYgKGNoZWNrLmNoZWNrZWRJbnB1dCA9PSB0bykgewogICAgICAgIGJldHRlciA9IGJldHRlci5wcmVwZW5kKHVzZXIpOwogICAgICB9CiAgICB9CgogICAgaWYgKGJldHRlci5pc0VtcHR5KSByZXR1cm4gcmV3cml0ZShmcm9tLCB0byk7CgogICAgTDE6CiAgICBmb3IgKEhJbnN0cnVjdGlvbiB1c2VyIGluIGZyb20udXNlZEJ5KSB7CiAgICAgIGZvciAoSENoZWNrIGNoZWNrIGluIGJldHRlcikgewogICAgICAgIGlmIChjaGVjay5kb21pbmF0ZXModXNlcikpIHsKICAgICAgICAgIHVzZXIucmV3cml0ZUlucHV0KGZyb20sIGNoZWNrKTsKICAgICAgICAgIGNoZWNrLnVzZWRCeS5hZGQodXNlcik7CiAgICAgICAgICBjb250aW51ZSBMMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdXNlci5yZXdyaXRlSW5wdXQoZnJvbSwgdG8pOwogICAgICB0by51c2VkQnkuYWRkKHVzZXIpOwogICAgfQogICAgZnJvbS51c2VkQnkuY2xlYXIoKTsKICB9CgogIGJvb2wgaXNFeGl0QmxvY2soKSB7CiAgICByZXR1cm4gaWRlbnRpY2FsKGZpcnN0LCBsYXN0KSAmJiBmaXJzdCBpcyBIRXhpdDsKICB9CgogIHZvaWQgYWRkRG9taW5hdGVkQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGFzc2VydChpc0Nsb3NlZCgpKTsKICAgIGFzc2VydChpZCAhPSBudWxsICYmIGJsb2NrLmlkICE9IG51bGwpOwogICAgYXNzZXJ0KGRvbWluYXRlZEJsb2Nrcy5pbmRleE9mKGJsb2NrKSA8IDApOwogICAgLy8gS2VlcCB0aGUgbGlzdCBvZiBkb21pbmF0ZWQgYmxvY2tzIHNvcnRlZCBzdWNoIHRoYXQgaWYgdGhlcmUgYXJlIHR3bwogICAgLy8gc3VjY2VlZGluZyBibG9ja3MgaW4gdGhlIGxpc3QsIHRoZSBwcmVkZWNlc3NvciBpcyBiZWZvcmUgdGhlIHN1Y2Nlc3Nvci4KICAgIC8vIEFzc3VtZSB0aGF0IHdlIGFkZCB0aGUgZG9taW5hdGVkIGJsb2NrcyBpbiB0aGUgcmlnaHQgb3JkZXIuCiAgICBpbnQgaW5kZXggPSBkb21pbmF0ZWRCbG9ja3MubGVuZ3RoOwogICAgd2hpbGUgKGluZGV4ID4gMCAmJiBkb21pbmF0ZWRCbG9ja3NbaW5kZXggLSAxXS5pZCA+IGJsb2NrLmlkKSB7CiAgICAgIGluZGV4LS07CiAgICB9CiAgICBpZiAoaW5kZXggPT0gZG9taW5hdGVkQmxvY2tzLmxlbmd0aCkgewogICAgICBkb21pbmF0ZWRCbG9ja3MuYWRkKGJsb2NrKTsKICAgIH0gZWxzZSB7CiAgICAgIGRvbWluYXRlZEJsb2Nrcy5pbnNlcnQoaW5kZXgsIGJsb2NrKTsKICAgIH0KICAgIGFzc2VydChibG9jay5kb21pbmF0b3IgPT0gbnVsbCk7CiAgICBibG9jay5kb21pbmF0b3IgPSB0aGlzOwogIH0KCiAgdm9pZCByZW1vdmVEb21pbmF0ZWRCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgYXNzZXJ0KGlzQ2xvc2VkKCkpOwogICAgYXNzZXJ0KGlkICE9IG51bGwgJiYgYmxvY2suaWQgIT0gbnVsbCk7CiAgICBpbnQgaW5kZXggPSBkb21pbmF0ZWRCbG9ja3MuaW5kZXhPZihibG9jayk7CiAgICBhc3NlcnQoaW5kZXggPj0gMCk7CiAgICBpZiAoaW5kZXggPT0gZG9taW5hdGVkQmxvY2tzLmxlbmd0aCAtIDEpIHsKICAgICAgZG9taW5hdGVkQmxvY2tzLnJlbW92ZUxhc3QoKTsKICAgIH0gZWxzZSB7CiAgICAgIGRvbWluYXRlZEJsb2Nrcy5yZW1vdmVSYW5nZShpbmRleCwgaW5kZXggKyAxKTsKICAgIH0KICAgIGFzc2VydChpZGVudGljYWwoYmxvY2suZG9taW5hdG9yLCB0aGlzKSk7CiAgICBibG9jay5kb21pbmF0b3IgPSBudWxsOwogIH0KCiAgdm9pZCBhc3NpZ25Db21tb25Eb21pbmF0b3IoSEJhc2ljQmxvY2sgcHJlZGVjZXNzb3IpIHsKICAgIGFzc2VydChpc0Nsb3NlZCgpKTsKICAgIGlmIChkb21pbmF0b3IgPT0gbnVsbCkgewogICAgICAvLyBJZiB0aGlzIGJhc2ljIGJsb2NrIGRvZXNuJ3QgaGF2ZSBhIGRvbWluYXRvciB5ZXQgd2UgdXNlIHRoZQogICAgICAvLyBnaXZlbiBwcmVkZWNlc3NvciBhcyB0aGUgZG9taW5hdG9yLgogICAgICBwcmVkZWNlc3Nvci5hZGREb21pbmF0ZWRCbG9jayh0aGlzKTsKICAgIH0gZWxzZSBpZiAocHJlZGVjZXNzb3IuZG9taW5hdG9yICE9IG51bGwpIHsKICAgICAgLy8gSWYgdGhlIHByZWRlY2Vzc29yIGhhcyBhIGRvbWluYXRvciBhbmQgdGhpcyBiYXNpYyBibG9jayBoYXMgYQogICAgICAvLyBkb21pbmF0b3IsIHdlIGZpbmQgYSBjb21tb24gcGFyZW50IGluIHRoZSBkb21pbmF0b3IgdHJlZSBhbmQKICAgICAgLy8gdXNlIHRoYXQgYXMgdGhlIGRvbWluYXRvci4KICAgICAgSEJhc2ljQmxvY2sgYmxvY2swID0gZG9taW5hdG9yOwogICAgICBIQmFzaWNCbG9jayBibG9jazEgPSBwcmVkZWNlc3NvcjsKICAgICAgd2hpbGUgKCFpZGVudGljYWwoYmxvY2swLCBibG9jazEpKSB7CiAgICAgICAgaWYgKGJsb2NrMC5pZCA+IGJsb2NrMS5pZCkgewogICAgICAgICAgYmxvY2swID0gYmxvY2swLmRvbWluYXRvcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYmxvY2sxID0gYmxvY2sxLmRvbWluYXRvcjsKICAgICAgICB9CiAgICAgICAgYXNzZXJ0KGJsb2NrMCAhPSBudWxsICYmIGJsb2NrMSAhPSBudWxsKTsKICAgICAgfQogICAgICBpZiAoIWlkZW50aWNhbChkb21pbmF0b3IsIGJsb2NrMCkpIHsKICAgICAgICBkb21pbmF0b3IucmVtb3ZlRG9taW5hdGVkQmxvY2sodGhpcyk7CiAgICAgICAgYmxvY2swLmFkZERvbWluYXRlZEJsb2NrKHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGZvckVhY2hQaGkodm9pZCBmKEhQaGkgcGhpKSkgewogICAgSFBoaSBjdXJyZW50ID0gcGhpcy5maXJzdDsKICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKICAgICAgSEluc3RydWN0aW9uIHNhdmVkID0gY3VycmVudC5uZXh0OwogICAgICBmKGN1cnJlbnQpOwogICAgICBjdXJyZW50ID0gc2F2ZWQ7CiAgICB9CiAgfQoKICB2b2lkIGZvckVhY2hJbnN0cnVjdGlvbih2b2lkIGYoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSkgewogICAgSEluc3RydWN0aW9uIGN1cnJlbnQgPSBmaXJzdDsKICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKICAgICAgSEluc3RydWN0aW9uIHNhdmVkID0gY3VycmVudC5uZXh0OwogICAgICBmKGN1cnJlbnQpOwogICAgICBjdXJyZW50ID0gc2F2ZWQ7CiAgICB9CiAgfQoKICBib29sIGlzVmFsaWQoKSB7CiAgICBhc3NlcnQoaXNDbG9zZWQoKSk7CiAgICBIVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBIVmFsaWRhdG9yKCk7CiAgICB2YWxpZGF0b3IudmlzaXRCYXNpY0Jsb2NrKHRoaXMpOwogICAgcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkOwogIH0KCiAgYm9vbCBkb21pbmF0ZXMoSEJhc2ljQmxvY2sgb3RoZXIpIHsKICAgIHJldHVybiB0aGlzLmRvbWluYXRvckRmc0luIDw9IG90aGVyLmRvbWluYXRvckRmc0luICYmCiAgICAgICAgb3RoZXIuZG9taW5hdG9yRGZzT3V0IDw9IHRoaXMuZG9taW5hdG9yRGZzT3V0OwogIH0KCiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnSEJhc2ljQmxvY2soJGlkKSc7Cn0KCmFic3RyYWN0IGNsYXNzIEhJbnN0cnVjdGlvbiBpbXBsZW1lbnRzIFNwYW5uYWJsZSB7CiAgRW50aXR5IHNvdXJjZUVsZW1lbnQ7CiAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb247CgogIGZpbmFsIGludCBpZDsKICBzdGF0aWMgaW50IGlkQ291bnRlcjsKCiAgZmluYWwgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0czsKICBmaW5hbCBMaXN0PEhJbnN0cnVjdGlvbj4gdXNlZEJ5OwoKICBIQmFzaWNCbG9jayBibG9jazsKICBISW5zdHJ1Y3Rpb24gcHJldmlvdXMgPSBudWxsOwogIEhJbnN0cnVjdGlvbiBuZXh0ID0gbnVsbDsKCiAgU2lkZUVmZmVjdHMgc2lkZUVmZmVjdHMgPSBuZXcgU2lkZUVmZmVjdHMuZW1wdHkoKTsKICBib29sIF91c2VHdm4gPSBmYWxzZTsKCiAgLy8gVHlwZSBjb2Rlcy4KICBzdGF0aWMgY29uc3QgaW50IFVOREVGSU5FRF9UWVBFQ09ERSA9IC0xOwogIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9HVUFSRF9UWVBFQ09ERSA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBCT1VORFNfQ0hFQ0tfVFlQRUNPREUgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgSU5URUdFUl9DSEVDS19UWVBFQ09ERSA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBJTlRFUkNFUFRPUl9UWVBFQ09ERSA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBBRERfVFlQRUNPREUgPSA1OwogIHN0YXRpYyBjb25zdCBpbnQgRElWSURFX1RZUEVDT0RFID0gNjsKICBzdGF0aWMgY29uc3QgaW50IE1VTFRJUExZX1RZUEVDT0RFID0gNzsKICBzdGF0aWMgY29uc3QgaW50IFNVQlRSQUNUX1RZUEVDT0RFID0gODsKICBzdGF0aWMgY29uc3QgaW50IFNISUZUX0xFRlRfVFlQRUNPREUgPSA5OwogIHN0YXRpYyBjb25zdCBpbnQgQklUX09SX1RZUEVDT0RFID0gMTA7CiAgc3RhdGljIGNvbnN0IGludCBCSVRfQU5EX1RZUEVDT0RFID0gMTE7CiAgc3RhdGljIGNvbnN0IGludCBCSVRfWE9SX1RZUEVDT0RFID0gMTI7CiAgc3RhdGljIGNvbnN0IGludCBORUdBVEVfVFlQRUNPREUgPSAxMzsKICBzdGF0aWMgY29uc3QgaW50IEJJVF9OT1RfVFlQRUNPREUgPSAxNDsKICBzdGF0aWMgY29uc3QgaW50IE5PVF9UWVBFQ09ERSA9IDE1OwogIHN0YXRpYyBjb25zdCBpbnQgSURFTlRJVFlfVFlQRUNPREUgPSAxNjsKICBzdGF0aWMgY29uc3QgaW50IEdSRUFURVJfVFlQRUNPREUgPSAxNzsKICBzdGF0aWMgY29uc3QgaW50IEdSRUFURVJfRVFVQUxfVFlQRUNPREUgPSAxODsKICBzdGF0aWMgY29uc3QgaW50IExFU1NfVFlQRUNPREUgPSAxOTsKICBzdGF0aWMgY29uc3QgaW50IExFU1NfRVFVQUxfVFlQRUNPREUgPSAyMDsKICBzdGF0aWMgY29uc3QgaW50IFNUQVRJQ19UWVBFQ09ERSA9IDIxOwogIHN0YXRpYyBjb25zdCBpbnQgU1RBVElDX1NUT1JFX1RZUEVDT0RFID0gMjI7CiAgc3RhdGljIGNvbnN0IGludCBGSUVMRF9HRVRfVFlQRUNPREUgPSAyMzsKICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQ09OVkVSU0lPTl9UWVBFQ09ERSA9IDI0OwogIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9LTk9XTl9UWVBFQ09ERSA9IDI1OwogIHN0YXRpYyBjb25zdCBpbnQgSU5WT0tFX1NUQVRJQ19UWVBFQ09ERSA9IDI2OwogIHN0YXRpYyBjb25zdCBpbnQgSU5ERVhfVFlQRUNPREUgPSAyNzsKICBzdGF0aWMgY29uc3QgaW50IElTX1RZUEVDT0RFID0gMjg7CiAgc3RhdGljIGNvbnN0IGludCBJTlZPS0VfRFlOQU1JQ19UWVBFQ09ERSA9IDI5OwogIHN0YXRpYyBjb25zdCBpbnQgU0hJRlRfUklHSFRfVFlQRUNPREUgPSAzMDsKCiAgc3RhdGljIGNvbnN0IGludCBUUlVOQ0FUSU5HX0RJVklERV9UWVBFQ09ERSA9IDM2OwogIHN0YXRpYyBjb25zdCBpbnQgSVNfVklBX0lOVEVSQ0VQVE9SX1RZUEVDT0RFID0gMzc7CgogIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9JTkZPX1JFQURfUkFXX1RZUEVDT0RFID0gMzg7CiAgc3RhdGljIGNvbnN0IGludCBUWVBFX0lORk9fUkVBRF9WQVJJQUJMRV9UWVBFQ09ERSA9IDM5OwogIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9JTkZPX0VYUFJFU1NJT05fVFlQRUNPREUgPSA0MDsKCiAgc3RhdGljIGNvbnN0IGludCBGT1JFSUdOX0NPREVfVFlQRUNPREUgPSA0MTsKICBzdGF0aWMgY29uc3QgaW50IFJFTUFJTkRFUl9UWVBFQ09ERSA9IDQyOwogIHN0YXRpYyBjb25zdCBpbnQgR0VUX0xFTkdUSF9UWVBFQ09ERSA9IDQzOwogIHN0YXRpYyBjb25zdCBpbnQgQUJTX1RZUEVDT0RFID0gNDQ7CiAgc3RhdGljIGNvbnN0IGludCBCT09MX0NPTlZFUlNJT05fVFlQRUNPREUgPSA0NTsKICBzdGF0aWMgY29uc3QgaW50IFBSSU1JVElWRV9DSEVDS19UWVBFQ09ERSA9IDQ2OwoKICBzdGF0aWMgY29uc3QgaW50IElTX1RFU1RfVFlQRUNPREUgPSA0NzsKICBzdGF0aWMgY29uc3QgaW50IEFTX0NIRUNLX1RZUEVDT0RFID0gNDg7CiAgc3RhdGljIGNvbnN0IGludCBBU19DSEVDS19TSU1QTEVfVFlQRUNPREUgPSA0OTsKICBzdGF0aWMgY29uc3QgaW50IFNVQlRZUEVfQ0hFQ0tfVFlQRUNPREUgPSA1MDsKICBzdGF0aWMgY29uc3QgaW50IExPQURfVFlQRV9UWVBFQ09ERSA9IDUxOwogIHN0YXRpYyBjb25zdCBpbnQgSU5TVEFOQ0VfRU5WSVJPTk1FTlRfVFlQRUNPREUgPSA1MjsKICBzdGF0aWMgY29uc3QgaW50IFRZUEVfRVZBTF9UWVBFQ09ERSA9IDUzOwogIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9CSU5EX1RZUEVDT0RFID0gNTQ7CgogIEhJbnN0cnVjdGlvbih0aGlzLmlucHV0cywgdGhpcy5pbnN0cnVjdGlvblR5cGUpCiAgICAgIDogaWQgPSBpZENvdW50ZXIrKywKICAgICAgICB1c2VkQnkgPSA8SEluc3RydWN0aW9uPltdIHsKICAgIGFzc2VydChpbnB1dHMuZXZlcnkoKGUpID0+IGUgIT0gbnVsbCksICJpbnB1dHM6ICRpbnB1dHMiKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gaWQ7CgogIGJvb2wgdXNlR3ZuKCkgPT4gX3VzZUd2bjsKICB2b2lkIHNldFVzZUd2bigpIHsKICAgIF91c2VHdm4gPSB0cnVlOwogIH0KCiAgYm9vbCBnZXQgaXNNb3ZhYmxlID0+IHVzZUd2bigpOwoKICAvLy8gQSBwdXJlIGluc3RydWN0aW9uIGlzIGFuIGluc3RydWN0aW9uIHRoYXQgZG9lcyBub3QgaGF2ZSBhbnkgc2lkZQogIC8vLyBlZmZlY3QsIG5vciBhbnkgZGVwZW5kZW5jeS4gVGhleSBjYW4gYmUgbW92ZWQgYW55d2hlcmUgaW4gdGhlCiAgLy8vIGdyYXBoLgogIGJvb2wgaXNQdXJlKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSB7CiAgICByZXR1cm4gIXNpZGVFZmZlY3RzLmhhc1NpZGVFZmZlY3RzKCkgJiYKICAgICAgICAhc2lkZUVmZmVjdHMuZGVwZW5kc09uU29tZXRoaW5nKCkgJiYKICAgICAgICAhY2FuVGhyb3coZG9tYWluKTsKICB9CgogIC8vLyBBbiBpbnN0cnVjdGlvbiBpcyBhbiAnYWxsb2NhdGlvbicgaXMgaXQgaXMgdGhlIHNvbGUgYWxpYXMgZm9yIGFuIG9iamVjdC4KICAvLy8gVGhpcyBhcHBsaWVzIHRvIGluc3RydWN0aW9ucyB0aGF0IGFsbG9jYXRlIG5ldyBvYmplY3RzIGFuZCBjYW4gYmUgZXh0ZW5kZWQKICAvLy8gdG8gbWV0aG9kcyB0aGF0IHJldHVybiBvdGhlciBhbGxvY2F0aW9ucyB3aXRob3V0IGVzY2FwaW5nIHRoZW0uCiAgYm9vbCBpc0FsbG9jYXRpb24oQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+IGZhbHNlOwoKICAvLy8gT3ZlcnJpZGRlbiBieSBbSENoZWNrXSB0byByZXR1cm4gdGhlIGFjdHVhbCBub24tW0hDaGVja10KICAvLy8gaW5zdHJ1Y3Rpb24gaXQgY2hlY2tzIGFnYWluc3QuCiAgSEluc3RydWN0aW9uIG5vbkNoZWNrKCkgPT4gdGhpczsKCiAgLy8vIENhbiB0aGlzIG5vZGUgdGhyb3cgYW4gZXhjZXB0aW9uPwogIGJvb2wgY2FuVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+IGZhbHNlOwoKICAvLy8gRG9lcyB0aGlzIG5vZGUgcG90ZW50aWFsbHkgYWZmZWN0IGNvbnRyb2wgZmxvdy4KICBib29sIGlzQ29udHJvbEZsb3coKSA9PiBmYWxzZTsKCiAgYm9vbCBpc1ZhbHVlKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNQcmltaXRpdmVWYWx1ZShpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNOdWxsKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNOdWxsKGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc0NvbmZsaWN0aW5nKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNFbXB0eShpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNQcmltaXRpdmUoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc1ByaW1pdGl2ZShpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNQcmltaXRpdmVOdW1iZXIoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc1ByaW1pdGl2ZU51bWJlcihpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNQcmltaXRpdmVCb29sZWFuKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNQcmltaXRpdmVCb29sZWFuKGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZUFycmF5KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNQcmltaXRpdmVBcnJheShpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNJbmRleGFibGVQcmltaXRpdmUoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc0luZGV4YWJsZVByaW1pdGl2ZShpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNGaXhlZEFycmF5KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNGaXhlZEFycmF5KGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc0V4dGVuZGFibGVBcnJheShBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzRXh0ZW5kYWJsZUFycmF5KGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc011dGFibGVBcnJheShBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzTXV0YWJsZUFycmF5KGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc011dGFibGVJbmRleGFibGUoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc011dGFibGVJbmRleGFibGUoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzQXJyYXkoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc0FycmF5KGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc1ByaW1pdGl2ZVN0cmluZyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzUHJpbWl0aXZlU3RyaW5nKGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc0ludGVnZXIoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc0ludGVnZXIoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzVUludDMyKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNVSW50MzIoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzVUludDMxKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNVSW50MzEoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzUG9zaXRpdmVJbnRlZ2VyKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNQb3NpdGl2ZUludGVnZXIoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzUG9zaXRpdmVJbnRlZ2VyT3JOdWxsKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNQb3NpdGl2ZUludGVnZXJPck51bGwoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzSW50ZWdlck9yTnVsbChBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgZG9tYWluLmlzSW50ZWdlck9yTnVsbChpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNOdW1iZXIoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc051bWJlcihpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNOdW1iZXJPck51bGwoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc051bWJlck9yTnVsbChpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNEb3VibGUoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc0RvdWJsZShpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNEb3VibGVPck51bGwoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc0RvdWJsZU9yTnVsbChpbnN0cnVjdGlvblR5cGUpOwoKICBBYnN0cmFjdEJvb2wgaXNCb29sZWFuKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNCb29sZWFuKGluc3RydWN0aW9uVHlwZSk7CgogIEFic3RyYWN0Qm9vbCBpc0Jvb2xlYW5Pck51bGwoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIGRvbWFpbi5pc0Jvb2xlYW5Pck51bGwoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzU3RyaW5nKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNTdHJpbmcoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzU3RyaW5nT3JOdWxsKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNTdHJpbmdPck51bGwoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgQWJzdHJhY3RCb29sIGlzUHJpbWl0aXZlT3JOdWxsKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PgogICAgICBkb21haW4uaXNQcmltaXRpdmVPck51bGwoaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgLy8vIFR5cGUgb2YgdGhlIGluc3RydWN0aW9uLgogIEFic3RyYWN0VmFsdWUgaW5zdHJ1Y3Rpb25UeXBlOwoKICBTZWxlY3RvciBnZXQgc2VsZWN0b3IgPT4gbnVsbDsKICBISW5zdHJ1Y3Rpb24gZ2V0RGFydFJlY2VpdmVyKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgPT4gbnVsbDsKICBib29sIG9ubHlUaHJvd3NOU00oKSA9PiBmYWxzZTsKCiAgYm9vbCBpc0luQmFzaWNCbG9jaygpID0+IGJsb2NrICE9IG51bGw7CgogIGJvb2wgZ3ZuRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgewogICAgYXNzZXJ0KHVzZUd2bigpICYmIG90aGVyLnVzZUd2bigpKTsKICAgIC8vIENoZWNrIHRoYXQgdGhlIHR5cGUgYW5kIHRoZSBzaWRlRWZmZWN0cyBtYXRjaC4KICAgIGJvb2wgaGFzU2FtZVR5cGUgPSB0eXBlRXF1YWxzKG90aGVyKTsKICAgIGFzc2VydChoYXNTYW1lVHlwZSA9PSAodHlwZUNvZGUoKSA9PSBvdGhlci50eXBlQ29kZSgpKSk7CiAgICBpZiAoIWhhc1NhbWVUeXBlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoc2lkZUVmZmVjdHMgIT0gb3RoZXIuc2lkZUVmZmVjdHMpIHJldHVybiBmYWxzZTsKICAgIC8vIENoZWNrIHRoYXQgdGhlIGlucHV0cyBtYXRjaC4KICAgIGZpbmFsIGludCBpbnB1dHNMZW5ndGggPSBpbnB1dHMubGVuZ3RoOwogICAgZmluYWwgTGlzdDxISW5zdHJ1Y3Rpb24+IG90aGVySW5wdXRzID0gb3RoZXIuaW5wdXRzOwogICAgaWYgKGlucHV0c0xlbmd0aCAhPSBvdGhlcklucHV0cy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRzTGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFpZGVudGljYWwoaW5wdXRzW2ldLm5vbkNoZWNrKCksIG90aGVySW5wdXRzW2ldLm5vbkNoZWNrKCkpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICAvLyBDaGVjayB0aGF0IHRoZSBkYXRhIGluIHRoZSBpbnN0cnVjdGlvbiBtYXRjaGVzLgogICAgcmV0dXJuIGRhdGFFcXVhbHMob3RoZXIpOwogIH0KCiAgaW50IGd2bkhhc2hDb2RlKCkgewogICAgaW50IHJlc3VsdCA9IHR5cGVDb2RlKCk7CiAgICBpbnQgbGVuZ3RoID0gaW5wdXRzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0ID0gKHJlc3VsdCAqIDE5KSArIChpbnB1dHNbaV0ubm9uQ2hlY2soKS5pZCkgKyAocmVzdWx0ID4+IDcpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIFRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIG92ZXJ3cml0dGVuIGJ5IGluc3RydWN0aW9ucyB0aGF0CiAgLy8gcGFydGljaXBhdGUgaW4gZ2xvYmFsIHZhbHVlIG51bWJlcmluZy4KICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uVU5ERUZJTkVEX1RZUEVDT0RFOwogIGJvb2wgdHlwZUVxdWFscyhjb3ZhcmlhbnQgSEluc3RydWN0aW9uIG90aGVyKSA9PiBmYWxzZTsKICBib29sIGRhdGFFcXVhbHMoY292YXJpYW50IEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gZmFsc2U7CgogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKTsKCiAgdm9pZCBub3RpZnlBZGRlZFRvQmxvY2soSEJhc2ljQmxvY2sgdGFyZ2V0QmxvY2spIHsKICAgIGFzc2VydCghaXNJbkJhc2ljQmxvY2soKSk7CiAgICBhc3NlcnQoYmxvY2sgPT0gbnVsbCk7CiAgICAvLyBBZGQgW3RoaXNdIHRvIHRoZSBpbnB1dHMnIHVzZXMuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykgewogICAgICBhc3NlcnQoaW5wdXRzW2ldLmlzSW5CYXNpY0Jsb2NrKCkpOwogICAgICBpbnB1dHNbaV0udXNlZEJ5LmFkZCh0aGlzKTsKICAgIH0KICAgIGJsb2NrID0gdGFyZ2V0QmxvY2s7CiAgICBhc3NlcnQoaXNWYWxpZCgpKTsKICB9CgogIHZvaWQgbm90aWZ5UmVtb3ZlZEZyb21CbG9jaygpIHsKICAgIGFzc2VydChpc0luQmFzaWNCbG9jaygpKTsKICAgIGFzc2VydCh1c2VkQnkuaXNFbXB0eSk7CgogICAgLy8gUmVtb3ZlIFt0aGlzXSBmcm9tIHRoZSBpbnB1dHMnIHVzZXMuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykgewogICAgICBpbnB1dHNbaV0ucmVtb3ZlVXNlcih0aGlzKTsKICAgIH0KICAgIHRoaXMuYmxvY2sgPSBudWxsOwogICAgYXNzZXJ0KGlzVmFsaWQoKSk7CiAgfQoKICAvLy8gRG8gYSBpbi1wbGFjZSBjaGFuZ2Ugb2YgW2Zyb21dIHRvIFt0b10uIFdhcm5pbmc6IHRoaXMgZnVuY3Rpb24KICAvLy8gZG9lcyBub3QgdXBkYXRlIFtpbnB1dHNdIGFuZCBbdXNlZEJ5XS4gVXNlIFtjaGFuZ2VVc2VdIGluc3RlYWQuCiAgdm9pZCByZXdyaXRlSW5wdXQoSEluc3RydWN0aW9uIGZyb20sIEhJbnN0cnVjdGlvbiB0bykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGlkZW50aWNhbChpbnB1dHNbaV0sIGZyb20pKSBpbnB1dHNbaV0gPSB0bzsKICAgIH0KICB9CgogIC8vLyBSZW1vdmVzIGFsbCBvY2N1cnJlbmNlcyBvZiBbaW5zdHJ1Y3Rpb25dIGZyb20gW2xpc3RdLgogIHZvaWQgcmVtb3ZlRnJvbUxpc3QoTGlzdDxISW5zdHJ1Y3Rpb24+IGxpc3QsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgaW50IGxlbmd0aCA9IGxpc3QubGVuZ3RoOwogICAgaW50IGkgPSAwOwogICAgd2hpbGUgKGkgPCBsZW5ndGgpIHsKICAgICAgaWYgKGluc3RydWN0aW9uID09IGxpc3RbaV0pIHsKICAgICAgICBsaXN0W2ldID0gbGlzdFtsZW5ndGggLSAxXTsKICAgICAgICBsZW5ndGgtLTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpKys7CiAgICAgIH0KICAgIH0KICAgIGxpc3QubGVuZ3RoID0gbGVuZ3RoOwogIH0KCiAgLy8vIFJlbW92ZXMgYWxsIG9jY3VycmVuY2VzIG9mIFt1c2VyXSBmcm9tIFt1c2VkQnldLgogIHZvaWQgcmVtb3ZlVXNlcihISW5zdHJ1Y3Rpb24gdXNlcikgewogICAgcmVtb3ZlRnJvbUxpc3QodXNlZEJ5LCB1c2VyKTsKICB9CgogIC8vIENoYW5nZSBhbGwgdXNlcyBvZiBbb2xkSW5wdXRdIGJ5IFt0aGlzXSB0byBbbmV3SW5wdXRdLiBBbHNvCiAgLy8gdXBkYXRlcyB0aGUgW3VzZWRCeV0gb2YgW29sZElucHV0XSBhbmQgW25ld0lucHV0XS4KICB2b2lkIGNoYW5nZVVzZShISW5zdHJ1Y3Rpb24gb2xkSW5wdXQsIEhJbnN0cnVjdGlvbiBuZXdJbnB1dCkgewogICAgYXNzZXJ0KG5ld0lucHV0ICE9IG51bGwgJiYgIWlkZW50aWNhbChvbGRJbnB1dCwgbmV3SW5wdXQpKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChpZGVudGljYWwoaW5wdXRzW2ldLCBvbGRJbnB1dCkpIHsKICAgICAgICBpbnB1dHNbaV0gPSBuZXdJbnB1dDsKICAgICAgICBuZXdJbnB1dC51c2VkQnkuYWRkKHRoaXMpOwogICAgICB9CiAgICB9CiAgICByZW1vdmVGcm9tTGlzdChvbGRJbnB1dC51c2VkQnksIHRoaXMpOwogIH0KCiAgdm9pZCByZXBsYWNlQWxsVXNlcnNEb21pbmF0ZWRCeSgKICAgICAgSEluc3RydWN0aW9uIGN1cnNvciwgSEluc3RydWN0aW9uIG5ld0luc3RydWN0aW9uKSB7CiAgICBEb21pbmF0ZWRVc2VzLm9mKHRoaXMsIGN1cnNvcikucmVwbGFjZVdpdGgobmV3SW5zdHJ1Y3Rpb24pOwogIH0KCiAgdm9pZCBtb3ZlQmVmb3JlKEhJbnN0cnVjdGlvbiBvdGhlcikgewogICAgYXNzZXJ0KHRoaXMgaXMhIEhDb250cm9sRmxvdyk7CiAgICBhc3NlcnQodGhpcyBpcyEgSFBoaSk7CiAgICBhc3NlcnQob3RoZXIgaXMhIEhQaGkpOwogICAgYmxvY2suZGV0YWNoKHRoaXMpOwogICAgb3RoZXIuYmxvY2suaW50ZXJuYWxBZGRCZWZvcmUob3RoZXIsIHRoaXMpOwogICAgYmxvY2sgPSBvdGhlci5ibG9jazsKICB9CgogIGJvb2wgaXNDb25zdGFudCgpID0+IGZhbHNlOwogIGJvb2wgaXNDb25zdGFudEJvb2xlYW4oKSA9PiBmYWxzZTsKICBib29sIGlzQ29uc3RhbnROdWxsKCkgPT4gZmFsc2U7CiAgYm9vbCBpc0NvbnN0YW50TnVtYmVyKCkgPT4gZmFsc2U7CiAgYm9vbCBpc0NvbnN0YW50SW50ZWdlcigpID0+IGZhbHNlOwogIGJvb2wgaXNDb25zdGFudFN0cmluZygpID0+IGZhbHNlOwogIGJvb2wgaXNDb25zdGFudExpc3QoKSA9PiBmYWxzZTsKICBib29sIGlzQ29uc3RhbnRNYXAoKSA9PiBmYWxzZTsKICBib29sIGlzQ29uc3RhbnRGYWxzZSgpID0+IGZhbHNlOwogIGJvb2wgaXNDb25zdGFudFRydWUoKSA9PiBmYWxzZTsKCiAgYm9vbCBpc0ludGVyY2VwdG9yKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgPT4gZmFsc2U7CgogIGJvb2wgaXNWYWxpZCgpIHsKICAgIEhWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IEhWYWxpZGF0b3IoKTsKICAgIHZhbGlkYXRvci5jdXJyZW50QmxvY2sgPSBibG9jazsKICAgIHZhbGlkYXRvci52aXNpdEluc3RydWN0aW9uKHRoaXMpOwogICAgcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkOwogIH0KCiAgYm9vbCBpc0NvZGVNb3Rpb25JbnZhcmlhbnQoKSA9PiBmYWxzZTsKCiAgYm9vbCBpc0pzU3RhdGVtZW50KCkgPT4gZmFsc2U7CgogIGJvb2wgZG9taW5hdGVzKEhJbnN0cnVjdGlvbiBvdGhlcikgewogICAgLy8gQW4gaW5zdHJ1Y3Rpb24gZG9lcyBub3QgZG9taW5hdGVzIGl0c2VsZi4KICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoYmxvY2sgIT0gb3RoZXIuYmxvY2spIHJldHVybiBibG9jay5kb21pbmF0ZXMob3RoZXIuYmxvY2spOwoKICAgIEhJbnN0cnVjdGlvbiBjdXJyZW50ID0gdGhpcy5uZXh0OwogICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgewogICAgICBpZiAoY3VycmVudCA9PSBvdGhlcikgcmV0dXJuIHRydWU7CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBISW5zdHJ1Y3Rpb24gY29udmVydFR5cGUoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBEYXJ0VHlwZSB0eXBlLCBpbnQga2luZCkgewogICAgaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIHRoaXM7CiAgICB0eXBlID0gdHlwZS51bmFsaWFzZWQ7CiAgICAvLyBPbmx5IHRoZSBidWlsZGVyIGtub3dzIGhvdyB0byBjcmVhdGUgW0hUeXBlQ29udmVyc2lvbl0KICAgIC8vIGluc3RydWN0aW9ucyB3aXRoIGdlbmVyaWNzLiBJdCBoYXMgdGhlIGdlbmVyaWMgdHlwZSBjb250ZXh0CiAgICAvLyBhdmFpbGFibGUuCiAgICBhc3NlcnQoIXR5cGUuaXNUeXBlVmFyaWFibGUpOwogICAgYXNzZXJ0KHR5cGUudHJlYXRBc1JhdyB8fCB0eXBlLmlzRnVuY3Rpb25UeXBlKTsKICAgIGlmICh0eXBlLmlzRHluYW1pYykgcmV0dXJuIHRoaXM7CiAgICBpZiAodHlwZS5pc1ZvaWQpIHJldHVybiB0aGlzOwogICAgaWYgKHR5cGUgPT0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0VHlwZSkgcmV0dXJuIHRoaXM7CiAgICBpZiAodHlwZS5pc0Z1bmN0aW9uVHlwZSB8fCB0eXBlLmlzRnV0dXJlT3IpIHsKICAgICAgcmV0dXJuIG5ldyBIVHlwZUNvbnZlcnNpb24odHlwZSwga2luZCwKICAgICAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUsIHRoaXMsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICAgIGFzc2VydCh0eXBlLmlzSW50ZXJmYWNlVHlwZSk7CiAgICBpZiAoa2luZCA9PSBIVHlwZUNvbnZlcnNpb24uVFlQRV9DSEVDSyAmJiAhdHlwZS50cmVhdEFzUmF3KSB7CiAgICAgIHRocm93ICdjcmVhdGluZyBjb21wb3VuZCBjaGVjayB0byAkdHlwZSAodGhpcyA9ICR7dGhpc30pJzsKICAgIH0gZWxzZSB7CiAgICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IHR5cGU7CiAgICAgIEFic3RyYWN0VmFsdWUgc3VidHlwZSA9IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgIC5jcmVhdGVOdWxsYWJsZVN1YnR5cGUoaW50ZXJmYWNlVHlwZS5lbGVtZW50KTsKICAgICAgcmV0dXJuIG5ldyBIVHlwZUNvbnZlcnNpb24odHlwZSwga2luZCwgc3VidHlwZSwgdGhpcywgc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogIH0KCiAgLy8vIFJldHVybiB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbnMgZG8gbm90IGJlbG9uZyB0byBhIGxvb3Agb3IKICAvLy8gYmVsb25nIHRvIHRoZSBzYW1lIGxvb3AuCiAgYm9vbCBoYXNTYW1lTG9vcEhlYWRlckFzKEhJbnN0cnVjdGlvbiBvdGhlcikgewogICAgcmV0dXJuIGJsb2NrLmVuY2xvc2luZ0xvb3BIZWFkZXIgPT0gb3RoZXIuYmxvY2suZW5jbG9zaW5nTG9vcEhlYWRlcjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICcke3RoaXMucnVudGltZVR5cGV9KCknOwp9CgovLy8gVGhlIHNldCBvZiB1c2VzIG9mIFtzb3VyY2VdIHRoYXQgYXJlIGRvbWluYXRlZCBieSBbZG9taW5hdG9yXS4KY2xhc3MgRG9taW5hdGVkVXNlcyB7CiAgZmluYWwgSEluc3RydWN0aW9uIF9zb3VyY2U7CgogIC8vIFR3byBsaXN0IG9mIG1hdGNoaW5nIGxlbmd0aCBob2xkaW5nIChpbnN0cnVjdGlvbiwgaW5wdXQtaW5kZXgpIHBhaXJzIGZvcgogIC8vIHRoZSBkb21pbmF0ZWQgdXNlcy4KICBmaW5hbCBMaXN0PEhJbnN0cnVjdGlvbj4gX2luc3RydWN0aW9ucyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgZmluYWwgTGlzdDxpbnQ+IF9pbmRleGVzID0gPGludD5bXTsKCiAgRG9taW5hdGVkVXNlcy5fKHRoaXMuX3NvdXJjZSk7CgogIC8vLyBUaGUgdXNlcyBvZiBbc291cmNlXSB0aGF0IGFyZSBkb21pbmF0ZWQgYnkgW2RvbWluYXRvcl0uCiAgLy8vCiAgLy8vIFRoZSB1c2VzIGJ5IFtkb21pbmF0b3JdIGFyZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LCB1bmxlc3MKICAvLy8gW2V4Y2x1ZGVEb21pbmF0b3JdIGlzIGB0cnVlYCwgc28gYHRydWVgIHNlbGVjdHMgdXNlcyBmb2xsb3dpbmcKICAvLy8gW2RvbWluYXRvcl0uCiAgLy8vCiAgLy8vIFRoZSB1c2VzIGluY2x1ZGUgdGhlIGluLWVkZ2VzIG9mIGEgSFBoaSBub2RlIHRoYXQgY29ycmVzcG9uZHMgdG8gYQogIC8vLyBkb21pbmF0ZWQgYmxvY2suIChUaGVyZSBjYW4gYmUgbWFueSBzdWNoIGVkZ2VzIG9uIGEgc2luZ2xlIHBoaSBhdCB0aGUgZXhpdAogIC8vLyBvZiBhIGxvb3Agd2l0aCBtYW55IGJyZWFrIHN0YXRlbWVudHMpLiAgSWYgW2V4Y2x1ZGVQaGlPdXRFZGdlc10gaXMgYHRydWVgCiAgLy8vIHRoZW4gdGhlc2UgZWRnZSB1c2VzIGFyZSBub3QgaW5jbHVkZWQuCiAgc3RhdGljIERvbWluYXRlZFVzZXMgb2YoSEluc3RydWN0aW9uIHNvdXJjZSwgSEluc3RydWN0aW9uIGRvbWluYXRvciwKICAgICAge2Jvb2wgZXhjbHVkZURvbWluYXRvcjogZmFsc2UsIGJvb2wgZXhjbHVkZVBoaU91dEVkZ2VzOiBmYWxzZX0pIHsKICAgIHJldHVybiBuZXcgRG9taW5hdGVkVXNlcy5fKHNvdXJjZSkKICAgICAgLi5fY29tcHV0ZShzb3VyY2UsIGRvbWluYXRvciwgZXhjbHVkZURvbWluYXRvciwgZXhjbHVkZVBoaU91dEVkZ2VzKTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2luc3RydWN0aW9ucy5pc0VtcHR5OwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CiAgaW50IGdldCBsZW5ndGggPT4gX2luc3RydWN0aW9ucy5sZW5ndGg7CgogIC8vLyBDaGFuZ2VzIGFsbCB0aGUgdXNlcyBpbiB0aGUgc2V0IHRvIFtuZXdJbnN0cnVjdGlvbl0uCiAgdm9pZCByZXBsYWNlV2l0aChISW5zdHJ1Y3Rpb24gbmV3SW5zdHJ1Y3Rpb24pIHsKICAgIGFzc2VydCghaWRlbnRpY2FsKG5ld0luc3RydWN0aW9uLCBfc291cmNlKSk7CiAgICBpZiAoaXNFbXB0eSkgcmV0dXJuOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfaW5zdHJ1Y3Rpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgIEhJbnN0cnVjdGlvbiB1c2VyID0gX2luc3RydWN0aW9uc1tpXTsKICAgICAgaW50IGluZGV4ID0gX2luZGV4ZXNbaV07CiAgICAgIEhJbnN0cnVjdGlvbiBvbGRJbnN0cnVjdGlvbiA9IHVzZXIuaW5wdXRzW2luZGV4XTsKICAgICAgYXNzZXJ0KAogICAgICAgICAgaWRlbnRpY2FsKG9sZEluc3RydWN0aW9uLCBfc291cmNlKSwKICAgICAgICAgICdJbnB1dCAke2luZGV4fSBvZiAke3VzZXJ9IGNoYW5nZWQuJwogICAgICAgICAgJ1xuICBGb3VuZDogJHtvbGRJbnN0cnVjdGlvbn1cbiAgRXhwZWN0ZWQ6ICR7X3NvdXJjZX0nKTsKICAgICAgdXNlci5pbnB1dHNbaW5kZXhdID0gbmV3SW5zdHJ1Y3Rpb247CiAgICAgIG9sZEluc3RydWN0aW9uLnVzZWRCeS5yZW1vdmUodXNlcik7CiAgICAgIG5ld0luc3RydWN0aW9uLnVzZWRCeS5hZGQodXNlcik7CiAgICB9CiAgfQoKICBib29sIGdldCBpc1NpbmdsZXRvbiA9PiBfaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PSAxOwoKICBISW5zdHJ1Y3Rpb24gZ2V0IHNpbmdsZSA9PiBfaW5zdHJ1Y3Rpb25zLnNpbmdsZTsKCiAgSXRlcmFibGU8SEluc3RydWN0aW9uPiBnZXQgaW5zdHJ1Y3Rpb25zID0+IF9pbnN0cnVjdGlvbnM7CgogIHZvaWQgX2FkZFVzZShISW5zdHJ1Y3Rpb24gdXNlciwgaW50IGlucHV0SW5kZXgpIHsKICAgIF9pbnN0cnVjdGlvbnMuYWRkKHVzZXIpOwogICAgX2luZGV4ZXMuYWRkKGlucHV0SW5kZXgpOwogIH0KCiAgdm9pZCBfY29tcHV0ZShISW5zdHJ1Y3Rpb24gc291cmNlLCBISW5zdHJ1Y3Rpb24gZG9taW5hdG9yLAogICAgICBib29sIGV4Y2x1ZGVEb21pbmF0b3IsIGJvb2wgZXhjbHVkZVBoaU91dEVkZ2VzKSB7CiAgICAvLyBLZWVwIHRyYWNrIG9mIGFsbCBpbnN0cnVjdGlvbnMgdGhhdCB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBsYXRlciBhbmQgY291bnQKICAgIC8vIHRoZSBudW1iZXIgb2YgdGhlbSB0aGF0IGFyZSBpbiB0aGUgY3VycmVudCBibG9jay4KICAgIFNldDxISW5zdHJ1Y3Rpb24+IHVzZXJzID0gbmV3IFNldGxldDxISW5zdHJ1Y3Rpb24+KCk7CiAgICBTZXQ8SEluc3RydWN0aW9uPiBzZWVuID0gbmV3IFNldGxldDxISW5zdHJ1Y3Rpb24+KCk7CiAgICBpbnQgdXNlcnNJbkN1cnJlbnRCbG9jayA9IDA7CgogICAgSEJhc2ljQmxvY2sgZG9taW5hdG9yQmxvY2sgPSBkb21pbmF0b3IuYmxvY2s7CgogICAgLy8gUnVuIHRocm91Z2ggYWxsIHRoZSB1c2VycyBhbmQgc2VlIGlmIHRoZXkgYXJlIGRvbWluYXRlZCwgb3IgcG90ZW50aWFsbHkKICAgIC8vIGRvbWluYXRlZCwgb3IgcGFydGlhbGx5IGRvbWluYXRlZCBieSBbZG9taW5hdG9yXS4gSXQgaXMgZWFzaWVyIHRvCiAgICAvLyBkZS1kdXBsaWNhdGUgW3VzZWRCeV0gYW5kIHByb2Nlc3MgYWxsIGlucHV0cyBvZiBhbiBpbnN0cnVjdGlvbiB0aGFuIHRvCiAgICAvLyB0cmFjayB0aGUgcmVwZWF0ZWQgZWxlbWVudHMgb2YgdXNlZEJ5IGFuZCBtYXRjaCB0aGVtIHVwIGJ5IGluZGV4LgogICAgZm9yIChISW5zdHJ1Y3Rpb24gY3VycmVudCBpbiBzb3VyY2UudXNlZEJ5KSB7CiAgICAgIGlmICghc2Vlbi5hZGQoY3VycmVudCkpIGNvbnRpbnVlOwogICAgICBIQmFzaWNCbG9jayBjdXJyZW50QmxvY2sgPSBjdXJyZW50LmJsb2NrOwogICAgICBpZiAoZG9taW5hdG9yQmxvY2suZG9taW5hdGVzKGN1cnJlbnRCbG9jaykpIHsKICAgICAgICB1c2Vycy5hZGQoY3VycmVudCk7CiAgICAgICAgaWYgKGlkZW50aWNhbChjdXJyZW50QmxvY2ssIGRvbWluYXRvckJsb2NrKSkgdXNlcnNJbkN1cnJlbnRCbG9jaysrOwogICAgICB9IGVsc2UgaWYgKCFleGNsdWRlUGhpT3V0RWRnZXMgJiYgY3VycmVudCBpcyBIUGhpKSB7CiAgICAgICAgLy8gQSBub24tZG9taW5hdGVkIEhQaGkuCiAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGEgZG9taW5hdGVkIGVkZ2UgaW50byB0aGUgcGhpLiBUaGUgaW5wdXQgbXVzdCBiZQogICAgICAgIC8vIFtzb3VyY2VdIGFuZCB0aGUgcG9zaXRpb24gbXVzdCBjb3JyZXNwb25kIHRvIGEgZG9taW5hdGVkIGJsb2NrLgogICAgICAgIExpc3Q8SEJhc2ljQmxvY2s+IHByZWRlY2Vzc29ycyA9IGN1cnJlbnRCbG9jay5wcmVkZWNlc3NvcnM7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVkZWNlc3NvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmIChjdXJyZW50LmlucHV0c1tpXSAhPSBzb3VyY2UpIGNvbnRpbnVlOwogICAgICAgICAgSEJhc2ljQmxvY2sgcHJlZGVjZXNzb3IgPSBwcmVkZWNlc3NvcnNbaV07CiAgICAgICAgICBpZiAoZG9taW5hdG9yQmxvY2suZG9taW5hdGVzKHByZWRlY2Vzc29yKSkgewogICAgICAgICAgICBfYWRkVXNlKGN1cnJlbnQsIGkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIFJ1biB0aHJvdWdoIGFsbCB0aGUgcGhpcyBpbiB0aGUgc2FtZSBibG9jayBhcyBbZG9taW5hdG9yXSBhbmQgcmVtb3ZlIHRoZW0KICAgIC8vIGZyb20gdGhlIHVzZXJzIHNldC4gVGhlc2UgY29tZSBiZWZvcmUgW2RvbWluYXRvcl0uCiAgICAvLyBUT0RPKHNyYSk6IENvdWxkIHdlIHNpbXBseSBub3QgYWRkIHRoZW0gaW4gdGhlIGZpcnN0IHBsYWNlPwogICAgaWYgKHVzZXJzSW5DdXJyZW50QmxvY2sgPiAwKSB7CiAgICAgIGZvciAoSFBoaSBwaGkgPSBkb21pbmF0b3JCbG9jay5waGlzLmZpcnN0OyBwaGkgIT0gbnVsbDsgcGhpID0gcGhpLm5leHQpIHsKICAgICAgICBpZiAodXNlcnMucmVtb3ZlKHBoaSkpIHsKICAgICAgICAgIGlmICgtLXVzZXJzSW5DdXJyZW50QmxvY2sgPT0gMCkgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gUnVuIHRocm91Z2ggYWxsIHRoZSBpbnN0cnVjdGlvbnMgYmVmb3JlIFtkb21pbmF0b3JdIGFuZCByZW1vdmUgdGhlbSBmcm9tCiAgICAvLyB0aGUgdXNlcnMgc2V0LgogICAgaWYgKHVzZXJzSW5DdXJyZW50QmxvY2sgPiAwKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBjdXJyZW50ID0gZG9taW5hdG9yQmxvY2suZmlyc3Q7CiAgICAgIHdoaWxlICghaWRlbnRpY2FsKGN1cnJlbnQsIGRvbWluYXRvcikpIHsKICAgICAgICBpZiAodXNlcnMuY29udGFpbnMoY3VycmVudCkpIHsKICAgICAgICAgIC8vIFRPRE8oMjkzMDIpOiBVc2UgJ3VzZXIucmVtb3ZlKGN1cnJlbnQpJyBhcyB0aGUgY29uZGl0aW9uLgogICAgICAgICAgdXNlcnMucmVtb3ZlKGN1cnJlbnQpOwogICAgICAgICAgaWYgKC0tdXNlcnNJbkN1cnJlbnRCbG9jayA9PSAwKSBicmVhazsKICAgICAgICB9CiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDsKICAgICAgfQogICAgICBpZiAoZXhjbHVkZURvbWluYXRvcikgewogICAgICAgIHVzZXJzLnJlbW92ZShkb21pbmF0b3IpOwogICAgICB9CiAgICB9CgogICAgLy8gQ29udmVydCB1c2VycyBpbnRvIGEgbGlzdCBvZiAodXNlciwgaW5wdXQtaW5kZXgpIHVzZXMuCiAgICBmb3IgKEhJbnN0cnVjdGlvbiB1c2VyIGluIHVzZXJzKSB7CiAgICAgIHZhciBpbnB1dHMgPSB1c2VyLmlucHV0czsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoaW5wdXRzW2ldID09IHNvdXJjZSkgewogICAgICAgICAgX2FkZFVzZSh1c2VyLCBpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCi8vLyBBIHJlZmVyZW5jZSB0byBhIFtISW5zdHJ1Y3Rpb25dIHRoYXQgY2FuIGhvbGQgaXRzIG93biBzb3VyY2UgaW5mb3JtYXRpb24uCi8vLwovLy8gVGhpcyB1c2VkIGZvciBhdHRhY2hpbmcgc291cmNlIGluZm9ybWF0aW9uIHRvIHJlYWRzIG9mIGxvY2Fscy4KY2xhc3MgSFJlZiBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSFJlZihISW5zdHJ1Y3Rpb24gdmFsdWUsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKQogICAgICA6IHN1cGVyKFt2YWx1ZV0sIHZhbHVlLmluc3RydWN0aW9uVHlwZSkgewogICAgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogIH0KCiAgSEluc3RydWN0aW9uIGdldCB2YWx1ZSA9PiBpbnB1dHNbMF07CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBjb252ZXJ0VHlwZShKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIERhcnRUeXBlIHR5cGUsIGludCBraW5kKSB7CiAgICBISW5zdHJ1Y3Rpb24gY29udmVydGVkID0gdmFsdWUuY29udmVydFR5cGUoY2xvc2VkV29ybGQsIHR5cGUsIGtpbmQpOwogICAgaWYgKGNvbnZlcnRlZCA9PSB2YWx1ZSkgcmV0dXJuIHRoaXM7CiAgICBIVHlwZUNvbnZlcnNpb24gY29udmVyc2lvbiA9IGNvbnZlcnRlZDsKICAgIGNvbnZlcnNpb24uaW5wdXRzWzBdID0gdGhpczsKICAgIHJldHVybiBjb252ZXJzaW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRSZWYodGhpcyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdIUmVmKCR7dmFsdWV9KSc7Cn0KCi8vLyBMYXRlIGluc3RydWN0aW9ucyBhcmUgdXNlZCBhZnRlciB0aGUgbWFpbiBvcHRpbWl6YXRpb24gcGhhc2VzLiAgVGhleSBjYXB0dXJlCi8vLyBjb2RlZ2VuIGRlY2lzaW9ucyBqdXN0IHByaW9yIHRvIGdlbmVyYXRpbmcgSmF2YVNjcmlwdC4KYWJzdHJhY3QgY2xhc3MgSExhdGVJbnN0cnVjdGlvbiBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSExhdGVJbnN0cnVjdGlvbihMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIoaW5wdXRzLCB0eXBlKTsKfQoKLy8vIEEgW0hDaGVja10gaW5zdHJ1Y3Rpb24gaXMgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBtaWdodCBkbyBhIGR5bmFtaWMKLy8vIGNoZWNrIGF0IHJ1bnRpbWUgb24gYW5vdGhlciBpbnN0cnVjdGlvbi4gVG8gaGF2ZSBwcm9wZXIgaW5zdHJ1Y3Rpb24KLy8vIGRlcGVuZGVuY2llcyBpbiB0aGUgZ3JhcGgsIGluc3RydWN0aW9ucyB0aGF0IGRlcGVuZCBvbiB0aGUgY2hlY2sKLy8vIGJlaW5nIGRvbmUgcmVmZXJlbmNlIHRoZSBbSENoZWNrXSBpbnN0cnVjdGlvbiBpbnN0ZWFkIG9mIHRoZQovLy8gaW5zdHJ1Y3Rpb24gaXRzZWxmLgphYnN0cmFjdCBjbGFzcyBIQ2hlY2sgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIEhDaGVjayhpbnB1dHMsIHR5cGUpIDogc3VwZXIoaW5wdXRzLCB0eXBlKSB7CiAgICBzZXRVc2VHdm4oKTsKICB9CiAgSEluc3RydWN0aW9uIGdldCBjaGVja2VkSW5wdXQgPT4gaW5wdXRzWzBdOwogIEBvdmVycmlkZQogIGJvb2wgaXNKc1N0YXRlbWVudCgpID0+IHRydWU7CiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIG5vbkNoZWNrKCkgPT4gY2hlY2tlZElucHV0Lm5vbkNoZWNrKCk7Cn0KCmNsYXNzIEhCb3VuZHNDaGVjayBleHRlbmRzIEhDaGVjayB7CiAgc3RhdGljIGNvbnN0IGludCBBTFdBWVNfRkFMU0UgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgRlVMTF9DSEVDSyA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBBTFdBWVNfQUJPVkVfWkVSTyA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBBTFdBWVNfQkVMT1dfTEVOR1RIID0gMzsKICBzdGF0aWMgY29uc3QgaW50IEFMV0FZU19UUlVFID0gNDsKCiAgLy8vIERldGFpbHMgd2hpY2ggdGVzdHMgaGF2ZSBiZWVuIGRvbmUgc3RhdGljYWxseSBkdXJpbmcgY29tcGlsYXRpb24uCiAgLy8vIERlZmF1bHQgaXMgdGhhdCBhbGwgY2hlY2tzIG11c3QgYmUgcGVyZm9ybWVkIGR5bmFtaWNhbGx5LgogIGludCBzdGF0aWNDaGVja3MgPSBGVUxMX0NIRUNLOwoKICBIQm91bmRzQ2hlY2sobGVuZ3RoLCBpbmRleCwgYXJyYXksIHR5cGUpCiAgICAgIDogc3VwZXIoPEhJbnN0cnVjdGlvbj5bbGVuZ3RoLCBpbmRleCwgYXJyYXldLCB0eXBlKTsKCiAgSEluc3RydWN0aW9uIGdldCBsZW5ndGggPT4gaW5wdXRzWzFdOwogIEhJbnN0cnVjdGlvbiBnZXQgaW5kZXggPT4gaW5wdXRzWzBdOwogIEhJbnN0cnVjdGlvbiBnZXQgYXJyYXkgPT4gaW5wdXRzWzJdOwogIC8vIFRoZXJlIGNhbiBiZSBhbiBhZGRpdGlvbmFsIGZvdXJ0aCBpbnB1dCB3aGljaCBpcyB0aGUgaW5kZXggdG8gcmVwb3J0IHRvCiAgLy8gW2lvb3JlXS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBleHBhbnNpb24gb2YgW0pTQXJyYXkucmVtb3ZlTGFzdF0uCiAgSEluc3RydWN0aW9uIGdldCByZXBvcnRlZEluZGV4ID0+IGlucHV0cy5sZW5ndGggPiAzID8gaW5wdXRzWzNdIDogaW5kZXg7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnRyb2xGbG93KCkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRCb3VuZHNDaGVjayh0aGlzKTsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uQk9VTkRTX0NIRUNLX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSEJvdW5kc0NoZWNrOwogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IHRydWU7Cn0KCmFic3RyYWN0IGNsYXNzIEhDb25kaXRpb25hbEJyYW5jaCBleHRlbmRzIEhDb250cm9sRmxvdyB7CiAgSENvbmRpdGlvbmFsQnJhbmNoKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluLCBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzKQogICAgICA6IHN1cGVyKGRvbWFpbiwgaW5wdXRzKTsKICBISW5zdHJ1Y3Rpb24gZ2V0IGNvbmRpdGlvbiA9PiBpbnB1dHNbMF07CiAgSEJhc2ljQmxvY2sgZ2V0IHRydWVCcmFuY2ggPT4gYmxvY2suc3VjY2Vzc29yc1swXTsKICBIQmFzaWNCbG9jayBnZXQgZmFsc2VCcmFuY2ggPT4gYmxvY2suc3VjY2Vzc29yc1sxXTsKfQoKYWJzdHJhY3QgY2xhc3MgSENvbnRyb2xGbG93IGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBIQ29udHJvbEZsb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMpCiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1heSBvbmx5IGV4cHJlc3Npb24tbGlrZSBbSEluc3RydWN0aW9uXXMgc2hvdWxkCiAgICAgIC8vIGhhdmUgYW4gYGluc3RydWN0aW9uVHlwZWAsIG9yIHN0YXRlbWVudC1saWtlIFtISW5zdHJ1Y3Rpb25dcyBzaG91bGQKICAgICAgLy8gaGF2ZSBhIHRocm93aW5nIGdldHRlci4KICAgICAgOiBzdXBlcihpbnB1dHMsIGRvbWFpbi5lbXB0eVR5cGUpOwogIEBvdmVycmlkZQogIGJvb2wgaXNDb250cm9sRmxvdygpID0+IHRydWU7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0pzU3RhdGVtZW50KCkgPT4gdHJ1ZTsKfQoKLy8gQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhbiBpbnN0YW5jZS4KY2xhc3MgSENyZWF0ZSBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgZmluYWwgQ2xhc3NFbnRpdHkgZWxlbWVudDsKCiAgLy8vIERvZXMgdGhpcyBpbnN0cnVjdGlvbiBoYXZlIHJlaWZpZWQgdHlwZSBpbmZvcm1hdGlvbiBhcyB0aGUgbGFzdCBpbnB1dD8KICBmaW5hbCBib29sIGhhc1J0aUlucHV0OwoKICAvLy8gSWYgdGhpcyBmaWVsZCBpcyBub3QgYG51bGxgLCB0aGlzIGNhbGwgaXMgZnJvbSBhbiBpbmxpbmVkIGNvbnN0cnVjdG9yIGFuZAogIC8vLyB3ZSBoYXZlIHRvIHJlZ2lzdGVyIHRoZSBpbnN0YW50aWF0ZWQgdHlwZSBpbiB0aGUgY29kZSBnZW5lcmF0b3IuIFRoZQogIC8vLyBbaW5zdHJ1Y3Rpb25UeXBlXSBvZiB0aGlzIG5vZGUgaXMgbm90IGVub3VnaCwgYmVjYXVzZSB3ZSBhbHNvIG5lZWQgdGhlCiAgLy8vIHR5cGUgYXJndW1lbnRzLiBTZWUgYWxzbyBbU3NhRnJvbUFzdE1peGluLmN1cnJlbnRJbmxpbmVkSW5zdGFudGlhdGlvbnNdLgogIExpc3Q8SW50ZXJmYWNlVHlwZT4gaW5zdGFudGlhdGVkVHlwZXM7CgogIC8vLyBJZiB0aGlzIG5vZGUgY3JlYXRlcyBhIGNsb3N1cmUgY2xhc3MsIFtjYWxsTWV0aG9kXSBpcyB0aGUgY2FsbCBtZXRob2Qgb2YKICAvLy8gdGhlIGNsb3N1cmUgY2xhc3MuCiAgRnVuY3Rpb25FbnRpdHkgY2FsbE1ldGhvZDsKCiAgSENyZWF0ZSh0aGlzLmVsZW1lbnQsIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsIEFic3RyYWN0VmFsdWUgdHlwZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHt0aGlzLmluc3RhbnRpYXRlZFR5cGVzLCB0aGlzLmhhc1J0aUlucHV0OiBmYWxzZSwgdGhpcy5jYWxsTWV0aG9kfSkKICAgICAgOiBzdXBlcihpbnB1dHMsIHR5cGUpIHsKICAgIHRoaXMuc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNBbGxvY2F0aW9uKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PiB0cnVlOwoKICBISW5zdHJ1Y3Rpb24gZ2V0IHJ0aUlucHV0IHsKICAgIGFzc2VydChoYXNSdGlJbnB1dCk7CiAgICByZXR1cm4gaW5wdXRzLmxhc3Q7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdENyZWF0ZSh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0hDcmVhdGUoJGVsZW1lbnQsICR7aW5zdGFudGlhdGVkVHlwZXN9KSc7Cn0KCi8vIEFsbG9jYXRlcyBhIGJveCB0byBob2xkIG11dGF0ZWQgY2FwdHVyZWQgdmFyaWFibGVzLgpjbGFzcyBIQ3JlYXRlQm94IGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBIQ3JlYXRlQm94KEFic3RyYWN0VmFsdWUgdHlwZSkgOiBzdXBlcig8SEluc3RydWN0aW9uPltdLCB0eXBlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0FsbG9jYXRpb24oQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+IHRydWU7CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0Q3JlYXRlQm94KHRoaXMpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnSENyZWF0ZUJveCgpJzsKfQoKYWJzdHJhY3QgY2xhc3MgSEludm9rZSBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgYm9vbCBfaXNBbGxvY2F0aW9uID0gZmFsc2U7CgogIC8vLyBbaXNJbnRlcmNlcHRlZENhbGxdIGlzIHRydWUgaWYgdGhpcyBpbnZvY2F0aW9uIHVzZXMgdGhlIGludGVyY2VwdG9yCiAgLy8vIGNhbGxpbmcgY29udmVudGlvbiB3aGVyZSB0aGUgZmlyc3QgaW5wdXQgaXMgdGhlIG1ldGhvZHMgYW5kIHRoZSBzZWNvbmQKICAvLy8gaW5wdXQgaXMgdGhlIERhcnQgcmVjZWl2ZXIuCiAgYm9vbCBpc0ludGVyY2VwdGVkQ2FsbCA9IGZhbHNlOwoKICBISW52b2tlKExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsIEFic3RyYWN0VmFsdWUgcmVzdWx0VHlwZSkKICAgICAgOiBzdXBlcihpbnB1dHMsIHJlc3VsdFR5cGUpIHsKICAgIHNpZGVFZmZlY3RzLnNldEFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5zZXREZXBlbmRzT25Tb21ldGhpbmcoKTsKICB9CiAgc3RhdGljIGNvbnN0IGludCBBUkdVTUVOVFNfT0ZGU0VUID0gMTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0FsbG9jYXRpb24oQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+IF9pc0FsbG9jYXRpb247CgogIHZvaWQgc2V0QWxsb2NhdGlvbihib29sIHZhbHVlKSB7CiAgICBfaXNBbGxvY2F0aW9uID0gdmFsdWU7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBISW52b2tlRHluYW1pYyBleHRlbmRzIEhJbnZva2UgewogIGZpbmFsIEludm9rZUR5bmFtaWNTcGVjaWFsaXplciBzcGVjaWFsaXplcjsKICBAb3ZlcnJpZGUKICBTZWxlY3RvciBzZWxlY3RvcjsKICBBYnN0cmFjdFZhbHVlIF9yZWNlaXZlclR5cGU7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZSBfb3JpZ2luYWxSZWNlaXZlclR5cGU7CiAgTWVtYmVyRW50aXR5IGVsZW1lbnQ7CgogIEhJbnZva2VEeW5hbWljKFNlbGVjdG9yIHNlbGVjdG9yLCB0aGlzLl9yZWNlaXZlclR5cGUsIHRoaXMuZWxlbWVudCwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywgYm9vbCBpc0ludGVyY2VwdGVkLCBBYnN0cmFjdFZhbHVlIHJlc3VsdFR5cGUpCiAgICAgIDogdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yLAogICAgICAgIHRoaXMuX29yaWdpbmFsUmVjZWl2ZXJUeXBlID0gX3JlY2VpdmVyVHlwZSwKICAgICAgICBzcGVjaWFsaXplciA9IGlzSW50ZXJjZXB0ZWQKICAgICAgICAgICAgPyBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIubG9va3VwU3BlY2lhbGl6ZXIoc2VsZWN0b3IpCiAgICAgICAgICAgIDogY29uc3QgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyKCksCiAgICAgICAgc3VwZXIoaW5wdXRzLCByZXN1bHRUeXBlKSB7CiAgICBhc3NlcnQoaXNJbnRlcmNlcHRlZCAhPSBudWxsKTsKICAgIGFzc2VydChfcmVjZWl2ZXJUeXBlICE9IG51bGwpOwogICAgaXNJbnRlcmNlcHRlZENhbGwgPSBpc0ludGVyY2VwdGVkOwogIH0KCiAgQWJzdHJhY3RWYWx1ZSBnZXQgcmVjZWl2ZXJUeXBlID0+IF9yZWNlaXZlclR5cGU7CgogIHZvaWQgdXBkYXRlUmVjZWl2ZXJUeXBlKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sIEFic3RyYWN0VmFsdWUgdmFsdWUpIHsKICAgIF9yZWNlaXZlclR5cGUgPQogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uaW50ZXJzZWN0aW9uKF9vcmlnaW5hbFJlY2VpdmVyVHlwZSwgdmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ2ludm9rZSBkeW5hbWljOiBzZWxlY3Rvcj0kc2VsZWN0b3IsIG1hc2s9JHJlY2VpdmVyVHlwZSc7CgogIEhJbnN0cnVjdGlvbiBnZXQgcmVjZWl2ZXIgPT4gaW5wdXRzWzBdOwoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gZ2V0RGFydFJlY2VpdmVyKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGlzQ2FsbE9uSW50ZXJjZXB0b3IoY2xvc2VkV29ybGQpID8gaW5wdXRzWzFdIDogaW5wdXRzWzBdOwogIH0KCiAgLy8vIFRoZSB0eXBlIGFyZ3VtZW50cyBwYXNzZWQgaW4gdGhpcyBkeW5hbWljIGludm9jYXRpb24uCiAgTGlzdDxEYXJ0VHlwZT4gZ2V0IHR5cGVBcmd1bWVudHM7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjYWxsIGlzIG9uIGFuIGludGVyY2VwdG9yIG9iamVjdC4KICBib29sIGlzQ2FsbE9uSW50ZXJjZXB0b3IoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gaXNJbnRlcmNlcHRlZENhbGwgJiYgcmVjZWl2ZXIuaXNJbnRlcmNlcHRvcihjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uSU5WT0tFX0RZTkFNSUNfVFlQRUNPREU7CgogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSEludm9rZUR5bmFtaWM7CgogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhISW52b2tlRHluYW1pYyBvdGhlcikgewogICAgLy8gVXNlIHRoZSBuYW1lIGFuZCB0aGUga2luZCBpbnN0ZWFkIG9mIFtTZWxlY3Rvci5vcGVyYXRvcj09XQogICAgLy8gYmVjYXVzZSB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBhcml0eSAoYWxyZWFkeSBjaGVja2VkIGluCiAgICAvLyBbZ3ZuRXF1YWxzXSksIGFuZCB0aGUgcmVjZWl2ZXIgdHlwZXMgbWF5IG5vdCBiZSBpbiBzeW5jLgogICAgcmV0dXJuIHNlbGVjdG9yLm5hbWUgPT0gb3RoZXIuc2VsZWN0b3IubmFtZSAmJgogICAgICAgIHNlbGVjdG9yLmtpbmQgPT0gb3RoZXIuc2VsZWN0b3Iua2luZDsKICB9Cn0KCmNsYXNzIEhJbnZva2VDbG9zdXJlIGV4dGVuZHMgSEludm9rZUR5bmFtaWMgewogIEBvdmVycmlkZQogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CgogIEhJbnZva2VDbG9zdXJlKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyVHlwZSwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywgQWJzdHJhY3RWYWx1ZSByZXN1bHRUeXBlLCB0aGlzLnR5cGVBcmd1bWVudHMpCiAgICAgIDogc3VwZXIoc2VsZWN0b3IsIHJlY2VpdmVyVHlwZSwgbnVsbCwgaW5wdXRzLCBmYWxzZSwgcmVzdWx0VHlwZSkgewogICAgYXNzZXJ0KHNlbGVjdG9yLmlzQ2xvc3VyZUNhbGwpOwogICAgYXNzZXJ0KHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50Q291bnQgPT0gdHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgYXNzZXJ0KCFpc0ludGVyY2VwdGVkQ2FsbCk7CiAgfQogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0SW52b2tlQ2xvc3VyZSh0aGlzKTsKfQoKY2xhc3MgSEludm9rZUR5bmFtaWNNZXRob2QgZXh0ZW5kcyBISW52b2tlRHluYW1pYyB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgSEludm9rZUR5bmFtaWNNZXRob2QoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyVHlwZSwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywKICAgICAgQWJzdHJhY3RWYWx1ZSByZXN1bHRUeXBlLAogICAgICB0aGlzLnR5cGVBcmd1bWVudHMsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICB7Ym9vbCBpc0ludGVyY2VwdGVkOiBmYWxzZX0pCiAgICAgIDogc3VwZXIoc2VsZWN0b3IsIHJlY2VpdmVyVHlwZSwgbnVsbCwgaW5wdXRzLCBpc0ludGVyY2VwdGVkLCByZXN1bHRUeXBlKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICBhc3NlcnQoc2VsZWN0b3IuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudCA9PSB0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnaW52b2tlIGR5bmFtaWMgbWV0aG9kOiBzZWxlY3Rvcj0kc2VsZWN0b3IsIG1hc2s9JHJlY2VpdmVyVHlwZSc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJbnZva2VEeW5hbWljTWV0aG9kKHRoaXMpOwp9CgphYnN0cmFjdCBjbGFzcyBISW52b2tlRHluYW1pY0ZpZWxkIGV4dGVuZHMgSEludm9rZUR5bmFtaWMgewogIEhJbnZva2VEeW5hbWljRmllbGQoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyVHlwZSwKICAgICAgTWVtYmVyRW50aXR5IGVsZW1lbnQsCiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsCiAgICAgIGJvb2wgaXNJbnRlcmNlcHRlZCwKICAgICAgQWJzdHJhY3RWYWx1ZSByZXN1bHRUeXBlKQogICAgICA6IHN1cGVyKAogICAgICAgICAgICBzZWxlY3RvciwgcmVjZWl2ZXJUeXBlLCBlbGVtZW50LCBpbnB1dHMsIGlzSW50ZXJjZXB0ZWQsIHJlc3VsdFR5cGUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnaW52b2tlIGR5bmFtaWMgZmllbGQ6IHNlbGVjdG9yPSRzZWxlY3RvciwgbWFzaz0kcmVjZWl2ZXJUeXBlJzsKfQoKY2xhc3MgSEludm9rZUR5bmFtaWNHZXR0ZXIgZXh0ZW5kcyBISW52b2tlRHluYW1pY0ZpZWxkIHsKICBISW52b2tlRHluYW1pY0dldHRlcigKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXJUeXBlLAogICAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywKICAgICAgYm9vbCBpc0ludGVyY2VwdGVkLAogICAgICBBYnN0cmFjdFZhbHVlIHJlc3VsdFR5cGUsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKQogICAgICA6IHN1cGVyKHNlbGVjdG9yLCByZWNlaXZlclR5cGUsIGVsZW1lbnQsIGlucHV0cywgaXNJbnRlcmNlcHRlZCwKICAgICAgICAgICAgcmVzdWx0VHlwZSkgewogICAgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJbnZva2VEeW5hbWljR2V0dGVyKHRoaXMpOwoKICBib29sIGdldCBpc1RlYXJPZmYgPT4gZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuaXNGdW5jdGlvbjsKCiAgQG92ZXJyaWRlCiAgTGlzdDxEYXJ0VHlwZT4gZ2V0IHR5cGVBcmd1bWVudHMgPT4gY29uc3QgPERhcnRUeXBlPltdOwoKICAvLyBUaGVyZSBtaWdodCBiZSBhbiBpbnRlcmNlcHRvciBpbnB1dCwgc28gYGlucHV0cy5sYXN0YCBpcyB0aGUgZGFydCByZWNlaXZlci4KICBAb3ZlcnJpZGUKICBib29sIGNhblRocm93KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PiBpc1RlYXJPZmYKICAgICAgPyBpbnB1dHMubGFzdC5pc051bGwoZG9tYWluKS5pc1BvdGVudGlhbGx5VHJ1ZQogICAgICA6IHN1cGVyLmNhblRocm93KGRvbWFpbik7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICdpbnZva2UgZHluYW1pYyBnZXR0ZXI6IHNlbGVjdG9yPSRzZWxlY3RvciwgbWFzaz0kcmVjZWl2ZXJUeXBlJzsKfQoKY2xhc3MgSEludm9rZUR5bmFtaWNTZXR0ZXIgZXh0ZW5kcyBISW52b2tlRHluYW1pY0ZpZWxkIHsKICAvLy8gSWYgYHRydWVgIGEgY2FsbCB0byB0aGUgc2V0dGVyIGlzIG5lZWRlZCBmb3IgY2hlY2tpbmcgdGhlIHR5cGUgZXZlbgogIC8vLyB0aG91Z2ggdGhlIHRhcmdldCBmaWVsZCBpcyBrbm93bi4KICBib29sIG5lZWRzQ2hlY2sgPSBmYWxzZTsKCiAgSEludm9rZUR5bmFtaWNTZXR0ZXIoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyVHlwZSwKICAgICAgTWVtYmVyRW50aXR5IGVsZW1lbnQsCiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsCiAgICAgIGJvb2wgaXNJbnRlcmNlcHRlZCwKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVGhlIHJlc3VsdCB0eXBlIGZvciBhIHNldHRlciBzaG91bGQgYmUgdGhlIGVtcHR5CiAgICAgIC8vIHR5cGUuCiAgICAgIEFic3RyYWN0VmFsdWUgcmVzdWx0VHlwZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogc3VwZXIoc2VsZWN0b3IsIHJlY2VpdmVyVHlwZSwgZWxlbWVudCwgaW5wdXRzLCBpc0ludGVyY2VwdGVkLAogICAgICAgICAgICByZXN1bHRUeXBlKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEludm9rZUR5bmFtaWNTZXR0ZXIodGhpcyk7CgogIEBvdmVycmlkZQogIExpc3Q8RGFydFR5cGU+IGdldCB0eXBlQXJndW1lbnRzID0+IGNvbnN0IDxEYXJ0VHlwZT5bXTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJ2ludm9rZSBkeW5hbWljIHNldHRlcjogc2VsZWN0b3I9JHNlbGVjdG9yLCBtYXNrPSRyZWNlaXZlclR5cGUsIGVsZW1lbnQ9JGVsZW1lbnQnOwp9CgpjbGFzcyBISW52b2tlU3RhdGljIGV4dGVuZHMgSEludm9rZSB7CiAgZmluYWwgTWVtYmVyRW50aXR5IGVsZW1lbnQ7CgogIC8vLyBUaGUgdHlwZSBhcmd1bWVudHMgcGFzc2VkIGluIHRoaXMgc3RhdGljIGludm9jYXRpb24uCiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgZmluYWwgYm9vbCB0YXJnZXRDYW5UaHJvdzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gdGFyZ2V0Q2FuVGhyb3c7CgogIC8vLyBJZiB0aGlzIGluc3RydWN0aW9uIGlzIGEgY2FsbCB0byBhIGNvbnN0cnVjdG9yLCBbaW5zdGFudGlhdGVkVHlwZXNdCiAgLy8vIGNvbnRhaW5zIHRoZSB0eXBlKHMpIHVzZWQgaW4gdGhlIChEYXJ0KSBgTmV3YCBleHByZXNzaW9uKHMpLiBUaGUKICAvLy8gW2luc3RydWN0aW9uVHlwZV0gb2YgdGhpcyBub2RlIGlzIG5vdCBlbm91Z2gsIGJlY2F1c2Ugd2UgYWxzbyBuZWVkIHRoZQogIC8vLyB0eXBlIGFyZ3VtZW50cy4gU2VlIGFsc28gW1NzYUZyb21Bc3RNaXhpbi5jdXJyZW50SW5saW5lZEluc3RhbnRpYXRpb25zXS4KICBMaXN0PEludGVyZmFjZVR5cGU+IGluc3RhbnRpYXRlZFR5cGVzOwoKICAvLy8gVGhlIGZpcnN0IGlucHV0IG11c3QgYmUgdGhlIHRhcmdldC4KICBISW52b2tlU3RhdGljKHRoaXMuZWxlbWVudCwgaW5wdXRzLCBBYnN0cmFjdFZhbHVlIHR5cGUsIHRoaXMudHlwZUFyZ3VtZW50cywKICAgICAge3RoaXMudGFyZ2V0Q2FuVGhyb3c6IHRydWUsIGJvb2wgaXNJbnRlcmNlcHRlZDogZmFsc2V9KQogICAgICA6IHN1cGVyKGlucHV0cywgdHlwZSkgewogICAgaXNJbnRlcmNlcHRlZENhbGwgPSBpc0ludGVyY2VwdGVkOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJbnZva2VTdGF0aWModGhpcyk7CgogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5JTlZPS0VfU1RBVElDX1RZUEVDT0RFOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnaW52b2tlIHN0YXRpYzogJGVsZW1lbnQnOwp9CgpjbGFzcyBISW52b2tlU3VwZXIgZXh0ZW5kcyBISW52b2tlU3RhdGljIHsKICAvLy8gVGhlIGNsYXNzIHdoZXJlIHRoZSBjYWxsIHRvIHN1cGVyIGlzIGJlaW5nIGRvbmUuCiAgZmluYWwgQ2xhc3NFbnRpdHkgY2FsbGVyOwogIGZpbmFsIGJvb2wgaXNTZXR0ZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgU2VsZWN0b3Igc2VsZWN0b3I7CgogIEhJbnZva2VTdXBlcigKICAgICAgTWVtYmVyRW50aXR5IGVsZW1lbnQsCiAgICAgIHRoaXMuY2FsbGVyLAogICAgICB0aGlzLnNlbGVjdG9yLAogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLAogICAgICBib29sIGlzSW50ZXJjZXB0ZWQsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSwKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHt0aGlzLmlzU2V0dGVyfSkKICAgICAgOiBzdXBlcihlbGVtZW50LCBpbnB1dHMsIHR5cGUsIHR5cGVBcmd1bWVudHMsCiAgICAgICAgICAgIGlzSW50ZXJjZXB0ZWQ6IGlzSW50ZXJjZXB0ZWQpIHsKICAgIHRoaXMuc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICB9CgogIEhJbnN0cnVjdGlvbiBnZXQgcmVjZWl2ZXIgPT4gaW5wdXRzWzBdOwogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBnZXREYXJ0UmVjZWl2ZXIoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gaXNDYWxsT25JbnRlcmNlcHRvcihjbG9zZWRXb3JsZCkgPyBpbnB1dHNbMV0gOiBpbnB1dHNbMF07CiAgfQoKICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoaXMgY2FsbCBpcyBvbiBhbiBpbnRlcmNlcHRvciBvYmplY3QuCiAgYm9vbCBpc0NhbGxPbkludGVyY2VwdG9yKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGlzSW50ZXJjZXB0ZWRDYWxsICYmIHJlY2VpdmVyLmlzSW50ZXJjZXB0b3IoY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnaW52b2tlIHN1cGVyOiAkZWxlbWVudCc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJbnZva2VTdXBlcih0aGlzKTsKCiAgSEluc3RydWN0aW9uIGdldCB2YWx1ZSB7CiAgICBhc3NlcnQoaXNTZXR0ZXIpOwogICAgLy8gVGhlICdpbnB1dHMnIGFyZSBbcmVjZWl2ZXIsIHZhbHVlXSBvciBbaW50ZXJjZXB0b3IsIHJlY2VpdmVyLCB2YWx1ZV0uCiAgICByZXR1cm4gaW5wdXRzLmxhc3Q7CiAgfQp9CgpjbGFzcyBISW52b2tlQ29uc3RydWN0b3JCb2R5IGV4dGVuZHMgSEludm9rZVN0YXRpYyB7CiAgLy8gVGhlICdpbnB1dHMnIGFyZQogIC8vICAgICBbcmVjZWl2ZXIsIGFyZzEsIC4uLiwgYXJnTl0gb3IKICAvLyAgICAgW2ludGVyY2VwdG9yLCByZWNlaXZlciwgYXJnMSwgLi4uIGFyZ05dLgogIEhJbnZva2VDb25zdHJ1Y3RvckJvZHkoCiAgICAgIENvbnN0cnVjdG9yQm9keUVudGl0eSBlbGVtZW50LAogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKQogICAgICA6IHN1cGVyKGVsZW1lbnQsIGlucHV0cywgdHlwZSwgY29uc3QgPERhcnRUeXBlPltdKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnaW52b2tlIGNvbnN0cnVjdG9yIGJvZHk6ICR7ZWxlbWVudC5uYW1lfSc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJbnZva2VDb25zdHJ1Y3RvckJvZHkodGhpcyk7Cn0KCmNsYXNzIEhJbnZva2VHZW5lcmF0b3JCb2R5IGV4dGVuZHMgSEludm9rZVN0YXRpYyB7CiAgLy8gRGlyZWN0bHkgY2FsbCB0aGUgSkdlbmVyYXRvckJvZHkgbWV0aG9kLiBUaGUgZ2VuZXJhdG9yIGJvZHkgY2FuIGJlIGEgc3RhdGljCiAgLy8gbWV0aG9kIG9yIGEgbWVtYmVyLiBUaGUgdGFyZ2V0IGlzIGRpcmVjdGx5IGNhbGxlZC4KICAvLyBUaGUgJ2lucHV0cycgYXJlCiAgLy8gICAgIFthcmcxLCAuLi4sIGFyZ05dIG9yCiAgLy8gICAgIFtyZWNlaXZlciwgYXJnMSwgLi4uLCBhcmdOXSBvcgogIC8vICAgICBbaW50ZXJjZXB0b3IsIHJlY2VpdmVyLCBhcmcxLCAuLi4gYXJnTl0uCiAgLy8gVGhlICdpbnB1dHMnIG1heSBvciBtYXkgbm90IGhhdmUgYW4gYWRkaXRpb25hbCB0eXBlIGFyZ3VtZW50IHVzZWQgZm9yCiAgLy8gY3JlYXRpbmcgdGhlIGdlbmVyYXRvciAoVCBmb3IgbmV3IENvbXBsZXRlcjxUPigpIGluc2lkZSB0aGUgYm9keSkuCiAgSEludm9rZUdlbmVyYXRvckJvZHkoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikKICAgICAgOiBzdXBlcihlbGVtZW50LCBpbnB1dHMsIHR5cGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSkgewogICAgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0hJbnZva2VHZW5lcmF0b3JCb2R5KCR7ZWxlbWVudC5uYW1lfSknOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0SW52b2tlR2VuZXJhdG9yQm9keSh0aGlzKTsKfQoKYWJzdHJhY3QgY2xhc3MgSEZpZWxkQWNjZXNzIGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBmaW5hbCBGaWVsZEVudGl0eSBlbGVtZW50OwoKICBIRmllbGRBY2Nlc3ModGhpcy5lbGVtZW50LCBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIoaW5wdXRzLCB0eXBlKTsKCiAgSEluc3RydWN0aW9uIGdldCByZWNlaXZlciA9PiBpbnB1dHNbMF07Cn0KCmNsYXNzIEhGaWVsZEdldCBleHRlbmRzIEhGaWVsZEFjY2VzcyB7CiAgZmluYWwgYm9vbCBpc0Fzc2lnbmFibGU7CgogIEhGaWVsZEdldChGaWVsZEVudGl0eSBlbGVtZW50LCBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEFic3RyYWN0VmFsdWUgdHlwZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHtib29sIGlzQXNzaWduYWJsZX0pCiAgICAgIDogdGhpcy5pc0Fzc2lnbmFibGUgPQogICAgICAgICAgICAoaXNBc3NpZ25hYmxlICE9IG51bGwpID8gaXNBc3NpZ25hYmxlIDogZWxlbWVudC5pc0Fzc2lnbmFibGUsCiAgICAgICAgc3VwZXIoZWxlbWVudCwgPEhJbnN0cnVjdGlvbj5bcmVjZWl2ZXJdLCB0eXBlKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgc2V0VXNlR3ZuKCk7CiAgICBpZiAodGhpcy5pc0Fzc2lnbmFibGUpIHsKICAgICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uSW5zdGFuY2VQcm9wZXJ0eVN0b3JlKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJjZXB0b3IoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoc291cmNlRWxlbWVudCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAvLyBJbiBjYXNlIG9mIGEgY2xvc3VyZSBpbnNpZGUgYW4gaW50ZXJjZXB0b3IgY2xhc3MsIFs6dGhpczpdIGlzCiAgICAvLyBzdG9yZWQgaW4gdGhlIGdlbmVyYXRlZCBjbG9zdXJlIGNsYXNzLCBhbmQgYWNjZXNzZWQgdGhyb3VnaCBhCiAgICAvLyBbSEZpZWxkR2V0XS4KICAgIGlmIChzb3VyY2VFbGVtZW50IGlzIFRoaXNMb2NhbCkgewogICAgICBUaGlzTG9jYWwgdGhpc0xvY2FsID0gc291cmNlRWxlbWVudDsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmludGVyY2VwdG9yRGF0YQogICAgICAgICAgLmlzSW50ZXJjZXB0ZWRDbGFzcyh0aGlzTG9jYWwuZW5jbG9zaW5nQ2xhc3MpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgcmVjZWl2ZXIuaXNOdWxsKGRvbWFpbikuaXNQb3RlbnRpYWxseVRydWU7CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBnZXREYXJ0UmVjZWl2ZXIoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSA9PiByZWNlaXZlcjsKICBAb3ZlcnJpZGUKICBib29sIG9ubHlUaHJvd3NOU00oKSA9PiB0cnVlOwogIGJvb2wgZ2V0IGlzTnVsbENoZWNrID0+IGVsZW1lbnQgPT0gbnVsbDsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRGaWVsZEdldCh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLkZJRUxEX0dFVF9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhGaWVsZEdldDsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEZpZWxkR2V0IG90aGVyKSA9PiBlbGVtZW50ID09IG90aGVyLmVsZW1lbnQ7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkZpZWxkR2V0KGVsZW1lbnQ9JGVsZW1lbnQsdHlwZT0kaW5zdHJ1Y3Rpb25UeXBlKSI7Cn0KCmNsYXNzIEhGaWVsZFNldCBleHRlbmRzIEhGaWVsZEFjY2VzcyB7CiAgSEZpZWxkU2V0KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluLCBGaWVsZEVudGl0eSBlbGVtZW50LAogICAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEhJbnN0cnVjdGlvbiB2YWx1ZSkKICAgICAgOiBzdXBlcihlbGVtZW50LCA8SEluc3RydWN0aW9uPltyZWNlaXZlciwgdmFsdWVdLCBkb21haW4uZW1wdHlUeXBlKSB7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgc2lkZUVmZmVjdHMuc2V0Q2hhbmdlc0luc3RhbmNlUHJvcGVydHkoKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY2FuVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIHJlY2VpdmVyLmlzTnVsbChkb21haW4pLmlzUG90ZW50aWFsbHlUcnVlOwoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gZ2V0RGFydFJlY2VpdmVyKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgPT4gcmVjZWl2ZXI7CiAgQG92ZXJyaWRlCiAgYm9vbCBvbmx5VGhyb3dzTlNNKCkgPT4gdHJ1ZTsKCiAgSEluc3RydWN0aW9uIGdldCB2YWx1ZSA9PiBpbnB1dHNbMV07CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRGaWVsZFNldCh0aGlzKTsKCiAgLy8gSEZpZWxkU2V0IGlzIGFuIGV4cHJlc3Npb24gaWYgaXQgaGFzIGEgdXNlci4KICBAb3ZlcnJpZGUKICBib29sIGlzSnNTdGF0ZW1lbnQoKSA9PiB1c2VkQnkuaXNFbXB0eTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkZpZWxkU2V0KGVsZW1lbnQ9JGVsZW1lbnQsdHlwZT0kaW5zdHJ1Y3Rpb25UeXBlKSI7Cn0KCmNsYXNzIEhHZXRMZW5ndGggZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIGZpbmFsIGJvb2wgaXNBc3NpZ25hYmxlOwogIEhHZXRMZW5ndGgoSEluc3RydWN0aW9uIHJlY2VpdmVyLCBBYnN0cmFjdFZhbHVlIHR5cGUsCiAgICAgIHtib29sIHRoaXMuaXNBc3NpZ25hYmxlfSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltyZWNlaXZlcl0sIHR5cGUpIHsKICAgIGFzc2VydChpc0Fzc2lnbmFibGUgIT0gbnVsbCk7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgc2V0VXNlR3ZuKCk7CiAgICBpZiAodGhpcy5pc0Fzc2lnbmFibGUpIHsKICAgICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uSW5zdGFuY2VQcm9wZXJ0eVN0b3JlKCk7CiAgICB9CiAgfQoKICBISW5zdHJ1Y3Rpb24gZ2V0IHJlY2VpdmVyID0+IGlucHV0cy5zaW5nbGU7CgogIEBvdmVycmlkZQogIGJvb2wgY2FuVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIHJlY2VpdmVyLmlzTnVsbChkb21haW4pLmlzUG90ZW50aWFsbHlUcnVlOwoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gZ2V0RGFydFJlY2VpdmVyKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgPT4gcmVjZWl2ZXI7CiAgQG92ZXJyaWRlCiAgYm9vbCBvbmx5VGhyb3dzTlNNKCkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRHZXRMZW5ndGgodGhpcyk7CgogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5HRVRfTEVOR1RIX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSEdldExlbmd0aDsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEdldExlbmd0aCBvdGhlcikgPT4gdHJ1ZTsKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiR2V0TGVuZ3RoKCkiOwp9CgovLy8gSFJlYWRNb2RpZnlXcml0ZSBpcyBhIGxhdGUgc3RhZ2UgaW5zdHJ1Y3Rpb24gZm9yIGEgZmllbGQgKHByb3BlcnR5KSB1cGRhdGUKLy8vIHZpYSBhbiBhc3NpZ25tZW50IG9wZXJhdGlvbiBvciBwcmUtIG9yIHBvc3QtaW5jcmVtZW50LgpjbGFzcyBIUmVhZE1vZGlmeVdyaXRlIGV4dGVuZHMgSExhdGVJbnN0cnVjdGlvbiB7CiAgc3RhdGljIGNvbnN0IEFTU0lHTl9PUCA9IDA7CiAgc3RhdGljIGNvbnN0IFBSRV9PUCA9IDE7CiAgc3RhdGljIGNvbnN0IFBPU1RfT1AgPSAyOwogIGZpbmFsIEZpZWxkRW50aXR5IGVsZW1lbnQ7CiAgZmluYWwgU3RyaW5nIGpzT3A7CiAgZmluYWwgaW50IG9wS2luZDsKCiAgSFJlYWRNb2RpZnlXcml0ZS5fKHRoaXMuZWxlbWVudCwgdGhpcy5qc09wLCB0aGlzLm9wS2luZCwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGlucHV0cywgdHlwZSkgewogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxTaWRlRWZmZWN0cygpOwogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxEZXBlbmRlbmNpZXMoKTsKICAgIHNpZGVFZmZlY3RzLnNldENoYW5nZXNJbnN0YW5jZVByb3BlcnR5KCk7CiAgICBzaWRlRWZmZWN0cy5zZXREZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmUoKTsKICB9CgogIEhSZWFkTW9kaWZ5V3JpdGUuYXNzaWduT3AoRmllbGRFbnRpdHkgZWxlbWVudCwgU3RyaW5nIGpzT3AsCiAgICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciwgSEluc3RydWN0aW9uIG9wZXJhbmQsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiB0aGlzLl8oCiAgICAgICAgICAgIGVsZW1lbnQsIGpzT3AsIEFTU0lHTl9PUCwgPEhJbnN0cnVjdGlvbj5bcmVjZWl2ZXIsIG9wZXJhbmRdLCB0eXBlKTsKCiAgSFJlYWRNb2RpZnlXcml0ZS5wcmVPcChGaWVsZEVudGl0eSBlbGVtZW50LCBTdHJpbmcganNPcCwKICAgICAgSEluc3RydWN0aW9uIHJlY2VpdmVyLCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogdGhpcy5fKGVsZW1lbnQsIGpzT3AsIFBSRV9PUCwgPEhJbnN0cnVjdGlvbj5bcmVjZWl2ZXJdLCB0eXBlKTsKCiAgSFJlYWRNb2RpZnlXcml0ZS5wb3N0T3AoRmllbGRFbnRpdHkgZWxlbWVudCwgU3RyaW5nIGpzT3AsCiAgICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciwgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHRoaXMuXyhlbGVtZW50LCBqc09wLCBQT1NUX09QLCA8SEluc3RydWN0aW9uPltyZWNlaXZlcl0sIHR5cGUpOwoKICBISW5zdHJ1Y3Rpb24gZ2V0IHJlY2VpdmVyID0+IGlucHV0c1swXTsKCiAgYm9vbCBnZXQgaXNQcmVPcCA9PiBvcEtpbmQgPT0gUFJFX09QOwogIGJvb2wgZ2V0IGlzUG9zdE9wID0+IG9wS2luZCA9PSBQT1NUX09QOwogIGJvb2wgZ2V0IGlzQXNzaWduT3AgPT4gb3BLaW5kID09IEFTU0lHTl9PUDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgcmVjZWl2ZXIuaXNOdWxsKGRvbWFpbikuaXNQb3RlbnRpYWxseVRydWU7CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBnZXREYXJ0UmVjZWl2ZXIoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSA9PiByZWNlaXZlcjsKICBAb3ZlcnJpZGUKICBib29sIG9ubHlUaHJvd3NOU00oKSA9PiB0cnVlOwoKICBISW5zdHJ1Y3Rpb24gZ2V0IHZhbHVlID0+IGlucHV0c1sxXTsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFJlYWRNb2RpZnlXcml0ZSh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0pzU3RhdGVtZW50KCkgPT4gaXNBc3NpZ25PcDsKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiUmVhZE1vZGlmeVdyaXRlICRqc09wICRvcEtpbmQgJGVsZW1lbnQiOwp9CgphYnN0cmFjdCBjbGFzcyBITG9jYWxBY2Nlc3MgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIGZpbmFsIExvY2FsIHZhcmlhYmxlOwoKICBITG9jYWxBY2Nlc3ModGhpcy52YXJpYWJsZSwgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGlucHV0cywgdHlwZSk7CgogIEhJbnN0cnVjdGlvbiBnZXQgcmVjZWl2ZXIgPT4gaW5wdXRzWzBdOwp9CgpjbGFzcyBITG9jYWxHZXQgZXh0ZW5kcyBITG9jYWxBY2Nlc3MgewogIC8vIE5vIG5lZWQgdG8gdXNlIEdWTiBmb3IgYSBbSExvY2FsR2V0XSwgaXQgaXMganVzdCBhIGxvY2FsCiAgLy8gYWNjZXNzLgogIEhMb2NhbEdldChMb2NhbCB2YXJpYWJsZSwgSExvY2FsVmFsdWUgbG9jYWwsIEFic3RyYWN0VmFsdWUgdHlwZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogc3VwZXIodmFyaWFibGUsIDxISW5zdHJ1Y3Rpb24+W2xvY2FsXSwgdHlwZSkgewogICAgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRMb2NhbEdldCh0aGlzKTsKCiAgSExvY2FsVmFsdWUgZ2V0IGxvY2FsID0+IGlucHV0c1swXTsKfQoKY2xhc3MgSExvY2FsU2V0IGV4dGVuZHMgSExvY2FsQWNjZXNzIHsKICBITG9jYWxTZXQoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIExvY2FsIHZhcmlhYmxlLCBITG9jYWxWYWx1ZSBsb2NhbCwKICAgICAgSEluc3RydWN0aW9uIHZhbHVlKQogICAgICA6IHN1cGVyKHZhcmlhYmxlLCA8SEluc3RydWN0aW9uPltsb2NhbCwgdmFsdWVdLCBkb21haW4uZW1wdHlUeXBlKTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRMb2NhbFNldCh0aGlzKTsKCiAgSExvY2FsVmFsdWUgZ2V0IGxvY2FsID0+IGlucHV0c1swXTsKICBISW5zdHJ1Y3Rpb24gZ2V0IHZhbHVlID0+IGlucHV0c1sxXTsKICBAb3ZlcnJpZGUKICBib29sIGlzSnNTdGF0ZW1lbnQoKSA9PiB0cnVlOwp9CgphYnN0cmFjdCBjbGFzcyBIRm9yZWlnbiBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSEZvcmVpZ24oQWJzdHJhY3RWYWx1ZSB0eXBlLCBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzKSA6IHN1cGVyKGlucHV0cywgdHlwZSk7CgogIGJvb2wgZ2V0IGlzU3RhdGVtZW50ID0+IGZhbHNlOwogIE5hdGl2ZUJlaGF2aW9yIGdldCBuYXRpdmVCZWhhdmlvciA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBib29sIGNhblRocm93KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSB7CiAgICByZXR1cm4gc2lkZUVmZmVjdHMuaGFzU2lkZUVmZmVjdHMoKSB8fCBzaWRlRWZmZWN0cy5kZXBlbmRzT25Tb21ldGhpbmcoKTsKICB9Cn0KCmNsYXNzIEhGb3JlaWduQ29kZSBleHRlbmRzIEhGb3JlaWduIHsKICBmaW5hbCBqcy5UZW1wbGF0ZSBjb2RlVGVtcGxhdGU7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc1N0YXRlbWVudDsKICBAb3ZlcnJpZGUKICBmaW5hbCBOYXRpdmVCZWhhdmlvciBuYXRpdmVCZWhhdmlvcjsKICBOYXRpdmVUaHJvd0JlaGF2aW9yIHRocm93QmVoYXZpb3I7CiAgZmluYWwgRnVuY3Rpb25FbnRpdHkgZm9yZWlnbkZ1bmN0aW9uOwoKICBIRm9yZWlnbkNvZGUodGhpcy5jb2RlVGVtcGxhdGUsIEFic3RyYWN0VmFsdWUgdHlwZSwgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cywKICAgICAge3RoaXMuaXNTdGF0ZW1lbnQ6IGZhbHNlLAogICAgICBTaWRlRWZmZWN0cyBlZmZlY3RzLAogICAgICBOYXRpdmVCZWhhdmlvciBuYXRpdmVCZWhhdmlvciwKICAgICAgTmF0aXZlVGhyb3dCZWhhdmlvciB0aHJvd0JlaGF2aW9yLAogICAgICB0aGlzLmZvcmVpZ25GdW5jdGlvbn0pCiAgICAgIDogdGhpcy5uYXRpdmVCZWhhdmlvciA9IG5hdGl2ZUJlaGF2aW9yLAogICAgICAgIHRoaXMudGhyb3dCZWhhdmlvciA9IHRocm93QmVoYXZpb3IsCiAgICAgICAgc3VwZXIodHlwZSwgaW5wdXRzKSB7CiAgICBhc3NlcnQoY29kZVRlbXBsYXRlICE9IG51bGwpOwogICAgaWYgKGVmZmVjdHMgPT0gbnVsbCAmJiBuYXRpdmVCZWhhdmlvciAhPSBudWxsKSB7CiAgICAgIGVmZmVjdHMgPSBuYXRpdmVCZWhhdmlvci5zaWRlRWZmZWN0czsKICAgIH0KICAgIGlmICh0aGlzLnRocm93QmVoYXZpb3IgPT0gbnVsbCkgewogICAgICB0aGlzLnRocm93QmVoYXZpb3IgPSAobmF0aXZlQmVoYXZpb3IgPT0gbnVsbCkKICAgICAgICAgID8gTmF0aXZlVGhyb3dCZWhhdmlvci5NQVkKICAgICAgICAgIDogbmF0aXZlQmVoYXZpb3IudGhyb3dCZWhhdmlvcjsKICAgIH0KICAgIGFzc2VydCh0aGlzLnRocm93QmVoYXZpb3IgIT0gbnVsbCk7CgogICAgaWYgKGVmZmVjdHMgIT0gbnVsbCkgc2lkZUVmZmVjdHMuYWRkKGVmZmVjdHMpOwogICAgaWYgKG5hdGl2ZUJlaGF2aW9yICE9IG51bGwgJiYgbmF0aXZlQmVoYXZpb3IudXNlR3ZuKSB7CiAgICAgIHNldFVzZUd2bigpOwogICAgfQogIH0KCiAgSEZvcmVpZ25Db2RlLnN0YXRlbWVudChqcy5UZW1wbGF0ZSBjb2RlVGVtcGxhdGUsIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsCiAgICAgIFNpZGVFZmZlY3RzIGVmZmVjdHMsIE5hdGl2ZUJlaGF2aW9yIG5hdGl2ZUJlaGF2aW9yLCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogdGhpcyhjb2RlVGVtcGxhdGUsIHR5cGUsIGlucHV0cywKICAgICAgICAgICAgaXNTdGF0ZW1lbnQ6IHRydWUsCiAgICAgICAgICAgIGVmZmVjdHM6IGVmZmVjdHMsCiAgICAgICAgICAgIG5hdGl2ZUJlaGF2aW9yOiBuYXRpdmVCZWhhdmlvcik7CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0Rm9yZWlnbkNvZGUodGhpcyk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNKc1N0YXRlbWVudCgpID0+IGlzU3RhdGVtZW50OwogIEBvdmVycmlkZQogIGJvb2wgY2FuVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pIHsKICAgIGlmIChpbnB1dHMubGVuZ3RoID4gMCkgewogICAgICByZXR1cm4gaW5wdXRzLmZpcnN0LmlzTnVsbChkb21haW4pLmlzUG90ZW50aWFsbHlUcnVlCiAgICAgICAgICA/IHRocm93QmVoYXZpb3IuY2FuVGhyb3cKICAgICAgICAgIDogdGhyb3dCZWhhdmlvci5vbk5vbk51bGwuY2FuVGhyb3c7CiAgICB9CiAgICByZXR1cm4gdGhyb3dCZWhhdmlvci5jYW5UaHJvdzsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb25seVRocm93c05TTSgpID0+IHRocm93QmVoYXZpb3IuaXNPbmx5TnVsbE5TTUd1YXJkOwoKICBAb3ZlcnJpZGUKICBib29sIGlzQWxsb2NhdGlvbihBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4KICAgICAgbmF0aXZlQmVoYXZpb3IgIT0gbnVsbCAmJgogICAgICBuYXRpdmVCZWhhdmlvci5pc0FsbG9jYXRpb24gJiYKICAgICAgaXNOdWxsKGRvbWFpbikuaXNEZWZpbml0ZWx5RmFsc2U7CgogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5GT1JFSUdOX0NPREVfVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKG90aGVyKSA9PiBvdGhlciBpcyBIRm9yZWlnbkNvZGU7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhGb3JlaWduQ29kZSBvdGhlcikgewogICAgcmV0dXJuIGNvZGVUZW1wbGF0ZS5zb3VyY2UgIT0gbnVsbCAmJgogICAgICAgIGNvZGVUZW1wbGF0ZS5zb3VyY2UgPT0gb3RoZXIuY29kZVRlbXBsYXRlLnNvdXJjZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdIRm9yZWlnbkNvZGUoIiR7Y29kZVRlbXBsYXRlLnNvdXJjZX0iKSc7Cn0KCmFic3RyYWN0IGNsYXNzIEhJbnZva2VCaW5hcnkgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yOwogIEhJbnZva2VCaW5hcnkoCiAgICAgIEhJbnN0cnVjdGlvbiBsZWZ0LCBISW5zdHJ1Y3Rpb24gcmlnaHQsIHRoaXMuc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltsZWZ0LCByaWdodF0sIHR5cGUpIHsKICAgIHNpZGVFZmZlY3RzLmNsZWFyQWxsU2lkZUVmZmVjdHMoKTsKICAgIHNpZGVFZmZlY3RzLmNsZWFyQWxsRGVwZW5kZW5jaWVzKCk7CiAgICBzZXRVc2VHdm4oKTsKICB9CgogIEhJbnN0cnVjdGlvbiBnZXQgbGVmdCA9PiBpbnB1dHNbMF07CiAgSEluc3RydWN0aW9uIGdldCByaWdodCA9PiBpbnB1dHNbMV07CgogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCk7Cn0KCmFic3RyYWN0IGNsYXNzIEhCaW5hcnlBcml0aG1ldGljIGV4dGVuZHMgSEludm9rZUJpbmFyeSB7CiAgSEJpbmFyeUFyaXRobWV0aWMoSEluc3RydWN0aW9uIGxlZnQsIEhJbnN0cnVjdGlvbiByaWdodCwgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCk7Cn0KCmNsYXNzIEhBZGQgZXh0ZW5kcyBIQmluYXJ5QXJpdGhtZXRpYyB7CiAgSEFkZChISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRBZGQodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmFkZDsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uQUREX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSEFkZDsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgpjbGFzcyBIRGl2aWRlIGV4dGVuZHMgSEJpbmFyeUFyaXRobWV0aWMgewogIEhEaXZpZGUoSEluc3RydWN0aW9uIGxlZnQsIEhJbnN0cnVjdGlvbiByaWdodCwgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0RGl2aWRlKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpID0+IGNvbnN0YW50X3N5c3RlbS5kaXZpZGU7CiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLkRJVklERV9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhEaXZpZGU7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSE11bHRpcGx5IGV4dGVuZHMgSEJpbmFyeUFyaXRobWV0aWMgewogIEhNdWx0aXBseShISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRNdWx0aXBseSh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSA9PiBjb25zdGFudF9zeXN0ZW0ubXVsdGlwbHk7CiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLk1VTFRJUExZX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSE11bHRpcGx5OwogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IHRydWU7Cn0KCmNsYXNzIEhTdWJ0cmFjdCBleHRlbmRzIEhCaW5hcnlBcml0aG1ldGljIHsKICBIU3VidHJhY3QoSEluc3RydWN0aW9uIGxlZnQsIEhJbnN0cnVjdGlvbiByaWdodCwgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0U3VidHJhY3QodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLnN1YnRyYWN0OwogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5TVUJUUkFDVF9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhTdWJ0cmFjdDsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgpjbGFzcyBIVHJ1bmNhdGluZ0RpdmlkZSBleHRlbmRzIEhCaW5hcnlBcml0aG1ldGljIHsKICBIVHJ1bmNhdGluZ0RpdmlkZShISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRUcnVuY2F0aW5nRGl2aWRlKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpID0+CiAgICAgIGNvbnN0YW50X3N5c3RlbS50cnVuY2F0aW5nRGl2aWRlOwogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5UUlVOQ0FUSU5HX0RJVklERV9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhUcnVuY2F0aW5nRGl2aWRlOwogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IHRydWU7Cn0KCmNsYXNzIEhSZW1haW5kZXIgZXh0ZW5kcyBIQmluYXJ5QXJpdGhtZXRpYyB7CiAgSFJlbWFpbmRlcihISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRSZW1haW5kZXIodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLnJlbWFpbmRlcjsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uUkVNQUlOREVSX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSFJlbWFpbmRlcjsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgovLy8gQW4gW0hTd2l0Y2hdIGluc3RydWN0aW9uIGhhcyBvbmUgaW5wdXQgZm9yIHRoZSBpbmNvbWluZwovLy8gdmFsdWUsIGFuZCBvbmUgaW5wdXQgcGVyIGNvbnN0YW50IHRoYXQgaXQgY2FuIHN3aXRjaCBvbi4KLy8vIEl0cyBibG9jayBoYXMgb25lIHN1Y2Nlc3NvciBwZXIgY29uc3RhbnQsIGFuZCBvbmUgZm9yIHRoZSBkZWZhdWx0LgpjbGFzcyBIU3dpdGNoIGV4dGVuZHMgSENvbnRyb2xGbG93IHsKICBIU3dpdGNoKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluLCBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzKQogICAgICA6IHN1cGVyKGRvbWFpbiwgaW5wdXRzKTsKCiAgSENvbnN0YW50IGNvbnN0YW50KGludCBpbmRleCkgPT4gaW5wdXRzW2luZGV4ICsgMV07CiAgSEluc3RydWN0aW9uIGdldCBleHByZXNzaW9uID0+IGlucHV0c1swXTsKCiAgLy8vIFByb3ZpZGVzIHRoZSB0YXJnZXQgdG8ganVtcCB0byBpZiBub25lIG9mIHRoZSBjb25zdGFudHMgbWF0Y2gKICAvLy8gdGhlIGV4cHJlc3Npb24uIElmIHRoZSBzd2l0Y2ggaGFkIG5vIGRlZmF1bHQgY2FzZSwgdGhpcyBpcyB0aGUKICAvLy8gZm9sbG93aW5nIGpvaW4tYmxvY2suCiAgSEJhc2ljQmxvY2sgZ2V0IGRlZmF1bHRUYXJnZXQgPT4gYmxvY2suc3VjY2Vzc29ycy5sYXN0OwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFN3aXRjaCh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkhTd2l0Y2ggY2FzZXMgPSAkaW5wdXRzIjsKfQoKYWJzdHJhY3QgY2xhc3MgSEJpbmFyeUJpdE9wIGV4dGVuZHMgSEludm9rZUJpbmFyeSB7CiAgSEJpbmFyeUJpdE9wKEhJbnN0cnVjdGlvbiBsZWZ0LCBISW5zdHJ1Y3Rpb24gcmlnaHQsIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIobGVmdCwgcmlnaHQsIHNlbGVjdG9yLCB0eXBlKTsKfQoKY2xhc3MgSFNoaWZ0TGVmdCBleHRlbmRzIEhCaW5hcnlCaXRPcCB7CiAgSFNoaWZ0TGVmdChISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRTaGlmdExlZnQodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLnNoaWZ0TGVmdDsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uU0hJRlRfTEVGVF9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhTaGlmdExlZnQ7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSFNoaWZ0UmlnaHQgZXh0ZW5kcyBIQmluYXJ5Qml0T3AgewogIEhTaGlmdFJpZ2h0KEhJbnN0cnVjdGlvbiBsZWZ0LCBISW5zdHJ1Y3Rpb24gcmlnaHQsIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIobGVmdCwgcmlnaHQsIHNlbGVjdG9yLCB0eXBlKTsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFNoaWZ0UmlnaHQodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLnNoaWZ0UmlnaHQ7CiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLlNISUZUX1JJR0hUX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSFNoaWZ0UmlnaHQ7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSEJpdE9yIGV4dGVuZHMgSEJpbmFyeUJpdE9wIHsKICBIQml0T3IoSEluc3RydWN0aW9uIGxlZnQsIEhJbnN0cnVjdGlvbiByaWdodCwgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0Qml0T3IodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmJpdE9yOwogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5CSVRfT1JfVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKG90aGVyKSA9PiBvdGhlciBpcyBIQml0T3I7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSEJpdEFuZCBleHRlbmRzIEhCaW5hcnlCaXRPcCB7CiAgSEJpdEFuZChISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRCaXRBbmQodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmJpdEFuZDsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uQklUX0FORF9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhCaXRBbmQ7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSEJpdFhvciBleHRlbmRzIEhCaW5hcnlCaXRPcCB7CiAgSEJpdFhvcihISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRCaXRYb3IodGhpcyk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmJpdFhvcjsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uQklUX1hPUl9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhCaXRYb3I7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKYWJzdHJhY3QgY2xhc3MgSEludm9rZVVuYXJ5IGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTZWxlY3RvciBzZWxlY3RvcjsKICBISW52b2tlVW5hcnkoSEluc3RydWN0aW9uIGlucHV0LCB0aGlzLnNlbGVjdG9yLCB0eXBlKQogICAgICA6IHN1cGVyKDxISW5zdHJ1Y3Rpb24+W2lucHV0XSwgdHlwZSkgewogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxTaWRlRWZmZWN0cygpOwogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxEZXBlbmRlbmNpZXMoKTsKICAgIHNldFVzZUd2bigpOwogIH0KCiAgSEluc3RydWN0aW9uIGdldCBvcGVyYW5kID0+IGlucHV0c1swXTsKCiAgY29uc3RhbnRfc3lzdGVtLlVuYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpOwp9CgpjbGFzcyBITmVnYXRlIGV4dGVuZHMgSEludm9rZVVuYXJ5IHsKICBITmVnYXRlKEhJbnN0cnVjdGlvbiBpbnB1dCwgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihpbnB1dCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0TmVnYXRlKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uVW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLm5lZ2F0ZTsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uTkVHQVRFX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSE5lZ2F0ZTsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgpjbGFzcyBIQWJzIGV4dGVuZHMgSEludm9rZVVuYXJ5IHsKICBIQWJzKEhJbnN0cnVjdGlvbiBpbnB1dCwgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihpbnB1dCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0QWJzKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uVW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmFiczsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uQUJTX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSEFiczsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgpjbGFzcyBIQml0Tm90IGV4dGVuZHMgSEludm9rZVVuYXJ5IHsKICBIQml0Tm90KEhJbnN0cnVjdGlvbiBpbnB1dCwgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihpbnB1dCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0Qml0Tm90KHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uVW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgPT4gY29uc3RhbnRfc3lzdGVtLmJpdE5vdDsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uQklUX05PVF9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhCaXROb3Q7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSEV4aXQgZXh0ZW5kcyBIQ29udHJvbEZsb3cgewogIEhFeGl0KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA6IHN1cGVyKGRvbWFpbiwgY29uc3QgPEhJbnN0cnVjdGlvbj5bXSk7CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnZXhpdCc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRFeGl0KHRoaXMpOwp9CgpjbGFzcyBIR290byBleHRlbmRzIEhDb250cm9sRmxvdyB7CiAgSEdvdG8oQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pIDogc3VwZXIoZG9tYWluLCBjb25zdCA8SEluc3RydWN0aW9uPltdKTsKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdnb3RvJzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEdvdG8odGhpcyk7Cn0KCmFic3RyYWN0IGNsYXNzIEhKdW1wIGV4dGVuZHMgSENvbnRyb2xGbG93IHsKICBmaW5hbCBKdW1wVGFyZ2V0IHRhcmdldDsKICBmaW5hbCBMYWJlbERlZmluaXRpb24gbGFiZWw7CiAgSEp1bXAoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIHRoaXMudGFyZ2V0LAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikKICAgICAgOiBsYWJlbCA9IG51bGwsCiAgICAgICAgc3VwZXIoZG9tYWluLCBjb25zdCA8SEluc3RydWN0aW9uPltdKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQogIEhKdW1wLnRvTGFiZWwoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIExhYmVsRGVmaW5pdGlvbiBsYWJlbCwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogbGFiZWwgPSBsYWJlbCwKICAgICAgICB0YXJnZXQgPSBsYWJlbC50YXJnZXQsCiAgICAgICAgc3VwZXIoZG9tYWluLCBjb25zdCA8SEluc3RydWN0aW9uPltdKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQp9CgpjbGFzcyBIQnJlYWsgZXh0ZW5kcyBISnVtcCB7CiAgLy8vIFNpZ25hbHMgdGhhdCB0aGlzIGlzIGEgc3BlY2lhbCBicmVhayBpbnN0cnVjdGlvbiBmb3IgdGhlIHN5bnRoZXRpYyBsb29wCiAgLy8vIGdlbmVyYXRlZCBmb3IgYSBzd2l0Y2ggc3RhdGVtZW50IHdpdGggY29udGludWUgc3RhdGVtZW50cy4gU2VlCiAgLy8vIFtTc2FGcm9tQXN0TWl4aW4uYnVpbGRDb21wbGV4U3dpdGNoU3RhdGVtZW50XSBmb3IgZGV0YWlsLgogIGZpbmFsIGJvb2wgYnJlYWtTd2l0Y2hDb250aW51ZUxvb3A7CgogIEhCcmVhayhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbiwgSnVtcFRhcmdldCB0YXJnZXQsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICB7Ym9vbCB0aGlzLmJyZWFrU3dpdGNoQ29udGludWVMb29wOiBmYWxzZX0pCiAgICAgIDogc3VwZXIoZG9tYWluLCB0YXJnZXQsIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgSEJyZWFrLnRvTGFiZWwoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIExhYmVsRGVmaW5pdGlvbiBsYWJlbCwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogYnJlYWtTd2l0Y2hDb250aW51ZUxvb3AgPSBmYWxzZSwKICAgICAgICBzdXBlci50b0xhYmVsKGRvbWFpbiwgbGFiZWwsIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gKGxhYmVsICE9IG51bGwpID8gJ2JyZWFrICR7bGFiZWwubGFiZWxOYW1lfScgOiAnYnJlYWsnOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEJyZWFrKHRoaXMpOwp9CgpjbGFzcyBIQ29udGludWUgZXh0ZW5kcyBISnVtcCB7CiAgSENvbnRpbnVlKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluLCBKdW1wVGFyZ2V0IHRhcmdldCwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogc3VwZXIoZG9tYWluLCB0YXJnZXQsIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgSENvbnRpbnVlLnRvTGFiZWwoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIExhYmVsRGVmaW5pdGlvbiBsYWJlbCwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogc3VwZXIudG9MYWJlbChkb21haW4sIGxhYmVsLCBzb3VyY2VJbmZvcm1hdGlvbik7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgIChsYWJlbCAhPSBudWxsKSA/ICdjb250aW51ZSAke2xhYmVsLmxhYmVsTmFtZX0nIDogJ2NvbnRpbnVlJzsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDb250aW51ZSh0aGlzKTsKfQoKY2xhc3MgSFRyeSBleHRlbmRzIEhDb250cm9sRmxvdyB7CiAgSExvY2FsVmFsdWUgZXhjZXB0aW9uOwogIEhCYXNpY0Jsb2NrIGNhdGNoQmxvY2s7CiAgSEJhc2ljQmxvY2sgZmluYWxseUJsb2NrOwogIEhUcnkoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pIDogc3VwZXIoZG9tYWluLCBjb25zdCA8SEluc3RydWN0aW9uPltdKTsKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICd0cnknOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0VHJ5KHRoaXMpOwogIEhCYXNpY0Jsb2NrIGdldCBqb2luQmxvY2sgPT4gdGhpcy5ibG9jay5zdWNjZXNzb3JzLmxhc3Q7Cn0KCi8vIEFuIFtIRXhpdFRyeV0gY29udHJvbCBmbG93IG5vZGUgaXMgdXNlZCB3aGVuIHRoZSBib2R5IG9mIGEgdHJ5IG9yCi8vIHRoZSBib2R5IG9mIGEgY2F0Y2ggY29udGFpbnMgYSByZXR1cm4sIGJyZWFrIG9yIGNvbnRpbnVlLiBUbyBidWlsZAovLyB0aGUgY29udHJvbCBmbG93IGdyYXBoLCB3ZSBleHBsaWNpdGx5IG1hcmsgdGhlIGJvZHkgdGhhdAovLyBsZWFkcyB0byBvbmUgb2YgdGhpcyBpbnN0cnVjdGlvbiBhIHByZWRlY2Vzc29yIG9mIGNhdGNoIGFuZAovLyBmaW5hbGx5LgpjbGFzcyBIRXhpdFRyeSBleHRlbmRzIEhDb250cm9sRmxvdyB7CiAgSEV4aXRUcnkoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pIDogc3VwZXIoZG9tYWluLCBjb25zdCA8SEluc3RydWN0aW9uPltdKTsKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdleGl0IHRyeSc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRFeGl0VHJ5KHRoaXMpOwogIEhCYXNpY0Jsb2NrIGdldCBib2R5VHJ5U3VjY2Vzc29yID0+IGJsb2NrLnN1Y2Nlc3NvcnNbMF07Cn0KCmNsYXNzIEhJZiBleHRlbmRzIEhDb25kaXRpb25hbEJyYW5jaCB7CiAgSEJsb2NrRmxvdyBibG9ja0luZm9ybWF0aW9uID0gbnVsbDsKICBISWYoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIEhJbnN0cnVjdGlvbiBjb25kaXRpb24pCiAgICAgIDogc3VwZXIoZG9tYWluLCA8SEluc3RydWN0aW9uPltjb25kaXRpb25dKTsKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdpZic7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJZih0aGlzKTsKCiAgSEJhc2ljQmxvY2sgZ2V0IHRoZW5CbG9jayB7CiAgICBhc3NlcnQoaWRlbnRpY2FsKGJsb2NrLmRvbWluYXRlZEJsb2Nrc1swXSwgYmxvY2suc3VjY2Vzc29yc1swXSkpOwogICAgcmV0dXJuIGJsb2NrLnN1Y2Nlc3NvcnNbMF07CiAgfQoKICBIQmFzaWNCbG9jayBnZXQgZWxzZUJsb2NrIHsKICAgIGFzc2VydChpZGVudGljYWwoYmxvY2suZG9taW5hdGVkQmxvY2tzWzFdLCBibG9jay5zdWNjZXNzb3JzWzFdKSk7CiAgICByZXR1cm4gYmxvY2suc3VjY2Vzc29yc1sxXTsKICB9CgogIEhCYXNpY0Jsb2NrIGdldCBqb2luQmxvY2sgPT4gYmxvY2tJbmZvcm1hdGlvbi5jb250aW51YXRpb247Cn0KCmNsYXNzIEhMb29wQnJhbmNoIGV4dGVuZHMgSENvbmRpdGlvbmFsQnJhbmNoIHsKICBzdGF0aWMgY29uc3QgaW50IENPTkRJVElPTl9GSVJTVF9MT09QID0gMDsKICBzdGF0aWMgY29uc3QgaW50IERPX1dISUxFX0xPT1AgPSAxOwoKICBmaW5hbCBpbnQga2luZDsKICBITG9vcEJyYW5jaChBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbiwgSEluc3RydWN0aW9uIGNvbmRpdGlvbiwKICAgICAgW3RoaXMua2luZCA9IENPTkRJVElPTl9GSVJTVF9MT09QXSkKICAgICAgOiBzdXBlcihkb21haW4sIDxISW5zdHJ1Y3Rpb24+W2NvbmRpdGlvbl0pOwogIEBvdmVycmlkZQogIHRvU3RyaW5nKCkgPT4gJ2xvb3AtYnJhbmNoJzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdExvb3BCcmFuY2godGhpcyk7Cn0KCmNsYXNzIEhDb25zdGFudCBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgZmluYWwgQ29uc3RhbnRWYWx1ZSBjb25zdGFudDsKICBIQ29uc3RhbnQuaW50ZXJuYWwodGhpcy5jb25zdGFudCwgQWJzdHJhY3RWYWx1ZSBjb25zdGFudFR5cGUpCiAgICAgIDogc3VwZXIoPEhJbnN0cnVjdGlvbj5bXSwgY29uc3RhbnRUeXBlKTsKCiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnbGl0ZXJhbDogJHtjb25zdGFudC50b1N0cnVjdHVyZWRUZXh0KCl9JzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdENvbnN0YW50KHRoaXMpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzQ29uc3RhbnQoKSA9PiB0cnVlOwogIEBvdmVycmlkZQogIGJvb2wgaXNDb25zdGFudEJvb2xlYW4oKSA9PiBjb25zdGFudC5pc0Jvb2w7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnN0YW50TnVsbCgpID0+IGNvbnN0YW50LmlzTnVsbDsKICBAb3ZlcnJpZGUKICBib29sIGlzQ29uc3RhbnROdW1iZXIoKSA9PiBjb25zdGFudC5pc051bTsKICBAb3ZlcnJpZGUKICBib29sIGlzQ29uc3RhbnRJbnRlZ2VyKCkgPT4gY29uc3RhbnQuaXNJbnQ7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnN0YW50U3RyaW5nKCkgPT4gY29uc3RhbnQuaXNTdHJpbmc7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnN0YW50TGlzdCgpID0+IGNvbnN0YW50LmlzTGlzdDsKICBAb3ZlcnJpZGUKICBib29sIGlzQ29uc3RhbnRNYXAoKSA9PiBjb25zdGFudC5pc01hcDsKICBAb3ZlcnJpZGUKICBib29sIGlzQ29uc3RhbnRGYWxzZSgpID0+IGNvbnN0YW50LmlzRmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnN0YW50VHJ1ZSgpID0+IGNvbnN0YW50LmlzVHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludGVyY2VwdG9yKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgPT4gY29uc3RhbnQuaXNJbnRlcmNlcHRvcjsKCiAgLy8gTWF5YmUgYXZvaWQgdGhpcyBpZiB0aGUgbGl0ZXJhbCBpcyBiaWc/CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvZGVNb3Rpb25JbnZhcmlhbnQoKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBzZXQgaW5zdHJ1Y3Rpb25UeXBlKHR5cGUpIHsKICAgIC8vIE9ubHkgbGlzdHMgY2FuIGJlIHNwZWNpYWxpemVkLiBUaGUgU1NBIGJ1aWxkZXIgdXNlcyB0aGUKICAgIC8vIGluZmVycmVyIGZvciBmaW5kaW5nIHRoZSB0eXBlIG9mIGEgY29uc3RhbnQgbGlzdC4gV2Ugc2hvdWxkCiAgICAvLyBoYXZlIHRoZSBjb25zdGFudCBrbm93IGl0cyB0eXBlIGluc3RlYWQuCiAgICBpZiAoIWlzQ29uc3RhbnRMaXN0KCkpIHJldHVybjsKICAgIHN1cGVyLmluc3RydWN0aW9uVHlwZSA9IHR5cGU7CiAgfQp9CgpjbGFzcyBITm90IGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBITm90KEhJbnN0cnVjdGlvbiB2YWx1ZSwgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKDxISW5zdHJ1Y3Rpb24+W3ZhbHVlXSwgdHlwZSkgewogICAgc2V0VXNlR3ZuKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdE5vdCh0aGlzKTsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uTk9UX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSE5vdDsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgovLy8gQW4gW0hMb2NhbFZhbHVlXSByZXByZXNlbnRzIGEgbG9jYWwuIFVubGlrZSBbSFBhcmFtZXRlclZhbHVlXXMgaXRzCi8vLyBmaXJzdCB1c2UgbXVzdCBiZSBpbiBhbiBITG9jYWxTZXQuIFRoYXQgaXMsIFtIUGFyYW1ldGVyVmFsdWVdcyBoYXZlIGEKLy8vIHZhbHVlIGZyb20gdGhlIHN0YXJ0LCB3aGVyZWFzIFtITG9jYWxWYWx1ZV1zIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgZmlyc3QuCmNsYXNzIEhMb2NhbFZhbHVlIGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBITG9jYWxWYWx1ZShFbnRpdHkgdmFyaWFibGUsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltdLCB0eXBlKSB7CiAgICBzb3VyY2VFbGVtZW50ID0gdmFyaWFibGU7CiAgfQoKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdsb2NhbCAke3NvdXJjZUVsZW1lbnQubmFtZX0nOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0TG9jYWxWYWx1ZSh0aGlzKTsKfQoKY2xhc3MgSFBhcmFtZXRlclZhbHVlIGV4dGVuZHMgSExvY2FsVmFsdWUgewogIEhQYXJhbWV0ZXJWYWx1ZShFbnRpdHkgdmFyaWFibGUsIEFic3RyYWN0VmFsdWUgdHlwZSkgOiBzdXBlcih2YXJpYWJsZSwgdHlwZSk7CgogIC8vIFtIUGFyYW1ldGVyVmFsdWVdcyBhcmUgZWl0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIChpbiBmdWxseSBTU0EKICAvLyBjb252ZXJ0ZWQgY29kZSksIG9yIHRoZSBtdXRhYmxlIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIHZhbHVlIChpbgogIC8vIGluY29tcGxldGVseSBTU0EgY29udmVydGVkIGNvZGUsIGUuZy4gbWV0aG9kcyBjb250YWluaW5nIGV4Y2VwdGlvbnMpLgogIGJvb2wgdXNlZEFzVmFyaWFibGUoKSB7CiAgICBmb3IgKEhJbnN0cnVjdGlvbiB1c2VyIGluIHVzZWRCeSkgewogICAgICBpZiAodXNlciBpcyBITG9jYWxHZXQpIHJldHVybiB0cnVlOwogICAgICBpZiAodXNlciBpcyBITG9jYWxTZXQgJiYgdXNlci5sb2NhbCA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHRvU3RyaW5nKCkgPT4gJ3BhcmFtZXRlciAke3NvdXJjZUVsZW1lbnQubmFtZX0nOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0UGFyYW1ldGVyVmFsdWUodGhpcyk7Cn0KCmNsYXNzIEhUaGlzIGV4dGVuZHMgSFBhcmFtZXRlclZhbHVlIHsKICBIVGhpcyhUaGlzTG9jYWwgZWxlbWVudCwgQWJzdHJhY3RWYWx1ZSB0eXBlKSA6IHN1cGVyKGVsZW1lbnQsIHR5cGUpOwoKICBAb3ZlcnJpZGUKICBUaGlzTG9jYWwgZ2V0IHNvdXJjZUVsZW1lbnQgPT4gc3VwZXIuc291cmNlRWxlbWVudDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXQgc291cmNlRWxlbWVudChjb3ZhcmlhbnQgVGhpc0xvY2FsIGxvY2FsKSB7CiAgICBzdXBlci5zb3VyY2VFbGVtZW50ID0gbG9jYWw7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFRoaXModGhpcyk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNDb2RlTW90aW9uSW52YXJpYW50KCkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludGVyY2VwdG9yKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGNsb3NlZFdvcmxkLmludGVyY2VwdG9yRGF0YQogICAgICAgIC5pc0ludGVyY2VwdGVkQ2xhc3Moc291cmNlRWxlbWVudC5lbmNsb3NpbmdDbGFzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAndGhpcyc7Cn0KCmNsYXNzIEhQaGkgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIHN0YXRpYyBjb25zdCBJU19OT1RfTE9HSUNBTF9PUEVSQVRPUiA9IDA7CiAgc3RhdGljIGNvbnN0IElTX0FORCA9IDE7CiAgc3RhdGljIGNvbnN0IElTX09SID0gMjsKCiAgaW50IGxvZ2ljYWxPcGVyYXRvclR5cGUgPSBJU19OT1RfTE9HSUNBTF9PUEVSQVRPUjsKCiAgLy8gVGhlIG9yZGVyIG9mIHRoZSBbaW5wdXRzXSBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIG9yZGVyIG9mIHRoZQogIC8vIHByZWRlY2Vzc29yLWVkZ2VzLiBUaGF0IGlzIGlmIGFuIGlucHV0IGNvbWVzIGZyb20gdGhlIGZpcnN0IHByZWRlY2Vzc29yCiAgLy8gb2YgdGhlIHN1cnJvdW5kaW5nIGJsb2NrLCB0aGVuIHRoZSBpbnB1dCBtdXN0IGJlIHRoZSBmaXJzdCBpbiB0aGUgW0hQaGldLgogIEhQaGkoTG9jYWwgdmFyaWFibGUsIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihpbnB1dHMsIHR5cGUpIHsKICAgIHNvdXJjZUVsZW1lbnQgPSB2YXJpYWJsZTsKICB9CiAgSFBoaS5ub0lucHV0cyhMb2NhbCB2YXJpYWJsZSwgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHRoaXModmFyaWFibGUsIDxISW5zdHJ1Y3Rpb24+W10sIHR5cGUpOwogIEhQaGkuc2luZ2xlSW5wdXQoTG9jYWwgdmFyaWFibGUsIEhJbnN0cnVjdGlvbiBpbnB1dCwgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHRoaXModmFyaWFibGUsIDxISW5zdHJ1Y3Rpb24+W2lucHV0XSwgdHlwZSk7CiAgSFBoaS5tYW55SW5wdXRzKExvY2FsIHZhcmlhYmxlLCBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogdGhpcyh2YXJpYWJsZSwgaW5wdXRzLCB0eXBlKTsKCiAgdm9pZCBhZGRJbnB1dChISW5zdHJ1Y3Rpb24gaW5wdXQpIHsKICAgIGFzc2VydChpc0luQmFzaWNCbG9jaygpKTsKICAgIGlucHV0cy5hZGQoaW5wdXQpOwogICAgYXNzZXJ0KGlucHV0cy5sZW5ndGggPD0gYmxvY2sucHJlZGVjZXNzb3JzLmxlbmd0aCk7CiAgICBpbnB1dC51c2VkQnkuYWRkKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAncGhpICRpZCc7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRQaGkodGhpcyk7Cn0KCmFic3RyYWN0IGNsYXNzIEhSZWxhdGlvbmFsIGV4dGVuZHMgSEludm9rZUJpbmFyeSB7CiAgYm9vbCB1c2VzQm9vbGlmaWVkSW50ZXJjZXB0b3IgPSBmYWxzZTsKICBIUmVsYXRpb25hbChsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpIDogc3VwZXIobGVmdCwgcmlnaHQsIHNlbGVjdG9yLCB0eXBlKTsKfQoKY2xhc3MgSElkZW50aXR5IGV4dGVuZHMgSFJlbGF0aW9uYWwgewogIC8vIENhY2hlZCBjb2RlZ2VuIGRlY2lzaW9uLgogIFN0cmluZyBzaW5nbGVDb21wYXJpc29uT3A7IC8vIG51bGwsICc9PT0nLCAnPT0nCgogIEhJZGVudGl0eShsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpIDogc3VwZXIobGVmdCwgcmlnaHQsIHNlbGVjdG9yLCB0eXBlKTsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdElkZW50aXR5KHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpID0+IGNvbnN0YW50X3N5c3RlbS5pZGVudGl0eTsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uSURFTlRJVFlfVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKG90aGVyKSA9PiBvdGhlciBpcyBISWRlbnRpdHk7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSEdyZWF0ZXIgZXh0ZW5kcyBIUmVsYXRpb25hbCB7CiAgSEdyZWF0ZXIobGVmdCwgcmlnaHQsIHNlbGVjdG9yLCB0eXBlKSA6IHN1cGVyKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRHcmVhdGVyKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpID0+IGNvbnN0YW50X3N5c3RlbS5ncmVhdGVyOwogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5HUkVBVEVSX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSEdyZWF0ZXI7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gdHJ1ZTsKfQoKY2xhc3MgSEdyZWF0ZXJFcXVhbCBleHRlbmRzIEhSZWxhdGlvbmFsIHsKICBIR3JlYXRlckVxdWFsKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSkKICAgICAgOiBzdXBlcihsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0R3JlYXRlckVxdWFsKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpID0+IGNvbnN0YW50X3N5c3RlbS5ncmVhdGVyRXF1YWw7CiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLkdSRUFURVJfRVFVQUxfVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKG90aGVyKSA9PiBvdGhlciBpcyBIR3JlYXRlckVxdWFsOwogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IHRydWU7Cn0KCmNsYXNzIEhMZXNzIGV4dGVuZHMgSFJlbGF0aW9uYWwgewogIEhMZXNzKGxlZnQsIHJpZ2h0LCBzZWxlY3RvciwgdHlwZSkgOiBzdXBlcihsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0TGVzcyh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSA9PiBjb25zdGFudF9zeXN0ZW0ubGVzczsKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uTEVTU19UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhMZXNzOwogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IHRydWU7Cn0KCmNsYXNzIEhMZXNzRXF1YWwgZXh0ZW5kcyBIUmVsYXRpb25hbCB7CiAgSExlc3NFcXVhbChsZWZ0LCByaWdodCwgc2VsZWN0b3IsIHR5cGUpIDogc3VwZXIobGVmdCwgcmlnaHQsIHNlbGVjdG9yLCB0eXBlKTsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdExlc3NFcXVhbCh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSA9PiBjb25zdGFudF9zeXN0ZW0ubGVzc0VxdWFsOwogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5MRVNTX0VRVUFMX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhvdGhlcikgPT4gb3RoZXIgaXMgSExlc3NFcXVhbDsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiB0cnVlOwp9CgpjbGFzcyBIUmV0dXJuIGV4dGVuZHMgSENvbnRyb2xGbG93IHsKICBIUmV0dXJuKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluLCBISW5zdHJ1Y3Rpb24gdmFsdWUsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKQogICAgICA6IHN1cGVyKGRvbWFpbiwgPEhJbnN0cnVjdGlvbj5bdmFsdWVdKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQogIEBvdmVycmlkZQogIHRvU3RyaW5nKCkgPT4gJ3JldHVybic7CiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRSZXR1cm4odGhpcyk7Cn0KCmNsYXNzIEhUaHJvd0V4cHJlc3Npb24gZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIEhUaHJvd0V4cHJlc3Npb24oQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIEhJbnN0cnVjdGlvbiB2YWx1ZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogc3VwZXIoPEhJbnN0cnVjdGlvbj5bdmFsdWVdLCBkb21haW4uZW1wdHlUeXBlKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQogIEBvdmVycmlkZQogIHRvU3RyaW5nKCkgPT4gJ3Rocm93IGV4cHJlc3Npb24nOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0VGhyb3dFeHByZXNzaW9uKHRoaXMpOwogIEBvdmVycmlkZQogIGJvb2wgY2FuVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+IHRydWU7Cn0KCmNsYXNzIEhBd2FpdCBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSEF3YWl0KEhJbnN0cnVjdGlvbiB2YWx1ZSwgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKDxISW5zdHJ1Y3Rpb24+W3ZhbHVlXSwgdHlwZSk7CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnYXdhaXQnOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0QXdhaXQodGhpcyk7CiAgLy8gQW4gYXdhaXQgd2lsbCB0aHJvdyBpZiBpdHMgYXJndW1lbnQgaXMgbm90IGEgcmVhbCBmdXR1cmUuCiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gdHJ1ZTsKICBAb3ZlcnJpZGUKICBTaWRlRWZmZWN0cyBzaWRlRWZmZWN0cyA9IG5ldyBTaWRlRWZmZWN0cygpOwp9CgpjbGFzcyBIWWllbGQgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIEhZaWVsZChBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbiwgSEluc3RydWN0aW9uIHZhbHVlLCB0aGlzLmhhc1N0YXIsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKQogICAgICA6IHN1cGVyKDxISW5zdHJ1Y3Rpb24+W3ZhbHVlXSwgZG9tYWluLmVtcHR5VHlwZSkgewogICAgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogIH0KICBib29sIGhhc1N0YXI7CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAneWllbGQnOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0WWllbGQodGhpcyk7CiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgU2lkZUVmZmVjdHMgc2lkZUVmZmVjdHMgPSBuZXcgU2lkZUVmZmVjdHMoKTsKfQoKY2xhc3MgSFRocm93IGV4dGVuZHMgSENvbnRyb2xGbG93IHsKICBmaW5hbCBib29sIGlzUmV0aHJvdzsKICBIVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIEhJbnN0cnVjdGlvbiB2YWx1ZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHt0aGlzLmlzUmV0aHJvdzogZmFsc2V9KQogICAgICA6IHN1cGVyKGRvbWFpbiwgPEhJbnN0cnVjdGlvbj5bdmFsdWVdKSB7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQogIEBvdmVycmlkZQogIHRvU3RyaW5nKCkgPT4gJ3Rocm93JzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFRocm93KHRoaXMpOwp9CgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDaGFuZ2UgdGhpcyB0byBhICJIU3RhdGljTG9hZCIgb2YgYSBmaWVsZCB3aGVuIHdlIHVzZQovLyBDRkUgY29uc3RhbnRzLiBJdCBoYXMgYmVlbiB1c2VkIGZvciBzdGF0aWMgdGVhci1vZmZzIGV2ZW4gdGhvdWdoIHRoZXNlIHNob3VsZAovLyBoYXZlIGJlZW4gY29uc3RhbnRzLgpjbGFzcyBIU3RhdGljIGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBmaW5hbCBNZW1iZXJFbnRpdHkgZWxlbWVudDsKCiAgSFN0YXRpYyh0aGlzLmVsZW1lbnQsIEFic3RyYWN0VmFsdWUgdHlwZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogc3VwZXIoPEhJbnN0cnVjdGlvbj5bXSwgdHlwZSkgewogICAgYXNzZXJ0KGVsZW1lbnQgIT0gbnVsbCk7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgaWYgKGVsZW1lbnQuaXNBc3NpZ25hYmxlKSB7CiAgICAgIHNpZGVFZmZlY3RzLnNldERlcGVuZHNPblN0YXRpY1Byb3BlcnR5U3RvcmUoKTsKICAgIH0KICAgIHNldFVzZUd2bigpOwogICAgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogIH0KICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdzdGF0aWMgJHtlbGVtZW50Lm5hbWV9JzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFN0YXRpYyh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgaW50IGd2bkhhc2hDb2RlKCkgPT4gc3VwZXIuZ3ZuSGFzaENvZGUoKSBeIGVsZW1lbnQuaGFzaENvZGU7CiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLlNUQVRJQ19UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMob3RoZXIpID0+IG90aGVyIGlzIEhTdGF0aWM7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhTdGF0aWMgb3RoZXIpID0+IGVsZW1lbnQgPT0gb3RoZXIuZWxlbWVudDsKICBAb3ZlcnJpZGUKICBib29sIGlzQ29kZU1vdGlvbkludmFyaWFudCgpID0+ICFlbGVtZW50LmlzQXNzaWduYWJsZTsKfQoKY2xhc3MgSEludGVyY2VwdG9yIGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICAvLyBUaGlzIGZpZWxkIHNob3VsZCBvcmlnaW5hbGx5IGJlIG51bGwgdG8gYWxsb3cgR1ZOJ2luZyBhbGwKICAvLyBbSEludGVyY2VwdG9yXSBvbiB0aGUgc2FtZSBpbnB1dC4KICBTZXQ8Q2xhc3NFbnRpdHk+IGludGVyY2VwdGVkQ2xhc3NlczsKCiAgLy8gaW5wdXRzWzBdIGlzIGluaXRpYWxseSB0aGUgb25seSBpbnB1dCwgdGhlIHJlY2VpdmVyLgoKICAvLyBpbnB1dHNbMV0gaXMgYSBjb25zdGFudCBpbnRlcmNlcHRvciB3aGVuIHRoZSBpbnRlcmNlcHRvciBpcyBhIGNvbnN0YW50CiAgLy8gZXhjZXB0IGZvciBhIGBudWxsYCByZWNlaXZlci4gIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSByZWNlaXZlciBjYW4ndCBiZQogIC8vIGZhbHN5LCBleGNlcHQgZm9yIGBudWxsYCwgYWxsb3dpbmcgdGhlIGdlbmVyYXRpb24gb2YgY29kZSBsaWtlCiAgLy8KICAvLyAgICAgKGEgJiYgQy5KU0FycmF5X21ldGhvZHMpLmdldCRmaXJzdChhKQogIC8vCgogIEhJbnRlcmNlcHRvcihISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltyZWNlaXZlcl0sIHR5cGUpIHsKICAgIHRoaXMuc291cmNlSW5mb3JtYXRpb24gPSByZWNlaXZlci5zb3VyY2VJbmZvcm1hdGlvbjsKICAgIHNpZGVFZmZlY3RzLmNsZWFyQWxsU2lkZUVmZmVjdHMoKTsKICAgIHNpZGVFZmZlY3RzLmNsZWFyQWxsRGVwZW5kZW5jaWVzKCk7CiAgICBzZXRVc2VHdm4oKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdpbnRlcmNlcHRvciBvbiAkaW50ZXJjZXB0ZWRDbGFzc2VzJzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEludGVyY2VwdG9yKHRoaXMpOwogIEhJbnN0cnVjdGlvbiBnZXQgcmVjZWl2ZXIgPT4gaW5wdXRzWzBdOwoKICBib29sIGdldCBpc0NvbmRpdGlvbmFsQ29uc3RhbnRJbnRlcmNlcHRvciA9PiBpbnB1dHMubGVuZ3RoID09IDI7CiAgSEluc3RydWN0aW9uIGdldCBjb25kaXRpb25hbENvbnN0YW50SW50ZXJjZXB0b3IgPT4gaW5wdXRzWzFdOwogIHZvaWQgc2V0IGNvbmRpdGlvbmFsQ29uc3RhbnRJbnRlcmNlcHRvcihIQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGFzc2VydCghaXNDb25kaXRpb25hbENvbnN0YW50SW50ZXJjZXB0b3IpOwogICAgaW5wdXRzLmFkZChjb25zdGFudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJjZXB0b3IoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uSU5URVJDRVBUT1JfVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKG90aGVyKSA9PiBvdGhlciBpcyBISW50ZXJjZXB0b3I7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnRlcmNlcHRvciBvdGhlcikgewogICAgcmV0dXJuIGludGVyY2VwdGVkQ2xhc3NlcyA9PSBvdGhlci5pbnRlcmNlcHRlZENsYXNzZXMgfHwKICAgICAgICAoaW50ZXJjZXB0ZWRDbGFzc2VzLmxlbmd0aCA9PSBvdGhlci5pbnRlcmNlcHRlZENsYXNzZXMubGVuZ3RoICYmCiAgICAgICAgICAgIGludGVyY2VwdGVkQ2xhc3Nlcy5jb250YWluc0FsbChvdGhlci5pbnRlcmNlcHRlZENsYXNzZXMpKTsKICB9Cn0KCi8vLyBBICJvbmUtc2hvdCIgaW50ZXJjZXB0b3IgaXMgYSBjYWxsIHRvIGEgc3ludGhldGl6ZWQgbWV0aG9kIHRoYXQKLy8vIHdpbGwgZmV0Y2ggdGhlIGludGVyY2VwdG9yIG9mIGl0cyBmaXJzdCBwYXJhbWV0ZXIsIGFuZCBtYWtlIGEgY2FsbAovLy8gb24gYSBnaXZlbiBzZWxlY3RvciB3aXRoIHRoZSByZW1haW5pbmcgcGFyYW1ldGVycy4KLy8vCi8vLyBJbiBvcmRlciB0byBzaGFyZSB0aGUgc2FtZSBvcHRpbWl6YXRpb25zIHdpdGggcmVndWxhciBpbnRlcmNlcHRvcgovLy8gY2FsbHMsIHRoaXMgY2xhc3MgZXh0ZW5kcyBbSEludm9rZUR5bmFtaWNdIGFuZCBhbHNvIGhhcyB0aGUgbnVsbAovLy8gY29uc3RhbnQgYXMgdGhlIGZpcnN0IGlucHV0LgpjbGFzcyBIT25lU2hvdEludGVyY2VwdG9yIGV4dGVuZHMgSEludm9rZUR5bmFtaWMgewogIEBvdmVycmlkZQogIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CiAgU2V0PENsYXNzRW50aXR5PiBpbnRlcmNlcHRlZENsYXNzZXM7CgogIEhPbmVTaG90SW50ZXJjZXB0b3IoCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluLAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGUsCiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsCiAgICAgIEFic3RyYWN0VmFsdWUgcmVzdWx0VHlwZSwKICAgICAgdGhpcy50eXBlQXJndW1lbnRzLAogICAgICB0aGlzLmludGVyY2VwdGVkQ2xhc3NlcykKICAgICAgOiBzdXBlcihzZWxlY3RvciwgcmVjZWl2ZXJUeXBlLCBudWxsLCBpbnB1dHMsIHRydWUsIHJlc3VsdFR5cGUpIHsKICAgIGFzc2VydChpbnB1dHNbMF0gaXMgSENvbnN0YW50KTsKICAgIGFzc2VydChpbnB1dHNbMF0uaW5zdHJ1Y3Rpb25UeXBlID09IGRvbWFpbi5udWxsVHlwZSk7CiAgICBhc3NlcnQoc2VsZWN0b3IuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudCA9PSB0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgfQogIEBvdmVycmlkZQogIGJvb2wgaXNDYWxsT25JbnRlcmNlcHRvcihKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICdvbmUgc2hvdCBpbnRlcmNlcHRvcjogc2VsZWN0b3I9JHNlbGVjdG9yLCBtYXNrPSRyZWNlaXZlclR5cGUnOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0T25lU2hvdEludGVyY2VwdG9yKHRoaXMpOwp9CgovLy8gQW4gW0hMYXp5U3RhdGljXSBpcyBhIHN0YXRpYyB0aGF0IGlzIGluaXRpYWxpemVkIGxhemlseSBhdCBmaXJzdCByZWFkLgpjbGFzcyBITGF6eVN0YXRpYyBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgZmluYWwgRmllbGRFbnRpdHkgZWxlbWVudDsKCiAgSExhenlTdGF0aWMoCiAgICAgIHRoaXMuZWxlbWVudCwgQWJzdHJhY3RWYWx1ZSB0eXBlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltdLCB0eXBlKSB7CiAgICAvLyBUT0RPKDQ5MzEpOiBUaGUgZmlyc3QgYWNjZXNzIGhhcyBzaWRlLWVmZmVjdHMsIGJ1dCB3ZSBhZnRlcndhcmRzIHdlCiAgICAvLyBzaG91bGQgYmUgYWJsZSB0byBHVk4uCiAgICBzaWRlRWZmZWN0cy5zZXRBbGxTaWRlRWZmZWN0cygpOwogICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uU29tZXRoaW5nKCk7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQoKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdsYXp5IHN0YXRpYyAke2VsZW1lbnQubmFtZX0nOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0TGF6eVN0YXRpYyh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gMzA7CiAgLy8gVE9ETyg0OTMxKTogY2FuIHdlIGRvIGJldHRlciBoZXJlPwogIEBvdmVycmlkZQogIGJvb2wgaXNDb2RlTW90aW9uSW52YXJpYW50KCkgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gdHJ1ZTsKfQoKY2xhc3MgSFN0YXRpY1N0b3JlIGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBNZW1iZXJFbnRpdHkgZWxlbWVudDsKICBIU3RhdGljU3RvcmUoQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4sIHRoaXMuZWxlbWVudCwgSEluc3RydWN0aW9uIHZhbHVlKQogICAgICA6IHN1cGVyKDxISW5zdHJ1Y3Rpb24+W3ZhbHVlXSwgZG9tYWluLmVtcHR5VHlwZSkgewogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxTaWRlRWZmZWN0cygpOwogICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxEZXBlbmRlbmNpZXMoKTsKICAgIHNpZGVFZmZlY3RzLnNldENoYW5nZXNTdGF0aWNQcm9wZXJ0eSgpOwogIH0KICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdzdGF0aWMgc3RvcmUgJHtlbGVtZW50Lm5hbWV9JzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFN0YXRpY1N0b3JlKHRoaXMpOwoKICBISW5zdHJ1Y3Rpb24gZ2V0IHZhbHVlID0+IGlucHV0cy5zaW5nbGU7CgogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5TVEFUSUNfU1RPUkVfVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKG90aGVyKSA9PiBvdGhlciBpcyBIU3RhdGljU3RvcmU7CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhTdGF0aWNTdG9yZSBvdGhlcikgPT4gZWxlbWVudCA9PSBvdGhlci5lbGVtZW50OwogIEBvdmVycmlkZQogIGJvb2wgaXNKc1N0YXRlbWVudCgpID0+IHVzZWRCeS5pc0VtcHR5Owp9CgpjbGFzcyBITGl0ZXJhbExpc3QgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIEhMaXRlcmFsTGlzdChMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIoaW5wdXRzLCB0eXBlKTsKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdsaXRlcmFsIGxpc3QnOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0TGl0ZXJhbExpc3QodGhpcyk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNBbGxvY2F0aW9uKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PiB0cnVlOwp9CgovLy8gVGhlIHByaW1pdGl2ZSBhcnJheSBpbmRleGluZyBvcGVyYXRpb24uIE5vdGUgdGhhdCB0aGlzIGluc3RydWN0aW9uCi8vLyBkb2VzIG5vdCB0aHJvdyBiZWNhdXNlIHdlIGdlbmVyYXRlIHRoZSBjaGVja3MgZXhwbGljaXRseS4KY2xhc3MgSEluZGV4IGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTZWxlY3RvciBzZWxlY3RvcjsKICBISW5kZXgoSEluc3RydWN0aW9uIHJlY2VpdmVyLCBISW5zdHJ1Y3Rpb24gaW5kZXgsIHRoaXMuc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltyZWNlaXZlciwgaW5kZXhdLCB0eXBlKSB7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uSW5kZXhTdG9yZSgpOwogICAgc2V0VXNlR3ZuKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnaW5kZXggb3BlcmF0b3InOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0SW5kZXgodGhpcyk7CgogIEhJbnN0cnVjdGlvbiBnZXQgcmVjZWl2ZXIgPT4gaW5wdXRzWzBdOwogIEhJbnN0cnVjdGlvbiBnZXQgaW5kZXggPT4gaW5wdXRzWzFdOwoKICAvLyBJbXBsaWNpdCBkZXBlbmRlbmN5IG9uIEhCb3VuZHNDaGVjayBvciBjb25zdHJhaW50cyBvbiBpbmRleC4KICAvLyBUT0RPKDI3MjcyKTogTWFrZSBISW5kZXggZGVwZW5kZW50IG9uIGJvdW5kcyBjaGVja2luZy4KICBAb3ZlcnJpZGUKICBib29sIGdldCBpc01vdmFibGUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBnZXREYXJ0UmVjZWl2ZXIoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSA9PiByZWNlaXZlcjsKICBAb3ZlcnJpZGUKICBib29sIG9ubHlUaHJvd3NOU00oKSA9PiB0cnVlOwogIEBvdmVycmlkZQogIGJvb2wgY2FuVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIHJlY2VpdmVyLmlzTnVsbChkb21haW4pLmlzUG90ZW50aWFsbHlUcnVlOwoKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uSU5ERVhfVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gb3RoZXIgaXMgSEluZGV4OwogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhISW5kZXggb3RoZXIpID0+IHRydWU7Cn0KCi8vLyBUaGUgcHJpbWl0aXZlIGFycmF5IGFzc2lnbm1lbnQgb3BlcmF0aW9uLiBOb3RlIHRoYXQgdGhpcyBpbnN0cnVjdGlvbgovLy8gZG9lcyBub3QgdGhyb3cgYmVjYXVzZSB3ZSBnZW5lcmF0ZSB0aGUgY2hlY2tzIGV4cGxpY2l0bHkuCmNsYXNzIEhJbmRleEFzc2lnbiBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU2VsZWN0b3Igc2VsZWN0b3I7CiAgSEluZGV4QXNzaWduKEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluLCBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsCiAgICAgIEhJbnN0cnVjdGlvbiBpbmRleCwgSEluc3RydWN0aW9uIHZhbHVlLCB0aGlzLnNlbGVjdG9yKQogICAgICA6IHN1cGVyKDxISW5zdHJ1Y3Rpb24+W3JlY2VpdmVyLCBpbmRleCwgdmFsdWVdLCBkb21haW4uZW1wdHlUeXBlKSB7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgc2lkZUVmZmVjdHMuc2V0Q2hhbmdlc0luZGV4KCk7CiAgfQogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdpbmRleCBhc3NpZ24gb3BlcmF0b3InOwogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0SW5kZXhBc3NpZ24odGhpcyk7CgogIEhJbnN0cnVjdGlvbiBnZXQgcmVjZWl2ZXIgPT4gaW5wdXRzWzBdOwogIEhJbnN0cnVjdGlvbiBnZXQgaW5kZXggPT4gaW5wdXRzWzFdOwogIEhJbnN0cnVjdGlvbiBnZXQgdmFsdWUgPT4gaW5wdXRzWzJdOwoKICAvLyBJbXBsaWNpdCBkZXBlbmRlbmN5IG9uIEhCb3VuZHNDaGVjayBvciBjb25zdHJhaW50cyBvbiBpbmRleC4KICAvLyBUT0RPKDI3MjcyKTogTWFrZSBISW5kZXggZGVwZW5kZW50IG9uIGJvdW5kcyBjaGVja2luZy4KICBAb3ZlcnJpZGUKICBib29sIGdldCBpc01vdmFibGUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBnZXREYXJ0UmVjZWl2ZXIoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSA9PiByZWNlaXZlcjsKICBAb3ZlcnJpZGUKICBib29sIG9ubHlUaHJvd3NOU00oKSA9PiB0cnVlOwogIEBvdmVycmlkZQogIGJvb2wgY2FuVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+CiAgICAgIHJlY2VpdmVyLmlzTnVsbChkb21haW4pLmlzUG90ZW50aWFsbHlUcnVlOwp9CgovLy8gSXMtdGVzdCB1c2luZyBsZWdhY3kgY29uc3RydWN0b3IgYmFzZWQgdHlwIHJlcHJlc2VudGF0aW9uLgpjbGFzcyBISXMgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIC8vLyBBIGNoZWNrIGFnYWluc3QgYSByYXcgdHlwZTogJ28gaXMgaW50JywgJ28gaXMgQScuCiAgc3RhdGljIGNvbnN0IGludCBSQVdfQ0hFQ0sgPSAwOwoKICAvLy8gQSBjaGVjayBhZ2FpbnN0IGEgdHlwZSB3aXRoIHR5cGUgYXJndW1lbnRzOiAnbyBpcyBMaXN0PGludD4nLCAnbyBpcyBDPFQ+Jy4KICBzdGF0aWMgY29uc3QgaW50IENPTVBPVU5EX0NIRUNLID0gMTsKCiAgLy8vIEEgY2hlY2sgYWdhaW5zdCBhIHNpbmdsZSB0eXBlIHZhcmlhYmxlOiAnbyBpcyBUJy4KICBzdGF0aWMgY29uc3QgaW50IFZBUklBQkxFX0NIRUNLID0gMjsKCiAgZmluYWwgRGFydFR5cGUgdHlwZUV4cHJlc3Npb247CiAgZmluYWwgaW50IGtpbmQ7CiAgZmluYWwgYm9vbCB1c2VJbnN0YW5jZU9mOwoKICBISXMuZGlyZWN0KERhcnRUeXBlIHR5cGVFeHByZXNzaW9uLCBISW5zdHJ1Y3Rpb24gZXhwcmVzc2lvbiwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikKICAgICAgOiB0aGlzLmludGVybmFsKAogICAgICAgICAgICB0eXBlRXhwcmVzc2lvbiwgW2V4cHJlc3Npb25dLCBSQVdfQ0hFQ0ssIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgLy8gUHJlLXZlcmlmaWVkIHRoYXQgdGhlIGNoZWNrIGNhbiBiZSBkb25lIHVzaW5nICdpbnN0YW5jZW9mJy4KICBISXMuaW5zdGFuY2VPZihEYXJ0VHlwZSB0eXBlRXhwcmVzc2lvbiwgSEluc3RydWN0aW9uIGV4cHJlc3Npb24sCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogdGhpcy5pbnRlcm5hbCgKICAgICAgICAgICAgdHlwZUV4cHJlc3Npb24sIFtleHByZXNzaW9uXSwgUkFXX0NIRUNLLCB0eXBlLCBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgICAgdXNlSW5zdGFuY2VPZjogdHJ1ZSk7CgogIGZhY3RvcnkgSElzLnJhdygKICAgICAgRGFydFR5cGUgdHlwZUV4cHJlc3Npb24sCiAgICAgIEhJbnN0cnVjdGlvbiBleHByZXNzaW9uLAogICAgICBISW50ZXJjZXB0b3IgaW50ZXJjZXB0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IHJlLWFkZCBgJiYgdHlwZUV4cHJlc3Npb24udHJlYXRBc1Jhd2Agb3Igc29tZXRoaW5nCiAgICAvLyBlcXVpdmFsZW50ICh3aGljaCBzdGFydGVkIGZhaWxpbmcgb25jZSB3ZSBhbGxvd2VkIHR5cGVFeHByZXNzaW9ucyB0aGF0CiAgICAvLyBjb250YWluIHR5cGUgcGFyYW1ldGVycyBtYXRjaGluZyB0aGUgb3JpZ2luYWwgYm91bmRzIG9mIHRoZSB0eXBlKS4KICAgIGFzc2VydCgodHlwZUV4cHJlc3Npb24uaXNGdW5jdGlvblR5cGUgfHwgdHlwZUV4cHJlc3Npb24uaXNJbnRlcmZhY2VUeXBlKSwKICAgICAgICAiVW5leHBlY3RlZCByYXcgaXMtdGVzdCB0eXBlOiAkdHlwZUV4cHJlc3Npb24iKTsKICAgIHJldHVybiBuZXcgSElzLmludGVybmFsKHR5cGVFeHByZXNzaW9uLCBbZXhwcmVzc2lvbiwgaW50ZXJjZXB0b3JdLAogICAgICAgIFJBV19DSEVDSywgdHlwZSwgc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgSElzLmNvbXBvdW5kKAogICAgICBEYXJ0VHlwZSB0eXBlRXhwcmVzc2lvbiwKICAgICAgSEluc3RydWN0aW9uIGV4cHJlc3Npb24sCiAgICAgIEhJbnN0cnVjdGlvbiBjYWxsLAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKQogICAgICA6IHRoaXMuaW50ZXJuYWwodHlwZUV4cHJlc3Npb24sIFtleHByZXNzaW9uLCBjYWxsXSwgQ09NUE9VTkRfQ0hFQ0ssIHR5cGUsCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgSElzLnZhcmlhYmxlKAogICAgICBEYXJ0VHlwZSB0eXBlRXhwcmVzc2lvbiwKICAgICAgSEluc3RydWN0aW9uIGV4cHJlc3Npb24sCiAgICAgIEhJbnN0cnVjdGlvbiBjYWxsLAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKQogICAgICA6IHRoaXMuaW50ZXJuYWwodHlwZUV4cHJlc3Npb24sIFtleHByZXNzaW9uLCBjYWxsXSwgVkFSSUFCTEVfQ0hFQ0ssIHR5cGUsCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgSElzLmludGVybmFsKHRoaXMudHlwZUV4cHJlc3Npb24sIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsIHRoaXMua2luZCwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAge2Jvb2wgdGhpcy51c2VJbnN0YW5jZU9mOiBmYWxzZX0pCiAgICAgIDogc3VwZXIoaW5wdXRzLCB0eXBlKSB7CiAgICBhc3NlcnQoa2luZCA+PSBSQVdfQ0hFQ0sgJiYga2luZCA8PSBWQVJJQUJMRV9DSEVDSyk7CiAgICBzZXRVc2VHdm4oKTsKICAgIHRoaXMuc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICB9CgogIEhJbnN0cnVjdGlvbiBnZXQgZXhwcmVzc2lvbiA9PiBpbnB1dHNbMF07CgogIEhJbnN0cnVjdGlvbiBnZXQgaW50ZXJjZXB0b3IgewogICAgYXNzZXJ0KGtpbmQgPT0gUkFXX0NIRUNLKTsKICAgIHJldHVybiBpbnB1dHMubGVuZ3RoID4gMSA/IGlucHV0c1sxXSA6IG51bGw7CiAgfQoKICBISW5zdHJ1Y3Rpb24gZ2V0IGNoZWNrQ2FsbCB7CiAgICBhc3NlcnQoa2luZCA9PSBWQVJJQUJMRV9DSEVDSyB8fCBraW5kID09IENPTVBPVU5EX0NIRUNLKTsKICAgIHJldHVybiBpbnB1dHNbMV07CiAgfQoKICBib29sIGdldCBpc1Jhd0NoZWNrID0+IGtpbmQgPT0gUkFXX0NIRUNLOwogIGJvb2wgZ2V0IGlzVmFyaWFibGVDaGVjayA9PiBraW5kID09IFZBUklBQkxFX0NIRUNLOwogIGJvb2wgZ2V0IGlzQ29tcG91bmRDaGVjayA9PiBraW5kID09IENPTVBPVU5EX0NIRUNLOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdElzKHRoaXMpOwoKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICIkZXhwcmVzc2lvbiBpcyAkdHlwZUV4cHJlc3Npb24iOwoKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uSVNfVFlQRUNPREU7CgogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IG90aGVyIGlzIEhJczsKCiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJcyBvdGhlcikgewogICAgcmV0dXJuIHR5cGVFeHByZXNzaW9uID09IG90aGVyLnR5cGVFeHByZXNzaW9uICYmIGtpbmQgPT0gb3RoZXIua2luZDsKICB9Cn0KCi8vLyBISXNWaWFJbnRlcmNlcHRvciBpcyBhIGxhdGUtc3RhZ2UgaW5zdHJ1Y3Rpb24gZm9yIGEgdHlwZSB0ZXN0IHRoYXQgY2FuIGJlCi8vLyBkb25lIGVudGlyZWx5IG9uIGFuIGludGVyY2VwdG9yLiAgSXQgaXMgbm90IGEgSENoZWNrIGJlY2F1c2UgdGhlIGNoZWNrZWQKLy8vIGlucHV0IGlzIG5vdCBvbmUgb2YgdGhlIGlucHV0cy4KY2xhc3MgSElzVmlhSW50ZXJjZXB0b3IgZXh0ZW5kcyBITGF0ZUluc3RydWN0aW9uIHsKICBmaW5hbCBEYXJ0VHlwZSB0eXBlRXhwcmVzc2lvbjsKICBISXNWaWFJbnRlcmNlcHRvcigKICAgICAgdGhpcy50eXBlRXhwcmVzc2lvbiwgSEluc3RydWN0aW9uIGludGVyY2VwdG9yLCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIoPEhJbnN0cnVjdGlvbj5baW50ZXJjZXB0b3JdLCB0eXBlKSB7CiAgICBzZXRVc2VHdm4oKTsKICB9CgogIEhJbnN0cnVjdGlvbiBnZXQgaW50ZXJjZXB0b3IgPT4gaW5wdXRzWzBdOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdElzVmlhSW50ZXJjZXB0b3IodGhpcyk7CiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAiJGludGVyY2VwdG9yIGlzICR0eXBlRXhwcmVzc2lvbiI7CiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLklTX1ZJQV9JTlRFUkNFUFRPUl9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiBvdGhlciBpcyBISXNWaWFJbnRlcmNlcHRvcjsKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSElzIG90aGVyKSB7CiAgICByZXR1cm4gdHlwZUV4cHJlc3Npb24gPT0gb3RoZXIudHlwZUV4cHJlc3Npb247CiAgfQp9CgovLy8gSExhdGVWYWx1ZSBpcyBhIGxhdGUtc3RhZ2UgaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIHZhbHVlCi8vLyBpbnRvIGEgdGVtcG9yYXJ5LgovLy8KLy8vIEhMYXRlVmFsdWUgaXMgdXNlZnVsIGZvciBuYW1pbmcgdmFsdWVzIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIGdlbmVyYXRlZCBhdAovLy8gdXNlIHNpdGUsIGZvciBleGFtcGxlLCBpZiAndGhpcycgaXMgdXNlZCBtYW55IHRpbWVzLCByZXBsYWNpbmcgdXNlcyBvZgovLy8gJ3RoaXMnIHdpdGggSExhdGVWYWx1ZShIVGhpcykgd2lsbCBoYXZlIHRoZSBlZmZlY3Qgb2YgY29weWluZyAndGhpcycgdG8gYQovLy8gdGVtcG9yYXJ5IHdpbGwgcmVkdWNlIHRoZSBzaXplIG9mIG1pbmlmaWVkIGNvZGUuCmNsYXNzIEhMYXRlVmFsdWUgZXh0ZW5kcyBITGF0ZUluc3RydWN0aW9uIHsKICBITGF0ZVZhbHVlKEhJbnN0cnVjdGlvbiB0YXJnZXQpIDogc3VwZXIoW3RhcmdldF0sIHRhcmdldC5pbnN0cnVjdGlvblR5cGUpOwoKICBISW5zdHJ1Y3Rpb24gZ2V0IHRhcmdldCA9PiBpbnB1dHMuc2luZ2xlOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdExhdGVWYWx1ZSh0aGlzKTsKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdITGF0ZVZhbHVlKCR0YXJnZXQpJzsKfQoKLy8vIFR5cGUgY2hlY2sgb3IgY2FzdCB1c2luZyBsZWdhY3kgY29uc3RydWN0b3ItYmFzZWQgdHlwZSByZXByZXNlbnRhdGlvbi4KY2xhc3MgSFR5cGVDb252ZXJzaW9uIGV4dGVuZHMgSENoZWNrIHsKICAvLyBWYWx1ZXMgZm9yIFtraW5kXS4KICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQ0hFQ0sgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgQ0FTVF9DSEVDSyA9IDE7CgogIGZpbmFsIERhcnRUeXBlIHR5cGVFeHByZXNzaW9uOwogIGZpbmFsIGludCBraW5kOwoKICBBYnN0cmFjdFZhbHVlIGNoZWNrZWRUeXBlOyAvLyBOb3QgZmluYWwgYmVjYXVzZSB3ZSByZWZpbmUgaXQuCiAgQWJzdHJhY3RWYWx1ZQogICAgICBpbnB1dFR5cGU7IC8vIEhvbGRzIGlucHV0IHR5cGUgZm9yIGNvZGVnZW4gYWZ0ZXIgSFR5cGVLbm93biByZW1vdmFsLgoKICBIVHlwZUNvbnZlcnNpb24odGhpcy50eXBlRXhwcmVzc2lvbiwgdGhpcy5raW5kLCBBYnN0cmFjdFZhbHVlIHR5cGUsCiAgICAgIEhJbnN0cnVjdGlvbiBpbnB1dCwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pCiAgICAgIDogY2hlY2tlZFR5cGUgPSB0eXBlLAogICAgICAgIHN1cGVyKDxISW5zdHJ1Y3Rpb24+W2lucHV0XSwgdHlwZSkgewogICAgYXNzZXJ0KHR5cGVFeHByZXNzaW9uID09IG51bGwgfHwgIXR5cGVFeHByZXNzaW9uLmlzVHlwZWRlZik7CiAgICB0aGlzLnNvdXJjZUVsZW1lbnQgPSBpbnB1dC5zb3VyY2VFbGVtZW50OwogICAgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogIH0KCiAgSFR5cGVDb252ZXJzaW9uLndpdGhUeXBlUmVwcmVzZW50YXRpb24odGhpcy50eXBlRXhwcmVzc2lvbiwgdGhpcy5raW5kLAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUsIEhJbnN0cnVjdGlvbiBpbnB1dCwgSEluc3RydWN0aW9uIHR5cGVSZXByZXNlbnRhdGlvbikKICAgICAgOiBjaGVja2VkVHlwZSA9IHR5cGUsCiAgICAgICAgc3VwZXIoPEhJbnN0cnVjdGlvbj5baW5wdXQsIHR5cGVSZXByZXNlbnRhdGlvbl0sIHR5cGUpIHsKICAgIGFzc2VydCghdHlwZUV4cHJlc3Npb24uaXNUeXBlZGVmKTsKICAgIHNvdXJjZUVsZW1lbnQgPSBpbnB1dC5zb3VyY2VFbGVtZW50OwogIH0KCiAgYm9vbCBnZXQgaGFzVHlwZVJlcHJlc2VudGF0aW9uIHsKICAgIHJldHVybiB0eXBlRXhwcmVzc2lvbiAhPSBudWxsICYmCiAgICAgICAgdHlwZUV4cHJlc3Npb24uaXNJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgaW5wdXRzLmxlbmd0aCA+IDE7CiAgfQoKICBISW5zdHJ1Y3Rpb24gZ2V0IHR5cGVSZXByZXNlbnRhdGlvbiA9PiBpbnB1dHNbMV07CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBnZXQgY2hlY2tlZElucHV0ID0+IHN1cGVyLmNoZWNrZWRJbnB1dDsKCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIGNvbnZlcnRUeXBlKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwgRGFydFR5cGUgdHlwZSwgaW50IGtpbmQpIHsKICAgIGlmICh0eXBlRXhwcmVzc2lvbiA9PSB0eXBlKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUeXBlKGNsb3NlZFdvcmxkLCB0eXBlLCBraW5kKTsKICB9CgogIGJvb2wgZ2V0IGlzVHlwZUNoZWNrID0+IGtpbmQgPT0gVFlQRV9DSEVDSzsKICBib29sIGdldCBpc0Nhc3RDaGVjayA9PiBraW5kID09IENBU1RfQ0hFQ0s7CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0VHlwZUNvbnZlcnNpb24odGhpcyk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNKc1N0YXRlbWVudCgpID0+IGlzQ29udHJvbEZsb3coKTsKICBAb3ZlcnJpZGUKICBib29sIGlzQ29udHJvbEZsb3coKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLlRZUEVfQ09OVkVSU0lPTl9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiBvdGhlciBpcyBIVHlwZUNvbnZlcnNpb247CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvZGVNb3Rpb25JbnZhcmlhbnQoKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhUeXBlQ29udmVyc2lvbiBvdGhlcikgewogICAgcmV0dXJuIGtpbmQgPT0gb3RoZXIua2luZCAmJgogICAgICAgIHR5cGVFeHByZXNzaW9uID09IG90aGVyLnR5cGVFeHByZXNzaW9uICYmCiAgICAgICAgY2hlY2tlZFR5cGUgPT0gb3RoZXIuY2hlY2tlZFR5cGU7CiAgfQoKICBib29sIGlzUmVkdW5kYW50KEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluID0gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbjsKICAgIERhcnRUeXBlIHR5cGUgPSB0eXBlRXhwcmVzc2lvbjsKICAgIGlmICh0eXBlICE9IG51bGwpIHsKICAgICAgaWYgKHR5cGUuaXNUeXBlVmFyaWFibGUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHR5cGUuaXNGdXR1cmVPcikgewogICAgICAgIC8vIGBudWxsYCBhbHdheXMgcGFzc2VzIHR5cGUgY29udmVyc2lvbi4KICAgICAgICBpZiAoY2hlY2tlZElucHV0LmlzTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogT3B0aW1pemUgRnV0dXJlT3IgdHlwZSBjb252ZXJzaW9ucy4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKCF0eXBlLnRyZWF0QXNSYXcpIHsKICAgICAgICAvLyBgbnVsbGAgYWx3YXlzIHBhc3NlcyB0eXBlIGNvbnZlcnNpb24uCiAgICAgICAgaWYgKGNoZWNrZWRJbnB1dC5pc051bGwoYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodHlwZS5pc0Z1bmN0aW9uVHlwZSkgewogICAgICAgIC8vIGBudWxsYCBhbHdheXMgcGFzc2VzIHR5cGUgY29udmVyc2lvbi4KICAgICAgICBpZiAoY2hlY2tlZElucHV0LmlzTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogT3B0aW1pemUgZnVuY3Rpb24gdHlwZSBjb252ZXJzaW9ucy4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIC8vIFR5cGUgaXMgcmVmaW5lZCBmcm9tIGBkeW5hbWljYCwgc28gaXQgbWlnaHQgYmVjb21lIG5vbi1yZWR1bmRhbnQuCiAgICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5jb250YWluc0FsbChjaGVja2VkVHlwZSkuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgQWJzdHJhY3RWYWx1ZSBpbnB1dFR5cGUgPSBjaGVja2VkSW5wdXQuaW5zdHJ1Y3Rpb25UeXBlOwogICAgcmV0dXJuIGFic3RyYWN0VmFsdWVEb21haW4uaXNJbihpbnB1dFR5cGUsIGNoZWNrZWRUeXBlKS5pc0RlZmluaXRlbHlUcnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0hUeXBlQ29udmVyc2lvbih0eXBlPSR0eXBlRXhwcmVzc2lvbiwga2luZD0ka2luZCwgJwogICAgICAnJHtoYXNUeXBlUmVwcmVzZW50YXRpb24gPyAncmVwcmVzZW50YXRpb249JHR5cGVSZXByZXNlbnRhdGlvbiwgJyA6ICcnfScKICAgICAgJ2NoZWNrZWRJbnB1dD0kY2hlY2tlZElucHV0KSc7Cn0KCi8vLyBDaGVjayBmb3IgcmVjZWl2ZXIgb3IgYXJndW1lbnQgdHlwZSB3aGVuIGxvd2VyaW5nIG9wZXJhdGlvbiB0byBhIHByaW1pdGl2ZSwKLy8vIGUuZy4gbG93ZXJpbmcgYCtgIHRvIFtIQWRkXS4KLy8vCi8vLyBBZnRlciBOTkJELCBgYSArIGJgIHdpbGwgcmVxdWlyZSBgYWAgYW5kIGBiYCBhcmUgbm9uLW51bGxhYmxlIGFuZCB0aGVzZQovLy8gY2hlY2tzIHdpbGwgYmVjb21lIGV4cGxpY2l0IGluIHRoZSBzb3VyY2UgKGUuZy4gYGEhICsgYiFgKS4gQXQgdGhhdCB0aW1lLAovLy8gdGhpcyBjaGVjayBzaG91bGQgYmUgcmVtb3ZlZC4gIElmIG5lZWRlZCwgdGhlIGAhYCBjaGVjayBjYW4gYmUgb3B0aW1pemVkCi8vLyBnaXZlIHRoZSBzYW1lIHNpZ25hbHMgdG8gdGhlIEphdmFTY3JpcHQgVk0uCmNsYXNzIEhQcmltaXRpdmVDaGVjayBleHRlbmRzIEhDaGVjayB7CiAgLy8gVmFsdWVzIGZvciBba2luZF0uCiAgc3RhdGljIGNvbnN0IGludCBBUkdVTUVOVF9UWVBFX0NIRUNLID0gMTsKICBzdGF0aWMgY29uc3QgaW50IFJFQ0VJVkVSX1RZUEVfQ0hFQ0sgPSAzOwoKICBmaW5hbCBEYXJ0VHlwZSB0eXBlRXhwcmVzc2lvbjsKICBmaW5hbCBpbnQga2luZDsKCiAgLy8gW3JlY2VpdmVyVHlwZUNoZWNrU2VsZWN0b3JdIGlzIHRoZSBzZWxlY3RvciB1c2VkIGZvciBhIHJlY2VpdmVyIHR5cGUgY2hlY2sKICAvLyBvbiBvcGVuLWNvZGVkIG9wZXJhdG9ycywgZS5nLiB0aGUgbm90LW51bGwgY2hlY2sgb24gYHhgIGluIGB4ICsgMWAgd291bGQgYmUKICAvLyBjb21waWxlZCB0byB0aGUgZm9sbG93aW5nLCBmb3Igd2hpY2ggd2UgbmVlZCB0aGUgc2VsZWN0b3IgYCRhZGRgLgogIC8vCiAgLy8gICAgIGlmICh0eXBlb2YgeCAhPSAibnVtYmVyIikgeC4kYWRkKCk7CiAgLy8KICBmaW5hbCBTZWxlY3RvciByZWNlaXZlclR5cGVDaGVja1NlbGVjdG9yOwoKICBBYnN0cmFjdFZhbHVlIGNoZWNrZWRUeXBlOyAvLyBOb3QgZmluYWwgYmVjYXVzZSB3ZSByZWZpbmUgaXQuCiAgQWJzdHJhY3RWYWx1ZQogICAgICBpbnB1dFR5cGU7IC8vIEhvbGRzIGlucHV0IHR5cGUgZm9yIGNvZGVnZW4gYWZ0ZXIgSFR5cGVLbm93biByZW1vdmFsLgoKICBIUHJpbWl0aXZlQ2hlY2sodGhpcy50eXBlRXhwcmVzc2lvbiwgdGhpcy5raW5kLCBBYnN0cmFjdFZhbHVlIHR5cGUsCiAgICAgIEhJbnN0cnVjdGlvbiBpbnB1dCwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHt0aGlzLnJlY2VpdmVyVHlwZUNoZWNrU2VsZWN0b3J9KQogICAgICA6IGNoZWNrZWRUeXBlID0gdHlwZSwKICAgICAgICBzdXBlcig8SEluc3RydWN0aW9uPltpbnB1dF0sIHR5cGUpIHsKICAgIGFzc2VydChpc1JlY2VpdmVyVHlwZUNoZWNrID09IChyZWNlaXZlclR5cGVDaGVja1NlbGVjdG9yICE9IG51bGwpKTsKICAgIHRoaXMuc291cmNlRWxlbWVudCA9IGlucHV0LnNvdXJjZUVsZW1lbnQ7CiAgICB0aGlzLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gY29udmVydFR5cGUoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBEYXJ0VHlwZSB0eXBlLCBpbnQga2luZCkgewogICAgaWYgKHR5cGVFeHByZXNzaW9uID09IHR5cGUpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuY29udmVydFR5cGUoY2xvc2VkV29ybGQsIHR5cGUsIGtpbmQpOwogIH0KCiAgYm9vbCBnZXQgaXNBcmd1bWVudFR5cGVDaGVjayA9PiBraW5kID09IEFSR1VNRU5UX1RZUEVfQ0hFQ0s7CiAgYm9vbCBnZXQgaXNSZWNlaXZlclR5cGVDaGVjayA9PiBraW5kID09IFJFQ0VJVkVSX1RZUEVfQ0hFQ0s7CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0UHJpbWl0aXZlQ2hlY2sodGhpcyk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNKc1N0YXRlbWVudCgpID0+IHRydWU7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnRyb2xGbG93KCkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLlBSSU1JVElWRV9DSEVDS19UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiBvdGhlciBpcyBIUHJpbWl0aXZlQ2hlY2s7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvZGVNb3Rpb25JbnZhcmlhbnQoKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhQcmltaXRpdmVDaGVjayBvdGhlcikgewogICAgcmV0dXJuIGtpbmQgPT0gb3RoZXIua2luZCAmJgogICAgICAgIGNoZWNrZWRUeXBlID09IG90aGVyLmNoZWNrZWRUeXBlICYmCiAgICAgICAgcmVjZWl2ZXJUeXBlQ2hlY2tTZWxlY3RvciA9PSBvdGhlci5yZWNlaXZlclR5cGVDaGVja1NlbGVjdG9yOwogIH0KCiAgYm9vbCBpc1JlZHVuZGFudChKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiA9IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CiAgICAvLyBUeXBlIGlzIHJlZmluZWQgZnJvbSBgZHluYW1pY2AsIHNvIGl0IG1pZ2h0IGJlY29tZSBub24tcmVkdW5kYW50LgogICAgaWYgKGFic3RyYWN0VmFsdWVEb21haW4uY29udGFpbnNBbGwoY2hlY2tlZFR5cGUpLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIEFic3RyYWN0VmFsdWUgaW5wdXRUeXBlID0gY2hlY2tlZElucHV0Lmluc3RydWN0aW9uVHlwZTsKICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmlzSW4oaW5wdXRUeXBlLCBjaGVja2VkVHlwZSkuaXNEZWZpbml0ZWx5VHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdIUHJpbWl0aXZlQ2hlY2soY2hlY2tlZFR5cGU9JGNoZWNrZWRUeXBlLCBraW5kPSRraW5kLCAnCiAgICAgICdjaGVja2VkSW5wdXQ9JGNoZWNrZWRJbnB1dCknOwp9CgovLy8gQSBjaGVjayB0aGF0IHRoZSBpbnB1dCB0byBhIGNvbmRpdGlvbiAoaWYsID86LCB3aGlsZSwgZXRjKSBpcyBub24tbnVsbC4gVGhlCi8vLyBmcm9udC1lbmQgZ2VuZXJhdGVzICdhcyBib29sJyBjaGVja3MsIGJ1dCB1bnRpbCB0aGUgdHJhbnNpdGlvbiB0byBOTkJEIGlzCi8vLyBjb21wbGV0ZSwgdGhpcyBhbGxvd3MgYG51bGxgIHRvIGJlIHBhc3NlZCB0byB0aGUgY29uZGl0aW9uLgovLy8KLy8gVE9ETyhzcmEpOiBPbmNlIE5OREIgaXMgZmFyIGVub3VnaCBhbG9uZyB0aGF0IHRoZSBmcm9udC1lbmQgY2FuIGdlbmVyYXRlIGBhcwovLyBib29sIWAgY2hlY2tzIGFuZCB0aGUgYmFja2VuZCBjaGVja3MgdGhlbSBjb3JyZWN0bHksIHRoaXMgaW5zdHJ1Y3Rpb24gd2lsbAovLyBiZWNvbWUgdW5uZWNlc3NhcnkgYW5kIHNob3VsZCBiZSByZW1vdmVkLgpjbGFzcyBIQm9vbENvbnZlcnNpb24gZXh0ZW5kcyBIQ2hlY2sgewogIEhCb29sQ29udmVyc2lvbihISW5zdHJ1Y3Rpb24gaW5wdXQsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltpbnB1dF0sIHR5cGUpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzSnNTdGF0ZW1lbnQoKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvZGVNb3Rpb25JbnZhcmlhbnQoKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRCb29sQ29udmVyc2lvbih0aGlzKTsKCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLkJPT0xfQ09OVkVSU0lPTl9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiBvdGhlciBpcyBIQm9vbENvbnZlcnNpb247CiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhCb29sQ29udmVyc2lvbiBvdGhlcikgPT4gdHJ1ZTsKCiAgYm9vbCBpc1JlZHVuZGFudChKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiA9IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CiAgICBBYnN0cmFjdFZhbHVlIGlucHV0VHlwZSA9IGNoZWNrZWRJbnB1dC5pbnN0cnVjdGlvblR5cGU7CiAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgIC5pc0luKGlucHV0VHlwZSwgaW5zdHJ1Y3Rpb25UeXBlKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdG9TdHJpbmcoKSA9PiAnSEJvb2xDb252ZXJzaW9uKCRjaGVja2VkSW5wdXQpJzsKfQoKLy8vIFRoZSBbSFR5cGVLbm93bl0gaW5zdHJ1Y3Rpb24gbWFya3MgYSB2YWx1ZSB3aXRoIGEgcmVmaW5lZCB0eXBlLgpjbGFzcyBIVHlwZUtub3duIGV4dGVuZHMgSENoZWNrIHsKICBBYnN0cmFjdFZhbHVlIGtub3duVHlwZTsKICBmaW5hbCBib29sIF9pc01vdmFibGU7CgogIEhUeXBlS25vd24ucGlubmVkKEFic3RyYWN0VmFsdWUga25vd25UeXBlLCBISW5zdHJ1Y3Rpb24gaW5wdXQpCiAgICAgIDogdGhpcy5rbm93blR5cGUgPSBrbm93blR5cGUsCiAgICAgICAgdGhpcy5faXNNb3ZhYmxlID0gZmFsc2UsCiAgICAgICAgc3VwZXIoPEhJbnN0cnVjdGlvbj5baW5wdXRdLCBrbm93blR5cGUpOwoKICBIVHlwZUtub3duLndpdG5lc3NlZCgKICAgICAgQWJzdHJhY3RWYWx1ZSBrbm93blR5cGUsIEhJbnN0cnVjdGlvbiBpbnB1dCwgSEluc3RydWN0aW9uIHdpdG5lc3MpCiAgICAgIDogdGhpcy5rbm93blR5cGUgPSBrbm93blR5cGUsCiAgICAgICAgdGhpcy5faXNNb3ZhYmxlID0gdHJ1ZSwKICAgICAgICBzdXBlcig8SEluc3RydWN0aW9uPltpbnB1dCwgd2l0bmVzc10sIGtub3duVHlwZSk7CgogIEBvdmVycmlkZQogIHRvU3RyaW5nKCkgPT4gJ1R5cGVLbm93biAka25vd25UeXBlJzsKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFR5cGVLbm93bih0aGlzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0pzU3RhdGVtZW50KCkgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnRyb2xGbG93KCkgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzUGlubmVkID0+IGlucHV0cy5sZW5ndGggPT0gMTsKCiAgSEluc3RydWN0aW9uIGdldCB3aXRuZXNzID0+IGlucHV0cy5sZW5ndGggPT0gMiA/IGlucHV0c1sxXSA6IG51bGw7CgogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5UWVBFX0tOT1dOX1RZUEVDT0RFOwogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IG90aGVyIGlzIEhUeXBlS25vd247CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvZGVNb3Rpb25JbnZhcmlhbnQoKSA9PiB0cnVlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTW92YWJsZSA9PiBfaXNNb3ZhYmxlICYmIHVzZUd2bigpOwoKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSFR5cGVLbm93biBvdGhlcikgewogICAgcmV0dXJuIGtub3duVHlwZSA9PSBvdGhlci5rbm93blR5cGUgJiYKICAgICAgICBpbnN0cnVjdGlvblR5cGUgPT0gb3RoZXIuaW5zdHJ1Y3Rpb25UeXBlOwogIH0KCiAgYm9vbCBpc1JlZHVuZGFudChKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiA9IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CiAgICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5jb250YWluc0FsbChrbm93blR5cGUpLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIEFic3RyYWN0VmFsdWUgaW5wdXRUeXBlID0gY2hlY2tlZElucHV0Lmluc3RydWN0aW9uVHlwZTsKICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmlzSW4oaW5wdXRUeXBlLCBrbm93blR5cGUpLmlzRGVmaW5pdGVseVRydWU7CiAgfQp9CgpjbGFzcyBIUmFuZ2VDb252ZXJzaW9uIGV4dGVuZHMgSENoZWNrIHsKICBIUmFuZ2VDb252ZXJzaW9uKEhJbnN0cnVjdGlvbiBpbnB1dCwgdHlwZSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltpbnB1dF0sIHR5cGUpIHsKICAgIHNvdXJjZUVsZW1lbnQgPSBpbnB1dC5zb3VyY2VFbGVtZW50OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNNb3ZhYmxlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFJhbmdlQ29udmVyc2lvbih0aGlzKTsKfQoKY2xhc3MgSFN0cmluZ0NvbmNhdCBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSFN0cmluZ0NvbmNhdChISW5zdHJ1Y3Rpb24gbGVmdCwgSEluc3RydWN0aW9uIHJpZ2h0LCBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIoPEhJbnN0cnVjdGlvbj5bbGVmdCwgcmlnaHRdLCB0eXBlKSB7CiAgICAvLyBUT0RPKHNyYSk6IFVudGlsIElzc3VlIDkyOTMgaXMgZml4ZWQsIHRoaXMgZmFsc2UgZGVwZW5kZW5jeSBrZWVwcyB0aGUKICAgIC8vIGNvbmNhdHMgYnVuY2hlZCB3aXRoIHN0cmluZ2lmaWVkIGlucHV0cyBmb3IgbXVjaCBiZXR0ZXIgbG9va2luZyBjb2RlIHdpdGgKICAgIC8vIGZld2VyIHRlbXBzLgogICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uU29tZXRoaW5nKCk7CiAgfQoKICBISW5zdHJ1Y3Rpb24gZ2V0IGxlZnQgPT4gaW5wdXRzWzBdOwogIEhJbnN0cnVjdGlvbiBnZXQgcmlnaHQgPT4gaW5wdXRzWzFdOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFN0cmluZ0NvbmNhdCh0aGlzKTsKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICJzdHJpbmcgY29uY2F0IjsKfQoKLy8vIFRoZSBwYXJ0IG9mIHN0cmluZyBpbnRlcnBvbGF0aW9uIHdoaWNoIGNvbnZlcnRzIGFuZCBpbnRlcnBvbGF0ZWQgZXhwcmVzc2lvbgovLy8gaW50byBhIFN0cmluZyB2YWx1ZS4KY2xhc3MgSFN0cmluZ2lmeSBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSFN0cmluZ2lmeShISW5zdHJ1Y3Rpb24gaW5wdXQsIEFic3RyYWN0VmFsdWUgcmVzdWx0VHlwZSkKICAgICAgOiBzdXBlcig8SEluc3RydWN0aW9uPltpbnB1dF0sIHJlc3VsdFR5cGUpIHsKICAgIHNpZGVFZmZlY3RzLnNldEFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5zZXREZXBlbmRzT25Tb21ldGhpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0U3RyaW5naWZ5KHRoaXMpOwogIEBvdmVycmlkZQogIHRvU3RyaW5nKCkgPT4gInN0cmluZ2lmeSI7Cn0KCi8vLyBOb24tYmxvY2stYmFzZWQgKGFrYS4gdHJhZGl0aW9uYWwpIGxvb3AgaW5mb3JtYXRpb24uCmNsYXNzIEhMb29wSW5mb3JtYXRpb24gewogIGZpbmFsIEhCYXNpY0Jsb2NrIGhlYWRlcjsKICBmaW5hbCBMaXN0PEhCYXNpY0Jsb2NrPiBibG9ja3M7CiAgZmluYWwgTGlzdDxIQmFzaWNCbG9jaz4gYmFja0VkZ2VzOwogIGZpbmFsIExpc3Q8TGFiZWxEZWZpbml0aW9uPiBsYWJlbHM7CiAgZmluYWwgSnVtcFRhcmdldCB0YXJnZXQ7CgogIC8vLyBDb3JyZXNwb25kaW5nIGJsb2NrIGluZm9ybWF0aW9uIGZvciB0aGUgbG9vcC4KICBITG9vcEJsb2NrSW5mb3JtYXRpb24gbG9vcEJsb2NrSW5mb3JtYXRpb247CgogIEhMb29wSW5mb3JtYXRpb24odGhpcy5oZWFkZXIsIHRoaXMudGFyZ2V0LCB0aGlzLmxhYmVscykKICAgICAgOiBibG9ja3MgPSBuZXcgTGlzdDxIQmFzaWNCbG9jaz4oKSwKICAgICAgICBiYWNrRWRnZXMgPSBuZXcgTGlzdDxIQmFzaWNCbG9jaz4oKTsKCiAgdm9pZCBhZGRCYWNrRWRnZShIQmFzaWNCbG9jayBwcmVkZWNlc3NvcikgewogICAgYmFja0VkZ2VzLmFkZChwcmVkZWNlc3Nvcik7CiAgICBMaXN0PEhCYXNpY0Jsb2NrPiB3b3JrUXVldWUgPSA8SEJhc2ljQmxvY2s+W3ByZWRlY2Vzc29yXTsKICAgIGRvIHsKICAgICAgSEJhc2ljQmxvY2sgY3VycmVudCA9IHdvcmtRdWV1ZS5yZW1vdmVMYXN0KCk7CiAgICAgIGFkZEJsb2NrKGN1cnJlbnQsIHdvcmtRdWV1ZSk7CiAgICB9IHdoaWxlICghd29ya1F1ZXVlLmlzRW1wdHkpOwogIH0KCiAgLy8gQWRkcyBhIGJsb2NrIGFuZCB0cmFuc2l0aXZlbHkgYWxsIGl0cyBwcmVkZWNlc3NvcnMgaW4gdGhlIGxvb3AgYXMKICAvLyBsb29wIGJsb2Nrcy4KICB2b2lkIGFkZEJsb2NrKEhCYXNpY0Jsb2NrIGJsb2NrLCBMaXN0PEhCYXNpY0Jsb2NrPiB3b3JrUXVldWUpIHsKICAgIGlmIChpZGVudGljYWwoYmxvY2ssIGhlYWRlcikpIHJldHVybjsKICAgIEhCYXNpY0Jsb2NrIHBhcmVudEhlYWRlciA9IGJsb2NrLnBhcmVudExvb3BIZWFkZXI7CiAgICBpZiAoaWRlbnRpY2FsKHBhcmVudEhlYWRlciwgaGVhZGVyKSkgewogICAgICAvLyBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY2FzZS4KICAgIH0gZWxzZSBpZiAocGFyZW50SGVhZGVyICE9IG51bGwpIHsKICAgICAgd29ya1F1ZXVlLmFkZChwYXJlbnRIZWFkZXIpOwogICAgfSBlbHNlIHsKICAgICAgYmxvY2sucGFyZW50TG9vcEhlYWRlciA9IGhlYWRlcjsKICAgICAgYmxvY2tzLmFkZChibG9jayk7CiAgICAgIHdvcmtRdWV1ZS5hZGRBbGwoYmxvY2sucHJlZGVjZXNzb3JzKTsKICAgIH0KICB9Cn0KCi8vLyBFbWJlZGRpbmcgb2YgYSBbSEJsb2NrSW5mb3JtYXRpb25dIGZvciBibG9jay1zdHJ1Y3R1cmUgYmFzZWQgdHJhdmVyc2FsCi8vLyBpbiBhIGRvbWluYXRvciBiYXNlZCBmbG93IHRyYXZlcnNhbCBieSBhdHRhY2hpbmcgaXQgdG8gYSBiYXNpYyBibG9jay4KLy8vIFRvIGdvIGJhY2sgdG8gZG9taW5hdG9yLWJhc2VkIHRyYXZlcnNhbCwgYSBbSFN1YkdyYXBoQmxvY2tJbmZvcm1hdGlvbl0KLy8vIHN0cnVjdHVyZSBjYW4gYmUgYWRkZWQgaW4gdGhlIGJsb2NrIHN0cnVjdHVyZS4KY2xhc3MgSEJsb2NrRmxvdyB7CiAgZmluYWwgSEJsb2NrSW5mb3JtYXRpb24gYm9keTsKICBmaW5hbCBIQmFzaWNCbG9jayBjb250aW51YXRpb247CiAgSEJsb2NrRmxvdyh0aGlzLmJvZHksIHRoaXMuY29udGludWF0aW9uKTsKfQoKLy8vIEluZm9ybWF0aW9uIGFib3V0IGEgc3ludGFjdGljLWxpa2Ugc3RydWN0dXJlLgphYnN0cmFjdCBjbGFzcyBIQmxvY2tJbmZvcm1hdGlvbiB7CiAgSEJhc2ljQmxvY2sgZ2V0IHN0YXJ0OwogIEhCYXNpY0Jsb2NrIGdldCBlbmQ7CiAgYm9vbCBhY2NlcHQoSEJsb2NrSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpOwp9CgovLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBzdGF0ZW1lbnQtbGlrZSBzdHJ1Y3R1cmUuCmFic3RyYWN0IGNsYXNzIEhTdGF0ZW1lbnRJbmZvcm1hdGlvbiBleHRlbmRzIEhCbG9ja0luZm9ybWF0aW9uIHsKICBAb3ZlcnJpZGUKICBib29sIGFjY2VwdChIU3RhdGVtZW50SW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpOwp9CgovLy8gSW5mb3JtYXRpb24gYWJvdXQgYW4gZXhwcmVzc2lvbi1saWtlIHN0cnVjdHVyZS4KYWJzdHJhY3QgY2xhc3MgSEV4cHJlc3Npb25JbmZvcm1hdGlvbiBleHRlbmRzIEhCbG9ja0luZm9ybWF0aW9uIHsKICBAb3ZlcnJpZGUKICBib29sIGFjY2VwdChIRXhwcmVzc2lvbkluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKTsKICBISW5zdHJ1Y3Rpb24gZ2V0IGNvbmRpdGlvbkV4cHJlc3Npb247Cn0KCmFic3RyYWN0IGNsYXNzIEhTdGF0ZW1lbnRJbmZvcm1hdGlvblZpc2l0b3IgewogIGJvb2wgdmlzaXRMYWJlbGVkQmxvY2tJbmZvKEhMYWJlbGVkQmxvY2tJbmZvcm1hdGlvbiBpbmZvKTsKICBib29sIHZpc2l0TG9vcEluZm8oSExvb3BCbG9ja0luZm9ybWF0aW9uIGluZm8pOwogIGJvb2wgdmlzaXRJZkluZm8oSElmQmxvY2tJbmZvcm1hdGlvbiBpbmZvKTsKICBib29sIHZpc2l0VHJ5SW5mbyhIVHJ5QmxvY2tJbmZvcm1hdGlvbiBpbmZvKTsKICBib29sIHZpc2l0U3dpdGNoSW5mbyhIU3dpdGNoQmxvY2tJbmZvcm1hdGlvbiBpbmZvKTsKICBib29sIHZpc2l0U2VxdWVuY2VJbmZvKEhTdGF0ZW1lbnRTZXF1ZW5jZUluZm9ybWF0aW9uIGluZm8pOwogIC8vIFBzZXVkby1zdHJ1Y3R1cmUgZW1iZWRkaW5nIGEgZG9taW5hdG9yLWJhc2VkIHRyYXZlcnNhbCBpbnRvCiAgLy8gdGhlIGJsb2NrLXN0cnVjdHVyZSB0cmF2ZXJzYWwuIFRoaXMgd2lsbCBldmVudHVhbGx5IGdvIGF3YXkuCiAgYm9vbCB2aXNpdFN1YkdyYXBoSW5mbyhIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uIGluZm8pOwp9CgphYnN0cmFjdCBjbGFzcyBIRXhwcmVzc2lvbkluZm9ybWF0aW9uVmlzaXRvciB7CiAgYm9vbCB2aXNpdEFuZE9ySW5mbyhIQW5kT3JCbG9ja0luZm9ybWF0aW9uIGluZm8pOwogIGJvb2wgdmlzaXRTdWJFeHByZXNzaW9uSW5mbyhIU3ViRXhwcmVzc2lvbkJsb2NrSW5mb3JtYXRpb24gaW5mbyk7Cn0KCmFic3RyYWN0IGNsYXNzIEhCbG9ja0luZm9ybWF0aW9uVmlzaXRvcgogICAgaW1wbGVtZW50cyBIU3RhdGVtZW50SW5mb3JtYXRpb25WaXNpdG9yLCBIRXhwcmVzc2lvbkluZm9ybWF0aW9uVmlzaXRvciB7fQoKLy8vIEdlbmVyaWMgY2xhc3Mgd3JhcHBpbmcgYSBbU3ViR3JhcGhdIGFzIGEgYmxvY2staW5mb3JtYXRpb24gdW50aWwKLy8vIGFsbCBzdHJ1Y3R1cmVzIGFyZSBoYW5kbGVkIHByb3Blcmx5LgpjbGFzcyBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uIGltcGxlbWVudHMgSFN0YXRlbWVudEluZm9ybWF0aW9uIHsKICBmaW5hbCBTdWJHcmFwaCBzdWJHcmFwaDsKICBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uKHRoaXMuc3ViR3JhcGgpOwoKICBAb3ZlcnJpZGUKICBIQmFzaWNCbG9jayBnZXQgc3RhcnQgPT4gc3ViR3JhcGguc3RhcnQ7CiAgQG92ZXJyaWRlCiAgSEJhc2ljQmxvY2sgZ2V0IGVuZCA9PiBzdWJHcmFwaC5lbmQ7CgogIEBvdmVycmlkZQogIGJvb2wgYWNjZXB0KEhTdGF0ZW1lbnRJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgPT4KICAgICAgdmlzaXRvci52aXNpdFN1YkdyYXBoSW5mbyh0aGlzKTsKfQoKLy8vIEdlbmVyaWMgY2xhc3Mgd3JhcHBpbmcgYSBbU3ViRXhwcmVzc2lvbl0gYXMgYSBibG9jay1pbmZvcm1hdGlvbiB1bnRpbAovLy8gZXhwcmVzc2lvbnMgc3RydWN0dXJlcyBhcmUgaGFuZGxlZCBwcm9wZXJseS4KY2xhc3MgSFN1YkV4cHJlc3Npb25CbG9ja0luZm9ybWF0aW9uIGltcGxlbWVudHMgSEV4cHJlc3Npb25JbmZvcm1hdGlvbiB7CiAgZmluYWwgU3ViRXhwcmVzc2lvbiBzdWJFeHByZXNzaW9uOwogIEhTdWJFeHByZXNzaW9uQmxvY2tJbmZvcm1hdGlvbih0aGlzLnN1YkV4cHJlc3Npb24pOwoKICBAb3ZlcnJpZGUKICBIQmFzaWNCbG9jayBnZXQgc3RhcnQgPT4gc3ViRXhwcmVzc2lvbi5zdGFydDsKICBAb3ZlcnJpZGUKICBIQmFzaWNCbG9jayBnZXQgZW5kID0+IHN1YkV4cHJlc3Npb24uZW5kOwoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gZ2V0IGNvbmRpdGlvbkV4cHJlc3Npb24gPT4gc3ViRXhwcmVzc2lvbi5jb25kaXRpb25FeHByZXNzaW9uOwoKICBAb3ZlcnJpZGUKICBib29sIGFjY2VwdChIRXhwcmVzc2lvbkluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSA9PgogICAgICB2aXNpdG9yLnZpc2l0U3ViRXhwcmVzc2lvbkluZm8odGhpcyk7Cn0KCi8vLyBBIHNlcXVlbmNlIG9mIHNlcGFyYXRlIHN0YXRlbWVudHMuCmNsYXNzIEhTdGF0ZW1lbnRTZXF1ZW5jZUluZm9ybWF0aW9uIGltcGxlbWVudHMgSFN0YXRlbWVudEluZm9ybWF0aW9uIHsKICBmaW5hbCBMaXN0PEhTdGF0ZW1lbnRJbmZvcm1hdGlvbj4gc3RhdGVtZW50czsKICBIU3RhdGVtZW50U2VxdWVuY2VJbmZvcm1hdGlvbih0aGlzLnN0YXRlbWVudHMpOwoKICBAb3ZlcnJpZGUKICBIQmFzaWNCbG9jayBnZXQgc3RhcnQgPT4gc3RhdGVtZW50c1swXS5zdGFydDsKICBAb3ZlcnJpZGUKICBIQmFzaWNCbG9jayBnZXQgZW5kID0+IHN0YXRlbWVudHMubGFzdC5lbmQ7CgogIEBvdmVycmlkZQogIGJvb2wgYWNjZXB0KEhTdGF0ZW1lbnRJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgPT4KICAgICAgdmlzaXRvci52aXNpdFNlcXVlbmNlSW5mbyh0aGlzKTsKfQoKY2xhc3MgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uIGltcGxlbWVudHMgSFN0YXRlbWVudEluZm9ybWF0aW9uIHsKICBmaW5hbCBIU3RhdGVtZW50SW5mb3JtYXRpb24gYm9keTsKICBmaW5hbCBMaXN0PExhYmVsRGVmaW5pdGlvbj4gbGFiZWxzOwogIGZpbmFsIEp1bXBUYXJnZXQgdGFyZ2V0OwogIGZpbmFsIGJvb2wgaXNDb250aW51ZTsKCiAgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uKHRoaXMuYm9keSwgTGlzdDxMYWJlbERlZmluaXRpb24+IGxhYmVscywKICAgICAge3RoaXMuaXNDb250aW51ZTogZmFsc2V9KQogICAgICA6IHRoaXMubGFiZWxzID0gbGFiZWxzLAogICAgICAgIHRoaXMudGFyZ2V0ID0gbGFiZWxzWzBdLnRhcmdldDsKCiAgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uLmltcGxpY2l0KHRoaXMuYm9keSwgdGhpcy50YXJnZXQsCiAgICAgIHt0aGlzLmlzQ29udGludWU6IGZhbHNlfSkKICAgICAgOiB0aGlzLmxhYmVscyA9IGNvbnN0IDxMYWJlbERlZmluaXRpb24+W107CgogIEBvdmVycmlkZQogIEhCYXNpY0Jsb2NrIGdldCBzdGFydCA9PiBib2R5LnN0YXJ0OwogIEBvdmVycmlkZQogIEhCYXNpY0Jsb2NrIGdldCBlbmQgPT4gYm9keS5lbmQ7CgogIEBvdmVycmlkZQogIGJvb2wgYWNjZXB0KEhTdGF0ZW1lbnRJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgPT4KICAgICAgdmlzaXRvci52aXNpdExhYmVsZWRCbG9ja0luZm8odGhpcyk7Cn0KCmNsYXNzIEhMb29wQmxvY2tJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIEhTdGF0ZW1lbnRJbmZvcm1hdGlvbiB7CiAgc3RhdGljIGNvbnN0IGludCBXSElMRV9MT09QID0gMDsKICBzdGF0aWMgY29uc3QgaW50IEZPUl9MT09QID0gMTsKICBzdGF0aWMgY29uc3QgaW50IERPX1dISUxFX0xPT1AgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgRk9SX0lOX0xPT1AgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgU1dJVENIX0NPTlRJTlVFX0xPT1AgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgTk9UX0FfTE9PUCA9IC0xOwoKICBmaW5hbCBpbnQga2luZDsKICBmaW5hbCBIRXhwcmVzc2lvbkluZm9ybWF0aW9uIGluaXRpYWxpemVyOwogIGZpbmFsIEhFeHByZXNzaW9uSW5mb3JtYXRpb24gY29uZGl0aW9uOwogIGZpbmFsIEhTdGF0ZW1lbnRJbmZvcm1hdGlvbiBib2R5OwogIGZpbmFsIEhFeHByZXNzaW9uSW5mb3JtYXRpb24gdXBkYXRlczsKICBmaW5hbCBKdW1wVGFyZ2V0IHRhcmdldDsKICBmaW5hbCBMaXN0PExhYmVsRGVmaW5pdGlvbj4gbGFiZWxzOwogIGZpbmFsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uOwoKICBITG9vcEJsb2NrSW5mb3JtYXRpb24odGhpcy5raW5kLCB0aGlzLmluaXRpYWxpemVyLCB0aGlzLmNvbmRpdGlvbiwgdGhpcy5ib2R5LAogICAgICB0aGlzLnVwZGF0ZXMsIHRoaXMudGFyZ2V0LCB0aGlzLmxhYmVscywgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbikgewogICAgYXNzZXJ0KAogICAgICAgIChraW5kID09IERPX1dISUxFX0xPT1AgPyBib2R5LnN0YXJ0IDogY29uZGl0aW9uLnN0YXJ0KS5pc0xvb3BIZWFkZXIoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBIQmFzaWNCbG9jayBnZXQgc3RhcnQgewogICAgaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHJldHVybiBpbml0aWFsaXplci5zdGFydDsKICAgIGlmIChraW5kID09IERPX1dISUxFX0xPT1ApIHsKICAgICAgcmV0dXJuIGJvZHkuc3RhcnQ7CiAgICB9CiAgICByZXR1cm4gY29uZGl0aW9uLnN0YXJ0OwogIH0KCiAgSEJhc2ljQmxvY2sgZ2V0IGxvb3BIZWFkZXIgewogICAgcmV0dXJuIGtpbmQgPT0gRE9fV0hJTEVfTE9PUCA/IGJvZHkuc3RhcnQgOiBjb25kaXRpb24uc3RhcnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBIQmFzaWNCbG9jayBnZXQgZW5kIHsKICAgIGlmICh1cGRhdGVzICE9IG51bGwpIHJldHVybiB1cGRhdGVzLmVuZDsKICAgIGlmIChraW5kID09IERPX1dISUxFX0xPT1AgJiYgY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgcmV0dXJuIGNvbmRpdGlvbi5lbmQ7CiAgICB9CiAgICByZXR1cm4gYm9keS5lbmQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGFjY2VwdChIU3RhdGVtZW50SW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpID0+CiAgICAgIHZpc2l0b3IudmlzaXRMb29wSW5mbyh0aGlzKTsKfQoKY2xhc3MgSElmQmxvY2tJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIEhTdGF0ZW1lbnRJbmZvcm1hdGlvbiB7CiAgZmluYWwgSEV4cHJlc3Npb25JbmZvcm1hdGlvbiBjb25kaXRpb247CiAgZmluYWwgSFN0YXRlbWVudEluZm9ybWF0aW9uIHRoZW5HcmFwaDsKICBmaW5hbCBIU3RhdGVtZW50SW5mb3JtYXRpb24gZWxzZUdyYXBoOwogIEhJZkJsb2NrSW5mb3JtYXRpb24odGhpcy5jb25kaXRpb24sIHRoaXMudGhlbkdyYXBoLCB0aGlzLmVsc2VHcmFwaCk7CgogIEBvdmVycmlkZQogIEhCYXNpY0Jsb2NrIGdldCBzdGFydCA9PiBjb25kaXRpb24uc3RhcnQ7CiAgQG92ZXJyaWRlCiAgSEJhc2ljQmxvY2sgZ2V0IGVuZCA9PiBlbHNlR3JhcGggPT0gbnVsbCA/IHRoZW5HcmFwaC5lbmQgOiBlbHNlR3JhcGguZW5kOwoKICBAb3ZlcnJpZGUKICBib29sIGFjY2VwdChIU3RhdGVtZW50SW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpID0+CiAgICAgIHZpc2l0b3IudmlzaXRJZkluZm8odGhpcyk7Cn0KCmNsYXNzIEhBbmRPckJsb2NrSW5mb3JtYXRpb24gaW1wbGVtZW50cyBIRXhwcmVzc2lvbkluZm9ybWF0aW9uIHsKICBmaW5hbCBib29sIGlzQW5kOwogIGZpbmFsIEhFeHByZXNzaW9uSW5mb3JtYXRpb24gbGVmdDsKICBmaW5hbCBIRXhwcmVzc2lvbkluZm9ybWF0aW9uIHJpZ2h0OwogIEhBbmRPckJsb2NrSW5mb3JtYXRpb24odGhpcy5pc0FuZCwgdGhpcy5sZWZ0LCB0aGlzLnJpZ2h0KTsKCiAgQG92ZXJyaWRlCiAgSEJhc2ljQmxvY2sgZ2V0IHN0YXJ0ID0+IGxlZnQuc3RhcnQ7CiAgQG92ZXJyaWRlCiAgSEJhc2ljQmxvY2sgZ2V0IGVuZCA9PiByaWdodC5lbmQ7CgogIC8vIFdlIGRvbid0IGN1cnJlbnRseSB1c2UgSEFuZE9yQmxvY2tJbmZvcm1hdGlvbi4KICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gZ2V0IGNvbmRpdGlvbkV4cHJlc3Npb24gewogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGFjY2VwdChIRXhwcmVzc2lvbkluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSA9PgogICAgICB2aXNpdG9yLnZpc2l0QW5kT3JJbmZvKHRoaXMpOwp9CgpjbGFzcyBIVHJ5QmxvY2tJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIEhTdGF0ZW1lbnRJbmZvcm1hdGlvbiB7CiAgZmluYWwgSFN0YXRlbWVudEluZm9ybWF0aW9uIGJvZHk7CiAgZmluYWwgSExvY2FsVmFsdWUgY2F0Y2hWYXJpYWJsZTsKICBmaW5hbCBIU3RhdGVtZW50SW5mb3JtYXRpb24gY2F0Y2hCbG9jazsKICBmaW5hbCBIU3RhdGVtZW50SW5mb3JtYXRpb24gZmluYWxseUJsb2NrOwogIEhUcnlCbG9ja0luZm9ybWF0aW9uKAogICAgICB0aGlzLmJvZHksIHRoaXMuY2F0Y2hWYXJpYWJsZSwgdGhpcy5jYXRjaEJsb2NrLCB0aGlzLmZpbmFsbHlCbG9jayk7CgogIEBvdmVycmlkZQogIEhCYXNpY0Jsb2NrIGdldCBzdGFydCA9PiBib2R5LnN0YXJ0OwogIEBvdmVycmlkZQogIEhCYXNpY0Jsb2NrIGdldCBlbmQgPT4KICAgICAgZmluYWxseUJsb2NrID09IG51bGwgPyBjYXRjaEJsb2NrLmVuZCA6IGZpbmFsbHlCbG9jay5lbmQ7CgogIEBvdmVycmlkZQogIGJvb2wgYWNjZXB0KEhTdGF0ZW1lbnRJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgPT4KICAgICAgdmlzaXRvci52aXNpdFRyeUluZm8odGhpcyk7Cn0KCmNsYXNzIEhTd2l0Y2hCbG9ja0luZm9ybWF0aW9uIGltcGxlbWVudHMgSFN0YXRlbWVudEluZm9ybWF0aW9uIHsKICBmaW5hbCBIRXhwcmVzc2lvbkluZm9ybWF0aW9uIGV4cHJlc3Npb247CiAgZmluYWwgTGlzdDxIU3RhdGVtZW50SW5mb3JtYXRpb24+IHN0YXRlbWVudHM7CiAgZmluYWwgSnVtcFRhcmdldCB0YXJnZXQ7CiAgZmluYWwgTGlzdDxMYWJlbERlZmluaXRpb24+IGxhYmVsczsKICBmaW5hbCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbjsKCiAgSFN3aXRjaEJsb2NrSW5mb3JtYXRpb24odGhpcy5leHByZXNzaW9uLCB0aGlzLnN0YXRlbWVudHMsIHRoaXMudGFyZ2V0LAogICAgICB0aGlzLmxhYmVscywgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbik7CgogIEBvdmVycmlkZQogIEhCYXNpY0Jsb2NrIGdldCBzdGFydCA9PiBleHByZXNzaW9uLnN0YXJ0OwogIEBvdmVycmlkZQogIEhCYXNpY0Jsb2NrIGdldCBlbmQgewogICAgLy8gV2UgZG9uJ3QgY3JlYXRlIGEgc3dpdGNoIGJsb2NrIGlmIHRoZXJlIGFyZSBubyBjYXNlcy4KICAgIGFzc2VydCghc3RhdGVtZW50cy5pc0VtcHR5KTsKICAgIHJldHVybiBzdGF0ZW1lbnRzLmxhc3QuZW5kOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhY2NlcHQoSFN0YXRlbWVudEluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSA9PgogICAgICB2aXNpdG9yLnZpc2l0U3dpdGNoSW5mbyh0aGlzKTsKfQoKLy8vIFJlYWRzIHJhdyByZWlmaWVkIHR5cGUgaW5mbyBmcm9tIGFuIG9iamVjdC4KY2xhc3MgSFR5cGVJbmZvUmVhZFJhdyBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSFR5cGVJbmZvUmVhZFJhdyhISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEFic3RyYWN0VmFsdWUgaW5zdHJ1Y3Rpb25UeXBlKQogICAgICA6IHN1cGVyKDxISW5zdHJ1Y3Rpb24+W3JlY2VpdmVyXSwgaW5zdHJ1Y3Rpb25UeXBlKSB7CiAgICBzZXRVc2VHdm4oKTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0VHlwZUluZm9SZWFkUmF3KHRoaXMpOwoKICBAb3ZlcnJpZGUKICBib29sIGNhblRocm93KEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLlRZUEVfSU5GT19SRUFEX1JBV19UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiBvdGhlciBpcyBIVHlwZUluZm9SZWFkUmF3OwoKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSFR5cGVJbmZvUmVhZFJhdyBvdGhlcikgewogICAgcmV0dXJuIHRydWU7CiAgfQp9CgovLy8gUmVhZHMgYSB0eXBlIHZhcmlhYmxlIGZyb20gYW4gb2JqZWN0LiBUaGUgcmVhZCBtYXkgYmUgYSBzaW1wbGUgaW5kZXhpbmcgb2YKLy8vIHRoZSB0eXBlIHBhcmFtZXRlcnMgb3IgaXQgbWF5IHJlcXVpcmUgJ3N1YnN0aXR1dGlvbicuIFRoZXJlIG1heSBiZSBhbgovLy8gaW50ZXJjZXB0b3IgYXJndW1lbnQgdG8gYWNjZXNzIHRoZSBzdWJzdGl0dXRpb24gb2YgbmF0aXZlIGNsYXNzZXMuCmNsYXNzIEhUeXBlSW5mb1JlYWRWYXJpYWJsZSBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgLy8vIFRoZSB0eXBlIHZhcmlhYmxlIGJlaW5nIHJlYWQuCiAgZmluYWwgVHlwZVZhcmlhYmxlVHlwZSB2YXJpYWJsZTsKICBmaW5hbCBib29sIGlzSW50ZXJjZXB0ZWQ7CgogIEhUeXBlSW5mb1JlYWRWYXJpYWJsZS5pbnRlcmNlcHRlZCh0aGlzLnZhcmlhYmxlLCBISW5zdHJ1Y3Rpb24gaW50ZXJjZXB0b3IsCiAgICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciwgQWJzdHJhY3RWYWx1ZSBpbnN0cnVjdGlvblR5cGUpCiAgICAgIDogaXNJbnRlcmNlcHRlZCA9IHRydWUsCiAgICAgICAgc3VwZXIoPEhJbnN0cnVjdGlvbj5baW50ZXJjZXB0b3IsIHJlY2VpdmVyXSwgaW5zdHJ1Y3Rpb25UeXBlKSB7CiAgICBzZXRVc2VHdm4oKTsKICB9CgogIEhUeXBlSW5mb1JlYWRWYXJpYWJsZS5ub0ludGVyY2VwdG9yKAogICAgICB0aGlzLnZhcmlhYmxlLCBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEFic3RyYWN0VmFsdWUgaW5zdHJ1Y3Rpb25UeXBlKQogICAgICA6IGlzSW50ZXJjZXB0ZWQgPSBmYWxzZSwKICAgICAgICBzdXBlcig8SEluc3RydWN0aW9uPltyZWNlaXZlcl0sIGluc3RydWN0aW9uVHlwZSkgewogICAgc2V0VXNlR3ZuKCk7CiAgfQoKICBISW5zdHJ1Y3Rpb24gZ2V0IGludGVyY2VwdG9yIHsKICAgIGFzc2VydChpc0ludGVyY2VwdGVkKTsKICAgIHJldHVybiBpbnB1dHMuZmlyc3Q7CiAgfQoKICBISW5zdHJ1Y3Rpb24gZ2V0IG9iamVjdCA9PiBpbnB1dHMubGFzdDsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRUeXBlSW5mb1JlYWRWYXJpYWJsZSh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5UaHJvdyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5UWVBFX0lORk9fUkVBRF9WQVJJQUJMRV9UWVBFQ09ERTsKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiBvdGhlciBpcyBIVHlwZUluZm9SZWFkVmFyaWFibGU7CgogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhIVHlwZUluZm9SZWFkVmFyaWFibGUgb3RoZXIpIHsKICAgIHJldHVybiB2YXJpYWJsZSA9PSBvdGhlci52YXJpYWJsZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdIVHlwZUluZm9SZWFkVmFyaWFibGUoJHZhcmlhYmxlKSc7Cn0KCmVudW0gVHlwZUluZm9FeHByZXNzaW9uS2luZCB7IENPTVBMRVRFLCBJTlNUQU5DRSB9CgovLy8gQ29uc3RydWN0cyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgY2xvc2VkIG9yIGdyb3VuZC10ZXJtIHR5cGUgKHRoYXQgaXMsIGEgdHlwZQovLy8gd2l0aG91dCB0eXBlIHZhcmlhYmxlcykuCi8vLwovLy8gVGhlcmUgYXJlIHR3byBmb3JtczoKLy8vCi8vLyAtIENPTVBMRVRFOiBBIGNvbXBsZXRlIGZvcm0gdGhhdCBpcyBzZWxmIGNvbnRhaW5lZCwgdXNlZCBmb3IgdGhlIHZhbHVlcyBvZgovLy8gICB0eXBlIHBhcmFtZXRlcnMgYW5kIG5vbi1yYXcgaXMtY2hlY2tzLgovLy8KLy8vIC0gSU5TVEFOQ0U6IEEgaGVhZGxlc3MgZmxhdCBmb3JtIGZvciByZXByZXNlbnRpbmcgdGhlIHNlcXVlbmNlIG9mIHZhbHVlcyBvZgovLy8gICB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIGFuIGluc3RhbmNlIG9mIGEgZ2VuZXJpYyB0eXBlLgovLy8KLy8vIFRoZSBDT01QTEVURSBmb3JtIHZhbHVlIGlzIGNvbnN0cnVjdGVkIGZyb20gW2RhcnRUeXBlXSBieSByZXBsYWNpbmcgdGhlIHR5cGUKLy8vIHZhcmlhYmxlcyB3aXRoIGNvbnNlY3V0aXZlIHZhbHVlcyBmcm9tIFtpbnB1dHNdLCBpbiB0aGUgb3JkZXIgZ2VuZXJhdGVkIGJ5Ci8vLyBbRGFydFR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZV0uICBUaGUgdHlwZSB2YXJpYWJsZXMgaW4gW2RhcnRUeXBlXSBhcmUKLy8vIHRyZWF0ZWQgYXMgJ2hvbGVzJyBpbiB0aGUgdGVybSwgd2hpY2ggbWVhbnMgdGhhdCBpdCBtdXN0IGJlIGVuc3VyZWQgYXQKLy8vIGNvbnN0cnVjdGlvbiwgdGhhdCBkdXBsaWNhdGUgb2NjdXJlbmNlcyBvZiBhIHR5cGUgdmFyaWFibGUgaW4gW2RhcnRUeXBlXSBhcmUKLy8vIGFzc2lnbmVkIHRoZSBzYW1lIHZhbHVlLgovLy8KLy8vIFRoZSBJTlNUQU5DRSBmb3JtIGlzIGNvbnN0cnVjdGVkIGFzIGEgbGlzdCBvZiBbaW5wdXRzXS4gVGhpcyBpcyB0aGUgc2FtZSBhcwovLy8gdGhlIENPTVBMRVRFIGZvcm0gZm9yIHRoZSAndGhpc1R5cGUnLCBleGNlcHQgdGhlIHJvb3QgdGVybSdzIHR5cGUgaXMKLy8vIG1pc3Npbmc7IHRoaXMgaXMgaW1wbGljaXQgYXMgdGhlIHJhdyB0eXBlIG9mIGluc3RhbmNlLiAgVGhlIFtkYXJ0VHlwZV0gb2YKLy8vIHRoZSBJTlNUQU5DRSBmb3JtIG11c3QgYmUgdGhlIHRoaXNUeXBlIG9mIHNvbWUgY2xhc3MuCi8vLwovLy8gV2Ugd2FudCB0byByZW1vdmUgdGhlIGNvbnN0cmFpbnMgb24gdGhlIElOU1RBTkNFIGZvcm0uIEluIHRoZSBtZWFudGltZSB3ZQovLy8gZ2V0IGJ5IHdpdGggYSB0cmVlIG9mIFR5cGVFeHByZXNzaW9ucy4gIENvbnNpZGVyOgovLy8KLy8vICAgICBjbGFzcyBGb288VD4gewovLy8gICAgICAgLi4uIG5ldyBTZXQ8TGlzdDxUPj4oKQovLy8gICAgIH0KLy8vICAgICBjbGFzcyBTZXQ8RTE+IHsKLy8vICAgICAgIGZhY3RvcnkgU2V0KCkgPT4gbmV3IF9MaW5rZWRIYXNoU2V0PEUxPigpOwovLy8gICAgIH0KLy8vICAgICBjbGFzcyBMaXN0PEUyPiB7IC4uLiB9Ci8vLyAgICAgY2xhc3MgX0xpbmtlZEhhc2hTZXQ8RTM+IHsgLi4uIH0KLy8vCi8vLyBBZnRlciBpbmxpbmluZyB0aGUgZmFjdG9yeSBjb25zdHJ1Y3RvciBmb3IgYFNldDxFMT5gLCB0aGUgSENyZWF0ZSBzaG91bGQKLy8vIGhhdmUgdHlwZSBgX0xpbmtlZEhhc2hTZXQ8TGlzdDxUPj5gIGFuZCB0aGUgVHlwZUV4cHJlc3Npb24gc2hvdWxkIGJlIGEgdHJlZToKLy8vCi8vLyAgICBIQ3JlYXRlKGRhcnRUeXBlOiBfTGlua2VkSGFzaFNldDxMaXN0PFQ+PiwKLy8vICAgICAgICBbXSwgLy8gTm8gYXJndW1lbnRzCi8vLyAgICAgICAgSFR5cGVJbmZvRXhwcmVzc2lvbihJTlNUQU5DRSwKLy8vICAgICAgICAgICAgZGFydFR5cGU6IF9MaW5rZWRIYXNoU2V0PEUzPiwgLy8gX0xpbmtlZEhhc2hTZXQncyB0aGlzVHlwZQovLy8gICAgICAgICAgICBIVHlwZUluZm9FeHByZXNzaW9uKENPTVBMRVRFLCAgLy8gRTMgPSBMaXN0PFQ+Ci8vLyAgICAgICAgICAgICAgICBkYXJ0VHlwZTogTGlzdDxFMj4sCi8vLyAgICAgICAgICAgICAgICBIVHlwZUluZm9SZWFkVmFyaWFibGUodGhpcywgVCkpKSkgLy8gRTIgPSBUCgovLyBUT0RPKHNyYSk6IFRoZSBJTlNUQU5DRSBmb3JtIHJlcXVpcmVzIHRoZSBhY3R1YWwgaW5zdGFuY2UgZm9yIGZ1bGwKLy8gaW50ZXJwcmV0YXRpb24uIElmIHRoZSBDT01QTEVURSBmb3JtIHdhcyB1c2VkIG9uIGluc3RhbmNlcywgdGhlbiB3ZSBjb3VsZAovLyBzaW1wbGlmeSBIVHlwZUluZm9SZWFkVmFyaWFibGUgd2l0aG91dCBhbiBvYmplY3QuCgpjbGFzcyBIVHlwZUluZm9FeHByZXNzaW9uIGV4dGVuZHMgSEluc3RydWN0aW9uIHsKICBmaW5hbCBUeXBlSW5mb0V4cHJlc3Npb25LaW5kIGtpbmQ7CiAgZmluYWwgRGFydFR5cGUgZGFydFR5cGU7CgogIC8vLyBgdHJ1ZWAgaWYgdGhpcwogIGZpbmFsIGJvb2wgaXNUeXBlVmFyaWFibGVSZXBsYWNlbWVudDsKCiAgSFR5cGVJbmZvRXhwcmVzc2lvbih0aGlzLmtpbmQsIHRoaXMuZGFydFR5cGUsIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsCiAgICAgIEFic3RyYWN0VmFsdWUgaW5zdHJ1Y3Rpb25UeXBlLAogICAgICB7dGhpcy5pc1R5cGVWYXJpYWJsZVJlcGxhY2VtZW50OiBmYWxzZX0pCiAgICAgIDogc3VwZXIoaW5wdXRzLCBpbnN0cnVjdGlvblR5cGUpIHsKICAgIHNldFVzZUd2bigpOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRUeXBlSW5mb0V4cHJlc3Npb24odGhpcyk7CgogIEBvdmVycmlkZQogIGJvb2wgY2FuVGhyb3coQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uVFlQRV9JTkZPX0VYUFJFU1NJT05fVFlQRUNPREU7CiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gb3RoZXIgaXMgSFR5cGVJbmZvRXhwcmVzc2lvbjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhUeXBlSW5mb0V4cHJlc3Npb24gb3RoZXIpIHsKICAgIHJldHVybiBraW5kID09IG90aGVyLmtpbmQgJiYgZGFydFR5cGUgPT0gb3RoZXIuZGFydFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnSFR5cGVJbmZvRXhwcmVzc2lvbigka2luZEFzU3RyaW5nLCAkZGFydFR5cGUpJzsKCiAgLy8gaWdub3JlOiBNSVNTSU5HX1JFVFVSTgogIFN0cmluZyBnZXQga2luZEFzU3RyaW5nIHsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIFR5cGVJbmZvRXhwcmVzc2lvbktpbmQuQ09NUExFVEU6CiAgICAgICAgcmV0dXJuICdDT01QTEVURSc7CiAgICAgIGNhc2UgVHlwZUluZm9FeHByZXNzaW9uS2luZC5JTlNUQU5DRToKICAgICAgICByZXR1cm4gJ0lOU1RBTkNFJzsKICAgIH0KICB9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy8gSXMtdGVzdCB1c2luZyBSdGkgZm9ybSBvZiB0eXBlIGV4cHJlc3Npb24uCi8vLwovLy8gVGhpcyBpbnN0cnVjdGlvbiBjYW4gYmUgdXNlZCBmb3IgYW55IHR5cGUuIFRlc3RzIGZvciBzaW1wbGUgdHlwZXMgYXJlCi8vLyBsb3dlcmVkIHRvIG90aGVyIGluc3RydWN0aW9ucywgc28gdGhpcyBpbnN0cnVjdGlvbiByZW1haW5zIGZvciB0eXBlcyB0aGF0Ci8vLyBkZXBlbmQgb24gdHlwZSB2YXJpYWJsZXMgYW5kIGNvbXBsZXggdHlwZXMuCmNsYXNzIEhJc1Rlc3QgZXh0ZW5kcyBISW5zdHJ1Y3Rpb24gewogIGZpbmFsIERhcnRUeXBlIGRhcnRUeXBlOwoKICBISXNUZXN0KAogICAgICB0aGlzLmRhcnRUeXBlLCBISW5zdHJ1Y3Rpb24gY2hlY2tlZCwgSEluc3RydWN0aW9uIHJ0aSwgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKFtydGksIGNoZWNrZWRdLCB0eXBlKSB7CiAgICBzZXRVc2VHdm4oKTsKICB9CgogIC8vIFRoZSB0eXBlIGlucHV0IGlzIGZpcnN0IHRvIGZhY2lsaXRhdGUgdGhlIGB0eXBlLmlzKHZhbHVlKWAgY29kZWdlbiBwYXR0ZXJuLgogIEhJbnN0cnVjdGlvbiBnZXQgdHlwZUlucHV0ID0+IGlucHV0c1swXTsKICBISW5zdHJ1Y3Rpb24gZ2V0IGNoZWNrZWRJbnB1dCA9PiBpbnB1dHNbMV07CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0SXNUZXN0KHRoaXMpOwoKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uSVNfVEVTVF9UWVBFQ09ERTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gb3RoZXIgaXMgSElzVGVzdDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJc1Rlc3Qgb3RoZXIpID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdISXNUZXN0KCknOwp9CgovLy8gVHlwZSBjYXN0IG9yIHR5cGUgY2hlY2sgdXNpbmcgUnRpIGZvcm0gb2YgdHlwZSBleHByZXNzaW9uLgpjbGFzcyBIQXNDaGVjayBleHRlbmRzIEhDaGVjayB7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZVdpdGhQcmVjaXNpb24gY2hlY2tlZFR5cGU7CiAgZmluYWwgRGFydFR5cGUgY2hlY2tlZFR5cGVFeHByZXNzaW9uOwogIGZpbmFsIGJvb2wgaXNUeXBlRXJyb3I7CgogIEhBc0NoZWNrKAogICAgICBISW5zdHJ1Y3Rpb24gY2hlY2tlZCwKICAgICAgSEluc3RydWN0aW9uIHJ0aSwKICAgICAgdGhpcy5jaGVja2VkVHlwZSwKICAgICAgdGhpcy5jaGVja2VkVHlwZUV4cHJlc3Npb24sCiAgICAgIHRoaXMuaXNUeXBlRXJyb3IsCiAgICAgIEFic3RyYWN0VmFsdWUgaW5zdHJ1Y3Rpb25UeXBlKQogICAgICA6IGFzc2VydChpc1R5cGVFcnJvciAhPSBudWxsKSwKICAgICAgICBzdXBlcihbcnRpLCBjaGVja2VkXSwgaW5zdHJ1Y3Rpb25UeXBlKTsKCiAgLy8gVGhlIHR5cGUgaW5wdXQgaXMgZmlyc3QgdG8gZmFjaWxpdGF0ZSB0aGUgYHR5cGUuYXModmFsdWUpYCBjb2RlZ2VuIHBhdHRlcm4uCiAgSEluc3RydWN0aW9uIGdldCB0eXBlSW5wdXQgPT4gaW5wdXRzWzBdOwogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBnZXQgY2hlY2tlZElucHV0ID0+IGlucHV0c1sxXTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0pzU3RhdGVtZW50KCkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0QXNDaGVjayh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLkFTX0NIRUNLX1RZUEVDT0RFOwoKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiBvdGhlciBpcyBIQXNDaGVjazsKCiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhBc0NoZWNrIG90aGVyKSB7CiAgICByZXR1cm4gaXNUeXBlRXJyb3IgPT0gb3RoZXIuaXNUeXBlRXJyb3I7CiAgfQoKICBib29sIGlzUmVkdW5kYW50KEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKCFjaGVja2VkVHlwZS5pc1ByZWNpc2UpIHJldHVybiBmYWxzZTsKICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiA9IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CiAgICBBYnN0cmFjdFZhbHVlIGlucHV0VHlwZSA9IGNoZWNrZWRJbnB1dC5pbnN0cnVjdGlvblR5cGU7CiAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgIC5pc0luKGlucHV0VHlwZSwgY2hlY2tlZFR5cGUuYWJzdHJhY3RWYWx1ZSkKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZyBlcnJvciA9IGlzVHlwZUVycm9yID8gJ1R5cGVFcnJvcicgOiAnQ2FzdEVycm9yJzsKICAgIHJldHVybiAnSEFzQ2hlY2soJGVycm9yKSc7CiAgfQp9CgovLy8gVHlwZSBjYXN0IG9yIHR5cGUgY2hlY2sgZm9yIHNpbXBsZSBrbm93biB0eXBlcyB0aGF0IGFyZSBhY2hpZXZlZCB2aWEgYQovLy8gc2ltcGxlIHN0YXRpYyBjYWxsLgpjbGFzcyBIQXNDaGVja1NpbXBsZSBleHRlbmRzIEhDaGVjayB7CiAgZmluYWwgRGFydFR5cGUgZGFydFR5cGU7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZVdpdGhQcmVjaXNpb24gY2hlY2tlZFR5cGU7CiAgZmluYWwgYm9vbCBpc1R5cGVFcnJvcjsKICBmaW5hbCBNZW1iZXJFbnRpdHkgbWV0aG9kOwoKICBIQXNDaGVja1NpbXBsZShISW5zdHJ1Y3Rpb24gY2hlY2tlZCwgdGhpcy5kYXJ0VHlwZSwgdGhpcy5jaGVja2VkVHlwZSwKICAgICAgdGhpcy5pc1R5cGVFcnJvciwgdGhpcy5tZXRob2QsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBhc3NlcnQoaXNUeXBlRXJyb3IgIT0gbnVsbCksCiAgICAgICAgc3VwZXIoW2NoZWNrZWRdLCB0eXBlKTsKCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIGdldCBjaGVja2VkSW5wdXQgPT4gaW5wdXRzWzBdOwoKICBAb3ZlcnJpZGUKICBib29sIGlzSnNTdGF0ZW1lbnQoKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRBc0NoZWNrU2ltcGxlKHRoaXMpOwoKICBib29sIGlzUmVkdW5kYW50KEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKCFjaGVja2VkVHlwZS5pc1ByZWNpc2UpIHJldHVybiBmYWxzZTsKICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiA9IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CiAgICBBYnN0cmFjdFZhbHVlIGlucHV0VHlwZSA9IGNoZWNrZWRJbnB1dC5pbnN0cnVjdGlvblR5cGU7CiAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgIC5pc0luKGlucHV0VHlwZSwgY2hlY2tlZFR5cGUuYWJzdHJhY3RWYWx1ZSkKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5BU19DSEVDS19TSU1QTEVfVFlQRUNPREU7CgogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IG90aGVyIGlzIEhBc0NoZWNrU2ltcGxlOwoKICBAb3ZlcnJpZGUKICBib29sIGRhdGFFcXVhbHMoSEFzQ2hlY2tTaW1wbGUgb3RoZXIpIHsKICAgIHJldHVybiBpc1R5cGVFcnJvciA9PSBvdGhlci5pc1R5cGVFcnJvciAmJiBkYXJ0VHlwZSA9PSBvdGhlci5kYXJ0VHlwZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZyBlcnJvciA9IGlzVHlwZUVycm9yID8gJ1R5cGVFcnJvcicgOiAnQ2FzdEVycm9yJzsKICAgIHJldHVybiAnSEFzQ2hlY2soJGVycm9yKSc7CiAgfQp9CgovLy8gU3VidHlwZSBjaGVjayBjb21wYXJpbmcgdHdvIFJ0aSB0eXBlcy4KY2xhc3MgSFN1YnR5cGVDaGVjayBleHRlbmRzIEhDaGVjayB7CiAgSFN1YnR5cGVDaGVjaygKICAgICAgSEluc3RydWN0aW9uIHN1YnR5cGUsIEhJbnN0cnVjdGlvbiBzdXBlcnR5cGUsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihbc3VidHlwZSwgc3VwZXJ0eXBlXSwgdHlwZSkgewogICAgc2V0VXNlR3ZuKCk7CiAgfQoKICBISW5zdHJ1Y3Rpb24gZ2V0IHR5cGVJbnB1dCA9PiBpbnB1dHNbMV07CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0U3VidHlwZUNoZWNrKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uU1VCVFlQRV9DSEVDS19UWVBFQ09ERTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB0eXBlRXF1YWxzKEhJbnN0cnVjdGlvbiBvdGhlcikgPT4gb3RoZXIgaXMgSFN1YnR5cGVDaGVjazsKCiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhTdWJ0eXBlQ2hlY2sgb3RoZXIpID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdIU3VidHlwZUNoZWNrKCknOwp9CgovLy8gQ29tbW9uIHN1cGVyY2xhc3MgZm9yIGluc3RydWN0aW9ucyB0aGF0IGdlbmVyYXRlIFJ0aSB2YWx1ZXMuCmFic3RyYWN0IGNsYXNzIEhSdGlJbnN0cnVjdGlvbiBleHRlbmRzIEhJbnN0cnVjdGlvbiB7CiAgSFJ0aUluc3RydWN0aW9uKExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihpbnB1dHMsIHR5cGUpOwp9CgovLy8gRXZhbHVhdGVzIGFuIFJ0aSB0eXBlIHJlY2lwZSBpbiB0aGUgZ2xvYmFsIGVudmlyb25tZW50LgpjbGFzcyBITG9hZFR5cGUgZXh0ZW5kcyBIUnRpSW5zdHJ1Y3Rpb24gewogIERhcnRUeXBlIHR5cGVFeHByZXNzaW9uOyAvLyBUT0RPKHNyYSk6IEFsbG93IGEgdHlwZSBlbnZpcm9ubWVudCBleHByZXNzaW9uLgoKICBITG9hZFR5cGUodGhpcy50eXBlRXhwcmVzc2lvbiwgQWJzdHJhY3RWYWx1ZSB0eXBlKSA6IHN1cGVyKFtdLCB0eXBlKSB7CiAgICBzZXRVc2VHdm4oKTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0TG9hZFR5cGUodGhpcyk7CgogIEBvdmVycmlkZQogIGludCB0eXBlQ29kZSgpID0+IEhJbnN0cnVjdGlvbi5MT0FEX1RZUEVfVFlQRUNPREU7CgogIEBvdmVycmlkZQogIGJvb2wgdHlwZUVxdWFscyhISW5zdHJ1Y3Rpb24gb3RoZXIpID0+IG90aGVyIGlzIEhMb2FkVHlwZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhMb2FkVHlwZSBvdGhlcikgewogICAgcmV0dXJuIHR5cGVFeHByZXNzaW9uID09IG90aGVyLnR5cGVFeHByZXNzaW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0hMb2FkVHlwZSgkdHlwZUV4cHJlc3Npb24pJzsKfQoKLy8vIFRoZSByZWlmaWVkIFJ0aSBlbnZpcm9ubWVudCBzdG9yZWQgb24gYSBjbGFzcyBpbnN0YW5jZS4KLy8vCi8vLyBDbGFzc2VzIHdpdGggcmVpZmllZCB0eXBlIGFyZ3VtZW50cyBoYXZlIHRoZSB0eXBlIGVudmlyb25tZW50IHN0b3JlZCBvbiB0aGUKLy8vIGluc3RhbmNlLiBUaGUgcmVpZmllZCBlbnZpcm9ubWVudCBpcyB0eXBpY2FsbHkgc3RvcmVkIGFzIHRoZSBpbnN0YW5jZSB0eXBlLAovLy8gZS5nLiAiVW5tb2RpZmlhYmxlTGlzdFZpZXc8aW50PiIuCmNsYXNzIEhJbnN0YW5jZUVudmlyb25tZW50IGV4dGVuZHMgSFJ0aUluc3RydWN0aW9uIHsKICBISW5zdGFuY2VFbnZpcm9ubWVudChISW5zdHJ1Y3Rpb24gaW5zdGFuY2UsIEFic3RyYWN0VmFsdWUgdHlwZSkKICAgICAgOiBzdXBlcihbaW5zdGFuY2VdLCB0eXBlKSB7CiAgICBzZXRVc2VHdm4oKTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChIVmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0SW5zdGFuY2VFbnZpcm9ubWVudCh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSEluc3RydWN0aW9uLklOU1RBTkNFX0VOVklST05NRU5UX1RZUEVDT0RFOwoKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiBvdGhlciBpcyBISW5zdGFuY2VFbnZpcm9ubWVudDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBkYXRhRXF1YWxzKEhJbnN0YW5jZUVudmlyb25tZW50IG90aGVyKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnSEluc3RhbmNlRW52aXJvbm1lbnQoKSc7Cn0KCi8vLyBFdmFsdWF0ZXMgYW4gUnRpIHR5cGUgcmVjaXBlIGluIGFuIFJ0aSBlbnZpcm9ubWVudC4KY2xhc3MgSFR5cGVFdmFsIGV4dGVuZHMgSFJ0aUluc3RydWN0aW9uIHsKICBUeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUgZW52U3RydWN0dXJlOwogIFR5cGVSZWNpcGUgdHlwZUV4cHJlc3Npb247CgogIEhUeXBlRXZhbChISW5zdHJ1Y3Rpb24gZW52aXJvbm1lbnQsIHRoaXMuZW52U3RydWN0dXJlLCB0aGlzLnR5cGVFeHByZXNzaW9uLAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUpCiAgICAgIDogc3VwZXIoW2Vudmlyb25tZW50XSwgdHlwZSkgewogICAgc2V0VXNlR3ZuKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoSFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFR5cGVFdmFsKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBpbnQgdHlwZUNvZGUoKSA9PiBISW5zdHJ1Y3Rpb24uVFlQRV9FVkFMX1RZUEVDT0RFOwoKICBAb3ZlcnJpZGUKICBib29sIHR5cGVFcXVhbHMoSEluc3RydWN0aW9uIG90aGVyKSA9PiBvdGhlciBpcyBIVHlwZUV2YWw7CgogIEBvdmVycmlkZQogIGJvb2wgZGF0YUVxdWFscyhIVHlwZUV2YWwgb3RoZXIpIHsKICAgIHJldHVybiBUeXBlUmVjaXBlLnlpZWxkc1NhbWVUeXBlKAogICAgICAgIHR5cGVFeHByZXNzaW9uLCBlbnZTdHJ1Y3R1cmUsIG90aGVyLnR5cGVFeHByZXNzaW9uLCBvdGhlci5lbnZTdHJ1Y3R1cmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0hUeXBlRXZhbCgkdHlwZUV4cHJlc3Npb24pJzsKfQoKLy8vIEV4dGVuZHMgYW4gUnRpIHR5cGUgZW52aXJvbm1lbnQgd2l0aCBnZW5lcmljIGZ1bmN0aW9uIHR5cGVzLgpjbGFzcyBIVHlwZUJpbmQgZXh0ZW5kcyBIUnRpSW5zdHJ1Y3Rpb24gewogIEhUeXBlQmluZCgKICAgICAgSEluc3RydWN0aW9uIGVudmlyb25tZW50LCBISW5zdHJ1Y3Rpb24gdHlwZUFyZ3VtZW50cywgQWJzdHJhY3RWYWx1ZSB0eXBlKQogICAgICA6IHN1cGVyKFtlbnZpcm9ubWVudCwgdHlwZUFyZ3VtZW50c10sIHR5cGUpIHsKICAgIHNldFVzZUd2bigpOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KEhWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRUeXBlQmluZCh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgaW50IHR5cGVDb2RlKCkgPT4gSElu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cG9ydCAnLi4va2VybmVsL2ludm9jYXRpb25fbWlycm9yX2NvbnN0YW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgSGFzaGluZzsKaW1wb3J0ICdjYWxsX3N0cnVjdHVyZS5kYXJ0JyBzaG93IENhbGxTdHJ1Y3R1cmU7CgpjbGFzcyBTZWxlY3RvcktpbmQgewogIGZpbmFsIFN0cmluZyBuYW1lOwogIEBvdmVycmlkZQogIGZpbmFsIGludCBoYXNoQ29kZTsKICBjb25zdCBTZWxlY3RvcktpbmQodGhpcy5uYW1lLCB0aGlzLmhhc2hDb2RlKTsKCiAgc3RhdGljIGNvbnN0IFNlbGVjdG9yS2luZCBHRVRURVIgPSBjb25zdCBTZWxlY3RvcktpbmQoJ2dldHRlcicsIDApOwogIHN0YXRpYyBjb25zdCBTZWxlY3RvcktpbmQgU0VUVEVSID0gY29uc3QgU2VsZWN0b3JLaW5kKCdzZXR0ZXInLCAxKTsKICBzdGF0aWMgY29uc3QgU2VsZWN0b3JLaW5kIENBTEwgPSBjb25zdCBTZWxlY3RvcktpbmQoJ2NhbGwnLCAyKTsKICBzdGF0aWMgY29uc3QgU2VsZWN0b3JLaW5kIE9QRVJBVE9SID0gY29uc3QgU2VsZWN0b3JLaW5kKCdvcGVyYXRvcicsIDMpOwogIHN0YXRpYyBjb25zdCBTZWxlY3RvcktpbmQgSU5ERVggPSBjb25zdCBTZWxlY3RvcktpbmQoJ2luZGV4JywgNCk7CiAgc3RhdGljIGNvbnN0IFNlbGVjdG9yS2luZCBTUEVDSUFMID0gY29uc3QgU2VsZWN0b3JLaW5kKCdzcGVjaWFsJywgNSk7CgogIGludCBnZXQgaW5kZXggPT4gaGFzaENvZGU7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7CgogIHN0YXRpYyBMaXN0PFNlbGVjdG9yS2luZD4gdmFsdWVzID0gY29uc3QgPFNlbGVjdG9yS2luZD5bCiAgICBHRVRURVIsCiAgICBTRVRURVIsCiAgICBDQUxMLAogICAgT1BFUkFUT1IsCiAgICBJTkRFWCwKICAgIFNQRUNJQUwKICBdOwp9CgpjbGFzcyBTZWxlY3RvciB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtTZWxlY3Rvcl0gb2JqZWN0cyBpbiBhIGRlYnVnZ2luZwogIC8vLyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdzZWxlY3Rvcic7CgogIGZpbmFsIFNlbGVjdG9yS2luZCBraW5kOwogIGZpbmFsIE5hbWUgbWVtYmVyTmFtZTsKICBmaW5hbCBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmU7CgogIEBvdmVycmlkZQogIGZpbmFsIGludCBoYXNoQ29kZTsKCiAgaW50IGdldCBhcmd1bWVudENvdW50ID0+IGNhbGxTdHJ1Y3R1cmUuYXJndW1lbnRDb3VudDsKICBpbnQgZ2V0IG5hbWVkQXJndW1lbnRDb3VudCA9PiBjYWxsU3RydWN0dXJlLm5hbWVkQXJndW1lbnRDb3VudDsKICBpbnQgZ2V0IHBvc2l0aW9uYWxBcmd1bWVudENvdW50ID0+IGNhbGxTdHJ1Y3R1cmUucG9zaXRpb25hbEFyZ3VtZW50Q291bnQ7CiAgaW50IGdldCB0eXBlQXJndW1lbnRDb3VudCA9PiBjYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudENvdW50OwogIExpc3Q8U3RyaW5nPiBnZXQgbmFtZWRBcmd1bWVudHMgPT4gY2FsbFN0cnVjdHVyZS5uYW1lZEFyZ3VtZW50czsKCiAgU3RyaW5nIGdldCBuYW1lID0+IG1lbWJlck5hbWUudGV4dDsKCiAgTGlicmFyeUVudGl0eSBnZXQgbGlicmFyeSA9PiBtZW1iZXJOYW1lLmxpYnJhcnk7CgogIHN0YXRpYyBib29sIGlzT3BlcmF0b3JOYW1lKFN0cmluZyBuYW1lKSB7CiAgICBpZiAobmFtZSA9PSBOYW1lcy5JTkRFWF9TRVRfTkFNRS50ZXh0KSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChuYW1lID09IFVuYXJ5T3BlcmF0b3IuTkVHQVRFLnNlbGVjdG9yTmFtZSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSBVbmFyeU9wZXJhdG9yLkNPTVBMRU1FTlQuc2VsZWN0b3JOYW1lKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yLnBhcnNlVXNlckRlZmluYWJsZShuYW1lKSAhPSBudWxsOwogICAgfQogIH0KCiAgU2VsZWN0b3IuaW50ZXJuYWwoCiAgICAgIHRoaXMua2luZCwgdGhpcy5tZW1iZXJOYW1lLCB0aGlzLmNhbGxTdHJ1Y3R1cmUsIHRoaXMuaGFzaENvZGUpIHsKICAgIGFzc2VydCgKICAgICAgICBraW5kID09IFNlbGVjdG9yS2luZC5JTkRFWCB8fAogICAgICAgICAgICAobWVtYmVyTmFtZSAhPSBOYW1lcy5JTkRFWF9OQU1FICYmCiAgICAgICAgICAgICAgICBtZW1iZXJOYW1lICE9IE5hbWVzLklOREVYX1NFVF9OQU1FKSwKICAgICAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAgICJraW5kPSRraW5kLG1lbWJlck5hbWU9JG1lbWJlck5hbWUsY2FsbFN0cnVjdHVyZTokY2FsbFN0cnVjdHVyZSIpKTsKICAgIGFzc2VydCgKICAgICAgICBraW5kID09IFNlbGVjdG9yS2luZC5PUEVSQVRPUiB8fAogICAgICAgICAgICBraW5kID09IFNlbGVjdG9yS2luZC5JTkRFWCB8fAogICAgICAgICAgICAhaXNPcGVyYXRvck5hbWUobWVtYmVyTmFtZS50ZXh0KSB8fAogICAgICAgICAgICBtZW1iZXJOYW1lLnRleHQgPT0gJz8/JywKICAgICAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAgICJraW5kPSRraW5kLG1lbWJlck5hbWU9JG1lbWJlck5hbWUsY2FsbFN0cnVjdHVyZTokY2FsbFN0cnVjdHVyZSIpKTsKICAgIGFzc2VydCgKICAgICAgICBraW5kID09IFNlbGVjdG9yS2luZC5DQUxMIHx8CiAgICAgICAgICAgIGtpbmQgPT0gU2VsZWN0b3JLaW5kLkdFVFRFUiB8fAogICAgICAgICAgICBraW5kID09IFNlbGVjdG9yS2luZC5TRVRURVIgfHwKICAgICAgICAgICAgaXNPcGVyYXRvck5hbWUobWVtYmVyTmFtZS50ZXh0KSB8fAogICAgICAgICAgICBtZW1iZXJOYW1lLnRleHQgPT0gJz8/JywKICAgICAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAgICJraW5kPSRraW5kLG1lbWJlck5hbWU9JG1lbWJlck5hbWUsY2FsbFN0cnVjdHVyZTokY2FsbFN0cnVjdHVyZSIpKTsKICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEV4dHJhY3QgY2FjaGluZy4KICBzdGF0aWMgTWFwPGludCwgTGlzdDxTZWxlY3Rvcj4+IGNhbm9uaWNhbGl6ZWRWYWx1ZXMgPQogICAgICBuZXcgTWFwPGludCwgTGlzdDxTZWxlY3Rvcj4+KCk7CgogIGZhY3RvcnkgU2VsZWN0b3IoU2VsZWN0b3JLaW5kIGtpbmQsIE5hbWUgbmFtZSwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYXliZSB1c2UgZXF1YWxpdHkgaW5zdGVhZCBvZiBpbXBsaWNpdCBoYXNoaW5nLgogICAgaW50IGhhc2hDb2RlID0gY29tcHV0ZUhhc2hDb2RlKGtpbmQsIG5hbWUsIGNhbGxTdHJ1Y3R1cmUpOwogICAgTGlzdDxTZWxlY3Rvcj4gbGlzdCA9CiAgICAgICAgY2Fub25pY2FsaXplZFZhbHVlcy5wdXRJZkFic2VudChoYXNoQ29kZSwgKCkgPT4gPFNlbGVjdG9yPltdKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICBTZWxlY3RvciBleGlzdGluZyA9IGxpc3RbaV07CiAgICAgIGlmIChleGlzdGluZy5tYXRjaChraW5kLCBuYW1lLCBjYWxsU3RydWN0dXJlKSkgewogICAgICAgIGFzc2VydChleGlzdGluZy5oYXNoQ29kZSA9PSBoYXNoQ29kZSk7CiAgICAgICAgcmV0dXJuIGV4aXN0aW5nOwogICAgICB9CiAgICB9CiAgICBTZWxlY3RvciByZXN1bHQgPQogICAgICAgIG5ldyBTZWxlY3Rvci5pbnRlcm5hbChraW5kLCBuYW1lLCBjYWxsU3RydWN0dXJlLCBoYXNoQ29kZSk7CiAgICBsaXN0LmFkZChyZXN1bHQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGZhY3RvcnkgU2VsZWN0b3IuZnJvbUVsZW1lbnQoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIE5hbWUgbmFtZSA9IGVsZW1lbnQubWVtYmVyTmFtZTsKICAgIGlmIChlbGVtZW50LmlzRnVuY3Rpb24pIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24gPSBlbGVtZW50OwogICAgICBpZiAobmFtZSA9PSBOYW1lcy5JTkRFWF9OQU1FKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rvci5pbmRleCgpOwogICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gTmFtZXMuSU5ERVhfU0VUX05BTUUpIHsKICAgICAgICByZXR1cm4gbmV3IFNlbGVjdG9yLmluZGV4U2V0KCk7CiAgICAgIH0KICAgICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlLmNhbGxTdHJ1Y3R1cmU7CiAgICAgIGlmIChpc09wZXJhdG9yTmFtZShlbGVtZW50Lm5hbWUpKSB7CiAgICAgICAgLy8gT3BlcmF0b3JzIGNhbm5vdCBoYXZlIG5hbWVkIGFyZ3VtZW50cywgaG93ZXZlciwgdGhhdCBkb2Vzbid0IHByZXZlbnQKICAgICAgICAvLyBhIHVzZXIgZnJvbSBkZWNsYXJpbmcgc3VjaCBhbiBvcGVyYXRvci4KICAgICAgICByZXR1cm4gbmV3IFNlbGVjdG9yKFNlbGVjdG9yS2luZC5PUEVSQVRPUiwgbmFtZSwgY2FsbFN0cnVjdHVyZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rvci5jYWxsKG5hbWUsIGNhbGxTdHJ1Y3R1cmUpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaXNTZXR0ZXIpIHsKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rvci5zZXR0ZXIobmFtZSk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaXNHZXR0ZXIpIHsKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rvci5nZXR0ZXIobmFtZSk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaXNGaWVsZCkgewogICAgICByZXR1cm4gbmV3IFNlbGVjdG9yLmdldHRlcihuYW1lKTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc0NvbnN0cnVjdG9yKSB7CiAgICAgIHJldHVybiBuZXcgU2VsZWN0b3IuY2FsbENvbnN0cnVjdG9yKG5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgZmFpbGVkQXQoZWxlbWVudCwgIkNhbid0IGdldCBzZWxlY3RvciBmcm9tICRlbGVtZW50Iik7CiAgICB9CiAgfQoKICBmYWN0b3J5IFNlbGVjdG9yLmdldHRlcihOYW1lIG5hbWUpID0+CiAgICAgIG5ldyBTZWxlY3RvcihTZWxlY3RvcktpbmQuR0VUVEVSLCBuYW1lLmdldHRlciwgQ2FsbFN0cnVjdHVyZS5OT19BUkdTKTsKCiAgZmFjdG9yeSBTZWxlY3Rvci5zZXR0ZXIoTmFtZSBuYW1lKSA9PgogICAgICBuZXcgU2VsZWN0b3IoU2VsZWN0b3JLaW5kLlNFVFRFUiwgbmFtZS5zZXR0ZXIsIENhbGxTdHJ1Y3R1cmUuT05FX0FSRyk7CgogIGZhY3RvcnkgU2VsZWN0b3IudW5hcnlPcGVyYXRvcihTdHJpbmcgbmFtZSkgPT4gbmV3IFNlbGVjdG9yKAogICAgICBTZWxlY3RvcktpbmQuT1BFUkFUT1IsCiAgICAgIG5ldyBQdWJsaWNOYW1lKHV0aWxzLmNvbnN0cnVjdE9wZXJhdG9yTmFtZShuYW1lLCB0cnVlKSksCiAgICAgIENhbGxTdHJ1Y3R1cmUuTk9fQVJHUyk7CgogIGZhY3RvcnkgU2VsZWN0b3IuYmluYXJ5T3BlcmF0b3IoU3RyaW5nIG5hbWUpID0+IG5ldyBTZWxlY3RvcigKICAgICAgU2VsZWN0b3JLaW5kLk9QRVJBVE9SLAogICAgICBuZXcgUHVibGljTmFtZSh1dGlscy5jb25zdHJ1Y3RPcGVyYXRvck5hbWUobmFtZSwgZmFsc2UpKSwKICAgICAgQ2FsbFN0cnVjdHVyZS5PTkVfQVJHKTsKCiAgZmFjdG9yeSBTZWxlY3Rvci5pbmRleCgpID0+CiAgICAgIG5ldyBTZWxlY3RvcihTZWxlY3RvcktpbmQuSU5ERVgsIE5hbWVzLklOREVYX05BTUUsIENhbGxTdHJ1Y3R1cmUuT05FX0FSRyk7CgogIGZhY3RvcnkgU2VsZWN0b3IuaW5kZXhTZXQoKSA9PiBuZXcgU2VsZWN0b3IoCiAgICAgIFNlbGVjdG9yS2luZC5JTkRFWCwgTmFtZXMuSU5ERVhfU0VUX05BTUUsIENhbGxTdHJ1Y3R1cmUuVFdPX0FSR1MpOwoKICBmYWN0b3J5IFNlbGVjdG9yLmNhbGwoTmFtZSBuYW1lLCBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUpID0+CiAgICAgIG5ldyBTZWxlY3RvcihTZWxlY3RvcktpbmQuQ0FMTCwgbmFtZSwgY2FsbFN0cnVjdHVyZSk7CgogIGZhY3RvcnkgU2VsZWN0b3IuY2FsbENsb3N1cmUoaW50IGFyaXR5LAogICAgICAgICAgW0xpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywgaW50IHR5cGVBcmd1bWVudENvdW50ID0gMF0pID0+CiAgICAgIG5ldyBTZWxlY3RvcihTZWxlY3RvcktpbmQuQ0FMTCwgTmFtZXMuY2FsbCwKICAgICAgICAgIG5ldyBDYWxsU3RydWN0dXJlKGFyaXR5LCBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50Q291bnQpKTsKCiAgZmFjdG9yeSBTZWxlY3Rvci5jYWxsQ2xvc3VyZUZyb20oU2VsZWN0b3Igc2VsZWN0b3IpID0+CiAgICAgIG5ldyBTZWxlY3RvcihTZWxlY3RvcktpbmQuQ0FMTCwgTmFtZXMuY2FsbCwgc2VsZWN0b3IuY2FsbFN0cnVjdHVyZSk7CgogIGZhY3RvcnkgU2VsZWN0b3IuY2FsbENvbnN0cnVjdG9yKE5hbWUgbmFtZSwKICAgICAgICAgIFtpbnQgYXJpdHkgPSAwLCBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHNdKSA9PgogICAgICBuZXcgU2VsZWN0b3IoCiAgICAgICAgICBTZWxlY3RvcktpbmQuQ0FMTCwgbmFtZSwgbmV3IENhbGxTdHJ1Y3R1cmUoYXJpdHksIG5hbWVkQXJndW1lbnRzKSk7CgogIGZhY3RvcnkgU2VsZWN0b3IuY2FsbERlZmF1bHRDb25zdHJ1Y3RvcigpID0+IG5ldyBTZWxlY3RvcigKICAgICAgU2VsZWN0b3JLaW5kLkNBTEwsIGNvbnN0IFB1YmxpY05hbWUoJycpLCBDYWxsU3RydWN0dXJlLk5PX0FSR1MpOwoKICAvLyBUT0RPKDMxOTUzKTogUmVtb3ZlIHRoaXMgaWYgd2UgY2FuIGltcGxlbWVudCB2aWEgc3RhdGljIGNhbGxzLgogIGZhY3RvcnkgU2VsZWN0b3IuZ2VuZXJpY0luc3RhbnRpYXRpb24oaW50IHR5cGVBcmd1bWVudHMpID0+IG5ldyBTZWxlY3RvcigKICAgICAgU2VsZWN0b3JLaW5kLlNQRUNJQUwsCiAgICAgIE5hbWVzLmdlbmVyaWNJbnN0YW50aWF0aW9uLAogICAgICBuZXcgQ2FsbFN0cnVjdHVyZSgwLCBudWxsLCB0eXBlQXJndW1lbnRzKSk7CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbU2VsZWN0b3JdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgU2VsZWN0b3IucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIFNlbGVjdG9yS2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKFNlbGVjdG9yS2luZC52YWx1ZXMpOwogICAgYm9vbCBpc1NldHRlciA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5ID0gc291cmNlLnJlYWRMaWJyYXJ5T3JOdWxsKCk7CiAgICBTdHJpbmcgdGV4dCA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUgPSBuZXcgQ2FsbFN0cnVjdHVyZS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgU2VsZWN0b3IoCiAgICAgICAga2luZCwgbmV3IE5hbWUodGV4dCwgbGlicmFyeSwgaXNTZXR0ZXI6IGlzU2V0dGVyKSwgY2FsbFN0cnVjdHVyZSk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtTZWxlY3Rvcl0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVFbnVtKGtpbmQpOwogICAgc2luay53cml0ZUJvb2wobWVtYmVyTmFtZS5pc1NldHRlcik7CiAgICBzaW5rLndyaXRlTGlicmFyeU9yTnVsbChtZW1iZXJOYW1lLmxpYnJhcnkpOwogICAgc2luay53cml0ZVN0cmluZyhtZW1iZXJOYW1lLnRleHQpOwogICAgY2FsbFN0cnVjdHVyZS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgYm9vbCBnZXQgaXNHZXR0ZXIgPT4ga2luZCA9PSBTZWxlY3RvcktpbmQuR0VUVEVSOwogIGJvb2wgZ2V0IGlzU2V0dGVyID0+IGtpbmQgPT0gU2VsZWN0b3JLaW5kLlNFVFRFUjsKICBib29sIGdldCBpc0NhbGwgPT4ga2luZCA9PSBTZWxlY3RvcktpbmQuQ0FMTDsKICBib29sIGdldCBpc0Nsb3N1cmVDYWxsID0+IGlzQ2FsbCAmJiBtZW1iZXJOYW1lID09IE5hbWVzLkNBTExfTkFNRTsKCiAgYm9vbCBnZXQgaXNJbmRleCA9PiBraW5kID09IFNlbGVjdG9yS2luZC5JTkRFWCAmJiBhcmd1bWVudENvdW50ID09IDE7CiAgYm9vbCBnZXQgaXNJbmRleFNldCA9PiBraW5kID09IFNlbGVjdG9yS2luZC5JTkRFWCAmJiBhcmd1bWVudENvdW50ID09IDI7CgogIGJvb2wgZ2V0IGlzT3BlcmF0b3IgPT4ga2luZCA9PSBTZWxlY3RvcktpbmQuT1BFUkFUT1I7CiAgYm9vbCBnZXQgaXNVbmFyeU9wZXJhdG9yID0+IGlzT3BlcmF0b3IgJiYgYXJndW1lbnRDb3VudCA9PSAwOwoKICAvLy8gVGhlIG1lbWJlciBuYW1lIGZvciBpbnZvY2F0aW9uIG1pcnJvcnMgY3JlYXRlZCBmcm9tIHRoaXMgc2VsZWN0b3IuCiAgU3RyaW5nIGdldCBpbnZvY2F0aW9uTWlycm9yTWVtYmVyTmFtZSA9PiBpc1NldHRlciA/ICckbmFtZT0nIDogbmFtZTsKCiAgaW50IGdldCBpbnZvY2F0aW9uTWlycm9yS2luZCB7CiAgICBpbnQga2luZCA9IGludm9jYXRpb25NaXJyb3JNZXRob2RLaW5kOwogICAgaWYgKGlzR2V0dGVyKSB7CiAgICAgIGtpbmQgPSBpbnZvY2F0aW9uTWlycm9yR2V0dGVyS2luZDsKICAgIH0gZWxzZSBpZiAoaXNTZXR0ZXIpIHsKICAgICAga2luZCA9IGludm9jYXRpb25NaXJyb3JTZXR0ZXJLaW5kOwogICAgfQogICAgcmV0dXJuIGtpbmQ7CiAgfQoKICBib29sIGFwcGxpZXNVbm5hbWVkKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQobmFtZSA9PSBlbGVtZW50Lm5hbWUpOwogICAgaWYgKG1lbWJlck5hbWUuaXNQcml2YXRlICYmIG1lbWJlck5hbWUubGlicmFyeSAhPSBlbGVtZW50LmxpYnJhcnkpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWF5YmUgdGhpcyBzaG91bGQgYmUKICAgICAgLy8gYG1lbWJlck5hbWUgIT0gZWxlbWVudC5tZW1iZXJOYW1lYC4KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGVsZW1lbnQuaXNTZXR0ZXIpIHJldHVybiBpc1NldHRlcjsKICAgIGlmIChlbGVtZW50LmlzR2V0dGVyKSByZXR1cm4gaXNHZXR0ZXIgfHwgaXNDYWxsOwogICAgaWYgKGVsZW1lbnQuaXNGaWVsZCkgewogICAgICByZXR1cm4gaXNTZXR0ZXIgPyBlbGVtZW50LmlzQXNzaWduYWJsZSA6IGlzR2V0dGVyIHx8IGlzQ2FsbDsKICAgIH0KICAgIGlmIChpc0dldHRlcikgcmV0dXJuIHRydWU7CiAgICBpZiAoaXNTZXR0ZXIpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBzaWduYXR1cmVBcHBsaWVzKGVsZW1lbnQpOwogIH0KCiAgLy8vIFdoZXRoZXIgW3RoaXNdIGNvdWxkIGJlIGEgdmFsaWQgc2VsZWN0b3Igb24gYE51bGxgIHdpdGhvdXQgdGhyb3dpbmcuCiAgYm9vbCBhcHBsaWVzVG9OdWxsV2l0aG91dFRocm93KCkgewogICAgdmFyIG5hbWUgPSB0aGlzLm5hbWU7CiAgICBpZiAoaXNPcGVyYXRvciAmJiBuYW1lID09ICI9PSIpIHJldHVybiB0cnVlOwogICAgLy8gS25vd24gZ2V0dGVycyBhbmQgdmFsaWQgdGVhci1vZmZzLgogICAgaWYgKGlzR2V0dGVyICYmCiAgICAgICAgKG5hbWUgPT0gImhhc2hDb2RlIiB8fAogICAgICAgICAgICBuYW1lID09ICJydW50aW1lVHlwZSIgfHwKICAgICAgICAgICAgbmFtZSA9PSAidG9TdHJpbmciIHx8CiAgICAgICAgICAgIG5hbWUgPT0gIm5vU3VjaE1ldGhvZCIpKSByZXR1cm4gdHJ1ZTsKICAgIC8vIENhbGxpbmcgdG9TdHJpbmcgYWx3YXlzIHN1Y2NlZWRzLCBjYWxscyB0byBgbm9TdWNoTWV0aG9kYCAoZXZlbiB3ZWxsCiAgICAvLyBmb3JtZWQgY2FsbHMpIGFsd2F5cyB0aHJvdy4KICAgIGlmIChpc0NhbGwgJiYKICAgICAgICBuYW1lID09ICJ0b1N0cmluZyIgJiYKICAgICAgICBwb3NpdGlvbmFsQXJndW1lbnRDb3VudCA9PSAwICYmCiAgICAgICAgbmFtZWRBcmd1bWVudENvdW50ID09IDApIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIHNpZ25hdHVyZUFwcGxpZXMoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgIHJldHVybiBjYWxsU3RydWN0dXJlLnNpZ25hdHVyZUFwcGxpZXMoZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlKTsKICB9CgogIGJvb2wgYXBwbGllcyhNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKG5hbWUgIT0gZWxlbWVudC5uYW1lKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gYXBwbGllc1VubmFtZWQoZWxlbWVudCk7CiAgfQoKICBib29sIG1hdGNoKFNlbGVjdG9yS2luZCBraW5kLCBOYW1lIG1lbWJlck5hbWUsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgewogICAgcmV0dXJuIHRoaXMua2luZCA9PSBraW5kICYmCiAgICAgICAgdGhpcy5tZW1iZXJOYW1lID09IG1lbWJlck5hbWUgJiYKICAgICAgICB0aGlzLmNhbGxTdHJ1Y3R1cmUubWF0Y2goY2FsbFN0cnVjdHVyZSk7CiAgfQoKICBzdGF0aWMgaW50IGNvbXB1dGVIYXNoQ29kZSgKICAgICAgU2VsZWN0b3JLaW5kIGtpbmQsIE5hbWUgbmFtZSwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICAvLyBBZGQgYml0cyBmcm9tIG5hbWUgYW5kIGtpbmQuCiAgICBpbnQgaGFzaCA9IEhhc2hpbmcubWl4SGFzaENvZGVCaXRzKG5hbWUuaGFzaENvZGUsIGtpbmQuaGFzaENvZGUpOwogICAgLy8gQWRkIGJpdHMgZnJvbSB0aGUgY2FsbCBzdHJ1Y3R1cmUuCiAgICByZXR1cm4gSGFzaGluZy5taXhIYXNoQ29kZUJpdHMoaGFzaCwgY2FsbFN0cnVjdHVyZS5oYXNoQ29kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ1NlbGVjdG9yKCRraW5kLCAkbmFtZSwgJHtjYWxsU3RydWN0dXJlLnN0cnVjdHVyZVRvU3RyaW5nKCl9KSc7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoaXMgc2VsZWN0b3IuCiAgLy8vCiAgLy8vIEEgc2VsZWN0b3IgaXMgbm9ybWFsaXplZCBpZiBpdHMgY2FsbCBzdHJ1Y3R1cmUgaXMgbm9ybWFsaXplZC4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2Ugbm9ybWFsaXplZCBzZWxlY3RvcnMgYXMgbXVjaCBhcyBwb3NzaWJsZSwKICAvLyBlc3BlY2lhbGx5IHdoZXJlIHNlbGVjdG9ycyBhcmUgdXNlZCBpbiBzZXRzIG9yIGFzIGtleXMgaW4gbWFwcy4KICBTZWxlY3RvciB0b05vcm1hbGl6ZWQoKSA9PiBjYWxsU3RydWN0dXJlLmlzTm9ybWFsaXplZAogICAgICA/IHRoaXMKICAgICAgOiBuZXcgU2VsZWN0b3Ioa2luZCwgbWVtYmVyTmFtZSwgY2FsbFN0cnVjdHVyZS50b05vcm1hbGl6ZWQoKSk7CgogIFNlbGVjdG9yIHRvQ2FsbFNlbGVjdG9yKCkgPT4gbmV3IFNlbGVjdG9yLmNhbGxDbG9zdXJlRnJvbSh0aGlzKTsKCiAgLy8vIFJldHVybnMgdGhlIG5vbi1nZW5lcmljIFtTZWxlY3Rvcl0gY29ycmVzcG9uZGluZyB0byB0aGlzIHNlbGVjdG9yLgogIFNlbGVjdG9yIHRvTm9uR2VuZXJpYygpIHsKICAgIHJldHVybiBjYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudENvdW50ID4gMAogICAgICAgID8gbmV3IFNlbGVjdG9yKGtpbmQsIG1lbWJlck5hbWUsIGNhbGxTdHJ1Y3R1cmUubm9uR2VuZXJpYykKICAgICAgICA6IHRoaXM7CiAgfQp9CoFRAE5OPAEaARkqJDEhJTUuKTEBFRUMFjABRkZCSkRIAR0BDB0BOwwMCg4LDAUCARFMEygBGxklAQwWAThCTEBDASYBMwEsLRM8E0ATDT4GBAEVRwwmLzUoUAwpKjAlKFAMJSsrLyUoUAQBKzgmAVBMPxpHLCM3LxkIBhZEFhMEATckHikmJTEoCE8qUDNJDzcIIygjKCIoKDENQwYEAShNAShNAT8dPx4BQB1AHgEeUQEvSQFDPAEqRzJIATlLAS47FE4BPUcBREwcIjIBNjsXPic4J1AVGUsEASwoFRopMScpEwQBNDQwRQFISwE4QAFJRwEhKxQpGykGEQQBLiJJMy0UBis1G0MGHyAmBAFLJRoxKhQfJSIyTCMSHigjEwYSBAEzSAQBJywkBAFQICkxBAEeQyRGKUIEAQwWSwQBNwZESEU4DUYBQwFJHC9DEAQCAStwYWNrYWdlOmNvbXBpbGVyL3NyYy91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0QXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3VuaXZlcnNlL2NvZGVnZW5fd29ybGRfYnVpbGRlci5kYXJ0wAB7xi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCcgc2hvdyBJZGVudGlmaWVyczsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ludGVyY2VwdG9yX2RhdGEuZGFydCcgc2hvdyBPbmVTaG90SW50ZXJjZXB0b3JEYXRhOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCcgc2hvdyBOYXRpdmVCYXNpY0RhdGE7CmltcG9ydCAnLi4vanNfbW9kZWwvZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vdXRpbC9lbnVtc2V0LmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JzsKaW1wb3J0ICdjYWxsX3N0cnVjdHVyZS5kYXJ0JzsKaW1wb3J0ICdtZW1iZXJfdXNhZ2UuZGFydCc7CmltcG9ydCAnc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICd1c2UuZGFydCcKICAgIHNob3cgQ29uc3RhbnRVc2UsIER5bmFtaWNVc2UsIER5bmFtaWNVc2VLaW5kLCBTdGF0aWNVc2UsIFN0YXRpY1VzZUtpbmQ7CmltcG9ydCAnd29ybGRfYnVpbGRlci5kYXJ0JzsKCi8vLyBXb3JsZCBidWlsZGVyIHNwZWNpZmljIHRvIGNvZGVnZW4uCi8vLwovLy8gVGhpcyBhZGRzIGFkZGl0aW9uYWwgYWNjZXNzIHRvIGxpdmVuZXNzIG9mIHNlbGVjdG9ycyBhbmQgZWxlbWVudHMuCmFic3RyYWN0IGNsYXNzIENvZGVnZW5Xb3JsZEJ1aWxkZXIgaW1wbGVtZW50cyBXb3JsZEJ1aWxkZXIgewogIC8vLyBSZWdpc3RlciBbY29uc3RhbnRdIGFzIG5lZWRlZCBmb3IgZW1pc3Npb24uCiAgdm9pZCBhZGRDb21waWxlVGltZUNvbnN0YW50Rm9yRW1pc3Npb24oQ29uc3RhbnRWYWx1ZSBjb25zdGFudCk7CgogIC8vLyBDbG9zZSB0aGUgY29kZWdlbiB3b3JsZCBidWlsZGVyIGFuZCByZXR1cm4gdGhlIGltbXV0YWJsZSBbQ29kZWdlbldvcmxkXQogIC8vLyBhcyB0aGUgcmVzdWx0LgogIENvZGVnZW5Xb3JsZCBjbG9zZSgpOwp9CgovLyBUaGUgaW1tdXRhYmxlIHJlc3VsdCBvZiB0aGUgW0NvZGVnZW5Xb3JsZEJ1aWxkZXJdLgphYnN0cmFjdCBjbGFzcyBDb2RlZ2VuV29ybGQgZXh0ZW5kcyBCdWlsdFdvcmxkIHsKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGdlbmVyaWMgY2FsbCBtZXRob2Qgb24gYSBsaXZlIGNsb3N1cmUgY2xhc3MuCiAgdm9pZCBmb3JFYWNoR2VuZXJpY0Nsb3N1cmVDYWxsTWV0aG9kKHZvaWQgRnVuY3Rpb24oRnVuY3Rpb25FbnRpdHkpIGYpOwoKICBib29sIGhhc0ludm9rZWRHZXR0ZXIoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbWVtYmVyXSBpcyBpbnZva2VkIGFzIGEgc2V0dGVyLgogIGJvb2wgaGFzSW52b2tlZFNldHRlcihNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBpbnZvY2F0aW9uc0J5TmFtZShTdHJpbmcgbmFtZSk7CgogIEl0ZXJhYmxlPFNlbGVjdG9yPiBnZXR0ZXJJbnZvY2F0aW9uc0J5TmFtZShTdHJpbmcgbmFtZSk7CgogIEl0ZXJhYmxlPFNlbGVjdG9yPiBzZXR0ZXJJbnZvY2F0aW9uc0J5TmFtZShTdHJpbmcgbmFtZSk7CgogIHZvaWQgZm9yRWFjaEludm9rZWROYW1lKAogICAgICBmKFN0cmluZyBuYW1lLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IHNlbGVjdG9ycykpOwoKICB2b2lkIGZvckVhY2hJbnZva2VkR2V0dGVyKAogICAgICBmKFN0cmluZyBuYW1lLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IHNlbGVjdG9ycykpOwoKICB2b2lkIGZvckVhY2hJbnZva2VkU2V0dGVyKAogICAgICBmKFN0cmluZyBuYW1lLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IHNlbGVjdG9ycykpOwoKICAvLy8gQWxsIGRpcmVjdGx5IGluc3RhbnRpYXRlZCBjbGFzc2VzLCB0aGF0IGlzLCBjbGFzc2VzIHdpdGggYSBnZW5lcmF0aXZlCiAgLy8vIGNvbnN0cnVjdG9yIHRoYXQgaGFzIGJlZW4gY2FsbGVkIGRpcmVjdGx5IGFuZCBub3Qgb25seSB0aHJvdWdoIGEKICAvLy8gc3VwZXItY2FsbC4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJbXByb3ZlIHNlbWFudGljIHByZWNpc2lvbi4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGRpcmVjdGx5SW5zdGFudGlhdGVkQ2xhc3NlczsKCiAgLy8vIEFsbCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluc3RhbnRpYXRlZCBjbGFzc2VzLgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgaW5zdGFudGlhdGVkQ2xhc3NlczsKCiAgYm9vbCBtZXRob2RzTmVlZHNTdXBlckdldHRlcihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbik7CgogIC8vLyBUaGUgY2FsbHMgW2ZdIGZvciBhbGwgc3RhdGljIGZpZWxkcy4KICB2b2lkIGZvckVhY2hTdGF0aWNGaWVsZCh2b2lkIEZ1bmN0aW9uKEZpZWxkRW50aXR5KSBmKTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGVzIHRoYXQgYXJlIGxpdmUgYXMgY29uc3RhbnQgdHlwZSBsaXRlcmFscy4KICBJdGVyYWJsZTxEYXJ0VHlwZT4gZ2V0IGNvbnN0VHlwZUxpdGVyYWxzOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZXMgdGhhdCBhcmUgbGl2ZSBhcyBjb25zdGFudCB0eXBlIGFyZ3VtZW50cy4KICBJdGVyYWJsZTxEYXJ0VHlwZT4gZ2V0IGxpdmVUeXBlQXJndW1lbnRzOwoKICAvLy8gUmV0dXJucyBhIGxpc3Qgb2YgY29uc3RhbnRzIHRvcG9sb2dpY2FsbHkgc29ydGVkIHNvIHRoYXQgZGVwZW5kZW5jaWVzCiAgLy8vIGFwcGVhciBiZWZvcmUgdGhlIGRlcGVuZGVudCBjb25zdGFudC4KICAvLy8KICAvLy8gW3ByZVNvcnRDb21wYXJlXSBpcyBhIGNvbXBhcmF0b3IgZnVuY3Rpb24gdGhhdCBnaXZlcyB0aGUgY29uc3RhbnRzIGEKICAvLy8gY29uc2lzdGVudCBvcmRlciBwcmlvciB0byB0aGUgdG9wb2xvZ2ljYWwgc29ydCB3aGljaCBnaXZlcyB0aGUgY29uc3RhbnRzCiAgLy8vIGFuIG9yZGVyaW5nIHRoYXQgaXMgbGVzcyBzZW5zaXRpdmUgdG8gcGVydHVyYmF0aW9ucyBpbiB0aGUgc291cmNlIGNvZGUuCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gZ2V0Q29uc3RhbnRzRm9yRW1pc3Npb24oCiAgICAgIFtDb21wYXJhdG9yPENvbnN0YW50VmFsdWU+IHByZVNvcnRDb21wYXJlXSk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbWVtYmVyXSBpcyBjYWxsZWQgZnJvbSBhIHN1YmNsYXNzIHZpYSBgc3VwZXJgLgogIGJvb2wgaXNBbGlhc2VkU3VwZXJNZW1iZXIoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIE9uZVNob3RJbnRlcmNlcHRvckRhdGEgZ2V0IG9uZVNob3RJbnRlcmNlcHRvckRhdGE7Cn0KCmNsYXNzIENvZGVnZW5Xb3JsZEJ1aWxkZXJJbXBsIGV4dGVuZHMgV29ybGRCdWlsZGVyQmFzZQogICAgaW1wbGVtZW50cyBDb2RlZ2VuV29ybGRCdWlsZGVyIHsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIE9uZVNob3RJbnRlcmNlcHRvckRhdGEgX29uZVNob3RJbnRlcmNlcHRvckRhdGE7CgogIC8vLyBUaGUgc2V0IG9mIGFsbCBkaXJlY3RseSBpbnN0YW50aWF0ZWQgY2xhc3NlcywgdGhhdCBpcywgY2xhc3NlcyB3aXRoIGEKICAvLy8gZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciB0aGF0IGhhcyBiZWVuIGNhbGxlZCBkaXJlY3RseSBhbmQgbm90IG9ubHkgdGhyb3VnaAogIC8vLyBhIHN1cGVyLWNhbGwuCiAgLy8vCiAgLy8vIEludmFyaWFudDogRWxlbWVudHMgYXJlIGRlY2xhcmF0aW9uIGVsZW1lbnRzLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFtfZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzXSBhbmQKICAvLyBbX2luc3RhbnRpYXRlZFR5cGVzXSBzZXRzIHNob3VsZCBiZSBtZXJnZWQuCiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBfZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgLy8vIFRoZSBzZXQgb2YgYWxsIGRpcmVjdGx5IGluc3RhbnRpYXRlZCB0eXBlcywgdGhhdCBpcywgdGhlIHR5cGVzIG9mIHRoZQogIC8vLyBkaXJlY3RseSBpbnN0YW50aWF0ZWQgY2xhc3Nlcy4KICAvLy8KICAvLy8gU2VlIFtfZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzXS4KICBmaW5hbCBTZXQ8SW50ZXJmYWNlVHlwZT4gX2luc3RhbnRpYXRlZFR5cGVzID0gbmV3IFNldDxJbnRlcmZhY2VUeXBlPigpOwoKICAvLy8gQ2xhc3NlcyBpbXBsZW1lbnRlZCBieSBkaXJlY3RseSBpbnN0YW50aWF0ZWQgY2xhc3Nlcy4KICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IF9pbXBsZW1lbnRlZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICBmaW5hbCBNYXA8U3RyaW5nLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+PiBfaW52b2tlZE5hbWVzID0KICAgICAgPFN0cmluZywgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPj57fTsKICBmaW5hbCBNYXA8U3RyaW5nLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+PiBfaW52b2tlZEdldHRlcnMgPQogICAgICA8U3RyaW5nLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+Pnt9OwogIGZpbmFsIE1hcDxTdHJpbmcsIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4+IF9pbnZva2VkU2V0dGVycyA9CiAgICAgIDxTdHJpbmcsIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4+e307CgogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NVc2FnZT4gX3Byb2Nlc3NlZENsYXNzZXMgPQogICAgICA8Q2xhc3NFbnRpdHksIENsYXNzVXNhZ2U+e307CgogIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NVc2FnZT4gZ2V0IGNsYXNzVXNhZ2VGb3JUZXN0aW5nID0+IF9wcm9jZXNzZWRDbGFzc2VzOwoKICAvLy8gTWFwIG9mIHJlZ2lzdGVyZWQgdXNhZ2Ugb2Ygc3RhdGljIGFuZCBpbnN0YW5jZSBtZW1iZXJzLgogIGZpbmFsIE1hcDxNZW1iZXJFbnRpdHksIE1lbWJlclVzYWdlPiBfbWVtYmVyVXNhZ2UgPQogICAgICA8TWVtYmVyRW50aXR5LCBNZW1iZXJVc2FnZT57fTsKCiAgLy8vIE1hcCBjb250YWluaW5nIGluc3RhbmNlIG1lbWJlcnMgb2YgbGl2ZSBjbGFzc2VzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4KICAvLy8gZnVsbHkgaW52b2tlZCBkeW5hbWljYWxseS4KICAvLy8KICAvLy8gQSBtZXRob2QgaXMgZnVsbHkgaW52b2tlZCBpZiBhbGwgaXMgb3B0aW9uYWwgcGFyYW1ldGVyIGhhdmUgYmVlbiBwYXNzZWQKICAvLy8gaW4gc29tZSBpbnZvY2F0aW9uLgogIGZpbmFsIE1hcDxTdHJpbmcsIFNldDxNZW1iZXJVc2FnZT4+IF9pbnZva2FibGVJbnN0YW5jZU1lbWJlcnNCeU5hbWUgPQogICAgICA8U3RyaW5nLCBTZXQ8TWVtYmVyVXNhZ2U+Pnt9OwoKICAvLy8gTWFwIGNvbnRhaW5pbmcgaW5zdGFuY2UgbWVtYmVycyBvZiBsaXZlIGNsYXNzZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbgogIC8vLyByZWFkIGZyb20gZHluYW1pY2FsbHkuCiAgZmluYWwgTWFwPFN0cmluZywgU2V0PE1lbWJlclVzYWdlPj4gX3JlYWRhYmxlSW5zdGFuY2VNZW1iZXJzQnlOYW1lID0KICAgICAgPFN0cmluZywgU2V0PE1lbWJlclVzYWdlPj57fTsKCiAgLy8vIE1hcCBjb250YWluaW5nIGluc3RhbmNlIG1lbWJlcnMgb2YgbGl2ZSBjbGFzc2VzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4KICAvLy8gd3JpdHRlbiB0byBkeW5hbWljYWxseS4KICBmaW5hbCBNYXA8U3RyaW5nLCBTZXQ8TWVtYmVyVXNhZ2U+PiBfd3JpdGFibGVJbnN0YW5jZU1lbWJlcnNCeU5hbWUgPQogICAgICA8U3RyaW5nLCBTZXQ8TWVtYmVyVXNhZ2U+Pnt9OwoKICBmaW5hbCBTZXQ8RGFydFR5cGU+IF9pc0NoZWNrcyA9IG5ldyBTZXQ8RGFydFR5cGU+KCk7CgogIGZpbmFsIFNlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneSBfc2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5OwoKICBmaW5hbCBTZXQ8Q29uc3RhbnRWYWx1ZT4gX2NvbnN0YW50VmFsdWVzID0gbmV3IFNldDxDb25zdGFudFZhbHVlPigpOwoKICBmaW5hbCBTZXQ8RGFydFR5cGU+IF9jb25zdFR5cGVMaXRlcmFscyA9IG5ldyBTZXQ8RGFydFR5cGU+KCk7CiAgZmluYWwgU2V0PERhcnRUeXBlPiBfbGl2ZVR5cGVBcmd1bWVudHMgPSBuZXcgU2V0PERhcnRUeXBlPigpOwoKICBDb2RlZ2VuV29ybGRCdWlsZGVySW1wbCh0aGlzLl9jbG9zZWRXb3JsZCwgdGhpcy5fc2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5LAogICAgICB0aGlzLl9vbmVTaG90SW50ZXJjZXB0b3JEYXRhKTsKCiAgRWxlbWVudEVudmlyb25tZW50IGdldCBfZWxlbWVudEVudmlyb25tZW50ID0+IF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQ7CgogIE5hdGl2ZUJhc2ljRGF0YSBnZXQgX25hdGl2ZUJhc2ljRGF0YSA9PiBfY2xvc2VkV29ybGQubmF0aXZlRGF0YTsKCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCBpbnN0YW50aWF0ZWRDbGFzc2VzID0+IF9wcm9jZXNzZWRDbGFzc2VzLmtleXMKICAgICAgLndoZXJlKChjbHMpID0+IF9wcm9jZXNzZWRDbGFzc2VzW2Nsc10uaXNJbnN0YW50aWF0ZWQpOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJbXByb3ZlIHNlbWFudGljIHByZWNpc2lvbi4KICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGRpcmVjdGx5SW5zdGFudGlhdGVkQ2xhc3NlcyB7CiAgICByZXR1cm4gX2RpcmVjdGx5SW5zdGFudGlhdGVkQ2xhc3NlczsKICB9CgogIC8vLyBSZWdpc3RlciBbdHlwZV0gYXMgKGRpcmVjdGx5KSBpbnN0YW50aWF0ZWQuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRnVsbHkgZW5mb3JjZSB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGV4YWN0LCB0aHJvdWdoCiAgLy8gc3ViY2xhc3MgYW5kIHRocm91Z2ggc3VidHlwZSBpbnN0YW50aWF0ZWQgdHlwZXMvY2xhc3Nlcy4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IHVua25vd24gdHlwZSBhcmd1bWVudHMgZm9yIGdlbmVyaWMgdHlwZXMuCiAgdm9pZCByZWdpc3RlclR5cGVJbnN0YW50aWF0aW9uKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzVXNlZENhbGxiYWNrIGNsYXNzVXNlZCkgewogICAgQ2xhc3NFbnRpdHkgY2xzID0gdHlwZS5lbGVtZW50OwogICAgYm9vbCBpc05hdGl2ZSA9IF9uYXRpdmVCYXNpY0RhdGEuaXNOYXRpdmVDbGFzcyhjbHMpOwogICAgX2luc3RhbnRpYXRlZFR5cGVzLmFkZCh0eXBlKTsKICAgIC8vIFdlIGNhbid0IHVzZSB0aGUgY2xvc2VkLXdvcmxkIGFzc3VtcHRpb24gd2l0aCBuYXRpdmUgYWJzdHJhY3QKICAgIC8vIGNsYXNzZXM7IGEgbmF0aXZlIGFic3RyYWN0IGNsYXNzIG1heSBoYXZlIG5vbi1hYnN0cmFjdCBzdWJjbGFzc2VzCiAgICAvLyBub3QgZGVjbGFyZWQgdG8gdGhlIHByb2dyYW0uICBJbnN0YW5jZXMgb2YgdGhlc2UgY2xhc3NlcyBhcmUKICAgIC8vIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIGFic3RyYWN0IGNsYXNzLgogICAgaWYgKCFjbHMuaXNBYnN0cmFjdCB8fCBpc05hdGl2ZSkgewogICAgICBfZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzLmFkZChjbHMpOwogICAgICBfcHJvY2Vzc0luc3RhbnRpYXRlZENsYXNzKGNscywgY2xhc3NVc2VkKTsKICAgIH0KCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZXBsYWNlIHRoaXMgYnkgc2VwYXJhdGUgbW9yZSBzcGVjaWZpYyBtYXBwaW5ncyB0aGF0CiAgICAvLyBpbmNsdWRlIHRoZSB0eXBlIGFyZ3VtZW50cy4KICAgIGlmIChfaW1wbGVtZW50ZWRDbGFzc2VzLmFkZChjbHMpKSB7CiAgICAgIGNsYXNzVXNlZChjbHMsIF9nZXRDbGFzc1VzYWdlKGNscykuaW1wbGVtZW50KCkpOwogICAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hTdXBlcnR5cGUoY2xzLCAoSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUpIHsKICAgICAgICBpZiAoX2ltcGxlbWVudGVkQ2xhc3Nlcy5hZGQoc3VwZXJ0eXBlLmVsZW1lbnQpKSB7CiAgICAgICAgICBjbGFzc1VzZWQoCiAgICAgICAgICAgICAgc3VwZXJ0eXBlLmVsZW1lbnQsIF9nZXRDbGFzc1VzYWdlKHN1cGVydHlwZS5lbGVtZW50KS5pbXBsZW1lbnQoKSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CgogIGJvb2wgX2hhc01hdGNoaW5nU2VsZWN0b3IoTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBzZWxlY3RvcnMsCiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIsIEpDbG9zZWRXb3JsZCB3b3JsZCkgewogICAgaWYgKHNlbGVjdG9ycyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKFNlbGVjdG9yIHNlbGVjdG9yIGluIHNlbGVjdG9ycy5rZXlzKSB7CiAgICAgIGlmIChzZWxlY3Rvci5hcHBsaWVzVW5uYW1lZChtZW1iZXIpKSB7CiAgICAgICAgU2VsZWN0b3JDb25zdHJhaW50cyBtYXNrcyA9IHNlbGVjdG9yc1tzZWxlY3Rvcl07CiAgICAgICAgaWYgKG1hc2tzLmNhbkhpdChtZW1iZXIsIHNlbGVjdG9yLm1lbWJlck5hbWUsIHdvcmxkKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBJdGVyYWJsZTxDYWxsU3RydWN0dXJlPiBfZ2V0TWF0Y2hpbmdDYWxsU3RydWN0dXJlcygKICAgICAgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBzZWxlY3RvcnMsIE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIGlmIChzZWxlY3RvcnMgPT0gbnVsbCkgcmV0dXJuIGNvbnN0IDxDYWxsU3RydWN0dXJlPltdOwogICAgU2V0PENhbGxTdHJ1Y3R1cmU+IGNhbGxTdHJ1Y3R1cmVzOwogICAgZm9yIChTZWxlY3RvciBzZWxlY3RvciBpbiBzZWxlY3RvcnMua2V5cykgewogICAgICBpZiAoc2VsZWN0b3IuYXBwbGllc1VubmFtZWQobWVtYmVyKSkgewogICAgICAgIFNlbGVjdG9yQ29uc3RyYWludHMgbWFza3MgPSBzZWxlY3RvcnNbc2VsZWN0b3JdOwogICAgICAgIGlmIChtYXNrcy5jYW5IaXQobWVtYmVyLCBzZWxlY3Rvci5tZW1iZXJOYW1lLCBfY2xvc2VkV29ybGQpKSB7CiAgICAgICAgICBjYWxsU3RydWN0dXJlcyA/Pz0gbmV3IFNldDxDYWxsU3RydWN0dXJlPigpOwogICAgICAgICAgY2FsbFN0cnVjdHVyZXMuYWRkKHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGNhbGxTdHJ1Y3R1cmVzID8/IGNvbnN0IDxDYWxsU3RydWN0dXJlPltdOwogIH0KCiAgSXRlcmFibGU8Q2FsbFN0cnVjdHVyZT4gX2dldEludm9jYXRpb25DYWxsU3RydWN0dXJlcyhNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gX2dldE1hdGNoaW5nQ2FsbFN0cnVjdHVyZXMoX2ludm9rZWROYW1lc1ttZW1iZXIubmFtZV0sIG1lbWJlcik7CiAgfQoKICBib29sIF9oYXNJbnZva2VkR2V0dGVyKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBfaGFzTWF0Y2hpbmdTZWxlY3RvcigKICAgICAgICBfaW52b2tlZEdldHRlcnNbbWVtYmVyLm5hbWVdLCBtZW1iZXIsIF9jbG9zZWRXb3JsZCk7CiAgfQoKICBib29sIF9oYXNJbnZva2VkU2V0dGVyKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBfaGFzTWF0Y2hpbmdTZWxlY3RvcigKICAgICAgICBfaW52b2tlZFNldHRlcnNbbWVtYmVyLm5hbWVdLCBtZW1iZXIsIF9jbG9zZWRXb3JsZCk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyRHluYW1pY1VzZSgKICAgICAgRHluYW1pY1VzZSBkeW5hbWljVXNlLCBNZW1iZXJVc2VkQ2FsbGJhY2sgbWVtYmVyVXNlZCkgewogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBkeW5hbWljVXNlLnNlbGVjdG9yOwogICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBzZWxlY3Rvci5uYW1lOwoKICAgIHZvaWQgX3Byb2Nlc3MoCiAgICAgICAgTWFwPFN0cmluZywgU2V0PE1lbWJlclVzYWdlPj4gbWVtYmVyTWFwLAogICAgICAgIEVudW1TZXQ8TWVtYmVyVXNlPiBhY3Rpb24oTWVtYmVyVXNhZ2UgdXNhZ2UpLAogICAgICAgIGJvb2wgc2hvdWxkQmVSZW1vdmVkKE1lbWJlclVzYWdlIHVzYWdlKSkgewogICAgICBfcHJvY2Vzc1NldChtZW1iZXJNYXAsIG1ldGhvZE5hbWUsIChNZW1iZXJVc2FnZSB1c2FnZSkgewogICAgICAgIGlmIChzZWxlY3Rvci5hcHBsaWVzVW5uYW1lZCh1c2FnZS5lbnRpdHkpICYmCiAgICAgICAgICAgIF9zZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kuYXBwbGllZFVubmFtZWQoCiAgICAgICAgICAgICAgICBkeW5hbWljVXNlLCB1c2FnZS5lbnRpdHksIF9jbG9zZWRXb3JsZCkpIHsKICAgICAgICAgIG1lbWJlclVzZWQodXNhZ2UuZW50aXR5LCBhY3Rpb24odXNhZ2UpKTsKICAgICAgICAgIHJldHVybiBzaG91bGRCZVJlbW92ZWQodXNhZ2UpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0pOwogICAgfQoKICAgIHN3aXRjaCAoZHluYW1pY1VzZS5raW5kKSB7CiAgICAgIGNhc2UgRHluYW1pY1VzZUtpbmQuSU5WT0tFOgogICAgICAgIHJlZ2lzdGVyRHluYW1pY0ludm9jYXRpb24oCiAgICAgICAgICAgIGR5bmFtaWNVc2Uuc2VsZWN0b3IsIGR5bmFtaWNVc2UudHlwZUFyZ3VtZW50cyk7CiAgICAgICAgaWYgKF9yZWdpc3Rlck5ld1NlbGVjdG9yKGR5bmFtaWNVc2UsIF9pbnZva2VkTmFtZXMpKSB7CiAgICAgICAgICBfcHJvY2VzcygKICAgICAgICAgICAgICBfaW52b2thYmxlSW5zdGFuY2VNZW1iZXJzQnlOYW1lLAogICAgICAgICAgICAgIChtKSA9PiBtLmludm9rZShBY2Nlc3Nlcy5keW5hbWljQWNjZXNzLCBzZWxlY3Rvci5jYWxsU3RydWN0dXJlKSwKICAgICAgICAgICAgICAvLyBJZiBub3QgYWxsIG9wdGlvbmFsIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHBhc3NlZCBpbiBpbnZvY2F0aW9ucwogICAgICAgICAgICAgIC8vIHdlIG11c3Qga2VlcCB0aGUgbWVtYmVyIGluIFtfaW52b2thYmxlSW5zdGFuY2VNZW1iZXJzQnlOYW1lXS4KICAgICAgICAgICAgICAodSkgPT4gIXUuaGFzUGVuZGluZ0R5bmFtaWNJbnZva2UpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBEeW5hbWljVXNlS2luZC5HRVQ6CiAgICAgICAgaWYgKF9yZWdpc3Rlck5ld1NlbGVjdG9yKGR5bmFtaWNVc2UsIF9pbnZva2VkR2V0dGVycykpIHsKICAgICAgICAgIF9wcm9jZXNzKAogICAgICAgICAgICAgIF9yZWFkYWJsZUluc3RhbmNlTWVtYmVyc0J5TmFtZSwKICAgICAgICAgICAgICAobSkgPT4gbS5yZWFkKEFjY2Vzc2VzLmR5bmFtaWNBY2Nlc3MpLAogICAgICAgICAgICAgICh1KSA9PiAhdS5oYXNQZW5kaW5nRHluYW1pY1JlYWQpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBEeW5hbWljVXNlS2luZC5TRVQ6CiAgICAgICAgaWYgKF9yZWdpc3Rlck5ld1NlbGVjdG9yKGR5bmFtaWNVc2UsIF9pbnZva2VkU2V0dGVycykpIHsKICAgICAgICAgIF9wcm9jZXNzKAogICAgICAgICAgICAgIF93cml0YWJsZUluc3RhbmNlTWVtYmVyc0J5TmFtZSwKICAgICAgICAgICAgICAobSkgPT4gbS53cml0ZShBY2Nlc3Nlcy5keW5hbWljQWNjZXNzKSwKICAgICAgICAgICAgICAodSkgPT4gIXUuaGFzUGVuZGluZ0R5bmFtaWNXcml0ZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgYm9vbCBfcmVnaXN0ZXJOZXdTZWxlY3RvcihEeW5hbWljVXNlIGR5bmFtaWNVc2UsCiAgICAgIE1hcDxTdHJpbmcsIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4+IHNlbGVjdG9yTWFwKSB7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IGR5bmFtaWNVc2Uuc2VsZWN0b3I7CiAgICBTdHJpbmcgbmFtZSA9IHNlbGVjdG9yLm5hbWU7CiAgICBPYmplY3QgY29uc3RyYWludCA9IGR5bmFtaWNVc2UucmVjZWl2ZXJDb25zdHJhaW50OwogICAgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBzZWxlY3RvcnMgPQogICAgICAgIHNlbGVjdG9yTWFwW25hbWVdID8/PSBuZXcgTWFwbGV0PFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPigpOwogICAgVW5pdmVyc2VTZWxlY3RvckNvbnN0cmFpbnRzIGNvbnN0cmFpbnRzID0gc2VsZWN0b3JzW3NlbGVjdG9yXTsKICAgIGlmIChjb25zdHJhaW50cyA9PSBudWxsKSB7CiAgICAgIHNlbGVjdG9yc1tzZWxlY3Rvcl0gPSBfc2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5CiAgICAgICAgICAuY3JlYXRlU2VsZWN0b3JDb25zdHJhaW50cyhzZWxlY3RvciwgY29uc3RyYWludCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGNvbnN0cmFpbnRzLmFkZFJlY2VpdmVyQ29uc3RyYWludChjb25zdHJhaW50KTsKICB9CgogIHZvaWQgcmVnaXN0ZXJJc0NoZWNrKGNvdmFyaWFudCBEYXJ0VHlwZSB0eXBlKSB7CiAgICBfaXNDaGVja3MuYWRkKHR5cGUudW5hbGlhc2VkKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTdGF0aWNVc2UoU3RhdGljVXNlIHN0YXRpY1VzZSwgTWVtYmVyVXNlZENhbGxiYWNrIG1lbWJlclVzZWQpIHsKICAgIE1lbWJlckVudGl0eSBlbGVtZW50ID0gc3RhdGljVXNlLmVsZW1lbnQ7CiAgICBFbnVtU2V0PE1lbWJlclVzZT4gdXNlU2V0ID0gbmV3IEVudW1TZXQ8TWVtYmVyVXNlPigpOwogICAgTWVtYmVyVXNhZ2UgdXNhZ2UgPSBfZ2V0TWVtYmVyVXNhZ2UoZWxlbWVudCwgdXNlU2V0KTsKICAgIHN3aXRjaCAoc3RhdGljVXNlLmtpbmQpIHsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNUQVRJQ19URUFSX09GRjoKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLnJlYWQoQWNjZXNzZXMuc3RhdGljQWNjZXNzKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5JTlNUQU5DRV9GSUVMRF9HRVQ6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5JTlNUQU5DRV9GSUVMRF9TRVQ6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DQUxMX01FVEhPRDoKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB0aGlzLiBDdXJyZW50bHkgW0ZJRUxEX0dFVF0gYW5kCiAgICAgICAgLy8gW0ZJRUxEX1NFVF0gY29udGFpbnMgW0JveEZpZWxkRWxlbWVudF1zIHdoaWNoIHdlIGNhbm5vdCBlbnF1ZXVlLgogICAgICAgIC8vIEFsc28gW0NMT1NVUkVdIGNvbnRhaW5zIFtMb2NhbEZ1bmN0aW9uRWxlbWVudF0gd2hpY2ggd2UgY2Fubm90CiAgICAgICAgLy8gZW5xdWV1ZS4KICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNVUEVSX0lOVk9LRToKICAgICAgICByZWdpc3RlclN0YXRpY0ludm9jYXRpb24oc3RhdGljVXNlKTsKICAgICAgICB1c2VTZXQuYWRkQWxsKAogICAgICAgICAgICB1c2FnZS5pbnZva2UoQWNjZXNzZXMuc3VwZXJBY2Nlc3MsIHN0YXRpY1VzZS5jYWxsU3RydWN0dXJlKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVEFUSUNfSU5WT0tFOgogICAgICAgIHJlZ2lzdGVyU3RhdGljSW52b2NhdGlvbihzdGF0aWNVc2UpOwogICAgICAgIHVzZVNldC5hZGRBbGwoCiAgICAgICAgICAgIHVzYWdlLmludm9rZShBY2Nlc3Nlcy5zdGF0aWNBY2Nlc3MsIHN0YXRpY1VzZS5jYWxsU3RydWN0dXJlKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVVBFUl9GSUVMRF9TRVQ6CiAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS53cml0ZShBY2Nlc3Nlcy5zdXBlckFjY2VzcykpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuU1VQRVJfU0VUVEVSX1NFVDoKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLndyaXRlKEFjY2Vzc2VzLnN1cGVyQWNjZXNzKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVEFUSUNfU0VUOgogICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2Uud3JpdGUoQWNjZXNzZXMuc3RhdGljQWNjZXNzKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVVBFUl9URUFSX09GRjoKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLnJlYWQoQWNjZXNzZXMuc3VwZXJBY2Nlc3MpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNVUEVSX0dFVDoKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLnJlYWQoQWNjZXNzZXMuc3VwZXJBY2Nlc3MpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNUQVRJQ19HRVQ6CiAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5yZWFkKEFjY2Vzc2VzLnN0YXRpY0FjY2VzcykpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuRklFTERfSU5JVDoKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLmluaXQoKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5GSUVMRF9DT05TVEFOVF9JTklUOgogICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2UuY29uc3RhbnRJbml0KHN0YXRpY1VzZS5jb25zdGFudCkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuQ09OU1RSVUNUT1JfSU5WT0tFOgogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuQ09OU1RfQ09OU1RSVUNUT1JfSU5WT0tFOgogICAgICAgIC8vIFdlIGRvbid0IHRyYWNrIHBhcmFtZXRlcnMgaW4gdGhlIGNvZGVnZW4gd29ybGQgYnVpbGRlciwgc28gd2UKICAgICAgICAvLyBwYXNzIGBudWxsYCBpbnN0ZWFkIG9mIHRoZSBjb25jcmV0ZSBjYWxsIHN0cnVjdHVyZS4KICAgICAgICB1c2VTZXQuYWRkQWxsKAogICAgICAgICAgICB1c2FnZS5pbnZva2UoQWNjZXNzZXMuc3RhdGljQWNjZXNzLCBzdGF0aWNVc2UuY2FsbFN0cnVjdHVyZSkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuRElSRUNUX0lOVk9LRToKICAgICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gc3RhdGljVXNlLmVsZW1lbnQ7CiAgICAgICAgLy8gV2UgZG9uJ3QgdHJhY2sgcGFyYW1ldGVycyBpbiB0aGUgY29kZWdlbiB3b3JsZCBidWlsZGVyLCBzbyB3ZQogICAgICAgIC8vIHBhc3MgYG51bGxgIGluc3RlYWQgb2YgdGhlIGNvbmNyZXRlIGNhbGwgc3RydWN0dXJlLgogICAgICAgIHVzZVNldC5hZGRBbGwoCiAgICAgICAgICAgIHVzYWdlLmludm9rZShBY2Nlc3Nlcy5zdGF0aWNBY2Nlc3MsIHN0YXRpY1VzZS5jYWxsU3RydWN0dXJlKSk7CiAgICAgICAgaWYgKHN0YXRpY1VzZS50eXBlQXJndW1lbnRzPy5pc05vdEVtcHR5ID8/IGZhbHNlKSB7CiAgICAgICAgICByZWdpc3RlckR5bmFtaWNJbnZvY2F0aW9uKAogICAgICAgICAgICAgIG5ldyBTZWxlY3Rvci5jYWxsKG1lbWJlci5tZW1iZXJOYW1lLCBzdGF0aWNVc2UuY2FsbFN0cnVjdHVyZSksCiAgICAgICAgICAgICAgc3RhdGljVXNlLnR5cGVBcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLklOTElOSU5HOgogICAgICAgIHJlZ2lzdGVyU3RhdGljSW52b2NhdGlvbihzdGF0aWNVc2UpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuQ0xPU1VSRToKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNMT1NVUkVfQ0FMTDoKICAgICAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgICAiU3RhdGljIHVzZSAke3N0YXRpY1VzZS5raW5kfSBpcyBub3Qgc3VwcG9ydGVkIGR1cmluZyBjb2RlZ2VuLiIpOwogICAgfQogICAgaWYgKHVzZVNldC5pc05vdEVtcHR5KSB7CiAgICAgIG1lbWJlclVzZWQodXNhZ2UuZW50aXR5LCB1c2VTZXQpOwogICAgfQogIH0KCiAgdm9pZCBwcm9jZXNzQ2xhc3NNZW1iZXJzKENsYXNzRW50aXR5IGNscywgTWVtYmVyVXNlZENhbGxiYWNrIG1lbWJlclVzZWQsCiAgICAgIHtib29sIGNoZWNrRW5xdWV1ZXJDb25zaXN0ZW5jeTogZmFsc2V9KSB7CiAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hDbGFzc01lbWJlcihjbHMsCiAgICAgICAgKENsYXNzRW50aXR5IGNscywgTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICBfcHJvY2Vzc0luc3RhbnRpYXRlZENsYXNzTWVtYmVyKGNscywgbWVtYmVyLCBtZW1iZXJVc2VkLAogICAgICAgICAgY2hlY2tFbnF1ZXVlckNvbnNpc3RlbmN5OiBjaGVja0VucXVldWVyQ29uc2lzdGVuY3kpOwogICAgfSk7CiAgfQoKICB2b2lkIF9wcm9jZXNzSW5zdGFudGlhdGVkQ2xhc3NNZW1iZXIoCiAgICAgIENsYXNzRW50aXR5IGNscywgTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVXNlZENhbGxiYWNrIG1lbWJlclVzZWQsCiAgICAgIHtib29sIGNoZWNrRW5xdWV1ZXJDb25zaXN0ZW5jeTogZmFsc2V9KSB7CiAgICBpZiAoIW1lbWJlci5pc0luc3RhbmNlTWVtYmVyKSByZXR1cm47CiAgICBFbnVtU2V0PE1lbWJlclVzZT4gdXNlU2V0ID0gbmV3IEVudW1TZXQ8TWVtYmVyVXNlPigpOwogICAgTWVtYmVyVXNhZ2UgdXNhZ2UgPSBfZ2V0TWVtYmVyVXNhZ2UobWVtYmVyLCB1c2VTZXQpOwogICAgaWYgKHVzZVNldC5pc05vdEVtcHR5KSB7CiAgICAgIGlmIChjaGVja0VucXVldWVyQ29uc2lzdGVuY3kpIHsKICAgICAgICB0aHJvdyBuZXcgU3Bhbm5hYmxlQXNzZXJ0aW9uRmFpbHVyZShtZW1iZXIsCiAgICAgICAgICAgICdVbmVucXVldWVkIHVzYWdlIG9mICRtZW1iZXI6IFxuYmVmb3JlOiA8bm9uZT5cbmFmdGVyIDogJHVzYWdlJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWVtYmVyVXNlZChtZW1iZXIsIHVzZVNldCk7CiAgICAgIH0KICAgIH0KICB9CgogIE1lbWJlclVzYWdlIF9nZXRNZW1iZXJVc2FnZShNZW1iZXJFbnRpdHkgbWVtYmVyLCBFbnVtU2V0PE1lbWJlclVzZT4gdXNlU2V0LAogICAgICB7Ym9vbCBjaGVja0VucXVldWVyQ29uc2lzdGVuY3k6IGZhbHNlfSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2hhbmdlIFtUeXBlTWFza10gdG8gbm90IGFwcGx5IHRvIGEgc3VwZXJjbGFzcwogICAgLy8gbWVtYmVyIHVubGVzcyB0aGUgY2xhc3MgaGFzIGJlZW4gaW5zdGFudGlhdGVkLiBTaW1pbGFyIHRvCiAgICAvLyBbU3Ryb25nTW9kZUNvbnN0cmFpbnRdLgogICAgTWVtYmVyVXNhZ2UgdXNhZ2UgPSBfbWVtYmVyVXNhZ2VbbWVtYmVyXTsKICAgIGlmICh1c2FnZSA9PSBudWxsKSB7CiAgICAgIE1lbWJlckFjY2VzcyBwb3RlbnRpYWxBY2Nlc3MgPSBfY2xvc2VkV29ybGQuZ2V0TWVtYmVyQWNjZXNzKG1lbWJlcik7CiAgICAgIGlmIChtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAgIFN0cmluZyBtZW1iZXJOYW1lID0gbWVtYmVyLm5hbWU7CiAgICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gbWVtYmVyLmVuY2xvc2luZ0NsYXNzOwogICAgICAgIGJvb2wgaXNOYXRpdmUgPSBfbmF0aXZlQmFzaWNEYXRhLmlzTmF0aXZlQ2xhc3MoY2xzKTsKICAgICAgICB1c2FnZSA9IG5ldyBNZW1iZXJVc2FnZShtZW1iZXIsIHBvdGVudGlhbEFjY2VzczogcG90ZW50aWFsQWNjZXNzKTsKICAgICAgICBpZiAobWVtYmVyLmlzRmllbGQgJiYgIWlzTmF0aXZlKSB7CiAgICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLmluaXQoKSk7CiAgICAgICAgfQogICAgICAgIGlmIChtZW1iZXIgaXMgSlNpZ25hdHVyZU1ldGhvZCkgewogICAgICAgICAgLy8gV2UgbWFyayBzaWduYXR1cmUgbWV0aG9kcyBhcyAiYWx3YXlzIHVzZWQiIHRvIHByZXZlbnQgdGhlbSBmcm9tCiAgICAgICAgICAvLyBiZWluZyBvcHRpbWl6ZWQgYXdheS4KICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1ha2UgdGhpcyBhIHBhcnQgb2YgdGhlIHJlZ3VsYXIgZW5xdWV1ZWluZy4KICAgICAgICAgIHVzZVNldC5hZGRBbGwoCiAgICAgICAgICAgICAgdXNhZ2UuaW52b2tlKEFjY2Vzc2VzLmR5bmFtaWNBY2Nlc3MsIENhbGxTdHJ1Y3R1cmUuTk9fQVJHUykpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHVzYWdlLmhhc1BlbmRpbmdEeW5hbWljUmVhZCAmJiBfaGFzSW52b2tlZEdldHRlcihtZW1iZXIpKSB7CiAgICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLnJlYWQoQWNjZXNzZXMuZHluYW1pY0FjY2VzcykpOwogICAgICAgIH0KICAgICAgICBpZiAodXNhZ2UuaGFzUGVuZGluZ0R5bmFtaWNXcml0ZSAmJiBfaGFzSW52b2tlZFNldHRlcihtZW1iZXIpKSB7CiAgICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLndyaXRlKEFjY2Vzc2VzLmR5bmFtaWNBY2Nlc3MpKTsKICAgICAgICB9CiAgICAgICAgaWYgKHVzYWdlLmhhc1BlbmRpbmdEeW5hbWljSW52b2tlKSB7CiAgICAgICAgICBJdGVyYWJsZTxDYWxsU3RydWN0dXJlPiBjYWxsU3RydWN0dXJlcyA9CiAgICAgICAgICAgICAgX2dldEludm9jYXRpb25DYWxsU3RydWN0dXJlcyhtZW1iZXIpOwogICAgICAgICAgZm9yIChDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUgaW4gY2FsbFN0cnVjdHVyZXMpIHsKICAgICAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5pbnZva2UoQWNjZXNzZXMuZHluYW1pY0FjY2VzcywgY2FsbFN0cnVjdHVyZSkpOwogICAgICAgICAgICBpZiAoIXVzYWdlLmhhc1BlbmRpbmdEeW5hbWljSW52b2tlKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghY2hlY2tFbnF1ZXVlckNvbnNpc3RlbmN5KSB7CiAgICAgICAgICBpZiAodXNhZ2UuaGFzUGVuZGluZ0R5bmFtaWNJbnZva2UpIHsKICAgICAgICAgICAgX2ludm9rYWJsZUluc3RhbmNlTWVtYmVyc0J5TmFtZQogICAgICAgICAgICAgICAgLnB1dElmQWJzZW50KG1lbWJlck5hbWUsICgpID0+IHt9KQogICAgICAgICAgICAgICAgLmFkZCh1c2FnZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodXNhZ2UuaGFzUGVuZGluZ0R5bmFtaWNSZWFkKSB7CiAgICAgICAgICAgIF9yZWFkYWJsZUluc3RhbmNlTWVtYmVyc0J5TmFtZQogICAgICAgICAgICAgICAgLnB1dElmQWJzZW50KG1lbWJlck5hbWUsICgpID0+IHt9KQogICAgICAgICAgICAgICAgLmFkZCh1c2FnZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodXNhZ2UuaGFzUGVuZGluZ0R5bmFtaWNXcml0ZSkgewogICAgICAgICAgICBfd3JpdGFibGVJbnN0YW5jZU1lbWJlcnNCeU5hbWUKICAgICAgICAgICAgICAgIC5wdXRJZkFic2VudChtZW1iZXJOYW1lLCAoKSA9PiB7fSkKICAgICAgICAgICAgICAgIC5hZGQodXNhZ2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB1c2FnZSA9IG5ldyBNZW1iZXJVc2FnZShtZW1iZXIsIHBvdGVudGlhbEFjY2VzczogcG90ZW50aWFsQWNjZXNzKTsKICAgICAgICBpZiAobWVtYmVyLmlzRmllbGQpIHsKICAgICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2UuaW5pdCgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFjaGVja0VucXVldWVyQ29uc2lzdGVuY3kpIHsKICAgICAgICBfbWVtYmVyVXNhZ2VbbWVtYmVyXSA9IHVzYWdlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoY2hlY2tFbnF1ZXVlckNvbnNpc3RlbmN5KSB7CiAgICAgICAgdXNhZ2UgPSB1c2FnZS5jbG9uZSgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdXNhZ2U7CiAgfQoKICB2b2lkIF9wcm9jZXNzU2V0KE1hcDxTdHJpbmcsIFNldDxNZW1iZXJVc2FnZT4+IG1hcCwgU3RyaW5nIG1lbWJlck5hbWUsCiAgICAgIGJvb2wgZihNZW1iZXJVc2FnZSBlKSkgewogICAgU2V0PE1lbWJlclVzYWdlPiBtZW1iZXJzID0gbWFwW21lbWJlck5hbWVdOwogICAgaWYgKG1lbWJlcnMgPT0gbnVsbCkgcmV0dXJuOwogICAgLy8gW2ZdIG1pZ2h0IGFkZCBlbGVtZW50cyB0byBbOiBtYXBbbWVtYmVyTmFtZV0gOl0gZHVyaW5nIHRoZSBsb29wIGJlbG93CiAgICAvLyBzbyB3ZSBjcmVhdGUgYSBuZXcgbGlzdCBmb3IgWzogbWFwW21lbWJlck5hbWVdIDpdIGFuZCBwcmVwZW5kIHRoZQogICAgLy8gW3JlbWFpbmluZ10gbWVtYmVycyBhZnRlciB0aGUgbG9vcC4KICAgIG1hcFttZW1iZXJOYW1lXSA9IG5ldyBTZXQ8TWVtYmVyVXNhZ2U+KCk7CiAgICBTZXQ8TWVtYmVyVXNhZ2U+IHJlbWFpbmluZyA9IG5ldyBTZXQ8TWVtYmVyVXNhZ2U+KCk7CiAgICBmb3IgKE1lbWJlclVzYWdlIG1lbWJlciBpbiBtZW1iZXJzKSB7CiAgICAgIGlmICghZihtZW1iZXIpKSByZW1haW5pbmcuYWRkKG1lbWJlcik7CiAgICB9CiAgICBtYXBbbWVtYmVyTmFtZV0uYWRkQWxsKHJlbWFpbmluZyk7CiAgfQoKICAvLy8gUmV0dXJuIHRoZSBjYW5vbmljYWwgW0NsYXNzVXNhZ2VdIGZvciBbY2xzXS4KICBDbGFzc1VzYWdlIF9nZXRDbGFzc1VzYWdlKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIF9wcm9jZXNzZWRDbGFzc2VzLnB1dElmQWJzZW50KGNscywgKCkgPT4gbmV3IENsYXNzVXNhZ2UoY2xzKSk7CiAgfQoKICB2b2lkIF9wcm9jZXNzSW5zdGFudGlhdGVkQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzLCBDbGFzc1VzZWRDYWxsYmFjayBjbGFzc1VzZWQpIHsKICAgIC8vIFJlZ2lzdGVycyBbc3VwZXJjbGFzc10gYXMgaW5zdGFudGlhdGVkLiBSZXR1cm5zIGB0cnVlYCBpZiBpdCB3YXNuJ3QKICAgIC8vIGFscmVhZHkgaW5zdGFudGlhdGVkIGFuZCB3ZSB0aGVyZWZvcmUgaGF2ZSB0byBwcm9jZXNzIGl0cyBzdXBlcmNsYXNzIGFzCiAgICAvLyB3ZWxsLgogICAgYm9vbCBwcm9jZXNzQ2xhc3MoQ2xhc3NFbnRpdHkgc3VwZXJjbGFzcykgewogICAgICBDbGFzc1VzYWdlIHVzYWdlID0gX2dldENsYXNzVXNhZ2Uoc3VwZXJjbGFzcyk7CiAgICAgIGlmICghdXNhZ2UuaXNJbnN0YW50aWF0ZWQpIHsKICAgICAgICBjbGFzc1VzZWQodXNhZ2UuY2xzLCB1c2FnZS5pbnN0YW50aWF0ZSgpKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgd2hpbGUgKGNscyAhPSBudWxsICYmIHByb2Nlc3NDbGFzcyhjbHMpKSB7CiAgICAgIGNscyA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhjbHMpOwogICAgfQogIH0KCiAgLy8vIFNldCBvZiBhbGwgcmVnaXN0ZXJlZCBjb21waWxlZCBjb25zdGFudHMuCiAgZmluYWwgU2V0PENvbnN0YW50VmFsdWU+IF9jb21waWxlZENvbnN0YW50cyA9IG5ldyBTZXQ8Q29uc3RhbnRWYWx1ZT4oKTsKCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gZ2V0IGNvbXBpbGVkQ29uc3RhbnRzRm9yVGVzdGluZyA9PiBfY29tcGlsZWRDb25zdGFudHM7CgogIEBvdmVycmlkZQogIHZvaWQgYWRkQ29tcGlsZVRpbWVDb25zdGFudEZvckVtaXNzaW9uKENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgIF9jb21waWxlZENvbnN0YW50cy5hZGQoY29uc3RhbnQpOwogIH0KCiAgLy8vIFJlZ2lzdGVyIHRoZSBjb25zdGFudCBbdXNlXSB3aXRoIHRoaXMgd29ybGQgYnVpbGRlci4gUmV0dXJucyBgdHJ1ZWAgaWYKICAvLy8gdGhlIGNvbnN0YW50IHVzZSB3YXMgbmV3IHRvIHRoZSB3b3JsZC4KICBib29sIHJlZ2lzdGVyQ29uc3RhbnRVc2UoQ29uc3RhbnRVc2UgdXNlKSB7CiAgICBhZGRDb21waWxlVGltZUNvbnN0YW50Rm9yRW1pc3Npb24odXNlLnZhbHVlKTsKICAgIHJldHVybiBfY29uc3RhbnRWYWx1ZXMuYWRkKHVzZS52YWx1ZSk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQ29uc3RUeXBlTGl0ZXJhbChEYXJ0VHlwZSB0eXBlKSB7CiAgICBfY29uc3RUeXBlTGl0ZXJhbHMuYWRkKHR5cGUpOwogIH0KCiAgdm9pZCByZWdpc3RlclR5cGVBcmd1bWVudChEYXJ0VHlwZSB0eXBlKSB7CiAgICBfbGl2ZVR5cGVBcmd1bWVudHMuYWRkKHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29kZWdlbldvcmxkIGNsb3NlKCkgewogICAgTWFwPE1lbWJlckVudGl0eSwgTWVtYmVyVXNhZ2U+IGxpdmVNZW1iZXJVc2FnZSA9IHt9OwogICAgX21lbWJlclVzYWdlLmZvckVhY2goKE1lbWJlckVudGl0eSBtZW1iZXIsIE1lbWJlclVzYWdlIHVzYWdlKSB7CiAgICAgIGlmICh1c2FnZS5oYXNVc2UpIHsKICAgICAgICBsaXZlTWVtYmVyVXNhZ2VbbWVtYmVyXSA9IHVzYWdlOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiBuZXcgQ29kZWdlbldvcmxkSW1wbChfY2xvc2VkV29ybGQsIGxpdmVNZW1iZXJVc2FnZSwKICAgICAgICBjb25zdFR5cGVMaXRlcmFsczogX2NvbnN0VHlwZUxpdGVyYWxzLAogICAgICAgIGRpcmVjdGx5SW5zdGFudGlhdGVkQ2xhc3NlczogZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzLAogICAgICAgIHR5cGVWYXJpYWJsZVR5cGVMaXRlcmFsczogdHlwZVZhcmlhYmxlVHlwZUxpdGVyYWxzLAogICAgICAgIGluc3RhbnRpYXRlZENsYXNzZXM6IGluc3RhbnRpYXRlZENsYXNzZXMsCiAgICAgICAgaXNDaGVja3M6IF9pc0NoZWNrcywKICAgICAgICBpbnN0YW50aWF0ZWRUeXBlczogX2luc3RhbnRpYXRlZFR5cGVzLAogICAgICAgIGxpdmVUeXBlQXJndW1lbnRzOiBfbGl2ZVR5cGVBcmd1bWVudHMsCiAgICAgICAgY29tcGlsZWRDb25zdGFudHM6IF9jb21waWxlZENvbnN0YW50cywKICAgICAgICBpbnZva2VkTmFtZXM6IF9pbnZva2VkTmFtZXMsCiAgICAgICAgaW52b2tlZEdldHRlcnM6IF9pbnZva2VkR2V0dGVycywKICAgICAgICBpbnZva2VkU2V0dGVyczogX2ludm9rZWRTZXR0ZXJzLAogICAgICAgIHN0YXRpY1R5cGVBcmd1bWVudERlcGVuZGVuY2llczogc3RhdGljVHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzLAogICAgICAgIGR5bmFtaWNUeXBlQXJndW1lbnREZXBlbmRlbmNpZXM6IGR5bmFtaWNUeXBlQXJndW1lbnREZXBlbmRlbmNpZXMsCiAgICAgICAgb25lU2hvdEludGVyY2VwdG9yRGF0YTogX29uZVNob3RJbnRlcmNlcHRvckRhdGEpOwogIH0KfQoKY2xhc3MgQ29kZWdlbldvcmxkSW1wbCBpbXBsZW1lbnRzIENvZGVnZW5Xb3JsZCB7CiAgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgTWVtYmVyVXNhZ2U+IF9saXZlTWVtYmVyVXNhZ2U7CgogIEBvdmVycmlkZQogIGZpbmFsIEl0ZXJhYmxlPERhcnRUeXBlPiBjb25zdFR5cGVMaXRlcmFsczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGRpcmVjdGx5SW5zdGFudGlhdGVkQ2xhc3NlczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgSXRlcmFibGU8VHlwZVZhcmlhYmxlVHlwZT4gdHlwZVZhcmlhYmxlVHlwZUxpdGVyYWxzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBJdGVyYWJsZTxDbGFzc0VudGl0eT4gaW5zdGFudGlhdGVkQ2xhc3NlczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgSXRlcmFibGU8RGFydFR5cGU+IGlzQ2hlY2tzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBJdGVyYWJsZTxJbnRlcmZhY2VUeXBlPiBpbnN0YW50aWF0ZWRUeXBlczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgSXRlcmFibGU8RGFydFR5cGU+IGxpdmVUeXBlQXJndW1lbnRzOwoKICBmaW5hbCBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBfY29tcGlsZWRDb25zdGFudHM7CgogIGZpbmFsIE1hcDxTdHJpbmcsIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4+IF9pbnZva2VkTmFtZXM7CgogIGZpbmFsIE1hcDxTdHJpbmcsIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4+IF9pbnZva2VkR2V0dGVyczsKCiAgZmluYWwgTWFwPFN0cmluZywgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPj4gX2ludm9rZWRTZXR0ZXJzOwoKICBmaW5hbCBNYXA8RW50aXR5LCBTZXQ8RGFydFR5cGU+PiBfc3RhdGljVHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzOwoKICBmaW5hbCBNYXA8U2VsZWN0b3IsIFNldDxEYXJ0VHlwZT4+IF9keW5hbWljVHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBPbmVTaG90SW50ZXJjZXB0b3JEYXRhIG9uZVNob3RJbnRlcmNlcHRvckRhdGE7CgogIENvZGVnZW5Xb3JsZEltcGwodGhpcy5fY2xvc2VkV29ybGQsIHRoaXMuX2xpdmVNZW1iZXJVc2FnZSwKICAgICAge3RoaXMuY29uc3RUeXBlTGl0ZXJhbHMsCiAgICAgIHRoaXMuZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzLAogICAgICB0aGlzLnR5cGVWYXJpYWJsZVR5cGVMaXRlcmFscywKICAgICAgdGhpcy5pbnN0YW50aWF0ZWRDbGFzc2VzLAogICAgICB0aGlzLmlzQ2hlY2tzLAogICAgICB0aGlzLmluc3RhbnRpYXRlZFR5cGVzLAogICAgICB0aGlzLmxpdmVUeXBlQXJndW1lbnRzLAogICAgICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBjb21waWxlZENvbnN0YW50cywKICAgICAgTWFwPFN0cmluZywgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPj4gaW52b2tlZE5hbWVzLAogICAgICBNYXA8U3RyaW5nLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+PiBpbnZva2VkR2V0dGVycywKICAgICAgTWFwPFN0cmluZywgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPj4gaW52b2tlZFNldHRlcnMsCiAgICAgIE1hcDxFbnRpdHksIFNldDxEYXJ0VHlwZT4+IHN0YXRpY1R5cGVBcmd1bWVudERlcGVuZGVuY2llcywKICAgICAgTWFwPFNlbGVjdG9yLCBTZXQ8RGFydFR5cGU+PiBkeW5hbWljVHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzLAogICAgICB0aGlzLm9uZVNob3RJbnRlcmNlcHRvckRhdGF9KQogICAgICA6IF9jb21waWxlZENvbnN0YW50cyA9IGNvbXBpbGVkQ29uc3RhbnRzLAogICAgICAgIF9pbnZva2VkTmFtZXMgPSBpbnZva2VkTmFtZXMsCiAgICAgICAgX2ludm9rZWRHZXR0ZXJzID0gaW52b2tlZEdldHRlcnMsCiAgICAgICAgX2ludm9rZWRTZXR0ZXJzID0gaW52b2tlZFNldHRlcnMsCiAgICAgICAgX3N0YXRpY1R5cGVBcmd1bWVudERlcGVuZGVuY2llcyA9IHN0YXRpY1R5cGVBcmd1bWVudERlcGVuZGVuY2llcywKICAgICAgICBfZHluYW1pY1R5cGVBcmd1bWVudERlcGVuZGVuY2llcyA9IGR5bmFtaWNUeXBlQXJndW1lbnREZXBlbmRlbmNpZXM7CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFN0YXRpY0ZpZWxkKHZvaWQgRnVuY3Rpb24oRmllbGRFbnRpdHkpIGYpIHsKICAgIGJvb2wgZmFpbHVyZSA9IGZhbHNlOwogICAgX2xpdmVNZW1iZXJVc2FnZS5mb3JFYWNoKChNZW1iZXJFbnRpdHkgbWVtYmVyLCBNZW1iZXJVc2FnZSB1c2FnZSkgewogICAgICBpZiAobWVtYmVyIGlzIEZpZWxkRW50aXR5ICYmIChtZW1iZXIuaXNTdGF0aWMgfHwgbWVtYmVyLmlzVG9wTGV2ZWwpKSB7CiAgICAgICAgZihtZW1iZXIpOwogICAgICB9CiAgICB9KTsKICAgIGlmIChmYWlsdXJlKSB0aHJvdyAnZmFpbHVyZSc7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hHZW5lcmljTWV0aG9kKEZ1bmN0aW9uIGYpIHsKICAgIF9saXZlTWVtYmVyVXNhZ2UuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVXNhZ2UgdXNhZ2UpIHsKICAgICAgaWYgKG1lbWJlciBpcyBGdW5jdGlvbkVudGl0eSAmJgogICAgICAgICAgX2Nsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudAogICAgICAgICAgICAgIC5nZXRGdW5jdGlvblR5cGVWYXJpYWJsZXMobWVtYmVyKQogICAgICAgICAgICAgIC5pc05vdEVtcHR5KSB7CiAgICAgICAgZihtZW1iZXIpOwogICAgICB9CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaEdlbmVyaWNJbnN0YW5jZU1ldGhvZChGdW5jdGlvbiBmKSB7CiAgICBfbGl2ZU1lbWJlclVzYWdlLmZvckVhY2goKE1lbWJlckVudGl0eSBtZW1iZXIsIE1lbWJlclVzYWdlIHVzYWdlKSB7CiAgICAgIGlmIChtZW1iZXIgaXMgRnVuY3Rpb25FbnRpdHkgJiYKICAgICAgICAgIG1lbWJlci5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICAgICBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgICAgICAgLmdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhtZW1iZXIpCiAgICAgICAgICAgICAgLmlzTm90RW1wdHkpIHsKICAgICAgICBmKG1lbWJlcik7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoR2VuZXJpY0Nsb3N1cmVDYWxsTWV0aG9kKEZ1bmN0aW9uIGYpIHsKICAgIF9saXZlTWVtYmVyVXNhZ2UuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVXNhZ2UgdXNhZ2UpIHsKICAgICAgaWYgKG1lbWJlci5uYW1lID09IElkZW50aWZpZXJzLmNhbGwgJiYKICAgICAgICAgIG1lbWJlci5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICAgICBtZW1iZXIuZW5jbG9zaW5nQ2xhc3MuaXNDbG9zdXJlICYmCiAgICAgICAgICBtZW1iZXIgaXMgRnVuY3Rpb25FbnRpdHkgJiYKICAgICAgICAgIF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQKICAgICAgICAgICAgICAuZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKG1lbWJlcikKICAgICAgICAgICAgICAuaXNOb3RFbXB0eSkgewogICAgICAgIGYobWVtYmVyKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBMaXN0PEZ1bmN0aW9uRW50aXR5PiBfdXNlck5vU3VjaE1ldGhvZHNDYWNoZTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8RnVuY3Rpb25FbnRpdHk+IGdldCB1c2VyTm9TdWNoTWV0aG9kcyB7CiAgICBpZiAoX3VzZXJOb1N1Y2hNZXRob2RzQ2FjaGUgPT0gbnVsbCkgewogICAgICBfdXNlck5vU3VjaE1ldGhvZHNDYWNoZSA9IDxGdW5jdGlvbkVudGl0eT5bXTsKCiAgICAgIF9saXZlTWVtYmVyVXNhZ2UuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVXNhZ2UgbWVtYmVyVXNhZ2UpIHsKICAgICAgICBpZiAobWVtYmVyIGlzIEZ1bmN0aW9uRW50aXR5KSB7CiAgICAgICAgICBpZiAobWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICAgICAgICBtZW1iZXIubmFtZSA9PSBJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfICYmCiAgICAgICAgICAgICAgIV9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cwogICAgICAgICAgICAgICAgICAuaXNEZWZhdWx0Tm9TdWNoTWV0aG9kSW1wbGVtZW50YXRpb24obWVtYmVyKSkgewogICAgICAgICAgICBfdXNlck5vU3VjaE1ldGhvZHNDYWNoZS5hZGQobWVtYmVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiBfdXNlck5vU3VjaE1ldGhvZHNDYWNoZTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPExvY2FsPiBnZXQgZ2VuZXJpY0xvY2FsRnVuY3Rpb25zID0+IGNvbnN0IFtdOwoKICBTZXQ8RnVuY3Rpb25FbnRpdHk+IF9jbG9zdXJpemVkTWVtYmVyc0NhY2hlOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZ2V0IGNsb3N1cml6ZWRNZW1iZXJzIHsKICAgIGlmIChfY2xvc3VyaXplZE1lbWJlcnNDYWNoZSA9PSBudWxsKSB7CiAgICAgIF9jbG9zdXJpemVkTWVtYmVyc0NhY2hlID0ge307CiAgICAgIF9saXZlTWVtYmVyVXNhZ2UuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVXNhZ2UgdXNhZ2UpIHsKICAgICAgICBpZiAoKG1lbWJlci5pc0Z1bmN0aW9uIHx8IG1lbWJlciBpcyBKR2VuZXJhdG9yQm9keSkgJiYKICAgICAgICAgICAgbWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICAgICAgdXNhZ2UuaGFzUmVhZCkgewogICAgICAgICAgX2Nsb3N1cml6ZWRNZW1iZXJzQ2FjaGUuYWRkKG1lbWJlcik7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBfY2xvc3VyaXplZE1lbWJlcnNDYWNoZTsKICB9CgogIFNldDxGdW5jdGlvbkVudGl0eT4gX2Nsb3N1cml6ZWRTdGF0aWNzQ2FjaGU7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEZ1bmN0aW9uRW50aXR5PiBnZXQgY2xvc3VyaXplZFN0YXRpY3MgewogICAgaWYgKF9jbG9zdXJpemVkU3RhdGljc0NhY2hlID09IG51bGwpIHsKICAgICAgX2Nsb3N1cml6ZWRTdGF0aWNzQ2FjaGUgPSB7fTsKICAgICAgX2xpdmVNZW1iZXJVc2FnZS5mb3JFYWNoKChNZW1iZXJFbnRpdHkgbWVtYmVyLCBNZW1iZXJVc2FnZSB1c2FnZSkgewogICAgICAgIGlmIChtZW1iZXIuaXNGdW5jdGlvbiAmJgogICAgICAgICAgICAobWVtYmVyLmlzU3RhdGljIHx8IG1lbWJlci5pc1RvcExldmVsKSAmJgogICAgICAgICAgICB1c2FnZS5oYXNSZWFkKSB7CiAgICAgICAgICBfY2xvc3VyaXplZFN0YXRpY3NDYWNoZS5hZGQobWVtYmVyKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIF9jbG9zdXJpemVkU3RhdGljc0NhY2hlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoU3RhdGljVHlwZUFyZ3VtZW50KAogICAgICB2b2lkIGYoRW50aXR5IGZ1bmN0aW9uLCBTZXQ8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpKSB7CiAgICBfc3RhdGljVHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzLmZvckVhY2goZik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hEeW5hbWljVHlwZUFyZ3VtZW50KAogICAgICB2b2lkIGYoU2VsZWN0b3Igc2VsZWN0b3IsIFNldDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykpIHsKICAgIF9keW5hbWljVHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzLmZvckVhY2goZik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hJbnZva2VkTmFtZSgKICAgICAgZihTdHJpbmcgbmFtZSwgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBzZWxlY3RvcnMpKSB7CiAgICBfaW52b2tlZE5hbWVzLmZvckVhY2goZik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hJbnZva2VkR2V0dGVyKAogICAgICBmKFN0cmluZyBuYW1lLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IHNlbGVjdG9ycykpIHsKICAgIF9pbnZva2VkR2V0dGVycy5mb3JFYWNoKGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoSW52b2tlZFNldHRlcigKICAgICAgZihTdHJpbmcgbmFtZSwgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBzZWxlY3RvcnMpKSB7CiAgICBfaW52b2tlZFNldHRlcnMuZm9yRWFjaChmKTsKICB9CgogIGJvb2wgX2hhc01hdGNoaW5nU2VsZWN0b3IoTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBzZWxlY3RvcnMsCiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIsIEpDbG9zZWRXb3JsZCB3b3JsZCkgewogICAgaWYgKHNlbGVjdG9ycyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKFNlbGVjdG9yIHNlbGVjdG9yIGluIHNlbGVjdG9ycy5rZXlzKSB7CiAgICAgIGlmIChzZWxlY3Rvci5hcHBsaWVzVW5uYW1lZChtZW1iZXIpKSB7CiAgICAgICAgU2VsZWN0b3JDb25zdHJhaW50cyBtYXNrcyA9IHNlbGVjdG9yc1tzZWxlY3Rvcl07CiAgICAgICAgaWYgKG1hc2tzLmNhbkhpdChtZW1iZXIsIHNlbGVjdG9yLm1lbWJlck5hbWUsIHdvcmxkKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc0ludm9rZWRHZXR0ZXIoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgTWVtYmVyVXNhZ2UgbWVtYmVyVXNhZ2UgPSBfbGl2ZU1lbWJlclVzYWdlW21lbWJlcl07CiAgICBpZiAobWVtYmVyVXNhZ2UgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIG1lbWJlclVzYWdlLnJlYWRzLmNvbnRhaW5zKEFjY2Vzcy5keW5hbWljQWNjZXNzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgbWV0aG9kc05lZWRzU3VwZXJHZXR0ZXIoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgIE1lbWJlclVzYWdlIG1lbWJlclVzYWdlID0gX2xpdmVNZW1iZXJVc2FnZVtmdW5jdGlvbl07CiAgICBpZiAobWVtYmVyVXNhZ2UgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIG1lbWJlclVzYWdlLnJlYWRzLmNvbnRhaW5zKEFjY2Vzcy5zdXBlckFjY2Vzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc0ludm9rZWRTZXR0ZXIoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgTWVtYmVyVXNhZ2UgbWVtYmVyVXNhZ2UgPSBfbGl2ZU1lbWJlclVzYWdlW21lbWJlcl07CiAgICBpZiAobWVtYmVyVXNhZ2UgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIG1lbWJlclVzYWdlLndyaXRlcy5jb250YWlucyhBY2Nlc3MuZHluYW1pY0FjY2Vzcyk7CiAgfQoKICBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IF9hc1VubW9kaWZpYWJsZSgKICAgICAgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBtYXApIHsKICAgIGlmIChtYXAgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmV3IFVubW9kaWZpYWJsZU1hcFZpZXcobWFwKTsKICB9CgogIEBvdmVycmlkZQogIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4gaW52b2NhdGlvbnNCeU5hbWUoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBfYXNVbm1vZGlmaWFibGUoX2ludm9rZWROYW1lc1tuYW1lXSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxTZWxlY3Rvcj4gZ2V0dGVySW52b2NhdGlvbnNCeU5hbWUoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBfaW52b2tlZEdldHRlcnNbbmFtZV0/LmtleXM7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxTZWxlY3Rvcj4gc2V0dGVySW52b2NhdGlvbnNCeU5hbWUoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBfaW52b2tlZFNldHRlcnNbbmFtZV0/LmtleXM7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBnZXRDb25zdGFudHNGb3JFbWlzc2lvbigKICAgICAgW0NvbXBhcmF0b3I8Q29uc3RhbnRWYWx1ZT4gcHJlU29ydENvbXBhcmVdKSB7CiAgICAvLyBXZSBtdXN0IGVtaXQgZGVwZW5kZW5jaWVzIGJlZm9yZSB0aGVpciB1c2VzLgogICAgU2V0PENvbnN0YW50VmFsdWU+IHNlZW5Db25zdGFudHMgPSBuZXcgU2V0PENvbnN0YW50VmFsdWU+KCk7CiAgICBMaXN0PENvbnN0YW50VmFsdWU+IHJlc3VsdCA9IG5ldyBMaXN0PENvbnN0YW50VmFsdWU+KCk7CgogICAgdm9pZCBhZGRDb25zdGFudChDb25zdGFudFZhbHVlIGNvbnN0YW50KSB7CiAgICAgIGlmICghc2VlbkNvbnN0YW50cy5jb250YWlucyhjb25zdGFudCkpIHsKICAgICAgICBjb25zdGFudC5nZXREZXBlbmRlbmNpZXMoKS5mb3JFYWNoKGFkZENvbnN0YW50KTsKICAgICAgICBhc3NlcnQoIXNlZW5Db25zdGFudHMuY29udGFpbnMoY29uc3RhbnQpKTsKICAgICAgICByZXN1bHQuYWRkKGNvbnN0YW50KTsKICAgICAgICBzZWVuQ29uc3RhbnRzLmFkZChjb25zdGFudCk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAocHJlU29ydENvbXBhcmUgIT0gbnVsbCkgewogICAgICBMaXN0PENvbnN0YW50VmFsdWU+IHNvcnRlZCA9IF9jb21waWxlZENvbnN0YW50cy50b0xpc3QoKTsK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dmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2lyL3N0YXRpY190eXBlLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYW5ub3RhdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9maWVsZF9hbmFseXNpcy5kYXJ0JyBzaG93IEtGaWVsZEFuYWx5c2lzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYmFja2VuZF91c2FnZS5kYXJ0JwogICAgc2hvdyBCYWNrZW5kVXNhZ2UsIEJhY2tlbmRVc2FnZUJ1aWxkZXI7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnQnIHNob3cgSW50ZXJjZXB0b3JEYXRhQnVpbGRlcjsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hdGl2ZV9kYXRhLmRhcnQnIHNob3cgTmF0aXZlQmFzaWNEYXRhLCBOYXRpdmVEYXRhQnVpbGRlcjsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25vX3N1Y2hfbWV0aG9kX3JlZ2lzdHJ5LmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvcnVudGltZV90eXBlc19yZXNvbHV0aW9uLmRhcnQnOwppbXBvcnQgJy4uL2tlcm5lbC9lbGVtZW50X21hcF9pbXBsLmRhcnQnOwppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfd29ybGQuZGFydCc7CmltcG9ydCAnLi4vbmF0aXZlL2VucXVldWUuZGFydCcgc2hvdyBOYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXI7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL2VudW1zZXQuZGFydCc7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgS0Nsb3NlZFdvcmxkLCBPcGVuV29ybGQ7CmltcG9ydCAnY2FsbF9zdHJ1Y3R1cmUuZGFydCc7CmltcG9ydCAnY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyLCBDbGFzc1F1ZXJpZXM7CmltcG9ydCAnY2xhc3Nfc2V0LmRhcnQnOwppbXBvcnQgJ21lbWJlcl91c2FnZS5kYXJ0JzsKaW1wb3J0ICdzZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwppbXBvcnQgJ3VzZS5kYXJ0JwogICAgc2hvdyBDb25zdGFudFVzZSwgRHluYW1pY1VzZSwgRHluYW1pY1VzZUtpbmQsIFN0YXRpY1VzZSwgU3RhdGljVXNlS2luZDsKaW1wb3J0ICd3b3JsZF9idWlsZGVyLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgUmVzb2x1dGlvbldvcmxkQnVpbGRlciBpbXBsZW1lbnRzIFdvcmxkQnVpbGRlciwgT3BlbldvcmxkIHsKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW21lbWJlcl0gaGFzIGJlZW4gbWFya2VkIGFzIHVzZWQgKGNhbGxlZCwgcmVhZCwgZXRjLikgaW4KICAvLy8gdGhpcyB3b3JsZCBidWlsZGVyLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1heWJlIHRoaXMgc2hvdWxkIGJlIHBhcnQgb2YgW0Nsb3NlZFdvcmxkXSAoaW5zdGVhZCkuCiAgYm9vbCBpc01lbWJlclVzZWQoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBUaGUgY2xvc2VkIHdvcmxkIGNvbXB1dGVkIGJ5IHRoaXMgd29ybGQgYnVpbGRlci4KICAvLy8KICAvLy8gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgd29ybGQgYnVpbGRlciBoYXMgYmVlbiBjbG9zZWQuCiAgS0Nsb3NlZFdvcmxkIGdldCBjbG9zZWRXb3JsZEZvclRlc3Rpbmc7CgogIHZvaWQgcmVnaXN0ZXJDbGFzcyhDbGFzc0VudGl0eSBjbHMpOwp9CgovLy8gRXh0ZW5kZWQgW1Jlc29sdXRpb25Xb3JsZEJ1aWxkZXJdIGludGVyZmFjZSB1c2VkIGJ5IHRoZQovLy8gW1Jlc29sdXRpb25FbnF1ZXVlcl0uCmFic3RyYWN0IGNsYXNzIFJlc29sdXRpb25FbnF1ZXVlcldvcmxkQnVpbGRlciBleHRlbmRzIFJlc29sdXRpb25Xb3JsZEJ1aWxkZXIgewogIC8vLyBSZXR1cm5zIHRoZSBjbGFzc2VzIHJlZ2lzdGVyZWQgYXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnN0YW50aWF0ZWQuCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCBwcm9jZXNzZWRDbGFzc2VzOwoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgW2VsZW1lbnRdIGhhcyBiZWVuIGNsb3N1cml6ZWQuCiAgdm9pZCByZWdpc3RlckNsb3N1cml6ZWRNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmVnaXN0ZXIgW3R5cGVdIGFzIChkaXJlY3RseSkgaW5zdGFudGlhdGVkLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEZ1bGx5IGVuZm9yY2UgdGhlIHNlcGFyYXRpb24gYmV0d2VlbiBleGFjdCwgdGhyb3VnaAogIC8vIHN1YmNsYXNzIGFuZCB0aHJvdWdoIHN1YnR5cGUgaW5zdGFudGlhdGVkIHR5cGVzL2NsYXNzZXMuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCB1bmtub3duIHR5cGUgYXJndW1lbnRzIGZvciBnZW5lcmljIHR5cGVzLgogIHZvaWQgcmVnaXN0ZXJUeXBlSW5zdGFudGlhdGlvbigKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlLCBDbGFzc1VzZWRDYWxsYmFjayBjbGFzc1VzZWQsCiAgICAgIHtDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3Rvcn0pOwoKICAvLy8gQ29tcHV0ZXMgdXNhZ2UgZm9yIGFsbCBtZW1iZXJzIGRlY2xhcmVkIGJ5IFtjbHNdLiBDYWxscyBbbWVtYmVyc1VzZWRdIHdpdGgKICAvLy8gdGhlIHVzYWdlIGNoYW5nZXMgZm9yIGVhY2ggbWVtYmVyLgogIC8vLwogIC8vLyBJZiBbY2hlY2tFbnF1ZXVlckNvbnNpc3RlbmN5XSBpcyBgdHJ1ZWAgd2UgY2hlY2sgdGhhdCBubyBuZXcgbWVtYmVyCiAgLy8vIHVzYWdlIGNhbiBiZSBmb3VuZC4gVGhpcyBjaGVjayBpcyBwZXJmb3JtZWQgd2l0aG91dCBjaGFuZ2luZyB0aGUgYWxyZWFkeQogIC8vLyBjb2xsZWN0ZWQgbWVtYmVyIHVzYWdlLgogIHZvaWQgcHJvY2Vzc0NsYXNzTWVtYmVycyhDbGFzc0VudGl0eSBjbHMsIE1lbWJlclVzZWRDYWxsYmFjayBtZW1iZXJVc2VkLAogICAgICB7Ym9vbCBjaGVja0VucXVldWVyQ29uc2lzdGVuY3k6IGZhbHNlfSk7CgogIC8vLyBBcHBsaWVzIHRoZSBbZHluYW1pY1VzZV0gdG8gYXBwbGljYWJsZSBpbnN0YW5jZSBtZW1iZXJzLiBDYWxscwogIC8vLyBbbWVtYmVyc1VzZWRdIHdpdGggdGhlIHVzYWdlIGNoYW5nZXMgZm9yIGVhY2ggbWVtYmVyLgogIHZvaWQgcmVnaXN0ZXJEeW5hbWljVXNlKER5bmFtaWNVc2UgZHluYW1pY1VzZSwgTWVtYmVyVXNlZENhbGxiYWNrIG1lbWJlclVzZWQpOwoKICAvLy8gQXBwbGllcyB0aGUgW3N0YXRpY1VzZV0gdG8gYXBwbGljYWJsZSBtZW1iZXJzLiBDYWxscyBbbWVtYmVyc1VzZWRdIHdpdGgKICAvLy8gdGhlIHVzYWdlIGNoYW5nZXMgZm9yIGVhY2ggbWVtYmVyLgogIHZvaWQgcmVnaXN0ZXJTdGF0aWNVc2UoU3RhdGljVXNlIHN0YXRpY1VzZSwgTWVtYmVyVXNlZENhbGxiYWNrIG1lbWJlclVzZWQpOwoKICAvLy8gUmVnaXN0ZXIgdGhlIGNvbnN0YW50IFt1c2VdIHdpdGggdGhpcyB3b3JsZCBidWlsZGVyLiBSZXR1cm5zIGB0cnVlYCBpZgogIC8vLyB0aGUgY29uc3RhbnQgdXNlIHdhcyBuZXcgdG8gdGhlIHdvcmxkLgogIGJvb2wgcmVnaXN0ZXJDb25zdGFudFVzZShDb25zdGFudFVzZSB1c2UpOwoKICBib29sIGlzTWVtYmVyUHJvY2Vzc2VkKE1lbWJlckVudGl0eSBtZW1iZXIpOwogIHZvaWQgcmVnaXN0ZXJQcm9jZXNzZWRNZW1iZXIoTWVtYmVyRW50aXR5IG1lbWJlcik7CiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXQgcHJvY2Vzc2VkTWVtYmVyczsKCiAgLy8vIFJlZ2lzdGVycyB0aGF0IFt0eXBlXSBpcyBjaGVja2VkIGluIHRoaXMgd29ybGQgYnVpbGRlci4gVGhlIHVuYWxpYXNlZCB0eXBlCiAgLy8vIGlzIHJldHVybmVkLgogIHZvaWQgcmVnaXN0ZXJJc0NoZWNrKERhcnRUeXBlIHR5cGUpOwoKICB2b2lkIHJlZ2lzdGVyVHlwZVZhcmlhYmxlVHlwZUxpdGVyYWwoVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUpOwp9CgovLy8gVGhlIHR5cGUgYW5kIGtpbmQgb2YgYW4gaW5zdGFudGlhdGlvbiByZWdpc3RlcmVkIHRocm91Z2gKLy8vIGBSZXNvbHV0aW9uV29ybGRCdWlsZGVyLnJlZ2lzdGVyVHlwZUluc3RhbnRpYXRpb25gLgpjbGFzcyBJbnN0YW5jZSB7CiAgZmluYWwgSW50ZXJmYWNlVHlwZSB0eXBlOwogIGZpbmFsIEluc3RhbnRpYXRpb24ga2luZDsKCiAgSW5zdGFuY2UodGhpcy50eXBlLCB0aGlzLmtpbmQpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBIYXNoaW5nLm9iamVjdEhhc2godHlwZSwgSGFzaGluZy5vYmplY3RIYXNoKGtpbmQpKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgSW5zdGFuY2UpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0eXBlID09IG90aGVyLnR5cGUgJiYga2luZCA9PSBvdGhlci5raW5kOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUodHlwZSk7CiAgICBpZiAoa2luZCA9PSBJbnN0YW50aWF0aW9uLkRJUkVDVExZX0lOU1RBTlRJQVRFRCkgewogICAgICBzYi53cml0ZSgnIGRpcmVjdGx5Jyk7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gSW5zdGFudGlhdGlvbi5BQlNUUkFDVExZX0lOU1RBTlRJQVRFRCkgewogICAgICBzYi53cml0ZSgnIGFic3RyYWN0bHknKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBJbnN0YW50aWF0aW9uLlVOSU5TVEFOVElBVEVEKSB7CiAgICAgIHNiLndyaXRlKCcgbm9uZScpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgovLy8gSW5mb3JtYXRpb24gYWJvdXQgaW5zdGFudGlhdGlvbnMgb2YgYSBjbGFzcy4KY2xhc3MgSW5zdGFudGlhdGlvbkluZm8gewogIC8vLyBBIG1hcCBmcm9tIGNvbnN0cnVjdG9yIG9mIHRoZSBjbGFzcyB0byB0aGVpciBpbnN0YW50aWF0ZWQgdHlwZXMuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZQogIC8vLwogIC8vLyAgICBpbXBvcnQgJ2RhcnQ6aHRtbCc7CiAgLy8vCiAgLy8vICAgIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2xhc3M8Uz4gewogIC8vLyAgICAgIGZhY3RvcnkgQWJzdHJhY3RDbGFzcy5hKCkgPSBDbGFzczxTPi5hOwogIC8vLyAgICAgIGZhY3RvcnkgQWJzdHJhY3RDbGFzcy5iKCkgPT4gbmV3IENsYXNzPFM+LmIoKTsKICAvLy8gICAgfQogIC8vLyAgICBjbGFzcyBDbGFzczxUPiBpbXBsZW1lbnRzIEFic3RyYWN0Q2xhc3M8VD4gewogIC8vLyAgICAgIENsYXNzLmEoKTsKICAvLy8gICAgICBDbGFzcy5iKCk7CiAgLy8vICAgICAgZmFjdG9yeSBDbGFzcy5jKCkgPSBDbGFzcy5iPFQ+OwogIC8vLyAgICB9CiAgLy8vCiAgLy8vCiAgLy8vICAgIG1haW4oKSB7CiAgLy8vICAgICAgbmV3IENsYXNzLmEoKTsKICAvLy8gICAgICBuZXcgQ2xhc3M8aW50Pi5hKCk7CiAgLy8vICAgICAgbmV3IENsYXNzPFN0cmluZz4uYigpOwogIC8vLyAgICAgIG5ldyBDbGFzczxudW0+LmMoKTsKICAvLy8gICAgICBuZXcgQWJzdHJhY3RDbGFzczxkb3VibGU+LmEoKTsKICAvLy8gICAgICBuZXcgQWJzdHJhY3RDbGFzczxib29sPi5iKCk7CiAgLy8vICAgICAgbmV3IERpdkVsZW1lbnQoKTsgLy8gbmF0aXZlIGluc3RhbnRpYXRpb24KICAvLy8gICAgfQogIC8vLwogIC8vLyB3aWxsIGdlbmVyYXRlIHRoZSBtYXBwaW5ncwogIC8vLwogIC8vLyAgICBBYnN0cmFjdENsYXNzOiB7CiAgLy8vICAgICAgQWJzdHJhY3RDbGFzcy5hOiB7CiAgLy8vICAgICAgICBBYnN0cmFjdENsYXNzPGRvdWJsZT4gbm9uZSwgLy8gZnJvbSBgbmV3IEFic3RyYWN0Q2xhc3M8ZG91YmxlPi5hKClgCiAgLy8vICAgICAgfSwKICAvLy8gICAgICBBYnN0cmFjdENsYXNzLmI6IHsKICAvLy8gICAgICAgIEFic3RyYWN0Q2xhc3M8Ym9vbD4gbm9uZSwgLy8gZnJvbSBgbmV3IEFic3RyYWN0Q2xhc3M8Ym9vbD4uYigpYAogIC8vLyAgICAgIH0sCiAgLy8vICAgIH0sCiAgLy8vICAgIENsYXNzOiB7CiAgLy8vICAgICAgQ2xhc3MuYTogewogIC8vLyAgICAgICAgQ2xhc3MgZGlyZWN0bHksIC8vIGZyb20gYG5ldyBDbGFzcy5hKClgCiAgLy8vICAgICAgICBDbGFzczxpbnQ+IGRpcmVjdGx5LCAvLyBmcm9tIGBuZXcgQ2xhc3M8aW50Pi5hKClgCiAgLy8vICAgICAgICBDbGFzczxTPiBkaXJlY3RseSByZWRpcmVjdCwgLy8gZnJvbSBgZmFjdG9yeSBBYnN0cmFjdENsYXNzLmFgCiAgLy8vICAgICAgfSwKICAvLy8gICAgICBDbGFzcy5iOiB7CiAgLy8vICAgICAgICBDbGFzczxTdHJpbmc+IGRpcmVjdGx5LCAvLyBmcm9tIGBuZXcgQ2xhc3M8U3RyaW5nPi5iKClgCiAgLy8vICAgICAgICBDbGFzczxUPiBkaXJlY3RseSByZWRpcmVjdCwgLy8gZnJvbSBgZmFjdG9yeSBDbGFzcy5jYAogIC8vLyAgICAgICAgQ2xhc3M8Uz4gZGlyZWN0bHksIC8vIGZyb20gYGZhY3RvcnkgQWJzdHJhY3RDbGFzcy5iYAogIC8vLyAgICAgIH0sCiAgLy8vICAgICAgQ2xhc3MuYzogewogIC8vLyAgICAgICAgQ2xhc3M8bnVtPiBkaXJlY3RseSwgLy8gZnJvbSBgbmV3IENsYXNzPG51bT4uYygpYAogIC8vLyAgICAgIH0sCiAgLy8vICAgIH0sCiAgLy8vICAgIERpdkVsZW1lbnQ6IHsKICAvLy8gICAgICBEaXZFbGVtZW50OiB7CiAgLy8vICAgICAgICBEaXZFbGVtZW50IGFic3RyYWN0bHksIC8vIGZyb20gYG5ldyBEaXZFbGVtZW50KClgCiAgLy8vICAgICAgfSwKICAvLy8gICAgfQogIC8vLwogIC8vLyBJZiB0aGUgY29uc3RydWN0b3IgaXMgdW5rbm93biwgZm9yIGluc3RhbmNlIGZvciBuYXRpdmUgb3IgbWlycm9yIHVzYWdlLAogIC8vLyBgbnVsbGAgaXMgdXNlZCBhcyBrZXkuCiAgTWFwPENvbnN0cnVjdG9yRW50aXR5LCBTZXQ8SW5zdGFuY2U+PiBpbnN0YW50aWF0aW9uTWFwOwoKICAvLy8gUmVnaXN0ZXIgW3R5cGVdIGFzIHRoZSBpbnN0YW50aWF0aW9uIFtraW5kXSB1c2luZyBbY29uc3RydWN0b3JdLgogIHZvaWQgYWRkSW5zdGFudGlhdGlvbigKICAgICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IsIEludGVyZmFjZVR5cGUgdHlwZSwgSW5zdGFudGlhdGlvbiBraW5kKSB7CiAgICBpbnN0YW50aWF0aW9uTWFwID8/PSA8Q29uc3RydWN0b3JFbnRpdHksIFNldDxJbnN0YW5jZT4+e307CiAgICBpbnN0YW50aWF0aW9uTWFwCiAgICAgICAgLnB1dElmQWJzZW50KGNvbnN0cnVjdG9yLCAoKSA9PiBuZXcgU2V0PEluc3RhbmNlPigpKQogICAgICAgIC5hZGQobmV3IEluc3RhbmNlKHR5cGUsIGtpbmQpKTsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIEluc3RhbnRpYXRpb24uRElSRUNUTFlfSU5TVEFOVElBVEVEOgogICAgICAgIGlzRGlyZWN0bHlJbnN0YW50aWF0ZWQgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEluc3RhbnRpYXRpb24uQUJTVFJBQ1RMWV9JTlNUQU5USUFURUQ6CiAgICAgICAgaXNBYnN0cmFjdGx5SW5zdGFudGlhdGVkID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBJbnN0YW50aWF0aW9uLlVOSU5TVEFOVElBVEVEOgogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJJbnN0YW50aWF0aW9uICRraW5kIGlzIG5vdCBhbGxvd2VkLiIpOwogICAgfQogIH0KCiAgLy8vIGB0cnVlYCBpZiB0aGUgY2xhc3MgaXMgZWl0aGVyIGRpcmVjdGx5IG9yIGFic3RyYWN0bHkgaW5zdGFudGlhdGVkLgogIGJvb2wgZ2V0IGhhc0luc3RhbnRpYXRpb24gPT4KICAgICAgaXNEaXJlY3RseUluc3RhbnRpYXRlZCB8fCBpc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWQ7CgogIC8vLyBgdHJ1ZWAgaWYgdGhlIGNsYXNzIGlzIGRpcmVjdGx5IGluc3RhbnRpYXRlZC4KICBib29sIGlzRGlyZWN0bHlJbnN0YW50aWF0ZWQgPSBmYWxzZTsKCiAgLy8vIGB0cnVlYCBpZiB0aGUgY2xhc3MgaXMgYWJzdHJhY3RseSBpbnN0YW50aWF0ZWQuCiAgYm9vbCBpc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWQgPSBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ0luc3RhbnRpYXRpb25JbmZvWycpOwogICAgaWYgKGluc3RhbnRpYXRpb25NYXAgIT0gbnVsbCkgewogICAgICBib29sIG5lZWRzQ29tbWEgPSBmYWxzZTsKICAgICAgaW5zdGFudGlhdGlvbk1hcAogICAgICAgICAgLmZvckVhY2goKENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yLCBTZXQ8SW5zdGFuY2U+IHNldCkgewogICAgICAgIGlmIChuZWVkc0NvbW1hKSB7CiAgICAgICAgICBzYi53cml0ZSgnLCAnKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbnN0cnVjdG9yICE9IG51bGwpIHsKICAgICAgICAgIHNiLndyaXRlKGNvbnN0cnVjdG9yKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2Iud3JpdGUoJzx1bmtub3duPicpOwogICAgICAgIH0KICAgICAgICBzYi53cml0ZSgnOiAnKTsKICAgICAgICBzYi53cml0ZShzZXQpOwogICAgICAgIG5lZWRzQ29tbWEgPSB0cnVlOwogICAgICB9KTsKICAgIH0KICAgIHNiLndyaXRlKCddJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbUmVzb2x1dGlvbkVucXVldWVyV29ybGRCdWlsZGVyXS4KY2xhc3MgUmVzb2x1dGlvbldvcmxkQnVpbGRlckltcGwgZXh0ZW5kcyBXb3JsZEJ1aWxkZXJCYXNlCiAgICBpbXBsZW1lbnRzIFJlc29sdXRpb25FbnF1ZXVlcldvcmxkQnVpbGRlciB7CiAgLy8vIEluc3RhbnRpYXRpb24gaW5mb3JtYXRpb24gZm9yIGFsbCBjbGFzc2VzIHdpdGggaW5zdGFudGlhdGVkIHR5cGVzLgogIC8vLwogIC8vLyBJbnZhcmlhbnQ6IEVsZW1lbnRzIGFyZSBkZWNsYXJhdGlvbiBlbGVtZW50cy4KICBmaW5hbCBNYXA8Q2xhc3NFbnRpdHksIEluc3RhbnRpYXRpb25JbmZvPiBfaW5zdGFudGlhdGlvbkluZm8gPQogICAgICA8Q2xhc3NFbnRpdHksIEluc3RhbnRpYXRpb25JbmZvPnt9OwoKICAvLy8gQ2xhc3NlcyBpbXBsZW1lbnRlZCBieSBkaXJlY3RseSBpbnN0YW50aWF0ZWQgY2xhc3Nlcy4KICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IF9pbXBsZW1lbnRlZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICAvLy8gVGhlIHNldCBvZiBhbGwgcmVmZXJlbmNlZCBzdGF0aWMgZmllbGRzLgogIC8vLwogIC8vLyBJbnZhcmlhbnQ6IEVsZW1lbnRzIGFyZSBkZWNsYXJhdGlvbiBlbGVtZW50cy4KICBmaW5hbCBTZXQ8RmllbGRFbnRpdHk+IF9hbGxSZWZlcmVuY2VkU3RhdGljRmllbGRzID0gbmV3IFNldDxGaWVsZEVudGl0eT4oKTsKCiAgLy8vIERvY3VtZW50YXRpb24gd2FudGVkIC0tIGpvaG5uaXdpbnRoZXIKICAvLy8KICAvLy8gSW52YXJpYW50OiBFbGVtZW50cyBhcmUgZGVjbGFyYXRpb24gZWxlbWVudHMuCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBfbWV0aG9kc05lZWRpbmdTdXBlckdldHRlciA9CiAgICAgIG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CiAgZmluYWwgTWFwPFN0cmluZywgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPj4gX2ludm9rZWROYW1lcyA9CiAgICAgIDxTdHJpbmcsIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4+e307CiAgZmluYWwgTWFwPFN0cmluZywgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPj4gX2ludm9rZWRHZXR0ZXJzID0KICAgICAgPFN0cmluZywgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPj57fTsKICBmaW5hbCBNYXA8U3RyaW5nLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+PiBfaW52b2tlZFNldHRlcnMgPQogICAgICA8U3RyaW5nLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+Pnt9OwoKICBmaW5hbCBNYXA8Q2xhc3NFbnRpdHksIENsYXNzVXNhZ2U+IF9wcm9jZXNzZWRDbGFzc2VzID0KICAgICAgPENsYXNzRW50aXR5LCBDbGFzc1VzYWdlPnt9OwoKICBNYXA8Q2xhc3NFbnRpdHksIENsYXNzVXNhZ2U+IGdldCBjbGFzc1VzYWdlRm9yVGVzdGluZyA9PiBfcHJvY2Vzc2VkQ2xhc3NlczsKCiAgLy8vIE1hcCBvZiByZWdpc3RlcmVkIHVzYWdlIG9mIG1lbWJlcnMgb2YgbGl2ZSBjbGFzc2VzLgogIGZpbmFsIE1hcDxNZW1iZXJFbnRpdHksIE1lbWJlclVzYWdlPiBfbWVtYmVyVXNhZ2UgPQogICAgICA8TWVtYmVyRW50aXR5LCBNZW1iZXJVc2FnZT57fTsKCiAgTWFwPE1lbWJlckVudGl0eSwgTWVtYmVyVXNhZ2U+IGdldCBtZW1iZXJVc2FnZUZvclRlc3RpbmcgPT4gX21lbWJlclVzYWdlOwoKICAvLy8gTWFwIGNvbnRhaW5pbmcgaW5zdGFuY2UgbWVtYmVycyBvZiBsaXZlIGNsYXNzZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbgogIC8vLyBmdWxseSBpbnZva2VkIGR5bmFtaWNhbGx5LgogIC8vLwogIC8vLyBBIG1ldGhvZCBpcyBmdWxseSBpbnZva2VkIGlmIGFsbCBpcyBvcHRpb25hbCBwYXJhbWV0ZXIgaGF2ZSBiZWVuIHBhc3NlZAogIC8vLyBpbiBzb21lIGludm9jYXRpb24uCiAgZmluYWwgTWFwPFN0cmluZywgU2V0PE1lbWJlclVzYWdlPj4gX2ludm9rYWJsZUluc3RhbmNlTWVtYmVyc0J5TmFtZSA9CiAgICAgIDxTdHJpbmcsIFNldDxNZW1iZXJVc2FnZT4+e307CgogIC8vLyBNYXAgY29udGFpbmluZyBpbnN0YW5jZSBtZW1iZXJzIG9mIGxpdmUgY2xhc3NlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuCiAgLy8vIHJlYWQgZnJvbSBkeW5hbWljYWxseS4KICBmaW5hbCBNYXA8U3RyaW5nLCBTZXQ8TWVtYmVyVXNhZ2U+PiBfcmVhZGFibGVJbnN0YW5jZU1lbWJlcnNCeU5hbWUgPQogICAgICA8U3RyaW5nLCBTZXQ8TWVtYmVyVXNhZ2U+Pnt9OwoKICAvLy8gTWFwIGNvbnRhaW5pbmcgaW5zdGFuY2UgbWVtYmVycyBvZiBsaXZlIGNsYXNzZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbgogIC8vLyB3cml0dGVuIHRvIGR5bmFtaWNhbGx5LgogIGZpbmFsIE1hcDxTdHJpbmcsIFNldDxNZW1iZXJVc2FnZT4+IF93cml0YWJsZUluc3RhbmNlTWVtYmVyc0J5TmFtZSA9CiAgICAgIDxTdHJpbmcsIFNldDxNZW1iZXJVc2FnZT4+e307CgogIGZpbmFsIFNldDxGaWVsZEVudGl0eT4gX2ZpZWxkU2V0dGVycyA9IG5ldyBTZXQ8RmllbGRFbnRpdHk+KCk7CgogIGZpbmFsIFNldDxEYXJ0VHlwZT4gX2lzQ2hlY2tzID0gbmV3IFNldDxEYXJ0VHlwZT4oKTsKCiAgLy8vIFNldCBvZiBhbGwgY2xvc3VyZXMgaW4gdGhlIHByb2dyYW0uIFVzZWQgYnkgdGhlIG1pcnJvciB0cmFja2luZyBzeXN0ZW0KICAvLy8gdG8gZmluZCBhbGwgbGl2ZSBjbG9zdXJlIGluc3RhbmNlcy4KICBmaW5hbCBTZXQ8TG9jYWw+IF9sb2NhbEZ1bmN0aW9ucyA9IG5ldyBTZXQ8TG9jYWw+KCk7CgogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gX2Nsb3N1cml6ZWRNZW1iZXJzV2l0aEZyZWVUeXBlVmFyaWFibGVzID0KICAgICAgbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKCiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIERhcnRUeXBlcyBfZGFydFR5cGVzOwogIGZpbmFsIENvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKCiAgZmluYWwgTmF0aXZlQmFzaWNEYXRhIF9uYXRpdmVCYXNpY0RhdGE7CiAgZmluYWwgTmF0aXZlRGF0YUJ1aWxkZXIgX25hdGl2ZURhdGFCdWlsZGVyOwogIGZpbmFsIEludGVyY2VwdG9yRGF0YUJ1aWxkZXIgX2ludGVyY2VwdG9yRGF0YUJ1aWxkZXI7CiAgZmluYWwgQmFja2VuZFVzYWdlQnVpbGRlciBfYmFja2VuZFVzYWdlQnVpbGRlcjsKICBmaW5hbCBSdW50aW1lVHlwZXNOZWVkQnVpbGRlciBfcnRpTmVlZEJ1aWxkZXI7CiAgZmluYWwgS0ZpZWxkQW5hbHlzaXMgX2FsbG9jYXRvckFuYWx5c2lzOwogIGZpbmFsIE5hdGl2ZVJlc29sdXRpb25FbnF1ZXVlciBfbmF0aXZlUmVzb2x1dGlvbkVucXVldWVyOwogIGZpbmFsIE5vU3VjaE1ldGhvZFJlZ2lzdHJ5IF9ub1N1Y2hNZXRob2RSZWdpc3RyeTsKICBmaW5hbCBBbm5vdGF0aW9uc0RhdGFCdWlsZGVyIF9hbm5vdGF0aW9uc0RhdGFCdWlsZGVyOwoKICBmaW5hbCBTZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kgX3NlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneTsKICBmaW5hbCBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgX2NsYXNzSGllcmFyY2h5QnVpbGRlcjsKICBmaW5hbCBDbGFzc1F1ZXJpZXMgX2NsYXNzUXVlcmllczsKCiAgYm9vbCBfY2xvc2VkID0gZmFsc2U7CiAgS0Nsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZENhY2hlOwogIGZpbmFsIFNldDxNZW1iZXJFbnRpdHk+IF9saXZlSW5zdGFuY2VNZW1iZXJzID0gbmV3IFNldDxNZW1iZXJFbnRpdHk+KCk7CgogIGZpbmFsIFNldDxDb25zdGFudFZhbHVlPiBfY29uc3RhbnRWYWx1ZXMgPSBuZXcgU2V0PENvbnN0YW50VmFsdWU+KCk7CgogIGZpbmFsIFNldDxMb2NhbD4gX2dlbmVyaWNMb2NhbEZ1bmN0aW9ucyA9IG5ldyBTZXQ8TG9jYWw+KCk7CgogIFNldDxNZW1iZXJFbnRpdHk+IF9wcm9jZXNzZWRNZW1iZXJzID0gbmV3IFNldDxNZW1iZXJFbnRpdHk+KCk7CgogIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IF9jbG9zZWQ7CgogIGZpbmFsIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgX2VsZW1lbnRNYXA7CgogIFJlc29sdXRpb25Xb3JsZEJ1aWxkZXJJbXBsKAogICAgICB0aGlzLl9vcHRpb25zLAogICAgICB0aGlzLl9lbGVtZW50TWFwLAogICAgICB0aGlzLl9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIHRoaXMuX2RhcnRUeXBlcywKICAgICAgdGhpcy5fY29tbW9uRWxlbWVudHMsCiAgICAgIHRoaXMuX25hdGl2ZUJhc2ljRGF0YSwKICAgICAgdGhpcy5fbmF0aXZlRGF0YUJ1aWxkZXIsCiAgICAgIHRoaXMuX2ludGVyY2VwdG9yRGF0YUJ1aWxkZXIsCiAgICAgIHRoaXMuX2JhY2tlbmRVc2FnZUJ1aWxkZXIsCiAgICAgIHRoaXMuX3J0aU5lZWRCdWlsZGVyLAogICAgICB0aGlzLl9hbGxvY2F0b3JBbmFseXNpcywKICAgICAgdGhpcy5fbmF0aXZlUmVzb2x1dGlvbkVucXVldWVyLAogICAgICB0aGlzLl9ub1N1Y2hNZXRob2RSZWdpc3RyeSwKICAgICAgdGhpcy5fYW5ub3RhdGlvbnNEYXRhQnVpbGRlciwKICAgICAgdGhpcy5fc2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5LAogICAgICB0aGlzLl9jbGFzc0hpZXJhcmNoeUJ1aWxkZXIsCiAgICAgIHRoaXMuX2NsYXNzUXVlcmllcyk7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgcHJvY2Vzc2VkQ2xhc3NlcyA9PiBfcHJvY2Vzc2VkQ2xhc3Nlcy5rZXlzCiAgICAgIC53aGVyZSgoY2xzKSA9PiBfcHJvY2Vzc2VkQ2xhc3Nlc1tjbHNdLmlzSW5zdGFudGlhdGVkKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc01lbWJlclByb2Nlc3NlZChNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PgogICAgICBfcHJvY2Vzc2VkTWVtYmVycy5jb250YWlucyhtZW1iZXIpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUHJvY2Vzc2VkTWVtYmVyKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIF9wcm9jZXNzZWRNZW1iZXJzLmFkZChtZW1iZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXQgcHJvY2Vzc2VkTWVtYmVycyA9PiBfcHJvY2Vzc2VkTWVtYmVyczsKCiAgQG92ZXJyaWRlCiAgS0Nsb3NlZFdvcmxkIGdldCBjbG9zZWRXb3JsZEZvclRlc3RpbmcgewogICAgaWYgKCFfY2xvc2VkKSB7CiAgICAgIGZhaWxlZEF0KAogICAgICAgICAgTk9fTE9DQVRJT05fU1BBTk5BQkxFLCAiVGhlIHdvcmxkIGJ1aWxkZXIgaGFzIG5vdCB5ZXQgYmVlbiBjbG9zZWQuIik7CiAgICB9CiAgICByZXR1cm4gX2Nsb3NlZFdvcmxkQ2FjaGU7CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJbXByb3ZlIHNlbWFudGljIHByZWNpc2lvbi4KICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGRpcmVjdGx5SW5zdGFudGlhdGVkQ2xhc3NlcyB7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwogICAgZ2V0SW5zdGFudGlhdGlvbk1hcCgpLmZvckVhY2goKENsYXNzRW50aXR5IGNscywgSW5zdGFudGlhdGlvbkluZm8gaW5mbykgewogICAgICBpZiAoaW5mby5oYXNJbnN0YW50aWF0aW9uKSB7CiAgICAgICAgY2xhc3Nlcy5hZGQoY2xzKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gY2xhc3NlczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDbG9zdXJpemVkTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBGdW5jdGlvblR5cGUgdHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKGVsZW1lbnQpOwogICAgaWYgKHR5cGUuY29udGFpbnNUeXBlVmFyaWFibGVzKSB7CiAgICAgIF9jbG9zdXJpemVkTWVtYmVyc1dpdGhGcmVlVHlwZVZhcmlhYmxlcy5hZGQoZWxlbWVudCk7CiAgICB9CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBGdWxseSBlbmZvcmNlIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gZXhhY3QsIHRocm91Z2gKICAvLyBzdWJjbGFzcyBhbmQgdGhyb3VnaCBzdWJ0eXBlIGluc3RhbnRpYXRlZCB0eXBlcy9jbGFzc2VzLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFN1cHBvcnQgdW5rbm93biB0eXBlIGFyZ3VtZW50cyBmb3IgZ2VuZXJpYyB0eXBlcy4KICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyVHlwZUluc3RhbnRpYXRpb24oCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3NVc2VkQ2FsbGJhY2sgY2xhc3NVc2VkLAogICAgICB7Q29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3J9KSB7CiAgICBDbGFzc0VudGl0eSBjbHMgPSB0eXBlLmVsZW1lbnQ7CiAgICBJbnN0YW50aWF0aW9uSW5mbyBpbmZvID0KICAgICAgICBfaW5zdGFudGlhdGlvbkluZm8ucHV0SWZBYnNlbnQoY2xzLCAoKSA9PiBuZXcgSW5zdGFudGlhdGlvbkluZm8oKSk7CiAgICBJbnN0YW50aWF0aW9uIGtpbmQgPSBJbnN0YW50aWF0aW9uLlVOSU5TVEFOVElBVEVEOwogICAgYm9vbCBpc05hdGl2ZSA9IF9uYXRpdmVCYXNpY0RhdGEuaXNOYXRpdmVDbGFzcyhjbHMpOwogICAgLy8gV2UgY2FuJ3QgdXNlIHRoZSBjbG9zZWQtd29ybGQgYXNzdW1wdGlvbiB3aXRoIG5hdGl2ZSBhYnN0cmFjdAogICAgLy8gY2xhc3NlczsgYSBuYXRpdmUgYWJzdHJhY3QgY2xhc3MgbWF5IGhhdmUgbm9uLWFic3RyYWN0IHN1YmNsYXNzZXMKICAgIC8vIG5vdCBkZWNsYXJlZCB0byB0aGUgcHJvZ3JhbS4gIEluc3RhbmNlcyBvZiB0aGVzZSBjbGFzc2VzIGFyZQogICAgLy8gaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgYWJzdHJhY3QgY2xhc3MuCiAgICBpZiAoIWNscy5pc0Fic3RyYWN0IHx8IGlzTmF0aXZlKSB7CiAgICAgIGlmIChpc05hdGl2ZSkgewogICAgICAgIGtpbmQgPSBJbnN0YW50aWF0aW9uLkFCU1RSQUNUTFlfSU5TVEFOVElBVEVEOwogICAgICB9IGVsc2UgewogICAgICAgIGtpbmQgPSBJbnN0YW50aWF0aW9uLkRJUkVDVExZX0lOU1RBTlRJQVRFRDsKICAgICAgfQogICAgfQogICAgaW5mby5hZGRJbnN0YW50aWF0aW9uKGNvbnN0cnVjdG9yLCB0eXBlLCBraW5kKTsKICAgIGlmIChraW5kICE9IEluc3RhbnRpYXRpb24uVU5JTlNUQU5USUFURUQpIHsKICAgICAgX2NsYXNzSGllcmFyY2h5QnVpbGRlci51cGRhdGVDbGFzc0hpZXJhcmNoeU5vZGVGb3JDbGFzcyhjbHMsCiAgICAgICAgICBkaXJlY3RseUluc3RhbnRpYXRlZDogaW5mby5pc0RpcmVjdGx5SW5zdGFudGlhdGVkLAogICAgICAgICAgYWJzdHJhY3RseUluc3RhbnRpYXRlZDogaW5mby5pc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWQpOwogICAgICBfcHJvY2Vzc0luc3RhbnRpYXRlZENsYXNzKGNscywgY2xhc3NVc2VkKTsKICAgIH0KCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgW19pbnN0YW50aWF0aW9uSW5mb10gdG8gY29tcHV0ZSB0aGlzIGluZm9ybWF0aW9uCiAgICAvLyBpbnN0ZWFkLgogICAgaWYgKF9pbXBsZW1lbnRlZENsYXNzZXMuYWRkKGNscykpIHsKICAgICAgY2xhc3NVc2VkKGNscywgX2dldENsYXNzVXNhZ2UoY2xzKS5pbXBsZW1lbnQoKSk7CiAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaFN1cGVydHlwZShjbHMsIChJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSkgewogICAgICAgIGlmIChfaW1wbGVtZW50ZWRDbGFzc2VzLmFkZChzdXBlcnR5cGUuZWxlbWVudCkpIHsKICAgICAgICAgIGNsYXNzVXNlZCgKICAgICAgICAgICAgICBzdXBlcnR5cGUuZWxlbWVudCwgX2dldENsYXNzVXNhZ2Uoc3VwZXJ0eXBlLmVsZW1lbnQpLmltcGxlbWVudCgpKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KCiAgSXRlcmFibGU8Q2FsbFN0cnVjdHVyZT4gX2dldE1hdGNoaW5nQ2FsbFN0cnVjdHVyZXMoCiAgICAgIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4gc2VsZWN0b3JzLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBpZiAoc2VsZWN0b3JzID09IG51bGwpIHJldHVybiBjb25zdCA8Q2FsbFN0cnVjdHVyZT5bXTsKICAgIFNldDxDYWxsU3RydWN0dXJlPiBjYWxsU3RydWN0dXJlczsKICAgIGZvciAoU2VsZWN0b3Igc2VsZWN0b3IgaW4gc2VsZWN0b3JzLmtleXMpIHsKICAgICAgaWYgKHNlbGVjdG9yLmFwcGxpZXNVbm5hbWVkKG1lbWJlcikpIHsKICAgICAgICBTZWxlY3RvckNvbnN0cmFpbnRzIG1hc2tzID0gc2VsZWN0b3JzW3NlbGVjdG9yXTsKICAgICAgICBpZiAobWFza3MuY2FuSGl0KG1lbWJlciwgc2VsZWN0b3IubWVtYmVyTmFtZSwgdGhpcykpIHsKICAgICAgICAgIGNhbGxTdHJ1Y3R1cmVzID8/PSBuZXcgU2V0PENhbGxTdHJ1Y3R1cmU+KCk7CiAgICAgICAgICBjYWxsU3RydWN0dXJlcy5hZGQoc2VsZWN0b3IuY2FsbFN0cnVjdHVyZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gY2FsbFN0cnVjdHVyZXMgPz8gY29uc3QgPENhbGxTdHJ1Y3R1cmU+W107CiAgfQoKICBib29sIF9oYXNNYXRjaGluZ1NlbGVjdG9yKAogICAgICBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IHNlbGVjdG9ycywgTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgaWYgKHNlbGVjdG9ycyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKFNlbGVjdG9yIHNlbGVjdG9yIGluIHNlbGVjdG9ycy5rZXlzKSB7CiAgICAgIGlmIChzZWxlY3Rvci5hcHBsaWVzVW5uYW1lZChtZW1iZXIpKSB7CiAgICAgICAgU2VsZWN0b3JDb25zdHJhaW50cyBtYXNrcyA9IHNlbGVjdG9yc1tzZWxlY3Rvcl07CiAgICAgICAgaWYgKG1hc2tzLmNhbkhpdChtZW1iZXIsIHNlbGVjdG9yLm1lbWJlck5hbWUsIHRoaXMpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBpbnN0YW50aWF0aW9uIG1hcCB1c2VkIGZvciBjb21wdXRpbmcgdGhlIGNsb3NlZCB3b3JsZC4KICBNYXA8Q2xhc3NFbnRpdHksIEluc3RhbnRpYXRpb25JbmZvPiBnZXRJbnN0YW50aWF0aW9uTWFwKCkgewogICAgcmV0dXJuIF9pbnN0YW50aWF0aW9uSW5mbzsKICB9CgogIEl0ZXJhYmxlPENhbGxTdHJ1Y3R1cmU+IF9nZXRJbnZvY2F0aW9uQ2FsbFN0cnVjdHVyZXMoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgcmV0dXJuIF9nZXRNYXRjaGluZ0NhbGxTdHJ1Y3R1cmVzKF9pbnZva2VkTmFtZXNbbWVtYmVyLm5hbWVdLCBtZW1iZXIpOwogIH0KCiAgYm9vbCBfaGFzSW52b2tlZEdldHRlcihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gX2hhc01hdGNoaW5nU2VsZWN0b3IoX2ludm9rZWRHZXR0ZXJzW21lbWJlci5uYW1lXSwgbWVtYmVyKTsKICB9CgogIGJvb2wgX2hhc0ludm9rZWRTZXR0ZXIoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgcmV0dXJuIF9oYXNNYXRjaGluZ1NlbGVjdG9yKF9pbnZva2VkU2V0dGVyc1ttZW1iZXIubmFtZV0sIG1lbWJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyRHluYW1pY1VzZSgKICAgICAgRHluYW1pY1VzZSBkeW5hbWljVXNlLCBNZW1iZXJVc2VkQ2FsbGJhY2sgbWVtYmVyVXNlZCkgewogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBkeW5hbWljVXNlLnNlbGVjdG9yOwogICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBzZWxlY3Rvci5uYW1lOwoKICAgIHZvaWQgX3Byb2Nlc3MoCiAgICAgICAgTWFwPFN0cmluZywgU2V0PE1lbWJlclVzYWdlPj4gbWVtYmVyTWFwLAogICAgICAgIEVudW1TZXQ8TWVtYmVyVXNlPiBhY3Rpb24oTWVtYmVyVXNhZ2UgdXNhZ2UpLAogICAgICAgIGJvb2wgc2hvdWxkQmVSZW1vdmVkKE1lbWJlclVzYWdlIHVzYWdlKSkgewogICAgICBfcHJvY2Vzc1NldChtZW1iZXJNYXAsIG1ldGhvZE5hbWUsIChNZW1iZXJVc2FnZSB1c2FnZSkgewogICAgICAgIGlmIChzZWxlY3Rvci5hcHBsaWVzVW5uYW1lZCh1c2FnZS5lbnRpdHkpICYmCiAgICAgICAgICAgIF9zZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kuYXBwbGllZFVubmFtZWQoCiAgICAgICAgICAgICAgICBkeW5hbWljVXNlLCB1c2FnZS5lbnRpdHksIHRoaXMpKSB7CiAgICAgICAgICBtZW1iZXJVc2VkKHVzYWdlLmVudGl0eSwgYWN0aW9uKHVzYWdlKSk7CiAgICAgICAgICByZXR1cm4gc2hvdWxkQmVSZW1vdmVkKHVzYWdlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KTsKICAgIH0KCiAgICBzd2l0Y2ggKGR5bmFtaWNVc2Uua2luZCkgewogICAgICBjYXNlIER5bmFtaWNVc2VLaW5kLklOVk9LRToKICAgICAgICByZWdpc3RlckR5bmFtaWNJbnZvY2F0aW9uKAogICAgICAgICAgICBkeW5hbWljVXNlLnNlbGVjdG9yLCBkeW5hbWljVXNlLnR5cGVBcmd1bWVudHMpOwogICAgICAgIGlmIChfcmVnaXN0ZXJOZXdTZWxlY3RvcihkeW5hbWljVXNlLCBfaW52b2tlZE5hbWVzKSkgewogICAgICAgICAgX3Byb2Nlc3MoCiAgICAgICAgICAgICAgX2ludm9rYWJsZUluc3RhbmNlTWVtYmVyc0J5TmFtZSwKICAgICAgICAgICAgICAobSkgPT4gbS5pbnZva2UoCiAgICAgICAgICAgICAgICAgIEFjY2Vzc2VzLmR5bmFtaWNBY2Nlc3MsIGR5bmFtaWNVc2Uuc2VsZWN0b3IuY2FsbFN0cnVjdHVyZSksCiAgICAgICAgICAgICAgLy8gSWYgbm90IGFsbCBvcHRpb25hbCBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBwYXNzZWQgaW4gaW52b2NhdGlvbnMKICAgICAgICAgICAgICAvLyB3ZSBtdXN0IGtlZXAgdGhlIG1lbWJlciBpbiBbX2ludm9rYWJsZUluc3RhbmNlTWVtYmVyc0J5TmFtZV0uCiAgICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQWxzbyByZW1vdmUgZnJvbQogICAgICAgICAgICAgIC8vIFtfcmVhZGFibGVJbnN0YW5jZU1lbWJlcnNCeU5hbWVdIGluIGNhc2Ugb2YgZ2V0dGVycy9zZXR0ZXJzLgogICAgICAgICAgICAgICh1KSA9PiAhdS5oYXNQZW5kaW5nRHluYW1pY0ludm9rZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIER5bmFtaWNVc2VLaW5kLkdFVDoKICAgICAgICBpZiAoX3JlZ2lzdGVyTmV3U2VsZWN0b3IoZHluYW1pY1VzZSwgX2ludm9rZWRHZXR0ZXJzKSkgewogICAgICAgICAgX3Byb2Nlc3MoCiAgICAgICAgICAgICAgX3JlYWRhYmxlSW5zdGFuY2VNZW1iZXJzQnlOYW1lLAogICAgICAgICAgICAgIChtKSA9PiBtLnJlYWQoQWNjZXNzZXMuZHluYW1pY0FjY2VzcyksCiAgICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWVtYmVycyBjYW5ub3QgYmUgcGFydGlhbGx5IHJlYWQgc28KICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgYWx3YXlzIHJlbW92ZSB0aGVtLgogICAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEFsc28gcmVtb3ZlIGZyb20KICAgICAgICAgICAgICAvLyBbX2ludm9rYWJsZUluc3RhbmNlTWVtYmVyc0J5TmFtZV0gaW4gY2FzZSBvZiBtZXRob2RzLgogICAgICAgICAgICAgICh1KSA9PiAhdS5oYXNQZW5kaW5nRHluYW1pY1JlYWQpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBEeW5hbWljVXNlS2luZC5TRVQ6CiAgICAgICAgaWYgKF9yZWdpc3Rlck5ld1NlbGVjdG9yKGR5bmFtaWNVc2UsIF9pbnZva2VkU2V0dGVycykpIHsKICAgICAgICAgIF9wcm9jZXNzKAogICAgICAgICAgICAgIF93cml0YWJsZUluc3RhbmNlTWVtYmVyc0J5TmFtZSwKICAgICAgICAgICAgICAobSkgPT4gbS53cml0ZShBY2Nlc3Nlcy5keW5hbWljQWNjZXNzKSwKICAgICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNZW1iZXJzIGNhbm5vdCBiZSBwYXJ0aWFsbHkgd3JpdHRlbiBzbwogICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBhbHdheXMgcmVtb3ZlIHRoZW0uCiAgICAgICAgICAgICAgKHUpID0+ICF1Lmhhc1BlbmRpbmdEeW5hbWljV3JpdGUpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KICB9CgogIGJvb2wgX3JlZ2lzdGVyTmV3U2VsZWN0b3IoRHluYW1pY1VzZSBkeW5hbWljVXNlLAogICAgICBNYXA8U3RyaW5nLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+PiBzZWxlY3Rvck1hcCkgewogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBkeW5hbWljVXNlLnNlbGVjdG9yOwogICAgU3RyaW5nIG5hbWUgPSBzZWxlY3Rvci5uYW1lOwogICAgT2JqZWN0IGNvbnN0cmFpbnQgPSBkeW5hbWljVXNlLnJlY2VpdmVyQ29uc3RyYWludDsKICAgIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4gc2VsZWN0b3JzID0gc2VsZWN0b3JNYXAucHV0SWZBYnNlbnQoCiAgICAgICAgbmFtZSwgKCkgPT4gbmV3IE1hcGxldDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4oKSk7CiAgICBVbml2ZXJzZVNlbGVjdG9yQ29uc3RyYWludHMgY29uc3RyYWludHMgPSBzZWxlY3RvcnNbc2VsZWN0b3JdOwogICAgaWYgKGNvbnN0cmFpbnRzID09IG51bGwpIHsKICAgICAgc2VsZWN0b3JzW3NlbGVjdG9yXSA9IF9zZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kKICAgICAgICAgIC5jcmVhdGVTZWxlY3RvckNvbnN0cmFpbnRzKHNlbGVjdG9yLCBjb25zdHJhaW50KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gY29uc3RyYWludHMuYWRkUmVjZWl2ZXJDb25zdHJhaW50KGNvbnN0cmFpbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlcklzQ2hlY2soY292YXJpYW50IERhcnRUeXBlIHR5cGUpIHsKICAgIF9pc0NoZWNrcy5hZGQodHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHJlZ2lzdGVyQ29uc3RhbnRVc2UoQ29uc3RhbnRVc2UgdXNlKSB7CiAgICByZXR1cm4gX2NvbnN0YW50VmFsdWVzLmFkZCh1c2UudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN0YXRpY1VzZShTdGF0aWNVc2Ugc3RhdGljVXNlLCBNZW1iZXJVc2VkQ2FsbGJhY2sgbWVtYmVyVXNlZCkgewogICAgaWYgKHN0YXRpY1VzZS5raW5kID09IFN0YXRpY1VzZUtpbmQuQ0xPU1VSRSkgewogICAgICBMb2NhbCBsb2NhbEZ1bmN0aW9uID0gc3RhdGljVXNlLmVsZW1lbnQ7CiAgICAgIEZ1bmN0aW9uVHlwZSB0eXBlID0KICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0TG9jYWxGdW5jdGlvblR5cGUobG9jYWxGdW5jdGlvbik7CiAgICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMuaXNOb3RFbXB0eSkgewogICAgICAgIF9nZW5lcmljTG9jYWxGdW5jdGlvbnMuYWRkKGxvY2FsRnVuY3Rpb24pOwogICAgICB9CiAgICAgIF9sb2NhbEZ1bmN0aW9ucy5hZGQoc3RhdGljVXNlLmVsZW1lbnQpOwogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKHN0YXRpY1VzZS5raW5kID09IFN0YXRpY1VzZUtpbmQuQ0xPU1VSRV9DQUxMKSB7CiAgICAgIGlmIChzdGF0aWNVc2UudHlwZUFyZ3VtZW50cz8uaXNOb3RFbXB0eSA/PyBmYWxzZSkgewogICAgICAgIHJlZ2lzdGVyRHluYW1pY0ludm9jYXRpb24oCiAgICAgICAgICAgIG5ldyBTZWxlY3Rvci5jYWxsKE5hbWVzLmNhbGwsIHN0YXRpY1VzZS5jYWxsU3RydWN0dXJlKSwKICAgICAgICAgICAgc3RhdGljVXNlLnR5cGVBcmd1bWVudHMpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCA9IHN0YXRpY1VzZS5lbGVtZW50OwogICAgRW51bVNldDxNZW1iZXJVc2U+IHVzZVNldCA9IG5ldyBFbnVtU2V0PE1lbWJlclVzZT4oKTsKICAgIE1lbWJlclVzYWdlIHVzYWdlID0gX2dldE1lbWJlclVzYWdlKGVsZW1lbnQsIHVzZVNldCk7CgogICAgaWYgKChlbGVtZW50LmlzU3RhdGljIHx8IGVsZW1lbnQuaXNUb3BMZXZlbCkgJiYgZWxlbWVudC5pc0ZpZWxkKSB7CiAgICAgIF9hbGxSZWZlcmVuY2VkU3RhdGljRmllbGRzLmFkZChzdGF0aWNVc2UuZWxlbWVudCk7CiAgICB9CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB0aGlzLiBDdXJyZW50bHkgW0ZJRUxEX0dFVF0gYW5kCiAgICAvLyBbRklFTERfU0VUXSBjb250YWlucyBbQm94RmllbGRFbGVtZW50XXMgd2hpY2ggd2UgY2Fubm90IGVucXVldWUuCiAgICAvLyBBbHNvIFtDTE9TVVJFXSBjb250YWlucyBbTG9jYWxGdW5jdGlvbkVsZW1lbnRdIHdoaWNoIHdlIGNhbm5vdAogICAgLy8gZW5xdWV1ZS4KCiAgICBzd2l0Y2ggKHN0YXRpY1VzZS5raW5kKSB7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5JTlNUQU5DRV9GSUVMRF9HRVQ6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5JTlNUQU5DRV9GSUVMRF9TRVQ6CiAgICAgICAgX2ZpZWxkU2V0dGVycy5hZGQoc3RhdGljVXNlLmVsZW1lbnQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuQ0xPU1VSRToKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNMT1NVUkVfQ0FMTDoKICAgICAgICAvLyBBbHJlYWR5IGhhbmRsZWQgYWJvdmUuCiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVVBFUl9URUFSX09GRjoKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLnJlYWQoQWNjZXNzZXMuc3VwZXJBY2Nlc3MpKTsKICAgICAgICBfbWV0aG9kc05lZWRpbmdTdXBlckdldHRlci5hZGQoc3RhdGljVXNlLmVsZW1lbnQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuU1VQRVJfRklFTERfU0VUOgogICAgICAgIF9maWVsZFNldHRlcnMuYWRkKHN0YXRpY1VzZS5lbGVtZW50KTsKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLndyaXRlKEFjY2Vzc2VzLnN1cGVyQWNjZXNzKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVVBFUl9HRVQ6CiAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5yZWFkKEFjY2Vzc2VzLnN1cGVyQWNjZXNzKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVEFUSUNfR0VUOgogICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2UucmVhZChBY2Nlc3Nlcy5zdGF0aWNBY2Nlc3MpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNUQVRJQ19URUFSX09GRjoKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLnJlYWQoQWNjZXNzZXMuc3RhdGljQWNjZXNzKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVVBFUl9TRVRURVJfU0VUOgogICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2Uud3JpdGUoQWNjZXNzZXMuc3VwZXJBY2Nlc3MpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNUQVRJQ19TRVQ6CiAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS53cml0ZShBY2Nlc3Nlcy5zdGF0aWNBY2Nlc3MpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkZJRUxEX0lOSVQ6CiAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5pbml0KCkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuRklFTERfQ09OU1RBTlRfSU5JVDoKICAgICAgICB1c2VTZXQuYWRkQWxsKHVzYWdlLmNvbnN0YW50SW5pdChzdGF0aWNVc2UuY29uc3RhbnQpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNVUEVSX0lOVk9LRToKICAgICAgICByZWdpc3RlclN0YXRpY0ludm9jYXRpb24oc3RhdGljVXNlKTsKICAgICAgICB1c2VTZXQuYWRkQWxsKAogICAgICAgICAgICB1c2FnZS5pbnZva2UoQWNjZXNzZXMuc3VwZXJBY2Nlc3MsIHN0YXRpY1VzZS5jYWxsU3RydWN0dXJlKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVEFUSUNfSU5WT0tFOgogICAgICAgIHJlZ2lzdGVyU3RhdGljSW52b2NhdGlvbihzdGF0aWNVc2UpOwogICAgICAgIHVzZVNldC5hZGRBbGwoCiAgICAgICAgICAgIHVzYWdlLmludm9rZShBY2Nlc3Nlcy5zdGF0aWNBY2Nlc3MsIHN0YXRpY1VzZS5jYWxsU3RydWN0dXJlKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DT05TVFJVQ1RPUl9JTlZPS0U6CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DT05TVF9DT05TVFJVQ1RPUl9JTlZPS0U6CiAgICAgICAgdXNlU2V0LmFkZEFsbCgKICAgICAgICAgICAgdXNhZ2UuaW52b2tlKEFjY2Vzc2VzLnN0YXRpY0FjY2Vzcywgc3RhdGljVXNlLmNhbGxTdHJ1Y3R1cmUpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkRJUkVDVF9JTlZPS0U6CiAgICAgICAgZmFpbGVkQXQoZWxlbWVudCwgJ0RpcmVjdCBzdGF0aWMgdXNlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHJlc29sdXRpb24uJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5JTkxJTklORzoKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNBTExfTUVUSE9EOgogICAgICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAgICJTdGF0aWMgdXNlICR7c3RhdGljVXNlLmtpbmR9IGlzIG5vdCBzdXBwb3J0ZWQgZHVyaW5nIHJlc29sdXRpb24uIik7CiAgICB9CiAgICBpZiAodXNlU2V0LmlzTm90RW1wdHkpIHsKICAgICAgbWVtYmVyVXNlZCh1c2FnZS5lbnRpdHksIHVzZVNldCk7CiAgICB9CiAgfQoKICAvLy8gQ2FsbGVkIHRvIGNyZWF0ZSBhIFtDbGFzc1VzYWdlXSBmb3IgW2Nsc10uCiAgLy8vCiAgLy8vIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyB0byBlbnN1cmUgbmVlZGVkIGludmFyaWFudHMgb24gW2Nsc10uCiAgQ2xhc3NVc2FnZSBfY3JlYXRlQ2xhc3NVc2FnZShjb3ZhcmlhbnQgQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBuZXcgQ2xhc3NVc2FnZShjbHMpOwoKICAvLy8gUmV0dXJuIHRoZSBjYW5vbmljYWwgW0NsYXNzVXNhZ2VdIGZvciBbY2xzXS4KICBDbGFzc1VzYWdlIF9nZXRDbGFzc1VzYWdlKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIF9wcm9jZXNzZWRDbGFzc2VzLnB1dElmQWJzZW50KGNscywgKCkgewogICAgICByZXR1cm4gX2NyZWF0ZUNsYXNzVXNhZ2UoY2xzKTsKICAgIH0pOwogIH0KCiAgLy8vIFJlZ2lzdGVyIFtjbHNdIGFuZCBhbGwgaXRzIHN1cGVyY2xhc3NlcyBhcyBpbnN0YW50aWF0ZWQuCiAgdm9pZCBfcHJvY2Vzc0luc3RhbnRpYXRlZENsYXNzKENsYXNzRW50aXR5IGNscywgQ2xhc3NVc2VkQ2FsbGJhY2sgY2xhc3NVc2VkKSB7CiAgICAvLyBSZWdpc3RlcnMgW3N1cGVyY2xhc3NdIGFzIGluc3RhbnRpYXRlZC4gUmV0dXJucyBgdHJ1ZWAgaWYgaXQgd2Fzbid0CiAgICAvLyBhbHJlYWR5IGluc3RhbnRpYXRlZCBhbmQgd2UgdGhlcmVmb3JlIGhhdmUgdG8gcHJvY2VzcyBpdHMgc3VwZXJjbGFzcyBhcwogICAgLy8gd2VsbC4KICAgIGJvb2wgcHJvY2Vzc0NsYXNzKENsYXNzRW50aXR5IHN1cGVyY2xhc3MpIHsKICAgICAgQ2xhc3NVc2FnZSB1c2FnZSA9IF9nZXRDbGFzc1VzYWdlKHN1cGVyY2xhc3MpOwogICAgICBpZiAoIXVzYWdlLmlzSW5zdGFudGlhdGVkKSB7CiAgICAgICAgY2xhc3NVc2VkKHVzYWdlLmNscywgdXNhZ2UuaW5zdGFudGlhdGUoKSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHdoaWxlIChjbHMgIT0gbnVsbCAmJiBwcm9jZXNzQ2xhc3MoY2xzKSkgewogICAgICBjbHMgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY2xzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJvY2Vzc0NsYXNzTWVtYmVycyhDbGFzc0VudGl0eSBjbHMsIE1lbWJlclVzZWRDYWxsYmFjayBtZW1iZXJVc2VkLAogICAgICB7Ym9vbCBjaGVja0VucXVldWVyQ29uc2lzdGVuY3k6IGZhbHNlfSkgewogICAgX2VsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoQ2xhc3NNZW1iZXIoY2xzLAogICAgICAgIChDbGFzc0VudGl0eSBjbHMsIE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgX3Byb2Nlc3NJbnN0YW50aWF0ZWRDbGFzc01lbWJlcihjbHMsIG1lbWJlciwgbWVtYmVyVXNlZCwKICAgICAgICAgIGNoZWNrRW5xdWV1ZXJDb25zaXN0ZW5jeTogY2hlY2tFbnF1ZXVlckNvbnNpc3RlbmN5KTsKICAgIH0pOwogIH0KCiAgLy8vIENhbGwgW3VwZGF0ZVVzYWdlXSBvbiBhbGwgW01lbWJlclVzYWdlXXMgaW4gdGhlIHNldCBpbiBbbWFwXSBmb3IKICAvLy8gW21lbWJlck5hbWVdLiBJZiBbdXBkYXRlVXNhZ2VdIHJldHVybnMgYHRydWVgIHRoZSB1c2FnZSBpcyByZW1vdmVkIGZyb20KICAvLy8gdGhlIHNldC4KICB2b2lkIF9wcm9jZXNzU2V0KE1hcDxTdHJpbmcsIFNldDxNZW1iZXJVc2FnZT4+IG1hcCwgU3RyaW5nIG1lbWJlck5hbWUsCiAgICAgIGJvb2wgdXBkYXRlVXNhZ2UoTWVtYmVyVXNhZ2UgZSkpIHsKICAgIFNldDxNZW1iZXJVc2FnZT4gbWVtYmVycyA9IG1hcFttZW1iZXJOYW1lXTsKICAgIGlmIChtZW1iZXJzID09IG51bGwpIHJldHVybjsKICAgIC8vIFtmXSBtaWdodCBhZGQgZWxlbWVudHMgdG8gWzogbWFwW21lbWJlck5hbWVdIDpdIGR1cmluZyB0aGUgbG9vcCBiZWxvdwogICAgLy8gc28gd2UgY3JlYXRlIGEgbmV3IGxpc3QgZm9yIFs6IG1hcFttZW1iZXJOYW1lXSA6XSBhbmQgcHJlcGVuZCB0aGUKICAgIC8vIFtyZW1haW5pbmddIG1lbWJlcnMgYWZ0ZXIgdGhlIGxvb3AuCiAgICBtYXBbbWVtYmVyTmFtZV0gPSBuZXcgU2V0PE1lbWJlclVzYWdlPigpOwogICAgU2V0PE1lbWJlclVzYWdlPiByZW1haW5pbmcgPSBuZXcgU2V0PE1lbWJlclVzYWdlPigpOwogICAgZm9yIChNZW1iZXJVc2FnZSB1c2FnZSBpbiBtZW1iZXJzKSB7CiAgICAgIGlmICghdXBkYXRlVXNhZ2UodXNhZ2UpKSB7CiAgICAgICAgcmVtYWluaW5nLmFkZCh1c2FnZSk7CiAgICAgIH0KICAgIH0KICAgIG1hcFttZW1iZXJOYW1lXS5hZGRBbGwocmVtYWluaW5nKTsKICB9CgogIE1lbWJlclVzYWdlIF9nZXRNZW1iZXJVc2FnZShNZW1iZXJFbnRpdHkgbWVtYmVyLCBFbnVtU2V0PE1lbWJlclVzZT4gdXNlU2V0LAogICAgICB7Ym9vbCBjaGVja0VucXVldWVyQ29uc2lzdGVuY3k6IGZhbHNlfSkgewogICAgTWVtYmVyVXNhZ2UgdXNhZ2UgPSBfbWVtYmVyVXNhZ2VbbWVtYmVyXTsKICAgIGlmICh1c2FnZSA9PSBudWxsKSB7CiAgICAgIGlmIChtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAgIFN0cmluZyBtZW1iZXJOYW1lID0gbWVtYmVyLm5hbWU7CiAgICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gbWVtYmVyLmVuY2xvc2luZ0NsYXNzOwogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENoYW5nZSB0aGlzIHRvIHVzZSBpc05hdGl2ZU1lbWJlciB3aGVuIHdlIHVzZQogICAgICAgIC8vIENGRSBjb25zdGFudHMuCiAgICAgICAgLy8gVGhlIG9idmlvdXMgdGhpbmcgdG8gdGVzdCBoZXJlIHdvdWxkIGJlICJtZW1iZXIuaXNOYXRpdmUiLAogICAgICAgIC8vIGhvd2V2ZXIsIHRoYXQgb25seSB3b3JrcyBhZnRlciBtZXRhZGF0YSBoYXMgYmVlbiBwYXJzZWQvYW5hbHl6ZWQsCiAgICAgICAgLy8gYW5kIHRoYXQgbWF5IG5vdCBoYXZlIGhhcHBlbmVkIHlldC4KICAgICAgICAvLyBTbyBpbnN0ZWFkIHdlIHVzZSB0aGUgZW5jbG9zaW5nIGNsYXNzLCB3aGljaCB3ZSBrbm93IGhhdmUgaGFkCiAgICAgICAgLy8gaXRzIG1ldGFkYXRhIHBhcnNlZCBhbmQgYW5hbHl6ZWQuCiAgICAgICAgLy8gTm90ZTogdGhpcyBhc3N1bWVzIHRoYXQgdGhlcmUgYXJlIG5vIG5vbi1uYXRpdmUgZmllbGRzIG9uIG5hdGl2ZQogICAgICAgIC8vIGNsYXNzZXMsIHdoaWNoIG1heSBub3QgYmUgdGhlIGNhc2Ugd2hlbiBhIG5hdGl2ZSBjbGFzcyBpcyBzdWJjbGFzc2VkLgogICAgICAgIGJvb2wgaXNOYXRpdmUgPSBfbmF0aXZlQmFzaWNEYXRhLmlzTmF0aXZlQ2xhc3MoY2xzKTsKICAgICAgICB1c2FnZSA9IG5ldyBNZW1iZXJVc2FnZShtZW1iZXIpOwogICAgICAgIGlmIChtZW1iZXIuaXNGaWVsZCAmJiAhaXNOYXRpdmUpIHsKICAgICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2UuaW5pdCgpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFjaGVja0VucXVldWVyQ29uc2lzdGVuY3kpIHsKICAgICAgICAgIGlmIChtZW1iZXIuaXNGaWVsZCAmJiBpc05hdGl2ZSkgewogICAgICAgICAgICByZWdpc3RlclVzZWRFbGVtZW50KG1lbWJlcik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWVtYmVyLmlzRnVuY3Rpb24gJiYKICAgICAgICAgICAgICBtZW1iZXIubmFtZSA9PSBJZGVudGlmaWVycy5jYWxsICYmCiAgICAgICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5pc0dlbmVyaWNDbGFzcyhjbHMpKSB7CiAgICAgICAgICAgIF9jbG9zdXJpemVkTWVtYmVyc1dpdGhGcmVlVHlwZVZhcmlhYmxlcy5hZGQobWVtYmVyKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh1c2FnZS5oYXNQZW5kaW5nRHluYW1pY1JlYWQgJiYgX2hhc0ludm9rZWRHZXR0ZXIobWVtYmVyKSkgewogICAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5yZWFkKEFjY2Vzc2VzLmR5bmFtaWNBY2Nlc3MpKTsKICAgICAgICB9CiAgICAgICAgaWYgKHVzYWdlLmhhc1BlbmRpbmdEeW5hbWljSW52b2tlKSB7CiAgICAgICAgICBJdGVyYWJsZTxDYWxsU3RydWN0dXJlPiBjYWxsU3RydWN0dXJlcyA9CiAgICAgICAgICAgICAgX2dldEludm9jYXRpb25DYWxsU3RydWN0dXJlcyhtZW1iZXIpOwogICAgICAgICAgZm9yIChDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUgaW4gY2FsbFN0cnVjdHVyZXMpIHsKICAgICAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5pbnZva2UoQWNjZXNzZXMuZHluYW1pY0FjY2VzcywgY2FsbFN0cnVjdHVyZSkpOwogICAgICAgICAgICBpZiAoIXVzYWdlLmhhc1BlbmRpbmdEeW5hbWljSW52b2tlKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHVzYWdlLmhhc1BlbmRpbmdEeW5hbWljV3JpdGUgJiYgX2hhc0ludm9rZWRTZXR0ZXIobWVtYmVyKSkgewogICAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS53cml0ZShBY2Nlc3Nlcy5keW5hbWljQWNjZXNzKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWNoZWNrRW5xdWV1ZXJDb25zaXN0ZW5jeSkgewogICAgICAgICAgaWYgKHVzYWdlLmhhc1BlbmRpbmdEeW5hbWljSW52b2tlKSB7CiAgICAgICAgICAgIF9pbnZva2FibGVJbnN0YW5jZU1lbWJlcnNCeU5hbWUKICAgICAgICAgICAgICAgIC5wdXRJZkFic2VudChtZW1iZXJOYW1lLCAoKSA9PiB7fSkKICAgICAgICAgICAgICAgIC5hZGQodXNhZ2UpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHVzYWdlLmhhc1BlbmRpbmdEeW5hbWljUmVhZCkgewogICAgICAgICAgICBfcmVhZGFibGVJbnN0YW5jZU1lbWJlcnNCeU5hbWUKICAgICAgICAgICAgICAgIC5wdXRJZkFic2VudChtZW1iZXJOYW1lLCAoKSA9PiB7fSkKICAgICAgICAgICAgICAgIC5hZGQodXNhZ2UpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHVzYWdlLmhhc1BlbmRpbmdEeW5hbWljV3JpdGUpIHsKICAgICAgICAgICAgX3dyaXRhYmxlSW5zdGFuY2VNZW1iZXJzQnlOYW1lCiAgICAgICAgICAgICAgICAucHV0SWZBYnNlbnQobWVtYmVyTmFtZSwgKCkgPT4ge30pCiAgICAgICAgICAgICAgICAuYWRkKHVzYWdlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdXNhZ2UgPSBuZXcgTWVtYmVyVXNhZ2UobWVtYmVyKTsKICAgICAgICBpZiAobWVtYmVyLmlzRmllbGQpIHsKICAgICAgICAgIHVzZVNldC5hZGRBbGwodXNhZ2UuaW5pdCgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFjaGVja0VucXVldWVyQ29uc2lzdGVuY3kpIHsKICAgICAgICBfbWVtYmVyVXNhZ2VbbWVtYmVyXSA9IHVzYWdlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdXNhZ2U7CiAgfQoKICB2b2lkIF9wcm9jZXNzSW5zdGFudGlhdGVkQ2xhc3NNZW1iZXIoCiAgICAgIENsYXNzRW50aXR5IGNscywgTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVXNlZENhbGxiYWNrIG1lbWJlclVzZWQsCiAgICAgIHtib29sIGNoZWNrRW5xdWV1ZXJDb25zaXN0ZW5jeTogZmFsc2V9KSB7CiAgICBpZiAoIW1lbWJlci5pc0luc3RhbmNlTWVtYmVyKSByZXR1cm47CiAgICBTdHJpbmcgbWVtYmVyTmFtZSA9IG1lbWJlci5uYW1lOwoKICAgIE1lbWJlclVzYWdlIHVzYWdlID0gX21lbWJlclVzYWdlW21lbWJlcl07CiAgICBpZiAodXNhZ2UgPT0gbnVsbCkgewogICAgICBFbnVtU2V0PE1lbWJlclVzZT4gdXNlU2V0ID0gbmV3IEVudW1TZXQ8TWVtYmVyVXNlPigpOwogICAgICB1c2FnZSA9IF9nZXRNZW1iZXJVc2FnZShtZW1iZXIsIHVzZVNldCwKICAgICAgICAgIGNoZWNrRW5xdWV1ZXJDb25zaXN0ZW5jeTogY2hlY2tFbnF1ZXVlckNvbnNpc3RlbmN5KTsKICAgICAgaWYgKHVzZVNldC5pc05vdEVtcHR5KSB7CiAgICAgICAgaWYgKGNoZWNrRW5xdWV1ZXJDb25zaXN0ZW5jeSkgewogICAgICAgICAgdGhyb3cgbmV3IFNwYW5uYWJsZUFzc2VydGlvbkZhaWx1cmUobWVtYmVyLAogICAgICAgICAgICAgICdVbmVucXVldWVkIHVzYWdlIG9mICRtZW1iZXI6IFxuYmVmb3JlOiA8bm9uZT5cbmFmdGVyIDogJHVzYWdlJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1lbWJlclVzZWQodXNhZ2UuZW50aXR5LCB1c2VTZXQpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgTWVtYmVyVXNhZ2Ugb3JpZ2luYWwgPSB1c2FnZTsKICAgICAgaWYgKGNoZWNrRW5xdWV1ZXJDb25zaXN0ZW5jeSkgewogICAgICAgIHVzYWdlID0gdXNhZ2UuY2xvbmUoKTsKICAgICAgfQogICAgICBpZiAodXNhZ2UuaGFzUGVuZGluZ0R5bmFtaWNVc2UpIHsKICAgICAgICBFbnVtU2V0PE1lbWJlclVzZT4gdXNlU2V0ID0gbmV3IEVudW1TZXQ8TWVtYmVyVXNlPigpOwogICAgICAgIGlmICh1c2FnZS5oYXNQZW5kaW5nRHluYW1pY1JlYWQgJiYgX2hhc0ludm9rZWRHZXR0ZXIobWVtYmVyKSkgewogICAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5yZWFkKEFjY2Vzc2VzLmR5bmFtaWNBY2Nlc3MpKTsKICAgICAgICB9CiAgICAgICAgaWYgKHVzYWdlLmhhc1BlbmRpbmdEeW5hbWljSW52b2tlKSB7CiAgICAgICAgICBJdGVyYWJsZTxDYWxsU3RydWN0dXJlPiBjYWxsU3RydWN0dXJlcyA9CiAgICAgICAgICAgICAgX2dldEludm9jYXRpb25DYWxsU3RydWN0dXJlcyhtZW1iZXIpOwogICAgICAgICAgZm9yIChDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUgaW4gY2FsbFN0cnVjdHVyZXMpIHsKICAgICAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS5pbnZva2UoQWNjZXNzZXMuZHluYW1pY0FjY2VzcywgY2FsbFN0cnVjdHVyZSkpOwogICAgICAgICAgICBpZiAoIXVzYWdlLmhhc1BlbmRpbmdEeW5hbWljSW52b2tlKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHVzYWdlLmhhc1BlbmRpbmdEeW5hbWljV3JpdGUgJiYgX2hhc0ludm9rZWRTZXR0ZXIobWVtYmVyKSkgewogICAgICAgICAgdXNlU2V0LmFkZEFsbCh1c2FnZS53cml0ZShBY2Nlc3Nlcy5keW5hbWljQWNjZXNzKSk7CiAgICAgICAgfQogICAgICAgIGlmICghY2hlY2tFbnF1ZXVlckNvbnNpc3RlbmN5KSB7CiAgICAgICAgICBpZiAoIXVzYWdlLmhhc1BlbmRpbmdEeW5hbWljUmVhZCkgewogICAgICAgICAgICBfcmVhZGFibGVJbnN0YW5jZU1lbWJlcnNCeU5hbWVbbWVtYmVyTmFtZV0/LnJlbW92ZSh1c2FnZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXVzYWdlLmhhc1BlbmRpbmdEeW5hbWljSW52b2tlKSB7CiAgICAgICAgICAgIF9pbnZva2FibGVJbnN0YW5jZU1lbWJlcnNCeU5hbWVbbWVtYmVyTmFtZV0/LnJlbW92ZSh1c2FnZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXVzYWdlLmhhc1BlbmRpbmdEeW5hbWljV3JpdGUpIHsKICAgICAgICAgICAgX3dyaXRhYmxlSW5zdGFuY2VNZW1iZXJzQnlOYW1lW21lbWJlck5hbWVdPy5yZW1vdmUodXNhZ2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY2hlY2tFbnF1ZXVlckNvbnNpc3RlbmN5ICYmICFvcmlnaW5hbC5kYXRhRXF1YWxzKHVzYWdlKSkgewogICAgICAgICAgX2VsZW1lbnRNYXAucmVwb3J0ZXIuaW50ZXJuYWxFcnJvcigKICAgICAgICAgICAgICBtZW1iZXIsCiAgICAgICAgICAgICAgJ1VuZW5xdWV1ZWQgdXNhZ2Ugb2YgJG1lbWJlcjogXG4nCiAgICAgICAgICAgICAgJ2JlZm9yZTogJG9yaWdpbmFsXG5hZnRlciA6ICR1c2FnZScpOwogICAgICAgIH0KICAgICAgICBtZW1iZXJVc2VkKHVzYWdlLmVudGl0eSwgdXNlU2V0KTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGFsbE1peGluVXNlc09mKENsYXNzRW50aXR5IGNscykgewogICAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHVzZXMgPSBfY2xhc3NIaWVyYXJjaHlCdWlsZGVyLm1peGluVXNlc1tjbHNdOwogICAgcmV0dXJuIHVzZXMgIT0gbnVsbCA/IHVzZXMgOiBjb25zdCA8Q2xhc3NFbnRpdHk+W107CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyVXNlZEVsZW1lbnQoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIgJiYgIWVsZW1lbnQuaXNBYnN0cmFjdCkgewogICAgICBfbGl2ZUluc3RhbmNlTWVtYmVycy5hZGQoZWxlbWVudCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzTWVtYmVyVXNlZChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gX21lbWJlclVzYWdlW21lbWJlcl0/Lmhhc1VzZSA/PyBmYWxzZTsKICB9CgogIE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4gcG9wdWxhdGVIaWVyYXJjaHlOb2RlcygpIHsKICAgIE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4gdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3NlcyA9CiAgICAgICAgbmV3IE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4oKTsKCiAgICAvLyBVcGRhdGVzIHRoZSBgaXNEaXJlY3RseUluc3RhbnRpYXRlZGAgYW5kIGBpc0luZGlyZWN0bHlJbnN0YW50aWF0ZWRgCiAgICAvLyBwcm9wZXJ0aWVzIG9mIHRoZSBbQ2xhc3NIaWVyYXJjaHlOb2RlXSBmb3IgW2Nsc10uCgogICAgdm9pZCBhZGRTdWJ0eXBlcyhDbGFzc0VudGl0eSBjbHMsIEluc3RhbnRpYXRpb25JbmZvIGluZm8pIHsKICAgICAgaWYgKCFpbmZvLmhhc0luc3RhbnRpYXRpb24pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgX2NsYXNzSGllcmFyY2h5QnVpbGRlci51cGRhdGVDbGFzc0hpZXJhcmNoeU5vZGVGb3JDbGFzcyhjbHMsCiAgICAgICAgICBkaXJlY3RseUluc3RhbnRpYXRlZDogaW5mby5pc0RpcmVjdGx5SW5zdGFudGlhdGVkLAogICAgICAgICAgYWJzdHJhY3RseUluc3RhbnRpYXRlZDogaW5mby5pc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWQpOwoKICAgICAgLy8gV2FsayB0aHJvdWdoIHRoZSBzdXBlcmNsYXNzZXMsIGFuZCByZWNvcmQgdGhlIHR5cGVzCiAgICAgIC8vIGltcGxlbWVudGVkIGJ5IHRoYXQgdHlwZSBvbiB0aGUgc3VwZXJjbGFzc2VzLgogICAgICBDbGFzc0VudGl0eSBzdXBlcmNsYXNzID0gX2NsYXNzUXVlcmllcy5nZXRTdXBlckNsYXNzKGNscyk7CiAgICAgIHdoaWxlIChzdXBlcmNsYXNzICE9IG51bGwpIHsKICAgICAgICBTZXQ8Q2xhc3NFbnRpdHk+IHR5cGVzSW1wbGVtZW50ZWRCeVN1YmNsYXNzZXNPZkNscyA9CiAgICAgICAgICAgIHR5cGVzSW1wbGVtZW50ZWRCeVN1YmNsYXNzZXMucHV0SWZBYnNlbnQoCiAgICAgICAgICAgICAgICBzdXBlcmNsYXNzLCAoKSA9PiBuZXcgU2V0PENsYXNzRW50aXR5PigpKTsKICAgICAgICBmb3IgKEludGVyZmFjZVR5cGUgY3VycmVudCBpbiBfY2xhc3NRdWVyaWVzLmdldFN1cGVydHlwZXMoY2xzKSkgewogICAgICAgICAgdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3Nlc09mQ2xzLmFkZChjdXJyZW50LmVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICBzdXBlcmNsYXNzID0gX2NsYXNzUXVlcmllcy5nZXRTdXBlckNsYXNzKHN1cGVyY2xhc3MpOwogICAgICB9CiAgICB9CgogICAgLy8gVXNlIHRoZSBbOnNlZW5DbGFzc2VzOl0gc2V0IHRvIGluY2x1ZGUgbm9uLWluc3RhbnRpYXRlZAogICAgLy8gY2xhc3NlczogaWYgdGhlIHN1cGVyY2xhc3Mgb2YgdGhlc2UgY2xhc3NlcyByZXF1aXJlIFJUSSwgdGhlbgogICAgLy8gdGhleSBhbHNvIG5lZWQgUlRJLCBzbyB0aGF0IGEgY29uc3RydWN0b3IgcGFzc2VzIHRoZSB0eXBlCiAgICAvLyB2YXJpYWJsZXMgdG8gdGhlIHN1cGVyIGNvbnN0cnVjdG9yLgogICAgZ2V0SW5zdGFudGlhdGlvbk1hcCgpLmZvckVhY2goYWRkU3VidHlwZXMpOwoKICAgIHJldHVybiB0eXBlc0ltcGxlbWVudGVkQnlTdWJjbGFzc2VzOwogIH0KCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBjb21wdXRlQXNzaWduZWRJbnN0YW5jZU1lbWJlcnMoKSB7CiAgICBTZXQ8TWVtYmVyRW50aXR5PiBhc3NpZ25lZEluc3RhbmNlTWVtYmVycyA9IG5ldyBTZXQ8TWVtYmVyRW50aXR5PigpOwogICAgZm9yIChNZW1iZXJFbnRpdHkgaW5zdGFuY2VNZW1iZXIgaW4gX2xpdmVJbnN0YW5jZU1lbWJlcnMpIHsKICAgICAgaWYgKF9oYXNJbnZva2VkU2V0dGVyKGluc3RhbmNlTWVtYmVyKSkgewogICAgICAgIGFzc2lnbmVkSW5zdGFuY2VNZW1iZXJzLmFkZChpbnN0YW5jZU1lbWJlcik7CiAgICAgIH0KICAgIH0KICAgIGFzc2lnbmVkSW5zdGFuY2VNZW1iZXJzLmFkZEFsbChfZmllbGRTZXR0ZXJzKTsKICAgIHJldHVybiBhc3NpZ25lZEluc3RhbmNlTWVtYmVyczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIF9jbGFzc0hpZXJhcmNoeUJ1aWxkZXIucmVnaXN0ZXJDbGFzcyhjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0luaGVyaXRlZEluKAogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyLCBDbGFzc0VudGl0eSB0eXBlLCBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgdGhlIFttZW1iZXJdIGl0c2VsZiB0byBhdm9pZCBlbnF1ZXVlaW5nIG1lbWJlcnMKICAgIC8vIHRoYXQgYXJlIG92ZXJyaWRkZW4uCiAgICByZXR1cm4gaXNJbmhlcml0ZWRJbkNsYXNzKG1lbWJlci5lbmNsb3NpbmdDbGFzcywgdHlwZSwgcmVsYXRpb24pOwogIH0KCiAgYm9vbCBpc0luaGVyaXRlZEluQ2xhc3MoQ2xhc3NFbnRpdHkgbWVtYmVySG9sZGluZ0NsYXNzLCBDbGFzc0VudGl0eSB0eXBlLAogICAgICBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uKSB7CiAgICBzd2l0Y2ggKHJlbGF0aW9uKSB7CiAgICAgIGNhc2UgQ2xhc3NSZWxhdGlvbi5leGFjdDoKICAgICAgICByZXR1cm4gX2NsYXNzSGllcmFyY2h5QnVpbGRlci5pc0luaGVyaXRlZEluRXhhY3RDbGFzcygKICAgICAgICAgICAgbWVtYmVySG9sZGluZ0NsYXNzLCB0eXBlKTsKICAgICAgY2FzZSBDbGFzc1JlbGF0aW9uLnRoaXNFeHByZXNzaW9uOgogICAgICAgIHJldHVybiBfY2xhc3NIaWVyYXJjaHlCdWlsZGVyLmlzSW5oZXJpdGVkSW5UaGlzQ2xhc3MoCiAgICAgICAgICAgIG1lbWJlckhvbGRpbmdDbGFzcywgdHlwZSk7CiAgICAgIGNhc2UgQ2xhc3NSZWxhdGlvbi5zdWJ0eXBlOgogICAgICAgIGlmIChtZW1iZXJIb2xkaW5nQ2xhc3MgPT0gX2NvbW1vbkVsZW1lbnRzLm51bGxDbGFzcyB8fAogICAgICAgICAgICBtZW1iZXJIb2xkaW5nQ2xhc3MgPT0gX2NvbW1vbkVsZW1lbnRzLmpzTnVsbENsYXNzKSB7CiAgICAgICAgICAvLyBNZW1iZXJzIG9mIGBOdWxsYCBhbmQgYEpTTnVsbGAgYXJlIGFsd2F5cyBwb3RlbnRpYWwgdGFyZ2V0cy4KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX2NsYXNzSGllcmFyY2h5QnVpbGRlci5pc0luaGVyaXRlZEluU3VidHlwZU9mKAogICAgICAgICAgICBtZW1iZXJIb2xkaW5nQ2xhc3MsIHR5cGUpOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuZXhwZWN0ZWQgQ2xhc3NSZWxhdGlvbiAkcmVsYXRpb24uIik7CiAgfQoKICBAb3ZlcnJpZGUKICBLQ2xvc2VkV29ybGQgY2xvc2VXb3JsZChEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKICAgIE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4gdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3NlcyA9CiAgICAgICAgcG9wdWxhdGVIaWVyYXJjaHlOb2RlcygpOwoKICAgIEJhY2tlbmRVc2FnZSBiYWNrZW5kVXNhZ2UgPSBfYmFja2VuZFVzYWdlQnVpbGRlci5jbG9zZSgpOwogICAgX2Nsb3NlZCA9IHRydWU7CgogICAgTWFwPE1lbWJlckVudGl0eSwgTWVtYmVyVXNhZ2U+IGxpdmVNZW1iZXJVc2FnZSA9IHt9OwogICAgX21lbWJlclVzYWdlLmZvckVhY2goKE1lbWJlckVudGl0eSBtZW1iZXIsIE1lbWJlclVzYWdlIG1lbWJlclVzYWdlKSB7CiAgICAgIGlmIChtZW1iZXJVc2FnZS5oYXNVc2UpIHsKICAgICAgICBsaXZlTWVtYmVyVXNhZ2VbbWVtYmVyXSA9IG1lbWJlclVzYWdlOwogICAgICAgIGFzc2VydChfcHJvY2Vzc2VkTWVtYmVycy5jb250YWlucyhtZW1iZXIpLAogICAgICAgICAgICAiTWVtYmVyICRtZW1iZXIgaXMgdXNlZCBidXQgbm90IHByb2Nlc3NlZDogJG1lbWJlclVzYWdlLiIpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydCghX3Byb2Nlc3NlZE1lbWJlcnMuY29udGFpbnMobWVtYmVyKSwKICAgICAgICAgICAgIk1lbWJlciAkbWVtYmVyIGlzIHByb2Nlc3NlZCBidXQgbm90IHVzZWQ6ICRtZW1iZXJVc2FnZS4iKTsKICAgICAgfQogICAgfSk7CiAgICBmb3IgKE1lbWJlckVudGl0eSBtZW1iZXIgaW4gX3Byb2Nlc3NlZE1lbWJlcnMpIHsKICAgICAgYXNzZXJ0KF9tZW1iZXJVc2FnZS5jb250YWluc0tleShtZW1iZXIpLAogICAgICAgICAgIk1lbWJlciAkbWVtYmVyIGlzIHByb2Nlc3NlZCBidXQgaGFzIG5vdCB1c2FnZS4iKTsKICAgIH0KCiAgICBTZXQ8SW50ZXJmYWNlVHlwZT4gaW5zdGFudGlhdGVkVHlwZXMgPSBuZXcgU2V0PEludGVyZmFjZVR5cGU+KCk7CiAgICBnZXRJbnN0YW50aWF0aW9uTWFwKCkuZm9yRWFjaCgoXywgSW5zdGFudGlhdGlvbkluZm8gaW5mbykgewogICAgICBpZiAoaW5mby5pbnN0YW50aWF0aW9uTWFwICE9IG51bGwpIHsKICAgICAgICBmb3IgKFNldDxJbnN0YW5jZT4gaW5zdGFuY2VzIGluIGluZm8uaW5zdGFudGlhdGlvbk1hcC52YWx1ZXMpIHsKICAgICAgICAgIGZvciAoSW5zdGFuY2UgaW5zdGFuY2UgaW4gaW5zdGFuY2VzKSB7CiAgICAgICAgICAgIGluc3RhbnRpYXRlZFR5cGVzLmFkZChpbnN0YW5jZS50eXBlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIEtDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCA9IG5ldyBLQ2xvc2VkV29ybGRJbXBsKF9lbGVtZW50TWFwLAogICAgICAgIG9wdGlvbnM6IF9vcHRpb25zLAogICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudDogX2VsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICBkYXJ0VHlwZXM6IF9kYXJ0VHlwZXMsCiAgICAgICAgY29tbW9uRWxlbWVudHM6IF9jb21tb25FbGVtZW50cywKICAgICAgICBuYXRpdmVEYXRhOiBfbmF0aXZlRGF0YUJ1aWxkZXIuY2xvc2UoKSwKICAgICAgICBpbnRlcmNlcHRvckRhdGE6IF9pbnRlcmNlcHRvckRhdGFCdWlsZGVyLmNsb3NlKCksCiAgICAgICAgYmFja2VuZFVzYWdlOiBiYWNrZW5kVXNhZ2UsCiAgICAgICAgbm9TdWNoTWV0aG9kRGF0YTogX25vU3VjaE1ldGhvZFJlZ2lzdHJ5LmNsb3NlKCksCiAgICAgICAgcnRpTmVlZEJ1aWxkZXI6IF9ydGlOZWVkQnVpbGRlciwKICAgICAgICBmaWVsZEFuYWx5c2lzOiBfYWxsb2NhdG9yQW5hbHlzaXMsCiAgICAgICAgaW1wbGVtZW50ZWRDbGFzc2VzOiBfaW1wbGVtZW50ZWRDbGFzc2VzLAogICAgICAgIGxpdmVOYXRpdmVDbGFzc2VzOiBfbmF0aXZlUmVzb2x1dGlvbkVucXVldWVyLmxpdmVOYXRpdmVDbGFzc2VzLAogICAgICAgIGxpdmVJbnN0YW5jZU1lbWJlcnM6IF9saXZlSW5zdGFuY2VNZW1iZXJzLAogICAgICAgIGFzc2lnbmVkSW5zdGFuY2VNZW1iZXJzOiBjb21wdXRlQXNzaWduZWRJbnN0YW5jZU1lbWJlcnMoKSwKICAgICAgICBsaXZlTWVtYmVyVXNhZ2U6IGxpdmVNZW1iZXJVc2FnZSwKICAgICAgICBtaXhpblVzZXM6IF9jbGFzc0hpZXJhcmNoeUJ1aWxkZXIubWl4aW5Vc2VzLAogICAgICAgIHR5cGVzSW1wbGVtZW50ZWRCeVN1YmNsYXNzZXM6IHR5cGVzSW1wbGVtZW50ZWRCeVN1YmNsYXNzZXMsCiAgICAgICAgY2xhc3NIaWVyYXJjaHk6IF9jbGFzc0hpZXJhcmNoeUJ1aWxkZXIuY2xvc2UoKSwKICAgICAgICBhbm5vdGF0aW9uc0RhdGE6IF9hbm5vdGF0aW9uc0RhdGFCdWlsZGVyLmNsb3NlKF9vcHRpb25zKSwKICAgICAgICBpc0NoZWNrczogX2lzQ2hlY2tzLAogICAgICAgIHN0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IHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMudW5pdmVyc2Uud29ybGRfaW1wYWN0OwoKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCcgc2hvdyBTZXRsZXQ7CmltcG9ydCAndXNlLmRhcnQnOwoKLy8vIERlc2NyaWJlcyBob3cgYW4gZWxlbWVudCAoZS5nLiBhIG1ldGhvZCkgaW1wYWN0cyB0aGUgY2xvc2VkLXdvcmxkCi8vLyBzZW1hbnRpY3Mgb2YgYSBwcm9ncmFtLgovLy8KLy8vIEEgW1dvcmxkSW1wYWN0XSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBob3cgYSBwcm9ncmFtIGVsZW1lbnQgYWZmZWN0cyBvdXIKLy8vIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdCdzIGxpdmUgaW4gYSBwcm9ncmFtLiBGb3IgZXhhbXBsZSwgaXQgY2FuIGluZGljYXRlCi8vLyB0aGF0IGEgbWV0aG9kIHVzZXMgYSBjZXJ0YWluIGZlYXR1cmUsIG9yIGFsbG9jYXRlcyBhIHNwZWNpZmljIHR5cGUuCi8vLwovLy8gVGhlIGltcGFjdCBvYmplY3QgY2FuIGJlIGNvbXB1dGVkIGxvY2FsbHkgYnkgaW5zcGVjdGluZyBqdXN0IHRoZSByZXNvbHV0aW9uCi8vLyBpbmZvcm1hdGlvbiBvZiB0aGF0IGVsZW1lbnQgYWxvbmUuIFRoZSBjb21waWxlciB1c2VzIFtVbml2ZXJzZV0gYW5kCi8vLyBbV29ybGRdIHRvIGNvbWJpbmUgdGhlIGluZm9ybWF0aW9uIGRpc2NvdmVyZWQgaW4gdGhlIGltcGFjdCBvYmplY3RzIG9mCi8vLyBhbGwgZWxlbWVudHMgcmVhY2hhYmxlIGluIGFuIGFwcGxpY2F0aW9uLgpjbGFzcyBXb3JsZEltcGFjdCB7CiAgY29uc3QgV29ybGRJbXBhY3QoKTsKCiAgTWVtYmVyRW50aXR5IGdldCBtZW1iZXIgPT4gbnVsbDsKCiAgSXRlcmFibGU8RHluYW1pY1VzZT4gZ2V0IGR5bmFtaWNVc2VzID0+IGNvbnN0IDxEeW5hbWljVXNlPltdOwoKICBJdGVyYWJsZTxTdGF0aWNVc2U+IGdldCBzdGF0aWNVc2VzID0+IGNvbnN0IDxTdGF0aWNVc2U+W107CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlcGxhY2UgdGhpcyBieSBjYWxsZWQgY29uc3RydWN0b3JzIHdpdGggdHlwZQogIC8vIGFyZ3VtZW50cy4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDb2xsZWN0IGFsbCBjaGVja2VkIHR5cGVzIGZvciBjaGVja2VkIG1vZGUgc2VwYXJhdGVseQogIC8vIHRvIHN1cHBvcnQgc2VyaWFsaXphdGlvbi4KCiAgSXRlcmFibGU8VHlwZVVzZT4gZ2V0IHR5cGVVc2VzID0+IGNvbnN0IDxUeXBlVXNlPltdOwoKICBJdGVyYWJsZTxDb25zdGFudFVzZT4gZ2V0IGNvbnN0YW50VXNlcyA9PiBjb25zdCA8Q29uc3RhbnRVc2U+W107CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gdHJ1ZTsKCiAgdm9pZCBhcHBseShXb3JsZEltcGFjdFZpc2l0b3IgdmlzaXRvcikgewogICAgc3RhdGljVXNlcy5mb3JFYWNoKChTdGF0aWNVc2UgdXNlKSA9PiB2aXNpdG9yLnZpc2l0U3RhdGljVXNlKG1lbWJlciwgdXNlKSk7CiAgICBkeW5hbWljVXNlcwogICAgICAgIC5mb3JFYWNoKChEeW5hbWljVXNlIHVzZSkgPT4gdmlzaXRvci52aXNpdER5bmFtaWNVc2UobWVtYmVyLCB1c2UpKTsKICAgIHR5cGVVc2VzLmZvckVhY2goKFR5cGVVc2UgdXNlKSA9PiB2aXNpdG9yLnZpc2l0VHlwZVVzZShtZW1iZXIsIHVzZSkpOwogICAgY29uc3RhbnRVc2VzCiAgICAgICAgLmZvckVhY2goKENvbnN0YW50VXNlIHVzZSkgPT4gdmlzaXRvci52aXNpdENvbnN0YW50VXNlKG1lbWJlciwgdXNlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBkdW1wKHRoaXMpOwoKICBzdGF0aWMgU3RyaW5nIGR1bXAoV29ybGRJbXBhY3Qgd29ybGRJbXBhY3QpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHByaW50T24oc2IsIHdvcmxkSW1wYWN0KTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgc3RhdGljIHZvaWQgcHJpbnRPbihTdHJpbmdCdWZmZXIgc2IsIFdvcmxkSW1wYWN0IHdvcmxkSW1wYWN0KSB7CiAgICBzYi53cml0ZSgnbWVtYmVyOiAke3dvcmxkSW1wYWN0Lm1lbWJlcn0nKTsKCiAgICB2b2lkIGFkZChTdHJpbmcgdGl0bGUsIEl0ZXJhYmxlIGl0ZXJhYmxlKSB7CiAgICAgIGlmIChpdGVyYWJsZS5pc05vdEVtcHR5KSB7CiAgICAgICAgc2Iud3JpdGUoJ1xuICR0aXRsZTonKTsKICAgICAgICBpdGVyYWJsZS5mb3JFYWNoKChlKSA9PiBzYi53cml0ZSgnXG4gICRlJykpOwogICAgICB9CiAgICB9CgogICAgYWRkKCdkeW5hbWljIHVzZXMnLCB3b3JsZEltcGFjdC5keW5hbWljVXNlcyk7CiAgICBhZGQoJ3N0YXRpYyB1c2VzJywgd29ybGRJbXBhY3Quc3RhdGljVXNlcyk7CiAgICBhZGQoJ3R5cGUgdXNlcycsIHdvcmxkSW1wYWN0LnR5cGVVc2VzKTsKICAgIGFkZCgnY29uc3RhbnQgdXNlcycsIHdvcmxkSW1wYWN0LmNvbnN0YW50VXNlcyk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBXb3JsZEltcGFjdEJ1aWxkZXIgewogIHZvaWQgcmVnaXN0ZXJEeW5hbWljVXNlKER5bmFtaWNVc2UgZHluYW1pY1VzZSk7CiAgdm9pZCByZWdpc3RlclR5cGVVc2UoVHlwZVVzZSB0eXBlVXNlKTsKICB2b2lkIHJlZ2lzdGVyU3RhdGljVXNlKFN0YXRpY1VzZSBzdGF0aWNVc2UpOwogIHZvaWQgcmVnaXN0ZXJDb25zdGFudFVzZShDb25zdGFudFVzZSBjb25zdGFudFVzZSk7Cn0KCmNsYXNzIFdvcmxkSW1wYWN0QnVpbGRlckltcGwgZXh0ZW5kcyBXb3JsZEltcGFjdCBpbXBsZW1lbnRzIFdvcmxkSW1wYWN0QnVpbGRlciB7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRG8gd2UgYmVuZWZpdCBmcm9tIGxhenkgaW5pdGlhbGl6YXRpb24gb2YgdGhlCiAgLy8gW1NldGxldF1zPwogIFNldDxEeW5hbWljVXNlPiBfZHluYW1pY1VzZXM7CiAgU2V0PFN0YXRpY1VzZT4gX3N0YXRpY1VzZXM7CiAgU2V0PFR5cGVVc2U+IF90eXBlVXNlczsKICBTZXQ8Q29uc3RhbnRVc2U+IF9jb25zdGFudFVzZXM7CgogIFdvcmxkSW1wYWN0QnVpbGRlckltcGwoKTsKCiAgV29ybGRJbXBhY3RCdWlsZGVySW1wbC5pbnRlcm5hbCgKICAgICAgdGhpcy5fZHluYW1pY1VzZXMsIHRoaXMuX3N0YXRpY1VzZXMsIHRoaXMuX3R5cGVVc2VzLCB0aGlzLl9jb25zdGFudFVzZXMpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0VtcHR5ID0+CiAgICAgIF9keW5hbWljVXNlcyA9PSBudWxsICYmCiAgICAgIF9zdGF0aWNVc2VzID09IG51bGwgJiYKICAgICAgX3R5cGVVc2VzID09IG51bGwgJiYKICAgICAgX2NvbnN0YW50VXNlcyA9PSBudWxsOwoKICAvLy8gQ29weSB1c2VzIGluIFtpbXBhY3RdIHRvIHRoaXMgaW1wYWN0IGJ1aWxkZXIuCiAgdm9pZCBhZGRJbXBhY3QoV29ybGRJbXBhY3QgaW1wYWN0KSB7CiAgICBpZiAoaW1wYWN0LmlzRW1wdHkpIHJldHVybjsKICAgIGltcGFjdC5keW5hbWljVXNlcy5mb3JFYWNoKHJlZ2lzdGVyRHluYW1pY1VzZSk7CiAgICBpbXBhY3Quc3RhdGljVXNlcy5mb3JFYWNoKHJlZ2lzdGVyU3RhdGljVXNlKTsKICAgIGltcGFjdC50eXBlVXNlcy5mb3JFYWNoKHJlZ2lzdGVyVHlwZVVzZSk7CiAgICBpbXBhY3QuY29uc3RhbnRVc2VzLmZvckVhY2gocmVnaXN0ZXJDb25zdGFudFVzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyRHluYW1pY1VzZShEeW5hbWljVXNlIGR5bmFtaWNVc2UpIHsKICAgIGFzc2VydChkeW5hbWljVXNlICE9IG51bGwpOwogICAgX2R5bmFtaWNVc2VzID8/PSBuZXcgU2V0bGV0PER5bmFtaWNVc2U+KCk7CiAgICBfZHluYW1pY1VzZXMuYWRkKGR5bmFtaWNVc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8RHluYW1pY1VzZT4gZ2V0IGR5bmFtaWNVc2VzIHsKICAgIHJldHVybiBfZHluYW1pY1VzZXMgIT0gbnVsbCA/IF9keW5hbWljVXNlcyA6IGNvbnN0IDxEeW5hbWljVXNlPltdOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclR5cGVVc2UoVHlwZVVzZSB0eXBlVXNlKSB7CiAgICBhc3NlcnQodHlwZVVzZSAhPSBudWxsKTsKICAgIF90eXBlVXNlcyA/Pz0gbmV3IFNldGxldDxUeXBlVXNlPigpOwogICAgX3R5cGVVc2VzLmFkZCh0eXBlVXNlKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFR5cGVVc2U+IGdldCB0eXBlVXNlcyB7CiAgICByZXR1cm4gX3R5cGVVc2VzICE9IG51bGwgPyBfdHlwZVVzZXMgOiBjb25zdCA8VHlwZVVzZT5bXTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdGF0aWNVc2UoU3RhdGljVXNlIHN0YXRpY1VzZSkgewogICAgYXNzZXJ0KHN0YXRpY1VzZSAhPSBudWxsKTsKICAgIF9zdGF0aWNVc2VzID8/PSBuZXcgU2V0bGV0PFN0YXRpY1VzZT4oKTsKICAgIF9zdGF0aWNVc2VzLmFkZChzdGF0aWNVc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8U3RhdGljVXNlPiBnZXQgc3RhdGljVXNlcyB7CiAgICByZXR1cm4gX3N0YXRpY1VzZXMgIT0gbnVsbCA/IF9zdGF0aWNVc2VzIDogY29uc3QgPFN0YXRpY1VzZT5bXTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDb25zdGFudFVzZShDb25zdGFudFVzZSBjb25zdGFudFVzZSkgewogICAgYXNzZXJ0KGNvbnN0YW50VXNlICE9IG51bGwpOwogICAgX2NvbnN0YW50VXNlcyA/Pz0gbmV3IFNldGxldDxDb25zdGFudFVzZT4oKTsKICAgIF9jb25zdGFudFVzZXMuYWRkKGNvbnN0YW50VXNlKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENvbnN0YW50VXNlPiBnZXQgY29uc3RhbnRVc2VzIHsKICAgIHJldHVybiBfY29uc3RhbnRVc2VzICE9IG51bGwgPyBfY29uc3RhbnRVc2VzIDogY29uc3QgPENvbnN0YW50VXNlPltdOwogIH0KfQoKLy8vIFtXb3JsZEltcGFjdEJ1aWxkZXJdIHRoYXQgY2FuIGNyZWF0ZSBhbmQgY29sbGVjdCBhIHNlcXVlbmNlIG9mCi8vLyBbV29ybGRJbXBhY3Rdcy4KY2xhc3MgU3RhZ2VkV29ybGRJbXBhY3RCdWlsZGVyIGltcGxlbWVudHMgV29ybGRJbXBhY3RCdWlsZGVyIHsKICBmaW5hbCBib29sIGNvbGxlY3RJbXBhY3RzOwogIFdvcmxkSW1wYWN0QnVpbGRlckltcGwgX2N1cnJlbnRCdWlsZGVyOwogIExpc3Q8V29ybGRJbXBhY3RCdWlsZGVySW1wbD4gX2J1aWxkZXJzID0gPFdvcmxkSW1wYWN0QnVpbGRlckltcGw+W107CgogIFN0YWdlZFdvcmxkSW1wYWN0QnVpbGRlcih7dGhpcy5jb2xsZWN0SW1wYWN0czogZmFsc2V9KTsKCiAgdm9pZCBfZW5zdXJlQnVpbGRlcigpIHsKICAgIGlmIChfY3VycmVudEJ1aWxkZXIgPT0gbnVsbCkgewogICAgICBfY3VycmVudEJ1aWxkZXIgPSBuZXcgV29ybGRJbXBhY3RCdWlsZGVySW1wbCgpOwogICAgICBpZiAoY29sbGVjdEltcGFjdHMpIHsKICAgICAgICBfYnVpbGRlcnMuYWRkKF9jdXJyZW50QnVpbGRlcik7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJUeXBlVXNlKFR5cGVVc2UgdHlwZVVzZSkgewogICAgX2Vuc3VyZUJ1aWxkZXIoKTsKICAgIF9jdXJyZW50QnVpbGRlci5yZWdpc3RlclR5cGVVc2UodHlwZVVzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyRHluYW1pY1VzZShEeW5hbWljVXNlIGR5bmFtaWNVc2UpIHsKICAgIF9lbnN1cmVCdWlsZGVyKCk7CiAgICBfY3VycmVudEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKGR5bmFtaWNVc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN0YXRpY1VzZShTdGF0aWNVc2Ugc3RhdGljVXNlKSB7CiAgICBfZW5zdXJlQnVpbGRlcigpOwogICAgX2N1cnJlbnRCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKHN0YXRpY1VzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQ29uc3RhbnRVc2UoQ29uc3RhbnRVc2UgY29uc3RhbnRVc2UpIHsKICAgIF9lbnN1cmVCdWlsZGVyKCk7CiAgICBfY3VycmVudEJ1aWxkZXIucmVnaXN0ZXJDb25zdGFudFVzZShjb25zdGFudFVzZSk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgW1dvcmxkSW1wYWN0XSBidWlsdCBzbyBmYXIgd2l0aCB0aGlzIGJ1aWxkZXIuIFRoZSBidWlsZGVyCiAgLy8vIGlzIHJlc2V0LCBhbmQgaWYgW2NvbGxlY3RJbXBhY3RzXSBpcyBgdHJ1ZWAgdGhlIGltcGFjdCBpcyBjYWNoZWQgZm9yCiAgLy8vIFt3b3JsZEltcGFjdHNdLgogIFdvcmxkSW1wYWN0IGZsdXNoKCkgewogICAgaWYgKF9jdXJyZW50QnVpbGRlciA9PSBudWxsKSByZXR1cm4gY29uc3QgV29ybGRJbXBhY3QoKTsKICAgIFdvcmxkSW1wYWN0IHdvcmxkSW1wYWN0ID0gX2N1cnJlbnRCdWlsZGVyOwogICAgX2N1cnJlbnRCdWlsZGVyID0gbnVsbDsKICAgIHJldHVybiB3b3JsZEltcGFjdDsKICB9CgogIC8vLyBJZiBbY29sbGVjdEltcGFjdHNdIGlzIGB0cnVlYCB0aGlzIHJldHVybnMgYWxsIFtXb3JsZEltcGFjdF1zIGJ1aWx0IHdpdGgKICAvLy8gdGhpcyBidWlsZGVyLgogIEl0ZXJhYmxlPFdvcmxkSW1wYWN0PiBnZXQgd29ybGRJbXBhY3RzID0+IF9idWlsZGVyczsKfQoKLy8vIE11dGFibGUgaW1wbGVtZW50YXRpb24gb2YgW1dvcmxkSW1wYWN0XSB1c2VkIHRvIHRyYW5zZm9ybQovLy8gW1Jlc29sdXRpb25JbXBhY3RdIG9yIFtDb2RlZ2VuSW1wYWN0XSB0byBbV29ybGRJbXBhY3RdLgpjbGFzcyBUcmFuc2Zvcm1lZFdvcmxkSW1wYWN0IGltcGxlbWVudHMgV29ybGRJbXBhY3QsIFdvcmxkSW1wYWN0QnVpbGRlciB7CiAgZmluYWwgV29ybGRJbXBhY3Qgd29ybGRJbXBhY3Q7CgogIFNldGxldDxTdGF0aWNVc2U+IF9zdGF0aWNVc2VzOwogIFNldGxldDxUeXBlVXNlPiBfdHlwZVVzZXM7CiAgU2V0bGV0PER5bmFtaWNVc2U+IF9keW5hbWljVXNlczsKICBTZXRsZXQ8Q29uc3RhbnRVc2U+IF9jb25zdGFudFVzZXM7CgogIFRyYW5zZm9ybWVkV29ybGRJbXBhY3QodGhpcy53b3JsZEltcGFjdCk7CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBnZXQgbWVtYmVyID0+IHdvcmxkSW1wYWN0Lm1lbWJlcjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbXB0eSB7CiAgICByZXR1cm4gd29ybGRJbXBhY3QuaXNFbXB0eSAmJgogICAgICAgIF9zdGF0aWNVc2VzID09IG51bGwgJiYKICAgICAgICBfdHlwZVVzZXMgPT0gbnVsbCAmJgogICAgICAgIF9keW5hbWljVXNlcyA9PSBudWxsICYmCiAgICAgICAgX2NvbnN0YW50VXNlcyA9PSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8RHluYW1pY1VzZT4gZ2V0IGR5bmFtaWNVc2VzIHsKICAgIHJldHVybiBfZHluYW1pY1VzZXMgIT0gbnVsbCA/IF9keW5hbWljVXNlcyA6IHdvcmxkSW1wYWN0LmR5bmFtaWNVc2VzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckR5bmFtaWNVc2UoRHluYW1pY1VzZSBkeW5hbWljVXNlKSB7CiAgICBpZiAoX2R5bmFtaWNVc2VzID09IG51bGwpIHsKICAgICAgX2R5bmFtaWNVc2VzID0gbmV3IFNldGxldDxEeW5hbWljVXNlPigpOwogICAgICBfZHluYW1pY1VzZXMuYWRkQWxsKHdvcmxkSW1wYWN0LmR5bmFtaWNVc2VzKTsKICAgIH0KICAgIF9keW5hbWljVXNlcy5hZGQoZHluYW1pY1VzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyVHlwZVVzZShUeXBlVXNlIHR5cGVVc2UpIHsKICAgIGlmIChfdHlwZVVzZXMgPT0gbnVsbCkgewogICAgICBfdHlwZVVzZXMgPSBuZXcgU2V0bGV0PFR5cGVVc2U+KCk7CiAgICAgIF90eXBlVXNlcy5hZGRBbGwod29ybGRJbXBhY3QudHlwZVVzZXMpOwogICAgfQogICAgX3R5cGVVc2VzLmFkZCh0eXBlVXNlKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFR5cGVVc2U+IGdldCB0eXBlVXNlcyB7CiAgICByZXR1cm4gX3R5cGVVc2VzICE9IG51bGwgPyBfdHlwZVVzZXMgOiB3b3JsZEltcGFjdC50eXBlVXNlczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdGF0aWNVc2UoU3RhdGljVXNlIHN0YXRpY1VzZSkgewogICAgaWYgKF9zdGF0aWNVc2VzID09IG51bGwpIHsKICAgICAgX3N0YXRpY1VzZXMgPSBuZXcgU2V0bGV0PFN0YXRpY1VzZT4oKTsKICAgICAgX3N0YXRpY1VzZXMuYWRkQWxsKHdvcmxkSW1wYWN0LnN0YXRpY1VzZXMpOwogICAgfQogICAgX3N0YXRpY1VzZXMuYWRkKHN0YXRpY1VzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxTdGF0aWNVc2U+IGdldCBzdGF0aWNVc2VzIHsKICAgIHJldHVybiBfc3RhdGljVXNlcyAhPSBudWxsID8gX3N0YXRpY1VzZXMgOiB3b3JsZEltcGFjdC5zdGF0aWNVc2VzOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q29uc3RhbnRVc2U+IGdldCBjb25zdGFudFVzZXMgewogICAgcmV0dXJuIF9jb25zdGFudFVzZXMgIT0gbnVsbCA/IF9jb25zdGFudFVzZXMgOiB3b3JsZEltcGFjdC5jb25zdGFudFVzZXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQ29uc3RhbnRVc2UoQ29uc3RhbnRVc2UgY29uc3RhbnRVc2UpIHsKICAgIGlmIChfY29uc3RhbnRVc2VzID09IG51bGwpIHsKICAgICAgX2NvbnN0YW50VXNlcyA9IG5ldyBTZXRsZXQ8Q29uc3RhbnRVc2U+KCk7CiAgICAgIF9jb25zdGFudFVzZXMuYWRkQWxsKHdvcmxkSW1wYWN0LmNvbnN0YW50VXNlcyk7CiAgICB9CiAgICBfY29uc3RhbnRVc2VzLmFkZChjb25zdGFudFVzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFwcGx5KFdvcmxkSW1wYWN0VmlzaXRvciB2aXNpdG9yKSB7CiAgICBzdGF0aWNVc2VzLmZvckVhY2goKFN0YXRpY1VzZSB1c2UpID0+IHZpc2l0b3IudmlzaXRTdGF0aWNVc2UobWVtYmVyLCB1c2UpKTsKICAgIGR5bmFtaWNVc2VzCiAgICAgICAgLmZvckVhY2goKER5bmFtaWNVc2UgdXNlKSA9PiB2aXNpdG9yLnZpc2l0RHluYW1pY1VzZShtZW1iZXIsIHVzZSkpOwogICAgdHlwZVVzZXMuZm9yRWFjaCgoVHlwZVVzZSB1c2UpID0+IHZpc2l0b3IudmlzaXRUeXBlVXNlKG1lbWJlciwgdXNlKSk7CiAgICBjb25zdGFudFVzZXMKICAgICAgICAuZm9yRWFjaCgoQ29uc3RhbnRVc2UgdXNlKSA9PiB2aXNpdG9yLnZpc2l0Q29uc3RhbnRVc2UobWVtYmVyLCB1c2UpKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdUcmFuc2Zvcm1lZFdvcmxkSW1wYWN0KCR3b3JsZEltcGFjdCknKTsKICAgIFdvcmxkSW1wYWN0LnByaW50T24oc2IsIHRoaXMpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgovLy8gQ29uc3RhbnQgdXNlZCB0byBkZW5vdGUgYSBzcGVjaWZpYyB1c2Ugb2YgYSBbV29ybGRJbXBhY3RdLgpjbGFzcyBJbXBhY3RVc2VDYXNlIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgY29uc3QgSW1wYWN0VXNlQ2FzZSh0aGlzLm5hbWUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnSW1wYWN0VXNlQ2FzZSgkbmFtZSknOwp9CgovLy8gU3RyYXRlZ3kgdXNlZCBmb3IgcHJvY2Vzc2luZyBbV29ybGRJbXBhY3RdIG9iamVjdCBpbiB2YXJpb3VzIHVzZSBjYXNlcy4KY2xhc3MgSW1wYWN0U3RyYXRlZ3kgewogIGNvbnN0IEltcGFjdFN0cmF0ZWd5KCk7CgogIC8vLyBBcHBsaWVzIFtpbXBhY3RdIHRvIFt2aXNpdG9yXSBmb3IgdGhlIFtpbXBhY3RVc2VDYXNlXSBvZiBbaW1wYWN0U291cmNlXS4KICB2b2lkIHZpc2l0SW1wYWN0KHZhciBpbXBhY3RTb3VyY2UsIFdvcmxkSW1wYWN0IGltcGFjdCwKICAgICAgV29ybGRJbXBhY3RWaXNpdG9yIHZpc2l0b3IsIEltcGFjdFVzZUNhc2UgaW1wYWN0VXNlQ2FzZSkgewogICAgLy8gQXBwbHkgdW5jb25kaXRpb25hbGx5LgogICAgaW1wYWN0LmFwcGx5KHZpc2l0b3IpOwogIH0KCiAgLy8vIE5vdGlmaWVzIHRoZSBzdHJhdGVneSB0aGF0IG5vIG1vcmUgaW1wYWN0cyBvZiBbaW1wYWN0VXNlQ2FzZV0gd2lsbCBiZQogIC8vLyBhcHBsaWVkLgogIHZvaWQgb25JbXBhY3RVc2VkKEltcGFjdFVzZUNhc2UgaW1wYWN0VXNlQ2FzZSkgewogICAgLy8gRG8gbm90aGluZy4KICB9Cn0KCi8vLyBWaXNpdG9yIHVzZWQgdG8gcHJvY2VzcyB0aGUgdXNlcyBvZiBhIFtXb3JsZEltcGFjdF0uCmFic3RyYWN0IGNsYXNzIFdvcmxkSW1wYWN0VmlzaXRvciB7CiAgdm9pZCB2aXNpdFN0YXRpY1VzZShNZW1iZXJFbnRpdHkgbWVtYmVyLCBTdGF0aWNVc2Ugc3RhdGljVXNlKTsKICB2b2lkIHZpc2l0RHluYW1pY1VzZShNZW1iZXJFbnRpdHkgbWVtYmVyLCBEeW5hbWljVXNlIGR5bmFtaWNVc2UpOwogIHZvaWQgdmlzaXRUeXBlVXNlKE1lbWJlckVudGl0eSBtZW1iZXIsIFR5cGVVc2UgdHlwZVVzZSk7CiAgdm9pZCB2aXNpdENvbnN0YW50VXNlKE1lbWJlckVudGl0eSBtZW1iZXIsIENvbnN0YW50VXNlIHR5cGVVc2UpOwp9CgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhlc2Ugd2hlbiB3ZSBnZXQgYW5vbnltb3VzIGxvY2FsIGNsYXNzZXMuCnR5cGVkZWYgdm9pZCBWaXNpdFVzZTxVPihNZW1iZXJFbnRpdHkgbWVtYmVyLCBVIHVzZSk7CgpjbGFzcyBXb3JsZEltcGFjdFZpc2l0b3JJbXBsIGltcGxlbWVudHMgV29ybGRJbXBhY3RWaXNpdG9yIHsKICBmaW5hbCBWaXNpdFVzZTxTdGF0aWNVc2U+IF92aXNpdFN0YXRpY1VzZTsKICBmaW5hbCBWaXNpdFVzZTxEeW5hbWljVXNlPiBfdmlzaXREeW5hbWljVXNlOwogIGZpbmFsIFZpc2l0VXNlPFR5cGVVc2U+IF92aXNpdFR5cGVVc2U7CiAgZmluYWwgVmlzaXRVc2U8Q29uc3RhbnRVc2U+IF92aXNpdENvbnN0YW50VXNlOwoKICBXb3JsZEltcGFjdFZpc2l0b3JJbXBsKAogICAgICB7VmlzaXRVc2U8U3RhdGljVXNlPiB2aXNpdFN0YXRpY1VzZSwKICAgICAgVmlzaXRVc2U8RHluYW1pY1VzZT4gdmlzaXREeW5hbWljVXNlLAogICAgICBWaXNpdFVzZTxUeXBlVXNlPiB2aXNpdFR5cGVVc2UsCiAgICAgIFZpc2l0VXNlPENvbnN0YW50VXNlPiB2aXNpdENvbnN0YW50VXNlfSkKICAgICAgOiBfdmlzaXRTdGF0aWNVc2UgPSB2aXNpdFN0YXRpY1VzZSwKICAgICAgICBfdmlzaXREeW5hbWljVXNlID0gdmlzaXREeW5hbWljVXNlLAogICAgICAgIF92aXNpdFR5cGVVc2UgPSB2aXNpdFR5cGVVc2UsCiAgICAgICAgX3Zpc2l0Q29uc3RhbnRVc2UgPSB2aXNpdENvbnN0YW50VXNlOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljVXNlKE1lbWJlckVudGl0eSBtZW1iZXIsIFN0YXRpY1VzZSB1c2UpIHsKICAgIGlmIChfdmlzaXRTdGF0aWNVc2UgIT0gbnVsbCkgewogICAgICBfdmlzaXRTdGF0aWNVc2UobWVtYmVyLCB1c2UpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdER5bmFtaWNVc2UoTWVtYmVyRW50aXR5IG1lbWJlciwgRHluYW1pY1VzZSB1c2UpIHsKICAgIGlmIChfdmlzaXREeW5hbWljVXNlICE9IG51bGwpIHsKICAgICAgX3Zpc2l0RHluYW1pY1VzZShtZW1iZXIsIHVzZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZVVzZShNZW1iZXJFbnRpdHkgbWVtYmVyLCBUeXBlVXNlIHVzZSkgewogICAgaWYgKF92aXNpdFR5cGVVc2UgIT0gbnVsbCkgewogICAgICBfdmlzaXRUeXBlVXNlKG1lbWJlciwgdXNlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25zdGFudFVzZShNZW1iZXJFbnRpdHkgbWVtYmVyLCBDb25zdGFudFVzZSB1c2UpIHsKICAgIGlmIChfdmlzaXRDb25zdGFudFVzZSAhPSBudWxsKSB7CiAgICAgIF92aXNpdENvbnN0YW50VXNlKG1lbWJlciwgdXNlKTsKICAgIH0KICB9Cn0KgZIATk48AScBJCgTAUYcBFFMSARQSEsuFBcBIwFAAT0BSBBQHwE3AUMBHAErUBBMShFOBAEMIwEwKh4aBAFCLwEwISA1CAYBMjAsNAQCASQyKS81AgFRSBAgHhoiARwBI1ABDBYeHRsdATQnIDQyLjYEAQwzIC8iBAEMKUcEAQwqHSkcBAEMIz4EAQwwHy0gBAEMJ0QEAQw2ITEkBAEMK0oEAgFDFD8dKkcBOgEaIzYcKAgGBAEMKhYuBAEMMxY0BAEMMBYyBAEMNhY2BAFMSxYYPS8cGAQBTxQ3AgE+PEohASEdIyUBLAEMMQEMFSIfHSAfBAEMKUoEAQwzIC80BiIEAQwqHSkuBhwEAQwjQQQBDDAfLTIGIAQBDCdHBAEMK00EAQw2ITE2BiQEAQwrUBBMShFOBAEMFio2IxoEAgE/FhUBIgEMLwIBTBcaAU85QR4bBAFMDzMTBAIBOSRBRDtDAgFKNgE9LS8pMQEaKywmLyosJi4BDDwjJAYEAQw+JCUGBAEMOCEiBgQBDEAlJgYEAgEvcGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2Uvd29ybGRfaW1wYWN0LmRhcnQoc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvd29ybGQuZGFydLIvLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy53b3JsZDsKCmltcG9ydCAnY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICdjb21tb24uZGFydCc7CmltcG9ydCAnY29tbW9uX2VsZW1lbnRzLmRhcnQnCiAgICBzaG93CiAgICAgICAgSkNvbW1vbkVsZW1lbnRzLAogICAgICAgIEpFbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgS0NvbW1vbkVsZW1lbnRzLAogICAgICAgIEtFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnZGVmZXJyZWRfbG9hZC5kYXJ0JzsKaW1wb3J0ICdkaWFnbm9zdGljcy9kaWFnbm9zdGljX2xpc3RlbmVyLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRzL25hbWVzLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJ2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICdpci9zdGF0aWNfdHlwZS5kYXJ0JzsKaW1wb3J0ICdqc19iYWNrZW5kL2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJ2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCcgc2hvdyBKRmllbGRBbmFseXNpcywgS0ZpZWxkQW5hbHlzaXM7CmltcG9ydCAnanNfYmFja2VuZC9iYWNrZW5kX3VzYWdlLmRhcnQnIHNob3cgQmFja2VuZFVzYWdlOwppbXBvcnQgJ2pzX2JhY2tlbmQvaW50ZXJjZXB0b3JfZGF0YS5kYXJ0JyBzaG93IEludGVyY2VwdG9yRGF0YTsKaW1wb3J0ICdqc19iYWNrZW5kL25hdGl2ZV9kYXRhLmRhcnQnIHNob3cgTmF0aXZlRGF0YTsKaW1wb3J0ICdqc19iYWNrZW5kL25vX3N1Y2hfbWV0aG9kX3JlZ2lzdHJ5LmRhcnQnIHNob3cgTm9TdWNoTWV0aG9kRGF0YTsKaW1wb3J0ICdqc19iYWNrZW5kL3J1bnRpbWVfdHlwZXNfcmVzb2x1dGlvbi5kYXJ0JyBzaG93IFJ1bnRpbWVUeXBlc05lZWQ7CmltcG9ydCAnanNfbW9kZWwvbG9jYWxzLmRhcnQnOwppbXBvcnQgJ2pzX2VtaXR0ZXIvc29ydGVyLmRhcnQnOwppbXBvcnQgJ3VuaXZlcnNlL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKaW1wb3J0ICd1bml2ZXJzZS9tZW1iZXJfdXNhZ2UuZGFydCc7CmltcG9ydCAndW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKCi8vLyBDb21tb24gc3VwZXJpbnRlcmZhY2UgZm9yIFtPcGVuV29ybGRdIGFuZCBbSkNsb3NlZFdvcmxkXS4KYWJzdHJhY3QgY2xhc3MgV29ybGQge30KCi8vLyBUaGUgW0pDbG9zZWRXb3JsZF0gcmVwcmVzZW50cyB0aGUgaW5mb3JtYXRpb24ga25vd24gYWJvdXQgYSBwcm9ncmFtIHdoZW4KLy8vIGNvbXBpbGluZyB3aXRoIGNsb3NlZC13b3JsZCBzZW1hbnRpY3MuCi8vLwovLy8gR2l2ZW4gdGhlIGVudHJ5cG9pbnQgb2YgYW4gYXBwbGljYXRpb24sIHdlIGNhbiB0cmFjayB3aGF0J3MgcmVhY2hhYmxlIGZyb20KLy8vIGl0LCB3aGF0IGZ1bmN0aW9ucyBhcmUgY2FsbGVkLCB3aGF0IGNsYXNzZXMgYXJlIGFsbG9jYXRlZCwgd2hpY2ggbmF0aXZlCi8vLyBKYXZhU2NyaXB0IHR5cGVzIGFyZSB0b3VjaGVkLCB3aGF0IGxhbmd1YWdlIGZlYXR1cmVzIGFyZSB1c2VkLCBhbmQgc28gb24uCi8vLyBUaGlzIHByZWNpc2Uga25vd2xlZGdlIGFib3V0IHdoYXQncyBsaXZlIGluIHRoZSBwcm9ncmFtIGlzIGxhdGVyIHVzZWQgaW4KLy8vIG9wdGltaXphdGlvbnMgYW5kIG90aGVyIGNvbXBpbGVyIGRlY2lzaW9ucyBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYXliZSB0aGlzIHNob3VsZCBqdXN0IGJlIGNhbGxlZCB0aGUgSldvcmxkLgphYnN0cmFjdCBjbGFzcyBKQ2xvc2VkV29ybGQgaW1wbGVtZW50cyBXb3JsZCB7CiAgSkZpZWxkQW5hbHlzaXMgZ2V0IGZpZWxkQW5hbHlzaXM7CgogIEJhY2tlbmRVc2FnZSBnZXQgYmFja2VuZFVzYWdlOwoKICBOYXRpdmVEYXRhIGdldCBuYXRpdmVEYXRhOwoKICBJbnRlcmNlcHRvckRhdGEgZ2V0IGludGVyY2VwdG9yRGF0YTsKCiAgSkVsZW1lbnRFbnZpcm9ubWVudCBnZXQgZWxlbWVudEVudmlyb25tZW50OwoKICBEYXJ0VHlwZXMgZ2V0IGRhcnRUeXBlczsKCiAgSkNvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50czsKCiAgLy8vIFJldHVybnMgdGhlIFtBYnN0cmFjdFZhbHVlRG9tYWluXSB1c2VkIGluIHRoZSBnbG9iYWwgdHlwZSBpbmZlcmVuY2UuCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgYWJzdHJhY3RWYWx1ZURvbWFpbjsKCiAgUnVudGltZVR5cGVzTmVlZCBnZXQgcnRpTmVlZDsKCiAgTm9TdWNoTWV0aG9kRGF0YSBnZXQgbm9TdWNoTWV0aG9kRGF0YTsKCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCBsaXZlTmF0aXZlQ2xhc3NlczsKCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXQgcHJvY2Vzc2VkTWVtYmVyczsKCiAgQ2xhc3NIaWVyYXJjaHkgZ2V0IGNsYXNzSGllcmFyY2h5OwoKICBBbm5vdGF0aW9uc0RhdGEgZ2V0IGFubm90YXRpb25zRGF0YTsKCiAgR2xvYmFsTG9jYWxzTWFwIGdldCBnbG9iYWxMb2NhbHNNYXA7CiAgQ2xvc3VyZURhdGEgZ2V0IGNsb3N1cmVEYXRhTG9va3VwOwoKICBPdXRwdXRVbml0RGF0YSBnZXQgb3V0cHV0VW5pdERhdGE7CgogIC8vLyBUaGUgW1NvcnRlcl0gdXNlZCBmb3Igc29ydGluZyBlbGVtZW50cyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCiAgU29ydGVyIGdldCBzb3J0ZXI7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBpcyBpbXBsZW1lbnRlZCBieSBhbiBpbnN0YW50aWF0ZWQgY2xhc3MuCiAgYm9vbCBpc0ltcGxlbWVudGVkKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSBtb3N0IHNwZWNpZmljIHN1YmNsYXNzIG9mIFtjbHNdIChpbmNsdWRpbmcgW2Nsc10pIHRoYXQgaXMKICAvLy8gZGlyZWN0bHkgaW5zdGFudGlhdGVkIG9yIGEgc3VwZXJjbGFzcyBvZiBhbGwgZGlyZWN0bHkgaW5zdGFudGlhdGVkCiAgLy8vIHN1YmNsYXNzZXMuIElmIFtjbHNdIGlzIG5vdCBpbnN0YW50aWF0ZWQsIGBudWxsYCBpcyByZXR1cm5lZC4KICBDbGFzc0VudGl0eSBnZXRMdWJPZkluc3RhbnRpYXRlZFN1YmNsYXNzZXMoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgdGhlIG1vc3Qgc3BlY2lmaWMgc3VidHlwZSBvZiBbY2xzXSAoaW5jbHVkaW5nIFtjbHNdKSB0aGF0IGlzCiAgLy8vIGRpcmVjdGx5IGluc3RhbnRpYXRlZCBvciBhIHN1cGVyY2xhc3Mgb2YgYWxsIGRpcmVjdGx5IGluc3RhbnRpYXRlZAogIC8vLyBzdWJ0eXBlcy4gSWYgbm8gc3VidHlwZXMgb2YgW2Nsc10gYXJlIGluc3RhbnRpYXRlZCwgYG51bGxgIGlzIHJldHVybmVkLgogIENsYXNzRW50aXR5IGdldEx1Yk9mSW5zdGFudGlhdGVkU3VidHlwZXMoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYW4gaXRlcmFibGUgb3ZlciB0aGUgY29tbW9uIHN1cGVydHlwZXMgb2YgdGhlIFtjbGFzc2VzXS4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gY29tbW9uU3VwZXJ0eXBlc09mKEl0ZXJhYmxlPENsYXNzRW50aXR5PiBjbGFzc2VzKTsKCiAgLy8vIFJldHVybnMgYW4gaXRlcmFibGUgb3ZlciB0aGUgbGl2ZSBtaXhpbiBhcHBsaWNhdGlvbnMgdGhhdCBtaXhpbiBbY2xzXS4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gbWl4aW5Vc2VzT2YoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtjbHNdIGlzIG1peGVkIGludG8gYSBsaXZlIGNsYXNzLgogIGJvb2wgaXNVc2VkQXNNaXhpbihDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGxpdmUgY2xhc3MgdGhhdCBtaXhlcyBpbiBbY2xzXSBpbXBsZW1lbnRzIFt0eXBlXS4KICBib29sIGhhc0FueVN1YmNsYXNzT2ZNaXhpblVzZVRoYXRJbXBsZW1lbnRzKAogICAgICBDbGFzc0VudGl0eSBjbHMsIENsYXNzRW50aXR5IHR5cGUpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGxpdmUgY2xhc3MgdGhhdCBtaXhlcyBpbiBbbWl4aW5dIGlzIGFsc28gYSBzdWJjbGFzcwogIC8vLyBvZiBbc3VwZXJjbGFzc10uCiAgYm9vbCBoYXNBbnlTdWJjbGFzc1RoYXRNaXhlcyhDbGFzc0VudGl0eSBzdXBlcmNsYXNzLCBDbGFzc0VudGl0eSBtaXhpbik7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBvciBhbnkgc3VwZXJjbGFzcyBtaXhlcyBpbiBbbWl4aW5dLgogIGJvb2wgaXNTdWJjbGFzc09mTWl4aW5Vc2VPZihDbGFzc0VudGl0eSBjbHMsIENsYXNzRW50aXR5IG1peGluKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGV2ZXJ5IHN1YnR5cGUgb2YgW3hdIGlzIGEgc3ViY2xhc3Mgb2YgW3ldIG9yIGEgc3ViY2xhc3MKICAvLy8gb2YgYSBtaXhpbiBhcHBsaWNhdGlvbiBvZiBbeV0uCiAgYm9vbCBldmVyeVN1YnR5cGVJc1N1YmNsYXNzT2ZPck1peGluVXNlT2YoQ2xhc3NFbnRpdHkgeCwgQ2xhc3NFbnRpdHkgeSk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgc3ViY2xhc3Mgb2YgW3N1cGVyY2xhc3NdIGltcGxlbWVudHMgW3R5cGVdLgogIGJvb2wgaGFzQW55U3ViY2xhc3NUaGF0SW1wbGVtZW50cyhDbGFzc0VudGl0eSBzdXBlcmNsYXNzLCBDbGFzc0VudGl0eSB0eXBlKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGEgY2FsbCBvZiBbc2VsZWN0b3JdIG9uIFtjbHNdIGFuZC9vciBzdWJjbGFzc2VzL3N1YnR5cGVzCiAgLy8vIG5lZWQgbm9TdWNoTWV0aG9kIGhhbmRsaW5nLgogIC8vLwogIC8vLyBJZiB0aGUgcmVjZWl2ZXIgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGEgbWVtYmVyIHRoYXQgbWF0Y2hlcyB3aGF0IHdlJ3JlCiAgLy8vIGxvb2tpbmcgZm9yLCB0aGVyZSdzIG5vIG5lZWQgdG8gaW50cm9kdWNlIGEgbm9TdWNoTWV0aG9kIGhhbmRsZXIuIEl0IHdpbGwKICAvLy8gbmV2ZXIgYmUgY2FsbGVkLgogIC8vLwogIC8vLyBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGlzIGNsYXNzIGhpZXJhcmNoeToKICAvLy8KICAvLy8gICAgICAgICAgICAgICAgICAgQSAgICA8LS0gbm9TdWNoTWV0aG9kCiAgLy8vICAgICAgICAgICAgICAgICAgLyBcCiAgLy8vICAgICAgICAgICAgICAgICBDICAgQiAgPC0tIGZvbwogIC8vLwogIC8vLyBJZiB3ZSBrbm93IHdlJ3JlIGNhbGxpbmcgZm9vIG9uIGFuIG9iamVjdCBvZiB0eXBlIEIgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeQogIC8vLyBhYm91dCB0aGUgbm9TdWNoTWV0aG9kIG1ldGhvZCBpbiBBIGJlY2F1c2Ugb2JqZWN0cyBvZiB0eXBlIEIgaW1wbGVtZW50CiAgLy8vIGZvby4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHdlIGVuZCB1cCBjYWxsaW5nIGZvbyBvbiBzb21ldGhpbmcgb2YgdHlwZSBDIHdlCiAgLy8vIGhhdmUgdG8gYWRkIGEgaGFuZGxlciBmb3IgaXQuCiAgLy8vCiAgLy8vIElmIHRoZSBob2xkZXJzIG9mIGFsbCB1c2VyLWRlZmluZWQgbm9TdWNoTWV0aG9kIGltcGxlbWVudGF0aW9ucyB0aGF0IG1pZ2h0CiAgLy8vIGJlIGFwcGxpY2FibGUgdG8gdGhlIHJlY2VpdmVyIHR5cGUgaGF2ZSBhIG1hdGNoaW5nIG1lbWJlciBmb3IgdGhlIGN1cnJlbnQKICAvLy8gbmFtZSBhbmQgc2VsZWN0b3IsIHdlIGF2b2lkIGludHJvZHVjaW5nIGEgbm9TdWNoTWV0aG9kIGhhbmRsZXIuCiAgLy8vCiAgLy8vIEFzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoaXMgY2xhc3MgaGllcmFyY2h5OgogIC8vLwogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgIEEgICAgPC0tIGZvbwogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgLyBcCiAgLy8vICAgIG5vU3VjaE1ldGhvZCAtLT4gIEIgICBDICA8LS0gYmFyCiAgLy8vICAgICAgICAgICAgICAgICAgICAgIHwgICB8CiAgLy8vICAgICAgICAgICAgICAgICAgICAgIEMgICBEICA8LS0gbm9TdWNoTWV0aG9kCiAgLy8vCiAgLy8vIFdoZW4gY2FsbGluZyBmb28gb24gYW4gb2JqZWN0IG9mIHR5cGUgQSwgd2Uga25vdyB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbnMKICAvLy8gb2Ygbm9TdWNoTWV0aG9kIGFyZSBpbiB0aGUgY2xhc3NlcyBCIGFuZCBEIHRoYXQgYWxzbyAoaW5kaXJlY3RseSkKICAvLy8gaW1wbGVtZW50IGZvbywgc28gd2UgZG8gbm90IG5lZWQgYSBoYW5kbGVyIGZvciBpdC4KICAvLy8KICAvLy8gSWYgd2UncmUgY2FsbGluZyBiYXIgb24gYW4gb2JqZWN0IG9mIHR5cGUgRCwgd2UgZG9uJ3QgbmVlZCB0aGUgaGFuZGxlcgogIC8vLyBlaXRoZXIgYmVjYXVzZSBhbGwgb2JqZWN0cyBvZiB0eXBlIEQgaW1wbGVtZW50IGJhciB0aHJvdWdoIGluaGVyaXRhbmNlLgogIC8vLwogIC8vLyBJZiB3ZSdyZSBjYWxsaW5nIGJhciBvbiBhbiBvYmplY3Qgb2YgdHlwZSBBIHdlIGRvIG5lZWQgdGhlIGhhbmRsZXIgYmVjYXVzZQogIC8vLyB3ZSBtYXkgaGF2ZSB0byBjYWxsIEIubm9TdWNoTWV0aG9kIHNpbmNlIEIgZG9lcyBub3QgaW1wbGVtZW50IGJhci4KICBib29sIG5lZWRzTm9TdWNoTWV0aG9kKENsYXNzRW50aXR5IGNscywgU2VsZWN0b3Igc2VsZWN0b3IsIENsYXNzUXVlcnkgcXVlcnkpOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIFtlbGVtZW50XSB3aWxsIGJlIHRoZSBvbmUgdXNlZCBhdCBydW50aW1lIHdoZW4gYmVpbmcKICAvLy8gaW52b2tlZCBvbiBhbiBpbnN0YW5jZSBvZiBbY2xzXS4gW25hbWVdIGlzIHVzZWQgdG8gZW5zdXJlIGxpYnJhcnkKICAvLy8gcHJpdmFjeSBpcyB0YWtlbiBpbnRvIGFjY291bnQuCiAgYm9vbCBoYXNFbGVtZW50SW4oQ2xhc3NFbnRpdHkgY2xzLCBOYW1lIG5hbWUsIE1lbWJlckVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoZSBmaWVsZCBbZWxlbWVudF0gaXMga25vd24gdG8gYmUgZWZmZWN0aXZlbHkgZmluYWwuCiAgYm9vbCBmaWVsZE5ldmVyQ2hhbmdlcyhNZW1iZXJFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbc2VsZWN0b3JdIG9uIFtyZWNlaXZlcl0gY2FuIGhpdCBhIGBjYWxsYCBtZXRob2Qgb24gYQogIC8vLyBzdWJjbGFzcyBvZiBgQ2xvc3VyZWAuCiAgLy8vCiAgLy8vIEV2ZXJ5IGltcGxlbWVudGF0aW9uIG9mIGBDbG9zdXJlYCBoYXMgYSAnY2FsbCcgbWV0aG9kIHdpdGggaXRzIG93bgogIC8vLyBzaWduYXR1cmUgc28gaXQgY2Fubm90IGJlIG1vZGVsbGVkIGJ5IGEgW0Z1bmN0aW9uRW50aXR5XS4gQWxzbywKICAvLy8gY2FsbC1tZXRob2RzIGZvciB0ZWFyLW9mZiBhcmUgbm90IHBhcnQgb2YgdGhlIGVsZW1lbnQgbW9kZWwuCiAgYm9vbCBpbmNsdWRlc0Nsb3N1cmVDYWxsKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyKTsKCiAgLy8vIFJldHVybnMgdGhlIG1hc2sgZm9yIHRoZSBwb3RlbnRpYWwgcmVjZWl2ZXJzIG9mIGEgZHluYW1pYyBjYWxsIHRvCiAgLy8vIFtzZWxlY3Rvcl0gb24gW3JlY2VpdmVyXS4KICAvLy8KICAvLy8gVGhpcyB3aWxsIG5hcnJvdyB0aGUgY29uc3RyYWludHMgb2YgW3JlY2VpdmVyXSB0byBhbiBbQWJzdHJhY3RWYWx1ZV0gb2YKICAvLy8gdGhlIHNldCBvZiBjbGFzc2VzIHRoYXQgYWN0dWFsbHkgaW1wbGVtZW50IHRoZSBzZWxlY3RlZCBtZW1iZXIgb3IKICAvLy8gaW1wbGVtZW50IHRoZSBoYW5kbGluZyAnbm9TdWNoTWV0aG9kJyB3aGVyZSB0aGUgc2VsZWN0ZWQgbWVtYmVyIGlzCiAgLy8vIHVuaW1wbGVtZW50ZWQuCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlUmVjZWl2ZXJUeXBlKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyKTsKCiAgLy8vIFJldHVybnMgYWxsIHRoZSBpbnN0YW5jZSBtZW1iZXJzIHRoYXQgbWF5IGJlIGludm9rZWQgd2l0aCB0aGUgW3NlbGVjdG9yXQogIC8vLyBvbiB0aGUgZ2l2ZW4gW3JlY2VpdmVyXS4gVGhlIHJldHVybmVkIGVsZW1lbnRzIG1heSBpbmNsdWRlIG5vU3VjaE1ldGhvZAogIC8vLyBoYW5kbGVycyB0aGF0IGFyZSBwb3RlbnRpYWwgdGFyZ2V0cyBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIG5vU3VjaE1ldGhvZAogIC8vLyBtZWNoYW5pc20uCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBsb2NhdGVNZW1iZXJzKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBzaW5nbGUgW01lbWJlckVudGl0eV0gdGhhdCBtYXRjaGVzIGEgY2FsbCB0byBbc2VsZWN0b3JdIG9uIHRoZQogIC8vLyBbcmVjZWl2ZXJdLiBJZiBtdWx0aXBsZSB0YXJnZXRzIGV4aXN0LCBgbnVsbGAgaXMgcmV0dXJuZWQuCiAgTWVtYmVyRW50aXR5IGxvY2F0ZVNpbmdsZU1lbWJlcihTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBzZXQgb2YgcmVhZCwgd3JpdGUsIGFuZCBpbnZvY2F0aW9uIGFjY2Vzc2VzIGZvdW5kIG9uIFttZW1iZXJdCiAgLy8vIGR1cmluZyB0aGUgY2xvc2VkIHdvcmxkIGNvbXB1dGF0aW9uLgogIE1lbWJlckFjY2VzcyBnZXRNZW1iZXJBY2Nlc3MoTWVtYmVyRW50aXR5IG1lbWJlcik7Cn0KCmFic3RyYWN0IGNsYXNzIE9wZW5Xb3JsZCBpbXBsZW1lbnRzIFdvcmxkIHsKICB2b2lkIHJlZ2lzdGVyVXNlZEVsZW1lbnQoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICBLQ2xvc2VkV29ybGQgY2xvc2VXb3JsZChEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIpOwoKICAvLy8gUmV0dXJucyBhbiBpdGVyYWJsZSBvdmVyIGFsbCBtaXhpbiBhcHBsaWNhdGlvbnMgdGhhdCBtaXhpbiBbY2xzXS4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gYWxsTWl4aW5Vc2VzT2YoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFttZW1iZXJdIGlzIGluaGVyaXRlZCBpbnRvIGEgc3VidHlwZSBvZiBbdHlwZV0uCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZToKICAvLy8KICAvLy8gICAgIGNsYXNzIEEgeyBtKCkge30gfQogIC8vLyAgICAgY2xhc3MgQiBleHRlbmRzIEEgaW1wbGVtZW50cyBJIHt9CiAgLy8vICAgICBjbGFzcyBDIGV4dGVuZHMgT2JqZWN0IHdpdGggQSBpbXBsZW1lbnRzIEkge30KICAvLy8gICAgIGFic3RyYWN0IGNsYXNzIEkgeyBtKCk7IH0KICAvLy8gICAgIGFic3RyYWN0IGNsYXNzIEogaW1wbGVtZW50cyBBIHsgfQogIC8vLwogIC8vLyBIZXJlIGBBLm1gIGlzIGluaGVyaXRlZCBpbnRvIGBBYCwgYEJgLCBhbmQgYENgLiBCZWNhdXNlIGBCYCBhbmQKICAvLy8gYENgIGltcGxlbWVudCBgSWAsIGBpc0luaGVyaXRlZEluU3VidHlwZU9mKEEubSwgSSlgIGlzIHRydWUsIGJ1dAogIC8vLyBgaXNJbmhlcml0ZWRJblN1YnR5cGVPZihBLm0sIEopYCBpcyBmYWxzZS4KICBib29sIGlzSW5oZXJpdGVkSW4oCiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIsIENsYXNzRW50aXR5IHR5cGUsIENsYXNzUmVsYXRpb24gcmVsYXRpb24pOwp9CgovLy8gQSBbQnVpbHRXb3JsZF0gaXMgYW4gaW1tdXRhYmxlIHJlc3VsdCBvZiBhIFtXb3JsZEJ1aWxkZXJdLgphYnN0cmFjdCBjbGFzcyBCdWlsdFdvcmxkIHsKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGxpdmUgZ2VuZXJpYyBtZXRob2QuCiAgdm9pZCBmb3JFYWNoR2VuZXJpY01ldGhvZCh2b2lkIEZ1bmN0aW9uKEZ1bmN0aW9uRW50aXR5KSBmKTsKCiAgLy8vIEFsbCB0eXBlcyB0aGF0IGFyZSBjaGVja2VkIGVpdGhlciB0aHJvdWdoIGlzLCBhcyBvciBjaGVja2VkIG1vZGUgY2hlY2tzLgogIEl0ZXJhYmxlPERhcnRUeXBlPiBnZXQgaXNDaGVja3M7CgogIC8vLyBBbGwgZGlyZWN0bHkgaW5zdGFudGlhdGVkIHR5cGVzLCB0aGF0IGlzLCB0aGUgdHlwZXMgb2YKICAvLy8gW2RpcmVjdGx5SW5zdGFudGlhdGVkQ2xhc3Nlc10uCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW1wcm92ZSBzZW1hbnRpYyBwcmVjaXNpb24uCiAgSXRlcmFibGU8SW50ZXJmYWNlVHlwZT4gZ2V0IGluc3RhbnRpYXRlZFR5cGVzOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDbGVhbiB1cCB0aGVzZSBnZXR0ZXJzLgogIC8vLyBNZXRob2RzIGluIGluc3RhbnRpYXRlZCBjbGFzc2VzIHRoYXQgYXJlIHBvdGVudGlhbGx5IGNsb3N1cml6ZWQuCiAgSXRlcmFibGU8RnVuY3Rpb25FbnRpdHk+IGdldCBjbG9zdXJpemVkTWVtYmVyczsKCiAgLy8vIFN0YXRpYyBvciB0b3AgbGV2ZWwgbWV0aG9kcyB0aGF0IGFyZSBjbG9zdXJpemVkLgogIEl0ZXJhYmxlPEZ1bmN0aW9uRW50aXR5PiBnZXQgY2xvc3VyaXplZFN0YXRpY3M7CgogIC8vLyBUeXBlIHZhcmlhYmxlcyB1c2VkIGFzIHR5cGUgbGl0ZXJhbHMuCiAgSXRlcmFibGU8VHlwZVZhcmlhYmxlVHlwZT4gZ2V0IHR5cGVWYXJpYWJsZVR5cGVMaXRlcmFsczsKCiAgLy8vIExpdmUgdXNlci1kZWZpbmVkICdub1N1Y2hNZXRob2QnIGltcGxlbWVudGF0aW9ucy4KICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZ2V0IHVzZXJOb1N1Y2hNZXRob2RzOwoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGxpdmUgZ2VuZXJpYyBpbnN0YW5jZSBtZXRob2RzLgogIHZvaWQgZm9yRWFjaEdlbmVyaWNJbnN0YW5jZU1ldGhvZCh2b2lkIEZ1bmN0aW9uKEZ1bmN0aW9uRW50aXR5KSBmKTsKCiAgLy8vIExpdmUgZ2VuZXJpYyBsb2NhbCBmdW5jdGlvbnMuCiAgSXRlcmFibGU8TG9jYWw+IGdldCBnZW5lcmljTG9jYWxGdW5jdGlvbnM7CgogIC8vLyBDYWxsIFtmXSBmb3IgZWFjaCBnZW5lcmljIFtmdW5jdGlvbl0gd2l0aCB0aGUgdHlwZSBhcmd1bWVudHMgcGFzc2VkCiAgLy8vIHRocm91Z2ggc3RhdGljIGNhbGxzIHRvIFtmdW5jdGlvbl0uCiAgdm9pZCBmb3JFYWNoU3RhdGljVHlwZUFyZ3VtZW50KAogICAgICB2b2lkIGYoRW50aXR5IGZ1bmN0aW9uLCBTZXQ8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpKTsKCiAgLy8vIENhbGwgW2ZdIGZvciBlYWNoIGdlbmVyaWMgW3NlbGVjdG9yXSB3aXRoIHRoZSB0eXBlIGFyZ3VtZW50cyBwYXNzZWQKICAvLy8gdGhyb3VnaCBkeW5hbWljIGNhbGxzIHRvIFtzZWxlY3Rvcl0uCiAgdm9pZCBmb3JFYWNoRHluYW1pY1R5cGVBcmd1bWVudCgKICAgICAgdm9pZCBmKFNlbGVjdG9yIHNlbGVjdG9yLCBTZXQ8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpKTsKfQoKLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVuYW1lIHRoaXMgdG8gYFJlc29sdXRpb25Xb3JsZGAgb3IgYEtXb3JsZGA/Ci8vIFRoZSBpbW11dGFibGUgcmVzdWx0IG9mIHRoZSBbUmVzb2x1dGlvbldvcmxkQnVpbGRlcl0uCmFic3RyYWN0IGNsYXNzIEtDbG9zZWRXb3JsZCBpbXBsZW1lbnRzIEJ1aWx0V29ybGQgewogIERhcnRUeXBlcyBnZXQgZGFydFR5cGVzOwogIEtGaWVsZEFuYWx5c2lzIGdldCBmaWVsZEFuYWx5c2lzOwogIEJhY2tlbmRVc2FnZSBnZXQgYmFja2VuZFVzYWdlOwogIE5hdGl2ZURhdGEgZ2V0IG5hdGl2ZURhdGE7CiAgSW50ZXJjZXB0b3JEYXRhIGdldCBpbnRlcmNlcHRvckRhdGE7CiAgS0VsZW1lbnRFbnZpcm9ubWVudCBnZXQgZWxlbWVudEVudmlyb25tZW50OwogIEtDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHM7CiAgQ2xhc3NIaWVyYXJjaHkgZ2V0IGNsYXNzSGllcmFyY2h5OwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2Nsc10gaXMgaW1wbGVtZW50ZWQgYnkgYW4gaW5zdGFudGlhdGVkIGNsYXNzLgogIGJvb2wgaXNJbXBsZW1lbnRlZChDbGFzc0VudGl0eSBjbHMpOwoKICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGdldCBsaXZlSW5zdGFuY2VNZW1iZXJzOwogIE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4gZ2V0IG1peGluVXNlczsKICBNYXA8Q2xhc3NFbnRpdHksIFNldDxDbGFzc0VudGl0eT4+IGdldCB0eXBlc0ltcGxlbWVudGVkQnlTdWJjbGFzc2VzOwoKICAvLy8gTWVtYmVycyB0aGF0IGFyZSB3cml0dGVuIGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIGEgc2V0dGVyIHNlbGVjdG9yLgogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZ2V0IGFzc2lnbmVkSW5zdGFuY2VNZW1iZXJzOwoKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGxpdmVOYXRpdmVDbGFzc2VzOwogIE1hcDxNZW1iZXJFbnRpdHksIE1lbWJlclVzYWdlPiBnZXQgbGl2ZU1lbWJlclVzYWdlOwogIFJ1bnRpbWVUeXBlc05lZWQgZ2V0IHJ0aU5lZWQ7CiAgTm9TdWNoTWV0aG9kRGF0YSBnZXQgbm9TdWNoTWV0aG9kRGF0YTsKCiAgQW5ub3RhdGlvbnNEYXRhIGdldCBhbm5vdGF0aW9uc0RhdGE7CgogIC8vLyBTZXQgb2YgbGl2ZSBjbG9zdXJpemVkIG1lbWJlcnMgd2hvc2Ugc2lnbmF0dXJlcyByZWZlcmVuY2UgdHlwZSB2YXJpYWJsZXMuCiAgLy8vCiAgLy8vIEEgY2xvc3VyaXplZCBtZXRob2QgaXMgY29uc2lkZXJlZCBsaXZlIGlmIHRoZSBlbmNsb3NpbmcgY2xhc3MgaGFzIGJlZW4KICAvLy8gaW5zdGFudGlhdGVkLgogIEl0ZXJhYmxlPEZ1bmN0aW9uRW50aXR5PiBnZXQgY2xvc3VyaXplZE1lbWJlcnNXaXRoRnJlZVR5cGVWYXJpYWJsZXM7CgogIC8vLyBTZXQgb2YgKGxpdmUpIGxvY2FsIGZ1bmN0aW9ucyAoY2xvc3VyZXMpLgogIC8vLwogIC8vLyBBIGxpdmUgZnVuY3Rpb24gaXMgb25lIHdob3NlIGVuY2xvc2luZyBtZW1iZXIgZnVuY3Rpb24gaGFzIGJlZW4gZW5xdWV1ZWQuCiAgSXRlcmFibGU8TG9jYWw+IGdldCBsb2NhbEZ1bmN0aW9uczsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFttZW1iZXJdIGhhcyBiZWVuIG1hcmtlZCBhcyB1c2VkIChjYWxsZWQsIHJlYWQsIGV0Yy4pIGluCiAgLy8vIHRoaXMgd29ybGQgYnVpbGRlci4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYXliZSB0aGlzIHNob3VsZCBiZSBwYXJ0IG9mIFtDbG9zZWRXb3JsZF0gKGluc3RlYWQpLgogIGJvb2wgaXNNZW1iZXJVc2VkKE1lbWJlckVudGl0eSBtZW1iZXIpOwp9CoFBAE5OPAEXARcWHgkZHRkdHS8hHh4uHiZNOkA2SEkfISglLwE+GAFNKwRPTE5NR0UvJAEhAR0BJwEuARsBJgFLLwEgASkBLwEvASUBJwEnJQElAUQVAUcnAUxJRD8BS0lOPQFHSwFNNgE6JwFOLyoBUBdLAUJDAVAlSwFITwFRIgZNUBcGNAYuGyUGUU1RJAZRUEYGNAYqICohMwZQSDkGTU4GUUlQAUtIJUcBTjABTh0GSUZDRwFIIAZOSEkVUAFPTk4RKDIBUUFOAVArNQIBLDIBOAFIOQFIBhQGHSw4JCwGRkcxFkYCAT8cLj4BTyMBPSU2MQEyRzIBNzIBLDsBODIBOEYBJC0BSioiPQFKKyM/AgFGOTQbJCEdJy4mJQFHJwEyNEcBTTYBLzYgKQEnAVAGTRRHATAGUCYBURpQKgIBH3BhY2thZ2U6Y29tcGlsZXIvc3JjL3dvcmxkLmRhcnRIc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvZGlhZ25vc3RpY3MvZ2VuZXJhdGVkL3NoYXJlZF9tZXNzYWdlcy5kYXJ0oK0vLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgovKgpET04nVCBFRElULiBHRU5FUkFURUQuIERPTidUIEVESVQuClRoaXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgJ3B1Ymxpc2guZGFydCcgaW4gdGhlIGRhcnRfbWVzc2FnZXMgcGFja2FnZS4KCk1lc3NhZ2VzIGFyZSBtYWludGFpbmVkIGluIGBsaWIvc2hhcmVkX21lc3NhZ2VzLmRhcnRgIG9mIHRoYXQgc2FtZSBwYWNrYWdlLgpBZnRlciBhbnkgY2hhbmdlIHRvIHRoYXQgZmlsZSwgcnVuIGBiaW4vcHVibGlzaC5kYXJ0YCB0byBnZW5lcmF0ZSBhIG5ldyB2ZXJzaW9uCm9mIHRoZSBqc29uLCBkYXJ0MmpzIGFuZCBhbmFseXplciByZXByZXNlbnRhdGlvbnMuCiovCmltcG9ydCAnLi4vbWVzc2FnZXMuZGFydCcgc2hvdyBNZXNzYWdlS2luZCwgTWVzc2FnZVRlbXBsYXRlOwoKY29uc3QgTWFwPE1lc3NhZ2VLaW5kLCBNZXNzYWdlVGVtcGxhdGU+IFRFTVBMQVRFUyA9CiAgICBjb25zdCA8TWVzc2FnZUtpbmQsIE1lc3NhZ2VUZW1wbGF0ZT57CiAgTWVzc2FnZUtpbmQuQ09OU1RfQ09OU1RSVUNUT1JfV0lUSF9CT0RZOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgIE1lc3NhZ2VLaW5kLkNPTlNUX0NPTlNUUlVDVE9SX1dJVEhfQk9EWSwKICAgICAgIkNvbnN0IGNvbnN0cnVjdG9yIGNhbid0IGhhdmUgYSBib2R5LiIsCiAgICAgIGhvd1RvRml4OiAiVHJ5IHJlbW92aW5nIHRoZSAnY29uc3QnIGtleXdvcmQgb3IgdGhlIGJvZHkuIiwKICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICByIiIiCiAgICAgICAgIGNsYXNzIEMgewogICAgICAgICAgIGNvbnN0IEMoKSB7fQogICAgICAgICB9CgogICAgICAgICBtYWluKCkgPT4gbmV3IEMoKTsiIiIsCiAgICAgIF0pLCAvLyBHZW5lcmF0ZWQuIERvbid0IGVkaXQuCiAgTWVzc2FnZUtpbmQuQ09OU1RfRkFDVE9SWTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKE1lc3NhZ2VLaW5kLkNPTlNUX0ZBQ1RPUlksCiAgICAgICJPbmx5IHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3JzIGNhbiBiZSBkZWNsYXJlZCB0byBiZSAnY29uc3QnLiIsCiAgICAgIGhvd1RvRml4OgogICAgICAgICAgIlRyeSByZW1vdmluZyB0aGUgJ2NvbnN0JyBrZXl3b3JkIG9yIHJlcGxhY2luZyB0aGUgYm9keSB3aXRoICc9JyBmb2xsb3dlZCBieSBhIHZhbGlkIHRhcmdldC4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgIHIiIiIKICAgICAgICAgY2xhc3MgQyB7CiAgICAgICAgICAgY29uc3QgZmFjdG9yeSBDKCkge30KICAgICAgICAgfQoKICAgICAgICAgbWFpbigpID0+IG5ldyBDKCk7IiIiLAogICAgICBdKSwgLy8gR2VuZXJhdGVkLiBEb24ndCBlZGl0LgogIE1lc3NhZ2VLaW5kLkVYVFJBTkVPVVNfTU9ESUZJRVI6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgTWVzc2FnZUtpbmQuRVhUUkFORU9VU19NT0RJRklFUiwKICAgICAgIkNhbid0IGhhdmUgbW9kaWZpZXIgJyN7bW9kaWZpZXJ9JyBoZXJlLiIsCiAgICAgIGhvd1RvRml4OiAiVHJ5IHJlbW92aW5nICcje21vZGlmaWVyfScuIiwKICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICAidmFyIFN0cmluZyBmb287IG1haW4oKXt9IiwKICAgICAgICAidmFyIGZpbmFsIGZvbzsgbWFpbigpe30iLAogICAgICAgICJ2YXIgdmFyIGZvbzsgbWFpbigpe30iLAogICAgICAgICJ2YXIgY29uc3QgZm9vOyBtYWluKCl7fSIsCiAgICAgICAgInZhciBhYnN0cmFjdCBmb287IG1haW4oKXt9IiwKICAgICAgICAidmFyIHN0YXRpYyBmb287IG1haW4oKXt9IiwKICAgICAgICAidmFyIGV4dGVybmFsIGZvbzsgbWFpbigpe30iLAogICAgICAgICJmaW5hbCB2YXIgZm9vOyBtYWluKCl7fSIsCiAgICAgICAgInZhciB2YXIgZm9vOyBtYWluKCl7fSIsCiAgICAgICAgImNvbnN0IHZhciBmb287IG1haW4oKXt9IiwKICAgICAgICAiYWJzdHJhY3QgdmFyIGZvbzsgbWFpbigpe30iLAogICAgICAgICJzdGF0aWMgdmFyIGZvbzsgbWFpbigpe30iLAogICAgICAgICJleHRlcm5hbCB2YXIgZm9vOyBtYWluKCl7fSIsCiAgICAgIF0pLCAvLyBHZW5lcmF0ZWQuIERvbid0IGVkaXQuCiAgTWVzc2FnZUtpbmQuRVhUUkFORU9VU19NT0RJRklFUl9SRVBMQUNFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgIE1lc3NhZ2VLaW5kLkVYVFJBTkVPVVNfTU9ESUZJRVJfUkVQTEFDRSwKICAgICAgIkNhbid0IGhhdmUgbW9kaWZpZXIgJyN7bW9kaWZpZXJ9JyBoZXJlLiIsCiAgICAgIGhvd1RvRml4OgogICAgICAgICAgIlRyeSByZXBsYWNpbmcgbW9kaWZpZXIgJyN7bW9kaWZpZXJ9JyB3aXRoICd2YXInLCAnZmluYWwnLCBvciBhIHR5cGUuIiwKICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICAic2V0IGZvbzsgbWFpbigpe30iLAogICAgICAgICJhYnN0cmFjdCBmb287IG1haW4oKXt9IiwKICAgICAgICAic3RhdGljIGZvbzsgbWFpbigpe30iLAogICAgICAgICJleHRlcm5hbCBmb287IG1haW4oKXt9IiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5DT05TVFJVQ1RPUl9XSVRIX1JFVFVSTl9UWVBFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgIE1lc3NhZ2VLaW5kLkNPTlNUUlVDVE9SX1dJVEhfUkVUVVJOX1RZUEUsCiAgICAgICJDb25zdHJ1Y3RvcnMgY2FuJ3QgaGF2ZSBhIHJldHVybiB0eXBlLiIsCiAgICAgIGhvd1RvRml4OiAiVHJ5IHJlbW92aW5nIHRoZSByZXR1cm4gdHlwZS4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICJjbGFzcyBBIHsgaW50IEEoKSB7fSB9IG1haW4oKSB7IG5ldyBBKCk7IH0iLAogICAgICBdKSwgLy8gR2VuZXJhdGVkLiBEb24ndCBlZGl0LgogIE1lc3NhZ2VLaW5kLk1JU1NJTkdfRVhQUkVTU0lPTl9JTl9USFJPVzogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICBNZXNzYWdlS2luZC5NSVNTSU5HX0VYUFJFU1NJT05fSU5fVEhST1csCiAgICAgICJNaXNzaW5nIGV4cHJlc3Npb24gYWZ0ZXIgJ3Rocm93Jy4iLAogICAgICBob3dUb0ZpeDogIkRpZCB5b3UgbWVhbiAncmV0aHJvdyc/IiksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5SRVRIUk9XX09VVFNJREVfQ0FUQ0g6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgTWVzc2FnZUtpbmQuUkVUSFJPV19PVVRTSURFX0NBVENILAogICAgICAiUmV0aHJvdyBtdXN0IGJlIGluc2lkZSBvZiBjYXRjaCBjbGF1c2UuIiwKICAgICAgaG93VG9GaXg6CiAgICAgICAgICAiVHJ5IG1vdmluZyB0aGUgZXhwcmVzc2lvbiBpbnRvIGEgY2F0Y2ggY2xhdXNlLCBvciB1c2luZyBhICd0aHJvdycgZXhwcmVzc2lvbi4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICJtYWluKCkgeyByZXRocm93OyB9IiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5SRVRVUk5fSU5fR0VORVJBVElWRV9DT05TVFJVQ1RPUjogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICBNZXNzYWdlS2luZC5SRVRVUk5fSU5fR0VORVJBVElWRV9DT05TVFJVQ1RPUiwKICAgICAgIkNvbnN0cnVjdG9ycyBjYW4ndCByZXR1cm4gdmFsdWVzLiIsCiAgICAgIGhvd1RvRml4OgogICAgICAgICAgIlRyeSByZW1vdmluZyB0aGUgcmV0dXJuIHN0YXRlbWVudCBvciB1c2luZyBhIGZhY3RvcnkgY29uc3RydWN0b3IuIiwKICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICByIiIiCiAgICAgICAgY2xhc3MgQyB7CiAgICAgICAgICBDKCkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG1haW4oKSA9PiBuZXcgQygpOyIiIiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5SRVRVUk5fSU5fR0VORVJBVE9SOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgIE1lc3NhZ2VLaW5kLlJFVFVSTl9JTl9HRU5FUkFUT1IsCiAgICAgICJDYW4ndCByZXR1cm4gYSB2YWx1ZSBmcm9tIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uICh1c2luZyB0aGUgJyN7bW9kaWZpZXJ9JyBtb2RpZmllcikuIiwKICAgICAgaG93VG9GaXg6CiAgICAgICAgICAiVHJ5IHJlbW92aW5nIHRoZSB2YWx1ZSwgcmVwbGFjaW5nICdyZXR1cm4nIHdpdGggJ3lpZWxkJyBvciBjaGFuZ2luZyB0aGUgbWV0aG9kIGJvZHkgbW9kaWZpZXIuIiwKICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICByIiIiCiAgICAgICAgZm9vKCkgYXN5bmMqIHsgcmV0dXJuIDA7IH0KICAgICAgICBtYWluKCkgPT4gZm9vKCk7CiAgICAgICAgIiIiLAogICAgICAgIHIiIiIKICAgICAgICBmb28oKSBzeW5jKiB7IHJldHVybiAwOyB9CiAgICAgICAgbWFpbigpID0+IGZvbygpOwogICAgICAgICIiIiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5OT1RfQVNTSUdOQUJMRTogY29uc3QgTWVzc2FnZVRlbXBsYXRlKE1lc3NhZ2VLaW5kLk5PVF9BU1NJR05BQkxFLAogICAgICAiJyN7ZnJvbVR5cGV9JyBpcyBub3QgYXNzaWduYWJsZSB0byAnI3t0b1R5cGV9Jy4iKSwgLy8gR2VuZXJhdGVkLiBEb24ndCBlZGl0LgogIE1lc3NhZ2VLaW5kLkZPUklOX05PVF9BU1NJR05BQkxFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgIE1lc3NhZ2VLaW5kLkZPUklOX05PVF9BU1NJR05BQkxFLAogICAgICAiVGhlIGVsZW1lbnQgdHlwZSAnI3tjdXJyZW50VHlwZX0nIG9mICcje2V4cHJlc3Npb25UeXBlfScgaXMgbm90IGFzc2lnbmFibGUgdG8gJyN7ZWxlbWVudFR5cGV9Jy4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgIHIiIiIKICAgICAgICBtYWluKCkgewogICAgICAgICAgTGlzdDxpbnQ+IGxpc3QgPSA8aW50PlsxLCAyXTsKICAgICAgICAgIGZvciAoU3RyaW5nIHggaW4gbGlzdCkgeDsKICAgICAgICB9CiAgICAgICAgIiIiLAogICAgICBdKSwgLy8gR2VuZXJhdGVkLiBEb24ndCBlZGl0LgogIE1lc3NhZ2VLaW5kLkNBTk5PVF9SRVNPTFZFOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoTWVzc2FnZUtpbmQuQ0FOTk9UX1JFU09MVkUsCiAgICAgICJDYW4ndCByZXNvbHZlICcje25hbWV9Jy4iKSwgLy8gR2VuZXJhdGVkLiBEb24ndCBlZGl0LgogIE1lc3NhZ2VLaW5kLlVOREVGSU5FRF9NRVRIT0Q6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX01FVEhPRCwKICAgICAgIlRoZSBtZXRob2QgJyN7bWVtYmVyTmFtZX0nIGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyN7Y2xhc3NOYW1lfScuIiwKICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICByIiIiCiAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICBmb28oKSB7IGJhcigpOyB9CiAgICAgICAgfQogICAgICAgIG1haW4oKSB7IG5ldyBBKCkuZm9vKCk7IH0KICAgICAgICAiIiIsCiAgICAgIF0pLCAvLyBHZW5lcmF0ZWQuIERvbid0IGVkaXQuCiAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX0dFVFRFUjogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICBNZXNzYWdlS2luZC5VTkRFRklORURfR0VUVEVSLAogICAgICAiVGhlIGdldHRlciAnI3ttZW1iZXJOYW1lfScgaXMgbm90IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnI3tjbGFzc05hbWV9Jy4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICJjbGFzcyBBIHt9IG1haW4oKSB7IG5ldyBBKCkueDsgfSIsCiAgICAgICAgImNsYXNzIEEge30gbWFpbigpIHsgQS54OyB9IiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5VTkRFRklORURfSU5TVEFOQ0VfR0VUVEVSX0JVVF9TRVRURVI6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX0lOU1RBTkNFX0dFVFRFUl9CVVRfU0VUVEVSLAogICAgICAiVGhlIHNldHRlciAnI3ttZW1iZXJOYW1lfScgaW4gY2xhc3MgJyN7Y2xhc3NOYW1lfScgY2FuIG5vdCBiZSB1c2VkIGFzIGEgZ2V0dGVyLiIsCiAgICAgIGV4YW1wbGVzOiBjb25zdCBbCiAgICAgICAgImNsYXNzIEEgeyBzZXQgeCh5KSB7fSB9IG1haW4oKSB7IG5ldyBBKCkueDsgfSIsCiAgICAgIF0pLCAvLyBHZW5lcmF0ZWQuIERvbid0IGVkaXQuCiAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX09QRVJBVE9SOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgIE1lc3NhZ2VLaW5kLlVOREVGSU5FRF9PUEVSQVRPUiwKICAgICAgIlRoZSBvcGVyYXRvciAnI3ttZW1iZXJOYW1lfScgaXMgbm90IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnI3tjbGFzc05hbWV9Jy4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICJjbGFzcyBBIHt9IG1haW4oKSB7IG5ldyBBKCkgKyAzOyB9IiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5VTkRFRklORURfU0VUVEVSOiBjb25zdCBNZXNzYWdlVGVtcGxhdGUoCiAgICAgIE1lc3NhZ2VLaW5kLlVOREVGSU5FRF9TRVRURVIsCiAgICAgICJUaGUgc2V0dGVyICcje21lbWJlck5hbWV9JyBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzICcje2NsYXNzTmFtZX0nLiIsCiAgICAgIGV4YW1wbGVzOiBjb25zdCBbCiAgICAgICAgImNsYXNzIEEge30gbWFpbigpIHsgbmV3IEEoKS54ID0gNDk5OyB9IiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KICBNZXNzYWdlS2luZC5OT19TVUNIX1NVUEVSX01FTUJFUjogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICBNZXNzYWdlS2luZC5OT19TVUNIX1NVUEVSX01FTUJFUiwKICAgICAgIkNhbid0IHJlc29sdmUgJyN7bWVtYmVyTmFtZX0nIGluIGEgc3VwZXJjbGFzcyBvZiAnI3tjbGFzc05hbWV9Jy4iKSwgLy8gR2VuZXJhdGVkLiBEb24ndCBlZGl0LgogIE1lc3NhZ2VLaW5kLlVOREVGSU5FRF9TVVBFUl9TRVRURVI6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX1NVUEVSX1NFVFRFUiwKICAgICAgIlRoZSBzZXR0ZXIgJyN7bWVtYmVyTmFtZX0nIGlzIG5vdCBkZWZpbmVkIGluIGEgc3VwZXJjbGFzcyBvZiAnI3tjbGFzc05hbWV9Jy4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgIHIiIiIKICAgICAgICBjbGFzcyBBIHt9CiAgICAgICAgY2xhc3MgQiBleHRlbmRzIEEgewogICAgICAgICAgZm9vKCkgeyBzdXBlci54ID0gNDk5OyB9CiAgICAgICAgfQogICAgICAgIG1haW4oKSB7IG5ldyBCKCkuZm9vKCk7IH0KICAgICAgICAiIiIsCiAgICAgIF0pLCAvLyBHZW5lcmF0ZWQuIERvbid0IGVkaXQuCiAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX1NUQVRJQ19HRVRURVJfQlVUX1NFVFRFUjogY29uc3QgTWVzc2FnZVRlbXBsYXRlKAogICAgICBNZXNzYWdlS2luZC5VTkRFRklORURfU1RBVElDX0dFVFRFUl9CVVRfU0VUVEVSLAogICAgICAiQ2Fubm90IHJlc29sdmUgZ2V0dGVyICcje25hbWV9Jy4iLAogICAgICBleGFtcGxlczogY29uc3QgWwogICAgICAgICJzZXQgZm9vKHgpIHt9ICBtYWluKCkgeyBmb287IH0iLAogICAgICBdKSwgLy8gR2VuZXJhdGVkLiBEb24ndCBlZGl0LgogIE1lc3NhZ2VLaW5kLlVOREVGSU5FRF9TVEFUSUNfU0VUVEVSX0JVVF9HRVRURVI6IGNvbnN0IE1lc3NhZ2VUZW1wbGF0ZSgKICAgICAgTWVzc2FnZUtpbmQuVU5ERUZJTkVEX1NUQVRJQ19TRVRURVJfQlVUX0dFVFRFUiwKICAgICAgIkNhbm5vdCByZXNvbHZlIHNldHRlciAnI3tuYW1lfScuIiwKICAgICAgZXhhbXBsZXM6IGNvbnN0IFsKICAgICAgICByIiIiCiAgICAgICAgbWFpbigpIHsKICAgICAgICAgIGZpbmFsIHggPSAxOwogICAgICAgICAgeCA9IDI7CiAgICAgICAgfSIiIiwKICAgICAgICByIiIiCiAgICAgICAgbWFpbigpIHsKICAgICAgICAgIGNvbnN0IHggPSAxOwogICAgICAgICAgeCA9IDI7CiAgICAgICAgfQogICAgICAgICIiIiwKICAgICAgICByIiIiCiAgICAgICAgZmluYWwgeCA9IDE7CiAgICAgICAgbWFpbigpIHsgeCA9IDM7IH0KICAgICAgICAiIiIsCiAgICAgICAgciIiIgogICAgICAgIGNvbnN0IHggPSAxOwogICAgICAgIG1haW4oKSB7IHggPSAzOyB9CiAgICAgICAgIiIiLAogICAgICAgICJnZXQgZm9vID0+IG51bGwgIG1haW4oKSB7IGZvbyA9IDU7IH0iLAogICAgICAgICJjb25zdCBmb28gPSAwICBtYWluKCkgeyBmb28gPSA1OyB9IiwKICAgICAgXSksIC8vIEdlbmVyYXRlZC4gRG9uJ3QgZWRpdC4KfTsKgNsATk48AyNNAUxQMwM9ATQqQi8uQRgNExgLASAkTk4QaRgNEyALASAkOicxLxgkIyEjJiQmIyEjJiQmJEIvMRBSGB0iICIkQzAwMRg2JEIvK0Y8KTEQWxgfJEc0KxBPGA0SEBYMCgEfJDonXBBrGA0jGQ0NIhkNJFBUOyhpGA0RKCQKDSRQPTckURgNEhsKIg0kNyRRGCwmJEs4WRg5JDkmUxguJDckURgyJDsoZT0qVhgNExwjCiINJEk2KhgqJEk2KhgNERcRDg0RFxEKDQ0VGg0NFRoNMC4kAwE/cGFja2FnZTpjb21waWxlci9zcmMvZGlhZ25vc3RpY3MvZ2VuZXJhdGVkL3NoYXJlZF9tZXNzYWdlcy5kYXJ0OHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbnN0YW50cy9leHByZXNzaW9ucy5kYXJ0wAEnsi8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuY29uc3RhbnRzLmV4cHJlc3Npb25zOwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy9jb25zdGFudF9zeXN0ZW0uZGFydCcgYXMgY29uc3RhbnRfc3lzdGVtOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL29wZXJhdG9ycy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JyBzaG93IENhbGxTdHJ1Y3R1cmU7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnOwppbXBvcnQgJ2NvbnN0cnVjdG9ycy5kYXJ0JzsKaW1wb3J0ICdldmFsdWF0aW9uLmRhcnQnOwppbXBvcnQgJ3ZhbHVlcy5kYXJ0JzsKCmVudW0gQ29uc3RhbnRFeHByZXNzaW9uS2luZCB7CiAgQVMsCiAgQklOQVJZLAogIEJPT0wsCiAgQk9PTF9GUk9NX0VOVklST05NRU5ULAogIENPTkNBVEVOQVRFLAogIENPTkRJVElPTkFMLAogIENPTlNUUlVDVEVELAogIERPVUJMRSwKICBFUlJPTkVPVVMsCiAgRlVOQ1RJT04sCiAgRklFTEQsCiAgSURFTlRJQ0FMLAogIElOVCwKICBJTlRfRlJPTV9FTlZJUk9OTUVOVCwKICBMSVNULAogIFNFVCwKICBNQVAsCiAgTlVMTCwKICBTVFJJTkcsCiAgU1RSSU5HX0ZST01fRU5WSVJPTk1FTlQsCiAgU1RSSU5HX0xFTkdUSCwKICBTWU1CT0wsCiAgVFlQRSwKICBVTkFSWSwKICBMT0NBTF9WQVJJQUJMRSwKICBQT1NJVElPTkFMX1JFRkVSRU5DRSwKICBOQU1FRF9SRUZFUkVOQ0UsCiAgQVNTRVJULAogIElOU1RBTlRJQVRJT04sCn0KCi8vLyBBbiBleHByZXNzaW9uIHRoYXQgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCi8vLwovLy8gV2hlcmVhcyBbQ29uc3RhbnRWYWx1ZV0gcmVwcmVzZW50IGEgY29tcGlsZS10aW1lIHZhbHVlLCBhCi8vLyBbQ29uc3RhbnRFeHByZXNzaW9uXSByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGNyZWF0aW5nIGEgY29uc3RhbnQuCi8vLwovLy8gVGhlcmUgaXMgbm8gb25lLXRvLW9uZSBtYXBwaW5nIGJldHdlZW4gW0NvbnN0YW50RXhwcmVzc2lvbl0gYW5kCi8vLyBbQ29uc3RhbnRWYWx1ZV0sIGJlY2F1c2UgZGlmZmVyZW50IGV4cHJlc3Npb25zIGNhbiBkZW5vdGUgdGhlIHNhbWUgY29uc3RhbnQuCi8vLyBGb3IgaW5zdGFuY2UsIG11bHRpcGxlIGBjb25zdGAgY29uc3RydWN0b3JzIG1heSBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgc2FtZQovLy8gb2JqZWN0LCBhbmQgZGlmZmVyZW50IGBjb25zdGAgdmFyaWFibGVzIG1heSBob2xkIHRoZSBzYW1lIHZhbHVlLgphYnN0cmFjdCBjbGFzcyBDb25zdGFudEV4cHJlc3Npb24gewogIGludCBfaGFzaENvZGU7CgogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQ7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVuaWZ5IHByZWNlZGVuY2UgaGFuZGxlZCBiZXR3ZWVuIGNvbnN0YW50cywgZnJvbnQtZW5kCiAgLy8gYW5kIGJhY2stZW5kLgogIGludCBnZXQgcHJlY2VkZW5jZSA9PiAxNjsKCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKTsKCiAgLy8vIFN1YnN0aXR1dGUgZnJlZSB2YXJpYWJsZXMgdXNpbmcgYXJndW1lbnRzLgogIENvbnN0YW50RXhwcmVzc2lvbiBhcHBseShOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3VtZW50cykgPT4gdGhpczsKCiAgLy8vIENvbXB1dGUgdGhlIFtDb25zdGFudFZhbHVlXSBmb3IgdGhpcyBleHByZXNzaW9uIHVzaW5nIHRoZSBbZW52aXJvbm1lbnRdLgogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBjb25zdGFudCBleHByZXNzaW9uLCBpZiBpdCBpcyBpbmRlcGVuZGVudCBvZiB0aGUKICAvLy8gZW52aXJvbm1lbnQgdmFsdWVzLgogIERhcnRUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPT4gbnVsbDsKCiAgLy8vIFJldHVybnMgYSB0ZXh0IHN0cmluZyByZXNlbWJsaW5nIHRoZSBEYXJ0IGNvZGUgY3JlYXRpbmcgdGhpcyBjb25zdGFudC4KICBTdHJpbmcgdG9EYXJ0VGV4dCgpIHsKICAgIENvbnN0RXhwUHJpbnRlciBwcmludGVyID0gbmV3IENvbnN0RXhwUHJpbnRlcigpOwogICAgYWNjZXB0KHByaW50ZXIpOwogICAgcmV0dXJuIHByaW50ZXIudG9TdHJpbmcoKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgdGV4dCBzdHJpbmcgc2hvd2luZyB0aGUgc3RydWN0dXJlIG9mIHRoaXMgY29uc3RhbnQuCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBfY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICAvLy8gV3JpdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvbnN0YW50IGludG8gW3NiXS4KICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpOwoKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9oYXNoQ29kZSA/Pz0gX2NvbXB1dGVIYXNoQ29kZSgpOwoKICBib29sIF9lcXVhbHMoY292YXJpYW50IENvbnN0YW50RXhwcmVzc2lvbiBvdGhlcik7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgQ29uc3RhbnRFeHByZXNzaW9uKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoa2luZCAhPSBvdGhlci5raW5kKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoaGFzaENvZGUgIT0gb3RoZXIuaGFzaENvZGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfZXF1YWxzKG90aGVyKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGFzc2VydERlYnVnTW9kZSgnVXNlIENvbnN0YW50RXhwcmVzc2lvbi50b0RhcnRUZXh0KCkgb3IgJwogICAgICAgICdDb25zdGFudEV4cHJlc3Npb24udG9TdHJ1Y3R1cmVkVGV4dCgpIGluc3RlYWQgb2YgJwogICAgICAgICdDb25zdGFudEV4cHJlc3Npb24udG9TdHJpbmcoKScpOwogICAgcmV0dXJuIHRvRGFydFRleHQoKTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGV4cHJlc3Npb24gaXMgaW1wbGljaXRseSBjb25zdGFudCwgdGhhdCBpcywgdGhhdAogIC8vLyBpdCBkb2Vzbid0IGRlY2xhcmUgaXRzIGNvbnN0bmVzcyB3aXRoIHRoZSAnY29uc3QnIGtleXdvcmQuCiAgLy8vCiAgLy8vIEltcGxpY2l0IGNvbnN0YW50cyBhcmUgc2ltcGxlIGxpdGVyYWxzLCBsaWtlIGJvb2wsIGludCBhbmQgc3RyaW5nCiAgLy8vIGxpdGVyYWxzLCBjb25zdGFudCByZWZlcmVuY2VzIGFuZCBjb21wb3NpdGlvbnMgb2YgaW1wbGljaXQgY29uc3RhbnRzLgogIC8vLyBFeHBsaWNpdCBjb25zdGFudHMgYXJlIGNvbnN0cnVjdG9yIGNvbnN0YW50cywgYW5kIGNvbnN0YW50IG1hcCBhbmQgbGlzdAogIC8vLyBsaXRlcmFscy4KICBib29sIGdldCBpc0ltcGxpY2l0ID0+IHRydWU7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGV4cHJlc3Npb24gaXMgb25seSBwb3RlbnRpYWxseSBjb25zdGFudCwgdGhhdCBpcywKICAvLy8gaWYgaXQgY29udGFpbnMgcG9zaXRpb25hbCBvciBuYW1lZCByZWZlcmVuY2VzLCB1c2VkIHRvIGRlZmluZSBjb25zdGFudAogIC8vLyBjb25zdHJ1Y3RvcnMuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWF5YmUgbWFrZSB0aGlzIGZpbmFsIGlmIHdlIHVzZSBpdCBvdXRzaWRlIGFzc2VydGlvbnMuCiAgYm9vbCBnZXQgaXNQb3RlbnRpYWwgPT4gZmFsc2U7Cn0KCi8vLyBBIHN5bnRoZXRpYyBjb25zdGFudCB1c2VkIHRvIHJlY292ZXIgZnJvbSBlcnJvcnMuCmNsYXNzIEVycm9uZW91c0NvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLkVSUk9ORU9VUzsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICAvLyBEbyBub3RoaW5nLiBUaGlzIGlzIGFuIGVycm9yLgogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSBub24tY29uc3RhbnQgdmFsdWVzIGZvciBlcnJvcnMuCiAgICByZXR1cm4gbmV3IE5vbkNvbnN0YW50VmFsdWUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0Vycm9uZW91cygpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpID0+IDEzOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoRXJyb25lb3VzQ29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSA9PiB0cnVlOwp9CgovLy8gQm9vbGVhbiBsaXRlcmFsIGNvbnN0YW50LgpjbGFzcyBCb29sQ29uc3RhbnRFeHByZXNzaW9uIGV4dGVuZHMgQ29uc3RhbnRFeHByZXNzaW9uIHsKICBmaW5hbCBib29sIGJvb2xWYWx1ZTsKCiAgQm9vbENvbnN0YW50RXhwcmVzc2lvbih0aGlzLmJvb2xWYWx1ZSk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRFeHByZXNzaW9uS2luZC5CT09MOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Qm9vbCh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0Jvb2wodmFsdWU9JHtib29sVmFsdWV9KScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uY3JlYXRlQm9vbChib29sVmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSA9PiAxMyAqIGJvb2xWYWx1ZS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKEJvb2xDb25zdGFudEV4cHJlc3Npb24gb3RoZXIpIHsKICAgIHJldHVybiBib29sVmFsdWUgPT0gb3RoZXIuYm9vbFZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRLbm93blR5cGUoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpID0+CiAgICAgIGNvbW1vbkVsZW1lbnRzLmJvb2xUeXBlOwp9CgovLy8gSW50ZWdlciBsaXRlcmFsIGNvbnN0YW50LgpjbGFzcyBJbnRDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIEJpZ0ludCBpbnRWYWx1ZTsKCiAgSW50Q29uc3RhbnRFeHByZXNzaW9uKHRoaXMuaW50VmFsdWUpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuSU5UOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SW50KHRoaXMsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnSW50KHZhbHVlPSR7aW50VmFsdWV9KScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50KGludFZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgPT4gMTcgKiBpbnRWYWx1ZS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKEludENvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgcmV0dXJuIGludFZhbHVlID09IG90aGVyLmludFZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRLbm93blR5cGUoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpID0+CiAgICAgIGNvbW1vbkVsZW1lbnRzLmludFR5cGU7Cn0KCi8vLyBEb3VibGUgbGl0ZXJhbCBjb25zdGFudC4KY2xhc3MgRG91YmxlQ29uc3RhbnRFeHByZXNzaW9uIGV4dGVuZHMgQ29uc3RhbnRFeHByZXNzaW9uIHsKICBmaW5hbCBkb3VibGUgZG91YmxlVmFsdWU7CgogIERvdWJsZUNvbnN0YW50RXhwcmVzc2lvbih0aGlzLmRvdWJsZVZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLkRPVUJMRTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdERvdWJsZSh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0RvdWJsZSh2YWx1ZT0ke2RvdWJsZVZhbHVlfSknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZURvdWJsZShkb3VibGVWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpID0+IDE5ICogZG91YmxlVmFsdWUuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhEb3VibGVDb25zdGFudEV4cHJlc3Npb24gb3RoZXIpIHsKICAgIHJldHVybiBkb3VibGVWYWx1ZSA9PSBvdGhlci5kb3VibGVWYWx1ZTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSA9PgogICAgICBjb21tb25FbGVtZW50cy5kb3VibGVUeXBlOwp9CgovLy8gU3RyaW5nIGxpdGVyYWwgY29uc3RhbnQuCmNsYXNzIFN0cmluZ0NvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgU3RyaW5nIHN0cmluZ1ZhbHVlOwoKICBTdHJpbmdDb25zdGFudEV4cHJlc3Npb24odGhpcy5zdHJpbmdWYWx1ZSk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRFeHByZXNzaW9uS2luZC5TVFJJTkc7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTdHJpbmcodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdTdHJpbmcodmFsdWU9JHtzdHJpbmdWYWx1ZX0pJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVTdHJpbmcoc3RyaW5nVmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSA9PiAyMyAqIHN0cmluZ1ZhbHVlLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoU3RyaW5nQ29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSB7CiAgICByZXR1cm4gc3RyaW5nVmFsdWUgPT0gb3RoZXIuc3RyaW5nVmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPT4KICAgICAgY29tbW9uRWxlbWVudHMuc3RyaW5nVHlwZTsKfQoKLy8vIE51bGwgbGl0ZXJhbCBjb25zdGFudC4KY2xhc3MgTnVsbENvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgTnVsbENvbnN0YW50RXhwcmVzc2lvbigpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuTlVMTDsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdE51bGwodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdOdWxsKCknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZU51bGwoKTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgPT4gMjk7CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhOdWxsQ29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPT4KICAgICAgY29tbW9uRWxlbWVudHMubnVsbFR5cGU7Cn0KCi8vLyBMaXRlcmFsIGxpc3QgY29uc3RhbnQuCmNsYXNzIExpc3RDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIEludGVyZmFjZVR5cGUgdHlwZTsKICBmaW5hbCBMaXN0PENvbnN0YW50RXhwcmVzc2lvbj4gdmFsdWVzOwoKICBMaXN0Q29uc3RhbnRFeHByZXNzaW9uKHRoaXMudHlwZSwgdGhpcy52YWx1ZXMpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuTElTVDsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdExpc3QodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdMaXN0KHR5cGU9JHR5cGUsdmFsdWVzPVsnKTsKICAgIFN0cmluZyBkZWxpbWl0ZXIgPSAnJzsKICAgIGZvciAoQ29uc3RhbnRFeHByZXNzaW9uIHZhbHVlIGluIHZhbHVlcykgewogICAgICBzYi53cml0ZShkZWxpbWl0ZXIpOwogICAgICB2YWx1ZS5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgICBkZWxpbWl0ZXIgPSAnLCc7CiAgICB9CiAgICBzYi53cml0ZSgnXSknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUxpc3QoCiAgICAgICAgdHlwZSwgdmFsdWVzLm1hcCgodikgPT4gdi5ldmFsdWF0ZShlbnZpcm9ubWVudCkpLnRvTGlzdCgpKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBhcHBseShOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIG5ldyBMaXN0Q29uc3RhbnRFeHByZXNzaW9uKAogICAgICAgIHR5cGUsIHZhbHVlcy5tYXAoKHYpID0+IHYuYXBwbHkoYXJndW1lbnRzKSkudG9MaXN0KCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSB7CiAgICBpbnQgaGFzaENvZGUgPSAxMyAqIHR5cGUuaGFzaENvZGUgKyAxNyAqIHZhbHVlcy5sZW5ndGg7CiAgICBmb3IgKENvbnN0YW50RXhwcmVzc2lvbiB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgaGFzaENvZGUgXj0gMTkgKiB2YWx1ZS5oYXNoQ29kZTsKICAgIH0KICAgIHJldHVybiBoYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhMaXN0Q29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSB7CiAgICBpZiAodHlwZSAhPSBvdGhlci50eXBlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAodmFsdWVzLmxlbmd0aCAhPSBvdGhlci52YWx1ZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodmFsdWVzW2ldICE9IG90aGVyLnZhbHVlc1tpXSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRLbm93blR5cGUoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpID0+IHR5cGU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSW1wbGljaXQgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG90ZW50aWFsID0+IHZhbHVlcy5hbnkoKGUpID0+IGUuaXNQb3RlbnRpYWwpOwp9CgovLy8gTGl0ZXJhbCBzZXQgY29uc3RhbnQuCmNsYXNzIFNldENvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgSW50ZXJmYWNlVHlwZSB0eXBlOwogIGZpbmFsIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiB2YWx1ZXM7CgogIFNldENvbnN0YW50RXhwcmVzc2lvbih0aGlzLnR5cGUsIHRoaXMudmFsdWVzKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLlNFVDsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFNldCh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBhcHBseShOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3VtZW50cykgPT4KICAgICAgbmV3IFNldENvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICAgIHR5cGUsIHZhbHVlcy5tYXAoKHYpID0+IHYuYXBwbHkoYXJndW1lbnRzKSkudG9MaXN0KCkpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgLy8gVE9ETyhmaXNoeXRoZWZpc2gpOiBEZWxldGUgb25jZSB0aGUgQ0ZFIHByb3ZpZGVzIHRoZXNlIGVycm9yIG1lc3NhZ2VzLgogICAgU2V0PENvbnN0YW50VmFsdWU+IHNldCA9IG5ldyBMaW5rZWRIYXNoU2V0PENvbnN0YW50VmFsdWU+KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gdmFsdWVzW2ldLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgICAgaWYgKCF2YWx1ZS5pc0NvbnN0YW50KSByZXR1cm4gbmV3IE5vbkNvbnN0YW50VmFsdWUoKTsKICAgICAgaWYgKCFzZXQuYWRkKHZhbHVlKSkgewogICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKHZhbHVlc1tpXSwgTWVzc2FnZUtpbmQuRVFVQUxfU0VUX0VOVFJZLCB7fSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZVNldCgKICAgICAgICBlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cywgdHlwZSwgc2V0LnRvTGlzdCgpKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPT4gdHlwZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnU2V0KHR5cGU9JHR5cGUsdmFsdWVzPVsnKTsKICAgIFN0cmluZyBkZWxpbWl0ZXIgPSAnJzsKICAgIGZvciAoQ29uc3RhbnRFeHByZXNzaW9uIHZhbHVlIGluIHZhbHVlcykgewogICAgICBzYi53cml0ZShkZWxpbWl0ZXIpOwogICAgICB2YWx1ZS5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgICBkZWxpbWl0ZXIgPSAnLCc7CiAgICB9CiAgICBzYi53cml0ZSgnXSknKTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgPT4gSGFzaGluZy5saXN0SGFzaCh2YWx1ZXMsIEhhc2hpbmcub2JqZWN0SGFzaCh0eXBlKSk7CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhTZXRDb25zdGFudEV4cHJlc3Npb24gb3RoZXIpIHsKICAgIGlmICh0eXBlICE9IG90aGVyLnR5cGUpIHJldHVybiBmYWxzZTsKICAgIGlmICh2YWx1ZXMubGVuZ3RoICE9IG90aGVyLnZhbHVlcy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh2YWx1ZXNbaV0gIT0gb3RoZXIudmFsdWVzW2ldKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSW1wbGljaXQgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG90ZW50aWFsID0+IHZhbHVlcy5hbnkoKHYpID0+IHYuaXNQb3RlbnRpYWwpOwp9CgovLy8gTGl0ZXJhbCBtYXAgY29uc3RhbnQuCmNsYXNzIE1hcENvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgSW50ZXJmYWNlVHlwZSB0eXBlOwogIGZpbmFsIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiBrZXlzOwogIGZpbmFsIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiB2YWx1ZXM7CgogIE1hcENvbnN0YW50RXhwcmVzc2lvbih0aGlzLnR5cGUsIHRoaXMua2V5cywgdGhpcy52YWx1ZXMpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuTUFQOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TWFwKHRoaXMsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnTWFwKHR5cGU9JHR5cGUsZW50cmllcz1bJyk7CiAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwga2V5cy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgaWYgKGluZGV4ID4gMCkgewogICAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgIH0KICAgICAga2V5c1tpbmRleF0uX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KHNiKTsKICAgICAgc2Iud3JpdGUoJy0+Jyk7CiAgICAgIHZhbHVlc1tpbmRleF0uX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KHNiKTsKICAgIH0KICAgIHNiLndyaXRlKCddKScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IGRlbGV0ZSBvbmNlIHRoZSBDRkUgcHJvdmlkZXMgdGhlc2UgZXJyb3IgbWVzc2FnZXMuCiAgICByZXR1cm4gZW52aXJvbm1lbnQuZXZhbHVhdGVNYXBCb2R5KCgpIHsKICAgICAgTWFwPENvbnN0YW50VmFsdWUsIENvbnN0YW50VmFsdWU+IG1hcCA9IDxDb25zdGFudFZhbHVlLCBDb25zdGFudFZhbHVlPnt9OwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBDb25zdGFudFZhbHVlIGtleSA9IGtleXNbaV0uZXZhbHVhdGUoZW52aXJvbm1lbnQpOwogICAgICAgIGlmICgha2V5LmlzQ29uc3RhbnQpIHsKICAgICAgICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogICAgICAgIH0KICAgICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gdmFsdWVzW2ldLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgICAgICBpZiAoIXZhbHVlLmlzQ29uc3RhbnQpIHsKICAgICAgICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogICAgICAgIH0KICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKGtleXNbaV0sIE1lc3NhZ2VLaW5kLkVRVUFMX01BUF9FTlRSWV9LRVksIHt9KTsKICAgICAgICB9CiAgICAgICAgbWFwW2tleV0gPSB2YWx1ZTsKICAgICAgfQogICAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZU1hcChlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cywgdHlwZSwKICAgICAgICAgIG1hcC5rZXlzLnRvTGlzdCgpLCBtYXAudmFsdWVzLnRvTGlzdCgpKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGFwcGx5KE5vcm1hbGl6ZWRBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IE1hcENvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICB0eXBlLAogICAgICAgIGtleXMubWFwKChrKSA9PiBrLmFwcGx5KGFyZ3VtZW50cykpLnRvTGlzdCgpLAogICAgICAgIHZhbHVlcy5tYXAoKHYpID0+IHYuYXBwbHkoYXJndW1lbnRzKSkudG9MaXN0KCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSB7CiAgICBpbnQgaGFzaENvZGUgPSAxMyAqIHR5cGUuaGFzaENvZGUgKyAxNyAqIHZhbHVlcy5sZW5ndGg7CiAgICBmb3IgKENvbnN0YW50RXhwcmVzc2lvbiB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgaGFzaENvZGUgXj0gMTkgKiB2YWx1ZS5oYXNoQ29kZTsKICAgIH0KICAgIHJldHVybiBoYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhNYXBDb25zdGFudEV4cHJlc3Npb24gb3RoZXIpIHsKICAgIGlmICh0eXBlICE9IG90aGVyLnR5cGUpIHJldHVybiBmYWxzZTsKICAgIGlmICh2YWx1ZXMubGVuZ3RoICE9IG90aGVyLnZhbHVlcy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChrZXlzW2ldICE9IG90aGVyLmtleXNbaV0pIHJldHVybiBmYWxzZTsKICAgICAgaWYgKHZhbHVlc1tpXSAhPSBvdGhlci52YWx1ZXNbaV0pIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSA9PiB0eXBlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ltcGxpY2l0ID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1BvdGVudGlhbCB7CiAgICByZXR1cm4ga2V5cy5hbnkoKGUpID0+IGUuaXNQb3RlbnRpYWwpIHx8IHZhbHVlcy5hbnkoKGUpID0+IGUuaXNQb3RlbnRpYWwpOwogIH0KfQoKLy8vIEludm9jYXRpb24gb2YgYSBjb25zdCBjb25zdHJ1Y3Rvci4KY2xhc3MgQ29uc3RydWN0ZWRDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIEludGVyZmFjZVR5cGUgdHlwZTsKICBmaW5hbCBDb25zdHJ1Y3RvckVudGl0eSB0YXJnZXQ7CiAgZmluYWwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlOwogIGZpbmFsIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiBhcmd1bWVudHM7CgogIENvbnN0cnVjdGVkQ29uc3RhbnRFeHByZXNzaW9uKAogICAgICB0aGlzLnR5cGUsIHRoaXMudGFyZ2V0LCB0aGlzLmNhbGxTdHJ1Y3R1cmUsIHRoaXMuYXJndW1lbnRzKSB7CiAgICBhc3NlcnQodHlwZS5lbGVtZW50ID09IHRhcmdldC5lbmNsb3NpbmdDbGFzcyk7CiAgICBhc3NlcnQoIWFyZ3VtZW50cy5jb250YWlucyhudWxsKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuQ09OU1RSVUNURUQ7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDb25zdHJ1Y3RlZCh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0NvbnN0cnVjdGVkKHR5cGU9JHR5cGUsY29uc3RydWN0b3I9JHRhcmdldCwnCiAgICAgICAgJ2NhbGxTdHJ1Y3R1cmU9JGNhbGxTdHJ1Y3R1cmUsYXJndW1lbnRzPVsnKTsKICAgIFN0cmluZyBkZWxpbWl0ZXIgPSAnJzsKICAgIGZvciAoQ29uc3RhbnRFeHByZXNzaW9uIHZhbHVlIGluIGFyZ3VtZW50cykgewogICAgICBzYi53cml0ZShkZWxpbWl0ZXIpOwogICAgICB2YWx1ZS5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgICBkZWxpbWl0ZXIgPSAnLCc7CiAgICB9CiAgICBzYi53cml0ZSgnXSknKTsKICB9CgogIEluc3RhbmNlRGF0YSBjb21wdXRlSW5zdGFuY2VEYXRhKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgQ29uc3RhbnRDb25zdHJ1Y3RvciBjb25zdGFudENvbnN0cnVjdG9yID0KICAgICAgICBlbnZpcm9ubWVudC5nZXRDb25zdHJ1Y3RvckNvbnN0YW50KHRhcmdldCk7CiAgICBhc3NlcnQoY29uc3RhbnRDb25zdHJ1Y3RvciAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KHRhcmdldCwgIk5vIGNvbnN0YW50IGNvbnN0cnVjdG9yIGNvbXB1dGVkIGZvciAkdGFyZ2V0LiIpKTsKICAgIHJldHVybiBjb25zdGFudENvbnN0cnVjdG9yLmNvbXB1dGVJbnN0YW5jZURhdGEoCiAgICAgICAgZW52aXJvbm1lbnQsIGFyZ3VtZW50cywgY2FsbFN0cnVjdHVyZSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGNvbXB1dGVJbnN0YW5jZVR5cGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICByZXR1cm4gZW52aXJvbm1lbnQKICAgICAgICAuZ2V0Q29uc3RydWN0b3JDb25zdGFudCh0YXJnZXQpCiAgICAgICAgLmNvbXB1dGVJbnN0YW5jZVR5cGUoZW52aXJvbm1lbnQsIHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0ZWRDb25zdGFudEV4cHJlc3Npb24gYXBwbHkoTm9ybWFsaXplZEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgQ29uc3RydWN0ZWRDb25zdGFudEV4cHJlc3Npb24odHlwZSwgdGFyZ2V0LCBjYWxsU3RydWN0dXJlLAogICAgICAgIHRoaXMuYXJndW1lbnRzLm1hcCgoYSkgPT4gYS5hcHBseShhcmd1bWVudHMpKS50b0xpc3QoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgSW50ZXJmYWNlVHlwZSBpbnN0YW5jZVR5cGUgPSBjb21wdXRlSW5zdGFuY2VUeXBlKGVudmlyb25tZW50KTsKICAgIHJldHVybiBlbnZpcm9ubWVudC5ldmFsdWF0ZUNvbnN0cnVjdG9yKHRhcmdldCwgaW5zdGFuY2VUeXBlLCAoKSB7CiAgICAgIEluc3RhbmNlRGF0YSBpbnN0YW5jZURhdGEgPSBjb21wdXRlSW5zdGFuY2VEYXRhKGVudmlyb25tZW50KTsKICAgICAgaWYgKGluc3RhbmNlRGF0YSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG5ldyBOb25Db25zdGFudFZhbHVlKCk7CiAgICAgIH0KICAgICAgYm9vbCBpc1ZhbGlkQXNDb25zdGFudCA9IHRydWU7CiAgICAgIE1hcDxGaWVsZEVudGl0eSwgQ29uc3RhbnRWYWx1ZT4gZmllbGRWYWx1ZXMgPQogICAgICAgICAgPEZpZWxkRW50aXR5LCBDb25zdGFudFZhbHVlPnt9OwogICAgICBpbnN0YW5jZURhdGEuZmllbGRNYXAKICAgICAgICAgIC5mb3JFYWNoKChGaWVsZEVudGl0eSBmaWVsZCwgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50KSB7CiAgICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IGNvbnN0YW50LmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgIHZhbHVlICE9IG51bGwsCiAgICAgICAgICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAgICAgICAiTm8gdmFsdWUgY29tcHV0ZWQgZm9yICR7Y29uc3RhbnQudG9TdHJ1Y3R1cmVkVGV4dCgpfS4iKSk7CiAgICAgICAgaWYgKHZhbHVlLmlzQ29uc3RhbnQpIHsKICAgICAgICAgIGZpZWxkVmFsdWVzW2ZpZWxkXSA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpc1ZhbGlkQXNDb25zdGFudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGZvciAoQXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uIGFzc2VydGlvbiBpbiBpbnN0YW5jZURhdGEuYXNzZXJ0aW9ucykgewogICAgICAgIGlmICghYXNzZXJ0aW9uLmV2YWx1YXRlKGVudmlyb25tZW50KS5pc0NvbnN0YW50KSB7CiAgICAgICAgICBpc1ZhbGlkQXNDb25zdGFudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNWYWxpZEFzQ29uc3RhbnQpIHsKICAgICAgICByZXR1cm4gbmV3IENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZShpbnN0YW5jZVR5cGUsIGZpZWxkVmFsdWVzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IE5vbkNvbnN0YW50VmFsdWUoKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpIHsKICAgIGludCBoYXNoQ29kZSA9CiAgICAgICAgMTMgKiB0eXBlLmhhc2hDb2RlICsgMTcgKiB0YXJnZXQuaGFzaENvZGUgKyAxOSAqIGNhbGxTdHJ1Y3R1cmUuaGFzaENvZGU7CiAgICBmb3IgKENvbnN0YW50RXhwcmVzc2lvbiB2YWx1ZSBpbiBhcmd1bWVudHMpIHsKICAgICAgaGFzaENvZGUgXj0gMjMgKiB2YWx1ZS5oYXNoQ29kZTsKICAgIH0KICAgIHJldHVybiBoYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhDb25zdHJ1Y3RlZENvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgaWYgKHR5cGUgIT0gb3RoZXIudHlwZSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKHRhcmdldCAhPSBvdGhlci50YXJnZXQpIHJldHVybiBmYWxzZTsKICAgIGlmIChjYWxsU3RydWN0dXJlICE9IG90aGVyLmNhbGxTdHJ1Y3R1cmUpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChhcmd1bWVudHNbaV0gIT0gb3RoZXIuYXJndW1lbnRzW2ldKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSW1wbGljaXQgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG90ZW50aWFsIHsKICAgIHJldHVybiBhcmd1bWVudHMuYW55KChlKSA9PiBlLmlzUG90ZW50aWFsKTsKICB9Cn0KCi8vLyBTdHJpbmcgbGl0ZXJhbCB3aXRoIGp1eHRhcG9zaXRpb24gYW5kL29yIGludGVycG9sYXRpb25zLgpjbGFzcyBDb25jYXRlbmF0ZUNvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgTGlzdDxDb25zdGFudEV4cHJlc3Npb24+IGV4cHJlc3Npb25zOwoKICBDb25jYXRlbmF0ZUNvbnN0YW50RXhwcmVzc2lvbih0aGlzLmV4cHJlc3Npb25zKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLkNPTkNBVEVOQVRFOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q29uY2F0ZW5hdGUodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdDb25jYXRlbmF0ZShleHByZXNzaW9ucz1bJyk7CiAgICBTdHJpbmcgZGVsaW1pdGVyID0gJyc7CiAgICBmb3IgKENvbnN0YW50RXhwcmVzc2lvbiB2YWx1ZSBpbiBleHByZXNzaW9ucykgewogICAgICBzYi53cml0ZShkZWxpbWl0ZXIpOwogICAgICB2YWx1ZS5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgICBkZWxpbWl0ZXIgPSAnLCc7CiAgICB9CiAgICBzYi53cml0ZSgnXSknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBhcHBseShOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIG5ldyBDb25jYXRlbmF0ZUNvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICBleHByZXNzaW9ucy5tYXAoKGEpID0+IGEuYXBwbHkoYXJndW1lbnRzKSkudG9MaXN0KCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIGJvb2wgaXNWYWxpZCA9IHRydWU7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBmb3IgKENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGV4cHJlc3Npb25zKSB7CiAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBleHByZXNzaW9uLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgICAgaWYgKCF2YWx1ZS5pc0NvbnN0YW50KSB7CiAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgIC8vIFVzZSBgY29udGludWVgIGluc3RlYWQgb2YgYHJldHVybmAgaGVyZSB0byByZXBvcnQgYWxsIGVycm9ycyBpbiB0aGUKICAgICAgICAvLyBleHByZXNzaW9uIGFuZCBub3QganVzdCB0aGUgZmlyc3QuCiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlLmlzUHJpbWl0aXZlKSB7CiAgICAgICAgaWYgKHZhbHVlIGlzIFN0cmluZ0NvbnN0YW50VmFsdWUpIHsKICAgICAgICAgIHNiLndyaXRlKHZhbHVlLnN0cmluZ1ZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIEludENvbnN0YW50VmFsdWUpIHsKICAgICAgICAgIHNiLndyaXRlKHZhbHVlLmludFZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIERvdWJsZUNvbnN0YW50VmFsdWUpIHsKICAgICAgICAgIHNiLndyaXRlKHZhbHVlLmRvdWJsZVZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIEJvb2xDb25zdGFudFZhbHVlKSB7CiAgICAgICAgICBzYi53cml0ZSh2YWx1ZS5ib29sVmFsdWUpOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgTnVsbENvbnN0YW50VmFsdWUpIHsKICAgICAgICAgIHNiLndyaXRlKG51bGwpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBlbnZpcm9ubWVudC5yZXBvcnRFcnJvcigKICAgICAgICAgICAgZXhwcmVzc2lvbiwgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9JTlRFUlBPTEFUSU9OX1RZUEUsIHsKICAgICAgICAgICdjb25zdGFudCc6IGV4cHJlc3Npb24sCiAgICAgICAgICAndHlwZSc6IHZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpCiAgICAgICAgfSk7CiAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgIC8vIFVzZSBgY29udGludWVgIGluc3RlYWQgb2YgYHJldHVybmAgaGVyZSB0byByZXBvcnQgYWxsIGVycm9ycyBpbiB0aGUKICAgICAgICAvLyBleHByZXNzaW9uIGFuZCBub3QganVzdCB0aGUgZmlyc3QuCiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc1ZhbGlkKSB7CiAgICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uY3JlYXRlU3RyaW5nKHNiLnRvU3RyaW5nKCkpOwogICAgfQogICAgcmV0dXJuIG5ldyBOb25Db25zdGFudFZhbHVlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpIHsKICAgIGludCBoYXNoQ29kZSA9IDE3ICogZXhwcmVzc2lvbnMubGVuZ3RoOwogICAgZm9yIChDb25zdGFudEV4cHJlc3Npb24gdmFsdWUgaW4gZXhwcmVzc2lvbnMpIHsKICAgICAgaGFzaENvZGUgXj0gMTkgKiB2YWx1ZS5oYXNoQ29kZTsKICAgIH0KICAgIHJldHVybiBoYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhDb25jYXRlbmF0ZUNvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgaWYgKGV4cHJlc3Npb25zLmxlbmd0aCAhPSBvdGhlci5leHByZXNzaW9ucy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwcmVzc2lvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGV4cHJlc3Npb25zW2ldICE9IG90aGVyLmV4cHJlc3Npb25zW2ldKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSA9PgogICAgICBjb21tb25FbGVtZW50cy5zdHJpbmdUeXBlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1BvdGVudGlhbCB7CiAgICByZXR1cm4gZXhwcmVzc2lvbnMuYW55KChlKSA9PiBlLmlzUG90ZW50aWFsKTsKICB9Cn0KCi8vLyBTeW1ib2wgbGl0ZXJhbC4KY2xhc3MgU3ltYm9sQ29uc3RhbnRFeHByZXNzaW9uIGV4dGVuZHMgQ29uc3RhbnRFeHByZXNzaW9uIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgU3ltYm9sQ29uc3RhbnRFeHByZXNzaW9uKHRoaXMubmFtZSk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRFeHByZXNzaW9uS2luZC5TWU1CT0w7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTeW1ib2wodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdTeW1ib2wobmFtZT0kbmFtZSknKTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgPT4gMTMgKiBuYW1lLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoU3ltYm9sQ29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSB7CiAgICByZXR1cm4gbmFtZSA9PSBvdGhlci5uYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uY3JlYXRlU3ltYm9sKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzLCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSA9PgogICAgICBjb21tb25FbGVtZW50cy5zeW1ib2xUeXBlOwp9CgovLy8gVHlwZSBsaXRlcmFsLgpjbGFzcyBUeXBlQ29uc3RhbnRFeHByZXNzaW9uIGV4dGVuZHMgQ29uc3RhbnRFeHByZXNzaW9uIHsKICAvLy8gRWl0aGVyIFtEeW5hbWljVHlwZV0gb3IgYSByYXcgW0dlbmVyaWNUeXBlXS4KICBmaW5hbCBEYXJ0VHlwZSB0eXBlOwogIGZpbmFsIFN0cmluZyBuYW1lOwoKICBUeXBlQ29uc3RhbnRFeHByZXNzaW9uKHRoaXMudHlwZSwgdGhpcy5uYW1lKSB7CiAgICBhc3NlcnQodHlwZS5pc0ludGVyZmFjZVR5cGUgfHwgdHlwZS5pc1R5cGVkZWYgfHwgdHlwZS5pc0R5bmFtaWMsCiAgICAgICAgIlVuZXhwZWN0ZWQgdHlwZSBjb25zdGFudCB0eXBlOiAkdHlwZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLlRZUEU7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRUeXBlKHRoaXMsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnVHlwZSh0eXBlPSR0eXBlKScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uY3JlYXRlVHlwZShlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cywgdHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpID0+IDEzICogdHlwZS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKFR5cGVDb25zdGFudEV4cHJlc3Npb24gb3RoZXIpIHsKICAgIHJldHVybiB0eXBlID09IG90aGVyLnR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPT4KICAgICAgY29tbW9uRWxlbWVudHMudHlwZVR5cGU7Cn0KCi8vLyBDYXN0IGV4cHJlc3Npb25zOiB0aGVzZSBtYXkgYmUgZnJvbSBlaXRoZXIgZXhwbGljaXQgb3IgaW1wbGljaXQgYGFzYAovLy8gY2hlY2tzLgpjbGFzcyBBc0NvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb247CiAgZmluYWwgRGFydFR5cGUgdHlwZTsKCiAgQXNDb25zdGFudEV4cHJlc3Npb24odGhpcy5leHByZXNzaW9uLCB0aGlzLnR5cGUpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuQVM7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBcyh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0FzKHZhbHVlPScpOwogICAgZXhwcmVzc2lvbi5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyx0eXBlPSR0eXBlKScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIC8vIFJ1bm5pbmcgZXhhbXBsZSBmb3IgY29tbWVudHM6CiAgICAvLwogICAgLy8gICAgIGNsYXNzIEE8VD4gewogICAgLy8gICAgICAgZmluYWwgVCB0OwogICAgLy8gICAgICAgY29uc3QgQShkeW5hbWljIHQpIDogdGhpcy50ID0gdDsgLy8gaW1wbGljaXRseSBgdCBhcyBBLlRgCiAgICAvLyAgICAgfQogICAgLy8gICAgIGNsYXNzIEI8Uz4gZXh0ZW5kcyBBPFM+IHsKICAgIC8vICAgICAgIGNvbnN0IEIoZHluYW1pYyBzKSA6IHN1cGVyKHMpOwogICAgLy8gICAgIH0KICAgIC8vICAgICBtYWluKCkgPT4gY29uc3QgQjxudW0+KDApOwogICAgLy8KICAgIC8vIFdlIHZpc2l0IGB0IGFzIEEuVGAgd2hpbGUgZXZhbHVhdGluZyBgY29uc3QgQjxudW0+KDApYC4KCiAgICAvLyBUaGUgZXhwcmVzc2lvbiB2YWx1ZSBpcyBgMGAuCiAgICBDb25zdGFudFZhbHVlIGV4cHJlc3Npb25WYWx1ZSA9IGV4cHJlc3Npb24uZXZhbHVhdGUoZW52aXJvbm1lbnQpOwoKICAgIGlmICghZW52aXJvbm1lbnQuY2hlY2tDYXN0cykgcmV0dXJuIGV4cHJlc3Npb25WYWx1ZTsKCiAgICAvLyBUaGUgZXhwcmVzc2lvbiB0eXBlIGlzIGBpbnRgLgogICAgRGFydFR5cGUgZXhwcmVzc2lvblR5cGUgPQogICAgICAgIGV4cHJlc3Npb25WYWx1ZS5nZXRUeXBlKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzKTsKCiAgICAvLyBUaGUgYGFzYCB0eXBlIGBBLlRgIGluIHRoZSBjb250ZXh0IG9mIGBCPG51bT5gIGlzIGBudW1gLgogICAgRGFydFR5cGUgdHlwZUluQ29udGV4dCA9IGVudmlyb25tZW50LmdldFR5cGVJbkNvbnRleHQodHlwZSk7CgogICAgLy8gQ2hlY2sgdGhhdCB0aGUgZXhwcmVzc2lvbiB0eXBlLCBgaW50YCwgaXMgYSBzdWJ0eXBlIG9mIHRoZSB0eXBlIGluCiAgICAvLyBjb250ZXh0LCBgbnVtYC4KICAgIGlmICghY29uc3RhbnRfc3lzdGVtLmlzU3VidHlwZSgKICAgICAgICBlbnZpcm9ubWVudC50eXBlcywgZXhwcmVzc2lvblR5cGUsIHR5cGVJbkNvbnRleHQpKSB7CiAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IGNvbnNpZGVyIHJlcG9ydGluZyBkaWZmZXJlbnQgbWVzc2FnZXMgYW5kIGVycm9yCiAgICAgIC8vIGxvY2F0aW9ucyBmb3IgaW1wbGljaXQgdnMgZXhwbGljaXQgY2FzdHMuCiAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKGV4cHJlc3Npb24sIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQ0FTVCwKICAgICAgICAgIHsnY29uc3RhbnQnOiBleHByZXNzaW9uLCAndHlwZSc6IGV4cHJlc3Npb25UeXBlLCAnY2FzdFR5cGUnOiB0eXBlfSk7CiAgICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogICAgfQogICAgcmV0dXJuIGV4cHJlc3Npb25WYWx1ZTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBhcHBseShOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIG5ldyBBc0NvbnN0YW50RXhwcmVzc2lvbihleHByZXNzaW9uLmFwcGx5KGFyZ3VtZW50cyksIHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSA9PiAxMyAqIHR5cGUuaGFzaENvZGUgKyAxNyAqIGV4cHJlc3Npb24uaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhBc0NvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgcmV0dXJuIGV4cHJlc3Npb24gPT0gb3RoZXIuZXhwcmVzc2lvbiAmJiB0eXBlID09IG90aGVyLnR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPT4KICAgICAgZXhwcmVzc2lvbi5nZXRLbm93blR5cGUoY29tbW9uRWxlbWVudHMpOwp9CgovLy8gUmVmZXJlbmNlIHRvIGEgY29uc3RhbnQgdG9wLWxldmVsIG9yIHN0YXRpYyBmaWVsZC4KY2xhc3MgRmllbGRDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIEZpZWxkRW50aXR5IGVsZW1lbnQ7CgogIEZpZWxkQ29uc3RhbnRFeHByZXNzaW9uKHRoaXMuZWxlbWVudCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRFeHByZXNzaW9uS2luZC5GSUVMRDsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEZpZWxkKHRoaXMsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnRmllbGQoZWxlbWVudD0kZWxlbWVudCknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICByZXR1cm4gZW52aXJvbm1lbnQuZXZhbHVhdGVGaWVsZChlbGVtZW50LCAoKSB7CiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudCA9IGVudmlyb25tZW50LmdldEZpZWxkQ29uc3RhbnQoZWxlbWVudCk7CiAgICAgIHJldHVybiBjb25zdGFudC5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgPT4gMTMgKiBlbGVtZW50Lmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoRmllbGRDb25zdGFudEV4cHJlc3Npb24gb3RoZXIpIHsKICAgIHJldHVybiBlbGVtZW50ID09IG90aGVyLmVsZW1lbnQ7CiAgfQp9CgovLy8gUmVmZXJlbmNlIHRvIGEgY29uc3RhbnQgbG9jYWwgdmFyaWFibGUuCmNsYXNzIExvY2FsVmFyaWFibGVDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIExvY2FsIGVsZW1lbnQ7CgogIExvY2FsVmFyaWFibGVDb25zdGFudEV4cHJlc3Npb24odGhpcy5lbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLkxPQ0FMX1ZBUklBQkxFOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TG9jYWxWYXJpYWJsZSh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0xvY2FsVmFyaWFibGUoZWxlbWVudD0kZWxlbWVudCknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnQgPSBlbnZpcm9ubWVudC5nZXRMb2NhbENvbnN0YW50KGVsZW1lbnQpOwogICAgcmV0dXJuIGNvbnN0YW50LmV2YWx1YXRlKGVudmlyb25tZW50KTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgPT4gMTMgKiBlbGVtZW50Lmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoTG9jYWxWYXJpYWJsZUNvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgcmV0dXJuIGVsZW1lbnQgPT0gb3RoZXIuZWxlbWVudDsKICB9Cn0KCi8vLyBSZWZlcmVuY2UgdG8gYSB0b3AtbGV2ZWwgb3Igc3RhdGljIGZ1bmN0aW9uLgpjbGFzcyBGdW5jdGlvbkNvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgRnVuY3Rpb25FbnRpdHkgZWxlbWVudDsKICBmaW5hbCBGdW5jdGlvblR5cGUgdHlwZTsKCiAgRnVuY3Rpb25Db25zdGFudEV4cHJlc3Npb24odGhpcy5lbGVtZW50LCB0aGlzLnR5cGUpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuRlVOQ1RJT047CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRGdW5jdGlvbih0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0Z1bmN0aW9uKGVsZW1lbnQ9JGVsZW1lbnQpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgcmV0dXJuIG5ldyBGdW5jdGlvbkNvbnN0YW50VmFsdWUoZWxlbWVudCwgdHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpID0+IDEzICogZWxlbWVudC5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKEZ1bmN0aW9uQ29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSB7CiAgICByZXR1cm4gZWxlbWVudCA9PSBvdGhlci5lbGVtZW50OwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRLbm93blR5cGUoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpID0+CiAgICAgIGNvbW1vbkVsZW1lbnRzLmZ1bmN0aW9uVHlwZTsKfQoKLy8vIEEgY29uc3RhbnQgYmluYXJ5IGV4cHJlc3Npb24gbGlrZSBgYSAqIGJgLgpjbGFzcyBCaW5hcnlDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiBsZWZ0OwogIGZpbmFsIEJpbmFyeU9wZXJhdG9yIG9wZXJhdG9yOwogIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiByaWdodDsKCiAgQmluYXJ5Q29uc3RhbnRFeHByZXNzaW9uKHRoaXMubGVmdCwgdGhpcy5vcGVyYXRvciwgdGhpcy5yaWdodCkgewogICAgYXNzZXJ0KFBSRUNFREVOQ0VfTUFQW29wZXJhdG9yLmtpbmRdICE9IG51bGwsCiAgICAgICAgIk1pc3NpbmcgcHJlY2VuZGVuY2UgZm9yIGJpbmFyeSBvcGVyYXRvcjogJyRvcGVyYXRvcicuIik7CiAgfQoKICBzdGF0aWMgYm9vbCBwb3RlbnRpYWxPcGVyYXRvcihCaW5hcnlPcGVyYXRvciBvcGVyYXRvcikgPT4KICAgICAgUFJFQ0VERU5DRV9NQVBbb3BlcmF0b3Iua2luZF0gIT0gbnVsbDsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLkJJTkFSWTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEJpbmFyeSh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0JpbmFyeShsZWZ0PScpOwogICAgbGVmdC5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyxvcD0kb3BlcmF0b3IscmlnaHQ9Jyk7CiAgICByaWdodC5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudFZhbHVlIGxlZnRWYWx1ZSA9IGxlZnQuZXZhbHVhdGUoZW52aXJvbm1lbnQpOwogICAgaWYgKCFsZWZ0VmFsdWUuaXNDb25zdGFudCkgcmV0dXJuIG5ldyBOb25Db25zdGFudFZhbHVlKCk7CiAgICBDb25zdGFudFZhbHVlIHJpZ2h0VmFsdWU7CiAgICAvLyBTaG9ydC1jaXJjdWl0ICYmIGFuZCB8fCBvcGVyYXRvcnMuCiAgICBzd2l0Y2ggKG9wZXJhdG9yLmtpbmQpIHsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTE9HSUNBTF9BTkQ6CiAgICAgICAgaWYgKGxlZnRWYWx1ZS5pc0Jvb2wgJiYgbGVmdFZhbHVlLmlzRmFsc2UpIHsKICAgICAgICAgIHJpZ2h0VmFsdWUgPSBuZXcgRmFsc2VDb25zdGFudFZhbHVlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJpZ2h0VmFsdWUgPSByaWdodC5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTE9HSUNBTF9PUjoKICAgICAgICBpZiAobGVmdFZhbHVlLmlzQm9vbCAmJiBsZWZ0VmFsdWUuaXNUcnVlKSB7CiAgICAgICAgICByaWdodFZhbHVlID0gbmV3IFRydWVDb25zdGFudFZhbHVlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJpZ2h0VmFsdWUgPSByaWdodC5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHJpZ2h0VmFsdWUgPSByaWdodC5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICB9CgogICAgaWYgKCFyaWdodFZhbHVlLmlzQ29uc3RhbnQpIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogICAgYm9vbCBpc1ZhbGlkID0gdHJ1ZTsKICAgIHN3aXRjaCAob3BlcmF0b3Iua2luZCkgewogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5FUToKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTk9UX0VROgogICAgICAgIGlmICghbGVmdFZhbHVlLmlzUHJpbWl0aXZlKSB7CiAgICAgICAgICBpZiAoIXJpZ2h0VmFsdWUuaXNOdWxsKSB7CiAgICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKAogICAgICAgICAgICAgICAgbGVmdCwgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9CSU5BUllfUFJJTUlUSVZFX1RZUEUsIHsKICAgICAgICAgICAgICAnY29uc3RhbnQnOiBsZWZ0LAogICAgICAgICAgICAgICd0eXBlJzogbGVmdFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAgICdvcGVyYXRvcic6IG9wZXJhdG9yCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghcmlnaHRWYWx1ZS5pc1ByaW1pdGl2ZSkgewogICAgICAgICAgaWYgKCFsZWZ0VmFsdWUuaXNOdWxsKSB7CiAgICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKAogICAgICAgICAgICAgICAgcmlnaHQsIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQklOQVJZX1BSSU1JVElWRV9UWVBFLCB7CiAgICAgICAgICAgICAgJ2NvbnN0YW50JzogcmlnaHQsCiAgICAgICAgICAgICAgJ3R5cGUnOiByaWdodFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAgICdvcGVyYXRvcic6IG9wZXJhdG9yCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5BREQ6CiAgICAgICAgaWYgKGxlZnRWYWx1ZS5pc1N0cmluZykgewogICAgICAgICAgaWYgKCFyaWdodFZhbHVlLmlzU3RyaW5nKSB7CiAgICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKAogICAgICAgICAgICAgICAgcmlnaHQsIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfU1RSSU5HX0FERF9UWVBFLCB7CiAgICAgICAgICAgICAgJ2NvbnN0YW50JzogcmlnaHQsCiAgICAgICAgICAgICAgJ3R5cGUnOiByaWdodFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChsZWZ0VmFsdWUuaXNOdW0pIHsKICAgICAgICAgIGlmICghcmlnaHRWYWx1ZS5pc051bSkgewogICAgICAgICAgICBlbnZpcm9ubWVudC5yZXBvcnRFcnJvcigKICAgICAgICAgICAgICAgIHJpZ2h0LCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX05VTV9BRERfVFlQRSwgewogICAgICAgICAgICAgICdjb25zdGFudCc6IHJpZ2h0LAogICAgICAgICAgICAgICd0eXBlJzogcmlnaHRWYWx1ZS5nZXRUeXBlKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAocmlnaHRWYWx1ZS5pc1N0cmluZykgewogICAgICAgICAgaWYgKCFsZWZ0VmFsdWUuaXNTdHJpbmcpIHsKICAgICAgICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IoCiAgICAgICAgICAgICAgICBsZWZ0LCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX1NUUklOR19BRERfVFlQRSwgewogICAgICAgICAgICAgICdjb25zdGFudCc6IGxlZnQsCiAgICAgICAgICAgICAgJ3R5cGUnOiBsZWZ0VmFsdWUuZ2V0VHlwZShlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cykKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHJpZ2h0VmFsdWUuaXNOdW0pIHsKICAgICAgICAgIGlmICghbGVmdFZhbHVlLmlzTnVtKSB7CiAgICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKAogICAgICAgICAgICAgICAgbGVmdCwgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9OVU1fQUREX1RZUEUsIHsKICAgICAgICAgICAgICAnY29uc3RhbnQnOiBsZWZ0LAogICAgICAgICAgICAgICd0eXBlJzogbGVmdFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVudmlyb25tZW50CiAgICAgICAgICAgICAgLnJlcG9ydEVycm9yKHRoaXMsIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQUREX1RZUEVTLCB7CiAgICAgICAgICAgICdsZWZ0Q29uc3RhbnQnOiBsZWZ0LAogICAgICAgICAgICAnbGVmdFR5cGUnOiBsZWZ0VmFsdWUuZ2V0VHlwZShlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cyksCiAgICAgICAgICAgICdyaWdodENvbnN0YW50JzogcmlnaHQsCiAgICAgICAgICAgICdyaWdodFR5cGUnOiByaWdodFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpCiAgICAgICAgICB9KTsKICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLlNVQjoKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTVVMOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5ESVY6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLklESVY6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLk1PRDoKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuR1RFUToKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuR1Q6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkxURVE6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkxUOgogICAgICAgIGlmICghbGVmdFZhbHVlLmlzTnVtKSB7CiAgICAgICAgICBlbnZpcm9ubWVudAogICAgICAgICAgICAgIC5yZXBvcnRFcnJvcihsZWZ0LCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9OVU1fVFlQRSwgewogICAgICAgICAgICAnY29uc3RhbnQnOiBsZWZ0LAogICAgICAgICAgICAndHlwZSc6IGxlZnRWYWx1ZS5nZXRUeXBlKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzKSwKICAgICAgICAgICAgJ29wZXJhdG9yJzogb3BlcmF0b3IKICAgICAgICAgIH0pOwogICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoIXJpZ2h0VmFsdWUuaXNOdW0pIHsKICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKAogICAgICAgICAgICAgIHJpZ2h0LCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9OVU1fVFlQRSwgewogICAgICAgICAgICAnY29uc3RhbnQnOiByaWdodCwKICAgICAgICAgICAgJ3R5cGUnOiByaWdodFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAnb3BlcmF0b3InOiBvcGVyYXRvcgogICAgICAgICAgfSk7CiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChpc1ZhbGlkICYmCiAgICAgICAgICAgIChvcGVyYXRvci5raW5kID09IEJpbmFyeU9wZXJhdG9yS2luZC5JRElWIHx8CiAgICAgICAgICAgICAgICBvcGVyYXRvci5raW5kID09IEJpbmFyeU9wZXJhdG9yS2luZC5NT0QpKSB7CiAgICAgICAgICBpZiAocmlnaHRWYWx1ZS5pc1plcm8pIHsKICAgICAgICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IocmlnaHQsIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfRElWLAogICAgICAgICAgICAgICAgeydsZWZ0JzogbGVmdCwgJ3JpZ2h0JzogcmlnaHQsICdvcGVyYXRvcic6IG9wZXJhdG9yfSk7CiAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLlNITDoKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuU0hSOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5TSFJVOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5BTkQ6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLk9SOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5YT1I6CiAgICAgICAgaWYgKCFsZWZ0VmFsdWUuaXNJbnQpIHsKICAgICAgICAgIGVudmlyb25tZW50CiAgICAgICAgICAgICAgLnJlcG9ydEVycm9yKGxlZnQsIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQklOQVJZX0lOVF9UWVBFLCB7CiAgICAgICAgICAgICdjb25zdGFudCc6IGxlZnQsCiAgICAgICAgICAgICd0eXBlJzogbGVmdFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAnb3BlcmF0b3InOiBvcGVyYXRvcgogICAgICAgICAgfSk7CiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghcmlnaHRWYWx1ZS5pc0ludCkgewogICAgICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IoCiAgICAgICAgICAgICAgcmlnaHQsIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQklOQVJZX0lOVF9UWVBFLCB7CiAgICAgICAgICAgICdjb25zdGFudCc6IHJpZ2h0LAogICAgICAgICAgICAndHlwZSc6IHJpZ2h0VmFsdWUuZ2V0VHlwZShlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cyksCiAgICAgICAgICAgICdvcGVyYXRvcic6IG9wZXJhdG9yCiAgICAgICAgICB9KTsKICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzVmFsaWQgJiYKICAgICAgICAgICAgKG9wZXJhdG9yLmtpbmQgPT0gQmluYXJ5T3BlcmF0b3JLaW5kLlNITCB8fAogICAgICAgICAgICAgICAgb3BlcmF0b3Iua2luZCA9PSBCaW5hcnlPcGVyYXRvcktpbmQuU0hSIHx8CiAgICAgICAgICAgICAgICBvcGVyYXRvci5raW5kID09IEJpbmFyeU9wZXJhdG9yS2luZC5TSFJVKSkgewogICAgICAgICAgSW50Q29uc3RhbnRWYWx1ZSBzaGlmdCA9IHJpZ2h0VmFsdWU7CiAgICAgICAgICBpZiAoc2hpZnQuaW50VmFsdWUgPCBCaWdJbnQuemVybykgewogICAgICAgICAgICBlbnZpcm9ubWVudC5yZXBvcnRFcnJvcihyaWdodCwgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9TSElGVCwKICAgICAgICAgICAgICAgIHsnbGVmdCc6IGxlZnQsICdyaWdodCc6IHJpZ2h0LCAnb3BlcmF0b3InOiBvcGVyYXRvcn0pOwogICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5MT0dJQ0FMX0FORDoKICAgICAgICBpZiAoIWxlZnRWYWx1ZS5pc0Jvb2wpIHsKICAgICAgICAgIGVudmlyb25tZW50CiAgICAgICAgICAgICAgLnJlcG9ydEVycm9yKGxlZnQsIE1lc3NhZ2VLaW5kLklOVkFMSURfTE9HSUNBTF9BTkRfT1BFUkFORF9UWVBFLCB7CiAgICAgICAgICAgICdjb25zdGFudCc6IGxlZnQsCiAgICAgICAgICAgICd0eXBlJzogbGVmdFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAnb3BlcmF0b3InOiBvcGVyYXRvcgogICAgICAgICAgfSk7CiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghcmlnaHRWYWx1ZS5pc0Jvb2wpIHsKICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKAogICAgICAgICAgICAgIHJpZ2h0LCBNZXNzYWdlS2luZC5JTlZBTElEX0xPR0lDQUxfQU5EX09QRVJBTkRfVFlQRSwgewogICAgICAgICAgICAnY29uc3RhbnQnOiByaWdodCwKICAgICAgICAgICAgJ3R5cGUnOiByaWdodFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAnb3BlcmF0b3InOiBvcGVyYXRvcgogICAgICAgICAgfSk7CiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5MT0dJQ0FMX09SOgogICAgICAgIGlmICghbGVmdFZhbHVlLmlzQm9vbCkgewogICAgICAgICAgZW52aXJvbm1lbnQKICAgICAgICAgICAgICAucmVwb3J0RXJyb3IobGVmdCwgTWVzc2FnZUtpbmQuSU5WQUxJRF9MT0dJQ0FMX09SX09QRVJBTkRfVFlQRSwgewogICAgICAgICAgICAnY29uc3RhbnQnOiBsZWZ0LAogICAgICAgICAgICAndHlwZSc6IGxlZnRWYWx1ZS5nZXRUeXBlKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzKSwKICAgICAgICAgICAgJ29wZXJhdG9yJzogb3BlcmF0b3IKICAgICAgICAgIH0pOwogICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoIXJpZ2h0VmFsdWUuaXNCb29sKSB7CiAgICAgICAgICBlbnZpcm9ubWVudAogICAgICAgICAgICAgIC5yZXBvcnRFcnJvcihyaWdodCwgTWVzc2FnZUtpbmQuSU5WQUxJRF9MT0dJQ0FMX09SX09QRVJBTkRfVFlQRSwgewogICAgICAgICAgICAnY29uc3RhbnQnOiByaWdodCwKICAgICAgICAgICAgJ3R5cGUnOiByaWdodFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAnb3BlcmF0b3InOiBvcGVyYXRvcgogICAgICAgICAgfSk7CiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5JTkRFWDoKICAgICAgICBlbnZpcm9ubWVudC5yZXBvcnRFcnJvcih0aGlzLCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0lOREVYLCB7fSk7CiAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5JRl9OVUxMOgogICAgICAgIC8vIFZhbGlkIHNpbmNlIFtsZWZ0VmFsdWVdIGFuZCBbcmlnaHRWYWx1ZV0gYXJlIGNvbnN0YW50cy4KICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChpc1ZhbGlkKSB7CiAgICAgIHN3aXRjaCAob3BlcmF0b3Iua2luZCkgewogICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLk5PVF9FUToKICAgICAgICAgIEJvb2xDb25zdGFudFZhbHVlIGVxdWFscyA9CiAgICAgICAgICAgICAgY29uc3RhbnRfc3lzdGVtLmVxdWFsLmZvbGQobGVmdFZhbHVlLCByaWdodFZhbHVlKTsKICAgICAgICAgIHJldHVybiBlcXVhbHMubmVnYXRlKCk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBjb25zdGFudF9zeXN0ZW0KICAgICAgICAgICAgICAubG9va3VwQmluYXJ5KG9wZXJhdG9yKQogICAgICAgICAgICAgIC5mb2xkKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7CiAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICBlbnZpcm9ubWVudAogICAgICAgICAgICAgIC5yZXBvcnRFcnJvcih0aGlzLCBNZXNzYWdlS2luZC5OT1RfQV9DT01QSUxFX1RJTUVfQ09OU1RBTlQsIHt9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBOb25Db25zdGFudFZhbHVlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gYXBwbHkoTm9ybWFsaXplZEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgQmluYXJ5Q29uc3RhbnRFeHByZXNzaW9uKAogICAgICAgIGxlZnQuYXBwbHkoYXJndW1lbnRzKSwgb3BlcmF0b3IsIHJpZ2h0LmFwcGx5KGFyZ3VtZW50cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgLy8gaWdub3JlOiBNSVNTSU5HX1JFVFVSTgogIEludGVyZmFjZVR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSB7CiAgICBEYXJ0VHlwZSBrbm93bkxlZnRUeXBlID0gbGVmdC5nZXRLbm93blR5cGUoY29tbW9uRWxlbWVudHMpOwogICAgRGFydFR5cGUga25vd25SaWdodFR5cGUgPSByaWdodC5nZXRLbm93blR5cGUoY29tbW9uRWxlbWVudHMpOwogICAgc3dpdGNoIChvcGVyYXRvci5raW5kKSB7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkVROgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5OT1RfRVE6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkxPR0lDQUxfQU5EOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5MT0dJQ0FMX09SOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5HVDoKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTFQ6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkdURVE6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkxURVE6CiAgICAgICAgcmV0dXJuIGNvbW1vbkVsZW1lbnRzLmJvb2xUeXBlOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5BREQ6CiAgICAgICAgaWYgKGtub3duTGVmdFR5cGUgPT0gY29tbW9uRWxlbWVudHMuc3RyaW5nVHlwZSkgewogICAgICAgICAgYXNzZXJ0KGtub3duUmlnaHRUeXBlID09IGNvbW1vbkVsZW1lbnRzLnN0cmluZ1R5cGUpOwogICAgICAgICAgcmV0dXJuIGNvbW1vbkVsZW1lbnRzLnN0cmluZ1R5cGU7CiAgICAgICAgfSBlbHNlIGlmIChrbm93bkxlZnRUeXBlID09IGNvbW1vbkVsZW1lbnRzLmludFR5cGUgJiYKICAgICAgICAgICAga25vd25SaWdodFR5cGUgPT0gY29tbW9uRWxlbWVudHMuaW50VHlwZSkgewogICAgICAgICAgcmV0dXJuIGNvbW1vbkVsZW1lbnRzLmludFR5cGU7CiAgICAgICAgfQogICAgICAgIGFzc2VydChrbm93bkxlZnRUeXBlID09IGNvbW1vbkVsZW1lbnRzLmRvdWJsZVR5cGUgfHwKICAgICAgICAgICAga25vd25SaWdodFR5cGUgPT0gY29tbW9uRWxlbWVudHMuZG91YmxlVHlwZSk7CiAgICAgICAgcmV0dXJuIGNvbW1vbkVsZW1lbnRzLmRvdWJsZVR5cGU7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLlNVQjoKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTVVMOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5NT0Q6CiAgICAgICAgaWYgKGtub3duTGVmdFR5cGUgPT0gY29tbW9uRWxlbWVudHMuaW50VHlwZSAmJgogICAgICAgICAgICBrbm93blJpZ2h0VHlwZSA9PSBjb21tb25FbGVtZW50cy5pbnRUeXBlKSB7CiAgICAgICAgICByZXR1cm4gY29tbW9uRWxlbWVudHMuaW50VHlwZTsKICAgICAgICB9CiAgICAgICAgYXNzZXJ0KGtub3duTGVmdFR5cGUgPT0gY29tbW9uRWxlbWVudHMuZG91YmxlVHlwZSB8fAogICAgICAgICAgICBrbm93blJpZ2h0VHlwZSA9PSBjb21tb25FbGVtZW50cy5kb3VibGVUeXBlKTsKICAgICAgICByZXR1cm4gY29tbW9uRWxlbWVudHMuZG91YmxlVHlwZTsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuRElWOgogICAgICAgIHJldHVybiBjb21tb25FbGVtZW50cy5kb3VibGVUeXBlOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5JRElWOgogICAgICAgIHJldHVybiBjb21tb25FbGVtZW50cy5pbnRUeXBlOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5BTkQ6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLk9SOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5YT1I6CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLlNITDoKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuU0hSOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5TSFJVOgogICAgICAgIHJldHVybiBjb21tb25FbGVtZW50cy5pbnRUeXBlOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5JRl9OVUxMOgogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5JTkRFWDoKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgY29uc3RhbnQgYmluYXJ5IG9wZXJhdG9yOiAkb3BlcmF0b3InKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgcHJlY2VkZW5jZSA9PiBQUkVDRURFTkNFX01BUFtvcGVyYXRvci5raW5kXTsKCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSB7CiAgICByZXR1cm4gMTMgKiBvcGVyYXRvci5oYXNoQ29kZSArIDE3ICogbGVmdC5oYXNoQ29kZSArIDE5ICogcmlnaHQuaGFzaENvZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoQmluYXJ5Q29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSB7CiAgICByZXR1cm4gb3BlcmF0b3IgPT0gb3RoZXIub3BlcmF0b3IgJiYKICAgICAgICBsZWZ0ID09IG90aGVyLmxlZnQgJiYKICAgICAgICByaWdodCA9PSBvdGhlci5yaWdodDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG90ZW50aWFsIHsKICAgIHJldHVybiBsZWZ0LmlzUG90ZW50aWFsIHx8IHJpZ2h0LmlzUG90ZW50aWFsOwogIH0KCiAgc3RhdGljIGNvbnN0IE1hcDxCaW5hcnlPcGVyYXRvcktpbmQsIGludD4gUFJFQ0VERU5DRV9NQVAgPSBjb25zdCB7CiAgICBCaW5hcnlPcGVyYXRvcktpbmQuRVE6IDYsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuTk9UX0VROiA2LAogICAgQmluYXJ5T3BlcmF0b3JLaW5kLkxPR0lDQUxfQU5EOiA1LAogICAgQmluYXJ5T3BlcmF0b3JLaW5kLkxPR0lDQUxfT1I6IDQsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuWE9SOiA5LAogICAgQmluYXJ5T3BlcmF0b3JLaW5kLkFORDogMTAsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuT1I6IDgsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuU0hMOiAxMSwKICAgIEJpbmFyeU9wZXJhdG9yS2luZC5TSFI6IDExLAogICAgQmluYXJ5T3BlcmF0b3JLaW5kLlNIUlU6IDExLAogICAgQmluYXJ5T3BlcmF0b3JLaW5kLkFERDogMTIsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuU1VCOiAxMiwKICAgIEJpbmFyeU9wZXJhdG9yS2luZC5NVUw6IDEzLAogICAgQmluYXJ5T3BlcmF0b3JLaW5kLkRJVjogMTMsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuSURJVjogMTMsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuR1Q6IDcsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuTFQ6IDcsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuR1RFUTogNywKICAgIEJpbmFyeU9wZXJhdG9yS2luZC5MVEVROiA3LAogICAgQmluYXJ5T3BlcmF0b3JLaW5kLk1PRDogMTMsCiAgICBCaW5hcnlPcGVyYXRvcktpbmQuSUZfTlVMTDogMywKICAgIEJpbmFyeU9wZXJhdG9yS2luZC5JTkRFWDogMywKICB9Owp9CgovLy8gQSBjb25zdGFudCBpZGVudGljYWwgaW52b2NhdGlvbiBsaWtlIGBpZGVudGljYWwoYSwgYilgLgpjbGFzcyBJZGVudGljYWxDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiBsZWZ0OwogIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiByaWdodDsKCiAgSWRlbnRpY2FsQ29uc3RhbnRFeHByZXNzaW9uKHRoaXMubGVmdCwgdGhpcy5yaWdodCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRFeHByZXNzaW9uS2luZC5JREVOVElDQUw7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJZGVudGljYWwodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdJZGVudGljYWwobGVmdD0nKTsKICAgIGxlZnQuX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KHNiKTsKICAgIHNiLndyaXRlKCcscmlnaHQ9Jyk7CiAgICByaWdodC5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudFZhbHVlIGxlZnRWYWx1ZSA9IGxlZnQuZXZhbHVhdGUoZW52aXJvbm1lbnQpOwogICAgQ29uc3RhbnRWYWx1ZSByaWdodFZhbHVlID0gcmlnaHQuZXZhbHVhdGUoZW52aXJvbm1lbnQpOwogICAgaWYgKGxlZnRWYWx1ZS5pc0NvbnN0YW50ICYmIHJpZ2h0VmFsdWUuaXNDb25zdGFudCkgewogICAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmlkZW50aXR5LmZvbGQobGVmdFZhbHVlLCByaWdodFZhbHVlKTsKICAgIH0KICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGFwcGx5KE5vcm1hbGl6ZWRBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IElkZW50aWNhbENvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICBsZWZ0LmFwcGx5KGFyZ3VtZW50cyksIHJpZ2h0LmFwcGx5KGFyZ3VtZW50cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBwcmVjZWRlbmNlID0+IDE1OwoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpIHsKICAgIHJldHVybiAxNyAqIGxlZnQuaGFzaENvZGUgKyAxOSAqIHJpZ2h0Lmhhc2hDb2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKElkZW50aWNhbENvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgcmV0dXJuIGxlZnQgPT0gb3RoZXIubGVmdCAmJiByaWdodCA9PSBvdGhlci5yaWdodDsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSA9PgogICAgICBjb21tb25FbGVtZW50cy5ib29sVHlwZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNQb3RlbnRpYWwgewogICAgcmV0dXJuIGxlZnQuaXNQb3RlbnRpYWwgfHwgcmlnaHQuaXNQb3RlbnRpYWw7CiAgfQp9CgovLy8gQSB1bmFyeSBjb25zdGFudCBleHByZXNzaW9uIGxpa2UgYC1hYC4KY2xhc3MgVW5hcnlDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIFVuYXJ5T3BlcmF0b3Igb3BlcmF0b3I7CiAgZmluYWwgQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb247CgogIFVuYXJ5Q29uc3RhbnRFeHByZXNzaW9uKHRoaXMub3BlcmF0b3IsIHRoaXMuZXhwcmVzc2lvbikgewogICAgYXNzZXJ0KFBSRUNFREVOQ0VfTUFQW29wZXJhdG9yLmtpbmRdICE9IG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBDb25zdGFudEV4cHJlc3Npb25LaW5kLlVOQVJZOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VW5hcnkodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdVbmFyeShvcD0kb3BlcmF0b3IsZXhwcmVzc2lvbj0nKTsKICAgIGV4cHJlc3Npb24uX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KHNiKTsKICAgIHNiLndyaXRlKCcpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgQ29uc3RhbnRWYWx1ZSBleHByZXNzaW9uVmFsdWUgPSBleHByZXNzaW9uLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgIGJvb2wgaXNWYWxpZCA9IHRydWU7CiAgICBzd2l0Y2ggKG9wZXJhdG9yLmtpbmQpIHsKICAgICAgY2FzZSBVbmFyeU9wZXJhdG9yS2luZC5OT1Q6CiAgICAgICAgaWYgKCFleHByZXNzaW9uVmFsdWUuaXNCb29sKSB7CiAgICAgICAgICBlbnZpcm9ubWVudAogICAgICAgICAgICAgIC5yZXBvcnRFcnJvcihleHByZXNzaW9uLCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX05PVF9UWVBFLCB7CiAgICAgICAgICAgICdjb25zdGFudCc6IGV4cHJlc3Npb24sCiAgICAgICAgICAgICd0eXBlJzogZXhwcmVzc2lvblZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpLAogICAgICAgICAgICAnb3BlcmF0b3InOiBvcGVyYXRvcgogICAgICAgICAgfSk7CiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFVuYXJ5T3BlcmF0b3JLaW5kLk5FR0FURToKICAgICAgICBpZiAoIWV4cHJlc3Npb25WYWx1ZS5pc051bSkgewogICAgICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IoCiAgICAgICAgICAgICAgZXhwcmVzc2lvbiwgTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9ORUdBVEVfVFlQRSwgewogICAgICAgICAgICAnY29uc3RhbnQnOiBleHByZXNzaW9uLAogICAgICAgICAgICAndHlwZSc6IGV4cHJlc3Npb25WYWx1ZS5nZXRUeXBlKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzKSwKICAgICAgICAgICAgJ29wZXJhdG9yJzogb3BlcmF0b3IKICAgICAgICAgIH0pOwogICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBVbmFyeU9wZXJhdG9yS2luZC5DT01QTEVNRU5UOgogICAgICAgIGlmICghZXhwcmVzc2lvblZhbHVlLmlzSW50KSB7CiAgICAgICAgICBlbnZpcm9ubWVudC5yZXBvcnRFcnJvcigKICAgICAgICAgICAgICBleHByZXNzaW9uLCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0NPTVBMRU1FTlRfVFlQRSwgewogICAgICAgICAgICAnY29uc3RhbnQnOiBleHByZXNzaW9uLAogICAgICAgICAgICAndHlwZSc6IGV4cHJlc3Npb25WYWx1ZS5nZXRUeXBlKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzKSwKICAgICAgICAgICAgJ29wZXJhdG9yJzogb3BlcmF0b3IKICAgICAgICAgIH0pOwogICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChpc1ZhbGlkKSB7CiAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPQogICAgICAgICAgY29uc3RhbnRfc3lzdGVtLmxvb2t1cFVuYXJ5KG9wZXJhdG9yKS5mb2xkKGV4cHJlc3Npb25WYWx1ZSk7CiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IE5vbkNvbnN0YW50VmFsdWUoKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBhcHBseShOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIG5ldyBVbmFyeUNvbnN0YW50RXhwcmVzc2lvbihvcGVyYXRvciwgZXhwcmVzc2lvbi5hcHBseShhcmd1bWVudHMpKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgcHJlY2VkZW5jZSA9PiBQUkVDRURFTkNFX01BUFtvcGVyYXRvci5raW5kXTsKCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSB7CiAgICByZXR1cm4gMTMgKiBvcGVyYXRvci5oYXNoQ29kZSArIDE3ICogZXhwcmVzc2lvbi5oYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhVbmFyeUNvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgcmV0dXJuIG9wZXJhdG9yID09IG90aGVyLm9wZXJhdG9yICYmIGV4cHJlc3Npb24gPT0gb3RoZXIuZXhwcmVzc2lvbjsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgewogICAgcmV0dXJuIGV4cHJlc3Npb24uZ2V0S25vd25UeXBlKGNvbW1vbkVsZW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG90ZW50aWFsIHsKICAgIHJldHVybiBleHByZXNzaW9uLmlzUG90ZW50aWFsOwogIH0KCiAgc3RhdGljIGNvbnN0IE1hcDxVbmFyeU9wZXJhdG9yS2luZCwgaW50PiBQUkVDRURFTkNFX01BUCA9IGNvbnN0IHsKICAgIFVuYXJ5T3BlcmF0b3JLaW5kLk5PVDogMTQsCiAgICBVbmFyeU9wZXJhdG9yS2luZC5DT01QTEVNRU5UOiAxNCwKICAgIFVuYXJ5T3BlcmF0b3JLaW5kLk5FR0FURTogMTQsCiAgfTsKfQoKLy8vIEEgc3RyaW5nIGxlbmd0aCBjb25zdGFudCBleHByZXNzaW9uIGxpa2UgYGEubGVuZ3RoYC4KY2xhc3MgU3RyaW5nTGVuZ3RoQ29uc3RhbnRFeHByZXNzaW9uIGV4dGVuZHMgQ29uc3RhbnRFeHByZXNzaW9uIHsKICBmaW5hbCBDb25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgU3RyaW5nTGVuZ3RoQ29uc3RhbnRFeHByZXNzaW9uKHRoaXMuZXhwcmVzc2lvbik7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRFeHByZXNzaW9uS2luZC5TVFJJTkdfTEVOR1RIOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U3RyaW5nTGVuZ3RoKHRoaXMsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnU3RyaW5nTGVuZ3RoKGV4cHJlc3Npb249Jyk7CiAgICBleHByZXNzaW9uLl9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChzYik7CiAgICBzYi53cml0ZSgnKScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBleHByZXNzaW9uLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgIGlmICghdmFsdWUuaXNTdHJpbmcpIHsKICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IoCiAgICAgICAgICBleHByZXNzaW9uLCBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX1NUUklOR19MRU5HVEhfVFlQRSwgewogICAgICAgICdjb25zdGFudCc6IGV4cHJlc3Npb24sCiAgICAgICAgJ3R5cGUnOiB2YWx1ZS5nZXRUeXBlKGVudmlyb25tZW50LmNvbW1vbkVsZW1lbnRzKQogICAgICB9KTsKICAgICAgcmV0dXJuIG5ldyBOb25Db25zdGFudFZhbHVlKCk7CiAgICB9IGVsc2UgewogICAgICBTdHJpbmdDb25zdGFudFZhbHVlIHN0cmluZ1ZhbHVlID0gdmFsdWU7CiAgICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0KICAgICAgICAgIC5jcmVhdGVJbnQobmV3IEJpZ0ludC5mcm9tKHN0cmluZ1ZhbHVlLnN0cmluZ1ZhbHVlLmxlbmd0aCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGFwcGx5KE5vcm1hbGl6ZWRBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IFN0cmluZ0xlbmd0aENvbnN0YW50RXhwcmVzc2lvbihleHByZXNzaW9uLmFwcGx5KGFyZ3VtZW50cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBwcmVjZWRlbmNlID0+IDE1OwoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpIHsKICAgIHJldHVybiAyMyAqIGV4cHJlc3Npb24uaGFzaENvZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoU3RyaW5nTGVuZ3RoQ29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSB7CiAgICByZXR1cm4gZXhwcmVzc2lvbiA9PSBvdGhlci5leHByZXNzaW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRLbm93blR5cGUoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpID0+CiAgICAgIGNvbW1vbkVsZW1lbnRzLmludFR5cGU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG90ZW50aWFsIHsKICAgIHJldHVybiBleHByZXNzaW9uLmlzUG90ZW50aWFsOwogIH0KfQoKLy8vIEEgY29uc3RhbnQgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBsaWtlIGBhID8gYiA6IGNgLgpjbGFzcyBDb25kaXRpb25hbENvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgQ29uc3RhbnRFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBmaW5hbCBDb25zdGFudEV4cHJlc3Npb24gdHJ1ZUV4cDsKICBmaW5hbCBDb25zdGFudEV4cHJlc3Npb24gZmFsc2VFeHA7CgogIENvbmRpdGlvbmFsQ29uc3RhbnRFeHByZXNzaW9uKHRoaXMuY29uZGl0aW9uLCB0aGlzLnRydWVFeHAsIHRoaXMuZmFsc2VFeHApOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuQ09ORElUSU9OQUw7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDb25kaXRpb25hbCh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ0NvbmRpdGlvbmFsKGNvbmRpdGlvbj0nKTsKICAgIGNvbmRpdGlvbi5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyx0cnVlPScpOwogICAgdHJ1ZUV4cC5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyxmYWxzZT0nKTsKICAgIGZhbHNlRXhwLl9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChzYik7CiAgICBzYi53cml0ZSgnKScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGFwcGx5KE5vcm1hbGl6ZWRBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IENvbmRpdGlvbmFsQ29uc3RhbnRFeHByZXNzaW9uKGNvbmRpdGlvbi5hcHBseShhcmd1bWVudHMpLAogICAgICAgIHRydWVFeHAuYXBwbHkoYXJndW1lbnRzKSwgZmFsc2VFeHAuYXBwbHkoYXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IHByZWNlZGVuY2UgPT4gMzsKCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSB7CiAgICByZXR1cm4gMTMgKiBjb25kaXRpb24uaGFzaENvZGUgKwogICAgICAgIDE3ICogdHJ1ZUV4cC5oYXNoQ29kZSArCiAgICAgICAgMTkgKiBmYWxzZUV4cC5oYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhDb25kaXRpb25hbENvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgcmV0dXJuIGNvbmRpdGlvbiA9PSBvdGhlci5jb25kaXRpb24gJiYKICAgICAgICB0cnVlRXhwID09IG90aGVyLnRydWVFeHAgJiYKICAgICAgICBmYWxzZUV4cCA9PSBvdGhlci5mYWxzZUV4cDsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudFZhbHVlIGNvbmRpdGlvblZhbHVlID0gY29uZGl0aW9uLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgIENvbnN0YW50VmFsdWUgdHJ1ZVZhbHVlID0gdHJ1ZUV4cC5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICBDb25zdGFudFZhbHVlIGZhbHNlVmFsdWUgPSBmYWxzZUV4cC5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICBib29sIGlzVmFsaWQgPSB0cnVlOwogICAgaWYgKCFjb25kaXRpb25WYWx1ZS5pc0Jvb2wpIHsKICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IoCiAgICAgICAgICBjb25kaXRpb24sIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQ09ORElUSU9OQUxfVFlQRSwgewogICAgICAgICdjb25zdGFudCc6IGNvbmRpdGlvbiwKICAgICAgICAndHlwZSc6IGNvbmRpdGlvblZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpCiAgICAgIH0pOwogICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICB9CiAgICBpZiAoaXNWYWxpZCkgewogICAgICBpZiAoY29uZGl0aW9uVmFsdWUuaXNUcnVlKSB7CiAgICAgICAgcmV0dXJuIHRydWVWYWx1ZTsKICAgICAgfSBlbHNlIGlmIChjb25kaXRpb25WYWx1ZS5pc0ZhbHNlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlVmFsdWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSB7CiAgICBEYXJ0VHlwZSB0cnVlVHlwZSA9IHRydWVFeHAuZ2V0S25vd25UeXBlKGNvbW1vbkVsZW1lbnRzKTsKICAgIERhcnRUeXBlIGZhbHNlVHlwZSA9IGZhbHNlRXhwLmdldEtub3duVHlwZShjb21tb25FbGVtZW50cyk7CiAgICBpZiAodHJ1ZVR5cGUgPT0gZmFsc2VUeXBlKSB7CiAgICAgIHJldHVybiB0cnVlVHlwZTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNQb3RlbnRpYWwgewogICAgcmV0dXJuIGNvbmRpdGlvbi5pc1BvdGVudGlhbCB8fCB0cnVlRXhwLmlzUG90ZW50aWFsIHx8IGZhbHNlRXhwLmlzUG90ZW50aWFsOwogIH0KfQoKLy8vIEEgcmVmZXJlbmNlIHRvIGEgcG9zaXRpb24gcGFyYW1ldGVyLgpjbGFzcyBQb3NpdGlvbmFsQXJndW1lbnRSZWZlcmVuY2UgZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIGludCBpbmRleDsKCiAgUG9zaXRpb25hbEFyZ3VtZW50UmVmZXJlbmNlKHRoaXMuaW5kZXgpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kIHsKICAgIHJldHVybiBDb25zdGFudEV4cHJlc3Npb25LaW5kLlBPU0lUSU9OQUxfUkVGRVJFTkNFOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFBvc2l0aW9uYWwodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdQb3NpdGlvbmFsKGluZGV4PSRpbmRleCknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBhcHBseShOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5nZXRQb3NpdGlvbmFsQXJndW1lbnQoaW5kZXgpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSA9PiAxMyAqIGluZGV4Lmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoUG9zaXRpb25hbEFyZ3VtZW50UmVmZXJlbmNlIG90aGVyKSA9PiBpbmRleCA9PSBvdGhlci5pbmRleDsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNQb3RlbnRpYWwgPT4gdHJ1ZTsKfQoKLy8vIEEgcmVmZXJlbmNlIHRvIGEgbmFtZWQgcGFyYW1ldGVyLgpjbGFzcyBOYW1lZEFyZ3VtZW50UmVmZXJlbmNlIGV4dGVuZHMgQ29uc3RhbnRFeHByZXNzaW9uIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgTmFtZWRBcmd1bWVudFJlZmVyZW5jZSh0aGlzLm5hbWUpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kIHsKICAgIHJldHVybiBDb25zdGFudEV4cHJlc3Npb25LaW5kLk5BTUVEX1JFRkVSRU5DRTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXROYW1lZCh0aGlzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ05hbWVkKG5hbWU9JG5hbWUpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gYXBwbHkoTm9ybWFsaXplZEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBhcmd1bWVudHMuZ2V0TmFtZWRBcmd1bWVudChuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgPT4gMTMgKiBuYW1lLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoTmFtZWRBcmd1bWVudFJlZmVyZW5jZSBvdGhlcikgPT4gbmFtZSA9PSBvdGhlci5uYW1lOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgcmV0dXJuIG5ldyBOb25Db25zdGFudFZhbHVlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1BvdGVudGlhbCA9PiB0cnVlOwp9CgphYnN0cmFjdCBjbGFzcyBGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiBuYW1lOwogIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiBkZWZhdWx0VmFsdWU7CgogIEZyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbih0aGlzLm5hbWUsIHRoaXMuZGVmYXVsdFZhbHVlKTsKCiAgYm9vbCBfY2hlY2tOYW1lRnJvbUVudmlyb25tZW50KEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIG5hbWUsIENvbnN0YW50VmFsdWUgbmFtZVZhbHVlKSB7CiAgICBpZiAoIW5hbWVWYWx1ZS5pc1N0cmluZykgewogICAgICBlbnZpcm9ubWVudC5yZXBvcnRFcnJvcigKICAgICAgICAgIG5hbWUsIE1lc3NhZ2VLaW5kLklOVkFMSURfRlJPTV9FTlZJUk9OTUVOVF9OQU1FX1RZUEUsIHsKICAgICAgICAnY29uc3RhbnQnOiBuYW1lLAogICAgICAgICd0eXBlJzogbmFtZVZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpCiAgICAgIH0pOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgewogICAgcmV0dXJuIDEzICogbmFtZS5oYXNoQ29kZSArIDE3ICogZGVmYXVsdFZhbHVlLmhhc2hDb2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKEZyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbiBvdGhlcikgewogICAgcmV0dXJuIG5hbWUgPT0gb3RoZXIubmFtZSAmJiBkZWZhdWx0VmFsdWUgPT0gb3RoZXIuZGVmYXVsdFZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNJbXBsaWNpdCB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1BvdGVudGlhbCB7CiAgICByZXR1cm4gbmFtZS5pc1BvdGVudGlhbCB8fAogICAgICAgIChkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUuaXNQb3RlbnRpYWwpOwogIH0KfQoKLy8vIEEgYGNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50YCBjb25zdGFudC4KY2xhc3MgQm9vbEZyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbgogICAgZXh0ZW5kcyBGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24gewogIEJvb2xGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24oCiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBuYW1lLCBDb25zdGFudEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKQogICAgICA6IHN1cGVyKG5hbWUsIGRlZmF1bHRWYWx1ZSk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgewogICAgcmV0dXJuIENvbnN0YW50RXhwcmVzc2lvbktpbmQuQk9PTF9GUk9NX0VOVklST05NRU5UOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEJvb2xGcm9tRW52aXJvbm1lbnQodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdib29sLmZyb21FbnZpcm9ubWVudChuYW1lPScpOwogICAgbmFtZS5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyxkZWZhdWx0VmFsdWU9Jyk7CiAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKICAgICAgZGVmYXVsdFZhbHVlLl9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChzYik7CiAgICB9IGVsc2UgewogICAgICBzYi53cml0ZSgnbnVsbCcpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudFZhbHVlIG5hbWVDb25zdGFudFZhbHVlID0gbmFtZS5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICBDb25zdGFudFZhbHVlIGRlZmF1bHRDb25zdGFudFZhbHVlOwogICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAgICAgIGRlZmF1bHRDb25zdGFudFZhbHVlID0gZGVmYXVsdFZhbHVlLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIGRlZmF1bHRDb25zdGFudFZhbHVlID0gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUJvb2woZmFsc2UpOwogICAgfQogICAgaWYgKCFuYW1lQ29uc3RhbnRWYWx1ZS5pc0NvbnN0YW50IHx8ICFkZWZhdWx0Q29uc3RhbnRWYWx1ZS5pc0NvbnN0YW50KSB7CiAgICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogICAgfQogICAgYm9vbCBpc1ZhbGlkID0KICAgICAgICBfY2hlY2tOYW1lRnJvbUVudmlyb25tZW50KGVudmlyb25tZW50LCBuYW1lLCBuYW1lQ29uc3RhbnRWYWx1ZSk7CiAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKICAgICAgaWYgKCFkZWZhdWx0Q29uc3RhbnRWYWx1ZS5pc0Jvb2wgJiYgIWRlZmF1bHRDb25zdGFudFZhbHVlLmlzTnVsbCkgewogICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9CT09MX0ZST01fRU5WSVJPTk1FTlRfREVGQVVMVF9WQUxVRV9UWVBFLCB7CiAgICAgICAgICAnY29uc3RhbnQnOiBkZWZhdWx0VmFsdWUsCiAgICAgICAgICAndHlwZSc6IGRlZmF1bHRDb25zdGFudFZhbHVlLmdldFR5cGUoZW52aXJvbm1lbnQuY29tbW9uRWxlbWVudHMpCiAgICAgICAgfSk7CiAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNWYWxpZCkgewogICAgICBTdHJpbmdDb25zdGFudFZhbHVlIG5hbWVTdHJpbmdDb25zdGFudFZhbHVlID0gbmFtZUNvbnN0YW50VmFsdWU7CiAgICAgIFN0cmluZyB0ZXh0ID0KICAgICAgICAgIGVudmlyb25tZW50LnJlYWRGcm9tRW52aXJvbm1lbnQobmFtZVN0cmluZ0NvbnN0YW50VmFsdWUuc3RyaW5nVmFsdWUpOwogICAgICBpZiAodGV4dCA9PSAndHJ1ZScpIHsKICAgICAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUJvb2wodHJ1ZSk7CiAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnZmFsc2UnKSB7CiAgICAgICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVCb29sKGZhbHNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZGVmYXVsdENvbnN0YW50VmFsdWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGFwcGx5KE5vcm1hbGl6ZWRBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEJvb2xGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24obmFtZS5hcHBseShhcmd1bWVudHMpLAogICAgICAgIGRlZmF1bHRWYWx1ZSAhPSBudWxsID8gZGVmYXVsdFZhbHVlLmFwcGx5KGFyZ3VtZW50cykgOiBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0S25vd25UeXBlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSA9PgogICAgICBjb21tb25FbGVtZW50cy5ib29sVHlwZTsKfQoKLy8vIEEgYGNvbnN0IGludC5mcm9tRW52aXJvbm1lbnRgIGNvbnN0YW50LgpjbGFzcyBJbnRGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24KICAgIGV4dGVuZHMgRnJvbUVudmlyb25tZW50Q29uc3RhbnRFeHByZXNzaW9uIHsKICBJbnRGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24oCiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBuYW1lLCBDb25zdGFudEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKQogICAgICA6IHN1cGVyKG5hbWUsIGRlZmF1bHRWYWx1ZSk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgewogICAgcmV0dXJuIENvbnN0YW50RXhwcmVzc2lvbktpbmQuSU5UX0ZST01fRU5WSVJPTk1FTlQ7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SW50RnJvbUVudmlyb25tZW50KHRoaXMsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnaW50LmZyb21FbnZpcm9ubWVudChuYW1lPScpOwogICAgbmFtZS5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyxkZWZhdWx0VmFsdWU9Jyk7CiAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKICAgICAgZGVmYXVsdFZhbHVlLl9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChzYik7CiAgICB9IGVsc2UgewogICAgICBzYi53cml0ZSgnbnVsbCcpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudFZhbHVlIG5hbWVDb25zdGFudFZhbHVlID0gbmFtZS5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICBDb25zdGFudFZhbHVlIGRlZmF1bHRDb25zdGFudFZhbHVlOwogICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAgICAgIGRlZmF1bHRDb25zdGFudFZhbHVlID0gZGVmYXVsdFZhbHVlLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIGRlZmF1bHRDb25zdGFudFZhbHVlID0gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZU51bGwoKTsKICAgIH0KICAgIGlmICghbmFtZUNvbnN0YW50VmFsdWUuaXNDb25zdGFudCB8fCAhZGVmYXVsdENvbnN0YW50VmFsdWUuaXNDb25zdGFudCkgewogICAgICByZXR1cm4gbmV3IE5vbkNvbnN0YW50VmFsdWUoKTsKICAgIH0KICAgIGJvb2wgaXNWYWxpZCA9CiAgICAgICAgX2NoZWNrTmFtZUZyb21FbnZpcm9ubWVudChlbnZpcm9ubWVudCwgbmFtZSwgbmFtZUNvbnN0YW50VmFsdWUpOwogICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAgICAgIGlmICghZGVmYXVsdENvbnN0YW50VmFsdWUuaXNJbnQgJiYgIWRlZmF1bHRDb25zdGFudFZhbHVlLmlzTnVsbCkgewogICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9JTlRfRlJPTV9FTlZJUk9OTUVOVF9ERUZBVUxUX1ZBTFVFX1RZUEUsIHsKICAgICAgICAgICdjb25zdGFudCc6IGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICd0eXBlJzogZGVmYXVsdENvbnN0YW50VmFsdWUuZ2V0VHlwZShlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cykKICAgICAgICB9KTsKICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc1ZhbGlkKSB7CiAgICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgbmFtZVN0cmluZ0NvbnN0YW50VmFsdWUgPSBuYW1lQ29uc3RhbnRWYWx1ZTsKICAgICAgU3RyaW5nIHRleHQgPQogICAgICAgICAgZW52aXJvbm1lbnQucmVhZEZyb21FbnZpcm9ubWVudChuYW1lU3RyaW5nQ29uc3RhbnRWYWx1ZS5zdHJpbmdWYWx1ZSk7CiAgICAgIEJpZ0ludCB2YWx1ZTsKICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewogICAgICAgIHZhbHVlID0gQmlnSW50LnRyeVBhcnNlKHRleHQpOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHRDb25zdGFudFZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50KHZhbHVlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBOb25Db25zdGFudFZhbHVlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gYXBwbHkoTm9ybWFsaXplZEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgSW50RnJvbUVudmlyb25tZW50Q29uc3RhbnRFeHByZXNzaW9uKG5hbWUuYXBwbHkoYXJndW1lbnRzKSwKICAgICAgICBkZWZhdWx0VmFsdWUgIT0gbnVsbCA/IGRlZmF1bHRWYWx1ZS5hcHBseShhcmd1bWVudHMpIDogbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldEtub3duVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPT4KICAgICAgY29tbW9uRWxlbWVudHMuaW50VHlwZTsKfQoKLy8vIEEgYGNvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnRgIGNvbnN0YW50LgpjbGFzcyBTdHJpbmdGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24KICAgIGV4dGVuZHMgRnJvbUVudmlyb25tZW50Q29uc3RhbnRFeHByZXNzaW9uIHsKICBTdHJpbmdGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24oCiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBuYW1lLCBDb25zdGFudEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKQogICAgICA6IHN1cGVyKG5hbWUsIGRlZmF1bHRWYWx1ZSk7CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgewogICAgcmV0dXJuIENvbnN0YW50RXhwcmVzc2lvbktpbmQuU1RSSU5HX0ZST01fRU5WSVJPTk1FTlQ7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRFeHByZXNzaW9uVmlzaXRvciB2aXNpdG9yLCBbY29udGV4dF0pIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U3RyaW5nRnJvbUVudmlyb25tZW50KHRoaXMsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnU3RyaW5nLmZyb21FbnZpcm9ubWVudChuYW1lPScpOwogICAgbmFtZS5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyxkZWZhdWx0VmFsdWU9Jyk7CiAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKICAgICAgZGVmYXVsdFZhbHVlLl9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChzYik7CiAgICB9IGVsc2UgewogICAgICBzYi53cml0ZSgnbnVsbCcpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudFZhbHVlIG5hbWVDb25zdGFudFZhbHVlID0gbmFtZS5ldmFsdWF0ZShlbnZpcm9ubWVudCk7CiAgICBDb25zdGFudFZhbHVlIGRlZmF1bHRDb25zdGFudFZhbHVlOwogICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAgICAgIGRlZmF1bHRDb25zdGFudFZhbHVlID0gZGVmYXVsdFZhbHVlLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIGRlZmF1bHRDb25zdGFudFZhbHVlID0gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZU51bGwoKTsKICAgIH0KICAgIGlmICghbmFtZUNvbnN0YW50VmFsdWUuaXNDb25zdGFudCB8fCAhZGVmYXVsdENvbnN0YW50VmFsdWUuaXNDb25zdGFudCkgewogICAgICByZXR1cm4gbmV3IE5vbkNvbnN0YW50VmFsdWUoKTsKICAgIH0KICAgIGJvb2wgaXNWYWxpZCA9CiAgICAgICAgX2NoZWNrTmFtZUZyb21FbnZpcm9ubWVudChlbnZpcm9ubWVudCwgbmFtZSwgbmFtZUNvbnN0YW50VmFsdWUpOwogICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAgICAgIGlmICghZGVmYXVsdENvbnN0YW50VmFsdWUuaXNTdHJpbmcgJiYgIWRlZmF1bHRDb25zdGFudFZhbHVlLmlzTnVsbCkgewogICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICAgTWVzc2FnZUtpbmQuSU5WQUxJRF9TVFJJTkdfRlJPTV9FTlZJUk9OTUVOVF9ERUZBVUxUX1ZBTFVFX1RZUEUsIHsKICAgICAgICAgICdjb25zdGFudCc6IGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICd0eXBlJzogZGVmYXVsdENvbnN0YW50VmFsdWUuZ2V0VHlwZShlbnZpcm9ubWVudC5jb21tb25FbGVtZW50cykKICAgICAgICB9KTsKICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc1ZhbGlkKSB7CiAgICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgbmFtZVN0cmluZ0NvbnN0YW50VmFsdWUgPSBuYW1lQ29uc3RhbnRWYWx1ZTsKICAgICAgU3RyaW5nIHRleHQgPQogICAgICAgICAgZW52aXJvbm1lbnQucmVhZEZyb21FbnZpcm9ubWVudChuYW1lU3RyaW5nQ29uc3RhbnRWYWx1ZS5zdHJpbmdWYWx1ZSk7CiAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKICAgICAgICByZXR1cm4gZGVmYXVsdENvbnN0YW50VmFsdWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVTdHJpbmcodGV4dCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGFwcGx5KE5vcm1hbGl6ZWRBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IFN0cmluZ0Zyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbihuYW1lLmFwcGx5KGFyZ3VtZW50cyksCiAgICAgICAgZGVmYXVsdFZhbHVlICE9IG51bGwgPyBkZWZhdWx0VmFsdWUuYXBwbHkoYXJndW1lbnRzKSA6IG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRLbm93blR5cGUoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpID0+CiAgICAgIGNvbW1vbkVsZW1lbnRzLnN0cmluZ1R5cGU7Cn0KCmNsYXNzIEFzc2VydENvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIENvbnN0YW50RXhwcmVzc2lvbiB7CiAgZmluYWwgQ29uc3RhbnRFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBmaW5hbCBDb25zdGFudEV4cHJlc3Npb24gbWVzc2FnZTsKCiAgQXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uKHRoaXMuY29uZGl0aW9uLCB0aGlzLm1lc3NhZ2UpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuQVNTRVJUOwoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoQXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uIG90aGVyKSB7CiAgICByZXR1cm4gY29uZGl0aW9uID09IG90aGVyLmNvbmRpdGlvbiAmJiBtZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpIHsKICAgIHJldHVybiAxMyAqIGNvbmRpdGlvbi5oYXNoQ29kZSArIDE3ICogbWVzc2FnZS5oYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX2NyZWF0ZVN0cnVjdHVyZWRUZXh0KFN0cmluZ0J1ZmZlciBzYikgewogICAgc2Iud3JpdGUoJ2Fzc2VydCgnKTsKICAgIGNvbmRpdGlvbi5fY3JlYXRlU3RydWN0dXJlZFRleHQoc2IpOwogICAgc2Iud3JpdGUoJyxtZXNzYWdlPScpOwogICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewogICAgICBtZXNzYWdlLl9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChzYik7CiAgICB9IGVsc2UgewogICAgICBzYi53cml0ZSgnbnVsbCcpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBDb25zdGFudFZhbHVlIGNvbmRpdGlvblZhbHVlID0gY29uZGl0aW9uLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgIGJvb2wgdmFsaWRBc3NlcnQ7CiAgICBpZiAoZW52aXJvbm1lbnQuZW5hYmxlQXNzZXJ0aW9ucykgewogICAgICAvLyBCb29sZWFuIGNvbnZlcnNpb246CiAgICAgIHZhbGlkQXNzZXJ0ID0KICAgICAgICAgIGNvbmRpdGlvblZhbHVlIGlzIEJvb2xDb25zdGFudFZhbHVlICYmIGNvbmRpdGlvblZhbHVlLmJvb2xWYWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbGlkQXNzZXJ0ID0gdHJ1ZTsKICAgIH0KICAgIGlmICghdmFsaWRBc3NlcnQpIHsKICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewogICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBtZXNzYWdlLmV2YWx1YXRlKGVudmlyb25tZW50KTsKICAgICAgICBpZiAodmFsdWUgaXMgU3RyaW5nQ29uc3RhbnRWYWx1ZSkgewogICAgICAgICAgU3RyaW5nIHRleHQgPSAnJHt2YWx1ZS5zdHJpbmdWYWx1ZX0nOwogICAgICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IodGhpcywKICAgICAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0FTU0VSVF9WQUxVRV9NRVNTQUdFLCB7J21lc3NhZ2UnOiB0ZXh0fSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVudmlyb25tZW50LnJlcG9ydEVycm9yKHRoaXMsIE1lc3NhZ2VLaW5kLklOVkFMSURfQVNTRVJUX1ZBTFVFLAogICAgICAgICAgICAgIHsnYXNzZXJ0aW9uJzogY29uZGl0aW9uLnRvRGFydFRleHQoKX0pOwogICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVwb3J0IGludmFsaWQgY29uc3RhbnQgbWVzc2FnZT8KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZW52aXJvbm1lbnQucmVwb3J0RXJyb3IodGhpcywgTWVzc2FnZUtpbmQuSU5WQUxJRF9BU1NFUlRfVkFMVUUsCiAgICAgICAgICAgIHsnYXNzZXJ0aW9uJzogY29uZGl0aW9uLnRvRGFydFRleHQoKX0pOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogICAgfQoKICAgIC8vIFJldHVybiBhIHZhbGlkIGNvbnN0YW50IHZhbHVlIHRvIHNpZ25hbCB0aGF0IGFzc2VydGlvbiBkaWRuJ3QgZmFpbC4KICAgIHJldHVybiBuZXcgTnVsbENvbnN0YW50VmFsdWUoKTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHZpc2l0b3IsIFtjb250ZXh0XSkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBc3NlcnQodGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gYXBwbHkoTm9ybWFsaXplZEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgQXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uKAogICAgICAgIGNvbmRpdGlvbi5hcHBseShhcmd1bWVudHMpLCBtZXNzYWdlPy5hcHBseShhcmd1bWVudHMpKTsKICB9Cn0KCmNsYXNzIEluc3RhbnRpYXRpb25Db25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gewogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CiAgZmluYWwgQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb247CgogIEluc3RhbnRpYXRpb25Db25zdGFudEV4cHJlc3Npb24odGhpcy50eXBlQXJndW1lbnRzLCB0aGlzLmV4cHJlc3Npb24pOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IENvbnN0YW50RXhwcmVzc2lvbktpbmQuSU5TVEFOVElBVElPTjsKCiAgQG92ZXJyaWRlCiAgdm9pZCBfY3JlYXRlU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzYi53cml0ZSgnSW5zdGFudGlhdGlvbih0eXBlQXJndW1lbnRzPSR0eXBlQXJndW1lbnRzLGV4cHJlc3Npb249Jyk7CiAgICBleHByZXNzaW9uLl9jcmVhdGVTdHJ1Y3R1cmVkVGV4dChzYik7CiAgICBzYi53cml0ZSgnKScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHNJbkNvbnRleHQgPQogICAgICAgIHR5cGVBcmd1bWVudHMubWFwKGVudmlyb25tZW50LmdldFR5cGVJbkNvbnRleHQpLnRvTGlzdCgpOwogICAgcmV0dXJuIG5ldyBJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSgKICAgICAgICB0eXBlQXJndW1lbnRzSW5Db250ZXh0LCBleHByZXNzaW9uLmV2YWx1YXRlKGVudmlyb25tZW50KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX2NvbXB1dGVIYXNoQ29kZSgpIHsKICAgIHJldHVybiBIYXNoaW5nLm9iamVjdEhhc2goZXhwcmVzc2lvbiwgSGFzaGluZy5saXN0SGFzaCh0eXBlQXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gYXBwbHkoTm9ybWFsaXplZEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgSW5zdGFudGlhdGlvbkNvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICB0eXBlQXJndW1lbnRzLCBleHByZXNzaW9uLmFwcGx5KGFyZ3VtZW50cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKEluc3RhbnRpYXRpb25Db25zdGFudEV4cHJlc3Npb24gb3RoZXIpIHsKICAgIHJldHVybiBlcXVhbEVsZW1lbnRzKHR5cGVBcmd1bWVudHMsIG90aGVyLnR5cGVBcmd1bWVudHMpICYmCiAgICAgICAgZXhwcmVzc2lvbiA9PSBvdGhlci5leHByZXNzaW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IgdmlzaXRvciwgW2NvbnRleHRdKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEluc3RhbnRpYXRpb24odGhpcywgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1BvdGVudGlhbCB7CiAgICByZXR1cm4gZXhwcmVzc2lvbi5pc1BvdGVudGlhbDsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3I8UiwgQT4gewogIGNvbnN0IENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3IoKTsKCiAgUiB2aXNpdChDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnQsIEEgY29udGV4dCkgewogICAgcmV0dXJuIGNvbnN0YW50LmFjY2VwdCh0aGlzLCBjb250ZXh0KTsKICB9CgogIFIgdmlzaXRBcyhBc0NvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdEJvb2woQm9vbENvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdEludChJbnRDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXREb3VibGUoRG91YmxlQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgQSBjb250ZXh0KTsKICBSIHZpc2l0U3RyaW5nKFN0cmluZ0NvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdE51bGwoTnVsbENvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdExpc3QoTGlzdENvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdFNldChTZXRDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRNYXAoTWFwQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgQSBjb250ZXh0KTsKICBSIHZpc2l0Q29uc3RydWN0ZWQoQ29uc3RydWN0ZWRDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRDb25jYXRlbmF0ZShDb25jYXRlbmF0ZUNvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdFN5bWJvbChTeW1ib2xDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRUeXBlKFR5cGVDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRMb2NhbFZhcmlhYmxlKExvY2FsVmFyaWFibGVDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRGaWVsZChGaWVsZENvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdEZ1bmN0aW9uKEZ1bmN0aW9uQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgQSBjb250ZXh0KTsKICBSIHZpc2l0QmluYXJ5KEJpbmFyeUNvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdElkZW50aWNhbChJZGVudGljYWxDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRVbmFyeShVbmFyeUNvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdFN0cmluZ0xlbmd0aChTdHJpbmdMZW5ndGhDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRDb25kaXRpb25hbChDb25kaXRpb25hbENvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdEJvb2xGcm9tRW52aXJvbm1lbnQoCiAgICAgIEJvb2xGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24gZXhwLCBBIGNvbnRleHQpOwogIFIgdmlzaXRJbnRGcm9tRW52aXJvbm1lbnQoCiAgICAgIEludEZyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdFN0cmluZ0Zyb21FbnZpcm9ubWVudCgKICAgICAgU3RyaW5nRnJvbUVudmlyb25tZW50Q29uc3RhbnRFeHByZXNzaW9uIGV4cCwgQSBjb250ZXh0KTsKICBSIHZpc2l0QXNzZXJ0KEFzc2VydENvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdEluc3RhbnRpYXRpb24oSW5zdGFudGlhdGlvbkNvbnN0YW50RXhwcmVzc2lvbiBleHAsIEEgY29udGV4dCk7CgogIFIgdmlzaXRQb3NpdGlvbmFsKFBvc2l0aW9uYWxBcmd1bWVudFJlZmVyZW5jZSBleHAsIEEgY29udGV4dCk7CiAgUiB2aXNpdE5hbWVkKE5hbWVkQXJndW1lbnRSZWZlcmVuY2UgZXhwLCBBIGNvbnRleHQpOwp9CgpjbGFzcyBDb25zdEV4cFByaW50ZXIgZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb25WaXNpdG9yIHsKICBmaW5hbCBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgogIHZvaWQgd3JpdGUoQ29uc3RhbnRFeHByZXNzaW9uIHBhcmVudCwgQ29uc3RhbnRFeHByZXNzaW9uIGNoaWxkLAogICAgICB7Ym9vbCBsZWZ0QXNzb2NpYXRpdmU6IHRydWV9KSB7CiAgICBpZiAoY2hpbGQucHJlY2VkZW5jZSA8IHBhcmVudC5wcmVjZWRlbmNlIHx8CiAgICAgICAgIWxlZnRBc3NvY2lhdGl2ZSAmJiBjaGlsZC5wcmVjZWRlbmNlID09IHBhcmVudC5wcmVjZWRlbmNlKSB7CiAgICAgIHNiLndyaXRlKCcoJyk7CiAgICAgIGNoaWxkLmFjY2VwdCh0aGlzKTsKICAgICAgc2Iud3JpdGUoJyknKTsKICAgIH0gZWxzZSB7CiAgICAgIGNoaWxkLmFjY2VwdCh0aGlzKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVUeXBlQXJndW1lbnRzKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUudHJlYXRBc1JhdykgcmV0dXJuOwogICAgc2Iud3JpdGUoJzwnKTsKICAgIGJvb2wgbmVlZHNDb21tYSA9IGZhbHNlOwogICAgZm9yIChEYXJ0VHlwZSB2YWx1ZSBpbiB0eXBlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICBzYi53cml0ZSgnLCAnKTsKICAgICAgfQogICAgICBzYi53cml0ZSh2YWx1ZSk7CiAgICAgIG5lZWRzQ29tbWEgPSB0cnVlOwogICAgfQogICAgc2Iud3JpdGUoJz4nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXQoQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50LCBbX10pIHsKICAgIHJldHVybiBjb25zdGFudC5hY2NlcHQodGhpcywgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXMoQXNDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHZpc2l0KGV4cC5leHByZXNzaW9uKTsKICAgIHNiLndyaXRlKCcgYXMgJyk7CiAgICBzYi53cml0ZShleHAudHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm9vbChCb29sQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZShleHAuYm9vbFZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREb3VibGUoRG91YmxlQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZShleHAuZG91YmxlVmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludChJbnRDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHNiLndyaXRlKGV4cC5pbnRWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TnVsbChOdWxsQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZShudWxsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmcoU3RyaW5nQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBFbnN1cmUgY29ycmVjdCBlc2NhcGluZy4KICAgIHNiLndyaXRlKCciJHtleHAuc3RyaW5nVmFsdWV9IicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpc3QoTGlzdENvbnN0YW50RXhwcmVzc2lvbiBleHAsIFtfXSkgewogICAgc2Iud3JpdGUoJ2NvbnN0ICcpOwogICAgd3JpdGVUeXBlQXJndW1lbnRzKGV4cC50eXBlKTsKICAgIHNiLndyaXRlKCdbJyk7CiAgICBib29sIG5lZWRzQ29tbWEgPSBmYWxzZTsKICAgIGZvciAoQ29uc3RhbnRFeHByZXNzaW9uIHZhbHVlIGluIGV4cC52YWx1ZXMpIHsKICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICBzYi53cml0ZSgnLCAnKTsKICAgICAgfQogICAgICB2aXNpdCh2YWx1ZSk7CiAgICAgIG5lZWRzQ29tbWEgPSB0cnVlOwogICAgfQogICAgc2Iud3JpdGUoJ10nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTZXQoU2V0Q29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZSgnY29uc3QgJyk7CiAgICB3cml0ZVR5cGVBcmd1bWVudHMoZXhwLnR5cGUpOwogICAgc2Iud3JpdGUoJ3snKTsKICAgIHNiLndyaXRlQWxsKGV4cC52YWx1ZXMsICcsICcpOwogICAgc2Iud3JpdGUoJ30nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXAoTWFwQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZSgnY29uc3QgJyk7CiAgICB3cml0ZVR5cGVBcmd1bWVudHMoZXhwLnR5cGUpOwogICAgc2Iud3JpdGUoJ3snKTsKICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBleHAua2V5cy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgaWYgKGluZGV4ID4gMCkgewogICAgICAgIHNiLndyaXRlKCcsICcpOwogICAgICB9CiAgICAgIHZpc2l0KGV4cC5rZXlzW2luZGV4XSk7CiAgICAgIHNiLndyaXRlKCc6ICcpOwogICAgICB2aXNpdChleHAudmFsdWVzW2luZGV4XSk7CiAgICB9CiAgICBzYi53cml0ZSgnfScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0cnVjdGVkKENvbnN0cnVjdGVkQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZSgnY29uc3QgJyk7CiAgICBzYi53cml0ZShleHAudGFyZ2V0LmVuY2xvc2luZ0NsYXNzLm5hbWUpOwogICAgd3JpdGVUeXBlQXJndW1lbnRzKGV4cC50eXBlKTsKICAgIGlmIChleHAudGFyZ2V0Lm5hbWUgIT0gJycpIHsKICAgICAgc2Iud3JpdGUoJy4nKTsKICAgICAgc2Iud3JpdGUoZXhwLnRhcmdldC5uYW1lKTsKICAgIH0KICAgIHNiLndyaXRlKCcoJyk7CiAgICBib29sIG5lZWRzQ29tbWEgPSBmYWxzZTsKCiAgICBpbnQgbmFtZWRPZmZzZXQgPSBleHAuY2FsbFN0cnVjdHVyZS5wb3NpdGlvbmFsQXJndW1lbnRDb3VudDsKICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBuYW1lZE9mZnNldDsgaW5kZXgrKykgewogICAgICBpZiAobmVlZHNDb21tYSkgewogICAgICAgIHNiLndyaXRlKCcsICcpOwogICAgICB9CiAgICAgIHZpc2l0KGV4cC5hcmd1bWVudHNbaW5kZXhdKTsKICAgICAgbmVlZHNDb21tYSA9IHRydWU7CiAgICB9CiAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZXhwLmNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudENvdW50OyBpbmRleCsrKSB7CiAgICAgIGlmIChuZWVkc0NvbW1hKSB7CiAgICAgICAgc2Iud3JpdGUoJywgJyk7CiAgICAgIH0KICAgICAgc2Iud3JpdGUoZXhwLmNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudHNbaW5kZXhdKTsKICAgICAgc2Iud3JpdGUoJzogJyk7CiAgICAgIHZpc2l0KGV4cC5hcmd1bWVudHNbbmFtZWRPZmZzZXQgKyBpbmRleF0pOwogICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKICAgIH0KICAgIHNiLndyaXRlKCcpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uY2F0ZW5hdGUoQ29uY2F0ZW5hdGVDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHNiLndyaXRlKCciJyk7CiAgICBmb3IgKENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGV4cC5leHByZXNzaW9ucykgewogICAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IENvbnN0YW50RXhwcmVzc2lvbktpbmQuU1RSSU5HKSB7CiAgICAgICAgU3RyaW5nQ29uc3RhbnRFeHByZXNzaW9uIHN0cmluZyA9IGV4cHJlc3Npb247CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRW5zdXJlIGNvcnJlY3QgZXNjYXBpbmcuCiAgICAgICAgc2Iud3JpdGUoJyR7c3RyaW5nLnN0cmluZ1ZhbHVlfScpOwogICAgICB9IGVsc2UgewogICAgICAgIHNiLndyaXRlKHIiJHsiKTsKICAgICAgICB2aXNpdChleHByZXNzaW9uKTsKICAgICAgICBzYi53cml0ZSgifSIpOwogICAgICB9CiAgICB9CiAgICBzYi53cml0ZSgnIicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN5bWJvbChTeW1ib2xDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHNiLndyaXRlKCcjJyk7CiAgICBzYi53cml0ZShleHAubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZShUeXBlQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZShleHAubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RmllbGQoRmllbGRDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIGlmIChleHAuZWxlbWVudC5pc1N0YXRpYykgewogICAgICBzYi53cml0ZShleHAuZWxlbWVudC5lbmNsb3NpbmdDbGFzcy5uYW1lKTsKICAgICAgc2Iud3JpdGUoJy4nKTsKICAgIH0KICAgIHNiLndyaXRlKGV4cC5lbGVtZW50Lm5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExvY2FsVmFyaWFibGUoTG9jYWxWYXJpYWJsZUNvbnN0YW50RXhwcmVzc2lvbiBleHAsIFtfXSkgewogICAgc2Iud3JpdGUoZXhwLmVsZW1lbnQubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb24oRnVuY3Rpb25Db25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIGlmIChleHAuZWxlbWVudC5pc1N0YXRpYykgewogICAgICBzYi53cml0ZShleHAuZWxlbWVudC5lbmNsb3NpbmdDbGFzcy5uYW1lKTsKICAgICAgc2Iud3JpdGUoJy4nKTsKICAgIH0KICAgIHNiLndyaXRlKGV4cC5lbGVtZW50Lm5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJpbmFyeShCaW5hcnlDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHdyaXRlKGV4cCwgZXhwLmxlZnQpOwogICAgc2Iud3JpdGUoJyAnKTsKICAgIHNiLndyaXRlKGV4cC5vcGVyYXRvci5uYW1lKTsKICAgIHNiLndyaXRlKCcgJyk7CiAgICB3cml0ZShleHAsIGV4cC5yaWdodCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SWRlbnRpY2FsKElkZW50aWNhbENvbnN0YW50RXhwcmVzc2lvbiBleHAsIFtfXSkgewogICAgc2Iud3JpdGUoJ2lkZW50aWNhbCgnKTsKICAgIHZpc2l0KGV4cC5sZWZ0KTsKICAgIHNiLndyaXRlKCcsICcpOwogICAgdmlzaXQoZXhwLnJpZ2h0KTsKICAgIHNiLndyaXRlKCcpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VW5hcnkoVW5hcnlDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHNiLndyaXRlKGV4cC5vcGVyYXRvcik7CiAgICB3cml0ZShleHAsIGV4cC5leHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdMZW5ndGgoU3RyaW5nTGVuZ3RoQ29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICB3cml0ZShleHAsIGV4cC5leHByZXNzaW9uLCBsZWZ0QXNzb2NpYXRpdmU6IGZhbHNlKTsKICAgIHNiLndyaXRlKCcubGVuZ3RoJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uZGl0aW9uYWwoQ29uZGl0aW9uYWxDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHdyaXRlKGV4cCwgZXhwLmNvbmRpdGlvbiwgbGVmdEFzc29jaWF0aXZlOiBmYWxzZSk7CiAgICBzYi53cml0ZSgnID8gJyk7CiAgICB3cml0ZShleHAsIGV4cC50cnVlRXhwKTsKICAgIHNiLndyaXRlKCcgOiAnKTsKICAgIHdyaXRlKGV4cCwgZXhwLmZhbHNlRXhwKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQb3NpdGlvbmFsKFBvc2l0aW9uYWxBcmd1bWVudFJlZmVyZW5jZSBleHAsIFtfXSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWF5YmUgdGhpcyBzaG91bGQgdGhyb3cuCiAgICBzYi53cml0ZSgnYXJnc1ske2V4cC5pbmRleH1dJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmFtZWQoTmFtZWRBcmd1bWVudFJlZmVyZW5jZSBleHAsIFtfXSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWF5YmUgdGhpcyBzaG91bGQgdGhyb3cuCiAgICBzYi53cml0ZSgnYXJnc1ske2V4cC5uYW1lfV0nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb29sRnJvbUVudmlyb25tZW50KEJvb2xGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24gZXhwLAogICAgICBbX10pIHsKICAgIHNiLndyaXRlKCdjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgnKTsKICAgIHZpc2l0KGV4cC5uYW1lKTsKICAgIGlmIChleHAuZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJywgZGVmYXVsdFZhbHVlOiAnKTsKICAgICAgdmlzaXQoZXhwLmRlZmF1bHRWYWx1ZSk7CiAgICB9CiAgICBzYi53cml0ZSgnKScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludEZyb21FbnZpcm9ubWVudChJbnRGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHNiLndyaXRlKCdjb25zdCBpbnQuZnJvbUVudmlyb25tZW50KCcpOwogICAgdmlzaXQoZXhwLm5hbWUpOwogICAgaWYgKGV4cC5kZWZhdWx0VmFsdWUgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgnLCBkZWZhdWx0VmFsdWU6ICcpOwogICAgICB2aXNpdChleHAuZGVmYXVsdFZhbHVlKTsKICAgIH0KICAgIHNiLndyaXRlKCcpJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nRnJvbUVudmlyb25tZW50KFN0cmluZ0Zyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbiBleHAsCiAgICAgIFtfXSkgewogICAgc2Iud3JpdGUoJ2NvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnQoJyk7CiAgICB2aXNpdChleHAubmFtZSk7CiAgICBpZiAoZXhwLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCcsIGRlZmF1bHRWYWx1ZTogJyk7CiAgICAgIHZpc2l0KGV4cC5kZWZhdWx0VmFsdWUpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBc3NlcnQoQXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uIGV4cCwgW19dKSB7CiAgICBzYi53cml0ZSgnYXNzZXJ0KCcpOwogICAgdmlzaXQoZXhwLmNvbmRpdGlvbik7CiAgICBpZiAoZXhwLm1lc3NhZ2UgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgnLCAnKTsKICAgICAgdmlzaXQoZXhwLm1lc3NhZ2UpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnN0YW50aWF0aW9uKEluc3RhbnRpYXRpb25Db25zdGFudEV4cHJlc3Npb24gZXhwLCBbX10pIHsKICAgIHNiLndyaXRlKCc8Jyk7CiAgICBzYi53cml0ZShleHAudHlwZUFyZ3VtZW50cy5qb2luKCcsICcpKTsKICAgIHNiLndyaXRlKCc+KCcpOwogICAgdmlzaXQoZXhwLmV4cHJlc3Npb24pOwogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IHNiLnRvU3RyaW5nKCk7Cn0KijgATk48AScBGgEZIj8kJSE9HBwaFgEeBgoIGQ8PDwoNDAkNBxgIBwcIChsRCggJEhgTChECATMEPksERFFPRSQRASMBUBMcATgBMUMBTz0BUBpAAU0YNRUfBAFEHiofGgQBNi8BGgEMOAE0AQwcLTQqMhsEAQwWPjwqGQQBTkEGSExOEB8BT00UUSECATY/DEcBDDklBAEMPkAjBAEMMB0EAQwgAQw7AgEeOhgBKgEMQgEMOS0EAQwwKgQBDD4yBAEMNQEMLykEAQw/HwIBHjkZASgBDEEBDDksBAEMMCgEAQw+MAQBDDQBDC4nBAEMPx4CAR08HAEuAQxEAQw5LwQBDDAuBAEMPjYEAQw3AQwxLQQBDD8hAgEdPBwBLgEMRAEMOS8EAQwwLgQBDD42BAEMNwEMMS0EAQw/IQIBGzocAQxCAQw5LQQBDDAYBAEMPikEAQwgAQw2AQw/HwIBGzocKQEyAQxCAQw5LQQBDDAqGy8bJxcGFAQBDD4nRAQBDDwnPwQBDBs8LycGFQQBDC8qPC42BhEEAQxAAQwgAQw8AgEaORwpATEBDEEBDDksBAEMPSFBAQw+TkEuPTwdTQgGASY5BAEMQAEMMCkbLxsnFwYUBAEMUAEMLio8LjYGEQQBDCABDDwCARo5HCcpATwBDEEBDDksBAEMMCo4FxcILRYvBhQEAQw+SSxQLjsfKQo/ISkKJFEKGghJMwgEAQw8Jg42OQQBDBs8LycGFQQBDC4qPC4yNgYRBAEMQAEMIAEMGU8EAgEnQRwiJSwBIUQzJwQBDEkBDDk0BAEMMDs1GzIbJxcGFAQBSC40KEw0MAQBSRcoMQQBDEdKQQQBDD5DRkQiJwglNCocRj4QGzBLICYRJQoKTDslCggfSA8nCAgEAQwbE1EyJwYVBAEMNiouPDE8BhEEAQwgAQwZMAQCAT1BLgEzAQxJAQw5NAQBDDArGzQbJxcGFAQBDDwuPgQBDD4ZKjk+HxlPLhIIHywnMCQzJzElMRoKDyFLIjwMGU8uEggGEzoGIwQBDBssNCcGFQQBDDZGM0AGEQQBDD8hAQwZMgQCARQ8FQEnAQxEAQw5LwQBDDAkBAEMMAEMMR8EAQw+SwQBDD8hAgESOjMXFQExRTEEAQxCAQw5LQQBDDAiBAEMPkkEAQwwAQwvHwQBDD8fAgFJDDgnFwE0AQxAAQw5KwQBDDAbKh4EAQw+JQcYGEcNJSwNJgc/ASRGATkBJR49AUBBAUoXJD1IM01PJQYcBAEMPEgEAQxLAQwtQQQBDD8vAgE3Ox0BKQEMQwEMOS4EAQwwKQQBDD4zSy0IBAEMMwEMMCUEAgEsQxcBMQEMTAEMOTYEAQwwMQQBDD5JKwQBDDMBDDglBAIBMT4gGwE3AQxGAQw5MQQBDDAsBAEMPjUEAQwzAQwzJQQBDD8jAgEvPCEhIgFDMkIEATwtAQxEAQw5LwQBDDAeJCYlEwQBDD46Ph4qHSs1MRE0Cg8BKjQwETQKDw8yBgE/GR0iJiYkJUwgRSMQHQwKJyMlTSFGIxAdDAoPIyImJUchRRAdDCYjJUQhRRAdDColJUYgRBAdDCciJUMgRBAdDBEWSyJHJEgOGwoPIyMjJCMkIiQiIBZRHkMhDhsKISNFH0QhDhsKFzk8I01HHQwKDyMjJCMiIyAWUR5DIQ4bCiEjRR9EIQ4bChc4Oz0vLk9HHQwKDyshFlEeQyEOGwoiI0UfRCEOGwoPKiEWUB5DIQ4bCiIWUR9EIQ4bCg8lTxkPJ0MPBhMfKCVBIhEwJiwfGgwWTwgGIwQBDDwpQgQBDBw+QEIdIiYrKiIiJCQoIzo/LD44KQo9OiojIyM3OCkKPToqIyokJyMiIyMjJCcnJSQ/BgQBDDcBDBtOBAEMMSkeHgQBDBkyBAFFHiInJh8gHiAgISAgICAhHh4gICAjIQUCATw/ISIBNgEMRwEMOTIEAQwwISQZJRMEAQw+Ojw5QwYjBAEMPCw4BAEMHAEMGzUEAQw0NwQBDD8fAQwZMgQCASs7ICcBPDMEAQxDAQw5LgQBDDAwKhMEAQw+RhkdIicWUCRJIQ4bCg8lJiNGJEkhDhsKDykmI0okSSEOGwoPBhMcRxsWCAYjBAEMPE8EAQw3AQwbPgQBDDBJBAEMOTQEAQwZIwQBRB8mIgUCATlCJwEzAQxLAQw5NQQBDDAqKhMEAQw+PBsfSSA6CiUNLx1HBgQBDDxMBAEMHAEMGyUEAQw3KwQBDD8eAQwZIwQCAThBJiQlAU4BDEkBDDk0BAEMMCgpGCcZKBMEAQw8ST4EAQwbAQwbJSAgBAEMNiskJAQBDD5EPT8ZIh9GH0MKFwYTIxorGwgGIwQBDDk+QCEXBhEEAQwZUQQCASk/EwErAQwkOAQBDDkzBAEMMCoEAQw8MwQBDDEBDEsBDD4jBAEMIAIBJjoVASUBDCQzBAEMOS4EAQwwIwQBDDwtBAEMMAEMRAEMPiMEAQwgAgFOISkBQwFEOh8fQho+ChQGEQQBDBs8BAEMOkUEAQwYEgQBDBkfPAQCAS0sMClAIwEMJDkEAQw5PAQBDDAsJCAgLg0YBhMEAQw+QiggQQ1ABk0lBhNJIEouTCRLDBkIBhNHFFAcMSQyDyUIBiMEAQw8TEYEAQw/HwIBLCswKEAjAQwkOAQBDDk7BAEMMCskICAuDRgGEwQBDD5CKCBBDTsGTSUGE0kgSS5LJEsMGQgGE0cUUBQaJwgbJQ8xCAYjBAEMPEtGBAEMPx4CAS8uMCtAIwEMJDsEAQw5PgQBDDAuJCAgLg0YBhMEAQw+QiggQQ07Bk0lBhNJIEwuTiRLDBkIBhNHFFAaJQ8zCAYjBAEMPE5GBAEMPyECATwmJAE6AQxEAQwxRQQBDBs8BAEMMBkpGxspDRgGEwQBDD5EFigdFEsNGgYYHT0sMChMEUo2QwoPSDQIJQYBSyQEAQw5LwQBDDwpQAQCAUMmJwFIAQxLAQwwSCoTBAEMPixCK0MEAQwbTAQBDDwwNQQBDDhAKAQBDDk2BAEMGSMEAgExJQE0KwQBMjY0Ojo2NjQ0REQ6Nkg4PjpAOEZEHj0dPCA/OkgBQTcCATouAUImMEUVGhUNGgYEATAhEx0xGBgIFxkGEwQBDDEoBAEMMBsWGAQBDDQdBAEMOB8EAQwyHAQBDDQUBAEMODUmBAEMNBgiEx0zGBgIFBkGEwQBDDIYIhMjEwQBDDIYIhM8FxgIHhYgBhMEAQxCGC4iIRUhBhMdAUE4GBgIIxkGURgYCDkWMRkGEwQBDEITPT42OSsPGRsXCAYTBAEMOBMYBAEMNBgEAQw2IDEVBiAEAQxGIAQBDDwgMRUGIAQBDDgaEyETGwQBDD4cFRQWEwQBDDYcIAQBDEQ4GQQBDEI3FR0VHgQBDD81JAQBDDU1IwQBDEsNLRUkJB8GEwQBDFAsFSQkHwYTBAEMTw0vFSQkHwYTBAEMOBkaHxYaBhMEAQxGEywUGxMEAQwmAgEvcGFja2FnZTpjb21waWxlci9zcmMvY29uc3RhbnRzL2V4cHJlc3Npb25zLmRhcnQxc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaW8vY29kZV9vdXRwdXQuZGFydJvQLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5jb2RlX291dHB1dDsKCmltcG9ydCAnLi4vLi4vY29tcGlsZXJfbmV3LmRhcnQnOwppbXBvcnQgJ3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKCi8vLyBMaXN0ZW5lciBpbnRlcmZhY2UgZm9yIFtDb2RlT3V0cHV0XSBhY3Rpdml0eS4KYWJzdHJhY3QgY2xhc3MgQ29kZU91dHB1dExpc3RlbmVyIHsKICAvLy8gQ2FsbGVkIHdoZW4gW3RleHRdIGlzIGFkZGVkIHRvIHRoZSBvdXRwdXQuCiAgdm9pZCBvblRleHQoU3RyaW5nIHRleHQpOwoKICAvLy8gQ2FsbGVkIHdoZW4gdGhlIG91dHB1dCBpcyBjbG9zZWQgd2l0aCBhIGZpbmFsIGxlbmd0aCBvZiBbbGVuZ3RoXS4KICB2b2lkIG9uRG9uZShpbnQgbGVuZ3RoKTsKfQoKLy8vIEludGVyZmFjZSBmb3IgYSBtYXBwaW5nIG9mIHRhcmdldCBvZmZzZXRzIHRvIHNvdXJjZSBsb2NhdGlvbnMgYW5kIGZvcgovLy8gdHJhY2tpbmcgaW5saW5pbmcgZnJhbWUgZGF0YS4KLy8vCi8vLyBTb3VyY2UtbG9jYXRpb24gbWFwcGluZyBpcyB1c2VkIHRvIGJ1aWxkIHN0YW5kYXJkIHNvdXJjZS1tYXBzIGZpbGVzLgovLy8gSW5saW5pbmcgZnJhbWVzIGlzIHVzZWQgdG8gYXR0YWNoIGFuIGV4dGVuc2lvbiB0byBzb3VyY2UtbWFwIGZpbGVzIHRvCi8vLyBpbXByb3ZlIGRlb2JmdXNjYXRpb24gb2YgcHJvZHVjdGlvbiBzdGFjayB0cmFjZXMuCmFic3RyYWN0IGNsYXNzIFNvdXJjZUxvY2F0aW9ucyB7CiAgLy8vIFRoZSBuYW1lIGlkZW50aWZ5aW5nIHRoaXMgc291cmNlIG1hcHBpbmcuCiAgU3RyaW5nIGdldCBuYW1lOwoKICAvLy8gQWRkcyBhIFtzb3VyY2VMb2NhdGlvbl0gYXQgdGhlIHNwZWNpZmllZCBbdGFyZ2V0T2Zmc2V0XS4KICB2b2lkIGFkZFNvdXJjZUxvY2F0aW9uKGludCB0YXJnZXRPZmZzZXQsIFNvdXJjZUxvY2F0aW9uIHNvdXJjZVBvc2l0aW9uKTsKCiAgLy8vIFJlY29yZCBhbiBpbmxpbmluZyBjYWxsIGF0IHRoZSBbdGFyZ2V0T2Zmc2V0XS4KICAvLy8KICAvLy8gVGhlIGlubGluaW5nIGNhbGwtc2l0ZSB3YXMgbWFkZSBmcm9tIFtwdXNoTG9jYXRpb25dIGFuZCBjYWxscwogIC8vLyBbaW5saW5lZE1ldGhvZE5hbWVdLgogIHZvaWQgYWRkUHVzaCgKICAgICAgaW50IHRhcmdldE9mZnNldCwgU291cmNlTG9jYXRpb24gcHVzaFBvc2l0aW9uLCBTdHJpbmcgaW5saW5lZE1ldGhvZE5hbWUpOwoKICAvLy8gUmVjb3JkIGEgcmV0dXJuIG9mIGFuIGlubGluaW5nIGNhbGwgYXQgdGhlIFt0YXJnZXRPZmZzZXRdLgogIC8vLwogIC8vLyBbaXNFbXB0eV0gaW5kaWNhdGVzIHRoYXQgdGhpcyByZXR1cm4gYWxzbyBtYWtlcyB0aGUgaW5saW5pbmcgc3RhY2sgZW1wdHkuCiAgdm9pZCBhZGRQb3AoaW50IHRhcmdldE9mZnNldCwgYm9vbCBpc0VtcHR5KTsKCiAgLy8vIEFwcGxpZXMgW2ZdIHRvIGV2ZXJ5IHRhcmdldCBvZmZzZXQgYW5kIGFzc29jaWF0ZWQgc291cmNlIGxvY2F0aW9uLgogIHZvaWQgZm9yRWFjaFNvdXJjZUxvY2F0aW9uKAogICAgICB2b2lkIGYoaW50IHRhcmdldE9mZnNldCwgU291cmNlTG9jYXRpb24gc291cmNlTG9jYXRpb24pKTsKCiAgLy8vIFJlY29yZGVkIGlubGluaW5nIGRhdGEgcGVyIHRhcmdldC1vZmZzZXQuCiAgTWFwPGludCwgTGlzdDxGcmFtZUVudHJ5Pj4gZ2V0IGZyYW1lTWFya2VyczsKfQoKY2xhc3MgX1NvdXJjZUxvY2F0aW9uc0ltcGwgaW1wbGVtZW50cyBTb3VyY2VMb2NhdGlvbnMgewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIEFic3RyYWN0Q29kZU91dHB1dCBjb2RlT3V0cHV0OwogIE1hcDxpbnQsIExpc3Q8U291cmNlTG9jYXRpb24+PiBtYXJrZXJzID0gPGludCwgTGlzdDxTb3VyY2VMb2NhdGlvbj4+e307CiAgQG92ZXJyaWRlCiAgTWFwPGludCwgTGlzdDxGcmFtZUVudHJ5Pj4gZnJhbWVNYXJrZXJzID0gPGludCwgTGlzdDxGcmFtZUVudHJ5Pj57fTsKCiAgX1NvdXJjZUxvY2F0aW9uc0ltcGwodGhpcy5uYW1lLCB0aGlzLmNvZGVPdXRwdXQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFNvdXJjZUxvY2F0aW9uKGludCB0YXJnZXRPZmZzZXQsIFNvdXJjZUxvY2F0aW9uIHNvdXJjZUxvY2F0aW9uKSB7CiAgICBhc3NlcnQodGFyZ2V0T2Zmc2V0IDw9IGNvZGVPdXRwdXQubGVuZ3RoKTsKICAgIExpc3Q8U291cmNlTG9jYXRpb24+IHNvdXJjZUxvY2F0aW9ucyA9CiAgICAgICAgbWFya2Vycy5wdXRJZkFic2VudCh0YXJnZXRPZmZzZXQsICgpID0+IDxTb3VyY2VMb2NhdGlvbj5bXSk7CiAgICBzb3VyY2VMb2NhdGlvbnMuYWRkKHNvdXJjZUxvY2F0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkUHVzaChpbnQgdGFyZ2V0T2Zmc2V0LCBTb3VyY2VMb2NhdGlvbiBzb3VyY2VMb2NhdGlvbiwKICAgICAgU3RyaW5nIGlubGluZWRNZXRob2ROYW1lKSB7CiAgICBhc3NlcnQodGFyZ2V0T2Zmc2V0IDw9IGNvZGVPdXRwdXQubGVuZ3RoKTsKICAgIExpc3Q8RnJhbWVFbnRyeT4gZnJhbWVzID0gZnJhbWVNYXJrZXJzW3RhcmdldE9mZnNldF0gPz89IFtdOwogICAgZnJhbWVzLmFkZChuZXcgRnJhbWVFbnRyeS5wdXNoKHNvdXJjZUxvY2F0aW9uLCBpbmxpbmVkTWV0aG9kTmFtZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRQb3AoaW50IHRhcmdldE9mZnNldCwgYm9vbCBpc0VtcHR5KSB7CiAgICBhc3NlcnQodGFyZ2V0T2Zmc2V0IDw9IGNvZGVPdXRwdXQubGVuZ3RoKTsKICAgIExpc3Q8RnJhbWVFbnRyeT4gZnJhbWVzID0gZnJhbWVNYXJrZXJzW3RhcmdldE9mZnNldF0gPz89IFtdOwogICAgZnJhbWVzLmFkZChuZXcgRnJhbWVFbnRyeS5wb3AoaXNFbXB0eSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoU291cmNlTG9jYXRpb24oCiAgICAgIHZvaWQgZihpbnQgdGFyZ2V0T2Zmc2V0LCBTb3VyY2VMb2NhdGlvbiBzb3VyY2VMb2NhdGlvbikpIHsKICAgIG1hcmtlcnMuZm9yRWFjaCgoaW50IHRhcmdldE9mZnNldCwgTGlzdDxTb3VyY2VMb2NhdGlvbj4gc291cmNlTG9jYXRpb25zKSB7CiAgICAgIGZvciAoU291cmNlTG9jYXRpb24gc291cmNlTG9jYXRpb24gaW4gc291cmNlTG9jYXRpb25zKSB7CiAgICAgICAgZih0YXJnZXRPZmZzZXQsIHNvdXJjZUxvY2F0aW9uKTsKICAgICAgfQogICAgfSk7CiAgfQoKICB2b2lkIF9tZXJnZShfU291cmNlTG9jYXRpb25zSW1wbCBvdGhlcikgewogICAgYXNzZXJ0KG5hbWUgPT0gb3RoZXIubmFtZSk7CiAgICBpbnQgbGVuZ3RoID0gY29kZU91dHB1dC5sZW5ndGg7CiAgICBpZiAob3RoZXIubWFya2Vycy5sZW5ndGggPiAwKSB7CiAgICAgIG90aGVyLm1hcmtlcnMKICAgICAgICAgIC5mb3JFYWNoKChpbnQgdGFyZ2V0T2Zmc2V0LCBMaXN0PFNvdXJjZUxvY2F0aW9uPiBzb3VyY2VMb2NhdGlvbnMpIHsKICAgICAgICAobWFya2Vyc1tsZW5ndGggKyB0YXJnZXRPZmZzZXRdID8/PSA8U291cmNlTG9jYXRpb24+W10pCiAgICAgICAgICAgIC5hZGRBbGwoc291cmNlTG9jYXRpb25zKTsKICAgICAgfSk7CiAgICB9CgogICAgaWYgKG90aGVyLmZyYW1lTWFya2Vycy5sZW5ndGggPiAwKSB7CiAgICAgIG90aGVyLmZyYW1lTWFya2Vycy5mb3JFYWNoKChpbnQgdGFyZ2V0T2Zmc2V0LCBMaXN0PEZyYW1lRW50cnk+IGZyYW1lcykgewogICAgICAgIChmcmFtZU1hcmtlcnNbbGVuZ3RoICsgdGFyZ2V0T2Zmc2V0XSA/Pz0gPEZyYW1lRW50cnk+W10pLmFkZEFsbChmcmFtZXMpOwogICAgICB9KTsKICAgIH0KICB9Cn0KCmFic3RyYWN0IGNsYXNzIFNvdXJjZUxvY2F0aW9uc1Byb3ZpZGVyIHsKICAvLy8gQ3JlYXRlcyBhIFtTb3VyY2VMb2NhdGlvbnNdIG1hcHBpbmcgaWRlbnRpZmllZCBieSBbbmFtZV0gYW5kIGFzc29jaWF0ZXMKICAvLy8gaXQgd2l0aCB0aGlzIGNvZGUgb3V0cHV0LgogIFNvdXJjZUxvY2F0aW9ucyBjcmVhdGVTb3VyY2VMb2NhdGlvbnMoU3RyaW5nIG5hbWUpOwoKICAvLy8gUmV0dXJucyB0aGUgc291cmNlIGxvY2F0aW9uIG1hcHBpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvZGUgb3V0cHV0LgogIEl0ZXJhYmxlPFNvdXJjZUxvY2F0aW9ucz4gZ2V0IHNvdXJjZUxvY2F0aW9uczsKfQoKYWJzdHJhY3QgY2xhc3MgQ29kZU91dHB1dCBpbXBsZW1lbnRzIFNvdXJjZUxvY2F0aW9uc1Byb3ZpZGVyIHsKICAvLy8gV3JpdGUgW3RleHRdIHRvIHRoaXMgb3V0cHV0LgogIC8vLwogIC8vLyBJZiB0aGUgb3V0cHV0IGlzIGNsb3NlZCwgYSBbU3RhdGVFcnJvcl0gaXMgdGhyb3duLgogIHZvaWQgYWRkKFN0cmluZyB0ZXh0KTsKCiAgLy8vIEFkZHMgdGhlIGNvbnRlbnQgb2YgW2J1ZmZlcl0gdG8gdGhlIG91dHB1dCBhbmQgYWRkcyBpdHMgbWFya2VycyB0bwogIC8vLyBbbWFya2Vyc10uCiAgLy8vCiAgLy8vIElmIHRoZSBvdXRwdXQgaXMgY2xvc2VkLCBhIFtTdGF0ZUVycm9yXSBpcyB0aHJvd24uCiAgdm9pZCBhZGRCdWZmZXIoQ29kZUJ1ZmZlciBidWZmZXIpOwoKICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY3VycmVudGx5IHdyaXR0ZW4gdG8gdGhpcyBvdXRwdXQuCiAgaW50IGdldCBsZW5ndGg7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIG91dHB1dCBoYXMgYmVlbiBjbG9zZWQuCiAgYm9vbCBnZXQgaXNDbG9zZWQ7CgogIC8vLyBDbG9zZXMgdGhlIG91dHB1dC4gRnVydGhlciB3cml0ZXMgd2lsbCBjYXVzZSBhIFtTdGF0ZUVycm9yXS4KICB2b2lkIGNsb3NlKCk7Cn0KCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29kZU91dHB1dCBleHRlbmRzIENvZGVPdXRwdXQgewogIE1hcDxTdHJpbmcsIF9Tb3VyY2VMb2NhdGlvbnNJbXBsPiBzb3VyY2VMb2NhdGlvbnNNYXAgPQogICAgICA8U3RyaW5nLCBfU291cmNlTG9jYXRpb25zSW1wbD57fTsKICBAb3ZlcnJpZGUKICBib29sIGlzQ2xvc2VkID0gZmFsc2U7CgogIHZvaWQgX2FkZEludGVybmFsKFN0cmluZyB0ZXh0KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGQoU3RyaW5nIHRleHQpIHsKICAgIGlmIChpc0Nsb3NlZCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiQ29kZSBvdXRwdXQgaXMgY2xvc2VkLiBUcnlpbmcgdG8gd3JpdGUgJyR0ZXh0Jy4iKTsKICAgIH0KICAgIF9hZGRJbnRlcm5hbCh0ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkQnVmZmVyKENvZGVCdWZmZXIgb3RoZXIpIHsKICAgIG90aGVyLnNvdXJjZUxvY2F0aW9uc01hcC5mb3JFYWNoKChTdHJpbmcgbmFtZSwgX1NvdXJjZUxvY2F0aW9uc0ltcGwgb3RoZXIpIHsKICAgICAgY3JlYXRlU291cmNlTG9jYXRpb25zKG5hbWUpLl9tZXJnZShvdGhlcik7CiAgICB9KTsKICAgIGlmICghb3RoZXIuaXNDbG9zZWQpIHsKICAgICAgb3RoZXIuY2xvc2UoKTsKICAgIH0KICAgIF9hZGRJbnRlcm5hbChvdGhlci5nZXRUZXh0KCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHsKICAgIGlmIChpc0Nsb3NlZCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiQ29kZSBvdXRwdXQgaXMgYWxyZWFkeSBjbG9zZWQuIik7CiAgICB9CiAgICBpc0Nsb3NlZCA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxTb3VyY2VMb2NhdGlvbnM+IGdldCBzb3VyY2VMb2NhdGlvbnMgPT4gc291cmNlTG9jYXRpb25zTWFwLnZhbHVlczsKCiAgQG92ZXJyaWRlCiAgX1NvdXJjZUxvY2F0aW9uc0ltcGwgY3JlYXRlU291cmNlTG9jYXRpb25zKFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gc291cmNlTG9jYXRpb25zTWFwW25hbWVdID8/PSBuZXcgX1NvdXJjZUxvY2F0aW9uc0ltcGwobmFtZSwgdGhpcyk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBCdWZmZXJlZENvZGVPdXRwdXQgewogIFN0cmluZyBnZXRUZXh0KCk7Cn0KCi8vLyBbQ29kZU91dHB1dF0gdXNpbmcgYSBbU3RyaW5nQnVmZmVyXSBhcyBiYWNrZW5kLgpjbGFzcyBDb2RlQnVmZmVyIGV4dGVuZHMgQWJzdHJhY3RDb2RlT3V0cHV0IGltcGxlbWVudHMgQnVmZmVyZWRDb2RlT3V0cHV0IHsKICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoKICBAb3ZlcnJpZGUKICB2b2lkIF9hZGRJbnRlcm5hbChTdHJpbmcgdGV4dCkgewogICAgYnVmZmVyLndyaXRlKHRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gYnVmZmVyLmxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldFRleHQoKSB7CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICB0aHJvdyAiRG9uJ3QgdXNlIENvZGVCdWZmZXIudG9TdHJpbmcoKSBzaW5jZSBpdCBkcm9wcyBzb3VyY2VtYXAgZGF0YS4iOwogIH0KfQoKLy8vIFtDb2RlT3V0cHV0XSB1c2luZyBhIFtDb21waWxhdGlvbk91dHB1dF0gYXMgYmFja2VuZC4KY2xhc3MgU3RyZWFtQ29kZU91dHB1dCBleHRlbmRzIEFic3RyYWN0Q29kZU91dHB1dCB7CiAgQG92ZXJyaWRlCiAgaW50IGxlbmd0aCA9IDA7CiAgZmluYWwgT3V0cHV0U2luayBvdXRwdXQ7CiAgZmluYWwgTGlzdDxDb2RlT3V0cHV0TGlzdGVuZXI+IF9saXN0ZW5lcnM7CgogIFN0cmVhbUNvZGVPdXRwdXQodGhpcy5vdXRwdXQsIFt0aGlzLl9saXN0ZW5lcnNdKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBfYWRkSW50ZXJuYWwoU3RyaW5nIHRleHQpIHsKICAgIG91dHB1dC5hZGQodGV4dCk7CiAgICBsZW5ndGggKz0gdGV4dC5sZW5ndGg7CiAgICBpZiAoX2xpc3RlbmVycyAhPSBudWxsKSB7CiAgICAgIF9saXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyLm9uVGV4dCh0ZXh0KSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsb3NlKCkgewogICAgb3V0cHV0LmNsb3NlKCk7CiAgICBzdXBlci5jbG9zZSgpOwogICAgaWYgKF9saXN0ZW5lcnMgIT0gbnVsbCkgewogICAgICBfbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lci5vbkRvbmUobGVuZ3RoKSk7CiAgICB9CiAgfQp9CoD0AE5OPAEdASIiATIkMRwBSBsCAUoiBElKNiEwEwE/SwE1BkQbEFABQQZQLwFJHkABMC8CATgMFSdKDEcBNAEMTC8rRSkEAQxAIi9BSAQBDDAvQS0EAQweQU8/KQgIBAEsICQkFE5AJgoGASlPUQoGBAIBKU4gNgFNMQIBPyMGORkBSREGOSUBSRIBNRUBQxACATc5KAwZASIBDBoUTwYYBAEMJVExCBsVBiMEAQwRFD4GFQQBDE4BDDxOBAIBJBQCATRMLAEMIxgEAQwjAQwVHgQBDBZMBAIBOTQMEhstATQBDCMWGx4/BgQBDBEUEx5BBgQCAShwYWNrYWdlOmNvbXBpbGVyL3NyYy9pby9jb2RlX291dHB1dC5kYXJ0NHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9zY2FubmVyL2ludGVybmVyLmRhcnSC4S8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovKioKICogVGhlIGludGVyZmFjZSBgSW50ZXJuZXJgIGRlZmluZXMgdGhlIGJlaGF2aW9yIG9mIG9iamVjdHMgdGhhdCBjYW4gaW50ZXJuCiAqIHN0cmluZ3MuCiAqLwphYnN0cmFjdCBjbGFzcyBJbnRlcm5lciB7CiAgLyoqCiAgICogUmV0dXJuIGEgc3RyaW5nIHRoYXQgaXMgaWRlbnRpY2FsIHRvIGFsbCBvZiB0aGUgb3RoZXIgc3RyaW5ncyB0aGF0IGhhdmUKICAgKiBiZWVuIGludGVybmVkIHRoYXQgYXJlIGVxdWFsIHRvIHRoZSBnaXZlbiBbc3RyaW5nXS4KICAgKi8KICBTdHJpbmcgaW50ZXJuKFN0cmluZyBzdHJpbmcpOwp9CgovKioKICogVGhlIGNsYXNzIGBOdWxsSW50ZXJuZXJgIGltcGxlbWVudHMgYW4gaW50ZXJuZXIgdGhhdCBkb2VzIG5vdGhpbmcgKGRvZXMgbm90CiAqIGFjdHVhbGx5IGludGVybiBhbnkgc3RyaW5ncykuCiAqLwpjbGFzcyBOdWxsSW50ZXJuZXIgaW1wbGVtZW50cyBJbnRlcm5lciB7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIGludGVybihTdHJpbmcgc3RyaW5nKSA9PiBzdHJpbmc7Cn0KGgBOTjwBBEwMBBoGTTkGIAIBBE8hBCkMKgIBK3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9zY2FubmVyL2ludGVybmVyLmRhcnRIc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9jbGFzc19oaWVyYXJjaHlfYnVpbGRlci5kYXJ0wAFepy8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmNsYXNzX2hpZXJhcmNoeV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzcywKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBGaWVsZCwKICAgICAgICBGdW5jdGlvbk5vZGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBNZW1iZXIsCiAgICAgICAgTmFtZSwKICAgICAgICBQcm9jZWR1cmUsCiAgICAgICAgUHJvY2VkdXJlS2luZCwKICAgICAgICBTdXBlcnR5cGUsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIHNob3cgU3Vic3RpdHV0aW9uOwoKaW1wb3J0ICcuLi9kaWxsL2RpbGxfbWVtYmVyX2J1aWxkZXIuZGFydCcgc2hvdyBEaWxsTWVtYmVyQnVpbGRlcjsKCmltcG9ydCAnLi4vbG9hZGVyLmRhcnQnIHNob3cgTG9hZGVyOwoKaW1wb3J0ICcuLi9tZXNzYWdlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZURlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlciwKICAgICAgICBtZXNzYWdlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2F1c2UsCiAgICAgICAgbWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdCwKICAgICAgICBtZXNzYWdlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UxLAogICAgICAgIG1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTIsCiAgICAgICAgbWVzc2FnZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3QsCiAgICAgICAgbWVzc2FnZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RDYXVzZSwKICAgICAgICB0ZW1wbGF0ZUNhbnRJbmZlclJldHVyblR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcywKICAgICAgICB0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcywKICAgICAgICB0ZW1wbGF0ZUNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlRmFpbGVkLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2UsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2UsCiAgICAgICAgdGVtcGxhdGVNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZSwKICAgICAgICB0ZW1wbGF0ZU1pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0OwoKaW1wb3J0ICcuLi9uYW1lcy5kYXJ0JyBzaG93IG5vU3VjaE1ldGhvZE5hbWU7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5oYW5kbGVkOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JyBzaG93IFNjb3BlOwoKaW1wb3J0ICcuLi9zb3VyY2Uvc291cmNlX2xvYWRlci5kYXJ0JyBzaG93IFNvdXJjZUxvYWRlcjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2Uvc3RhbmRhcmRfYm91bmRzLmRhcnQnIHNob3cgU3RhbmRhcmRCb3VuZHM7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfY29uc3RyYWludF9nYXRoZXJlci5kYXJ0JwogICAgc2hvdyBUeXBlQ29uc3RyYWludEdhdGhlcmVyOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnQnIHNob3cgTWl4aW5JbmZlcnJlcjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWEuZGFydCcgc2hvdyBVbmtub3duVHlwZTsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWFfZW52aXJvbm1lbnQuZGFydCcgc2hvdyBUeXBlQ29uc3RyYWludDsKCmltcG9ydCAnZm9yd2FyZGluZ19ub2RlLmRhcnQnIHNob3cgRm9yd2FyZGluZ05vZGU7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgRGVjbGFyYXRpb24sCiAgICAgICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciwKICAgICAgICBJbXBsaWNpdEZpZWxkVHlwZSwKICAgICAgICBDbGFzc0J1aWxkZXIsCiAgICAgICAgS2VybmVsRmllbGRCdWlsZGVyLAogICAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyLAogICAgICAgIE5hbWVkVHlwZUJ1aWxkZXIsCiAgICAgICAgUHJvY2VkdXJlQnVpbGRlciwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBNZW1iZXJCdWlsZGVyLAogICAgICAgIFR5cGVCdWlsZGVyLAogICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXI7CgppbXBvcnQgJ3R5cGVzLmRhcnQnIHNob3cgVHlwZXM7Cgpjb25zdCBEZWJ1Z0xvZ2dlciBkZWJ1ZyA9CiAgICBjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgiZGVidWcuaGllcmFyY2h5IikgPyBjb25zdCBEZWJ1Z0xvZ2dlcigpIDogbnVsbDsKCmNsYXNzIERlYnVnTG9nZ2VyIHsKICBjb25zdCBEZWJ1Z0xvZ2dlcigpOwogIHZvaWQgbG9nKE9iamVjdCBtZXNzYWdlKSA9PiBwcmludChtZXNzYWdlKTsKfQoKaW50IGNvbXBhcmVEZWNsYXJhdGlvbnMoRGVjbGFyYXRpb24gYSwgRGVjbGFyYXRpb24gYikgewogIHJldHVybiBDbGFzc0hpZXJhcmNoeS5jb21wYXJlTWVtYmVycyhhLnRhcmdldCwgYi50YXJnZXQpOwp9CgpQcm9jZWR1cmVLaW5kIG1lbWJlcktpbmQoTWVtYmVyIG1lbWJlcikgewogIHJldHVybiBtZW1iZXIgaXMgUHJvY2VkdXJlID8gbWVtYmVyLmtpbmQgOiBudWxsOwp9Cgpib29sIGlzTmFtZVZpc2libGVJbihOYW1lIG5hbWUsIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICByZXR1cm4gIW5hbWUuaXNQcml2YXRlIHx8IG5hbWUubGlicmFyeSA9PSBsaWJyYXJ5LnRhcmdldDsKfQoKLy8vIFJldHVybnMgdHJ1ZSBpZiBbYV0gaXMgYSBjbGFzcyBtZW1iZXIgY29uZmxpY3Qgd2l0aCBbYl0uICBbYV0gaXMgYXNzdW1lZCB0bwovLy8gYmUgZGVjbGFyZWQgaW4gdGhlIGNsYXNzLCBbYl0gaXMgYXNzdW1lZCB0byBiZSBpbmhlcml0ZWQuCi8vLwovLy8gU2VlIHRoZSBzZWN0aW9uIG5hbWVkICJDbGFzcyBNZW1iZXIgQ29uZmxpY3RzIiBpbiBbRGFydCBQcm9ncmFtbWluZwovLy8gTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbl0oCi8vLyAuLi8uLi8uLi8uLi8uLi8uLi9kb2NzL2xhbmd1YWdlL2RhcnRMYW5nU3BlYy50ZXgjY2xhc3NNZW1iZXJDb25mbGljdHMpLgpib29sIGlzSW5oZXJpdGFuY2VDb25mbGljdChEZWNsYXJhdGlvbiBhLCBEZWNsYXJhdGlvbiBiKSB7CiAgaWYgKGEuaXNTdGF0aWMpIHJldHVybiB0cnVlOwogIGlmIChtZW1iZXJLaW5kKGEudGFyZ2V0KSA9PSBtZW1iZXJLaW5kKGIudGFyZ2V0KSkgcmV0dXJuIGZhbHNlOwogIGlmIChhLmlzRmllbGQpIHJldHVybiAhKGIuaXNGaWVsZCB8fCBiLmlzR2V0dGVyIHx8IGIuaXNTZXR0ZXIpOwogIGlmIChiLmlzRmllbGQpIHJldHVybiAhKGEuaXNGaWVsZCB8fCBhLmlzR2V0dGVyIHx8IGEuaXNTZXR0ZXIpOwogIGlmIChhLmlzU2V0dGVyKSByZXR1cm4gIShiLmlzR2V0dGVyIHx8IGIuaXNTZXR0ZXIpOwogIGlmIChiLmlzU2V0dGVyKSByZXR1cm4gIShhLmlzR2V0dGVyIHx8IGEuaXNTZXR0ZXIpOwogIGlmIChhIGlzIEludGVyZmFjZUNvbmZsaWN0IHx8IGIgaXMgSW50ZXJmYWNlQ29uZmxpY3QpIHJldHVybiBmYWxzZTsKICByZXR1cm4gdHJ1ZTsKfQoKYm9vbCBpbXBsaWVzU2V0dGVyKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgcmV0dXJuIGRlY2xhcmF0aW9uLmlzRmllbGQgJiYgIShkZWNsYXJhdGlvbi5pc0ZpbmFsIHx8IGRlY2xhcmF0aW9uLmlzQ29uc3QpOwp9Cgpib29sIGhhc1NhbWVTaWduYXR1cmUoRnVuY3Rpb25Ob2RlIGEsIEZ1bmN0aW9uTm9kZSBiKSB7CiAgTGlzdDxUeXBlUGFyYW1ldGVyPiBhVHlwZVBhcmFtZXRlcnMgPSBhLnR5cGVQYXJhbWV0ZXJzOwogIExpc3Q8VHlwZVBhcmFtZXRlcj4gYlR5cGVQYXJhbWV0ZXJzID0gYi50eXBlUGFyYW1ldGVyczsKICBpbnQgdHlwZVBhcmFtZXRlckNvdW50ID0gYVR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKICBpZiAodHlwZVBhcmFtZXRlckNvdW50ICE9IGJUeXBlUGFyYW1ldGVycy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uOwogIGlmICh0eXBlUGFyYW1ldGVyQ291bnQgIT0gMCkgewogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZXMgPSBuZXcgTGlzdDxEYXJ0VHlwZT4odHlwZVBhcmFtZXRlckNvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlckNvdW50OyBpKyspIHsKICAgICAgdHlwZXNbaV0gPSBuZXcgVHlwZVBhcmFtZXRlclR5cGUoYVR5cGVQYXJhbWV0ZXJzW2ldKTsKICAgIH0KICAgIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoYlR5cGVQYXJhbWV0ZXJzLCB0eXBlcyk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJDb3VudDsgaSsrKSB7CiAgICAgIERhcnRUeXBlIGFCb3VuZCA9IGFUeXBlUGFyYW1ldGVyc1tpXS5ib3VuZDsKICAgICAgRGFydFR5cGUgYkJvdW5kID0gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGJUeXBlUGFyYW1ldGVyc1tpXS5ib3VuZCk7CiAgICAgIGlmIChhQm91bmQgIT0gYkJvdW5kKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBpZiAoYS5yZXF1aXJlZFBhcmFtZXRlckNvdW50ICE9IGIucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgcmV0dXJuIGZhbHNlOwogIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gYVBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gYS5wb3NpdGlvbmFsUGFyYW1ldGVyczsKICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IGJQb3NpdGlvbmFsUGFyYW1ldGVycyA9IGIucG9zaXRpb25hbFBhcmFtZXRlcnM7CiAgaWYgKGFQb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggIT0gYlBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBmb3IgKGludCBpID0gMDsgaSA8IGFQb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbiBhUGFyYW1ldGVyID0gYVBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgVmFyaWFibGVEZWNsYXJhdGlvbiBiUGFyYW1ldGVyID0gYlBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgaWYgKGFQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQgIT0gYlBhcmFtZXRlci5pc0NvdmFyaWFudCkgcmV0dXJuIGZhbHNlOwogICAgRGFydFR5cGUgYVR5cGUgPSBhUGFyYW1ldGVyLnR5cGU7CiAgICBEYXJ0VHlwZSBiVHlwZSA9IGJQYXJhbWV0ZXIudHlwZTsKICAgIGlmIChzdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICBiVHlwZSA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShiVHlwZSk7CiAgICB9CiAgICBpZiAoYVR5cGUgIT0gYlR5cGUpIHJldHVybiBmYWxzZTsKICB9CgogIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gYU5hbWVkUGFyYW1ldGVycyA9IGEubmFtZWRQYXJhbWV0ZXJzOwogIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gYk5hbWVkUGFyYW1ldGVycyA9IGIubmFtZWRQYXJhbWV0ZXJzOwogIGlmIChhTmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCAhPSBiTmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogIGZvciAoaW50IGkgPSAwOyBpIDwgYU5hbWVkUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbiBhUGFyYW1ldGVyID0gYU5hbWVkUGFyYW1ldGVyc1tpXTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gYlBhcmFtZXRlciA9IGJOYW1lZFBhcmFtZXRlcnNbaV07CiAgICBpZiAoYVBhcmFtZXRlci5pc0NvdmFyaWFudCAhPSBiUGFyYW1ldGVyLmlzQ292YXJpYW50KSByZXR1cm4gZmFsc2U7CiAgICBpZiAoYVBhcmFtZXRlci5uYW1lICE9IGJQYXJhbWV0ZXIubmFtZSkgcmV0dXJuIGZhbHNlOwogICAgRGFydFR5cGUgYVR5cGUgPSBhUGFyYW1ldGVyLnR5cGU7CiAgICBEYXJ0VHlwZSBiVHlwZSA9IGJQYXJhbWV0ZXIudHlwZTsKICAgIGlmIChzdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICBiVHlwZSA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShiVHlwZSk7CiAgICB9CiAgICBpZiAoYVR5cGUgIT0gYlR5cGUpIHJldHVybiBmYWxzZTsKICB9CgogIERhcnRUeXBlIGFSZXR1cm5UeXBlID0gYS5yZXR1cm5UeXBlOwogIERhcnRUeXBlIGJSZXR1cm5UeXBlID0gYi5yZXR1cm5UeXBlOwogIGlmIChzdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgYlJldHVyblR5cGUgPSBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoYlJldHVyblR5cGUpOwogIH0KCiAgcmV0dXJuIGFSZXR1cm5UeXBlID09IGJSZXR1cm5UeXBlOwp9CgpjbGFzcyBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgewogIGZpbmFsIE1hcDxDbGFzcywgQ2xhc3NIaWVyYXJjaHlOb2RlPiBub2RlcyA9IDxDbGFzcywgQ2xhc3NIaWVyYXJjaHlOb2RlPnt9OwoKICBmaW5hbCBDbGFzc0J1aWxkZXIgb2JqZWN0Q2xhc3M7CgogIGZpbmFsIExvYWRlciBsb2FkZXI7CgogIGZpbmFsIENsYXNzIG9iamVjdEtlcm5lbENsYXNzOwoKICBmaW5hbCBDbGFzcyBmdXR1cmVLZXJuZWxDbGFzczsKCiAgZmluYWwgQ2xhc3MgZnV0dXJlT3JLZXJuZWxDbGFzczsKCiAgZmluYWwgQ2xhc3MgZnVuY3Rpb25LZXJuZWxDbGFzczsKCiAgZmluYWwgQ2xhc3MgbnVsbEtlcm5lbENsYXNzOwoKICBmaW5hbCBMaXN0PERlbGF5ZWRPdmVycmlkZUNoZWNrPiBvdmVycmlkZUNoZWNrcyA9IDxEZWxheWVkT3ZlcnJpZGVDaGVjaz5bXTsKCiAgZmluYWwgTGlzdDxEZWxheWVkTWVtYmVyPiBkZWxheWVkTWVtYmVyQ2hlY2tzID0gPERlbGF5ZWRNZW1iZXI+W107CgogIC8vIFRPRE8oYWhlKTogUmVtb3ZlIHRoaXMuCiAgZmluYWwgQ29yZVR5cGVzIGNvcmVUeXBlczsKCiAgVHlwZXMgdHlwZXM7CgogIENsYXNzSGllcmFyY2h5QnVpbGRlcih0aGlzLm9iamVjdENsYXNzLCB0aGlzLmxvYWRlciwgdGhpcy5jb3JlVHlwZXMpCiAgICAgIDogb2JqZWN0S2VybmVsQ2xhc3MgPSBvYmplY3RDbGFzcy50YXJnZXQsCiAgICAgICAgZnV0dXJlS2VybmVsQ2xhc3MgPSBjb3JlVHlwZXMuZnV0dXJlQ2xhc3MsCiAgICAgICAgZnV0dXJlT3JLZXJuZWxDbGFzcyA9IGNvcmVUeXBlcy5mdXR1cmVPckNsYXNzLAogICAgICAgIGZ1bmN0aW9uS2VybmVsQ2xhc3MgPSBjb3JlVHlwZXMuZnVuY3Rpb25DbGFzcywKICAgICAgICBudWxsS2VybmVsQ2xhc3MgPSBjb3JlVHlwZXMubnVsbENsYXNzIHsKICAgIHR5cGVzID0gbmV3IFR5cGVzKHRoaXMpOwogIH0KCiAgQ2xhc3NIaWVyYXJjaHlOb2RlIGdldE5vZGVGcm9tQ2xhc3MoQ2xhc3NCdWlsZGVyIGNscykgewogICAgcmV0dXJuIG5vZGVzW2Nscy50YXJnZXRdID8/PQogICAgICAgIG5ldyBDbGFzc0hpZXJhcmNoeU5vZGVCdWlsZGVyKHRoaXMsIGNscykuYnVpbGQoKTsKICB9CgogIENsYXNzSGllcmFyY2h5Tm9kZSBnZXROb2RlRnJvbVR5cGUoVHlwZUJ1aWxkZXIgdHlwZSkgewogICAgQ2xhc3NCdWlsZGVyIGNscyA9IGdldENsYXNzKHR5cGUpOwogICAgcmV0dXJuIGNscyA9PSBudWxsID8gbnVsbCA6IGdldE5vZGVGcm9tQ2xhc3MoY2xzKTsKICB9CgogIENsYXNzSGllcmFyY2h5Tm9kZSBnZXROb2RlRnJvbUtlcm5lbENsYXNzKENsYXNzIGNscykgewogICAgcmV0dXJuIG5vZGVzW2Nsc10gPz8KICAgICAgICBnZXROb2RlRnJvbUNsYXNzKGxvYWRlci5jb21wdXRlQ2xhc3NCdWlsZGVyRnJvbVRhcmdldENsYXNzKGNscykpOwogIH0KCiAgVHlwZUJ1aWxkZXIgYXNTdXBlcnR5cGVPZihDbGFzcyBjbHMsIENsYXNzIHN1cGVydHlwZSkgewogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIGNsc05vZGUgPSBnZXROb2RlRnJvbUtlcm5lbENsYXNzKGNscyk7CiAgICBpZiAoY2xzID09IHN1cGVydHlwZSkgewogICAgICByZXR1cm4gbmV3IE5hbWVkVHlwZUJ1aWxkZXIoY2xzTm9kZS5jbHMubmFtZSwgbnVsbCkuLmJpbmQoY2xzTm9kZS5jbHMpOwogICAgfQogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIHN1cGVydHlwZU5vZGUgPSBnZXROb2RlRnJvbUtlcm5lbENsYXNzKHN1cGVydHlwZSk7CiAgICBMaXN0PFR5cGVCdWlsZGVyPiBzdXBlcnR5cGVzID0gY2xzTm9kZS5zdXBlcmNsYXNzZXM7CiAgICBpbnQgZGVwdGggPSBzdXBlcnR5cGVOb2RlLmRlcHRoOwogICAgRGVjbGFyYXRpb24gc3VwZXJ0eXBlRGVjbGFyYXRpb24gPSBzdXBlcnR5cGVOb2RlLmNsczsKICAgIGlmIChkZXB0aCA8IHN1cGVydHlwZXMubGVuZ3RoKSB7CiAgICAgIFR5cGVCdWlsZGVyIGFzU3VwZXJ0eXBlT2YgPSBzdXBlcnR5cGVzW2RlcHRoXTsKICAgICAgaWYgKGFzU3VwZXJ0eXBlT2YuZGVjbGFyYXRpb24gPT0gc3VwZXJ0eXBlRGVjbGFyYXRpb24pCiAgICAgICAgcmV0dXJuIGFzU3VwZXJ0eXBlT2Y7CiAgICB9CiAgICBzdXBlcnR5cGVzID0gY2xzTm9kZS5pbnRlcmZhY2VzOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcnR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFR5cGVCdWlsZGVyIHR5cGUgPSBzdXBlcnR5cGVzW2ldOwogICAgICBpZiAodHlwZS5kZWNsYXJhdGlvbiA9PSBzdXBlcnR5cGVEZWNsYXJhdGlvbikgcmV0dXJuIHR5cGU7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEludGVyZmFjZVR5cGUgZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZigKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlLCBDbGFzcyBzdXBlcmNsYXNzKSB7CiAgICBDbGFzcyBrZXJuZWxDbGFzcyA9IHR5cGUuY2xhc3NOb2RlOwogICAgaWYgKGtlcm5lbENsYXNzID09IHN1cGVyY2xhc3MpIHJldHVybiB0eXBlOwogICAgaWYgKGtlcm5lbENsYXNzID09IG51bGxLZXJuZWxDbGFzcykgewogICAgICBpZiAoc3VwZXJjbGFzcy50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyY2xhc3MucmF3VHlwZTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGlzIGlzIGEgc2FmZSBmYWxsLWJhY2sgZm9yIGRlYWxpbmcgd2l0aCBgTnVsbGAuIEl0IHdpbGwgbGlrZWx5IGJlCiAgICAgICAgLy8gZmFzdGVyIHRvIGNoZWNrIGZvciBgTnVsbGAgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuCiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBzdXBlcmNsYXNzLAogICAgICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgICAgICAgc3VwZXJjbGFzcy50eXBlUGFyYW1ldGVycy5sZW5ndGgsIG51bGxLZXJuZWxDbGFzcy5yYXdUeXBlKSk7CiAgICAgIH0KICAgIH0KICAgIE5hbWVkVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlID0gYXNTdXBlcnR5cGVPZihrZXJuZWxDbGFzcywgc3VwZXJjbGFzcyk7CiAgICBpZiAoc3VwZXJ0eXBlID09IG51bGwpIHJldHVybiBudWxsOwogICAgaWYgKHN1cGVydHlwZS5hcmd1bWVudHMgPT0gbnVsbCAmJiBzdXBlcmNsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIHN1cGVyY2xhc3MucmF3VHlwZTsKICAgIH0KICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUodHlwZSkKICAgICAgICAuc3Vic3RpdHV0ZVR5cGUoc3VwZXJ0eXBlLmJ1aWxkKG51bGwpKTsKICB9CgogIEludGVyZmFjZVR5cGUgZ2V0S2VybmVsTGVnYWN5TGVhc3RVcHBlckJvdW5kKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUxLCBJbnRlcmZhY2VUeXBlIHR5cGUyKSB7CiAgICBpZiAodHlwZTEgPT0gdHlwZTIpIHJldHVybiB0eXBlMTsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlMSA9IGdldE5vZGVGcm9tS2VybmVsQ2xhc3ModHlwZTEuY2xhc3NOb2RlKTsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlMiA9IGdldE5vZGVGcm9tS2VybmVsQ2xhc3ModHlwZTIuY2xhc3NOb2RlKTsKICAgIFNldDxDbGFzc0hpZXJhcmNoeU5vZGU+IG5vZGVzMSA9IG5vZGUxLmNvbXB1dGVBbGxTdXBlck5vZGVzKHRoaXMpLnRvU2V0KCk7CiAgICBMaXN0PENsYXNzSGllcmFyY2h5Tm9kZT4gbm9kZXMyID0gbm9kZTIuY29tcHV0ZUFsbFN1cGVyTm9kZXModGhpcyk7CiAgICBMaXN0PENsYXNzSGllcmFyY2h5Tm9kZT4gY29tbW9uID0gPENsYXNzSGllcmFyY2h5Tm9kZT5bXTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzMi5sZW5ndGg7IGkrKykgewogICAgICBDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSA9IG5vZGVzMltpXTsKICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgY29udGludWU7CiAgICAgIGlmIChub2RlczEuY29udGFpbnMobm9kZSkpIHsKICAgICAgICBEYXJ0VHlwZSBjYW5kaWRhdGUxID0gZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZih0eXBlMSwgbm9kZS5jbHMudGFyZ2V0KTsKICAgICAgICBEYXJ0VHlwZSBjYW5kaWRhdGUyID0gZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZih0eXBlMiwgbm9kZS5jbHMudGFyZ2V0KTsKICAgICAgICBpZiAoY2FuZGlkYXRlMSA9PSBjYW5kaWRhdGUyKSB7CiAgICAgICAgICBjb21tb24uYWRkKG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChjb21tb24ubGVuZ3RoID09IDEpIHJldHVybiBvYmplY3RLZXJuZWxDbGFzcy5yYXdUeXBlOwogICAgY29tbW9uLnNvcnQoQ2xhc3NIaWVyYXJjaHlOb2RlLmNvbXBhcmVNYXhJbmhlcml0YW5jZVBhdGgpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tbW9uLmxlbmd0aCAtIDE7IGkrKykgewogICAgICBDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSA9IGNvbW1vbltpXTsKICAgICAgaWYgKG5vZGUubWF4SW5oZXJpdGFuY2VQYXRoICE9IGNvbW1vbltpICsgMV0ubWF4SW5oZXJpdGFuY2VQYXRoKSB7CiAgICAgICAgcmV0dXJuIGdldEtlcm5lbFR5cGVBc0luc3RhbmNlT2YodHlwZTEsIG5vZGUuY2xzLnRhcmdldCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG8gewogICAgICAgICAgaSsrOwogICAgICAgIH0gd2hpbGUgKG5vZGUubWF4SW5oZXJpdGFuY2VQYXRoID09IGNvbW1vbltpICsgMV0ubWF4SW5oZXJpdGFuY2VQYXRoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG9iamVjdEtlcm5lbENsYXNzLnJhd1R5cGU7CiAgfQoKICBNZW1iZXIgZ2V0SW50ZXJmYWNlTWVtYmVyS2VybmVsKENsYXNzIGNscywgTmFtZSBuYW1lLCBib29sIGlzU2V0dGVyKSB7CiAgICByZXR1cm4gZ2V0Tm9kZUZyb21LZXJuZWxDbGFzcyhjbHMpCiAgICAgICAgLmdldEludGVyZmFjZU1lbWJlcihuYW1lLCBpc1NldHRlcikKICAgICAgICA/LnRhcmdldDsKICB9CgogIE1lbWJlciBnZXREaXNwYXRjaFRhcmdldEtlcm5lbChDbGFzcyBjbHMsIE5hbWUgbmFtZSwgYm9vbCBpc1NldHRlcikgewogICAgcmV0dXJuIGdldE5vZGVGcm9tS2VybmVsQ2xhc3MoY2xzKQogICAgICAgIC5nZXREaXNwYXRjaFRhcmdldChuYW1lLCBpc1NldHRlcikKICAgICAgICA/LnRhcmdldDsKICB9CgogIE1lbWJlciBnZXRDb21iaW5lZE1lbWJlclNpZ25hdHVyZUtlcm5lbChDbGFzcyBjbHMsIE5hbWUgbmFtZSwgYm9vbCBpc1NldHRlciwKICAgICAgaW50IGNoYXJPZmZzZXQsIEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0KICAgICAgICBnZXROb2RlRnJvbUtlcm5lbENsYXNzKGNscykuZ2V0SW50ZXJmYWNlTWVtYmVyKG5hbWUsIGlzU2V0dGVyKTsKICAgIGlmIChkZWNsYXJhdGlvbj8uaXNTdGF0aWMgPz8gdHJ1ZSkgcmV0dXJuIG51bGw7CiAgICBpZiAoZGVjbGFyYXRpb24ubmV4dCAhPSBudWxsKSB7CiAgICAgIGxpYnJhcnk/LmFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvblVzZS53aXRoQXJndW1lbnRzKG5hbWUubmFtZSksCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgbmFtZS5uYW1lLmxlbmd0aCwKICAgICAgICAgIGxpYnJhcnkuZmlsZVVyaSk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGRlY2xhcmF0aW9uIGlzIERlbGF5ZWRNZW1iZXIpIHsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uLmNoZWNrKHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uLnRhcmdldDsKICAgIH0KICB9CgogIHN0YXRpYyBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgYnVpbGQoQ2xhc3NCdWlsZGVyIG9iamVjdENsYXNzLAogICAgICBMaXN0PENsYXNzQnVpbGRlcj4gY2xhc3NlcywgU291cmNlTG9hZGVyIGxvYWRlciwgQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSA9CiAgICAgICAgbmV3IENsYXNzSGllcmFyY2h5QnVpbGRlcihvYmplY3RDbGFzcywgbG9hZGVyLCBjb3JlVHlwZXMpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIENsYXNzQnVpbGRlciBjbHMgPSBjbGFzc2VzW2ldOwogICAgICBpZiAoIWNscy5pc1BhdGNoKSB7CiAgICAgICAgaGllcmFyY2h5Lm5vZGVzW2Nscy50YXJnZXRdID0KICAgICAgICAgICAgbmV3IENsYXNzSGllcmFyY2h5Tm9kZUJ1aWxkZXIoaGllcmFyY2h5LCBjbHMpLmJ1aWxkKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVE9ETyhhaGUpOiBNZXJnZSB0aGUgaW5qZWN0ZWQgbWVtYmVycyBvZiBwYXRjaCBpbnRvIHRoZSBoaWVyYXJjaHkKICAgICAgICAvLyBub2RlIG9mIGBjbHMub3JpZ2luYC4KICAgICAgfQogICAgfQogICAgcmV0dXJuIGhpZXJhcmNoeTsKICB9Cn0KCmNsYXNzIENsYXNzSGllcmFyY2h5Tm9kZUJ1aWxkZXIgewogIGZpbmFsIENsYXNzSGllcmFyY2h5QnVpbGRlciBoaWVyYXJjaHk7CgogIGZpbmFsIENsYXNzQnVpbGRlciBjbHM7CgogIGJvb2wgaGFzTm9TdWNoTWV0aG9kID0gZmFsc2U7CgogIExpc3Q8RGVjbGFyYXRpb24+IGFic3RyYWN0TWVtYmVycyA9IG51bGw7CgogIENsYXNzSGllcmFyY2h5Tm9kZUJ1aWxkZXIodGhpcy5oaWVyYXJjaHksIHRoaXMuY2xzKTsKCiAgQ2xhc3NCdWlsZGVyIGdldCBvYmplY3RDbGFzcyA9PiBoaWVyYXJjaHkub2JqZWN0Q2xhc3M7CgogIGZpbmFsIE1hcDxDbGFzcywgU3Vic3RpdHV0aW9uPiBzdWJzdGl0dXRpb25zID0gPENsYXNzLCBTdWJzdGl0dXRpb24+e307CgogIC8vLyBXaGVuIG1lcmdpbmcgYGFMaXN0YCBhbmQgYGJMaXN0YCwgW2FdIChmcm9tIGBhTGlzdGApIGFuZCBbYl0gKGZyb20KICAvLy8gYGJMaXN0YCkgZWFjaCBoYXZlIHRoZSBzYW1lIG5hbWUuCiAgLy8vCiAgLy8vIElmIFttZXJnZUtpbmRdIGlzIGBNZXJnZUtpbmQuc3VwZXJjbGFzc2AsIFthXSBzaG91bGQgb3ZlcnJpZGUgW2JdLgogIC8vLwogIC8vLyBJZiBbbWVyZ2VLaW5kXSBpcyBgTWVyZ2VLaW5kLmludGVyZmFjZXNgLCB3ZSBuZWVkIHRvIHJlY29yZCB0aGVtIGFuZAogIC8vLyBzb2x2ZSB0aGUgY29uZmxpY3QgbGF0ZXIuCiAgLy8vCiAgLy8vIElmIFttZXJnZUtpbmRdIGlzIGBNZXJnZUtpbmQuc3VwZXJ0eXBlc2AsIFthXSBzaG91bGQgaW1wbGVtZW50IFtiXSwgYW5kCiAgLy8vIFtiXSBpcyBpbXBsaWNpdGx5IGFic3RyYWN0LgogIERlY2xhcmF0aW9uIGhhbmRsZU1lcmdlQ29uZmxpY3QoCiAgICAgIERlY2xhcmF0aW9uIGEsIERlY2xhcmF0aW9uIGIsIE1lcmdlS2luZCBtZXJnZUtpbmQpIHsKICAgIGRlYnVnPy5sb2coCiAgICAgICAgImhhbmRsZU1lcmdlQ29uZmxpY3Q6ICR7ZnVsbE5hbWUoYSl9ICR7ZnVsbE5hbWUoYil9ICR7bWVyZ2VLaW5kfSIpOwogICAgLy8gVE9ETyhhaGUpOiBFbmFibGUgdGhpcyBvcHRpbWl6YXRpb24sIGJ1dCBiZSBjYXJlZnVsIGFib3V0IGFic3RyYWN0CiAgICAvLyBtZXRob2RzIG92ZXJyaWRpbmcgY29uY3JldGUgbWV0aG9kcy4KICAgIC8vIGlmIChjbHMgaXMgRGlsbENsYXNzQnVpbGRlcikgcmV0dXJuIGE7CiAgICBpZiAoYSA9PSBiKSByZXR1cm4gYTsKICAgIGlmIChhLm5leHQgIT0gbnVsbCB8fCBiLm5leHQgIT0gbnVsbCkgewogICAgICAvLyBEb24ndCBjaGVjayBvdmVycmlkZXMgaW52b2x2aW5nIGR1cGxpY2F0ZWQgbWVtYmVycy4KICAgICAgcmV0dXJuIGE7CiAgICB9CiAgICBEZWNsYXJhdGlvbiByZXN1bHQgPSBjaGVja0luaGVyaXRhbmNlQ29uZmxpY3QoYSwgYik7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CiAgICByZXN1bHQgPSBhOwogICAgc3dpdGNoIChtZXJnZUtpbmQpIHsKICAgICAgY2FzZSBNZXJnZUtpbmQuc3VwZXJjbGFzc01lbWJlcnM6CiAgICAgIGNhc2UgTWVyZ2VLaW5kLnN1cGVyY2xhc3NTZXR0ZXJzOgogICAgICAgIC8vIFthXSBpcyBhIG1ldGhvZCBkZWNsYXJlZCBpbiBbY2xzXS4gVGhpcyBtZWFucyBpdCBkZWZpbmVzIHRoZQogICAgICAgIC8vIGludGVyZmFjZSBvZiB0aGlzIGNsYXNzIHJlZ2FyZGxlc3MgaWYgaXRzIGFic3RyYWN0LgogICAgICAgIGRlYnVnPy5sb2coCiAgICAgICAgICAgICJzdXBlcmNsYXNzOiBjaGVja1ZhbGlkT3ZlcnJpZGUoJHtjbHMuZnVsbE5hbWVGb3JFcnJvcnN9LCAke2Z1bGxOYW1lKGEpfSwgJHtmdWxsTmFtZShiKX0pIik7CiAgICAgICAgY2hlY2tWYWxpZE92ZXJyaWRlKAogICAgICAgICAgICBhLCBBYnN0cmFjdE1lbWJlck92ZXJyaWRpbmdJbXBsZW1lbnRhdGlvbi5zZWxlY3RBYnN0cmFjdChiKSk7CgogICAgICAgIGlmIChpc0Fic3RyYWN0KGEpKSB7CiAgICAgICAgICBpZiAoaXNBYnN0cmFjdChiKSkgewogICAgICAgICAgICByZWNvcmRBYnN0cmFjdE1lbWJlcihhKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghY2xzLmlzQWJzdHJhY3QpIHsKICAgICAgICAgICAgICAvLyBUaGUgaW50ZXJmYWNlIG9mIHRoaXMgY2xhc3MgaXMgW2FdLiBCdXQgdGhlIGltcGxlbWVudGF0aW9uIGlzCiAgICAgICAgICAgICAgLy8gW2JdLiBTbyBbYl0gbXVzdCBpbXBsZW1lbnQgW2FdLCB1bmxlc3MgW2Nsc10gaXMgYWJzdHJhY3QuCiAgICAgICAgICAgICAgY2hlY2tWYWxpZE92ZXJyaWRlKGIsIGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBYnN0cmFjdE1lbWJlck92ZXJyaWRpbmdJbXBsZW1lbnRhdGlvbigKICAgICAgICAgICAgICAgIGNscywKICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICBBYnN0cmFjdE1lbWJlck92ZXJyaWRpbmdJbXBsZW1lbnRhdGlvbi5zZWxlY3RDb25jcmV0ZShiKSwKICAgICAgICAgICAgICAgIG1lcmdlS2luZCA9PSBNZXJnZUtpbmQuc3VwZXJjbGFzc1NldHRlcnMsCiAgICAgICAgICAgICAgICBjbHMubGlicmFyeS5sb2FkZXIgPT0gaGllcmFyY2h5LmxvYWRlcik7CiAgICAgICAgICAgIGhpZXJhcmNoeS5kZWxheWVkTWVtYmVyQ2hlY2tzLmFkZChyZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2xzLmlzTWl4aW5BcHBsaWNhdGlvbiAmJiBhLnBhcmVudCAhPSBjbHMpIHsKICAgICAgICAgIHJlc3VsdCA9IEluaGVyaXRlZEltcGxlbWVudGF0aW9uSW50ZXJmYWNlQ29uZmxpY3QuY29tYmluZWQoCiAgICAgICAgICAgICAgY2xzLAogICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgYiwKICAgICAgICAgICAgICBtZXJnZUtpbmQgPT0gTWVyZ2VLaW5kLnN1cGVyY2xhc3NTZXR0ZXJzLAogICAgICAgICAgICAgIGNscy5saWJyYXJ5LmxvYWRlciA9PSBoaWVyYXJjaHkubG9hZGVyLAogICAgICAgICAgICAgIGlzSW5oZXJpdGFibGVDb25mbGljdDogZmFsc2UpOwogICAgICAgICAgaWYgKHJlc3VsdCBpcyBEZWxheWVkTWVtYmVyKSB7CiAgICAgICAgICAgIGhpZXJhcmNoeS5kZWxheWVkTWVtYmVyQ2hlY2tzLmFkZChyZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgTWVtYmVyIHRhcmdldCA9IHJlc3VsdC50YXJnZXQ7CiAgICAgICAgaWYgKHRhcmdldC5lbmNsb3NpbmdDbGFzcyAhPSBvYmplY3RDbGFzcy5jbHMgJiYKICAgICAgICAgICAgdGFyZ2V0Lm5hbWUgPT0gbm9TdWNoTWV0aG9kTmFtZSkgewogICAgICAgICAgaGFzTm9TdWNoTWV0aG9kID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1lcmdlS2luZC5tZW1iZXJzV2l0aFNldHRlcnM6CiAgICAgIGNhc2UgTWVyZ2VLaW5kLnNldHRlcnNXaXRoTWVtYmVyczoKICAgICAgICBpZiAoYS5wYXJlbnQgPT0gY2xzICYmIGIucGFyZW50ICE9IGNscykgewogICAgICAgICAgaWYgKGEgaXMgS2VybmVsRmllbGRCdWlsZGVyKSB7CiAgICAgICAgICAgIGlmIChhLmlzRmluYWwgJiYgYi5pc1NldHRlcikgewogICAgICAgICAgICAgIGhpZXJhcmNoeS5vdmVycmlkZUNoZWNrcy5hZGQobmV3IERlbGF5ZWRPdmVycmlkZUNoZWNrKGNscywgYSwgYikpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmICghaW5mZXJGaWVsZFR5cGVzKGEsIGIpKSB7CiAgICAgICAgICAgICAgICBoaWVyYXJjaHkub3ZlcnJpZGVDaGVja3MKICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBEZWxheWVkT3ZlcnJpZGVDaGVjayhjbHMsIGEsIGIpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoYSBpcyBQcm9jZWR1cmVCdWlsZGVyKSB7CiAgICAgICAgICAgIGlmICghaW5mZXJNZXRob2RUeXBlcyhhLCBiKSkgewogICAgICAgICAgICAgIGhpZXJhcmNoeS5vdmVycmlkZUNoZWNrcy5hZGQobmV3IERlbGF5ZWRPdmVycmlkZUNoZWNrKGNscywgYSwgYikpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBNZXJnZUtpbmQuaW50ZXJmYWNlc01lbWJlcnM6CiAgICAgICAgcmVzdWx0ID0gSW50ZXJmYWNlQ29uZmxpY3QuY29tYmluZWQoCiAgICAgICAgICAgIGNscywgYSwgYiwgZmFsc2UsIGNscy5saWJyYXJ5LmxvYWRlciA9PSBoaWVyYXJjaHkubG9hZGVyKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgTWVyZ2VLaW5kLmludGVyZmFjZXNTZXR0ZXJzOgogICAgICAgIHJlc3VsdCA9IEludGVyZmFjZUNvbmZsaWN0LmNvbWJpbmVkKAogICAgICAgICAgICBjbHMsIGEsIGIsIHRydWUsIGNscy5saWJyYXJ5LmxvYWRlciA9PSBoaWVyYXJjaHkubG9hZGVyKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgTWVyZ2VLaW5kLnN1cGVydHlwZXNNZW1iZXJzOgogICAgICBjYXNlIE1lcmdlS2luZC5zdXBlcnR5cGVzU2V0dGVyczoKICAgICAgICAvLyBbYl0gaXMgaW5oZXJpdGVkIGZyb20gYW4gaW50ZXJmYWNlIHNvIGl0IGlzIGltcGxpY2l0bHkgYWJzdHJhY3QuCgogICAgICAgIGEgPSBBYnN0cmFjdE1lbWJlck92ZXJyaWRpbmdJbXBsZW1lbnRhdGlvbi5zZWxlY3RBYnN0cmFjdChhKTsKICAgICAgICBiID0gQWJzdHJhY3RNZW1iZXJPdmVycmlkaW5nSW1wbGVtZW50YXRpb24uc2VsZWN0QWJzdHJhY3QoYik7CgogICAgICAgIC8vIElmIFthXSBpcyBkZWNsYXJlZCBpbiB0aGlzIGNsYXNzLCBpdCBkZWZpbmVzIHRoZSBpbnRlcmZhY2UuCiAgICAgICAgaWYgKGEucGFyZW50ID09IGNscykgewogICAgICAgICAgZGVidWc/LmxvZygKICAgICAgICAgICAgICAic3VwZXJ0eXBlczogY2hlY2tWYWxpZE92ZXJyaWRlKCR7Y2xzLmZ1bGxOYW1lRm9yRXJyb3JzfSwgJHtmdWxsTmFtZShhKX0sICR7ZnVsbE5hbWUoYil9KSIpOwogICAgICAgICAgY2hlY2tWYWxpZE92ZXJyaWRlKGEsIGIpOwogICAgICAgICAgaWYgKGEgaXMgRGVsYXllZE1lbWJlciAmJiAhYS5pc0luaGVyaXRhYmxlQ29uZmxpY3QpIHsKICAgICAgICAgICAgaWYgKGIgaXMgRGVsYXllZE1lbWJlcikgewogICAgICAgICAgICAgIGIuYWRkQWxsRGVjbGFyYXRpb25zVG8oYS5kZWNsYXJhdGlvbnMpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGFkZERlY2xhcmF0aW9uSWZEaWZmZXJlbnQoYiwgYS5kZWNsYXJhdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChpc0Fic3RyYWN0KGEpKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IEludGVyZmFjZUNvbmZsaWN0LmNvbWJpbmVkKAogICAgICAgICAgICAgICAgY2xzLAogICAgICAgICAgICAgICAgYSwKICAgICAgICAgICAgICAgIGIsCiAgICAgICAgICAgICAgICBtZXJnZUtpbmQgPT0gTWVyZ2VLaW5kLnN1cGVydHlwZXNTZXR0ZXJzLAogICAgICAgICAgICAgICAgY2xzLmxpYnJhcnkubG9hZGVyID09IGhpZXJhcmNoeS5sb2FkZXIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0ID0gSW5oZXJpdGVkSW1wbGVtZW50YXRpb25JbnRlcmZhY2VDb25mbGljdC5jb21iaW5lZCgKICAgICAgICAgICAgICAgIGNscywKICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICBiLAogICAgICAgICAgICAgICAgbWVyZ2VLaW5kID09IE1lcmdlS2luZC5zdXBlcnR5cGVzU2V0dGVycywKICAgICAgICAgICAgICAgIGNscy5saWJyYXJ5LmxvYWRlciA9PSBoaWVyYXJjaHkubG9hZGVyKTsKICAgICAgICAgIH0KICAgICAgICAgIGRlYnVnPy5sb2coInN1cGVydHlwZXM6ICR7cmVzdWx0fSIpOwogICAgICAgICAgaWYgKHJlc3VsdCBpcyBEZWxheWVkTWVtYmVyKSB7CiAgICAgICAgICAgIGhpZXJhcmNoeS5kZWxheWVkTWVtYmVyQ2hlY2tzLmFkZChyZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRGVjbGFyYXRpb24gY2hlY2tJbmhlcml0YW5jZUNvbmZsaWN0KERlY2xhcmF0aW9uIGEsIERlY2xhcmF0aW9uIGIpIHsKICAgIGlmIChhIGlzIERlbGF5ZWRNZW1iZXIpIHsKICAgICAgRGVjbGFyYXRpb24gcmVzdWx0OwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuZGVjbGFyYXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgRGVjbGFyYXRpb24gZCA9IGNoZWNrSW5oZXJpdGFuY2VDb25mbGljdChhLmRlY2xhcmF0aW9uc1tpXSwgYik7CiAgICAgICAgcmVzdWx0ID8/PSBkOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBpZiAoYiBpcyBEZWxheWVkTWVtYmVyKSB7CiAgICAgIERlY2xhcmF0aW9uIHJlc3VsdDsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiLmRlY2xhcmF0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgIERlY2xhcmF0aW9uIGQgPSBjaGVja0luaGVyaXRhbmNlQ29uZmxpY3QoYSwgYi5kZWNsYXJhdGlvbnNbaV0pOwogICAgICAgIHJlc3VsdCA/Pz0gZDsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgaWYgKGlzSW5oZXJpdGFuY2VDb25mbGljdChhLCBiKSkgewogICAgICByZXBvcnRJbmhlcml0YW5jZUNvbmZsaWN0KGEsIGIpOwogICAgICByZXR1cm4gYTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgYm9vbCBpbmZlck1ldGhvZFR5cGVzKFByb2NlZHVyZUJ1aWxkZXIgYSwgRGVjbGFyYXRpb24gYikgewogICAgZGVidWc/LmxvZygKICAgICAgICAiVHJ5aW5nIHRvIGluZmVyIHR5cGVzIGZvciAke2Z1bGxOYW1lKGEpfSBiYXNlZCBvbiAke2Z1bGxOYW1lKGIpfSIpOwogICAgaWYgKGIgaXMgRGVsYXllZE1lbWJlcikgewogICAgICBib29sIGhhc1NhbWVTaWduYXR1cmUgPSB0cnVlOwogICAgICBMaXN0PERlY2xhcmF0aW9uPiBkZWNsYXJhdGlvbnMgPSBiLmRlY2xhcmF0aW9uczsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNsYXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoIWluZmVyTWV0aG9kVHlwZXMoYSwgZGVjbGFyYXRpb25zW2ldKSkgewogICAgICAgICAgaGFzU2FtZVNpZ25hdHVyZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaGFzU2FtZVNpZ25hdHVyZTsKICAgIH0KICAgIGlmIChhLmlzR2V0dGVyKSB7CiAgICAgIHJldHVybiBpbmZlckdldHRlclR5cGUoYSwgYik7CiAgICB9IGVsc2UgaWYgKGEuaXNTZXR0ZXIpIHsKICAgICAgcmV0dXJuIGluZmVyU2V0dGVyVHlwZShhLCBiKTsKICAgIH0KICAgIGJvb2wgaGFkVHlwZXNJbmZlcnJlZCA9IGEuaGFkVHlwZXNJbmZlcnJlZDsKICAgIENsYXNzQnVpbGRlciBhQ2xzID0gYS5wYXJlbnQ7CiAgICBTdWJzdGl0dXRpb24gYVN1YnN0aXR1dGlvbjsKICAgIGlmIChjbHMgIT0gYUNscykgewogICAgICBhc3NlcnQoc3Vic3RpdHV0aW9ucy5jb250YWluc0tleShhQ2xzLnRhcmdldCksCiAgICAgICAgICAiJHtjbHMuZnVsbE5hbWVGb3JFcnJvcnN9ICR7YUNscy5mdWxsTmFtZUZvckVycm9yc30iKTsKICAgICAgYVN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbnNbYUNscy50YXJnZXRdOwogICAgICBkZWJ1Zz8ubG9nKAogICAgICAgICAgIiR7Y2xzLmZ1bGxOYW1lRm9yRXJyb3JzfSAtPiAke2FDbHMuZnVsbE5hbWVGb3JFcnJvcnN9ICRhU3Vic3RpdHV0aW9uIik7CiAgICB9CiAgICBDbGFzc0J1aWxkZXIgYkNscyA9IGIucGFyZW50OwogICAgU3Vic3RpdHV0aW9uIGJTdWJzdGl0dXRpb247CiAgICBpZiAoY2xzICE9IGJDbHMpIHsKICAgICAgYXNzZXJ0KHN1YnN0aXR1dGlvbnMuY29udGFpbnNLZXkoYkNscy50YXJnZXQpLAogICAgICAgICAgIiR7Y2xzLmZ1bGxOYW1lRm9yRXJyb3JzfSAke2JDbHMuZnVsbE5hbWVGb3JFcnJvcnN9Iik7CiAgICAgIGJTdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb25zW2JDbHMudGFyZ2V0XTsKICAgICAgZGVidWc/LmxvZygKICAgICAgICAgICIke2Nscy5mdWxsTmFtZUZvckVycm9yc30gLT4gJHtiQ2xzLmZ1bGxOYW1lRm9yRXJyb3JzfSAkYlN1YnN0aXR1dGlvbiIpOwogICAgfQogICAgUHJvY2VkdXJlIGFQcm9jZWR1cmUgPSBhLnRhcmdldDsKICAgIGlmIChiLnRhcmdldCBpcyEgUHJvY2VkdXJlKSB7CiAgICAgIGRlYnVnPy5sb2coIkdpdmluZyB1cCAxIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIFByb2NlZHVyZSBiUHJvY2VkdXJlID0gYi50YXJnZXQ7CiAgICBGdW5jdGlvbk5vZGUgYUZ1bmN0aW9uID0gYVByb2NlZHVyZS5mdW5jdGlvbjsKICAgIEZ1bmN0aW9uTm9kZSBiRnVuY3Rpb24gPSBiUHJvY2VkdXJlLmZ1bmN0aW9uOwoKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gYVR5cGVQYXJhbWV0ZXJzID0gYUZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBiVHlwZVBhcmFtZXRlcnMgPSBiRnVuY3Rpb24udHlwZVBhcmFtZXRlcnM7CiAgICBpbnQgdHlwZVBhcmFtZXRlckNvdW50ID0gYVR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKICAgIGlmICh0eXBlUGFyYW1ldGVyQ291bnQgIT0gYlR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgMiIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uOwogICAgaWYgKHR5cGVQYXJhbWV0ZXJDb3VudCAhPSAwKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlckNvdW50OyBpKyspIHsKICAgICAgICBjb3B5VHlwZVBhcmFtZXRlckNvdmFyaWFuY2UoCiAgICAgICAgICAgIGEucGFyZW50LCBhVHlwZVBhcmFtZXRlcnNbaV0sIGJUeXBlUGFyYW1ldGVyc1tpXSk7CiAgICAgIH0KICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZXMgPSBuZXcgTGlzdDxEYXJ0VHlwZT4odHlwZVBhcmFtZXRlckNvdW50KTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVyQ291bnQ7IGkrKykgewogICAgICAgIHR5cGVzW2ldID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKGFUeXBlUGFyYW1ldGVyc1tpXSk7CiAgICAgIH0KICAgICAgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21QYWlycyhiVHlwZVBhcmFtZXRlcnMsIHR5cGVzKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVyQ291bnQ7IGkrKykgewogICAgICAgIERhcnRUeXBlIGFCb3VuZCA9IGFUeXBlUGFyYW1ldGVyc1tpXS5ib3VuZDsKICAgICAgICBEYXJ0VHlwZSBiQm91bmQgPSBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoYlR5cGVQYXJhbWV0ZXJzW2ldLmJvdW5kKTsKICAgICAgICBpZiAoYUJvdW5kICE9IGJCb3VuZCkgewogICAgICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwIDMiKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBEYXJ0VHlwZSBhUmV0dXJuVHlwZSA9IGFGdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgaWYgKGFTdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICBhUmV0dXJuVHlwZSA9IGFTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoYVJldHVyblR5cGUpOwogICAgfQogICAgRGFydFR5cGUgYlJldHVyblR5cGUgPSBiRnVuY3Rpb24ucmV0dXJuVHlwZTsKICAgIGlmIChiU3Vic3RpdHV0aW9uICE9IG51bGwpIHsKICAgICAgYlJldHVyblR5cGUgPSBiU3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGJSZXR1cm5UeXBlKTsKICAgIH0KICAgIGlmIChzdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICBiUmV0dXJuVHlwZSA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShiUmV0dXJuVHlwZSk7CiAgICB9CiAgICBib29sIHJlc3VsdCA9IHRydWU7CiAgICBpZiAoYUZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPiBiRnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgNCIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IGFQb3NpdGlvbmFsID0gYUZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBiUG9zaXRpb25hbCA9IGJGdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyczsKICAgIGlmIChhUG9zaXRpb25hbC5sZW5ndGggPCBiUG9zaXRpb25hbC5sZW5ndGgpIHsKICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwIDUiKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmIChhUmV0dXJuVHlwZSAhPSBiUmV0dXJuVHlwZSkgewogICAgICBpZiAoYS5wYXJlbnQgPT0gY2xzICYmIGEucmV0dXJuVHlwZSA9PSBudWxsKSB7CiAgICAgICAgcmVzdWx0ID0KICAgICAgICAgICAgaW5mZXJSZXR1cm5UeXBlKGNscywgYSwgYlJldHVyblR5cGUsIGhhZFR5cGVzSW5mZXJyZWQsIGhpZXJhcmNoeSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwIDYiKTsKICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYlBvc2l0aW9uYWwubGVuZ3RoOyBpKyspIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBhUGFyYW1ldGVyID0gYVBvc2l0aW9uYWxbaV07CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gYlBhcmFtZXRlciA9IGJQb3NpdGlvbmFsW2ldOwogICAgICBjb3B5UGFyYW1ldGVyQ292YXJpYW5jZShhLnBhcmVudCwgYVBhcmFtZXRlciwgYlBhcmFtZXRlcik7CiAgICAgIERhcnRUeXBlIGFUeXBlID0gYVBhcmFtZXRlci50eXBlOwogICAgICBpZiAoYVN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgYVR5cGUgPSBhU3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGFUeXBlKTsKICAgICAgfQogICAgICBEYXJ0VHlwZSBiVHlwZSA9IGJQYXJhbWV0ZXIudHlwZTsKICAgICAgaWYgKGJTdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICAgIGJUeXBlID0gYlN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShiVHlwZSk7CiAgICAgIH0KICAgICAgaWYgKHN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgYlR5cGUgPSBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoYlR5cGUpOwogICAgICB9CiAgICAgIGlmIChhVHlwZSAhPSBiVHlwZSkgewogICAgICAgIGlmIChhLnBhcmVudCA9PSBjbHMgJiYgYS5mb3JtYWxzW2ldLnR5cGUgPT0gbnVsbCkgewogICAgICAgICAgcmVzdWx0ID0gaW5mZXJQYXJhbWV0ZXJUeXBlKAogICAgICAgICAgICAgIGNscywgYSwgYS5mb3JtYWxzW2ldLCBiVHlwZSwgaGFkVHlwZXNJbmZlcnJlZCwgaGllcmFyY2h5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwIDgiKTsKICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gYU5hbWVkID0gYUZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVyczsKICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gYk5hbWVkID0gYkZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVyczsKICAgIG5hbWVkOgogICAgaWYgKGFOYW1lZC5pc05vdEVtcHR5IHx8IGJOYW1lZC5pc05vdEVtcHR5KSB7CiAgICAgIGlmIChhUG9zaXRpb25hbC5sZW5ndGggIT0gYlBvc2l0aW9uYWwubGVuZ3RoKSB7CiAgICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwIDkiKTsKICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgICBicmVhayBuYW1lZDsKICAgICAgfQogICAgICBpZiAoYUZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgIT0KICAgICAgICAgIGJGdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwIDEwIik7CiAgICAgICAgcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgYnJlYWsgbmFtZWQ7CiAgICAgIH0KCiAgICAgIGFOYW1lZCA9IGFOYW1lZC50b0xpc3QoKS4uc29ydChjb21wYXJlTmFtZWRQYXJhbWV0ZXJzKTsKICAgICAgYk5hbWVkID0gYk5hbWVkLnRvTGlzdCgpLi5zb3J0KGNvbXBhcmVOYW1lZFBhcmFtZXRlcnMpOwogICAgICBpbnQgYUNvdW50ID0gMDsKICAgICAgZm9yIChpbnQgYkNvdW50ID0gMDsgYkNvdW50IDwgYk5hbWVkLmxlbmd0aDsgYkNvdW50KyspIHsKICAgICAgICBTdHJpbmcgbmFtZSA9IGJOYW1lZFtiQ291bnRdLm5hbWU7CiAgICAgICAgZm9yICg7IGFDb3VudCA8IGFOYW1lZC5sZW5ndGg7IGFDb3VudCsrKSB7CiAgICAgICAgICBpZiAoYU5hbWVkW2FDb3VudF0ubmFtZSA9PSBuYW1lKSBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGFDb3VudCA9PSBhTmFtZWQubGVuZ3RoKSB7CiAgICAgICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgMTEiKTsKICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwogICAgICAgICAgYnJlYWsgbmFtZWQ7CiAgICAgICAgfQogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gYVBhcmFtZXRlciA9IGFOYW1lZFthQ291bnRdOwogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gYlBhcmFtZXRlciA9IGJOYW1lZFtiQ291bnRdOwogICAgICAgIGNvcHlQYXJhbWV0ZXJDb3ZhcmlhbmNlKGEucGFyZW50LCBhUGFyYW1ldGVyLCBiUGFyYW1ldGVyKTsKICAgICAgICBEYXJ0VHlwZSBhVHlwZSA9IGFQYXJhbWV0ZXIudHlwZTsKICAgICAgICBpZiAoYVN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgICBhVHlwZSA9IGFTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoYVR5cGUpOwogICAgICAgIH0KICAgICAgICBEYXJ0VHlwZSBiVHlwZSA9IGJQYXJhbWV0ZXIudHlwZTsKICAgICAgICBpZiAoYlN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgICBiVHlwZSA9IGJTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoYlR5cGUpOwogICAgICAgIH0KICAgICAgICBpZiAoc3Vic3RpdHV0aW9uICE9IG51bGwpIHsKICAgICAgICAgIGJUeXBlID0gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGJUeXBlKTsKICAgICAgICB9CiAgICAgICAgaWYgKGFUeXBlICE9IGJUeXBlKSB7CiAgICAgICAgICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIHBhcmFtZXRlcjsKICAgICAgICAgIGZvciAoaW50IGkgPSBhUG9zaXRpb25hbC5sZW5ndGg7IGkgPCBhLmZvcm1hbHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgaWYgKGEuZm9ybWFsc1tpXS5uYW1lID09IG5hbWUpIHsKICAgICAgICAgICAgICBwYXJhbWV0ZXIgPSBhLmZvcm1hbHNbaV07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChhLnBhcmVudCA9PSBjbHMgJiYgcGFyYW1ldGVyLnR5cGUgPT0gbnVsbCkgewogICAgICAgICAgICByZXN1bHQgPSBpbmZlclBhcmFtZXRlclR5cGUoCiAgICAgICAgICAgICAgICBjbHMsIGEsIHBhcmFtZXRlciwgYlR5cGUsIGhhZFR5cGVzSW5mZXJyZWQsIGhpZXJhcmNoeSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgMTIiKTsKICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBkZWJ1Zz8ubG9nKCJJbmZlcnJpbmcgdHlwZXMgZm9yICR7ZnVsbE5hbWUoYSl9IGJhc2VkIG9uICR7ZnVsbE5hbWUoYil9ICIgKwogICAgICAgIChyZXN1bHQgPyAic3VjY2VlZGVkLiIgOiAiZmFpbGVkLiIpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBib29sIGluZmVyR2V0dGVyVHlwZShQcm9jZWR1cmVCdWlsZGVyIGEsIERlY2xhcmF0aW9uIGIpIHsKICAgIGRlYnVnPy5sb2coCiAgICAgICAgIkluZmVycmluZyBnZXR0ZXIgdHlwZXMgZm9yICR7ZnVsbE5hbWUoYSl9IGJhc2VkIG9uICR7ZnVsbE5hbWUoYil9Iik7CiAgICBNZW1iZXIgYlRhcmdldCA9IGIudGFyZ2V0OwogICAgRGFydFR5cGUgYlR5cGU7CiAgICBpZiAoYlRhcmdldCBpcyBGaWVsZCkgewogICAgICBiVHlwZSA9IGJUYXJnZXQudHlwZTsKICAgIH0gZWxzZSBpZiAoYlRhcmdldCBpcyBQcm9jZWR1cmUpIHsKICAgICAgaWYgKGIuaXNTZXR0ZXIpIHsKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGJQYXJhbWV0ZXIgPQogICAgICAgICAgICBiVGFyZ2V0LmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLnNpbmdsZTsKICAgICAgICBiVHlwZSA9IGJQYXJhbWV0ZXIudHlwZTsKICAgICAgICBpZiAoIWhhc0V4cGxpY2l0bHlUeXBlZEZvcm1hbFBhcmFtZXRlcihiLCAwKSkgewogICAgICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwICh0eXBlIG1heSBiZSBpbmZlcnJlZCkiKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYi5pc0dldHRlcikgewogICAgICAgIGJUeXBlID0gYlRhcmdldC5mdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgICAgIGlmICghaGFzRXhwbGljaXRSZXR1cm5UeXBlKGIpKSB7CiAgICAgICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgKHJldHVybiB0eXBlIG1heSBiZSBpbmZlcnJlZCkiKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwIChub3QgYWNjZXNzb3I6ICR7YlRhcmdldC5raW5kfSkiKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGRlYnVnPy5sb2coIkdpdmluZyB1cCAobm90IGZpZWxkL3Byb2NlZHVyZTogJHtiVGFyZ2V0LnJ1bnRpbWVUeXBlfSkiKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIGEudGFyZ2V0LmZ1bmN0aW9uLnJldHVyblR5cGUgPT0gYlR5cGU7CiAgfQoKICBib29sIGluZmVyU2V0dGVyVHlwZShQcm9jZWR1cmVCdWlsZGVyIGEsIERlY2xhcmF0aW9uIGIpIHsKICAgIGRlYnVnPy5sb2coCiAgICAgICAgIkluZmVycmluZyBzZXR0ZXIgdHlwZXMgZm9yICR7ZnVsbE5hbWUoYSl9IGJhc2VkIG9uICR7ZnVsbE5hbWUoYil9Iik7CiAgICBNZW1iZXIgYlRhcmdldCA9IGIudGFyZ2V0OwogICAgUHJvY2VkdXJlIGFQcm9jZWR1cmUgPSBhLnRhcmdldDsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gYVBhcmFtZXRlciA9CiAgICAgICAgYVByb2NlZHVyZS5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5zaW5nbGU7CiAgICBEYXJ0VHlwZSBiVHlwZTsKICAgIGlmIChiVGFyZ2V0IGlzIEZpZWxkKSB7CiAgICAgIGJUeXBlID0gYlRhcmdldC50eXBlOwogICAgICBjb3B5UGFyYW1ldGVyQ292YXJpYW5jZUZyb21GaWVsZChhLnBhcmVudCwgYVBhcmFtZXRlciwgYlRhcmdldCk7CiAgICB9CiAgICBpZiAoYlRhcmdldCBpcyBQcm9jZWR1cmUpIHsKICAgICAgaWYgKGIuaXNTZXR0ZXIpIHsKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGJQYXJhbWV0ZXIgPQogICAgICAgICAgICBiVGFyZ2V0LmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLnNpbmdsZTsKICAgICAgICBiVHlwZSA9IGJQYXJhbWV0ZXIudHlwZTsKICAgICAgICBjb3B5UGFyYW1ldGVyQ292YXJpYW5jZShhLnBhcmVudCwgYVBhcmFtZXRlciwgYlBhcmFtZXRlcik7CiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdGx5VHlwZWRGb3JtYWxQYXJhbWV0ZXIoYiwgMCkgfHwKICAgICAgICAgICAgIWhhc0V4cGxpY2l0bHlUeXBlZEZvcm1hbFBhcmFtZXRlcihhLCAwKSkgewogICAgICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwICh0eXBlIG1heSBiZSBpbmZlcnJlZCkiKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYi5pc0dldHRlcikgewogICAgICAgIGJUeXBlID0gYlRhcmdldC5mdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgICAgIGlmICghaGFzRXhwbGljaXRSZXR1cm5UeXBlKGIpKSB7CiAgICAgICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgKHJldHVybiB0eXBlIG1heSBiZSBpbmZlcnJlZCkiKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwIChub3QgYWNjZXNzb3I6ICR7YlRhcmdldC5raW5kfSkiKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGRlYnVnPy5sb2coIkdpdmluZyB1cCAobm90IGZpZWxkL3Byb2NlZHVyZTogJHtiVGFyZ2V0LnJ1bnRpbWVUeXBlfSkiKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIGFQYXJhbWV0ZXIudHlwZSA9PSBiVHlwZTsKICB9CgogIHZvaWQgY2hlY2tWYWxpZE92ZXJyaWRlKERlY2xhcmF0aW9uIGEsIERlY2xhcmF0aW9uIGIpIHsKICAgIGRlYnVnPy5sb2coCiAgICAgICAgImNoZWNrVmFsaWRPdmVycmlkZSgke2Z1bGxOYW1lKGEpfSwgJHtmdWxsTmFtZShiKX0pICR7YS5ydW50aW1lVHlwZX0iKTsKICAgIGlmIChhIGlzIFByb2NlZHVyZUJ1aWxkZXIpIHsKICAgICAgaWYgKGluZmVyTWV0aG9kVHlwZXMoYSwgYikpIHJldHVybjsKICAgIH0gZWxzZSBpZiAoYS5pc0ZpZWxkKSB7CiAgICAgIGlmIChpbmZlckZpZWxkVHlwZXMoYSwgYikpIHJldHVybjsKICAgIH0KICAgIE1lbWJlciBhVGFyZ2V0ID0gYS50YXJnZXQ7CiAgICBNZW1iZXIgYlRhcmdldCA9IGIudGFyZ2V0OwogICAgaWYgKGFUYXJnZXQgaXMgUHJvY2VkdXJlICYmICFhVGFyZ2V0LmlzQWNjZXNzb3IgJiYgYlRhcmdldCBpcyBQcm9jZWR1cmUpIHsKICAgICAgaWYgKGhhc1NhbWVTaWduYXR1cmUoYVRhcmdldC5mdW5jdGlvbiwgYlRhcmdldC5mdW5jdGlvbikpIHJldHVybjsKICAgIH0KCiAgICBpZiAoYiBpcyBEZWxheWVkTWVtYmVyKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYi5kZWNsYXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBoaWVyYXJjaHkub3ZlcnJpZGVDaGVja3MKICAgICAgICAgICAgLmFkZChuZXcgRGVsYXllZE92ZXJyaWRlQ2hlY2soY2xzLCBhLCBiLmRlY2xhcmF0aW9uc1tpXSkpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBoaWVyYXJjaHkub3ZlcnJpZGVDaGVja3MuYWRkKG5ldyBEZWxheWVkT3ZlcnJpZGVDaGVjayhjbHMsIGEsIGIpKTsKICAgIH0KICB9CgogIGJvb2wgaW5mZXJGaWVsZFR5cGVzKE1lbWJlckJ1aWxkZXIgYSwgRGVjbGFyYXRpb24gYikgewogICAgZGVidWc/LmxvZygKICAgICAgICAiVHJ5aW5nIHRvIGluZmVyIGZpZWxkIHR5cGVzIGZvciAke2Z1bGxOYW1lKGEpfSBiYXNlZCBvbiAke2Z1bGxOYW1lKGIpfSIpOwogICAgaWYgKGIgaXMgRGVsYXllZE1lbWJlcikgewogICAgICBib29sIGhhc1NhbWVTaWduYXR1cmUgPSB0cnVlOwogICAgICBMaXN0PERlY2xhcmF0aW9uPiBkZWNsYXJhdGlvbnMgPSBiLmRlY2xhcmF0aW9uczsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNsYXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoIWluZmVyRmllbGRUeXBlcyhhLCBkZWNsYXJhdGlvbnNbaV0pKSB7CiAgICAgICAgICBoYXNTYW1lU2lnbmF0dXJlID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBoYXNTYW1lU2lnbmF0dXJlOwogICAgfQogICAgTWVtYmVyIGJUYXJnZXQgPSBiLnRhcmdldDsKICAgIERhcnRUeXBlIGluaGVyaXRlZFR5cGU7CiAgICBpZiAoYlRhcmdldCBpcyBQcm9jZWR1cmUpIHsKICAgICAgaWYgKGJUYXJnZXQuaXNTZXR0ZXIpIHsKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9CiAgICAgICAgICAgIGJUYXJnZXQuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMuc2luZ2xlOwogICAgICAgIC8vIGluaGVyaXRlZFR5cGUgPSBwYXJhbWV0ZXIudHlwZTsKICAgICAgICBjb3B5RmllbGRDb3ZhcmlhbmNlRnJvbVBhcmFtZXRlcihhLnBhcmVudCwgYS50YXJnZXQsIHBhcmFtZXRlcik7CiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdGx5VHlwZWRGb3JtYWxQYXJhbWV0ZXIoYiwgMCkpIHsKICAgICAgICAgIGRlYnVnPy5sb2coIkdpdmluZyB1cCAodHlwZSBtYXkgYmUgaW5mZXJyZWQpIik7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGJUYXJnZXQuaXNHZXR0ZXIpIHsKICAgICAgICBpZiAoIWhhc0V4cGxpY2l0UmV0dXJuVHlwZShiKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGluaGVyaXRlZFR5cGUgPSBiVGFyZ2V0LmZ1bmN0aW9uLnJldHVyblR5cGU7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYlRhcmdldCBpcyBGaWVsZCkgewogICAgICBjb3B5RmllbGRDb3ZhcmlhbmNlKGEucGFyZW50LCBhLnRhcmdldCwgYlRhcmdldCk7CiAgICAgIGluaGVyaXRlZFR5cGUgPSBiVGFyZ2V0LnR5cGU7CiAgICB9CiAgICBpZiAoaW5oZXJpdGVkVHlwZSA9PSBudWxsKSB7CiAgICAgIGRlYnVnPy5sb2coIkdpdmluZyB1cCAoaW5oZXJpdGVkVHlwZSA9PSBudWxsKVxuJHtTdGFja1RyYWNlLmN1cnJlbnR9Iik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIENsYXNzQnVpbGRlciBhQ2xzID0gYS5wYXJlbnQ7CiAgICBTdWJzdGl0dXRpb24gYVN1YnN0aXR1dGlvbjsKICAgIGlmIChjbHMgIT0gYUNscykgewogICAgICBhc3NlcnQoc3Vic3RpdHV0aW9ucy5jb250YWluc0tleShhQ2xzLnRhcmdldCksCiAgICAgICAgICAiJHtjbHMuZnVsbE5hbWVGb3JFcnJvcnN9ICR7YUNscy5mdWxsTmFtZUZvckVycm9yc30iKTsKICAgICAgYVN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbnNbYUNscy50YXJnZXRdOwogICAgICBkZWJ1Zz8ubG9nKAogICAgICAgICAgIiR7Y2xzLmZ1bGxOYW1lRm9yRXJyb3JzfSAtPiAke2FDbHMuZnVsbE5hbWVGb3JFcnJvcnN9ICRhU3Vic3RpdHV0aW9uIik7CiAgICB9CiAgICBDbGFzc0J1aWxkZXIgYkNscyA9IGIucGFyZW50OwogICAgU3Vic3RpdHV0aW9uIGJTdWJzdGl0dXRpb247CiAgICBpZiAoY2xzICE9IGJDbHMpIHsKICAgICAgYXNzZXJ0KHN1YnN0aXR1dGlvbnMuY29udGFpbnNLZXkoYkNscy50YXJnZXQpLAogICAgICAgICAgIiR7Y2xzLmZ1bGxOYW1lRm9yRXJyb3JzfSAke2JDbHMuZnVsbE5hbWVGb3JFcnJvcnN9Iik7CiAgICAgIGJTdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb25zW2JDbHMudGFyZ2V0XTsKICAgICAgZGVidWc/LmxvZygKICAgICAgICAgICIke2Nscy5mdWxsTmFtZUZvckVycm9yc30gLT4gJHtiQ2xzLmZ1bGxOYW1lRm9yRXJyb3JzfSAkYlN1YnN0aXR1dGlvbiIpOwogICAgfQogICAgaWYgKGJTdWJzdGl0dXRpb24gIT0gbnVsbCAmJiBpbmhlcml0ZWRUeXBlIGlzISBJbXBsaWNpdEZpZWxkVHlwZSkgewogICAgICBpbmhlcml0ZWRUeXBlID0gYlN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShpbmhlcml0ZWRUeXBlKTsKICAgIH0KCiAgICBEYXJ0VHlwZSBkZWNsYXJlZFR5cGUgPSBhLnRhcmdldC50eXBlOwogICAgaWYgKGFTdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICBkZWNsYXJlZFR5cGUgPSBhU3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGRlY2xhcmVkVHlwZSk7CiAgICB9CiAgICBpZiAoZGVjbGFyZWRUeXBlID09IGluaGVyaXRlZFR5cGUpIHJldHVybiB0cnVlOwoKICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CiAgICBpZiAoYSBpcyBLZXJuZWxGaWVsZEJ1aWxkZXIpIHsKICAgICAgaWYgKGEucGFyZW50ID09IGNscyAmJiBhLnR5cGUgPT0gbnVsbCkgewogICAgICAgIGlmIChhLmhhZFR5cGVzSW5mZXJyZWQpIHsKICAgICAgICAgIHJlcG9ydENhbnRJbmZlckZpZWxkVHlwZShjbHMsIGEpOwogICAgICAgICAgaW5oZXJpdGVkVHlwZSA9IGNvbnN0IEludmFsaWRUeXBlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdCA9IHRydWU7CiAgICAgICAgICBhLmhhZFR5cGVzSW5mZXJyZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoaW5oZXJpdGVkVHlwZSBpcyBJbXBsaWNpdEZpZWxkVHlwZSkgewogICAgICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGNscy5saWJyYXJ5OwogICAgICAgICAgKGxpYnJhcnkuaW1wbGljaXRseVR5cGVkRmllbGRzID8/PSA8S2VybmVsRmllbGRCdWlsZGVyPltdKS5hZGQoYSk7CiAgICAgICAgfQogICAgICAgIGEudGFyZ2V0LnR5cGUgPSBpbmhlcml0ZWRUeXBlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBjb3B5UGFyYW1ldGVyQ292YXJpYW5jZShEZWNsYXJhdGlvbiBwYXJlbnQsCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gYVBhcmFtZXRlciwgVmFyaWFibGVEZWNsYXJhdGlvbiBiUGFyYW1ldGVyKSB7CiAgICBpZiAocGFyZW50ID09IGNscykgewogICAgICBpZiAoYlBhcmFtZXRlci5pc0NvdmFyaWFudCkgewogICAgICAgIGFQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChiUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICBhUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGNvcHlQYXJhbWV0ZXJDb3ZhcmlhbmNlRnJvbUZpZWxkKAogICAgICBEZWNsYXJhdGlvbiBwYXJlbnQsIFZhcmlhYmxlRGVjbGFyYXRpb24gYVBhcmFtZXRlciwgRmllbGQgYkZpZWxkKSB7CiAgICBpZiAocGFyZW50ID09IGNscykgewogICAgICBpZiAoYkZpZWxkLmlzQ292YXJpYW50KSB7CiAgICAgICAgYVBhcmFtZXRlci5pc0NvdmFyaWFudCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKGJGaWVsZC5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKSB7CiAgICAgICAgYVBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBjb3B5RmllbGRDb3ZhcmlhbmNlKERlY2xhcmF0aW9uIHBhcmVudCwgRmllbGQgYUZpZWxkLCBGaWVsZCBiRmllbGQpIHsKICAgIGlmIChwYXJlbnQgPT0gY2xzKSB7CiAgICAgIGlmIChiRmllbGQuaXNDb3ZhcmlhbnQpIHsKICAgICAgICBhRmllbGQuaXNDb3ZhcmlhbnQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChiRmllbGQuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgIGFGaWVsZC5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBjb3B5RmllbGRDb3ZhcmlhbmNlRnJvbVBhcmFtZXRlcigKICAgICAgRGVjbGFyYXRpb24gcGFyZW50LCBGaWVsZCBhRmllbGQsIFZhcmlhYmxlRGVjbGFyYXRpb24gYlBhcmFtZXRlcikgewogICAgaWYgKHBhcmVudCA9PSBjbHMpIHsKICAgICAgaWYgKGJQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQpIHsKICAgICAgICBhRmllbGQuaXNDb3ZhcmlhbnQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChiUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICBhRmllbGQuaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgY29weVR5cGVQYXJhbWV0ZXJDb3ZhcmlhbmNlKAogICAgICBEZWNsYXJhdGlvbiBwYXJlbnQsIFR5cGVQYXJhbWV0ZXIgYVBhcmFtZXRlciwgVHlwZVBhcmFtZXRlciBiUGFyYW1ldGVyKSB7CiAgICBpZiAocGFyZW50ID09IGNscykgewogICAgICBpZiAoYlBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKSB7CiAgICAgICAgYVBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCByZXBvcnRJbmhlcml0YW5jZUNvbmZsaWN0KERlY2xhcmF0aW9uIGEsIERlY2xhcmF0aW9uIGIpIHsKICAgIFN0cmluZyBuYW1lID0gYS5mdWxsTmFtZUZvckVycm9yczsKICAgIGlmIChhLnBhcmVudCAhPSBiLnBhcmVudCkgewogICAgICBpZiAoYS5wYXJlbnQgPT0gY2xzKSB7CiAgICAgICAgY2xzLmFkZFByb2JsZW0obWVzc2FnZURlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlciwKICAgICAgICAgICAgYS5jaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCwKICAgICAgICAgICAgY29udGV4dDogPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICAgICAgICBtZXNzYWdlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2F1c2UKICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihiLmZpbGVVcmksIGIuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpCiAgICAgICAgICAgIF0pOwogICAgICB9IGVsc2UgewogICAgICAgIGNscy5hZGRQcm9ibGVtKG1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3QsIGNscy5jaGFyT2Zmc2V0LAogICAgICAgICAgICBjbHMuZnVsbE5hbWVGb3JFcnJvcnMubGVuZ3RoLAogICAgICAgICAgICBjb250ZXh0OiBpbmhlcml0ZWRDb25mbGljdENvbnRleHQoYSwgYikpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGEuaXNTdGF0aWMgIT0gYi5pc1N0YXRpYykgewogICAgICBEZWNsYXJhdGlvbiBzdGF0aWNNZW1iZXI7CiAgICAgIERlY2xhcmF0aW9uIGluc3RhbmNlTWVtYmVyOwogICAgICBpZiAoYS5pc1N0YXRpYykgewogICAgICAgIHN0YXRpY01lbWJlciA9IGE7CiAgICAgICAgaW5zdGFuY2VNZW1iZXIgPSBiOwogICAgICB9IGVsc2UgewogICAgICAgIHN0YXRpY01lbWJlciA9IGI7CiAgICAgICAgaW5zdGFuY2VNZW1iZXIgPSBhOwogICAgICB9CiAgICAgIGNscy5saWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3QsCiAgICAgICAgICBzdGF0aWNNZW1iZXIuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgsIHN0YXRpY01lbWJlci5maWxlVXJpLAogICAgICAgICAgY29udGV4dDogPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICAgICAgbWVzc2FnZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RDYXVzZS53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICBpbnN0YW5jZU1lbWJlci5maWxlVXJpLCBpbnN0YW5jZU1lbWJlci5jaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCkKICAgICAgICAgIF0pOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhpcyBtZXNzYWdlIGNhbiBiZSByZXBvcnRlZCB0d2ljZSAod2hlbiBtZXJnaW5nIGxvY2FsTWVtYmVycyB3aXRoCiAgICAgIC8vIGNsYXNzU2V0dGVycywgb3IgbG9jYWxTZXR0ZXJzIHdpdGggY2xhc3NNZW1iZXJzKS4gQnkgZW5zdXJpbmcgdGhhdAogICAgICAvLyB3ZSBhbHdheXMgcmVwb3J0IHRoZSBvbmUgd2l0aCBoaWdoZXIgY2hhck9mZnNldCBhcyB0aGUgZHVwbGljYXRlLAogICAgICAvLyB0aGUgbWVzc2FnZSBkdXBsaWNhdGlvbiBsb2dpYyBlbnN1cmVzIHRoYXQgd2Ugb25seSByZXBvcnQgdGhpcwogICAgICAvLyBwcm9ibGVtIG9uY2UuCiAgICAgIERlY2xhcmF0aW9uIGV4aXN0aW5nOwogICAgICBEZWNsYXJhdGlvbiBkdXBsaWNhdGU7CiAgICAgIGFzc2VydChhLmZpbGVVcmkgPT0gYi5maWxlVXJpKTsKICAgICAgaWYgKGEuY2hhck9mZnNldCA8IGIuY2hhck9mZnNldCkgewogICAgICAgIGV4aXN0aW5nID0gYTsKICAgICAgICBkdXBsaWNhdGUgPSBiOwogICAgICB9IGVsc2UgewogICAgICAgIGV4aXN0aW5nID0gYjsKICAgICAgICBkdXBsaWNhdGUgPSBhOwogICAgICB9CiAgICAgIGNscy5saWJyYXJ5LmFkZFByb2JsZW0odGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24ud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIGR1cGxpY2F0ZS5jaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCwgZHVwbGljYXRlLmZpbGVVcmksCiAgICAgICAgICBjb250ZXh0OiA8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlLndpdGhBcmd1bWVudHMobmFtZSkud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgZXhpc3RpbmcuZmlsZVVyaSwgZXhpc3RpbmcuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpCiAgICAgICAgICBdKTsKICAgIH0KICB9CgogIC8vLyBXaGVuIG1lcmdpbmcgYGFMaXN0YCBhbmQgYGJMaXN0YCwgW21lbWJlcl0gd2FzIG9ubHkgZm91bmQgaW4gYGFMaXN0YC4KICAvLy8KICAvLy8gSWYgW21lcmdlS2luZF0gaXMgYE1lcmdlS2luZC5zdXBlcmNsYXNzYCBbbWVtYmVyXSBpcyBkZWNsYXJlZCBpbiBjdXJyZW50CiAgLy8vIGNsYXNzLCBhbmQgaXNuJ3Qgb3ZlcnJpZGluZyBhIG1ldGhvZCBmcm9tIHRoZSBzdXBlcmNsYXNzLgogIC8vLwogIC8vLyBJZiBbbWVyZ2VLaW5kXSBpcyBgTWVyZ2VLaW5kLmludGVyZmFjZXNgLCBbbWVtYmVyXSBpcyBpZ25vcmVkIGZvciBub3cuCiAgLy8vCiAgLy8vIElmIFttZXJnZUtpbmRdIGlzIGBNZXJnZUtpbmQuc3VwZXJ0eXBlc2AsIFttZW1iZXJdIGlzbid0CiAgLy8vIGltcGxlbWVudGluZy9vdmVycmlkaW5nIGFueXRoaW5nLgogIHZvaWQgaGFuZGxlT25seUEoRGVjbGFyYXRpb24gbWVtYmVyLCBNZXJnZUtpbmQgbWVyZ2VLaW5kKSB7CiAgICBpZiAobWVyZ2VLaW5kID09IE1lcmdlS2luZC5pbnRlcmZhY2VzTWVtYmVycyB8fAogICAgICAgIG1lcmdlS2luZCA9PSBNZXJnZUtpbmQuaW50ZXJmYWNlc1NldHRlcnMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gVE9ETyhhaGUpOiBFbmFibGUgdGhpcyBvcHRpbWl6YXRpb246CiAgICAvLyBpZiAoY2xzIGlzIERpbGxDbGFzc0J1aWxkZXIpIHJldHVybjsKICAgIC8vIGFzc2VydChtZXJnZUtpbmQgPT0gTWVyZ2VLaW5kLmludGVyZmFjZXMgfHwgbWVtYmVyIGlzISBJbnRlcmZhY2VDb25mbGljdCk7CiAgICBpZiAoKG1lcmdlS2luZCA9PSBNZXJnZUtpbmQuc3VwZXJjbGFzc01lbWJlcnMgfHwKICAgICAgICAgICAgbWVyZ2VLaW5kID09IE1lcmdlS2luZC5zdXBlcmNsYXNzU2V0dGVycykgJiYKICAgICAgICBpc0Fic3RyYWN0KG1lbWJlcikpIHsKICAgICAgcmVjb3JkQWJzdHJhY3RNZW1iZXIobWVtYmVyKTsKICAgIH0KICB9CgogIC8vLyBXaGVuIG1lcmdpbmcgYGFMaXN0YCBhbmQgYGJMaXN0YCwgW21lbWJlcl0gd2FzIG9ubHkgZm91bmQgaW4gYGJMaXN0YC4KICAvLy8KICAvLy8gSWYgW21lcmdlS2luZF0gaXMgYE1lcmdlS2luZC5zdXBlcmNsYXNzYCBbbWVtYmVyXSBpcyBiZWluZyBpbmhlcml0ZWQgZnJvbQogIC8vLyBhIHN1cGVyY2xhc3MuCiAgLy8vCiAgLy8vIElmIFttZXJnZUtpbmRdIGlzIGBNZXJnZUtpbmQuaW50ZXJmYWNlc2AsIFttZW1iZXJdIGlzIGlnbm9yZWQgZm9yIG5vdy4KICAvLy8KICAvLy8gSWYgW21lcmdlS2luZF0gaXMgYE1lcmdlS2luZC5zdXBlcnR5cGVzYCwgW21lbWJlcl0gaXMgaW1wbGljaXRseQogIC8vLyBhYnN0cmFjdCwgYW5kIG5vdCBpbXBsZW1lbnRlZC4KICBEZWNsYXJhdGlvbiBoYW5kbGVPbmx5QihEZWNsYXJhdGlvbiBtZW1iZXIsIE1lcmdlS2luZCBtZXJnZUtpbmQpIHsKICAgIGlmIChtZXJnZUtpbmQgPT0gTWVyZ2VLaW5kLmludGVyZmFjZXNNZW1iZXJzIHx8CiAgICAgICAgbWVyZ2VLaW5kID09IE1lcmdlS2luZC5pbnRlcmZhY2VzU2V0dGVycykgewogICAgICByZXR1cm4gbWVtYmVyOwogICAgfQogICAgLy8gVE9ETyhhaGUpOiBFbmFibGUgdGhpcyBvcHRpbWl6YXRpb246CiAgICAvLyBpZiAoY2xzIGlzIERpbGxDbGFzc0J1aWxkZXIpIHJldHVybiBtZW1iZXI7CiAgICBNZW1iZXIgdGFyZ2V0ID0gbWVtYmVyLnRhcmdldDsKICAgIGlmICgobWVyZ2VLaW5kID09IE1lcmdlS2luZC5zdXBlcnR5cGVzTWVtYmVycyB8fAogICAgICAgICAgICBtZXJnZUtpbmQgPT0gTWVyZ2VLaW5kLnN1cGVydHlwZXNTZXR0ZXJzKSB8fAogICAgICAgICgobWVyZ2VLaW5kID09IE1lcmdlS2luZC5zdXBlcmNsYXNzTWVtYmVycyB8fAogICAgICAgICAgICAgICAgbWVyZ2VLaW5kID09IE1lcmdlS2luZC5zdXBlcmNsYXNzU2V0dGVycykgJiYKICAgICAgICAgICAgdGFyZ2V0LmlzQWJzdHJhY3QpKSB7CiAgICAgIGlmIChpc05hbWVWaXNpYmxlSW4odGFyZ2V0Lm5hbWUsIGNscy5saWJyYXJ5KSkgewogICAgICAgIHJlY29yZEFic3RyYWN0TWVtYmVyKG1lbWJlcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChtZXJnZUtpbmQgPT0gTWVyZ2VLaW5kLnN1cGVyY2xhc3NNZW1iZXJzICYmCiAgICAgICAgdGFyZ2V0LmVuY2xvc2luZ0NsYXNzICE9IG9iamVjdENsYXNzLmNscyAmJgogICAgICAgIHRhcmdldC5uYW1lID09IG5vU3VjaE1ldGhvZE5hbWUpIHsKICAgICAgaGFzTm9TdWNoTWV0aG9kID0gdHJ1ZTsKICAgIH0KICAgIGlmIChtZXJnZUtpbmQgIT0gTWVyZ2VLaW5kLm1lbWJlcnNXaXRoU2V0dGVycyAmJgogICAgICAgIG1lcmdlS2luZCAhPSBNZXJnZUtpbmQuc2V0dGVyc1dpdGhNZW1iZXJzICYmCiAgICAgICAgbWVtYmVyIGlzIERlbGF5ZWRNZW1iZXIgJiYKICAgICAgICBtZW1iZXIuaXNJbmhlcml0YWJsZUNvbmZsaWN0KSB7CiAgICAgIGhpZXJhcmNoeS5kZWxheWVkTWVtYmVyQ2hlY2tzLmFkZChtZW1iZXIud2l0aFBhcmVudChjbHMpKTsKICAgIH0KICAgIHJldHVybiBtZW1iZXI7CiAgfQoKICB2b2lkIHJlY29yZEFic3RyYWN0TWVtYmVyKERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgYWJzdHJhY3RNZW1iZXJzID8/PSA8RGVjbGFyYXRpb24+W107CiAgICBpZiAobWVtYmVyIGlzIERlbGF5ZWRNZW1iZXIpIHsKICAgICAgYWJzdHJhY3RNZW1iZXJzLmFkZEFsbChtZW1iZXIuZGVjbGFyYXRpb25zKTsKICAgIH0gZWxzZSB7CiAgICAgIGFic3RyYWN0TWVtYmVycy5hZGQobWVtYmVyKTsKICAgIH0KICB9CgogIENsYXNzSGllcmFyY2h5Tm9kZSBidWlsZCgpIHsKICAgIGFzc2VydCghY2xzLmlzUGF0Y2gpOwogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIHN1cGVybm9kZTsKICAgIGlmIChvYmplY3RDbGFzcyAhPSBjbHMub3JpZ2luKSB7CiAgICAgIHN1cGVybm9kZSA9IGhpZXJhcmNoeS5nZXROb2RlRnJvbVR5cGUoY2xzLnN1cGVydHlwZSk7CiAgICAgIGlmIChzdXBlcm5vZGUgPT0gbnVsbCkgewogICAgICAgIHN1cGVybm9kZSA9IGhpZXJhcmNoeS5nZXROb2RlRnJvbUNsYXNzKG9iamVjdENsYXNzKTsKICAgICAgfQogICAgICBhc3NlcnQoc3VwZXJub2RlICE9IG51bGwpOwogICAgfQoKICAgIFNjb3BlIHNjb3BlID0gY2xzLnNjb3BlOwogICAgaWYgKGNscy5pc01peGluQXBwbGljYXRpb24pIHsKICAgICAgRGVjbGFyYXRpb24gbWl4aW4gPSBjbHMubWl4ZWRJblR5cGUuZGVjbGFyYXRpb247CiAgICAgIGluZmVyTWl4aW5BcHBsaWNhdGlvbigpOwogICAgICAvLyByZWNvcmRTdXBlcnR5cGUoY2xzLm1peGVkSW5UeXBlKTsKICAgICAgd2hpbGUgKG1peGluLmlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgQ2xhc3NCdWlsZGVyIG5hbWVkID0gbWl4aW47CiAgICAgICAgLy8gcmVjb3JkU3VwZXJ0eXBlKG5hbWVkLm1peGVkSW5UeXBlKTsKICAgICAgICBtaXhpbiA9IG5hbWVkLm1peGVkSW5UeXBlLmRlY2xhcmF0aW9uOwogICAgICB9CiAgICAgIGlmIChtaXhpbiBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgICBzY29wZSA9IG1peGluLnNjb3BlLmNvbXB1dGVNaXhpblNjb3BlKCk7CiAgICAgIH0KICAgIH0KCiAgICAvLy8gTWVtYmVycyAoZXhjbHVkaW5nIHNldHRlcnMpIGRlY2xhcmVkIGluIFtjbHNdLgogICAgTGlzdDxEZWNsYXJhdGlvbj4gbG9jYWxNZW1iZXJzID0KICAgICAgICBuZXcgTGlzdDxEZWNsYXJhdGlvbj4uZnJvbShzY29wZS5sb2NhbC52YWx1ZXMpCiAgICAgICAgICAuLnNvcnQoY29tcGFyZURlY2xhcmF0aW9ucyk7CgogICAgLy8vIFNldHRlcnMgZGVjbGFyZWQgaW4gW2Nsc10uCiAgICBMaXN0PERlY2xhcmF0aW9uPiBsb2NhbFNldHRlcnMgPQogICAgICAgIG5ldyBMaXN0PERlY2xhcmF0aW9uPi5mcm9tKHNjb3BlLnNldHRlcnMudmFsdWVzKQogICAgICAgICAgLi5zb3J0KGNvbXBhcmVEZWNsYXJhdGlvbnMpOwoKICAgIC8vIEFkZCBpbXBsaWVkIHNldHRlcnMgZnJvbSBmaWVsZHMgaW4gW2xvY2FsTWVtYmVyc10uCiAgICBsb2NhbFNldHRlcnMgPSBtZXJnZUFjY2Vzc29ycyhsb2NhbE1lbWJlcnMsIGxvY2FsU2V0dGVycyk7CgogICAgLy8vIE1lbWJlcnMgKGV4Y2x1ZGluZyBzZXR0ZXJzKSBkZWNsYXJlZCBpbiBbY2xzXSBvciBpdHMgc3VwZXJjbGFzc2VzLiBUaGlzCiAgICAvLy8gaW5jbHVkZXMgc3RhdGljIG1ldGhvZHMgb2YgW2Nsc10sIGJ1dCBub3QgaXRzIHN1cGVyY2xhc3Nlcy4KICAgIExpc3Q8RGVjbGFyYXRpb24+IGNsYXNzTWVtYmVyczsKCiAgICAvLy8gU2V0dGVycyBkZWNsYXJlZCBpbiBbY2xzXSBvciBpdHMgc3VwZXJjbGFzc2VzLiBUaGlzIGluY2x1ZGVzIHN0YXRpYwogICAgLy8vIHNldHRlcnMgb2YgW2Nsc10sIGJ1dCBub3QgaXRzIHN1cGVyY2xhc3Nlcy4KICAgIExpc3Q8RGVjbGFyYXRpb24+IGNsYXNzU2V0dGVyczsKCiAgICAvLy8gTWVtYmVycyAoZXhjbHVkaW5nIHNldHRlcnMpIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZXMuIFRoaXMgY29udGFpbnMgbm8gc3RhdGljCiAgICAvLy8gbWVtYmVycy4gSXMgbnVsbCBpZiBubyBpbnRlcmZhY2VzIGFyZSBpbXBsZW1lbnRlZCBieSB0aGlzIGNsYXNzIG9yIGl0cwogICAgLy8vIHN1cGVyY2xhc3Nlcy4KICAgIExpc3Q8RGVjbGFyYXRpb24+IGludGVyZmFjZU1lbWJlcnM7CgogICAgLy8vIFNldHRlcnMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlcy4gVGhpcyBjb250YWlucyBubyBzdGF0aWMgc2V0dGVycy4gSXMKICAgIC8vLyBudWxsIGlmIG5vIGludGVyZmFjZXMgYXJlIGltcGxlbWVudGVkIGJ5IHRoaXMgY2xhc3Mgb3IgaXRzCiAgICAvLy8gc3VwZXJjbGFzc2VzLgogICAgTGlzdDxEZWNsYXJhdGlvbj4gaW50ZXJmYWNlU2V0dGVyczsKCiAgICBMaXN0PFR5cGVCdWlsZGVyPiBzdXBlcmNsYXNzZXM7CgogICAgTGlzdDxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlczsKCiAgICBpbnQgbWF4SW5oZXJpdGFuY2VQYXRoOwoKICAgIGlmIChzdXBlcm5vZGUgPT0gbnVsbCkgewogICAgICAvLyBUaGlzIHNob3VsZCBiZSBPYmplY3QuCiAgICAgIGNsYXNzTWVtYmVycyA9IGxvY2FsTWVtYmVyczsKICAgICAgY2xhc3NTZXR0ZXJzID0gbG9jYWxTZXR0ZXJzOwogICAgICBzdXBlcmNsYXNzZXMgPSBuZXcgTGlzdDxUeXBlQnVpbGRlcj4oMCk7CiAgICAgIGludGVyZmFjZXMgPSBuZXcgTGlzdDxUeXBlQnVpbGRlcj4oMCk7CiAgICAgIG1heEluaGVyaXRhbmNlUGF0aCA9IDA7CiAgICB9IGVsc2UgewogICAgICBtYXhJbmhlcml0YW5jZVBhdGggPSBzdXBlcm5vZGUubWF4SW5oZXJpdGFuY2VQYXRoICsgMTsKICAgICAgc3VwZXJjbGFzc2VzID0gbmV3IExpc3Q8VHlwZUJ1aWxkZXI+KHN1cGVybm9kZS5zdXBlcmNsYXNzZXMubGVuZ3RoICsgMSk7CiAgICAgIHN1cGVyY2xhc3Nlcy5zZXRSYW5nZSgwLCBzdXBlcmNsYXNzZXMubGVuZ3RoIC0gMSwKICAgICAgICAgIHN1YnN0U3VwZXJ0eXBlcyhjbHMuc3VwZXJ0eXBlLCBzdXBlcm5vZGUuc3VwZXJjbGFzc2VzKSk7CiAgICAgIHN1cGVyY2xhc3Nlc1tzdXBlcmNsYXNzZXMubGVuZ3RoIC0gMV0gPSByZWNvcmRTdXBlcnR5cGUoY2xzLnN1cGVydHlwZSk7CgogICAgICBMaXN0PFR5cGVCdWlsZGVyPiBkaXJlY3RJbnRlcmZhY2VzID0gaWdub3JlRnVuY3Rpb24oY2xzLmludGVyZmFjZXMpOwogICAgICBpZiAoY2xzLmlzTWl4aW5BcHBsaWNhdGlvbikgewogICAgICAgIGlmIChkaXJlY3RJbnRlcmZhY2VzID09IG51bGwpIHsKICAgICAgICAgIGRpcmVjdEludGVyZmFjZXMgPSA8VHlwZUJ1aWxkZXI+W2Nscy5taXhlZEluVHlwZV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRpcmVjdEludGVyZmFjZXMgPSA8VHlwZUJ1aWxkZXI+W2Nscy5taXhlZEluVHlwZV0KICAgICAgICAgICAgLi5hZGRBbGwoZGlyZWN0SW50ZXJmYWNlcyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChkaXJlY3RJbnRlcmZhY2VzICE9IG51bGwpIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdEludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHJlY29yZFN1cGVydHlwZShkaXJlY3RJbnRlcmZhY2VzW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgTGlzdDxUeXBlQnVpbGRlcj4gc3VwZXJjbGFzc0ludGVyZmFjZXMgPSBzdXBlcm5vZGUuaW50ZXJmYWNlczsKICAgICAgaWYgKHN1cGVyY2xhc3NJbnRlcmZhY2VzICE9IG51bGwpIHsKICAgICAgICBzdXBlcmNsYXNzSW50ZXJmYWNlcyA9CiAgICAgICAgICAgIHN1YnN0U3VwZXJ0eXBlcyhjbHMuc3VwZXJ0eXBlLCBzdXBlcmNsYXNzSW50ZXJmYWNlcyk7CiAgICAgIH0KCiAgICAgIGNsYXNzTWVtYmVycyA9IG1lcmdlKAogICAgICAgICAgbG9jYWxNZW1iZXJzLCBzdXBlcm5vZGUuY2xhc3NNZW1iZXJzLCBNZXJnZUtpbmQuc3VwZXJjbGFzc01lbWJlcnMpOwogICAgICBjbGFzc1NldHRlcnMgPSBtZXJnZSgKICAgICAgICAgIGxvY2FsU2V0dGVycywgc3VwZXJub2RlLmNsYXNzU2V0dGVycywgTWVyZ2VLaW5kLnN1cGVyY2xhc3NTZXR0ZXJzKTsKCiAgICAgIGlmIChkaXJlY3RJbnRlcmZhY2VzICE9IG51bGwpIHsKICAgICAgICBNZXJnZVJlc3VsdCByZXN1bHQgPSBtZXJnZUludGVyZmFjZXMoc3VwZXJub2RlLCBkaXJlY3RJbnRlcmZhY2VzKTsKICAgICAgICBpbnRlcmZhY2VNZW1iZXJzID0gcmVzdWx0Lm1lcmdlZE1lbWJlcnM7CiAgICAgICAgaW50ZXJmYWNlU2V0dGVycyA9IHJlc3VsdC5tZXJnZWRTZXR0ZXJzOwogICAgICAgIGludGVyZmFjZXMgPSA8VHlwZUJ1aWxkZXI+W107CiAgICAgICAgaWYgKHN1cGVyY2xhc3NJbnRlcmZhY2VzICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJjbGFzc0ludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgYWRkSW50ZXJmYWNlKGludGVyZmFjZXMsIHN1cGVyY2xhc3Nlcywgc3VwZXJjbGFzc0ludGVyZmFjZXNbaV0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdEludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIFR5cGVCdWlsZGVyIGRpcmVjdEludGVyZmFjZSA9IGRpcmVjdEludGVyZmFjZXNbaV07CiAgICAgICAgICBhZGRJbnRlcmZhY2UoaW50ZXJmYWNlcywgc3VwZXJjbGFzc2VzLCBkaXJlY3RJbnRlcmZhY2UpOwogICAgICAgICAgQ2xhc3NIaWVyYXJjaHlOb2RlIGludGVyZmFjZU5vZGUgPQogICAgICAgICAgICAgIGhpZXJhcmNoeS5nZXROb2RlRnJvbVR5cGUoZGlyZWN0SW50ZXJmYWNlKTsKICAgICAgICAgIGlmIChpbnRlcmZhY2VOb2RlICE9IG51bGwpIHsKICAgICAgICAgICAgaWYgKG1heEluaGVyaXRhbmNlUGF0aCA8IGludGVyZmFjZU5vZGUubWF4SW5oZXJpdGFuY2VQYXRoICsgMSkgewogICAgICAgICAgICAgIG1heEluaGVyaXRhbmNlUGF0aCA9IGludGVyZmFjZU5vZGUubWF4SW5oZXJpdGFuY2VQYXRoICsgMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBMaXN0PFR5cGVCdWlsZGVyPiB0eXBlcyA9CiAgICAgICAgICAgICAgICBzdWJzdFN1cGVydHlwZXMoZGlyZWN0SW50ZXJmYWNlLCBpbnRlcmZhY2VOb2RlLnN1cGVyY2xhc3Nlcyk7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBhZGRJbnRlcmZhY2UoaW50ZXJmYWNlcywgc3VwZXJjbGFzc2VzLCB0eXBlc1tpXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpbnRlcmZhY2VOb2RlLmludGVyZmFjZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgIExpc3Q8VHlwZUJ1aWxkZXI+IHR5cGVzID0KICAgICAgICAgICAgICAgICAgc3Vic3RTdXBlcnR5cGVzKGRpcmVjdEludGVyZmFjZSwgaW50ZXJmYWNlTm9kZS5pbnRlcmZhY2VzKTsKICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBhZGRJbnRlcmZhY2UoaW50ZXJmYWNlcywgc3VwZXJjbGFzc2VzLCB0eXBlc1tpXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGludGVyZmFjZU1lbWJlcnMgPSBzdXBlcm5vZGUuaW50ZXJmYWNlTWVtYmVyczsKICAgICAgICBpbnRlcmZhY2VTZXR0ZXJzID0gc3VwZXJub2RlLmludGVyZmFjZVNldHRlcnM7CiAgICAgICAgaW50ZXJmYWNlcyA9IHN1cGVyY2xhc3NJbnRlcmZhY2VzOwogICAgICB9CgogICAgICAvLyBDaGVjayBpZiBsb2NhbCBtZW1iZXJzIGNvbmZsaWN0IHdpdGggaW5oZXJpdGVkIHNldHRlcnMuIFRoaXMgY2hlY2sgaGFzCiAgICAgIC8vIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQgaW4gdGhlIHN1cGVyY2xhc3MsIHNvIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUKICAgICAgLy8gbG9jYWwgbWVtYmVycy4gVGhlc2UgY2hlY2tzIGhhdmUgdG8gb2NjdXIgbGF0ZSB0byBlbmFibGUgaW5mZXJyaW5nCiAgICAgIC8vIHR5cGVzIGJldHdlZW4gc2V0dGVycyBhbmQgZ2V0dGVycywgb3IgZnJvbSBhIHNldHRlciB0byBhIGZpbmFsIGZpZWxkLgogICAgICBtZXJnZShsb2NhbE1lbWJlcnMsIGNsYXNzU2V0dGVycywgTWVyZ2VLaW5kLm1lbWJlcnNXaXRoU2V0dGVycyk7CgogICAgICAvLyBDaGVjayBpZiBsb2NhbCBzZXR0ZXJzIGNvbmZsaWN0IHdpdGggaW5oZXJpdGVkIG1lbWJlcnMuIEFzIGFib3ZlLCB3ZQogICAgICAvLyBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIGxvY2FsIHNldHRlcnMuCiAgICAgIG1lcmdlKGxvY2FsU2V0dGVycywgY2xhc3NNZW1iZXJzLCBNZXJnZUtpbmQuc2V0dGVyc1dpdGhNZW1iZXJzKTsKCiAgICAgIGlmIChpbnRlcmZhY2VNZW1iZXJzICE9IG51bGwpIHsKICAgICAgICBpbnRlcmZhY2VNZW1iZXJzID0KICAgICAgICAgICAgbWVyZ2UoY2xhc3NNZW1iZXJzLCBpbnRlcmZhY2VNZW1iZXJzLCBNZXJnZUtpbmQuc3VwZXJ0eXBlc01lbWJlcnMpOwoKICAgICAgICAvLyBDaGVjayBpZiBjbGFzcyBzZXR0ZXJzIGNvbmZsaWN0IHdpdGggbWVtYmVycyBpbmhlcml0ZWQgZnJvbQogICAgICAgIC8vIGludGVyZmFjZXMuCiAgICAgICAgbWVyZ2UoY2xhc3NTZXR0ZXJzLCBpbnRlcmZhY2VNZW1iZXJzLCBNZXJnZUtpbmQuc2V0dGVyc1dpdGhNZW1iZXJzKTsKICAgICAgfQogICAgICBpZiAoaW50ZXJmYWNlU2V0dGVycyAhPSBudWxsKSB7CiAgICAgICAgaW50ZXJmYWNlU2V0dGVycyA9CiAgICAgICAgICAgIG1lcmdlKGNsYXNzU2V0dGVycywgaW50ZXJmYWNlU2V0dGVycywgTWVyZ2VLaW5kLnN1cGVydHlwZXNTZXR0ZXJzKTsKCiAgICAgICAgLy8gQ2hlY2sgaWYgY2xhc3MgbWVtYmVycyBjb25mbGljdCB3aXRoIHNldHRlcnMgaW5oZXJpdGVkIGZyb20KICAgICAgICAvLyBpbnRlcmZhY2VzLgogICAgICAgIG1lcmdlKGNsYXNzTWVtYmVycywgaW50ZXJmYWNlU2V0dGVycywgTWVyZ2VLaW5kLm1lbWJlcnNXaXRoU2V0dGVycyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChhYnN0cmFjdE1lbWJlcnMgIT0gbnVsbCAmJiAhY2xzLmlzQWJzdHJhY3QpIHsKICAgICAgaWYgKCFoYXNOb1N1Y2hNZXRob2QpIHsKICAgICAgICByZXBvcnRNaXNzaW5nTWVtYmVycygpOwogICAgICB9IGVsc2UgewogICAgICAgIGluc3RhbGxOc21IYW5kbGVycygpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IENsYXNzSGllcmFyY2h5Tm9kZSgKICAgICAgY2xzLAogICAgICBjbGFzc01lbWJlcnMsCiAgICAgIGNsYXNzU2V0dGVycywKICAgICAgaW50ZXJmYWNlTWVtYmVycywKICAgICAgaW50ZXJmYWNlU2V0dGVycywKICAgICAgc3VwZXJjbGFzc2VzLAogICAgICBpbnRlcmZhY2VzLAogICAgICBtYXhJbmhlcml0YW5jZVBhdGgsCiAgICAgIGhhc05vU3VjaE1ldGhvZCwKICAgICk7CiAgfQoKICBUeXBlQnVpbGRlciByZWNvcmRTdXBlcnR5cGUoVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlKSB7CiAgICBpZiAoc3VwZXJ0eXBlIGlzIE5hbWVkVHlwZUJ1aWxkZXIpIHsKICAgICAgZGVidWc/LmxvZygKICAgICAgICAgICJJbiAke3RoaXMuY2xzLmZ1bGxOYW1lRm9yRXJyb3JzfSByZWNvcmRTdXBlcnR5cGUoJHtzdXBlcnR5cGUuZnVsbE5hbWVGb3JFcnJvcnN9KSIpOwogICAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IHN1cGVydHlwZS5kZWNsYXJhdGlvbjsKICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzISBDbGFzc0J1aWxkZXIpIHJldHVybiBzdXBlcnR5cGU7CiAgICAgIENsYXNzQnVpbGRlciBjbHMgPSBkZWNsYXJhdGlvbjsKICAgICAgaWYgKGNscy5pc01peGluQXBwbGljYXRpb24pIHsKICAgICAgICByZWNvcmRTdXBlcnR5cGUoY2xzLm1peGVkSW5UeXBlKTsKICAgICAgfQogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBjbHMudHlwZVZhcmlhYmxlczsKICAgICAgaWYgKHR5cGVWYXJpYWJsZXMgPT0gbnVsbCkgewogICAgICAgIHN1YnN0aXR1dGlvbnNbY2xzLnRhcmdldF0gPSBTdWJzdGl0dXRpb24uZW1wdHk7CiAgICAgICAgYXNzZXJ0KGNscy50YXJnZXQudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzID0KICAgICAgICAgICAgc3VwZXJ0eXBlLmFyZ3VtZW50cyA/PyBjb21wdXRlRGVmYXVsdFR5cGVBcmd1bWVudHMoc3VwZXJ0eXBlKTsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPSB0eXBlVmFyaWFibGVzLmxlbmd0aCkgewogICAgICAgICAgYXJndW1lbnRzID0gY29tcHV0ZURlZmF1bHRUeXBlQXJndW1lbnRzKHN1cGVydHlwZSk7CiAgICAgICAgfQogICAgICAgIExpc3Q8RGFydFR5cGU+IGtlcm5lbEFyZ3VtZW50cyA9IG5ldyBMaXN0PERhcnRUeXBlPihhcmd1bWVudHMubGVuZ3RoKTsKICAgICAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IGtlcm5lbFBhcmFtZXRlcnMgPQogICAgICAgICAgICBuZXcgTGlzdDxUeXBlUGFyYW1ldGVyPihhcmd1bWVudHMubGVuZ3RoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAga2VybmVsUGFyYW1ldGVyc1tpXSA9IHR5cGVWYXJpYWJsZXNbaV0udGFyZ2V0OwogICAgICAgICAga2VybmVsQXJndW1lbnRzW2ldID0gYXJndW1lbnRzW2ldLmJ1aWxkKHRoaXMuY2xzLnBhcmVudCk7CiAgICAgICAgfQogICAgICAgIHN1YnN0aXR1dGlvbnNbY2xzLnRhcmdldF0gPQogICAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKGtlcm5lbFBhcmFtZXRlcnMsIGtlcm5lbEFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdXBlcnR5cGU7CiAgfQoKICBMaXN0PFR5cGVCdWlsZGVyPiBzdWJzdFN1cGVydHlwZXMoCiAgICAgIE5hbWVkVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlLCBMaXN0PFR5cGVCdWlsZGVyPiBzdXBlcnR5cGVzKSB7CiAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IHN1cGVydHlwZS5kZWNsYXJhdGlvbjsKICAgIGlmIChkZWNsYXJhdGlvbiBpcyEgQ2xhc3NCdWlsZGVyKSByZXR1cm4gc3VwZXJ0eXBlczsKICAgIENsYXNzQnVpbGRlciBjbHMgPSBkZWNsYXJhdGlvbjsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IGNscy50eXBlVmFyaWFibGVzOwogICAgaWYgKHR5cGVWYXJpYWJsZXMgPT0gbnVsbCkgewogICAgICBkZWJ1Zz8ubG9nKCJJbiAke3RoaXMuY2xzLmZ1bGxOYW1lRm9yRXJyb3JzfSAkc3VwZXJ0eXBlcyBhcmVuJ3Qgc3Vic3RlZCIpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVydHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICByZWNvcmRTdXBlcnR5cGUoc3VwZXJ0eXBlc1tpXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN1cGVydHlwZXM7CiAgICB9CiAgICBNYXA8VHlwZVZhcmlhYmxlQnVpbGRlciwgVHlwZUJ1aWxkZXI+IHN1YnN0aXR1dGlvbiA9CiAgICAgICAgPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIFR5cGVCdWlsZGVyPnt9OwogICAgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzID0KICAgICAgICBzdXBlcnR5cGUuYXJndW1lbnRzID8/IGNvbXB1dGVEZWZhdWx0VHlwZUFyZ3VtZW50cyhzdXBlcnR5cGUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHN1YnN0aXR1dGlvblt0eXBlVmFyaWFibGVzW2ldXSA9IGFyZ3VtZW50c1tpXTsKICAgIH0KICAgIExpc3Q8VHlwZUJ1aWxkZXI+IHJlc3VsdDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJ0eXBlcy5sZW5ndGg7IGkrKykgewogICAgICBUeXBlQnVpbGRlciBzdXBlcnR5cGUgPSBzdXBlcnR5cGVzW2ldOwogICAgICBUeXBlQnVpbGRlciBzdWJzdGVkID0gcmVjb3JkU3VwZXJ0eXBlKHN1cGVydHlwZS5zdWJzdChzdWJzdGl0dXRpb24pKTsKICAgICAgaWYgKHN1cGVydHlwZSAhPSBzdWJzdGVkKSB7CiAgICAgICAgZGVidWc/LmxvZygiSW4gJHt0aGlzLmNscy5mdWxsTmFtZUZvckVycm9yc30gJHN1cGVydHlwZSAtPiAkc3Vic3RlZCIpOwogICAgICAgIHJlc3VsdCA/Pz0gc3VwZXJ0eXBlcy50b0xpc3QoKTsKICAgICAgICByZXN1bHRbaV0gPSBzdWJzdGVkOwogICAgICB9IGVsc2UgewogICAgICAgIGRlYnVnPy5sb2coIkluICR7dGhpcy5jbHMuZnVsbE5hbWVGb3JFcnJvcnN9ICRzdXBlcnR5cGUgaXNuJ3Qgc3Vic3RlZCIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0ID8/IHN1cGVydHlwZXM7CiAgfQoKICBMaXN0PFR5cGVCdWlsZGVyPiBjb21wdXRlRGVmYXVsdFR5cGVBcmd1bWVudHMoVHlwZUJ1aWxkZXIgdHlwZSkgewogICAgQ2xhc3NCdWlsZGVyIGNscyA9IHR5cGUuZGVjbGFyYXRpb247CiAgICBMaXN0PFR5cGVCdWlsZGVyPiByZXN1bHQgPSBuZXcgTGlzdDxUeXBlQnVpbGRlcj4oY2xzLnR5cGVWYXJpYWJsZXMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7CiAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIgdHYgPSBjbHMudHlwZVZhcmlhYmxlc1tpXTsKICAgICAgcmVzdWx0W2ldID0gdHYuZGVmYXVsdFR5cGUgPz8KICAgICAgICAgIGNscy5saWJyYXJ5LmxvYWRlci5jb21wdXRlVHlwZUJ1aWxkZXIodHYudGFyZ2V0LmRlZmF1bHRUeXBlKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBUeXBlQnVpbGRlciBhZGRJbnRlcmZhY2UoTGlzdDxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlcywKICAgICAgTGlzdDxUeXBlQnVpbGRlcj4gc3VwZXJjbGFzc2VzLCBUeXBlQnVpbGRlciB0eXBlKSB7CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSA9IGhpZXJhcmNoeS5nZXROb2RlRnJvbVR5cGUodHlwZSk7CiAgICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGludCBkZXB0aCA9IG5vZGUuZGVwdGg7CiAgICBpbnQgbXlEZXB0aCA9IHN1cGVyY2xhc3Nlcy5sZW5ndGg7CiAgICBpZiAoZGVwdGggPCBteURlcHRoICYmIHN1cGVyY2xhc3Nlc1tkZXB0aF0uZGVjbGFyYXRpb24gPT0gbm9kZS5jbHMpIHsKICAgICAgLy8gVGhpcyBpcyBhIHBvdGVudGlhbCBjb25mbGljdC4KICAgICAgcmV0dXJuIHN1cGVyY2xhc3Nlc1tkZXB0aF07CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAvLyBUaGlzIGlzIGEgcXVhZHJhdGljIGFsZ29yaXRobSwgYnV0IG5vcm1hbGx5LCB0aGUgbnVtYmVyIG9mCiAgICAgICAgLy8gaW50ZXJmYWNlcyBpcyByZWFsbHkgc21hbGwuCiAgICAgICAgaWYgKGludGVyZmFjZXNbaV0uZGVjbGFyYXRpb24gPT0gdHlwZS5kZWNsYXJhdGlvbikgewogICAgICAgICAgLy8gVGhpcyBpcyBhIHBvdGVudGlhbCBjb25mbGljdC4KICAgICAgICAgIHJldHVybiBpbnRlcmZhY2VzW2ldOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaW50ZXJmYWNlcy5hZGQodHlwZSk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIE1lcmdlUmVzdWx0IG1lcmdlSW50ZXJmYWNlcygKICAgICAgQ2xhc3NIaWVyYXJjaHlOb2RlIHN1cGVybm9kZSwgTGlzdDxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlcykgewogICAgZGVidWc/LmxvZygKICAgICAgICAibWVyZ2VJbnRlcmZhY2VzKCRjbHMgKCR7dGhpcy5jbHN9KSAke3N1cGVybm9kZS5pbnRlcmZhY2VzfSAke2ludGVyZmFjZXN9Iik7CiAgICBMaXN0PExpc3Q8RGVjbGFyYXRpb24+PiBtZW1iZXJMaXN0cyA9CiAgICAgICAgbmV3IExpc3Q8TGlzdDxEZWNsYXJhdGlvbj4+KGludGVyZmFjZXMubGVuZ3RoICsgMSk7CiAgICBMaXN0PExpc3Q8RGVjbGFyYXRpb24+PiBzZXR0ZXJMaXN0cyA9CiAgICAgICAgbmV3IExpc3Q8TGlzdDxEZWNsYXJhdGlvbj4+KGludGVyZmFjZXMubGVuZ3RoICsgMSk7CiAgICBtZW1iZXJMaXN0c1swXSA9IHN1cGVybm9kZS5pbnRlcmZhY2VNZW1iZXJzOwogICAgc2V0dGVyTGlzdHNbMF0gPSBzdXBlcm5vZGUuaW50ZXJmYWNlU2V0dGVyczsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewogICAgICBDbGFzc0hpZXJhcmNoeU5vZGUgaW50ZXJmYWNlTm9kZSA9CiAgICAgICAgICBoaWVyYXJjaHkuZ2V0Tm9kZUZyb21UeXBlKGludGVyZmFjZXNbaV0pOwogICAgICBpZiAoaW50ZXJmYWNlTm9kZSA9PSBudWxsKSB7CiAgICAgICAgbWVtYmVyTGlzdHNbaSArIDFdID0gbnVsbDsKICAgICAgICBzZXR0ZXJMaXN0c1tpICsgMV0gPSBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIG1lbWJlckxpc3RzW2kgKyAxXSA9CiAgICAgICAgICAgIGludGVyZmFjZU5vZGUuaW50ZXJmYWNlTWVtYmVycyA/PyBpbnRlcmZhY2VOb2RlLmNsYXNzTWVtYmVyczsKICAgICAgICBzZXR0ZXJMaXN0c1tpICsgMV0gPQogICAgICAgICAgICBpbnRlcmZhY2VOb2RlLmludGVyZmFjZVNldHRlcnMgPz8gaW50ZXJmYWNlTm9kZS5jbGFzc1NldHRlcnM7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgTWVyZ2VSZXN1bHQobWVyZ2VMaXN0cyhtZW1iZXJMaXN0cywgTWVyZ2VLaW5kLmludGVyZmFjZXNNZW1iZXJzKSwKICAgICAgICBtZXJnZUxpc3RzKHNldHRlckxpc3RzLCBNZXJnZUtpbmQuaW50ZXJmYWNlc1NldHRlcnMpKTsKICB9CgogIExpc3Q8RGVjbGFyYXRpb24+IG1lcmdlTGlzdHMoCiAgICAgIExpc3Q8TGlzdDxEZWNsYXJhdGlvbj4+IGlucHV0LCBNZXJnZUtpbmQgbWVyZ2VLaW5kKSB7CiAgICAvLyBUaGlzIGlzIGEgay13YXkgbWVyZ2Ugc29ydCAod2hlcmUgayBpcyBgaW5wdXQubGVuZ3RoICsgMWApLiBXZSBtZXJnZSB0aGUKICAgIC8vIGxpc3RzIHBhaXJ3aXNlLCB3aGljaCByZWR1Y2VzIHRoZSBudW1iZXIgb2YgbGlzdHMgdG8gbWVyZ2UgYnkgaGFsZiBvbgogICAgLy8gZWFjaCBpdGVyYXRpb24uIENvbnNlcXVlbnRseSwgd2UgcGVyZm9ybSBPKGxvZyBrKSBtZXJnZXMuCiAgICB3aGlsZSAoaW5wdXQubGVuZ3RoID4gMSkgewogICAgICBMaXN0PExpc3Q8RGVjbGFyYXRpb24+PiBvdXRwdXQgPSA8TGlzdDxEZWNsYXJhdGlvbj4+W107CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoIC0gMTsgaSArPSAyKSB7CiAgICAgICAgTGlzdDxEZWNsYXJhdGlvbj4gZmlyc3QgPSBpbnB1dFtpXTsKICAgICAgICBMaXN0PERlY2xhcmF0aW9uPiBzZWNvbmQgPSBpbnB1dFtpICsgMV07CiAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpIHsKICAgICAgICAgIG91dHB1dC5hZGQoc2Vjb25kKTsKICAgICAgICB9IGVsc2UgaWYgKHNlY29uZCA9PSBudWxsKSB7CiAgICAgICAgICBvdXRwdXQuYWRkKGZpcnN0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgb3V0cHV0LmFkZChtZXJnZShmaXJzdCwgc2Vjb25kLCBtZXJnZUtpbmQpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlucHV0Lmxlbmd0aC5pc09kZCkgewogICAgICAgIG91dHB1dC5hZGQoaW5wdXQubGFzdCk7CiAgICAgIH0KICAgICAgaW5wdXQgPSBvdXRwdXQ7CiAgICB9CiAgICByZXR1cm4gaW5wdXQuc2luZ2xlOwogIH0KCiAgLy8vIE1lcmdlIFthbmQgY2hlY2tdIGFjY2Vzc29ycy4gVGhpcyBlbnRhaWxzIGNvcHlpbmcgbXV0YWJsZSBmaWVsZHMgdG8KICAvLy8gc2V0dGVycyB0byBzaW11bGF0ZSBpbXBsaWVkIHNldHRlcnMsIGFuZCBjaGVja2luZyB0aGF0IHNldHRlcnMgZG9uJ3QKICAvLy8gb3ZlcnJpZGUgcmVndWxhciBtZXRob2RzLgogIExpc3Q8RGVjbGFyYXRpb24+IG1lcmdlQWNjZXNzb3JzKAogICAgICBMaXN0PERlY2xhcmF0aW9uPiBtZW1iZXJzLCBMaXN0PERlY2xhcmF0aW9uPiBzZXR0ZXJzKSB7CiAgICBmaW5hbCBMaXN0PERlY2xhcmF0aW9uPiBtZXJnZWRTZXR0ZXJzID0gbmV3IExpc3Q8RGVjbGFyYXRpb24+LmZpbGxlZCgKICAgICAgICBtZW1iZXJzLmxlbmd0aCArIHNldHRlcnMubGVuZ3RoLCBudWxsLAogICAgICAgIGdyb3dhYmxlOiB0cnVlKTsKICAgIGludCBzdG9yZUluZGV4ID0gMDsKICAgIGludCBpID0gMDsKICAgIGludCBqID0gMDsKICAgIHdoaWxlIChpIDwgbWVtYmVycy5sZW5ndGggJiYgaiA8IHNldHRlcnMubGVuZ3RoKSB7CiAgICAgIGZpbmFsIERlY2xhcmF0aW9uIG1lbWJlciA9IG1lbWJlcnNbaV07CiAgICAgIGZpbmFsIERlY2xhcmF0aW9uIHNldHRlciA9IHNldHRlcnNbal07CiAgICAgIGZpbmFsIGludCBjb21wYXJlID0gY29tcGFyZURlY2xhcmF0aW9ucyhtZW1iZXIsIHNldHRlcik7CiAgICAgIGlmIChjb21wYXJlID09IDApIHsKICAgICAgICBtZXJnZWRTZXR0ZXJzW3N0b3JlSW5kZXgrK10gPSBzZXR0ZXI7CiAgICAgICAgaSsrOwogICAgICAgIGorKzsKICAgICAgfSBlbHNlIGlmIChjb21wYXJlIDwgMCkgewogICAgICAgIGlmIChpbXBsaWVzU2V0dGVyKG1lbWJlcikpIHsKICAgICAgICAgIG1lcmdlZFNldHRlcnNbc3RvcmVJbmRleCsrXSA9IG1lbWJlcjsKICAgICAgICB9CiAgICAgICAgaSsrOwogICAgICB9IGVsc2UgewogICAgICAgIG1lcmdlZFNldHRlcnNbc3RvcmVJbmRleCsrXSA9IHNldHRlcnNbal07CiAgICAgICAgaisrOwogICAgICB9CiAgICB9CiAgICB3aGlsZSAoaSA8IG1lbWJlcnMubGVuZ3RoKSB7CiAgICAgIGZpbmFsIERlY2xhcmF0aW9uIG1lbWJlciA9IG1lbWJlcnNbaV07CiAgICAgIGlmIChpbXBsaWVzU2V0dGVyKG1lbWJlcikpIHsKICAgICAgICBtZXJnZWRTZXR0ZXJzW3N0b3JlSW5kZXgrK10gPSBtZW1iZXI7CiAgICAgIH0KICAgICAgaSsrOwogICAgfQogICAgd2hpbGUgKGogPCBzZXR0ZXJzLmxlbmd0aCkgewogICAgICBtZXJnZWRTZXR0ZXJzW3N0b3JlSW5kZXgrK10gPSBzZXR0ZXJzW2pdOwogICAgICBqKys7CiAgICB9CgogICAgaWYgKHN0b3JlSW5kZXggPT0gaikgewogICAgICByZXR1cm4gc2V0dGVyczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBtZXJnZWRTZXR0ZXJzLi5sZW5ndGggPSBzdG9yZUluZGV4OwogICAgfQogIH0KCiAgdm9pZCByZXBvcnRNaXNzaW5nTWVtYmVycygpIHsKICAgIE1hcDxTdHJpbmcsIExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0TWFwID0gPFN0cmluZywgTG9jYXRlZE1lc3NhZ2U+e307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGFic3RyYWN0TWVtYmVycy5sZW5ndGg7IGkrKykgewogICAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IGFic3RyYWN0TWVtYmVyc1tpXTsKICAgICAgTWVtYmVyIHRhcmdldCA9IGRlY2xhcmF0aW9uLnRhcmdldDsKICAgICAgaWYgKGlzTmFtZVZpc2libGVJbih0YXJnZXQubmFtZSwgY2xzLmxpYnJhcnkpKSB7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBkZWNsYXJhdGlvbi5mdWxsTmFtZUZvckVycm9yczsKICAgICAgICBTdHJpbmcgcGFyZW50TmFtZSA9IGRlY2xhcmF0aW9uLnBhcmVudC5mdWxsTmFtZUZvckVycm9yczsKICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWUgPQogICAgICAgICAgICBkZWNsYXJhdGlvbi5pc1NldHRlciA/ICIkcGFyZW50TmFtZS4kbmFtZT0iIDogIiRwYXJlbnROYW1lLiRuYW1lIjsKICAgICAgICBjb250ZXh0TWFwW2Rpc3BsYXlOYW1lXSA9IHRlbXBsYXRlTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2UKICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoZGlzcGxheU5hbWUpCiAgICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5maWxlVXJpLCBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjb250ZXh0TWFwLmlzRW1wdHkpIHJldHVybjsKICAgIExpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBMaXN0PFN0cmluZz4uZnJvbShjb250ZXh0TWFwLmtleXMpLi5zb3J0KCk7CiAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0ID0gPExvY2F0ZWRNZXNzYWdlPltdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewogICAgICBjb250ZXh0LmFkZChjb250ZXh0TWFwW25hbWVzW2ldXSk7CiAgICB9CiAgICBjbHMuYWRkUHJvYmxlbSgKICAgICAgICB0ZW1wbGF0ZU1pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0LndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgIGNscy5mdWxsTmFtZUZvckVycm9ycywgbmFtZXMpLAogICAgICAgIGNscy5jaGFyT2Zmc2V0LAogICAgICAgIGNscy5mdWxsTmFtZUZvckVycm9ycy5sZW5ndGgsCiAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgfQoKICB2b2lkIGluc3RhbGxOc21IYW5kbGVycygpIHsKICAgIC8vIFRPT0QoYWhlKTogSW1wbGVtZW50IHRoaXMuCiAgfQoKICBMaXN0PERlY2xhcmF0aW9uPiBtZXJnZSgKICAgICAgTGlzdDxEZWNsYXJhdGlvbj4gYUxpc3QsIExpc3Q8RGVjbGFyYXRpb24+IGJMaXN0LCBNZXJnZUtpbmQgbWVyZ2VLaW5kKSB7CiAgICBmaW5hbCBMaXN0PERlY2xhcmF0aW9uPiByZXN1bHQgPSBuZXcgTGlzdDxEZWNsYXJhdGlvbj4uZmlsbGVkKAogICAgICAgIGFMaXN0Lmxlbmd0aCArIGJMaXN0Lmxlbmd0aCwgbnVsbCwKICAgICAgICBncm93YWJsZTogdHJ1ZSk7CiAgICBpbnQgc3RvcmVJbmRleCA9IDA7CiAgICBpbnQgaSA9IDA7CiAgICBpbnQgaiA9IDA7CiAgICB3aGlsZSAoaSA8IGFMaXN0Lmxlbmd0aCAmJiBqIDwgYkxpc3QubGVuZ3RoKSB7CiAgICAgIGZpbmFsIERlY2xhcmF0aW9uIGEgPSBhTGlzdFtpXTsKICAgICAgZmluYWwgRGVjbGFyYXRpb24gYiA9IGJMaXN0W2pdOwogICAgICBpZiAoKG1lcmdlS2luZCA9PSBNZXJnZUtpbmQuaW50ZXJmYWNlc01lbWJlcnMgfHwKICAgICAgICAgICAgICBtZXJnZUtpbmQgPT0gTWVyZ2VLaW5kLmludGVyZmFjZXNTZXR0ZXJzKSAmJgogICAgICAgICAgYS5pc1N0YXRpYykgewogICAgICAgIGkrKzsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoYi5pc1N0YXRpYykgewogICAgICAgIGorKzsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmaW5hbCBpbnQgY29tcGFyZSA9IGNvbXBhcmVEZWNsYXJhdGlvbnMoYSwgYik7CiAgICAgIGlmIChjb21wYXJlID09IDApIHsKICAgICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IGhhbmRsZU1lcmdlQ29uZmxpY3QoYSwgYiwgbWVyZ2VLaW5kKTsKICAgICAgICBpKys7CiAgICAgICAgaisrOwogICAgICB9IGVsc2UgaWYgKGNvbXBhcmUgPCAwKSB7CiAgICAgICAgaGFuZGxlT25seUEoYSwgbWVyZ2VLaW5kKTsKICAgICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IGE7CiAgICAgICAgaSsrOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gaGFuZGxlT25seUIoYiwgbWVyZ2VLaW5kKTsKICAgICAgICBqKys7CiAgICAgIH0KICAgIH0KICAgIHdoaWxlIChpIDwgYUxpc3QubGVuZ3RoKSB7CiAgICAgIGZpbmFsIERlY2xhcmF0aW9uIGEgPSBhTGlzdFtpXTsKICAgICAgaWYgKCEobWVyZ2VLaW5kID09IE1lcmdlS2luZC5pbnRlcmZhY2VzTWVtYmVycyB8fAogICAgICAgICAgICAgIG1lcmdlS2luZCA9PSBNZXJnZUtpbmQuaW50ZXJmYWNlc1NldHRlcnMpIHx8CiAgICAgICAgICAhYS5pc1N0YXRpYykgewogICAgICAgIGhhbmRsZU9ubHlBKGEsIG1lcmdlS2luZCk7CiAgICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBhOwogICAgICB9CiAgICAgIGkrKzsKICAgIH0KICAgIHdoaWxlIChqIDwgYkxpc3QubGVuZ3RoKSB7CiAgICAgIGZpbmFsIERlY2xhcmF0aW9uIGIgPSBiTGlzdFtqXTsKICAgICAgaWYgKCFiLmlzU3RhdGljKSB7CiAgICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBoYW5kbGVPbmx5QihiLCBtZXJnZUtpbmQpOwogICAgICB9CiAgICAgIGorKzsKICAgIH0KICAgIGlmIChhTGlzdC5pc0VtcHR5ICYmIHN0b3JlSW5kZXggPT0gYkxpc3QubGVuZ3RoKSByZXR1cm4gYkxpc3Q7CiAgICBpZiAoYkxpc3QuaXNFbXB0eSAmJiBzdG9yZUluZGV4ID09IGFMaXN0Lmxlbmd0aCkgcmV0dXJuIGFMaXN0OwogICAgcmV0dXJuIHJlc3VsdC4ubGVuZ3RoID0gc3RvcmVJbmRleDsKICB9CgogIHZvaWQgaW5mZXJNaXhpbkFwcGxpY2F0aW9uKCkgewogICAgQ2xhc3Mga2VybmVsQ2xhc3MgPSBjbHMudGFyZ2V0OwogICAgU3VwZXJ0eXBlIGtlcm5lbE1peGVkSW5UeXBlID0ga2VybmVsQ2xhc3MubWl4ZWRJblR5cGU7CiAgICBpZiAoa2VybmVsTWl4ZWRJblR5cGUgPT0gbnVsbCkgcmV0dXJuOwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IGtlcm5lbE1peGVkSW5UeXBlLnR5cGVBcmd1bWVudHM7CiAgICBpZiAodHlwZUFyZ3VtZW50cy5pc0VtcHR5IHx8IHR5cGVBcmd1bWVudHMuZmlyc3QgaXMhIFVua25vd25UeXBlKSByZXR1cm47CiAgICBuZXcgQnVpbGRlck1peGluSW5mZXJyZXIoCiAgICAgICAgICAgIGNscywKICAgICAgICAgICAgaGllcmFyY2h5LmNvcmVUeXBlcywKICAgICAgICAgICAgbmV3IFR5cGVCdWlsZGVyQ29uc3RyYWludEdhdGhlcmVyKAogICAgICAgICAgICAgICAgaGllcmFyY2h5LCBrZXJuZWxNaXhlZEluVHlwZS5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnMpKQogICAgICAgIC5pbmZlcihrZXJuZWxDbGFzcyk7CiAgICBMaXN0PFR5cGVCdWlsZGVyPiBpbmZlcnJlZEFyZ3VtZW50cyA9CiAgICAgICAgbmV3IExpc3Q8VHlwZUJ1aWxkZXI+KHR5cGVBcmd1bWVudHMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpbmZlcnJlZEFyZ3VtZW50c1tpXSA9CiAgICAgICAgICBoaWVyYXJjaHkubG9hZGVyLmNvbXB1dGVUeXBlQnVpbGRlcih0eXBlQXJndW1lbnRzW2ldKTsKICAgIH0KICAgIE5hbWVkVHlwZUJ1aWxkZXIgbWl4ZWRJblR5cGUgPSBjbHMubWl4ZWRJblR5cGU7CiAgICBtaXhlZEluVHlwZS5hcmd1bWVudHMgPSBpbmZlcnJlZEFyZ3VtZW50czsKICB9CgogIC8vLyBUaGUgY2xhc3MgRnVuY3Rpb24gZnJvbSBkYXJ0OmNvcmUgaXMgc3VwcG9zZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZWQgYXMKICAvLy8gYW4gaW50ZXJmYWNlLgogIExpc3Q8VHlwZUJ1aWxkZXI+IGlnbm9yZUZ1bmN0aW9uKExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZXMpIHsKICAgIGlmIChpbnRlcmZhY2VzID09IG51bGwpIHJldHVybiBudWxsOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIENsYXNzQnVpbGRlciBjbHMgPSBnZXRDbGFzcyhpbnRlcmZhY2VzW2ldKTsKICAgICAgaWYgKGNscyAhPSBudWxsICYmIGNscy50YXJnZXQgPT0gaGllcmFyY2h5LmZ1bmN0aW9uS2VybmVsQ2xhc3MpIHsKICAgICAgICBpZiAoaW50ZXJmYWNlcy5sZW5ndGggPT0gMSkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzLnRvTGlzdCgpOwogICAgICAgICAgaW50ZXJmYWNlcy5yZW1vdmVBdChpKTsKICAgICAgICAgIHJldHVybiBpZ25vcmVGdW5jdGlvbihpbnRlcmZhY2VzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpbnRlcmZhY2VzOwogIH0KfQoKY2xhc3MgQ2xhc3NIaWVyYXJjaHlOb2RlIHsKICAvLy8gVGhlIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBoaWVyYXJjaHkgbm9kZS4KICBmaW5hbCBDbGFzc0J1aWxkZXIgY2xzOwoKICAvLy8gQWxsIHRoZSBtZW1iZXJzIG9mIHRoaXMgY2xhc3MgaW5jbHVkaW5nIFtjbGFzc01lbWJlcnNdIG9mIGl0cwogIC8vLyBzdXBlcmNsYXNzZXMuIFRoZSBtZW1iZXJzIGFyZSBzb3J0ZWQgYnkgW2NvbXBhcmVEZWNsYXJhdGlvbnNdLgogIGZpbmFsIExpc3Q8RGVjbGFyYXRpb24+IGNsYXNzTWVtYmVyczsKCiAgLy8vIFNpbWlsYXIgdG8gW2NsYXNzTWVtYmVyc10gYnV0IGZvciBzZXR0ZXJzLgogIGZpbmFsIExpc3Q8RGVjbGFyYXRpb24+IGNsYXNzU2V0dGVyczsKCiAgLy8vIEFsbCB0aGUgaW50ZXJmYWNlIG1lbWJlcnMgb2YgdGhpcyBjbGFzcyBpbmNsdWRpbmcgW2ludGVyZmFjZU1lbWJlcnNdIG9mCiAgLy8vIGl0cyBzdXBlcnR5cGVzLiBUaGUgbWVtYmVycyBhcmUgc29ydGVkIGJ5IFtjb21wYXJlRGVjbGFyYXRpb25zXS4KICAvLy8KICAvLy8gSW4gYWRkaXRpb24gdG8gdGhlIG1lbWJlcnMgb2YgW2NsYXNzTWVtYmVyc10gdGhpcyBhbHNvIGNvbnRhaW5zIG1lbWJlcnMKICAvLy8gZnJvbSBpbnRlcmZhY2VzLgogIC8vLwogIC8vLyBUaGlzIG1heSBiZSBudWxsLCBpbiB3aGljaCBjYXNlIFtjbGFzc01lbWJlcnNdIGlzIHRoZSBpbnRlcmZhY2UgbWVtYmVycy4KICBmaW5hbCBMaXN0PERlY2xhcmF0aW9uPiBpbnRlcmZhY2VNZW1iZXJzOwoKICAvLy8gU2ltaWxhciB0byBbaW50ZXJmYWNlTWVtYmVyc10gYnV0IGZvciBzZXR0ZXJzLgogIC8vLwogIC8vLyBUaGlzIG1heSBiZSBudWxsLCBpbiB3aGljaCBjYXNlIFtjbGFzc1NldHRlcnNdIGlzIHRoZSBpbnRlcmZhY2Ugc2V0dGVycy4KICBmaW5hbCBMaXN0PERlY2xhcmF0aW9uPiBpbnRlcmZhY2VTZXR0ZXJzOwoKICAvLy8gQWxsIHN1cGVyY2xhc3NlcyBvZiBbY2xzXSBleGNsdWRpbmcgaXRzZWxmLiBUaGUgY2xhc3NlcyBhcmUgc29ydGVkIGJ5CiAgLy8vIGRlcHRoIGZyb20gdGhlIHJvb3QgKE9iamVjdCkgaW4gYXNjZW5kaW5nIG9yZGVyLgogIGZpbmFsIExpc3Q8VHlwZUJ1aWxkZXI+IHN1cGVyY2xhc3NlczsKCiAgLy8vIFRoZSBsaXN0IG9mIGFsbCBjbGFzc2VzIGltcGxlbWVudGVkIGJ5IFtjbHNdIGFuZCBpdHMgc3VwZXJ0eXBlcyBleGNsdWRpbmcKICAvLy8gYW55IGNsYXNzZXMgZnJvbSBbc3VwZXJjbGFzc2VzXS4KICBmaW5hbCBMaXN0PFR5cGVCdWlsZGVyPiBpbnRlcmZhY2VzOwoKICAvLy8gVGhlIGxvbmdlc3QgaW5oZXJpdGFuY2UgcGF0aCBmcm9tIFtjbHNdIHRvIGBPYmplY3RgLgogIGZpbmFsIGludCBtYXhJbmhlcml0YW5jZVBhdGg7CgogIGludCBnZXQgZGVwdGggPT4gc3VwZXJjbGFzc2VzLmxlbmd0aDsKCiAgZmluYWwgYm9vbCBoYXNOb1N1Y2hNZXRob2Q7CgogIENsYXNzSGllcmFyY2h5Tm9kZSgKICAgICAgdGhpcy5jbHMsCiAgICAgIHRoaXMuY2xhc3NNZW1iZXJzLAogICAgICB0aGlzLmNsYXNzU2V0dGVycywKICAgICAgdGhpcy5pbnRlcmZhY2VNZW1iZXJzLAogICAgICB0aGlzLmludGVyZmFjZVNldHRlcnMsCiAgICAgIHRoaXMuc3VwZXJjbGFzc2VzLAogICAgICB0aGlzLmludGVyZmFjZXMsCiAgICAgIHRoaXMubWF4SW5oZXJpdGFuY2VQYXRoLAogICAgICB0aGlzLmhhc05vU3VjaE1ldGhvZCk7CgogIC8vLyBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgc3VwZXJ0eXBlcyBvZiBbY2xzXSwgaW5jbHVkaW5nIHRoaXMgbm9kZS4KICBMaXN0PENsYXNzSGllcmFyY2h5Tm9kZT4gY29tcHV0ZUFsbFN1cGVyTm9kZXMoCiAgICAgIENsYXNzSGllcmFyY2h5QnVpbGRlciBoaWVyYXJjaHkpIHsKICAgIExpc3Q8Q2xhc3NIaWVyYXJjaHlOb2RlPiByZXN1bHQgPSBuZXcgTGlzdDxDbGFzc0hpZXJhcmNoeU5vZGU+KAogICAgICAgIDEgKyBzdXBlcmNsYXNzZXMubGVuZ3RoICsgaW50ZXJmYWNlcy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcmNsYXNzZXMubGVuZ3RoOyBpKyspIHsKICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBzdXBlcmNsYXNzZXNbaV0uZGVjbGFyYXRpb247CiAgICAgIGlmIChkZWNsYXJhdGlvbiBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgICByZXN1bHRbaV0gPSBoaWVyYXJjaHkuZ2V0Tm9kZUZyb21DbGFzcyhkZWNsYXJhdGlvbik7CiAgICAgIH0KICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewogICAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IGludGVyZmFjZXNbaV0uZGVjbGFyYXRpb247CiAgICAgIGlmIChkZWNsYXJhdGlvbiBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgICByZXN1bHRbaSArIHN1cGVyY2xhc3Nlcy5sZW5ndGhdID0KICAgICAgICAgICAgaGllcmFyY2h5LmdldE5vZGVGcm9tQ2xhc3MoZGVjbGFyYXRpb24pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Li5sYXN0ID0gdGhpczsKICB9CgogIFN0cmluZyB0b1N0cmluZyhbU3RyaW5nQnVmZmVyIHNiXSkgewogICAgc2IgPz89IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiCiAgICAgIC4ud3JpdGUoY2xzLmZ1bGxOYW1lRm9yRXJyb3JzKQogICAgICAuLndyaXRlbG4oIjoiKTsKICAgIGlmIChtYXhJbmhlcml0YW5jZVBhdGggIT0gdGhpcy5kZXB0aCkgewogICAgICBzYgogICAgICAgIC4ud3JpdGUoIiAgTG9uZ2VzdCBwYXRoIHRvIE9iamVjdDogIikKICAgICAgICAuLndyaXRlbG4obWF4SW5oZXJpdGFuY2VQYXRoKTsKICAgIH0KICAgIHNiLi53cml0ZWxuKCIgIHN1cGVyY2xhc3NlczoiKTsKICAgIGludCBkZXB0aCA9IDA7CiAgICBmb3IgKFR5cGVCdWlsZGVyIHN1cGVyY2xhc3MgaW4gc3VwZXJjbGFzc2VzKSB7CiAgICAgIHNiLndyaXRlKCIgICIgKiAoZGVwdGggKyAyKSk7CiAgICAgIGlmIChkZXB0aCAhPSAwKSBzYi53cml0ZSgiLT4gIik7CiAgICAgIHN1cGVyY2xhc3MucHJpbnRPbihzYik7CiAgICAgIHNiLndyaXRlbG4oKTsKICAgICAgZGVwdGgrKzsKICAgIH0KICAgIGlmIChpbnRlcmZhY2VzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoIiAgaW50ZXJmYWNlczoiKTsKICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgIGZvciAoVHlwZUJ1aWxkZXIgaSBpbiBpbnRlcmZhY2VzKSB7CiAgICAgICAgaWYgKCFmaXJzdCkgc2Iud3JpdGUoIiwiKTsKICAgICAgICBzYi53cml0ZSgiICIpOwogICAgICAgIGkucHJpbnRPbihzYik7CiAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgfQogICAgICBzYi53cml0ZWxuKCk7CiAgICB9CiAgICBwcmludE1lbWJlcnMoY2xhc3NNZW1iZXJzLCBzYiwgImNsYXNzTWVtYmVycyIpOwogICAgcHJpbnRNZW1iZXJzKGNsYXNzU2V0dGVycywgc2IsICJjbGFzc1NldHRlcnMiKTsKICAgIGlmIChpbnRlcmZhY2VNZW1iZXJzICE9IG51bGwpIHsKICAgICAgcHJpbnRNZW1iZXJzKGludGVyZmFjZU1lbWJlcnMsIHNiLCAiaW50ZXJmYWNlTWVtYmVycyIpOwogICAgfQogICAgaWYgKGludGVyZmFjZVNldHRlcnMgIT0gbnVsbCkgewogICAgICBwcmludE1lbWJlcnMoaW50ZXJmYWNlU2V0dGVycywgc2IsICJpbnRlcmZhY2VTZXR0ZXJzIik7CiAgICB9CiAgICByZXR1cm4gIiRzYiI7CiAgfQoKICB2b2lkIHByaW50TWVtYmVycygKICAgICAgTGlzdDxEZWNsYXJhdGlvbj4gbWVtYmVycywgU3RyaW5nQnVmZmVyIHNiLCBTdHJpbmcgaGVhZGluZykgewogICAgc2Iud3JpdGUoIiAgIik7CiAgICBzYi53cml0ZShoZWFkaW5nKTsKICAgIHNiLndyaXRlbG4oIjoiKTsKICAgIGZvciAoRGVjbGFyYXRpb24gbWVtYmVyIGluIG1lbWJlcnMpIHsKICAgICAgc2IKICAgICAgICAuLndyaXRlKCIgICAgIikKICAgICAgICAuLndyaXRlKG1lbWJlci5wYXJlbnQuZnVsbE5hbWVGb3JFcnJvcnMpCiAgICAgICAgLi53cml0ZSgiLiIpCiAgICAgICAgLi53cml0ZShtZW1iZXIuZnVsbE5hbWVGb3JFcnJvcnMpCiAgICAgICAgLi53cml0ZWxuKCk7CiAgICB9CiAgfQoKICBEZWNsYXJhdGlvbiBnZXRJbnRlcmZhY2VNZW1iZXIoTmFtZSBuYW1lLCBib29sIGlzU2V0dGVyKSB7CiAgICByZXR1cm4gZmluZE1lbWJlcigKICAgICAgICBuYW1lLAogICAgICAgIGlzU2V0dGVyCiAgICAgICAgICAgID8gaW50ZXJmYWNlU2V0dGVycyA/PyBjbGFzc1NldHRlcnMKICAgICAgICAgICAgOiBpbnRlcmZhY2VNZW1iZXJzID8/IGNsYXNzTWVtYmVycyk7CiAgfQoKICBEZWNsYXJhdGlvbiBmaW5kTWVtYmVyKE5hbWUgbmFtZSwgTGlzdDxEZWNsYXJhdGlvbj4gZGVjbGFyYXRpb25zKSB7CiAgICAvLyBUT0RPKGFoZSk6IENvbnNpZGVyIGNyZWF0aW5nIGEgbWFwIG9yIHNjb3BlLiBUaGUgb2J2aW91cyBjaG9pY2Ugd291bGQgYmUKICAgIC8vIHRvIHVzZSBzY29wZXMsIGJ1dCB0aGV5IGRvbid0IGhhbmRsZSBwcml2YXRlIG5hbWVzIGNvcnJlY3RseS4KCiAgICAvLyBUaGlzIGlzIGEgY29weSBvZiBgQ2xhc3NIaWVyYXJjaHkuZmluZE1lbWJlckJ5TmFtZWAuCiAgICBpbnQgbG93ID0gMCwgaGlnaCA9IGRlY2xhcmF0aW9ucy5sZW5ndGggLSAxOwogICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgIGludCBtaWQgPSBsb3cgKyAoKGhpZ2ggLSBsb3cpID4+IDEpOwogICAgICBEZWNsYXJhdGlvbiBwaXZvdCA9IGRlY2xhcmF0aW9uc1ttaWRdOwogICAgICBpbnQgY29tcGFyaXNvbiA9IENsYXNzSGllcmFyY2h5LmNvbXBhcmVOYW1lcyhuYW1lLCBwaXZvdC50YXJnZXQubmFtZSk7CiAgICAgIGlmIChjb21wYXJpc29uIDwgMCkgewogICAgICAgIGhpZ2ggPSBtaWQgLSAxOwogICAgICB9IGVsc2UgaWYgKGNvbXBhcmlzb24gPiAwKSB7CiAgICAgICAgbG93ID0gbWlkICsgMTsKICAgICAgfSBlbHNlIGlmIChoaWdoICE9IG1pZCkgewogICAgICAgIC8vIEVuc3VyZSB3ZSBmaW5kIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBnaXZlbiBuYW1lLgogICAgICAgIGhpZ2ggPSBtaWQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBpdm90OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIERlY2xhcmF0aW9uIGdldERpc3BhdGNoVGFyZ2V0KE5hbWUgbmFtZSwgYm9vbCBpc1NldHRlcikgewogICAgcmV0dXJuIGZpbmRNZW1iZXIobmFtZSwgaXNTZXR0ZXIgPyBjbGFzc1NldHRlcnMgOiBjbGFzc01lbWJlcnMpOwogIH0KCiAgc3RhdGljIGludCBjb21wYXJlTWF4SW5oZXJpdGFuY2VQYXRoKAogICAgICBDbGFzc0hpZXJhcmNoeU5vZGUgYSwgQ2xhc3NIaWVyYXJjaHlOb2RlIGIpIHsKICAgIHJldHVybiBiLm1heEluaGVyaXRhbmNlUGF0aC5jb21wYXJlVG8oYS5tYXhJbmhlcml0YW5jZVBhdGgpOwogIH0KfQoKY2xhc3MgTWVyZ2VSZXN1bHQgewogIGZpbmFsIExpc3Q8RGVjbGFyYXRpb24+IG1lcmdlZE1lbWJlcnM7CgogIGZpbmFsIExpc3Q8RGVjbGFyYXRpb24+IG1lcmdlZFNldHRlcnM7CgogIE1lcmdlUmVzdWx0KHRoaXMubWVyZ2VkTWVtYmVycywgdGhpcy5tZXJnZWRTZXR0ZXJzKTsKfQoKZW51bSBNZXJnZUtpbmQgewogIC8vLyBNZXJnaW5nIHN1cGVyY2xhc3MgbWVtYmVycyB3aXRoIHRoZSBjdXJyZW50IGNsYXNzLgogIHN1cGVyY2xhc3NNZW1iZXJzLAoKICAvLy8gTWVyZ2luZyBzdXBlcmNsYXNzIHNldHRlcnMgd2l0aCB0aGUgY3VycmVudCBjbGFzcy4KICBzdXBlcmNsYXNzU2V0dGVycywKCiAgLy8vIE1lcmdpbmcgbWVtYmVycyBvZiB0d28gaW50ZXJmYWNlcy4KICBpbnRlcmZhY2VzTWVtYmVycywKCiAgLy8vIE1lcmdpbmcgc2V0dGVycyBvZiB0d28gaW50ZXJmYWNlcy4KICBpbnRlcmZhY2VzU2V0dGVycywKCiAgLy8vIE1lcmdpbmcgY2xhc3MgbWVtYmVycyB3aXRoIGludGVyZmFjZSBtZW1iZXJzLgogIHN1cGVydHlwZXNNZW1iZXJzLAoKICAvLy8gTWVyZ2luZyBjbGFzcyBzZXR0ZXJzIHdpdGggaW50ZXJmYWNlIHNldHRlcnMuCiAgc3VwZXJ0eXBlc1NldHRlcnMsCgogIC8vLyBNZXJnaW5nIG1lbWJlcnMgd2l0aCBpbmhlcml0ZWQgc2V0dGVycy4KICBtZW1iZXJzV2l0aFNldHRlcnMsCgogIC8vLyBNZXJnaW5nIHNldHRlcnMgd2l0aCBpbmhlcml0ZWQgbWVtYmVycy4KICBzZXR0ZXJzV2l0aE1lbWJlcnMsCn0KCkxpc3Q8TG9jYXRlZE1lc3NhZ2U+IGluaGVyaXRlZENvbmZsaWN0Q29udGV4dChEZWNsYXJhdGlvbiBhLCBEZWNsYXJhdGlvbiBiKSB7CiAgcmV0dXJuIGluaGVyaXRlZENvbmZsaWN0Q29udGV4dEtlcm5lbCgKICAgICAgYS50YXJnZXQsIGIudGFyZ2V0LCBhLmZ1bGxOYW1lRm9yRXJyb3JzLmxlbmd0aCk7Cn0KCkxpc3Q8TG9jYXRlZE1lc3NhZ2U+IGluaGVyaXRlZENvbmZsaWN0Q29udGV4dEtlcm5lbCgKICAgIE1lbWJlciBhLCBNZW1iZXIgYiwgaW50IGxlbmd0aCkgewogIC8vIFRPRE8oYWhlKTogRGVsZXRlIHRoaXMgbWV0aG9kIHdoZW4gaXQgaXNuJ3QgdXNlZCBieSBbSW50ZXJmYWNlUmVzb2x2ZXJdLgogIGludCBjb21wYXJlID0gIiR7YS5maWxlVXJpfSIuY29tcGFyZVRvKCIke2IuZmlsZVVyaX0iKTsKICBpZiAoY29tcGFyZSA9PSAwKSB7CiAgICBjb21wYXJlID0gYS5maWxlT2Zmc2V0LmNvbXBhcmVUbyhiLmZpbGVPZmZzZXQpOwogIH0KICBNZW1iZXIgZmlyc3Q7CiAgTWVtYmVyIHNlY29uZDsKICBpZiAoY29tcGFyZSA8IDApIHsKICAgIGZpcnN0ID0gYTsKICAgIHNlY29uZCA9IGI7CiAgfSBlbHNlIHsKICAgIGZpcnN0ID0gYjsKICAgIHNlY29uZCA9IGE7CiAgfQogIHJldHVybiA8TG9jYXRlZE1lc3NhZ2U+WwogICAgbWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMS53aXRoTG9jYXRpb24oCiAgICAgICAgZmlyc3QuZmlsZVVyaSwgZmlyc3QuZmlsZU9mZnNldCwgbGVuZ3RoKSwKICAgIG1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTIud2l0aExvY2F0aW9uKAogICAgICAgIHNlY29uZC5maWxlVXJpLCBzZWNvbmQuZmlsZU9mZnNldCwgbGVuZ3RoKSwKICBdOwp9CgpjbGFzcyBCdWlsZGVyTWl4aW5JbmZlcnJlciBleHRlbmRzIE1peGluSW5mZXJyZXIgewogIGZpbmFsIENsYXNzQnVpbGRlciBjbHM7CgogIEJ1aWxkZXJNaXhpbkluZmVycmVyKAogICAgICB0aGlzLmNscywgQ29yZVR5cGVzIGNvcmVUeXBlcywgVHlwZUJ1aWxkZXJDb25zdHJhaW50R2F0aGVyZXIgZ2F0aGVyZXIpCiAgICAgIDogc3VwZXIoY29yZVR5cGVzLCBnYXRoZXJlcik7CgogIFN1cGVydHlwZSBhc0luc3RhbnRpYXRpb25PZihTdXBlcnR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlID0KICAgICAgICBnYXRoZXJlci5nZXRUeXBlQXNJbnN0YW5jZU9mKHR5cGUuYXNJbnRlcmZhY2VUeXBlLCBzdXBlcmNsYXNzKTsKICAgIGlmIChpbnRlcmZhY2VUeXBlID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIG5ldyBTdXBlcnR5cGUoaW50ZXJmYWNlVHlwZS5jbGFzc05vZGUsIGludGVyZmFjZVR5cGUudHlwZUFyZ3VtZW50cyk7CiAgfQoKICB2b2lkIHJlcG9ydFByb2JsZW0oTWVzc2FnZSBtZXNzYWdlLCBDbGFzcyBrZXJuZWxDbGFzcykgewogICAgaW50IGxlbmd0aCA9IGNscy5pc01peGluQXBwbGljYXRpb24gPyAxIDogY2xzLmZ1bGxOYW1lRm9yRXJyb3JzLmxlbmd0aDsKICAgIGNscy5hZGRQcm9ibGVtKG1lc3NhZ2UsIGNscy5jaGFyT2Zmc2V0LCBsZW5ndGgpOwogIH0KfQoKY2xhc3MgVHlwZUJ1aWxkZXJDb25zdHJhaW50R2F0aGVyZXIgZXh0ZW5kcyBUeXBlQ29uc3RyYWludEdhdGhlcmVyCiAgICB3aXRoIFN0YW5kYXJkQm91bmRzIHsKICBmaW5hbCBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgaGllcmFyY2h5OwoKICBUeXBlQnVpbGRlckNvbnN0cmFpbnRHYXRoZXJlcigKICAgICAgdGhpcy5oaWVyYXJjaHksIEl0ZXJhYmxlPFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKQogICAgICA6IHN1cGVyLnN1YmNsYXNzaW5nKHR5cGVQYXJhbWV0ZXJzKTsKCiAgQG92ZXJyaWRlCiAgQ2xhc3MgZ2V0IG9iamVjdENsYXNzID0+IGhpZXJhcmNoeS5vYmplY3RLZXJuZWxDbGFzczsKCiAgQG92ZXJyaWRlCiAgQ2xhc3MgZ2V0IGZ1bmN0aW9uQ2xhc3MgPT4gaGllcmFyY2h5LmZ1bmN0aW9uS2VybmVsQ2xhc3M7CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBmdXR1cmVPckNsYXNzID0+IGhpZXJhcmNoeS5mdXR1cmVPcktlcm5lbENsYXNzOwoKICBAb3ZlcnJpZGUKICBDbGFzcyBnZXQgbnVsbENsYXNzID0+IGhpZXJhcmNoeS5udWxsS2VybmVsQ2xhc3M7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IG51bGxUeXBlID0+IG51bGxDbGFzcy5yYXdUeXBlOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCBvYmplY3RUeXBlID0+IG9iamVjdENsYXNzLnJhd1R5cGU7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IHJhd0Z1bmN0aW9uVHlwZSA9PiBmdW5jdGlvbkNsYXNzLnJhd1R5cGU7CgogIEBvdmVycmlkZQogIHZvaWQgYWRkTG93ZXJCb3VuZChUeXBlQ29uc3RyYWludCBjb25zdHJhaW50LCBEYXJ0VHlwZSBsb3dlcikgewogICAgY29uc3RyYWludC5sb3dlciA9IGdldFN0YW5kYXJkVXBwZXJCb3VuZChjb25zdHJhaW50Lmxvd2VyLCBsb3dlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFVwcGVyQm91bmQoVHlwZUNvbnN0cmFpbnQgY29uc3RyYWludCwgRGFydFR5cGUgdXBwZXIpIHsKICAgIGNvbnN0cmFpbnQudXBwZXIgPSBnZXRTdGFuZGFyZExvd2VyQm91bmQoY29uc3RyYWludC51cHBlciwgdXBwZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldEludGVyZmFjZU1lbWJlcihDbGFzcyBjbGFzc18sIE5hbWUgbmFtZSwge2Jvb2wgc2V0dGVyOiBmYWxzZX0pIHsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRUeXBlQXNJbnN0YW5jZU9mKEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgcmV0dXJuIGhpZXJhcmNoeS5nZXRLZXJuZWxUeXBlQXNJbnN0YW5jZU9mKHR5cGUsIHN1cGVyY2xhc3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBmdXR1cmVUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShoaWVyYXJjaHkuZnV0dXJlS2VybmVsQ2xhc3MsIDxEYXJ0VHlwZT5bdHlwZV0pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1N1YnR5cGVPZihEYXJ0VHlwZSBzdWJ0eXBlLCBEYXJ0VHlwZSBzdXBlcnR5cGUpIHsKICAgIHJldHVybiBoaWVyYXJjaHkudHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwoc3VidHlwZSwgc3VwZXJ0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0TGVnYWN5TGVhc3RVcHBlckJvdW5kKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUxLCBJbnRlcmZhY2VUeXBlIHR5cGUyKSB7CiAgICByZXR1cm4gaGllcmFyY2h5LmdldEtlcm5lbExlZ2FjeUxlYXN0VXBwZXJCb3VuZCh0eXBlMSwgdHlwZTIpOwogIH0KfQoKY2xhc3MgRGVsYXllZE92ZXJyaWRlQ2hlY2sgewogIGZpbmFsIENsYXNzQnVpbGRlciBjbHM7CiAgZmluYWwgRGVjbGFyYXRpb24gYTsKICBmaW5hbCBEZWNsYXJhdGlvbiBiOwoKICBjb25zdCBEZWxheWVkT3ZlcnJpZGVDaGVjayh0aGlzLmNscywgdGhpcy5hLCB0aGlzLmIpOwoKICB2b2lkIGNoZWNrKENsYXNzSGllcmFyY2h5QnVpbGRlciBoaWVyYXJjaHkpIHsKICAgIHZvaWQgY2FsbGJhY2soCiAgICAgICAgTWVtYmVyIGRlY2xhcmVkTWVtYmVyLCBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLCBib29sIGlzU2V0dGVyKSB7CiAgICAgIGNscy5jaGVja092ZXJyaWRlKAogICAgICAgICAgaGllcmFyY2h5LnR5cGVzLCBkZWNsYXJlZE1lbWJlciwgaW50ZXJmYWNlTWVtYmVyLCBpc1NldHRlciwgY2FsbGJhY2ssCiAgICAgICAgICBpc0ludGVyZmFjZUNoZWNrOiAhY2xzLmlzTWl4aW5BcHBsaWNhdGlvbik7CiAgICB9CgogICAgRGVjbGFyYXRpb24gYSA9IHRoaXMuYTsKICAgIGRlYnVnPy5sb2coCiAgICAgICAgIkRlbGF5ZWQgb3ZlcnJpZGUgY2hlY2sgb2YgJHtmdWxsTmFtZShhKX0gJHtmdWxsTmFtZShiKX0gd3J0LiAke2Nscy5mdWxsTmFtZUZvckVycm9yc30iKTsKICAgIGlmIChjbHMgPT0gYS5wYXJlbnQpIHsKICAgICAgaWYgKGEgaXMgUHJvY2VkdXJlQnVpbGRlcikgewogICAgICAgIGlmIChhLmlzR2V0dGVyICYmICFoYXNFeHBsaWNpdFJldHVyblR5cGUoYSkpIHsKICAgICAgICAgIERhcnRUeXBlIHR5cGU7CiAgICAgICAgICBpZiAoYi5pc0dldHRlcikgewogICAgICAgICAgICBQcm9jZWR1cmUgYlRhcmdldCA9IGIudGFyZ2V0OwogICAgICAgICAgICB0eXBlID0gYlRhcmdldC5mdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgICAgICAgfSBlbHNlIGlmIChiLmlzU2V0dGVyKSB7CiAgICAgICAgICAgIFByb2NlZHVyZSBiVGFyZ2V0ID0gYi50YXJnZXQ7CiAgICAgICAgICAgIHR5cGUgPSBiVGFyZ2V0LmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLnNpbmdsZS50eXBlOwogICAgICAgICAgfSBlbHNlIGlmIChiLmlzRmllbGQpIHsKICAgICAgICAgICAgRmllbGQgYlRhcmdldCA9IGIudGFyZ2V0OwogICAgICAgICAgICB0eXBlID0gYlRhcmdldC50eXBlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICAgICAgICB0eXBlID0gU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKAogICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeS5nZXRLZXJuZWxUeXBlQXNJbnN0YW5jZU9mKAogICAgICAgICAgICAgICAgICAgICAgICBjbHMuY2xzLnRoaXNUeXBlLCBiLnRhcmdldC5lbmNsb3NpbmdDbGFzcykpCiAgICAgICAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUodHlwZSk7CiAgICAgICAgICAgIGlmICghYS5oYWRUeXBlc0luZmVycmVkIHx8ICFiLmlzU2V0dGVyKSB7CiAgICAgICAgICAgICAgaW5mZXJSZXR1cm5UeXBlKGNscywgYSwgdHlwZSwgYS5oYWRUeXBlc0luZmVycmVkLCBoaWVyYXJjaHkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChhLmlzU2V0dGVyICYmICFoYXNFeHBsaWNpdGx5VHlwZWRGb3JtYWxQYXJhbWV0ZXIoYSwgMCkpIHsKICAgICAgICAgIERhcnRUeXBlIHR5cGU7CiAgICAgICAgICBpZiAoYi5pc0dldHRlcikgewogICAgICAgICAgICBQcm9jZWR1cmUgYlRhcmdldCA9IGIudGFyZ2V0OwogICAgICAgICAgICB0eXBlID0gYlRhcmdldC5mdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgICAgICAgfSBlbHNlIGlmIChiLmlzU2V0dGVyKSB7CiAgICAgICAgICAgIFByb2NlZHVyZSBiVGFyZ2V0ID0gYi50YXJnZXQ7CiAgICAgICAgICAgIHR5cGUgPSBiVGFyZ2V0LmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLnNpbmdsZS50eXBlOwogICAgICAgICAgfSBlbHNlIGlmIChiLmlzRmllbGQpIHsKICAgICAgICAgICAgRmllbGQgYlRhcmdldCA9IGIudGFyZ2V0OwogICAgICAgICAgICB0eXBlID0gYlRhcmdldC50eXBlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICAgICAgICB0eXBlID0gU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKAogICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeS5nZXRLZXJuZWxUeXBlQXNJbnN0YW5jZU9mKAogICAgICAgICAgICAgICAgICAgICAgICBjbHMuY2xzLnRoaXNUeXBlLCBiLnRhcmdldC5lbmNsb3NpbmdDbGFzcykpCiAgICAgICAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUodHlwZSk7CiAgICAgICAgICAgIGlmICghYS5oYWRUeXBlc0luZmVycmVkIHx8ICFiLmlzR2V0dGVyKSB7CiAgICAgICAgICAgICAgaW5mZXJQYXJhbWV0ZXJUeXBlKGNscywgYSwgYS5mb3JtYWxzLnNpbmdsZSwgdHlwZSwKICAgICAgICAgICAgICAgICAgYS5oYWRUeXBlc0luZmVycmVkLCBoaWVyYXJjaHkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGEuaGFkVHlwZXNJbmZlcnJlZCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoYSBpcyBLZXJuZWxGaWVsZEJ1aWxkZXIgJiYgYS50eXBlID09IG51bGwpIHsKICAgICAgICBEYXJ0VHlwZSB0eXBlOwogICAgICAgIGlmIChiLmlzR2V0dGVyKSB7CiAgICAgICAgICBQcm9jZWR1cmUgYlRhcmdldCA9IGIudGFyZ2V0OwogICAgICAgICAgdHlwZSA9IGJUYXJnZXQuZnVuY3Rpb24ucmV0dXJuVHlwZTsKICAgICAgICB9IGVsc2UgaWYgKGIuaXNTZXR0ZXIpIHsKICAgICAgICAgIFByb2NlZHVyZSBiVGFyZ2V0ID0gYi50YXJnZXQ7CiAgICAgICAgICB0eXBlID0gYlRhcmdldC5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5zaW5nbGUudHlwZTsKICAgICAgICB9IGVsc2UgaWYgKGIuaXNGaWVsZCkgewogICAgICAgICAgRmllbGQgYlRhcmdldCA9IGIudGFyZ2V0OwogICAgICAgICAgdHlwZSA9IGJUYXJnZXQudHlwZTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICAgICAgdHlwZSA9IFN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgICAgICAgaGllcmFyY2h5LmdldEtlcm5lbFR5cGVBc0luc3RhbmNlT2YoCiAgICAgICAgICAgICAgICAgICAgICBjbHMuY2xzLnRoaXNUeXBlLCBiLnRhcmdldC5lbmNsb3NpbmdDbGFzcykpCiAgICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHR5cGUpOwogICAgICAgICAgaWYgKHR5cGUgIT0gYS50YXJnZXQudHlwZSkgewogICAgICAgICAgICBpZiAoYS5oYWRUeXBlc0luZmVycmVkKSB7CiAgICAgICAgICAgICAgaWYgKGIuaXNTZXR0ZXIgJiYKICAgICAgICAgICAgICAgICAgKCFpbXBsaWVzU2V0dGVyKGEpIHx8CiAgICAgICAgICAgICAgICAgICAgICBoaWVyYXJjaHkudHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwodHlwZSwgYS50YXJnZXQudHlwZSkpKSB7CiAgICAgICAgICAgICAgICB0eXBlID0gYS50YXJnZXQudHlwZTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmVwb3J0Q2FudEluZmVyRmllbGRUeXBlKGNscywgYSk7CiAgICAgICAgICAgICAgICB0eXBlID0gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVidWc/LmxvZygiSW5mZXJyZWQgdHlwZSAke3R5cGV9IGZvciAke2Z1bGxOYW1lKGEpfSIpOwogICAgICAgICAgICBhLnRhcmdldC50eXBlID0gdHlwZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYS5oYWRUeXBlc0luZmVycmVkID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIGNhbGxiYWNrKGEudGFyZ2V0LCBiLnRhcmdldCwgYS5pc1NldHRlcik7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBEZWxheWVkTWVtYmVyIGV4dGVuZHMgRGVjbGFyYXRpb24gewogIC8vLyBUaGUgY2xhc3Mgd2hpY2ggaGFzIGluaGVyaXRlZCBbZGVjbGFyYXRpb25zXS4KICBAb3ZlcnJpZGUKICBmaW5hbCBDbGFzc0J1aWxkZXIgcGFyZW50OwoKICAvLy8gQ29uZmxpY3RpbmcgZGVjbGFyYXRpb25zLgogIGZpbmFsIExpc3Q8RGVjbGFyYXRpb24+IGRlY2xhcmF0aW9uczsKCiAgZmluYWwgaXNTZXR0ZXI7CgogIGZpbmFsIGJvb2wgbW9kaWZ5S2VybmVsOwoKICBEZWxheWVkTWVtYmVyKAogICAgICB0aGlzLnBhcmVudCwgdGhpcy5kZWNsYXJhdGlvbnMsIHRoaXMuaXNTZXR0ZXIsIHRoaXMubW9kaWZ5S2VybmVsKTsKCiAgdm9pZCBhZGRBbGxEZWNsYXJhdGlvbnNUbyhMaXN0PERlY2xhcmF0aW9uPiBkZWNsYXJhdGlvbnMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5kZWNsYXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgYWRkRGVjbGFyYXRpb25JZkRpZmZlcmVudCh0aGlzLmRlY2xhcmF0aW9uc1tpXSwgZGVjbGFyYXRpb25zKTsKICAgIH0KICAgIGFzc2VydChkZWNsYXJhdGlvbnMudG9TZXQoKS5sZW5ndGggPT0gZGVjbGFyYXRpb25zLmxlbmd0aCk7CiAgfQoKICBNZW1iZXIgY2hlY2soQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSk7CgogIERlbGF5ZWRNZW1iZXIgd2l0aFBhcmVudChDbGFzc0J1aWxkZXIgcGFyZW50KTsKCiAgQG92ZXJyaWRlCiAgVXJpIGdldCBmaWxlVXJpID0+IHBhcmVudC5maWxlVXJpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGNoYXJPZmZzZXQgPT4gcGFyZW50LmNoYXJPZmZzZXQ7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgPT4gZGVjbGFyYXRpb25zLm1hcChmdWxsTmFtZSkuam9pbigiJSIpOwoKICBib29sIGdldCBpc0luaGVyaXRhYmxlQ29uZmxpY3QgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldCB0YXJnZXQgPT4gZGVjbGFyYXRpb25zLmZpcnN0LnRhcmdldDsKfQoKLy8vIFRoaXMgcmVwcmVzZW50cyBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGluaGVyaXRlZCBmcm9tIGEgc3VwZXJjbGFzcyB0aGF0Ci8vLyBoYXMgY29uZmxpY3RzIHdpdGggbWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBhbiBpbnRlcmZhY2UuIFRoZSBjb25jcmV0ZQovLy8gaW1wbGVtZW50YXRpb24gaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgW2RlY2xhcmF0aW9uc10uCmNsYXNzIEluaGVyaXRlZEltcGxlbWVudGF0aW9uSW50ZXJmYWNlQ29uZmxpY3QgZXh0ZW5kcyBEZWxheWVkTWVtYmVyIHsKICBNZW1iZXIgY29tYmluZWRNZW1iZXJTaWduYXR1cmVSZXN1bHQ7CgogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgaXNJbmhlcml0YWJsZUNvbmZsaWN0OwoKICBJbmhlcml0ZWRJbXBsZW1lbnRhdGlvbkludGVyZmFjZUNvbmZsaWN0KENsYXNzQnVpbGRlciBwYXJlbnQsCiAgICAgIExpc3Q8RGVjbGFyYXRpb24+IGRlY2xhcmF0aW9ucywgYm9vbCBpc1NldHRlciwgYm9vbCBtb2RpZnlLZXJuZWwsCiAgICAgIHt0aGlzLmlzSW5oZXJpdGFibGVDb25mbGljdCA9IHRydWV9KQogICAgICA6IHN1cGVyKHBhcmVudCwgZGVjbGFyYXRpb25zLCBpc1NldHRlciwgbW9kaWZ5S2VybmVsKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICJJbmhlcml0ZWRJbXBsZW1lbnRhdGlvbkludGVyZmFjZUNvbmZsaWN0KCIKICAgICAgICAiJHtwYXJlbnQuZnVsbE5hbWVGb3JFcnJvcnN9LCAiCiAgICAgICAgIlske2RlY2xhcmF0aW9ucy5tYXAoZnVsbE5hbWUpLmpvaW4oJywgJyl9XSkiOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGNoZWNrKENsYXNzSGllcmFyY2h5QnVpbGRlciBoaWVyYXJjaHkpIHsKICAgIGlmIChjb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBjb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdDsKICAgIH0KICAgIGlmICghcGFyZW50LmlzQWJzdHJhY3QpIHsKICAgICAgRGVjbGFyYXRpb24gY29uY3JldGVJbXBsZW1lbnRhdGlvbiA9IGRlY2xhcmF0aW9ucy5maXJzdDsKICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBkZWNsYXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBuZXcgRGVsYXllZE92ZXJyaWRlQ2hlY2soCiAgICAgICAgICAgICAgICBwYXJlbnQsIGNvbmNyZXRlSW1wbGVtZW50YXRpb24sIGRlY2xhcmF0aW9uc1tpXSkKICAgICAgICAgICAgLmNoZWNrKGhpZXJhcmNoeSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdCA9CiAgICAgICAgbmV3IEludGVyZmFjZUNvbmZsaWN0KHBhcmVudCwgZGVjbGFyYXRpb25zLCBpc1NldHRlciwgbW9kaWZ5S2VybmVsKQogICAgICAgICAgICAuY2hlY2soaGllcmFyY2h5KTsKICB9CgogIEBvdmVycmlkZQogIERlbGF5ZWRNZW1iZXIgd2l0aFBhcmVudChDbGFzc0J1aWxkZXIgcGFyZW50KSB7CiAgICByZXR1cm4gcGFyZW50ID09IHRoaXMucGFyZW50CiAgICAgICAgPyB0aGlzCiAgICAgICAgOiBuZXcgSW5oZXJpdGVkSW1wbGVtZW50YXRpb25JbnRlcmZhY2VDb25mbGljdCgKICAgICAgICAgICAgcGFyZW50LCBkZWNsYXJhdGlvbnMsIGlzU2V0dGVyLCBtb2RpZnlLZXJuZWwpOwogIH0KCiAgc3RhdGljIERlY2xhcmF0aW9uIGNvbWJpbmVkKAogICAgICBDbGFzc0J1aWxkZXIgcGFyZW50LAogICAgICBEZWNsYXJhdGlvbiBjb25jcmV0ZUltcGxlbWVudGF0aW9uLAogICAgICBEZWNsYXJhdGlvbiBvdGhlciwKICAgICAgYm9vbCBpc1NldHRlciwKICAgICAgYm9vbCBjcmVhdGVGb3J3YXJkZXJzLAogICAgICB7Ym9vbCBpc0luaGVyaXRhYmxlQ29uZmxpY3QgPSB0cnVlfSkgewogICAgTGlzdDxEZWNsYXJhdGlvbj4gZGVjbGFyYXRpb25zID0gPERlY2xhcmF0aW9uPltdOwogICAgaWYgKGNvbmNyZXRlSW1wbGVtZW50YXRpb24gaXMgRGVsYXllZE1lbWJlcikgewogICAgICBjb25jcmV0ZUltcGxlbWVudGF0aW9uLmFkZEFsbERlY2xhcmF0aW9uc1RvKGRlY2xhcmF0aW9ucyk7CiAgICB9IGVsc2UgewogICAgICBkZWNsYXJhdGlvbnMuYWRkKGNvbmNyZXRlSW1wbGVtZW50YXRpb24pOwogICAgfQogICAgaWYgKG90aGVyIGlzIERlbGF5ZWRNZW1iZXIpIHsKICAgICAgb3RoZXIuYWRkQWxsRGVjbGFyYXRpb25zVG8oZGVjbGFyYXRpb25zKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZERlY2xhcmF0aW9uSWZEaWZmZXJlbnQob3RoZXIsIGRlY2xhcmF0aW9ucyk7CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb25zLmxlbmd0aCA9PSAxKSB7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbnMuc2luZ2xlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBJbmhlcml0ZWRJbXBsZW1lbnRhdGlvbkludGVyZmFjZUNvbmZsaWN0KAogICAgICAgICAgcGFyZW50LCBkZWNsYXJhdGlvbnMsIGlzU2V0dGVyLCBjcmVhdGVGb3J3YXJkZXJzLAogICAgICAgICAgaXNJbmhlcml0YWJsZUNvbmZsaWN0OiBpc0luaGVyaXRhYmxlQ29uZmxpY3QpOwogICAgfQogIH0KfQoKY2xhc3MgSW50ZXJmYWNlQ29uZmxpY3QgZXh0ZW5kcyBEZWxheWVkTWVtYmVyIHsKICBJbnRlcmZhY2VDb25mbGljdChDbGFzc0J1aWxkZXIgcGFyZW50LCBMaXN0PERlY2xhcmF0aW9uPiBkZWNsYXJhdGlvbnMsCiAgICAgIGJvb2wgaXNTZXR0ZXIsIGJvb2wgbW9kaWZ5S2VybmVsKQogICAgICA6IHN1cGVyKHBhcmVudCwgZGVjbGFyYXRpb25zLCBpc1NldHRlciwgbW9kaWZ5S2VybmVsKTsKCiAgTWVtYmVyIGNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlUmVzdWx0OwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIkludGVyZmFjZUNvbmZsaWN0KCR7cGFyZW50LmZ1bGxOYW1lRm9yRXJyb3JzfSwgIgogICAgICAgICJbJHtkZWNsYXJhdGlvbnMubWFwKGZ1bGxOYW1lKS5qb2luKCcsICcpfV0pIjsKICB9CgogIERhcnRUeXBlIGNvbXB1dGVNZW1iZXJUeXBlKAogICAgICBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgaGllcmFyY2h5LCBEYXJ0VHlwZSB0aGlzVHlwZSwgTWVtYmVyIG1lbWJlcikgewogICAgRGFydFR5cGUgdHlwZTsKICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgIGlmIChtZW1iZXIuaXNHZXR0ZXIpIHsKICAgICAgICB0eXBlID0gbWVtYmVyLmdldHRlclR5cGU7CiAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzU2V0dGVyKSB7CiAgICAgICAgdHlwZSA9IG1lbWJlci5zZXR0ZXJUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIHR5cGUgPSBtZW1iZXIuZnVuY3Rpb24uZnVuY3Rpb25UeXBlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG1lbWJlciBpcyBGaWVsZCkgewogICAgICB0eXBlID0gbWVtYmVyLnR5cGU7CiAgICB9IGVsc2UgewogICAgICB1bmhhbmRsZWQoIiR7bWVtYmVyLnJ1bnRpbWVUeXBlfSIsICIkbWVtYmVyIiwgcGFyZW50LmNoYXJPZmZzZXQsCiAgICAgICAgICBwYXJlbnQuZmlsZVVyaSk7CiAgICB9CiAgICByZXR1cm4gU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKGhpZXJhcmNoeS5nZXRLZXJuZWxUeXBlQXNJbnN0YW5jZU9mKAogICAgICAgICAgICB0aGlzVHlwZSwgbWVtYmVyLmVuY2xvc2luZ0NsYXNzKSkKICAgICAgICAuc3Vic3RpdHV0ZVR5cGUodHlwZSk7CiAgfQoKICBib29sIGlzTW9yZVNwZWNpZmljKENsYXNzSGllcmFyY2h5QnVpbGRlciBoaWVyYXJjaHksIERhcnRUeXBlIGEsIERhcnRUeXBlIGIpIHsKICAgIGlmIChpc1NldHRlcikgewogICAgICByZXR1cm4gaGllcmFyY2h5LnR5cGVzLmlzU3VidHlwZU9mS2VybmVsKGIsIGEpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGhpZXJhcmNoeS50eXBlcy5pc1N1YnR5cGVPZktlcm5lbChhLCBiKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIE1lbWJlciBjaGVjayhDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgaGllcmFyY2h5KSB7CiAgICBpZiAoY29tYmluZWRNZW1iZXJTaWduYXR1cmVSZXN1bHQgIT0gbnVsbCkgewogICAgICByZXR1cm4gY29tYmluZWRNZW1iZXJTaWduYXR1cmVSZXN1bHQ7CiAgICB9CiAgICBpZiAocGFyZW50LmxpYnJhcnkgaXMhIEtlcm5lbExpYnJhcnlCdWlsZGVyKSB7CiAgICAgIHJldHVybiBjb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdCA9IGRlY2xhcmF0aW9ucy5maXJzdC50YXJnZXQ7CiAgICB9CiAgICBEYXJ0VHlwZSB0aGlzVHlwZSA9IHBhcmVudC5jbHMudGhpc1R5cGU7CiAgICBEZWNsYXJhdGlvbiBiZXN0U29GYXI7CiAgICBEYXJ0VHlwZSBiZXN0VHlwZVNvRmFyOwogICAgZm9yIChpbnQgaSA9IGRlY2xhcmF0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICBEZWNsYXJhdGlvbiBjYW5kaWRhdGUgPSBkZWNsYXJhdGlvbnNbaV07CiAgICAgIE1lbWJlciB0YXJnZXQgPSBjYW5kaWRhdGUudGFyZ2V0OwogICAgICBEYXJ0VHlwZSBjYW5kaWRhdGVUeXBlID0gY29tcHV0ZU1lbWJlclR5cGUoaGllcmFyY2h5LCB0aGlzVHlwZSwgdGFyZ2V0KTsKICAgICAgaWYgKGJlc3RTb0ZhciA9PSBudWxsKSB7CiAgICAgICAgYmVzdFNvRmFyID0gY2FuZGlkYXRlOwogICAgICAgIGJlc3RUeXBlU29GYXIgPSBjYW5kaWRhdGVUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChpc01vcmVTcGVjaWZpYyhoaWVyYXJjaHksIGNhbmRpZGF0ZVR5cGUsIGJlc3RUeXBlU29GYXIpKSB7CiAgICAgICAgICBkZWJ1Zz8ubG9nKAogICAgICAgICAgICAgICJDb21iaW5lZCBNZW1iZXIgU2lnbmF0dXJlOiAke2Z1bGxOYW1lKGNhbmRpZGF0ZSl9ICR7Y2FuZGlkYXRlVHlwZX0gPDogJHtmdWxsTmFtZShiZXN0U29GYXIpfSAke2Jlc3RUeXBlU29GYXJ9Iik7CiAgICAgICAgICBiZXN0U29GYXIgPSBjYW5kaWRhdGU7CiAgICAgICAgICBiZXN0VHlwZVNvRmFyID0gY2FuZGlkYXRlVHlwZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGVidWc/LmxvZygKICAgICAgICAgICAgICAiQ29tYmluZWQgTWVtYmVyIFNpZ25hdHVyZTogJHtmdWxsTmFtZShjYW5kaWRhdGUpfSAhPDogJHtmdWxsTmFtZShiZXN0U29GYXIpfSIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGJlc3RTb0ZhciAhPSBudWxsKSB7CiAgICAgIGRlYnVnPy5sb2coIkNvbWJpbmVkIE1lbWJlciBTaWduYXR1cmUgYmVzdFNvRmFyOiAke2Z1bGxOYW1lKGJlc3RTb0Zhcil9Iik7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVjbGFyYXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgRGVjbGFyYXRpb24gY2FuZGlkYXRlID0gZGVjbGFyYXRpb25zW2ldOwogICAgICAgIE1lbWJlciB0YXJnZXQgPSBjYW5kaWRhdGUudGFyZ2V0OwogICAgICAgIERhcnRUeXBlIGNhbmRpZGF0ZVR5cGUgPSBjb21wdXRlTWVtYmVyVHlwZShoaWVyYXJjaHksIHRoaXNUeXBlLCB0YXJnZXQpOwogICAgICAgIGlmICghaXNNb3JlU3BlY2lmaWMoaGllcmFyY2h5LCBiZXN0VHlwZVNvRmFyLCBjYW5kaWRhdGVUeXBlKSkgewogICAgICAgICAgZGVidWc/LmxvZygKICAgICAgICAgICAgICAiQ29tYmluZWQgTWVtYmVyIFNpZ25hdHVyZTogJHtmdWxsTmFtZShiZXN0U29GYXIpfSAhPDogJHtmdWxsTmFtZShjYW5kaWRhdGUpfSIpOwoKICAgICAgICAgIFN0cmluZyB1cmkgPSAnJHtwYXJlbnQubGlicmFyeS51cml9JzsKICAgICAgICAgIGlmICh1cmkgPT0gJ2RhcnQ6anMnICYmCiAgICAgICAgICAgICAgICAgIHBhcmVudC5maWxlVXJpLnBhdGhTZWdtZW50cy5sYXN0ID09ICdqc19kYXJ0MmpzLmRhcnQnIHx8CiAgICAgICAgICAgICAgdXJpID09ICdkYXJ0Ol9pbnRlcmNlcHRvcnMnICYmCiAgICAgICAgICAgICAgICAgIHBhcmVudC5maWxlVXJpLnBhdGhTZWdtZW50cy5sYXN0ID09ICdqc19udW1iZXIuZGFydCcpIHsKICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRml4IHRoZSBkYXJ0MmpzIGxpYnJhcmllcyBhbmQgcmVtb3ZlIHRoZQogICAgICAgICAgICAvLyBhYm92ZSBVUklzLgogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYmVzdFNvRmFyID0gbnVsbDsKICAgICAgICAgICAgYmVzdFR5cGVTb0ZhciA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChiZXN0U29GYXIgPT0gbnVsbCkgewogICAgICBTdHJpbmcgbmFtZSA9IHBhcmVudC5mdWxsTmFtZUZvckVycm9yczsKICAgICAgaW50IGxlbmd0aCA9IHBhcmVudC5pc0Fub255bW91c01peGluQXBwbGljYXRpb24gPyAxIDogbmFtZS5sZW5ndGg7CiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQgPSBkZWNsYXJhdGlvbnMubWFwKChEZWNsYXJhdGlvbiBkKSB7CiAgICAgICAgcmV0dXJuIG1lc3NhZ2VEZWNsYXJlZE1lbWJlckNvbmZsaWN0c1dpdGhJbmhlcml0ZWRNZW1iZXJDYXVzZQogICAgICAgICAgICAud2l0aExvY2F0aW9uKGQuZmlsZVVyaSwgZC5jaGFyT2Zmc2V0LCBkLmZ1bGxOYW1lRm9yRXJyb3JzLmxlbmd0aCk7CiAgICAgIH0pLnRvTGlzdCgpOwoKICAgICAgcGFyZW50LmFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlRmFpbGVkLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgcGFyZW50LmZ1bGxOYW1lRm9yRXJyb3JzLCBkZWNsYXJhdGlvbnMuZmlyc3QuZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgcGFyZW50LmNoYXJPZmZzZXQsCiAgICAgICAgICBsZW5ndGgsCiAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBkZWJ1Zz8ubG9nKAogICAgICAgICJDb21iaW5lZCBNZW1iZXIgU2lnbmF0dXJlIG9mICR7ZnVsbE5hbWVGb3JFcnJvcnN9OiAke2Z1bGxOYW1lKGJlc3RTb0Zhcil9Iik7CgogICAgUHJvY2VkdXJlS2luZCBraW5kID0gUHJvY2VkdXJlS2luZC5NZXRob2Q7CiAgICBpZiAoYmVzdFNvRmFyLmlzRmllbGQgfHwgYmVzdFNvRmFyLmlzU2V0dGVyIHx8IGJlc3RTb0Zhci5pc0dldHRlcikgewogICAgICBraW5kID0gaXNTZXR0ZXIgPyBQcm9jZWR1cmVLaW5kLlNldHRlciA6IFByb2NlZHVyZUtpbmQuR2V0dGVyOwogICAgfSBlbHNlIGlmIChiZXN0U29GYXIudGFyZ2V0IGlzIFByb2NlZHVyZSAmJgogICAgICAgIGJlc3RTb0Zhci50YXJnZXQua2luZCA9PSBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yKSB7CiAgICAgIGtpbmQgPSBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yOwogICAgfQoKICAgIGlmIChtb2RpZnlLZXJuZWwpIHsKICAgICAgZGVidWc/LmxvZygKICAgICAgICAgICJDb21iaW5lZCBNZW1iZXIgU2lnbmF0dXJlIG9mICR7ZnVsbE5hbWVGb3JFcnJvcnN9OiBuZXcgRm9yd2FyZGluZ05vZGUoJHBhcmVudCwgJGJlc3RTb0ZhciwgJGRlY2xhcmF0aW9ucywgJGtpbmQpIik7CiAgICAgIE1lbWJlciBzdHViID0KICAgICAgICAgIG5ldyBGb3J3YXJkaW5nTm9kZShoaWVyYXJjaHksIHBhcmVudCwgYmVzdFNvRmFyLCBkZWNsYXJhdGlvbnMsIGtpbmQpCiAgICAgICAgICAgICAgLmZpbmFsaXplKCk7CiAgICAgIGlmIChwYXJlbnQuY2xzID09IHN0dWIuZW5jbG9zaW5nQ2xhc3MpIHsKICAgICAgICBwYXJlbnQuY2xzLmFkZE1lbWJlcihzdHViKTsKICAgICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gcGFyZW50LmxpYnJhcnk7CiAgICAgICAgaWYgKGJlc3RTb0Zhci50YXJnZXQgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgICBsaWJyYXJ5LmZvcndhcmRlcnNPcmlnaW5zLi5hZGQoc3R1YikuLmFkZChiZXN0U29GYXIudGFyZ2V0KTsKICAgICAgICB9CiAgICAgICAgZGVidWc/LmxvZygKICAgICAgICAgICAgIkNvbWJpbmVkIE1lbWJlciBTaWduYXR1cmUgb2YgJHtmdWxsTmFtZUZvckVycm9yc306IGFkZGVkIHN0dWIgJHN0dWIiKTsKICAgICAgICBpZiAocGFyZW50LmlzTWl4aW5BcHBsaWNhdGlvbikgewogICAgICAgICAgcmV0dXJuIGNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlUmVzdWx0ID0gYmVzdFNvRmFyLnRhcmdldDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlUmVzdWx0ID0gc3R1YjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBkZWJ1Zz8ubG9nKAogICAgICAgICJDb21iaW5lZCBNZW1iZXIgU2lnbmF0dXJlIG9mICR7ZnVsbE5hbWVGb3JFcnJvcnN9OiBwaWNrZWQgYmVzdFNvRmFyIik7CiAgICByZXR1cm4gY29tYmluZWRNZW1iZXJTaWduYXR1cmVSZXN1bHQgPSBiZXN0U29GYXIudGFyZ2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRGVsYXllZE1lbWJlciB3aXRoUGFyZW50KENsYXNzQnVpbGRlciBwYXJlbnQpIHsKICAgIHJldHVybiBwYXJlbnQgPT0gdGhpcy5wYXJlbnQKICAgICAgICA/IHRoaXMKICAgICAgICA6IG5ldyBJbnRlcmZhY2VDb25mbGljdChwYXJlbnQsIGRlY2xhcmF0aW9ucywgaXNTZXR0ZXIsIG1vZGlmeUtlcm5lbCk7CiAgfQoKICBzdGF0aWMgRGVjbGFyYXRpb24gY29tYmluZWQoQ2xhc3NCdWlsZGVyIHBhcmVudCwgRGVjbGFyYXRpb24gYSwgRGVjbGFyYXRpb24gYiwKICAgICAgYm9vbCBpc1NldHRlciwgYm9vbCBjcmVhdGVGb3J3YXJkZXJzKSB7CiAgICBMaXN0PERlY2xhcmF0aW9uPiBkZWNsYXJhdGlvbnMgPSA8RGVjbGFyYXRpb24+W107CiAgICBpZiAoYSBpcyBEZWxheWVkTWVtYmVyKSB7CiAgICAgIGEuYWRkQWxsRGVjbGFyYXRpb25zVG8oZGVjbGFyYXRpb25zKTsKICAgIH0gZWxzZSB7CiAgICAgIGRlY2xhcmF0aW9ucy5hZGQoYSk7CiAgICB9CiAgICBpZiAoYiBpcyBEZWxheWVkTWVtYmVyKSB7CiAgICAgIGIuYWRkQWxsRGVjbGFyYXRpb25zVG8oZGVjbGFyYXRpb25zKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZERlY2xhcmF0aW9uSWZEaWZmZXJlbnQoYiwgZGVjbGFyYXRpb25zKTsKICAgIH0KICAgIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9ucy5zaW5nbGU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IEludGVyZmFjZUNvbmZsaWN0KAogICAgICAgICAgcGFyZW50LCBkZWNsYXJhdGlvbnMsIGlzU2V0dGVyLCBjcmVhdGVGb3J3YXJkZXJzKTsKICAgIH0KICB9Cn0KCmNsYXNzIEFic3RyYWN0TWVtYmVyT3ZlcnJpZGluZ0ltcGxlbWVudGF0aW9uIGV4dGVuZHMgRGVsYXllZE1lbWJlciB7CiAgQWJzdHJhY3RNZW1iZXJPdmVycmlkaW5nSW1wbGVtZW50YXRpb24oCiAgICAgIENsYXNzQnVpbGRlciBwYXJlbnQsCiAgICAgIERlY2xhcmF0aW9uIGFic3RyYWN0TWVtYmVyLAogICAgICBEZWNsYXJhdGlvbiBjb25jcmV0ZUltcGxlbWVudGF0aW9uLAogICAgICBib29sIGlzU2V0dGVyLAogICAgICBib29sIG1vZGlmeUtlcm5lbCkKICAgICAgOiBzdXBlcihwYXJlbnQsIDxEZWNsYXJhdGlvbj5bY29uY3JldGVJbXBsZW1lbnRhdGlvbiwgYWJzdHJhY3RNZW1iZXJdLAogICAgICAgICAgICBpc1NldHRlciwgbW9kaWZ5S2VybmVsKTsKCiAgRGVjbGFyYXRpb24gZ2V0IGNvbmNyZXRlSW1wbGVtZW50YXRpb24gPT4gZGVjbGFyYXRpb25zWzBdOwoKICBEZWNsYXJhdGlvbiBnZXQgYWJzdHJhY3RNZW1iZXIgPT4gZGVjbGFyYXRpb25zWzFdOwoKICBNZW1iZXIgY2hlY2soQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSkgewogICAgaWYgKCFwYXJlbnQuaXNBYnN0cmFjdCAmJiAhaGllcmFyY2h5Lm5vZGVzW3BhcmVudC5jbHNdLmhhc05vU3VjaE1ldGhvZCkgewogICAgICBuZXcgRGVsYXllZE92ZXJyaWRlQ2hlY2socGFyZW50LCBjb25jcmV0ZUltcGxlbWVudGF0aW9uLCBhYnN0cmFjdE1lbWJlcikKICAgICAgICAgIC5jaGVjayhoaWVyYXJjaHkpOwogICAgfQoKICAgIFByb2NlZHVyZUtpbmQga2luZCA9IFByb2NlZHVyZUtpbmQuTWV0aG9kOwogICAgaWYgKGFic3RyYWN0TWVtYmVyLmlzU2V0dGVyIHx8IGFic3RyYWN0TWVtYmVyLmlzR2V0dGVyKSB7CiAgICAgIGtpbmQgPSBpc1NldHRlciA/IFByb2NlZHVyZUtpbmQuU2V0dGVyIDogUHJvY2VkdXJlS2luZC5HZXR0ZXI7CiAgICB9CiAgICBpZiAobW9kaWZ5S2VybmVsKSB7CiAgICAgIC8vIFRoaXMgY2FsbCB3aWxsIGFkZCBhIGJvZHkgdG8gdGhlIGFic3RyYWN0IG1ldGhvZCBpZiBuZWVkZWQgZm9yCiAgICAgIC8vIGlzR2VuZXJpY0NvdmFyaWFudEltcGwgY2hlY2tzLgogICAgICBuZXcgRm9yd2FyZGluZ05vZGUoaGllcmFyY2h5LCBwYXJlbnQsIGFic3RyYWN0TWVtYmVyLCBkZWNsYXJhdGlvbnMsIGtpbmQpCiAgICAgICAgICAuZmluYWxpemUoKTsKICAgIH0KICAgIHJldHVybiBhYnN0cmFjdE1lbWJlci50YXJnZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBEZWxheWVkTWVtYmVyIHdpdGhQYXJlbnQoQ2xhc3NCdWlsZGVyIHBhcmVudCkgewogICAgcmV0dXJuIHBhcmVudCA9PSB0aGlzLnBhcmVudAogICAgICAgID8gdGhpcwogICAgICAgIDogbmV3IEFic3RyYWN0TWVtYmVyT3ZlcnJpZGluZ0ltcGxlbWVudGF0aW9uKHBhcmVudCwgYWJzdHJhY3RNZW1iZXIsCiAgICAgICAgICAgIGNvbmNyZXRlSW1wbGVtZW50YXRpb24sIGlzU2V0dGVyLCBtb2RpZnlLZXJuZWwpOwogIH0KCiAgc3RhdGljIERlY2xhcmF0aW9uIHNlbGVjdEFic3RyYWN0KERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgQWJzdHJhY3RNZW1iZXJPdmVycmlkaW5nSW1wbGVtZW50YXRpb24pIHsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uLmFic3RyYWN0TWVtYmVyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uOwogICAgfQogIH0KCiAgc3RhdGljIERlY2xhcmF0aW9uIHNlbGVjdENvbmNyZXRlKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgQWJzdHJhY3RNZW1iZXJPdmVycmlkaW5nSW1wbGVtZW50YXRpb24pIHsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uLmNvbmNyZXRlSW1wbGVtZW50YXRpb247CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZGVjbGFyYXRpb247CiAgICB9CiAgfQp9Cgp2b2lkIGFkZERlY2xhcmF0aW9uSWZEaWZmZXJlbnQoCiAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgTGlzdDxEZWNsYXJhdGlvbj4gZGVjbGFyYXRpb25zKSB7CiAgTWVtYmVyIHRhcmdldCA9IGRlY2xhcmF0aW9uLnRhcmdldDsKICBpZiAodGFyZ2V0IGlzIFByb2NlZHVyZSkgewogICAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uID0gdGFyZ2V0LmZ1bmN0aW9uOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNsYXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgTWVtYmVyIG90aGVyID0gZGVjbGFyYXRpb25zW2ldLnRhcmdldDsKICAgICAgaWYgKG90aGVyIGlzIFByb2NlZHVyZSkgewogICAgICAgIGlmIChoYXNTYW1lU2lnbmF0dXJlKGZ1bmN0aW9uLCBvdGhlci5mdW5jdGlvbikpIHJldHVybjsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlY2xhcmF0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoZGVjbGFyYXRpb24gPT0gZGVjbGFyYXRpb25zW2ldKSByZXR1cm47CiAgICB9CiAgfQogIGRlY2xhcmF0aW9ucy5hZGQoZGVjbGFyYXRpb24pOwp9CgpTdHJpbmcgZnVsbE5hbWUoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICBTdHJpbmcgc3VmZml4ID0gZGVjbGFyYXRpb24uaXNTZXR0ZXIgPyAiPSIgOiAiIjsKICBpZiAoZGVjbGFyYXRpb24gaXMgRGVsYXllZE1lbWJlcikgewogICAgcmV0dXJuICIke2RlY2xhcmF0aW9uLmZ1bGxOYW1lRm9yRXJyb3JzfSRzdWZmaXgiOwogIH0KICBEZWNsYXJhdGlvbiBwYXJlbnQgPSBkZWNsYXJhdGlvbi5wYXJlbnQ7CiAgcmV0dXJuIHBhcmVudCA9PSBudWxsCiAgICAgID8gIiR7ZGVjbGFyYXRpb24uZnVsbE5hbWVGb3JFcnJvcnN9JHN1ZmZpeCIKICAgICAgOiAiJHtwYXJlbnQuZnVsbE5hbWVGb3JFcnJvcnN9LiR7ZGVjbGFyYXRpb24uZnVsbE5hbWVGb3JFcnJvcnN9JHN1ZmZpeCI7Cn0KCmludCBjb21wYXJlTmFtZWRQYXJhbWV0ZXJzKFZhcmlhYmxlRGVjbGFyYXRpb24gYSwgVmFyaWFibGVEZWNsYXJhdGlvbiBiKSB7CiAgcmV0dXJuIGEubmFtZS5jb21wYXJlVG8oYi5uYW1lKTsKfQoKYm9vbCBpc0Fic3RyYWN0KERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgcmV0dXJuIGRlY2xhcmF0aW9uLnRhcmdldC5pc0Fic3RyYWN0IHx8IGRlY2xhcmF0aW9uIGlzIEludGVyZmFjZUNvbmZsaWN0Owp9Cgpib29sIGluZmVyUGFyYW1ldGVyVHlwZSgKICAgIENsYXNzQnVpbGRlciBjbHMsCiAgICBQcm9jZWR1cmVCdWlsZGVyIG1lbWJlciwKICAgIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgcGFyYW1ldGVyLAogICAgRGFydFR5cGUgdHlwZSwKICAgIGJvb2wgaGFkVHlwZXNJbmZlcnJlZCwKICAgIENsYXNzSGllcmFyY2h5QnVpbGRlciBoaWVyYXJjaHkpIHsKICBkZWJ1Zz8ubG9nKCJJbmZlcnJlZCB0eXBlICR7dHlwZX0gZm9yICR7cGFyYW1ldGVyfSIpOwogIGlmICh0eXBlID09IHBhcmFtZXRlci50YXJnZXQudHlwZSkgcmV0dXJuIHRydWU7CiAgYm9vbCByZXN1bHQgPSB0cnVlOwogIGlmIChoYWRUeXBlc0luZmVycmVkKSB7CiAgICByZXBvcnRDYW50SW5mZXJQYXJhbWV0ZXJUeXBlKGNscywgbWVtYmVyLCBwYXJhbWV0ZXIsIGhpZXJhcmNoeSk7CiAgICB0eXBlID0gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgIHJlc3VsdCA9IGZhbHNlOwogIH0KICBwYXJhbWV0ZXIudGFyZ2V0LnR5cGUgPSB0eXBlOwogIG1lbWJlci5oYWRUeXBlc0luZmVycmVkID0gdHJ1ZTsKICByZXR1cm4gcmVzdWx0Owp9Cgp2b2lkIHJlcG9ydENhbnRJbmZlclBhcmFtZXRlclR5cGUoQ2xhc3NCdWlsZGVyIGNscywgTWVtYmVyQnVpbGRlciBtZW1iZXIsCiAgICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIHBhcmFtZXRlciwgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSkgewogIFN0cmluZyBuYW1lID0gcGFyYW1ldGVyLm5hbWU7CiAgY2xzLmFkZFByb2JsZW0oCiAgICAgIHRlbXBsYXRlQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgIHBhcmFtZXRlci5jaGFyT2Zmc2V0LAogICAgICBuYW1lLmxlbmd0aCwKICAgICAgd2FzSGFuZGxlZDogdHJ1ZSk7Cn0KCmJvb2wgaW5mZXJSZXR1cm5UeXBlKENsYXNzQnVpbGRlciBjbHMsIFByb2NlZHVyZUJ1aWxkZXIgbWVtYmVyLCBEYXJ0VHlwZSB0eXBlLAogICAgYm9vbCBoYWRUeXBlc0luZmVycmVkLCBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgaGllcmFyY2h5KSB7CiAgaWYgKHR5cGUgPT0gbWVtYmVyLnRhcmdldC5mdW5jdGlvbi5yZXR1cm5UeXBlKSByZXR1cm4gdHJ1ZTsKICBib29sIHJlc3VsdCA9IHRydWU7CiAgaWYgKGhhZFR5cGVzSW5mZXJyZWQpIHsKICAgIHJlcG9ydENhbnRJbmZlclJldHVyblR5cGUoY2xzLCBtZW1iZXIsIGhpZXJhcmNoeSk7CiAgICB0eXBlID0gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgIHJlc3VsdCA9IGZhbHNlOwogIH0gZWxzZSB7CiAgICBtZW1iZXIuaGFkVHlwZXNJbmZlcnJlZCA9IHRydWU7CiAgfQogIG1lbWJlci50YXJnZXQuZnVuY3Rpb24ucmV0dXJuVHlwZSA9IHR5cGU7CiAgcmV0dXJuIHJlc3VsdDsKfQoKdm9pZCByZXBvcnRDYW50SW5mZXJSZXR1cm5UeXBlKAogICAgQ2xhc3NCdWlsZGVyIGNscywgTWVtYmVyQnVpbGRlciBtZW1iZXIsIENsYXNzSGllcmFyY2h5QnVpbGRlciBoaWVyYXJjaHkpIHsKICBTdHJpbmcgbmFtZSA9IG1lbWJlci5mdWxsTmFtZUZvckVycm9yczsKICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0OwogIC8vIC8vIFRPRE8oYWhlKTogVGhlIGZvbGxvd2luZyBpcyBmb3IgZGVidWdnaW5nLCBidXQgY291bGQgYmUgY2xlYW5lZCB1cCBhbmQKICAvLyAvLyB1c2VkIHRvIGltcHJvdmUgdGhpcyBlcnJvciBtZXNzYWdlIGluIGdlbmVyYWwuCiAgLy8KICAvLyBjb250ZXh0ID0gPExvY2F0ZWRNZXNzYWdlPltdOwogIC8vIENsYXNzSGllcmFyY2h5Tm9kZSBzdXBlcm5vZGUgPSBoaWVyYXJjaHkuZ2V0Tm9kZUZyb21UeXBlKGNscy5zdXBlcnR5cGUpOwogIC8vIC8vIFRPRE8oYWhlKTogV3JvbmcgdGVtcGxhdGUuCiAgLy8gVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcpPiB0ZW1wbGF0ZSA9CiAgLy8gICAgIHRlbXBsYXRlTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2U7CiAgLy8gaWYgKHN1cGVybm9kZSAhPSBudWxsKSB7CiAgLy8gICBEZWNsYXJhdGlvbiBzdXBlck1lbWJlciA9CiAgLy8gICAgICAgc3VwZXJub2RlLmdldEludGVyZmFjZU1lbWJlcihuZXcgTmFtZShuYW1lKSwgZmFsc2UpOwogIC8vICAgaWYgKHN1cGVyTWVtYmVyICE9IG51bGwpIHsKICAvLyAgICAgY29udGV4dC5hZGQodGVtcGxhdGUKICAvLyAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpCiAgLy8gICAgICAgICAud2l0aExvY2F0aW9uKAogIC8vICAgICAgICAgICAgIHN1cGVyTWVtYmVyLmZpbGVVcmksIHN1cGVyTWVtYmVyLmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoKSk7CiAgLy8gICB9CiAgLy8gICBzdXBlck1lbWJlciA9IHN1cGVybm9kZS5nZXRJbnRlcmZhY2VNZW1iZXIobmV3IE5hbWUobmFtZSksIHRydWUpOwogIC8vICAgaWYgKHN1cGVyTWVtYmVyICE9IG51bGwpIHsKICAvLyAgICAgY29udGV4dC5hZGQodGVtcGxhdGUKICAvLyAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpCiAgLy8gICAgICAgICAud2l0aExvY2F0aW9uKAogIC8vICAgICAgICAgICAgIHN1cGVyTWVtYmVyLmZpbGVVcmksIHN1cGVyTWVtYmVyLmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoKSk7CiAgLy8gICB9CiAgLy8gfQogIC8vIExpc3Q8VHlwZUJ1aWxkZXI+IGRpcmVjdEludGVyZmFjZXMgPSBjbHMuaW50ZXJmYWNlczsKICAvLyBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdEludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKICAvLyAgIENsYXNzSGllcmFyY2h5Tm9kZSBzdXBlcm5vZGUgPQogIC8vICAgICAgIGhpZXJhcmNoeS5nZXROb2RlRnJvbVR5cGUoZGlyZWN0SW50ZXJmYWNlc1tpXSk7CiAgLy8gICBpZiAoc3VwZXJub2RlICE9IG51bGwpIHsKICAvLyAgICAgRGVjbGFyYXRpb24gc3VwZXJNZW1iZXIgPQogIC8vICAgICAgICAgc3VwZXJub2RlLmdldEludGVyZmFjZU1lbWJlcihuZXcgTmFtZShuYW1lKSwgZmFsc2UpOwogIC8vICAgICBpZiAoc3VwZXJNZW1iZXIgIT0gbnVsbCkgewogIC8vICAgICAgIGNvbnRleHQuYWRkKHRlbXBsYXRlCiAgLy8gICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpCiAgLy8gICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgLy8gICAgICAgICAgICAgICBzdXBlck1lbWJlci5maWxlVXJpLCBzdXBlck1lbWJlci5jaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCkpOwogIC8vICAgICB9CiAgLy8gICAgIHN1cGVyTWVtYmVyID0gc3VwZXJub2RlLmdldEludGVyZmFjZU1lbWJlcihuZXcgTmFtZShuYW1lKSwgdHJ1ZSk7CiAgLy8gICAgIGlmIChzdXBlck1lbWJlciAhPSBudWxsKSB7CiAgLy8gICAgICAgY29udGV4dC5hZGQodGVtcGxhdGUKICAvLyAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAvLyAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAvLyAgICAgICAgICAgICAgIHN1cGVyTWVtYmVyLmZpbGVVcmksIHN1cGVyTWVtYmVyLmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoKSk7CiAgLy8gICAgIH0KICAvLyAgIH0KICAvLyB9CiAgY2xzLmFkZFByb2JsZW0oCiAgICAgIHRlbXBsYXRlQ2FudEluZmVyUmV0dXJuVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgIG1lbWJlci5jaGFyT2Zmc2V0LAogICAgICBuYW1lLmxlbmd0aCwKICAgICAgd2FzSGFuZGxlZDogdHJ1ZSwKICAgICAgY29udGV4dDogY29udGV4dCk7Cn0KCnZvaWQgcmVwb3J0Q2FudEluZmVyRmllbGRUeXBlKENsYXNzQnVpbGRlciBjbHMsIEtlcm5lbEZpZWxkQnVpbGRlciBtZW1iZXIpIHsKICBTdHJpbmcgbmFtZSA9IG1lbWJlci5mdWxsTmFtZUZvckVycm9yczsKICBjbHMuYWRkUHJvYmxlbSgKICAgICAgdGVtcGxhdGVDYW50SW5mZXJUeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXMud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgbWVtYmVyLmNoYXJPZmZzZXQsCiAgICAgIG5hbWUubGVuZ3RoLAogICAgICB3YXNIYW5kbGVkOiB0cnVlKTsKfQoKQ2xhc3NCdWlsZGVyIGdldENsYXNzKFR5cGVCdWlsZGVyIHR5cGUpIHsKICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IHR5cGUuZGVjbGFyYXRpb247CiAgcmV0dXJuIGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlciA/IGRlY2xhcmF0aW9uIDogbnVsbDsKfQoKYm9vbCBoYXNFeHBsaWNpdFJldHVyblR5cGUoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICBhc3NlcnQoZGVjbGFyYXRpb24gaXMgUHJvY2VkdXJlQnVpbGRlciB8fCBkZWNsYXJhdGlvbiBpcyBEaWxsTWVtYmVyQnVpbGRlciwKICAgICAgIiR7ZGVjbGFyYXRpb24ucnVudGltZVR5cGV9Iik7CiAgcmV0dXJuIGRlY2xhcmF0aW9uIGlzIFByb2NlZHVyZUJ1aWxkZXIKICAgICAgPyBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlICE9IG51bGwKICAgICAgOiB0cnVlOwp9Cgpib29sIGhhc0V4cGxpY2l0bHlUeXBlZEZvcm1hbFBhcmFtZXRlcihEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGluZGV4KSB7CiAgYXNzZXJ0KGRlY2xhcmF0aW9uIGlzIFByb2NlZHVyZUJ1aWxkZXIgfHwgZGVjbGFyYXRpb24gaXMgRGlsbE1lbWJlckJ1aWxkZXIsCiAgICAgICIke2RlY2xhcmF0aW9u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GBkCAU0qEksZExkCASouOwIBNk4lKScOAgFNTiUpMA4CAT9wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2NsYXNzX2hpZXJhcmNoeV9idWlsZGVyLmRhcnRIc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3N0YW5kYXJkX2JvdW5kcy5kYXJ0wABByC8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAnZGFydDptYXRoJyBhcyBtYXRoOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBCb3R0b21UeXBlLAogICAgICAgIENsYXNzLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIEludmFsaWRUeXBlLAogICAgICAgIE5hbWVkVHlwZSwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWb2lkVHlwZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIHNob3cgU3Vic3RpdHV0aW9uOwoKaW1wb3J0ICd0eXBlX3NjaGVtYS5kYXJ0JyBzaG93IFVua25vd25UeXBlOwoKYWJzdHJhY3QgY2xhc3MgU3RhbmRhcmRCb3VuZHMgewogIENsYXNzIGdldCBmdW5jdGlvbkNsYXNzOwogIEludGVyZmFjZVR5cGUgZ2V0IG51bGxUeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IG9iamVjdFR5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgcmF3RnVuY3Rpb25UeXBlOwoKICBib29sIGlzU3VidHlwZU9mKERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSk7CgogIEludGVyZmFjZVR5cGUgZ2V0TGVnYWN5TGVhc3RVcHBlckJvdW5kKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUxLCBJbnRlcmZhY2VUeXBlIHR5cGUyKTsKCiAgLy8vIENvbXB1dGVzIHRoZSBzdGFuZGFyZCBsb3dlciBib3VuZCBvZiBbdHlwZTFdIGFuZCBbdHlwZTJdLgogIC8vLwogIC8vLyBTdGFuZGFyZCBsb3dlciBib3VuZCBpcyBhIGxvd2VyIGJvdW5kIGZ1bmN0aW9uIHRoYXQgaW1wb3NlcyBhbgogIC8vLyBvcmRlcmluZyBvbiB0aGUgdG9wIHR5cGVzIGB2b2lkYCwgYGR5bmFtaWNgLCBhbmQgYG9iamVjdGAuICBUaGlzIGZ1bmN0aW9uCiAgLy8vIGFkZGl0aW9uYWxseSBoYW5kbGVzIHRoZSB1bmtub3duIHR5cGUgdGhhdCBhcHBlYXJzIGR1cmluZyB0eXBlIGluZmVyZW5jZS4KICBEYXJ0VHlwZSBnZXRTdGFuZGFyZExvd2VyQm91bmQoRGFydFR5cGUgdHlwZTEsIERhcnRUeXBlIHR5cGUyKSB7CiAgICAvLyBGb3IgYWxsIHR5cGVzIFQsIFNMQihULFQpID0gVC4gIE5vdGUgdGhhdCB3ZSBkb24ndCB0ZXN0IGZvciBlcXVhbGl0eQogICAgLy8gYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIG1ha2UgdGhlIGFsZ29yaXRobSBxdWFkcmF0aWMuICBUaGlzIGlzIG9rCiAgICAvLyBiZWNhdXNlIHRoZSBjaGVjayBpcyBub3QgbmVlZGVkIGZvciBjb3JyZWN0bmVzczsgaXQncyBqdXN0IGEgc3BlZWQKICAgIC8vIG9wdGltaXphdGlvbi4KICAgIGlmIChpZGVudGljYWwodHlwZTEsIHR5cGUyKSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CgogICAgLy8gRm9yIGFueSB0eXBlIFQsIFNMQig/LCBUKSA9IFNMQihULCA/KSA9IFQuCiAgICBpZiAodHlwZTEgaXMgVW5rbm93blR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUyOwogICAgfQogICAgaWYgKHR5cGUyIGlzIFVua25vd25UeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMTsKICAgIH0KCiAgICAvLyBTTEIodm9pZCwgVCkgPSBTTEIoVCwgdm9pZCkgPSBULgogICAgaWYgKHR5cGUxIGlzIFZvaWRUeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KICAgIGlmICh0eXBlMiBpcyBWb2lkVHlwZSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CgogICAgLy8gU0xCKGR5bmFtaWMsIFQpID0gU0xCKFQsIGR5bmFtaWMpID0gVCBpZiBUIGlzIG5vdCB2b2lkLgogICAgaWYgKHR5cGUxIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KICAgIGlmICh0eXBlMiBpcyBEeW5hbWljVHlwZSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CgogICAgLy8gU0xCKE9iamVjdCwgVCkgPSBTTEIoVCwgT2JqZWN0KSA9IFQgaWYgVCBpcyBub3Qgdm9pZCBvciBkeW5hbWljLgogICAgaWYgKHR5cGUxID09IG9iamVjdFR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUyOwogICAgfQogICAgaWYgKHR5cGUyID09IG9iamVjdFR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUxOwogICAgfQoKICAgIC8vIFNMQihib3R0b20sIFQpID0gU0xCKFQsIGJvdHRvbSkgPSBib3R0b20uCiAgICBpZiAodHlwZTEgaXMgQm90dG9tVHlwZSkgcmV0dXJuIHR5cGUxOwogICAgaWYgKHR5cGUyIGlzIEJvdHRvbVR5cGUpIHJldHVybiB0eXBlMjsKICAgIGlmICh0eXBlMSA9PSBudWxsVHlwZSkgcmV0dXJuIHR5cGUxOwogICAgaWYgKHR5cGUyID09IG51bGxUeXBlKSByZXR1cm4gdHlwZTI7CgogICAgLy8gRnVuY3Rpb24gdHlwZXMgaGF2ZSBzdHJ1Y3R1cmFsIGxvd2VyIGJvdW5kcy4KICAgIGlmICh0eXBlMSBpcyBGdW5jdGlvblR5cGUgJiYgdHlwZTIgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIHJldHVybiBfZnVuY3Rpb25TdGFuZGFyZExvd2VyQm91bmQodHlwZTEsIHR5cGUyKTsKICAgIH0KCiAgICAvLyBPdGhlcndpc2UsIHRoZSBsb3dlciBib3VuZHMgIG9mIHR3byB0eXBlcyBpcyBvbmUgb2YgdGhlbSBpdCBpZiBpdCBpcyBhCiAgICAvLyBzdWJ0eXBlIG9mIHRoZSBvdGhlci4KICAgIGlmIChpc1N1YnR5cGVPZih0eXBlMSwgdHlwZTIpKSB7CiAgICAgIHJldHVybiB0eXBlMTsKICAgIH0KCiAgICBpZiAoaXNTdWJ0eXBlT2YodHlwZTIsIHR5cGUxKSkgewogICAgICByZXR1cm4gdHlwZTI7CiAgICB9CgogICAgLy8gTm8gc3VidHlwZSByZWxhdGlvbiwgc28gdGhlIGxvd2VyIGJvdW5kIGlzIGJvdHRvbS4KICAgIHJldHVybiBjb25zdCBCb3R0b21UeXBlKCk7CiAgfQoKICAvLy8gQ29tcHV0ZXMgdGhlIHN0YW5kYXJkIHVwcGVyIGJvdW5kIG9mIHR3byB0eXBlcy4KICAvLy8KICAvLy8gU3RhbmRhcmQgdXBwZXIgYm91bmQgaXMgYW4gdXBwZXIgYm91bmQgZnVuY3Rpb24gdGhhdCBpbXBvc2VzIGFuIG9yZGVyaW5nCiAgLy8vIG9uIHRoZSB0b3AgdHlwZXMgJ3ZvaWQnLCAnZHluYW1pYycsIGFuZCBgb2JqZWN0YC4gIFRoaXMgZnVuY3Rpb24KICAvLy8gYWRkaXRpb25hbGx5IGhhbmRsZXMgdGhlIHVua25vd24gdHlwZSB0aGF0IGFwcGVhcnMgZHVyaW5nIHR5cGUgaW5mZXJlbmNlLgogIERhcnRUeXBlIGdldFN0YW5kYXJkVXBwZXJCb3VuZChEYXJ0VHlwZSB0eXBlMSwgRGFydFR5cGUgdHlwZTIpIHsKICAgIC8vIEZvciBhbGwgdHlwZXMgVCwgU1VCKFQsVCkgPSBULiAgTm90ZSB0aGF0IHdlIGRvbid0IHRlc3QgZm9yIGVxdWFsaXR5CiAgICAvLyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gbWFrZSB0aGUgYWxnb3JpdGhtIHF1YWRyYXRpYy4gIFRoaXMgaXMgb2sKICAgIC8vIGJlY2F1c2UgdGhlIGNoZWNrIGlzIG5vdCBuZWVkZWQgZm9yIGNvcnJlY3RuZXNzOyBpdCdzIGp1c3QgYSBzcGVlZAogICAgLy8gb3B0aW1pemF0aW9uLgogICAgaWYgKGlkZW50aWNhbCh0eXBlMSwgdHlwZTIpKSB7CiAgICAgIHJldHVybiB0eXBlMTsKICAgIH0KCiAgICAvLyBGb3IgYW55IHR5cGUgVCwgU1VCKD8sIFQpID0gU1VCKFQsID8pID0gVC4KICAgIGlmICh0eXBlMSBpcyBVbmtub3duVHlwZSkgewogICAgICByZXR1cm4gdHlwZTI7CiAgICB9CiAgICBpZiAodHlwZTIgaXMgVW5rbm93blR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUxOwogICAgfQoKICAgIC8vIFNVQih2b2lkLCBUKSA9IFNVQihULCB2b2lkKSA9IHZvaWQuCiAgICBpZiAodHlwZTEgaXMgVm9pZFR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUxOwogICAgfQogICAgaWYgKHR5cGUyIGlzIFZvaWRUeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KCiAgICAvLyBTVUIoZHluYW1pYywgVCkgPSBTVUIoVCwgZHluYW1pYykgPSBkeW5hbWljIGlmIFQgaXMgbm90IHZvaWQuCiAgICBpZiAodHlwZTEgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUxOwogICAgfQogICAgaWYgKHR5cGUyIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KCiAgICAvLyBTVUIoT2JlY3QsIFQpID0gU1VCKFQsIE9iamVjdCkgPSBPYmplY3QgaWYgVCBpcyBub3Qgdm9pZCBvciBkeW5hbWljLgogICAgaWYgKHR5cGUxID09IG9iamVjdFR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUxOwogICAgfQogICAgaWYgKHR5cGUyID09IG9iamVjdFR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUyOwogICAgfQoKICAgIC8vIFNVQihib3R0b20sIFQpID0gU1VCKFQsIGJvdHRvbSkgPSBULgogICAgaWYgKHR5cGUxIGlzIEJvdHRvbVR5cGUpIHJldHVybiB0eXBlMjsKICAgIGlmICh0eXBlMiBpcyBCb3R0b21UeXBlKSByZXR1cm4gdHlwZTE7CiAgICBpZiAodHlwZTEgPT0gbnVsbFR5cGUpIHJldHVybiB0eXBlMjsKICAgIGlmICh0eXBlMiA9PSBudWxsVHlwZSkgcmV0dXJuIHR5cGUxOwoKICAgIGlmICh0eXBlMSBpcyBUeXBlUGFyYW1ldGVyVHlwZSB8fCB0eXBlMiBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICByZXR1cm4gX3R5cGVQYXJhbWV0ZXJTdGFuZGFyZFVwcGVyQm91bmQodHlwZTEsIHR5cGUyKTsKICAgIH0KCiAgICAvLyBUaGUgc3RhbmRhcmQgdXBwZXIgYm91bmQgb2YgYSBmdW5jdGlvbiB0eXBlIGFuZCBhbiBpbnRlcmZhY2UgdHlwZSBUIGlzCiAgICAvLyB0aGUgc3RhbmRhcmQgdXBwZXIgYm91bmQgb2YgRnVuY3Rpb24gYW5kIFQuCiAgICBpZiAodHlwZTEgaXMgRnVuY3Rpb25UeXBlICYmIHR5cGUyIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgdHlwZTEgPSByYXdGdW5jdGlvblR5cGU7CiAgICB9CiAgICBpZiAodHlwZTIgaXMgRnVuY3Rpb25UeXBlICYmIHR5cGUxIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgdHlwZTIgPSByYXdGdW5jdGlvblR5cGU7CiAgICB9CgogICAgLy8gQXQgdGhpcyBwb2ludCB0eXBlMSBhbmQgdHlwZTIgc2hvdWxkIGJvdGggZWl0aGVyIGJlIGludGVyZmFjZSB0eXBlcyBvcgogICAgLy8gZnVuY3Rpb24gdHlwZXMuCiAgICBpZiAodHlwZTEgaXMgSW50ZXJmYWNlVHlwZSAmJiB0eXBlMiBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIHJldHVybiBfaW50ZXJmYWNlU3RhbmRhcmRVcHBlckJvdW5kKHR5cGUxLCB0eXBlMik7CiAgICB9CgogICAgaWYgKHR5cGUxIGlzIEZ1bmN0aW9uVHlwZSAmJiB0eXBlMiBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgcmV0dXJuIF9mdW5jdGlvblN0YW5kYXJkVXBwZXJCb3VuZCh0eXBlMSwgdHlwZTIpOwogICAgfQoKICAgIGlmICh0eXBlMSBpcyBJbnZhbGlkVHlwZSB8fCB0eXBlMiBpcyBJbnZhbGlkVHlwZSkgewogICAgICByZXR1cm4gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgIH0KCiAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLiBBcyBhIGRlZmVuc2l2ZSBtZWFzdXJlLCByZXR1cm4gdGhlIGR5bmFtaWMgdHlwZS4KICAgIGFzc2VydChmYWxzZSwgInR5cGUxID0gJHR5cGUxOyB0eXBlMiA9ICR0eXBlMiIpOwogICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgfQoKICAvLy8gQ29tcHV0ZSB0aGUgc3RhbmRhcmQgbG93ZXIgYm91bmQgb2YgZnVuY3Rpb24gdHlwZXMgW2ZdIGFuZCBbZ10uCiAgLy8vCiAgLy8vIFRoZSBzcGVjIHJ1bGVzIGZvciBTTEIgb24gZnVuY3Rpb24gdHlwZXMsIGluZm9ybWFsbHksIGFyZSBwcmV0dHkgc2ltcGxlOgogIC8vLwogIC8vLyAtIElmIGEgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGluIGJvdGgsIGl0IHN0YXlzIHJlcXVpcmVkLgogIC8vLwogIC8vLyAtIElmIGEgcG9zaXRpb25hbCBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwgb3IgbWlzc2luZyBpbiBvbmUsIGl0IGJlY29tZXMKICAvLy8gICBvcHRpb25hbC4gIChUaGlzIGlzIGJlY2F1c2Ugd2UncmUgdHJ5aW5nIHRvIGJ1aWxkIGEgZnVuY3Rpb24gdHlwZSB3aGljaAogIC8vLyAgIGlzIGEgc3VidHlwZSBvZiBib3RoIFtmXSBhbmQgW2ddLCBtZWFuaW5nIGl0IGFjY2VwdHMgYWxsIHBvc3NpYmxlIGlucHV0cwogIC8vLyAgIHRoYXQgW2ZdIGFuZCBbZ10gYWNjZXB0LikKICAvLy8KICAvLy8gLSBOYW1lZCBwYXJhbWV0ZXJzIGFyZSB1bmlvbmVkIHRvZ2V0aGVyLgogIC8vLwogIC8vLyAtIEZvciBhbnkgcGFyYW1ldGVyIHRoYXQgZXhpc3RzIGluIGJvdGggZnVuY3Rpb25zLCB1c2UgdGhlIFNVQiBvZiB0aGVtIGFzCiAgLy8vICAgdGhlIHJlc3VsdGluZyBwYXJhbWV0ZXIgdHlwZS4KICAvLy8KICAvLy8gLSBVc2UgdGhlIFNMQiBvZiB0aGVpciByZXR1cm4gdHlwZXMuCiAgRGFydFR5cGUgX2Z1bmN0aW9uU3RhbmRhcmRMb3dlckJvdW5kKEZ1bmN0aW9uVHlwZSBmLCBGdW5jdGlvblR5cGUgZykgewogICAgLy8gVE9ETyhybnlzdHJvbSxwYXVsYmVycnkpOiBSaWdodCBub3csIHRoaXMgYXNzdW1lcyBmIGFuZCBnIGRvIG5vdCBoYXZlIGFueQogICAgLy8gdHlwZSBwYXJhbWV0ZXJzLiBSZXZpc2l0IHRoYXQgaW4gdGhlIHByZXNlbmNlIG9mIGdlbmVyaWMgbWV0aG9kcy4KCiAgICAvLyBDYWxjdWxhdGUgdGhlIFNVQiBvZiBlYWNoIGNvcnJlc3BvbmRpbmcgcGFpciBvZiBwYXJhbWV0ZXJzLgogICAgaW50IHRvdGFsUG9zaXRpb25hbCA9CiAgICAgICAgbWF0aC5tYXgoZi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgsIGcucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIHZhciBwb3NpdGlvbmFsUGFyYW1ldGVycyA9IG5ldyBMaXN0PERhcnRUeXBlPih0b3RhbFBvc2l0aW9uYWwpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbFBvc2l0aW9uYWw7IGkrKykgewogICAgICBpZiAoaSA8IGYucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgdmFyIGZUeXBlID0gZi5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgICBpZiAoaSA8IGcucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgICB2YXIgZ1R5cGUgPSBnLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnNbaV0gPSBnZXRTdGFuZGFyZFVwcGVyQm91bmQoZlR5cGUsIGdUeXBlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnNbaV0gPSBmVHlwZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnNbaV0gPSBnLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICB9CiAgICB9CgogICAgLy8gUGFyYW1ldGVycyB0aGF0IGFyZSByZXF1aXJlZCBpbiBib3RoIGZ1bmN0aW9ucyBhcmUgcmVxdWlyZWQgaW4gdGhlCiAgICAvLyByZXN1bHQuICBQYXJhbWV0ZXJzIHRoYXQgYXJlIG9wdGlvbmFsIG9yIG1pc3NpbmcgaW4gZWl0aGVyIGVuZCB1cAogICAgLy8gb3B0aW9uYWwuCiAgICBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9CiAgICAgICAgbWF0aC5taW4oZi5yZXF1aXJlZFBhcmFtZXRlckNvdW50LCBnLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogICAgYm9vbCBoYXNQb3NpdGlvbmFsID0gcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA8IHRvdGFsUG9zaXRpb25hbDsKCiAgICAvLyBVbmlvbiB0aGUgbmFtZWQgcGFyYW1ldGVycyB0b2dldGhlci4KICAgIExpc3Q8TmFtZWRUeXBlPiBuYW1lZFBhcmFtZXRlcnMgPSBbXTsKICAgIHsKICAgICAgaW50IGkgPSAwOwogICAgICBpbnQgaiA9IDA7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKGkgPCBmLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICAgIGlmIChqIDwgZy5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciBmTmFtZSA9IGYubmFtZWRQYXJhbWV0ZXJzW2ldLm5hbWU7CiAgICAgICAgICAgIHZhciBnTmFtZSA9IGcubmFtZWRQYXJhbWV0ZXJzW2pdLm5hbWU7CiAgICAgICAgICAgIGludCBvcmRlciA9IGZOYW1lLmNvbXBhcmVUbyhnTmFtZSk7CiAgICAgICAgICAgIGlmIChvcmRlciA8IDApIHsKICAgICAgICAgICAgICBuYW1lZFBhcmFtZXRlcnMuYWRkKGYubmFtZWRQYXJhbWV0ZXJzW2krK10pOwogICAgICAgICAgICB9IGVsc2UgaWYgKG9yZGVyID4gMCkgewogICAgICAgICAgICAgIG5hbWVkUGFyYW1ldGVycy5hZGQoZy5uYW1lZFBhcmFtZXRlcnNbaisrXSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZChuZXcgTmFtZWRUeXBlKAogICAgICAgICAgICAgICAgICBmTmFtZSwKICAgICAgICAgICAgICAgICAgZ2V0U3RhbmRhcmRVcHBlckJvdW5kKGYubmFtZWRQYXJhbWV0ZXJzW2krK10udHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGcubmFtZWRQYXJhbWV0ZXJzW2orK10udHlwZSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZEFsbChmLm5hbWVkUGFyYW1ldGVycy5za2lwKGkpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5hbWVkUGFyYW1ldGVycy5hZGRBbGwoZy5uYW1lZFBhcmFtZXRlcnMuc2tpcChqKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGJvb2wgaGFzTmFtZWQgPSBuYW1lZFBhcmFtZXRlcnMuaXNOb3RFbXB0eTsKCiAgICAvLyBFZGdlIGNhc2UuIERhcnQgZG9lcyBub3Qgc3VwcG9ydCBmdW5jdGlvbnMgd2l0aCBib3RoIG9wdGlvbmFsIHBvc2l0aW9uYWwKICAgIC8vIGFuZCBuYW1lZCBwYXJhbWV0ZXJzLiBJZiB3ZSB3b3VsZCBzeW50aGVzaXplIHRoYXQsIGdpdmUgdXAuCiAgICBpZiAoaGFzUG9zaXRpb25hbCAmJiBoYXNOYW1lZCkgcmV0dXJuIGNvbnN0IEJvdHRvbVR5cGUoKTsKCiAgICAvLyBDYWxjdWxhdGUgdGhlIFNMQiBvZiB0aGUgcmV0dXJuIHR5cGUuCiAgICBEYXJ0VHlwZSByZXR1cm5UeXBlID0gZ2V0U3RhbmRhcmRMb3dlckJvdW5kKGYucmV0dXJuVHlwZSwgZy5yZXR1cm5UeXBlKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCByZXR1cm5UeXBlLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogIH0KCiAgLy8vIENvbXB1dGUgdGhlIHN0YW5kYXJkIHVwcGVyIGJvdW5kIG9mIGZ1bmN0aW9uIHR5cGVzIFtmXSBhbmQgW2ddLgogIC8vLwogIC8vLyBUaGUgcnVsZXMgZm9yIFNVQiBvbiBmdW5jdGlvbiB0eXBlcywgaW5mb3JtYWxseSwgYXJlIHByZXR0eSBzaW1wbGU6CiAgLy8vCiAgLy8vIC0gSWYgdGhlIGZ1bmN0aW9ucyBkb24ndCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByZXF1aXJlZCBwYXJhbWV0ZXJzLAogIC8vLyAgIGFsd2F5cyByZXR1cm4gYEZ1bmN0aW9uYC4KICAvLy8KICAvLy8gLSBEaXNjYXJkIGFueSBvcHRpb25hbCBuYW1lZCBvciBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgdGhlIHR3byB0eXBlcyBkbyBub3QKICAvLy8gICBoYXZlIGluIGNvbW1vbi4KICAvLy8KICAvLy8gLSBDb21wdXRlIHRoZSBTTEIgb2YgZWFjaCBjb3JyZXNwb25kaW5nIHBhaXIgb2YgcGFyYW1ldGVyIHR5cGVzLCBhbmQgdGhlCiAgLy8vICAgU1VCIG9mIHRoZSByZXR1cm4gdHlwZXMuICBSZXR1cm4gYSBmdW5jdGlvbiB0eXBlIHdpdGggdGhvc2UgdHlwZXMuCiAgRGFydFR5cGUgX2Z1bmN0aW9uU3RhbmRhcmRVcHBlckJvdW5kKEZ1bmN0aW9uVHlwZSBmLCBGdW5jdGlvblR5cGUgZykgewogICAgLy8gVE9ETyhybnlzdHJvbSk6IFJpZ2h0IG5vdywgdGhpcyBhc3N1bWVzIGYgYW5kIGcgZG8gbm90IGhhdmUgYW55IHR5cGUKICAgIC8vIHBhcmFtZXRlcnMuIFJldmlzaXQgdGhhdCBpbiB0aGUgcHJlc2VuY2Ugb2YgZ2VuZXJpYyBtZXRob2RzLgoKICAgIC8vIElmIEYgYW5kIEcgZGlmZmVyIGluIHRoZWlyIG51bWJlciBvZiByZXF1aXJlZCBwYXJhbWV0ZXJzLCB0aGVuIHRoZQogICAgLy8gc3RhbmRhcmQgdXBwZXIgYm91bmQgb2YgRiBhbmQgRyBpcyBGdW5jdGlvbi4KICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogV2UgY291bGQgZG8gYmV0dGVyIGhlcmUsIGUuZy46CiAgICAvLyAgIFNVQigoW2ludF0pIC0+IHZvaWQsIChpbnQpIC0+IHZvaWQpID0gKGludCkgLT4gdm9pZAogICAgaWYgKGYucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCAhPSBnLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uQ2xhc3MucmF3VHlwZTsKICAgIH0KICAgIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50ID0gZi5yZXF1aXJlZFBhcmFtZXRlckNvdW50OwoKICAgIC8vIENhbGN1bGF0ZSB0aGUgU0xCIG9mIGVhY2ggY29ycmVzcG9uZGluZyBwYWlyIG9mIHBhcmFtZXRlcnMuCiAgICAvLyBJZ25vcmUgYW55IGV4dHJhIG9wdGlvbmFsIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBpZiBvbmUgaGFzIG1vcmUgdGhhbiB0aGUKICAgIC8vIG90aGVyLgogICAgaW50IHRvdGFsUG9zaXRpb25hbCA9CiAgICAgICAgbWF0aC5taW4oZi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgsIGcucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIHZhciBwb3NpdGlvbmFsUGFyYW1ldGVycyA9IG5ldyBMaXN0PERhcnRUeXBlPih0b3RhbFBvc2l0aW9uYWwpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbFBvc2l0aW9uYWw7IGkrKykgewogICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSA9IGdldFN0YW5kYXJkTG93ZXJCb3VuZCgKICAgICAgICAgIGYucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0sIGcucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0pOwogICAgfQoKICAgIC8vIEludGVyc2VjdCB0aGUgbmFtZWQgcGFyYW1ldGVycy4KICAgIExpc3Q8TmFtZWRUeXBlPiBuYW1lZFBhcmFtZXRlcnMgPSBbXTsKICAgIHsKICAgICAgaW50IGkgPSAwOwogICAgICBpbnQgaiA9IDA7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKGkgPCBmLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICAgIGlmIChqIDwgZy5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciBmTmFtZSA9IGYubmFtZWRQYXJhbWV0ZXJzW2ldLm5hbWU7CiAgICAgICAgICAgIHZhciBnTmFtZSA9IGcubmFtZWRQYXJhbWV0ZXJzW2pdLm5hbWU7CiAgICAgICAgICAgIGludCBvcmRlciA9IGZOYW1lLmNvbXBhcmVUbyhnTmFtZSk7CiAgICAgICAgICAgIGlmIChvcmRlciA8IDApIHsKICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAob3JkZXIgPiAwKSB7CiAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG5hbWVkUGFyYW1ldGVycy5hZGQobmV3IE5hbWVkVHlwZSgKICAgICAgICAgICAgICAgICAgZk5hbWUsCiAgICAgICAgICAgICAgICAgIGdldFN0YW5kYXJkTG93ZXJCb3VuZChmLm5hbWVkUGFyYW1ldGVyc1tpKytdLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICBnLm5hbWVkUGFyYW1ldGVyc1tqKytdLnR5cGUpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBDYWxjdWxhdGUgdGhlIFNVQiBvZiB0aGUgcmV0dXJuIHR5cGUuCiAgICBEYXJ0VHlwZSByZXR1cm5UeXBlID0gZ2V0U3RhbmRhcmRVcHBlckJvdW5kKGYucmV0dXJuVHlwZSwgZy5yZXR1cm5UeXBlKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCByZXR1cm5UeXBlLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogIH0KCiAgRGFydFR5cGUgX2ludGVyZmFjZVN0YW5kYXJkVXBwZXJCb3VuZCgKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlMSwgSW50ZXJmYWNlVHlwZSB0eXBlMikgewogICAgLy8gVGhpcyBjdXJyZW50bHkgZG9lcyBub3QgaW1wbGVtZW50IGEgdmVyeSBjb21wbGV0ZSBzdGFuZGFyZCB1cHBlciBib3VuZAogICAgLy8gYWxnb3JpdGhtLCBidXQgaGFuZGxlcyBhIGNvdXBsZSBvZiB0aGUgdmVyeSBjb21tb24gY2FzZXMgdGhhdCBhcmUKICAgIC8vIGNhdXNpbmcgcGFpbiBpbiByZWFsIGNvZGUuICBUaGUgY3VycmVudCBhbGdvcml0aG0gaXM6CiAgICAvLyAxLiBJZiBlaXRoZXIgb2YgdGhlIHR5cGVzIGlzIGEgc3VwZXJ0eXBlIG9mIHRoZSBvdGhlciwgcmV0dXJuIGl0LgogICAgLy8gICAgVGhpcyBpcyBpbiBmYWN0IHRoZSBiZXN0IHJlc3VsdCBpbiB0aGlzIGNhc2UuCiAgICAvLyAyLiBJZiB0aGUgdHdvIHR5cGVzIGhhdmUgdGhlIHNhbWUgY2xhc3MgZWxlbWVudCwgdGhlbiB0YWtlIHRoZQogICAgLy8gICAgcG9pbnR3aXNlIHN0YW5kYXJkIHVwcGVyIGJvdW5kIG9mIHRoZSB0eXBlIGFyZ3VtZW50cy4gIFRoaXMgaXMgYWdhaW4KICAgIC8vICAgIHRoZSBiZXN0IHJlc3VsdCwgZXhjZXB0IHRoYXQgdGhlIHJlY3Vyc2l2ZSBjYWxscyBtYXkgbm90IHJldHVybgogICAgLy8gICAgdGhlIHRydWUgc3RhbmRhcmQgdXBwZXIgYm91bmRzLiAgVGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIGEKICAgIC8vICAgIHdlbGwtZm9ybWVkIHR5cGUgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgaW5wdXQgdHlwZXMgd2VyZQogICAgLy8gICAgd2VsbC1mb3JtZWQgKGFuZCBhc3N1bWluZyB0aGF0IHRoZSByZWN1cnNpdmUgY2FsbHMgcmV0dXJuCiAgICAvLyAgICB3ZWxsLWZvcm1lZCB0eXBlcykuCiAgICAvLyAzLiBPdGhlcndpc2UgcmV0dXJuIHRoZSBzcGVjLWRlZmluZWQgc3RhbmRhcmQgdXBwZXIgYm91bmQuICBUaGlzIHdpbGwKICAgIC8vICAgIGJlIGFuIHVwcGVyIGJvdW5kLCBtaWdodCAob3IgbWlnaHQgbm90KSBiZSBsZWFzdCwgYW5kIG1pZ2h0CiAgICAvLyAgICAob3IgbWlnaHQgbm90KSBiZSBhIHdlbGwtZm9ybWVkIHR5cGUuCiAgICBpZiAoaXNTdWJ0eXBlT2YodHlwZTEsIHR5cGUyKSkgewogICAgICByZXR1cm4gdHlwZTI7CiAgICB9CiAgICBpZiAoaXNTdWJ0eXBlT2YodHlwZTIsIHR5cGUxKSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CiAgICBpZiAodHlwZTEgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIHR5cGUyIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICBpZGVudGljYWwodHlwZTEuY2xhc3NOb2RlLCB0eXBlMi5jbGFzc05vZGUpKSB7CiAgICAgIExpc3Q8RGFydFR5cGU+IHRBcmdzMSA9IHR5cGUxLnR5cGVBcmd1bWVudHM7CiAgICAgIExpc3Q8RGFydFR5cGU+IHRBcmdzMiA9IHR5cGUyLnR5cGVBcmd1bWVudHM7CgogICAgICBhc3NlcnQodEFyZ3MxLmxlbmd0aCA9PSB0QXJnczIubGVuZ3RoKTsKICAgICAgTGlzdDxEYXJ0VHlwZT4gdEFyZ3MgPSBuZXcgTGlzdCh0QXJnczEubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0QXJnczEubGVuZ3RoOyBpKyspIHsKICAgICAgICB0QXJnc1tpXSA9IGdldFN0YW5kYXJkVXBwZXJCb3VuZCh0QXJnczFbaV0sIHRBcmdzMltpXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKHR5cGUxLmNsYXNzTm9kZSwgdEFyZ3MpOwogICAgfQogICAgcmV0dXJuIGdldExlZ2FjeUxlYXN0VXBwZXJCb3VuZCh0eXBlMSwgdHlwZTIpOwogIH0KCiAgRGFydFR5cGUgX3R5cGVQYXJhbWV0ZXJTdGFuZGFyZFVwcGVyQm91bmQoRGFydFR5cGUgdHlwZTEsIERhcnRUeXBlIHR5cGUyKSB7CiAgICAvLyBUaGlzIGN1cnJlbnRseSBqdXN0IGltcGxlbWVudHMgYSBzaW1wbGUgc3RhbmRhcmQgdXBwZXIgYm91bmQgdG8KICAgIC8vIGhhbmRsZSBzb21lIGNvbW1vbiBjYXNlcy4gIEl0IGFsc28gYXZvaWRzIHNvbWUgdGVybWluYXRpb24gaXNzdWVzCiAgICAvLyB3aXRoIHRoZSBuYWl2ZSBzcGVjIGFsZ29yaXRobS4gIFRoZSBzdGFuZGFyZCB1cHBlciBib3VuZCBvZiB0d28gdHlwZXMKICAgIC8vIChhdCBsZWFzdCBvbmUgb2Ygd2hpY2ggaXMgYSB0eXBlIHBhcmFtZXRlcikgaXMgY29tcHV0ZWQgaGVyZSBhczoKICAgIC8vIDEuIElmIGVpdGhlciB0eXBlIGlzIGEgc3VwZXJ0eXBlIG9mIHRoZSBvdGhlciwgcmV0dXJuIGl0LgogICAgLy8gMi4gSWYgdGhlIGZpcnN0IHR5cGUgaXMgYSB0eXBlIHBhcmFtZXRlciwgcmVwbGFjZSBpdCB3aXRoIGl0cyBib3VuZCwKICAgIC8vICAgIHdpdGggcmVjdXJzaXZlIG9jY3VycmVuY2VzIG9mIGl0c2VsZiByZXBsYWNlZCB3aXRoIE9iamVjdC4KICAgIC8vICAgIFRoZSBzZWNvbmQgcGFydCBvZiB0aGlzIHNob3VsZCBlbnN1cmUgdGVybWluYXRpb24uICBJbmZvcm1hbGx5LAogICAgLy8gICAgZWFjaCB0eXBlIHZhcmlhYmxlIGluc3RhbnRpYXRpb24gaW4gb25lIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlCiAgICAvLyAgICBzdGFuZGFyZCB1cHBlciBib3VuZCBhbGdvcml0aG0gbm93IHN0cmljdGx5IHJlZHVjZXMgdGhlIG51bWJlcgogICAgLy8gICAgb2YgYm91bmQgdmFyaWFibGVzIGluIHNjb3BlIGluIHRoYXQgYXJndW1lbnQgcG9zaXRpb24uCiAgICAvLyAzLiBJZiB0aGUgc2Vjb25kIHR5cGUgaXMgYSB0eXBlIHBhcmFtZXRlciwgZG8gdGhlIHN5bW1ldHJpYyBvcGVyYXRpb24KICAgIC8vICAgIHRvICMyLgogICAgLy8KICAgIC8vIEl0J3Mgbm90IGltbWVkaWF0ZWx5IG9idmlvdXMgd2h5IHRoaXMgaXMgc3ltbWV0cmljIGluIHRoZSBjYXNlIHRoYXQgYm90aAogICAgLy8gb2YgdGhlbSBhcmUgdHlwZSBwYXJhbWV0ZXJzLiAgRm9yICMxLCBzeW1tZXRyeSBob2xkcyBzaW5jZSBzdWJ0eXBlCiAgICAvLyBpcyBhbnRpc3ltbWV0cmljLiAgRm9yICMyLCBpdCdzIGNsZWFybHkgbm90IHN5bW1ldHJpYyBpZiB1cHBlciBib3VuZHMgb2YKICAgIC8vIGJvdHRvbSBhcmUgYWxsb3dlZC4gIElnbm9yaW5nIHRoaXMgKGZvciB2YXJpb3VzIHJlYXNvbnMsIG5vdCBsZWFzdAogICAgLy8gb2Ygd2hpY2ggdGhhdCB0aGVyZSdzIG5vIHdheSB0byB3cml0ZSBpdCksIHRoZXJlJ3MgYW4gaW5mb3JtYWwKICAgIC8vIGFyZ3VtZW50ICh0aGF0IG1pZ2h0IGV2ZW4gYmUgcmlnaHQpIHRoYXQgeW91IHdpbGwgYWx3YXlzIGVpdGhlcgogICAgLy8gZW5kIHVwIGV4cGFuZGluZyBib3RoIG9mIHRoZW0gb3IgZWxzZSByZXR1cm5pbmcgdGhlIHNhbWUgcmVzdWx0IG5vIG1hdHRlcgogICAgLy8gd2hpY2ggb3JkZXIgeW91IGV4cGFuZCB0aGVtIGluLiAgQSBrZXkgb2JzZXJ2YXRpb24gaXMgdGhhdAogICAgLy8gaWRlbnRpY2FsKGV4cGFuZCh0eXBlMSksIHR5cGUyKSA9PiBzdWJ0eXBlKHR5cGUxLCB0eXBlMikKICAgIC8vIGFuZCBoZW5jZSB0aGUgY29udHJhLXBvc2l0aXZlLgogICAgLy8KICAgIC8vIFRPRE8obGVhZnApOiBUaGluayB0aGlzIHRocm91Z2ggYW5kIGZpZ3VyZSBvdXQgd2hhdCdzIHRoZSByaWdodAogICAgLy8gZGVmaW5pdGlvbi4gIEJlIGNhcmVmdWwgYWJvdXQgdGVybWluYXRpb24uCiAgICAvLwogICAgLy8gSSBzdXNwZWN0IGluIGdlbmVyYWwgYSByZWFzb25hYmxlIGFsZ29yaXRobSBpcyB0byBleHBhbmQgdGhlIGlubmVybW9zdAogICAgLy8gdHlwZSB2YXJpYWJsZSBmaXJzdC4gIEFsdGVybmF0aXZlbHksIHlvdSBjb3VsZCBwcm9iYWJseSBjaG9vc2UgdG8gdHJlYXQKICAgIC8vIGl0IGFzIGp1c3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZSB0eXBlIHVwcGVyIGJvdW5kIHByb2JsZW0sIHdpdGgKICAgIC8vIHRoZSAiaW5oZXJpdGFuY2UiIGNoYWluIGV4dGVuZGVkIGJ5IHRoZSBib3VuZHMgcGxhY2VkIG9uIHRoZSB2YXJpYWJsZXMuCiAgICBpZiAoaXNTdWJ0eXBlT2YodHlwZTEsIHR5cGUyKSkgewogICAgICByZXR1cm4gdHlwZTI7CiAgICB9CiAgICBpZiAoaXNTdWJ0eXBlT2YodHlwZTIsIHR5cGUxKSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CiAgICBpZiAodHlwZTEgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiBBbmFseXplciBjb2xsYXBzZXMgc2ltcGxlIGJvdW5kcyBpbiBvbmUgc3RlcCwgaS5lLiBmb3IKICAgICAgLy8gQzxUIGV4dGVuZHMgVSwgVSBleHRlbmRzIExpc3Q+LCBUIGdldHMgcmVzb2x2ZWQgZGlyZWN0bHkgdG8gTGlzdC4gIERvCiAgICAgIC8vIHdlIG5lZWQgdG8gcmVwbGljYXRlIHRoYXQgYmVoYXZpb3I/CiAgICAgIHJldHVybiBnZXRTdGFuZGFyZFVwcGVyQm91bmQoCiAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbU1hcCh7dHlwZTEucGFyYW1ldGVyOiBvYmplY3RUeXBlfSkKICAgICAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUodHlwZTEucGFyYW1ldGVyLmJvdW5kKSwKICAgICAgICAgIHR5cGUyKTsKICAgIH0gZWxzZSBpZiAodHlwZTIgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgcmV0dXJuIGdldFN0YW5kYXJkVXBwZXJCb3VuZCgKICAgICAgICAgIHR5cGUxLAogICAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21NYXAoe3R5cGUyLnBhcmFtZXRlcjogb2JqZWN0VHlwZX0pCiAgICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHR5cGUyLnBhcmFtZXRlci5ib3VuZCkpOwogICAgfSBlbHNlIHsKICAgICAgLy8gV2Ugc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gYXQgbGVhc3Qgb25lIG9mIHRoZSB0eXBlcyBpcyBhCiAgICAgIC8vIFR5cGVQYXJhbWV0ZXJUeXBlCiAgICAgIGFzc2VydChmYWxzZSk7CiAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfQogIH0KfQqBxQBNTj8BHAEhCRQPEhUWFxUTGxIBPQEsASAbHiAlAToBKjEBQAZFUFBDTEpKFSMUBgEyIBQGIBQGASgdFAYdFAYBPyAUBiAUBgFIHxQGHxQGATErKykpATQ6OAYBTh0lFAYBJRQGATofBAE2Bk9HUENMSkoVIxQGATIgFAYgFAYBKx0UBh0UBgFFIBQGIBQGAUwfFAYfFAYBLCsrKSkBRD0GAU4zOx8GOx8GAU4XPDkGATo4BgE4IgYBTTUgBAFGBk8GPwZMUFEiBi8GUCYGK0lRSQFDGlBEMC8vMTFJESsKDz0IBgFKSREhRkMBLCoGEREVLC4zMzAdOyQ7FTEZRTYOEz8TDBE9EQoIBjABUEM+AS1NPio5BAFGBkoGTCIGURgGT0tJTEQBSjQ3PUAkBjsBQ1AOGlBEMDdBBgEnKgYRERUsLjMzMB0TJBMVMRlFNg4TEwwREQoIBgEtTT4qOQQBKTJOST1JOEZPSkxKRB5NRjAlFAYlFAYiIjczMwEuNjBACDgGMwQBTkdJTUhBTEVKSklBTREHUEpQSkZHUUJAJgdHMgdOT05PJRQGJRQGJlFPLSQ+NhItJBE+Nw1GGxUiBgQCAT9wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2Uvc3RhbmRhcmRfYm91bmRzLmRhcnREc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9pbXBsaWNpdF9maWVsZF90eXBlLmRhcnSESy8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmltcGxpY2l0X3R5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdyBEYXJ0VHlwZSwgRGFydFR5cGVWaXNpdG9yLCBEYXJ0VHlwZVZpc2l0b3IxLCBWaXNpdG9yOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnIHNob3cgTWVtYmVyQnVpbGRlcjsKCmNsYXNzIEltcGxpY2l0RmllbGRUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIGZpbmFsIE1lbWJlckJ1aWxkZXIgbWVtYmVyOwogIFRva2VuIGluaXRpYWxpemVyVG9rZW47CiAgYm9vbCBpc1N0YXJ0ZWQgPSBmYWxzZTsKCiAgZ2V0IG51bGxhYmlsaXR5ID0+CiAgICAgIHVuc3VwcG9ydGVkKCJudWxsYWJpbGl0eSIsIG1lbWJlci5jaGFyT2Zmc2V0LCBtZW1iZXIuZmlsZVVyaSk7CgogIEltcGxpY2l0RmllbGRUeXBlKHRoaXMubWVtYmVyLCB0aGlzLmluaXRpYWxpemVyVG9rZW4pOwoKICBhY2NlcHQoRGFydFR5cGVWaXNpdG9yPE9iamVjdD4gdikgewogICAgdW5zdXBwb3J0ZWQoImFjY2VwdCIsIG1lbWJlci5jaGFyT2Zmc2V0LCBtZW1iZXIuZmlsZVVyaSk7CiAgfQoKICBhY2NlcHQxKERhcnRUeXBlVmlzaXRvcjE8T2JqZWN0LCBPYmplY3Q+IHYsIGFyZykgewogICAgdW5zdXBwb3J0ZWQoImFjY2VwdDEiLCBtZW1iZXIuY2hhck9mZnNldCwgbWVtYmVyLmZpbGVVcmkpOwogIH0KCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yPE9iamVjdD4gdikgewogICAgdW5zdXBwb3J0ZWQoInZpc2l0Q2hpbGRyZW4iLCBtZW1iZXIuY2hhck9mZnNldCwgbWVtYmVyLmZpbGVVcmkpOwogIH0KfQonAE5OPAEdASE/AS4BLAExASseGhoBFUUBOQEmPgQBNT8EASVFBAIBO3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvaW1wbGljaXRfZmllbGRfdHlwZS5kYXJ0RXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2ZpZWxkX2J1aWxkZXIuZGFydJ4sLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEua2VybmVsX2ZpZWxkX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdyBDbGFzcywgRGFydFR5cGUsIEV4cHJlc3Npb24sIEZpZWxkLCBJbnZhbGlkVHlwZSwgTmFtZSwgTnVsbExpdGVyYWw7CgppbXBvcnQgJy4uL2NvbnN0YW50X2NvbnRleHQuZGFydCcgc2hvdyBDb25zdGFudENvbnRleHQ7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgbWVzc2FnZUludGVybmFsUHJvYmxlbUFscmVhZHlJbml0aWFsaXplZCwKICAgICAgICB0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5OwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IGludGVybmFsUHJvYmxlbTsKCmltcG9ydCAnLi4vc2Nhbm5lci5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JyBzaG93IFNjb3BlOwoKaW1wb3J0ICcuLi9zb3VyY2Uvc291cmNlX2xvYWRlci5kYXJ0JyBzaG93IFNvdXJjZUxvYWRlcjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcmVuY2VfZW5naW5lLmRhcnQnCiAgICBzaG93IEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNOb25Db3ZhcmlhbnRseSwgVmFyaWFuY2U7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJyZXIuZGFydCcgc2hvdyBUeXBlSW5mZXJyZXJJbXBsOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX3NjaGVtYS5kYXJ0JyBzaG93IFVua25vd25UeXBlOwoKaW1wb3J0ICdib2R5X2J1aWxkZXIuZGFydCcgc2hvdyBCb2R5QnVpbGRlcjsKCmltcG9ydCAna2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzc0J1aWxkZXIsCiAgICAgICAgRGVjbGFyYXRpb24sCiAgICAgICAgRmllbGRCdWlsZGVyLAogICAgICAgIEltcGxpY2l0RmllbGRUeXBlLAogICAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyLAogICAgICAgIEtlcm5lbE1ldGFkYXRhQnVpbGRlciwKICAgICAgICBUeXBlQnVpbGRlciwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBNZXRhZGF0YUJ1aWxkZXI7CgpjbGFzcyBLZXJuZWxGaWVsZEJ1aWxkZXIgZXh0ZW5kcyBGaWVsZEJ1aWxkZXIgewogIGZpbmFsIEZpZWxkIGZpZWxkOwogIGZpbmFsIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YTsKICBmaW5hbCBUeXBlQnVpbGRlciB0eXBlOwogIFRva2VuIGNvbnN0SW5pdGlhbGl6ZXJUb2tlbjsKCiAgYm9vbCBoYWRUeXBlc0luZmVycmVkID0gZmFsc2U7CgogIEtlcm5lbEZpZWxkQnVpbGRlcih0aGlzLm1ldGFkYXRhLCB0aGlzLnR5cGUsIFN0cmluZyBuYW1lLCBpbnQgbW9kaWZpZXJzLAogICAgICBEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQsIGludCBjaGFyT2Zmc2V0LCBpbnQgY2hhckVuZE9mZnNldCkKICAgICAgOiBmaWVsZCA9IG5ldyBGaWVsZChudWxsLCBmaWxlVXJpOiBjb21waWxhdGlvblVuaXQ/LmZpbGVVcmkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0CiAgICAgICAgICAuLmZpbGVFbmRPZmZzZXQgPSBjaGFyRW5kT2Zmc2V0LAogICAgICAgIHN1cGVyKG5hbWUsIG1vZGlmaWVycywgY29tcGlsYXRpb25Vbml0LCBjaGFyT2Zmc2V0KTsKCiAgdm9pZCBzZXQgaW5pdGlhbGl6ZXIoRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgaWYgKCFoYXNJbml0aWFsaXplciAmJiB2YWx1ZSBpcyEgTnVsbExpdGVyYWwgJiYgIWlzQ29uc3QgJiYgIWlzRmluYWwpIHsKICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgbWVzc2FnZUludGVybmFsUHJvYmxlbUFscmVhZHlJbml0aWFsaXplZCwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CiAgICBmaWVsZC5pbml0aWFsaXplciA9IHZhbHVlLi5wYXJlbnQgPSBmaWVsZDsKICB9CgogIGJvb2wgZ2V0IGlzRWxpZ2libGVGb3JJbmZlcmVuY2UgewogICAgcmV0dXJuICFsaWJyYXJ5LmxlZ2FjeU1vZGUgJiYKICAgICAgICB0eXBlID09IG51bGwgJiYKICAgICAgICAoaGFzSW5pdGlhbGl6ZXIgfHwgaXNJbnN0YW5jZU1lbWJlcik7CiAgfQoKICBGaWVsZCBidWlsZChLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICBmaWVsZC5uYW1lID8/PSBuZXcgTmFtZShuYW1lLCBsaWJyYXJ5LnRhcmdldCk7CiAgICBpZiAodHlwZSAhPSBudWxsKSB7CiAgICAgIGZpZWxkLnR5cGUgPSB0eXBlLmJ1aWxkKGxpYnJhcnkpOwoKICAgICAgaWYgKCFpc0ZpbmFsICYmICFpc0NvbnN0KSB7CiAgICAgICAgSW5jbHVkZXNUeXBlUGFyYW1ldGVyc05vbkNvdmFyaWFudGx5IG5lZWRzQ2hlY2tWaXNpdG9yOwogICAgICAgIGlmIChwYXJlbnQgaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgICAgICBDbGFzcyBlbmNsb3NpbmdDbGFzcyA9IHBhcmVudC50YXJnZXQ7CiAgICAgICAgICBpZiAoZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICAgICAgICBuZWVkc0NoZWNrVmlzaXRvciA9IG5ldyBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzTm9uQ292YXJpYW50bHkoCiAgICAgICAgICAgICAgICBlbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBjaGVja2luZyB0aGUgZmllbGQgdHlwZSBhcyBpZiBpdCBpcyB0aGUgdHlwZSBvZiB0aGUKICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciBvZiB0aGUgaW1wbGljaXQgc2V0dGVyIGFuZCB0aGlzIGlzIGEgY29udHJhdmFyaWFudAogICAgICAgICAgICAgICAgLy8gcG9zaXRpb24uCiAgICAgICAgICAgICAgICBpbml0aWFsVmFyaWFuY2U6IFZhcmlhbmNlLmNvbnRyYXZhcmlhbnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobmVlZHNDaGVja1Zpc2l0b3IgIT0gbnVsbCkgewogICAgICAgICAgaWYgKGZpZWxkLnR5cGUuYWNjZXB0KG5lZWRzQ2hlY2tWaXNpdG9yKSkgewogICAgICAgICAgICBmaWVsZC5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGJvb2wgaXNJbnN0YW5jZU1lbWJlciA9ICFpc1N0YXRpYyAmJiAhaXNUb3BMZXZlbDsKICAgIGZpZWxkCiAgICAgIC4uaXNDb3ZhcmlhbnQgPSBpc0NvdmFyaWFudAogICAgICAuLmlzRmluYWwgPSBpc0ZpbmFsCiAgICAgIC4uaXNDb25zdCA9IGlzQ29uc3QKICAgICAgLi5oYXNJbXBsaWNpdEdldHRlciA9IGlzSW5zdGFuY2VNZW1iZXIKICAgICAgLi5oYXNJbXBsaWNpdFNldHRlciA9IGlzSW5zdGFuY2VNZW1iZXIgJiYgIWlzQ29uc3QgJiYgIWlzRmluYWwKICAgICAgLi5pc1N0YXRpYyA9ICFpc0luc3RhbmNlTWVtYmVyOwogICAgcmV0dXJuIGZpZWxkOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBidWlsZE91dGxpbmVFeHByZXNzaW9ucyhMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICBDbGFzc0J1aWxkZXIgY2xhc3NCdWlsZGVyID0gaXNDbGFzc01lbWJlciA/IHBhcmVudCA6IG51bGw7CiAgICBLZXJuZWxNZXRhZGF0YUJ1aWxkZXIuYnVpbGRBbm5vdGF0aW9ucygKICAgICAgICBmaWVsZCwgbWV0YWRhdGEsIGxpYnJhcnksIGNsYXNzQnVpbGRlciwgdGhpcyk7CgogICAgLy8gRm9yIG1vZHVsYXIgY29tcGlsYXRpb24gd2UgbmVlZCB0byBpbmNsdWRlIGluaXRpYWxpemVycyBvZiBhbGwgY29uc3QKICAgIC8vIGZpZWxkcyBhbmQgYWxsIG5vbi1zdGF0aWMgZmluYWwgZmllbGRzIGluIGNsYXNzZXMgd2l0aCBjb25zdCBjb25zdHJ1Y3RvcnMKICAgIC8vIGludG8gdGhlIG91dGxpbmUuCiAgICBpZiAoKGlzQ29uc3QgfHwKICAgICAgICAgICAgKGlzRmluYWwgJiYKICAgICAgICAgICAgICAgICFpc1N0YXRpYyAmJgogICAgICAgICAgICAgICAgaXNDbGFzc01lbWJlciAmJgogICAgICAgICAgICAgICAgY2xhc3NCdWlsZGVyLmhhc0NvbnN0Q29uc3RydWN0b3IpKSAmJgogICAgICAgIGNvbnN0SW5pdGlhbGl6ZXJUb2tlbiAhPSBudWxsKSB7CiAgICAgIFNjb3BlIHNjb3BlID0gY2xhc3NCdWlsZGVyPy5zY29wZSA/PyBsaWJyYXJ5LnNjb3BlOwogICAgICBCb2R5QnVpbGRlciBib2R5QnVpbGRlciA9IG5ldyBCb2R5QnVpbGRlci5mb3JPdXRsaW5lRXhwcmVzc2lvbigKICAgICAgICAgIGxpYnJhcnksIGNsYXNzQnVpbGRlciwgdGhpcywgc2NvcGUsIGZpbGVVcmkpOwogICAgICBib2R5QnVpbGRlci5jb25zdGFudENvbnRleHQgPQogICAgICAgICAgaXNDb25zdCA/IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZCA6IENvbnN0YW50Q29udGV4dC5ub25lOwogICAgICBpbml0aWFsaXplciA9IGJvZHlCdWlsZGVyLnBhcnNlRmllbGRJbml0aWFsaXplcihjb25zdEluaXRpYWxpemVyVG9rZW4pCiAgICAgICAgLi5wYXJlbnQgPSBmaWVsZDsKICAgICAgYm9keUJ1aWxkZXIudHlwZUluZmVycmVyCiAgICAgICAgICA/LmluZmVyRmllbGRJbml0aWFsaXplcihib2R5QnVpbGRlciwgZmllbGQudHlwZSwgZmllbGQuaW5pdGlhbGl6ZXIpOwogICAgICBpZiAobGlicmFyeS5sb2FkZXIgaXMgU291cmNlTG9hZGVyKSB7CiAgICAgICAgU291cmNlTG9hZGVyIGxvYWRlciA9IGxpYnJhcnkubG9hZGVyOwogICAgICAgIGxvYWRlci50cmFuc2Zvcm1Qb3N0SW5mZXJlbmNlKGZpZWxkLCBib2R5QnVpbGRlci50cmFuc2Zvcm1TZXRMaXRlcmFscywKICAgICAgICAgICAgYm9keUJ1aWxkZXIudHJhbnNmb3JtQ29sbGVjdGlvbnMpOwogICAgICB9CiAgICAgIGJvZHlCdWlsZGVyLnJlc29sdmVSZWRpcmVjdGluZ0ZhY3RvcnlUYXJnZXRzKCk7CiAgICB9CiAgICBjb25zdEluaXRpYWxpemVyVG9rZW4gPSBudWxsOwogIH0KCiAgRmllbGQgZ2V0IHRhcmdldCA9PiBmaWVsZDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBpbmZlclR5cGUoKSB7CiAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gdGhpcy5saWJyYXJ5OwogICAgaWYgKGZpZWxkLnR5cGUgaXMhIEltcGxpY2l0RmllbGRUeXBlKSB7CiAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBpbmZlcnJlZCBhIHR5cGUuCiAgICAgIHJldHVybjsKICAgIH0KICAgIEltcGxpY2l0RmllbGRUeXBlIHR5cGUgPSBmaWVsZC50eXBlOwogICAgaWYgKHR5cGUubWVtYmVyICE9IHRoaXMpIHsKICAgICAgLy8gVGhlIGltcGxpY2l0IHR5cGUgd2FzIGluaGVyaXRlZC4KICAgICAgS2VybmVsRmllbGRCdWlsZGVyIG90aGVyID0gdHlwZS5tZW1iZXI7CiAgICAgIG90aGVyLmluZmVyQ29waWVkVHlwZShmaWVsZCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0eXBlLmlzU3RhcnRlZCkgewogICAgICBsaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5LndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgbmFtZS5sZW5ndGgsCiAgICAgICAgICBmaWxlVXJpKTsKICAgICAgZmllbGQudHlwZSA9IGNvbnN0IEludmFsaWRUeXBlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHR5cGUuaXNTdGFydGVkID0gdHJ1ZTsKICAgIFR5cGVJbmZlcnJlckltcGwgdHlwZUluZmVycmVyID0gbGlicmFyeS5sb2FkZXIudHlwZUluZmVyZW5jZUVuZ2luZQogICAgICAgIC5jcmVhdGVUb3BMZXZlbFR5cGVJbmZlcnJlcigKICAgICAgICAgICAgZmlsZVVyaSwgZmllbGQuZW5jbG9zaW5nQ2xhc3M/LnRoaXNUeXBlLCBudWxsKTsKICAgIEJvZHlCdWlsZGVyIGJvZHlCdWlsZGVyID0gbmV3IEJvZHlCdWlsZGVyLmZvckZpZWxkKHRoaXMsIHR5cGVJbmZlcnJlcik7CiAgICBib2R5QnVpbGRlci5jb25zdGFudENvbnRleHQgPQogICAgICAgIGlzQ29uc3QgPyBDb25zdGFudENvbnRleHQuaW5mZXJyZWQgOiBDb25zdGFudENvbnRleHQubm9uZTsKICAgIGluaXRpYWxpemVyID0gYm9keUJ1aWxkZXIucGFyc2VGaWVsZEluaXRpYWxpemVyKHR5cGUuaW5pdGlhbGl6ZXJUb2tlbik7CiAgICB0eXBlLmluaXRpYWxpemVyVG9rZW4gPSBudWxsOwoKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9IHR5cGVJbmZlcnJlci5pbmZlckRlY2xhcmF0aW9uVHlwZSh0eXBlSW5mZXJyZXIKICAgICAgICAuaW5mZXJFeHByZXNzaW9uKGZpZWxkLmluaXRpYWxpemVyLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlLAogICAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKSk7CgogICAgaWYgKGZpZWxkLnR5cGUgaXMgSW1wbGljaXRGaWVsZFR5cGUpIHsKICAgICAgLy8gYGZpZWxkLnR5cGVgIG1heSBoYXZlIGNoYW5nZWQgaWYgYSBjaXJjdWxhcml0eSB3YXMgZGV0ZWN0ZWQgd2hlbgogICAgICAvLyBbaW5mZXJyZWRUeXBlXSB3YXMgY29tcHV0ZWQuCiAgICAgIGZpZWxkLnR5cGUgPSBpbmZlcnJlZFR5cGU7CgogICAgICBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzTm9uQ292YXJpYW50bHkgbmVlZHNDaGVja1Zpc2l0b3I7CiAgICAgIGlmIChwYXJlbnQgaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgICAgQ2xhc3MgZW5jbG9zaW5nQ2xhc3MgPSBwYXJlbnQudGFyZ2V0OwogICAgICAgIGlmIChlbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgICBuZWVkc0NoZWNrVmlzaXRvciA9IG5ldyBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzTm9uQ292YXJpYW50bHkoCiAgICAgICAgICAgICAgZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgLy8gV2UgYXJlIGNoZWNraW5nIHRoZSBmaWVsZCB0eXBlIGFzIGlmIGl0IGlzIHRoZSB0eXBlIG9mIHRoZQogICAgICAgICAgICAgIC8vIHBhcmFtZXRlciBvZiB0aGUgaW1wbGljaXQgc2V0dGVyIGFuZCB0aGlzIGlzIGEgY29udHJhdmFyaWFudAogICAgICAgICAgICAgIC8vIHBvc2l0aW9uLgogICAgICAgICAgICAgIGluaXRpYWxWYXJpYW5jZTogVmFyaWFuY2UuY29udHJhdmFyaWFudCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChuZWVkc0NoZWNrVmlzaXRvciAhPSBudWxsKSB7CiAgICAgICAgaWYgKGZpZWxkLnR5cGUuYWNjZXB0KG5lZWRzQ2hlY2tWaXNpdG9yKSkgewogICAgICAgICAgZmllbGQuaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gVGhlIGZvbGxvd2luZyBpcyBhIGhhY2suIFRoZSBvdXRsaW5lIHNob3VsZCBjb250YWluIHRoZSBjb21waWxlZAogICAgLy8gaW5pdGlhbGl6ZXJzLCBob3dldmVyLCBhcyB0b3AtbGV2ZWwgaW5mZXJlbmNlIGlzIHN1YnRseSBkaWZmZXJlbnQgZnJvbQogICAgLy8gd2UgbmVlZCB0byBjb21waWxlIHRoZSBmaWVsZCBpbml0aWFsaXplciBhZ2FpbiB3aGVuIGV2ZXJ5dGhpbmcgZWxzZSBpcwogICAgLy8gY29tcGlsZWQuCiAgICBmaWVsZC5pbml0aWFsaXplciA9IG51bGw7CiAgfQoKICB2b2lkIGluZmVyQ29waWVkVHlwZShGaWVsZCBvdGhlcikgewogICAgaW5mZXJUeXBlKCk7CiAgICBvdGhlci50eXBlID0gZmllbGQudHlwZTsKICAgIG90aGVyLmluaXRpYWxpemVyID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldCBidWlsdFR5cGUgPT4gZmllbGQudHlwZTsKfQqA4QBOTjwBJAEhTQE4AR0JMi8BMAElASMBOQE2OQFFAT4BLQEdCRYVFhseHxUYGQEwFSgaHwEhAUtGQyQrPQErTBdKBi8EASQiGC4EAS4zGCgBIkAmMDpKL05QHToMCik2MQwKCAY2CiIaGi1FJhIEAQw5Pyw3AUxRGRQYHSE2KTpGOCRFTRofTywuTy8INgYiBAEdAQwVMSwqDgYpHyouJA4GGhpFFhcUKA4GG0clPEwiQ0wiAUtHIwErSiYhAT4kLjhILUxOGzgKCCc0LwoIBgFITk4RHgQBJhEdHgQBDCgCATxwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9maWVsZF9idWlsZGVyLmRhcnRIc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfbWV0YWRhdGFfYnVpbGRlci5kYXJ0hk4vLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5rZXJuZWxfbWV0YWRhdGFfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgQW5ub3RhdGFibGUsIENsYXNzLCBMaWJyYXJ5OwoKaW1wb3J0ICdib2R5X2J1aWxkZXIuZGFydCcgc2hvdyBCb2R5QnVpbGRlcjsKCmltcG9ydCAna2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cgQ2xhc3NCdWlsZGVyLCBLZXJuZWxMaWJyYXJ5QnVpbGRlciwgTWV0YWRhdGFCdWlsZGVyLCBNZW1iZXJCdWlsZGVyOwoKaW1wb3J0ICcuLi9zY2FubmVyLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnIHNob3cgU2NvcGU7CgpjbGFzcyBLZXJuZWxNZXRhZGF0YUJ1aWxkZXIgZXh0ZW5kcyBNZXRhZGF0YUJ1aWxkZXIgewogIGZpbmFsIFRva2VuIGJlZ2luVG9rZW47CgogIGludCBnZXQgY2hhck9mZnNldCA9PiBiZWdpblRva2VuLmNoYXJPZmZzZXQ7CgogIEtlcm5lbE1ldGFkYXRhQnVpbGRlcih0aGlzLmJlZ2luVG9rZW4pOwoKICBzdGF0aWMgdm9pZCBidWlsZEFubm90YXRpb25zKAogICAgICBBbm5vdGF0YWJsZSBwYXJlbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgQ2xhc3NCdWlsZGVyIGNsYXNzQnVpbGRlciwKICAgICAgTWVtYmVyQnVpbGRlciBtZW1iZXIpIHsKICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKSByZXR1cm47CiAgICBVcmkgZmlsZVVyaSA9IG1lbWJlcj8uZmlsZVVyaSA/PyBjbGFzc0J1aWxkZXI/LmZpbGVVcmkgPz8gbGlicmFyeS5maWxlVXJpOwogICAgU2NvcGUgc2NvcGUgPSBwYXJlbnQgaXMgTGlicmFyeSB8fCBwYXJlbnQgaXMgQ2xhc3MgfHwgY2xhc3NCdWlsZGVyID09IG51bGwKICAgICAgICA/IGxpYnJhcnkuc2NvcGUKICAgICAgICA6IGNsYXNzQnVpbGRlci5zY29wZTsKICAgIEJvZHlCdWlsZGVyIGJvZHlCdWlsZGVyID0gbmV3IEJvZHlCdWlsZGVyLmZvck91dGxpbmVFeHByZXNzaW9uKAogICAgICAgIGxpYnJhcnksIGNsYXNzQnVpbGRlciwgbWVtYmVyLCBzY29wZSwgZmlsZVVyaSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGFkYXRhLmxlbmd0aDsgKytpKSB7CiAgICAgIEtlcm5lbE1ldGFkYXRhQnVpbGRlciBhbm5vdGF0aW9uQnVpbGRlciA9IG1ldGFkYXRhW2ldOwogICAgICBwYXJlbnQuYWRkQW5ub3RhdGlvbigKICAgICAgICAgIGJvZHlCdWlsZGVyLnBhcnNlQW5ub3RhdGlvbihhbm5vdGF0aW9uQnVpbGRlci5iZWdpblRva2VuKSk7CiAgICB9CiAgICBib2R5QnVpbGRlci5pbmZlckFubm90YXRpb25zKHBhcmVudC5hbm5vdGF0aW9ucyk7CiAgICBib2R5QnVpbGRlci5yZXNvbHZlUmVkaXJlY3RpbmdGYWN0b3J5VGFyZ2V0cygpOwogIH0KfQowAE5OPAEnAUMBLQEdTQElASMBNhoBLwEqASAaJiQhHiJPTxgeRDgwPRxGBjY0BAIBP3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX21ldGFkYXRhX2J1aWxkZXIuZGFydEZzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9wcmVmaXhfYnVpbGRlci5kYXJ0g8UvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5rZXJuZWxfcHJlZml4X2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IExpYnJhcnlEZXBlbmRlbmN5OwoKaW1wb3J0ICcuLi9idWlsZGVyL2J1aWxkZXIuZGFydCcgc2hvdyBMaWJyYXJ5QnVpbGRlciwgUHJlZml4QnVpbGRlcjsKCmltcG9ydCAnbG9hZF9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBMb2FkTGlicmFyeUJ1aWxkZXI7CgpjbGFzcyBLZXJuZWxQcmVmaXhCdWlsZGVyIGV4dGVuZHMgUHJlZml4QnVpbGRlciB7CiAgZmluYWwgTGlicmFyeURlcGVuZGVuY3kgZGVwZW5kZW5jeTsKCiAgTG9hZExpYnJhcnlCdWlsZGVyIGxvYWRMaWJyYXJ5QnVpbGRlcjsKCiAgS2VybmVsUHJlZml4QnVpbGRlcihTdHJpbmcgbmFtZSwgYm9vbCBkZWZlcnJlZCwgTGlicmFyeUJ1aWxkZXIgcGFyZW50LAogICAgICB0aGlzLmRlcGVuZGVuY3ksIGludCBjaGFyT2Zmc2V0LCBpbnQgaW1wb3J0SW5kZXgpCiAgICAgIDogc3VwZXIobmFtZSwgZGVmZXJyZWQsIHBhcmVudCwgY2hhck9mZnNldCwgaW1wb3J0SW5kZXgpIHsKICAgIGlmIChkZWZlcnJlZCkgewogICAgICBsb2FkTGlicmFyeUJ1aWxkZXIgPQogICAgICAgICAgbmV3IExvYWRMaWJyYXJ5QnVpbGRlcihwYXJlbnQsIGRlcGVuZGVuY3ksIGNoYXJPZmZzZXQpOwogICAgICBhZGRUb0V4cG9ydFNjb3BlKCdsb2FkTGlicmFyeScsIGxvYWRMaWJyYXJ5QnVpbGRlciwgY2hhck9mZnNldCk7CiAgICB9CiAgfQp9Ch0ATk48ASUBOQFFATwBMiYBKQFJOEEUG0JHBgQCAT1wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9wcmVmaXhfYnVpbGRlci5kYXJ0SHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX3ZhcmlhYmxlX2J1aWxkZXIuZGFydIN7Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEua2VybmVsX3ZhcmlhYmxlX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IFZhcmlhYmxlRGVjbGFyYXRpb247CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnIHNob3cgRGVjbGFyYXRpb247CgpjbGFzcyBLZXJuZWxWYXJpYWJsZUJ1aWxkZXIgZXh0ZW5kcyBEZWNsYXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgRGVjbGFyYXRpb24gcGFyZW50OwoKICBAb3ZlcnJpZGUKICBmaW5hbCBVcmkgZmlsZVVyaTsKCiAgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKCiAgS2VybmVsVmFyaWFibGVCdWlsZGVyKHRoaXMudmFyaWFibGUsIHRoaXMucGFyZW50LCB0aGlzLmZpbGVVcmkpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGNoYXJPZmZzZXQgPT4gdmFyaWFibGUuZmlsZU9mZnNldDsKCiAgYm9vbCBnZXQgaXNMb2NhbCA9PiB0cnVlOwoKICBib29sIGdldCBpc0NvbnN0ID0+IHZhcmlhYmxlLmlzQ29uc3Q7CgogIGJvb2wgZ2V0IGlzRmluYWwgPT4gdmFyaWFibGUuaXNGaW5hbDsKCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBnZXQgdGFyZ2V0ID0+IHZhcmlhYmxlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzID0+IHZhcmlhYmxlLm5hbWUgPz8gIjx1bm5hbWVkPiI7Cn0KJQBOTjwBJwE7AS8BMgwcAQwVASYBQwEMLQEcASgBKAEuAQxAAgE/cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfdmFyaWFibGVfYnVpbGRlci5kYXJ0RXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvbG9hZF9saWJyYXJ5X2J1aWxkZXIuZGFydIgrLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIExpYnJhcnlEZXBlbmRlbmN5LAogICAgICAgIExvYWRMaWJyYXJ5LAogICAgICAgIE1lbWJlciwKICAgICAgICBOYW1lLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBQcm9jZWR1cmVLaW5kLAogICAgICAgIFJldHVyblN0YXRlbWVudDsKCmltcG9ydCAna2VybmVsX2J1aWxkZXIuZGFydCcgc2hvdyBEZWNsYXJhdGlvbiwgS2VybmVsTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJ2ZvcmVzdC5kYXJ0JyBzaG93IEZvcmVzdDsKCi8vLyBCdWlsZGVyIHRvIHJlcHJlc2VudCB0aGUgYGRlZmVyTGlicmFyeS5sb2FkTGlicmFyeWAgY2FsbHMgYW5kIHRlYXItb2Zmcy4KY2xhc3MgTG9hZExpYnJhcnlCdWlsZGVyIGV4dGVuZHMgRGVjbGFyYXRpb24gewogIGZpbmFsIEtlcm5lbExpYnJhcnlCdWlsZGVyIHBhcmVudDsKCiAgZmluYWwgTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0RGVwZW5kZW5jeTsKCiAgLy8vIE9mZnNldCBvZiB0aGUgaW1wb3J0IHByZWZpeC4KICBmaW5hbCBpbnQgY2hhck9mZnNldDsKCiAgLy8vIFN5bnRoZXRpYyBzdGF0aWMgbWV0aG9kIHRvIHJlcHJlc2VudCB0aGUgdGVhci1vZmYgb2YgJ2xvYWRMaWJyYXJ5Jy4gIElmCiAgLy8vIG51bGwsIG5vIHRlYXItb2ZmcyB3ZXJlIHNlZW4gaW4gdGhlIGNvZGUgYW5kIG5vIG1ldGhvZCBpcyBnZW5lcmF0ZWQuCiAgTWVtYmVyIHRlYXJvZmY7CgogIExvYWRMaWJyYXJ5QnVpbGRlcih0aGlzLnBhcmVudCwgdGhpcy5pbXBvcnREZXBlbmRlbmN5LCB0aGlzLmNoYXJPZmZzZXQpOwoKICBVcmkgZ2V0IGZpbGVVcmkgPT4gcGFyZW50LmZpbGVVcmk7CgogIExvYWRMaWJyYXJ5IGNyZWF0ZUxvYWRMaWJyYXJ5KAogICAgICBpbnQgY2hhck9mZnNldCwgRm9yZXN0IGZvcmVzdCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIGZvcmVzdC5sb2FkTGlicmFyeShpbXBvcnREZXBlbmRlbmN5LCBhcmd1bWVudHMpCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgfQoKICBQcm9jZWR1cmUgY3JlYXRlVGVhcm9mZk1ldGhvZChGb3Jlc3QgZm9yZXN0KSB7CiAgICBpZiAodGVhcm9mZiAhPSBudWxsKSByZXR1cm4gdGVhcm9mZjsKICAgIExvYWRMaWJyYXJ5IGV4cHJlc3Npb24gPSBjcmVhdGVMb2FkTGlicmFyeShjaGFyT2Zmc2V0LCBmb3Jlc3QsIG51bGwpOwogICAgU3RyaW5nIHByZWZpeCA9IGV4cHJlc3Npb24uaW1wb3J0Lm5hbWU7CiAgICB0ZWFyb2ZmID0gbmV3IFByb2NlZHVyZSgKICAgICAgICBuZXcgTmFtZSgnX19sb2FkTGlicmFyeV8kcHJlZml4JywgcGFyZW50LnRhcmdldCksCiAgICAgICAgUHJvY2VkdXJlS2luZC5NZXRob2QsCiAgICAgICAgbmV3IEZ1bmN0aW9uTm9kZShuZXcgUmV0dXJuU3RhdGVtZW50KGV4cHJlc3Npb24pLAogICAgICAgICAgICByZXR1cm5UeXBlOiBuZXcgSW50ZXJmYWNlVHlwZShwYXJlbnQubG9hZGVyLmNvcmVUeXBlcy5mdXR1cmVDbGFzcywKICAgICAgICAgICAgICAgIDxEYXJ0VHlwZT5bY29uc3QgRHluYW1pY1R5cGUoKV0pKSwKICAgICAgICBmaWxlVXJpOiBwYXJlbnQudGFyZ2V0LmZpbGVVcmksCiAgICAgICAgaXNTdGF0aWM6IHRydWUpCiAgICAgIC4uc3RhcnRGaWxlT2Zmc2V0ID0gY2hhck9mZnNldAogICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogICAgcmV0dXJuIHRlYXJvZmY7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzID0+ICdsb2FkTGlicmFyeSc7Cn0KRABOTjwBIQkTEhUWFxsVEA4TFxkBRQEiAU0vJQEsASMYAU5LEgFLASUBITw7IQQBMSlKLB06HjpPMygYJSEUBAEMMQIBPHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvbG9hZF9saWJyYXJ5X2J1aWxkZXIuZGFydD9zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL3VubGlua2VkX3Njb3BlLmRhcnSEbi8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnIHNob3cgRGVjbGFyYXRpb24sIFNjb3BlOwoKLy8vIFNjb3BlIHRoYXQgcmV0dXJucyBhbiBbVW5saW5rZWREZWNsYXJhdGlvbl0gaWYgYSBuYW1lIGNhbid0IGJlIHJlc29sdmVkLgovLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIHRoZSBgZW5jbG9zaW5nU2NvcGVgIGluIGBCb2R5QnVpbGRlcmAgdG8KLy8vIGNyZWF0ZSBBU1RzIHdpdGggYnVpbGRpbmcgb3V0bGluZXMuCmNsYXNzIFVubGlua2VkU2NvcGUgZXh0ZW5kcyBTY29wZSB7CiAgVW5saW5rZWRTY29wZSgpIDogc3VwZXIudG9wKGlzTW9kaWZpYWJsZTogZmFsc2UpOwoKICBEZWNsYXJhdGlvbiBsb29rdXBJbihTdHJpbmcgbmFtZSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpLAogICAgICBNYXA8U3RyaW5nLCBEZWNsYXJhdGlvbj4gbWFwLCBib29sIGlzSW5zdGFuY2VTY29wZSkgewogICAgcmV0dXJuIG5ldyBVbmxpbmtlZERlY2xhcmF0aW9uKG5hbWUsIGlzSW5zdGFuY2VTY29wZSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQp9CgpjbGFzcyBVbmxpbmtlZERlY2xhcmF0aW9uIGV4dGVuZHMgRGVjbGFyYXRpb24gewogIGZpbmFsIFN0cmluZyBuYW1lOwoKICBmaW5hbCBib29sIGlzSW5zdGFuY2VTY29wZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIEBvdmVycmlkZQogIGZpbmFsIFVyaSBmaWxlVXJpOwoKICBVbmxpbmtlZERlY2xhcmF0aW9uKAogICAgICB0aGlzLm5hbWUsIHRoaXMuaXNJbnN0YW5jZVNjb3BlLCB0aGlzLmNoYXJPZmZzZXQsIHRoaXMuZmlsZVVyaSk7CgogIEBvdmVycmlkZQogIERlY2xhcmF0aW9uIGdldCBwYXJlbnQgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBmdWxsTmFtZUZvckVycm9ycyA9PiBuYW1lOwp9CigATk48ATYBTUwoJDQBQTxQBAIBMBUBHgEMGAEMFQEXRwEMIgEMKAIBNnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdW5saW5rZWRfc2NvcGUuZGFydDpzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcmV3cml0ZV9zZXZlcml0eS5kYXJ0hR4vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdzZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKaW1wb3J0ICdtZXNzYWdlcy5kYXJ0JyBhcyBtc2c7CgpTZXZlcml0eSByZXdyaXRlU2V2ZXJpdHkoCiAgICBTZXZlcml0eSBzZXZlcml0eSwgbXNnLkNvZGU8T2JqZWN0PiBjb2RlLCBVcmkgZmlsZVVyaSkgewogIGlmIChzZXZlcml0eSAhPSBTZXZlcml0eS5pZ25vcmVkKSB7CiAgICByZXR1cm4gc2V2ZXJpdHk7CiAgfQoKICBTdHJpbmcgcGF0aCA9IGZpbGVVcmkucGF0aDsKICBTdHJpbmcgZmFzdGFQYXRoID0gIi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvIjsKICBpbnQgaW5kZXggPSBwYXRoLmluZGV4T2YoZmFzdGFQYXRoKTsKICBpZiAoaW5kZXggPT0gLTEpIHsKICAgIGZhc3RhUGF0aCA9ICIvcGtnL2Zyb250X2VuZC90b29sL19mYXN0YS8iOwogICAgaW5kZXggPSBwYXRoLmluZGV4T2YoZmFzdGFQYXRoKTsKICAgIGlmIChpbmRleCA9PSAtMSkgcmV0dXJuIHNldmVyaXR5OwogIH0KICBpZiAoY29kZSA9PSBtc2cuY29kZVVzZU9mRGVwcmVjYXRlZElkZW50aWZpZXIpIHsKICAgIC8vIFRPRE8oYWhlKTogUmVtb3ZlIHRoZSBleGNlcHRpb25zIGJlbG93LgogICAgLy8gV2UgcGxhbiB0byByZW1vdmUgYWxsIHVzZXMgb2YgZGVwcmVjYXRlZCBpZGVudGlmaWVycyBmcm9tIEZhc3RhLiBUaGUKICAgIC8vIHN0cmF0ZWd5IGlzIHRvIHJlbW92ZSBmaWxlcyBmcm9tIHRoZSBsaXN0IGJlbG93IG9uZSBieSBvbmUuIFRvIGdldAogICAgLy8gc3RhcnRlZCBvbiBjbGVhbmluZyB1cCBhIGdpdmVuIGZpbGUsIHNpbXBseSByZW1vdmUgaXQgZnJvbSB0aGUgbGlzdAogICAgLy8gYmVsb3cgYW5kIGNvbXBpbGUgRmFzdGEgd2l0aCBpdHNlbGYgdG8gZ2V0IGEgbGlzdCBvZiByZW1haW5pbmcgY2FsbAogICAgLy8gc2l0ZXMuCiAgICBzd2l0Y2ggKHBhdGguc3Vic3RyaW5nKGZhc3RhUGF0aC5sZW5ndGggKyBpbmRleCkpIHsKICAgICAgY2FzZSAiY29tbWFuZF9saW5lLmRhcnQiOgogICAgICBjYXNlICJrZXJuZWwvYm9keV9idWlsZGVyLmRhcnQiOgogICAgICAgIHJldHVybiBzZXZlcml0eTsKICAgIH0KICB9CiAgcmV0dXJuIFNldmVyaXR5LmVycm9yOwp9CicATk48ASYBHwEaPSYVBAEeNicVLyUmBDMvTEpLSw44ICcZBgQZAgExcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3Jld3JpdGVfc2V2ZXJpdHkuZGFydDBzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdGFyZ2V0LmRhcnSDLi8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnRhcmdldDsKCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IENvbXBvbmVudDsKCmltcG9ydCAndGlja2VyLmRhcnQnIHNob3cgVGlja2VyOwoKLy8vIEEgY29tcGlsYXRpb24gdGFyZ2V0LgovLy8KLy8vIEEgdGFyZ2V0IHJlYWRzIHNvdXJjZSBmaWxlcyB3aXRoIFtyZWFkXSwgYnVpbGRzIG91dGxpbmVzIHdoZW4KLy8vIFtidWlsZE91dGxpbmVzXSBpcyBjYWxsZWQgYW5kIGJ1aWxkcyB0aGUgZnVsbCBjb21wb25lbnQgd2hlbgovLy8gW2J1aWxkQ29tcG9uZW50XSBpcyBjYWxsZWQuCmFic3RyYWN0IGNsYXNzIFRhcmdldCB7CiAgZmluYWwgVGlja2VyIHRpY2tlcjsKCiAgVGFyZ2V0KHRoaXMudGlja2VyKTsKCiAgLy8vIEJ1aWxkIGFuZCByZXR1cm4gb3V0bGluZXMgZm9yIGFsbCBsaWJyYXJpZXMuCiAgRnV0dXJlPENvbXBvbmVudD4gYnVpbGRPdXRsaW5lcygpOwoKICAvLy8gQnVpbGQgYW5kIHJldHVybiB0aGUgZnVsbCBjb21wb25lbnQgZm9yIGFsbCBsaWJyYXJpZXMuCiAgRnV0dXJlPENvbXBvbmVudD4gYnVpbGRDb21wb25lbnQoKTsKfQoeAE5OPAEWASEBMQEiARoEQkEgGBcBFwEzJQE9JgIBJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90YXJnZXQuZGFydEFzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvZGlsbC9kaWxsX2NsYXNzX2J1aWxkZXIuZGFydJMPLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZGlsbF9jbGFzc19idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cgQ2xhc3MsIERhcnRUeXBlLCBNZW1iZXIsIFN1cGVydHlwZSwgVHlwZVBhcmFtZXRlcjsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmltcGxlbWVudGVkOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzc0J1aWxkZXIsCiAgICAgICAgVHlwZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTWVtYmVyQnVpbGRlciwKICAgICAgICBTY29wZSwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyOwoKaW1wb3J0ICcuLi9tb2RpZmllci5kYXJ0JyBzaG93IGFic3RyYWN0TWFzazsKCmltcG9ydCAnZGlsbF9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBEaWxsTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJ2RpbGxfbWVtYmVyX2J1aWxkZXIuZGFydCcgc2hvdyBEaWxsTWVtYmVyQnVpbGRlcjsKCmNsYXNzIERpbGxDbGFzc0J1aWxkZXIgZXh0ZW5kcyBDbGFzc0J1aWxkZXIgewogIGZpbmFsIENsYXNzIGNsczsKCiAgRGlsbENsYXNzQnVpbGRlcihDbGFzcyBjbHMsIERpbGxMaWJyYXJ5QnVpbGRlciBwYXJlbnQpCiAgICAgIDogY2xzID0gY2xzLAogICAgICAgIHN1cGVyKAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBjb21wdXRlTW9kaWZpZXJzKGNscyksCiAgICAgICAgICAgIGNscy5uYW1lLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBuZXcgU2NvcGUoPFN0cmluZywgTWVtYmVyQnVpbGRlcj57fSwgPFN0cmluZywgTWVtYmVyQnVpbGRlcj57fSwKICAgICAgICAgICAgICAgIHBhcmVudC5zY29wZSwgImNsYXNzICR7Y2xzLm5hbWV9IiwgaXNNb2RpZmlhYmxlOiBmYWxzZSksCiAgICAgICAgICAgIG5ldyBTY29wZSg8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPnt9LCBudWxsLCBudWxsLCBjbHMubmFtZSwKICAgICAgICAgICAgICAgIGlzTW9kaWZpYWJsZTogZmFsc2UpLAogICAgICAgICAgICBwYXJlbnQsCiAgICAgICAgICAgIGNscy5maWxlT2Zmc2V0KTsKCiAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiBnZXQgdHlwZVZhcmlhYmxlcyB7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBzdXBlci50eXBlVmFyaWFibGVzOwogICAgaWYgKHR5cGVWYXJpYWJsZXMgPT0gbnVsbCAmJiBjbHMudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICB0eXBlVmFyaWFibGVzID0gc3VwZXIudHlwZVZhcmlhYmxlcyA9CiAgICAgICAgICBjb21wdXRlVHlwZVZhcmlhYmxlQnVpbGRlcnMobGlicmFyeSwgY2xzLnR5cGVQYXJhbWV0ZXJzKTsKICAgIH0KICAgIHJldHVybiB0eXBlVmFyaWFibGVzOwogIH0KCiAgVXJpIGdldCBmaWxlVXJpID0+IGNscy5maWxlVXJpOwoKICBUeXBlQnVpbGRlciBnZXQgc3VwZXJ0eXBlIHsKICAgIFR5cGVCdWlsZGVyIHN1cGVydHlwZSA9IHN1cGVyLnN1cGVydHlwZTsKICAgIGlmIChzdXBlcnR5cGUgPT0gbnVsbCkgewogICAgICBTdXBlcnR5cGUgdGFyZ2V0U3VwZXJ0eXBlID0gY2xzLnN1cGVydHlwZTsKICAgICAgaWYgKHRhcmdldFN1cGVydHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgc3VwZXIuc3VwZXJ0eXBlID0KICAgICAgICAgIHN1cGVydHlwZSA9IGNvbXB1dGVUeXBlQnVpbGRlcihsaWJyYXJ5LCB0YXJnZXRTdXBlcnR5cGUpOwogICAgfQogICAgcmV0dXJuIHN1cGVydHlwZTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBhY3R1YWxDbHMgPT4gY2xzOwoKICB2b2lkIGFkZE1lbWJlcihNZW1iZXIgbWVtYmVyKSB7CiAgICBEaWxsTWVtYmVyQnVpbGRlciBidWlsZGVyID0gbmV3IERpbGxNZW1iZXJCdWlsZGVyKG1lbWJlciwgdGhpcyk7CiAgICBTdHJpbmcgbmFtZSA9IG1lbWJlci5uYW1lLm5hbWU7CiAgICBpZiAoYnVpbGRlci5pc0NvbnN0cnVjdG9yIHx8IGJ1aWxkZXIuaXNGYWN0b3J5KSB7CiAgICAgIGNvbnN0cnVjdG9yU2NvcGVCdWlsZGVyLmFkZE1lbWJlcihuYW1lLCBidWlsZGVyKTsKICAgIH0gZWxzZSBpZiAoYnVpbGRlci5pc1NldHRlcikgewogICAgICBzY29wZUJ1aWxkZXIuYWRkU2V0dGVyKG5hbWUsIGJ1aWxkZXIpOwogICAgfSBlbHNlIHsKICAgICAgc2NvcGVCdWlsZGVyLmFkZE1lbWJlcihuYW1lLCBidWlsZGVyKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgdHlwZVZhcmlhYmxlc0NvdW50ID0+IGNscy50eXBlUGFyYW1ldGVycy5sZW5ndGg7CgogIEBvdmVycmlkZQogIExpc3Q8RGFydFR5cGU+IGJ1aWxkVHlwZUFyZ3VtZW50cygKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICAvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgW3R5cGVWYXJpYWJsZXNdIGFyZW4ndCByZXN0b3JlZCBmcm9tIFt0YXJnZXRdLgogICAgLy8gU28sIGlmIFthcmd1bWVudHNdIGlzIG51bGwsIHRoZSBkZWZhdWx0IHR5cGVzIHNob3VsZCBiZSByZXRyaWV2ZWQgZnJvbQogICAgLy8gW2Nscy50eXBlUGFyYW1ldGVyc10uCiAgICBpZiAoYXJndW1lbnRzID09IG51bGwpIHsKICAgICAgTGlzdDxEYXJ0VHlwZT4gcmVzdWx0ID0gbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgIGNscy50eXBlUGFyYW1ldGVycy5sZW5ndGgsIG51bGwsCiAgICAgICAgICBncm93YWJsZTogdHJ1ZSk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcmVzdWx0W2ldID0gY2xzLnR5cGVQYXJhbWV0ZXJzW2ldLmRlZmF1bHRUeXBlOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLy8gW2FyZ3VtZW50c10gIT0gbnVsbAogICAgTGlzdDxEYXJ0VHlwZT4gcmVzdWx0ID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKGFyZ3VtZW50cy5sZW5ndGgsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IGFyZ3VtZW50c1tpXS5idWlsZChsaWJyYXJ5KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgY2xhc3MgaXMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBhIG1peGluIHRvIGl0cwogIC8vLyBzdXBlcmNsYXNzLgogIGJvb2wgZ2V0IGlzTWl4aW5BcHBsaWNhdGlvbiA9PiBjbHMuaXNNaXhpbkFwcGxpY2F0aW9uOwoKICBUeXBlQnVpbGRlciBnZXQgbWl4ZWRJblR5cGUgewogICAgcmV0dXJuIGNvbXB1dGVUeXBlQnVpbGRlcihsaWJyYXJ5LCBjbHMubWl4ZWRJblR5cGUpOwogIH0KCiAgTGlzdDxUeXBlQnVpbGRlcj4gZ2V0IGludGVyZmFjZXMgewogICAgaWYgKGNscy5pbXBsZW1lbnRlZFR5cGVzLmlzRW1wdHkpIHJldHVybiBudWxsOwogICAgaWYgKHN1cGVyLmludGVyZmFjZXMgPT0gbnVsbCkgewogICAgICBMaXN0PFR5cGVCdWlsZGVyPiByZXN1bHQgPQogICAgICAgICAgbmV3IExpc3Q8VHlwZUJ1aWxkZXI+KGNscy5pbXBsZW1lbnRlZFR5cGVzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcmVzdWx0W2ldID0gY29tcHV0ZVR5cGVCdWlsZGVyKGxpYnJhcnksIGNscy5pbXBsZW1lbnRlZFR5cGVzW2ldKTsKICAgICAgfQogICAgICBzdXBlci5pbnRlcmZhY2VzID0gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHN1cGVyLmludGVyZmFjZXM7CiAgfQoKICB2b2lkIHNldCBtaXhlZEluVHlwZShUeXBlQnVpbGRlciBtaXhpbikgewogICAgdW5pbXBsZW1lbnRlZCgibWl4ZWRJblR5cGU9IiwgLTEsIG51bGwpOwogIH0KfQoKaW50IGNvbXB1dGVNb2RpZmllcnMoQ2xhc3MgY2xzKSB7CiAgcmV0dXJuIGNscy5pc0Fic3RyYWN0ID8gYWJzdHJhY3RNYXNrIDogMDsKfQoKVHlwZUJ1aWxkZXIgY29tcHV0ZVR5cGVCdWlsZGVyKAogICAgRGlsbExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIFN1cGVydHlwZSBzdXBlcnR5cGUpIHsKICByZXR1cm4gc3VwZXJ0eXBlID09IG51bGwKICAgICAgPyBudWxsCiAgICAgIDogbGlicmFyeS5sb2FkZXIuY29tcHV0ZVR5cGVCdWlsZGVyKHN1cGVydHlwZS5hc0ludGVyZmFjZVR5cGUpOwp9CgpMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IGNvbXB1dGVUeXBlVmFyaWFibGVCdWlsZGVycygKICAgIERpbGxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CiAgaWYgKHR5cGVQYXJhbWV0ZXJzID09IG51bGwgfHwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoID09IDApIHJldHVybiBudWxsOwogIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gcmVzdWx0ID0KICAgICAgbmV3IExpc3QuZmlsbGVkKHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgbnVsbCk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKICAgIHJlc3VsdFtpXSA9IG5ldyBUeXBlVmFyaWFibGVCdWlsZGVyLmZyb21LZXJuZWwodHlwZVBhcmFtZXRlcnNbaV0sIGxpYnJhcnkpOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CoCgAE5OPAEiASE8AS4BJwkWFRgXDx0BLQE8AToBLhMBORMPEiMWEhISEkxJRyYUHQEwQ0IsRAYaBAEiAR4tHTEwGEQGFgQBDB4BIkUkNjgjLQ0tBgQBDDsBDCU9T04dHTkrGzA3CBUGARscSy4vBhMEAUoSOQEgOQQBJTMkIT4wSgghBh0EASwtBAIBIiwCASA3Gw1GAgE3RkklNCxQBBECAThwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZGlsbC9kaWxsX2NsYXNzX2J1aWxkZXIuZGFydEZzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvZGlsbC9kaWxsX3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0h+0vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5kaWxsX3R5cGVkZWZfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgRGFydFR5cGUsIFR5cGVkZWY7CgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIFR5cGVBbGlhc0J1aWxkZXIsCiAgICAgICAgRnVuY3Rpb25UeXBlQnVpbGRlciwKICAgICAgICBUeXBlQnVpbGRlciwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBNZXRhZGF0YUJ1aWxkZXI7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5pbXBsZW1lbnRlZDsKCmltcG9ydCAnZGlsbF9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBEaWxsTGlicmFyeUJ1aWxkZXI7CgpjbGFzcyBEaWxsVHlwZUFsaWFzQnVpbGRlciBleHRlbmRzIFR5cGVBbGlhc0J1aWxkZXIgewogIERpbGxUeXBlQWxpYXNCdWlsZGVyKFR5cGVkZWYgdHlwZWRlZiwgRGlsbExpYnJhcnlCdWlsZGVyIHBhcmVudCkKICAgICAgOiBzdXBlcihudWxsLCB0eXBlZGVmLm5hbWUsIG51bGwsIG51bGwsIHBhcmVudCwgdHlwZWRlZi5maWxlT2Zmc2V0LAogICAgICAgICAgICB0eXBlZGVmKTsKCiAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IGdldCBtZXRhZGF0YSB7CiAgICByZXR1cm4gdW5pbXBsZW1lbnRlZCgibWV0YWRhdGEiLCAtMSwgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IHR5cGVWYXJpYWJsZXNDb3VudCA9PiB0YXJnZXQudHlwZVBhcmFtZXRlcnMubGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvblR5cGVCdWlsZGVyIGdldCB0eXBlIHsKICAgIHJldHVybiB1bmltcGxlbWVudGVkKCJ0eXBlIiwgLTEsIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgYnVpbGRUaGlzVHlwZShMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICByZXR1cm4gdGhpc1R5cGUgPz89IHRhcmdldC50eXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxEYXJ0VHlwZT4gYnVpbGRUeXBlQXJndW1lbnRzKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBMaXN0PFR5cGVCdWlsZGVyPiBhcmd1bWVudHMpIHsKICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBbdHlwZVZhcmlhYmxlc10gYXJlbid0IHJlc3RvcmVkIGZyb20gW3RhcmdldF0uCiAgICAvLyBTbywgaWYgW2FyZ3VtZW50c10gaXMgbnVsbCwgdGhlIGRlZmF1bHQgdHlwZXMgc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tCiAgICAvLyBbY2xzLnR5cGVQYXJhbWV0ZXJzXS4KICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCkgewogICAgICBMaXN0PERhcnRUeXBlPiByZXN1bHQgPSBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgdGFyZ2V0LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgbnVsbCwKICAgICAgICAgIGdyb3dhYmxlOiB0cnVlKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyArK2kpIHsKICAgICAgICByZXN1bHRbaV0gPSB0YXJnZXQudHlwZVBhcmFtZXRlcnNbaV0uZGVmYXVsdFR5cGU7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvLyBbYXJndW1lbnRzXSAhPSBudWxsCiAgICBMaXN0PERhcnRUeXBlPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoYXJndW1lbnRzLmxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gYXJndW1lbnRzW2ldLmJ1aWxkKGxpYnJhcnkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KRQBOTjwBJAE5AScJGh0VGBkBLgE8ATZDShYBJzAEAQw+AQwhLAQBDDMlBAEMJT1PTh0dOS4bMDoIFQYBGxxLLi8GEwQCAT1wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZGlsbC9kaWxsX3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0RnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvdHlwZV9idWlsZGVyX2NvbXB1dGVyLmRhcnSQPS8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnR5cGVfYnVpbGRlcl9jb21wdXRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQm90dG9tVHlwZSwKICAgICAgICBDbGFzcywKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEYXJ0VHlwZVZpc2l0b3IsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRnVuY3Rpb25UeXBlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgSW52YWxpZFR5cGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBOYW1lZFR5cGUsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBUeXBlZGVmVHlwZSwKICAgICAgICBWb2lkVHlwZTsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgRHluYW1pY1R5cGVCdWlsZGVyLAogICAgICAgIEZ1bmN0aW9uVHlwZUJ1aWxkZXIsCiAgICAgICAgQ2xhc3NCdWlsZGVyLAogICAgICAgIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIsCiAgICAgICAgTmFtZWRUeXBlQnVpbGRlciwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyLAogICAgICAgIExpYnJhcnlCdWlsZGVyLAogICAgICAgIFR5cGVCdWlsZGVyLAogICAgICAgIFZvaWRUeXBlQnVpbGRlcjsKCmltcG9ydCAnLi4vbG9hZGVyLmRhcnQnIHNob3cgTG9hZGVyOwoKaW1wb3J0ICcuLi9wYXJzZXIuZGFydCcgc2hvdyBGb3JtYWxQYXJhbWV0ZXJLaW5kOwoKY2xhc3MgVHlwZUJ1aWxkZXJDb21wdXRlciBpbXBsZW1lbnRzIERhcnRUeXBlVmlzaXRvcjxUeXBlQnVpbGRlcj4gewogIGZpbmFsIExvYWRlciBsb2FkZXI7CgogIGNvbnN0IFR5cGVCdWlsZGVyQ29tcHV0ZXIodGhpcy5sb2FkZXIpOwoKICBUeXBlQnVpbGRlciBkZWZhdWx0RGFydFR5cGUoRGFydFR5cGUgbm9kZSkgewogICAgdGhyb3cgIlVuc3VwcG9ydGVkIjsKICB9CgogIFR5cGVCdWlsZGVyIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgewogICAgdGhyb3cgIk5vdCBpbXBsZW1lbnRlZCI7CiAgfQoKICBUeXBlQnVpbGRlciB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTmFtZWRUeXBlQnVpbGRlcigiZHluYW1pYyIsIG51bGwpCiAgICAgIC4uYmluZCgKICAgICAgICAgIG5ldyBEeW5hbWljVHlwZUJ1aWxkZXIoY29uc3QgRHluYW1pY1R5cGUoKSwgbG9hZGVyLmNvcmVMaWJyYXJ5LCAtMSkpOwogIH0KCiAgVHlwZUJ1aWxkZXIgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSB7CiAgICByZXR1cm4gbmV3IE5hbWVkVHlwZUJ1aWxkZXIoInZvaWQiLCBudWxsKQogICAgICAuLmJpbmQobmV3IFZvaWRUeXBlQnVpbGRlcihjb25zdCBWb2lkVHlwZSgpLCBsb2FkZXIuY29yZUxpYnJhcnksIC0xKSk7CiAgfQoKICBUeXBlQnVpbGRlciB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlKSB7CiAgICB0aHJvdyAiTm90IGltcGxlbWVudGVkIjsKICB9CgogIFR5cGVCdWlsZGVyIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIENsYXNzQnVpbGRlciBjbHMgPQogICAgICAgIGxvYWRlci5jb21wdXRlQ2xhc3NCdWlsZGVyRnJvbVRhcmdldENsYXNzKG5vZGUuY2xhc3NOb2RlKTsKICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50czsKICAgIExpc3Q8RGFydFR5cGU+IGtlcm5lbEFyZ3VtZW50cyA9IG5vZGUudHlwZUFyZ3VtZW50czsKICAgIGlmIChrZXJuZWxBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICBhcmd1bWVudHMgPSBuZXcgTGlzdDxUeXBlQnVpbGRlcj4oa2VybmVsQXJndW1lbnRzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2VybmVsQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgYXJndW1lbnRzW2ldID0ga2VybmVsQXJndW1lbnRzW2ldLmFjY2VwdCh0aGlzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBOYW1lZFR5cGVCdWlsZGVyKGNscy5uYW1lLCBhcmd1bWVudHMpLi5iaW5kKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlQnVpbGRlciB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSA9IG5vZGUucmV0dXJuVHlwZS5hY2NlcHQodGhpcyk7CiAgICAvLyBXZSBjb3VsZCBjb21wdXRlIHRoZSB0eXBlIHZhcmlhYmxlcyBoZXJlLiBIb3dldmVyLCB0aGUgY3VycmVudAogICAgLy8gaW1wbGVtZW50YXRpb24gb2YgW3Zpc2l0VHlwZVBhcmFtZXRlclR5cGVdIGlzIHN1ZmZpZW50LgogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gbnVsbDsKICAgIExpc3Q8RGFydFR5cGU+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVyczsKICAgIExpc3Q8TmFtZWRUeXBlPiBuYW1lZFBhcmFtZXRlcnMgPSBub2RlLm5hbWVkUGFyYW1ldGVyczsKICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9IG5ldyBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KAogICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCArIG5hbWVkUGFyYW1ldGVycy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICBUeXBlQnVpbGRlciB0eXBlID0gcG9zaXRpb25hbFBhcmFtZXRlcnNbaV0uYWNjZXB0KHRoaXMpOwogICAgICBGb3JtYWxQYXJhbWV0ZXJLaW5kIGtpbmQgPSBGb3JtYWxQYXJhbWV0ZXJLaW5kLm1hbmRhdG9yeTsKICAgICAgaWYgKGkgPj0gbm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgICAga2luZCA9IEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxQb3NpdGlvbmFsOwogICAgICB9CiAgICAgIGZvcm1hbHNbaV0gPSBuZXcgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcihudWxsLCAwLCB0eXBlLCBudWxsLCBudWxsLCAtMSkKICAgICAgICAuLmtpbmQgPSBraW5kOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lZFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgTmFtZWRUeXBlIHBhcmFtZXRlciA9IG5hbWVkUGFyYW1ldGVyc1tpXTsKICAgICAgVHlwZUJ1aWxkZXIgdHlwZSA9IHBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldLmFjY2VwdCh0aGlzKTsKICAgICAgZm9ybWFsc1tpICsgcG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoXSA9CiAgICAgICAgICBuZXcgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcihudWxsLCAwLCB0eXBlLCBwYXJhbWV0ZXIubmFtZSwgbnVsbCwgLTEpCiAgICAgICAgICAgIC4ua2luZCA9IEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxOYW1lZDsKICAgIH0KCiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZUJ1aWxkZXIocmV0dXJuVHlwZSwgdHlwZVZhcmlhYmxlcywgZm9ybWFscyk7CiAgfQoKICBUeXBlQnVpbGRlciB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbm9kZS5wYXJhbWV0ZXI7CiAgICBDbGFzcyBrZXJuZWxDbGFzcyA9IHBhcmFtZXRlci5wYXJlbnQ7CiAgICBMaWJyYXJ5IGtlcm5lbExpYnJhcnkgPSBrZXJuZWxDbGFzcy5lbmNsb3NpbmdMaWJyYXJ5OwogICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGxvYWRlci5idWlsZGVyc1trZXJuZWxMaWJyYXJ5LmltcG9ydFVyaV07CiAgICByZXR1cm4gbmV3IE5hbWVkVHlwZUJ1aWxkZXIocGFyYW1ldGVyLm5hbWUsIG51bGwpCiAgICAgIC4uYmluZChuZXcgVHlwZVZhcmlhYmxlQnVpbGRlci5mcm9tS2VybmVsKHBhcmFtZXRlciwgbGlicmFyeSkpOwogIH0KCiAgVHlwZUJ1aWxkZXIgdmlzaXRUeXBlZGVmVHlwZShUeXBlZGVmVHlwZSBub2RlKSB7CiAgICB0aHJvdyAiTm90IGltcGxlbWVudGVkIjsKICB9Cn0KfgBOTjwBJQEhCRQPEhkVFhcVERMXGxUSAScJHB0WIBodGBUZASUBMgFEFwEqAS8ZBAEzHQQBMzEOUAQBLS5NBAExHQQBNxdDITkmQTk4CAZBBAEMNTtGPzRFPE0/PD9ALjcITRcGNzA/MU44BgFIBAE/Lio6RzZGBAEzHQQCAT1wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3R5cGVfYnVpbGRlcl9jb21wdXRlci5kYXJ0OHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9iYXNlL2luc3RydW1lbnRhdGlvbi5kYXJ0isYvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBEYXJ0VHlwZSwgTWVtYmVyOwoKLy8vIENvbnZlcnQgJ+KGkicgdG8gJy0+JyBiZWNhdXNlICfihpInIGRvZXNuJ3Qgc2hvdyB1cCBpbiBzb21lIHRlcm1pbmFscy4KLy8vIFJlbW92ZSBwcmVmaXhlcyB0aGF0IGFyZSB1c2VkIHZlcnkgb2Z0ZW4gaW4gdGVzdHMuClN0cmluZyBfc2hvcnRlbkluc3RydW1lbnRhdGlvblN0cmluZyhTdHJpbmcgcykgPT4gcwogICAgLnJlcGxhY2VBbGwoJ+KGkicsICctPicpCiAgICAucmVwbGFjZUFsbCgnZGFydC5jb3JlOjonLCAnJykKICAgIC5yZXBsYWNlQWxsKCdkYXJ0LmFzeW5jOjonLCAnJykKICAgIC5yZXBsYWNlQWxsKCd0ZXN0OjonLCAnJyk7CgovLy8gSW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgYWJpbGl0eSB0byByZWNvcmQgcHJvcGVydHkvdmFsdWUgcGFpcnMgYXNzb2NpYXRlZAovLy8gd2l0aCBzb3VyY2UgZmlsZSBsb2NhdGlvbnMuICBJbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRlc3RpbmcuCmFic3RyYWN0IGNsYXNzIEluc3RydW1lbnRhdGlvbiB7CiAgLy8vIFJlY29yZHMgYSBwcm9wZXJ0eS92YWx1ZSBwYWlyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gVVJJIGFuZCBvZmZzZXQuCiAgdm9pZCByZWNvcmQoVXJpIHVyaSwgaW50IG9mZnNldCwgU3RyaW5nIHByb3BlcnR5LCBJbnN0cnVtZW50YXRpb25WYWx1ZSB2YWx1ZSk7Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIHZhbHVlcyByZWNvcmRlZCBieSBbSW5zdHJ1bWVudGF0aW9uXS4KYWJzdHJhY3QgY2xhc3MgSW5zdHJ1bWVudGF0aW9uVmFsdWUgewogIGNvbnN0IEluc3RydW1lbnRhdGlvblZhbHVlKCk7CgogIC8vLyBDaGVja3MgaWYgdGhlIGdpdmVuIFN0cmluZyBpcyBhbiBhY2N1cmF0ZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHZhbHVlLgogIC8vLwogIC8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IGNoZWNrcyBmb3IgZXF1YWxpdHkgd2l0aCB0aGUgcmV0dXJuIHZhbHVlCiAgLy8vIG9mIFt0b1N0cmluZ10sIGhvd2V2ZXIgZGVyaXZlZCBjbGFzc2VzIG1heSB3YW50IGEgbW9yZSBzb3BoaXN0aWNhdGVkCiAgLy8vIGltcGxlbWVudGF0aW9uIChlLmcuIHRvIGFsbG93IGFiYnJldmlhdGlvbnMgaW4gdGhlIGRlc2NyaXB0aW9uKS4KICAvLy8KICAvLy8gRGVyaXZlZCBjbGFzc2VzIHNob3VsZCBlbnN1cmUgdGhhdCB0aGUgaW52YXJpYW50IGhvbGRzOgogIC8vLyBgdGhpcy5tYXRjaGVzKHRoaXMudG9TdHJpbmcoKSlgIHNob3VsZCBhbHdheXMgcmV0dXJuIGB0cnVlYC4KICBib29sIG1hdGNoZXMoU3RyaW5nIGRlc2NyaXB0aW9uKSA9PiBkZXNjcmlwdGlvbiA9PSB0b1N0cmluZygpOwp9CgovLy8gSW5zdGFuY2Ugb2YgW0luc3RydW1lbnRhdGlvblZhbHVlXSBkZXNjcmliaW5nIGEgW01lbWJlcl0uCmNsYXNzIEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVmFsdWUgewogIGZpbmFsIE1lbWJlciBtZW1iZXI7CgogIEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyKHRoaXMubWVtYmVyKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX3Nob3J0ZW5JbnN0cnVtZW50YXRpb25TdHJpbmcobWVtYmVyLnRvU3RyaW5nKCkpOwp9CgovLy8gSW5zdGFuY2Ugb2YgW0luc3RydW1lbnRhdGlvblZhbHVlXSBkZXNjcmliaW5nIGEgW0RhcnRUeXBlXS4KY2xhc3MgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVmFsdWUgewogIGZpbmFsIERhcnRUeXBlIHR5cGU7CgogIEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZSh0aGlzLnR5cGUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfc2hvcnRlbkluc3RydW1lbnRhdGlvblN0cmluZyh0eXBlLnRvU3RyaW5nKCkpOwp9CgovLy8gSW5zdGFuY2Ugb2YgW0luc3RydW1lbnRhdGlvblZhbHVlXSBkZXNjcmliaW5nIGEgbGlzdCBvZiBbRGFydFR5cGVdcy4KY2xhc3MgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlQXJncyBleHRlbmRzIEluc3RydW1lbnRhdGlvblZhbHVlIHsKICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlczsKCiAgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlQXJncyh0aGlzLnR5cGVzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gdHlwZXMKICAgICAgLm1hcCgodHlwZSkgPT4gbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZSh0eXBlKS50b1N0cmluZygpKQogICAgICAuam9pbignLCAnKTsKfQoKLy8vIEluc3RhbmNlIG9mIFtJbnN0cnVtZW50YXRpb25WYWx1ZV0gd2hpY2ggb25seSBtYXRjaGVzIHRoZSBnaXZlbiBsaXRlcmFsCi8vLyBzdHJpbmcuCmNsYXNzIEluc3RydW1lbnRhdGlvblZhbHVlTGl0ZXJhbCBleHRlbmRzIEluc3RydW1lbnRhdGlvblZhbHVlIHsKICBmaW5hbCBTdHJpbmcgdmFsdWU7CgogIGNvbnN0IEluc3RydW1lbnRhdGlvblZhbHVlTGl0ZXJhbCh0aGlzLnZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gdmFsdWU7Cn0KUABOTjwBOAFHNzQbIyQfAU5BIU5RAgE4JiABSwZQS0cGPkNBAgE+QxcBLgEMSQIBQEEXASoBDEcCAUlFHgEvAQwdRxMCAUwMQRYBMQEMHgIBL3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9iYXNlL2luc3RydW1lbnRhdGlvbi5kYXJ0MHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9leHBvcnQuZGFydIQ3Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZXhwb3J0OwoKaW1wb3J0ICdidWlsZGVyL2J1aWxkZXIuZGFydCcgc2hvdyBEZWNsYXJhdGlvbiwgTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJ2NvbWJpbmF0b3IuZGFydCcgc2hvdyBDb21iaW5hdG9yOwoKY2xhc3MgRXhwb3J0IHsKICAvLy8gVGhlIGxpYnJhcnkgdGhhdCBpcyBleHBvcnRpbmcgW2V4cG9ydGVkXTsKICBmaW5hbCBMaWJyYXJ5QnVpbGRlciBleHBvcnRlcjsKCiAgLy8vIFRoZSBsaWJyYXJ5IGJlaW5nIGV4cG9ydGVkLgogIGZpbmFsIExpYnJhcnlCdWlsZGVyIGV4cG9ydGVkOwoKICBmaW5hbCBMaXN0PENvbWJpbmF0b3I+IGNvbWJpbmF0b3JzOwoKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKCiAgRXhwb3J0KHRoaXMuZXhwb3J0ZXIsIHRoaXMuZXhwb3J0ZWQsIHRoaXMuY29tYmluYXRvcnMsIHRoaXMuY2hhck9mZnNldCk7CgogIFVyaSBnZXQgZmlsZVVyaSA9PiBleHBvcnRlci5maWxlVXJpOwoKICBib29sIGFkZFRvRXhwb3J0U2NvcGUoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgaWYgKGNvbWJpbmF0b3JzICE9IG51bGwpIHsKICAgICAgZm9yIChDb21iaW5hdG9yIGNvbWJpbmF0b3IgaW4gY29tYmluYXRvcnMpIHsKICAgICAgICBpZiAoY29tYmluYXRvci5pc1Nob3cgJiYgIWNvbWJpbmF0b3IubmFtZXMuY29udGFpbnMobmFtZSkpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoY29tYmluYXRvci5pc0hpZGUgJiYgY29tYmluYXRvci5uYW1lcy5jb250YWlucyhuYW1lKSkgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZXhwb3J0ZXIuYWRkVG9FeHBvcnRTY29wZShuYW1lLCBtZW1iZXIsIGNoYXJPZmZzZXQpOwogIH0KfQolAE5OPAEWAUABKgEPMCEBIiEBJgEYAUsBJwE7HzNRUAgGQAQCASdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZXhwb3J0LmRhcnQwc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2ltcG9ydC5kYXJ0jKYvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5pbXBvcnQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IExpYnJhcnlEZXBlbmRlbmN5OwoKaW1wb3J0ICdidWlsZGVyL2J1aWxkZXIuZGFydCcgc2hvdyBEZWNsYXJhdGlvbiwgTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJ2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JyBzaG93IHRvS2VybmVsQ29tYmluYXRvcnM7CgppbXBvcnQgJ2tlcm5lbC9rZXJuZWxfcHJlZml4X2J1aWxkZXIuZGFydCcgc2hvdyBLZXJuZWxQcmVmaXhCdWlsZGVyOwoKaW1wb3J0ICdjb21iaW5hdG9yLmRhcnQnIHNob3cgQ29tYmluYXRvcjsKCmltcG9ydCAnY29uZmlndXJhdGlvbi5kYXJ0JyBzaG93IENvbmZpZ3VyYXRpb247CgpjbGFzcyBJbXBvcnQgewogIC8vLyBUaGUgbGlicmFyeSB0aGF0IGlzIGltcG9ydGluZyBbaW1wb3J0ZWRdOwogIGZpbmFsIExpYnJhcnlCdWlsZGVyIGltcG9ydGVyOwoKICAvLy8gVGhlIGxpYnJhcnkgYmVpbmcgaW1wb3J0ZWQuCiAgZmluYWwgTGlicmFyeUJ1aWxkZXIgaW1wb3J0ZWQ7CgogIGZpbmFsIEtlcm5lbFByZWZpeEJ1aWxkZXIgcHJlZml4QnVpbGRlcjsKCiAgZmluYWwgYm9vbCBkZWZlcnJlZDsKCiAgZmluYWwgU3RyaW5nIHByZWZpeDsKCiAgZmluYWwgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9yczsKCiAgZmluYWwgTGlzdDxDb25maWd1cmF0aW9uPiBjb25maWd1cmF0aW9uczsKCiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIGZpbmFsIGludCBwcmVmaXhDaGFyT2Zmc2V0OwoKICAvLyBUaGUgTGlicmFyeUJ1aWxkZXIgZm9yIHRoZSBpbXBvcnRlZCBsaWJyYXJ5ICgnaW1wb3J0ZWQnKSBtYXkgYmUgbnVsbCB3aGVuCiAgLy8gdGhpcyBmaWVsZCBpcyBzZXQuCiAgZmluYWwgU3RyaW5nIG5hdGl2ZUltcG9ydFBhdGg7CgogIEltcG9ydCgKICAgICAgdGhpcy5pbXBvcnRlciwKICAgICAgdGhpcy5pbXBvcnRlZCwKICAgICAgdGhpcy5kZWZlcnJlZCwKICAgICAgdGhpcy5wcmVmaXgsCiAgICAgIHRoaXMuY29tYmluYXRvcnMsCiAgICAgIHRoaXMuY29uZmlndXJhdGlvbnMsCiAgICAgIHRoaXMuY2hhck9mZnNldCwKICAgICAgdGhpcy5wcmVmaXhDaGFyT2Zmc2V0LAogICAgICBpbnQgaW1wb3J0SW5kZXgsCiAgICAgIHt0aGlzLm5hdGl2ZUltcG9ydFBhdGh9KQogICAgICA6IHByZWZpeEJ1aWxkZXIgPSBjcmVhdGVQcmVmaXhCdWlsZGVyKHByZWZpeCwgaW1wb3J0ZXIsIGltcG9ydGVkLAogICAgICAgICAgICBjb21iaW5hdG9ycywgZGVmZXJyZWQsIGNoYXJPZmZzZXQsIHByZWZpeENoYXJPZmZzZXQsIGltcG9ydEluZGV4KTsKCiAgVXJpIGdldCBmaWxlVXJpID0+IGltcG9ydGVyLmZpbGVVcmk7CgogIHZvaWQgZmluYWxpemVJbXBvcnRzKExpYnJhcnlCdWlsZGVyIGltcG9ydGVyKSB7CiAgICBpZiAobmF0aXZlSW1wb3J0UGF0aCAhPSBudWxsKSByZXR1cm47CiAgICB2b2lkIEZ1bmN0aW9uKFN0cmluZywgRGVjbGFyYXRpb24pIGFkZDsKICAgIGlmIChwcmVmaXhCdWlsZGVyID09IG51bGwpIHsKICAgICAgYWRkID0gKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBtZW1iZXIpIHsKICAgICAgICBpbXBvcnRlci5hZGRUb1Njb3BlKG5hbWUsIG1lbWJlciwgY2hhck9mZnNldCwgdHJ1ZSk7CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBhZGQgPSAoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgICAgIHByZWZpeEJ1aWxkZXIuYWRkVG9FeHBvcnRTY29wZShuYW1lLCBtZW1iZXIsIGNoYXJPZmZzZXQpOwogICAgICB9OwogICAgfQogICAgaW1wb3J0ZWQuZXhwb3J0U2NvcGUuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgICBpZiAoY29tYmluYXRvcnMgIT0gbnVsbCkgewogICAgICAgIGZvciAoQ29tYmluYXRvciBjb21iaW5hdG9yIGluIGNvbWJpbmF0b3JzKSB7CiAgICAgICAgICBpZiAoY29tYmluYXRvci5pc1Nob3cgJiYgIWNvbWJpbmF0b3IubmFtZXMuY29udGFpbnMobmFtZSkpIHJldHVybjsKICAgICAgICAgIGlmIChjb21iaW5hdG9yLmlzSGlkZSAmJiBjb21iaW5hdG9yLm5hbWVzLmNvbnRhaW5zKG5hbWUpKSByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIGFkZChuYW1lLCBtZW1iZXIpOwogICAgfSk7CiAgICBpZiAocHJlZml4QnVpbGRlciAhPSBudWxsKSB7CiAgICAgIERlY2xhcmF0aW9uIGV4aXN0aW5nID0KICAgICAgICAgIGltcG9ydGVyLmFkZEJ1aWxkZXIocHJlZml4LCBwcmVmaXhCdWlsZGVyLCBwcmVmaXhDaGFyT2Zmc2V0KTsKICAgICAgaWYgKGV4aXN0aW5nID09IHByZWZpeEJ1aWxkZXIpIHsKICAgICAgICBpbXBvcnRlci5hZGRUb1Njb3BlKHByZWZpeCwgcHJlZml4QnVpbGRlciwgcHJlZml4Q2hhck9mZnNldCwgdHJ1ZSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCktlcm5lbFByZWZpeEJ1aWxkZXIgY3JlYXRlUHJlZml4QnVpbGRlcigKICAgIFN0cmluZyBwcmVmaXgsCiAgICBMaWJyYXJ5QnVpbGRlciBpbXBvcnRlciwKICAgIExpYnJhcnlCdWlsZGVyIGltcG9ydGVkLAogICAgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9ycywKICAgIGJvb2wgZGVmZXJyZWQsCiAgICBpbnQgY2hhck9mZnNldCwKICAgIGludCBwcmVmaXhDaGFyT2Zmc2V0LAogICAgaW50IGltcG9ydEluZGV4KSB7CiAgaWYgKHByZWZpeCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICBMaWJyYXJ5RGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gbnVsbDsKICBpZiAoZGVmZXJyZWQpIHsKICAgIGRlcGVuZGVuY3kgPSBuZXcgTGlicmFyeURlcGVuZGVuY3kuZGVmZXJyZWRJbXBvcnQoaW1wb3J0ZWQudGFyZ2V0LCBwcmVmaXgsCiAgICAgICAgY29tYmluYXRvcnM6IHRvS2VybmVsQ29tYmluYXRvcnMoY29tYmluYXRvcnMpKQogICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogIH0KICByZXR1cm4gbmV3IEtlcm5lbFByZWZpeEJ1aWxkZXIoCiAgICAgIHByZWZpeCwgZGVmZXJyZWQsIGltcG9ydGVyLCBkZXBlbmRlbmN5LCBwcmVmaXhDaGFyT2Zmc2V0LCBpbXBvcnRJbmRleCk7Cn0KbwBOTjwBFgE5AUABPgFFASoBMAEPMCEBIiEBKwEXARcBJgEsARgBHgFPGCEBChUVFRMYGxcdFx9ITwEnATIqLCEwPQkNMEIJBkUhNU1MCggZCCEdSCdMCAYEAgEpEx0dIhMUGhcjJxJPNyEEIk4CASdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaW1wb3J0LmRhcnRGc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC90cmFuc2Zvcm1fY29sbGVjdGlvbnMuZGFydMAAXMAvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS50cmFuc2Zvcm1fY29sbGVjdGlvbnM7CgppbXBvcnQgJ2RhcnQ6Y29yZScgaGlkZSBNYXBFbnRyeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIEFzRXhwcmVzc2lvbiwKICAgICAgICBCbG9jaywKICAgICAgICBCbG9ja0V4cHJlc3Npb24sCiAgICAgICAgQ2xhc3MsCiAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCwKICAgICAgICBGaWVsZCwKICAgICAgICBGb3JJblN0YXRlbWVudCwKICAgICAgICBGb3JTdGF0ZW1lbnQsCiAgICAgICAgSWZTdGF0ZW1lbnQsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBMZXQsCiAgICAgICAgTGlzdENvbmNhdGVuYXRpb24sCiAgICAgICAgTGlzdExpdGVyYWwsCiAgICAgICAgTWFwQ29uY2F0ZW5hdGlvbiwKICAgICAgICBNYXBFbnRyeSwKICAgICAgICBNYXBMaXRlcmFsLAogICAgICAgIE1ldGhvZEludm9jYXRpb24sCiAgICAgICAgTmFtZSwKICAgICAgICBOb3QsCiAgICAgICAgTnVsbExpdGVyYWwsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFByb3BlcnR5R2V0LAogICAgICAgIFNldENvbmNhdGVuYXRpb24sCiAgICAgICAgU2V0TGl0ZXJhbCwKICAgICAgICBTdGF0ZW1lbnQsCiAgICAgICAgU3RhdGljSW52b2NhdGlvbiwKICAgICAgICB0cmFuc2Zvcm1MaXN0LAogICAgICAgIFRyZWVOb2RlLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24sCiAgICAgICAgVmFyaWFibGVHZXQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgc2hvdyBUeXBlRW52aXJvbm1lbnQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3Zpc2l0b3IuZGFydCcgc2hvdyBUcmFuc2Zvcm1lcjsKCmltcG9ydCAnY29sbGVjdGlvbnMuZGFydCcKICAgIHNob3cKICAgICAgICBDb250cm9sRmxvd0VsZW1lbnQsCiAgICAgICAgQ29udHJvbEZsb3dNYXBFbnRyeSwKICAgICAgICBGb3JFbGVtZW50LAogICAgICAgIEZvckluRWxlbWVudCwKICAgICAgICBGb3JJbk1hcEVudHJ5LAogICAgICAgIEZvck1hcEVudHJ5LAogICAgICAgIElmRWxlbWVudCwKICAgICAgICBJZk1hcEVudHJ5LAogICAgICAgIFNwcmVhZEVsZW1lbnQsCiAgICAgICAgU3ByZWFkTWFwRW50cnk7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgZ2V0RmlsZVVyaSwgdW5oYW5kbGVkOwoKaW1wb3J0ICcuLi9zb3VyY2Uvc291cmNlX2xvYWRlci5kYXJ0JyBzaG93IFNvdXJjZUxvYWRlcjsKCmltcG9ydCAncmVkaXJlY3RpbmdfZmFjdG9yeV9ib2R5LmRhcnQnIHNob3cgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keTsKCmNsYXNzIENvbGxlY3Rpb25UcmFuc2Zvcm1lciBleHRlbmRzIFRyYW5zZm9ybWVyIHsKICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzOwogIGZpbmFsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQ7CiAgZmluYWwgUHJvY2VkdXJlIGxpc3RBZGQ7CiAgZmluYWwgUHJvY2VkdXJlIHNldEZhY3Rvcnk7CiAgZmluYWwgUHJvY2VkdXJlIHNldEFkZDsKICBmaW5hbCBQcm9jZWR1cmUgb2JqZWN0RXF1YWxzOwogIGZpbmFsIFByb2NlZHVyZSBtYXBFbnRyaWVzOwogIGZpbmFsIFByb2NlZHVyZSBtYXBQdXQ7CiAgZmluYWwgQ2xhc3MgbWFwRW50cnlDbGFzczsKICBmaW5hbCBGaWVsZCBtYXBFbnRyeUtleTsKICBmaW5hbCBGaWVsZCBtYXBFbnRyeVZhbHVlOwoKICBzdGF0aWMgUHJvY2VkdXJlIF9maW5kU2V0RmFjdG9yeShDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgICBQcm9jZWR1cmUgZmFjdG9yeSA9IGNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdTZXQnLCAnJyk7CiAgICBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5IGJvZHkgPSBmYWN0b3J5Py5mdW5jdGlvbj8uYm9keTsKICAgIHJldHVybiBib2R5Py50YXJnZXQ7CiAgfQoKICBDb2xsZWN0aW9uVHJhbnNmb3JtZXIoU291cmNlTG9hZGVyIGxvYWRlcikKICAgICAgOiBjb3JlVHlwZXMgPSBsb2FkZXIuY29yZVR5cGVzLAogICAgICAgIHR5cGVFbnZpcm9ubWVudCA9IGxvYWRlci50eXBlSW5mZXJlbmNlRW5naW5lLnR5cGVTY2hlbWFFbnZpcm9ubWVudCwKICAgICAgICBsaXN0QWRkID0gbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdMaXN0JywgJ2FkZCcpLAogICAgICAgIHNldEZhY3RvcnkgPSBfZmluZFNldEZhY3RvcnkobG9hZGVyLmNvcmVUeXBlcyksCiAgICAgICAgc2V0QWRkID0gbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdTZXQnLCAnYWRkJyksCiAgICAgICAgb2JqZWN0RXF1YWxzID0KICAgICAgICAgICAgbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdPYmplY3QnLCAnPT0nKSwKICAgICAgICBtYXBFbnRyaWVzID0KICAgICAgICAgICAgbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdNYXAnLCAnZ2V0OmVudHJpZXMnKSwKICAgICAgICBtYXBQdXQgPSBsb2FkZXIuY29yZVR5cGVzLmluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ01hcCcsICdbXT0nKSwKICAgICAgICBtYXBFbnRyeUNsYXNzID0KICAgICAgICAgICAgbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ01hcEVudHJ5JyksCiAgICAgICAgbWFwRW50cnlLZXkgPQogICAgICAgICAgICBsb2FkZXIuY29yZVR5cGVzLmluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ01hcEVudHJ5JywgJ2tleScpLAogICAgICAgIG1hcEVudHJ5VmFsdWUgPQogICAgICAgICAgICBsb2FkZXIuY29yZVR5cGVzLmluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ01hcEVudHJ5JywgJ3ZhbHVlJyk7CgogIFRyZWVOb2RlIF90cmFuc2xhdGVMaXN0T3JTZXQoCiAgICAgIEV4cHJlc3Npb24gbm9kZSwgRGFydFR5cGUgZWxlbWVudFR5cGUsIExpc3Q8RXhwcmVzc2lvbj4gZWxlbWVudHMsCiAgICAgIHtib29sIGlzU2V0OiBmYWxzZX0pIHsKICAgIC8vIFRyYW5zbGF0ZSBlbGVtZW50cyBpbiBwbGFjZSB1cCB0byB0aGUgZmlyc3Qgbm9uLWV4cHJlc3Npb24sIGlmIGFueS4KICAgIGludCBpID0gMDsKICAgIGZvciAoOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKGVsZW1lbnRzW2ldIGlzIENvbnRyb2xGbG93RWxlbWVudCkgYnJlYWs7CiAgICAgIGVsZW1lbnRzW2ldID0gZWxlbWVudHNbaV0uYWNjZXB0KHRoaXMpLi5wYXJlbnQgPSBub2RlOwogICAgfQoKICAgIC8vIElmIHRoZXJlIHdlcmUgb25seSBleHByZXNzaW9ucywgd2UgYXJlIGRvbmUuCiAgICBpZiAoaSA9PSBlbGVtZW50cy5sZW5ndGgpIHJldHVybiBub2RlOwoKICAgIC8vIEJ1aWxkIGEgYmxvY2sgZXhwcmVzc2lvbiBhbmQgY3JlYXRlIGFuIGVtcHR5IGxpc3Qgb3Igc2V0LgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQ7CiAgICBpZiAoaXNTZXQpIHsKICAgICAgLy8gVE9ETyhrbWlsbGlraW4pOiBXaGVuIGFsbCB0aGUgYmFjayBlbmRzIGhhbmRsZSBzZXQgbGl0ZXJhbHMgd2UgY2FuIHVzZQogICAgICAvLyBvbmUgaGVyZS4KICAgICAgcmVzdWx0ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgICBuZXcgU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgICBzZXRGYWN0b3J5LCBuZXcgQXJndW1lbnRzKFtdLCB0eXBlczogW2VsZW1lbnRUeXBlXSkpLAogICAgICAgICAgdHlwZTogbmV3IEludGVyZmFjZVR5cGUoY29yZVR5cGVzLnNldENsYXNzLCBbZWxlbWVudFR5cGVdKSwKICAgICAgICAgIGlzRmluYWw6IHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgICBuZXcgTGlzdExpdGVyYWwoW10sIHR5cGVBcmd1bWVudDogZWxlbWVudFR5cGUpLAogICAgICAgICAgdHlwZTogbmV3IEludGVyZmFjZVR5cGUoY29yZVR5cGVzLmxpc3RDbGFzcywgW2VsZW1lbnRUeXBlXSksCiAgICAgICAgICBpc0ZpbmFsOiB0cnVlKTsKICAgIH0KICAgIExpc3Q8U3RhdGVtZW50PiBib2R5ID0gW3Jlc3VsdF07CiAgICAvLyBBZGQgdGhlIGVsZW1lbnRzIHVwIHRvIHRoZSBmaXJzdCBub24tZXhwcmVzc2lvbi4KICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgKytqKSB7CiAgICAgIF9hZGRFeHByZXNzaW9uRWxlbWVudChlbGVtZW50c1tqXSwgaXNTZXQsIHJlc3VsdCwgYm9keSk7CiAgICB9CiAgICAvLyBUcmFuc2xhdGUgdGhlIGVsZW1lbnRzIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IG5vbi1leHByZXNzaW9uLgogICAgZm9yICg7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkgewogICAgICBfdHJhbnNsYXRlRWxlbWVudChlbGVtZW50c1tpXSwgZWxlbWVudFR5cGUsIGlzU2V0LCByZXN1bHQsIGJvZHkpOwogICAgfQoKICAgIHJldHVybiBuZXcgQmxvY2tFeHByZXNzaW9uKG5ldyBCbG9jayhib2R5KSwgbmV3IFZhcmlhYmxlR2V0KHJlc3VsdCkpOwogIH0KCiAgdm9pZCBfdHJhbnNsYXRlRWxlbWVudChFeHByZXNzaW9uIGVsZW1lbnQsIERhcnRUeXBlIGVsZW1lbnRUeXBlLCBib29sIGlzU2V0LAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlc3VsdCwgTGlzdDxTdGF0ZW1lbnQ+IGJvZHkpIHsKICAgIGlmIChlbGVtZW50IGlzIFNwcmVhZEVsZW1lbnQpIHsKICAgICAgX3RyYW5zbGF0ZVNwcmVhZEVsZW1lbnQoZWxlbWVudCwgZWxlbWVudFR5cGUsIGlzU2V0LCByZXN1bHQsIGJvZHkpOwogICAgfSBlbHNlIGlmIChlbGVtZW50IGlzIElmRWxlbWVudCkgewogICAgICBfdHJhbnNsYXRlSWZFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnRUeXBlLCBpc1NldCwgcmVzdWx0LCBib2R5KTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpcyBGb3JFbGVtZW50KSB7CiAgICAgIF90cmFuc2xhdGVGb3JFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnRUeXBlLCBpc1NldCwgcmVzdWx0LCBib2R5KTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpcyBGb3JJbkVsZW1lbnQpIHsKICAgICAgX3RyYW5zbGF0ZUZvckluRWxlbWVudChlbGVtZW50LCBlbGVtZW50VHlwZSwgaXNTZXQsIHJlc3VsdCwgYm9keSk7CiAgICB9IGVsc2UgewogICAgICBfYWRkRXhwcmVzc2lvbkVsZW1lbnQoZWxlbWVudC5hY2NlcHQodGhpcyksIGlzU2V0LCByZXN1bHQsIGJvZHkpOwogICAgfQogIH0KCiAgdm9pZCBfYWRkRXhwcmVzc2lvbkVsZW1lbnQoRXhwcmVzc2lvbiBlbGVtZW50LCBib29sIGlzU2V0LAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlc3VsdCwgTGlzdDxTdGF0ZW1lbnQ+IGJvZHkpIHsKICAgIGJvZHkuYWRkKG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgIG5ldyBWYXJpYWJsZUdldChyZXN1bHQpLAogICAgICAgIG5ldyBOYW1lKCdhZGQnKSwKICAgICAgICBuZXcgQXJndW1lbnRzKFtlbGVtZW50XSksCiAgICAgICAgaXNTZXQgPyBzZXRBZGQgOiBsaXN0QWRkKSkpOwogIH0KCiAgdm9pZCBfdHJhbnNsYXRlSWZFbGVtZW50KElmRWxlbWVudCBlbGVtZW50LCBEYXJ0VHlwZSBlbGVtZW50VHlwZSwgYm9vbCBpc1NldCwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQsIExpc3Q8U3RhdGVtZW50PiBib2R5KSB7CiAgICBMaXN0PFN0YXRlbWVudD4gdGhlblN0YXRlbWVudHMgPSBbXTsKICAgIF90cmFuc2xhdGVFbGVtZW50KGVsZW1lbnQudGhlbiwgZWxlbWVudFR5cGUsIGlzU2V0LCByZXN1bHQsIHRoZW5TdGF0ZW1lbnRzKTsKICAgIExpc3Q8U3RhdGVtZW50PiBlbHNlU3RhdGVtZW50czsKICAgIGlmIChlbGVtZW50Lm90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIF90cmFuc2xhdGVFbGVtZW50KGVsZW1lbnQub3RoZXJ3aXNlLCBlbGVtZW50VHlwZSwgaXNTZXQsIHJlc3VsdCwKICAgICAgICAgIGVsc2VTdGF0ZW1lbnRzID0gPFN0YXRlbWVudD5bXSk7CiAgICB9CiAgICBTdGF0ZW1lbnQgdGhlbkJvZHkgPSB0aGVuU3RhdGVtZW50cy5sZW5ndGggPT0gMQogICAgICAgID8gdGhlblN0YXRlbWVudHMuZmlyc3QKICAgICAgICA6IG5ldyBCbG9jayh0aGVuU3RhdGVtZW50cyk7CiAgICBTdGF0ZW1lbnQgZWxzZUJvZHk7CiAgICBpZiAoZWxzZVN0YXRlbWVudHMgIT0gbnVsbCAmJiBlbHNlU3RhdGVtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgIGVsc2VCb2R5ID0gZWxzZVN0YXRlbWVudHMubGVuZ3RoID09IDEKICAgICAgICAgID8gZWxzZVN0YXRlbWVudHMuZmlyc3QKICAgICAgICAgIDogbmV3IEJsb2NrKGVsc2VTdGF0ZW1lbnRzKTsKICAgIH0KICAgIGJvZHkuYWRkKG5ldyBJZlN0YXRlbWVudChlbGVtZW50LmNvbmRpdGlvbi5hY2NlcHQodGhpcyksIHRoZW5Cb2R5LCBlbHNlQm9keSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZWxlbWVudC5maWxlT2Zmc2V0KTsKICB9CgogIHZvaWQgX3RyYW5zbGF0ZUZvckVsZW1lbnQoRm9yRWxlbWVudCBlbGVtZW50LCBEYXJ0VHlwZSBlbGVtZW50VHlwZSwKICAgICAgYm9vbCBpc1NldCwgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQsIExpc3Q8U3RhdGVtZW50PiBib2R5KSB7CiAgICBMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W107CiAgICBfdHJhbnNsYXRlRWxlbWVudChlbGVtZW50LmJvZHksIGVsZW1lbnRUeXBlLCBpc1NldCwgcmVzdWx0LCBzdGF0ZW1lbnRzKTsKICAgIFN0YXRlbWVudCBsb29wQm9keSA9CiAgICAgICAgc3RhdGVtZW50cy5sZW5ndGggPT0gMSA/IHN0YXRlbWVudHMuZmlyc3QgOiBuZXcgQmxvY2soc3RhdGVtZW50cyk7CiAgICBGb3JTdGF0ZW1lbnQgbG9vcCA9IG5ldyBGb3JTdGF0ZW1lbnQoZWxlbWVudC52YXJpYWJsZXMsCiAgICAgICAgZWxlbWVudC5jb25kaXRpb24/LmFjY2VwdCh0aGlzKSwgZWxlbWVudC51cGRhdGVzLCBsb29wQm9keSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZWxlbWVudC5maWxlT2Zmc2V0OwogICAgdHJhbnNmb3JtTGlzdChsb29wLnZhcmlhYmxlcywgdGhpcywgbG9vcCk7CiAgICB0cmFuc2Zvcm1MaXN0KGxvb3AudXBkYXRlcywgdGhpcywgbG9vcCk7CiAgICBib2R5LmFkZChsb29wKTsKICB9CgogIHZvaWQgX3RyYW5zbGF0ZUZvckluRWxlbWVudChGb3JJbkVsZW1lbnQgZWxlbWVudCwgRGFydFR5cGUgZWxlbWVudFR5cGUsCiAgICAgIGJvb2wgaXNTZXQsIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0LCBMaXN0PFN0YXRlbWVudD4gYm9keSkgewogICAgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHM7CiAgICBTdGF0ZW1lbnQgcHJvbG9ndWUgPSBlbGVtZW50LnByb2xvZ3VlOwogICAgaWYgKHByb2xvZ3VlID09IG51bGwpIHsKICAgICAgc3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W107CiAgICB9IGVsc2UgewogICAgICBwcm9sb2d1ZSA9IHByb2xvZ3VlLmFjY2VwdCh0aGlzKTsKICAgICAgc3RhdGVtZW50cyA9CiAgICAgICAgICBwcm9sb2d1ZSBpcyBCbG9jayA/IHByb2xvZ3VlLnN0YXRlbWVudHMgOiA8U3RhdGVtZW50Pltwcm9sb2d1ZV07CiAgICB9CiAgICBfdHJhbnNsYXRlRWxlbWVudChlbGVtZW50LmJvZHksIGVsZW1lbnRUeXBlLCBpc1NldCwgcmVzdWx0LCBzdGF0ZW1lbnRzKTsKICAgIFN0YXRlbWVudCBsb29wQm9keSA9CiAgICAgICAgc3RhdGVtZW50cy5sZW5ndGggPT0gMSA/IHN0YXRlbWVudHMuZmlyc3QgOiBuZXcgQmxvY2soc3RhdGVtZW50cyk7CiAgICBpZiAoZWxlbWVudC5wcm9ibGVtICE9IG51bGwpIHsKICAgICAgYm9keS5hZGQobmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoZWxlbWVudC5wcm9ibGVtLmFjY2VwdCh0aGlzKSkpOwogICAgfQogICAgYm9keS5hZGQobmV3IEZvckluU3RhdGVtZW50KAogICAgICAgIGVsZW1lbnQudmFyaWFibGUsIGVsZW1lbnQuaXRlcmFibGUuYWNjZXB0KHRoaXMpLCBsb29wQm9keSwKICAgICAgICBpc0FzeW5jOiBlbGVtZW50LmlzQXN5bmMpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVsZW1lbnQuZmlsZU9mZnNldCk7CiAgfQoKICB2b2lkIF90cmFuc2xhdGVTcHJlYWRFbGVtZW50KFNwcmVhZEVsZW1lbnQgZWxlbWVudCwgRGFydFR5cGUgZWxlbWVudFR5cGUsCiAgICAgIGJvb2wgaXNTZXQsIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0LCBMaXN0PFN0YXRlbWVudD4gYm9keSkgewogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IGVsZW1lbnQuZXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7CiAgICAvLyBOdWxsLWF3YXJlIHNwcmVhZHMgcmVxdWlyZSB0ZXN0aW5nIHRoZSBzdWJleHByZXNzaW9uJ3MgdmFsdWUuCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHRlbXA7CiAgICBpZiAoZWxlbWVudC5pc051bGxBd2FyZSkgewogICAgICB0ZW1wID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUodmFsdWUsCiAgICAgICAgICB0eXBlOiBjb25zdCBEeW5hbWljVHlwZSgpLCBpc0ZpbmFsOiB0cnVlKTsKICAgICAgYm9keS5hZGQodGVtcCk7CiAgICAgIHZhbHVlID0gbmV3IFZhcmlhYmxlR2V0KHRlbXApOwogICAgfQoKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZWx0OwogICAgU3RhdGVtZW50IGxvb3BCb2R5OwogICAgaWYgKGVsZW1lbnQuZWxlbWVudFR5cGUgPT0gbnVsbCB8fAogICAgICAgICF0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoZWxlbWVudC5lbGVtZW50VHlwZSwgZWxlbWVudFR5cGUpKSB7CiAgICAgIGVsdCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKG51bGwsCiAgICAgICAgICB0eXBlOiBjb25zdCBEeW5hbWljVHlwZSgpLCBpc0ZpbmFsOiB0cnVlKTsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBjYXN0ZWRWYXIgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZSgKICAgICAgICAgIG5ldyBBc0V4cHJlc3Npb24obmV3IFZhcmlhYmxlR2V0KGVsdCksIGVsZW1lbnRUeXBlKQogICAgICAgICAgICAuLmlzVHlwZUVycm9yID0gdHJ1ZQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBlbGVtZW50LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlKTsKICAgICAgbG9vcEJvZHkgPSBuZXcgQmxvY2soPFN0YXRlbWVudD5bCiAgICAgICAgY2FzdGVkVmFyLAogICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQocmVzdWx0KSwKICAgICAgICAgICAgbmV3IE5hbWUoJ2FkZCcpLAogICAgICAgICAgICBuZXcgQXJndW1lbnRzKFtuZXcgVmFyaWFibGVHZXQoY2FzdGVkVmFyKV0pLAogICAgICAgICAgICBpc1NldCA/IHNldEFkZCA6IGxpc3RBZGQpKQogICAgICBdKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsdCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKG51bGwsIHR5cGU6IGVsZW1lbnRUeXBlLCBpc0ZpbmFsOiB0cnVlKTsKICAgICAgbG9vcEJvZHkgPSBuZXcgRXhwcmVzc2lvblN0YXRlbWVudChuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChyZXN1bHQpLAogICAgICAgICAgbmV3IE5hbWUoJ2FkZCcpLAogICAgICAgICAgbmV3IEFyZ3VtZW50cyhbbmV3IFZhcmlhYmxlR2V0KGVsdCldKSwKICAgICAgICAgIGlzU2V0ID8gc2V0QWRkIDogbGlzdEFkZCkpOwogICAgfQogICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG5ldyBGb3JJblN0YXRlbWVudChlbHQsIHZhbHVlLCBsb29wQm9keSk7CgogICAgaWYgKGVsZW1lbnQuaXNOdWxsQXdhcmUpIHsKICAgICAgc3RhdGVtZW50ID0gbmV3IElmU3RhdGVtZW50KAogICAgICAgICAgbmV3IE5vdChuZXcgTWV0aG9kSW52b2NhdGlvbihuZXcgVmFyaWFibGVHZXQodGVtcCksIG5ldyBOYW1lKCc9PScpLAogICAgICAgICAgICAgIG5ldyBBcmd1bWVudHMoW25ldyBOdWxsTGl0ZXJhbCgpXSksIG9iamVjdEVxdWFscykpLAogICAgICAgICAgc3RhdGVtZW50LAogICAgICAgICAgbnVsbCk7CiAgICB9CiAgICBib2R5LmFkZChzdGF0ZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRMaXN0TGl0ZXJhbChMaXN0TGl0ZXJhbCBub2RlKSB7CiAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiBfdHJhbnNsYXRlQ29uc3RMaXN0T3JTZXQobm9kZSwgbm9kZS50eXBlQXJndW1lbnQsIG5vZGUuZXhwcmVzc2lvbnMsCiAgICAgICAgICBpc1NldDogZmFsc2UpOwogICAgfQoKICAgIHJldHVybiBfdHJhbnNsYXRlTGlzdE9yU2V0KG5vZGUsIG5vZGUudHlwZUFyZ3VtZW50LCBub2RlLmV4cHJlc3Npb25zLAogICAgICAgIGlzU2V0OiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdFNldExpdGVyYWwoU2V0TGl0ZXJhbCBub2RlKSB7CiAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiBfdHJhbnNsYXRlQ29uc3RMaXN0T3JTZXQobm9kZSwgbm9kZS50eXBlQXJndW1lbnQsIG5vZGUuZXhwcmVzc2lvbnMsCiAgICAgICAgICBpc1NldDogdHJ1ZSk7CiAgICB9CgogICAgcmV0dXJuIF90cmFuc2xhdGVMaXN0T3JTZXQobm9kZSwgbm9kZS50eXBlQXJndW1lbnQsIG5vZGUuZXhwcmVzc2lvbnMsCiAgICAgICAgaXNTZXQ6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRNYXBMaXRlcmFsKE1hcExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gX3RyYW5zbGF0ZUNvbnN0TWFwKG5vZGUpOwogICAgfQoKICAgIC8vIFRyYW5zbGF0ZSBlbnRyaWVzIGluIHBsYWNlIHVwIHRvIHRoZSBmaXJzdCBjb250cm9sLWZsb3cgZW50cnksIGlmIGFueS4KICAgIGludCBpID0gMDsKICAgIGZvciAoOyBpIDwgbm9kZS5lbnRyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChub2RlLmVudHJpZXNbaV0gaXMgQ29udHJvbEZsb3dNYXBFbnRyeSkgYnJlYWs7CiAgICAgIG5vZGUuZW50cmllc1tpXSA9IG5vZGUuZW50cmllc1tpXS5hY2NlcHQodGhpcykuLnBhcmVudCA9IG5vZGU7CiAgICB9CgogICAgLy8gSWYgdGhlcmUgd2VyZSBubyBjb250cm9sLWZsb3cgZW50cmllcyB3ZSBhcmUgZG9uZS4KICAgIGlmIChpID09IG5vZGUuZW50cmllcy5sZW5ndGgpIHJldHVybiBub2RlOwoKICAgIC8vIEJ1aWxkIGEgYmxvY2sgZXhwcmVzc2lvbiBhbmQgY3JlYXRlIGFuIGVtcHR5IG1hcC4KICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgbmV3IE1hcExpdGVyYWwoW10sIGtleVR5cGU6IG5vZGUua2V5VHlwZSwgdmFsdWVUeXBlOiBub2RlLnZhbHVlVHlwZSksCiAgICAgICAgdHlwZTogbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGNvcmVUeXBlcy5tYXBDbGFzcywgW25vZGUua2V5VHlwZSwgbm9kZS52YWx1ZVR5cGVdKSwKICAgICAgICBpc0ZpbmFsOiB0cnVlKTsKICAgIExpc3Q8U3RhdGVtZW50PiBib2R5ID0gW3Jlc3VsdF07CiAgICAvLyBBZGQgYWxsIHRoZSBlbnRyaWVzIHVwIHRvIHRoZSBmaXJzdCBjb250cm9sLWZsb3cgZW50cnkuCiAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgewogICAgICBfYWRkTm9ybWFsRW50cnkobm9kZS5lbnRyaWVzW2pdLCByZXN1bHQsIGJvZHkpOwogICAgfQogICAgZm9yICg7IGkgPCBub2RlLmVudHJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgX3RyYW5zbGF0ZUVudHJ5KAogICAgICAgICAgbm9kZS5lbnRyaWVzW2ldLCBub2RlLmtleVR5cGUsIG5vZGUudmFsdWVUeXBlLCByZXN1bHQsIGJvZHkpOwogICAgfQoKICAgIHJldHVybiBuZXcgQmxvY2tFeHByZXNzaW9uKG5ldyBCbG9jayhib2R5KSwgbmV3IFZhcmlhYmxlR2V0KHJlc3VsdCkpOwogIH0KCiAgdm9pZCBfdHJhbnNsYXRlRW50cnkoTWFwRW50cnkgZW50cnksIERhcnRUeXBlIGtleVR5cGUsIERhcnRUeXBlIHZhbHVlVHlwZSwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQsIExpc3Q8U3RhdGVtZW50PiBib2R5KSB7CiAgICBpZiAoZW50cnkgaXMgU3ByZWFkTWFwRW50cnkpIHsKICAgICAgX3RyYW5zbGF0ZVNwcmVhZEVudHJ5KGVudHJ5LCBrZXlUeXBlLCB2YWx1ZVR5cGUsIHJlc3VsdCwgYm9keSk7CiAgICB9IGVsc2UgaWYgKGVudHJ5IGlzIElmTWFwRW50cnkpIHsKICAgICAgX3RyYW5zbGF0ZUlmRW50cnkoZW50cnksIGtleVR5cGUsIHZhbHVlVHlwZSwgcmVzdWx0LCBib2R5KTsKICAgIH0gZWxzZSBpZiAoZW50cnkgaXMgRm9yTWFwRW50cnkpIHsKICAgICAgX3RyYW5zbGF0ZUZvckVudHJ5KGVudHJ5LCBrZXlUeXBlLCB2YWx1ZVR5cGUsIHJlc3VsdCwgYm9keSk7CiAgICB9IGVsc2UgaWYgKGVudHJ5IGlzIEZvckluTWFwRW50cnkpIHsKICAgICAgX3RyYW5zbGF0ZUZvckluRW50cnkoZW50cnksIGtleVR5cGUsIHZhbHVlVHlwZSwgcmVzdWx0LCBib2R5KTsKICAgIH0gZWxzZSB7CiAgICAgIF9hZGROb3JtYWxFbnRyeShlbnRyeS5hY2NlcHQodGhpcyksIHJlc3VsdCwgYm9keSk7CiAgICB9CiAgfQoKICB2b2lkIF9hZGROb3JtYWxFbnRyeSgKICAgICAgTWFwRW50cnkgZW50cnksIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0LCBMaXN0PFN0YXRlbWVudD4gYm9keSkgewogICAgYm9keS5hZGQobmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQobmV3IE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgbmV3IFZhcmlhYmxlR2V0KHJlc3VsdCksCiAgICAgICAgbmV3IE5hbWUoJ1tdPScpLAogICAgICAgIG5ldyBBcmd1bWVudHMoW2VudHJ5LmtleSwgZW50cnkudmFsdWVdKSwKICAgICAgICBtYXBQdXQpKSk7CiAgfQoKICB2b2lkIF90cmFuc2xhdGVJZkVudHJ5KElmTWFwRW50cnkgZW50cnksIERhcnRUeXBlIGtleVR5cGUsIERhcnRUeXBlIHZhbHVlVHlwZSwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQsIExpc3Q8U3RhdGVtZW50PiBib2R5KSB7CiAgICBMaXN0PFN0YXRlbWVudD4gdGhlbkJvZHkgPSBbXTsKICAgIF90cmFuc2xhdGVFbnRyeShlbnRyeS50aGVuLCBrZXlUeXBlLCB2YWx1ZVR5cGUsIHJlc3VsdCwgdGhlbkJvZHkpOwogICAgTGlzdDxTdGF0ZW1lbnQ+IGVsc2VCb2R5OwogICAgaWYgKGVudHJ5Lm90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIF90cmFuc2xhdGVFbnRyeShlbnRyeS5vdGhlcndpc2UsIGtleVR5cGUsIHZhbHVlVHlwZSwgcmVzdWx0LAogICAgICAgICAgZWxzZUJvZHkgPSA8U3RhdGVtZW50PltdKTsKICAgIH0KICAgIFN0YXRlbWVudCB0aGVuU3RhdGVtZW50ID0KICAgICAgICB0aGVuQm9keS5sZW5ndGggPT0gMSA/IHRoZW5Cb2R5LmZpcnN0IDogbmV3IEJsb2NrKHRoZW5Cb2R5KTsKICAgIFN0YXRlbWVudCBlbHNlU3RhdGVtZW50OwogICAgaWYgKGVsc2VCb2R5ICE9IG51bGwgJiYgZWxzZUJvZHkuaXNOb3RFbXB0eSkgewogICAgICBlbHNlU3RhdGVtZW50ID0KICAgICAgICAgIGVsc2VCb2R5Lmxlbmd0aCA9PSAxID8gZWxzZUJvZHkuZmlyc3QgOiBuZXcgQmxvY2soZWxzZUJvZHkpOwogICAgfQogICAgYm9keS5hZGQobmV3IElmU3RhdGVtZW50KAogICAgICAgIGVudHJ5LmNvbmRpdGlvbi5hY2NlcHQodGhpcyksIHRoZW5TdGF0ZW1lbnQsIGVsc2VTdGF0ZW1lbnQpKTsKICB9CgogIHZvaWQgX3RyYW5zbGF0ZUZvckVudHJ5KEZvck1hcEVudHJ5IGVudHJ5LCBEYXJ0VHlwZSBrZXlUeXBlLAogICAgICBEYXJ0VHlwZSB2YWx1ZVR5cGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0LCBMaXN0PFN0YXRlbWVudD4gYm9keSkgewogICAgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHMgPSA8U3RhdGVtZW50PltdOwogICAgX3RyYW5zbGF0ZUVudHJ5KGVudHJ5LmJvZHksIGtleVR5cGUsIHZhbHVlVHlwZSwgcmVzdWx0LCBzdGF0ZW1lbnRzKTsKICAgIFN0YXRlbWVudCBsb29wQm9keSA9CiAgICAgICAgc3RhdGVtZW50cy5sZW5ndGggPT0gMSA/IHN0YXRlbWVudHMuZmlyc3QgOiBuZXcgQmxvY2soc3RhdGVtZW50cyk7CiAgICBGb3JTdGF0ZW1lbnQgbG9vcCA9IG5ldyBGb3JTdGF0ZW1lbnQoCiAgICAgICAgZW50cnkudmFyaWFibGVzLCBlbnRyeS5jb25kaXRpb24/LmFjY2VwdCh0aGlzKSwgZW50cnkudXBkYXRlcywgbG9vcEJvZHkpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVudHJ5LmZpbGVPZmZzZXQ7CiAgICB0cmFuc2Zvcm1MaXN0KGxvb3AudmFyaWFibGVzLCB0aGlzLCBsb29wKTsKICAgIHRyYW5zZm9ybUxpc3QobG9vcC51cGRhdGVzLCB0aGlzLCBsb29wKTsKICAgIGJvZHkuYWRkKGxvb3ApOwogIH0KCiAgdm9pZCBfdHJhbnNsYXRlRm9ySW5FbnRyeShGb3JJbk1hcEVudHJ5IGVudHJ5LCBEYXJ0VHlwZSBrZXlUeXBlLAogICAgICBEYXJ0VHlwZSB2YWx1ZVR5cGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0LCBMaXN0PFN0YXRlbWVudD4gYm9keSkgewogICAgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHM7CiAgICBTdGF0ZW1lbnQgcHJvbG9ndWUgPSBlbnRyeS5wcm9sb2d1ZTsKICAgIGlmIChwcm9sb2d1ZSA9PSBudWxsKSB7CiAgICAgIHN0YXRlbWVudHMgPSA8U3RhdGVtZW50PltdOwogICAgfSBlbHNlIHsKICAgICAgcHJvbG9ndWUgPSBwcm9sb2d1ZS5hY2NlcHQodGhpcyk7CiAgICAgIHN0YXRlbWVudHMgPQogICAgICAgICAgcHJvbG9ndWUgaXMgQmxvY2sgPyBwcm9sb2d1ZS5zdGF0ZW1lbnRzIDogPFN0YXRlbWVudD5bcHJvbG9ndWVdOwogICAgfQogICAgX3RyYW5zbGF0ZUVudHJ5KGVudHJ5LmJvZHksIGtleVR5cGUsIHZhbHVlVHlwZSwgcmVzdWx0LCBzdGF0ZW1lbnRzKTsKICAgIFN0YXRlbWVudCBsb29wQm9keSA9CiAgICAgICAgc3RhdGVtZW50cy5sZW5ndGggPT0gMSA/IHN0YXRlbWVudHMuZmlyc3QgOiBuZXcgQmxvY2soc3RhdGVtZW50cyk7CiAgICBpZiAoZW50cnkucHJvYmxlbSAhPSBudWxsKSB7CiAgICAgIGJvZHkuYWRkKG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KGVudHJ5LnByb2JsZW0uYWNjZXB0KHRoaXMpKSk7CiAgICB9CiAgICBib2R5LmFkZChuZXcgRm9ySW5TdGF0ZW1lbnQoCiAgICAgICAgZW50cnkudmFyaWFibGUsIGVudHJ5Lml0ZXJhYmxlLmFjY2VwdCh0aGlzKSwgbG9vcEJvZHksCiAgICAgICAgaXNBc3luYzogZW50cnkuaXNBc3luYykKICAgICAgLi5maWxlT2Zmc2V0ID0gZW50cnkuZmlsZU9mZnNldCk7CiAgfQoKICB2b2lkIF90cmFuc2xhdGVTcHJlYWRFbnRyeShTcHJlYWRNYXBFbnRyeSBlbnRyeSwgRGFydFR5cGUga2V5VHlwZSwKICAgICAgRGFydFR5cGUgdmFsdWVUeXBlLCBWYXJpYWJsZURlY2xhcmF0aW9uIHJlc3VsdCwgTGlzdDxTdGF0ZW1lbnQ+IGJvZHkpIHsKICAgIEV4cHJlc3Npb24gdmFsdWUgPSBlbnRyeS5leHByZXNzaW9uLmFjY2VwdCh0aGlzKTsKICAgIC8vIE51bGwtYXdhcmUgc3ByZWFkcyByZXF1aXJlIHRlc3RpbmcgdGhlIHN1YmV4cHJlc3Npb24ncyB2YWx1ZS4KICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdGVtcDsKICAgIGlmIChlbnRyeS5pc051bGxBd2FyZSkgewogICAgICB0ZW1wID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUodmFsdWUsCiAgICAgICAgICB0eXBlOiBjb3JlVHlwZXMubWFwQ2xhc3MucmF3VHlwZSk7CiAgICAgIGJvZHkuYWRkKHRlbXApOwogICAgICB2YWx1ZSA9IG5ldyBWYXJpYWJsZUdldCh0ZW1wKTsKICAgIH0KCiAgICBEYXJ0VHlwZSBlbnRyeVR5cGUgPQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKG1hcEVudHJ5Q2xhc3MsIDxEYXJ0VHlwZT5ba2V5VHlwZSwgdmFsdWVUeXBlXSk7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGVsdDsKICAgIFN0YXRlbWVudCBsb29wQm9keTsKICAgIGlmIChlbnRyeS5lbnRyeVR5cGUgPT0gbnVsbCB8fAogICAgICAgICF0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoZW50cnkuZW50cnlUeXBlLCBlbnRyeVR5cGUpKSB7CiAgICAgIGVsdCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKG51bGwsCiAgICAgICAgICB0eXBlOiBuZXcgSW50ZXJmYWNlVHlwZShtYXBFbnRyeUNsYXNzLAogICAgICAgICAgICAgIDxEYXJ0VHlwZT5bY29uc3QgRHluYW1pY1R5cGUoKSwgY29uc3QgRHluYW1pY1R5cGUoKV0pLAogICAgICAgICAgaXNGaW5hbDogdHJ1ZSk7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24ga2V5VmFyID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgICBuZXcgQXNFeHByZXNzaW9uKAogICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUdldCgKICAgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KGVsdCksIG5ldyBOYW1lKCdrZXknKSwgbWFwRW50cnlLZXkpLAogICAgICAgICAgICAgIGtleVR5cGUpCiAgICAgICAgICAgIC4uaXNUeXBlRXJyb3IgPSB0cnVlCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGVudHJ5LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKICAgICAgICAgIHR5cGU6IGtleVR5cGUpOwogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhbHVlVmFyID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgICBuZXcgQXNFeHByZXNzaW9uKAogICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUdldCgKICAgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KGVsdCksIG5ldyBOYW1lKCd2YWx1ZScpLCBtYXBFbnRyeVZhbHVlKSwKICAgICAgICAgICAgICB2YWx1ZVR5cGUpCiAgICAgICAgICAgIC4uaXNUeXBlRXJyb3IgPSB0cnVlCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGVudHJ5LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKICAgICAgICAgIHR5cGU6IHZhbHVlVHlwZSk7CiAgICAgIGxvb3BCb2R5ID0gbmV3IEJsb2NrKDxTdGF0ZW1lbnQ+WwogICAgICAgIGtleVZhciwKICAgICAgICB2YWx1ZVZhciwKICAgICAgICBuZXcgRXhwcmVzc2lvblN0YXRlbWVudChuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KHJlc3VsdCksCiAgICAgICAgICAgIG5ldyBOYW1lKCdbXT0nKSwKICAgICAgICAgICAgbmV3IEFyZ3VtZW50cyhbbmV3IFZhcmlhYmxlR2V0KGtleVZhciksIG5ldyBWYXJpYWJsZUdldCh2YWx1ZVZhcildKSwKICAgICAgICAgICAgbWFwUHV0KSkKICAgICAgXSk7CiAgICB9IGVsc2UgewogICAgICBlbHQgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbihudWxsLCB0eXBlOiBlbnRyeVR5cGUsIGlzRmluYWw6IHRydWUpOwogICAgICBsb29wQm9keSA9IG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KHJlc3VsdCksCiAgICAgICAgICBuZXcgTmFtZSgnW109JyksCiAgICAgICAgICBuZXcgQXJndW1lbnRzKFsKICAgICAgICAgICAgbmV3IFByb3BlcnR5R2V0KG5ldyBWYXJpYWJsZUdldChlbHQpLCBuZXcgTmFtZSgna2V5JyksIG1hcEVudHJ5S2V5KSwKICAgICAgICAgICAgbmV3IFByb3BlcnR5R2V0KAogICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KGVsdCksIG5ldyBOYW1lKCd2YWx1ZScpLCBtYXBFbnRyeVZhbHVlKQogICAgICAgICAgXSksCiAgICAgICAgICBtYXBQdXQpKTsKICAgIH0KICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBuZXcgRm9ySW5TdGF0ZW1lbnQoCiAgICAgICAgZWx0LCBuZXcgUHJvcGVydHlHZXQodmFsdWUsIG5ldyBOYW1lKCdlbnRyaWVzJyksIG1hcEVudHJpZXMpLCBsb29wQm9keSk7CgogICAgaWYgKGVudHJ5LmlzTnVsbEF3YXJlKSB7CiAgICAgIHN0YXRlbWVudCA9IG5ldyBJZlN0YXRlbWVudCgKICAgICAgICAgIG5ldyBOb3QobmV3IE1ldGhvZEludm9jYXRpb24obmV3IFZhcmlhYmxlR2V0KHRlbXApLCBuZXcgTmFtZSgnPT0nKSwKICAgICAgICAgICAgICBuZXcgQXJndW1lbnRzKFtuZXcgTnVsbExpdGVyYWwoKV0pLCBvYmplY3RFcXVhbHMpKSwKICAgICAgICAgIHN0YXRlbWVudCwKICAgICAgICAgIG51bGwpOwogICAgfQogICAgYm9keS5hZGQoc3RhdGVtZW50KTsKICB9CgogIFRyZWVOb2RlIF90cmFuc2xhdGVDb25zdExpc3RPclNldCgKICAgICAgRXhwcmVzc2lvbiBub2RlLCBEYXJ0VHlwZSBlbGVtZW50VHlwZSwgTGlzdDxFeHByZXNzaW9uPiBlbGVtZW50cywKICAgICAge2Jvb2wgaXNTZXQ6IGZhbHNlfSkgewogICAgLy8gVHJhbnNsYXRlIGVsZW1lbnRzIGluIHBsYWNlIHVwIHRvIHRoZSBmaXJzdCBub24tZXhwcmVzc2lvbiwgaWYgYW55LgogICAgaW50IGkgPSAwOwogICAgZm9yICg7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkgewogICAgICBpZiAoZWxlbWVudHNbaV0gaXMgQ29udHJvbEZsb3dFbGVtZW50KSBicmVhazsKICAgICAgZWxlbWVudHNbaV0gPSBlbGVtZW50c1tpXS5hY2NlcHQodGhpcykuLnBhcmVudCA9IG5vZGU7CiAgICB9CgogICAgLy8gSWYgdGhlcmUgd2VyZSBvbmx5IGV4cHJlc3Npb25zLCB3ZSBhcmUgZG9uZS4KICAgIGlmIChpID09IGVsZW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGU7CgogICAgRXhwcmVzc2lvbiBtYWtlTGl0ZXJhbChMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zKSB7CiAgICAgIHJldHVybiBpc1NldAogICAgICAgICAgPyBuZXcgU2V0TGl0ZXJhbChleHByZXNzaW9ucywKICAgICAgICAgICAgICB0eXBlQXJndW1lbnQ6IGVsZW1lbnRUeXBlLCBpc0NvbnN0OiB0cnVlKQogICAgICAgICAgOiBuZXcgTGlzdExpdGVyYWwoZXhwcmVzc2lvbnMsCiAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50OiBlbGVtZW50VHlwZSwgaXNDb25zdDogdHJ1ZSk7CiAgICB9CgogICAgLy8gQnVpbGQgYSBjb25jYXRlbmF0aW9uIG5vZGUuCiAgICBMaXN0PEV4cHJlc3Npb24+IHBhcnRzID0gW107CiAgICBMaXN0PEV4cHJlc3Npb24+IGN1cnJlbnRQYXJ0ID0gaSA+IDAgPyBlbGVtZW50cy5zdWJsaXN0KDAsIGkpIDogbnVsbDsKCiAgICBmb3IgKDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIEV4cHJlc3Npb24gZWxlbWVudCA9IGVsZW1lbnRzW2ldOwogICAgICBpZiAoZWxlbWVudCBpcyBTcHJlYWRFbGVtZW50KSB7CiAgICAgICAgaWYgKGN1cnJlbnRQYXJ0ICE9IG51bGwpIHsKICAgICAgICAgIHBhcnRzLmFkZChtYWtlTGl0ZXJhbChjdXJyZW50UGFydCkpOwogICAgICAgICAgY3VycmVudFBhcnQgPSBudWxsOwogICAgICAgIH0KICAgICAgICBFeHByZXNzaW9uIHNwcmVhZEV4cHJlc3Npb24gPSBlbGVtZW50LmV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwogICAgICAgIGlmIChlbGVtZW50LmlzTnVsbEF3YXJlKSB7CiAgICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHRlbXAgPQogICAgICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKG51bGwsIGluaXRpYWxpemVyOiBzcHJlYWRFeHByZXNzaW9uKTsKICAgICAgICAgIHBhcnRzLmFkZChuZXcgTGV0KAogICAgICAgICAgICAgIHRlbXAsCiAgICAgICAgICAgICAgbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICAgICAgICAgICAgbmV3IE1ldGhvZEludm9jYXRpb24obmV3IFZhcmlhYmxlR2V0KHRlbXApLCBuZXcgTmFtZSgnPT0nKSwKICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcmd1bWVudHMoW25ldyBOdWxsTGl0ZXJhbCgpXSkpLAogICAgICAgICAgICAgICAgICBtYWtlTGl0ZXJhbChbXSksCiAgICAgICAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldCh0ZW1wKSwKICAgICAgICAgICAgICAgICAgY29uc3QgRHluYW1pY1R5cGUoKSkpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcGFydHMuYWRkKHNwcmVhZEV4cHJlc3Npb24pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGlzIElmRWxlbWVudCkgewogICAgICAgIGlmIChjdXJyZW50UGFydCAhPSBudWxsKSB7CiAgICAgICAgICBwYXJ0cy5hZGQobWFrZUxpdGVyYWwoY3VycmVudFBhcnQpKTsKICAgICAgICAgIGN1cnJlbnRQYXJ0ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBlbGVtZW50LmNvbmRpdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgICAgRXhwcmVzc2lvbiB0aGVuID0gbWFrZUxpdGVyYWwoW2VsZW1lbnQudGhlbl0pLmFjY2VwdCh0aGlzKTsKICAgICAgICBFeHByZXNzaW9uIG90aGVyd2lzZSA9IGVsZW1lbnQub3RoZXJ3aXNlICE9IG51bGwKICAgICAgICAgICAgPyBtYWtlTGl0ZXJhbChbZWxlbWVudC5vdGhlcndpc2VdKS5hY2NlcHQodGhpcykKICAgICAgICAgICAgOiBtYWtlTGl0ZXJhbChbXSk7CiAgICAgICAgcGFydHMuYWRkKG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgICAgICAgIGNvbmRpdGlvbiwgdGhlbiwgb3RoZXJ3aXNlLCBjb25zdCBEeW5hbWljVHlwZSgpKSk7CiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpcyBGb3JFbGVtZW50IHx8IGVsZW1lbnQgaXMgRm9ySW5FbGVtZW50KSB7CiAgICAgICAgLy8gUmVqZWN0ZWQgZWFybGllci4KICAgICAgICB1bmhhbmRsZWQoIiR7ZWxlbWVudC5ydW50aW1lVHlwZX0iLCAiX3RyYW5zbGF0ZUNvbnN0TGlzdE9yU2V0IiwKICAgICAgICAgICAgZWxlbWVudC5maWxlT2Zmc2V0LCBnZXRGaWxlVXJpKGVsZW1lbnQpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjdXJyZW50UGFydCA/Pz0gPEV4cHJlc3Npb24+W107CiAgICAgICAgY3VycmVudFBhcnQuYWRkKGVsZW1lbnQuYWNjZXB0KHRoaXMpKTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRQYXJ0ICE9IG51bGwpIHsKICAgICAgcGFydHMuYWRkKG1ha2VMaXRlcmFsKGN1cnJlbnRQYXJ0KSk7CiAgICB9CiAgICByZXR1cm4gaXNTZXQKICAgICAgICA/IG5ldyBTZXRDb25jYXRlbmF0aW9uKHBhcnRzLCB0eXBlQXJndW1lbnQ6IGVsZW1lbnRUeXBlKQogICAgICAgIDogbmV3IExpc3RDb25jYXRlbmF0aW9uKHBhcnRzLCB0eXBlQXJndW1lbnQ6IGVsZW1lbnRUeXBlKTsKICB9CgogIFRyZWVOb2RlIF90cmFuc2xhdGVDb25zdE1hcChNYXBMaXRlcmFsIG5vZGUpIHsKICAgIC8vIFRyYW5zbGF0ZSBlbnRyaWVzIGluIHBsYWNlIHVwIHRvIHRoZSBmaXJzdCBjb250cm9sLWZsb3cgZW50cnksIGlmIGFueS4KICAgIGludCBpID0gMDsKICAgIGZvciAoOyBpIDwgbm9kZS5lbnRyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChub2RlLmVudHJpZXNbaV0gaXMgQ29udHJvbEZsb3dNYXBFbnRyeSkgYnJlYWs7CiAgICAgIG5vZGUuZW50cmllc1tpXSA9IG5vZGUuZW50cmllc1tpXS5hY2NlcHQodGhpcykuLnBhcmVudCA9IG5vZGU7CiAgICB9CgogICAgLy8gSWYgdGhlcmUgd2VyZSBubyBjb250cm9sLWZsb3cgZW50cmllcyB3ZSBhcmUgZG9uZS4KICAgIGlmIChpID09IG5vZGUuZW50cmllcy5sZW5ndGgpIHJldHVybiBub2RlOwoKICAgIE1hcExpdGVyYWwgbWFrZUxpdGVyYWwoTGlzdDxNYXBFbnRyeT4gZW50cmllcykgewogICAgICByZXR1cm4gbmV3IE1hcExpdGVyYWwoZW50cmllcywKICAgICAgICAgIGtleVR5cGU6IG5vZGUua2V5VHlwZSwgdmFsdWVUeXBlOiBub2RlLnZhbHVlVHlwZSwgaXNDb25zdDogdHJ1ZSk7CiAgICB9CgogICAgLy8gQnVpbGQgYSBjb25jYXRlbmF0aW9uIG5vZGUuCiAgICBMaXN0PEV4cHJlc3Npb24+IHBhcnRzID0gW107CiAgICBMaXN0PE1hcEVudHJ5PiBjdXJyZW50UGFydCA9IGkgPiAwID8gbm9kZS5lbnRyaWVzLnN1Ymxpc3QoMCwgaSkgOiBudWxsOwoKICAgIGZvciAoOyBpIDwgbm9kZS5lbnRyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgIE1hcEVudHJ5IGVudHJ5ID0gbm9kZS5lbnRyaWVzW2ldOwogICAgICBpZiAoZW50cnkgaXMgU3ByZWFkTWFwRW50cnkpIHsKICAgICAgICBpZiAoY3VycmVudFBhcnQgIT0gbnVsbCkgewogICAgICAgICAgcGFydHMuYWRkKG1ha2VMaXRlcmFsKGN1cnJlbnRQYXJ0KSk7CiAgICAgICAgICBjdXJyZW50UGFydCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIEV4cHJlc3Npb24gc3ByZWFkRXhwcmVzc2lvbiA9IGVudHJ5LmV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwogICAgICAgIGlmIChlbnRyeS5pc051bGxBd2FyZSkgewogICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB0ZW1wID0KICAgICAgICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbihudWxsLCBpbml0aWFsaXplcjogc3ByZWFkRXhwcmVzc2lvbik7CiAgICAgICAgICBwYXJ0cy5hZGQobmV3IExldCgKICAgICAgICAgICAgICB0ZW1wLAogICAgICAgICAgICAgIG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgICAgICAgICAgICAgIG5ldyBNZXRob2RJbnZvY2F0aW9uKG5ldyBWYXJpYWJsZUdldCh0ZW1wKSwgbmV3IE5hbWUoJz09JyksCiAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJndW1lbnRzKFtuZXcgTnVsbExpdGVyYWwoKV0pKSwKICAgICAgICAgICAgICAgICAgbWFrZUxpdGVyYWwoW10pLAogICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQodGVtcCksCiAgICAgICAgICAgICAgICAgIGNvbnN0IER5bmFtaWNUeXBlKCkpKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBhcnRzLmFkZChzcHJlYWRFeHByZXNzaW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZW50cnkgaXMgSWZNYXBFbnRyeSkgewogICAgICAgIGlmIChjdXJyZW50UGFydCAhPSBudWxsKSB7CiAgICAgICAgICBwYXJ0cy5hZGQobWFrZUxpdGVyYWwoY3VycmVudFBhcnQpKTsKICAgICAgICAgIGN1cnJlbnRQYXJ0ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBlbnRyeS5jb25kaXRpb24uYWNjZXB0KHRoaXMpOwogICAgICAgIEV4cHJlc3Npb24gdGhlbiA9IG1ha2VMaXRlcmFsKFtlbnRyeS50aGVuXSkuYWNjZXB0KHRoaXMpOwogICAgICAgIEV4cHJlc3Npb24gb3RoZXJ3aXNlID0gZW50cnkub3RoZXJ3aXNlICE9IG51bGwKICAgICAgICAgICAgPyBtYWtlTGl0ZXJhbChbZW50cnkub3RoZXJ3aXNlXSkuYWNjZXB0KHRoaXMpCiAgICAgICAgICAgIDogbWFrZUxpdGVyYWwoW10pOwogICAgICAgIHBhcnRzLmFkZChuZXcgQ29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICAgICAgICBjb25kaXRpb24sIHRoZW4sIG90aGVyd2lzZSwgY29uc3QgRHluYW1pY1R5cGUoKSkpOwogICAgICB9IGVsc2UgaWYgKGVudHJ5IGlzIEZvck1hcEVudHJ5IHx8IGVudHJ5IGlzIEZvckluTWFwRW50cnkpIHsKICAgICAgICAvLyBSZWplY3RlZCBlYXJsaWVyLgogICAgICAgIHVuaGFuZGxlZCgiJHtlbnRyeS5ydW50aW1lVHlwZX0iLCAiX3RyYW5zbGF0ZUNvbnN0TWFwIiwKICAgICAgICAgICAgZW50cnkuZmlsZU9mZnNldCwgZ2V0RmlsZVVyaShlbnRyeSkpOwogICAgICB9IGVsc2UgewogICAgICAgIGN1cnJlbnRQYXJ0ID8/PSA8TWFwRW50cnk+W107CiAgICAgICAgY3VycmVudFBhcnQuYWRkKGVudHJ5LmFjY2VwdCh0aGlzKSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjdXJyZW50UGFydCAhPSBudWxsKSB7CiAgICAgIHBhcnRzLmFkZChtYWtlTGl0ZXJhbChjdXJyZW50UGFydCkpOwogICAgfQogICAgcmV0dXJuIG5ldyBNYXBDb25jYXRlbmF0aW9uKHBhcnRzLAogICAgICAgIGtleVR5cGU6IG5vZGUua2V5VHlwZSwgdmFsdWVUeXBlOiBub2RlLnZhbHVlVHlwZSk7CiAgfQp9CoKCAE5OPAElASIBIQkTFg8ZDx8SFRQdDxgWFRcNGxUaEhQaDg0VExUaFBMaFxIdFQE4AUQBNwEaCRwdFBYXFRMUFxgBNgE5AUQBMh0pGx4aIB4aHRsdATpLOxkEAS0mTFA4ThdLFVFOGEYWThhQASBIHUsPJzQ9BgE0KwFBIBFQEzEgREYaDTE6RxoGJTgiPwZGJ0gGAUoEAU86JEonRihHKkkNSAYEAT06OyEZIiUEAVA6KVEkJUcrBjQfJRg/LCEnBlEqBAFGRjBNGUs8RCkvLRQEAUpGICscIg0oE0sGTRlLI0cGIUMiKgQBTEY4RR4fNTUWJQYBHRgnSio1SD4hOh4oEzYlHTknCg1NPyMbMSYGRAEfI05CFREGGQQBDDAYURkGAUoXBAEMLhhRGAYBShYEAQwuGCcGAU4PKzlFBgE6LwE5Q04hQRglPyI2BisXSAYBSgQBTTojRiZCJ0MpRQ05BgQBGEo7IRkxEwQBUTojRx4jQyUGHkUdMxZHBh5GBAE/TjBJGUsqUScvLRQEAUNOICkcIg0oE0sGSRlLIUUGIT8gKAQBRU42RR4dNS0WJQYBGUodGCNEKjFFGkUcH0cXITgaRxwfSxkhOBwoEBI2JR1RFQoNSz8jGxpRHUgOFAYuUQEdI05CFREGGQQBJUgdSw8nND0GATQrATsTKDgpOQYBIyFKAScoJiMvHgpHIyVMHRQpTjsjKSoRJwopIy8eCj9EOTwfLT9FHUg2DygvCAYfKwYRQUMEATFODys5RQYBOi8BNSVMBgEjIUwBKyglIy8eCkUhJUwdFClOOyMpKhEnCigjLx4KPUI3Oh8tP0MdQDIPJi0IBh8rBic7BAIBPXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdHJhbnNmb3JtX2NvbGxlY3Rpb25zLmRhcnRHc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC90cmFuc2Zvcm1fc2V0X2xpdGVyYWxzLmRhcnSRsy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnRyYW5zZm9ybV9zZXRfbGl0ZXJhbHM7CgppbXBvcnQgJ2RhcnQ6Y29yZScgaGlkZSBNYXBFbnRyeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIENsYXNzLAogICAgICAgIENvbnN0cnVjdG9yLAogICAgICAgIENvbnN0cnVjdG9ySW52b2NhdGlvbiwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgTGV0LAogICAgICAgIExpYnJhcnksCiAgICAgICAgTWFwRW50cnksCiAgICAgICAgTWFwTGl0ZXJhbCwKICAgICAgICBNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIE5hbWUsCiAgICAgICAgTnVsbExpdGVyYWwsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFNldExpdGVyYWwsCiAgICAgICAgU3RhdGljSW52b2NhdGlvbiwKICAgICAgICBUcmVlTm9kZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uLAogICAgICAgIFZhcmlhYmxlR2V0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC92aXNpdG9yLmRhcnQnIHNob3cgVHJhbnNmb3JtZXI7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfbG9hZGVyLmRhcnQnIHNob3cgU291cmNlTG9hZGVyOwoKaW1wb3J0ICdyZWRpcmVjdGluZ19mYWN0b3J5X2JvZHkuZGFydCcgc2hvdyBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5OwoKLy8gVE9ETyhhc2tlc2MpOiBEZWxldGUgdGhpcyBjbGFzcyB3aGVuIGFsbCBiYWNrZW5kcyBzdXBwb3J0IHNldCBsaXRlcmFscy4KY2xhc3MgU2V0TGl0ZXJhbFRyYW5zZm9ybWVyIGV4dGVuZHMgVHJhbnNmb3JtZXIgewogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CiAgZmluYWwgRGFydFR5cGUgbnVsbFR5cGU7CiAgZmluYWwgUHJvY2VkdXJlIHNldEZhY3Rvcnk7CiAgZmluYWwgUHJvY2VkdXJlIGFkZE1ldGhvZDsKICBmaW5hbCBDb25zdHJ1Y3RvciB1bm1vZGlmaWFibGVTZXRDb25zdHJ1Y3RvcjsKICBmaW5hbCBib29sIHRyYW5zZm9ybUNvbnN0OwoKICBzdGF0aWMgUHJvY2VkdXJlIF9maW5kU2V0RmFjdG9yeShDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgICBQcm9jZWR1cmUgZmFjdG9yeSA9IGNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdTZXQnLCAnJyk7CiAgICBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5IGJvZHkgPSBmYWN0b3J5Py5mdW5jdGlvbj8uYm9keTsKICAgIHJldHVybiBib2R5Py50YXJnZXQ7CiAgfQoKICBzdGF0aWMgUHJvY2VkdXJlIF9maW5kQWRkTWV0aG9kKENvcmVUeXBlcyBjb3JlVHlwZXMpIHsKICAgIHJldHVybiBjb3JlVHlwZXMuaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnU2V0JywgJ2FkZCcpOwogIH0KCiAgc3RhdGljIENvbnN0cnVjdG9yIF9maW5kVW5tb2RpZmlhYmxlU2V0Q29uc3RydWN0b3IoU291cmNlTG9hZGVyIGxvYWRlcikgewogICAgLy8gV2Ugc2hvdWxkIG5vdCBnZW5lcmFsbHkgZGlnIGludG8gbGlicmFyaWVzIGxpa2UgdGhpcywgYW5kIHdlIHNob3VsZAogICAgLy8gYXZvaWQgZGVwZW5kZW5jaWVzIG9uIGxpYnJhcmllcyBvdGhlciB0aGFuIHRoZSBvbmVzIGluZGV4ZWQgYnkKICAgIC8vIENvcmVUeXBlcy4gVGhpcyBpcyBhIHRlbXBvcmFyeSBzb2x1dGlvbiB1bnRpbCBhbGwgYmFja2VuZHMgaGF2ZQogICAgLy8gaW1wbGVtZW50ZWQgc3VwcG9ydCBmb3Igc2V0IGxpdGVyYWxzLgogICAgVXJpIGNvbGxlY3Rpb25VcmkgPSBVcmkucGFyc2UoImRhcnQ6Y29sbGVjdGlvbiIpOwogICAgTGlicmFyeSBjb2xsZWN0aW9uTGlicmFyeSA9IGxvYWRlci5idWlsZGVyc1tjb2xsZWN0aW9uVXJpXS50YXJnZXQ7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbGxlY3Rpb25MaWJyYXJ5LmNsYXNzZXMubGVuZ3RoOyBpKyspIHsKICAgICAgQ2xhc3MgY2xhc3NOb2RlID0gY29sbGVjdGlvbkxpYnJhcnkuY2xhc3Nlc1tpXTsKICAgICAgaWYgKGNsYXNzTm9kZS5uYW1lID09ICJfVW5tb2RpZmlhYmxlU2V0IikgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sbGVjdGlvbkxpYnJhcnkuY2xhc3Nlcy5sZW5ndGg7IGorKykgewogICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBjbGFzc05vZGUuY29uc3RydWN0b3JzW2pdOwogICAgICAgICAgaWYgKGNvbnN0cnVjdG9yLm5hbWUubmFtZS5pc0VtcHR5KSB7CiAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3RvcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgU2V0TGl0ZXJhbFRyYW5zZm9ybWVyKFNvdXJjZUxvYWRlciBsb2FkZXIsIHt0aGlzLnRyYW5zZm9ybUNvbnN0OiB0cnVlfSkKICAgICAgOiBjb3JlVHlwZXMgPSBsb2FkZXIuY29yZVR5cGVzLAogICAgICAgIG51bGxUeXBlID0gbmV3IEludGVyZmFjZVR5cGUobG9hZGVyLmNvcmVUeXBlcy5udWxsQ2xhc3MsIFtdKSwKICAgICAgICBzZXRGYWN0b3J5ID0gX2ZpbmRTZXRGYWN0b3J5KGxvYWRlci5jb3JlVHlwZXMpLAogICAgICAgIGFkZE1ldGhvZCA9IF9maW5kQWRkTWV0aG9kKGxvYWRlci5jb3JlVHlwZXMpLAogICAgICAgIHVubW9kaWZpYWJsZVNldENvbnN0cnVjdG9yID0gX2ZpbmRVbm1vZGlmaWFibGVTZXRDb25zdHJ1Y3Rvcihsb2FkZXIpOwoKICBUcmVlTm9kZSB2aXNpdFNldExpdGVyYWwoU2V0TGl0ZXJhbCBub2RlKSB7CiAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIGlmICghdHJhbnNmb3JtQ29uc3QpIHJldHVybiBub2RlOwogICAgICBMaXN0PE1hcEVudHJ5PiBlbnRyaWVzID0gbmV3IExpc3Q8TWFwRW50cnk+KG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLy8gZXhwcmVzc2lvbl9pOiBudWxsCiAgICAgICAgRXhwcmVzc2lvbiBlbnRyeSA9IG5vZGUuZXhwcmVzc2lvbnNbaV0uYWNjZXB0KHRoaXMpOwogICAgICAgIGVudHJpZXNbaV0gPSBuZXcgTWFwRW50cnkoZW50cnksIG5ldyBOdWxsTGl0ZXJhbCgpKTsKICAgICAgfQogICAgICBFeHByZXNzaW9uIG1hcEV4cCA9IG5ldyBNYXBMaXRlcmFsKGVudHJpZXMsCiAgICAgICAgICBrZXlUeXBlOiBub2RlLnR5cGVBcmd1bWVudCwgdmFsdWVUeXBlOiBudWxsVHlwZSwgaXNDb25zdDogdHJ1ZSk7CiAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3JJbnZvY2F0aW9uKHVubW9kaWZpYWJsZVNldENvbnN0cnVjdG9yLAogICAgICAgICAgbmV3IEFyZ3VtZW50cyhbbWFwRXhwXSwgdHlwZXM6IFtub2RlLnR5cGVBcmd1bWVudF0pLAogICAgICAgICAgaXNDb25zdDogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBPdXRlcm1vc3QgZGVjbGFyYXRpb24gb2YgbGV0IGNoYWluOiBTZXQ8RT4gc2V0VmFyID0gbmV3IFNldDxFPigpOwogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHNldFZhciA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKAogICAgICAgICAgbmV3IFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICAgICAgc2V0RmFjdG9yeSwgbmV3IEFyZ3VtZW50cyhbXSwgdHlwZXM6IFtub2RlLnR5cGVBcmd1bWVudF0pKSwKICAgICAgICAgIHR5cGU6IG5ldyBJbnRlcmZhY2VUeXBlKGNvcmVUeXBlcy5zZXRDbGFzcywgW25vZGUudHlwZUFyZ3VtZW50XSkpOwogICAgICAvLyBJbm5lcm1vc3QgYm9keSBvZiBsZXQgY2hhaW46IHNldFZhcgogICAgICBFeHByZXNzaW9uIHNldEV4cCA9IG5ldyBWYXJpYWJsZUdldChzZXRWYXIpOwogICAgICBmb3IgKGludCBpID0gbm9kZS5leHByZXNzaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIC8vIGxldCBfID0gc2V0VmFyLmFkZChleHByZXNzaW9uKSBpbiByZXN0CiAgICAgICAgRXhwcmVzc2lvbiBlbnRyeSA9IG5vZGUuZXhwcmVzc2lvbnNbaV0uYWNjZXB0KHRoaXMpOwogICAgICAgIHNldEV4cCA9IG5ldyBMZXQoCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KHNldFZhciksCiAgICAgICAgICAgICAgICBuZXcgTmFtZSgiYWRkIiksCiAgICAgICAgICAgICAgICBuZXcgQXJndW1lbnRzKFtlbnRyeV0pLAogICAgICAgICAgICAgICAgYWRkTWV0aG9kKSksCiAgICAgICAgICAgIHNldEV4cCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBMZXQoc2V0VmFyLCBzZXRFeHApOwogICAgfQogIH0KfQp9AE5OPAEmASIBIQkTDxUfEhQXDRESFBoOFRMUGhIdFQE4ATcBOQFEAUsyHRseHTAdATpLOxkEATlBBAFMS0ZHLTZHQTYyRT8vIAwKCAYRBAFKJkY4Nk4BLhgoTDoePT0IMktDPxoNS0UgSk0tMz8yPRpDKSEoHRUIJgYEAgE+cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC90cmFuc2Zvcm1fc2V0X2xpdGVyYWxzLmRhcnREc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci9jbGFzc19tZW1iZXJfcGFyc2VyLmRhcnSHpi8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnBhcnNlci5jbGFzc19tZW1iZXJfcGFyc2VyOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ2Vycm9yX2RlbGVnYXRpb25fbGlzdGVuZXIuZGFydCcgc2hvdyBFcnJvckRlbGVnYXRpb25MaXN0ZW5lcjsKCmltcG9ydCAnbGlzdGVuZXIuZGFydCcgc2hvdyBMaXN0ZW5lcjsKCmltcG9ydCAncGFyc2VyLmRhcnQnIHNob3cgUGFyc2VyOwoKLy8vIFBhcnNlciBzaW1pbGFyIHRvIFtUb3BMZXZlbFBhcnNlcl0gYnV0IGFsc28gcGFyc2VzIGNsYXNzIG1lbWJlcnMgKGV4Y2x1ZGluZwovLy8gdGhlaXIgYm9kaWVzKS4KY2xhc3MgQ2xhc3NNZW1iZXJQYXJzZXIgZXh0ZW5kcyBQYXJzZXIgewogIFBhcnNlciBza2lwUGFyc2VyOwoKICBDbGFzc01lbWJlclBhcnNlcihMaXN0ZW5lciBsaXN0ZW5lcikgOiBzdXBlcihsaXN0ZW5lcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIHNraXBFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlSWRlbnRpZmllckV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiB0b2tlbi5uZXh0OwogIH0KCiAgVG9rZW4gc2tpcEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIC8vIFRPRE8oYXNrZXNjKTogV2UgbGlzdGVuIHRvIGVycm9ycyBvY2N1cnJpbmcgZHVyaW5nIGV4cHJlc3Npb24gcGFyc2luZywKICAgIC8vIHNpbmNlIHRoZSBwYXJzZXIgbWF5IHJld3JpdGUgdGhlIHRva2VuIHN0cmVhbSBzdWNoIHRoYXQgdGhlIGVycm9yIGlzCiAgICAvLyBub3QgdHJpZ2dlcmVkIGR1cmluZyB0aGUgc2Vjb25kIHBhcnNlLgogICAgLy8gV2hlbiB0aGUgcGFyc2VyIHN1cHBvcnRzIG5vdCBkb2luZyB0b2tlbiBzdHJlYW0gcmV3cml0aW5nLCB1c2UgdGhhdAogICAgLy8gZmVhdHVyZSB0b2dldGhlciB3aXRoIGEgbm8tb3AgbGlzdGVuZXIgaW5zdGVhZC4KICAgIHNraXBQYXJzZXIgPz89IG5ldyBQYXJzZXIobmV3IEVycm9yRGVsZWdhdGlvbkxpc3RlbmVyKGxpc3RlbmVyKSk7CiAgICBza2lwUGFyc2VyLm1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgIHNraXBQYXJzZXIuYXN5bmNTdGF0ZSA9IGFzeW5jU3RhdGU7CiAgICBza2lwUGFyc2VyLmxvb3BTdGF0ZSA9IGxvb3BTdGF0ZTsKICAgIHJldHVybiBza2lwUGFyc2VyLnBhcnNlRXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICAvLyBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGZvciB0d28gcmVhc29uczoKICAvLyAxLiBBdm9pZCBnZW5lcmF0aW5nIGV2ZW50cyBmb3IgYXJndW1lbnRzLgogIC8vIDIuIEF2b2lkIGNhbGxpbmcgc2tpcCBleHByZXNzaW9uIGZvciBlYWNoIGFyZ3VtZW50ICh3aGljaCBkb2Vzbid0IHdvcmspLgogIFRva2VuIHBhcnNlQXJndW1lbnRzT3B0KFRva2VuIHRva2VuKSA9PiBza2lwQXJndW1lbnRzT3B0KHRva2VuKTsKCiAgVG9rZW4gcGFyc2VGdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4sIGJvb2wgaXNFeHByZXNzaW9uLCBib29sIGFsbG93QWJzdHJhY3QpIHsKICAgIHJldHVybiBza2lwRnVuY3Rpb25Cb2R5KHRva2VuLCBpc0V4cHJlc3Npb24sIGFsbG93QWJzdHJhY3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VJbnZhbGlkQmxvY2soVG9rZW4gdG9rZW4pID0+IHNraXBCbG9jayh0b2tlbik7Cn0KOgBOTjwBKgEuAUYBJgEiAVATKRUBOgEMJyIEAQwxFwQBJk5MLks3RkooJi4EATAvTkMBUEEEAQw8AgE7cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9jbGFzc19tZW1iZXJfcGFyc2VyLmRhcnQ+c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NvdXJjZS9kaWV0X2xpc3RlbmVyLmRhcnTAAHY9Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZGlldF9saXN0ZW5lcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXN5bmNNYXJrZXIsCiAgICAgICAgRXhwcmVzc2lvbiwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIExpYnJhcnksCiAgICAgICAgTGlicmFyeURlcGVuZGVuY3ksCiAgICAgICAgTGlicmFyeVBhcnQsCiAgICAgICAgVHJlZU5vZGUsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnLi4vYnVpbGRlci9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9jb25zdGFudF9jb250ZXh0LmRhcnQnIHNob3cgQ29uc3RhbnRDb250ZXh0OwoKaW1wb3J0ICcuLi9jcmFzaC5kYXJ0JyBzaG93IENyYXNoOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIENvZGUsCiAgICAgICAgTG9jYXRlZE1lc3NhZ2UsCiAgICAgICAgTWVzc2FnZSwKICAgICAgICBtZXNzYWdlRXhwZWN0ZWRCbG9ja1RvU2tpcCwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbU5vdEZvdW5kOwoKaW1wb3J0ICcuLi9pZ25vcmVkX3BhcnNlcl9lcnJvcnMuZGFydCcgc2hvdyBpc0lnbm9yZWRQYXJzZXJFcnJvcjsKCmltcG9ydCAnLi4va2VybmVsL2JvZHlfYnVpbGRlci5kYXJ0JyBzaG93IEJvZHlCdWlsZGVyOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciwgVHlwZUFsaWFzQnVpbGRlciwgVHlwZUJ1aWxkZXI7CgppbXBvcnQgJy4uL3BhcnNlci5kYXJ0JyBzaG93IEFzc2VydCwgTWVtYmVyS2luZCwgUGFyc2VyLCBvcHRpb25hbDsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcKICAgIHNob3cgRGVidWdBYm9ydCwgaW50ZXJuYWxQcm9ibGVtLCB1bmV4cGVjdGVkLCB1bmhhbmRsZWQ7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0JyBzaG93IFR5cGVJbmZlcmVuY2VFbmdpbmU7CgppbXBvcnQgJ3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnc3RhY2tfbGlzdGVuZXIuZGFydCcKICAgIHNob3cgRml4ZWROdWxsYWJsZUxpc3QsIE51bGxWYWx1ZSwgUGFyc2VyUmVjb3ZlcnksIFN0YWNrTGlzdGVuZXI7CgppbXBvcnQgJy4uL3NvdXJjZS92YWx1ZV9raW5kcy5kYXJ0JzsKCmltcG9ydCAnLi4vcXVvdGUuZGFydCcgc2hvdyB1bmVzY2FwZVN0cmluZzsKCmNsYXNzIERpZXRMaXN0ZW5lciBleHRlbmRzIFN0YWNrTGlzdGVuZXIgewogIGZpbmFsIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnk7CgogIGZpbmFsIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeTsKCiAgZmluYWwgQ29yZVR5cGVzIGNvcmVUeXBlczsKCiAgZmluYWwgYm9vbCBlbmFibGVOYXRpdmU7CgogIGZpbmFsIGJvb2wgc3RyaW5nRXhwZWN0ZWRBZnRlck5hdGl2ZTsKCiAgZmluYWwgVHlwZUluZmVyZW5jZUVuZ2luZSB0eXBlSW5mZXJlbmNlRW5naW5lOwoKICBpbnQgaW1wb3J0RXhwb3J0RGlyZWN0aXZlSW5kZXggPSAwOwogIGludCBwYXJ0RGlyZWN0aXZlSW5kZXggPSAwOwoKICBDbGFzc0J1aWxkZXIgY3VycmVudENsYXNzOwoKICBib29sIGN1cnJlbnRDbGFzc0lzUGFyc2VyUmVjb3ZlcnkgPSBmYWxzZTsKCiAgLy8vIENvdW50ZXIgdXNlZCBmb3IgbmFtaW5nIHVubmFtZWQgZXh0ZW5zaW9uIGRlY2xhcmF0aW9ucy4KICBpbnQgdW5uYW1lZEV4dGVuc2lvbkNvdW50ZXIgPSAwOwoKICAvLy8gRm9yIHRvcC1sZXZlbCBkZWNsYXJhdGlvbnMsIHRoaXMgaXMgdGhlIGxpYnJhcnkgc2NvcGUuIEZvciBjbGFzcyBtZW1iZXJzLAogIC8vLyB0aGlzIGlzIHRoZSBpbnN0YW5jZSBzY29wZSBvZiBbY3VycmVudENsYXNzXS4KICBTY29wZSBtZW1iZXJTY29wZTsKCiAgQG92ZXJyaWRlCiAgVXJpIHVyaTsKCiAgRGlldExpc3RlbmVyKFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnksIHRoaXMuaGllcmFyY2h5LCB0aGlzLmNvcmVUeXBlcywKICAgICAgdGhpcy50eXBlSW5mZXJlbmNlRW5naW5lKQogICAgICA6IGxpYnJhcnkgPSBsaWJyYXJ5LAogICAgICAgIHVyaSA9IGxpYnJhcnkuZmlsZVVyaSwKICAgICAgICBtZW1iZXJTY29wZSA9IGxpYnJhcnkuc2NvcGUsCiAgICAgICAgZW5hYmxlTmF0aXZlID0KICAgICAgICAgICAgbGlicmFyeS5sb2FkZXIudGFyZ2V0LmJhY2tlbmRUYXJnZXQuZW5hYmxlTmF0aXZlKGxpYnJhcnkudXJpKSwKICAgICAgICBzdHJpbmdFeHBlY3RlZEFmdGVyTmF0aXZlID0KICAgICAgICAgICAgbGlicmFyeS5sb2FkZXIudGFyZ2V0LmJhY2tlbmRUYXJnZXQubmF0aXZlRXh0ZW5zaW9uRXhwZWN0c1N0cmluZzsKCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNZXRhZGF0YVN0YXIoaW50IGNvdW50KSB7CiAgICBhc3NlcnQoY2hlY2tTdGF0ZShudWxsLCByZXBlYXRlZEtpbmRzKFZhbHVlS2luZC5Ub2tlbiwgY291bnQpKSk7CiAgICBkZWJ1Z0V2ZW50KCJNZXRhZGF0YVN0YXIiKTsKICAgIGlmIChjb3VudCA+IDApIHsKICAgICAgZGlzY2FyZChjb3VudCAtIDEpOwogICAgICBwdXNoKHBvcChOdWxsVmFsdWUuVG9rZW4pID8/IE51bGxWYWx1ZS5Ub2tlbik7CiAgICB9IGVsc2UgewogICAgICBwdXNoKE51bGxWYWx1ZS5Ub2tlbik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1ldGFkYXRhKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHBlcmlvZEJlZm9yZU5hbWUsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJNZXRhZGF0YSIpOwogICAgZGlzY2FyZChwZXJpb2RCZWZvcmVOYW1lID09IG51bGwgPyAxIDogMik7CiAgICBwdXNoKGJlZ2luVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRQYXJ0T2YoCiAgICAgIFRva2VuIHBhcnRLZXl3b3JkLCBUb2tlbiBvZktleXdvcmQsIFRva2VuIHNlbWljb2xvbiwgYm9vbCBoYXNOYW1lKSB7CiAgICBkZWJ1Z0V2ZW50KCJQYXJ0T2YiKTsKICAgIGlmIChoYXNOYW1lKSBkaXNjYXJkKDEpOwogICAgZGlzY2FyZCgxKTsgLy8gTWV0YWRhdGEuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRUb3BMZXZlbERlY2xhcmF0aW9uKFRva2VuIGJlZ2luVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkludmFsaWRUb3BMZXZlbERlY2xhcmF0aW9uIik7CiAgICBwb3AoKTsgLy8gbWV0YWRhdGEgc3RhcgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0FyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9Bcmd1bWVudHMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9UeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb1R5cGVBcmd1bWVudHMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Db25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9Db25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb1R5cGUoVG9rZW4gbGFzdENvbnN1bWVkKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb1R5cGUiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVHlwZShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBxdWVzdGlvbk1hcmspIHsKICAgIGRlYnVnRXZlbnQoIlR5cGUiKTsKICAgIGRpc2NhcmQoMSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVMaXN0KGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiVHlwZUxpc3QiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmFtZWRNaXhpbkFwcGxpY2F0aW9uV2l0aENsYXVzZShUb2tlbiB3aXRoS2V5d29yZCkgewogICAgZGVidWdFdmVudCgiTmFtZWRNaXhpbkFwcGxpY2F0aW9uV2l0aENsYXVzZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc1dpdGhDbGF1c2UoVG9rZW4gd2l0aEtleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzV2l0aENsYXVzZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc05vV2l0aENsYXVzZSgpIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzTm9XaXRoQ2xhdXNlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiVHlwZUFyZ3VtZW50cyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkVHlwZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiSW52YWxpZFR5cGVBcmd1bWVudHMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRmllbGRJbml0aWFsaXplcihUb2tlbiBhc3NpZ25tZW50T3BlcmF0b3IsIFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGaWVsZEluaXRpYWxpemVyIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRmllbGRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9GaWVsZEluaXRpYWxpemVyIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVHlwZVZhcmlhYmxlcyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9UeXBlVmFyaWFibGVzIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvcm1hbFBhcmFtZXRlcnMoCiAgICAgIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgZGVidWdFdmVudCgiRm9ybWFsUGFyYW1ldGVycyIpOwogICAgYXNzZXJ0KGNvdW50ID09IDApOyAvLyBDb3VudCBpcyBhbHdheXMgMCBhcyB0aGUgZGlldCBwYXJzZXIgc2tpcHMgZm9ybWFscy4KICAgIGlmIChraW5kICE9IE1lbWJlcktpbmQuR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGUgJiYKICAgICAgICBpZGVudGljYWwocGVlaygpLCAiLSIpICYmCiAgICAgICAgaWRlbnRpY2FsKGJlZ2luVG9rZW4ubmV4dCwgZW5kVG9rZW4pKSB7CiAgICAgIHBvcCgpOwogICAgICBwdXNoKCJ1bmFyeS0iKTsKICAgIH0KICAgIHB1c2goYmVnaW5Ub2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0Zvcm1hbFBhcmFtZXRlcnMiKTsKICAgIGlmIChpZGVudGljYWwocGVlaygpLCAiLSIpKSB7CiAgICAgIHBvcCgpOwogICAgICBwdXNoKCJ1bmFyeS0iKTsKICAgIH0KICAgIHB1c2godG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGdW5jdGlvblR5cGUoVG9rZW4gZnVuY3Rpb25Ub2tlbiwgVG9rZW4gcXVlc3Rpb25NYXJrKSB7CiAgICBkZWJ1Z0V2ZW50KCJGdW5jdGlvblR5cGUiKTsKICAgIGRpc2NhcmQoMSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uVHlwZUFsaWFzKAogICAgICBUb2tlbiB0eXBlZGVmS2V5d29yZCwgVG9rZW4gZXF1YWxzLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiRnVuY3Rpb25UeXBlQWxpYXMiKTsKCiAgICBpZiAoZXF1YWxzID09IG51bGwpIHBvcCgpOyAvLyBlbmRUb2tlbgogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIFRva2VuIG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KHR5cGVkZWZLZXl3b3JkLmNoYXJPZmZzZXQpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHJldHVybjsKCiAgICBEZWNsYXJhdGlvbiB0eXBlZGVmQnVpbGRlciA9IGxvb2t1cEJ1aWxkZXIodHlwZWRlZktleXdvcmQsIG51bGwsIG5hbWUpOwogICAgcGFyc2VNZXRhZGF0YSh0eXBlZGVmQnVpbGRlciwgbWV0YWRhdGEsIHR5cGVkZWZCdWlsZGVyLnRhcmdldCk7CiAgICBpZiAodHlwZWRlZkJ1aWxkZXIgaXMgVHlwZUFsaWFzQnVpbGRlcikgewogICAgICBUeXBlQnVpbGRlciB0eXBlID0gdHlwZWRlZkJ1aWxkZXIudHlwZTsKICAgICAgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9IHR5cGUuZm9ybWFsczsKICAgICAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvcm1hbHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgPSBmb3JtYWxzW2ldOwogICAgICAgICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEgPSBmb3JtYWwubWV0YWRhdGE7CiAgICAgICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsICYmIG1ldGFkYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAvLyBbcGFyc2VNZXRhZGF0YV0gaXMgdXNpbmcgW1BhcnNlci5wYXJzZU1ldGFkYXRhU3Rhcl0gdW5kZXIgdGhlCiAgICAgICAgICAgICAgLy8gaG9vZCwgc28gd2Ugb25seSBuZWVkIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGFubm90YXRpb24uCiAgICAgICAgICAgICAgVG9rZW4gbWV0YWRhdGFUb2tlbiA9IHRva2VuRm9yT2Zmc2V0KAogICAgICAgICAgICAgICAgICB0eXBlZGVmS2V5d29yZCwgZW5kVG9rZW4sIG1ldGFkYXRhWzBdLmNoYXJPZmZzZXQpOwogICAgICAgICAgICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPQogICAgICAgICAgICAgICAgICBwYXJzZU1ldGFkYXRhKHR5cGVkZWZCdWlsZGVyLCBtZXRhZGF0YVRva2VuLCBudWxsKTsKICAgICAgICAgICAgICBpZiAoZm9ybWFsLmlzUG9zaXRpb25hbCkgewogICAgICAgICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgPQogICAgICAgICAgICAgICAgICAgIHR5cGVkZWZCdWlsZGVyLnRhcmdldC5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgICAgICAgICAgIGZvciAoRXhwcmVzc2lvbiBhbm5vdGF0aW9uIGluIGFubm90YXRpb25zKSB7CiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci5hZGRBbm5vdGF0aW9uKGFubm90YXRpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gbmFtZWQKICAgICAgICAgICAgICAgICAgICBpbiB0eXBlZGVmQnVpbGRlci50YXJnZXQubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgICAgICAgIGlmIChuYW1lZC5uYW1lID09IGZvcm1hbC5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChFeHByZXNzaW9uIGFubm90YXRpb24gaW4gYW5ub3RhdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgIG5hbWVkLmFkZEFubm90YXRpb24oYW5ub3RhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKHR5cGVkZWZCdWlsZGVyICE9IG51bGwpIHsKICAgICAgdW5oYW5kbGVkKCIke3R5cGVkZWZCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSIsICJlbmRGdW5jdGlvblR5cGVBbGlhcyIsCiAgICAgICAgICB0eXBlZGVmS2V5d29yZC5jaGFyT2Zmc2V0LCB1cmkpOwogICAgfQoKICAgIGNoZWNrRW1wdHkodHlwZWRlZktleXdvcmQuY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZpZWxkcyhUb2tlbiBzdGF0aWNUb2tlbiwgVG9rZW4gY292YXJpYW50VG9rZW4sIFRva2VuIGxhdGVUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGaWVsZHMiKTsKICAgIGJ1aWxkRmllbGRzKGNvdW50LCBiZWdpblRva2VuLCBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUFzeW5jTW9kaWZpZXIoVG9rZW4gYXN5bmNUb2tlbiwgVG9rZW4gc3RhcnRUb2tlbikgewogICAgZGVidWdFdmVudCgiQXN5bmNNb2RpZmllciIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUb3BMZXZlbE1ldGhvZChUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBnZXRPclNldCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlRvcExldmVsTWV0aG9kIik7CiAgICBUb2tlbiBib2R5VG9rZW4gPSBwb3AoKTsKICAgIE9iamVjdCBuYW1lID0gcG9wKCk7CiAgICBUb2tlbiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eShiZWdpblRva2VuLmNoYXJPZmZzZXQpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHJldHVybjsKCiAgICBmaW5hbCBTdGFja0xpc3RlbmVyIGxpc3RlbmVyID0KICAgICAgICBjcmVhdGVGdW5jdGlvbkxpc3RlbmVyKGxvb2t1cEJ1aWxkZXIoYmVnaW5Ub2tlbiwgZ2V0T3JTZXQsIG5hbWUpKTsKICAgIGJ1aWxkRnVuY3Rpb25Cb2R5KGxpc3RlbmVyLCBib2R5VG9rZW4sIG1ldGFkYXRhLCBNZW1iZXJLaW5kLlRvcExldmVsTWV0aG9kKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9GdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5vRnVuY3Rpb25Cb2R5Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFRvcExldmVsRmllbGRzKAogICAgICBUb2tlbiBzdGF0aWNUb2tlbiwKICAgICAgVG9rZW4gY292YXJpYW50VG9rZW4sCiAgICAgIFRva2VuIGxhdGVUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LAogICAgICBpbnQgY291bnQsCiAgICAgIFRva2VuIGJlZ2luVG9rZW4sCiAgICAgIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJUb3BMZXZlbEZpZWxkcyIpOwogICAgYnVpbGRGaWVsZHMoY291bnQsIGJlZ2luVG9rZW4sIHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVWb2lkS2V5d29yZChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiVm9pZEtleXdvcmQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Jbml0aWFsaXplcnMoKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0luaXRpYWxpemVycyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJbml0aWFsaXplcnMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiSW5pdGlhbGl6ZXJzIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVF1YWxpZmllZChUb2tlbiBwZXJpb2QpIHsKICAgIGRlYnVnRXZlbnQoImhhbmRsZVF1YWxpZmllZCIpOwogICAgT2JqZWN0IHN1ZmZpeCA9IHBvcCgpOwogICAgT2JqZWN0IHByZWZpeCA9IHBvcCgpOwogICAgaWYgKHByZWZpeCBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKHByZWZpeCk7CiAgICB9IGVsc2UgaWYgKHN1ZmZpeCBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKHN1ZmZpeCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoaWRlbnRpY2FsKHN1ZmZpeCwgcGVyaW9kLm5leHQubGV4ZW1lKSk7CiAgICAgIHB1c2gobmV3IFF1YWxpZmllZE5hbWUocHJlZml4LCBwZXJpb2QubmV4dCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRMaWJyYXJ5TmFtZShUb2tlbiBsaWJyYXJ5S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRMaWJyYXJ5TmFtZSIpOwogICAgcG9wKCk7IC8vIE5hbWUuCiAgICBwb3AoKTsgLy8gQW5ub3RhdGlvbnMuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTGl0ZXJhbFN0cmluZyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5MaXRlcmFsU3RyaW5nIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN0cmluZ1BhcnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlN0cmluZ1BhcnQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTGl0ZXJhbFN0cmluZyhpbnQgaW50ZXJwb2xhdGlvbkNvdW50LCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiZW5kTGl0ZXJhbFN0cmluZyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVDbGF1c2UoVG9rZW4gbmF0aXZlVG9rZW4sIGJvb2wgaGFzTmFtZSkgewogICAgZGVidWdFdmVudCgiTmF0aXZlQ2xhdXNlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVNjcmlwdChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiU2NyaXB0Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN0cmluZ0p1eHRhcG9zaXRpb24oaW50IGxpdGVyYWxDb3VudCkgewogICAgZGVidWdFdmVudCgiU3RyaW5nSnV4dGFwb3NpdGlvbiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVEb3R0ZWROYW1lKGludCBjb3VudCwgVG9rZW4gZmlyc3RJZGVudGlmaWVyKSB7CiAgICBkZWJ1Z0V2ZW50KCJEb3R0ZWROYW1lIik7CiAgICBkaXNjYXJkKGNvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29uZGl0aW9uYWxVcmkoVG9rZW4gaWZLZXl3b3JkLCBUb2tlbiBsZWZ0UGFyZW4sIFRva2VuIGVxdWFsU2lnbikgewogICAgZGVidWdFdmVudCgiQ29uZGl0aW9uYWxVcmkiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29uZGl0aW9uYWxVcmlzKGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiQ29uZGl0aW9uYWxVcmlzIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU9wZXJhdG9yTmFtZShUb2tlbiBvcGVyYXRvcktleXdvcmQsIFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJPcGVyYXRvck5hbWUiKTsKICAgIHB1c2godG9rZW4uc3RyaW5nVmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkT3BlcmF0b3JOYW1lKFRva2VuIG9wZXJhdG9yS2V5d29yZCwgVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkludmFsaWRPcGVyYXRvck5hbWUiKTsKICAgIHB1c2goJ2ludmFsaWQnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSWRlbnRpZmllckxpc3QoaW50IGNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJJZGVudGlmaWVyTGlzdCIpOwogICAgZGlzY2FyZChjb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFNob3coVG9rZW4gc2hvd0tleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoIlNob3ciKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSGlkZShUb2tlbiBoaWRlS2V5d29yZCkgewogICAgZGVidWdFdmVudCgiSGlkZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb21iaW5hdG9ycyhpbnQgY291bnQpIHsKICAgIGRlYnVnRXZlbnQoIkNvbWJpbmF0b3JzIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUltcG9ydFByZWZpeChUb2tlbiBkZWZlcnJlZEtleXdvcmQsIFRva2VuIGFzS2V5d29yZCkgewogICAgZGVidWdFdmVudCgiSW1wb3J0UHJlZml4Iik7CiAgICBwdXNoSWZOdWxsKGFzS2V5d29yZCwgTnVsbFZhbHVlLlByZWZpeCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEltcG9ydChUb2tlbiBpbXBvcnRLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIkltcG9ydCIpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoTnVsbFZhbHVlLlByZWZpeCk7CgogICAgVG9rZW4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGNoZWNrRW1wdHkoaW1wb3J0S2V5d29yZC5jaGFyT2Zmc2V0KTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSByZXR1cm47CgogICAgLy8gTmF0aXZlIGltcG9ydHMgbXVzdCBiZSBza2lwcGVkIGJlY2F1c2UgdGhleSBhcmVuJ3QgYXNzaWduZWQgY29ycmVzcG9uZGluZwogICAgLy8gTGlicmFyeURlcGVuZGVuY3kgbm9kZXMuCiAgICBUb2tlbiBpbXBvcnRVcmlUb2tlbiA9IGltcG9ydEtleXdvcmQubmV4dDsKICAgIFN0cmluZyBpbXBvcnRVcmkgPQogICAgICAgIHVuZXNjYXBlU3RyaW5nKGltcG9ydFVyaVRva2VuLmxleGVtZSwgaW1wb3J0VXJpVG9rZW4sIHRoaXMpOwogICAgaWYgKGltcG9ydFVyaS5zdGFydHNXaXRoKCJkYXJ0LWV4dDoiKSkgcmV0dXJuOwoKICAgIExpYnJhcnkgbGlicmFyeU5vZGUgPSBsaWJyYXJ5LnRhcmdldDsKICAgIExpYnJhcnlEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPQogICAgICAgIGxpYnJhcnlOb2RlLmRlcGVuZGVuY2llc1tpbXBvcnRFeHBvcnREaXJlY3RpdmVJbmRleCsrXTsKICAgIHBhcnNlTWV0YWRhdGEobGlicmFyeSwgbWV0YWRhdGEsIGRlcGVuZGVuY3kpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVSZWNvdmVySW1wb3J0KFRva2VuIHNlbWljb2xvbikgewogICAgcG9wKE51bGxWYWx1ZS5QcmVmaXgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFeHBvcnQoVG9rZW4gZXhwb3J0S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJFeHBvcnQiKTsKCiAgICBUb2tlbiBtZXRhZGF0YSA9IHBvcCgpOwogICAgTGlicmFyeSBsaWJyYXJ5Tm9kZSA9IGxpYnJhcnkudGFyZ2V0OwogICAgTGlicmFyeURlcGVuZGVuY3kgZGVwZW5kZW5jeSA9CiAgICAgICAgbGlicmFyeU5vZGUuZGVwZW5kZW5jaWVzW2ltcG9ydEV4cG9ydERpcmVjdGl2ZUluZGV4KytdOwogICAgcGFyc2VNZXRhZGF0YShsaWJyYXJ5LCBtZXRhZGF0YSwgZGVwZW5kZW5jeSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFBhcnQoVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiUGFydCIpOwoKICAgIFRva2VuIG1ldGFkYXRhID0gcG9wKCk7CiAgICBMaWJyYXJ5IGxpYnJhcnlOb2RlID0gbGlicmFyeS50YXJnZXQ7CiAgICBpZiAobGlicmFyeU5vZGUucGFydHMubGVuZ3RoID4gcGFydERpcmVjdGl2ZUluZGV4KSB7CiAgICAgIC8vIElmIHBhcnREaXJlY3RpdmVJbmRleCA+PSBsaWJyYXJ5Tm9kZS5wYXJ0cy5sZW5ndGggd2UgYXJlIGluIGEgY2FzZSBvZgogICAgICAvLyBvbiBwYXJ0IGhhdmluZyBvdGhlciBwYXJ0cy4gQW4gZXJyb3IgaGFzIGFscmVhZHkgYmVlbiBpc3N1ZWQuCiAgICAgIC8vIERvbid0IHRyeSB0byBwYXJzZSBtZXRhZGF0YSBpbnRvIG90aGVyIHBhcnRzIHRoYXQgaGF2ZSBub3RoaW5nIHRvIGRvCiAgICAgIC8vIHdpdGggdGhlIG9uZSB0aGlzIGtleXdvcmQgaXMgdGFsa2luZyBhYm91dC4KICAgICAgTGlicmFyeVBhcnQgcGFydCA9IGxpYnJhcnlOb2RlLnBhcnRzW3BhcnREaXJlY3RpdmVJbmRleCsrXTsKICAgICAgcGFyc2VNZXRhZGF0YShsaWJyYXJ5LCBtZXRhZGF0YSwgcGFydCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVHlwZVZhcmlhYmxlKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpblR5cGVWYXJpYWJsZSIpOwogICAgZGlzY2FyZCgyKTsgLy8gTmFtZSBhbmQgbWV0YWRhdGEuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVWYXJpYWJsZShUb2tlbiB0b2tlbiwgaW50IGluZGV4LCBUb2tlbiBleHRlbmRzT3JTdXBlcikgewogICAgZGVidWdFdmVudCgiZW5kVHlwZVZhcmlhYmxlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVWYXJpYWJsZXMoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlR5cGVWYXJpYWJsZXMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29uc3RydWN0b3JSZWZlcmVuY2UoCiAgICAgIFRva2VuIHN0YXJ0LCBUb2tlbiBwZXJpb2RCZWZvcmVOYW1lLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiQ29uc3RydWN0b3JSZWZlcmVuY2UiKTsKICAgIHBvcElmTm90TnVsbChwZXJpb2RCZWZvcmVOYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRmFjdG9yeU1ldGhvZCgKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZmFjdG9yeUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGYWN0b3J5TWV0aG9kIik7CiAgICBUb2tlbiBib2R5VG9rZW4gPSBwb3AoKTsKICAgIE9iamVjdCBuYW1lID0gcG9wKCk7CiAgICBUb2tlbiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eShiZWdpblRva2VuLmNoYXJPZmZzZXQpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkgfHwgY3VycmVudENsYXNzSXNQYXJzZXJSZWNvdmVyeSkgcmV0dXJuOwoKICAgIEZ1bmN0aW9uQnVpbGRlciBidWlsZGVyID0gbG9va3VwQ29uc3RydWN0b3IoYmVnaW5Ub2tlbiwgbmFtZSk7CiAgICBpZiAoYm9keVRva2VuID09IG51bGwgfHwgb3B0aW9uYWwoIj0iLCBib2R5VG9rZW4uZW5kR3JvdXAubmV4dCkpIHsKICAgICAgYnVpbGRSZWRpcmVjdGluZ0ZhY3RvcnlNZXRob2QoCiAgICAgICAgICBib2R5VG9rZW4sIGJ1aWxkZXIsIE1lbWJlcktpbmQuRmFjdG9yeSwgbWV0YWRhdGEpOwogICAgfSBlbHNlIHsKICAgICAgYnVpbGRGdW5jdGlvbkJvZHkoY3JlYXRlRnVuY3Rpb25MaXN0ZW5lcihidWlsZGVyKSwgYm9keVRva2VuLCBtZXRhZGF0YSwKICAgICAgICAgIE1lbWJlcktpbmQuRmFjdG9yeSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlJlZGlyZWN0aW5nRmFjdG9yeUJvZHkiKTsKICAgIGRpc2NhcmQoMSk7IC8vIENvbnN0cnVjdG9yUmVmZXJlbmNlLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHkoVG9rZW4gbmF0aXZlVG9rZW4sIFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiTmF0aXZlRnVuY3Rpb25Cb2R5Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keUlnbm9yZWQoVG9rZW4gbmF0aXZlVG9rZW4sIFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiTmF0aXZlRnVuY3Rpb25Cb2R5SWdub3JlZCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIk5hdGl2ZUZ1bmN0aW9uQm9keVNraXBwZWQiKTsKICAgIGlmICghZW5hYmxlTmF0aXZlKSB7CiAgICAgIHN1cGVyLmhhbmRsZVJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBtZXNzYWdlRXhwZWN0ZWRCbG9ja1RvU2tpcCwgbmF0aXZlVG9rZW4sIG5hdGl2ZVRva2VuKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWV0aG9kKFRva2VuIGdldE9yU2V0LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBiZWdpblBhcmFtLAogICAgICBUb2tlbiBiZWdpbkluaXRpYWxpemVycywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk1ldGhvZCIpOwogICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIHJlbW92aW5nIHRoZSBiZWdpblBhcmFtIHBhcmFtZXRlcgogICAgLy8gYW5kIHVzaW5nIGJvZHlUb2tlbiwgYnV0IHB1c2hpbmcgYSBOdWxsVmFsdWUgb24gdGhlIHN0YWNrCiAgICAvLyBpbiBoYW5kbGVOb0Zvcm1hbFBhcmFtZXRlcnMgcmF0aGVyIHRoYW4gdGhlIHN1cHBsaWVkIHRva2VuLgogICAgcG9wKCk7IC8vIGJvZHlUb2tlbgogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIFRva2VuIG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSB8fCBjdXJyZW50Q2xhc3NJc1BhcnNlclJlY292ZXJ5KSByZXR1cm47CiAgICBGdW5jdGlvbkJ1aWxkZXIgYnVpbGRlcjsKICAgIGlmIChuYW1lIGlzIFF1YWxpZmllZE5hbWUgfHwKICAgICAgICAoZ2V0T3JTZXQgPT0gbnVsbCAmJiBuYW1lID09IGN1cnJlbnRDbGFzcy5uYW1lKSkgewogICAgICBidWlsZGVyID0gbG9va3VwQ29uc3RydWN0b3IoYmVnaW5Ub2tlbiwgbmFtZSk7CiAgICB9IGVsc2UgewogICAgICBidWlsZGVyID0gbG9va3VwQnVpbGRlcihiZWdpblRva2VuLCBnZXRPclNldCwgbmFtZSk7CiAgICB9CiAgICBidWlsZEZ1bmN0aW9uQm9keSgKICAgICAgICBjcmVhdGVGdW5jdGlvbkxpc3RlbmVyKGJ1aWxkZXIpLAogICAgICAgIGJlZ2luUGFyYW0sCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgYnVpbGRlci5pc1N0YXRpYwogICAgICAgICAgICA/IE1lbWJlcktpbmQuU3RhdGljTWV0aG9kCiAgICAgICAgICAgIDogTWVtYmVyS2luZC5Ob25TdGF0aWNNZXRob2QpOwogIH0KCiAgU3RhY2tMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcigKICAgICAgTW9kaWZpZXJCdWlsZGVyIGJ1aWxkZXIsIFNjb3BlIG1lbWJlclNjb3BlLCBib29sIGlzSW5zdGFuY2VNZW1iZXIsCiAgICAgIHtWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuc2lvblRoaXMsIFNjb3BlIGZvcm1hbFBhcmFtZXRlclNjb3BlfSkgewogICAgLy8gTm90ZTogd2Ugc2V0IHRoaXNUeXBlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBhcmUgYnVpbGRpbmcgYSBzdGF0aWMKICAgIC8vIG1lbWJlciwgc2luY2UgdGhhdCBwcm92aWRlcyBiZXR0ZXIgZXJyb3IgcmVjb3ZlcnkuCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBQcm92aWRlIGEgZHVtbXkgdGhpcyBvbiBzdGF0aWMgZXh0ZW5zaW9uIG1ldGhvZHMKICAgIC8vIGZvciBiZXR0ZXIgZXJyb3IgcmVjb3Zlcnk/CiAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0KICAgICAgICBleHRlbnNpb25UaGlzID09IG51bGwgPyBjdXJyZW50Q2xhc3M/LnRhcmdldD8udGhpc1R5cGUgOiBudWxsOwogICAgdmFyIHR5cGVJbmZlcnJlciA9CiAgICAgICAgdHlwZUluZmVyZW5jZUVuZ2luZT8uY3JlYXRlTG9jYWxUeXBlSW5mZXJyZXIodXJpLCB0aGlzVHlwZSwgbGlicmFyeSk7CiAgICBDb25zdGFudENvbnRleHQgY29uc3RhbnRDb250ZXh0ID0gYnVpbGRlci5pc0NvbnN0cnVjdG9yICYmIGJ1aWxkZXIuaXNDb25zdAogICAgICAgID8gQ29uc3RhbnRDb250ZXh0LmluZmVycmVkCiAgICAgICAgOiBDb25zdGFudENvbnRleHQubm9uZTsKICAgIHJldHVybiBuZXcgQm9keUJ1aWxkZXIoCiAgICAgICAgbGlicmFyeSwKICAgICAgICBidWlsZGVyLAogICAgICAgIG1lbWJlclNjb3BlLAogICAgICAgIGZvcm1hbFBhcmFtZXRlclNjb3BlLAogICAgICAgIGhpZXJhcmNoeSwKICAgICAgICBjb3JlVHlwZXMsCiAgICAgICAgY3VycmVudENsYXNzLAogICAgICAgIGlzSW5zdGFuY2VNZW1iZXIsCiAgICAgICAgZXh0ZW5zaW9uVGhpcywKICAgICAgICB1cmksCiAgICAgICAgdHlwZUluZmVycmVyKQogICAgICAuLmNvbnN0YW50Q29udGV4dCA9IGNvbnN0YW50Q29udGV4dDsKICB9CgogIFN0YWNrTGlzdGVuZXIgY3JlYXRlRnVuY3Rpb25MaXN0ZW5lcihGdW5jdGlvbkJ1aWxkZXIgYnVpbGRlcikgewogICAgZmluYWwgU2NvcGUgdHlwZVBhcmFtZXRlclNjb3BlID0KICAgICAgICBidWlsZGVyLmNvbXB1dGVUeXBlUGFyYW1ldGVyU2NvcGUobWVtYmVyU2NvcGUpOwogICAgZmluYWwgU2NvcGUgZm9ybWFsUGFyYW1ldGVyU2NvcGUgPQogICAgICAgIGJ1aWxkZXIuY29tcHV0ZUZvcm1hbFBhcmFtZXRlclNjb3BlKHR5cGVQYXJhbWV0ZXJTY29wZSk7CiAgICBhc3NlcnQodHlwZVBhcmFtZXRlclNjb3BlICE9IG51bGwpOwogICAgYXNzZXJ0KGZvcm1hbFBhcmFtZXRlclNjb3BlICE9IG51bGwpOwogICAgcmV0dXJuIGNyZWF0ZUxpc3RlbmVyKGJ1aWxkZXIsIHR5cGVQYXJhbWV0ZXJTY29wZSwgYnVpbGRlci5pc0luc3RhbmNlTWVtYmVyLAogICAgICAgIGV4dGVuc2lvblRoaXM6IGJ1aWxkZXIuZXh0ZW5zaW9uVGhpcywKICAgICAgICBmb3JtYWxQYXJhbWV0ZXJTY29wZTogZm9ybWFsUGFyYW1ldGVyU2NvcGUpOwogIH0KCiAgdm9pZCBidWlsZFJlZGlyZWN0aW5nRmFjdG9yeU1ldGhvZCgKICAgICAgVG9rZW4gdG9rZW4sIEZ1bmN0aW9uQnVpbGRlciBidWlsZGVyLCBNZW1iZXJLaW5kIGtpbmQsIFRva2VuIG1ldGFkYXRhKSB7CiAgICBmaW5hbCBTdGFja0xpc3RlbmVyIGxpc3RlbmVyID0gY3JlYXRlRnVuY3Rpb25MaXN0ZW5lcihidWlsZGVyKTsKICAgIHRyeSB7CiAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpc3RlbmVyKTsKICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwpIHsKICAgICAgICBwYXJzZXIucGFyc2VNZXRhZGF0YVN0YXIocGFyc2VyLnN5bnRoZXRpY1ByZXZpb3VzVG9rZW4obWV0YWRhdGEpKTsKICAgICAgICBsaXN0ZW5lci5wb3AoKTsgLy8gUG9wcyBtZXRhZGF0YSBjb25zdGFudHMuCiAgICAgIH0KCiAgICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRm9ybWFsUGFyYW1ldGVyc09wdCgKICAgICAgICAgIHBhcnNlci5zeW50aGV0aWNQcmV2aW91c1Rva2VuKHRva2VuKSwgTWVtYmVyS2luZC5GYWN0b3J5KTsKICAgICAgbGlzdGVuZXIucG9wKCk7IC8vIFBvcHMgZm9ybWFsIHBhcmFtZXRlcnMuCiAgICAgIGxpc3RlbmVyLmNoZWNrRW1wdHkodG9rZW4ubmV4dC5jaGFyT2Zmc2V0KTsKICAgIH0gb24gRGVidWdBYm9ydCB7CiAgICAgIHJldGhyb3c7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIHRocm93IG5ldyBDcmFzaCh1cmksIHRva2VuLmNoYXJPZmZzZXQsIGUsIHMpOwogICAgfQogIH0KCiAgdm9pZCBidWlsZEZpZWxkcyhpbnQgY291bnQsIFRva2VuIHRva2VuLCBib29sIGlzVG9wTGV2ZWwpIHsKICAgIExpc3Q8U3RyaW5nPiBuYW1lcyA9IGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PFN0cmluZz4oKS5wb3Aoc3RhY2ssIGNvdW50KTsKICAgIFRva2VuIG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KHRva2VuLmNoYXJPZmZzZXQpOwogICAgaWYgKG5hbWVzID09IG51bGwgfHwgY3VycmVudENsYXNzSXNQYXJzZXJSZWNvdmVyeSkgcmV0dXJuOwoKICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gbG9va3VwQnVpbGRlcih0b2tlbiwgbnVsbCwgbmFtZXMuZmlyc3QpOwogICAgLy8gVE9ETyhwYXVsYmVycnkpOiBkb24ndCByZS1wYXJzZSB0aGUgZmllbGQgaWYgd2UndmUgYWxyZWFkeSBwYXJzZWQgaXQKICAgIC8vIGZvciB0eXBlIGluZmVyZW5jZS4KICAgIHBhcnNlRmllbGRzKAogICAgICAgIGNyZWF0ZUxpc3RlbmVyKGRlY2xhcmF0aW9uLCBtZW1iZXJTY29wZSwgZGVjbGFyYXRpb24uaXNJbnN0YW5jZU1lbWJlciksCiAgICAgICAgdG9rZW4sCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgaXNUb3BMZXZlbCk7CiAgICBjaGVja0VtcHR5KHRva2VuLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkTWVtYmVyKFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbnZhbGlkTWVtYmVyIik7CiAgICBwb3AoKTsgLy8gbWV0YWRhdGEgc3RhcgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNZW1iZXIoKSB7CiAgICBkZWJ1Z0V2ZW50KCJNZW1iZXIiKTsKICAgIGNoZWNrRW1wdHkoLTEpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRBc3NlcnQoVG9rZW4gYXNzZXJ0S2V5d29yZCwgQXNzZXJ0IGtpbmQsIFRva2VuIGxlZnRQYXJlbnRoZXNpcywKICAgICAgVG9rZW4gY29tbWFUb2tlbiwgVG9rZW4gc2VtaWNvbG9uVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkFzc2VydCIpOwogICAgLy8gRG8gbm90aGluZwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNsYXNzT3JNaXhpbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGFzc2VydChjaGVja1N0YXRlKHRva2VuLCBbCiAgICAgIFZhbHVlS2luZC5Ub2tlbiwKICAgICAgVmFsdWVLaW5kLk5hbWVPclBhcnNlclJlY292ZXJ5LAogICAgICBWYWx1ZUtpbmQuVG9rZW5Pck51bGwKICAgIF0pKTsKICAgIGRlYnVnRXZlbnQoImJlZ2luQ2xhc3NPck1peGluQm9keSIpOwogICAgVG9rZW4gYmVnaW5Ub2tlbiA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIHBvcCgpOyAvLyBBbm5vdGF0aW9uIGJlZ2luIHRva2VuLgogICAgYXNzZXJ0KGN1cnJlbnRDbGFzcyA9PSBudWxsKTsKICAgIGFzc2VydChtZW1iZXJTY29wZSA9PSBsaWJyYXJ5LnNjb3BlKTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIGN1cnJlbnRDbGFzc0lzUGFyc2VyUmVjb3ZlcnkgPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CiAgICBjdXJyZW50Q2xhc3MgPSBsb29rdXBCdWlsZGVyKGJlZ2luVG9rZW4sIG51bGwsIG5hbWUpOwogICAgbWVtYmVyU2NvcGUgPSBjdXJyZW50Q2xhc3Muc2NvcGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENsYXNzT3JNaXhpbkJvZHkoaW50IG1lbWJlckNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiQ2xhc3NPck1peGluQm9keSIpOwogICAgY3VycmVudENsYXNzID0gbnVsbDsKICAgIGN1cnJlbnRDbGFzc0lzUGFyc2VyUmVjb3ZlcnkgPSBmYWxzZTsKICAgIG1lbWJlclNjb3BlID0gbGlicmFyeS5zY29wZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DbGFzc0RlY2xhcmF0aW9uKFRva2VuIGJlZ2luLCBUb2tlbiBhYnN0cmFjdFRva2VuLCBUb2tlbiBuYW1lKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkNsYXNzRGVjbGFyYXRpb24iKTsKICAgIHB1c2goYmVnaW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDbGFzc0RlY2xhcmF0aW9uKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRDbGFzc0RlY2xhcmF0aW9uIik7CiAgICBjaGVja0VtcHR5KGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTWl4aW5EZWNsYXJhdGlvbihUb2tlbiBtaXhpbktleXdvcmQsIFRva2VuIG5hbWUpIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luTWl4aW5EZWNsYXJhdGlvbiIpOwogICAgcHVzaChtaXhpbktleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNaXhpbkRlY2xhcmF0aW9uKFRva2VuIG1peGluS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZE1peGluRGVjbGFyYXRpb24iKTsKICAgIGNoZWNrRW1wdHkobWl4aW5LZXl3b3JkLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkV4dGVuc2lvbkRlY2xhcmF0aW9uKFRva2VuIGV4dGVuc2lvbktleXdvcmQsIFRva2VuIG5hbWVUb2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5FeHRlbnNpb25EZWNsYXJhdGlvbiIpOwogICAgU3RyaW5nIG5hbWUgPSBuYW1lVG9rZW4/LmxleGVtZSA/PwogICAgICAgIC8vIFN5bnRoZXNpemVkIG5hbWUgdXNlZCBpbnRlcm5hbGx5LgogICAgICAgICdleHRlbnNpb24tJHt1bm5hbWVkRXh0ZW5zaW9uQ291bnRlcisrfSc7CiAgICBwdXNoKG5hbWUpOwogICAgcHVzaChleHRlbnNpb25LZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRXh0ZW5zaW9uRGVjbGFyYXRpb24oCiAgICAgIFRva2VuIGV4dGVuc2lvbktleXdvcmQsIFRva2VuIG9uS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZEV4dGVuc2lvbkRlY2xhcmF0aW9uIik7CiAgICBjaGVja0VtcHR5KGV4dGVuc2lvbktleXdvcmQuY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEVudW0oVG9rZW4gZW51bUtleXdvcmQsIFRva2VuIGxlZnRCcmFjZSwgaW50IGNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJFbnVtIik7CiAgICBjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxPYmplY3Q+KCkucG9wKHN0YWNrLCBjb3VudCAqIDIpOwogICAgcG9wKCk7IC8vIE5hbWUuCiAgICBwb3AoKTsgLy8gQW5ub3RhdGlvbnMgYmVnaW4gdG9rZW4uCiAgICBjaGVja0VtcHR5KGVudW1LZXl3b3JkLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmROYW1lZE1peGluQXBwbGljYXRpb24oVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gY2xhc3NLZXl3b3JkLAogICAgICBUb2tlbiBlcXVhbHMsIFRva2VuIGltcGxlbWVudHNLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiTmFtZWRNaXhpbkFwcGxpY2F0aW9uIik7CgogICAgcG9wKCk7IC8vIE5hbWUuCiAgICBwb3AoKTsgLy8gQW5ub3RhdGlvbnMgYmVnaW4gdG9rZW4uCiAgICBjaGVja0VtcHR5KGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBBc3luY01hcmtlciBnZXRBc3luY01hcmtlcihTdGFja0xpc3RlbmVyIGxpc3RlbmVyKSA9PiBsaXN0ZW5lci5wb3AoKTsKCiAgLy8vIEludm9rZXMgdGhlIGxpc3RlbmVyJ3MgW2ZpbmlzaEZ1bmN0aW9uXSBtZXRob2QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBzZXBhcmF0ZSBtZXRob2Qgc28gdGhhdCBpdCBtYXkgYmUgb3ZlcnJpZGRlbiBieSBhIGRlcml2ZWQgY2xhc3MKICAvLy8gaWYgbW9yZSBjb21wdXRhdGlvbiBtdXN0IGJlIGRvbmUgYmVmb3JlIGZpbmlzaGluZyB0aGUgZnVuY3Rpb24uCiAgdm9pZCBsaXN0ZW5lckZpbmlzaEZ1bmN0aW9uKAogICAgICBTdGFja0xpc3RlbmVyIGxpc3RlbmVyLAogICAgICBUb2tlbiB0b2tlbiwKICAgICAgTWVtYmVyS2luZCBraW5kLAogICAgICBkeW5hbWljIGZvcm1hbHMsCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTW9kaWZpZXIsCiAgICAgIGR5bmFtaWMgYm9keSkgewogICAgbGlzdGVuZXIuZmluaXNoRnVuY3Rpb24oZm9ybWFscywgYXN5bmNNb2RpZmllciwgYm9keSk7CiAgfQoKICAvLy8gSW52b2tlcyB0aGUgbGlzdGVuZXIncyBbZmluaXNoRmllbGRzXSBtZXRob2QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBzZXBhcmF0ZSBtZXRob2Qgc28gdGhhdCBpdCBtYXkgYmUgb3ZlcnJpZGRlbiBieSBhIGRlcml2ZWQgY2xhc3MKICAvLy8gaWYgbW9yZSBjb21wdXRhdGlvbiBtdXN0IGJlIGRvbmUgYmVmb3JlIGZpbmlzaGluZyB0aGUgZnVuY3Rpb24uCiAgdm9pZCBsaXN0ZW5lckZpbmlzaEZpZWxkcyhTdGFja0xpc3RlbmVyIGxpc3RlbmVyLCBUb2tlbiBzdGFydFRva2VuLAogICAgICBUb2tlbiBtZXRhZGF0YSwgYm9vbCBpc1RvcExldmVsKSB7CiAgICBsaXN0ZW5lci5maW5pc2hGaWVsZHMoKTsKICB9CgogIHZvaWQgYnVpbGRGdW5jdGlvbkJvZHkoU3RhY2tMaXN0ZW5lciBsaXN0ZW5lciwgVG9rZW4gc3RhcnRUb2tlbiwKICAgICAgVG9rZW4gbWV0YWRhdGEsIE1lbWJlcktpbmQga2luZCkgewogICAgVG9rZW4gdG9rZW4gPSBzdGFydFRva2VuOwogICAgdHJ5IHsKICAgICAgUGFyc2VyIHBhcnNlciA9IG5ldyBQYXJzZXIobGlzdGVuZXIpOwogICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkgewogICAgICAgIHBhcnNlci5wYXJzZU1ldGFkYXRhU3RhcihwYXJzZXIuc3ludGhldGljUHJldmlvdXNUb2tlbihtZXRhZGF0YSkpOwogICAgICAgIGxpc3RlbmVyLnBvcCgpOyAvLyBBbm5vdGF0aW9ucy4KICAgICAgfQogICAgICB0b2tlbiA9IHBhcnNlci5wYXJzZUZvcm1hbFBhcmFtZXRlcnNPcHQoCiAgICAgICAgICBwYXJzZXIuc3ludGhldGljUHJldmlvdXNUb2tlbih0b2tlbiksIGtpbmQpOwogICAgICB2YXIgZm9ybWFscyA9IGxpc3RlbmVyLnBvcCgpOwogICAgICBsaXN0ZW5lci5jaGVja0VtcHR5KHRva2VuLm5leHQuY2hhck9mZnNldCk7CiAgICAgIHRva2VuID0gcGFyc2VyLnBhcnNlSW5pdGlhbGl6ZXJzT3B0KHRva2VuKTsKICAgICAgdG9rZW4gPSBwYXJzZXIucGFyc2VBc3luY01vZGlmaWVyT3B0KHRva2VuKTsKICAgICAgQXN5bmNNYXJrZXIgYXN5bmNNb2RpZmllciA9IGdldEFzeW5jTWFya2VyKGxpc3RlbmVyKSA/PyBBc3luY01hcmtlci5TeW5jOwogICAgICBib29sIGlzRXhwcmVzc2lvbiA9IGZhbHNlOwogICAgICBib29sIGFsbG93QWJzdHJhY3QgPSBhc3luY01vZGlmaWVyID09IEFzeW5jTWFya2VyLlN5bmM7CiAgICAgIHBhcnNlci5wYXJzZUZ1bmN0aW9uQm9keSh0b2tlbiwgaXNFeHByZXNzaW9uLCBhbGxvd0Fic3RyYWN0KTsKICAgICAgdmFyIGJvZHkgPSBsaXN0ZW5lci5wb3AoKTsKICAgICAgbGlzdGVuZXIuY2hlY2tFbXB0eSh0b2tlbi5jaGFyT2Zmc2V0KTsKICAgICAgbGlzdGVuZXJGaW5pc2hGdW5jdGlvbigKICAgICAgICAgIGxpc3RlbmVyLCBzdGFydFRva2VuLCBraW5kLCBmb3JtYWxzLCBhc3luY01vZGlmaWVyLCBib2R5KTsKICAgIH0gb24gRGVidWdBYm9ydCB7CiAgICAgIHJldGhyb3c7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIHRocm93IG5ldyBDcmFzaCh1cmksIHRva2VuLmNoYXJPZmZzZXQsIGUsIHMpOwogICAgfQogIH0KCiAgdm9pZCBwYXJzZUZpZWxkcyhTdGFja0xpc3RlbmVyIGxpc3RlbmVyLCBUb2tlbiBzdGFydFRva2VuLCBUb2tlbiBtZXRhZGF0YSwKICAgICAgYm9vbCBpc1RvcExldmVsKSB7CiAgICBUb2tlbiB0b2tlbiA9IHN0YXJ0VG9rZW47CiAgICBQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcihsaXN0ZW5lcik7CiAgICBpZiAoaXNUb3BMZXZlbCkgewogICAgICB0b2tlbiA9IHBhcnNlci5wYXJzZVRvcExldmVsTWVtYmVyKG1ldGFkYXRhID8/IHRva2VuKTsKICAgIH0gZWxzZSB7CiAgICAgIHRva2VuID0gcGFyc2VyLnBhcnNlQ2xhc3NPck1peGluTWVtYmVyKG1ldGFkYXRhID8/IHRva2VuKS5uZXh0OwogICAgfQogICAgbGlzdGVuZXJGaW5pc2hGaWVsZHMobGlzdGVuZXIsIHN0YXJ0VG9rZW4sIG1ldGFkYXRhLCBpc1RvcExldmVsKTsKICAgIGxpc3RlbmVyLmNoZWNrRW1wdHkodG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBEZWNsYXJhdGlvbiBsb29rdXBCdWlsZGVyKFRva2VuIHRva2VuLCBUb2tlbiBnZXRPclNldCwgU3RyaW5nIG5hbWUpIHsKICAgIC8vIFRPRE8oYWhlKTogQ2FuIEkgbW92ZSB0aGlzIHRvIFNjb3BlIG9yIFNjb3BlQnVpbGRlcj8KICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uOwogICAgaWYgKGN1cnJlbnRDbGFzcyAhPSBudWxsKSB7CiAgICAgIGlmICh1cmkgIT0gY3VycmVudENsYXNzLmZpbGVVcmkpIHsKICAgICAgICB1bmV4cGVjdGVkKCIkdXJpIiwgIiR7Y3VycmVudENsYXNzLmZpbGVVcml9IiwgY3VycmVudENsYXNzLmNoYXJPZmZzZXQsCiAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5maWxlVXJpKTsKICAgICAgfQoKICAgICAgaWYgKGdldE9yU2V0ICE9IG51bGwgJiYgb3B0aW9uYWwoInNldCIsIGdldE9yU2V0KSkgewogICAgICAgIGRlY2xhcmF0aW9uID0gY3VycmVudENsYXNzLnNjb3BlLnNldHRlcnNbbmFtZV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVjbGFyYXRpb24gPSBjdXJyZW50Q2xhc3Muc2NvcGUubG9jYWxbbmFtZV07CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZ2V0T3JTZXQgIT0gbnVsbCAmJiBvcHRpb25hbCgic2V0IiwgZ2V0T3JTZXQpKSB7CiAgICAgIGRlY2xhcmF0aW9uID0gbGlicmFyeS5zY29wZS5zZXR0ZXJzW25hbWVdOwogICAgfSBlbHNlIHsKICAgICAgZGVjbGFyYXRpb24gPSBsaWJyYXJ5LnNjb3BlQnVpbGRlcltuYW1lXTsKICAgIH0KICAgIGRlY2xhcmF0aW9uID0gaGFuZGxlRHVwbGljYXRlZE5hbWUoZGVjbGFyYXRpb24sIHRva2VuKTsKICAgIGNoZWNrQnVpbGRlcih0b2tlbiwgZGVjbGFyYXRpb24sIG5hbWUpOwogICAgcmV0dXJuIGRlY2xhcmF0aW9uOwogIH0KCiAgRGVjbGFyYXRpb24gbG9va3VwQ29uc3RydWN0b3IoVG9rZW4gdG9rZW4sIE9iamVjdCBuYW1lT3JRdWFsaWZpZWQpIHsKICAgIGFzc2VydChjdXJyZW50Q2xhc3MgIT0gbnVsbCk7CiAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKICAgIFN0cmluZyBzdWZmaXg7CiAgICBpZiAobmFtZU9yUXVhbGlmaWVkIGlzIFF1YWxpZmllZE5hbWUpIHsKICAgICAgc3VmZml4ID0gbmFtZU9yUXVhbGlmaWVkLm5hbWU7CiAgICB9IGVsc2UgewogICAgICBzdWZmaXggPSBuYW1lT3JRdWFsaWZpZWQgPT0gY3VycmVudENsYXNzLm5hbWUgPyAiIiA6IG5hbWVPclF1YWxpZmllZDsKICAgIH0KICAgIGRlY2xhcmF0aW9uID0gY3VycmVudENsYXNzLmNvbnN0cnVjdG9ycy5sb2NhbFtzdWZmaXhdOwogICAgZGVjbGFyYXRpb24gPSBoYW5kbGVEdXBsaWNhdGVkTmFtZShkZWNsYXJhdGlvbiwgdG9rZW4pOwogICAgY2hlY2tCdWlsZGVyKHRva2VuLCBkZWNsYXJhdGlvbiwgbmFtZU9yUXVhbGlmaWVkKTsKICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICB9CgogIERlY2xhcmF0aW9uIGhhbmRsZUR1cGxpY2F0ZWROYW1lKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBUb2tlbiB0b2tlbikgewogICAgaW50IG9mZnNldCA9IHRva2VuLmNoYXJPZmZzZXQ7CiAgICBpZiAoZGVjbGFyYXRpb24/Lm5leHQgPT0gbnVsbCkgewogICAgICByZXR1cm4gZGVjbGFyYXRpb247CiAgICB9IGVsc2UgewogICAgICBEZWNsYXJhdGlvbiBuZWFyZXN0RGVjbGFyYXRpb247CiAgICAgIGludCBtaW5EaXN0YW5jZSA9IC0xOwogICAgICBkbyB7CiAgICAgICAgLy8gT25seSBsb29rIGF0IGRlY2xhcmF0aW9ucyBmcm9tIHRoaXMgZmlsZSAocGFydCkuCiAgICAgICAgaWYgKHVyaSA9PSBkZWNsYXJhdGlvbi5maWxlVXJpKSB7CiAgICAgICAgICAvLyBbZGlzdGFuY2VdIHdpbGwgYWx3YXlzIGJlIG5vbi1uZWdhdGl2ZSBhcyB3ZSBlbnN1cmUgW3Rva2VuXSBpcwogICAgICAgICAgLy8gYWx3YXlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRlY2xhcmF0aW9uLiBUaGUgbWluaW11bSBkaXN0YW5jZQogICAgICAgICAgLy8gd2lsbCBvZnRlbiBiZSBsYXJnZXIgdGhhbiAwLCBmb3IgZXhhbXBsZSwgaW4gYSBjbGFzcyBkZWNsYXJhdGlvbgogICAgICAgICAgLy8gd2hlcmUgW3Rva2VuXSB3aWxsIHBvaW50IHRvIGBhYnN0cmFjdGAgb3IgYGNsYXNzYCwgYnV0IHRoZQogICAgICAgICAgLy8gZGVjbGFyYXRpb24ncyBvZmZzZXQgcG9pbnRzIHRvIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy4KICAgICAgICAgIGludCBkaXN0YW5jZSA9IGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQgLSBvZmZzZXQ7CiAgICAgICAgICBpZiAoZGlzdGFuY2UgPj0gMCkgewogICAgICAgICAgICBpZiAobWluRGlzdGFuY2UgPT0gLTEgfHwgZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSkgewogICAgICAgICAgICAgIG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7CiAgICAgICAgICAgICAgbmVhcmVzdERlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbi5uZXh0OwogICAgICB9IHdoaWxlIChkZWNsYXJhdGlvbiAhPSBudWxsKTsKICAgICAgcmV0dXJuIG5lYXJlc3REZWNsYXJhdGlvbjsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tCdWlsZGVyKFRva2VuIHRva2VuLCBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgT2JqZWN0IG5hbWUpIHsKICAgIGlmIChkZWNsYXJhdGlvbiA9PSBudWxsKSB7CiAgICAgIGludGVybmFsUHJvYmxlbSh0ZW1wbGF0ZUludGVybmFsUHJvYmxlbU5vdEZvdW5kLndpdGhBcmd1bWVudHMoIiRuYW1lIiksCiAgICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0LCB1cmkpOwogICAgfQogICAgaWYgKHVyaSAhPSBkZWNsYXJhdGlvbi5maWxlVXJpKSB7CiAgICAgIHVuZXhwZWN0ZWQoIiR1cmkiLCAiJHtkZWNsYXJhdGlvbi5maWxlVXJpfSIsIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQsCiAgICAgICAgICBkZWNsYXJhdGlvbi5maWxlVXJpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkUHJvYmxlbShNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLAogICAgICB7Ym9vbCB3YXNIYW5kbGVkOiBmYWxzZSwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIGxpYnJhcnkuYWRkUHJvYmxlbShtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIHVyaSwKICAgICAgICB3YXNIYW5kbGVkOiB3YXNIYW5kbGVkLCBjb250ZXh0OiBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVidWdFdmVudChTdHJpbmcgbmFtZSkgewogICAgLy8gcHJpbnRFdmVudCgnRGlldExpc3RlbmVyOiAkbmFtZScpOwogIH0KCiAgLy8vIElmIHRoZSBbbWV0YWRhdGFdIGlzIG5vdCBgbnVsbGAsIHJldHVybiB0aGUgcGFyc2VkIG1ldGFkYXRhIFtFeHByZXNzaW9uXXMuCiAgLy8vIE90aGVyd2lzZSwgcmV0dXJuIGBudWxsYC4KICBMaXN0PEV4cHJlc3Npb24+IHBhcnNlTWV0YWRhdGEoCiAgICAgIE1vZGlmaWVyQnVpbGRlciBidWlsZGVyLCBUb2tlbiBtZXRhZGF0YSwgVHJlZU5vZGUgcGFyZW50KSB7CiAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkgewogICAgICB2YXIgbGlzdGVuZXIgPSBjcmVhdGVMaXN0ZW5lcihidWlsZGVyLCBtZW1iZXJTY29wZSwgZmFsc2UpOwogICAgICB2YXIgcGFyc2VyID0gbmV3IFBhcnNlcihsaXN0ZW5lcik7CiAgICAgIHBhcnNlci5wYXJzZU1ldGFkYXRhU3RhcihwYXJzZXIuc3ludGhldGljUHJldmlvdXNUb2tlbihtZXRhZGF0YSkpOwogICAgICByZXR1cm4gbGlzdGVuZXIuZmluaXNoTWV0YWRhdGEocGFyZW50KTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIFJldHVybnMgW1Rva2VuXSBmb3VuZCBiZXR3ZWVuIFtzdGFydF0gKGluY2x1c2l2ZSkgYW5kIFtlbmRdCiAgLy8vIChub24taW5jbHVzaXZlKSB0aGF0IGhhcyBpdHMgW1Rva2VuLmNoYXJPZmZzZXRdIGVxdWFsIHRvIFtvZmZzZXRdLiAgSWYKICAvLy8gdGhlcmUgaXMgbm8gc3VjaCB0b2tlbiwgbnVsbCBpcyByZXR1cm5lZC4KICBUb2tlbiB0b2tlbkZvck9mZnNldChUb2tlbiBzdGFydCwgVG9rZW4gZW5kLCBpbnQgb2Zmc2V0KSB7CiAgICBpZiAob2Zmc2V0IDwgc3RhcnQuY2hhck9mZnNldCB8fCBvZmZzZXQgPj0gZW5kLmNoYXJPZmZzZXQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB3aGlsZSAoc3RhcnQgIT0gZW5kKSB7CiAgICAgIGlmIChvZmZzZXQgPT0gc3RhcnQuY2hhck9mZnNldCkgewogICAgICAgIHJldHVybiBzdGFydDsKICAgICAgfQogICAgICBzdGFydCA9IHN0YXJ0Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBSZXR1cm5zIGxpc3Qgb2YgW1Rva2VuXXMgZm91bmQgYmV0d2VlbiBbc3RhcnRdIChpbmNsdXNpdmUpIGFuZCBbZW5kXQogIC8vLyAobm9uLWluY2x1c2l2ZSkgdGhhdCBjb3JyZXNwb25kIHRvIFtvZmZzZXRzXS4gIElmIHRoZXJlJ3Mgbm8gdG9rZW4gYmV0d2VlbgogIC8vLyBbc3RhcnRdIGFuZCBbZW5kXSBmb3IgdGhlIGdpdmVuIG9mZnNldCwgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbSBpbiB0aGUKICAvLy8gcmVzdWx0aW5nIGxpc3QgaXMgc2V0IHRvIG51bGwuICBbb2Zmc2V0c10gYXJlIGFzc3VtZWQgdG8gYmUgaW4gYXNjZW5kaW5nCiAgLy8vIG9yZGVyLgogIExpc3Q8VG9rZW4+IHRva2Vuc0Zvck9mZnNldHMoVG9rZW4gc3RhcnQsIFRva2VuIGVuZCwgTGlzdDxpbnQ+IG9mZnNldHMpIHsKICAgIExpc3Q8VG9rZW4+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8VG9rZW4+LmZpbGxlZChvZmZzZXRzLmxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IGZhbHNlKTsKICAgIGZvciAoaW50IGkgPSAwOyBzdGFydCAhPSBlbmQgJiYgaSA8IG9mZnNldHMubGVuZ3RoOykgewogICAgICBpbnQgb2Zmc2V0ID0gb2Zmc2V0c1tpXTsKICAgICAgaWYgKG9mZnNldCA8IHN0YXJ0LmNoYXJPZmZzZXQpIHsKICAgICAgICArK2k7CiAgICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IHN0YXJ0LmNoYXJPZmZzZXQpIHsKICAgICAgICByZXN1bHRbaV0gPSBzdGFydDsKICAgICAgICBzdGFydCA9IHN0YXJ0Lm5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RhcnQgPSBzdGFydC5uZXh0OwogICAgICB9CiAgICB9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ZXIpIDogc3VwZXIobGlzdGVuZXIpOwoKICBUb2tlbiBwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXN0KFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIHJldHVybiBza2lwRm9ybWFsUGFyYW1ldGVyc1Jlc3QodG9rZW4sIGtpbmQpOwogIH0KfQoUAE5OPAEbAS4BRgErLTMBQjIEAgEzcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9kaWV0X3BhcnNlci5kYXJ0QHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2Uvb3V0bGluZV9idWlsZGVyLmRhcnTAANctLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEub3V0bGluZV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBQcm9jZWR1cmVLaW5kOwoKaW1wb3J0ICcuLi9idWlsZGVyL2J1aWxkZXIuZGFydCc7CgppbXBvcnQgJy4uL2NvbWJpbmF0b3IuZGFydCcgc2hvdyBDb21iaW5hdG9yOwoKaW1wb3J0ICcuLi9jb25maWd1cmF0aW9uLmRhcnQnIHNob3cgQ29uZmlndXJhdGlvbjsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBDb2RlLAogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JXaXRoQm9keSwKICAgICAgICBtZXNzYWdlQ29uc3RJbnN0YW5jZUZpZWxkLAogICAgICAgIG1lc3NhZ2VDb25zdE1ldGhvZCwKICAgICAgICBtZXNzYWdlQ29uc3RydWN0b3JXaXRoUmV0dXJuVHlwZSwKICAgICAgICBtZXNzYWdlQ29uc3RydWN0b3JXaXRoVHlwZVBhcmFtZXRlcnMsCiAgICAgICAgbWVzc2FnZUV4cGVjdGVkQmxvY2tUb1NraXAsCiAgICAgICAgbWVzc2FnZUludGVycG9sYXRpb25JblVyaSwKICAgICAgICBtZXNzYWdlT3BlcmF0b3JXaXRoT3B0aW9uYWxGb3JtYWxzLAogICAgICAgIG1lc3NhZ2VTdGF0aWNDb25zdHJ1Y3RvciwKICAgICAgICBtZXNzYWdlVHlwZWRlZk5vdEZ1bmN0aW9uLAogICAgICAgIHRlbXBsYXRlQ3ljbGVJblR5cGVWYXJpYWJsZXMsCiAgICAgICAgdGVtcGxhdGVEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlcywKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZFBhcmFtZXRlck5hbWVDYXVzZSwKICAgICAgICB0ZW1wbGF0ZU9wZXJhdG9yTWludXNQYXJhbWV0ZXJNaXNtYXRjaCwKICAgICAgICB0ZW1wbGF0ZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gwLAogICAgICAgIHRlbXBsYXRlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDEsCiAgICAgICAgdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMjsKCmltcG9ydCAnLi4vaWdub3JlZF9wYXJzZXJfZXJyb3JzLmRhcnQnIHNob3cgaXNJZ25vcmVkUGFyc2VyRXJyb3I7CgovLyBUT0RPKGFoZSk6IFRoZSBvdXRsaW5lIGlzbid0IHN1cHBvc2VkIHRvIGltcG9ydCBrZXJuZWwtc3BlY2lmaWMgYnVpbGRlcnMuCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgS2VybmVsTWV0YWRhdGFCdWlsZGVyLAogICAgICAgIE1peGluQXBwbGljYXRpb25CdWlsZGVyLAogICAgICAgIE5hbWVkVHlwZUJ1aWxkZXIsCiAgICAgICAgVHlwZUJ1aWxkZXI7CgppbXBvcnQgJy4uL21vZGlmaWVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ29uc3QsCiAgICAgICAgQ292YXJpYW50LAogICAgICAgIEV4dGVybmFsLAogICAgICAgIEZpbmFsLAogICAgICAgIE1vZGlmaWVyLAogICAgICAgIFN0YXRpYywKICAgICAgICBWYXIsCiAgICAgICAgYWJzdHJhY3RNYXNrLAogICAgICAgIGNvbnN0TWFzaywKICAgICAgICBjb3ZhcmlhbnRNYXNrLAogICAgICAgIGV4dGVuc2lvbkRlY2xhcmF0aW9uTWFzaywKICAgICAgICBleHRlcm5hbE1hc2ssCiAgICAgICAgbWl4aW5EZWNsYXJhdGlvbk1hc2ssCiAgICAgICAgc3RhdGljTWFzazsKCmltcG9ydCAnLi4vb3BlcmF0b3IuZGFydCcKICAgIHNob3cKICAgICAgICBPcGVyYXRvciwKICAgICAgICBvcGVyYXRvckZyb21TdHJpbmcsCiAgICAgICAgb3BlcmF0b3JUb1N0cmluZywKICAgICAgICBvcGVyYXRvclJlcXVpcmVkQXJndW1lbnRDb3VudDsKCmltcG9ydCAnLi4vcGFyc2VyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQXNzZXJ0LAogICAgICAgIEZvcm1hbFBhcmFtZXRlcktpbmQsCiAgICAgICAgSWRlbnRpZmllckNvbnRleHQsCiAgICAgICAgbGVuZ3RoT2ZTcGFuLAogICAgICAgIE1lbWJlcktpbmQsCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4sCiAgICAgICAgb3B0aW9uYWw7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5oYW5kbGVkOwoKaW1wb3J0ICcuLi9xdW90ZS5kYXJ0JyBzaG93IHVuZXNjYXBlU3RyaW5nOwoKaW1wb3J0ICcuLi9zY2FubmVyLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBGaWVsZEluZm8sIFNvdXJjZUxpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdzdGFja19saXN0ZW5lci5kYXJ0JwogICAgc2hvdyBGaXhlZE51bGxhYmxlTGlzdCwgTnVsbFZhbHVlLCBQYXJzZXJSZWNvdmVyeSwgU3RhY2tMaXN0ZW5lcjsKCmltcG9ydCAndmFsdWVfa2luZHMuZGFydCc7CgplbnVtIE1ldGhvZEJvZHkgewogIEFic3RyYWN0LAogIFJlZ3VsYXIsCiAgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSwKfQoKY2xhc3MgT3V0bGluZUJ1aWxkZXIgZXh0ZW5kcyBTdGFja0xpc3RlbmVyIHsKICBmaW5hbCBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5OwoKICBmaW5hbCBib29sIGVuYWJsZU5hdGl2ZTsKICBmaW5hbCBib29sIHN0cmluZ0V4cGVjdGVkQWZ0ZXJOYXRpdmU7CiAgYm9vbCBpbkNvbnN0cnVjdG9yID0gZmFsc2U7CiAgYm9vbCBpbkNvbnN0cnVjdG9yTmFtZSA9IGZhbHNlOwogIGludCBpbXBvcnRJbmRleCA9IDA7CgogIFN0cmluZyBuYXRpdmVNZXRob2ROYW1lOwoKICAvLy8gQ291bnRlciB1c2VkIGZvciBuYW1pbmcgdW5uYW1lZCBleHRlbnNpb24gZGVjbGFyYXRpb25zLgogIGludCB1bm5hbWVkRXh0ZW5zaW9uQ291bnRlciA9IDA7CgogIE91dGxpbmVCdWlsZGVyKFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkpCiAgICAgIDogbGlicmFyeSA9IGxpYnJhcnksCiAgICAgICAgZW5hYmxlTmF0aXZlID0KICAgICAgICAgICAgbGlicmFyeS5sb2FkZXIudGFyZ2V0LmJhY2tlbmRUYXJnZXQuZW5hYmxlTmF0aXZlKGxpYnJhcnkudXJpKSwKICAgICAgICBzdHJpbmdFeHBlY3RlZEFmdGVyTmF0aXZlID0KICAgICAgICAgICAgbGlicmFyeS5sb2FkZXIudGFyZ2V0LmJhY2tlbmRUYXJnZXQubmF0aXZlRXh0ZW5zaW9uRXhwZWN0c1N0cmluZzsKCiAgQG92ZXJyaWRlCiAgVXJpIGdldCB1cmkgPT4gbGlicmFyeS5maWxlVXJpOwoKICBpbnQgcG9wQ2hhck9mZnNldCgpID0+IHBvcCgpOwoKICBMaXN0PFN0cmluZz4gcG9wSWRlbnRpZmllckxpc3QoaW50IGNvdW50KSB7CiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBMaXN0PFN0cmluZz4oY291bnQpOwogICAgYm9vbCBpc1BhcnNlclJlY292ZXJ5ID0gZmFsc2U7CiAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkgewogICAgICBwb3BDaGFyT2Zmc2V0KCk7CiAgICAgIE9iamVjdCBpZGVudGlmaWVyID0gcG9wKCk7CiAgICAgIGlmIChpZGVudGlmaWVyIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgICAgaXNQYXJzZXJSZWNvdmVyeSA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGlzdFtpXSA9IGlkZW50aWZpZXI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpc1BhcnNlclJlY292ZXJ5ID8gbnVsbCA6IGxpc3Q7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1ldGFkYXRhKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHBlcmlvZEJlZm9yZU5hbWUsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJNZXRhZGF0YSIpOwogICAgcG9wKCk7IC8vIGFyZ3VtZW50cwogICAgaWYgKHBlcmlvZEJlZm9yZU5hbWUgIT0gbnVsbCkgewogICAgICBwb3AoKTsgLy8gb2Zmc2V0CiAgICAgIHBvcCgpOyAvLyBjb25zdHJ1Y3RvciBuYW1lCiAgICB9CiAgICBwb3AoKTsgLy8gdHlwZSBhcmd1bWVudHMKICAgIHBvcCgpOyAvLyBvZmZzZXQKICAgIE9iamVjdCBzZW50aW5lbCA9IHBvcCgpOyAvLyBwcmVmaXggb3IgY29uc3RydWN0b3IKICAgIHB1c2goc2VudGluZWwgaXMgUGFyc2VyUmVjb3ZlcnkKICAgICAgICA/IHNlbnRpbmVsCiAgICAgICAgOiBuZXcgS2VybmVsTWV0YWRhdGFCdWlsZGVyKGJlZ2luVG9rZW4pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWV0YWRhdGFTdGFyKGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiTWV0YWRhdGFTdGFyIik7CiAgICBwdXNoKGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PE1ldGFkYXRhQnVpbGRlcj4oKS5wb3Aoc3RhY2ssIGNvdW50KSA/PwogICAgICAgIE51bGxWYWx1ZS5NZXRhZGF0YSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRUb3BMZXZlbERlY2xhcmF0aW9uKFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbiIpOwogICAgcG9wKCk7IC8vIG1ldGFkYXRhIHN0YXIKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSGlkZShUb2tlbiBoaWRlS2V5d29yZCkgewogICAgZGVidWdFdmVudCgiSGlkZSIpOwogICAgT2JqZWN0IG5hbWVzID0gcG9wKCk7CiAgICBpZiAobmFtZXMgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChuYW1lcyk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKG5ldyBDb21iaW5hdG9yLmhpZGUobmFtZXMsIGhpZGVLZXl3b3JkLmNoYXJPZmZzZXQsIGxpYnJhcnkuZmlsZVVyaSkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRTaG93KFRva2VuIHNob3dLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJTaG93Iik7CiAgICBPYmplY3QgbmFtZXMgPSBwb3AoKTsKICAgIGlmIChuYW1lcyBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKG5hbWVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobmV3IENvbWJpbmF0b3Iuc2hvdyhuYW1lcywgc2hvd0tleXdvcmQuY2hhck9mZnNldCwgbGlicmFyeS5maWxlVXJpKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbWJpbmF0b3JzKGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiQ29tYmluYXRvcnMiKTsKICAgIHB1c2goY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8Q29tYmluYXRvcj4oKS5wb3Aoc3RhY2ssIGNvdW50KSA/PwogICAgICAgIE51bGxWYWx1ZS5Db21iaW5hdG9ycyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEV4cG9ydChUb2tlbiBleHBvcnRLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIkV4cG9ydCIpOwogICAgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9ycyA9IHBvcCgpOwogICAgTGlzdDxDb25maWd1cmF0aW9uPiBjb25maWd1cmF0aW9ucyA9IHBvcCgpOwogICAgaW50IHVyaU9mZnNldCA9IHBvcENoYXJPZmZzZXQoKTsKICAgIFN0cmluZyB1cmkgPSBwb3AoKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgbGlicmFyeS5hZGRFeHBvcnQobWV0YWRhdGEsIHVyaSwgY29uZmlndXJhdGlvbnMsIGNvbWJpbmF0b3JzLAogICAgICAgIGV4cG9ydEtleXdvcmQuY2hhck9mZnNldCwgdXJpT2Zmc2V0KTsKICAgIGNoZWNrRW1wdHkoZXhwb3J0S2V5d29yZC5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW1wb3J0UHJlZml4KFRva2VuIGRlZmVycmVkS2V5d29yZCwgVG9rZW4gYXNLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbXBvcnRQcmVmaXgiKTsKICAgIGlmIChhc0tleXdvcmQgPT0gbnVsbCkgewogICAgICAvLyBJZiBhc0tleXdvcmQgaXMgbnVsbCwgdGhlbiBubyBwcmVmaXggaGFzIGJlZW4gcHVzaGVkIG9uIHRoZSBzdGFjay4KICAgICAgLy8gUHVzaCBhIHBsYWNlaG9sZGVyIGluZGljYXRpbmcgdGhhdCB0aGVyZSBpcyBubyBwcmVmaXguCiAgICAgIHB1c2goTnVsbFZhbHVlLlByZWZpeCk7CiAgICAgIHB1c2goLTEpOwogICAgfQogICAgcHVzaChkZWZlcnJlZEtleXdvcmQgIT0gbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEltcG9ydChUb2tlbiBpbXBvcnRLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIkVuZEltcG9ydCIpOwogICAgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9ycyA9IHBvcCgpOwogICAgYm9vbCBpc0RlZmVycmVkID0gcG9wKCk7CiAgICBpbnQgcHJlZml4T2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3QgcHJlZml4ID0gcG9wKE51bGxWYWx1ZS5QcmVmaXgpOwogICAgTGlzdDxDb25maWd1cmF0aW9uPiBjb25maWd1cmF0aW9ucyA9IHBvcCgpOwogICAgaW50IHVyaU9mZnNldCA9IHBvcENoYXJPZmZzZXQoKTsKICAgIFN0cmluZyB1cmkgPSBwb3AoKTsgLy8gRm9yIGEgY29uZGl0aW9uYWwgaW1wb3J0LCB0aGlzIGlzIHRoZSBkZWZhdWx0IFVSSS4KICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eShpbXBvcnRLZXl3b3JkLmNoYXJPZmZzZXQpOwogICAgaWYgKHByZWZpeCBpcyBQYXJzZXJSZWNvdmVyeSkgcmV0dXJuOwogICAgbGlicmFyeS5hZGRJbXBvcnQoCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgdXJpLAogICAgICAgIGNvbmZpZ3VyYXRpb25zLAogICAgICAgIHByZWZpeCwKICAgICAgICBjb21iaW5hdG9ycywKICAgICAgICBpc0RlZmVycmVkLAogICAgICAgIGltcG9ydEtleXdvcmQuY2hhck9mZnNldCwKICAgICAgICBwcmVmaXhPZmZzZXQsCiAgICAgICAgdXJpT2Zmc2V0LAogICAgICAgIGltcG9ydEluZGV4KyspOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25kaXRpb25hbFVyaXMoaW50IGNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJFbmRDb25kaXRpb25hbFVyaXMiKTsKICAgIHB1c2goY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8Q29uZmlndXJhdGlvbj4oKS5wb3Aoc3RhY2ssIGNvdW50KSA/PwogICAgICAgIE51bGxWYWx1ZS5Db25kaXRpb25hbFVyaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25kaXRpb25hbFVyaShUb2tlbiBpZktleXdvcmQsIFRva2VuIGxlZnRQYXJlbiwgVG9rZW4gZXF1YWxTaWduKSB7CiAgICBkZWJ1Z0V2ZW50KCJFbmRDb25kaXRpb25hbFVyaSIpOwogICAgaW50IGNoYXJPZmZzZXQgPSBwb3BDaGFyT2Zmc2V0KCk7CiAgICBTdHJpbmcgdXJpID0gcG9wKCk7CiAgICBpZiAoZXF1YWxTaWduICE9IG51bGwpIHBvcENoYXJPZmZzZXQoKTsKICAgIFN0cmluZyBjb25kaXRpb24gPSBwb3BJZk5vdE51bGwoZXF1YWxTaWduKSA/PyAidHJ1ZSI7CiAgICBPYmplY3QgZG90dGVkTmFtZSA9IHBvcCgpOwogICAgaWYgKGRvdHRlZE5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChkb3R0ZWROYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobmV3IENvbmZpZ3VyYXRpb24oY2hhck9mZnNldCwgZG90dGVkTmFtZSwgY29uZGl0aW9uLCB1cmkpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRG90dGVkTmFtZShpbnQgY291bnQsIFRva2VuIGZpcnN0SWRlbnRpZmllcikgewogICAgZGVidWdFdmVudCgiRG90dGVkTmFtZSIpOwogICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gcG9wSWRlbnRpZmllckxpc3QoY291bnQpOwogICAgaWYgKG5hbWVzID09IG51bGwpIHsKICAgICAgcHVzaChuZXcgUGFyc2VyUmVjb3ZlcnkoZmlyc3RJZGVudGlmaWVyLmNoYXJPZmZzZXQpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobmFtZXMuam9pbignLicpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUmVjb3ZlckltcG9ydChUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIlJlY292ZXJJbXBvcnQiKTsKICAgIHBvcCgpOyAvLyBjb21iaW5hdG9ycwogICAgcG9wKE51bGxWYWx1ZS5EZWZlcnJlZCk7IC8vIGRlZmVycmVkS2V5d29yZAogICAgcG9wKCk7IC8vIHByZWZpeE9mZnNldAogICAgcG9wKE51bGxWYWx1ZS5QcmVmaXgpOyAvLyBwcmVmaXgKICAgIHBvcCgpOyAvLyBjb25kaXRpb25hbFVyaXMKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kUGFydChUb2tlbiBwYXJ0S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJQYXJ0Iik7CiAgICBpbnQgY2hhck9mZnNldCA9IHBvcENoYXJPZmZzZXQoKTsKICAgIFN0cmluZyB1cmkgPSBwb3AoKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgbGlicmFyeS5hZGRQYXJ0KG1ldGFkYXRhLCB1cmksIGNoYXJPZmZzZXQpOwogICAgY2hlY2tFbXB0eShwYXJ0S2V5d29yZC5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlT3BlcmF0b3JOYW1lKFRva2VuIG9wZXJhdG9yS2V5d29yZCwgVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk9wZXJhdG9yTmFtZSIpOwogICAgcHVzaChvcGVyYXRvckZyb21TdHJpbmcodG9rZW4uc3RyaW5nVmFsdWUpKTsKICAgIHB1c2godG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRPcGVyYXRvck5hbWUoVG9rZW4gb3BlcmF0b3JLZXl3b3JkLCBUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiSW52YWxpZE9wZXJhdG9yTmFtZSIpOwogICAgcHVzaCgnaW52YWxpZCcpOwogICAgcHVzaCh0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgaWYgKGNvbnRleHQgPT0gSWRlbnRpZmllckNvbnRleHQuZW51bVZhbHVlRGVjbGFyYXRpb24pIHsKICAgICAgZGVidWdFdmVudCgiaGFuZGxlSWRlbnRpZmllciIpOwogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEgPSBwb3AoKTsKICAgICAgaWYgKHRva2VuLmlzU3ludGhldGljKSB7CiAgICAgICAgcHVzaChuZXcgUGFyc2VyUmVjb3ZlcnkodG9rZW4uY2hhck9mZnNldCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHB1c2gobmV3IEVudW1Db25zdGFudEluZm8obWV0YWRhdGEsIHRva2VuLmxleGVtZSwgdG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgICAgZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQodG9rZW4pKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLmhhbmRsZUlkZW50aWZpZXIodG9rZW4sIGNvbnRleHQpOwogICAgICBwdXNoKHRva2VuLmNoYXJPZmZzZXQpOwogICAgfQogICAgaWYgKGluQ29uc3RydWN0b3IgJiYgY29udGV4dCA9PSBJZGVudGlmaWVyQ29udGV4dC5tZXRob2REZWNsYXJhdGlvbikgewogICAgICBpbkNvbnN0cnVjdG9yTmFtZSA9IHRydWU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vTmFtZShUb2tlbiB0b2tlbikgewogICAgc3VwZXIuaGFuZGxlTm9OYW1lKHRva2VuKTsKICAgIHB1c2godG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN0cmluZ1BhcnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlN0cmluZ1BhcnQiKTsKICAgIC8vIElnbm9yZSBzdHJpbmcgcGFydHMgLSByZXBvcnQgZXJyb3IgbGF0ZXIuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExpdGVyYWxTdHJpbmcoaW50IGludGVycG9sYXRpb25Db3VudCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZExpdGVyYWxTdHJpbmciKTsKICAgIGlmIChpbnRlcnBvbGF0aW9uQ291bnQgPT0gMCkgewogICAgICBUb2tlbiB0b2tlbiA9IHBvcCgpOwogICAgICBwdXNoKHVuZXNjYXBlU3RyaW5nKHRva2VuLmxleGVtZSwgdG9rZW4sIHRoaXMpKTsKICAgICAgcHVzaCh0b2tlbi5jaGFyT2Zmc2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIFRva2VuIGJlZ2luVG9rZW4gPSBwb3AoKTsKICAgICAgaW50IGNoYXJPZmZzZXQgPSBiZWdpblRva2VuLmNoYXJPZmZzZXQ7CiAgICAgIHB1c2goIiR7U291cmNlTGlicmFyeUJ1aWxkZXIuTUFMRk9STUVEX1VSSV9TQ0hFTUV9OmJhZCR7Y2hhck9mZnNldH0iKTsKICAgICAgcHVzaChjaGFyT2Zmc2V0KTsKICAgICAgLy8gUG9pbnQgdG8gZG9sbGFyIHNpZ24KICAgICAgaW50IGludGVycG9sYXRpb25PZmZzZXQgPSBjaGFyT2Zmc2V0ICsgYmVnaW5Ub2tlbi5sZXhlbWUubGVuZ3RoOwogICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VJbnRlcnBvbGF0aW9uSW5VcmksIGludGVycG9sYXRpb25PZmZzZXQsIDEpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVDbGF1c2UoVG9rZW4gbmF0aXZlVG9rZW4sIGJvb2wgaGFzTmFtZSkgewogICAgZGVidWdFdmVudCgiTmF0aXZlQ2xhdXNlIik7CiAgICBpZiAoaGFzTmFtZSkgewogICAgICAvLyBQb3AgdGhlIG5hdGl2ZSBjbGF1c2Ugd2hpY2ggaW4gdGhpcyBjYXNlIGlzIGEgU3RyaW5nTGl0ZXJhbC4KICAgICAgcG9wKCk7IC8vIENoYXIgb2Zmc2V0LgogICAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUgPSAnJzsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYXRpdmVNZXRob2ROYW1lID0gbmFtZTsgLy8gU3RyaW5nLgogICAgICB9CiAgICB9IGVsc2UgewogICAgICBuYXRpdmVNZXRob2ROYW1lID0gJyc7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN0cmluZ0p1eHRhcG9zaXRpb24oaW50IGxpdGVyYWxDb3VudCkgewogICAgZGVidWdFdmVudCgiU3RyaW5nSnV4dGFwb3NpdGlvbiIpOwogICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlzdDxTdHJpbmc+KGxpdGVyYWxDb3VudCk7CiAgICBpbnQgY2hhck9mZnNldCA9IC0xOwogICAgZm9yIChpbnQgaSA9IGxpdGVyYWxDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGNoYXJPZmZzZXQgPSBwb3AoKTsKICAgICAgbGlzdFtpXSA9IHBvcCgpOwogICAgfQogICAgcHVzaChsaXN0LmpvaW4oIiIpKTsKICAgIHB1c2goY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUlkZW50aWZpZXJMaXN0KGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiZW5kSWRlbnRpZmllckxpc3QiKTsKICAgIHB1c2gocG9wSWRlbnRpZmllckxpc3QoY291bnQpID8/CiAgICAgICAgKGNvdW50ID09IDAgPyBOdWxsVmFsdWUuSWRlbnRpZmllckxpc3QgOiBuZXcgUGFyc2VyUmVjb3ZlcnkoLTEpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVF1YWxpZmllZChUb2tlbiBwZXJpb2QpIHsKICAgIGRlYnVnRXZlbnQoImhhbmRsZVF1YWxpZmllZCIpOwogICAgaW50IHN1ZmZpeE9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IHN1ZmZpeCA9IHBvcCgpOwogICAgaW50IG9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IHByZWZpeCA9IHBvcCgpOwogICAgaWYgKHByZWZpeCBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKHByZWZpeCk7CiAgICB9IGVsc2UgaWYgKHN1ZmZpeCBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKHN1ZmZpeCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoaWRlbnRpY2FsKHN1ZmZpeCwgcGVyaW9kLm5leHQubGV4ZW1lKSk7CiAgICAgIGFzc2VydChzdWZmaXhPZmZzZXQgPT0gcGVyaW9kLm5leHQuY2hhck9mZnNldCk7CiAgICAgIHB1c2gobmV3IFF1YWxpZmllZE5hbWUocHJlZml4LCBwZXJpb2QubmV4dCkpOwogICAgfQogICAgcHVzaChvZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRMaWJyYXJ5TmFtZShUb2tlbiBsaWJyYXJ5S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRMaWJyYXJ5TmFtZSIpOwogICAgcG9wQ2hhck9mZnNldCgpOwogICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQobGlicmFyeUtleXdvcmQpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgbGlicmFyeS5kb2N1bWVudGF0aW9uQ29tbWVudCA9IGRvY3VtZW50YXRpb25Db21tZW50OwogICAgaWYgKG5hbWUgaXMhIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIGxpYnJhcnkubmFtZSA9IGZsYXR0ZW5OYW1lKG5hbWUsIG9mZnNldEZvclRva2VuKGxpYnJhcnlLZXl3b3JkKSwgdXJpKTsKICAgIH0KICAgIGxpYnJhcnkubWV0YWRhdGEgPSBtZXRhZGF0YTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DbGFzc09yTmFtZWRNaXhpbkFwcGxpY2F0aW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkNsYXNzT3JOYW1lZE1peGluQXBwbGljYXRpb24iKTsKICAgIGxpYnJhcnkuYmVnaW5OZXN0ZWREZWNsYXJhdGlvbigiY2xhc3Mgb3IgbWl4aW4gYXBwbGljYXRpb24iKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DbGFzc0RlY2xhcmF0aW9uKFRva2VuIGJlZ2luLCBUb2tlbiBhYnN0cmFjdFRva2VuLCBUb2tlbiBuYW1lKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkNsYXNzRGVjbGFyYXRpb24iKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBvcCgpOwogICAgcHVzaCh0eXBlVmFyaWFibGVzID8/IE51bGxWYWx1ZS5UeXBlVmFyaWFibGVzKTsKICAgIGxpYnJhcnkuY3VycmVudERlY2xhcmF0aW9uCiAgICAgIC4ubmFtZSA9IG5hbWUubGV4ZW1lCiAgICAgIC4uY2hhck9mZnNldCA9IG5hbWUuY2hhck9mZnNldAogICAgICAuLnR5cGVWYXJpYWJsZXMgPSB0eXBlVmFyaWFibGVzOwogICAgcHVzaChhYnN0cmFjdFRva2VuICE9IG51bGwgPyBhYnN0cmFjdE1hc2sgOiAwKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5NaXhpbkRlY2xhcmF0aW9uKFRva2VuIG1peGluS2V5d29yZCwgVG9rZW4gbmFtZSkgewogICAgZGVidWdFdmVudCgiYmVnaW5NaXhpbkRlY2xhcmF0aW9uIik7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgIHB1c2godHlwZVZhcmlhYmxlcyA/PyBOdWxsVmFsdWUuVHlwZVZhcmlhYmxlcyk7CiAgICBsaWJyYXJ5LmN1cnJlbnREZWNsYXJhdGlvbgogICAgICAuLm5hbWUgPSBuYW1lLmxleGVtZQogICAgICAuLmNoYXJPZmZzZXQgPSBuYW1lLmNoYXJPZmZzZXQKICAgICAgLi50eXBlVmFyaWFibGVzID0gdHlwZVZhcmlhYmxlczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DbGFzc09yTWl4aW5Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkNsYXNzT3JNaXhpbkJvZHkiKTsKICAgIC8vIFJlc29sdmUgdW5yZXNvbHZlZCB0eXBlcyBmcm9tIHRoZSBjbGFzcyBoZWFkZXIgKGkuZS4sIHN1cGVyY2xhc3MsIG1peGlucywKICAgIC8vIGFuZCBpbXBsZW1lbnRlZCB0eXBlcykgYmVmb3JlIGFkZGluZyBtZW1iZXJzIGZyb20gdGhlIGNsYXNzIGJvZHkgd2hpY2gKICAgIC8vIHNob3VsZCBub3Qgc2hhZG93IHRoZXNlIHVucmVzb2x2ZWQgdHlwZXMuCiAgICBsaWJyYXJ5LmN1cnJlbnREZWNsYXJhdGlvbgogICAgICAgIC5yZXNvbHZlVHlwZXMobGlicmFyeS5jdXJyZW50RGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcywgbGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTmFtZWRNaXhpbkFwcGxpY2F0aW9uKAogICAgICBUb2tlbiBiZWdpbiwgVG9rZW4gYWJzdHJhY3RUb2tlbiwgVG9rZW4gbmFtZSkgewogICAgZGVidWdFdmVudCgiYmVnaW5OYW1lZE1peGluQXBwbGljYXRpb24iKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBvcCgpOwogICAgcHVzaCh0eXBlVmFyaWFibGVzID8/IE51bGxWYWx1ZS5UeXBlVmFyaWFibGVzKTsKICAgIGxpYnJhcnkuY3VycmVudERlY2xhcmF0aW9uCiAgICAgIC4ubmFtZSA9IG5hbWUubGV4ZW1lCiAgICAgIC4uY2hhck9mZnNldCA9IG5hbWUuY2hhck9mZnNldAogICAgICAuLnR5cGVWYXJpYWJsZXMgPSB0eXBlVmFyaWFibGVzOwogICAgcHVzaChhYnN0cmFjdFRva2VuICE9IG51bGwgPyBhYnN0cmFjdE1hc2sgOiAwKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2xhc3NPck1peGluSW1wbGVtZW50cygKICAgICAgVG9rZW4gaW1wbGVtZW50c0tleXdvcmQsIGludCBpbnRlcmZhY2VzQ291bnQpIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzT3JNaXhpbkltcGxlbWVudHMiKTsKICAgIHB1c2goY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8TmFtZWRUeXBlQnVpbGRlcj4oKQogICAgICAgICAgICAucG9wKHN0YWNrLCBpbnRlcmZhY2VzQ291bnQpID8/CiAgICAgICAgTnVsbFZhbHVlLlR5cGVCdWlsZGVyTGlzdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVJlY292ZXJDbGFzc0hlYWRlcigpIHsKICAgIGRlYnVnRXZlbnQoImhhbmRsZVJlY292ZXJDbGFzc0hlYWRlciIpOwogICAgcG9wKE51bGxWYWx1ZS5UeXBlQnVpbGRlckxpc3QpOyAvLyBJbnRlcmZhY2VzLgogICAgcG9wKCk7IC8vIFN1cGVydHlwZSBvZmZzZXQuCiAgICBwb3AoKTsgLy8gU3VwZXJ0eXBlLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVSZWNvdmVyTWl4aW5IZWFkZXIoKSB7CiAgICBkZWJ1Z0V2ZW50KCJoYW5kbGVSZWNvdmVyTWl4aW5IZWFkZXIiKTsKICAgIHBvcChOdWxsVmFsdWUuVHlwZUJ1aWxkZXJMaXN0KTsgLy8gSW50ZXJmYWNlcy4KICAgIHBvcChOdWxsVmFsdWUuVHlwZUJ1aWxkZXJMaXN0KTsgLy8gU3VwZXJ0eXBlIGNvbnN0cmFpbnRzLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc0V4dGVuZHMoVG9rZW4gZXh0ZW5kc0tleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoImhhbmRsZUNsYXNzRXh0ZW5kcyIpOwogICAgcHVzaChleHRlbmRzS2V5d29yZD8uY2hhck9mZnNldCA/PyAtMSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU1peGluT24oVG9rZW4gb25LZXl3b3JkLCBpbnQgdHlwZUNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJoYW5kbGVNaXhpbk9uIik7CiAgICBwdXNoKGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PE5hbWVkVHlwZUJ1aWxkZXI+KCkucG9wKHN0YWNrLCB0eXBlQ291bnQpID8/CiAgICAgICAgbmV3IFBhcnNlclJlY292ZXJ5KG9mZnNldEZvclRva2VuKG9uS2V5d29yZCkpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2xhc3NEZWNsYXJhdGlvbihUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiZW5kQ2xhc3NEZWNsYXJhdGlvbiIpOwogICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoYmVnaW5Ub2tlbik7CiAgICBMaXN0PFR5cGVCdWlsZGVyPiBpbnRlcmZhY2VzID0gcG9wKE51bGxWYWx1ZS5UeXBlQnVpbGRlckxpc3QpOwogICAgaW50IHN1cGVydHlwZU9mZnNldCA9IHBvcCgpOwogICAgVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlID0gbnVsbElmUGFyc2VyUmVjb3ZlcnkocG9wKCkpOwogICAgaW50IG1vZGlmaWVycyA9IHBvcCgpOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcG9wKCk7CiAgICBpbnQgbmFtZU9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIGlmICh0eXBlVmFyaWFibGVzICE9IG51bGwgJiYgc3VwZXJ0eXBlIGlzIE1peGluQXBwbGljYXRpb25CdWlsZGVyKSB7CiAgICAgIHN1cGVydHlwZS50eXBlVmFyaWFibGVzID0gdHlwZVZhcmlhYmxlczsKICAgIH0KICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eShiZWdpblRva2VuLmNoYXJPZmZzZXQpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgbGlicmFyeS5lbmROZXN0ZWREZWNsYXJhdGlvbigiPHN5bnRheC1lcnJvcj4iKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZpbmFsIGludCBzdGFydENoYXJPZmZzZXQgPQogICAgICAgIG1ldGFkYXRhID09IG51bGwgPyBiZWdpblRva2VuLmNoYXJPZmZzZXQgOiBtZXRhZGF0YS5maXJzdC5jaGFyT2Zmc2V0OwoKICAgIGxpYnJhcnkuYWRkQ2xhc3MoCiAgICAgICAgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgbW9kaWZpZXJzLAogICAgICAgIG5hbWUsCiAgICAgICAgdHlwZVZhcmlhYmxlcywKICAgICAgICBzdXBlcnR5cGUsCiAgICAgICAgaW50ZXJmYWNlcywKICAgICAgICBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgbmFtZU9mZnNldCwKICAgICAgICBlbmRUb2tlbi5jaGFyT2Zmc2V0LAogICAgICAgIHN1cGVydHlwZU9mZnNldCk7CiAgfQoKICBPYmplY3QgbnVsbElmUGFyc2VyUmVjb3ZlcnkoT2JqZWN0IG5vZGUpIHsKICAgIHJldHVybiBub2RlIGlzIFBhcnNlclJlY292ZXJ5ID8gbnVsbCA6IG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1peGluRGVjbGFyYXRpb24oVG9rZW4gbWl4aW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZE1peGluRGVjbGFyYXRpb24iKTsKICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCA9IGdldERvY3VtZW50YXRpb25Db21tZW50KG1peGluVG9rZW4pOwogICAgTGlzdDxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlcyA9IHBvcChOdWxsVmFsdWUuVHlwZUJ1aWxkZXJMaXN0KTsKICAgIExpc3Q8VHlwZUJ1aWxkZXI+IHN1cGVydHlwZUNvbnN0cmFpbnRzID0gbnVsbElmUGFyc2VyUmVjb3ZlcnkocG9wKCkpOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcG9wKE51bGxWYWx1ZS5UeXBlVmFyaWFibGVzKTsKICAgIGludCBuYW1lT2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhID0gcG9wKE51bGxWYWx1ZS5NZXRhZGF0YSk7CiAgICBjaGVja0VtcHR5KG1peGluVG9rZW4uY2hhck9mZnNldCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBsaWJyYXJ5LmVuZE5lc3RlZERlY2xhcmF0aW9uKCI8c3ludGF4LWVycm9yPiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgc3RhcnRPZmZzZXQgPQogICAgICAgIG1ldGFkYXRhID09IG51bGwgPyBtaXhpblRva2VuLmNoYXJPZmZzZXQgOiBtZXRhZGF0YS5maXJzdC5jaGFyT2Zmc2V0OwogICAgVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlOwogICAgaWYgKHN1cGVydHlwZUNvbnN0cmFpbnRzICE9IG51bGwgJiYgc3VwZXJ0eXBlQ29uc3RyYWludHMuaXNOb3RFbXB0eSkgewogICAgICBpZiAoc3VwZXJ0eXBlQ29uc3RyYWludHMubGVuZ3RoID09IDEpIHsKICAgICAgICBzdXBlcnR5cGUgPSBzdXBlcnR5cGVDb25zdHJhaW50cy5maXJzdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdXBlcnR5cGUgPSBuZXcgTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIoCiAgICAgICAgICAgIHN1cGVydHlwZUNvbnN0cmFpbnRzLmZpcnN0LCBzdXBlcnR5cGVDb25zdHJhaW50cy5za2lwKDEpLnRvTGlzdCgpKTsKICAgICAgfQogICAgfQogICAgbGlicmFyeS5hZGRDbGFzcygKICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBtaXhpbkRlY2xhcmF0aW9uTWFzaywKICAgICAgICBuYW1lLAogICAgICAgIHR5cGVWYXJpYWJsZXMsCiAgICAgICAgc3VwZXJ0eXBlLAogICAgICAgIGludGVyZmFjZXMsCiAgICAgICAgc3RhcnRPZmZzZXQsCiAgICAgICAgbmFtZU9mZnNldCwKICAgICAgICBlbmRUb2tlbi5jaGFyT2Zmc2V0LAogICAgICAgIC0xKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5FeHRlbnNpb25EZWNsYXJhdGlvbihUb2tlbiBleHRlbnNpb25LZXl3b3JkLCBUb2tlbiBuYW1lVG9rZW4pIHsKICAgIGFzc2VydChjaGVja1N0YXRlKGV4dGVuc2lvbktleXdvcmQsCiAgICAgICAgW1ZhbHVlS2luZC5UeXBlVmFyaWFibGVMaXN0T3JOdWxsLCBWYWx1ZUtpbmQuTWV0YWRhdGFMaXN0T3JOdWxsXSkpOwogICAgZGVidWdFdmVudCgiYmVnaW5FeHRlbnNpb25EZWNsYXJhdGlvbiIpOwogICAgbGlicmFyeS5iZWdpbk5lc3RlZERlY2xhcmF0aW9uKCJleHRlbnNpb24iKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBvcCgpOwogICAgaW50IG9mZnNldCA9IG5hbWVUb2tlbj8uY2hhck9mZnNldCA/PyBleHRlbnNpb25LZXl3b3JkLmNoYXJPZmZzZXQ7CiAgICBTdHJpbmcgbmFtZSA9IG5hbWVUb2tlbj8ubGV4ZW1lID8/CiAgICAgICAgLy8gU3ludGhlc2l6ZWQgbmFtZSB1c2VkIGludGVybmFsbHkuCiAgICAgICAgJ2V4dGVuc2lvbi0ke3VubmFtZWRFeHRlbnNpb25Db3VudGVyKyt9JzsKICAgIHB1c2gobmFtZSk7CiAgICBwdXNoKG9mZnNldCk7CiAgICBwdXNoKHR5cGVWYXJpYWJsZXMgPz8gTnVsbFZhbHVlLlR5cGVWYXJpYWJsZXMpOwogICAgbGlicmFyeS5jdXJyZW50RGVjbGFyYXRpb24KICAgICAgLi5uYW1lID0gbmFtZQogICAgICAuLmNoYXJPZmZzZXQgPSBvZmZzZXQKICAgICAgLi50eXBlVmFyaWFibGVzID0gdHlwZVZhcmlhYmxlczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRXh0ZW5zaW9uRGVjbGFyYXRpb24oCiAgICAgIFRva2VuIGV4dGVuc2lvbktleXdvcmQsIFRva2VuIG9uS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGFzc2VydChjaGVja1N0YXRlKGV4dGVuc2lvbktleXdvcmQsIFsKICAgICAgVmFsdWVLaW5kLlR5cGVCdWlsZGVyLAogICAgICBWYWx1ZUtpbmQuVHlwZVZhcmlhYmxlTGlzdE9yTnVsbCwKICAgICAgVmFsdWVLaW5kLkludGVnZXIsCiAgICAgIFZhbHVlS2luZC5OYW1lT3JOdWxsLAogICAgICBWYWx1ZUtpbmQuTWV0YWRhdGFMaXN0T3JOdWxsCiAgICBdKSk7CiAgICBkZWJ1Z0V2ZW50KCJlbmRFeHRlbnNpb25EZWNsYXJhdGlvbiIpOwogICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoZXh0ZW5zaW9uS2V5d29yZCk7CiAgICBUeXBlQnVpbGRlciBzdXBlcnR5cGUgPSBwb3AoKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBvcChOdWxsVmFsdWUuVHlwZVZhcmlhYmxlcyk7CiAgICBpbnQgbmFtZU9mZnNldCA9IHBvcCgpOwogICAgU3RyaW5nIG5hbWUgPSBwb3AoTnVsbFZhbHVlLk5hbWUpOwogICAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgICBuYW1lT2Zmc2V0ID0gZXh0ZW5zaW9uS2V5d29yZC5jaGFyT2Zmc2V0OwogICAgICBuYW1lID0gJyRuYW1lT2Zmc2V0JzsKICAgIH0KICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcChOdWxsVmFsdWUuTWV0YWRhdGEpOwogICAgY2hlY2tFbXB0eShleHRlbnNpb25LZXl3b3JkLmNoYXJPZmZzZXQpOwogICAgaW50IHN0YXJ0T2Zmc2V0ID0gbWV0YWRhdGEgPT0gbnVsbAogICAgICAgID8gZXh0ZW5zaW9uS2V5d29yZC5jaGFyT2Zmc2V0CiAgICAgICAgOiBtZXRhZGF0YS5maXJzdC5jaGFyT2Zmc2V0OwogICAgbGlicmFyeS5hZGRFeHRlbnNpb25EZWNsYXJhdGlvbigKICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBleHRlbnNpb25EZWNsYXJhdGlvbk1hc2ssCiAgICAgICAgbmFtZSwKICAgICAgICB0eXBlVmFyaWFibGVzLAogICAgICAgIHN1cGVydHlwZSwKICAgICAgICBzdGFydE9mZnNldCwKICAgICAgICBuYW1lT2Zmc2V0LAogICAgICAgIGVuZFRva2VuLmNoYXJPZmZzZXQpOwogIH0KCiAgUHJvY2VkdXJlS2luZCBjb21wdXRlUHJvY2VkdXJlS2luZChUb2tlbiB0b2tlbikgewogICAgaWYgKHRva2VuID09IG51bGwpIHJldHVybiBQcm9jZWR1cmVLaW5kLk1ldGhvZDsKICAgIGlmIChvcHRpb25hbCgiZ2V0IiwgdG9rZW4pKSByZXR1cm4gUHJvY2VkdXJlS2luZC5HZXR0ZXI7CiAgICBpZiAob3B0aW9uYWwoInNldCIsIHRva2VuKSkgcmV0dXJuIFByb2NlZHVyZUtpbmQuU2V0dGVyOwogICAgcmV0dXJuIHVuaGFuZGxlZCgKICAgICAgICB0b2tlbi5sZXhlbWUsICJjb21wdXRlUHJvY2VkdXJlS2luZCIsIHRva2VuLmNoYXJPZmZzZXQsIHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVG9wTGV2ZWxNZXRob2QoVG9rZW4gbGFzdENvbnN1bWVkLCBUb2tlbiBleHRlcm5hbFRva2VuKSB7CiAgICBsaWJyYXJ5LmJlZ2luTmVzdGVkRGVjbGFyYXRpb24oIiNtZXRob2QiLCBoYXNNZW1iZXJzOiBmYWxzZSk7CiAgICBwdXNoKGV4dGVybmFsVG9rZW4gIT0gbnVsbCA/IGV4dGVybmFsTWFzayA6IDApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUb3BMZXZlbE1ldGhvZChUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBnZXRPclNldCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZFRvcExldmVsTWV0aG9kIik7CiAgICBNZXRob2RCb2R5IGtpbmQgPSBwb3AoKTsKICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9IHBvcCgpOwogICAgaW50IGZvcm1hbHNPZmZzZXQgPSBwb3AoKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBvcCgpOwogICAgaW50IGNoYXJPZmZzZXQgPSBwb3AoKTsKICAgIE9iamVjdCBuYW1lID0gcG9wKCk7CiAgICBUeXBlQnVpbGRlciByZXR1cm5UeXBlID0gcG9wKCk7CiAgICBib29sIGlzQWJzdHJhY3QgPSBraW5kID09IE1ldGhvZEJvZHkuQWJzdHJhY3Q7CiAgICBpZiAoZ2V0T3JTZXQgIT0gbnVsbCAmJiBvcHRpb25hbCgic2V0IiwgZ2V0T3JTZXQpKSB7CiAgICAgIGlmIChmb3JtYWxzID09IG51bGwgfHwgZm9ybWFscy5sZW5ndGggIT0gMSkgewogICAgICAgIC8vIFRoaXMgaXNuJ3QgYWJzdHJhY3QgYXMgd2UnbGwgYWRkIGFuIGVycm9yLXJlY292ZXJ5IG5vZGUgaW4KICAgICAgICAvLyBbQm9keUJ1aWxkZXIuZmluaXNoRnVuY3Rpb25dLgogICAgICAgIGlzQWJzdHJhY3QgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaW50IG1vZGlmaWVycyA9IHBvcCgpOwogICAgaWYgKGlzQWJzdHJhY3QpIHsKICAgICAgbW9kaWZpZXJzIHw9IGFic3RyYWN0TWFzazsKICAgIH0KICAgIGlmIChuYXRpdmVNZXRob2ROYW1lICE9IG51bGwpIHsKICAgICAgbW9kaWZpZXJzIHw9IGV4dGVybmFsTWFzazsKICAgIH0KICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eShiZWdpblRva2VuLmNoYXJPZmZzZXQpOwogICAgbGlicmFyeQogICAgICAgIC5lbmROZXN0ZWREZWNsYXJhdGlvbigiI21ldGhvZCIpCiAgICAgICAgLnJlc29sdmVUeXBlcyh0eXBlVmFyaWFibGVzLCBsaWJyYXJ5KTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSByZXR1cm47CiAgICBmaW5hbCBpbnQgc3RhcnRDaGFyT2Zmc2V0ID0KICAgICAgICBtZXRhZGF0YSA9PSBudWxsID8gYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0IDogbWV0YWRhdGEuZmlyc3QuY2hhck9mZnNldDsKICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCA9IGdldERvY3VtZW50YXRpb25Db21tZW50KGJlZ2luVG9rZW4pOwogICAgbGlicmFyeS5hZGRQcm9jZWR1cmUoCiAgICAgICAgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgbW9kaWZpZXJzLAogICAgICAgIHJldHVyblR5cGUsCiAgICAgICAgbmFtZSwKICAgICAgICB0eXBlVmFyaWFibGVzLAogICAgICAgIGZvcm1hbHMsCiAgICAgICAgY29tcHV0ZVByb2NlZHVyZUtpbmQoZ2V0T3JTZXQpLAogICAgICAgIHN0YXJ0Q2hhck9mZnNldCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGZvcm1hbHNPZmZzZXQsCiAgICAgICAgZW5kVG9rZW4uY2hhck9mZnNldCwKICAgICAgICBuYXRpdmVNZXRob2ROYW1lLAogICAgICAgIGlzVG9wTGV2ZWw6IHRydWUpOwogICAgbmF0aXZlTWV0aG9kTmFtZSA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keShUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYXRpdmVGdW5jdGlvbkJvZHkiKTsKICAgIGlmIChuYXRpdmVNZXRob2ROYW1lICE9IG51bGwpIHsKICAgICAgcHVzaChNZXRob2RCb2R5LlJlZ3VsYXIpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChNZXRob2RCb2R5LkFic3RyYWN0KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5SWdub3JlZChUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keVNraXBwZWQoVG9rZW4gbmF0aXZlVG9rZW4sIFRva2VuIHNlbWljb2xvbikgewogICAgaWYgKCFlbmFibGVOYXRpdmUpIHsKICAgICAgc3VwZXIuaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIG1lc3NhZ2VFeHBlY3RlZEJsb2NrVG9Ta2lwLCBuYXRpdmVUb2tlbiwgbmF0aXZlVG9rZW4pOwogICAgfQogICAgcHVzaChNZXRob2RCb2R5LlJlZ3VsYXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0Z1bmN0aW9uQm9keShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9GdW5jdGlvbkJvZHkiKTsKICAgIGlmIChuYXRpdmVNZXRob2ROYW1lICE9IG51bGwpIHsKICAgICAgcHVzaChNZXRob2RCb2R5LlJlZ3VsYXIpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChNZXRob2RCb2R5LkFic3RyYWN0KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRnVuY3Rpb25Cb2R5U2tpcHBlZChUb2tlbiB0b2tlbiwgYm9vbCBpc0V4cHJlc3Npb25Cb2R5KSB7CiAgICBkZWJ1Z0V2ZW50KCJoYW5kbGVGdW5jdGlvbkJvZHlTa2lwcGVkIik7CiAgICBwdXNoKE1ldGhvZEJvZHkuUmVndWxhcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTWV0aG9kKFRva2VuIGV4dGVybmFsVG9rZW4sIFRva2VuIHN0YXRpY1Rva2VuLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBUb2tlbiBnZXRPclNldCwgVG9rZW4gbmFtZSkgewogICAgaW5Db25zdHJ1Y3RvciA9CiAgICAgICAgbmFtZT8ubGV4ZW1lID09IGxpYnJhcnkuY3VycmVudERlY2xhcmF0aW9uLm5hbWUgJiYgZ2V0T3JTZXQgPT0gbnVsbDsKICAgIExpc3Q8TW9kaWZpZXI+IG1vZGlmaWVyczsKICAgIGlmIChleHRlcm5hbFRva2VuICE9IG51bGwpIHsKICAgICAgbW9kaWZpZXJzID8/PSA8TW9kaWZpZXI+W107CiAgICAgIG1vZGlmaWVycy5hZGQoRXh0ZXJuYWwpOwogICAgfQogICAgaWYgKHN0YXRpY1Rva2VuICE9IG51bGwpIHsKICAgICAgaWYgKGluQ29uc3RydWN0b3IpIHsKICAgICAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBtZXNzYWdlU3RhdGljQ29uc3RydWN0b3IsIHN0YXRpY1Rva2VuLCBzdGF0aWNUb2tlbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbW9kaWZpZXJzID8/PSA8TW9kaWZpZXI+W107CiAgICAgICAgbW9kaWZpZXJzLmFkZChTdGF0aWMpOwogICAgICB9CiAgICB9CiAgICBpZiAoY292YXJpYW50VG9rZW4gIT0gbnVsbCkgewogICAgICBtb2RpZmllcnMgPz89IDxNb2RpZmllcj5bXTsKICAgICAgbW9kaWZpZXJzLmFkZChDb3ZhcmlhbnQpOwogICAgfQogICAgaWYgKHZhckZpbmFsT3JDb25zdCAhPSBudWxsKSB7CiAgICAgIFN0cmluZyBsZXhlbWUgPSB2YXJGaW5hbE9yQ29uc3QubGV4ZW1lOwogICAgICBpZiAoaWRlbnRpY2FsKCd2YXInLCBsZXhlbWUpKSB7CiAgICAgICAgbW9kaWZpZXJzID8/PSA8TW9kaWZpZXI+W107CiAgICAgICAgbW9kaWZpZXJzLmFkZChWYXIpOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgnZmluYWwnLCBsZXhlbWUpKSB7CiAgICAgICAgbW9kaWZpZXJzID8/PSA8TW9kaWZpZXI+W107CiAgICAgICAgbW9kaWZpZXJzLmFkZChGaW5hbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbW9kaWZpZXJzID8/PSA8TW9kaWZpZXI+W107CiAgICAgICAgbW9kaWZpZXJzLmFkZChDb25zdCk7CiAgICAgIH0KICAgIH0KICAgIHB1c2godmFyRmluYWxPckNvbnN0Py5jaGFyT2Zmc2V0ID8/IC0xKTsKICAgIHB1c2gobW9kaWZpZXJzID8/IE51bGxWYWx1ZS5Nb2RpZmllcnMpOwogICAgbGlicmFyeS5iZWdpbk5lc3RlZERlY2xhcmF0aW9uKCIjbWV0aG9kIiwgaGFzTWVtYmVyczogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNZXRob2QoVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGJlZ2luUGFyYW0sCiAgICAgIFRva2VuIGJlZ2luSW5pdGlhbGl6ZXJzLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiTWV0aG9kIik7CiAgICBNZXRob2RCb2R5IGJvZHlLaW5kID0gcG9wKCk7CiAgICBpZiAoYm9keUtpbmQgPT0gTWV0aG9kQm9keS5SZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KSB7CiAgICAgIC8vIFRoaXMgd2lsbCBjYXVzZSBhbiBlcnJvciBsYXRlci4KICAgICAgcG9wKCk7CiAgICB9CiAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGZvcm1hbHMgPSBwb3AoKTsKICAgIGludCBmb3JtYWxzT2Zmc2V0ID0gcG9wKCk7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgIGludCBjaGFyT2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZU9yT3BlcmF0b3IgPSBwb3AoKTsKICAgIGlmIChPcGVyYXRvci5zdWJ0cmFjdCA9PSBuYW1lT3JPcGVyYXRvciAmJiBmb3JtYWxzID09IG51bGwpIHsKICAgICAgbmFtZU9yT3BlcmF0b3IgPSBPcGVyYXRvci51bmFyeU1pbnVzOwogICAgfQogICAgT2JqZWN0IG5hbWU7CiAgICBQcm9jZWR1cmVLaW5kIGtpbmQ7CiAgICBpZiAobmFtZU9yT3BlcmF0b3IgaXMgT3BlcmF0b3IpIHsKICAgICAgbmFtZSA9IG9wZXJhdG9yVG9TdHJpbmcobmFtZU9yT3BlcmF0b3IpOwogICAgICBraW5kID0gUHJvY2VkdXJlS2luZC5PcGVyYXRvcjsKICAgICAgaW50IHJlcXVpcmVkQXJndW1lbnRDb3VudCA9IG9wZXJhdG9yUmVxdWlyZWRBcmd1bWVudENvdW50KG5hbWVPck9wZXJhdG9yKTsKICAgICAgaWYgKChmb3JtYWxzPy5sZW5ndGggPz8gMCkgIT0gcmVxdWlyZWRBcmd1bWVudENvdW50KSB7CiAgICAgICAgdmFyIHRlbXBsYXRlOwogICAgICAgIHN3aXRjaCAocmVxdWlyZWRBcmd1bWVudENvdW50KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBpZiAoT3BlcmF0b3Iuc3VidHJhY3QgPT0gbmFtZU9yT3BlcmF0b3IpIHsKICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlT3BlcmF0b3JNaW51c1BhcmFtZXRlck1pc21hdGNoOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMjsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdW5oYW5kbGVkKCIkcmVxdWlyZWRBcmd1bWVudENvdW50IiwgIm9wZXJhdG9yUmVxdWlyZWRBcmd1bWVudENvdW50IiwKICAgICAgICAgICAgICAgIGNoYXJPZmZzZXQsIHVyaSk7CiAgICAgICAgfQogICAgICAgIFN0cmluZyBzdHJpbmcgPSBuYW1lOwogICAgICAgIGFkZFByb2JsZW0odGVtcGxhdGUud2l0aEFyZ3VtZW50cyhuYW1lKSwgY2hhck9mZnNldCwgc3RyaW5nLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGZvcm1hbHMgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiBmb3JtYWxzKSB7CiAgICAgICAgICAgIGlmICghZm9ybWFsLmlzUmVxdWlyZWQpIHsKICAgICAgICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VPcGVyYXRvcldpdGhPcHRpb25hbEZvcm1hbHMsIGZvcm1hbC5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICBmb3JtYWwubmFtZS5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBuYW1lID0gbmFtZU9yT3BlcmF0b3I7CiAgICAgIGtpbmQgPSBjb21wdXRlUHJvY2VkdXJlS2luZChnZXRPclNldCk7CiAgICB9CiAgICBUeXBlQnVpbGRlciByZXR1cm5UeXBlID0gcG9wKCk7CiAgICBib29sIGlzQWJzdHJhY3QgPSBib2R5S2luZCA9PSBNZXRob2RCb2R5LkFic3RyYWN0OwogICAgaWYgKGdldE9yU2V0ICE9IG51bGwgJiYgb3B0aW9uYWwoInNldCIsIGdldE9yU2V0KSkgewogICAgICBpZiAoZm9ybWFscyA9PSBudWxsIHx8IGZvcm1hbHMubGVuZ3RoICE9IDEpIHsKICAgICAgICAvLyBUaGlzIGlzbid0IGFic3RyYWN0IGFzIHdlJ2xsIGFkZCBhbiBlcnJvci1yZWNvdmVyeSBub2RlIGluCiAgICAgICAgLy8gW0JvZHlCdWlsZGVyLmZpbmlzaEZ1bmN0aW9uXS4KICAgICAgICBpc0Fic3RyYWN0ID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGludCBtb2RpZmllcnMgPSBNb2RpZmllci52YWxpZGF0ZShwb3AoKSwgaXNBYnN0cmFjdDogaXNBYnN0cmFjdCk7CiAgICBpZiAobmF0aXZlTWV0aG9kTmFtZSAhPSBudWxsKSB7CiAgICAgIG1vZGlmaWVycyB8PSBleHRlcm5hbE1hc2s7CiAgICB9CiAgICBpZiAoKG1vZGlmaWVycyAmIGV4dGVybmFsTWFzaykgIT0gMCkgewogICAgICBtb2RpZmllcnMgJj0gfmFic3RyYWN0TWFzazsKICAgIH0KICAgIGJvb2wgaXNDb25zdCA9IChtb2RpZmllcnMgJiBjb25zdE1hc2spICE9IDA7CiAgICBpbnQgdmFyRmluYWxPckNvbnN0T2Zmc2V0ID0gcG9wKCk7CiAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCA9IGdldERvY3VtZW50YXRpb25Db21tZW50KGJlZ2luVG9rZW4pOwogICAgbGlicmFyeQogICAgICAgIC5lbmROZXN0ZWREZWNsYXJhdGlvbigiI21ldGhvZCIpCiAgICAgICAgLnJlc29sdmVUeXBlcyh0eXBlVmFyaWFibGVzLCBsaWJyYXJ5KTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIG5hdGl2ZU1ldGhvZE5hbWUgPSBudWxsOwogICAgICBpbkNvbnN0cnVjdG9yID0gZmFsc2U7CiAgICAgIHJldHVybjsKICAgIH0KICAgIFN0cmluZyBjb25zdHJ1Y3Rvck5hbWUgPQogICAgICAgIGtpbmQgPT0gUHJvY2VkdXJlS2luZC5HZXR0ZXIgfHwga2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcgogICAgICAgICAgICA/IG51bGwKICAgICAgICAgICAgOiBsaWJyYXJ5LmNvbXB1dGVBbmRWYWxpZGF0ZUNvbnN0cnVjdG9yTmFtZShuYW1lLCBjaGFyT2Zmc2V0KTsKICAgIGlmIChjb25zdHJ1Y3Rvck5hbWUgIT0gbnVsbCkgewogICAgICBpZiAoaXNDb25zdCAmJiBib2R5S2luZCAhPSBNZXRob2RCb2R5LkFic3RyYWN0KSB7CiAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvcldpdGhCb2R5LCB2YXJGaW5hbE9yQ29uc3RPZmZzZXQsIDUpOwogICAgICAgIG1vZGlmaWVycyAmPSB+Y29uc3RNYXNrOwogICAgICB9CiAgICAgIGlmIChyZXR1cm5UeXBlICE9IG51bGwpIHsKICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVwb3J0IHRoaXMgZXJyb3Igb24gdGhlIHJldHVybiB0eXBlCiAgICAgICAgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFJldHVyblR5cGUsIGJlZ2luVG9rZW4sIGJlZ2luVG9rZW4pOwogICAgICAgIHJldHVyblR5cGUgPSBudWxsOwogICAgICB9CiAgICAgIGZpbmFsIGludCBzdGFydENoYXJPZmZzZXQgPQogICAgICAgICAgbWV0YWRhdGEgPT0gbnVsbCA/IGJlZ2luVG9rZW4uY2hhck9mZnNldCA6IG1ldGFkYXRhLmZpcnN0LmNoYXJPZmZzZXQ7CiAgICAgIGxpYnJhcnkuYWRkQ29uc3RydWN0b3IoCiAgICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgbW9kaWZpZXJzLAogICAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICAgIG5hbWUsCiAgICAgICAgICBjb25zdHJ1Y3Rvck5hbWUsCiAgICAgICAgICB0eXBlVmFyaWFibGVzLAogICAgICAgICAgZm9ybWFscywKICAgICAgICAgIHN0YXJ0Q2hhck9mZnNldCwKICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICBmb3JtYWxzT2Zmc2V0LAogICAgICAgICAgZW5kVG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUsCiAgICAgICAgICBiZWdpbkluaXRpYWxpemVyczogYmVnaW5Jbml0aWFsaXplcnMpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGlzQ29uc3QpIHsKICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VDb25zdE1ldGhvZCwgdmFyRmluYWxPckNvbnN0T2Zmc2V0LCA1KTsKICAgICAgICBtb2RpZmllcnMgJj0gfmNvbnN0TWFzazsKICAgICAgfQogICAgICBmaW5hbCBpbnQgc3RhcnRDaGFyT2Zmc2V0ID0KICAgICAgICAgIG1ldGFkYXRhID09IG51bGwgPyBiZWdpblRva2VuLmNoYXJPZmZzZXQgOiBtZXRhZGF0YS5maXJzdC5jaGFyT2Zmc2V0OwogICAgICBsaWJyYXJ5LmFkZFByb2NlZHVyZSgKICAgICAgICAgIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICBtb2RpZmllcnMsCiAgICAgICAgICByZXR1cm5UeXBlLAogICAgICAgICAgbmFtZSwKICAgICAgICAgIHR5cGVWYXJpYWJsZXMsCiAgICAgICAgICBmb3JtYWxzLAogICAgICAgICAga2luZCwKICAgICAgICAgIHN0YXJ0Q2hhck9mZnNldCwKICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICBmb3JtYWxzT2Zmc2V0LAogICAgICAgICAgZW5kVG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUsCiAgICAgICAgICBpc1RvcExldmVsOiBmYWxzZSk7CiAgICB9CiAgICBuYXRpdmVNZXRob2ROYW1lID0gbnVsbDsKICAgIGluQ29uc3RydWN0b3IgPSBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmFtZWRNaXhpbkFwcGxpY2F0aW9uV2l0aENsYXVzZShUb2tlbiB3aXRoS2V5d29yZCkgewogICAgZGVidWdFdmVudCgiTmFtZWRNaXhpbkFwcGxpY2F0aW9uV2l0aENsYXVzZSIpOwogICAgT2JqZWN0IG1peGlucyA9IHBvcCgpOwogICAgT2JqZWN0IHN1cGVydHlwZSA9IHBvcCgpOwogICAgaWYgKG1peGlucyBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKG1peGlucyk7CiAgICB9IGVsc2UgaWYgKHN1cGVydHlwZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKHN1cGVydHlwZSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKGxpYnJhcnkuYWRkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgICAgIHN1cGVydHlwZSwgbWl4aW5zLCB3aXRoS2V5d29yZC5jaGFyT2Zmc2V0KSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE5hbWVkTWl4aW5BcHBsaWNhdGlvbihUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBjbGFzc0tleXdvcmQsCiAgICAgIFRva2VuIGVxdWFscywgVG9rZW4gaW1wbGVtZW50c0tleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmROYW1lZE1peGluQXBwbGljYXRpb24iKTsKICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCA9IGdldERvY3VtZW50YXRpb25Db21tZW50KGJlZ2luVG9rZW4pOwogICAgTGlzdDxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlcyA9IHBvcElmTm90TnVsbChpbXBsZW1lbnRzS2V5d29yZCk7CiAgICBPYmplY3QgbWl4aW5BcHBsaWNhdGlvbiA9IHBvcCgpOwogICAgaW50IG1vZGlmaWVycyA9IHBvcCgpOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcG9wKCk7CiAgICBpbnQgY2hhck9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eShiZWdpblRva2VuLmNoYXJPZmZzZXQpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkgfHwgbWl4aW5BcHBsaWNhdGlvbiBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBsaWJyYXJ5LmVuZE5lc3RlZERlY2xhcmF0aW9uKCI8c3ludGF4LWVycm9yPiIpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaW50IHN0YXJ0Q2hhck9mZnNldCA9IGJlZ2luVG9rZW4uY2hhck9mZnNldDsKICAgIGludCBjaGFyRW5kT2Zmc2V0ID0gZW5kVG9rZW4uY2hhck9mZnNldDsKICAgIGxpYnJhcnkuYWRkTmFtZWRNaXhpbkFwcGxpY2F0aW9uKAogICAgICAgIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIG5hbWUsCiAgICAgICAgdHlwZVZhcmlhYmxlcywKICAgICAgICBtb2RpZmllcnMsCiAgICAgICAgbWl4aW5BcHBsaWNhdGlvbiwKICAgICAgICBpbnRlcmZhY2VzLAogICAgICAgIHN0YXJ0Q2hhck9mZnNldCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJFbmRPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUeXBlQXJndW1lbnRzKGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlR5cGVBcmd1bWVudHMiKTsKICAgIHB1c2goY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8VHlwZUJ1aWxkZXI+KCkucG9wKHN0YWNrLCBjb3VudCkgPz8KICAgICAgICBOdWxsVmFsdWUuVHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRUeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbnZhbGlkVHlwZUFyZ3VtZW50cyIpOwogICAgcG9wKE51bGxWYWx1ZS5UeXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU2NyaXB0KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJTY3JpcHQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9uTnVsbEFzc2VydEV4cHJlc3Npb24oVG9rZW4gYmFuZykgewogICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlTm9uTnVsbGFibGUpIHsKICAgICAgcmVwb3J0Tm9uTnVsbEFzc2VydEV4cHJlc3Npb25Ob3RFbmFibGVkKGJhbmcpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVUeXBlKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHF1ZXN0aW9uTWFyaykgewogICAgZGVidWdFdmVudCgiVHlwZSIpOwogICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlTm9uTnVsbGFibGUpIHsKICAgICAgcmVwb3J0RXJyb3JJZk51bGxhYmxlVHlwZShxdWVzdGlvbk1hcmspOwogICAgfQogICAgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzID0gcG9wKCk7CiAgICBpbnQgY2hhck9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gobmFtZSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKGxpYnJhcnkuYWRkTmFtZWRUeXBlKG5hbWUsIGFyZ3VtZW50cywgY2hhck9mZnNldCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUeXBlTGlzdChpbnQgY291bnQpIHsKICAgIGRlYnVnRXZlbnQoIlR5cGVMaXN0Iik7CiAgICBwdXNoKGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PE5hbWVkVHlwZUJ1aWxkZXI+KCkucG9wKHN0YWNrLCBjb3VudCkgPz8KICAgICAgICBuZXcgUGFyc2VyUmVjb3ZlcnkoLTEpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9UeXBlVmFyaWFibGVzKFRva2VuIHRva2VuKSB7CiAgICBzdXBlci5oYW5kbGVOb1R5cGVWYXJpYWJsZXModG9rZW4pOwogICAgaW5Db25zdHJ1Y3Rvck5hbWUgPSBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVm9pZEtleXdvcmQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlZvaWRLZXl3b3JkIik7CiAgICBwdXNoKGxpYnJhcnkuYWRkVm9pZFR5cGUodG9rZW4uY2hhck9mZnNldCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvcm1hbFBhcmFtZXRlcihUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kLCBUb2tlbiByZXF1aXJlZFRva2VuLAogICAgICBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwgVG9rZW4gdmFyRmluYWxPckNvbnN0KSB7CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogaGFuZGxlIHJlcXVpcmVkIHRva2VuCiAgICBpZiAoIWxpYnJhcnkubG9hZGVyLnRhcmdldC5lbmFibGVOb25OdWxsYWJsZSkgewogICAgICByZXBvcnROb25OdWxsYWJsZU1vZGlmaWVyRXJyb3IocmVxdWlyZWRUb2tlbik7CiAgICB9CiAgICBwdXNoKChjb3ZhcmlhbnRUb2tlbiAhPSBudWxsID8gY292YXJpYW50TWFzayA6IDApIHwKICAgICAgICBNb2RpZmllci52YWxpZGF0ZVZhckZpbmFsT3JDb25zdCh2YXJGaW5hbE9yQ29uc3Q/LmxleGVtZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXIoCiAgICAgIFRva2VuIHRoaXNLZXl3b3JkLAogICAgICBUb2tlbiBwZXJpb2RBZnRlclRoaXMsCiAgICAgIFRva2VuIG5hbWVUb2tlbiwKICAgICAgVG9rZW4gaW5pdGlhbGl6ZXJTdGFydCwKICAgICAgVG9rZW4gaW5pdGlhbGl6ZXJFbmQsCiAgICAgIEZvcm1hbFBhcmFtZXRlcktpbmQga2luZCwKICAgICAgTWVtYmVyS2luZCBtZW1iZXJLaW5kKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JtYWxQYXJhbWV0ZXIiKTsKICAgIGludCBjaGFyT2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgVHlwZUJ1aWxkZXIgdHlwZSA9IG51bGxJZlBhcnNlclJlY292ZXJ5KHBvcCgpKTsKICAgIGludCBtb2RpZmllcnMgPSBwb3AoKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobGlicmFyeS5hZGRGb3JtYWxQYXJhbWV0ZXIobWV0YWRhdGEsIG1vZGlmaWVycywgdHlwZSwgbmFtZSwKICAgICAgICAgIHRoaXNLZXl3b3JkICE9IG51bGwsIGNoYXJPZmZzZXQsIGluaXRpYWxpemVyU3RhcnQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uKCkgewogICAgLy8gSWdub3JlZCBmb3Igbm93LgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uKCkgewogICAgZGVidWdFdmVudCgiRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbiIpOwogICAgLy8gSWdub3JlZCBmb3Igbm93LgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVWYWx1ZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gZXF1YWxzLCBUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiVmFsdWVkRm9ybWFsUGFyYW1ldGVyIik7CiAgICAvLyBJZ25vcmVkIGZvciBub3cuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiRm9ybWFsUGFyYW1ldGVyV2l0aG91dFZhbHVlIik7CiAgICAvLyBJZ25vcmVkIGZvciBub3cuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE9wdGlvbmFsRm9ybWFsUGFyYW1ldGVycygKICAgICAgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzIik7CiAgICBGb3JtYWxQYXJhbWV0ZXJLaW5kIGtpbmQgPSBvcHRpb25hbCgieyIsIGJlZ2luVG9rZW4pCiAgICAgICAgPyBGb3JtYWxQYXJhbWV0ZXJLaW5kLm9wdGlvbmFsTmFtZWQKICAgICAgICA6IEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxQb3NpdGlvbmFsOwogICAgLy8gV2hlbiByZWNvdmVyaW5nIGZyb20gYW4gZW1wdHkgbGlzdCBvZiBvcHRpb25hbCBhcmd1bWVudHMsIGNvdW50IG1heSBiZQogICAgLy8gMC4gSXQgbWlnaHQgYmUgc2ltcGxlciBpZiB0aGUgcGFyc2VyIGRpZG4ndCBjYWxsIHRoaXMgbWV0aG9kIGluIHRoYXQKICAgIC8vIGNhc2UsIGhvd2V2ZXIsIHRoZW4gW2JlZ2luT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzXSB3b3VsZG4ndCBhbHdheXMgYmUKICAgIC8vIG1hdGNoZWQgYnkgdGhpcyBtZXRob2QuCiAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IHBhcmFtZXRlcnMgPQogICAgICAgIGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KCkucG9wKHN0YWNrLCBjb3VudCk7CiAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsKSB7CiAgICAgIHB1c2gobmV3IFBhcnNlclJlY292ZXJ5KG9mZnNldEZvclRva2VuKGJlZ2luVG9rZW4pKSk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgcGFyYW1ldGVyIGluIHBhcmFtZXRlcnMpIHsKICAgICAgICBwYXJhbWV0ZXIua2luZCA9IGtpbmQ7CiAgICAgIH0KICAgICAgcHVzaChwYXJhbWV0ZXJzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ybWFsUGFyYW1ldGVycygKICAgICAgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JtYWxQYXJhbWV0ZXJzIik7CiAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGZvcm1hbHM7CiAgICBpZiAoY291bnQgPT0gMSkgewogICAgICBPYmplY3QgbGFzdCA9IHBvcCgpOwogICAgICBpZiAobGFzdCBpcyBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KSB7CiAgICAgICAgZm9ybWFscyA9IGxhc3Q7CiAgICAgIH0gZWxzZSBpZiAobGFzdCBpcyEgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgICBhc3NlcnQobGFzdCAhPSBudWxsKTsKICAgICAgICBmb3JtYWxzID0gbmV3IExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4oMSk7CiAgICAgICAgZm9ybWFsc1swXSA9IGxhc3Q7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY291bnQgPiAxKSB7CiAgICAgIE9iamVjdCBsYXN0ID0gcG9wKCk7CiAgICAgIGNvdW50LS07CiAgICAgIGlmIChsYXN0IGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgICAgZGlzY2FyZChjb3VudCk7CiAgICAgIH0gZWxzZSBpZiAobGFzdCBpcyBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KSB7CiAgICAgICAgZm9ybWFscyA9IGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KCkKICAgICAgICAgICAgLnBvcFBhZGRlZChzdGFjaywgY291bnQsIGxhc3QubGVuZ3RoKTsKICAgICAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgICAgICBmb3JtYWxzLnNldFJhbmdlKGNvdW50LCBmb3JtYWxzLmxlbmd0aCwgbGFzdCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvcm1hbHMgPSBjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPigpCiAgICAgICAgICAgIC5wb3BQYWRkZWQoc3RhY2ssIGNvdW50LCAxKTsKICAgICAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgICAgICBmb3JtYWxzW2NvdW50XSA9IGxhc3Q7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGFzc2VydChmb3JtYWxzLmlzTm90RW1wdHkpOwogICAgICBpZiAoZm9ybWFscy5sZW5ndGggPT0gMikgewogICAgICAgIC8vIFRoZSBuYW1lIG1heSBiZSBudWxsIGZvciBnZW5lcmFsaXplZCBmdW5jdGlvbiB0eXBlcy4KICAgICAgICBpZiAoZm9ybWFsc1swXS5uYW1lICE9IG51bGwgJiYgZm9ybWFsc1swXS5uYW1lID09IGZvcm1hbHNbMV0ubmFtZSkgewogICAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lLndpdGhBcmd1bWVudHMoZm9ybWFsc1sxXS5uYW1lKSwKICAgICAgICAgICAgICBmb3JtYWxzWzFdLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgZm9ybWFsc1sxXS5uYW1lLmxlbmd0aCwKICAgICAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmb3JtYWxzWzFdLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgdXJpLCBmb3JtYWxzWzBdLmNoYXJPZmZzZXQsIGZvcm1hbHNbMF0ubmFtZS5sZW5ndGgpCiAgICAgICAgICAgICAgXSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGZvcm1hbHMubGVuZ3RoID4gMikgewogICAgICAgIE1hcDxTdHJpbmcsIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IHNlZW5OYW1lcyA9CiAgICAgICAgICAgIDxTdHJpbmcsIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+e307CiAgICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiBmb3JtYWxzKSB7CiAgICAgICAgICBpZiAoZm9ybWFsLm5hbWUgPT0gbnVsbCkgY29udGludWU7CiAgICAgICAgICBpZiAoc2Vlbk5hbWVzLmNvbnRhaW5zS2V5KGZvcm1hbC5uYW1lKSkgewogICAgICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZS53aXRoQXJndW1lbnRzKGZvcm1hbC5uYW1lKSwKICAgICAgICAgICAgICAgIGZvcm1hbC5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgZm9ybWFsLm5hbWUubGVuZ3RoLAogICAgICAgICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UKICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZvcm1hbC5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIHNlZW5OYW1lc1tmb3JtYWwubmFtZV0uY2hhck9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVuTmFtZXNbZm9ybWFsLm5hbWVdLm5hbWUubGVuZ3RoKQogICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZWVuTmFtZXNbZm9ybWFsLm5hbWVdID0gZm9ybWFsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcHVzaChiZWdpblRva2VuLmNoYXJPZmZzZXQpOwogICAgcHVzaChmb3JtYWxzID8/IE51bGxWYWx1ZS5Gb3JtYWxQYXJhbWV0ZXJzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Gb3JtYWxQYXJhbWV0ZXJzKFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIHB1c2godG9rZW4uY2hhck9mZnNldCk7CiAgICBzdXBlci5oYW5kbGVOb0Zvcm1hbFBhcmFtZXRlcnModG9rZW4sIGtpbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRBc3NlcnQoVG9rZW4gYXNzZXJ0S2V5d29yZCwgQXNzZXJ0IGtpbmQsIFRva2VuIGxlZnRQYXJlbnRoZXNpcywKICAgICAgVG9rZW4gY29tbWFUb2tlbiwgVG9rZW4gc2VtaWNvbG9uVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkFzc2VydCIpOwogICAgLy8gRG8gbm90aGluZwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFbnVtKFRva2VuIGVudW1LZXl3b3JkLCBUb2tlbiBsZWZ0QnJhY2UsIGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiRW51bSIpOwogICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoZW51bUtleXdvcmQpOwogICAgTGlzdDxFbnVtQ29uc3RhbnRJbmZvPiBlbnVtQ29uc3RhbnRJbmZvcyA9CiAgICAgICAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8RW51bUNvbnN0YW50SW5mbz4oKS5wb3Aoc3RhY2ssIGNvdW50KTsKICAgIGludCBjaGFyT2Zmc2V0ID0gcG9wKCk7IC8vIGlkZW50aWZpZXIgY2hhciBvZmZzZXQuCiAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0ID0gZW51bUtleXdvcmQuY2hhck9mZnNldDsKICAgIE9iamVjdCBuYW1lID0gcG9wKCk7CiAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGNoZWNrRW1wdHkoZW51bUtleXdvcmQuY2hhck9mZnNldCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgcmV0dXJuOwogICAgbGlicmFyeS5hZGRFbnVtKGRvY3VtZW50YXRpb25Db21tZW50LCBtZXRhZGF0YSwgbmFtZSwgZW51bUNvbnN0YW50SW5mb3MsCiAgICAgICAgc3RhcnRDaGFyT2Zmc2V0LCBjaGFyT2Zmc2V0LCBsZWZ0QnJhY2U/LmVuZEdyb3VwPy5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5GdW5jdGlvblR5cGVBbGlhcyhUb2tlbiB0b2tlbikgewogICAgbGlicmFyeS5iZWdpbk5lc3RlZERlY2xhcmF0aW9uKCIjdHlwZWRlZiIsIGhhc01lbWJlcnM6IGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5GdW5jdGlvblR5cGUoVG9rZW4gYmVnaW5Ub2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5GdW5jdGlvblR5cGUiKTsKICAgIGxpYnJhcnkuYmVnaW5OZXN0ZWREZWNsYXJhdGlvbigiI2Z1bmN0aW9uX3R5cGUiLCBoYXNNZW1iZXJzOiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5GdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyIik7CiAgICBsaWJyYXJ5LmJlZ2luTmVzdGVkRGVjbGFyYXRpb24oIiNmdW5jdGlvbl90eXBlIiwgaGFzTWVtYmVyczogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGdW5jdGlvblR5cGUoVG9rZW4gZnVuY3Rpb25Ub2tlbiwgVG9rZW4gcXVlc3Rpb25NYXJrKSB7CiAgICBkZWJ1Z0V2ZW50KCJGdW5jdGlvblR5cGUiKTsKICAgIGlmICghbGlicmFyeS5sb2FkZXIudGFyZ2V0LmVuYWJsZU5vbk51bGxhYmxlKSB7CiAgICAgIHJlcG9ydEVycm9ySWZOdWxsYWJsZVR5cGUocXVlc3Rpb25NYXJrKTsKICAgIH0KICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9IHBvcCgpOwogICAgcG9wKCk7IC8vIGZvcm1hbHMgb2Zmc2V0CiAgICBUeXBlQnVpbGRlciByZXR1cm5UeXBlID0gcG9wKCk7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgIHB1c2gobGlicmFyeS5hZGRGdW5jdGlvblR5cGUoCiAgICAgICAgcmV0dXJuVHlwZSwgdHlwZVZhcmlhYmxlcywgZm9ybWFscywgZnVuY3Rpb25Ub2tlbi5jaGFyT2Zmc2V0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gbmFtZVRva2VuLCBUb2tlbiBxdWVzdGlvbikgewogICAgZGVidWdFdmVudCgiRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlciIpOwogICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzID0gcG9wKCk7CiAgICBpbnQgZm9ybWFsc09mZnNldCA9IHBvcCgpOwogICAgVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSA9IHBvcCgpOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcG9wKCk7CiAgICBpZiAoIWxpYnJhcnkubG9hZGVyLnRhcmdldC5lbmFibGVOb25OdWxsYWJsZSkgewogICAgICByZXBvcnRFcnJvcklmTnVsbGFibGVUeXBlKHF1ZXN0aW9uKTsKICAgIH0KICAgIHB1c2gobGlicmFyeS5hZGRGdW5jdGlvblR5cGUoCiAgICAgICAgcmV0dXJuVHlwZSwgdHlwZVZhcmlhYmxlcywgZm9ybWFscywgZm9ybWFsc09mZnNldCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGdW5jdGlvblR5cGVBbGlhcygKICAgICAgVG9rZW4gdHlwZWRlZktleXdvcmQsIFRva2VuIGVxdWFscywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZEZ1bmN0aW9uVHlwZUFsaWFzIik7CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudCh0eXBlZGVmS2V5d29yZCk7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXM7CiAgICBPYmplY3QgbmFtZTsKICAgIGludCBjaGFyT2Zmc2V0OwogICAgRnVuY3Rpb25UeXBlQnVpbGRlciBmdW5jdGlvblR5cGU7CiAgICBpZiAoZXF1YWxzID09IG51bGwpIHsKICAgICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzID0gcG9wKCk7CiAgICAgIHBvcCgpOyAvLyBmb3JtYWxzIG9mZnNldAogICAgICB0eXBlVmFyaWFibGVzID0gcG9wKCk7CiAgICAgIGNoYXJPZmZzZXQgPSBwb3AoKTsKICAgICAgbmFtZSA9IHBvcCgpOwogICAgICBUeXBlQnVpbGRlciByZXR1cm5UeXBlID0gcG9wKCk7CiAgICAgIC8vIENyZWF0ZSBhIG5lc3RlZCBkZWNsYXJhdGlvbiB0aGF0IGlzIGVuZGVkIGJlbG93IGJ5CiAgICAgIC8vIGBsaWJyYXJ5LmFkZEZ1bmN0aW9uVHlwZWAuCiAgICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgICAgcG9wKCk7IC8vIE1ldGFkYXRhLgogICAgICAgIGxpYnJhcnkuZW5kTmVzdGVkRGVjbGFyYXRpb24oIjxzeW50YXgtZXJyb3I+Iik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxpYnJhcnkuYmVnaW5OZXN0ZWREZWNsYXJhdGlvbigiI2Z1bmN0aW9uX3R5cGUiLCBoYXNNZW1iZXJzOiBmYWxzZSk7CiAgICAgIGZ1bmN0aW9uVHlwZSA9CiAgICAgICAgICBsaWJyYXJ5LmFkZEZ1bmN0aW9uVHlwZShyZXR1cm5UeXBlLCBudWxsLCBmb3JtYWxzLCBjaGFyT2Zmc2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciB0eXBlID0gcG9wKCk7CiAgICAgIHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgICAgY2hhck9mZnNldCA9IHBvcCgpOwogICAgICBuYW1lID0gcG9wKCk7CiAgICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgICAgcG9wKCk7IC8vIE1ldGFkYXRhLgogICAgICAgIGxpYnJhcnkuZW5kTmVzdGVkRGVjbGFyYXRpb24oIjxzeW50YXgtZXJyb3I+Iik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZUJ1aWxkZXIpIHsKICAgICAgICAvLyBUT0RPKGFoZSk6IFdlIG5lZWQgdG8gc3RhcnQgYSBuZXN0ZWQgZGVjbGFyYXRpb24gd2hlbiBwYXJzaW5nIHRoZQogICAgICAgIC8vIGZvcm1hbHMgYW5kIHJldHVybiB0eXBlIHNvIHdlIGNhbiBjb3JyZWN0bHkgYmluZAogICAgICAgIC8vIGB0eXBlLnR5cGVWYXJpYWJsZXNgLiBBIHR5cGVkZWYgY2FuIGhhdmUgdHlwZSB2YXJpYWJsZXMsIGFuZCBhIG5ldwogICAgICAgIC8vIGZ1bmN0aW9uIHR5cGUgY2FuIGFsc28gaGF2ZSB0eXBlIHZhcmlhYmxlcyAocmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mCiAgICAgICAgLy8gYSBnZW5lcmljIGZ1bmN0aW9uKS4KICAgICAgICBmdW5jdGlvblR5cGUgPSB0eXBlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRPRE8oYWhlKTogSW1wcm92ZSB0aGlzIGVycm9yIG1lc3NhZ2UuCiAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlVHlwZWRlZk5vdEZ1bmN0aW9uLCBlcXVhbHMuY2hhck9mZnNldCwgZXF1YWxzLmxlbmd0aCk7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eSh0eXBlZGVmS2V5d29yZC5jaGFyT2Zmc2V0KTsKICAgIGxpYnJhcnkuYWRkRnVuY3Rpb25UeXBlQWxpYXMoZG9jdW1lbnRhdGlvbkNvbW1lbnQsIG1ldGFkYXRhLCBuYW1lLAogICAgICAgIHR5cGVWYXJpYWJsZXMsIGZ1bmN0aW9uVHlwZSwgY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFRvcExldmVsRmllbGRzKAogICAgICBUb2tlbiBzdGF0aWNUb2tlbiwKICAgICAgVG9rZW4gY292YXJpYW50VG9rZW4sCiAgICAgIFRva2VuIGxhdGVUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LAogICAgICBpbnQgY291bnQsCiAgICAgIFRva2VuIGJlZ2luVG9rZW4sCiAgICAgIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRUb3BMZXZlbEZpZWxkcyIpOwogICAgLy8gVE9ETyhkYW5ydWJlbCk6IGhhbmRsZSBOTkJEICdsYXRlJyBtb2RpZmllcgogICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuZW5hYmxlTm9uTnVsbGFibGUpIHsKICAgICAgcmVwb3J0Tm9uTnVsbGFibGVNb2RpZmllckVycm9yKGxhdGVUb2tlbik7CiAgICB9CiAgICBMaXN0PEZpZWxkSW5mbz4gZmllbGRJbmZvcyA9IHBvcEZpZWxkSW5mb3MoY291bnQpOwogICAgVHlwZUJ1aWxkZXIgdHlwZSA9IG51bGxJZlBhcnNlclJlY292ZXJ5KHBvcCgpKTsKICAgIGludCBtb2RpZmllcnMgPSAoc3RhdGljVG9rZW4gIT0gbnVsbCA/IHN0YXRpY01hc2sgOiAwKSB8CiAgICAgICAgKGNvdmFyaWFudFRva2VuICE9IG51bGwgPyBjb3ZhcmlhbnRNYXNrIDogMCkgfAogICAgICAgIE1vZGlmaWVyLnZhbGlkYXRlVmFyRmluYWxPckNvbnN0KHZhckZpbmFsT3JDb25zdD8ubGV4ZW1lKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eShiZWdpblRva2VuLmNoYXJPZmZzZXQpOwogICAgaWYgKGZpZWxkSW5mb3MgPT0gbnVsbCkgcmV0dXJuOwogICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoYmVnaW5Ub2tlbik7CiAgICBsaWJyYXJ5LmFkZEZpZWxkcygKICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudCwgbWV0YWRhdGEsIG1vZGlmaWVycywgdHlwZSwgZmllbGRJbmZvcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZpZWxkcyhUb2tlbiBzdGF0aWNUb2tlbiwgVG9rZW4gY292YXJpYW50VG9rZW4sIFRva2VuIGxhdGVUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGaWVsZHMiKTsKICAgIC8vIFRPRE8oZGFucnViZWwpOiBoYW5kbGUgTk5CRCAnbGF0ZScgbW9kaWZpZXIKICAgIGlmICghbGlicmFyeS5sb2FkZXIudGFyZ2V0LmVuYWJsZU5vbk51bGxhYmxlKSB7CiAgICAgIHJlcG9ydE5vbk51bGxhYmxlTW9kaWZpZXJFcnJvcihsYXRlVG9rZW4pOwogICAgfQogICAgTGlzdDxGaWVsZEluZm8+IGZpZWxkSW5mb3MgPSBwb3BGaWVsZEluZm9zKGNvdW50KTsKICAgIFR5cGVCdWlsZGVyIHR5cGUgPSBwb3AoKTsKICAgIGludCBtb2RpZmllcnMgPSAoc3RhdGljVG9rZW4gIT0gbnVsbCA/IHN0YXRpY01hc2sgOiAwKSB8CiAgICAgICAgKGNvdmFyaWFudFRva2VuICE9IG51bGwgPyBjb3ZhcmlhbnRNYXNrIDogMCkgfAogICAgICAgIE1vZGlmaWVyLnZhbGlkYXRlVmFyRmluYWxPckNvbnN0KHZhckZpbmFsT3JDb25zdD8ubGV4ZW1lKTsKICAgIGlmIChzdGF0aWNUb2tlbiA9PSBudWxsICYmIG1vZGlmaWVycyAmIGNvbnN0TWFzayAhPSAwKSB7CiAgICAgIC8vIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGFuIGluc3RhbmNlIHZhcmlhYmxlIGlzIGRlY2xhcmVkIHRvIGJlCiAgICAgIC8vIGNvbnN0YW50LgogICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VDb25zdEluc3RhbmNlRmllbGQsIHZhckZpbmFsT3JDb25zdC5jaGFyT2Zmc2V0LAogICAgICAgICAgdmFyRmluYWxPckNvbnN0Lmxlbmd0aCk7CiAgICAgIG1vZGlmaWVycyAmPSB+Y29uc3RNYXNrOwogICAgfQogICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhID0gcG9wKCk7CiAgICBpZiAoZmllbGRJbmZvcyA9PSBudWxsKSByZXR1cm47CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudChiZWdpblRva2VuKTsKICAgIGxpYnJhcnkuYWRkRmllbGRzKAogICAgICAgIGRvY3VtZW50YXRpb25Db21tZW50LCBtZXRhZGF0YSwgbW9kaWZpZXJzLCB0eXBlLCBmaWVsZEluZm9zKTsKICB9CgogIExpc3Q8RmllbGRJbmZvPiBwb3BGaWVsZEluZm9zKGludCBjb3VudCkgewogICAgaWYgKGNvdW50ID09IDApIHJldHVybiBudWxsOwogICAgTGlzdDxGaWVsZEluZm8+IGZpZWxkSW5mb3MgPSBuZXcgTGlzdDxGaWVsZEluZm8+KGNvdW50KTsKICAgIGJvb2wgaXNQYXJzZXJSZWNvdmVyeSA9IGZhbHNlOwogICAgZm9yIChpbnQgaSA9IGNvdW50IC0gMTsgaSAhPSAtMTsgaS0tKSB7CiAgICAgIGludCBjaGFyRW5kT2Zmc2V0ID0gcG9wKCk7CiAgICAgIFRva2VuIGJlZm9yZUxhc3QgPSBwb3AoKTsKICAgICAgVG9rZW4gaW5pdGlhbGl6ZXJUb2tlbkZvckluZmVyZW5jZSA9IHBvcCgpOwogICAgICBpbnQgY2hhck9mZnNldCA9IHBvcCgpOwogICAgICBPYmplY3QgbmFtZSA9IHBvcChOdWxsVmFsdWUuSWRlbnRpZmllcik7CiAgICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgICAgaXNQYXJzZXJSZWNvdmVyeSA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmllbGRJbmZvc1tpXSA9IG5ldyBGaWVsZEluZm8obmFtZSwgY2hhck9mZnNldCwKICAgICAgICAgICAgaW5pdGlhbGl6ZXJUb2tlbkZvckluZmVyZW5jZSwgYmVmb3JlTGFzdCwgY2hhckVuZE9mZnNldCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpc1BhcnNlclJlY292ZXJ5ID8gbnVsbCA6IGZpZWxkSW5mb3M7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVHlwZVZhcmlhYmxlKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpblR5cGVWYXJpYWJsZSIpOwogICAgaW50IGNoYXJPZmZzZXQgPSBwb3AoKTsKICAgIE9iamVjdCBuYW1lID0gcG9wKCk7CiAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IHR5cGUgdmFyaWFibGUgbWV0YWRhdGEgc2hvdWxkIG5vdCBiZSBpZ25vcmVkLiAgU2VlCiAgICAvLyBkYXJ0YnVnLmNvbS8yODk4MS4KICAgIC8qIExpc3Q8TWV0YWRhdGFCdWlsZGVyPFR5cGVCdWlsZGVyPj4gbWV0YWRhdGEgPSAqLyBwb3AoKTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gobmFtZSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKGxpYnJhcnkuYWRkVHlwZVZhcmlhYmxlKG5hbWUsIG51bGwsIGNoYXJPZmZzZXQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVHlwZVZhcmlhYmxlc0RlZmluZWQoVG9rZW4gdG9rZW4sIGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiVHlwZVZhcmlhYmxlc0RlZmluZWQiKTsKICAgIGFzc2VydChjb3VudCA+IDApOwogICAgcHVzaChjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPigpLnBvcChzdGFjaywgY291bnQpID8/CiAgICAgICAgTnVsbFZhbHVlLlR5cGVWYXJpYWJsZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUeXBlVmFyaWFibGUoVG9rZW4gdG9rZW4sIGludCBpbmRleCwgVG9rZW4gZXh0ZW5kc09yU3VwZXIpIHsKICAgIGRlYnVnRXZlbnQoImVuZFR5cGVWYXJpYWJsZSIpOwogICAgVHlwZUJ1aWxkZXIgYm91bmQgPSBudWxsSWZQYXJzZXJSZWNvdmVyeShwb3AoKSk7CiAgICAvLyBQZWVrIHRvIGxlYXZlIHR5cGUgcGFyYW1ldGVycyBvbiB0b3Agb2Ygc3RhY2suCiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVQYXJhbWV0ZXJzID0gcGVlaygpOwogICAgaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgdHlwZVBhcmFtZXRlcnNbaW5kZXhdLmJvdW5kID0gYm91bmQ7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVWYXJpYWJsZXMoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZFR5cGVWYXJpYWJsZXMiKTsKCiAgICAvLyBQZWVrIHRvIGxlYXZlIHR5cGUgcGFyYW1ldGVycyBvbiB0b3Agb2Ygc3RhY2suCiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVQYXJhbWV0ZXJzID0gcGVlaygpOwoKICAgIE1hcDxTdHJpbmcsIFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXNCeU5hbWU7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgYnVpbGRlciBpbiB0eXBlUGFyYW1ldGVycykgewogICAgICAgIGlmIChidWlsZGVyLmJvdW5kICE9IG51bGwpIHsKICAgICAgICAgIGlmICh0eXBlVmFyaWFibGVzQnlOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgdHlwZVZhcmlhYmxlc0J5TmFtZSA9IG5ldyBNYXA8U3RyaW5nLCBUeXBlVmFyaWFibGVCdWlsZGVyPigpOwogICAgICAgICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgYnVpbGRlciBpbiB0eXBlUGFyYW1ldGVycykgewogICAgICAgICAgICAgIHR5cGVWYXJpYWJsZXNCeU5hbWVbYnVpbGRlci5uYW1lXSA9IGJ1aWxkZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvLyBGaW5kIGN5Y2xlOiBJZiB0aGVyZSdzIG5vIGN5Y2xlIHdlIGNhbiBhdCBtb3N0IHN0ZXAgdGhyb3VnaCBhbGwKICAgICAgICAgIC8vIGB0eXBlUGFyYW1ldGVyc2AgKGF0IHdoaWNoIHBvaW50IHRoZSBsYXN0IGJ1aWxkZXJzIGJvdW5kIHdpbGwgYmUKICAgICAgICAgIC8vIG51bGwpLgogICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBjeWNsZSB3aXRoIGBidWlsZGVyYCAnaW5zaWRlJyB0aGUgc3RlcHMgdG8gZ2V0IGJhY2sgdG8KICAgICAgICAgIC8vIGl0IHdpbGwgYWxzbyBiZSBib3VuZCBieSBgdHlwZVBhcmFtZXRlcnMubGVuZ3RoYC4KICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY3ljbGUgd2l0aG91dCBgYnVpbGRlcmAgJ2luc2lkZScgd2Ugd2lsbCBqdXN0IGlnbm9yZSBpdAogICAgICAgICAgLy8gZm9yIG5vdy4gSXQgd2lsbCBiZSByZXBvcnRlZCB3aGVuIHByb2Nlc3Npbmcgb25lIG9mIHRoZSBgYnVpbGRlcmBzCiAgICAgICAgICAvLyB0aGF0IGlzIGluIGZhY3QgYGluc2lkZWAgdGhlIGN5Y2xlLiBUaGlzIG1hdGNoZXMgdGhlIGN5Y2xpYyBjbGFzcwogICAgICAgICAgLy8gaGllcmFyY2h5IGVycm9yLgogICAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciBib3VuZCA9IGJ1aWxkZXI7CiAgICAgICAgICBmb3IgKGludCBzdGVwcyA9IDA7CiAgICAgICAgICAgICAgYm91bmQuYm91bmQgIT0gbnVsbCAmJiBzdGVwcyA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKICAgICAgICAgICAgICArK3N0ZXBzKSB7CiAgICAgICAgICAgIGJvdW5kID0gdHlwZVZhcmlhYmxlc0J5TmFtZVtib3VuZC5ib3VuZC5uYW1lXTsKICAgICAgICAgICAgaWYgKGJvdW5kID09IG51bGwgfHwgYm91bmQgPT0gYnVpbGRlcikgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYm91bmQgPT0gYnVpbGRlciAmJiBib3VuZC5ib3VuZCAhPSBudWxsKSB7CiAgICAgICAgICAgIC8vIFdyaXRlIG91dCBjeWNsZS4KICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZpYSA9IG5ldyBMaXN0PFN0cmluZz4oKTsKICAgICAgICAgICAgYm91bmQgPSB0eXBlVmFyaWFibGVzQnlOYW1lW2J1aWxkZXIuYm91bmQubmFtZV07CiAgICAgICAgICAgIHdoaWxlIChib3VuZCAhPSBidWlsZGVyKSB7CiAgICAgICAgICAgICAgdmlhLmFkZChib3VuZC5uYW1lKTsKICAgICAgICAgICAgICBib3VuZCA9IHR5cGVWYXJpYWJsZXNCeU5hbWVbYm91bmQuYm91bmQubmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gdmlhLmlzRW1wdHkKICAgICAgICAgICAgICAgID8gdGVtcGxhdGVEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlcy53aXRoQXJndW1lbnRzKGJ1aWxkZXIubmFtZSkKICAgICAgICAgICAgICAgIDogdGVtcGxhdGVDeWNsZUluVHlwZVZhcmlhYmxlcy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIubmFtZSwgdmlhLmpvaW4oIicsICciKSk7CiAgICAgICAgICAgIGFkZFByb2JsZW0obWVzc2FnZSwgYnVpbGRlci5jaGFyT2Zmc2V0LCBidWlsZGVyLm5hbWUubGVuZ3RoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaW5Db25zdHJ1Y3Rvck5hbWUpIHsKICAgICAgYWRkUHJvYmxlbShtZXNzYWdlQ29uc3RydWN0b3JXaXRoVHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBvZmZzZXRGb3JUb2tlbihiZWdpblRva2VuKSwgbGVuZ3RoT2ZTcGFuKGJlZ2luVG9rZW4sIGVuZFRva2VuKSk7CiAgICAgIGluQ29uc3RydWN0b3JOYW1lID0gZmFsc2U7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFBhcnRPZigKICAgICAgVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIG9mS2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uLCBib29sIGhhc05hbWUpIHsKICAgIGRlYnVnRXZlbnQoImVuZFBhcnRPZiIpOwogICAgaW50IGNoYXJPZmZzZXQgPSBwb3BDaGFyT2Zmc2V0KCk7CiAgICBPYmplY3QgY29udGFpbmluZ0xpYnJhcnkgPSBwb3AoKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgaWYgKGhhc05hbWUpIHsKICAgICAgbGlicmFyeS5hZGRQYXJ0T2YobWV0YWRhdGEsCiAgICAgICAgICBmbGF0dGVuTmFtZShjb250YWluaW5nTGlicmFyeSwgY2hhck9mZnNldCwgdXJpKSwgbnVsbCwgY2hhck9mZnNldCk7CiAgICB9IGVsc2UgewogICAgICBsaWJyYXJ5LmFkZFBhcnRPZihtZXRhZGF0YSwgbnVsbCwgY29udGFpbmluZ0xpYnJhcnksIGNoYXJPZmZzZXQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25zdHJ1Y3RvclJlZmVyZW5jZSgKICAgICAgVG9rZW4gc3RhcnQsIFRva2VuIHBlcmlvZEJlZm9yZU5hbWUsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJDb25zdHJ1Y3RvclJlZmVyZW5jZSIpOwogICAgcG9wSWZOb3ROdWxsKHBlcmlvZEJlZm9yZU5hbWUpOyAvLyBjaGFyT2Zmc2V0LgogICAgU3RyaW5nIHN1ZmZpeCA9IHBvcElmTm90TnVsbChwZXJpb2RCZWZvcmVOYW1lKTsKICAgIExpc3Q8VHlwZUJ1aWxkZXI+IHR5cGVBcmd1bWVudHMgPSBwb3AoKTsKICAgIGludCBjaGFyT2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobGlicmFyeS5hZGRDb25zdHJ1Y3RvclJlZmVyZW5jZSgKICAgICAgICAgIG5hbWUsIHR5cGVBcmd1bWVudHMsIHN1ZmZpeCwgY2hhck9mZnNldCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZhY3RvcnlNZXRob2QoCiAgICAgIFRva2VuIGxhc3RDb25zdW1lZCwgVG9rZW4gZXh0ZXJuYWxUb2tlbiwgVG9rZW4gY29uc3RUb2tlbikgewogICAgaW5Db25zdHJ1Y3RvciA9IHRydWU7CiAgICBsaWJyYXJ5LmJlZ2luTmVzdGVkRGVjbGFyYXRpb24oIiNmYWN0b3J5X21ldGhvZCIsIGhhc01lbWJlcnM6IGZhbHNlKTsKICAgIHB1c2goKGV4dGVybmFsVG9rZW4gIT0gbnVsbCA/IGV4dGVybmFsTWFzayA6IDApIHwKICAgICAgICAoY29uc3RUb2tlbiAhPSBudWxsID8gY29uc3RNYXNrIDogMCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGYWN0b3J5TWV0aG9kKAogICAgICBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBmYWN0b3J5S2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZhY3RvcnlNZXRob2QiKTsKICAgIE1ldGhvZEJvZHkga2luZCA9IHBvcCgpOwogICAgQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyIHJlZGlyZWN0aW9uVGFyZ2V0OwogICAgaWYgKGtpbmQgPT0gTWV0aG9kQm9keS5SZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KSB7CiAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0ID0gbnVsbElmUGFyc2VyUmVjb3ZlcnkocG9wKCkpOwogICAgfQogICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzID0gcG9wKCk7CiAgICBpbnQgZm9ybWFsc09mZnNldCA9IHBvcCgpOwogICAgcG9wKCk7IC8vIHR5cGUgdmFyaWFibGVzCiAgICBpbnQgY2hhck9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIGludCBtb2RpZmllcnMgPSBwb3AoKTsKICAgIGlmIChuYXRpdmVNZXRob2ROYW1lICE9IG51bGwpIHsKICAgICAgbW9kaWZpZXJzIHw9IGV4dGVybmFsTWFzazsKICAgIH0KICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgbGlicmFyeS5lbmROZXN0ZWREZWNsYXJhdGlvbigiPHN5bnRheC1lcnJvcj4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoYmVnaW5Ub2tlbik7CiAgICBsaWJyYXJ5LmFkZEZhY3RvcnlNZXRob2QoCiAgICAgICAgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgbW9kaWZpZXJzLAogICAgICAgIG5hbWUsCiAgICAgICAgZm9ybWFscywKICAgICAgICByZWRpcmVjdGlvblRhcmdldCwKICAgICAgICBiZWdpblRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBmb3JtYWxzT2Zmc2V0LAogICAgICAgIGVuZFRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgbmF0aXZlTWV0aG9kTmFtZSk7CiAgICBuYXRpdmVNZXRob2ROYW1lID0gbnVsbDsKICAgIGluQ29uc3RydWN0b3IgPSBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kUmVkaXJlY3RpbmdGYWN0b3J5Qm9keShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSIpOwogICAgcHVzaChNZXRob2RCb2R5LlJlZGlyZWN0aW5nRmFjdG9yeUJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGaWVsZEluaXRpYWxpemVyKFRva2VuIGFzc2lnbm1lbnRPcGVyYXRvciwgVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZpZWxkSW5pdGlhbGl6ZXIiKTsKICAgIFRva2VuIGJlZm9yZUxhc3QgPSBhc3NpZ25tZW50T3BlcmF0b3IubmV4dDsKICAgIFRva2VuIG5leHQgPSBiZWZvcmVMYXN0Lm5leHQ7CiAgICB3aGlsZSAobmV4dCAhPSB0b2tlbiAmJiAhbmV4dC5pc0VvZikgewogICAgICAvLyBUbyBhdm9pZCBzdG9yaW5nIHRoZSByZXN0IG9mIHRoZSB0b2tlbiBzdHJlYW0sIHdlIG5lZWQgdG8gaWRlbnRpZnkgdGhlCiAgICAgIC8vIHRva2VuIGJlZm9yZSBbdG9rZW5dLiBUaGF0IHRva2VuIHdpbGwgYmUgdGhlIGxhc3QgdG9rZW4gb2YgdGhlCiAgICAgIC8vIGluaXRpYWxpemVyIGV4cHJlc3Npb24gYW5kIGJ5IHNldHRpbmcgaXRzIHRhaWwgdG8gRU9GIHdlIG9ubHkgc3RvcmUKICAgICAgLy8gdGhlIHRva2VucyBmb3IgdGhlIGV4cHJlc3Npb24uCiAgICAgIC8vIFRPRE8oYWhlKTogTWlnaHQgYmUgY2xlYXJlciBpZiB0aGlzIHNlYXJjaCB3YXMgbW92ZWQgdG8KICAgICAgLy8gYGxpYnJhcnkuYWRkRmllbGRzYC4KICAgICAgLy8gVE9ETyhhaGUpOiBJIGRvbid0IGV2ZW4gdGhpbmsgdGhpcyBpcyBuZWNlc3NhcnkuIFt0b2tlbl0gcG9pbnRzIHRvIDsKICAgICAgLy8gb3IgLCBhbmQgd2UgZG9uJ3Qgb3RoZXJ3aXNlIHN0b3JlIHRva2Vucy4KICAgICAgYmVmb3JlTGFzdCA9IG5leHQ7CiAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICB9CiAgICBwdXNoKGFzc2lnbm1lbnRPcGVyYXRvci5uZXh0KTsKICAgIHB1c2goYmVmb3JlTGFzdCk7CiAgICBwdXNoKHRva2VuLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0ZpZWxkSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5vRmllbGRJbml0aWFsaXplciIpOwogICAgcHVzaChOdWxsVmFsdWUuRmllbGRJbml0aWFsaXplcik7CiAgICBwdXNoKE51bGxWYWx1ZS5GaWVsZEluaXRpYWxpemVyKTsKICAgIHB1c2godG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEluaXRpYWxpemVycyhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbml0aWFsaXplcnMiKTsKICAgIC8vIElnbm9yZWQgZm9yIG5vdy4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Jbml0aWFsaXplcnMoKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0luaXRpYWxpemVycyIpOwogICAgLy8gVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGluaXRpYWxpemVyIGFuZCBpdCdzIGlnbm9yZWQgZm9yIG5vdy4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZE1lbWJlcihUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiSW52YWxpZE1lbWJlciIpOwogICAgcG9wKCk7IC8vIG1ldGFkYXRhIHN0YXIKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWVtYmVyKCkgewogICAgZGVidWdFdmVudCgiTWVtYmVyIik7CiAgICBhc3NlcnQobmF0aXZlTWV0aG9kTmFtZSA9PSBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2xhc3NXaXRoQ2xhdXNlKFRva2VuIHdpdGhLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJDbGFzc1dpdGhDbGF1c2UiKTsKCiAgICBPYmplY3QgbWl4aW5zID0gcG9wKCk7CiAgICBpbnQgZXh0ZW5kc09mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IHN1cGVydHlwZSA9IHBvcCgpOwogICAgaWYgKHN1cGVydHlwZSBpcyBQYXJzZXJSZWNvdmVyeSB8fCBtaXhpbnMgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChuZXcgUGFyc2VyUmVjb3Zlcnkod2l0aEtleXdvcmQuY2hhck9mZnNldCkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChsaWJyYXJ5LmFkZE1peGluQXBwbGljYXRpb24oCiAgICAgICAgICBzdXBlcnR5cGUsIG1peGlucywgd2l0aEtleXdvcmQuY2hhck9mZnNldCkpOwogICAgfQogICAgcHVzaChleHRlbmRzT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2xhc3NOb1dpdGhDbGF1c2UoKSB7CiAgICBkZWJ1Z0V2ZW50KCJDbGFzc05vV2l0aENsYXVzZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc0hlYWRlcihUb2tlbiBiZWdpbiwgVG9rZW4gY2xhc3NLZXl3b3JkLCBUb2tlbiBuYXRpdmVUb2tlbikgewogICAgZGVidWdFdmVudCgiQ2xhc3NIZWFkZXIiKTsKICAgIG5hdGl2ZU1ldGhvZE5hbWUgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVNaXhpbkhlYWRlcihUb2tlbiBtaXhpbktleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoImhhbmRsZU1peGluSGVhZGVyIik7CiAgICBuYXRpdmVNZXRob2ROYW1lID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2xhc3NPck1peGluQm9keShpbnQgbWVtYmVyQ291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJDbGFzc09yTWl4aW5Cb2R5Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUFzeW5jTW9kaWZpZXIoVG9rZW4gYXN5bmNUb2tlbiwgVG9rZW4gc3RhclRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJBc3luY01vZGlmaWVyIik7CiAgfQoKICB2b2lkIGFkZFByb2JsZW0oTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwKICAgICAge2Jvb2wgd2FzSGFuZGxlZDogZmFsc2UsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBsaWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZSwgY2hhck9mZnNldCwgbGVuZ3RoLCB1cmksCiAgICAgICAgd2FzSGFuZGxlZDogd2FzSGFuZGxlZCwgY29udGV4dDogY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSWdub3JlZEVycm9yKENvZGU8ZHluYW1pYz4gY29kZSwgVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBpc0lnbm9yZWRQYXJzZXJFcnJvcihjb2RlLCB0b2tlbikgfHwKICAgICAgICBzdXBlci5pc0lnbm9yZWRFcnJvcihjb2RlLCB0b2tlbik7CiAgfQoKICAvLy8gUmV0dXJuIHRoZSBkb2N1bWVudGF0aW9uIGNvbW1lbnQgZm9yIHRoZSBlbnRpdHkgdGhhdCBzdGFydHMgYXQgdGhlCiAgLy8vIGdpdmVuIFt0b2tlbl0sIG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBwcmVjZWRpbmcgZG9jdW1lbnRhdGlvbiBjb21tZW50LgogIHN0YXRpYyBTdHJpbmcgZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGRvY1Rva2VuID0gdG9rZW4ucHJlY2VkaW5nQ29tbWVudHM7CiAgICBpZiAoZG9jVG9rZW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBib29sIGluU2xhc2ggPSBmYWxzZTsKICAgIHZhciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICB3aGlsZSAoZG9jVG9rZW4gIT0gbnVsbCkgewogICAgICBTdHJpbmcgbGV4ZW1lID0gZG9jVG9rZW4ubGV4ZW1lOwogICAgICBpZiAobGV4ZW1lLnN0YXJ0c1dpdGgoJy8qKicpKSB7CiAgICAgICAgaW5TbGFz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ZVR5cGVzOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IExvY2F0ZWRNZXNzYWdlLCBNZXNzYWdlOwoKYWJzdHJhY3QgY2xhc3MgSW5mZXJlbmNlSGVscGVyIHsKICBDb3JlVHlwZXMgZ2V0IGNvcmVUeXBlczsKCiAgVXJpIGdldCB1cmk7CgogIHNldCB0cmFuc2Zvcm1TZXRMaXRlcmFscyhib29sIHZhbHVlKTsKCiAgRXhwcmVzc2lvbiBidWlsZFByb2JsZW0oTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQsIGJvb2wgc3VwcHJlc3NNZXNzYWdlfSk7CgogIExvY2F0ZWRNZXNzYWdlIGNoZWNrQXJndW1lbnRzRm9yVHlwZSgKICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgb2Zmc2V0KTsKCiAgdm9pZCBhZGRQcm9ibGVtKE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsCiAgICAgIHtMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0LCBib29sIHdhc0hhbmRsZWR9KTsKCiAgRXhwcmVzc2lvbiB3cmFwSW5Qcm9ibGVtKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgTWVzc2FnZSBtZXNzYWdlLCBpbnQgbGVuZ3RoLAogICAgICB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pOwoKICBTdHJpbmcgY29uc3RydWN0b3JOYW1lRm9yRGlhZ25vc3RpY3MoU3RyaW5nIG5hbWUsCiAgICAgIHtTdHJpbmcgY2xhc3NOYW1lLCBib29sIGlzU3VwZXJ9KTsKCiAgRXhwcmVzc2lvbiBkZXN1Z2FyU3ludGhldGljRXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUpOwp9CiQATk48AUsBOAE7ASEbAQ8BKAFHPQEoPwE/OAFPJwE0KQE6AgFAcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL2luZmVyZW5jZV9oZWxwZXIuZGFydE5zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcmVuY2VfZW5naW5lLmRhcnSaBC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQ29uc3RydWN0b3IsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRGFydFR5cGVWaXNpdG9yLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEZpZWxkLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIE1lbWJlciwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgICAgIFR5cGVkZWZUeXBlLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICcuLi8uLi9iYXNlL2luc3RydW1lbnRhdGlvbi5kYXJ0JyBzaG93IEluc3RydW1lbnRhdGlvbjsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyLAogICAgICAgIEltcGxpY2l0RmllbGRUeXBlLAogICAgICAgIExpYnJhcnlCdWlsZGVyLAogICAgICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICd0eXBlX2luZmVycmVyLmRhcnQnIHNob3cgVHlwZUluZmVycmVyOwoKaW1wb3J0ICd0eXBlX3NjaGVtYV9lbnZpcm9ubWVudC5kYXJ0JyBzaG93IFR5cGVTY2hlbWFFbnZpcm9ubWVudDsKCmVudW0gVmFyaWFuY2UgewogIGNvdmFyaWFudCwKICBjb250cmF2YXJpYW50LAogIGludmFyaWFudCwKfQoKVmFyaWFuY2UgaW52ZXJ0VmFyaWFuY2UoVmFyaWFuY2UgdmFyaWFuY2UpIHsKICBzd2l0Y2ggKHZhcmlhbmNlKSB7CiAgICBjYXNlIFZhcmlhbmNlLmNvdmFyaWFudDoKICAgICAgcmV0dXJuIFZhcmlhbmNlLmNvbnRyYXZhcmlhbnQ7CiAgICBjYXNlIFZhcmlhbmNlLmNvbnRyYXZhcmlhbnQ6CiAgICAgIHJldHVybiBWYXJpYW5jZS5jb3ZhcmlhbnQ7CiAgICBjYXNlIFZhcmlhbmNlLmludmFyaWFudDoKICB9CiAgcmV0dXJuIHZhcmlhbmNlOwp9CgovLy8gVmlzaXRvciB0byBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4gdHlwZSBtZW50aW9ucyBhbnkgb2YgYSBjbGFzcydzIHR5cGUKLy8vIHBhcmFtZXRlcnMgaW4gYSBub24tY292YXJpYW50IGZhc2hpb24uCmNsYXNzIEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNOb25Db3ZhcmlhbnRseSBleHRlbmRzIERhcnRUeXBlVmlzaXRvcjxib29sPiB7CiAgVmFyaWFuY2UgX3ZhcmlhbmNlOwoKICBmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IF90eXBlUGFyYW1ldGVyc1RvU2VhcmNoRm9yOwoKICBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzTm9uQ292YXJpYW50bHkodGhpcy5fdHlwZVBhcmFtZXRlcnNUb1NlYXJjaEZvciwKICAgICAge1ZhcmlhbmNlIGluaXRpYWxWYXJpYW5jZX0pCiAgICAgIDogX3ZhcmlhbmNlID0gaW5pdGlhbFZhcmlhbmNlOwoKICBAb3ZlcnJpZGUKICBib29sIGRlZmF1bHREYXJ0VHlwZShEYXJ0VHlwZSBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgaWYgKG5vZGUucmV0dXJuVHlwZS5hY2NlcHQodGhpcykpIHJldHVybiB0cnVlOwogICAgVmFyaWFuY2Ugb2xkVmFyaWFuY2UgPSBfdmFyaWFuY2U7CiAgICBfdmFyaWFuY2UgPSBWYXJpYW5jZS5pbnZhcmlhbnQ7CiAgICBmb3IgKHZhciBwYXJhbWV0ZXIgaW4gbm9kZS50eXBlUGFyYW1ldGVycykgewogICAgICBpZiAocGFyYW1ldGVyLmJvdW5kLmFjY2VwdCh0aGlzKSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICBfdmFyaWFuY2UgPSBpbnZlcnRWYXJpYW5jZShvbGRWYXJpYW5jZSk7CiAgICBmb3IgKHZhciBwYXJhbWV0ZXIgaW4gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBpZiAocGFyYW1ldGVyLmFjY2VwdCh0aGlzKSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmb3IgKHZhciBwYXJhbWV0ZXIgaW4gbm9kZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgaWYgKHBhcmFtZXRlci50eXBlLmFjY2VwdCh0aGlzKSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICBfdmFyaWFuY2UgPSBvbGRWYXJpYW5jZTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgZm9yICh2YXIgYXJndW1lbnQgaW4gbm9kZS50eXBlQXJndW1lbnRzKSB7CiAgICAgIGlmIChhcmd1bWVudC5hY2NlcHQodGhpcykpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUpIHsKICAgIHJldHVybiBub2RlLnVuYWxpYXMuYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIHJldHVybiBfdmFyaWFuY2UgIT0gVmFyaWFuY2UuY292YXJpYW50ICYmCiAgICAgICAgX3R5cGVQYXJhbWV0ZXJzVG9TZWFyY2hGb3IuY29udGFpbnMobm9kZS5wYXJhbWV0ZXIpOwogIH0KfQoKLy8vIEtlZXBzIHRyYWNrIG9mIHRoZSBnbG9iYWwgc3RhdGUgZm9yIHRoZSB0eXBlIGluZmVyZW5jZSB0aGF0IG9jY3VycyBvdXRzaWRlCi8vLyBvZiBtZXRob2QgYm9kaWVzIGFuZCBpbml0aWFsaXplcnMuCi8vLwovLy8gVGhpcyBjbGFzcyBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBmb3IgdXNlIGJ5IGNsaWVudHMgb2YgdHlwZSBpbmZlcmVuY2UKLy8vIChlLmcuIERpZXRMaXN0ZW5lcikuICBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkIGRlcml2ZSBmcm9tCi8vLyBbVHlwZUluZmVyZW5jZUVuZ2luZUltcGxdLgphYnN0cmFjdCBjbGFzcyBUeXBlSW5mZXJlbmNlRW5naW5lIHsKICBDbGFzc0hpZXJhcmNoeSBjbGFzc0hpZXJhcmNoeTsKCiAgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeUJ1aWxkZXI7CgogIENvcmVUeXBlcyBjb3JlVHlwZXM7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgInByZXBhcmUiIHBoYXNlIG9mIHR5cGUgaW5mZXJlbmNlIGlzIGNvbXBsZXRlLgogIGJvb2wgaXNUeXBlSW5mZXJlbmNlUHJlcGFyZWQgPSBmYWxzZTsKCiAgVHlwZVNjaGVtYUVudmlyb25tZW50IHR5cGVTY2hlbWFFbnZpcm9ubWVudDsKCiAgLy8vIEEgbWFwIGNvbnRhaW5pbmcgY29uc3RydWN0b3JzIHdpdGggaW5pdGlhbGl6aW5nIGZvcm1hbHMgd2hvc2UgdHlwZXMKICAvLy8gbmVlZCB0byBiZSBpbmZlcnJlZC4KICAvLy8KICAvLy8gVGhpcyBpcyByZXByZXNlbnRlZCBhcyBhIG1hcCBmcm9tIGEgY29uc3RydWN0b3IgdG8gaXRzIGxpYnJhcnkKICAvLy8gYnVpbGRlciBiZWNhdXNlIHRoZSBidWlsZGVyIGlzIHVzZWQgdG8gcmVwb3J0IGVycm9ycyBkdWUgdG8gY3ljbGljCiAgLy8vIGluZmVyZW5jZSBkZXBlbmRlbmNpZXMuCiAgZmluYWwgTWFwPENvbnN0cnVjdG9yLCBMaWJyYXJ5QnVpbGRlcj4gdG9CZUluZmVycmVkID0ge307CgogIC8vLyBBIG1hcCBjb250YWluaW5nIGNvbnN0cnVjdG9ycyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBpbmZlcnJlZC4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIHRvIGRldGVjdCBjeWNsaWMgaW5mZXJlbmNlIGRlcGVuZGVuY2llcy4gIEl0IGlzIHJlcHJlc2VudGVkCiAgLy8vIGFzIGEgbWFwIGZyb20gYSBjb25zdHJ1Y3RvciB0byBpdHMgbGlicmFyeSBidWlsZGVyIGJlY2F1c2UgdGhlIGJ1aWxkZXIKICAvLy8gaXMgdXNlZCB0byByZXBvcnQgZXJyb3JzLgogIGZpbmFsIE1hcDxDb25zdHJ1Y3RvciwgTGlicmFyeUJ1aWxkZXI+IGJlaW5nSW5mZXJyZWQgPSB7fTsKCiAgZmluYWwgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbjsKCiAgVHlwZUluZmVyZW5jZUVuZ2luZSh0aGlzLmluc3RydW1lbnRhdGlvbik7CgogIC8vLyBDcmVhdGVzIGEgdHlwZSBpbmZlcnJlciBmb3IgdXNlIGluc2lkZSBvZiBhIG1ldGhvZCBib2R5IGRlY2xhcmVkIGluIGEgZmlsZQogIC8vLyB3aXRoIHRoZSBnaXZlbiBbdXJpXS4KICBUeXBlSW5mZXJyZXIgY3JlYXRlTG9jYWxUeXBlSW5mZXJyZXIoCiAgICAgIFVyaSB1cmksIEludGVyZmFjZVR5cGUgdGhpc1R5cGUsIEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpOwoKICAvLy8gQ3JlYXRlcyBhIFtUeXBlSW5mZXJyZXJdIG9iamVjdCB3aGljaCBpcyByZWFkeSB0byBwZXJmb3JtIHR5cGUgaW5mZXJlbmNlCiAgLy8vIG9uIHRoZSBnaXZlbiBbZmllbGRdLgogIFR5cGVJbmZlcnJlciBjcmVhdGVUb3BMZXZlbFR5cGVJbmZlcnJlcigKICAgICAgVXJpIHVyaSwgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSwgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSk7CgogIC8vLyBQZXJmb3JtcyB0aGUgdGhpcmQgcGhhc2Ugb2YgdG9wIGxldmVsIGluZmVyZW5jZSwgd2hpY2ggaXMgdG8gdmlzaXQgYWxsCiAgLy8vIGNvbnN0cnVjdG9ycyBzdGlsbCBuZWVkaW5nIGluZmVyZW5jZSBhbmQgaW5mZXIgdGhlIHR5cGVzIG9mIHRoZWlyCiAgLy8vIGluaXRpYWxpemluZyBmb3JtYWxzIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzLgogIHZvaWQgZmluaXNoVG9wTGV2ZWxJbml0aWFsaXppbmdGb3JtYWxzKCkgewogICAgLy8gRmllbGQgdHlwZXMgaGF2ZSBhbGwgYmVlbiBpbmZlcnJlZCBzbyB0aGVyZSBjYW5ub3QgYmUgYSBjeWNsaWMKICAgIC8vIGRlcGVuZGVuY3kuCiAgICBmb3IgKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yIGluIHRvQmVJbmZlcnJlZC5rZXlzKSB7CiAgICAgIGZvciAodmFyIGRlY2xhcmF0aW9uIGluIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgICAgaW5mZXJJbml0aWFsaXppbmdGb3JtYWwoZGVjbGFyYXRpb24sIGNvbnN0cnVjdG9yKTsKICAgICAgfQogICAgICBmb3IgKHZhciBkZWNsYXJhdGlvbiBpbiBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgICBpbmZlckluaXRpYWxpemluZ0Zvcm1hbChkZWNsYXJhdGlvbiwgY29uc3RydWN0b3IpOwogICAgICB9CiAgICB9CiAgICB0b0JlSW5mZXJyZWQuY2xlYXIoKTsKICB9CgogIHZvaWQgaW5mZXJJbml0aWFsaXppbmdGb3JtYWwoVmFyaWFibGVEZWNsYXJhdGlvbiBmb3JtYWwsIENvbnN0cnVjdG9yIHBhcmVudCkgewogICAgaWYgKGZvcm1hbC50eXBlID09IG51bGwpIHsKICAgICAgZm9yIChGaWVsZCBmaWVsZCBpbiBwYXJlbnQuZW5jbG9zaW5nQ2xhc3MuZmllbGRzKSB7CiAgICAgICAgaWYgKGZpZWxkLm5hbWUubmFtZSA9PSBmb3JtYWwubmFtZSkgewogICAgICAgICAgVHlwZUluZmVyZW5jZUVuZ2luZS5yZXNvbHZlSW5mZXJlbmNlTm9kZShmaWVsZCk7CiAgICAgICAgICBmb3JtYWwudHlwZSA9IGZpZWxkLnR5cGU7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFdlIGRpZCBub3QgZmluZCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCwgc28gdGhlIHByb2dyYW0gaXMgZXJyb25lb3VzLgogICAgICAvLyBUaGUgZXJyb3Igc2hvdWxkIGhhdmUgYmVlbiByZXBvcnRlZCBlbHNld2hlcmUgYW5kIHR5cGUgaW5mZXJlbmNlCiAgICAgIC8vIHNob3VsZCBjb250aW51ZSBieSBpbmZlcnJpbmcgZHluYW1pYy4KICAgICAgZm9ybWFsLnR5cGUgPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfQogIH0KCiAgLy8vIEdldHMgcmVhZHkgdG8gZG8gdG9wIGxldmVsIHR5cGUgaW5mZXJlbmNlIGZvciB0aGUgY29tcG9uZW50IGhhdmluZyB0aGUKICAvLy8gZ2l2ZW4gW2hpZXJhcmNoeV0sIHVzaW5nIHRoZSBnaXZlbiBbY29yZVR5cGVzXS4KICB2b2lkIHByZXBhcmVUb3BMZXZlbChDb3JlVHlwZXMgY29yZVR5cGVzLCBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHkpIHsKICAgIHRoaXMuY29yZVR5cGVzID0gY29yZVR5cGVzOwogICAgdGhpcy5jbGFzc0hpZXJhcmNoeSA9IGhpZXJhcmNoeTsKICAgIHRoaXMudHlwZVNjaGVtYUVudmlyb25tZW50ID0KICAgICAgICBuZXcgVHlwZVNjaGVtYUVudmlyb25tZW50KGNvcmVUeXBlcywgaGllcmFyY2h5KTsKICB9CgogIHN0YXRpYyBNZW1iZXIgcmVzb2x2ZUluZmVyZW5jZU5vZGUoTWVtYmVyIG1lbWJlcikgewogICAgaWYgKG1lbWJlciBpcyBGaWVsZCkgewogICAgICBEYXJ0VHlwZSB0eXBlID0gbWVtYmVyLnR5cGU7CiAgICAgIGlmICh0eXBlIGlzIEltcGxpY2l0RmllbGRUeXBlKSB7CiAgICAgICAgaWYgKHR5cGUubWVtYmVyLnRhcmdldCAhPSBtZW1iZXIpIHsKICAgICAgICAgIHR5cGUubWVtYmVyLmluZmVyQ29waWVkVHlwZShtZW1iZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0eXBlLm1lbWJlci5pbmZlclR5cGUoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtZW1iZXI7CiAgfQp9CoDTAE1OPwEhCRUSGRUPFhcQFxsVHQFCATgBPwEnCR8bGB4BLwFCARANEQ0CAS0WHSUhIR0EEwIBSStLFgE4AUgiJQEMMAEMLjMmJDE1Bi03LwYyNAYdEgQBDDAvLgYSBAEMLCYEAQw4Lj0EAgFPJwRMPR8lIQEqARcBSygBLwFKGwZFSR48AUYGT00gPQEpAS0BURwoRgFPHCtGAU1IOi1GEzlLOwhGOwgGGgQBUR86LjskEgoIT0ovKQYEAU02SCAlITkEATYbIycsLxEjCggGEwQCAUVwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcmVuY2VfZW5naW5lLmRhcnRQc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hX2VsaW1pbmF0aW9uLmRhcnSUvC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93IERhcnRUeXBlLCBEeW5hbWljVHlwZSwgRnVuY3Rpb25UeXBlLCBJbnRlcmZhY2VUeXBlLCBOYW1lZFR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJ3R5cGVfc2NoZW1hLmRhcnQnIHNob3cgVHlwZVNjaGVtYVZpc2l0b3IsIFVua25vd25UeXBlOwoKLy8vIFJldHVybnMgdGhlIGdyZWF0ZXN0IGNsb3N1cmUgb2YgdGhlIGdpdmVuIHR5cGUgW3NjaGVtYV0gd2l0aCByZXNwZWN0IHRvIGA/YC4KLy8vCi8vLyBUaGUgZ3JlYXRlc3QgY2xvc3VyZSBvZiBhIHR5cGUgc2NoZW1hIGBQYCB3aXRoIHJlc3BlY3QgdG8gYD9gIGlzIGRlZmluZWQgYXMKLy8vIGBQYCB3aXRoIGV2ZXJ5IGNvdmFyaWFudCBvY2N1cnJlbmNlIG9mIGA/YCByZXBsYWNlZCB3aXRoIGBOdWxsYCwgYW5kIGV2ZXJ5Ci8vLyBjb250cmF2YXJpYW50IG9jY3VycmVuY2Ugb2YgYD9gIHJlcGxhY2VkIHdpdGggYE9iamVjdGAuCi8vLwovLy8gSWYgdGhlIHNjaGVtYSBjb250YWlucyBubyBpbnN0YW5jZXMgb2YgYD9gLCB0aGUgb3JpZ2luYWwgc2NoZW1hIG9iamVjdCBpcwovLy8gcmV0dXJuZWQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYWxsb2NhdGlvbi4KLy8vCi8vLyBOb3RlIHRoYXQgdGhlIGNsb3N1cmUgb2YgYSB0eXBlIHNjaGVtYSBpcyBhIHByb3BlciB0eXBlLgovLy8KLy8vIE5vdGUgdGhhdCB0aGUgZ3JlYXRlc3QgY2xvc3VyZSBvZiBhIHR5cGUgc2NoZW1hIGlzIGFsd2F5cyBhIHN1cGVydHlwZSBvZiBhbnkKLy8vIHR5cGUgd2hpY2ggbWF0Y2hlcyB0aGUgc2NoZW1hLgpEYXJ0VHlwZSBncmVhdGVzdENsb3N1cmUoQ29yZVR5cGVzIGNvcmVUeXBlcywgRGFydFR5cGUgc2NoZW1hKSA9PgogICAgX1R5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IucnVuKGNvcmVUeXBlcywgZmFsc2UsIHNjaGVtYSk7CgovLy8gUmV0dXJucyB0aGUgbGVhc3QgY2xvc3VyZSBvZiB0aGUgZ2l2ZW4gdHlwZSBbc2NoZW1hXSB3aXRoIHJlc3BlY3QgdG8gYD9gLgovLy8KLy8vIFRoZSBsZWFzdCBjbG9zdXJlIG9mIGEgdHlwZSBzY2hlbWEgYFBgIHdpdGggcmVzcGVjdCB0byBgP2AgaXMgZGVmaW5lZCBhcwovLy8gYFBgIHdpdGggZXZlcnkgY292YXJpYW50IG9jY3VycmVuY2Ugb2YgYD9gIHJlcGxhY2VkIHdpdGggYE9iamVjdGAsIGFuZCBldmVyeQovLy8gY29udHJhdmFyaWFudCBvY2N1cnJlbmNlIG9mIGA/YCByZXBsYWNlZCB3aXRoIGBOdWxsYC4KLy8vCi8vLyBJZiB0aGUgc2NoZW1hIGNvbnRhaW5zIG5vIGluc3RhbmNlcyBvZiBgP2AsIHRoZSBvcmlnaW5hbCBzY2hlbWEgb2JqZWN0IGlzCi8vLyByZXR1cm5lZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBhbGxvY2F0aW9uLgovLy8KLy8vIE5vdGUgdGhhdCB0aGUgY2xvc3VyZSBvZiBhIHR5cGUgc2NoZW1hIGlzIGEgcHJvcGVyIHR5cGUuCi8vLwovLy8gTm90ZSB0aGF0IHRoZSBsZWFzdCBjbG9zdXJlIG9mIGEgdHlwZSBzY2hlbWEgaXMgYWx3YXlzIGEgc3VidHlwZSBvZiBhbnkgdHlwZQovLy8gd2hpY2ggbWF0Y2hlcyB0aGUgc2NoZW1hLgpEYXJ0VHlwZSBsZWFzdENsb3N1cmUoQ29yZVR5cGVzIGNvcmVUeXBlcywgRGFydFR5cGUgc2NoZW1hKSA9PgogICAgX1R5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IucnVuKGNvcmVUeXBlcywgdHJ1ZSwgc2NoZW1hKTsKCi8vLyBWaXNpdG9yIHRoYXQgY29tcHV0ZXMgbGVhc3QgYW5kIGdyZWF0ZXN0IGNsb3N1cmVzIG9mIGEgdHlwZSBzY2hlbWEuCi8vLwovLy8gRWFjaCB2aXNpdG9yIG1ldGhvZCByZXR1cm5zIGBudWxsYCBpZiB0aGVyZSBhcmUgbm8gYD9gcyBjb250YWluZWQgaW4gdGhlCi8vLyB0eXBlLCBvdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHN1YnN0aXR1dGluZyBgP2Agd2l0aCBgTnVsbGAgb3IKLy8vIGBPYmplY3RgLCBhcyBhcHByb3ByaWF0ZS4KY2xhc3MgX1R5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IgZXh0ZW5kcyBUeXBlU2NoZW1hVmlzaXRvcjxEYXJ0VHlwZT4gewogIGZpbmFsIERhcnRUeXBlIG51bGxUeXBlOwoKICBib29sIGlzTGVhc3RDbG9zdXJlOwoKICBfVHlwZVNjaGVtYUVsaW1pbmF0aW9uVmlzaXRvcihDb3JlVHlwZXMgY29yZVR5cGVzLCB0aGlzLmlzTGVhc3RDbG9zdXJlKQogICAgICA6IG51bGxUeXBlID0gY29yZVR5cGVzLm51bGxDbGFzcy5yYXdUeXBlOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgRGFydFR5cGUgbmV3UmV0dXJuVHlwZSA9IG5vZGUucmV0dXJuVHlwZS5hY2NlcHQodGhpcyk7CiAgICBpc0xlYXN0Q2xvc3VyZSA9ICFpc0xlYXN0Q2xvc3VyZTsKICAgIExpc3Q8RGFydFR5cGU+IG5ld1Bvc2l0aW9uYWxQYXJhbWV0ZXJzID0gbnVsbDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICBEYXJ0VHlwZSBzdWJzdGl0dXRpb24gPSBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldLmFjY2VwdCh0aGlzKTsKICAgICAgaWYgKHN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgbmV3UG9zaXRpb25hbFBhcmFtZXRlcnMgPz89CiAgICAgICAgICAgIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgICAgbmV3UG9zaXRpb25hbFBhcmFtZXRlcnNbaV0gPSBzdWJzdGl0dXRpb247CiAgICAgIH0KICAgIH0KICAgIExpc3Q8TmFtZWRUeXBlPiBuZXdOYW1lZFBhcmFtZXRlcnMgPSBudWxsOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLm5hbWVkUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICBEYXJ0VHlwZSBzdWJzdGl0dXRpb24gPSBub2RlLm5hbWVkUGFyYW1ldGVyc1tpXS50eXBlLmFjY2VwdCh0aGlzKTsKICAgICAgaWYgKHN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgbmV3TmFtZWRQYXJhbWV0ZXJzID8/PSBub2RlLm5hbWVkUGFyYW1ldGVycy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgICBuZXdOYW1lZFBhcmFtZXRlcnNbaV0gPQogICAgICAgICAgICBuZXcgTmFtZWRUeXBlKG5vZGUubmFtZWRQYXJhbWV0ZXJzW2ldLm5hbWUsIHN1YnN0aXR1dGlvbik7CiAgICAgIH0KICAgIH0KICAgIGlzTGVhc3RDbG9zdXJlID0gIWlzTGVhc3RDbG9zdXJlOwogICAgRGFydFR5cGUgdHlwZWRlZlR5cGUgPSBub2RlLnR5cGVkZWZUeXBlPy5hY2NlcHQodGhpcyk7CiAgICBpZiAobmV3UmV0dXJuVHlwZSA9PSBudWxsICYmCiAgICAgICAgbmV3UG9zaXRpb25hbFBhcmFtZXRlcnMgPT0gbnVsbCAmJgogICAgICAgIG5ld05hbWVkUGFyYW1ldGVycyA9PSBudWxsICYmCiAgICAgICAgdHlwZWRlZlR5cGUgPT0gbnVsbCkgewogICAgICAvLyBObyB0eXBlcyBoYWQgdG8gYmUgc3Vic3RpdHV0ZWQuCiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvblR5cGUoCiAgICAgICAgICBuZXdQb3NpdGlvbmFsUGFyYW1ldGVycyA/PyBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgbmV3UmV0dXJuVHlwZSA/PyBub2RlLnJldHVyblR5cGUsCiAgICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5ld05hbWVkUGFyYW1ldGVycyA/PyBub2RlLm5hbWVkUGFyYW1ldGVycywKICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiBub2RlLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogbm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgICAgdHlwZWRlZlR5cGU6IHR5cGVkZWZUeXBlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIExpc3Q8RGFydFR5cGU+IG5ld1R5cGVBcmd1bWVudHMgPSBudWxsOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgRGFydFR5cGUgc3Vic3RpdHV0aW9uID0gbm9kZS50eXBlQXJndW1lbnRzW2ldLmFjY2VwdCh0aGlzKTsKICAgICAgaWYgKHN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgbmV3VHlwZUFyZ3VtZW50cyA/Pz0gbm9kZS50eXBlQXJndW1lbnRzLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgICAgIG5ld1R5cGVBcmd1bWVudHNbaV0gPSBzdWJzdGl0dXRpb247CiAgICAgIH0KICAgIH0KICAgIGlmIChuZXdUeXBlQXJndW1lbnRzID09IG51bGwpIHsKICAgICAgLy8gTm8gdHlwZSBhcmd1bWVudHMgbmVlZGVkIHRvIGJlIHN1YnN0aXR1dGVkLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShub2RlLmNsYXNzTm9kZSwgbmV3VHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFVua25vd25UeXBlKFVua25vd25UeXBlIG5vZGUpID0+CiAgICAgIGlzTGVhc3RDbG9zdXJlID8gbnVsbFR5cGUgOiBjb25zdCBEeW5hbWljVHlwZSgpOwoKICAvLy8gUnVucyBhbiBpbnN0YW5jZSBvZiB0aGUgdmlzaXRvciBvbiB0aGUgZ2l2ZW4gW3NjaGVtYV0gYW5kIHJldHVybnMgdGhlCiAgLy8vIHJlc3VsdGluZyB0eXBlLiAgSWYgdGhlIHNjaGVtYSBjb250YWlucyBubyBpbnN0YW5jZXMgb2YgYD9gLCB0aGUgb3JpZ2luYWwKICAvLy8gc2NoZW1hIG9iamVjdCBpcyByZXR1cm5lZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBhbGxvY2F0aW9uLgogIHN0YXRpYyBEYXJ0VHlwZSBydW4oCiAgICAgIENvcmVUeXBlcyBjb3JlVHlwZXMsIGJvb2wgaXNMZWFzdENsb3N1cmUsIERhcnRUeXBlIHNjaGVtYSkgewogICAgdmFyIHZpc2l0b3IgPSBuZXcgX1R5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IoY29yZVR5cGVzLCBpc0xlYXN0Q2xvc3VyZSk7CiAgICB2YXIgcmVzdWx0ID0gc2NoZW1hLmFjY2VwdCh2aXNpdG9yKTsKICAgIGFzc2VydCh2aXNpdG9yLmlzTGVhc3RDbG9zdXJlID09IGlzTGVhc3RDbG9zdXJlKTsKICAgIHJldHVybiByZXN1bHQgPz8gc2NoZW1hOwogIH0KfQqAhABNTj8BIUgBOAE/AVEEUE88BE4uBD0EUSNCQQFOBE1ROgROLgQ9BFEeP0ABSARNTR5KGwEXAUowAQwyOyYzQUkiJD8zCAYvPEkiTSBHCAYmOyErJh8pEw0fQCxHLz8lBgQBDDQsOkIiSSwIBiQ1Ew1CBgQBDDE3AUxQQRdDUCk2HQQCAUdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWFfZWxpbWluYXRpb24uZGFydFBzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWFfZW52aXJvbm1lbnQuZGFydLx1Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRS5tZCBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzcywKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBOYW1lZFR5cGUsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFR5cGVQYXJhbWV0ZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9oaWVyYXJjaHlfYmFzZWRfdHlwZV9lbnZpcm9ubWVudC5kYXJ0JwogICAgc2hvdyBIaWVyYXJjaHlCYXNlZFR5cGVFbnZpcm9ubWVudDsKCmltcG9ydCAnc3RhbmRhcmRfYm91bmRzLmRhcnQnIHNob3cgU3RhbmRhcmRCb3VuZHM7CgppbXBvcnQgJ3R5cGVfY29uc3RyYWludF9nYXRoZXJlci5kYXJ0JyBzaG93IFR5cGVDb25zdHJhaW50R2F0aGVyZXI7CgppbXBvcnQgJ3R5cGVfc2NoZW1hLmRhcnQnIHNob3cgVW5rbm93blR5cGUsIHR5cGVTY2hlbWFUb1N0cmluZywgaXNLbm93bjsKCmltcG9ydCAndHlwZV9zY2hlbWFfZWxpbWluYXRpb24uZGFydCcgc2hvdyBncmVhdGVzdENsb3N1cmUsIGxlYXN0Q2xvc3VyZTsKCi8vIFRPRE8ocGF1bGJlcnJ5KTogdHJ5IHRvIHB1c2ggdGhpcyBmdW5jdGlvbmFsaXR5IGludG8ga2VybmVsLgpGdW5jdGlvblR5cGUgc3Vic3RpdHV0ZVR5cGVQYXJhbXMoCiAgICBGdW5jdGlvblR5cGUgdHlwZSwKICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uTWFwLAogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBuZXdUeXBlUGFyYW1ldGVycykgewogIHZhciBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbU1hcChzdWJzdGl0dXRpb25NYXApOwogIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKAogICAgICB0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLm1hcChzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUpLnRvTGlzdCgpLAogICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUodHlwZS5yZXR1cm5UeXBlKSwKICAgICAgbmFtZWRQYXJhbWV0ZXJzOiB0eXBlLm5hbWVkUGFyYW1ldGVycwogICAgICAgICAgLm1hcCgobmFtZWQpID0+IG5ldyBOYW1lZFR5cGUoCiAgICAgICAgICAgICAgbmFtZWQubmFtZSwgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKG5hbWVkLnR5cGUpKSkKICAgICAgICAgIC50b0xpc3QoKSwKICAgICAgdHlwZVBhcmFtZXRlcnM6IG5ld1R5cGVQYXJhbWV0ZXJzLAogICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiB0eXBlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgIHR5cGVkZWZUeXBlOiB0eXBlLnR5cGVkZWZUeXBlID09IG51bGwKICAgICAgICAgID8gbnVsbAogICAgICAgICAgOiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUodHlwZS50eXBlZGVmVHlwZSkpOwp9CgovLy8gR2l2ZW4gYSBbRnVuY3Rpb25UeXBlXSwgZ2V0cyB0aGUgdHlwZSBvZiB0aGUgbmFtZWQgcGFyYW1ldGVyIHdpdGggdGhlIGdpdmVuCi8vLyBbbmFtZV0sIG9yIGBkeW5hbWljYCBpZiB0aGVyZSBpcyBubyBwYXJhbWV0ZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KRGFydFR5cGUgZ2V0TmFtZWRQYXJhbWV0ZXJUeXBlKEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUsIFN0cmluZyBuYW1lKSB7CiAgcmV0dXJuIGZ1bmN0aW9uVHlwZS5nZXROYW1lZFBhcmFtZXRlcihuYW1lKSA/PyBjb25zdCBEeW5hbWljVHlwZSgpOwp9CgovLy8gR2l2ZW4gYSBbRnVuY3Rpb25UeXBlXSwgZ2V0cyB0aGUgdHlwZSBvZiB0aGUgW2lddGggcG9zaXRpb25hbCBwYXJhbWV0ZXIsIG9yCi8vLyBgZHluYW1pY2AgaWYgdGhlcmUgaXMgbm8gcGFyYW1ldGVyIHdpdGggdGhhdCBpbmRleC4KRGFydFR5cGUgZ2V0UG9zaXRpb25hbFBhcmFtZXRlclR5cGUoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSwgaW50IGkpIHsKICBpZiAoaSA8IGZ1bmN0aW9uVHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgIHJldHVybiBmdW5jdGlvblR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgfSBlbHNlIHsKICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogIH0KfQoKLy8vIEEgY29uc3RyYWludCBvbiBhIHR5cGUgcGFyYW1ldGVyIHRoYXQgd2UncmUgaW5mZXJyaW5nLgpjbGFzcyBUeXBlQ29uc3RyYWludCB7CiAgLy8vIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgdHlwZSBiZWluZyBjb25zdHJhaW5lZC4gIFRoaXMgYm91bmQgbXVzdCBiZSBhCiAgLy8vIHN1YnR5cGUgb2YgdGhlIHR5cGUgYmVpbmcgY29uc3RyYWluZWQuCiAgRGFydFR5cGUgbG93ZXI7CgogIC8vLyBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHR5cGUgYmVpbmcgY29uc3RyYWluZWQuICBUaGUgdHlwZSBiZWluZyBjb25zdHJhaW5lZAogIC8vLyBtdXN0IGJlIGEgc3VidHlwZSBvZiB0aGlzIGJvdW5kLgogIERhcnRUeXBlIHVwcGVyOwoKICBUeXBlQ29uc3RyYWludCgpCiAgICAgIDogbG93ZXIgPSBjb25zdCBVbmtub3duVHlwZSgpLAogICAgICAgIHVwcGVyID0gY29uc3QgVW5rbm93blR5cGUoKTsKCiAgVHlwZUNvbnN0cmFpbnQuXyh0aGlzLmxvd2VyLCB0aGlzLnVwcGVyKTsKCiAgVHlwZUNvbnN0cmFpbnQgY2xvbmUoKSA9PiBuZXcgVHlwZUNvbnN0cmFpbnQuXyhsb3dlciwgdXBwZXIpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnJHt0eXBlU2NoZW1hVG9TdHJpbmcobG93ZXIpfSA8OiA8dHlwZT4gPDogJHt0eXBlU2NoZW1hVG9TdHJpbmcodXBwZXIpfSc7Cn0KCmNsYXNzIFR5cGVTY2hlbWFFbnZpcm9ubWVudCBleHRlbmRzIEhpZXJhcmNoeUJhc2VkVHlwZUVudmlyb25tZW50CiAgICB3aXRoIFN0YW5kYXJkQm91bmRzIHsKICBUeXBlU2NoZW1hRW52aXJvbm1lbnQoQ29yZVR5cGVzIGNvcmVUeXBlcywgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5KQogICAgICA6IHN1cGVyKGNvcmVUeXBlcywgaGllcmFyY2h5KTsKCiAgQ2xhc3MgZ2V0IGZ1bmN0aW9uQ2xhc3MgPT4gY29yZVR5cGVzLmZ1bmN0aW9uQ2xhc3M7CgogIEludGVyZmFjZVR5cGUgZ2V0TGVnYWN5TGVhc3RVcHBlckJvdW5kKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUxLCBJbnRlcmZhY2VUeXBlIHR5cGUyKSB7CiAgICByZXR1cm4gaGllcmFyY2h5LmdldExlZ2FjeUxlYXN0VXBwZXJCb3VuZCh0eXBlMSwgdHlwZTIpOwogIH0KCiAgLy8vIE1vZGlmeSB0aGUgZ2l2ZW4gW2NvbnN0cmFpbnRdJ3MgbG93ZXIgYm91bmQgdG8gaW5jbHVkZSBbbG93ZXJdLgogIHZvaWQgYWRkTG93ZXJCb3VuZChUeXBlQ29uc3RyYWludCBjb25zdHJhaW50LCBEYXJ0VHlwZSBsb3dlcikgewogICAgY29uc3RyYWludC5sb3dlciA9IGdldFN0YW5kYXJkVXBwZXJCb3VuZChjb25zdHJhaW50Lmxvd2VyLCBsb3dlcik7CiAgfQoKICAvLy8gTW9kaWZ5IHRoZSBnaXZlbiBbY29uc3RyYWludF0ncyB1cHBlciBib3VuZCB0byBpbmNsdWRlIFt1cHBlcl0uCiAgdm9pZCBhZGRVcHBlckJvdW5kKFR5cGVDb25zdHJhaW50IGNvbnN0cmFpbnQsIERhcnRUeXBlIHVwcGVyKSB7CiAgICBjb25zdHJhaW50LnVwcGVyID0gZ2V0U3RhbmRhcmRMb3dlckJvdW5kKGNvbnN0cmFpbnQudXBwZXIsIHVwcGVyKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljKERhcnRUeXBlIHR5cGUxLCBEYXJ0VHlwZSB0eXBlMikgewogICAgLy8gVE9ETyhwYXVsYmVycnkpOiB0aGlzIG1hdGNoZXMgd2hhdCBpcyBkZWZpbmVkIGluIHRoZSBzcGVjLiAgSXQgd291bGQgYmUKICAgIC8vIG5pY2UgaWYgd2UgY291bGQgY2hhbmdlIGtlcm5lbCB0byBtYXRjaCB0aGUgc3BlYyBhbmQgbm90IGhhdmUgdG8KICAgIC8vIG92ZXJyaWRlLgogICAgaWYgKHR5cGUxID09IGludFR5cGUpIHsKICAgICAgaWYgKHR5cGUyID09IGludFR5cGUpIHJldHVybiB0eXBlMjsKICAgICAgaWYgKHR5cGUyID09IGRvdWJsZVR5cGUpIHJldHVybiB0eXBlMjsKICAgIH0KICAgIHJldHVybiBudW1UeXBlOwogIH0KCiAgLy8vIEluZmVycyBhIGdlbmVyaWMgdHlwZSwgZnVuY3Rpb24sIG1ldGhvZCwgb3IgbGlzdC9tYXAgbGl0ZXJhbAogIC8vLyBpbnN0YW50aWF0aW9uLCB1c2luZyB0aGUgZG93bndhcmQgY29udGV4dCB0eXBlIGFzIHdlbGwgYXMgdGhlIGFyZ3VtZW50CiAgLy8vIHR5cGVzIGlmIGF2YWlsYWJsZS4KICAvLy8KICAvLy8gRm9yIGV4YW1wbGUsIGdpdmVuIGEgZnVuY3Rpb24gdHlwZSB3aXRoIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzLCB0aGlzCiAgLy8vIGluZmVycyB0aGUgdHlwZSBwYXJhbWV0ZXJzIGZyb20gdGhlIGFjdHVhbCBhcmd1bWVudCB0eXBlcy4KICAvLy8KICAvLy8gQ29uY3JldGVseSwgZ2l2ZW4gYSBmdW5jdGlvbiB0eXBlIHdpdGggcGFyYW1ldGVyIHR5cGVzIFAwLCBQMSwgLi4uIFBuLAogIC8vLyByZXN1bHQgdHlwZSBSLCBhbmQgZ2VuZXJpYyB0eXBlIHBhcmFtZXRlcnMgVDAsIFQxLCAuLi4gVG0sIHVzZSB0aGUKICAvLy8gYXJndW1lbnQgdHlwZXMgQTAsIEExLCAuLi4gQW4gdG8gc29sdmUgZm9yIHRoZSB0eXBlIHBhcmFtZXRlcnMuCiAgLy8vCiAgLy8vIEZvciBlYWNoIHBhcmFtZXRlciBQaSwgd2Ugd2FudCB0byBlbnN1cmUgdGhhdCBBaSA8OiBQaS4gV2UgY2FuIGRvIHRoaXMgYnkKICAvLy8gcnVubmluZyB0aGUgc3VidHlwZSBhbGdvcml0aG0sIGFuZCB3aGVuIHdlIHJlYWNoIGEgdHlwZSBwYXJhbWV0ZXIgVGosCiAgLy8vIHJlY29yZGluZyB0aGUgbG93ZXIgb3IgdXBwZXIgYm91bmQgaXQgbXVzdCBzYXRpc2Z5LiBBdCB0aGUgZW5kLCBhbGwKICAvLy8gY29uc3RyYWludHMgY2FuIGJlIGNvbWJpbmVkIHRvIGRldGVybWluZSB0aGUgdHlwZS4KICAvLy8KICAvLy8gQWxsIGNvbnN0cmFpbnRzIG9uIGVhY2ggdHlwZSBwYXJhbWV0ZXIgVGogYXJlIHRyYWNrZWQsIGFzIHdlbGwgYXMgd2hlcmUKICAvLy8gdGhleSBvcmlnaW5hdGVkLCBzbyB3ZSBjYW4gaXNzdWUgYW4gZXJyb3IgbWVzc2FnZSB0cmFjaW5nIGJhY2sgdG8gdGhlCiAgLy8vIGFyZ3VtZW50IHZhbHVlcywgdHlwZSBwYXJhbWV0ZXIgImV4dGVuZHMiIGNsYXVzZSwgb3IgdGhlIHJldHVybiB0eXBlCiAgLy8vIGNvbnRleHQuCiAgLy8vCiAgLy8vIElmIG5vbi1udWxsIHZhbHVlcyBmb3IgW2Zvcm1hbFR5cGVzXSBhbmQgW2FjdHVhbFR5cGVzXSBhcmUgcHJvdmlkZWQsIHRoaXMKICAvLy8gaXMgdXB3YXJkcyBpbmZlcmVuY2UuICBPdGhlcndpc2UgaXQgaXMgZG93bndhcmQgaW5mZXJlbmNlLgogIHZvaWQgaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUoCiAgICAgIERhcnRUeXBlIGRlY2xhcmVkUmV0dXJuVHlwZSwKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyc1RvSW5mZXIsCiAgICAgIExpc3Q8RGFydFR5cGU+IGZvcm1hbFR5cGVzLAogICAgICBMaXN0PERhcnRUeXBlPiBhY3R1YWxUeXBlcywKICAgICAgRGFydFR5cGUgcmV0dXJuQ29udGV4dFR5cGUsCiAgICAgIExpc3Q8RGFydFR5cGU+IGluZmVycmVkVHlwZXMsCiAgICAgIHtib29sIGlzQ29uc3Q6IGZhbHNlfSkgewogICAgaWYgKHR5cGVQYXJhbWV0ZXJzVG9JbmZlci5pc0VtcHR5KSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBDcmVhdGUgYSBUeXBlQ29uc3RyYWludEdhdGhlcmVyIHRoYXQgd2lsbCBhbGxvdyBjZXJ0YWluIHR5cGUgcGFyYW1ldGVycwogICAgLy8gdG8gYmUgaW5mZXJyZWQuIEl0IHdpbGwgb3B0aW1pc3RpY2FsbHkgYXNzdW1lIHRoZXNlIHR5cGUgcGFyYW1ldGVycyBjYW4KICAgIC8vIGJlIHN1YnR5cGVzIChvciBzdXBlcnR5cGVzKSBhcyBuZWNlc3NhcnksIGFuZCB0cmFjayB0aGUgY29uc3RyYWludHMgdGhhdAogICAgLy8gYXJlIGltcGxpZWQgYnkgdGhpcy4KICAgIHZhciBnYXRoZXJlciA9IG5ldyBUeXBlQ29uc3RyYWludEdhdGhlcmVyKHRoaXMsIHR5cGVQYXJhbWV0ZXJzVG9JbmZlcik7CgogICAgaWYgKCFpc0VtcHR5Q29udGV4dChyZXR1cm5Db250ZXh0VHlwZSkpIHsKICAgICAgaWYgKGlzQ29uc3QpIHsKICAgICAgICByZXR1cm5Db250ZXh0VHlwZSA9IG5ldyBUeXBlVmFyaWFibGVFbGltaW5hdG9yKGNvcmVUeXBlcykKICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHJldHVybkNvbnRleHRUeXBlKTsKICAgICAgfQogICAgICBnYXRoZXJlci50cnlTdWJ0eXBlTWF0Y2goZGVjbGFyZWRSZXR1cm5UeXBlLCByZXR1cm5Db250ZXh0VHlwZSk7CiAgICB9CgogICAgaWYgKGZvcm1hbFR5cGVzICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JtYWxUeXBlcy5sZW5ndGg7IGkrKykgewogICAgICAgIC8vIFRyeSB0byBwYXNzIGVhY2ggYXJndW1lbnQgdG8gZWFjaCBwYXJhbWV0ZXIsIHJlY29yZGluZyBhbnkgdHlwZQogICAgICAgIC8vIHBhcmFtZXRlciBib3VuZHMgdGhhdCB3ZXJlIGltcGxpZWQgYnkgdGhpcyBhc3NpZ25tZW50LgogICAgICAgIGdhdGhlcmVyLnRyeVN1YnR5cGVNYXRjaChhY3R1YWxUeXBlc1tpXSwgZm9ybWFsVHlwZXNbaV0pOwogICAgICB9CiAgICB9CgogICAgaW5mZXJUeXBlRnJvbUNvbnN0cmFpbnRzKAogICAgICAgIGdhdGhlcmVyLmNvbXB1dGVDb25zdHJhaW50cygpLCB0eXBlUGFyYW1ldGVyc1RvSW5mZXIsIGluZmVycmVkVHlwZXMsCiAgICAgICAgZG93bndhcmRzSW5mZXJQaGFzZTogZm9ybWFsVHlwZXMgPT0gbnVsbCk7CiAgfQoKICBib29sIGhhc09taXR0ZWRCb3VuZChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlcikgewogICAgLy8gSWYgdGhlIGJvdW5kIHdhcyBvbWl0dGVkIGJ5IHRoZSBwcm9ncmFtbWVyLCB0aGUgS2VybmVsIHJlcHJlc2VudGF0aW9uIGZvcgogICAgLy8gdGhlIHBhcmFtZXRlciB3aWxsIGxvb2sgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOgogICAgLy8KICAgIC8vICAgICBUIGV4dGVuZHMgT2JqZWN0ID0gZHluYW1pYwogICAgLy8KICAgIC8vIE5vdGUgdGhhdCBpdCdzIG5vdCBwb3NzaWJsZSB0byByZWNlaXZlIFtPYmplY3RdIGFzIFtUeXBlUGFyYW1ldGVyLmJvdW5kXQogICAgLy8gYW5kIGBkeW5hbWljYCBhcyBbVHlwZVBhcmFtZXRlci5kZWZhdWx0VHlwZV0gZnJvbSB0aGUgZnJvbnQgZW5kIGluIGFueQogICAgLy8gb3RoZXIgd2F5LgogICAgRGFydFR5cGUgYm91bmQgPSBwYXJhbWV0ZXIuYm91bmQ7CiAgICByZXR1cm4gYm91bmQgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIGlkZW50aWNhbChib3VuZC5jbGFzc05vZGUsIGNvcmVUeXBlcy5vYmplY3RDbGFzcykgJiYKICAgICAgICBwYXJhbWV0ZXIuZGVmYXVsdFR5cGUgaXMgRHluYW1pY1R5cGU7CiAgfQoKICAvLy8gVXNlIHRoZSBnaXZlbiBbY29uc3RyYWludHNdIHRvIHN1YnN0aXR1dGUgZm9yIHR5cGUgdmFyaWFibGVzLgogIC8vLwogIC8vLyBbdHlwZVBhcmFtZXRlcnNUb0luZmVyXSBpcyB0aGUgc2V0IG9mIHR5cGUgcGFyYW1ldGVycyB0aGF0IHNob3VsZCBiZQogIC8vLyBzdWJzdGl0dXRlZCBmb3IuICBbaW5mZXJyZWRUeXBlc10gc2hvdWxkIGJlIGEgbGlzdCBvZiB0aGUgc2FtZSBsZW5ndGguCiAgLy8vCiAgLy8vIElmIFtkb3dud2FyZHNJbmZlclBoYXNlXSBpcyBgdHJ1ZWAsIHRoZW4gd2UgYXJlIGluIHRoZSBmaXJzdCBwYXNzIG9mCiAgLy8vIGluZmVyZW5jZSwgcHVzaGluZyBjb250ZXh0IHR5cGVzIGRvd24uICBUaGlzIG1lYW5zIHdlIGFyZSBhbGxvd2VkIHRvIHB1c2gKICAvLy8gZG93biBgP2AgdG8gcHJlY2lzZWx5IHJlcHJlc2VudCBhbiB1bmtub3duIHR5cGUuICBbaW5mZXJyZWRUeXBlc10gc2hvdWxkCiAgLy8vIGJlIGluaXRpYWxseSBwb3B1bGF0ZWQgd2l0aCBgP2AuICBUaGVzZSBgP2BzIHdpbGwgYmUgcmVwbGFjZWQsIGlmCiAgLy8vIGFwcHJvcHJpYXRlLCB3aXRoIHRoZSB0eXBlcyB0aGF0IHdlcmUgaW5mZXJyZWQgYnkgZG93bndhcmRzIGluZmVyZW5jZS4KICAvLy8KICAvLy8gSWYgW2Rvd253YXJkc0luZmVyUGhhc2VdIGlzIGBmYWxzZWAsIHRoZW4gd2UgYXJlIGluIHRoZSBzZWNvbmQgcGFzcyBvZgogIC8vLyBpbmZlcmVuY2UsIGFuZCBtdXN0IG5vdCBjb25jbHVkZSBgP2AgZm9yIGFueSB0eXBlIGZvcm1hbC4gIEluIHRoaXMgcGFzcywKICAvLy8gW2luZmVycmVkVHlwZXNdIHNob3VsZCBjb250YWluIHRoZSB2YWx1ZXMgZnJvbSB0aGUgZmlyc3QgcGFzcy4gIFRoZXkgd2lsbAogIC8vLyBiZSByZXBsYWNlZCB3aXRoIHRoZSBmaW5hbCBpbmZlcnJlZCB0eXBlcy4KICB2b2lkIGluZmVyVHlwZUZyb21Db25zdHJhaW50cyhNYXA8VHlwZVBhcmFtZXRlciwgVHlwZUNvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzLAogICAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzVG9JbmZlciwgTGlzdDxEYXJ0VHlwZT4gaW5mZXJyZWRUeXBlcywKICAgICAge2Jvb2wgZG93bndhcmRzSW5mZXJQaGFzZTogZmFsc2V9KSB7CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlc0Zyb21Eb3dud2FyZHNJbmZlcmVuY2UgPQogICAgICAgIGRvd253YXJkc0luZmVyUGhhc2UgPyBudWxsIDogaW5mZXJyZWRUeXBlcy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzVG9JbmZlci5sZW5ndGg7IGkrKykgewogICAgICBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbSA9IHR5cGVQYXJhbWV0ZXJzVG9JbmZlcltpXTsKCiAgICAgIHZhciB0eXBlUGFyYW1Cb3VuZCA9IHR5cGVQYXJhbS5ib3VuZDsKICAgICAgRGFydFR5cGUgZXh0ZW5kc0NvbnN0cmFpbnQ7CiAgICAgIGlmICghaGFzT21pdHRlZEJvdW5kKHR5cGVQYXJhbSkpIHsKICAgICAgICBleHRlbmRzQ29uc3RyYWludCA9CiAgICAgICAgICAgIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnModHlwZVBhcmFtZXRlcnNUb0luZmVyLCBpbmZlcnJlZFR5cGVzKQogICAgICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHR5cGVQYXJhbUJvdW5kKTsKICAgICAgfQoKICAgICAgdmFyIGNvbnN0cmFpbnQgPSBjb25zdHJhaW50c1t0eXBlUGFyYW1dOwogICAgICBpZiAoZG93bndhcmRzSW5mZXJQaGFzZSkgewogICAgICAgIGluZmVycmVkVHlwZXNbaV0gPQogICAgICAgICAgICBfaW5mZXJUeXBlUGFyYW1ldGVyRnJvbUNvbnRleHQoY29uc3RyYWludCwgZXh0ZW5kc0NvbnN0cmFpbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGluZmVycmVkVHlwZXNbaV0gPSBfaW5mZXJUeXBlUGFyYW1ldGVyRnJvbUFsbCgKICAgICAgICAgICAgdHlwZXNGcm9tRG93bndhcmRzSW5mZXJlbmNlW2ldLCBjb25zdHJhaW50LCBleHRlbmRzQ29uc3RyYWludCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBJZiB0aGUgZG93bndhcmRzIGluZmVyIHBoYXNlIGhhcyBmYWlsZWQsIHdlJ2xsIGNhdGNoIHRoaXMgaW4gdGhlIHVwd2FyZHMKICAgIC8vIHBoYXNlIGxhdGVyIG9uLgogICAgaWYgKGRvd253YXJkc0luZmVyUGhhc2UpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIENoZWNrIHRoZSBpbmZlcnJlZCB0eXBlcyBhZ2FpbnN0IGFsbCBvZiB0aGUgY29uc3RyYWludHMuCiAgICB2YXIga25vd25UeXBlcyA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnNUb0luZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtID0gdHlwZVBhcmFtZXRlcnNUb0luZmVyW2ldOwogICAgICB2YXIgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzW3R5cGVQYXJhbV07CiAgICAgIHZhciB0eXBlUGFyYW1Cb3VuZCA9CiAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKHR5cGVQYXJhbWV0ZXJzVG9JbmZlciwgaW5mZXJyZWRUeXBlcykKICAgICAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUodHlwZVBhcmFtLmJvdW5kKTsKCiAgICAgIHZhciBpbmZlcnJlZCA9IGluZmVycmVkVHlwZXNbaV07CiAgICAgIGJvb2wgc3VjY2VzcyA9IHR5cGVTYXRpc2ZpZXNDb25zdHJhaW50KGluZmVycmVkLCBjb25zdHJhaW50KTsKICAgICAgaWYgKHN1Y2Nlc3MgJiYgIWhhc09taXR0ZWRCb3VuZCh0eXBlUGFyYW0pKSB7CiAgICAgICAgLy8gSWYgZXZlcnl0aGluZyBlbHNlIHN1Y2NlZWRlZCwgY2hlY2sgdGhlIGBleHRlbmRzYCBjb25zdHJhaW50LgogICAgICAgIHZhciBleHRlbmRzQ29uc3RyYWludCA9IHR5cGVQYXJhbUJvdW5kOwogICAgICAgIHN1Y2Nlc3MgPSBpc1N1YnR5cGVPZihpbmZlcnJlZCwgZXh0ZW5kc0NvbnN0cmFpbnQpOwogICAgICB9CgogICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IHJlcG9ydCBlcnJvci4KCiAgICAgICAgLy8gSGV1cmlzdGljOiBldmVuIGlmIHdlIGZhaWxlZCwga2VlcCB0aGUgZXJyb25lb3VzIHR5cGUuCiAgICAgICAgLy8gSXQgc2hvdWxkIHNhdGlzZnkgYXQgbGVhc3Qgc29tZSBvZiB0aGUgY29uc3RyYWludHMgKGUuZy4gdGhlIHJldHVybgogICAgICAgIC8vIGNvbnRleHQpLiBJZiB3ZSBmYWxsIGJhY2sgdG8gaW5zdGFudGlhdGVUb0JvdW5kcywgd2UnbGwgdHlwaWNhbGx5IGdldAogICAgICAgIC8vIG1vcmUgZXJyb3JzIChlLmcuIGJlY2F1c2UgYGR5bmFtaWNgIGlzIHRoZSBtb3N0IGNvbW1vbiBib3VuZCkuCiAgICAgIH0KCiAgICAgIGlmIChpc0tub3duKGluZmVycmVkKSkgewogICAgICAgIGtub3duVHlwZXNbdHlwZVBhcmFtXSA9IGluZmVycmVkOwogICAgICB9CiAgICB9CgogICAgLy8gVE9ETyhwYXVsYmVycnkpOiByZXBvcnQgYW55IGVycm9ycyBmcm9tIGluc3RhbnRpYXRlVG9Cb3VuZHMuCiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU3VidHlwZU9mKERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSkgewogICAgaWYgKHN1YnR5cGUgaXMgVW5rbm93blR5cGUpIHJldHVybiB0cnVlOwogICAgaWYgKHN1YnR5cGUgPT0gTnVsbCAmJiBzdXBlcnR5cGUgaXMgVW5rbm93blR5cGUpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIHN1cGVyLmlzU3VidHlwZU9mKHN1YnR5cGUsIHN1cGVydHlwZSk7CiAgfQoKICBib29sIGlzRW1wdHlDb250ZXh0KERhcnRUeXBlIGNvbnRleHQpIHsKICAgIGlmIChjb250ZXh0IGlzIER5bmFtaWNUeXBlKSB7CiAgICAgIC8vIEFuYWx5emVyIHRyZWF0cyBhIHR5cGUgY29udGV4dCBvZiBgZHluYW1pY2AgYXMgZXF1aXZhbGVudCB0byBhbiBlbXB0eQogICAgICAvLyBjb250ZXh0LiAgVE9ETyhwYXVsYmVycnkpOiB0aGlzIGlzIG5vdCBzcGVjJ2VkIGFueXdoZXJlOyBkbyB3ZSBzdGlsbAogICAgICAvLyB3YW50IHRvIGRvIHRoaXM/CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGNvbnRleHQgPT0gbnVsbDsKICB9CgogIC8vLyBUcnVlIGlmIFttZW1iZXJdIGlzIGEgYmluYXJ5IG9wZXJhdG9yIHRoYXQgcmV0dXJucyBhbiBgaW50YCBpZiBib3RoCiAgLy8vIG9wZXJhbmRzIGFyZSBgaW50YCwgYW5kIG90aGVyd2lzZSByZXR1cm5zIGBkb3VibGVgLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhpcyBiZWhhdmlvciBkZXBlbmRzIG9uIHRoZSByZWNlaXZlciB0eXBlLCBzbyB3ZSBjYW4gb25seSBtYWtlCiAgLy8vIHRoaXMgZGV0ZXJtaW5hdGlvbiBpZiB3ZSBrbm93IHRoZSB0eXBlIG9mIHRoZSByZWNlaXZlci4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNhc2Ugb2YgdHlwZS1iYXNlZCBvdmVybG9hZGluZywgd2hpY2ggaW4gRGFydCBpcyBvbmx5IHN1cHBvcnRlZAogIC8vLyBieSBnaXZpbmcgc3BlY2lhbCB0cmVhdG1lbnQgdG8gY2VydGFpbiBhcml0aG1ldGljIG9wZXJhdG9ycy4KICBib29sIGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvckFuZFR5cGUoCiAgICAgIFByb2NlZHVyZSBtZW1iZXIsIERhcnRUeXBlIHJlY2VpdmVyVHlwZSkgewogICAgLy8gVE9ETyhwYXVsYmVycnkpOiB0aGlzIG1hdGNoZXMgd2hhdCBpcyBkZWZpbmVkIGluIHRoZSBzcGVjLiAgSXQgd291bGQgYmUKICAgIC8vIG5pY2UgaWYgd2UgY291bGQgY2hhbmdlIGtlcm5lbCB0byBtYXRjaCB0aGUgc3BlYyBhbmQgbm90IGhhdmUgdG8KICAgIC8vIG92ZXJyaWRlLgogICAgaWYgKG1lbWJlci5uYW1lLm5hbWUgPT0gJ3JlbWFpbmRlcicpIHJldHVybiBmYWxzZTsKICAgIGlmICghKHJlY2VpdmVyVHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgaWRlbnRpY2FsKHJlY2VpdmVyVHlwZS5jbGFzc05vZGUsIGNvcmVUeXBlcy5pbnRDbGFzcykpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiBpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3IobWVtYmVyKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNUb3AoRGFydFR5cGUgdCkgewogICAgaWYgKHQgaXMgVW5rbm93blR5cGUpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gc3VwZXIuaXNUb3AodCk7CiAgICB9CiAgfQoKICAvLy8gQ29tcHV0ZXMgdGhlIGNvbnN0cmFpbnQgc29sdXRpb24gZm9yIGEgdHlwZSB2YXJpYWJsZSBiYXNlZCBvbiBhIGdpdmVuIHNldAogIC8vLyBvZiBjb25zdHJhaW50cy4KICAvLy8KICAvLy8gSWYgW2dyb3VuZGVkXSBpcyBgdHJ1ZWAsIHRoZW4gdGhlIHJldHVybmVkIHR5cGUgaXMgZ3VhcmFudGVlZCB0byBiZSBhCiAgLy8vIGtub3duIHR5cGUgKGkuZS4gaXQgd2lsbCBub3QgY29udGFpbiBhbnkgaW5zdGFuY2VzIG9mIGA/YCkuCiAgRGFydFR5cGUgc29sdmVUeXBlQ29uc3RyYWludChUeXBlQ29uc3RyYWludCBjb25zdHJhaW50LAogICAgICB7Ym9vbCBncm91bmRlZDogZmFsc2V9KSB7CiAgICAvLyBQcmVmZXIgdGhlIGtub3duIGJvdW5kLCBpZiBhbnkuCiAgICBpZiAoaXNLbm93bihjb25zdHJhaW50Lmxvd2VyKSkgcmV0dXJuIGNvbnN0cmFpbnQubG93ZXI7CiAgICBpZiAoaXNLbm93bihjb25zdHJhaW50LnVwcGVyKSkgcmV0dXJuIGNvbnN0cmFpbnQudXBwZXI7CgogICAgLy8gT3RoZXJ3aXNlIHRha2Ugd2hhdGV2ZXIgYm91bmQgaGFzIHBhcnRpYWwgaW5mb3JtYXRpb24sIGUuZy4gYEl0ZXJhYmxlPD8+YAogICAgaWYgKGNvbnN0cmFpbnQubG93ZXIgaXMhIFVua25vd25UeXBlKSB7CiAgICAgIHJldHVybiBncm91bmRlZAogICAgICAgICAgPyBsZWFzdENsb3N1cmUoY29yZVR5cGVzLCBjb25zdHJhaW50Lmxvd2VyKQogICAgICAgICAgOiBjb25zdHJhaW50Lmxvd2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGdyb3VuZGVkCiAgICAgICAgICA/IGdyZWF0ZXN0Q2xvc3VyZShjb3JlVHlwZXMsIGNvbnN0cmFpbnQudXBwZXIpCiAgICAgICAgICA6IGNvbnN0cmFpbnQudXBwZXI7CiAgICB9CiAgfQoKICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBbdHlwZV0gc2F0aXNmaWVzIHRoZSBnaXZlbiB0eXBlIFtjb25zdHJhaW50XS4KICBib29sIHR5cGVTYXRpc2ZpZXNDb25zdHJhaW50KERhcnRUeXBlIHR5cGUsIFR5cGVDb25zdHJhaW50IGNvbnN0cmFpbnQpIHsKICAgIHJldHVybiBpc1N1YnR5cGVPZihjb25zdHJhaW50Lmxvd2VyLCB0eXBlKSAmJgogICAgICAgIGlzU3VidHlwZU9mKHR5cGUsIGNvbnN0cmFpbnQudXBwZXIpOwogIH0KCiAgRGFydFR5cGUgX2luZmVyVHlwZVBhcmFtZXRlckZyb21BbGwoRGFydFR5cGUgdHlwZUZyb21Db250ZXh0SW5mZXJlbmNlLAogICAgICBUeXBlQ29uc3RyYWludCBjb25zdHJhaW50LCBEYXJ0VHlwZSBleHRlbmRzQ29uc3RyYWludCkgewogICAgLy8gU2VlIGlmIHdlIGFscmVhZHkgZml4ZWQgdGhpcyB0eXBlIGZyb20gZG93bndhcmRzIGluZmVyZW5jZS4KICAgIC8vIElmIHNvLCB0aGVuIHdlIGFyZW4ndCBhbGxvd2VkIHRvIGNoYW5nZSBpdCBiYXNlZCBvbiBhcmd1bWVudCB0eXBlcy4KICAgIGlmIChpc0tub3duKHR5cGVGcm9tQ29udGV4dEluZmVyZW5jZSkpIHsKICAgICAgcmV0dXJuIHR5cGVGcm9tQ29udGV4dEluZmVyZW5jZTsKICAgIH0KCiAgICBpZiAoZXh0ZW5kc0NvbnN0cmFpbnQgIT0gbnVsbCkgewogICAgICBjb25zdHJhaW50ID0gY29uc3RyYWludC5jbG9uZSgpOwogICAgICBhZGRVcHBlckJvdW5kKGNvbnN0cmFpbnQsIGV4dGVuZHNDb25zdHJhaW50KTsKICAgIH0KCiAgICByZXR1cm4gc29sdmVUeXBlQ29uc3RyYWludChjb25zdHJhaW50LCBncm91bmRlZDogdHJ1ZSk7CiAgfQoKICBEYXJ0VHlwZSBfaW5mZXJUeXBlUGFyYW1ldGVyRnJvbUNvbnRleHQoCiAgICAgIFR5cGVDb25zdHJhaW50IGNvbnN0cmFpbnQsIERhcnRUeXBlIGV4dGVuZHNDb25zdHJhaW50KSB7CiAgICBEYXJ0VHlwZSB0ID0gc29sdmVUeXBlQ29uc3RyYWludChjb25zdHJhaW50KTsKICAgIGlmICghaXNLbm93bih0KSkgewogICAgICByZXR1cm4gdDsKICAgIH0KCiAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byBtYWtlIG91ciBmaW5hbCBjaG9pY2UsIGFwcGx5IHRoZSBleHRlbmRzIGNsYXVzZS4KICAgIC8vIFRoaXMgZ2l2ZXMgdXMgYSBjaGFuY2UgdG8gcmVmaW5lIHRoZSBjaG9pY2UsIGluIGNhc2UgaXQgd291bGQgdmlvbGF0ZQogICAgLy8gdGhlIGBleHRlbmRzYCBjbGF1c2UuIEZvciBleGFtcGxlOgogICAgLy8KICAgIC8vICAgICBPYmplY3Qgb2JqID0gbWF0aC5taW4vKjxpbmZlciBPYmplY3QsIGVycm9yPiovKDEsIDIpOwogICAgLy8KICAgIC8vIElmIHdlIGNvbnNpZGVyIHRoZSBgVCBleHRlbmRzIG51bWAgd2UgY29uY2x1ZGUgYDxudW0+YCwgd2hpY2ggd29ya3MuCiAgICBpZiAoZXh0ZW5kc0NvbnN0cmFpbnQgIT0gbnVsbCkgewogICAgICBjb25zdHJhaW50ID0gY29uc3RyYWludC5jbG9uZSgpOwogICAgICBhZGRVcHBlckJvdW5kKGNvbnN0cmFpbnQsIGV4dGVuZHNDb25zdHJhaW50KTsKICAgICAgcmV0dXJuIHNvbHZlVHlwZUNvbnN0cmFpbnQoY29uc3RyYWludCk7CiAgICB9CiAgICByZXR1cm4gdDsKICB9Cn0KCmNsYXNzIFR5cGVWYXJpYWJsZUVsaW1pbmF0b3IgZXh0ZW5kcyBTdWJzdGl0dXRpb24gewogIGZpbmFsIENvcmVUeXBlcyBfY29yZVR5cGVzOwoKICBUeXBlVmFyaWFibGVFbGltaW5hdG9yKHRoaXMuX2NvcmVUeXBlcyk7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFN1YnN0aXR1dGUoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIsIGJvb2wgdXBwZXJCb3VuZCkgewogICAgcmV0dXJuIHVwcGVyQm91bmQKICAgICAgICA/IF9jb3JlVHlwZXMubnVsbENsYXNzLnJhd1R5cGUKICAgICAgICA6IF9jb3JlVHlwZXMub2JqZWN0Q2xhc3MucmF3VHlwZTsKICB9Cn0KgZwATU4/ASEJDxIVFhcTExcBQgE4AT0BQigBMwFEAUkBSgFAIxcyLTwbSzQsKUQVKTssETwCAVBHSUYCAVA4SDYxCyAEAgE7F0stEgFRJxIBEyUlASwBQAEXUAIBQhpHJQE2ASoyPQQBRkJHBAFGQkcEAQxLT0gRHCotBhQEAUNNGgZMQQZNSUYGUExKOQZOTEsPBlBBIyMxIiIiJB8pDgYBT09QHEwBLhVCMAhHBgEfNUtCQggGAR5NMwQBMlE5ByYHUE4SJiU9LgQBRAZLTQZLUE9ITQZNT1AxUE8rMUwBPToBLCIpHEkxCAEvIRtLDzdMCAYBUBcfDgYBQDI9Oi8bRzABJ0Q0STA8CAEWKgFCT1FKCAEfKggGAUQEAQw7LUIyBAEqIk9OGhMGHAQBSjoGUD4GUEMuMU9IETcrQhQGMwQBDBscEw0dBgQBUBYGTEI6ICc8PAFRLBY2Hg0WOR4GBAFLSzItBAFJP0NLLScGASUnNAYBPAQBKz8yFxAGAUpNKgdBB0wlJzQuBg4EAgE0HgErAQxFFicqBAIBR3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX3NjaGVtYV9lbnZpcm9ubWVudC5kYXJ0NXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9pZGVudGlmaWVycy5kYXJ0j0UvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5xdWFsaWZpZWRfbmFtZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgRXhwcmVzc2lvbjsKCmltcG9ydCAncHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQsIHVuc3VwcG9ydGVkOwoKaW1wb3J0ICdzY2FubmVyLmRhcnQnIHNob3cgVG9rZW47CgpjbGFzcyBJZGVudGlmaWVyIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKCiAgSWRlbnRpZmllcihUb2tlbiB0b2tlbikKICAgICAgOiBuYW1lID0gdG9rZW4ubGV4ZW1lLAogICAgICAgIGNoYXJPZmZzZXQgPSB0b2tlbi5jaGFyT2Zmc2V0OwoKICBJZGVudGlmaWVyLl8odGhpcy5uYW1lLCB0aGlzLmNoYXJPZmZzZXQpOwoKICBmYWN0b3J5IElkZW50aWZpZXIucHJlc2VydmVUb2tlbihUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG5ldyBfVG9rZW5JZGVudGlmaWVyKHRva2VuKTsKICB9CgogIEV4cHJlc3Npb24gZ2V0IGluaXRpYWxpemVyID0+IG51bGw7CgogIGludCBnZXQgZW5kQ2hhck9mZnNldCA9PiBjaGFyT2Zmc2V0ICsgbmFtZS5sZW5ndGg7CgogIFF1YWxpZmllZE5hbWUgd2l0aFF1YWxpZmllcihPYmplY3QgcXVhbGlmaWVyKSB7CiAgICByZXR1cm4gbmV3IFF1YWxpZmllZE5hbWUuXyhxdWFsaWZpZXIsIG5hbWUsIGNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gImlkZW50aWZpZXIoJG5hbWUpIjsKfQoKY2xhc3MgX1Rva2VuSWRlbnRpZmllciBpbXBsZW1lbnRzIElkZW50aWZpZXIgewogIGZpbmFsIFRva2VuIHRva2VuOwoKICBfVG9rZW5JZGVudGlmaWVyKHRoaXMudG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gdG9rZW4ubGV4ZW1lOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGNoYXJPZmZzZXQgPT4gdG9rZW4uY2hhck9mZnNldDsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBnZXQgaW5pdGlhbGl6ZXIgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBlbmRDaGFyT2Zmc2V0ID0+IGNoYXJPZmZzZXQgKyBuYW1lLmxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgUXVhbGlmaWVkTmFtZSB3aXRoUXVhbGlmaWVyKE9iamVjdCBxdWFsaWZpZXIpIHsKICAgIHJldHVybiBuZXcgX1Rva2VuUXVhbGlmaWVkTmFtZShxdWFsaWZpZXIsIHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICJ0b2tlbi1pZGVudGlmaWVyKCRuYW1lKSI7Cn0KCmNsYXNzIEluaXRpYWxpemVkSWRlbnRpZmllciBleHRlbmRzIF9Ub2tlbklkZW50aWZpZXIgewogIEBvdmVycmlkZQogIGZpbmFsIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXI7CgogIEluaXRpYWxpemVkSWRlbnRpZmllcihfVG9rZW5JZGVudGlmaWVyIGlkZW50aWZpZXIsIHRoaXMuaW5pdGlhbGl6ZXIpCiAgICAgIDogc3VwZXIoaWRlbnRpZmllci50b2tlbik7CgogIEBvdmVycmlkZQogIFF1YWxpZmllZE5hbWUgd2l0aFF1YWxpZmllcihPYmplY3QgcXVhbGlmaWVyKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoIndpdGhRdWFsaWZpZXIiLCBjaGFyT2Zmc2V0LCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICJpbml0aWFsaXplZC1pZGVudGlmaWVyKCRuYW1lLCAkaW5pdGlhbGl6ZXIpIjsKfQoKY2xhc3MgUXVhbGlmaWVkTmFtZSBleHRlbmRzIElkZW50aWZpZXIgewogIGZpbmFsIE9iamVjdCBxdWFsaWZpZXI7CgogIFF1YWxpZmllZE5hbWUodGhpcy5xdWFsaWZpZXIsIFRva2VuIHN1ZmZpeCkgOiBzdXBlcihzdWZmaXgpOwoKICBRdWFsaWZpZWROYW1lLl8odGhpcy5xdWFsaWZpZXIsIFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCkKICAgICAgOiBzdXBlci5fKG5hbWUsIGNoYXJPZmZzZXQpOwoKICBAb3ZlcnJpZGUKICBRdWFsaWZpZWROYW1lIHdpdGhRdWFsaWZpZXIoT2JqZWN0IHF1YWxpZmllcikgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJ3aXRoUXVhbGlmaWVyIiwgY2hhck9mZnNldCwgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAicXVhbGlmaWVkLW5hbWUoJHF1YWxpZmllciwgJG5hbWUpIjsKfQoKY2xhc3MgX1Rva2VuUXVhbGlmaWVkTmFtZSBleHRlbmRzIF9Ub2tlbklkZW50aWZpZXIgaW1wbGVtZW50cyBRdWFsaWZpZWROYW1lIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBPYmplY3QgcXVhbGlmaWVyOwoKICBfVG9rZW5RdWFsaWZpZWROYW1lKHRoaXMucXVhbGlmaWVyLCBUb2tlbiBzdWZmaXgpCiAgICAgIDogYXNzZXJ0KHF1YWxpZmllciBpcyEgSWRlbnRpZmllciB8fCBxdWFsaWZpZXIgaXMgX1Rva2VuSWRlbnRpZmllciksCiAgICAgICAgc3VwZXIoc3VmZml4KTsKCiAgQG92ZXJyaWRlCiAgUXVhbGlmaWVkTmFtZSB3aXRoUXVhbGlmaWVyKE9iamVjdCBxdWFsaWZpZXIpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgid2l0aFF1YWxpZmllciIsIGNoYXJPZmZzZXQsIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gInRva2VuLXF1YWxpZmllZC1uYW1lKCRxdWFsaWZpZXIsICRuYW1lKSI7Cn0KCnZvaWQgZmxhdHRlblF1YWxpZmllZE5hbWVPbigKICAgIFF1YWxpZmllZE5hbWUgbmFtZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKSB7CiAgZmluYWwgT2JqZWN0IHF1YWxpZmllciA9IG5hbWUucXVhbGlmaWVyOwogIGlmIChxdWFsaWZpZXIgaXMgUXVhbGlmaWVkTmFtZSkgewogICAgZmxhdHRlblF1YWxpZmllZE5hbWVPbihxdWFsaWZpZXIsIGJ1ZmZlciwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfSBlbHNlIGlmIChxdWFsaWZpZXIgaXMgSWRlbnRpZmllcikgewogICAgYnVmZmVyLndyaXRlKHF1YWxpZmllci5uYW1lKTsKICB9IGVsc2UgaWYgKHF1YWxpZmllciBpcyBTdHJpbmcpIHsKICAgIGJ1ZmZlci53cml0ZShxdWFsaWZpZXIpOwogIH0gZWxzZSB7CiAgICB1bmhhbmRsZWQoIiR7cXVhbGlmaWVyLnJ1bnRpbWVUeXBlfSIsICJmbGF0dGVuUXVhbGlmaWVkTmFtZU9uIiwgY2hhck9mZnNldCwKICAgICAgICBmaWxlVXJpKTsKICB9CiAgYnVmZmVyLndyaXRlKCIuIik7CiAgYnVmZmVyLndyaXRlKG5hbWUubmFtZSk7Cn0KClN0cmluZyBmbGF0dGVuTmFtZShPYmplY3QgbmFtZSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKSB7CiAgaWYgKG5hbWUgaXMgU3RyaW5nKSB7CiAgICByZXR1cm4gbmFtZTsKICB9IGVsc2UgaWYgKG5hbWUgaXMgUXVhbGlmaWVkTmFtZSkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGZsYXR0ZW5RdWFsaWZpZWROYW1lT24obmFtZSwgYnVmZmVyLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIHJldHVybiAiJGJ1ZmZlciI7CiAgfSBlbHNlIGlmIChuYW1lIGlzIElkZW50aWZpZXIpIHsKICAgIHJldHVybiBuYW1lLm5hbWU7CiAgfSBlbHNlIHsKICAgIHJldHVybiB1bmhhbmRsZWQoIiR7bmFtZS5ydW50aW1lVHlwZX0iLCAiZmxhdHRlbk5hbWUiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9Cn0KClRva2VuIGRlcHJlY2F0ZWRfZXh0cmFjdFRva2VuKElkZW50aWZpZXIgaWRlbnRpZmllcikgewogIF9Ub2tlbklkZW50aWZpZXIgdG9rZW5JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKICByZXR1cm4gdG9rZW5JZGVudGlmaWVyPy50b2tlbjsKfQqAlwBOTjwBHgEyATQBIgETFRgBGh0nASwBMigEASYBNQEyPQQBDCwCAS8VASABDCMBDCoBDCYBDDUBDDI2BAEMMgIBNwwgAUchAQwyOwQBDEYCASkaAT8BPyMBDDI7BAEMPAIBTgwaATRLFwEMMjsEAQxCAgEdTCskRCgiJB0LUBIEFRsCAT8YESYuPxYjFgtRBAIBNzEhAgEscGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2lkZW50aWZpZXJzLmRhcnRGc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvYnVpbHRpbl90eXBlX2J1aWxkZXIuZGFydIOALy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuYnVpbHRpbl90eXBlX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IERhcnRUeXBlOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnIHNob3cgTGlicmFyeUJ1aWxkZXIsIFR5cGVCdWlsZGVyLCBUeXBlRGVjbGFyYXRpb25CdWlsZGVyOwoKYWJzdHJhY3QgY2xhc3MgQnVpbHRpblR5cGVCdWlsZGVyIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uQnVpbGRlciB7CiAgZmluYWwgRGFydFR5cGUgdHlwZTsKCiAgQnVpbHRpblR5cGVCdWlsZGVyKAogICAgICBTdHJpbmcgbmFtZSwgdGhpcy50eXBlLCBMaWJyYXJ5QnVpbGRlciBjb21waWxhdGlvblVuaXQsIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyKG51bGwsIDAsIG5hbWUsIGNvbXBpbGF0aW9uVW5pdCwgY2hhck9mZnNldCk7CgogIERhcnRUeXBlIGJ1aWxkVHlwZShMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBMaXN0PFR5cGVCdWlsZGVyPiBhcmd1bWVudHMpID0+CiAgICAgIHR5cGU7CgogIERhcnRUeXBlIGJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHMoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cykgewogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiQnVpbHRpblR5cGVCdWlsZGVyIjsKfQodAE5OPAEkATABUAFDFwEWTjsBTQwBKToRBAEwAgE9cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvYnVpbHRpbl90eXBlX2J1aWxkZXIuZGFydD9zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9jbGFzc19idWlsZGVyLmRhcnTAAQ94Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuY2xhc3NfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIEFzRXhwcmVzc2lvbiwKICAgICAgICBDbGFzcywKICAgICAgICBDb25zdHJ1Y3RvciwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZpZWxkLAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIEludmFsaWRUeXBlLAogICAgICAgIExpc3RMaXRlcmFsLAogICAgICAgIE1lbWJlciwKICAgICAgICBNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIE5hbWUsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFByb2NlZHVyZUtpbmQsCiAgICAgICAgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IsCiAgICAgICAgUmV0dXJuU3RhdGVtZW50LAogICAgICAgIFN0YXRpY0dldCwKICAgICAgICBTdXBlcnR5cGUsCiAgICAgICAgVGhpc0V4cHJlc3Npb24sCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uLAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBGdW5jdGlvblR5cGUsIFR5cGVQYXJhbWV0ZXJUeXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xvbmUuZGFydCcgc2hvdyBDbG9uZVdpdGhvdXRCb2R5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9zcmMvYm91bmRzX2NoZWNrcy5kYXJ0JwogICAgc2hvdyBUeXBlQXJndW1lbnRJc3N1ZSwgZmluZFR5cGVBcmd1bWVudElzc3VlcywgZ2V0R2VuZXJpY1R5cGVOYW1lOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb24sIHN1YnN0aXR1dGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBhcyB0eXBlX2FsZ2VicmEKICAgIHNob3cgZ2V0U3Vic3RpdHV0aW9uTWFwOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZUVudmlyb25tZW50OwoKaW1wb3J0ICcuLi9kaWxsL2RpbGxfbWVtYmVyX2J1aWxkZXIuZGFydCcgc2hvdyBEaWxsTWVtYmVyQnVpbGRlcjsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciwKICAgICAgICBEZWNsYXJhdGlvbiwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBNZW1iZXJCdWlsZGVyLAogICAgICAgIE1ldGFkYXRhQnVpbGRlciwKICAgICAgICBTY29wZSwKICAgICAgICBTY29wZUJ1aWxkZXIsCiAgICAgICAgVHlwZUJ1aWxkZXIsCiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnQsCiAgICAgICAgbWVzc2FnZUltcGxlbWVudHNGdXR1cmVPciwKICAgICAgICBtZXNzYWdlUGF0Y2hDbGFzc09yaWdpbiwKICAgICAgICBtZXNzYWdlUGF0Y2hDbGFzc1R5cGVWYXJpYWJsZXNNaXNtYXRjaCwKICAgICAgICBtZXNzYWdlUGF0Y2hEZWNsYXJhdGlvbk1pc21hdGNoLAogICAgICAgIG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uT3JpZ2luLAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uVXNlLAogICAgICAgIHRlbXBsYXRlR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnQsCiAgICAgICAgdGVtcGxhdGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9ycywKICAgICAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2UsCiAgICAgICAgdGVtcGxhdGVJbXBsZW1lbnRzUmVwZWF0ZWQsCiAgICAgICAgdGVtcGxhdGVJbXBsZW1lbnRzU3VwZXJDbGFzcywKICAgICAgICB0ZW1wbGF0ZUltcGxpY2l0TWl4aW5PdmVycmlkZUNvbnRleHQsCiAgICAgICAgdGVtcGxhdGVJbmNvbXBhdGlibGVSZWRpcmVjdGVlRnVuY3Rpb25UeXBlLAogICAgICAgIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50LAogICAgICAgIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGUsCiAgICAgICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluZmVycmVkLAogICAgICAgIHRlbXBsYXRlSW50ZXJmYWNlQ2hlY2tDb250ZXh0LAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbiwKICAgICAgICB0ZW1wbGF0ZU1peGluQXBwbGljYXRpb25JbmNvbXBhdGlibGVTdXBlcnR5cGUsCiAgICAgICAgdGVtcGxhdGVOYW1lZE1peGluT3ZlcnJpZGVDb250ZXh0LAogICAgICAgIHRlbXBsYXRlT3ZlcnJpZGRlbk1ldGhvZENhdXNlLAogICAgICAgIHRlbXBsYXRlT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzLAogICAgICAgIHRlbXBsYXRlT3ZlcnJpZGVGZXdlclBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgdGVtcGxhdGVPdmVycmlkZU1pc21hdGNoTmFtZWRQYXJhbWV0ZXIsCiAgICAgICAgdGVtcGxhdGVPdmVycmlkZU1vcmVSZXF1aXJlZEFyZ3VtZW50cywKICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRlVHlwZU1pc21hdGNoUGFyYW1ldGVyLAogICAgICAgIHRlbXBsYXRlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hSZXR1cm5UeXBlLAogICAgICAgIHRlbXBsYXRlT3ZlcnJpZGVUeXBlVmFyaWFibGVzTWlzbWF0Y2gsCiAgICAgICAgdGVtcGxhdGVSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnQsCiAgICAgICAgdGVtcGxhdGVSZWRpcmVjdGlvblRhcmdldE5vdEZvdW5kLAogICAgICAgIHRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2g7CgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciwKICAgICAgICBEZWNsYXJhdGlvbiwKICAgICAgICBGdW5jdGlvbkJ1aWxkZXIsCiAgICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgS2VybmVsTWV0YWRhdGFCdWlsZGVyLAogICAgICAgIE5hbWVkVHlwZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTWVtYmVyQnVpbGRlciwKICAgICAgICBNZXRhZGF0YUJ1aWxkZXIsCiAgICAgICAgUHJvY2VkdXJlQnVpbGRlciwKICAgICAgICBSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyLAogICAgICAgIFNjb3BlLAogICAgICAgIFR5cGVCdWlsZGVyLAogICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXI7CgppbXBvcnQgJy4uL2tlcm5lbC9yZWRpcmVjdGluZ19mYWN0b3J5X2JvZHkuZGFydCcKICAgIHNob3cgZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keSwgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keTsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF90YXJnZXQuZGFydCcgc2hvdyBLZXJuZWxUYXJnZXQ7CgppbXBvcnQgJy4uL2tlcm5lbC90eXBlcy5kYXJ0JyBzaG93IFR5cGVzOwoKaW1wb3J0ICcuLi9uYW1lcy5kYXJ0JyBzaG93IG5vU3VjaE1ldGhvZE5hbWU7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnCiAgICBzaG93IGludGVybmFsUHJvYmxlbSwgdW5leHBlY3RlZCwgdW5oYW5kbGVkLCB1bmltcGxlbWVudGVkOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JyBzaG93IEFtYmlndW91c0J1aWxkZXI7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hLmRhcnQnIHNob3cgVW5rbm93blR5cGU7CgphYnN0cmFjdCBjbGFzcyBDbGFzc0J1aWxkZXIgZXh0ZW5kcyBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIHsKICAvLy8gVGhlIHR5cGUgdmFyaWFibGVzIGRlY2xhcmVkIG9uIGEgY2xhc3MsIGV4dGVuc2lvbiBvciBtaXhpbiBkZWNsYXJhdGlvbi4KICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXM7CgogIC8vLyBUaGUgdHlwZSBpbiB0aGUgYGV4dGVuZHNgIGNsYXVzZSBvZiBhIGNsYXNzIGRlY2xhcmF0aW9uLgogIC8vLwogIC8vLyBDdXJyZW50bHkgdGhpcyBhbHNvIGhvbGRzIHRoZSBzeW50aGVzaXplZCBzdXBlciBjbGFzcyBmb3IgYSBtaXhpbgogIC8vLyBkZWNsYXJhdGlvbi4KICBUeXBlQnVpbGRlciBzdXBlcnR5cGU7CgogIC8vLyBUaGUgdHlwZSBpbiB0aGUgYGltcGxlbWVudHNgIGNsYXVzZSBvZiBhIGNsYXNzIG9yIG1peGluIGRlY2xhcmF0aW9uLgogIExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZXM7CgogIC8vLyBUaGUgdHlwZXMgaW4gdGhlIGBvbmAgY2xhdXNlIG9mIGFuIGV4dGVuc2lvbiBvciBtaXhpbiBkZWNsYXJhdGlvbi4KICBMaXN0PFR5cGVCdWlsZGVyPiBvblR5cGVzOwoKICBmaW5hbCBTY29wZSBzY29wZTsKCiAgZmluYWwgU2NvcGUgY29uc3RydWN0b3JzOwoKICBmaW5hbCBTY29wZUJ1aWxkZXIgc2NvcGVCdWlsZGVyOwoKICBmaW5hbCBTY29wZUJ1aWxkZXIgY29uc3RydWN0b3JTY29wZUJ1aWxkZXI7CgogIE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yUmVkaXJlY3Rpb24+IHJlZGlyZWN0aW5nQ29uc3RydWN0b3JzOwoKICBDbGFzc0J1aWxkZXIgYWN0dWFsT3JpZ2luOwoKICBDbGFzc0J1aWxkZXIoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIHRoaXMudHlwZVZhcmlhYmxlcywKICAgICAgdGhpcy5zdXBlcnR5cGUsCiAgICAgIHRoaXMuaW50ZXJmYWNlcywKICAgICAgdGhpcy5vblR5cGVzLAogICAgICB0aGlzLnNjb3BlLAogICAgICB0aGlzLmNvbnN0cnVjdG9ycywKICAgICAgTGlicmFyeUJ1aWxkZXIgcGFyZW50LAogICAgICBpbnQgY2hhck9mZnNldCkKICAgICAgOiBzY29wZUJ1aWxkZXIgPSBuZXcgU2NvcGVCdWlsZGVyKHNjb3BlKSwKICAgICAgICBjb25zdHJ1Y3RvclNjb3BlQnVpbGRlciA9IG5ldyBTY29wZUJ1aWxkZXIoY29uc3RydWN0b3JzKSwKICAgICAgICBzdXBlcihtZXRhZGF0YSwgbW9kaWZpZXJzLCBuYW1lLCBwYXJlbnQsIGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiQ2xhc3NCdWlsZGVyIjsKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYSBtaXhpbiB0byBpdHMKICAvLy8gc3VwZXJjbGFzcy4KICBib29sIGdldCBpc01peGluQXBwbGljYXRpb24gPT4gbWl4ZWRJblR5cGUgIT0gbnVsbDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOYW1lZE1peGluQXBwbGljYXRpb24gewogICAgcmV0dXJuIGlzTWl4aW5BcHBsaWNhdGlvbiAmJiBzdXBlci5pc05hbWVkTWl4aW5BcHBsaWNhdGlvbjsKICB9CgogIFR5cGVCdWlsZGVyIGdldCBtaXhlZEluVHlwZTsKCiAgdm9pZCBzZXQgbWl4ZWRJblR5cGUoVHlwZUJ1aWxkZXIgbWl4aW4pOwoKICBMaXN0PENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlcj4gZ2V0IGNvbnN0cnVjdG9yUmVmZXJlbmNlcyA9PiBudWxsOwoKICBMaWJyYXJ5QnVpbGRlciBnZXQgbGlicmFyeSB7CiAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gcGFyZW50OwogICAgcmV0dXJuIGxpYnJhcnkucGFydE9mTGlicmFyeSA/PyBsaWJyYXJ5OwogIH0KCiAgdm9pZCBidWlsZE91dGxpbmVFeHByZXNzaW9ucyhMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICB2b2lkIGJ1aWxkKFN0cmluZyBpZ25vcmUsIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgICAgIE1lbWJlckJ1aWxkZXIgbWVtYmVyID0gZGVjbGFyYXRpb247CiAgICAgIG1lbWJlci5idWlsZE91dGxpbmVFeHByZXNzaW9ucyhsaWJyYXJ5KTsKICAgIH0KCiAgICBLZXJuZWxNZXRhZGF0YUJ1aWxkZXIuYnVpbGRBbm5vdGF0aW9ucygKICAgICAgICBpc1BhdGNoID8gb3JpZ2luLnRhcmdldCA6IGNscywgbWV0YWRhdGEsIGxpYnJhcnksIHRoaXMsIG51bGwpOwogICAgY29uc3RydWN0b3JzLmZvckVhY2goYnVpbGQpOwogICAgc2NvcGUuZm9yRWFjaChidWlsZCk7CiAgfQoKICAvLy8gUmVnaXN0ZXJzIGEgY29uc3RydWN0b3IgcmVkaXJlY3Rpb24gZm9yIHRoaXMgY2xhc3MgYW5kIHJldHVybnMgdHJ1ZSBpZgogIC8vLyB0aGlzIHJlZGlyZWN0aW9uIGdpdmVzIHJpc2UgdG8gYSBjeWNsZSB0aGF0IGhhcyBub3QgYmVlbiByZXBvcnRlZCBiZWZvcmUuCiAgYm9vbCBjaGVja0NvbnN0cnVjdG9yQ3ljbGljKFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQpIHsKICAgIENvbnN0cnVjdG9yUmVkaXJlY3Rpb24gcmVkaXJlY3QgPSBuZXcgQ29uc3RydWN0b3JSZWRpcmVjdGlvbih0YXJnZXQpOwogICAgcmVkaXJlY3RpbmdDb25zdHJ1Y3RvcnMgPz89IDxTdHJpbmcsIENvbnN0cnVjdG9yUmVkaXJlY3Rpb24+e307CiAgICByZWRpcmVjdGluZ0NvbnN0cnVjdG9yc1tzb3VyY2VdID0gcmVkaXJlY3Q7CiAgICB3aGlsZSAocmVkaXJlY3QgIT0gbnVsbCkgewogICAgICBpZiAocmVkaXJlY3QuY3ljbGVSZXBvcnRlZCkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAocmVkaXJlY3QudGFyZ2V0ID09IHNvdXJjZSkgewogICAgICAgIHJlZGlyZWN0LmN5Y2xlUmVwb3J0ZWQgPSB0cnVlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJlZGlyZWN0ID0gcmVkaXJlY3RpbmdDb25zdHJ1Y3RvcnNbcmVkaXJlY3QudGFyZ2V0XTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGludCByZXNvbHZlQ29uc3RydWN0b3JzKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIGlmIChjb25zdHJ1Y3RvclJlZmVyZW5jZXMgPT0gbnVsbCkgcmV0dXJuIDA7CiAgICBmb3IgKENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciByZWYgaW4gY29uc3RydWN0b3JSZWZlcmVuY2VzKSB7CiAgICAgIHJlZi5yZXNvbHZlSW4oc2NvcGUsIGxpYnJhcnkpOwogICAgfQogICAgaW50IGNvdW50ID0gY29uc3RydWN0b3JSZWZlcmVuY2VzLmxlbmd0aDsKICAgIGlmIChjb3VudCAhPSAwKSB7CiAgICAgIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IGNvbnN0cnVjdG9ycyA9IHRoaXMuY29uc3RydWN0b3JzLmxvY2FsOwogICAgICAvLyBDb3B5IGtleXMgdG8gYXZvaWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gZXJyb3IuCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lcyA9IGNvbnN0cnVjdG9ycy5rZXlzLnRvTGlzdCgpOwogICAgICBmb3IgKFN0cmluZyBuYW1lIGluIG5hbWVzKSB7CiAgICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBjb25zdHJ1Y3RvcnNbbmFtZV07CiAgICAgICAgZG8gewogICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLnBhcmVudCAhPSB0aGlzKSB7CiAgICAgICAgICAgIHVuZXhwZWN0ZWQoIiRmaWxlVXJpIiwgIiR7ZGVjbGFyYXRpb24ucGFyZW50LmZpbGVVcml9IiwgY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIGZpbGVVcmkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIFJlZGlyZWN0aW5nRmFjdG9yeUJ1aWxkZXIpIHsKICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgaW1tZWRpYXRlIHJlZGlyZWN0aW9uIHRhcmdldCwgbm90IHRoZSBlZmZlY3RpdmUuCiAgICAgICAgICAgIENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciByZWRpcmVjdGlvblRhcmdldCA9CiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5yZWRpcmVjdGlvblRhcmdldDsKICAgICAgICAgICAgaWYgKHJlZGlyZWN0aW9uVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgICAgICAgICBEZWNsYXJhdGlvbiB0YXJnZXRCdWlsZGVyID0gcmVkaXJlY3Rpb25UYXJnZXQudGFyZ2V0OwogICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi5uZXh0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIE9ubHkgdGhlIGZpcnN0IG9uZSAodGhhdCBpcywgdGhlIGxhc3Qgb24gaW4gdGhlIGxpbmtlZCBsaXN0KQogICAgICAgICAgICAgICAgLy8gaXMgYWN0dWFsbHkgaW4gdGhlIGtlcm5lbCB0cmVlLiBUaGlzIGNhbGwgY3JlYXRlcyBhIFN0YXRpY0dldAogICAgICAgICAgICAgICAgLy8gdG8gW2RlY2xhcmF0aW9uLnRhcmdldF0gaW4gYSBmaWVsZCBgX3JlZGlyZWN0aW5nI2Agd2hpY2ggaXMKICAgICAgICAgICAgICAgIC8vIG9ubHkgbGVnYWwgdG8gZG8gdG8gdGhpbmdzIGluIHRoZSBrZXJuZWwgdHJlZS4KICAgICAgICAgICAgICAgIGFkZFJlZGlyZWN0aW5nQ29uc3RydWN0b3IoZGVjbGFyYXRpb24sIGxpYnJhcnkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodGFyZ2V0QnVpbGRlciBpcyBGdW5jdGlvbkJ1aWxkZXIpIHsKICAgICAgICAgICAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBkZWNsYXJhdGlvbi50eXBlQXJndW1lbnRzOwogICAgICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAvLyBUT0RPKDMyMDQ5KSBJZiB0eXBlIGFyZ3VtZW50cyBhcmVuJ3Qgc3BlY2lmaWVkLCB0aGV5IHNob3VsZAogICAgICAgICAgICAgICAgICAvLyBiZSBpbmZlcnJlZC4gIEN1cnJlbnRseSwgdGhlIGluZmVyZW5jZSBpcyBub3QgcGVyZm9ybWVkLgogICAgICAgICAgICAgICAgICAvLyBUaGUgY29kZSBiZWxvdyBpcyBhIHdvcmthcm91bmQuCiAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudHMgPSBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QnVpbGRlci50YXJnZXQuZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgIGdyb3dhYmxlOiB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLnNldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QnVpbGRlci50YXJnZXQsIHR5cGVBcmd1bWVudHMpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0QnVpbGRlciBpcyBEaWxsTWVtYmVyQnVpbGRlcikgewogICAgICAgICAgICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IGRlY2xhcmF0aW9uLnR5cGVBcmd1bWVudHM7CiAgICAgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIC8vIFRPRE8oMzIwNDkpIElmIHR5cGUgYXJndW1lbnRzIGFyZW4ndCBzcGVjaWZpZWQsIHRoZXkgc2hvdWxkCiAgICAgICAgICAgICAgICAgIC8vIGJlIGluZmVycmVkLiAgQ3VycmVudGx5LCB0aGUgaW5mZXJlbmNlIGlzIG5vdCBwZXJmb3JtZWQuCiAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb2RlIGJlbG93IGlzIGEgd29ya2Fyb3VuZC4KICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cyA9IG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCdWlsZGVyLnRhcmdldC5lbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgZ3Jvd2FibGU6IHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVjbGFyYXRpb24uc2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keSgKICAgICAgICAgICAgICAgICAgICB0YXJnZXRCdWlsZGVyLm1lbWJlciwgdHlwZUFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXRCdWlsZGVyIGlzIEFtYmlndW91c0J1aWxkZXIpIHsKICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uVXNlCiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMocmVkaXJlY3Rpb25UYXJnZXQuZnVsbE5hbWVGb3JFcnJvcnMpOwogICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmlzQ29uc3QpIHsKICAgICAgICAgICAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlLCBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2UsIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIENvcmVUeXBlcyBhcmVuJ3QgY29tcHV0ZWQgeWV0LCBhbmQgdGhpcyBpcyB0aGUgb3V0bGluZQogICAgICAgICAgICAgICAgLy8gcGhhc2UuIFNvIHdlIGNhbid0IGFuZCBzaG91bGRuJ3QgY3JlYXRlIGEgbWV0aG9kIGJvZHkuCiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5ib2R5ID0gbmV3IFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkudW5yZXNvbHZlZCgKICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGlvblRhcmdldC5mdWxsTmFtZUZvckVycm9ycyk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlUmVkaXJlY3Rpb25UYXJnZXROb3RGb3VuZAogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHJlZGlyZWN0aW9uVGFyZ2V0LmZ1bGxOYW1lRm9yRXJyb3JzKTsKICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi5pc0NvbnN0KSB7CiAgICAgICAgICAgICAgICAgIGFkZFByb2JsZW0obWVzc2FnZSwgZGVjbGFyYXRpb24uY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlLCBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBDb3JlVHlwZXMgYXJlbid0IGNvbXB1dGVkIHlldCwgYW5kIHRoaXMgaXMgdGhlIG91dGxpbmUKICAgICAgICAgICAgICAgIC8vIHBoYXNlLiBTbyB3ZSBjYW4ndCBhbmQgc2hvdWxkbid0IGNyZWF0ZSBhIG1ldGhvZCBib2R5LgogICAgICAgICAgICAgICAgZGVjbGFyYXRpb24uYm9keSA9IG5ldyBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5LnVucmVzb2x2ZWQoCiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Rpb25UYXJnZXQuZnVsbE5hbWVGb3JFcnJvcnMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbi5uZXh0OwogICAgICAgIH0gd2hpbGUgKGRlY2xhcmF0aW9uICE9IG51bGwpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICAvLy8gVXNlZCB0byBsb29rdXAgYSBzdGF0aWMgbWVtYmVyIG9mIHRoaXMgY2xhc3MuCiAgRGVjbGFyYXRpb24gZmluZFN0YXRpY0J1aWxkZXIoCiAgICAgIFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmksIExpYnJhcnlCdWlsZGVyIGFjY2Vzc2luZ0xpYnJhcnksCiAgICAgIHtib29sIGlzU2V0dGVyOiBmYWxzZX0pIHsKICAgIGlmIChhY2Nlc3NpbmdMaWJyYXJ5Lm9yaWdpbiAhPSBsaWJyYXJ5Lm9yaWdpbiAmJiBuYW1lLnN0YXJ0c1dpdGgoIl8iKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gaXNTZXR0ZXIKICAgICAgICA/IHNjb3BlLmxvb2t1cFNldHRlcihuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBpc0luc3RhbmNlU2NvcGU6IGZhbHNlKQogICAgICAgIDogc2NvcGUubG9va3VwKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmksIGlzSW5zdGFuY2VTY29wZTogZmFsc2UpOwogICAgaWYgKGRlY2xhcmF0aW9uID09IG51bGwgJiYgaXNQYXRjaCkgewogICAgICByZXR1cm4gb3JpZ2luLmZpbmRTdGF0aWNCdWlsZGVyKAogICAgICAgICAgbmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSwgYWNjZXNzaW5nTGlicmFyeSwKICAgICAgICAgIGlzU2V0dGVyOiBpc1NldHRlcik7CiAgICB9CiAgICByZXR1cm4gZGVjbGFyYXRpb247CiAgfQoKICBEZWNsYXJhdGlvbiBmaW5kQ29uc3RydWN0b3JPckZhY3RvcnkoCiAgICAgIFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgYWNjZXNzaW5nTGlicmFyeSkgewogICAgaWYgKGFjY2Vzc2luZ0xpYnJhcnkub3JpZ2luICE9IGxpYnJhcnkub3JpZ2luICYmIG5hbWUuc3RhcnRzV2l0aCgiXyIpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBjb25zdHJ1Y3RvcnMubG9va3VwKG5hbWUsIGNoYXJPZmZzZXQsIHVyaSk7CiAgICBpZiAoZGVjbGFyYXRpb24gPT0gbnVsbCAmJiBpc1BhdGNoKSB7CiAgICAgIHJldHVybiBvcmlnaW4uZmluZENvbnN0cnVjdG9yT3JGYWN0b3J5KAogICAgICAgICAgbmFtZSwgY2hhck9mZnNldCwgdXJpLCBhY2Nlc3NpbmdMaWJyYXJ5KTsKICAgIH0KICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIGJ1aWxkZXIpKSB7CiAgICBzY29wZS5mb3JFYWNoKGYpOwogIH0KCiAgLy8vIERvbid0IHVzZSBmb3Igc2NvcGUgbG9va3VwLiBPbmx5IHVzZSB3aGVuIGFuIGVsZW1lbnQgaXMga25vd24gdG8gZXhpc3QKICAvLy8gKGFuZCBpc24ndCBhIHNldHRlcikuCiAgTWVtYmVyQnVpbGRlciBnZXRMb2NhbE1lbWJlcihTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIHNjb3BlLmxvY2FsW25hbWVdID8/CiAgICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbU5vdEZvdW5kSW4ud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIG5hbWUsIGZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIG51bGwpOwogIH0KCiAgdm9pZCBhZGRQcm9ibGVtKE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsCiAgICAgIHtib29sIHdhc0hhbmRsZWQ6IGZhbHNlLCBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwgZmlsZVVyaSwKICAgICAgICB3YXNIYW5kbGVkOiB3YXNIYW5kbGVkLCBjb250ZXh0OiBjb250ZXh0KTsKICB9CgogIC8vLyBGaW5kIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhpcyBjbGFzcyB3aXRoIFtuYW1lXS4gVGhpcyBtZXRob2QgaXNuJ3QKICAvLy8gc3VpdGFibGUgZm9yIHNjb3BlIGxvb2t1cHMgYXMgaXQgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgbmFtZSBpc24ndAogIC8vLyBkZWNsYXJlZC4gVGhlIFtzY29wZV0gc2hvdWxkIGJlIHVzZWQgZm9yIHRoYXQuIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8KICAvLy8gZmluZCBhIG1lbWJlciB0aGF0IGlzIGtub3duIHRvIGV4aXN0IGFuZCBpdCB3aWwgcGljayB0aGUgZmlyc3QKICAvLy8gZGVjbGFyYXRpb24gaWYgdGhlIG5hbWUgaXMgYW1iaWd1b3VzLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSwgdGhpcyBtZXRob2QgaXMgY29udmVuaWVudCBmb3IgdXNlIHdoZW4gYnVpbGRpbmcgc3ludGhldGljCiAgLy8vIG1lbWJlcnMsIHN1Y2ggYXMgdGhvc2Ugb2YgYW4gZW51bS4KICBNZW1iZXJCdWlsZGVyIGZpcnN0TWVtYmVyTmFtZWQoU3RyaW5nIG5hbWUpIHsKICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gZ2V0TG9jYWxNZW1iZXIobmFtZSk7CiAgICB3aGlsZSAoZGVjbGFyYXRpb24ubmV4dCAhPSBudWxsKSB7CiAgICAgIGRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb24ubmV4dDsKICAgIH0KICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICB9CgogIENsYXNzIGdldCBjbHM7CgogIENsYXNzIGdldCB0YXJnZXQgPT4gY2xzOwoKICBDbGFzcyBnZXQgYWN0dWFsQ2xzOwoKICBAb3ZlcnJpZGUKICBDbGFzc0J1aWxkZXIgZ2V0IG9yaWdpbiA9PiBhY3R1YWxPcmlnaW4gPz8gdGhpczsKCiAgLy8vIFthcmd1bWVudHNdIGhhdmUgYWxyZWFkeSBiZWVuIGJ1aWx0LgogIEludGVyZmFjZVR5cGUgYnVpbGRUeXBlc1dpdGhCdWlsdEFyZ3VtZW50cygKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzKSB7CiAgICBhc3NlcnQoYXJndW1lbnRzID09IG51bGwgfHwgY2xzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA9PSBhcmd1bWVudHMubGVuZ3RoKTsKICAgIHJldHVybiBhcmd1bWVudHMgPT0gbnVsbCA/IGNscy5yYXdUeXBlIDogbmV3IEludGVyZmFjZVR5cGUoY2xzLCBhcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCB0eXBlVmFyaWFibGVzQ291bnQgPT4gdHlwZVZhcmlhYmxlcz8ubGVuZ3RoID8/IDA7CgogIExpc3Q8RGFydFR5cGU+IGJ1aWxkVHlwZUFyZ3VtZW50cygKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICBpZiAoYXJndW1lbnRzID09IG51bGwgJiYgdHlwZVZhcmlhYmxlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiA8RGFydFR5cGU+W107CiAgICB9CgogICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsICYmIHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBMaXN0PERhcnRUeXBlPiByZXN1bHQgPQogICAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCh0eXBlVmFyaWFibGVzLmxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkgewogICAgICAgIHJlc3VsdFtpXSA9IHR5cGVWYXJpYWJsZXNbaV0uZGVmYXVsdFR5cGUuYnVpbGQobGlicmFyeSk7CiAgICAgIH0KICAgICAgaWYgKGxpYnJhcnkgaXMgS2VybmVsTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgICBsaWJyYXJ5LmluZmVycmVkVHlwZXMuYWRkQWxsKHJlc3VsdCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwgJiYgYXJndW1lbnRzLmxlbmd0aCAhPSAodHlwZVZhcmlhYmxlcz8ubGVuZ3RoID8/IDApKSB7CiAgICAgIC8vIFRoYXQgc2hvdWxkIGJlIGNhdWdodCBhbmQgcmVwb3J0ZWQgYXMgYSBjb21waWxlLXRpbWUgZXJyb3IgZWFybGllci4KICAgICAgcmV0dXJuIHVuaGFuZGxlZCgKICAgICAgICAgIHRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2gKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0eXBlVmFyaWFibGVzLmxlbmd0aCkKICAgICAgICAgICAgICAubWVzc2FnZSwKICAgICAgICAgICJidWlsZFR5cGVBcmd1bWVudHMiLAogICAgICAgICAgLTEsCiAgICAgICAgICBudWxsKTsKICAgIH0KCiAgICAvLyBhcmd1bWVudHMubGVuZ3RoID09IHR5cGVWYXJpYWJsZXMubGVuZ3RoCiAgICBMaXN0PERhcnRUeXBlPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoYXJndW1lbnRzLmxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gYXJndW1lbnRzW2ldLmJ1aWxkKGxpYnJhcnkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBJZiBbYXJndW1lbnRzXSBhcmUgbnVsbCwgdGhlIGRlZmF1bHQgdHlwZXMgZm9yIHRoZSB2YXJpYWJsZXMgYXJlIHVzZWQuCiAgSW50ZXJmYWNlVHlwZSBidWlsZFR5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICByZXR1cm4gYnVpbGRUeXBlc1dpdGhCdWlsdEFyZ3VtZW50cygKICAgICAgICBsaWJyYXJ5LCBidWlsZFR5cGVBcmd1bWVudHMobGlicmFyeSwgYXJndW1lbnRzKSk7CiAgfQoKICBTdXBlcnR5cGUgYnVpbGRTdXBlcnR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50cykgewogICAgQ2xhc3MgY2xzID0gaXNQYXRjaCA/IG9yaWdpbi50YXJnZXQgOiB0aGlzLmNsczsKICAgIHJldHVybiBuZXcgU3VwZXJ0eXBlKGNscywgYnVpbGRUeXBlQXJndW1lbnRzKGxpYnJhcnksIGFyZ3VtZW50cykpOwogIH0KCiAgU3VwZXJ0eXBlIGJ1aWxkTWl4ZWRJblR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50cykgewogICAgQ2xhc3MgY2xzID0gaXNQYXRjaCA/IG9yaWdpbi50YXJnZXQgOiB0aGlzLmNsczsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IFN1cGVydHlwZShjbHMsIGJ1aWxkVHlwZUFyZ3VtZW50cyhsaWJyYXJ5LCBhcmd1bWVudHMpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgU3VwZXJ0eXBlKAogICAgICAgICAgY2xzLAogICAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgICAgICBjbHMudHlwZVBhcmFtZXRlcnMubGVuZ3RoLCBjb25zdCBVbmtub3duVHlwZSgpLAogICAgICAgICAgICAgIGdyb3dhYmxlOiB0cnVlKSk7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrU3VwZXJ0eXBlcyhDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgICAvLyBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNsYXNzICh0aGF0J3MgYmVpbmcgYnVpbHQpIGl0cyBzdXBlcgogICAgLy8gY2xhc3MgYXBwZWFycyBib3RoIGluICdleHRlbmRzJyBhbmQgJ2ltcGxlbWVudHMnIGNsYXVzZXMgYW5kIHdoZXRoZXIgYW55CiAgICAvLyBpbnRlcmZhY2UgYXBwZWFycyBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgJ2ltcGxlbWVudHMnIGNsYXVzZS4KICAgIGlmIChpbnRlcmZhY2VzID09IG51bGwpIHJldHVybjsKCiAgICAvLyBFeHRyYWN0IHN1cGVyIGNsYXNzIChpZiBpdCBleGlzdHMpLgogICAgQ2xhc3NCdWlsZGVyIHN1cGVyQ2xhc3M7CiAgICBUeXBlQnVpbGRlciBzdXBlckNsYXNzVHlwZSA9IHN1cGVydHlwZTsKICAgIGlmIChzdXBlckNsYXNzVHlwZSBpcyBOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICAgIERlY2xhcmF0aW9uIGRlY2wgPSBzdXBlckNsYXNzVHlwZS5kZWNsYXJhdGlvbjsKICAgICAgaWYgKGRlY2wgaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgICAgc3VwZXJDbGFzcyA9IGRlY2w7CiAgICAgIH0KICAgIH0KCiAgICAvLyBWYWxpZGF0ZSBpbnRlcmZhY2VzLgogICAgTWFwPENsYXNzQnVpbGRlciwgaW50PiBwcm9ibGVtczsKICAgIE1hcDxDbGFzc0J1aWxkZXIsIGludD4gcHJvYmxlbXNPZmZzZXRzOwogICAgU2V0PENsYXNzQnVpbGRlcj4gaW1wbGVtZW50ZWQgPSBuZXcgU2V0PENsYXNzQnVpbGRlcj4oKTsKICAgIGZvciAoVHlwZUJ1aWxkZXIgdHlwZSBpbiBpbnRlcmZhY2VzKSB7CiAgICAgIGlmICh0eXBlIGlzIE5hbWVkVHlwZUJ1aWxkZXIpIHsKICAgICAgICBpbnQgY2hhck9mZnNldCA9IC0xOyAvLyBUT0RPKGFoZSk6IEdldCBvZmZzZXQgZnJvbSB0eXBlLgogICAgICAgIERlY2xhcmF0aW9uIGRlY2wgPSB0eXBlLmRlY2xhcmF0aW9uOwogICAgICAgIGlmIChkZWNsIGlzIENsYXNzQnVpbGRlcikgewogICAgICAgICAgQ2xhc3NCdWlsZGVyIGludGVyZmFjZSA9IGRlY2w7CiAgICAgICAgICBpZiAoc3VwZXJDbGFzcyA9PSBpbnRlcmZhY2UpIHsKICAgICAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgIHRlbXBsYXRlSW1wbGVtZW50c1N1cGVyQ2xhc3Mud2l0aEFyZ3VtZW50cyhpbnRlcmZhY2UubmFtZSksCiAgICAgICAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICAgICAgfSBlbHNlIGlmIChpbXBsZW1lbnRlZC5jb250YWlucyhpbnRlcmZhY2UpKSB7CiAgICAgICAgICAgIC8vIEFnZ3JlZ2F0ZSByZXBldGl0aW9ucy4KICAgICAgICAgICAgcHJvYmxlbXMgPz89IG5ldyBNYXA8Q2xhc3NCdWlsZGVyLCBpbnQ+KCk7CiAgICAgICAgICAgIHByb2JsZW1zW2ludGVyZmFjZV0gPz89IDA7CiAgICAgICAgICAgIHByb2JsZW1zW2ludGVyZmFjZV0gKz0gMTsKCiAgICAgICAgICAgIHByb2JsZW1zT2Zmc2V0cyA/Pz0gbmV3IE1hcDxDbGFzc0J1aWxkZXIsIGludD4oKTsKICAgICAgICAgICAgcHJvYmxlbXNPZmZzZXRzW2ludGVyZmFjZV0gPz89IGNoYXJPZmZzZXQ7CiAgICAgICAgICB9IGVsc2UgaWYgKGludGVyZmFjZS50YXJnZXQgPT0gY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpIHsKICAgICAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlSW1wbGVtZW50c0Z1dHVyZU9yLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgaW50ZXJmYWNlLnRhcmdldC5uYW1lLmxlbmd0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbXBsZW1lbnRlZC5hZGQoaW50ZXJmYWNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChwcm9ibGVtcyAhPSBudWxsKSB7CiAgICAgIHByb2JsZW1zLmZvckVhY2goKENsYXNzQnVpbGRlciBpbnRlcmZhY2UsIGludCByZXBldGl0aW9ucykgewogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlSW1wbGVtZW50c1JlcGVhdGVkLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBpbnRlcmZhY2UubmFtZSwgcmVwZXRpdGlvbnMpLAogICAgICAgICAgICBwcm9ibGVtc09mZnNldHNbaW50ZXJmYWNlXSwKICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICB9KTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tCb3VuZHNJblN1cGVydHlwZSgKICAgICAgU3VwZXJ0eXBlIHN1cGVydHlwZSwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCkgewogICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IHRoaXMubGlicmFyeTsKCiAgICBMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBpc3N1ZXMgPSBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzKAogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKHN1cGVydHlwZS5jbGFzc05vZGUsIHN1cGVydHlwZS50eXBlQXJndW1lbnRzKSwKICAgICAgICB0eXBlRW52aXJvbm1lbnQsCiAgICAgICAgYWxsb3dTdXBlckJvdW5kZWQ6IGZhbHNlKTsKICAgIGlmIChpc3N1ZXMgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVBcmd1bWVudElzc3VlIGlzc3VlIGluIGlzc3VlcykgewogICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKICAgICAgICBEYXJ0VHlwZSBhcmd1bWVudCA9IGlzc3VlLmFyZ3VtZW50OwogICAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGlzc3VlLnR5cGVQYXJhbWV0ZXI7CiAgICAgICAgYm9vbCBpbmZlcnJlZCA9IGxpYnJhcnkuaW5mZXJyZWRUeXBlcy5jb250YWlucyhhcmd1bWVudCk7CiAgICAgICAgaWYgKGFyZ3VtZW50IGlzIEZ1bmN0aW9uVHlwZSAmJiBhcmd1bWVudC50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBpZiAoaW5mZXJyZWQpIHsKICAgICAgICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnQKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGFyZ3VtZW50KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlR2VuZXJpY0Z1bmN0aW9uVHlwZVVzZWRBc0FjdHVhbFR5cGVBcmd1bWVudDsKICAgICAgICAgIH0KICAgICAgICAgIHR5cGVQYXJhbWV0ZXIgPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaW5mZXJyZWQpIHsKICAgICAgICAgICAgbWVzc2FnZSA9CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlSW5mZXJyZWQud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICBhcmd1bWVudCwKICAgICAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kLAogICAgICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIubmFtZSwKICAgICAgICAgICAgICAgICAgICBnZXRHZW5lcmljVHlwZU5hbWUoaXNzdWUuZW5jbG9zaW5nVHlwZSksCiAgICAgICAgICAgICAgICAgICAgc3VwZXJ0eXBlLmNsYXNzTm9kZS5uYW1lLAogICAgICAgICAgICAgICAgICAgIG5hbWUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIGFyZ3VtZW50LAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5ib3VuZCwKICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIubmFtZSwKICAgICAgICAgICAgICAgIGdldEdlbmVyaWNUeXBlTmFtZShpc3N1ZS5lbmNsb3NpbmdUeXBlKSwKICAgICAgICAgICAgICAgIHN1cGVydHlwZS5jbGFzc05vZGUubmFtZSwKICAgICAgICAgICAgICAgIG5hbWUpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbGlicmFyeS5yZXBvcnRUeXBlQXJndW1lbnRJc3N1ZSgKICAgICAgICAgICAgbWVzc2FnZSwgZmlsZVVyaSwgY2hhck9mZnNldCwgdHlwZVBhcmFtZXRlcik7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgY2hlY2tCb3VuZHNJbk91dGxpbmUoVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCkgewogICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IHRoaXMubGlicmFyeTsKCiAgICAvLyBDaGVjayBpbiBib3VuZHMgb2Ygb3duIHR5cGUgdmFyaWFibGVzLgogICAgZm9yIChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciBpbiBjbHMudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gaXNzdWVzID0gZmluZFR5cGVBcmd1bWVudElzc3VlcygKICAgICAgICAgIHBhcmFtZXRlci5ib3VuZCwgdHlwZUVudmlyb25tZW50LAogICAgICAgICAgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpOwogICAgICBpZiAoaXNzdWVzICE9IG51bGwpIHsKICAgICAgICBmb3IgKFR5cGVBcmd1bWVudElzc3VlIGlzc3VlIGluIGlzc3VlcykgewogICAgICAgICAgRGFydFR5cGUgYXJndW1lbnQgPSBpc3N1ZS5hcmd1bWVudDsKICAgICAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGlzc3VlLnR5cGVQYXJhbWV0ZXI7CiAgICAgICAgICBpZiAobGlicmFyeS5pbmZlcnJlZFR5cGVzLmNvbnRhaW5zKGFyZ3VtZW50KSkgewogICAgICAgICAgICAvLyBJbmZlcmVuY2UgaW4gdHlwZSBleHByZXNzaW9ucyBpbiB0aGUgc3VwZXJ0eXBlcyBib2lscyBkb3duIHRvCiAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlLXRvLWJvdW5kIHdoaWNoIHNob3VsZG4ndCBwcm9kdWNlIGFueXRoaW5nIHRoYXQgYnJlYWtzCiAgICAgICAgICAgIC8vIHRoZSBib3VuZHMgYWZ0ZXIgdGhlIG5vbi1zaW1wbGljaXR5IGNoZWNrcyBhcmUgZG9uZS4gIFNvLCBhbnkKICAgICAgICAgICAgLy8gdmlvbGF0aW9uIGhlcmUgaXMgdGhlIHJlc3VsdCBvZiBub24tc2ltcGxlIGJvdW5kcywgYW5kIHRoZSBlcnJvcgogICAgICAgICAgICAvLyBpcyByZXBvcnRlZCBlbHNld2hlcmUuCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQoKICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKICAgICAgICAgIGlmIChhcmd1bWVudCBpcyBGdW5jdGlvblR5cGUgJiYgYXJndW1lbnQudHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnQ7CiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIgPSBudWxsOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50LndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBhcmd1bWVudCwKICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIuYm91bmQsCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLm5hbWUsCiAgICAgICAgICAgICAgICBnZXRHZW5lcmljVHlwZU5hbWUoaXNzdWUuZW5jbG9zaW5nVHlwZSkpOwogICAgICAgICAgfQoKICAgICAgICAgIGxpYnJhcnkucmVwb3J0VHlwZUFyZ3VtZW50SXNzdWUoCiAgICAgICAgICAgICAgbWVzc2FnZSwgZmlsZVVyaSwgcGFyYW1ldGVyLmZpbGVPZmZzZXQsIHR5cGVQYXJhbWV0ZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIENoZWNrIGluIHN1cGVycy4KICAgIGlmIChjbHMuc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgY2hlY2tCb3VuZHNJblN1cGVydHlwZShjbHMuc3VwZXJ0eXBlLCB0eXBlRW52aXJvbm1lbnQpOwogICAgfQogICAgaWYgKGNscy5taXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgIGNoZWNrQm91bmRzSW5TdXBlcnR5cGUoY2xzLm1peGVkSW5UeXBlLCB0eXBlRW52aXJvbm1lbnQpOwogICAgfQogICAgaWYgKGNscy5pbXBsZW1lbnRlZFR5cGVzICE9IG51bGwpIHsKICAgICAgZm9yIChTdXBlcnR5cGUgc3VwZXJ0eXBlIGluIGNscy5pbXBsZW1lbnRlZFR5cGVzKSB7CiAgICAgICAgY2hlY2tCb3VuZHNJblN1cGVydHlwZShzdXBlcnR5cGUsIHR5cGVFbnZpcm9ubWVudCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBDaGVjayBpbiBtZW1iZXJzLgogICAgZm9yIChGaWVsZCBmaWVsZCBpbiBjbHMuZmllbGRzKSB7CiAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbkZpZWxkKGZpZWxkLCB0eXBlRW52aXJvbm1lbnQpOwogICAgfQogICAgZm9yIChQcm9jZWR1cmUgcHJvY2VkdXJlIGluIGNscy5wcm9jZWR1cmVzKSB7CiAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbkZ1bmN0aW9uTm9kZSgKICAgICAgICAgIHByb2NlZHVyZS5mdW5jdGlvbiwgdHlwZUVudmlyb25tZW50LCBmaWxlVXJpKTsKICAgIH0KICAgIGZvciAoQ29uc3RydWN0b3IgY29uc3RydWN0b3IgaW4gY2xzLmNvbnN0cnVjdG9ycykgewogICAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5GdW5jdGlvbk5vZGUoCiAgICAgICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbiwgdHlwZUVudmlyb25tZW50LCBmaWxlVXJpKTsKICAgIH0KICAgIGZvciAoUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgcmVkaXJlY3RpbmcKICAgICAgICBpbiBjbHMucmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzKSB7CiAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbkZ1bmN0aW9uTm9kZVBhcnRzKAogICAgICAgICAgdHlwZUVudmlyb25tZW50LCBmaWxlVXJpLCByZWRpcmVjdGluZy5maWxlT2Zmc2V0LAogICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHJlZGlyZWN0aW5nLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IHJlZGlyZWN0aW5nLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiByZWRpcmVjdGluZy5uYW1lZFBhcmFtZXRlcnMpOwogICAgfQogIH0KCiAgdm9pZCBhZGRSZWRpcmVjdGluZ0NvbnN0cnVjdG9yKAogICAgICBQcm9jZWR1cmVCdWlsZGVyIGNvbnN0cnVjdG9yLCBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAvLyBBZGQgYSBuZXcgc3ludGhldGljIGZpZWxkIHRvIHRoaXMgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBmYWN0b3J5CiAgICAvLyBjb25zdHJ1Y3RvcnMuIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IHJlc29sdmluZyBzdWNoIGNvbnN0cnVjdG9ycyBpbgogICAgLy8gc291cmNlIGNvZGUuCiAgICAvLwogICAgLy8gVGhlIHN5bnRoZXRpYyBmaWVsZCBsb29rcyBsaWtlIHRoaXM6CiAgICAvLwogICAgLy8gICAgIGZpbmFsIF9yZWRpcmVjdGluZyMgPSBbYzEsIC4uLiwgY25dOwogICAgLy8KICAgIC8vIFdoZXJlIGVhY2ggYzEgLi4uIGNuIGFyZSBhbiBpbnN0YW5jZSBvZiBbU3RhdGljR2V0XSB3aG9zZSB0YXJnZXQgaXMKICAgIC8vIFtjb25zdHJ1Y3Rvci50YXJnZXRdLgogICAgLy8KICAgIC8vIFRPRE8oYWhlKTogQWRkIGEga2VybmVsIG5vZGUgdG8gcmVwcmVzZW50IHJlZGlyZWN0aW5nIGZhY3RvcnkgYm9kaWVzLgogICAgRGlsbE1lbWJlckJ1aWxkZXIgY29uc3RydWN0b3JzRmllbGQgPQogICAgICAgIG9yaWdpbi5zY29wZS5sb2NhbC5wdXRJZkFic2VudCgiX3JlZGlyZWN0aW5nIyIsICgpIHsKICAgICAgTGlzdExpdGVyYWwgbGl0ZXJhbCA9IG5ldyBMaXN0TGl0ZXJhbCg8RXhwcmVzc2lvbj5bXSk7CiAgICAgIE5hbWUgbmFtZSA9IG5ldyBOYW1lKCJfcmVkaXJlY3RpbmcjIiwgbGlicmFyeS5saWJyYXJ5KTsKICAgICAgRmllbGQgZmllbGQgPSBuZXcgRmllbGQobmFtZSwKICAgICAgICAgIGlzU3RhdGljOiB0cnVlLCBpbml0aWFsaXplcjogbGl0ZXJhbCwgZmlsZVVyaTogY2xzLmZpbGVVcmkpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gY2xzLmZpbGVPZmZzZXQ7CiAgICAgIGNscy5hZGRNZW1iZXIoZmllbGQpOwogICAgICByZXR1cm4gbmV3IERpbGxNZW1iZXJCdWlsZGVyKGZpZWxkLCB0aGlzKTsKICAgIH0pOwogICAgRmllbGQgZmllbGQgPSBjb25zdHJ1Y3RvcnNGaWVsZC50YXJnZXQ7CiAgICBMaXN0TGl0ZXJhbCBsaXRlcmFsID0gZmllbGQuaW5pdGlhbGl6ZXI7CiAgICBsaXRlcmFsLmV4cHJlc3Npb25zCiAgICAgICAgLmFkZChuZXcgU3RhdGljR2V0KGNvbnN0cnVjdG9yLnRhcmdldCkuLnBhcmVudCA9IGxpdGVyYWwpOwogIH0KCiAgdm9pZCBoYW5kbGVTZWVuQ292YXJpYW50KAogICAgICBUeXBlcyB0eXBlcywKICAgICAgTWVtYmVyIGRlY2xhcmVkTWVtYmVyLAogICAgICBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLAogICAgICBib29sIGlzU2V0dGVyLAogICAgICBjYWxsYmFjayhNZW1iZXIgZGVjbGFyZWRNZW1iZXIsIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsIGJvb2wgaXNTZXR0ZXIpKSB7CiAgICAvLyBXaGVuIGEgcGFyYW1ldGVyIGlzIGNvdmFyaWFudCB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQgd2UgYWxzbwogICAgLy8gb3ZlcnJpZGUgdGhlIHNhbWUgbWVtYmVyIGluIGFsbCBwYXJlbnRzLgogICAgZm9yIChTdXBlcnR5cGUgc3VwZXJ0eXBlIGluIGludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzcy5zdXBlcnMpIHsKICAgICAgTWVtYmVyIG0gPSB0eXBlcy5oaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVyS2VybmVsKAogICAgICAgICAgc3VwZXJ0eXBlLmNsYXNzTm9kZSwgaW50ZXJmYWNlTWVtYmVyLm5hbWUsIGlzU2V0dGVyKTsKICAgICAgaWYgKG0gIT0gbnVsbCkgewogICAgICAgIGNhbGxiYWNrKGRlY2xhcmVkTWVtYmVyLCBtLCBpc1NldHRlcik7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgY2hlY2tPdmVycmlkZSgKICAgICAgVHlwZXMgdHlwZXMsCiAgICAgIE1lbWJlciBkZWNsYXJlZE1lbWJlciwKICAgICAgTWVtYmVyIGludGVyZmFjZU1lbWJlciwKICAgICAgYm9vbCBpc1NldHRlciwKICAgICAgY2FsbGJhY2soTWVtYmVyIGRlY2xhcmVkTWVtYmVyLCBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLCBib29sIGlzU2V0dGVyKSwKICAgICAge2Jvb2wgaXNJbnRlcmZhY2VDaGVjayA9IGZhbHNlfSkgewogICAgaWYgKGRlY2xhcmVkTWVtYmVyID09IGludGVyZmFjZU1lbWJlcikgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZGVjbGFyZWRNZW1iZXIgaXMgQ29uc3RydWN0b3IgfHwgaW50ZXJmYWNlTWVtYmVyIGlzIENvbnN0cnVjdG9yKSB7CiAgICAgIHVuaW1wbGVtZW50ZWQoCiAgICAgICAgICAiQ29uc3RydWN0b3IgaW4gb3ZlcnJpZGUgY2hlY2suIiwgZGVjbGFyZWRNZW1iZXIuZmlsZU9mZnNldCwgZmlsZVVyaSk7CiAgICB9CiAgICBpZiAoZGVjbGFyZWRNZW1iZXIgaXMgUHJvY2VkdXJlICYmIGludGVyZmFjZU1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgaWYgKGRlY2xhcmVkTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5NZXRob2QgJiYKICAgICAgICAgIGludGVyZmFjZU1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuTWV0aG9kKSB7CiAgICAgICAgYm9vbCBzZWVuQ292YXJpYW50ID0gY2hlY2tNZXRob2RPdmVycmlkZSgKICAgICAgICAgICAgdHlwZXMsIGRlY2xhcmVkTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIsIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgICAgIGlmIChzZWVuQ292YXJpYW50KSB7CiAgICAgICAgICBoYW5kbGVTZWVuQ292YXJpYW50KAogICAgICAgICAgICAgIHR5cGVzLCBkZWNsYXJlZE1lbWJlciwgaW50ZXJmYWNlTWVtYmVyLCBpc1NldHRlciwgY2FsbGJhY2spOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGVjbGFyZWRNZW1iZXIua2luZCA9PSBQcm9jZWR1cmVLaW5kLkdldHRlciAmJgogICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5HZXR0ZXIpIHsKICAgICAgICBjaGVja0dldHRlck92ZXJyaWRlKAogICAgICAgICAgICB0eXBlcywgZGVjbGFyZWRNZW1iZXIsIGludGVyZmFjZU1lbWJlciwgaXNJbnRlcmZhY2VDaGVjayk7CiAgICAgIH0KICAgICAgaWYgKGRlY2xhcmVkTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXIgJiYKICAgICAgICAgIGludGVyZmFjZU1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuU2V0dGVyKSB7CiAgICAgICAgYm9vbCBzZWVuQ292YXJpYW50ID0gY2hlY2tTZXR0ZXJPdmVycmlkZSgKICAgICAgICAgICAgdHlwZXMsIGRlY2xhcmVkTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIsIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgICAgIGlmIChzZWVuQ292YXJpYW50KSB7CiAgICAgICAgICBoYW5kbGVTZWVuQ292YXJpYW50KAogICAgICAgICAgICAgIHR5cGVzLCBkZWNsYXJlZE1lbWJlciwgaW50ZXJmYWNlTWVtYmVyLCBpc1NldHRlciwgY2FsbGJhY2spOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYm9vbCBkZWNsYXJlZE1lbWJlckhhc0dldHRlciA9IGRlY2xhcmVkTWVtYmVyIGlzIEZpZWxkIHx8CiAgICAgICAgICBkZWNsYXJlZE1lbWJlciBpcyBQcm9jZWR1cmUgJiYgZGVjbGFyZWRNZW1iZXIuaXNHZXR0ZXI7CiAgICAgIGJvb2wgaW50ZXJmYWNlTWVtYmVySGFzR2V0dGVyID0gaW50ZXJmYWNlTWVtYmVyIGlzIEZpZWxkIHx8CiAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlICYmIGludGVyZmFjZU1lbWJlci5pc0dldHRlcjsKICAgICAgYm9vbCBkZWNsYXJlZE1lbWJlckhhc1NldHRlciA9IChkZWNsYXJlZE1lbWJlciBpcyBGaWVsZCAmJgogICAgICAgICAgICAgICFkZWNsYXJlZE1lbWJlci5pc0ZpbmFsICYmCiAgICAgICAgICAgICAgIWRlY2xhcmVkTWVtYmVyLmlzQ29uc3QpIHx8CiAgICAgICAgICBkZWNsYXJlZE1lbWJlciBpcyBQcm9jZWR1cmUgJiYgZGVjbGFyZWRNZW1iZXIuaXNTZXR0ZXI7CiAgICAgIGJvb2wgaW50ZXJmYWNlTWVtYmVySGFzU2V0dGVyID0gKGludGVyZmFjZU1lbWJlciBpcyBGaWVsZCAmJgogICAgICAgICAgICAgICFpbnRlcmZhY2VNZW1iZXIuaXNGaW5hbCAmJgogICAgICAgICAgICAgICFpbnRlcmZhY2VNZW1iZXIuaXNDb25zdCkgfHwKICAgICAgICAgIGludGVyZmFjZU1lbWJlciBpcyBQcm9jZWR1cmUgJiYgaW50ZXJmYWNlTWVtYmVyLmlzU2V0dGVyOwogICAgICBpZiAoZGVjbGFyZWRNZW1iZXJIYXNHZXR0ZXIgJiYgaW50ZXJmYWNlTWVtYmVySGFzR2V0dGVyKSB7CiAgICAgICAgY2hlY2tHZXR0ZXJPdmVycmlkZSgKICAgICAgICAgICAgdHlwZXMsIGRlY2xhcmVkTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIsIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgICB9CiAgICAgIGlmIChkZWNsYXJlZE1lbWJlckhhc1NldHRlciAmJiBpbnRlcmZhY2VNZW1iZXJIYXNTZXR0ZXIpIHsKICAgICAgICBib29sIHNlZW5Db3ZhcmlhbnQgPSBjaGVja1NldHRlck92ZXJyaWRlKAogICAgICAgICAgICB0eXBlcywgZGVjbGFyZWRNZW1iZXIsIGludGVyZmFjZU1lbWJlciwgaXNJbnRlcmZhY2VDaGVjayk7CiAgICAgICAgaWYgKHNlZW5Db3ZhcmlhbnQpIHsKICAgICAgICAgIGhhbmRsZVNlZW5Db3ZhcmlhbnQoCiAgICAgICAgICAgICAgdHlwZXMsIGRlY2xhcmVkTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIsIGlzU2V0dGVyLCBjYWxsYmFjayk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyBUT0RPKGFoZSk6IEhhbmRsZSBvdGhlciBjYXNlczogYWNjZXNzb3JzLCBvcGVyYXRvcnMsIGFuZCBmaWVsZHMuCiAgfQoKICB2b2lkIGNoZWNrT3ZlcnJpZGVzKAogICAgICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpIHt9CgogIHZvaWQgY2hlY2tBYnN0cmFjdE1lbWJlcnMoQ29yZVR5cGVzIGNvcmVUeXBlcywgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgICBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50KSB7fQoKICBib29sIGhhc1VzZXJEZWZpbmVkTm9TdWNoTWV0aG9kKAogICAgICBDbGFzcyBrbGFzcywgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LCBDbGFzcyBvYmplY3RDbGFzcykgewogICAgTWVtYmVyIG5vU3VjaE1ldGhvZCA9IGhpZXJhcmNoeS5nZXREaXNwYXRjaFRhcmdldChrbGFzcywgbm9TdWNoTWV0aG9kTmFtZSk7CiAgICByZXR1cm4gbm9TdWNoTWV0aG9kICE9IG51bGwgJiYgbm9TdWNoTWV0aG9kLmVuY2xvc2luZ0NsYXNzICE9IG9iamVjdENsYXNzOwogIH0KCiAgdm9pZCB0cmFuc2Zvcm1Qcm9jZWR1cmVUb05vU3VjaE1ldGhvZEZvcndhcmRlcigKICAgICAgTWVtYmVyIG5vU3VjaE1ldGhvZEludGVyZmFjZSwgS2VybmVsVGFyZ2V0IHRhcmdldCwgUHJvY2VkdXJlIHByb2NlZHVyZSkgewogICAgU3RyaW5nIHByZWZpeCA9CiAgICAgICAgcHJvY2VkdXJlLmlzR2V0dGVyID8gJ2dldDonIDogcHJvY2VkdXJlLmlzU2V0dGVyID8gJ3NldDonIDogJyc7CiAgICBFeHByZXNzaW9uIGludm9jYXRpb24gPSB0YXJnZXQuYmFja2VuZFRhcmdldC5pbnN0YW50aWF0ZUludm9jYXRpb24oCiAgICAgICAgdGFyZ2V0LmxvYWRlci5jb3JlVHlwZXMsCiAgICAgICAgbmV3IFRoaXNFeHByZXNzaW9uKCksCiAgICAgICAgcHJlZml4ICsgcHJvY2VkdXJlLm5hbWUubmFtZSwKICAgICAgICBuZXcgQXJndW1lbnRzLmZvcndhcmRlZChwcm9jZWR1cmUuZnVuY3Rpb24pLAogICAgICAgIHByb2NlZHVyZS5maWxlT2Zmc2V0LAogICAgICAgIC8qaXNTdXBlcj0qLyBmYWxzZSk7CiAgICBFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBNZXRob2RJbnZvY2F0aW9uKG5ldyBUaGlzRXhwcmVzc2lvbigpLAogICAgICAgIG5vU3VjaE1ldGhvZE5hbWUsIG5ldyBBcmd1bWVudHMoW2ludm9jYXRpb25dKSwgbm9TdWNoTWV0aG9kSW50ZXJmYWNlKQogICAgICAuLmZpbGVPZmZzZXQgPSBwcm9jZWR1cmUuZmlsZU9mZnNldDsKICAgIGlmIChwcm9jZWR1cmUuZnVuY3Rpb24ucmV0dXJuVHlwZSBpcyEgVm9pZFR5cGUpIHsKICAgICAgcmVzdWx0ID0gbmV3IEFzRXhwcmVzc2lvbihyZXN1bHQsIHByb2NlZHVyZS5mdW5jdGlvbi5yZXR1cm5UeXBlKQogICAgICAgIC4uaXNUeXBlRXJyb3IgPSB0cnVlCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gcHJvY2VkdXJlLmZpbGVPZmZzZXQ7CiAgICB9CiAgICBwcm9jZWR1cmUuZnVuY3Rpb24uYm9keSA9IG5ldyBSZXR1cm5TdGF0ZW1lbnQocmVzdWx0KQogICAgICAuLmZpbGVPZmZzZXQgPSBwcm9jZWR1cmUuZmlsZU9mZnNldDsKICAgIHByb2NlZHVyZS5mdW5jdGlvbi5ib2R5LnBhcmVudCA9IHByb2NlZHVyZS5mdW5jdGlvbjsKCiAgICBwcm9jZWR1cmUuaXNBYnN0cmFjdCA9IGZhbHNlOwogICAgcHJvY2VkdXJlLmlzTm9TdWNoTWV0aG9kRm9yd2FyZGVyID0gdHJ1ZTsKICAgIHByb2NlZHVyZS5pc0ZvcndhcmRpbmdTdHViID0gZmFsc2U7CiAgICBwcm9jZWR1cmUuaXNGb3J3YXJkaW5nU2VtaVN0dWIgPSBmYWxzZTsKICB9CgogIHZvaWQgYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVyRm9yUHJvY2VkdXJlKE1lbWJlciBub1N1Y2hNZXRob2QsCiAgICAgIEtlcm5lbFRhcmdldCB0YXJnZXQsIFByb2NlZHVyZSBwcm9jZWR1cmUsIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSkgewogICAgQ2xvbmVXaXRob3V0Qm9keSBjbG9uZXIgPSBuZXcgQ2xvbmVXaXRob3V0Qm9keSgKICAgICAgICB0eXBlU3Vic3RpdHV0aW9uOiB0eXBlX2FsZ2VicmEuZ2V0U3Vic3RpdHV0aW9uTWFwKAogICAgICAgICAgICBoaWVyYXJjaHkuZ2V0Q2xhc3NBc0luc3RhbmNlT2YoY2xzLCBwcm9jZWR1cmUuZW5jbG9zaW5nQ2xhc3MpKSwKICAgICAgICBjbG9uZUFubm90YXRpb25zOiBmYWxzZSk7CiAgICBQcm9jZWR1cmUgY2xvbmVkID0gY2xvbmVyLmNsb25lKHByb2NlZHVyZSkuLmlzRXh0ZXJuYWwgPSBmYWxzZTsKICAgIHRyYW5zZm9ybVByb2NlZHVyZVRvTm9TdWNoTWV0aG9kRm9yd2FyZGVyKG5vU3VjaE1ldGhvZCwgdGFyZ2V0LCBjbG9uZWQpOwogICAgY2xzLnByb2NlZHVyZXMuYWRkKGNsb25lZCk7CiAgICBjbG9uZWQucGFyZW50ID0gY2xzOwoKICAgIEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSB0aGlzLmxpYnJhcnk7CiAgICBsaWJyYXJ5LmZvcndhcmRlcnNPcmlnaW5zLmFkZChjbG9uZWQpOwogICAgbGlicmFyeS5mb3J3YXJkZXJzT3JpZ2lucy5hZGQocHJvY2VkdXJlKTsKICB9CgogIHZvaWQgYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVyR2V0dGVyRm9yRmllbGQoTWVtYmVyIG5vU3VjaE1ldGhvZCwKICAgICAgS2VybmVsVGFyZ2V0IHRhcmdldCwgRmllbGQgZmllbGQsIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSkgewogICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tU3VwZXJ0eXBlKAogICAgICAgIGhpZXJhcmNoeS5nZXRDbGFzc0FzSW5zdGFuY2VPZihjbHMsIGZpZWxkLmVuY2xvc2luZ0NsYXNzKSk7CiAgICBQcm9jZWR1cmUgZ2V0dGVyID0gbmV3IFByb2NlZHVyZSgKICAgICAgICBmaWVsZC5uYW1lLAogICAgICAgIFByb2NlZHVyZUtpbmQuR2V0dGVyLAogICAgICAgIG5ldyBGdW5jdGlvbk5vZGUobnVsbCwKICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IDxUeXBlUGFyYW1ldGVyPltdLAogICAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogPFZhcmlhYmxlRGVjbGFyYXRpb24+W10sCiAgICAgICAgICAgIG5hbWVkUGFyYW1ldGVyczogPFZhcmlhYmxlRGVjbGFyYXRpb24+W10sCiAgICAgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IDAsCiAgICAgICAgICAgIHJldHVyblR5cGU6IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShmaWVsZC50eXBlKSksCiAgICAgICAgZmlsZVVyaTogZmllbGQuZmlsZVVyaSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmllbGQuZmlsZU9mZnNldDsKICAgIHRyYW5zZm9ybVByb2NlZHVyZVRvTm9TdWNoTWV0aG9kRm9yd2FyZGVyKG5vU3VjaE1ldGhvZCwgdGFyZ2V0LCBnZXR0ZXIpOwogICAgY2xzLnByb2NlZHVyZXMuYWRkKGdldHRlcik7CiAgICBnZXR0ZXIucGFyZW50ID0gY2xzOwogIH0KCiAgdm9pZCBhZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJTZXR0ZXJGb3JGaWVsZChNZW1iZXIgbm9TdWNoTWV0aG9kLAogICAgICBLZXJuZWxUYXJnZXQgdGFyZ2V0LCBGaWVsZCBmaWVsZCwgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5KSB7CiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21TdXBlcnR5cGUoCiAgICAgICAgaGllcmFyY2h5LmdldENsYXNzQXNJbnN0YW5jZU9mKGNscywgZmllbGQuZW5jbG9zaW5nQ2xhc3MpKTsKICAgIFByb2NlZHVyZSBzZXR0ZXIgPSBuZXcgUHJvY2VkdXJlKAogICAgICAgIGZpZWxkLm5hbWUsCiAgICAgICAgUHJvY2VkdXJlS2luZC5TZXR0ZXIsCiAgICAgICAgbmV3IEZ1bmN0aW9uTm9kZShudWxsLAogICAgICAgICAgICB0eXBlUGFyYW1ldGVyczogPFR5cGVQYXJhbWV0ZXI+W10sCiAgICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzOiA8VmFyaWFibGVEZWNsYXJhdGlvbj5bCiAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24oInZhbHVlIiwKICAgICAgICAgICAgICAgICAgdHlwZTogc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGZpZWxkLnR5cGUpKQogICAgICAgICAgICBdLAogICAgICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdLAogICAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiAxLAogICAgICAgICAgICByZXR1cm5UeXBlOiBjb25zdCBWb2lkVHlwZSgpKSwKICAgICAgICBmaWxlVXJpOiBmaWVsZC5maWxlVXJpKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWVsZC5maWxlT2Zmc2V0OwogICAgdHJhbnNmb3JtUHJvY2VkdXJlVG9Ob1N1Y2hNZXRob2RGb3J3YXJkZXIobm9TdWNoTWV0aG9kLCB0YXJnZXQsIHNldHRlcik7CiAgICBjbHMucHJvY2VkdXJlcy5hZGQoc2V0dGVyKTsKICAgIHNldHRlci5wYXJlbnQgPSBjbHM7CiAgfQoKICAvLy8gQWRkcyBub1N1Y2hNZXRob2QgZm9yd2FyZGluZyBzdHVicyB0byB0aGlzIGNsYXNzLiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUKICAvLy8gY2xhc3Mgd2FzIG1vZGlmaWVkLgogIGJvb2wgYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVycygKICAgICAgS2VybmVsVGFyZ2V0IHRhcmdldCwgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5KSB7CiAgICBpZiAoY2xzLmlzQWJzdHJhY3QpIHJldHVybiBmYWxzZTsKCiAgICBTZXQ8TmFtZT4gZXhpc3RpbmdGb3J3YXJkZXJzTmFtZXMgPSBuZXcgU2V0PE5hbWU+KCk7CiAgICBTZXQ8TmFtZT4gZXhpc3RpbmdTZXR0ZXJGb3J3YXJkZXJzTmFtZXMgPSBuZXcgU2V0PE5hbWU+KCk7CiAgICBDbGFzcyBsZWFzdENvbmNyZXRlU3VwZXJjbGFzcyA9IGNscy5zdXBlcmNsYXNzOwogICAgd2hpbGUgKAogICAgICAgIGxlYXN0Q29uY3JldGVTdXBlcmNsYXNzICE9IG51bGwgJiYgbGVhc3RDb25jcmV0ZVN1cGVyY2xhc3MuaXNBYnN0cmFjdCkgewogICAgICBsZWFzdENvbmNyZXRlU3VwZXJjbGFzcyA9IGxlYXN0Q29uY3JldGVTdXBlcmNsYXNzLnN1cGVyY2xhc3M7CiAgICB9CiAgICBpZiAobGVhc3RDb25jcmV0ZVN1cGVyY2xhc3MgIT0gbnVsbCkgewogICAgICBib29sIHN1cGVySGFzVXNlckRlZmluZWROb1N1Y2hNZXRob2QgPSBoYXNVc2VyRGVmaW5lZE5vU3VjaE1ldGhvZCgKICAgICAgICAgIGxlYXN0Q29uY3JldGVTdXBlcmNsYXNzLCBoaWVyYXJjaHksIHRhcmdldC5vYmplY3RDbGFzcyk7CiAgICAgIExpc3Q8TWVtYmVyPiBjb25jcmV0ZSA9CiAgICAgICAgICBoaWVyYXJjaHkuZ2V0RGlzcGF0Y2hUYXJnZXRzKGxlYXN0Q29uY3JldGVTdXBlcmNsYXNzKTsKICAgICAgZm9yIChNZW1iZXIgbWVtYmVyCiAgICAgICAgICBpbiBoaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVycyhsZWFzdENvbmNyZXRlU3VwZXJjbGFzcykpIHsKICAgICAgICBpZiAoKHN1cGVySGFzVXNlckRlZmluZWROb1N1Y2hNZXRob2QgfHwKICAgICAgICAgICAgICAgIGxlYXN0Q29uY3JldGVTdXBlcmNsYXNzLmVuY2xvc2luZ0xpYnJhcnkuY29tcGFyZVRvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyLmVuY2xvc2luZ0NsYXNzLmVuY2xvc2luZ0xpYnJhcnkpICE9CiAgICAgICAgICAgICAgICAgICAgICAgIDAgJiYKICAgICAgICAgICAgICAgICAgICBtZW1iZXIubmFtZS5pc1ByaXZhdGUpICYmCiAgICAgICAgICAgIENsYXNzSGllcmFyY2h5LmZpbmRNZW1iZXJCeU5hbWUoY29uY3JldGUsIG1lbWJlci5uYW1lKSA9PSBudWxsKSB7CiAgICAgICAgICBleGlzdGluZ0ZvcndhcmRlcnNOYW1lcy5hZGQobWVtYmVyLm5hbWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgTGlzdDxNZW1iZXI+IGNvbmNyZXRlU2V0dGVycyA9CiAgICAgICAgICBoaWVyYXJjaHkuZ2V0RGlzcGF0Y2hUYXJnZXRzKGxlYXN0Q29uY3JldGVTdXBlcmNsYXNzLCBzZXR0ZXJzOiB0cnVlKTsKICAgICAgZm9yIChNZW1iZXIgbWVtYmVyIGluIGhpZXJhcmNoeQogICAgICAgICAgLmdldEludGVyZmFjZU1lbWJlcnMobGVhc3RDb25jcmV0ZVN1cGVyY2xhc3MsIHNldHRlcnM6IHRydWUpKSB7CiAgICAgICAgaWYgKENsYXNzSGllcmFyY2h5LmZpbmRNZW1iZXJCeU5hbWUoY29uY3JldGVTZXR0ZXJzLCBtZW1iZXIubmFtZSkgPT0KICAgICAgICAgICAgbnVsbCkgewogICAgICAgICAgZXhpc3RpbmdTZXR0ZXJGb3J3YXJkZXJzTmFtZXMuYWRkKG1lbWJlci5uYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBNZW1iZXIgbm9TdWNoTWV0aG9kID0gQ2xhc3NIaWVyYXJjaHkuZmluZE1lbWJlckJ5TmFtZSgKICAgICAgICBoaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVycyhjbHMpLCBub1N1Y2hNZXRob2ROYW1lKTsKCiAgICBMaXN0PE1lbWJlcj4gY29uY3JldGUgPSBoaWVyYXJjaHkuZ2V0RGlzcGF0Y2hUYXJnZXRzKGNscyk7CiAgICBMaXN0PE1lbWJlcj4gZGVjbGFyZWQgPSBoaWVyYXJjaHkuZ2V0RGVjbGFyZWRNZW1iZXJzKGNscyk7CgogICAgYm9vbCBjbHNIYXNVc2VyRGVmaW5lZE5vU3VjaE1ldGhvZCA9CiAgICAgICAgaGFzVXNlckRlZmluZWROb1N1Y2hNZXRob2QoY2xzLCBoaWVyYXJjaHksIHRhcmdldC5vYmplY3RDbGFzcyk7CiAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKICAgIGZvciAoTWVtYmVyIG1lbWJlciBpbiBoaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVycyhjbHMpKSB7CiAgICAgIC8vIFdlIGdlbmVyYXRlIGEgbm9TdWNoTWV0aG9kIGZvcndhcmRlciBmb3IgW21lbWJlcl0gaW4gW2Nsc10gaWYgdGhlCiAgICAgIC8vIGZvbGxvd2luZyB0aHJlZSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQgc2ltdWx0YW5lb3VzbHk6CiAgICAgIC8vIDEpIFRoZXJlIGlzIGEgdXNlci1kZWZpbmVkIG5vU3VjaE1ldGhvZCBpbiBbY2xzXSBvciBbbWVtYmVyXSBpcyBwcml2YXRlCiAgICAgIC8vICAgIGFuZCB0aGUgZW5jbG9zaW5nIGxpYnJhcnkgb2YgW21lbWJlcl0gaXMgZGlmZmVyZW50IGZyb20gdGhhdCBvZgogICAgICAvLyAgICBbY2xzXS4KICAgICAgLy8gMikgVGhlcmUgaXMgbm8gaW1wbGVtZW50YXRpb24gb2YgW21lbWJlcl0gaW4gW2Nsc10uCiAgICAgIC8vIDMpIFRoZSBzdXBlcmNsYXNzIG9mIFtjbHNdIGhhcyBubyBmb3J3YXJkZXIgZm9yIFttZW1iZXJdLgogICAgICBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSAmJgogICAgICAgICAgKGNsc0hhc1VzZXJEZWZpbmVkTm9TdWNoTWV0aG9kIHx8CiAgICAgICAgICAgICAgY2xzLmVuY2xvc2luZ0xpYnJhcnkKICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcGFyZVRvKG1lbWJlci5lbmNsb3NpbmdDbGFzcy5lbmNsb3NpbmdMaWJyYXJ5KSAhPQogICAgICAgICAgICAgICAgICAgICAgMCAmJgogICAgICAgICAgICAgICAgICBtZW1iZXIubmFtZS5pc1ByaXZhdGUpICYmCiAgICAgICAgICBDbGFzc0hpZXJhcmNoeS5maW5kTWVtYmVyQnlOYW1lKGNvbmNyZXRlLCBtZW1iZXIubmFtZSkgPT0gbnVsbCAmJgogICAgICAgICAgIWV4aXN0aW5nRm9yd2FyZGVyc05hbWVzLmNvbnRhaW5zKG1lbWJlci5uYW1lKSkgewogICAgICAgIGlmIChDbGFzc0hpZXJhcmNoeS5maW5kTWVtYmVyQnlOYW1lKGRlY2xhcmVkLCBtZW1iZXIubmFtZSkgIT0gbnVsbCkgewogICAgICAgICAgdHJhbnNmb3JtUHJvY2VkdXJlVG9Ob1N1Y2hNZXRob2RGb3J3YXJkZXIoCiAgICAgICAgICAgICAgbm9TdWNoTWV0aG9kLCB0YXJnZXQsIG1lbWJlcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFkZE5vU3VjaE1ldGhvZEZvcndhcmRlckZvclByb2NlZHVyZSgKICAgICAgICAgICAgICBub1N1Y2hNZXRob2QsIHRhcmdldCwgbWVtYmVyLCBoaWVyYXJjaHkpOwogICAgICAgIH0KICAgICAgICBleGlzdGluZ0ZvcndhcmRlcnNOYW1lcy5hZGQobWVtYmVyLm5hbWUpOwogICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBpZiAobWVtYmVyIGlzIEZpZWxkICYmCiAgICAgICAgICBDbGFzc0hpZXJhcmNoeS5maW5kTWVtYmVyQnlOYW1lKGNvbmNyZXRlLCBtZW1iZXIubmFtZSkgPT0gbnVsbCAmJgogICAgICAgICAgIWV4aXN0aW5nRm9yd2FyZGVyc05hbWVzLmNvbnRhaW5zKG1lbWJlci5uYW1lKSkgewogICAgICAgIGFkZE5vU3VjaE1ldGhvZEZvcndhcmRlckdldHRlckZvckZpZWxkKAogICAgICAgICAgICBub1N1Y2hNZXRob2QsIHRhcmdldCwgbWVtYmVyLCBoaWVyYXJjaHkpOwogICAgICAgIGV4aXN0aW5nRm9yd2FyZGVyc05hbWVzLmFkZChtZW1iZXIubmFtZSk7CiAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgIH0KICAgIH0KCiAgICBMaXN0PE1lbWJlcj4gY29uY3JldGVTZXR0ZXJzID0KICAgICAgICBoaWVyYXJjaHkuZ2V0RGlzcGF0Y2hUYXJnZXRzKGNscywgc2V0dGVyczogdHJ1ZSk7CiAgICBMaXN0PE1lbWJlcj4gZGVjbGFyZWRTZXR0ZXJzID0KICAgICAgICBoaWVyYXJjaHkuZ2V0RGVjbGFyZWRNZW1iZXJzKGNscywgc2V0dGVyczogdHJ1ZSk7CiAgICBmb3IgKE1lbWJlciBtZW1iZXIgaW4gaGllcmFyY2h5LmdldEludGVyZmFjZU1lbWJlcnMoY2xzLCBzZXR0ZXJzOiB0cnVlKSkgewogICAgICBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSAmJgogICAgICAgICAgQ2xhc3NIaWVyYXJjaHkuZmluZE1lbWJlckJ5TmFtZShjb25jcmV0ZVNldHRlcnMsIG1lbWJlci5uYW1lKSA9PQogICAgICAgICAgICAgIG51bGwgJiYKICAgICAgICAgICFleGlzdGluZ1NldHRlckZvcndhcmRlcnNOYW1lcy5jb250YWlucyhtZW1iZXIubmFtZSkpIHsKICAgICAgICBpZiAoQ2xhc3NIaWVyYXJjaHkuZmluZE1lbWJlckJ5TmFtZShkZWNsYXJlZFNldHRlcnMsIG1lbWJlci5uYW1lKSAhPQogICAgICAgICAgICBudWxsKSB7CiAgICAgICAgICB0cmFuc2Zvcm1Qcm9jZWR1cmVUb05vU3VjaE1ldGhvZEZvcndhcmRlcigKICAgICAgICAgICAgICBub1N1Y2hNZXRob2QsIHRhcmdldCwgbWVtYmVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVyRm9yUHJvY2VkdXJlKAogICAgICAgICAgICAgIG5vU3VjaE1ldGhvZCwgdGFyZ2V0LCBtZW1iZXIsIGhpZXJhcmNoeSk7CiAgICAgICAgfQogICAgICAgIGV4aXN0aW5nU2V0dGVyRm9yd2FyZGVyc05hbWVzLmFkZChtZW1iZXIubmFtZSk7CiAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKG1lbWJlciBpcyBGaWVsZCAmJgogICAgICAgICAgQ2xhc3NIaWVyYXJjaHkuZmluZE1lbWJlckJ5TmFtZShjb25jcmV0ZVNldHRlcnMsIG1lbWJlci5uYW1lKSA9PQogICAgICAgICAgICAgIG51bGwgJiYKICAgICAgICAgICFleGlzdGluZ1NldHRlckZvcndhcmRlcnNOYW1lcy5jb250YWlucyhtZW1iZXIubmFtZSkpIHsKICAgICAgICBhZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJTZXR0ZXJGb3JGaWVsZCgKICAgICAgICAgICAgbm9TdWNoTWV0aG9kLCB0YXJnZXQsIG1lbWJlciwgaGllcmFyY2h5KTsKICAgICAgICBleGlzdGluZ1NldHRlckZvcndhcmRlcnNOYW1lcy5hZGQobWVtYmVyLm5hbWUpOwogICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGNoYW5nZWQ7CiAgfQoKICBVcmkgX2dldE1lbWJlclVyaShNZW1iZXIgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyIGlzIEZpZWxkKSByZXR1cm4gbWVtYmVyLmZpbGVVcmk7CiAgICBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSkgcmV0dXJuIG1lbWJlci5maWxlVXJpOwogICAgLy8gT3RoZXIgbWVtYmVyIHR5cGVzIHdvbid0IGJlIHNlZW4gYmVjYXVzZSBjb25zdHJ1Y3RvcnMgZG9uJ3QgcGFydGljaXBhdGUKICAgIC8vIGluIG92ZXJyaWRlIHJlbGF0aW9uc2hpcHMKICAgIHJldHVybiB1bmhhbmRsZWQoJyR7bWVtYmVyLnJ1bnRpbWVUeXBlfScsICdfZ2V0TWVtYmVyVXJpJywgLTEsIG51bGwpOwogIH0KCiAgU3Vic3RpdHV0aW9uIF9jb21wdXRlSW50ZXJmYWNlU3Vic3RpdHV0aW9uKAogICAgICBUeXBlcyB0eXBlcywKICAgICAgTWVtYmVyIGRlY2xhcmVkTWVtYmVyLAogICAgICBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLAogICAgICBGdW5jdGlvbk5vZGUgZGVjbGFyZWRGdW5jdGlvbiwKICAgICAgRnVuY3Rpb25Ob2RlIGludGVyZmFjZUZ1bmN0aW9uLAogICAgICBib29sIGlzSW50ZXJmYWNlQ2hlY2spIHsKICAgIFN1YnN0aXR1dGlvbiBpbnRlcmZhY2VTdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZW1wdHk7CiAgICBpZiAoaW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgaW50ZXJmYWNlU3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKHR5cGVzLmhpZXJhcmNoeQogICAgICAgICAgLmdldEtlcm5lbFR5cGVBc0luc3RhbmNlT2YoCiAgICAgICAgICAgICAgY2xzLnRoaXNUeXBlLCBpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3MpKTsKICAgIH0KICAgIGlmIChkZWNsYXJlZEZ1bmN0aW9uPy50eXBlUGFyYW1ldGVycz8ubGVuZ3RoICE9CiAgICAgICAgaW50ZXJmYWNlRnVuY3Rpb24/LnR5cGVQYXJhbWV0ZXJzPy5sZW5ndGgpIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICIke2RlY2xhcmVkTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgIiR7ZGVjbGFyZWRNZW1iZXIubmFtZS5uYW1lfSIsCiAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZX0iKSwKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLmZpbGVVcmksCiAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRkZW5NZXRob2RDYXVzZQogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGludGVyZmFjZU1lbWJlci5uYW1lLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihfZ2V0TWVtYmVyVXJpKGludGVyZmFjZU1lbWJlciksCiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU1lbWJlci5maWxlT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgICAgICAgICBdICsKICAgICAgICAgICAgICBpbmhlcml0ZWRDb250ZXh0KGlzSW50ZXJmYWNlQ2hlY2ssIGRlY2xhcmVkTWVtYmVyKSk7CiAgICB9IGVsc2UgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuYmFja2VuZFRhcmdldC5sZWdhY3lNb2RlICYmCiAgICAgICAgZGVjbGFyZWRGdW5jdGlvbj8udHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbk1hcCA9CiAgICAgICAgICA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVjbGFyZWRGdW5jdGlvbi50eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIHN1YnN0aXR1dGlvbk1hcFtpbnRlcmZhY2VGdW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpXV0gPQogICAgICAgICAgICBuZXcgVHlwZVBhcmFtZXRlclR5cGUoZGVjbGFyZWRGdW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpXSk7CiAgICAgIH0KICAgICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tTWFwKHN1YnN0aXR1dGlvbk1hcCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVjbGFyZWRGdW5jdGlvbi50eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIFR5cGVQYXJhbWV0ZXIgZGVjbGFyZWRQYXJhbWV0ZXIgPSBkZWNsYXJlZEZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICAgIFR5cGVQYXJhbWV0ZXIgaW50ZXJmYWNlUGFyYW1ldGVyID0gaW50ZXJmYWNlRnVuY3Rpb24udHlwZVBhcmFtZXRlcnNbaV07CiAgICAgICAgaWYgKCFpbnRlcmZhY2VQYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgICAgRGFydFR5cGUgZGVjbGFyZWRCb3VuZCA9IGRlY2xhcmVkUGFyYW1ldGVyLmJvdW5kOwogICAgICAgICAgRGFydFR5cGUgaW50ZXJmYWNlQm91bmQgPSBpbnRlcmZhY2VQYXJhbWV0ZXIuYm91bmQ7CiAgICAgICAgICBpZiAoaW50ZXJmYWNlU3Vic3RpdHV0aW9uICE9IG51bGwpIHsKICAgICAgICAgICAgZGVjbGFyZWRCb3VuZCA9IGludGVyZmFjZVN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShkZWNsYXJlZEJvdW5kKTsKICAgICAgICAgICAgaW50ZXJmYWNlQm91bmQgPQogICAgICAgICAgICAgICAgaW50ZXJmYWNlU3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGludGVyZmFjZUJvdW5kKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChkZWNsYXJlZEJvdW5kICE9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShpbnRlcmZhY2VCb3VuZCkpIHsKICAgICAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgdGVtcGxhdGVPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgICIke2RlY2xhcmVkTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgICAgICAgIiR7ZGVjbGFyZWRNZW1iZXIubmFtZS5uYW1lfSIsCiAgICAgICAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZX0iKSwKICAgICAgICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLmZpbGVVcmksCiAgICAgICAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRkZW5NZXRob2RDYXVzZQogICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGludGVyZmFjZU1lbWJlci5uYW1lLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihfZ2V0TWVtYmVyVXJpKGludGVyZmFjZU1lbWJlciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU1lbWJlci5maWxlT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgICAgICAgICAgICAgICBdICsKICAgICAgICAgICAgICAgICAgICBpbmhlcml0ZWRDb250ZXh0KGlzSW50ZXJmYWNlQ2hlY2ssIGRlY2xhcmVkTWVtYmVyKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGludGVyZmFjZVN1YnN0aXR1dGlvbiA9CiAgICAgICAgICBTdWJzdGl0dXRpb24uY29tYmluZShpbnRlcmZhY2VTdWJzdGl0dXRpb24sIHN1YnN0aXR1dGlvbik7CiAgICB9CiAgICByZXR1cm4gaW50ZXJmYWNlU3Vic3RpdHV0aW9uOwogIH0KCiAgU3Vic3RpdHV0aW9uIF9jb21wdXRlRGVjbGFyZWRTdWJzdGl0dXRpb24oCiAgICAgIFR5cGVzIHR5cGVzLCBNZW1iZXIgZGVjbGFyZWRNZW1iZXIpIHsKICAgIFN1YnN0aXR1dGlvbiBkZWNsYXJlZFN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5lbXB0eTsKICAgIGlmIChkZWNsYXJlZE1lbWJlci5lbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIGRlY2xhcmVkU3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKHR5cGVzLmhpZXJhcmNoeQogICAgICAgICAgLmdldEtlcm5lbFR5cGVBc0luc3RhbmNlT2YoCiAgICAgICAgICAgICAgY2xzLnRoaXNUeXBlLCBkZWNsYXJlZE1lbWJlci5lbmNsb3NpbmdDbGFzcykpOwogICAgfQogICAgcmV0dXJuIGRlY2xhcmVkU3Vic3RpdHV0aW9uOwogIH0KCiAgdm9pZCBfY2hlY2tUeXBlcygKICAgICAgVHlwZXMgdHlwZXMsCiAgICAgIFN1YnN0aXR1dGlvbiBpbnRlcmZhY2VTdWJzdGl0dXRpb24sCiAgICAgIFN1YnN0aXR1dGlvbiBkZWNsYXJlZFN1YnN0aXR1dGlvbiwKICAgICAgTWVtYmVyIGRlY2xhcmVkTWVtYmVyLAogICAgICBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLAogICAgICBEYXJ0VHlwZSBkZWNsYXJlZFR5cGUsCiAgICAgIERhcnRUeXBlIGludGVyZmFjZVR5cGUsCiAgICAgIGJvb2wgaXNDb3ZhcmlhbnQsCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyZWRQYXJhbWV0ZXIsCiAgICAgIGJvb2wgaXNJbnRlcmZhY2VDaGVjaywKICAgICAge2Jvb2wgYXNJZkRlY2xhcmVkUGFyYW1ldGVyID0gZmFsc2V9KSB7CiAgICBpZiAobGlicmFyeS5sb2FkZXIudGFyZ2V0LmJhY2tlbmRUYXJnZXQubGVnYWN5TW9kZSkgcmV0dXJuOwoKICAgIGlmIChpbnRlcmZhY2VTdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICBpbnRlcmZhY2VUeXBlID0gaW50ZXJmYWNlU3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGludGVyZmFjZVR5cGUpOwogICAgfQogICAgaWYgKGRlY2xhcmVkU3Vic3RpdHV0aW9uICE9IG51bGwpIHsKICAgICAgZGVjbGFyZWRUeXBlID0gZGVjbGFyZWRTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZGVjbGFyZWRUeXBlKTsKICAgIH0KCiAgICBib29sIGluUGFyYW1ldGVyID0gZGVjbGFyZWRQYXJhbWV0ZXIgIT0gbnVsbCB8fCBhc0lmRGVjbGFyZWRQYXJhbWV0ZXI7CiAgICBEYXJ0VHlwZSBzdWJ0eXBlID0gaW5QYXJhbWV0ZXIgPyBpbnRlcmZhY2VUeXBlIDogZGVjbGFyZWRUeXBlOwogICAgRGFydFR5cGUgc3VwZXJ0eXBlID0gaW5QYXJhbWV0ZXIgPyBkZWNsYXJlZFR5cGUgOiBpbnRlcmZhY2VUeXBlOwoKICAgIGlmICh0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzdWJ0eXBlLCBzdXBlcnR5cGUpKSB7CiAgICAgIC8vIE5vIHByb2JsZW0tLXRoZSBwcm9wZXIgc3VidHlwaW5nIHJlbGF0aW9uIGlzIHNhdGlzZmllZC4KICAgIH0gZWxzZSBpZiAoaXNDb3ZhcmlhbnQgJiYgdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwoc3VwZXJ0eXBlLCBzdWJ0eXBlKSkgewogICAgICAvLyBObyBwcm9ibGVtLS10aGUgb3ZlcnJpZGluZyBwYXJhbWV0ZXIgaXMgbWFya2VkICJjb3ZhcmlhbnQiIGFuZCBoYXMKICAgICAgLy8gYSB0eXBlIHdoaWNoIGlzIGEgc3VidHlwZSBvZiB0aGUgcGFyYW1ldGVyIGl0IG92ZXJyaWRlcy4KICAgIH0gZWxzZSBpZiAoc3VidHlwZSBpcyBJbnZhbGlkVHlwZSB8fCBzdXBlcnR5cGUgaXMgSW52YWxpZFR5cGUpIHsKICAgICAgLy8gRG9uJ3QgcmVwb3J0IGEgcHJvYmxlbSBhcyBzb21ldGhpbmcgZWxzZSBpcyB3cm9uZyB0aGF0IGhhcyBhbHJlYWR5CiAgICAgIC8vIGJlZW4gcmVwb3J0ZWQuCiAgICB9IGVsc2UgewogICAgICAvLyBSZXBvcnQgYW4gZXJyb3IuCiAgICAgIFN0cmluZyBkZWNsYXJlZE1lbWJlck5hbWUgPQogICAgICAgICAgJyR7ZGVjbGFyZWRNZW1iZXIuZW5jbG9zaW5nQ2xhc3MubmFtZX0uJHtkZWNsYXJlZE1lbWJlci5uYW1lLm5hbWV9JzsKICAgICAgU3RyaW5nIGludGVyZmFjZU1lbWJlck5hbWUgPQogICAgICAgICAgJyR7aW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiR7aW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZX0nOwogICAgICBNZXNzYWdlIG1lc3NhZ2U7CiAgICAgIGludCBmaWxlT2Zmc2V0OwogICAgICBpZiAoZGVjbGFyZWRQYXJhbWV0ZXIgPT0gbnVsbCkgewogICAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZU92ZXJyaWRlVHlwZU1pc21hdGNoUmV0dXJuVHlwZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICBkZWNsYXJlZE1lbWJlck5hbWUsCiAgICAgICAgICAgIGRlY2xhcmVkVHlwZSwKICAgICAgICAgICAgaW50ZXJmYWNlVHlwZSwKICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyTmFtZSk7CiAgICAgICAgZmlsZU9mZnNldCA9IGRlY2xhcmVkTWVtYmVyLmZpbGVPZmZzZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hQYXJhbWV0ZXIud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgZGVjbGFyZWRQYXJhbWV0ZXIubmFtZSwKICAgICAgICAgICAgZGVjbGFyZWRNZW1iZXJOYW1lLAogICAgICAgICAgICBkZWNsYXJlZFR5cGUsCiAgICAgICAgICAgIGludGVyZmFjZVR5cGUsCiAgICAgICAgICAgIGludGVyZmFjZU1lbWJlck5hbWUpOwogICAgICAgIGZpbGVPZmZzZXQgPSBkZWNsYXJlZFBhcmFtZXRlci5maWxlT2Zmc2V0OwogICAgICB9CiAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbShtZXNzYWdlLCBmaWxlT2Zmc2V0LCBub0xlbmd0aCwgZGVjbGFyZWRNZW1iZXIuZmlsZVVyaSwKICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICAgIHRlbXBsYXRlT3ZlcnJpZGRlbk1ldGhvZENhdXNlCiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoaW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZSkKICAgICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKF9nZXRNZW1iZXJVcmkoaW50ZXJmYWNlTWVtYmVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgIF0gKwogICAgICAgICAgICAgIGluaGVyaXRlZENvbnRleHQoaXNJbnRlcmZhY2VDaGVjaywgZGVjbGFyZWRNZW1iZXIpKTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgYSBjb3ZhcmlhbnQgcGFyYW1ldGVyIHdhcyBzZWVuIGFuZCBtb3JlIG1ldGhvZHMgdGh1cyBoYXZlCiAgLy8vIHRvIGJlIGNoZWNrZWQuCiAgYm9vbCBjaGVja01ldGhvZE92ZXJyaWRlKFR5cGVzIHR5cGVzLCBQcm9jZWR1cmUgZGVjbGFyZWRNZW1iZXIsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VNZW1iZXIsIGJvb2wgaXNJbnRlcmZhY2VDaGVjaykgewogICAgYXNzZXJ0KGRlY2xhcmVkTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5NZXRob2QpOwogICAgYXNzZXJ0KGludGVyZmFjZU1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuTWV0aG9kKTsKICAgIGJvb2wgc2VlbkNvdmFyaWFudCA9IGZhbHNlOwogICAgRnVuY3Rpb25Ob2RlIGRlY2xhcmVkRnVuY3Rpb24gPSBkZWNsYXJlZE1lbWJlci5mdW5jdGlvbjsKICAgIEZ1bmN0aW9uTm9kZSBpbnRlcmZhY2VGdW5jdGlvbiA9IGludGVyZmFjZU1lbWJlci5mdW5jdGlvbjsKCiAgICBTdWJzdGl0dXRpb24gaW50ZXJmYWNlU3Vic3RpdHV0aW9uID0gX2NvbXB1dGVJbnRlcmZhY2VTdWJzdGl0dXRpb24oCiAgICAgICAgdHlwZXMsCiAgICAgICAgZGVjbGFyZWRNZW1iZXIsCiAgICAgICAgaW50ZXJmYWNlTWVtYmVyLAogICAgICAgIGRlY2xhcmVkRnVuY3Rpb24sCiAgICAgICAgaW50ZXJmYWNlRnVuY3Rpb24sCiAgICAgICAgaXNJbnRlcmZhY2VDaGVjayk7CgogICAgU3Vic3RpdHV0aW9uIGRlY2xhcmVkU3Vic3RpdHV0aW9uID0KICAgICAgICBfY29tcHV0ZURlY2xhcmVkU3Vic3RpdHV0aW9uKHR5cGVzLCBkZWNsYXJlZE1lbWJlcik7CgogICAgX2NoZWNrVHlwZXMoCiAgICAgICAgdHlwZXMsCiAgICAgICAgaW50ZXJmYWNlU3Vic3RpdHV0aW9uLAogICAgICAgIGRlY2xhcmVkU3Vic3RpdHV0aW9uLAogICAgICAgIGRlY2xhcmVkTWVtYmVyLAogICAgICAgIGludGVyZmFjZU1lbWJlciwKICAgICAgICBkZWNsYXJlZEZ1bmN0aW9uLnJldHVyblR5cGUsCiAgICAgICAgaW50ZXJmYWNlRnVuY3Rpb24ucmV0dXJuVHlwZSwKICAgICAgICBmYWxzZSwKICAgICAgICBudWxsLAogICAgICAgIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgaWYgKGRlY2xhcmVkRnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoIDwKICAgICAgICBpbnRlcmZhY2VGdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50cy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICIke2RlY2xhcmVkTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgIiR7ZGVjbGFyZWRNZW1iZXIubmFtZS5uYW1lfSIsCiAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZX0iKSwKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLmZpbGVVcmksCiAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRkZW5NZXRob2RDYXVzZQogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGludGVyZmFjZU1lbWJlci5uYW1lLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihpbnRlcmZhY2VNZW1iZXIuZmlsZVVyaSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgIF0gKwogICAgICAgICAgICAgIGluaGVyaXRlZENvbnRleHQoaXNJbnRlcmZhY2VDaGVjaywgZGVjbGFyZWRNZW1iZXIpKTsKICAgIH0KICAgIGlmIChpbnRlcmZhY2VGdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50IDwKICAgICAgICBkZWNsYXJlZEZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVPdmVycmlkZU1vcmVSZXF1aXJlZEFyZ3VtZW50cy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICIke2RlY2xhcmVkTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgIiR7ZGVjbGFyZWRNZW1iZXIubmFtZS5uYW1lfSIsCiAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZX0iKSwKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLmZpbGVVcmksCiAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRkZW5NZXRob2RDYXVzZQogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGludGVyZmFjZU1lbWJlci5uYW1lLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihpbnRlcmZhY2VNZW1iZXIuZmlsZVVyaSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgIF0gKwogICAgICAgICAgICAgIGluaGVyaXRlZENvbnRleHQoaXNJbnRlcmZhY2VDaGVjaywgZGVjbGFyZWRNZW1iZXIpKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOwogICAgICAgIGkgPCBkZWNsYXJlZEZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCAmJgogICAgICAgICAgICBpIDwgaW50ZXJmYWNlRnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOwogICAgICAgIGkrKykgewogICAgICB2YXIgZGVjbGFyZWRQYXJhbWV0ZXIgPSBkZWNsYXJlZEZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICB2YXIgaW50ZXJmYWNlUGFyYW1ldGVyID0gaW50ZXJmYWNlRnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgIF9jaGVja1R5cGVzKAogICAgICAgICAgdHlwZXMsCiAgICAgICAgICBpbnRlcmZhY2VTdWJzdGl0dXRpb24sCiAgICAgICAgICBkZWNsYXJlZFN1YnN0aXR1dGlvbiwKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLAogICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLAogICAgICAgICAgZGVjbGFyZWRQYXJhbWV0ZXIudHlwZSwKICAgICAgICAgIGludGVyZmFjZUZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldLnR5cGUsCiAgICAgICAgICBkZWNsYXJlZFBhcmFtZXRlci5pc0NvdmFyaWFudCB8fCBpbnRlcmZhY2VQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQsCiAgICAgICAgICBkZWNsYXJlZFBhcmFtZXRlciwKICAgICAgICAgIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgICBpZiAoZGVjbGFyZWRQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQpIHNlZW5Db3ZhcmlhbnQgPSB0cnVlOwogICAgfQogICAgaWYgKGRlY2xhcmVkRnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmlzRW1wdHkgJiYKICAgICAgICBpbnRlcmZhY2VGdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICByZXR1cm4gc2VlbkNvdmFyaWFudDsKICAgIH0KICAgIGlmIChkZWNsYXJlZEZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5sZW5ndGggPAogICAgICAgIGludGVyZmFjZUZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVPdmVycmlkZUZld2VyTmFtZWRBcmd1bWVudHMud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAiJHtkZWNsYXJlZE1lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lfS4iCiAgICAgICAgICAgICAgICAgICIke2RlY2xhcmVkTWVtYmVyLm5hbWUubmFtZX0iLAogICAgICAgICAgICAgICIke2ludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lfS4iCiAgICAgICAgICAgICAgICAgICIke2ludGVyZmFjZU1lbWJlci5uYW1lLm5hbWV9IiksCiAgICAgICAgICBkZWNsYXJlZE1lbWJlci5maWxlT2Zmc2V0LAogICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICBkZWNsYXJlZE1lbWJlci5maWxlVXJpLAogICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICAgICAgdGVtcGxhdGVPdmVycmlkZGVuTWV0aG9kQ2F1c2UKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhpbnRlcmZhY2VNZW1iZXIubmFtZS5uYW1lKQogICAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oaW50ZXJmYWNlTWVtYmVyLmZpbGVVcmksCiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU1lbWJlci5maWxlT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgICAgICAgICBdICsKICAgICAgICAgICAgICBpbmhlcml0ZWRDb250ZXh0KGlzSW50ZXJmYWNlQ2hlY2ssIGRlY2xhcmVkTWVtYmVyKSk7CiAgICB9CiAgICBpbnQgY29tcGFyZU5hbWVkUGFyYW1ldGVycyhWYXJpYWJsZURlY2xhcmF0aW9uIHAwLCBWYXJpYWJsZURlY2xhcmF0aW9uIHAxKSB7CiAgICAgIHJldHVybiBwMC5uYW1lLmNvbXBhcmVUbyhwMS5uYW1lKTsKICAgIH0KCiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHNvcnRlZEZyb21EZWNsYXJlZCA9CiAgICAgICAgbmV3IExpc3QuZnJvbShkZWNsYXJlZEZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykKICAgICAgICAgIC4uc29ydChjb21wYXJlTmFtZWRQYXJhbWV0ZXJzKTsKICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gc29ydGVkRnJvbUludGVyZmFjZSA9CiAgICAgICAgbmV3IExpc3QuZnJvbShpbnRlcmZhY2VGdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpCiAgICAgICAgICAuLnNvcnQoY29tcGFyZU5hbWVkUGFyYW1ldGVycyk7CiAgICBJdGVyYXRvcjxWYXJpYWJsZURlY2xhcmF0aW9uPiBkZWNsYXJlZE5hbWVkUGFyYW1ldGVycyA9CiAgICAgICAgc29ydGVkRnJvbURlY2xhcmVkLml0ZXJhdG9yOwogICAgSXRlcmF0b3I8VmFyaWFibGVEZWNsYXJhdGlvbj4gaW50ZXJmYWNlTmFtZWRQYXJhbWV0ZXJzID0KICAgICAgICBzb3J0ZWRGcm9tSW50ZXJmYWNlLml0ZXJhdG9yOwogICAgb3V0ZXI6CiAgICB3aGlsZSAoZGVjbGFyZWROYW1lZFBhcmFtZXRlcnMubW92ZU5leHQoKSAmJgogICAgICAgIGludGVyZmFjZU5hbWVkUGFyYW1ldGVycy5tb3ZlTmV4dCgpKSB7CiAgICAgIHdoaWxlIChkZWNsYXJlZE5hbWVkUGFyYW1ldGVycy5jdXJyZW50Lm5hbWUgIT0KICAgICAgICAgIGludGVyZmFjZU5hbWVkUGFyYW1ldGVycy5jdXJyZW50Lm5hbWUpIHsKICAgICAgICBpZiAoIWRlY2xhcmVkTmFtZWRQYXJhbWV0ZXJzLm1vdmVOZXh0KCkpIHsKICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRlTWlzbWF0Y2hOYW1lZFBhcmFtZXRlci53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAiJHtkZWNsYXJlZE1lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lfS4iCiAgICAgICAgICAgICAgICAgICAgICAiJHtkZWNsYXJlZE1lbWJlci5uYW1lLm5hbWV9IiwKICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZWRQYXJhbWV0ZXJzLmN1cnJlbnQubmFtZSwKICAgICAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgICAgICIke2ludGVyZmFjZU1lbWJlci5uYW1lLm5hbWV9IiksCiAgICAgICAgICAgICAgZGVjbGFyZWRNZW1iZXIuZmlsZU9mZnNldCwKICAgICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgICBkZWNsYXJlZE1lbWJlci5maWxlVXJpLAogICAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRkZW5NZXRob2RDYXVzZQogICAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhpbnRlcmZhY2VNZW1iZXIubmFtZS5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKGludGVyZmFjZU1lbWJlci5maWxlVXJpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgICAgICBdICsKICAgICAgICAgICAgICAgICAgaW5oZXJpdGVkQ29udGV4dChpc0ludGVyZmFjZUNoZWNrLCBkZWNsYXJlZE1lbWJlcikpOwogICAgICAgICAgYnJlYWsgb3V0ZXI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBkZWNsYXJlZFBhcmFtZXRlciA9IGRlY2xhcmVkTmFtZWRQYXJhbWV0ZXJzLmN1cnJlbnQ7CiAgICAgIF9jaGVja1R5cGVzKAogICAgICAgICAgdHlwZXMsCiAgICAgICAgICBpbnRlcmZhY2VTdWJzdGl0dXRpb24sCiAgICAgICAgICBkZWNsYXJlZFN1YnN0aXR1dGlvbiwKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLAogICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLAogICAgICAgICAgZGVjbGFyZWRQYXJhbWV0ZXIudHlwZSwKICAgICAgICAgIGludGVyZmFjZU5hbWVkUGFyYW1ldGVycy5jdXJyZW50LnR5cGUsCiAgICAgICAgICBkZWNsYXJlZFBhcmFtZXRlci5pc0NvdmFyaWFudCwKICAgICAgICAgIGRlY2xhcmVkUGFyYW1ldGVyLAogICAgICAgICAgaXNJbnRlcmZhY2VDaGVjayk7CiAgICAgIGlmIChkZWNsYXJlZFBhcmFtZXRlci5pc0NvdmFyaWFudCkgc2VlbkNvdmFyaWFudCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gc2VlbkNvdmFyaWFudDsKICB9CgogIHZvaWQgY2hlY2tHZXR0ZXJPdmVycmlkZShUeXBlcyB0eXBlcywgTWVtYmVyIGRlY2xhcmVkTWVtYmVyLAogICAgICBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLCBib29sIGlzSW50ZXJmYWNlQ2hlY2spIHsKICAgIFN1YnN0aXR1dGlvbiBpbnRlcmZhY2VTdWJzdGl0dXRpb24gPSBfY29tcHV0ZUludGVyZmFjZVN1YnN0aXR1dGlvbigKICAgICAgICB0eXBlcywgZGVjbGFyZWRNZW1iZXIsIGludGVyZmFjZU1lbWJlciwgbnVsbCwgbnVsbCwgaXNJbnRlcmZhY2VDaGVjayk7CiAgICBTdWJzdGl0dXRpb24gZGVjbGFyZWRTdWJzdGl0dXRpb24gPQogICAgICAgIF9jb21wdXRlRGVjbGFyZWRTdWJzdGl0dXRpb24odHlwZXMsIGRlY2xhcmVkTWVtYmVyKTsKICAgIHZhciBkZWNsYXJlZFR5cGUgPSBkZWNsYXJlZE1lbWJlci5nZXR0ZXJUeXBlOwogICAgdmFyIGludGVyZmFjZVR5cGUgPSBpbnRlcmZhY2VNZW1iZXIuZ2V0dGVyVHlwZTsKICAgIF9jaGVja1R5cGVzKAogICAgICAgIHR5cGVzLAogICAgICAgIGludGVyZmFjZVN1YnN0aXR1dGlvbiwKICAgICAgICBkZWNsYXJlZFN1YnN0aXR1dGlvbiwKICAgICAgICBkZWNsYXJlZE1lbWJlciwKICAgICAgICBpbnRlcmZhY2VNZW1iZXIsCiAgICAgICAgZGVjbGFyZWRUeXBlLAogICAgICAgIGludGVyZmFjZVR5cGUsCiAgICAgICAgZmFsc2UsCiAgICAgICAgbnVsbCwKICAgICAgICBpc0ludGVyZmFjZUNoZWNrKTsKICB9CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgYSBjb3ZhcmlhbnQgcGFyYW1ldGVyIHdhcyBzZWVuIGFuZCBtb3JlIG1ldGhvZHMgdGh1cyBoYXZlCiAgLy8vIHRvIGJlIGNoZWNrZWQuCiAgYm9vbCBjaGVja1NldHRlck92ZXJyaWRlKFR5cGVzIHR5cGVzLCBNZW1iZXIgZGVjbGFyZWRNZW1iZXIsCiAgICAgIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsIGJvb2wgaXNJbnRlcmZhY2VDaGVjaykgewogICAgU3Vic3RpdHV0aW9uIGludGVyZmFjZVN1YnN0aXR1dGlvbiA9IF9jb21wdXRlSW50ZXJmYWNlU3Vic3RpdHV0aW9uKAogICAgICAgIHR5cGVzLCBkZWNsYXJlZE1lbWJlciwgaW50ZXJmYWNlTWVtYmVyLCBudWxsLCBudWxsLCBpc0ludGVyZmFjZUNoZWNrKTsKICAgIFN1YnN0aXR1dGlvbiBkZWNsYXJlZFN1YnN0aXR1dGlvbiA9CiAgICAgICAgX2NvbXB1dGVEZWNsYXJlZFN1YnN0aXR1dGlvbih0eXBlcywgZGVjbGFyZWRNZW1iZXIpOwogICAgdmFyIGRlY2xhcmVkVHlwZSA9IGRlY2xhcmVkTWVtYmVyLnNldHRlclR5cGU7CiAgICB2YXIgaW50ZXJmYWNlVHlwZSA9IGludGVyZmFjZU1lbWJlci5zZXR0ZXJUeXBlOwogICAgdmFyIGRlY2xhcmVkUGFyYW1ldGVyID0KICAgICAgICBkZWNsYXJlZE1lbWJlci5mdW5jdGlvbj8ucG9zaXRpb25hbFBhcmFtZXRlcnM/LmVsZW1lbnRBdCgwKTsKICAgIGJvb2wgaXNDb3ZhcmlhbnQgPSBkZWNsYXJlZFBhcmFtZXRlcj8uaXNDb3ZhcmlhbnQgPz8gZmFsc2U7CiAgICBpZiAoIWlzQ292YXJpYW50ICYmIGRlY2xhcmVkTWVtYmVyIGlzIEZpZWxkKSB7CiAgICAgIGlzQ292YXJpYW50ID0gZGVjbGFyZWRNZW1iZXIuaXNDb3ZhcmlhbnQ7CiAgICB9CiAgICBpZiAoIWlzQ292YXJpYW50ICYmIGludGVyZmFjZU1lbWJlciBpcyBGaWVsZCkgewogICAgICBpc0NvdmFyaWFudCA9IGludGVyZmFjZU1lbWJlci5pc0NvdmFyaWFudDsKICAgIH0KICAgIF9jaGVja1R5cGVzKAogICAgICAgIHR5cGVzLAogICAgICAgIGludGVyZmFjZVN1YnN0aXR1dGlvbiwKICAgICAgICBkZWNsYXJlZFN1YnN0aXR1dGlvbiwKICAgICAgICBkZWNsYXJlZE1lbWJlciwKICAgICAgICBpbnRlcmZhY2VNZW1iZXIsCiAgICAgICAgZGVjbGFyZWRUeXBlLAogICAgICAgIGludGVyZmFjZVR5cGUsCiAgICAgICAgaXNDb3ZhcmlhbnQsCiAgICAgICAgZGVjbGFyZWRQYXJhbWV0ZXIsCiAgICAgICAgaXNJbnRlcmZhY2VDaGVjaywKICAgICAgICBhc0lmRGVjbGFyZWRQYXJhbWV0ZXI6IHRydWUpOwogICAgcmV0dXJuIGlzQ292YXJpYW50OwogIH0KCiAgLy8gRXh0cmEgY29udGV4dCBvbiBvdmVycmlkZSBtZXNzYWdlcyB3aGVuIHRoZSBvdmVycmlkaW5nIG1lbWJlciBpcyBpbmhlcml0ZWQKICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBpbmhlcml0ZWRDb250ZXh0KAogICAgICBib29sIGlzSW50ZXJmYWNlQ2hlY2ssIE1lbWJlciBkZWNsYXJlZE1lbWJlcikgewogICAgaWYgKGRlY2xhcmVkTWVtYmVyLmVuY2xvc2luZ0NsYXNzID09IGNscykgewogICAgICAvLyBPcmRpbmFyeSBvdmVycmlkZQogICAgICByZXR1cm4gY29uc3QgW107CiAgICB9CiAgICBpZiAoaXNJbnRlcmZhY2VDaGVjaykgewogICAgICAvLyBJbnRlcmZhY2UgY2hlY2sKICAgICAgcmV0dXJuIFsKICAgICAgICB0ZW1wbGF0ZUludGVyZmFjZUNoZWNrQ29udGV4dAogICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhjbHMubmFtZSkKICAgICAgICAgICAgLndpdGhMb2NhdGlvbihjbHMuZmlsZVVyaSwgY2xzLmZpbGVPZmZzZXQsIGNscy5uYW1lLmxlbmd0aCkKICAgICAgXTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChjbHMuaXNBbm9ueW1vdXNNaXhpbikgewogICAgICAgIC8vIEltcGxpY2l0IG1peGluIGFwcGxpY2F0aW9uIGNsYXNzCiAgICAgICAgU3RyaW5nIGJhc2VOYW1lID0gY2xzLnN1cGVyY2xhc3MuZGVtYW5nbGVkTmFtZTsKICAgICAgICBTdHJpbmcgbWl4aW5OYW1lID0gY2xzLm1peGVkSW5DbGFzcy5uYW1lOwogICAgICAgIGludCBjbGFzc05hbWVMZW5ndGggPSBjbHMubmFtZUFzTWl4aW5BcHBsaWNhdGlvblN1YmNsYXNzLmxlbmd0aDsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgdGVtcGxhdGVJbXBsaWNpdE1peGluT3ZlcnJpZGVDb250ZXh0CiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobWl4aW5OYW1lLCBiYXNlTmFtZSkKICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKGNscy5maWxlVXJpLCBjbHMuZmlsZU9mZnNldCwgY2xhc3NOYW1lTGVuZ3RoKQogICAgICAgIF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTmFtZWQgbWl4aW4gYXBwbGljYXRpb24gY2xhc3MKICAgICAgICByZXR1cm4gWwogICAgICAgICAgdGVtcGxhdGVOYW1lZE1peGluT3ZlcnJpZGVDb250ZXh0CiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoY2xzLm5hbWUpCiAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihjbHMuZmlsZVVyaSwgY2xzLmZpbGVPZmZzZXQsIGNscy5uYW1lLmxlbmd0aCkKICAgICAgICBdOwogICAgICB9CiAgICB9CiAgfQoKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzIHsKICAgIHJldHVybiBpc01peGluQXBwbGljYXRpb24gJiYgIWlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uCiAgICAgICAgPyAiJHtzdXBlcnR5cGUuZnVsbE5hbWVGb3JFcnJvcnN9IHdpdGggJHttaXhlZEluVHlwZS5mdWxsTmFtZUZvckVycm9yc30iCiAgICAgICAgOiBuYW1lOwogIH0KCiAgdm9pZCBjaGVja01peGluRGVjbGFyYXRpb24oKSB7CiAgICBhc3NlcnQoY2xzLmlzTWl4aW5EZWNsYXJhdGlvbik7CiAgICBmb3IgKERlY2xhcmF0aW9uIGNvbnN0cnVjdG9yeSBpbiBjb25zdHJ1Y3RvcnMubG9jYWwudmFsdWVzKSB7CiAgICAgIGlmICghY29uc3RydWN0b3J5LmlzU3ludGhldGljICYmCiAgICAgICAgICAoY29uc3RydWN0b3J5LmlzRmFjdG9yeSB8fCBjb25zdHJ1Y3RvcnkuaXNDb25zdHJ1Y3RvcikpIHsKICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmdWxsTmFtZUZvckVycm9ycyksCiAgICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgdGVtcGxhdGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0NhdXNlCiAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZ1bGxOYW1lRm9yRXJyb3JzKQogICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3J5LmZpbGVVcmksIGNvbnN0cnVjdG9yeS5jaGFyT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgICAgICAgXSk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgY2hlY2tNaXhpbkFwcGxpY2F0aW9uKENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSkgewogICAgLy8gQSBtaXhpbiBkZWNsYXJhdGlvbiBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGFsbAogICAgLy8gdGhlIGRlY2xhcmF0aW9uJ3Mgc3VwZXJjbGFzcyBjb25zdHJhaW50cy4KICAgIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlID0gY2xzLnN1cGVydHlwZS5hc0ludGVyZmFjZVR5cGU7CiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21TdXBlcnR5cGUoY2xzLm1peGVkSW5UeXBlKTsKICAgIGZvciAoU3VwZXJ0eXBlIGNvbnN0cmFpbnQgaW4gY2xzLm1peGVkSW5DbGFzcy5zdXBlcmNsYXNzQ29uc3RyYWludHMoKSkgewogICAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZSA9CiAgICAgICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVN1cGVydHlwZShjb25zdHJhaW50KS5hc0ludGVyZmFjZVR5cGU7CiAgICAgIGlmIChoaWVyYXJjaHkuZ2V0VHlwZUFzSW5zdGFuY2VPZihzdXBlcnR5cGUsIGludGVyZmFjZS5jbGFzc05vZGUpICE9CiAgICAgICAgICBpbnRlcmZhY2UpIHsKICAgICAgICBsaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlTWl4aW5BcHBsaWNhdGlvbkluY29tcGF0aWJsZVN1cGVydHlwZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgc3VwZXJ0eXBlLCBpbnRlcmZhY2UsIGNscy5taXhlZEluVHlwZS5hc0ludGVyZmFjZVR5cGUpLAogICAgICAgICAgICBjbHMuZmlsZU9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgIGNscy5maWxlVXJpKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhcHBseVBhdGNoKERlY2xhcmF0aW9uIHBhdGNoKSB7CiAgICBpZiAocGF0Y2ggaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgIHBhdGNoLmFjdHVhbE9yaWdpbiA9IHRoaXM7CiAgICAgIC8vIFRPRE8oYWhlKTogQ29tcGxhaW4gaWYgYHBhdGNoLnN1cGVydHlwZWAgaXNuJ3QgbnVsbC4KICAgICAgc2NvcGUubG9jYWwuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgICAgIERlY2xhcmF0aW9uIG1lbWJlclBhdGNoID0gcGF0Y2guc2NvcGUubG9jYWxbbmFtZV07CiAgICAgICAgaWYgKG1lbWJlclBhdGNoICE9IG51bGwpIHsKICAgICAgICAgIG1lbWJlci5hcHBseVBhdGNoKG1lbWJlclBhdGNoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBzY29wZS5zZXR0ZXJzLmZvckVhY2goKFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBtZW1iZXIpIHsKICAgICAgICBEZWNsYXJhdGlvbiBtZW1iZXJQYXRjaCA9IHBhdGNoLnNjb3BlLnNldHRlcnNbbmFtZV07CiAgICAgICAgaWYgKG1lbWJlclBhdGNoICE9IG51bGwpIHsKICAgICAgICAgIG1lbWJlci5hcHBseVBhdGNoKG1lbWJlclBhdGNoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBjb25zdHJ1Y3RvcnMubG9jYWwuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlcikgewogICAgICAgIERlY2xhcmF0aW9uIG1lbWJlclBhdGNoID0gcGF0Y2guY29uc3RydWN0b3JzLmxvY2FsW25hbWVdOwogICAgICAgIGlmIChtZW1iZXJQYXRjaCAhPSBudWxsKSB7CiAgICAgICAgICBtZW1iZXIuYXBwbHlQYXRjaChtZW1iZXJQYXRjaCk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIGludCBvcmlnaW5MZW5ndGggPSB0eXBlVmFyaWFibGVzPy5sZW5ndGggPz8gMDsKICAgICAgaW50IHBhdGNoTGVuZ3RoID0gcGF0Y2gudHlwZVZhcmlhYmxlcz8ubGVuZ3RoID8/IDA7CiAgICAgIGlmIChvcmlnaW5MZW5ndGggIT0gcGF0Y2hMZW5ndGgpIHsKICAgICAgICBwYXRjaC5hZGRQcm9ibGVtKG1lc3NhZ2VQYXRjaENsYXNzVHlwZVZhcmlhYmxlc01pc21hdGNoLAogICAgICAgICAgICBwYXRjaC5jaGFyT2Zmc2V0LCBub0xlbmd0aCwgY29udGV4dDogWwogICAgICAgICAgbWVzc2FnZVBhdGNoQ2xhc3NPcmlnaW4ud2l0aExvY2F0aW9uKGZpbGVVcmksIGNoYXJPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgIF0pOwogICAgICB9IGVsc2UgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHQgaW4gcGF0Y2gudHlwZVZhcmlhYmxlcykgewogICAgICAgICAgdHlwZVZhcmlhYmxlc1tjb3VudCsrXS5hcHBseVBhdGNoKHQpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2gsIHBhdGNoLmNoYXJPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwgcGF0Y2guZmlsZVVyaSwgY29udGV4dDogWwogICAgICAgIG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uT3JpZ2luLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgZmlsZVVyaSwgY2hhck9mZnNldCwgbm9MZW5ndGgpCiAgICAgIF0pOwogICAgfQogIH0KCiAgLy8gQ29tcHV0ZXMgdGhlIGZ1bmN0aW9uIHR5cGUgb2YgYSBnaXZlbiByZWRpcmVjdGlvbiB0YXJnZXQuIFJldHVybnMgW251bGxdIGlmCiAgLy8gdGhlIHR5cGUgb2YgdGhlIHRhcmdldCBjb3VsZCBub3QgYmUgY29tcHV0ZWQuCiAgRnVuY3Rpb25UeXBlIGNvbXB1dGVSZWRpcmVjdGVlVHlwZSgKICAgICAgUmVkaXJlY3RpbmdGYWN0b3J5QnVpbGRlciBmYWN0b3J5LCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50KSB7CiAgICBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIgcmVkaXJlY3Rpb25UYXJnZXQgPSBmYWN0b3J5LnJlZGlyZWN0aW9uVGFyZ2V0OwogICAgRnVuY3Rpb25Ob2RlIHRhcmdldDsKICAgIGlmIChyZWRpcmVjdGlvblRhcmdldC50YXJnZXQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAocmVkaXJlY3Rpb25UYXJnZXQudGFyZ2V0IGlzIEZ1bmN0aW9uQnVpbGRlcikgewogICAgICBGdW5jdGlvbkJ1aWxkZXIgdGFyZ2V0QnVpbGRlciA9IHJlZGlyZWN0aW9uVGFyZ2V0LnRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGFyZ2V0QnVpbGRlci5mdW5jdGlvbjsKICAgIH0gZWxzZSBpZiAocmVkaXJlY3Rpb25UYXJnZXQudGFyZ2V0IGlzIERpbGxNZW1iZXJCdWlsZGVyICYmCiAgICAgICAgKHJlZGlyZWN0aW9uVGFyZ2V0LnRhcmdldC5pc0NvbnN0cnVjdG9yIHx8CiAgICAgICAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0LnRhcmdldC5pc0ZhY3RvcnkpKSB7CiAgICAgIERpbGxNZW1iZXJCdWlsZGVyIHRhcmdldEJ1aWxkZXIgPSByZWRpcmVjdGlvblRhcmdldC50YXJnZXQ7CiAgICAgIC8vIEl0IHNlZW1zIHRoYXQgdGhlIFtyZWRpcmVjdGlvblRhcmdldC50YXJnZXRdIGlzIGFuIGluc3RhbmNlIG9mCiAgICAgIC8vIFtEaWxsTWVtYmVyQnVpbGRlcl0gd2hlbmV2ZXIgdGhlIHJlZGlyZWN0ZWUgaXMgYW4gaW1wbGljaXQgY29uc3RydWN0b3IsCiAgICAgIC8vIGUuZy4KICAgICAgLy8KICAgICAgLy8gICBjbGFzcyBBIHsKICAgICAgLy8gICAgIGZhY3RvcnkgQSgpID0gQjsKICAgICAgLy8gICB9CiAgICAgIC8vICAgY2xhc3MgQiBpbXBsZW1lbnRzIEEge30KICAgICAgLy8KICAgICAgdGFyZ2V0ID0gdGFyZ2V0QnVpbGRlci5tZW1iZXIuZnVuY3Rpb247CiAgICB9IGVsc2UgaWYgKHJlZGlyZWN0aW9uVGFyZ2V0LnRhcmdldCBpcyBBbWJpZ3VvdXNCdWlsZGVyKSB7CiAgICAgIC8vIE11bHRpcGxlIGRlZmluaXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZTogQW4gZXJyb3IgaGFzIGFscmVhZHkgYmVlbgogICAgICAvLyBpc3N1ZWQuCiAgICAgIC8vIFRPRE8oaHR0cDovL2RhcnRidWcuY29tLzM1Mjk0KTogVW5mb3J0dW5hdGUgZXJyb3I7IHNlZSBhbHNvCiAgICAgIC8vIGh0dHBzOi8vZGFydC1yZXZpZXcuZ29vZ2xlc291cmNlLmNvbS9jL3Nkay8rLzg1MzkwLy4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICB1bmhhbmRsZWQoIiR7cmVkaXJlY3Rpb25UYXJnZXQudGFyZ2V0fSIsICJjb21wdXRlUmVkaXJlY3RlZVR5cGUiLAogICAgICAgICAgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CgogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9CiAgICAgICAgZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShmYWN0b3J5LnRhcmdldCkudHlwZUFyZ3VtZW50czsKICAgIEZ1bmN0aW9uVHlwZSB0YXJnZXRGdW5jdGlvblR5cGUgPSB0YXJnZXQuZnVuY3Rpb25UeXBlOwogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCAmJgogICAgICAgIHRhcmdldEZ1bmN0aW9uVHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGggIT0gdHlwZUFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2gKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0YXJnZXRGdW5jdGlvblR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoKSwKICAgICAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0LmNoYXJPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8vIENvbXB1dGUgdGhlIHN1YnN0aXR1dGlvbiBvZiB0aGUgdGFyZ2V0IGNsYXNzIHR5cGUgcGFyYW1ldGVycyBpZgogICAgLy8gW3JlZGlyZWN0aW9uVGFyZ2V0XSBoYXMgYW55IHR5cGUgYXJndW1lbnRzLgogICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbjsKICAgIGJvb2wgaGFzUHJvYmxlbSA9IGZhbHNlOwogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCAmJiB0eXBlQXJndW1lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgIHRhcmdldEZ1bmN0aW9uVHlwZS50eXBlUGFyYW1ldGVycywgdHlwZUFyZ3VtZW50cyk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0RnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gdGFyZ2V0RnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICAgIERhcnRUeXBlIHR5cGVQYXJhbWV0ZXJCb3VuZCA9CiAgICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZSh0eXBlUGFyYW1ldGVyLmJvdW5kKTsKICAgICAgICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2ldOwogICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIFt0eXBlQXJndW1lbnRdIHJlc3BlY3RzIHRoZSBib3VuZHMgb2YgW3R5cGVQYXJhbWV0ZXJdLgogICAgICAgIGlmICghdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKHR5cGVBcmd1bWVudCwgdHlwZVBhcmFtZXRlckJvdW5kKSkgewogICAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZVJlZGlyZWN0aW5nRmFjdG9yeUluY29tcGF0aWJsZVR5cGVBcmd1bWVudC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnQsIHR5cGVQYXJhbWV0ZXJCb3VuZCksCiAgICAgICAgICAgICAgcmVkaXJlY3Rpb25UYXJnZXQuY2hhck9mZnNldCwKICAgICAgICAgICAgICBub0xlbmd0aCk7CiAgICAgICAgICBoYXNQcm9ibGVtID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZUFyZ3VtZW50cyA9PSBudWxsICYmCiAgICAgICAgdGFyZ2V0RnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgLy8gVE9ETyhoaWxsZXJzdHJvbSk6IEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBwZXJmb3JtIHR5cGUgaW5mZXJlbmNlIG9uCiAgICAgIC8vIHRoZSByZWRpcmVjdGVlIHRvIG9idGFpbiBhY3R1YWwgdHlwZSBhcmd1bWVudHMgd2hpY2ggd291bGQgYWxsb3cgdGhlCiAgICAgIC8vIGZvbGxvd2luZyBwcm9ncmFtIHRvIHR5cGUgY2hlY2s6CiAgICAgIC8vCiAgICAgIC8vICAgIGNsYXNzIEE8VD4gewogICAgICAvLyAgICAgICBmYWN0b3J5IEEoKSA9IEI7CiAgICAgIC8vICAgIH0KICAgICAgLy8gICAgY2xhc3MgQjxUPiBpbXBsZW1lbnRzIEE8VD4gewogICAgICAvLyAgICAgICBCKCk7CiAgICAgIC8vICAgIH0KICAgICAgLy8KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLy8gU3Vic3RpdHV0ZSBpZiBuZWNlc3NhcnkuCiAgICB0YXJnZXRGdW5jdGlvblR5cGUgPSBzdWJzdGl0dXRpb24gPT0gbnVsbAogICAgICAgID8gdGFyZ2V0RnVuY3Rpb25UeXBlCiAgICAgICAgOiAoc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHRhcmdldEZ1bmN0aW9uVHlwZS53aXRob3V0VHlwZVBhcmFtZXRlcnMpCiAgICAgICAgICAgIGFzIEZ1bmN0aW9uVHlwZSk7CgogICAgcmV0dXJuIGhhc1Byb2JsZW0gPyBudWxsIDogdGFyZ2V0RnVuY3Rpb25UeXBlOwogIH0KCiAgU3RyaW5nIGNvbXB1dGVSZWRpcmVjdGVlTmFtZShDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIgcmVkaXJlY3Rpb25UYXJnZXQpIHsKICAgIFN0cmluZyB0YXJnZXROYW1lID0gcmVkaXJlY3Rpb25UYXJnZXQuZnVsbE5hbWVGb3JFcnJvcnM7CiAgICBpZiAodGFyZ2V0TmFtZSA9PSAiIikgewogICAgICByZXR1cm4gcmVkaXJlY3Rpb25UYXJnZXQudGFyZ2V0LnBhcmVudC5mdWxsTmFtZUZvckVycm9yczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0YXJnZXROYW1lOwogICAgfQogIH0KCiAgdm9pZCBjaGVja1JlZGlyZWN0aW5nRmFjdG9yeSgKICAgICAgUmVkaXJlY3RpbmdGYWN0b3J5QnVpbGRlciBmYWN0b3J5LCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50KSB7CiAgICAvLyBUaGUgZmFjdG9yeSB0eXBlIGNhbm5vdCBjb250YWluIGFueSB0eXBlIHBhcmFtZXRlcnMgb3RoZXIgdGhhbiB0aG9zZSBvZgogICAgLy8gaXRzIGVuY2xvc2luZyBjbGFzcywgYmVjYXVzZSBjb25zdHJ1Y3RvcnMgY2Fubm90IHNwZWNpZnkgdHlwZSBwYXJhbWV0ZXJzCiAgICAvLyBvZiB0aGVpciBvd24uCiAgICBGdW5jdGlvblR5cGUgZmFjdG9yeVR5cGUgPQogICAgICAgIGZhY3RvcnkucHJvY2VkdXJlLmZ1bmN0aW9uLmZ1bmN0aW9uVHlwZS53aXRob3V0VHlwZVBhcmFtZXRlcnM7CiAgICBGdW5jdGlvblR5cGUgcmVkaXJlY3RlZVR5cGUgPQogICAgICAgIGNvbXB1dGVSZWRpcmVjdGVlVHlwZShmYWN0b3J5LCB0eXBlRW52aXJvbm1lbnQpOwoKICAgIC8vIFRPRE8oaGlsbGVyc3Ryb20pOiBJdCB3b3VsZCBiZSBwcmVmZXJhYmxlIHRvIGtub3cgd2hldGhlciBhIGZhaWx1cmUKICAgIC8vIGhhcHBlbmVkIGR1cmluZyBbX2NvbXB1dGVSZWRpcmVjdGVlVHlwZV0uCiAgICBpZiAocmVkaXJlY3RlZVR5cGUgPT0gbnVsbCkgcmV0dXJuOwoKICAgIC8vIENoZWNrIHdoZXRoZXIgW3JlZGlyZWN0ZWVUeXBlXSA8OiBbZmFjdG9yeVR5cGVdLgogICAgaWYgKCF0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YocmVkaXJlY3RlZVR5cGUsIGZhY3RvcnlUeXBlKSkgewogICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVJbmNvbXBhdGlibGVSZWRpcmVjdGVlRnVuY3Rpb25UeXBlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgcmVkaXJlY3RlZVR5cGUsIGZhY3RvcnlUeXBlKSwKICAgICAgICAgIGZhY3RvcnkucmVkaXJlY3Rpb25UYXJnZXQuY2hhck9mZnNldCwKICAgICAgICAgIG5vTGVuZ3RoKTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tSZWRpcmVjdGluZ0ZhY3RvcmllcyhUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50KSB7CiAgICBNYXA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPiBjb25zdHJ1Y3RvcnMgPSB0aGlzLmNvbnN0cnVjdG9ycy5sb2NhbDsKICAgIEl0ZXJhYmxlPFN0cmluZz4gbmFtZXMgPSBjb25zdHJ1Y3RvcnMua2V5czsKICAgIGZvciAoU3RyaW5nIG5hbWUgaW4gbmFtZXMpIHsKICAgICAgRGVjbGFyYXRpb24gY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcnNbbmFtZV07CiAgICAgIGRvIHsKICAgICAgICBpZiAoY29uc3RydWN0b3IgaXMgUmVkaXJlY3RpbmdGYWN0b3J5QnVpbGRlcikgewogICAgICAgICAgY2hlY2tSZWRpcmVjdGluZ0ZhY3RvcnkoY29uc3RydWN0b3IsIHR5cGVFbnZpcm9ubWVudCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0cnVjdG9yID0gY29uc3RydWN0b3IubmV4dDsKICAgICAgfSB3aGlsZSAoY29uc3RydWN0b3IgIT0gbnVsbCk7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyBhIG1hcCB3aGljaCBtYXBzIHRoZSB0eXBlIHZhcmlhYmxlcyBvZiBbc3VwZXJjbGFzc10gdG8gdGhlaXIKICAvLy8gcmVzcGVjdGl2ZSB2YWx1ZXMgYXMgZGVmaW5lZCBieSB0aGUgc3VwZXJjbGFzcyBjbGF1c2Ugb2YgdGhpcyBjbGFzcyAoYW5kCiAgLy8vIGl0cyBzdXBlcmNsYXNzZXMpLgogIC8vLwogIC8vLyBJdCdzIGFzc3VtZWQgdGhhdCBbc3VwZXJjbGFzc10gaXMgYSBzdXBlcmNsYXNzIG9mIHRoaXMgY2xhc3MuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlLCBnaXZlbjoKICAvLy8KICAvLy8gICAgIGNsYXNzIEJveDxUPiB7fQogIC8vLyAgICAgY2xhc3MgQmVhdEJveCBleHRlbmRzIEJveDxCZWF0PiB7fQogIC8vLyAgICAgY2xhc3MgQmVhdCB7fQogIC8vLwogIC8vLyBXZSBoYXZlOgogIC8vLwogIC8vLyAgICAgW1tCZWF0Qm94XV0uZ2V0U3Vic3RpdHV0aW9uTWFwKFtbQm94XV0pIC0+IHtbW0JveDo6VF1dOiBCZWF0XV19LgogIC8vLwogIC8vLyBJdCdzIGFuIGVycm9yIGlmIFtzdXBlcmNsYXNzXSBpc24ndCBhIHN1cGVyY2xhc3MuCiAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBnZXRTdWJzdGl0dXRpb25NYXAoQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgU3VwZXJ0eXBlIHN1cGVydHlwZSA9IHRhcmdldC5zdXBlcnR5cGU7CiAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbk1hcCA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50czsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdmFyaWFibGVzOwogICAgQ2xhc3MgY2xhc3NOb2RlOwoKICAgIHdoaWxlIChjbGFzc05vZGUgIT0gc3VwZXJjbGFzcykgewogICAgICBjbGFzc05vZGUgPSBzdXBlcnR5cGUuY2xhc3NOb2RlOwogICAgICBhcmd1bWVudHMgPSBzdXBlcnR5cGUudHlwZUFyZ3VtZW50czsKICAgICAgdmFyaWFibGVzID0gY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzOwogICAgICBzdXBlcnR5cGUgPSBjbGFzc05vZGUuc3VwZXJ0eXBlOwogICAgICBpZiAodmFyaWFibGVzLmlzTm90RW1wdHkpIHsKICAgICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IGRpcmVjdFN1YnN0aXR1dGlvbk1hcCA9CiAgICAgICAgICAgIDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhcmlhYmxlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgRGFydFR5cGUgYXJndW1lbnQgPQogICAgICAgICAgICAgIGkgPCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzW2ldIDogY29uc3QgRHluYW1pY1R5cGUoKTsKICAgICAgICAgIGlmIChzdWJzdGl0dXRpb25NYXAgIT0gbnVsbCkgewogICAgICAgICAgICAvLyBUT0RPKGFoZSk6IEludmVzdGlnYXRlIGlmIHJlcXVpcmluZyB0aGUgY2FsbGVyIHRvIHVzZQogICAgICAgICAgICAvLyBgc3Vic3RpdHV0ZURlZXBgIGZyb20gYHBhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0YCBpbnN0ZWFkCiAgICAgICAgICAgIC8vIG9mIGBzdWJzdGl0dXRlYCBpcyBmYXN0ZXIuIElmIHNvLCB3ZSBjYW4gc2ltcGx5IHRoaXMgY29kZS4KICAgICAgICAgICAgYXJndW1lbnQgPSBzdWJzdGl0dXRlKGFyZ3VtZW50LCBzdWJzdGl0dXRpb25NYXApOwogICAgICAgICAgfQogICAgICAgICAgZGlyZWN0U3Vic3RpdHV0aW9uTWFwW3ZhcmlhYmxlc1tpXV0gPSBhcmd1bWVudDsKICAgICAgICB9CiAgICAgICAgc3Vic3RpdHV0aW9uTWFwID0gZGlyZWN0U3Vic3RpdHV0aW9uTWFwOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHN1YnN0aXR1dGlvbk1hcDsKICB9CgogIC8vLyBMb29rcyB1cCB0aGUgbWVtYmVyIGJ5IFtuYW1lXSBvbiB0aGUgY2xhc3MgYnVpbHQgYnkgdGhpcyBjbGFzcyBidWlsZGVyLgogIC8vLwogIC8vLyBJZiBbaXNTZXR0ZXJdIGlzIGBmYWxzZWAsIG9ubHkgZmllbGRzLCBtZXRob2RzLCBhbmQgZ2V0dGVycyB3aXRoIHRoYXQgbmFtZQogIC8vLyB3aWxsIGJlIGZvdW5kLiAgSWYgW2lzU2V0dGVyXSBpcyBgdHJ1ZWAsIG9ubHkgbm9uLWZpbmFsIGZpZWxkcyBhbmQgc2V0dGVycwogIC8vLyB3aWxsIGJlIGZvdW5kLgogIC8vLwogIC8vLyBJZiBbaXNTdXBlcl0gaXMgYGZhbHNlYCwgdGhlIG1lbWJlciBpcyBmb3VuZCBhbW9uZyB0aGUgaW50ZXJmYWNlIG1lbWJlcnMKICAvLy8gdGhlIGNsYXNzIGJ1aWx0IGJ5IHRoaXMgY2xhc3MgYnVpbGRlci4gSWYgW2lzU3VwZXJdIGlzIGB0cnVlYCwgdGhlIG1lbWJlcgogIC8vLyBpcyBmb3VuZCBhbW9uZyB0aGUgY2xhc3MgbWVtYmVycyBvZiB0aGUgc3VwZXJjbGFzcy4KICAvLy8KICAvLy8gSWYgdGhpcyBjbGFzcyBidWlsZGVyIGlzIGEgcGF0Y2gsIGludGVyZmFjZSBtZW1iZXJzIGRlY2xhcmVkIGluIHRoaXMKICAvLy8gcGF0Y2ggYXJlIHNlYXJjaGVkIGJlZm9yZSBzZWFyY2hpbmcgdGhlIGludGVyZmFjZSBtZW1iZXJzIGluIHRoZSBvcmlnaW4KICAvLy8gY2xhc3MuCiAgTWVtYmVyIGxvb2t1cEluc3RhbmNlTWVtYmVyKENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwgTmFtZSBuYW1lLAogICAgICB7Ym9vbCBpc1NldHRlcjogZmFsc2UsIGJvb2wgaXNTdXBlcjogZmFsc2V9KSB7CiAgICBDbGFzcyBpbnN0YW5jZUNsYXNzID0gY2xzOwogICAgaWYgKGlzUGF0Y2gpIHsKICAgICAgYXNzZXJ0KGlkZW50aWNhbChpbnN0YW5jZUNsYXNzLCBvcmlnaW4uY2xzKSwKICAgICAgICAgICJGb3VuZCAke29yaWdpbi5jbHN9IGV4cGVjdGVkICRpbnN0YW5jZUNsYXNzIik7CiAgICAgIGlmIChpc1N1cGVyKSB7CiAgICAgICAgLy8gVGhlIHN1cGVyIGNsYXNzIGlzIG9ubHkgY29ycmVjdGx5IGZvdW5kIHRocm91Z2ggdGhlIG9yaWdpbiBjbGFzcy4KICAgICAgICBpbnN0YW5jZUNsYXNzID0gb3JpZ2luLmNsczsKICAgICAgfSBlbHNlIHsKICAgICAgICBNZW1iZXIgbWVtYmVyID0KICAgICAgICAgICAgaGllcmFyY2h5LmdldEludGVyZmFjZU1lbWJlcihpbnN0YW5jZUNsYXNzLCBuYW1lLCBzZXR0ZXI6IGlzU2V0dGVyKTsKICAgICAgICBpZiAobWVtYmVyPy5wYXJlbnQgPT0gaW5zdGFuY2VDbGFzcykgewogICAgICAgICAgLy8gT25seSBpZiB0aGUgbWVtYmVyIGlzIGZvdW5kIGluIHRoZSBwYXRjaCBjYW4gd2UgdXNlIGl0LgogICAgICAgICAgcmV0dXJuIG1lbWJlcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGtlZXAgc2VhcmNoaW5nIGluIHRoZSBvcmlnaW4gY2xhc3MuCiAgICAgICAgICBpbnN0YW5jZUNsYXNzID0gb3JpZ2luLmNsczsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaXNTdXBlcikgewogICAgICBpbnN0YW5jZUNsYXNzID0gaW5zdGFuY2VDbGFzcy5zdXBlcmNsYXNzOwogICAgICBpZiAoaW5zdGFuY2VDbGFzcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIH0KICAgIE1lbWJlciB0YXJnZXQgPSBpc1N1cGVyCiAgICAgICAgPyBoaWVyYXJjaHkuZ2V0RGlzcGF0Y2hUYXJnZXQoaW5zdGFuY2VDbGFzcywgbmFtZSwgc2V0dGVyOiBpc1NldHRlcikKICAgICAgICA6IGhpZXJhcmNoeS5nZXRJbnRlcmZhY2VNZW1iZXIoaW5zdGFuY2VDbGFzcywgbmFtZSwgc2V0dGVyOiBpc1NldHRlcik7CiAgICBpZiAoaXNTdXBlciAmJiB0YXJnZXQgPT0gbnVsbCkgewogICAgICBpZiAoY2xzLmlzTWl4aW5EZWNsYXJhdGlvbiB8fAogICAgICAgICAgKGxpYnJhcnkubG9hZGVyLnRhcmdldC5iYWNrZW5kVGFyZ2V0LmVuYWJsZVN1cGVyTWl4aW5zICYmCiAgICAgICAgICAgICAgdGhpcy5pc0Fic3RyYWN0KSkgewogICAgICAgIHRhcmdldCA9CiAgICAgICAgICAgIGhpZXJhcmNoeS5nZXRJbnRlcmZhY2VNZW1iZXIoaW5zdGFuY2VDbGFzcywgbmFtZSwgc2V0dGVyOiBpc1NldHRlcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0YXJnZXQ7CiAgfQoKICAvLy8gTG9va3MgdXAgdGhlIGNvbnN0cnVjdG9yIGJ5IFtuYW1lXSBvbiB0aGUgdGhlIGNsYXNzIGJ1aWx0IGJ5IHRoaXMgY2xhc3MKICAvLy8gYnVpbGRlci4KICAvLy8KICAvLy8gSWYgW2lzU3VwZXJdIGlzIGB0cnVlYCwgY29uc3RydWN0b3JzIGluIHRoZSBzdXBlcmNsYXNzIGFyZSBzZWFyY2hlZC4KICBDb25zdHJ1Y3RvciBsb29rdXBDb25zdHJ1Y3RvcihOYW1lIG5hbWUsIHtib29sIGlzU3VwZXI6IGZhbHNlfSkgewogICAgQ2xhc3MgaW5zdGFuY2VDbGFzcyA9IGNsczsKICAgIGlmIChpc1N1cGVyKSB7CiAgICAgIGluc3RhbmNlQ2xhc3MgPSBpbnN0YW5jZUNsYXNzLnN1cGVyY2xhc3M7CiAgICB9CiAgICBpZiAoaW5zdGFuY2VDbGFzcyAhPSBudWxsKSB7CiAgICAgIGZvciAoQ29uc3RydWN0b3IgY29uc3RydWN0b3IgaW4gaW5zdGFuY2VDbGFzcy5jb25zdHJ1Y3RvcnMpIHsKICAgICAgICBpZiAoY29uc3RydWN0b3IubmFtZSA9PSBuYW1lKSByZXR1cm4gY29uc3RydWN0b3I7CiAgICAgIH0KICAgIH0KCiAgICAvLy8gUGVyZm9ybXMgYSBzaW1pbGFyIGxvb2t1cCB0byBbbG9va3VwQ29uc3RydWN0b3JdLCBidXQgdXNpbmcgYSBzbG93ZXIKICAgIC8vLyBpbXBsZW1lbnRhdGlvbi4KICAgIENvbnN0cnVjdG9yIGxvb2t1cENvbnN0cnVjdG9yV2l0aFBhdGNoZXMoTmFtZSBuYW1lLCBib29sIGlzU3VwZXIpIHsKICAgICAgQ2xhc3NCdWlsZGVyIGJ1aWxkZXIgPSB0aGlzLm9yaWdpbjsKCiAgICAgIENsYXNzQnVpbGRlciBnZXRTdXBlcmNsYXNzKENsYXNzQnVpbGRlciBidWlsZGVyKSB7CiAgICAgICAgLy8gVGhpcyB3YXkgb2YgY29tcHV0aW5nIHRoZSBzdXBlcmNsYXNzIGlzIHNsb3dlciB0aGFuIHVzaW5nIHRoZSBrZXJuZWwKICAgICAgICAvLyBvYmplY3RzIGRpcmVjdGx5LgogICAgICAgIE9iamVjdCBzdXBlcnR5cGUgPSBidWlsZGVyLnN1cGVydHlwZTsKICAgICAgICBpZiAoc3VwZXJ0eXBlIGlzIE5hbWVkVHlwZUJ1aWxkZXIpIHsKICAgICAgICAgIE9iamVjdCBidWlsZGVyID0gc3VwZXJ0eXBlLmRlY2xhcmF0aW9uOwogICAgICAgICAgaWYgKGJ1aWxkZXIgaXMgQ2xhc3NCdWlsZGVyKSByZXR1cm4gYnVpbGRlcjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIGlmIChpc1N1cGVyKSB7CiAgICAgICAgYnVpbGRlciA9IGdldFN1cGVyY2xhc3MoYnVpbGRlcik/Lm9yaWdpbjsKICAgICAgfQogICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7CiAgICAgICAgQ2xhc3MgdGFyZ2V0ID0gYnVpbGRlci50YXJnZXQ7CiAgICAgICAgZm9yIChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciBpbiB0YXJnZXQuY29uc3RydWN0b3JzKSB7CiAgICAgICAgICBpZiAoY29uc3RydWN0b3IubmFtZSA9PSBuYW1lKSByZXR1cm4gY29uc3RydWN0b3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHJldHVybiBsb29rdXBDb25zdHJ1Y3RvcldpdGhQYXRjaGVzKG5hbWUsIGlzU3VwZXIpOwogIH0KfQoKY2xhc3MgQ29uc3RydWN0b3JSZWRpcmVjdGlvbiB7CiAgU3RyaW5nIHRhcmdldDsKICBib29sIGN5Y2xlUmVwb3J0ZWQ7CgogIENvbnN0cnVjdG9yUmVkaXJlY3Rpb24odGhpcy50YXJnZXQpIDogY3ljbGVSZXBvcnRlZCA9IGZhbHNlOwp9CocSAE5OPAEdASEJExYPFRIVFA8WFxUVEBoO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X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9jbGFzc19idWlsZGVyLmRhcnRPc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvY29uc3RydWN0b3JfcmVmZXJlbmNlX2J1aWxkZXIuZGFydIj7Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuY29uc3RydWN0b3JfcmVmZXJlbmNlX2J1aWxkZXI7CgppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnIHNob3cgbm9MZW5ndGgsIHRlbXBsYXRlQ29uc3RydWN0b3JOb3RGb3VuZDsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIENsYXNzQnVpbGRlciwKICAgICAgICBEZWNsYXJhdGlvbiwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBQcmVmaXhCdWlsZGVyLAogICAgICAgIFF1YWxpZmllZE5hbWUsCiAgICAgICAgU2NvcGUsCiAgICAgICAgVHlwZUJ1aWxkZXIsCiAgICAgICAgZmxhdHRlbk5hbWU7CgpjbGFzcyBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIgewogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICBmaW5hbCBVcmkgZmlsZVVyaTsKCiAgZmluYWwgT2JqZWN0IG5hbWU7CgogIGZpbmFsIExpc3Q8VHlwZUJ1aWxkZXI+IHR5cGVBcmd1bWVudHM7CgogIC8vLyBUaGlzIGlzIHRoZSBuYW1lIG9mIGEgbmFtZWQgY29uc3RydWN0b3IuIEFzIGBiYXJgIGluIGBuZXcgRm9vPFQ+LmJhcigpYC4KICBmaW5hbCBTdHJpbmcgc3VmZml4OwoKICBEZWNsYXJhdGlvbiB0YXJnZXQ7CgogIENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlcih0aGlzLm5hbWUsIHRoaXMudHlwZUFyZ3VtZW50cywgdGhpcy5zdWZmaXgsCiAgICAgIERlY2xhcmF0aW9uIHBhcmVudCwgdGhpcy5jaGFyT2Zmc2V0KQogICAgICA6IGZpbGVVcmkgPSBwYXJlbnQuZmlsZVVyaTsKCiAgU3RyaW5nIGdldCBmdWxsTmFtZUZvckVycm9ycyB7CiAgICByZXR1cm4gIiR7ZmxhdHRlbk5hbWUobmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSl9IgogICAgICAgICIke3N1ZmZpeCA9PSBudWxsID8gJycgOiAnLiRzdWZmaXgnfSI7CiAgfQoKICB2b2lkIHJlc29sdmVJbihTY29wZSBzY29wZSwgTGlicmFyeUJ1aWxkZXIgYWNjZXNzaW5nTGlicmFyeSkgewogICAgZmluYWwgbmFtZSA9IHRoaXMubmFtZTsKICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uOwogICAgaWYgKG5hbWUgaXMgUXVhbGlmaWVkTmFtZSkgewogICAgICBTdHJpbmcgcHJlZml4ID0gbmFtZS5xdWFsaWZpZXI7CiAgICAgIFN0cmluZyBtaWRkbGUgPSBuYW1lLm5hbWU7CiAgICAgIGRlY2xhcmF0aW9uID0gc2NvcGUubG9va3VwKHByZWZpeCwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICAgIGlmIChkZWNsYXJhdGlvbiBpcyBQcmVmaXhCdWlsZGVyKSB7CiAgICAgICAgUHJlZml4QnVpbGRlciBwcmVmaXggPSBkZWNsYXJhdGlvbjsKICAgICAgICBkZWNsYXJhdGlvbiA9IHByZWZpeC5sb29rdXAobWlkZGxlLCBuYW1lLmNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlcikgewogICAgICAgIENsYXNzQnVpbGRlciBjbHMgPSBkZWNsYXJhdGlvbjsKICAgICAgICBkZWNsYXJhdGlvbiA9IGNscy5maW5kQ29uc3RydWN0b3JPckZhY3RvcnkoCiAgICAgICAgICAgIG1pZGRsZSwgbmFtZS5jaGFyT2Zmc2V0LCBmaWxlVXJpLCBhY2Nlc3NpbmdMaWJyYXJ5KTsKICAgICAgICBpZiAoc3VmZml4ID09IG51bGwpIHsKICAgICAgICAgIHRhcmdldCA9IGRlY2xhcmF0aW9uOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZGVjbGFyYXRpb24gPSBzY29wZS5sb29rdXAobmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgIHRhcmdldCA9IGRlY2xhcmF0aW9uLmZpbmRDb25zdHJ1Y3Rvck9yRmFjdG9yeSgKICAgICAgICAgIHN1ZmZpeCA/PyAiIiwgY2hhck9mZnNldCwgZmlsZVVyaSwgYWNjZXNzaW5nTGlicmFyeSk7CiAgICB9CiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKICAgICAgYWNjZXNzaW5nTGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVDb25zdHJ1Y3Rvck5vdEZvdW5kLndpdGhBcmd1bWVudHMoZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgZmlsZVVyaSk7CiAgICB9CiAgfQp9Ck8ATk48AS0BRgEWCRYVGBcXDxUVASQYARUBFQEpAU8XARYBSisiASE3LwQBQRwdISYhPyosRzAoNEEeIBIKCA09Bic1QAYaI0gWFBQGBAIBRnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2NvbnN0cnVjdG9yX3JlZmVyZW5jZV9idWlsZGVyLmRhcnQ9c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvZGVjbGFyYXRpb24uZGFydIgHLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZGVjbGFyYXRpb247CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5zdXBwb3J0ZWQ7CgphYnN0cmFjdCBjbGFzcyBEZWNsYXJhdGlvbiB7CiAgLy8vIFVzZWQgd2hlbiBtdWx0aXBsZSB0aGluZ3Mgd2l0aCB0aGUgc2FtZSBuYW1lIGFyZSBkZWNsYXJlZCB3aXRoaW4gdGhlIHNhbWUKICAvLy8gcGFyZW50LiBPbmx5IHVzZWQgZm9yIHRvcC1sZXZlbCBhbmQgY2xhc3MtbWVtYmVyIGRlY2xhcmF0aW9ucywgbm90IGZvcgogIC8vLyBibG9jayBzY29wZXMuCiAgRGVjbGFyYXRpb24gbmV4dDsKCiAgRGVjbGFyYXRpb24oKTsKCiAgRGVjbGFyYXRpb24gZ2V0IHBhcmVudDsKCiAgVXJpIGdldCBmaWxlVXJpOwoKICBpbnQgZ2V0IGNoYXJPZmZzZXQ7CgogIGdldCB0YXJnZXQgPT4gdW5zdXBwb3J0ZWQoIiR7cnVudGltZVR5cGV9LnRhcmdldCIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwoKICBEZWNsYXJhdGlvbiBnZXQgb3JpZ2luID0+IHRoaXM7CgogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnM7CgogIGJvb2wgZ2V0IGhhc1Byb2JsZW0gPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzQ29uc3QgPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzQ29uc3RydWN0b3IgPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzRmFjdG9yeSA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNGaWVsZCA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNGaW5hbCA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNHZXR0ZXIgPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzSW5zdGFuY2VNZW1iZXIgPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzTG9jYWwgPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzUGF0Y2ggPT4gdGhpcyAhPSBvcmlnaW47CgogIGJvb2wgZ2V0IGlzUmVndWxhck1ldGhvZCA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNTZXR0ZXIgPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzU3RhdGljID0+IGZhbHNlOwoKICBib29sIGdldCBpc1N5bnRoZXRpYyA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNUb3BMZXZlbCA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNUeXBlRGVjbGFyYXRpb24gPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzVHlwZVZhcmlhYmxlID0+IGZhbHNlOwoKICBib29sIGdldCBpc01peGluQXBwbGljYXRpb24gPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uID0+IGZhbHNlOwoKICBib29sIGdldCBpc0Fub255bW91c01peGluQXBwbGljYXRpb24gewogICAgcmV0dXJuIGlzTWl4aW5BcHBsaWNhdGlvbiAmJiAhaXNOYW1lZE1peGluQXBwbGljYXRpb247CiAgfQoKICAvLy8gQXBwbGllcyBbcGF0Y2hdIHRvIHRoaXMgZGVjbGFyYXRpb24uCiAgdm9pZCBhcHBseVBhdGNoKERlY2xhcmF0aW9uIHBhdGNoKSB7CiAgICB1bnN1cHBvcnRlZCgiJHtydW50aW1lVHlwZX0uYXBwbHlQYXRjaCIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBwYXRjaGVzIHRoYXQgd2FzIGZpbmlzaGVkLgogIGludCBmaW5pc2hQYXRjaCgpIHsKICAgIGlmICghaXNQYXRjaCkgcmV0dXJuIDA7CiAgICB1bnN1cHBvcnRlZCgiJHtydW50aW1lVHlwZX0uZmluaXNoUGF0Y2giLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIHJldHVybiAwOwogIH0KCiAgLy8vIFJlc29sdmUgY29uc3RydWN0b3JzIChsb29rdXAgbmFtZXMgaW4gc2NvcGUpIHJlY29yZGVkIGluIHRoaXMgYnVpbGRlciBhbmQKICAvLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgY29uc3RydWN0b3JzIHJlc29sdmVkLgogIGludCByZXNvbHZlQ29uc3RydWN0b3JzKGNvdmFyaWFudCBEZWNsYXJhdGlvbiBwYXJlbnQpID0+IDA7Cn0KWABOTjwBGwEsAR1QTRQUAREBGgETARYBSwEiASABIAEdASMBHwEdAR0BHgEmAR0BJgElAR4BHgEhASABJwEkASgBLQEpOwQBKydDBAE3FhxEDgQBUDI+AgE0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZGVjbGFyYXRpb24uZGFydEZzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9keW5hbWljX3R5cGVfYnVpbGRlci5kYXJ0gnAvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5keW5hbWljX3R5cGVfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgRGFydFR5cGU7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcgc2hvdyBMaWJyYXJ5QnVpbGRlciwgQnVpbHRpblR5cGVCdWlsZGVyOwoKY2xhc3MgRHluYW1pY1R5cGVCdWlsZGVyIGV4dGVuZHMgQnVpbHRpblR5cGVCdWlsZGVyIHsKICBEeW5hbWljVHlwZUJ1aWxkZXIoCiAgICAgIERhcnRUeXBlIHR5cGUsIExpYnJhcnlCdWlsZGVyIGNvbXBpbGF0aW9uVW5pdCwgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc3VwZXIoImR5bmFtaWMiLCB0eXBlLCBjb21waWxhdGlvblVuaXQsIGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiRHluYW1pY1R5cGVCdWlsZGVyIjsKfQoTAE5OPAEkATABPwE2FkU9ATACAT1wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9keW5hbWljX3R5cGVfYnVpbGRlci5kYXJ0PnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL2VudW1fYnVpbGRlci5kYXJ0sWUvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5lbnVtX2J1aWxkZXI7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcgc2hvdyBDbGFzc0J1aWxkZXIsIE1ldGFkYXRhQnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIENsYXNzLAogICAgICAgIENvbnN0cnVjdG9yLAogICAgICAgIENvbnN0cnVjdG9ySW52b2NhdGlvbiwKICAgICAgICBEaXJlY3RQcm9wZXJ0eUdldCwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZpZWxkLAogICAgICAgIEZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgSW50TGl0ZXJhbCwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIExpc3RMaXRlcmFsLAogICAgICAgIFByb2NlZHVyZUtpbmQsCiAgICAgICAgUmV0dXJuU3RhdGVtZW50LAogICAgICAgIFN0YXRpY0dldCwKICAgICAgICBTdHJpbmdMaXRlcmFsLAogICAgICAgIFN1cGVySW5pdGlhbGl6ZXIsCiAgICAgICAgVGhpc0V4cHJlc3Npb24sCiAgICAgICAgVmFyaWFibGVHZXQ7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgTG9jYXRlZE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZU5vVW5uYW1lZENvbnN0cnVjdG9ySW5PYmplY3QsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24sCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZSwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvblN5bnRoZXRpY0NhdXNlLAogICAgICAgIHRlbXBsYXRlRW51bUNvbnN0YW50U2FtZU5hbWVBc0VuY2xvc2luZzsKCmltcG9ydCAnLi4vbW9kaWZpZXIuZGFydCcKICAgIHNob3cKICAgICAgICBjb25zdE1hc2ssCiAgICAgICAgZmluYWxNYXNrLAogICAgICAgIGhhc0luaXRpYWxpemVyTWFzaywKICAgICAgICBpbml0aWFsaXppbmdGb3JtYWxNYXNrLAogICAgICAgIHN0YXRpY01hc2s7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUNsYXNzQnVpbGRlcjsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgRGVjbGFyYXRpb24sCiAgICAgICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciwKICAgICAgICBDbGFzc0J1aWxkZXIsCiAgICAgICAgQ29uc3RydWN0b3JCdWlsZGVyLAogICAgICAgIEtlcm5lbEZpZWxkQnVpbGRlciwKICAgICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciwKICAgICAgICBOYW1lZFR5cGVCdWlsZGVyLAogICAgICAgIFByb2NlZHVyZUJ1aWxkZXIsCiAgICAgICAgVHlwZUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTWVtYmVyQnVpbGRlciwKICAgICAgICBNZXRhZGF0YUJ1aWxkZXIsCiAgICAgICAgU2NvcGU7CgppbXBvcnQgJy4uL2tlcm5lbC9tZXRhZGF0YV9jb2xsZWN0b3IuZGFydCc7CgpjbGFzcyBFbnVtQnVpbGRlciBleHRlbmRzIFNvdXJjZUNsYXNzQnVpbGRlciB7CiAgZmluYWwgTGlzdDxFbnVtQ29uc3RhbnRJbmZvPiBlbnVtQ29uc3RhbnRJbmZvczsKCiAgZmluYWwgTmFtZWRUeXBlQnVpbGRlciBpbnRUeXBlOwoKICBmaW5hbCBOYW1lZFR5cGVCdWlsZGVyIHN0cmluZ1R5cGU7CgogIGZpbmFsIE5hbWVkVHlwZUJ1aWxkZXIgb2JqZWN0VHlwZTsKCiAgZmluYWwgTmFtZWRUeXBlQnVpbGRlciBsaXN0VHlwZTsKCiAgRW51bUJ1aWxkZXIuaW50ZXJuYWwoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIFNjb3BlIHNjb3BlLAogICAgICBTY29wZSBjb25zdHJ1Y3RvcnMsCiAgICAgIENsYXNzIGNscywKICAgICAgdGhpcy5lbnVtQ29uc3RhbnRJbmZvcywKICAgICAgdGhpcy5pbnRUeXBlLAogICAgICB0aGlzLmxpc3RUeXBlLAogICAgICB0aGlzLm9iamVjdFR5cGUsCiAgICAgIHRoaXMuc3RyaW5nVHlwZSwKICAgICAgTGlicmFyeUJ1aWxkZXIgcGFyZW50LAogICAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQpCiAgICAgIDogc3VwZXIobWV0YWRhdGEsIDAsIG5hbWUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHNjb3BlLCBjb25zdHJ1Y3RvcnMsCiAgICAgICAgICAgIHBhcmVudCwgbnVsbCwgc3RhcnRDaGFyT2Zmc2V0LCBjaGFyT2Zmc2V0LCBjaGFyRW5kT2Zmc2V0LAogICAgICAgICAgICBjbHM6IGNscyk7CgogIGZhY3RvcnkgRW51bUJ1aWxkZXIoCiAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIG1ldGFkYXRhQ29sbGVjdG9yLAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PEVudW1Db25zdGFudEluZm8+IGVudW1Db25zdGFudEluZm9zLAogICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBwYXJlbnQsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCkgewogICAgYXNzZXJ0KGVudW1Db25zdGFudEluZm9zID09IG51bGwgfHwgZW51bUNvbnN0YW50SW5mb3MuaXNOb3RFbXB0eSk7CiAgICAvLyBUT0RPKGFoZSk6IFRoZXNlIHR5cGVzIHNob3VsZG4ndCBiZSBsb29rZWQgdXAgaW4gc2NvcGUsIHRoZXkgY29tZQogICAgLy8gZGlyZWN0bHkgZnJvbSBkYXJ0OmNvcmUuCiAgICBUeXBlQnVpbGRlciBpbnRUeXBlID0gbmV3IE5hbWVkVHlwZUJ1aWxkZXIoImludCIsIG51bGwpOwogICAgVHlwZUJ1aWxkZXIgc3RyaW5nVHlwZSA9IG5ldyBOYW1lZFR5cGVCdWlsZGVyKCJTdHJpbmciLCBudWxsKTsKICAgIE5hbWVkVHlwZUJ1aWxkZXIgb2JqZWN0VHlwZSA9IG5ldyBOYW1lZFR5cGVCdWlsZGVyKCJPYmplY3QiLCBudWxsKTsKICAgIENsYXNzIGNscyA9IG5ldyBDbGFzcyhuYW1lOiBuYW1lKTsKICAgIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IG1lbWJlcnMgPSA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPnt9OwogICAgTWFwPFN0cmluZywgTWVtYmVyQnVpbGRlcj4gY29uc3RydWN0b3JzID0gPFN0cmluZywgTWVtYmVyQnVpbGRlcj57fTsKICAgIE5hbWVkVHlwZUJ1aWxkZXIgc2VsZlR5cGUgPSBuZXcgTmFtZWRUeXBlQnVpbGRlcihuYW1lLCBudWxsKTsKICAgIFR5cGVCdWlsZGVyIGxpc3RUeXBlID0KICAgICAgICBuZXcgTmFtZWRUeXBlQnVpbGRlcigiTGlzdCIsIDxUeXBlQnVpbGRlcj5bc2VsZlR5cGVdKTsKCiAgICAvLy8gbWV0YWRhdGEgY2xhc3MgRSB7CiAgICAvLy8gICBmaW5hbCBpbnQgaW5kZXg7CiAgICAvLy8gICBmaW5hbCBTdHJpbmcgX25hbWU7CiAgICAvLy8gICBjb25zdCBFKHRoaXMuaW5kZXgsIHRoaXMuX25hbWUpOwogICAgLy8vICAgc3RhdGljIGNvbnN0IEUgaWQwID0gY29uc3QgRSgwLCAnRS5pZDAnKTsKICAgIC8vLyAgIC4uLgogICAgLy8vICAgc3RhdGljIGNvbnN0IEUgaWRuLTEgPSBjb25zdCBFKG4gLSAxLCAnRS5pZG4tMScpOwogICAgLy8vICAgc3RhdGljIGNvbnN0IExpc3Q8RT4gdmFsdWVzID0gY29uc3QgPEU+W2lkMCwgLi4uLCBpZG4tMV07CiAgICAvLy8gICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfbmFtZTsKICAgIC8vLyB9CgogICAgbWVtYmVyc1siaW5kZXgiXSA9IG5ldyBLZXJuZWxGaWVsZEJ1aWxkZXIobnVsbCwgaW50VHlwZSwgImluZGV4IiwKICAgICAgICBmaW5hbE1hc2sgfCBoYXNJbml0aWFsaXplck1hc2ssIHBhcmVudCwgY2hhck9mZnNldCwgY2hhck9mZnNldCk7CiAgICBtZW1iZXJzWyJfbmFtZSJdID0gbmV3IEtlcm5lbEZpZWxkQnVpbGRlcihudWxsLCBzdHJpbmdUeXBlLCAiX25hbWUiLAogICAgICAgIGZpbmFsTWFzayB8IGhhc0luaXRpYWxpemVyTWFzaywgcGFyZW50LCBjaGFyT2Zmc2V0LCBjaGFyT2Zmc2V0KTsKICAgIENvbnN0cnVjdG9yQnVpbGRlciBjb25zdHJ1Y3RvckJ1aWxkZXIgPSBuZXcgQ29uc3RydWN0b3JCdWlsZGVyKAogICAgICAgIG51bGwsCiAgICAgICAgY29uc3RNYXNrLAogICAgICAgIG51bGwsCiAgICAgICAgIiIsCiAgICAgICAgbnVsbCwKICAgICAgICA8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj5bCiAgICAgICAgICBuZXcgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcihudWxsLCBpbml0aWFsaXppbmdGb3JtYWxNYXNrLCBpbnRUeXBlLAogICAgICAgICAgICAgICJpbmRleCIsIHBhcmVudCwgY2hhck9mZnNldCksCiAgICAgICAgICBuZXcgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcihudWxsLCBpbml0aWFsaXppbmdGb3JtYWxNYXNrLCBzdHJpbmdUeXBlLAogICAgICAgICAgICAgICJfbmFtZSIsIHBhcmVudCwgY2hhck9mZnNldCkKICAgICAgICBdLAogICAgICAgIHBhcmVudCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBjaGFyRW5kT2Zmc2V0KTsKICAgIGNvbnN0cnVjdG9yc1siIl0gPSBjb25zdHJ1Y3RvckJ1aWxkZXI7CiAgICBLZXJuZWxGaWVsZEJ1aWxkZXIgdmFsdWVzQnVpbGRlciA9IG5ldyBLZXJuZWxGaWVsZEJ1aWxkZXIoCiAgICAgICAgbnVsbCwKICAgICAgICBsaXN0VHlwZSwKICAgICAgICAidmFsdWVzIiwKICAgICAgICBjb25zdE1hc2sgfCBzdGF0aWNNYXNrIHwgaGFzSW5pdGlhbGl6ZXJNYXNrLAogICAgICAgIHBhcmVudCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQpOwogICAgbWVtYmVyc1sidmFsdWVzIl0gPSB2YWx1ZXNCdWlsZGVyOwogICAgUHJvY2VkdXJlQnVpbGRlciB0b1N0cmluZ0J1aWxkZXIgPSBuZXcgUHJvY2VkdXJlQnVpbGRlcigKICAgICAgICBudWxsLAogICAgICAgIDAsCiAgICAgICAgc3RyaW5nVHlwZSwKICAgICAgICAidG9TdHJpbmciLAogICAgICAgIG51bGwsCiAgICAgICAgbnVsbCwKICAgICAgICBQcm9jZWR1cmVLaW5kLk1ldGhvZCwKICAgICAgICBwYXJlbnQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgY2hhckVuZE9mZnNldCk7CiAgICBtZW1iZXJzWyJ0b1N0cmluZyJdID0gdG9TdHJpbmdCdWlsZGVyOwogICAgU3RyaW5nIGNsYXNzTmFtZSA9IG5hbWU7CiAgICBpZiAoZW51bUNvbnN0YW50SW5mb3MgIT0gbnVsbCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1Db25zdGFudEluZm9zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgRW51bUNvbnN0YW50SW5mbyBlbnVtQ29uc3RhbnRJbmZvID0gZW51bUNvbnN0YW50SW5mb3NbaV07CiAgICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhID0gZW51bUNvbnN0YW50SW5mby5tZXRhZGF0YTsKICAgICAgICBTdHJpbmcgbmFtZSA9IGVudW1Db25zdGFudEluZm8ubmFtZTsKICAgICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBlbnVtQ29uc3RhbnRJbmZvLmRvY3VtZW50YXRpb25Db21tZW50OwogICAgICAgIE1lbWJlckJ1aWxkZXIgZXhpc3RpbmcgPSBtZW1iZXJzW25hbWVdOwogICAgICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgICAgICAvLyBUaGUgZXhpc3RpbmcgZGVjbGFyYXRpb24gaXMgc3ludGhldGljIGlmIGl0IGhhcyB0aGUgc2FtZQogICAgICAgICAgLy8gY2hhck9mZnNldCBhcyB0aGUgZW5jbG9zaW5nIGVudW0uCiAgICAgICAgICBib29sIGlzU3ludGhldGljID0gZXhpc3RpbmcuY2hhck9mZnNldCA9PSBjaGFyT2Zmc2V0OwogICAgICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCA9IGlzU3ludGhldGljCiAgICAgICAgICAgICAgPyA8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvblN5bnRoZXRpY0NhdXNlCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhuYW1lKQogICAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZmlsZVVyaSwgY2hhck9mZnNldCwgY2xhc3NOYW1lLmxlbmd0aCkKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICA6IDxMb2NhdGVkTWVzc2FnZT5bCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2UKICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5maWxlVXJpLCBleGlzdGluZy5jaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCkKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICBwYXJlbnQuYWRkUHJvYmxlbSh0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbi53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICAgIGVudW1Db25zdGFudEluZm8uY2hhck9mZnNldCwgbmFtZS5sZW5ndGgsIHBhcmVudC5maWxlVXJpLAogICAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQpOwogICAgICAgICAgZW51bUNvbnN0YW50SW5mb3NbaV0gPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBjbGFzc05hbWUpIHsKICAgICAgICAgIHBhcmVudC5hZGRQcm9ibGVtKAogICAgICAgICAgICAgIHRlbXBsYXRlRW51bUNvbnN0YW50U2FtZU5hbWVBc0VuY2xvc2luZy53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICAgIGVudW1Db25zdGFudEluZm8uY2hhck9mZnNldCwKICAgICAgICAgICAgICBuYW1lLmxlbmd0aCwKICAgICAgICAgICAgICBwYXJlbnQuZmlsZVVyaSk7CiAgICAgICAgfQogICAgICAgIEtlcm5lbEZpZWxkQnVpbGRlciBmaWVsZEJ1aWxkZXIgPSBuZXcgS2VybmVsRmllbGRCdWlsZGVyKAogICAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgICAgc2VsZlR5cGUsCiAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgIGNvbnN0TWFzayB8IHN0YXRpY01hc2sgfCBoYXNJbml0aWFsaXplck1hc2ssCiAgICAgICAgICAgIHBhcmVudCwKICAgICAgICAgICAgZW51bUNvbnN0YW50SW5mby5jaGFyT2Zmc2V0LAogICAgICAgICAgICBlbnVtQ29uc3RhbnRJbmZvLmNoYXJPZmZzZXQpOwogICAgICAgIG1ldGFkYXRhQ29sbGVjdG9yPy5zZXREb2N1bWVudGF0aW9uQ29tbWVudCgKICAgICAgICAgICAgZmllbGRCdWlsZGVyLnRhcmdldCwgZG9jdW1lbnRhdGlvbkNvbW1lbnQpOwogICAgICAgIG1lbWJlcnNbbmFtZV0gPSBmaWVsZEJ1aWxkZXIuLm5leHQgPSBleGlzdGluZzsKICAgICAgfQogICAgfQogICAgZmluYWwgaW50IHN0YXJ0Q2hhck9mZnNldENvbXB1dGVkID0KICAgICAgICBtZXRhZGF0YSA9PSBudWxsID8gc3RhcnRDaGFyT2Zmc2V0IDogbWV0YWRhdGEuZmlyc3QuY2hhck9mZnNldDsKICAgIEVudW1CdWlsZGVyIGVudW1CdWlsZGVyID0gbmV3IEVudW1CdWlsZGVyLmludGVybmFsKAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIG5hbWUsCiAgICAgICAgbmV3IFNjb3BlKG1lbWJlcnMsIG51bGwsIHBhcmVudC5zY29wZSwgImVudW0gJG5hbWUiLAogICAgICAgICAgICBpc01vZGlmaWFibGU6IGZhbHNlKSwKICAgICAgICBuZXcgU2NvcGUoY29uc3RydWN0b3JzLCBudWxsLCBudWxsLCBuYW1lLCBpc01vZGlmaWFibGU6IGZhbHNlKSwKICAgICAgICBjbHMsCiAgICAgICAgZW51bUNvbnN0YW50SW5mb3MsCiAgICAgICAgaW50VHlwZSwKICAgICAgICBsaXN0VHlwZSwKICAgICAgICBvYmplY3RUeXBlLAogICAgICAgIHN0cmluZ1R5cGUsCiAgICAgICAgcGFyZW50LAogICAgICAgIHN0YXJ0Q2hhck9mZnNldENvbXB1dGVkLAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgY2hhckVuZE9mZnNldCk7CiAgICB2b2lkIHNldFBhcmVudChTdHJpbmcgbmFtZSwgTWVtYmVyQnVpbGRlciBidWlsZGVyKSB7CiAgICAgIGRvIHsKICAgICAgICBidWlsZGVyLnBhcmVudCA9IGVudW1CdWlsZGVyOwogICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLm5leHQ7CiAgICAgIH0gd2hpbGUgKGJ1aWxkZXIgIT0gbnVsbCk7CiAgICB9CgogICAgbWVtYmVycy5mb3JFYWNoKHNldFBhcmVudCk7CiAgICBjb25zdHJ1Y3RvcnMuZm9yRWFjaChzZXRQYXJlbnQpOwogICAgc2VsZlR5cGUuYmluZChlbnVtQnVpbGRlcik7CiAgICByZXR1cm4gZW51bUJ1aWxkZXI7CiAgfQoKICBUeXBlQnVpbGRlciBnZXQgbWl4ZWRJblR5cGUgPT4gbnVsbDsKCiAgSW50ZXJmYWNlVHlwZSBidWlsZFR5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICByZXR1cm4gY2xzLnJhd1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzcyBidWlsZChLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5QnVpbGRlciwgTGlicmFyeUJ1aWxkZXIgY29yZUxpYnJhcnkpIHsKICAgIGNscy5pc0VudW0gPSB0cnVlOwogICAgaW50VHlwZS5yZXNvbHZlSW4oY29yZUxpYnJhcnkuc2NvcGUsIGNoYXJPZmZzZXQsIGZpbGVVcmksIGxpYnJhcnlCdWlsZGVyKTsKICAgIHN0cmluZ1R5cGUucmVzb2x2ZUluKAogICAgICAgIGNvcmVMaWJyYXJ5LnNjb3BlLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBsaWJyYXJ5QnVpbGRlcik7CiAgICBvYmplY3RUeXBlLnJlc29sdmVJbigKICAgICAgICBjb3JlTGlicmFyeS5zY29wZSwgY2hhck9mZnNldCwgZmlsZVVyaSwgbGlicmFyeUJ1aWxkZXIpOwogICAgbGlzdFR5cGUucmVzb2x2ZUluKGNvcmVMaWJyYXJ5LnNjb3BlLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBsaWJyYXJ5QnVpbGRlcik7CgogICAgS2VybmVsRmllbGRCdWlsZGVyIGluZGV4RmllbGRCdWlsZGVyID0gZmlyc3RNZW1iZXJOYW1lZCgiaW5kZXgiKTsKICAgIEZpZWxkIGluZGV4RmllbGQgPSBpbmRleEZpZWxkQnVpbGRlci5idWlsZChsaWJyYXJ5QnVpbGRlcik7CiAgICBLZXJuZWxGaWVsZEJ1aWxkZXIgbmFtZUZpZWxkQnVpbGRlciA9IGZpcnN0TWVtYmVyTmFtZWQoIl9uYW1lIik7CiAgICBGaWVsZCBuYW1lRmllbGQgPSBuYW1lRmllbGRCdWlsZGVyLmJ1aWxkKGxpYnJhcnlCdWlsZGVyKTsKICAgIFByb2NlZHVyZUJ1aWxkZXIgdG9TdHJpbmdCdWlsZGVyID0gZmlyc3RNZW1iZXJOYW1lZCgidG9TdHJpbmciKTsKICAgIHRvU3RyaW5nQnVpbGRlci5ib2R5ID0gbmV3IFJldHVyblN0YXRlbWVudCgKICAgICAgICBuZXcgRGlyZWN0UHJvcGVydHlHZXQobmV3IFRoaXNFeHByZXNzaW9uKCksIG5hbWVGaWVsZCkpOwogICAgTGlzdDxFeHByZXNzaW9uPiB2YWx1ZXMgPSA8RXhwcmVzc2lvbj5bXTsKICAgIGlmIChlbnVtQ29uc3RhbnRJbmZvcyAhPSBudWxsKSB7CiAgICAgIGZvciAoRW51bUNvbnN0YW50SW5mbyBlbnVtQ29uc3RhbnRJbmZvIGluIGVudW1Db25zdGFudEluZm9zKSB7CiAgICAgICAgaWYgKGVudW1Db25zdGFudEluZm8gIT0gbnVsbCkgewogICAgICAgICAgRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBmaXJzdE1lbWJlck5hbWVkKGVudW1Db25zdGFudEluZm8ubmFtZSk7CiAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uaXNGaWVsZCkgewogICAgICAgICAgICBLZXJuZWxGaWVsZEJ1aWxkZXIgZmllbGQgPSBkZWNsYXJhdGlvbjsKICAgICAgICAgICAgdmFsdWVzLmFkZChuZXcgU3RhdGljR2V0KGZpZWxkLmJ1aWxkKGxpYnJhcnlCdWlsZGVyKSkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgS2VybmVsRmllbGRCdWlsZGVyIHZhbHVlc0J1aWxkZXIgPSBmaXJzdE1lbWJlck5hbWVkKCJ2YWx1ZXMiKTsKICAgIHZhbHVlc0J1aWxkZXIuYnVpbGQobGlicmFyeUJ1aWxkZXIpOwogICAgdmFsdWVzQnVpbGRlci5pbml0aWFsaXplciA9CiAgICAgICAgbmV3IExpc3RMaXRlcmFsKHZhbHVlcywgdHlwZUFyZ3VtZW50OiBjbHMucmF3VHlwZSwgaXNDb25zdDogdHJ1ZSk7CiAgICBDb25zdHJ1Y3RvckJ1aWxkZXIgY29uc3RydWN0b3JCdWlsZGVyID0gY29uc3RydWN0b3JTY29wZUJ1aWxkZXJbIiJdOwogICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvckJ1aWxkZXIuYnVpbGQobGlicmFyeUJ1aWxkZXIpOwogICAgY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLmluc2VydCgKICAgICAgICAwLAogICAgICAgIG5ldyBGaWVsZEluaXRpYWxpemVyKGluZGV4RmllbGQsCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChjb25zdHJ1Y3Rvci5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1swXSkpCiAgICAgICAgICAuLnBhcmVudCA9IGNvbnN0cnVjdG9yKTsKICAgIGNvbnN0cnVjdG9yLmluaXRpYWxpemVycy5pbnNlcnQoCiAgICAgICAgMSwKICAgICAgICBuZXcgRmllbGRJbml0aWFsaXplcihuYW1lRmllbGQsCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChjb25zdHJ1Y3Rvci5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1sxXSkpCiAgICAgICAgICAuLnBhcmVudCA9IGNvbnN0cnVjdG9yKTsKICAgIENsYXNzQnVpbGRlciBvYmplY3RDbGFzcyA9IG9iamVjdFR5cGUuZGVjbGFyYXRpb247CiAgICBNZW1iZXJCdWlsZGVyIHN1cGVyQ29uc3RydWN0b3IgPSBvYmplY3RDbGFzcy5maW5kQ29uc3RydWN0b3JPckZhY3RvcnkoCiAgICAgICAgIiIsIGNoYXJPZmZzZXQsIGZpbGVVcmksIGxpYnJhcnlCdWlsZGVyKTsKICAgIGlmIChzdXBlckNvbnN0cnVjdG9yID09IG51bGwgfHwgIXN1cGVyQ29uc3RydWN0b3IuaXNDb25zdHJ1Y3RvcikgewogICAgICAvLyBUT0RPKGFoZSk6IElkZWFsbHksIHdlIHdvdWxkIGFsc28gd2FudCB0byBjaGVjayB0aGF0IFtPYmplY3RdJ3MKICAgICAgLy8gdW5uYW1lZCBjb25zdHJ1Y3RvciByZXF1aXJlcyBubyBhcmd1bWVudHMuIEJ1dCB0aGF0IGluZm9ybWF0aW9uIGlzbid0CiAgICAgIC8vIGFsd2F5cyBhdmFpbGFibGUgYXQgdGhpcyBwb2ludCwgYW5kIGl0J3Mgbm90IHJlYWxseSBhIHNpdHVhdGlvbiB0aGF0CiAgICAgIC8vIGNhbiBoYXBwZW4gdW5sZXNzIHlvdSBzdGFydCBtb2RpZnlpbmcgdGhlIFNESyBzb3VyY2VzLgogICAgICBsaWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZU5vVW5uYW1lZENvbnN0cnVjdG9ySW5PYmplY3QsCiAgICAgICAgICBvYmplY3RDbGFzcy5jaGFyT2Zmc2V0LCBvYmplY3RDbGFzcy5uYW1lLmxlbmd0aCwgb2JqZWN0Q2xhc3MuZmlsZVVyaSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMuYWRkKAogICAgICAgICAgbmV3IFN1cGVySW5pdGlhbGl6ZXIoc3VwZXJDb25zdHJ1Y3Rvci50YXJnZXQsIG5ldyBBcmd1bWVudHMuZW1wdHkoKSkKICAgICAgICAgICAgLi5wYXJlbnQgPSBjb25zdHJ1Y3Rvcik7CiAgICB9CiAgICBpbnQgaW5kZXggPSAwOwogICAgaWYgKGVudW1Db25zdGFudEluZm9zICE9IG51bGwpIHsKICAgICAgZm9yIChFbnVtQ29uc3RhbnRJbmZvIGVudW1Db25zdGFudEluZm8gaW4gZW51bUNvbnN0YW50SW5mb3MpIHsKICAgICAgICBpZiAoZW51bUNvbnN0YW50SW5mbyAhPSBudWxsKSB7CiAgICAgICAgICBTdHJpbmcgY29uc3RhbnQgPSBlbnVtQ29uc3RhbnRJbmZvLm5hbWU7CiAgICAgICAgICBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IGZpcnN0TWVtYmVyTmFtZWQoY29uc3RhbnQpOwogICAgICAgICAgS2VybmVsRmllbGRCdWlsZGVyIGZpZWxkOwogICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmlzRmllbGQpIHsKICAgICAgICAgICAgZmllbGQgPSBkZWNsYXJhdGlvbjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cyA9IG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+WwogICAgICAgICAgICBuZXcgSW50TGl0ZXJhbChpbmRleCsrKSwKICAgICAgICAgICAgbmV3IFN0cmluZ0xpdGVyYWwoIiRuYW1lLiRjb25zdGFudCIpCiAgICAgICAgICBdKTsKICAgICAgICAgIGZpZWxkLmluaXRpYWxpemVyID0KICAgICAgICAgICAgICBuZXcgQ29uc3RydWN0b3JJbnZvY2F0aW9uKGNvbnN0cnVjdG9yLCBhcmd1bWVudHMsIGlzQ29uc3Q6IHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1cGVyLmJ1aWxkKGxpYnJhcnlCdWlsZGVyLCBjb3JlTGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEZWNsYXJhdGlvbiBmaW5kQ29uc3RydWN0b3JPckZhY3RvcnkoCiAgICAgIFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgcmV0dXJuIG51bGw7CiAgfQp9CgpjbGFzcyBFbnVtQ29uc3RhbnRJbmZvIHsKICBmaW5hbCBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGE7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CiAgZmluYWwgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50OwogIGNvbnN0IEVudW1Db25zdGFudEluZm8oCiAgICAgIHRoaXMubWV0YWRhdGEsIHRoaXMubmFtZSwgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmRvY3VtZW50YXRpb25Db21tZW50KTsKfQqBaQBOTjwBHAE6ASEJEw8VHxsUDxoUFxUXGRMXGhgVAR0JGC0nLDUxARoJExMcIBQBRgEnCRUgFhwcHhoaFRgXGQ8BLAEvMgEiASUBJQEjARgmExMaER4UFRcXHRsWGU5GFwEXKyYTMCMbFhtHSSA9Q0gnRElCGz8BGxseKzQOPEQmCgFGSUlJRA4TDgwOIkwsTysLEBQUFBgrPw4SEjUQFBUnPQ4LFBQODh4QFBQUGCsdJTtCRC1NMCBGL0A1Ij4rJUgSIjUrJUwTT0ghJygdSysbHwpCFhYSORQpKjQ4NwgGKEg4Eg49IkgNGxESFBQQIRQYOQsmICEGASAlIBgEAScBURgEAQxRF08aQRpBUAFGQEU+RTBBLiVFKE0lNEQMCggGQykgS0lIJQspSyMlCyhLIzdLMkdJT05APlENJE8lBhMlRSgzQCQlIRMWDDwlMQ4eUAoIBjUEAQwoRhEEAgEZKBUYJRpNAgE1cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZW51bV9idWlsZGVyLmRhcnQ/c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvZmllbGRfYnVpbGRlci5kYXJ0gwovLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5maWVsZF9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBEYXJ0VHlwZSwgRXhwcmVzc2lvbjsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JyBzaG93IExpYnJhcnlCdWlsZGVyLCBNZW1iZXJCdWlsZGVyOwoKYWJzdHJhY3QgY2xhc3MgRmllbGRCdWlsZGVyIGV4dGVuZHMgTWVtYmVyQnVpbGRlciB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIGZpbmFsIGludCBtb2RpZmllcnM7CgogIEZpZWxkQnVpbGRlcigKICAgICAgdGhpcy5uYW1lLCB0aGlzLm1vZGlmaWVycywgTGlicmFyeUJ1aWxkZXIgY29tcGlsYXRpb25Vbml0LCBpbnQgY2hhck9mZnNldCkKICAgICAgOiBzdXBlcihjb21waWxhdGlvblVuaXQsIGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiRmllbGRCdWlsZGVyIjsKCiAgRGFydFR5cGUgZ2V0IGJ1aWx0VHlwZTsKCiAgdm9pZCBzZXQgaW5pdGlhbGl6ZXIoRXhwcmVzc2lvbiB2YWx1ZSk7CgogIGJvb2wgZ2V0IGhhc0luaXRpYWxpemVyOwoKICBib29sIGdldCBpc0ZpZWxkID0+IHRydWU7Cn0KHwBOTjwBHQE8AToBNBUBFwEQUSwBKgEaASoBGwEcAgE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZmllbGRfYnVpbGRlci5kYXJ0SnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlci5kYXJ0lsQvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5mb3JtYWxfcGFyYW1ldGVyX2J1aWxkZXI7CgppbXBvcnQgJy4uL3BhcnNlci5kYXJ0JyBzaG93IEZvcm1hbFBhcmFtZXRlcktpbmQ7CgppbXBvcnQgJy4uL3BhcnNlci9mb3JtYWxfcGFyYW1ldGVyX2tpbmQuZGFydCcKICAgIHNob3cKICAgICAgICBpc01hbmRhdG9yeUZvcm1hbFBhcmFtZXRlcktpbmQsCiAgICAgICAgaXNPcHRpb25hbE5hbWVkRm9ybWFsUGFyYW1ldGVyS2luZCwKICAgICAgICBpc09wdGlvbmFsUG9zaXRpb25hbEZvcm1hbFBhcmFtZXRlcktpbmQ7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcKICAgIHNob3cgTGlicmFyeUJ1aWxkZXIsIE1ldGFkYXRhQnVpbGRlciwgTW9kaWZpZXJCdWlsZGVyLCBUeXBlQnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgVmFyaWFibGVEZWNsYXJhdGlvbjsKCmltcG9ydCAnLi4vY29uc3RhbnRfY29udGV4dC5kYXJ0JyBzaG93IENvbnN0YW50Q29udGV4dDsKCmltcG9ydCAnLi4vbW9kaWZpZXIuZGFydCcgc2hvdyBmaW5hbE1hc2ssIGluaXRpYWxpemluZ0Zvcm1hbE1hc2s7CgppbXBvcnQgJy4uL3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnLi4vc2NvcGUuZGFydCcgc2hvdyBTY29wZTsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9sb2FkZXIuZGFydCcgc2hvdyBTb3VyY2VMb2FkZXI7CgppbXBvcnQgJy4uL2tlcm5lbC9ib2R5X2J1aWxkZXIuZGFydCcgc2hvdyBCb2R5QnVpbGRlcjsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3NCdWlsZGVyLAogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIENvbnN0cnVjdG9yQnVpbGRlciwKICAgICAgICBLZXJuZWxGaWVsZEJ1aWxkZXIsCiAgICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTWV0YWRhdGFCdWlsZGVyLAogICAgICAgIFR5cGVCdWlsZGVyOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX3NoYWRvd19hc3QuZGFydCcgc2hvdyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQ7CgovLy8gQSBidWlsZGVyIGZvciBhIGZvcm1hbCBwYXJhbWV0ZXIsIGkuZS4gYSBwYXJhbWV0ZXIgb24gYSBtZXRob2Qgb3IKLy8vIGNvbnN0cnVjdG9yLgpjbGFzcyBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGV4dGVuZHMgTW9kaWZpZXJCdWlsZGVyIHsKICAvLy8gTGlzdCBvZiBtZXRhZGF0YSBidWlsZGVycyBmb3IgdGhlIG1ldGFkYXRhIGRlY2xhcmVkIG9uIHRoaXMgcGFyYW1ldGVyLgogIGZpbmFsIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YTsKCiAgZmluYWwgaW50IG1vZGlmaWVyczsKCiAgZmluYWwgVHlwZUJ1aWxkZXIgdHlwZTsKCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8vLyBUaGUga2luZCBvZiB0aGlzIHBhcmFtZXRlciwgaS5lLiBpZiBpdCdzIHJlcXVpcmVkLCBwb3NpdGlvbmFsIG9wdGlvbmFsLAogIC8vLyBvciBuYW1lZCBvcHRpb25hbC4KICBGb3JtYWxQYXJhbWV0ZXJLaW5kIGtpbmQgPSBGb3JtYWxQYXJhbWV0ZXJLaW5kLm1hbmRhdG9yeTsKCiAgLy8vIFRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBjcmVhdGVkIGZvciB0aGlzIGZvcm1hbCBwYXJhbWV0ZXIuCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKCiAgLy8vIFRoZSBmaXJzdCB0b2tlbiBvZiB0aGUgZGVmYXVsdCB2YWx1ZSwgaWYgYW55LgogIC8vLwogIC8vLyBUaGlzIGlzIHN0b3JlZCB1bnRpbCBvdXRsaW5lcyBoYXZlIGJlZW4gYnVpbHQgdGhyb3VnaAogIC8vLyBbYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnNdLgogIFRva2VuIGluaXRpYWxpemVyVG9rZW47CgogIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIodGhpcy5tZXRhZGF0YSwgdGhpcy5tb2RpZmllcnMsIHRoaXMudHlwZSwgdGhpcy5uYW1lLAogICAgICBMaWJyYXJ5QnVpbGRlciBjb21waWxhdGlvblVuaXQsIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyKGNvbXBpbGF0aW9uVW5pdCwgY2hhck9mZnNldCk7CgogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIjsKCiAgYm9vbCBnZXQgaXNSZXF1aXJlZCA9PiBpc01hbmRhdG9yeUZvcm1hbFBhcmFtZXRlcktpbmQoa2luZCk7CgogIGJvb2wgZ2V0IGlzUG9zaXRpb25hbCB7CiAgICByZXR1cm4gaXNPcHRpb25hbFBvc2l0aW9uYWxGb3JtYWxQYXJhbWV0ZXJLaW5kKGtpbmQpIHx8CiAgICAgICAgaXNNYW5kYXRvcnlGb3JtYWxQYXJhbWV0ZXJLaW5kKGtpbmQpOwogIH0KCiAgYm9vbCBnZXQgaXNOYW1lZCA9PiBpc09wdGlvbmFsTmFtZWRGb3JtYWxQYXJhbWV0ZXJLaW5kKGtpbmQpOwoKICBib29sIGdldCBpc09wdGlvbmFsID0+ICFpc1JlcXVpcmVkOwoKICBib29sIGdldCBpc0xvY2FsID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgPT4gbmFtZTsKCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBnZXQgdGFyZ2V0ID0+IGRlY2xhcmF0aW9uOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uIGJ1aWxkKAogICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBpbnQgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpIHsKICAgIGlmIChkZWNsYXJhdGlvbiA9PSBudWxsKSB7CiAgICAgIGRlY2xhcmF0aW9uID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudChuYW1lLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCwKICAgICAgICAgIHR5cGU6IHR5cGU/LmJ1aWxkKGxpYnJhcnkpLAogICAgICAgICAgaXNGaW5hbDogaXNGaW5hbCwKICAgICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QsCiAgICAgICAgICBpc0ZpZWxkRm9ybWFsOiBpc0luaXRpYWxpemluZ0Zvcm1hbCwKICAgICAgICAgIGlzQ292YXJpYW50OiBpc0NvdmFyaWFudCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogICAgfQogICAgcmV0dXJuIGRlY2xhcmF0aW9uOwogIH0KCiAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBjbG9uZShMaXN0PFR5cGVCdWlsZGVyPiBuZXdUeXBlcykgewogICAgLy8gVE9ETyhkbWl0cnlhcyk6ICBJdCdzIG5vdCBjbGVhciBob3cgW21ldGFkYXRhXSBpcyB1c2VkIGN1cnJlbnRseSwgYW5kCiAgICAvLyBob3cgaXQgc2hvdWxkIGJlIGNsb25lZC4gIENvbnNpZGVyIGNsb25pbmcgaXQgaW5zdGVhZCBvZiByZXVzaW5nIGl0LgogICAgcmV0dXJuIG5ldyBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyKAogICAgICAgIG1ldGFkYXRhLCBtb2RpZmllcnMsIHR5cGU/LmNsb25lKG5ld1R5cGVzKSwgbmFtZSwgcGFyZW50LCBjaGFyT2Zmc2V0KQogICAgICAuLmtpbmQgPSBraW5kOwogIH0KCiAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JGb3JtYWxQYXJhbWV0ZXJJbml0aWFsaXplclNjb3BlKCkgewogICAgYXNzZXJ0KGRlY2xhcmF0aW9uICE9IG51bGwpOwogICAgcmV0dXJuICFpc0luaXRpYWxpemluZ0Zvcm1hbAogICAgICAgID8gdGhpcwogICAgICAgIDogKG5ldyBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyKAogICAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgICAgbW9kaWZpZXJzIHwgZmluYWxNYXNrIHwgaW5pdGlhbGl6aW5nRm9ybWFsTWFzaywKICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgY2hhck9mZnNldCkKICAgICAgICAgIC4ucGFyZW50ID0gcGFyZW50CiAgICAgICAgICAuLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb24pOwogIH0KCiAgdm9pZCBmaW5hbGl6ZUluaXRpYWxpemluZ0Zvcm1hbCgpIHsKICAgIE9iamVjdCBjbHMgPSBwYXJlbnQucGFyZW50OwogICAgaWYgKGNscyBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgRGVjbGFyYXRpb24gZmllbGQgPSBjbHMuc2NvcGUubG9va3VwKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgICBpZiAoZmllbGQgaXMgS2VybmVsRmllbGRCdWlsZGVyKSB7CiAgICAgICAgdGFyZ2V0LnR5cGUgPSBmaWVsZC50YXJnZXQudHlwZTsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIEJ1aWxkcyB0aGUgZGVmYXVsdCB2YWx1ZSBmcm9tIHRoaXMgW2luaXRpYWxpemVyVG9rZW5dIGlmIHRoaXMgaXMgYQogIC8vLyBmb3JtYWwgcGFyYW1ldGVyIG9uIGEgY29uc3QgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UgbWV0aG9kLgogIHZvaWQgYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgLy8gRm9yIG1vZHVsYXIgY29tcGlsYXRpb24gd2UgbmVlZCB0byBpbmNsdWRlIGluaXRpYWxpemVycyBmb3Igb3B0aW9uYWwKICAgIC8vIGFuZCBuYW1lZCBwYXJhbWV0ZXJzIG9mIGNvbnN0IGNvbnN0cnVjdG9ycyBpbnRvIHRoZSBvdXRsaW5lIC0gdG8gZW5hYmxlCiAgICAvLyBjb25zdGFudCBldmFsdWF0aW9uLiBTaW1pbGFybHkgd2UgbmVlZCB0byBpbmNsdWRlIGluaXRpYWxpemVycyBmb3IKICAgIC8vIG9wdGlvbmFsIGFuZCBuYW1lZCBwYXJhbWV0ZXJzIG9mIGluc3RhbmNlIG1ldGhvZHMgYmVjYXVzZSB0aGVzZSBtaWdodCBiZQogICAgLy8gbmVlZGVkIHRvIGdlbmVyYXRlZCBub1N1Y2hNZXRob2QgZm9yd2FyZGVycy4KICAgIGZpbmFsIGJvb2wgaXNDb25zdENvbnN0cnVjdG9yUGFyYW1ldGVyID0KICAgICAgICAocGFyZW50IGlzIENvbnN0cnVjdG9yQnVpbGRlciAmJiBwYXJlbnQudGFyZ2V0LmlzQ29uc3QpOwogICAgaWYgKChpc0NvbnN0Q29uc3RydWN0b3JQYXJhbWV0ZXIgfHwgcGFyZW50LmlzSW5zdGFuY2VNZW1iZXIpICYmCiAgICAgICAgaW5pdGlhbGl6ZXJUb2tlbiAhPSBudWxsKSB7CiAgICAgIGZpbmFsIENsYXNzQnVpbGRlciBjbGFzc0J1aWxkZXIgPSBwYXJlbnQucGFyZW50OwogICAgICBTY29wZSBzY29wZSA9IGNsYXNzQnVpbGRlci5zY29wZTsKICAgICAgQm9keUJ1aWxkZXIgYm9keUJ1aWxkZXIgPSBuZXcgQm9keUJ1aWxkZXIuZm9yT3V0bGluZUV4cHJlc3Npb24oCiAgICAgICAgICBsaWJyYXJ5LCBjbGFzc0J1aWxkZXIsIHRoaXMsIHNjb3BlLCBmaWxlVXJpKTsKICAgICAgYm9keUJ1aWxkZXIuY29uc3RhbnRDb250ZXh0ID0gQ29uc3RhbnRDb250ZXh0LnJlcXVpcmVkOwogICAgICB0YXJnZXQuaW5pdGlhbGl6ZXIgPSBib2R5QnVpbGRlci5wYXJzZUZpZWxkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXJUb2tlbikKICAgICAgICAuLnBhcmVudCA9IHRhcmdldDsKICAgICAgYm9keUJ1aWxkZXIudHlwZUluZmVycmVyPy5pbmZlclBhcmFtZXRlckluaXRpYWxpemVyKAogICAgICAgICAgYm9keUJ1aWxkZXIsIHRhcmdldC5pbml0aWFsaXplciwgdGFyZ2V0LnR5cGUpOwogICAgICBpZiAobGlicmFyeS5sb2FkZXIgaXMgU291cmNlTG9hZGVyKSB7CiAgICAgICAgU291cmNlTG9hZGVyIGxvYWRlciA9IGxpYnJhcnkubG9hZGVyOwogICAgICAgIGxvYWRlci50cmFuc2Zvcm1Qb3N0SW5mZXJlbmNlKHRhcmdldCwgYm9keUJ1aWxkZXIudHJhbnNmb3JtU2V0TGl0ZXJhbHMsCiAgICAgICAgICAgIGJvZHlCdWlsZGVyLnRyYW5zZm9ybUNvbGxlY3Rpb25zKTsKICAgICAgfQogICAgICBib2R5QnVpbGRlci5yZXNvbHZlUmVkaXJlY3RpbmdGYWN0b3J5VGFyZ2V0cygpOwogICAgfQogICAgaW5pdGlhbGl6ZXJUb2tlbiA9IG51bGw7CiAgfQp9CoCtAE5OPAEoATIBLgkoLDEBFkgBOwE4AUIBJQEjATkBNwEnCRYVHBweGBkVAUwBRhE3TSgBFwEaARUBThk8AUIjATQGPCEaAU42LAE0AT8BGjwuBAFAASYBHAEMKAExAR1AH1AmHBwvJCMGGAQBPU1MJ04VBAFAISEPJxY8EhISGBwoBAEmIB9HKSkIBgQBSUI5TE9KUDQtQUQkNyhGOD5PGzs5LC5QLwg2Bh0EAgFBcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZm9ybWFsX3BhcmFtZXRlcl9idWlsZGVyLmRhcnRDc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvcHJvY2VkdXJlX2J1aWxkZXIuZGFydMAAc2EvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5wcm9jZWR1cmVfYnVpbGRlcjsKCi8vIE5vdGU6IHdlJ3JlIGRlbGliZXJhdGVseSB1c2luZyBBc3luY01hcmtlciBhbmQgUHJvY2VkdXJlS2luZCBmcm9tIGtlcm5lbAovLyBvdXRzaWRlIHRoZSBrZXJuZWwtc3BlY2lmaWMgYnVpbGRlcnMuIFRoaXMgaXMgc2ltcGxlciB0aGFuIGNyZWF0aW5nCi8vIGFkZGl0aW9uYWwgZW51bXMuCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93IEFzeW5jTWFya2VyLCBQcm9jZWR1cmVLaW5kLCBWYXJpYWJsZURlY2xhcmF0aW9uOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBjb250YWluc1R5cGVWYXJpYWJsZSwgc3Vic3RpdHV0ZTsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIsCiAgICAgICAgTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgTWVtYmVyQnVpbGRlciwKICAgICAgICBNZXRhZGF0YUJ1aWxkZXIsCiAgICAgICAgU2NvcGUsCiAgICAgICAgVHlwZUJ1aWxkZXIsCiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIEFzeW5jTWFya2VyLAogICAgICAgIENsYXNzLAogICAgICAgIENvbnN0cnVjdG9yLAogICAgICAgIENvbnN0cnVjdG9ySW52b2NhdGlvbiwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBFbXB0eVN0YXRlbWVudCwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBJbml0aWFsaXplciwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIE1lbWJlciwKICAgICAgICBOYW1lLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBQcm9jZWR1cmVLaW5kLAogICAgICAgIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIsCiAgICAgICAgU3RhdGVtZW50LAogICAgICAgIFN0YXRpY0ludm9jYXRpb24sCiAgICAgICAgU3RyaW5nTGl0ZXJhbCwKICAgICAgICBTdXBlckluaXRpYWxpemVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXIsCiAgICAgICAgVHlwZVBhcmFtZXRlclR5cGUsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiwKICAgICAgICBzZXRQYXJlbnRzOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL2NvbnN0YW50X2NvbnRleHQuZGFydCcgc2hvdyBDb25zdGFudENvbnRleHQ7CgppbXBvcnQgJy4uL2tlcm5lbC9ib2R5X2J1aWxkZXIuZGFydCcgc2hvdyBCb2R5QnVpbGRlcjsKCmltcG9ydCAnLi4va2VybmVsL2V4cHJlc3Npb25fZ2VuZXJhdG9yX2hlbHBlci5kYXJ0JwogICAgc2hvdyBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzc0J1aWxkZXIsCiAgICAgICAgQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyLAogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIsCiAgICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIsCiAgICAgICAgS2VybmVsTWV0YWRhdGFCdWlsZGVyLAogICAgICAgIExpYnJhcnlCdWlsZGVyLAogICAgICAgIE1ldGFkYXRhQnVpbGRlciwKICAgICAgICBUeXBlQnVpbGRlciwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyLAogICAgICAgIGlzUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RydWN0b3JJbXBsZW1lbnRhdGlvbjsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9zaGFkb3dfYXN0LmRhcnQnIHNob3cgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50OwoKaW1wb3J0ICcuLi9rZXJuZWwvcmVkaXJlY3RpbmdfZmFjdG9yeV9ib2R5LmRhcnQnIHNob3cgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keTsKCmltcG9ydCAnLi4vbG9hZGVyLmRhcnQnIHNob3cgTG9hZGVyOwoKaW1wb3J0ICcuLi9tZXNzYWdlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZUNvbnN0RmFjdG9yeVJlZGlyZWN0aW9uVG9Ob25Db25zdCwKICAgICAgICBtZXNzYWdlTW9yZVRoYW5PbmVTdXBlck9yVGhpc0luaXRpYWxpemVyLAogICAgICAgIG1lc3NhZ2VOb25JbnN0YW5jZVR5cGVWYXJpYWJsZVVzZSwKICAgICAgICBtZXNzYWdlUGF0Y2hEZWNsYXJhdGlvbk1pc21hdGNoLAogICAgICAgIG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uT3JpZ2luLAogICAgICAgIG1lc3NhZ2VQYXRjaE5vbkV4dGVybmFsLAogICAgICAgIG1lc3NhZ2VTdXBlckluaXRpYWxpemVyTm90TGFzdCwKICAgICAgICBtZXNzYWdlVGhpc0luaXRpYWxpemVyTm90QWxvbmUsCiAgICAgICAgbm9MZW5ndGg7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5leHBlY3RlZDsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9sb2FkZXIuZGFydCcgc2hvdyBTb3VyY2VMb2FkZXI7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0JwogICAgc2hvdyBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzTm9uQ292YXJpYW50bHksIFZhcmlhbmNlOwoKLy8vIENvbW1vbiBiYXNlIGNsYXNzIGZvciBjb25zdHJ1Y3RvciBhbmQgcHJvY2VkdXJlIGJ1aWxkZXJzLgphYnN0cmFjdCBjbGFzcyBGdW5jdGlvbkJ1aWxkZXIgZXh0ZW5kcyBNZW1iZXJCdWlsZGVyIHsKICBmaW5hbCBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGE7CgogIGZpbmFsIGludCBtb2RpZmllcnM7CgogIGZpbmFsIFR5cGVCdWlsZGVyIHJldHVyblR5cGU7CgogIGZpbmFsIFN0cmluZyBuYW1lOwoKICBmaW5hbCBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXM7CgogIGZpbmFsIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFsczsKCiAgRnVuY3Rpb25CdWlsZGVyKAogICAgICB0aGlzLm1ldGFkYXRhLAogICAgICB0aGlzLm1vZGlmaWVycywKICAgICAgdGhpcy5yZXR1cm5UeXBlLAogICAgICB0aGlzLm5hbWUsCiAgICAgIHRoaXMudHlwZVZhcmlhYmxlcywKICAgICAgdGhpcy5mb3JtYWxzLAogICAgICBMaWJyYXJ5QnVpbGRlciBjb21waWxhdGlvblVuaXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICB0aGlzLm5hdGl2ZU1ldGhvZE5hbWUpCiAgICAgIDogc3VwZXIoY29tcGlsYXRpb25Vbml0LCBjaGFyT2Zmc2V0KSB7CiAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9ybWFscy5sZW5ndGg7IGkrKykgewogICAgICAgIGZvcm1hbHNbaV0ucGFyZW50ID0gdGhpczsKICAgICAgfQogICAgfQogIH0KCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkZ1bmN0aW9uQnVpbGRlciI7CgogIEFzeW5jTWFya2VyIGdldCBhc3luY01vZGlmaWVyOwoKICBQcm9jZWR1cmVLaW5kIGdldCBraW5kOwoKICBib29sIGdldCBpc0NvbnN0cnVjdG9yID0+IGZhbHNlOwoKICBib29sIGdldCBpc1JlZ3VsYXJNZXRob2QgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuTWV0aG9kLCBraW5kKTsKCiAgYm9vbCBnZXQgaXNHZXR0ZXIgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuR2V0dGVyLCBraW5kKTsKCiAgYm9vbCBnZXQgaXNTZXR0ZXIgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuU2V0dGVyLCBraW5kKTsKCiAgYm9vbCBnZXQgaXNPcGVyYXRvciA9PiBpZGVudGljYWwoUHJvY2VkdXJlS2luZC5PcGVyYXRvciwga2luZCk7CgogIGJvb2wgZ2V0IGlzRmFjdG9yeSA9PiBpZGVudGljYWwoUHJvY2VkdXJlS2luZC5GYWN0b3J5LCBraW5kKTsKCiAgLy8vIFRoaXMgaXMgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgc2NvcGUgYXMgc3BlY2lmaWVkIGluIHRoZSBEYXJ0IFByb2dyYW1taW5nCiAgLy8vIExhbmd1YWdlIFNwZWNpZmljdGlvbiwgNHRoIGVkLCBzZWN0aW9uIDkuMi4KICBTY29wZSBjb21wdXRlRm9ybWFsUGFyYW1ldGVyU2NvcGUoU2NvcGUgcGFyZW50KSB7CiAgICBpZiAoZm9ybWFscyA9PSBudWxsKSByZXR1cm4gcGFyZW50OwogICAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IGxvY2FsID0gPFN0cmluZywgRGVjbGFyYXRpb24+e307CiAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsIGluIGZvcm1hbHMpIHsKICAgICAgaWYgKCFpc0NvbnN0cnVjdG9yIHx8ICFmb3JtYWwuaXNJbml0aWFsaXppbmdGb3JtYWwpIHsKICAgICAgICBsb2NhbFtmb3JtYWwubmFtZV0gPSBmb3JtYWw7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU2NvcGUobG9jYWwsIG51bGwsIHBhcmVudCwgImZvcm1hbCBwYXJhbWV0ZXIiLAogICAgICAgIGlzTW9kaWZpYWJsZTogZmFsc2UpOwogIH0KCiAgU2NvcGUgY29tcHV0ZUZvcm1hbFBhcmFtZXRlckluaXRpYWxpemVyU2NvcGUoU2NvcGUgcGFyZW50KSB7CiAgICAvLyBGcm9tCiAgICAvLyBbZGFydExhbmdTcGVjLnRleF0oLi4vLi4vLi4vLi4vLi4vLi4vZG9jcy9sYW5ndWFnZS9kYXJ0TGFuZ1NwZWMudGV4KSBhdAogICAgLy8gcmV2aXNpb24gOTRiMjNkM2IxMjVlOWQyNDZlMDdhMmI0M2I2MTc0MDc1OWEwZGFjZToKICAgIC8vCiAgICAvLyBXaGVuIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGxpc3Qgb2YgYSBub24tcmVkaXJlY3RpbmcgZ2VuZXJhdGl2ZQogICAgLy8gY29uc3RydWN0b3IgY29udGFpbnMgYW55IGluaXRpYWxpemluZyBmb3JtYWxzLCBhIG5ldyBzY29wZSBpcwogICAgLy8gaW50cm9kdWNlZCwgdGhlIF9mb3JtYWwgcGFyYW1ldGVyIGluaXRpYWxpemVyIHNjb3BlXywgd2hpY2ggaXMgdGhlCiAgICAvLyBjdXJyZW50IHNjb3BlIG9mIHRoZSBpbml0aWFsaXplciBsaXN0IG9mIHRoZSBjb25zdHJ1Y3RvciwgYW5kIHdoaWNoIGlzCiAgICAvLyBlbmNsb3NlZCBpbiB0aGUgc2NvcGUgd2hlcmUgdGhlIGNvbnN0cnVjdG9yIGlzIGRlY2xhcmVkLiAgRWFjaAogICAgLy8gaW5pdGlhbGl6aW5nIGZvcm1hbCBpbiB0aGUgZm9ybWFsIHBhcmFtZXRlciBsaXN0IGludHJvZHVjZXMgYSBmaW5hbAogICAgLy8gbG9jYWwgdmFyaWFibGUgaW50byB0aGUgZm9ybWFsIHBhcmFtZXRlciBpbml0aWFsaXplciBzY29wZSwgYnV0IG5vdCBpbnRvCiAgICAvLyB0aGUgZm9ybWFsIHBhcmFtZXRlciBzY29wZTsgZXZlcnkgb3RoZXIgZm9ybWFsIHBhcmFtZXRlciBpbnRyb2R1Y2VzIGEKICAgIC8vIGxvY2FsIHZhcmlhYmxlIGludG8gYm90aCB0aGUgZm9ybWFsIHBhcmFtZXRlciBzY29wZSBhbmQgdGhlIGZvcm1hbAogICAgLy8gcGFyYW1ldGVyIGluaXRpYWxpemVyIHNjb3BlLgoKICAgIGlmIChmb3JtYWxzID09IG51bGwpIHJldHVybiBwYXJlbnQ7CiAgICBNYXA8U3RyaW5nLCBEZWNsYXJhdGlvbj4gbG9jYWwgPSA8U3RyaW5nLCBEZWNsYXJhdGlvbj57fTsKICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gZm9ybWFscykgewogICAgICBsb2NhbFtmb3JtYWwubmFtZV0gPSBmb3JtYWwuZm9yRm9ybWFsUGFyYW1ldGVySW5pdGlhbGl6ZXJTY29wZSgpOwogICAgfQogICAgcmV0dXJuIG5ldyBTY29wZShsb2NhbCwgbnVsbCwgcGFyZW50LCAiZm9ybWFsIHBhcmFtZXRlciBpbml0aWFsaXplciIsCiAgICAgICAgaXNNb2RpZmlhYmxlOiBmYWxzZSk7CiAgfQoKICAvLy8gVGhpcyBzY29wZSBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYW55IHNjb3BlIHNwZWNpZmllZCBpbiB0aGUgRGFydAogIC8vLyBQcm9ncmFtbWluZyBMYW5ndWFnZSBTcGVjaWZpY3Rpb24sIDR0aCBlZC4gSXQncyBhbiB1bnNwZWNpZmllZCBleHRlbnNpb24KICAvLy8gdG8gc3VwcG9ydCBnZW5lcmljIG1ldGhvZHMuCiAgU2NvcGUgY29tcHV0ZVR5cGVQYXJhbWV0ZXJTY29wZShTY29wZSBwYXJlbnQpIHsKICAgIGlmICh0eXBlVmFyaWFibGVzID09IG51bGwpIHJldHVybiBwYXJlbnQ7CiAgICBNYXA8U3RyaW5nLCBEZWNsYXJhdGlvbj4gbG9jYWwgPSA8U3RyaW5nLCBEZWNsYXJhdGlvbj57fTsKICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgIGxvY2FsW3ZhcmlhYmxlLm5hbWVdID0gdmFyaWFibGU7CiAgICB9CiAgICByZXR1cm4gbmV3IFNjb3BlKGxvY2FsLCBudWxsLCBwYXJlbnQsICJ0eXBlIHBhcmFtZXRlciIsCiAgICAgICAgaXNNb2RpZmlhYmxlOiBmYWxzZSk7CiAgfQoKICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGdldEZvcm1hbChTdHJpbmcgbmFtZSkgewogICAgaWYgKGZvcm1hbHMgIT0gbnVsbCkgewogICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsIGluIGZvcm1hbHMpIHsKICAgICAgICBpZiAoZm9ybWFsLm5hbWUgPT0gbmFtZSkgcmV0dXJuIGZvcm1hbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmaW5hbCBTdHJpbmcgbmF0aXZlTWV0aG9kTmFtZTsKCiAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uOwoKICAvLy8gSWYgdGhpcyBwcm9jZWR1cmUgaXMgYW4gaW5zdGFuY2UgbWVtYmVyIGRlY2xhcmVkIGluIGFuIGV4dGVuc2lvbgogIC8vLyBkZWNsYXJhdGlvbiwgW2V4dGVuc2lvblRoaXNdIGhvbGRzIHRoZSBzeW50aGV0aWNhbGx5IGFkZGVkIGB0aGlzYAogIC8vLyBwYXJhbWV0ZXIuCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBleHRlbnNpb25UaGlzOwoKICBTdGF0ZW1lbnQgYWN0dWFsQm9keTsKCiAgRnVuY3Rpb25CdWlsZGVyIGdldCBhY3R1YWxPcmlnaW47CgogIHZvaWQgc2V0IGJvZHkoU3RhdGVtZW50IG5ld0JvZHkpIHsKLy8gICAgaWYgKG5ld0JvZHkgIT0gbnVsbCkgewovLyAgICAgIGlmIChpc0Fic3RyYWN0KSB7Ci8vICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogSXMgdGhpcyBjaGVjayBuZWVkZWQ/Ci8vICAgICAgICByZXR1cm4gaW50ZXJuYWxQcm9ibGVtKG1lc3NhZ2VJbnRlcm5hbFByb2JsZW1Cb2R5T25BYnN0cmFjdE1ldGhvZCwKLy8gICAgICAgICAgICBuZXdCb2R5LmZpbGVPZmZzZXQsIGZpbGVVcmkpOwovLyAgICAgIH0KLy8gICAgfQogICAgYWN0dWFsQm9keSA9IG5ld0JvZHk7CiAgICBpZiAoZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICAvLyBBIGZvcndhcmRpbmcgc2VtaS1zdHViIGlzIGEgbWV0aG9kIHRoYXQgaXMgYWJzdHJhY3QgaW4gdGhlIHNvdXJjZSBjb2RlLAogICAgICAvLyBidXQgd2hpY2ggbmVlZHMgdG8gaGF2ZSBhIGZvcndhcmRpbmcgc3R1YiBib2R5IGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0CiAgICAgIC8vIGNvdmFyaWFuY2UgY2hlY2tzIG9jY3VyLiAgV2UgZG9uJ3Qgd2FudCB0byByZXBsYWNlIHRoZSBmb3J3YXJkaW5nIHN0dWIKICAgICAgLy8gYm9keSB3aXRoIG51bGwuCiAgICAgIHZhciBwYXJlbnQgPSBmdW5jdGlvbi5wYXJlbnQ7CiAgICAgIGlmICghKG5ld0JvZHkgPT0gbnVsbCAmJgogICAgICAgICAgcGFyZW50IGlzIFByb2NlZHVyZSAmJgogICAgICAgICAgcGFyZW50LmlzRm9yd2FyZGluZ1NlbWlTdHViKSkgewogICAgICAgIGZ1bmN0aW9uLmJvZHkgPSBuZXdCb2R5OwogICAgICAgIG5ld0JvZHk/LnBhcmVudCA9IGZ1bmN0aW9uOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHNldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoTWVtYmVyIHRhcmdldCwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgaWYgKGFjdHVhbEJvZHkgIT0gbnVsbCkgewogICAgICB1bmV4cGVjdGVkKCJudWxsIiwgIiR7YWN0dWFsQm9keS5ydW50aW1lVHlwZX0iLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIH0KICAgIGFjdHVhbEJvZHkgPSBuZXcgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSh0YXJnZXQsIHR5cGVBcmd1bWVudHMpOwogICAgZnVuY3Rpb24uYm9keSA9IGFjdHVhbEJvZHk7CiAgICBhY3R1YWxCb2R5Py5wYXJlbnQgPSBmdW5jdGlvbjsKICAgIGlmIChpc1BhdGNoKSB7CiAgICAgIGFjdHVhbE9yaWdpbi5zZXRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KHRhcmdldCwgdHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgfQoKICBTdGF0ZW1lbnQgZ2V0IGJvZHkgPT4gYWN0dWFsQm9keSA/Pz0gbmV3IEVtcHR5U3RhdGVtZW50KCk7CgogIGJvb2wgZ2V0IGlzTmF0aXZlID0+IG5hdGl2ZU1ldGhvZE5hbWUgIT0gbnVsbDsKCiAgRnVuY3Rpb25Ob2RlIGJ1aWxkRnVuY3Rpb24oTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgYXNzZXJ0KGZ1bmN0aW9uID09IG51bGwpOwogICAgRnVuY3Rpb25Ob2RlIHJlc3VsdCA9IG5ldyBGdW5jdGlvbk5vZGUoYm9keSwgYXN5bmNNYXJrZXI6IGFzeW5jTW9kaWZpZXIpOwogICAgSW5jbHVkZXNUeXBlUGFyYW1ldGVyc05vbkNvdmFyaWFudGx5IG5lZWRzQ2hlY2tWaXNpdG9yOwogICAgaWYgKCFpc0NvbnN0cnVjdG9yICYmICFpc0ZhY3RvcnkgJiYgcGFyZW50IGlzIENsYXNzQnVpbGRlcikgewogICAgICBDbGFzcyBlbmNsb3NpbmdDbGFzcyA9IHBhcmVudC50YXJnZXQ7CiAgICAgIGlmIChlbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgbmVlZHNDaGVja1Zpc2l0b3IgPSBuZXcgSW5jbHVkZXNUeXBlUGFyYW1ldGVyc05vbkNvdmFyaWFudGx5KAogICAgICAgICAgICBlbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgLy8gV2UgYXJlIGNoZWNraW5nIHRoZSBwYXJhbWV0ZXIgdHlwZXMgd2hpY2ggYXJlIGluIGEgY29udHJhdmFyaWFudCBwb3NpdGlvbi4KICAgICAgICAgICAgaW5pdGlhbFZhcmlhbmNlOiBWYXJpYW5jZS5jb250cmF2YXJpYW50KTsKICAgICAgfQogICAgfQogICAgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdCBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIgPSB0LnBhcmFtZXRlcjsKICAgICAgICByZXN1bHQudHlwZVBhcmFtZXRlcnMuYWRkKHBhcmFtZXRlcik7CiAgICAgICAgaWYgKG5lZWRzQ2hlY2tWaXNpdG9yICE9IG51bGwpIHsKICAgICAgICAgIGlmIChwYXJhbWV0ZXIuYm91bmQuYWNjZXB0KG5lZWRzQ2hlY2tWaXNpdG9yKSkgewogICAgICAgICAgICBwYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHNldFBhcmVudHMocmVzdWx0LnR5cGVQYXJhbWV0ZXJzLCByZXN1bHQpOwogICAgfQoKICAgIGlmIChwYXJlbnQgaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgIENsYXNzQnVpbGRlciBjbHMgPSBwYXJlbnQ7CiAgICAgIGlmIChjbHMuaXNFeHRlbnNpb24gJiYgaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAgIERhcnRUeXBlIHRoaXNUeXBlID0gY2xzLm9uVHlwZXMuZmlyc3QuYnVpbGQobGlicmFyeSk7CiAgICAgICAgZXh0ZW5zaW9uVGhpcyA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnQoInRoaXMiLCAwLAogICAgICAgICAgICB0eXBlOiB0aGlzVHlwZSwgaXNGaW5hbDogdHJ1ZSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQKICAgICAgICAgIC4ucGFyZW50ID0gcmVzdWx0OwogICAgICAgIHJlc3VsdC5wb3NpdGlvbmFsUGFyYW1ldGVycy5hZGQoZXh0ZW5zaW9uVGhpcyk7CiAgICAgICAgcmVzdWx0LnJlcXVpcmVkUGFyYW1ldGVyQ291bnQrKzsKICAgICAgfQogICAgfQogICAgaWYgKGZvcm1hbHMgIT0gbnVsbCkgewogICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsIGluIGZvcm1hbHMpIHsKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9IGZvcm1hbC5idWlsZChsaWJyYXJ5LCAwKTsKICAgICAgICBpZiAobmVlZHNDaGVja1Zpc2l0b3IgIT0gbnVsbCkgewogICAgICAgICAgaWYgKHBhcmFtZXRlci50eXBlLmFjY2VwdChuZWVkc0NoZWNrVmlzaXRvcikpIHsKICAgICAgICAgICAgcGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZm9ybWFsLmlzTmFtZWQpIHsKICAgICAgICAgIHJlc3VsdC5uYW1lZFBhcmFtZXRlcnMuYWRkKHBhcmFtZXRlcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdC5wb3NpdGlvbmFsUGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKICAgICAgICB9CiAgICAgICAgcGFyYW1ldGVyLnBhcmVudCA9IHJlc3VsdDsKICAgICAgICBpZiAoZm9ybWFsLmlzUmVxdWlyZWQpIHsKICAgICAgICAgIHJlc3VsdC5yZXF1aXJlZFBhcmFtZXRlckNvdW50Kys7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoaXNTZXR0ZXIgJiYgKGZvcm1hbHM/Lmxlbmd0aCAhPSAxIHx8IGZvcm1hbHNbMF0uaXNPcHRpb25hbCkpIHsKICAgICAgLy8gUmVwbGFjZSBpbGxlZ2FsIHBhcmFtZXRlcnMgYnkgc2luZ2xlIGR1bW15IHBhcmFtZXRlci4KICAgICAgLy8gRG8gdGhpcyBhZnRlciBidWlsZGluZyB0aGUgcGFyYW1ldGVycywgc2luY2UgdGhlIGRpZXQgbGlzdGVuZXIKICAgICAgLy8gYXNzdW1lcyB0aGF0IHBhcmFtZXRlcnMgYXJlIGJ1aWx0LCBldmVuIGlmIGlsbGVnYWwgaW4gbnVtYmVyLgogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9CiAgICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkp1ZGdtZW50KCIjc3ludGhldGljIiwgMCk7CiAgICAgIHJlc3VsdC5wb3NpdGlvbmFsUGFyYW1ldGVycy5jbGVhcigpOwogICAgICByZXN1bHQucG9zaXRpb25hbFBhcmFtZXRlcnMuYWRkKHBhcmFtZXRlcik7CiAgICAgIHBhcmFtZXRlci5wYXJlbnQgPSByZXN1bHQ7CiAgICAgIHJlc3VsdC5uYW1lZFBhcmFtZXRlcnMuY2xlYXIoKTsKICAgICAgcmVzdWx0LnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPSAxOwogICAgfQogICAgaWYgKHJldHVyblR5cGUgIT0gbnVsbCkgewogICAgICByZXN1bHQucmV0dXJuVHlwZSA9IHJldHVyblR5cGUuYnVpbGQobGlicmFyeSk7CiAgICB9CiAgICBpZiAoIWlzQ29uc3RydWN0b3IgJiYgIWlzSW5zdGFuY2VNZW1iZXIgJiYgcGFyZW50IGlzIENsYXNzQnVpbGRlcikgewogICAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gcGFyZW50LnRhcmdldC50eXBlUGFyYW1ldGVyczsKICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbjsKICAgICAgICBEYXJ0VHlwZSByZW1vdmVUeXBlVmFyaWFibGVzKERhcnRUeXBlIHR5cGUpIHsKICAgICAgICAgIGlmIChzdWJzdGl0dXRpb24gPT0gbnVsbCkgewogICAgICAgICAgICBzdWJzdGl0dXRpb24gPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgICAgICAgIGZvciAoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIgaW4gdHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgICBzdWJzdGl0dXRpb25bcGFyYW1ldGVyXSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICBtZXNzYWdlTm9uSW5zdGFuY2VUeXBlVmFyaWFibGVVc2UsIGNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgICAgICAgIHJldHVybiBzdWJzdGl0dXRlKHR5cGUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgfQoKICAgICAgICBTZXQ8VHlwZVBhcmFtZXRlcj4gc2V0ID0gdHlwZVBhcmFtZXRlcnMudG9TZXQoKTsKICAgICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIGluIHJlc3VsdC5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICAgICAgaWYgKGNvbnRhaW5zVHlwZVZhcmlhYmxlKHBhcmFtZXRlci50eXBlLCBzZXQpKSB7CiAgICAgICAgICAgIHBhcmFtZXRlci50eXBlID0gcmVtb3ZlVHlwZVZhcmlhYmxlcyhwYXJhbWV0ZXIudHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgaW4gcmVzdWx0Lm5hbWVkUGFyYW1ldGVycykgewogICAgICAgICAgaWYgKGNvbnRhaW5zVHlwZVZhcmlhYmxlKHBhcmFtZXRlci50eXBlLCBzZXQpKSB7CiAgICAgICAgICAgIHBhcmFtZXRlci50eXBlID0gcmVtb3ZlVHlwZVZhcmlhYmxlcyhwYXJhbWV0ZXIudHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjb250YWluc1R5cGVWYXJpYWJsZShyZXN1bHQucmV0dXJuVHlwZSwgc2V0KSkgewogICAgICAgICAgcmVzdWx0LnJldHVyblR5cGUgPSByZW1vdmVUeXBlVmFyaWFibGVzKHJlc3VsdC5yZXR1cm5UeXBlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiA9IHJlc3VsdDsKICB9CgogIE1lbWJlciBidWlsZChTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBidWlsZE91dGxpbmVFeHByZXNzaW9ucyhMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICBLZXJuZWxNZXRhZGF0YUJ1aWxkZXIuYnVpbGRBbm5vdGF0aW9ucygKICAgICAgICB0YXJnZXQsIG1ldGFkYXRhLCBsaWJyYXJ5LCBpc0NsYXNzTWVtYmVyID8gcGFyZW50IDogbnVsbCwgdGhpcyk7CgogICAgaWYgKGZvcm1hbHMgIT0gbnVsbCkgewogICAgICAvLyBGb3IgY29uc3QgY29uc3RydWN0b3JzIHdlIG5lZWQgdG8gaW5jbHVkZSBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMKICAgICAgLy8gaW50byB0aGUgb3V0bGluZS4gRm9yIGFsbCBvdGhlciBmb3JtYWxzIHdlIG5lZWQgdG8gY2FsbAogICAgICAvLyBidWlsZE91dGxpbmVFeHByZXNzaW9ucyB0byBjbGVhciBpbml0aWFsaXplclRva2VuIHRvIHByZXZlbnQKICAgICAgLy8gY29uc3VtaW5nIHRvbyBtdWNoIG1lbW9yeS4KICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiBmb3JtYWxzKSB7CiAgICAgICAgZm9ybWFsLmJ1aWxkT3V0bGluZUV4cHJlc3Npb25zKGxpYnJhcnkpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGJlY29tZU5hdGl2ZShMb2FkZXIgbG9hZGVyKSB7CiAgICBEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciA9IGxvYWRlci5nZXROYXRpdmVBbm5vdGF0aW9uKCk7CiAgICBBcmd1bWVudHMgYXJndW1lbnRzID0KICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPltuZXcgU3RyaW5nTGl0ZXJhbChuYXRpdmVNZXRob2ROYW1lKV0pOwogICAgRXhwcmVzc2lvbiBhbm5vdGF0aW9uOwogICAgaWYgKGNvbnN0cnVjdG9yLmlzQ29uc3RydWN0b3IpIHsKICAgICAgYW5ub3RhdGlvbiA9IG5ldyBDb25zdHJ1Y3Rvckludm9jYXRpb24oY29uc3RydWN0b3IudGFyZ2V0LCBhcmd1bWVudHMpCiAgICAgICAgLi5pc0NvbnN0ID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGFubm90YXRpb24gPSBuZXcgU3RhdGljSW52b2NhdGlvbihjb25zdHJ1Y3Rvci50YXJnZXQsIGFyZ3VtZW50cykKICAgICAgICAuLmlzQ29uc3QgPSB0cnVlOwogICAgfQogICAgdGFyZ2V0LmFkZEFubm90YXRpb24oYW5ub3RhdGlvbik7CiAgfQoKICBib29sIGNoZWNrUGF0Y2goRnVuY3Rpb25CdWlsZGVyIHBhdGNoKSB7CiAgICBpZiAoIWlzRXh0ZXJuYWwpIHsKICAgICAgcGF0Y2gubGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgbWVzc2FnZVBhdGNoTm9uRXh0ZXJuYWwsIHBhdGNoLmNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBwYXRjaC5maWxlVXJpLAogICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICBtZXNzYWdlUGF0Y2hEZWNsYXJhdGlvbk9yaWdpbi53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICBmaWxlVXJpLCBjaGFyT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgICAgIF0pOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgcmVwb3J0UGF0Y2hNaXNtYXRjaChEZWNsYXJhdGlvbiBwYXRjaCkgewogICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2gsIHBhdGNoLmNoYXJPZmZzZXQsCiAgICAgICAgbm9MZW5ndGgsIHBhdGNoLmZpbGVVcmksIGNvbnRleHQ6IFsKICAgICAgbWVzc2FnZVBhdGNoRGVjbGFyYXRpb25PcmlnaW4ud2l0aExvY2F0aW9uKGZpbGVVcmksIGNoYXJPZmZzZXQsIG5vTGVuZ3RoKQogICAgXSk7CiAgfQp9CgpjbGFzcyBQcm9jZWR1cmVCdWlsZGVyIGV4dGVuZHMgRnVuY3Rpb25CdWlsZGVyIHsKICBmaW5hbCBQcm9jZWR1cmUgcHJvY2VkdXJlOwogIGZpbmFsIGludCBjaGFyT3BlblBhcmVuT2Zmc2V0OwoKICBBc3luY01hcmtlciBhY3R1YWxBc3luY01vZGlmaWVyID0gQXN5bmNNYXJrZXIuU3luYzsKCiAgQG92ZXJyaWRlCiAgUHJvY2VkdXJlQnVpbGRlciBhY3R1YWxPcmlnaW47CgogIGJvb2wgaGFkVHlwZXNJbmZlcnJlZCA9IGZhbHNlOwoKICBQcm9jZWR1cmVCdWlsZGVyKAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFR5cGVCdWlsZGVyIHJldHVyblR5cGUsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscywKICAgICAgUHJvY2VkdXJlS2luZCBraW5kLAogICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBjb21waWxhdGlvblVuaXQsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICB0aGlzLmNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBbU3RyaW5nIG5hdGl2ZU1ldGhvZE5hbWVdKQogICAgICA6IHByb2NlZHVyZSA9CiAgICAgICAgICAgIG5ldyBQcm9jZWR1cmUobnVsbCwga2luZCwgbnVsbCwgZmlsZVVyaTogY29tcGlsYXRpb25Vbml0Py5maWxlVXJpKQogICAgICAgICAgICAgIC4uc3RhcnRGaWxlT2Zmc2V0ID0gc3RhcnRDaGFyT2Zmc2V0CiAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldAogICAgICAgICAgICAgIC4uZmlsZUVuZE9mZnNldCA9IGNoYXJFbmRPZmZzZXQsCiAgICAgICAgc3VwZXIobWV0YWRhdGEsIG1vZGlmaWVycywgcmV0dXJuVHlwZSwgbmFtZSwgdHlwZVZhcmlhYmxlcywgZm9ybWFscywKICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LCBjaGFyT2Zmc2V0LCBuYXRpdmVNZXRob2ROYW1lKTsKCiAgQG92ZXJyaWRlCiAgUHJvY2VkdXJlQnVpbGRlciBnZXQgb3JpZ2luID0+IGFjdHVhbE9yaWdpbiA/PyB0aGlzOwoKICBQcm9jZWR1cmVLaW5kIGdldCBraW5kID0+IHByb2NlZHVyZS5raW5kOwoKICBBc3luY01hcmtlciBnZXQgYXN5bmNNb2RpZmllciA9PiBhY3R1YWxBc3luY01vZGlmaWVyOwoKICBTdGF0ZW1lbnQgZ2V0IGJvZHkgewogICAgaWYgKGFjdHVhbEJvZHkgPT0gbnVsbCAmJiAhaXNBYnN0cmFjdCAmJiAhaXNFeHRlcm5hbCkgewogICAgICBhY3R1YWxCb2R5ID0gbmV3IEVtcHR5U3RhdGVtZW50KCk7CiAgICB9CiAgICByZXR1cm4gYWN0dWFsQm9keTsKICB9CgogIHZvaWQgc2V0IGFzeW5jTW9kaWZpZXIoQXN5bmNNYXJrZXIgbmV3TW9kaWZpZXIpIHsKICAgIGFjdHVhbEFzeW5jTW9kaWZpZXIgPSBuZXdNb2RpZmllcjsKICAgIGlmIChmdW5jdGlvbiAhPSBudWxsKSB7CiAgICAgIC8vIE5vIHBhcmVudCwgaXQncyBhbiBlbnVtLgogICAgICBmdW5jdGlvbi5hc3luY01hcmtlciA9IGFjdHVhbEFzeW5jTW9kaWZpZXI7CiAgICAgIGZ1bmN0aW9uLmRhcnRBc3luY01hcmtlciA9IGFjdHVhbEFzeW5jTW9kaWZpZXI7CiAgICB9CiAgfQoKICBib29sIGdldCBpc0VsaWdpYmxlRm9yVG9wTGV2ZWxJbmZlcmVuY2UgewogICAgaWYgKGxpYnJhcnkubGVnYWN5TW9kZSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgaWYgKHJldHVyblR5cGUgPT0gbnVsbCkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChmb3JtYWxzICE9IG51bGwpIHsKICAgICAgICBmb3IgKHZhciBmb3JtYWwgaW4gZm9ybWFscykgewogICAgICAgICAgaWYgKGZvcm1hbC50eXBlID09IG51bGwpIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgUHJvY2VkdXJlIGJ1aWxkKFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIC8vIFRPRE8oYWhlKTogSSB0aGluayB3ZSBtYXkgY2FsbCB0aGlzIHR3aWNlIG9uIHBhcnRzLiBJbnZlc3RpZ2F0ZS4KICAgIGlmIChwcm9jZWR1cmUubmFtZSA9PSBudWxsKSB7CiAgICAgIHByb2NlZHVyZS5mdW5jdGlvbiA9IGJ1aWxkRnVuY3Rpb24obGlicmFyeSk7CiAgICAgIHByb2NlZHVyZS5mdW5jdGlvbi5wYXJlbnQgPSBwcm9jZWR1cmU7CiAgICAgIHByb2NlZHVyZS5mdW5jdGlvbi5maWxlT2Zmc2V0ID0gY2hhck9wZW5QYXJlbk9mZnNldDsKICAgICAgcHJvY2VkdXJlLmZ1bmN0aW9uLmZpbGVFbmRPZmZzZXQgPSBwcm9jZWR1cmUuZmlsZUVuZE9mZnNldDsKICAgICAgcHJvY2VkdXJlLmlzQWJzdHJhY3QgPSBpc0Fic3RyYWN0OwogICAgICBwcm9jZWR1cmUuaXNTdGF0aWMgPSBpc1N0YXRpYzsKICAgICAgcHJvY2VkdXJlLmlzRXh0ZXJuYWwgPSBpc0V4dGVybmFsOwogICAgICBwcm9jZWR1cmUuaXNDb25zdCA9IGlzQ29uc3Q7CiAgICAgIHByb2NlZHVyZS5uYW1lID0gbmV3IE5hbWUobmFtZSwgbGlicmFyeS50YXJnZXQpOwogICAgfQogICAgcmV0dXJuIHByb2NlZHVyZTsKICB9CgogIFByb2NlZHVyZSBnZXQgdGFyZ2V0ID0+IG9yaWdpbi5wcm9jZWR1cmU7CgogIEBvdmVycmlkZQogIGludCBmaW5pc2hQYXRjaCgpIHsKICAgIGlmICghaXNQYXRjaCkgcmV0dXJuIDA7CgogICAgLy8gVE9ETyhhaGUpOiByZXN0b3JlIGZpbGUtb2Zmc2V0IG9uY2Ugd2UgdHJhY2sgYm90aCBvcmlnaW4gYW5kIHBhdGNoIGZpbGUKICAgIC8vIFVSSXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzE1NzkKICAgIG9yaWdpbi5wcm9jZWR1cmUuZmlsZVVyaSA9IGZpbGVVcmk7CiAgICBvcmlnaW4ucHJvY2VkdXJlLnN0YXJ0RmlsZU9mZnNldCA9IHByb2NlZHVyZS5zdGFydEZpbGVPZmZzZXQ7CiAgICBvcmlnaW4ucHJvY2VkdXJlLmZpbGVPZmZzZXQgPSBwcm9jZWR1cmUuZmlsZU9mZnNldDsKICAgIG9yaWdpbi5wcm9jZWR1cmUuZmlsZUVuZE9mZnNldCA9IHByb2NlZHVyZS5maWxlRW5kT2Zmc2V0OwogICAgb3JpZ2luLnByb2NlZHVyZS5hbm5vdGF0aW9ucwogICAgICAgIC5mb3JFYWNoKChtKSA9PiBtLmZpbGVPZmZzZXQgPSBwcm9jZWR1cmUuZmlsZU9mZnNldCk7CgogICAgb3JpZ2luLnByb2NlZHVyZS5pc0Fic3RyYWN0ID0gcHJvY2VkdXJlLmlzQWJzdHJhY3Q7CiAgICBvcmlnaW4ucHJvY2VkdXJlLmlzRXh0ZXJuYWwgPSBwcm9jZWR1cmUuaXNFeHRlcm5hbDsKICAgIG9yaWdpbi5wcm9jZWR1cmUuZnVuY3Rpb24gPSBwcm9jZWR1cmUuZnVuY3Rpb247CiAgICBvcmlnaW4ucHJvY2VkdXJlLmZ1bmN0aW9uLnBhcmVudCA9IG9yaWdpbi5wcm9jZWR1cmU7CiAgICByZXR1cm4gMTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVjb21lTmF0aXZlKExvYWRlciBsb2FkZXIpIHsKICAgIHByb2NlZHVyZS5pc0V4dGVybmFsID0gdHJ1ZTsKICAgIHN1cGVyLmJlY29tZU5hdGl2ZShsb2FkZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhcHBseVBhdGNoKERlY2xhcmF0aW9uIHBhdGNoKSB7CiAgICBpZiAocGF0Y2ggaXMgUHJvY2VkdXJlQnVpbGRlcikgewogICAgICBpZiAoY2hlY2tQYXRjaChwYXRjaCkpIHsKICAgICAgICBwYXRjaC5hY3R1YWxPcmlnaW4gPSB0aGlzOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXBvcnRQYXRjaE1pc21hdGNoKHBhdGNoKTsKICAgIH0KICB9Cn0KCi8vIFRPRE8oYWhlKTogTW92ZSB0aGlzIHRvIG93biBmaWxlPwpjbGFzcyBDb25zdHJ1Y3RvckJ1aWxkZXIgZXh0ZW5kcyBGdW5jdGlvbkJ1aWxkZXIgewogIGZpbmFsIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yOwoKICBmaW5hbCBpbnQgY2hhck9wZW5QYXJlbk9mZnNldDsKCiAgYm9vbCBoYXNNb3ZlZFN1cGVySW5pdGlhbGl6ZXIgPSBmYWxzZTsKCiAgU3VwZXJJbml0aWFsaXplciBzdXBlckluaXRpYWxpemVyOwoKICBSZWRpcmVjdGluZ0luaXRpYWxpemVyIHJlZGlyZWN0aW5nSW5pdGlhbGl6ZXI7CgogIFRva2VuIGJlZ2luSW5pdGlhbGl6ZXJzOwoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckJ1aWxkZXIgYWN0dWFsT3JpZ2luOwoKICBDb25zdHJ1Y3RvckJ1aWxkZXIoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzLAogICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciBjb21waWxhdGlvblVuaXQsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICB0aGlzLmNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBbU3RyaW5nIG5hdGl2ZU1ldGhvZE5hbWVdKQogICAgICA6IGNvbnN0cnVjdG9yID0gbmV3IENvbnN0cnVjdG9yKG51bGwsIGZpbGVVcmk6IGNvbXBpbGF0aW9uVW5pdD8uZmlsZVVyaSkKICAgICAgICAgIC4uc3RhcnRGaWxlT2Zmc2V0ID0gc3RhcnRDaGFyT2Zmc2V0CiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0CiAgICAgICAgICAuLmZpbGVFbmRPZmZzZXQgPSBjaGFyRW5kT2Zmc2V0LAogICAgICAgIHN1cGVyKG1ldGFkYXRhLCBtb2RpZmllcnMsIHJldHVyblR5cGUsIG5hbWUsIHR5cGVWYXJpYWJsZXMsIGZvcm1hbHMsCiAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdCwgY2hhck9mZnNldCwgbmF0aXZlTWV0aG9kTmFtZSk7CgogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yQnVpbGRlciBnZXQgb3JpZ2luID0+IGFjdHVhbE9yaWdpbiA/PyB0aGlzOwoKICBib29sIGdldCBpc0luc3RhbmNlTWVtYmVyID0+IGZhbHNlOwoKICBib29sIGdldCBpc0NvbnN0cnVjdG9yID0+IHRydWU7CgogIEFzeW5jTWFya2VyIGdldCBhc3luY01vZGlmaWVyID0+IEFzeW5jTWFya2VyLlN5bmM7CgogIFByb2NlZHVyZUtpbmQgZ2V0IGtpbmQgPT4gbnVsbDsKCiAgYm9vbCBnZXQgaXNSZWRpcmVjdGluZ0dlbmVyYXRpdmVDb25zdHJ1Y3RvciB7CiAgICByZXR1cm4gaXNSZWRpcmVjdGluZ0dlbmVyYXRpdmVDb25zdHJ1Y3RvckltcGxlbWVudGF0aW9uKGNvbnN0cnVjdG9yKTsKICB9CgogIGJvb2wgZ2V0IGlzRWxpZ2libGVGb3JUb3BMZXZlbEluZmVyZW5jZSB7CiAgICBpZiAobGlicmFyeS5sZWdhY3lNb2RlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGZvciAodmFyIGZvcm1hbCBpbiBmb3JtYWxzKSB7CiAgICAgICAgaWYgKGZvcm1hbC50eXBlID09IG51bGwgJiYgZm9ybWFsLmlzSW5pdGlhbGl6aW5nRm9ybWFsKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQ29uc3RydWN0b3IgYnVpbGQoU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgaWYgKGNvbnN0cnVjdG9yLm5hbWUgPT0gbnVsbCkgewogICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbiA9IGJ1aWxkRnVuY3Rpb24obGlicmFyeSk7CiAgICAgIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLnBhcmVudCA9IGNvbnN0cnVjdG9yOwogICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5maWxlT2Zmc2V0ID0gY2hhck9wZW5QYXJlbk9mZnNldDsKICAgICAgY29uc3RydWN0b3IuZnVuY3Rpb24uZmlsZUVuZE9mZnNldCA9IGNvbnN0cnVjdG9yLmZpbGVFbmRPZmZzZXQ7CiAgICAgIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzID0gY29uc3QgPFR5cGVQYXJhbWV0ZXI+W107CiAgICAgIGNvbnN0cnVjdG9yLmlzQ29uc3QgPSBpc0NvbnN0OwogICAgICBjb25zdHJ1Y3Rvci5pc0V4dGVybmFsID0gaXNFeHRlcm5hbDsKICAgICAgY29uc3RydWN0b3IubmFtZSA9IG5ldyBOYW1lKG5hbWUsIGxpYnJhcnkudGFyZ2V0KTsKICAgIH0KICAgIGlmIChpc0VsaWdpYmxlRm9yVG9wTGV2ZWxJbmZlcmVuY2UpIHsKICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiBmb3JtYWxzKSB7CiAgICAgICAgaWYgKGZvcm1hbC50eXBlID09IG51bGwgJiYgZm9ybWFsLmlzSW5pdGlhbGl6aW5nRm9ybWFsKSB7CiAgICAgICAgICBmb3JtYWwuZGVjbGFyYXRpb24udHlwZSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxpYnJhcnkubG9hZGVyLnR5cGVJbmZlcmVuY2VFbmdpbmUudG9CZUluZmVycmVkW2NvbnN0cnVjdG9yXSA9IGxpYnJhcnk7CiAgICB9CiAgICByZXR1cm4gY29uc3RydWN0b3I7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJ1aWxkT3V0bGluZUV4cHJlc3Npb25zKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIHN1cGVyLmJ1aWxkT3V0bGluZUV4cHJlc3Npb25zKGxpYnJhcnkpOwoKICAgIC8vIEZvciBtb2R1bGFyIGNvbXBpbGF0aW9uIHB1cnBvc2VzIHdlIG5lZWQgdG8gaW5jbHVkZSBpbml0aWFsaXplcnMKICAgIC8vIGZvciBjb25zdCBjb25zdHJ1Y3RvcnMgaW50byB0aGUgb3V0bGluZS4KICAgIGlmIChpc0NvbnN0ICYmIGJlZ2luSW5pdGlhbGl6ZXJzICE9IG51bGwpIHsKICAgICAgQ2xhc3NCdWlsZGVyIGNsYXNzQnVpbGRlciA9IHBhcmVudDsKICAgICAgQm9keUJ1aWxkZXIgYm9keUJ1aWxkZXIgPSBuZXcgQm9keUJ1aWxkZXIuZm9yT3V0bGluZUV4cHJlc3Npb24oCiAgICAgICAgICBsaWJyYXJ5LCBjbGFzc0J1aWxkZXIsIHRoaXMsIGNsYXNzQnVpbGRlci5zY29wZSwgZmlsZVVyaSk7CiAgICAgIGJvZHlCdWlsZGVyLmNvbnN0YW50Q29udGV4dCA9IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZDsKICAgICAgYm9keUJ1aWxkZXIucGFyc2VJbml0aWFsaXplcnMoYmVnaW5Jbml0aWFsaXplcnMpOwogICAgICBpZiAobGlicmFyeS5sb2FkZXIgaXMgU291cmNlTG9hZGVyKSB7CiAgICAgICAgU291cmNlTG9hZGVyIGxvYWRlciA9IGxpYnJhcnkubG9hZGVyOwogICAgICAgIGxvYWRlci50cmFuc2Zvcm1Qb3N0SW5mZXJlbmNlKHRhcmdldCwgYm9keUJ1aWxkZXIudHJhbnNmb3JtU2V0TGl0ZXJhbHMsCiAgICAgICAgICAgIGJvZHlCdWlsZGVyLnRyYW5zZm9ybUNvbGxlY3Rpb25zKTsKICAgICAgfQogICAgICBib2R5QnVpbGRlci5yZXNvbHZlUmVkaXJlY3RpbmdGYWN0b3J5VGFyZ2V0cygpOwogICAgfQogICAgYmVnaW5Jbml0aWFsaXplcnMgPSBudWxsOwogIH0KCiAgRnVuY3Rpb25Ob2RlIGJ1aWxkRnVuY3Rpb24oTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIMKnOS4zIHRoZSByZXR1cm4gdHlwZSBvZiBhIGNvbnN0cnVjdG9yCiAgICAvLyBmdW5jdGlvbiBpcyBpdHMgZW5jbG9zaW5nIGNsYXNzLgogICAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZSA9IHN1cGVyLmJ1aWxkRnVuY3Rpb24obGlicmFyeSk7CiAgICBDbGFzc0J1aWxkZXIgZW5jbG9zaW5nQ2xhc3MgPSBwYXJlbnQ7CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlUGFyYW1ldGVyVHlwZXMgPSBuZXcgTGlzdDxEYXJ0VHlwZT4oKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5jbG9zaW5nQ2xhc3MudGFyZ2V0LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGVuY2xvc2luZ0NsYXNzLnRhcmdldC50eXBlUGFyYW1ldGVyc1tpXTsKICAgICAgdHlwZVBhcmFtZXRlclR5cGVzLmFkZChuZXcgVHlwZVBhcmFtZXRlclR5cGUodHlwZVBhcmFtZXRlcikpOwogICAgfQogICAgZnVuY3Rpb25Ob2RlLnJldHVyblR5cGUgPQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKGVuY2xvc2luZ0NsYXNzLnRhcmdldCwgdHlwZVBhcmFtZXRlclR5cGVzKTsKICAgIHJldHVybiBmdW5jdGlvbk5vZGU7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgdGFyZ2V0ID0+IG9yaWdpbi5jb25zdHJ1Y3RvcjsKCiAgdm9pZCBpbmplY3RJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgIE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyKSB7CiAgICBMaXN0PEluaXRpYWxpemVyPiBpbml0aWFsaXplcnMgPSBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnM7CiAgICBJbml0aWFsaXplciBsYXN0SW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcnMucmVtb3ZlTGFzdCgpOwogICAgYXNzZXJ0KGxhc3RJbml0aWFsaXplciA9PSBzdXBlckluaXRpYWxpemVyIHx8CiAgICAgICAgbGFzdEluaXRpYWxpemVyID09IHJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIpOwogICAgSW5pdGlhbGl6ZXIgZXJyb3IgPSBoZWxwZXIuYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgICAgaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKAogICAgICAgICAgICBoZWxwZXIuYnVpbGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIG5vTGVuZ3RoKSksCiAgICAgICAgY2hhck9mZnNldCk7CiAgICBpbml0aWFsaXplcnMuYWRkKGVycm9yLi5wYXJlbnQgPSBjb25zdHJ1Y3Rvcik7CiAgICBpbml0aWFsaXplcnMuYWRkKGxhc3RJbml0aWFsaXplcik7CiAgfQoKICB2b2lkIGFkZEluaXRpYWxpemVyKAogICAgICBJbml0aWFsaXplciBpbml0aWFsaXplciwgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIpIHsKICAgIExpc3Q8SW5pdGlhbGl6ZXI+IGluaXRpYWxpemVycyA9IGNvbnN0cnVjdG9yLmluaXRpYWxpemVyczsKICAgIGlmIChpbml0aWFsaXplciBpcyBTdXBlckluaXRpYWxpemVyKSB7CiAgICAgIGlmIChzdXBlckluaXRpYWxpemVyICE9IG51bGwgfHwgcmVkaXJlY3RpbmdJbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgaW5qZWN0SW52YWxpZEluaXRpYWxpemVyKG1lc3NhZ2VNb3JlVGhhbk9uZVN1cGVyT3JUaGlzSW5pdGlhbGl6ZXIsCiAgICAgICAgICAgIGluaXRpYWxpemVyLmZpbGVPZmZzZXQsIGhlbHBlcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5pdGlhbGl6ZXJzLmFkZChpbml0aWFsaXplci4ucGFyZW50ID0gY29uc3RydWN0b3IpOwogICAgICAgIHN1cGVySW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcjsKICAgICAgfQogICAgfSBlbHNlIGlmIChpbml0aWFsaXplciBpcyBSZWRpcmVjdGluZ0luaXRpYWxpemVyKSB7CiAgICAgIGlmIChzdXBlckluaXRpYWxpemVyICE9IG51bGwgfHwgcmVkaXJlY3RpbmdJbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgaW5qZWN0SW52YWxpZEluaXRpYWxpemVyKG1lc3NhZ2VNb3JlVGhhbk9uZVN1cGVyT3JUaGlzSW5pdGlhbGl6ZXIsCiAgICAgICAgICAgIGluaXRpYWxpemVyLmZpbGVPZmZzZXQsIGhlbHBlcik7CiAgICAgIH0gZWxzZSBpZiAoY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICBJbml0aWFsaXplciBmaXJzdCA9IGNvbnN0cnVjdG9yLmluaXRpYWxpemVycy5maXJzdDsKICAgICAgICBJbml0aWFsaXplciBlcnJvciA9IGhlbHBlci5idWlsZEludmFsaWRJbml0aWFsaXplcigKICAgICAgICAgICAgaGVscGVyLmRlc3VnYXJTeW50aGV0aWNFeHByZXNzaW9uKGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICBtZXNzYWdlVGhpc0luaXRpYWxpemVyTm90QWxvbmUsIGZpcnN0LmZpbGVPZmZzZXQsIG5vTGVuZ3RoKSksCiAgICAgICAgICAgIGZpcnN0LmZpbGVPZmZzZXQpOwogICAgICAgIGluaXRpYWxpemVycy5hZGQoZXJyb3IuLnBhcmVudCA9IGNvbnN0cnVjdG9yKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbml0aWFsaXplcnMuYWRkKGluaXRpYWxpemVyLi5wYXJlbnQgPSBjb25zdHJ1Y3Rvcik7CiAgICAgICAgcmVkaXJlY3RpbmdJbml0aWFsaXplciA9IGluaXRpYWxpemVyOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICBpbmplY3RJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgICAgICBtZXNzYWdlVGhpc0luaXRpYWxpemVyTm90QWxvbmUsIGluaXRpYWxpemVyLmZpbGVPZmZzZXQsIGhlbHBlcik7CiAgICB9IGVsc2UgaWYgKHN1cGVySW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICBpbmplY3RJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgICAgICBtZXNzYWdlU3VwZXJJbml0aWFsaXplck5vdExhc3QsIHN1cGVySW5pdGlhbGl6ZXIuZmlsZU9mZnNldCwgaGVscGVyKTsKICAgIH0gZWxzZSB7CiAgICAgIGluaXRpYWxpemVycy5hZGQoaW5pdGlhbGl6ZXIuLnBhcmVudCA9IGNvbnN0cnVjdG9yKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCBmaW5pc2hQYXRjaCgpIHsKICAgIGlmICghaXNQYXRjaCkgcmV0dXJuIDA7CgogICAgLy8gVE9ETyhhaGUpOiByZXN0b3JlIGZpbGUtb2Zmc2V0IG9uY2Ugd2UgdHJhY2sgYm90aCBvcmlnaW4gYW5kIHBhdGNoIGZpbGUKICAgIC8vIFVSSXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzE1NzkKICAgIG9yaWdpbi5jb25zdHJ1Y3Rvci5maWxlVXJpID0gZmlsZVVyaTsKICAgIG9yaWdpbi5jb25zdHJ1Y3Rvci5zdGFydEZpbGVPZmZzZXQgPSBjb25zdHJ1Y3Rvci5zdGFydEZpbGVPZmZzZXQ7CiAgICBvcmlnaW4uY29uc3RydWN0b3IuZmlsZU9mZnNldCA9IGNvbnN0cnVjdG9yLmZpbGVPZmZzZXQ7CiAgICBvcmlnaW4uY29uc3RydWN0b3IuZmlsZUVuZE9mZnNldCA9IGNvbnN0cnVjdG9yLmZpbGVFbmRPZmZzZXQ7CiAgICBvcmlnaW4uY29uc3RydWN0b3IuYW5ub3RhdGlvbnMKICAgICAgICAuZm9yRWFjaCgobSkgPT4gbS5maWxlT2Zmc2V0ID0gY29uc3RydWN0b3IuZmlsZU9mZnNldCk7CgogICAgb3JpZ2luLmNvbnN0cnVjdG9yLmlzRXh0ZXJuYWwgPSBjb25zdHJ1Y3Rvci5pc0V4dGVybmFsOwogICAgb3JpZ2luLmNvbnN0cnVjdG9yLmZ1bmN0aW9uID0gY29uc3RydWN0b3IuZnVuY3Rpb247CiAgICBvcmlnaW4uY29uc3RydWN0b3IuZnVuY3Rpb24ucGFyZW50ID0gb3JpZ2luLmNvbnN0cnVjdG9yOwogICAgb3JpZ2luLmNvbnN0cnVjdG9yLmluaXRpYWxpemVycyA9IGNvbnN0cnVjdG9yLmluaXRpYWxpemVyczsKICAgIHNldFBhcmVudHMob3JpZ2luLmNvbnN0cnVjdG9yLmluaXRpYWxpemVycywgb3JpZ2luLmNvbnN0cnVjdG9yKTsKICAgIHJldHVybiAxOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWNvbWVOYXRpdmUoTG9hZGVyIGxvYWRlcikgewogICAgY29uc3RydWN0b3IuaXNFeHRlcm5hbCA9IHRydWU7CiAgICBzdXBlci5iZWNvbWVOYXRpdmUobG9hZGVyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYXBwbHlQYXRjaChEZWNsYXJhdGlvbiBwYXRjaCkgewogICAgaWYgKHBhdGNoIGlzIENvbnN0cnVjdG9yQnVpbGRlcikgewogICAgICBpZiAoY2hlY2tQYXRjaChwYXRjaCkpIHsKICAgICAgICBwYXRjaC5hY3R1YWxPcmlnaW4gPSB0aGlzOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXBvcnRQYXRjaE1pc21hdGNoKHBhdGNoKTsKICAgIH0KICB9CgogIHZvaWQgcHJlcGFyZUluaXRpYWxpemVycygpIHsKICAgIC8vIEZvciBjb25zdCBjb25zdHJ1Y3RvcnMgd2UgcGFyc2UgaW5pdGlhbGl6ZXJzIGFscmVhZHkgYXQgdGhlIG91dGxpbmluZwogICAgLy8gc3RhZ2UsIHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIG1ha2UgYm9keSBidWlsZGluZyBzdGFnZSBza2lwIGluaXRpYWxpemVyCiAgICAvLyBwYXJzaW5nLCBzbyB3ZSBzaW1wbHkgY2xlYXIgcGFyc2VkIGluaXRpYWxpemVycyBhbmQgcmVidWlsZCB0aGVtCiAgICAvLyBhZ2Fpbi4KICAgIC8vIE5vdGU6IHRoaXMgbWV0aG9kIGNsZWFycyBib3RoIGluaXRpYWxpemVycyBmcm9tIHRoZSB0YXJnZXQgS2VybmVsIG5vZGUKICAgIC8vIGFuZCBpbnRlcm5hbCBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggcGFyc2luZyBpbml0aWFsaXplcnMuCiAgICBpZiAodGFyZ2V0LmlzQ29uc3QpIHsKICAgICAgdGFyZ2V0LmluaXRpYWxpemVycy5sZW5ndGggPSAwOwogICAgICByZWRpcmVjdGluZ0luaXRpYWxpemVyID0gbnVsbDsKICAgICAgc3VwZXJJbml0aWFsaXplciA9IG51bGw7CiAgICAgIGhhc01vdmVkU3VwZXJJbml0aWFsaXplciA9IGZhbHNlOwogICAgfQogIH0KfQoKY2xhc3MgUmVkaXJlY3RpbmdGYWN0b3J5QnVpbGRlciBleHRlbmRzIFByb2NlZHVyZUJ1aWxkZXIgewogIGZpbmFsIENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciByZWRpcmVjdGlvblRhcmdldDsKICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwoKICBSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyKAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFR5cGVCdWlsZGVyIHJldHVyblR5cGUsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscywKICAgICAgS2VybmVsTGlicmFyeUJ1aWxkZXIgY29tcGlsYXRpb25Vbml0LAogICAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBbU3RyaW5nIG5hdGl2ZU1ldGhvZE5hbWUsCiAgICAgIHRoaXMucmVkaXJlY3Rpb25UYXJnZXRdKQogICAgICA6IHN1cGVyKAogICAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgICAgbW9kaWZpZXJzLAogICAgICAgICAgICByZXR1cm5UeXBlLAogICAgICAgICAgICBuYW1lLAogICAgICAgICAgICB0eXBlVmFyaWFibGVzLAogICAgICAgICAgICBmb3JtYWxzLAogICAgICAgICAgICBQcm9jZWR1cmVLaW5kLkZhY3RvcnksCiAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdCwKICAgICAgICAgICAgc3RhcnRDaGFyT2Zmc2V0LAogICAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgICBjaGFyT3BlblBhcmVuT2Zmc2V0LAogICAgICAgICAgICBjaGFyRW5kT2Zmc2V0LAogICAgICAgICAgICBuYXRpdmVNZXRob2ROYW1lKTsKCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IGdldCBib2R5ID0+IGFjdHVhbEJvZHk7CgogIEBvdmVycmlkZQogIHZvaWQgc2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShNZW1iZXIgdGFyZ2V0LCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBpZiAoYWN0dWFsQm9keSAhPSBudWxsKSB7CiAgICAgIHVuZXhwZWN0ZWQoIm51bGwiLCAiJHthY3R1YWxCb2R5LnJ1bnRpbWVUeXBlfSIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgfQoKICAgIC8vIEVuc3VyZSB0aGF0IGNvbnN0YW50IGZhY3RvcmllcyBvbmx5IGhhdmUgY29uc3RhbnQgdGFyZ2V0cy9ib2RpZXMuCiAgICBpZiAoaXNDb25zdCAmJiAhdGFyZ2V0LmlzQ29uc3QpIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2VDb25zdEZhY3RvcnlSZWRpcmVjdGlvblRvTm9uQ29uc3QsIGNoYXJPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICB9CgogICAgYWN0dWFsQm9keSA9IG5ldyBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KHRhcmdldCwgdHlwZUFyZ3VtZW50cyk7CiAgICBmdW5jdGlvbi5ib2R5ID0gYWN0dWFsQm9keTsKICAgIGFjdHVhbEJvZHk/LnBhcmVudCA9IGZ1bmN0aW9uOwogICAgaWYgKGlzUGF0Y2gpIHsKICAgICAgaWYgKGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbiA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBzdWJzdGl0dXRpb25bZnVuY3Rpb24udHlwZVBhcmFtZXRlcnNbaV1dID0KICAgICAgICAgICAgICBuZXcgVHlwZVBhcmFtZXRlclR5cGUoYWN0dWFsT3JpZ2luLmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzW2ldKTsKICAgICAgICB9CiAgICAgICAgTGlzdDxEYXJ0VHlwZT4gbmV3VHlwZUFyZ3VtZW50cyA9CiAgICAgICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPih0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdUeXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBuZXdUeXBlQXJndW1lbnRzW2ldID0gc3Vic3RpdHV0ZSh0eXBlQXJndW1lbnRzW2ldLCBzdWJzdGl0dXRpb24pOwogICAgICAgIH0KICAgICAgICB0eXBlQXJndW1lbnRzID0gbmV3VHlwZUFyZ3VtZW50czsKICAgICAgfQogICAgICBhY3R1YWxPcmlnaW4uc2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keSh0YXJnZXQsIHR5cGVBcmd1bWVudHMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgUHJvY2VkdXJlIGJ1aWxkKFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIFByb2NlZHVyZSByZXN1bHQgPSBzdXBlci5idWlsZChsaWJyYXJ5KTsKICAgIHJlc3VsdC5pc1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yID0gdHJ1ZTsKICAgIGlmIChyZWRpcmVjdGlvblRhcmdldC50eXBlQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgdHlwZUFyZ3Vt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b3J0ICdidWlsZGVyLmRhcnQnIHNob3cgTGlicmFyeUJ1aWxkZXIsIFR5cGVCdWlsZGVyLCBUeXBlVmFyaWFibGVCdWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgTmFtZWRUeXBlLAogICAgICAgIFN1cGVydHlwZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVkZWZUeXBlOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdyBMb2NhdGVkTWVzc2FnZSwgbWVzc2FnZVN1cGVydHlwZUlzRnVuY3Rpb24sIG5vTGVuZ3RoOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuc3VwcG9ydGVkOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyLAogICAgICAgIExpYnJhcnlCdWlsZGVyLAogICAgICAgIFR5cGVCdWlsZGVyLAogICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXI7CgpjbGFzcyBGdW5jdGlvblR5cGVCdWlsZGVyIGV4dGVuZHMgVHlwZUJ1aWxkZXIgewogIGZpbmFsIFR5cGVCdWlsZGVyIHJldHVyblR5cGU7CiAgZmluYWwgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzOwogIGZpbmFsIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFsczsKCiAgRnVuY3Rpb25UeXBlQnVpbGRlcih0aGlzLnJldHVyblR5cGUsIHRoaXMudHlwZVZhcmlhYmxlcywgdGhpcy5mb3JtYWxzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+IG51bGw7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJGdW5jdGlvbiI7CgogIEBvdmVycmlkZQogIFN0cmluZ0J1ZmZlciBwcmludE9uKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKICAgIGlmICh0eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgYnVmZmVyLndyaXRlKCI8Iik7CiAgICAgIGJvb2wgaXNGaXJzdCA9IHRydWU7CiAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB0IGluIHR5cGVWYXJpYWJsZXMpIHsKICAgICAgICBpZiAoIWlzRmlyc3QpIHsKICAgICAgICAgIGJ1ZmZlci53cml0ZSgiLCAiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBidWZmZXIud3JpdGUodC5uYW1lKTsKICAgICAgfQogICAgICBidWZmZXIud3JpdGUoIj4iKTsKICAgIH0KICAgIGJ1ZmZlci53cml0ZSgiKCIpOwogICAgaWYgKGZvcm1hbHMgIT0gbnVsbCkgewogICAgICBib29sIGlzRmlyc3QgPSB0cnVlOwogICAgICBmb3IgKGR5bmFtaWMgdCBpbiBmb3JtYWxzKSB7CiAgICAgICAgaWYgKCFpc0ZpcnN0KSB7CiAgICAgICAgICBidWZmZXIud3JpdGUoIiwgIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgYnVmZmVyLndyaXRlKHQ/LmZ1bGxOYW1lRm9yRXJyb3JzKTsKICAgICAgfQogICAgfQogICAgYnVmZmVyLndyaXRlKCIpIC0+ICIpOwogICAgYnVmZmVyLndyaXRlKHJldHVyblR5cGU/LmZ1bGxOYW1lRm9yRXJyb3JzKTsKICAgIHJldHVybiBidWZmZXI7CiAgfQoKICBGdW5jdGlvblR5cGUgYnVpbGQoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgW1R5cGVkZWZUeXBlIG9yaWdpbl0pIHsKICAgIERhcnRUeXBlIGJ1aWx0UmV0dXJuVHlwZSA9CiAgICAgICAgcmV0dXJuVHlwZT8uYnVpbGQobGlicmFyeSkgPz8gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIExpc3Q8RGFydFR5cGU+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gPERhcnRUeXBlPltdOwogICAgTGlzdDxOYW1lZFR5cGU+IG5hbWVkUGFyYW1ldGVyczsKICAgIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50ID0gMDsKICAgIGlmIChmb3JtYWxzICE9IG51bGwpIHsKICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiBmb3JtYWxzKSB7CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IGZvcm1hbC50eXBlPy5idWlsZChsaWJyYXJ5KSA/PyBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICAgIGlmIChmb3JtYWwuaXNQb3NpdGlvbmFsKSB7CiAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycy5hZGQodHlwZSk7CiAgICAgICAgICBpZiAoZm9ybWFsLmlzUmVxdWlyZWQpIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQrKzsKICAgICAgICB9IGVsc2UgaWYgKGZvcm1hbC5pc05hbWVkKSB7CiAgICAgICAgICBuYW1lZFBhcmFtZXRlcnMgPz89IDxOYW1lZFR5cGU+W107CiAgICAgICAgICBuYW1lZFBhcmFtZXRlcnMuYWRkKG5ldyBOYW1lZFR5cGUoZm9ybWFsLm5hbWUsIHR5cGUpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG5hbWVkUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLnNvcnQoKTsKICAgICAgfQogICAgfQogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKICAgIGlmICh0eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgdHlwZVBhcmFtZXRlcnMgPSA8VHlwZVBhcmFtZXRlcj5bXTsKICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHQgaW4gdHlwZVZhcmlhYmxlcykgewogICAgICAgIHR5cGVQYXJhbWV0ZXJzLmFkZCh0LnBhcmFtZXRlcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCBidWlsdFJldHVyblR5cGUsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZFBhcmFtZXRlcnMgPz8gY29uc3QgPE5hbWVkVHlwZT5bXSwKICAgICAgICB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlcnMgPz8gY29uc3QgPFR5cGVQYXJhbWV0ZXI+W10sCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICB0eXBlZGVmVHlwZTogb3JpZ2luKTsKICB9CgogIFN1cGVydHlwZSBidWlsZFN1cGVydHlwZSgKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKSB7CiAgICBsaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgbWVzc2FnZVN1cGVydHlwZUlzRnVuY3Rpb24sIGNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgU3VwZXJ0eXBlIGJ1aWxkTWl4ZWRJblR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgcmV0dXJuIGJ1aWxkU3VwZXJ0eXBlKGxpYnJhcnksIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYnVpbGRJbnZhbGlkVHlwZShMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRJbnZhbGlkVHlwZSIsIG1lc3NhZ2UuY2hhck9mZnNldCwgbWVzc2FnZS51cmkpOwogIH0KCiAgRnVuY3Rpb25UeXBlQnVpbGRlciBjbG9uZShMaXN0PFR5cGVCdWlsZGVyPiBuZXdUeXBlcykgewogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiBjbG9uZWRUeXBlVmFyaWFibGVzOwogICAgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBjbG9uZWRUeXBlVmFyaWFibGVzID0gbmV3IExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4odHlwZVZhcmlhYmxlcy5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsb25lZFR5cGVWYXJpYWJsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjbG9uZWRUeXBlVmFyaWFibGVzW2ldID0gdHlwZVZhcmlhYmxlc1tpXS5jbG9uZShuZXdUeXBlcyk7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gY2xvbmVkRm9ybWFsczsKICAgIGlmIChmb3JtYWxzICE9IG51bGwpIHsKICAgICAgY2xvbmVkRm9ybWFscyA9IG5ldyBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KGZvcm1hbHMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbG9uZWRGb3JtYWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgPSBmb3JtYWxzW2ldOwogICAgICAgIGNsb25lZEZvcm1hbHNbaV0gPSBmb3JtYWwuY2xvbmUobmV3VHlwZXMpOwogICAgICB9CiAgICB9CiAgICBGdW5jdGlvblR5cGVCdWlsZGVyIG5ld1R5cGUgPSBuZXcgRnVuY3Rpb25UeXBlQnVpbGRlcigKICAgICAgICByZXR1cm5UeXBlPy5jbG9uZShuZXdUeXBlcyksIGNsb25lZFR5cGVWYXJpYWJsZXMsIGNsb25lZEZvcm1hbHMpOwogICAgbmV3VHlwZXMuYWRkKG5ld1R5cGUpOwogICAgcmV0dXJuIG5ld1R5cGU7CiAgfQp9CoCXAE5OPAElAU0BIQkSFRYTExcVAR0/ASwBJwkgGBUdATAgMS4BSgEMGwEMJgEMLiEZGzUYHhEbCh4IGQYXGxsjGB4RGwosCAYbMRMEAUUfOzglJBs3TCMqOyUtQQoIJSAIBighKjUpCAZDQUM4HgQBHD0YRBEEAR49OQQBDE1NBAE6MyFRPUMIBjAbSDc0MwgGO0obFAQCAT5wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9mdW5jdGlvbl90eXBlX2J1aWxkZXIuZGFydEZzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9pbnZhbGlkX3R5cGVfYnVpbGRlci5kYXJ0hYwvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5pbnZhbGlkX3R5cGVfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgRGFydFR5cGUsIEludmFsaWRUeXBlOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IExvY2F0ZWRNZXNzYWdlOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnIHNob3cgVHlwZURlY2xhcmF0aW9uQnVpbGRlcjsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnIHNob3cgVHlwZUJ1aWxkZXIsIExpYnJhcnlCdWlsZGVyOwoKY2xhc3MgSW52YWxpZFR5cGVCdWlsZGVyIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uQnVpbGRlciB7CiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkludmFsaWRUeXBlQnVpbGRlciI7CgogIGZpbmFsIExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2U7CgogIGZpbmFsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQ7CgogIGZpbmFsIGJvb2wgc3VwcHJlc3NNZXNzYWdlOwoKICBJbnZhbGlkVHlwZUJ1aWxkZXIoU3RyaW5nIG5hbWUsIHRoaXMubWVzc2FnZSwKICAgICAge3RoaXMuY29udGV4dCwgdGhpcy5zdXBwcmVzc01lc3NhZ2U6IHRydWV9KQogICAgICA6IHN1cGVyKG51bGwsIDAsIG5hbWUsIG51bGwsIG1lc3NhZ2UuY2hhck9mZnNldCwgbWVzc2FnZS51cmkpOwoKICBAb3ZlcnJpZGUKICBJbnZhbGlkVHlwZSBnZXQgdGFyZ2V0ID0+IGNvbnN0IEludmFsaWRUeXBlKCk7CgogIERhcnRUeXBlIGJ1aWxkVHlwZShMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBMaXN0PFR5cGVCdWlsZGVyPiBhcmd1bWVudHMpIHsKICAgIHJldHVybiBidWlsZFR5cGVzV2l0aEJ1aWx0QXJndW1lbnRzKGxpYnJhcnksIG51bGwpOwogIH0KCiAgLy8vIFtBcmd1bWVudHNdIGhhdmUgYWxyZWFkeSBiZWVuIGJ1aWx0LgogIERhcnRUeXBlIGJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHMoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cykgewogICAgaWYgKCFzdXBwcmVzc01lc3NhZ2UpIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2UubWVzc2FnZU9iamVjdCwgbWVzc2FnZS5jaGFyT2Zmc2V0LAogICAgICAgICAgbWVzc2FnZS5sZW5ndGgsIG1lc3NhZ2UudXJpLAogICAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgSW52YWxpZFR5cGUoKTsKICB9Cn0KLwBOTjwBJAE9ATIBMwFJATowASABJgEeATAyRQEMMQFMOAQBKyk6HEQnHQYgBAIBPXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2ludmFsaWRfdHlwZV9idWlsZGVyLmRhcnRBc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnSf7i8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmxpYnJhcnlfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgTGlicmFyeTsKCmltcG9ydCAnLi4vY29tYmluYXRvci5kYXJ0JyBzaG93IENvbWJpbmF0b3I7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgaW50ZXJuYWxQcm9ibGVtLCB1bnN1cHBvcnRlZDsKCmltcG9ydCAnLi4vZXhwb3J0LmRhcnQnIHNob3cgRXhwb3J0OwoKaW1wb3J0ICcuLi9sb2FkZXIuZGFydCcgc2hvdyBMb2FkZXI7CgppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnCiAgICBzaG93CiAgICAgICAgRm9ybWF0dGVkTWVzc2FnZSwKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICBNZXNzYWdlLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtQ29uc3RydWN0b3JOb3RGb3VuZCwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbU5vdEZvdW5kSW4sCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3M7CgppbXBvcnQgJy4uL3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzc0J1aWxkZXIsCiAgICAgICAgRGVjbGFyYXRpb24sCiAgICAgICAgRmllbGRCdWlsZGVyLAogICAgICAgIE1vZGlmaWVyQnVpbGRlciwKICAgICAgICBOYW1lSXRlcmF0b3IsCiAgICAgICAgUHJlZml4QnVpbGRlciwKICAgICAgICBTY29wZSwKICAgICAgICBTY29wZUJ1aWxkZXIsCiAgICAgICAgVHlwZUJ1aWxkZXI7CgphYnN0cmFjdCBjbGFzcyBMaWJyYXJ5QnVpbGRlciBleHRlbmRzIE1vZGlmaWVyQnVpbGRlciB7CiAgZmluYWwgU2NvcGUgc2NvcGU7CgogIGZpbmFsIFNjb3BlIGV4cG9ydFNjb3BlOwoKICBmaW5hbCBTY29wZUJ1aWxkZXIgc2NvcGVCdWlsZGVyOwoKICBmaW5hbCBTY29wZUJ1aWxkZXIgZXhwb3J0U2NvcGVCdWlsZGVyOwoKICBmaW5hbCBMaXN0PEV4cG9ydD4gZXhwb3J0ZXJzID0gPEV4cG9ydD5bXTsKCiAgTGlicmFyeUJ1aWxkZXIgcGFydE9mTGlicmFyeTsKCiAgYm9vbCBtYXlJbXBsZW1lbnRSZXN0cmljdGVkVHlwZXMgPSBmYWxzZTsKCiAgTGlicmFyeUJ1aWxkZXIoVXJpIGZpbGVVcmksIHRoaXMuc2NvcGUsIHRoaXMuZXhwb3J0U2NvcGUpCiAgICAgIDogc2NvcGVCdWlsZGVyID0gbmV3IFNjb3BlQnVpbGRlcihzY29wZSksCiAgICAgICAgZXhwb3J0U2NvcGVCdWlsZGVyID0gbmV3IFNjb3BlQnVpbGRlcihleHBvcnRTY29wZSksCiAgICAgICAgc3VwZXIobnVsbCwgLTEsIGZpbGVVcmkpOwoKICBib29sIGdldCBsZWdhY3lNb2RlID0+IGZhbHNlOwoKICBib29sIGdldCBpc1N5bnRoZXRpYyA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgRGVjbGFyYXRpb24gZ2V0IHBhcmVudCA9PiBudWxsOwoKICBib29sIGdldCBpc1BhcnQgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJMaWJyYXJ5QnVpbGRlciI7CgogIExvYWRlciBnZXQgbG9hZGVyOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IG1vZGlmaWVycyA9PiAwOwoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5IGdldCB0YXJnZXQ7CgogIFVyaSBnZXQgdXJpOwoKICBJdGVyYXRvcjxEZWNsYXJhdGlvbj4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBMaWJyYXJ5TG9jYWxEZWNsYXJhdGlvbkl0ZXJhdG9yKHRoaXMpOwogIH0KCiAgTmFtZUl0ZXJhdG9yIGdldCBuYW1lSXRlcmF0b3IgewogICAgcmV0dXJuIG5ldyBMaWJyYXJ5TG9jYWxEZWNsYXJhdGlvbk5hbWVJdGVyYXRvcih0aGlzKTsKICB9CgogIERlY2xhcmF0aW9uIGFkZEJ1aWxkZXIoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgY2hhck9mZnNldCk7CgogIHZvaWQgYWRkRXhwb3J0ZXIoCiAgICAgIExpYnJhcnlCdWlsZGVyIGV4cG9ydGVyLCBMaXN0PENvbWJpbmF0b3I+IGNvbWJpbmF0b3JzLCBpbnQgY2hhck9mZnNldCkgewogICAgZXhwb3J0ZXJzLmFkZChuZXcgRXhwb3J0KGV4cG9ydGVyLCB0aGlzLCBjb21iaW5hdG9ycywgY2hhck9mZnNldCkpOwogIH0KCiAgLy8vIEFkZCBhIHByb2JsZW0gd2l0aCBhIHNldmVyaXR5IGRldGVybWluZWQgYnkgdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgogIC8vLwogIC8vLyBJZiBbZmlsZVVyaV0gaXMgbnVsbCwgaXQgZGVmYXVsdHMgdG8gYHRoaXMuZmlsZVVyaWAuCiAgLy8vCiAgLy8vIFNlZSBgTG9hZGVyLmFkZE1lc3NhZ2VgIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUKICAvLy8gYXJndW1lbnRzIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4KICBGb3JtYXR0ZWRNZXNzYWdlIGFkZFByb2JsZW0oCiAgICAgIE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsIFVyaSBmaWxlVXJpLAogICAgICB7Ym9vbCB3YXNIYW5kbGVkOiBmYWxzZSwKICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCwKICAgICAgU2V2ZXJpdHkgc2V2ZXJpdHksCiAgICAgIGJvb2wgcHJvYmxlbU9uTGlicmFyeTogZmFsc2V9KSB7CiAgICBmaWxlVXJpID8/PSB0aGlzLmZpbGVVcmk7CgogICAgcmV0dXJuIGxvYWRlci5hZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwgZmlsZVVyaSwKICAgICAgICB3YXNIYW5kbGVkOiB3YXNIYW5kbGVkLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgc2V2ZXJpdHk6IHNldmVyaXR5LAogICAgICAgIHByb2JsZW1PbkxpYnJhcnk6IHRydWUpOwogIH0KCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXhwb3J0IHNjb3BlIHdhcyBtb2RpZmllZC4KICBib29sIGFkZFRvRXhwb3J0U2NvcGUoU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlciwKICAgICAgW2ludCBjaGFyT2Zmc2V0ID0gLTFdKSB7CiAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJfIikpIHJldHVybiBmYWxzZTsKICAgIGlmIChtZW1iZXIgaXMgUHJlZml4QnVpbGRlcikgcmV0dXJuIGZhbHNlOwogICAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IG1hcCA9CiAgICAgICAgbWVtYmVyLmlzU2V0dGVyID8gZXhwb3J0U2NvcGUuc2V0dGVycyA6IGV4cG9ydFNjb3BlLmxvY2FsOwogICAgRGVjbGFyYXRpb24gZXhpc3RpbmcgPSBtYXBbbmFtZV07CiAgICBpZiAoZXhpc3RpbmcgPT0gbWVtYmVyKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewogICAgICBEZWNsYXJhdGlvbiByZXN1bHQgPSBjb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb24oCiAgICAgICAgICBuYW1lLCBleGlzdGluZywgbWVtYmVyLCBjaGFyT2Zmc2V0LAogICAgICAgICAgaXNFeHBvcnQ6IHRydWUpOwogICAgICBtYXBbbmFtZV0gPSByZXN1bHQ7CiAgICAgIHJldHVybiByZXN1bHQgIT0gZXhpc3Rpbmc7CiAgICB9IGVsc2UgewogICAgICBtYXBbbmFtZV0gPSBtZW1iZXI7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgYWRkVG9TY29wZSgKICAgICAgU3RyaW5nIG5hbWUsIERlY2xhcmF0aW9uIG1lbWJlciwgaW50IGNoYXJPZmZzZXQsIGJvb2wgaXNJbXBvcnQpOwoKICBEZWNsYXJhdGlvbiBjb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb24oCiAgICAgIFN0cmluZyBuYW1lLCBEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgRGVjbGFyYXRpb24gb3RoZXIsIGludCBjaGFyT2Zmc2V0LAogICAgICB7Ym9vbCBpc0V4cG9ydDogZmFsc2UsIGJvb2wgaXNJbXBvcnQ6IGZhbHNlfSk7CgogIGludCBmaW5pc2hEZWZlcnJlZExvYWRUZWFyb2ZmcygpID0+IDA7CgogIGludCBmaW5pc2hGb3J3YXJkZXJzKCkgPT4gMDsKCiAgaW50IGZpbmlzaE5hdGl2ZU1ldGhvZHMoKSA9PiAwOwoKICBpbnQgZmluaXNoUGF0Y2hNZXRob2RzKCkgPT4gMDsKCiAgLy8vIExvb2tzIHVwIFtjb25zdHJ1Y3Rvck5hbWVdIGluIHRoZSBjbGFzcyBuYW1lZCBbY2xhc3NOYW1lXS4KICAvLy8KICAvLy8gVGhlIGNsYXNzIGlzIGxvb2tlZCB1cCBpbiB0aGlzIGxpYnJhcnkncyBleHBvcnQgc2NvcGUgdW5sZXNzCiAgLy8vIFtieXBhc3NMaWJyYXJ5UHJpdmFjeV0gaXMgdHJ1ZSwgaW4gd2hpY2ggY2FzZSBpdCBpcyBsb29rZWQgdXAgaW4gdGhlCiAgLy8vIGxpYnJhcnkgc2NvcGUgb2YgdGhpcyBsaWJyYXJ5LgogIC8vLwogIC8vLyBJdCBpcyBhbiBlcnJvciBpZiBubyBzdWNoIGNsYXNzIGlzIGZvdW5kLCBvciBpZiB0aGUgY2xhc3MgZG9lc24ndCBoYXZlIGEKICAvLy8gbWF0Y2hpbmcgY29uc3RydWN0b3IgKG9yIGZhY3RvcnkpLgogIC8vLwogIC8vLyBJZiBbY29uc3RydWN0b3JOYW1lXSBpcyBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcsIGl0J3MgYXNzdW1lZCB0byBiZSBhbgogIC8vLyB1bm5hbWVkIGNvbnN0cnVjdG9yLiBpdCdzIGFuIGVycm9yIGlmIFtjb25zdHJ1Y3Rvck5hbWVdIHN0YXJ0cyB3aXRoCiAgLy8vIGAiXyJgLCBhbmQgW2J5cGFzc0xpYnJhcnlQcml2YWN5XSBpcyBmYWxzZS4KICBEZWNsYXJhdGlvbiBnZXRDb25zdHJ1Y3RvcihTdHJpbmcgY2xhc3NOYW1lLAogICAgICB7U3RyaW5nIGNvbnN0cnVjdG9yTmFtZSwgYm9vbCBieXBhc3NMaWJyYXJ5UHJpdmFjeTogZmFsc2V9KSB7CiAgICBjb25zdHJ1Y3Rvck5hbWUgPz89ICIiOwogICAgaWYgKGNvbnN0cnVjdG9yTmFtZS5zdGFydHNXaXRoKCJfIikgJiYgIWJ5cGFzc0xpYnJhcnlQcml2YWN5KSB7CiAgICAgIHJldHVybiBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVByaXZhdGVDb25zdHJ1Y3RvckFjY2VzcwogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGNvbnN0cnVjdG9yTmFtZSksCiAgICAgICAgICAtMSwKICAgICAgICAgIG51bGwpOwogICAgfQogICAgRGVjbGFyYXRpb24gY2xzID0gKGJ5cGFzc0xpYnJhcnlQcml2YWN5ID8gc2NvcGUgOiBleHBvcnRTY29wZSkKICAgICAgICAubG9va3VwKGNsYXNzTmFtZSwgLTEsIG51bGwpOwogICAgaWYgKGNscyBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgLy8gVE9ETyhhaGUpOiBUaGlzIGNvZGUgaXMgc2ltaWxhciB0byBjb2RlIGluIGBlbmROZXdFeHByZXNzaW9uYCBpbgogICAgICAvLyBgYm9keV9idWlsZGVyLmRhcnRgLCB0cnkgdG8gc2hhcmUgaXQuCiAgICAgIERlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0KICAgICAgICAgIGNscy5maW5kQ29uc3RydWN0b3JPckZhY3RvcnkoY29uc3RydWN0b3JOYW1lLCAtMSwgbnVsbCwgdGhpcyk7CiAgICAgIGlmIChjb25zdHJ1Y3RvciA9PSBudWxsKSB7CiAgICAgICAgLy8gRmFsbC10aHJvdWdoIHRvIGludGVybmFsIGVycm9yIGJlbG93LgogICAgICB9IGVsc2UgaWYgKGNvbnN0cnVjdG9yLmlzQ29uc3RydWN0b3IpIHsKICAgICAgICBpZiAoIWNscy5pc0Fic3RyYWN0KSB7CiAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3I7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNvbnN0cnVjdG9yLmlzRmFjdG9yeSkgewogICAgICAgIHJldHVybiBjb25zdHJ1Y3RvcjsKICAgICAgfQogICAgfQogICAgdGhyb3cgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtQ29uc3RydWN0b3JOb3RGb3VuZC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAiJGNsYXNzTmFtZS4kY29uc3RydWN0b3JOYW1lIiwgdXJpKSwKICAgICAgICAtMSwKICAgICAgICBudWxsKTsKICB9CgogIGludCBmaW5pc2hUeXBlVmFyaWFibGVzKENsYXNzQnVpbGRlciBvYmplY3QsIFR5cGVCdWlsZGVyIGR5bmFtaWNUeXBlKSA9PiAwOwoKICAvLy8gVGhpcyBtZXRob2QgaW5zdGFudGlhdGVzIHR5cGUgcGFyYW1ldGVycyB0byB0aGVpciBib3VuZHMgaW4gc29tZSBjYXNlcwogIC8vLyB3aGVyZSB0aGV5IHdlcmUgb21pdHRlZCBieSB0aGUgcHJvZ3JhbW1lciBhbmQgbm90IHByb3ZpZGVkIGJ5IHRoZSB0eXBlCiAgLy8vIGluZmVyZW5jZS4gIFRoZSBtZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IHR5cGUgdmFyaWFibGVzCiAgLy8vIHRoYXQgd2VyZSBpbnN0YW50aWF0ZWQgaW4gdGhpcyBsaWJyYXJ5LgogIGludCBjb21wdXRlRGVmYXVsdFR5cGVzKFR5cGVCdWlsZGVyIGR5bmFtaWNUeXBlLCBUeXBlQnVpbGRlciBib3R0b21UeXBlLAogICAgICBDbGFzc0J1aWxkZXIgb2JqZWN0Q2xhc3MpIHsKICAgIHJldHVybiAwOwogIH0KCiAgdm9pZCBiZWNvbWVDb3JlTGlicmFyeSgpIHsKICAgIGlmIChzY29wZS5sb2NhbFsiZHluYW1pYyJdID09IG51bGwpIHsKICAgICAgYWRkU3ludGhldGljRGVjbGFyYXRpb25PZkR5bmFtaWMoKTsKICAgIH0KICB9CgogIHZvaWQgYWRkU3ludGhldGljRGVjbGFyYXRpb25PZkR5bmFtaWMoKTsKCiAgLy8vIERvbid0IHVzZSBmb3Igc2NvcGUgbG9va3VwLiBPbmx5IHVzZSB3aGVuIGFuIGVsZW1lbnQgaXMga25vd24gdG8gZXhpc3QKICAvLy8gKGFuZCBub3QgYSBzZXR0ZXIpLgogIERlY2xhcmF0aW9uIGdldExvY2FsTWVtYmVyKFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gc2NvcGUubG9jYWxbbmFtZV0gPz8KICAgICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbi53aXRoQXJndW1lbnRzKG5hbWUsICIkZmlsZVVyaSIpLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgZmlsZVVyaSk7CiAgfQoKICBEZWNsYXJhdGlvbiBsb29rdXAoU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgcmV0dXJuIHNjb3BlLmxvb2t1cChuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIC8vLyBJZiB0aGlzIGlzIGEgcGF0Y2ggbGlicmFyeSwgYXBwbHkgaXRzIHBhdGNoZXMgdG8gW29yaWdpbl0uCiAgdm9pZCBhcHBseVBhdGNoZXMoKSB7CiAgICBpZiAoIWlzUGF0Y2gpIHJldHVybjsKICAgIHVuc3VwcG9ydGVkKCIke3J1bnRpbWVUeXBlfS5hcHBseVBhdGNoZXMiLCAtMSwgZmlsZVVyaSk7CiAgfQoKICB2b2lkIHJlY29yZEFjY2VzcyhpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwgVXJpIGZpbGVVcmkpIHt9CgogIHZvaWQgYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMoKSB7fQoKICBMaXN0PEZpZWxkQnVpbGRlcj4gdGFrZUltcGxpY2l0bHlUeXBlZEZpZWxkcygpID0+IG51bGw7Cn0KCmNsYXNzIExpYnJhcnlMb2NhbERlY2xhcmF0aW9uSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxEZWNsYXJhdGlvbj4gewogIGZpbmFsIExpYnJhcnlCdWlsZGVyIGxpYnJhcnk7CiAgZmluYWwgSXRlcmF0b3I8RGVjbGFyYXRpb24+IGl0ZXJhdG9yOwoKICBMaWJyYXJ5TG9jYWxEZWNsYXJhdGlvbkl0ZXJhdG9yKHRoaXMubGlicmFyeSkKICAgICAgOiBpdGVyYXRvciA9IGxpYnJhcnkuc2NvcGUuaXRlcmF0b3I7CgogIERlY2xhcmF0aW9uIGdldCBjdXJyZW50ID0+IGl0ZXJhdG9yLmN1cnJlbnQ7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICBpZiAoY3VycmVudC5wYXJlbnQgPT0gbGlicmFyeSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgpjbGFzcyBMaWJyYXJ5TG9jYWxEZWNsYXJhdGlvbk5hbWVJdGVyYXRvciBpbXBsZW1lbnRzIE5hbWVJdGVyYXRvciB7CiAgZmluYWwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeTsKICBmaW5hbCBOYW1lSXRlcmF0b3IgaXRlcmF0b3I7CgogIExpYnJhcnlMb2NhbERlY2xhcmF0aW9uTmFtZUl0ZXJhdG9yKHRoaXMubGlicmFyeSkKICAgICAgOiBpdGVyYXRvciA9IGxpYnJhcnkuc2NvcGUubmFtZUl0ZXJhdG9yOwoKICBEZWNsYXJhdGlvbiBnZXQgY3VycmVudCA9PiBpdGVyYXRvci5jdXJyZW50OwoKICBTdHJpbmcgZ2V0IG5hbWUgPT4gaXRlcmF0b3IubmFtZTsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIGlmIChjdXJyZW50LnBhcmVudCA9PSBsaWJyYXJ5KSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9Cn0KgRoATk48AR8BLwEtAT0BJQElARoJGhgRNCs5ASkBFgkWFRYZFhcPFhUBOBUBGwEjASkBLQEgASwBPDA8IgEgASEBDCIBHAEMLAEVAQwaAQwWAQ8BJzIEASI6BAFQARRPSAQBTwY7BjgnH0AfJBknHgFDIBocIQQBNTkfLC8jQyYqHDguGxohDRoGEQQBE0cBK081ASkBHwEiASEBQQZDSyUGTykGTkoyL0QcRB46Lw4RBkMmH0ovIEkhMS4fHgoqHAgGG0IxDA8EAU4BTU1LLksiDgQBHSoqBgQBKwFNGiwgGU8QFgQBQTQEAUEYGj0EAUABJAE6AgFJICgBMCsBLwEUIjIGEgQCAUQgHwE0LwEvASQBFCIyBhIEAgE4cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnRAc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvbWVtYmVyX2J1aWxkZXIuZGFydIXaLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEubWVtYmVyX2J1aWxkZXI7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcKICAgIHNob3cgQ2xhc3NCdWlsZGVyLCBEZWNsYXJhdGlvbiwgTGlicmFyeUJ1aWxkZXIsIE1vZGlmaWVyQnVpbGRlcjsKCmFic3RyYWN0IGNsYXNzIE1lbWJlckJ1aWxkZXIgZXh0ZW5kcyBNb2RpZmllckJ1aWxkZXIgewogIC8vLyBGb3IgdG9wLWxldmVsIG1lbWJlcnMsIHRoZSBwYXJlbnQgaXMgc2V0IGNvcnJlY3RseSBkdXJpbmcKICAvLy8gY29uc3RydWN0aW9uLiBIb3dldmVyLCBmb3IgY2xhc3MgbWVtYmVycywgdGhlIHBhcmVudCBpcyBpbml0aWFsbHkgdGhlCiAgLy8vIGxpYnJhcnkgYW5kIHVwZGF0ZWQgbGF0ZXIuCiAgRGVjbGFyYXRpb24gcGFyZW50OwoKICBTdHJpbmcgZ2V0IG5hbWU7CgogIE1lbWJlckJ1aWxkZXIodGhpcy5wYXJlbnQsIGludCBjaGFyT2Zmc2V0KSA6IHN1cGVyKHBhcmVudCwgY2hhck9mZnNldCk7CgogIGJvb2wgZ2V0IGlzSW5zdGFuY2VNZW1iZXIgPT4gaXNDbGFzc01lbWJlciAmJiAhaXNTdGF0aWM7CgogIGJvb2wgZ2V0IGlzQ2xhc3NNZW1iZXIgPT4gcGFyZW50IGlzIENsYXNzQnVpbGRlcjsKCiAgYm9vbCBnZXQgaXNUb3BMZXZlbCA9PiAhaXNDbGFzc01lbWJlcjsKCiAgYm9vbCBnZXQgaXNOYXRpdmUgPT4gZmFsc2U7CgogIGJvb2wgZ2V0IGlzUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RydWN0b3IgPT4gZmFsc2U7CgogIExpYnJhcnlCdWlsZGVyIGdldCBsaWJyYXJ5IHsKICAgIGlmIChwYXJlbnQgaXMgTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IHBhcmVudDsKICAgICAgcmV0dXJuIGxpYnJhcnkucGFydE9mTGlicmFyeSA/PyBsaWJyYXJ5OwogICAgfSBlbHNlIHsKICAgICAgQ2xhc3NCdWlsZGVyIGNscyA9IHBhcmVudDsKICAgICAgcmV0dXJuIGNscy5saWJyYXJ5OwogICAgfQogIH0KCiAgdm9pZCBidWlsZE91dGxpbmVFeHByZXNzaW9ucyhMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7fQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzID0+IG5hbWU7CgogIHZvaWQgaW5mZXJUeXBlKCkgPT4gdW5zdXBwb3J0ZWQoImluZmVyVHlwZSIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwoKICB2b2lkIGluZmVyQ29waWVkVHlwZShjb3ZhcmlhbnQgT2JqZWN0IG90aGVyKSB7CiAgICB1bnN1cHBvcnRlZCgiaW5mZXJUeXBlIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQp9CjYATk48AR4BLAEWRQE3QEwhFgETAUoBOwE0ASkBHgE4AR8kJy8NIRoGBAE6AQwoAUUBMTMEAgE3cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbWVtYmVyX2J1aWxkZXIuZGFydEJzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9tZXRhZGF0YV9idWlsZGVyLmRhcnSBMy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLm1ldGFkYXRhX2J1aWxkZXI7CgphYnN0cmFjdCBjbGFzcyBNZXRhZGF0YUJ1aWxkZXIgewogIGludCBnZXQgY2hhck9mZnNldDsKfQoLAE5OPAEgASEWAgE5cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbWV0YWRhdGFfYnVpbGRlci5kYXJ0S3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL21peGluX2FwcGxpY2F0aW9uX2J1aWxkZXIuZGFydIgcLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEubWl4aW5fYXBwbGljYXRpb25fYnVpbGRlcjsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JyBzaG93IExpYnJhcnlCdWlsZGVyLCBUeXBlQnVpbGRlciwgVHlwZVZhcmlhYmxlQnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgSW50ZXJmYWNlVHlwZSwgU3VwZXJ0eXBlOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IExvY2F0ZWRNZXNzYWdlOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuc3VwcG9ydGVkOwoKY2xhc3MgTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIgZXh0ZW5kcyBUeXBlQnVpbGRlciB7CiAgZmluYWwgVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlOwogIGZpbmFsIExpc3Q8VHlwZUJ1aWxkZXI+IG1peGluczsKICBTdXBlcnR5cGUgYnVpbHRUeXBlOwoKICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXM7CgogIE1peGluQXBwbGljYXRpb25CdWlsZGVyKHRoaXMuc3VwZXJ0eXBlLCB0aGlzLm1peGlucyk7CgogIFN0cmluZyBnZXQgbmFtZSA9PiBudWxsOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIiOwoKICBTdHJpbmdCdWZmZXIgcHJpbnRPbihTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAgICBidWZmZXIud3JpdGUoc3VwZXJ0eXBlKTsKICAgIGJ1ZmZlci53cml0ZSgiIHdpdGggIik7CiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGZvciAoVHlwZUJ1aWxkZXIgdCBpbiBtaXhpbnMpIHsKICAgICAgaWYgKCFmaXJzdCkgYnVmZmVyLndyaXRlKCIsICIpOwogICAgICBmaXJzdCA9IGZhbHNlOwogICAgICB0LnByaW50T24oYnVmZmVyKTsKICAgIH0KICAgIHJldHVybiBidWZmZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGJ1aWxkKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIGludCBjaGFyT2Zmc2V0ID0gLTE7IC8vIFRPRE8oYWhlKTogUHJvdmlkZSB0aGVzZS4KICAgIFVyaSBmaWxlVXJpID0gbnVsbDsgLy8gVE9ETyhhaGUpOiBQcm92aWRlIHRoZXNlLgogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJidWlsZCIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3VwZXJ0eXBlIGJ1aWxkU3VwZXJ0eXBlKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRTdXBlcnR5cGUiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIEBvdmVycmlkZQogIFN1cGVydHlwZSBidWlsZE1peGVkSW5UeXBlKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRNaXhlZEluVHlwZSIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYnVpbGRJbnZhbGlkVHlwZShMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRJbnZhbGlkVHlwZSIsIG1lc3NhZ2UuY2hhck9mZnNldCwgbWVzc2FnZS51cmkpOwogIH0KCiAgTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIgY2xvbmUoTGlzdDxUeXBlQnVpbGRlcj4gbmV3VHlwZXMpIHsKICAgIGludCBjaGFyT2Zmc2V0ID0gLTE7IC8vIFRPRE8oZG1pdHJ5YXMpOiBQcm92aWRlIHRoZXNlLgogICAgVXJpIGZpbGVVcmkgPSBudWxsOyAvLyBUT0RPKGRtaXRyeWFzKTogUHJvdmlkZSB0aGVzZS4KICAgIHJldHVybiB1bnN1cHBvcnRlZCgiY2xvbmUiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9Cn0KRwBOTjwBKQFNAUABMgEsATQfIhcBKwE4ARsBNQEuHRwXJCYVGQYTBAEMMDY1NgQBDBw9PwQBDB49QQQBDE1NBAE+Ozo2BAIBQnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL21peGluX2FwcGxpY2F0aW9uX2J1aWxkZXIuZGFydEJzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9tb2RpZmllcl9idWlsZGVyLmRhcnSHxC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLm1vZGlmaWVyX2J1aWxkZXI7CgppbXBvcnQgJy4uL21vZGlmaWVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgYWJzdHJhY3RNYXNrLAogICAgICAgIGNvbnN0TWFzaywKICAgICAgICBjb3ZhcmlhbnRNYXNrLAogICAgICAgIGV4dGVuc2lvbkRlY2xhcmF0aW9uTWFzaywKICAgICAgICBleHRlcm5hbE1hc2ssCiAgICAgICAgZmluYWxNYXNrLAogICAgICAgIGhhc0NvbnN0Q29uc3RydWN0b3JNYXNrLAogICAgICAgIGhhc0luaXRpYWxpemVyTWFzaywKICAgICAgICBpbml0aWFsaXppbmdGb3JtYWxNYXNrLAogICAgICAgIG1peGluRGVjbGFyYXRpb25NYXNrLAogICAgICAgIG5hbWVkTWl4aW5BcHBsaWNhdGlvbk1hc2ssCiAgICAgICAgc3RhdGljTWFzazsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JyBzaG93IERlY2xhcmF0aW9uOwoKYWJzdHJhY3QgY2xhc3MgTW9kaWZpZXJCdWlsZGVyIGV4dGVuZHMgRGVjbGFyYXRpb24gewogIERlY2xhcmF0aW9uIHBhcmVudDsKCiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIGZpbmFsIFVyaSBmaWxlVXJpOwoKICBNb2RpZmllckJ1aWxkZXIodGhpcy5wYXJlbnQsIHRoaXMuY2hhck9mZnNldCwgW1VyaSBmaWxlVXJpXSkKICAgICAgOiBmaWxlVXJpID0gZmlsZVVyaSA/PyBwYXJlbnQ/LmZpbGVVcmk7CgogIGludCBnZXQgbW9kaWZpZXJzOwoKICBib29sIGdldCBpc0Fic3RyYWN0ID0+IChtb2RpZmllcnMgJiBhYnN0cmFjdE1hc2spICE9IDA7CgogIGJvb2wgZ2V0IGlzQ29uc3QgPT4gKG1vZGlmaWVycyAmIGNvbnN0TWFzaykgIT0gMDsKCiAgYm9vbCBnZXQgaXNDb3ZhcmlhbnQgPT4gKG1vZGlmaWVycyAmIGNvdmFyaWFudE1hc2spICE9IDA7CgogIGJvb2wgZ2V0IGlzRXh0ZXJuYWwgPT4gKG1vZGlmaWVycyAmIGV4dGVybmFsTWFzaykgIT0gMDsKCiAgYm9vbCBnZXQgaXNGaW5hbCA9PiAobW9kaWZpZXJzICYgZmluYWxNYXNrKSAhPSAwOwoKICBib29sIGdldCBpc1N0YXRpYyA9PiAobW9kaWZpZXJzICYgc3RhdGljTWFzaykgIT0gMDsKCiAgYm9vbCBnZXQgaXNOYW1lZE1peGluQXBwbGljYXRpb24gewogICAgcmV0dXJuIChtb2RpZmllcnMgJiBuYW1lZE1peGluQXBwbGljYXRpb25NYXNrKSAhPSAwOwogIH0KCiAgYm9vbCBnZXQgaGFzSW5pdGlhbGl6ZXIgPT4gKG1vZGlmaWVycyAmIGhhc0luaXRpYWxpemVyTWFzaykgIT0gMDsKCiAgYm9vbCBnZXQgaXNJbml0aWFsaXppbmdGb3JtYWwgPT4gKG1vZGlmaWVycyAmIGluaXRpYWxpemluZ0Zvcm1hbE1hc2spICE9IDA7CgogIGJvb2wgZ2V0IGhhc0NvbnN0Q29uc3RydWN0b3IgPT4gKG1vZGlmaWVycyAmIGhhc0NvbnN0Q29uc3RydWN0b3JNYXNrKSAhPSAwOwoKICBib29sIGdldCBpc01peGluID0+IChtb2RpZmllcnMgJiBtaXhpbkRlY2xhcmF0aW9uTWFzaykgIT0gMDsKCiAgYm9vbCBnZXQgaXNFeHRlbnNpb24gPT4gKG1vZGlmaWVycyAmIGV4dGVuc2lvbkRlY2xhcmF0aW9uTWFzaykgIT0gMDsKCiAgYm9vbCBnZXQgaXNDbGFzc01lbWJlciA9PiBmYWxzZTsKCiAgU3RyaW5nIGdldCBuYW1lOwoKICBib29sIGdldCBpc05hdGl2ZSA9PiBmYWxzZTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWU7CgogIFN0cmluZ0J1ZmZlciBwcmludE9uKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKICAgIHJldHVybiBidWZmZXIuLndyaXRlKG5hbWUgPz8gZnVsbE5hbWVGb3JFcnJvcnMpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIiRkZWJ1Z05hbWUoJHtwcmludE9uKG5ldyBTdHJpbmdCdWZmZXIoKSl9KSI7Cn0KTQBOTjwBIAEaCRYTFyIWEyEcIB4jFAEoATUWARgBFQE/LgEVAToBNAE8AToBNAE2ASU5BAFEAU4BTgE/AUcBIwETAR4BGAEuNQQBRQIBOXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL21vZGlmaWVyX2J1aWxkZXIuZGFydD9zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9uYW1lX2l0ZXJhdG9yLmRhcnSBdC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLm5hbWVfaXRlcmF0b3I7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcgc2hvdyBEZWNsYXJhdGlvbjsKCmFic3RyYWN0IGNsYXNzIE5hbWVJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPERlY2xhcmF0aW9uPiB7CiAgU3RyaW5nIGdldCBuYW1lOwp9Cg0ATk48AR0BKAE/EwIBNnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL25hbWVfaXRlcmF0b3IuZGFydERzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9uYW1lZF90eXBlX2J1aWxkZXIuZGFydKLXLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEubmFtZWRfdHlwZV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBEYXJ0VHlwZSwgU3VwZXJ0eXBlOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgVGVtcGxhdGUsCiAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgdGVtcGxhdGVNaXNzaW5nRXhwbGljaXRUeXBlQXJndW1lbnRzLAogICAgICAgIG1lc3NhZ2VOb3RBVHlwZUNvbnRleHQsCiAgICAgICAgTG9jYXRlZE1lc3NhZ2UsCiAgICAgICAgdGVtcGxhdGVOb3RBVHlwZSwKICAgICAgICB0ZW1wbGF0ZVR5cGVBcmd1bWVudE1pc21hdGNoLAogICAgICAgIHRlbXBsYXRlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlLAogICAgICAgIHRlbXBsYXRlVHlwZU5vdEZvdW5kOwoKaW1wb3J0ICcuLi9tZXNzYWdlcy5kYXJ0JwogICAgc2hvdyBub0xlbmd0aCwgdGVtcGxhdGVTdXBlcnR5cGVJc0lsbGVnYWwsIHRlbXBsYXRlU3VwZXJ0eXBlSXNUeXBlVmFyaWFibGU7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5oYW5kbGVkOwoKaW1wb3J0ICcuLi9zZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgRGVjbGFyYXRpb24sCiAgICAgICAgSWRlbnRpZmllciwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBQcmVmaXhCdWlsZGVyLAogICAgICAgIFF1YWxpZmllZE5hbWUsCiAgICAgICAgU2NvcGUsCiAgICAgICAgVHlwZUJ1aWxkZXIsCiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyLAogICAgICAgIGZsYXR0ZW5OYW1lOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzc0J1aWxkZXIsCiAgICAgICAgSW52YWxpZFR5cGVCdWlsZGVyLAogICAgICAgIExpYnJhcnlCdWlsZGVyLAogICAgICAgIFR5cGVCdWlsZGVyLAogICAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIsCiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciwKICAgICAgICBmbGF0dGVuTmFtZTsKCmNsYXNzIE5hbWVkVHlwZUJ1aWxkZXIgZXh0ZW5kcyBUeXBlQnVpbGRlciB7CiAgZmluYWwgT2JqZWN0IG5hbWU7CgogIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50czsKCiAgQG92ZXJyaWRlCiAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbjsKCiAgTmFtZWRUeXBlQnVpbGRlcih0aGlzLm5hbWUsIHRoaXMuYXJndW1lbnRzKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBiaW5kKFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb24pIHsKICAgIHRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbj8ub3JpZ2luOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXNvbHZlSW4oCiAgICAgIFNjb3BlIHNjb3BlLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIGlmIChkZWNsYXJhdGlvbiAhPSBudWxsKSByZXR1cm47CiAgICBmaW5hbCBuYW1lID0gdGhpcy5uYW1lOwogICAgRGVjbGFyYXRpb24gbWVtYmVyOwogICAgaWYgKG5hbWUgaXMgUXVhbGlmaWVkTmFtZSkgewogICAgICBPYmplY3QgcXVhbGlmaWVyID0gbmFtZS5xdWFsaWZpZXI7CiAgICAgIFN0cmluZyBwcmVmaXhOYW1lID0gZmxhdHRlbk5hbWUocXVhbGlmaWVyLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgRGVjbGFyYXRpb24gcHJlZml4ID0gc2NvcGUubG9va3VwKHByZWZpeE5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgICBpZiAocHJlZml4IGlzIFByZWZpeEJ1aWxkZXIpIHsKICAgICAgICBtZW1iZXIgPSBwcmVmaXgubG9va3VwKG5hbWUubmFtZSwgbmFtZS5jaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChuYW1lIGlzIFN0cmluZykgewogICAgICBtZW1iZXIgPSBzY29wZS5sb29rdXAobmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9IGVsc2UgewogICAgICB1bmhhbmRsZWQoIiR7bmFtZS5ydW50aW1lVHlwZX0iLCAicmVzb2x2ZUluIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CiAgICBpZiAobWVtYmVyIGlzIFR5cGVWYXJpYWJsZUJ1aWxkZXIpIHsKICAgICAgZGVjbGFyYXRpb24gPSBtZW1iZXIub3JpZ2luOwogICAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICBTdHJpbmcgdHlwZU5hbWU7CiAgICAgICAgaW50IHR5cGVOYW1lT2Zmc2V0OwogICAgICAgIGlmIChuYW1lIGlzIElkZW50aWZpZXIpIHsKICAgICAgICAgIHR5cGVOYW1lID0gbmFtZS5uYW1lOwogICAgICAgICAgdHlwZU5hbWVPZmZzZXQgPSBuYW1lLmNoYXJPZmZzZXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHR5cGVOYW1lID0gbmFtZTsKICAgICAgICAgIHR5cGVOYW1lT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgICAgICB9CiAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0KICAgICAgICAgICAgdGVtcGxhdGVUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGUud2l0aEFyZ3VtZW50cyh0eXBlTmFtZSk7CiAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2UsIHR5cGVOYW1lT2Zmc2V0LCB0eXBlTmFtZS5sZW5ndGgsIGZpbGVVcmkpOwogICAgICAgIGRlY2xhcmF0aW9uID0gYnVpbGRJbnZhbGlkVHlwZSgKICAgICAgICAgICAgbWVzc2FnZS53aXRoTG9jYXRpb24oZmlsZVVyaSwgdHlwZU5hbWVPZmZzZXQsIHR5cGVOYW1lLmxlbmd0aCkpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAobWVtYmVyIGlzIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIpIHsKICAgICAgZGVjbGFyYXRpb24gPSBtZW1iZXIub3JpZ2luOwogICAgICBpZiAoIWRlY2xhcmF0aW9uLmlzRXh0ZW5zaW9uKSB7CiAgICAgICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsICYmIGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXNDb3VudCAhPSAwKSB7CiAgICAgICAgICBTdHJpbmcgdHlwZU5hbWU7CiAgICAgICAgICBpbnQgdHlwZU5hbWVPZmZzZXQ7CiAgICAgICAgICBpZiAobmFtZSBpcyBJZGVudGlmaWVyKSB7CiAgICAgICAgICAgIHR5cGVOYW1lID0gbmFtZS5uYW1lOwogICAgICAgICAgICB0eXBlTmFtZU9mZnNldCA9IG5hbWUuY2hhck9mZnNldDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHR5cGVOYW1lID0gbmFtZTsKICAgICAgICAgICAgdHlwZU5hbWVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogICAgICAgICAgfQogICAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgICAgIHRlbXBsYXRlTWlzc2luZ0V4cGxpY2l0VHlwZUFyZ3VtZW50cwogICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzQ291bnQpLAogICAgICAgICAgICAgIHR5cGVOYW1lT2Zmc2V0LAogICAgICAgICAgICAgIHR5cGVOYW1lLmxlbmd0aCwKICAgICAgICAgICAgICBmaWxlVXJpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGUgPQogICAgICAgIG1lbWJlciA9PSBudWxsID8gdGVtcGxhdGVUeXBlTm90Rm91bmQgOiB0ZW1wbGF0ZU5vdEFUeXBlOwogICAgU3RyaW5nIGZsYXROYW1lID0gZmxhdHRlbk5hbWUobmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0OwogICAgaWYgKG1lbWJlciAhPSBudWxsKSB7CiAgICAgIGNvbnRleHQgPSA8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgIG1lc3NhZ2VOb3RBVHlwZUNvbnRleHQud2l0aExvY2F0aW9uKG1lbWJlci5maWxlVXJpLCBtZW1iZXIuY2hhck9mZnNldCwKICAgICAgICAgICAgbmFtZSBpcyBJZGVudGlmaWVyID8gbmFtZS5uYW1lLmxlbmd0aCA6ICIkbmFtZSIubGVuZ3RoKQogICAgICBdOwogICAgfQogICAgaW50IGxlbmd0aCA9CiAgICAgICAgbmFtZSBpcyBJZGVudGlmaWVyID8gbmFtZS5lbmRDaGFyT2Zmc2V0IC0gY2hhck9mZnNldCA6IGZsYXROYW1lLmxlbmd0aDsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlLndpdGhBcmd1bWVudHMoZmxhdE5hbWUpOwogICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwgZmlsZVVyaSwgY29udGV4dDogY29udGV4dCk7CiAgICBkZWNsYXJhdGlvbiA9IGJ1aWxkSW52YWxpZFR5cGUoCiAgICAgICAgbWVzc2FnZS53aXRoTG9jYXRpb24oZmlsZVVyaSwgY2hhck9mZnNldCwgbGVuZ3RoKSwKICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2hlY2soTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKSB7CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwgJiYKICAgICAgICBhcmd1bWVudHMubGVuZ3RoICE9IGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXNDb3VudCkgewogICAgICBNZXNzYWdlIG1lc3NhZ2UgPSB0ZW1wbGF0ZVR5cGVBcmd1bWVudE1pc21hdGNoCiAgICAgICAgICAud2l0aEFyZ3VtZW50cyhkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzQ291bnQpOwogICAgICBsaWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZSwgY2hhck9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmkpOwogICAgICBkZWNsYXJhdGlvbiA9CiAgICAgICAgICBidWlsZEludmFsaWRUeXBlKG1lc3NhZ2Uud2l0aExvY2F0aW9uKGZpbGVVcmksIGNoYXJPZmZzZXQsIG5vTGVuZ3RoKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG5vcm1hbGl6ZShpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCAmJgogICAgICAgIGFyZ3VtZW50cy5sZW5ndGggIT0gZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlc0NvdW50KSB7CiAgICAgIC8vIFthcmd1bWVudHNdIHdpbGwgYmUgbm9ybWFsaXplZCBsYXRlciBpZiB0aGV5IGFyZSBudWxsLgogICAgICBhcmd1bWVudHMgPSBudWxsOwogICAgfQogIH0KCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIk5hbWVkVHlwZUJ1aWxkZXIiOwoKICBTdHJpbmdCdWZmZXIgcHJpbnRPbihTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAgICBidWZmZXIud3JpdGUobmFtZSk7CiAgICBpZiAoYXJndW1lbnRzPy5pc0VtcHR5ID8/IHRydWUpIHJldHVybiBidWZmZXI7CiAgICBidWZmZXIud3JpdGUoIjwiKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChUeXBlQnVpbGRlciB0IGluIGFyZ3VtZW50cykgewogICAgICBpZiAoIWZpcnN0KSBidWZmZXIud3JpdGUoIiwgIik7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIHQucHJpbnRPbihidWZmZXIpOwogICAgfQogICAgYnVmZmVyLndyaXRlKCI+Iik7CiAgICByZXR1cm4gYnVmZmVyOwogIH0KCiAgSW52YWxpZFR5cGVCdWlsZGVyIGJ1aWxkSW52YWxpZFR5cGUoTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICAvLyBUT0RPKGFoZSk6IENvbnNpZGVyIGlmIGl0IG1ha2VzIHNlbnNlIHRvIHBhc3MgYSBRdWFsaWZpZWROYW1lIHRvCiAgICAvLyBJbnZhbGlkVHlwZUJ1aWxkZXI/CiAgICByZXR1cm4gbmV3IEludmFsaWRUeXBlQnVpbGRlcigKICAgICAgICBmbGF0dGVuTmFtZShuYW1lLCBtZXNzYWdlLmNoYXJPZmZzZXQsIG1lc3NhZ2UudXJpKSwgbWVzc2FnZSwKICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICB9CgogIFN1cGVydHlwZSBoYW5kbGVJbnZhbGlkU3VwZXJ0eXBlKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICAgIHZhciB0ZW1wbGF0ZSA9IGRlY2xhcmF0aW9uLmlzVHlwZVZhcmlhYmxlCiAgICAgICAgPyB0ZW1wbGF0ZVN1cGVydHlwZUlzVHlwZVZhcmlhYmxlCiAgICAgICAgOiB0ZW1wbGF0ZVN1cGVydHlwZUlzSWxsZWdhbDsKICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICB0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKGZsYXR0ZW5OYW1lKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmkpKSwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIGZpbGVVcmkpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBEYXJ0VHlwZSBidWlsZChMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICByZXR1cm4gZGVjbGFyYXRpb24uYnVpbGRUeXBlKGxpYnJhcnksIGFyZ3VtZW50cyk7CiAgfQoKICBTdXBlcnR5cGUgYnVpbGRTdXBlcnR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbiA9IHRoaXMuZGVjbGFyYXRpb247CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbi5idWlsZFN1cGVydHlwZShsaWJyYXJ5LCBhcmd1bWVudHMpOwogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBJbnZhbGlkVHlwZUJ1aWxkZXIpIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgZGVjbGFyYXRpb24ubWVzc2FnZS5tZXNzYWdlT2JqZWN0LAogICAgICAgICAgZGVjbGFyYXRpb24ubWVzc2FnZS5jaGFyT2Zmc2V0LAogICAgICAgICAgZGVjbGFyYXRpb24ubWVzc2FnZS5sZW5ndGgsCiAgICAgICAgICBkZWNsYXJhdGlvbi5tZXNzYWdlLnVyaSwKICAgICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGhhbmRsZUludmFsaWRTdXBlcnR5cGUobGlicmFyeSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CiAgfQoKICBTdXBlcnR5cGUgYnVpbGRNaXhlZEluVHlwZSgKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKSB7CiAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGRlY2xhcmF0aW9uID0gdGhpcy5kZWNsYXJhdGlvbjsKICAgIGlmIChkZWNsYXJhdGlvbiBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uLmJ1aWxkTWl4ZWRJblR5cGUobGlicmFyeSwgYXJndW1lbnRzKTsKICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgSW52YWxpZFR5cGVCdWlsZGVyKSB7CiAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgIGRlY2xhcmF0aW9uLm1lc3NhZ2UubWVzc2FnZU9iamVjdCwKICAgICAgICAgIGRlY2xhcmF0aW9uLm1lc3NhZ2UuY2hhck9mZnNldCwKICAgICAgICAgIGRlY2xhcmF0aW9uLm1lc3NhZ2UubGVuZ3RoLAogICAgICAgICAgZGVjbGFyYXRpb24ubWVzc2FnZS51cmksCiAgICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3IpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBoYW5kbGVJbnZhbGlkU3VwZXJ0eXBlKGxpYnJhcnksIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgfQogIH0KCiAgVHlwZUJ1aWxkZXIgc3Vic3QoTWFwPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIFR5cGVCdWlsZGVyPiBzdWJzdGl0dXRpb24pIHsKICAgIFR5cGVCdWlsZGVyIHJlc3VsdCA9IHN1YnN0aXR1dGlvbltkZWNsYXJhdGlvbl07CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgYXNzZXJ0KGRlY2xhcmF0aW9uIGlzIFR5cGVWYXJpYWJsZUJ1aWxkZXIpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSBlbHNlIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBMaXN0PFR5cGVCdWlsZGVyPiBhcmd1bWVudHM7CiAgICAgIGludCBpID0gMDsKICAgICAgZm9yIChUeXBlQnVpbGRlciBhcmd1bWVudCBpbiB0aGlzLmFyZ3VtZW50cykgewogICAgICAgIFR5cGVCdWlsZGVyIHR5cGUgPSBhcmd1bWVudC5zdWJzdChzdWJzdGl0dXRpb24pOwogICAgICAgIGlmICh0eXBlICE9IGFyZ3VtZW50KSB7CiAgICAgICAgICBhcmd1bWVudHMgPz89IHRoaXMuYXJndW1lbnRzLnRvTGlzdCgpOwogICAgICAgICAgYXJndW1lbnRzW2ldID0gdHlwZTsKICAgICAgICB9CiAgICAgICAgaSsrOwogICAgICB9CiAgICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICAgIHJldHVybiBuZXcgTmFtZWRUeXBlQnVpbGRlcihuYW1lLCBhcmd1bWVudHMpLi5iaW5kKGRlY2xhcmF0aW9uKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBOYW1lZFR5cGVCdWlsZGVyIGNsb25lKExpc3Q8VHlwZUJ1aWxkZXI+IG5ld1R5cGVzKSB7CiAgICBMaXN0PFR5cGVCdWlsZGVyPiBjbG9uZWRBcmd1bWVudHM7CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgY2xvbmVkQXJndW1lbnRzID0gbmV3IExpc3Q8VHlwZUJ1aWxkZXI+KGFyZ3VtZW50cy5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsb25lZEFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIGNsb25lZEFyZ3VtZW50c1tpXSA9IGFyZ3VtZW50c1tpXS5jbG9uZShuZXdUeXBlcyk7CiAgICAgIH0KICAgIH0KICAgIE5hbWVkVHlwZUJ1aWxkZXIgbmV3VHlwZSA9IG5ldyBOYW1lZFR5cGVCdWlsZGVyKG5hbWUsIGNsb25lZEFyZ3VtZW50cyk7CiAgICBuZXdUeXBlcy5hZGQobmV3VHlwZSk7CiAgICByZXR1cm4gbmV3VHlwZTsKICB9Cn0KgRoATk48ASIBOwEdCRESEi4gGBomLR4BGlABKgEpARYJFRQYFxcPFSAdFQEnCRYcGBUgHRUBLRUBHwEMJgEvAQwyLAQBDBJKJRwYISlHSiVFCCE4DUoGKSMfGRwiICwRGycKGklPKE0IDjMjJkgbHiQiLhMdKQweM0IeHxgKEAgGN0I+IhoiT0QJBhFQOFAkOxsEAQxEHT41OkIUUQYEAQwwHT5AGAYEAS4BLhgzFxcnJhUZBhcTBAE+KEgbI0UbBAEkPS4qJhhIFBISEQQBKzYEARw9Oyc9NBotKiYjJRMNQwYEAR49Oyc/NBotKiYjJRMNQwYEAUo0GjIVJCMRNTkgMR8KDQgfSQgGEQQBNycdQTk7CAZMGxQEAgE7cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbmFtZWRfdHlwZV9idWlsZGVyLmRhcnRAc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvcHJlZml4X2J1aWxkZXIuZGFydIUALy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEucHJlZml4X2J1aWxkZXI7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcgc2hvdyBEZWNsYXJhdGlvbiwgTGlicmFyeUJ1aWxkZXIsIFNjb3BlOwoKY2xhc3MgUHJlZml4QnVpbGRlciBleHRlbmRzIERlY2xhcmF0aW9uIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgZmluYWwgU2NvcGUgZXhwb3J0U2NvcGUgPSBuZXcgU2NvcGUudG9wKCk7CgogIGZpbmFsIExpYnJhcnlCdWlsZGVyIHBhcmVudDsKCiAgZmluYWwgYm9vbCBkZWZlcnJlZDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIGZpbmFsIGludCBpbXBvcnRJbmRleDsKCiAgUHJlZml4QnVpbGRlcigKICAgICAgdGhpcy5uYW1lLCB0aGlzLmRlZmVycmVkLCB0aGlzLnBhcmVudCwgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmltcG9ydEluZGV4KTsKCiAgVXJpIGdldCBmaWxlVXJpID0+IHBhcmVudC5maWxlVXJpOwoKICBEZWNsYXJhdGlvbiBsb29rdXAoU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgcmV0dXJuIGV4cG9ydFNjb3BlLmxvb2t1cChuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIHZvaWQgYWRkVG9FeHBvcnRTY29wZShTdHJpbmcgbmFtZSwgRGVjbGFyYXRpb24gbWVtYmVyLCBpbnQgY2hhck9mZnNldCkgewogICAgTWFwPFN0cmluZywgRGVjbGFyYXRpb24+IG1hcCA9CiAgICAgICAgbWVtYmVyLmlzU2V0dGVyID8gZXhwb3J0U2NvcGUuc2V0dGVycyA6IGV4cG9ydFNjb3BlLmxvY2FsOwogICAgRGVjbGFyYXRpb24gZXhpc3RpbmcgPSBtYXBbbmFtZV07CiAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewogICAgICBtYXBbbmFtZV0gPSBwYXJlbnQuY29tcHV0ZUFtYmlndW91c0RlY2xhcmF0aW9uKAogICAgICAgICAgbmFtZSwgZXhpc3RpbmcsIG1lbWJlciwgY2hhck9mZnNldCwKICAgICAgICAgIGlzRXhwb3J0OiB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIG1hcFtuYW1lXSA9IG1lbWJlcjsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgPT4gbmFtZTsKfQoxAE5OPAEeAT8BKhUBLQEfARcBDBgBGQERUQElAUE6BAFLI0MmHDYuGw0aBgQBDCgCATdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9wcmVmaXhfYnVpbGRlci5kYXJ0RHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0mwsvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5mdW5jdGlvbl90eXBlX2FsaWFzX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVkZWYsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnCiAgICBzaG93IEZyZXNoVHlwZVBhcmFtZXRlcnMsIGdldEZyZXNoVHlwZVBhcmFtZXRlcnMsIHN1YnN0aXR1dGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93IG5vTGVuZ3RoLCB0ZW1wbGF0ZUN5Y2xpY1R5cGVkZWYsIHRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2g7CgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIEZ1bmN0aW9uVHlwZUJ1aWxkZXIsCiAgICAgICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciwKICAgICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciwKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBNZXRhZGF0YUJ1aWxkZXIsCiAgICAgICAgVHlwZUJ1aWxkZXIsCiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlcjsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQ7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBMaWJyYXJ5QnVpbGRlciwKICAgICAgICBNZXRhZGF0YUJ1aWxkZXIsCiAgICAgICAgVHlwZUJ1aWxkZXIsCiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciwKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyOwoKY2xhc3MgVHlwZUFsaWFzQnVpbGRlciBleHRlbmRzIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgewogIGZpbmFsIFR5cGVCdWlsZGVyIHR5cGU7CgogIGZpbmFsIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlczsKCiAgZmluYWwgVHlwZWRlZiB0YXJnZXQ7CgogIERhcnRUeXBlIHRoaXNUeXBlOwoKICBUeXBlQWxpYXNCdWlsZGVyKExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwgU3RyaW5nIG5hbWUsCiAgICAgIHRoaXMudHlwZVZhcmlhYmxlcywgdGhpcy50eXBlLCBMaWJyYXJ5QnVpbGRlciBwYXJlbnQsIGludCBjaGFyT2Zmc2V0LAogICAgICBbVHlwZWRlZiB0YXJnZXRdKQogICAgICA6IHRhcmdldCA9IHRhcmdldCA/PwogICAgICAgICAgICAobmV3IFR5cGVkZWYobmFtZSwgbnVsbCwKICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOgogICAgICAgICAgICAgICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIua2VybmVsVHlwZVBhcmFtZXRlcnNGcm9tQnVpbGRlcnMoCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVWYXJpYWJsZXMpLAogICAgICAgICAgICAgICAgZmlsZVVyaTogcGFyZW50LnRhcmdldC5maWxlVXJpKQogICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQpLAogICAgICAgIHN1cGVyKG1ldGFkYXRhLCAwLCBuYW1lLCBwYXJlbnQsIGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiVHlwZUFsaWFzQnVpbGRlciI7CgogIExpYnJhcnlCdWlsZGVyIGdldCBwYXJlbnQgPT4gc3VwZXIucGFyZW50OwoKICBUeXBlZGVmIGJ1aWxkKEtlcm5lbExpYnJhcnlCdWlsZGVyIGxpYnJhcnlCdWlsZGVyKSB7CiAgICB0YXJnZXQuLnR5cGUgPz89IGJ1aWxkVGhpc1R5cGUobGlicmFyeUJ1aWxkZXIpOwoKICAgIFR5cGVCdWlsZGVyIHR5cGUgPSB0aGlzLnR5cGU7CiAgICBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPQogICAgICAgICAgbmV3IExpc3Q8VHlwZVBhcmFtZXRlcj4odHlwZS50eXBlVmFyaWFibGVzPy5sZW5ndGggPz8gMCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyIHR5cGVWYXJpYWJsZSA9IHR5cGUudHlwZVZhcmlhYmxlc1tpXTsKICAgICAgICB0eXBlUGFyYW1ldGVyc1tpXSA9IHR5cGVWYXJpYWJsZS5wYXJhbWV0ZXI7CiAgICAgIH0KICAgICAgRnJlc2hUeXBlUGFyYW1ldGVycyBmcmVzaFR5cGVQYXJhbWV0ZXJzID0KICAgICAgICAgIGdldEZyZXNoVHlwZVBhcmFtZXRlcnModHlwZVBhcmFtZXRlcnMpOwogICAgICB0YXJnZXQudHlwZVBhcmFtZXRlcnNPZkZ1bmN0aW9uVHlwZQogICAgICAgICAgLmFkZEFsbChmcmVzaFR5cGVQYXJhbWV0ZXJzLmZyZXNoVHlwZVBhcmFtZXRlcnMpOwoKICAgICAgaWYgKHR5cGUuZm9ybWFscyAhPSBudWxsKSB7CiAgICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiB0eXBlLmZvcm1hbHMpIHsKICAgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gZm9ybWFsLmJ1aWxkKGxpYnJhcnlCdWlsZGVyLCAwKTsKICAgICAgICAgIHBhcmFtZXRlci50eXBlID0gZnJlc2hUeXBlUGFyYW1ldGVycy5zdWJzdGl0dXRlKHBhcmFtZXRlci50eXBlKTsKICAgICAgICAgIGlmIChmb3JtYWwuaXNOYW1lZCkgewogICAgICAgICAgICB0YXJnZXQubmFtZWRQYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGFyZ2V0LnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlICE9IG51bGwpIHsKICAgICAgdW5oYW5kbGVkKCIke3R5cGUuZnVsbE5hbWVGb3JFcnJvcnN9IiwgImJ1aWxkIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CgogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIERhcnRUeXBlIGJ1aWxkVGhpc1R5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgaWYgKHRoaXNUeXBlICE9IG51bGwpIHsKICAgICAgaWYgKGlkZW50aWNhbCh0aGlzVHlwZSwgY3ljbGljVHlwZUFsaWFzTWFya2VyKSkgewogICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSh0ZW1wbGF0ZUN5Y2xpY1R5cGVkZWYud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgY2hhck9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmkpOwogICAgICAgIHJldHVybiBjb25zdCBJbnZhbGlkVHlwZSgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzVHlwZTsKICAgIH0KICAgIC8vIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGZvciBhbiBhbGlhcyAodHlwZWRlZikgdG8gcmVmZXIgdG8gaXRzZWxmLiBXZQogICAgLy8gZGV0ZWN0IGN5Y2xlcyBieSBkZXRlY3RpbmcgcmVjdXJzaXZlIGNhbGxzIHRvIHRoaXMgbWV0aG9kIHVzaW5nIGFuCiAgICAvLyBpbnN0YW5jZSBvZiBJbnZhbGlkVHlwZSB0aGF0IGlzbid0IGlkZW50aWNhbCB0byBgY29uc3QgSW52YWxpZFR5cGUoKWAuCiAgICB0aGlzVHlwZSA9IGN5Y2xpY1R5cGVBbGlhc01hcmtlcjsKICAgIFR5cGVCdWlsZGVyIHR5cGUgPSB0aGlzLnR5cGU7CiAgICBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICAgIEZ1bmN0aW9uVHlwZSBidWlsdFR5cGUgPSB0eXBlPy5idWlsZChsaWJyYXJ5LCB0YXJnZXQudGhpc1R5cGUpOwogICAgICBpZiAoYnVpbHRUeXBlICE9IG51bGwpIHsKICAgICAgICBpZiAodHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdHYgaW4gdHlwZVZhcmlhYmxlcykgewogICAgICAgICAgICAvLyBGb2xsb3cgYm91bmQgaW4gb3JkZXIgdG8gZmluZCBhbGwgY3ljbGVzCiAgICAgICAgICAgIHR2LmJvdW5kPy5idWlsZChsaWJyYXJ5KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXNUeXBlID0gYnVpbHRUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB0aGlzVHlwZSA9IGNvbnN0IEludmFsaWRUeXBlKCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiB0aGlzVHlwZSA9IGNvbnN0IEludmFsaWRUeXBlKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdW5oYW5kbGVkKAogICAgICAgICAgIiR7dHlwZS5mdWxsTmFtZUZvckVycm9yc30iLCAiYnVpbGRUaGlzVHlwZSIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgfQogIH0KCiAgLy8vIFthcmd1bWVudHNdIGhhdmUgYWxyZWFkeSBiZWVuIGJ1aWx0LgogIERhcnRUeXBlIGJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHMoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cykgewogICAgdmFyIHRoaXNUeXBlID0gYnVpbGRUaGlzVHlwZShsaWJyYXJ5KTsKICAgIGlmIChjb25zdCBEeW5hbWljVHlwZSgpID09IHRoaXNUeXBlKSByZXR1cm4gdGhpc1R5cGU7CiAgICBGdW5jdGlvblR5cGUgcmVzdWx0ID0gdGhpc1R5cGU7CiAgICBpZiAodGFyZ2V0LnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkgJiYgYXJndW1lbnRzID09IG51bGwpIHJldHVybiByZXN1bHQ7CiAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbiA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHN1YnN0aXR1dGlvblt0YXJnZXQudHlwZVBhcmFtZXRlcnNbaV1dID0gYXJndW1lbnRzW2ldOwogICAgfQogICAgcmV0dXJuIHN1YnN0aXR1dGUocmVzdWx0LCBzdWJzdGl0dXRpb24pOwogIH0KCiAgTGlzdDxEYXJ0VHlwZT4gYnVpbGRUeXBlQXJndW1lbnRzKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBMaXN0PFR5cGVCdWlsZGVyPiBhcmd1bWVudHMpIHsKICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCAmJiB0eXBlVmFyaWFibGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIDxEYXJ0VHlwZT5bXTsKICAgIH0KCiAgICBpZiAoYXJndW1lbnRzID09IG51bGwgJiYgdHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIExpc3Q8RGFydFR5cGU+IHJlc3VsdCA9CiAgICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKHR5cGVWYXJpYWJsZXMubGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcmVzdWx0W2ldID0gdHlwZVZhcmlhYmxlc1tpXS5kZWZhdWx0VHlwZS5idWlsZChsaWJyYXJ5KTsKICAgICAgfQogICAgICBpZiAobGlicmFyeSBpcyBLZXJuZWxMaWJyYXJ5QnVpbGRlcikgewogICAgICAgIGxpYnJhcnkuaW5mZXJyZWRUeXBlcy5hZGRBbGwocmVzdWx0KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCAmJiBhcmd1bWVudHMubGVuZ3RoICE9ICh0eXBlVmFyaWFibGVzPy5sZW5ndGggPz8gMCkpIHsKICAgICAgLy8gVGhhdCBzaG91bGQgYmUgY2F1Z2h0IGFuZCByZXBvcnRlZCBhcyBhIGNvbXBpbGUtdGltZSBlcnJvciBlYXJsaWVyLgogICAgICByZXR1cm4gdW5oYW5kbGVkKAogICAgICAgICAgdGVtcGxhdGVUeXBlQXJndW1lbnRNaXNtYXRjaAogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHR5cGVWYXJpYWJsZXMubGVuZ3RoKQogICAgICAgICAgICAgIC5tZXNzYWdlLAogICAgICAgICAgImJ1aWxkVHlwZUFyZ3VtZW50cyIsCiAgICAgICAgICAtMSwKICAgICAgICAgIG51bGwpOwogICAgfQoKICAgIC8vIGFyZ3VtZW50cy5sZW5ndGggPT0gdHlwZVZhcmlhYmxlcy5sZW5ndGgKICAgIExpc3Q8RGFydFR5cGU+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZChhcmd1bWVudHMubGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSBhcmd1bWVudHNbaV0uYnVpbGQobGlicmFyeSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIElmIFthcmd1bWVudHNdIGFyZSBudWxsLCB0aGUgZGVmYXVsdCB0eXBlcyBmb3IgdGhlIHZhcmlhYmxlcyBhcmUgdXNlZC4KICBAb3ZlcnJpZGUKICBpbnQgZ2V0IHR5cGVWYXJpYWJsZXNDb3VudCA9PiB0eXBlVmFyaWFibGVzPy5sZW5ndGggPz8gMDsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgYnVpbGRUeXBlKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50cykgewogICAgdmFyIHRoaXNUeXBlID0gYnVpbGRUaGlzVHlwZShsaWJyYXJ5KTsKICAgIGlmICh0aGlzVHlwZSBpcyBJbnZhbGlkVHlwZSkgcmV0dXJuIHRoaXNUeXBlOwogICAgRnVuY3Rpb25UeXBlIHJlc3VsdCA9IHRoaXNUeXBlOwogICAgaWYgKHRhcmdldC50eXBlUGFyYW1ldGVycy5pc0VtcHR5ICYmIGFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm4gcmVzdWx0OwogICAgLy8gT3RoZXJ3aXNlLCBzdWJzdGl0dXRlLgogICAgcmV0dXJuIGJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHMoCiAgICAgICAgbGlicmFyeSwgYnVpbGRUeXBlQXJndW1lbnRzKGxpYnJhcnksIGFyZ3VtZW50cykpOwogIH0KfQoKZmluYWwgSW52YWxpZFR5cGUgY3ljbGljVHlwZUFsaWFzTWFya2VyID0gbmV3IEludmFsaWRUeXBlKCk7CoDPAE5OPAErASEJEhUWFRcRHQEqQgEdSAEnCR0gHhgZFR0BKgEWCRgZFSAdATgaATEBGAEVAUBMGBslIEooMCo2AS4BLQE3NAEiJytEOEI0CDAyKjwBIj5LSyAzEzgMCggfTAYBEwQBMxw4RiwkCBcGUEpOJiInRh8lOjgmDAolDy8IHy0NGE4GBAErKTorOiRLTT09Bi0EASU9NhsGATYeUTBBCC0uCBUGAVFNGCczGCAOEQYBMBxLLi8GEwQBTQw8AQxMKzIkSx4pOgQCAT0BO3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0PnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfYnVpbGRlci5kYXJ0h08vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS50eXBlX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IERhcnRUeXBlLCBTdXBlcnR5cGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgTG9jYXRlZE1lc3NhZ2U7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcKICAgIHNob3cgTGlicmFyeUJ1aWxkZXIsIFNjb3BlLCBUeXBlRGVjbGFyYXRpb25CdWlsZGVyLCBUeXBlVmFyaWFibGVCdWlsZGVyOwoKYWJzdHJhY3QgY2xhc3MgVHlwZUJ1aWxkZXIgewogIGNvbnN0IFR5cGVCdWlsZGVyKCk7CgogIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZ2V0IGRlY2xhcmF0aW9uID0+IG51bGw7CgogIHZvaWQgcmVzb2x2ZUluKAogICAgICBTY29wZSBzY29wZSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7fQoKICAvLy8gU2VlIGBVbnJlc29sdmVkVHlwZS5jaGVja1R5cGVgLgogIHZvaWQgY2hlY2soTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKSB7fQoKICAvLy8gU2VlIGBVbnJlc29sdmVkVHlwZS5ub3JtYWxpemVUeXBlYC4KICB2b2lkIG5vcm1hbGl6ZShpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHt9CgogIHZvaWQgYmluZChUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGJ1aWxkZXIpIHt9CgogIC8vLyBNYXkgcmV0dXJuIG51bGwsIGZvciBleGFtcGxlLCBmb3IgbWl4aW4gYXBwbGljYXRpb25zLgogIE9iamVjdCBnZXQgbmFtZTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWU7CgogIFN0cmluZ0J1ZmZlciBwcmludE9uKFN0cmluZ0J1ZmZlciBidWZmZXIpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiJGRlYnVnTmFtZSgke3ByaW50T24obmV3IFN0cmluZ0J1ZmZlcigpKX0pIjsKCiAgVHlwZUJ1aWxkZXIgc3Vic3QoTWFwPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIFR5cGVCdWlsZGVyPiBzdWJzdGl0dXRpb24pID0+IHRoaXM7CgogIC8vLyBDbG9uZXMgdGhlIHR5cGUgYnVpbGRlciByZWN1cnNpdmVseSB3aXRob3V0IGJpbmRpbmcgdGhlIHN1YnRlcm1zIHRvCiAgLy8vIGV4aXN0aW5nIGRlY2xhcmF0aW9uIG9yIHR5cGUgdmFyaWFibGUgYnVpbGRlcnMuICBBbGwgbmV3bHkgYnVpbHQgdHlwZXMKICAvLy8gYXJlIGFkZGVkIHRvIFtuZXdUeXBlc10sIHNvIHRoYXQgdGhleSBjYW4gYmUgYWRkZWQgdG8gYSBwcm9wZXIgc2NvcGUgYW5kCiAgLy8vIHJlc29sdmVkIGxhdGVyLgogIFR5cGVCdWlsZGVyIGNsb25lKExpc3Q8VHlwZUJ1aWxkZXI+IG5ld1R5cGVzKTsKCiAgYnVpbGRJbnZhbGlkVHlwZShMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pOwoKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzID0+ICIke3ByaW50T24obmV3IFN0cmluZ0J1ZmZlcigpKX0iOwoKICBEYXJ0VHlwZSBidWlsZChMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KTsKCiAgU3VwZXJ0eXBlIGJ1aWxkU3VwZXJ0eXBlKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSk7CgogIFN1cGVydHlwZSBidWlsZE1peGVkSW5UeXBlKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpOwp9CjsATk48ARwBOwEyARZNAR0XATIBEksBJkUBKjEBLwE8EwEYAS0BRQFRAUpNTxYxAUwBRAEqAVEBHjwCATVwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci90eXBlX2J1aWxkZXIuZGFydEpzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci90eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydIScLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudHlwZV9kZWNsYXJhdGlvbl9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBEYXJ0VHlwZTsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIERlY2xhcmF0aW9uLAogICAgICAgIExpYnJhcnlCdWlsZGVyLAogICAgICAgIE1ldGFkYXRhQnVpbGRlciwKICAgICAgICBNb2RpZmllckJ1aWxkZXIsCiAgICAgICAgVHlwZUJ1aWxkZXI7CgphYnN0cmFjdCBjbGFzcyBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGV4dGVuZHMgTW9kaWZpZXJCdWlsZGVyIHsKICBmaW5hbCBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGE7CgogIGZpbmFsIGludCBtb2RpZmllcnM7CgogIGZpbmFsIFN0cmluZyBuYW1lOwoKICBEZWNsYXJhdGlvbiBwYXJlbnQ7CgogIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIoCiAgICAgIHRoaXMubWV0YWRhdGEsIHRoaXMubW9kaWZpZXJzLCB0aGlzLm5hbWUsIHRoaXMucGFyZW50LCBpbnQgY2hhck9mZnNldCwKICAgICAgW1VyaSBmaWxlVXJpXSkKICAgICAgOiBhc3NlcnQobW9kaWZpZXJzICE9IG51bGwpLAogICAgICAgIHN1cGVyKHBhcmVudCwgY2hhck9mZnNldCwgZmlsZVVyaSk7CgogIGJvb2wgZ2V0IGlzVHlwZURlY2xhcmF0aW9uID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgPT4gbmFtZTsKCiAgaW50IGdldCB0eXBlVmFyaWFibGVzQ291bnQgPT4gMDsKCiAgRGFydFR5cGUgYnVpbGRUeXBlKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50cyk7CgogIC8vLyBbYXJndW1lbnRzXSBoYXZlIGFscmVhZHkgYmVlbiBidWlsdC4KICBEYXJ0VHlwZSBidWlsZFR5cGVzV2l0aEJ1aWx0QXJndW1lbnRzKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMpOwp9Ci4ATk48ASgBMAEWCRUYGRkVAUAoARcBFQEWARpNFSMsASYBDCgBIwFLASspOQIBQXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0R3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0knEvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS50eXBlX3ZhcmlhYmxlX2J1aWxkZXI7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCcgc2hvdyBMaWJyYXJ5QnVpbGRlciwgVHlwZUJ1aWxkZXIsIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdyBEYXJ0VHlwZSwgVHlwZVBhcmFtZXRlciwgVHlwZVBhcmFtZXRlclR5cGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgdGVtcGxhdGVUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGU7CgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIENsYXNzQnVpbGRlciwKICAgICAgICBLZXJuZWxMaWJyYXJ5QnVpbGRlciwKICAgICAgICBOYW1lZFR5cGVCdWlsZGVyLAogICAgICAgIExpYnJhcnlCdWlsZGVyLAogICAgICAgIFR5cGVCdWlsZGVyOwoKY2xhc3MgVHlwZVZhcmlhYmxlQnVpbGRlciBleHRlbmRzIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgewogIFR5cGVCdWlsZGVyIGJvdW5kOwoKICBUeXBlQnVpbGRlciBkZWZhdWx0VHlwZTsKCiAgZmluYWwgVHlwZVBhcmFtZXRlciBhY3R1YWxQYXJhbWV0ZXI7CgogIFR5cGVWYXJpYWJsZUJ1aWxkZXIgYWN0dWFsT3JpZ2luOwoKICBUeXBlVmFyaWFibGVCdWlsZGVyKAogICAgICBTdHJpbmcgbmFtZSwgS2VybmVsTGlicmFyeUJ1aWxkZXIgY29tcGlsYXRpb25Vbml0LCBpbnQgY2hhck9mZnNldCwKICAgICAgW3RoaXMuYm91bmQsIFR5cGVQYXJhbWV0ZXIgYWN0dWFsXSkKICAgICAgLy8gVE9ETygzMjM3OCk6IFdlIHdvdWxkIGxpa2UgdG8gdXNlICc/PycgaGVyZSBpbnN0ZWFkLCBidXQgaW4gY29uanVjdGlvbgogICAgICAvLyB3aXRoICcuLicsIGl0IGNyYXNoZXMgRGFydDJKUy4KICAgICAgOiBhY3R1YWxQYXJhbWV0ZXIgPSBhY3R1YWwgIT0gbnVsbAogICAgICAgICAgICA/IChhY3R1YWwuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0KQogICAgICAgICAgICA6IChuZXcgVHlwZVBhcmFtZXRlcihuYW1lLCBudWxsKS4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQpLAogICAgICAgIHN1cGVyKG51bGwsIDAsIG5hbWUsIGNvbXBpbGF0aW9uVW5pdCwgY2hhck9mZnNldCk7CgogIFR5cGVWYXJpYWJsZUJ1aWxkZXIuZnJvbUtlcm5lbCgKICAgICAgVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIsIExpYnJhcnlCdWlsZGVyIGNvbXBpbGF0aW9uVW5pdCkKICAgICAgOiBhY3R1YWxQYXJhbWV0ZXIgPSBwYXJhbWV0ZXIsCiAgICAgICAgc3VwZXIobnVsbCwgMCwgcGFyYW1ldGVyLm5hbWUsIGNvbXBpbGF0aW9uVW5pdCwgcGFyYW1ldGVyLmZpbGVPZmZzZXQpOwoKICBib29sIGdldCBpc1R5cGVWYXJpYWJsZSA9PiB0cnVlOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiVHlwZVZhcmlhYmxlQnVpbGRlciI7CgogIFN0cmluZ0J1ZmZlciBwcmludE9uKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKICAgIGJ1ZmZlci53cml0ZShuYW1lKTsKICAgIGlmIChib3VuZCAhPSBudWxsKSB7CiAgICAgIGJ1ZmZlci53cml0ZSgiIGV4dGVuZHMgIik7CiAgICAgIGJvdW5kLnByaW50T24oYnVmZmVyKTsKICAgIH0KICAgIHJldHVybiBidWZmZXI7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiJHtwcmludE9uKG5ldyBTdHJpbmdCdWZmZXIoKSl9IjsKCiAgVHlwZVZhcmlhYmxlQnVpbGRlciBnZXQgb3JpZ2luID0+IGFjdHVhbE9yaWdpbiA/PyB0aGlzOwoKICBUeXBlUGFyYW1ldGVyIGdldCBwYXJhbWV0ZXIgPT4gb3JpZ2luLmFjdHVhbFBhcmFtZXRlcjsKCiAgVHlwZVBhcmFtZXRlciBnZXQgdGFyZ2V0ID0+IHBhcmFtZXRlcjsKCiAgRGFydFR5cGUgYnVpbGRUeXBlKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50cykgewogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGludCBjaGFyT2Zmc2V0ID0gLTE7IC8vIFRPRE8oYWhlKTogUHJvdmlkZSB0aGVzZS4KICAgICAgVXJpIGZpbGVVcmkgPSBudWxsOyAvLyBUT0RPKGFoZSk6IFByb3ZpZGUgdGhlc2UuCiAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgbmFtZS5sZW5ndGgsCiAgICAgICAgICBmaWxlVXJpKTsKICAgIH0KICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUocGFyYW1ldGVyKTsKICB9CgogIERhcnRUeXBlIGJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHMoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cykgewogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGludCBjaGFyT2Zmc2V0ID0gLTE7IC8vIFRPRE8oYWhlKTogUHJvdmlkZSB0aGVzZS4KICAgICAgVXJpIGZpbGVVcmkgPSBudWxsOyAvLyBUT0RPKGFoZSk6IFByb3ZpZGUgdGhlc2UuCiAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgbmFtZS5sZW5ndGgsCiAgICAgICAgICBmaWxlVXJpKTsKICAgIH0KICAgIHJldHVybiBidWlsZFR5cGUobGlicmFyeSwgbnVsbCk7CiAgfQoKICBUeXBlQnVpbGRlciBhc1R5cGVCdWlsZGVyKCkgewogICAgcmV0dXJuIG5ldyBOYW1lZFR5cGVCdWlsZGVyKG5hbWUsIG51bGwpLi5iaW5kKHRoaXMpOwogIH0KCiAgdm9pZCBmaW5pc2goCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIENsYXNzQnVpbGRlciBvYmplY3QsIFR5cGVCdWlsZGVyIGR5bmFtaWNUeXBlKSB7CiAgICBpZiAoaXNQYXRjaCkgcmV0dXJuOwogICAgRGFydFR5cGUgb2JqZWN0VHlwZSA9IG9iamVjdC5idWlsZFR5cGUobGlicmFyeSwgbnVsbCk7CiAgICBwYXJhbWV0ZXIuYm91bmQgPz89IGJvdW5kPy5idWlsZChsaWJyYXJ5KSA/PyBvYmplY3RUeXBlOwogICAgLy8gSWYgZGVmYXVsdFR5cGUgaXMgbm90IHNldCwgaW5pdGlhbGl6ZSBpdCB0byBkeW5hbWljLCB1bmxlc3MgdGhlIGJvdW5kIGlzCiAgICAvLyBleHBsaWNpdGx5IHNwZWNpZmllZCBhcyBPYmplY3QsIGluIHdoaWNoIGNhc2UgZGVmYXVsdFR5cGUgc2hvdWxkIGFsc28gYmUKICAgIC8vIE9iamVjdC4gVGhpcyBtYWtlcyBzdXJlIGluc3RhbnRpYXRpb24gb2YgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlcyB3aXRoIGFuCiAgICAvLyBleHBsaWNpdCBPYmplY3QgYm91bmQgcmVzdWx0cyBpbiBPYmplY3QgYXMgdGhlIGluc3RhbnRpYXRlZCB0eXBlLgogICAgcGFyYW1ldGVyLmRlZmF1bHRUeXBlID8/PSBkZWZhdWx0VHlwZT8uYnVpbGQobGlicmFyeSkgPz8KICAgICAgICAoYm91bmQgIT0gbnVsbCAmJiBwYXJhbWV0ZXIuYm91bmQgPT0gb2JqZWN0VHlwZQogICAgICAgICAgICA/IG9iamVjdFR5cGUKICAgICAgICAgICAgOiBkeW5hbWljVHlwZS5idWlsZChsaWJyYXJ5KSk7CiAgfQoKICB2b2lkIGFwcGx5UGF0Y2goY292YXJpYW50IFR5cGVWYXJpYWJsZUJ1aWxkZXIgcGF0Y2gpIHsKICAgIHBhdGNoLmFjdHVhbE9yaWdpbiA9IHRoaXM7CiAgfQoKICBUeXBlVmFyaWFibGVCdWlsZGVyIGNsb25lKExpc3Q8VHlwZUJ1aWxkZXI+IG5ld1R5cGVzKSB7CiAgICAvLyBUT0RPKGRtaXRyeWFzKTogRmlndXJlIG91dCBpZiB1c2luZyBbY2hhck9mZnNldF0gaGVyZSBpcyBhIGdvb2QgaWRlYS4KICAgIC8vIEFuIGFsdGVybmF0aXZlIGlzIHRvIHVzZSB0aGUgb2Zmc2V0IG9mIHRoZSBub2RlIHRoZSBjbG9uZWQgdHlwZSB2YXJpYWJsZQogICAgLy8gaXMgZGVjbGFyZWQgb24uCiAgICByZXR1cm4gbmV3IFR5cGVWYXJpYWJsZUJ1aWxkZXIoCiAgICAgICAgbmFtZSwgcGFyZW50LCBjaGFyT2Zmc2V0LCBib3VuZC5jbG9uZShuZXdUeXBlcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIHJldHVybiBvdGhlciBpcyBUeXBlVmFyaWFibGVCdWlsZGVyICYmIHRhcmdldCA9PSBvdGhlci50YXJnZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRhcmdldC5oYXNoQ29kZTsKCiAgc3RhdGljIExpc3Q8VHlwZVBhcmFtZXRlcj4ga2VybmVsVHlwZVBhcmFtZXRlcnNGcm9tQnVpbGRlcnMoCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gYnVpbGRlcnMpIHsKICAgIGlmIChidWlsZGVycyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gcmVzdWx0ID0KICAgICAgICBuZXcgTGlzdDxUeXBlUGFyYW1ldGVyPi5maWxsZWQoYnVpbGRlcnMubGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1aWxkZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdFtpXSA9IGJ1aWxkZXJzW2ldLnRhcmdldDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CoCRAE5OPAElAVABITUBRwEnCRYeGhgVATsVARsBJwEkARdJKlAoKTBIOwEiPyVPASMBMQEuGBkhHQYTBAE5AToBOQEpAUwdODcaQxYXFAYtBAEpOh04NxpDFhcUBiUEASA5BAEPThk7PVBQT0k9OBkrBAE5HwQBOk1QFyQ6BAEMI0MEAQwnAT8sJyFPMCYGEwQCAT5wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci90eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydEFzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci91bnJlc29sdmVkX3R5cGUuZGFydIP5Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudW5yZXNvbHZlZF90eXBlOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnIHNob3cgTGlicmFyeUJ1aWxkZXIsIFNjb3BlLCBUeXBlQnVpbGRlcjsKCi8vLyBBIHdyYXBwZXIgYXJvdW5kIGEgdHlwZSB0aGF0IGlzIHlldCB0byBiZSByZXNvbHZlZC4KY2xhc3MgVW5yZXNvbHZlZFR5cGUgewogIGZpbmFsIFR5cGVCdWlsZGVyIGJ1aWxkZXI7CiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CiAgZmluYWwgVXJpIGZpbGVVcmk7CgogIFVucmVzb2x2ZWRUeXBlKHRoaXMuYnVpbGRlciwgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmZpbGVVcmkpOwoKICB2b2lkIHJlc29sdmVJbihTY29wZSBzY29wZSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgPT4KICAgICAgYnVpbGRlci5yZXNvbHZlSW4oc2NvcGUsIGNoYXJPZmZzZXQsIGZpbGVVcmksIGxpYnJhcnkpOwoKICAvLy8gUGVyZm9ybXMgY2hlY2tzIG9uIHRoZSB0eXBlIGFmdGVyIGl0J3MgcmVzb2x2ZWQuCiAgdm9pZCBjaGVja1R5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgcmV0dXJuIGJ1aWxkZXIuY2hlY2sobGlicmFyeSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICAvLy8gTm9ybWFsaXplcyB0aGUgdHlwZSBhcmd1bWVudHMgaW4gYWNjb3JkYW5jZSB3aXRoIERhcnQgMSBzZW1hbnRpY3MuCiAgdm9pZCBub3JtYWxpemVUeXBlKCkgPT4gYnVpbGRlci5ub3JtYWxpemUoY2hhck9mZnNldCwgZmlsZVVyaSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJVbnJlc29sdmVkVHlwZShAJGNoYXJPZmZzZXQsICRidWlsZGVyKSI7Cn0KHwBOTjwBHwE/ATgXHRgVAT8BOT4BNys4BAFJQgFBAgE4cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdW5yZXNvbHZlZF90eXBlLmRhcnRDc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvdm9pZF90eXBlX2J1aWxkZXIuZGFydIJaLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudm9pZF90eXBlX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IERhcnRUeXBlOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnIHNob3cgQnVpbHRpblR5cGVCdWlsZGVyLCBMaWJyYXJ5QnVpbGRlcjsKCmNsYXNzIFZvaWRUeXBlQnVpbGRlciBleHRlbmRzIEJ1aWx0aW5UeXBlQnVpbGRlciB7CiAgVm9pZFR5cGVCdWlsZGVyKERhcnRUeXBlIHR5cGUsIExpYnJhcnlCdWlsZGVyIGNvbXBpbGF0aW9uVW5pdCwgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc3VwZXIoInZvaWQiLCB0eXBlLCBjb21waWxhdGlvblVuaXQsIGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiVm9pZFR5cGVCdWlsZGVyIjsKfQoSAE5OPAEhATABPwEzUToBLQIBOnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3ZvaWRfdHlwZV9idWlsZGVyLmRhcnQ5c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci9saXN0ZW5lci5kYXJ0wACwJi8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnBhcnNlci5saXN0ZW5lcjsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdyBNZXNzYWdlLCBNZXNzYWdlQ29kZSwgdGVtcGxhdGVFeHBlcmltZW50Tm90RW5hYmxlZDsKCmltcG9ydCAnLi4vcXVvdGUuZGFydCcgc2hvdyBVbmVzY2FwZUVycm9yTGlzdGVuZXI7CgppbXBvcnQgJy4uL3NjYW5uZXIvZXJyb3JfdG9rZW4uZGFydCcgc2hvdyBFcnJvclRva2VuOwoKaW1wb3J0ICdhc3NlcnQuZGFydCcgc2hvdyBBc3NlcnQ7CgppbXBvcnQgJ2Zvcm1hbF9wYXJhbWV0ZXJfa2luZC5kYXJ0JyBzaG93IEZvcm1hbFBhcmFtZXRlcktpbmQ7CgppbXBvcnQgJ2lkZW50aWZpZXJfY29udGV4dC5kYXJ0JyBzaG93IElkZW50aWZpZXJDb250ZXh0OwoKaW1wb3J0ICdtZW1iZXJfa2luZC5kYXJ0JyBzaG93IE1lbWJlcktpbmQ7CgppbXBvcnQgJ3V0aWwuZGFydCcgc2hvdyBvcHRpb25hbDsKCi8vLyBBIHBhcnNlciBldmVudCBsaXN0ZW5lciB0aGF0IGRvZXMgbm90aGluZyBleGNlcHQgdGhyb3cgZXhjZXB0aW9ucwovLy8gb24gcGFyc2VyIGVycm9ycy4KLy8vCi8vLyBFdmVudHMgYXJlIG1ldGhvZHMgdGhhdCBiZWdpbiB3aXRoIG9uZSBvZjogYGJlZ2luYCwgYGVuZGAsIG9yIGBoYW5kbGVgLgovLy8KLy8vIEV2ZW50cyBzdGFydGluZyB3aXRoIGBiZWdpbmAgYW5kIGBlbmRgIGNvbWUgaW4gcGFpcnMuIE5vcm1hbGx5LCBhCi8vLyBgYmVnaW5Gb29gIGV2ZW50IGlzIGZvbGxvd2VkIGJ5IGFuIGBlbmRGb29gIGV2ZW50LiBUaGVyZSdzIGEgZmV3IGV4Y2VwdGlvbnMKLy8vIGRvY3VtZW50ZWQgYmVsb3cuCi8vLwovLy8gRXZlbnRzIHN0YXJ0aW5nIHdpdGggYGhhbmRsZWAgYXJlIHVzZWQgd2hlbiBpc24ndCBwb3NzaWJsZSB0byBoYXZlIGEgYmVnaW4KLy8vIGV2ZW50LgpjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIFVuZXNjYXBlRXJyb3JMaXN0ZW5lciB7CiAgVXJpIGdldCB1cmkgPT4gbnVsbDsKCiAgdm9pZCBsb2dFdmVudChTdHJpbmcgbmFtZSkge30KCiAgc2V0IHN1cHByZXNzUGFyc2VFcnJvcnMoYm9vbCB2YWx1ZSkge30KCiAgdm9pZCBiZWdpbkFyZ3VtZW50cyhUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkFyZ3VtZW50cyIpOwogIH0KCiAgLy8vIEhhbmRsZSBhc3luYyBtb2RpZmllcnMgYGFzeW5jYCwgYGFzeW5jKmAsIGBzeW5jYC4KICB2b2lkIGhhbmRsZUFzeW5jTW9kaWZpZXIoVG9rZW4gYXN5bmNUb2tlbiwgVG9rZW4gc3RhclRva2VuKSB7CiAgICBsb2dFdmVudCgiQXN5bmNNb2RpZmllciIpOwogIH0KCiAgdm9pZCBiZWdpbkF3YWl0RXhwcmVzc2lvbihUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRBd2FpdEV4cHJlc3Npb24oVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJBd2FpdEV4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgZW5kSW52YWxpZEF3YWl0RXhwcmVzc2lvbigKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4sIE1lc3NhZ2VDb2RlIGVycm9yQ29kZSkgewogICAgbG9nRXZlbnQoIkludmFsaWRBd2FpdEV4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgYmVnaW5CbG9jayhUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRCbG9jayhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiQmxvY2siKTsKICB9CgogIC8vLyBDYWxsZWQgdG8gaGFuZGxlIGEgYmxvY2sgdGhhdCBoYXMgYmVlbiBwYXJzZWQgYnV0IGlzIG5vdCBhc3NvY2lhdGVkCiAgLy8vIHdpdGggYW55IHRvcCBsZXZlbCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4gU3Vic3RydWN0dXJlczoKICAvLy8gLSBibG9jawogIHZvaWQgaGFuZGxlSW52YWxpZFRvcExldmVsQmxvY2soVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgYmVnaW5DYXNjYWRlKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZENhc2NhZGUoKSB7CiAgICBsb2dFdmVudCgiQ2FzY2FkZSIpOwogIH0KCiAgdm9pZCBiZWdpbkNhc2VFeHByZXNzaW9uKFRva2VuIGNhc2VLZXl3b3JkKSB7fQoKICB2b2lkIGVuZENhc2VFeHByZXNzaW9uKFRva2VuIGNvbG9uKSB7CiAgICBsb2dFdmVudCgiQ2FzZUV4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgYmVnaW5DbGFzc09yTWl4aW5Cb2R5KFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgdGhlIGJvZHkgb2YgYSBjbGFzcyBvciBtaXhpbiBkZWNsYXJhdGlvbi4KICAvLy8gVGhlIG9ubHkgc3Vic3RydWN0dXJlcyBhcmUgdGhlIGNsYXNzIG9yIG1peGluIG1lbWJlcnMuCiAgdm9pZCBlbmRDbGFzc09yTWl4aW5Cb2R5KGludCBtZW1iZXJDb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJDbGFzc09yTWl4aW5Cb2R5Iik7CiAgfQoKICAvLy8gQ2FsbGVkIGJlZm9yZSBwYXJzaW5nIGEgY2xhc3Mgb3IgbmFtZWQgbWl4aW4gYXBwbGljYXRpb24uCiAgdm9pZCBiZWdpbkNsYXNzT3JOYW1lZE1peGluQXBwbGljYXRpb24oVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBIYW5kbGUgdGhlIGJlZ2lubmluZyBvZiBhIGNsYXNzIGRlY2xhcmF0aW9uLgogIC8vLyBbYmVnaW5dIG1heSBiZSB0aGUgc2FtZSBhcyBbbmFtZV0sIG9yIG1heSBwb2ludCB0byBtb2RpZmllcnMKICAvLy8gKG9yIGV4dHJhbmVvdXMgbW9kaWZpZXJzIGluIHRoZSBjYXNlIG9mIHJlY292ZXJ5KSBwcmVjZWRpbmcgW25hbWVdLgogIHZvaWQgYmVnaW5DbGFzc0RlY2xhcmF0aW9uKFRva2VuIGJlZ2luLCBUb2tlbiBhYnN0cmFjdFRva2VuLCBUb2tlbiBuYW1lKSB7fQoKICAvLy8gSGFuZGxlIGFuIGV4dGVuZHMgY2xhdXNlIGluIGEgY2xhc3MgZGVjbGFyYXRpb24uIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gc3VwZXJ0eXBlIChtYXkgYmUgYSBtaXhpbiBhcHBsaWNhdGlvbikKICB2b2lkIGhhbmRsZUNsYXNzRXh0ZW5kcyhUb2tlbiBleHRlbmRzS2V5d29yZCkgewogICAgbG9nRXZlbnQoIkNsYXNzRXh0ZW5kcyIpOwogIH0KCiAgLy8vIEhhbmRsZSBhbiBpbXBsZW1lbnRzIGNsYXVzZSBpbiBhIGNsYXNzIG9yIG1peGluIGRlY2xhcmF0aW9uLgogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIGltcGxlbWVudGVkIHR5cGVzCiAgdm9pZCBoYW5kbGVDbGFzc09yTWl4aW5JbXBsZW1lbnRzKAogICAgICBUb2tlbiBpbXBsZW1lbnRzS2V5d29yZCwgaW50IGludGVyZmFjZXNDb3VudCkgewogICAgbG9nRXZlbnQoIkNsYXNzSW1wbGVtZW50cyIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgaGVhZGVyIG9mIGEgY2xhc3MgZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIG1ldGFkYXRhCiAgLy8vIC0gbW9kaWZpZXJzCiAgLy8vIC0gY2xhc3MgbmFtZQogIC8vLyAtIHR5cGUgdmFyaWFibGVzCiAgLy8vIC0gc3VwZXJ0eXBlCiAgLy8vIC0gd2l0aCBjbGF1c2UKICAvLy8gLSBpbXBsZW1lbnRlZCB0eXBlcwogIC8vLyAtIG5hdGl2ZSBjbGF1c2UKICB2b2lkIGhhbmRsZUNsYXNzSGVhZGVyKFRva2VuIGJlZ2luLCBUb2tlbiBjbGFzc0tleXdvcmQsIFRva2VuIG5hdGl2ZVRva2VuKSB7CiAgICBsb2dFdmVudCgiQ2xhc3NIZWFkZXIiKTsKICB9CgogIC8vLyBIYW5kbGUgcmVjb3ZlcnkgYXNzb2NpYXRlZCB3aXRoIGEgY2xhc3MgaGVhZGVyLgogIC8vLyBUaGlzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYWZ0ZXIgW2hhbmRsZUNsYXNzSGVhZGVyXQogIC8vLyB0byByZWNvdmVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmV2aW91cyBjbGFzcyBoZWFkZXIuCiAgLy8vIFRoZSBzdWJzdHJ1Y3R1cmVzIGFyZSBhIHN1YnNldCBvZgogIC8vLyBhbmQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgW2hhbmRsZUNsYXNzSGVhZGVyXToKICAvLy8gLSBzdXBlcnR5cGUKICAvLy8gLSB3aXRoIGNsYXVzZQogIC8vLyAtIGltcGxlbWVudGVkIHR5cGVzCiAgdm9pZCBoYW5kbGVSZWNvdmVyQ2xhc3NIZWFkZXIoKSB7CiAgICBsb2dFdmVudCgiUmVjb3ZlckNsYXNzSGVhZGVyIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBjbGFzcyBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gY2xhc3MgaGVhZGVyCiAgLy8vIC0gY2xhc3MgYm9keQogIHZvaWQgZW5kQ2xhc3NEZWNsYXJhdGlvbihUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkNsYXNzRGVjbGFyYXRpb24iKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGJlZ2lubmluZyBvZiBhIG1peGluIGRlY2xhcmF0aW9uLgogIHZvaWQgYmVnaW5NaXhpbkRlY2xhcmF0aW9uKFRva2VuIG1peGluS2V5d29yZCwgVG9rZW4gbmFtZSkge30KCiAgLy8vIEhhbmRsZSBhbiBvbiBjbGF1c2UgaW4gYSBtaXhpbiBkZWNsYXJhdGlvbi4gU3Vic3RydWN0dXJlczoKICAvLy8gLSBpbXBsZW1lbnRlZCB0eXBlcwogIHZvaWQgaGFuZGxlTWl4aW5PbihUb2tlbiBvbktleXdvcmQsIGludCB0eXBlQ291bnQpIHsKICAgIGxvZ0V2ZW50KCJNaXhpbk9uIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBoZWFkZXIgb2YgYSBtaXhpbiBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSBtaXhpbiBuYW1lCiAgLy8vIC0gdHlwZSB2YXJpYWJsZXMKICAvLy8gLSBvbiB0eXBlcwogIC8vLyAtIGltcGxlbWVudGVkIHR5cGVzCiAgdm9pZCBoYW5kbGVNaXhpbkhlYWRlcihUb2tlbiBtaXhpbktleXdvcmQpIHsKICAgIGxvZ0V2ZW50KCJNaXhpbkhlYWRlciIpOwogIH0KCiAgLy8vIEhhbmRsZSByZWNvdmVyeSBhc3NvY2lhdGVkIHdpdGggYSBtaXhpbiBoZWFkZXIuCiAgLy8vIFRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhZnRlciBbaGFuZGxlTWl4aW5IZWFkZXJdCiAgLy8vIHRvIHJlY292ZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByZXZpb3VzIG1peGluIGhlYWRlci4KICAvLy8gVGhlIHN1YnN0cnVjdHVyZXMgYXJlIGEgc3Vic2V0IG9mCiAgLy8vIGFuZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBbaGFuZGxlTWl4aW5IZWFkZXJdCiAgLy8vIC0gb24gdHlwZXMKICAvLy8gLSBpbXBsZW1lbnRlZCB0eXBlcwogIHZvaWQgaGFuZGxlUmVjb3Zlck1peGluSGVhZGVyKCkgewogICAgbG9nRXZlbnQoIlJlY292ZXJNaXhpbkhlYWRlciIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgbWl4aW4gZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIG1peGluIGhlYWRlcgogIC8vLyAtIGNsYXNzIG9yIG1peGluIGJvZHkKICB2b2lkIGVuZE1peGluRGVjbGFyYXRpb24oVG9rZW4gbWl4aW5LZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIk1peGluRGVjbGFyYXRpb24iKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGJlZ2lubmluZyBvZiBhbiBleHRlbnNpb24gbWV0aG9kcyBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSB0eXBlIHZhcmlhYmxlcwogIHZvaWQgYmVnaW5FeHRlbnNpb25EZWNsYXJhdGlvbihUb2tlbiBleHRlbnNpb25LZXl3b3JkLCBUb2tlbiBuYW1lKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYW4gZXh0ZW5zaW9uIG1ldGhvZHMgZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIHN1YnN0cnVjdHVyZXMgZnJvbSBbYmVnaW5FeHRlbnNpb25EZWNsYXJhdGlvbl0KICAvLy8gLSBvbiB0eXBlCiAgLy8vIC0gYm9keQogIHZvaWQgZW5kRXh0ZW5zaW9uRGVjbGFyYXRpb24oCiAgICAgIFRva2VuIGV4dGVuc2lvbktleXdvcmQsIFRva2VuIG9uS2V5d29yZCwgVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCdFeHRlbnNpb25EZWNsYXJhdGlvbicpOwogIH0KCiAgdm9pZCBiZWdpbkNvbWJpbmF0b3JzKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZENvbWJpbmF0b3JzKGludCBjb3VudCkgewogICAgbG9nRXZlbnQoIkNvbWJpbmF0b3JzIik7CiAgfQoKICB2b2lkIGJlZ2luQ29tcGlsYXRpb25Vbml0KFRva2VuIHRva2VuKSB7fQoKICAvLy8gVGhpcyBtZXRob2QgZXhpc3RzIGZvciBhbmFseXplciBjb21wYXRpYmlsaXR5IG9ubHkKICAvLy8gYW5kIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIGFuYWx5emVyL2Zhc3RhIGludGVncmF0aW9uIGlzIGNvbXBsZXRlLgogIC8vLwogIC8vLyBUaGlzIGlzIGNhbGxlZCB3aGVuIFtwYXJzZURpcmVjdGl2ZXNdIGhhcyBwYXJzZWQgYWxsIGRpcmVjdGl2ZXMKICAvLy8gYW5kIGlzIHNraXBwaW5nIHRoZSByZW1haW5kZXIgb2YgdGhlIGZpbGUuICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIG1ldGFkYXRhCiAgdm9pZCBoYW5kbGVEaXJlY3RpdmVzT25seSgpIHt9CgogIHZvaWQgZW5kQ29tcGlsYXRpb25Vbml0KGludCBjb3VudCwgVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJDb21waWxhdGlvblVuaXQiKTsKICB9CgogIHZvaWQgYmVnaW5Db25zdExpdGVyYWwoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kQ29uc3RMaXRlcmFsKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiQ29uc3RMaXRlcmFsIik7CiAgfQoKICB2b2lkIGJlZ2luQ29uc3RydWN0b3JSZWZlcmVuY2UoVG9rZW4gc3RhcnQpIHt9CgogIHZvaWQgZW5kQ29uc3RydWN0b3JSZWZlcmVuY2UoCiAgICAgIFRva2VuIHN0YXJ0LCBUb2tlbiBwZXJpb2RCZWZvcmVOYW1lLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkNvbnN0cnVjdG9yUmVmZXJlbmNlIik7CiAgfQoKICB2b2lkIGJlZ2luRG9XaGlsZVN0YXRlbWVudChUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmREb1doaWxlU3RhdGVtZW50KAogICAgICBUb2tlbiBkb0tleXdvcmQsIFRva2VuIHdoaWxlS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJEb1doaWxlU3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGJlZ2luRG9XaGlsZVN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kRG9XaGlsZVN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJEb1doaWxlU3RhdGVtZW50Qm9keSIpOwogIH0KCiAgdm9pZCBiZWdpbldoaWxlU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRXaGlsZVN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJXaGlsZVN0YXRlbWVudEJvZHkiKTsKICB9CgogIHZvaWQgYmVnaW5FbnVtKFRva2VuIGVudW1LZXl3b3JkKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYW4gZW51bSBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gTWV0YWRhdGEKICAvLy8gLSBFbnVtIG5hbWUgKGlkZW50aWZpZXIpCiAgLy8vIC0gW2NvdW50XSB0aW1lczoKICAvLy8gICAtIEVudW0gdmFsdWUgKGlkZW50aWZpZXIpCiAgdm9pZCBlbmRFbnVtKFRva2VuIGVudW1LZXl3b3JkLCBUb2tlbiBsZWZ0QnJhY2UsIGludCBjb3VudCkgewogICAgbG9nRXZlbnQoIkVudW0iKTsKICB9CgogIHZvaWQgYmVnaW5FeHBvcnQoVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhbiBleHBvcnQgZGlyZWN0aXZlLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIC8vLyAtIHVyaQogIC8vLyAtIGNvbmRpdGlvbmFsIHVyaXMKICAvLy8gLSBjb21iaW5hdG9ycwogIHZvaWQgZW5kRXhwb3J0KFRva2VuIGV4cG9ydEtleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgbG9nRXZlbnQoIkV4cG9ydCIpOwogIH0KCiAgLy8vIENhbGxlZCBieSBbUGFyc2VyXSBhZnRlciBwYXJzaW5nIGFuIGV4dHJhbmVvdXMgZXhwcmVzc2lvbiBhcyBlcnJvcgogIC8vLyByZWNvdmVyeS4gRm9yIGEgc3RhY2stYmFzZWQgbGlzdGVuZXIsIHRoZSBzdWdnZXN0ZWQgYWN0aW9uIGlzIHRvIGRpc2NhcmQKICAvLy8gYW4gZXhwcmVzc2lvbiBmcm9tIHRoZSBzdGFjay4KICB2b2lkIGhhbmRsZUV4dHJhbmVvdXNFeHByZXNzaW9uKFRva2VuIHRva2VuLCBNZXNzYWdlIG1lc3NhZ2UpIHsKICAgIGxvZ0V2ZW50KCJFeHRyYW5lb3VzRXhwcmVzc2lvbiIpOwogIH0KCiAgdm9pZCBoYW5kbGVFeHByZXNzaW9uU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiRXhwcmVzc2lvblN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbkZhY3RvcnlNZXRob2QoCiAgICAgIFRva2VuIGxhc3RDb25zdW1lZCwgVG9rZW4gZXh0ZXJuYWxUb2tlbiwgVG9rZW4gY29uc3RUb2tlbikge30KCiAgdm9pZCBlbmRGYWN0b3J5TWV0aG9kKAogICAgICBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBmYWN0b3J5S2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJGYWN0b3J5TWV0aG9kIik7CiAgfQoKICB2b2lkIGJlZ2luRm9ybWFsUGFyYW1ldGVyKFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQsIFRva2VuIHJlcXVpcmVkVG9rZW4sCiAgICAgIFRva2VuIGNvdmFyaWFudFRva2VuLCBUb2tlbiB2YXJGaW5hbE9yQ29uc3QpIHt9CgogIHZvaWQgZW5kRm9ybWFsUGFyYW1ldGVyKAogICAgICBUb2tlbiB0aGlzS2V5d29yZCwKICAgICAgVG9rZW4gcGVyaW9kQWZ0ZXJUaGlzLAogICAgICBUb2tlbiBuYW1lVG9rZW4sCiAgICAgIFRva2VuIGluaXRpYWxpemVyU3RhcnQsCiAgICAgIFRva2VuIGluaXRpYWxpemVyRW5kLAogICAgICBGb3JtYWxQYXJhbWV0ZXJLaW5kIGtpbmQsCiAgICAgIE1lbWJlcktpbmQgbWVtYmVyS2luZCkgewogICAgbG9nRXZlbnQoIkZvcm1hbFBhcmFtZXRlciIpOwogIH0KCiAgdm9pZCBoYW5kbGVOb0Zvcm1hbFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgbG9nRXZlbnQoIk5vRm9ybWFsUGFyYW1ldGVycyIpOwogIH0KCiAgdm9pZCBiZWdpbkZvcm1hbFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkge30KCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXJzKAogICAgICBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIGxvZ0V2ZW50KCJGb3JtYWxQYXJhbWV0ZXJzIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBmaWVsZCBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gTWV0YWRhdGEKICAvLy8gLSBNb2RpZmllcnMKICAvLy8gLSBUeXBlCiAgLy8vIC0gVmFyaWFibGUgZGVjbGFyYXRpb25zIChjb3VudCB0aW1lcykKICAvLy8KICAvLy8gRG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBiZWdpbiBldmVudCwgdXNlIFtiZWdpbk1lbWJlcl0gaW5zdGVhZC4KICB2b2lkIGVuZEZpZWxkcyhUb2tlbiBzdGF0aWNUb2tlbiwgVG9rZW4gY292YXJpYW50VG9rZW4sIFRva2VuIGxhdGVUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiRmllbGRzIik7CiAgfQoKICAvLy8gTWFya3MgdGhhdCB0aGUgZ3JhbW1hciB0ZXJtIGBmb3JJbml0aWFsaXplclN0YXRlbWVudGAgaGFzIGJlZW4gcGFyc2VkIGFuZAogIC8vLyBpdCB3YXMgYW4gZW1wdHkgc3RhdGVtZW50LgogIHZvaWQgaGFuZGxlRm9ySW5pdGlhbGl6ZXJFbXB0eVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZvckluaXRpYWxpemVyRW1wdHlTdGF0ZW1lbnQiKTsKICB9CgogIC8vLyBNYXJrcyB0aGF0IHRoZSBncmFtbWFyIHRlcm0gYGZvckluaXRpYWxpemVyU3RhdGVtZW50YCBoYXMgYmVlbiBwYXJzZWQgYW5kCiAgLy8vIGl0IHdhcyBhbiBleHByZXNzaW9uIHN0YXRlbWVudC4KICB2b2lkIGhhbmRsZUZvckluaXRpYWxpemVyRXhwcmVzc2lvblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZvckluaXRpYWxpemVyRXhwcmVzc2lvblN0YXRlbWVudCIpOwogIH0KCiAgLy8vIE1hcmtzIHRoYXQgdGhlIGdyYW1tYXIgdGVybSBgZm9ySW5pdGlhbGl6ZXJTdGF0ZW1lbnRgIGhhcyBiZWVuIHBhcnNlZCBhbmQKICAvLy8gaXQgd2FzIGEgYGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbmAuCiAgdm9pZCBoYW5kbGVGb3JJbml0aWFsaXplckxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZvckluaXRpYWxpemVyTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIik7CiAgfQoKICAvLy8gTWFya3MgdGhlIHN0YXJ0IG9mIGEgZm9yIHN0YXRlbWVudCB3aGljaCBpcyBlbmRlZCBieSBlaXRoZXIKICAvLy8gW2VuZEZvclN0YXRlbWVudF0gb3IgW2VuZEZvckluXS4KICB2b2lkIGJlZ2luRm9yU3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICAvLy8gTWFya3MgdGhlIGVuZCBvZiBwYXJzaW5nIHRoZSBjb250cm9sIHN0cnVjdHVyZSBvZiBhIGZvciBzdGF0ZW1lbnQKICAvLy8gb3IgZm9yIGNvbnRyb2wgZmxvdyBlbnRyeSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzLgogIC8vLyBgZm9yYCBgKGAgaW5pdGlhbGl6YXRpb24gYDtgIGNvbmRpdGlvbiBgO2AgdXBkYXRlcnMgYClgCiAgdm9pZCBoYW5kbGVGb3JMb29wUGFydHMoVG9rZW4gZm9yS2V5d29yZCwgVG9rZW4gbGVmdFBhcmVuLAogICAgICBUb2tlbiBsZWZ0U2VwYXJhdG9yLCBpbnQgdXBkYXRlRXhwcmVzc2lvbkNvdW50KSB7fQoKICB2b2lkIGVuZEZvclN0YXRlbWVudChUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkZvclN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbkZvclN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kRm9yU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZvclN0YXRlbWVudEJvZHkiKTsKICB9CgogIC8vLyBNYXJrcyB0aGUgZW5kIG9mIHBhcnNpbmcgdGhlIGNvbnRyb2wgc3RydWN0dXJlIG9mIGEgZm9yLWluIHN0YXRlbWVudAogIC8vLyBvciBmb3IgY29udHJvbCBmbG93IGVudHJ5IHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMuCiAgLy8vIGBmb3JgIGAoYCAodHlwZSk/IGlkZW50aWZpZXIgYGluYCBpdGVyYXRvciBgKWAKICB2b2lkIGhhbmRsZUZvckluTG9vcFBhcnRzKFRva2VuIGF3YWl0VG9rZW4sIFRva2VuIGZvclRva2VuLAogICAgICBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsIFRva2VuIGluS2V5d29yZCkge30KCiAgLy8gT25lIG9mIHRoZSB0d28gcG9zc2libGUgY29ycmVzcG9uZGluZyBlbmQgZXZlbnRzIGZvciBbYmVnaW5Gb3JTdGF0ZW1lbnRdLgogIHZvaWQgZW5kRm9ySW4oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJGb3JJbiIpOwogIH0KCiAgdm9pZCBiZWdpbkZvckluRXhwcmVzc2lvbihUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRGb3JJbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJGb3JJbkV4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgYmVnaW5Gb3JJbkJvZHkoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kRm9ySW5Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiRm9ySW5Cb2R5Iik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBiZWdpbm5pbmcgb2YgYSBuYW1lZCBmdW5jdGlvbiBleHByZXNzaW9uIHdoaWNoIGlzbid0IGxlZ2FsCiAgLy8vIHN5bnRheCBpbiBEYXJ0LiAgVXNlZnVsIGZvciByZWNvdmVyaW5nIGZyb20gSmF2YXNjcmlwdCBjb2RlIGJlaW5nIHBhc3RlZAogIC8vLyBpbnRvIGEgRGFydCBwcm9yYW0sIGFzIGl0IHdpbGwgaW50ZXJwcmV0IGBmdW5jdGlvbiBmb28oKSB7fWAgYXMgYSBuYW1lZAogIC8vLyBmdW5jdGlvbiBleHByZXNzaW9uIHdpdGggcmV0dXJuIHR5cGUgYGZ1bmN0aW9uYCBhbmQgbmFtZSBgZm9vYC4KICAvLy8KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBUeXBlIHZhcmlhYmxlcwogIHZvaWQgYmVnaW5OYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbihUb2tlbiB0b2tlbikge30KCiAgLy8vIEEgbmFtZWQgZnVuY3Rpb24gZXhwcmVzc2lvbiB3aGljaCBpc24ndCBsZWdhbCBzeW50YXggaW4gRGFydC4KICAvLy8gVXNlZnVsIGZvciByZWNvdmVyaW5nIGZyb20gSmF2YXNjcmlwdCBjb2RlIGJlaW5nIHBhc3RlZCBpbnRvIGEgRGFydAogIC8vLyBwcm9yYW0sIGFzIGl0IHdpbGwgaW50ZXJwcmV0IGBmdW5jdGlvbiBmb28oKSB7fWAgYXMgYSBuYW1lZCBmdW5jdGlvbgogIC8vLyBleHByZXNzaW9uIHdpdGggcmV0dXJuIHR5cGUgYGZ1bmN0aW9uYCBhbmQgbmFtZSBgZm9vYC4KICAvLy8KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBUeXBlIHZhcmlhYmxlcwogIC8vLyAtIE1vZGlmaWVycwogIC8vLyAtIFJldHVybiB0eXBlCiAgLy8vIC0gTmFtZQogIC8vLyAtIEZvcm1hbHMKICAvLy8gLSBJbml0aWFsaXplcnMKICAvLy8gLSBBc3luYyBtb2RpZmllcgogIC8vLyAtIEZ1bmN0aW9uIGJvZHkgKGJsb2NrIG9yIGFycm93IGV4cHJlc3Npb24pLgogIHZvaWQgZW5kTmFtZWRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbiIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgYmVnaW5uaW5nIG9mIGEgbG9jYWwgZnVuY3Rpb24gZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIE1ldGFkYXRhCiAgLy8vIC0gVHlwZSB2YXJpYWJsZXMKICB2b2lkIGJlZ2luTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uKFRva2VuIHRva2VuKSB7fQoKICAvLy8gQSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KICAvLy8KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBNZXRhZGF0YQogIC8vLyAtIFR5cGUgdmFyaWFibGVzCiAgLy8vIC0gUmV0dXJuIHR5cGUKICAvLy8gLSBOYW1lCiAgLy8vIC0gVHlwZSB2YXJpYWJsZXMKICAvLy8gLSBGb3JtYWxzCiAgLy8vIC0gSW5pdGlhbGl6ZXJzCiAgLy8vIC0gQXN5bmMgbW9kaWZpZXIKICAvLy8gLSBGdW5jdGlvbiBib2R5IChibG9jayBvciBhcnJvdyBleHByZXNzaW9uKS4KICB2b2lkIGVuZExvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbihUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkZ1bmN0aW9uRGVjbGFyYXRpb24iKTsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gdGhlIHBhcnNlciBzZWVzIHRoYXQgYSBmdW5jdGlvbiBoYXMgYQogIC8vLyBibG9jayBmdW5jdGlvbiBib2R5LiAgVGhpcyBtZXRob2QgaXMgbm90IGludm9rZWQgZm9yIGVtcHR5IG9yIGV4cHJlc3Npb24KICAvLy8gZnVuY3Rpb24gYm9kaWVzLCBzZWUgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBbaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHldCiAgLy8vIGFuZCBbaGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keV0uCiAgdm9pZCBiZWdpbkJsb2NrRnVuY3Rpb25Cb2R5KFRva2VuIHRva2VuKSB7fQoKICAvLy8gVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgcGFyc2VyIGFmdGVyIGl0IGZpbmlzaGVkIHBhcnNpbmcgYSBibG9jawogIC8vLyBmdW5jdGlvbiBib2R5LiAgVGhpcyBtZXRob2QgaXMgbm90IGludm9rZWQgZm9yIGVtcHR5IG9yIGV4cHJlc3Npb24KICAvLy8gZnVuY3Rpb24gYm9kaWVzLCBzZWUgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBbaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHldCiAgLy8vIGFuZCBbaGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keV0uICBUaGUgW2JlZ2luVG9rZW5dIGlzIHRoZSAneycgdG9rZW4sCiAgLy8vIGFuZCB0aGUgW2VuZFRva2VuXSBpcyB0aGUgJ30nIHRva2VuIG9mIHRoZSBibG9jay4gIFRoZSBudW1iZXIgb2YKICAvLy8gc3RhdGVtZW50cyBpcyBnaXZlbiBhcyB0aGUgW2NvdW50XSBwYXJhbWV0ZXIuCiAgdm9pZCBlbmRCbG9ja0Z1bmN0aW9uQm9keShpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiQmxvY2tGdW5jdGlvbkJvZHkiKTsKICB9CgogIHZvaWQgaGFuZGxlTm9GdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJOb0Z1bmN0aW9uQm9keSIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gYm9keSB0aGF0IHdhcyBza2lwcGVkIGJ5IHRoZSBwYXJzZXIuCiAgLy8vCiAgLy8vIFRoZSBib29sZWFuIFtpc0V4cHJlc3Npb25Cb2R5XSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZnVuY3Rpb24gYm9keSB0aGF0CiAgLy8vIHdhcyBza2lwcGVkIHVzZWQgIj0+IiBzeW50YXguCiAgdm9pZCBoYW5kbGVGdW5jdGlvbkJvZHlTa2lwcGVkKFRva2VuIHRva2VuLCBib29sIGlzRXhwcmVzc2lvbkJvZHkpIHt9CgogIHZvaWQgYmVnaW5GdW5jdGlvbk5hbWUoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kRnVuY3Rpb25OYW1lKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiRnVuY3Rpb25OYW1lIik7CiAgfQoKICB2b2lkIGJlZ2luRnVuY3Rpb25UeXBlQWxpYXMoVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIHR5cGVkZWYgZGVjbGFyYXRpb24uCiAgLy8vCiAgLy8vIElmIFtlcXVhbHNdIGlzIG51bGwsIHRoZW4gd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gTWV0YWRhdGEKICAvLy8gLSBSZXR1cm4gdHlwZQogIC8vLyAtIE5hbWUgKGlkZW50aWZpZXIpCiAgLy8vIC0gQWxpYXMgdHlwZSB2YXJpYWJsZXMKICAvLy8gLSBGb3JtYWwgcGFyYW1ldGVycwogIC8vLwogIC8vLyBJZiBbZXF1YWxzXSBpcyBub3QgbnVsbCwgdGhlbiB0aGUgaGF2ZSB0aGUgZm9sbG93aW5nIHN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gTWV0YWRhdGEKICAvLy8gLSBOYW1lIChpZGVudGlmaWVyKQogIC8vLyAtIEFsaWFzIHR5cGUgdmFyaWFibGVzCiAgLy8vIC0gVHlwZSAoRnVuY3Rpb25UeXBlQW5ub3RhdGlvbikKICB2b2lkIGVuZEZ1bmN0aW9uVHlwZUFsaWFzKAogICAgICBUb2tlbiB0eXBlZGVmS2V5d29yZCwgVG9rZW4gZXF1YWxzLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkZ1bmN0aW9uVHlwZUFsaWFzIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSB3aXRoIGNsYXVzZSAoZS5nLiAid2l0aCBCLCBDIikuCiAgLy8vIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWl4aW4gdHlwZXMgKFR5cGVMaXN0KQogIHZvaWQgaGFuZGxlQ2xhc3NXaXRoQ2xhdXNlKFRva2VuIHdpdGhLZXl3b3JkKSB7CiAgICBsb2dFdmVudCgiQ2xhc3NXaXRoQ2xhdXNlIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBhYnNlbmNlIG9mIGEgd2l0aCBjbGF1c2UuCiAgdm9pZCBoYW5kbGVDbGFzc05vV2l0aENsYXVzZSgpIHsKICAgIGxvZ0V2ZW50KCJDbGFzc05vV2l0aENsYXVzZSIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgYmVnaW5uaW5nIG9mIGEgbmFtZWQgbWl4aW4gYXBwbGljYXRpb24uCiAgLy8vIFtiZWdpblRva2VuXSBtYXkgYmUgdGhlIHNhbWUgYXMgW25hbWVdLCBvciBtYXkgcG9pbnQgdG8gbW9kaWZpZXJzCiAgLy8vIChvciBleHRyYW5lb3VzIG1vZGlmaWVycyBpbiB0aGUgY2FzZSBvZiByZWNvdmVyeSkgcHJlY2VkaW5nIFtuYW1lXS4KICB2b2lkIGJlZ2luTmFtZWRNaXhpbkFwcGxpY2F0aW9uKAogICAgICBUb2tlbiBiZWdpbiwgVG9rZW4gYWJzdHJhY3RUb2tlbiwgVG9rZW4gbmFtZSkge30KCiAgLy8vIEhhbmRsZSBhIG5hbWVkIG1peGluIGFwcGxpY2F0aW9uIHdpdGggY2xhdXNlIChlLmcuICJBIHdpdGggQiwgQyIpLgogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIHN1cGVydHlwZQogIC8vLyAtIG1peGluIHR5cGVzIChUeXBlTGlzdCkKICB2b2lkIGhhbmRsZU5hbWVkTWl4aW5BcHBsaWNhdGlvbldpdGhDbGF1c2UoVG9rZW4gd2l0aEtleXdvcmQpIHsKICAgIGxvZ0V2ZW50KCJOYW1lZE1peGluQXBwbGljYXRpb25XaXRoQ2xhdXNlIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBuYW1lZCBtaXhpbiBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSBtb2RpZmllcnMKICAvLy8gLSBjbGFzcyBuYW1lCiAgLy8vIC0gdHlwZSB2YXJpYWJsZXMKICAvLy8gLSBzdXBlcnR5cGUKICAvLy8gLSB3aXRoIGNsYXVzZQogIC8vLyAtIGltcGxlbWVudGVkIHR5cGVzIChUeXBlTGlzdCkKICAvLy8KICAvLy8gVE9ETyhwYXVsYmVycnksYWhlKTogaXQgc2VlbXMgaW5jb25zaXN0ZW50IHRoYXQgZm9yIGEgbmFtZWQgbWl4aW4KICAvLy8gYXBwbGljYXRpb24sIHRoZSBpbXBsZW1lbnRlZCB0eXBlcyBhcmUgYSBUeXBlTGlzdCwgd2hlcmVhcyBmb3IgYSBjbGFzcwogIC8vLyBkZWNsYXJhdGlvbiwgZWFjaCBpbXBsZW1lbnRlZCB0eXBlIGlzIGxpc3RlZCBzZXBhcmF0ZWx5IG9uIHRoZSBzdGFjaywgYW5kCiAgLy8vIHRoZSBudW1iZXIgb2YgaW1wbGVtZW50ZWQgdHlwZXMgaXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyLgogIHZvaWQgZW5kTmFtZWRNaXhpbkFwcGxpY2F0aW9uKFRva2VuIGJlZ2luLCBUb2tlbiBjbGFzc0tleXdvcmQsIFRva2VuIGVxdWFscywKICAgICAgVG9rZW4gaW1wbGVtZW50c0tleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiTmFtZWRNaXhpbkFwcGxpY2F0aW9uIik7CiAgfQoKICB2b2lkIGJlZ2luSGlkZShUb2tlbiBoaWRlS2V5d29yZCkge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgImhpZGUiIGNvbWJpbmF0b3IuICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIGhpZGRlbiBuYW1lcyAoSWRlbnRpZmllckxpc3QpCiAgdm9pZCBlbmRIaWRlKFRva2VuIGhpZGVLZXl3b3JkKSB7CiAgICBsb2dFdmVudCgiSGlkZSIpOwogIH0KCiAgdm9pZCBoYW5kbGVJZGVudGlmaWVyTGlzdChpbnQgY291bnQpIHsKICAgIGxvZ0V2ZW50KCJJZGVudGlmaWVyTGlzdCIpOwogIH0KCiAgdm9pZCBiZWdpblR5cGVMaXN0KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFR5cGVMaXN0KGludCBjb3VudCkgewogICAgbG9nRXZlbnQoIlR5cGVMaXN0Iik7CiAgfQoKICB2b2lkIGJlZ2luSWZTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kSWZTdGF0ZW1lbnQoVG9rZW4gaWZUb2tlbiwgVG9rZW4gZWxzZVRva2VuKSB7CiAgICBsb2dFdmVudCgiSWZTdGF0ZW1lbnQiKTsKICB9CgogIHZvaWQgYmVnaW5UaGVuU3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFRoZW5TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJUaGVuU3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGJlZ2luRWxzZVN0YXRlbWVudChUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRFbHNlU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiRWxzZVN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbkltcG9ydChUb2tlbiBpbXBvcnRLZXl3b3JkKSB7fQoKICAvLy8gU2lnbmFscyB0aGF0IHRoZSBjdXJyZW50IGltcG9ydCBpcyBkZWZlcnJlZCBhbmQvb3IgaGFzIGEgcHJlZml4CiAgLy8vIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIgW2RlZmVycmVkS2V5d29yZF0gYW5kIFthc0tleXdvcmRdCiAgLy8vIGFyZSBub3QgYG51bGxgIHJlc3BlY3RpdmVseS4gU3Vic3RydWN0dXJlczoKICAvLy8gLSBwcmVmaXggaWRlbnRpZmllciAob25seSBpZiBhc0tleXdvcmQgIT0gbnVsbCkKICB2b2lkIGhhbmRsZUltcG9ydFByZWZpeChUb2tlbiBkZWZlcnJlZEtleXdvcmQsIFRva2VuIGFzS2V5d29yZCkgewogICAgbG9nRXZlbnQoIkltcG9ydFByZWZpeCIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGFuIGltcG9ydCBkaXJlY3RpdmUuICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIG1ldGFkYXRhCiAgLy8vIC0gdXJpCiAgLy8vIC0gY29uZGl0aW9uYWwgdXJpcwogIC8vLyAtIHByZWZpeCBpZGVudGlmaWVyCiAgLy8vIC0gY29tYmluYXRvcnMKICB2b2lkIGVuZEltcG9ydChUb2tlbiBpbXBvcnRLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxvZ0V2ZW50KCJJbXBvcnQiKTsKICB9CgogIC8vLyBIYW5kbGUgcmVjb3ZlcnkgYXNzb2NpYXRlZCB3aXRoIGFuIGltcG9ydCBkaXJlY3RpdmUuCiAgLy8vIFRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhZnRlciBbZW5kSW1wb3J0XQogIC8vLyB0byByZWNvdmVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmV2aW91cyBpbXBvcnQgZGlyZWN0aXZlLgogIC8vLyBUaGUgc3Vic3RydWN0dXJlcyBhcmUgYSBzdWJzZXQgb2YgYW5kIGluIHRoZSBzYW1lIG9yZGVyIGFzIFtlbmRJbXBvcnRdOgogIC8vLyAtIGNvbmRpdGlvbmFsIHVyaXMKICAvLy8gLSBwcmVmaXggaWRlbnRpZmllcgogIC8vLyAtIGNvbWJpbmF0b3JzCiAgdm9pZCBoYW5kbGVSZWNvdmVySW1wb3J0KFRva2VuIHNlbWljb2xvbikgewogICAgbG9nRXZlbnQoIkltcG9ydFJlY292ZXJ5Iik7CiAgfQoKICB2b2lkIGJlZ2luQ29uZGl0aW9uYWxVcmlzKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZENvbmRpdGlvbmFsVXJpcyhpbnQgY291bnQpIHsKICAgIGxvZ0V2ZW50KCJDb25kaXRpb25hbFVyaXMiKTsKICB9CgogIHZvaWQgYmVnaW5Db25kaXRpb25hbFVyaShUb2tlbiBpZktleXdvcmQpIHt9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIGNvbmRpdGlvbmFsIFVSSSBjb25zdHJ1Y3QuICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIERvdHRlZCBuYW1lCiAgLy8vIC0gQ29uZGl0aW9uIChsaXRlcmFsIHN0cmluZzsgb25seSBpZiBbZXF1YWxTaWduXSAhPSBudWxsKQogIC8vLyAtIFVSSSAobGl0ZXJhbCBzdHJpbmcpCiAgdm9pZCBlbmRDb25kaXRpb25hbFVyaShUb2tlbiBpZktleXdvcmQsIFRva2VuIGxlZnRQYXJlbiwgVG9rZW4gZXF1YWxTaWduKSB7CiAgICBsb2dFdmVudCgiQ29uZGl0aW9uYWxVcmkiKTsKICB9CgogIHZvaWQgaGFuZGxlRG90dGVkTmFtZShpbnQgY291bnQsIFRva2VuIGZpcnN0SWRlbnRpZmllcikgewogICAgbG9nRXZlbnQoIkRvdHRlZE5hbWUiKTsKICB9CgogIHZvaWQgYmVnaW5JbXBsaWNpdENyZWF0aW9uRXhwcmVzc2lvbihUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRJbXBsaWNpdENyZWF0aW9uRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGJlZ2luSW5pdGlhbGl6ZWRJZGVudGlmaWVyKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZEluaXRpYWxpemVkSWRlbnRpZmllcihUb2tlbiBuYW1lVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJJbml0aWFsaXplZElkZW50aWZpZXIiKTsKICB9CgogIHZvaWQgYmVnaW5GaWVsZEluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBmaWVsZCBpbml0aWFsaXplci4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gSW5pdGlhbGl6ZXIgZXhwcmVzc2lvbgogIHZvaWQgZW5kRmllbGRJbml0aWFsaXplcihUb2tlbiBhc3NpZ25tZW50LCBUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZpZWxkSW5pdGlhbGl6ZXIiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGxhY2sgb2YgYSBmaWVsZCBpbml0aWFsaXplci4KICB2b2lkIGhhbmRsZU5vRmllbGRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk5vRmllbGRJbml0aWFsaXplciIpOwogIH0KCiAgdm9pZCBiZWdpblZhcmlhYmxlSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIHZhcmlhYmxlIGluaXRpYWxpemVyLiBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIEluaXRpYWxpemVyIGV4cHJlc3Npb24uCiAgdm9pZCBlbmRWYXJpYWJsZUluaXRpYWxpemVyKFRva2VuIGFzc2lnbm1lbnRPcGVyYXRvcikgewogICAgbG9nRXZlbnQoIlZhcmlhYmxlSW5pdGlhbGl6ZXIiKTsKICB9CgogIC8vLyBVc2VkIHdoZW4gYSB2YXJpYWJsZSBoYXMgbm8gaW5pdGlhbGl6ZXIuCiAgdm9pZCBoYW5kbGVOb1ZhcmlhYmxlSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJOb1ZhcmlhYmxlSW5pdGlhbGl6ZXIiKTsKICB9CgogIHZvaWQgYmVnaW5Jbml0aWFsaXplcihUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkNvbnN0cnVjdG9ySW5pdGlhbGl6ZXIiKTsKICB9CgogIHZvaWQgYmVnaW5Jbml0aWFsaXplcnMoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kSW5pdGlhbGl6ZXJzKGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJJbml0aWFsaXplcnMiKTsKICB9CgogIHZvaWQgaGFuZGxlTm9Jbml0aWFsaXplcnMoKSB7CiAgICBsb2dFdmVudCgiTm9Jbml0aWFsaXplcnMiKTsKICB9CgogIC8vLyBDYWxsZWQgYWZ0ZXIgdGhlIGxpc3RlbmVyIGhhcyByZWNvdmVyZWQgZnJvbSBhbiBpbnZhbGlkIGV4cHJlc3Npb24uIFRoZQogIC8vLyBwYXJzZXIgd2lsbCByZXN1bWUgcGFyc2luZyBmcm9tIFt0b2tlbl0uIEV4YWN0bHkgd2hlcmUgdGhlIHBhcnNlciB3aWxsCiAgLy8vIHJlc3VtZSBwYXJzaW5nIGlzIHVuc3BlY2lmaWVkLgogIHZvaWQgaGFuZGxlSW52YWxpZEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJJbnZhbGlkRXhwcmVzc2lvbiIpOwogIH0KCiAgLy8vIENhbGxlZCBhZnRlciB0aGUgbGlzdGVuZXIgaGFzIHJlY292ZXJlZCBmcm9tIGFuIGludmFsaWQgZnVuY3Rpb24KICAvLy8gYm9keS4gVGhlIHBhcnNlciBleHBlY3RlZCBhbiBvcGVuIGN1cmx5IGJyYWNlIGB7YCBhbmQgd2lsbCByZXN1bWUgcGFyc2luZwogIC8vLyBmcm9tIFt0b2tlbl0gYXMgaWYgYSBmdW5jdGlvbiBib2R5IGhhZCBwcmVjZWVkZWQgaXQuCiAgdm9pZCBoYW5kbGVJbnZhbGlkRnVuY3Rpb25Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiSW52YWxpZEZ1bmN0aW9uQm9keSIpOwogIH0KCiAgLy8vIENhbGxlZCBhZnRlciB0aGUgbGlzdGVuZXIgaGFzIHJlY292ZXJlZCBmcm9tIGFuIGludmFsaWQgdHlwZS4gVGhlIHBhcnNlcgogIC8vLyBleHBlY3RlZCBhbiBpZGVudGlmaWVyLCBhbmQgd2lsbCByZXN1bWUgcGFyc2luZyB0eXBlIGFyZ3VtZW50cyBmcm9tCiAgLy8vIFt0b2tlbl0uCiAgdm9pZCBoYW5kbGVJbnZhbGlkVHlwZVJlZmVyZW5jZShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkludmFsaWRUeXBlUmVmZXJlbmNlIik7CiAgfQoKICB2b2lkIGhhbmRsZUxhYmVsKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiTGFiZWwiKTsKICB9CgogIHZvaWQgYmVnaW5MYWJlbGVkU3RhdGVtZW50KFRva2VuIHRva2VuLCBpbnQgbGFiZWxDb3VudCkge30KCiAgdm9pZCBlbmRMYWJlbGVkU3RhdGVtZW50KGludCBsYWJlbENvdW50KSB7CiAgICBsb2dFdmVudCgiTGFiZWxlZFN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbkxpYnJhcnlOYW1lKFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBsaWJyYXJ5IGRpcmVjdGl2ZS4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gTWV0YWRhdGEKICAvLy8gLSBMaWJyYXJ5IG5hbWUgKGEgcXVhbGlmaWVkIGlkZW50aWZpZXIpCiAgdm9pZCBlbmRMaWJyYXJ5TmFtZShUb2tlbiBsaWJyYXJ5S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsb2dFdmVudCgiTGlicmFyeU5hbWUiKTsKICB9CgogIHZvaWQgaGFuZGxlTGl0ZXJhbE1hcEVudHJ5KFRva2VuIGNvbG9uLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkxpdGVyYWxNYXBFbnRyeSIpOwogIH0KCiAgdm9pZCBiZWdpbkxpdGVyYWxTdHJpbmcoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgaGFuZGxlSW50ZXJwb2xhdGlvbkV4cHJlc3Npb24oVG9rZW4gbGVmdEJyYWNrZXQsIFRva2VuIHJpZ2h0QnJhY2tldCkge30KCiAgdm9pZCBlbmRMaXRlcmFsU3RyaW5nKGludCBpbnRlcnBvbGF0aW9uQ291bnQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiTGl0ZXJhbFN0cmluZyIpOwogIH0KCiAgdm9pZCBoYW5kbGVTdHJpbmdKdXh0YXBvc2l0aW9uKGludCBsaXRlcmFsQ291bnQpIHsKICAgIGxvZ0V2ZW50KCJTdHJpbmdKdXh0YXBvc2l0aW9uIik7CiAgfQoKICB2b2lkIGJlZ2luTWVtYmVyKCkge30KCiAgLy8vIEhhbmRsZSBhbiBpbnZhbGlkIG1lbWJlciBkZWNsYXJhdGlvbi4gU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIHZvaWQgaGFuZGxlSW52YWxpZE1lbWJlcihUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkludmFsaWRNZW1iZXIiKTsKICB9CgogIC8vLyBUaGlzIGV2ZW50IGlzIGFkZGVkIGZvciBjb252ZW5pZW5jZS4gTm9ybWFsbHksIG9uZSBzaG91bGQgb3ZlcnJpZGUKICAvLy8gW2VuZE1ldGhvZF0gb3IgW2VuZEZpZWxkc10gaW5zdGVhZC4KICB2b2lkIGVuZE1lbWJlcigpIHsKICAgIGxvZ0V2ZW50KCJNZW1iZXIiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGJlZ2lubmluZyBvZiBhIG1ldGhvZCBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICB2b2lkIGJlZ2luTWV0aG9kKFRva2VuIGV4dGVybmFsVG9rZW4sIFRva2VuIHN0YXRpY1Rva2VuLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBUb2tlbiBnZXRPclNldCwgVG9rZW4gbmFtZSkge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgbWV0aG9kIGRlY2xhcmF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIC8vLyAtIHJldHVybiB0eXBlCiAgLy8vIC0gbWV0aG9kIG5hbWUgKGlkZW50aWZpZXIsIHBvc3NpYmx5IHF1YWxpZmllZCkKICAvLy8gLSB0eXBlIHZhcmlhYmxlcwogIC8vLyAtIGZvcm1hbCBwYXJhbWV0ZXJzCiAgLy8vIC0gaW5pdGlhbGl6ZXJzCiAgLy8vIC0gYXN5bmMgbWFya2VyCiAgLy8vIC0gYm9keQogIHZvaWQgZW5kTWV0aG9kKFRva2VuIGdldE9yU2V0LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBiZWdpblBhcmFtLAogICAgICBUb2tlbiBiZWdpbkluaXRpYWxpemVycywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJNZXRob2QiKTsKICB9CgogIHZvaWQgYmVnaW5NZXRhZGF0YVN0YXIoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kTWV0YWRhdGFTdGFyKGludCBjb3VudCkgewogICAgbG9nRXZlbnQoIk1ldGFkYXRhU3RhciIpOwogIH0KCiAgdm9pZCBiZWdpbk1ldGFkYXRhKFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBtZXRhZGF0YSBhbm5vdGF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBJZGVudGlmaWVyCiAgLy8vIC0gVHlwZSBhcmd1bWVudHMKICAvLy8gLSBDb25zdHJ1Y3RvciBuYW1lIChvbmx5IGlmIFtwZXJpb2RCZWZvcmVOYW1lXSBpcyBub3QgYG51bGxgKQogIC8vLyAtIEFyZ3VtZW50cwogIHZvaWQgZW5kTWV0YWRhdGEoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gcGVyaW9kQmVmb3JlTmFtZSwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJNZXRhZGF0YSIpOwogIH0KCiAgdm9pZCBiZWdpbk9wdGlvbmFsRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMoCiAgICAgIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMiKTsKICB9CgogIHZvaWQgYmVnaW5QYXJ0KFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBwYXJ0IGRpcmVjdGl2ZS4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSB1cmkKICB2b2lkIGVuZFBhcnQoVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgbG9nRXZlbnQoIlBhcnQiKTsKICB9CgogIHZvaWQgYmVnaW5QYXJ0T2YoVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhICJwYXJ0IG9mIiBkaXJlY3RpdmUuICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIE1ldGFkYXRhCiAgLy8vIC0gTGlicmFyeSBuYW1lIChhIHF1YWxpZmllZCBpZGVudGlmaWVyKQogIC8vLwogIC8vLyBJZiBbaGFzTmFtZV0gaXMgdHJ1ZSwgdGhpcyBwYXJ0IHJlZmVycyB0byBpdHMgbGlicmFyeSBieSBuYW1lLCBvdGhlcndpc2UsCiAgLy8vIGJ5IFVSSS4KICB2b2lkIGVuZFBhcnRPZigKICAgICAgVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIG9mS2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uLCBib29sIGhhc05hbWUpIHsKICAgIGxvZ0V2ZW50KCJQYXJ0T2YiKTsKICB9CgogIHZvaWQgYmVnaW5SZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5Iik7CiAgfQoKICB2b2lkIGJlZ2luUmV0dXJuU3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBgbmF0aXZlYCBmdW5jdGlvbi4KICAvLy8gVGhlIFtoYW5kbGVOYXRpdmVDbGF1c2VdIGV2ZW50IGlzIHNlbnQgcHJpb3IgdG8gdGhpcyBldmVudC4KICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keShUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsb2dFdmVudCgiTmF0aXZlRnVuY3Rpb25Cb2R5Iik7CiAgfQoKICAvLy8gQ2FsbGVkIGFmdGVyIHRoZSBbaGFuZGxlTmF0aXZlQ2xhdXNlXSBldmVudCB3aGVuIHRoZSBwYXJzZXIgZGV0ZXJtaW5lcwogIC8vLyB0aGF0IHRoZSBuYXRpdmUgY2xhdXNlIHNob3VsZCBiZSBkaXNjYXJkZWQgLyBpZ25vcmVkLgogIC8vLyBGb3IgZXhhbXBsZSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGEgbmF0aXZlIGNsYXVzZSBpcyBmb2xsb3dlZCBieQogIC8vLyBhIGZ1bmN0aW9uIGJvZHkuCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxvZ0V2ZW50KCJOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBgbmF0aXZlYCBmdW5jdGlvbiB0aGF0IHdhcyBza2lwcGVkIGJ5IHRoZSBwYXJzZXIuCiAgLy8vIFRoZSBbaGFuZGxlTmF0aXZlQ2xhdXNlXSBldmVudCBpcyBzZW50IHByaW9yIHRvIHRoaXMgZXZlbnQuCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxvZ0V2ZW50KCJOYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkIik7CiAgfQoKICAvLy8gVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIGEgZnVuY3Rpb24gaGFzIHRoZSBlbXB0eSBib2R5LgogIHZvaWQgaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHkoVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsb2dFdmVudCgiRW1wdHlGdW5jdGlvbkJvZHkiKTsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gcGFyc2VyIGZpbmlzaGVzIHBhcnNpbmcgdGhlIGNvcnJlc3BvbmRpbmcKICAvLy8gZXhwcmVzc2lvbiBvZiB0aGUgZXhwcmVzc2lvbiBmdW5jdGlvbiBib2R5LgogIHZvaWQgaGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShUb2tlbiBhcnJvd1Rva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkV4cHJlc3Npb25GdW5jdGlvbkJvZHkiKTsKICB9CgogIHZvaWQgZW5kUmV0dXJuU3RhdGVtZW50KAogICAgICBib29sIGhhc0V4cHJlc3Npb24sIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiUmV0dXJuU3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZVNlbmQoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJTZW5kIik7CiAgfQoKICB2b2lkIGJlZ2luU2hvdyhUb2tlbiBzaG93S2V5d29yZCkge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgInNob3ciIGNvbWJpbmF0b3IuICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIHNob3duIG5hbWVzIChJZGVudGlmaWVyTGlzdCkKICB2b2lkIGVuZFNob3coVG9rZW4gc2hvd0tleXdvcmQpIHsKICAgIGxvZ0V2ZW50KCJTaG93Iik7CiAgfQoKICB2b2lkIGJlZ2luU3dpdGNoU3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFN3aXRjaFN0YXRlbWVudChUb2tlbiBzd2l0Y2hLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIlN3aXRjaFN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpblN3aXRjaEJsb2NrKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFN3aXRjaEJsb2NrKGludCBjYXNlQ291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiU3dpdGNoQmxvY2siKTsKICB9CgogIHZvaWQgYmVnaW5MaXRlcmFsU3ltYm9sKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZExpdGVyYWxTeW1ib2woVG9rZW4gaGFzaFRva2VuLCBpbnQgaWRlbnRpZmllckNvdW50KSB7CiAgICBsb2dFdmVudCgiTGl0ZXJhbFN5bWJvbCIpOwogIH0KCiAgdm9pZCBoYW5kbGVUaHJvd0V4cHJlc3Npb24oVG9rZW4gdGhyb3dUb2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJUaHJvd0V4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgYmVnaW5SZXRocm93U3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFJldGhyb3dTdGF0ZW1lbnQoVG9rZW4gcmV0aHJvd1Rva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIlJldGhyb3dTdGF0ZW1lbnQiKTsKICB9CgogIC8vLyBUaGlzIGV2ZW50IGlzIGFkZGVkIGZvciBjb252ZW5pZW5jZS4gTm9ybWFsbHksIG9uZSBzaG91bGQgdXNlCiAgLy8vIFtlbmRDbGFzc0RlY2xhcmF0aW9uXSwgW2VuZE5hbWVkTWl4aW5BcHBsaWNhdGlvbl0sIFtlbmRFbnVtXSwKICAvLy8gW2VuZEZ1bmN0aW9uVHlwZUFsaWFzXSwgW2VuZExpYnJhcnlOYW1lXSwgW2VuZEltcG9ydF0sIFtlbmRFeHBvcnRdLAogIC8vLyBbZW5kUGFydF0sIFtlbmRQYXJ0T2ZdLCBbZW5kVG9wTGV2ZWxGaWVsZHNdLCBvciBbZW5kVG9wTGV2ZWxNZXRob2RdLgogIHZvaWQgZW5kVG9wTGV2ZWxEZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlRvcExldmVsRGVjbGFyYXRpb24iKTsKICB9CgogIC8vLyBDYWxsZWQgYnkgdGhlIFtQYXJzZXJdIHdoZW4gaXQgcmVjb3ZlcnMgZnJvbSBhbiBpbnZhbGlkIHRvcCBsZXZlbAogIC8vLyBkZWNsYXJhdGlvbiwgd2hlcmUgW2VuZFRva2VuXSBpcyB0aGUgbGFzdCB0b2tlbiBpbiB0aGUgZGVjbGFyYXRpb24KICAvLy8gVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJlZ2luL2VuZCBtZXRhZGF0YSBzdGFyIGV2ZW50cywKICAvLy8gYW5kIGlzIGZvbGxvd2VkIGJ5IFtlbmRUb3BMZXZlbERlY2xhcmF0aW9uXS4KICAvLy8KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIHZvaWQgaGFuZGxlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb24oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbiIpOwogIH0KCiAgLy8vIE1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgYSB0b3AgbGV2ZWwgZmllbGQgb3IgbWV0aG9kIGRlY2xhcmF0aW9uLgogIC8vLyBEb2Vzbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGVuZCBldmVudC4KICAvLy8gU2VlIFtlbmRUb3BMZXZlbEZpZWxkc10gYW5kIFtlbmRUb3BMZXZlbE1ldGhvZF0uCiAgdm9pZCBiZWdpblRvcExldmVsTWVtYmVyKFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSB0b3AgbGV2ZWwgdmFyaWFibGUgZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIE1ldGFkYXRhCiAgLy8vIC0gVHlwZQogIC8vLyAtIFJlcGVhdGVkIFtjb3VudF0gdGltZXM6CiAgLy8vICAgLSBWYXJpYWJsZSBuYW1lIChpZGVudGlmaWVyKQogIC8vLyAgIC0gRmllbGQgaW5pdGlhbGl6ZXIKICAvLy8gRG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBiZWdpbiBldmVudC4KICAvLy8gVXNlIFtiZWdpblRvcExldmVsTWVtYmVyXSBpbnN0ZWFkLgogIHZvaWQgZW5kVG9wTGV2ZWxGaWVsZHMoCiAgICAgIFRva2VuIHN0YXRpY1Rva2VuLAogICAgICBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gbGF0ZVRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsCiAgICAgIGludCBjb3VudCwKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwKICAgICAgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJUb3BMZXZlbEZpZWxkcyIpOwogIH0KCiAgdm9pZCBiZWdpblRvcExldmVsTWV0aG9kKFRva2VuIGxhc3RDb25zdW1lZCwgVG9rZW4gZXh0ZXJuYWxUb2tlbikge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgdG9wIGxldmVsIG1ldGhvZC4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSBtb2RpZmllcnMKICAvLy8gLSByZXR1cm4gdHlwZQogIC8vLyAtIGlkZW50aWZpZXIKICAvLy8gLSB0eXBlIHZhcmlhYmxlcwogIC8vLyAtIGZvcm1hbCBwYXJhbWV0ZXJzCiAgLy8vIC0gYXN5bmMgbWFya2VyCiAgLy8vIC0gYm9keQogIHZvaWQgZW5kVG9wTGV2ZWxNZXRob2QoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiVG9wTGV2ZWxNZXRob2QiKTsKICB9CgogIHZvaWQgYmVnaW5UcnlTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgaGFuZGxlQ2FzZU1hdGNoKFRva2VuIGNhc2VLZXl3b3JkLCBUb2tlbiBjb2xvbikgewogICAgbG9nRXZlbnQoIkNhc2VNYXRjaCIpOwogIH0KCiAgdm9pZCBiZWdpbkNhdGNoQ2xhdXNlKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZENhdGNoQ2xhdXNlKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiQ2F0Y2hDbGF1c2UiKTsKICB9CgogIHZvaWQgaGFuZGxlQ2F0Y2hCbG9jayhUb2tlbiBvbktleXdvcmQsIFRva2VuIGNhdGNoS2V5d29yZCwgVG9rZW4gY29tbWEpIHsKICAgIGxvZ0V2ZW50KCJDYXRjaEJsb2NrIik7CiAgfQoKICB2b2lkIGhhbmRsZUZpbmFsbHlCbG9jayhUb2tlbiBmaW5hbGx5S2V5d29yZCkgewogICAgbG9nRXZlbnQoIkZpbmFsbHlCbG9jayIpOwogIH0KCiAgdm9pZCBlbmRUcnlTdGF0ZW1lbnQoaW50IGNhdGNoQ291bnQsIFRva2VuIHRyeUtleXdvcmQsIFRva2VuIGZpbmFsbHlLZXl3b3JkKSB7CiAgICBsb2dFdmVudCgiVHJ5U3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZVR5cGUoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gcXVlc3Rpb25NYXJrKSB7CiAgICBsb2dFdmVudCgiVHlwZSIpOwogIH0KCiAgLy8vIENhbGxlZCB3aGVuIHBhcnNlciBlbmNvdW50ZXJzIGEgJyEnCiAgLy8vIHVzZWQgYXMgYSBub24tbnVsbCBwb3N0Zml4IGFzc2VydGlvbiBpbiBhbiBleHByZXNzaW9uLgogIHZvaWQgaGFuZGxlTm9uTnVsbEFzc2VydEV4cHJlc3Npb24oVG9rZW4gYmFuZykgewogICAgbG9nRXZlbnQoIk5vbk51bGxBc3NlcnRFeHByZXNzaW9uIik7CiAgfQoKICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVtb3ZlIHRoaXMgb25jZSBhbGwgbGlzdGVuZXJzIGhhdmUgYmVlbiB1cGRhdGVkCiAgLy8gdG8gcHJvcGVybHkgaGFuZGxlIG51bGxhYmxlIHR5cGVzCiAgdm9pZCByZXBvcnRFcnJvcklmTnVsbGFibGVUeXBlKFRva2VuIHF1ZXN0aW9uTWFyaykgewogICAgaWYgKHF1ZXN0aW9uTWFyayAhPSBudWxsKSB7CiAgICAgIGFzc2VydChvcHRpb25hbCgnPycsIHF1ZXN0aW9uTWFyaykpOwogICAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgdGVtcGxhdGVFeHBlcmltZW50Tm90RW5hYmxlZC53aXRoQXJndW1lbnRzKCdub24tbnVsbGFibGUnKSwKICAgICAgICAgIHF1ZXN0aW9uTWFyaywKICAgICAgICAgIHF1ZXN0aW9uTWFyayk7CiAgICB9CiAgfQoKICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVtb3ZlIHRoaXMgb25jZSBhbGwgbGlzdGVuZXJzIGhhdmUgYmVlbiB1cGRhdGVkCiAgLy8gdG8gcHJvcGVybHkgaGFuZGxlIG51bGxhYmxlIHR5cGVzCiAgdm9pZCByZXBvcnROb25OdWxsYWJsZU1vZGlmaWVyRXJyb3IoVG9rZW4gbW9kaWZpZXJUb2tlbikgewogICAgaWYgKG1vZGlmaWVyVG9rZW4gIT0gbnVsbCkgewogICAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgdGVtcGxhdGVFeHBlcmltZW50Tm90RW5hYmxlZC53aXRoQXJndW1lbnRzKCdub24tbnVsbGFibGUnKSwKICAgICAgICAgIG1vZGlmaWVyVG9rZW4sCiAgICAgICAgICBtb2RpZmllclRva2VuKTsKICAgIH0KICB9CgogIC8vIFRPRE8oZGFucnViZWwpOiBSZW1vdmUgdGhpcyBvbmNlIGFsbCBsaXN0ZW5lcnMgaGF2ZSBiZWVuIHVwZGF0ZWQKICAvLyB0byBwcm9wZXJseSBoYW5kbGUgbm9uLW51bGwgYXNzZXJ0IGV4cHJlc3Npb25zCiAgdm9pZCByZXBvcnROb25OdWxsQXNzZXJ0RXhwcmVzc2lvbk5vdEVuYWJsZWQoVG9rZW4gYmFuZykgewogICAgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgICB0ZW1wbGF0ZUV4cGVyaW1lbnROb3RFbmFibGVkLndpdGhBcmd1bWVudHMoJ25vbi1udWxsYWJsZScpLCBiYW5nLCBiYW5nKTsKICB9CgogIHZvaWQgaGFuZGxlTm9OYW1lKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiTm9OYW1lIik7CiAgfQoKICB2b2lkIGJlZ2luRnVuY3Rpb25UeXBlKFRva2VuIGJlZ2luVG9rZW4pIHt9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIGdlbmVyaWMgZnVuY3Rpb24gdHlwZSBkZWNsYXJhdGlvbi4KICAvLy8KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBUeXBlIHZhcmlhYmxlcwogIC8vLyAtIFJldHVybiB0eXBlCiAgLy8vIC0gRm9ybWFsIHBhcmFtZXRlcnMKICB2b2lkIGVuZEZ1bmN0aW9uVHlwZShUb2tlbiBmdW5jdGlvblRva2VuLCBUb2tlbiBxdWVzdGlvbk1hcmspIHsKICAgIGxvZ0V2ZW50KCJGdW5jdGlvblR5cGUiKTsKICB9CgogIHZvaWQgYmVnaW5UeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFR5cGVBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIlR5cGVBcmd1bWVudHMiKTsKICB9CgogIC8vLyBBZnRlciBlbmRUeXBlQXJndW1lbnRzIGhhcyBiZWVuIGNhbGxlZCwKICAvLy8gdGhpcyBldmVudCBpcyBjYWxsZWQgaWYgdGhvc2UgdHlwZSBhcmd1bWVudHMgYXJlIGludmFsaWQuCiAgdm9pZCBoYW5kbGVJbnZhbGlkVHlwZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk5vVHlwZUFyZ3VtZW50cyIpOwogIH0KCiAgdm9pZCBoYW5kbGVOb1R5cGVBcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJOb1R5cGVBcmd1bWVudHMiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGJlZ2luIG9mIGEgdHlwZSBmb3JtYWwgcGFyYW1ldGVyIChlLmcuICJYIGV4dGVuZHMgWSIpLgogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIE1ldGFkYXRhCiAgLy8vIC0gTmFtZSAoaWRlbnRpZmllcikKICB2b2lkIGJlZ2luVHlwZVZhcmlhYmxlKFRva2VuIHRva2VuKSB7fQoKICAvLy8gQ2FsbGVkIHdoZW4gW2JlZ2luVHlwZVZhcmlhYmxlXSBoYXMgYmVlbiBjYWxsZWQgZm9yIGFsbCBvZiB0aGUgdmFyaWFibGVzCiAgLy8vIGluIGEgZ3JvdXAsIGFuZCBiZWZvcmUgW2VuZFR5cGVWYXJpYWJsZV0gaGFzIGJlZW4gY2FsbGVkIGZvciBhbnkgb2YgdGhlCiAgLy8vIHZhcmlhYmxlcyBpbiB0aGF0IHNhbWUgZ3JvdXAuCiAgdm9pZCBoYW5kbGVUeXBlVmFyaWFibGVzRGVmaW5lZChUb2tlbiB0b2tlbiwgaW50IGNvdW50KSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSB0eXBlIGZvcm1hbCBwYXJhbWV0ZXIgKGUuZy4gIlggZXh0ZW5kcyBZIikKICAvLy8gd2hlcmUgW2luZGV4XSBpcyB0aGUgaW5kZXggb2YgdGhlIHR5cGUgdmFyaWFibGUgaW4gdGhlIGxpc3Qgb2YKICAvLy8gdHlwZSB2YXJpYWJsZXMgYmVpbmcgZGVjbGFyZWQuCiAgLy8vCiAgLy8vIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gVHlwZSBib3VuZAogIC8vLwogIC8vLyBTZWUgW2JlZ2luVHlwZVZhcmlhYmxlXSBmb3IgYWRkaXRpb25hbCBzdWJzdHJ1Y3R1cmVzLgogIHZvaWQgZW5kVHlwZVZhcmlhYmxlKFRva2VuIHRva2VuLCBpbnQgaW5kZXgsIFRva2VuIGV4dGVuZHNPclN1cGVyKSB7CiAgICBsb2dFdmVudCgiVHlwZVZhcmlhYmxlIik7CiAgfQoKICB2b2lkIGJlZ2luVHlwZVZhcmlhYmxlcyhUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRUeXBlVmFyaWFibGVzKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiVHlwZVZhcmlhYmxlcyIpOwogIH0KCiAgdm9pZCBiZWdpbkZ1bmN0aW9uRXhwcmVzc2lvbihUb2tlbiB0b2tlbikge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gZXhwcmVzc2lvbiAoZS5nLiAiKCkgeyAuLi4gfSIpLgogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIFR5cGUgdmFyaWFibGVzCiAgLy8vIC0gRm9ybWFsIHBhcmFtZXRlcnMKICAvLy8gLSBBc3luYyBtYXJrZXIKICAvLy8gLSBCb2R5CiAgdm9pZCBlbmRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJGdW5jdGlvbkV4cHJlc3Npb24iKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGVzIGRlY2xhcmF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBNZXRhZGF0YQogIC8vLyAtIFR5cGUKICB2b2lkIGJlZ2luVmFyaWFibGVzRGVjbGFyYXRpb24oCiAgICAgIFRva2VuIHRva2VuLCBUb2tlbiBsYXRlVG9rZW4sIFRva2VuIHZhckZpbmFsT3JDb25zdCkge30KCiAgdm9pZCBlbmRWYXJpYWJsZXNEZWNsYXJhdGlvbihpbnQgY291bnQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiVmFyaWFibGVzRGVjbGFyYXRpb24iKTsKICB9CgogIHZvaWQgYmVnaW5XaGlsZVN0YXRlbWVudChUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRXaGlsZVN0YXRlbWVudChUb2tlbiB3aGlsZUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiV2hpbGVTdGF0ZW1lbnQiKTsKICB9CgogIHZvaWQgaGFuZGxlQXNPcGVyYXRvcihUb2tlbiBvcGVyYXRvcikgewogICAgbG9nRXZlbnQoIkFzT3BlcmF0b3IiKTsKICB9CgogIHZvaWQgaGFuZGxlQXNzaWdubWVudEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJBc3NpZ25tZW50RXhwcmVzc2lvbiIpOwogIH0KCiAgLy8vIENhbGxlZCB3aGVuIHRoZSBwYXJzZXIgZW5jb3VudGVycyBhIGJpbmFyeSBvcGVyYXRvciwgaW4gYmV0d2VlbiB0aGUgTEhTCiAgLy8vIGFuZCBSSFMgc3ViZXhwcmVzc2lvbnMuCiAgLy8vCiAgLy8vIE5vdCBjYWxsZWQgd2hlbiB0aGUgYmluYXJ5IG9wZXJhdG9yIGlzIGAuYCwgYD8uYCwgb3IgYC4uYC4KICB2b2lkIGJlZ2luQmluYXJ5RXhwcmVzc2lvbihUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRCaW5hcnlFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiQmluYXJ5RXhwcmVzc2lvbiIpOwogIH0KCiAgLy8vIENhbGxlZCB3aGVuIHRoZSBwYXJzZXIgZW5jb3VudGVycyBhIGA/YCBvcGVyYXRvciBhbmQgYmVnaW5zIHBhcnNpbmcgYQogIC8vLyBjb25kaXRpb25hbCBleHByZXNzaW9uLgogIHZvaWQgYmVnaW5Db25kaXRpb25hbEV4cHJlc3Npb24oVG9rZW4gcXVlc3Rpb24pIHt9CgogIC8vLyBDYWxsZWQgd2hlbiB0aGUgcGFyc2VyIGVuY291bnRlcnMgYSBgOmAgb3BlcmF0b3IgaW4gYSBjb25kaXRpb25hbAogIC8vLyBleHByZXNzaW9uLgogIHZvaWQgaGFuZGxlQ29uZGl0aW9uYWxFeHByZXNzaW9uQ29sb24oKSB7fQoKICAvLy8gQ2FsbGVkIHdoZW4gdGhlIHBhcnNlciBmaW5pc2hlcyBwcm9jZXNzaW5nIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KICB2b2lkIGVuZENvbmRpdGlvbmFsRXhwcmVzc2lvbihUb2tlbiBxdWVzdGlvbiwgVG9rZW4gY29sb24pIHsKICAgIGxvZ0V2ZW50KCJDb25kaXRpb25hbEV4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgYmVnaW5Db25zdEV4cHJlc3Npb24oVG9rZW4gY29uc3RLZXl3b3JkKSB7fQoKICB2b2lkIGVuZENvbnN0RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkNvbnN0RXhwcmVzc2lvbiIpOwogIH0KCiAgLy8vIENhbGxlZCBiZWZvcmUgcGFyc2luZyBhICJmb3IiIGNvbnRyb2wgZmxvdyBsaXN0LCBzZXQsIG9yIG1hcCBlbnRyeS4KICB2b2lkIGJlZ2luRm9yQ29udHJvbEZsb3coVG9rZW4gYXdhaXRUb2tlbiwgVG9rZW4gZm9yVG9rZW4pIHt9CgogIC8vLyBDYWxsZWQgYWZ0ZXIgcGFyc2luZyBhICJmb3IiIGNvbnRyb2wgZmxvdyBsaXN0LCBzZXQsIG9yIG1hcCBlbnRyeS4KICB2b2lkIGVuZEZvckNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgnZW5kRm9yQ29udHJvbEZsb3cnKTsKICB9CgogIC8vLyBDYWxsZWQgYWZ0ZXIgcGFyc2luZyBhICJmb3ItaW4iIGNvbnRyb2wgZmxvdyBsaXN0LCBzZXQsIG9yIG1hcCBlbnRyeS4KICB2b2lkIGVuZEZvckluQ29udHJvbEZsb3coVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCdlbmRGb3JJbkNvbnRyb2xGbG93Jyk7CiAgfQoKICAvLy8gQ2FsbGVkIGJlZm9yZSBwYXJzaW5nIGFuIGBpZmAgY29udHJvbCBmbG93IGxpc3QsIHNldCwgb3IgbWFwIGVudHJ5LgogIHZvaWQgYmVnaW5JZkNvbnRyb2xGbG93KFRva2VuIGlmVG9rZW4pIHt9CgogIC8vLyBDYWxsZWQgYmVmb3JlIHBhcnNpbmcgdGhlIGB0aGVuYCBwb3J0aW9uIG9mIGFuIGBpZmAgY29udHJvbCBmbG93IGxpc3QsCiAgLy8vIHNldCwgb3IgbWFwIGVudHJ5LgogIHZvaWQgYmVnaW5UaGVuQ29udHJvbEZsb3coVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBDYWxsZWQgYmVmb3JlIHBhcnNpbmcgdGhlIGBlbHNlYCBwb3J0aW9uIG9mIGFuIGBpZmAgY29udHJvbCBmbG93IGxpc3QsCiAgLy8vIHNldCwgb3IgbWFwIGVudHJ5LgogIHZvaWQgaGFuZGxlRWxzZUNvbnRyb2xGbG93KFRva2VuIGVsc2VUb2tlbikgewogICAgbG9nRXZlbnQoIkVsc2VDb250cm9sRmxvdyIpOwogIH0KCiAgLy8vIENhbGxlZCBhZnRlciBwYXJzaW5nIGFuIGBpZmAgY29udHJvbCBmbG93IGxpc3QsIHNldCwgb3IgbWFwIGVudHJ5LgogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIGlmIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24KICAvLy8gLSBleHByZXNzaW9uCiAgdm9pZCBlbmRJZkNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiZW5kSWZDb250cm9sRmxvdyIpOwogIH0KCiAgLy8vIENhbGxlZCBhZnRlciBwYXJzaW5nIGFuIGlmLWVsc2UgY29udHJvbCBmbG93IGxpc3QsIHNldCwgb3IgbWFwIGVudHJ5LgogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIGlmIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24KICAvLy8gLSB0aGVuIGV4cHJlc3Npb24KICAvLy8gLSBlbHNlIGV4cHJlc3Npb24KICB2b2lkIGVuZElmRWxzZUNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiZW5kSWZFbHNlQ29udHJvbEZsb3ciKTsKICB9CgogIC8vLyBDYWxsZWQgYWZ0ZXIgcGFyc2luZyBhIGxpc3QsIHNldCwgb3IgbWFwIGVudHJ5IHRoYXQgc3RhcnRzIHdpdGgKICAvLy8gb25lIG9mIHRoZSBzcHJlYWQgY29sbGVjdGlvbiB0b2tlbnMgYC4uLmAgb3IgYC4uLj9gLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBleHByZXNzaW9uCiAgdm9pZCBoYW5kbGVTcHJlYWRFeHByZXNzaW9uKFRva2VuIHNwcmVhZFRva2VuKSB7CiAgICBsb2dFdmVudCgiU3ByZWFkRXhwcmVzc2lvbiIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbiB0eXBlZCBmb3JtYWwgcGFyYW1ldGVyLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSB0eXBlIHZhcmlhYmxlcwogIHZvaWQgYmVnaW5GdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyKFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBmdW5jdGlvbiB0eXBlZCBmb3JtYWwgcGFyYW1ldGVyLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSB0eXBlIHZhcmlhYmxlcwogIC8vLyAtIHJldHVybiB0eXBlCiAgLy8vIC0gZm9ybWFsIHBhcmFtZXRlcnMKICB2b2lkIGVuZEZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gbmFtZVRva2VuLCBUb2tlbiBxdWVzdGlvbikgewogICAgbG9nRXZlbnQoIkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIiKTsKICB9CgogIC8vLyBIYW5kbGUgYW4gaWRlbnRpZmllciB0b2tlbi4KICAvLy8KICAvLy8gW2NvbnRleHRdIGluZGljYXRlcyB3aGF0IGtpbmQgb2YgY29uc3RydWN0IHRoZSBpZGVudGlmaWVyIGFwcGVhcnMgaW4uCiAgdm9pZCBoYW5kbGVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBsb2dFdmVudCgiSWRlbnRpZmllciIpOwogIH0KCiAgdm9pZCBoYW5kbGVJbmRleGVkRXhwcmVzc2lvbigKICAgICAgVG9rZW4gb3BlblNxdWFyZUJyYWNrZXQsIFRva2VuIGNsb3NlU3F1YXJlQnJhY2tldCkgewogICAgbG9nRXZlbnQoIkluZGV4ZWRFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGhhbmRsZUlzT3BlcmF0b3IoVG9rZW4gaXNPcGVyYXRvciwgVG9rZW4gbm90KSB7CiAgICBsb2dFdmVudCgiSXNPcGVyYXRvciIpOwogIH0KCiAgdm9pZCBoYW5kbGVMaXRlcmFsQm9vbChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkxpdGVyYWxCb29sIik7CiAgfQoKICB2b2lkIGhhbmRsZUJyZWFrU3RhdGVtZW50KAogICAgICBib29sIGhhc1RhcmdldCwgVG9rZW4gYnJlYWtLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkJyZWFrU3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZUNvbnRpbnVlU3RhdGVtZW50KAogICAgICBib29sIGhhc1RhcmdldCwgVG9rZW4gY29udGludWVLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkNvbnRpbnVlU3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZUVtcHR5U3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiRW1wdHlTdGF0ZW1lbnQiKTsKICB9CgogIHZvaWQgYmVnaW5Bc3NlcnQoVG9rZW4gYXNzZXJ0S2V5d29yZCwgQXNzZXJ0IGtpbmQpIHt9CgogIHZvaWQgZW5kQXNzZXJ0KFRva2VuIGFzc2VydEtleXdvcmQsIEFzc2VydCBraW5kLCBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsCiAgICAgIFRva2VuIGNvbW1hVG9rZW4sIFRva2VuIHNlbWljb2xvblRva2VuKSB7CiAgICBsb2dFdmVudCgiQXNzZXJ0Iik7CiAgfQoKICAvKiogQ2FsbGVkIHdpdGggZWl0aGVyIHRoZSB0b2tlbiBjb250YWluaW5nIGEgZG91YmxlIGxpdGVyYWwsIG9yCiAgICAqIGFuIGltbWVkaWF0ZWx5IHByZWNlZGluZyAidW5hcnkgcGx1cyIgdG9rZW4uCiAgICAqLwogIHZvaWQgaGFuZGxlTGl0ZXJhbERvdWJsZShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkxpdGVyYWxEb3VibGUiKTsKICB9CgogIC8qKiBDYWxsZWQgd2l0aCBlaXRoZXIgdGhlIHRva2VuIGNvbnRhaW5pbmcgYW4gaW50ZWdlciBsaXRlcmFsLAogICAgKiBvciBhbiBpbW1lZGlhdGVseSBwcmVjZWRpbmcgInVuYXJ5IHBsdXMiIHRva2VuLgogICAgKi8KICB2b2lkIGhhbmRsZUxpdGVyYWxJbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJMaXRlcmFsSW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZUxpdGVyYWxMaXN0KAogICAgICBpbnQgY291bnQsIFRva2VuIGxlZnRCcmFja2V0LCBUb2tlbiBjb25zdEtleXdvcmQsIFRva2VuIHJpZ2h0QnJhY2tldCkgewogICAgbG9nRXZlbnQoIkxpdGVyYWxMaXN0Iik7CiAgfQoKICB2b2lkIGhhbmRsZUxpdGVyYWxTZXRPck1hcCgKICAgIGludCBjb3VudCwKICAgIFRva2VuIGxlZnRCcmFjZSwKICAgIFRva2VuIGNvbnN0S2V5d29yZCwKICAgIFRva2VuIHJpZ2h0QnJhY2UsCiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogaGFzU2V0RW50cnkgcGFyYW1ldGVyIGV4aXN0cyBmb3IgcmVwbGljYXRpbmcgZXhpc3RpbmcKICAgIC8vIGJlaGF2aW9yIGFuZCB3aWxsIGJlIHJlbW92ZWQgb25jZSB1bmlmaWVkIGNvbGxlY3Rpb24gaGFzIGJlZW4gZW5hYmxlZAogICAgYm9vbCBoYXNTZXRFbnRyeSwKICApIHsKICAgIGxvZ0V2ZW50KCdMaXRlcmFsU2V0T3JNYXAnKTsKICB9CgogIHZvaWQgaGFuZGxlTGl0ZXJhbE51bGwoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJMaXRlcmFsTnVsbCIpOwogIH0KCiAgdm9pZCBoYW5kbGVOYXRpdmVDbGF1c2UoVG9rZW4gbmF0aXZlVG9rZW4sIGJvb2wgaGFzTmFtZSkgewogICAgbG9nRXZlbnQoIk5hdGl2ZUNsYXVzZSIpOwogIH0KCiAgdm9pZCBoYW5kbGVOYW1lZEFyZ3VtZW50KFRva2VuIGNvbG9uKSB7CiAgICBsb2dFdmVudCgiTmFtZWRBcmd1bWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbk5ld0V4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kTmV3RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk5ld0V4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgaGFuZGxlTm9Bcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJOb0FyZ3VtZW50cyIpOwogIH0KCiAgdm9pZCBoYW5kbGVOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiTm9Db25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyIpOwogIH0KCiAgdm9pZCBoYW5kbGVOb1R5cGUoVG9rZW4gbGFzdENvbnN1bWVkKSB7CiAgICBsb2dFdmVudCgiTm9UeXBlIik7CiAgfQoKICB2b2lkIGhhbmRsZU5vVHlwZVZhcmlhYmxlcyhUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk5vVHlwZVZhcmlhYmxlcyIpOwogIH0KCiAgdm9pZCBoYW5kbGVPcGVyYXRvcihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk9wZXJhdG9yIik7CiAgfQoKICB2b2lkIGhhbmRsZVN5bWJvbFZvaWQoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJTeW1ib2xWb2lkIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBjb25zdHJ1Y3Qgb2YgdGhlIGZvcm0gIm9wZXJhdG9yIDx0b2tlbj4iLgogIHZvaWQgaGFuZGxlT3BlcmF0b3JOYW1lKFRva2VuIG9wZXJhdG9yS2V5d29yZCwgVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJPcGVyYXRvck5hbWUiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIGNvbnN0cnVjdCBvZiB0aGUgZm9ybSAib3BlcmF0b3IgPHRva2VuPiIKICAvLy8gd2hlcmUgPHRva2VuPiBpcyBub3QgYSB2YWxpZCBvcGVyYXRvciB0b2tlbi4KICB2b2lkIGhhbmRsZUludmFsaWRPcGVyYXRvck5hbWUoVG9rZW4gb3BlcmF0b3JLZXl3b3JkLCBUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkludmFsaWRPcGVyYXRvck5hbWUiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGNvbmRpdGlvbiBpbiBhIGNvbnRyb2wgc3RydWN0dXJlOgogIC8vLyAtIGlmIHN0YXRlbWVudAogIC8vLyAtIGRvIHdoaWxlIGxvb3AKICAvLy8gLSBzd2l0Y2ggc3RhdGVtZW50CiAgLy8vIC0gd2hpbGUgbG9vcAogIHZvaWQgaGFuZGxlUGFyZW50aGVzaXplZENvbmRpdGlvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlBhcmVudGhlc2l6ZWRDb25kaXRpb24iKTsKICB9CgogIC8vLyBIYW5kbGUgYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCiAgLy8vIFRoZXNlIG1heSBiZSB3aXRoaW4gdGhlIGNvbmRpdGlvbiBleHByZXNzaW9uIG9mIGEgY29udHJvbCBzdHJ1Y3R1cmUKICAvLy8gYnV0IHdpbGwgbm90IGJlIHRoZSBjb25kaXRpb24gb2YgYSBjb250cm9sIHN0cnVjdHVyZS4KICB2b2lkIGhhbmRsZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiUGFyZW50aGVzaXplZEV4cHJlc3Npb24iKTsKICB9CgogIC8vLyBIYW5kbGUgYSBjb25zdHJ1Y3Qgb2YgdGhlIGZvcm0gImlkZW50aWZpZXIuaWRlbnRpZmllciIgb2NjdXJyaW5nIGluIGEgcGFydAogIC8vLyBvZiB0aGUgZ3JhbW1hciB3aGVyZSBleHByZXNzaW9ucyBpbiBnZW5lcmFsIGFyZSBub3QgYWxsb3dlZC4KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBRdWFsaWZpZWQgaWRlbnRpZmllciAoYmVmb3JlIHRoZSBwZXJpb2QpCiAgLy8vIC0gSWRlbnRpZmllciAoYWZ0ZXIgdGhlIHBlcmlvZCkKICB2b2lkIGhhbmRsZVF1YWxpZmllZChUb2tlbiBwZXJpb2QpIHsKICAgIGxvZ0V2ZW50KCJRdWFsaWZpZWQiKTsKICB9CgogIHZvaWQgaGFuZGxlU3RyaW5nUGFydChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlN0cmluZ1BhcnQiKTsKICB9CgogIHZvaWQgaGFuZGxlU3VwZXJFeHByZXNzaW9uKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBsb2dFdmVudCgiU3VwZXJFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGJlZ2luU3dpdGNoQ2FzZShpbnQgbGFiZWxDb3VudCwgaW50IGV4cHJlc3Npb25Db3VudCwgVG9rZW4gZmlyc3RUb2tlbikge30KCiAgdm9pZCBlbmRTd2l0Y2hDYXNlKAogICAgICBpbnQgbGFiZWxDb3VudCwKICAgICAgaW50IGV4cHJlc3Npb25Db3VudCwKICAgICAgVG9rZW4gZGVmYXVsdEtleXdvcmQsCiAgICAgIFRva2VuIGNvbG9uQWZ0ZXJEZWZhdWx0LAogICAgICBpbnQgc3RhdGVtZW50Q291bnQsCiAgICAgIFRva2VuIGZpcnN0VG9rZW4sCiAgICAgIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiU3dpdGNoQ2FzZSIpOwogIH0KCiAgdm9pZCBoYW5kbGVUaGlzRXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgbG9nRXZlbnQoIlRoaXNFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGhhbmRsZVVuYXJ5UG9zdGZpeEFzc2lnbm1lbnRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiVW5hcnlQb3N0Zml4QXNzaWdubWVudEV4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgaGFuZGxlVW5hcnlQcmVmaXhFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiVW5hcnlQcmVmaXhFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGhhbmRsZVVuYXJ5UHJlZml4QXNzaWdubWVudEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJVbmFyeVByZWZpeEFzc2lnbm1lbnRFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGJlZ2luRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbigpIHt9CgogIHZvaWQgZW5kRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbigpIHsKICAgIGxvZ0V2ZW50KCJGb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGhhbmRsZVZhbHVlZEZvcm1hbFBhcmFtZXRlcihUb2tlbiBlcXVhbHMsIFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiVmFsdWVkRm9ybWFsUGFyYW1ldGVyIik7CiAgfQoKICB2b2lkIGhhbmRsZUZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZSIpOwogIH0KCiAgdm9pZCBoYW5kbGVWb2lkS2V5d29yZChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlZvaWRLZXl3b3JkIik7CiAgfQoKICB2b2lkIGJlZ2luWWllbGRTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kWWllbGRTdGF0ZW1lbnQoVG9rZW4geWllbGRUb2tlbiwgVG9rZW4gc3RhclRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIllpZWxkU3RhdGVtZW50Iik7CiAgfQoKICAvLy8gVGhlIHBhcnNlciBub3RpY2VkIGEgc3ludGF4IGVycm9yLCBidXQgd2FzIGFibGUgdG8gcmVjb3ZlciBmcm9tIGl0LiBUaGUKICAvLy8gZXJyb3Igc2hvdWxkIGJlIHJlcG9ydGVkIHVzaW5nIHRoZSBbbWVzc2FnZV0sIGFuZCB0aGUgY29kZSBiZXR3ZWVuIHRoZQogIC8vLyBiZWdpbm5pbmcgb2YgdGhlIFtzdGFydFRva2VuXSBhbmQgdGhlIGVuZCBvZiB0aGUgW2VuZFRva2VuXSBzaG91bGQgYmUKICAvLy8gaGlnaGxpZ2h0ZWQuIFRoZSBbc3RhcnRUb2tlbl0gYW5kIFtlbmRUb2tlbl0gY2FuIGJlIHRoZSBzYW1lIHRva2VuLgogIHZvaWQgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBUb2tlbiBzdGFydFRva2VuLCBUb2tlbiBlbmRUb2tlbikge30KCiAgLy8vIFRoZSBwYXJzZXIgZW5jb3VudGVyZWQgYW4gW0Vycm9yVG9rZW5dIHJlcHJlc2VudGluZyBhbiBlcnJvcgogIC8vLyBmcm9tIHRoZSBzY2FubmVyIGJ1dCByZWNvdmVyZWQgZnJvbSBpdC4gQnkgZGVmYXVsdCwgdGhlIGVycm9yIGlzIHJlcG9ydGVkCiAgLy8vIGJ5IGNhbGxpbmcgW2hhbmRsZVJlY292ZXJhYmxlRXJyb3JdIHdpdGggdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZAogIC8vLyB3aXRoIHRoZSBlcnJvciBbdG9rZW5dLgogIHZvaWQgaGFuZGxlRXJyb3JUb2tlbihFcnJvclRva2VuIHRva2VuKSB7CiAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKHRva2VuLmFzc2VydGlvbk1lc3NhZ2UsIHRva2VuLCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVVuZXNjYXBlRXJyb3IoCiAgICAgIE1lc3NhZ2UgbWVzc2FnZSwgVG9rZW4gbG9jYXRpb24sIGludCBzdHJpbmdPZmZzZXQsIGludCBsZW5ndGgpIHsKICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IobWVzc2FnZSwgbG9jYXRpb24sIGxvY2F0aW9uKTsKICB9CgogIC8vLyBTaWduYWxzIHRvIHRoZSBsaXN0ZW5lciB0aGF0IHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgY29udGFpbmVkIGEgc2VtYW50aWMKICAvLy8gZXJyb3IgKGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gW21lc3NhZ2VdKS4gVGhpcyBtZXRob2QgY2FuIGFsc28gYmUgY2FsbGVkCiAgLy8vIGFmdGVyIFtoYW5kbGVFeHByZXNzaW9uRnVuY3Rpb25Cb2R5XSwgaW4gd2hpY2ggY2FzZSBpdCBzaWduYWxzIHRoYXQgdGhlCiAgLy8vIGltcGxpY2l0IHJldHVybiBzdGF0ZW1lbnQgb2YgdGhlIGZ1bmN0aW9uIGNvbnRhaW5lZCBhIHNlbWFudGljIGVycm9yLgogIHZvaWQgaGFuZGxlSW52YWxpZFN0YXRlbWVudChUb2tlbiB0b2tlbiwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKG1lc3NhZ2UsIHRva2VuLCB0b2tlbik7CiAgfQoKICB2b2lkIGhhbmRsZVNjcmlwdChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlNjcmlwdCIpOwogIH0KCiAgLy8vIEEgdHlwZSBoYXMgYmVlbiBqdXN0IHBhcnNlZCwgYW5kIHRoZSBwYXJzZXIgbm90aWNlZCB0aGF0IHRoZSBuZXh0IHRva2VuCiAgLy8vIGhhcyBhIHR5cGUgc3Vic3RpdHV0aW9uIGNvbW1lbnQgLyo9VCouIFNvLCB0aGUgdHlwZSB0aGF0IGhhcyBiZWVuIGp1c3QKICAvLy8gcGFyc2VkIHNob3VsZCBiZSBkaXNjYXJkZWQsIGFuZCBhIG5ldyB0eXBlIHNob3VsZCBiZSBwYXJzZWQgaW5zdGVhZC4KICB2b2lkIGRpc2NhcmRUeXBlUmVwbGFjZWRXaXRoQ29tbWVudFR5cGVBc3NpZ24oKSB7fQoKICAvLy8gQSBzaW5nbGUgY29tbWVudCByZWZlcmVuY2UgaGFzIGJlZW4gZm91bmQKICAvLy8gd2hlcmUgW3JlZmVyZW5jZVNvdXJjZV0gaXMgdGhlIHRleHQgYmV0d2VlbiB0aGUgYFtgIGFuZCBgXWAKICAvLy8gYW5kIFtyZWZlcmVuY2VPZmZzZXRdIGlzIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGluIHRoZSB0b2tlbiBzdHJlYW0uCiAgLy8vCiAgLy8vIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBwYXJzZXIgd2hlbiB0aGUgcGFyc2VyJ3MKICAvLy8gYHBhcnNlQ29tbWVudFJlZmVyZW5jZXNgIG1ldGhvZCBpcyBjYWxsZWQuIEZvciBmdXJ0aGVyIHByb2Nlc3NpbmcsCiAgLy8vIGEgbGlzdGVuZXIgbWF5IHNjYW4gdGhlIFtyZWZlcmVuY2VTb3VyY2VdIGFuZCB0aGVuIHBhc3MgdGhlIHJlc3VsdGluZwogIC8vLyB0b2tlbiBzdHJlYW0gdG8gdGhlIHBhcnNlcidzIGBwYXJzZU9uZUNvbW1lbnRSZWZlcmVuY2VgIG1ldGhvZC4KICB2b2lkIGhhbmRsZUNvbW1lbnRSZWZlcmVuY2VUZXh0KFN0cmluZyByZWZlcmVuY2VTb3VyY2UsIGludCByZWZlcmVuY2VPZmZzZXQpIHsKICAgIGxvZ0V2ZW50KCJDb21tZW50UmVmZXJlbmNlVGV4dCIpOwogIH0KCiAgLy8vIEEgc2luZ2xlIGNvbW1lbnQgcmVmZXJlbmNlIGhhcyBiZWVuIHBhcnNlZC4KICAvLy8gKiBbbmV3S2V5d29yZF0gbWF5IGJlIG51bGwuCiAgLy8vICogW3ByZWZpeF0gYW5kIFtwZXJpb2RdIGFyZSBlaXRoZXIgYm90aCB0b2tlbnMgb3IgYm90aCBgbnVsbGAuCiAgLy8vICogW3Rva2VuXSBjYW4gYmUgYW4gaWRlbnRpZmllciBvciBhbiBvcGVyYXRvci4KICAvLy8KICAvLy8gVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgYnkgdGhlIHBhcnNlciB3aGVuIHRoZSBwYXJzZXIncwogIC8vLyBgcGFyc2VPbmVDb21tZW50UmVmZXJlbmNlYCBtZXRob2QgaXMgY2FsbGVkLgogIHZvaWQgaGFuZGxlQ29tbWVudFJlZmVyZW5jZSgKICAgICAgVG9rZW4gbmV3S2V5d29yZCwgVG9rZW4gcHJlZml4LCBUb2tlbiBwZXJpb2QsIFRva2VuIHRva2VuKSB7fQoKICAvLy8gVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgYnkgdGhlIHBhcnNlciB3aGVuIHRoZSBwYXJzZXIncwogIC8vLyBgcGFyc2VPbmVDb21tZW50UmVmZXJlbmNl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cm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnBhcnNlci5wYXJzZXI7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgTWVzc2FnZSwgVGVtcGxhdGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIGFzIGZhc3RhOwoKaW1wb3J0ICcuLi9zY2FubmVyLmRhcnQnIHNob3cgRXJyb3JUb2tlbiwgVG9rZW47CgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcKICAgIHNob3cKICAgICAgICBBU1NJR05NRU5UX1BSRUNFREVOQ0UsCiAgICAgICAgQmVnaW5Ub2tlbiwKICAgICAgICBDQVNDQURFX1BSRUNFREVOQ0UsCiAgICAgICAgRVFVQUxJVFlfUFJFQ0VERU5DRSwKICAgICAgICBLZXl3b3JkLAogICAgICAgIFBPU1RGSVhfUFJFQ0VERU5DRSwKICAgICAgICBSRUxBVElPTkFMX1BSRUNFREVOQ0UsCiAgICAgICAgU0VMRUNUT1JfUFJFQ0VERU5DRSwKICAgICAgICBTeW50aGV0aWNCZWdpblRva2VuLAogICAgICAgIFN5bnRoZXRpY0tleXdvcmRUb2tlbiwKICAgICAgICBTeW50aGV0aWNTdHJpbmdUb2tlbiwKICAgICAgICBTeW50aGV0aWNUb2tlbiwKICAgICAgICBUb2tlblR5cGU7CgppbXBvcnQgJy4uL3NjYW5uZXIvdG9rZW5fY29uc3RhbnRzLmRhcnQnCiAgICBzaG93CiAgICAgICAgQkFOR19FUV9FUV9UT0tFTiwKICAgICAgICBDT01NQV9UT0tFTiwKICAgICAgICBET1VCTEVfVE9LRU4sCiAgICAgICAgRU9GX1RPS0VOLAogICAgICAgIEVRX0VRX0VRX1RPS0VOLAogICAgICAgIEVRX1RPS0VOLAogICAgICAgIEZVTkNUSU9OX1RPS0VOLAogICAgICAgIEhBU0hfVE9LRU4sCiAgICAgICAgSEVYQURFQ0lNQUxfVE9LRU4sCiAgICAgICAgSURFTlRJRklFUl9UT0tFTiwKICAgICAgICBJTlRfVE9LRU4sCiAgICAgICAgS0VZV09SRF9UT0tFTiwKICAgICAgICBMVF9UT0tFTiwKICAgICAgICBPUEVOX0NVUkxZX0JSQUNLRVRfVE9LRU4sCiAgICAgICAgT1BFTl9QQVJFTl9UT0tFTiwKICAgICAgICBPUEVOX1NRVUFSRV9CUkFDS0VUX1RPS0VOLAogICAgICAgIFNFTUlDT0xPTl9UT0tFTiwKICAgICAgICBTVFJJTkdfSU5URVJQT0xBVElPTl9JREVOVElGSUVSX1RPS0VOLAogICAgICAgIFNUUklOR19JTlRFUlBPTEFUSU9OX1RPS0VOLAogICAgICAgIFNUUklOR19UT0tFTjsKCmltcG9ydCAnYXNzZXJ0LmRhcnQnIHNob3cgQXNzZXJ0OwoKaW1wb3J0ICdhc3luY19tb2RpZmllci5kYXJ0JyBzaG93IEFzeW5jTW9kaWZpZXI7CgppbXBvcnQgJ2RpcmVjdGl2ZV9jb250ZXh0LmRhcnQnOwoKaW1wb3J0ICdmb3JtYWxfcGFyYW1ldGVyX2tpbmQuZGFydCcKICAgIHNob3cKICAgICAgICBGb3JtYWxQYXJhbWV0ZXJLaW5kLAogICAgICAgIGlzTWFuZGF0b3J5Rm9ybWFsUGFyYW1ldGVyS2luZCwKICAgICAgICBpc09wdGlvbmFsUG9zaXRpb25hbEZvcm1hbFBhcmFtZXRlcktpbmQ7CgppbXBvcnQgJ2ZvcndhcmRpbmdfbGlzdGVuZXIuZGFydCcgc2hvdyBGb3J3YXJkaW5nTGlzdGVuZXI7CgppbXBvcnQgJ2lkZW50aWZpZXJfY29udGV4dC5kYXJ0JwogICAgc2hvdyBJZGVudGlmaWVyQ29udGV4dCwgbG9va3NMaWtlRXhwcmVzc2lvblN0YXJ0OwoKaW1wb3J0ICdsaXN0ZW5lci5kYXJ0JyBzaG93IExpc3RlbmVyOwoKaW1wb3J0ICdsaXRlcmFsX2VudHJ5X2luZm8uZGFydCcKICAgIHNob3cKICAgICAgICBMaXRlcmFsRW50cnlJbmZvLAogICAgICAgIGNvbXB1dGVMaXRlcmFsRW50cnksCiAgICAgICAgbG9va3NMaWtlTGl0ZXJhbEVudHJ5LAogICAgICAgIHNpbXBsZUVudHJ5OwoKaW1wb3J0ICdsb29wX3N0YXRlLmRhcnQnIHNob3cgTG9vcFN0YXRlOwoKaW1wb3J0ICdtZW1iZXJfa2luZC5kYXJ0JyBzaG93IE1lbWJlcktpbmQ7CgppbXBvcnQgJ21vZGlmaWVyX2NvbnRleHQuZGFydCcgc2hvdyBNb2RpZmllclJlY292ZXJ5Q29udGV4dCwgaXNNb2RpZmllcjsKCmltcG9ydCAncmVjb3ZlcnlfbGlzdGVuZXJzLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3NIZWFkZXJSZWNvdmVyeUxpc3RlbmVyLAogICAgICAgIEltcG9ydFJlY292ZXJ5TGlzdGVuZXIsCiAgICAgICAgTWl4aW5IZWFkZXJSZWNvdmVyeUxpc3RlbmVyOwoKaW1wb3J0ICd0b2tlbl9zdHJlYW1fcmV3cml0ZXIuZGFydCcgc2hvdyBUb2tlblN0cmVhbVJld3JpdGVyOwoKaW1wb3J0ICd0eXBlX2luZm8uZGFydCcKICAgIHNob3cKICAgICAgICBUeXBlSW5mbywKICAgICAgICBUeXBlUGFyYW1PckFyZ0luZm8sCiAgICAgICAgY29tcHV0ZU1ldGhvZFR5cGVBcmd1bWVudHMsCiAgICAgICAgY29tcHV0ZVR5cGUsCiAgICAgICAgY29tcHV0ZVR5cGVQYXJhbU9yQXJnLAogICAgICAgIGlzVmFsaWRUeXBlUmVmZXJlbmNlLAogICAgICAgIG5vVHlwZSwKICAgICAgICBub1R5cGVQYXJhbU9yQXJnOwoKaW1wb3J0ICd1dGlsLmRhcnQnCiAgICBzaG93CiAgICAgICAgZmluZE5vblplcm9MZW5ndGhUb2tlbiwKICAgICAgICBmaW5kUHJldmlvdXNOb25aZXJvTGVuZ3RoVG9rZW4sCiAgICAgICAgaXNMZXR0ZXIsCiAgICAgICAgaXNMZXR0ZXJPckRpZ2l0LAogICAgICAgIGlzT25lT2YsCiAgICAgICAgaXNPbmVPZk9yRW9mLAogICAgICAgIGlzV2hpdGVzcGFjZSwKICAgICAgICBvcHRpb25hbDsKCi8vLyBBbiBldmVudCBnZW5lcmF0aW5nIHBhcnNlciBvZiBEYXJ0IHByb2dyYW1zLiBUaGlzIHBhcnNlciBleHBlY3RzIGFsbCB0b2tlbnMKLy8vIGluIGEgbGlua2VkIGxpc3QgKGFrYSBhIHRva2VuIHN0cmVhbSkuCi8vLwovLy8gVGhlIGNsYXNzIFtTY2FubmVyXSBpcyB1c2VkIHRvIGdlbmVyYXRlIGEgdG9rZW4gc3RyZWFtLiBTZWUgdGhlIGZpbGUKLy8vIFtzY2FubmVyLmRhcnRdKC4uL3NjYW5uZXIuZGFydCkuCi8vLwovLy8gU3ViY2xhc3NlcyBvZiB0aGUgY2xhc3MgW0xpc3RlbmVyXSBhcmUgdXNlZCB0byBsaXN0ZW4gdG8gZXZlbnRzLgovLy8KLy8vIE1vc3QgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGJlbG9uZyBpbiBvbmUgb2YgZm91ciBtYWpvciBjYXRlZ29yaWVzOiBwYXJzZQovLy8gbWV0aG9kcywgcGVlayBtZXRob2RzLCBlbnN1cmUgbWV0aG9kcywgYW5kIHNraXAgbWV0aG9kcy4KLy8vCi8vLyBQYXJzZSBtZXRob2RzIGFsbCBoYXZlIHRoZSBwcmVmaXggYHBhcnNlYCwgZ2VuZXJhdGUgZXZlbnRzCi8vLyAoYnkgY2FsbGluZyBtZXRob2RzIG9uIFtsaXN0ZW5lcl0pLCBhbmQgcmV0dXJuIHRoZSBuZXh0IHRva2VuIHRvIHBhcnNlLgovLy8gU29tZSBleGNlcHRpb25zIHRvIHRoaXMgbGFzdCBwb2ludCBhcmUgbWV0aG9kcyBzdWNoIGFzIFtwYXJzZUZ1bmN0aW9uQm9keV0KLy8vIGFuZCBbcGFyc2VDbGFzc09yTWl4aW5Cb2R5XSB3aGljaCByZXR1cm4gdGhlIGxhc3QgdG9rZW4gcGFyc2VkCi8vLyByYXRoZXIgdGhhbiB0aGUgbmV4dCB0b2tlbiB0byBiZSBwYXJzZWQuCi8vLyBQYXJzZSBtZXRob2RzIGFyZSBnZW5lcmFsbHkgbmFtZWQgYHBhcnNlR3JhbW1hclByb2R1Y3Rpb25TdWZmaXhgLgovLy8gVGhlIHN1ZmZpeCBjYW4gYmUgb25lIG9mIGBvcHRgLCBvciBgc3RhcmAuCi8vLyBgb3B0YCBtZWFucyB6ZXJvIG9yIG9uZSBtYXRjaGVzLCBgc3RhcmAgbWVhbnMgemVybyBvciBtb3JlIG1hdGNoZXMuCi8vLyBGb3IgZXhhbXBsZSwgW3BhcnNlTWV0YWRhdGFTdGFyXSBjb3JyZXNwb25kcyB0byB0aGlzIGdyYW1tYXIgc25pcHBldDoKLy8vIGBtZXRhZGF0YSpgLCBhbmQgW3BhcnNlQXJndW1lbnRzT3B0XSBjb3JyZXNwb25kcyB0bzogYGFyZ3VtZW50cz9gLgovLy8KLy8vIFBlZWsgbWV0aG9kcyBhbGwgaGF2ZSB0aGUgcHJlZml4IGBwZWVrYCwgZG8gbm90IGdlbmVyYXRlIGV2ZW50cwovLy8gKGV4Y2VwdCBmb3IgZXJyb3JzKSBhbmQgbWF5IHJldHVybiBudWxsLgovLy8KLy8vIEVuc3VyZSBtZXRob2RzIGFsbCBoYXZlIHRoZSBwcmVmaXggYGVuc3VyZWAgYW5kIG1heSBnZW5lcmF0ZSBldmVudHMuCi8vLyBUaGV5IHJldHVybiB0aGUgY3VycmVudCB0b2tlbiwgb3IgaW5zZXJ0IGFuZCByZXR1cm4gYSBzeW50aGV0aWMgdG9rZW4KLy8vIGlmIHRoZSBjdXJyZW50IHRva2VuIGRvZXMgbm90IG1hdGNoLiBGb3IgZXhhbXBsZSwKLy8vIFtlbnN1cmVTZW1pY29sb25dIHJldHVybnMgdGhlIGN1cnJlbnQgdG9rZW4gaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYQovLy8gc2VtaWNvbG9uLCBvdGhlcndpc2UgaW5zZXJ0cyBhIHN5bnRoZXRpYyBzZW1pY29sb24gaW4gdGhlIHRva2VuIHN0cmVhbQovLy8gYmVmb3JlIHRoZSBjdXJyZW50IHRva2VuIGFuZCB0aGVuIHJldHVybnMgdGhhdCBuZXcgc3ludGhldGljIHRva2VuLgovLy8KLy8vIFNraXAgbWV0aG9kcyBhcmUgbGlrZSBwYXJzZSBtZXRob2RzLCBidXQgYWxsIGhhdmUgdGhlIHByZWZpeCBgc2tpcGAKLy8vIGFuZCBza2lwIG92ZXIgc29tZSBwYXJ0cyBvZiB0aGUgZmlsZSBiZWluZyBwYXJzZWQuCi8vLyBUeXBpY2FsbHksIHNraXAgbWV0aG9kcyBnZW5lcmF0ZSBhbiBldmVudCBmb3IgdGhlIHN0cnVjdHVyZSBiZWluZyBza2lwcGVkLAovLy8gYnV0IG5vdCBmb3IgaXRzIHN1YnN0cnVjdHVyZXMuCi8vLwovLy8gIyMgQ3VycmVudCBUb2tlbgovLy8KLy8vIFRoZSBjdXJyZW50IHRva2VuIGlzIGFsd2F5cyB0byBiZSBmb3VuZCBpbiBhIGZvcm1hbCBwYXJhbWV0ZXIgbmFtZWQKLy8vIGB0b2tlbmAuIFRoaXMgcGFyYW1ldGVyIHNob3VsZCBiZSB0aGUgZmlyc3QgYXMgdGhpcyBpbmNyZWFzZXMgdGhlIGNoYW5jZQovLy8gdGhhdCBhIGNvbXBpbGVyIHdpbGwgcGxhY2UgaXQgaW4gYSByZWdpc3Rlci4KLy8vCi8vLyAjIyBJbXBsZW1lbnRhdGlvbiBOb3RlcwovLy8KLy8vIFRoZSBwYXJzZXIgYXNzdW1lcyB0aGF0IGtleXdvcmRzLCBidWlsdC1pbiBpZGVudGlmaWVycywgYW5kIG90aGVyIHNwZWNpYWwKLy8vIHdvcmRzIChwc2V1ZG8ta2V5d29yZHMpIGFyZSBhbGwgY2Fub25pY2FsaXplZC4gVG8gZXh0ZW5kIHRoZSBwYXJzZXIgdG8KLy8vIHJlY29nbml6ZSBhIG5ldyBpZGVudGlmaWVyLCBvbmUgc2hvdWxkIG1vZGlmeQovLy8gW2tleXdvcmQuZGFydF0oLi4vc2Nhbm5lci9rZXl3b3JkLmRhcnQpIGFuZCBlbnN1cmUgdGhlIGlkZW50aWZpZXIgaXMgYWRkZWQKLy8vIHRvIHRoZSBrZXl3b3JkIHRhYmxlLgovLy8KLy8vIEFzIGEgY29uc2VxdWVuY2Ugb2YgdGhpcywgb25lIHNob3VsZCBub3QgdXNlIGA9PWAgdG8gY29tcGFyZSBzdHJpbmdzIGluIHRoZQovLy8gcGFyc2VyLiBPbmUgc2hvdWxkIGZhdm9yIHRoZSBtZXRob2RzIFtvcHRpb25hbF0gYW5kIFtleHBlY3RdIHRvIHJlY29nbml6ZQovLy8ga2V5d29yZHMgb3IgaWRlbnRpZmllcnMuIEluIHNvbWUgY2FzZXMsIGl0J3MgcG9zc2libGUgdG8gY29tcGFyZSBhIHRva2VuJ3MKLy8vIGBzdHJpbmdWYWx1ZWAgdXNpbmcgW2lkZW50aWNhbF0sIGJ1dCBub3JtYWxseSBbb3B0aW9uYWxdIHdpbGwgc3VmZmljZS4KLy8vCi8vLyBIaXN0b3JpY2FsbHksIHdlIG92ZXItdXNlZCBpZGVudGljYWwsIGFuZCB3aGVuIGlkZW50aWNhbCBpcyB1c2VkIG9uIG9iamVjdHMKLy8vIG90aGVyIHRoYW4gc3RyaW5ncywgaXQgY2FuIG9mdGVuIGJlIHJlcGxhY2VkIGJ5IGA9PWAuCi8vLwovLy8gIyMgRmxleGliaWxpdHksIEV4dGVuc2liaWxpdHksIGFuZCBTcGVjaWZpY2F0aW9uCi8vLwovLy8gVGhlIHBhcnNlciBpcyBkZXNpZ25lZCB0byBiZSBmbGV4aWJsZSBhbmQgZXh0ZW5zaWJsZS4gSXRzIG1ldGhvZHMgYXJlCi8vLyBkZXNpZ25lZCB0byBiZSBvdmVycmlkZGVuIGluIHN1YmNsYXNzZXMsIHNvIGl0IGNhbiBiZSBleHRlbmRlZCB0byBoYW5kbGUKLy8vIHVuc3BlY2lmaWVkIGxhbmd1YWdlIGV4dGVuc2lvbiBvciBleHBlcmltZW50cyB3aGlsZSBldmVyeXRoaW5nIGluIHRoaXMgZmlsZQovLy8gYXR0ZW1wdHMgdG8gZm9sbG93IHRoZSBzcGVjaWZpY2F0aW9uICh1bmxlc3Mgd2hlbiBpdCBpbnRlcmZlcmVzIHdpdGggZXJyb3IKLy8vIHJlY292ZXJ5KS4KLy8vCi8vLyBXZSBhY2hpZXZlIGZsZXhpYmlsaXR5LCBleHRlbnNpYmxlLCBhbmQgc3BlY2lmaWNhdGlvbiBjb21wbGlhbmNlIGJ5Ci8vLyBmb2xsb3dpbmcgYSBmZXcgcnVsZXMtb2YtdGh1bWI6Ci8vLwovLy8gMS4gQWxsIG1ldGhvZHMgaW4gdGhlIHBhcnNlciBzaG91bGQgYmUgcHVibGljLgovLy8KLy8vIDIuIFRoZSBtZXRob2RzIGZvbGxvdyB0aGUgc3BlY2lmaWVkIGdyYW1tYXIsIGFuZCBkbyBub3QgaW1wbGVtZW50IGN1c3RvbQovLy8gZXh0ZW5zaW9ucywgZm9yIGV4YW1wbGUsIGBuYXRpdmVgLgovLy8KLy8vIDMuIFRoZSBwYXJzZXIgZG9lc24ndCByZXdyaXRlIHRoZSB0b2tlbiBzdHJlYW0gKHdoZW4gZGVhbGluZyB3aXRoIGA+PmApLgovLy8KLy8vICMjIyBJbXBsZW1lbnRpbmcgRXh0ZW5zaW9ucwovLy8KLy8vIEZvciB2YXJpb3VzIHJlYXNvbnMsIHNvbWUgRGFydCBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbnMgaGF2ZSB1c2VkCi8vLyBjdXN0b20vdW5zcGVjaWZpZWQgZXh0ZW5zaW9ucyB0byB0aGUgRGFydCBncmFtbWFyLiBFeGFtcGxlcyBvZiB0aGlzCi8vLyBpbmNsdWRlcyBkaWV0IHBhcnNpbmcsIHBhdGNoIGZpbGVzLCBgbmF0aXZlYCBrZXl3b3JkLCBhbmQgZ2VuZXJpYwovLy8gY29tbWVudHMuIFRoaXMgY2xhc3MgaXNuJ3Qgc3VwcG9zZWQgdG8gaW1wbGVtZW50IGFueSBvZiB0aGVzZQovLy8gZmVhdHVyZXMuIEluc3RlYWQgaXQgcHJvdmlkZXMgaG9va3MgZm9yIHRob3NlIGV4dGVuc2lvbnMgdG8gYmUgaW1wbGVtZW50ZWQKLy8vIGluIHN1YmNsYXNzZXMgb3IgbGlzdGVuZXJzLiBMZXQncyBleGFtaW5lIGhvdyBkaWV0IHBhcnNpbmcgYW5kIGBuYXRpdmVgCi8vLyBrZXl3b3JkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgRmFzdGEuCi8vLwovLy8gIyMjIyBMZWdhY3kgSW1wbGVtZW50YXRpb24gb2YgYG5hdGl2ZWAgS2V5d29yZAovLy8KLy8vIFRPRE8oYWhlLGRhbnJ1YmVsKTogUmVtb3ZlIHRoaXMgc2VjdGlvbi4KLy8vCi8vLyBCb3RoIGRhcnQyanMgYW5kIHRoZSBEYXJ0IFZNIGhhdmUgdXNlZCB0aGUgYG5hdGl2ZWAga2V5d29yZCB0byBtYXJrIG1ldGhvZHMKLy8vIHRoYXQgY291bGRuJ3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIERhcnQgbGFuZ3VhZ2UgYW5kIG5lZWRlZCB0byBiZQovLy8gaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCBvciBDKyssIHJlc3BlY3RpdmVseS4gQW4gZXhhbXBsZSBvZiB0aGUgc3ludGF4Ci8vLyBleHRlbnNpb24gdXNlZCBieSB0aGUgRGFydCBWTSBpczoKLy8vCi8vLyAgICAgbmF0aXZlRnVuY3Rpb24oKSBuYXRpdmUgIk5hdGl2ZUZ1bmN0aW9uIjsKLy8vCi8vLyBXaGVuIGF0dGVtcHRpbmcgdG8gcGFyc2UgdGhpcyBmdW5jdGlvbiwgdGhlIHBhcnNlciBldmVudHVhbGx5IGNhbGxzCi8vLyBbcGFyc2VGdW5jdGlvbkJvZHldLiBUaGlzIG1ldGhvZCB3aWxsIHJlcG9ydCBhbiB1bnJlY292ZXJhYmxlIGVycm9yIHRvIHRoZQovLy8gbGlzdGVuZXIgd2l0aCB0aGUgY29kZSBbZmFzdGEubWVzc2FnZUV4cGVjdGVkRnVuY3Rpb25Cb2R5XS4gVGhlIGxpc3RlbmVyIGNhbgovLy8gdGhlbiBsb29rIGF0IHRoZSBlcnJvciBjb2RlIGFuZCB0aGUgdG9rZW4gYW5kIHVzZSB0aGUgbWV0aG9kcyBpbgovLy8gW25hdGl2ZV9zdXBwb3J0LmRhcnRdKG5hdGl2ZV9zdXBwb3J0LmRhcnQpIHRvIHBhcnNlIHRoZSBuYXRpdmUgc3ludGF4LgovLy8KLy8vICMjIyMgSW1wbGVtZW50YXRpb24gb2YgRGlldCBQYXJzaW5nCi8vLwovLy8gV2UgY2FsbCBpdCBfZGlldF8gX3BhcnNpbmdfIHdoZW4gdGhlIHBhcnNlciBza2lwcyBwYXJ0cyBvZiBhIGZpbGUuIEJvdGgKLy8vIGRhcnQyanMgYW5kIHRoZSBEYXJ0IFZNIGhhdmUgYmVlbiByZWx5aW5nIG9uIHRoaXMgZnJvbSBlYXJseSBvbiBhcyBpdCBhbGxvd3MKLy8vIHRoZW0gdG8gbW9yZSBxdWlja2x5IGNvbXBpbGUgc21hbGwgcHJvZ3JhbXMgdGhhdCB1c2Ugc21hbGwgcGFydHMgb2YgYmlnCi8vLyBsaWJyYXJpZXMuIEl0J3MgYWxzbyBiZWNvbWUgYW4gaW50ZWdyYXRlZCBwYXJ0IG9mIGhvdyBGYXN0YSBidWlsZHMgdXAKLy8vIG91dGxpbmVzIGJlZm9yZSBzdGFydGluZyB0byBwYXJzZSBtZXRob2QgYm9kaWVzLgovLy8KLy8vIFdoZW4gbG9va2luZyB0aHJvdWdoIHRoaXMgcGFyc2VyLCB5b3UnbGwgZmluZCBhIG51bWJlciBvZiB1bnVzZWQgbWV0aG9kcwovLy8gc3RhcnRpbmcgd2l0aCBgc2tpcGAuIFRoZXNlIG1ldGhvZHMgYXJlIG9ubHkgdXNlZCBieSBzdWJjbGFzc2VzLCBzdWNoIGFzCi8vLyBbQ2xhc3NNZW1iZXJQYXJzZXJdKGNsYXNzX21lbWJlcl9wYXJzZXIuZGFydCkgYW5kCi8vLyBbVG9wTGV2ZWxQYXJzZXJdKHRvcF9sZXZlbF9wYXJzZXIuZGFydCkuIFRoZXNlIG1ldGhvZHMgdmlvbGF0ZSB0aGUKLy8vIHByaW5jaXBsZSBhYm92ZSBhYm91dCBmb2xsb3dpbmcgdGhlIHNwZWNpZmllZCBncmFtbWFyLCBhbmQgb3JpZ2luYWxseSBsaXZlZAovLy8gaW4gc3ViY2xhc3Nlcy4gSG93ZXZlciwgd2UgcmVhbGl6ZWQgdGhhdCB0aGVzZSBtZXRob2RzIHdlcmUgc28gd2lkZWx5IHVzZWQKLy8vIGFuZCBoYXJkIHRvIG1haW50YWluIGluIHN1YmNsYXNzZXMsIHRoYXQgaXQgbWFkZSBzZW5zZSB0byBtb3ZlIHRoZW0gaGVyZS4KLy8vCi8vLyAjIyMgU3BlY2lmaWNhdGlvbiBhbmQgRXJyb3IgUmVjb3ZlcnkKLy8vCi8vLyBUbyBpbXByb3ZlIGVycm9yIHJlY292ZXJ5LCB0aGUgcGFyc2VyIHdpbGwgaW5mb3JtIHRoZSBsaXN0ZW5lciBvZgovLy8gcmVjb3ZlcmFibGUgZXJyb3JzIGFuZCBjb250aW51ZSB0byBwYXJzZS4gIEFuIGV4YW1wbGUgb2YgYSByZWNvdmVyYWJsZQovLy8gZXJyb3IgaXM6Ci8vLwovLy8gICAgIEVycm9yOiBBc3luY2hyb25vdXMgZm9yLWxvb3AgY2FuIG9ubHkgYmUgdXNlZCBpbiAnYXN5bmMnIG9yICdhc3luYyonLi4uCi8vLyAgICAgbWFpbigpIHsgYXdhaXQgZm9yICh2YXIgeCBpbiBbXSkge30gfQovLy8gICAgICAgICAgICAgIF5eXl5eCi8vLwovLy8gIyMjIExlZ2FjeSBFcnJvciBSZWNvdmVyeQovLy8KLy8vIFdoYXQncyBkZXNjcmliZWQgYmVsb3cgd2lsbCBiZSBwaGFzZWQgb3V0IGluIHByZWZlcmVuY2Ugb2YgdGhlIHBhcnNlcgovLy8gcmVwb3J0aW5nIGFuZCByZWNvdmVyaW5nIGZyb20gc3ludGF4IGVycm9ycy4gVGhlIG1vdGl2YXRpb24gZm9yIHRoaXMgaXMKLy8vIHRoYXQgd2UgaGF2ZSBtdWx0aXBsZSBsaXN0ZW5lcnMgdGhhdCB1c2UgdGhlIHBhcnNlciwgYW5kIHRoaXMgd2lsbCBlbnN1cmUKLy8vIGNvbnNpc3RlbmN5LgovLy8KLy8vIEZvciB1bnJlY292ZXJhYmxlIGVycm9ycywgdGhlIHBhcnNlciB3aWxsIGFzayB0aGUgbGlzdGVuZXIgZm9yIGhlbHAgdG8KLy8vIHJlY292ZXIgZnJvbSB0aGUgZXJyb3IuIFdlIGhhdmVuJ3QgbWFkZSBtdWNoIHByb2dyZXNzIG9uIHRoZXNlIGtpbmRzIG9mCi8vLyBlcnJvcnMsIHNvIGluIG1vc3QgY2FzZXMsIHRoZSBwYXJzZXIgYWJvcnRzIGJ5IHNraXBwaW5nIHRvIHRoZSBlbmQgb2YgZmlsZS4KLy8vCi8vLyBIaXN0b3JpY2FsbHksIHRoaXMgcGFyc2VyIGhhcyBiZWVuIHJhdGhlciBsYXggaW4gd2hhdCBpdCBhbGxvd3MsIGFuZAovLy8gZGVmZXJyZWQgdGhlIGVuZm9yY2VtZW50IG9mIHNvbWUgc3ludGFjdGljYWwgcnVsZXMgdG8gc3Vic2VxdWVudCBwaGFzZXMuIEl0Ci8vLyBkb2Vzbid0IG1hdHRlciBob3cgd2UgZ290IHRoZXJlLCBvbmx5IHRoYXQgd2UndmUgaWRlbnRpZmllZCB0aGF0IGl0J3MKLy8vIGVhc2llciBpZiB0aGUgcGFyc2VyIHJlcG9ydHMgYXMgbWFueSBlcnJvcnMgaXQgY2FuLCBidXQgaW5mb3JtcyB0aGUKLy8vIGxpc3RlbmVyIGlmIHRoZSBlcnJvciBpcyByZWNvdmVyYWJsZSBvciBub3QuCmNsYXNzIFBhcnNlciB7CiAgTGlzdGVuZXIgbGlzdGVuZXI7CgogIFVyaSBnZXQgdXJpID0+IGxpc3RlbmVyLnVyaTsKCiAgYm9vbCBtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMgPSB0cnVlOwoKICAvLy8gUmVwcmVzZW50cyBwYXJzZXIgc3RhdGU6IHdoYXQgYXN5bmNocm9ub3VzIHN5bnRheCBpcyBhbGxvd2VkIGluIHRoZQogIC8vLyBmdW5jdGlvbiBiZWluZyBjdXJyZW50bHkgcGFyc2VkLiBJbiByYXJlIHNpdHVhdGlvbnMsIHRoaXMgY2FuIGJlIHNldCBieQogIC8vLyBleHRlcm5hbCBjbGllbnRzLCBmb3IgZXhhbXBsZSwgdG8gcGFyc2UgYW4gZXhwcmVzc2lvbiBvdXRzaWRlIGEgZnVuY3Rpb24uCiAgQXN5bmNNb2RpZmllciBhc3luY1N0YXRlID0gQXN5bmNNb2RpZmllci5TeW5jOwoKICAvLyBUT0RPKGRhbnJ1YmVsKTogVGhlIFtsb29wU3RhdGVdIGFuZCBhc3NvY2lhdGVkIGZ1bmN0aW9uYWxpdHkgaW4gdGhlCiAgLy8gW1BhcnNlcl0gZHVwbGljYXRlcyB3b3JrIHRoYXQgdGhlIHJlc29sdmVyIG5lZWRzIHRvIGRvIHdoZW4gcmVzb2x2aW5nCiAgLy8gYnJlYWsvY29udGludWUgdGFyZ2V0cy4gTG9uZyB0ZXJtLCB0aGlzIHN0YXRlIGFuZCBmdW5jdGlvbmFsaXR5IHdpbGwgYmUKICAvLyByZW1vdmVkIGZyb20gdGhlIFtQYXJzZXJdIGNsYXNzIGFuZCB0aGUgcmVzb2x2ZXIgd2lsbCBiZSByZXNwb25zaWJsZQogIC8vIGZvciBnZW5lcmF0aW5nIGFsbCBicmVhay9jb250aW51ZSBlcnJvciBtZXNzYWdlcy4KCiAgLy8vIFJlcHJlc2VudHMgcGFyc2VyIHN0YXRlOiB3aGV0aGVyIHBhcnNpbmcgb3V0c2lkZSBhIGxvb3AsCiAgLy8vIGluc2lkZSBhIGxvb3AsIG9yIGluc2lkZSBhIHN3aXRjaC4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyCiAgLy8vIGJyZWFrIGFuZCBjb250aW51ZSBzdGF0ZW1lbnRzIGFyZSBhbGxvd2VkLgogIExvb3BTdGF0ZSBsb29wU3RhdGUgPSBMb29wU3RhdGUuT3V0c2lkZUxvb3A7CgogIC8vLyBBIHJld3JpdGVyIGZvciBpbnNlcnRpbmcgc3ludGhldGljIHRva2Vucy4KICAvLy8gQWNjZXNzIHVzaW5nIFtyZXdyaXRlcl0gZm9yIGxhenkgaW5pdGlhbGl6YXRpb24uCiAgVG9rZW5TdHJlYW1SZXdyaXRlciBjYWNoZWRSZXdyaXRlcjsKCiAgVG9rZW5TdHJlYW1SZXdyaXRlciBnZXQgcmV3cml0ZXIgewogICAgY2FjaGVkUmV3cml0ZXIgPz89IG5ldyBUb2tlblN0cmVhbVJld3JpdGVyKCk7CiAgICByZXR1cm4gY2FjaGVkUmV3cml0ZXI7CiAgfQoKICBQYXJzZXIodGhpcy5saXN0ZW5lcik7CgogIGJvb2wgZ2V0IGluR2VuZXJhdG9yIHsKICAgIHJldHVybiBhc3luY1N0YXRlID09IEFzeW5jTW9kaWZpZXIuQXN5bmNTdGFyIHx8CiAgICAgICAgYXN5bmNTdGF0ZSA9PSBBc3luY01vZGlmaWVyLlN5bmNTdGFyOwogIH0KCiAgYm9vbCBnZXQgaW5Bc3luYyB7CiAgICByZXR1cm4gYXN5bmNTdGF0ZSA9PSBBc3luY01vZGlmaWVyLkFzeW5jIHx8CiAgICAgICAgYXN5bmNTdGF0ZSA9PSBBc3luY01vZGlmaWVyLkFzeW5jU3RhcjsKICB9CgogIGJvb2wgZ2V0IGluUGxhaW5TeW5jID0+IGFzeW5jU3RhdGUgPT0gQXN5bmNNb2RpZmllci5TeW5jOwoKICBib29sIGdldCBpc0JyZWFrQWxsb3dlZCA9PiBsb29wU3RhdGUgIT0gTG9vcFN0YXRlLk91dHNpZGVMb29wOwoKICBib29sIGdldCBpc0NvbnRpbnVlQWxsb3dlZCA9PiBsb29wU3RhdGUgPT0gTG9vcFN0YXRlLkluc2lkZUxvb3A7CgogIGJvb2wgZ2V0IGlzQ29udGludWVXaXRoTGFiZWxBbGxvd2VkID0+IGxvb3BTdGF0ZSAhPSBMb29wU3RhdGUuT3V0c2lkZUxvb3A7CgogIC8vLyBQYXJzZSBhIGNvbXBpbGF0aW9uIHVuaXQuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIHBhcnNlci4gQXMgYSByZXN1bHQsIHRoaXMKICAvLy8gbWV0aG9kIHRha2VzIHRoZSBuZXh0IHRva2VuIHRvIGJlIGNvbnN1bWVkIHJhdGhlciB0aGFuIHRoZSBsYXN0IGNvbnN1bWVkCiAgLy8vIHRva2VuIGFuZCByZXR1cm5zIHRoZSB0b2tlbiBhZnRlciB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbiByYXRoZXIgdGhhbiB0aGUKICAvLy8gbGFzdCBjb25zdW1lZCB0b2tlbi4KICAvLy8KICAvLy8gYGBgCiAgLy8vIGxpYnJhcnlEZWZpbml0aW9uOgogIC8vLyAgIHNjcmlwdFRhZz8KICAvLy8gICBsaWJyYXJ5TmFtZT8KICAvLy8gICBpbXBvcnRPckV4cG9ydCoKICAvLy8gICBwYXJ0RGlyZWN0aXZlKgogIC8vLyAgIHRvcExldmVsRGVmaW5pdGlvbioKICAvLy8gOwogIC8vLwogIC8vLyBwYXJ0RGVjbGFyYXRpb246CiAgLy8vICAgcGFydEhlYWRlciB0b3BMZXZlbERlZmluaXRpb24qCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VVbml0KFRva2VuIHRva2VuKSB7CiAgICAvLyBTa2lwIG92ZXIgZXJyb3IgdG9rZW5zIGFuZCByZXBvcnQgdGhlbSBhdCB0aGUgZW5kCiAgICAvLyBzbyB0aGF0IHRoZSBwYXJzZXIgaGFzIHRoZSBjaGFuY2UgdG8gYWRqdXN0IHRoZSBlcnJvciBsb2NhdGlvbi4KICAgIFRva2VuIGVycm9yVG9rZW4gPSB0b2tlbjsKICAgIHRva2VuID0gc2tpcEVycm9yVG9rZW5zKGVycm9yVG9rZW4pOwoKICAgIGxpc3RlbmVyLmJlZ2luQ29tcGlsYXRpb25Vbml0KHRva2VuKTsKICAgIGludCBjb3VudCA9IDA7CiAgICBEaXJlY3RpdmVDb250ZXh0IGRpcmVjdGl2ZVN0YXRlID0gbmV3IERpcmVjdGl2ZUNvbnRleHQoKTsKICAgIHRva2VuID0gc3ludGhldGljUHJldmlvdXNUb2tlbih0b2tlbik7CiAgICBpZiAoaWRlbnRpY2FsKHRva2VuLm5leHQudHlwZSwgVG9rZW5UeXBlLlNDUklQVF9UQUcpKSB7CiAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja1NjcmlwdFRhZyh0aGlzLCB0b2tlbi5uZXh0KTsKICAgICAgdG9rZW4gPSBwYXJzZVNjcmlwdCh0b2tlbik7CiAgICB9CiAgICB3aGlsZSAoIXRva2VuLm5leHQuaXNFb2YpIHsKICAgICAgZmluYWwgVG9rZW4gc3RhcnQgPSB0b2tlbi5uZXh0OwogICAgICB0b2tlbiA9IHBhcnNlVG9wTGV2ZWxEZWNsYXJhdGlvbkltcGwodG9rZW4sIGRpcmVjdGl2ZVN0YXRlKTsKICAgICAgbGlzdGVuZXIuZW5kVG9wTGV2ZWxEZWNsYXJhdGlvbih0b2tlbi5uZXh0KTsKICAgICAgY291bnQrKzsKICAgICAgaWYgKHN0YXJ0ID09IHRva2VuLm5leHQpIHsKICAgICAgICAvLyBSZWNvdmVyeToKICAgICAgICAvLyBJZiBwcm9ncmVzcyBoYXMgbm90IGJlZW4gbWFkZSByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSB0b2tlbiBzdHJlYW0sCiAgICAgICAgLy8gdGhlbiByZXBvcnQgYW4gZXJyb3IgYW5kIHNraXAgdGhlIGN1cnJlbnQgdG9rZW4uCiAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICAgIGxpc3RlbmVyLmJlZ2luTWV0YWRhdGFTdGFyKHRva2VuKTsKICAgICAgICBsaXN0ZW5lci5lbmRNZXRhZGF0YVN0YXIoMCk7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgdG9rZW4sIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWREZWNsYXJhdGlvbik7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb24odG9rZW4pOwogICAgICAgIGxpc3RlbmVyLmVuZFRvcExldmVsRGVjbGFyYXRpb24odG9rZW4ubmV4dCk7CiAgICAgICAgY291bnQrKzsKICAgICAgfQogICAgfQogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgcmVwb3J0QWxsRXJyb3JUb2tlbnMoZXJyb3JUb2tlbik7CiAgICBsaXN0ZW5lci5lbmRDb21waWxhdGlvblVuaXQoY291bnQsIHRva2VuKTsKICAgIC8vIENsZWFyIGZpZWxkcyB0aGF0IGNvdWxkIGxlYWQgdG8gbWVtb3J5IGxlYWsuCiAgICBjYWNoZWRSZXdyaXRlciA9IG51bGw7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gVGhpcyBtZXRob2QgZXhpc3RzIGZvciBhbmFseXplciBjb21wYXRpYmlsaXR5IG9ubHkKICAvLy8gYW5kIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIGFuYWx5emVyL2Zhc3RhIGludGVncmF0aW9uIGlzIGNvbXBsZXRlLgogIC8vLwogIC8vLyBTaW1pbGFyIHRvIFtwYXJzZVVuaXRdLCB0aGlzIG1ldGhvZCBwYXJzZXMgYSBjb21waWxhdGlvbiB1bml0LAogIC8vLyBidXQgc3RvcHMgd2hlbiBpdCByZWFjaGVzIHRoZSBmaXJzdCBkZWNsYXJhdGlvbiBvciBFT0YuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIHBhcnNlci4gQXMgYSByZXN1bHQsIHRoaXMKICAvLy8gbWV0aG9kIHRha2VzIHRoZSBuZXh0IHRva2VuIHRvIGJlIGNvbnN1bWVkIHJhdGhlciB0aGFuIHRoZSBsYXN0IGNvbnN1bWVkCiAgLy8vIHRva2VuIGFuZCByZXR1cm5zIHRoZSB0b2tlbiBhZnRlciB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbiByYXRoZXIgdGhhbiB0aGUKICAvLy8gbGFzdCBjb25zdW1lZCB0b2tlbi4KICBUb2tlbiBwYXJzZURpcmVjdGl2ZXMoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyLmJlZ2luQ29tcGlsYXRpb25Vbml0KHRva2VuKTsKICAgIGludCBjb3VudCA9IDA7CiAgICBEaXJlY3RpdmVDb250ZXh0IGRpcmVjdGl2ZVN0YXRlID0gbmV3IERpcmVjdGl2ZUNvbnRleHQoKTsKICAgIHRva2VuID0gc3ludGhldGljUHJldmlvdXNUb2tlbih0b2tlbik7CiAgICB3aGlsZSAoIXRva2VuLm5leHQuaXNFb2YpIHsKICAgICAgZmluYWwgVG9rZW4gc3RhcnQgPSB0b2tlbi5uZXh0OwogICAgICBmaW5hbCBTdHJpbmcgbmV4dFZhbHVlID0gc3RhcnQubmV4dC5zdHJpbmdWYWx1ZTsKCiAgICAgIC8vIElmIGEgYnVpbHQtaW4ga2V5d29yZCBpcyBiZWluZyB1c2VkIGFzIGZ1bmN0aW9uIG5hbWUsIHRoZW4gc3RvcC4KICAgICAgaWYgKGlkZW50aWNhbChuZXh0VmFsdWUsICcuJykgfHwKICAgICAgICAgIGlkZW50aWNhbChuZXh0VmFsdWUsICc8JykgfHwKICAgICAgICAgIGlkZW50aWNhbChuZXh0VmFsdWUsICcoJykpIHsKICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgaWYgKGlkZW50aWNhbCh0b2tlbi5uZXh0LnR5cGUsIFRva2VuVHlwZS5TQ1JJUFRfVEFHKSkgewogICAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja1NjcmlwdFRhZyh0aGlzLCB0b2tlbi5uZXh0KTsKICAgICAgICB0b2tlbiA9IHBhcnNlU2NyaXB0KHRva2VuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbiA9IHBhcnNlTWV0YWRhdGFTdGFyKHRva2VuKTsKICAgICAgICBUb2tlbiBrZXl3b3JkID0gdG9rZW4ubmV4dDsKICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBrZXl3b3JkLnN0cmluZ1ZhbHVlOwogICAgICAgIGlmIChpZGVudGljYWwodmFsdWUsICdpbXBvcnQnKSkgewogICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrSW1wb3J0KHRoaXMsIGtleXdvcmQpOwogICAgICAgICAgdG9rZW4gPSBwYXJzZUltcG9ydChrZXl3b3JkKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2V4cG9ydCcpKSB7CiAgICAgICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tFeHBvcnQodGhpcywga2V5d29yZCk7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlRXhwb3J0KGtleXdvcmQpOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnbGlicmFyeScpKSB7CiAgICAgICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tMaWJyYXJ5KHRoaXMsIGtleXdvcmQpOwogICAgICAgICAgdG9rZW4gPSBwYXJzZUxpYnJhcnlOYW1lKGtleXdvcmQpOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAncGFydCcpKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlUGFydE9yUGFydE9mKGtleXdvcmQsIGRpcmVjdGl2ZVN0YXRlKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJzsnKSkgewogICAgICAgICAgdG9rZW4gPSBzdGFydDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGlzdGVuZXIuaGFuZGxlRGlyZWN0aXZlc09ubHkoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBsaXN0ZW5lci5lbmRUb3BMZXZlbERlY2xhcmF0aW9uKHRva2VuLm5leHQpOwogICAgfQogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgbGlzdGVuZXIuZW5kQ29tcGlsYXRpb25Vbml0KGNvdW50LCB0b2tlbik7CiAgICAvLyBDbGVhciBmaWVsZHMgdGhhdCBjb3VsZCBsZWFkIHRvIG1lbW9yeSBsZWFrLgogICAgY2FjaGVkUmV3cml0ZXIgPSBudWxsOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlIGEgdG9wLWxldmVsIGRlY2xhcmF0aW9uLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBwYXJzZXIuIEFzIGEgcmVzdWx0LCB0aGlzCiAgLy8vIG1ldGhvZCB0YWtlcyB0aGUgbmV4dCB0b2tlbiB0byBiZSBjb25zdW1lZCByYXRoZXIgdGhhbiB0aGUgbGFzdCBjb25zdW1lZAogIC8vLyB0b2tlbiBhbmQgcmV0dXJucyB0aGUgdG9rZW4gYWZ0ZXIgdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4gcmF0aGVyIHRoYW4gdGhlCiAgLy8vIGxhc3QgY29uc3VtZWQgdG9rZW4uCiAgVG9rZW4gcGFyc2VUb3BMZXZlbERlY2xhcmF0aW9uKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9CiAgICAgICAgcGFyc2VUb3BMZXZlbERlY2xhcmF0aW9uSW1wbChzeW50aGV0aWNQcmV2aW91c1Rva2VuKHRva2VuKSwgbnVsbCkubmV4dDsKICAgIGxpc3RlbmVyLmVuZFRvcExldmVsRGVjbGFyYXRpb24odG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyB0b3BMZXZlbERlZmluaXRpb246CiAgLy8vICAgY2xhc3NEZWZpbml0aW9uIHwKICAvLy8gICBlbnVtVHlwZSB8CiAgLy8vICAgdHlwZUFsaWFzIHwKICAvLy8gICAnZXh0ZXJuYWwnPyBmdW5jdGlvblNpZ25hdHVyZSAnOycgfAogIC8vLyAgICdleHRlcm5hbCc/IGdldHRlclNpZ25hdHVyZSAnOycgfAogIC8vLyAgICdleHRlcm5hbCcnPyBzZXR0ZXJTaWduYXR1cmUgJzsnIHwKICAvLy8gICBmdW5jdGlvblNpZ25hdHVyZSBmdW5jdGlvbkJvZHkgfAogIC8vLyAgIHJldHVyblR5cGU/ICdnZXQnIGlkZW50aWZpZXIgZnVuY3Rpb25Cb2R5IHwKICAvLy8gICByZXR1cm5UeXBlPyAnc2V0JyBpZGVudGlmaWVyIGZvcm1hbFBhcmFtZXRlckxpc3QgZnVuY3Rpb25Cb2R5IHwKICAvLy8gICAoJ2ZpbmFsJyB8ICdjb25zdCcpIHR5cGU/IHN0YXRpY0ZpbmFsRGVjbGFyYXRpb25MaXN0ICc7JyB8CiAgLy8vICAgdmFyaWFibGVEZWNsYXJhdGlvbiAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVRvcExldmVsRGVjbGFyYXRpb25JbXBsKAogICAgICBUb2tlbiB0b2tlbiwgRGlyZWN0aXZlQ29udGV4dCBkaXJlY3RpdmVTdGF0ZSkgewogICAgdG9rZW4gPSBwYXJzZU1ldGFkYXRhU3Rhcih0b2tlbik7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChuZXh0LmlzVG9wTGV2ZWxLZXl3b3JkKSB7CiAgICAgIHJldHVybiBwYXJzZVRvcExldmVsS2V5d29yZERlY2xhcmF0aW9uKHRva2VuLCBuZXh0LCBkaXJlY3RpdmVTdGF0ZSk7CiAgICB9CiAgICBUb2tlbiBzdGFydCA9IHRva2VuOwogICAgLy8gU2tpcCBtb2RpZmllcnMgdG8gZmluZCBhIHRvcCBsZXZlbCBrZXl3b3JkIG9yIGlkZW50aWZpZXIKICAgIGlmIChuZXh0LmlzTW9kaWZpZXIpIHsKICAgICAgaWYgKG9wdGlvbmFsKCd2YXInLCBuZXh0KSB8fAogICAgICAgICAgb3B0aW9uYWwoJ2xhdGUnLCBuZXh0KSB8fAogICAgICAgICAgKChvcHRpb25hbCgnY29uc3QnLCBuZXh0KSB8fCBvcHRpb25hbCgnZmluYWwnLCBuZXh0KSkgJiYKICAgICAgICAgICAgICAvLyBJZ25vcmUgYGNvbnN0IGNsYXNzYCBhbmQgYGZpbmFsIGNsYXNzYCBzbyB0aGF0IGl0IGlzIHJlcG9ydGVkCiAgICAgICAgICAgICAgLy8gYmVsb3cgYXMgYW4gaW52YWxpZCBtb2RpZmllciBvbiBhIGNsYXNzLgogICAgICAgICAgICAgICFvcHRpb25hbCgnY2xhc3MnLCBuZXh0Lm5leHQpKSkgewogICAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja0RlY2xhcmF0aW9uKCk7CiAgICAgICAgcmV0dXJuIHBhcnNlVG9wTGV2ZWxNZW1iZXJJbXBsKHRva2VuKTsKICAgICAgfQogICAgICB3aGlsZSAodG9rZW4ubmV4dC5pc01vZGlmaWVyKSB7CiAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICB9CiAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChuZXh0LmlzVG9wTGV2ZWxLZXl3b3JkKSB7CiAgICAgIHJldHVybiBwYXJzZVRvcExldmVsS2V5d29yZERlY2xhcmF0aW9uKHN0YXJ0LCBuZXh0LCBkaXJlY3RpdmVTdGF0ZSk7CiAgICB9IGVsc2UgaWYgKG5leHQuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBpbXByb3ZlIHBhcnNlVG9wTGV2ZWxNZW1iZXIKICAgICAgLy8gc28gdGhhdCB3ZSBkb24ndCBwYXJzZSBtb2RpZmllcnMgdHdpY2UuCiAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja0RlY2xhcmF0aW9uKCk7CiAgICAgIHJldHVybiBwYXJzZVRvcExldmVsTWVtYmVySW1wbChzdGFydCk7CiAgICB9IGVsc2UgaWYgKHN0YXJ0Lm5leHQgIT0gbmV4dCkgewogICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tEZWNsYXJhdGlvbigpOwogICAgICAvLyBIYW5kbGUgdGhlIGVkZ2UgY2FzZSB3aGVyZSBhIG1vZGlmaWVyIGlzIGJlaW5nIHVzZWQgYXMgYW4gaWRlbnRpZmllcgogICAgICByZXR1cm4gcGFyc2VUb3BMZXZlbE1lbWJlckltcGwoc3RhcnQpOwogICAgfQogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChuZXh0LmlzT3BlcmF0b3IgJiYgb3B0aW9uYWwoJygnLCBuZXh0Lm5leHQpKSB7CiAgICAgIC8vIFRoaXMgYXBwZWFycyB0byBiZSBhIHRvcCBsZXZlbCBvcGVyYXRvciBkZWNsYXJhdGlvbiwgd2hpY2ggaXMgaW52YWxpZC4KICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlVG9wTGV2ZWxPcGVyYXRvcik7CiAgICAgIC8vIEluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyCiAgICAgIC8vIGFuZCBjb250aW51ZSBwYXJzaW5nIGFzIGEgdG9wIGxldmVsIGZ1bmN0aW9uLgogICAgICByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKAogICAgICAgICAgbmV4dCwgJyNzeW50aGV0aWNfZnVuY3Rpb25fJHtuZXh0LmNoYXJPZmZzZXR9Jyk7CiAgICAgIHJldHVybiBwYXJzZVRvcExldmVsTWVtYmVySW1wbChuZXh0KTsKICAgIH0KICAgIC8vIElnbm9yZSBhbnkgcHJlY2VkaW5nIG1vZGlmaWVycyBhbmQganVzdCByZXBvcnQgdGhlIHVuZXhwZWN0ZWQgdG9rZW4KICAgIGxpc3RlbmVyLmJlZ2luVG9wTGV2ZWxNZW1iZXIobmV4dCk7CiAgICByZXR1cm4gcGFyc2VJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbih0b2tlbik7CiAgfQoKICAvLy8gUGFyc2UgdGhlIG1vZGlmaWVycyBiZWZvcmUgdGhlIGBjbGFzc2Aga2V5d29yZC4KICAvLy8gUmV0dXJuIHRoZSBmaXJzdCBgYWJzdHJhY3RgIG1vZGlmaWVyIG9yIGBudWxsYCBpZiBub3QgZm91bmQuCiAgVG9rZW4gcGFyc2VDbGFzc0RlY2xhcmF0aW9uTW9kaWZpZXJzKFRva2VuIHN0YXJ0LCBUb2tlbiBrZXl3b3JkKSB7CiAgICBUb2tlbiBtb2RpZmllciA9IHN0YXJ0Lm5leHQ7CiAgICB3aGlsZSAobW9kaWZpZXIgIT0ga2V5d29yZCkgewogICAgICBpZiAob3B0aW9uYWwoJ2Fic3RyYWN0JywgbW9kaWZpZXIpKSB7CiAgICAgICAgcGFyc2VUb3BMZXZlbEtleXdvcmRNb2RpZmllcnMobW9kaWZpZXIsIGtleXdvcmQpOwogICAgICAgIHJldHVybiBtb2RpZmllcjsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIHJlcG9ydFRvcExldmVsTW9kaWZpZXJFcnJvcihtb2RpZmllciwga2V5d29yZCk7CiAgICAgIH0KICAgICAgbW9kaWZpZXIgPSBtb2RpZmllci5uZXh0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8gUmVwb3J0IGVycm9ycyBvbiBhbnkgbW9kaWZpZXJzIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGtleXdvcmQuCiAgdm9pZCBwYXJzZVRvcExldmVsS2V5d29yZE1vZGlmaWVycyhUb2tlbiBzdGFydCwgVG9rZW4ga2V5d29yZCkgewogICAgVG9rZW4gbW9kaWZpZXIgPSBzdGFydC5uZXh0OwogICAgd2hpbGUgKG1vZGlmaWVyICE9IGtleXdvcmQpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgcmVwb3J0VG9wTGV2ZWxNb2RpZmllckVycm9yKG1vZGlmaWVyLCBrZXl3b3JkKTsKICAgICAgbW9kaWZpZXIgPSBtb2RpZmllci5uZXh0OwogICAgfQogIH0KCiAgLy8gUmVwb3J0IGFuIGVycm9yIGZvciB0aGUgZ2l2ZW4gbW9kaWZpZXIgcHJlY2VkaW5nIGEgdG9wIGxldmVsIGtleXdvcmQKICAvLyBzdWNoIGFzIGBpbXBvcnRgIG9yIGBjbGFzc2AuCiAgdm9pZCByZXBvcnRUb3BMZXZlbE1vZGlmaWVyRXJyb3IoVG9rZW4gbW9kaWZpZXIsIFRva2VuIGFmdGVyTW9kaWZpZXJzKSB7CiAgICBpZiAob3B0aW9uYWwoJ2NvbnN0JywgbW9kaWZpZXIpICYmIG9wdGlvbmFsKCdjbGFzcycsIGFmdGVyTW9kaWZpZXJzKSkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG1vZGlmaWVyLCBmYXN0YS5tZXNzYWdlQ29uc3RDbGFzcyk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdleHRlcm5hbCcsIG1vZGlmaWVyKSkgewogICAgICBpZiAob3B0aW9uYWwoJ2NsYXNzJywgYWZ0ZXJNb2RpZmllcnMpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihtb2RpZmllciwgZmFzdGEubWVzc2FnZUV4dGVybmFsQ2xhc3MpOwogICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdlbnVtJywgYWZ0ZXJNb2RpZmllcnMpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihtb2RpZmllciwgZmFzdGEubWVzc2FnZUV4dGVybmFsRW51bSk7CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3R5cGVkZWYnLCBhZnRlck1vZGlmaWVycykpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG1vZGlmaWVyLCBmYXN0YS5tZXNzYWdlRXh0ZXJuYWxUeXBlZGVmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICBtb2RpZmllciwgZmFzdGEudGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgbW9kaWZpZXIsIGZhc3RhLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgIH0KICB9CgogIC8vLyBQYXJzZSBhbnkgdG9wLWxldmVsIGRlY2xhcmF0aW9uIHRoYXQgYmVnaW5zIHdpdGggYSBrZXl3b3JkLgogIC8vLyBbc3RhcnRdIGlzIHRoZSB0b2tlbiBiZWZvcmUgYW55IG1vZGlmaWVycyBwcmVjZWRpbmcgW2tleXdvcmRdLgogIFRva2VuIHBhcnNlVG9wTGV2ZWxLZXl3b3JkRGVjbGFyYXRpb24oCiAgICAgIFRva2VuIHN0YXJ0LCBUb2tlbiBrZXl3b3JkLCBEaXJlY3RpdmVDb250ZXh0IGRpcmVjdGl2ZVN0YXRlKSB7CiAgICBhc3NlcnQoa2V5d29yZC5pc1RvcExldmVsS2V5d29yZCk7CiAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBrZXl3b3JkLnN0cmluZ1ZhbHVlOwogICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2NsYXNzJykpIHsKICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrRGVjbGFyYXRpb24oKTsKICAgICAgVG9rZW4gYWJzdHJhY3RUb2tlbiA9IHBhcnNlQ2xhc3NEZWNsYXJhdGlvbk1vZGlmaWVycyhzdGFydCwga2V5d29yZCk7CiAgICAgIHJldHVybiBwYXJzZUNsYXNzT3JOYW1lZE1peGluQXBwbGljYXRpb24oYWJzdHJhY3RUb2tlbiwga2V5d29yZCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2VudW0nKSkgewogICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tEZWNsYXJhdGlvbigpOwogICAgICBwYXJzZVRvcExldmVsS2V5d29yZE1vZGlmaWVycyhzdGFydCwga2V5d29yZCk7CiAgICAgIHJldHVybiBwYXJzZUVudW0oa2V5d29yZCk7CiAgICB9IGVsc2UgewogICAgICAvLyBUaGUgcmVtYWluaW5nIHRvcCBsZXZlbCBrZXl3b3JkcyBhcmUgYnVpbHQtaW4ga2V5d29yZHMKICAgICAgLy8gYW5kIGNhbiBiZSB1c2VkIGluIGEgdG9wIGxldmVsIGRlY2xhcmF0aW9uCiAgICAgIC8vIGFzIGFuIGlkZW50aWZpZXIgc3VjaCBhcyAiYWJzdHJhY3Q8VD4oKSA9PiAwOyIKICAgICAgLy8gb3IgYXMgYSBwcmVmaXggc3VjaCBhcyAiYWJzdHJhY3QuQSBiKCkgPT4gMDsiLgogICAgICBTdHJpbmcgbmV4dFZhbHVlID0ga2V5d29yZC5uZXh0LnN0cmluZ1ZhbHVlOwogICAgICBpZiAoaWRlbnRpY2FsKG5leHRWYWx1ZSwgJygnKSB8fCBpZGVudGljYWwobmV4dFZhbHVlLCAnLicpKSB7CiAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrRGVjbGFyYXRpb24oKTsKICAgICAgICByZXR1cm4gcGFyc2VUb3BMZXZlbE1lbWJlckltcGwoc3RhcnQpOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChuZXh0VmFsdWUsICc8JykpIHsKICAgICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnZXh0ZW5zaW9uJykpIHsKICAgICAgICAgIC8vIFRoZSBuZWFtZSBpbiBhbiBleHRlbnNpb24gZGVjbGFyYXRpb24gaXMgb3B0aW9uYWw6CiAgICAgICAgICAvLyBgZXh0ZW5zaW9uPFQ+IG9uIC4uLmAKICAgICAgICAgIFRva2VuIGVuZEdyb3VwID0ga2V5d29yZC5uZXh0LmVuZEdyb3VwOwogICAgICAgICAgaWYgKGVuZEdyb3VwICE9IG51bGwgJiYgb3B0aW9uYWwoJ29uJywgZW5kR3JvdXAubmV4dCkpIHsKICAgICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrRGVjbGFyYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIHBhcnNlRXh0ZW5zaW9uKGtleXdvcmQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tEZWNsYXJhdGlvbigpOwogICAgICAgIHJldHVybiBwYXJzZVRvcExldmVsTWVtYmVySW1wbChzdGFydCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGFyc2VUb3BMZXZlbEtleXdvcmRNb2RpZmllcnMoc3RhcnQsIGtleXdvcmQpOwogICAgICAgIGlmIChpZGVudGljYWwodmFsdWUsICdpbXBvcnQnKSkgewogICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrSW1wb3J0KHRoaXMsIGtleXdvcmQpOwogICAgICAgICAgcmV0dXJuIHBhcnNlSW1wb3J0KGtleXdvcmQpOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnZXhwb3J0JykpIHsKICAgICAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja0V4cG9ydCh0aGlzLCBrZXl3b3JkKTsKICAgICAgICAgIHJldHVybiBwYXJzZUV4cG9ydChrZXl3b3JkKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ3R5cGVkZWYnKSkgewogICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrRGVjbGFyYXRpb24oKTsKICAgICAgICAgIHJldHVybiBwYXJzZVR5cGVkZWYoa2V5d29yZCk7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdtaXhpbicpKSB7CiAgICAgICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tEZWNsYXJhdGlvbigpOwogICAgICAgICAgcmV0dXJuIHBhcnNlTWl4aW4oa2V5d29yZCk7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdleHRlbnNpb24nKSkgewogICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrRGVjbGFyYXRpb24oKTsKICAgICAgICAgIHJldHVybiBwYXJzZUV4dGVuc2lvbihrZXl3b3JkKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ3BhcnQnKSkgewogICAgICAgICAgcmV0dXJuIHBhcnNlUGFydE9yUGFydE9mKGtleXdvcmQsIGRpcmVjdGl2ZVN0YXRlKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2xpYnJhcnknKSkgewogICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrTGlicmFyeSh0aGlzLCBrZXl3b3JkKTsKICAgICAgICAgIHJldHVybiBwYXJzZUxpYnJhcnlOYW1lKGtleXdvcmQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHRocm93ICJJbnRlcm5hbCBlcnJvcjogVW5oYW5kbGVkIHRvcCBsZXZlbCBrZXl3b3JkICckdmFsdWUnLiI7CiAgfQoKICAvLy8gYGBgCiAgLy8vIGxpYnJhcnlEaXJlY3RpdmU6CiAgLy8vICAgJ2xpYnJhcnknIHF1YWxpZmllZCAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUxpYnJhcnlOYW1lKFRva2VuIGxpYnJhcnlLZXl3b3JkKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2xpYnJhcnknLCBsaWJyYXJ5S2V5d29yZCkpOwogICAgbGlzdGVuZXIuYmVnaW5MaWJyYXJ5TmFtZShsaWJyYXJ5S2V5d29yZCk7CiAgICBUb2tlbiB0b2tlbiA9IHBhcnNlUXVhbGlmaWVkKGxpYnJhcnlLZXl3b3JkLCBJZGVudGlmaWVyQ29udGV4dC5saWJyYXJ5TmFtZSwKICAgICAgICBJZGVudGlmaWVyQ29udGV4dC5saWJyYXJ5TmFtZUNvbnRpbnVhdGlvbik7CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRMaWJyYXJ5TmFtZShsaWJyYXJ5S2V5d29yZCwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBpbXBvcnRQcmVmaXg6CiAgLy8vICAgJ2RlZmVycmVkJz8gJ2FzJyBpZGVudGlmaWVyCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VJbXBvcnRQcmVmaXhPcHQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCdkZWZlcnJlZCcsIG5leHQpICYmIG9wdGlvbmFsKCdhcycsIG5leHQubmV4dCkpIHsKICAgICAgVG9rZW4gZGVmZXJyZWRUb2tlbiA9IG5leHQ7CiAgICAgIFRva2VuIGFzS2V5d29yZCA9IG5leHQubmV4dDsKICAgICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKAogICAgICAgICAgYXNLZXl3b3JkLCBJZGVudGlmaWVyQ29udGV4dC5pbXBvcnRQcmVmaXhEZWNsYXJhdGlvbik7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUltcG9ydFByZWZpeChkZWZlcnJlZFRva2VuLCBhc0tleXdvcmQpOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnYXMnLCBuZXh0KSkgewogICAgICBUb2tlbiBhc0tleXdvcmQgPSBuZXh0OwogICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIobmV4dCwgSWRlbnRpZmllckNvbnRleHQuaW1wb3J0UHJlZml4RGVjbGFyYXRpb24pOwogICAgICBsaXN0ZW5lci5oYW5kbGVJbXBvcnRQcmVmaXgobnVsbCwgYXNLZXl3b3JkKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUltcG9ydFByZWZpeChudWxsLCBudWxsKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gaW1wb3J0RGlyZWN0aXZlOgogIC8vLyAgICdpbXBvcnQnIHVyaSAoJ2lmJyAnKCcgdGVzdCAnKScgdXJpKSogaW1wb3J0UHJlZml4PyBjb21iaW5hdG9yKiAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUltcG9ydChUb2tlbiBpbXBvcnRLZXl3b3JkKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2ltcG9ydCcsIGltcG9ydEtleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luSW1wb3J0KGltcG9ydEtleXdvcmQpOwogICAgVG9rZW4gdG9rZW4gPSBlbnN1cmVMaXRlcmFsU3RyaW5nKGltcG9ydEtleXdvcmQpOwogICAgVG9rZW4gdXJpID0gdG9rZW47CiAgICB0b2tlbiA9IHBhcnNlQ29uZGl0aW9uYWxVcmlTdGFyKHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VJbXBvcnRQcmVmaXhPcHQodG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUNvbWJpbmF0b3JTdGFyKHRva2VuKS5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCc7JywgdG9rZW4pKSB7CiAgICAgIGxpc3RlbmVyLmVuZEltcG9ydChpbXBvcnRLZXl3b3JkLCB0b2tlbik7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIGxpc3RlbmVyLmVuZEltcG9ydChpbXBvcnRLZXl3b3JkLCBudWxsKTsKICAgICAgcmV0dXJuIHBhcnNlSW1wb3J0UmVjb3ZlcnkodXJpKTsKICAgIH0KICB9CgogIC8vLyBSZWNvdmVyIGdpdmVuIG91dC1vZi1vcmRlciBjbGF1c2VzIGluIGFuIGltcG9ydCBkaXJlY3RpdmUgd2hlcmUgW3Rva2VuXSBpcwogIC8vLyB0aGUgaW1wb3J0IGtleXdvcmQuCiAgVG9rZW4gcGFyc2VJbXBvcnRSZWNvdmVyeShUb2tlbiB0b2tlbikgewogICAgZmluYWwgcHJpbWFyeUxpc3RlbmVyID0gbGlzdGVuZXI7CiAgICBmaW5hbCByZWNvdmVyeUxpc3RlbmVyID0gbmV3IEltcG9ydFJlY292ZXJ5TGlzdGVuZXIoKTsKCiAgICAvLyBSZXBhcnNlIHRvIGRldGVybWluZSB3aGljaCBjbGF1c2VzIGhhdmUgYWxyZWFkeSBiZWVuIHBhcnNlZAogICAgLy8gYnV0IGludGVyY2VwdCB0aGUgZXZlbnRzIHNvIHRoZXkgYXJlIG5vdCBzZW50IHRvIHRoZSBwcmltYXJ5IGxpc3RlbmVyCiAgICBsaXN0ZW5lciA9IHJlY292ZXJ5TGlzdGVuZXI7CiAgICB0b2tlbiA9IHBhcnNlQ29uZGl0aW9uYWxVcmlTdGFyKHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VJbXBvcnRQcmVmaXhPcHQodG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUNvbWJpbmF0b3JTdGFyKHRva2VuKTsKCiAgICBUb2tlbiBmaXJzdERlZmVycmVkS2V5d29yZCA9IHJlY292ZXJ5TGlzdGVuZXIuZGVmZXJyZWRLZXl3b3JkOwogICAgYm9vbCBoYXNQcmVmaXggPSByZWNvdmVyeUxpc3RlbmVyLmFzS2V5d29yZCAhPSBudWxsOwogICAgYm9vbCBoYXNDb21iaW5hdG9yID0gcmVjb3ZlcnlMaXN0ZW5lci5oYXNDb21iaW5hdG9yOwoKICAgIC8vIFVwZGF0ZSB0aGUgcmVjb3ZlcnkgbGlzdGVuZXIgdG8gZm9yd2FyZCBzdWJzZXF1ZW50IGV2ZW50cwogICAgLy8gdG8gdGhlIHByaW1hcnkgbGlzdGVuZXIKICAgIHJlY292ZXJ5TGlzdGVuZXIubGlzdGVuZXIgPSBwcmltYXJ5TGlzdGVuZXI7CgogICAgLy8gUGFyc2UgYWRkaXRpb25hbCBvdXQtb2Ytb3JkZXIgY2xhdXNlcy4KICAgIFRva2VuIHNlbWljb2xvbjsKICAgIGRvIHsKICAgICAgVG9rZW4gc3RhcnQgPSB0b2tlbi5uZXh0OwoKICAgICAgLy8gQ2hlY2sgZm9yIGV4dHJhbmVvdXMgdG9rZW4gaW4gdGhlIG1pZGRsZSBvZiBhbiBpbXBvcnQgc3RhdGVtZW50LgogICAgICB0b2tlbiA9IHNraXBVbmV4cGVjdGVkVG9rZW5PcHQoCiAgICAgICAgICB0b2tlbiwgY29uc3QgPFN0cmluZz5bJ2lmJywgJ2RlZmVycmVkJywgJ2FzJywgJ2hpZGUnLCAnc2hvdycsICc7J10pOwoKICAgICAgLy8gRHVyaW5nIHJlY292ZXJ5LCBjbGF1c2VzIGFyZSBwYXJzZWQgaW4gdGhlIHNhbWUgb3JkZXIKICAgICAgLy8gYW5kIGdlbmVyYXRlIHRoZSBzYW1lIGV2ZW50cyBhcyBpbiB0aGUgcGFyc2VJbXBvcnQgbWV0aG9kIGFib3ZlLgogICAgICByZWNvdmVyeUxpc3RlbmVyLmNsZWFyKCk7CiAgICAgIHRva2VuID0gcGFyc2VDb25kaXRpb25hbFVyaVN0YXIodG9rZW4pOwogICAgICBpZiAocmVjb3ZlcnlMaXN0ZW5lci5pZktleXdvcmQgIT0gbnVsbCkgewogICAgICAgIGlmIChmaXJzdERlZmVycmVkS2V5d29yZCAhPSBudWxsKSB7CiAgICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogcmVwb3J0IGVycm9yIGluZGljYXRpbmcgY29uZGl0aW9uYWwgc2hvdWxkCiAgICAgICAgICAvLyBiZSBtb3ZlZCBiZWZvcmUgZGVmZXJyZWQga2V5d29yZAogICAgICAgIH0gZWxzZSBpZiAoaGFzUHJlZml4KSB7CiAgICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogcmVwb3J0IGVycm9yIGluZGljYXRpbmcgY29uZGl0aW9uYWwgc2hvdWxkCiAgICAgICAgICAvLyBiZSBtb3ZlZCBiZWZvcmUgcHJlZml4IGNsYXVzZQogICAgICAgIH0gZWxzZSBpZiAoaGFzQ29tYmluYXRvcikgewogICAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IHJlcG9ydCBlcnJvciBpbmRpY2F0aW5nIGNvbmRpdGlvbmFsIHNob3VsZAogICAgICAgICAgLy8gYmUgbW92ZWQgYmVmb3JlIGNvbWJpbmF0b3JzCiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAob3B0aW9uYWwoJ2RlZmVycmVkJywgdG9rZW4ubmV4dCkgJiYKICAgICAgICAgICFvcHRpb25hbCgnYXMnLCB0b2tlbi5uZXh0Lm5leHQpKSB7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlSW1wb3J0UHJlZml4KHRva2VuLm5leHQsIG51bGwpOwogICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbiA9IHBhcnNlSW1wb3J0UHJlZml4T3B0KHRva2VuKTsKICAgICAgfQogICAgICBpZiAocmVjb3ZlcnlMaXN0ZW5lci5kZWZlcnJlZEtleXdvcmQgIT0gbnVsbCkgewogICAgICAgIGlmIChmaXJzdERlZmVycmVkS2V5d29yZCAhPSBudWxsKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIHJlY292ZXJ5TGlzdGVuZXIuZGVmZXJyZWRLZXl3b3JkLCBmYXN0YS5tZXNzYWdlRHVwbGljYXRlRGVmZXJyZWQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaGFzUHJlZml4KSB7CiAgICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IocmVjb3ZlcnlMaXN0ZW5lci5kZWZlcnJlZEtleXdvcmQsCiAgICAgICAgICAgICAgICBmYXN0YS5tZXNzYWdlRGVmZXJyZWRBZnRlclByZWZpeCk7CiAgICAgICAgICB9CiAgICAgICAgICBmaXJzdERlZmVycmVkS2V5d29yZCA9IHJlY292ZXJ5TGlzdGVuZXIuZGVmZXJyZWRLZXl3b3JkOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAocmVjb3ZlcnlMaXN0ZW5lci5hc0tleXdvcmQgIT0gbnVsbCkgewogICAgICAgIGlmIChoYXNQcmVmaXgpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgcmVjb3ZlcnlMaXN0ZW5lci5hc0tleXdvcmQsIGZhc3RhLm1lc3NhZ2VEdXBsaWNhdGVQcmVmaXgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaGFzQ29tYmluYXRvcikgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgcmVjb3ZlcnlMaXN0ZW5lci5hc0tleXdvcmQsIGZhc3RhLm1lc3NhZ2VQcmVmaXhBZnRlckNvbWJpbmF0b3IpOwogICAgICAgICAgfQogICAgICAgICAgaGFzUHJlZml4ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRva2VuID0gcGFyc2VDb21iaW5hdG9yU3Rhcih0b2tlbik7CiAgICAgIGhhc0NvbWJpbmF0b3IgPSBoYXNDb21iaW5hdG9yIHx8IHJlY292ZXJ5TGlzdGVuZXIuaGFzQ29tYmluYXRvcjsKCiAgICAgIGlmIChvcHRpb25hbCgnOycsIHRva2VuLm5leHQpKSB7CiAgICAgICAgc2VtaWNvbG9uID0gdG9rZW4ubmV4dDsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoc3RhcnQsIHRva2VuLm5leHQpKSB7CiAgICAgICAgLy8gSWYgbm8gZm9yd2FyZCBwcm9ncmVzcyB3YXMgbWFkZSwgaW5zZXJ0ICc7JyBzbyB0aGF0IHdlIGV4aXQgbG9vcC4KICAgICAgICBzZW1pY29sb24gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgICB9CiAgICAgIGxpc3RlbmVyLmhhbmRsZVJlY292ZXJJbXBvcnQoc2VtaWNvbG9uKTsKICAgIH0gd2hpbGUgKHNlbWljb2xvbiA9PSBudWxsKTsKCiAgICBpZiAoZmlyc3REZWZlcnJlZEtleXdvcmQgIT0gbnVsbCAmJiAhaGFzUHJlZml4KSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBmaXJzdERlZmVycmVkS2V5d29yZCwgZmFzdGEubWVzc2FnZU1pc3NpbmdQcmVmaXhJbkRlZmVycmVkSW1wb3J0KTsKICAgIH0KCiAgICByZXR1cm4gc2VtaWNvbG9uOwogIH0KCiAgLy8vIGBgYAogIC8vLyBjb25kaXRpb25hbFVyaXM6CiAgLy8vICAgY29uZGl0aW9uYWxVcmkqCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VDb25kaXRpb25hbFVyaVN0YXIoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyLmJlZ2luQ29uZGl0aW9uYWxVcmlzKHRva2VuLm5leHQpOwogICAgaW50IGNvdW50ID0gMDsKICAgIHdoaWxlIChvcHRpb25hbCgnaWYnLCB0b2tlbi5uZXh0KSkgewogICAgICBjb3VudCsrOwogICAgICB0b2tlbiA9IHBhcnNlQ29uZGl0aW9uYWxVcmkodG9rZW4pOwogICAgfQogICAgbGlzdGVuZXIuZW5kQ29uZGl0aW9uYWxVcmlzKGNvdW50KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gY29uZGl0aW9uYWxVcmk6CiAgLy8vICAgJ2lmJyAnKCcgZG90dGVkTmFtZSAoJz09JyBsaXRlcmFsU3RyaW5nKT8gJyknIHVyaQogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQ29uZGl0aW9uYWxVcmkoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGlmS2V5d29yZCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnaWYnLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5Db25kaXRpb25hbFVyaSh0b2tlbik7CiAgICBUb2tlbiBsZWZ0UGFyZW4gPSB0b2tlbi5uZXh0OwogICAgaWYgKCFvcHRpb25hbCgnKCcsIGxlZnRQYXJlbikpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIGxlZnRQYXJlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcoJykpOwogICAgICBsZWZ0UGFyZW4gPSByZXdyaXRlci5pbnNlcnRQYXJlbnModG9rZW4sIHRydWUpOwogICAgfQogICAgdG9rZW4gPSBwYXJzZURvdHRlZE5hbWUobGVmdFBhcmVuKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgVG9rZW4gZXF1YWxpdHlTaWduOwogICAgaWYgKG9wdGlvbmFsKCc9PScsIG5leHQpKSB7CiAgICAgIGVxdWFsaXR5U2lnbiA9IG5leHQ7CiAgICAgIHRva2VuID0gZW5zdXJlTGl0ZXJhbFN0cmluZyhuZXh0KTsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9CiAgICBpZiAobmV4dCAhPSBsZWZ0UGFyZW4uZW5kR3JvdXApIHsKICAgICAgVG9rZW4gZW5kR3JvdXAgPSBsZWZ0UGFyZW4uZW5kR3JvdXA7CiAgICAgIGlmIChlbmRHcm91cC5pc1N5bnRoZXRpYykgewogICAgICAgIC8vIFRoZSBzY2FubmVyIGRpZCBub3QgcGxhY2UgdGhlIHN5bnRoZXRpYyAnKScgY29ycmVjdGx5LCBzbyBtb3ZlIGl0LgogICAgICAgIG5leHQgPSByZXdyaXRlci5tb3ZlU3ludGhldGljKHRva2VuLCBlbmRHcm91cCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuZXh0LCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgICAgbmV4dCA9IGVuZEdyb3VwOwogICAgICB9CiAgICB9CiAgICB0b2tlbiA9IG5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJyknLCB0b2tlbikpOwoKICAgIHRva2VuID0gZW5zdXJlTGl0ZXJhbFN0cmluZyh0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRDb25kaXRpb25hbFVyaShpZktleXdvcmQsIGxlZnRQYXJlbiwgZXF1YWxpdHlTaWduKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gZG90dGVkTmFtZToKICAvLy8gICBpZGVudGlmaWVyICgnLicgaWRlbnRpZmllcikqCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VEb3R0ZWROYW1lKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmRvdHRlZE5hbWUpOwogICAgVG9rZW4gZmlyc3RJZGVudGlmaWVyID0gdG9rZW47CiAgICBpbnQgY291bnQgPSAxOwogICAgd2hpbGUgKG9wdGlvbmFsKCcuJywgdG9rZW4ubmV4dCkpIHsKICAgICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKAogICAgICAgICAgdG9rZW4ubmV4dCwgSWRlbnRpZmllckNvbnRleHQuZG90dGVkTmFtZUNvbnRpbnVhdGlvbik7CiAgICAgIGNvdW50Kys7CiAgICB9CiAgICBsaXN0ZW5lci5oYW5kbGVEb3R0ZWROYW1lKGNvdW50LCBmaXJzdElkZW50aWZpZXIpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBleHBvcnREaXJlY3RpdmU6CiAgLy8vICAgJ2V4cG9ydCcgdXJpIGNvbmRpdGlvbmFsLXVyaXMqIGNvbWJpbmF0b3IqICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRXhwb3J0KFRva2VuIGV4cG9ydEtleXdvcmQpIHsKICAgIGFzc2VydChvcHRpb25hbCgnZXhwb3J0JywgZXhwb3J0S2V5d29yZCkpOwogICAgbGlzdGVuZXIuYmVnaW5FeHBvcnQoZXhwb3J0S2V5d29yZCk7CiAgICBUb2tlbiB0b2tlbiA9IGVuc3VyZUxpdGVyYWxTdHJpbmcoZXhwb3J0S2V5d29yZCk7CiAgICB0b2tlbiA9IHBhcnNlQ29uZGl0aW9uYWxVcmlTdGFyKHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VDb21iaW5hdG9yU3Rhcih0b2tlbik7CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRFeHBvcnQoZXhwb3J0S2V5d29yZCwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBjb21iaW5hdG9yczoKICAvLy8gICAoaGlkZUNvbWJpbmF0b3IgfCBzaG93Q29tYmluYXRvcikqCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VDb21iaW5hdG9yU3RhcihUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBsaXN0ZW5lci5iZWdpbkNvbWJpbmF0b3JzKG5leHQpOwogICAgaW50IGNvdW50ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICAgIGlmIChpZGVudGljYWwoJ2hpZGUnLCB2YWx1ZSkpIHsKICAgICAgICB0b2tlbiA9IHBhcnNlSGlkZSh0b2tlbik7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCdzaG93JywgdmFsdWUpKSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZVNob3codG9rZW4pOwogICAgICB9IGVsc2UgewogICAgICAgIGxpc3RlbmVyLmVuZENvbWJpbmF0b3JzKGNvdW50KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgY291bnQrKzsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gaGlkZUNvbWJpbmF0b3I6CiAgLy8vICAgJ2hpZGUnIGlkZW50aWZpZXJMaXN0CiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VIaWRlKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBoaWRlS2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2hpZGUnLCBoaWRlS2V5d29yZCkpOwogICAgbGlzdGVuZXIuYmVnaW5IaWRlKGhpZGVLZXl3b3JkKTsKICAgIHRva2VuID0gcGFyc2VJZGVudGlmaWVyTGlzdChoaWRlS2V5d29yZCk7CiAgICBsaXN0ZW5lci5lbmRIaWRlKGhpZGVLZXl3b3JkKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gc2hvd0NvbWJpbmF0b3I6CiAgLy8vICAgJ3Nob3cnIGlkZW50aWZpZXJMaXN0CiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VTaG93KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBzaG93S2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3Nob3cnLCBzaG93S2V5d29yZCkpOwogICAgbGlzdGVuZXIuYmVnaW5TaG93KHNob3dLZXl3b3JkKTsKICAgIHRva2VuID0gcGFyc2VJZGVudGlmaWVyTGlzdChzaG93S2V5d29yZCk7CiAgICBsaXN0ZW5lci5lbmRTaG93KHNob3dLZXl3b3JkKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gaWRlbnRpZmllckxpc3Q6CiAgLy8vICAgaWRlbnRpZmllciAoJywnIGlkZW50aWZpZXIpKgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlSWRlbnRpZmllckxpc3QoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQuY29tYmluYXRvcik7CiAgICBpbnQgY291bnQgPSAxOwogICAgd2hpbGUgKG9wdGlvbmFsKCcsJywgdG9rZW4ubmV4dCkpIHsKICAgICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLm5leHQsIElkZW50aWZpZXJDb250ZXh0LmNvbWJpbmF0b3IpOwogICAgICBjb3VudCsrOwogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlSWRlbnRpZmllckxpc3QoY291bnQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyB0eXBlTGlzdDoKICAvLy8gICB0eXBlICgnLCcgdHlwZSkqCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VUeXBlTGlzdChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXIuYmVnaW5UeXBlTGlzdCh0b2tlbi5uZXh0KTsKICAgIHRva2VuID0gY29tcHV0ZVR5cGUodG9rZW4sIHRydWUpLmVuc3VyZVR5cGVPclZvaWQodG9rZW4sIHRoaXMpOwogICAgaW50IGNvdW50ID0gMTsKICAgIHdoaWxlIChvcHRpb25hbCgnLCcsIHRva2VuLm5leHQpKSB7CiAgICAgIHRva2VuID0gY29tcHV0ZVR5cGUodG9rZW4ubmV4dCwgdHJ1ZSkuZW5zdXJlVHlwZU9yVm9pZCh0b2tlbi5uZXh0LCB0aGlzKTsKICAgICAgY291bnQrKzsKICAgIH0KICAgIGxpc3RlbmVyLmVuZFR5cGVMaXN0KGNvdW50KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlUGFydE9yUGFydE9mKFRva2VuIHBhcnRLZXl3b3JkLCBEaXJlY3RpdmVDb250ZXh0IGRpcmVjdGl2ZVN0YXRlKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3BhcnQnLCBwYXJ0S2V5d29yZCkpOwogICAgaWYgKG9wdGlvbmFsKCdvZicsIHBhcnRLZXl3b3JkLm5leHQpKSB7CiAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja1BhcnRPZih0aGlzLCBwYXJ0S2V5d29yZCk7CiAgICAgIHJldHVybiBwYXJzZVBhcnRPZihwYXJ0S2V5d29yZCk7CiAgICB9IGVsc2UgewogICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tQYXJ0KHRoaXMsIHBhcnRLZXl3b3JkKTsKICAgICAgcmV0dXJuIHBhcnNlUGFydChwYXJ0S2V5d29yZCk7CiAgICB9CiAgfQoKICAvLy8gYGBgCiAgLy8vIHBhcnREaXJlY3RpdmU6CiAgLy8vICAgJ3BhcnQnIHVyaSAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVBhcnQoVG9rZW4gcGFydEtleXdvcmQpIHsKICAgIGFzc2VydChvcHRpb25hbCgncGFydCcsIHBhcnRLZXl3b3JkKSk7CiAgICBsaXN0ZW5lci5iZWdpblBhcnQocGFydEtleXdvcmQpOwogICAgVG9rZW4gdG9rZW4gPSBlbnN1cmVMaXRlcmFsU3RyaW5nKHBhcnRLZXl3b3JkKTsKICAgIHRva2VuID0gZW5zdXJlU2VtaWNvbG9uKHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZFBhcnQocGFydEtleXdvcmQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gcGFydE9mRGlyZWN0aXZlOgogIC8vLyAgICdwYXJ0JyAnb2YnIChxdWFsaWZpZWQgfCB1cmkpICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlUGFydE9mKFRva2VuIHBhcnRLZXl3b3JkKSB7CiAgICBUb2tlbiBvZktleXdvcmQgPSBwYXJ0S2V5d29yZC5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdwYXJ0JywgcGFydEtleXdvcmQpKTsKICAgIGFzc2VydChvcHRpb25hbCgnb2YnLCBvZktleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luUGFydE9mKHBhcnRLZXl3b3JkKTsKICAgIGJvb2wgaGFzTmFtZSA9IG9mS2V5d29yZC5uZXh0LmlzSWRlbnRpZmllcjsKICAgIFRva2VuIHRva2VuOwogICAgaWYgKGhhc05hbWUpIHsKICAgICAgdG9rZW4gPSBwYXJzZVF1YWxpZmllZChvZktleXdvcmQsIElkZW50aWZpZXJDb250ZXh0LnBhcnROYW1lLAogICAgICAgICAgSWRlbnRpZmllckNvbnRleHQucGFydE5hbWVDb250aW51YXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSBlbnN1cmVMaXRlcmFsU3RyaW5nKG9mS2V5d29yZCk7CiAgICB9CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRQYXJ0T2YocGFydEtleXdvcmQsIG9mS2V5d29yZCwgdG9rZW4sIGhhc05hbWUpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBtZXRhZGF0YToKICAvLy8gICBhbm5vdGF0aW9uKgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlTWV0YWRhdGFTdGFyKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lci5iZWdpbk1ldGFkYXRhU3Rhcih0b2tlbi5uZXh0KTsKICAgIGludCBjb3VudCA9IDA7CiAgICB3aGlsZSAob3B0aW9uYWwoJ0AnLCB0b2tlbi5uZXh0KSkgewogICAgICB0b2tlbiA9IHBhcnNlTWV0YWRhdGEodG9rZW4pOwogICAgICBjb3VudCsrOwogICAgfQogICAgbGlzdGVuZXIuZW5kTWV0YWRhdGFTdGFyKGNvdW50KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gYW5ub3RhdGlvbjoKICAvLy8gICAnQCcgcXVhbGlmaWVkICgnLicgaWRlbnRpZmllcik/IGFyZ3VtZW50cz8KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZU1ldGFkYXRhKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBhdFRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnQCcsIGF0VG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luTWV0YWRhdGEoYXRUb2tlbik7CiAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIoYXRUb2tlbiwgSWRlbnRpZmllckNvbnRleHQubWV0YWRhdGFSZWZlcmVuY2UpOwogICAgdG9rZW4gPQogICAgICAgIHBhcnNlUXVhbGlmaWVkUmVzdE9wdCh0b2tlbiwgSWRlbnRpZmllckNvbnRleHQubWV0YWRhdGFDb250aW51YXRpb24pOwogICAgaWYgKG9wdGlvbmFsKCI8IiwgdG9rZW4ubmV4dCkpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbi5uZXh0LCBmYXN0YS5tZXNzYWdlTWV0YWRhdGFUeXBlQXJndW1lbnRzKTsKICAgIH0KICAgIHRva2VuID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHRva2VuKS5wYXJzZUFyZ3VtZW50cyh0b2tlbiwgdGhpcyk7CiAgICBUb2tlbiBwZXJpb2QgPSBudWxsOwogICAgaWYgKG9wdGlvbmFsKCcuJywgdG9rZW4ubmV4dCkpIHsKICAgICAgcGVyaW9kID0gdG9rZW4ubmV4dDsKICAgICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKAogICAgICAgICAgcGVyaW9kLCBJZGVudGlmaWVyQ29udGV4dC5tZXRhZGF0YUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgICB0b2tlbiA9IHBhcnNlQXJndW1lbnRzT3B0KHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZE1ldGFkYXRhKGF0VG9rZW4sIHBlcmlvZCwgdG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHNjcmlwdFRhZzoKICAvLy8gICAnIyEnICjLnE5FV0xJTkUpKiBORVdMSU5FCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VTY3JpcHQoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGljYWwodG9rZW4udHlwZSwgVG9rZW5UeXBlLlNDUklQVF9UQUcpKTsKICAgIGxpc3RlbmVyLmhhbmRsZVNjcmlwdCh0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHR5cGVBbGlhczoKICAvLy8gICBtZXRhZGF0YSAndHlwZWRlZicgdHlwZUFsaWFzQm9keSB8CiAgLy8vICAgbWV0YWRhdGEgJ3R5cGVkZWYnIGlkZW50aWZpZXIgdHlwZVBhcmFtZXRlcnM/ICc9JyBmdW5jdGlvblR5cGUgJzsnCiAgLy8vIDsKICAvLy8KICAvLy8gZnVuY3Rpb25UeXBlOgogIC8vLyAgIHJldHVyblR5cGU/ICdGdW5jdGlvbicgdHlwZVBhcmFtZXRlcnM/IHBhcmFtZXRlclR5cGVMaXN0CiAgLy8vCiAgLy8vIHR5cGVBbGlhc0JvZHk6CiAgLy8vICAgZnVuY3Rpb25UeXBlQWxpYXMKICAvLy8gOwogIC8vLwogIC8vLyBmdW5jdGlvblR5cGVBbGlhczoKICAvLy8gICBmdW5jdGlvblByZWZpeCB0eXBlUGFyYW1ldGVycz8gZm9ybWFsUGFyYW1ldGVyTGlzdCDigJg74oCZCiAgLy8vIDsKICAvLy8KICAvLy8gZnVuY3Rpb25QcmVmaXg6CiAgLy8vICAgcmV0dXJuVHlwZT8gaWRlbnRpZmllcgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlVHlwZWRlZihUb2tlbiB0eXBlZGVmS2V5d29yZCkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCd0eXBlZGVmJywgdHlwZWRlZktleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luRnVuY3Rpb25UeXBlQWxpYXModHlwZWRlZktleXdvcmQpOwogICAgVHlwZUluZm8gdHlwZUluZm8gPSBjb21wdXRlVHlwZSh0eXBlZGVmS2V5d29yZCwgZmFsc2UpOwogICAgVG9rZW4gdG9rZW4gPSB0eXBlSW5mby5za2lwVHlwZSh0eXBlZGVmS2V5d29yZCkubmV4dDsKICAgIFRva2VuIGVxdWFsczsKICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlUGFyYW0gPSBjb21wdXRlVHlwZVBhcmFtT3JBcmcodG9rZW4sIHRydWUpOwogICAgaWYgKHR5cGVJbmZvID09IG5vVHlwZSAmJgogICAgICAgICh0b2tlbi5raW5kID09IElERU5USUZJRVJfVE9LRU4gfHwgdG9rZW4udHlwZS5pc1BzZXVkbykgJiYKICAgICAgICBvcHRpb25hbCgnPScsIHR5cGVQYXJhbS5za2lwKHRva2VuKS5uZXh0KSkgewogICAgICBsaXN0ZW5lci5oYW5kbGVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC50eXBlZGVmRGVjbGFyYXRpb24pOwogICAgICBlcXVhbHMgPSB0eXBlUGFyYW0ucGFyc2VWYXJpYWJsZXModG9rZW4sIHRoaXMpLm5leHQ7CiAgICAgIGFzc2VydChvcHRpb25hbCgnPScsIGVxdWFscykpOwogICAgICB0b2tlbiA9IGNvbXB1dGVUeXBlKGVxdWFscywgdHJ1ZSkuZW5zdXJlVHlwZU9yVm9pZChlcXVhbHMsIHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSB0eXBlSW5mby5wYXJzZVR5cGUodHlwZWRlZktleXdvcmQsIHRoaXMpOwogICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LnR5cGVkZWZEZWNsYXJhdGlvbik7CiAgICAgIHRva2VuID0gdHlwZVBhcmFtLnBhcnNlVmFyaWFibGVzKHRva2VuLCB0aGlzKTsKICAgICAgdG9rZW4gPQogICAgICAgICAgcGFyc2VGb3JtYWxQYXJhbWV0ZXJzUmVxdWlyZWRPcHQodG9rZW4sIE1lbWJlcktpbmQuRnVuY3Rpb25UeXBlQWxpYXMpOwogICAgfQogICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgbGlzdGVuZXIuZW5kRnVuY3Rpb25UeXBlQWxpYXModHlwZWRlZktleXdvcmQsIGVxdWFscywgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlIGEgbWl4aW4gYXBwbGljYXRpb24gc3RhcnRpbmcgZnJvbSBgd2l0aGAuIEFzc3VtZXMgdGhhdCB0aGUgZmlyc3QKICAvLy8gdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZC4KICBUb2tlbiBwYXJzZU1peGluQXBwbGljYXRpb25SZXN0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiB3aXRoS2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICBpZiAoIW9wdGlvbmFsKCd3aXRoJywgd2l0aEtleXdvcmQpKSB7CiAgICAgIC8vIFJlY292ZXJ5OiBSZXBvcnQgYW4gZXJyb3IgYW5kIGluc2VydCBzeW50aGV0aWMgYHdpdGhgIGNsYXVzZS4KICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIHdpdGhLZXl3b3JkLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJ3dpdGgnKSk7CiAgICAgIHdpdGhLZXl3b3JkID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljS2V5d29yZCh0b2tlbiwgS2V5d29yZC5XSVRIKTsKICAgICAgaWYgKCFpc1ZhbGlkVHlwZVJlZmVyZW5jZSh3aXRoS2V5d29yZC5uZXh0KSkgewogICAgICAgIHJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIod2l0aEtleXdvcmQpOwogICAgICB9CiAgICB9CiAgICB0b2tlbiA9IHBhcnNlVHlwZUxpc3Qod2l0aEtleXdvcmQpOwogICAgbGlzdGVuZXIuaGFuZGxlTmFtZWRNaXhpbkFwcGxpY2F0aW9uV2l0aENsYXVzZSh3aXRoS2V5d29yZCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZVdpdGhDbGF1c2VPcHQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIHdpdGhLZXl3b3JkID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnd2l0aCcsIHdpdGhLZXl3b3JkKSkgewogICAgICB0b2tlbiA9IHBhcnNlVHlwZUxpc3Qod2l0aEtleXdvcmQpOwogICAgICBsaXN0ZW5lci5oYW5kbGVDbGFzc1dpdGhDbGF1c2Uod2l0aEtleXdvcmQpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlQ2xhc3NOb1dpdGhDbGF1c2UoKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQYXJzZSB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgb2YgYSBnZXR0ZXIgKHdoaWNoIHNob3VsZG4ndCBoYXZlIHBhcmFtZXRlcnMpCiAgLy8vIG9yIGZ1bmN0aW9uIG9yIG1ldGhvZC4KICBUb2tlbiBwYXJzZUdldHRlck9yRm9ybWFsUGFyYW1ldGVycygKICAgICAgVG9rZW4gdG9rZW4sIFRva2VuIG5hbWUsIGJvb2wgaXNHZXR0ZXIsIE1lbWJlcktpbmQga2luZCkgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoIigiLCBuZXh0KSkgewogICAgICBpZiAoaXNHZXR0ZXIpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VHZXR0ZXJXaXRoRm9ybWFscyk7CiAgICAgIH0KICAgICAgdG9rZW4gPSBwYXJzZUZvcm1hbFBhcmFtZXRlcnModG9rZW4sIGtpbmQpOwogICAgfSBlbHNlIGlmIChpc0dldHRlcikgewogICAgICBsaXN0ZW5lci5oYW5kbGVOb0Zvcm1hbFBhcmFtZXRlcnMobmV4dCwga2luZCk7CiAgICB9IGVsc2UgewogICAgICAvLyBSZWNvdmVyeQogICAgICBpZiAob3B0aW9uYWwoJ29wZXJhdG9yJywgbmFtZSkpIHsKICAgICAgICBUb2tlbiBuZXh0ID0gbmFtZS5uZXh0OwogICAgICAgIGlmIChuZXh0LmlzT3BlcmF0b3IpIHsKICAgICAgICAgIG5hbWUgPSBuZXh0OwogICAgICAgIH0gZWxzZSBpZiAoaXNVbmFyeU1pbnVzKG5leHQpKSB7CiAgICAgICAgICBuYW1lID0gbmV4dC5uZXh0OwogICAgICAgIH0KICAgICAgfQogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5hbWUsIG1pc3NpbmdQYXJhbWV0ZXJNZXNzYWdlKGtpbmQpKTsKICAgICAgdG9rZW4gPSByZXdyaXRlci5pbnNlcnRQYXJlbnModG9rZW4sIGZhbHNlKTsKICAgICAgdG9rZW4gPSBwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXN0KHRva2VuLCBraW5kKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlRm9ybWFsUGFyYW1ldGVyc09wdChUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgIHRva2VuID0gcGFyc2VGb3JtYWxQYXJhbWV0ZXJzKHRva2VuLCBraW5kKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vRm9ybWFsUGFyYW1ldGVycyhuZXh0LCBraW5kKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHNraXBGb3JtYWxQYXJhbWV0ZXJzKFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIHJldHVybiBza2lwRm9ybWFsUGFyYW1ldGVyc1Jlc3QodG9rZW4ubmV4dCwga2luZCk7CiAgfQoKICBUb2tlbiBza2lwRm9ybWFsUGFyYW1ldGVyc1Jlc3QoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgdG9rZW4pKTsKICAgIC8vIFRPRE8oYWhlKTogU2hvdWxkbid0IHRoaXMgYmUgYGJlZ2luRm9ybWFsUGFyYW1ldGVyc2A/CiAgICBsaXN0ZW5lci5iZWdpbk9wdGlvbmFsRm9ybWFsUGFyYW1ldGVycyh0b2tlbik7CiAgICBUb2tlbiBjbG9zZUJyYWNlID0gdG9rZW4uZW5kR3JvdXA7CiAgICBhc3NlcnQob3B0aW9uYWwoJyknLCBjbG9zZUJyYWNlKSk7CiAgICBsaXN0ZW5lci5lbmRGb3JtYWxQYXJhbWV0ZXJzKDAsIHRva2VuLCBjbG9zZUJyYWNlLCBraW5kKTsKICAgIHJldHVybiBjbG9zZUJyYWNlOwogIH0KCiAgLy8vIFBhcnNlcyB0aGUgZm9ybWFsIHBhcmFtZXRlciBsaXN0IG9mIGEgZnVuY3Rpb24uCiAgLy8vCiAgLy8vIElmIGBraW5kID09IE1lbWJlcktpbmQuR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGVgLCB0aGVuIG5hbWVzIG1heSBiZQogIC8vLyBvbWl0dGVkIChleGNlcHQgZm9yIG5hbWVkIGFyZ3VtZW50cykuIE90aGVyd2lzZSwgdHlwZXMgbWF5IGJlIG9taXR0ZWQuCiAgVG9rZW4gcGFyc2VGb3JtYWxQYXJhbWV0ZXJzUmVxdWlyZWRPcHQoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAoIW9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBtaXNzaW5nUGFyYW1ldGVyTWVzc2FnZShraW5kKSk7CiAgICAgIG5leHQgPSByZXdyaXRlci5pbnNlcnRQYXJlbnModG9rZW4sIGZhbHNlKTsKICAgIH0KICAgIHJldHVybiBwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXN0KG5leHQsIGtpbmQpOwogIH0KCiAgLy8vIFBhcnNlcyB0aGUgZm9ybWFsIHBhcmFtZXRlciBsaXN0IG9mIGEgZnVuY3Rpb24gZ2l2ZW4gdGhhdCB0aGUgbGVmdAogIC8vLyBwYXJlbnRoZXNpcyBpcyBrbm93biB0byBleGlzdC4KICAvLy8KICAvLy8gSWYgYGtpbmQgPT0gTWVtYmVyS2luZC5HZW5lcmFsaXplZEZ1bmN0aW9uVHlwZWAsIHRoZW4gbmFtZXMgbWF5IGJlCiAgLy8vIG9taXR0ZWQgKGV4Y2VwdCBmb3IgbmFtZWQgYXJndW1lbnRzKS4gT3RoZXJ3aXNlLCB0eXBlcyBtYXkgYmUgb21pdHRlZC4KICBUb2tlbiBwYXJzZUZvcm1hbFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgcmV0dXJuIHBhcnNlRm9ybWFsUGFyYW1ldGVyc1Jlc3QodG9rZW4ubmV4dCwga2luZCk7CiAgfQoKICAvLy8gUGFyc2VzIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGxpc3Qgb2YgYSBmdW5jdGlvbiBnaXZlbiB0aGF0IHRoZSBsZWZ0CiAgLy8vIHBhcmVudGhlc2lzIHBhc3NlZCBpbiBhcyBbdG9rZW5dLgogIC8vLwogIC8vLyBJZiBga2luZCA9PSBNZW1iZXJLaW5kLkdlbmVyYWxpemVkRnVuY3Rpb25UeXBlYCwgdGhlbiBuYW1lcyBtYXkgYmUKICAvLy8gb21pdHRlZCAoZXhjZXB0IGZvciBuYW1lZCBhcmd1bWVudHMpLiBPdGhlcndpc2UsIHR5cGVzIG1heSBiZSBvbWl0dGVkLgogIFRva2VuIHBhcnNlRm9ybWFsUGFyYW1ldGVyc1Jlc3QoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbjsKICAgIGFzc2VydChvcHRpb25hbCgnKCcsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5iZWdpbkZvcm1hbFBhcmFtZXRlcnMoYmVnaW4sIGtpbmQpOwogICAgaW50IHBhcmFtZXRlckNvdW50ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJyknLCBuZXh0KSkgewogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICArK3BhcmFtZXRlckNvdW50OwogICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnWycpKSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZU9wdGlvbmFsUG9zaXRpb25hbFBhcmFtZXRlcnModG9rZW4sIGtpbmQpOwogICAgICAgIHRva2VuID0gZW5zdXJlQ2xvc2VQYXJlbih0b2tlbiwgYmVnaW4pOwogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ3snKSkgewogICAgICAgIHRva2VuID0gcGFyc2VPcHRpb25hbE5hbWVkUGFyYW1ldGVycyh0b2tlbiwga2luZCk7CiAgICAgICAgdG9rZW4gPSBlbnN1cmVDbG9zZVBhcmVuKHRva2VuLCBiZWdpbik7CiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnW10nKSkgewogICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgdG9rZW4gPSByZXdyaXRlU3F1YXJlQnJhY2tldHModG9rZW4pOwogICAgICAgIHRva2VuID0gcGFyc2VPcHRpb25hbFBvc2l0aW9uYWxQYXJhbWV0ZXJzKHRva2VuLCBraW5kKTsKICAgICAgICB0b2tlbiA9IGVuc3VyZUNsb3NlUGFyZW4odG9rZW4sIGJlZ2luKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICB0b2tlbiA9IHBhcnNlRm9ybWFsUGFyYW1ldGVyKHRva2VuLCBGb3JtYWxQYXJhbWV0ZXJLaW5kLm1hbmRhdG9yeSwga2luZCk7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAoIW9wdGlvbmFsKCcsJywgbmV4dCkpIHsKICAgICAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBpZiAob3B0aW9uYWwoJyknLCBuZXh0KSkgewogICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgaWYgKGJlZ2luLmVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgIC8vIFNjYW5uZXIgaGFzIGFscmVhZHkgcmVwb3J0ZWQgYSBtaXNzaW5nIGApYCBlcnJvciwKICAgICAgICAgICAgLy8gYnV0IHBsYWNlZCB0aGUgYClgIGluIHRoZSB3cm9uZyBsb2NhdGlvbiwgc28gbW92ZSBpdC4KICAgICAgICAgICAgdG9rZW4gPSByZXdyaXRlci5tb3ZlU3ludGhldGljKHRva2VuLCBiZWdpbi5lbmRHcm91cCk7CiAgICAgICAgICB9IGVsc2UgaWYgKG5leHQua2luZCA9PSBJREVOVElGSUVSX1RPS0VOICYmCiAgICAgICAgICAgICAgbmV4dC5uZXh0LmtpbmQgPT0gSURFTlRJRklFUl9UT0tFTikgewogICAgICAgICAgICAvLyBMb29rcyBsaWtlIGEgbWlzc2luZyBjb21tYQogICAgICAgICAgICB0b2tlbiA9IHJld3JpdGVBbmRSZWNvdmVyKAogICAgICAgICAgICAgICAgdG9rZW4sCiAgICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJywnKSwKICAgICAgICAgICAgICAgIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuQ09NTUEsIG5leHQuY2hhck9mZnNldCkpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRva2VuID0gZW5zdXJlQ2xvc2VQYXJlbih0b2tlbiwgYmVnaW4pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgICB0b2tlbiA9IG5leHQ7CiAgICB9CiAgICBhc3NlcnQob3B0aW9uYWwoJyknLCB0b2tlbikpOwogICAgbGlzdGVuZXIuZW5kRm9ybWFsUGFyYW1ldGVycyhwYXJhbWV0ZXJDb3VudCwgYmVnaW4sIHRva2VuLCBraW5kKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBSZXR1cm4gdGhlIG1lc3NhZ2UgdGhhdCBzaG91bGQgYmUgcHJvZHVjZWQgd2hlbiB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgYXJlCiAgLy8vIG1pc3NpbmcuCiAgTWVzc2FnZSBtaXNzaW5nUGFyYW1ldGVyTWVzc2FnZShNZW1iZXJLaW5kIGtpbmQpIHsKICAgIGlmIChraW5kID09IE1lbWJlcktpbmQuRnVuY3Rpb25UeXBlQWxpYXMpIHsKICAgICAgcmV0dXJuIGZhc3RhLm1lc3NhZ2VNaXNzaW5nVHlwZWRlZlBhcmFtZXRlcnM7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gTWVtYmVyS2luZC5Ob25TdGF0aWNNZXRob2QgfHwKICAgICAgICBraW5kID09IE1lbWJlcktpbmQuU3RhdGljTWV0aG9kKSB7CiAgICAgIHJldHVybiBmYXN0YS5tZXNzYWdlTWlzc2luZ01ldGhvZFBhcmFtZXRlcnM7CiAgICB9CiAgICByZXR1cm4gZmFzdGEubWVzc2FnZU1pc3NpbmdGdW5jdGlvblBhcmFtZXRlcnM7CiAgfQoKICAvLy8gYGBgCiAgLy8vIG5vcm1hbEZvcm1hbFBhcmFtZXRlcjoKICAvLy8gICBmdW5jdGlvbkZvcm1hbFBhcmFtZXRlciB8CiAgLy8vICAgZmllbGRGb3JtYWxQYXJhbWV0ZXIgfAogIC8vLyAgIHNpbXBsZUZvcm1hbFBhcmFtZXRlcgogIC8vLyA7CiAgLy8vCiAgLy8vIGZ1bmN0aW9uRm9ybWFsUGFyYW1ldGVyOgogIC8vLyAgIG1ldGFkYXRhICdjb3ZhcmlhbnQnPyByZXR1cm5UeXBlPyBpZGVudGlmaWVyIGZvcm1hbFBhcmFtZXRlckxpc3QKICAvLy8gOwogIC8vLwogIC8vLyBzaW1wbGVGb3JtYWxQYXJhbWV0ZXI6CiAgLy8vICAgbWV0YWRhdGEgJ2NvdmFyaWFudCc/IGZpbmFsQ29uc3RWYXJPclR5cGU/IGlkZW50aWZpZXIgfAogIC8vLyA7CiAgLy8vCiAgLy8vIGZpZWxkRm9ybWFsUGFyYW1ldGVyOgogIC8vLyAgIG1ldGFkYXRhIGZpbmFsQ29uc3RWYXJPclR5cGU/ICd0aGlzJyAnLicgaWRlbnRpZmllciBmb3JtYWxQYXJhbWV0ZXJMaXN0PwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRm9ybWFsUGFyYW1ldGVyKAogICAgICBUb2tlbiB0b2tlbiwgRm9ybWFsUGFyYW1ldGVyS2luZCBwYXJhbWV0ZXJLaW5kLCBNZW1iZXJLaW5kIG1lbWJlcktpbmQpIHsKICAgIGFzc2VydChwYXJhbWV0ZXJLaW5kICE9IG51bGwpOwogICAgdG9rZW4gPSBwYXJzZU1ldGFkYXRhU3Rhcih0b2tlbik7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIFRva2VuIHN0YXJ0ID0gbmV4dDsKCiAgICBmaW5hbCBib29sIGluRnVuY3Rpb25UeXBlID0KICAgICAgICBtZW1iZXJLaW5kID09IE1lbWJlcktpbmQuR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGU7CgogICAgVG9rZW4gcmVxdWlyZWRUb2tlbjsKICAgIFRva2VuIGNvdmFyaWFudFRva2VuOwogICAgVG9rZW4gdmFyRmluYWxPckNvbnN0OwogICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgaWYgKG9wdGlvbmFsKCdyZXF1aXJlZCcsIG5leHQpKSB7CiAgICAgICAgaWYgKHBhcmFtZXRlcktpbmQgPT0gRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbE5hbWVkKSB7CiAgICAgICAgICByZXF1aXJlZFRva2VuID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICAgIGlmIChvcHRpb25hbCgnY292YXJpYW50JywgbmV4dCkpIHsKICAgICAgICAgIGlmIChtZW1iZXJLaW5kICE9IE1lbWJlcktpbmQuU3RhdGljTWV0aG9kICYmCiAgICAgICAgICAgICAgbWVtYmVyS2luZCAhPSBNZW1iZXJLaW5kLlRvcExldmVsTWV0aG9kKSB7CiAgICAgICAgICAgIGNvdmFyaWFudFRva2VuID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc01vZGlmaWVyKG5leHQpKSB7CiAgICAgICAgICBpZiAoIWluRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICAgIGlmIChvcHRpb25hbCgndmFyJywgbmV4dCkpIHsKICAgICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2ZpbmFsJywgbmV4dCkpIHsKICAgICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgICBNb2RpZmllclJlY292ZXJ5Q29udGV4dCBjb250ZXh0ID0gbmV3IE1vZGlmaWVyUmVjb3ZlcnlDb250ZXh0KHRoaXMpCiAgICAgICAgICAgICAgLi5jb3ZhcmlhbnRUb2tlbiA9IGNvdmFyaWFudFRva2VuCiAgICAgICAgICAgICAgLi5yZXF1aXJlZFRva2VuID0gcmVxdWlyZWRUb2tlbgogICAgICAgICAgICAgIC4udmFyRmluYWxPckNvbnN0ID0gdmFyRmluYWxPckNvbnN0OwoKICAgICAgICAgICAgdG9rZW4gPSBjb250ZXh0LnBhcnNlRm9ybWFsUGFyYW1ldGVyTW9kaWZpZXJzKAogICAgICAgICAgICAgICAgdG9rZW4sIHBhcmFtZXRlcktpbmQsIG1lbWJlcktpbmQpOwogICAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKCiAgICAgICAgICAgIGNvdmFyaWFudFRva2VuID0gY29udGV4dC5jb3ZhcmlhbnRUb2tlbjsKICAgICAgICAgICAgcmVxdWlyZWRUb2tlbiA9IGNvbnRleHQucmVxdWlyZWRUb2tlbjsKICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gY29udGV4dC52YXJGaW5hbE9yQ29uc3Q7CgogICAgICAgICAgICBjb250ZXh0ID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBsaXN0ZW5lci5iZWdpbkZvcm1hbFBhcmFtZXRlcigKICAgICAgICBzdGFydCwgbWVtYmVyS2luZCwgcmVxdWlyZWRUb2tlbiwgY292YXJpYW50VG9rZW4sIHZhckZpbmFsT3JDb25zdCk7CgogICAgLy8gVHlwZSBpcyByZXF1aXJlZCBpbiBhIGdlbmVyYWxpemVkIGZ1bmN0aW9uIHR5cGUsIGJ1dCBvcHRpb25hbCBvdGhlcndpc2UuCiAgICBmaW5hbCBUb2tlbiBiZWZvcmVUeXBlID0gdG9rZW47CiAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlKHRva2VuLCBpbkZ1bmN0aW9uVHlwZSk7CiAgICB0b2tlbiA9IHR5cGVJbmZvLnNraXBUeXBlKHRva2VuKTsKICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKHR5cGVJbmZvID09IG5vVHlwZSAmJgogICAgICAgIChvcHRpb25hbCgnLicsIG5leHQpIHx8CiAgICAgICAgICAgIChuZXh0LmlzSWRlbnRpZmllciAmJiBvcHRpb25hbCgnLicsIG5leHQubmV4dCkpKSkgewogICAgICAvLyBSZWNvdmVyeTogTWFsZm9ybWVkIHR5cGUgcmVmZXJlbmNlLgogICAgICB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlKGJlZm9yZVR5cGUsIHRydWUpOwogICAgICB0b2tlbiA9IHR5cGVJbmZvLnNraXBUeXBlKGJlZm9yZVR5cGUpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIH0KCiAgICBmaW5hbCBib29sIGlzTmFtZWRQYXJhbWV0ZXIgPQogICAgICAgIHBhcmFtZXRlcktpbmQgPT0gRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbE5hbWVkOwoKICAgIFRva2VuIHRoaXNLZXl3b3JkOwogICAgVG9rZW4gcGVyaW9kQWZ0ZXJUaGlzOwogICAgSWRlbnRpZmllckNvbnRleHQgbmFtZUNvbnRleHQgPQogICAgICAgIElkZW50aWZpZXJDb250ZXh0LmZvcm1hbFBhcmFtZXRlckRlY2xhcmF0aW9uOwoKICAgIGlmICghaW5GdW5jdGlvblR5cGUgJiYgb3B0aW9uYWwoJ3RoaXMnLCBuZXh0KSkgewogICAgICB0aGlzS2V5d29yZCA9IHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmICghb3B0aW9uYWwoJy4nLCBuZXh0KSkgewogICAgICAgIC8vIFJlY292ZXIgZnJvbSBhIG1pc3NpbmcgcGVyaW9kIGJ5IGluc2VydGluZyBvbmUuCiAgICAgICAgbmV4dCA9IHJld3JpdGVBbmRSZWNvdmVyKAogICAgICAgICAgICB0b2tlbiwKICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcuJyksCiAgICAgICAgICAgIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuUEVSSU9ELCBuZXh0LmNoYXJPZmZzZXQpKTsKICAgICAgfQogICAgICBwZXJpb2RBZnRlclRoaXMgPSB0b2tlbiA9IG5leHQ7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBuYW1lQ29udGV4dCA9IElkZW50aWZpZXJDb250ZXh0LmZpZWxkSW5pdGlhbGl6ZXI7CiAgICB9CgogICAgaWYgKG5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9CiAgICBUb2tlbiBiZWZvcmVJbmxpbmVGdW5jdGlvblR5cGU7CiAgICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZVBhcmFtID0gbm9UeXBlUGFyYW1PckFyZzsKICAgIGlmIChvcHRpb25hbCgiPCIsIG5leHQpKSB7CiAgICAgIHR5cGVQYXJhbSA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0b2tlbik7CiAgICAgIGlmICh0eXBlUGFyYW0gIT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgICAgIFRva2VuIGNsb3NlciA9IHR5cGVQYXJhbS5za2lwKHRva2VuKTsKICAgICAgICBpZiAob3B0aW9uYWwoIigiLCBjbG9zZXIubmV4dCkpIHsKICAgICAgICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCkgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0LCBmYXN0YS5tZXNzYWdlRnVuY3Rpb25UeXBlZFBhcmFtZXRlclZhcik7CiAgICAgICAgICB9CiAgICAgICAgICBiZWZvcmVJbmxpbmVGdW5jdGlvblR5cGUgPSB0b2tlbjsKICAgICAgICAgIHRva2VuID0gY2xvc2VyLm5leHQuZW5kR3JvdXA7CiAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoIigiLCBuZXh0KSkgewogICAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGZhc3RhLm1lc3NhZ2VGdW5jdGlvblR5cGVkUGFyYW1ldGVyVmFyKTsKICAgICAgfQogICAgICBiZWZvcmVJbmxpbmVGdW5jdGlvblR5cGUgPSB0b2tlbjsKICAgICAgdG9rZW4gPSBuZXh0LmVuZEdyb3VwOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIGlmICh0eXBlSW5mbyAhPSBub1R5cGUgJiYKICAgICAgICB2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCAmJgogICAgICAgIG9wdGlvbmFsKCd2YXInLCB2YXJGaW5hbE9yQ29uc3QpKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodmFyRmluYWxPckNvbnN0LCBmYXN0YS5tZXNzYWdlVHlwZUFmdGVyVmFyKTsKICAgIH0KCiAgICBUb2tlbiBlbmRJbmxpbmVGdW5jdGlvblR5cGU7CiAgICBpZiAoYmVmb3JlSW5saW5lRnVuY3Rpb25UeXBlICE9IG51bGwpIHsKICAgICAgZW5kSW5saW5lRnVuY3Rpb25UeXBlID0KICAgICAgICAgIHR5cGVQYXJhbS5wYXJzZVZhcmlhYmxlcyhiZWZvcmVJbmxpbmVGdW5jdGlvblR5cGUsIHRoaXMpOwogICAgICBsaXN0ZW5lci5iZWdpbkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoYmVmb3JlSW5saW5lRnVuY3Rpb25UeXBlLm5leHQpOwogICAgICB0b2tlbiA9IHR5cGVJbmZvLnBhcnNlVHlwZShiZWZvcmVUeXBlLCB0aGlzKTsKICAgICAgZW5kSW5saW5lRnVuY3Rpb25UeXBlID0gcGFyc2VGb3JtYWxQYXJhbWV0ZXJzUmVxdWlyZWRPcHQoCiAgICAgICAgICBlbmRJbmxpbmVGdW5jdGlvblR5cGUsIE1lbWJlcktpbmQuRnVuY3Rpb25UeXBlZFBhcmFtZXRlcik7CiAgICAgIFRva2VuIHF1ZXN0aW9uOwogICAgICBpZiAob3B0aW9uYWwoJz8nLCBlbmRJbmxpbmVGdW5jdGlvblR5cGUubmV4dCkpIHsKICAgICAgICBxdWVzdGlvbiA9IGVuZElubGluZUZ1bmN0aW9uVHlwZSA9IGVuZElubGluZUZ1bmN0aW9uVHlwZS5uZXh0OwogICAgICB9CiAgICAgIGxpc3RlbmVyLmVuZEZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoCiAgICAgICAgICBiZWZvcmVJbmxpbmVGdW5jdGlvblR5cGUsIHF1ZXN0aW9uKTsKCiAgICAgIC8vIEdlbmVyYWxpemVkIGZ1bmN0aW9uIHR5cGVzIGRvbid0IGFsbG93IGlubGluZSBmdW5jdGlvbiB0eXBlcy4KICAgICAgLy8gVGhlIGZvbGxvd2luZyBpc24ndCBhbGxvd2VkOgogICAgICAvLyAgICBpbnQgRnVuY3Rpb24oaW50IGJhcihTdHJpbmcgeCkpLgogICAgICBpZiAoaW5GdW5jdGlvblR5cGUpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKGJlZm9yZUlubGluZUZ1bmN0aW9uVHlwZS5uZXh0LAogICAgICAgICAgICBmYXN0YS5tZXNzYWdlSW52YWxpZElubGluZUZ1bmN0aW9uVHlwZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5GdW5jdGlvblR5cGUpIHsKICAgICAgdG9rZW4gPSB0eXBlSW5mby5lbnN1cmVUeXBlT3JWb2lkKGJlZm9yZVR5cGUsIHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSB0eXBlSW5mby5wYXJzZVR5cGUoYmVmb3JlVHlwZSwgdGhpcyk7CiAgICB9CgogICAgVG9rZW4gbmFtZVRva2VuOwogICAgaWYgKHBlcmlvZEFmdGVyVGhpcyAhPSBudWxsKSB7CiAgICAgIHRva2VuID0gcGVyaW9kQWZ0ZXJUaGlzOwogICAgfQogICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAoaW5GdW5jdGlvblR5cGUgJiYgIWlzTmFtZWRQYXJhbWV0ZXIgJiYgIW5leHQuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgIG5hbWVUb2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vTmFtZShuYW1lVG9rZW4pOwogICAgfSBlbHNlIHsKICAgICAgbmFtZVRva2VuID0gdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBuYW1lQ29udGV4dCk7CiAgICAgIGlmIChpc05hbWVkUGFyYW1ldGVyICYmIG5hbWVUb2tlbi5sZXhlbWUuc3RhcnRzV2l0aCgiXyIpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuYW1lVG9rZW4sIGZhc3RhLm1lc3NhZ2VQcml2YXRlTmFtZWRQYXJhbWV0ZXIpOwogICAgICB9CiAgICB9CiAgICBpZiAoZW5kSW5saW5lRnVuY3Rpb25UeXBlICE9IG51bGwpIHsKICAgICAgdG9rZW4gPSBlbmRJbmxpbmVGdW5jdGlvblR5cGU7CiAgICB9CiAgICBuZXh0ID0gdG9rZW4ubmV4dDsKCiAgICBTdHJpbmcgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgVG9rZW4gaW5pdGlhbGl6ZXJTdGFydCwgaW5pdGlhbGl6ZXJFbmQ7CiAgICBpZiAoKGlkZW50aWNhbCgnPScsIHZhbHVlKSkgfHwgKGlkZW50aWNhbCgnOicsIHZhbHVlKSkpIHsKICAgICAgVG9rZW4gZXF1YWwgPSBuZXh0OwogICAgICBpbml0aWFsaXplclN0YXJ0ID0gZXF1YWwubmV4dDsKICAgICAgbGlzdGVuZXIuYmVnaW5Gb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uKCk7CiAgICAgIHRva2VuID0gaW5pdGlhbGl6ZXJFbmQgPSBwYXJzZUV4cHJlc3Npb24oZXF1YWwpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgbGlzdGVuZXIuZW5kRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbigpOwogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIGxhc3QgcGFyYW1ldGVyIGZyb20gdGhlCiAgICAgIC8vIGhhbmRsZVZhbHVlZEZvcm1hbFBhcmFtZXRlciBldmVudC4uLiBpdCBhcHBlYXJzIHRvIGJlIHVudXNlZC4KICAgICAgbGlzdGVuZXIuaGFuZGxlVmFsdWVkRm9ybWFsUGFyYW1ldGVyKGVxdWFsLCBuZXh0KTsKICAgICAgaWYgKGlzTWFuZGF0b3J5Rm9ybWFsUGFyYW1ldGVyS2luZChwYXJhbWV0ZXJLaW5kKSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIGVxdWFsLCBmYXN0YS5tZXNzYWdlUmVxdWlyZWRQYXJhbWV0ZXJXaXRoRGVmYXVsdCk7CiAgICAgIH0gZWxzZSBpZiAoaXNPcHRpb25hbFBvc2l0aW9uYWxGb3JtYWxQYXJhbWV0ZXJLaW5kKHBhcmFtZXRlcktpbmQpICYmCiAgICAgICAgICBpZGVudGljYWwoJzonLCB2YWx1ZSkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBlcXVhbCwgZmFzdGEubWVzc2FnZVBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzKTsKICAgICAgfSBlbHNlIGlmIChpbkZ1bmN0aW9uVHlwZSB8fAogICAgICAgICAgbWVtYmVyS2luZCA9PSBNZW1iZXJLaW5kLkZ1bmN0aW9uVHlwZUFsaWFzIHx8CiAgICAgICAgICBtZW1iZXJLaW5kID09IE1lbWJlcktpbmQuRnVuY3Rpb25UeXBlZFBhcmFtZXRlcikgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoZXF1YWwsIGZhc3RhLm1lc3NhZ2VGdW5jdGlvblR5cGVEZWZhdWx0VmFsdWUpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5oYW5kbGVGb3JtYWxQYXJhbWV0ZXJXaXRob3V0VmFsdWUobmV4dCk7CiAgICB9CiAgICBsaXN0ZW5lci5lbmRGb3JtYWxQYXJhbWV0ZXIodGhpc0tleXdvcmQsIHBlcmlvZEFmdGVyVGhpcywgbmFtZVRva2VuLAogICAgICAgIGluaXRpYWxpemVyU3RhcnQsIGluaXRpYWxpemVyRW5kLCBwYXJhbWV0ZXJLaW5kLCBtZW1iZXJLaW5kKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gZGVmYXVsdEZvcm1hbFBhcmFtZXRlcjoKICAvLy8gICBub3JtYWxGb3JtYWxQYXJhbWV0ZXIgKCc9JyBleHByZXNzaW9uKT8KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZU9wdGlvbmFsUG9zaXRpb25hbFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ1snLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5PcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMoYmVnaW4pOwogICAgaW50IHBhcmFtZXRlckNvdW50ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJ10nLCBuZXh0KSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VGb3JtYWxQYXJhbWV0ZXIoCiAgICAgICAgICB0b2tlbiwgRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbFBvc2l0aW9uYWwsIGtpbmQpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgKytwYXJhbWV0ZXJDb3VudDsKICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgaWYgKCFvcHRpb25hbCgnXScsIG5leHQpKSB7CiAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICBuZXh0LCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJ10nKSk7CiAgICAgICAgICAvLyBTY2FubmVyIGd1YXJhbnRlZXMgYSBjbG9zaW5nIGJyYWNrZXQuCiAgICAgICAgICBuZXh0ID0gYmVnaW4uZW5kR3JvdXA7CiAgICAgICAgICB3aGlsZSAodG9rZW4ubmV4dCAhPSBuZXh0KSB7CiAgICAgICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdG9rZW4gPSBuZXh0OwogICAgfQogICAgaWYgKHBhcmFtZXRlckNvdW50ID09IDApIHsKICAgICAgcmV3cml0ZUFuZFJlY292ZXIoCiAgICAgICAgICB0b2tlbiwKICAgICAgICAgIGZhc3RhLm1lc3NhZ2VFbXB0eU9wdGlvbmFsUGFyYW1ldGVyTGlzdCwKICAgICAgICAgIG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbigKICAgICAgICAgICAgICBUb2tlblR5cGUuSURFTlRJRklFUiwgJycsIHRva2VuLm5leHQuY2hhck9mZnNldCwgMCkpOwogICAgICB0b2tlbiA9IHBhcnNlRm9ybWFsUGFyYW1ldGVyKAogICAgICAgICAgdG9rZW4sIEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxQb3NpdGlvbmFsLCBraW5kKTsKICAgICAgKytwYXJhbWV0ZXJDb3VudDsKICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnXScsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5lbmRPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMocGFyYW1ldGVyQ291bnQsIGJlZ2luLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGRlZmF1bHROYW1lZFBhcmFtZXRlcjoKICAvLy8gICBub3JtYWxGb3JtYWxQYXJhbWV0ZXIgKCc9JyBleHByZXNzaW9uKT8gfAogIC8vLyAgIG5vcm1hbEZvcm1hbFBhcmFtZXRlciAoJzonIGV4cHJlc3Npb24pPwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlT3B0aW9uYWxOYW1lZFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3snLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5PcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMoYmVnaW4pOwogICAgaW50IHBhcmFtZXRlckNvdW50ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJ30nLCBuZXh0KSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRva2VuID0KICAgICAgICAgIHBhcnNlRm9ybWFsUGFyYW1ldGVyKHRva2VuLCBGb3JtYWxQYXJhbWV0ZXJLaW5kLm9wdGlvbmFsTmFtZWQsIGtpbmQpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgKytwYXJhbWV0ZXJDb3VudDsKICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgaWYgKCFvcHRpb25hbCgnfScsIG5leHQpKSB7CiAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICBuZXh0LCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJ30nKSk7CiAgICAgICAgICAvLyBTY2FubmVyIGd1YXJhbnRlZXMgYSBjbG9zaW5nIGJyYWNrZXQuCiAgICAgICAgICBuZXh0ID0gYmVnaW4uZW5kR3JvdXA7CiAgICAgICAgICB3aGlsZSAodG9rZW4ubmV4dCAhPSBuZXh0KSB7CiAgICAgICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdG9rZW4gPSBuZXh0OwogICAgfQogICAgaWYgKHBhcmFtZXRlckNvdW50ID09IDApIHsKICAgICAgcmV3cml0ZUFuZFJlY292ZXIoCiAgICAgICAgICB0b2tlbiwKICAgICAgICAgIGZhc3RhLm1lc3NhZ2VFbXB0eU5hbWVkUGFyYW1ldGVyTGlzdCwKICAgICAgICAgIG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbigKICAgICAgICAgICAgICBUb2tlblR5cGUuSURFTlRJRklFUiwgJycsIHRva2VuLm5leHQuY2hhck9mZnNldCwgMCkpOwogICAgICB0b2tlbiA9CiAgICAgICAgICBwYXJzZUZvcm1hbFBhcmFtZXRlcih0b2tlbiwgRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbE5hbWVkLCBraW5kKTsKICAgICAgKytwYXJhbWV0ZXJDb3VudDsKICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnfScsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5lbmRPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMocGFyYW1ldGVyQ291bnQsIGJlZ2luLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHF1YWxpZmllZDoKICAvLy8gICBpZGVudGlmaWVyIHF1YWxpZmllZFJlc3QqCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VRdWFsaWZpZWQoVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQsCiAgICAgIElkZW50aWZpZXJDb250ZXh0IGNvbnRpbnVhdGlvbkNvbnRleHQpIHsKICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgY29udGV4dCk7CiAgICB3aGlsZSAob3B0aW9uYWwoJy4nLCB0b2tlbi5uZXh0KSkgewogICAgICB0b2tlbiA9IHBhcnNlUXVhbGlmaWVkUmVzdCh0b2tlbiwgY29udGludWF0aW9uQ29udGV4dCk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHF1YWxpZmllZFJlc3RPcHQ6CiAgLy8vICAgcXVhbGlmaWVkUmVzdD8KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVF1YWxpZmllZFJlc3RPcHQoCiAgICAgIFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250aW51YXRpb25Db250ZXh0KSB7CiAgICBpZiAob3B0aW9uYWwoJy4nLCB0b2tlbi5uZXh0KSkgewogICAgICByZXR1cm4gcGFyc2VRdWFsaWZpZWRSZXN0KHRva2VuLCBjb250aW51YXRpb25Db250ZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICB9CgogIC8vLyBgYGAKICAvLy8gcXVhbGlmaWVkUmVzdDoKICAvLy8gICAnLicgaWRlbnRpZmllcgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlUXVhbGlmaWVkUmVzdChUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCcuJywgdG9rZW4pKTsKICAgIFRva2VuIHBlcmlvZCA9IHRva2VuOwogICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBjb250ZXh0KTsKICAgIGxpc3RlbmVyLmhhbmRsZVF1YWxpZmllZChwZXJpb2QpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gc2tpcEJsb2NrKFRva2VuIHRva2VuKSB7CiAgICAvLyBUaGUgc2Nhbm5lciBlbnN1cmVzIHRoYXQgYHtgIGFsd2F5cyBoYXMgYSBjbG9zaW5nIGB9YC4KICAgIHJldHVybiBlbnN1cmVCbG9jayh0b2tlbiwgbnVsbCwgbnVsbCkuZW5kR3JvdXA7CiAgfQoKICAvLy8gYGBgCiAgLy8vIGVudW1UeXBlOgogIC8vLyAgIG1ldGFkYXRhICdlbnVtJyBpZCAneycgbWV0YWRhdGEgaWQgWycsJyBtZXRhZGF0YSBpZF0qIFsnLCddICd9JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRW51bShUb2tlbiBlbnVtS2V5d29yZCkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCdlbnVtJywgZW51bUtleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luRW51bShlbnVtS2V5d29yZCk7CiAgICBUb2tlbiB0b2tlbiA9CiAgICAgICAgZW5zdXJlSWRlbnRpZmllcihlbnVtS2V5d29yZCwgSWRlbnRpZmllckNvbnRleHQuZW51bURlY2xhcmF0aW9uKTsKICAgIFRva2VuIGxlZnRCcmFjZSA9IHRva2VuLm5leHQ7CiAgICBpbnQgY291bnQgPSAwOwogICAgaWYgKG9wdGlvbmFsKCd7JywgbGVmdEJyYWNlKSkgewogICAgICB0b2tlbiA9IGxlZnRCcmFjZTsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBpZiAob3B0aW9uYWwoJ30nLCBuZXh0KSkgewogICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgZmFzdGEubWVzc2FnZUVudW1EZWNsYXJhdGlvbkVtcHR5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0b2tlbiA9IHBhcnNlTWV0YWRhdGFTdGFyKHRva2VuKTsKICAgICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmVudW1WYWx1ZURlY2xhcmF0aW9uKTsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBjb3VudCsrOwogICAgICAgIGlmIChvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnfScsIG5leHQpKSB7CiAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgIFRva2VuIGVuZEdyb3VwID0gbGVmdEJyYWNlLmVuZEdyb3VwOwogICAgICAgICAgaWYgKGVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgIC8vIFRoZSBzY2FubmVyIGRpZCBub3QgcGxhY2UgdGhlIHN5bnRoZXRpYyAnfScgY29ycmVjdGx5LgogICAgICAgICAgICB0b2tlbiA9IHJld3JpdGVyLm1vdmVTeW50aGV0aWModG9rZW4sIGVuZEdyb3VwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9IGVsc2UgaWYgKG5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0IHRva2VuIGlzIGFuIGlkZW50aWZpZXIsIGFzc3VtZSBhIG1pc3NpbmcgY29tbWEuCiAgICAgICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciBpbXByb3ZlZCByZWNvdmVyeSBmb3IgbWlzc2luZyBgfWAKICAgICAgICAgICAgLy8gYm90aCBoZXJlIGFuZCB3aGVuIHRoZSBzY2FubmVyIGluc2VydHMgYSBzeW50aGV0aWMgYH1gCiAgICAgICAgICAgIC8vIGZvciBzaXR1YXRpb25zIHN1Y2ggYXMgYGVudW0gTGV0dGVyIHthLCBiICAgTGV0dGVyIGU7YC4KICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnLCcpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBhc3N1bWUgYSBtaXNzaW5nIGB9YCBhbmQgZXhpdCB0aGUgbG9vcAogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCd9JykpOwogICAgICAgICAgICB0b2tlbiA9IGxlZnRCcmFjZS5lbmRHcm91cDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogbWVyZ2UgdGhpcyBlcnJvciBtZXNzYWdlIHdpdGggbWlzc2luZyBjbGFzcy9taXhpbiBib2R5CiAgICAgIGxlZnRCcmFjZSA9IGVuc3VyZUJsb2NrKHRva2VuLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkRW51bUJvZHksIG51bGwpOwogICAgICB0b2tlbiA9IGxlZnRCcmFjZS5lbmRHcm91cDsKICAgIH0KICAgIGFzc2VydChvcHRpb25hbCgnfScsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5lbmRFbnVtKGVudW1LZXl3b3JkLCBsZWZ0QnJhY2UsIGNvdW50KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlQ2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgVG9rZW4gYWJzdHJhY3RUb2tlbiwgVG9rZW4gY2xhc3NLZXl3b3JkKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2NsYXNzJywgY2xhc3NLZXl3b3JkKSk7CiAgICBUb2tlbiBiZWdpbiA9IGFic3RyYWN0VG9rZW4gPz8gY2xhc3NLZXl3b3JkOwogICAgbGlzdGVuZXIuYmVnaW5DbGFzc09yTmFtZWRNaXhpbkFwcGxpY2F0aW9uKGJlZ2luKTsKICAgIFRva2VuIG5hbWUgPSBlbnN1cmVJZGVudGlmaWVyKAogICAgICAgIGNsYXNzS2V5d29yZCwgSWRlbnRpZmllckNvbnRleHQuY2xhc3NPck1peGluT3JFeHRlbnNpb25EZWNsYXJhdGlvbik7CiAgICBUb2tlbiB0b2tlbiA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyhuYW1lLCB0cnVlKS5wYXJzZVZhcmlhYmxlcyhuYW1lLCB0aGlzKTsKICAgIGlmIChvcHRpb25hbCgnPScsIHRva2VuLm5leHQpKSB7CiAgICAgIGxpc3RlbmVyLmJlZ2luTmFtZWRNaXhpbkFwcGxpY2F0aW9uKGJlZ2luLCBhYnN0cmFjdFRva2VuLCBuYW1lKTsKICAgICAgcmV0dXJuIHBhcnNlTmFtZWRNaXhpbkFwcGxpY2F0aW9uKHRva2VuLCBiZWdpbiwgY2xhc3NLZXl3b3JkKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpc3RlbmVyLmJlZ2luQ2xhc3NEZWNsYXJhdGlvbihiZWdpbiwgYWJzdHJhY3RUb2tlbiwgbmFtZSk7CiAgICAgIHJldHVybiBwYXJzZUNsYXNzKHRva2VuLCBiZWdpbiwgY2xhc3NLZXl3b3JkKTsKICAgIH0KICB9CgogIFRva2VuIHBhcnNlTmFtZWRNaXhpbkFwcGxpY2F0aW9uKAogICAgICBUb2tlbiB0b2tlbiwgVG9rZW4gYmVnaW4sIFRva2VuIGNsYXNzS2V5d29yZCkgewogICAgVG9rZW4gZXF1YWxzID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc9JywgZXF1YWxzKSk7CiAgICB0b2tlbiA9IGNvbXB1dGVUeXBlKHRva2VuLCB0cnVlKS5lbnN1cmVUeXBlTm90Vm9pZCh0b2tlbiwgdGhpcyk7CiAgICB0b2tlbiA9IHBhcnNlTWl4aW5BcHBsaWNhdGlvblJlc3QodG9rZW4pOwogICAgVG9rZW4gaW1wbGVtZW50c0tleXdvcmQgPSBudWxsOwogICAgaWYgKG9wdGlvbmFsKCdpbXBsZW1lbnRzJywgdG9rZW4ubmV4dCkpIHsKICAgICAgaW1wbGVtZW50c0tleXdvcmQgPSB0b2tlbi5uZXh0OwogICAgICB0b2tlbiA9IHBhcnNlVHlwZUxpc3QoaW1wbGVtZW50c0tleXdvcmQpOwogICAgfQogICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgbGlzdGVuZXIuZW5kTmFtZWRNaXhpbkFwcGxpY2F0aW9uKAogICAgICAgIGJlZ2luLCBjbGFzc0tleXdvcmQsIGVxdWFscywgaW1wbGVtZW50c0tleXdvcmQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQYXJzZSB0aGUgcG9ydGlvbiBvZiBhIGNsYXNzIGRlY2xhcmF0aW9uIChub3QgYSBtaXhpbiBhcHBsaWNhdGlvbikgdGhhdAogIC8vLyBmb2xsb3dzIHRoZSBlbmQgb2YgdGhlIHR5cGUgcGFyYW1ldGVycy4KICAvLy8KICAvLy8gYGBgCiAgLy8vIGNsYXNzRGVmaW5pdGlvbjoKICAvLy8gICBtZXRhZGF0YSBhYnN0cmFjdD8gJ2NsYXNzJyBpZGVudGlmaWVyIHR5cGVQYXJhbWV0ZXJzPwogIC8vLyAgICAgICAoc3VwZXJjbGFzcyBtaXhpbnM/KT8gaW50ZXJmYWNlcz8KICAvLy8gICAgICAgJ3snIChtZXRhZGF0YSBjbGFzc01lbWJlckRlZmluaXRpb24pKiAnfScgfAogIC8vLyAgIG1ldGFkYXRhIGFic3RyYWN0PyAnY2xhc3MnIG1peGluQXBwbGljYXRpb25DbGFzcwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQ2xhc3MoVG9rZW4gdG9rZW4sIFRva2VuIGJlZ2luLCBUb2tlbiBjbGFzc0tleXdvcmQpIHsKICAgIFRva2VuIHN0YXJ0ID0gdG9rZW47CiAgICB0b2tlbiA9IHBhcnNlQ2xhc3NIZWFkZXJPcHQodG9rZW4sIGJlZ2luLCBjbGFzc0tleXdvcmQpOwogICAgaWYgKCFvcHRpb25hbCgneycsIHRva2VuLm5leHQpKSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIHRva2VuID0gcGFyc2VDbGFzc0hlYWRlclJlY292ZXJ5KHN0YXJ0LCBiZWdpbiwgY2xhc3NLZXl3b3JkKTsKICAgICAgZW5zdXJlQmxvY2sodG9rZW4sIG51bGwsICdjbGFzcyBkZWNsYXJhdGlvbicpOwogICAgfQogICAgdG9rZW4gPSBwYXJzZUNsYXNzT3JNaXhpbkJvZHkodG9rZW4pOwogICAgbGlzdGVuZXIuZW5kQ2xhc3NEZWNsYXJhdGlvbihiZWdpbiwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VDbGFzc0hlYWRlck9wdChUb2tlbiB0b2tlbiwgVG9rZW4gYmVnaW4sIFRva2VuIGNsYXNzS2V5d29yZCkgewogICAgdG9rZW4gPSBwYXJzZUNsYXNzRXh0ZW5kc09wdCh0b2tlbik7CiAgICB0b2tlbiA9IHBhcnNlV2l0aENsYXVzZU9wdCh0b2tlbik7CiAgICB0b2tlbiA9IHBhcnNlQ2xhc3NPck1peGluSW1wbGVtZW50c09wdCh0b2tlbik7CiAgICBUb2tlbiBuYXRpdmVUb2tlbjsKICAgIGlmIChvcHRpb25hbCgnbmF0aXZlJywgdG9rZW4ubmV4dCkpIHsKICAgICAgbmF0aXZlVG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICB0b2tlbiA9IHBhcnNlTmF0aXZlQ2xhdXNlKHRva2VuKTsKICAgIH0KICAgIGxpc3RlbmVyLmhhbmRsZUNsYXNzSGVhZGVyKGJlZ2luLCBjbGFzc0tleXdvcmQsIG5hdGl2ZVRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBSZWNvdmVyIGdpdmVuIG91dC1vZi1vcmRlciBjbGF1c2VzIGluIGEgY2xhc3MgaGVhZGVyLgogIFRva2VuIHBhcnNlQ2xhc3NIZWFkZXJSZWNvdmVyeShUb2tlbiB0b2tlbiwgVG9rZW4gYmVnaW4sIFRva2VuIGNsYXNzS2V5d29yZCkgewogICAgZmluYWwgcHJpbWFyeUxpc3RlbmVyID0gbGlzdGVuZXI7CiAgICBmaW5hbCByZWNvdmVyeUxpc3RlbmVyID0gbmV3IENsYXNzSGVhZGVyUmVjb3ZlcnlMaXN0ZW5lcigpOwoKICAgIC8vIFJlcGFyc2UgdG8gZGV0ZXJtaW5lIHdoaWNoIGNsYXVzZXMgaGF2ZSBhbHJlYWR5IGJlZW4gcGFyc2VkCiAgICAvLyBidXQgaW50ZXJjZXB0IHRoZSBldmVudHMgc28gdGhleSBhcmUgbm90IHNlbnQgdG8gdGhlIHByaW1hcnkgbGlzdGVuZXIuCiAgICBsaXN0ZW5lciA9IHJlY292ZXJ5TGlzdGVuZXI7CiAgICB0b2tlbiA9IHBhcnNlQ2xhc3NIZWFkZXJPcHQodG9rZW4sIGJlZ2luLCBjbGFzc0tleXdvcmQpOwogICAgYm9vbCBoYXNFeHRlbmRzID0gcmVjb3ZlcnlMaXN0ZW5lci5leHRlbmRzS2V5d29yZCAhPSBudWxsOwogICAgYm9vbCBoYXNJbXBsZW1lbnRzID0gcmVjb3ZlcnlMaXN0ZW5lci5pbXBsZW1lbnRzS2V5d29yZCAhPSBudWxsOwogICAgYm9vbCBoYXNXaXRoID0gcmVjb3ZlcnlMaXN0ZW5lci53aXRoS2V5d29yZCAhPSBudWxsOwoKICAgIC8vIFVwZGF0ZSB0aGUgcmVjb3ZlcnkgbGlzdGVuZXIgdG8gZm9yd2FyZCBzdWJzZXF1ZW50IGV2ZW50cwogICAgLy8gdG8gdGhlIHByaW1hcnkgbGlzdGVuZXIuCiAgICByZWNvdmVyeUxpc3RlbmVyLmxpc3RlbmVyID0gcHJpbWFyeUxpc3RlbmVyOwoKICAgIC8vIFBhcnNlIGFkZGl0aW9uYWwgb3V0LW9mLW9yZGVyIGNsYXVzZXMKICAgIFRva2VuIHN0YXJ0OwogICAgZG8gewogICAgICBzdGFydCA9IHRva2VuOwoKICAgICAgLy8gQ2hlY2sgZm9yIGV4dHJhbmVvdXMgdG9rZW4gaW4gdGhlIG1pZGRsZSBvZiBhIGNsYXNzIGhlYWRlci4KICAgICAgdG9rZW4gPSBza2lwVW5leHBlY3RlZFRva2VuT3B0KAogICAgICAgICAgdG9rZW4sIGNvbnN0IDxTdHJpbmc+WydleHRlbmRzJywgJ3dpdGgnLCAnaW1wbGVtZW50cycsICd7J10pOwoKICAgICAgLy8gRHVyaW5nIHJlY292ZXJ5LCBjbGF1c2VzIGFyZSBwYXJzZWQgaW4gdGhlIHNhbWUgb3JkZXIKICAgICAgLy8gYW5kIGdlbmVyYXRlIHRoZSBzYW1lIGV2ZW50cyBhcyBpbiB0aGUgcGFyc2VDbGFzc0hlYWRlciBtZXRob2QgYWJvdmUuCiAgICAgIHJlY292ZXJ5TGlzdGVuZXIuY2xlYXIoKTsKCiAgICAgIGlmICh0b2tlbi5uZXh0LmlzS2V5d29yZE9ySWRlbnRpZmllciAmJgogICAgICAgICAgY29uc3QgWydleHRlbmQnLCAnb24nXS5jb250YWlucyh0b2tlbi5uZXh0LmxleGVtZSkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbi5uZXh0LCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSW5zdGVhZC53aXRoQXJndW1lbnRzKCdleHRlbmRzJykpOwogICAgICAgIFRva2VuIGluY29ycmVjdEV4dGVuZHNLZXl3b3JkID0gdG9rZW4ubmV4dDsKICAgICAgICB0b2tlbiA9IGNvbXB1dGVUeXBlKGluY29ycmVjdEV4dGVuZHNLZXl3b3JkLCB0cnVlKQogICAgICAgICAgICAuZW5zdXJlVHlwZU5vdFZvaWQoaW5jb3JyZWN0RXh0ZW5kc0tleXdvcmQsIHRoaXMpOwogICAgICAgIGxpc3RlbmVyLmhhbmRsZUNsYXNzRXh0ZW5kcyhpbmNvcnJlY3RFeHRlbmRzS2V5d29yZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZUNsYXNzRXh0ZW5kc09wdCh0b2tlbik7CiAgICAgIH0KCiAgICAgIGlmIChyZWNvdmVyeUxpc3RlbmVyLmV4dGVuZHNLZXl3b3JkICE9IG51bGwpIHsKICAgICAgICBpZiAoaGFzRXh0ZW5kcykgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICByZWNvdmVyeUxpc3RlbmVyLmV4dGVuZHNLZXl3b3JkLCBmYXN0YS5tZXNzYWdlTXVsdGlwbGVFeHRlbmRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGhhc1dpdGgpIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihyZWNvdmVyeUxpc3RlbmVyLmV4dGVuZHNLZXl3b3JkLAogICAgICAgICAgICAgICAgZmFzdGEubWVzc2FnZVdpdGhCZWZvcmVFeHRlbmRzKTsKICAgICAgICAgIH0gZWxzZSBpZiAoaGFzSW1wbGVtZW50cykgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHJlY292ZXJ5TGlzdGVuZXIuZXh0ZW5kc0tleXdvcmQsCiAgICAgICAgICAgICAgICBmYXN0YS5tZXNzYWdlSW1wbGVtZW50c0JlZm9yZUV4dGVuZHMpOwogICAgICAgICAgfQogICAgICAgICAgaGFzRXh0ZW5kcyA9IHRydWU7CiAgICAgICAgfQogICAgICB9CgogICAgICB0b2tlbiA9IHBhcnNlV2l0aENsYXVzZU9wdCh0b2tlbik7CgogICAgICBpZiAocmVjb3ZlcnlMaXN0ZW5lci53aXRoS2V5d29yZCAhPSBudWxsKSB7CiAgICAgICAgaWYgKGhhc1dpdGgpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgcmVjb3ZlcnlMaXN0ZW5lci53aXRoS2V5d29yZCwgZmFzdGEubWVzc2FnZU11bHRpcGxlV2l0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChoYXNJbXBsZW1lbnRzKSB7CiAgICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IocmVjb3ZlcnlMaXN0ZW5lci53aXRoS2V5d29yZCwKICAgICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VJbXBsZW1lbnRzQmVmb3JlV2l0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBoYXNXaXRoID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRva2VuID0gcGFyc2VDbGFzc09yTWl4aW5JbXBsZW1lbnRzT3B0KHRva2VuKTsKCiAgICAgIGlmIChyZWNvdmVyeUxpc3RlbmVyLmltcGxlbWVudHNLZXl3b3JkICE9IG51bGwpIHsKICAgICAgICBpZiAoaGFzSW1wbGVtZW50cykgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihyZWNvdmVyeUxpc3RlbmVyLmltcGxlbWVudHNLZXl3b3JkLAogICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VNdWx0aXBsZUltcGxlbWVudHMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoYXNJbXBsZW1lbnRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGxpc3RlbmVyLmhhbmRsZVJlY292ZXJDbGFzc0hlYWRlcigpOwoKICAgICAgLy8gRXhpdCBpZiBhIGNsYXNzIGJvZHkgaXMgZGV0ZWN0ZWQsIG9yIGlmIG5vIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUKICAgIH0gd2hpbGUgKCFvcHRpb25hbCgneycsIHRva2VuLm5leHQpICYmIHN0YXJ0ICE9IHRva2VuKTsKCiAgICBsaXN0ZW5lciA9IHByaW1hcnlMaXN0ZW5lcjsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlQ2xhc3NFeHRlbmRzT3B0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnZXh0ZW5kcycsIG5leHQpKSB7CiAgICAgIFRva2VuIGV4dGVuZHNLZXl3b3JkID0gbmV4dDsKICAgICAgdG9rZW4gPSBjb21wdXRlVHlwZShuZXh0LCB0cnVlKS5lbnN1cmVUeXBlTm90Vm9pZChuZXh0LCB0aGlzKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlQ2xhc3NFeHRlbmRzKGV4dGVuZHNLZXl3b3JkKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZSh0b2tlbik7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUNsYXNzRXh0ZW5kcyhudWxsKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gaW1wbGVtZW50c0NsYXVzZToKICAvLy8gICAnaW1wbGVtZW50cycgdHlwZU5hbWUgKCcsJyB0eXBlTmFtZSkqCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VDbGFzc09yTWl4aW5JbXBsZW1lbnRzT3B0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBpbXBsZW1lbnRzS2V5d29yZDsKICAgIGludCBpbnRlcmZhY2VzQ291bnQgPSAwOwogICAgaWYgKG9wdGlvbmFsKCdpbXBsZW1lbnRzJywgdG9rZW4ubmV4dCkpIHsKICAgICAgaW1wbGVtZW50c0tleXdvcmQgPSB0b2tlbi5uZXh0OwogICAgICBkbyB7CiAgICAgICAgdG9rZW4gPQogICAgICAgICAgICBjb21wdXRlVHlwZSh0b2tlbi5uZXh0LCB0cnVlKS5lbnN1cmVUeXBlTm90Vm9pZCh0b2tlbi5uZXh0LCB0aGlzKTsKICAgICAgICArK2ludGVyZmFjZXNDb3VudDsKICAgICAgfSB3aGlsZSAob3B0aW9uYWwoJywnLCB0b2tlbi5uZXh0KSk7CiAgICB9CiAgICBsaXN0ZW5lci5oYW5kbGVDbGFzc09yTWl4aW5JbXBsZW1lbnRzKGltcGxlbWVudHNLZXl3b3JkLCBpbnRlcmZhY2VzQ291bnQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlIGEgbWl4aW4gZGVjbGFyYXRpb24uCiAgLy8vCiAgLy8vIGBgYAogIC8vLyBtaXhpbkRlY2xhcmF0aW9uOgogIC8vLyAgIG1ldGFkYXRhPyAnbWl4aW4nIFtTaW1wbGVJZGVudGlmaWVyXSBbVHlwZVBhcmFtZXRlckxpc3RdPwogIC8vLyAgICAgICAgW09uQ2xhdXNlXT8gW0ltcGxlbWVudHNDbGF1c2VdPyAneycgW0NsYXNzTWVtYmVyXSogJ30nCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VNaXhpbihUb2tlbiBtaXhpbktleXdvcmQpIHsKICAgIGFzc2VydChvcHRpb25hbCgnbWl4aW4nLCBtaXhpbktleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luQ2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvbihtaXhpbktleXdvcmQpOwogICAgVG9rZW4gbmFtZSA9IGVuc3VyZUlkZW50aWZpZXIoCiAgICAgICAgbWl4aW5LZXl3b3JkLCBJZGVudGlmaWVyQ29udGV4dC5jbGFzc09yTWl4aW5PckV4dGVuc2lvbkRlY2xhcmF0aW9uKTsKICAgIFRva2VuIGhlYWRlclN0YXJ0ID0KICAgICAgICBjb21wdXRlVHlwZVBhcmFtT3JBcmcobmFtZSwgdHJ1ZSkucGFyc2VWYXJpYWJsZXMobmFtZSwgdGhpcyk7CiAgICBsaXN0ZW5lci5iZWdpbk1peGluRGVjbGFyYXRpb24obWl4aW5LZXl3b3JkLCBuYW1lKTsKICAgIFRva2VuIHRva2VuID0gcGFyc2VNaXhpbkhlYWRlck9wdChoZWFkZXJTdGFydCwgbWl4aW5LZXl3b3JkKTsKICAgIGlmICghb3B0aW9uYWwoJ3snLCB0b2tlbi5uZXh0KSkgewogICAgICAvLyBSZWNvdmVyeQogICAgICB0b2tlbiA9IHBhcnNlTWl4aW5IZWFkZXJSZWNvdmVyeSh0b2tlbiwgbWl4aW5LZXl3b3JkLCBoZWFkZXJTdGFydCk7CiAgICAgIGVuc3VyZUJsb2NrKHRva2VuLCBudWxsLCAnbWl4aW4gZGVjbGFyYXRpb24nKTsKICAgIH0KICAgIHRva2VuID0gcGFyc2VDbGFzc09yTWl4aW5Cb2R5KHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZE1peGluRGVjbGFyYXRpb24obWl4aW5LZXl3b3JkLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZU1peGluSGVhZGVyT3B0KFRva2VuIHRva2VuLCBUb2tlbiBtaXhpbktleXdvcmQpIHsKICAgIHRva2VuID0gcGFyc2VNaXhpbk9uT3B0KHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VDbGFzc09yTWl4aW5JbXBsZW1lbnRzT3B0KHRva2VuKTsKICAgIGxpc3RlbmVyLmhhbmRsZU1peGluSGVhZGVyKG1peGluS2V5d29yZCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZU1peGluSGVhZGVyUmVjb3ZlcnkoCiAgICAgIFRva2VuIHRva2VuLCBUb2tlbiBtaXhpbktleXdvcmQsIFRva2VuIGhlYWRlclN0YXJ0KSB7CiAgICBmaW5hbCBwcmltYXJ5TGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgIGZpbmFsIHJlY292ZXJ5TGlzdGVuZXIgPSBuZXcgTWl4aW5IZWFkZXJSZWNvdmVyeUxpc3RlbmVyKCk7CgogICAgLy8gUmVwYXJzZSB0byBkZXRlcm1pbmUgd2hpY2ggY2xhdXNlcyBoYXZlIGFscmVhZHkgYmVlbiBwYXJzZWQKICAgIC8vIGJ1dCBpbnRlcmNlcHQgdGhlIGV2ZW50cyBzbyB0aGV5IGFyZSBub3Qgc2VudCB0byB0aGUgcHJpbWFyeSBsaXN0ZW5lci4KICAgIGxpc3RlbmVyID0gcmVjb3ZlcnlMaXN0ZW5lcjsKICAgIHRva2VuID0gcGFyc2VNaXhpbkhlYWRlck9wdChoZWFkZXJTdGFydCwgbWl4aW5LZXl3b3JkKTsKICAgIGJvb2wgaGFzT24gPSByZWNvdmVyeUxpc3RlbmVyLm9uS2V5d29yZCAhPSBudWxsOwogICAgYm9vbCBoYXNJbXBsZW1lbnRzID0gcmVjb3ZlcnlMaXN0ZW5lci5pbXBsZW1lbnRzS2V5d29yZCAhPSBudWxsOwoKICAgIC8vIFVwZGF0ZSB0aGUgcmVjb3ZlcnkgbGlzdGVuZXIgdG8gZm9yd2FyZCBzdWJzZXF1ZW50IGV2ZW50cwogICAgLy8gdG8gdGhlIHByaW1hcnkgbGlzdGVuZXIuCiAgICByZWNvdmVyeUxpc3RlbmVyLmxpc3RlbmVyID0gcHJpbWFyeUxpc3RlbmVyOwoKICAgIC8vIFBhcnNlIGFkZGl0aW9uYWwgb3V0LW9mLW9yZGVyIGNsYXVzZXMKICAgIFRva2VuIHN0YXJ0OwogICAgZG8gewogICAgICBzdGFydCA9IHRva2VuOwoKICAgICAgLy8gQ2hlY2sgZm9yIGV4dHJhbmVvdXMgdG9rZW4gaW4gdGhlIG1pZGRsZSBvZiBhIGNsYXNzIGhlYWRlci4KICAgICAgdG9rZW4gPSBza2lwVW5leHBlY3RlZFRva2VuT3B0KAogICAgICAgICAgdG9rZW4sIGNvbnN0IDxTdHJpbmc+WydvbicsICdpbXBsZW1lbnRzJywgJ3snXSk7CgogICAgICAvLyBEdXJpbmcgcmVjb3ZlcnksIGNsYXVzZXMgYXJlIHBhcnNlZCBpbiB0aGUgc2FtZSBvcmRlciBhbmQKICAgICAgLy8gZ2VuZXJhdGUgdGhlIHNhbWUgZXZlbnRzIGFzIGluIHRoZSBwYXJzZU1peGluSGVhZGVyT3B0IG1ldGhvZCBhYm92ZS4KICAgICAgcmVjb3ZlcnlMaXN0ZW5lci5jbGVhcigpOwoKICAgICAgaWYgKHRva2VuLm5leHQuaXNLZXl3b3JkT3JJZGVudGlmaWVyICYmCiAgICAgICAgICBjb25zdCBbJ2V4dGVuZCcsICdleHRlbmRzJ10uY29udGFpbnModG9rZW4ubmV4dC5sZXhlbWUpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgdG9rZW4ubmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEluc3RlYWQud2l0aEFyZ3VtZW50cygnb24nKSk7CiAgICAgICAgdG9rZW4gPSBwYXJzZU1peGluT24odG9rZW4pOwogICAgICB9IGVsc2UgewogICAgICAgIHRva2VuID0gcGFyc2VNaXhpbk9uT3B0KHRva2VuKTsKICAgICAgfQoKICAgICAgaWYgKHJlY292ZXJ5TGlzdGVuZXIub25LZXl3b3JkICE9IG51bGwpIHsKICAgICAgICBpZiAoaGFzT24pIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgcmVjb3ZlcnlMaXN0ZW5lci5vbktleXdvcmQsIGZhc3RhLm1lc3NhZ2VNdWx0aXBsZU9uQ2xhdXNlcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChoYXNJbXBsZW1lbnRzKSB7CiAgICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgICByZWNvdmVyeUxpc3RlbmVyLm9uS2V5d29yZCwgZmFzdGEubWVzc2FnZUltcGxlbWVudHNCZWZvcmVPbik7CiAgICAgICAgICB9CiAgICAgICAgICBoYXNPbiA9IHRydWU7CiAgICAgICAgfQogICAgICB9CgogICAgICB0b2tlbiA9IHBhcnNlQ2xhc3NPck1peGluSW1wbGVtZW50c09wdCh0b2tlbik7CgogICAgICBpZiAocmVjb3ZlcnlMaXN0ZW5lci5pbXBsZW1lbnRzS2V5d29yZCAhPSBudWxsKSB7CiAgICAgICAgaWYgKGhhc0ltcGxlbWVudHMpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IocmVjb3ZlcnlMaXN0ZW5lci5pbXBsZW1lbnRzS2V5d29yZCwKICAgICAgICAgICAgICBmYXN0YS5tZXNzYWdlTXVsdGlwbGVJbXBsZW1lbnRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaGFzSW1wbGVtZW50cyA9IHRydWU7CiAgICAgICAgfQogICAgICB9CgogICAgICBsaXN0ZW5lci5oYW5kbGVSZWNvdmVyTWl4aW5IZWFkZXIoKTsKCiAgICAgIC8vIEV4aXQgaWYgYSBtaXhpbiBib2R5IGlzIGRldGVjdGVkLCBvciBpZiBubyBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlCiAgICB9IHdoaWxlICghb3B0aW9uYWwoJ3snLCB0b2tlbi5uZXh0KSAmJiBzdGFydCAhPSB0b2tlbik7CgogICAgbGlzdGVuZXIgPSBwcmltYXJ5TGlzdGVuZXI7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIG9uQ2xhdXNlOgogIC8vLyAgICdvbicgdHlwZU5hbWUgKCcsJyB0eXBlTmFtZSkqCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VNaXhpbk9uT3B0KFRva2VuIHRva2VuKSB7CiAgICBpZiAoIW9wdGlvbmFsKCdvbicsIHRva2VuLm5leHQpKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU1peGluT24obnVsbCwgMCk7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICAgIHJldHVybiBwYXJzZU1peGluT24odG9rZW4pOwogIH0KCiAgVG9rZW4gcGFyc2VNaXhpbk9uKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBvbktleXdvcmQgPSB0b2tlbi5uZXh0OwogICAgLy8gRHVyaW5nIHJlY292ZXJ5LCB0aGUgW29uS2V5d29yZF0gY2FuIGJlICJleHRlbmQiIG9yICJleHRlbmRzIgogICAgYXNzZXJ0KG9wdGlvbmFsKCdvbicsIG9uS2V5d29yZCkgfHwKICAgICAgICBvcHRpb25hbCgnZXh0ZW5kcycsIG9uS2V5d29yZCkgfHwKICAgICAgICBvbktleXdvcmQubGV4ZW1lID09ICdleHRlbmQnKTsKICAgIGludCB0eXBlQ291bnQgPSAwOwogICAgZG8gewogICAgICB0b2tlbiA9IGNvbXB1dGVUeXBlKHRva2VuLm5leHQsIHRydWUpLmVuc3VyZVR5cGVOb3RWb2lkKHRva2VuLm5leHQsIHRoaXMpOwogICAgICArK3R5cGVDb3VudDsKICAgIH0gd2hpbGUgKG9wdGlvbmFsKCcsJywgdG9rZW4ubmV4dCkpOwogICAgbGlzdGVuZXIuaGFuZGxlTWl4aW5PbihvbktleXdvcmQsIHR5cGVDb3VudCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vICdleHRlbnNpb24nIDxpZGVudGlmaWVyPj8gPHR5cGVQYXJhbWV0ZXJzPj8gJ29uJyA8dHlwZT4gJz8nPwogIC8vICAgYHsnCiAgLy8gICAgIDxtZW1iZXJEZWNsYXJhdGlvbj4qCiAgLy8gICBgfScKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VFeHRlbnNpb24oVG9rZW4gZXh0ZW5zaW9uS2V5d29yZCkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCdleHRlbnNpb24nLCBleHRlbnNpb25LZXl3b3JkKSk7CiAgICBUb2tlbiB0b2tlbiA9IGV4dGVuc2lvbktleXdvcmQ7CiAgICBUb2tlbiBuYW1lID0gdG9rZW4ubmV4dDsKICAgIGlmIChuYW1lLmlzSWRlbnRpZmllciAmJiAhb3B0aW9uYWwoJ29uJywgbmFtZSkpIHsKICAgICAgdG9rZW4gPSBuYW1lOwogICAgfSBlbHNlIHsKICAgICAgbmFtZSA9IG51bGw7CiAgICB9CiAgICB0b2tlbiA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0b2tlbiwgdHJ1ZSkucGFyc2VWYXJpYWJsZXModG9rZW4sIHRoaXMpOwogICAgbGlzdGVuZXIuYmVnaW5FeHRlbnNpb25EZWNsYXJhdGlvbihleHRlbnNpb25LZXl3b3JkLCBuYW1lKTsKICAgIFRva2VuIG9uS2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICBpZiAoIW9wdGlvbmFsKCdvbicsIG9uS2V5d29yZCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgaWYgKG9wdGlvbmFsKCdleHRlbmRzJywgb25LZXl3b3JkKSB8fAogICAgICAgICAgb3B0aW9uYWwoJ2ltcGxlbWVudHMnLCBvbktleXdvcmQpIHx8CiAgICAgICAgICBvcHRpb25hbCgnd2l0aCcsIG9uS2V5d29yZCkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBvbktleXdvcmQsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJbnN0ZWFkLndpdGhBcmd1bWVudHMoJ29uJykpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIHRva2VuLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3Qud2l0aEFyZ3VtZW50cygnb24nKSk7CiAgICAgICAgb25LZXl3b3JkID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljS2V5d29yZCh0b2tlbiwgS2V5d29yZC5PTik7CiAgICAgIH0KICAgIH0KICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUob25LZXl3b3JkLCB0cnVlKTsKICAgIHRva2VuID0gdHlwZUluZm8uZW5zdXJlVHlwZU9yVm9pZChvbktleXdvcmQsIHRoaXMpOwogICAgaWYgKCFvcHRpb25hbCgneycsIHRva2VuLm5leHQpKSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICB3aGlsZSAoIW5leHQuaXNFb2YpIHsKICAgICAgICBpZiAob3B0aW9uYWwoJywnLCBuZXh0KSB8fAogICAgICAgICAgICBvcHRpb25hbCgnZXh0ZW5kcycsIG5leHQpIHx8CiAgICAgICAgICAgIG9wdGlvbmFsKCdpbXBsZW1lbnRzJywgbmV4dCkgfHwKICAgICAgICAgICAgb3B0aW9uYWwoJ29uJywgbmV4dCkgfHwKICAgICAgICAgICAgb3B0aW9uYWwoJ3dpdGgnLCBuZXh0KSkgewogICAgICAgICAgLy8gUmVwb3J0IGFuIGVycm9yIGFuZCBza2lwIGAsYCBvciBzcGVjaWZpYyBrZXl3b3JkCiAgICAgICAgICAvLyBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGFuIGlkZW50aWZpZXIKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4obmV4dCwgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICBpZiAobmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVuc3VyZUJsb2NrKHRva2VuLCBudWxsLCAnZXh0ZW5zaW9uIGRlY2xhcmF0aW9uJyk7CiAgICB9CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogRG8gbm90IGFsbG93IGZpZWxkcyBvciBjb25zdHJ1Y3RvcnMKICAgIHRva2VuID0gcGFyc2VDbGFzc09yTWl4aW5Cb2R5KHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZEV4dGVuc2lvbkRlY2xhcmF0aW9uKGV4dGVuc2lvbktleXdvcmQsIG9uS2V5d29yZCwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VTdHJpbmdQYXJ0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChuZXh0LmtpbmQgIT0gU1RSSU5HX1RPS0VOKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4obmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZFN0cmluZyk7CiAgICAgIG5leHQgPSByZXdyaXRlci5pbnNlcnRUb2tlbih0b2tlbiwKICAgICAgICAgIG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbihUb2tlblR5cGUuU1RSSU5HLCAnJywgbmV4dC5jaGFyT2Zmc2V0KSk7CiAgICB9CiAgICBsaXN0ZW5lci5oYW5kbGVTdHJpbmdQYXJ0KG5leHQpOwogICAgcmV0dXJuIG5leHQ7CiAgfQoKICAvLy8gSW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgYWZ0ZXIgdGhlIGdpdmVuIFt0b2tlbl0gYW5kIGNyZWF0ZSBhbiBlcnJvcgogIC8vLyBtZXNzYWdlIGJhc2VkIG9uIHRoZSBnaXZlbiBbY29udGV4dF0uIFJldHVybiB0aGUgc3ludGhldGljIGlkZW50aWZpZXIgdGhhdAogIC8vLyB3YXMgaW5zZXJ0ZWQuCiAgVG9rZW4gaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCwKICAgICAge01lc3NhZ2UgbWVzc2FnZSwgVG9rZW4gbWVzc2FnZU9uVG9rZW59KSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobWVzc2FnZU9uVG9rZW4gPz8gbmV4dCwKICAgICAgICBtZXNzYWdlID8/IGNvbnRleHQucmVjb3ZlcnlUZW1wbGF0ZS53aXRoQXJndW1lbnRzKG5leHQpKTsKICAgIHJldHVybiByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuKTsKICB9CgogIC8vLyBQYXJzZSBhIHNpbXBsZSBpZGVudGlmaWVyIGF0IHRoZSBnaXZlbiBbdG9rZW5dLCBhbmQgcmV0dXJuIHRoZSBpZGVudGlmaWVyCiAgLy8vIHRoYXQgd2FzIHBhcnNlZC4KICAvLy8KICAvLy8gSWYgdGhlIHRva2VuIGlzIG5vdCBhbiBpZGVudGlmaWVyLCBvciBpcyBub3QgYXBwcm9wcmlhdGUgZm9yIHVzZSBhcyBhbgogIC8vLyBpZGVudGlmaWVyIGluIHRoZSBnaXZlbiBbY29udGV4dF0sIGNyZWF0ZSBhIHN5bnRoZXRpYyBpZGVudGlmaWVyLCByZXBvcnQKICAvLy8gYW4gZXJyb3IsIGFuZCByZXR1cm4gdGhlIHN5bnRoZXRpYyBpZGVudGlmaWVyLgogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIGFzc2VydChjb250ZXh0ICE9IG51bGwpOwogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBpZiAoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pIHsKICAgICAgaWRlbnRpZmllciA9IGNvbnRleHQuZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgdGhpcyk7CiAgICAgIGFzc2VydChpZGVudGlmaWVyICE9IG51bGwpOwogICAgICBhc3NlcnQoaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpOwogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlSWRlbnRpZmllcihpZGVudGlmaWVyLCBjb250ZXh0KTsKICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KCiAgYm9vbCBub3RFb2ZPclZhbHVlKFN0cmluZyB2YWx1ZSwgVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiAhaWRlbnRpY2FsKHRva2VuLmtpbmQsIEVPRl9UT0tFTikgJiYKICAgICAgICAhaWRlbnRpY2FsKHZhbHVlLCB0b2tlbi5zdHJpbmdWYWx1ZSk7CiAgfQoKICBUb2tlbiBwYXJzZVR5cGVWYXJpYWJsZXNPcHQoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBjb21wdXRlVHlwZVBhcmFtT3JBcmcodG9rZW4sIHRydWUpLnBhcnNlVmFyaWFibGVzKHRva2VuLCB0aGlzKTsKICB9CgogIC8vLyBQYXJzZSBhIHRvcCBsZXZlbCBmaWVsZCBvciBmdW5jdGlvbi4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgaXMgb25seSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgcGFyc2VyLiBBcyBhIHJlc3VsdCwgdGhpcwogIC8vLyBtZXRob2QgdGFrZXMgdGhlIG5leHQgdG9rZW4gdG8gYmUgY29uc3VtZWQgcmF0aGVyIHRoYW4gdGhlIGxhc3QgY29uc3VtZWQKICAvLy8gdG9rZW4gYW5kIHJldHVybnMgdGhlIHRva2VuIGFmdGVyIHRoZSBsYXN0IGNvbnN1bWVkIHRva2VuIHJhdGhlciB0aGFuIHRoZQogIC8vLyBsYXN0IGNvbnN1bWVkIHRva2VuLgogIFRva2VuIHBhcnNlVG9wTGV2ZWxNZW1iZXIoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gcGFyc2VNZXRhZGF0YVN0YXIoc3ludGhldGljUHJldmlvdXNUb2tlbih0b2tlbikpOwogICAgcmV0dXJuIHBhcnNlVG9wTGV2ZWxNZW1iZXJJbXBsKHRva2VuKS5uZXh0OwogIH0KCiAgVG9rZW4gcGFyc2VUb3BMZXZlbE1lbWJlckltcGwoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGJlZm9yZVN0YXJ0ID0gdG9rZW47CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGxpc3RlbmVyLmJlZ2luVG9wTGV2ZWxNZW1iZXIobmV4dCk7CgogICAgVG9rZW4gZXh0ZXJuYWxUb2tlbjsKICAgIFRva2VuIGxhdGVUb2tlbjsKICAgIFRva2VuIHZhckZpbmFsT3JDb25zdDsKCiAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICBpZiAob3B0aW9uYWwoJ2V4dGVybmFsJywgbmV4dCkpIHsKICAgICAgICBleHRlcm5hbFRva2VuID0gdG9rZW4gPSBuZXh0OwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICAgIGlmIChpc01vZGlmaWVyKG5leHQpKSB7CiAgICAgICAgaWYgKG9wdGlvbmFsKCdmaW5hbCcsIG5leHQpKSB7CiAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCd2YXInLCBuZXh0KSkgewogICAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnY29uc3QnLCBuZXh0KSkgewogICAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnbGF0ZScsIG5leHQpKSB7CiAgICAgICAgICBsYXRlVG9rZW4gPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAgIGlmIChpc01vZGlmaWVyKG5leHQpICYmIG9wdGlvbmFsKCdmaW5hbCcsIG5leHQpKSB7CiAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCA9IHRva2VuID0gbmV4dDsKICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc01vZGlmaWVyKG5leHQpKSB7CiAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgaWYgKHZhckZpbmFsT3JDb25zdCAhPSBudWxsICYmCiAgICAgICAgICAgICAgKG9wdGlvbmFsKCdmaW5hbCcsIG5leHQpIHx8CiAgICAgICAgICAgICAgICAgIG9wdGlvbmFsKCd2YXInLCBuZXh0KSB8fAogICAgICAgICAgICAgICAgICBvcHRpb25hbCgnY29uc3QnLCBuZXh0KSkpIHsKICAgICAgICAgICAgLy8gSWYgYW5vdGhlciBgdmFyYCwgYGZpbmFsYCwgb3IgYGNvbnN0YCB0aGVuIGZhbGwgdGhyb3VnaAogICAgICAgICAgICAvLyB0byBwYXJzZSB0aGF0IGFzIHBhcnQgb2YgdGhlIG5leHQgdG9wIGxldmVsIGRlY2xhcmF0aW9uLgogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgTW9kaWZpZXJSZWNvdmVyeUNvbnRleHQgY29udGV4dCA9IG5ldyBNb2RpZmllclJlY292ZXJ5Q29udGV4dCh0aGlzKQogICAgICAgICAgICAgIC4uZXh0ZXJuYWxUb2tlbiA9IGV4dGVybmFsVG9rZW4KICAgICAgICAgICAgICAuLmxhdGVUb2tlbiA9IGxhdGVUb2tlbgogICAgICAgICAgICAgIC4udmFyRmluYWxPckNvbnN0ID0gdmFyRmluYWxPckNvbnN0OwoKICAgICAgICAgICAgdG9rZW4gPSBjb250ZXh0LnBhcnNlVG9wTGV2ZWxNb2RpZmllcnModG9rZW4pOwogICAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKCiAgICAgICAgICAgIGV4dGVybmFsVG9rZW4gPSBjb250ZXh0LmV4dGVybmFsVG9rZW47CiAgICAgICAgICAgIGxhdGVUb2tlbiA9IGNvbnRleHQubGF0ZVRva2VuOwogICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSBjb250ZXh0LnZhckZpbmFsT3JDb25zdDsKCiAgICAgICAgICAgIGNvbnRleHQgPSBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIFRva2VuIGJlZm9yZVR5cGUgPSB0b2tlbjsKICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUodG9rZW4sIGZhbHNlLCB0cnVlKTsKICAgIHRva2VuID0gdHlwZUluZm8uc2tpcFR5cGUodG9rZW4pOwogICAgbmV4dCA9IHRva2VuLm5leHQ7CgogICAgVG9rZW4gZ2V0T3JTZXQ7CiAgICBTdHJpbmcgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2dldCcpIHx8IGlkZW50aWNhbCh2YWx1ZSwgJ3NldCcpKSB7CiAgICAgIGlmIChuZXh0Lm5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgZ2V0T3JTZXQgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgIH0KCiAgICBpZiAobmV4dC50eXBlICE9IFRva2VuVHlwZS5JREVOVElGSUVSKSB7CiAgICAgIHZhbHVlID0gbmV4dC5zdHJpbmdWYWx1ZTsKICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2ZhY3RvcnknKSB8fCBpZGVudGljYWwodmFsdWUsICdvcGVyYXRvcicpKSB7CiAgICAgICAgLy8gYGZhY3RvcnlgIGFuZCBgb3BlcmF0b3JgIGNhbiBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIuCiAgICAgICAgdmFsdWUgPSBuZXh0Lm5leHQuc3RyaW5nVmFsdWU7CiAgICAgICAgaWYgKGdldE9yU2V0ID09IG51bGwgJiYKICAgICAgICAgICAgIWlkZW50aWNhbCh2YWx1ZSwgJygnKSAmJgogICAgICAgICAgICAhaWRlbnRpY2FsKHZhbHVlLCAneycpICYmCiAgICAgICAgICAgICFpZGVudGljYWwodmFsdWUsICc8JykgJiYKICAgICAgICAgICAgIWlkZW50aWNhbCh2YWx1ZSwgJz0+JykgJiYKICAgICAgICAgICAgIWlkZW50aWNhbCh2YWx1ZSwgJz0nKSAmJgogICAgICAgICAgICAhaWRlbnRpY2FsKHZhbHVlLCAnOycpICYmCiAgICAgICAgICAgICFpZGVudGljYWwodmFsdWUsICcsJykpIHsKICAgICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgICB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICAgICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnZmFjdG9yeScpKSB7CiAgICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgICBuZXh0LCBmYXN0YS5tZXNzYWdlRmFjdG9yeVRvcExldmVsRGVjbGFyYXRpb24pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlVG9wTGV2ZWxPcGVyYXRvcik7CiAgICAgICAgICAgIGlmIChuZXh0Lm5leHQuaXNPcGVyYXRvcikgewogICAgICAgICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAgICAgICBpZiAob3B0aW9uYWwoJygnLCBuZXh0Lm5leHQpKSB7CiAgICAgICAgICAgICAgICByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKAogICAgICAgICAgICAgICAgICAgIG5leHQsICcjc3ludGhldGljX2lkZW50aWZpZXJfJHtuZXh0LmNoYXJPZmZzZXR9Jyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbihuZXh0KTsKICAgICAgICAgIHJldHVybiBuZXh0OwogICAgICAgIH0KICAgICAgICAvLyBGYWxsIHRocm91Z2ggYW5kIGNvbnRpbnVlIHBhcnNpbmcKICAgICAgfSBlbHNlIGlmICghbmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIGlmIChuZXh0LmlzS2V5d29yZCkgewogICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHBhcnNlIHRoZSBrZXl3b3JkIGFzIHRoZSBpZGVudGlmaWVyLgogICAgICAgICAgLy8gZW5zdXJlSWRlbnRpZmllciB3aWxsIHJlcG9ydCB0aGUgZXJyb3IuCiAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PSBiZWZvcmVTdGFydCkgewogICAgICAgICAgLy8gRW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MuCiAgICAgICAgICByZXR1cm4gcGFyc2VJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbih0b2tlbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIExvb2tzIGxpa2UgYSBkZWNsYXJhdGlvbiBtaXNzaW5nIGFuIGlkZW50aWZpZXIuCiAgICAgICAgICAvLyBJbnNlcnQgc3ludGhldGljIGlkZW50aWZpZXIgYW5kIGZhbGwgdGhyb3VnaC4KICAgICAgICAgIGluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0Lm1ldGhvZERlY2xhcmF0aW9uKTsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gQXQgdGhpcyBwb2ludCwgYHRva2VuYCBpcyBiZWZvcmVOYW1lLgoKICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICBpZiAoZ2V0T3JTZXQgIT0gbnVsbCB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJygnKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJ3snKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJzwnKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJy4nKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJz0+JykpIHsKICAgICAgaWYgKHZhckZpbmFsT3JDb25zdCAhPSBudWxsKSB7CiAgICAgICAgaWYgKG9wdGlvbmFsKCd2YXInLCB2YXJGaW5hbE9yQ29uc3QpKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHZhckZpbmFsT3JDb25zdCwgZmFzdGEubWVzc2FnZVZhclJldHVyblR5cGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwgZmFzdGEudGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChsYXRlVG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgIGxhdGVUb2tlbiwgZmFzdGEudGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXIpOwogICAgICB9CiAgICAgIHJldHVybiBwYXJzZVRvcExldmVsTWV0aG9kKGJlZm9yZVN0YXJ0LCBleHRlcm5hbFRva2VuLCBiZWZvcmVUeXBlLAogICAgICAgICAgdHlwZUluZm8sIGdldE9yU2V0LCB0b2tlbi5uZXh0KTsKICAgIH0KCiAgICBpZiAoZ2V0T3JTZXQgIT0gbnVsbCkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgZ2V0T3JTZXQsIGZhc3RhLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgIH0KICAgIHJldHVybiBwYXJzZUZpZWxkcyhiZWZvcmVTdGFydCwgZXh0ZXJuYWxUb2tlbiwgbnVsbCwgbnVsbCwgbGF0ZVRva2VuLAogICAgICAgIHZhckZpbmFsT3JDb25zdCwgYmVmb3JlVHlwZSwgdHlwZUluZm8sIHRva2VuLm5leHQsIHRydWUpOwogIH0KCiAgVG9rZW4gcGFyc2VGaWVsZHMoCiAgICAgIFRva2VuIGJlZm9yZVN0YXJ0LAogICAgICBUb2tlbiBleHRlcm5hbFRva2VuLAogICAgICBUb2tlbiBzdGF0aWNUb2tlbiwKICAgICAgVG9rZW4gY292YXJpYW50VG9rZW4sCiAgICAgIFRva2VuIGxhdGVUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LAogICAgICBUb2tlbiBiZWZvcmVUeXBlLAogICAgICBUeXBlSW5mbyB0eXBlSW5mbywKICAgICAgVG9rZW4gbmFtZSwKICAgICAgYm9vbCBpc1RvcExldmVsKSB7CiAgICBpZiAoZXh0ZXJuYWxUb2tlbiAhPSBudWxsKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoZXh0ZXJuYWxUb2tlbiwgZmFzdGEubWVzc2FnZUV4dGVybmFsRmllbGQpOwogICAgfQogICAgaWYgKGNvdmFyaWFudFRva2VuICE9IG51bGwpIHsKICAgICAgaWYgKHZhckZpbmFsT3JDb25zdCAhPSBudWxsICYmIG9wdGlvbmFsKCdmaW5hbCcsIHZhckZpbmFsT3JDb25zdCkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKGNvdmFyaWFudFRva2VuLCBmYXN0YS5tZXNzYWdlRmluYWxBbmRDb3ZhcmlhbnQpOwogICAgICAgIGNvdmFyaWFudFRva2VuID0gbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKHR5cGVJbmZvID09IG5vVHlwZSkgewogICAgICBpZiAodmFyRmluYWxPckNvbnN0ID09IG51bGwgJiYgbGF0ZVRva2VuID09IG51bGwpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5hbWUsIGZhc3RhLm1lc3NhZ2VNaXNzaW5nQ29uc3RGaW5hbFZhck9yVHlwZSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCAmJiBvcHRpb25hbCgndmFyJywgdmFyRmluYWxPckNvbnN0KSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodmFyRmluYWxPckNvbnN0LCBmYXN0YS5tZXNzYWdlVHlwZUFmdGVyVmFyKTsKICAgICAgfQogICAgfQoKICAgIFRva2VuIHRva2VuID0gdHlwZUluZm8ucGFyc2VUeXBlKGJlZm9yZVR5cGUsIHRoaXMpOwogICAgYXNzZXJ0KHRva2VuLm5leHQgPT0gbmFtZSk7CgogICAgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCA9IGlzVG9wTGV2ZWwKICAgICAgICA/IElkZW50aWZpZXJDb250ZXh0LnRvcExldmVsVmFyaWFibGVEZWNsYXJhdGlvbgogICAgICAgIDogSWRlbnRpZmllckNvbnRleHQuZmllbGREZWNsYXJhdGlvbjsKICAgIG5hbWUgPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBjb250ZXh0KTsKCiAgICBpbnQgZmllbGRDb3VudCA9IDE7CiAgICB0b2tlbiA9IHBhcnNlRmllbGRJbml0aWFsaXplck9wdCgKICAgICAgICBuYW1lLCBuYW1lLCBsYXRlVG9rZW4sIHZhckZpbmFsT3JDb25zdCwgaXNUb3BMZXZlbCk7CiAgICB3aGlsZSAob3B0aW9uYWwoJywnLCB0b2tlbi5uZXh0KSkgewogICAgICBuYW1lID0gZW5zdXJlSWRlbnRpZmllcih0b2tlbi5uZXh0LCBjb250ZXh0KTsKICAgICAgdG9rZW4gPSBwYXJzZUZpZWxkSW5pdGlhbGl6ZXJPcHQoCiAgICAgICAgICBuYW1lLCBuYW1lLCBsYXRlVG9rZW4sIHZhckZpbmFsT3JDb25zdCwgaXNUb3BMZXZlbCk7CiAgICAgICsrZmllbGRDb3VudDsKICAgIH0KICAgIFRva2VuIHNlbWljb2xvbiA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJzsnLCBzZW1pY29sb24pKSB7CiAgICAgIHRva2VuID0gc2VtaWNvbG9uOwogICAgfSBlbHNlIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgaWYgKGlzVG9wTGV2ZWwgJiYKICAgICAgICAgIGJlZm9yZVR5cGUubmV4dC5pc0lkZW50aWZpZXIgJiYKICAgICAgICAgIGJlZm9yZVR5cGUubmV4dC5sZXhlbWUgPT0gJ2V4dGVuc2lvbicpIHsKICAgICAgICAvLyBMb29rcyBsaWtlIGFuIGV4dGVuc2lvbiBtZXRob2QKICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVtb3ZlIHdoZW4gZXh0ZW5zaW9uIG1ldGhvZHMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdAogICAgICAgIC8vIGJlY2F1c2UgdGhlbiAnZXh0ZW5zaW9uJyB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgYnVpbHQtaW4KICAgICAgICAvLyBhbmQgdGhpcyBjb2RlIHdpbGwgbmV2ZXIgYmUgZXhlY3V0ZWQKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBiZWZvcmVUeXBlLm5leHQsCiAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlRXhwZXJpbWVudE5vdEVuYWJsZWQKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKCdleHRlbnNpb24tbWV0aG9kcycpKTsKICAgICAgICB0b2tlbiA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY1Rva2VuKHRva2VuLCBUb2tlblR5cGUuU0VNSUNPTE9OKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc1RvcExldmVsKSB7CiAgICAgIGxpc3RlbmVyLmVuZFRvcExldmVsRmllbGRzKHN0YXRpY1Rva2VuLCBjb3ZhcmlhbnRUb2tlbiwgbGF0ZVRva2VuLAogICAgICAgICAgdmFyRmluYWxPckNvbnN0LCBmaWVsZENvdW50LCBiZWZvcmVTdGFydC5uZXh0LCB0b2tlbik7CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5lbmRGaWVsZHMoc3RhdGljVG9rZW4sIGNvdmFyaWFudFRva2VuLCBsYXRlVG9rZW4sCiAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGZpZWxkQ291bnQsIGJlZm9yZVN0YXJ0Lm5leHQsIHRva2VuKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlVG9wTGV2ZWxNZXRob2QoVG9rZW4gYmVmb3JlU3RhcnQsIFRva2VuIGV4dGVybmFsVG9rZW4sCiAgICAgIFRva2VuIGJlZm9yZVR5cGUsIFR5cGVJbmZvIHR5cGVJbmZvLCBUb2tlbiBnZXRPclNldCwgVG9rZW4gbmFtZSkgewogICAgbGlzdGVuZXIuYmVnaW5Ub3BMZXZlbE1ldGhvZChiZWZvcmVTdGFydCwgZXh0ZXJuYWxUb2tlbik7CgogICAgVG9rZW4gdG9rZW4gPSB0eXBlSW5mby5wYXJzZVR5cGUoYmVmb3JlVHlwZSwgdGhpcyk7CiAgICBhc3NlcnQodG9rZW4ubmV4dCA9PSAoZ2V0T3JTZXQgPz8gbmFtZSkpOwogICAgbmFtZSA9IGVuc3VyZUlkZW50aWZpZXIoCiAgICAgICAgZ2V0T3JTZXQgPz8gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0LnRvcExldmVsRnVuY3Rpb25EZWNsYXJhdGlvbik7CgogICAgYm9vbCBpc0dldHRlciA9IGZhbHNlOwogICAgaWYgKGdldE9yU2V0ID09IG51bGwpIHsKICAgICAgdG9rZW4gPSBwYXJzZU1ldGhvZFR5cGVWYXIobmFtZSk7CiAgICB9IGVsc2UgewogICAgICBpc0dldHRlciA9IG9wdGlvbmFsKCJnZXQiLCBnZXRPclNldCk7CiAgICAgIHRva2VuID0gbmFtZTsKICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlVmFyaWFibGVzKHRva2VuLm5leHQpOwogICAgfQogICAgdG9rZW4gPSBwYXJzZUdldHRlck9yRm9ybWFsUGFyYW1ldGVycygKICAgICAgICB0b2tlbiwgbmFtZSwgaXNHZXR0ZXIsIE1lbWJlcktpbmQuVG9wTGV2ZWxNZXRob2QpOwogICAgQXN5bmNNb2RpZmllciBzYXZlZEFzeW5jTW9kaWZpZXIgPSBhc3luY1N0YXRlOwogICAgVG9rZW4gYXN5bmNUb2tlbiA9IHRva2VuLm5leHQ7CiAgICB0b2tlbiA9IHBhcnNlQXN5bmNNb2RpZmllck9wdCh0b2tlbik7CiAgICBpZiAoZ2V0T3JTZXQgIT0gbnVsbCAmJiAhaW5QbGFpblN5bmMgJiYgb3B0aW9uYWwoInNldCIsIGdldE9yU2V0KSkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKGFzeW5jVG9rZW4sIGZhc3RhLm1lc3NhZ2VTZXR0ZXJOb3RTeW5jKTsKICAgIH0KICAgIGJvb2wgaXNFeHRlcm5hbCA9IGV4dGVybmFsVG9rZW4gIT0gbnVsbDsKICAgIGlmIChpc0V4dGVybmFsICYmICFvcHRpb25hbCgnOycsIHRva2VuLm5leHQpKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBleHRlcm5hbFRva2VuLCBmYXN0YS5tZXNzYWdlRXh0ZXJuYWxNZXRob2RXaXRoQm9keSk7CiAgICB9CiAgICB0b2tlbiA9IHBhcnNlRnVuY3Rpb25Cb2R5KHRva2VuLCBmYWxzZSwgaXNFeHRlcm5hbCk7CiAgICBhc3luY1N0YXRlID0gc2F2ZWRBc3luY01vZGlmaWVyOwogICAgbGlzdGVuZXIuZW5kVG9wTGV2ZWxNZXRob2QoYmVmb3JlU3RhcnQubmV4dCwgZ2V0T3JTZXQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlTWV0aG9kVHlwZVZhcihUb2tlbiBuYW1lKSB7CiAgICBpZiAoIW9wdGlvbmFsKCc8JywgbmFtZS5uZXh0KSkgewogICAgICByZXR1cm4gbm9UeXBlUGFyYW1PckFyZy5wYXJzZVZhcmlhYmxlcyhuYW1lLCB0aGlzKTsKICAgIH0KICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlVmFyID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKG5hbWUsIHRydWUpOwogICAgVG9rZW4gdG9rZW4gPSB0eXBlVmFyLnBhcnNlVmFyaWFibGVzKG5hbWUsIHRoaXMpOwogICAgaWYgKG9wdGlvbmFsKCc9JywgdG9rZW4ubmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKHRva2VuLCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUZpZWxkSW5pdGlhbGl6ZXJPcHQoVG9rZW4gdG9rZW4sIFRva2VuIG5hbWUsIFRva2VuIGxhdGVUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBib29sIGlzVG9wTGV2ZWwpIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCc9JywgbmV4dCkpIHsKICAgICAgVG9rZW4gYXNzaWdubWVudCA9IG5leHQ7CiAgICAgIGxpc3RlbmVyLmJlZ2luRmllbGRJbml0aWFsaXplcihuZXh0KTsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24obmV4dCk7CiAgICAgIGxpc3RlbmVyLmVuZEZpZWxkSW5pdGlhbGl6ZXIoYXNzaWdubWVudCwgdG9rZW4ubmV4dCk7CiAgICB9IGVsc2UgewogICAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwgJiYgIW5hbWUuaXNTeW50aGV0aWMpIHsKICAgICAgICBpZiAob3B0aW9uYWwoImNvbnN0IiwgdmFyRmluYWxPckNvbnN0KSkgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlQ29uc3RGaWVsZFdpdGhvdXRJbml0aWFsaXplcgogICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhuYW1lLmxleGVtZSkpOwogICAgICAgIH0gZWxzZSBpZiAoaXNUb3BMZXZlbCAmJgogICAgICAgICAgICBvcHRpb25hbCgiZmluYWwiLCB2YXJGaW5hbE9yQ29uc3QpICYmCiAgICAgICAgICAgIGxhdGVUb2tlbiA9PSBudWxsKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVyCiAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUubGV4ZW1lKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vRmllbGRJbml0aWFsaXplcih0b2tlbi5uZXh0KTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlVmFyaWFibGVJbml0aWFsaXplck9wdChUb2tlbiB0b2tlbikgewogICAgaWYgKG9wdGlvbmFsKCc9JywgdG9rZW4ubmV4dCkpIHsKICAgICAgVG9rZW4gYXNzaWdubWVudCA9IHRva2VuLm5leHQ7CiAgICAgIGxpc3RlbmVyLmJlZ2luVmFyaWFibGVJbml0aWFsaXplcihhc3NpZ25tZW50KTsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24oYXNzaWdubWVudCk7CiAgICAgIGxpc3RlbmVyLmVuZFZhcmlhYmxlSW5pdGlhbGl6ZXIoYXNzaWdubWVudCk7CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5oYW5kbGVOb1ZhcmlhYmxlSW5pdGlhbGl6ZXIodG9rZW4ubmV4dCk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUluaXRpYWxpemVyc09wdChUb2tlbiB0b2tlbikgewogICAgaWYgKG9wdGlvbmFsKCc6JywgdG9rZW4ubmV4dCkpIHsKICAgICAgcmV0dXJuIHBhcnNlSW5pdGlhbGl6ZXJzKHRva2VuLm5leHQpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTm9Jbml0aWFsaXplcnMoKTsKICAgICAgcmV0dXJuIHRva2VuOwogICAgfQogIH0KCiAgLy8vIGBgYAogIC8vLyBpbml0aWFsaXplcnM6CiAgLy8vICAgJzonIGluaXRpYWxpemVyTGlzdEVudHJ5ICgnLCcgaW5pdGlhbGl6ZXJMaXN0RW50cnkpKgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlSW5pdGlhbGl6ZXJzKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBiZWdpbiA9IHRva2VuOwogICAgYXNzZXJ0KG9wdGlvbmFsKCc6JywgYmVnaW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luSW5pdGlhbGl6ZXJzKGJlZ2luKTsKICAgIGludCBjb3VudCA9IDA7CiAgICBib29sIG9sZCA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IGZhbHNlOwogICAgVG9rZW4gbmV4dCA9IGJlZ2luOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgdG9rZW4gPSBwYXJzZUluaXRpYWxpemVyKG5leHQpOwogICAgICArK2NvdW50OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgaWYgKCFuZXh0LmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8vIFJlY292ZXJ5OiBGb3VuZCBhbiBpZGVudGlmaWVyIHdoaWNoIGNvdWxkIGJlCiAgICAgICAgLy8gMSkgbWlzc2luZyBwcmVjZWRpbmcgYCxgIHRodXMgaXQncyBhbm90aGVyIGluaXRpYWxpemVyLCBvcgogICAgICAgIC8vIDIpIG1pc3NpbmcgcHJlY2VkaW5nIGA7YCB0aHVzIGl0J3MgYSBjbGFzcyBtZW1iZXIsIG9yCiAgICAgICAgLy8gMykgbWlzc2luZyBwcmVjZWRpbmcgJ3snIHRodXMgaXQncyBhIHN0YXRlbWVudAogICAgICAgIGlmIChvcHRpb25hbCgnYXNzZXJ0JywgbmV4dCkpIHsKICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgICAgICBpZiAoIW9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBMb29rcyBsaWtlIGFzc2VydCBleHByZXNzaW9uIC4uLiBmYWxsIHRocm91Z2ggdG8gaW5zZXJ0IGNvbW1hCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChvcHRpb25hbCgndGhpcycsIG5leHQpKSB7CiAgICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgICAgICAgIGlmICghb3B0aW9uYWwoJy4nLCBuZXh0KSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgICAgICAgIGlmICghbmV4dC5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbmV4dCA9IG5leHQubmV4dDsKICAgICAgICAgIGlmICghb3B0aW9uYWwoJz0nLCBuZXh0KSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIC8vIExvb2tzIGxpa2UgZmllbGQgYXNzaWdubWVudC4uLiBmYWxsIHRocm91Z2ggdG8gaW5zZXJ0IGNvbW1hCiAgICAgICAgfQogICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciBlbmhhbmNpbmcgdGhpcyB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZQogICAgICAgIC8vIGV4cGVjdGluZyBvbmUgb2YgYCxgIG9yIGA7YCBvciBge2AKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJywnKSk7CiAgICAgICAgbmV4dCA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY1Rva2VuKHRva2VuLCBUb2tlblR5cGUuQ09NTUEpOwogICAgICB9CiAgICB9CiAgICBtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMgPSBvbGQ7CiAgICBsaXN0ZW5lci5lbmRJbml0aWFsaXplcnMoY291bnQsIGJlZ2luLCB0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gaW5pdGlhbGl6ZXJMaXN0RW50cnk6CiAgLy8vICAgJ3N1cGVyJyAoJy4nIGlkZW50aWZpZXIpPyBhcmd1bWVudHMgfAogIC8vLyAgIGZpZWxkSW5pdGlhbGl6ZXIgfAogIC8vLyAgIGFzc2VydGlvbgogIC8vLyA7CiAgLy8vCiAgLy8vIGZpZWxkSW5pdGlhbGl6ZXI6CiAgLy8vICAgKCd0aGlzJyAnLicpPyBpZGVudGlmaWVyICc9JyBjb25kaXRpb25hbEV4cHJlc3Npb24gY2FzY2FkZVNlY3Rpb24qCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBsaXN0ZW5lci5iZWdpbkluaXRpYWxpemVyKG5leHQpOwogICAgVG9rZW4gYmVmb3JlRXhwcmVzc2lvbiA9IHRva2VuOwogICAgaWYgKG9wdGlvbmFsKCdhc3NlcnQnLCBuZXh0KSkgewogICAgICB0b2tlbiA9IHBhcnNlQXNzZXJ0KHRva2VuLCBBc3NlcnQuSW5pdGlhbGl6ZXIpOwogICAgICBsaXN0ZW5lci5lbmRJbml0aWFsaXplcih0b2tlbi5uZXh0KTsKICAgICAgcmV0dXJuIHRva2VuOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnc3VwZXInLCBuZXh0KSkgewogICAgICByZXR1cm4gcGFyc2VTdXBlckluaXRpYWxpemVyRXhwcmVzc2lvbih0b2tlbik7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCd0aGlzJywgbmV4dCkpIHsKICAgICAgdG9rZW4gPSBuZXh0OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCcuJywgbmV4dCkpIHsKICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgaWYgKG5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgICB0b2tlbiA9IGluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoCiAgICAgICAgICAgICAgdG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmZpZWxkSW5pdGlhbGl6ZXIpOwogICAgICAgIH0KICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBpZiAob3B0aW9uYWwoJz0nLCBuZXh0KSkgewogICAgICAgICAgcmV0dXJuIHBhcnNlSW5pdGlhbGl6ZXJFeHByZXNzaW9uUmVzdChiZWZvcmVFeHByZXNzaW9uKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgICB0b2tlbiA9IHBhcnNlSW5pdGlhbGl6ZXJFeHByZXNzaW9uUmVzdChiZWZvcmVFeHByZXNzaW9uKTsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBpZiAob3B0aW9uYWwoJ3snLCBuZXh0KSB8fCBvcHRpb25hbCgnPT4nLCBuZXh0KSkgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICBuZXh0LCBmYXN0YS5tZXNzYWdlUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcldpdGhCb2R5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIGlmIChvcHRpb25hbCgndGhpcycsIHRva2VuKSkgewogICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciBhIGJldHRlciBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdAogICAgICAgIC8vIGB0aGlzLjxmaWVsZG5hbWU+PWAgaXMgZXhwZWN0ZWQuCiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcuJykpOwogICAgICAgIHJld3JpdGVyLmluc2VydFN5bnRoZXRpY1Rva2VuKHRva2VuLCBUb2tlblR5cGUuUEVSSU9EKTsKICAgICAgICB0b2tlbiA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4ubmV4dCk7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHJlY292ZXJ5CiAgICB9IGVsc2UgaWYgKG5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgIFRva2VuIG5leHQyID0gbmV4dC5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJz0nLCBuZXh0MikpIHsKICAgICAgICByZXR1cm4gcGFyc2VJbml0aWFsaXplckV4cHJlc3Npb25SZXN0KHRva2VuKTsKICAgICAgfQogICAgICAvLyBSZWNvdmVyeTogSWYgdGhpcyBsb29rcyBsaWtlIGFuIGV4cHJlc3Npb24sCiAgICAgIC8vIHRoZW4gZmFsbCB0aHJvdWdoIHRvIGluc2VydCB0aGUgTEhTIGFuZCBgPWAgb2YgdGhlIGFzc2lnbm1lbnQsCiAgICAgIC8vIG90aGVyd2lzZSBpbnNlcnQgYW4gYD1gIGFuZCBzeW50aGV0aWMgaWRlbnRpZmllci4KICAgICAgaWYgKCFuZXh0Mi5pc09wZXJhdG9yICYmICFvcHRpb25hbCgnLicsIG5leHQyKSkgewogICAgICAgIHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljVG9rZW4obmV4dCwgVG9rZW5UeXBlLkVRKTsKICAgICAgICB0b2tlbiA9IGluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmV4cHJlc3Npb24sCiAgICAgICAgICAgIG1lc3NhZ2U6IGZhc3RhLm1lc3NhZ2VNaXNzaW5nQXNzaWdubWVudEluSW5pdGlhbGl6ZXIsCiAgICAgICAgICAgIG1lc3NhZ2VPblRva2VuOiBuZXh0KTsKICAgICAgICByZXR1cm4gcGFyc2VJbml0aWFsaXplckV4cHJlc3Npb25SZXN0KGJlZm9yZUV4cHJlc3Npb24pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBSZWNvdmVyeTogSW5zZXJ0IGEgc3ludGhldGljIGFzc2lnbm1lbnQuCiAgICAgIHRva2VuID0gaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcigKICAgICAgICAgIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5maWVsZEluaXRpYWxpemVyLAogICAgICAgICAgbWVzc2FnZTogZmFzdGEubWVzc2FnZUV4cGVjdGVkQW5Jbml0aWFsaXplciwgbWVzc2FnZU9uVG9rZW46IHRva2VuKTsKICAgICAgdG9rZW4gPSByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNUb2tlbih0b2tlbiwgVG9rZW5UeXBlLkVRKTsKICAgICAgdG9rZW4gPSByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuKTsKICAgICAgcmV0dXJuIHBhcnNlSW5pdGlhbGl6ZXJFeHByZXNzaW9uUmVzdChiZWZvcmVFeHByZXNzaW9uKTsKICAgIH0KICAgIC8vIFJlY292ZXJ5OgogICAgLy8gSW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IKICAgIC8vIHRvIGVuc3VyZSB0aGF0IHRoZSBleHByZXNzaW9uIGlzIGluZGVlZCBhbiBhc3NpZ25tZW50LgogICAgLy8gRmFpbGluZyB0byBkbyBzbyBjYXVzZXMgdGhpcyB0ZXN0IHRvIGZhaWw6CiAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9yZWdyZXNzL2lzc3VlXzMxMTkyLmRhcnQKICAgIC8vIFRPRE8oZGFucnViZWwpOiBJbnZlc3RpZ2F0ZSBiZXR0ZXIgcmVjb3ZlcnkuCiAgICB0b2tlbiA9IGluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoCiAgICAgICAgYmVmb3JlRXhwcmVzc2lvbiwgSWRlbnRpZmllckNvbnRleHQuZmllbGRJbml0aWFsaXplciwKICAgICAgICBtZXNzYWdlOiBmYXN0YS5tZXNzYWdlTWlzc2luZ0Fzc2lnbm1lbnRJbkluaXRpYWxpemVyKTsKICAgIHJld3JpdGVyLmluc2VydFN5bnRoZXRpY1Rva2VuKHRva2VuLCBUb2tlblR5cGUuRVEpOwogICAgcmV0dXJuIHBhcnNlSW5pdGlhbGl6ZXJFeHByZXNzaW9uUmVzdChiZWZvcmVFeHByZXNzaW9uKTsKICB9CgogIC8vLyBQYXJzZSB0aGUgYHN1cGVyYCBpbml0aWFsaXplcjoKICAvLy8gYGBgCiAgLy8vICAgJ3N1cGVyJyAoJy4nIGlkZW50aWZpZXIpPyBhcmd1bWVudHMgOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVN1cGVySW5pdGlhbGl6ZXJFeHByZXNzaW9uKGZpbmFsIFRva2VuIHN0YXJ0KSB7CiAgICBUb2tlbiB0b2tlbiA9IHN0YXJ0Lm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3N1cGVyJywgdG9rZW4pKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCcuJywgbmV4dCkpIHsKICAgICAgdG9rZW4gPSBuZXh0OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG5leHQua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKSB7CiAgICAgICAgbmV4dCA9IElkZW50aWZpZXJDb250ZXh0LmV4cHJlc3Npb25Db250aW51YXRpb24KICAgICAgICAgICAgLmVuc3VyZUlkZW50aWZpZXIodG9rZW4sIHRoaXMpOwogICAgICB9CiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9CiAgICBpZiAoIW9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgaWYgKG9wdGlvbmFsKCc/LicsIG5leHQpKSB7CiAgICAgICAgLy8gQW4gZXJyb3IgZm9yIGBzdXBlcj8uYCBpcyByZXBvcnRlZCBpbiBwYXJzZVN1cGVyRXhwcmVzc2lvbi4KICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgaWYgKCFuZXh0LmlzSWRlbnRpZmllcikgewogICAgICAgICAgLy8gSW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgYnV0IGRvbid0IHJlcG9ydCBhbm90aGVyIGVycm9yLgogICAgICAgICAgbmV4dCA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4pOwogICAgICAgIH0KICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgaWYgKG9wdGlvbmFsKCc9JywgbmV4dCkpIHsKICAgICAgICBpZiAob3B0aW9uYWwoJ3N1cGVyJywgdG9rZW4pKSB7CiAgICAgICAgICAvLyBwYXJzZUV4cHJlc3Npb24gd2lsbCByZXBvcnQgZXJyb3Igb24gYXNzaWdubWVudCB0byBzdXBlcgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIHRva2VuLCBmYXN0YS5tZXNzYWdlRmllbGRJbml0aWFsaXplZE91dHNpZGVEZWNsYXJpbmdDbGFzcyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJygnKSk7CiAgICAgICAgcmV3cml0ZXIuaW5zZXJ0UGFyZW5zKHRva2VuLCBmYWxzZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwYXJzZUluaXRpYWxpemVyRXhwcmVzc2lvblJlc3Qoc3RhcnQpOwogIH0KCiAgVG9rZW4gcGFyc2VJbml0aWFsaXplckV4cHJlc3Npb25SZXN0KFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRJbml0aWFsaXplcih0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhbiBvcGVuaW5nIGN1cmx5IGJyYWNlLCByZXR1cm4gaXQuIE90aGVyd2lzZSwgdXNlIHRoZQogIC8vLyBnaXZlbiBbdGVtcGxhdGVdIG9yIFtibG9ja0tpbmRdIHRvIHJlcG9ydCBhbiBlcnJvciwgaW5zZXJ0IGFuIG9wZW5pbmcgYW5kCiAgLy8vIGEgY2xvc2luZyBjdXJseSBicmFjZSwgYW5kIHJldHVybiB0aGUgbmV3bHkgaW5zZXJ0ZWQgb3BlbmluZyBjdXJseSBicmFjZS4KICAvLy8gSWYgIFt0ZW1wbGF0ZV0gYW5kIFtibG9ja0tpbmRdIGFyZSBgbnVsbGAsIHRoZW4gdXNlCiAgLy8vIGEgZGVmYXVsdCBlcnJvciBtZXNzYWdlIGluc3RlYWQuCiAgVG9rZW4gZW5zdXJlQmxvY2soVG9rZW4gdG9rZW4sCiAgICAgIFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZSwgU3RyaW5nIGJsb2NrS2luZCkgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJ3snLCBuZXh0KSkgcmV0dXJuIG5leHQ7CiAgICBpZiAodGVtcGxhdGUgPT0gbnVsbCkgewogICAgICBpZiAoYmxvY2tLaW5kID09IG51bGwpIHsKICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogcmVuYW1lIEV4cGVjdGVkQnV0R290IHRvIEV4cGVjdGVkQmVmb3JlCiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCd7JykpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiByZW5hbWUgRXhwZWN0ZWRDbGFzc09yTWl4aW5Cb2R5CiAgICAgICAgLy8gIHRvIEV4cGVjdGVkRGVjbGFyYXRpb25PckNsYXVzZUJvZHkKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLAogICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQ2xhc3NPck1peGluQm9keS53aXRoQXJndW1lbnRzKGJsb2NrS2luZCkpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIHRlbXBsYXRlLndpdGhBcmd1bWVudHMobmV4dCkpOwogICAgfQogICAgcmV0dXJuIGluc2VydEJsb2NrKHRva2VuKTsKICB9CgogIFRva2VuIGluc2VydEJsb2NrKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIEJlZ2luVG9rZW4gYmVnaW5Hcm91cCA9IHJld3JpdGVyLmluc2VydFRva2VuKHRva2VuLAogICAgICAgIG5ldyBTeW50aGV0aWNCZWdpblRva2VuKFRva2VuVHlwZS5PUEVOX0NVUkxZX0JSQUNLRVQsIG5leHQub2Zmc2V0KSk7CiAgICBUb2tlbiBlbmRHcm91cCA9IHJld3JpdGVyLmluc2VydFRva2VuKGJlZ2luR3JvdXAsCiAgICAgICAgbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DTE9TRV9DVVJMWV9CUkFDS0VULCBuZXh0Lm9mZnNldCkpOwogICAgYmVnaW5Hcm91cC5lbmRHcm91cCA9IGVuZEdyb3VwOwogICAgcmV0dXJuIGJlZ2luR3JvdXA7CiAgfQoKICAvLy8gSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBjbG9zaW5nIHBhcmVudGhlc2lzLCByZXR1cm4gaXQuCiAgLy8vIE90aGVyd2lzZSwgcmVwb3J0IGFuIGVycm9yIGFuZCByZXR1cm4gdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMKICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgb3BlbiBwYXJlbnRoZXNpcy4KICBUb2tlbiBlbnN1cmVDbG9zZVBhcmVuKFRva2VuIHRva2VuLCBUb2tlbiBvcGVuUGFyZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCcpJywgbmV4dCkpIHsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgICBpZiAob3BlblBhcmVuLmVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgIC8vIFNjYW5uZXIgaGFzIGFscmVhZHkgcmVwb3J0ZWQgYSBtaXNzaW5nIGApYCBlcnJvciwKICAgICAgLy8gYnV0IHBsYWNlZCB0aGUgYClgIGluIHRoZSB3cm9uZyBsb2NhdGlvbiwgc28gbW92ZSBpdC4KICAgICAgcmV0dXJuIHJld3JpdGVyLm1vdmVTeW50aGV0aWModG9rZW4sIG9wZW5QYXJlbi5lbmRHcm91cCk7CiAgICB9CgogICAgLy8gVE9ETyhkYW5ydWJlbCk6IFBhc3MgaW4gY29udGV4dCBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2UuCiAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnKScpKTsKCiAgICAvLyBTY2FubmVyIGd1YXJhbnRlZXMgYSBjbG9zaW5nIHBhcmVudGhlc2lzCiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogSW1wcm92ZSByZWNvdmVyeSBieSBoYXZpbmcgY2FsbGVycyBwYXJzZSB0b2tlbnMKICAgIC8vIGJldHdlZW4gYHRva2VuYCBhbmQgYG9wZW5QYXJlbi5lbmRHcm91cGAuCiAgICByZXR1cm4gb3BlblBhcmVuLmVuZEdyb3VwOwogIH0KCiAgLy8vIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgY29sb24sIHJldHVybiBpdC4gT3RoZXJ3aXNlLCByZXBvcnQgYW4KICAvLy8gZXJyb3IsIGluc2VydCBhIHN5bnRoZXRpYyBjb2xvbiwgYW5kIHJldHVybiB0aGUgaW5zZXJ0ZWQgY29sb24uCiAgVG9rZW4gZW5zdXJlQ29sb24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCc6JywgbmV4dCkpIHJldHVybiBuZXh0OwogICAgTWVzc2FnZSBtZXNzYWdlID0gZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCc6Jyk7CiAgICBUb2tlbiBuZXdUb2tlbiA9IG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuQ09MT04sIG5leHQuY2hhck9mZnNldCk7CiAgICByZXR1cm4gcmV3cml0ZUFuZFJlY292ZXIodG9rZW4sIG1lc3NhZ2UsIG5ld1Rva2VuKTsKICB9CgogIC8vLyBJZiB0aGUgdG9rZW4gYWZ0ZXIgW3Rva2VuXSBpcyBhIG5vdCBsaXRlcmFsIHN0cmluZywKICAvLy8gdGhlbiBpbnNlcnQgYSBzeW50aGV0aWMgbGl0ZXJhbCBzdHJpbmcuCiAgLy8vIENhbGwgYHBhcnNlTGl0ZXJhbFN0cmluZ2AgYW5kIHJldHVybiB0aGUgcmVzdWx0LgogIFRva2VuIGVuc3VyZUxpdGVyYWxTdHJpbmcoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKCFpZGVudGljYWwobmV4dC5raW5kLCBTVFJJTkdfVE9LRU4pKSB7CiAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRTdHJpbmcud2l0aEFyZ3VtZW50cyhuZXh0KTsKICAgICAgVG9rZW4gbmV3VG9rZW4gPQogICAgICAgICAgbmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKFRva2VuVHlwZS5TVFJJTkcsICciIicsIG5leHQuY2hhck9mZnNldCwgMCk7CiAgICAgIHJld3JpdGVBbmRSZWNvdmVyKHRva2VuLCBtZXNzYWdlLCBuZXdUb2tlbik7CiAgICB9CiAgICByZXR1cm4gcGFyc2VMaXRlcmFsU3RyaW5nKHRva2VuKTsKICB9CgogIC8vLyBJZiB0aGUgdG9rZW4gYWZ0ZXIgW3Rva2VuXSBpcyBhIHNlbWktY29sb24sIHJldHVybiBpdC4KICAvLy8gT3RoZXJ3aXNlLCByZXBvcnQgYW4gZXJyb3IsIGluc2VydCBhIHN5bnRoZXRpYyBzZW1pLWNvbG9uLAogIC8vLyBhbmQgcmV0dXJuIHRoZSBpbnNlcnRlZCBzZW1pLWNvbG9uLgogIFRva2VuIGVuc3VyZVNlbWljb2xvbihUb2tlbiB0b2tlbikgewogICAgLy8gVE9ETyhkYW5ydWJlbCk6IE9uY2UgYWxsIGV4cGVjdCgnOycuLi4pIGNhbGwgc2l0ZXMgaGF2ZSBiZWVuIGNvbnZlcnRlZAogICAgLy8gdG8gdXNlIHRoaXMgbWV0aG9kLCByZW1vdmUgc2ltaWxhciBzZW1pY29sb24gcmVjb3ZlcnkgY29kZQogICAgLy8gZnJvbSB0aGUgaGFuZGxlRXJyb3IgbWV0aG9kIGluIGVsZW1lbnRfbGlzdGVuZXIuZGFydC4KICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCc7JywgbmV4dCkpIHJldHVybiBuZXh0OwoKICAgIC8vIEZpbmQgYSB0b2tlbiBvbiB0aGUgc2FtZSBsaW5lIGFzIHdoZXJlIHRoZSAnOycgc2hvdWxkIGJlIGluc2VydGVkLgogICAgLy8gUmVwb3J0aW5nIHRoZSBlcnJvciBvbiB0aGlzIHRva2VuIG1ha2VzIGl0IGVhc2llcgogICAgLy8gZm9yIHVzZXJzIHRvIHVuZGVyc3RhbmQgYW5kIGZpeCB0aGUgZXJyb3IuCiAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKGZpbmRQcmV2aW91c05vblplcm9MZW5ndGhUb2tlbih0b2tlbiksCiAgICAgICAgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJzsnKSk7CiAgICByZXR1cm4gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljVG9rZW4odG9rZW4sIFRva2VuVHlwZS5TRU1JQ09MT04pOwogIH0KCiAgLy8vIFJlcG9ydCBhbiBlcnJvciBhdCB0aGUgdG9rZW4gYWZ0ZXIgW3Rva2VuXSB0aGF0IGhhcyB0aGUgZ2l2ZW4gW21lc3NhZ2VdLgogIC8vLyBJbnNlcnQgdGhlIFtuZXdUb2tlbl0gYWZ0ZXIgW3Rva2VuXSBhbmQgcmV0dXJuIFtuZXdUb2tlbl0uCiAgVG9rZW4gcmV3cml0ZUFuZFJlY292ZXIoVG9rZW4gdG9rZW4sIE1lc3NhZ2UgbWVzc2FnZSwgVG9rZW4gbmV3VG9rZW4pIHsKICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4ubmV4dCwgbWVzc2FnZSk7CiAgICByZXR1cm4gcmV3cml0ZXIuaW5zZXJ0VG9rZW4odG9rZW4sIG5ld1Rva2VuKTsKICB9CgogIC8vLyBSZXBsYWNlIHRoZSB0b2tlbiBhZnRlciBbdG9rZW5dIHdpdGggYFtgIGZvbGxvd2VkIGJ5IGBdYAogIC8vLyBhbmQgcmV0dXJuIFt0b2tlbl0uCiAgVG9rZW4gcmV3cml0ZVNxdWFyZUJyYWNrZXRzKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnW10nLCBuZXh0KSk7CiAgICBUb2tlbiByZXBsYWNlbWVudCA9IGxpbmsoCiAgICAgICAgbmV3IEJlZ2luVG9rZW4oVG9rZW5UeXBlLk9QRU5fU1FVQVJFX0JSQUNLRVQsIG5leHQub2Zmc2V0KSwKICAgICAgICBuZXcgVG9rZW4oVG9rZW5UeXBlLkNMT1NFX1NRVUFSRV9CUkFDS0VULCBuZXh0Lm9mZnNldCArIDEpKTsKICAgIHJld3JpdGVyLnJlcGxhY2VUb2tlbkZvbGxvd2luZyh0b2tlbiwgcmVwbGFjZW1lbnQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFJlcG9ydCB0aGUgZ2l2ZW4gdG9rZW4gYXMgdW5leHBlY3RlZCBhbmQgcmV0dXJuIHRoZSBuZXh0IHRva2VuIGlmIHRoZSBuZXh0CiAgLy8vIHRva2VuIGlzIG9uZSBvZiB0aGUgW2V4cGVjdGVkTmV4dF0sIG90aGVyd2lzZSBqdXN0IHJldHVybiB0aGUgZ2l2ZW4gdG9rZW4uCiAgVG9rZW4gc2tpcFVuZXhwZWN0ZWRUb2tlbk9wdChUb2tlbiB0b2tlbiwgTGlzdDxTdHJpbmc+IGV4cGVjdGVkTmV4dCkgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAobmV4dC5rZXl3b3JkID09IG51bGwpIHsKICAgICAgZmluYWwgU3RyaW5nIG5leHRWYWx1ZSA9IG5leHQubmV4dC5zdHJpbmdWYWx1ZTsKICAgICAgZm9yIChTdHJpbmcgZXhwZWN0ZWRWYWx1ZSBpbiBleHBlY3RlZE5leHQpIHsKICAgICAgICBpZiAoaWRlbnRpY2FsKG5leHRWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSkpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4obmV4dCwgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZU5hdGl2ZUNsYXVzZShUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmF0aXZlVG9rZW4gPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ25hdGl2ZScsIG5hdGl2ZVRva2VuKSk7CiAgICBib29sIGhhc05hbWUgPSBmYWxzZTsKICAgIGlmICh0b2tlbi5uZXh0LmtpbmQgPT0gU1RSSU5HX1RPS0VOKSB7CiAgICAgIGhhc05hbWUgPSB0cnVlOwogICAgICB0b2tlbiA9IHBhcnNlTGl0ZXJhbFN0cmluZyh0b2tlbik7CiAgICB9CiAgICBsaXN0ZW5lci5oYW5kbGVOYXRpdmVDbGF1c2UobmF0aXZlVG9rZW4sIGhhc05hbWUpOwogICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICBuYXRpdmVUb2tlbiwgZmFzdGEubWVzc2FnZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBza2lwQ2xhc3NPck1peGluQm9keShUb2tlbiB0b2tlbikgewogICAgLy8gVGhlIHNjYW5uZXIgZW5zdXJlcyB0aGF0IGB7YCBhbHdheXMgaGFzIGEgY2xvc2luZyBgfWAuCiAgICByZXR1cm4gZW5zdXJlQmxvY2sodG9rZW4sIG51bGwsIG51bGwpOwogIH0KCiAgLy8vIGBgYAogIC8vLyBjbGFzc0JvZHk6CiAgLy8vICAgJ3snIGNsYXNzTWVtYmVyKiAnfScKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUNsYXNzT3JNaXhpbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGJlZ2luID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCd7JywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luQ2xhc3NPck1peGluQm9keSh0b2tlbik7CiAgICBpbnQgY291bnQgPSAwOwogICAgd2hpbGUgKG5vdEVvZk9yVmFsdWUoJ30nLCB0b2tlbi5uZXh0KSkgewogICAgICB0b2tlbiA9IHBhcnNlQ2xhc3NPck1peGluTWVtYmVySW1wbCh0b2tlbik7CiAgICAgICsrY291bnQ7CiAgICB9CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ30nLCB0b2tlbikpOwogICAgbGlzdGVuZXIuZW5kQ2xhc3NPck1peGluQm9keShjb3VudCwgYmVnaW4sIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIGJvb2wgaXNVbmFyeU1pbnVzKFRva2VuIHRva2VuKSA9PgogICAgICB0b2tlbi5raW5kID09IElERU5USUZJRVJfVE9LRU4gJiYKICAgICAgdG9rZW4ubGV4ZW1lID09ICd1bmFyeScgJiYKICAgICAgb3B0aW9uYWwoJy0nLCB0b2tlbi5uZXh0KTsKCiAgLy8vIFBhcnNlIGEgY2xhc3Mgb3IgbWl4aW4gbWVtYmVyLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBwYXJzZXIuIEFzIGEgcmVzdWx0LCB0aGlzCiAgLy8vIG1ldGhvZCB0YWtlcyB0aGUgbmV4dCB0b2tlbiB0byBiZSBjb25zdW1lZCByYXRoZXIgdGhhbiB0aGUgbGFzdCBjb25zdW1lZAogIC8vLyB0b2tlbiBhbmQgcmV0dXJucyB0aGUgdG9rZW4gYWZ0ZXIgdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4gcmF0aGVyIHRoYW4gdGhlCiAgLy8vIGxhc3QgY29uc3VtZWQgdG9rZW4uCiAgVG9rZW4gcGFyc2VDbGFzc09yTWl4aW5NZW1iZXIoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBwYXJzZUNsYXNzT3JNaXhpbk1lbWJlckltcGwoc3ludGhldGljUHJldmlvdXNUb2tlbih0b2tlbikpLm5leHQ7CiAgfQoKICAvLy8gYGBgCiAgLy8vIGNsYXNzTWVtYmVyOgogIC8vLyAgIGZpZWxkRGVjbGFyYXRpb24gfAogIC8vLyAgIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gfAogIC8vLyAgIG1ldGhvZERlY2xhcmF0aW9uCiAgLy8vIDsKICAvLy8KICAvLy8gbWl4aW5NZW1iZXI6CiAgLy8vICAgZmllbGREZWNsYXJhdGlvbiB8CiAgLy8vICAgbWV0aG9kRGVjbGFyYXRpb24KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUNsYXNzT3JNaXhpbk1lbWJlckltcGwoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGJlZm9yZVN0YXJ0ID0gdG9rZW4gPSBwYXJzZU1ldGFkYXRhU3Rhcih0b2tlbik7CgogICAgVG9rZW4gY292YXJpYW50VG9rZW47CiAgICBUb2tlbiBleHRlcm5hbFRva2VuOwogICAgVG9rZW4gbGF0ZVRva2VuOwogICAgVG9rZW4gc3RhdGljVG9rZW47CiAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3Q7CgogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICBpZiAob3B0aW9uYWwoJ2V4dGVybmFsJywgbmV4dCkpIHsKICAgICAgICBleHRlcm5hbFRva2VuID0gdG9rZW4gPSBuZXh0OwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICAgIGlmIChpc01vZGlmaWVyKG5leHQpKSB7CiAgICAgICAgaWYgKG9wdGlvbmFsKCdzdGF0aWMnLCBuZXh0KSkgewogICAgICAgICAgc3RhdGljVG9rZW4gPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdjb3ZhcmlhbnQnLCBuZXh0KSkgewogICAgICAgICAgY292YXJpYW50VG9rZW4gPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICB9CiAgICAgICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgICAgIGlmIChvcHRpb25hbCgnZmluYWwnLCBuZXh0KSkgewogICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgndmFyJywgbmV4dCkpIHsKICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2NvbnN0JywgbmV4dCkgJiYgY292YXJpYW50VG9rZW4gPT0gbnVsbCkgewogICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnbGF0ZScsIG5leHQpKSB7CiAgICAgICAgICAgIGxhdGVUb2tlbiA9IHRva2VuID0gbmV4dDsKICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICAgIGlmIChpc01vZGlmaWVyKG5leHQpICYmIG9wdGlvbmFsKCdmaW5hbCcsIG5leHQpKSB7CiAgICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICAgICAgICBNb2RpZmllclJlY292ZXJ5Q29udGV4dCBjb250ZXh0ID0gbmV3IE1vZGlmaWVyUmVjb3ZlcnlDb250ZXh0KHRoaXMpCiAgICAgICAgICAgICAgLi5jb3ZhcmlhbnRUb2tlbiA9IGNvdmFyaWFudFRva2VuCiAgICAgICAgICAgICAgLi5leHRlcm5hbFRva2VuID0gZXh0ZXJuYWxUb2tlbgogICAgICAgICAgICAgIC4ubGF0ZVRva2VuID0gbGF0ZVRva2VuCiAgICAgICAgICAgICAgLi5zdGF0aWNUb2tlbiA9IHN0YXRpY1Rva2VuCiAgICAgICAgICAgICAgLi52YXJGaW5hbE9yQ29uc3QgPSB2YXJGaW5hbE9yQ29uc3Q7CgogICAgICAgICAgICB0b2tlbiA9IGNvbnRleHQucGFyc2VDbGFzc01lbWJlck1vZGlmaWVycyh0b2tlbik7CiAgICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwoKICAgICAgICAgICAgY292YXJpYW50VG9rZW4gPSBjb250ZXh0LmNvdmFyaWFudFRva2VuOwogICAgICAgICAgICBleHRlcm5hbFRva2VuID0gY29udGV4dC5leHRlcm5hbFRva2VuOwogICAgICAgICAgICBsYXRlVG9rZW4gPSBjb250ZXh0LmxhdGVUb2tlbjsKICAgICAgICAgICAgc3RhdGljVG9rZW4gPSBjb250ZXh0LnN0YXRpY1Rva2VuOwogICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSBjb250ZXh0LnZhckZpbmFsT3JDb25zdDsKCiAgICAgICAgICAgIGNvbnRleHQgPSBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGxpc3RlbmVyLmJlZ2luTWVtYmVyKCk7CgogICAgVG9rZW4gYmVmb3JlVHlwZSA9IHRva2VuOwogICAgVHlwZUluZm8gdHlwZUluZm8gPSBjb21wdXRlVHlwZSh0b2tlbiwgZmFsc2UsIHRydWUpOwogICAgdG9rZW4gPSB0eXBlSW5mby5za2lwVHlwZSh0b2tlbik7CiAgICBuZXh0ID0gdG9rZW4ubmV4dDsKCiAgICBUb2tlbiBnZXRPclNldDsKICAgIGlmIChuZXh0LnR5cGUgIT0gVG9rZW5UeXBlLklERU5USUZJRVIpIHsKICAgICAgU3RyaW5nIHZhbHVlID0gbmV4dC5zdHJpbmdWYWx1ZTsKICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2dldCcpIHx8IGlkZW50aWNhbCh2YWx1ZSwgJ3NldCcpKSB7CiAgICAgICAgaWYgKG5leHQubmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgICAgIGdldE9yU2V0ID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgfQogICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBjb250aW51ZSBwYXJzaW5nIGBnZXRgIG9yIGBzZXRgIGFzIGFuIGlkZW50aWZpZXIuCiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnZmFjdG9yeScpKSB7CiAgICAgICAgVG9rZW4gbmV4dDIgPSBuZXh0Lm5leHQ7CiAgICAgICAgaWYgKG5leHQyLmlzSWRlbnRpZmllciB8fCBuZXh0Mi5pc01vZGlmaWVyKSB7CiAgICAgICAgICBpZiAoYmVmb3JlVHlwZSAhPSB0b2tlbikgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBmYXN0YS5tZXNzYWdlVHlwZUJlZm9yZUZhY3RvcnkpOwogICAgICAgICAgfQogICAgICAgICAgdG9rZW4gPSBwYXJzZUZhY3RvcnlNZXRob2QodG9rZW4sIGJlZm9yZVN0YXJ0LCBleHRlcm5hbFRva2VuLAogICAgICAgICAgICAgIHN0YXRpY1Rva2VuID8/IGNvdmFyaWFudFRva2VuLCB2YXJGaW5hbE9yQ29uc3QpOwogICAgICAgICAgbGlzdGVuZXIuZW5kTWVtYmVyKCk7CiAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgfQogICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBjb250aW51ZSBwYXJzaW5nIGBmYWN0b3J5YCBhcyBhbiBpZGVudGlmaWVyLgogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ29wZXJhdG9yJykpIHsKICAgICAgICBUb2tlbiBuZXh0MiA9IG5leHQubmV4dDsKICAgICAgICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZVBhcmFtID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKG5leHQpOwogICAgICAgIC8vIGBvcGVyYXRvcmAgY2FuIGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBhcyBpbgogICAgICAgIC8vIGBpbnQgb3BlcmF0b3I8VD4oKWAgb3IgYGludCBvcGVyYXRvciA9IDJgCiAgICAgICAgaWYgKG5leHQyLmlzVXNlckRlZmluYWJsZU9wZXJhdG9yICYmIHR5cGVQYXJhbSA9PSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlTWV0aG9kKAogICAgICAgICAgICAgIGJlZm9yZVN0YXJ0LAogICAgICAgICAgICAgIGV4dGVybmFsVG9rZW4sCiAgICAgICAgICAgICAgc3RhdGljVG9rZW4sCiAgICAgICAgICAgICAgY292YXJpYW50VG9rZW4sCiAgICAgICAgICAgICAgbGF0ZVRva2VuLAogICAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwKICAgICAgICAgICAgICBiZWZvcmVUeXBlLAogICAgICAgICAgICAgIHR5cGVJbmZvLAogICAgICAgICAgICAgIGdldE9yU2V0LAogICAgICAgICAgICAgIHRva2VuLm5leHQpOwogICAgICAgICAgbGlzdGVuZXIuZW5kTWVtYmVyKCk7CiAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnPT09JywgbmV4dDIpIHx8CiAgICAgICAgICAgIG9wdGlvbmFsKCchPT0nLCBuZXh0MikgfHwKICAgICAgICAgICAgKG5leHQyLmlzT3BlcmF0b3IgJiYKICAgICAgICAgICAgICAgICFvcHRpb25hbCgnPScsIG5leHQyKSAmJgogICAgICAgICAgICAgICAgIW9wdGlvbmFsKCc8JywgbmV4dDIpKSkgewogICAgICAgICAgLy8gUmVjb3Zlcnk6IEludmFsaWQgb3BlcmF0b3IKICAgICAgICAgIHJldHVybiBwYXJzZUludmFsaWRPcGVyYXRvckRlY2xhcmF0aW9uKAogICAgICAgICAgICAgIGJlZm9yZVN0YXJ0LAogICAgICAgICAgICAgIGV4dGVybmFsVG9rZW4sCiAgICAgICAgICAgICAgc3RhdGljVG9rZW4sCiAgICAgICAgICAgICAgY292YXJpYW50VG9rZW4sCiAgICAgICAgICAgICAgbGF0ZVRva2VuLAogICAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwKICAgICAgICAgICAgICBiZWZvcmVUeXBlKTsKICAgICAgICB9IGVsc2UgaWYgKGlzVW5hcnlNaW51cyhuZXh0MikpIHsKICAgICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgICB0b2tlbiA9IHBhcnNlTWV0aG9kKAogICAgICAgICAgICAgIGJlZm9yZVN0YXJ0LAogICAgICAgICAgICAgIGV4dGVybmFsVG9rZW4sCiAgICAgICAgICAgICAgc3RhdGljVG9rZW4sCiAgICAgICAgICAgICAgY292YXJpYW50VG9rZW4sCiAgICAgICAgICAgICAgbGF0ZVRva2VuLAogICAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwKICAgICAgICAgICAgICBiZWZvcmVUeXBlLAogICAgICAgICAgICAgIHR5cGVJbmZvLAogICAgICAgICAgICAgIGdldE9yU2V0LAogICAgICAgICAgICAgIHRva2VuLm5leHQpOwogICAgICAgICAgbGlzdGVuZXIuZW5kTWVtYmVyKCk7CiAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgfQogICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBjb250aW51ZSBwYXJzaW5nIGBvcGVyYXRvcmAgYXMgYW4gaWRlbnRpZmllci4KICAgICAgfSBlbHNlIGlmICghbmV4dC5pc0lkZW50aWZpZXIgfHwKICAgICAgICAgIChpZGVudGljYWwodmFsdWUsICd0eXBlZGVmJykgJiYKICAgICAgICAgICAgICB0b2tlbiA9PSBiZWZvcmVTdGFydCAmJgogICAgICAgICAgICAgIG5leHQubmV4dC5pc0lkZW50aWZpZXIpKSB7CiAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICByZXR1cm4gcmVjb3ZlckZyb21JbnZhbGlkQ2xhc3NNZW1iZXIoCiAgICAgICAgICAgIHRva2VuLAogICAgICAgICAgICBiZWZvcmVTdGFydCwKICAgICAgICAgICAgZXh0ZXJuYWxUb2tlbiwKICAgICAgICAgICAgc3RhdGljVG9rZW4sCiAgICAgICAgICAgIGNvdmFyaWFudFRva2VuLAogICAgICAgICAgICBsYXRlVG9rZW4sCiAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwKICAgICAgICAgICAgYmVmb3JlVHlwZSwKICAgICAgICAgICAgdHlwZUluZm8sCiAgICAgICAgICAgIGdldE9yU2V0KTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlSW5mbyA9PSBub1R5cGUgJiYgdmFyRmluYWxPckNvbnN0ID09IG51bGwpIHsKICAgICAgVG9rZW4gbmV4dDIgPSBuZXh0Lm5leHQ7CiAgICAgIGlmIChuZXh0Mi5pc1VzZXJEZWZpbmFibGVPcGVyYXRvciAmJiBuZXh0Mi5lbmRHcm91cCA9PSBudWxsKSB7CiAgICAgICAgU3RyaW5nIHZhbHVlID0gbmV4dDIubmV4dC5zdHJpbmdWYWx1ZTsKICAgICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnKCcpIHx8CiAgICAgICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJ3snKSB8fAogICAgICAgICAgICBpZGVudGljYWwodmFsdWUsICc9PicpKSB7CiAgICAgICAgICAvLyBSZWNvdmVyeTogTWlzc2luZyBgb3BlcmF0b3JgIGtleXdvcmQKICAgICAgICAgIHJldHVybiBwYXJzZUludmFsaWRPcGVyYXRvckRlY2xhcmF0aW9uKAogICAgICAgICAgICAgIGJlZm9yZVN0YXJ0LAogICAgICAgICAgICAgIGV4dGVybmFsVG9rZW4sCiAgICAgICAgICAgICAgc3RhdGljVG9rZW4sCiAgICAgICAgICAgICAgY292YXJpYW50VG9rZW4sCiAgICAgICAgICAgICAgbGF0ZVRva2VuLAogICAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwKICAgICAgICAgICAgICBiZWZvcmVUeXBlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBBdCB0aGlzIHBvaW50LCB0b2tlbiBpcyBiZWZvcmUgdGhlIG5hbWUsIGFuZCBuZXh0IGlzIHRoZSBuYW1lCiAgICBuZXh0ID0gbmV4dC5uZXh0OwogICAgU3RyaW5nIHZhbHVlID0gbmV4dC5zdHJpbmdWYWx1ZTsKICAgIGlmIChnZXRPclNldCAhPSBudWxsIHx8CiAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnKCcpIHx8CiAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCAneycpIHx8CiAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnPCcpIHx8CiAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnLicpIHx8CiAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnPT4nKSkgewogICAgICB0b2tlbiA9IHBhcnNlTWV0aG9kKAogICAgICAgICAgYmVmb3JlU3RhcnQsCiAgICAgICAgICBleHRlcm5hbFRva2VuLAogICAgICAgICAgc3RhdGljVG9rZW4sCiAgICAgICAgICBjb3ZhcmlhbnRUb2tlbiwKICAgICAgICAgIGxhdGVUb2tlbiwKICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwKICAgICAgICAgIGJlZm9yZVR5cGUsCiAgICAgICAgICB0eXBlSW5mbywKICAgICAgICAgIGdldE9yU2V0LAogICAgICAgICAgdG9rZW4ubmV4dCk7CiAgICB9IGVsc2UgewogICAgICBpZiAoZ2V0T3JTZXQgIT0gbnVsbCkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgIGdldE9yU2V0LCBmYXN0YS50ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllcik7CiAgICAgIH0KICAgICAgdG9rZW4gPSBwYXJzZUZpZWxkcygKICAgICAgICAgIGJlZm9yZVN0YXJ0LAogICAgICAgICAgZXh0ZXJuYWxUb2tlbiwKICAgICAgICAgIHN0YXRpY1Rva2VuLAogICAgICAgICAgY292YXJpYW50VG9rZW4sCiAgICAgICAgICBsYXRlVG9rZW4sCiAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgICBiZWZvcmVUeXBlLAogICAgICAgICAgdHlwZUluZm8sCiAgICAgICAgICB0b2tlbi5uZXh0LAogICAgICAgICAgZmFsc2UpOwogICAgfQogICAgbGlzdGVuZXIuZW5kTWVtYmVyKCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZU1ldGhvZCgKICAgICAgVG9rZW4gYmVmb3JlU3RhcnQsCiAgICAgIFRva2VuIGV4dGVybmFsVG9rZW4sCiAgICAgIFRva2VuIHN0YXRpY1Rva2VuLAogICAgICBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gbGF0ZVRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsCiAgICAgIFRva2VuIGJlZm9yZVR5cGUsCiAgICAgIFR5cGVJbmZvIHR5cGVJbmZvLAogICAgICBUb2tlbiBnZXRPclNldCwKICAgICAgVG9rZW4gbmFtZSkgewogICAgaWYgKGxhdGVUb2tlbiAhPSBudWxsKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBsYXRlVG9rZW4sIGZhc3RhLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgIH0KICAgIGJvb2wgaXNPcGVyYXRvciA9IGZhbHNlOwogICAgaWYgKGdldE9yU2V0ID09IG51bGwgJiYgb3B0aW9uYWwoJ29wZXJhdG9yJywgbmFtZSkpIHsKICAgICAgVG9rZW4gb3BlcmF0b3IgPSBuYW1lLm5leHQ7CiAgICAgIGlmIChvcGVyYXRvci5pc09wZXJhdG9yIHx8CiAgICAgICAgICBpZGVudGljYWwob3BlcmF0b3Iua2luZCwgRVFfRVFfRVFfVE9LRU4pIHx8CiAgICAgICAgICBpZGVudGljYWwob3BlcmF0b3Iua2luZCwgQkFOR19FUV9FUV9UT0tFTikgfHwKICAgICAgICAgIGlzVW5hcnlNaW51cyhvcGVyYXRvcikpIHsKICAgICAgICBpc09wZXJhdG9yID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIGlmIChzdGF0aWNUb2tlbiAhPSBudWxsKSB7CiAgICAgIGlmIChpc09wZXJhdG9yKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihzdGF0aWNUb2tlbiwgZmFzdGEubWVzc2FnZVN0YXRpY09wZXJhdG9yKTsKICAgICAgICBzdGF0aWNUb2tlbiA9IG51bGw7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY292YXJpYW50VG9rZW4gIT0gbnVsbCkgewogICAgICBpZiAoZ2V0T3JTZXQgPT0gbnVsbCB8fCBvcHRpb25hbCgnZ2V0JywgZ2V0T3JTZXQpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihjb3ZhcmlhbnRUb2tlbiwgZmFzdGEubWVzc2FnZUNvdmFyaWFudE1lbWJlcik7CiAgICAgICAgY292YXJpYW50VG9rZW4gPSBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwpIHsKICAgICAgaWYgKG9wdGlvbmFsKCdjb25zdCcsIHZhckZpbmFsT3JDb25zdCkpIHsKICAgICAgICBpZiAoZ2V0T3JTZXQgIT0gbnVsbCkgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGZhc3RhLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgICAgICAgIHZhckZpbmFsT3JDb25zdCA9IG51bGw7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCd2YXInLCB2YXJGaW5hbE9yQ29uc3QpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih2YXJGaW5hbE9yQ29uc3QsIGZhc3RhLm1lc3NhZ2VWYXJSZXR1cm5UeXBlKTsKICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChvcHRpb25hbCgnZmluYWwnLCB2YXJGaW5hbE9yQ29uc3QpKTsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGZhc3RhLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSBudWxsOwogICAgICB9CiAgICB9CgogICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIHBhcnNpbmcgdGhlIG5hbWUgYmVmb3JlIGNhbGxpbmcgYmVnaW5NZXRob2QKICAgIC8vIHJhdGhlciB0aGFuIHBhc3NpbmcgdGhlIG5hbWUgdG9rZW4gaW50byBiZWdpbk1ldGhvZC4KICAgIGxpc3RlbmVyLmJlZ2luTWV0aG9kKGV4dGVybmFsVG9rZW4sIHN0YXRpY1Rva2VuLCBjb3ZhcmlhbnRUb2tlbiwKICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGdldE9yU2V0LCBuYW1lKTsKCiAgICBUb2tlbiB0b2tlbiA9IHR5cGVJbmZvLnBhcnNlVHlwZShiZWZvcmVUeXBlLCB0aGlzKTsKICAgIGFzc2VydCh0b2tlbi5uZXh0ID09IChnZXRPclNldCA/PyBuYW1lKSk7CiAgICB0b2tlbiA9IGdldE9yU2V0ID8/IHRva2VuOwoKICAgIGlmIChpc09wZXJhdG9yKSB7CiAgICAgIHRva2VuID0gcGFyc2VPcGVyYXRvck5hbWUodG9rZW4pOwogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5tZXRob2REZWNsYXJhdGlvbik7CiAgICAgIGlmIChnZXRPclNldCA9PSBudWxsKSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZVF1YWxpZmllZFJlc3RPcHQoCiAgICAgICAgICAgIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5tZXRob2REZWNsYXJhdGlvbkNvbnRpbnVhdGlvbik7CiAgICAgIH0KICAgIH0KCiAgICBib29sIGlzR2V0dGVyID0gZmFsc2U7CiAgICBpZiAoZ2V0T3JTZXQgPT0gbnVsbCkgewogICAgICB0b2tlbiA9IHBhcnNlTWV0aG9kVHlwZVZhcih0b2tlbik7CiAgICB9IGVsc2UgewogICAgICBpc0dldHRlciA9IG9wdGlvbmFsKCJnZXQiLCBnZXRPclNldCk7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZVZhcmlhYmxlcyh0b2tlbi5uZXh0KTsKICAgIH0KCiAgICBNZW1iZXJLaW5kIGtpbmQgPSBzdGF0aWNUb2tlbiAhPSBudWxsCiAgICAgICAgPyBNZW1iZXJLaW5kLlN0YXRpY01ldGhvZAogICAgICAgIDogTWVtYmVyS2luZC5Ob25TdGF0aWNNZXRob2Q7CiAgICBUb2tlbiBiZWZvcmVQYXJhbSA9IHRva2VuOwogICAgVG9rZW4gYmVmb3JlSW5pdGlhbGl6ZXJzID0KICAgICAgICBwYXJzZUdldHRlck9yRm9ybWFsUGFyYW1ldGVycyh0b2tlbiwgbmFtZSwgaXNHZXR0ZXIsIGtpbmQpOwogICAgdG9rZW4gPSBwYXJzZUluaXRpYWxpemVyc09wdChiZWZvcmVJbml0aWFsaXplcnMpOwogICAgaWYgKHRva2VuID09IGJlZm9yZUluaXRpYWxpemVycykgYmVmb3JlSW5pdGlhbGl6ZXJzID0gbnVsbDsKCiAgICBBc3luY01vZGlmaWVyIHNhdmVkQXN5bmNNb2RpZmllciA9IGFzeW5jU3RhdGU7CiAgICBUb2tlbiBhc3luY1Rva2VuID0gdG9rZW4ubmV4dDsKICAgIHRva2VuID0gcGFyc2VBc3luY01vZGlmaWVyT3B0KHRva2VuKTsKICAgIGlmIChnZXRPclNldCAhPSBudWxsICYmICFpblBsYWluU3luYyAmJiBvcHRpb25hbCgic2V0IiwgZ2V0T3JTZXQpKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoYXN5bmNUb2tlbiwgZmFzdGEubWVzc2FnZVNldHRlck5vdFN5bmMpOwogICAgfQogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAoZXh0ZXJuYWxUb2tlbiAhPSBudWxsKSB7CiAgICAgIGlmICghb3B0aW9uYWwoJzsnLCBuZXh0KSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZUV4dGVybmFsTWV0aG9kV2l0aEJvZHkpOwogICAgICB9CiAgICB9CiAgICBpZiAob3B0aW9uYWwoJz0nLCBuZXh0KSkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VSZWRpcmVjdGlvbkluTm9uRmFjdG9yeSk7CiAgICAgIHRva2VuID0gcGFyc2VSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KHRva2VuKTsKICAgIH0gZWxzZSB7CiAgICAgIHRva2VuID0gcGFyc2VGdW5jdGlvbkJvZHkodG9rZW4sIGZhbHNlLAogICAgICAgICAgKHN0YXRpY1Rva2VuID09IG51bGwgfHwgZXh0ZXJuYWxUb2tlbiAhPSBudWxsKSAmJiBpblBsYWluU3luYyk7CiAgICB9CiAgICBhc3luY1N0YXRlID0gc2F2ZWRBc3luY01vZGlmaWVyOwogICAgbGlzdGVuZXIuZW5kTWV0aG9kKGdldE9yU2V0LCBiZWZvcmVTdGFydC5uZXh0LCBiZWZvcmVQYXJhbS5uZXh0LAogICAgICAgIGJlZm9yZUluaXRpYWxpemVycz8ubmV4dCwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VGYWN0b3J5TWV0aG9kKFRva2VuIHRva2VuLCBUb2tlbiBiZWZvcmVTdGFydCwgVG9rZW4gZXh0ZXJuYWxUb2tlbiwKICAgICAgVG9rZW4gc3RhdGljT3JDb3ZhcmlhbnQsIFRva2VuIHZhckZpbmFsT3JDb25zdCkgewogICAgVG9rZW4gZmFjdG9yeUtleXdvcmQgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2ZhY3RvcnknLCBmYWN0b3J5S2V5d29yZCkpOwoKICAgIGlmICghaXNWYWxpZFR5cGVSZWZlcmVuY2UodG9rZW4ubmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgTW9kaWZpZXJSZWNvdmVyeUNvbnRleHQgY29udGV4dCA9IG5ldyBNb2RpZmllclJlY292ZXJ5Q29udGV4dCh0aGlzKQogICAgICAgIC4uZXh0ZXJuYWxUb2tlbiA9IGV4dGVybmFsVG9rZW4KICAgICAgICAuLnN0YXRpY09yQ292YXJpYW50ID0gc3RhdGljT3JDb3ZhcmlhbnQKICAgICAgICAuLnZhckZpbmFsT3JDb25zdCA9IHZhckZpbmFsT3JDb25zdDsKCiAgICAgIHRva2VuID0gY29udGV4dC5wYXJzZU1vZGlmaWVyc0FmdGVyRmFjdG9yeSh0b2tlbik7CgogICAgICBleHRlcm5hbFRva2VuID0gY29udGV4dC5leHRlcm5hbFRva2VuOwogICAgICBzdGF0aWNPckNvdmFyaWFudCA9IGNvbnRleHQuc3RhdGljVG9rZW4gPz8gY29udGV4dC5jb3ZhcmlhbnRUb2tlbjsKICAgICAgdmFyRmluYWxPckNvbnN0ID0gY29udGV4dC52YXJGaW5hbE9yQ29uc3Q7CgogICAgICBjb250ZXh0ID0gbnVsbDsKICAgIH0KCiAgICBpZiAoc3RhdGljT3JDb3ZhcmlhbnQgIT0gbnVsbCkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgc3RhdGljT3JDb3ZhcmlhbnQsIGZhc3RhLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgIH0KICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCAmJiAhb3B0aW9uYWwoJ2NvbnN0JywgdmFyRmluYWxPckNvbnN0KSkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgdmFyRmluYWxPckNvbnN0LCBmYXN0YS50ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllcik7CiAgICAgIHZhckZpbmFsT3JDb25zdCA9IG51bGw7CiAgICB9CgogICAgbGlzdGVuZXIuYmVnaW5GYWN0b3J5TWV0aG9kKGJlZm9yZVN0YXJ0LCBleHRlcm5hbFRva2VuLCB2YXJGaW5hbE9yQ29uc3QpOwogICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5tZXRob2REZWNsYXJhdGlvbik7CiAgICB0b2tlbiA9IHBhcnNlUXVhbGlmaWVkUmVzdE9wdCgKICAgICAgICB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQubWV0aG9kRGVjbGFyYXRpb25Db250aW51YXRpb24pOwogICAgdG9rZW4gPSBwYXJzZU1ldGhvZFR5cGVWYXIodG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXF1aXJlZE9wdCh0b2tlbiwgTWVtYmVyS2luZC5GYWN0b3J5KTsKICAgIFRva2VuIGFzeW5jVG9rZW4gPSB0b2tlbi5uZXh0OwogICAgdG9rZW4gPSBwYXJzZUFzeW5jTW9kaWZpZXJPcHQodG9rZW4pOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAoIWluUGxhaW5TeW5jKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoYXN5bmNUb2tlbiwgZmFzdGEubWVzc2FnZUZhY3RvcnlOb3RTeW5jKTsKICAgIH0KICAgIGlmIChvcHRpb25hbCgnPScsIG5leHQpKSB7CiAgICAgIGlmIChleHRlcm5hbFRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VFeHRlcm5hbEZhY3RvcnlSZWRpcmVjdGlvbik7CiAgICAgIH0KICAgICAgdG9rZW4gPSBwYXJzZVJlZGlyZWN0aW5nRmFjdG9yeUJvZHkodG9rZW4pOwogICAgfSBlbHNlIGlmIChleHRlcm5hbFRva2VuICE9IG51bGwpIHsKICAgICAgaWYgKCFvcHRpb25hbCgnOycsIG5leHQpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlRXh0ZXJuYWxGYWN0b3J5V2l0aEJvZHkpOwogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VGdW5jdGlvbkJvZHkodG9rZW4sIGZhbHNlLCB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCAmJiAhb3B0aW9uYWwoJ25hdGl2ZScsIG5leHQpKSB7CiAgICAgICAgaWYgKG9wdGlvbmFsKCdjb25zdCcsIHZhckZpbmFsT3JDb25zdCkpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodmFyRmluYWxPckNvbnN0LCBmYXN0YS5tZXNzYWdlQ29uc3RGYWN0b3J5KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdG9rZW4gPSBwYXJzZUZ1bmN0aW9uQm9keSh0b2tlbiwgZmFsc2UsIGZhbHNlKTsKICAgIH0KICAgIGxpc3RlbmVyLmVuZEZhY3RvcnlNZXRob2QoYmVmb3JlU3RhcnQubmV4dCwgZmFjdG9yeUtleXdvcmQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlT3BlcmF0b3JOYW1lKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBiZWZvcmVUb2tlbiA9IHRva2VuOwogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdvcGVyYXRvcicsIHRva2VuKSk7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChuZXh0LmlzVXNlckRlZmluYWJsZU9wZXJhdG9yKSB7CiAgICAgIGlmIChjb21wdXRlVHlwZVBhcmFtT3JBcmcodG9rZW4pICE9IG5vVHlwZVBhcmFtT3JBcmcpIHsKICAgICAgICAvLyBgb3BlcmF0b3JgIGlzIGJlaW5nIHVzZWQgYXMgYW4gaWRlbnRpZmllci4KICAgICAgICAvLyBGb3IgZXhhbXBsZTogYGludCBvcGVyYXRvcjxUPihmb28pID0+IDA7YAogICAgICAgIGxpc3RlbmVyLmhhbmRsZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0Lm1ldGhvZERlY2xhcmF0aW9uKTsKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlT3BlcmF0b3JOYW1lKHRva2VuLCBuZXh0KTsKICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgfQogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgIHJldHVybiBlbnN1cmVJZGVudGlmaWVyKGJlZm9yZVRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5vcGVyYXRvck5hbWUpOwogICAgfSBlbHNlIGlmIChpc1VuYXJ5TWludXMobmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuZXh0LCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU9wZXJhdG9yTmFtZSh0b2tlbiwgbmV4dCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfSBlbHNlIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgLy8gU2Nhbm5lciByZXBvcnRzIGFuIGVycm9yIGZvciBgPT09YCBhbmQgYCE9PWAuCiAgICAgIGlmIChuZXh0LnR5cGUgIT0gVG9rZW5UeXBlLkVRX0VRX0VRICYmCiAgICAgICAgICBuZXh0LnR5cGUgIT0gVG9rZW5UeXBlLkJBTkdfRVFfRVEpIHsKICAgICAgICAvLyBUaGUgdXNlciBoYXMgc3BlY2lmaWVkIGFuIGludmFsaWQgb3BlcmF0b3IgbmFtZS4KICAgICAgICAvLyBSZXBvcnQgdGhlIGVycm9yLCBhY2NlcHQgdGhlIGludmFsaWQgb3BlcmF0b3IgbmFtZSwgYW5kIG1vdmUgb24uCiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuZXh0LCBmYXN0YS50ZW1wbGF0ZUludmFsaWRPcGVyYXRvcik7CiAgICAgIH0KICAgICAgbGlzdGVuZXIuaGFuZGxlSW52YWxpZE9wZXJhdG9yTmFtZSh0b2tlbiwgbmV4dCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgVG9rZW4gcGFyc2VGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGJlZ2luVG9rZW4gPSB0b2tlbi5uZXh0OwogICAgbGlzdGVuZXIuYmVnaW5GdW5jdGlvbkV4cHJlc3Npb24oYmVnaW5Ub2tlbik7CiAgICB0b2tlbiA9IHBhcnNlRm9ybWFsUGFyYW1ldGVyc1JlcXVpcmVkT3B0KHRva2VuLCBNZW1iZXJLaW5kLkxvY2FsKTsKICAgIHRva2VuID0gcGFyc2VBc3luY09wdEJvZHkodG9rZW4sIHRydWUsIGZhbHNlKTsKICAgIGxpc3RlbmVyLmVuZEZ1bmN0aW9uRXhwcmVzc2lvbihiZWdpblRva2VuLCB0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlRnVuY3Rpb25MaXRlcmFsKAogICAgICBUb2tlbiBzdGFydCwKICAgICAgVG9rZW4gYmVmb3JlTmFtZSwKICAgICAgVG9rZW4gbmFtZSwKICAgICAgVHlwZUluZm8gdHlwZUluZm8sCiAgICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlUGFyYW0sCiAgICAgIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIFRva2VuIGZvcm1hbHMgPSB0eXBlUGFyYW0ucGFyc2VWYXJpYWJsZXMobmFtZSwgdGhpcyk7CiAgICBsaXN0ZW5lci5iZWdpbk5hbWVkRnVuY3Rpb25FeHByZXNzaW9uKHN0YXJ0Lm5leHQpOwogICAgdHlwZUluZm8ucGFyc2VUeXBlKHN0YXJ0LCB0aGlzKTsKICAgIHJldHVybiBwYXJzZU5hbWVkRnVuY3Rpb25SZXN0KGJlZm9yZU5hbWUsIHN0YXJ0Lm5leHQsIGZvcm1hbHMsIHRydWUpOwogIH0KCiAgLy8vIFBhcnNlcyB0aGUgcmVzdCBvZiBhIG5hbWVkIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHN0YXJ0aW5nIGZyb20gaXRzIFtuYW1lXQogIC8vLyBidXQgdGhlbiBza2lwcyBhbnkgdHlwZSBwYXJhbWV0ZXJzIGFuZCBjb250aW51ZSBwYXJzaW5nIGZyb20gW2Zvcm1hbHNdCiAgLy8vICh0aGUgZm9ybWFsIHBhcmFtZXRlcnMpLgogIC8vLwogIC8vLyBJZiBbaXNGdW5jdGlvbkV4cHJlc3Npb25dIGlzIHRydWUsIHRoaXMgbWV0aG9kIHBhcnNlcyB0aGUgcmVzdCBvZiBuYW1lZAogIC8vLyBmdW5jdGlvbiBleHByZXNzaW9uIHdoaWNoIGlzbid0IGxlZ2FsIHN5bnRheCBpbiBEYXJ0LiAgVXNlZnVsIGZvcgogIC8vLyByZWNvdmVyaW5nIGZyb20gSmF2YXNjcmlwdCBjb2RlIGJlaW5nIHBhc3RlZCBpbnRvIGEgRGFydCBwcm9ncmFtLCBhcyBpdAogIC8vLyB3aWxsIGludGVycHJldCBgZnVuY3Rpb24gZm9vKCkge31gIGFzIGEgbmFtZWQgZnVuY3Rpb24gZXhwcmVzc2lvbiB3aXRoCiAgLy8vIHJldHVybiB0eXBlIGBmdW5jdGlvbmAgYW5kIG5hbWUgYGZvb2AuCiAgLy8vCiAgLy8vIFByZWNvbmRpdGlvbjogdGhlIHBhcnNlciBoYXMgcHJldmlvdXNseSBnZW5lcmF0ZWQgdGhlc2UgZXZlbnRzOgogIC8vLwogIC8vLyAtIFR5cGUgdmFyaWFibGVzLgogIC8vLyAtIGBiZWdpbkxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbmAgaWYgW2lzRnVuY3Rpb25FeHByZXNzaW9uXSBpcyBmYWxzZSwKICAvLy8gICBvdGhlcndpc2UgYGJlZ2luTmFtZWRGdW5jdGlvbkV4cHJlc3Npb25gLgogIC8vLyAtIFJldHVybiB0eXBlLgogIFRva2VuIHBhcnNlTmFtZWRGdW5jdGlvblJlc3QoCiAgICAgIFRva2VuIGJlZm9yZU5hbWUsIFRva2VuIGJlZ2luLCBUb2tlbiBmb3JtYWxzLCBib29sIGlzRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICBUb2tlbiB0b2tlbiA9IGJlZm9yZU5hbWUubmV4dDsKICAgIGxpc3RlbmVyLmJlZ2luRnVuY3Rpb25OYW1lKHRva2VuKTsKICAgIHRva2VuID0KICAgICAgICBlbnN1cmVJZGVudGlmaWVyKGJlZm9yZU5hbWUsIElkZW50aWZpZXJDb250ZXh0LmxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbikKICAgICAgICAgICAgLm5leHQ7CiAgICBpZiAoaXNGdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIGJlZm9yZU5hbWUubmV4dCwgZmFzdGEubWVzc2FnZU5hbWVkRnVuY3Rpb25FeHByZXNzaW9uKTsKICAgIH0KICAgIGxpc3RlbmVyLmVuZEZ1bmN0aW9uTmFtZShiZWdpbiwgdG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXF1aXJlZE9wdChmb3JtYWxzLCBNZW1iZXJLaW5kLkxvY2FsKTsKICAgIHRva2VuID0gcGFyc2VJbml0aWFsaXplcnNPcHQodG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUFzeW5jT3B0Qm9keSh0b2tlbiwgaXNGdW5jdGlvbkV4cHJlc3Npb24sIGZhbHNlKTsKICAgIGlmIChpc0Z1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICBsaXN0ZW5lci5lbmROYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbih0b2tlbik7CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5lbmRMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb24odG9rZW4pOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlcyBhIGZ1bmN0aW9uIGJvZHkgb3B0aW9uYWxseSBwcmVjZWRlZCBieSBhbiBhc3luYyBtb2RpZmllciAoc2VlCiAgLy8vIFtwYXJzZUFzeW5jTW9kaWZpZXJPcHRdKS4gIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gYm90aCBleHByZXNzaW9uIGNvbnRleHQKICAvLy8gKHdoZW4gW29mRnVuY3Rpb25FeHByZXNzaW9uXSBpcyB0cnVlKSBhbmQgc3RhdGVtZW50IGNvbnRleHQuIEluIHN0YXRlbWVudAogIC8vLyBjb250ZXh0ICh3aGVuIFtvZkZ1bmN0aW9uRXhwcmVzc2lvbl0gaXMgZmFsc2UpLCBhbmQgaWYgdGhlIGZ1bmN0aW9uIGJvZHkKICAvLy8gaXMgb24gdGhlIGZvcm0gYD0+IGV4cHJlc3Npb25gLCBhIHRyYWlsaW5nIHNlbWljb2xvbiBpcyByZXF1aXJlZC4KICAvLy8KICAvLy8gSXQncyBhbiBlcnJvciBpZiB0aGVyZSdzIG5vIGZ1bmN0aW9uIGJvZHkgdW5sZXNzIFthbGxvd0Fic3RyYWN0XSBpcyB0cnVlLgogIFRva2VuIHBhcnNlQXN5bmNPcHRCb2R5KAogICAgICBUb2tlbiB0b2tlbiwgYm9vbCBvZkZ1bmN0aW9uRXhwcmVzc2lvbiwgYm9vbCBhbGxvd0Fic3RyYWN0KSB7CiAgICBBc3luY01vZGlmaWVyIHNhdmVkQXN5bmNNb2RpZmllciA9IGFzeW5jU3RhdGU7CiAgICB0b2tlbiA9IHBhcnNlQXN5bmNNb2RpZmllck9wdCh0b2tlbik7CiAgICB0b2tlbiA9IHBhcnNlRnVuY3Rpb25Cb2R5KHRva2VuLCBvZkZ1bmN0aW9uRXhwcmVzc2lvbiwgYWxsb3dBYnN0cmFjdCk7CiAgICBhc3luY1N0YXRlID0gc2F2ZWRBc3luY01vZGlmaWVyOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VDb25zdHJ1Y3RvclJlZmVyZW5jZShUb2tlbiB0b2tlbiwgW1R5cGVQYXJhbU9yQXJnSW5mbyB0eXBlQXJnXSkgewogICAgVG9rZW4gc3RhcnQgPQogICAgICAgIGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmNvbnN0cnVjdG9yUmVmZXJlbmNlKTsKICAgIGxpc3RlbmVyLmJlZ2luQ29uc3RydWN0b3JSZWZlcmVuY2Uoc3RhcnQpOwogICAgdG9rZW4gPSBwYXJzZVF1YWxpZmllZFJlc3RPcHQoCiAgICAgICAgc3RhcnQsIElkZW50aWZpZXJDb250ZXh0LmNvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uKTsKICAgIHR5cGVBcmcgPz89IGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0b2tlbik7CiAgICB0b2tlbiA9IHR5cGVBcmcucGFyc2VBcmd1bWVudHModG9rZW4sIHRoaXMpOwogICAgVG9rZW4gcGVyaW9kID0gbnVsbDsKICAgIGlmIChvcHRpb25hbCgnLicsIHRva2VuLm5leHQpKSB7CiAgICAgIHBlcmlvZCA9IHRva2VuLm5leHQ7CiAgICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcihwZXJpb2QsCiAgICAgICAgICBJZGVudGlmaWVyQ29udGV4dC5jb25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyk7CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5oYW5kbGVOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzKAogICAgICAgICAgdG9rZW4ubmV4dCk7CiAgICB9CiAgICBsaXN0ZW5lci5lbmRDb25zdHJ1Y3RvclJlZmVyZW5jZShzdGFydCwgcGVyaW9kLCB0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlUmVkaXJlY3RpbmdGYWN0b3J5Qm9keShUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc9JywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSh0b2tlbik7CiAgICBUb2tlbiBlcXVhbHMgPSB0b2tlbjsKICAgIHRva2VuID0gcGFyc2VDb25zdHJ1Y3RvclJlZmVyZW5jZSh0b2tlbik7CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KGVxdWFscywgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gc2tpcEZ1bmN0aW9uQm9keShUb2tlbiB0b2tlbiwgYm9vbCBpc0V4cHJlc3Npb24sIGJvb2wgYWxsb3dBYnN0cmFjdCkgewogICAgYXNzZXJ0KCFpc0V4cHJlc3Npb24pOwogICAgdG9rZW4gPSBza2lwQXN5bmNNb2RpZmllcih0b2tlbik7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnbmF0aXZlJywgbmV4dCkpIHsKICAgICAgVG9rZW4gbmF0aXZlVG9rZW4gPSBuZXh0OwogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogc2tpcCB0aGUgbmF0aXZlIGNsYXVzZSByYXRoZXIgdGhhbiBwYXJzaW5nIGl0CiAgICAgIC8vIG9yIHJlbW92ZSB0aGlzIGNvZGUgY29tcGxldGVseSB3aGVuIHdlIHJlbW92ZSBzdXBwb3J0CiAgICAgIC8vIGZvciB0aGUgYG5hdGl2ZWAgY2xhdXNlLgogICAgICB0b2tlbiA9IHBhcnNlTmF0aXZlQ2xhdXNlKHRva2VuKTsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgnOycsIG5leHQpKSB7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5U2tpcHBlZChuYXRpdmVUb2tlbiwgbmV4dCk7CiAgICAgICAgcmV0dXJuIHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgbGlzdGVuZXIuaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5SWdub3JlZChuYXRpdmVUb2tlbiwgbmV4dCk7CiAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byByZWNvdmVyIGFuZCBza2lwIGZ1bmN0aW9uIGJvZHkKICAgIH0KICAgIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnOycpKSB7CiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgaWYgKCFhbGxvd0Fic3RyYWN0KSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgZmFzdGEubWVzc2FnZUV4cGVjdGVkQm9keSk7CiAgICAgIH0KICAgICAgbGlzdGVuZXIuaGFuZGxlTm9GdW5jdGlvbkJvZHkodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICc9PicpKSB7CiAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKG5leHQpOwogICAgICAvLyBUaGVyZSBvdWdodCB0byBiZSBhIHNlbWljb2xvbiBmb2xsb3dpbmcgdGhlIGV4cHJlc3Npb24sIGJ1dCB3ZSBjaGVjawogICAgICAvLyBiZWZvcmUgYWR2YW5jaW5nIGluIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IHRoZSBtZXRob2QKICAgICAgLy8gW3BhcnNlRnVuY3Rpb25Cb2R5XSByZWNvdmVycyB3aGVuIHRoZSBzZW1pY29sb24gaXMgbWlzc2luZy4KICAgICAgaWYgKG9wdGlvbmFsKCc7JywgdG9rZW4ubmV4dCkpIHsKICAgICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgbGlzdGVuZXIuaGFuZGxlRnVuY3Rpb25Cb2R5U2tpcHBlZCh0b2tlbiwgdHJ1ZSk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJz0nKSkgewogICAgICB0b2tlbiA9IG5leHQ7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIGZhc3RhLm1lc3NhZ2VFeHBlY3RlZEJvZHkpOwogICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbih0b2tlbik7CiAgICAgIC8vIFRoZXJlIG91Z2h0IHRvIGJlIGEgc2VtaWNvbG9uIGZvbGxvd2luZyB0aGUgZXhwcmVzc2lvbiwgYnV0IHdlIGNoZWNrCiAgICAgIC8vIGJlZm9yZSBhZHZhbmNpbmcgaW4gb3JkZXIgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgdGhlIG1ldGhvZAogICAgICAvLyBbcGFyc2VGdW5jdGlvbkJvZHldIHJlY292ZXJzIHdoZW4gdGhlIHNlbWljb2xvbiBpcyBtaXNzaW5nLgogICAgICBpZiAob3B0aW9uYWwoJzsnLCB0b2tlbi5uZXh0KSkgewogICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgICBsaXN0ZW5lci5oYW5kbGVGdW5jdGlvbkJvZHlTa2lwcGVkKHRva2VuLCB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRva2VuID0gc2tpcEJsb2NrKHRva2VuKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlRnVuY3Rpb25Cb2R5U2tpcHBlZCh0b2tlbiwgZmFsc2UpOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlcyBhIGZ1bmN0aW9uIGJvZHkuICBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIGJvdGggZXhwcmVzc2lvbiBjb250ZXh0CiAgLy8vICh3aGVuIFtvZkZ1bmN0aW9uRXhwcmVzc2lvbl0gaXMgdHJ1ZSkgYW5kIHN0YXRlbWVudCBjb250ZXh0LiBJbiBzdGF0ZW1lbnQKICAvLy8gY29udGV4dCAod2hlbiBbb2ZGdW5jdGlvbkV4cHJlc3Npb25dIGlzIGZhbHNlKSwgYW5kIGlmIHRoZSBmdW5jdGlvbiBib2R5CiAgLy8vIGlzIG9uIHRoZSBmb3JtIGA9PiBleHByZXNzaW9uYCwgYSB0cmFpbGluZyBzZW1pY29sb24gaXMgcmVxdWlyZWQuCiAgLy8vCiAgLy8vIEl0J3MgYW4gZXJyb3IgaWYgdGhlcmUncyBubyBmdW5jdGlvbiBib2R5IHVubGVzcyBbYWxsb3dBYnN0cmFjdF0gaXMgdHJ1ZS4KICBUb2tlbiBwYXJzZUZ1bmN0aW9uQm9keSgKICAgICAgVG9rZW4gdG9rZW4sIGJvb2wgb2ZGdW5jdGlvbkV4cHJlc3Npb24sIGJvb2wgYWxsb3dBYnN0cmFjdCkgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJ25hdGl2ZScsIG5leHQpKSB7CiAgICAgIFRva2VuIG5hdGl2ZVRva2VuID0gbmV4dDsKICAgICAgdG9rZW4gPSBwYXJzZU5hdGl2ZUNsYXVzZSh0b2tlbik7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJzsnLCBuZXh0KSkgewogICAgICAgIGxpc3RlbmVyLmhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keShuYXRpdmVUb2tlbiwgbmV4dCk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlRXh0ZXJuYWxNZXRob2RXaXRoQm9keSk7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keUlnbm9yZWQobmF0aXZlVG9rZW4sIG5leHQpOwogICAgICAvLyBJZ25vcmUgdGhlIG5hdGl2ZSBrZXl3b3JkIGFuZCBmYWxsIHRocm91Z2ggdG8gcGFyc2UgdGhlIGJvZHkKICAgIH0KICAgIGlmIChvcHRpb25hbCgnOycsIG5leHQpKSB7CiAgICAgIGlmICghYWxsb3dBYnN0cmFjdCkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZUV4cGVjdGVkQm9keSk7CiAgICAgIH0KICAgICAgbGlzdGVuZXIuaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHkobmV4dCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnPT4nLCBuZXh0KSkgewogICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KG5leHQsIG9mRnVuY3Rpb25FeHByZXNzaW9uKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJz0nLCBuZXh0KSkgewogICAgICAvLyBSZWNvdmVyIGZyb20gYSBiYWQgZmFjdG9yeSBtZXRob2QuCiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZUV4cGVjdGVkQm9keSk7CiAgICAgIG5leHQgPSByZXdyaXRlci5pbnNlcnRUb2tlbigKICAgICAgICAgIG5leHQsIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuRlVOQ1RJT04sIG5leHQubmV4dC5jaGFyT2Zmc2V0KSk7CiAgICAgIFRva2VuIGJlZ2luID0gbmV4dDsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24obmV4dCk7CiAgICAgIGlmICghb2ZGdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShiZWdpbiwgdG9rZW4pOwogICAgICB9IGVsc2UgewogICAgICAgIGxpc3RlbmVyLmhhbmRsZUV4cHJlc3Npb25GdW5jdGlvbkJvZHkoYmVnaW4sIG51bGwpOwogICAgICB9CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICAgIFRva2VuIGJlZ2luID0gbmV4dDsKICAgIGludCBzdGF0ZW1lbnRDb3VudCA9IDA7CiAgICBpZiAoIW9wdGlvbmFsKCd7JywgbmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgLy8gSWYgYHJldHVybmAgdXNlZCBpbnN0ZWFkIG9mIGA9PmAsIHRoZW4gcmVwb3J0IGFuIGVycm9yIGFuZCBjb250aW51ZQogICAgICBpZiAob3B0aW9uYWwoJ3JldHVybicsIG5leHQpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlRXhwZWN0ZWRCb2R5KTsKICAgICAgICBuZXh0ID0gcmV3cml0ZXIuaW5zZXJ0VG9rZW4oCiAgICAgICAgICAgIG5leHQsIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuRlVOQ1RJT04sIG5leHQubmV4dC5jaGFyT2Zmc2V0KSk7CiAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShuZXh0LCBvZkZ1bmN0aW9uRXhwcmVzc2lvbik7CiAgICAgIH0KICAgICAgLy8gSWYgdGhlcmUgaXMgYSBzdHJheSBzaW1wbGUgaWRlbnRpZmllciBpbiB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbgogICAgICAvLyBiZWNhdXNlIHRoZSB1c2VyIGlzIHR5cGluZyAoZS5nLiBgKCkgYXN5ID0+IG51bGw7YCkKICAgICAgLy8gdGhlbiByZXBvcnQgYW4gZXJyb3IsIHNraXAgdGhlIHRva2VuLCBhbmQgY29udGludWUgcGFyc2luZy4KICAgICAgaWYgKG5leHQuaXNLZXl3b3JkT3JJZGVudGlmaWVyICYmIG9wdGlvbmFsKCc9PicsIG5leHQubmV4dCkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKG5leHQsIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KG5leHQubmV4dCwgb2ZGdW5jdGlvbkV4cHJlc3Npb24pOwogICAgICB9CiAgICAgIGlmIChuZXh0LmlzS2V5d29yZE9ySWRlbnRpZmllciAmJiBvcHRpb25hbCgneycsIG5leHQubmV4dCkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKG5leHQsIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgYmVnaW4gPSBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gcGFyc2UgdGhlIGJsb2NrLgogICAgICB9IGVsc2UgewogICAgICAgIHRva2VuID0gZW5zdXJlQmxvY2sodG9rZW4sIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRGdW5jdGlvbkJvZHksIG51bGwpOwogICAgICAgIGxpc3RlbmVyLmhhbmRsZUludmFsaWRGdW5jdGlvbkJvZHkodG9rZW4pOwogICAgICAgIHJldHVybiB0b2tlbi5lbmRHcm91cDsKICAgICAgfQogICAgfQoKICAgIExvb3BTdGF0ZSBzYXZlZExvb3BTdGF0ZSA9IGxvb3BTdGF0ZTsKICAgIGxvb3BTdGF0ZSA9IExvb3BTdGF0ZS5PdXRzaWRlTG9vcDsKICAgIGxpc3RlbmVyLmJlZ2luQmxvY2tGdW5jdGlvbkJvZHkoYmVnaW4pOwogICAgdG9rZW4gPSBuZXh0OwogICAgd2hpbGUgKG5vdEVvZk9yVmFsdWUoJ30nLCB0b2tlbi5uZXh0KSkgewogICAgICBUb2tlbiBzdGFydFRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgdG9rZW4gPSBwYXJzZVN0YXRlbWVudCh0b2tlbik7CiAgICAgIGlmIChpZGVudGljYWwodG9rZW4ubmV4dCwgc3RhcnRUb2tlbikpIHsKICAgICAgICAvLyBObyBwcm9ncmVzcyB3YXMgbWFkZSwgc28gd2UgcmVwb3J0IHRoZSBjdXJyZW50IHRva2VuIGFzIGJlaW5nIGludmFsaWQKICAgICAgICAvLyBhbmQgbW92ZSBmb3J3YXJkLgogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIHRva2VuLCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKHRva2VuKSk7CiAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICAgICsrc3RhdGVtZW50Q291bnQ7CiAgICB9CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ30nLCB0b2tlbikpOwogICAgbGlzdGVuZXIuZW5kQmxvY2tGdW5jdGlvbkJvZHkoc3RhdGVtZW50Q291bnQsIGJlZ2luLCB0b2tlbik7CiAgICBsb29wU3RhdGUgPSBzYXZlZExvb3BTdGF0ZTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShUb2tlbiB0b2tlbiwgYm9vbCBvZkZ1bmN0aW9uRXhwcmVzc2lvbikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCc9PicsIHRva2VuKSk7CiAgICBUb2tlbiBiZWdpbiA9IHRva2VuOwogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgaWYgKCFvZkZ1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUV4cHJlc3Npb25GdW5jdGlvbkJvZHkoYmVnaW4sIHRva2VuKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUV4cHJlc3Npb25GdW5jdGlvbkJvZHkoYmVnaW4sIG51bGwpOwogICAgfQogICAgaWYgKGluR2VuZXJhdG9yKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUludmFsaWRTdGF0ZW1lbnQoCiAgICAgICAgICBiZWdpbiwgZmFzdGEubWVzc2FnZUdlbmVyYXRvclJldHVybnNWYWx1ZSk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBza2lwQXN5bmNNb2RpZmllcihUb2tlbiB0b2tlbikgewogICAgU3RyaW5nIHZhbHVlID0gdG9rZW4ubmV4dC5zdHJpbmdWYWx1ZTsKICAgIGlmIChpZGVudGljYWwodmFsdWUsICdhc3luYycpKSB7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgdmFsdWUgPSB0b2tlbi5uZXh0LnN0cmluZ1ZhbHVlOwoKICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJyonKSkgewogICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdzeW5jJykpIHsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICB2YWx1ZSA9IHRva2VuLm5leHQuc3RyaW5nVmFsdWU7CgogICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnKicpKSB7CiAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUFzeW5jTW9kaWZpZXJPcHQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGFzeW5jOwogICAgVG9rZW4gc3RhcjsKICAgIGFzeW5jU3RhdGUgPSBBc3luY01vZGlmaWVyLlN5bmM7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnYXN5bmMnLCBuZXh0KSkgewogICAgICBhc3luYyA9IHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgnKicsIG5leHQpKSB7CiAgICAgICAgYXN5bmNTdGF0ZSA9IEFzeW5jTW9kaWZpZXIuQXN5bmNTdGFyOwogICAgICAgIHN0YXIgPSBuZXh0OwogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3luY1N0YXRlID0gQXN5bmNNb2RpZmllci5Bc3luYzsKICAgICAgfQogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnc3luYycsIG5leHQpKSB7CiAgICAgIGFzeW5jID0gdG9rZW4gPSBuZXh0OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCcqJywgbmV4dCkpIHsKICAgICAgICBhc3luY1N0YXRlID0gQXN5bmNNb2RpZmllci5TeW5jU3RhcjsKICAgICAgICBzdGFyID0gbmV4dDsKICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihhc3luYywgZmFzdGEubWVzc2FnZUludmFsaWRTeW5jTW9kaWZpZXIpOwogICAgICB9CiAgICB9CiAgICBsaXN0ZW5lci5oYW5kbGVBc3luY01vZGlmaWVyKGFzeW5jLCBzdGFyKTsKICAgIGlmICghaW5QbGFpblN5bmMgJiYgb3B0aW9uYWwoJzsnLCB0b2tlbi5uZXh0KSkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLm5leHQsIGZhc3RhLm1lc3NhZ2VBYnN0cmFjdE5vdFN5bmMpOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgaW50IHN0YXRlbWVudERlcHRoID0gMDsKICBUb2tlbiBwYXJzZVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgaWYgKHN0YXRlbWVudERlcHRoKysgPiA1MDApIHsKICAgICAgLy8gVGhpcyBoYXBwZW5zIGZvciBkZWdlbmVyYXRlIHByb2dyYW1zLCBmb3IgZXhhbXBsZSwgYSBsb3Qgb2YgbmVzdGVkCiAgICAgIC8vIGlmLXN0YXRlbWVudHMuIFRoZSBsYW5ndWFnZSB0ZXN0IGRlZXBfbmVzdGluZzJfbmVnYXRpdmVfdGVzdCwgZm9yCiAgICAgIC8vIGV4YW1wbGUsIHByb3Zva2VzIHRoaXMuCiAgICAgIHJldHVybiByZWNvdmVyRnJvbVN0YWNrT3ZlcmZsb3codG9rZW4pOwogICAgfQogICAgVG9rZW4gcmVzdWx0ID0gcGFyc2VTdGF0ZW1lbnRYKHRva2VuKTsKICAgIHN0YXRlbWVudERlcHRoLS07CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgVG9rZW4gcGFyc2VTdGF0ZW1lbnRYKFRva2VuIHRva2VuKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRva2VuLm5leHQua2luZCwgSURFTlRJRklFUl9UT0tFTikpIHsKICAgICAgaWYgKG9wdGlvbmFsKCc6JywgdG9rZW4ubmV4dC5uZXh0KSkgewogICAgICAgIHJldHVybiBwYXJzZUxhYmVsZWRTdGF0ZW1lbnQodG9rZW4pOwogICAgICB9CiAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uQWZ0ZXJNb2RpZmllcnMoCiAgICAgICAgICB0b2tlbiwgdG9rZW4sIG51bGwsIG51bGwsIG51bGwsIGZhbHNlKTsKICAgIH0KICAgIGZpbmFsIHZhbHVlID0gdG9rZW4ubmV4dC5zdHJpbmdWYWx1ZTsKICAgIGlmIChpZGVudGljYWwodmFsdWUsICd7JykpIHsKICAgICAgLy8gVGhlIHNjYW5uZXIgZW5zdXJlcyB0aGF0IGB7YCBhbHdheXMgaGFzIGEgY2xvc2luZyBgfWAuCiAgICAgIHJldHVybiBwYXJzZUJsb2NrKHRva2VuLCBudWxsKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAncmV0dXJuJykpIHsKICAgICAgcmV0dXJuIHBhcnNlUmV0dXJuU3RhdGVtZW50KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAndmFyJykgfHwgaWRlbnRpY2FsKHZhbHVlLCAnZmluYWwnKSkgewogICAgICBUb2tlbiB2YXJPckZpbmFsID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKCFpc01vZGlmaWVyKHZhck9yRmluYWwubmV4dCkpIHsKICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbkFmdGVyTW9kaWZpZXJzKAogICAgICAgICAgICB2YXJPckZpbmFsLCB0b2tlbiwgbnVsbCwgdmFyT3JGaW5hbCwgbnVsbCwgZmFsc2UpOwogICAgICB9CiAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uKHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnbGF0ZScpKSB7CiAgICAgIFRva2VuIGxhdGVUb2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIGlmICghaXNNb2RpZmllcihsYXRlVG9rZW4ubmV4dCkpIHsKICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbkFmdGVyTW9kaWZpZXJzKAogICAgICAgICAgICBsYXRlVG9rZW4sIHRva2VuLCBsYXRlVG9rZW4sIG51bGwsIG51bGwsIGZhbHNlKTsKICAgICAgfQogICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbih0b2tlbik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2lmJykpIHsKICAgICAgcmV0dXJuIHBhcnNlSWZTdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdhd2FpdCcpICYmIG9wdGlvbmFsKCdmb3InLCB0b2tlbi5uZXh0Lm5leHQpKSB7CiAgICAgIHJldHVybiBwYXJzZUZvclN0YXRlbWVudCh0b2tlbi5uZXh0LCB0b2tlbi5uZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnZm9yJykpIHsKICAgICAgcmV0dXJuIHBhcnNlRm9yU3RhdGVtZW50KHRva2VuLCBudWxsKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAncmV0aHJvdycpKSB7CiAgICAgIHJldHVybiBwYXJzZVJldGhyb3dTdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICd3aGlsZScpKSB7CiAgICAgIHJldHVybiBwYXJzZVdoaWxlU3RhdGVtZW50KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnZG8nKSkgewogICAgICByZXR1cm4gcGFyc2VEb1doaWxlU3RhdGVtZW50KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAndHJ5JykpIHsKICAgICAgcmV0dXJuIHBhcnNlVHJ5U3RhdGVtZW50KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnc3dpdGNoJykpIHsKICAgICAgcmV0dXJuIHBhcnNlU3dpdGNoU3RhdGVtZW50KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnYnJlYWsnKSkgewogICAgICByZXR1cm4gcGFyc2VCcmVha1N0YXRlbWVudCh0b2tlbik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2NvbnRpbnVlJykpIHsKICAgICAgcmV0dXJuIHBhcnNlQ29udGludWVTdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdhc3NlcnQnKSkgewogICAgICByZXR1cm4gcGFyc2VBc3NlcnRTdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICc7JykpIHsKICAgICAgcmV0dXJuIHBhcnNlRW1wdHlTdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICd5aWVsZCcpKSB7CiAgICAgIHN3aXRjaCAoYXN5bmNTdGF0ZSkgewogICAgICAgIGNhc2UgQXN5bmNNb2RpZmllci5TeW5jOgogICAgICAgICAgaWYgKG9wdGlvbmFsKCc6JywgdG9rZW4ubmV4dC5uZXh0KSkgewogICAgICAgICAgICByZXR1cm4gcGFyc2VMYWJlbGVkU3RhdGVtZW50KHRva2VuKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uKHRva2VuKTsKCiAgICAgICAgY2FzZSBBc3luY01vZGlmaWVyLlN5bmNTdGFyOgogICAgICAgIGNhc2UgQXN5bmNNb2RpZmllci5Bc3luY1N0YXI6CiAgICAgICAgICByZXR1cm4gcGFyc2VZaWVsZFN0YXRlbWVudCh0b2tlbik7CgogICAgICAgIGNhc2UgQXN5bmNNb2RpZmllci5Bc3luYzoKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4ubmV4dCwgZmFzdGEubWVzc2FnZVlpZWxkTm90R2VuZXJhdG9yKTsKICAgICAgICAgIHJldHVybiBwYXJzZVlpZWxkU3RhdGVtZW50KHRva2VuKTsKICAgICAgfQogICAgICB0aHJvdyAiSW50ZXJuYWwgZXJyb3I6IFVua25vd24gYXN5bmNTdGF0ZTogJyRhc3luY1N0YXRlJy4iOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdjb25zdCcpKSB7CiAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckNvbnN0RGVjbGFyYXRpb24odG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdhd2FpdCcpKSB7CiAgICAgIGlmIChpblBsYWluU3luYykgewogICAgICAgIGlmICghbG9va3NMaWtlQXdhaXRFeHByZXNzaW9uKHRva2VuKSkgewogICAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb24odG9rZW4pOwogICAgICAgIH0KICAgICAgICAvLyBSZWNvdmVyeTogbG9va3MgbGlrZSBhbiBleHByZXNzaW9uIHByZWNlZGVkIGJ5IGBhd2FpdGAKICAgICAgICAvLyBidXQgbm90IGluc2lkZSBhbiBhc3luYyBjb250ZXh0LgogICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQKICAgICAgICAvLyBhbmQgcGFyc2VBd2FpdEV4cHJlc3Npb24gd2lsbCByZXBvcnQgdGhlIGVycm9yLgogICAgICB9CiAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdzZXQnKSAmJiB0b2tlbi5uZXh0Lm5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgIC8vIFJlY292ZXJ5OiBpbnZhbGlkIHVzZSBvZiBgc2V0YAogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgdG9rZW4ubmV4dCwgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgICByZXR1cm4gcGFyc2VTdGF0ZW1lbnRYKHRva2VuLm5leHQpOwogICAgfSBlbHNlIGlmICh0b2tlbi5uZXh0LmlzSWRlbnRpZmllcikgewogICAgICBpZiAob3B0aW9uYWwoJzonLCB0b2tlbi5uZXh0Lm5leHQpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlTGFiZWxlZFN0YXRlbWVudCh0b2tlbik7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb24odG9rZW4pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb24odG9rZW4pOwogICAgfQogIH0KCiAgLy8vIGBgYAogIC8vLyB5aWVsZFN0YXRlbWVudDoKICAvLy8gICAneWllbGQnIGV4cHJlc3Npb24/ICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlWWllbGRTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGJlZ2luID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCd5aWVsZCcsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5iZWdpbllpZWxkU3RhdGVtZW50KGJlZ2luKTsKICAgIFRva2VuIHN0YXJUb2tlbjsKICAgIGlmIChvcHRpb25hbCgnKicsIHRva2VuLm5leHQpKSB7CiAgICAgIHN0YXJUb2tlbiA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKHRva2VuKTsKICAgIHRva2VuID0gZW5zdXJlU2VtaWNvbG9uKHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZFlpZWxkU3RhdGVtZW50KGJlZ2luLCBzdGFyVG9rZW4sIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gcmV0dXJuU3RhdGVtZW50OgogIC8vLyAgICdyZXR1cm4nIGV4cHJlc3Npb24/ICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlUmV0dXJuU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBiZWdpbiA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgncmV0dXJuJywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luUmV0dXJuU3RhdGVtZW50KGJlZ2luKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCc7JywgbmV4dCkpIHsKICAgICAgbGlzdGVuZXIuZW5kUmV0dXJuU3RhdGVtZW50KGZhbHNlLCBiZWdpbiwgbmV4dCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgbGlzdGVuZXIuZW5kUmV0dXJuU3RhdGVtZW50KHRydWUsIGJlZ2luLCB0b2tlbik7CiAgICBpZiAoaW5HZW5lcmF0b3IpIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlSW52YWxpZFN0YXRlbWVudCgKICAgICAgICAgIGJlZ2luLCBmYXN0YS5tZXNzYWdlR2VuZXJhdG9yUmV0dXJuc1ZhbHVlKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gbGFiZWw6CiAgLy8vICAgaWRlbnRpZmllciAnOicKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUxhYmVsKFRva2VuIHRva2VuKSB7CiAgICBhc3NlcnQodG9rZW4ubmV4dC5pc0lkZW50aWZpZXIpOwogICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5sYWJlbERlY2xhcmF0aW9uKS5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc6JywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmhhbmRsZUxhYmVsKHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gc3RhdGVtZW50OgogIC8vLyAgIGxhYmVsKiBub25MYWJlbGxlZFN0YXRlbWVudAogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlTGFiZWxlZFN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQobmV4dC5pc0lkZW50aWZpZXIpOwogICAgYXNzZXJ0KG9wdGlvbmFsKCc6JywgbmV4dC5uZXh0KSk7CiAgICBpbnQgbGFiZWxDb3VudCA9IDA7CiAgICBkbyB7CiAgICAgIHRva2VuID0gcGFyc2VMYWJlbCh0b2tlbik7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBsYWJlbENvdW50Kys7CiAgICB9IHdoaWxlIChuZXh0LmlzSWRlbnRpZmllciAmJiBvcHRpb25hbCgnOicsIG5leHQubmV4dCkpOwogICAgbGlzdGVuZXIuYmVnaW5MYWJlbGVkU3RhdGVtZW50KG5leHQsIGxhYmVsQ291bnQpOwogICAgdG9rZW4gPSBwYXJzZVN0YXRlbWVudCh0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRMYWJlbGVkU3RhdGVtZW50KGxhYmVsQ291bnQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBleHByZXNzaW9uU3RhdGVtZW50OgogIC8vLyAgIGV4cHJlc3Npb24/ICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIC8vLwogIC8vLyBOb3RlOiBUaGlzIG1ldGhvZCBjYW4gZmFpbCB0byBtYWtlIHByb2dyZXNzLiBJZiB0aGVyZSBpcyBuZWl0aGVyIGFuCiAgLy8vIGV4cHJlc3Npb24gbm9yIGEgc2VtaS1jb2xvbiwgdGhlbiBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIGFuZCBzeW50aGV0aWMKICAvLy8gc2VtaWNvbG9uIHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIFt0b2tlbl0gYW5kIHRoZSBzZW1pY29sb24gd2lsbCBiZQogIC8vLyByZXR1cm5lZC4KICBUb2tlbiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pOiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBub3QgdGhlIHN0YXJ0IG9mIGEgdmFsaWQKICAgIC8vIGV4cHJlc3Npb24sIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkbid0IHJlcG9ydCB0aGF0IHdlIGhhdmUgYW4gZXhwcmVzc2lvbgogICAgLy8gc3RhdGVtZW50LgogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlRXhwcmVzc2lvblN0YXRlbWVudCh0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBpbnQgZXhwcmVzc2lvbkRlcHRoID0gMDsKICBUb2tlbiBwYXJzZUV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGlmIChleHByZXNzaW9uRGVwdGgrKyA+IDUwMCkgewogICAgICAvLyBUaGlzIGhhcHBlbnMgaW4gZGVnZW5lcmF0ZSBwcm9ncmFtcywgZm9yIGV4YW1wbGUsIHdpdGggYSBsb3Qgb2YgbmVzdGVkCiAgICAgIC8vIGxpc3QgbGl0ZXJhbHMuIFRoaXMgaXMgcHJvdm9rZWQgYnksIGZvciBleGFtcGxlLCB0aGUgbGFuZ3VhZ2UgdGVzdAogICAgICAvLyBkZWVwX25lc3RpbmcxX25lZ2F0aXZlX3Rlc3QuCiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VTdGFja092ZXJmbG93KTsKCiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIFRva2VuIGVuZEdyb3VwID0gbmV4dC5lbmRHcm91cDsKICAgICAgaWYgKGVuZEdyb3VwICE9IG51bGwpIHsKICAgICAgICB3aGlsZSAoIW5leHQuaXNFb2YgJiYgIWlkZW50aWNhbChuZXh0LCBlbmRHcm91cCkpIHsKICAgICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoIWlzT25lT2YobmV4dCwgY29uc3QgWycpJywgJ10nLCAnfScsICc7J10pKSB7CiAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCF0b2tlbi5pc0VvZikgewogICAgICAgIHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbik7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQuZXhwcmVzc2lvbik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRva2VuID0gb3B0aW9uYWwoJ3Rocm93JywgdG9rZW4ubmV4dCkKICAgICAgICAgID8gcGFyc2VUaHJvd0V4cHJlc3Npb24odG9rZW4sIHRydWUpCiAgICAgICAgICA6IHBhcnNlUHJlY2VkZW5jZUV4cHJlc3Npb24odG9rZW4sIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgdHJ1ZSk7CiAgICB9CiAgICBleHByZXNzaW9uRGVwdGgtLTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlRXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gb3B0aW9uYWwoJ3Rocm93JywgdG9rZW4ubmV4dCkKICAgICAgICA/IHBhcnNlVGhyb3dFeHByZXNzaW9uKHRva2VuLCBmYWxzZSkKICAgICAgICA6IHBhcnNlUHJlY2VkZW5jZUV4cHJlc3Npb24odG9rZW4sIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgZmFsc2UpOwogIH0KCiAgVG9rZW4gcGFyc2VDb25kaXRpb25hbEV4cHJlc3Npb25SZXN0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBxdWVzdGlvbiA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPycsIHF1ZXN0aW9uKSk7CiAgICBsaXN0ZW5lci5iZWdpbkNvbmRpdGlvbmFsRXhwcmVzc2lvbih0b2tlbik7CiAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlKHRva2VuKTsKICAgIFRva2VuIGNvbG9uID0gZW5zdXJlQ29sb24odG9rZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlQ29uZGl0aW9uYWxFeHByZXNzaW9uQ29sb24oKTsKICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uV2l0aG91dENhc2NhZGUoY29sb24pOwogICAgbGlzdGVuZXIuZW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uKHF1ZXN0aW9uLCBjb2xvbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZVByZWNlZGVuY2VFeHByZXNzaW9uKAogICAgICBUb2tlbiB0b2tlbiwgaW50IHByZWNlZGVuY2UsIGJvb2wgYWxsb3dDYXNjYWRlcykgewogICAgYXNzZXJ0KHByZWNlZGVuY2UgPj0gMSk7CiAgICBhc3NlcnQocHJlY2VkZW5jZSA8PSBTRUxFQ1RPUl9QUkVDRURFTkNFKTsKICAgIHRva2VuID0gcGFyc2VVbmFyeUV4cHJlc3Npb24odG9rZW4sIGFsbG93Q2FzY2FkZXMpOwogICAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVBcmcgPSBjb21wdXRlTWV0aG9kVHlwZUFyZ3VtZW50cyh0b2tlbik7CiAgICBpZiAodHlwZUFyZyAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgIC8vIEZvciBleGFtcGxlIGEoYik8VD4oYyksIHdoZXJlIHRva2VuIGlzIGJlZm9yZSAnPCcuCiAgICAgIHRva2VuID0gdHlwZUFyZy5wYXJzZUFyZ3VtZW50cyh0b2tlbiwgdGhpcyk7CiAgICAgIGFzc2VydChvcHRpb25hbCgnKCcsIHRva2VuLm5leHQpKTsKICAgIH0KICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgVG9rZW5UeXBlIHR5cGUgPSBuZXh0LnR5cGU7CiAgICBpbnQgdG9rZW5MZXZlbCA9IF9jb21wdXRlUHJlY2VkZW5jZShuZXh0KTsKICAgIGZvciAoaW50IGxldmVsID0gdG9rZW5MZXZlbDsgbGV2ZWwgPj0gcHJlY2VkZW5jZTsgLS1sZXZlbCkgewogICAgICBpbnQgbGFzdEJpbmFyeUV4cHJlc3Npb25MZXZlbCA9IC0xOwogICAgICB3aGlsZSAoaWRlbnRpY2FsKHRva2VuTGV2ZWwsIGxldmVsKSkgewogICAgICAgIFRva2VuIG9wZXJhdG9yID0gbmV4dDsKICAgICAgICBpZiAoaWRlbnRpY2FsKHRva2VuTGV2ZWwsIENBU0NBREVfUFJFQ0VERU5DRSkpIHsKICAgICAgICAgIGlmICghYWxsb3dDYXNjYWRlcykgewogICAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgICB9CiAgICAgICAgICB0b2tlbiA9IHBhcnNlQ2FzY2FkZUV4cHJlc3Npb24odG9rZW4pOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHRva2VuTGV2ZWwsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSkpIHsKICAgICAgICAgIC8vIFJpZ2h0IGFzc29jaWF0aXZlLCBzbyB3ZSByZWN1cnNlIGF0IHRoZSBzYW1lIHByZWNlZGVuY2UKICAgICAgICAgIC8vIGxldmVsLgogICAgICAgICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICB0b2tlbiA9IG9wdGlvbmFsKCd0aHJvdycsIG5leHQubmV4dCkKICAgICAgICAgICAgICA/IHBhcnNlVGhyb3dFeHByZXNzaW9uKG5leHQsIGZhbHNlKQogICAgICAgICAgICAgIDogcGFyc2VQcmVjZWRlbmNlRXhwcmVzc2lvbihuZXh0LCBsZXZlbCwgYWxsb3dDYXNjYWRlcyk7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVBc3NpZ25tZW50RXhwcmVzc2lvbihvcGVyYXRvcik7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodG9rZW5MZXZlbCwgUE9TVEZJWF9QUkVDRURFTkNFKSkgewogICAgICAgICAgaWYgKChpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLlBMVVNfUExVUykpIHx8CiAgICAgICAgICAgICAgKGlkZW50aWNhbCh0eXBlLCBUb2tlblR5cGUuTUlOVVNfTUlOVVMpKSkgewogICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVVbmFyeVBvc3RmaXhBc3NpZ25tZW50RXhwcmVzc2lvbih0b2tlbi5uZXh0KTsKICAgICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLkJBTkcpKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZU5vbk51bGxBc3NlcnRFeHByZXNzaW9uKHRva2VuLm5leHQpOwogICAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodG9rZW5MZXZlbCwgU0VMRUNUT1JfUFJFQ0VERU5DRSkpIHsKICAgICAgICAgIGlmIChpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLlBFUklPRCkgfHwKICAgICAgICAgICAgICBpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLlFVRVNUSU9OX1BFUklPRCkpIHsKICAgICAgICAgICAgLy8gTGVmdCBhc3NvY2lhdGl2ZSwgc28gd2UgcmVjdXJzZSBhdCB0aGUgbmV4dCBoaWdoZXIgcHJlY2VkZW5jZQogICAgICAgICAgICAvLyBsZXZlbC4gSG93ZXZlciwgU0VMRUNUT1JfUFJFQ0VERU5DRSBpcyB0aGUgaGlnaGVzdCBsZXZlbCwgc28gd2UKICAgICAgICAgICAgLy8gc2hvdWxkIGp1c3QgY2FsbCBbcGFyc2VVbmFyeUV4cHJlc3Npb25dIGRpcmVjdGx5LiBIb3dldmVyLCBhCiAgICAgICAgICAgIC8vIHVuYXJ5IGV4cHJlc3Npb24gaXNuJ3QgbGVnYWwgYWZ0ZXIgYSBwZXJpb2QsIHNvIHdlIGNhbGwKICAgICAgICAgICAgLy8gW3BhcnNlUHJpbWFyeV0gaW5zdGVhZC4KICAgICAgICAgICAgdG9rZW4gPSBwYXJzZVByaW1hcnkoCiAgICAgICAgICAgICAgICB0b2tlbi5uZXh0LCBJZGVudGlmaWVyQ29udGV4dC5leHByZXNzaW9uQ29udGludWF0aW9uKTsKICAgICAgICAgICAgbGlzdGVuZXIuZW5kQmluYXJ5RXhwcmVzc2lvbihvcGVyYXRvcik7CiAgICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh0eXBlLCBUb2tlblR5cGUuT1BFTl9QQVJFTikgfHwKICAgICAgICAgICAgICBpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLk9QRU5fU1FVQVJFX0JSQUNLRVQpIHx8CiAgICAgICAgICAgICAgaWRlbnRpY2FsKHR5cGUsIFRva2VuVHlwZS5RVUVTVElPTl9QRVJJT0RfT1BFTl9TUVVBUkVfQlJBQ0tFVCkpIHsKICAgICAgICAgICAgdG9rZW4gPSBwYXJzZUFyZ3VtZW50T3JJbmRleFN0YXIodG9rZW4sIHR5cGVBcmcpOwogICAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLklOREVYKSkgewogICAgICAgICAgICBCZWdpblRva2VuIHJlcGxhY2VtZW50ID0gbGluaygKICAgICAgICAgICAgICAgIG5ldyBCZWdpblRva2VuKFRva2VuVHlwZS5PUEVOX1NRVUFSRV9CUkFDS0VULCBuZXh0LmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgbmV4dC5wcmVjZWRpbmdDb21tZW50cyksCiAgICAgICAgICAgICAgICBuZXcgVG9rZW4oVG9rZW5UeXBlLkNMT1NFX1NRVUFSRV9CUkFDS0VULCBuZXh0LmNoYXJPZmZzZXQgKyAxKSk7CiAgICAgICAgICAgIHJld3JpdGVyLnJlcGxhY2VUb2tlbkZvbGxvd2luZyh0b2tlbiwgcmVwbGFjZW1lbnQpOwogICAgICAgICAgICByZXBsYWNlbWVudC5lbmRUb2tlbiA9IHJlcGxhY2VtZW50Lm5leHQ7CiAgICAgICAgICAgIHRva2VuID0gcGFyc2VBcmd1bWVudE9ySW5kZXhTdGFyKHRva2VuLCBub1R5cGVQYXJhbU9yQXJnKTsKICAgICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHR5cGUsIFRva2VuVHlwZS5CQU5HKSkgewogICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVOb25OdWxsQXNzZXJ0RXhwcmVzc2lvbih0b2tlbi5uZXh0KTsKICAgICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgICAgIHRva2VuLm5leHQsIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHR5cGUsIFRva2VuVHlwZS5JUykpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VJc09wZXJhdG9yUmVzdCh0b2tlbik7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLkFTKSkgewogICAgICAgICAgdG9rZW4gPSBwYXJzZUFzT3BlcmF0b3JSZXN0KHRva2VuKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh0eXBlLCBUb2tlblR5cGUuUVVFU1RJT04pKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlQ29uZGl0aW9uYWxFeHByZXNzaW9uUmVzdCh0b2tlbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChsZXZlbCA9PSBFUVVBTElUWV9QUkVDRURFTkNFIHx8IGxldmVsID09IFJFTEFUSU9OQUxfUFJFQ0VERU5DRSkgewogICAgICAgICAgICAvLyBXZSBkb24ndCBhbGxvdyAoYSA9PSBiID09IGMpIG9yIChhIDwgYiA8IGMpLgogICAgICAgICAgICBpZiAobGFzdEJpbmFyeUV4cHJlc3Npb25MZXZlbCA9PSBsZXZlbCkgewogICAgICAgICAgICAgIC8vIFJlcG9ydCBhbiBlcnJvciwgdGhlbiBjb250aW51ZSBwYXJzaW5nIGFzIGlmIGl0IGlzIGxlZ2FsLgogICAgICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgICAgIG5leHQsIGZhc3RhLm1lc3NhZ2VFcXVhbGl0eUNhbm5vdEJlRXF1YWxpdHlPcGVyYW5kKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBTZXQgYSBmbGFnIHRvIGNhdGNoIHN1YnNlcXVlbnQgYmluYXJ5IGV4cHJlc3Npb25zIG9mIHRoaXMgdHlwZS4KICAgICAgICAgICAgICBsYXN0QmluYXJ5RXhwcmVzc2lvbkxldmVsID0gbGV2ZWw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxpc3RlbmVyLmJlZ2luQmluYXJ5RXhwcmVzc2lvbihuZXh0KTsKICAgICAgICAgIC8vIExlZnQgYXNzb2NpYXRpdmUsIHNvIHdlIHJlY3Vyc2UgYXQgdGhlIG5leHQgaGlnaGVyCiAgICAgICAgICAvLyBwcmVjZWRlbmNlIGxldmVsLgogICAgICAgICAgdG9rZW4gPQogICAgICAgICAgICAgIHBhcnNlUHJlY2VkZW5jZUV4cHJlc3Npb24odG9rZW4ubmV4dCwgbGV2ZWwgKyAxLCBhbGxvd0Nhc2NhZGVzKTsKICAgICAgICAgIGxpc3RlbmVyLmVuZEJpbmFyeUV4cHJlc3Npb24ob3BlcmF0b3IpOwogICAgICAgIH0KICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICB0eXBlID0gbmV4dC50eXBlOwogICAgICAgIHRva2VuTGV2ZWwgPSBfY29tcHV0ZVByZWNlZGVuY2UobmV4dCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIGludCBfY29tcHV0ZVByZWNlZGVuY2UoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuVHlwZSB0eXBlID0gdG9rZW4udHlwZTsKICAgIGlmIChpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLkJBTkcpKSB7CiAgICAgIC8vIFRoZSAnIScgaGFzIHByZWZpeCBwcmVjZWRlbmNlIGJ1dCBoZXJlIGl0J3MgYmVpbmcgdXNlZCBhcyBhCiAgICAgIC8vIHBvc3RmaXggb3BlcmF0b3IgdG8gYXNzZXJ0IHRoZSBleHByZXNzaW9uIGhhcyBhIG5vbi1udWxsIHZhbHVlLgogICAgICBpZiAoaWRlbnRpY2FsKHRva2VuLm5leHQudHlwZSwgVG9rZW5UeXBlLlBFUklPRCkpIHsKICAgICAgICByZXR1cm4gU0VMRUNUT1JfUFJFQ0VERU5DRTsKICAgICAgfQogICAgICByZXR1cm4gUE9TVEZJWF9QUkVDRURFTkNFOwogICAgfQogICAgcmV0dXJuIHR5cGUucHJlY2VkZW5jZTsKICB9CgogIFRva2VuIHBhcnNlQ2FzY2FkZUV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGNhc2NhZGVPcGVyYXRvciA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnLi4nLCBjYXNjYWRlT3BlcmF0b3IpKTsKICAgIGxpc3RlbmVyLmJlZ2luQ2FzY2FkZShjYXNjYWRlT3BlcmF0b3IpOwogICAgaWYgKG9wdGlvbmFsKCdbJywgdG9rZW4ubmV4dCkpIHsKICAgICAgdG9rZW4gPSBwYXJzZUFyZ3VtZW50T3JJbmRleFN0YXIodG9rZW4sIG5vVHlwZVBhcmFtT3JBcmcpOwogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSBwYXJzZVNlbmQodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmV4cHJlc3Npb25Db250aW51YXRpb24pOwogICAgICBsaXN0ZW5lci5lbmRCaW5hcnlFeHByZXNzaW9uKGNhc2NhZGVPcGVyYXRvcik7CiAgICB9CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIFRva2VuIG1hcms7CiAgICBkbyB7CiAgICAgIG1hcmsgPSB0b2tlbjsKICAgICAgaWYgKG9wdGlvbmFsKCcuJywgbmV4dCkgfHwgb3B0aW9uYWwoJz8uJywgbmV4dCkpIHsKICAgICAgICBUb2tlbiBwZXJpb2QgPSBuZXh0OwogICAgICAgIHRva2VuID0gcGFyc2VTZW5kKG5leHQsIElkZW50aWZpZXJDb250ZXh0LmV4cHJlc3Npb25Db250aW51YXRpb24pOwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIGxpc3RlbmVyLmVuZEJpbmFyeUV4cHJlc3Npb24ocGVyaW9kKTsKICAgICAgfQogICAgICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZUFyZyA9IGNvbXB1dGVNZXRob2RUeXBlQXJndW1lbnRzKHRva2VuKTsKICAgICAgaWYgKHR5cGVBcmcgIT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgICAgIC8vIEZvciBleGFtcGxlIGEoYikuLjxUPihjKSwgd2hlcmUgdG9rZW4gaXMgJzwnLgogICAgICAgIHRva2VuID0gdHlwZUFyZy5wYXJzZUFyZ3VtZW50cyh0b2tlbiwgdGhpcyk7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgbmV4dCkpOwogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VBcmd1bWVudE9ySW5kZXhTdGFyKHRva2VuLCB0eXBlQXJnKTsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9IHdoaWxlICghaWRlbnRpY2FsKG1hcmssIHRva2VuKSk7CgogICAgaWYgKGlkZW50aWNhbChuZXh0LnR5cGUucHJlY2VkZW5jZSwgQVNTSUdOTUVOVF9QUkVDRURFTkNFKSkgewogICAgICBUb2tlbiBhc3NpZ25tZW50ID0gbmV4dDsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb25XaXRob3V0Q2FzY2FkZShuZXh0KTsKICAgICAgbGlzdGVuZXIuaGFuZGxlQXNzaWdubWVudEV4cHJlc3Npb24oYXNzaWdubWVudCk7CiAgICB9CiAgICBsaXN0ZW5lci5lbmRDYXNjYWRlKCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZVVuYXJ5RXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgYm9vbCBhbGxvd0Nhc2NhZGVzKSB7CiAgICBTdHJpbmcgdmFsdWUgPSB0b2tlbi5uZXh0LnN0cmluZ1ZhbHVlOwogICAgLy8gUHJlZml4OgogICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2F3YWl0JykpIHsKICAgICAgaWYgKGluUGxhaW5TeW5jKSB7CiAgICAgICAgaWYgKCFsb29rc0xpa2VBd2FpdEV4cHJlc3Npb24odG9rZW4pKSB7CiAgICAgICAgICByZXR1cm4gcGFyc2VQcmltYXJ5KHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5leHByZXNzaW9uKTsKICAgICAgICB9CiAgICAgICAgLy8gUmVjb3Zlcnk6IExvb2tzIGxpa2UgYW4gZXhwcmVzc2lvbiBwcmVjZWRlZCBieSBgYXdhaXRgLgogICAgICAgIC8vIEZhbGwgdGhyb3VnaCBhbmQgbGV0IHBhcnNlQXdhaXRFeHByZXNzaW9uIHJlcG9ydCB0aGUgZXJyb3IuCiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnNlQXdhaXRFeHByZXNzaW9uKHRva2VuLCBhbGxvd0Nhc2NhZGVzKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnKycpKSB7CiAgICAgIC8vIERhcnQgbm8gbG9uZ2VyIGFsbG93cyBwcmVmaXgtcGx1cy4KICAgICAgcmV3cml0ZUFuZFJlY292ZXIoCiAgICAgICAgICB0b2tlbiwKICAgICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciByZXBvcnRpbmcgIm1pc3NpbmcgaWRlbnRpZmllciIgaW5zdGVhZC4KICAgICAgICAgIGZhc3RhLm1lc3NhZ2VVbnN1cHBvcnRlZFByZWZpeFBsdXMsCiAgICAgICAgICBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4oCiAgICAgICAgICAgICAgVG9rZW5UeXBlLklERU5USUZJRVIsICcnLCB0b2tlbi5uZXh0Lm9mZnNldCkpOwogICAgICByZXR1cm4gcGFyc2VQcmltYXJ5KHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5leHByZXNzaW9uKTsKICAgIH0gZWxzZSBpZiAoKGlkZW50aWNhbCh2YWx1ZSwgJyEnKSkgfHwKICAgICAgICAoaWRlbnRpY2FsKHZhbHVlLCAnLScpKSB8fAogICAgICAgIChpZGVudGljYWwodmFsdWUsICd+JykpKSB7CiAgICAgIFRva2VuIG9wZXJhdG9yID0gdG9rZW4ubmV4dDsKICAgICAgLy8gUmlnaHQgYXNzb2NpYXRpdmUsIHNvIHdlIHJlY3Vyc2UgYXQgdGhlIHNhbWUgcHJlY2VkZW5jZQogICAgICAvLyBsZXZlbC4KICAgICAgdG9rZW4gPSBwYXJzZVByZWNlZGVuY2VFeHByZXNzaW9uKAogICAgICAgICAgdG9rZW4ubmV4dCwgUE9TVEZJWF9QUkVDRURFTkNFLCBhbGxvd0Nhc2NhZGVzKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlVW5hcnlQcmVmaXhFeHByZXNzaW9uKG9wZXJhdG9yKTsKICAgICAgcmV0dXJuIHRva2VuOwogICAgfSBlbHNlIGlmICgoaWRlbnRpY2FsKHZhbHVlLCAnKysnKSkgfHwgaWRlbnRpY2FsKHZhbHVlLCAnLS0nKSkgewogICAgICAvLyBUT0RPKGFoZSk6IFZhbGlkYXRlIHRoaXMgaXMgdXNlZCBjb3JyZWN0bHkuCiAgICAgIFRva2VuIG9wZXJhdG9yID0gdG9rZW4ubmV4dDsKICAgICAgLy8gUmlnaHQgYXNzb2NpYXRpdmUsIHNvIHdlIHJlY3Vyc2UgYXQgdGhlIHNhbWUgcHJlY2VkZW5jZQogICAgICAvLyBsZXZlbC4KICAgICAgdG9rZW4gPSBwYXJzZVByZWNlZGVuY2VFeHByZXNzaW9uKAogICAgICAgICAgdG9rZW4ubmV4dCwgUE9TVEZJWF9QUkVDRURFTkNFLCBhbGxvd0Nhc2NhZGVzKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlVW5hcnlQcmVmaXhBc3NpZ25tZW50RXhwcmVzc2lvbihvcGVyYXRvcik7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0gZWxzZSBpZiAodG9rZW4ubmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgiLiIsIGlkZW50aWZpZXIubmV4dCkpIHsKICAgICAgICBpZGVudGlmaWVyID0gaWRlbnRpZmllci5uZXh0Lm5leHQ7CiAgICAgIH0KICAgICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gTG9va2luZyBhdCBgaWRlbnRpZmllciAoJy4nIGlkZW50aWZpZXIpP2AuCiAgICAgICAgaWYgKG9wdGlvbmFsKCI8IiwgaWRlbnRpZmllci5uZXh0KSkgewogICAgICAgICAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVBcmcgPSBjb21wdXRlVHlwZVBhcmFtT3JBcmcoaWRlbnRpZmllcik7CiAgICAgICAgICBpZiAodHlwZUFyZyAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgICAgIFRva2VuIGVuZFR5cGVBcmd1bWVudHMgPSB0eXBlQXJnLnNraXAoaWRlbnRpZmllcik7CiAgICAgICAgICAgIGlmIChvcHRpb25hbCgiLiIsIGVuZFR5cGVBcmd1bWVudHMubmV4dCkpIHsKICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbXBsaWNpdENyZWF0aW9uRXhwcmVzc2lvbih0b2tlbiwgdHlwZUFyZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwYXJzZVByaW1hcnkodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmV4cHJlc3Npb24pOwogIH0KCiAgVG9rZW4gcGFyc2VBcmd1bWVudE9ySW5kZXhTdGFyKFRva2VuIHRva2VuLCBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZUFyZykgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBUb2tlbiBiZWdpblRva2VuID0gbmV4dDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChvcHRpb25hbCgnWycsIG5leHQpIHx8IG9wdGlvbmFsKCc/LlsnLCBuZXh0KSkgewogICAgICAgIGFzc2VydCh0eXBlQXJnID09IG5vVHlwZVBhcmFtT3JBcmcpOwogICAgICAgIFRva2VuIG9wZW5TcXVhcmVCcmFja2V0ID0gbmV4dDsKICAgICAgICBib29sIG9sZCA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgICAgICBtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMgPSB0cnVlOwogICAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKG5leHQpOwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgICAgICBpZiAoIW9wdGlvbmFsKCddJywgbmV4dCkpIHsKICAgICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnXScpKTsKICAgICAgICAgIC8vIFNjYW5uZXIgZW5zdXJlcyBhIGNsb3NpbmcgJ10nCiAgICAgICAgICBUb2tlbiBlbmRHcm91cCA9IG9wZW5TcXVhcmVCcmFja2V0LmVuZEdyb3VwOwogICAgICAgICAgaWYgKGVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgIC8vIFNjYW5uZXIgaW5zZXJ0ZWQgY2xvc2luZyAnXScgaW4gdGhlIHdyb25nIHBsYWNlLCBzbyBtb3ZlIGl0LgogICAgICAgICAgICBuZXh0ID0gcmV3cml0ZXIubW92ZVN5bnRoZXRpYyh0b2tlbiwgZW5kR3JvdXApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU2tpcCBvdmVyIHVuZXhwZWN0ZWQgdG9rZW5zIHRvIHdoZXJlIHRoZSB1c2VyIHBsYWNlZCB0aGUgYF1gLgogICAgICAgICAgICBuZXh0ID0gZW5kR3JvdXA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxpc3RlbmVyLmhhbmRsZUluZGV4ZWRFeHByZXNzaW9uKG9wZW5TcXVhcmVCcmFja2V0LCBuZXh0KTsKICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgdHlwZUFyZyA9IGNvbXB1dGVNZXRob2RUeXBlQXJndW1lbnRzKHRva2VuKTsKICAgICAgICBpZiAodHlwZUFyZyAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgICAvLyBGb3IgZXhhbXBsZSBhW2JdPFQ+KGMpLCB3aGVyZSB0b2tlbiBpcyBiZWZvcmUgJzwnLgogICAgICAgICAgdG9rZW4gPSB0eXBlQXJnLnBhcnNlQXJndW1lbnRzKHRva2VuLCB0aGlzKTsKICAgICAgICAgIGFzc2VydChvcHRpb25hbCgnKCcsIHRva2VuLm5leHQpKTsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICAgIGlmICh0eXBlQXJnID09IG5vVHlwZVBhcmFtT3JBcmcpIHsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZUFyZ3VtZW50cyhuZXh0KTsKICAgICAgICB9CiAgICAgICAgdG9rZW4gPSBwYXJzZUFyZ3VtZW50cyh0b2tlbik7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlU2VuZChiZWdpblRva2VuLCB0b2tlbik7CiAgICAgICAgdHlwZUFyZyA9IGNvbXB1dGVNZXRob2RUeXBlQXJndW1lbnRzKHRva2VuKTsKICAgICAgICBpZiAodHlwZUFyZyAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgICAvLyBGb3IgZXhhbXBsZSBhKGIpPFQ+KGMpLCB3aGVyZSB0b2tlbiBpcyBiZWZvcmUgJzwnLgogICAgICAgICAgdG9rZW4gPSB0eXBlQXJnLnBhcnNlQXJndW1lbnRzKHRva2VuLCB0aGlzKTsKICAgICAgICAgIGFzc2VydChvcHRpb25hbCgnKCcsIHRva2VuLm5leHQpKTsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlUHJpbWFyeShUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgZmluYWwga2luZCA9IHRva2VuLm5leHQua2luZDsKICAgIGlmIChraW5kID09IElERU5USUZJRVJfVE9LRU4pIHsKICAgICAgcmV0dXJuIHBhcnNlU2VuZE9yRnVuY3Rpb25MaXRlcmFsKHRva2VuLCBjb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBJTlRfVE9LRU4gfHwga2luZCA9PSBIRVhBREVDSU1BTF9UT0tFTikgewogICAgICByZXR1cm4gcGFyc2VMaXRlcmFsSW50KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBET1VCTEVfVE9LRU4pIHsKICAgICAgcmV0dXJuIHBhcnNlTGl0ZXJhbERvdWJsZSh0b2tlbik7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gU1RSSU5HX1RPS0VOKSB7CiAgICAgIHJldHVybiBwYXJzZUxpdGVyYWxTdHJpbmcodG9rZW4pOwogICAgfSBlbHNlIGlmIChraW5kID09IEhBU0hfVE9LRU4pIHsKICAgICAgcmV0dXJuIHBhcnNlTGl0ZXJhbFN5bWJvbCh0b2tlbik7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gS0VZV09SRF9UT0tFTikgewogICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSB0b2tlbi5uZXh0LnN0cmluZ1ZhbHVlOwogICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAidHJ1ZSIpIHx8IGlkZW50aWNhbCh2YWx1ZSwgImZhbHNlIikpIHsKICAgICAgICByZXR1cm4gcGFyc2VMaXRlcmFsQm9vbCh0b2tlbik7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAibnVsbCIpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlTGl0ZXJhbE51bGwodG9rZW4pOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgInRoaXMiKSkgewogICAgICAgIHJldHVybiBwYXJzZVRoaXNFeHByZXNzaW9uKHRva2VuLCBjb250ZXh0KTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICJzdXBlciIpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlU3VwZXJFeHByZXNzaW9uKHRva2VuLCBjb250ZXh0KTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICJuZXciKSkgewogICAgICAgIHJldHVybiBwYXJzZU5ld0V4cHJlc3Npb24odG9rZW4pOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgImNvbnN0IikpIHsKICAgICAgICByZXR1cm4gcGFyc2VDb25zdEV4cHJlc3Npb24odG9rZW4pOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgInZvaWQiKSkgewogICAgICAgIHJldHVybiBwYXJzZVNlbmRPckZ1bmN0aW9uTGl0ZXJhbCh0b2tlbiwgY29udGV4dCk7CiAgICAgIH0gZWxzZSBpZiAoIWluUGxhaW5TeW5jICYmCiAgICAgICAgICAoaWRlbnRpY2FsKHZhbHVlLCAieWllbGQiKSB8fCBpZGVudGljYWwodmFsdWUsICJhc3luYyIpKSkgewogICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byB0aGUgcmVjb3ZlcnkgY29kZS4KICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICJhc3NlcnQiKSkgewogICAgICAgIHJldHVybiBwYXJzZUFzc2VydCh0b2tlbiwgQXNzZXJ0LkV4cHJlc3Npb24pOwogICAgICB9IGVsc2UgaWYgKHRva2VuLm5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlU2VuZE9yRnVuY3Rpb25MaXRlcmFsKHRva2VuLCBjb250ZXh0KTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICJyZXR1cm4iKSkgewogICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4odG9rZW4sIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgICByZXR1cm4gcGFyc2VQcmltYXJ5KHRva2VuLCBjb250ZXh0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIHJlY292ZXJ5IGNvZGUuCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoa2luZCA9PSBPUEVOX1BBUkVOX1RPS0VOKSB7CiAgICAgIHJldHVybiBwYXJzZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uT3JGdW5jdGlvbkxpdGVyYWwodG9rZW4pOwogICAgfSBlbHNlIGlmIChraW5kID09IE9QRU5fU1FVQVJFX0JSQUNLRVRfVE9LRU4gfHwKICAgICAgICBvcHRpb25hbCgnW10nLCB0b2tlbi5uZXh0KSkgewogICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVBcmd1bWVudHModG9rZW4ubmV4dCk7CiAgICAgIHJldHVybiBwYXJzZUxpdGVyYWxMaXN0U3VmZml4KHRva2VuLCBudWxsKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBPUEVOX0NVUkxZX0JSQUNLRVRfVE9LRU4pIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlQXJndW1lbnRzKHRva2VuLm5leHQpOwogICAgICByZXR1cm4gcGFyc2VMaXRlcmFsU2V0T3JNYXBTdWZmaXgodG9rZW4sIG51bGwpOwogICAgfSBlbHNlIGlmIChraW5kID09IExUX1RPS0VOKSB7CiAgICAgIHJldHVybiBwYXJzZUxpdGVyYWxMaXN0U2V0TWFwT3JGdW5jdGlvbih0b2tlbiwgbnVsbCk7CiAgICB9IGVsc2UgewogICAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIHJlY292ZXJ5IGNvZGUuCiAgICB9CiAgICAvLwogICAgLy8gUmVjb3ZlcnkgY29kZS4KICAgIC8vCiAgICByZXR1cm4gcGFyc2VTZW5kKHRva2VuLCBjb250ZXh0KTsKICB9CgogIFRva2VuIHBhcnNlUGFyZW50aGVzaXplZEV4cHJlc3Npb25PckZ1bmN0aW9uTGl0ZXJhbChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJygnLCBuZXh0KSk7CiAgICBUb2tlbiBuZXh0VG9rZW4gPSBuZXh0LmVuZEdyb3VwLm5leHQ7CiAgICBpbnQga2luZCA9IG5leHRUb2tlbi5raW5kOwogICAgaWYgKG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucykgewogICAgICBpZiAoKGlkZW50aWNhbChraW5kLCBGVU5DVElPTl9UT0tFTikgfHwKICAgICAgICAgIGlkZW50aWNhbChraW5kLCBPUEVOX0NVUkxZX0JSQUNLRVRfVE9LRU4pKSkgewogICAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZVZhcmlhYmxlcyhuZXh0KTsKICAgICAgICByZXR1cm4gcGFyc2VGdW5jdGlvbkV4cHJlc3Npb24odG9rZW4pOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChraW5kLCBLRVlXT1JEX1RPS0VOKSB8fAogICAgICAgICAgaWRlbnRpY2FsKGtpbmQsIElERU5USUZJRVJfVE9LRU4pKSB7CiAgICAgICAgaWYgKG9wdGlvbmFsKCdhc3luYycsIG5leHRUb2tlbikgfHwgb3B0aW9uYWwoJ3N5bmMnLCBuZXh0VG9rZW4pKSB7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVWYXJpYWJsZXMobmV4dCk7CiAgICAgICAgICByZXR1cm4gcGFyc2VGdW5jdGlvbkV4cHJlc3Npb24odG9rZW4pOwogICAgICAgIH0KICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIC8vIElmIHRoZXJlIGlzIGEgc3RyYXkgc2ltcGxlIGlkZW50aWZpZXIgaW4gdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24KICAgICAgICAvLyBiZWNhdXNlIHRoZSB1c2VyIGlzIHR5cGluZyAoZS5nLiBgKCkgYXN5IHt9YCkgdGhlbiBjb250aW51ZSBwYXJzaW5nCiAgICAgICAgLy8gYW5kIGFsbG93IHBhcnNlRnVuY3Rpb25FeHByZXNzaW9uIHRvIHJlcG9ydCBhbiB1bmV4cGVjdGVkIHRva2VuLgogICAgICAgIGtpbmQgPSBuZXh0VG9rZW4ubmV4dC5raW5kOwogICAgICAgIGlmICgoaWRlbnRpY2FsKGtpbmQsIEZVTkNUSU9OX1RPS0VOKSB8fAogICAgICAgICAgICBpZGVudGljYWwoa2luZCwgT1BFTl9DVVJMWV9CUkFDS0VUX1RPS0VOKSkpIHsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZVZhcmlhYmxlcyhuZXh0KTsKICAgICAgICAgIHJldHVybiBwYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbih0b2tlbik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBib29sIG9sZCA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IHRydWU7CiAgICB0b2tlbiA9IHBhcnNlUGFyZW50aGVzaXplZEV4cHJlc3Npb24odG9rZW4pOwogICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gb2xkOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gZW5zdXJlUGFyZW50aGVzaXplZENvbmRpdGlvbihUb2tlbiB0b2tlbikgewogICAgVG9rZW4gb3BlblBhcmVuID0gdG9rZW4ubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJygnLCBvcGVuUGFyZW4pKSB7CiAgICAgIC8vIFJlY292ZXIKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIG9wZW5QYXJlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZFRva2VuLndpdGhBcmd1bWVudHMoJygnKSk7CiAgICAgIG9wZW5QYXJlbiA9IHJld3JpdGVyLmluc2VydFBhcmVucyh0b2tlbiwgZmFsc2UpOwogICAgfQogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb25JblBhcmVudGhlc2lzUmVzdChvcGVuUGFyZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlUGFyZW50aGVzaXplZENvbmRpdGlvbihvcGVuUGFyZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbi5uZXh0OwogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb25JblBhcmVudGhlc2lzKHRva2VuKTsKICAgIGxpc3RlbmVyLmhhbmRsZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGJlZ2luKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlRXhwcmVzc2lvbkluUGFyZW50aGVzaXMoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25JblBhcmVudGhlc2lzUmVzdCh0b2tlbi5uZXh0KTsKICB9CgogIFRva2VuIHBhcnNlRXhwcmVzc2lvbkluUGFyZW50aGVzaXNSZXN0KFRva2VuIHRva2VuKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJygnLCB0b2tlbikpOwogICAgQmVnaW5Ub2tlbiBiZWdpbiA9IHRva2VuOwogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgdG9rZW4gPSBlbnN1cmVDbG9zZVBhcmVuKHRva2VuLCBiZWdpbik7CiAgICBhc3NlcnQob3B0aW9uYWwoJyknLCB0b2tlbikpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VUaGlzRXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgVG9rZW4gdGhpc1Rva2VuID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCd0aGlzJywgdGhpc1Rva2VuKSk7CiAgICBsaXN0ZW5lci5oYW5kbGVUaGlzRXhwcmVzc2lvbih0aGlzVG9rZW4sIGNvbnRleHQpOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICAvLyBDb25zdHJ1Y3RvciBmb3J3YXJkaW5nLgogICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVBcmd1bWVudHMobmV4dCk7CiAgICAgIHRva2VuID0gcGFyc2VBcmd1bWVudHModG9rZW4pOwogICAgICBsaXN0ZW5lci5oYW5kbGVTZW5kKHRoaXNUb2tlbiwgdG9rZW4ubmV4dCk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZVN1cGVyRXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgVG9rZW4gc3VwZXJUb2tlbiA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnc3VwZXInLCB0b2tlbikpOwogICAgbGlzdGVuZXIuaGFuZGxlU3VwZXJFeHByZXNzaW9uKHN1cGVyVG9rZW4sIGNvbnRleHQpOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICAvLyBTdXBlciBjb25zdHJ1Y3Rvci4KICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlQXJndW1lbnRzKG5leHQpOwogICAgICB0b2tlbiA9IHBhcnNlQXJndW1lbnRzKHRva2VuKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlU2VuZChzdXBlclRva2VuLCB0b2tlbi5uZXh0KTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoIj8uIiwgbmV4dCkpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlU3VwZXJOdWxsQXdhcmUpOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFRoaXMgbWV0aG9kIHBhcnNlcyB0aGUgcG9ydGlvbiBvZiBhIGxpc3QgbGl0ZXJhbCBzdGFydGluZyB3aXRoIHRoZSBsZWZ0CiAgLy8vIHNxdWFyZSBicmFja2V0LgogIC8vLwogIC8vLyBgYGAKICAvLy8gbGlzdExpdGVyYWw6CiAgLy8vICAgJ2NvbnN0Jz8gdHlwZUFyZ3VtZW50cz8gJ1snIChleHByZXNzaW9uTGlzdCAnLCc/KT8gJ10nCiAgLy8vIDsKICAvLy8gYGBgCiAgLy8vCiAgLy8vIFByb3ZpZGUgYSBbY29uc3RLZXl3b3JkXSBpZiB0aGUgbGl0ZXJhbCBpcyBwcmVjZWRlZCBieSAnY29uc3QnLCBvciBgbnVsbGAKICAvLy8gaWYgbm90LiBUaGlzIGlzIGEgc3VmZml4IHBhcnNlciBiZWNhdXNlIGl0IGlzIGFzc3VtZWQgdGhhdCB0eXBlIGFyZ3VtZW50cwogIC8vLyBoYXZlIGJlZW4gcGFyc2VkLCBvciBgbGlzdGVuZXIuaGFuZGxlTm9UeXBlQXJndW1lbnRzYCBoYXMgYmVlbiBleGVjdXRlZC4KICBUb2tlbiBwYXJzZUxpdGVyYWxMaXN0U3VmZml4KFRva2VuIHRva2VuLCBUb2tlbiBjb25zdEtleXdvcmQpIHsKICAgIFRva2VuIGJlZm9yZVRva2VuID0gdG9rZW47CiAgICBUb2tlbiBiZWdpblRva2VuID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdbJywgdG9rZW4pIHx8IG9wdGlvbmFsKCdbXScsIHRva2VuKSk7CiAgICBpbnQgY291bnQgPSAwOwogICAgaWYgKG9wdGlvbmFsKCdbXScsIHRva2VuKSkgewogICAgICB0b2tlbiA9IHJld3JpdGVTcXVhcmVCcmFja2V0cyhiZWZvcmVUb2tlbikubmV4dDsKICAgICAgbGlzdGVuZXIuaGFuZGxlTGl0ZXJhbExpc3QoMCwgdG9rZW4sIGNvbnN0S2V5d29yZCwgdG9rZW4ubmV4dCk7CiAgICAgIHJldHVybiB0b2tlbi5uZXh0OwogICAgfQogICAgYm9vbCBvbGQgPSBtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnM7CiAgICBtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMgPSB0cnVlOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgnXScsIG5leHQpKSB7CiAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGludCBpZkNvdW50ID0gMDsKICAgICAgTGl0ZXJhbEVudHJ5SW5mbyBpbmZvID0gY29tcHV0ZUxpdGVyYWxFbnRyeSh0b2tlbik7CiAgICAgIHdoaWxlIChpbmZvICE9IG51bGwpIHsKICAgICAgICBpZiAoaW5mby5oYXNFbnRyeSkgewogICAgICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0b2tlbiA9IGluZm8ucGFyc2UodG9rZW4sIHRoaXMpOwogICAgICAgIH0KICAgICAgICBpZkNvdW50ICs9IGluZm8uaWZDb25kaXRpb25EZWx0YTsKICAgICAgICBpbmZvID0gaW5mby5jb21wdXRlTmV4dCh0b2tlbik7CiAgICAgIH0KICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICsrY291bnQ7CiAgICAgIGlmICghb3B0aW9uYWwoJywnLCBuZXh0KSkgewogICAgICAgIGlmIChvcHRpb25hbCgnXScsIG5leHQpKSB7CiAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgaWYgKCFsb29rc0xpa2VMaXRlcmFsRW50cnkobmV4dCkpIHsKICAgICAgICAgIGlmIChiZWdpblRva2VuLmVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgIC8vIFRoZSBzY2FubmVyIGhhcyBhbHJlYWR5IHJlcG9ydGVkIGFuIGVycm9yLAogICAgICAgICAgICAvLyBidXQgaW5zZXJ0ZWQgYF1gIGluIHRoZSB3cm9uZyBwbGFjZS4KICAgICAgICAgICAgdG9rZW4gPSByZXdyaXRlci5tb3ZlU3ludGhldGljKHRva2VuLCBiZWdpblRva2VuLmVuZEdyb3VwKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFJlcG9ydCBhbiBlcnJvciBhbmQganVtcCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCddJykpOwogICAgICAgICAgICB0b2tlbiA9IGJlZ2luVG9rZW4uZW5kR3JvdXA7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gVGhpcyBsb29rcyBsaWtlIHRoZSBzdGFydCBvZiBhbiBleHByZXNzaW9uLgogICAgICAgIC8vIFJlcG9ydCBhbiBlcnJvciwgaW5zZXJ0IHRoZSBjb21tYSwgYW5kIGNvbnRpbnVlIHBhcnNpbmcuCiAgICAgICAgdmFyIGNvbW1hID0gbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DT01NQSwgbmV4dC5vZmZzZXQpOwogICAgICAgIHZhciBtZXNzYWdlID0gaWZDb3VudCA+IDAKICAgICAgICAgICAgPyBmYXN0YS5tZXNzYWdlRXhwZWN0ZWRFbHNlT3JDb21tYQogICAgICAgICAgICA6IGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnLCcpOwogICAgICAgIG5leHQgPSByZXdyaXRlQW5kUmVjb3Zlcih0b2tlbiwgbWVzc2FnZSwgY29tbWEpOwogICAgICB9CiAgICAgIHRva2VuID0gbmV4dDsKICAgIH0KICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxMaXN0KGNvdW50LCBiZWdpblRva2VuLCBjb25zdEtleXdvcmQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBwYXJzZXMgdGhlIHBvcnRpb24gb2YgYSBzZXQgb3IgbWFwIGxpdGVyYWwgdGhhdCBzdGFydHMgd2l0aAogIC8vLyB0aGUgbGVmdCBjdXJseSBicmFjZSB3aGVuIHRoZXJlIGFyZSBubyBsZWFkaW5nIHR5cGUgYXJndW1lbnRzLgogIFRva2VuIHBhcnNlTGl0ZXJhbFNldE9yTWFwU3VmZml4KFRva2VuIHRva2VuLCBUb2tlbiBjb25zdEtleXdvcmQpIHsKICAgIFRva2VuIGxlZnRCcmFjZSA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgneycsIGxlZnRCcmFjZSkpOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJ30nLCBuZXh0KSkgewogICAgICBsaXN0ZW5lci5oYW5kbGVMaXRlcmFsU2V0T3JNYXAoMCwgbGVmdEJyYWNlLCBjb25zdEtleXdvcmQsIG5leHQsIGZhbHNlKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CgogICAgZmluYWwgb2xkID0gbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zOwogICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gdHJ1ZTsKICAgIGludCBjb3VudCA9IDA7CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogaGFzU2V0RW50cnkgcGFyYW1ldGVyIGV4aXN0cyBmb3IgcmVwbGljYXRpbmcgZXhpc3RpbmcKICAgIC8vIGJlaGF2aW9yIGFuZCB3aWxsIGJlIHJlbW92ZWQgb25jZSB1bmlmaWVkIGNvbGxlY3Rpb24gaGFzIGJlZW4gZW5hYmxlZAogICAgYm9vbCBoYXNTZXRFbnRyeTsKCiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpbnQgaWZDb3VudCA9IDA7CiAgICAgIExpdGVyYWxFbnRyeUluZm8gaW5mbyA9IGNvbXB1dGVMaXRlcmFsRW50cnkodG9rZW4pOwogICAgICBpZiAoaW5mbyA9PSBzaW1wbGVFbnRyeSkgewogICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBSZW1vdmUgdGhpcyBzZWN0aW9uIGFuZCB1c2UgdGhlIHdoaWxlIGxvb3AgYmVsb3cKICAgICAgICAvLyBvbmNlIGhhc1NldEVudHJ5IGlzIG5vIGxvbmdlciBuZWVkZWQuCiAgICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgICAgIHZhciBpc01hcEVudHJ5ID0gb3B0aW9uYWwoJzonLCB0b2tlbi5uZXh0KTsKICAgICAgICBoYXNTZXRFbnRyeSA/Pz0gIWlzTWFwRW50cnk7CiAgICAgICAgaWYgKGlzTWFwRW50cnkpIHsKICAgICAgICAgIFRva2VuIGNvbG9uID0gdG9rZW4ubmV4dDsKICAgICAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKGNvbG9uKTsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxNYXBFbnRyeShjb2xvbiwgdG9rZW4ubmV4dCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHdoaWxlIChpbmZvICE9IG51bGwpIHsKICAgICAgICAgIGlmIChpbmZvLmhhc0VudHJ5KSB7CiAgICAgICAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKHRva2VuKTsKICAgICAgICAgICAgaWYgKG9wdGlvbmFsKCc6JywgdG9rZW4ubmV4dCkpIHsKICAgICAgICAgICAgICBUb2tlbiBjb2xvbiA9IHRva2VuLm5leHQ7CiAgICAgICAgICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24oY29sb24pOwogICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxNYXBFbnRyeShjb2xvbiwgdG9rZW4ubmV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRva2VuID0gaW5mby5wYXJzZSh0b2tlbiwgdGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgICBpZkNvdW50ICs9IGluZm8uaWZDb25kaXRpb25EZWx0YTsKICAgICAgICAgIGluZm8gPSBpbmZvLmNvbXB1dGVOZXh0KHRva2VuKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgKytjb3VudDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CgogICAgICBUb2tlbiBjb21tYTsKICAgICAgaWYgKG9wdGlvbmFsKCcsJywgbmV4dCkpIHsKICAgICAgICBjb21tYSA9IHRva2VuID0gbmV4dDsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgICBpZiAob3B0aW9uYWwoJ30nLCBuZXh0KSkgewogICAgICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxTZXRPck1hcCgKICAgICAgICAgICAgY291bnQsIGxlZnRCcmFjZSwgY29uc3RLZXl3b3JkLCBuZXh0LCBoYXNTZXRFbnRyeSA/PyBmYWxzZSk7CiAgICAgICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gb2xkOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CgogICAgICBpZiAoY29tbWEgPT0gbnVsbCkgewogICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgaWYgKGxvb2tzTGlrZUxpdGVyYWxFbnRyeShuZXh0KSkgewogICAgICAgICAgLy8gSWYgdGhpcyBsb29rcyBsaWtlIHRoZSBzdGFydCBvZiBhbiBleHByZXNzaW9uLAogICAgICAgICAgLy8gdGhlbiByZXBvcnQgYW4gZXJyb3IsIGluc2VydCB0aGUgY29tbWEsIGFuZCBjb250aW51ZSBwYXJzaW5nLgogICAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIGJldHRlciBlcnJvciBtZXNzYWdlCiAgICAgICAgICB2YXIgY29tbWEgPSBuZXcgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLkNPTU1BLCBuZXh0Lm9mZnNldCk7CiAgICAgICAgICB2YXIgbWVzc2FnZSA9IGlmQ291bnQgPiAwCiAgICAgICAgICAgICAgPyBmYXN0YS5tZXNzYWdlRXhwZWN0ZWRFbHNlT3JDb21tYQogICAgICAgICAgICAgIDogZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcsJyk7CiAgICAgICAgICB0b2tlbiA9IHJld3JpdGVBbmRSZWNvdmVyKHRva2VuLCBtZXNzYWdlLCBjb21tYSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCd9JykpOwogICAgICAgICAgLy8gU2Nhbm5lciBndWFyYW50ZWVzIGEgY2xvc2luZyBjdXJseSBicmFja2V0CiAgICAgICAgICBuZXh0ID0gbGVmdEJyYWNlLmVuZEdyb3VwOwogICAgICAgICAgbGlzdGVuZXIuaGFuZGxlTGl0ZXJhbFNldE9yTWFwKAogICAgICAgICAgICAgIGNvdW50LCBsZWZ0QnJhY2UsIGNvbnN0S2V5d29yZCwgbmV4dCwgaGFzU2V0RW50cnkgPz8gZmFsc2UpOwogICAgICAgICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gb2xkOwogICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLy8gZm9ybWFsUGFyYW1ldGVyTGlzdCBmdW5jdGlvbkJvZHkuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBzdWZmaXggcGFyc2VyIGJlY2F1c2UgaXQgaXMgYXNzdW1lZCB0aGF0IHR5cGUgYXJndW1lbnRzIGhhdmUKICAvLy8gYmVlbiBwYXJzZWQsIG9yIGBsaXN0ZW5lci5oYW5kbGVOb1R5cGVBcmd1bWVudHMoLi4pYCBoYXMgYmVlbiBleGVjdXRlZC4KICBUb2tlbiBwYXJzZUxpdGVyYWxGdW5jdGlvblN1ZmZpeChUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgdG9rZW4ubmV4dCkpOwogICAgLy8gU2Nhbm5lciBlbnN1cmVzIGAoYCBoYXMgbWF0Y2hpbmcgYClgLgogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQuZW5kR3JvdXAubmV4dDsKICAgIGludCBraW5kID0gbmV4dC5raW5kOwogICAgaWYgKCFpZGVudGljYWwoa2luZCwgRlVOQ1RJT05fVE9LRU4pICYmCiAgICAgICAgIWlkZW50aWNhbChraW5kLCBPUEVOX0NVUkxZX0JSQUNLRVRfVE9LRU4pICYmCiAgICAgICAgKCFpZGVudGljYWwoa2luZCwgS0VZV09SRF9UT0tFTikgfHwKICAgICAgICAgICAgIW9wdGlvbmFsKCdhc3luYycsIG5leHQpICYmICFvcHRpb25hbCgnc3luYycsIG5leHQpKSkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKG5leHQsIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgIH0KICAgIHJldHVybiBwYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICAvLy8gZ2VuZXJpY0xpc3RMaXRlcmFsIHwgZ2VuZXJpY01hcExpdGVyYWwgfCBnZW5lcmljRnVuY3Rpb25MaXRlcmFsLgogIC8vLwogIC8vLyBXaGVyZQogIC8vLyAgIGdlbmVyaWNMaXN0TGl0ZXJhbCA6Oj0gdHlwZUFyZ3VtZW50cyAnWycgKGV4cHJlc3Npb25MaXN0ICcsJz8pPyAnXScKICAvLy8gICBnZW5lcmljTWFwTGl0ZXJhbCA6Oj0KICAvLy8gICAgICAgdHlwZUFyZ3VtZW50cyAneycgKG1hcExpdGVyYWxFbnRyeSAoJywnIG1hcExpdGVyYWxFbnRyeSkqICcsJz8pPyAnfScKICAvLy8gICBnZW5lcmljRnVuY3Rpb25MaXRlcmFsIDo6PQogIC8vLyAgICAgICB0eXBlUGFyYW1ldGVycyBmb3JtYWxQYXJhbWV0ZXJMaXN0IGZ1bmN0aW9uQm9keQogIC8vLyBQcm92aWRlIHRva2VuIGZvciBbY29uc3RLZXl3b3JkXSBpZiBwcmVjZWRlZCBieSAnY29uc3QnLCBudWxsIGlmIG5vdC4KICBUb2tlbiBwYXJzZUxpdGVyYWxMaXN0U2V0TWFwT3JGdW5jdGlvbigKICAgICAgZmluYWwgVG9rZW4gc3RhcnQsIFRva2VuIGNvbnN0S2V5d29yZCkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCc8Jywgc3RhcnQubmV4dCkpOwogICAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVQYXJhbU9yQXJnID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHN0YXJ0LCB0cnVlKTsKICAgIFRva2VuIHRva2VuID0gdHlwZVBhcmFtT3JBcmcuc2tpcChzdGFydCk7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgIGlmIChjb25zdEtleXdvcmQgIT0gbnVsbCkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgIGNvbnN0S2V5d29yZCwgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgICB9CiAgICAgIHRva2VuID0gdHlwZVBhcmFtT3JBcmcucGFyc2VWYXJpYWJsZXMoc3RhcnQsIHRoaXMpOwogICAgICByZXR1cm4gcGFyc2VMaXRlcmFsRnVuY3Rpb25TdWZmaXgodG9rZW4pOwogICAgfQogICAgdG9rZW4gPSB0eXBlUGFyYW1PckFyZy5wYXJzZUFyZ3VtZW50cyhzdGFydCwgdGhpcyk7CiAgICBpZiAob3B0aW9uYWwoJ3snLCBuZXh0KSkgewogICAgICBpZiAodHlwZVBhcmFtT3JBcmcudHlwZUFyZ3VtZW50Q291bnQgPiAyKSB7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgZmFzdGEubWVzc2FnZVNldE9yTWFwTGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzLAogICAgICAgICAgICBzdGFydC5uZXh0LAogICAgICAgICAgICB0b2tlbik7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnNlTGl0ZXJhbFNldE9yTWFwU3VmZml4KHRva2VuLCBjb25zdEtleXdvcmQpOwogICAgfQogICAgaWYgKCFvcHRpb25hbCgnWycsIG5leHQpICYmICFvcHRpb25hbCgnW10nLCBuZXh0KSkgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogSW1wcm92ZSB0aGlzIGVycm9yIG1lc3NhZ2UuCiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBuZXh0LCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJ1snKSk7CiAgICAgIHJld3JpdGVyLmluc2VydFN5bnRoZXRpY1Rva2VuKHRva2VuLCBUb2tlblR5cGUuSU5ERVgpOwogICAgfQogICAgcmV0dXJuIHBhcnNlTGl0ZXJhbExpc3RTdWZmaXgodG9rZW4sIGNvbnN0S2V5d29yZCk7CiAgfQoKICAvLy8gYGBgCiAgLy8vIG1hcExpdGVyYWxFbnRyeToKICAvLy8gICBleHByZXNzaW9uICc6JyBleHByZXNzaW9uIHwKICAvLy8gICAnaWYnICcoJyBleHByZXNzaW9uICcpJyBtYXBMaXRlcmFsRW50cnkgKCAnZWxzZScgbWFwTGl0ZXJhbEVudHJ5ICk/IHwKICAvLy8gICAnYXdhaXQnPyAnZm9yJyAnKCcgZm9yTG9vcFBhcnRzICcpJyBtYXBMaXRlcmFsRW50cnkgfAogIC8vLyAgICggJy4uLicgfCAnLi4uPycgKSBleHByZXNzaW9uCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VNYXBMaXRlcmFsRW50cnkoVG9rZW4gdG9rZW4pIHsKICAgIC8vIEFzc3VtZSB0aGUgbGlzdGVuZXIgcmVqZWN0cyBub24tc3RyaW5nIGtleXMuCiAgICAvLyBUT0RPKGJyaWFud2lsa2Vyc29uKTogQ2hhbmdlIHRoZSBhc3N1bXB0aW9uIGFib3ZlIGJ5IG1vdmluZyBlcnJvcgogICAgLy8gY2hlY2tpbmcgaW50byB0aGUgcGFyc2VyLCBtYWtpbmcgaXQgcG9zc2libGUgdG8gcmVjb3Zlci4KICAgIExpdGVyYWxFbnRyeUluZm8gaW5mbyA9IGNvbXB1dGVMaXRlcmFsRW50cnkodG9rZW4pOwogICAgd2hpbGUgKGluZm8gIT0gbnVsbCkgewogICAgICBpZiAoaW5mby5oYXNFbnRyeSkgewogICAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKHRva2VuKTsKICAgICAgICBUb2tlbiBjb2xvbiA9IGVuc3VyZUNvbG9uKHRva2VuKTsKICAgICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbihjb2xvbik7CiAgICAgICAgLy8gVE9ETyByZW1vdmUgdW51c2VkIDJuZCBwYXJhbWV0ZXIKICAgICAgICBsaXN0ZW5lci5oYW5kbGVMaXRlcmFsTWFwRW50cnkoY29sb24sIHRva2VuLm5leHQpOwogICAgICB9IGVsc2UgewogICAgICAgIHRva2VuID0gaW5mby5wYXJzZSh0b2tlbiwgdGhpcyk7CiAgICAgIH0KICAgICAgaW5mbyA9IGluZm8uY29tcHV0ZU5leHQodG9rZW4pOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VTZW5kT3JGdW5jdGlvbkxpdGVyYWwoVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIGlmICghbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zKSB7CiAgICAgIHJldHVybiBwYXJzZVNlbmQodG9rZW4sIGNvbnRleHQpOwogICAgfQogICAgVHlwZUluZm8gdHlwZUluZm8gPSBjb21wdXRlVHlwZSh0b2tlbiwgZmFsc2UpOwogICAgVG9rZW4gYmVmb3JlTmFtZSA9IHR5cGVJbmZvLnNraXBUeXBlKHRva2VuKTsKICAgIFRva2VuIG5hbWUgPSBiZWZvcmVOYW1lLm5leHQ7CiAgICBpZiAobmFtZS5pc0lkZW50aWZpZXIpIHsKICAgICAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVQYXJhbSA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyhuYW1lKTsKICAgICAgVG9rZW4gbmV4dCA9IHR5cGVQYXJhbS5za2lwKG5hbWUpLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgICAgaWYgKGxvb2tzTGlrZUZ1bmN0aW9uQm9keShuZXh0LmVuZEdyb3VwLm5leHQpKSB7CiAgICAgICAgICByZXR1cm4gcGFyc2VGdW5jdGlvbkxpdGVyYWwoCiAgICAgICAgICAgICAgdG9rZW4sIGJlZm9yZU5hbWUsIG5hbWUsIHR5cGVJbmZvLCB0eXBlUGFyYW0sIGNvbnRleHQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhcnNlU2VuZCh0b2tlbiwgY29udGV4dCk7CiAgfQoKICBUb2tlbiBlbnN1cmVBcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKCFvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICB0b2tlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJygnKSk7CiAgICAgIG5leHQgPSByZXdyaXRlci5pbnNlcnRQYXJlbnModG9rZW4sIGZhbHNlKTsKICAgIH0KICAgIHJldHVybiBwYXJzZUFyZ3VtZW50c1Jlc3QobmV4dCk7CiAgfQoKICBUb2tlbiBwYXJzZUNvbnN0cnVjdG9ySW52b2NhdGlvbkFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAoIW9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgLy8gUmVjb3Zlcnk6IENoZWNrIGZvciBpbnZhbGlkIHR5cGUgcGFyYW1ldGVycwogICAgICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZUFyZyA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0b2tlbik7CiAgICAgIGlmICh0eXBlQXJnID09IG5vVHlwZVBhcmFtT3JBcmcpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJygnKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgdG9rZW4sIGZhc3RhLm1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhUeXBlQXJndW1lbnRzKTsKICAgICAgICB0b2tlbiA9IHR5cGVBcmcucGFyc2VBcmd1bWVudHModG9rZW4sIHRoaXMpOwogICAgICAgIGxpc3RlbmVyLmhhbmRsZUludmFsaWRUeXBlQXJndW1lbnRzKHRva2VuKTsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgICBpZiAoIW9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgICBuZXh0ID0gcmV3cml0ZXIuaW5zZXJ0UGFyZW5zKHRva2VuLCBmYWxzZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwYXJzZUFyZ3VtZW50c1Jlc3QobmV4dCk7CiAgfQoKICAvLy8gYGBgCiAgLy8vIG5ld0V4cHJlc3Npb246CiAgLy8vICAgJ25ldycgdHlwZSAoJy4nIGlkZW50aWZpZXIpPyBhcmd1bWVudHMKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZU5ld0V4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5ld0tleXdvcmQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCduZXcnLCBuZXdLZXl3b3JkKSk7CiAgICBsaXN0ZW5lci5iZWdpbk5ld0V4cHJlc3Npb24obmV3S2V5d29yZCk7CiAgICB0b2tlbiA9IHBhcnNlQ29uc3RydWN0b3JSZWZlcmVuY2UobmV3S2V5d29yZCk7CiAgICB0b2tlbiA9IHBhcnNlQ29uc3RydWN0b3JJbnZvY2F0aW9uQXJndW1lbnRzKHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZE5ld0V4cHJlc3Npb24obmV3S2V5d29yZCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uKAogICAgICBUb2tlbiB0b2tlbiwgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVBcmcpIHsKICAgIFRva2VuIGJlZ2luID0gdG9rZW47CiAgICBsaXN0ZW5lci5iZWdpbkltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uKHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VDb25zdHJ1Y3RvclJlZmVyZW5jZSh0b2tlbiwgdHlwZUFyZyk7CiAgICB0b2tlbiA9IHBhcnNlQ29uc3RydWN0b3JJbnZvY2F0aW9uQXJndW1lbnRzKHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZEltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uKGJlZ2luKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBwYXJzZXMgYSBsaXN0IG9yIG1hcCBsaXRlcmFsIHRoYXQgaXMga25vd24gdG8gc3RhcnQgd2l0aCB0aGUKICAvLy8ga2V5d29yZCAnY29uc3QnLgogIC8vLwogIC8vLyBgYGAKICAvLy8gbGlzdExpdGVyYWw6CiAgLy8vICAgJ2NvbnN0Jz8gdHlwZUFyZ3VtZW50cz8gJ1snIChleHByZXNzaW9uTGlzdCAnLCc/KT8gJ10nCiAgLy8vIDsKICAvLy8KICAvLy8gbWFwTGl0ZXJhbDoKICAvLy8gICAnY29uc3QnPyB0eXBlQXJndW1lbnRzPyAneycgKG1hcExpdGVyYWxFbnRyeSAoJywnIG1hcExpdGVyYWxFbnRyeSkqICcsJz8pPyAnfScKICAvLy8gOwogIC8vLwogIC8vLyBtYXBMaXRlcmFsRW50cnk6CiAgLy8vICAgZXhwcmVzc2lvbiAnOicgZXhwcmVzc2lvbgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQ29uc3RFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBjb25zdEtleXdvcmQgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2NvbnN0JywgY29uc3RLZXl3b3JkKSk7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICBpZiAoKGlkZW50aWNhbCh2YWx1ZSwgJ1snKSkgfHwgKGlkZW50aWNhbCh2YWx1ZSwgJ1tdJykpKSB7CiAgICAgIGxpc3RlbmVyLmJlZ2luQ29uc3RMaXRlcmFsKG5leHQpOwogICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVBcmd1bWVudHMobmV4dCk7CiAgICAgIHRva2VuID0gcGFyc2VMaXRlcmFsTGlzdFN1ZmZpeCh0b2tlbiwgY29uc3RLZXl3b3JkKTsKICAgICAgbGlzdGVuZXIuZW5kQ29uc3RMaXRlcmFsKHRva2VuLm5leHQpOwogICAgICByZXR1cm4gdG9rZW47CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAneycpKSB7CiAgICAgIGxpc3RlbmVyLmJlZ2luQ29uc3RMaXRlcmFsKG5leHQpOwogICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVBcmd1bWVudHMobmV4dCk7CiAgICAgIHRva2VuID0gcGFyc2VMaXRlcmFsU2V0T3JNYXBTdWZmaXgodG9rZW4sIGNvbnN0S2V5d29yZCk7CiAgICAgIGxpc3RlbmVyLmVuZENvbnN0TGl0ZXJhbCh0b2tlbi5uZXh0KTsKICAgICAgcmV0dXJuIHRva2VuOwogICAgfQogICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJzwnKSkgewogICAgICBsaXN0ZW5lci5iZWdpbkNvbnN0TGl0ZXJhbChuZXh0KTsKICAgICAgdG9rZW4gPSBwYXJzZUxpdGVyYWxMaXN0U2V0TWFwT3JGdW5jdGlvbih0b2tlbiwgY29uc3RLZXl3b3JkKTsKICAgICAgbGlzdGVuZXIuZW5kQ29uc3RMaXRlcmFsKHRva2VuLm5leHQpOwogICAgICByZXR1cm4gdG9rZW47CiAgICB9CiAgICBsaXN0ZW5lci5iZWdpbkNvbnN0RXhwcmVzc2lvbihjb25zdEtleXdvcmQpOwogICAgdG9rZW4gPSBwYXJzZUNvbnN0cnVjdG9yUmVmZXJlbmNlKHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VDb25zdHJ1Y3Rvckludm9jYXRpb25Bcmd1bWVudHModG9rZW4pOwogICAgbGlzdGVuZXIuZW5kQ29uc3RFeHByZXNzaW9uKGNvbnN0S2V5d29yZCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGludExpdGVyYWw6CiAgLy8vICAgaW50ZWdlcgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlTGl0ZXJhbEludChUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWNhbCh0b2tlbi5raW5kLCBJTlRfVE9LRU4pIHx8CiAgICAgICAgaWRlbnRpY2FsKHRva2VuLmtpbmQsIEhFWEFERUNJTUFMX1RPS0VOKSk7CiAgICBsaXN0ZW5lci5oYW5kbGVMaXRlcmFsSW50KHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gZG91YmxlTGl0ZXJhbDoKICAvLy8gICBkb3VibGUKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUxpdGVyYWxEb3VibGUoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGljYWwodG9rZW4ua2luZCwgRE9VQkxFX1RPS0VOKSk7CiAgICBsaXN0ZW5lci5oYW5kbGVMaXRlcmFsRG91YmxlKHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gc3RyaW5nTGl0ZXJhbDoKICAvLy8gICAobXVsdGlsaW5lU3RyaW5nIHwgc2luZ2xlTGluZVN0cmluZykrCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VMaXRlcmFsU3RyaW5nKFRva2VuIHRva2VuKSB7CiAgICBhc3NlcnQoaWRlbnRpY2FsKHRva2VuLm5leHQua2luZCwgU1RSSU5HX1RPS0VOKSk7CiAgICBib29sIG9sZCA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IHRydWU7CiAgICB0b2tlbiA9IHBhcnNlU2luZ2xlTGl0ZXJhbFN0cmluZyh0b2tlbik7CiAgICBpbnQgY291bnQgPSAxOwogICAgd2hpbGUgKGlkZW50aWNhbCh0b2tlbi5uZXh0LmtpbmQsIFNUUklOR19UT0tFTikpIHsKICAgICAgdG9rZW4gPSBwYXJzZVNpbmdsZUxpdGVyYWxTdHJpbmcodG9rZW4pOwogICAgICBjb3VudCsrOwogICAgfQogICAgaWYgKGNvdW50ID4gMSkgewogICAgICBsaXN0ZW5lci5oYW5kbGVTdHJpbmdKdXh0YXBvc2l0aW9uKGNvdW50KTsKICAgIH0KICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gc3ltYm9sTGl0ZXJhbDoKICAvLy8gICAnIycgKG9wZXJhdG9yIHwgKGlkZW50aWZpZXIgKCcuJyBpZGVudGlmaWVyKSopKQogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlTGl0ZXJhbFN5bWJvbChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gaGFzaFRva2VuID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCcjJywgaGFzaFRva2VuKSk7CiAgICBsaXN0ZW5lci5iZWdpbkxpdGVyYWxTeW1ib2woaGFzaFRva2VuKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG5leHQuaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3IpIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlT3BlcmF0b3IobmV4dCk7CiAgICAgIGxpc3RlbmVyLmVuZExpdGVyYWxTeW1ib2woaGFzaFRva2VuLCAxKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCd2b2lkJywgbmV4dCkpIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlU3ltYm9sVm9pZChuZXh0KTsKICAgICAgbGlzdGVuZXIuZW5kTGl0ZXJhbFN5bWJvbChoYXNoVG9rZW4sIDEpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIGludCBjb3VudCA9IDE7CiAgICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQubGl0ZXJhbFN5bWJvbCk7CiAgICAgIHdoaWxlIChvcHRpb25hbCgnLicsIHRva2VuLm5leHQpKSB7CiAgICAgICAgY291bnQrKzsKICAgICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIoCiAgICAgICAgICAgIHRva2VuLm5leHQsIElkZW50aWZpZXJDb250ZXh0LmxpdGVyYWxTeW1ib2xDb250aW51YXRpb24pOwogICAgICB9CiAgICAgIGxpc3RlbmVyLmVuZExpdGVyYWxTeW1ib2woaGFzaFRva2VuLCBjb3VudCk7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICB9CgogIFRva2VuIHBhcnNlU2luZ2xlTGl0ZXJhbFN0cmluZyhUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWNhbCh0b2tlbi5raW5kLCBTVFJJTkdfVE9LRU4pKTsKICAgIGxpc3RlbmVyLmJlZ2luTGl0ZXJhbFN0cmluZyh0b2tlbik7CiAgICAvLyBQYXJzaW5nIHRoZSBwcmVmaXgsIGZvciBpbnN0YW5jZSAneCBvZiAneCR7aWR9eSR7aWR9eicKICAgIGludCBpbnRlcnBvbGF0aW9uQ291bnQgPSAwOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICB2YXIga2luZCA9IG5leHQua2luZDsKICAgIHdoaWxlIChraW5kICE9IEVPRl9UT0tFTikgewogICAgICBpZiAoaWRlbnRpY2FsKGtpbmQsIFNUUklOR19JTlRFUlBPTEFUSU9OX1RPS0VOKSkgewogICAgICAgIC8vIFBhcnNpbmcgJHtleHByZXNzaW9ufS4KICAgICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbihuZXh0KS5uZXh0OwogICAgICAgIGlmICghb3B0aW9uYWwoJ30nLCB0b2tlbikpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgdG9rZW4sIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnfScpKTsKICAgICAgICAgIHRva2VuID0gbmV4dC5lbmRHcm91cDsKICAgICAgICB9CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlSW50ZXJwb2xhdGlvbkV4cHJlc3Npb24obmV4dCwgdG9rZW4pOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChraW5kLCBTVFJJTkdfSU5URVJQT0xBVElPTl9JREVOVElGSUVSX1RPS0VOKSkgewogICAgICAgIC8vIFBhcnNpbmcgJGlkZW50aWZpZXIuCiAgICAgICAgdG9rZW4gPSBwYXJzZUlkZW50aWZpZXJFeHByZXNzaW9uKG5leHQpOwogICAgICAgIGxpc3RlbmVyLmhhbmRsZUludGVycG9sYXRpb25FeHByZXNzaW9uKG5leHQsIG51bGwpOwogICAgICB9IGVsc2UgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgICsraW50ZXJwb2xhdGlvbkNvdW50OwogICAgICAvLyBQYXJzaW5nIHRoZSBpbmZpeC9zdWZmaXgsIGZvciBpbnN0YW5jZSB5IGFuZCB6JyBvZiAneCR7aWR9eSR7aWR9eicKICAgICAgdG9rZW4gPSBwYXJzZVN0cmluZ1BhcnQodG9rZW4pOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAga2luZCA9IG5leHQua2luZDsKICAgIH0KICAgIGxpc3RlbmVyLmVuZExpdGVyYWxTdHJpbmcoaW50ZXJwb2xhdGlvbkNvdW50LCBuZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlSWRlbnRpZmllckV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG5leHQua2luZCA9PSBLRVlXT1JEX1RPS0VOICYmIGlkZW50aWNhbChuZXh0LnN0cmluZ1ZhbHVlLCAidGhpcyIpKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZVRoaXNFeHByZXNzaW9uKG5leHQsIElkZW50aWZpZXJDb250ZXh0LmV4cHJlc3Npb24pOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBwYXJzZVNlbmQodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmV4cHJlc3Npb24pOwogICAgfQogIH0KCiAgLy8vIGBgYAogIC8vLyBib29sZWFuTGl0ZXJhbDoKICAvLy8gICAndHJ1ZScgfAogIC8vLyAgICdmYWxzZScKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUxpdGVyYWxCb29sKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2ZhbHNlJywgdG9rZW4pIHx8IG9wdGlvbmFsKCd0cnVlJywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxCb29sKHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gbnVsbExpdGVyYWw6CiAgLy8vICAgJ251bGwnCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VMaXRlcmFsTnVsbChUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdudWxsJywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxOdWxsKHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlU2VuZChUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgVG9rZW4gYmVnaW5Ub2tlbiA9IHRva2VuID0gZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgY29udGV4dCk7CiAgICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZUFyZyA9IGNvbXB1dGVNZXRob2RUeXBlQXJndW1lbnRzKHRva2VuKTsKICAgIGlmICh0eXBlQXJnICE9IG5vVHlwZVBhcmFtT3JBcmcpIHsKICAgICAgdG9rZW4gPSB0eXBlQXJnLnBhcnNlQXJndW1lbnRzKHRva2VuLCB0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZUFyZ3VtZW50cyh0b2tlbi5uZXh0KTsKICAgIH0KICAgIHRva2VuID0gcGFyc2VBcmd1bWVudHNPcHQodG9rZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlU2VuZChiZWdpblRva2VuLCB0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHNraXBBcmd1bWVudHNPcHQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgbGlzdGVuZXIuaGFuZGxlTm9Bcmd1bWVudHMobmV4dCk7CiAgICBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICByZXR1cm4gbmV4dC5lbmRHcm91cDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICB9CgogIFRva2VuIHBhcnNlQXJndW1lbnRzT3B0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICBsaXN0ZW5lci5oYW5kbGVOb0FyZ3VtZW50cyhuZXh0KTsKICAgICAgcmV0dXJuIHRva2VuOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHBhcnNlQXJndW1lbnRzKHRva2VuKTsKICAgIH0KICB9CgogIC8vLyBgYGAKICAvLy8gYXJndW1lbnRzOgogIC8vLyAgICcoJyAoYXJndW1lbnRMaXN0ICcsJz8pPyAnKScKICAvLy8gOwogIC8vLwogIC8vLyBhcmd1bWVudExpc3Q6CiAgLy8vICAgbmFtZWRBcmd1bWVudCAoJywnIG5hbWVkQXJndW1lbnQpKiB8CiAgLy8vICAgZXhwcmVzc2lvbkxpc3QgKCcsJyBuYW1lZEFyZ3VtZW50KSoKICAvLy8gOwogIC8vLwogIC8vLyBuYW1lZEFyZ3VtZW50OgogIC8vLyAgIGxhYmVsIGV4cHJlc3Npb24KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIHBhcnNlQXJndW1lbnRzUmVzdCh0b2tlbi5uZXh0KTsKICB9CgogIFRva2VuIHBhcnNlQXJndW1lbnRzUmVzdChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbjsKICAgIGFzc2VydChvcHRpb25hbCgnKCcsIGJlZ2luKSk7CiAgICBsaXN0ZW5lci5iZWdpbkFyZ3VtZW50cyhiZWdpbik7CiAgICBpbnQgYXJndW1lbnRDb3VudCA9IDA7CiAgICBib29sIGhhc1NlZW5OYW1lZEFyZ3VtZW50ID0gZmFsc2U7CiAgICBib29sIG9sZCA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IHRydWU7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCcpJywgbmV4dCkpIHsKICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgVG9rZW4gY29sb24gPSBudWxsOwogICAgICBpZiAob3B0aW9uYWwoJzonLCBuZXh0Lm5leHQpKSB7CiAgICAgICAgdG9rZW4gPQogICAgICAgICAgICBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5uYW1lZEFyZ3VtZW50UmVmZXJlbmNlKQogICAgICAgICAgICAgICAgLm5leHQ7CiAgICAgICAgY29sb24gPSB0b2tlbjsKICAgICAgICBoYXNTZWVuTmFtZWRBcmd1bWVudCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoaGFzU2Vlbk5hbWVkQXJndW1lbnQpIHsKICAgICAgICAvLyBQb3NpdGlvbmFsIGFyZ3VtZW50IGFmdGVyIG5hbWVkIGFyZ3VtZW50LgogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZVBvc2l0aW9uYWxBZnRlck5hbWVkQXJndW1lbnQpOwogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKHRva2VuKTsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChjb2xvbiAhPSBudWxsKSBsaXN0ZW5lci5oYW5kbGVOYW1lZEFyZ3VtZW50KGNvbG9uKTsKICAgICAgKythcmd1bWVudENvdW50OwogICAgICBpZiAoIW9wdGlvbmFsKCcsJywgbmV4dCkpIHsKICAgICAgICBpZiAob3B0aW9uYWwoJyknLCBuZXh0KSkgewogICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgaWYgKGxvb2tzTGlrZUV4cHJlc3Npb25TdGFydChuZXh0KSkgewogICAgICAgICAgLy8gSWYgdGhpcyBsb29rcyBsaWtlIHRoZSBzdGFydCBvZiBhbiBleHByZXNzaW9uLAogICAgICAgICAgLy8gdGhlbiByZXBvcnQgYW4gZXJyb3IsIGluc2VydCB0aGUgY29tbWEsIGFuZCBjb250aW51ZSBwYXJzaW5nLgogICAgICAgICAgbmV4dCA9IHJld3JpdGVBbmRSZWNvdmVyKAogICAgICAgICAgICAgIHRva2VuLAogICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnLCcpLAogICAgICAgICAgICAgIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuQ09NTUEsIG5leHQub2Zmc2V0KSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRva2VuID0gZW5zdXJlQ2xvc2VQYXJlbih0b2tlbiwgYmVnaW4pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRva2VuID0gbmV4dDsKICAgIH0KICAgIGFzc2VydChvcHRpb25hbCgnKScsIHRva2VuKSk7CiAgICBtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMgPSBvbGQ7CiAgICBsaXN0ZW5lci5lbmRBcmd1bWVudHMoYXJndW1lbnRDb3VudCwgYmVnaW4sIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gdHlwZVRlc3Q6OgogIC8vLyAgICdpcycgJyEnPyB0eXBlCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VJc09wZXJhdG9yUmVzdChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gb3BlcmF0b3IgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2lzJywgb3BlcmF0b3IpKTsKICAgIFRva2VuIG5vdCA9IG51bGw7CiAgICBpZiAob3B0aW9uYWwoJyEnLCB0b2tlbi5uZXh0KSkgewogICAgICBub3QgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB9CiAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlQWZ0ZXJJc09yQXModG9rZW4pOwogICAgdG9rZW4gPSB0eXBlSW5mby5lbnN1cmVUeXBlTm90Vm9pZCh0b2tlbiwgdGhpcyk7CiAgICBsaXN0ZW5lci5oYW5kbGVJc09wZXJhdG9yKG9wZXJhdG9yLCBub3QpOwogICAgcmV0dXJuIHNraXBDaGFpbmVkQXNJc09wZXJhdG9ycyh0b2tlbik7CiAgfQoKICBUeXBlSW5mbyBjb21wdXRlVHlwZUFmdGVySXNPckFzKFRva2VuIHRva2VuKSB7CiAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlKHRva2VuLCB0cnVlKTsKICAgIGlmICh0eXBlSW5mby5pc051bGxhYmxlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0eXBlSW5mby5za2lwVHlwZSh0b2tlbikubmV4dDsKICAgICAgaWYgKCFpc09uZU9mT3JFb2YobmV4dCwgY29uc3QgWycpJywgJz8nLCAnOycsICdpcycsICdhcyddKSkgewogICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBpbnZlc3RpZ2F0ZSBvdGhlciBzaXR1YXRpb25zCiAgICAgICAgLy8gd2hlcmUgYD9gIHNob3VsZCBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHR5cGUgaW5mbwogICAgICAgIC8vIHJhdGhlciB0aGFuIHRoZSBzdGFydCBvZiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCiAgICAgICAgdHlwZUluZm8gPSB0eXBlSW5mby5hc05vbk51bGxhYmxlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHlwZUluZm87CiAgfQoKICAvLy8gYGBgCiAgLy8vIHR5cGVDYXN0OgogIC8vLyAgICdhcycgdHlwZQogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQXNPcGVyYXRvclJlc3QoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG9wZXJhdG9yID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdhcycsIG9wZXJhdG9yKSk7CiAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlQWZ0ZXJJc09yQXModG9rZW4pOwogICAgdG9rZW4gPSB0eXBlSW5mby5lbnN1cmVUeXBlTm90Vm9pZCh0b2tlbiwgdGhpcyk7CiAgICBsaXN0ZW5lci5oYW5kbGVBc09wZXJhdG9yKG9wZXJhdG9yKTsKICAgIHJldHVybiBza2lwQ2hhaW5lZEFzSXNPcGVyYXRvcnModG9rZW4pOwogIH0KCiAgVG9rZW4gc2tpcENoYWluZWRBc0lzT3BlcmF0b3JzKFRva2VuIHRva2VuKSB7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgU3RyaW5nIHZhbHVlID0gbmV4dC5zdHJpbmdWYWx1ZTsKICAgICAgaWYgKCFpZGVudGljYWwodmFsdWUsICdpcycpICYmICFpZGVudGljYWwodmFsdWUsICdhcycpKSB7CiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9CiAgICAgIC8vIFRoZSBpcy0gYW5kIGFzLW9wZXJhdG9ycyBjYW5ub3QgYmUgY2hhaW5lZC4KICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UuCiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4obmV4dCwgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgICBpZiAob3B0aW9uYWwoJyEnLCBuZXh0Lm5leHQpKSB7CiAgICAgICAgbmV4dCA9IG5leHQubmV4dDsKICAgICAgfQogICAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlQWZ0ZXJJc09yQXMobmV4dCk7CiAgICAgIHRva2VuID0gdHlwZUluZm8uc2tpcFR5cGUobmV4dCk7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIGlmIFt0b2tlbl0gY291bGQgYmUgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24KICAvLy8gd2l0aG91dCBhIHJldHVybiB0eXBlLgogIGJvb2wgbG9va3NMaWtlTG9jYWxGdW5jdGlvbihUb2tlbiB0b2tlbikgewogICAgaWYgKHRva2VuLmlzSWRlbnRpZmllcikgewogICAgICBpZiAob3B0aW9uYWwoJzwnLCB0b2tlbi5uZXh0KSkgewogICAgICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlUGFyYW0gPSBjb21wdXRlVHlwZVBhcmFtT3JBcmcodG9rZW4pOwogICAgICAgIGlmICh0eXBlUGFyYW0gPT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICB0b2tlbiA9IHR5cGVQYXJhbS5za2lwKHRva2VuKTsKICAgICAgfQogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgnKCcsIHRva2VuKSkgewogICAgICAgIHRva2VuID0gdG9rZW4uZW5kR3JvdXAubmV4dDsKICAgICAgICByZXR1cm4gb3B0aW9uYWwoJ3snLCB0b2tlbikgfHwKICAgICAgICAgICAgb3B0aW9uYWwoJz0+JywgdG9rZW4pIHx8CiAgICAgICAgICAgIG9wdGlvbmFsKCdhc3luYycsIHRva2VuKSB8fAogICAgICAgICAgICBvcHRpb25hbCgnc3luYycsIHRva2VuKTsKICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnPT4nLCB0b2tlbikpIHsKICAgICAgICAvLyBSZWNvdmVyeTogTG9va3MgbGlrZSBhIGxvY2FsIGZ1bmN0aW9uIHRoYXQgaXMgbWlzc2luZyBwYXJlbnRoZXNpcy4KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBbdG9rZW5dIGNvdWxkIGJlIHRoZSBzdGFydCBvZiBhIGZ1bmN0aW9uIGJvZHkuCiAgYm9vbCBsb29rc0xpa2VGdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBvcHRpb25hbCgneycsIHRva2VuKSB8fAogICAgICAgIG9wdGlvbmFsKCc9PicsIHRva2VuKSB8fAogICAgICAgIG9wdGlvbmFsKCdhc3luYycsIHRva2VuKSB8fAogICAgICAgIG9wdGlvbmFsKCdzeW5jJywgdG9rZW4pOwogIH0KCiAgVG9rZW4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JDb25zdERlY2xhcmF0aW9uKGZpbmFsIFRva2VuIHN0YXJ0KSB7CiAgICBUb2tlbiBjb25zdFRva2VuID0gc3RhcnQubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnY29uc3QnLCBjb25zdFRva2VuKSk7CiAgICBpZiAoIWlzTW9kaWZpZXIoY29uc3RUb2tlbi5uZXh0KSkgewogICAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlKGNvbnN0VG9rZW4sIGZhbHNlKTsKICAgICAgaWYgKHR5cGVJbmZvID09IG5vVHlwZSkgewogICAgICAgIFRva2VuIG5leHQgPSBjb25zdFRva2VuLm5leHQ7CiAgICAgICAgaWYgKCFuZXh0LmlzSWRlbnRpZmllcikgewogICAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChzdGFydCk7CiAgICAgICAgfQogICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgICAgaWYgKCEob3B0aW9uYWwoJz0nLCBuZXh0KSB8fAogICAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgICBuZXh0LmlzS2V5d29yZE9ySWRlbnRpZmllciB8fAogICAgICAgICAgICBvcHRpb25hbCgnOycsIG5leHQpIHx8CiAgICAgICAgICAgIG9wdGlvbmFsKCcsJywgbmV4dCkgfHwKICAgICAgICAgICAgb3B0aW9uYWwoJ3snLCBuZXh0KSkpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoc3RhcnQpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbkFmdGVyTW9kaWZpZXJzKAogICAgICAgICAgY29uc3RUb2tlbiwgc3RhcnQsIG51bGwsIGNvbnN0VG9rZW4sIHR5cGVJbmZvLCBmYWxzZSk7CiAgICB9CiAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbihzdGFydCk7CiAgfQoKICAvLy8gVGhpcyBtZXRob2QgaGFzIHR3byBtb2RlcyBiYXNlZCB1cG9uIFtvbmx5UGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uU3RhcnRdLgogIC8vLwogIC8vLyBJZiBbb25seVBhcnNlVmFyaWFibGVEZWNsYXJhdGlvblN0YXJ0XSBpcyBgZmFsc2VgICh0aGUgZGVmYXVsdCkgdGhlbiB0aGlzCiAgLy8vIG1ldGhvZCB3aWxsIHBhcnNlIGEgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24sIGEgbG9jYWwgZnVuY3Rpb24sCiAgLy8vIG9yIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50LCBhbmQgdGhlbiByZXR1cm4gdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4uCiAgLy8vCiAgLy8vIElmIFtvbmx5UGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uU3RhcnRdIGlzIGB0cnVlYCB0aGVuIHRoaXMgbWV0aG9kCiAgLy8vIHdpbGwgb25seSBwYXJzZSB0aGUgbWV0YWRhdGEsIG1vZGlmaWVycywgYW5kIHR5cGUgb2YgYSBsb2NhbCB2YXJpYWJsZQogIC8vLyBkZWNsYXJhdGlvbiBpZiBpdCBleGlzdHMuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvCiAgLy8vIGNhbGwgW3BhcnNlVmFyaWFibGVzRGVjbGFyYXRpb25SZXN0XSB0byBmaW5pc2ggcGFyc2luZyB0aGUgbG9jYWwgdmFyaWFibGUKICAvLy8gZGVjbGFyYXRpb24uIElmIGEgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gaXMgbm90IGZvdW5kIHRoZW4gdGhpcwogIC8vLyBtZXRob2Qgd2lsbCByZXR1cm4gW3N0YXJ0XS4KICBUb2tlbiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uKGZpbmFsIFRva2VuIHN0YXJ0LAogICAgICBbYm9vbCBvbmx5UGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uU3RhcnQgPSBmYWxzZV0pIHsKICAgIFRva2VuIHRva2VuID0gc3RhcnQ7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnQCcsIG5leHQpKSB7CiAgICAgIHRva2VuID0gcGFyc2VNZXRhZGF0YVN0YXIodG9rZW4pOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIH0KCiAgICBUb2tlbiBsYXRlVG9rZW47CiAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3Q7CgogICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgaWYgKG9wdGlvbmFsKCd2YXInLCBuZXh0KSB8fAogICAgICAgICAgb3B0aW9uYWwoJ2ZpbmFsJywgbmV4dCkgfHwKICAgICAgICAgIG9wdGlvbmFsKCdjb25zdCcsIG5leHQpKSB7CiAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdsYXRlJywgbmV4dCkpIHsKICAgICAgICBsYXRlVG9rZW4gPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgaWYgKGlzTW9kaWZpZXIobmV4dCkgJiYgb3B0aW9uYWwoJ2ZpbmFsJywgbmV4dCkpIHsKICAgICAgICAgIHZhckZpbmFsT3JDb25zdCA9IHRva2VuID0gbmV4dDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIE1vZGlmaWVyUmVjb3ZlcnlDb250ZXh0IGNvbnRleHQgPSBuZXcgTW9kaWZpZXJSZWNvdmVyeUNvbnRleHQodGhpcykKICAgICAgICAgIC4ubGF0ZVRva2VuID0gbGF0ZVRva2VuCiAgICAgICAgICAuLnZhckZpbmFsT3JDb25zdCA9IHZhckZpbmFsT3JDb25zdDsKCiAgICAgICAgdG9rZW4gPSBjb250ZXh0LnBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbk1vZGlmaWVycyh0b2tlbik7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CgogICAgICAgIGxhdGVUb2tlbiA9IGNvbnRleHQubGF0ZVRva2VuOwogICAgICAgIHZhckZpbmFsT3JDb25zdCA9IGNvbnRleHQudmFyRmluYWxPckNvbnN0OwoKICAgICAgICBjb250ZXh0ID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uQWZ0ZXJNb2RpZmllcnModG9rZW4sIHN0YXJ0LAogICAgICAgIGxhdGVUb2tlbiwgdmFyRmluYWxPckNvbnN0LCBudWxsLCBvbmx5UGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uU3RhcnQpOwogIH0KCiAgLy8vIFNlZSBbcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbl0KICBUb2tlbiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uQWZ0ZXJNb2RpZmllcnMoCiAgICAgIGZpbmFsIFRva2VuIGJlZm9yZVR5cGUsCiAgICAgIGZpbmFsIFRva2VuIHN0YXJ0LAogICAgICBmaW5hbCBUb2tlbiBsYXRlVG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwKICAgICAgVHlwZUluZm8gdHlwZUluZm8sCiAgICAgIGJvb2wgb25seVBhcnNlVmFyaWFibGVEZWNsYXJhdGlvblN0YXJ0KSB7CiAgICB0eXBlSW5mbyA/Pz0gY29tcHV0ZVR5cGUoYmVmb3JlVHlwZSwgZmFsc2UpOwoKICAgIFRva2VuIHRva2VuID0gdHlwZUluZm8uc2tpcFR5cGUoYmVmb3JlVHlwZSk7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKCiAgICBpZiAob25seVBhcnNlVmFyaWFibGVEZWNsYXJhdGlvblN0YXJ0KSB7CiAgICAgIGlmIChsYXRlVG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgIGxhdGVUb2tlbiwgZmFzdGEudGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAobG9va3NMaWtlTG9jYWxGdW5jdGlvbihuZXh0KSkgewogICAgICAgIC8vIFBhcnNlIGEgbG9jYWwgZnVuY3Rpb24gZGVjbGFyYXRpb24uCiAgICAgICAgaWYgKHZhckZpbmFsT3JDb25zdCAhPSBudWxsKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwgZmFzdGEudGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXIpOwogICAgICAgIH0gZWxzZSBpZiAobGF0ZVRva2VuICE9IG51bGwpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgICAgbGF0ZVRva2VuLCBmYXN0YS50ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllcik7CiAgICAgICAgfQogICAgICAgIGlmICghb3B0aW9uYWwoJ0AnLCBzdGFydC5uZXh0KSkgewogICAgICAgICAgbGlzdGVuZXIuYmVnaW5NZXRhZGF0YVN0YXIoc3RhcnQubmV4dCk7CiAgICAgICAgICBsaXN0ZW5lci5lbmRNZXRhZGF0YVN0YXIoMCk7CiAgICAgICAgfQogICAgICAgIFRva2VuIGJlZm9yZUZvcm1hbHMgPQogICAgICAgICAgICBjb21wdXRlVHlwZVBhcmFtT3JBcmcobmV4dCkucGFyc2VWYXJpYWJsZXMobmV4dCwgdGhpcyk7CiAgICAgICAgbGlzdGVuZXIuYmVnaW5Mb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb24oc3RhcnQubmV4dCk7CiAgICAgICAgdG9rZW4gPSB0eXBlSW5mby5wYXJzZVR5cGUoYmVmb3JlVHlwZSwgdGhpcyk7CiAgICAgICAgcmV0dXJuIHBhcnNlTmFtZWRGdW5jdGlvblJlc3QodG9rZW4sIHN0YXJ0Lm5leHQsIGJlZm9yZUZvcm1hbHMsIGZhbHNlKTsKICAgICAgfQogICAgfQoKICAgIGlmIChiZWZvcmVUeXBlID09IHN0YXJ0ICYmCiAgICAgICAgdHlwZUluZm8uaXNOdWxsYWJsZSAmJgogICAgICAgIHR5cGVJbmZvLmNvdWxkQmVFeHByZXNzaW9uKSB7CiAgICAgIGFzc2VydChvcHRpb25hbCgnPycsIHRva2VuKSk7CiAgICAgIGFzc2VydChuZXh0LmlzSWRlbnRpZmllcik7CiAgICAgIFRva2VuIGFmdGVySWRlbnRpZmllciA9IG5leHQubmV4dDsKICAgICAgLy8KICAgICAgLy8gZm91bmQgPHR5cGVyZWY+IGA/YCA8aWRlbnRpZmllcj4KICAgICAgLy8gd2l0aCBubyBhbm5vdGF0aW9ucyBvciBtb2RpZmllcnMgcHJlY2VlZGluZyBpdAogICAgICAvLwogICAgICBpZiAob3B0aW9uYWwoJz0nLCBhZnRlcklkZW50aWZpZXIpKSB7CiAgICAgICAgLy8KICAgICAgICAvLyBsb29rIHBhc3QgdGhlIG5leHQgZXhwcmVzc2lvbgogICAgICAgIC8vIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIHBhcnQgb2YgYSBjb25kaXRpb25hbCBleHByZXNzaW9uCiAgICAgICAgLy8KICAgICAgICBmaW5hbCBvcmlnaW5hbExpc3RlbmVyID0gbGlzdGVuZXI7CiAgICAgICAgbGlzdGVuZXIgPSBuZXcgRm9yd2FyZGluZ0xpc3RlbmVyKCk7CiAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IGNvbnNpZGVyIHVzaW5nIFRva2VuU3RyZWFtR2hvc3RXcml0ZXIgaGVyZQogICAgICAgIFRva2VuIGFmdGVyRXhwcmVzc2lvbiA9CiAgICAgICAgICAgIHBhcnNlRXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlKGFmdGVySWRlbnRpZmllcikubmV4dDsKICAgICAgICBsaXN0ZW5lciA9IG9yaWdpbmFsTGlzdGVuZXI7CgogICAgICAgIGlmIChvcHRpb25hbCgnOicsIGFmdGVyRXhwcmVzc2lvbikpIHsKICAgICAgICAgIC8vIExvb2tzIGxpa2UgcGFydCBvZiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCiAgICAgICAgICAvLyBEcm9wIHRoZSB0eXBlIGluZm9ybWF0aW9uIGFuZCByZXNldCB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbi4KICAgICAgICAgIHR5cGVJbmZvID0gbm9UeXBlOwogICAgICAgICAgdG9rZW4gPSBzdGFydDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghYWZ0ZXJJZGVudGlmaWVyLmlzS2V5d29yZCAmJgogICAgICAgICAgIWlzT25lT2ZPckVvZihhZnRlcklkZW50aWZpZXIsIGNvbnN0IFsnOycsICcsJywgJyknXSkpIHsKICAgICAgICAvLyBMb29rcyBsaWtlIHBhcnQgb2YgYSBjb25kaXRpb25hbCBleHByZXNzaW9uLgogICAgICAgIC8vIERyb3AgdGhlIHR5cGUgaW5mb3JtYXRpb24gYW5kIHJlc2V0IHRoZSBsYXN0IGNvbnN1bWVkIHRva2VuLgogICAgICAgIHR5cGVJbmZvID0gbm9UeXBlOwogICAgICAgIHRva2VuID0gc3RhcnQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodG9rZW4gPT0gc3RhcnQpIHsKICAgICAgLy8gSWYgbm8gYW5ub3RhdGlvbiwgbW9kaWZpZXIsIG9yIHR5cGUsIGFuZCB0aGlzIGlzIG5vdCBhIGxvY2FsIGZ1bmN0aW9uCiAgICAgIC8vIHRoZW4gdGhpcyBtdXN0IGJlIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50LgogICAgICBpZiAob25seVBhcnNlVmFyaWFibGVEZWNsYXJhdGlvblN0YXJ0KSB7CiAgICAgICAgcmV0dXJuIHN0YXJ0OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoc3RhcnQpOwogICAgICB9CiAgICB9CgogICAgaWYgKG5leHQudHlwZS5pc0J1aWx0SW4gJiYKICAgICAgICBiZWZvcmVUeXBlID09IHN0YXJ0ICYmCiAgICAgICAgdHlwZUluZm8uY291bGRCZUV4cHJlc3Npb24pIHsKICAgICAgLy8gRGV0ZWN0IGV4cHJlc3Npb25zIHN1Y2ggYXMgaWRlbnRpZmllciBgYXNgIGlkZW50aWZpZXIKICAgICAgLy8gYW5kIHRyZWF0IHRob3NlIGFzIGV4cHJlc3Npb25zLgogICAgICBpZiAob3B0aW9uYWwoJ2FzJywgbmV4dCkgfHwgb3B0aW9uYWwoJ2lzJywgbmV4dCkpIHsKICAgICAgICBpbnQga2luZCA9IG5leHQubmV4dC5raW5kOwogICAgICAgIGlmIChFUV9UT0tFTiAhPSBraW5kICYmCiAgICAgICAgICAgIFNFTUlDT0xPTl9UT0tFTiAhPSBraW5kICYmCiAgICAgICAgICAgIENPTU1BX1RPS0VOICE9IGtpbmQpIHsKICAgICAgICAgIGlmIChvbmx5UGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uU3RhcnQpIHsKICAgICAgICAgICAgaWYgKCFvcHRpb25hbCgnaW4nLCBuZXh0Lm5leHQpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KHN0YXJ0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAobmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgLy8gT25seSByZXBvcnQgdGhlc2UgZXJyb3JzIGlmIHRoZXJlIGlzIGFuIGlkZW50aWZpZXIuIElmIHRoZXJlIGlzIG5vdCBhbgogICAgICAvLyBpZGVudGlmaWVyLCB0aGVuIGFsbG93IGVuc3VyZUlkZW50aWZpZXIgdG8gcmVwb3J0IGFuIGVycm9yCiAgICAgIC8vIGFuZCBkb24ndCByZXBvcnQgZXJyb3JzIGhlcmUuCiAgICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgPT0gbnVsbCkgewogICAgICAgIGlmICh0eXBlSW5mbyA9PSBub1R5cGUgJiYgbGF0ZVRva2VuID09IG51bGwpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZU1pc3NpbmdDb25zdEZpbmFsVmFyT3JUeXBlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3ZhcicsIHZhckZpbmFsT3JDb25zdCkpIHsKICAgICAgICBpZiAodHlwZUluZm8gIT0gbm9UeXBlKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHZhckZpbmFsT3JDb25zdCwgZmFzdGEubWVzc2FnZVR5cGVBZnRlclZhcik7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKCFvcHRpb25hbCgnQCcsIHN0YXJ0Lm5leHQpKSB7CiAgICAgIGxpc3RlbmVyLmJlZ2luTWV0YWRhdGFTdGFyKHN0YXJ0Lm5leHQpOwogICAgICBsaXN0ZW5lci5lbmRNZXRhZGF0YVN0YXIoMCk7CiAgICB9CiAgICB0b2tlbiA9IHR5cGVJbmZvLnBhcnNlVHlwZShiZWZvcmVUeXBlLCB0aGlzKTsKICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgbGlzdGVuZXIuYmVnaW5WYXJpYWJsZXNEZWNsYXJhdGlvbihuZXh0LCBsYXRlVG9rZW4sIHZhckZpbmFsT3JDb25zdCk7CiAgICBpZiAoIW9ubHlQYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25TdGFydCkgewogICAgICB0b2tlbiA9IHBhcnNlVmFyaWFibGVzRGVjbGFyYXRpb25SZXN0KHRva2VuLCB0cnVlKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlVmFyaWFibGVzRGVjbGFyYXRpb25SZXN0KFRva2VuIHRva2VuLCBib29sIGVuZFdpdGhTZW1pY29sb24pIHsKICAgIGludCBjb3VudCA9IDE7CiAgICB0b2tlbiA9IHBhcnNlT3B0aW9uYWxseUluaXRpYWxpemVkSWRlbnRpZmllcih0b2tlbik7CiAgICB3aGlsZSAob3B0aW9uYWwoJywnLCB0b2tlbi5uZXh0KSkgewogICAgICB0b2tlbiA9IHBhcnNlT3B0aW9uYWxseUluaXRpYWxpemVkSWRlbnRpZmllcih0b2tlbi5uZXh0KTsKICAgICAgKytjb3VudDsKICAgIH0KICAgIGlmIChlbmRXaXRoU2VtaWNvbG9uKSB7CiAgICAgIFRva2VuIHNlbWljb2xvbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICAgIGxpc3RlbmVyLmVuZFZhcmlhYmxlc0RlY2xhcmF0aW9uKGNvdW50LCBzZW1pY29sb24pOwogICAgICByZXR1cm4gc2VtaWNvbG9uOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIuZW5kVmFyaWFibGVzRGVjbGFyYXRpb24oY291bnQsIG51bGwpOwogICAgICByZXR1cm4gdG9rZW47CiAgICB9CiAgfQoKICBUb2tlbiBwYXJzZU9wdGlvbmFsbHlJbml0aWFsaXplZElkZW50aWZpZXIoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5hbWVUb2tlbiA9CiAgICAgICAgZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQubG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKTsKICAgIGxpc3RlbmVyLmJlZ2luSW5pdGlhbGl6ZWRJZGVudGlmaWVyKG5hbWVUb2tlbik7CiAgICB0b2tlbiA9IHBhcnNlVmFyaWFibGVJbml0aWFsaXplck9wdChuYW1lVG9rZW4pOwogICAgbGlzdGVuZXIuZW5kSW5pdGlhbGl6ZWRJZGVudGlmaWVyKG5hbWVUb2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGlmU3RhdGVtZW50OgogIC8vLyAgICdpZicgJygnIGV4cHJlc3Npb24gJyknIHN0YXRlbWVudCAoJ2Vsc2UnIHN0YXRlbWVudCk/CiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VJZlN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gaWZUb2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2lmJywgaWZUb2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5JZlN0YXRlbWVudChpZlRva2VuKTsKICAgIHRva2VuID0gZW5zdXJlUGFyZW50aGVzaXplZENvbmRpdGlvbihpZlRva2VuKTsKICAgIGxpc3RlbmVyLmJlZ2luVGhlblN0YXRlbWVudCh0b2tlbi5uZXh0KTsKICAgIHRva2VuID0gcGFyc2VTdGF0ZW1lbnQodG9rZW4pOwogICAgbGlzdGVuZXIuZW5kVGhlblN0YXRlbWVudCh0b2tlbik7CiAgICBUb2tlbiBlbHNlVG9rZW4gPSBudWxsOwogICAgaWYgKG9wdGlvbmFsKCdlbHNlJywgdG9rZW4ubmV4dCkpIHsKICAgICAgZWxzZVRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgbGlzdGVuZXIuYmVnaW5FbHNlU3RhdGVtZW50KGVsc2VUb2tlbik7CiAgICAgIHRva2VuID0gcGFyc2VTdGF0ZW1lbnQoZWxzZVRva2VuKTsKICAgICAgbGlzdGVuZXIuZW5kRWxzZVN0YXRlbWVudChlbHNlVG9rZW4pOwogICAgfQogICAgbGlzdGVuZXIuZW5kSWZTdGF0ZW1lbnQoaWZUb2tlbiwgZWxzZVRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gZm9yU3RhdGVtZW50OgogIC8vLyAgICdhd2FpdCc/ICdmb3InICcoJyBmb3JMb29wUGFydHMgJyknIHN0YXRlbWVudAogIC8vLyA7CiAgLy8vCiAgLy8vICBmb3JMb29wUGFydHM6CiAgLy8vICAgICAgbG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uICc7JyBleHByZXNzaW9uPyAnOycgZXhwcmVzc2lvbkxpc3Q/CiAgLy8vICAgIHwgZXhwcmVzc2lvbj8gJzsnIGV4cHJlc3Npb24/ICc7JyBleHByZXNzaW9uTGlzdD8KICAvLy8gICAgfCBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gJ2luJyBleHByZXNzaW9uCiAgLy8vICAgIHwgaWRlbnRpZmllciAnaW4nIGV4cHJlc3Npb24KICAvLy8gOwogIC8vLwogIC8vLyBmb3JJbml0aWFsaXplclN0YXRlbWVudDoKICAvLy8gICBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gfAogIC8vLyAgIGV4cHJlc3Npb24/ICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRm9yU3RhdGVtZW50KFRva2VuIHRva2VuLCBUb2tlbiBhd2FpdFRva2VuKSB7CiAgICBUb2tlbiBmb3JUb2tlbiA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChhd2FpdFRva2VuID09IG51bGwgfHwgb3B0aW9uYWwoJ2F3YWl0JywgYXdhaXRUb2tlbikpOwogICAgYXNzZXJ0KG9wdGlvbmFsKCdmb3InLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5Gb3JTdGF0ZW1lbnQoZm9yVG9rZW4pOwoKICAgIHRva2VuID0gcGFyc2VGb3JMb29wUGFydHNTdGFydChhd2FpdFRva2VuLCBmb3JUb2tlbik7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIHRva2VuID0gcGFyc2VGb3JMb29wUGFydHNNaWQodG9rZW4sIGF3YWl0VG9rZW4sIGZvclRva2VuKTsKICAgIGlmIChvcHRpb25hbCgnaW4nLCB0b2tlbi5uZXh0KSB8fCBvcHRpb25hbCgnOicsIHRva2VuLm5leHQpKSB7CiAgICAgIC8vIFByb2Nlc3MgYGZvciAoIC4uLiBpbiAuLi4gKWAKICAgICAgcmV0dXJuIHBhcnNlRm9ySW5SZXN0KHRva2VuLCBhd2FpdFRva2VuLCBmb3JUb2tlbiwgaWRlbnRpZmllcik7CiAgICB9IGVsc2UgewogICAgICAvLyBQcm9jZXNzIGBmb3IgKCAuLi4gOyAuLi4gOyAuLi4gKWAKICAgICAgcmV0dXJuIHBhcnNlRm9yUmVzdChhd2FpdFRva2VuLCB0b2tlbiwgZm9yVG9rZW4pOwogICAgfQogIH0KCiAgLy8vIFBhcnNlIHRoZSBzdGFydCBvZiBhIGZvciBsb29wIGNvbnRyb2wgc3RydWN0dXJlCiAgLy8vIGZyb20gdGhlIG9wZW4gcGFyZW50aGVzaXMgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGlkZW50aWZpZXIuCiAgVG9rZW4gcGFyc2VGb3JMb29wUGFydHNTdGFydChUb2tlbiBhd2FpdFRva2VuLCBUb2tlbiBmb3JUb2tlbikgewogICAgVG9rZW4gbGVmdFBhcmVudGhlc2lzID0gZm9yVG9rZW4ubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJygnLCBsZWZ0UGFyZW50aGVzaXMpKSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBsZWZ0UGFyZW50aGVzaXMsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnKCcpKTsKCiAgICAgIEJlZ2luVG9rZW4gb3BlblBhcmVuID0gcmV3cml0ZXIuaW5zZXJ0VG9rZW4oCiAgICAgICAgICBmb3JUb2tlbiwKICAgICAgICAgIG5ldyBTeW50aGV0aWNCZWdpblRva2VuKAogICAgICAgICAgICAgIFRva2VuVHlwZS5PUEVOX1BBUkVOLCBsZWZ0UGFyZW50aGVzaXMub2Zmc2V0KSk7CgogICAgICBUb2tlbiB0b2tlbjsKICAgICAgaWYgKGF3YWl0VG9rZW4gIT0gbnVsbCkgewogICAgICAgIHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihvcGVuUGFyZW4pOwogICAgICAgIHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljS2V5d29yZCh0b2tlbiwgS2V5d29yZC5JTik7CiAgICAgICAgdG9rZW4gPSByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbiA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY1Rva2VuKG9wZW5QYXJlbiwgVG9rZW5UeXBlLlNFTUlDT0xPTik7CiAgICAgICAgdG9rZW4gPSByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNUb2tlbih0b2tlbiwgVG9rZW5UeXBlLlNFTUlDT0xPTik7CiAgICAgIH0KCiAgICAgIG9wZW5QYXJlbi5lbmRHcm91cCA9IHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0VG9rZW4odG9rZW4sCiAgICAgICAgICBuZXcgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLkNMT1NFX1BBUkVOLCBsZWZ0UGFyZW50aGVzaXMub2Zmc2V0KSk7CgogICAgICB0b2tlbiA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4pOwogICAgICByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNUb2tlbih0b2tlbiwgVG9rZW5UeXBlLlNFTUlDT0xPTik7CgogICAgICBsZWZ0UGFyZW50aGVzaXMgPSBvcGVuUGFyZW47CiAgICB9CgogICAgLy8gUGFzcyBgdHJ1ZWAgc28gdGhhdCB0aGUgW3BhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb25dIG9ubHkKICAgIC8vIHBhcnNlcyB0aGUgbWV0YWRhdGEsIG1vZGlmaWVycywgYW5kIHR5cGUgb2YgYSBsb2NhbCB2YXJpYWJsZQogICAgLy8gZGVjbGFyYXRpb24gaWYgaXQgZXhpc3RzLiBUaGlzIGVuYWJsZXMgY2FwdHVyaW5nIFtiZWZvcmVJZGVudGlmaWVyXQogICAgLy8gZm9yIGxhdGVyIGVycm9yIHJlcG9ydGluZy4KICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uKGxlZnRQYXJlbnRoZXNpcywgdHJ1ZSk7CiAgfQoKICAvLy8gUGFyc2UgdGhlIHJlbWFpbmRlciBvZiB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24KICAvLy8gb3IgYW4gZXhwcmVzc2lvbiBpZiBubyBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiB3YXMgZm91bmQuCiAgVG9rZW4gcGFyc2VGb3JMb29wUGFydHNNaWQoVG9rZW4gdG9rZW4sIFRva2VuIGF3YWl0VG9rZW4sIFRva2VuIGZvclRva2VuKSB7CiAgICBpZiAodG9rZW4gIT0gZm9yVG9rZW4ubmV4dCkgewogICAgICB0b2tlbiA9IHBhcnNlVmFyaWFibGVzRGVjbGFyYXRpb25SZXN0KHRva2VuLCBmYWxzZSk7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUZvckluaXRpYWxpemVyTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKHRva2VuKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJzsnLCB0b2tlbi5uZXh0KSkgewogICAgICBsaXN0ZW5lci5oYW5kbGVGb3JJbml0aWFsaXplckVtcHR5U3RhdGVtZW50KHRva2VuLm5leHQpOwogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgICBsaXN0ZW5lci5oYW5kbGVGb3JJbml0aWFsaXplckV4cHJlc3Npb25TdGF0ZW1lbnQodG9rZW4pOwogICAgfQogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJzsnLCBuZXh0KSkgewogICAgICBpZiAoYXdhaXRUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihhd2FpdFRva2VuLCBmYXN0YS5tZXNzYWdlSW52YWxpZEF3YWl0Rm9yKTsKICAgICAgfQogICAgfSBlbHNlIGlmICghb3B0aW9uYWwoJ2luJywgbmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgaWYgKG9wdGlvbmFsKCc6JywgbmV4dCkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VDb2xvbkluUGxhY2VPZkluKTsKICAgICAgfSBlbHNlIGlmIChhd2FpdFRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBuZXh0LCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJ2luJykpOwogICAgICAgIHRva2VuLnNldE5leHQoCiAgICAgICAgICAgIG5ldyBTeW50aGV0aWNLZXl3b3JkVG9rZW4oS2V5d29yZC5JTiwgbmV4dC5vZmZzZXQpLi5zZXROZXh0KG5leHQpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFRoaXMgbWV0aG9kIHBhcnNlcyB0aGUgcG9ydGlvbiBvZiB0aGUgZm9yTG9vcFBhcnRzIHRoYXQgc3RhcnRzIHdpdGggdGhlCiAgLy8vIGZpcnN0IHNlbWljb2xvbiAodGhlIG9uZSB0aGF0IHRlcm1pbmF0ZXMgdGhlIGZvckluaXRpYWxpemVyU3RhdGVtZW50KS4KICAvLy8KICAvLy8gYGBgCiAgLy8vICBmb3JMb29wUGFydHM6CiAgLy8vICAgICAgbG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uICc7JyBleHByZXNzaW9uPyAnOycgZXhwcmVzc2lvbkxpc3Q/CiAgLy8vICAgIHwgZXhwcmVzc2lvbj8gJzsnIGV4cHJlc3Npb24/ICc7JyBleHByZXNzaW9uTGlzdD8KICAvLy8gICAgfCBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gJ2luJyBleHByZXNzaW9uCiAgLy8vICAgIHwgaWRlbnRpZmllciAnaW4nIGV4cHJlc3Npb24KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUZvclJlc3QoVG9rZW4gYXdhaXRUb2tlbiwgVG9rZW4gdG9rZW4sIFRva2VuIGZvclRva2VuKSB7CiAgICB0b2tlbiA9IHBhcnNlRm9yTG9vcFBhcnRzUmVzdCh0b2tlbiwgZm9yVG9rZW4sIGF3YWl0VG9rZW4pOwogICAgbGlzdGVuZXIuYmVnaW5Gb3JTdGF0ZW1lbnRCb2R5KHRva2VuLm5leHQpOwogICAgTG9vcFN0YXRlIHNhdmVkTG9vcFN0YXRlID0gbG9vcFN0YXRlOwogICAgbG9vcFN0YXRlID0gTG9vcFN0YXRlLkluc2lkZUxvb3A7CiAgICB0b2tlbiA9IHBhcnNlU3RhdGVtZW50KHRva2VuKTsKICAgIGxvb3BTdGF0ZSA9IHNhdmVkTG9vcFN0YXRlOwogICAgbGlzdGVuZXIuZW5kRm9yU3RhdGVtZW50Qm9keSh0b2tlbi5uZXh0KTsKICAgIGxpc3RlbmVyLmVuZEZvclN0YXRlbWVudCh0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlRm9yTG9vcFBhcnRzUmVzdChUb2tlbiB0b2tlbiwgVG9rZW4gZm9yVG9rZW4sIFRva2VuIGF3YWl0VG9rZW4pIHsKICAgIFRva2VuIGxlZnRQYXJlbnRoZXNpcyA9IGZvclRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2ZvcicsIGZvclRva2VuKSk7CiAgICBhc3NlcnQob3B0aW9uYWwoJygnLCBsZWZ0UGFyZW50aGVzaXMpKTsKCiAgICBUb2tlbiBsZWZ0U2VwYXJhdG9yID0gZW5zdXJlU2VtaWNvbG9uKHRva2VuKTsKICAgIGlmIChvcHRpb25hbCgnOycsIGxlZnRTZXBhcmF0b3IubmV4dCkpIHsKICAgICAgdG9rZW4gPSBwYXJzZUVtcHR5U3RhdGVtZW50KGxlZnRTZXBhcmF0b3IpOwogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQobGVmdFNlcGFyYXRvcik7CiAgICB9CiAgICBpbnQgZXhwcmVzc2lvbkNvdW50ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJyknLCBuZXh0KSkgewogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbih0b2tlbikubmV4dDsKICAgICAgKytleHByZXNzaW9uQ291bnQ7CiAgICAgIGlmICghb3B0aW9uYWwoJywnLCB0b2tlbikpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKHRva2VuICE9IGxlZnRQYXJlbnRoZXNpcy5lbmRHcm91cCkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKHRva2VuLCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgIHRva2VuID0gbGVmdFBhcmVudGhlc2lzLmVuZEdyb3VwOwogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlRm9yTG9vcFBhcnRzKAogICAgICAgIGZvclRva2VuLCBsZWZ0UGFyZW50aGVzaXMsIGxlZnRTZXBhcmF0b3IsIGV4cHJlc3Npb25Db3VudCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBwb3J0aW9uIG9mIHRoZSBmb3JMb29wUGFydHMgdGhhdCBzdGFydHMgd2l0aCB0aGUKICAvLy8ga2V5d29yZCAnaW4nLiBGb3IgdGhlIHNha2Ugb2YgcmVjb3ZlcnksIHdlIGFjY2VwdCBhIGNvbG9uIGluIHBsYWNlIG9mIHRoZQogIC8vLyBrZXl3b3JkLgogIC8vLwogIC8vLyBgYGAKICAvLy8gIGZvckxvb3BQYXJ0czoKICAvLy8gICAgICBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gJzsnIGV4cHJlc3Npb24/ICc7JyBleHByZXNzaW9uTGlzdD8KICAvLy8gICAgfCBleHByZXNzaW9uPyAnOycgZXhwcmVzc2lvbj8gJzsnIGV4cHJlc3Npb25MaXN0PwogIC8vLyAgICB8IGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiAnaW4nIGV4cHJlc3Npb24KICAvLy8gICAgfCBpZGVudGlmaWVyICdpbicgZXhwcmVzc2lvbgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRm9ySW5SZXN0KAogICAgICBUb2tlbiB0b2tlbiwgVG9rZW4gYXdhaXRUb2tlbiwgVG9rZW4gZm9yVG9rZW4sIFRva2VuIGlkZW50aWZpZXIpIHsKICAgIHRva2VuID0gcGFyc2VGb3JJbkxvb3BQYXJ0c1Jlc3QodG9rZW4sIGF3YWl0VG9rZW4sIGZvclRva2VuLCBpZGVudGlmaWVyKTsKICAgIGxpc3RlbmVyLmJlZ2luRm9ySW5Cb2R5KHRva2VuLm5leHQpOwogICAgTG9vcFN0YXRlIHNhdmVkTG9vcFN0YXRlID0gbG9vcFN0YXRlOwogICAgbG9vcFN0YXRlID0gTG9vcFN0YXRlLkluc2lkZUxvb3A7CiAgICB0b2tlbiA9IHBhcnNlU3RhdGVtZW50KHRva2VuKTsKICAgIGxvb3BTdGF0ZSA9IHNhdmVkTG9vcFN0YXRlOwogICAgbGlzdGVuZXIuZW5kRm9ySW5Cb2R5KHRva2VuLm5leHQpOwogICAgbGlzdGVuZXIuZW5kRm9ySW4odG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUZvckluTG9vcFBhcnRzUmVzdCgKICAgICAgVG9rZW4gdG9rZW4sIFRva2VuIGF3YWl0VG9rZW4sIFRva2VuIGZvclRva2VuLCBUb2tlbiBpZGVudGlmaWVyKSB7CiAgICBUb2tlbiBpbktleXdvcmQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdmb3InLCBmb3JUb2tlbikpOwogICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgZm9yVG9rZW4ubmV4dCkpOwogICAgYXNzZXJ0KG9wdGlvbmFsKCdpbicsIGluS2V5d29yZCkgfHwgb3B0aW9uYWwoJzonLCBpbktleXdvcmQpKTsKCiAgICBpZiAoIWlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWZpZXIgIT0gdG9rZW4pIHsKICAgICAgaWYgKG9wdGlvbmFsKCc9JywgaWRlbnRpZmllci5uZXh0KSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIGlkZW50aWZpZXIubmV4dCwgZmFzdGEubWVzc2FnZUluaXRpYWxpemVkVmFyaWFibGVJbkZvckVhY2gpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgIGlkZW50aWZpZXIubmV4dCwgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGF3YWl0VG9rZW4gIT0gbnVsbCAmJiAhaW5Bc3luYykgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogY29uc2lkZXIgcmVwb3J0aW5nIHRoZSBlcnJvciBvbiBhd2FpdFRva2VuCiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoaW5LZXl3b3JkLCBmYXN0YS5tZXNzYWdlQXdhaXRGb3JOb3RBc3luYyk7CiAgICB9CgogICAgbGlzdGVuZXIuYmVnaW5Gb3JJbkV4cHJlc3Npb24oaW5LZXl3b3JkLm5leHQpOwogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24oaW5LZXl3b3JkKTsKICAgIHRva2VuID0gZW5zdXJlQ2xvc2VQYXJlbih0b2tlbiwgZm9yVG9rZW4ubmV4dCk7CiAgICBsaXN0ZW5lci5lbmRGb3JJbkV4cHJlc3Npb24odG9rZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlRm9ySW5Mb29wUGFydHMoCiAgICAgICAgYXdhaXRUb2tlbiwgZm9yVG9rZW4sIGZvclRva2VuLm5leHQsIGluS2V5d29yZCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHdoaWxlU3RhdGVtZW50OgogIC8vLyAgICd3aGlsZScgJygnIGV4cHJlc3Npb24gJyknIHN0YXRlbWVudAogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlV2hpbGVTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIHdoaWxlVG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCd3aGlsZScsIHdoaWxlVG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luV2hpbGVTdGF0ZW1lbnQod2hpbGVUb2tlbik7CiAgICB0b2tlbiA9IGVuc3VyZVBhcmVudGhlc2l6ZWRDb25kaXRpb24od2hpbGVUb2tlbik7CiAgICBsaXN0ZW5lci5iZWdpbldoaWxlU3RhdGVtZW50Qm9keSh0b2tlbi5uZXh0KTsKICAgIExvb3BTdGF0ZSBzYXZlZExvb3BTdGF0ZSA9IGxvb3BTdGF0ZTsKICAgIGxvb3BTdGF0ZSA9IExvb3BTdGF0ZS5JbnNpZGVMb29wOwogICAgdG9rZW4gPSBwYXJzZVN0YXRlbWVudCh0b2tlbik7CiAgICBsb29wU3RhdGUgPSBzYXZlZExvb3BTdGF0ZTsKICAgIGxpc3RlbmVyLmVuZFdoaWxlU3RhdGVtZW50Qm9keSh0b2tlbi5uZXh0KTsKICAgIGxpc3RlbmVyLmVuZFdoaWxlU3RhdGVtZW50KHdoaWxlVG9rZW4sIHRva2VuLm5leHQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBkb1N0YXRlbWVudDoKICAvLy8gICAnZG8nIHN0YXRlbWVudCAnd2hpbGUnICcoJyBleHByZXNzaW9uICcpJyAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZURvV2hpbGVTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGRvVG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdkbycsIGRvVG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luRG9XaGlsZVN0YXRlbWVudChkb1Rva2VuKTsKICAgIGxpc3RlbmVyLmJlZ2luRG9XaGlsZVN0YXRlbWVudEJvZHkoZG9Ub2tlbi5uZXh0KTsKICAgIExvb3BTdGF0ZSBzYXZlZExvb3BTdGF0ZSA9IGxvb3BTdGF0ZTsKICAgIGxvb3BTdGF0ZSA9IExvb3BTdGF0ZS5JbnNpZGVMb29wOwogICAgdG9rZW4gPSBwYXJzZVN0YXRlbWVudChkb1Rva2VuKTsKICAgIGxvb3BTdGF0ZSA9IHNhdmVkTG9vcFN0YXRlOwogICAgbGlzdGVuZXIuZW5kRG9XaGlsZVN0YXRlbWVudEJvZHkodG9rZW4pOwogICAgVG9rZW4gd2hpbGVUb2tlbiA9IHRva2VuLm5leHQ7CiAgICBpZiAoIW9wdGlvbmFsKCd3aGlsZScsIHdoaWxlVG9rZW4pKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICB3aGlsZVRva2VuLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJ3doaWxlJykpOwogICAgICB3aGlsZVRva2VuID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljS2V5d29yZCh0b2tlbiwgS2V5d29yZC5XSElMRSk7CiAgICB9CiAgICB0b2tlbiA9IGVuc3VyZVBhcmVudGhlc2l6ZWRDb25kaXRpb24od2hpbGVUb2tlbik7CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmREb1doaWxlU3RhdGVtZW50KGRvVG9rZW4sIHdoaWxlVG9rZW4sIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gYmxvY2s6CiAgLy8vICAgJ3snIHN0YXRlbWVudCogJ30nCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VCbG9jayhUb2tlbiB0b2tlbiwgU3RyaW5nIGJsb2NrS2luZCkgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbiA9IGVuc3VyZUJsb2NrKHRva2VuLCBudWxsLCBibG9ja0tpbmQpOwogICAgbGlzdGVuZXIuYmVnaW5CbG9jayhiZWdpbik7CiAgICBpbnQgc3RhdGVtZW50Q291bnQgPSAwOwogICAgVG9rZW4gc3RhcnRUb2tlbiA9IHRva2VuLm5leHQ7CiAgICB3aGlsZSAobm90RW9mT3JWYWx1ZSgnfScsIHN0YXJ0VG9rZW4pKSB7CiAgICAgIHRva2VuID0gcGFyc2VTdGF0ZW1lbnQodG9rZW4pOwogICAgICBpZiAoaWRlbnRpY2FsKHRva2VuLm5leHQsIHN0YXJ0VG9rZW4pKSB7CiAgICAgICAgLy8gTm8gcHJvZ3Jlc3Mgd2FzIG1hZGUsIHNvIHdlIHJlcG9ydCB0aGUgY3VycmVudCB0b2tlbiBhcyBiZWluZyBpbnZhbGlkCiAgICAgICAgLy8gYW5kIG1vdmUgZm9yd2FyZC4KICAgICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgdG9rZW4sIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuLndpdGhBcmd1bWVudHModG9rZW4pKTsKICAgICAgfQogICAgICArK3N0YXRlbWVudENvdW50OwogICAgICBzdGFydFRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnfScsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5lbmRCbG9jayhzdGF0ZW1lbnRDb3VudCwgYmVnaW4sIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlSW52YWxpZEJsb2NrKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBiZWdpbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3snLCBiZWdpbikpOwogICAgLy8gUGFyc2UgYW5kIHJlcG9ydCB0aGUgaW52YWxpZCBibG9jaywgYnV0IHN1cHByZXNzIGVycm9ycwogICAgLy8gYmVjYXVzZSBhbiBlcnJvciBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkIGJ5IHRoZSBjYWxsZXIuCiAgICBMaXN0ZW5lciBvcmlnaW5hbExpc3RlbmVyID0gbGlzdGVuZXI7CiAgICBsaXN0ZW5lciA9IG5ldyBGb3J3YXJkaW5nTGlzdGVuZXIobGlzdGVuZXIpLi5mb3J3YXJkRXJyb3JzID0gZmFsc2U7CiAgICAvLyBUaGUgc2Nhbm5lciBlbnN1cmVzIHRoYXQgYHtgIGFsd2F5cyBoYXMgYSBjbG9zaW5nIGB9YC4KICAgIHRva2VuID0gcGFyc2VCbG9jayh0b2tlbiwgbnVsbCk7CiAgICBsaXN0ZW5lciA9IG9yaWdpbmFsTGlzdGVuZXI7CiAgICBsaXN0ZW5lci5oYW5kbGVJbnZhbGlkVG9wTGV2ZWxCbG9jayhiZWdpbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBmb2xsb3dpbmcgdG9rZW5zIGxvb2sgbGlrZSBhbiAnYXdhaXQnIGV4cHJlc3Npb24KICAvLy8gYW5kIG5vdCBhIGxvY2FsIHZhcmlhYmxlIG9yIGxvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgogIGJvb2wgbG9va3NMaWtlQXdhaXRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2F3YWl0JywgdG9rZW4pKTsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKCiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgcGFyc2luZyB0aGUgcG90ZW50aWFsIGV4cHJlc3Npb24gZm9sbG93aW5nCiAgICAvLyB0aGUgYGF3YWl0YCB0b2tlbiBvbmNlIGRvaW5nIHNvIGRvZXMgbm90IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtLgogICAgLy8gRm9yIG5vdywgdXNlIHNpbXBsZSBsb29rIGFoZWFkIGFuZCBlbnN1cmUgbm8gZmFsc2UgcG9zaXRpdmVzLgoKICAgIGlmICh0b2tlbi5pc0lkZW50aWZpZXIpIHsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJygnLCB0b2tlbikpIHsKICAgICAgICB0b2tlbiA9IHRva2VuLmVuZEdyb3VwLm5leHQ7CiAgICAgICAgaWYgKGlzT25lT2YodG9rZW4sIFsnOycsICcuJywgJy4uJywgJz8nLCAnPy4nXSkpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpc09uZU9mKHRva2VuLCBbJy4nLCAnKScsICddJ10pKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBgYGAKICAvLy8gYXdhaXRFeHByZXNzaW9uOgogIC8vLyAgICdhd2FpdCcgdW5hcnlFeHByZXNzaW9uCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VBd2FpdEV4cHJlc3Npb24oVG9rZW4gdG9rZW4sIGJvb2wgYWxsb3dDYXNjYWRlcykgewogICAgVG9rZW4gYXdhaXRUb2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2F3YWl0JywgYXdhaXRUb2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5Bd2FpdEV4cHJlc3Npb24oYXdhaXRUb2tlbik7CiAgICB0b2tlbiA9IHBhcnNlUHJlY2VkZW5jZUV4cHJlc3Npb24oCiAgICAgICAgYXdhaXRUb2tlbiwgUE9TVEZJWF9QUkVDRURFTkNFLCBhbGxvd0Nhc2NhZGVzKTsKICAgIGlmIChpbkFzeW5jKSB7CiAgICAgIGxpc3RlbmVyLmVuZEF3YWl0RXhwcmVzc2lvbihhd2FpdFRva2VuLCB0b2tlbi5uZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgIGZhc3RhLk1lc3NhZ2VDb2RlIGVycm9yQ29kZSA9IGZhc3RhLm1lc3NhZ2VBd2FpdE5vdEFzeW5jOwogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKGF3YWl0VG9rZW4sIGVycm9yQ29kZSk7CiAgICAgIGxpc3RlbmVyLmVuZEludmFsaWRBd2FpdEV4cHJlc3Npb24oYXdhaXRUb2tlbiwgdG9rZW4ubmV4dCwgZXJyb3JDb2RlKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gdGhyb3dFeHByZXNzaW9uOgogIC8vLyAgICd0aHJvdycgZXhwcmVzc2lvbgogIC8vLyA7CiAgLy8vCiAgLy8vIHRocm93RXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlOgogIC8vLyAgICd0aHJvdycgZXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VUaHJvd0V4cHJlc3Npb24oVG9rZW4gdG9rZW4sIGJvb2wgYWxsb3dDYXNjYWRlcykgewogICAgVG9rZW4gdGhyb3dUb2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3Rocm93JywgdGhyb3dUb2tlbikpOwogICAgaWYgKG9wdGlvbmFsKCc7JywgdGhyb3dUb2tlbi5uZXh0KSkgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogRmluZCBhIGJldHRlciB3YXkgdG8gaW50ZXJjZXB0IHRoZSBwYXJzZUV4cHJlc3Npb24KICAgICAgLy8gcmVjb3ZlcnkgdG8gZ2VuZXJhdGUgdGhpcyBlcnJvciBtZXNzYWdlIHJhdGhlciB0aGFuIGV4cGxpY2l0bHkKICAgICAgLy8gY2hlY2tpbmcgdGhlIG5leHQgdG9rZW4gYXMgd2UgYXJlIGRvaW5nIGhlcmUuCiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICB0aHJvd1Rva2VuLm5leHQsIGZhc3RhLm1lc3NhZ2VNaXNzaW5nRXhwcmVzc2lvbkluVGhyb3cpOwogICAgICByZXdyaXRlci5pbnNlcnRUb2tlbigKICAgICAgICAgIHRocm93VG9rZW4sCiAgICAgICAgICBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4oCiAgICAgICAgICAgICAgVG9rZW5UeXBlLlNUUklORywgJyIiJywgdGhyb3dUb2tlbi5uZXh0LmNoYXJPZmZzZXQsIDApKTsKICAgIH0KICAgIHRva2VuID0gYWxsb3dDYXNjYWRlcwogICAgICAgID8gcGFyc2VFeHByZXNzaW9uKHRocm93VG9rZW4pCiAgICAgICAgOiBwYXJzZUV4cHJlc3Npb25XaXRob3V0Q2FzY2FkZSh0aHJvd1Rva2VuKTsKICAgIGxpc3RlbmVyLmhhbmRsZVRocm93RXhwcmVzc2lvbih0aHJvd1Rva2VuLCB0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gcmV0aHJvd1N0YXRlbWVudDoKICAvLy8gICAncmV0aHJvdycgJzsnCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VSZXRocm93U3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiB0aHJvd1Rva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgncmV0aHJvdycsIHRocm93VG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luUmV0aHJvd1N0YXRlbWVudCh0aHJvd1Rva2VuKTsKICAgIHRva2VuID0gZW5zdXJlU2VtaWNvbG9uKHRocm93VG9rZW4pOwogICAgbGlzdGVuZXIuZW5kUmV0aHJvd1N0YXRlbWVudCh0aHJvd1Rva2VuLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHRyeVN0YXRlbWVudDoKICAvLy8gICAndHJ5JyBibG9jayAob25QYXJ0KyBmaW5hbGx5UGFydD8gfCBmaW5hbGx5UGFydCkKICAvLy8gOwogIC8vLwogIC8vLyBvblBhcnQ6CiAgLy8vICAgY2F0Y2hQYXJ0IGJsb2NrIHwKICAvLy8gICAnb24nIHR5cGUgY2F0Y2hQYXJ0PyBibG9jawogIC8vLyA7CiAgLy8vCiAgLy8vIGNhdGNoUGFydDoKICAvLy8gICAnY2F0Y2gnICcoJyBpZGVudGlmaWVyICgnLCcgaWRlbnRpZmllcik/ICcpJwogIC8vLyA7CiAgLy8vCiAgLy8vIGZpbmFsbHlQYXJ0OgogIC8vLyAgICdmaW5hbGx5JyBibG9jawogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlVHJ5U3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiB0cnlLZXl3b3JkID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgndHJ5JywgdHJ5S2V5d29yZCkpOwogICAgbGlzdGVuZXIuYmVnaW5UcnlTdGF0ZW1lbnQodHJ5S2V5d29yZCk7CiAgICBUb2tlbiBsYXN0Q29uc3VtZWQgPSBwYXJzZUJsb2NrKHRyeUtleXdvcmQsICd0cnkgc3RhdGVtZW50Jyk7CiAgICB0b2tlbiA9IGxhc3RDb25zdW1lZC5uZXh0OwogICAgaW50IGNhdGNoQ291bnQgPSAwOwoKICAgIFN0cmluZyB2YWx1ZSA9IHRva2VuLnN0cmluZ1ZhbHVlOwogICAgd2hpbGUgKGlkZW50aWNhbCh2YWx1ZSwgJ2NhdGNoJykgfHwgaWRlbnRpY2FsKHZhbHVlLCAnb24nKSkgewogICAgICBsaXN0ZW5lci5iZWdpbkNhdGNoQ2xhdXNlKHRva2VuKTsKICAgICAgVG9rZW4gb25LZXl3b3JkID0gbnVsbDsKICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ29uJykpIHsKICAgICAgICAvLyAnb24nIHR5cGUgY2F0Y2hQYXJ0PwogICAgICAgIG9uS2V5d29yZCA9IHRva2VuOwogICAgICAgIGxhc3RDb25zdW1lZCA9IGNvbXB1dGVUeXBlKHRva2VuLCB0cnVlKS5lbnN1cmVUeXBlTm90Vm9pZCh0b2tlbiwgdGhpcyk7CiAgICAgICAgdG9rZW4gPSBsYXN0Q29uc3VtZWQubmV4dDsKICAgICAgICB2YWx1ZSA9IHRva2VuLnN0cmluZ1ZhbHVlOwogICAgICB9CiAgICAgIFRva2VuIGNhdGNoS2V5d29yZCA9IG51bGw7CiAgICAgIFRva2VuIGNvbW1hID0gbnVsbDsKICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2NhdGNoJykpIHsKICAgICAgICBjYXRjaEtleXdvcmQgPSB0b2tlbjsKCiAgICAgICAgVG9rZW4gb3BlblBhcmVucyA9IGNhdGNoS2V5d29yZC5uZXh0OwogICAgICAgIGlmICghb3B0aW9uYWwoIigiLCBvcGVuUGFyZW5zKSkgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihvcGVuUGFyZW5zLCBmYXN0YS5tZXNzYWdlQ2F0Y2hTeW50YXgpOwogICAgICAgICAgb3BlblBhcmVucyA9IHJld3JpdGVyLmluc2VydFBhcmVucyhjYXRjaEtleXdvcmQsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgVG9rZW4gZXhjZXB0aW9uTmFtZSA9IG9wZW5QYXJlbnMubmV4dDsKICAgICAgICBpZiAoZXhjZXB0aW9uTmFtZS5raW5kICE9IElERU5USUZJRVJfVE9LRU4pIHsKICAgICAgICAgIGV4Y2VwdGlvbk5hbWUgPSBJZGVudGlmaWVyQ29udGV4dC5jYXRjaFBhcmFtZXRlcgogICAgICAgICAgICAgIC5lbnN1cmVJZGVudGlmaWVyKG9wZW5QYXJlbnMsIHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKG9wdGlvbmFsKCIpIiwgZXhjZXB0aW9uTmFtZS5uZXh0KSkgewogICAgICAgICAgLy8gT0s6IGBjYXRjaCAoaWRlbnRpZmllcilgLgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb21tYSA9IGV4Y2VwdGlvbk5hbWUubmV4dDsKICAgICAgICAgIGlmICghb3B0aW9uYWwoIiwiLCBjb21tYSkpIHsKICAgICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgICAgaWYgKCFleGNlcHRpb25OYW1lLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihjb21tYSwgZmFzdGEubWVzc2FnZUNhdGNoU3ludGF4KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIGluc2VydGluZyBgb25gIGNsYXVzZSBpZgogICAgICAgICAgICAvLyBleGNlcHRpb25OYW1lIGlzIHByZWNlZGVkIGJ5IHR5cGUgYW5kIGZvbGxvd2VkIGJ5IGEgY29tbWEuCiAgICAgICAgICAgIC8vIFRoZW4gdGhpcwogICAgICAgICAgICAvLyAgIH0gY2F0Y2ggKEUgZSwgdCkgewogICAgICAgICAgICAvLyB3aWxsIHJlY292ZXIgdG8KICAgICAgICAgICAgLy8gICB9IG9uIEUgY2F0Y2ggKGUsIHQpIHsKICAgICAgICAgICAgLy8gd2l0aCBhIGRldGFpbGVkIGV4cGxhaW5hdGlvbiBmb3IgdGhlIHVzZXIgaW4gdGhlIGVycm9yCiAgICAgICAgICAgIC8vIGluZGljYXRpbmcgd2hhdCB0aGV5IHNob3VsZCBkbyB0byBmaXggdGhlIGNvZGUuCgogICAgICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgaW5zZXJ0aW5nIHN5bnRoZXRpYyBpZGVudGlmaWVyIGlmCiAgICAgICAgICAgIC8vIGV4Y2VwdGlvbk5hbWUgaXMgYSBub24tc3ludGhldGljIGlkZW50aWZpZXIgZm9sbG93ZWQgYnkgYC5gLgogICAgICAgICAgICAvLyBUaGVuIHRoaXMKICAgICAgICAgICAgLy8gICB9IGNhdGNoICgKICAgICAgICAgICAgLy8gICBlLmYoKTsKICAgICAgICAgICAgLy8gd2lsbCByZWNvdmVyIHRvCiAgICAgICAgICAgIC8vICAgfSBjYXRjaCAoX3NfKSB7fQogICAgICAgICAgICAvLyAgIGUuZigpOwogICAgICAgICAgICAvLyByYXRoZXIgdGhhbgogICAgICAgICAgICAvLyAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICAgIC8vICAgX3NfLmYoKTsKCiAgICAgICAgICAgIGlmIChvcGVuUGFyZW5zLmVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgICAgLy8gVGhlIHNjYW5uZXIgZGlkIG5vdCBwbGFjZSB0aGUgc3ludGhldGljICcpJyBjb3JyZWN0bHkuCiAgICAgICAgICAgICAgcmV3cml0ZXIubW92ZVN5bnRoZXRpYyhleGNlcHRpb25OYW1lLCBvcGVuUGFyZW5zLmVuZEdyb3VwKTsKICAgICAgICAgICAgICBjb21tYSA9IG51bGw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY29tbWEgPQogICAgICAgICAgICAgICAgICByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNUb2tlbihleGNlcHRpb25OYW1lLCBUb2tlblR5cGUuQ09NTUEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY29tbWEgIT0gbnVsbCkgewogICAgICAgICAgICBUb2tlbiB0cmFjZU5hbWUgPSBjb21tYS5uZXh0OwogICAgICAgICAgICBpZiAodHJhY2VOYW1lLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTikgewogICAgICAgICAgICAgIHRyYWNlTmFtZSA9IElkZW50aWZpZXJDb250ZXh0LmNhdGNoUGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgIC5lbnN1cmVJZGVudGlmaWVyKGNvbW1hLCB0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9wdGlvbmFsKCIpIiwgdHJhY2VOYW1lLm5leHQpKSB7CiAgICAgICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgICAgICBpZiAoIXRyYWNlTmFtZS5pc1N5bnRoZXRpYykgewogICAgICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICAgICAgICB0cmFjZU5hbWUubmV4dCwgZmFzdGEubWVzc2FnZUNhdGNoU3ludGF4RXh0cmFQYXJhbWV0ZXJzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKG9wZW5QYXJlbnMuZW5kR3JvdXAuaXNTeW50aGV0aWMpIHsKICAgICAgICAgICAgICAgIC8vIFRoZSBzY2FubmVyIGRpZCBub3QgcGxhY2UgdGhlIHN5bnRoZXRpYyAnKScgY29ycmVjdGx5LgogICAgICAgICAgICAgICAgcmV3cml0ZXIubW92ZVN5bnRoZXRpYyh0cmFjZU5hbWUsIG9wZW5QYXJlbnMuZW5kR3JvdXApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsYXN0Q29uc3VtZWQgPSBwYXJzZUZvcm1hbFBhcmFtZXRlcnMoY2F0Y2hLZXl3b3JkLCBNZW1iZXJLaW5kLkNhdGNoKTsKICAgICAgICB0b2tlbiA9IGxhc3RDb25zdW1lZC5uZXh0OwogICAgICB9CiAgICAgIGxpc3RlbmVyLmVuZENhdGNoQ2xhdXNlKHRva2VuKTsKICAgICAgbGFzdENvbnN1bWVkID0gcGFyc2VCbG9jayhsYXN0Q29uc3VtZWQsICdjYXRjaCBjbGF1c2UnKTsKICAgICAgdG9rZW4gPSBsYXN0Q29uc3VtZWQubmV4dDsKICAgICAgKytjYXRjaENvdW50OwogICAgICBsaXN0ZW5lci5oYW5kbGVDYXRjaEJsb2NrKG9uS2V5d29yZCwgY2F0Y2hLZXl3b3JkLCBjb21tYSk7CiAgICAgIHZhbHVlID0gdG9rZW4uc3RyaW5nVmFsdWU7IC8vIHdoaWxlIGNvbmRpdGlvbgogICAgfQoKICAgIFRva2VuIGZpbmFsbHlLZXl3b3JkID0gbnVsbDsKICAgIGlmIChvcHRpb25hbCgnZmluYWxseScsIHRva2VuKSkgewogICAgICBmaW5hbGx5S2V5d29yZCA9IHRva2VuOwogICAgICBsYXN0Q29uc3VtZWQgPSBwYXJzZUJsb2NrKHRva2VuLCAnZmluYWxseSBjbGF1c2UnKTsKICAgICAgdG9rZW4gPSBsYXN0Q29uc3VtZWQubmV4dDsKICAgICAgbGlzdGVuZXIuaGFuZGxlRmluYWxseUJsb2NrKGZpbmFsbHlLZXl3b3JkKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChjYXRjaENvdW50ID09IDApIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRyeUtleXdvcmQsIGZhc3RhLm1lc3NhZ2VPbmx5VHJ5KTsKICAgICAgfQogICAgfQogICAgbGlzdGVuZXIuZW5kVHJ5U3RhdGVtZW50KGNhdGNoQ291bnQsIHRyeUtleXdvcmQsIGZpbmFsbHlLZXl3b3JkKTsKICAgIHJldHVybiBsYXN0Q29uc3VtZWQ7CiAgfQoKICAvLy8gYGBgCiAgLy8vIHN3aXRjaFN0YXRlbWVudDoKICAvLy8gICAnc3dpdGNoJyBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzd2l0Y2hCbG9jawogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlU3dpdGNoU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBzd2l0Y2hLZXl3b3JkID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnc3dpdGNoJywgc3dpdGNoS2V5d29yZCkpOwogICAgbGlzdGVuZXIuYmVnaW5Td2l0Y2hTdGF0ZW1lbnQoc3dpdGNoS2V5d29yZCk7CiAgICB0b2tlbiA9IGVuc3VyZVBhcmVudGhlc2l6ZWRDb25kaXRpb24oc3dpdGNoS2V5d29yZCk7CiAgICBMb29wU3RhdGUgc2F2ZWRMb29wU3RhdGUgPSBsb29wU3RhdGU7CiAgICBpZiAobG9vcFN0YXRlID09IExvb3BTdGF0ZS5PdXRzaWRlTG9vcCkgewogICAgICBsb29wU3RhdGUgPSBMb29wU3RhdGUuSW5zaWRlU3dpdGNoOwogICAgfQogICAgdG9rZW4gPSBwYXJzZVN3aXRjaEJsb2NrKHRva2VuKTsKICAgIGxvb3BTdGF0ZSA9IHNhdmVkTG9vcFN0YXRlOwogICAgbGlzdGVuZXIuZW5kU3dpdGNoU3RhdGVtZW50KHN3aXRjaEtleXdvcmQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gc3dpdGNoQmxvY2s6CiAgLy8vICAgJ3snIHN3aXRjaENhc2UqIGRlZmF1bHRDYXNlPyAnfScKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVN3aXRjaEJsb2NrKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBiZWdpblN3aXRjaCA9IHRva2VuID0gZW5zdXJlQmxvY2sodG9rZW4sIG51bGwsICdzd2l0Y2ggc3RhdGVtZW50Jyk7CiAgICBsaXN0ZW5lci5iZWdpblN3aXRjaEJsb2NrKGJlZ2luU3dpdGNoKTsKICAgIGludCBjYXNlQ291bnQgPSAwOwogICAgVG9rZW4gZGVmYXVsdEtleXdvcmQgPSBudWxsOwogICAgVG9rZW4gY29sb25BZnRlckRlZmF1bHQgPSBudWxsOwogICAgd2hpbGUgKG5vdEVvZk9yVmFsdWUoJ30nLCB0b2tlbi5uZXh0KSkgewogICAgICBUb2tlbiBiZWdpbkNhc2UgPSB0b2tlbi5uZXh0OwogICAgICBpbnQgZXhwcmVzc2lvbkNvdW50ID0gMDsKICAgICAgaW50IGxhYmVsQ291bnQgPSAwOwogICAgICBUb2tlbiBwZWVrID0gcGVla1Bhc3RMYWJlbHMoYmVnaW5DYXNlKTsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAvLyBMb29wIHVudGlsIHdlIGZpbmQgc29tZXRoaW5nIHRoYXQgY2FuJ3QgYmUgcGFydCBvZiBhIHN3aXRjaCBjYXNlLgogICAgICAgIFN0cmluZyB2YWx1ZSA9IHBlZWsuc3RyaW5nVmFsdWU7CiAgICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2RlZmF1bHQnKSkgewogICAgICAgICAgd2hpbGUgKCFpZGVudGljYWwodG9rZW4ubmV4dCwgcGVlaykpIHsKICAgICAgICAgICAgdG9rZW4gPSBwYXJzZUxhYmVsKHRva2VuKTsKICAgICAgICAgICAgbGFiZWxDb3VudCsrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGRlZmF1bHRLZXl3b3JkICE9IG51bGwpIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICAgIHRva2VuLm5leHQsIGZhc3RhLm1lc3NhZ2VTd2l0Y2hIYXNNdWx0aXBsZURlZmF1bHRzKTsKICAgICAgICAgIH0KICAgICAgICAgIGRlZmF1bHRLZXl3b3JkID0gdG9rZW4ubmV4dDsKICAgICAgICAgIGNvbG9uQWZ0ZXJEZWZhdWx0ID0gdG9rZW4gPSBlbnN1cmVDb2xvbihkZWZhdWx0S2V5d29yZCk7CiAgICAgICAgICBwZWVrID0gdG9rZW4ubmV4dDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnY2FzZScpKSB7CiAgICAgICAgICB3aGlsZSAoIWlkZW50aWNhbCh0b2tlbi5uZXh0LCBwZWVrKSkgewogICAgICAgICAgICB0b2tlbiA9IHBhcnNlTGFiZWwodG9rZW4pOwogICAgICAgICAgICBsYWJlbENvdW50Kys7CiAgICAgICAgICB9CiAgICAgICAgICBUb2tlbiBjYXNlS2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICAgICAgICBpZiAoZGVmYXVsdEtleXdvcmQgIT0gbnVsbCkgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgY2FzZUtleXdvcmQsIGZhc3RhLm1lc3NhZ2VTd2l0Y2hIYXNDYXNlQWZ0ZXJEZWZhdWx0KTsKICAgICAgICAgIH0KICAgICAgICAgIGxpc3RlbmVyLmJlZ2luQ2FzZUV4cHJlc3Npb24oY2FzZUtleXdvcmQpOwogICAgICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24oY2FzZUtleXdvcmQpOwogICAgICAgICAgdG9rZW4gPSBlbnN1cmVDb2xvbih0b2tlbik7CiAgICAgICAgICBsaXN0ZW5lci5lbmRDYXNlRXhwcmVzc2lvbih0b2tlbik7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVDYXNlTWF0Y2goY2FzZUtleXdvcmQsIHRva2VuKTsKICAgICAgICAgIGV4cHJlc3Npb25Db3VudCsrOwogICAgICAgICAgcGVlayA9IHBlZWtQYXN0TGFiZWxzKHRva2VuLm5leHQpOwogICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbkNvdW50ID4gMCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIHBlZWssIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKCJjYXNlIikpOwogICAgICAgICAgVG9rZW4gZW5kR3JvdXAgPSBiZWdpblN3aXRjaC5lbmRHcm91cDsKICAgICAgICAgIHdoaWxlICh0b2tlbi5uZXh0ICE9IGVuZEdyb3VwKSB7CiAgICAgICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgICAgIH0KICAgICAgICAgIHBlZWsgPSBwZWVrUGFzdExhYmVscyh0b2tlbi5uZXh0KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICB0b2tlbiA9IHBhcnNlU3RhdGVtZW50c0luU3dpdGNoQ2FzZSh0b2tlbiwgcGVlaywgYmVnaW5DYXNlLCBsYWJlbENvdW50LAogICAgICAgICAgZXhwcmVzc2lvbkNvdW50LCBkZWZhdWx0S2V5d29yZCwgY29sb25BZnRlckRlZmF1bHQpOwogICAgICArK2Nhc2VDb3VudDsKICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGxpc3RlbmVyLmVuZFN3aXRjaEJsb2NrKGNhc2VDb3VudCwgYmVnaW5Td2l0Y2gsIHRva2VuKTsKICAgIGFzc2VydChvcHRpb25hbCgnfScsIHRva2VuKSk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUGVlayBhZnRlciB0aGUgZm9sbG93aW5nIGxhYmVscyAoaWYgYW55KS4gVGhlIGZvbGxvd2luZyB0b2tlbgogIC8vLyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgbGFiZWxzIGJlbG9uZyB0byBhIHN0YXRlbWVudCBvciBhCiAgLy8vIHN3aXRjaCBjYXNlLgogIFRva2VuIHBlZWtQYXN0TGFiZWxzKFRva2VuIHRva2VuKSB7CiAgICB3aGlsZSAodG9rZW4uaXNJZGVudGlmaWVyICYmIG9wdGlvbmFsKCc6JywgdG9rZW4ubmV4dCkpIHsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUGFyc2Ugc3RhdGVtZW50cyBhZnRlciBhIHN3aXRjaCBgY2FzZTpgIG9yIGBkZWZhdWx0OmAuCiAgVG9rZW4gcGFyc2VTdGF0ZW1lbnRzSW5Td2l0Y2hDYXNlKAogICAgICBUb2tlbiB0b2tlbiwKICAgICAgVG9rZW4gcGVlaywKICAgICAgVG9rZW4gYmVnaW4sCiAgICAgIGludCBsYWJlbENvdW50LAogICAgICBpbnQgZXhwcmVzc2lvbkNvdW50LAogICAgICBUb2tlbiBkZWZhdWx0S2V5d29yZCwKICAgICAgVG9rZW4gY29sb25BZnRlckRlZmF1bHQpIHsKICAgIGxpc3RlbmVyLmJlZ2luU3dpdGNoQ2FzZShsYWJlbENvdW50LCBleHByZXNzaW9uQ291bnQsIGJlZ2luKTsKICAgIC8vIEZpbmFsbHkgemVybyBvciBtb3JlIHN0YXRlbWVudHMuCiAgICBpbnQgc3RhdGVtZW50Q291bnQgPSAwOwogICAgd2hpbGUgKCFpZGVudGljYWwodG9rZW4ubmV4dC5raW5kLCBFT0ZfVE9LRU4pKSB7CiAgICAgIFN0cmluZyB2YWx1ZSA9IHBlZWsuc3RyaW5nVmFsdWU7CiAgICAgIGlmICgoaWRlbnRpY2FsKHZhbHVlLCAnY2FzZScpKSB8fAogICAgICAgICAgKGlkZW50aWNhbCh2YWx1ZSwgJ2RlZmF1bHQnKSkgfHwKICAgICAgICAgICgoaWRlbnRpY2FsKHZhbHVlLCAnfScpKSAmJiAoaWRlbnRpY2FsKHRva2VuLm5leHQsIHBlZWspKSkpIHsKICAgICAgICAvLyBBIGxhYmVsIGp1c3QgYmVmb3JlICJ9IiB3aWxsIGJlIGhhbmRsZWQgYXMgYSBzdGF0ZW1lbnQgZXJyb3IuCiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgVG9rZW4gc3RhcnRUb2tlbiA9IHRva2VuLm5leHQ7CiAgICAgICAgdG9rZW4gPSBwYXJzZVN0YXRlbWVudCh0b2tlbik7CiAgICAgICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCBzdGFydFRva2VuKSkgewogICAgICAgICAgLy8gTm8gcHJvZ3Jlc3Mgd2FzIG1hZGUsIHNvIHdlIHJlcG9ydCB0aGUgY3VycmVudCB0b2tlbiBhcyBiZWluZwogICAgICAgICAgLy8gaW52YWxpZCBhbmQgbW92ZSBmb3J3YXJkLgogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICBuZXh0LCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKG5leHQpKTsKICAgICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICB9CiAgICAgICAgKytzdGF0ZW1lbnRDb3VudDsKICAgICAgfQogICAgICBwZWVrID0gcGVla1Bhc3RMYWJlbHModG9rZW4ubmV4dCk7CiAgICB9CiAgICBsaXN0ZW5lci5lbmRTd2l0Y2hDYXNlKGxhYmVsQ291bnQsIGV4cHJlc3Npb25Db3VudCwgZGVmYXVsdEtleXdvcmQsCiAgICAgICAgY29sb25BZnRlckRlZmF1bHQsIHN0YXRlbWVudENvdW50LCBiZWdpbiwgdG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGJyZWFrU3RhdGVtZW50OgogIC8vLyAgICdicmVhaycgaWRlbnRpZmllcj8gJzsnCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VCcmVha1N0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gYnJlYWtLZXl3b3JkID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdicmVhaycsIGJyZWFrS2V5d29yZCkpOwogICAgYm9vbCBoYXNUYXJnZXQgPSBmYWxzZTsKICAgIGlmICh0b2tlbi5uZXh0LmlzSWRlbnRpZmllcikgewogICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmxhYmVsUmVmZXJlbmNlKTsKICAgICAgaGFzVGFyZ2V0ID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoIWlzQnJlYWtBbGxvd2VkKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoYnJlYWtLZXl3b3JkLCBmYXN0YS5tZXNzYWdlQnJlYWtPdXRzaWRlT2ZMb29wKTsKICAgIH0KICAgIHRva2VuID0gZW5zdXJlU2VtaWNvbG9uKHRva2VuKTsKICAgIGxpc3RlbmVyLmhhbmRsZUJyZWFrU3RhdGVtZW50KGhhc1RhcmdldCwgYnJlYWtLZXl3b3JkLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGFzc2VydGlvbjoKICAvLy8gICAnYXNzZXJ0JyAnKCcgZXhwcmVzc2lvbiAoJywnIGV4cHJlc3Npb24pPyAnLCc/ICcpJwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQXNzZXJ0KFRva2VuIHRva2VuLCBBc3NlcnQga2luZCkgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdhc3NlcnQnLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5Bc3NlcnQodG9rZW4sIGtpbmQpOwogICAgVG9rZW4gYXNzZXJ0S2V5d29yZCA9IHRva2VuOwogICAgVG9rZW4gbGVmdFBhcmVudGhlc2lzID0gdG9rZW4ubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJygnLCBsZWZ0UGFyZW50aGVzaXMpKSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBsZWZ0UGFyZW50aGVzaXMsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnKCcpKTsKICAgICAgbGVmdFBhcmVudGhlc2lzID0gcmV3cml0ZXIuaW5zZXJ0UGFyZW5zKHRva2VuLCB0cnVlKTsKICAgIH0KICAgIHRva2VuID0gbGVmdFBhcmVudGhlc2lzOwogICAgVG9rZW4gY29tbWFUb2tlbiA9IG51bGw7CiAgICBib29sIG9sZCA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IHRydWU7CgogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgaWYgKG9wdGlvbmFsKCcsJywgdG9rZW4ubmV4dCkpIHsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICBpZiAoIW9wdGlvbmFsKCcpJywgdG9rZW4ubmV4dCkpIHsKICAgICAgICBjb21tYVRva2VuID0gdG9rZW47CiAgICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgICAgIGlmIChvcHRpb25hbCgnLCcsIHRva2VuLm5leHQpKSB7CiAgICAgICAgICAvLyBUcmFpbGluZyBjb21tYSBpcyBpZ25vcmVkLgogICAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIFRva2VuIGVuZEdyb3VwID0gbGVmdFBhcmVudGhlc2lzLmVuZEdyb3VwOwogICAgaWYgKHRva2VuLm5leHQgPT0gZW5kR3JvdXApIHsKICAgICAgdG9rZW4gPSBlbmRHcm91cDsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIGlmIChlbmRHcm91cC5pc1N5bnRoZXRpYykgewogICAgICAgIC8vIFRoZSBzY2FubmVyIGRpZCBub3QgcGxhY2UgdGhlIHN5bnRoZXRpYyAnKScgY29ycmVjdGx5LCBzbyBtb3ZlIGl0LgogICAgICAgIHRva2VuID0gcmV3cml0ZXIubW92ZVN5bnRoZXRpYyh0b2tlbiwgZW5kR3JvdXApOwogICAgICB9IGVsc2UgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgIHRva2VuLm5leHQsIGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgICB0b2tlbiA9IGVuZEdyb3VwOwogICAgICB9CiAgICB9CgogICAgYXNzZXJ0KG9wdGlvbmFsKCcpJywgdG9rZW4pKTsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgIGlmIChraW5kID09IEFzc2VydC5FeHByZXNzaW9uKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoYXNzZXJ0S2V5d29yZCwgZmFzdGEubWVzc2FnZUFzc2VydEFzRXhwcmVzc2lvbik7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gQXNzZXJ0LlN0YXRlbWVudCkgewogICAgICBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgfQogICAgbGlzdGVuZXIuZW5kQXNzZXJ0KAogICAgICAgIGFzc2VydEtleXdvcmQsIGtpbmQsIGxlZnRQYXJlbnRoZXNpcywgY29tbWFUb2tlbiwgdG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGFzc2VydFN0YXRlbWVudDoKICAvLy8gICBhc3NlcnRpb24gJzsnCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VBc3NlcnRTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGFzc2VydChvcHRpb25hbCgnYXNzZXJ0JywgdG9rZW4ubmV4dCkpOwogICAgLy8gcGFyc2VBc3NlcnQgZW5zdXJlcyB0aGF0IHRoZXJlIGlzIGEgdHJhaWxpbmcgc2VtaWNvbG9uLgogICAgcmV0dXJuIHBhcnNlQXNzZXJ0KHRva2VuLCBBc3NlcnQuU3RhdGVtZW50KS5uZXh0OwogIH0KCiAgLy8vIGBgYAogIC8vLyBjb250aW51ZVN0YXRlbWVudDoKICAvLy8gICAnY29udGludWUnIGlkZW50aWZpZXI/ICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQ29udGludWVTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGNvbnRpbnVlS2V5d29yZCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnY29udGludWUnLCBjb250aW51ZUtleXdvcmQpKTsKICAgIGJvb2wgaGFzVGFyZ2V0ID0gZmFsc2U7CiAgICBpZiAodG9rZW4ubmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5sYWJlbFJlZmVyZW5jZSk7CiAgICAgIGhhc1RhcmdldCA9IHRydWU7CiAgICAgIGlmICghaXNDb250aW51ZVdpdGhMYWJlbEFsbG93ZWQpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBjb250aW51ZUtleXdvcmQsIGZhc3RhLm1lc3NhZ2VDb250aW51ZU91dHNpZGVPZkxvb3ApOwogICAgICB9CiAgICB9IGVsc2UgaWYgKCFpc0NvbnRpbnVlQWxsb3dlZCkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgY29udGludWVLZXl3b3JkLAogICAgICAgICAgbG9vcFN0YXRlID09IExvb3BTdGF0ZS5JbnNpZGVTd2l0Y2gKICAgICAgICAgICAgICA/IGZhc3RhLm1lc3NhZ2VDb250aW51ZVdpdGhvdXRMYWJlbEluQ2FzZQogICAgICAgICAgICAgIDogZmFzdGEubWVzc2FnZUNvbnRpbnVlT3V0c2lkZU9mTG9vcCk7CiAgICB9CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5oYW5kbGVDb250aW51ZVN0YXRlbWVudChoYXNUYXJnZXQsIGNvbnRpbnVlS2V5d29yZCwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBlbXB0eVN0YXRlbWVudDoKICAvLy8gICAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUVtcHR5U3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJzsnLCB0b2tlbikpOwogICAgbGlzdGVuZXIuaGFuZGxlRW1wdHlTdGF0ZW1lbnQodG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIEdpdmVuIGEgdG9rZW4gKFtiZWZvcmVUb2tlbl0pIHRoYXQgaXMga25vd24gdG8gYmUgYmVmb3JlIGFub3RoZXIgW3Rva2VuXSwKICAvLy8gcmV0dXJuIHRoZSB0b2tlbiB0aGF0IGlzIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgW3Rva2VuXS4KICBUb2tlbiBwcmV2aW91c1Rva2VuKFRva2VuIGJlZm9yZVRva2VuLCBUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IGJlZm9yZVRva2VuLm5leHQ7CiAgICB3aGlsZSAobmV4dCAhPSB0b2tlbiAmJiBuZXh0ICE9IGJlZm9yZVRva2VuKSB7CiAgICAgIGJlZm9yZVRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IGJlZm9yZVRva2VuLm5leHQ7CiAgICB9CiAgICByZXR1cm4gYmVmb3JlVG9rZW47CiAgfQoKICAvLy8gUmVjb3ZlciBmcm9tIGZpbmRpbmcgYW4gb3BlcmF0b3IgZGVjbGFyYXRpb24gbWlzc2luZyB0aGUgYG9wZXJhdG9yYAogIC8vLyBrZXl3b3JkLiBUaGUgbWV0YWRhdGEgZm9yIHRoZSBtZW1iZXIsIGlmIGFueSwgaGFzIGFscmVhZHkgYmVlbiBwYXJzZWQKICAvLy8gKGFuZCBldmVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gZ2VuZXJhdGVkKS4KICBUb2tlbiBwYXJzZUludmFsaWRPcGVyYXRvckRlY2xhcmF0aW9uKAogICAgICBUb2tlbiBiZWZvcmVTdGFydCwKICAgICAgVG9rZW4gZXh0ZXJuYWxUb2tlbiwKICAgICAgVG9rZW4gc3RhdGljVG9rZW4sCiAgICAgIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiBsYXRlVG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwKICAgICAgVG9rZW4gYmVmb3JlVHlwZSkgewogICAgVHlwZUluZm8gdHlwZUluZm8gPSBjb21wdXRlVHlwZShiZWZvcmVUeXBlLCB0cnVlLCB0cnVlKTsKCiAgICBUb2tlbiBiZWZvcmVOYW1lID0gdHlwZUluZm8uc2tpcFR5cGUoYmVmb3JlVHlwZSk7CiAgICBUb2tlbiBuZXh0ID0gYmVmb3JlTmFtZS5uZXh0OwoKICAgIGlmIChvcHRpb25hbCgnb3BlcmF0b3InLCBuZXh0KSkgewogICAgICBuZXh0ID0gbmV4dC5uZXh0OwogICAgfSBlbHNlIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlTWlzc2luZ09wZXJhdG9yS2V5d29yZCk7CiAgICAgIHJld3JpdGVyLmluc2VydFN5bnRoZXRpY0tleXdvcmQoYmVmb3JlTmFtZSwgS2V5d29yZC5PUEVSQVRPUik7CiAgICB9CgogICAgYXNzZXJ0KChuZXh0LmlzT3BlcmF0b3IgJiYgbmV4dC5lbmRHcm91cCA9PSBudWxsKSB8fAogICAgICAgIG9wdGlvbmFsKCc9PT0nLCBuZXh0KSB8fAogICAgICAgIG9wdGlvbmFsKCchPT0nLCBuZXh0KSk7CgogICAgVG9rZW4gdG9rZW4gPSBwYXJzZU1ldGhvZCgKICAgICAgICBiZWZvcmVTdGFydCwKICAgICAgICBleHRlcm5hbFRva2VuLAogICAgICAgIHN0YXRpY1Rva2VuLAogICAgICAgIGNvdmFyaWFudFRva2VuLAogICAgICAgIGxhdGVUb2tlbiwKICAgICAgICB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgYmVmb3JlVHlwZSwKICAgICAgICB0eXBlSW5mbywKICAgICAgICBudWxsLAogICAgICAgIGJlZm9yZU5hbWUubmV4dCk7CiAgICBsaXN0ZW5lci5lbmRNZW1iZXIoKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBSZWNvdmVyIGZyb20gZmluZGluZyBhbiBpbnZhbGlkIGNsYXNzIG1lbWJlci4gVGhlIG1ldGFkYXRhIGZvciB0aGUgbWVtYmVyLAogIC8vLyBpZiBhbnksIGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkIChhbmQgZXZlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIGdlbmVyYXRlZCkuCiAgLy8vIFRoZSBtZW1iZXIgd2FzIGV4cGVjdGVkIHRvIHN0YXJ0IHdpdGggdGhlIHRva2VuIGFmdGVyIFt0b2tlbl0uCiAgVG9rZW4gcmVjb3ZlckZyb21JbnZhbGlkQ2xhc3NNZW1iZXIoCiAgICAgIFRva2VuIHRva2VuLAogICAgICBUb2tlbiBiZWZvcmVTdGFydCwKICAgICAgVG9rZW4gZXh0ZXJuYWxUb2tlbiwKICAgICAgVG9rZW4gc3RhdGljVG9rZW4sCiAgICAgIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiBsYXRlVG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwKICAgICAgVG9rZW4gYmVmb3JlVHlwZSwKICAgICAgVHlwZUluZm8gdHlwZUluZm8sCiAgICAgIFRva2VuIGdldE9yU2V0KSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CgogICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2NsYXNzJykpIHsKICAgICAgcmV0dXJuIHJlcG9ydEFuZFNraXBDbGFzc0luQ2xhc3MobmV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2VudW0nKSkgewogICAgICByZXR1cm4gcmVwb3J0QW5kU2tpcEVudW1JbkNsYXNzKG5leHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICd0eXBlZGVmJykpIHsKICAgICAgcmV0dXJuIHJlcG9ydEFuZFNraXBUeXBlZGVmSW5DbGFzcyhuZXh0KTsKICAgIH0gZWxzZSBpZiAobmV4dC5pc09wZXJhdG9yICYmIG5leHQuZW5kR3JvdXAgPT0gbnVsbCkgewogICAgICByZXR1cm4gcGFyc2VJbnZhbGlkT3BlcmF0b3JEZWNsYXJhdGlvbihiZWZvcmVTdGFydCwgZXh0ZXJuYWxUb2tlbiwKICAgICAgICAgIHN0YXRpY1Rva2VuLCBjb3ZhcmlhbnRUb2tlbiwgbGF0ZVRva2VuLCB2YXJGaW5hbE9yQ29uc3QsIGJlZm9yZVR5cGUpOwogICAgfQoKICAgIGlmIChnZXRPclNldCAhPSBudWxsIHx8CiAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnKCcpIHx8CiAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnPT4nKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJ3snKSkgewogICAgICB0b2tlbiA9IHBhcnNlTWV0aG9kKAogICAgICAgICAgYmVmb3JlU3RhcnQsCiAgICAgICAgICBleHRlcm5hbFRva2VuLAogICAgICAgICAgc3RhdGljVG9rZW4sCiAgICAgICAgICBjb3ZhcmlhbnRUb2tlbiwKICAgICAgICAgIGxhdGVUb2tlbiwKICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwKICAgICAgICAgIGJlZm9yZVR5cGUsCiAgICAgICAgICB0eXBlSW5mbywKICAgICAgICAgIGdldE9yU2V0LAogICAgICAgICAgdG9rZW4ubmV4dCk7CiAgICB9IGVsc2UgaWYgKHRva2VuID09IGJlZm9yZVN0YXJ0KSB7CiAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBQcm92aWRlIGEgbW9yZSBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIGZvciBleHRyYSAnOycuCiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4obmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZENsYXNzTWVtYmVyKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlSW52YWxpZE1lbWJlcihuZXh0KTsKICAgICAgaWYgKCFpZGVudGljYWwodmFsdWUsICd9JykpIHsKICAgICAgICAvLyBFbnN1cmUgd2UgbWFrZSBwcm9ncmVzcy4KICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRva2VuID0gcGFyc2VGaWVsZHMoCiAgICAgICAgICBiZWZvcmVTdGFydCwKICAgICAgICAgIGV4dGVybmFsVG9rZW4sCiAgICAgICAgICBzdGF0aWNUb2tlbiwKICAgICAgICAgIGNvdmFyaWFudFRva2VuLAogICAgICAgICAgbGF0ZVRva2VuLAogICAgICAgICAgdmFyRmluYWxPckNvbnN0LAogICAgICAgICAgYmVmb3JlVHlwZSwKICAgICAgICAgIHR5cGVJbmZvLAogICAgICAgICAgdG9rZW4ubmV4dCwKICAgICAgICAgIGZhbHNlKTsKICAgIH0KCiAgICBsaXN0ZW5lci5lbmRNZW1iZXIoKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBSZXBvcnQgdGhhdCB0aGUgbmVzdGluZyBkZXB0aCBvZiB0aGUgY29kZSBiZWluZyBwYXJzZWQgaXMgdG9vIGxhcmdlIGZvcgogIC8vLyB0aGUgcGFyc2VyIHRvIHNhZmVseSBoYW5kbGUuIFJldHVybiB0aGUgbmV4dCBgfWAgb3IgRU9GLgogIFRva2VuIHJlY292ZXJGcm9tU3RhY2tPdmVyZmxvdyhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VTdGFja092ZXJmbG93KTsKICAgIG5leHQgPSByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNUb2tlbih0b2tlbiwgVG9rZW5UeXBlLlNFTUlDT0xPTik7CiAgICBsaXN0ZW5lci5oYW5kbGVFbXB0eVN0YXRlbWVudChuZXh0KTsKCiAgICB3aGlsZSAobm90RW9mT3JWYWx1ZSgnfScsIG5leHQpKSB7CiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICB2b2lkIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoVG9rZW4gdG9rZW4sIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgLy8gRmluZCBhIG5vbi1zeW50aGV0aWMgdG9rZW4gb24gd2hpY2ggdG8gcmVwb3J0IHRoZSBlcnJvci4KICAgIHRva2VuID0gZmluZE5vblplcm9MZW5ndGhUb2tlbih0b2tlbik7CiAgICBsaXN0ZW5lci5oYW5kbGVSZWNvdmVyYWJsZUVycm9yKG1lc3NhZ2UsIHRva2VuLCB0b2tlbik7CiAgfQoKICB2b2lkIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgIFRva2VuIHRva2VuLCBUZW1wbGF0ZTxfTWVzc2FnZVdpdGhBcmd1bWVudDxUb2tlbj4+IHRlbXBsYXRlKSB7CiAgICAvLyBGaW5kIGEgbm9uLXN5bnRoZXRpYyB0b2tlbiBvbiB3aGljaCB0byByZXBvcnQgdGhlIGVycm9yLgogICAgdG9rZW4gPSBmaW5kTm9uWmVyb0xlbmd0aFRva2VuKHRva2VuKTsKICAgIGxpc3RlbmVyLmhhbmRsZVJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgdGVtcGxhdGUud2l0aEFyZ3VtZW50cyh0b2tlbiksIHRva2VuLCB0b2tlbik7CiAgfQoKICBUb2tlbiByZXBvcnRBbGxFcnJvclRva2VucyhUb2tlbiB0b2tlbikgewogICAgd2hpbGUgKHRva2VuIGlzIEVycm9yVG9rZW4pIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlRXJyb3JUb2tlbih0b2tlbik7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHNraXBFcnJvclRva2VucyhUb2tlbiB0b2tlbikgewogICAgd2hpbGUgKHRva2VuIGlzIEVycm9yVG9rZW4pIHsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgIG5leHQsCiAgICAgICAgb3B0aW9uYWwoJzsnLCBuZXh0KQogICAgICAgICAgICA/IGZhc3RhLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuCiAgICAgICAgICAgIDogZmFzdGEudGVtcGxhdGVFeHBlY3RlZERlY2xhcmF0aW9uKTsKICAgIGlmIChvcHRpb25hbCgneycsIG5leHQpKSB7CiAgICAgIG5leHQgPSBwYXJzZUludmFsaWRCbG9jayh0b2tlbik7CiAgICB9CiAgICBsaXN0ZW5lci5oYW5kbGVJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbihuZXh0KTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgVG9rZW4gcmVwb3J0QW5kU2tpcENsYXNzSW5DbGFzcyhUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCdjbGFzcycsIHRva2VuKSk7CiAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBmYXN0YS5tZXNzYWdlQ2xhc3NJbkNsYXNzKTsKICAgIGxpc3RlbmVyLmhhbmRsZUludmFsaWRNZW1iZXIodG9rZW4pOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICAvLyBJZiB0aGUgZGVjbGFyYXRpb24gYXBwZWFycyB0byBiZSBhIHZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uCiAgICAvLyB0aGVuIHNraXAgdGhlIGVudGlyZSBkZWNsYXJhdGlvbiBzbyB0aGF0IHdlIG9ubHkgZ2VuZXJhdGUgdGhlIG9uZQogICAgLy8gZXJyb3IgKGFib3ZlKSByYXRoZXIgdGhhbiBhIHBsZXRob3JhIG9mIHVuaGVscGZ1bCBlcnJvcnMuCiAgICBpZiAobmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgLy8gc2tpcCBjbGFzcyBuYW1lCiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBjb25zaWRlciBwYXJzaW5nIChza2lwcGluZykgdGhlIGNsYXNzIGhlYWRlcgogICAgICAvLyB3aXRoIGEgcmVjb3ZlcnkgbGlzdGVuZXIgc28gdGhhdCBubyBldmVudHMgYXJlIGdlbmVyYXRlZAogICAgICBpZiAob3B0aW9uYWwoJ3snLCBuZXh0KSAmJiBuZXh0LmVuZEdyb3VwICE9IG51bGwpIHsKICAgICAgICAvLyBza2lwIGNsYXNzIGJvZHkKICAgICAgICB0b2tlbiA9IG5leHQuZW5kR3JvdXA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHJlcG9ydEFuZFNraXBFbnVtSW5DbGFzcyhUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCdlbnVtJywgdG9rZW4pKTsKICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIGZhc3RhLm1lc3NhZ2VFbnVtSW5DbGFzcyk7CiAgICBsaXN0ZW5lci5oYW5kbGVJbnZhbGlkTWVtYmVyKHRva2VuKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgLy8gSWYgdGhlIGRlY2xhcmF0aW9uIGFwcGVhcnMgdG8gYmUgYSB2YWxpZCBlbnVtIGRlY2xhcmF0aW9uCiAgICAvLyB0aGVuIHNraXAgdGhlIGVudGlyZSBkZWNsYXJhdGlvbiBzbyB0aGF0IHdlIG9ubHkgZ2VuZXJhdGUgdGhlIG9uZQogICAgLy8gZXJyb3IgKGFib3ZlKSByYXRoZXIgdGhhbiBhIHBsZXRob3JhIG9mIHVuaGVscGZ1bCBlcnJvcnMuCiAgICBpZiAobmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgLy8gc2tpcCBlbnVtIG5hbWUKICAgICAgdG9rZW4gPSBuZXh0OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCd7JywgbmV4dCkgJiYgbmV4dC5lbmRHcm91cCAhPSBudWxsKSB7CiAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIHJlcGxhY2luZyB0aGlzIGBza2lwIGVudW1gIGZ1bmN0aW9uYWxpdHkKICAgICAgICAvLyB3aXRoIHNvbWV0aGluZyB0aGF0IGNhbiBwYXJzZSBhbmQgcmVzb2x2ZSB0aGUgZGVjbGFyYXRpb24KICAgICAgICAvLyBldmVuIHRob3VnaCBpdCBpcyBpbiBhIGNsYXNzIGNvbnRleHQKICAgICAgICB0b2tlbiA9IG5leHQuZW5kR3JvdXA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHJlcG9ydEFuZFNraXBUeXBlZGVmSW5DbGFzcyhUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCd0eXBlZGVmJywgdG9rZW4pKTsKICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIGZhc3RhLm1lc3NhZ2VUeXBlZGVmSW5DbGFzcyk7CiAgICBsaXN0ZW5lci5oYW5kbGVJbnZhbGlkTWVtYmVyKHRva2VuKTsKICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pOiBJZiB0aGUgZGVjbGFyYXRpb24gYXBwZWFycyB0byBiZSBhIHZhbGlkIHR5cGVkZWYKICAgIC8vIHRoZW4gc2tpcCB0aGUgZW50aXJlIGRlY2xhcmF0aW9uIHNvIHRoYXQgd2UgZ2VuZXJhdGUgYSBzaW5nbGUgZXJyb3IKICAgIC8vIChhYm92ZSkgcmF0aGVyIHRoYW4gbWFueSB1bmhlbHBmdWwgZXJyb3JzLgogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIENyZWF0ZSBhIHNob3J0IHRva2VuIGNoYWluIGZyb20gdGhlIFtiZWdpblRva2VuXSBhbmQgW2VuZFRva2VuXSBhbmQgcmV0dXJuCiAgLy8vIHRoZSBbYmVnaW5Ub2tlbl0uCiAgVG9rZW4gbGluayhCZWdpblRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBiZWdpblRva2VuLnNldE5leHQoZW5kVG9rZW4pOwogICAgYmVnaW5Ub2tlbi5lbmRHcm91cCA9IGVuZFRva2VuOwogICAgcmV0dXJuIGJlZ2luVG9rZW47CiAgfQoKICAvLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSB0b2tlbiB3aG9zZSBuZXh0IHRva2VuIGlzIHRoZSBnaXZlbiBbdG9rZW5dLgogIFRva2VuIHN5bnRoZXRpY1ByZXZpb3VzVG9rZW4oVG9rZW4gdG9rZW4pIHsKICAgIC8vIFJldHVybiB0aGUgcHJldmlvdXMgdG9rZW4gaWYgdGhlcmUgaXMgb25lIHNvIHRoYXQgYW55IHRva2VuIGluc2VydGVkCiAgICAvLyBiZWZvcmUgYHRva2VuYCB3aWxsIGJlIHByb3Blcmx5IGluc2VydGVkIGludG8gdGhlIHRva2VuIHN0cmVhbS4KICAgIC8vIFRPRE8oZGFucnViZWwpOiByZW1vdmUgdGhpcyBvbmNlIGFsbCBtZXRob2RzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8KICAgIC8vIHVzZSBhbmQgcmV0dXJuIHRoZSBsYXN0IHRva2VuIGNvbnN1bWVkIGFuZCB0aGUgYHByZXZpb3VzYCBmaWVsZAogICAgLy8gaGFzIGJlZW4gcmVtb3ZlZC4KICAgIGlmICh0b2tlbi5wcmV2aW91cyAhPSBudWxsKSB7CiAgICAgIHJldHVybiB0b2tlbi5wcmV2aW91czsKICAgIH0KICAgIFRva2VuIGJlZm9yZSA9IG5ldyBUb2tlbi5lb2YoLTEpOwogICAgYmVmb3JlLm5leHQgPSB0b2tlbjsKICAgIHJldHVybiBiZWZvcmU7CiAgfQoKICAvLy8gUmV0dXJuIHRoZSBmaXJzdCBkYXJ0ZG9jIGNvbW1lbnQgdG9rZW4gcHJlY2VkaW5nIHRoZSBnaXZlbiB0b2tlbgogIC8vLyBvciBgbnVsbGAgaWYgbm8gZGFydGRvYyB0b2tlbiBpcyBmb3VuZC4KICBUb2tlbiBmaW5kRGFydERvYyhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gY29tbWVudHMgPSB0b2tlbi5wcmVjZWRpbmdDb21tZW50czsKICAgIFRva2VuIGRhcnRkb2MgPSBudWxsOwogICAgYm9vbCBpc011bHRpbGluZSA9IGZhbHNlOwogICAgd2hpbGUgKGNvbW1lbnRzICE9IG51bGwpIHsKICAgICAgU3RyaW5nIGxleGVtZSA9IGNvbW1lbnRzLmxleGVtZTsKICAgICAgaWYgKGxleGVtZS5zdGFydHNXaXRoKCcvLy8nKSkgewogICAgICAgIGlmICghaXNNdWx0aWxpbmUpIHsKICAgICAgICAgIGRhcnRkb2MgPSBjb21tZW50czsKICAgICAgICAgIGlzTXVsdGlsaW5lID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobGV4ZW1lLnN0YXJ0c1dpdGgoJy8qKicpKSB7CiAgICAgICAgZGFydGRvYyA9IGNvbW1lbnRzOwogICAgICAgIGlzTXVsdGlsaW5lID0gZmFsc2U7CiAgICAgIH0KICAgICAgY29tbWVudHMgPSBjb21tZW50cy5uZXh0OwogICAgfQogICAgcmV0dXJuIGRhcnRkb2M7CiAgfQoKICAvLy8gUGFyc2UgdGhlIGNvbW1lbnQgcmVmZXJlbmNlcyBpbiBhIHNlcXVlbmNlIG9mIGNvbW1lbnQgdG9rZW5zCiAgLy8vIHdoZXJlIFtkYXJ0ZG9jXSAobm90IG51bGwpIGlzIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgc2VxdWVuY2UuCiAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbW1lbnQgcmVmZXJlbmNlcyBwYXJzZWQuCiAgaW50IHBhcnNlQ29tbWVudFJlZmVyZW5jZXMoVG9rZW4gZGFydGRvYykgewogICAgcmV0dXJuIGRhcnRkb2MubGV4ZW1lLnN0YXJ0c1dpdGgoJy8vLycpCiAgICAgICAgPyBwYXJzZVJlZmVyZW5jZXNJblNpbmdsZUxpbmVDb21tZW50cyhkYXJ0ZG9jKQogICAgICAgIDogcGFyc2VSZWZlcmVuY2VzSW5NdWx0aUxpbmVDb21tZW50KGRhcnRkb2MpOwogIH0KCiAgLy8vIFBhcnNlIHRoZSBjb21tZW50IHJlZmVyZW5jZXMgaW4gYSBtdWx0aS1saW5lIGNvbW1lbnQgdG9rZW4uCiAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbW1lbnQgcmVmZXJlbmNlcyBwYXJzZWQuCiAgaW50IHBhcnNlUmVmZXJlbmNlc0luTXVsdGlMaW5lQ29tbWVudChUb2tlbiBtdWx0aUxpbmVEb2MpIHsKICAgIFN0cmluZyBjb21tZW50ID0gbXVsdGlMaW5lRG9jLmxleGVtZTsKICAgIGFzc2VydChjb21tZW50LnN0YXJ0c1dpdGgoJy8qKicpKTsKICAgIGludCBjb3VudCA9IDA7CiAgICBpbnQgbGVuZ3RoID0gY29tbWVudC5sZW5ndGg7CiAgICBpbnQgc3RhcnQgPSAzOwogICAgYm9vbCBpbkNvZGVCbG9jayA9IGZhbHNlOwogICAgaW50IGNvZGVCbG9jayA9IGNvbW1lbnQuaW5kZXhPZignYGBgJywgMyk7CiAgICBpZiAoY29kZUJsb2NrID09IC0xKSB7CiAgICAgIGNvZGVCbG9jayA9IGxlbmd0aDsKICAgIH0KICAgIHdoaWxlIChzdGFydCA8IGxlbmd0aCkgewogICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNvbW1lbnQuY29kZVVuaXRBdChzdGFydCkpKSB7CiAgICAgICAgKytzdGFydDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpbnQgZW5kID0gY29tbWVudC5pbmRleE9mKCdcbicsIHN0YXJ0KTsKICAgICAgaWYgKGVuZCA9PSAtMSkgewogICAgICAgIGVuZCA9IGxlbmd0aDsKICAgICAgfQogICAgICBpZiAoY29kZUJsb2NrIDwgZW5kKSB7CiAgICAgICAgaW5Db2RlQmxvY2sgPSAhaW5Db2RlQmxvY2s7CiAgICAgICAgY29kZUJsb2NrID0gY29tbWVudC5pbmRleE9mKCdgYGAnLCBlbmQpOwogICAgICAgIGlmIChjb2RlQmxvY2sgPT0gLTEpIHsKICAgICAgICAgIGNvZGVCbG9jayA9IGxlbmd0aDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFpbkNvZGVCbG9jayAmJiAhY29tbWVudC5zdGFydHNXaXRoKCcqICAgICAnLCBzdGFydCkpIHsKICAgICAgICBjb3VudCArPSBwYXJzZUNvbW1lbnRSZWZlcmVuY2VzSW5UZXh0KG11bHRpTGluZURvYywgc3RhcnQsIGVuZCk7CiAgICAgIH0KICAgICAgc3RhcnQgPSBlbmQgKyAxOwogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgLy8vIFBhcnNlIHRoZSBjb21tZW50IHJlZmVyZW5jZXMgaW4gYSBzZXF1ZW5jZSBvZiBzaW5nbGUgbGluZSBjb21tZW50IHRva2VucwogIC8vLyB3aGVyZSBbdG9rZW5dIGlzIHRoZSBmaXJzdCBjb21tZW50IHRva2VuIGluIHRoZSBzZXF1ZW5jZS4KICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgY29tbWVudCByZWZlcmVuY2VzIHBhcnNlZC4KICBpbnQgcGFyc2VSZWZlcmVuY2VzSW5TaW5nbGVMaW5lQ29tbWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBib29sIGluQ29kZUJsb2NrID0gZmFsc2U7CiAgICB3aGlsZSAodG9rZW4gIT0gbnVsbCAmJiAhdG9rZW4uaXNFb2YpIHsKICAgICAgU3RyaW5nIGNvbW1lbnQgPSB0b2tlbi5sZXhlbWU7CiAgICAgIGlmIChjb21tZW50LnN0YXJ0c1dpdGgoJy8vLycpKSB7CiAgICAgICAgaWYgKGNvbW1lbnQuaW5kZXhPZignYGBgJywgMykgIT0gLTEpIHsKICAgICAgICAgIGluQ29kZUJsb2NrID0gIWluQ29kZUJsb2NrOwogICAgICAgIH0KICAgICAgICBpZiAoIWluQ29kZUJsb2NrICYmICFjb21tZW50LnN0YXJ0c1dpdGgoJy8vLyAgICAnKSkgewogICAgICAgICAgY291bnQgKz0gcGFyc2VDb21tZW50UmVmZXJlbmNlc0luVGV4dCh0b2tlbiwgMywgY29tbWVudC5sZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB9CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICAvLy8gUGFyc2UgdGhlIGNvbW1lbnQgcmVmZXJlbmNlcyBpbiB0aGUgdGV4dCBiZXR3ZWVuIFtzdGFydF0gaW5jbHVzaXZlCiAgLy8vIGFuZCBbZW5kXSBleGNsdXNpdmUuIFJldHVybiBhIGNvdW50IGluZGljYXRpbmcgaG93IG1hbnkgd2VyZSBwYXJzZWQuCiAgaW50IHBhcnNlQ29tbWVudFJlZmVyZW5jZXNJblRleHQoVG9rZW4gY29tbWVudFRva2VuLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIFN0cmluZyBjb21tZW50ID0gY29tbWVudFRva2VuLmxleGVtZTsKICAgIGludCBjb3VudCA9IDA7CiAgICBpbnQgaW5kZXggPSBzdGFydDsKICAgIHdoaWxlIChpbmRleCA8IGVuZCkgewogICAgICBpbnQgY2ggPSBjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpOwogICAgICBpZiAoY2ggPT0gMHg1QiAvKiBgW2AgKi8pIHsKICAgICAgICArK2luZGV4OwogICAgICAgIGlmIChpbmRleCA8IGVuZCAmJiBjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpID09IDB4M0EgLyogYDpgICovKSB7CiAgICAgICAgICAvLyBTa2lwIG9sZC1zdHlsZSBjb2RlIGJsb2NrLgogICAgICAgICAgaW5kZXggPSBjb21tZW50LmluZGV4T2YoJzpdJywgaW5kZXggKyAxKSArIDE7CiAgICAgICAgICBpZiAoaW5kZXggPT0gMCB8fCBpbmRleCA+IGVuZCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW50IHJlZmVyZW5jZVN0YXJ0ID0gaW5kZXg7CiAgICAgICAgICBpbmRleCA9IGNvbW1lbnQuaW5kZXhPZignXScsIGluZGV4KTsKICAgICAgICAgIGlmIChpbmRleCA9PSAtMSB8fCBpbmRleCA+PSBlbmQpIHsKICAgICAgICAgICAgLy8gUmVjb3Zlcnk6IHRlcm1pbmF0aW5nICddJyBpcyBub3QgdHlwZWQgeWV0LgogICAgICAgICAgICBpbmRleCA9IGZpbmRSZWZlcmVuY2VFbmQoY29tbWVudCwgcmVmZXJlbmNlU3RhcnQsIGVuZCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY2ggIT0gMHgyNyAvKiBgJ2AgKi8gJiYgY2ggIT0gMHgyMiAvKiBgImAgKi8pIHsKICAgICAgICAgICAgaWYgKGlzTGlua1RleHQoY29tbWVudCwgaW5kZXgpKSB7CiAgICAgICAgICAgICAgLy8gVE9ETyhicmlhbndpbGtlcnNvbikgSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZXJlJ3MgYSBsaWJyYXJ5CiAgICAgICAgICAgICAgLy8gVVJJIGluIHRoZSBsaW5rIHRleHQuCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlQ29tbWVudFJlZmVyZW5jZVRleHQoCiAgICAgICAgICAgICAgICAgIGNvbW1lbnQuc3Vic3RyaW5nKHJlZmVyZW5jZVN0YXJ0LCBpbmRleCksCiAgICAgICAgICAgICAgICAgIGNvbW1lbnRUb2tlbi5jaGFyT2Zmc2V0ICsgcmVmZXJlbmNlU3RhcnQpOwogICAgICAgICAgICAgICsrY291bnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY2ggPT0gMHg2MCAvKiAnYCcgKi8pIHsKICAgICAgICAvLyBTa2lwIGlubGluZSBjb2RlIGJsb2NrIGlmIHRoZXJlIGlzIGJvdGggc3RhcnRpbmcgJ2AnIGFuZCBlbmRpbmcgJ2AnCiAgICAgICAgaW50IGVuZENvZGVCbG9jayA9IGNvbW1lbnQuaW5kZXhPZignYCcsIGluZGV4ICsgMSk7CiAgICAgICAgaWYgKGVuZENvZGVCbG9jayAhPSAtMSAmJiBlbmRDb2RlQmxvY2sgPCBlbmQpIHsKICAgICAgICAgIGluZGV4ID0gZW5kQ29kZUJsb2NrOwogICAgICAgIH0KICAgICAgfQogICAgICArK2luZGV4OwogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgLy8vIEdpdmVuIGEgY29tbWVudCByZWZlcmVuY2Ugd2l0aG91dCBhIGNsb3NpbmcgYF1gLAogIC8vLyBzZWFyY2ggZm9yIGEgcG9zc2libGUgcGxhY2Ugd2hlcmUgYF1gIHNob3VsZCBiZS4KICBpbnQgZmluZFJlZmVyZW5jZUVuZChTdHJpbmcgY29tbWVudCwgaW50IGluZGV4LCBpbnQgZW5kKSB7CiAgICAvLyBGaW5kIHRoZSBlbmQgb2YgdGhlIGlkZW50aWZpZXIgaWYgdGhlcmUgaXMgb25lCiAgICBpZiAoaW5kZXggPj0gZW5kIHx8ICFpc0xldHRlcihjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpKSkgewogICAgICByZXR1cm4gaW5kZXg7CiAgICB9CiAgICB3aGlsZSAoaW5kZXggPCBlbmQgJiYgaXNMZXR0ZXJPckRpZ2l0KGNvbW1lbnQuY29kZVVuaXRBdChpbmRleCkpKSB7CiAgICAgICsraW5kZXg7CiAgICB9CgogICAgLy8gQ2hlY2sgZm9yIGEgdHJhaWxpbmcgYC5gCiAgICBpZiAoaW5kZXggPj0gZW5kIHx8IGNvbW1lbnQuY29kZVVuaXRBdChpbmRleCkgIT0gMHgyRSAvKiBgLmAgKi8pIHsKICAgICAgcmV0dXJuIGluZGV4OwogICAgfQogICAgKytpbmRleDsKCiAgICAvLyBGaW5kIGVuZCBvZiB0aGUgaWRlbnRpZmllciBhZnRlciB0aGUgYC5gCiAgICBpZiAoaW5kZXggPj0gZW5kIHx8ICFpc0xldHRlcihjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpKSkgewogICAgICByZXR1cm4gaW5kZXg7CiAgICB9CiAgICArK2luZGV4OwogICAgd2hpbGUgKGluZGV4IDwgZW5kICYmIGlzTGV0dGVyT3JEaWdpdChjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpKSkgewogICAgICArK2luZGV4OwogICAgfQogICAgcmV0dXJuIGluZGV4OwogIH0KCiAgLy8vIFBhcnNlIHRoZSB0b2tlbnMgaW4gYSBzaW5nbGUgY29tbWVudCByZWZlcmVuY2UgYW5kIGdlbmVyYXRlIGVpdGhlciBhCiAgLy8vIGBoYW5kbGVDb21tZW50UmVmZXJlbmNlYCBvciBgaGFuZGxlTm9Db21tZW50UmVmZXJlbmNlYCBldmVudC4KICAvLy8gUmV0dXJuIGB0cnVlYCBpZiBhIGNvbW1lbnQgcmVmZXJlbmNlIHdhcyBzdWNjZXNzZnVsbHkgcGFyc2VkLgogIGJvb2wgcGFyc2VPbmVDb21tZW50UmVmZXJlbmNlKFRva2VuIHRva2VuLCBpbnQgcmVmZXJlbmNlT2Zmc2V0KSB7CiAgICBUb2tlbiBiZWdpbiA9IHRva2VuOwogICAgVG9rZW4gbmV3S2V5d29yZCA9IG51bGw7CiAgICBpZiAob3B0aW9uYWwoJ25ldycsIHRva2VuKSkgewogICAgICBuZXdLZXl3b3JkID0gdG9rZW47CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIFRva2VuIHByZWZpeCwgcGVyaW9kOwogICAgaWYgKHRva2VuLmlzSWRlbnRpZmllciAmJiBvcHRpb25hbCgnLicsIHRva2VuLm5leHQpKSB7CiAgICAgIHByZWZpeCA9IHRva2VuOwogICAgICBwZXJpb2QgPSB0b2tlbi5uZXh0OwogICAgICB0b2tlbiA9IHBlcmlvZC5uZXh0OwogICAgfQogICAgaWYgKHRva2VuLmlzRW9mKSB7CiAgICAgIC8vIFJlY292ZXJ5OiBJbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciBmb3IgY29kZSBjb21wbGV0aW9uCiAgICAgIHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcigKICAgICAgICAgIHBlcmlvZCA/PyBuZXdLZXl3b3JkID8/IHN5bnRoZXRpY1ByZXZpb3VzVG9rZW4odG9rZW4pKTsKICAgICAgaWYgKGJlZ2luID09IHRva2VuLm5leHQpIHsKICAgICAgICBiZWdpbiA9IHRva2VuOwogICAgICB9CiAgICB9CiAgICBUb2tlbiBvcGVyYXRvcktleXdvcmQgPSBudWxsOwogICAgaWYgKG9wdGlvbmFsKCdvcGVyYXRvcicsIHRva2VuKSkgewogICAgICBvcGVyYXRvcktleXdvcmQgPSB0b2tlbjsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgfQogICAgaWYgKHRva2VuLmlzVXNlckRlZmluYWJsZU9wZXJhdG9yKSB7CiAgICAgIGlmICh0b2tlbi5uZXh0LmlzRW9mKSB7CiAgICAgICAgcGFyc2VPbmVDb21tZW50UmVmZXJlbmNlUmVzdCgKICAgICAgICAgICAgYmVnaW4sIHJlZmVyZW5jZU9mZnNldCwgbmV3S2V5d29yZCwgcHJlZml4LCBwZXJpb2QsIHRva2VuKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSBvcGVyYXRvcktleXdvcmQgPz8gdG9rZW47CiAgICAgIGlmICh0b2tlbi5uZXh0LmlzRW9mKSB7CiAgICAgICAgaWYgKHRva2VuLmlzSWRlbnRpZmllcikgewogICAgICAgICAgcGFyc2VPbmVDb21tZW50UmVmZXJlbmNlUmVzdCgKICAgICAgICAgICAgICBiZWdpbiwgcmVmZXJlbmNlT2Zmc2V0LCBuZXdLZXl3b3JkLCBwcmVmaXgsIHBlcmlvZCwgdG9rZW4pOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIEtleXdvcmQga2V5d29yZCA9IHRva2VuLmtleXdvcmQ7CiAgICAgICAgaWYgKG5ld0tleXdvcmQgPT0gbnVsbCAmJgogICAgICAgICAgICBwcmVmaXggPT0gbnVsbCAmJgogICAgICAgICAgICAoa2V5d29yZCA9PSBLZXl3b3JkLlRISVMgfHwKICAgICAgICAgICAgICAgIGtleXdvcmQgPT0gS2V5d29yZC5OVUxMIHx8CiAgICAgICAgICAgICAgICBrZXl3b3JkID09IEtleXdvcmQuVFJVRSB8fAogICAgICAgICAgICAgICAga2V5d29yZCA9PSBLZXl3b3JkLkZBTFNFKSkgewogICAgICAgICAgLy8gVE9ETyhicmlhbndpbGtlcnNvbikgSWYgd2Ugd2FudCB0byBzdXBwb3J0IHRoaXMgd2Ugd2lsbCBuZWVkIHRvCiAgICAgICAgICAvLyBleHRlbmQgdGhlIGRlZmluaXRpb24gb2YgQ29tbWVudFJlZmVyZW5jZSB0byB0YWtlIGFuIGV4cHJlc3Npb24KICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGFuIGlkZW50aWZpZXIuIEZvciBub3cgd2UganVzdCBpZ25vcmUgaXQgdG8gcmVkdWNlIHRoZQogICAgICAgICAgLy8gbnVtYmVyIG9mIGVycm9ycyBwcm9kdWNlZCwgYnV0IHRoYXQncyBwcm9iYWJseSBub3QgYSB2YWxpZCBsb25nCiAgICAgICAgICAvLyB0ZXJtIGFwcHJvYWNoLgogICAgICAgIH0KICAgICAgfQogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlTm9Db21tZW50UmVmZXJlbmNlKCk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIHBhcnNlT25lQ29tbWVudFJlZmVyZW5jZVJlc3QoCiAgICAgIFRva2VuIGJlZ2luLAogICAgICBpbnQgcmVmZXJlbmNlT2Zmc2V0LAogICAgICBUb2tlbiBuZXdLZXl3b3JkLAogICAgICBUb2tlbiBwcmVmaXgsCiAgICAgIFRva2VuIHBlcmlvZCwKICAgICAgVG9rZW4gaWRlbnRpZmllck9yT3BlcmF0b3IpIHsKICAgIC8vIEFkanVzdCB0aGUgdG9rZW4gb2Zmc2V0cyB0byBtYXRjaCB0aGUgZW5jbG9zaW5nIGNvbW1lbnQgdG9rZW4uCiAgICBUb2tlbiB0b2tlbiA9IGJlZ2luOwogICAgZG8gewogICAgICB0b2tlbi5vZmZzZXQgKz0gcmVmZXJlbmNlT2Zmc2V0OwogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB9IHdoaWxlICghdG9rZW4uaXNFb2YpOwoKICAgIGxpc3RlbmVyLmhhbmRsZUNvbW1lbnRSZWZlcmVuY2UoCiAgICAgICAgbmV3S2V5d29yZCwgcHJlZml4LCBwZXJpb2QsIGlkZW50aWZpZXJPck9wZXJhdG9yKTsKICB9CgogIC8vLyBHaXZlbiB0aGF0IHdlIGhhdmUganVzdCBmb3VuZCBicmFja2V0ZWQgdGV4dCB3aXRoaW4gdGhlIGdpdmVuIFtjb21tZW50XSwKICAvLy8gbG9vayB0byBzZWUgd2hldGhlciB0aGF0IHRleHQgaXMgKGEpIGZvbGxvd2VkIGJ5IGEgcGFyZW50aGVzaXplZCBsaW5rCiAgLy8vIGFkZHJlc3MsIChiKSBmb2xsb3dlZCBieSBhIGNvbG9uLCBvciAoYykgZm9sbG93ZWQgYnkgb3B0aW9uYWwgd2hpdGVzcGFjZQogIC8vLyBhbmQgYW5vdGhlciBzcXVhcmUgYnJhY2tldC4gVGhlIFtyaWdodEluZGV4XSBpcyB0aGUgaW5kZXggb2YgdGhlIHJpZ2h0CiAgLy8vIGJyYWNrZXQuIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGJyYWNrZXRlZCB0ZXh0IGlzIGZvbGxvd2VkIGJ5IGEgbGluawogIC8vLyBhZGRyZXNzLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCB1c2VzIHRoZSBzeW50YXggZGVzY3JpYmVkIGJ5IHRoZQogIC8vLyA8YSBocmVmPSJodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCI+bWFya2Rvd248L2E+CiAgLy8vIHByb2plY3QuCiAgYm9vbCBpc0xpbmtUZXh0KFN0cmluZyBjb21tZW50LCBpbnQgcmlnaHRJbmRleCkgewogICAgaW50IGxlbmd0aCA9IGNvbW1lbnQubGVuZ3RoOwogICAgaW50IGluZGV4ID0gcmlnaHRJbmRleCArIDE7CiAgICBpZiAoaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGludCBjaCA9IGNvbW1lbnQuY29kZVVuaXRBdChpbmRleCk7CiAgICBpZiAoY2ggPT0gMHgyOCB8fCBjaCA9PSAweDNBKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgd2hpbGUgKGlzV2hpdGVzcGFjZShjaCkpIHsKICAgICAgaW5kZXggPSBpbmRleCArIDE7CiAgICAgIGlmIChpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgY2ggPSBjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpOwogICAgfQogICAgcmV0dXJuIGNoID09IDB4NUI7CiAgfQp9CgovLyBUT0RPKGFoZSk6IFJlbW92ZSB3aGVuIGFuYWx5emVyIHN1cHBvcnRzIGdlbmVyYWxpemVkIGZ1bmN0aW9uIHN5bnRheC4KdHlwZWRlZiBfTWVzc2FnZVdpdGhBcmd1bWVudDxUPiA9IE1lc3NhZ2UgRnVuY3Rpb24oVCk7CppiAE5OPAEdATUBJwExASIJHxQcHREcHx0dHx4YEwEpCRoVFhMYEhgUGxoTFxIiGiMZLyQWASIBMQEhASQJHSgxATsBITYBJgEhCRodHxUBKQErAUkBIQklICUBPgEYCRIcJBUfHhAaARMJICgSGREWFhIBUCsESSUERQRNPQQ/TE9DLUYvSEpHBEQtBElKNkpLSARIN08jBBUESE0xBBwETksyTxoEUE5PSwRQOgQ1BEpNUE8PBEgkBDMETScETQQgBEZIRkJPTC0EMwQtBFBHTSYEMgRIT1FFSwQoBExRTEo1BE1NNkdQT04EKQRGSw4EUC4XBB4ESkxOEQRLTFAESVBKSDEPFQEfASsBSk5QMQFJS01KNwE/SzEvATE3JgElMhsEARkBGTQuBAEVMC8EATwBQQFDAU0BIAZNT1AbBgoZExUYFxwIBhcnCAohOUceKQEqEz4rPDgiBiAmQzMPIRVPPBwrJSk3OjURCAYYJi80GxIEATlHBkU+Bk1PUBsnKhM+KyAmNwFKJycnDwgBPjokDyokMio2KDE2KDI3LS8+LBkRKxEKCDMGGC80GxIEASUGTU9QGzAMUCwSBAEKGhoTFCwqKyk0SEMgCAomNiYdIksGGUAbIyRDTzowLC8IJhwIBhciSy01MSotJSpOLQYQN1BDJzcqOywGSygzBAE2Q0UhIiw6GQ8UOAggBhEEAUNDISISNiAGBAFKIktMQTEvRjVFOEgPKTkIDSc3BgQBQkUpRScuJSpMSCsqNSENQDQ4ODNELC8uLUAjMkMwLAwKLC8PNyo2JzE2JzIuKDAuJjQuKi89MjcsCggGAUMEAQoYIAgKMTEvUDQkNBIEAQoUJAgKLB1DIiMgQT0nHlE0DS8GEgQBChdMCAorLyk2FywpLSAwFA0SLycGBAFRGismOwFDTSEsKSgBQzk5AUEfMQEuFQkgAUomTwE/SiAuMCxILiBIKyRIKQoIAS4uNxwPLQg2LCJRERtFMwxDCggwGSJJER8kUQwcCggBKkcBJyAxTSwILyEBNh5NBgEWBAEKFxgICi8vEykPKgYoEgQBChY6CAorKiMpIiUeRzYGKB0YIBspGQYmKyJOOA9OGQgGEiIBKEQSBAEKEiUICidDIxMoIEEPBjcSBAEKFzcICisvKTYsKCQuEgQBChMrCAorHSUTEycmIi0iDygPCBkPBhIEAQoWHggKISQrJS4jEgQBChYeCAohJCslLiMSBAEKFiUICitDEyhKDwYqEgQBChAZCAolKEQTKFAPBiESBAFQKyw2Jw00JQYEAQoVFwgKJyslNCQqEgQBChcqCAopKCsnJzARE0QzDS4GJEASBAEKEBQICiksEygkDwYlEgQBChIzCAolICQlTAxOJU4GRhklGyBNBiY3EgQBChEhCAojGDkiEgQBChErSwgGFEEGFRoIBhk/CAYWHwgKLTE1PDoSRx5DNU47JUgNOE01DlEGJEISBAFNJDEkKkceTEo1OQgGKEESBAEqJCkqMw0qBhIEAVAdJ0EdHxZGCDIbNQ0SKCAfFykcCghDMzYGEgQBQR0fMg01BhIEAT03BAFBIj0zJyc+FwQBNgZJTUkdIEMyBjIEAUklBklNPjgEAUkoBklNQhkiMRwTHyEWDwgYJyNAMA8qOzAPKxQuQDAPCFAZIiEjGBEWLEFFQzY0KicXQUcWEzQMCg8IFAYiRhIEAVAPNTA0NSszBjMEAQodIh8eCAYfSQgGHUAIBhxRCAoeTyMmHRgBIDoBGRobHChCKB0KCAEeKzc5Kx8MCgEgISkuITIuIQ4MASIYUDAuMwE7Mx8BNTM3ARwMCggGASNMAVAkPCYXHiBALTAtGQYBIjwBFxskNgE1IhkiOyITPUQIJhk4BgEdFBkGJDUfMCsuKikkSgwsKB0KCCYlIEYIKB0ZBh4jLEoGASEsHkRRNEBFFjdHCDAvAUcmLRw+NQghOw00BgEVIx8GF04eKA1AQk8IBiklBhcBJSw+GiU9Nxk7R0c5OyA/SyMgQCM4PU4IDTgGSUYSBAEKHjAICkomIjMcEx8hDwgkQBkYIiQWIkYzIScgDAoPCBQGHxkRMyREJEAYBhgiSBIEAQodMjAICkUmIjMcEx8hDwgOUBkYIiQWIkYzIScgDAoPCBQGHxkRMCREDlAYBhgiSBIEAQoRIggKPy8uKD4GEgQBChgXCAofPCU9DRQGBAEKFRcICkUYIhouJhIEASE+NAQBChBICAonKyUSSiITJBkVISMYHE4MEQoqURsRIxgqGBERFi8mRj0TKktKRkckSBNAJEgoEwwKCA1QTCIGIjUSBAErMS0xNyNNUCVHRQ1CNQYEASQ2JyNFLiQuJjAGJCdAEgQBTi4GChc+Ljg5CApDGT0mEkQ1BiowEgQBTCknMxcqICgGQhIEATxRJkABQ04hPT9FOQFBIDEBLREJFQFFJkgBP08gAS5AIFE0Oz8+Dy0IATUaIk4RGUQxJkQ3DB0KCAEpATIXIkgRH0E0DBoKCAE1ATgdRTARIAoIASsBSzwBIBIEASwdJSNFMw0kKQYSBAEKGC4ICjYdHS4mCxBPGysGTxIEASEGChhCRAgKKS0+I00YRjhCJhJKNQYqNxIEAT8kMy4SBAEiPCZAAUNOITw1RQFBIDEBLREJFQFFJjsBQ04gAS5FIEwlDygIATAVIksRHyRODBgKCAE1ATgdRTARIAoIASsBSzwBIBIEAQoQJggKJycnFAYgBAEkIkUoKicXCVETKTISBAEKQwseCwoxNSQdNhQNEwZMQCImEiwvKSBLDyBLSAgGNjgmEh8cIyksJCY+MlAYHSMaHwwREQoIOQY7KkoSBAEnHSVLKUwGJREEAVBRFEoxHTNCNgQBUBcGTU81Qx0jLzoiMAY0FwQBMjAuBAEtSwQBKwZNT1AbKz4wBAEvHx0oARkVGwEcKCYbCB4nKh0sKh0uKh0tJB09LB8MCiAWKSorLkdIE1AuJjMBOx8BMys3ARwMCggGAR45JhcBFCU+JCEbCAYBLSBJQicgJiYmJyYmJhYkLSRAE0koHCEuNEcQDgw7FwotJxQeQjUrJjkRPTtRHQoIBi0BFh4cISEhISIlME8RK0IKJik6CEkrBgEcJzcGSkIEARUZGxkcFx0YGRIZIUkGIktQHwgGHjpPCA1JTAgGATggASs4Li0BGCY9KDQoPxQGIiQZDRIYKjMqUEYwIB0vNksPKAgGFklBDUFBBhIEAURJPgE4Lh1LARscKA0sFDIGKzszIypJRgYtNB4/BjklQxIEASklOgZENiUSGk0GEgQBSzAdHx8sJTwNOjIiFDkwITIhIhQ5MAoINQYSBAEzJSU1KzMNOAYSBAEsJSwNJxQGBAEKFD0ICikZIicTLCkYEyYPGSIrEQo4RkE6KBwmEwxLESgeKBUOHi8VDgwcJhMMSQpLLiBKRggGJzgSBAEKHC4bEggGGEsICigdJSQkNisUKjUpFBkhFhshGBEWLToKGyNDCgghQhs7IkIKFggSJUssIERAQBsIIiQfIjYINUg7OENPQiNBCA0yKTVPQjk/BhE9PjI4NCc+Pzg9BAElCi4KPR4mHR8UGSs4LAgUGQYgEiJHFhsiSzwKFhsIIShGESJKCikgSS0IBjIEATYkKRIEAVFQUDonIUwdKhwfQyBEDzsvJk4IDUIGHwQBIx04TTZJJBcEAT1ENjkdHxMGKjs/QAYBQRxAATBHMR8EAURGIx0qR0s4BAE6LjcrHS9KF1AzBiYEAT1BKidOQj0dKgFKOTJCP0YEAU9BSjEyBAE/Gi0dIh5ERTgSBAFRUUkdIDYzM1AXCggGEgQBKSwtGisWKQY3HEMSBAEsPisEAQoRHQgKLSYiKxMtMg8GGCI3EgQBJCghIQElBk1PUBsvTAQBChMbIRoIBhMbGggKMzoBGhkVFxsBHRwoJhsIHigmHTIpHQogKSwfLiwfSiwfLyYfPy4hDgwiUDAuJiozAT4fATUzKy83ARwMCggGARwBHjkmFwEULSdAJiMdCk0wITYlSwxIPyAYCkgxIUQ5NU4fGx0bHhkfGhgYGyAYLSYhKSooMhsdGx4ZHxsqFh8bHRseGR8aGBgbIBgKSScqJikULhMZGxkcFx0YFhcIQB9FLyUlJjIyGx0bHhkfGwoIBgFFFiUcISEhISIbFxkXGhUbFhQUFw0eKTkIGxcZFxoVGxYUFhIGGhIEARUZGxkcFx0YGRYUHSc4Bh06IiE2OCQbCAYBHxhKHAgpO04fCAYjMCArQiIKNU0gDzQpQCAIBgFMPEUqATguHwEWKA1MHidFCAYBGxwpDSwyBgEqIiYfH0Q2QAEzIypJRgYdISJLCAYfSjINLkoGJUUqEgQBUDgvMQEtEkooMC0BOQEtSTEBFgYBJSdABkonPh4GAU5KI0EnSSMqHRhHBh8jTwgyKCJMCDUNQjJOCgg2BkgSBAEpHxgpHSg+NjVPFg8yFQgmTCUSTBgwEw0SNy0vPExOCDcTBgQBLyMyRzM8EgQBHhMYEhkkIzo3JUoEAU9NHwZOSE5NLQZGBhhMMhUgUSMnDFETIB5CBixJKUMgMg0zBhIEAUtQUE9IBlAbRDMqSyUSBAFPEkkvI0QuMRklGydRDUsXBkESBAEzGCIxGi4kNxIEAU8bJh0kIEc/IigZIUUbCEM4BiUhFBxCCCwpJU5MRSccCDcoFEAmTkxFJxwINw0gOAYSBAFOUE9IBlAbRB0kICgZIT4VCElDRgYfHEEILhMnRiYsPyNPGiUjKD0PPAgUBhgcIBJNJkElUUgISj1FRU5NCEROFiMsD04zHwgGASonLBItJSUvUR0gSBwIGAYYIkEgEgQBTiMZJCEmOw06BhcnNgYSBAEpKyUaJgEjHAgrGiYBIxwIBhIEAS0RECUdIxwZIS4VFg8qCCkcGSEtFRYPSQgGLzVIBhIEARomIkxLIS4GKxYTBAEnOCwtCEIyBiohQCYtKkclKkQ/CDsrJClEPQg7KSZQOCotLissKSkrKictKiwpLywtKigpLBwhMDEMPwElJi0BIk4tCEIsQCwZMD8KQiw0OwguSignNioqLC0IOw07BgQBChYgCAorJiYpFSUmBiQkORIEAQoXIQgKLCYnKh0fNxMGJCQ1Fyc2BhIEAQoNFwgKIiVOIiESBAEKESQICi0dHyYYCSEZFD02Iy4SBAEKGxgICgZKTUoQMEtQEiQkLxIEARsnI1BMJh9AARImHjwYHQoPPRgdCggaO0gIDSwuSwYXEgQBNSktSgQBNiklMDImMTI4EgQBIzkdLzhEJzwzKQYdIC9BKi0fOSAaDDFDRRQjLzJHOUA4OkkaOEAaDEEzPE1PTEcnIkc0PkBQPjkrTy1RQDVHOEAaExgtPBoMNC40Ljo5EVA8NksmRxVRMQ4MMEAfEk8yChsaLwgGEgQBKCErRUk6JAghBhwEAS4wLSwlQQ1KNQYdEAkUOR1LGy4IRik5NRslCDgZJwFCHzM3BhsSBAFAKw8lGTBECkNHCDkoLBkRTi4kPUAqIyMjQRApOjYURTUjQRApOkAUKiUsKwglNi5KLT84Rg4MCggGPgQBTB0dEzotKDAsJxsrJBYiRis3Jkw8E00dDApDFjUrQDctChsoKzAKJzA1K0A3LQobDw8IBhIEAT8iJDlBJScoJyglKCgzQygtKC00LjUsKi4sLTshRi4vNiw7LxQcTy0PLggrQzQmMjIzMjYjPA0sBgcWByYEAUUdISofJy44Li8zL0swMQoUTE9MJDA6MDEKCAYsKDEnEgQBNCIlER5GNwY5NhIEATQeMTMSBAE0OQQBOCIeJCwiEgQBRiopNx0fISwlMgYSBAFHKyY5HR8cLCUzJ0EGEgQBThYGChM/CAoGUFBPQh8rOxMhN0YZBiwoEx8hFg8IFzodHSoRKwoqKAgZDyIjGBEKARQsMTo0SBNAJEgpDBEKN0RGIi8/OQgUBidIEgQBTkVGKiYdH08TBgEtKBNNTRYBExc6IUwxKDQlGiQqPQoPHx8sLSguQQ4TLQwsKgoIDxkBEyEeGwghKEkrFQgBGxQrPEs7SCQxQTwRIkY4JSpLLRcKCAYEASgGTU4yJy0rGiw2LERMBisEAUcGDEweUSM8TCovJ0wuHR8iKToIOjAGOB8yKT4YFAg+Bjk1HkI9BjgEAQoXJE4+JggKLDRJQDgbGygqKCw7DykIJgYSBAFNKCgGMzEiHUIuITknRgoIBiYEAScdIB5IMgYlBAE7HSA1QSkgSg8gPzU0GwgiNAgGJQQBChUvCAoqIyktMzgrEgQBKTEZNTc4MxIEAU8XBgoTPwgGElcIBhciCAosLS0dKz8oLDssFAYhKCw/LBQGIShFLBQGMS44LxIEAQoSEAgKJxgvMyYSBAEKFQ8ICioYMSkSBAEKFS4ICio2LCgtEzcvDwYVMQYnEgQBChU4CAoqKiYsHSglLxMpJy8TDRVIKhEiRggzFAYEATAYMSg+IB0aIDkiLCUiRyEKPUsgMTwPDwgcTCYZGAY5EgQBMR1NSRMNPQYEAQoWERAICigYQScSBAEKEw8ICigYJScSBAE8QUQnMw0yBiYxEgQBKB0mHxwNFAYEASkdICgUDSQGBAEKESUIBhQtLAgGFRkICiYrBAEqGSIkGycsKBMfIRYPCBomEE4XFyUpNVEIJhk+FyIjGBEKFC48SyQVP0ERMhEKCBQGIic4EgQBChEXCAorKSYWJSAGNzUuLAQBMTIfMkQ4QD4rCAYVBAEKEBIICispJjc1KSwEATATHydAFgg1OkwmGgg4JxkgBgQBSx0tHidFLRgKJwgaIiUnJSglKk4VCAYSBAFFLCMhJCEEAUgjKyg6ICYiMgoaJRgqIyMkMgoIQkEGOQQBUAZQSEsGSExKUEoiQToZHR8oGQYBFRsBHCMlJS4bKyIbOyodCggBHhRMIi8BQhsBJzMBGAgGAU1OBAEyPR4ZHR0ZMDEBMR0BLR8pOggNKi8nK0IoKzwKKjInCh5EPDZQCAYBHx8mJCEpCSo4CSwLKUQLKy1GIEElAS46Sh0ZHQovQzhIGxcbCAYBGk80LxYPMAgGAR8fJj8pOiMgJyMzLhwOEzQMCggGAR1QRCclN1EKNSJOCggGASYuIwYyF0ouOgYSBAFMEzkoQA8GHDA6GA01FAYEATwWTTQ0MhIEAQoTPggKKCAlKDMtIyYcKB4uKSwGMRIEAQoUNggGFUg7NCYIBh8jGAgKOylBJCoBOiM/QyZGDSs4BgQBNkhDKysSHk0BMxQjPgETID9EOw9PSwgBP04BOUEBIwYBTERLIkkEATxDTiI7RCw/DSY/Bh0fIEoIKBIhRScgRRdQCAYSBAFOTQYKFUg7NCYICkZAMComIyAuKhIEAU8rJywBMi0yDTcGHRMfIRYPCCsZIw8IBi1NKAYhRBIEAU5QDwYKFUg7NCYIChhJTikqJiMgJyMSBAEhSSInKkMBJCc5JiwgSQ8pPQgxREgGATMoNCgjORIEAQoWLQgKKyMrLjYyKiYjIDA4EgQBChM2CAotICUtNiomJSAtIyoeTEoGNiQ+EgQBCg0bCAo0PyAcIy0lL1EdHCBICBgfBhgiNRIEASkeIj9BKkg+JSEwEgQBSD4vGCYYAUtJRQEeGiIlOxcKNBUIBhIEAQoXIAgKQCMrLyc4EzsNQDVNBhIEAQoXGwgGJSkICkAjKypMSDceQxwWJEcGGiY1PBIEAQoYFggKLSMtMCk1EgQBChQ5CAYOGiMIBhE1CAYTGAgKKSMpLEIfGAEmQigeJCAbUCMjCCEaJx4BLipIQgoBLzY7MwoBMScRJicYLkcOAUFKGSQfJ0Y/AUpMGRsYHyIYGyAaATNIShwVFlEODB8qNjsyDjIaLChOEDVKSBAODApOIwgmPyEUQTQGASEmHjohMw0dQggGRhkEAQoXNQgKLCYvMjkqLioGJSA3EgQBChMpCAooTiwXISQtJB8aLhVNKSsxJxoMKCRFDCdDHREvMScaDCooJEYMNTAmLTgdLSoRERYiSDErIAwtEQoITj8TBhg8IhIEAUREEyY+HwYSBAE9JRMSExYbHCFCKBw1JygrSEkPDycnIStLJyJIGAoaCCkGSD8SBAEKFiAICistLRwjSRgiTQYkQxIEAQoROwgKMBgnJyEoKxIeTTwGHR0sKAEkJRooHCgpKB4KCAYBLyIYDRIiTjkPKTgaCAYBIiclTiseBhhHEgQBChcWCAosLD82BAEKGSMICi4wMxwjSRgpIEIIJR4bLjg1BiRJEgQBChYMCAorGCIqEgQBUD84IzMaHwYYBAFKTDApGRsZHBcdGj0BNiIBJhgNSUUGATkhIAEfFRcVGBMZFBIOGhoSBAFRUEUnExkbGRwXHRgZGB0lASUuKy0uMDtJUAYBHCEiIRsXGRcaFRsWFBQXJ05QKiQkFggNGxcZFxoVGxYUFhIGARoSBAFOPzAdPkYpAScUGQYSBAE+QCs8BAEoRUArJTYEASwiKBoGEgQBJyIaBhIEATcdJQ4cLDIfJwY1EQQBMSY+KR1CSUEdGRQZRkI6Gx8IBhIEATAlPSkdQUlBHRgUGTpNRTAfCAYSBAEzKEApTksyEgQBURg2IiQXBAFHLkxHS0cZIh0GJhkTBAFHLiMuGh4fJyYcHh4KLRwdCCAGFAQBQ0U2Liw3NgQBQjY+KicTIRMeLxsaBh01ERIILhcWCB0kMR8eCghCSQgXBhIEAU9ANjkTHiwlJy8mCj5LCggaBhIEAUlLTSoTFxoqIhFKKDgrEwwRJi8tO0QMPi5OJxUzPD0XDgwKKU88OCAKCA8GEgQBNzc9NkAUBkgPBgEgRxQGDQEwQBQGDUgPBhIEAUtEREQZHSIaGgYaOxYbGwYXRTJCIRcIBiInHxoGKR4mSBUIDSgeIihKFwopIh4oKystTU1QTRwKCAYpEgQBJRMbGBQUJEYZCScaHAElOwQBT0xPTUkPBjNQDzQhIBsUBigkEwYfGR0WCCYGFwQCAUk3AS5wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL3BhcnNlci5kYXJ0PXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9wYXJzZXIvcGFyc2VyX2Vycm9yLmRhcnSDXy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnBhcnNlci5wYXJzZXJfZXJyb3I7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgTWVzc2FnZTsKCmltcG9ydCAnLi4vc2Nhbm5lci5kYXJ0JyBzaG93IFRva2VuOwoKY2xhc3MgUGFyc2VyRXJyb3IgewogIC8vLyBDaGFyYWN0ZXIgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiBmaWxlIHdoZXJlIHRoaXMgZXJyb3Igc3RhcnRzLgogIGZpbmFsIGludCBiZWdpbk9mZnNldDsKCiAgLy8vIENoYXJhY3RlciBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZpbGUgd2hlcmUgdGhpcyBlcnJvciBlbmRzLgogIGZpbmFsIGludCBlbmRPZmZzZXQ7CgogIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZTsKCiAgUGFyc2VyRXJyb3IodGhpcy5iZWdpbk9mZnNldCwgdGhpcy5lbmRPZmZzZXQsIHRoaXMubWVzc2FnZSk7CgogIFBhcnNlckVycm9yLmZyb21Ub2tlbnMoVG9rZW4gYmVnaW4sIFRva2VuIGVuZCwgTWVzc2FnZSBtZXNzYWdlKQogICAgICA6IHRoaXMoYmVnaW4uY2hhck9mZnNldCwgZW5kLmNoYXJPZmZzZXQgKyBlbmQuY2hhckNvdW50LCBtZXNzYWdlKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkAke2JlZ2luT2Zmc2V0fTogJHttZXNzYWdlLm1lc3NhZ2V9XG4ke21lc3NhZ2UudGlwfSI7Cn0KHABOTjwBIwErASUBFEsZAUkXARkBPwFCSQFOAgE0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9wYXJzZXJfZXJyb3IuZGFydDdzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL2Fzc2VydC5kYXJ0giQvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5wYXJzZXIuQXNzZXJ0OwoKLy8vIFN5bnRhY3RpYyBmb3JtcyBvZiBgYXNzZXJ0YC4KLy8vCi8vLyBBbiBhc3NlcnRpb24gY2FuIGxlZ2FsbHkgb2NjdXIgYXMgYSBzdGF0ZW1lbnQuIEhvd2V2ZXIsIGFzc2VydGlvbnMgYXJlIGFsc28KLy8vIGV4cGVyaW1lbnRhbGx5IGFsbG93ZWQgaW4gaW5pdGlhbGl6ZXJzLiBGb3IgaW1wcm92ZWQgZXJyb3IgcmVjb3ZlcnksIHdlCi8vLyBhbHNvIGF0dGVtcHQgdG8gcGFyc2UgYXNzZXJ0cyBhcyBleHByZXNzaW9ucy4KZW51bSBBc3NlcnQgewogIEV4cHJlc3Npb24sCiAgSW5pdGlhbGl6ZXIsCiAgU3RhdGVtZW50LAp9ChIATk48AR0BIQRQTDIODg8NAgEucGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9hc3NlcnQuZGFydEZzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL2Zvcm1hbF9wYXJhbWV0ZXJfa2luZC5kYXJ0gsovLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5wYXJzZXIuZm9ybWFsX3BhcmFtZXRlcl9raW5kOwoKZW51bSBGb3JtYWxQYXJhbWV0ZXJLaW5kIHsKICBtYW5kYXRvcnksCiAgb3B0aW9uYWxOYW1lZCwKICBvcHRpb25hbFBvc2l0aW9uYWwsCn0KCmJvb2wgaXNNYW5kYXRvcnlGb3JtYWxQYXJhbWV0ZXJLaW5kKEZvcm1hbFBhcmFtZXRlcktpbmQgdHlwZSkgewogIHJldHVybiBGb3JtYWxQYXJhbWV0ZXJLaW5kLm1hbmRhdG9yeSA9PSB0eXBlOwp9Cgpib29sIGlzT3B0aW9uYWxOYW1lZEZvcm1hbFBhcmFtZXRlcktpbmQoRm9ybWFsUGFyYW1ldGVyS2luZCB0eXBlKSB7CiAgcmV0dXJuIEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxOYW1lZCA9PSB0eXBlOwp9Cgpib29sIGlzT3B0aW9uYWxQb3NpdGlvbmFsRm9ybWFsUGFyYW1ldGVyS2luZChGb3JtYWxQYXJhbWV0ZXJLaW5kIHR5cGUpIHsKICByZXR1cm4gRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbFBvc2l0aW9uYWwgPT0gdHlwZTsKfQoZAE5OPAEsARsNERYCAUAwAgFENAIBSTkCAT1wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2Zvcm1hbF9wYXJhbWV0ZXJfa2luZC5kYXJ0Q3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9wYXJzZXIvaWRlbnRpZmllcl9jb250ZXh0LmRhcnSzji8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbiwgVG9rZW5UeXBlOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IE1lc3NhZ2UsIFRlbXBsYXRlLCB0ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcjsKCmltcG9ydCAnLi4vc2Nhbm5lci90b2tlbl9jb25zdGFudHMuZGFydCcgc2hvdyBJREVOVElGSUVSX1RPS0VOOwoKaW1wb3J0ICdpZGVudGlmaWVyX2NvbnRleHRfaW1wbC5kYXJ0JzsKCmltcG9ydCAncGFyc2VyLmRhcnQnIHNob3cgUGFyc2VyOwoKaW1wb3J0ICd1dGlsLmRhcnQnIHNob3cgaXNPbmVPZk9yRW9mLCBvcHRpb25hbDsKCi8vLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFyc2VyIHN0YXRlIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lciBhdCB0aGUKLy8vIHRpbWUgYW4gaWRlbnRpZmllciBpcyBlbmNvdW50ZXJlZC4gSXQgaXMgYWxzbyB1c2VkIGJ5IHRoZSBwYXJzZXIgZm9yIGVycm9yCi8vLyByZWNvdmVyeSB3aGVuIGEgcmVjb3ZlcnkgdGVtcGxhdGUgaXMgZGVmaW5lZC4KLy8vCi8vLyBUaGlzIGNhbiBiZSB1c2VkIGJ5IHRoZSBsaXN0ZW5lciB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlCi8vLyBpZGVudGlmaWVyIGFwcGVhcnM7IHRoYXQgaW4gdHVybiBjYW4gaGVscCB0aGUgbGlzdGVuZXIgZGVjaWRlIGhvdyB0byByZXNvbHZlCi8vLyB0aGUgaWRlbnRpZmllciAoaWYgdGhlIGxpc3RlbmVyIGlzIGRvaW5nIHJlc29sdXRpb24pLgpjbGFzcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgLy8vIElkZW50aWZpZXIgaXMgYmVpbmcgZGVjbGFyZWQgYXMgdGhlIG5hbWUgb2YgYW4gaW1wb3J0IHByZWZpeCAoaS5lLiBgRm9vYAogIC8vLyBpbiBgaW1wb3J0ICIuLi4iIGFzIEZvbztgKQogIHN0YXRpYyBjb25zdCBpbXBvcnRQcmVmaXhEZWNsYXJhdGlvbiA9IGNvbnN0IEltcG9ydFByZWZpeElkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHRoZSBzdGFydCBvZiBhIGRvdHRlZCBuYW1lIGluIGEgY29uZGl0aW9uYWwgaW1wb3J0IG9yCiAgLy8vIGV4cG9ydC4KICBzdGF0aWMgY29uc3QgZG90dGVkTmFtZSA9IGNvbnN0IERvdHRlZE5hbWVJZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyBwYXJ0IG9mIGEgZG90dGVkIG5hbWUgaW4gYSBjb25kaXRpb25hbCBpbXBvcnQgb3IgZXhwb3J0LCBidXQKICAvLy8gaXQncyBub3QgdGhlIGZpcnN0IGlkZW50aWZpZXIgb2YgdGhlIGRvdHRlZCBuYW1lLgogIHN0YXRpYyBjb25zdCBkb3R0ZWROYW1lQ29udGludWF0aW9uID0KICAgICAgY29uc3QgRG90dGVkTmFtZUlkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpOwoKICAvLy8gSWRlbnRpZmllciBpcyBvbmUgb2YgdGhlIHNob3duL2hpZGRlbiBuYW1lcyBpbiBhbiBpbXBvcnQvZXhwb3J0CiAgLy8vIGNvbWJpbmF0b3IuCiAgc3RhdGljIGNvbnN0IGNvbWJpbmF0b3IgPSBjb25zdCBDb21iaW5hdG9ySWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIHN0YXJ0IG9mIGEgbmFtZSBpbiBhbiBhbm5vdGF0aW9uIHRoYXQgcHJlY2VkZXMgYQogIC8vLyBkZWNsYXJhdGlvbiAoaS5lLiBpdCBhcHBlYXJzIGRpcmVjdGx5IGFmdGVyIGFuIGBAYCkuCiAgc3RhdGljIGNvbnN0IG1ldGFkYXRhUmVmZXJlbmNlID0gY29uc3QgTWV0YWRhdGFSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyBwYXJ0IG9mIGEgbmFtZSBpbiBhbiBhbm5vdGF0aW9uIHRoYXQgcHJlY2VkZXMgYSBkZWNsYXJhdGlvbiwKICAvLy8gYnV0IGl0J3Mgbm90IHRoZSBmaXJzdCBpZGVudGlmaWVyIGluIHRoZSBuYW1lLgogIHN0YXRpYyBjb25zdCBtZXRhZGF0YUNvbnRpbnVhdGlvbiA9CiAgICAgIGNvbnN0IE1ldGFkYXRhUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHBhcnQgb2YgYSBuYW1lIGluIGFuIGFubm90YXRpb24gdGhhdCBwcmVjZWRlcyBhIGRlY2xhcmF0aW9uLAogIC8vLyBidXQgaXQgYXBwZWFycyBhZnRlciB0eXBlIHBhcmFtZXRlcnMgKGUuZy4gYGZvb2AgaW4gYEBYPFk+LmZvbygpYCkuCiAgc3RhdGljIGNvbnN0IG1ldGFkYXRhQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzID0KICAgICAgY29uc3QgTWV0YWRhdGFSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHMoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIG5hbWUgYmVpbmcgZGVjbGFyZWQgYnkgYSB0eXBlZGVmIGRlY2xhcmF0aW9uLgogIHN0YXRpYyBjb25zdCB0eXBlZGVmRGVjbGFyYXRpb24gPSBjb25zdCBUeXBlZGVmRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyBhIGZpZWxkIGluaXRpYWxpemVyIGluIGEgZm9ybWFsIHBhcmFtZXRlciBsaXN0IChpLmUuIGl0CiAgLy8vIGFwcGVhcnMgZGlyZWN0bHkgYWZ0ZXIgYHRoaXMuYCkuCiAgc3RhdGljIGNvbnN0IGZpZWxkSW5pdGlhbGl6ZXIgPSBjb25zdCBGaWVsZEluaXRpYWxpemVySWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgYSBmb3JtYWwgcGFyYW1ldGVyIGJlaW5nIGRlY2xhcmVkIGFzIHBhcnQgb2YgYSBmdW5jdGlvbiwKICAvLy8gbWV0aG9kLCBvciB0eXBlZGVmIGRlY2xhcmF0aW9uLgogIHN0YXRpYyBjb25zdCBmb3JtYWxQYXJhbWV0ZXJEZWNsYXJhdGlvbiA9CiAgICAgIGNvbnN0IEZvcm1hbFBhcmFtZXRlckRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgYSBmb3JtYWwgcGFyYW1ldGVyIGJlaW5nIGRlY2xhcmVkIGFzIHBhcnQgb2YgYSBjYXRjaCBibG9jawogIC8vLyBpbiBhIHRyeS9jYXRjaC9maW5hbGx5IHN0YXRlbWVudC4KICBzdGF0aWMgY29uc3QgY2F0Y2hQYXJhbWV0ZXIgPSBjb25zdCBDYXRjaFBhcmFtZXRlcklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHRoZSBzdGFydCBvZiBhIGxpYnJhcnkgbmFtZSAoZS5nLiBgZm9vYCBpbiB0aGUgZGlyZWN0aXZlCiAgLy8vICdsaWJyYXJ5IGZvbztgKS4KICBzdGF0aWMgY29uc3QgbGlicmFyeU5hbWUgPSBjb25zdCBMaWJyYXJ5SWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiBhIGxpYnJhcnkgbmFtZSwgYnV0IGl0J3Mgbm90IHRoZSBmaXJzdCBpZGVudGlmaWVyIGluCiAgLy8vIHRoZSBuYW1lLgogIHN0YXRpYyBjb25zdCBsaWJyYXJ5TmFtZUNvbnRpbnVhdGlvbiA9CiAgICAgIGNvbnN0IExpYnJhcnlJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIHN0YXJ0IG9mIGEgbGlicmFyeSBuYW1lIHJlZmVyZW5jZWQgYnkgYSBgcGFydCBvZmAKICAvLy8gZGlyZWN0aXZlIChlLmcuIGBmb29gIGluIHRoZSBkaXJlY3RpdmUgYHBhcnQgb2YgZm9vO2ApLgogIHN0YXRpYyBjb25zdCBwYXJ0TmFtZSA9IGNvbnN0IExpYnJhcnlJZGVudGlmaWVyQ29udGV4dC5wYXJ0TmFtZSgpOwoKICAvLy8gSWRlbnRpZmllciBpcyBwYXJ0IG9mIGEgbGlicmFyeSBuYW1lIHJlZmVyZW5jZWQgYnkgYSBgcGFydCBvZmAgZGlyZWN0aXZlLAogIC8vLyBidXQgaXQncyBub3QgdGhlIGZpcnN0IGlkZW50aWZpZXIgaW4gdGhlIG5hbWUuCiAgc3RhdGljIGNvbnN0IHBhcnROYW1lQ29udGludWF0aW9uID0KICAgICAgY29uc3QgTGlicmFyeUlkZW50aWZpZXJDb250ZXh0LnBhcnROYW1lQ29udGludWF0aW9uKCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHRoZSB0eXBlIG5hbWUgYmVpbmcgZGVjbGFyZWQgYnkgYW4gZW51bSBkZWNsYXJhdGlvbi4KICBzdGF0aWMgY29uc3QgZW51bURlY2xhcmF0aW9uID0gY29uc3QgRW51bURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgYW4gZW51bWVyYXRlZCB2YWx1ZSBuYW1lIGJlaW5nIGRlY2xhcmVkIGJ5IGFuIGVudW0KICAvLy8gZGVjbGFyYXRpb24uCiAgc3RhdGljIGNvbnN0IGVudW1WYWx1ZURlY2xhcmF0aW9uID0KICAgICAgY29uc3QgRW51bVZhbHVlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgbmFtZSBiZWluZyBkZWNsYXJlZCBieSBhIGNsYXNzIGRlY2xhcmF0aW9uLCBhIG1peGluCiAgLy8vIGRlY2xhcmF0aW9uLCBvciBhIG5hbWVkIG1peGluIGFwcGxpY2F0aW9uLCBmb3IgZXhhbXBsZSwKICAvLy8gYEZvb2AgaW4gYGNsYXNzIEZvbyA9IFggd2l0aCBZO2AuCiAgc3RhdGljIGNvbnN0IGNsYXNzT3JNaXhpbk9yRXh0ZW5zaW9uRGVjbGFyYXRpb24gPQogICAgICBjb25zdCBDbGFzc09yTWl4aW5PckV4dGVuc2lvbklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHRoZSBuYW1lIG9mIGEgdHlwZSB2YXJpYWJsZSBiZWluZyBkZWNsYXJlZCAoZS5nLiBgRm9vYCBpbgogIC8vLyBgY2xhc3MgQzxGb28gZXh0ZW5kcyBudW0+IHt9YCkuCiAgc3RhdGljIGNvbnN0IHR5cGVWYXJpYWJsZURlY2xhcmF0aW9uID0KICAgICAgY29uc3QgVHlwZVZhcmlhYmxlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgc3RhcnQgb2YgYSByZWZlcmVuY2UgdG8gYSB0eXBlIHRoYXQgc3RhcnRzIHdpdGggcHJlZml4LgogIHN0YXRpYyBjb25zdCBwcmVmaXhlZFR5cGVSZWZlcmVuY2UgPQogICAgICBjb25zdCBUeXBlUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQucHJlZml4ZWQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIHN0YXJ0IG9mIGEgcmVmZXJlbmNlIHRvIGEgdHlwZSBkZWNsYXJlZCBlbHNld2hlcmUuCiAgc3RhdGljIGNvbnN0IHR5cGVSZWZlcmVuY2UgPSBjb25zdCBUeXBlUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiBhIHJlZmVyZW5jZSB0byBhIHR5cGUgZGVjbGFyZWQgZWxzZXdoZXJlLCBidXQgaXQncwogIC8vLyBub3QgdGhlIGZpcnN0IGlkZW50aWZpZXIgb2YgdGhlIHJlZmVyZW5jZS4KICBzdGF0aWMgY29uc3QgdHlwZVJlZmVyZW5jZUNvbnRpbnVhdGlvbiA9CiAgICAgIGNvbnN0IFR5cGVSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgYSBuYW1lIGJlaW5nIGRlY2xhcmVkIGJ5IGEgdG9wIGxldmVsIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgogIHN0YXRpYyBjb25zdCB0b3BMZXZlbFZhcmlhYmxlRGVjbGFyYXRpb24gPQogICAgICBjb25zdCBUb3BMZXZlbERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoCiAgICAgICAgICAndG9wTGV2ZWxWYXJpYWJsZURlY2xhcmF0aW9uJywgY29uc3QgWyc7JywgJz0nLCAnLCddKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgYSBuYW1lIGJlaW5nIGRlY2xhcmVkIGJ5IGEgZmllbGQgZGVjbGFyYXRpb24uCiAgc3RhdGljIGNvbnN0IGZpZWxkRGVjbGFyYXRpb24gPSBjb25zdCBGaWVsZERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIG5hbWUgYmVpbmcgZGVjbGFyZWQgYnkgYSB0b3AgbGV2ZWwgZnVuY3Rpb24gZGVjbGFyYXRpb24uCiAgc3RhdGljIGNvbnN0IHRvcExldmVsRnVuY3Rpb25EZWNsYXJhdGlvbiA9CiAgICAgIGNvbnN0IFRvcExldmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgKICAgICAgICAgICd0b3BMZXZlbEZ1bmN0aW9uRGVjbGFyYXRpb24nLCBjb25zdCBbJzwnLCAnKCcsICd7JywgJz0+J10pOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgc3RhcnQgb2YgdGhlIG5hbWUgYmVpbmcgZGVjbGFyZWQgYnkgYSBtZXRob2QKICAvLy8gZGVjbGFyYXRpb24uCiAgc3RhdGljIGNvbnN0IG1ldGhvZERlY2xhcmF0aW9uID0gY29uc3QgTWV0aG9kRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyBwYXJ0IG9mIHRoZSBuYW1lIGJlaW5nIGRlY2xhcmVkIGJ5IGEgbWV0aG9kIGRlY2xhcmF0aW9uLAogIC8vLyBidXQgaXQncyBub3QgdGhlIGZpcnN0IGlkZW50aWZpZXIgb2YgdGhlIG5hbWUuCiAgLy8vCiAgLy8vIEluIHZhbGlkIERhcnQsIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBpZGVudGlmaWVyIGlzIHRoZSBuYW1lIG9mIGEKICAvLy8gbmFtZWQgY29uc3RydWN0b3Igd2hpY2ggaXMgYmVpbmcgZGVjbGFyZWQsIGUuZy4gYGZvb2AgaW4KICAvLy8gYGNsYXNzIEMgeyBDLmZvbygpOyB9YC4KICBzdGF0aWMgY29uc3QgbWV0aG9kRGVjbGFyYXRpb25Db250aW51YXRpb24gPQogICAgICBjb25zdCBNZXRob2REZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpOwoKICAvLy8gSWRlbnRpZmllciBhcHBlYXJzIGFmdGVyIHRoZSB3b3JkIGBvcGVyYXRvcmAgaW4gYSBtZXRob2QgZGVjbGFyYXRpb24uCiAgLy8vCiAgLy8vIFRPRE8ocGF1bGJlcnJ5LGFoZSk6IERvZXMgdGhpcyBldmVyIG9jY3VyIGluIHZhbGlkIERhcnQsIG9yIGRvZXMgaXQgb25seQogIC8vLyBvY2N1ciBhcyBwYXJ0IG9mIGVycm9yIHJlY292ZXJ5PyAgSWYgaXQncyBvbmx5IGFzIHBhcnQgb2YgZXJyb3IgcmVjb3ZlcnksCiAgLy8vIHBlcmhhcHMgd2Ugc2hvdWxkIGp1c3QgcmUtdXNlIG1ldGhvZERlY2xhcmF0aW9uLgogIHN0YXRpYyBjb25zdCBvcGVyYXRvck5hbWUgPQogICAgICBjb25zdCBNZXRob2REZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgc3RhcnQgb2YgdGhlIG5hbWUgYmVpbmcgZGVjbGFyZWQgYnkgYSBsb2NhbCBmdW5jdGlvbgogIC8vLyBkZWNsYXJhdGlvbi4KICBzdGF0aWMgY29uc3QgbG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uID0KICAgICAgY29uc3QgTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiB0aGUgbmFtZSBiZWluZyBkZWNsYXJlZCBieSBhIGxvY2FsIGZ1bmN0aW9uCiAgLy8vIGRlY2xhcmF0aW9uLCBidXQgaXQncyBub3QgdGhlIGZpcnN0IGlkZW50aWZpZXIgb2YgdGhlIG5hbWUuCiAgLy8vCiAgLy8vIFRPRE8ocGF1bGJlcnJ5LGFoZSk6IERvZXMgdGhpcyBldmVyIG9jY3VyIGluIHZhbGlkIERhcnQsIG9yIGRvZXMgaXQgb25seQogIC8vLyBvY2N1ciBhcyBwYXJ0IG9mIGVycm9yIHJlY292ZXJ5PwogIHN0YXRpYyBjb25zdCBsb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25Db250aW51YXRpb24gPQogICAgICBjb25zdCBMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIHN0YXJ0IG9mIGEgcmVmZXJlbmNlIHRvIGEgY29uc3RydWN0b3IgZGVjbGFyZWQKICAvLy8gZWxzZXdoZXJlLgogIHN0YXRpYyBjb25zdCBjb25zdHJ1Y3RvclJlZmVyZW5jZSA9CiAgICAgIGNvbnN0IENvbnN0cnVjdG9yUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiBhIHJlZmVyZW5jZSB0byBhIGNvbnN0cnVjdG9yIGRlY2xhcmVkIGVsc2V3aGVyZSwgYnV0CiAgLy8vIGl0J3Mgbm90IHRoZSBmaXJzdCBpZGVudGlmaWVyIG9mIHRoZSByZWZlcmVuY2UuCiAgc3RhdGljIGNvbnN0IGNvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uID0KICAgICAgY29uc3QgQ29uc3RydWN0b3JSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiBhIHJlZmVyZW5jZSB0byBhIGNvbnN0cnVjdG9yIGRlY2xhcmVkIGVsc2V3aGVyZSwgYnV0CiAgLy8vIGl0IGFwcGVhcnMgYWZ0ZXIgdHlwZSBwYXJhbWV0ZXJzIChlLmcuIGBmb29gIGluIGBYPFk+LmZvb2ApLgogIHN0YXRpYyBjb25zdCBjb25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyA9CiAgICAgIGNvbnN0IENvbnN0cnVjdG9yUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQKICAgICAgICAgIC5jb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHMoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgbGFiZWwgKGkuZS4gaXQgaXMgZm9sbG93ZWQgYnkgYDpgIGFuZAogIC8vLyB0aGVuIGEgc3RhdGVtZW50KS4KICBzdGF0aWMgY29uc3QgbGFiZWxEZWNsYXJhdGlvbiA9IGNvbnN0IExhYmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgc3RhcnQgb2YgYSByZWZlcmVuY2Ugb2NjdXJyaW5nIGluIGEgbGl0ZXJhbCBzeW1ib2wgKGUuZy4KICAvLy8gYGZvb2AgaW4gYCNmb29gKS4KICBzdGF0aWMgY29uc3QgbGl0ZXJhbFN5bWJvbCA9IGNvbnN0IExpdGVyYWxTeW1ib2xJZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyBwYXJ0IG9mIGEgcmVmZXJlbmNlIG9jY3VycmluZyBpbiBhIGxpdGVyYWwgc3ltYm9sLCBidXQgaXQncwogIC8vLyBub3QgdGhlIGZpcnN0IGlkZW50aWZpZXIgb2YgdGhlIHJlZmVyZW5jZSAoZS5nLiBgZm9vYCBpbiBgI3ByZWZpeC5mb29gKS4KICBzdGF0aWMgY29uc3QgbGl0ZXJhbFN5bWJvbENvbnRpbnVhdGlvbiA9CiAgICAgIGNvbnN0IExpdGVyYWxTeW1ib2xJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKTsKCiAgLy8vIElkZW50aWZpZXIgYXBwZWFycyBpbiBhbiBleHByZXNzaW9uLCBhbmQgaXQgZG9lcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93IGEKICAvLy8gYC5gLgogIHN0YXRpYyBjb25zdCBleHByZXNzaW9uID0gY29uc3QgRXhwcmVzc2lvbklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGFwcGVhcnMgaW4gYW4gZXhwcmVzc2lvbiwgYW5kIGl0IGltbWVkaWF0ZWx5IGZvbGxvd3MgYSBgLmAuCiAgc3RhdGljIGNvbnN0IGV4cHJlc3Npb25Db250aW51YXRpb24gPQogICAgICBjb25zdCBFeHByZXNzaW9uSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIGEgcmVmZXJlbmNlIHRvIGEgbmFtZWQgYXJndW1lbnQgb2YgYSBmdW5jdGlvbiBvciBtZXRob2QKICAvLy8gaW52b2NhdGlvbiAoZS5nLiBgZm9vYCBpbiBgZihmb286IDApO2AuCiAgc3RhdGljIGNvbnN0IG5hbWVkQXJndW1lbnRSZWZlcmVuY2UgPQogICAgICBjb25zdCBOYW1lZEFyZ3VtZW50UmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgYSBuYW1lIGJlaW5nIGRlY2xhcmVkIGJ5IGEgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24uCiAgc3RhdGljIGNvbnN0IGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiA9CiAgICAgIGNvbnN0IExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIGEgcmVmZXJlbmNlIHRvIGEgbGFiZWwgKGUuZy4gYGZvb2AgaW4gYGJyZWFrIGZvbztgKS4KICAvLy8gTGFiZWxzIGhhdmUgdGhlaXIgb3duIHNjb3BlLgogIHN0YXRpYyBjb25zdCBsYWJlbFJlZmVyZW5jZSA9IGNvbnN0IExhYmVsUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKTsKCiAgZmluYWwgU3RyaW5nIF9uYW1lOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGlkZW50aWZpZXIgcmVwcmVzZW50cyBhIG5hbWUgd2hpY2ggaXMgYmVpbmcKICAvLy8gZGVjbGFyZWQuCiAgZmluYWwgYm9vbCBpbkRlY2xhcmF0aW9uOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGlkZW50aWZpZXIgaXMgd2l0aGluIGEgYGxpYnJhcnlgIG9yIGBwYXJ0IG9mYAogIC8vLyBkZWNsYXJhdGlvbi4KICBmaW5hbCBib29sIGluTGlicmFyeU9yUGFydE9mRGVjbGFyYXRpb247CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaWRlbnRpZmllciBpcyB3aXRoaW4gYSBzeW1ib2wgbGl0ZXJhbC4KICBmaW5hbCBib29sIGluU3ltYm9sOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGlkZW50aWZpZXIgZm9sbG93cyBhIGAuYC4KICBmaW5hbCBib29sIGlzQ29udGludWF0aW9uOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGlkZW50aWZpZXIgc2hvdWxkIGJlIGxvb2tlZCB1cCBpbiB0aGUgY3VycmVudCBzY29wZS4KICBmaW5hbCBib29sIGlzU2NvcGVSZWZlcmVuY2U7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciBidWlsdC1pbiBpZGVudGlmaWVycyBhcmUgYWxsb3dlZCBpbiB0aGlzIGNvbnRleHQuCiAgZmluYWwgYm9vbCBpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDsKCiAgLy8vIEluZGljYXRlZCB3aGV0aGVyIHRoZSBpZGVudGlmaWVyIGlzIGFsbG93ZWQgaW4gYSBjb250ZXh0IHdoZXJlIGNvbnN0YW50CiAgLy8vIGV4cHJlc3Npb25zIGFyZSByZXF1aXJlZC4KICBmaW5hbCBib29sIGFsbG93ZWRJbkNvbnN0YW50RXhwcmVzc2lvbjsKCiAgZmluYWwgVGVtcGxhdGU8X01lc3NhZ2VXaXRoQXJndW1lbnQ8VG9rZW4+PiByZWNvdmVyeVRlbXBsYXRlOwoKICBjb25zdCBJZGVudGlmaWVyQ29udGV4dCh0aGlzLl9uYW1lLAogICAgICB7dGhpcy5pbkRlY2xhcmF0aW9uOiBmYWxzZSwKICAgICAgdGhpcy5pbkxpYnJhcnlPclBhcnRPZkRlY2xhcmF0aW9uOiBmYWxzZSwKICAgICAgdGhpcy5pblN5bWJvbDogZmFsc2UsCiAgICAgIHRoaXMuaXNDb250aW51YXRpb246IGZhbHNlLAogICAgICB0aGlzLmlzU2NvcGVSZWZlcmVuY2U6IGZhbHNlLAogICAgICB0aGlzLmlzQnVpbHRJbklkZW50aWZpZXJBbGxvd2VkOiB0cnVlLAogICAgICBib29sIGFsbG93ZWRJbkNvbnN0YW50RXhwcmVzc2lvbiwKICAgICAgdGhpcy5yZWNvdmVyeVRlbXBsYXRlOiB0ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcn0pCiAgICAgIDogdGhpcy5hbGxvd2VkSW5Db25zdGFudEV4cHJlc3Npb24gPQogICAgICAgICAgICAvLyBHZW5lcmFsbHksIGRlY2xhcmF0aW9ucyBhcmUgbGVnYWwgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuICBBCiAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiBkb2Vzbid0IGFmZmVjdCBjb25zdGFudCBleHByZXNzaW9uczogaWYgd2hhdCBpdCdzCiAgICAgICAgICAgIC8vIGNvbnRpbnVpbmcgaXMgYSBwcm9ibGVtLCBpdCBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLgogICAgICAgICAgICBhbGxvd2VkSW5Db25zdGFudEV4cHJlc3Npb24gPz8KICAgICAgICAgICAgICAgIChpbkRlY2xhcmF0aW9uIHx8IGlzQ29udGludWF0aW9uIHx8IGluU3ltYm9sKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX25hbWU7CgogIC8vLyBFbnN1cmUgdGhhdCB0aGUgbmV4dCB0b2tlbiBpcyBhbiBpZGVudGlmaWVyIChvciBrZXl3b3JkIHdoaWNoIHNob3VsZCBiZQogIC8vLyB0cmVhdGVkIGFzIGFuIGlkZW50aWZpZXIpIGFuZCByZXR1cm4gdGhhdCBpZGVudGlmaWVyLgogIC8vLyBSZXBvcnQgZXJyb3JzIGFzIG5lY2Vzc2FyeSB2aWEgW3BhcnNlcl0uCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgYXNzZXJ0KHRva2VuLm5leHQua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIC8vIFRPRE8oZGFucnViZWwpOiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgZm9yIGVhY2ggaWRlbnRpZmllciBjb250ZXh0CiAgICAvLyBzdWNoIHRoYXQgdGhleSByZXR1cm4gYSBub24tbnVsbCB2YWx1ZS4KICAgIHJldHVybiBudWxsOwogIH0KfQoKLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFt0b2tlbl0gc2hvdWxkIGJlIHRyZWF0ZWQgbGlrZSB0aGUgc3RhcnQgb2YKLy8vIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBwdXJwb3NlcyBvZiByZWNvdmVyeS4KYm9vbCBsb29rc0xpa2VFeHByZXNzaW9uU3RhcnQoVG9rZW4gbmV4dCkgPT4KICAgIG5leHQuaXNJZGVudGlmaWVyIHx8CiAgICBuZXh0LmlzS2V5d29yZCAmJiAhbG9va3NMaWtlU3RhdGVtZW50U3RhcnQobmV4dCkgfHwKICAgIG5leHQudHlwZSA9PSBUb2tlblR5cGUuRE9VQkxFIHx8CiAgICBuZXh0LnR5cGUgPT0gVG9rZW5UeXBlLkhBU0ggfHwKICAgIG5leHQudHlwZSA9PSBUb2tlblR5cGUuSEVYQURFQ0lNQUwgfHwKICAgIG5leHQudHlwZSA9PSBUb2tlblR5cGUuSURFTlRJRklFUiB8fAogICAgbmV4dC50eXBlID09IFRva2VuVHlwZS5JTlQgfHwKICAgIG5leHQudHlwZSA9PSBUb2tlblR5cGUuU1RSSU5HIHx8CiAgICBvcHRpb25hbCgneycsIG5leHQpIHx8CiAgICBvcHRpb25hbCgnKCcsIG5leHQpIHx8CiAgICBvcHRpb25hbCgnWycsIG5leHQpIHx8CiAgICBvcHRpb25hbCgnW10nLCBuZXh0KSB8fAogICAgb3B0aW9uYWwoJzwnLCBuZXh0KSB8fAogICAgb3B0aW9uYWwoJyEnLCBuZXh0KSB8fAogICAgb3B0aW9uYWwoJy0nLCBuZXh0KSB8fAogICAgb3B0aW9uYWwoJ34nLCBuZXh0KSB8fAogICAgb3B0aW9uYWwoJysrJywgbmV4dCkgfHwKICAgIG9wdGlvbmFsKCctLScsIG5leHQpOwoKLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFt0b2tlbl0gc2hvdWxkIGJlIHRyZWF0ZWQgbGlrZSB0aGUgc3RhcnQgb2YKLy8vIGEgbmV3IHN0YXRlbWVudCBmb3IgdGhlIHB1cnBvc2VzIG9mIHJlY292ZXJ5Lgpib29sIGxvb2tzTGlrZVN0YXRlbWVudFN0YXJ0KFRva2VuIHRva2VuKSA9PiBpc09uZU9mT3JFb2YodG9rZW4sIGNvbnN0IFsKICAgICAgJ0AnLAogICAgICAnYXNzZXJ0JywgJ2JyZWFrJywgJ2NvbnRpbnVlJywgJ2RvJywgJ2Vsc2UnLCAnZmluYWwnLCAnZm9yJywgLy8KICAgICAgJ2lmJywgJ3JldHVybicsICdzd2l0Y2gnLCAndHJ5JywgJ3ZhcicsICd2b2lkJywgJ3doaWxlJywgLy8KICAgIF0pOwoKLy8gVE9ETyhhaGUpOiBSZW1vdmUgd2hlbiBhbmFseXplciBzdXBwb3J0cyBnZW5lcmFsaXplZCBmdW5jdGlvbiBzeW50YXguCnR5cGVkZWYgX01lc3NhZ2VXaXRoQXJndW1lbnQ8VD4gPSBNZXNzYWdlIEZ1bmN0aW9uKFQpOwqBNABOTjwBOQFRAUABJwEiATABTU8yBEtROhpPIVABSg5BAVE4KDgBRhJBAUk7TwFRNSY/AVFKOFEBRlEBTCdNAU0mLDsBTyhJAU0XPwFRECk1AUo+RQFQNSY9AUlLAUcTJjUBTD4oNDgBTiYpOAFQJzcBS0cBTzErOwFPLTJBAUJNAVEtMkcBRRNPAU01Bk0/Hi8/AUwGT1A3Hj8BTRMqOQFIQgZPJzZGAUcRJjUBUTYyQgFRQ0QyLQFPGU0BURhHAVBPKzsBUAtBAU0oOAFMLig3AUsqOQFJI0kBFgFIEBwBShMrAUMXATYdAVEfAUopAU4gKgFAASYiMBwiJC0oOitNTkYrPwEeAU48LzcxSS8RBAIBSzAtGTglIyopIiUbGxscGxsbGxwaAUsySQtGQggBSTcBOnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvaWRlbnRpZmllcl9jb250ZXh0LmRhcnQ8c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci9tZW1iZXJfa2luZC5kYXJ0g54vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5wYXJzZXIubWVtYmVyX2tpbmQ7CgplbnVtIE1lbWJlcktpbmQgewogIC8vLyBBIGNhdGNoIGJsb2NrLCBub3QgYSByZWFsIG1lbWJlci4KICBDYXRjaCwKCiAgLy8vIEEgZmFjdG9yeQogIEZhY3RvcnksCgogIC8vLyBPbGQtc3R5bGUgdHlwZWRlZi4KICBGdW5jdGlvblR5cGVBbGlhcywKCiAgLy8vIE9sZC1zdHlsZSBmdW5jdGlvbi10eXBlZCBwYXJhbWV0ZXIsIG5vdCBhIHJlYWwgbWVtYmVyLgogIEZ1bmN0aW9uVHlwZWRQYXJhbWV0ZXIsCgogIC8vLyBBIGdlbmVyYWxpemVkIGZ1bmN0aW9uIHR5cGUsIG5vdCBhIHJlYWwgbWVtYmVyLgogIEdlbmVyYWxpemVkRnVuY3Rpb25UeXBlLAoKICAvLy8gQSBsb2NhbCBmdW5jdGlvbi4KICBMb2NhbCwKCiAgLy8vIEEgbm9uLXN0YXRpYyBtZXRob2QgaW4gYSBjbGFzcyAoaW5jbHVkaW5nIGNvbnN0cnVjdG9ycykuCiAgTm9uU3RhdGljTWV0aG9kLAoKICAvLy8gQSBzdGF0aWMgbWV0aG9kIGluIGEgY2xhc3MuCiAgU3RhdGljTWV0aG9kLAoKICAvLy8gQSB0b3AtbGV2ZWwgbWV0aG9kLgogIFRvcExldmVsTWV0aG9kLAoKICAvLy8gQW4gaW5zdGFuY2UgZmllbGQgaW4gYSBjbGFzcy4KICBOb25TdGF0aWNGaWVsZCwKCiAgLy8vIEEgc3RhdGljIGZpZWxkIGluIGEgY2xhc3MuCiAgU3RhdGljRmllbGQsCgogIC8vLyBBIHRvcC1sZXZlbCBmaWVsZC4KICBUb3BMZXZlbEZpZWxkLAp9Ci0ATk48ASIBEigJARALARkVAT0aATYbARgJAT8TASIQARoSASQSASEPARkRAgEzcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9tZW1iZXJfa2luZC5kYXJ0QXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9wYXJzZXIvdG9wX2xldmVsX3BhcnNlci5kYXJ0grkvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5wYXJzZXIudG9wX2xldmVsX3BhcnNlcjsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICdsaXN0ZW5lci5kYXJ0JyBzaG93IExpc3RlbmVyOwoKaW1wb3J0ICdjbGFzc19tZW1iZXJfcGFyc2VyLmRhcnQnIHNob3cgQ2xhc3NNZW1iZXJQYXJzZXI7CgovLy8gUGFyc2VyIHdoaWNoIG9ubHkgcGFyc2VzIHRvcC1sZXZlbCBlbGVtZW50cywgYnV0IGlnbm9yZXMgdGhlaXIgYm9kaWVzLgovLy8gVXNlIFtQYXJzZXJdIHRvIHBhcnNlIGV2ZXJ5dGhpbmcuCmNsYXNzIFRvcExldmVsUGFyc2VyIGV4dGVuZHMgQ2xhc3NNZW1iZXJQYXJzZXIgewogIFRvcExldmVsUGFyc2VyKExpc3RlbmVyIGxpc3RlbmVyKSA6IHN1cGVyKGxpc3RlbmVyKTsKCiAgVG9rZW4gcGFyc2VDbGFzc09yTWl4aW5Cb2R5KFRva2VuIHRva2VuKSA9PiBza2lwQ2xhc3NPck1peGluQm9keSh0b2tlbik7Cn0KFQBOTjwBJwEuASYBOgFLJjE3AUsCAThwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL3RvcF9sZXZlbF9wYXJzZXIuZGFydDVzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL3V0aWwuZGFydJtWLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEucGFyc2VyLnV0aWw7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IFRyZWVOb2RlOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IG5vTGVuZ3RoOwoKaW1wb3J0ICcuLi9zY2FubmVyLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcKICAgIHNob3cgQmVnaW5Ub2tlbiwgU2ltcGxlVG9rZW4sIFN5bnRoZXRpY1Rva2VuLCBUb2tlblR5cGU7CgovLy8gUmV0dXJucyB0cnVlIGlmIFt0b2tlbl0gaXMgdGhlIHN5bWJvbCBvciBrZXl3b3JkIFt2YWx1ZV0uCmJvb2wgb3B0aW9uYWwoU3RyaW5nIHZhbHVlLCBUb2tlbiB0b2tlbikgewogIHJldHVybiBpZGVudGljYWwodmFsdWUsIHRva2VuLnN0cmluZ1ZhbHVlKTsKfQoKLy8vIFJldHVybnMgdGhlIHRva2VuIGJlZm9yZSB0aGUgY2xvc2UgYnJhY2UsIGJyYWNrZXQsIG9yIHBhcmVudGhlc2lzCi8vLyBhc3NvY2lhdGVkIHdpdGggW2xlZnRdLiBGb3IgJzwnLCBpdCBtYXkgcmV0dXJuIGBudWxsYC4KVG9rZW4gYmVmb3JlQ2xvc2VCcmFjZVRva2VuRm9yKEJlZ2luVG9rZW4gbGVmdCkgewogIFRva2VuIGVuZFRva2VuID0gbGVmdC5lbmRUb2tlbjsKICBpZiAoZW5kVG9rZW4gPT0gbnVsbCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIFRva2VuIHRva2VuID0gbGVmdDsKICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICB3aGlsZSAobmV4dCAhPSBlbmRUb2tlbiAmJiBuZXh0ICE9IG5leHQubmV4dCkgewogICAgdG9rZW4gPSBuZXh0OwogICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgfQogIHJldHVybiB0b2tlbjsKfQoKLy8vIFJldHVybiBbdG9rZW5dIG9yIGEgdG9rZW4gYmVmb3JlIFt0b2tlbl0gd2hpY2ggaXMgZWl0aGVyCi8vLyBub3Qgc3ludGhldGljIG9yIHN5bnRoZXRpYyB3aXRoIG5vbi16ZXJvIGxlbmd0aC4KVG9rZW4gZmluZFByZXZpb3VzTm9uWmVyb0xlbmd0aFRva2VuKFRva2VuIHRva2VuKSB7CiAgd2hpbGUgKHRva2VuLmlzU3ludGhldGljICYmIHRva2VuLmxlbmd0aCA9PSAwKSB7CiAgICBUb2tlbiBwcmV2aW91cyA9IHRva2VuLmJlZm9yZVN5bnRoZXRpYzsKICAgIGlmIChwcmV2aW91cyA9PSBudWxsKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgdG9rZW4gPSBwcmV2aW91czsKICB9CiAgcmV0dXJuIHRva2VuOwp9CgovLy8gUmV0dXJuIFt0b2tlbl0gb3IgYSB0b2tlbiBhZnRlciBbdG9rZW5dIHdoaWNoIGlzIGVpdGhlcgovLy8gbm90IHN5bnRoZXRpYyBvciBzeW50aGV0aWMgd2l0aCBub24temVybyBsZW5ndGguCi8vLyBUaGlzIG1heSByZXR1cm4gRU9GIGlmIHRoZXJlIGFyZSBubyBtb3JlIG5vbi1zeW50aGV0aWMgdG9rZW5zIGluIHRoZSBzdHJlYW0uClRva2VuIGZpbmROb25aZXJvTGVuZ3RoVG9rZW4oVG9rZW4gdG9rZW4pIHsKICB3aGlsZSAodG9rZW4uaXNTeW50aGV0aWMgJiYgdG9rZW4ubGVuZ3RoID09IDAgJiYgIXRva2VuLmlzRW9mKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgfQogIHJldHVybiB0b2tlbjsKfQoKLy8vIEEgbnVsbC1hd2FyZSBhbHRlcm5hdGl2ZSB0byBgdG9rZW4ub2Zmc2V0YC4gIElmIFt0b2tlbl0gaXMgYG51bGxgLCByZXR1cm5zCi8vLyBgVHJlZU5vZGUubm9PZmZzZXRgLgppbnQgb2Zmc2V0Rm9yVG9rZW4oVG9rZW4gdG9rZW4pIHsKICByZXR1cm4gdG9rZW4gPT0gbnVsbCA/IFRyZWVOb2RlLm5vT2Zmc2V0IDogdG9rZW4ub2Zmc2V0Owp9Cgpib29sIGlzRGlnaXQoaW50IGMpID0+IGMgPj0gMHgzMCAmJiBjIDw9IDB4Mzk7Cgpib29sIGlzTGV0dGVyKGludCBjKSA9PiBjID49IDB4NDEgJiYgYyA8PSAweDVBIHx8IGMgPj0gMHg2MSAmJiBjIDw9IDB4N0E7Cgpib29sIGlzTGV0dGVyT3JEaWdpdChpbnQgYykgPT4gaXNMZXR0ZXIoYykgfHwgaXNEaWdpdChjKTsKCmJvb2wgaXNXaGl0ZXNwYWNlKGludCBjKSA9PiBjID09IDB4MjAgfHwgYyA9PSAweEEgfHwgYyA9PSAweEQgfHwgYyA9PSAweDk7CgovLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHRva2VuIG1hdGNoZXMgb25lIG9mIHRoZSBnaXZlbiB2YWx1ZXMuCmJvb2wgaXNPbmVPZihUb2tlbiB0b2tlbiwgSXRlcmFibGU8U3RyaW5nPiB2YWx1ZXMpIHsKICBmb3IgKFN0cmluZyB0b2tlblZhbHVlIGluIHZhbHVlcykgewogICAgaWYgKG9wdGlvbmFsKHRva2VuVmFsdWUsIHRva2VuKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHRva2VuIG1hdGNoZXMgb25lIG9mIHRoZSBnaXZlbiB2YWx1ZXMgb3IgaXMgRU9GLgpib29sIGlzT25lT2ZPckVvZihUb2tlbiB0b2tlbiwgSXRlcmFibGU8U3RyaW5nPiB2YWx1ZXMpIHsKICBmb3IgKFN0cmluZyB0b2tlblZhbHVlIGluIHZhbHVlcykgewogICAgaWYgKG9wdGlvbmFsKHRva2VuVmFsdWUsIHRva2VuKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CiAgcmV0dXJuIHRva2VuLmlzRW9mOwp9CgovLy8gQSBudWxsLWF3YXJlIGFsdGVybmF0aXZlIHRvIGB0b2tlbi5sZW5ndGhgLiAgSWYgW3Rva2VuXSBpcyBgbnVsbGAsIHJldHVybnMKLy8vIFtub0xlbmd0aF0uCmludCBsZW5ndGhGb3JUb2tlbihUb2tlbiB0b2tlbikgewogIHJldHVybiB0b2tlbiA9PSBudWxsID8gbm9MZW5ndGggOiB0b2tlbi5sZW5ndGg7Cn0KCi8vLyBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHNwYW4gZnJvbSBbYmVnaW5dIHRvIFtlbmRdIChpbmNsdXNpdmUpLiBJZiBib3RoCi8vLyB0b2tlbnMgYXJlIG51bGwsIHJldHVybiBbbm9MZW5ndGhdLiBJZiBvbmUgb2YgdGhlIHRva2VucyBhcmUgbnVsbCwgcmV0dXJuCi8vLyB0aGUgbGVuZ3RoIG9mIHRoZSBvdGhlciB0b2tlbi4KaW50IGxlbmd0aE9mU3BhbihUb2tlbiBiZWdpbiwgVG9rZW4gZW5kKSB7CiAgaWYgKGJlZ2luID09IG51bGwpIHJldHVybiBsZW5ndGhGb3JUb2tlbihlbmQpOwogIGlmIChlbmQgPT0gbnVsbCkgcmV0dXJuIGxlbmd0aEZvclRva2VuKGJlZ2luKTsKICByZXR1cm4gZW5kLm9mZnNldCArIGVuZC5sZW5ndGggLSBiZWdpbi5vZmZzZXQ7Cn0KClRva2VuIHNraXBNZXRhZGF0YShUb2tlbiB0b2tlbikgewogIHRva2VuID0gdG9rZW4ubmV4dDsKICBhc3NlcnQob3B0aW9uYWwoJ0AnLCB0b2tlbikpOwogIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogIGlmIChuZXh0LmlzSWRlbnRpZmllcikgewogICAgdG9rZW4gPSBuZXh0OwogICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB3aGlsZSAob3B0aW9uYWwoJy4nLCBuZXh0KSkgewogICAgICB0b2tlbiA9IG5leHQ7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAobmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgIH0KICAgIGlmIChvcHRpb25hbCgnKCcsIG5leHQpICYmICFuZXh0LmVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgIHRva2VuID0gbmV4dC5lbmRHcm91cDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9CiAgfQogIHJldHVybiB0b2tlbjsKfQoKLy8vIFNwbGl0IGA+PWAgaW50byB0d28gc2VwYXJhdGUgdG9rZW5zLgovLy8gQ2FsbCBbVG9rZW4uc2V0TmV4dF0gdG8gYWRkIHRoZSB0b2tlbiB0byB0aGUgc3RyZWFtLgpUb2tlbiBzcGxpdEd0RXEoVG9rZW4gdG9rZW4pIHsKICBhc3NlcnQob3B0aW9uYWwoJz49JywgdG9rZW4pKTsKICByZXR1cm4gbmV3IFNpbXBsZVRva2VuKAogICAgICBUb2tlblR5cGUuR1QsIHRva2VuLmNoYXJPZmZzZXQsIHRva2VuLnByZWNlZGluZ0NvbW1lbnRzKQogICAgLi5zZXROZXh0KG5ldyBTaW1wbGVUb2tlbihUb2tlblR5cGUuRVEsIHRva2VuLmNoYXJPZmZzZXQgKyAxKQogICAgICAvLyBTZXQgbmV4dCByYXRoZXIgdGhhbiBjYWxsaW5nIFRva2VuLnNldE5leHQKICAgICAgLy8gc28gdGhhdCB0aGUgcHJldmlvdXMgdG9rZW4gaXMgbm90IHNldC4KICAgICAgLi5uZXh0ID0gdG9rZW4ubmV4dCk7Cn0KCi8vLyBTcGxpdCBgPj5gIGludG8gdHdvIHNlcGFyYXRlIHRva2Vucy4KLy8vIENhbGwgW1Rva2VuLnNldE5leHRdIHRvIGFkZCB0aGUgdG9rZW4gdG8gdGhlIHN0cmVhbS4KU2ltcGxlVG9rZW4gc3BsaXRHdEd0KFRva2VuIHRva2VuKSB7CiAgYXNzZXJ0KG9wdGlvbmFsKCc+PicsIHRva2VuKSk7CiAgcmV0dXJuIG5ldyBTaW1wbGVUb2tlbigKICAgICAgVG9rZW5UeXBlLkdULCB0b2tlbi5jaGFyT2Zmc2V0LCB0b2tlbi5wcmVjZWRpbmdDb21tZW50cykKICAgIC4uc2V0TmV4dChuZXcgU2ltcGxlVG9rZW4oVG9rZW5UeXBlLkdULCB0b2tlbi5jaGFyT2Zmc2V0ICsgMSkKICAgICAgLy8gU2V0IG5leHQgcmF0aGVyIHRoYW4gY2FsbGluZyBUb2tlbi5zZXROZXh0CiAgICAgIC8vIHNvIHRoYXQgdGhlIHByZXZpb3VzIHRva2VuIGlzIG5vdCBzZXQuCiAgICAgIC4ubmV4dCA9IHRva2VuLm5leHQpOwp9CgovLy8gU3BsaXQgYD4+PWAgaW50byB0aHJlZSBzZXBhcmF0ZSB0b2tlbnMuCi8vLyBDYWxsIFtUb2tlbi5zZXROZXh0XSB0byBhZGQgdGhlIHRva2VuIHRvIHRoZSBzdHJlYW0uClRva2VuIHNwbGl0R3RHdEVxKFRva2VuIHRva2VuKSB7CiAgYXNzZXJ0KG9wdGlvbmFsKCc+Pj0nLCB0b2tlbikpOwogIHJldHVybiBuZXcgU2ltcGxlVG9rZW4oCiAgICAgIFRva2VuVHlwZS5HVCwgdG9rZW4uY2hhck9mZnNldCwgdG9rZW4ucHJlY2VkaW5nQ29tbWVudHMpCiAgICAuLnNldE5leHQobmV3IFNpbXBsZVRva2VuKFRva2VuVHlwZS5HVCwgdG9rZW4uY2hhck9mZnNldCArIDEpCiAgICAgIC4uc2V0TmV4dChuZXcgU2ltcGxlVG9rZW4oVG9rZW5UeXBlLkVRLCB0b2tlbi5jaGFyT2Zmc2V0ICsgMikKICAgICAgICAvLyBTZXQgbmV4dCByYXRoZXIgdGhhbiBjYWxsaW5nIFRva2VuLnNldE5leHQKICAgICAgICAvLyBzbyB0aGF0IHRoZSBwcmV2aW91cyB0b2tlbiBpcyBub3Qgc2V0LgogICAgICAgIC4ubmV4dCA9IHRva2VuLm5leHQpKTsKfQoKLy8vIFNwbGl0IGA+Pj1gIGludG8gdHdvIHNlcGFyYXRlIHRva2Vucy4uLiBgPmAgZm9sbG93ZWQgYnkgYD49YC4KLy8vIENhbGwgW1Rva2VuLnNldE5leHRdIHRvIGFkZCB0aGUgdG9rZW4gdG8gdGhlIHN0cmVhbS4KVG9rZW4gc3BsaXRHdEZyb21HdEd0RXEoVG9rZW4gdG9rZW4pIHsKICBhc3NlcnQob3B0aW9uYWwoJz4+PScsIHRva2VuKSk7CiAgcmV0dXJuIG5ldyBTaW1wbGVUb2tlbigKICAgICAgVG9rZW5UeXBlLkdULCB0b2tlbi5jaGFyT2Zmc2V0LCB0b2tlbi5wcmVjZWRpbmdDb21tZW50cykKICAgIC4uc2V0TmV4dChuZXcgU2ltcGxlVG9rZW4oVG9rZW5UeXBlLkdUX0VRLCB0b2tlbi5jaGFyT2Zmc2V0ICsgMSkKICAgICAgLy8gU2V0IG5leHQgcmF0aGVyIHRoYW4gY2FsbGluZyBUb2tlbi5zZXROZXh0CiAgICAgIC8vIHNvIHRoYXQgdGhlIHByZXZpb3VzIHRva2VuIGlzIG5vdCBzZXQuCiAgICAgIC4ubmV4dCA9IHRva2VuLm5leHQpOwp9CgovLy8gU3BsaXQgYD4+PmAgaW50byB0d28gc2VwYXJhdGUgdG9rZW5zLi4uIGA+YCBmb2xsb3dlZCBieSBgPj5gLgovLy8gQ2FsbCBbVG9rZW4uc2V0TmV4dF0gdG8gYWRkIHRoZSB0b2tlbiB0byB0aGUgc3RyZWFtLgpUb2tlbiBzcGxpdEd0RnJvbUd0R3RHdChUb2tlbiB0b2tlbikgewogIGFzc2VydChvcHRpb25hbCgnPj4+JywgdG9rZW4pKTsKICByZXR1cm4gbmV3IFNpbXBsZVRva2VuKAogICAgICBUb2tlblR5cGUuR1QsIHRva2VuLmNoYXJPZmZzZXQsIHRva2VuLnByZWNlZGluZ0NvbW1lbnRzKQogICAgLi5zZXROZXh0KG5ldyBTaW1wbGVUb2tlbihUb2tlblR5cGUuR1RfR1QsIHRva2VuLmNoYXJPZmZzZXQgKyAxKQogICAgICAvLyBTZXQgbmV4dCByYXRoZXIgdGhhbiBjYWxsaW5nIFRva2VuLnNldE5leHQKICAgICAgLy8gc28gdGhhdCB0aGUgcHJldmlvdXMgdG9rZW4gaXMgbm90IHNldC4KICAgICAgLi5uZXh0ID0gdG9rZW4ubmV4dCk7Cn0KCi8vLyBTcGxpdCBgPj4+PWAgaW50byB0d28gc2VwYXJhdGUgdG9rZW5zLi4uIGA+YCBmb2xsb3dlZCBieSBgPj49YC4KLy8vIENhbGwgW1Rva2VuLnNldE5leHRdIHRvIGFkZCB0aGUgdG9rZW4gdG8gdGhlIHN0cmVhbS4KVG9rZW4gc3BsaXRHdEZyb21HdEd0R3RFcShUb2tlbiB0b2tlbikgewogIGFzc2VydChvcHRpb25hbCgnPj4+PScsIHRva2VuKSk7CiAgcmV0dXJuIG5ldyBTaW1wbGVUb2tlbigKICAgICAgVG9rZW5UeXBlLkdULCB0b2tlbi5jaGFyT2Zmc2V0LCB0b2tlbi5wcmVjZWRpbmdDb21tZW50cykKICAgIC4uc2V0TmV4dChuZXcgU2ltcGxlVG9rZW4oVG9rZW5UeXBlLkdUX0dUX0VRLCB0b2tlbi5jaGFyT2Zmc2V0ICsgMSkKICAgICAgLy8gU2V0IG5leHQgcmF0aGVyIHRoYW4gY2FsbGluZyBUb2tlbi5zZXROZXh0CiAgICAgIC8vIHNvIHRoYXQgdGhlIHByZXZpb3VzIHRva2VuIGlzIG5vdCBzZXQuCiAgICAgIC4ubmV4dCA9IHRva2VuLm5leHQpOwp9CgovLy8gUmV0dXJuIGEgc3ludGhldGljIGA8YCBmb2xsb3dlZCBieSBbbmV4dF0uCi8vLyBDYWxsIFtUb2tlbi5zZXROZXh0XSB0byBhZGQgdGhlIHRva2VuIHRvIHRoZSBzdHJlYW0uClRva2VuIHN5bnRoZXRpY0d0KFRva2VuIG5leHQpIHsKICByZXR1cm4gbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5HVCwgbmV4dC5jaGFyT2Zmc2V0KQogICAgLy8gU2V0IG5leHQgcmF0aGVyIHRoYW4gY2FsbGluZyBUb2tlbi5zZXROZXh0CiAgICAvLyBzbyB0aGF0IHRoZSBwcmV2aW91cyB0b2tlbiBpcyBub3Qgc2V0LgogICAgLi5uZXh0ID0gbmV4dDsKfQqA1gBOTjwBGwEwASwBJQEiPQE+Ky4CAUY7MiIaEQQWGzISFwQQAgE9NTQzLBwNBhYEEAIBPDVRLEMYBBACAU8ZIjsCAS8BSgE6AUsBRDUmJxMGBBACAU46JicTBgQWAgFPECIyAgFOTiMrMTExAgEiFiAbGxIXIhQZHxYbCAY9HRkGBBACASk5HyEaP0I0MBwCASk5JSEaP0I0MBwCASw5ISIaP0JENjIfAgFCOSciGj9FNDAcAgFCOSciGj9FNDAcAgFEOSkjGj9INDAcAgEvOSA7Mi4TAgEscGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci91dGlsLmRhcnQ/c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NvdXJjZS9zdGFja19saXN0ZW5lci5kYXJ0veIvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5zdGFja19saXN0ZW5lcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93IEFzeW5jTWFya2VyLCBFeHByZXNzaW9uLCBGdW5jdGlvbk5vZGUsIFRyZWVOb2RlOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIENvZGUsCiAgICAgICAgTG9jYXRlZE1lc3NhZ2UsCiAgICAgICAgTWVzc2FnZSwKICAgICAgICBjb2RlQ2F0Y2hTeW50YXhFeHRyYVBhcmFtZXRlcnMsCiAgICAgICAgY29kZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbiwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHk7CgppbXBvcnQgJy4uL3BhcnNlci5kYXJ0JwogICAgc2hvdyBMaXN0ZW5lciwgTWVtYmVyS2luZCwgUGFyc2VyLCBsZW5ndGhPZlNwYW4sIG9mZnNldEZvclRva2VuOwoKaW1wb3J0ICcuLi9wYXJzZXIvaWRlbnRpZmllcl9jb250ZXh0LmRhcnQnIHNob3cgSWRlbnRpZmllckNvbnRleHQ7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnCiAgICBzaG93IGludGVybmFsUHJvYmxlbSwgdW5oYW5kbGVkLCB1bmltcGxlbWVudGVkLCB1bnN1cHBvcnRlZDsKCmltcG9ydCAnLi4vcXVvdGUuZGFydCcgc2hvdyB1bmVzY2FwZVN0cmluZzsKCmltcG9ydCAnLi4vc2Nhbm5lci5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICd2YWx1ZV9raW5kcy5kYXJ0JzsKCmVudW0gTnVsbFZhbHVlIHsKICBBcmd1bWVudHMsCiAgQXMsCiAgQXdhaXRUb2tlbiwKICBCbG9jaywKICBCcmVha1RhcmdldCwKICBDYXNjYWRlUmVjZWl2ZXIsCiAgQ29tYmluYXRvcnMsCiAgQ29tbWVudHMsCiAgQ29uZGl0aW9uYWxVcmlzLAogIENvbmRpdGlvbmFsbHlTZWxlY3RlZEltcG9ydCwKICBDb25zdHJ1Y3RvckluaXRpYWxpemVyU2VwYXJhdG9yLAogIENvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzLAogIENvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzLAogIENvbnRpbnVlVGFyZ2V0LAogIERlZmVycmVkLAogIERvY3VtZW50YXRpb25Db21tZW50LAogIEV4cHJlc3Npb24sCiAgRXh0ZW5kc0NsYXVzZSwKICBGaWVsZEluaXRpYWxpemVyLAogIEZvcm1hbFBhcmFtZXRlcnMsCiAgRnVuY3Rpb25Cb2R5LAogIEZ1bmN0aW9uQm9keUFzeW5jVG9rZW4sCiAgRnVuY3Rpb25Cb2R5U3RhclRva2VuLAogIElkZW50aWZpZXIsCiAgSWRlbnRpZmllckxpc3QsCiAgSW5pdGlhbGl6ZXJzLAogIExhYmVscywKICBNZXRhZGF0YSwKICBNb2RpZmllcnMsCiAgTmFtZSwKICBQYXJhbWV0ZXJEZWZhdWx0VmFsdWUsCiAgUHJlZml4LAogIFN0cmluZ0xpdGVyYWwsCiAgU3dpdGNoU2NvcGUsCiAgVG9rZW4sCiAgVHlwZSwKICBUeXBlQXJndW1lbnRzLAogIFR5cGVCdWlsZGVyTGlzdCwKICBUeXBlTGlzdCwKICBUeXBlVmFyaWFibGUsCiAgVHlwZVZhcmlhYmxlcywKICBWYXJGaW5hbE9yQ29uc3RUb2tlbiwKICBXaXRoQ2xhdXNlLAp9CgphYnN0cmFjdCBjbGFzcyBTdGFja0xpc3RlbmVyIGV4dGVuZHMgTGlzdGVuZXIgewogIGZpbmFsIFN0YWNrIHN0YWNrID0gbmV3IFN0YWNrKCk7CgogIC8vLyBDaGVja3MgdGhlIHRvcCBvZiB0aGUgY3VycmVudCBzdGFjayBhZ2FpbnN0IFtraW5kc10uIElmIGEgbWlzbWF0Y2ggaXMKICAvLy8gZm91bmQsIGEgdG9wIG9mIHRoZSBjdXJyZW50IHN0YWNrIGlzIHByaW50IGFsb25nIHdpdGggdGhlIGV4cGVjdGVkIFtraW5kc10KICAvLy8gbWFya2luZyB0aGUgZnJhbWVzIHRoYXQgZG9uJ3QgbWF0Y2gsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uLgogIC8vLwogIC8vLyBVc2UgdGhpcyBpbiBhc3NlcnQgc3RhdGVtZW50cyBsaWtlIGBhc3NlcnQoY2hlY2tTdGF0ZShbVmFsdWVLaW5kLlRva2VuXSkpYAogIC8vLyB0byBkb2N1bWVudCB0aGUgZXhwZWN0ZWQgc3RhY2sgYW5kIGdldCBlYXJsaWVyIGVycm9ycyBvbiB1bmV4cGVjdGVkIHN0YWNrCiAgLy8vIGNvbnRlbnQuCiAgYm9vbCBjaGVja1N0YXRlKFRva2VuIHRva2VuLCBMaXN0PFZhbHVlS2luZD4ga2luZHMpIHsKICAgIGJvb2wgY2hlY2tWYWx1ZShWYWx1ZUtpbmQga2luZCwgT2JqZWN0IHZhbHVlKSB7CiAgICAgIHJldHVybiBraW5kLmNoZWNrKHZhbHVlKTsKICAgIH0KCiAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOwogICAgZm9yIChpbnQga2luZEluZGV4ID0gMDsga2luZEluZGV4IDwga2luZHMubGVuZ3RoOyBraW5kSW5kZXgrKykgewogICAgICBpbnQgc3RhY2tJbmRleCA9IHN0YWNrLmFycmF5TGVuZ3RoIC0ga2luZEluZGV4IC0gMTsKICAgICAgVmFsdWVLaW5kIGtpbmQgPSBraW5kc1traW5kSW5kZXhdOwogICAgICBpZiAoc3RhY2tJbmRleCA+PSAwKSB7CiAgICAgICAgT2JqZWN0IHZhbHVlID0gc3RhY2suYXJyYXlbc3RhY2tJbmRleF07CiAgICAgICAgaWYgKCFjaGVja1ZhbHVlKGtpbmQsIHZhbHVlKSkgewogICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBzdWNjZXNzID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmICghc3VjY2VzcykgewogICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgogICAgICBTdHJpbmcgc2FmZVRvU3RyaW5nKE9iamVjdCBvYmplY3QpIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuICckb2JqZWN0JzsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAvLyBKdWRnbWVudHMgZmFpbCBvbiB0b1N0cmluZy4KICAgICAgICAgIHJldHVybiBvYmplY3QucnVudGltZVR5cGUudG9TdHJpbmcoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIFN0cmluZyBwYWRMZWZ0KE9iamVjdCBvYmplY3QsIGludCBsZW5ndGgpIHsKICAgICAgICBTdHJpbmcgdGV4dCA9IHNhZmVUb1N0cmluZyhvYmplY3QpOwogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA8IGxlbmd0aCkgewogICAgICAgICAgcmV0dXJuICcgJyAqIChsZW5ndGggLSB0ZXh0Lmxlbmd0aCkgKyB0ZXh0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgfQoKICAgICAgU3RyaW5nIHBhZFJpZ2h0KE9iamVjdCBvYmplY3QsIGludCBsZW5ndGgpIHsKICAgICAgICBTdHJpbmcgdGV4dCA9IHNhZmVUb1N0cmluZyhvYmplY3QpOwogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA8IGxlbmd0aCkgewogICAgICAgICAgcmV0dXJuIHRleHQgKyAnICcgKiAobGVuZ3RoIC0gdGV4dC5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgfQoKICAgICAgLy8gQ29tcHV0ZSBraW5kL3N0YWNrIGZyYW1lIGluZm9ybWF0aW9uIGZvciBhbGwgZXhwZWN0ZWQgdmFsdWVzIHBsdXMgMyBtb3JlCiAgICAgIC8vIHN0YWNrIGVsZW1lbnRzIGlmIGF2YWlsYWJsZS4KICAgICAgZm9yIChpbnQga2luZEluZGV4ID0gMDsga2luZEluZGV4IDwga2luZHMubGVuZ3RoICsgMzsga2luZEluZGV4KyspIHsKICAgICAgICBpbnQgc3RhY2tJbmRleCA9IHN0YWNrLmFycmF5TGVuZ3RoIC0ga2luZEluZGV4IC0gMTsKICAgICAgICBpZiAoc3RhY2tJbmRleCA8IDAgJiYga2luZEluZGV4ID49IGtpbmRzLmxlbmd0aCkgewogICAgICAgICAgLy8gTm8gbW9yZSBzdGFjayBlbGVtZW50cyBub3Iga2luZHMgdG8gZGlzcGxheS4KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzYi53cml0ZShwYWRMZWZ0KGtpbmRJbmRleCwgNCkpOwogICAgICAgIHNiLndyaXRlKCc6ICcpOwogICAgICAgIFZhbHVlS2luZCBraW5kOwogICAgICAgIGlmIChraW5kSW5kZXggPCBraW5kcy5sZW5ndGgpIHsKICAgICAgICAgIGtpbmQgPSBraW5kc1traW5kSW5kZXhdOwogICAgICAgICAgc2Iud3JpdGUocGFkUmlnaHQoa2luZCwgNjApKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2Iud3JpdGUocGFkUmlnaHQoJy0tLScsIDYwKSk7CiAgICAgICAgfQogICAgICAgIGlmIChzdGFja0luZGV4ID49IDApIHsKICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHN0YWNrLmFycmF5W3N0YWNrSW5kZXhdOwogICAgICAgICAgaWYgKGtpbmQgPT0gbnVsbCB8fCBjaGVja1ZhbHVlKGtpbmQsIHZhbHVlKSkgewogICAgICAgICAgICBzYi53cml0ZSgnICcpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2Iud3JpdGUoJyonKTsKICAgICAgICAgIH0KICAgICAgICAgIHNiLndyaXRlKHNhZmVUb1N0cmluZyh2YWx1ZSkpOwogICAgICAgICAgc2Iud3JpdGUoJyAoJHt2YWx1ZS5ydW50aW1lVHlwZX0pJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChraW5kID09IG51bGwpIHsKICAgICAgICAgICAgc2Iud3JpdGUoJyAnKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNiLndyaXRlKCcqJyk7CiAgICAgICAgICB9CiAgICAgICAgICBzYi53cml0ZSgnLS0tJyk7CiAgICAgICAgfQogICAgICAgIHNiLndyaXRlbG4oKTsKICAgICAgfQoKICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAnJHJ1bnRpbWVUeXBlIGZhaWx1cmVcbiRzYic7CiAgICAgIGlmICh0b2tlbiAhPSBudWxsKSB7CiAgICAgICAgLy8gSWYgb2Zmc2V0IGlzIGF2YWlsYWJsZSByZXBvcnQgYW5kIGludGVybmFsIHByb2JsZW0gdG8gc2hvdyB0aGUKICAgICAgICAvLyBwYXJzZWQgY29kZSBpbiB0aGUgb3V0cHV0LgogICAgICAgIHRocm93IGludGVybmFsUHJvYmxlbSgKICAgICAgICAgICAgbmV3IE1lc3NhZ2UobnVsbCwgbWVzc2FnZTogbWVzc2FnZSksIHRva2VuLmNoYXJPZmZzZXQsIHVyaSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbWVzc2FnZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1Y2Nlc3M7CiAgfQoKICBAb3ZlcnJpZGUKICBVcmkgZ2V0IHVyaTsKCiAgdm9pZCBkaXNjYXJkKGludCBuKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICBwb3AoKTsKICAgIH0KICB9CgogIC8vIFRPRE8oYWhlKTogVGhpcyBkb2Vzbid0IGJlbG9uZyBoZXJlLiBPbmx5IGltcGxlbWVudGVkIGJ5IGJvZHlfYnVpbGRlci5kYXJ0CiAgLy8gYW5kIGFzdF9idWlsZGVyLmRhcnQuCiAgdm9pZCBmaW5pc2hGdW5jdGlvbigKICAgICAgY292YXJpYW50IGZvcm1hbHMsIEFzeW5jTWFya2VyIGFzeW5jTW9kaWZpZXIsIGNvdmFyaWFudCBib2R5KSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImZpbmlzaEZ1bmN0aW9uIiwgLTEsIHVyaSk7CiAgfQoKICAvLyBUT0RPKGFoZSk6IFRoaXMgZG9lc24ndCBiZWxvbmcgaGVyZS4gT25seSBpbXBsZW1lbnRlZCBieSBib2R5X2J1aWxkZXIuZGFydAogIC8vIGFuZCBhc3RfYnVpbGRlci5kYXJ0LgogIGR5bmFtaWMgZmluaXNoRmllbGRzKCkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJmaW5pc2hGaWVsZHMiLCAtMSwgdXJpKTsKICB9CgogIC8vIFRPRE8oYWhlKTogVGhpcyBkb2Vzbid0IGJlbG9uZyBoZXJlLiBPbmx5IGltcGxlbWVudGVkIGJ5IGJvZHlfYnVpbGRlci5kYXJ0CiAgLy8gYW5kIGFzdF9idWlsZGVyLmRhcnQuCiAgTGlzdDxFeHByZXNzaW9uPiBmaW5pc2hNZXRhZGF0YShUcmVlTm9kZSBwYXJlbnQpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiZmluaXNoTWV0YWRhdGEiLCAtMSwgdXJpKTsKICB9CgogIC8vIFRPRE8oYWhlKTogVGhpcyBkb2Vzbid0IGJlbG9uZyBoZXJlLiBPbmx5IGltcGxlbWVudGVkIGJ5IGJvZHlfYnVpbGRlci5kYXJ0CiAgLy8gYW5kIGFzdF9idWlsZGVyLmRhcnQuCiAgdm9pZCBleGl0TG9jYWxTY29wZSgpID0+IHVuc3VwcG9ydGVkKCJleGl0TG9jYWxTY29wZSIsIC0xLCB1cmkpOwoKICAvLyBUT0RPKGFoZSk6IFRoaXMgZG9lc24ndCBiZWxvbmcgaGVyZS4gT25seSBpbXBsZW1lbnRlZCBieSBib2R5X2J1aWxkZXIuZGFydC4KICBkeW5hbWljIHBhcnNlU2luZ2xlRXhwcmVzc2lvbigKICAgICAgUGFyc2VyIHBhcnNlciwgVG9rZW4gdG9rZW4sIEZ1bmN0aW9uTm9kZSBwYXJhbWV0ZXJzKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImZpbmlzaFNpbmdsZUV4cHJlc3Npb24iLCAtMSwgdXJpKTsKICB9CgogIHZvaWQgcHVzaChPYmplY3Qgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgdW5oYW5kbGVkKCJudWxsIiwgInB1c2giLCAtMSwgdXJpKTsKICAgIHN0YWNrLnB1c2gobm9kZSk7CiAgfQoKICB2b2lkIHB1c2hJZk51bGwoVG9rZW4gdG9rZW5Pck51bGwsIE51bGxWYWx1ZSBudWxsVmFsdWUpIHsKICAgIGlmICh0b2tlbk9yTnVsbCA9PSBudWxsKSBzdGFjay5wdXNoKG51bGxWYWx1ZSk7CiAgfQoKICBPYmplY3QgcGVlaygpID0+IHN0YWNrLmlzTm90RW1wdHkgPyBzdGFjay5sYXN0IDogbnVsbDsKCiAgT2JqZWN0IHBvcChbTnVsbFZhbHVlIG51bGxWYWx1ZV0pIHsKICAgIHJldHVybiBzdGFjay5wb3AobnVsbFZhbHVlKTsKICB9CgogIE9iamVjdCBwb3BJZk5vdE51bGwoT2JqZWN0IHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBwb3AoKTsKICB9CgogIHZvaWQgZGVidWdFdmVudChTdHJpbmcgbmFtZSkgewogICAgLy8gcHJpbnRFdmVudChuYW1lKTsKICB9CgogIHZvaWQgcHJpbnRFdmVudChTdHJpbmcgbmFtZSkgewogICAgcHJpbnQoJ1xuLS0tLS0tLS0tLS0tLS0tLS0tJyk7CiAgICBmb3IgKE9iamVjdCBvIGluIHN0YWNrLnZhbHVlcykgewogICAgICBTdHJpbmcgcyA9ICIgICRvIjsKICAgICAgaW50IGluZGV4ID0gcy5pbmRleE9mKCJcbiIpOwogICAgICBpZiAoaW5kZXggIT0gLTEpIHsKICAgICAgICBzID0gcy5zdWJzdHJpbmcoMCwgaW5kZXgpICsgIi4uLiI7CiAgICAgIH0KICAgICAgcHJpbnQocyk7CiAgICB9CiAgICBwcmludCgiICA+PiAkbmFtZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsb2dFdmVudChTdHJpbmcgbmFtZSkgewogICAgcHJpbnRFdmVudChuYW1lKTsKICAgIHVuaGFuZGxlZChuYW1lLCAiJHJ1bnRpbWVUeXBlIiwgLTEsIHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIGRlYnVnRXZlbnQoImhhbmRsZUlkZW50aWZpZXIiKTsKICAgIGlmICghdG9rZW4uaXNTeW50aGV0aWMpIHsKICAgICAgcHVzaCh0b2tlbi5sZXhlbWUpOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhpcyBjb21lcyBmcm9tIGEgc3ludGhldGljIHRva2VuIHdoaWNoIGlzIGluc2VydGVkIGJ5IHRoZSBwYXJzZXIgaW4KICAgICAgLy8gYW4gYXR0ZW1wdCB0byByZWNvdmVyLiAgVGhpcyBhbG1vc3QgYWx3YXlzIG1lYW5zIHRoYXQgdGhlIHBhcnNlciBoYXMKICAgICAgLy8gZ290dGVuIHZlcnkgY29uZnVzZWQgYW5kIHdlIG5lZWQgdG8gaWdub3JlIHRoZSByZXN1bHRzLgogICAgICBwdXNoKG5ldyBQYXJzZXJSZWNvdmVyeSh0b2tlbi5jaGFyT2Zmc2V0KSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vTmFtZShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9OYW1lIik7CiAgICBwdXNoKE51bGxWYWx1ZS5JZGVudGlmaWVyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkluaXRpYWxpemVyIik7CiAgfQoKICB2b2lkIGNoZWNrRW1wdHkoaW50IGNoYXJPZmZzZXQpIHsKICAgIGlmIChzdGFjay5pc05vdEVtcHR5KSB7CiAgICAgIGludGVybmFsUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICIke3J1bnRpbWVUeXBlfSIsIHN0YWNrLnZhbHVlcy5qb2luKCJcbiAgIikpLAogICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgIHVyaSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFRvcExldmVsRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlRvcExldmVsRGVjbGFyYXRpb24iKTsKICAgIGNoZWNrRW1wdHkodG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbXBpbGF0aW9uVW5pdChpbnQgY291bnQsIFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJDb21waWxhdGlvblVuaXQiKTsKICAgIGNoZWNrRW1wdHkodG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzRXh0ZW5kcyhUb2tlbiBleHRlbmRzS2V5d29yZCkgewogICAgZGVidWdFdmVudCgiQ2xhc3NFeHRlbmRzIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU1peGluT24oVG9rZW4gb25LZXl3b3JkLCBpbnQgdHlwZUNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJNaXhpbk9uIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzSGVhZGVyKFRva2VuIGJlZ2luLCBUb2tlbiBjbGFzc0tleXdvcmQsIFRva2VuIG5hdGl2ZVRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJDbGFzc0hlYWRlciIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVNaXhpbkhlYWRlcihUb2tlbiBtaXhpbktleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoIk1peGluSGVhZGVyIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVJlY292ZXJDbGFzc0hlYWRlcigpIHsKICAgIGRlYnVnRXZlbnQoIlJlY292ZXJDbGFzc0hlYWRlciIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVSZWNvdmVyTWl4aW5IZWFkZXIoKSB7CiAgICBkZWJ1Z0V2ZW50KCJSZWNvdmVyTWl4aW5IZWFkZXIiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2xhc3NPck1peGluSW1wbGVtZW50cygKICAgICAgVG9rZW4gaW1wbGVtZW50c0tleXdvcmQsIGludCBpbnRlcmZhY2VzQ291bnQpIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzSW1wbGVtZW50cyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb1R5cGVBcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5vVHlwZUFyZ3VtZW50cyIpOwogICAgcHVzaChOdWxsVmFsdWUuVHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVHlwZVZhcmlhYmxlcyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9UeXBlVmFyaWFibGVzIik7CiAgICBwdXNoKE51bGxWYWx1ZS5UeXBlVmFyaWFibGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Db25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9Db25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb1R5cGUoVG9rZW4gbGFzdENvbnN1bWVkKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb1R5cGUiKTsKICAgIHB1c2goTnVsbFZhbHVlLlR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0Zvcm1hbFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgZGVidWdFdmVudCgiTm9Gb3JtYWxQYXJhbWV0ZXJzIik7CiAgICBwdXNoKE51bGxWYWx1ZS5Gb3JtYWxQYXJhbWV0ZXJzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Bcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5vQXJndW1lbnRzIik7CiAgICBwdXNoKE51bGxWYWx1ZS5Bcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHkoVG9rZW4gbmF0aXZlVG9rZW4sIFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiTmF0aXZlRnVuY3Rpb25Cb2R5Iik7CiAgICBwdXNoKE51bGxWYWx1ZS5GdW5jdGlvbkJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIk5hdGl2ZUZ1bmN0aW9uQm9keUlnbm9yZWQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5U2tpcHBlZChUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRnVuY3Rpb25Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0Z1bmN0aW9uQm9keSIpOwogICAgcHVzaChOdWxsVmFsdWUuRnVuY3Rpb25Cb2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Jbml0aWFsaXplcnMoKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0luaXRpYWxpemVycyIpOwogICAgcHVzaChOdWxsVmFsdWUuSW5pdGlhbGl6ZXJzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUGFyZW50aGVzaXplZENvbmRpdGlvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiaGFuZGxlUGFyZW50aGVzaXplZENvbmRpdGlvbiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiUGFyZW50aGVzaXplZEV4cHJlc3Npb24iKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5MaXRlcmFsU3RyaW5nKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkxpdGVyYWxTdHJpbmciKTsKICAgIHB1c2godG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRMaXRlcmFsU3RyaW5nKGludCBpbnRlcnBvbGF0aW9uQ291bnQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRMaXRlcmFsU3RyaW5nIik7CiAgICBpZiAoaW50ZXJwb2xhdGlvbkNvdW50ID09IDApIHsKICAgICAgVG9rZW4gdG9rZW4gPSBwb3AoKTsKICAgICAgcHVzaCh1bmVzY2FwZVN0cmluZyh0b2tlbi5sZXhlbWUsIHRva2VuLCB0aGlzKSk7CiAgICB9IGVsc2UgewogICAgICB1bmltcGxlbWVudGVkKCJzdHJpbmcgaW50ZXJwb2xhdGlvbiIsIGVuZFRva2VuLmNoYXJPZmZzZXQsIHVyaSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUNsYXVzZShUb2tlbiBuYXRpdmVUb2tlbiwgYm9vbCBoYXNOYW1lKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYXRpdmVDbGF1c2UiKTsKICAgIGlmIChoYXNOYW1lKSB7CiAgICAgIHBvcCgpOyAvLyBQb3AgdGhlIG5hdGl2ZSBuYW1lIHdoaWNoIGlzIGEgU3RyaW5nLgogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVEaXJlY3RpdmVzT25seSgpIHsKICAgIHBvcCgpOyAvLyBEaXNjYXJkIHRoZSBtZXRhZGF0YS4KICB9CgogIHZvaWQgaGFuZGxlRXh0cmFuZW91c0V4cHJlc3Npb24oVG9rZW4gdG9rZW4sIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgZGVidWdFdmVudCgiRXh0cmFuZW91c0V4cHJlc3Npb24iKTsKICAgIHBvcCgpOyAvLyBEaXNjYXJkIHRoZSBleHRyYW5lb3VzIGV4cHJlc3Npb24uCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENhc2VFeHByZXNzaW9uKFRva2VuIGNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJDYXNlRXhwcmVzc2lvbiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDYXRjaENsYXVzZShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiQ2F0Y2hDbGF1c2UiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBUb2tlbiBzdGFydFRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiRXJyb3I6ICR7bWVzc2FnZS5tZXNzYWdlfSIpOwogICAgaWYgKGlzSWdub3JlZEVycm9yKG1lc3NhZ2UuY29kZSwgc3RhcnRUb2tlbikpIHJldHVybjsKICAgIGFkZFByb2JsZW0obWVzc2FnZSwgb2Zmc2V0Rm9yVG9rZW4oc3RhcnRUb2tlbiksCiAgICAgICAgbGVuZ3RoT2ZTcGFuKHN0YXJ0VG9rZW4sIGVuZFRva2VuKSk7CiAgfQoKICBib29sIGlzSWdub3JlZEVycm9yKENvZGU8ZHluYW1pYz4gY29kZSwgVG9rZW4gdG9rZW4pIHsKICAgIGlmIChjb2RlID09IGNvZGVOYXRpdmVDbGF1c2VTaG91bGRCZUFubm90YXRpb24pIHsKICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IElnbm9yZSB0aGlzIGVycm9yIHVudGlsIHdlIGRlcHJlY2F0ZSBgbmF0aXZlYAogICAgICAvLyBzdXBwb3J0LgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoY29kZSA9PSBjb2RlQ2F0Y2hTeW50YXhFeHRyYVBhcmFtZXRlcnMpIHsKICAgICAgLy8gSWdub3JlZC4gVGhpcyBlcnJvciBpcyBoYW5kbGVkIGJ5IHRoZSBCb2R5QnVpbGRlci4KICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVVuZXNjYXBlRXJyb3IoCiAgICAgIE1lc3NhZ2UgbWVzc2FnZSwgVG9rZW4gdG9rZW4sIGludCBzdHJpbmdPZmZzZXQsIGludCBsZW5ndGgpIHsKICAgIGFkZFByb2JsZW0obWVzc2FnZSwgdG9rZW4uY2hhck9mZnNldCArIHN0cmluZ09mZnNldCwgbGVuZ3RoKTsKICB9CgogIHZvaWQgYWRkUHJvYmxlbShNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLAogICAgICB7Ym9vbCB3YXNIYW5kbGVkOiBmYWxzZSwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pOwp9CgpjbGFzcyBTdGFjayB7CiAgTGlzdDxPYmplY3Q+IGFycmF5ID0gbmV3IExpc3Q8T2JqZWN0Pig4KTsKICBpbnQgYXJyYXlMZW5ndGggPSAwOwoKICBib29sIGdldCBpc05vdEVtcHR5ID0+IGFycmF5TGVuZ3RoID4gMDsKCiAgaW50IGdldCBsZW5ndGggPT4gYXJyYXlMZW5ndGg7CgogIE9iamVjdCBnZXQgbGFzdCB7CiAgICBmaW5hbCB2YWx1ZSA9IGFycmF5W2FycmF5TGVuZ3RoIC0gMV07CiAgICByZXR1cm4gdmFsdWUgaXMgTnVsbFZhbHVlID8gbnVsbCA6IHZhbHVlOwogIH0KCiAgdm9pZCBwdXNoKE9iamVjdCB2YWx1ZSkgewogICAgYXJyYXlbYXJyYXlMZW5ndGgrK10gPSB2YWx1ZTsKICAgIGlmIChhcnJheS5sZW5ndGggPT0gYXJyYXlMZW5ndGgpIHsKICAgICAgX2dyb3coKTsKICAgIH0KICB9CgogIE9iamVjdCBwb3AoTnVsbFZhbHVlIG51bGxWYWx1ZSkgewogICAgYXNzZXJ0KGFycmF5TGVuZ3RoID4gMCk7CiAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBhcnJheVstLWFycmF5TGVuZ3RoXTsKICAgIGFycmF5W2FycmF5TGVuZ3RoXSA9IG51bGw7CiAgICBpZiAodmFsdWUgaXMhIE51bGxWYWx1ZSkgewogICAgICByZXR1cm4gdmFsdWU7CiAgICB9IGVsc2UgaWYgKG51bGxWYWx1ZSA9PSBudWxsIHx8IHZhbHVlID09IG51bGxWYWx1ZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICB9CgogIExpc3Q8T2JqZWN0PiBwb3BMaXN0KGludCBjb3VudCwgTGlzdDxPYmplY3Q+IGxpc3QsIE51bGxWYWx1ZSBudWxsVmFsdWUpIHsKICAgIGFzc2VydChhcnJheUxlbmd0aCA+PSBjb3VudCk7CiAgICBmaW5hbCBMaXN0PE9iamVjdD4gYXJyYXkgPSB0aGlzLmFycmF5OwogICAgZmluYWwgaW50IGxlbmd0aCA9IGFycmF5TGVuZ3RoOwogICAgZmluYWwgaW50IHN0YXJ0SW5kZXggPSBsZW5ndGggLSBjb3VudDsKICAgIGJvb2wgaXNQYXJzZXJSZWNvdmVyeSA9IGZhbHNlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGludCBhcnJheUluZGV4ID0gc3RhcnRJbmRleCArIGk7CiAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGFycmF5W2FycmF5SW5kZXhdOwogICAgICBhcnJheVthcnJheUluZGV4XSA9IG51bGw7CiAgICAgIGlmICh2YWx1ZSBpcyBOdWxsVmFsdWUgJiYgbnVsbFZhbHVlID09IG51bGwgfHwKICAgICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgbnVsbFZhbHVlKSkgewogICAgICAgIGxpc3RbaV0gPSBudWxsOwogICAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgICAgaXNQYXJzZXJSZWNvdmVyeSA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHZhbHVlIGlzIE51bGxWYWx1ZSkgewogICAgICAgICAgcHJpbnQodmFsdWUpOwogICAgICAgIH0KICAgICAgICBsaXN0W2ldID0gdmFsdWU7CiAgICAgIH0KICAgIH0KICAgIGFycmF5TGVuZ3RoIC09IGNvdW50OwoKICAgIHJldHVybiBpc1BhcnNlclJlY292ZXJ5ID8gbnVsbCA6IGxpc3Q7CiAgfQoKICBMaXN0PE9iamVjdD4gZ2V0IHZhbHVlcyB7CiAgICBmaW5hbCBpbnQgbGVuZ3RoID0gYXJyYXlMZW5ndGg7CiAgICBmaW5hbCBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBMaXN0PE9iamVjdD4obGVuZ3RoKTsKICAgIGxpc3Quc2V0UmFuZ2UoMCwgbGVuZ3RoLCBhcnJheSk7CiAgICByZXR1cm4gbGlzdDsKICB9CgogIHZvaWQgX2dyb3coKSB7CiAgICBmaW5hbCBpbnQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgZmluYWwgTGlzdDxPYmplY3Q+IG5ld0FycmF5ID0gbmV3IExpc3Q8T2JqZWN0PihsZW5ndGggKiAyKTsKICAgIG5ld0FycmF5LnNldFJhbmdlKDAsIGxlbmd0aCwgYXJyYXksIDApOwogICAgYXJyYXkgPSBuZXdBcnJheTsKICB9Cn0KCi8vLyBIZWxwZXIgY29uc3RhbnQgZm9yIHBvcHBpbmcgYSBsaXN0IG9mIHRoZSB0b3Agb2YgYSBbU3RhY2tdLiAgVGhpcyBoZWxwZXIKLy8vIHJldHVybnMgbnVsbCBpbnN0ZWFkIG9mIGVtcHR5IGxpc3RzLCBhbmQgdGhlIGxpc3RzIHJldHVybmVkIGFyZSBvZiBmaXhlZAovLy8gbGVuZ3RoLgpjbGFzcyBGaXhlZE51bGxhYmxlTGlzdDxUPiB7CiAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3QoKTsKCiAgTGlzdDxUPiBwb3AoU3RhY2sgc3RhY2ssIGludCBjb3VudCwgW051bGxWYWx1ZSBudWxsVmFsdWVdKSB7CiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gc3RhY2sucG9wTGlzdChjb3VudCwgbmV3IExpc3Q8VD4oY291bnQpLCBudWxsVmFsdWUpOwogIH0KCiAgTGlzdDxUPiBwb3BQYWRkZWQoU3RhY2sgc3RhY2ssIGludCBjb3VudCwgaW50IHBhZGRpbmcsCiAgICAgIFtOdWxsVmFsdWUgbnVsbFZhbHVlXSkgewogICAgaWYgKGNvdW50ICsgcGFkZGluZyA9PSAwKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBzdGFjay5wb3BMaXN0KGNvdW50LCBuZXcgTGlzdDxUPihjb3VudCArIHBhZGRpbmcpLCBudWxsVmFsdWUpOwogIH0KfQoKLy8vIEhlbHBlciBjb25zdGFudCBmb3IgcG9wcGluZyBhIGxpc3Qgb2YgdGhlIHRvcCBvZiBhIFtTdGFja10uICBUaGlzIGhlbHBlcgovLy8gcmV0dXJucyBncm93YWJsZSBsaXN0cyAoYWxzbyB3aGVuIGVtcHR5KS4KY2xhc3MgR3Jvd2FibGVMaXN0PFQ+IHsKICBjb25zdCBHcm93YWJsZUxpc3QoKTsKCiAgTGlzdDxUPiBwb3AoU3RhY2sgc3RhY2ssIGludCBjb3VudCwgW051bGxWYWx1ZSBudWxsVmFsdWVdKSB7CiAgICByZXR1cm4gc3RhY2sucG9wTGlzdCgKICAgICAgICBjb3VudCwgbmV3IExpc3Q8VD4uZmlsbGVkKGNvdW50LCBudWxsLCBncm93YWJsZTogdHJ1ZSksIG51bGxWYWx1ZSk7CiAgfQp9CgpjbGFzcyBQYXJzZXJSZWNvdmVyeSB7CiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CiAgUGFyc2VyUmVjb3ZlcnkodGhpcy5jaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlBhcnNlclJlY292ZXJ5KEAkY2hhck9mZnNldCkiOwp9CoJgAE5OPAEeASE6AR0JDhgRKCwuARhFAUMBGkEBLAElARsBEQ0GDgkPEw8MEx8jGzYSDBgOERQUEBoZDhIQCgwNCBkKEQ8JCBETDBARGA4CATAjAUxRRAZRUA84NCAGARlFOikdMCgbCg8ZCAYULAErDhwWKTAKCAEyLCQ2ChUIATMsJDYKFQgBUiZLPDs6EQopGBgoIygRKQofMjkbExsMKS8RHhsTGwwbChYIATQbSiYfSQ8XCAYUBAEMDwEYIg0GBAFQGxdGMwQBUBsbMQQBUBs1MwQBUBtDAVEhPTsEARs6FgQBPDQEATkBJiEEASYpBAEhGQQBISMlGSMZKwgQBhkEAQwfFi4EAQxCJB4aDU5OQTIGBAEMIxogBAEMJR8EASQcFz48FhAGBAEMLSciBAEMNCMiBAEMMiAEAQw3GwQBDE8fBAEMLx8EAQwkJgQBDCQmBAEMJTYjBAEMLCMjBAEMLCMjBAEMUUgEAQwqGhoEAQxAJiYEAQwoHx8EAQxGJiIEAQxNLQQBDE0tBAEMKyIiBAEMICIiBAEMMzAEAQw0KwQBDCkmEQQBDEIkIxs3DUcGBAEMPSATNwYEAQwgJAQBQigxBAEMKCIEAQwlHwQBDB87LTo0LQQBOTZHEhM5PBMNFAYEAQwcREIEAT8/AgEOLBcBKgEhARQqLgQBHCInDwYEASQdLx8fFDoTDRQGBAFMIiskKyMmJy4gNSkYLCEPIhgKGQgGGgErBAEcJDglEQQBESVALBYEAgFNTQwdHQE/IUAEATkfK0oEAgFNLhgYAT8aTAQCARcYIwE3AgE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9zdGFja19saXN0ZW5lci5kYXJ0LnNka3Jvb3Q6L3BrZy9rZXJuZWwvbGliL3NyYy9ib3VuZHNfY2hlY2tzLmRhcnTAAEpVLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQm90dG9tVHlwZSwKICAgICAgICBDbGFzcywKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBOYW1lZFR5cGUsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBUeXBlZGVmVHlwZSwKICAgICAgICBWb2lkVHlwZTsKCmltcG9ydCAnLi4vdHlwZV9hbGdlYnJhLmRhcnQnIHNob3cgU3Vic3RpdHV0aW9uLCBzdWJzdGl0dXRlOwoKaW1wb3J0ICcuLi90eXBlX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZUVudmlyb25tZW50OwoKaW1wb3J0ICcuLi91dGlsL2dyYXBoLmRhcnQnIHNob3cgR3JhcGgsIGNvbXB1dGVTdHJvbmdDb21wb25lbnRzOwoKaW1wb3J0ICcuLi92aXNpdG9yLmRhcnQnIHNob3cgRGFydFR5cGVWaXNpdG9yOwoKY2xhc3MgVHlwZVZhcmlhYmxlR3JhcGggZXh0ZW5kcyBHcmFwaDxpbnQ+IHsKICBMaXN0PGludD4gdmVydGljZXM7CiAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKICBMaXN0PERhcnRUeXBlPiBib3VuZHM7CgogIC8vIGBlZGdlc1tpXWAgaXMgdGhlIGxpc3Qgb2YgaW5kaWNlcyBvZiB0eXBlIHZhcmlhYmxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgdHlwZQogIC8vIHZhcmlhYmxlIHdpdGggdGhlIGluZGV4IGBpYCBpbiB0aGVpciBib3VuZHMuCiAgTGlzdDxMaXN0PGludD4+IGVkZ2VzOwoKICBUeXBlVmFyaWFibGVHcmFwaCh0aGlzLnR5cGVQYXJhbWV0ZXJzLCB0aGlzLmJvdW5kcykgewogICAgYXNzZXJ0KHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA9PSBib3VuZHMubGVuZ3RoKTsKCiAgICB2ZXJ0aWNlcyA9IG5ldyBMaXN0PGludD4odHlwZVBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBpbnQ+IHR5cGVQYXJhbWV0ZXJJbmRpY2VzID0gPFR5cGVQYXJhbWV0ZXIsIGludD57fTsKICAgIGVkZ2VzID0gbmV3IExpc3Q8TGlzdDxpbnQ+Pih0eXBlUGFyYW1ldGVycy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykgewogICAgICB2ZXJ0aWNlc1tpXSA9IGk7CiAgICAgIHR5cGVQYXJhbWV0ZXJJbmRpY2VzW3R5cGVQYXJhbWV0ZXJzW2ldXSA9IGk7CiAgICAgIGVkZ2VzW2ldID0gPGludD5bXTsKICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIE9jY3VycmVuY2VDb2xsZWN0b3JWaXNpdG9yIGNvbGxlY3RvciA9CiAgICAgICAgICBuZXcgT2NjdXJyZW5jZUNvbGxlY3RvclZpc2l0b3IodHlwZVBhcmFtZXRlcnMudG9TZXQoKSk7CiAgICAgIGNvbGxlY3Rvci52aXNpdChib3VuZHNbaV0pOwogICAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciBpbiBjb2xsZWN0b3Iub2NjdXJyZWQpIHsKICAgICAgICBlZGdlc1t0eXBlUGFyYW1ldGVySW5kaWNlc1t0eXBlUGFyYW1ldGVyXV0uYWRkKGkpOwogICAgICB9CiAgICB9CiAgfQoKICBJdGVyYWJsZTxpbnQ+IG5laWdoYm9yc09mKGludCBpbmRleCkgewogICAgcmV0dXJuIGVkZ2VzW2luZGV4XTsKICB9Cn0KCmNsYXNzIE9jY3VycmVuY2VDb2xsZWN0b3JWaXNpdG9yIGV4dGVuZHMgRGFydFR5cGVWaXNpdG9yIHsKICBmaW5hbCBTZXQ8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CiAgU2V0PFR5cGVQYXJhbWV0ZXI+IG9jY3VycmVkID0gbmV3IFNldDxUeXBlUGFyYW1ldGVyPigpOwoKICBPY2N1cnJlbmNlQ29sbGVjdG9yVmlzaXRvcih0aGlzLnR5cGVQYXJhbWV0ZXJzKTsKCiAgdmlzaXQoRGFydFR5cGUgbm9kZSkgPT4gbm9kZS5hY2NlcHQodGhpcyk7CgogIHZpc2l0TmFtZWRUeXBlKE5hbWVkVHlwZSBub2RlKSB7CiAgICBub2RlLnR5cGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdmlzaXRJbnZhbGlkVHlwZShJbnZhbGlkVHlwZSBub2RlKTsKICB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpOwogIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgbm9kZSk7CgogIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIGZvciAoRGFydFR5cGUgYXJndW1lbnQgaW4gbm9kZS50eXBlQXJndW1lbnRzKSB7CiAgICAgIGFyZ3VtZW50LmFjY2VwdCh0aGlzKTsKICAgIH0KICB9CgogIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgZm9yIChEYXJ0VHlwZSBhcmd1bWVudCBpbiBub2RlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgYXJndW1lbnQuYWNjZXB0KHRoaXMpOwogICAgfQogIH0KCiAgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIG5vZGUpIHsKICAgIGZvciAoVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIG5vZGUudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgdHlwZVBhcmFtZXRlci5ib3VuZC5hY2NlcHQodGhpcyk7CiAgICAgIHR5cGVQYXJhbWV0ZXIuZGVmYXVsdFR5cGU/LmFjY2VwdCh0aGlzKTsKICAgIH0KICAgIGZvciAoRGFydFR5cGUgcGFyYW1ldGVyIGluIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMpIHsKICAgICAgcGFyYW1ldGVyLmFjY2VwdCh0aGlzKTsKICAgIH0KICAgIGZvciAoTmFtZWRUeXBlIG5hbWVkUGFyYW1ldGVyIGluIG5vZGUubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIG5hbWVkUGFyYW1ldGVyLnR5cGUuYWNjZXB0KHRoaXMpOwogICAgfQogICAgbm9kZS5yZXR1cm5UeXBlLmFjY2VwdCh0aGlzKTsKICB9CgogIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgaWYgKHR5cGVQYXJhbWV0ZXJzLmNvbnRhaW5zKG5vZGUucGFyYW1ldGVyKSkgewogICAgICBvY2N1cnJlZC5hZGQobm9kZS5wYXJhbWV0ZXIpOwogICAgfQogIH0KfQoKRGFydFR5cGUgaW5zdGFudGlhdGVUb0JvdW5kcyhEYXJ0VHlwZSB0eXBlLCBDbGFzcyBvYmplY3QpIHsKICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICBmb3IgKHZhciB0eXBlQXJndW1lbnQgaW4gdHlwZS50eXBlQXJndW1lbnRzKSB7CiAgICAgIC8vIElmIGF0IGxlYXN0IG9uZSBvZiB0aGUgYXJndW1lbnRzIGlzIG5vdCBkeW5hbWljLCB3ZSBhc3N1bWUgdGhhdCB0aGUKICAgICAgLy8gdHlwZSBpcyBub3QgcmF3IGFuZCBkb2VzIG5vdCBuZWVkIGluc3RhbnRpYXRpb24gb2YgaXRzIHR5cGUgcGFyYW1ldGVycwogICAgICAvLyB0byB0aGVpciBib3VuZHMuCiAgICAgIGlmICh0eXBlQXJndW1lbnQgaXMhIER5bmFtaWNUeXBlKSB7CiAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZS5ieVJlZmVyZW5jZSgKICAgICAgICB0eXBlLmNsYXNzTmFtZSwgY2FsY3VsYXRlQm91bmRzKHR5cGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLCBvYmplY3QpKTsKICB9CiAgaWYgKHR5cGUgaXMgVHlwZWRlZlR5cGUpIHsKICAgIGZvciAodmFyIHR5cGVBcmd1bWVudCBpbiB0eXBlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgaWYgKHR5cGVBcmd1bWVudCBpcyEgRHluYW1pY1R5cGUpIHsKICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBUeXBlZGVmVHlwZS5ieVJlZmVyZW5jZSh0eXBlLnR5cGVkZWZSZWZlcmVuY2UsCiAgICAgICAgY2FsY3VsYXRlQm91bmRzKHR5cGUudHlwZWRlZk5vZGUudHlwZVBhcmFtZXRlcnMsIG9iamVjdCkpOwogIH0KICByZXR1cm4gdHlwZTsKfQoKLy8vIENhbGN1bGF0ZXMgYm91bmRzIHRvIGJlIHByb3ZpZGVkIGFzIHR5cGUgYXJndW1lbnRzIGluIHBsYWNlIG9mIG1pc3NpbmcgdHlwZQovLy8gYXJndW1lbnRzIG9uIHJhdyB0eXBlcyB3aXRoIHRoZSBnaXZlbiB0eXBlIHBhcmFtZXRlcnMuCi8vLwovLy8gU2VlIHRoZSBbZGVzY3JpcHRpb25dCi8vLyAoaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvYmxvYi9tYXN0ZXIvZG9jcy9sYW5ndWFnZS9pbmZvcm1hbC9pbnN0YW50aWF0ZS10by1ib3VuZC5tZCkKLy8vIG9mIHRoZSBhbGdvcml0aG0gZm9yIGRldGFpbHMuCkxpc3Q8RGFydFR5cGU+IGNhbGN1bGF0ZUJvdW5kcygKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsIENsYXNzIG9iamVjdCkgewogIExpc3Q8RGFydFR5cGU+IGJvdW5kcyA9IG5ldyBMaXN0PERhcnRUeXBlPih0eXBlUGFyYW1ldGVycy5sZW5ndGgpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgIERhcnRUeXBlIGJvdW5kID0gdHlwZVBhcmFtZXRlcnNbaV0uYm91bmQ7CiAgICBpZiAoYm91bmQgPT0gbnVsbCkgewogICAgICBib3VuZCA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9IGVsc2UgaWYgKGJvdW5kIGlzIEludGVyZmFjZVR5cGUgJiYgYm91bmQuY2xhc3NOb2RlID09IG9iamVjdCkgewogICAgICBEYXJ0VHlwZSBkZWZhdWx0VHlwZSA9IHR5cGVQYXJhbWV0ZXJzW2ldLmRlZmF1bHRUeXBlOwogICAgICBpZiAoIShkZWZhdWx0VHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmIGRlZmF1bHRUeXBlLmNsYXNzTm9kZSA9PSBvYmplY3QpKSB7CiAgICAgICAgYm91bmQgPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICB9CiAgICB9CiAgICBib3VuZHNbaV0gPSBib3VuZDsKICB9CgogIFR5cGVWYXJpYWJsZUdyYXBoIGdyYXBoID0gbmV3IFR5cGVWYXJpYWJsZUdyYXBoKHR5cGVQYXJhbWV0ZXJzLCBib3VuZHMpOwogIExpc3Q8TGlzdDxpbnQ+PiBzdHJvbmdseUNvbm5lY3RlZCA9IGNvbXB1dGVTdHJvbmdDb21wb25lbnRzKGdyYXBoKTsKICBmb3IgKExpc3Q8aW50PiBjb21wb25lbnQgaW4gc3Ryb25nbHlDb25uZWN0ZWQpIHsKICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gdXBwZXJCb3VuZHMgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IGxvd2VyQm91bmRzID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgZm9yIChpbnQgdHlwZVBhcmFtZXRlckluZGV4IGluIGNvbXBvbmVudCkgewogICAgICB1cHBlckJvdW5kc1t0eXBlUGFyYW1ldGVyc1t0eXBlUGFyYW1ldGVySW5kZXhdXSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIGxvd2VyQm91bmRzW3R5cGVQYXJhbWV0ZXJzW3R5cGVQYXJhbWV0ZXJJbmRleF1dID0gY29uc3QgQm90dG9tVHlwZSgpOwogICAgfQogICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9CiAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21VcHBlckFuZExvd2VyQm91bmRzKHVwcGVyQm91bmRzLCBsb3dlckJvdW5kcyk7CiAgICBmb3IgKGludCB0eXBlUGFyYW1ldGVySW5kZXggaW4gY29tcG9uZW50KSB7CiAgICAgIGJvdW5kc1t0eXBlUGFyYW1ldGVySW5kZXhdID0KICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShib3VuZHNbdHlwZVBhcmFtZXRlckluZGV4XSk7CiAgICB9CiAgfQoKICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHVwcGVyQm91bmRzID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBsb3dlckJvdW5kcyA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgIHVwcGVyQm91bmRzW3R5cGVQYXJhbWV0ZXJzW2ldXSA9IGJvdW5kc1tpXTsKICAgIGxvd2VyQm91bmRzW3R5cGVQYXJhbWV0ZXJzW2ldXSA9IGNvbnN0IEJvdHRvbVR5cGUoKTsKICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPQogICAgICAgIFN1YnN0aXR1dGlvbi5mcm9tVXBwZXJBbmRMb3dlckJvdW5kcyh1cHBlckJvdW5kcywgbG93ZXJCb3VuZHMpOwogICAgZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlUGFyYW1ldGVycy5sZW5ndGg7IGorKykgewogICAgICBib3VuZHNbal0gPSBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoYm91bmRzW2pdKTsKICAgIH0KICB9CgogIHJldHVybiBib3VuZHM7Cn0KCmNsYXNzIFR5cGVBcmd1bWVudElzc3VlIHsKICAvLyBUaGUgdHlwZSBhcmd1bWVudCB0aGF0IHZpb2xhdGVkIHRoZSBib3VuZC4KICBmaW5hbCBEYXJ0VHlwZSBhcmd1bWVudDsKCiAgLy8gVGhlIHR5cGUgcGFyYW1ldGVyIHdpdGggdGhlIGJvdW5kIHRoYXQgd2FzIHZpb2xhdGVkLgogIGZpbmFsIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlcjsKCiAgLy8gVGhlIGVuY2xvc2luZyB0eXBlIG9mIHRoZSBpc3N1ZSwgdGhhdCBpcywgdGhlIG9uZSB3aXRoIFt0eXBlUGFyYW1ldGVyXS4KICBmaW5hbCBEYXJ0VHlwZSBlbmNsb3NpbmdUeXBlOwoKICBUeXBlQXJndW1lbnRJc3N1ZSh0aGlzLmFyZ3VtZW50LCB0aGlzLnR5cGVQYXJhbWV0ZXIsIHRoaXMuZW5jbG9zaW5nVHlwZSk7Cn0KCi8vIFRPRE8oZG1pdHJ5YXMpOiAgUmVtb3ZlIFt0eXBlZGVmSW5zdGFudGlhdGlvbnNdIHdoZW4gdHlwZSBhcmd1bWVudHMgcGFzc2VkIHRvCi8vIHR5cGVkZWZzIGFyZSBwcmVzZXJ2ZWQgaW4gdGhlIEtlcm5lbCBvdXRwdXQuCkxpc3Q8VHlwZUFyZ3VtZW50SXNzdWU+IGZpbmRUeXBlQXJndW1lbnRJc3N1ZXMoCiAgICBEYXJ0VHlwZSB0eXBlLCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LAogICAge2Jvb2wgYWxsb3dTdXBlckJvdW5kZWQgPSBmYWxzZX0pIHsKICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHZhcmlhYmxlczsKICBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHM7CiAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gdHlwZWRlZlJoc1Jlc3VsdDsKCiAgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlICYmIHR5cGUudHlwZWRlZlR5cGUgIT0gbnVsbCkgewogICAgLy8gW3R5cGVdIGlzIGEgZnVuY3Rpb24gdHlwZSB0aGF0IGlzIGFuIGFwcGxpY2F0aW9uIG9mIGEgcGFyYW1ldHJpemVkCiAgICAvLyB0eXBlZGVmLiAgV2UgbmVlZCB0byBjaGVjayBib3RoIHRoZSBsLmgucy4gYW5kIHRoZSByLmgucy4gb2YgdGhlCiAgICAvLyBkZWZpbml0aW9uIGluIHRoYXQgY2FzZS4gIEZvciBkZXRhaWxzLCBzZWUgW2xpbmtdCiAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvYmxvYi9tYXN0ZXIvZG9jcy9sYW5ndWFnZS9pbmZvcm1hbC9zdXBlci1ib3VuZGVkLXR5cGVzLm1kKS4KICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPSB0eXBlOwogICAgRnVuY3Rpb25UeXBlIGNsb25lZCA9IG5ldyBGdW5jdGlvblR5cGUoCiAgICAgICAgZnVuY3Rpb25UeXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLCBmdW5jdGlvblR5cGUucmV0dXJuVHlwZSwKICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IGZ1bmN0aW9uVHlwZS5uYW1lZFBhcmFtZXRlcnMsCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IGZ1bmN0aW9uVHlwZS50eXBlUGFyYW1ldGVycywKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiBmdW5jdGlvblR5cGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICB0eXBlZGVmVHlwZTogbnVsbCk7CiAgICB0eXBlZGVmUmhzUmVzdWx0ID0gZmluZFR5cGVBcmd1bWVudElzc3VlcyhjbG9uZWQsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSk7CiAgICB0eXBlID0gZnVuY3Rpb25UeXBlLnR5cGVkZWZUeXBlOwogIH0KCiAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgdmFyaWFibGVzID0gdHlwZS5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnM7CiAgICBhcmd1bWVudHMgPSB0eXBlLnR5cGVBcmd1bWVudHM7CiAgfSBlbHNlIGlmICh0eXBlIGlzIFR5cGVkZWZUeXBlKSB7CiAgICB2YXJpYWJsZXMgPSB0eXBlLnR5cGVkZWZOb2RlLnR5cGVQYXJhbWV0ZXJzOwogICAgYXJndW1lbnRzID0gdHlwZS50eXBlQXJndW1lbnRzOwogIH0gZWxzZSBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgIExpc3Q8VHlwZUFyZ3VtZW50SXNzdWU+IHJlc3VsdCA9IDxUeXBlQXJndW1lbnRJc3N1ZT5bXTsKICAgIGZvciAoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIgaW4gdHlwZS50eXBlUGFyYW1ldGVycykgewogICAgICByZXN1bHQuYWRkQWxsKGZpbmRUeXBlQXJndW1lbnRJc3N1ZXMocGFyYW1ldGVyLmJvdW5kLCB0eXBlRW52aXJvbm1lbnQsCiAgICAgICAgICAgICAgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpID8/CiAgICAgICAgICBjb25zdCA8VHlwZUFyZ3VtZW50SXNzdWU+W10pOwogICAgfQogICAgZm9yIChEYXJ0VHlwZSBmb3JtYWwgaW4gdHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICByZXN1bHQuYWRkQWxsKGZpbmRUeXBlQXJndW1lbnRJc3N1ZXMoZm9ybWFsLCB0eXBlRW52aXJvbm1lbnQsCiAgICAgICAgICAgICAgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpID8/CiAgICAgICAgICBjb25zdCA8VHlwZUFyZ3VtZW50SXNzdWU+W10pOwogICAgfQogICAgZm9yIChOYW1lZFR5cGUgbmFtZWQgaW4gdHlwZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgcmVzdWx0LmFkZEFsbChmaW5kVHlwZUFyZ3VtZW50SXNzdWVzKG5hbWVkLnR5cGUsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSkgPz8KICAgICAgICAgIGNvbnN0IDxUeXBlQXJndW1lbnRJc3N1ZT5bXSk7CiAgICB9CiAgICByZXN1bHQuYWRkQWxsKGZpbmRUeXBlQXJndW1lbnRJc3N1ZXModHlwZS5yZXR1cm5UeXBlLCB0eXBlRW52aXJvbm1lbnQsCiAgICAgICAgICAgIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKSA/PwogICAgICAgIGNvbnN0IDxUeXBlQXJndW1lbnRJc3N1ZT5bXSk7CiAgICByZXR1cm4gcmVzdWx0LmlzRW1wdHkgPyBudWxsIDogcmVzdWx0OwogIH0gZWxzZSB7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGlmICh2YXJpYWJsZXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CgogIExpc3Q8VHlwZUFyZ3VtZW50SXNzdWU+IHJlc3VsdDsKICBMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBhcmd1bWVudHNSZXN1bHQ7CgogIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uTWFwID0KICAgICAgbmV3IE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4uZnJvbUl0ZXJhYmxlcyh2YXJpYWJsZXMsIGFyZ3VtZW50cyk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgIERhcnRUeXBlIGFyZ3VtZW50ID0gYXJndW1lbnRzW2ldOwogICAgaWYgKGFyZ3VtZW50IGlzIEZ1bmN0aW9uVHlwZSAmJiBhcmd1bWVudC50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CiAgICAgIC8vIEdlbmVyaWMgZnVuY3Rpb24gdHlwZXMgYXJlbid0IGFsbG93ZWQgYXMgdHlwZSBhcmd1bWVudHMgZWl0aGVyLgogICAgICByZXN1bHQgPz89IDxUeXBlQXJndW1lbnRJc3N1ZT5bXTsKICAgICAgcmVzdWx0LmFkZChuZXcgVHlwZUFyZ3VtZW50SXNzdWUoYXJndW1lbnQsIHZhcmlhYmxlc1tpXSwgdHlwZSkpOwogICAgfSBlbHNlIGlmICghdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKAogICAgICAgIGFyZ3VtZW50LCBzdWJzdGl0dXRlKHZhcmlhYmxlc1tpXS5ib3VuZCwgc3Vic3RpdHV0aW9uTWFwKSkpIHsKICAgICAgcmVzdWx0ID8/PSA8VHlwZUFyZ3VtZW50SXNzdWU+W107CiAgICAgIHJlc3VsdC5hZGQobmV3IFR5cGVBcmd1bWVudElzc3VlKGFyZ3VtZW50LCB2YXJpYWJsZXNbaV0sIHR5cGUpKTsKICAgIH0KCiAgICBMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBpc3N1ZXMgPSBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzKAogICAgICAgIGFyZ3VtZW50LCB0eXBlRW52aXJvbm1lbnQsCiAgICAgICAgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpOwogICAgaWYgKGlzc3VlcyAhPSBudWxsKSB7CiAgICAgIGFyZ3VtZW50c1Jlc3VsdCA/Pz0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgICBhcmd1bWVudHNSZXN1bHQuYWRkQWxsKGlzc3Vlcyk7CiAgICB9CiAgfQogIGlmIChhcmd1bWVudHNSZXN1bHQgIT0gbnVsbCkgewogICAgcmVzdWx0ID8/PSA8VHlwZUFyZ3VtZW50SXNzdWU+W107CiAgICByZXN1bHQuYWRkQWxsKGFyZ3VtZW50c1Jlc3VsdCk7CiAgfQogIGlmICh0eXBlZGVmUmhzUmVzdWx0ICE9IG51bGwpIHsKICAgIHJlc3VsdCA/Pz0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgcmVzdWx0LmFkZEFsbCh0eXBlZGVmUmhzUmVzdWx0KTsKICB9CgogIC8vIFt0eXBlXSBpcyByZWd1bGFyLWJvdW5kZWQuCiAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICBpZiAoIWFsbG93U3VwZXJCb3VuZGVkKSByZXR1cm4gcmVzdWx0OwoKICByZXN1bHQgPSBudWxsOwogIHR5cGUgPSBjb252ZXJ0U3VwZXJCb3VuZGVkVG9SZWd1bGFyQm91bmRlZCh0eXBlRW52aXJvbm1lbnQsIHR5cGUpOwogIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50c1RvUmVwb3J0ID0gYXJndW1lbnRzLnRvTGlzdCgpOwogIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgIHZhcmlhYmxlcyA9IHR5cGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzOwogICAgYXJndW1lbnRzID0gdHlwZS50eXBlQXJndW1lbnRzOwogIH0gZWxzZSBpZiAodHlwZSBpcyBUeXBlZGVmVHlwZSkgewogICAgdmFyaWFibGVzID0gdHlwZS50eXBlZGVmTm9kZS50eXBlUGFyYW1ldGVyczsKICAgIGFyZ3VtZW50cyA9IHR5cGUudHlwZUFyZ3VtZW50czsKICB9CiAgc3Vic3RpdHV0aW9uTWFwID0KICAgICAgbmV3IE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4uZnJvbUl0ZXJhYmxlcyh2YXJpYWJsZXMsIGFyZ3VtZW50cyk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgIERhcnRUeXBlIGFyZ3VtZW50ID0gYXJndW1lbnRzW2ldOwogICAgaWYgKGFyZ3VtZW50IGlzIEZ1bmN0aW9uVHlwZSAmJiBhcmd1bWVudC50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CiAgICAgIC8vIEdlbmVyaWMgZnVuY3Rpb24gdHlwZXMgYXJlbid0IGFsbG93ZWQgYXMgdHlwZSBhcmd1bWVudHMgZWl0aGVyLgogICAgICByZXN1bHQgPz89IDxUeXBlQXJndW1lbnRJc3N1ZT5bXTsKICAgICAgcmVzdWx0CiAgICAgICAgICAuYWRkKG5ldyBUeXBlQXJndW1lbnRJc3N1ZShhcmd1bWVudHNUb1JlcG9ydFtpXSwgdmFyaWFibGVzW2ldLCB0eXBlKSk7CiAgICB9IGVsc2UgaWYgKCF0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoCiAgICAgICAgYXJndW1lbnQsIHN1YnN0aXR1dGUodmFyaWFibGVzW2ldLmJvdW5kLCBzdWJzdGl0dXRpb25NYXApKSkgewogICAgICByZXN1bHQgPz89IDxUeXBlQXJndW1lbnRJc3N1ZT5bXTsKICAgICAgcmVzdWx0CiAgICAgICAgICAuYWRkKG5ldyBUeXBlQXJndW1lbnRJc3N1ZShhcmd1bWVudHNUb1JlcG9ydFtpXSwgdmFyaWFibGVzW2ldLCB0eXBlKSk7CiAgICB9CiAgfQogIGlmIChhcmd1bWVudHNSZXN1bHQgIT0gbnVsbCkgewogICAgcmVzdWx0ID8/PSA8VHlwZUFyZ3VtZW50SXNzdWU+W107CiAgICByZXN1bHQuYWRkQWxsKGFyZ3VtZW50c1Jlc3VsdCk7CiAgfQogIGlmICh0eXBlZGVmUmhzUmVzdWx0ICE9IG51bGwpIHsKICAgIHJlc3VsdCA/Pz0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgcmVzdWx0LmFkZEFsbCh0eXBlZGVmUmhzUmVzdWx0KTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKLy8gVE9ETyhkbWl0cnlhcyk6ICBSZW1vdmUgW3R5cGVkZWZJbnN0YW50aWF0aW9uc10gd2hlbiB0eXBlIGFyZ3VtZW50cyBwYXNzZWQgdG8KLy8gdHlwZWRlZnMgYXJlIHByZXNlcnZlZCBpbiB0aGUgS2VybmVsIG91dHB1dC4KTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gZmluZFR5cGVBcmd1bWVudElzc3Vlc0Zvckludm9jYXRpb24oCiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHBhcmFtZXRlcnMsCiAgICBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMsCiAgICBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LAogICAge01hcDxGdW5jdGlvblR5cGUsIExpc3Q8RGFydFR5cGU+PiB0eXBlZGVmSW5zdGFudGlhdGlvbnN9KSB7CiAgYXNzZXJ0KGFyZ3VtZW50cy5sZW5ndGggPT0gcGFyYW1ldGVycy5sZW5ndGgpOwogIExpc3Q8VHlwZUFyZ3VtZW50SXNzdWU+IHJlc3VsdDsKICB2YXIgc3Vic3RpdHV0aW9uTWFwID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICBzdWJzdGl0dXRpb25NYXBbcGFyYW1ldGVyc1tpXV0gPSBhcmd1bWVudHNbaV07CiAgfQogIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICBEYXJ0VHlwZSBhcmd1bWVudCA9IGFyZ3VtZW50c1tpXTsKICAgIGlmIChhcmd1bWVudCBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJiBhcmd1bWVudC5wcm9tb3RlZEJvdW5kICE9IG51bGwpIHsKICAgICAgcmVzdWx0ID8/PSA8VHlwZUFyZ3VtZW50SXNzdWU+W107CiAgICAgIHJlc3VsdC5hZGQobmV3IFR5cGVBcmd1bWVudElzc3VlKGFyZ3VtZW50LCBwYXJhbWV0ZXJzW2ldLCBudWxsKSk7CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50IGlzIEZ1bmN0aW9uVHlwZSAmJiBhcmd1bWVudC50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CiAgICAgIC8vIEdlbmVyaWMgZnVuY3Rpb24gdHlwZXMgYXJlbid0IGFsbG93ZWQgYXMgdHlwZSBhcmd1bWVudHMgZWl0aGVyLgogICAgICByZXN1bHQgPz89IDxUeXBlQXJndW1lbnRJc3N1ZT5bXTsKICAgICAgcmVzdWx0LmFkZChuZXcgVHlwZUFyZ3VtZW50SXNzdWUoYXJndW1lbnQsIHBhcmFtZXRlcnNbaV0sIG51bGwpKTsKICAgIH0gZWxzZSBpZiAoIXR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZigKICAgICAgICBhcmd1bWVudCwgc3Vic3RpdHV0ZShwYXJhbWV0ZXJzW2ldLmJvdW5kLCBzdWJzdGl0dXRpb25NYXApKSkgewogICAgICByZXN1bHQgPz89IDxUeXBlQXJndW1lbnRJc3N1ZT5bXTsKICAgICAgcmVzdWx0LmFkZChuZXcgVHlwZUFyZ3VtZW50SXNzdWUoYXJndW1lbnQsIHBhcmFtZXRlcnNbaV0sIG51bGwpKTsKICAgIH0KCiAgICBMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBpc3N1ZXMgPSBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzKAogICAgICAgIGFyZ3VtZW50LCB0eXBlRW52aXJvbm1lbnQsCiAgICAgICAgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpOwogICAgaWYgKGlzc3VlcyAhPSBudWxsKSB7CiAgICAgIHJlc3VsdCA/Pz0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgICByZXN1bHQuYWRkQWxsKGlzc3Vlcyk7CiAgICB9CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KClN0cmluZyBnZXRHZW5lcmljVHlwZU5hbWUoRGFydFR5cGUgdHlwZSkgewogIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgIHJldHVybiB0eXBlLmNsYXNzTm9kZS5uYW1lOwogIH0gZWxzZSBpZiAodHlwZSBpcyBUeXBlZGVmVHlwZSkgewogICAgcmV0dXJuIHR5cGUudHlwZWRlZk5vZGUubmFtZTsKICB9CiAgcmV0dXJuIHR5cGUudG9TdHJpbmcoKTsKfQoKLy8vIFJlcGxhY2VzIGFsbCBjb3ZhcmlhbnQgb2NjdXJyZW5jZXMgb2YgYGR5bmFtaWNgLCBgT2JqZWN0YCwgYW5kIGB2b2lkYCB3aXRoCi8vLyBbQm90dG9tVHlwZV0gYW5kIGFsbCBjb250cmF2YXJpYW50IG9jY3VycmVuY2VzIG9mIGBOdWxsYCBhbmQgW0JvdHRvbVR5cGVdCi8vLyB3aXRoIGBPYmplY3RgLgpEYXJ0VHlwZSBjb252ZXJ0U3VwZXJCb3VuZGVkVG9SZWd1bGFyQm91bmRlZCgKICAgIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsIERhcnRUeXBlIHR5cGUsCiAgICB7Ym9vbCBpc0NvdmFyaWFudCA9IHRydWV9KSB7CiAgaWYgKCh0eXBlIGlzIER5bmFtaWNUeXBlIHx8CiAgICAgICAgICB0eXBlIGlzIFZvaWRUeXBlIHx8CiAgICAgICAgICBpc09iamVjdCh0eXBlRW52aXJvbm1lbnQsIHR5cGUpKSAmJgogICAgICBpc0NvdmFyaWFudCkgewogICAgcmV0dXJuIGNvbnN0IEJvdHRvbVR5cGUoKTsKICB9IGVsc2UgaWYgKCh0eXBlIGlzIEJvdHRvbVR5cGUgfHwgaXNOdWxsKHR5cGVFbnZpcm9ubWVudCwgdHlwZSkpICYmCiAgICAgICFpc0NvdmFyaWFudCkgewogICAgcmV0dXJuIHR5cGVFbnZpcm9ubWVudC5vYmplY3RUeXBlOwogIH0gZWxzZSBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmIHR5cGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgIExpc3Q8RGFydFR5cGU+IHJlcGxhY2VkVHlwZUFyZ3VtZW50cyA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+KHR5cGUudHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBsYWNlZFR5cGVBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVwbGFjZWRUeXBlQXJndW1lbnRzW2ldID0gY29udmVydFN1cGVyQm91bmRlZFRvUmVndWxhckJvdW5kZWQoCiAgICAgICAgICB0eXBlRW52aXJvbm1lbnQsIHR5cGUudHlwZUFyZ3VtZW50c1tpXSwKICAgICAgICAgIGlzQ292YXJpYW50OiBpc0NvdmFyaWFudCk7CiAgICB9CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUodHlwZS5jbGFzc05vZGUsIHJlcGxhY2VkVHlwZUFyZ3VtZW50cyk7CiAgfSBlbHNlIGlmICh0eXBlIGlzIFR5cGVkZWZUeXBlICYmIHR5cGUudHlwZWRlZk5vZGUudHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgTGlzdDxEYXJ0VHlwZT4gcmVwbGFjZWRUeXBlQXJndW1lbnRzID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4odHlwZS50eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGxhY2VkVHlwZUFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICByZXBsYWNlZFR5cGVBcmd1bWVudHNbaV0gPSBjb252ZXJ0U3VwZXJCb3VuZGVkVG9SZWd1bGFyQm91bmRlZCgKICAgICAgICAgIHR5cGVFbnZpcm9ubWVudCwgdHlwZS50eXBlQXJndW1lbnRzW2ldLAogICAgICAgICAgaXNDb3ZhcmlhbnQ6IGlzQ292YXJpYW50KTsKICAgIH0KICAgIHJldHVybiBuZXcgVHlwZWRlZlR5cGUodHlwZS50eXBlZGVmTm9kZSwgcmVwbGFjZWRUeXBlQXJndW1lbnRzKTsKICB9IGVsc2UgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICB2YXIgcmVwbGFjZWRSZXR1cm5UeXBlID0gY29udmVydFN1cGVyQm91bmRlZFRvUmVndWxhckJvdW5kZWQoCiAgICAgICAgdHlwZUVudmlyb25tZW50LCB0eXBlLnJldHVyblR5cGUsCiAgICAgICAgaXNDb3ZhcmlhbnQ6IGlzQ292YXJpYW50KTsKICAgIHZhciByZXBsYWNlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4odHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBsYWNlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlcGxhY2VkUG9zaXRpb25hbFBhcmFtZXRlcnNbaV0gPSBjb252ZXJ0U3VwZXJCb3VuZGVkVG9SZWd1bGFyQm91bmRlZCgKICAgICAgICAgIHR5cGVFbnZpcm9ubWVudCwgdHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSwKICAgICAgICAgIGlzQ292YXJpYW50OiAhaXNDb3ZhcmlhbnQpOwogICAgfQogICAgdmFyIHJlcGxhY2VkTmFtZWRQYXJhbWV0ZXJzID0KICAgICAgICBuZXcgTGlzdDxOYW1lZFR5cGU+KHR5cGUubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGxhY2VkTmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlcGxhY2VkTmFtZWRQYXJhbWV0ZXJzW2ldID0gbmV3IE5hbWVkVHlwZSgKICAgICAgICAgIHR5cGUubmFtZWRQYXJhbWV0ZXJzW2ldLm5hbWUsCiAgICAgICAgICBjb252ZXJ0U3VwZXJCb3VuZGVkVG9SZWd1bGFyQm91bmRlZCgKICAgICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQsIHR5cGUubmFtZWRQYXJhbWV0ZXJzW2ldLnR5cGUsCiAgICAgICAgICAgICAgaXNDb3ZhcmlhbnQ6ICFpc0NvdmFyaWFudCkpOwogICAgfQogICAgcmV0dXJuIG5ldyBGdW5jdGlvblR5cGUocmVwbGFjZWRQb3NpdGlvbmFsUGFyYW1ldGVycywgcmVwbGFjZWRSZXR1cm5UeXBlLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogcmVwbGFjZWROYW1lZFBhcmFtZXRlcnMsCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHR5cGUudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogdHlwZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIHR5cGVkZWZUeXBlOiB0eXBlLnR5cGVkZWZUeXBlKTsKICB9CiAgcmV0dXJuIHR5cGU7Cn0KCmJvb2wgaXNPYmplY3QoVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwgRGFydFR5cGUgdHlwZSkgewogIHJldHVybiB0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgdHlwZS5jbGFzc05vZGUgPT0gdHlwZUVudmlyb25tZW50Lm9iamVjdFR5cGUuY2xhc3NOb2RlOwp9Cgpib29sIGlzTnVsbChUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBEYXJ0VHlwZSB0eXBlKSB7CiAgcmV0dXJuIHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICB0eXBlLmNsYXNzTm9kZSA9PSB0eXBlRW52aXJvbm1lbnQubnVsbFR5cGUuY2xhc3NOb2RlOwp9CgovLyBWYWx1ZSBzZXQgZm9yIHZhcmlhbmNlIG9mIGEgdHlwZSBwYXJhbWV0ZXIgWCBpbiBhIHR5cGUgdGVybSBULgpjbGFzcyBWYXJpYW5jZSB7CiAgLy8gVXNlZCB3aGVuIFggZG9lcyBub3Qgb2NjdXIgZnJlZSBpbiBULgogIHN0YXRpYyBjb25zdCBpbnQgdW5yZWxhdGVkID0gMDsKCiAgLy8gVXNlZCB3aGVuIFggb2NjdXJzIGZyZWUgaW4gVCwgYW5kIFUgPDogViBpbXBsaWVzIFtVL1hdVCA8OiBbVi9YXVQuCiAgc3RhdGljIGNvbnN0IGludCBjb3ZhcmlhbnQgPSAxOwoKICAvLyBVc2VkIHdoZW4gWCBvY2N1cnMgZnJlZSBpbiBULCBhbmQgVSA8OiBWIGltcGxpZXMgW1YvWF1UIDw6IFtVL1hdVC4KICBzdGF0aWMgY29uc3QgaW50IGNvbnRyYXZhcmlhbnQgPSAyOwoKICAvLyBVc2VkIHdoZW4gdGhlcmUgZXhpc3RzIGEgcGFpciBVIGFuZCBWIHN1Y2ggdGhhdCBVIDw6IFYsIGJ1dCBbVS9YXVQgYW5kCiAgLy8gW1YvWF1UIGFyZSBpbmNvbXBhcmFibGUuCiAgc3RhdGljIGNvbnN0IGludCBpbnZhcmlhbnQgPSAzOwoKICAvLyBWYXJpYW5jZSB2YWx1ZXMgZm9ybSBhIGxhdHRpY2Ugd2hlcmUgW3VucmVsYXRlZF0gaXMgdGhlIHRvcCwgW2ludmFyaWFudF0KICAvLyBpcyB0aGUgYm90dG9tLCBhbmQgW2NvdmFyaWFudF0gYW5kIFtjb250cmF2YXJpYW50XSBhcmUgaW5jb21wYXJhYmxlLgogIC8vIFttZWV0XSBjYWxjdWxhdGVzIHRoZSBtZWV0IG9mIHR3byBlbGVtZW50cyBvZiBzdWNoIGxhdHRpY2UuICBJdCBjYW4gYmUKICAvLyB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gY2FsY3VsYXRlIHRoZSB2YXJpYW5jZSBvZiBhIHR5cGVkZWYgdHlwZSBwYXJhbWV0ZXIKICAvLyBpZiBpdCdzIGVuY291bnRlcmVkIG9uIHRoZSByLmgucy4gb2YgdGhlIHR5cGVkZWYgbXVsdGlwbGUgdGltZXMuCiAgc3RhdGljIGludCBtZWV0KGludCBhLCBpbnQgYikgPT4gYSB8IGI7CgogIC8vIENvbWJpbmVzIHZhcmlhbmNlcyBvZiBYIGluIFQgYW5kIFkgaW4gUyBpbnRvIHZhcmlhbmNlIG9mIFggaW4gW1kvVF1TLgogIC8vCiAgLy8gQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlczoKICAvLwogIC8vICogdmFyaWFuY2Ugb2YgWCBpbiBGdW5jdGlvbihYKSBpcyBbY29udHJhdmFyaWFudF0sIHZhcmlhbmNlIG9mIFkgaW4gTGlzdDxZPgogIC8vIGlzIFtjb3ZhcmlhbnRdLCBzbyB2YXJpYW5jZSBvZiBYIGluIExpc3Q8RnVuY3Rpb24oWCk+IGlzIFtjb250cmF2YXJpYW50XTsKICAvLwogIC8vICogdmFyaWFuY2Ugb2YgWCBpbiBMaXN0PFg+IGlzIFtjb3ZhcmlhbnRdLCB2YXJpYW5jZSBvZiBZIGluIEZ1bmN0aW9uKFkpIGlzCiAgLy8gW2NvbnRyYXZhcmlhbnRdLCBzbyB2YXJpYW5jZSBvZiBYIGluIEZ1bmN0aW9uKExpc3Q8WD4pIGlzIFtjb250cmF2YXJpYW50XTsKICAvLwogIC8vICogdmFyaWFuY2Ugb2YgWCBpbiBGdW5jdGlvbihYKSBpcyBbY29udHJhdmFyaWFudF0sIHZhcmlhbmNlIG9mIFkgaW4KICAvLyBGdW5jdGlvbihZKSBpcyBbY29udHJhdmFyaWFudF0sIHNvIHZhcmlhbmNlIG9mIFggaW4gRnVuY3Rpb24oRnVuY3Rpb24oWCkpCiAgLy8gaXMgW2NvdmFyaWFudF07CiAgLy8KICAvLyAqIGxldCB0aGUgZm9sbG93aW5nIGJlIGRlY2xhcmVkOgogIC8vCiAgLy8gICAgIHR5cGVkZWYgRjxaPiA9IEZ1bmN0aW9uKCk7CiAgLy8KICAvLyB0aGVuIHZhcmlhbmNlIG9mIFggaW4gRjxYPiBpcyBbdW5yZWxhdGVkXSwgdmFyaWFuY2Ugb2YgWSBpbiBMaXN0PFk+IGlzCiAgLy8gW2NvdmFyaWFudF0sIHNvIHZhcmlhbmNlIG9mIFggaW4gTGlzdDxGPFg+PiBpcyBbdW5yZWxhdGVkXTsKICAvLwogIC8vICogbGV0IHRoZSBmb2xsb3dpbmcgYmUgZGVjbGFyZWQ6CiAgLy8KICAvLyAgICAgdHlwZWRlZiBHPFo+ID0gWiBGdW5jdGlvbihaKTsKICAvLwogIC8vIHRoZW4gdmFyaWFuY2Ugb2YgWCBpbiBMaXN0PFg+IGlzIFtjb3ZhcmlhbnRdLCB2YXJpYW5jZSBvZiBZIGluIEc8WT4gaXMKICAvLyBbaW52YXJpYW50XSwgc28gdmFyaWFuY2Ugb2YgYFhgIGluIGBHPExpc3Q8WD4+YCBpcyBbaW52YXJpYW50XS4KICBzdGF0aWMgaW50IGNvbWJpbmUoaW50IGEsIGludCBiKSB7CiAgICBpZiAoYSA9PSB1bnJlbGF0ZWQgfHwgYiA9PSB1bnJlbGF0ZWQpIHJldHVybiB1bnJlbGF0ZWQ7CiAgICBpZiAoYSA9PSBpbnZhcmlhbnQgfHwgYiA9PSBpbnZhcmlhbnQpIHJldHVybiBpbnZhcmlhbnQ7CiAgICByZXR1cm4gYSA9PSBiID8gY292YXJpYW50IDogY29udHJhdmFyaWFudDsKICB9Cn0KggIATk48ARUJFA8SFRYXFRMXGxUSAT0BOAFBAS8BLRYmGQFRMhkBODQBNUs4MBczGgYBMC1CIkA7CAYEASkZBAIBOys6ATMBLQEjHAQBJiYgASs0HQYEASc0HQYEASk/KC8GPB4GPSgGIgQBMzMkBgQCATwfM01QGioVCAYqUQQdMyoVCAY+QwQPAgFQOwQaYiIgOEU0LhkjRjxQJQgGFwQBS0YzTEwwTUwGIEgwI0MGBAE0TEwwOSBINjoGBAERAgEaMBsBOiUBTSABTAIBUTAwNCghHCwBOkpIOWUmLEQ3NUUcRyIlBAEfLyQkMSQlPDtNKigGOUQqKAY0SCooBksoJisLEQQBJgEiKwExTC8mSkkoRy1GKEcGAT0jIhoxJgYEISYkBCImJQQBICMpARFFOR8vJCQxJAQUTC8mSkkoDVEtRigNUQYEISYkBCImJQQRAgFRMD0kHiVBMSI1LzMELyZLKEhRSShILUcoSAYBPSMiGigdBgQRAgErHyAkIgQaAgFPThMuNCEeHi4VH0YWJ08rNz1GMiUGRU8rNz1GMiUGRSVCKiMnPkRNOSYGIjo/MigvPSsGTjItPSgEDwIBQCI+AgE+IjwCAUIRKyIBSCIBSCYBTB4iAU5KTE5GKgFLBSYFUU8FUFAFSU8VBSYFJAVMQQUmBScFTEUlPDwvBAIBJXBhY2thZ2U6a2VybmVsL3NyYy9ib3VuZHNfY2hlY2tzLmRhcnRRc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfY29uc3RyYWludF9nYXRoZXJlci5kYXJ0wABKlC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3MsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRnVuY3Rpb25UeXBlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgTWVtYmVyLAogICAgICAgIE5hbWUsCiAgICAgICAgTmFtZWRUeXBlLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBzdWJzdGl0dXRlLCBTdWJzdGl0dXRpb247CgppbXBvcnQgJ3R5cGVfc2NoZW1hLmRhcnQnIHNob3cgVW5rbm93blR5cGU7CgppbXBvcnQgJ3R5cGVfc2NoZW1hX2Vudmlyb25tZW50LmRhcnQnCiAgICBzaG93IFR5cGVDb25zdHJhaW50LCBUeXBlU2NoZW1hRW52aXJvbm1lbnQsIHN1YnN0aXR1dGVUeXBlUGFyYW1zOwoKaW1wb3J0ICcuLi9uYW1lcy5kYXJ0JyBzaG93IGNhbGxOYW1lOwoKaW1wb3J0ICd0eXBlX3NjaGVtYS5kYXJ0JzsKCmltcG9ydCAndHlwZV9zY2hlbWFfZW52aXJvbm1lbnQuZGFydCc7CgovLy8gQ3JlYXRlcyBhIGNvbGxlY3Rpb24gb2YgW1R5cGVDb25zdHJhaW50XXMgY29ycmVzcG9uZGluZyB0byB0eXBlIHBhcmFtZXRlcnMsCi8vLyBiYXNlZCBvbiBhbiBhdHRlbXB0IHRvIG1ha2Ugb25lIHR5cGUgc2NoZW1hIGEgc3VidHlwZSBvZiBhbm90aGVyLgphYnN0cmFjdCBjbGFzcyBUeXBlQ29uc3RyYWludEdhdGhlcmVyIHsKICBmaW5hbCBfcHJvdG9Db25zdHJhaW50cyA9IDxfUHJvdG9Db25zdHJhaW50PltdOwoKICBmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IF9wYXJhbWV0ZXJzVG9Db25zdHJhaW47CgogIC8vLyBDcmVhdGVzIGEgW1R5cGVDb25zdHJhaW50R2F0aGVyZXJdIHdoaWNoIGlzIHByZXBhcmVkIHRvIGdhdGhlciB0eXBlCiAgLy8vIGNvbnN0cmFpbnRzIGZvciB0aGUgZ2l2ZW4gW3R5cGVQYXJhbWV0ZXJzXS4KICBUeXBlQ29uc3RyYWludEdhdGhlcmVyLnN1YmNsYXNzaW5nKEl0ZXJhYmxlPFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKQogICAgICA6IF9wYXJhbWV0ZXJzVG9Db25zdHJhaW4gPSB0eXBlUGFyYW1ldGVycy50b0xpc3QoKTsKCiAgZmFjdG9yeSBUeXBlQ29uc3RyYWludEdhdGhlcmVyKFR5cGVTY2hlbWFFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKICAgICAgSXRlcmFibGU8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKICAgIHJldHVybiBuZXcgVHlwZVNjaGVtYUNvbnN0cmFpbnRHYXRoZXJlcihlbnZpcm9ubWVudCwgdHlwZVBhcmFtZXRlcnMpOwogIH0KCiAgQ2xhc3MgZ2V0IG9iamVjdENsYXNzOwoKICBDbGFzcyBnZXQgZnVuY3Rpb25DbGFzczsKCiAgQ2xhc3MgZ2V0IGZ1dHVyZU9yQ2xhc3M7CgogIENsYXNzIGdldCBudWxsQ2xhc3M7CgogIHZvaWQgYWRkVXBwZXJCb3VuZChUeXBlQ29uc3RyYWludCBjb25zdHJhaW50LCBEYXJ0VHlwZSB1cHBlcik7CgogIHZvaWQgYWRkTG93ZXJCb3VuZChUeXBlQ29uc3RyYWludCBjb25zdHJhaW50LCBEYXJ0VHlwZSBsb3dlcik7CgogIE1lbWJlciBnZXRJbnRlcmZhY2VNZW1iZXIoQ2xhc3MgY2xhc3NfLCBOYW1lIG5hbWUsIHtib29sIHNldHRlcjogZmFsc2V9KTsKCiAgSW50ZXJmYWNlVHlwZSBnZXRUeXBlQXNJbnN0YW5jZU9mKEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcyk7CgogIEludGVyZmFjZVR5cGUgZnV0dXJlVHlwZShEYXJ0VHlwZSB0eXBlKTsKCiAgLy8vIFJldHVybnMgdGhlIHNldCBvZiB0eXBlIGNvbnN0cmFpbnRzIHRoYXQgd2FzIGdhdGhlcmVkLgogIE1hcDxUeXBlUGFyYW1ldGVyLCBUeXBlQ29uc3RyYWludD4gY29tcHV0ZUNvbnN0cmFpbnRzKCkgewogICAgdmFyIHJlc3VsdCA9IDxUeXBlUGFyYW1ldGVyLCBUeXBlQ29uc3RyYWludD57fTsKICAgIGZvciAodmFyIHBhcmFtZXRlciBpbiBfcGFyYW1ldGVyc1RvQ29uc3RyYWluKSB7CiAgICAgIHJlc3VsdFtwYXJhbWV0ZXJdID0gbmV3IFR5cGVDb25zdHJhaW50KCk7CiAgICB9CiAgICBmb3IgKHZhciBwcm90b0NvbnN0cmFpbnQgaW4gX3Byb3RvQ29uc3RyYWludHMpIHsKICAgICAgaWYgKHByb3RvQ29uc3RyYWludC5pc1VwcGVyKSB7CiAgICAgICAgYWRkVXBwZXJCb3VuZChyZXN1bHRbcHJvdG9Db25zdHJhaW50LnBhcmFtZXRlcl0sIHByb3RvQ29uc3RyYWludC5ib3VuZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWRkTG93ZXJCb3VuZChyZXN1bHRbcHJvdG9Db25zdHJhaW50LnBhcmFtZXRlcl0sIHByb3RvQ29uc3RyYWludC5ib3VuZCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gVHJpZXMgdG8gbWF0Y2ggW3N1YnR5cGVdIGFnYWluc3QgW3N1cGVydHlwZV0uCiAgLy8vCiAgLy8vIElmIHRoZSBtYXRjaCBzdWNjZWVkcywgdGhlIHJlc3VsdGluZyB0eXBlIGNvbnN0cmFpbnRzIGFyZSByZWNvcmRlZCBmb3IKICAvLy8gbGF0ZXIgdXNlIGJ5IFtjb21wdXRlQ29uc3RyYWludHNdLiAgSWYgdGhlIG1hdGNoIGZhaWxzLCB0aGUgc2V0IG9mIHR5cGUKICAvLy8gY29uc3RyYWludHMgaXMgdW5jaGFuZ2VkLgogIGJvb2wgdHJ5U3VidHlwZU1hdGNoKERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSkgewogICAgaW50IG9sZFByb3RvQ29uc3RyYWludHNMZW5ndGggPSBfcHJvdG9Db25zdHJhaW50cy5sZW5ndGg7CiAgICBib29sIGlzTWF0Y2ggPSBfaXNTdWJ0eXBlTWF0Y2goc3VidHlwZSwgc3VwZXJ0eXBlKTsKICAgIGlmICghaXNNYXRjaCkgewogICAgICBfcHJvdG9Db25zdHJhaW50cy5sZW5ndGggPSBvbGRQcm90b0NvbnN0cmFpbnRzTGVuZ3RoOwogICAgfQogICAgcmV0dXJuIGlzTWF0Y2g7CiAgfQoKICB2b2lkIF9jb25zdHJhaW5Mb3dlcihUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgRGFydFR5cGUgbG93ZXIpIHsKICAgIF9wcm90b0NvbnN0cmFpbnRzLmFkZChuZXcgX1Byb3RvQ29uc3RyYWludC5sb3dlcihwYXJhbWV0ZXIsIGxvd2VyKSk7CiAgfQoKICB2b2lkIF9jb25zdHJhaW5VcHBlcihUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgRGFydFR5cGUgdXBwZXIpIHsKICAgIF9wcm90b0NvbnN0cmFpbnRzLmFkZChuZXcgX1Byb3RvQ29uc3RyYWludC51cHBlcihwYXJhbWV0ZXIsIHVwcGVyKSk7CiAgfQoKICBib29sIF9pc0Z1bmN0aW9uU3VidHlwZU1hdGNoKEZ1bmN0aW9uVHlwZSBzdWJ0eXBlLCBGdW5jdGlvblR5cGUgc3VwZXJ0eXBlKSB7CiAgICAvLyBBIGZ1bmN0aW9uIHR5cGUgYChNMCwuLi4sIE1uLCBbTXtuKzF9LCAuLi4sIE1tXSkgLT4gUjBgIGlzIGEgc3VidHlwZQogICAgLy8gbWF0Y2ggZm9yIGEgZnVuY3Rpb24gdHlwZSBgKE4wLC4uLiwgTmssIFtOe2srMX0sIC4uLiwgTnJdKSAtPiBSMWAgd2l0aAogICAgLy8gcmVzcGVjdCB0byBgTGAgdW5kZXIgY29uc3RyYWludHMgYEMwICsgLi4uICsgQ3IgKyBDYAogICAgLy8gLSBJZiBgUjBgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYSB0eXBlIGBSMWAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlcgogICAgLy8gICBjb25zdHJhaW50cyBgQ2A6CiAgICAvLyAtIElmIGBuIDw9IGtgIGFuZCBgciA8PSBtYC4KICAgIC8vIC0gQW5kIGZvciBgaWAgaW4gYDAuLi5yYCwgYE5pYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBNaWAgd2l0aCByZXNwZWN0CiAgICAvLyAgIHRvIGBMYCB1bmRlciBjb25zdHJhaW50cyBgQ2lgLgogICAgLy8gRnVuY3Rpb24gdHlwZXMgd2l0aCBuYW1lZCBwYXJhbWV0ZXJzIGFyZSB0cmVhdGVkIGFuYWxvZ291c2x5IHRvIHRoZQogICAgLy8gcG9zaXRpb25hbCBwYXJhbWV0ZXIgY2FzZSBhYm92ZS4KICAgIC8vIEEgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlIGA8VDAgZXh0ZW5kcyBCMCwgLi4uLCBUbiBleHRlbmRzIEJuPkYwYCBpcyBhCiAgICAvLyBzdWJ0eXBlIG1hdGNoIGZvciBhIGdlbmVyaWMgZnVuY3Rpb24gdHlwZSBgPFMwIGV4dGVuZHMgQjAsIC4uLiwgU24KICAgIC8vIGV4dGVuZHMgQm4+RjFgIHdpdGggcmVzcGVjdCB0byBgTGAgdW5kZXIgY29uc3RyYWludHMgYENsYDoKICAgIC8vIC0gSWYgYEYwW1owL1QwLCAuLi4sIFpuL1RuXWAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBgRjBbWjAvUzAsIC4uLiwKICAgIC8vICAgWm4vU25dYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyIGNvbnN0cmFpbnRzIGBDYCwgd2hlcmUgZWFjaCBgWmlgIGlzIGEKICAgIC8vICAgZnJlc2ggdHlwZSB2YXJpYWJsZSB3aXRoIGJvdW5kIGBCaWAuCiAgICAvLyAtIEFuZCBgQ2xgIGlzIGBDYCB3aXRoIGVhY2ggY29uc3RyYWludCByZXBsYWNlZCB3aXRoIGl0cyBjbG9zdXJlIHdpdGgKICAgIC8vICAgcmVzcGVjdCB0byBgW1owLCAuLi4sIFpuXWAuCiAgICBpZiAoc3VidHlwZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50ID4gc3VwZXJ0eXBlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHN1YnR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoIDwKICAgICAgICBzdXBlcnR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChzdWJ0eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAhPSBzdXBlcnR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChzdWJ0eXBlLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgdmFyIHN1YnR5cGVTdWJzdGl0dXRpb24gPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgIHZhciBzdXBlcnR5cGVTdWJzdGl0dXRpb24gPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgIHZhciBmcmVzaFR5cGVWYXJpYWJsZXMgPSA8VHlwZVBhcmFtZXRlcj5bXTsKICAgICAgaWYgKCFfbWF0Y2hUeXBlRm9ybWFscyhzdWJ0eXBlLnR5cGVQYXJhbWV0ZXJzLCBzdXBlcnR5cGUudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBzdWJ0eXBlU3Vic3RpdHV0aW9uLCBzdXBlcnR5cGVTdWJzdGl0dXRpb24sIGZyZXNoVHlwZVZhcmlhYmxlcykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIHN1YnR5cGUgPSBzdWJzdGl0dXRlVHlwZVBhcmFtcygKICAgICAgICAgIHN1YnR5cGUsIHN1YnR5cGVTdWJzdGl0dXRpb24sIGZyZXNoVHlwZVZhcmlhYmxlcyk7CiAgICAgIHN1cGVydHlwZSA9IHN1YnN0aXR1dGVUeXBlUGFyYW1zKAogICAgICAgICAgc3VwZXJ0eXBlLCBzdXBlcnR5cGVTdWJzdGl0dXRpb24sIGZyZXNoVHlwZVZhcmlhYmxlcyk7CiAgICB9CgogICAgLy8gVGVzdCB0aGUgcmV0dXJuIHR5cGVzLgogICAgaWYgKHN1cGVydHlwZS5yZXR1cm5UeXBlIGlzISBWb2lkVHlwZSAmJgogICAgICAgICFfaXNTdWJ0eXBlTWF0Y2goc3VidHlwZS5yZXR1cm5UeXBlLCBzdXBlcnR5cGUucmV0dXJuVHlwZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIFRlc3QgdGhlIHBhcmFtZXRlciB0eXBlcy4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJ0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBzdXBlcnR5cGVQYXJhbWV0ZXIgPSBzdXBlcnR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgIHZhciBzdWJ0eXBlUGFyYW1ldGVyID0gc3VidHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgLy8gVGVybWluYXRpb246IEJvdGggdHlwZXMgc2hyaW5rIGluIHNpemUuCiAgICAgIGlmICghX2lzU3VidHlwZU1hdGNoKHN1cGVydHlwZVBhcmFtZXRlciwgc3VidHlwZVBhcmFtZXRlcikpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGludCBzdWJ0eXBlTmFtZUluZGV4ID0gMDsKICAgIGZvciAoTmFtZWRUeXBlIHN1cGVydHlwZVBhcmFtZXRlciBpbiBzdXBlcnR5cGUubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIHdoaWxlIChzdWJ0eXBlTmFtZUluZGV4IDwgc3VidHlwZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoICYmCiAgICAgICAgICBzdWJ0eXBlLm5hbWVkUGFyYW1ldGVyc1tzdWJ0eXBlTmFtZUluZGV4XS5uYW1lICE9CiAgICAgICAgICAgICAgc3VwZXJ0eXBlUGFyYW1ldGVyLm5hbWUpIHsKICAgICAgICArK3N1YnR5cGVOYW1lSW5kZXg7CiAgICAgIH0KICAgICAgaWYgKHN1YnR5cGVOYW1lSW5kZXggPT0gc3VidHlwZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICAgIE5hbWVkVHlwZSBzdWJ0eXBlUGFyYW1ldGVyID0gc3VidHlwZS5uYW1lZFBhcmFtZXRlcnNbc3VidHlwZU5hbWVJbmRleF07CiAgICAgIC8vIFRlcm1pbmF0aW9uOiBCb3RoIHR5cGVzIHNocmluayBpbiBzaXplLgogICAgICBpZiAoIV9pc1N1YnR5cGVNYXRjaChzdXBlcnR5cGVQYXJhbWV0ZXIudHlwZSwgc3VidHlwZVBhcmFtZXRlci50eXBlKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIF9pc0ludGVyZmFjZVN1YnR5cGVNYXRjaCgKICAgICAgSW50ZXJmYWNlVHlwZSBzdWJ0eXBlLCBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSkgewogICAgLy8gQSB0eXBlIGBQPE0wLCAuLi4sIE1rPmAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBgUDxOMCwgLi4uLCBOaz5gIHdpdGgKICAgIC8vIHJlc3BlY3QgdG8gYExgIHVuZGVyIGNvbnN0cmFpbnRzIGBDMCArIC4uLiArIENrYDoKICAgIC8vIC0gSWYgYE1pYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBOaWAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlcgogICAgLy8gICBjb25zdHJhaW50cyBgQ2lgLgogICAgLy8gQSB0eXBlIGBQPE0wLCAuLi4sIE1rPmAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBgUTxOMCwgLi4uLCBOaj5gIHdpdGgKICAgIC8vIHJlc3BlY3QgdG8gYExgIHVuZGVyIGNvbnN0cmFpbnRzIGBDYDoKICAgIC8vIC0gSWYgYFI8QjAsIC4uLiwgQmo+YCBpcyB0aGUgc3VwZXJjbGFzcyBvZiBgUDxNMCwgLi4uLCBNaz5gIGFuZCBgUjxCMCwKICAgIC8vICAgLi4uLCBCaj5gIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYFE8TjAsIC4uLiwgTmo+YCB3aXRoIHJlc3BlY3QgdG8gYExgCiAgICAvLyAgIHVuZGVyIGNvbnN0cmFpbnRzIGBDYC4KICAgIC8vIC0gT3IgYFI8QjAsIC4uLiwgQmo+YCBpcyBvbmUgb2YgdGhlIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgYFA8TTAsIC4uLiwKICAgIC8vICAgTWs+YCAoY29uc2lkZXJlZCBpbiBsZXhpY2FsIG9yZGVyKSBhbmQgYFI8QjAsIC4uLiwgQmo+YCBpcyBhIHN1YnR5cGUKICAgIC8vICAgbWF0Y2ggZm9yIGBRPE4wLCAuLi4sIE5qPmAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlciBjb25zdHJhaW50cyBgQ2AuCiAgICAvLyAtIE9yIGBSPEIwLCAuLi4sIEJqPmAgaXMgYSBtaXhpbiBpbnRvIGBQPE0wLCAuLi4sIE1rPmAgKGNvbnNpZGVyZWQgaW4KICAgIC8vICAgbGV4aWNhbCBvcmRlcikgYW5kIGBSPEIwLCAuLi4sIEJqPmAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBgUTxOMCwgLi4uLAogICAgLy8gICBOaj5gIHdpdGggcmVzcGVjdCB0byBgTGAgdW5kZXIgY29uc3RyYWludHMgYENgLgoKICAgIC8vIE5vdGUgdGhhdCBzaW5jZSBrZXJuZWwgcmVxdWlyZXMgdGhhdCBubyBjbGFzcyBtYXkgb25seSBhcHBlYXIgaW4gdGhlIHNldAogICAgLy8gb2Ygc3VwZXJ0eXBlcyBvZiBhIGdpdmVuIHR5cGUgbW9yZSB0aGFuIG9uY2UsIHRoZSBvcmRlciBvZiB0aGUgY2hlY2tzCiAgICAvLyBhYm92ZSBpcyBpcnJlbGV2YW50OyB3ZSBqdXN0IG5lZWQgdG8gZmluZCB0aGUgbWF0Y2hlZCBzdXBlcmNsYXNzLAogICAgLy8gc3Vic3RpdHV0ZSwgYW5kIHRoZW4gaXRlcmF0ZSB0aHJvdWdoIHR5cGUgdmFyaWFibGVzLgogICAgdmFyIG1hdGNoaW5nU3VwZXJ0eXBlT2ZTdWJ0eXBlID0KICAgICAgICBnZXRUeXBlQXNJbnN0YW5jZU9mKHN1YnR5cGUsIHN1cGVydHlwZS5jbGFzc05vZGUpOwogICAgaWYgKG1hdGNoaW5nU3VwZXJ0eXBlT2ZTdWJ0eXBlID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJ0eXBlLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIV9pc1N1YnR5cGVNYXRjaChtYXRjaGluZ1N1cGVydHlwZU9mU3VidHlwZS50eXBlQXJndW1lbnRzW2ldLAogICAgICAgICAgc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHNbaV0pKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgX2lzTnVsbChEYXJ0VHlwZSB0eXBlKSB7CiAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IHdvdWxkIGl0IGJlIGJldHRlciB0byBjYWxsIHRoaXMgIl9pc0JvdHRvbSIsIGFuZCB0byBoYXZlCiAgICAvLyBpdCByZXR1cm4gYHRydWVgIGZvciBib3RoIE51bGwgYW5kIGJvdHRvbSB0eXBlcz8gIFJldmlzaXQgdGhpcyBvbmNlCiAgICAvLyBlbm91Z2ggZnVuY3Rpb25hbGl0eSBpcyBpbXBsZW1lbnRlZCB0aGF0IHdlIGNhbiBjb21wYXJlIHRoZSBiZWhhdmlvciB3aXRoCiAgICAvLyB0aGUgb2xkIGFuYWx5emVyLWJhc2VkIGltcGxlbWVudGF0aW9uLgogICAgcmV0dXJuIHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiBpZGVudGljYWwodHlwZS5jbGFzc05vZGUsIG51bGxDbGFzcyk7CiAgfQoKICAvLy8gQXR0ZW1wdHMgdG8gbWF0Y2ggW3N1YnR5cGVdIGFzIGEgc3VidHlwZSBvZiBbc3VwZXJ0eXBlXSwgZ2F0aGVyaW5nIGFueQogIC8vLyBjb25zdHJhaW50cyBkaXNjb3ZlcmVkIGluIHRoZSBwcm9jZXNzLgogIC8vLwogIC8vLyBJZiBhIHNldCBvZiBjb25zdHJhaW50cyB3YXMgZm91bmQsIGB0cnVlYCBpcyByZXR1cm5lZCBhbmQgdGhlIGNhbGxlcgogIC8vLyBtYXkgcHJvY2VlZCB0byBjYWxsIFtjb21wdXRlQ29uc3RyYWludHNdLiAgT3RoZXJ3aXNlLCBgZmFsc2VgIGlzIHJldHVybmVkLgogIC8vLwogIC8vLyBJbiB0aGUgY2FzZSB3aGVyZSBgZmFsc2VgIGlzIHJldHVybmVkLCBzb21lIGJvZ3VzIGNvbnN0cmFpbnRzIG1heSBoYXZlCiAgLy8vIGJlZW4gYWRkZWQgdG8gW19wcm90b0NvbnN0cmFpbnRzXS4gIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0bwogIC8vLyBkaXNjYXJkIHRoZW0gaWYgbmVjZXNzYXJ5LgogIGJvb2wgX2lzU3VidHlwZU1hdGNoKERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSkgewogICAgLy8gVGhlIHVua25vd24gdHlwZSBgP2AgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBhbnkgdHlwZSBgUWAgd2l0aCBubwogICAgLy8gY29uc3RyYWludHMuCiAgICBpZiAoc3VidHlwZSBpcyBVbmtub3duVHlwZSkgcmV0dXJuIHRydWU7CiAgICAvLyBBbnkgdHlwZSBgUGAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciB0aGUgdW5rbm93biB0eXBlIGA/YCB3aXRoIG5vCiAgICAvLyBjb25zdHJhaW50cy4KICAgIGlmIChzdXBlcnR5cGUgaXMgVW5rbm93blR5cGUpIHJldHVybiB0cnVlOwogICAgLy8gQSB0eXBlIHZhcmlhYmxlIGBUYCBpbiBgTGAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBhbnkgdHlwZSBzY2hlbWEgYFFgOgogICAgLy8gLSBVbmRlciBjb25zdHJhaW50IGBUIDw6IFFgLgogICAgaWYgKHN1YnR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICBfcGFyYW1ldGVyc1RvQ29uc3RyYWluLmNvbnRhaW5zKHN1YnR5cGUucGFyYW1ldGVyKSkgewogICAgICBfY29uc3RyYWluVXBwZXIoc3VidHlwZS5wYXJhbWV0ZXIsIHN1cGVydHlwZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLy8gQSB0eXBlIHNjaGVtYSBgUWAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBhIHR5cGUgdmFyaWFibGUgYFRgIGluIGBMYDoKICAgIC8vIC0gVW5kZXIgY29uc3RyYWludCBgUSA8OiBUYC4KICAgIGlmIChzdXBlcnR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICBfcGFyYW1ldGVyc1RvQ29uc3RyYWluLmNvbnRhaW5zKHN1cGVydHlwZS5wYXJhbWV0ZXIpKSB7CiAgICAgIF9jb25zdHJhaW5Mb3dlcihzdXBlcnR5cGUucGFyYW1ldGVyLCBzdWJ0eXBlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvLyBBbnkgdHdvIGVxdWFsIHR5cGVzIGBQYCBhbmQgYFFgIGFyZSBzdWJ0eXBlIG1hdGNoZXMgdW5kZXIgbm8gY29uc3RyYWludHMuCiAgICAvLyBOb3RlOiB0byBhdm9pZCBtYWtpbmcgdGhlIGFsZ29yaXRobSBxdWFkcmF0aWMsIHdlIGp1c3QgY2hlY2sgZm9yCiAgICAvLyBpZGVudGljYWwoKS4gIElmIFAgYW5kIFEgYXJlIGVxdWFsIGJ1dCBub3QgaWRlbnRpY2FsLCByZWN1cnNpbmcgdGhyb3VnaAogICAgLy8gdGhlIHR5cGVzIHdpbGwgZ2l2ZSB0aGUgcHJvcGVyIHJlc3VsdC4KICAgIGlmIChpZGVudGljYWwoc3VidHlwZSwgc3VwZXJ0eXBlKSkgcmV0dXJuIHRydWU7CiAgICAvLyBBbnkgdHlwZSBgUGAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBgZHluYW1pY2AsIGBPYmplY3RgLCBvciBgdm9pZGAgdW5kZXIKICAgIC8vIG5vIGNvbnN0cmFpbnRzLgogICAgaWYgKF9pc1RvcChzdXBlcnR5cGUpKSByZXR1cm4gdHJ1ZTsKICAgIC8vIGBOdWxsYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGFueSB0eXBlIGBRYCB1bmRlciBubyBjb25zdHJhaW50cy4KICAgIC8vIE5vdGUgdGhhdCBudWxsYWJsZSB0eXBlcyB3aWxsIGNoYW5nZSB0aGlzLgogICAgaWYgKF9pc051bGwoc3VidHlwZSkpIHJldHVybiB0cnVlOwoKICAgIC8vIEhhbmRsZSBGdXR1cmVPcjxUPiB1bmlvbiB0eXBlLgogICAgaWYgKHN1YnR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIGlkZW50aWNhbChzdWJ0eXBlLmNsYXNzTm9kZSwgZnV0dXJlT3JDbGFzcykpIHsKICAgICAgdmFyIHN1YnR5cGVBcmcgPSBzdWJ0eXBlLnR5cGVBcmd1bWVudHNbMF07CiAgICAgIGlmIChzdXBlcnR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgICAgaWRlbnRpY2FsKHN1cGVydHlwZS5jbGFzc05vZGUsIGZ1dHVyZU9yQ2xhc3MpKSB7CiAgICAgICAgLy8gYEZ1dHVyZU9yPFA+YCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBGdXR1cmVPcjxRPmAgd2l0aCByZXNwZWN0IHRvCiAgICAgICAgLy8gYExgIHVuZGVyIGNvbnN0cmFpbnRzIGBDYDoKICAgICAgICAvLyAtIElmIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAgICAgLy8gICBjb25zdHJhaW50cyBgQ2AuCiAgICAgICAgdmFyIHN1cGVydHlwZUFyZyA9IHN1cGVydHlwZS50eXBlQXJndW1lbnRzWzBdOwogICAgICAgIHJldHVybiBfaXNTdWJ0eXBlTWF0Y2goc3VidHlwZUFyZywgc3VwZXJ0eXBlQXJnKTsKICAgICAgfQoKICAgICAgLy8gYEZ1dHVyZU9yPFA+YCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAgIC8vIGNvbnN0cmFpbnRzIGBDMCArIEMxYDoKICAgICAgLy8gLSBJZiBgRnV0dXJlPFA+YCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAgIC8vICAgY29uc3RyYWludHMgYEMwYC4KICAgICAgLy8gLSBBbmQgYFBgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYFFgIHdpdGggcmVzcGVjdCB0byBgTGAgdW5kZXIKICAgICAgLy8gICBjb25zdHJhaW50cyBgQzFgLgogICAgICB2YXIgc3VidHlwZUZ1dHVyZSA9IGZ1dHVyZVR5cGUoc3VidHlwZUFyZyk7CiAgICAgIHJldHVybiBfaXNTdWJ0eXBlTWF0Y2goc3VidHlwZUZ1dHVyZSwgc3VwZXJ0eXBlKSAmJgogICAgICAgICAgX2lzU3VidHlwZU1hdGNoKHN1YnR5cGVBcmcsIHN1cGVydHlwZSk7CiAgICB9CgogICAgaWYgKHN1cGVydHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgaWRlbnRpY2FsKHN1cGVydHlwZS5jbGFzc05vZGUsIGZ1dHVyZU9yQ2xhc3MpKSB7CiAgICAgIC8vIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBGdXR1cmVPcjxRPmAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlcgogICAgICAvLyBjb25zdHJhaW50cyBgQ2A6CiAgICAgIC8vIC0gSWYgYFBgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYEZ1dHVyZTxRPmAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlcgogICAgICAvLyAgIGNvbnN0cmFpbnRzIGBDYC4KICAgICAgLy8gLSBPciBgUGAgaXMgbm90IGEgc3VidHlwZSBtYXRjaCBmb3IgYEZ1dHVyZTxRPmAgd2l0aCByZXNwZWN0IHRvIGBMYAogICAgICAvLyAgIHVuZGVyIGNvbnN0cmFpbnRzIGBDYAogICAgICAvLyAgIC0gQW5kIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAgIC8vICAgICBjb25zdHJhaW50cyBgQ2AKICAgICAgdmFyIHN1cGVydHlwZUFyZyA9IHN1cGVydHlwZS50eXBlQXJndW1lbnRzWzBdOwogICAgICB2YXIgc3VwZXJ0eXBlRnV0dXJlID0gZnV0dXJlVHlwZShzdXBlcnR5cGVBcmcpOwogICAgICByZXR1cm4gdHJ5U3VidHlwZU1hdGNoKHN1YnR5cGUsIHN1cGVydHlwZUZ1dHVyZSkgfHwKICAgICAgICAgIF9pc1N1YnR5cGVNYXRjaChzdWJ0eXBlLCBzdXBlcnR5cGVBcmcpOwogICAgfQoKICAgIC8vIEEgdHlwZSB2YXJpYWJsZSBgVGAgbm90IGluIGBMYCB3aXRoIGJvdW5kIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIHRoZQogICAgLy8gc2FtZSB0eXBlIHZhcmlhYmxlIGBUYCB3aXRoIGJvdW5kIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAvLyBjb25zdHJhaW50cyBgQ2A6CiAgICAvLyAtIElmIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyIGNvbnN0cmFpbnRzCiAgICAvLyAgIGBDYC4KICAgIGlmIChzdWJ0eXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgIGlmIChzdXBlcnR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICAgIGlkZW50aWNhbChzdWJ0eXBlLnBhcmFtZXRlciwgc3VwZXJ0eXBlLnBhcmFtZXRlcikpIHsKICAgICAgICAvLyBLZXJuZWwgZG9lc24ndCB5ZXQgYWxsb3cgYSB0eXBlIHZhcmlhYmxlIHRvIGhhdmUgZGlmZmVyZW50IGJvdW5kcwogICAgICAgIC8vIHVuZGVyIGRpZmZlcmVudCBjaXJjdW1zdGFuY2VzIChzZWUgZGFydGJ1Zy5jb20vMjk1MjkpIHNvIGZvciBub3cgaWYKICAgICAgICAvLyB3ZSBnZXQgaGVyZSwgdGhlIGJvdW5kcyBtdXN0IGJlIHRoZSBzYW1lLgogICAgICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogdXBkYXRlIHRoaXMgY29kZSBvbmNlIGRhcnRidWcuY29tLzI5NTI5IGlzCiAgICAgICAgLy8gYWRkcmVzc2VkLgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIC8vIEEgdHlwZSB2YXJpYWJsZSBgVGAgbm90IGluIGBMYCB3aXRoIGJvdW5kIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGEKICAgICAgLy8gdHlwZSBgUWAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlciBjb25zdHJhaW50cyBgQ2A6CiAgICAgIC8vIC0gSWYgYFBgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYFFgIHdpdGggcmVzcGVjdCB0byBgTGAgdW5kZXIKICAgICAgLy8gICBjb25zdHJhaW50cyBgQ2AuCiAgICAgIHJldHVybiBfaXNTdWJ0eXBlTWF0Y2goc3VidHlwZS5wYXJhbWV0ZXIuYm91bmQsIHN1cGVydHlwZSk7CiAgICB9CiAgICBpZiAoc3VidHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmIHN1cGVydHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIHJldHVybiBfaXNJbnRlcmZhY2VTdWJ0eXBlTWF0Y2goc3VidHlwZSwgc3VwZXJ0eXBlKTsKICAgIH0KICAgIGlmIChzdWJ0eXBlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICBpZiAoc3VwZXJ0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICByZXR1cm4gaWRlbnRpY2FsKHN1cGVydHlwZS5jbGFzc05vZGUsIGZ1bmN0aW9uQ2xhc3MpIHx8CiAgICAgICAgICAgIGlkZW50aWNhbChzdXBlcnR5cGUuY2xhc3NOb2RlLCBvYmplY3RDbGFzcyk7CiAgICAgIH0gZWxzZSBpZiAoc3VwZXJ0eXBlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICAgIHJldHVybiBfaXNGdW5jdGlvblN1YnR5cGVNYXRjaChzdWJ0eXBlLCBzdXBlcnR5cGUpOwogICAgICB9CiAgICB9CiAgICAvLyBBIHR5cGUgYFBgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYSB0eXBlIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAvLyBjb25zdHJhaW50cyBgQ2A6CiAgICAvLyAtIElmIGBQYCBpcyBhbiBpbnRlcmZhY2UgdHlwZSB3aGljaCBpbXBsZW1lbnRzIGEgY2FsbCBtZXRob2Qgb2YgdHlwZSBgRmAsCiAgICAvLyAgIGFuZCBgRmAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBhIHR5cGUgYFFgIHdpdGggcmVzcGVjdCB0byBgTGAgdW5kZXIKICAgIC8vICAgY29uc3RyYWludHMgYENgLgogICAgaWYgKHN1YnR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICB2YXIgY2FsbE1lbWJlciA9IGdldEludGVyZmFjZU1lbWJlcihzdWJ0eXBlLmNsYXNzTm9kZSwgY2FsbE5hbWUpOwogICAgICBpZiAoY2FsbE1lbWJlciBpcyBQcm9jZWR1cmUgJiYgIWNhbGxNZW1iZXIuaXNHZXR0ZXIpIHsKICAgICAgICB2YXIgY2FsbFR5cGUgPSBjYWxsTWVtYmVyLmdldHRlclR5cGU7CiAgICAgICAgaWYgKGNhbGxUeXBlICE9IG51bGwpIHsKICAgICAgICAgIGNhbGxUeXBlID0KICAgICAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUoc3VidHlwZSkuc3Vic3RpdHV0ZVR5cGUoY2FsbFR5cGUpOwogICAgICAgICAgLy8gVE9ETyhrbWlsbGlraW4pOiBUaGUgc3VidHlwZSBjaGVjayB3aWxsIGZhaWwgaWYgdGhlIHR5cGUgb2YgYQogICAgICAgICAgLy8gZ2VuZXJpYyBjYWxsIG1ldGhvZCBpcyBhIHN1YnR5cGUgb2YgYSBub24tZ2VuZXJpYyBmdW5jdGlvbiB0eXBlLgogICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGlmIGBUIGNhbGw8VD4oVCBhcmcpYCBpcyBhIHN1YnR5cGUgb2YgYFMtPlNgIGZvciBzb21lCiAgICAgICAgICAvLyBTLiAgSG93ZXZlciwgZXhwbGljaXRseSB0ZWFyaW5nIG9mZiB0aGF0IGNhbGwgbWV0aG9kIHdpbGwgd29yayBhbmQKICAgICAgICAgIC8vIGluc2VydCBhbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uLCBzbyB0aGUgaW1wbGljaXQgdGVhciBvZmYgc2hvdWxkCiAgICAgICAgICAvLyB3b3JrIGFzIHdlbGwuICBGaWd1cmUgb3V0IGhvdyB0byBzdXBwb3J0IHRoaXMgY2FzZS4KICAgICAgICAgIHJldHVybiBfaXNTdWJ0eXBlTWF0Y2goY2FsbFR5cGUsIHN1cGVydHlwZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIF9pc1RvcChEYXJ0VHlwZSB0eXBlKSA9PgogICAgICB0eXBlIGlzIER5bmFtaWNUeXBlIHx8CiAgICAgIHR5cGUgaXMgVm9pZFR5cGUgfHwKICAgICAgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiBpZGVudGljYWwodHlwZS5jbGFzc05vZGUsIG9iamVjdENsYXNzKSk7CgogIC8vLyBHaXZlbiB0d28gbGlzdHMgb2YgZnVuY3Rpb24gdHlwZSBmb3JtYWwgcGFyYW1ldGVycywgY2hlY2tzIHRoYXQgdGhlaXIKICAvLy8gYm91bmRzIGFyZSBjb21wYXRpYmxlLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIGEgbWF0Y2ggd2FzIGZvdW5kLiAgSWYgaXQgd2FzLCBlbnRyaWVzCiAgLy8vIGFyZSBhZGRlZCB0byBbc3Vic3RpdHV0aW9uMV0gYW5kIFtzdWJzdGl0dXRpb24yXSB3aGljaCBzdWJzdGl0dXRlIGEgZnJlc2gKICAvLy8gc2V0IG9mIHR5cGUgdmFyaWFibGVzIGZvciB0aGUgdHlwZSBwYXJhbWV0ZXJzIFtwYXJhbXMxXSBhbmQgW3BhcmFtczJdLAogIC8vLyByZXNwZWN0aXZlbHksIGFsbG93aW5nIGZ1cnRoZXIgY29tcGFyaXNvbi4KICBib29sIF9tYXRjaFR5cGVGb3JtYWxzKAogICAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHBhcmFtczEsCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gcGFyYW1zMiwKICAgICAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBzdWJzdGl0dXRpb24xLAogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbjIsCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gZnJlc2hUeXBlVmFyaWFibGVzKSB7CiAgICBhc3NlcnQocGFyYW1zMS5sZW5ndGggPT0gcGFyYW1zMi5sZW5ndGgpOwogICAgLy8gVE9ETyhwYXVsYmVycnkpOiBpbiBpbWl0YXRpb24gb2YgYW5hbHl6ZXIsIHdlJ3JlIGNoZWNraW5nIHRoZSBib3VuZHMgYXMKICAgIC8vIHdlIGJ1aWxkIHVwIHRoZSBzdWJzdGl0dXRpb25zLiAgQnV0IEkgZG9uJ3QgdGhpbmsgdGhhdCdzIGNvcnJlY3QtLUkgdGhpbmsKICAgIC8vIHdlIHNob3VsZCBidWlsZCB1cCBib3RoIHN1YnN0aXR1dGlvbnMgY29tcGxldGVseSBiZWZvcmUgY2hlY2tpbmcgYW55CiAgICAvLyBib3VuZHMuICBTZWUgZGFydGJ1Zy5jb20vMjk2MjkuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtczEubGVuZ3RoOyArK2kpIHsKICAgICAgVHlwZVBhcmFtZXRlciBwRnJlc2ggPSBuZXcgVHlwZVBhcmFtZXRlcihwYXJhbXMyW2ldLm5hbWUpOwogICAgICBmcmVzaFR5cGVWYXJpYWJsZXMuYWRkKHBGcmVzaCk7CiAgICAgIERhcnRUeXBlIHZhcmlhYmxlRnJlc2ggPSBuZXcgVHlwZVBhcmFtZXRlclR5cGUocEZyZXNoKTsKICAgICAgc3Vic3RpdHV0aW9uMVtwYXJhbXMxW2ldXSA9IHZhcmlhYmxlRnJlc2g7CiAgICAgIHN1YnN0aXR1dGlvbjJbcGFyYW1zMltpXV0gPSB2YXJpYWJsZUZyZXNoOwogICAgICBEYXJ0VHlwZSBib3VuZDEgPSBzdWJzdGl0dXRlKHBhcmFtczFbaV0uYm91bmQsIHN1YnN0aXR1dGlvbjEpOwogICAgICBEYXJ0VHlwZSBib3VuZDIgPSBzdWJzdGl0dXRlKHBhcmFtczJbaV0uYm91bmQsIHN1YnN0aXR1dGlvbjIpOwogICAgICBwRnJlc2guYm91bmQgPSBib3VuZDI7CiAgICAgIGlmICghX2lzU3VidHlwZU1hdGNoKGJvdW5kMiwgYm91bmQxKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQp9CgpjbGFzcyBUeXBlU2NoZW1hQ29uc3RyYWludEdhdGhlcmVyIGV4dGVuZHMgVHlwZUNvbnN0cmFpbnRHYXRoZXJlciB7CiAgZmluYWwgVHlwZVNjaGVtYUVudmlyb25tZW50IGVudmlyb25tZW50OwoKICBUeXBlU2NoZW1hQ29uc3RyYWludEdhdGhlcmVyKAogICAgICB0aGlzLmVudmlyb25tZW50LCBJdGVyYWJsZTxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykKICAgICAgOiBzdXBlci5zdWJjbGFzc2luZyh0eXBlUGFyYW1ldGVycyk7CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBvYmplY3RDbGFzcyA9PiBlbnZpcm9ubWVudC5jb3JlVHlwZXMub2JqZWN0Q2xhc3M7CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBmdW5jdGlvbkNsYXNzID0+IGVudmlyb25tZW50LmNvcmVUeXBlcy5mdW5jdGlvbkNsYXNzOwoKICBAb3ZlcnJpZGUKICBDbGFzcyBnZXQgZnV0dXJlT3JDbGFzcyA9PiBlbnZpcm9ubWVudC5jb3JlVHlwZXMuZnV0dXJlT3JDbGFzczsKCiAgQG92ZXJyaWRlCiAgQ2xhc3MgZ2V0IG51bGxDbGFzcyA9PiBlbnZpcm9ubWVudC5jb3JlVHlwZXMubnVsbENsYXNzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFVwcGVyQm91bmQoVHlwZUNvbnN0cmFpbnQgY29uc3RyYWludCwgRGFydFR5cGUgdXBwZXIpIHsKICAgIGVudmlyb25tZW50LmFkZFVwcGVyQm91bmQoY29uc3RyYWludCwgdXBwZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRMb3dlckJvdW5kKFR5cGVDb25zdHJhaW50IGNvbnN0cmFpbnQsIERhcnRUeXBlIGxvd2VyKSB7CiAgICBlbnZpcm9ubWVudC5hZGRMb3dlckJvdW5kKGNvbnN0cmFpbnQsIGxvd2VyKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlciBnZXRJbnRlcmZhY2VNZW1iZXIoQ2xhc3MgY2xhc3NfLCBOYW1lIG5hbWUsIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICByZXR1cm4gZW52aXJvbm1lbnQuaGllcmFyY2h5CiAgICAgICAgLmdldEludGVyZmFjZU1lbWJlcihjbGFzc18sIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0VHlwZUFzSW5zdGFuY2VPZihJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MpIHsKICAgIHJldHVybiBlbnZpcm9ubWVudC5nZXRUeXBlQXNJbnN0YW5jZU9mKHR5cGUsIHN1cGVyY2xhc3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBmdXR1cmVUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBlbnZpcm9ubWVudC5mdXR1cmVUeXBlKHR5cGUpOwogIH0KfQoKLy8vIFRyYWNrcyBhIHNpbmdsZSBjb25zdHJhaW50IG9uIGEgc2luZ2xlIHR5cGUgdmFyaWFibGUuCi8vLwovLy8gVGhpcyBpcyBjYWxsZWQgIl9Qcm90b0NvbnN0cmFpbnQiIHRvIGRpc3Rpbmd1aXNoIGZyb20gW1R5cGVDb25zdHJhaW50XSwKLy8vIHdoaWNoIHRyYWNrcyB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyB0aGF0IGFyZSB0b2dldGhlciBpbXBsaWVkIGJ5IGEgc2V0Ci8vLyBvZiBbX1Byb3RvQ29uc3RyYWludF1zLgpjbGFzcyBfUHJvdG9Db25zdHJhaW50IHsKICBmaW5hbCBUeXBlUGFyYW1ldGVyIHBhcmFtZXRlcjsKCiAgZmluYWwgRGFydFR5cGUgYm91bmQ7CgogIGZpbmFsIGJvb2wgaXNVcHBlcjsKCiAgX1Byb3RvQ29uc3RyYWludC5sb3dlcih0aGlzLnBhcmFtZXRlciwgdGhpcy5ib3VuZCkgOiBpc1VwcGVyID0gZmFsc2U7CgogIF9Qcm90b0NvbnN0cmFpbnQudXBwZXIodGhpcy5wYXJhbWV0ZXIsIHRoaXMuYm91bmQpIDogaXNVcHBlciA9IHRydWU7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiBpc1VwcGVyCiAgICAgICAgPyAiJHtwYXJhbWV0ZXIubmFtZX0gPDogJGJvdW5kIgogICAgICAgIDogIiRib3VuZCA8OiAke3BhcmFtZXRlci5uYW1lfSI7CiAgfQp9CoHXAE1OPwEhCQ8SFRYXEA4TExcbEgFJASwBJkYBJgEbAScBUEYoMgE0AUoyTToBRDBKBAEZARsBGwEXAUEBQQFMAUsBKwE9PDQ0MAY1JVEPUQgGEwQBNAZNTiA/PjgUPAYUBAFCSQQBQkkEAU9MTjxOGiNPKEsoTEpCS1EuTSVNFAYuMRQGTBQGLT0/Mk9NFggBJj0oQQYBHi1GFAYBIUZCPjFEFggGHkZCPCkcCExOMU4WCAYRBAEhOEw5RxtMLU5PIFFOT01QOQFQTUk8JTs6SkgpFggGEQQBIFFLUS5KBAFNLQZLUQZNTyE/SBQtSBQvTiQoPjUTBkwkKkA1EwZRSE8uNFAXKEgyJwEmJDcxKDtOJkkeNzoIAUwgTx1IHTI6MgYBJjlMGk8cTSFKHTU2OjIGAVBHGFEOKCw/TU81RxYVCFA9RxxCBkI7BiMoQDkuPAgGThhRTRokSD0uIBVQS05QUE9BNwoIBhIEASAdGkkBTB0GUFBNMRojIzIyMC5PUUwnL0EmPjExRUUdOgYRBAIBRCsBIEArAQw+AQxCAQxCAQw6AQxCMgQBDEIyBAEMTSE7BAEMTD4EAQwsKQQCAToETE8cGSEBGAEWAUgBRwEWEygpBAIBSHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2NvbnN0cmFpbnRfZ2F0aGVyZXIuZGFydCdzZGtyb290Oi9wa2cva2VybmVsL2xpYi91dGlsL2dyYXBoLmRhcnSKkC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZ3JhcGg7CgphYnN0cmFjdCBjbGFzcyBHcmFwaDxUPiB7CiAgSXRlcmFibGU8VD4gZ2V0IHZlcnRpY2VzOwoKICBJdGVyYWJsZTxUPiBuZWlnaGJvcnNPZihUIHZlcnRleCk7Cn0KCi8vLyBDb21wdXRlcyB0aGUgc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmVudHMgb2YgW2dyYXBoXS4KLy8vCi8vLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIFtEaWprc3RyYSdzIHBhdGgtYmFzZWQgc3Ryb25nIGNvbXBvbmVudAovLy8gYWxnb3JpdGhtXQovLy8gKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BhdGgtYmFzZWRfc3Ryb25nX2NvbXBvbmVudF9hbGdvcml0aG0jRGVzY3JpcHRpb24pLgpMaXN0PExpc3Q8VD4+IGNvbXB1dGVTdHJvbmdDb21wb25lbnRzPFQ+KEdyYXBoPFQ+IGdyYXBoKSB7CiAgTGlzdDxMaXN0PFQ+PiByZXN1bHQgPSA8TGlzdDxUPj5bXTsKICBpbnQgY291bnQgPSAwOwogIE1hcDxULCBpbnQ+IHByZW9yZGVyTnVtYmVycyA9IDxULCBpbnQ+e307CiAgTGlzdDxUPiB1bmFzc2lnbmVkID0gPFQ+W107CiAgTGlzdDxUPiBjYW5kaWRhdGVzID0gPFQ+W107CiAgU2V0PFQ+IGFzc2lnbmVkID0gbmV3IFNldDxUPigpOwoKICB2b2lkIHJlY3Vyc2l2ZWx5U2VhcmNoKFQgdmVydGV4KSB7CiAgICAvLyBTdGVwIDE6IFNldCB0aGUgcHJlb3JkZXIgbnVtYmVyIG9mIFt2ZXJ0ZXhdIHRvIFtjb3VudF0sIGFuZCBpbmNyZW1lbnQKICAgIC8vIFtjb3VudF0uCiAgICBwcmVvcmRlck51bWJlcnNbdmVydGV4XSA9IGNvdW50Kys7CgogICAgLy8gU3RlcCAyOiBQdXNoIFt2ZXJ0ZXhdIG9udG8gW3VuYXNzaWduZWRdIGFuZCBhbHNvIG9udG8gW2NhbmRpZGF0ZXNdLgogICAgdW5hc3NpZ25lZC5hZGQodmVydGV4KTsKICAgIGNhbmRpZGF0ZXMuYWRkKHZlcnRleCk7CgogICAgLy8gU3RlcCAzOiBGb3IgZWFjaCBlZGdlIGZyb20gW3ZlcnRleF0gdG8gYSBuZWlnaGJvcmluZyB2ZXJ0ZXggW25laWdoYm9yXToKICAgIGZvciAoVCBuZWlnaGJvciBpbiBncmFwaC5uZWlnaGJvcnNPZih2ZXJ0ZXgpKSB7CiAgICAgIGludCBuZWlnaGJvclByZW9yZGVyTnVtYmVyID0gcHJlb3JkZXJOdW1iZXJzW25laWdoYm9yXTsKICAgICAgaWYgKG5laWdoYm9yUHJlb3JkZXJOdW1iZXIgPT0gbnVsbCkgewogICAgICAgIC8vIElmIHRoZSBwcmVvcmRlciBudW1iZXIgb2YgW25laWdoYm9yXSBoYXMgbm90IHlldCBiZWVuIGFzc2lnbmVkLAogICAgICAgIC8vIHJlY3Vyc2l2ZWx5IHNlYXJjaCBbbmVpZ2hib3JdOwogICAgICAgIHJlY3Vyc2l2ZWx5U2VhcmNoKG5laWdoYm9yKTsKICAgICAgfSBlbHNlIGlmICghYXNzaWduZWQuY29udGFpbnMobmVpZ2hib3IpKSB7CiAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiBbbmVpZ2hib3JdIGhhcyBub3QgeWV0IGJlZW4gYXNzaWduZWQgdG8gYSBzdHJvbmdseQogICAgICAgIC8vIGNvbm5lY3RlZCBjb21wb25lbnQ6CiAgICAgICAgLy8KICAgICAgICAvLyAqIFJlcGVhdGVkbHkgcG9wIHZlcnRpY2VzIGZyb20gW2NhbmRpZGF0ZXNdIHVudGlsIHRoZSB0b3AgZWxlbWVudCBvZgogICAgICAgIC8vICAgW2NhbmRpZGF0ZXNdIGhhcyBhIHByZW9yZGVyIG51bWJlciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlCiAgICAgICAgLy8gICBwcmVvcmRlciBudW1iZXIgb2YgW25laWdoYm9yXS4KICAgICAgICB3aGlsZSAocHJlb3JkZXJOdW1iZXJzW2NhbmRpZGF0ZXMubGFzdF0gPiBuZWlnaGJvclByZW9yZGVyTnVtYmVyKSB7CiAgICAgICAgICBjYW5kaWRhdGVzLnJlbW92ZUxhc3QoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8vIFN0ZXAgNDogSWYgW3ZlcnRleF0gaXMgdGhlIHRvcCBlbGVtZW50IG9mIFtjYW5kaWRhdGVzXToKICAgIGlmIChjYW5kaWRhdGVzLmxhc3QgPT0gdmVydGV4KSB7CiAgICAgIC8vIFBvcCB2ZXJ0aWNlcyBmcm9tIFt1bmFzc2lnbmVkXSB1bnRpbCBbdmVydGV4XSBoYXMgYmVlbiBwb3BwZWQsIGFuZAogICAgICAvLyBhc3NpZ24gdGhlIHBvcHBlZCB2ZXJ0aWNlcyB0byBhIG5ldyBjb21wb25lbnQuCiAgICAgIExpc3Q8VD4gY29tcG9uZW50ID0gPFQ+W107CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgVCB0b3AgPSB1bmFzc2lnbmVkLnJlbW92ZUxhc3QoKTsKICAgICAgICBjb21wb25lbnQuYWRkKHRvcCk7CiAgICAgICAgYXNzaWduZWQuYWRkKHRvcCk7CiAgICAgICAgaWYgKHRvcCA9PSB2ZXJ0ZXgpIGJyZWFrOwogICAgICB9CiAgICAgIHJlc3VsdC5hZGQoY29tcG9uZW50KTsKCiAgICAgIC8vIFBvcCBbdmVydGV4XSBmcm9tIFtjYW5kaWRhdGVzXS4KICAgICAgY2FuZGlkYXRlcy5yZW1vdmVMYXN0KCk7CiAgICB9CiAgfQoKICBmb3IgKFQgdmVydGV4IGluIGdyYXBoLnZlcnRpY2VzKSB7CiAgICBpZiAocHJlb3JkZXJOdW1iZXJzW3ZlcnRleF0gPT0gbnVsbCkgewogICAgICByZWN1cnNpdmVseVNlYXJjaCh2ZXJ0ZXgpOwogICAgfQogIH0KCiAgcmV0dXJuIHJlc3VsdDsKfQpRAE1OPwEVARocASUCATsETA9XOyYRLB4eIgElTRAnAUscHAFPND4sSyolMUwgC1BKLEwjCggGPyVMOCEVKRwbIggdASkfBgQBJSshBgQBEQIBHnBhY2thZ2U6a2VybmVsL3V0aWwvZ3JhcGguZGFydD1zZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYmFzZS9yZXNvbHZlX3JlbGF0aXZlX3VyaS5kYXJ0g7wvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLyoqCiAqIFJlc29sdmUgdGhlIFtjb250YWluZWRVcmldIGFnYWluc3QgW2Jhc2VVcmldIHVzaW5nIERhcnQgcnVsZXMuCiAqCiAqIFRoaXMgZnVuY3Rpb24gYmVoYXZlcyBzaW1pbGFybHkgdG8gW1VyaS5yZXNvbHZlVXJpXSwgZXhjZXB0IHRoYXQgaXQgcHJvcGVybHkKICogaGFuZGxlcyBzaXR1YXRpb25zIGxpa2UgdGhlIGZvbGxvd2luZzoKICoKICogICAgIHJlc29sdmVSZWxhdGl2ZVVyaShkYXJ0OmNvcmUsIGJvb2wuZGFydCkgLT4gZGFydDpjb3JlL2Jvb2wuZGFydAogKiAgICAgcmVzb2x2ZVJlbGF0aXZlVXJpKHBhY2thZ2U6YS9iLmRhcnQsIC4uL2MuZGFydCkgLT4gcGFja2FnZTphL2MuZGFydAogKi8KVXJpIHJlc29sdmVSZWxhdGl2ZVVyaShVcmkgYmFzZVVyaSwgVXJpIGNvbnRhaW5lZFVyaSkgewogIGlmIChjb250YWluZWRVcmkuaXNBYnNvbHV0ZSkgewogICAgcmV0dXJuIGNvbnRhaW5lZFVyaTsKICB9CiAgU3RyaW5nIHNjaGVtZSA9IGJhc2VVcmkuc2NoZW1lOwogIC8vIGRhcnQ6Y29yZSA9PiBkYXJ0OmNvcmUvY29yZS5kYXJ0CiAgaWYgKHNjaGVtZSA9PSAnZGFydCcpIHsKICAgIFN0cmluZyBwYXJ0ID0gYmFzZVVyaS5wYXRoOwogICAgaWYgKHBhcnQuaW5kZXhPZignLycpIDwgMCkgewogICAgICBiYXNlVXJpID0gVXJpLnBhcnNlKCckc2NoZW1lOiRwYXJ0LyRwYXJ0LmRhcnQnKTsKICAgIH0KICB9CiAgcmV0dXJuIGJhc2VVcmkucmVzb2x2ZVVyaShjb250YWluZWRVcmkpOwp9Ch0ATk48AQRCA1AqA0dLBDghGQQiJhogITcGBCsCATRwYWNrYWdlOmZyb250X2VuZC9zcmMvYmFzZS9yZXNvbHZlX3JlbGF0aXZlX3VyaS5kYXJ0N3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9jb25maWd1cmF0aW9uLmRhcnSB0C8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmNvbmZpZ3VyYXRpb247CgpjbGFzcyBDb25maWd1cmF0aW9uIHsKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKICBmaW5hbCBTdHJpbmcgZG90dGVkTmFtZTsKICBmaW5hbCBTdHJpbmcgY29uZGl0aW9uOwogIGZpbmFsIFN0cmluZyBpbXBvcnRVcmk7CiAgQ29uZmlndXJhdGlvbigKICAgICAgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmRvdHRlZE5hbWUsIHRoaXMuY29uZGl0aW9uLCB0aGlzLmltcG9ydFVyaSk7Cn0KEABOTjwBHQEWGBsaGhFJAgEucGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2NvbmZpZ3VyYXRpb24uZGFydDBzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9oZWxwZXJzL3RyYWNlLmRhcnStmy8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCc7CgovLy8gRnVuY3Rpb24gc2lnbmF0dXJlIGZvciBbdHJhY2VdLgp0eXBlZGVmIHZvaWQgVHJhY2UoU3RyaW5nIG1lc3NhZ2UsCiAgICB7Ym9vbCBjb25kaXRpb24oU3RyaW5nIHN0YWNrVHJhY2UpLCBpbnQgbGltaXQsIGJvb2wgdGhyb3dPblByaW50fSk7CgovLy8gSGVscGVyIG1ldGhvZCBmb3IgcHJpbnRpbmcgc3RhY2sgdHJhY2VzIGZvciBkZWJ1Z2dpbmcuCi8vLwovLy8gW21lc3NhZ2VdIGlzIHByaW50ZWQgYXMgdGhlIGhlYWRlciBvZiB0aGUgc3RhY2sgdHJhY2UuCi8vLwovLy8gSWYgW2NvbmRpdGlvbl0gaXMgcHJvdmlkZWQsIHRoZSBzdGFjayB0cmFjZSBpcyBvbmx5IHByaW50ZWQgaWYgW2NvbmRpdGlvbl0KLy8vIHJldHVybnMgWzp0cnVlOl0gb24gdGhlIHN0YWNrIHRyYWNlIHRleHQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZmlsdGVyIHRoZQovLy8gcHJpbnRlZCBzdGFjayB0cmFjZXMgYmFzZWQgb24gdGhlaXIgY29udGVudC4gRm9yIGluc3RhbmNlIG9ubHkgcHJpbnQgc3RhY2sKLy8vIHRyYWNlcyB0aGF0IGNvbnRhaW4gc3BlY2lmaWMgcGF0aHMuCi8vLwovLy8gSWYgW2xpbWl0XSBpcyBwcm92aWRlZCwgdGhlIHN0YWNrIHRyYWNlIGlzIGxpbWl0ZWQgdG8gW2xpbWl0XSBlbnRyaWVzLgovLy8KLy8vIElmIFt0aHJvd09uUHJpbnRdIGlzIGB0cnVlYCwgW21lc3NhZ2VdIHdpbGwgYmUgdGhyb3duIGFmdGVyIHRoZSBzdGFjayB0cmFjZQovLy8gaGFzIGJlZW4gcHJpbnRlZC4gVG9nZXRoZXIgd2l0aCBbY29uZGl0aW9uXSB0aGlzIGNhbiBiZSB1c2VkIHRvIGRpc2NvdmVyCi8vLyB1bmtub3duIGNhbGwtc2l0ZXMgaW4gdGVzdHMgYnkgZmlsdGVyaW5nIGtub3duIGNhbGwtc2l0ZXMgYW5kIHRocm93bmluZwovLy8gb3RoZXJ3aXNlLgpUcmFjZSBnZXQgdHJhY2UgewogIGVuYWJsZURlYnVnTW9kZSgpOwogIHJldHVybiBfdHJhY2U7Cn0KCnZvaWQgX3RyYWNlKFN0cmluZyBtZXNzYWdlLAogICAge2Jvb2wgY29uZGl0aW9uKFN0cmluZyBzdGFja1RyYWNlKSwgaW50IGxpbWl0LCBib29sIHRocm93T25QcmludDogZmFsc2V9KSB7CiAgdHJ5IHsKICAgIHRocm93ICcnOwogIH0gY2F0Y2ggKGUsIHMpIHsKICAgIFN0cmluZyBzdGFja1RyYWNlOwogICAgdHJ5IHsKICAgICAgc3RhY2tUcmFjZSA9IHByZXR0aWZ5U3RhY2tUcmFjZShzLAogICAgICAgICAgcmFuZ2VTdGFydDogMSwgcmFuZ2VFbmQ6IGxpbWl0LCBmaWxlUHJlZml4OiBzdGFja1RyYWNlRmlsZVByZWZpeCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHByaW50KGUpOwogICAgICBzdGFja1RyYWNlID0gJyRzJzsKICAgIH0KICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkgewogICAgICBpZiAoIWNvbmRpdGlvbihzdGFja1RyYWNlKSkgcmV0dXJuOwogICAgfQogICAgcHJpbnQoJyRtZXNzYWdlXG4kc3RhY2tUcmFjZScpOwogICAgaWYgKHRocm93T25QcmludCkgdGhyb3cgbWVzc2FnZTsKICB9Cn0KCi8vLyBDcmVhdGVzIGEgZnVuY3Rpb24gdG8gdXNlIGFzIGFuIGBjb25kaXRpb25gIGFyZ3VtZW50IGluIFt0cmFjZV0gdGhhdCBmaWx0ZXJzCi8vLyBzdGFjayB0cmFjZXMgdGhhdCBjb250YWlucyBhbnkgb2YgdGhlIFtleGNlcHRpb25zXS4KdHJhY2VFeGNlcHRpb25zKExpc3Q8U3RyaW5nPiBleGNlcHRpb25zKSB7CiAgcmV0dXJuIChTdHJpbmcgc3RhY2tUcmFjZSkgPT4gIWV4Y2VwdGlvbnMuYW55KHN0YWNrVHJhY2UuY29udGFpbnMpOwp9CgovLy8gRnVuY3Rpb24gc2lnbmF0dXJlIG9mIFt0cmFjZUFuZFJlcG9ydF0uCnR5cGVkZWYgdm9pZCBUcmFjZUFuZFJlcG9ydCgKICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgU3Bhbm5hYmxlIG5vZGUsIFN0cmluZyBtZXNzYWdlLAogICAge2Jvb2wgY29uZGl0aW9uKFN0cmluZyBzdGFja1RyYWNlKSwgaW50IGxpbWl0LCBib29sIHRocm93T25QcmludH0pOwoKLy8vIENhbGxzIFtyZXBvcnRIZXJlXSBhbmQgW3RyYWNlXSB3aXRoIHRoZSBzYW1lIG1lc3NhZ2UuClRyYWNlQW5kUmVwb3J0IGdldCB0cmFjZUFuZFJlcG9ydCB7CiAgZW5hYmxlRGVidWdNb2RlKCk7CiAgcmV0dXJuIF90cmFjZUFuZFJlcG9ydDsKfQoKLy8vIENhbGxzIFtyZXBvcnRIZXJlXSBhbmQgW3RyYWNlXSB3aXRoIHRoZSBzYW1lIG1lc3NhZ2UuClRyYWNlQW5kUmVwb3J0IGdldCByZXBvcnRBbmRUcmFjZSA9PiB0cmFjZUFuZFJlcG9ydDsKCi8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbdHJhY2VBbmRSZXBvcnRdLgp2b2lkIF90cmFjZUFuZFJlcG9ydCgKICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgU3Bhbm5hYmxlIG5vZGUsIFN0cmluZyBtZXNzYWdlLAogICAge2Jvb2wgY29uZGl0aW9uKFN0cmluZyBzdGFja1RyYWNlKSwgaW50IGxpbWl0LCBib29sIHRocm93T25QcmludDogZmFsc2V9KSB7CiAgdHJhY2UobWVzc2FnZSwgbGltaXQ6IGxpbWl0LCB0aHJvd09uUHJpbnQ6IHRocm93T25QcmludCwKICAgICAgY29uZGl0aW9uOiAoU3RyaW5nIHN0YWNrVHJhY2UpIHsKICAgIGJvb2wgcmVzdWx0ID0gY29uZGl0aW9uICE9IG51bGwgPyBjb25kaXRpb24oc3RhY2tUcmFjZSkgOiB0cnVlOwogICAgaWYgKHJlc3VsdCkgewogICAgICByZXBvcnRIZXJlKHJlcG9ydGVyLCBub2RlLCBtZXNzYWdlKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfSk7Cn0KCi8vLyBSZXR1cm5zIHRoZSBbU3RhY2tUcmFjZUxpbmVzXSBmb3IgdGhlIGN1cnJlbnQgY2FsbCBzdGFjay4KLy8vCi8vLyBVc2UgW29mZnNldF0gdG8gZGlzY2FyZCB0aGUgZmlyc3QgW29mZnNldF0gY2FsbHMgb2YgdGhlIGNhbGwgc3RhY2suIERlZmF1bHRzCi8vLyB0byBgMWAsIHRoYXQgaXMsIGRpc2NhcmQgdGhlIGNhbGwgdG8gW3N0YWNrVHJhY2VdIGl0c2VsZi4gVXNlIFtsaW1pdF0gdG8KLy8vIGxpbWl0IHRoZSBsZW5ndGggb2YgdGhlIHN0YWNrIHRyYWNlIGxpbmVzLgpTdGFja1RyYWNlTGluZXMgc3RhY2tUcmFjZSh7aW50IG9mZnNldDogMSwgaW50IGxpbWl0OiBudWxsfSkgewogIGludCByYW5nZVN0YXJ0ID0gb2Zmc2V0OwogIGludCByYW5nZUVuZCA9IGxpbWl0ID09IG51bGwgPyBudWxsIDogcmFuZ2VTdGFydCArIGxpbWl0OwogIHRyeSB7CiAgICB0aHJvdyAnJzsKICB9IGNhdGNoIChfLCBzdGFja1RyYWNlKSB7CiAgICByZXR1cm4gbmV3IFN0YWNrVHJhY2VMaW5lcy5mcm9tVHJhY2Uoc3RhY2tUcmFjZSwKICAgICAgICByYW5nZVN0YXJ0OiBvZmZzZXQsCiAgICAgICAgcmFuZ2VFbmQ6IHJhbmdlRW5kLAogICAgICAgIGZpbGVQcmVmaXg6IHN0YWNrVHJhY2VGaWxlUHJlZml4KTsKICB9Cn0KCi8vLyBBIHN0YWNrIHRyYWNlIGFzIGEgc2VxdWVuY2Ugb2YgW1N0YWNrVHJhY2VMaW5lXXMuCmNsYXNzIFN0YWNrVHJhY2VMaW5lcyB7CiAgZmluYWwgTGlzdDxTdGFja1RyYWNlTGluZT4gbGluZXM7CiAgZmluYWwgaW50IG1heEZpbGVMZW5ndGg7CiAgZmluYWwgaW50IG1heExpbmVOb0xlbmd0aDsKICBmaW5hbCBpbnQgbWF4Q29sdW1uTm9MZW5ndGg7CgogIGZhY3RvcnkgU3RhY2tUcmFjZUxpbmVzLmZyb21UcmFjZShTdGFja1RyYWNlIHMsCiAgICAgIHtpbnQgcmFuZ2VTdGFydCwgaW50IHJhbmdlRW5kLCBTdHJpbmcgZmlsZVByZWZpeCwgU3RyaW5nIGxhbWJkYTogcic/J30pIHsKICAgIGZpbmFsIFJlZ0V4cCBpbmRleFBhdHRlcm4gPSBuZXcgUmVnRXhwKHInI1xkK1xzKicpOwogICAgaW50IGluZGV4ID0gLTE7CiAgICBpbnQgbWF4RmlsZUxlbmd0aCA9IDA7CiAgICBpbnQgbWF4TGluZU5vTGVuZ3RoID0gMDsKICAgIGludCBtYXhDb2x1bW5Ob0xlbmd0aCA9IDA7CgogICAgU3RyaW5nIHN0YWNrVHJhY2UgPSAnJHMnOwogICAgTGlzdDxTdGFja1RyYWNlTGluZT4gbGluZXMgPSA8U3RhY2tUcmFjZUxpbmU+W107CiAgICAvLyBQYXJzZSBlYWNoIGxpbmUgaW4gdGhlIHN0YWNrIHRyYWNlLiBUaGUgc3VwcG9ydGVkIGxpbmUgZm9ybWF0cyBmcm9tIHRoZQogICAgLy8gRGFydCBWTSBhcmU6CiAgICAvLyAgICAjbiAgICAgPG1ldGhvZC1uYW1lPiAoPHVyaT46PGxpbmUtbm8+Ojxjb2x1bW4tbm8+KQogICAgLy8gICAgI24gICAgIDxtZXRob2QtbmFtZT4gKDx1cmk+OjxsaW5lLW5vPikKICAgIC8vICAgICNuICAgICA8bWV0aG9kLW5hbWU+ICg8dXJpPikKICAgIC8vIGluIHdoaWNoICc8YW5vbnltb3VzIGNsb3N1cmU+JyBpcyB0aGUgbmFtZSB1c2VkIGZvciBhbiAodW5uYW1lZCkgZnVuY3Rpb24KICAgIC8vIGV4cHJlc3Npb24uIFRoZSBsYXN0IGNhc2UgaXMgdXNlZCBmb3IgYXN5bmMgYm9kaWVzLgogICAgZm9yIChTdHJpbmcgbGluZSBpbiBzdGFja1RyYWNlLnNwbGl0KCdcbicpKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaW5kZXgrKzsKICAgICAgICBpZiAocmFuZ2VTdGFydCAhPSBudWxsICYmIGluZGV4IDwgcmFuZ2VTdGFydCkgY29udGludWU7CiAgICAgICAgaWYgKHJhbmdlRW5kICE9IG51bGwgJiYgaW5kZXggPiByYW5nZUVuZCkgYnJlYWs7CiAgICAgICAgaWYgKGxpbmUuaXNFbXB0eSkgY29udGludWU7CgogICAgICAgIC8vIFN0cmlwIGluZGV4LgogICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2VGaXJzdChpbmRleFBhdHRlcm4sICcnKTsKICAgICAgICBpZiAobGluZSA9PSAnPGFzeW5jaHJvbm91cyBzdXNwZW5zaW9uPicpIHsKICAgICAgICAgIGxpbmVzLmFkZChuZXcgU3RhY2tUcmFjZUxpbmUoaW5kZXgsICcnLCAnJywgJycsIGxpbmUpKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaW50IGxlZnRQYXJlblBvcyA9IGxpbmUuaW5kZXhPZignKCcpOwogICAgICAgIGludCByaWdodFBhcmVuUG9zID0gbGluZS5pbmRleE9mKCcpJywgbGVmdFBhcmVuUG9zKTsKICAgICAgICBpbnQgbGFzdENvbG9uID0gbGluZS5sYXN0SW5kZXhPZignOicsIHJpZ2h0UGFyZW5Qb3MpOwogICAgICAgIGludCBuZXh0VG9MYXN0Q29sb24gPSBsaW5lLmxhc3RJbmRleE9mKCc6JywgbGFzdENvbG9uIC0gMSk7CgogICAgICAgIFN0cmluZyBsaW5lTm87CiAgICAgICAgU3RyaW5nIGNvbHVtbk5vOwogICAgICAgIGlmIChuZXh0VG9MYXN0Q29sb24gIT0gLTEpIHsKICAgICAgICAgIGxpbmVObyA9IGxpbmUuc3Vic3RyaW5nKG5leHRUb0xhc3RDb2xvbiArIDEsIGxhc3RDb2xvbik7CiAgICAgICAgICBjb2x1bW5ObyA9IGxpbmUuc3Vic3RyaW5nKGxhc3RDb2xvbiArIDEsIHJpZ2h0UGFyZW5Qb3MpOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaW50LnBhcnNlKGNvbHVtbk5vKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBpbnQucGFyc2UobGluZU5vKTsKICAgICAgICAgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gewogICAgICAgICAgICAgIC8vIE9ubHkgbGluZSBudW1iZXIuCiAgICAgICAgICAgICAgbGluZU5vID0gY29sdW1uTm87CiAgICAgICAgICAgICAgY29sdW1uTm8gPSAnJzsKICAgICAgICAgICAgICBuZXh0VG9MYXN0Q29sb24gPSBsYXN0Q29sb247CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgICAgLy8gTm8gY29sdW1uIG51bWJlciBub3IgbGluZSBudW1iZXIuCiAgICAgICAgICAgIGxpbmVObyA9ICcnOwogICAgICAgICAgICBjb2x1bW5ObyA9ICcnOwogICAgICAgICAgICBuZXh0VG9MYXN0Q29sb24gPSByaWdodFBhcmVuUG9zOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsaW5lTm8gPSBsaW5lLnN1YnN0cmluZyhsYXN0Q29sb24gKyAxLCByaWdodFBhcmVuUG9zKTsKICAgICAgICAgIGNvbHVtbk5vID0gJyc7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpbnQucGFyc2UobGluZU5vKTsKICAgICAgICAgICAgbmV4dFRvTGFzdENvbG9uID0gbGFzdENvbG9uOwogICAgICAgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gewogICAgICAgICAgICAvLyBObyBjb2x1bW4gbnVtYmVyIG5vciBsaW5lIG51bWJlci4KICAgICAgICAgICAgbGluZU5vID0gY29sdW1uTm87CiAgICAgICAgICAgIGNvbHVtbk5vID0gJyc7CiAgICAgICAgICAgIG5leHRUb0xhc3RDb2xvbiA9IHJpZ2h0UGFyZW5Qb3M7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAobGluZU5vLmxlbmd0aCA+IG1heExpbmVOb0xlbmd0aCkgewogICAgICAgICAgbWF4TGluZU5vTGVuZ3RoID0gbGluZU5vLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbHVtbk5vLmxlbmd0aCA+IG1heENvbHVtbk5vTGVuZ3RoKSB7CiAgICAgICAgICBtYXhDb2x1bW5Ob0xlbmd0aCA9IGNvbHVtbk5vLmxlbmd0aDsKICAgICAgICB9CgogICAgICAgIFN0cmluZyBmaWxlID0gbGluZS5zdWJzdHJpbmcobGVmdFBhcmVuUG9zICsgMSwgbmV4dFRvTGFzdENvbG9uKTsKICAgICAgICBpZiAoZmlsZVByZWZpeCAhPSBudWxsICYmIGZpbGUuc3RhcnRzV2l0aChmaWxlUHJlZml4KSkgewogICAgICAgICAgZmlsZSA9IGZpbGUuc3Vic3RyaW5nKGZpbGVQcmVmaXgubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZpbGUubGVuZ3RoID4gbWF4RmlsZUxlbmd0aCkgewogICAgICAgICAgbWF4RmlsZUxlbmd0aCA9IGZpbGUubGVuZ3RoOwogICAgICAgIH0KICAgICAgICBTdHJpbmcgbWV0aG9kID0gbGluZS5zdWJzdHJpbmcoMCwgbGVmdFBhcmVuUG9zIC0gMSk7CiAgICAgICAgaWYgKGxhbWJkYSAhPSBudWxsKSB7CiAgICAgICAgICBtZXRob2QgPSBtZXRob2QucmVwbGFjZUFsbCgnPGFub255bW91cyBjbG9zdXJlPicsIGxhbWJkYSk7CiAgICAgICAgfQogICAgICAgIGxpbmVzLmFkZChuZXcgU3RhY2tUcmFjZUxpbmUoaW5kZXgsIGZpbGUsIGxpbmVObywgY29sdW1uTm8sIG1ldGhvZCkpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgdGhyb3cgJ0Vycm9yIHByZXR0aWZ5aW5nICIkbGluZSI6ICRlJzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBTdGFja1RyYWNlTGluZXMuZnJvbUxpbmVzKAogICAgICAgIGxpbmVzLCBtYXhGaWxlTGVuZ3RoLCBtYXhMaW5lTm9MZW5ndGgsIG1heENvbHVtbk5vTGVuZ3RoKTsKICB9CgogIFN0YWNrVHJhY2VMaW5lcy5mcm9tTGluZXModGhpcy5saW5lcywgdGhpcy5tYXhGaWxlTGVuZ3RoLAogICAgICB0aGlzLm1heExpbmVOb0xlbmd0aCwgdGhpcy5tYXhDb2x1bW5Ob0xlbmd0aCk7CgogIFN0YWNrVHJhY2VMaW5lcyBzdWJ0cmFjZShpbnQgb2Zmc2V0KSB7CiAgICByZXR1cm4gbmV3IFN0YWNrVHJhY2VMaW5lcy5mcm9tTGluZXMobGluZXMuc3VibGlzdChvZmZzZXQpLCBtYXhGaWxlTGVuZ3RoLAogICAgICAgIG1heExpbmVOb0xlbmd0aCwgbWF4Q29sdW1uTm9MZW5ndGgpOwogIH0KCiAgU3RyaW5nIHByZXR0aWZ5KHtib29sIHNob3dDb2x1bW5ObzogZmFsc2UsIGJvb2wgc2hvd0RvdHM6IHRydWV9KSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBib29sIGRvdHMgPSB0cnVlOwogICAgZm9yIChTdGFja1RyYWNlTGluZSBsaW5lIGluIGxpbmVzKSB7CiAgICAgIHNiLndyaXRlKCcgICcpOwogICAgICBsaW5lLnByaW50T24oc2IsCiAgICAgICAgICBmaWxlTGVuZ3RoOiBtYXhGaWxlTGVuZ3RoLAogICAgICAgICAgcGFkZGluZzogc2hvd0RvdHMgJiYgZG90cyA/ICcgLicgOiAnICcsCiAgICAgICAgICBsaW5lTm9MZW5ndGg6IG1heExpbmVOb0xlbmd0aCwKICAgICAgICAgIHNob3dDb2x1bW5Obzogc2hvd0NvbHVtbk5vLAogICAgICAgICAgY29sdW1uTm9MZW5ndGg6IG1heENvbHVtbk5vTGVuZ3RoKTsKCiAgICAgIGRvdHMgPSAhZG90czsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIHByZXR0aWZ5KCk7CiAgfQp9CgovLy8gQSBwYXJzZWQgbGluZSBmcm9tIGEgc3RhY2sgdHJhY2UuCmNsYXNzIFN0YWNrVHJhY2VMaW5lIHsKICBmaW5hbCBpbnQgaW5kZXg7CiAgZmluYWwgU3RyaW5nIGZpbGU7CiAgZmluYWwgU3RyaW5nIGxpbmVObzsKICBmaW5hbCBTdHJpbmcgY29sdW1uTm87CiAgZmluYWwgU3RyaW5nIG1ldGhvZDsKCiAgU3RhY2tUcmFjZUxpbmUoCiAgICAgIHRoaXMuaW5kZXgsIHRoaXMuZmlsZSwgdGhpcy5saW5lTm8sIHRoaXMuY29sdW1uTm8sIHRoaXMubWV0aG9kKTsKCiAgdm9pZCBwcmludE9uKFN0cmluZ0J1ZmZlciBzYiwKICAgICAge1N0cmluZyBwYWRkaW5nOiAnICcsCiAgICAgIGludCBmaWxlTGVuZ3RoLAogICAgICBpbnQgbGluZU5vTGVuZ3RoLAogICAgICBpbnQgY29sdW1uTm9MZW5ndGgsCiAgICAgIGJvb2wgc2hvd0NvbHVtbk5vOiBmYWxzZX0pIHsKICAgIFN0cmluZyBmaWxlVGV4dCA9ICcke2ZpbGV9ICc7CiAgICBpZiAoZmlsZUxlbmd0aCAhPSBudWxsKSB7CiAgICAgIGZpbGVUZXh0ID0gcGFkKGZpbGVUZXh0LCBmaWxlTGVuZ3RoLCBkb3RzOiBwYWRkaW5nKTsKICAgIH0KICAgIFN0cmluZyBsaW5lTm9UZXh0ID0gbGluZU5vOwogICAgaWYgKGxpbmVOb0xlbmd0aCAhPSBudWxsKSB7CiAgICAgIGxpbmVOb1RleHQgPSBwYWQobGluZU5vVGV4dCwgbGluZU5vTGVuZ3RoLCBwYWRMZWZ0OiB0cnVlKTsKICAgIH0KICAgIFN0cmluZyBjb2x1bW5Ob1RleHQgPSBzaG93Q29sdW1uTm8gPyAnJyA6IGNvbHVtbk5vOwogICAgaWYgKGNvbHVtbk5vTGVuZ3RoICE9IG51bGwpIHsKICAgICAgY29sdW1uTm9UZXh0ID0gJzoke3BhZChjb2x1bW5Ob1RleHQsIGNvbHVtbk5vTGVuZ3RoKX0nOwogICAgfQogICAgc2Iud3JpdGUoJyRmaWxlVGV4dCAkbGluZU5vVGV4dCRjb2x1bW5Ob1RleHQgJG1ldGhvZFxuJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiAxMyAqIGluZGV4ICsKICAgICAgICAxNyAqIGZpbGUuaGFzaENvZGUgKwogICAgICAgIDE5ICogbGluZU5vLmhhc2hDb2RlICsKICAgICAgICAyMyAqIGNvbHVtbk5vLmhhc2hDb2RlICsKICAgICAgICAyOSAqIG1ldGhvZC5oYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgU3RhY2tUcmFjZUxpbmUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBpbmRleCA9PSBvdGhlci5pbmRleCAmJgogICAgICAgIGZpbGUgPT0gb3RoZXIuZmlsZSAmJgogICAgICAgIGxpbmVObyA9PSBvdGhlci5saW5lTm8gJiYKICAgICAgICBjb2x1bW5ObyA9PSBvdGhlci5jb2x1bW5ObyAmJgogICAgICAgIG1ldGhvZCA9PSBvdGhlci5tZXRob2Q7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiJG1ldGhvZCBAICRmaWxlIFskbGluZU5vOiRjb2x1bW5Ob10iOwp9CgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgdGhpcyBmb3JtYXQgZm9yIC0tdGhyb3ctb24tZXJyb3IuCi8vLyBDb252ZXJ0cyB0aGUgbm9ybWFsIFZNIHN0YWNrIHRyYWNlIGludG8gYSBtb3JlIGNvbXBhY3QgYW5kIHJlYWRhYmxlIGZvcm1hdC4KLy8vCi8vLyBUaGUgb3V0cHV0IGZvcm1hdCBpcyBgPGZpbGU+IC4gLiAuIDxsaW5lTm8+Ojxjb2x1bW5Obz4gPG1ldGhvZD5gIHdoZXJlCi8vLyBgPGZpbGU+YCBpcyBmaWxlIG5hbWUsIGA8bGluZU5vPmAgaXMgdGhlIGxpbmUgbnVtYmVyLCBgPGNvbHVtbk5vPmAgaXMgdGhlCi8vLyBjb2x1bW4gbnVtYmVyLCBhbmQgYDxtZXRob2Q+YCBpcyB0aGUgbWV0aG9kIG5hbWUuCi8vLwovLy8gSWYgW3JhbmdlU3RhcnRdIGFuZC9vciBbcmFuZ2VFbmRdIGFyZSBwcm92aWRlZCwgb25seSB0aGUgbGluZXMgd2l0aGluIHRoZQovLy8gcmFuZ2UgYXJlIGluY2x1ZGVkLgovLy8gSWYgW3Nob3dDb2x1bW5Ob10gaXMgYGZhbHNlYCwgdGhlIGA6PGNvbHVtbk5vPmAgcGFydCBpcyBvbWl0dGVkLgovLy8gSWYgW3Nob3dEb3RzXSBpcyBgdHJ1ZWAsIHRoZSBzcGFjZSBiZXR3ZWVuIGA8ZmlsZT5gIGFuZCBgPGxpbmVObz5gIGlzIHBhZGRlZAovLy8gd2l0aCBkb3RzIG9uIGV2ZXJ5IG90aGVyIGxpbmUuCi8vLyBJZiBbZmlsZVByZWZpeF0gaXMgcHJvdmlkZWQsIHRoZW4gZm9yICBldmVyeSBmaWxlIG5hbWUgdGhhdHMgc3RhcnRzIHdpdGgKLy8vIFtmaWxlUHJlZml4XSBvbmx5IHRoZSByZW1haW5kZXIgaXMgcHJpbnRlZC4KLy8vIElmIFtsYW1iZGFdIGlzIG5vbi1udWxsLCBhbm9ueW1vdXMgY2xvc3VyZXMgYXJlIHByaW50ZWQgYXMgW2xhbWJkYV0uClN0cmluZyBwcmV0dGlmeVN0YWNrVHJhY2UoU3RhY2tUcmFjZSBzdGFja1RyYWNlLAogICAge2ludCByYW5nZVN0YXJ0LAogICAgaW50IHJhbmdlRW5kLAogICAgYm9vbCBzaG93Q29sdW1uTm86IGZhbHNlLAogICAgYm9vbCBzaG93RG90czogdHJ1ZSwKICAgIFN0cmluZyBmaWxlUHJlZml4LAogICAgU3RyaW5nIGxhbWJkYTogcic/J30pIHsKICByZXR1cm4gbmV3IFN0YWNrVHJhY2VMaW5lcy5mcm9tVHJhY2Uoc3RhY2tUcmFjZSwKICAgICAgICAgIHJhbmdlU3RhcnQ6IHJhbmdlU3RhcnQsCiAgICAgICAgICByYW5nZUVuZDogcmFuZ2VFbmQsCiAgICAgICAgICBmaWxlUHJlZml4OiBmaWxlUHJlZml4LAogICAgICAgICAgbGFtYmRhOiBsYW1iZGEpCiAgICAgIC5wcmV0dGlmeShzaG93Q29sdW1uTm86IHNob3dDb2x1bW5Obywgc2hvd0RvdHM6IHNob3dEb3RzKTsKfQoKLy8vIFBhZHMgKG9yIHRydW5jYXRlcykgW3RleHRdIHRvIHRoZSBbaW50ZW5kZWRMZW5ndGhdLgovLy8KLy8vIElmIFtwYWRMZWZ0XSBpcyBbOnRydWU6XSB0aGUgdGV4dCBpcyBwYWRkaW5nIGluc2VydGVkIHRvIHRoZSBsZWZ0IG9mIFt0ZXh0XS4KLy8vIEEgcmVwZXRpdGlvbiBvZiB0aGUgW2RvdHNdIHRleHQgaXMgdXNlZCBmb3IgcGFkZGluZy4KU3RyaW5nIHBhZChTdHJpbmcgdGV4dCwgaW50IGludGVuZGVkTGVuZ3RoLAogICAge2Jvb2wgcGFkTGVmdDogZmFsc2UsIFN0cmluZyBkb3RzOiAnICd9KSB7CiAgaWYgKHRleHQubGVuZ3RoID09IGludGVuZGVkTGVuZ3RoKSByZXR1cm4gdGV4dDsKICBpZiAodGV4dC5sZW5ndGggPiBpbnRlbmRlZExlbmd0aCkgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIGludGVuZGVkTGVuZ3RoKTsKICBpZiAoZG90cyA9PSBudWxsIHx8IGRvdHMuaXNFbXB0eSkgZG90cyA9ICcgJzsKICBpbnQgZG90c0xlbmd0aCA9IGRvdHMubGVuZ3RoOwogIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBpZiAoIXBhZExlZnQpIHsKICAgIHNiLndyaXRlKHRleHQpOwogIH0KICBmb3IgKGludCBpbmRleCA9IHRleHQubGVuZ3RoOyBpbmRleCA8IGludGVuZGVkTGVuZ3RoOyBpbmRleCsrKSB7CiAgICBpbnQgZG90c0luZGV4ID0gaW5kZXggJSBkb3RzTGVuZ3RoOwogICAgc2Iud3JpdGUoZG90cy5zdWJzdHJpbmcoZG90c0luZGV4LCBkb3RzSW5kZXggKyAxKSk7CiAgfQogIGlmIChwYWRMZWZ0KSB7CiAgICBzYi53cml0ZSh0ZXh0KTsKICB9CiAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Cn0KgV8ATk48ARkcASQjSAE7BDsET01PKARLBFBNTA8SFRECARxQCA4TFwopTRIQGQYdKgYkJQQCAVE4K0YCASwdQUgBOiQVGgIBOjUBKBZBUDsnRBIrBhMGAgE+BFFNLz8bPAgOHDUcHCsEAgE2GCQbHR8BMlA4FBsdHwEeNU8UPTEnUTsyDBFAOSQBGDQzQhQKAS49PkQBFxklQ0MQIRIhIyMhHSsOITEZGy0MEUEZEB8pITEfGy0MCgEvKwozLwoBSUE0CisnCj0eRQpOFC8IBipDBAE8NQEpTy0EAUUqFikWFyUyKSYuARQGGgQBDBYXBAIBJhcTFRcZFwESRwEgHBYYGiMiHjsGICBBBjgiPgY+BAEMFRgdHyEeBAEMHC0wIx4iJiAEAQw+AgE+UARLTjYEThhFUSNNMEkxFRIeGRccMyIeIhpBAgE4BFE5LC8yTjAgKBIUBEMoOAQRFAQYAgEncGFja2FnZTpjb21waWxlci9zcmMvaGVscGVycy90cmFjZS5kYXJ0O3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2hlbHBlcnMvZGVidWdfY29sbGVjdGlvbi5kYXJ0r7wvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKdHlwZWRlZiB2b2lkIERlYnVnQ2FsbGJhY2soU3RyaW5nIG1ldGhvZE5hbWUsIHZhciBhcmcxLCB2YXIgYXJnMik7CgpjbGFzcyBEZWJ1Z01hcDxLLCBWPiBpbXBsZW1lbnRzIE1hcDxLLCBWPiB7CiAgZmluYWwgTWFwPEssIFY+IHNvdXJjZU1hcDsKICBEZWJ1Z0NhbGxiYWNrIGluZGV4U2V0Q2FsbGJhY2s7CiAgRGVidWdDYWxsYmFjayBwdXRJZkFic2VudENhbGxiYWNrOwogIERlYnVnQ2FsbGJhY2sgcmVtb3ZlQ2FsbGJhY2s7CgogIERlYnVnTWFwKHRoaXMuc291cmNlTWFwLCB7RGVidWdDYWxsYmFjayBhZGRDYWxsYmFjaywgdGhpcy5yZW1vdmVDYWxsYmFja30pIHsKICAgIGlmIChhZGRDYWxsYmFjayAhPSBudWxsKSB7CiAgICAgIHRoaXMuYWRkQ2FsbGJhY2sgPSBhZGRDYWxsYmFjazsKICAgIH0KICB9CgogIHZvaWQgc2V0IGFkZENhbGxiYWNrKERlYnVnQ2FsbGJhY2sgdmFsdWUpIHsKICAgIGluZGV4U2V0Q2FsbGJhY2sgPSB2YWx1ZTsKICAgIHB1dElmQWJzZW50Q2FsbGJhY2sgPSB2YWx1ZTsKICB9CgogIEBvdmVycmlkZQogIE1hcDxSSywgUlY+IGNhc3Q8UkssIFJWPigpID0+IE1hcC5jYXN0RnJvbTxLLCBWLCBSSywgUlY+KHRoaXMpOwogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKICAgIHJldHVybiBzb3VyY2VNYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpID0+IHNvdXJjZU1hcC5jb250YWluc0tleShrZXkpOwoKICBAb3ZlcnJpZGUKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpID0+IHNvdXJjZU1hcFtrZXldOwoKICBAb3ZlcnJpZGUKICB2b2lkIG9wZXJhdG9yIFtdPShLIGtleSwgViB2YWx1ZSkgewogICAgaWYgKGluZGV4U2V0Q2FsbGJhY2sgIT0gbnVsbCkgewogICAgICBpbmRleFNldENhbGxiYWNrKCdbXT0nLCBrZXksIHZhbHVlKTsKICAgIH0KICAgIHNvdXJjZU1hcFtrZXldID0gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIHJldHVybiBzb3VyY2VNYXAucHV0SWZBYnNlbnQoa2V5LCAoKSB7CiAgICAgIFYgdiA9IGlmQWJzZW50KCk7CiAgICAgIGlmIChwdXRJZkFic2VudENhbGxiYWNrICE9IG51bGwpIHsKICAgICAgICBwdXRJZkFic2VudENhbGxiYWNrKCdwdXRJZkFic2VudCcsIGtleSwgdik7CiAgICAgIH0KICAgICAgcmV0dXJuIHY7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkQWxsKE1hcDxLLCBWPiBvdGhlcikgPT4gc291cmNlTWFwLmFkZEFsbChvdGhlcik7CgogIEBvdmVycmlkZQogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIGlmIChyZW1vdmVDYWxsYmFjayAhPSBudWxsKSB7CiAgICAgIHJlbW92ZUNhbGxiYWNrKCdyZW1vdmUnLCBrZXksIHNvdXJjZU1hcFtrZXldKTsKICAgIH0KICAgIHJldHVybiBzb3VyY2VNYXAucmVtb3ZlKGtleSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsZWFyKCkgewogICAgaWYgKHJlbW92ZUNhbGxiYWNrICE9IG51bGwpIHsKICAgICAgcmVtb3ZlQ2FsbGJhY2soJ2NsZWFyJywgc291cmNlTWFwLCBudWxsKTsKICAgIH0KICAgIHNvdXJjZU1hcC5jbGVhcigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihLIGtleSwgViB2YWx1ZSkpID0+IHNvdXJjZU1hcC5mb3JFYWNoKGYpOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PiBzb3VyY2VNYXAua2V5czsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Vj4gZ2V0IHZhbHVlcyA9PiBzb3VyY2VNYXAudmFsdWVzOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZ2V0IGVudHJpZXMgPT4gc291cmNlTWFwLmVudHJpZXM7CgogIEBvdmVycmlkZQogIHZvaWQgYWRkRW50cmllcyhJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZW50cmllcykgewogICAgc291cmNlTWFwLmFkZEVudHJpZXMoZW50cmllcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8SzIsIFYyPiBtYXA8SzIsIFYyPihNYXBFbnRyeTxLMiwgVjI+IHRyYW5zZm9ybShLIGtleSwgViB2YWx1ZSkpID0+CiAgICAgIHNvdXJjZU1hcC5tYXAodHJhbnNmb3JtKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gc291cmNlTWFwLmxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBzb3VyY2VNYXAuaXNFbXB0eTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBzb3VyY2VNYXAuaXNOb3RFbXB0eTsKCiAgQG92ZXJyaWRlCiAgViB1cGRhdGUoSyBrZXksIFYgdXBkYXRlKFYgdmFsdWUpLCB7ViBpZkFic2VudCgpfSkgPT4KICAgICAgc291cmNlTWFwLnVwZGF0ZShrZXksIHVwZGF0ZSwgaWZBYnNlbnQ6IGlmQWJzZW50KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB1cGRhdGVBbGwoViB1cGRhdGUoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBzb3VyY2VNYXAudXBkYXRlQWxsKHVwZGF0ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChLIGtleSwgViB2YWx1ZSkpIHsKICAgIHNvdXJjZU1hcC5yZW1vdmVXaGVyZSh0ZXN0KTsKICB9Cn0KCmNsYXNzIERlYnVnSXRlcmFibGU8RT4gaW1wbGVtZW50cyBJdGVyYWJsZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gaXRlcmFibGU7CgogIERlYnVnSXRlcmFibGUodGhpcy5pdGVyYWJsZSk7CgogIEBvdmVycmlkZQogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBpdGVyYWJsZS5pdGVyYXRvcjsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Uj4gY2FzdDxSPigpID0+IEl0ZXJhYmxlLmNhc3RGcm9tPEUsIFI+KHRoaXMpOwogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoRSBlbGVtZW50KSkgPT4gaXRlcmFibGUubWFwKGYpOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxFPiB3aGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gaXRlcmFibGUud2hlcmUodGVzdCk7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFQ+IGV4cGFuZDxUPihJdGVyYWJsZTxUPiBmKEUgZWxlbWVudCkpID0+IGl0ZXJhYmxlLmV4cGFuZChmKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgPT4gaXRlcmFibGUuY29udGFpbnMoZWxlbWVudCk7CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaCh2b2lkIGYoRSBlbGVtZW50KSkgPT4gaXRlcmFibGUuZm9yRWFjaChmKTsKCiAgQG92ZXJyaWRlCiAgRSByZWR1Y2UoRSBjb21iaW5lKEUgdmFsdWUsIEUgZWxlbWVudCkpID0+IGl0ZXJhYmxlLnJlZHVjZShjb21iaW5lKTsKCiAgQG92ZXJyaWRlCiAgVCBmb2xkPFQ+KFQgaW5pdGlhbFZhbHVlLCBUIGNvbWJpbmUoVCBwcmV2aW91c1ZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICByZXR1cm4gaXRlcmFibGUuZm9sZChpbml0aWFsVmFsdWUsIGNvbWJpbmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBldmVyeShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gaXRlcmFibGUuZXZlcnkodGVzdCk7CgogIEBvdmVycmlkZQogIFN0cmluZyBqb2luKFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSA9PiBpdGVyYWJsZS5qb2luKHNlcGFyYXRvcik7CgogIEBvdmVycmlkZQogIGJvb2wgYW55KGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBpdGVyYWJsZS5hbnkodGVzdCk7CgogIEBvdmVycmlkZQogIExpc3Q8RT4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgcmV0dXJuIGl0ZXJhYmxlLnRvTGlzdChncm93YWJsZTogZ3Jvd2FibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU2V0PEU+IHRvU2V0KCkgPT4gaXRlcmFibGUudG9TZXQoKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gaXRlcmFibGUubGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0VtcHR5ID0+IGl0ZXJhYmxlLmlzRW1wdHk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gaXRlcmFibGUuaXNOb3RFbXB0eTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8RT4gdGFrZShpbnQgbikgPT4gaXRlcmFibGUudGFrZShuKTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8RT4gdGFrZVdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgPT4gaXRlcmFibGUudGFrZVdoaWxlKHRlc3QpOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxFPiBza2lwKGludCBuKSA9PiBpdGVyYWJsZS5za2lwKG4pOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxFPiBza2lwV2hpbGUoYm9vbCB0ZXN0KEUgdmFsdWUpKSA9PiBpdGVyYWJsZS5za2lwV2hpbGUodGVzdCk7CgogIEBvdmVycmlkZQogIEUgZ2V0IGZpcnN0ID0+IGl0ZXJhYmxlLmZpcnN0OwoKICBAb3ZlcnJpZGUKICBFIGdldCBsYXN0ID0+IGl0ZXJhYmxlLmxhc3Q7CgogIEBvdmVycmlkZQogIEUgZ2V0IHNpbmdsZSA9PiBpdGVyYWJsZS5zaW5nbGU7CgogIEBvdmVycmlkZQogIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICByZXR1cm4gaXRlcmFibGUuZmlyc3RXaGVyZSh0ZXN0LCBvckVsc2U6IG9yRWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFIGxhc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICByZXR1cm4gaXRlcmFibGUubGFzdFdoZXJlKHRlc3QsIG9yRWxzZTogb3JFbHNlKTsKICB9CgogIEBvdmVycmlkZQogIEUgc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgPT4KICAgICAgaXRlcmFibGUuc2luZ2xlV2hlcmUodGVzdCwgb3JFbHNlOiBvckVsc2UpOwoKICBAb3ZlcnJpZGUKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpID0+IGl0ZXJhYmxlLmVsZW1lbnRBdChpbmRleCk7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEU+IGZvbGxvd2VkQnkoSXRlcmFibGU8RT4gb3RoZXIpID0+IGl0ZXJhYmxlLmZvbGxvd2VkQnkob3RoZXIpOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBpdGVyYWJsZS53aGVyZVR5cGU8VD4oKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gaXRlcmFibGUudG9TdHJpbmcoKTsKfQoKY2xhc3MgRGVidWdMaXN0PEU+IGV4dGVuZHMgRGVidWdJdGVyYWJsZTxFPiBpbXBsZW1lbnRzIExpc3Q8RT4gewogIERlYnVnQ2FsbGJhY2sgYWRkQ2FsbGJhY2s7CiAgRGVidWdDYWxsYmFjayBhZGRBbGxDYWxsYmFjazsKCiAgRGVidWdMaXN0KExpc3Q8RT4gbGlzdCwge3RoaXMuYWRkQ2FsbGJhY2ssIHRoaXMuYWRkQWxsQ2FsbGJhY2t9KQogICAgICA6IHN1cGVyKGxpc3QpOwoKICBMaXN0PEU+IGdldCBsaXN0ID0+IGl0ZXJhYmxlOwoKICBAb3ZlcnJpZGUKICBMaXN0PFI+IGNhc3Q8Uj4oKSA9PiBMaXN0LmNhc3RGcm9tPEUsIFI+KHRoaXMpOwogIEBvdmVycmlkZQogIExpc3Q8RT4gb3BlcmF0b3IgKyhMaXN0PEU+IG90aGVyKSA9PiBsaXN0ICsgb3RoZXI7CgogIEBvdmVycmlkZQogIEUgb3BlcmF0b3IgW10oaW50IGluZGV4KSA9PiBsaXN0W2luZGV4XTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBFIHZhbHVlKSB7CiAgICBsaXN0W2luZGV4XSA9IHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXQgZmlyc3QoRSBlbGVtZW50KSB7CiAgICBsaXN0LmZpcnN0ID0gZWxlbWVudDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgc2V0IGxhc3QoRSBlbGVtZW50KSB7CiAgICBsaXN0Lmxhc3QgPSBlbGVtZW50OwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gbGlzdC5sZW5ndGg7CgogIEBvdmVycmlkZQogIHZvaWQgc2V0IGxlbmd0aChpbnQgbmV3TGVuZ3RoKSB7CiAgICBsaXN0Lmxlbmd0aCA9IG5ld0xlbmd0aDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkKEUgdmFsdWUpIHsKICAgIGlmIChhZGRDYWxsYmFjayAhPSBudWxsKSB7CiAgICAgIGFkZENhbGxiYWNrKCdhZGQnLCB2YWx1ZSwgbnVsbCk7CiAgICB9CiAgICBsaXN0LmFkZCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgaWYgKGFkZEFsbENhbGxiYWNrICE9IG51bGwpIHsKICAgICAgYWRkQWxsQ2FsbGJhY2soJ2FkZEFsbCcsIGl0ZXJhYmxlLCBudWxsKTsKICAgIH0KICAgIGxpc3QuYWRkQWxsKGl0ZXJhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEU+IGdldCByZXZlcnNlZCA9PiBsaXN0LnJldmVyc2VkOwoKICBAb3ZlcnJpZGUKICB2b2lkIHNvcnQoW2ludCBjb21wYXJlKEUgYSwgRSBiKV0pID0+IGxpc3Quc29ydChjb21wYXJlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzaHVmZmxlKFtyYW5kb21dKSA9PiBsaXN0LnNodWZmbGUocmFuZG9tKTsKCiAgQG92ZXJyaWRlCiAgaW50IGluZGV4T2YoRSBlbGVtZW50LCBbaW50IHN0YXJ0ID0gMF0pID0+IGxpc3QuaW5kZXhPZihlbGVtZW50LCBzdGFydCk7CgogIEBvdmVycmlkZQogIGludCBpbmRleFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCBbaW50IHN0YXJ0ID0gMF0pID0+CiAgICAgIGxpc3QuaW5kZXhXaGVyZSh0ZXN0LCBzdGFydCk7CgogIEBvdmVycmlkZQogIGludCBsYXN0SW5kZXhPZihFIGVsZW1lbnQsIFtpbnQgc3RhcnRdKSA9PiBsaXN0Lmxhc3RJbmRleE9mKGVsZW1lbnQsIHN0YXJ0KTsKCiAgQG92ZXJyaWRlCiAgaW50IGxhc3RJbmRleFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCBbaW50IHN0YXJ0XSkgPT4KICAgICAgbGlzdC5sYXN0SW5kZXhXaGVyZSh0ZXN0LCBzdGFydCk7CgogIEBvdmVycmlkZQogIHZvaWQgY2xlYXIoKSA9PiBsaXN0LmNsZWFyKCk7CgogIEBvdmVycmlkZQogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRSBlbGVtZW50KSA9PiBsaXN0Lmluc2VydChpbmRleCwgZWxlbWVudCk7CgogIEBvdmVycmlkZQogIHZvaWQgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIGxpc3QuaW5zZXJ0QWxsKGluZGV4LCBpdGVyYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHNldEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSA9PiBsaXN0LnNldEFsbChpbmRleCwgaXRlcmFibGUpOwoKICBAb3ZlcnJpZGUKICBib29sIHJlbW92ZShPYmplY3QgdmFsdWUpID0+IGxpc3QucmVtb3ZlKHZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgRSByZW1vdmVBdChpbnQgaW5kZXgpID0+IGxpc3QucmVtb3ZlQXQoaW5kZXgpOwoKICBAb3ZlcnJpZGUKICBFIHJlbW92ZUxhc3QoKSA9PiBsaXN0LnJlbW92ZUxhc3QoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gbGlzdC5yZW1vdmVXaGVyZSh0ZXN0KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gbGlzdC5yZXRhaW5XaGVyZSh0ZXN0KTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxFPiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSA9PiBsaXN0LnN1Ymxpc3Qoc3RhcnQsIGVuZCk7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEU+IGdldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgPT4gbGlzdC5nZXRSYW5nZShzdGFydCwgZW5kKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICBsaXN0LnNldFJhbmdlKHN0YXJ0LCBlbmQsIGl0ZXJhYmxlLCBza2lwQ291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZW1vdmVSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGxpc3QucmVtb3ZlUmFuZ2Uoc3RhcnQsIGVuZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtFIGZpbGxWYWx1ZV0pIHsKICAgIGxpc3QuZmlsbFJhbmdlKHN0YXJ0LCBlbmQsIGZpbGxWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlcGxhY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IHJlcGxhY2VtZW50KSB7CiAgICBsaXN0LnJlcGxhY2VSYW5nZShzdGFydCwgZW5kLCByZXBsYWNlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8aW50LCBFPiBhc01hcCgpID0+IGxpc3QuYXNNYXAoKTsKfQoKY2xhc3MgRGVidWdTZXQ8RT4gZXh0ZW5kcyBEZWJ1Z0l0ZXJhYmxlPEU+IGltcGxlbWVudHMgU2V0PEU+IHsKICBEZWJ1Z0NhbGxiYWNrIGFkZENhbGxiYWNrOwoKICBEZWJ1Z1NldChTZXQ8RT4gc2V0LCB7dGhpcy5hZGRDYWxsYmFja30pIDogc3VwZXIoc2V0KTsKCiAgU2V0PEU+IGdldCBzZXQgPT4gaXRlcmFibGU7CgogIEBvdmVycmlkZQogIFNldDxSPiBjYXN0PFI+KCkgPT4gU2V0LmNhc3RGcm9tPEUsIFI+KHRoaXMpOwogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnMoT2JqZWN0IHZhbHVlKSA9PiBzZXQuY29udGFpbnModmFsdWUpOwoKICBAb3ZlcnJpZGUKICBib29sIGFkZChFIHZhbHVlKSB7CiAgICBpZiAoYWRkQ2FsbGJhY2sgIT0gbnVsbCkgewogICAgICBhZGRDYWxsYmFjaygnYWRkJywgdmFsdWUsIG51bGwpOwogICAgfQogICAgcmV0dXJuIHNldC5hZGQodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpIHsKICAgIGVsZW1lbnRzLmZvckVhY2goYWRkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgcmVtb3ZlKE9iamVjdCB2YWx1ZSkgPT4gc2V0LnJlbW92ZSh2YWx1ZSk7CgogIEBvdmVycmlkZQogIEUgbG9va3VwKE9iamVjdCBvYmplY3QpID0+IHNldC5sb29rdXAob2JqZWN0KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZW1vdmVBbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgPT4gc2V0LnJlbW92ZUFsbChlbGVtZW50cyk7CgogIEBvdmVycmlkZQogIHZvaWQgcmV0YWluQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpID0+IHNldC5yZXRhaW5BbGwoZWxlbWVudHMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBzZXQucmVtb3ZlV2hlcmUodGVzdCk7CgogIEBvdmVycmlkZQogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IHNldC5yZXRhaW5XaGVyZSh0ZXN0KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc0FsbChJdGVyYWJsZTxPYmplY3Q+IG90aGVyKSA9PiBzZXQuY29udGFpbnNBbGwob3RoZXIpOwoKICBAb3ZlcnJpZGUKICBTZXQ8RT4gaW50ZXJzZWN0aW9uKFNldDxPYmplY3Q+IG90aGVyKSA9PiBzZXQuaW50ZXJzZWN0aW9uKG90aGVyKTsKCiAgQG92ZXJyaWRlCiAgU2V0PEU+IHVuaW9uKFNldDxFPiBvdGhlcikgPT4gc2V0LnVuaW9uKG90aGVyKTsKCiAgQG92ZXJyaWRlCiAgU2V0PEU+IGRpZmZlcmVuY2UoU2V0PE9iamVjdD4gb3RoZXIpID0+IHNldC5kaWZmZXJlbmNlKG90aGVyKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBjbGVhcigpID0+IHNldC5jbGVhcigpOwoKICBAb3ZlcnJpZGUKICBTZXQ8RT4gdG9TZXQoKSA9PiBzZXQudG9TZXQoKTsKfQoKLy8vIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHJ1bnRpbWUgdHlwZSBvZiBbb2JqZWN0XSBpcyBub3QgaW4KLy8vIFtydW50aW1lVHlwZXNdLgovLy8KLy8vIFVzZSB0aGlzIHRvIGdyYWR1YWxseSBidWlsZCB0aGUgc2V0IG9mIGFjdHVhbCBydW50aW1lIHZhbHVlcyBvZiBbb2JqZWN0XQovLy8gYXQgdGhlIGNhbGwgc2l0ZSBieSBydW5uaW5nIHRlc3QgcHJvZ3JhbXMgYW5kIGFkZGluZyB0byBbcnVudGltZVR5cGVzXSB3aGVuCi8vLyBuZXcgdHlwZSBhcmUgZm91bmQuCnZvaWQgYXNzZXJ0VHlwZShTdHJpbmcgbmFtZSwgTGlzdDxTdHJpbmc+IHJ1bnRpbWVUeXBlcywgdmFyIG9iamVjdCwKICAgIHtib29sIHNob3dPYmplY3RzOiBmYWxzZX0pIHsKICBTdHJpbmcgcnVudGltZVR5cGUgPSAnJHtvYmplY3QucnVudGltZVR5cGV9JzsKICBpZiAocnVudGltZVR5cGVzICE9IG51bGwgJiYgcnVudGltZVR5cGVzLmNvbnRhaW5zKHJ1bnRpbWVUeXBlKSkgcmV0dXJuOwogIHRocm93ICckbmFtZTogJHJ1bnRpbWVUeXBlJwogICAgICAnJHtzaG93T2JqZWN0cyA/ICcgKCRvYmplY3QpJyA6ICcnfSc7Cn0KCi8vLyBDYWxsYmFjayBmb3IgdGhlIFthZGRDYWxsYmFja10gb2YgW0RlYnVnTWFwXSB0aGF0IHRocm93cyBhbiBleGNlcHRpb24gaWYKLy8vIHRoZSBydW50aW1lIHR5cGUgb2Yga2V5L3ZhbHVlIHBhaXJzIGFyZSBub3QgaW4gW3J1bnRpbWVUeXBlc10uCi8vLwovLy8gVXNlIHRoaXMgdG8gZ3JhZHVhbGx5IGJ1aWxkIHRoZSBzZXQgb2YgYWN0dWFsIHJ1bnRpbWUgdmFsdWVzIG9mIGtleS92YWx1ZQovLy8gcGFpcnMgb2YgYSBtYXAgYnkgcnVubmluZyB0ZXN0IHByb2dyYW1zIGFuZCBhZGRpbmcgdG8gW3J1bnRpbWVUeXBlc10gd2hlbgovLy8gbmV3IHR5cGUgYXJlIGZvdW5kLgpjbGFzcyBNYXBUeXBlQXNzZXJ0ZXIgewogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcnVudGltZVR5cGVzOwogIGZpbmFsIGJvb2wgc2hvd09iamVjdHM7CgogIGNvbnN0IE1hcFR5cGVBc3NlcnRlcih0aGlzLm5hbWUsIHRoaXMucnVudGltZVR5cGVzLAogICAgICB7Ym9vbCB0aGlzLnNob3dPYmplY3RzOiBmYWxzZX0pOwoKICB2b2lkIGNhbGwoU3RyaW5nIG1ldGhvZE5hbWUsIHZhciBrZXksIHZhciB2YWx1ZSkgewogICAgY2hlY2soa2V5LCB2YWx1ZSwgJyRtZXRob2ROYW1lOiAnKTsKICB9CgogIHZvaWQgY2hlY2sodmFyIGtleSwgdmFyIHZhbHVlLCBbU3RyaW5nIHRleHQgPSAnJ10pIHsKICAgIFN0cmluZyBrZXlUeXBlID0gJyR7a2V5LnJ1bnRpbWVUeXBlfSc7CiAgICBTdHJpbmcgdmFsdWVUeXBlID0gJyR7dmFsdWUucnVudGltZVR5cGV9JzsKICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXNUeXBlcyA9IHJ1bnRpbWVUeXBlc1trZXlUeXBlXTsKICAgIGlmICh2YWx1ZXNUeXBlcyAhPSBudWxsICYmIHZhbHVlc1R5cGVzLmNvbnRhaW5zKHZhbHVlVHlwZSkpIHJldHVybjsKICAgIHRocm93ICckbmFtZTogJHRleHQka2V5VHlwZSA9PiAkdmFsdWVUeXBlJwogICAgICAgICcke3Nob3dPYmplY3RzID8gJyAoJGtleSA9PiAkdmFsdWUpJyA6ICcnfSc7CiAgfQp9CgovLy8gQ2FsbGJhY2sgZm9yIHRoZSBbYWRkQ2FsbGJhY2tdIG9mIFtEZWJ1Z1NldF0gb3IgW0RlYnVnTGlzdF0gIHRoYXQgdGhyb3dzIGFuCi8vLyBleGNlcHRpb24gaWYgdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgZWxlbWVudHMgYXJlIG5vdCBpbiBbcnVudGltZVR5cGVzXS4KLy8vCi8vLyBVc2UgdGhpcyB0byBncmFkdWFsbHkgYnVpbGQgdGhlIHNldCBvZiBhY3R1YWwgcnVudGltZSB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzCi8vLyBvZiBhIGNvbGxlY3Rpb24gYnkgcnVubmluZyB0ZXN0IHByb2dyYW1zIGFuZCBhZGRpbmcgdG8gW3J1bnRpbWVUeXBlc10gd2hlbgovLy8gbmV3IHR5cGUgYXJlIGZvdW5kLgpjbGFzcyBDb2xsZWN0aW9uVHlwZUFzc2VydGVyIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBMaXN0PFN0cmluZz4gcnVudGltZVR5cGVzOwogIGZpbmFsIGJvb2wgc2hvd09iamVjdHM7CgogIGNvbnN0IENvbGxlY3Rpb25UeXBlQXNzZXJ0ZXIodGhpcy5uYW1lLCB0aGlzLnJ1bnRpbWVUeXBlcywKICAgICAge2Jvb2wgdGhpcy5zaG93T2JqZWN0czogZmFsc2V9KTsKCiAgdm9pZCBjYWxsKFN0cmluZyBtZXRob2ROYW1lLCB2YXIgZWxlbWVudCwgXykgewogICAgY2hlY2soZWxlbWVudCwgJyRtZXRob2ROYW1lOiAnKTsKICB9CgogIHZvaWQgY2hlY2sodmFyIGVsZW1lbnQsIFtTdHJpbmcgdGV4dCA9ICcnXSkgewogICAgU3RyaW5nIGVsZW1lbnRUeXBlID0gJyR7ZWxlbWVudC5ydW50aW1lVHlwZX0nOwogICAgaWYgKHJ1bnRpbWVUeXBlcy5jb250YWlucyhlbGVtZW50VHlwZSkpIHJldHVybjsKICAgIHRocm93ICckbmFtZTogJHRleHQkZWxlbWVudFR5cGUnCiAgICAgICAgJyR7c2hvd09iamVjdHMgPyAnICgkZWxlbWVudCknIDogJyd9JzsKICB9Cn0Kge8ATk48AUMBLB0iJSABTx8mBgQBLh4hBAEMQgwlKwQBDD4BDC8BDCYkKwYcBAEMJysYKTQIEAgEAQw7AQwZIjUGIgQBDBEiMAYXBAEMQAEMKgEMLgEMPQEMNiMEAQxJIAEMJgEMKQEMLwEMODkBDC0hBAEMMCEEAgEwHgEgAQwxAQw6DDkBDEMBDEkBDD8BDDoBDEcBDEUxBAEMPAEMRAEMOAEMKjAEAQwmAQwlAQwoAQwuAQwvAQxJAQwvAQxJAQwhAQwfAQwjAQw1NgQBDDQ1BAEMNzIBDDcBDEsBDDkBDCwCAUEdIAFDFQEgAQwyDDUBDCsBDCoZBAEMHhoEAQwdGQQBDCEBDCMdBAEMFh8nBhUEAQwmIjAGGwQBDC0BDDwBDDIBDEsBDDskAQxPAQw7KAEMIAEMRAEMNCUEAQxQAQwzAQwxAQwnAQxEAQxEAQxFAQxJAQxRNAQBDCkiBAEMNisEAQxDMAQBDCcCAT8dATkBHgEMMAw2AQwWHycGGwQBDCYbBAEMMgEMMQEMSAEMSAEMQwEMQwEMRgEMRQEMMgEMQQEMHwEMIQIBQhQETVAYRCEwSh4sAgFNQwROThgYFTAaATYnATUoBAE3Ky82SC81BAIBUE0EUU8YHxUjGgE9JwExJQQBMDM0JS8EAgEycGFja2FnZTpjb21waWxlci9zcmMvaGVscGVycy9kZWJ1Z19jb2xsZWN0aW9uLmRhcnQ4c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaGVscGVycy9leHBlbnNpdmVfbWFwLmRhcnSLwC8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgImRhcnQ6Y29sbGVjdGlvbiI7CgovLy8gVGhlIGV4cGVuc2l2ZSBtYXAgaXMgYSBkYXRhIHN0cnVjdHVyZSB1c2VmdWwgZm9yIHRyYWNraW5nIGRvd24KLy8vIGV4Y2Vzc2l2ZSBtZW1vcnkgdXNhZ2UgZHVlIHRvIGxhcmdlIG1hcHMuIEl0IGFjdHMgYXMgYW4gb3JkaW5hcnkKLy8vIGhhc2ggbWFwLCBidXQgaXQgdXNlcyAxMCB0aW1lcyBtb3JlIG1lbW9yeSAoYnkgZGVmYXVsdCkuCmNsYXNzIEV4cGVuc2l2ZU1hcDxLLCBWPiBleHRlbmRzIE1hcEJhc2U8SywgVj4gewogIGZpbmFsIExpc3QgX21hcHM7CgogIEV4cGVuc2l2ZU1hcChbaW50IGNvcGllcyA9IDEwXSkgOiBfbWFwcyA9IG5ldyBMaXN0KGNvcGllcykgewogICAgYXNzZXJ0KGNvcGllcyA+IDApOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbWFwcy5sZW5ndGg7IGkrKykgewogICAgICBfbWFwc1tpXSA9IG5ldyBNYXA8SywgVj4oKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoID0+IF9tYXBzWzBdLmxlbmd0aDsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0VtcHR5ID0+IF9tYXBzWzBdLmlzRW1wdHk7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfbWFwc1swXS5pc05vdEVtcHR5OwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PiBfbWFwc1swXS5rZXlzOwogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgPT4gX21hcHNbMF0udmFsdWVzOwoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpID0+IF9tYXBzWzBdLmNvbnRhaW5zS2V5KGtleSk7CiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgPT4gX21hcHNbMF0uY29udGFpbnNWYWx1ZSh2YWx1ZSk7CgogIEBvdmVycmlkZQogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgPT4gX21hcHNbMF1ba2V5XTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoKHZvaWQgYWN0aW9uKEsga2V5LCBWIHZhbHVlKSkgewogICAgX21hcHNbMF0uZm9yRWFjaChhY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX21hcHMubGVuZ3RoOyBpKyspIHsKICAgICAgX21hcHNbaV1ba2V5XSA9IHZhbHVlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgViBwdXRJZkFic2VudChLIGtleSwgViBpZkFic2VudCgpKSB7CiAgICBpZiAoY29udGFpbnNLZXkoa2V5KSkgcmV0dXJuIHRoaXNba2V5XTsKICAgIFYgdmFsdWUgPSBpZkFic2VudCgpOwogICAgdGhpc1trZXldID0gdmFsdWU7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX21hcHMubGVuZ3RoOyBpKyspIHsKICAgICAgX21hcHNbaV0uYWRkQWxsKG90aGVyKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIFYgcmVzdWx0ID0gX21hcHNbMF0ucmVtb3ZlKGtleSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IF9tYXBzLmxlbmd0aDsgaSsrKSB7CiAgICAgIF9tYXBzW2ldLnJlbW92ZShrZXkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xlYXIoKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9tYXBzLmxlbmd0aDsgaSsrKSB7CiAgICAgIF9tYXBzW2ldLmNsZWFyKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8S1IsIFZSPiBjYXN0PEtSLCBWUj4oKSA9PiBNYXAuY2FzdEZyb208SywgViwgS1IsIFZSPih0aGlzKTsKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZ2V0IGVudHJpZXMgPT4gX21hcHNbMF0uZW50cmllczsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRFbnRyaWVzKEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBlbnRyaWVzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9tYXBzLmxlbmd0aDsgaSsrKSB7CiAgICAgIF9tYXBzW2ldLmFkZEVudHJpZXMoZW50cmllcyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8S1IsIFZSPiBtYXA8S1IsIFZSPihNYXBFbnRyeTxLUiwgVlI+IHRyYW5zZm9ybShLIGtleSwgViB2YWx1ZSkpID0+CiAgICAgIF9tYXBzWzBdLm1hcCh0cmFuc2Zvcm0pOwoKICBAb3ZlcnJpZGUKICBWIHVwZGF0ZShLIGtleSwgViB1cGRhdGUoViB2YWx1ZSksIHtWIGlmQWJzZW50KCl9KSB7CiAgICBWIHJlc3VsdDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX21hcHMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0ID0gX21hcHNbaV0udXBkYXRlKGtleSwgdXBkYXRlLCBpZkFic2VudDogaWZBYnNlbnQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbWFwcy5sZW5ndGg7IGkrKykgewogICAgICBfbWFwc1tpXS51cGRhdGVBbGwodXBkYXRlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEsga2V5LCBWIHZhbHVlKSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbWFwcy5sZW5ndGg7IGkrKykgewogICAgICBfbWFwc1tpXS5yZW1vdmVXaGVyZSh0ZXN0KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICJleHBlbnNpdmUoJHtfbWFwc1swXX14JHtfbWFwcy5sZW5ndGh9KSI7Cn0KfgBOTjwBGgFDRT0xFAE/GC0iBgQBDCUMKAwuAQwpDC0BDD0MRQEMLgEMLh4EAQwmLR0GBAEMJywaFxIEAQwhLR4GBAEMGSUtHAYTBAEMES0YBgQBDEIMPAEMNi0kBgQBDEkfAQw3Di1BBhMEAQwtLSIGBAEMMC0iBgQBDEECAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy9oZWxwZXJzL2V4cGVuc2l2ZV9tYXAuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9oZWxwZXJzL2V4cGVuc2l2ZV9zZXQuZGFydI2fLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCi8vLyBUaGUgZXhwZW5zaXZlIHNldCBpcyBhIGRhdGEgc3RydWN0dXJlIHVzZWZ1bCBmb3IgdHJhY2tpbmcgZG93bgovLy8gZXhjZXNzaXZlIG1lbW9yeSB1c2FnZSBkdWUgdG8gbGFyZ2Ugc2V0cy4gSXQgYWN0cyBhcyBhbiBvcmRpbmFyeQovLy8gaGFzaCBzZXQsIGJ1dCBpdCB1c2VzIDEwIHRpbWVzIG1vcmUgbWVtb3J5IChieSBkZWZhdWx0KS4KY2xhc3MgRXhwZW5zaXZlU2V0PEU+IGV4dGVuZHMgU2V0QmFzZTxFPiB7CiAgZmluYWwgTGlzdCBfc2V0czsKCiAgRXhwZW5zaXZlU2V0KFtpbnQgY29waWVzID0gMTBdKSA6IF9zZXRzID0gbmV3IExpc3QoY29waWVzKSB7CiAgICBhc3NlcnQoY29waWVzID4gMCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIF9zZXRzW2ldID0gbmV3IFNldDxFPigpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gX3NldHNbMF0ubGVuZ3RoOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX3NldHNbMF0uaXNFbXB0eTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9zZXRzWzBdLmlzTm90RW1wdHk7CgogIEBvdmVycmlkZQogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBfc2V0c1swXS5pdGVyYXRvcjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWlucyhPYmplY3Qgb2JqZWN0KSA9PiBfc2V0c1swXS5jb250YWlucyhvYmplY3QpOwogIEBvdmVycmlkZQogIEUgbG9va3VwKE9iamVjdCBvYmplY3QpID0+IF9zZXRzWzBdLmxvb2t1cChvYmplY3QpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oRSBlbGVtZW50KSkgewogICAgX3NldHNbMF0uZm9yRWFjaChhY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhZGQoRSBlbGVtZW50KSB7CiAgICBib29sIHJlc3VsdCA9IF9zZXRzWzBdLmFkZChlbGVtZW50KTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgX3NldHMubGVuZ3RoOyBpKyspIHsKICAgICAgX3NldHNbaV0uYWRkKGVsZW1lbnQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IG9iamVjdHMpIHsKICAgIGZvciAoRSBlYWNoIGluIG9iamVjdHMpIHsKICAgICAgYWRkKGVhY2gpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCByZW1vdmUoT2JqZWN0IG9iamVjdCkgewogICAgYm9vbCByZXN1bHQgPSBfc2V0c1swXS5yZW1vdmUob2JqZWN0KTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgX3NldHMubGVuZ3RoOyBpKyspIHsKICAgICAgX3NldHNbaV0ucmVtb3ZlKG9iamVjdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbGVhcigpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NldHMubGVuZ3RoOyBpKyspIHsKICAgICAgX3NldHNbaV0uY2xlYXIoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVtb3ZlQWxsKEl0ZXJhYmxlPE9iamVjdD4gb2JqZWN0c1RvUmVtb3ZlKSB7CiAgICBmb3IgKHZhciBlYWNoIGluIG9iamVjdHNUb1JlbW92ZSkgewogICAgICByZW1vdmUoZWFjaCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICByZW1vdmVBbGwodGhpcy50b0xpc3QoKS53aGVyZSgoZSkgPT4gdGVzdChlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgcmVtb3ZlQWxsKHRvTGlzdCgpLndoZXJlKChlKSA9PiAhdGVzdChlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc0FsbChJdGVyYWJsZTxPYmplY3Q+IG90aGVyKSB7CiAgICBmb3IgKE9iamVjdCBvYmplY3QgaW4gb3RoZXIpIHsKICAgICAgaWYgKCF0aGlzLmNvbnRhaW5zKG9iamVjdCkpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgU2V0IF9uZXdTZXQoKSA9PiBuZXcgRXhwZW5zaXZlU2V0KF9zZXRzLmxlbmd0aCk7CgogIEBvdmVycmlkZQogIFNldDxFPiBpbnRlcnNlY3Rpb24oU2V0PE9iamVjdD4gb3RoZXIpIHsKICAgIFNldDxFPiByZXN1bHQgPSBfbmV3U2V0KCk7CiAgICBpZiAob3RoZXIubGVuZ3RoIDwgdGhpcy5sZW5ndGgpIHsKICAgICAgZm9yICh2YXIgZWxlbWVudCBpbiBvdGhlcikgewogICAgICAgIGlmICh0aGlzLmNvbnRhaW5zKGVsZW1lbnQpKSByZXN1bHQuYWRkKGVsZW1lbnQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgICAgaWYgKG90aGVyLmNvbnRhaW5zKGVsZW1lbnQpKSByZXN1bHQuYWRkKGVsZW1lbnQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgU2V0PEU+IHVuaW9uKFNldDxFPiBvdGhlcikgewogICAgcmV0dXJuIF9uZXdTZXQoKS4uYWRkQWxsKHRoaXMpLi5hZGRBbGwob3RoZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU2V0PEU+IGRpZmZlcmVuY2UoU2V0PE9iamVjdD4gb3RoZXIpIHsKICAgIFNldDxFPiByZXN1bHQgPSBfbmV3U2V0KCk7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICghb3RoZXIuY29udGFpbnMoZWxlbWVudCkpIHJlc3VsdC5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGUgb2JqZWN0c1RvUmV0YWluKSB7CiAgICBTZXQgcmV0YWluU2V0OwogICAgaWYgKG9iamVjdHNUb1JldGFpbiBpcyBTZXQpIHsKICAgICAgcmV0YWluU2V0ID0gb2JqZWN0c1RvUmV0YWluOwogICAgfSBlbHNlIHsKICAgICAgcmV0YWluU2V0ID0gb2JqZWN0c1RvUmV0YWluLnRvU2V0KCk7CiAgICB9CiAgICByZXRhaW5XaGVyZShyZXRhaW5TZXQuY29udGFpbnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU2V0PEU+IHRvU2V0KCkgewogICAgdmFyIHJlc3VsdCA9IG5ldyBFeHBlbnNpdmVTZXQ8RT4oX3NldHMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NldHMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0Ll9zZXRzW2ldID0gX3NldHNbaV0udG9TZXQoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiZXhwZW5zaXZlKCR7X3NldHNbMF19eCR7X3NldHMubGVuZ3RofSkiOwp9CoCYAE5OPAEaAUNFPSsUAT8YLR8GBAEMJQwoDC4BDDEBDD0MNgEMKR4EAQwYKS0dBhMEAQwlHhEGBAEMHystHwYTBAEMES0YBgQBDDUoFAYEAQwrNAQBDCswBAEMLSMwBhEEATMBDCsfJiM5CA0gOggGEwQBDB8zBAEMKR8eOQYTBAEMLRMiIw0rBiUEAQwTNC0qBhMEAQxBAgEvcGFja2FnZTpjb21waWxlci9zcmMvaGVscGVycy9leHBlbnNpdmVfc2V0LmRhcnQwc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaGVscGVycy9zdGF0cy5kYXJ0wABcHS8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRXZlbnRTaW5rOwppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CmltcG9ydCAnZGFydDpjb252ZXJ0JzsKCmltcG9ydCAnLi4vLi4vY29tcGlsZXIuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbXBpbGVyLmRhcnQnIHNob3cgQ29tcGlsZXI7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnOwoKLy8gSGVscGVyIG1ldGhvZHMgZm9yIHN0YXRpc3RpY3MuCgovLy8gQ3VycmVudCBzdGF0cyBjb2xsZWN0b3IuIFVzZSBbZW5hYmxlU3RhdHNPdXRwdXRdIHRvIGVuYWJsZSByZWNvcmRpbmcgb2YKLy8vIHN0YXRzLgpTdGF0cyBnZXQgc3RhdHMgewogIGVuYWJsZURlYnVnTW9kZSgpOwogIGlmIChfc3RhdHMgPT0gbnVsbCkgewogICAgX3N0YXRzID0gY29uc3QgU3RhdHMoKTsKICB9CiAgcmV0dXJuIF9zdGF0czsKfQoKU3RhdHMgX3N0YXRzOwoKLy8vIEVuYWJsZSByZWNvcmRpbmcgb2Ygc3RhdHMuIFVzZSBbU3RhdHMuZHVtcFN0YXRzXSB0byBvdXRwdXQgdGhlIHJlY29yZCBzdGF0cy4KLy8vCi8vLyBQYXNzIHRoZSBbb3V0cHV0UHJvdmlkZXJdIG9mIFtDb21waWxlcl0gdG8gZ2VuZXJhdGUgc3RhdHMgaW50byBhIHNlcGFyYXRlCi8vLyBmaWxlIHVzaW5nIFtuYW1lXSBhbmQgW2V4dGVuc2lvbl0gZm9yIHRoZSBmaWxlbmFtZS4gSWYgb21pdHRlZCwgc3RhdHMgYXJlCi8vLyBwcmludGVkIG9uIHN0YW5kYXJkIG91dC4KLy8vCi8vLyBJZiBbeG1sXSBpcyBgdHJ1ZWAsIHN0YXRzIG91dHB1dCBpcyBmb3JtYXR0ZWQgYXMgWE1MIHdpdGggYSBkZWZhdWx0Ci8vLyBleHRlbnNpb24gb2YgJ3htbCcsIG90aGVyd2lzZSB0aGUgb3V0cHV0IGlzIGluZGVudGVkIHRleHQgd2l0aCBhIGRlZmF1bHQKLy8vIGV4dGVuc2lvbiBvZiAnbG9nJy4Kdm9pZCBlbmFibGVTdGF0c091dHB1dCgKICAgIHtDb21waWxlck91dHB1dFByb3ZpZGVyIG91dHB1dFByb3ZpZGVyLAogICAgYm9vbCB4bWw6IHRydWUsCiAgICBTdHJpbmcgbmFtZTogJ3N0YXRzJywKICAgIFN0cmluZyBleHRlbnNpb24sCiAgICBpbnQgZXhhbXBsZXM6IDEwfSkgewogIGlmIChfc3RhdHMgIT0gbnVsbCkgewogICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ1N0YXRzIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLicpOwogIH0KICBlbmFibGVEZWJ1Z01vZGUoKTsKCiAgU3RhdHNPdXRwdXQgb3V0cHV0OwogIGlmIChvdXRwdXRQcm92aWRlciAhPSBudWxsKSB7CiAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwpIHsKICAgICAgZXh0ZW5zaW9uID0geG1sID8gJ3htbCcgOiAnbG9nJzsKICAgIH0KICAgIG91dHB1dCA9IG5ldyBTaW5rT3V0cHV0KG91dHB1dFByb3ZpZGVyKG5hbWUsIGV4dGVuc2lvbikpOwogIH0gZWxzZSB7CiAgICBvdXRwdXQgPSBjb25zdCBEZWJ1Z091dHB1dCgpOwogIH0KICBTdGF0c1ByaW50ZXIgcHJpbnRlcjsKICBpZiAoeG1sKSB7CiAgICBwcmludGVyID0gbmV3IFhNTFByaW50ZXIob3V0cHV0OiBvdXRwdXQsIGV4YW1wbGVzOiBleGFtcGxlcyk7CiAgfSBlbHNlIHsKICAgIHByaW50ZXIgPSBuZXcgQ29uc29sZVByaW50ZXIob3V0cHV0OiBvdXRwdXQsIGV4YW1wbGVzOiBleGFtcGxlcyk7CiAgfQogIF9zdGF0cyA9IG5ldyBBY3RpdmVTdGF0cyhwcmludGVyKTsKfQoKLy8vIEludGVyZmFjZSBmb3IgZ2F0aGVyaW5nIGFuZCBkaXNwbGF5IG9mIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uLgovLy8gVGhpcyBjbGFzcyBzZXJ2ZXMgYXMgdGhlIG5vb3AgY29sbGVjdG9yLgpjbGFzcyBTdGF0cyB7CiAgY29uc3QgU3RhdHMoKTsKCiAgLy8vIFJlZ2lzdGVycyBba2V5XSwgW3ZhbHVlXSBwYWlyIGluIHRoZSBtYXAgW2lkXS4gSWYgW2Zyb21FeGlzdGluZ10gaXMKICAvLy8gbm9uLW51bGwgYW5kIFtrZXldIGFscmVhZHkgZXhpc3RzLCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIFtrZXldIHdpbGwKICAvLy8gYmUgdGhlIHJldHVybiB2YWx1ZSBvZiBbZnJvbUV4aXN0aW5nXSB3aGVuIGNhbGxlZCB3aXRoIHRoZSBleGlzdGluZyB2YWx1ZS4KICAvLy8KICAvLy8gVGhlIHJlY29yZGVkIGluZm9ybWF0aW9uIGlzIG5vdCBkdW1wZWQgYXV0b21hdGljYWxseS4KICB2b2lkIHJlY29yZE1hcChpZCwga2V5LCB2YWx1ZSwge2Zyb21FeGlzdGluZyh2YWx1ZSl9KSB7fQoKICAvLy8gUmV0dXJucyB0aGUgbWFwIFtpZF0gcmVjb3JkZWQgd2l0aCBbcmVjb3JkTWFwXS4KICBNYXAgZ2V0TWFwKGlkKSA9PiBjb25zdCB7fTsKCiAgLy8vIFJlZ2lzdGVycyBbZWxlbWVudF0gYXMgYW4gZWxlbWVudCBvZiB0aGUgbGlzdCBbaWRdLiBJZiBwcm92aWRlZCwgW2RhdGFdCiAgLy8vIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGF0YSBmb3IgW2VsZW1lbnRdLgogIC8vLwogIC8vLyBUaGUgcmVjb3JkZWQgaW5mb3JtYXRpb24gaXMgZHVtcGVkIGF1dG9tYXRpY2FsbHkgb24gY2FsbCB0byBbZHVtcFN0YXRzXS4KICAvLy8KICAvLy8gRXhhbXBsZToKICAvLy8gICBDYWxsaW5nIFtyZWNvcmRFbGVtZW50XSBsaWtlIHRoaXM6CiAgLy8vICAgICByZWNvcmRFbGVtZW50KCdmb28nLCAnYScsIGRhdGE6ICdmaXJzdC1hLWRhdGEnKTsKICAvLy8gICAgIHJlY29yZEVsZW1lbnQoJ2ZvbycsICdhJywgZGF0YTogJ3NlY29uZC1hLWRhdGEnKTsKICAvLy8gICAgIHJlY29yZEVsZW1lbnQoJ2ZvbycsICdiJyk7CiAgLy8vICAgICByZWNvcmRFbGVtZW50KCdiYXInLCAnYScsIGRhdGE6ICd0aGlyZC1hLWRhdGEnKTsKICAvLy8gICAgIHJlY29yZEVsZW1lbnQoJ2JhcicsICdjJyk7CiAgLy8vICAgd2lsbCByZXN1bHQgaW4gYSBkdW1wIGxpa2UgdGhpczoKICAvLy8gICAgIGZvbzogMgogIC8vLyAgICAgIHZhbHVlPWEgZGF0YT1zZWNvbmQtYS1kYXRhCiAgLy8vICAgICAgYgogIC8vLyAgICAgYmFyOiAyCiAgLy8vICAgICAgdmFsdWU9YSBkYXRhPXRoaXJkLWEtZGF0YQogIC8vLyAgICAgIGMKICAvLy8KICB2b2lkIHJlY29yZEVsZW1lbnQoaWQsIGVsZW1lbnQsIHtkYXRhfSkge30KCiAgLy8vIFJldHVybnMgdGhlIGxpc3QgW2lkXSByZWNvcmRlZCB3aXRoIFtyZWNvcmRFbGVtZW50XS4KICBJdGVyYWJsZSBnZXRMaXN0KFN0cmluZyBpZCkgPT4gY29uc3QgW107CgogIC8vLyBSZWdpc3RlcnMgW3ZhbHVlXSBhcyBhbiBvY2N1cnJlbmNlIG9mIFtpZF0uIElmIHBhc3NlZCwgW2V4YW1wbGVdIHByb3ZpZGVzCiAgLy8vIGFuIGV4YW1wbGUgZGF0YSBvZiB0aGUgb2NjdXJyZW5jZSBvZiBbdmFsdWVdLgogIC8vLwogIC8vLyBUaGUgcmVjb3JkZWQgaW5mb3JtYXRpb24gaXMgZHVtcGVkIGF1dG9tYXRpY2FsbHkgb24gY2FsbCB0byBbZHVtcFN0YXRzXS4KICAvLy8KICAvLy8gRXhhbXBsZToKICAvLy8gICBDYWxsaW5nIFtyZWNvcmRGcmVxdWVuY3ldIGxpa2UgdGhpczoKICAvLy8gICAgIHJlY29yZEZyZXF1ZW5jeSgnZm9vJywgJ2EnLCAnZmlyc3QtYS1kYXRhJyk7CiAgLy8vICAgICByZWNvcmRGcmVxdWVuY3koJ2ZvbycsICdhJywgJ3NlY29uZC1hLWRhdGEnKTsKICAvLy8gICAgIHJlY29yZEZyZXF1ZW5jeSgnYmFyJywgJ2InLCAnZmlyc3QtYi1kYXRhJyk7CiAgLy8vICAgICByZWNvcmRGcmVxdWVuY3koJ2ZvbycsICdjJyk7CiAgLy8vICAgICByZWNvcmRGcmVxdWVuY3koJ2JhcicsICdiJyk7CiAgLy8vICAgd2lsbCByZXN1bHQgaW4gYSBkdW1wIGxpa2UgdGhpczoKICAvLy8gICAgIGZvbzoKICAvLy8gICAgICBhOiAyCiAgLy8vICAgICAgIGZpcnN0LWEtZGF0YQogIC8vLyAgICAgICBzZWNvbmQtYS1kYXRhCiAgLy8vICAgICAgYzogMQogIC8vLyAgICAgYmFyOgogIC8vLyAgICAgIGI6IDIKICAvLy8gICAgICAgZmlyc3QtYi1kYXRhCiAgLy8vCiAgdm9pZCByZWNvcmRGcmVxdWVuY3koaWQsIHZhbHVlLCBbZXhhbXBsZV0pIHt9CgogIC8vLyBGb3IgZWFjaCBrZXkvdmFsdWUgcGFpciBpbiBbbWFwXSB0aGUgZWxlbWVudHMgaW4gdGhlIHZhbHVlIGFyZSByZWdpc3RlcmVkCiAgLy8vIGFzIGV4YW1wbGVzIG9mIG9jY3VycmVuY2VzIG9mIHRoZSBrZXkgaW4gW2lkXS4KICB2b2lkIHJlY29yZEZyZXF1ZW5jaWVzKGlkLCBNYXA8ZHluYW1pYywgSXRlcmFibGU+IG1hcCkge30KCiAgLy8vIFJldHVybnMgdGhlIGV4YW1wbGVzIGdpdmVuIGZvciB0aGUgb2NjdXJyZW5jZSBvZiBbdmFsdWVdIGZvciBbaWRdLgogIEl0ZXJhYmxlIHJlY29yZGVkRnJlcXVlbmNpZXMoaWQsIHZhbHVlKSA9PiBjb25zdCBbXTsKCiAgLy8vIEluY3JlYXNlcyB0aGUgY291bnRlciBbaWRdIGJ5IDEuIElmIHByb3ZpZGVkLCBbZXhhbXBsZV0gaXMgdXNlZCBhcyBhbgogIC8vLyBleGFtcGxlIG9mIHRoZSBjb3VudCBhbmQgW2RhdGFdIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yCiAgLy8vIFtleGFtcGxlXS4KICAvLy8KICAvLy8gVGhlIHJlY29yZGVkIGluZm9ybWF0aW9uIGlzIGR1bXBlZCBhdXRvbWF0aWNhbGx5IG9uIGNhbGwgdG8gW2R1bXBTdGF0c10uCiAgLy8vCiAgLy8vIEV4YW1wbGU6CiAgLy8vICAgQ2FsbGluZyBbcmVjb3JkQ291bnRlcl0gbGlrZSB0aGlzOgogIC8vLyAgICAgcmVjb3JkQ291bnRlcignZm9vJywgJ2EnKTsKICAvLy8gICAgIHJlY29yZENvdW50ZXIoJ2ZvbycsICdhJyk7CiAgLy8vICAgICByZWNvcmRDb3VudGVyKCdmb28nLCAnYicpOwogIC8vLyAgICAgcmVjb3JkQ291bnRlcignYmFyJywgJ2MnLCAnZmlyc3QtYy1kYXRhJyk7CiAgLy8vICAgICByZWNvcmRDb3VudGVyKCdiYXInLCAnYycsICdzZWNvbmQtYy1kYXRhJyk7CiAgLy8vICAgICByZWNvcmRDb3VudGVyKCdiYXInLCAnZCcpOwogIC8vLyAgICAgcmVjb3JkQ291bnRlcignYmFyJywgJ2QnKTsKICAvLy8gICAgIHJlY29yZENvdW50ZXIoJ2JheicpOwogIC8vLyAgICAgcmVjb3JkQ291bnRlcignYmF6Jyk7CiAgLy8vICAgd2lsbCByZXN1bHQgaW4gYSBkdW1wIGxpa2UgdGhpczoKICAvLy8gICAgIGZvbzogMwogIC8vLyAgICAgIGNvdW50PTIgZXhhbXBsZT1hCiAgLy8vICAgICAgY291bnQ9MSBleGFtcGxlPWIKICAvLy8gICAgIGJhcjogNAogIC8vLyAgICAgIGNvdW50PTIgZXhhbXBsZXM9MgogIC8vLyAgICAgICBjOgogIC8vLyAgICAgICAgZmlyc3QtYy1kYXRhCiAgLy8vICAgICAgICBzZWNvbmQtYy1kYXRhCiAgLy8vICAgICAgIGQKICAvLy8gICAgIGJhejogMgogIC8vLwogIHZvaWQgcmVjb3JkQ291bnRlcihpZCwgW2V4YW1wbGUsIGRhdGFdKSB7fQoKICAvLy8gUmVjb3JkcyB0aGUgY3VycmVudCBzdGFjayB0cmFjZSB1bmRlciB0aGUga2V5IFtpZF0uIE9ubHkgZXZlcnkKICAvLy8gW3NhbXBsZUZyZXF1ZW5jeV0gY2FsbCB3aXRoIHRoZSBzYW1lIGlkIGlzIHJlY29yZGVkLCBhbmQgaWYgb21pdHRlZAogIC8vLyBbc3RhY2tUcmFjZVNhbXBsZUZyZXF1ZW5jeV0gaXMgdXNlZC4KICB2b2lkIHJlY29yZFRyYWNlKGlkLCB7aW50IHNhbXBsZUZyZXF1ZW5jeX0pIHt9CgogIC8vLyBUaGUgZGVmYXVsdCBzYW1wbGUgZnJlcXVlbmN5IHVzZWQgZm9yIHJlY29yZGluZyBzdGFjayB0cmFjZXMuCiAgaW50IGdldCBzdGFja1RyYWNlU2FtcGxlRnJlcXVlbmN5ID0+IDA7CgogIC8vLyBTZXQgdGhlIGRlZmF1bHQgc2FtcGxlIGZyZXF1ZW5jeSB1c2VkIGZvciByZWNvcmRpbmcgc3RhY2sgdHJhY2VzLgogIHZvaWQgc2V0IHN0YWNrVHJhY2VTYW1wbGVGcmVxdWVuY3koaW50IHZhbHVlKSB7fQoKICAvLy8gRHVtcHMgdGhlIHN0YXRzIGZvciB0aGUgcmVjb3JkZWQgZnJlcXVlbmNpZXMsIHNldHMsIGFuZCBjb3VudGVycy4gSWYKICAvLy8gcHJvdmlkZWQgW2JlZm9yZUNsb3NlXSBpcyBjYWxsZWQgYmVmb3JlIGNsb3NpbmcgdGhlIGR1bXAgb3V0cHV0LiBUaGlzCiAgLy8vIGNhbiBiZSB1c2VkIHRvIGluY2x1ZGUgY29ycmVsYXRpb25zIG9uIHRoZSBjb2xsZWN0ZWQgZGF0YSB0aHJvdWdoCiAgLy8vIFtkdW1wQ29ycmVsYXRpb25dLgogIHZvaWQgZHVtcFN0YXRzKHt2b2lkIGJlZm9yZUNsb3NlKCl9KSB7fQoKICAvLy8gUHJpbnRzIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBlbGVtZW50cyBvZiBbYV0gYW5kIFtiXS4KICAvLy8KICAvLy8gVGhyZWUgc2V0cyBhcmUgb3V0cHV0IHVzaW5nIFtpZEFdIGFuZCBbaWRCXSBhcyBsYWJlbHMgZm9yIHRoZSBlbGVtZW50cwogIC8vLyBbYV0gYW5kIFtiXToKICAvLy8KICAvLy8gICAnaWRBICYmIGlkQicgbGlzdHMgdGhlIGVsZW1lbnRzIGJvdGggaW4gW2FdIGFuZCBbYl0sCiAgLy8vICAgJyFpZEEgJiYgaWRCJyBsaXN0cyB0aGUgZWxlbWVudHMgbm90IGluIFthXSBidXQgaW4gW2JdLCBhbmQKICAvLy8gICAnaWRBICYmICFpZEInIGxpc3RzIHRoZSBlbGVtZW50cyBpbiBbYV0gYnV0IG5vdCBpbiBbYl0uCiAgLy8vCiAgLy8vIElmIFtkYXRhQV0gYW5kL29yIFtkYXRhQl0gYXJlIHByb3ZpZGVkLCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZQogIC8vLyBlbGVtZW50cyBhcmUgbG9va2VkIHVwIGluIFtkYXRhQV0gb3IgW2RhdGFCXSB1c2luZyBbZGF0YUFdIGFzIHRoZSBwcmltYXJ5CiAgLy8vIHNvdXJjZS4KICB2b2lkIGR1bXBDb3JyZWxhdGlvbihpZEEsIEl0ZXJhYmxlIGEsIGlkQiwgSXRlcmFibGUgYiwKICAgICAge01hcCBkYXRhQSwgTWFwIGRhdGFCfSkge30KfQoKLy8vIEludGVyZmFjZSBmb3IgcHJpbnRpbmcgb3V0cHV0IGRhdGEuCi8vLwovLy8gVGhpcyBjbGFzcyBzZXJ2ZXMgYXMgdGhlIGRpc2FibGVkIG91dHB1dC4KY2xhc3MgU3RhdHNPdXRwdXQgewogIGNvbnN0IFN0YXRzT3V0cHV0KCk7CgogIC8vLyBQcmludCBbdGV4dF0gYXMgb24gYSBzZXBhcmF0ZSBsaW5lLgogIHZvaWQgcHJpbnRsbihTdHJpbmcgdGV4dCkge30KfQoKLy8vIE91dHB1dCB0byB0aGUgW2RlYnVnUHJpbnRdIG1ldGhvZC4KY2xhc3MgRGVidWdPdXRwdXQgaW1wbGVtZW50cyBTdGF0c091dHB1dCB7CiAgY29uc3QgRGVidWdPdXRwdXQoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludGxuKFN0cmluZyB0ZXh0KSA9PiBkZWJ1Z1ByaW50KHRleHQpOwp9CgovLy8gT3V0cHV0IHRvIGFuIFtFdmVudFNpbmtdLiBVc2VkIHRvIG91dHB1dCB0byBhIGZpbGUgdGhyb3VnaCB0aGUKLy8vIFtDb21waWxlck91dHB1dFByb3ZpZGVyXS4KY2xhc3MgU2lua091dHB1dCBpbXBsZW1lbnRzIFN0YXRzT3V0cHV0IHsKICBFdmVudFNpbms8U3RyaW5nPiBzaW5rOwoKICBTaW5rT3V0cHV0KHRoaXMuc2luayk7CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRsbihTdHJpbmcgdGV4dCkgewogICAgc2luay5hZGQodGV4dCk7CiAgICBzaW5rLmFkZCgnXG4nKTsKICB9Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIHByaW50aW5nIHN0YXRzIGNvbGxlY3RlZCBpbiBbU3RhdHNdLgphYnN0cmFjdCBjbGFzcyBTdGF0c1ByaW50ZXIgewogIC8vLyBUaGUgbnVtYmVyIG9mIGV4YW1wbGVzIHByaW50ZXIuIElmIGBudWxsYCBhbGwgZXhhbXBsZXMgYXJlIHByaW50ZWQuCiAgaW50IGdldCBleGFtcGxlcyA9PiAwOwoKICAvLy8gU3RhcnQgYSBncm91cCBbaWRdLgogIHZvaWQgc3RhcnQoU3RyaW5nIGlkKSB7fQoKICAvLy8gQ3JlYXRlIGEgZ3JvdXAgW2lkXSB3aXRoIGNvbnRlbnQgY3JlYXRlZCBieSBbY3JlYXRlR3JvdXBDb250ZW50XS4KICB2b2lkIGdyb3VwKFN0cmluZyBpZCwgdm9pZCBjcmVhdGVHcm91cENvbnRlbnQoKSkgewogICAgc3RhcnQoaWQpOwogICAgY3JlYXRlR3JvdXBDb250ZW50KCk7CiAgICBlbmQoaWQpOwogIH0KCiAgLy8vIEVuZCBhIGdyb3VwIFtpZF0uCiAgdm9pZCBlbmQoU3RyaW5nIGlkKSB7fQoKICAvLy8gU3RhcnQgYSBzdGF0IGVudHJ5IGZvciBbaWRdIHdpdGggYWRkaXRpb25hbCBbZGF0YV0uCiAgdm9pZCBvcGVuKFN0cmluZyBpZCwKICAgICAgW01hcDxTdHJpbmcsIGR5bmFtaWM+IGRhdGEgPSBjb25zdCA8U3RyaW5nLCBkeW5hbWljPnt9XSkge30KCiAgLy8vIENyZWF0ZSBhIHN0YXQgZW50cnkgZm9yIFtpZF0gd2l0aCBhZGRpdGlvbmFsIFtkYXRhXSBhbmQgY29udGVudCBjcmVhdGVkIGJ5CiAgLy8vIFtjcmVhdGVDaGlsZENvbnRlbnRdLgogIHZvaWQgY2hpbGQoU3RyaW5nIGlkLAogICAgICBbTWFwPFN0cmluZywgZHluYW1pYz4gZGF0YSA9IGNvbnN0IDxTdHJpbmcsIGR5bmFtaWM+e30sCiAgICAgIHZvaWQgY3JlYXRlQ2hpbGRDb250ZW50KCldKSB7CiAgICBvcGVuKGlkLCBkYXRhKTsKICAgIGlmIChjcmVhdGVDaGlsZENvbnRlbnQgIT0gbnVsbCkgY3JlYXRlQ2hpbGRDb250ZW50KCk7CiAgICBjbG9zZShpZCk7CiAgfQoKICAvLy8gRW5kIGEgc3RhdCBlbnRyeSBmb3IgW2lkXS4KICB2b2lkIGNsb3NlKFN0cmluZyBpZCkge30KCiAgLy8vIFN0YXJ0cyBhIGdyb3VwIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCiAgdm9pZCBiZWdpbkV4dHJhKCkge30KCiAgLy8vIFN0YXJ0cyBhIGdyb3VwIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCiAgdm9pZCBlbmRFeHRyYSgpIHt9Cn0KCi8vLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBbQ29uc29sZVByaW50ZXJdIGFuZCBbWE1MUHJpbnRlcl0uCmFic3RyYWN0IGNsYXNzIEJhc2VQcmludGVyIGV4dGVuZHMgU3RhdHNQcmludGVyIHdpdGggSW5kZW50YXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIGludCBleGFtcGxlczsKICBmaW5hbCBTdGF0c091dHB1dCBvdXRwdXQ7CgogIEJhc2VQcmludGVyKHt0aGlzLm91dHB1dDogY29uc3QgRGVidWdPdXRwdXQoKSwgdGhpcy5leGFtcGxlczogMTB9KSB7CiAgICBpbmRlbnRhdGlvblVuaXQgPSAiICI7CiAgfQp9CgovLy8gW1N0YXRzUHJpbnRlcl0gdGhhdCBkaXNwbGF5cyBzdGF0cyBpbiBjb25zb2xlIGxpbmVzLgpjbGFzcyBDb25zb2xlUHJpbnRlciBleHRlbmRzIEJhc2VQcmludGVyIHsKICBpbnQgZXh0cmFMZXZlbCA9IDA7CgogIENvbnNvbGVQcmludGVyKHtTdGF0c091dHB1dCBvdXRwdXQ6IGNvbnN0IERlYnVnT3V0cHV0KCksIGludCBleGFtcGxlczogMTB9KQogICAgICA6IHN1cGVyKG91dHB1dDogb3V0cHV0LCBleGFtcGxlczogZXhhbXBsZXMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIG9wZW4oU3RyaW5nIGlkLAogICAgICBbTWFwPFN0cmluZywgZHluYW1pYz4gZGF0YSA9IGNvbnN0IDxTdHJpbmcsIGR5bmFtaWM+e31dKSB7CiAgICBpZiAoZXh0cmFMZXZlbCA+IDApIHJldHVybjsKCiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZShpbmRlbnRhdGlvbik7CiAgICBTdHJpbmcgc3BhY2UgPSAnJzsKICAgIGlmIChkYXRhWyd0aXRsZSddICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJyR7ZGF0YVsndGl0bGUnXX06Jyk7CiAgICAgIHNwYWNlID0gJyAnOwogICAgICBkYXRhLnJlbW92ZSgndGl0bGUnKTsKICAgIH0gZWxzZSBpZiAoZGF0YVsnbmFtZSddICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJyR7ZGF0YVsnbmFtZSddfScpOwogICAgICBzcGFjZSA9ICcgJzsKICAgICAgZGF0YS5yZW1vdmUoJ25hbWUnKTsKICAgIH0KICAgIEl0ZXJhYmxlIG5vbk51bGxWYWx1ZXMgPSBkYXRhLnZhbHVlcy53aGVyZSgodikgPT4gdiAhPSBudWxsKTsKICAgIGlmIChub25OdWxsVmFsdWVzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNiLndyaXRlKCckc3BhY2Uke25vbk51bGxWYWx1ZXMuZmlyc3R9Jyk7CiAgICB9IGVsc2UgewogICAgICBkYXRhLmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgICBzYi53cml0ZSgnJHNwYWNlJGtleT0kdmFsdWUnKTsKICAgICAgICBzcGFjZSA9ICcgJzsKICAgICAgfSk7CiAgICB9CiAgICBvdXRwdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKICAgIGluZGVudE1vcmUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoU3RyaW5nIGlkKSB7CiAgICBpZiAoZXh0cmFMZXZlbCA+IDApIHJldHVybjsKCiAgICBpbmRlbnRMZXNzKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRXh0cmEoKSB7CiAgICBpZiAoZXh0cmFMZXZlbCA9PSAwKSBvdXRwdXQucHJpbnRsbignJGluZGVudGF0aW9uLi4uJyk7CiAgICBleHRyYUxldmVsKys7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEV4dHJhKCkgewogICAgZXh0cmFMZXZlbC0tOwogIH0KfQoKLy8vIFtTdGF0c1ByaW50ZXJdIHRoYXQgZGlzcGxheXMgc3RhdHMgaW4gWE1MIGZvcm1hdC4KY2xhc3MgWE1MUHJpbnRlciBleHRlbmRzIEJhc2VQcmludGVyIHsKICBzdGF0aWMgY29uc3QgSHRtbEVzY2FwZSBlc2NhcGUgPSBjb25zdCBIdG1sRXNjYXBlKCk7CiAgYm9vbCBvcGVuZWQgPSBmYWxzZTsKCiAgWE1MUHJpbnRlcih7b3V0cHV0OiBjb25zdCBEZWJ1Z091dHB1dCgpLCBpbnQgZXhhbXBsZXM6IDEwfSkKICAgICAgOiBzdXBlcihvdXRwdXQ6IG91dHB1dCwgZXhhbXBsZXM6IGV4YW1wbGVzKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzdGFydChTdHJpbmcgaWQpIHsKICAgIGlmICghb3BlbmVkKSB7CiAgICAgIG91dHB1dC5wcmludGxuKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PicpOwogICAgICBvcGVuZWQgPSB0cnVlOwogICAgfQogICAgb3BlbihpZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZChTdHJpbmcgaWQpIHsKICAgIGNsb3NlKGlkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgb3BlbihTdHJpbmcgaWQsCiAgICAgIFtNYXA8U3RyaW5nLCBkeW5hbWljPiBkYXRhID0gY29uc3QgPFN0cmluZywgZHluYW1pYz57fV0pIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKGluZGVudGF0aW9uKTsKICAgIHNiLndyaXRlKCc8JGlkJyk7CiAgICBkYXRhLmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICBzYi53cml0ZSgnICRrZXk9IiR7ZXNjYXBlLmNvbnZlcnQoJyR2YWx1ZScpfSInKTsKICAgICAgfQogICAgfSk7CiAgICBzYi53cml0ZSgnPicpOwogICAgb3V0cHV0LnByaW50bG4oc2IudG9TdHJpbmcoKSk7CiAgICBpbmRlbnRNb3JlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsb3NlKFN0cmluZyBpZCkgewogICAgaW5kZW50TGVzcygpOwogICAgb3V0cHV0LnByaW50bG4oJyR7aW5kZW50YXRpb259PC8kaWQ+Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRXh0cmEoKSB7CiAgICBvcGVuKCdleHRyYScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFeHRyYSgpIHsKICAgIGNsb3NlKCdleHRyYScpOwogIH0KfQoKLy8vIEEgbm9kZSBpbiBhIHN0YWNrIHRyYWNlIHRyZWUgdXNlZCB0byBzdG9yZSBhbmQgb3JnYW5pemUgc3RhY2sgdHJhY2VzIGJ5Ci8vLyBjb21tb24gcHJlZml4ZXMuCmNsYXNzIF9TdGFja1RyYWNlTm9kZSBpbXBsZW1lbnRzIENvbXBhcmFibGU8X1N0YWNrVHJhY2VOb2RlPiB7CiAgaW50IGNvdW50OwogIExpc3Q8U3RhY2tUcmFjZUxpbmU+IGNvbW1vblByZWZpeDsKICBMaXN0PF9TdGFja1RyYWNlTm9kZT4gc3VidHJhY2VzOwoKICBfU3RhY2tUcmFjZU5vZGUodGhpcy5jb21tb25QcmVmaXgsIHRoaXMuY291bnQsIHRoaXMuc3VidHJhY2VzKTsKCiAgX1N0YWNrVHJhY2VOb2RlLnJvb3QoKSA6IHRoaXMoW10sIDAsIFtdKTsKCiAgX1N0YWNrVHJhY2VOb2RlLmxlYWYoU3RhY2tUcmFjZUxpbmVzIHN0YWNrVHJhY2UpCiAgICAgIDogdGhpcyhzdGFja1RyYWNlLmxpbmVzLCAxLCBjb25zdCBbXSk7CgogIF9TdGFja1RyYWNlTm9kZS5ub2RlKExpc3Q8U3RhY2tUcmFjZUxpbmU+IGNvbW1vblByZWZpeCwgX1N0YWNrVHJhY2VOb2RlIGZpcnN0LAogICAgICBfU3RhY2tUcmFjZU5vZGUgc2Vjb25kKQogICAgICA6IHRoaXMoY29tbW9uUHJlZml4LCBmaXJzdC5jb3VudCArIHNlY29uZC5jb3VudCwgW2ZpcnN0LCBzZWNvbmRdKTsKCiAgdm9pZCBhZGQoU3RhY2tUcmFjZUxpbmVzIHN0YWNrVHJhY2UpIHsKICAgIGNvdW50Kys7CiAgICBpZiAoIXN0YWNrVHJhY2UubGluZXMuaXNFbXB0eSkgewogICAgICBhZGRTdWJ0cmFjZShzdGFja1RyYWNlKTsKICAgIH0KICB9CgogIHZvaWQgYWRkU3VidHJhY2UoU3RhY2tUcmFjZUxpbmVzIHN0YWNrVHJhY2UpIHsKICAgIExpc3Q8U3RhY2tUcmFjZUxpbmU+IGxpbmVzID0gc3RhY2tUcmFjZS5saW5lczsKICAgIGZvciAoX1N0YWNrVHJhY2VOb2RlIHN1YnRyYWNlIGluIHN1YnRyYWNlcykgewogICAgICBpbnQgY29tbW9uUHJlZml4TGVuZ3RoID0KICAgICAgICAgIGxvbmdlc3RDb21tb25QcmVmaXhMZW5ndGgoc3VidHJhY2UuY29tbW9uUHJlZml4LCBsaW5lcyk7CiAgICAgIGlmIChjb21tb25QcmVmaXhMZW5ndGggPiAwKSB7CiAgICAgICAgc3RhY2tUcmFjZSA9IHN0YWNrVHJhY2Uuc3VidHJhY2UoY29tbW9uUHJlZml4TGVuZ3RoKTsKICAgICAgICBpZiAoY29tbW9uUHJlZml4TGVuZ3RoID09IHN1YnRyYWNlLmNvbW1vblByZWZpeC5sZW5ndGgpIHsKICAgICAgICAgIHN1YnRyYWNlLmFkZChzdGFja1RyYWNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3VidHJhY2UuY29tbW9uUHJlZml4ID0KICAgICAgICAgICAgICBzdWJ0cmFjZS5jb21tb25QcmVmaXguc3VibGlzdChjb21tb25QcmVmaXhMZW5ndGgpOwogICAgICAgICAgc3VidHJhY2VzLnJlbW92ZShzdWJ0cmFjZSk7CiAgICAgICAgICBzdWJ0cmFjZXMuYWRkKG5ldyBfU3RhY2tUcmFjZU5vZGUubm9kZSgKICAgICAgICAgICAgICBsaW5lcy5zdWJsaXN0KDAsIGNvbW1vblByZWZpeExlbmd0aCksCiAgICAgICAgICAgICAgc3VidHJhY2UsCiAgICAgICAgICAgICAgbmV3IF9TdGFja1RyYWNlTm9kZS5sZWFmKHN0YWNrVHJhY2UpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgc3VidHJhY2VzLmFkZChuZXcgX1N0YWNrVHJhY2VOb2RlLmxlYWYoc3RhY2tUcmFjZSkpOwogIH0KCiAgdm9pZCBkdW1wVHJhY2VzKFN0YXRzUHJpbnRlciBwcmludGVyKSB7CiAgICBwcmludGVyLm9wZW4oJ3RyYWNlJywgeydjb3VudCc6IGNvdW50LCAnbGluZSc6IGNvbW1vblByZWZpeC5maXJzdH0pOwogICAgaWYgKGNvbW1vblByZWZpeC5sZW5ndGggPiAxKSB7CiAgICAgIGZvciAoU3RhY2tUcmFjZUxpbmUgbGluZSBpbiBjb21tb25QcmVmaXguc2tpcCgxKSkgewogICAgICAgIHByaW50ZXIuY2hpbGQoJ3RyYWNlJywgeydsaW5lJzogbGluZX0pOwogICAgICB9CiAgICB9CiAgICBkdW1wU3VidHJhY2VzKHByaW50ZXIpOwogICAgcHJpbnRlci5jbG9zZSgndHJhY2UnKTsKICB9CgogIHZvaWQgZHVtcFN1YnRyYWNlcyhTdGF0c1ByaW50ZXIgcHJpbnRlcikgewogICAgaWYgKCFzdWJ0cmFjZXMuaXNFbXB0eSkgewogICAgICBzdWJ0cmFjZXMuc29ydCgpOwogICAgICBmb3IgKF9TdGFja1RyYWNlTm9kZSBzdGVwIGluIHN1YnRyYWNlcykgewogICAgICAgIHN0ZXAuZHVtcFRyYWNlcyhwcmludGVyKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGNvbXBhcmVUbyhfU3RhY2tUcmFjZU5vZGUgb3RoZXIpIHsKICAgIC8vIFNvcnRzIGluIGRlY3JlYXNpbmcgY291bnQgb3JkZXIuCiAgICByZXR1cm4gb3RoZXIuY291bnQgLSBjb3VudDsKICB9CgogIHZvaWQgcHJpbnRPbihTdHJpbmdCdWZmZXIgc2IsIFN0cmluZyBpbmRlbnRhdGlvbikgewogICAgU3RyaW5nIGNvdW50VGV4dCA9ICckaW5kZW50YXRpb24kY291bnQgICc7CiAgICBzYi53cml0ZShjb3VudFRleHQpOwogICAgc2Iud3JpdGUoJ1xuJyk7CiAgICBpbmRlbnRhdGlvbiA9ICcnLnBhZExlZnQoY291bnRUZXh0Lmxlbmd0aCwgJyAnKTsKICAgIGlmIChjb21tb25QcmVmaXggIT0gbnVsbCkgewogICAgICBpbnQgaW5kZXggPSAwOwogICAgICBmb3IgKFN0YWNrVHJhY2VMaW5lIGxpbmUgaW4gY29tbW9uUHJlZml4KSB7CiAgICAgICAgc2Iud3JpdGUoaW5kZW50YXRpb24pOwogICAgICAgIGlmIChpbmRleCA+IDEpIHsKICAgICAgICAgIHNiLndyaXRlKCcuLi5cbicpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHNiLndyaXRlKGxpbmUpOwogICAgICAgIHNiLndyaXRlKCdcbicpOwogICAgICAgIGluZGV4Kys7CiAgICAgIH0KICAgIH0KICAgIHN1YnRyYWNlcy5zb3J0KCk7CiAgICBmb3IgKF9TdGFja1RyYWNlTm9kZSBzdWJ0cmFjZSBpbiBzdWJ0cmFjZXMpIHsKICAgICAgc3VidHJhY2UucHJpbnRPbihzYiwgaW5kZW50YXRpb24pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgcHJpbnRPbihzYiwgJycpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBfU3RhY2tUcmFjZVRyZWUgZXh0ZW5kcyBfU3RhY2tUcmFjZU5vZGUgewogIGZpbmFsIGlkOwogIGludCB0b3RhbENvdW50ID0gMDsKICBmaW5hbCBpbnQgc2FtcGxlRnJlcXVlbmN5OwoKICBfU3RhY2tUcmFjZVRyZWUodGhpcy5pZCwgdGhpcy5zYW1wbGVGcmVxdWVuY3kpIDogc3VwZXIucm9vdCgpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGR1bXBUcmFjZXMoU3RhdHNQcmludGVyIHByaW50ZXIpIHsKICAgIHByaW50ZXIub3BlbigndHJhY2UnLCB7CiAgICAgICdpZCc6IGlkLAogICAgICAndG90YWxDb3VudCc6IHRvdGFsQ291bnQsCiAgICAgICdzYW1wbGVGcmVxdWVuY3knOiBzYW1wbGVGcmVxdWVuY3kKICAgIH0pOwogICAgZHVtcFN1YnRyYWNlcyhwcmludGVyKTsKICAgIHByaW50ZXIuY2xvc2UoJ3RyYWNlJyk7CiAgfQoKICB2b2lkIHNhbXBsZSgpIHsKICAgIGlmICh0b3RhbENvdW50KysgJSBzYW1wbGVGcmVxdWVuY3kgPT0gMCkgewogICAgICBhZGQoc3RhY2tUcmFjZShvZmZzZXQ6IDMpKTsKICAgIH0KICB9Cn0KCi8vLyBBY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgW1N0YXRzXS4KY2xhc3MgQWN0aXZlU3RhdHMgaW1wbGVtZW50cyBTdGF0cyB7CiAgZmluYWwgU3RhdHNQcmludGVyIHByaW50ZXI7CiAgTWFwPGR5bmFtaWMsIE1hcD4gbWFwcyA9IHt9OwogIE1hcDxkeW5hbWljLCBNYXA8ZHluYW1pYywgTGlzdD4+IGZyZXF1ZW5jeU1hcHMgPSB7fTsKICBNYXA8ZHluYW1pYywgTWFwPiBzZXRzTWFwID0ge307CiAgTWFwPGR5bmFtaWMsIE1hcDxkeW5hbWljLCBMaXN0Pj4gY291bnRlcnNNYXAgPQogICAgICA8ZHluYW1pYywgTWFwPGR5bmFtaWMsIExpc3Q+Pnt9OwogIE1hcDxkeW5hbWljLCBfU3RhY2tUcmFjZVRyZWU+IHRyYWNlTWFwID0ge307CiAgQG92ZXJyaWRlCiAgaW50IHN0YWNrVHJhY2VTYW1wbGVGcmVxdWVuY3kgPSAxOwoKICBBY3RpdmVTdGF0cyhTdGF0c1ByaW50ZXIgdGhpcy5wcmludGVyKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZWNvcmRNYXAoaWQsIGtleSwgdmFsdWUsIHtmcm9tRXhpc3RpbmcodmFsdWUpfSkgewogICAgTWFwIG1hcCA9IG1hcHMucHV0SWZBYnNlbnQoaWQsICgpID0+IHt9KTsKICAgIGlmIChmcm9tRXhpc3RpbmcgIT0gbnVsbCAmJiBtYXAuY29udGFpbnNLZXkoa2V5KSkgewogICAgICBtYXBba2V5XSA9IGZyb21FeGlzdGluZyhtYXBba2V5XSk7CiAgICB9IGVsc2UgewogICAgICBtYXBba2V5XSA9IHZhbHVlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgTWFwIGdldE1hcChrZXkpIHsKICAgIHJldHVybiBtYXBzW2tleV07CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlY29yZEZyZXF1ZW5jeShpZCwgdmFsdWUsIFtleGFtcGxlXSkgewogICAgTWFwPGR5bmFtaWMsIExpc3Q+IG1hcCA9IGZyZXF1ZW5jeU1hcHMucHV0SWZBYnNlbnQoaWQsICgpID0+IHt9KTsKICAgIG1hcC5wdXRJZkFic2VudCh2YWx1ZSwgKCkgPT4gW10pOwogICAgbWFwW3ZhbHVlXS5hZGQoZXhhbXBsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlY29yZEZyZXF1ZW5jaWVzKGlkLCBNYXA8ZHluYW1pYywgSXRlcmFibGU+IGZyZXF1ZW5jeU1hcCkgewogICAgTWFwPGR5bmFtaWMsIExpc3Q+IG1hcCA9IGZyZXF1ZW5jeU1hcHMucHV0SWZBYnNlbnQoaWQsICgpID0+IHt9KTsKICAgIGZyZXF1ZW5jeU1hcC5mb3JFYWNoKCh2YWx1ZSwgZXhhbXBsZXMpIHsKICAgICAgbWFwLnB1dElmQWJzZW50KHZhbHVlLCAoKSA9PiBbXSk7CiAgICAgIG1hcFt2YWx1ZV0uYWRkQWxsKGV4YW1wbGVzKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGUgcmVjb3JkZWRGcmVxdWVuY2llcyhpZCwgdmFsdWUpIHsKICAgIE1hcDxkeW5hbWljLCBMaXN0PiBtYXAgPSBmcmVxdWVuY3lNYXBzW2lkXTsKICAgIGlmIChtYXAgPT0gbnVsbCkgcmV0dXJuIGNvbnN0IFtdOwogICAgTGlzdCBsaXN0ID0gbWFwW3ZhbHVlXTsKICAgIGlmIChsaXN0ID09IG51bGwpIHJldHVybiBjb25zdCBbXTsKICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWNvcmRDb3VudGVyKGlkLCBbcmVhc29uLCBleGFtcGxlXSkgewogICAgTWFwPGR5bmFtaWMsIExpc3Q+IG1hcCA9IGNvdW50ZXJzTWFwLnB1dElmQWJzZW50KGlkLCAoKSA9PiB7fSk7CiAgICBtYXAucHV0SWZBYnNlbnQocmVhc29uLCAoKSA9PiBbXSkuYWRkKGV4YW1wbGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWNvcmRFbGVtZW50KGtleSwgZWxlbWVudCwge2RhdGF9KSB7CiAgICBzZXRzTWFwLnB1dElmQWJzZW50KGtleSwgKCkgPT4gbmV3IE1hcCgpKVtlbGVtZW50XSA9IGRhdGE7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlY29yZFRyYWNlKGtleSwge2ludCBzYW1wbGVGcmVxdWVuY3l9KSB7CiAgICBpZiAoc2FtcGxlRnJlcXVlbmN5ID09IG51bGwpIHsKICAgICAgc2FtcGxlRnJlcXVlbmN5ID0gc3RhY2tUcmFjZVNhbXBsZUZyZXF1ZW5jeTsKICAgIH0KICAgIHRyYWNlTWFwCiAgICAgICAgLnB1dElmQWJzZW50KGtleSwgKCkgPT4gbmV3IF9TdGFja1RyYWNlVHJlZShrZXksIHNhbXBsZUZyZXF1ZW5jeSkpCiAgICAgICAgLnNhbXBsZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGUgZ2V0TGlzdChTdHJpbmcga2V5KSB7CiAgICBNYXAgbWFwID0gc2V0c01hcFtrZXldOwogICAgaWYgKG1hcCA9PSBudWxsKSByZXR1cm4gY29uc3QgW107CiAgICByZXR1cm4gbWFwLmtleXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGR1bXBTdGF0cyh7dm9pZCBiZWZvcmVDbG9zZSgpfSkgewogICAgcHJpbnRlci5zdGFydCgnc3RhdHMnKTsKICAgIGR1bXBGcmVxdWVuY2llcygpOwogICAgZHVtcFNldHMoKTsKICAgIGR1bXBDb3VudGVycygpOwogICAgZHVtcFRyYWNlcygpOwogICAgaWYgKGJlZm9yZUNsb3NlICE9IG51bGwpIHsKICAgICAgYmVmb3JlQ2xvc2UoKTsKICAgIH0KICAgIHByaW50ZXIuZW5kKCdzdGF0cycpOwogIH0KCiAgdm9pZCBkdW1wU2V0cygpIHsKICAgIHByaW50ZXIuZ3JvdXAoJ3NldHMnLCAoKSB7CiAgICAgIHNldHNNYXAuZm9yRWFjaCgoaywgc2V0KSB7CiAgICAgICAgZHVtcEl0ZXJhYmxlKCdleGFtcGxlcycsICckaycsIHNldC5rZXlzLAogICAgICAgICAgICBsaW1pdDogcHJpbnRlci5leGFtcGxlcywgZGF0YU1hcDogc2V0KTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIHZvaWQgZHVtcEZyZXF1ZW5jaWVzKCkgewogICAgcHJpbnRlci5ncm91cCgnZnJlcXVlbmNpZXMnLCAoKSB7CiAgICAgIGZyZXF1ZW5jeU1hcHMuZm9yRWFjaCgoa2V5LCBNYXA8ZHluYW1pYywgTGlzdD4gbWFwKSB7CiAgICAgICAgcHJpbnRlci5jaGlsZCgnZnJlcXVlbmN5Jywgeyd0aXRsZSc6ICcka2V5J30sICgpIHsKICAgICAgICAgIGR1bXBGcmVxdWVuY3kobWFwKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIHZvaWQgZHVtcEZyZXF1ZW5jeShNYXA8ZHluYW1pYywgSXRlcmFibGU+IG1hcCkgewogICAgTWFwIHNvcnRlZE1hcCA9IHRyeVNvcnRNYXAobWFwKTsKICAgIHNvcnRlZE1hcC5mb3JFYWNoKChrLCBsaXN0KSB7CiAgICAgIGR1bXBJdGVyYWJsZSgnZXhhbXBsZXMnLCAnJGsnLCBsaXN0LCBsaW1pdDogcHJpbnRlci5leGFtcGxlcyk7CiAgICB9KTsKICB9CgogIHZvaWQgZHVtcENvdW50ZXJzKCkgewogICAgcHJpbnRlci5ncm91cCgnY291bnRlcnMnLCAoKSB7CiAgICAgIGNvdW50ZXJzTWFwLmtleXMuZm9yRWFjaChkdW1wQ291bnRlcik7CiAgICB9KTsKICB9CgogIHZvaWQgZHVtcENvdW50ZXIoaWQpIHsKICAgIE1hcDxkeW5hbWljLCBMaXN0PiBtYXAgPSBjb3VudGVyc01hcFtpZF07CiAgICBib29sIGhhc0RhdGEoZXhhbXBsZSkgewogICAgICBpZiAobWFwID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgTGlzdCBsaXN0ID0gbWFwW2V4YW1wbGVdOwogICAgICBpZiAobGlzdCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIHJldHVybiBsaXN0LmFueSgoZGF0YSkgPT4gZGF0YSAhPSBudWxsKTsKICAgIH0KCiAgICBpbnQgY291bnQgPSAwOwogICAgTWFwPGR5bmFtaWMsIGludD4gZnJlcXVlbmN5TWFwID0ge307CiAgICBtYXAuZm9yRWFjaCgodmFyIGNhdGVnb3J5LCBMaXN0IGV4YW1wbGVzKSB7CiAgICAgIGlmIChjYXRlZ29yeSAhPSBudWxsKSB7CiAgICAgICAgZnJlcXVlbmN5TWFwLnB1dElmQWJzZW50KGNhdGVnb3J5LCAoKSA9PiAwKTsKICAgICAgICBmcmVxdWVuY3lNYXBbY2F0ZWdvcnldICs9IGV4YW1wbGVzLmxlbmd0aDsKICAgICAgfQogICAgICBjb3VudCArPSBleGFtcGxlcy5sZW5ndGg7CiAgICB9KTsKICAgIE1hcDxpbnQsIFNldD4gcmVzdWx0ID0gc29ydE1hcChpbnZlcnNlTWFwKGZyZXF1ZW5jeU1hcCksIChhLCBiKSA9PiBiIC0gYSk7CiAgICBpbnQgZXhhbXBsZXNMaW1pdCA9IG51bGw7CiAgICBpZiAocHJpbnRlci5leGFtcGxlcyAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGggPj0gcHJpbnRlci5leGFtcGxlcykgewogICAgICBleGFtcGxlc0xpbWl0ID0gMDsKICAgIH0KICAgIGludCBjb3VudGVyID0gMDsKICAgIGJvb2wgaGFzTW9yZSA9IGZhbHNlOwogICAgcHJpbnRlci5vcGVuKCdjb3VudGVyJywgeyd0aXRsZSc6ICckaWQnLCAnY291bnQnOiBjb3VudH0pOwogICAgcmVzdWx0LmZvckVhY2goKGludCBjb3VudCwgU2V0IGV4YW1wbGVzKSB7CiAgICAgIGlmIChjb3VudGVyID09IHByaW50ZXIuZXhhbXBsZXMpIHsKICAgICAgICBwcmludGVyLmJlZ2luRXh0cmEoKTsKICAgICAgICBoYXNNb3JlID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoZXhhbXBsZXMubGVuZ3RoID09IDEgJiYKICAgICAgICAgIChleGFtcGxlc0xpbWl0ID09IDAgfHwgIWhhc0RhdGEoZXhhbXBsZXMuZmlyc3QpKSkgewogICAgICAgIHByaW50ZXIuY2hpbGQoJ2V4YW1wbGVzJywgeydjb3VudCc6IGNvdW50LCAnZXhhbXBsZSc6IGV4YW1wbGVzLmZpcnN0fSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnRlci5jaGlsZCgnZXhhbXBsZXMnLCB7J2NvdW50JzogY291bnQsICdleGFtcGxlcyc6IGV4YW1wbGVzLmxlbmd0aH0sCiAgICAgICAgICAgICgpIHsKICAgICAgICAgIGV4YW1wbGVzLmZvckVhY2goKGV4YW1wbGUpIHsKICAgICAgICAgICAgZHVtcEl0ZXJhYmxlKCdleGFtcGxlcycsICckZXhhbXBsZScsIG1hcFtleGFtcGxlXSwKICAgICAgICAgICAgICAgIGxpbWl0OiBleGFtcGxlc0xpbWl0LCBpbmNsdWRlQ291bnQ6IGZhbHNlKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGNvdW50ZXIrKzsKICAgIH0pOwogICAgaWYgKGhhc01vcmUpIHsKICAgICAgcHJpbnRlci5lbmRFeHRyYSgpOwogICAgfQogICAgcHJpbnRlci5jbG9zZSgnY291bnRlcicpOwogIH0KCiAgdm9pZCBkdW1wVHJhY2VzKCkgewogICAgcHJpbnRlci5ncm91cCgndHJhY2VzJywgKCkgewogICAgICB0cmFjZU1hcC5rZXlzLmZvckVhY2goZHVtcFRyYWNlKTsKICAgIH0pOwogIH0KCiAgdm9pZCBkdW1wVHJhY2Uoa2V5KSB7CiAgICBfU3RhY2tUcmFjZVRyZWUgdHJlZSA9IHRyYWNlTWFwW2tleV07CiAgICB0cmVlLmR1bXBUcmFjZXMocHJpbnRlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGR1bXBDb3JyZWxhdGlvbihrZXlBLCBJdGVyYWJsZSBhLCBrZXlCLCBJdGVyYWJsZSBiLAogICAgICB7TWFwIGRhdGFBLCBNYXAgZGF0YUJ9KSB7CiAgICBwcmludGVyLmNoaWxkKCdjb3JyZWxhdGlvbnMnLCB7J3RpdGxlJzogJyRrZXlBIHZzICRrZXlCJ30sICgpIHsKICAgICAgTGlzdCBhQW5kQiA9IGEud2hlcmUoKGUpID0+IGUgIT0gbnVsbCAmJiBiLmNvbnRhaW5zKGUpKS50b0xpc3QoKTsKICAgICAgTGlzdCBhQW5kTm90QiA9IGEud2hlcmUoKGUpID0+IGUgIT0gbnVsbCAmJiAhYi5jb250YWlucyhlKSkudG9MaXN0KCk7CiAgICAgIExpc3Qgbm90QWFuZEIgPSBiLndoZXJlKChlKSA9PiBlICE9IG51bGwgJiYgIWEuY29udGFpbnMoZSkpLnRvTGlzdCgpOwogICAgICBkdW1wSXRlcmFibGUoJ2NvcnJlbGF0aW9uJywgJyRrZXlBICYmICRrZXlCJywgYUFuZEIsCiAgICAgICAgICBkYXRhTWFwOiBkYXRhQSwgbGltaXQ6IHByaW50ZXIuZXhhbXBsZXMpOwogICAgICBkdW1wSXRlcmFibGUoJ2NvcnJlbGF0aW9uJywgJyRrZXlBICYmICEka2V5QicsIGFBbmROb3RCLAogICAgICAgICAgZGF0YU1hcDogZGF0YUEsIGxpbWl0OiBwcmludGVyLmV4YW1wbGVzKTsKICAgICAgZHVtcEl0ZXJhYmxlKCdjb3JyZWxhdGlvbicsICchJGtleUEgJiYgJGtleUInLCBub3RBYW5kQiwKICAgICAgICAgIGRhdGFNYXA6IGRhdGFCLCBsaW1pdDogcHJpbnRlci5leGFtcGxlcyk7CiAgICB9KTsKICB9CgogIHZvaWQgZHVtcEl0ZXJhYmxlKFN0cmluZyB0YWcsIFN0cmluZyB0aXRsZSwgSXRlcmFibGUgaXRlcmFibGUsCiAgICAgIHtpbnQgbGltaXQsIE1hcCBkYXRhTWFwLCBib29sIGluY2x1ZGVDb3VudDogdHJ1ZX0pIHsKICAgIGlmIChsaW1pdCA9PSAwKSByZXR1cm47CgogICAgTWFwPFN0cmluZywgZHluYW1pYz4gY2hpbGREYXRhID0ge307CiAgICBJdGVyYWJsZSBub25OdWxsSXRlcmFibGUgPSBpdGVyYWJsZS53aGVyZSgoZSkgPT4gZSAhPSBudWxsKTsKICAgIGlmIChub25OdWxsSXRlcmFibGUuaXNFbXB0eSAmJiAhaW5jbHVkZUNvdW50KSB7CiAgICAgIGNoaWxkRGF0YVsnbmFtZSddID0gdGl0bGU7CiAgICB9IGVsc2UgewogICAgICBjaGlsZERhdGFbJ3RpdGxlJ10gPSB0aXRsZTsKICAgIH0KICAgIGlmIChpbmNsdWRlQ291bnQpIHsKICAgICAgY2hpbGREYXRhWydjb3VudCddID0gaXRlcmFibGUubGVuZ3RoOwogICAgfQogICAgcHJpbnRlci5jaGlsZCh0YWcsIGNoaWxkRGF0YSwgKCkgewogICAgICBib29sIGhhc01vcmUgPSBmYWxzZTsKICAgICAgaW50IGNvdW50ZXIgPSAwOwogICAgICBub25OdWxsSXRlcmFibGUuZm9yRWFjaCgoZWxlbWVudCkgewogICAgICAgIGlmIChjb3VudGVyID09IGxpbWl0KSB7CiAgICAgICAgICBwcmludGVyLmJlZ2luRXh0cmEoKTsKICAgICAgICAgIGhhc01vcmUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICB2YXIgZGF0YSA9IGRhdGFNYXAgIT0gbnVsbCA/IGRhdGFNYXBbZWxlbWVudF0gOiBudWxsOwogICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKICAgICAgICAgIHByaW50ZXIuY2hpbGQoJ2V4YW1wbGUnLCB7J3ZhbHVlJzogZWxlbWVudCwgJ2RhdGEnOiBkYXRhfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByaW50ZXIuY2hpbGQoJ2V4YW1wbGUnLCB7J3ZhbHVlJzogZWxlbWVudH0pOwogICAgICAgIH0KICAgICAgICBjb3VudGVyKys7CiAgICAgIH0pOwogICAgICBpZiAoaGFzTW9yZSkgewogICAgICAgIHByaW50ZXIuZW5kRXh0cmEoKTsKICAgICAgfQogICAgfSk7CiAgfQp9CgovLy8gUmV0dXJucyBhIG1hcCB0aGF0IGlzIGFuIGludmVyc2lvbiBvZiBbbWFwXSwgd2hlcmUgdGhlIGtleXMgYXJlIHRoZSB2YWx1ZXMKLy8vIG9mIFttYXBdIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgc2V0IG9mIGtleXMgaW4gW21hcF0gdGhhdCBzaGFyZSB2YWx1ZXMuCi8vLwovLy8gSWYgW2VxdWFsc10gYW5kIFtoYXNoQ29kZV0gYXJlIHByb3ZpZGVkLCB0aGVzZSBhcmUgdXNlZCB0byBkZXRlcm1pbmUKLy8vIGVxdWFsaXR5IGFtb25nIHRoZSB2YWx1ZXMgb2YgW21hcF0uCi8vLwovLy8gSWYgW2lzVmFsaWRLZXldIGlzIHByb3ZpZGVkLCB0aGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdpdGggYSB2YWx1ZSBvZiBbbWFwXQovLy8gaXMgYSBwb3RlbnRpYWwga2V5IG9mIHRoZSBpbnZlcnNpb24gbWFwLgpNYXA8ViwgU2V0PEs+PiBpbnZlcnNlTWFwPEssIFY+KE1hcDxLLCBWPiBtYXAsCiAgICB7Ym9vbCBlcXVhbHMoViBrZXkxLCBWIGtleTIpLAogICAgaW50IGhhc2hDb2RlKFYga2V5KSwKICAgIGJvb2wgaXNWYWxpZEtleShWIHBvdGVudGlhbEtleSl9KSB7CiAgTWFwPFYsIFNldDxLPj4gcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXA8ViwgU2V0PEs+PigKICAgICAgZXF1YWxzOiBlcXVhbHMsIGhhc2hDb2RlOiBoYXNoQ29kZSwgaXNWYWxpZEtleTogaXNWYWxpZEtleSk7CiAgbWFwLmZvckVhY2goKGssIHYpIHsKICAgIGlmIChpc1ZhbGlkS2V5ID09IG51bGwgfHwgaXNWYWxpZEtleSh2KSkgewogICAgICByZXN1bHQucHV0SWZBYnNlbnQodiwgKCkgPT4gbmV3IFNldCgpKS5hZGQoayk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKLy8vIFJldHVybiBhIG5ldyBtYXAgaGV1cmlzdGljYWxseSBzb3J0ZWQgYnkgdGhlIGtleXMgb2YgW21hcF0uIElmIHRoZSBmaXJzdAovLy8ga2V5IG9mIFttYXBdIGlzIFtDb21wYXJhYmxlXSwgdGhlIGtleXMgYXJlIHNvcnRlZCB1c2luZyBbc29ydE1hcF0gdW5kZXIKLy8vIHRoZSBhc3N1bXB0aW9uIHRoYXQgYWxsIGtleXMgYXJlIFtDb21wYXJhYmxlXS4KLy8vIE90aGVyd2lzZSwgdGhlIGtleXMgYXJlIHNvcnRlZCBhcyBzdHJpbmcgdXNpbmcgdGhlaXIgYHRvU3RyaW5nYAovLy8gcmVwcmVzZW50YXRpb24uCk1hcDxLLCBWPiB0cnlTb3J0TWFwPEssIFY+KE1hcDxLLCBWPiBtYXApIHsKICBJdGVyYWJsZTxL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Ly8gb2YgdGhlICdmaW5hbCcgc2l6ZSBvZiBtYXBzIGdyb3VwZWQgYnkgZGVzY3JpcHRpb24uIEl0IGFsbG93cwovLy8gZGV0ZXJtaW5pbmcgdGhlIGRpc3RyaWJ1dGlvbiBvZiBzaXplcyBmb3IgYSBzcGVjaWZpYyBhbGxvY2F0aW9uCi8vLyBzaXRlIGFuZCBpdCBjYW4gYmUgdXNlZCBsaWtlIHRoaXM6Ci8vLwovLy8gICAgTWFwPFN0cmluZywgaW50PiBtYXAgPSBuZXcgVHJhY2tNYXA8U3RyaW5nLCBpbnQ+KCJteS1tYXAiKTsKLy8vCi8vLyBBZnRlciBmaW5pc2hpbmcgdGhlIGNvbXBpbGF0b24sIHRoZSBoaXN0b2dyYW0gb2YgdHJhY2sgbWFwIHNpemVzCi8vLyBpcyBwcmludGVkIGJ1dCBvbmx5IHdoZW4gcnVubmluZyBpbiB2ZXJib3NlIG1vZGUuCmNsYXNzIFRyYWNrTWFwPEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+IHsKICBmaW5hbCBNYXA8SywgVj4gX21hcDsKICBmaW5hbCBMaXN0IF9jb3VudHM7CiAgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8aW50Pj4gX2NvdW50c01hcCA9IHt9OwoKICBUcmFja01hcC5faW50ZXJuYWwodGhpcy5fY291bnRzKSA6IF9tYXAgPSBuZXcgTWFwPEssIFY+KCk7CgogIGZhY3RvcnkgVHJhY2tNYXAoU3RyaW5nIGRlc2NyaXB0aW9uKSB7CiAgICBMaXN0IGNvdW50cyA9IF9jb3VudHNNYXAucHV0SWZBYnNlbnQoZGVzY3JpcHRpb24sICgpID0+IFswXSk7CiAgICBNYXAgcmVzdWx0ID0gbmV3IFRyYWNrTWFwPEssIFY+Ll9pbnRlcm5hbChjb3VudHMpOwogICAgY291bnRzWzBdKys7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIHZvaWQgcHJpbnRIaXN0b2dyYW0oKSB7CiAgICBfY291bnRzTWFwLmZvckVhY2goKGRlc2NyaXB0aW9uLCBjb3VudHMpIHsKICAgICAgcHJpbnQoJyRkZXNjcmlwdGlvbiAtLSAke2NvdW50cy5sZW5ndGh9IG1hcHMnKTsKCiAgICAgIC8vIENvdW50IHRoZSB0b3RhbCBudW1iZXIgb2YgbWFwcy4KICAgICAgaW50IHN1bSA9IDA7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgc3VtICs9IGNvdW50c1tpXTsKICAgICAgfQogICAgICBpbnQgaW5jcmVtZW50ID0gc3VtIH4vIDEwOwogICAgICBpbnQgdGFyZ2V0ID0gaW5jcmVtZW50OwogICAgICBpbnQgYWNjdW11bGF0ZWQgPSAwOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIGFjY3VtdWxhdGVkICs9IGNvdW50c1tpXTsKICAgICAgICBpZiAoYWNjdW11bGF0ZWQgPj0gdGFyZ2V0KSB7CiAgICAgICAgICBTdHJpbmcgcGVyY2VudCA9IChhY2N1bXVsYXRlZCAvIHN1bSAqIDEwMCkudG9TdHJpbmdBc0ZpeGVkKDEpOwogICAgICAgICAgcHJpbnQoJyAgLS0gJHBlcmNlbnQlOiBsZW5ndGggPD0gJGknKTsKICAgICAgICAgIHRhcmdldCArPSBpbmNyZW1lbnQ7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoID0+IF9tYXAubGVuZ3RoOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX21hcC5pc0VtcHR5OwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX21hcC5pc05vdEVtcHR5OwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PiBfbWFwLmtleXM7CiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Vj4gZ2V0IHZhbHVlcyA9PiBfbWFwLnZhbHVlczsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSA9PiBfbWFwLmNvbnRhaW5zS2V5KGtleSk7CiAgQG92ZXJyaWRlCiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgPT4gX21hcC5jb250YWluc1ZhbHVlKHZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KSA9PiBfbWFwW2tleV07CiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX21hcC50b1N0cmluZygpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oSyBrZXksIFYgdmFsdWUpKSB7CiAgICBfbWFwLmZvckVhY2goYWN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBpZiAoIV9tYXAuY29udGFpbnNLZXkoa2V5KSkgewogICAgICBfbm90aWZ5TGVuZ3RoQ2hhbmdlZCgxKTsKICAgICAgX21hcFtrZXldID0gdmFsdWU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIGlmIChjb250YWluc0tleShrZXkpKSByZXR1cm4gdGhpc1trZXldOwogICAgViB2YWx1ZSA9IGlmQWJzZW50KCk7CiAgICB0aGlzW2tleV0gPSB2YWx1ZTsKICAgIHJldHVybiB2YWx1ZTsKICB9CgogIEBvdmVycmlkZQogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIGlmIChfbWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgX25vdGlmeUxlbmd0aENoYW5nZWQoLTEpOwogICAgfQogICAgcmV0dXJuIF9tYXAucmVtb3ZlKGtleSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIG90aGVyLmZvckVhY2goKGtleSwgdmFsdWUpID0+IHRoaXNba2V5XSA9IHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xlYXIoKSB7CiAgICBfbm90aWZ5TGVuZ3RoQ2hhbmdlZCgtX21hcC5sZW5ndGgpOwogICAgX21hcC5jbGVhcigpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPEtSLCBWUj4gY2FzdDxLUiwgVlI+KCkgPT4gX21hcC5jYXN0PEtSLCBWUj4oKTsKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZ2V0IGVudHJpZXMgPT4gX21hcC5lbnRyaWVzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGVudHJpZXMpIHsKICAgIGZvciAodmFyIGVudHJ5IGluIGVudHJpZXMpIHRoaXNbZW50cnkua2V5XSA9IGVudHJ5LnZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPEtSLCBWUj4gbWFwPEtSLCBWUj4oTWFwRW50cnk8S1IsIFZSPiB0cmFuc2Zvcm0oSyBrZXksIFYgdmFsdWUpKSA9PgogICAgICBfbWFwLm1hcCh0cmFuc2Zvcm0pOwoKICBAb3ZlcnJpZGUKICBWIHVwZGF0ZShLIGtleSwgViB1cGRhdGUoViB2YWx1ZSksIHtWIGlmQWJzZW50KCl9KSA9PgogICAgICBfbWFwLnVwZGF0ZShrZXksIHVwZGF0ZSwgaWZBYnNlbnQ6IGlmQWJzZW50KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB1cGRhdGVBbGwoViB1cGRhdGUoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBfbWFwLnVwZGF0ZUFsbCh1cGRhdGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBpbnQgYmVmb3JlID0gX21hcC5sZW5ndGg7CiAgICBfbWFwLnJlbW92ZVdoZXJlKHRlc3QpOwogICAgX25vdGlmeUxlbmd0aENoYW5nZWQoX21hcC5sZW5ndGggLSBiZWZvcmUpOwogIH0KCiAgdm9pZCBfbm90aWZ5TGVuZ3RoQ2hhbmdlZChpbnQgZGVsdGEpIHsKICAgIGludCBvbGRMZW5ndGggPSBfbWFwLmxlbmd0aDsKICAgIGludCBuZXdMZW5ndGggPSBvbGRMZW5ndGggKyBkZWx0YTsKICAgIF9jb3VudHNbb2xkTGVuZ3RoXS0tOwogICAgaWYgKG5ld0xlbmd0aCA8IF9jb3VudHMubGVuZ3RoKSB7CiAgICAgIF9jb3VudHNbbmV3TGVuZ3RoXSsrOwogICAgfSBlbHNlIHsKICAgICAgX2NvdW50cy5hZGQoMSk7CiAgICAgIGFzc2VydChuZXdMZW5ndGggPT0gX2NvdW50cy5sZW5ndGggLSAxKTsKICAgIH0KICB9Cn0KgJwATk48AURCRCcEQwRFNiwYFjcBPQEpQjcREwQBIS82ASkTMBoIIR4bMCIlSTEfCggIBAEMIQwkDCoBDCUMKQEMOQxBAQwqDCgBDC4aBAEMJiIfGQYEAQwnLBoXEgQBDBkhIAYdBAEMITYEAQwRKBIEAQw1DDgBDDY+BAEMSRsBDDg0AQwtHAQBDDAeHDAEASkhJxomHA0WLwYEAgErcGFja2FnZTpjb21waWxlci9zcmMvaGVscGVycy90cmFja19tYXAuZGFydDZzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2VucXVldWVyLmRhcnSnOi8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuanMuZW5xdWV1ZTsKCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJyBzaG93IFF1ZXVlOwoKaW1wb3J0ICcuLi9jb21tb24vdGFza3MuZGFydCcgc2hvdyBDb21waWxlclRhc2s7CmltcG9ydCAnLi4vY29tbW9uL3dvcmsuZGFydCcgc2hvdyBXb3JrSXRlbTsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2VucXVldWUuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9hbm5vdGF0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvbWVtYmVyX3VzYWdlLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JwogICAgc2hvdwogICAgICAgIENvbnN0YW50VXNlLAogICAgICAgIER5bmFtaWNVc2UsCiAgICAgICAgU3RhdGljVXNlLAogICAgICAgIFN0YXRpY1VzZUtpbmQsCiAgICAgICAgVHlwZVVzZSwKICAgICAgICBUeXBlVXNlS2luZDsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydCcKICAgIHNob3cgSW1wYWN0VXNlQ2FzZSwgV29ybGRJbXBhY3QsIFdvcmxkSW1wYWN0VmlzaXRvcjsKaW1wb3J0ICcuLi91dGlsL2VudW1zZXQuZGFydCc7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgU2V0bGV0OwoKLy8vIFtFbnF1ZXVlcl0gd2hpY2ggaXMgc3BlY2lmaWMgdG8gY29kZSBnZW5lcmF0aW9uLgpjbGFzcyBDb2RlZ2VuRW5xdWV1ZXIgZXh0ZW5kcyBFbnF1ZXVlckltcGwgewogIGZpbmFsIFN0cmluZyBuYW1lOwogIFNldDxDbGFzc0VudGl0eT4gX3JlY2VudENsYXNzZXMgPSBuZXcgU2V0bGV0PENsYXNzRW50aXR5PigpOwogIGJvb2wgX3JlY2VudENvbnN0YW50cyA9IGZhbHNlOwogIGZpbmFsIENvZGVnZW5Xb3JsZEJ1aWxkZXJJbXBsIF93b3JsZEJ1aWxkZXI7CiAgZmluYWwgV29ya0l0ZW1CdWlsZGVyIF93b3JrSXRlbUJ1aWxkZXI7CgogIEBvdmVycmlkZQogIGJvb2wgcXVldWVJc0Nsb3NlZCA9IGZhbHNlOwogIEBvdmVycmlkZQogIGZpbmFsIENvbXBpbGVyVGFzayB0YXNrOwogIEBvdmVycmlkZQogIGZpbmFsIEVucXVldWVyTGlzdGVuZXIgbGlzdGVuZXI7CiAgZmluYWwgQW5ub3RhdGlvbnNEYXRhIF9hbm5vdGF0aW9uc0RhdGE7CgogIFdvcmxkSW1wYWN0VmlzaXRvciBfaW1wYWN0VmlzaXRvcjsKCiAgZmluYWwgUXVldWU8V29ya0l0ZW0+IF9xdWV1ZSA9IG5ldyBRdWV1ZTxXb3JrSXRlbT4oKTsKCiAgLy8vIEFsbCBkZWNsYXJhdGlvbiBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBwcm9jZXNzZWQgYnkgY29kZWdlbi4KICBmaW5hbCBTZXQ8TWVtYmVyRW50aXR5PiBfcHJvY2Vzc2VkRW50aXRpZXMgPSBuZXcgU2V0PE1lbWJlckVudGl0eT4oKTsKCiAgLy8gSWYgbm90IGBudWxsYCB0aGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBxdWV1ZSBoYXMgYmVlbiBlbXB0aWVkLiBJdCBhbGxvd3MgZm9yCiAgLy8gYXBwbHlpbmcgYWRkaXRpb25hbCBpbXBhY3RzIGJlZm9yZSByZS1lbXB0eWluZyB0aGUgcXVldWUuCiAgdm9pZCBGdW5jdGlvbigpIG9uRW1wdHlGb3JUZXN0aW5nOwoKICBzdGF0aWMgY29uc3QgSW1wYWN0VXNlQ2FzZSBJTVBBQ1RfVVNFID0KICAgICAgY29uc3QgSW1wYWN0VXNlQ2FzZSgnQ29kZWdlbkVucXVldWVyJyk7CgogIENvZGVnZW5FbnF1ZXVlcih0aGlzLnRhc2ssIHRoaXMuX3dvcmxkQnVpbGRlciwgdGhpcy5fd29ya0l0ZW1CdWlsZGVyLAogICAgICB0aGlzLmxpc3RlbmVyLCB0aGlzLl9hbm5vdGF0aW9uc0RhdGEpCiAgICAgIDogdGhpcy5uYW1lID0gJ2NvZGVnZW4gZW5xdWV1ZXInIHsKICAgIF9pbXBhY3RWaXNpdG9yID0gbmV3IEVucXVldWVySW1wbEltcGFjdFZpc2l0b3IodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb2RlZ2VuV29ybGRCdWlsZGVyIGdldCB3b3JsZEJ1aWxkZXIgPT4gX3dvcmxkQnVpbGRlcjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgcXVldWVJc0VtcHR5ID0+IF9xdWV1ZS5pc0VtcHR5OwoKICBAb3ZlcnJpZGUKICB2b2lkIGNoZWNrUXVldWVJc0VtcHR5KCkgewogICAgaWYgKF9xdWV1ZS5pc05vdEVtcHR5KSB7CiAgICAgIGZhaWxlZEF0KF9xdWV1ZS5maXJzdC5lbGVtZW50LCAiJG5hbWUgcXVldWUgaXMgbm90IGVtcHR5LiIpOwogICAgfQogIH0KCiAgLy8vIFJldHVybnMgWzp0cnVlOl0gaWYgdGhpcyBlbnF1ZXVlciBpcyB0aGUgcmVzb2x1dGlvbiBlbnF1ZXVlci4KICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1Jlc29sdXRpb25RdWV1ZSA9PiBmYWxzZTsKCiAgLy8vIENyZWF0ZSBhIFtXb3JrSXRlbV0gZm9yIFtlbnRpdHldIGFuZCBhZGQgaXQgdG8gdGhlIHdvcmsgbGlzdCBpZiBpdCBoYXMgbm90CiAgLy8vIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQuCiAgdm9pZCBfYWRkVG9Xb3JrTGlzdChNZW1iZXJFbnRpdHkgZW50aXR5KSB7CiAgICBpZiAoX3Byb2Nlc3NlZEVudGl0aWVzLmNvbnRhaW5zKGVudGl0eSkpIHJldHVybjsKCiAgICBXb3JrSXRlbSB3b3JrSXRlbSA9IF93b3JrSXRlbUJ1aWxkZXIuY3JlYXRlV29ya0l0ZW0oZW50aXR5KTsKICAgIGlmICh3b3JrSXRlbSA9PSBudWxsKSByZXR1cm47CgogICAgaWYgKHF1ZXVlSXNDbG9zZWQpIHsKICAgICAgZmFpbGVkQXQoZW50aXR5LCAiQ29kZWdlbiB3b3JrIGxpc3QgaXMgY2xvc2VkLiBUcnlpbmcgdG8gYWRkICRlbnRpdHkiKTsKICAgIH0KCiAgICBhcHBseUltcGFjdChsaXN0ZW5lci5yZWdpc3RlclVzZWRFbGVtZW50KGVudGl0eSkpOwogICAgX3F1ZXVlLmFkZCh3b3JrSXRlbSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFwcGx5SW1wYWN0KFdvcmxkSW1wYWN0IHdvcmxkSW1wYWN0LCB7dmFyIGltcGFjdFNvdXJjZX0pIHsKICAgIGlmICh3b3JsZEltcGFjdC5pc0VtcHR5KSByZXR1cm47CiAgICBpbXBhY3RTdHJhdGVneS52aXNpdEltcGFjdCgKICAgICAgICBpbXBhY3RTb3VyY2UsIHdvcmxkSW1wYWN0LCBfaW1wYWN0VmlzaXRvciwgaW1wYWN0VXNlKTsKICB9CgogIHZvaWQgX3JlZ2lzdGVySW5zdGFudGlhdGVkVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUsCiAgICAgIHtib29sIG5hdGl2ZVVzYWdlOiBmYWxzZX0pIHsKICAgIHRhc2subWVhc3VyZVN1YnRhc2soJ2NvZGVnZW4udHlwZVVzZScsICgpIHsKICAgICAgX3dvcmxkQnVpbGRlci5yZWdpc3RlclR5cGVJbnN0YW50aWF0aW9uKHR5cGUsIF9hcHBseUNsYXNzVXNlKTsKICAgICAgbGlzdGVuZXIucmVnaXN0ZXJJbnN0YW50aWF0ZWRUeXBlKHR5cGUsIG5hdGl2ZVVzYWdlOiBuYXRpdmVVc2FnZSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY2hlY2tOb0VucXVldWVkSW52b2tlZEluc3RhbmNlTWV0aG9kcygKICAgICAgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCkgewogICAgcmV0dXJuIGNoZWNrRW5xdWV1ZXJDb25zaXN0ZW5jeShlbGVtZW50RW52aXJvbm1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjaGVja0NsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgX3dvcmxkQnVpbGRlci5wcm9jZXNzQ2xhc3NNZW1iZXJzKGNscywKICAgICAgICAoTWVtYmVyRW50aXR5IG1lbWJlciwgRW51bVNldDxNZW1iZXJVc2U+IHVzZVNldCkgewogICAgICBpZiAodXNlU2V0LmlzTm90RW1wdHkpIHsKICAgICAgICBmYWlsZWRBdChtZW1iZXIsCiAgICAgICAgICAgICdVbmVucXVldWVkIHVzZSBvZiAkbWVtYmVyOiAke3VzZVNldC5pdGVyYWJsZShNZW1iZXJVc2UudmFsdWVzKX0nKTsKICAgICAgfQogICAgfSwgY2hlY2tFbnF1ZXVlckNvbnNpc3RlbmN5OiB0cnVlKTsKICB9CgogIC8vLyBDYWxsYmFjayBmb3IgYXBwbHlpbmcgdGhlIHVzZSBvZiBhIFtjbHNdLgogIHZvaWQgX2FwcGx5Q2xhc3NVc2UoQ2xhc3NFbnRpdHkgY2xzLCBFbnVtU2V0PENsYXNzVXNlPiB1c2VTZXQpIHsKICAgIGlmICh1c2VTZXQuY29udGFpbnMoQ2xhc3NVc2UuSU5TVEFOVElBVEVEKSkgewogICAgICBfcmVjZW50Q2xhc3Nlcy5hZGQoY2xzKTsKICAgICAgX3dvcmxkQnVpbGRlci5wcm9jZXNzQ2xhc3NNZW1iZXJzKGNscywgX2FwcGx5TWVtYmVyVXNlKTsKICAgICAgLy8gV2Ugb25seSB0ZWxsIHRoZSBiYWNrZW5kIG9uY2UgdGhhdCBbY2xzXSB3YXMgaW5zdGFudGlhdGVkLCBzbwogICAgICAvLyBhbnkgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgbXVzdCBiZSB0cmVhdGVkIGFzIGdsb2JhbAogICAgICAvLyBkZXBlbmRlbmNpZXMuCiAgICAgIGFwcGx5SW1wYWN0KGxpc3RlbmVyLnJlZ2lzdGVySW5zdGFudGlhdGVkQ2xhc3MoY2xzKSk7CiAgICB9CiAgICBpZiAodXNlU2V0LmNvbnRhaW5zKENsYXNzVXNlLklNUExFTUVOVEVEKSkgewogICAgICBhcHBseUltcGFjdChsaXN0ZW5lci5yZWdpc3RlckltcGxlbWVudGVkQ2xhc3MoY2xzKSk7CiAgICB9CiAgfQoKICAvLy8gQ2FsbGJhY2sgZm9yIGFwcGx5aW5nIHRoZSB1c2Ugb2YgYSBbbWVtYmVyXS4KICB2b2lkIF9hcHBseU1lbWJlclVzZShNZW1iZXJFbnRpdHkgbWVtYmVyLCBFbnVtU2V0PE1lbWJlclVzZT4gdXNlU2V0KSB7CiAgICBpZiAodXNlU2V0LmNvbnRhaW5zKE1lbWJlclVzZS5OT1JNQUwpKSB7CiAgICAgIF9hZGRUb1dvcmtMaXN0KG1lbWJlcik7CiAgICB9CiAgICBpZiAodXNlU2V0LmNvbnRhaW5zKE1lbWJlclVzZS5DTE9TVVJJWkVfSU5TVEFOQ0UpKSB7CiAgICAgIF9yZWdpc3RlckNsb3N1cml6ZWRNZW1iZXIobWVtYmVyKTsKICAgIH0KICAgIGlmICh1c2VTZXQuY29udGFpbnMoTWVtYmVyVXNlLkNMT1NVUklaRV9TVEFUSUMpKSB7CiAgICAgIGFwcGx5SW1wYWN0KGxpc3RlbmVyLnJlZ2lzdGVyR2V0T2ZTdGF0aWNGdW5jdGlvbigpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJvY2Vzc0R5bmFtaWNVc2UoRHluYW1pY1VzZSBkeW5hbWljVXNlKSB7CiAgICB0YXNrLm1lYXN1cmVTdWJ0YXNrKCdjb2RlZ2VuLmR5bmFtaWNVc2UnLCAoKSB7CiAgICAgIF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKGR5bmFtaWNVc2UsIF9hcHBseU1lbWJlclVzZSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJvY2Vzc1N0YXRpY1VzZShNZW1iZXJFbnRpdHkgbWVtYmVyLCBTdGF0aWNVc2Ugc3RhdGljVXNlKSB7CiAgICB0YXNrLm1lYXN1cmVTdWJ0YXNrKCdjb2RlZ2VuLnN0YXRpY1VzZScsICgpIHsKICAgICAgX3dvcmxkQnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShzdGF0aWNVc2UsIF9hcHBseU1lbWJlclVzZSk7CiAgICAgIHN3aXRjaCAoc3RhdGljVXNlLmtpbmQpIHsKICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuQ09OU1RSVUNUT1JfSU5WT0tFOgogICAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DT05TVF9DT05TVFJVQ1RPUl9JTlZPS0U6CiAgICAgICAgICBwcm9jZXNzVHlwZVVzZShtZW1iZXIsIG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24oc3RhdGljVXNlLnR5cGUpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5JTkxJTklORzoKICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNob3VsZCB0aGlzIGJlIHRyYWNrZWQgd2l0aCBfTWVtYmVyVXNhZ2UgPwogICAgICAgICAgbGlzdGVuZXIucmVnaXN0ZXJVc2VkRWxlbWVudChzdGF0aWNVc2UuZWxlbWVudCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcm9jZXNzVHlwZVVzZShNZW1iZXJFbnRpdHkgbWVtYmVyLCBUeXBlVXNlIHR5cGVVc2UpIHsKICAgIERhcnRUeXBlIHR5cGUgPSB0eXBlVXNlLnR5cGU7CiAgICBzd2l0Y2ggKHR5cGVVc2Uua2luZCkgewogICAgICBjYXNlIFR5cGVVc2VLaW5kLklOU1RBTlRJQVRJT046CiAgICAgICAgX3JlZ2lzdGVySW5zdGFudGlhdGVkVHlwZSh0eXBlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5OQVRJVkVfSU5TVEFOVElBVElPTjoKICAgICAgICBfcmVnaXN0ZXJJbnN0YW50aWF0ZWRUeXBlKHR5cGUsIG5hdGl2ZVVzYWdlOiB0cnVlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5JU19DSEVDSzoKICAgICAgY2FzZSBUeXBlVXNlS2luZC5DQVRDSF9UWVBFOgogICAgICAgIF9yZWdpc3RlcklzQ2hlY2sodHlwZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuQVNfQ0FTVDoKICAgICAgICBpZiAoX2Fubm90YXRpb25zRGF0YS5nZXRFeHBsaWNpdENhc3RDaGVja1BvbGljeShtZW1iZXIpLmlzRW1pdHRlZCkgewogICAgICAgICAgX3JlZ2lzdGVySXNDaGVjayh0eXBlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuSU1QTElDSVRfQ0FTVDoKICAgICAgICBpZiAoX2Fubm90YXRpb25zRGF0YS5nZXRJbXBsaWNpdERvd25jYXN0Q2hlY2tQb2xpY3kobWVtYmVyKS5pc0VtaXR0ZWQpIHsKICAgICAgICAgIF9yZWdpc3RlcklzQ2hlY2sodHlwZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFR5cGVVc2VLaW5kLlBBUkFNRVRFUl9DSEVDSzoKICAgICAgICBpZiAoX2Fubm90YXRpb25zRGF0YS5nZXRQYXJhbWV0ZXJDaGVja1BvbGljeShtZW1iZXIpLmlzRW1pdHRlZCkgewogICAgICAgICAgX3JlZ2lzdGVySXNDaGVjayh0eXBlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuVFlQRV9MSVRFUkFMOgogICAgICAgIGlmICh0eXBlIGlzIFR5cGVWYXJpYWJsZVR5cGUpIHsKICAgICAgICAgIF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJUeXBlVmFyaWFibGVUeXBlTGl0ZXJhbCh0eXBlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuUlRJX1ZBTFVFOgogICAgICAgIF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJDb25zdFR5cGVMaXRlcmFsKHR5cGUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFR5cGVVc2VLaW5kLlRZUEVfQVJHVU1FTlQ6CiAgICAgICAgX3dvcmxkQnVpbGRlci5yZWdpc3RlclR5cGVBcmd1bWVudCh0eXBlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5DT05TVF9JTlNUQU5USUFUSU9OOgogICAgICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICJVbmV4cGVjdGVkIHR5cGUgdXNlOiAkdHlwZVVzZS4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJvY2Vzc0NvbnN0YW50VXNlKENvbnN0YW50VXNlIGNvbnN0YW50VXNlKSB7CiAgICB0YXNrLm1lYXN1cmVTdWJ0YXNrKCdjb2RlZ2VuLmNvbnN0YW50VXNlJywgKCkgewogICAgICBpZiAoX3dvcmxkQnVpbGRlci5yZWdpc3RlckNvbnN0YW50VXNlKGNvbnN0YW50VXNlKSkgewogICAgICAgIGFwcGx5SW1wYWN0KGxpc3RlbmVyLnJlZ2lzdGVyVXNlZENvbnN0YW50KGNvbnN0YW50VXNlLnZhbHVlKSk7CiAgICAgICAgX3JlY2VudENvbnN0YW50cyA9IHRydWU7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCBfcmVnaXN0ZXJJc0NoZWNrKERhcnRUeXBlIHR5cGUpIHsKICAgIF93b3JsZEJ1aWxkZXIucmVnaXN0ZXJJc0NoZWNrKHR5cGUpOwogIH0KCiAgdm9pZCBfcmVnaXN0ZXJDbG9zdXJpemVkTWVtYmVyKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIpOwogICAgYXBwbHlJbXBhY3QobGlzdGVuZXIucmVnaXN0ZXJDbG9zdXJpemVkTWVtYmVyKGVsZW1lbnQpKTsKICB9CgogIHZvaWQgX2ZvckVhY2godm9pZCBmKFdvcmtJdGVtIHdvcmspKSB7CiAgICBkbyB7CiAgICAgIHdoaWxlIChfcXVldWUuaXNOb3RFbXB0eSkgewogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEZpbmQgYW4gb3B0aW1hbCBwcm9jZXNzIG9yZGVyLgogICAgICAgIFdvcmtJdGVtIHdvcmsgPSBfcXVldWUucmVtb3ZlTGFzdCgpOwogICAgICAgIGlmICghX3Byb2Nlc3NlZEVudGl0aWVzLmNvbnRhaW5zKHdvcmsuZWxlbWVudCkpIHsKICAgICAgICAgIGYod29yayk7CiAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZWdpc3RlciB0aGUgcHJvY2Vzc2VkIGVsZW1lbnQgaGVyZS4gVGhpcwogICAgICAgICAgLy8gaXMgY3VycmVudGx5IGEgc2lkZS1lZmZlY3Qgb2YgY2FsbGluZyBgd29yay5ydW5gLgogICAgICAgICAgX3Byb2Nlc3NlZEVudGl0aWVzLmFkZCh3b3JrLmVsZW1lbnQpOwogICAgICAgIH0KICAgICAgfQogICAgICBMaXN0PENsYXNzRW50aXR5PiByZWNlbnRzID0gX3JlY2VudENsYXNzZXMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIF9yZWNlbnRDbGFzc2VzLmNsZWFyKCk7CiAgICAgIF9yZWNlbnRDb25zdGFudHMgPSBmYWxzZTsKICAgICAgaWYgKCFfb25RdWV1ZUVtcHR5KHJlY2VudHMpKSBfcmVjZW50Q2xhc3Nlcy5hZGRBbGwocmVjZW50cyk7CiAgICB9IHdoaWxlICgKICAgICAgICBfcXVldWUuaXNOb3RFbXB0eSB8fCBfcmVjZW50Q2xhc3Nlcy5pc05vdEVtcHR5IHx8IF9yZWNlbnRDb25zdGFudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihXb3JrSXRlbSB3b3JrKSkgewogICAgX2ZvckVhY2goZik7CiAgICBpZiAob25FbXB0eUZvclRlc3RpbmcgIT0gbnVsbCkgewogICAgICBvbkVtcHR5Rm9yVGVzdGluZygpOwogICAgICBfZm9yRWFjaChmKTsKICAgIH0KICB9CgogIC8vLyBbX29uUXVldWVFbXB0eV0gaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBxdWV1ZSBpcyBkcmFpbmVkLiBbcmVjZW50Q2xhc3Nlc10KICAvLy8gY29udGFpbnMgdGhlIHNldCBvZiBhbGwgY2xhc3NlcyBzZWVuIGZvciB0aGUgZmlyc3QgdGltZSBzaW5jZQogIC8vLyBbX29uUXVldWVFbXB0eV0gd2FzIGNhbGxlZCBsYXN0LiBBIHJldHVybiB2YWx1ZSBvZiBbdHJ1ZV0gaW5kaWNhdGVzIHRoYXQKICAvLy8gdGhlIFtyZWNlbnRDbGFzc2VzXSBoYXZlIGJlZW4gcHJvY2Vzc2VkIGFuZCBtYXkgYmUgY2xlYXJlZC4gSWYgW2ZhbHNlXSBpcwogIC8vLyByZXR1cm5lZCwgW19vblF1ZXVlRW1wdHldIHdpbGwgYmUgY2FsbGVkIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5IGFnYWluIChvcgogIC8vLyBzdGlsbCBlbXB0eSkgYW5kIFtyZWNlbnRDbGFzc2VzXSB3aWxsIGJlIGEgc3VwZXJzZXQgb2YgdGhlIGN1cnJlbnQgdmFsdWUuCiAgYm9vbCBfb25RdWV1ZUVtcHR5KEl0ZXJhYmxlPENsYXNzRW50aXR5PiByZWNlbnRDbGFzc2VzKSB7CiAgICByZXR1cm4gbGlzdGVuZXIub25RdWV1ZUVtcHR5KHRoaXMsIHJlY2VudENsYXNzZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsb2dTdW1tYXJ5KHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSkgewogICAgbG9nKCdDb21waWxlZCAke19wcm9jZXNzZWRFbnRpdGllcy5sZW5ndGh9IG1ldGhvZHMuJyk7CiAgICBsaXN0ZW5lci5sb2dTdW1tYXJ5KGxvZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRW5xdWV1ZXIoJG5hbWUpJzsKCiAgQG92ZXJyaWRlCiAgSW1wYWN0VXNlQ2FzZSBnZXQgaW1wYWN0VXNlID0+IElNUEFDVF9VU0U7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZ2V0IHByb2Nlc3NlZEVudGl0aWVzID0+IF9wcm9jZXNzZWRFbnRpdGllczsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCBwcm9jZXNzZWRDbGFzc2VzID0+CiAgICAgIF93b3JsZEJ1aWxkZXIuaW5zdGFudGlhdGVkQ2xhc3NlczsKfQqBNgBOTjwBHAElATEsGTokIRopMSgeCRUUExcRFSc5HygBNS0VPyEvKgEMHgwbDCMqASUBOAFESAFRPyUBKi4BSCwpOgQBDDkBDCsBDB0dQwYEAUQMJwFRHi01AUEiARlOBgE3GgQBDEIlID8EATUjMEVJCAQBDC4vOQQBDCUrOx8ZUAgoBAEwQzIfP0c/FzwGMTsGBAEzSS0eBjkpBjc7BgQBDDIzRQgEAQxEMkMgLzVNESVNOxEREQgIBAEMPiIcJikPLTwPISMgDyBNIgoPJlEiCg8oSiIKDyUoPwoPIjYPJjIPLE8GBAEMNTQ8RyEICAQBKSkEATsmPQQBKQkiPy06E0w/MAoISh4gQw5NBAEMKBElGxMGBAFPRE9QUVA8NwQBDC47HgQBDCoBDC0BDEYBDDApAgEtcGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9lbnF1ZXVlci5kYXJ0P3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvY29kZV9lbWl0dGVyX3Rhc2suZGFydKDhLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19lbWl0dGVyLmNvZGVfZW1pdHRlcl90YXNrOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL3Rhc2tzLmRhcnQnIHNob3cgQ29tcGlsZXJUYXNrOwppbXBvcnQgJy4uL2NvbXBpbGVyLmRhcnQnIHNob3cgQ29tcGlsZXI7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9kZWZlcnJlZF9sb2FkLmRhcnQnIHNob3cgT3V0cHV0VW5pdDsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqc0FzdDsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2JhY2tlbmQuZGFydCcgc2hvdyBDb2RlZ2VuSW5wdXRzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvaW5mZXJyZWRfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hbWVyLmRhcnQnIHNob3cgTmFtZXI7CmltcG9ydCAnLi4vanNfbW9kZWwvanNfc3RyYXRlZ3kuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwppbXBvcnQgJ3Byb2dyYW1fYnVpbGRlci9wcm9ncmFtX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnc3RhcnR1cF9lbWl0dGVyL2VtaXR0ZXIuZGFydCcgYXMgc3RhcnR1cF9qc19lbWl0dGVyOwoKaW1wb3J0ICdtZXRhZGF0YV9jb2xsZWN0b3IuZGFydCcgc2hvdyBNZXRhZGF0YUNvbGxlY3RvcjsKaW1wb3J0ICdtb2RlbC5kYXJ0JzsKaW1wb3J0ICduYXRpdmVfZW1pdHRlci5kYXJ0JyBzaG93IE5hdGl2ZUVtaXR0ZXI7CmltcG9ydCAndHlwZV90ZXN0X3JlZ2lzdHJ5LmRhcnQnIHNob3cgVHlwZVRlc3RSZWdpc3RyeTsKCi8vLyBHZW5lcmF0ZXMgdGhlIGNvZGUgZm9yIGFsbCB1c2VkIGNsYXNzZXMgaW4gdGhlIHByb2dyYW0uIFN0YXRpYyBmaWVsZHMgKGV2ZW4KLy8vIGluIGNsYXNzZXMpIGFyZSBpZ25vcmVkLCBzaW5jZSB0aGV5IGNhbiBiZSB0cmVhdGVkIGFzIG5vbi1jbGFzcyBlbGVtZW50cy4KLy8vCi8vLyBUaGUgY29kZSBmb3IgdGhlIGNvbnRhaW5pbmcgKHVzZWQpIG1ldGhvZHMgbXVzdCBleGlzdCBpbiB0aGUgYHVuaXZlcnNlYC4KY2xhc3MgQ29kZUVtaXR0ZXJUYXNrIGV4dGVuZHMgQ29tcGlsZXJUYXNrIHsKICBUeXBlVGVzdFJlZ2lzdHJ5IHR5cGVUZXN0UmVnaXN0cnk7CiAgTmF0aXZlRW1pdHRlciBfbmF0aXZlRW1pdHRlcjsKICBNZXRhZGF0YUNvbGxlY3RvciBtZXRhZGF0YUNvbGxlY3RvcjsKICBFbWl0dGVyIF9lbWl0dGVyOwogIGZpbmFsIENvbXBpbGVyIF9jb21waWxlcjsKICBmaW5hbCBib29sIF9nZW5lcmF0ZVNvdXJjZU1hcDsKCiAgSnNCYWNrZW5kU3RyYXRlZ3kgZ2V0IF9iYWNrZW5kU3RyYXRlZ3kgPT4gX2NvbXBpbGVyLmJhY2tlbmRTdHJhdGVneTsKCiAgQGRlcHJlY2F0ZWQKICAvLyBUaGlzIGZpZWxkIHNob3VsZCBiZSByZW1vdmVkLiBJdCdzIGN1cnJlbnRseSBvbmx5IG5lZWRlZCBmb3IgZHVtcC1pbmZvIGFuZAogIC8vIHRlc3RzLgogIC8vIFRoZSBmaWVsZCBpcyBzZXQgYWZ0ZXIgdGhlIHByb2dyYW0gaGFzIGJlZW4gZW1pdHRlZC4KICAvLy8gQ29udGFpbnMgYSBsaXN0IG9mIGFsbCBjbGFzc2VzIHRoYXQgYXJlIGVtaXR0ZWQuCiAgU2V0PENsYXNzRW50aXR5PiBuZWVkZWRDbGFzc2VzOwoKICBDb2RlRW1pdHRlclRhc2sodGhpcy5fY29tcGlsZXIsIHRoaXMuX2dlbmVyYXRlU291cmNlTWFwKQogICAgICA6IHN1cGVyKF9jb21waWxlci5tZWFzdXJlcik7CgogIE5hdGl2ZUVtaXR0ZXIgZ2V0IG5hdGl2ZUVtaXR0ZXIgewogICAgYXNzZXJ0KAogICAgICAgIF9uYXRpdmVFbWl0dGVyICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwgIk5hdGl2ZUVtaXR0ZXIgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LiIpKTsKICAgIHJldHVybiBfbmF0aXZlRW1pdHRlcjsKICB9CgogIEVtaXR0ZXIgZ2V0IGVtaXR0ZXIgewogICAgYXNzZXJ0KF9lbWl0dGVyICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLCAiRW1pdHRlciBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuIikpOwogICAgcmV0dXJuIF9lbWl0dGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICdDb2RlIGVtaXR0ZXInOwoKICB2b2lkIF9maW5hbGl6ZVJ0aShDb2RlZ2VuSW5wdXRzIGNvZGVnZW4sIENvZGVnZW5Xb3JsZCBjb2RlZ2VuV29ybGQpIHsKICAgIC8vIENvbXB1dGUgdGhlIHJlcXVpcmVkIHR5cGUgY2hlY2tzIHRvIGtub3cgd2hpY2ggY2xhc3NlcyBuZWVkIGEKICAgIC8vICdpcyQnIG1ldGhvZC4KICAgIHR5cGVUZXN0UmVnaXN0cnkuY29tcHV0ZVJlcXVpcmVkVHlwZUNoZWNrcygKICAgICAgICBfYmFja2VuZFN0cmF0ZWd5LnJ0aUNoZWNrc0J1aWxkZXIsIGNvZGVnZW5Xb3JsZCk7CiAgICAvLyBDb21wdXRlIHRoZSBjbGFzc2VzIG5lZWRlZCBieSBSVEkuCiAgICB0eXBlVGVzdFJlZ2lzdHJ5LmNvbXB1dGVSdGlOZWVkZWRDbGFzc2VzKAogICAgICAgIGNvZGVnZW4ucnRpU3Vic3RpdHV0aW9ucywgX2JhY2tlbmRTdHJhdGVneS5nZW5lcmF0ZWRDb2RlLmtleXMpOwogIH0KCiAgLy8vIENyZWF0ZXMgdGhlIFtFbWl0dGVyXSBmb3IgdGhpcyB0YXNrLgogIHZvaWQgY3JlYXRlRW1pdHRlcigKICAgICAgTmFtZXIgbmFtZXIsIENvZGVnZW5JbnB1dHMgY29kZWdlbiwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBtZWFzdXJlKCgpIHsKICAgICAgX25hdGl2ZUVtaXR0ZXIgPSBuZXcgTmF0aXZlRW1pdHRlcigKICAgICAgICAgIHRoaXMsIGNsb3NlZFdvcmxkLCBfYmFja2VuZFN0cmF0ZWd5Lm5hdGl2ZUNvZGVnZW5FbnF1ZXVlcik7CiAgICAgIF9lbWl0dGVyID0gbmV3IHN0YXJ0dXBfanNfZW1pdHRlci5FbWl0dGVySW1wbCgKICAgICAgICAgIF9jb21waWxlci5vcHRpb25zLAogICAgICAgICAgX2NvbXBpbGVyLnJlcG9ydGVyLAogICAgICAgICAgX2NvbXBpbGVyLm91dHB1dFByb3ZpZGVyLAogICAgICAgICAgX2NvbXBpbGVyLmR1bXBJbmZvVGFzaywKICAgICAgICAgIG5hbWVyLAogICAgICAgICAgY2xvc2VkV29ybGQsCiAgICAgICAgICBjb2RlZ2VuLnJ0aUVuY29kZXIsCiAgICAgICAgICBjb2RlZ2VuLnJ0aVJlY2lwZUVuY29kZXIsCiAgICAgICAgICBfYmFja2VuZFN0cmF0ZWd5LnNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3ksCiAgICAgICAgICB0aGlzLAogICAgICAgICAgX2dlbmVyYXRlU291cmNlTWFwKTsKICAgICAgbWV0YWRhdGFDb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IoCiAgICAgICAgICBfY29tcGlsZXIub3B0aW9ucywKICAgICAgICAgIF9jb21waWxlci5yZXBvcnRlciwKICAgICAgICAgIF9lbWl0dGVyLAogICAgICAgICAgY29kZWdlbi5ydGlFbmNvZGVyLAogICAgICAgICAgY29kZWdlbi5ydGlSZWNpcGVFbmNvZGVyLAogICAgICAgICAgY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50KTsKICAgICAgdHlwZVRlc3RSZWdpc3RyeSA9IG5ldyBUeXBlVGVzdFJlZ2lzdHJ5KAogICAgICAgICAgX2NvbXBpbGVyLm9wdGlvbnMsIGNsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudCk7CiAgICB9KTsKICB9CgogIGludCBhc3NlbWJsZVByb2dyYW0oCiAgICAgIE5hbWVyIG5hbWVyLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIEluZmVycmVkRGF0YSBpbmZlcnJlZERhdGEsCiAgICAgIENvZGVnZW5JbnB1dHMgY29kZWdlbklucHV0cywKICAgICAgQ29kZWdlbldvcmxkIGNvZGVnZW5Xb3JsZCkgewogICAgcmV0dXJuIG1lYXN1cmUoKCkgewogICAgICBtZWFzdXJlU3VidGFzaygnZmluYWxpemUgcnRpJywgKCkgewogICAgICAgIF9maW5hbGl6ZVJ0aShjb2RlZ2VuSW5wdXRzLCBjb2RlZ2VuV29ybGQpOwogICAgICB9KTsKICAgICAgUHJvZ3JhbUJ1aWxkZXIgcHJvZ3JhbUJ1aWxkZXIgPSBuZXcgUHJvZ3JhbUJ1aWxkZXIoCiAgICAgICAgICBfY29tcGlsZXIub3B0aW9ucywKICAgICAgICAgIF9jb21waWxlci5yZXBvcnRlciwKICAgICAgICAgIGNsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLAogICAgICAgICAgY2xvc2VkV29ybGQub3V0cHV0VW5pdERhdGEsCiAgICAgICAgICBjb2RlZ2VuV29ybGQsCiAgICAgICAgICBfYmFja2VuZFN0cmF0ZWd5Lm5hdGl2ZUNvZGVnZW5FbnF1ZXVlciwKICAgICAgICAgIGNsb3NlZFdvcmxkLmJhY2tlbmRVc2FnZSwKICAgICAgICAgIGNsb3NlZFdvcmxkLm5hdGl2ZURhdGEsCiAgICAgICAgICBjbG9zZWRXb3JsZC5ydGlOZWVkLAogICAgICAgICAgY2xvc2VkV29ybGQuaW50ZXJjZXB0b3JEYXRhLAogICAgICAgICAgdHlwZVRlc3RSZWdpc3RyeS5ydGlDaGVja3MsCiAgICAgICAgICBjb2RlZ2VuSW5wdXRzLnJ0aUVuY29kZXIsCiAgICAgICAgICBjb2RlZ2VuSW5wdXRzLnJ0aVJlY2lwZUVuY29kZXIsCiAgICAgICAgICBjb2RlZ2VuV29ybGQub25lU2hvdEludGVyY2VwdG9yRGF0YSwKICAgICAgICAgIF9iYWNrZW5kU3RyYXRlZ3kuY3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXMsCiAgICAgICAgICBfYmFja2VuZFN0cmF0ZWd5LmdlbmVyYXRlZENvZGUsCiAgICAgICAgICBuYW1lciwKICAgICAgICAgIHRoaXMsCiAgICAgICAgICBjbG9zZWRXb3JsZCwKICAgICAgICAgIGNsb3NlZFdvcmxkLmZpZWxkQW5hbHlzaXMsCiAgICAgICAgICBpbmZlcnJlZERhdGEsCiAgICAgICAgICBfYmFja2VuZFN0cmF0ZWd5LnNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3ksCiAgICAgICAgICBjbG9zZWRXb3JsZC5zb3J0ZXIsCiAgICAgICAgICB0eXBlVGVzdFJlZ2lzdHJ5LnJ0aU5lZWRlZENsYXNzZXMsCiAgICAgICAgICBjbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQubWFpbkZ1bmN0aW9uKTsKICAgICAgaW50IHNpemUgPSBlbWl0dGVyLmVtaXRQcm9ncmFtKHByb2dyYW1CdWlsZGVyLCBjb2RlZ2VuV29ybGQpOwogICAgICAvLyBUT0RPKGZsb2l0c2NoKTogd2Ugc2hvdWxkbid0IG5lZWQgdGhlIGBuZWVkZWRDbGFzc2VzYCBhbnltb3JlLgogICAgICBuZWVkZWRDbGFzc2VzID0gcHJvZ3JhbUJ1aWxkZXIuY29sbGVjdG9yLm5lZWRlZENsYXNzZXM7CiAgICAgIHJldHVybiBzaXplOwogICAgfSk7CiAgfQp9CgovLy8gSW50ZXJmYWNlIGZvciB0aGUgc3Vic2V0IG9mIHRoZSBbRW1pdHRlcl0gdGhhdCBjYW4gYmUgdXNlZCBkdXJpbmcgbW9kdWxhcgovLy8gY29kZSBnZW5lcmF0aW9uLgovLy8KLy8vIE5vdGUgdGhhdCB0aGUgZW1pc3Npb24gcGhhc2UgaXMgbm90IGl0c2VsZiBtb2R1bGFyIGJ1dCBwZXJmb3JtZWQgb24KLy8vIHRoZSBjbG9zZWQgd29ybGQgY29tcHV0ZWQgYnkgdGhlIGNvZGVnZW4gZW5xdWV1ZXIuCmFic3RyYWN0IGNsYXNzIE1vZHVsYXJFbWl0dGVyIHsKICAvLy8gUmV0dXJucyB0aGUgSlMgcHJvdG90eXBlIG9mIHRoZSBnaXZlbiBjbGFzcyBbZV0uCiAganNBc3QuRXhwcmVzc2lvbiBwcm90b3R5cGVBY2Nlc3MoQ2xhc3NFbnRpdHkgZSwge2Jvb2wgaGFzQmVlbkluc3RhbnRpYXRlZH0pOwoKICAvLy8gUmV0dXJucyB0aGUgSlMgZnVuY3Rpb24gcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBmdW5jdGlvbi4KICAvLy8KICAvLy8gVGhlIGZ1bmN0aW9uIG11c3QgYmUgaW52b2tlZCBhbmQgY2FuIG5vdCBiZSB1c2VkIGFzIGNsb3N1cmUuCiAganNBc3QuRXhwcmVzc2lvbiBzdGF0aWNGdW5jdGlvbkFjY2VzcyhGdW5jdGlvbkVudGl0eSBlbGVtZW50KTsKCiAganNBc3QuRXhwcmVzc2lvbiBzdGF0aWNGaWVsZEFjY2VzcyhGaWVsZEVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIEpTIGZ1bmN0aW9uIHRoYXQgbXVzdCBiZSBpbnZva2VkIHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlCiAgLy8vIGxhemlseSBpbml0aWFsaXplZCBzdGF0aWMuCiAganNBc3QuRXhwcmVzc2lvbiBpc29sYXRlTGF6eUluaXRpYWxpemVyQWNjZXNzKGNvdmFyaWFudCBGaWVsZEVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIGNsb3N1cmUgZXhwcmVzc2lvbiBvZiBhIHN0YXRpYyBmdW5jdGlvbi4KICBqc0FzdC5FeHByZXNzaW9uIHN0YXRpY0Nsb3N1cmVBY2Nlc3MoY292YXJpYW50IEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyB0aGUgSlMgY29uc3RydWN0b3Igb2YgdGhlIGdpdmVuIGVsZW1lbnQuCiAgLy8vCiAgLy8vIFRoZSByZXR1cm5lZCBleHByZXNzaW9uIG11c3Qgb25seSBiZSB1c2VkIGluIGEgSlMgYG5ld2AgZXhwcmVzc2lvbi4KICBqc0FzdC5FeHByZXNzaW9uIGNvbnN0cnVjdG9yQWNjZXNzKENsYXNzRW50aXR5IGUpOwoKICAvLy8gUmV0dXJucyB0aGUgSlMgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIHR5cGUgW2VdLgogIGpzQXN0LkV4cHJlc3Npb24gdHlwZUFjY2VzcyhFbnRpdHkgZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBKUyBuYW1lIHJlcHJlc2VudGluZyB0aGUgdHlwZSBbZV0uCiAganNBc3QuTmFtZSB0eXBlQWNjZXNzTmV3UnRpKEVudGl0eSBlKTsKCiAgLy8vIFJldHVybnMgdGhlIEpTIG5hbWUgcmVwcmVzZW50aW5nIHRoZSB0eXBlIHZhcmlhYmxlIFtlXS4KICBqc0FzdC5OYW1lIHR5cGVWYXJpYWJsZUFjY2Vzc05ld1J0aShUeXBlVmFyaWFibGVFbnRpdHkgZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBKUyBjb2RlIGZvciBhY2Nlc3NpbmcgdGhlIGVtYmVkZGVkIFtnbG9iYWxdLgogIGpzQXN0LkV4cHJlc3Npb24gZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhTdHJpbmcgZ2xvYmFsKTsKCiAgLy8vIFJldHVybnMgdGhlIEpTIGNvZGUgZm9yIGFjY2Vzc2luZyB0aGUgZ2l2ZW4gW2NvbnN0YW50XS4KICBqc0FzdC5FeHByZXNzaW9uIGNvbnN0YW50UmVmZXJlbmNlKENvbnN0YW50VmFsdWUgY29uc3RhbnQpOwoKICAvLy8gUmV0dXJucyB0aGUgSlMgY29kZSBmb3IgYWNjZXNzaW5nIHRoZSBnbG9iYWwgcHJvcGVydHkgW2dsb2JhbF0uCiAgU3RyaW5nIGdlbmVyYXRlRW1iZWRkZWRHbG9iYWxBY2Nlc3NTdHJpbmcoU3RyaW5nIGdsb2JhbCk7Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIHRoZSBlbWl0dGVyIHRoYXQgaXMgdXNlZCBkdXJpbmcgdGhlIGVtaXNzaW9uIHBoYXNlIG9uIHRoZQovLy8gY2xvc2VkIHdvcmxkIGNvbXB1dGVkIGJ5IHRoZSBjb2RlZ2VuIGVucXVldWVyLgovLy8KLy8vIFRoZXNlIG1ldGhvZHMgYXJlIF9ub3RfIGF2YWlsYWJsZSBkdXJpbmcgbW9kdWxhciBjb2RlIGdlbmVyYXRpb24uCmFic3RyYWN0IGNsYXNzIEVtaXR0ZXIgaW1wbGVtZW50cyBNb2R1bGFyRW1pdHRlciB7CiAgUHJvZ3JhbSBnZXQgcHJvZ3JhbUZvclRlc3Rpbmc7CgogIC8vLyBVc2VzIHRoZSBbcHJvZ3JhbUJ1aWxkZXJdIHRvIGdlbmVyYXRlIGEgbW9kZWwgb2YgdGhlIHByb2dyYW0sIGVtaXRzCiAgLy8vIHRoZSBwcm9ncmFtLCBhbmQgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIG91dHB1dC4KICBpbnQgZW1pdFByb2dyYW0oUHJvZ3JhbUJ1aWxkZXIgcHJvZ3JhbUJ1aWxkZXIsIENvZGVnZW5Xb3JsZCBjb2RlZ2VuV29ybGQpOwoKICAvLy8gUmV0dXJucyB0aGUgSlMgcHJvdG90eXBlIG9mIHRoZSBnaXZlbiBpbnRlcmNlcHRvciBjbGFzcyBbZV0uCiAganNBc3QuRXhwcmVzc2lvbiBpbnRlcmNlcHRvclByb3RvdHlwZUFjY2VzcyhDbGFzc0VudGl0eSBlKTsKCiAgLy8vIFJldHVybnMgdGhlIEpTIGNvbnN0cnVjdG9yIG9mIHRoZSBnaXZlbiBpbnRlcmNlcHRvciBjbGFzcyBbZV0uCiAganNBc3QuRXhwcmVzc2lvbiBpbnRlcmNlcHRvckNsYXNzQWNjZXNzKENsYXNzRW50aXR5IGUpOwoKICAvLy8gUmV0dXJucyB0aGUgSlMgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgJ251bGwnCiAganNBc3QuRXhwcmVzc2lvbiBnZW5lcmF0ZUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKCk7CgogIGludCBjb21wYXJlQ29uc3RhbnRzKENvbnN0YW50VmFsdWUgYSwgQ29uc3RhbnRWYWx1ZSBiKTsKICBib29sIGlzQ29uc3RhbnRJbmxpbmVkT3JBbHJlYWR5RW1pdHRlZChDb25zdGFudFZhbHVlIGNvbnN0YW50KTsKCiAgLy8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvZGUgZ2VuZXJhdGVkIGZvciBhIGdpdmVuIG91dHB1dCBbdW5pdF0uCiAgaW50IGdlbmVyYXRlZFNpemUoT3V0cHV0VW5pdCB1bml0KTsKfQqA5ABOTjwBLgEZMSkjMCQhOCsuJzEqLz0BORUxOAFQTgRNLSUgJxQcIQFHAQ5QDDo3IgE7IwEkDCASUBsEARgdTxUEAQwlAUhFFTA6Ki5IBAErFkYRKkY1HR4kIhEXHiQ2EB8xHR4UHiQrLz4IBAEXEyAhIyMYKjMKOh0eKiYmGDIkIh8nJiQqLzoqERAXJRg2Hi04REg+EwgEAgFOFQRINyA3TwE/BkNBATsBSyFQATtKATcGSjUBOykBNSkBPj0BP0ABPj4BRjwCAUwzBEYzIQFKQU0BQz4BRToBTDYBOkIBSCYCATZwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL2NvZGVfZW1pdHRlcl90YXNrLmRhcnQ+c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnTAAI27Ly8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9iaW5hcnkvYXN0X3RvX2JpbmFyeS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9iaW5hcnkvYXN0X2Zyb21fYmluYXJ5LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2JpbmFyeS9hc3RfdG9fYmluYXJ5LmRhcnQnIGFzIGlyOwppbXBvcnQgJy4uL2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0YW50X3N5c3RlbS5kYXJ0JyBhcyBjb25zdGFudF9zeXN0ZW07CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9kZWZlcnJlZF9sb2FkLmRhcnQnOwppbXBvcnQgJy4uL2RpYWdub3N0aWNzL3NvdXJjZV9zcGFuLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2luZGV4ZWQuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2lyL2NvbnN0YW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9zdGF0aWNfdHlwZV9iYXNlLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzOwppbXBvcnQgJy4uL2pzX21vZGVsL2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvbG9jYWxzLmRhcnQnOwoKcGFydCAnYWJzdHJhY3Rfc2luay5kYXJ0JzsKcGFydCAnYWJzdHJhY3Rfc291cmNlLmRhcnQnOwpwYXJ0ICdiaW5hcnlfc2luay5kYXJ0JzsKcGFydCAnYmluYXJ5X3NvdXJjZS5kYXJ0JzsKcGFydCAnaGVscGVycy5kYXJ0JzsKcGFydCAnbWVtYmVyX2RhdGEuZGFydCc7CnBhcnQgJ21peGlucy5kYXJ0JzsKcGFydCAnbm9kZV9pbmRleGVyLmRhcnQnOwpwYXJ0ICdvYmplY3Rfc2luay5kYXJ0JzsKcGFydCAnb2JqZWN0X3NvdXJjZS5kYXJ0JzsKCi8vLyBJbnRlcmZhY2UgZm9yIHNlcmlhbGl6YXRpb24uCmFic3RyYWN0IGNsYXNzIERhdGFTaW5rIHsKICAvLy8gVGhlIGFtb3VudCBvZiBkYXRhIHdyaXR0ZW4gdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIFRoZSB1bml0cyBpcyBiYXNlZCBvbiB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZSBmb3IgdGhpcyBkYXRhIHNpbmsuCiAgaW50IGdldCBsZW5ndGg7CgogIC8vLyBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgYW5kIGNsb3NlcyB0aGlzIGRhdGEgc2luay4KICAvLy8KICAvLy8gVGhlIGRhdGEgc2luayBjYW4gbm8gbG9uZ2VyIGJlIHdyaXR0ZW4gdG8gYWZ0ZXIgY2xvc2luZy4KICB2b2lkIGNsb3NlKCk7CgogIC8vLyBSZWdpc3RlcnMgdGhhdCB0aGUgc2VjdGlvbiBbdGFnXSBzdGFydHMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgZGVidWdnaW5nIHRvIHZlcmlmeSB0aGF0IHNlY3Rpb25zIGFyZSBjb3JyZWN0bHkgYWxpZ25lZAogIC8vLyBiZXR3ZWVuIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi4KICB2b2lkIGJlZ2luKFN0cmluZyB0YWcpOwoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgdGhlIHNlY3Rpb24gW3RhZ10gZW5kcy4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIGZvciBkZWJ1Z2dpbmcgdG8gdmVyaWZ5IHRoYXQgc2VjdGlvbnMgYXJlIGNvcnJlY3RseSBhbGlnbmVkCiAgLy8vIGJldHdlZW4gc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgogIHZvaWQgZW5kKFN0cmluZyB0YWcpOwoKICAvLy8gV3JpdGVzIGEgcmVmZXJlbmNlIHRvIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuIElmIFt2YWx1ZV0gaGFzIG5vdCB5ZXQKICAvLy8gYmVlbiBzZXJpYWxpemVkLCBbZl0gaXMgY2FsbGVkIHRvIHNlcmlhbGl6ZSB0aGUgdmFsdWUgaXRzZWxmLgogIHZvaWQgd3JpdGVDYWNoZWQ8RT4oRSB2YWx1ZSwgdm9pZCBmKEUgdmFsdWUpKTsKCiAgLy8vIFdyaXRlcyB0aGUgcG90ZW50aWFsbHkgYG51bGxgIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuIElmIFt2YWx1ZV0gaXMKICAvLy8gbm9uLW51bGwgW2ZdIGlzIGNhbGxlZCB0byB3cml0ZSB0aGUgbm9uLW51bGwgdmFsdWUgdG8gdGhlIGRhdGEgc2luay4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZFZhbHVlT3JOdWxsXS4KICB2b2lkIHdyaXRlVmFsdWVPck51bGw8RT4oRSB2YWx1ZSwgdm9pZCBmKEUgdmFsdWUpKTsKCiAgLy8vIFdyaXRlcyB0aGUgW3ZhbHVlc10gdG8gdGhpcyBkYXRhIHNpbmsgY2FsbGluZyBbZl0gdG8gd3JpdGUgZWFjaCB2YWx1ZSB0bwogIC8vLyB0aGUgZGF0YSBzaW5rLiBJZiBbYWxsb3dOdWxsXSBpcyBgdHJ1ZWAsIFt2YWx1ZXNdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkTGlzdF0uCiAgdm9pZCB3cml0ZUxpc3Q8RT4oSXRlcmFibGU8RT4gdmFsdWVzLCB2b2lkIGYoRSB2YWx1ZSksCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyB0aGUgYm9vbGVhbiBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVCb29sKGJvb2wgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHRoZSBub24tbmVnYXRpdmUgMzAgYml0IGludGVnZXIgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlSW50KGludCB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgdGhlIHBvdGVudGlhbGx5IGBudWxsYCBub24tbmVnYXRpdmUgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZEludE9yTnVsbF0uCiAgdm9pZCB3cml0ZUludE9yTnVsbChpbnQgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHRoZSBzdHJpbmcgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgdGhlIHBvdGVudGlhbGx5IGBudWxsYCBzdHJpbmcgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZFN0cmluZ09yTnVsbF0uCiAgdm9pZCB3cml0ZVN0cmluZ09yTnVsbChTdHJpbmcgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHRoZSBzdHJpbmcgW3ZhbHVlc10gdG8gdGhpcyBkYXRhIHNpbmsuIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwKICAvLy8gW3ZhbHVlc10gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRTdHJpbmdzXS4KICB2b2lkIHdyaXRlU3RyaW5ncyhJdGVyYWJsZTxTdHJpbmc+IHZhbHVlcywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIHRoZSBbbWFwXSBmcm9tIHN0cmluZyB0byBbVl0gdmFsdWVzIHRvIHRoaXMgZGF0YSBzaW5rLCBjYWxsaW5nIFtmXQogIC8vLyB0byB3cml0ZSBlYWNoIHZhbHVlIHRvIHRoZSBkYXRhIHNpbmsuIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwgW21hcF0gaXMKICAvLy8gYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRTdHJpbmdNYXBdLgogIHZvaWQgd3JpdGVTdHJpbmdNYXA8Vj4oTWFwPFN0cmluZywgVj4gbWFwLCB2b2lkIGYoViB2YWx1ZSksCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyB0aGUgZW51bSB2YWx1ZSBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENoYW5nZSB0aGUgc2lnbmF0dXJlIHRvCiAgLy8gYHZvaWQgd3JpdGVFbnVtPEUgZXh0ZW5kcyBFbnVtPEU+PihFIHZhbHVlKTtgIHdoZW4gYW4gaW50ZXJmYWNlIGZvciBlbnVtcwogIC8vIGlzIGFkZGVkIHRvIHRoZSBsYW5ndWFnZS4KICB2b2lkIHdyaXRlRW51bShkeW5hbWljIHZhbHVlKTsKCiAgLy8vIFdyaXRlcyB0aGUgVVJJIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZVVyaShVcmkgdmFsdWUpOwoKICAvLy8gV3JpdGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBrZXJuZWwgbGlicmFyeSBub2RlIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZUxpYnJhcnlOb2RlKGlyLkxpYnJhcnkgdmFsdWUpOwoKICAvLy8gV3JpdGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBrZXJuZWwgY2xhc3Mgbm9kZSBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVDbGFzc05vZGUoaXIuQ2xhc3MgdmFsdWUpOwoKICAvLy8gV3JpdGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBrZXJuZWwgdHlwZWRlZiBub2RlIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZVR5cGVkZWZOb2RlKGlyLlR5cGVkZWYgdmFsdWUpOwoKICAvLy8gV3JpdGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBrZXJuZWwgbWVtYmVyIG5vZGUgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlTWVtYmVyTm9kZShpci5NZW1iZXIgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHJlZmVyZW5jZXMgdG8gdGhlIGtlcm5lbCBtZW1iZXIgbm9kZSBbdmFsdWVzXSB0byB0aGlzIGRhdGEgc2luay4KICAvLy8gSWYgW2FsbG93TnVsbF0gaXMgYHRydWVgLCBbdmFsdWVzXSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZE1lbWJlck5vZGVzXS4KICB2b2lkIHdyaXRlTWVtYmVyTm9kZXMoSXRlcmFibGU8aXIuTWVtYmVyPiB2YWx1ZXMsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyB0aGUgW21hcF0gZnJvbSByZWZlcmVuY2VzIHRvIGtlcm5lbCBtZW1iZXIgbm9kZXMgdG8gW1ZdIHZhbHVlcyB0bwogIC8vLyB0aGlzIGRhdGEgc2luaywgY2FsbGluZyBbZl0gdG8gd3JpdGUgZWFjaCB2YWx1ZSB0byB0aGUgZGF0YSBzaW5rLiBJZgogIC8vLyBbYWxsb3dOdWxsXSBpcyBgdHJ1ZWAsIFttYXBdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkTWVtYmVyTm9kZU1hcF0uCiAgdm9pZCB3cml0ZU1lbWJlck5vZGVNYXA8Vj4oTWFwPGlyLk1lbWJlciwgVj4gbWFwLCB2b2lkIGYoViB2YWx1ZSksCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyBhIGtlcm5lbCBuYW1lIG5vZGUgdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZU5hbWUoaXIuTmFtZSB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgYSBrZXJuZWwgbGlicmFyeSBkZXBlbmRlbmN5IG5vZGUgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlTGlicmFyeURlcGVuZGVuY3lOb2RlKGlyLkxpYnJhcnlEZXBlbmRlbmN5IHZhbHVlKTsKCiAgLy8vIFdyaXRlcyBhIHBvdGVudGlhbGx5IGBudWxsYCBrZXJuZWwgbGlicmFyeSBkZXBlbmRlbmN5IG5vZGUgW3ZhbHVlXSB0bwogIC8vLyB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlTGlicmFyeURlcGVuZGVuY3lOb2RlT3JOdWxsKGlyLkxpYnJhcnlEZXBlbmRlbmN5IHZhbHVlKTsKCiAgLy8vIFdyaXRlcyBhIHJlZmVyZW5jZSB0byB0aGUga2VybmVsIHRyZWUgbm9kZSBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVUcmVlTm9kZShpci5UcmVlTm9kZSB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gdGhlIHBvdGVudGlhbGx5IGBudWxsYCBrZXJuZWwgdHJlZSBub2RlIFt2YWx1ZV0KICAvLy8gdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRUcmVlTm9kZU9yTnVsbF0uCiAgdm9pZCB3cml0ZVRyZWVOb2RlT3JOdWxsKGlyLlRyZWVOb2RlIHZhbHVlKTsKCiAgLy8vIFdyaXRlcyByZWZlcmVuY2VzIHRvIHRoZSBrZXJuZWwgdHJlZSBub2RlIFt2YWx1ZXNdIHRvIHRoaXMgZGF0YSBzaW5rLgogIC8vLyBJZiBbYWxsb3dOdWxsXSBpcyBgdHJ1ZWAsIFt2YWx1ZXNdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkVHJlZU5vZGVzXS4KICB2b2lkIHdyaXRlVHJlZU5vZGVzKEl0ZXJhYmxlPGlyLlRyZWVOb2RlPiB2YWx1ZXMsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyB0aGUgW21hcF0gZnJvbSByZWZlcmVuY2VzIHRvIGtlcm5lbCB0cmVlIG5vZGVzIHRvIFtWXSB2YWx1ZXMgdG8KICAvLy8gdGhpcyBkYXRhIHNpbmssIGNhbGxpbmcgW2ZdIHRvIHdyaXRlIGVhY2ggdmFsdWUgdG8gdGhlIGRhdGEgc2luay4gSWYKICAvLy8gW2FsbG93TnVsbF0gaXMgYHRydWVgLCBbbWFwXSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZFRyZWVOb2RlTWFwXS4KICB2b2lkIHdyaXRlVHJlZU5vZGVNYXA8Vj4oTWFwPGlyLlRyZWVOb2RlLCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBrZXJuZWwgdHJlZSBub2RlIFt2YWx1ZV0gaW4gdGhlIGtub3duIFtjb250ZXh0XQogIC8vLyB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlVHJlZU5vZGVJbkNvbnRleHQoaXIuVHJlZU5vZGUgdmFsdWUpOwoKICAvLy8gV3JpdGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBwb3RlbnRpYWxseSBgbnVsbGAga2VybmVsIHRyZWUgbm9kZSBbdmFsdWVdIGluCiAgLy8vIHRoZSBrbm93biBbY29udGV4dF0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRUcmVlTm9kZU9yTnVsbEluQ29udGV4dF0uCiAgdm9pZCB3cml0ZVRyZWVOb2RlT3JOdWxsSW5Db250ZXh0KGlyLlRyZWVOb2RlIHZhbHVlKTsKCiAgLy8vIFdyaXRlcyByZWZlcmVuY2VzIHRvIHRoZSBrZXJuZWwgdHJlZSBub2RlIFt2YWx1ZXNdIGluIHRoZSBrbm93biBbY29udGV4dF0KICAvLy8gdG8gdGhpcyBkYXRhIHNpbmsuIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwgW3ZhbHVlc10gaXMgYWxsb3dlZCB0byBiZQogIC8vLyBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRUcmVlTm9kZXNJbkNvbnRleHRdLgogIHZvaWQgd3JpdGVUcmVlTm9kZXNJbkNvbnRleHQoSXRlcmFibGU8aXIuVHJlZU5vZGU+IHZhbHVlcywKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIHRoZSBbbWFwXSBmcm9tIHJlZmVyZW5jZXMgdG8ga2VybmVsIHRyZWUgbm9kZXMgdG8gW1ZdIHZhbHVlcyBpbiB0aGUKICAvLy8ga25vd24gW2NvbnRleHRdIHRvIHRoaXMgZGF0YSBzaW5rLCBjYWxsaW5nIFtmXSB0byB3cml0ZSBlYWNoIHZhbHVlIHRvIHRoZQogIC8vLyBkYXRhIHNpbmsuIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwgW21hcF0gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRUcmVlTm9kZU1hcEluQ29udGV4dF0uCiAgdm9pZCB3cml0ZVRyZWVOb2RlTWFwSW5Db250ZXh0PFY+KE1hcDxpci5UcmVlTm9kZSwgVj4gbWFwLCB2b2lkIGYoViB2YWx1ZSksCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyBhIHJlZmVyZW5jZSB0byB0aGUga2VybmVsIHR5cGUgcGFyYW1ldGVyIG5vZGUgW3ZhbHVlXSB0byB0aGlzIGRhdGEKICAvLy8gc2luay4KICB2b2lkIHdyaXRlVHlwZVBhcmFtZXRlck5vZGUoaXIuVHlwZVBhcmFtZXRlciB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgcmVmZXJlbmNlcyB0byB0aGUga2VybmVsIHR5cGUgcGFyYW1ldGVyIG5vZGUgW3ZhbHVlc10gdG8gdGhpcyBkYXRhCiAgLy8vIHNpbmsuCiAgLy8vIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwgW3ZhbHVlc10gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRUeXBlUGFyYW1ldGVyTm9kZXNdLgogIHZvaWQgd3JpdGVUeXBlUGFyYW1ldGVyTm9kZXMoSXRlcmFibGU8aXIuVHlwZVBhcmFtZXRlcj4gdmFsdWVzLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgdGhlIHR5cGUgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4gSWYgW2FsbG93TnVsbF0gaXMgYHRydWVgLAogIC8vLyBbdmFsdWVdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIHZvaWQgd3JpdGVEYXJ0VHlwZShEYXJ0VHlwZSB2YWx1ZSwge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIHRoZSB0eXBlIFt2YWx1ZXNdIHRvIHRoaXMgZGF0YSBzaW5rLiBJZiBbYWxsb3dOdWxsXSBpcyBgdHJ1ZWAsCiAgLy8vIFt2YWx1ZXNdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkRGFydFR5cGVzXS4KICB2b2lkIHdyaXRlRGFydFR5cGVzKEl0ZXJhYmxlPERhcnRUeXBlPiB2YWx1ZXMsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyB0aGUga2VybmVsIHR5cGUgbm9kZSBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLiBJZiBbYWxsb3dOdWxsXSBpcwogIC8vLyBgdHJ1ZWAsIFt2YWx1ZV0gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgdm9pZCB3cml0ZURhcnRUeXBlTm9kZShpci5EYXJ0VHlwZSB2YWx1ZSwge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIHRoZSBrZXJuZWwgdHlwZSBub2RlIFt2YWx1ZXNdIHRvIHRoaXMgZGF0YSBzaW5rLiBJZiBbYWxsb3dOdWxsXSBpcwogIC8vLyBgdHJ1ZWAsIFt2YWx1ZXNdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkRGFydFR5cGVOb2Rlc10uCiAgdm9pZCB3cml0ZURhcnRUeXBlTm9kZXMoSXRlcmFibGU8aXIuRGFydFR5cGU+IHZhbHVlcywKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIHRoZSBzb3VyY2Ugc3BhbiBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVTb3VyY2VTcGFuKFNvdXJjZVNwYW4gdmFsdWUpOwoKICAvLy8gV3JpdGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBpbmRleGVkIGxpYnJhcnkgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlTGlicmFyeShJbmRleGVkTGlicmFyeSB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gdGhlIHBvdGVudGlhbGx5IGBudWxsYCBpbmRleGVkIGxpYnJhcnkgW3ZhbHVlXQogIC8vLyB0byB0aGlzIGRhdGEgc2luay4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZExpYnJhcnlPck51bGxdLgogIHZvaWQgd3JpdGVMaWJyYXJ5T3JOdWxsKEluZGV4ZWRMaWJyYXJ5IHZhbHVlKTsKCiAgLy8vIFdyaXRlcyB0aGUgW21hcF0gZnJvbSByZWZlcmVuY2VzIHRvIGluZGV4ZWQgbGlicmFyaWVzIHRvIFtWXSB2YWx1ZXMgdG8KICAvLy8gdGhpcyBkYXRhIHNpbmssIGNhbGxpbmcgW2ZdIHRvIHdyaXRlIGVhY2ggdmFsdWUgdG8gdGhlIGRhdGEgc2luay4gSWYKICAvLy8gW2FsbG93TnVsbF0gaXMgYHRydWVgLCBbbWFwXSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZExpYnJhcnlNYXBdLgogIHZvaWQgd3JpdGVMaWJyYXJ5TWFwPFY+KE1hcDxMaWJyYXJ5RW50aXR5LCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBpbmRleGVkIGNsYXNzIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZUNsYXNzKEluZGV4ZWRDbGFzcyB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gdGhlIHBvdGVudGlhbGx5IGBudWxsYCBpbmRleGVkIGNsYXNzIFt2YWx1ZV0KICAvLy8gdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRDbGFzc09yTnVsbF0uCiAgdm9pZCB3cml0ZUNsYXNzT3JOdWxsKEluZGV4ZWRDbGFzcyB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgcmVmZXJlbmNlcyB0byB0aGUgaW5kZXhlZCBjbGFzcyBbdmFsdWVzXSB0byB0aGlzIGRhdGEgc2luay4gSWYKICAvLy8gW2FsbG93TnVsbF0gaXMgYHRydWVgLCBbdmFsdWVzXSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZENsYXNzZXNdLgogIHZvaWQgd3JpdGVDbGFzc2VzKEl0ZXJhYmxlPENsYXNzRW50aXR5PiB2YWx1ZXMsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyB0aGUgW21hcF0gZnJvbSByZWZlcmVuY2VzIHRvIGluZGV4ZWQgY2xhc3NlcyB0byBbVl0gdmFsdWVzIHRvIHRoaXMKICAvLy8gZGF0YSBzaW5rLCBjYWxsaW5nIFtmXSB0byB3cml0ZSBlYWNoIHZhbHVlIHRvIHRoZSBkYXRhIHNpbmsuIElmCiAgLy8vIFthbGxvd051bGxdIGlzIGB0cnVlYCwgW21hcF0gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRDbGFzc01hcF0uCiAgdm9pZCB3cml0ZUNsYXNzTWFwPFY+KE1hcDxDbGFzc0VudGl0eSwgVj4gbWFwLCB2b2lkIGYoViB2YWx1ZSksCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyBhIHJlZmVyZW5jZSB0byB0aGUgaW5kZXhlZCB0eXBlZGVmIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZVR5cGVkZWYoSW5kZXhlZFR5cGVkZWYgdmFsdWUpOwoKICAvLy8gV3JpdGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBpbmRleGVkIG1lbWJlciBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVNZW1iZXIoSW5kZXhlZE1lbWJlciB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gdGhlIHBvdGVudGlhbGx5IGBudWxsYCBpbmRleGVkIG1lbWJlciBbdmFsdWVdCiAgLy8vIHRvIHRoaXMgZGF0YSBzaW5rLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkTWVtYmVyT3JOdWxsXS4KICB2b2lkIHdyaXRlTWVtYmVyT3JOdWxsKEluZGV4ZWRNZW1iZXIgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHJlZmVyZW5jZXMgdG8gdGhlIGluZGV4ZWQgbWVtYmVyIFt2YWx1ZXNdIHRvIHRoaXMgZGF0YSBzaW5rLiBJZgogIC8vLyBbYWxsb3dOdWxsXSBpcyBgdHJ1ZWAsIFt2YWx1ZXNdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkTWVtYmVyc10uCiAgdm9pZCB3cml0ZU1lbWJlcnMoSXRlcmFibGU8TWVtYmVyRW50aXR5PiB2YWx1ZXMsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyB0aGUgW21hcF0gZnJvbSByZWZlcmVuY2VzIHRvIGluZGV4ZWQgbWVtYmVycyB0byBbVl0gdmFsdWVzIHRvIHRoaXMKICAvLy8gZGF0YSBzaW5rLCBjYWxsaW5nIFtmXSB0byB3cml0ZSBlYWNoIHZhbHVlIHRvIHRoZSBkYXRhIHNpbmsuIElmCiAgLy8vIFthbGxvd051bGxdIGlzIGB0cnVlYCwgW21hcF0gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRNZW1iZXJNYXBdLgogIHZvaWQgd3JpdGVNZW1iZXJNYXA8Vj4oCiAgICAgIE1hcDxNZW1iZXJFbnRpdHksIFY+IG1hcCwgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIsIFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gdGhlIGluZGV4ZWQgdHlwZSB2YXJpYWJsZSBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVUeXBlVmFyaWFibGUoSW5kZXhlZFR5cGVWYXJpYWJsZSB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gdGhlIGxvY2FsIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZUxvY2FsKExvY2FsIGxvY2FsKTsKCiAgLy8vIFdyaXRlcyBhIHJlZmVyZW5jZSB0byB0aGUgcG90ZW50aWFsbHkgYG51bGxgIGxvY2FsIFt2YWx1ZV0KICAvLy8gdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRMb2NhbE9yTnVsbF0uCiAgdm9pZCB3cml0ZUxvY2FsT3JOdWxsKExvY2FsIGxvY2FsKTsKCiAgLy8vIFdyaXRlcyByZWZlcmVuY2VzIHRvIHRoZSBsb2NhbCBbdmFsdWVzXSB0byB0aGlzIGRhdGEgc2luay4gSWYgW2FsbG93TnVsbF0KICAvLy8gaXMgYHRydWVgLCBbdmFsdWVzXSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZExvY2Fsc10uCiAgdm9pZCB3cml0ZUxvY2FscyhJdGVyYWJsZTxMb2NhbD4gdmFsdWVzLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgdGhlIFttYXBdIGZyb20gcmVmZXJlbmNlcyB0byBsb2NhbHMgdG8gW1ZdIHZhbHVlcyB0byB0aGlzIGRhdGEKICAvLy8gc2luaywgY2FsbGluZyBbZl0gdG8gd3JpdGUgZWFjaCB2YWx1ZSB0byB0aGUgZGF0YSBzaW5rLiBJZiBbYWxsb3dOdWxsXSBpcwogIC8vLyBgdHJ1ZWAsIFttYXBdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkTG9jYWxNYXBdLgogIHZvaWQgd3JpdGVMb2NhbE1hcDxWPihNYXA8TG9jYWwsIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgdGhlIGNvbnN0YW50IFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZUNvbnN0YW50KENvbnN0YW50VmFsdWUgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHRoZSBwb3RlbnRpYWxseSBgbnVsbGAgY29uc3RhbnQgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICB2b2lkIHdyaXRlQ29uc3RhbnRPck51bGwoQ29uc3RhbnRWYWx1ZSB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgY29uc3RhbnQgW3ZhbHVlc10gdG8gdGhpcyBkYXRhIHNpbmsuIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwKICAvLy8gW3ZhbHVlc10gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRDb25zdGFudHNdLgogIHZvaWQgd3JpdGVDb25zdGFudHMoSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gdmFsdWVzLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgdGhlIFttYXBdIGZyb20gY29uc3RhbnQgdmFsdWVzIHRvIFtWXSB2YWx1ZXMgdG8gdGhpcyBkYXRhIHNpbmssCiAgLy8vIGNhbGxpbmcgW2ZdIHRvIHdyaXRlIGVhY2ggdmFsdWUgdG8gdGhlIGRhdGEgc2luay4gSWYgW2FsbG93TnVsbF0gaXMKICAvLy8gYHRydWVgLCBbbWFwXSBpcyBhbGxvd2VkIHRvIGJlIGBudWxsYC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTb3VyY2UucmVhZENvbnN0YW50TWFwXS4KICB2b2lkIHdyaXRlQ29uc3RhbnRNYXA8Vj4oTWFwPENvbnN0YW50VmFsdWUsIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgYSBkb3VibGUgdmFsdWUgdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZURvdWJsZVZhbHVlKGRvdWJsZSB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgYW4gaW50ZWdlciBvZiBhcmJpdHJhcnkgdmFsdWUgdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIFRoaXMgaXMgc2hvdWxkIG9ubHkgd2hlbiB0aGUgdmFsdWUgaXMgbm90IGtub3duIHRvIGJlIGEgbm9uLW5lZ2F0aXZlCiAgLy8vIDMwIGJpdCBpbnRlZ2VyLiBPdGhlcndpc2UgW3dyaXRlSW50XSBzaG91bGQgYmUgdXNlZC4KICB2b2lkIHdyaXRlSW50ZWdlclZhbHVlKGludCB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgdGhlIGltcG9ydCBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVJbXBvcnQoSW1wb3J0RW50aXR5IHZhbHVlKTsKCiAgLy8vIFdyaXRlcyB0aGUgcG90ZW50aWFsbHkgYG51bGxgIGltcG9ydCBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVJbXBvcnRPck51bGwoSW1wb3J0RW50aXR5IHZhbHVlKTsKCiAgLy8vIFdyaXRlcyBpbXBvcnQgW3ZhbHVlc10gdG8gdGhpcyBkYXRhIHNpbmsuIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwKICAvLy8gW3ZhbHVlc10gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRJbXBvcnRzXS4KICB2b2lkIHdyaXRlSW1wb3J0cyhJdGVyYWJsZTxJbXBvcnRFbnRpdHk+IHZhbHVlcywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIHRoZSBbbWFwXSBmcm9tIGltcG9ydHMgdG8gW1ZdIHZhbHVlcyB0byB0aGlzIGRhdGEgc2luaywKICAvLy8gY2FsbGluZyBbZl0gdG8gd3JpdGUgZWFjaCB2YWx1ZSB0byB0aGUgZGF0YSBzaW5rLiBJZiBbYWxsb3dOdWxsXSBpcwogIC8vLyBgdHJ1ZWAsIFttYXBdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkSW1wb3J0TWFwXS4KICB2b2lkIHdyaXRlSW1wb3J0TWFwPFY+KE1hcDxJbXBvcnRFbnRpdHksIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgYW4gYWJzdHJhY3QgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICAvLy8KICAvLy8gVGhpcyBmZWF0dXJlIGlzIG9ubHkgYXZhaWxhYmxlIGEgW0NvZGVnZW5Xcml0ZXJdIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCiAgdm9pZCB3cml0ZUFic3RyYWN0VmFsdWUoQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gdGhlIG91dHB1dCB1bml0IFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIFRoaXMgZmVhdHVyZSBpcyBvbmx5IGF2YWlsYWJsZSBhIFtDb2RlZ2VuV3JpdGVyXSBoYXMgYmVlbiByZWdpc3RlcmVkLgogIHZvaWQgd3JpdGVPdXRwdXRVbml0UmVmZXJlbmNlKE91dHB1dFVuaXQgdmFsdWUpOwoKICAvLy8gV3JpdGVzIGEganMgbm9kZSBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIC8vLwogIC8vLyBUaGlzIGZlYXR1cmUgaXMgb25seSBhdmFpbGFibGUgYSBbQ29kZWdlbldyaXRlcl0gaGFzIGJlZW4gcmVnaXN0ZXJlZC4KICB2b2lkIHdyaXRlSnNOb2RlKGpzLk5vZGUgdmFsdWUpOwoKICAvLy8gV3JpdGVzIGEgcG90ZW50aWFsbHkgYG51bGxgIGpzIG5vZGUgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICAvLy8KICAvLy8gVGhpcyBmZWF0dXJlIGlzIG9ubHkgYXZhaWxhYmxlIGEgW0NvZGVnZW5Xcml0ZXJdIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCiAgdm9pZCB3cml0ZUpzTm9kZU9yTnVsbChqcy5Ob2RlIHZhbHVlKTsKCiAgLy8vIFJlZ2lzdGVyIGFuIFtFbnRpdHlXcml0ZXJdIHdpdGggdGhpcyBkYXRhIHNpbmsgZm9yIG5vbi1kZWZhdWx0IGVuY29kaW5nCiAgLy8vIG9mIGVudGl0eSByZWZlcmVuY2VzLgogIHZvaWQgcmVnaXN0ZXJFbnRpdHlXcml0ZXIoRW50aXR5V3JpdGVyIHdyaXRlcik7CgogIC8vLyBSZWdpc3RlciBhIFtDb2RlZ2VuV3JpdGVyXSB3aXRoIHRoaXMgZGF0YSBzaW5rIHRvIHN1cHBvcnQgc2VyaWFsaXphdGlvbgogIC8vLyBvZiBjb2RlZ2VuIG9ubHkgZGF0YS4KICB2b2lkIHJlZ2lzdGVyQ29kZWdlbldyaXRlcihDb2RlZ2VuV3JpdGVyIHdyaXRlcik7CgogIC8vLyBJbnZva2UgW2ZdIGluIHRoZSBjb250ZXh0IG9mIFttZW1iZXJdLiBUaGlzIHNldHMgdXAgc3VwcG9ydCBmb3IKICAvLy8gc2VyaWFsaXphdGlvbiBvZiBgaXIuVHJlZU5vZGVgcyB1c2luZyB0aGUgYHdyaXRlVHJlZU5vZGUqSW5Db250ZXh0YAogIC8vLyBtZXRob2RzLgogIHZvaWQgaW5NZW1iZXJDb250ZXh0KGlyLk1lbWJlciBtZW1iZXIsIHZvaWQgZigpKTsKfQoKLy8vIEludGVyZmFjZSBmb3IgZGVzZXJpYWxpemF0aW9uLgphYnN0cmFjdCBjbGFzcyBEYXRhU291cmNlIHsKICAvLy8gUmVnaXN0ZXJzIHRoYXQgdGhlIHNlY3Rpb24gW3RhZ10gc3RhcnRzLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgZm9yIGRlYnVnZ2luZyB0byB2ZXJpZnkgdGhhdCBzZWN0aW9ucyBhcmUgY29ycmVjdGx5IGFsaWduZWQKICAvLy8gYmV0d2VlbiBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uCiAgdm9pZCBiZWdpbihTdHJpbmcgdGFnKTsKCiAgLy8vIFJlZ2lzdGVycyB0aGF0IHRoZSBzZWN0aW9uIFt0YWddIGVuZHMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgZGVidWdnaW5nIHRvIHZlcmlmeSB0aGF0IHNlY3Rpb25zIGFyZSBjb3JyZWN0bHkgYWxpZ25lZAogIC8vLyBiZXR3ZWVuIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi4KICB2b2lkIGVuZChTdHJpbmcgdGFnKTsKCiAgLy8vIFJlZ2lzdGVycyBhIFtDb21wb25lbnRMb29rdXBdIG9iamVjdCB3aXRoIHRoaXMgZGF0YSBzb3VyY2UgdG8gc3VwcG9ydAogIC8vLyBkZXNlcmlhbGl6YXRpb24gb2YgcmVmZXJlbmNlcyB0byBrZXJuZWwgbm9kZXMuCiAgdm9pZCByZWdpc3RlckNvbXBvbmVudExvb2t1cChDb21wb25lbnRMb29rdXAgY29tcG9uZW50TG9va3VwKTsKCiAgLy8vIFJlZ2lzdGVycyBhbiBbRW50aXR5TG9va3VwXSBvYmplY3Qgd2l0aCB0aGlzIGRhdGEgc291cmNlIHRvIHN1cHBvcnQKICAvLy8gZGVzZXJpYWxpemF0aW9uIG9mIHJlZmVyZW5jZXMgdG8gaW5kZXhlZCBlbnRpdGllcy4KICB2b2lkIHJlZ2lzdGVyRW50aXR5TG9va3VwKEVudGl0eUxvb2t1cCBlbnRpdHlMb29rdXApOwoKICAvLy8gUmVnaXN0ZXJzIGFuIFtFbnRpdHlSZWFkZXJdIHdpdGggdGhpcyBkYXRhIHNvdXJjZSBmb3Igbm9uLWRlZmF1bHQgZW5jb2RpbmcKICAvLy8gb2YgZW50aXR5IHJlZmVyZW5jZXMuCiAgdm9pZCByZWdpc3RlckVudGl0eVJlYWRlcihFbnRpdHlSZWFkZXIgcmVhZGVyKTsKCiAgLy8vIFJlZ2lzdGVycyBhIFtMb2NhbExvb2t1cF0gb2JqZWN0IHdpdGggdGhpcyBkYXRhIHNvdXJjZSB0byBzdXBwb3J0CiAgLy8vIGRlc2VyaWFsaXphdGlvbiBvZiByZWZlcmVuY2VzIHRvIGxvY2Fscy4KICB2b2lkIHJlZ2lzdGVyTG9jYWxMb29rdXAoTG9jYWxMb29rdXAgbG9jYWxMb29rdXApOwoKICAvLy8gUmVnaXN0ZXJzIGEgW0NvZGVnZW5SZWFkZXJdIHdpdGggdGhpcyBkYXRhIHNvdXJjZSB0byBzdXBwb3J0CiAgLy8vIGRlc2VyaWFsaXphdGlvbiBvZiBjb2RlZ2VuIG9ubHkgZGF0YS4KICB2b2lkIHJlZ2lzdGVyQ29kZWdlblJlYWRlcihDb2RlZ2VuUmVhZGVyIHJlYWRlcik7CgogIC8vLyBVbnJlZ2lzdGVycyB0aGUgW0NvZGVnZW5SZWFkZXJdIGZyb20gdGhpcyBkYXRhIHNvdXJjZSB0byByZW1vdmUgc3VwcG9ydAogIC8vLyBmb3IgZGVzZXJpYWxpemF0aW9uIG9mIGNvZGVnZW4gb25seSBkYXRhLgogIHZvaWQgZGVyZWdpc3RlckNvZGVnZW5SZWFkZXIoQ29kZWdlblJlYWRlciByZWFkZXIpOwoKICAvLy8gSW52b2tlIFtmXSBpbiB0aGUgY29udGV4dCBvZiBbbWVtYmVyXS4gVGhpcyBzZXRzIHVwIHN1cHBvcnQgZm9yCiAgLy8vIGRlc2VyaWFsaXphdGlvbiBvZiBgaXIuVHJlZU5vZGVgcyB1c2luZyB0aGUgYHJlYWRUcmVlTm9kZSpJbkNvbnRleHRgCiAgLy8vIG1ldGhvZHMuCiAgVCBpbk1lbWJlckNvbnRleHQ8VD4oaXIuTWVtYmVyIG1lbWJlciwgVCBmKCkpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYW4gW0VdIHZhbHVlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4gSWYgdGhlIHZhbHVlIGhhcwogIC8vLyBub3QgeWV0IGJlZW4gZGVzZXJpYWxpemVkLCBbZl0gaXMgY2FsbGVkIHRvIGRlc2VyaWFsaXplIHRoZSB2YWx1ZSBpdHNlbGYuCiAgRSByZWFkQ2FjaGVkPEU+KEUgZigpKTsKCiAgLy8vIFJlYWRzIGEgcG90ZW50aWFsbHkgYG51bGxgIFtFXSB2YWx1ZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UsIGNhbGxpbmcgW2ZdIHRvCiAgLy8vIHJlYWQgdGhlIG5vbi1udWxsIHZhbHVlIGZyb20gdGhlIGRhdGEgc291cmNlLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVWYWx1ZU9yTnVsbF0uCiAgRSByZWFkVmFsdWVPck51bGw8RT4oRSBmKCkpOwoKICAvLy8gUmVhZHMgYSBsaXN0IG9mIFtFXSB2YWx1ZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLiBJZiBbZW1wdHlBc051bGxdIGlzCiAgLy8vIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlTGlzdF0uCiAgTGlzdDxFPiByZWFkTGlzdDxFPihFIGYoKSwge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIGJvb2xlYW4gdmFsdWUgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIGJvb2wgcmVhZEJvb2woKTsKCiAgLy8vIFJlYWRzIGEgbm9uLW5lZ2F0aXZlIDMwIGJpdCBpbnRlZ2VyIHZhbHVlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBpbnQgcmVhZEludCgpOwoKICAvLy8gUmVhZHMgYSBwb3RlbnRpYWxseSBgbnVsbGAgbm9uLW5lZ2F0aXZlIGludGVnZXIgdmFsdWUgZnJvbSB0aGlzIGRhdGEKICAvLy8gc291cmNlLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVJbnRPck51bGxdLgogIGludCByZWFkSW50T3JOdWxsKCk7CgogIC8vLyBSZWFkcyBhIHN0cmluZyB2YWx1ZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgU3RyaW5nIHJlYWRTdHJpbmcoKTsKCiAgLy8vIFJlYWRzIGEgcG90ZW50aWFsbHkgYG51bGxgIHN0cmluZyB2YWx1ZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZVN0cmluZ09yTnVsbF0uCiAgU3RyaW5nIHJlYWRTdHJpbmdPck51bGwoKTsKCiAgLy8vIFJlYWRzIGEgbGlzdCBvZiBzdHJpbmcgdmFsdWVzIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4gSWYgW2VtcHR5QXNOdWxsXSBpcwogIC8vLyBgdHJ1ZWAsIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGxpc3QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZVN0cmluZ3NdLgogIExpc3Q8U3RyaW5nPiByZWFkU3RyaW5ncyh7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KTsKCiAgLy8vIFJlYWRzIGEgbWFwIGZyb20gc3RyaW5nIHZhbHVlcyB0byBbVl0gdmFsdWVzIGZyb20gdGhpcyBkYXRhIHNvdXJjZSwKICAvLy8gY2FsbGluZyBbZl0gdG8gcmVhZCBlYWNoIHZhbHVlIGZyb20gdGhlIGRhdGEgc291cmNlLiBJZiBbZW1wdHlBc051bGxdIGlzCiAgLy8vIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbWFwLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVTdHJpbmdNYXBdLgogIE1hcDxTdHJpbmcsIFY+IHJlYWRTdHJpbmdNYXA8Vj4oViBmKCksIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYW4gZW51bSB2YWx1ZSBmcm9tIHRoZSBsaXN0IG9mIGVudW0gW3ZhbHVlc10gZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIC8vLwogIC8vLyBUaGUgW3ZhbHVlc10gYXJndW1lbnQgaXMgaW50ZW5kZWQgdG8gYmUgdGhlIHN0YXRpYyBgLnZhbHVlc2AgZmllbGQgb24KICAvLy8gZW51bSBjbGFzc2VzLCBmb3IgaW5zdGFuY2U6CiAgLy8vCiAgLy8vICAgIGVudW0gRm9vIHsgYmFyLCBiYXogfQogIC8vLyAgICAuLi4KICAvLy8gICAgRm9vIGZvbyA9IHNvdXJjZS5yZWFkRW51bShGb28udmFsdWVzKTsKICAvLy8KICBFIHJlYWRFbnVtPEU+KExpc3Q8RT4gdmFsdWVzKTsKCiAgLy8vIFJlYWRzIGEgVVJJIHZhbHVlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBVcmkgcmVhZFVyaSgpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYSBrZXJuZWwgbGlicmFyeSBub2RlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBpci5MaWJyYXJ5IHJlYWRMaWJyYXJ5Tm9kZSgpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYSBrZXJuZWwgY2xhc3Mgbm9kZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgaXIuQ2xhc3MgcmVhZENsYXNzTm9kZSgpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYSBrZXJuZWwgY2xhc3Mgbm9kZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgaXIuVHlwZWRlZiByZWFkVHlwZWRlZk5vZGUoKTsKCiAgLy8vIFJlYWRzIGEgcmVmZXJlbmNlIHRvIGEga2VybmVsIG1lbWJlciBub2RlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBpci5NZW1iZXIgcmVhZE1lbWJlck5vZGUoKTsKCiAgLy8vIFJlYWRzIGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIGtlcm5lbCBtZW1iZXIgbm9kZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIC8vLyBJZiBbZW1wdHlBc051bGxdIGlzIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlTWVtYmVyTm9kZXNdLgogIExpc3Q8aXIuTWVtYmVyPiByZWFkTWVtYmVyTm9kZXM8RSBleHRlbmRzIGlyLk1lbWJlcj4oCiAgICAgIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSBtYXAgZnJvbSBrZXJuZWwgbWVtYmVyIG5vZGVzIHRvIFtWXSB2YWx1ZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLAogIC8vLyBjYWxsaW5nIFtmXSB0byByZWFkIGVhY2ggdmFsdWUgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIElmIFtlbXB0eUFzTnVsbF0gaXMKICAvLy8gYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBtYXAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZU1lbWJlck5vZGVNYXBdLgogIE1hcDxLLCBWPiByZWFkTWVtYmVyTm9kZU1hcDxLIGV4dGVuZHMgaXIuTWVtYmVyLCBWPihWIGYoKSwKICAgICAge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIGtlcm5lbCBuYW1lIG5vZGUgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIGlyLk5hbWUgcmVhZE5hbWUoKTsKCiAgLy8vIFJlYWRzIGEga2VybmVsIGxpYnJhcnkgZGVwZW5kZW5jeSBub2RlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBpci5MaWJyYXJ5RGVwZW5kZW5jeSByZWFkTGlicmFyeURlcGVuZGVuY3lOb2RlKCk7CgogIC8vLyBSZWFkcyBhIHBvdGVudGlhbGx5IGBudWxsYCBrZXJuZWwgbGlicmFyeSBkZXBlbmRlbmN5IG5vZGUgZnJvbSB0aGlzIGRhdGEKICAvLy8gc291cmNlLgogIGlyLkxpYnJhcnlEZXBlbmRlbmN5IHJlYWRMaWJyYXJ5RGVwZW5kZW5jeU5vZGVPck51bGwoKTsKCiAgLy8vIFJlYWRzIGEgcmVmZXJlbmNlIHRvIGEga2VybmVsIHRyZWUgbm9kZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgaXIuVHJlZU5vZGUgcmVhZFRyZWVOb2RlKCk7CgogIC8vLyBSZWFkcyBhIHJlZmVyZW5jZSB0byBhIHBvdGVudGlhbGx5IGBudWxsYCBrZXJuZWwgdHJlZSBub2RlIGZyb20gdGhpcyBkYXRhCiAgLy8vIHNvdXJjZS4KICBpci5UcmVlTm9kZSByZWFkVHJlZU5vZGVPck51bGwoKTsKCiAgLy8vIFJlYWRzIGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIGtlcm5lbCB0cmVlIG5vZGVzIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICAvLy8gSWYgW2VtcHR5QXNOdWxsXSBpcyBgdHJ1ZWAsIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGxpc3QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZVRyZWVOb2Rlc10uCiAgTGlzdDxFPiByZWFkVHJlZU5vZGVzPEUgZXh0ZW5kcyBpci5UcmVlTm9kZT4oe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIG1hcCBmcm9tIGtlcm5lbCB0cmVlIG5vZGVzIHRvIFtWXSB2YWx1ZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLAogIC8vLyBjYWxsaW5nIFtmXSB0byByZWFkIGVhY2ggdmFsdWUgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIElmIFtlbXB0eUFzTnVsbF0gaXMKICAvLy8gYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBtYXAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZVRyZWVOb2RlTWFwXS4KICBNYXA8SywgVj4gcmVhZFRyZWVOb2RlTWFwPEsgZXh0ZW5kcyBpci5UcmVlTm9kZSwgVj4oViBmKCksCiAgICAgIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYSBrZXJuZWwgdHJlZSBub2RlIGluIHRoZSBrbm93biBbY29udGV4dF0gZnJvbSB0aGlzCiAgLy8vIGRhdGEgc291cmNlLgogIGlyLlRyZWVOb2RlIHJlYWRUcmVlTm9kZUluQ29udGV4dCgpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYSBwb3RlbnRpYWxseSBgbnVsbGAga2VybmVsIHRyZWUgbm9kZSBpbiB0aGUga25vd24KICAvLy8gW2NvbnRleHRdIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBpci5UcmVlTm9kZSByZWFkVHJlZU5vZGVPck51bGxJbkNvbnRleHQoKTsKCiAgLy8vIFJlYWRzIGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIGtlcm5lbCB0cmVlIG5vZGVzIGluIHRoZSBrbm93biBbY29udGV4dF0KICAvLy8gZnJvbSB0aGlzIGRhdGEgc291cmNlLiBJZiBbZW1wdHlBc051bGxdIGlzIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkCiAgLy8vIGluc3RlYWQgb2YgYW4gZW1wdHkgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlVHJlZU5vZGVzSW5Db250ZXh0XS4KICBMaXN0PEU+IHJlYWRUcmVlTm9kZXNJbkNvbnRleHQ8RSBleHRlbmRzIGlyLlRyZWVOb2RlPigKICAgICAge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIG1hcCBmcm9tIGtlcm5lbCB0cmVlIG5vZGVzIHRvIFtWXSB2YWx1ZXMgaW4gdGhlIGtub3duIFtjb250ZXh0XQogIC8vLyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UsIGNhbGxpbmcgW2ZdIHRvIHJlYWQgZWFjaCB2YWx1ZSBmcm9tIHRoZSBkYXRhCiAgLy8vIHNvdXJjZS4gSWYgW2VtcHR5QXNOdWxsXSBpcyBgdHJ1ZWAsIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5CiAgLy8vIG1hcC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlVHJlZU5vZGVNYXBJbkNvbnRleHRdLgogIE1hcDxLLCBWPiByZWFkVHJlZU5vZGVNYXBJbkNvbnRleHQ8SyBleHRlbmRzIGlyLlRyZWVOb2RlLCBWPihWIGYoKSwKICAgICAge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIHJlZmVyZW5jZSB0byBhIGtlcm5lbCB0eXBlIHBhcmFtZXRlciBub2RlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBpci5UeXBlUGFyYW1ldGVyIHJlYWRUeXBlUGFyYW1ldGVyTm9kZSgpOwoKICAvLy8gUmVhZHMgYSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8ga2VybmVsIHR5cGUgcGFyYW1ldGVyIG5vZGVzIGZyb20gdGhpcyBkYXRhCiAgLy8vIHNvdXJjZS4gSWYgW2VtcHR5QXNOdWxsXSBpcyBgdHJ1ZWAsIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5CiAgLy8vIGxpc3QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZVR5cGVQYXJhbWV0ZXJOb2Rlc10uCiAgTGlzdDxpci5UeXBlUGFyYW1ldGVyPiByZWFkVHlwZVBhcmFtZXRlck5vZGVzKHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSB0eXBlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4gSWYgW2FsbG93TnVsbF0sIHRoZSByZXR1cm5lZCB0eXBlIGlzCiAgLy8vIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIERhcnRUeXBlIHJlYWREYXJ0VHlwZSh7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIGxpc3Qgb2YgdHlwZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLiBJZiBbZW1wdHlBc051bGxdIGlzIGB0cnVlYCwKICAvLy8gYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlRGFydFR5cGVzXS4KICBMaXN0PERhcnRUeXBlPiByZWFkRGFydFR5cGVzKHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSBrZXJuZWwgdHlwZSBub2RlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4gSWYgW2FsbG93TnVsbF0sIHRoZQogIC8vLyByZXR1cm5lZCB0eXBlIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIGlyLkRhcnRUeXBlIHJlYWREYXJ0VHlwZU5vZGUoe2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSBsaXN0IG9mIGtlcm5lbCB0eXBlIG5vZGVzIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4gSWYgW2VtcHR5QXNOdWxsXQogIC8vLyBpcyBgdHJ1ZWAsIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGxpc3QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZURhcnRUeXBlTm9kZXNdLgogIExpc3Q8aXIuRGFydFR5cGU+IHJlYWREYXJ0VHlwZU5vZGVzKHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSBzb3VyY2Ugc3BhbiBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgU291cmNlU3BhbiByZWFkU291cmNlU3BhbigpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYW4gaW5kZXhlZCBsaWJyYXJ5IGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBJbmRleGVkTGlicmFyeSByZWFkTGlicmFyeSgpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYSBwb3RlbnRpYWxseSBgbnVsbGAgaW5kZXhlZCBsaWJyYXJ5IGZyb20gdGhpcyBkYXRhCiAgLy8vIHNvdXJjZS4KICBJbmRleGVkTGlicmFyeSByZWFkTGlicmFyeU9yTnVsbCgpOwogIE1hcDxLLCBWPiByZWFkTGlicmFyeU1hcDxLIGV4dGVuZHMgTGlicmFyeUVudGl0eSwgVj4oViBmKCksCiAgICAgIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYW4gaW5kZXhlZCBjbGFzcyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgSW5kZXhlZENsYXNzIHJlYWRDbGFzcygpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYSBwb3RlbnRpYWxseSBgbnVsbGAgaW5kZXhlZCBjbGFzcyBmcm9tIHRoaXMgZGF0YQogIC8vLyBzb3VyY2UuCiAgSW5kZXhlZENsYXNzIHJlYWRDbGFzc09yTnVsbCgpOwoKICAvLy8gUmVhZHMgYSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gaW5kZXhlZCBjbGFzc2VzIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICAvLy8gSWYgW2VtcHR5QXNOdWxsXSBpcyBgdHJ1ZWAsIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGxpc3QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZUNsYXNzZXNdLgogIExpc3Q8RT4gcmVhZENsYXNzZXM8RSBleHRlbmRzIENsYXNzRW50aXR5Pih7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KTsKCiAgLy8vIFJlYWRzIGEgbWFwIGZyb20gaW5kZXhlZCBjbGFzc2VzIHRvIFtWXSB2YWx1ZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLAogIC8vLyBjYWxsaW5nIFtmXSB0byByZWFkIGVhY2ggdmFsdWUgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIElmIFtlbXB0eUFzTnVsbF0gaXMKICAvLy8gYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBtYXAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZUNsYXNzTWFwXS4KICBNYXA8SywgVj4gcmVhZENsYXNzTWFwPEsgZXh0ZW5kcyBDbGFzc0VudGl0eSwgVj4oViBmKCksCiAgICAgIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYW4gaW5kZXhlZCB0eXBlZGVmIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBJbmRleGVkVHlwZWRlZiByZWFkVHlwZWRlZigpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYW4gaW5kZXhlZCBtZW1iZXIgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIEluZGV4ZWRNZW1iZXIgcmVhZE1lbWJlcigpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYSBwb3RlbnRpYWxseSBgbnVsbGAgaW5kZXhlZCBtZW1iZXIgZnJvbSB0aGlzIGRhdGEKICAvLy8gc291cmNlLgogIEluZGV4ZWRNZW1iZXIgcmVhZE1lbWJlck9yTnVsbCgpOwoKICAvLy8gUmVhZHMgYSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gaW5kZXhlZCBtZW1iZXJzIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICAvLy8gSWYgW2VtcHR5QXNOdWxsXSBpcyBgdHJ1ZWAsIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGxpc3QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZU1lbWJlcnNdLgogIExpc3Q8RT4gcmVhZE1lbWJlcnM8RSBleHRlbmRzIE1lbWJlckVudGl0eT4oe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIG1hcCBmcm9tIGluZGV4ZWQgbWVtYmVycyB0byBbVl0gdmFsdWVzIGZyb20gdGhpcyBkYXRhIHNvdXJjZSwKICAvLy8gY2FsbGluZyBbZl0gdG8gcmVhZCBlYWNoIHZhbHVlIGZyb20gdGhlIGRhdGEgc291cmNlLiBJZiBbZW1wdHlBc051bGxdIGlzCiAgLy8vIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbWFwLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVNZW1iZXJNYXBdLgogIE1hcDxLLCBWPiByZWFkTWVtYmVyTWFwPEsgZXh0ZW5kcyBNZW1iZXJFbnRpdHksIFY+KFYgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSwKICAgICAge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIHJlZmVyZW5jZSB0byBhbiBpbmRleGVkIHR5cGUgdmFyaWFibGUgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIEluZGV4ZWRUeXBlVmFyaWFibGUgcmVhZFR5cGVWYXJpYWJsZSgpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYSBsb2NhbCBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgTG9jYWwgcmVhZExvY2FsKCk7CgogIC8vLyBSZWFkcyBhIHJlZmVyZW5jZSB0byBhIHBvdGVudGlhbGx5IGBudWxsYCBsb2NhbCBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgTG9jYWwgcmVhZExvY2FsT3JOdWxsKCk7CgogIC8vLyBSZWFkcyBhIGxpc3Qgb2YgcmVmZXJlbmNlcyB0byBsb2NhbHMgZnJvbSB0aGlzIGRhdGEgc291cmNlLiBJZgogIC8vLyBbZW1wdHlBc051bGxdIGlzIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlTG9jYWxzXS4KICBMaXN0PEU+IHJlYWRMb2NhbHM8RSBleHRlbmRzIExvY2FsPih7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KTsKCiAgLy8vIFJlYWRzIGEgbWFwIGZyb20gbG9jYWxzIHRvIFtWXSB2YWx1ZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLCBjYWxsaW5nIFtmXQogIC8vLyB0byByZWFkIGVhY2ggdmFsdWUgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIElmIFtlbXB0eUFzTnVsbF0gaXMgYHRydWVgLAogIC8vLyBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBtYXAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZUxvY2FsTWFwXS4KICBNYXA8SywgVj4gcmVhZExvY2FsTWFwPEsgZXh0ZW5kcyBMb2NhbCwgVj4oViBmKCksIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSBjb25zdGFudCB2YWx1ZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgQ29uc3RhbnRWYWx1ZSByZWFkQ29uc3RhbnQoKTsKCiAgLy8vIFJlYWRzIGEgcG90ZW50aWFsbHkgYG51bGxgIGNvbnN0YW50IHZhbHVlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBDb25zdGFudFZhbHVlIHJlYWRDb25zdGFudE9yTnVsbCgpOwoKICAvLy8gUmVhZHMgYSBkb3VibGUgdmFsdWUgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIGRvdWJsZSByZWFkRG91YmxlVmFsdWUoKTsKCiAgLy8vIFJlYWRzIGFuIGludGVnZXIgb2YgYXJiaXRyYXJ5IHZhbHVlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICAvLy8KICAvLy8gVGhpcyBpcyBzaG91bGQgb25seSB3aGVuIHRoZSB2YWx1ZSBpcyBub3Qga25vd24gdG8gYmUgYSBub24tbmVnYXRpdmUKICAvLy8gMzAgYml0IGludGVnZXIuIE90aGVyd2lzZSBbcmVhZEludF0gc2hvdWxkIGJlIHVzZWQuCiAgaW50IHJlYWRJbnRlZ2VyVmFsdWUoKTsKCiAgLy8vIFJlYWRzIGEgbGlzdCBvZiBjb25zdGFudCB2YWx1ZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLiBJZiBbZW1wdHlBc051bGxdIGlzCiAgLy8vIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlQ29uc3RhbnRzXS4KICBMaXN0PEU+IHJlYWRDb25zdGFudHM8RSBleHRlbmRzIENvbnN0YW50VmFsdWU+KHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSBtYXAgZnJvbSBjb25zdGFudCB2YWx1ZXMgdG8gW1ZdIHZhbHVlcyBmcm9tIHRoaXMgZGF0YSBzb3VyY2UsCiAgLy8vIGNhbGxpbmcgW2ZdIHRvIHJlYWQgZWFjaCB2YWx1ZSBmcm9tIHRoZSBkYXRhIHNvdXJjZS4gSWYgW2VtcHR5QXNOdWxsXSBpcwogIC8vLyBgdHJ1ZWAsIGBudWxsYCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IG1hcC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlQ29uc3RhbnRNYXBdLgogIE1hcDxLLCBWPiByZWFkQ29uc3RhbnRNYXA8SyBleHRlbmRzIENvbnN0YW50VmFsdWUsIFY+KFYgZigpLAogICAgICB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KTsKCiAgLy8vIFJlYWRzIGEgaW1wb3J0IGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBJbXBvcnRFbnRpdHkgcmVhZEltcG9ydCgpOwoKICAvLy8gUmVhZHMgYSBwb3RlbnRpYWxseSBgbnVsbGAgaW1wb3J0IGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBJbXBvcnRFbnRpdHkgcmVhZEltcG9ydE9yTnVsbCgpOwoKICAvLy8gUmVhZHMgYSBsaXN0IG9mIGltcG9ydHMgZnJvbSB0aGlzIGRhdGEgc291cmNlLiBJZiBbZW1wdHlBc051bGxdIGlzCiAgLy8vIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlSW1wb3J0c10uCiAgTGlzdDxJbXBvcnRFbnRpdHk+IHJlYWRJbXBvcnRzKHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSBtYXAgZnJvbSBpbXBvcnRzIHRvIFtWXSB2YWx1ZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLAogIC8vLyBjYWxsaW5nIFtmXSB0byByZWFkIGVhY2ggdmFsdWUgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIElmIFtlbXB0eUFzTnVsbF0gaXMKICAvLy8gYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBtYXAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZUltcG9ydE1hcF0uCiAgTWFwPEltcG9ydEVudGl0eSwgVj4gcmVhZEltcG9ydE1hcDxWPihWIGYoKSwge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhbiBbQWJzdHJhY3RWYWx1ZV0gZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIC8vLwogIC8vLyBUaGlzIGZlYXR1cmUgaXMgb25seSBhdmFpbGFibGUgYSBbQ29kZWdlblJlYWRlcl0gaGFzIGJlZW4gcmVnaXN0ZXJlZC4KICBBYnN0cmFjdFZhbHVlIHJlYWRBYnN0cmFjdFZhbHVlKCk7CgogIC8vLyBSZWFkcyBhIHJlZmVyZW5jZSB0byBhbiBbT3V0cHV0VW5pdF0gZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIC8vLwogIC8vLyBUaGlzIGZlYXR1cmUgaXMgb25seSBhdmFpbGFibGUgYSBbQ29kZWdlblJlYWRlcl0gaGFzIGJlZW4gcmVnaXN0ZXJlZC4KICBPdXRwdXRVbml0IHJlYWRPdXRwdXRVbml0UmVmZXJlbmNlKCk7CgogIC8vLyBSZWFkcyBhIFtqcy5Ob2RlXSB2YWx1ZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgLy8vCiAgLy8vIFRoaXMgZmVhdHVyZSBpcyBvbmx5IGF2YWlsYWJsZSBhIFtDb2RlZ2VuUmVhZGVyXSBoYXMgYmVlbiByZWdpc3RlcmVkLgogIGpzLk5vZGUgcmVhZEpzTm9kZSgpOwoKICAvLy8gUmVhZHMgYSBwb3RlbnRpYWxseSBgbnVsbGAgW2pzLk5vZGVdIHZhbHVlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICAvLy8KICAvLy8gVGhpcyBmZWF0dXJlIGlzIG9ubHkgYXZhaWxhYmxlIGEgW0NvZGVnZW5SZWFkZXJdIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCiAganMuTm9kZSByZWFkSnNOb2RlT3JOdWxsKCk7Cn0KCi8vLyBJbnRlcmZhY2UgdXNlZCBmb3IgbG9va2luZyB1cCBlbnRpdGllcyBieSBpbmRleCBkdXJpbmcgZGVzZXJpYWxpemF0aW9uLgphYnN0cmFjdCBjbGFzcyBFbnRpdHlMb29rdXAgewogIC8vLyBSZXR1cm5zIHRoZSBpbmRleGVkIGxpYnJhcnkgY29ycmVzcG9uZGluZyB0byBbaW5kZXhdLgogIEluZGV4ZWRMaWJyYXJ5IGdldExpYnJhcnlCeUluZGV4KGludCBpbmRleCk7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmRleGVkIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gW2luZGV4XS4KICBJbmRleGVkQ2xhc3MgZ2V0Q2xhc3NCeUluZGV4KGludCBpbmRleCk7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmRleGVkIHR5cGVkZWYgY29ycmVzcG9uZGluZyB0byBbaW5kZXhdLgogIEluZGV4ZWRUeXBlZGVmIGdldFR5cGVkZWZCeUluZGV4KGludCBpbmRleCk7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmRleGVkIG1lbWJlciBjb3JyZXNwb25kaW5nIHRvIFtpbmRleF0uCiAgSW5kZXhlZE1lbWJlciBnZXRNZW1iZXJCeUluZGV4KGludCBpbmRleCk7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmRleGVkIHR5cGUgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0byBbaW5kZXhdLgogIEluZGV4ZWRUeXBlVmFyaWFibGUgZ2V0VHlwZVZhcmlhYmxlQnlJbmRleChpbnQgaW5kZXgpOwp9CgovLy8gRGVjb2Rpbmcgc3RyYXRlZ3kgZm9yIGVudGl0eSByZWZlcmVuY2VzLgpjbGFzcyBFbnRpdHlSZWFkZXIgewogIGNvbnN0IEVudGl0eVJlYWRlcigpOwoKICBJbmRleGVkTGlicmFyeSByZWFkTGlicmFyeUZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgRW50aXR5TG9va3VwIGVudGl0eUxvb2t1cCkgewogICAgcmV0dXJuIGVudGl0eUxvb2t1cC5nZXRMaWJyYXJ5QnlJbmRleChzb3VyY2UucmVhZEludCgpKTsKICB9CgogIEluZGV4ZWRDbGFzcyByZWFkQ2xhc3NGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEVudGl0eUxvb2t1cCBlbnRpdHlMb29rdXApIHsKICAgIHJldHVybiBlbnRpdHlMb29rdXAuZ2V0Q2xhc3NCeUluZGV4KHNvdXJjZS5yZWFkSW50KCkpOwogIH0KCiAgSW5kZXhlZFR5cGVkZWYgcmVhZFR5cGVkZWZGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEVudGl0eUxvb2t1cCBlbnRpdHlMb29rdXApIHsKICAgIHJldHVybiBlbnRpdHlMb29rdXAuZ2V0VHlwZWRlZkJ5SW5kZXgoc291cmNlLnJlYWRJbnQoKSk7CiAgfQoKICBJbmRleGVkTWVtYmVyIHJlYWRNZW1iZXJGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEVudGl0eUxvb2t1cCBlbnRpdHlMb29rdXApIHsKICAgIHJldHVybiBlbnRpdHlMb29rdXAuZ2V0TWVtYmVyQnlJbmRleChzb3VyY2UucmVhZEludCgpKTsKICB9CgogIEluZGV4ZWRUeXBlVmFyaWFibGUgcmVhZFR5cGVWYXJpYWJsZUZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgRW50aXR5TG9va3VwIGVudGl0eUxvb2t1cCkgewogICAgcmV0dXJuIGVudGl0eUxvb2t1cC5nZXRUeXBlVmFyaWFibGVCeUluZGV4KHNvdXJjZS5yZWFkSW50KCkpOwogIH0KfQoKLy8vIEVuY29kaW5nIHN0cmF0ZWd5IGZvciBlbnRpdHkgcmVmZXJlbmNlcy4KY2xhc3MgRW50aXR5V3JpdGVyIHsKICBjb25zdCBFbnRpdHlXcml0ZXIoKTsKCiAgdm9pZCB3cml0ZUxpYnJhcnlUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmssIEluZGV4ZWRMaWJyYXJ5IHZhbHVlKSB7CiAgICBzaW5rLndyaXRlSW50KHZhbHVlLmxpYnJhcnlJbmRleCk7CiAgfQoKICB2b2lkIHdyaXRlQ2xhc3NUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmssIEluZGV4ZWRDbGFzcyB2YWx1ZSkgewogICAgc2luay53cml0ZUludCh2YWx1ZS5jbGFzc0luZGV4KTsKICB9CgogIHZvaWQgd3JpdGVUeXBlZGVmVG9EYXRhU2luayhEYXRhU2luayBzaW5rLCBJbmRleGVkVHlwZWRlZiB2YWx1ZSkgewogICAgc2luay53cml0ZUludCh2YWx1ZS50eXBlZGVmSW5kZXgpOwogIH0KCiAgdm9pZCB3cml0ZU1lbWJlclRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaywgSW5kZXhlZE1lbWJlciB2YWx1ZSkgewogICAgc2luay53cml0ZUludCh2YWx1ZS5tZW1iZXJJbmRleCk7CiAgfQoKICB2b2lkIHdyaXRlVHlwZVZhcmlhYmxlVG9EYXRhU2luayhEYXRhU2luayBzaW5rLCBJbmRleGVkVHlwZVZhcmlhYmxlIHZhbHVlKSB7CiAgICBzaW5rLndyaXRlSW50KHZhbHVlLnR5cGVWYXJpYWJsZUluZGV4KTsKICB9Cn0KCi8vLyBJbnRlcmZhY2UgdXNlZCBmb3IgbG9va2luZyB1cCBsb2NhbHMgYnkgaW5kZXggZHVyaW5nIGRlc2VyaWFsaXphdGlvbi4KYWJzdHJhY3QgY2xhc3MgTG9jYWxMb29rdXAgewogIExvY2FsIGdldExvY2FsQnlJbmRleChNZW1iZXJFbnRpdHkgbWVtYmVyQ29udGV4dCwgaW50IGluZGV4KTsKfQoKLy8vIEludGVyZmFjZSB1c2VkIGZvciByZWFkaW5nIGNvZGVnZW4gb25seSBkYXRhIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uCmFic3RyYWN0IGNsYXNzIENvZGVnZW5SZWFkZXIgewogIEFic3RyYWN0VmFsdWUgcmVhZEFic3RyYWN0VmFsdWUoRGF0YVNvdXJjZSBzb3VyY2UpOwogIE91dHB1dFVuaXQgcmVhZE91dHB1dFVuaXRSZWZlcmVuY2UoRGF0YVNvdXJjZSBzb3VyY2UpOwogIGpzLk5vZGUgcmVhZEpzTm9kZShEYXRhU291cmNlIHNvdXJjZSk7Cn0KCi8vLyBJbnRlcmZhY2UgdXNlZCBmb3Igd3JpdGluZyBjb2RlZ2VuIG9ubHkgZGF0YSBkdXJpbmcgc2VyaWFsaXphdGlvbi4KYWJzdHJhY3QgY2xhc3MgQ29kZWdlbldyaXRlciB7CiAgdm9pZCB3cml0ZUFic3RyYWN0VmFsdWUoRGF0YVNpbmsgc2luaywgQWJzdHJhY3RWYWx1ZSB2YWx1ZSk7CiAgdm9pZCB3cml0ZU91dHB1dFVuaXRSZWZlcmVuY2UoRGF0YVNpbmsgc2luaywgT3V0cHV0VW5pdCB2YWx1ZSk7CiAgdm9pZCB3cml0ZUpzTm9kZShEYXRhU2luayBzaW5rLCBqcy5Ob2RlIG5vZGUpOwp9CoOlAE5OPAEXGigzOzkaPyMgKiQjITEfJh4jIgEbHRkbFRkUGhkbASEaNAZOEgE6Bj8QAS8GTzEaAS0GTzEYAU5EMQFNSwY8JDYBT1EGPB05IAE0HgFIHAFMBjwiIgEzIgFGBjwlKAFOKAY8IEcBUE8cBjwiPiABNzJPHyEBMBwBTysBTScBTysBTikBTkIGPCROAU9LPAY8JkUgATMhAUk/AUwWRQFMKQFMGQY8Jy8BTEIGPCJOAU1LPAY8JEUgAVAZMgFPLQY8MDgBUE0OBjwrPSABUVBKBjwtTiABUAw3AVAMQgY8K0IgAUsnPwFMKAY8IksBTy9GAVAwBjwmOCABOCoBSysBSxkGPCYxAU1LPAY8I0YgAUknAUkZBjwkLQFMPwY8IEwBUEY8BjwhQiABSysBSikBShkGPCUvAU0/BjwgTQFQRjwGPCIaRiABUTUBQSABQRkGPCQmAVAzBjwfRQFMUC0GPCE8IAE1KwFIMQFMKAY8IlABTUotBjwkRyABLycBPgZLOyUBMygBRi4BSigGPCBNAUVKLQY8IkQgATQGTDABRwZMMwEyBkwjAUUGTCkBThwyAU4cNAFGSg80AgEjHC8GTzEaAS0GTzEYAUw1QQFKOTgBURwyAUgvNQFDLDQBTjA2AUZLDzEBUFAaAVE0BjwjHwFMOwY8HDkBMxMBRxEBSw4GPCEXATIXAUUGPCQdAU87BjwfNwFKTzoGPCFFAVAGTCIGHw0wBiEBLxEBSCABRhwBRiABRx4BT08GPCM4IgFQTzoGPCU9IgE2FgFENAFPDjoBRR4BUA4kAU1PBjwhSwFOTzoGPCM9IgFPEycBTictAU1MIAY8KjkiAU5KUQsGPCxGIgFPLAFPUQwGPCpMAU8cMgFPMwY8ITsBSi05AVA+BjwlQgExHwFFIAFPDiY+IgFDHAFNDiIBS08GPB9JAUxPOgY8IDoiAUUgAUQeAU4OJAFLTwY8H0oBTE86BjwhTyIBSyoBOhUBTRsBRUwGPB5CAU9LMgY8IFABNCABRyYBMhwBQQZLOhoBUTsGPCFNAUxPOgY8Iz8iASwdAT8jAUk7BjwfPQFETzoGPCFLATYGTCUBQgZMKAE1BkwYAUgGTB4CAUwePC8BOisBPC8BOy0BQjkCAS0VGAEsNj0EASg2OwQBLDY9BAEqNjwEATY2QgQCAS0VGAFFJwQBQSUEAUUnBAFDJgQBTywEAgFKHUACAUkfNjkpAgFHHz9CMQIBNXBhY2thZ2U6Y29tcGlsZXIvc3JjL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0PnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NlcmlhbGl6YXRpb24vYWJzdHJhY3Rfc2luay5kYXJ0wABLKy8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mICdzZXJpYWxpemF0aW9uLmRhcnQnOwoKLy8vIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgW0RhdGFTaW5rXSB1c2luZyBbRGF0YVNpbmtNaXhpbl0gdG8gaW1wbGVtZW50Ci8vLyBjb252ZW5pZW5jZSBtZXRob2RzLgphYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERhdGFTaW5rIGV4dGVuZHMgRGF0YVNpbmtNaXhpbiBpbXBsZW1lbnRzIERhdGFTaW5rIHsKICAvLy8gSWYgYHRydWVgLCBzZXJpYWxpemF0aW9uIG9mIGV2ZXJ5IGRhdGEga2luZCBpcyBwcmVjZWRlZCBieSBhIFtEYXRhS2luZF0KICAvLy8gdmFsdWUuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgZGVidWdnaW5nIGRhdGEgaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gc2VyaWFsaXphdGlvbgogIC8vLyBhbmQgZGVzZXJpYWxpemF0aW9uLgogIGZpbmFsIGJvb2wgdXNlRGF0YUtpbmRzOwoKICAvLy8gVmlzaXRvciB1c2VkIGZvciBzZXJpYWxpemluZyBbRGFydFR5cGVdcy4KICBEYXJ0VHlwZVdyaXRlciBfZGFydFR5cGVXcml0ZXI7CgogIC8vLyBWaXNpdG9yIHVzZWQgZm9yIHNlcmlhbGl6aW5nIFtpci5EYXJ0VHlwZV1zLgogIERhcnRUeXBlTm9kZVdyaXRlciBfZGFydFR5cGVOb2RlV3JpdGVyOwoKICAvLy8gU3RhY2sgb2YgdGFncyB1c2VkIHdoZW4gW3VzZURhdGFLaW5kc10gaXMgYHRydWVgIHRvIGhlbHAgZGVidWdnaW5nIHNlY3Rpb24KICAvLy8gaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgogIExpc3Q8U3RyaW5nPiBfdGFnczsKCiAgLy8vIE1hcCBvZiBbX01lbWJlckRhdGFdIG9iamVjdCBmb3Igc2VyaWFsaXplZCBrZXJuZWwgbWVtYmVyIG5vZGVzLgogIE1hcDxpci5NZW1iZXIsIF9NZW1iZXJEYXRhPiBfbWVtYmVyRGF0YSA9IHt9OwoKICBJbmRleGVkU2luazxTdHJpbmc+IF9zdHJpbmdJbmRleDsKICBJbmRleGVkU2luazxVcmk+IF91cmlJbmRleDsKICBJbmRleGVkU2luazxpci5NZW1iZXI+IF9tZW1iZXJOb2RlSW5kZXg7CiAgSW5kZXhlZFNpbms8SW1wb3J0RW50aXR5PiBfaW1wb3J0SW5kZXg7CiAgSW5kZXhlZFNpbms8Q29uc3RhbnRWYWx1ZT4gX2NvbnN0YW50SW5kZXg7CgogIE1hcDxUeXBlLCBJbmRleGVkU2luaz4gX2dlbmVyYWxDYWNoZXMgPSB7fTsKCiAgRW50aXR5V3JpdGVyIF9lbnRpdHlXcml0ZXIgPSBjb25zdCBFbnRpdHlXcml0ZXIoKTsKICBDb2RlZ2VuV3JpdGVyIF9jb2RlZ2VuV3JpdGVyOwoKICBmaW5hbCBNYXA8U3RyaW5nLCBpbnQ+IHRhZ0ZyZXF1ZW5jeU1hcDsKCiAgaXIuTWVtYmVyIF9jdXJyZW50TWVtYmVyQ29udGV4dDsKICBfTWVtYmVyRGF0YSBfY3VycmVudE1lbWJlckRhdGE7CgogIEFic3RyYWN0RGF0YVNpbmsoe3RoaXMudXNlRGF0YUtpbmRzOiBmYWxzZSwgdGhpcy50YWdGcmVxdWVuY3lNYXB9KSB7CiAgICBfZGFydFR5cGVXcml0ZXIgPSBuZXcgRGFydFR5cGVXcml0ZXIodGhpcyk7CiAgICBfZGFydFR5cGVOb2RlV3JpdGVyID0gbmV3IERhcnRUeXBlTm9kZVdyaXRlcih0aGlzKTsKICAgIF9zdHJpbmdJbmRleCA9IG5ldyBJbmRleGVkU2luazxTdHJpbmc+KHRoaXMpOwogICAgX3VyaUluZGV4ID0gbmV3IEluZGV4ZWRTaW5rPFVyaT4odGhpcyk7CiAgICBfbWVtYmVyTm9kZUluZGV4ID0gbmV3IEluZGV4ZWRTaW5rPGlyLk1lbWJlcj4odGhpcyk7CiAgICBfaW1wb3J0SW5kZXggPSBuZXcgSW5kZXhlZFNpbms8SW1wb3J0RW50aXR5Pih0aGlzKTsKICAgIF9jb25zdGFudEluZGV4ID0gbmV3IEluZGV4ZWRTaW5rPENvbnN0YW50VmFsdWU+KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbihTdHJpbmcgdGFnKSB7CiAgICBpZiAodGFnRnJlcXVlbmN5TWFwICE9IG51bGwpIHsKICAgICAgdGFnRnJlcXVlbmN5TWFwW3RhZ10gPz89IDA7CiAgICAgIHRhZ0ZyZXF1ZW5jeU1hcFt0YWddKys7CiAgICB9CiAgICBpZiAodXNlRGF0YUtpbmRzKSB7CiAgICAgIF90YWdzID8/PSA8U3RyaW5nPltdOwogICAgICBfdGFncy5hZGQodGFnKTsKICAgICAgX2JlZ2luKHRhZyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZChPYmplY3QgdGFnKSB7CiAgICBpZiAodXNlRGF0YUtpbmRzKSB7CiAgICAgIF9lbmQodGFnKTsKCiAgICAgIFN0cmluZyBleGlzdGluZ1RhZyA9IF90YWdzLnJlbW92ZUxhc3QoKTsKICAgICAgYXNzZXJ0KGV4aXN0aW5nVGFnID09IHRhZywKICAgICAgICAgICJVbmV4cGVjdGVkIHRhZyBlbmQuIEV4cGVjdGVkICRleGlzdGluZ1RhZywgZm91bmQgJHRhZy4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaW5NZW1iZXJDb250ZXh0KGlyLk1lbWJlciBjb250ZXh0LCB2b2lkIGYoKSkgewogICAgaXIuTWVtYmVyIG9sZE1lbWJlckNvbnRleHQgPSBfY3VycmVudE1lbWJlckNvbnRleHQ7CiAgICBfTWVtYmVyRGF0YSBvbGRNZW1iZXJEYXRhID0gX2N1cnJlbnRNZW1iZXJEYXRhOwogICAgX2N1cnJlbnRNZW1iZXJDb250ZXh0ID0gY29udGV4dDsKICAgIF9jdXJyZW50TWVtYmVyRGF0YSA9IG51bGw7CiAgICBmKCk7CiAgICBfY3VycmVudE1lbWJlckRhdGEgPSBvbGRNZW1iZXJEYXRhOwogICAgX2N1cnJlbnRNZW1iZXJDb250ZXh0ID0gb2xkTWVtYmVyQ29udGV4dDsKICB9CgogIF9NZW1iZXJEYXRhIGdldCBjdXJyZW50TWVtYmVyRGF0YSB7CiAgICBhc3NlcnQoX2N1cnJlbnRNZW1iZXJDb250ZXh0ICE9IG51bGwsCiAgICAgICAgIkRhdGFTaW5rIGhhcyBubyBjdXJyZW50IG1lbWJlciBjb250ZXh0LiIpOwogICAgcmV0dXJuIF9jdXJyZW50TWVtYmVyRGF0YSA/Pz0gX21lbWJlckRhdGFbX2N1cnJlbnRNZW1iZXJDb250ZXh0XSA/Pz0KICAgICAgICBuZXcgX01lbWJlckRhdGEoX2N1cnJlbnRNZW1iZXJDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDYWNoZWQ8RT4oRSB2YWx1ZSwgdm9pZCBmKEUgdmFsdWUpKSB7CiAgICBJbmRleGVkU2luayBzaW5rID0gX2dlbmVyYWxDYWNoZXNbRV0gPz89IG5ldyBJbmRleGVkU2luazxFPih0aGlzKTsKICAgIHNpbmsud3JpdGUodmFsdWUsICh2KSA9PiBmKHYpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVTb3VyY2VTcGFuKFNvdXJjZVNwYW4gdmFsdWUpIHsKICAgIF93cml0ZURhdGFLaW5kKERhdGFLaW5kLnNvdXJjZVNwYW4pOwogICAgX3dyaXRlVXJpKHZhbHVlLnVyaSk7CiAgICBfd3JpdGVJbnRJbnRlcm5hbCh2YWx1ZS5iZWdpbik7CiAgICBfd3JpdGVJbnRJbnRlcm5hbCh2YWx1ZS5lbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZURhcnRUeXBlKERhcnRUeXBlIHZhbHVlLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgX3dyaXRlRGF0YUtpbmQoRGF0YUtpbmQuZGFydFR5cGUpOwogICAgX3dyaXRlRGFydFR5cGUodmFsdWUsIFtdLCBhbGxvd051bGw6IGFsbG93TnVsbCk7CiAgfQoKICB2b2lkIF93cml0ZURhcnRUeXBlKAogICAgICBEYXJ0VHlwZSB2YWx1ZSwgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gZnVuY3Rpb25UeXBlVmFyaWFibGVzLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgaWYgKCFhbGxvd051bGwpIHsKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiTWlzc2luZyBEYXJ0VHlwZSBpcyBub3QgYWxsb3dlZC4iKTsKICAgICAgfQogICAgICB3cml0ZUVudW0oRGFydFR5cGVLaW5kLm5vbmUpOwogICAgfSBlbHNlIHsKICAgICAgX2RhcnRUeXBlV3JpdGVyLnZpc2l0KHZhbHVlLCBmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZURhcnRUeXBlTm9kZShpci5EYXJ0VHlwZSB2YWx1ZSwge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIF93cml0ZURhdGFLaW5kKERhdGFLaW5kLmRhcnRUeXBlTm9kZSk7CiAgICBfd3JpdGVEYXJ0VHlwZU5vZGUodmFsdWUsIFtdLCBhbGxvd051bGw6IGFsbG93TnVsbCk7CiAgfQoKICB2b2lkIF93cml0ZURhcnRUeXBlTm9kZSgKICAgICAgaXIuRGFydFR5cGUgdmFsdWUsIExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4gZnVuY3Rpb25UeXBlVmFyaWFibGVzLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgaWYgKCFhbGxvd051bGwpIHsKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiTWlzc2luZyBpci5EYXJ0VHlwZSBub2RlIGlzIG5vdCBhbGxvd2VkLiIpOwogICAgICB9CiAgICAgIHdyaXRlRW51bShEYXJ0VHlwZU5vZGVLaW5kLm5vbmUpOwogICAgfSBlbHNlIHsKICAgICAgdmFsdWUuYWNjZXB0MShfZGFydFR5cGVOb2RlV3JpdGVyLCBmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZU1lbWJlck5vZGUoaXIuTWVtYmVyIHZhbHVlKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC5tZW1iZXJOb2RlKTsKICAgIF93cml0ZU1lbWJlck5vZGUodmFsdWUpOwogIH0KCiAgdm9pZCBfd3JpdGVNZW1iZXJOb2RlKGlyLk1lbWJlciB2YWx1ZSkgewogICAgX21lbWJlck5vZGVJbmRleC53cml0ZSh2YWx1ZSwgX3dyaXRlTWVtYmVyTm9kZUludGVybmFsKTsKICB9CgogIHZvaWQgX3dyaXRlTWVtYmVyTm9kZUludGVybmFsKGlyLk1lbWJlciB2YWx1ZSkgewogICAgaXIuQ2xhc3MgY2xzID0gdmFsdWUuZW5jbG9zaW5nQ2xhc3M7CiAgICBpZiAoY2xzICE9IG51bGwpIHsKICAgICAgX3dyaXRlRW51bUludGVybmFsKE1lbWJlckNvbnRleHRLaW5kLmNscyk7CiAgICAgIF93cml0ZUNsYXNzTm9kZShjbHMpOwogICAgICBfd3JpdGVTdHJpbmcoX2NvbXB1dGVNZW1iZXJOYW1lKHZhbHVlKSk7CiAgICB9IGVsc2UgewogICAgICBfd3JpdGVFbnVtSW50ZXJuYWwoTWVtYmVyQ29udGV4dEtpbmQubGlicmFyeSk7CiAgICAgIF93cml0ZUxpYnJhcnlOb2RlKHZhbHVlLmVuY2xvc2luZ0xpYnJhcnkpOwogICAgICBfd3JpdGVTdHJpbmcoX2NvbXB1dGVNZW1iZXJOYW1lKHZhbHVlKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ2xhc3NOb2RlKGlyLkNsYXNzIHZhbHVlKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC5jbGFzc05vZGUpOwogICAgX3dyaXRlQ2xhc3NOb2RlKHZhbHVlKTsKICB9CgogIHZvaWQgX3dyaXRlQ2xhc3NOb2RlKGlyLkNsYXNzIHZhbHVlKSB7CiAgICBfd3JpdGVMaWJyYXJ5Tm9kZSh2YWx1ZS5lbmNsb3NpbmdMaWJyYXJ5KTsKICAgIF93cml0ZVN0cmluZyh2YWx1ZS5uYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUeXBlZGVmTm9kZShpci5UeXBlZGVmIHZhbHVlKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC50eXBlZGVmTm9kZSk7CiAgICBfd3JpdGVUeXBlZGVmTm9kZSh2YWx1ZSk7CiAgfQoKICB2b2lkIF93cml0ZVR5cGVkZWZOb2RlKGlyLlR5cGVkZWYgdmFsdWUpIHsKICAgIF93cml0ZUxpYnJhcnlOb2RlKHZhbHVlLmVuY2xvc2luZ0xpYnJhcnkpOwogICAgX3dyaXRlU3RyaW5nKHZhbHVlLm5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUxpYnJhcnlOb2RlKGlyLkxpYnJhcnkgdmFsdWUpIHsKICAgIF93cml0ZURhdGFLaW5kKERhdGFLaW5kLmxpYnJhcnlOb2RlKTsKICAgIF93cml0ZUxpYnJhcnlOb2RlKHZhbHVlKTsKICB9CgogIHZvaWQgX3dyaXRlTGlicmFyeU5vZGUoaXIuTGlicmFyeSB2YWx1ZSkgewogICAgX3dyaXRlVXJpKHZhbHVlLmltcG9ydFVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlRW51bShkeW5hbWljIHZhbHVlKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC5lbnVtVmFsdWUpOwogICAgX3dyaXRlRW51bUludGVybmFsKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVCb29sKGJvb2wgdmFsdWUpIHsKICAgIGFzc2VydCh2YWx1ZSAhPSBudWxsKTsKICAgIF93cml0ZURhdGFLaW5kKERhdGFLaW5kLmJvb2wpOwogICAgX3dyaXRlQm9vbCh2YWx1ZSk7CiAgfQoKICB2b2lkIF93cml0ZUJvb2woYm9vbCB2YWx1ZSkgewogICAgX3dyaXRlSW50SW50ZXJuYWwodmFsdWUgPyAxIDogMCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVXJpKFVyaSB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwogICAgX3dyaXRlRGF0YUtpbmQoRGF0YUtpbmQudXJpKTsKICAgIF93cml0ZVVyaSh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwogICAgX3dyaXRlRGF0YUtpbmQoRGF0YUtpbmQuc3RyaW5nKTsKICAgIF93cml0ZVN0cmluZyh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlSW50KGludCB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwogICAgYXNzZXJ0KHZhbHVlID49IDAgJiYgdmFsdWUgPj4gMzAgPT0gMCk7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC51aW50MzApOwogICAgX3dyaXRlSW50SW50ZXJuYWwodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRyZWVOb2RlKGlyLlRyZWVOb2RlIHZhbHVlKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC50cmVlTm9kZSk7CiAgICBfd3JpdGVUcmVlTm9kZSh2YWx1ZSwgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVHJlZU5vZGVJbkNvbnRleHQoaXIuVHJlZU5vZGUgdmFsdWUpIHsKICAgIHdyaXRlVHJlZU5vZGVJbkNvbnRleHRJbnRlcm5hbCh2YWx1ZSwgY3VycmVudE1lbWJlckRhdGEpOwogIH0KCiAgdm9pZCB3cml0ZVRyZWVOb2RlSW5Db250ZXh0SW50ZXJuYWwoCiAgICAgIGlyLlRyZWVOb2RlIHZhbHVlLCBfTWVtYmVyRGF0YSBtZW1iZXJEYXRhKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC50cmVlTm9kZSk7CiAgICBfd3JpdGVUcmVlTm9kZSh2YWx1ZSwgbWVtYmVyRGF0YSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVHJlZU5vZGVPck51bGxJbkNvbnRleHQoaXIuVHJlZU5vZGUgdmFsdWUpIHsKICAgIHdyaXRlQm9vbCh2YWx1ZSAhPSBudWxsKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlVHJlZU5vZGVJbkNvbnRleHRJbnRlcm5hbCh2YWx1ZSwgY3VycmVudE1lbWJlckRhdGEpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRyZWVOb2Rlc0luQ29udGV4dChJdGVyYWJsZTxpci5UcmVlTm9kZT4gdmFsdWVzLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICB3cml0ZUludCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlSW50KHZhbHVlcy5sZW5ndGgpOwogICAgICBmb3IgKGlyLlRyZWVOb2RlIHZhbHVlIGluIHZhbHVlcykgewogICAgICAgIHdyaXRlVHJlZU5vZGVJbkNvbnRleHRJbnRlcm5hbCh2YWx1ZSwgY3VycmVudE1lbWJlckRhdGEpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVHJlZU5vZGVNYXBJbkNvbnRleHQ8Vj4oTWFwPGlyLlRyZWVOb2RlLCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChtYXAgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludChtYXAubGVuZ3RoKTsKICAgICAgbWFwLmZvckVhY2goKGlyLlRyZWVOb2RlIGtleSwgViB2YWx1ZSkgewogICAgICAgIHdyaXRlVHJlZU5vZGVJbkNvbnRleHRJbnRlcm5hbChrZXksIGN1cnJlbnRNZW1iZXJEYXRhKTsKICAgICAgICBmKHZhbHVlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBfTWVtYmVyRGF0YSBfZ2V0TWVtYmVyRGF0YShpci5UcmVlTm9kZSBub2RlKSB7CiAgICBpci5UcmVlTm9kZSBtZW1iZXIgPSBub2RlOwogICAgd2hpbGUgKG1lbWJlciBpcyEgaXIuTWVtYmVyKSB7CiAgICAgIGlmIChtZW1iZXIgPT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJObyBlbmNsb3NpbmcgbWVtYmVyIG9mIFRyZWVOb2RlICIKICAgICAgICAgICAgIiRub2RlICgke25vZGUucnVudGltZVR5cGV9KSIpOwogICAgICB9CiAgICAgIG1lbWJlciA9IG1lbWJlci5wYXJlbnQ7CiAgICB9CiAgICBfd3JpdGVNZW1iZXJOb2RlKG1lbWJlcik7CiAgICByZXR1cm4gX21lbWJlckRhdGFbbWVtYmVyXSA/Pz0gbmV3IF9NZW1iZXJEYXRhKG1lbWJlcik7CiAgfQoKICB2b2lkIF93cml0ZVRyZWVOb2RlKGlyLlRyZWVOb2RlIHZhbHVlLCBfTWVtYmVyRGF0YSBtZW1iZXJEYXRhKSB7CiAgICBpZiAodmFsdWUgaXMgaXIuQ2xhc3MpIHsKICAgICAgX3dyaXRlRW51bUludGVybmFsKF9UcmVlTm9kZUtpbmQuY2xzKTsKICAgICAgX3dyaXRlQ2xhc3NOb2RlKHZhbHVlKTsKICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgaXIuTWVtYmVyKSB7CiAgICAgIF93cml0ZUVudW1JbnRlcm5hbChfVHJlZU5vZGVLaW5kLm1lbWJlcik7CiAgICAgIF93cml0ZU1lbWJlck5vZGUodmFsdWUpOwogICAgfSBlbHNlIGlmICh2YWx1ZSBpcyBpci5WYXJpYWJsZURlY2xhcmF0aW9uICYmCiAgICAgICAgdmFsdWUucGFyZW50IGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgX3dyaXRlRW51bUludGVybmFsKF9UcmVlTm9kZUtpbmQuZnVuY3Rpb25EZWNsYXJhdGlvblZhcmlhYmxlKTsKICAgICAgX3dyaXRlVHJlZU5vZGUodmFsdWUucGFyZW50LCBtZW1iZXJEYXRhKTsKICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgaXIuRnVuY3Rpb25Ob2RlKSB7CiAgICAgIF93cml0ZUVudW1JbnRlcm5hbChfVHJlZU5vZGVLaW5kLmZ1bmN0aW9uTm9kZSk7CiAgICAgIF93cml0ZUZ1bmN0aW9uTm9kZSh2YWx1ZSwgbWVtYmVyRGF0YSk7CiAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIGlyLlR5cGVQYXJhbWV0ZXIpIHsKICAgICAgX3dyaXRlRW51bUludGVybmFsKF9UcmVlTm9kZUtpbmQudHlwZVBhcmFtZXRlcik7CiAgICAgIF93cml0ZVR5cGVQYXJhbWV0ZXIodmFsdWUsIG1lbWJlckRhdGEpOwogICAgfSBlbHNlIGlmICh2YWx1ZSBpcyBDb25zdGFudFJlZmVyZW5jZSkgewogICAgICBfd3JpdGVFbnVtSW50ZXJuYWwoX1RyZWVOb2RlS2luZC5jb25zdGFudCk7CiAgICAgIG1lbWJlckRhdGEgPz89IF9nZXRNZW1iZXJEYXRhKHZhbHVlLmV4cHJlc3Npb24pOwogICAgICBfd3JpdGVUcmVlTm9kZSh2YWx1ZS5leHByZXNzaW9uLCBtZW1iZXJEYXRhKTsKICAgICAgaW50IGluZGV4ID0KICAgICAgICAgIG1lbWJlckRhdGEuZ2V0SW5kZXhCeUNvbnN0YW50KHZhbHVlLmV4cHJlc3Npb24sIHZhbHVlLmNvbnN0YW50KTsKICAgICAgX3dyaXRlSW50SW50ZXJuYWwoaW5kZXgpOwogICAgfSBlbHNlIHsKICAgICAgX3dyaXRlRW51bUludGVybmFsKF9UcmVlTm9kZUtpbmQubm9kZSk7CiAgICAgIG1lbWJlckRhdGEgPz89IF9nZXRNZW1iZXJEYXRhKHZhbHVlKTsKICAgICAgaW50IGluZGV4ID0gbWVtYmVyRGF0YS5nZXRJbmRleEJ5VHJlZU5vZGUodmFsdWUpOwogICAgICBhc3NlcnQoCiAgICAgICAgICBpbmRleCAhPSBudWxsLAogICAgICAgICAgIk5vIFRyZWVOb2RlIGluZGV4IGZvdW5kIGZvciAke3ZhbHVlLnJ1bnRpbWVUeXBlfSAiCiAgICAgICAgICAiZm91bmQgaW4gJHttZW1iZXJEYXRhfS4iKTsKICAgICAgX3dyaXRlSW50SW50ZXJuYWwoaW5kZXgpOwogICAgfQogIH0KCiAgdm9pZCBfd3JpdGVGdW5jdGlvbk5vZGUoaXIuRnVuY3Rpb25Ob2RlIHZhbHVlLCBfTWVtYmVyRGF0YSBtZW1iZXJEYXRhKSB7CiAgICBpci5UcmVlTm9kZSBwYXJlbnQgPSB2YWx1ZS5wYXJlbnQ7CiAgICBpZiAocGFyZW50IGlzIGlyLlByb2NlZHVyZSkgewogICAgICBfd3JpdGVFbnVtSW50ZXJuYWwoX0Z1bmN0aW9uTm9kZUtpbmQucHJvY2VkdXJlKTsKICAgICAgX3dyaXRlTWVtYmVyTm9kZShwYXJlbnQpOwogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgX3dyaXRlRW51bUludGVybmFsKF9GdW5jdGlvbk5vZGVLaW5kLmNvbnN0cnVjdG9yKTsKICAgICAgX3dyaXRlTWVtYmVyTm9kZShwYXJlbnQpOwogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgIF93cml0ZUVudW1JbnRlcm5hbChfRnVuY3Rpb25Ob2RlS2luZC5mdW5jdGlvbkV4cHJlc3Npb24pOwogICAgICBfd3JpdGVUcmVlTm9kZShwYXJlbnQsIG1lbWJlckRhdGEpOwogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbikgewogICAgICBfd3JpdGVFbnVtSW50ZXJuYWwoX0Z1bmN0aW9uTm9kZUtpbmQuZnVuY3Rpb25EZWNsYXJhdGlvbik7CiAgICAgIF93cml0ZVRyZWVOb2RlKHBhcmVudCwgbWVtYmVyRGF0YSk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJVbnN1cHBvcnRlZCBGdW5jdGlvbk5vZGUgcGFyZW50ICR7cGFyZW50LnJ1bnRpbWVUeXBlfSIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVR5cGVQYXJhbWV0ZXJOb2RlKGlyLlR5cGVQYXJhbWV0ZXIgdmFsdWUpIHsKICAgIF93cml0ZURhdGFLaW5kKERhdGFLaW5kLnR5cGVQYXJhbWV0ZXJOb2RlKTsKICAgIF93cml0ZVR5cGVQYXJhbWV0ZXIodmFsdWUsIG51bGwpOwogIH0KCiAgdm9pZCBfd3JpdGVUeXBlUGFyYW1ldGVyKGlyLlR5cGVQYXJhbWV0ZXIgdmFsdWUsIF9NZW1iZXJEYXRhIG1lbWJlckRhdGEpIHsKICAgIGlyLlRyZWVOb2RlIHBhcmVudCA9IHZhbHVlLnBhcmVudDsKICAgIGlmIChwYXJlbnQgaXMgaXIuQ2xhc3MpIHsKICAgICAgX3dyaXRlRW51bUludGVybmFsKF9UeXBlUGFyYW1ldGVyS2luZC5jbHMpOwogICAgICBfd3JpdGVDbGFzc05vZGUocGFyZW50KTsKICAgICAgX3dyaXRlSW50SW50ZXJuYWwocGFyZW50LnR5cGVQYXJhbWV0ZXJzLmluZGV4T2YodmFsdWUpKTsKICAgIH0gZWxzZSBpZiAocGFyZW50IGlzIGlyLkZ1bmN0aW9uTm9kZSkgewogICAgICBfd3JpdGVFbnVtSW50ZXJuYWwoX1R5cGVQYXJhbWV0ZXJLaW5kLmZ1bmN0aW9uTm9kZSk7CiAgICAgIF93cml0ZUZ1bmN0aW9uTm9kZShwYXJlbnQsIG1lbWJlckRhdGEpOwogICAgICBfd3JpdGVJbnRJbnRlcm5hbChwYXJlbnQudHlwZVBhcmFtZXRlcnMuaW5kZXhPZih2YWx1ZSkpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiVW5zdXBwb3J0ZWQgVHlwZVBhcmFtZXRlciBwYXJlbnQgJHtwYXJlbnQucnVudGltZVR5cGV9Iik7CiAgICB9CiAgfQoKICB2b2lkIF93cml0ZURhdGFLaW5kKERhdGFLaW5kIGtpbmQpIHsKICAgIGlmICh1c2VEYXRhS2luZHMpIF93cml0ZUVudW1JbnRlcm5hbChraW5kKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVMaWJyYXJ5KEluZGV4ZWRMaWJyYXJ5IHZhbHVlKSB7CiAgICBfZW50aXR5V3JpdGVyLndyaXRlTGlicmFyeVRvRGF0YVNpbmsodGhpcywgdmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNsYXNzKEluZGV4ZWRDbGFzcyB2YWx1ZSkgewogICAgX2VudGl0eVdyaXRlci53cml0ZUNsYXNzVG9EYXRhU2luayh0aGlzLCB2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVHlwZWRlZihJbmRleGVkVHlwZWRlZiB2YWx1ZSkgewogICAgX2VudGl0eVdyaXRlci53cml0ZVR5cGVkZWZUb0RhdGFTaW5rKHRoaXMsIHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVNZW1iZXIoSW5kZXhlZE1lbWJlciB2YWx1ZSkgewogICAgX2VudGl0eVdyaXRlci53cml0ZU1lbWJlclRvRGF0YVNpbmsodGhpcywgdmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVR5cGVWYXJpYWJsZShJbmRleGVkVHlwZVZhcmlhYmxlIHZhbHVlKSB7CiAgICBfZW50aXR5V3JpdGVyLndyaXRlVHlwZVZhcmlhYmxlVG9EYXRhU2luayh0aGlzLCB2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlTG9jYWwoTG9jYWwgbG9jYWwpIHsKICAgIGlmIChsb2NhbCBpcyBKTG9jYWwpIHsKICAgICAgd3JpdGVFbnVtKExvY2FsS2luZC5qTG9jYWwpOwogICAgICB3cml0ZU1lbWJlcihsb2NhbC5tZW1iZXJDb250ZXh0KTsKICAgICAgd3JpdGVJbnQobG9jYWwubG9jYWxJbmRleCk7CiAgICB9IGVsc2UgaWYgKGxvY2FsIGlzIFRoaXNMb2NhbCkgewogICAgICB3cml0ZUVudW0oTG9jYWxLaW5kLnRoaXNMb2NhbCk7CiAgICAgIHdyaXRlQ2xhc3MobG9jYWwuZW5jbG9zaW5nQ2xhc3MpOwogICAgfSBlbHNlIGlmIChsb2NhbCBpcyBCb3hMb2NhbCkgewogICAgICB3cml0ZUVudW0oTG9jYWxLaW5kLmJveExvY2FsKTsKICAgICAgd3JpdGVDbGFzcyhsb2NhbC5jb250YWluZXIpOwogICAgfSBlbHNlIGlmIChsb2NhbCBpcyBBbm9ueW1vdXNDbG9zdXJlTG9jYWwpIHsKICAgICAgd3JpdGVFbnVtKExvY2FsS2luZC5hbm9ueW1vdXNDbG9zdXJlTG9jYWwpOwogICAgICB3cml0ZUNsYXNzKGxvY2FsLmNsb3N1cmVDbGFzcyk7CiAgICB9IGVsc2UgaWYgKGxvY2FsIGlzIFR5cGVWYXJpYWJsZUxvY2FsKSB7CiAgICAgIHdyaXRlRW51bShMb2NhbEtpbmQudHlwZVZhcmlhYmxlTG9jYWwpOwogICAgICB3cml0ZURhcnRUeXBlKGxvY2FsLnR5cGVWYXJpYWJsZSk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgbG9jYWwgJHtsb2NhbC5ydW50aW1lVHlwZX0iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDb25zdGFudChDb25zdGFudFZhbHVlIHZhbHVlKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC5jb25zdGFudCk7CiAgICBfd3JpdGVDb25zdGFudCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlRG91YmxlVmFsdWUoZG91YmxlIHZhbHVlKSB7CiAgICBfd3JpdGVEYXRhS2luZChEYXRhS2luZC5kb3VibGUpOwogICAgX3dyaXRlRG91YmxlVmFsdWUodmFsdWUpOwogIH0KCiAgdm9pZCBfd3JpdGVEb3VibGVWYWx1ZShkb3VibGUgdmFsdWUpIHsKICAgIEJ5dGVEYXRhIGRhdGEgPSBuZXcgQnl0ZURhdGEoOCk7CiAgICBkYXRhLnNldEZsb2F0NjQoMCwgdmFsdWUpOwogICAgd3JpdGVJbnQoZGF0YS5nZXRVaW50MTYoMCkpOwogICAgd3JpdGVJbnQoZGF0YS5nZXRVaW50MTYoMikpOwogICAgd3JpdGVJbnQoZGF0YS5nZXRVaW50MTYoNCkpOwogICAgd3JpdGVJbnQoZGF0YS5nZXRVaW50MTYoNikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUludGVnZXJWYWx1ZShpbnQgdmFsdWUpIHsKICAgIF93cml0ZURhdGFLaW5kKERhdGFLaW5kLmludCk7CiAgICBfd3JpdGVCaWdJbnQobmV3IEJpZ0ludC5mcm9tKHZhbHVlKSk7CiAgfQoKICB2b2lkIF93cml0ZUJpZ0ludChCaWdJbnQgdmFsdWUpIHsKICAgIHdyaXRlU3RyaW5nKHZhbHVlLnRvU3RyaW5nKCkpOwogIH0KCiAgdm9pZCBfd3JpdGVDb25zdGFudChDb25zdGFudFZhbHVlIHZhbHVlKSB7CiAgICBfY29uc3RhbnRJbmRleC53cml0ZSh2YWx1ZSwgX3dyaXRlQ29uc3RhbnRJbnRlcm5hbCk7CiAgfQoKICB2b2lkIF93cml0ZUNvbnN0YW50SW50ZXJuYWwoQ29uc3RhbnRWYWx1ZSB2YWx1ZSkgewogICAgX3dyaXRlRW51bUludGVybmFsKHZhbHVlLmtpbmQpOwogICAgc3dpdGNoICh2YWx1ZS5raW5kKSB7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuQk9PTDoKICAgICAgICBCb29sQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IHZhbHVlOwogICAgICAgIHdyaXRlQm9vbChjb25zdGFudC5ib29sVmFsdWUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLklOVDoKICAgICAgICBJbnRDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gdmFsdWU7CiAgICAgICAgX3dyaXRlQmlnSW50KGNvbnN0YW50LmludFZhbHVlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5ET1VCTEU6CiAgICAgICAgRG91YmxlQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IHZhbHVlOwogICAgICAgIF93cml0ZURvdWJsZVZhbHVlKGNvbnN0YW50LmRvdWJsZVZhbHVlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5TVFJJTkc6CiAgICAgICAgU3RyaW5nQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IHZhbHVlOwogICAgICAgIHdyaXRlU3RyaW5nKGNvbnN0YW50LnN0cmluZ1ZhbHVlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5OVUxMOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLkZVTkNUSU9OOgogICAgICAgIEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IHZhbHVlOwogICAgICAgIEluZGV4ZWRGdW5jdGlvbiBmdW5jdGlvbiA9IGNvbnN0YW50LmVsZW1lbnQ7CiAgICAgICAgd3JpdGVNZW1iZXIoZnVuY3Rpb24pOwogICAgICAgIHdyaXRlRGFydFR5cGUoY29uc3RhbnQudHlwZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuTElTVDoKICAgICAgICBMaXN0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IHZhbHVlOwogICAgICAgIHdyaXRlRGFydFR5cGUoY29uc3RhbnQudHlwZSk7CiAgICAgICAgd3JpdGVDb25zdGFudHMoY29uc3RhbnQuZW50cmllcyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuU0VUOgogICAgICAgIGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0U2V0Q29uc3RhbnQgY29uc3RhbnQgPSB2YWx1ZTsKICAgICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LnR5cGUpOwogICAgICAgIHdyaXRlQ29uc3RhbnQoY29uc3RhbnQuZW50cmllcyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuTUFQOgogICAgICAgIGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQgY29uc3RhbnQgPSB2YWx1ZTsKICAgICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LnR5cGUpOwogICAgICAgIHdyaXRlQ29uc3RhbnQoY29uc3RhbnQua2V5TGlzdCk7CiAgICAgICAgd3JpdGVDb25zdGFudHMoY29uc3RhbnQudmFsdWVzKTsKICAgICAgICB3cml0ZUNvbnN0YW50T3JOdWxsKGNvbnN0YW50LnByb3RvVmFsdWUpOwogICAgICAgIHdyaXRlQm9vbChjb25zdGFudC5vbmx5U3RyaW5nS2V5cyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuQ09OU1RSVUNURUQ6CiAgICAgICAgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gdmFsdWU7CiAgICAgICAgd3JpdGVEYXJ0VHlwZShjb25zdGFudC50eXBlKTsKICAgICAgICB3cml0ZU1lbWJlck1hcChjb25zdGFudC5maWVsZHMsCiAgICAgICAgICAgIChNZW1iZXJFbnRpdHkgbWVtYmVyLCBDb25zdGFudFZhbHVlIHZhbHVlKSA9PiB3cml0ZUNvbnN0YW50KHZhbHVlKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuVFlQRToKICAgICAgICBUeXBlQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IHZhbHVlOwogICAgICAgIHdyaXRlRGFydFR5cGUoY29uc3RhbnQucmVwcmVzZW50ZWRUeXBlKTsKICAgICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LnR5cGUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLklOU1RBTlRJQVRJT046CiAgICAgICAgSW5zdGFudGlhdGlvbkNvbnN0YW50VmFsdWUgY29uc3RhbnQgPSB2YWx1ZTsKICAgICAgICB3cml0ZURhcnRUeXBlcyhjb25zdGFudC50eXBlQXJndW1lbnRzKTsKICAgICAgICB3cml0ZUNvbnN0YW50KGNvbnN0YW50LmZ1bmN0aW9uKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5OT05fQ09OU1RBTlQ6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuSU5URVJDRVBUT1I6CiAgICAgICAgSW50ZXJjZXB0b3JDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gdmFsdWU7CiAgICAgICAgd3JpdGVDbGFzcyhjb25zdGFudC5jbHMpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLkRFRkVSUkVEX0dMT0JBTDoKICAgICAgICBEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgY29uc3RhbnQgPSB2YWx1ZTsKICAgICAgICB3cml0ZUNvbnN0YW50KGNvbnN0YW50LnJlZmVyZW5jZWQpOwogICAgICAgIHdyaXRlT3V0cHV0VW5pdFJlZmVyZW5jZShjb25zdGFudC51bml0KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5EVU1NWV9JTlRFUkNFUFRPUjoKICAgICAgICBEdW1teUludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IHZhbHVlOwogICAgICAgIHdyaXRlQWJzdHJhY3RWYWx1ZShjb25zdGFudC5hYnN0cmFjdFZhbHVlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5VTlJFQUNIQUJMRToKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5KU19OQU1FOgogICAgICAgIEpzTmFtZUNvbnN0YW50VmFsdWUgY29uc3RhbnQgPSB2YWx1ZTsKICAgICAgICB3cml0ZUpzTm9kZShjb25zdGFudC5uYW1lKTsKICAgICAgICBicmVhazsKICAgIH0KICB9CgogIHZvaWQgX3dyaXRlU3RyaW5nKFN0cmluZyB2YWx1ZSkgewogICAgX3N0cmluZ0luZGV4LndyaXRlKHZhbHVlLCBfd3JpdGVTdHJpbmdJbnRlcm5hbCk7CiAgfQoKICB2b2lkIF93cml0ZVVyaShVcmkgdmFsdWUpIHsKICAgIF91cmlJbmRleC53cml0ZSh2YWx1ZSwgX3dyaXRlVXJpSW50ZXJuYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUltcG9ydChJbXBvcnRFbnRpdHkgdmFsdWUpIHsKICAgIF93cml0ZURhdGFLaW5kKERhdGFLaW5kLmltcG9ydCk7CiAgICBfd3JpdGVJbXBvcnQodmFsdWUpOwogIH0KCiAgdm9pZCBfd3JpdGVJbXBvcnQoSW1wb3J0RW50aXR5IHZhbHVlKSB7CiAgICBfaW1wb3J0SW5kZXgud3JpdGUodmFsdWUsIF93cml0ZUltcG9ydEludGVybmFsKTsKICB9CgogIHZvaWQgX3dyaXRlSW1wb3J0SW50ZXJuYWwoSW1wb3J0RW50aXR5IHZhbHVlKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBEbyB3ZSBuZWVkIHRvIHNlcmlhbGl6ZSBub24tZGVmZXJyZWQgaW1wb3J0cz8KICAgIHdyaXRlU3RyaW5nT3JOdWxsKHZhbHVlLm5hbWUpOwogICAgX3dyaXRlVXJpKHZhbHVlLnVyaSk7CiAgICBfd3JpdGVVcmkodmFsdWUuZW5jbG9zaW5nTGlicmFyeVVyaSk7CiAgICBfd3JpdGVCb29sKHZhbHVlLmlzRGVmZXJyZWQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckVudGl0eVdyaXRlcihFbnRpdHlXcml0ZXIgd3JpdGVyKSB7CiAgICBhc3NlcnQod3JpdGVyICE9IG51bGwpOwogICAgX2VudGl0eVdyaXRlciA9IHdyaXRlcjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDb2RlZ2VuV3JpdGVyKENvZGVnZW5Xcml0ZXIgd3JpdGVyKSB7CiAgICBhc3NlcnQod3JpdGVyICE9IG51bGwpOwogICAgYXNzZXJ0KF9jb2RlZ2VuV3JpdGVyID09IG51bGwpOwogICAgX2NvZGVnZW5Xcml0ZXIgPSB3cml0ZXI7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlT3V0cHV0VW5pdFJlZmVyZW5jZShPdXRwdXRVbml0IHZhbHVlKSB7CiAgICBhc3NlcnQoCiAgICAgICAgX2NvZGVnZW5Xcml0ZXIgIT0gbnVsbCwKICAgICAgICAiQ2FuIG5vdCBzZXJpYWxpemUgYW4gT3V0cHV0VW5pdCByZWZlcmVuY2UgIgogICAgICAgICJ3aXRob3V0IGEgcmVnaXN0ZXJlZCBjb2RlZ2VuIHdyaXRlci4iKTsKICAgIF9jb2RlZ2VuV3JpdGVyLndyaXRlT3V0cHV0VW5pdFJlZmVyZW5jZSh0aGlzLCB2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQWJzdHJhY3RWYWx1ZShBYnN0cmFjdFZhbHVlIHZhbHVlKSB7CiAgICBhc3NlcnQoX2NvZGVnZW5Xcml0ZXIgIT0gbnVsbCwKICAgICAgICAiQ2FuIG5vdCBzZXJpYWxpemUgYW4gQWJzdHJhY3RWYWx1ZSB3aXRob3V0IGEgcmVnaXN0ZXJlZCBjb2RlZ2VuIHdyaXRlci4iKTsKICAgIF9jb2RlZ2VuV3JpdGVyLndyaXRlQWJzdHJhY3RWYWx1ZSh0aGlzLCB2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlSnNOb2RlKGpzLk5vZGUgdmFsdWUpIHsKICAgIGFzc2VydChfY29kZWdlbldyaXRlciAhPSBudWxsLAogICAgICAgICJDYW4gbm90IHNlcmlhbGl6ZSBhIEpTIG5kb2Ugd2l0aG91dCBhIHJlZ2lzdGVyZWQgY29kZWdlbiB3cml0ZXIuIik7CiAgICBfY29kZWdlbldyaXRlci53cml0ZUpzTm9kZSh0aGlzLCB2YWx1ZSk7CiAgfQoKICAvLy8gQWN0dWFsIHNlcmlhbGl6YXRpb24gb2YgYSBzZWN0aW9uIGJl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dGFTb3VyY2VNaXhpbgogICAgaW1wbGVtZW50cyBEYXRhU291cmNlIHsKICBmaW5hbCBib29sIHVzZURhdGFLaW5kczsKICBFbnRpdHlSZWFkZXIgX2VudGl0eVJlYWRlciA9IGNvbnN0IEVudGl0eVJlYWRlcigpOwogIENvbXBvbmVudExvb2t1cCBfY29tcG9uZW50TG9va3VwOwogIEVudGl0eUxvb2t1cCBfZW50aXR5TG9va3VwOwogIExvY2FsTG9va3VwIF9sb2NhbExvb2t1cDsKICBDb2RlZ2VuUmVhZGVyIF9jb2RlZ2VuUmVhZGVyOwoKICBJbmRleGVkU291cmNlPFN0cmluZz4gX3N0cmluZ0luZGV4OwogIEluZGV4ZWRTb3VyY2U8VXJpPiBfdXJpSW5kZXg7CiAgSW5kZXhlZFNvdXJjZTxfTWVtYmVyRGF0YT4gX21lbWJlck5vZGVJbmRleDsKICBJbmRleGVkU291cmNlPEltcG9ydEVudGl0eT4gX2ltcG9ydEluZGV4OwogIEluZGV4ZWRTb3VyY2U8Q29uc3RhbnRWYWx1ZT4gX2NvbnN0YW50SW5kZXg7CgogIE1hcDxUeXBlLCBJbmRleGVkU291cmNlPiBfZ2VuZXJhbENhY2hlcyA9IHt9OwoKICBpci5NZW1iZXIgX2N1cnJlbnRNZW1iZXJDb250ZXh0OwogIF9NZW1iZXJEYXRhIF9jdXJyZW50TWVtYmVyRGF0YTsKCiAgQWJzdHJhY3REYXRhU291cmNlKHt0aGlzLnVzZURhdGFLaW5kczogZmFsc2V9KSB7CiAgICBfc3RyaW5nSW5kZXggPSBuZXcgSW5kZXhlZFNvdXJjZTxTdHJpbmc+KHRoaXMpOwogICAgX3VyaUluZGV4ID0gbmV3IEluZGV4ZWRTb3VyY2U8VXJpPih0aGlzKTsKICAgIF9tZW1iZXJOb2RlSW5kZXggPSBuZXcgSW5kZXhlZFNvdXJjZTxfTWVtYmVyRGF0YT4odGhpcyk7CiAgICBfaW1wb3J0SW5kZXggPSBuZXcgSW5kZXhlZFNvdXJjZTxJbXBvcnRFbnRpdHk+KHRoaXMpOwogICAgX2NvbnN0YW50SW5kZXggPSBuZXcgSW5kZXhlZFNvdXJjZTxDb25zdGFudFZhbHVlPih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW4oU3RyaW5nIHRhZykgewogICAgaWYgKHVzZURhdGFLaW5kcykgX2JlZ2luKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZChTdHJpbmcgdGFnKSB7CiAgICBpZiAodXNlRGF0YUtpbmRzKSBfZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQ29tcG9uZW50TG9va3VwKENvbXBvbmVudExvb2t1cCBjb21wb25lbnRMb29rdXApIHsKICAgIGFzc2VydChfY29tcG9uZW50TG9va3VwID09IG51bGwpOwogICAgX2NvbXBvbmVudExvb2t1cCA9IGNvbXBvbmVudExvb2t1cDsKICB9CgogIENvbXBvbmVudExvb2t1cCBnZXQgY29tcG9uZW50TG9va3VwIHsKICAgIGFzc2VydChfY29tcG9uZW50TG9va3VwICE9IG51bGwpOwogICAgcmV0dXJuIF9jb21wb25lbnRMb29rdXA7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyRW50aXR5TG9va3VwKEVudGl0eUxvb2t1cCBlbnRpdHlMb29rdXApIHsKICAgIGFzc2VydChfZW50aXR5TG9va3VwID09IG51bGwpOwogICAgX2VudGl0eUxvb2t1cCA9IGVudGl0eUxvb2t1cDsKICB9CgogIEVudGl0eUxvb2t1cCBnZXQgZW50aXR5TG9va3VwIHsKICAgIGFzc2VydChfZW50aXR5TG9va3VwICE9IG51bGwpOwogICAgcmV0dXJuIF9lbnRpdHlMb29rdXA7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTG9jYWxMb29rdXAoTG9jYWxMb29rdXAgbG9jYWxMb29rdXApIHsKICAgIGFzc2VydChfbG9jYWxMb29rdXAgPT0gbnVsbCk7CiAgICBfbG9jYWxMb29rdXAgPSBsb2NhbExvb2t1cDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJFbnRpdHlSZWFkZXIoRW50aXR5UmVhZGVyIHJlYWRlcikgewogICAgYXNzZXJ0KHJlYWRlciAhPSBudWxsKTsKICAgIF9lbnRpdHlSZWFkZXIgPSByZWFkZXI7CiAgfQoKICBMb2NhbExvb2t1cCBnZXQgbG9jYWxMb29rdXAgewogICAgYXNzZXJ0KF9sb2NhbExvb2t1cCAhPSBudWxsKTsKICAgIHJldHVybiBfbG9jYWxMb29rdXA7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQ29kZWdlblJlYWRlcihDb2RlZ2VuUmVhZGVyIHJlYWRlcikgewogICAgYXNzZXJ0KHJlYWRlciAhPSBudWxsKTsKICAgIGFzc2VydChfY29kZWdlblJlYWRlciA9PSBudWxsKTsKICAgIF9jb2RlZ2VuUmVhZGVyID0gcmVhZGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZXJlZ2lzdGVyQ29kZWdlblJlYWRlcihDb2RlZ2VuUmVhZGVyIHJlYWRlcikgewogICAgYXNzZXJ0KF9jb2RlZ2VuUmVhZGVyID09IHJlYWRlcik7CiAgICBfY29kZWdlblJlYWRlciA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBUIGluTWVtYmVyQ29udGV4dDxUPihpci5NZW1iZXIgY29udGV4dCwgVCBmKCkpIHsKICAgIGlyLk1lbWJlciBvbGRNZW1iZXJDb250ZXh0ID0gX2N1cnJlbnRNZW1iZXJDb250ZXh0OwogICAgX01lbWJlckRhdGEgb2xkTWVtYmVyRGF0YSA9IF9jdXJyZW50TWVtYmVyRGF0YTsKICAgIF9jdXJyZW50TWVtYmVyQ29udGV4dCA9IGNvbnRleHQ7CiAgICBfY3VycmVudE1lbWJlckRhdGEgPSBudWxsOwogICAgVCByZXN1bHQgPSBmKCk7CiAgICBfY3VycmVudE1lbWJlckRhdGEgPSBvbGRNZW1iZXJEYXRhOwogICAgX2N1cnJlbnRNZW1iZXJDb250ZXh0ID0gb2xkTWVtYmVyQ29udGV4dDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBfTWVtYmVyRGF0YSBnZXQgY3VycmVudE1lbWJlckRhdGEgewogICAgYXNzZXJ0KF9jdXJyZW50TWVtYmVyQ29udGV4dCAhPSBudWxsLAogICAgICAgICJEYXRhU2luayBoYXMgbm8gY3VycmVudCBtZW1iZXIgY29udGV4dC4iKTsKICAgIHJldHVybiBfY3VycmVudE1lbWJlckRhdGEgPz89IF9nZXRNZW1iZXJEYXRhKF9jdXJyZW50TWVtYmVyQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFIHJlYWRDYWNoZWQ8RT4oRSBmKCkpIHsKICAgIEluZGV4ZWRTb3VyY2Ugc291cmNlID0gX2dlbmVyYWxDYWNoZXNbRV0gPz89IG5ldyBJbmRleGVkU291cmNlPEU+KHRoaXMpOwogICAgcmV0dXJuIHNvdXJjZS5yZWFkKGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5kZXhlZExpYnJhcnkgcmVhZExpYnJhcnkoKSB7CiAgICByZXR1cm4gX2VudGl0eVJlYWRlci5yZWFkTGlicmFyeUZyb21EYXRhU291cmNlKHRoaXMsIGVudGl0eUxvb2t1cCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbmRleGVkQ2xhc3MgcmVhZENsYXNzKCkgewogICAgcmV0dXJuIF9lbnRpdHlSZWFkZXIucmVhZENsYXNzRnJvbURhdGFTb3VyY2UodGhpcywgZW50aXR5TG9va3VwKTsKICB9CgogIEBvdmVycmlkZQogIEluZGV4ZWRUeXBlZGVmIHJlYWRUeXBlZGVmKCkgewogICAgcmV0dXJuIF9lbnRpdHlSZWFkZXIucmVhZFR5cGVkZWZGcm9tRGF0YVNvdXJjZSh0aGlzLCBlbnRpdHlMb29rdXApOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5kZXhlZE1lbWJlciByZWFkTWVtYmVyKCkgewogICAgcmV0dXJuIF9lbnRpdHlSZWFkZXIucmVhZE1lbWJlckZyb21EYXRhU291cmNlKHRoaXMsIGVudGl0eUxvb2t1cCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbmRleGVkVHlwZVZhcmlhYmxlIHJlYWRUeXBlVmFyaWFibGUoKSB7CiAgICByZXR1cm4gX2VudGl0eVJlYWRlci5yZWFkVHlwZVZhcmlhYmxlRnJvbURhdGFTb3VyY2UodGhpcywgZW50aXR5TG9va3VwKTsKICB9CgogIExpc3Q8RGFydFR5cGU+IF9yZWFkRGFydFR5cGVzKAogICAgICBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIGludCBjb3VudCA9IHJlYWRJbnQoKTsKICAgIExpc3Q8RGFydFR5cGU+IHR5cGVzID0gbmV3IExpc3Q8RGFydFR5cGU+KGNvdW50KTsKICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykgewogICAgICB0eXBlc1tpbmRleF0gPSBfcmVhZERhcnRUeXBlKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICB9CiAgICByZXR1cm4gdHlwZXM7CiAgfQoKICBMaXN0PGlyLkRhcnRUeXBlPiBfcmVhZERhcnRUeXBlTm9kZXMoCiAgICAgIExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlcyA9IG5ldyBMaXN0PGlyLkRhcnRUeXBlPihjb3VudCk7CiAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKICAgICAgdHlwZXNbaW5kZXhdID0gX3JlYWREYXJ0VHlwZU5vZGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgIH0KICAgIHJldHVybiB0eXBlczsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZVNwYW4gcmVhZFNvdXJjZVNwYW4oKSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC5zb3VyY2VTcGFuKTsKICAgIFVyaSB1cmkgPSBfcmVhZFVyaSgpOwogICAgaW50IGJlZ2luID0gX3JlYWRJbnRJbnRlcm5hbCgpOwogICAgaW50IGVuZCA9IF9yZWFkSW50SW50ZXJuYWwoKTsKICAgIHJldHVybiBuZXcgU291cmNlU3Bhbih1cmksIGJlZ2luLCBlbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgcmVhZERhcnRUeXBlKHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC5kYXJ0VHlwZSk7CiAgICBEYXJ0VHlwZSB0eXBlID0gX3JlYWREYXJ0VHlwZShbXSk7CiAgICBhc3NlcnQodHlwZSAhPSBudWxsIHx8IGFsbG93TnVsbCk7CiAgICByZXR1cm4gdHlwZTsKICB9CgogIERhcnRUeXBlIF9yZWFkRGFydFR5cGUoTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSB7CiAgICBEYXJ0VHlwZUtpbmQga2luZCA9IHJlYWRFbnVtKERhcnRUeXBlS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgRGFydFR5cGVLaW5kLm5vbmU6CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIGNhc2UgRGFydFR5cGVLaW5kLnZvaWRUeXBlOgogICAgICAgIHJldHVybiBjb25zdCBWb2lkVHlwZSgpOwogICAgICBjYXNlIERhcnRUeXBlS2luZC50eXBlVmFyaWFibGU6CiAgICAgICAgcmV0dXJuIG5ldyBUeXBlVmFyaWFibGVUeXBlKHJlYWRUeXBlVmFyaWFibGUoKSk7CiAgICAgIGNhc2UgRGFydFR5cGVLaW5kLmZ1bmN0aW9uVHlwZVZhcmlhYmxlOgogICAgICAgIGludCBpbmRleCA9IHJlYWRJbnQoKTsKICAgICAgICBhc3NlcnQoMCA8PSBpbmRleCAmJiBpbmRleCA8IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcy5sZW5ndGgpOwogICAgICAgIHJldHVybiBmdW5jdGlvblR5cGVWYXJpYWJsZXNbaW5kZXhdOwogICAgICBjYXNlIERhcnRUeXBlS2luZC5mdW5jdGlvblR5cGU6CiAgICAgICAgaW50IHR5cGVWYXJpYWJsZUNvdW50ID0gcmVhZEludCgpOwogICAgICAgIExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IHR5cGVWYXJpYWJsZXMgPQogICAgICAgICAgICBuZXcgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4uZ2VuZXJhdGUodHlwZVZhcmlhYmxlQ291bnQsCiAgICAgICAgICAgICAgICAoaW50IGluZGV4KSA9PiBuZXcgRnVuY3Rpb25UeXBlVmFyaWFibGUoaW5kZXgpKTsKICAgICAgICBmdW5jdGlvblR5cGVWYXJpYWJsZXMgPQogICAgICAgICAgICBuZXcgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4uZnJvbShmdW5jdGlvblR5cGVWYXJpYWJsZXMpCiAgICAgICAgICAgICAgLi5hZGRBbGwodHlwZVZhcmlhYmxlcyk7CiAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHR5cGVWYXJpYWJsZUNvdW50OyBpbmRleCsrKSB7CiAgICAgICAgICB0eXBlVmFyaWFibGVzW2luZGV4XS5ib3VuZCA9IF9yZWFkRGFydFR5cGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICB9CiAgICAgICAgRGFydFR5cGUgcmV0dXJuVHlwZSA9IF9yZWFkRGFydFR5cGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICBMaXN0PERhcnRUeXBlPiBwYXJhbWV0ZXJUeXBlcyA9IF9yZWFkRGFydFR5cGVzKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgTGlzdDxEYXJ0VHlwZT4gb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcyA9CiAgICAgICAgICAgIF9yZWFkRGFydFR5cGVzKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgTGlzdDxEYXJ0VHlwZT4gbmFtZWRQYXJhbWV0ZXJUeXBlcyA9CiAgICAgICAgICAgIF9yZWFkRGFydFR5cGVzKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkUGFyYW1ldGVycyA9CiAgICAgICAgICAgIG5ldyBMaXN0PFN0cmluZz4obmFtZWRQYXJhbWV0ZXJUeXBlcy5sZW5ndGgpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBuYW1lZFBhcmFtZXRlcnNbaV0gPSByZWFkU3RyaW5nKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKAogICAgICAgICAgICByZXR1cm5UeXBlLAogICAgICAgICAgICBwYXJhbWV0ZXJUeXBlcywKICAgICAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywKICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgICAgICBuYW1lZFBhcmFtZXRlclR5cGVzLAogICAgICAgICAgICB0eXBlVmFyaWFibGVzKTsKCiAgICAgIGNhc2UgRGFydFR5cGVLaW5kLmludGVyZmFjZVR5cGU6CiAgICAgICAgSW5kZXhlZENsYXNzIGNscyA9IHJlYWRDbGFzcygpOwogICAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBfcmVhZERhcnRUeXBlcyhmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShjbHMsIHR5cGVBcmd1bWVudHMpOwogICAgICBjYXNlIERhcnRUeXBlS2luZC50eXBlZGVmOgogICAgICAgIEluZGV4ZWRUeXBlZGVmIHR5cGVkZWYgPSByZWFkVHlwZWRlZigpOwogICAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBfcmVhZERhcnRUeXBlcyhmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgICAgIERhcnRUeXBlIHVuYWxpYXNlZCA9IF9yZWFkRGFydFR5cGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICByZXR1cm4gbmV3IFR5cGVkZWZUeXBlKHR5cGVkZWYsIHR5cGVBcmd1bWVudHMsIHVuYWxpYXNlZCk7CiAgICAgIGNhc2UgRGFydFR5cGVLaW5kLmR5bmFtaWNUeXBlOgogICAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICBjYXNlIERhcnRUeXBlS2luZC5mdXR1cmVPcjoKICAgICAgICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQgPSBfcmVhZERhcnRUeXBlKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgcmV0dXJuIG5ldyBGdXR1cmVPclR5cGUodHlwZUFyZ3VtZW50KTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIERhcnRUeXBlS2luZCAka2luZCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgcmVhZERhcnRUeXBlTm9kZSh7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQuZGFydFR5cGVOb2RlKTsKICAgIGlyLkRhcnRUeXBlIHR5cGUgPSBfcmVhZERhcnRUeXBlTm9kZShbXSk7CiAgICBhc3NlcnQodHlwZSAhPSBudWxsIHx8IGFsbG93TnVsbCk7CiAgICByZXR1cm4gdHlwZTsKICB9CgogIGlyLkRhcnRUeXBlIF9yZWFkRGFydFR5cGVOb2RlKExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSB7CiAgICBEYXJ0VHlwZU5vZGVLaW5kIGtpbmQgPSByZWFkRW51bShEYXJ0VHlwZU5vZGVLaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBEYXJ0VHlwZU5vZGVLaW5kLm5vbmU6CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIGNhc2UgRGFydFR5cGVOb2RlS2luZC52b2lkVHlwZToKICAgICAgICByZXR1cm4gY29uc3QgaXIuVm9pZFR5cGUoKTsKICAgICAgY2FzZSBEYXJ0VHlwZU5vZGVLaW5kLmludmFsaWRUeXBlOgogICAgICAgIHJldHVybiBjb25zdCBpci5JbnZhbGlkVHlwZSgpOwogICAgICBjYXNlIERhcnRUeXBlTm9kZUtpbmQuYm90dG9tVHlwZToKICAgICAgICByZXR1cm4gY29uc3QgaXIuQm90dG9tVHlwZSgpOwogICAgICBjYXNlIERhcnRUeXBlTm9kZUtpbmQuZG9lc05vdENvbXBsZXRlOgogICAgICAgIHJldHVybiBjb25zdCBEb2VzTm90Q29tcGxldGVUeXBlKCk7CiAgICAgIGNhc2UgRGFydFR5cGVOb2RlS2luZC50eXBlUGFyYW1ldGVyVHlwZToKICAgICAgICBpci5UeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSByZWFkVHlwZVBhcmFtZXRlck5vZGUoKTsKICAgICAgICBpci5EYXJ0VHlwZSBwcm9tb3RlZEJvdW5kID0gX3JlYWREYXJ0VHlwZU5vZGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICByZXR1cm4gbmV3IGlyLlR5cGVQYXJhbWV0ZXJUeXBlKHR5cGVQYXJhbWV0ZXIsIHByb21vdGVkQm91bmQpOwogICAgICBjYXNlIERhcnRUeXBlTm9kZUtpbmQuZnVuY3Rpb25UeXBlVmFyaWFibGU6CiAgICAgICAgaW50IGluZGV4ID0gcmVhZEludCgpOwogICAgICAgIGFzc2VydCgwIDw9IGluZGV4ICYmIGluZGV4IDwgZnVuY3Rpb25UeXBlVmFyaWFibGVzLmxlbmd0aCk7CiAgICAgICAgaXIuRGFydFR5cGUgcHJvbW90ZWRCb3VuZCA9IF9yZWFkRGFydFR5cGVOb2RlKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgcmV0dXJuIG5ldyBpci5UeXBlUGFyYW1ldGVyVHlwZSgKICAgICAgICAgICAgZnVuY3Rpb25UeXBlVmFyaWFibGVzW2luZGV4XSwgcHJvbW90ZWRCb3VuZCk7CiAgICAgIGNhc2UgRGFydFR5cGVOb2RlS2luZC5mdW5jdGlvblR5cGU6CiAgICAgICAgYmVnaW4oZnVuY3Rpb25UeXBlTm9kZVRhZyk7CiAgICAgICAgaW50IHR5cGVQYXJhbWV0ZXJDb3VudCA9IHJlYWRJbnQoKTsKICAgICAgICBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0KICAgICAgICAgICAgbmV3IExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4uZ2VuZXJhdGUoCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyQ291bnQsIChpbnQgaW5kZXgpID0+IG5ldyBpci5UeXBlUGFyYW1ldGVyKCkpOwogICAgICAgIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyA9CiAgICAgICAgICAgIG5ldyBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+LmZyb20oZnVuY3Rpb25UeXBlVmFyaWFibGVzKQogICAgICAgICAgICAgIC4uYWRkQWxsKHR5cGVQYXJhbWV0ZXJzKTsKICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdHlwZVBhcmFtZXRlckNvdW50OyBpbmRleCsrKSB7CiAgICAgICAgICB0eXBlUGFyYW1ldGVyc1tpbmRleF0ubmFtZSA9IHJlYWRTdHJpbmcoKTsKICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzW2luZGV4XS5ib3VuZCA9CiAgICAgICAgICAgICAgX3JlYWREYXJ0VHlwZU5vZGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzW2luZGV4XS5kZWZhdWx0VHlwZSA9CiAgICAgICAgICAgICAgX3JlYWREYXJ0VHlwZU5vZGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICB9CiAgICAgICAgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSA9IF9yZWFkRGFydFR5cGVOb2RlKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPSByZWFkSW50KCk7CiAgICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gcG9zaXRpb25hbFBhcmFtZXRlcnMgPQogICAgICAgICAgICBfcmVhZERhcnRUeXBlTm9kZXMoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICBpbnQgbmFtZWRQYXJhbWV0ZXJDb3VudCA9IHJlYWRJbnQoKTsKICAgICAgICBMaXN0PGlyLk5hbWVkVHlwZT4gbmFtZWRQYXJhbWV0ZXJzID0KICAgICAgICAgICAgbmV3IExpc3Q8aXIuTmFtZWRUeXBlPihuYW1lZFBhcmFtZXRlckNvdW50KTsKICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbmFtZWRQYXJhbWV0ZXJDb3VudDsgaW5kZXgrKykgewogICAgICAgICAgU3RyaW5nIG5hbWUgPSByZWFkU3RyaW5nKCk7CiAgICAgICAgICBpci5EYXJ0VHlwZSB0eXBlID0gX3JlYWREYXJ0VHlwZU5vZGUoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICAgIG5hbWVkUGFyYW1ldGVyc1tpbmRleF0gPSBuZXcgaXIuTmFtZWRUeXBlKG5hbWUsIHR5cGUpOwogICAgICAgIH0KICAgICAgICBpci5UeXBlZGVmVHlwZSB0eXBlZGVmVHlwZSA9IF9yZWFkRGFydFR5cGVOb2RlKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgZW5kKGZ1bmN0aW9uVHlwZU5vZGVUYWcpOwogICAgICAgIHJldHVybiBuZXcgaXIuRnVuY3Rpb25UeXBlKHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCByZXR1cm5UeXBlLAogICAgICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5hbWVkUGFyYW1ldGVycywKICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgICAgICB0eXBlZGVmVHlwZTogdHlwZWRlZlR5cGUpOwoKICAgICAgY2FzZSBEYXJ0VHlwZU5vZGVLaW5kLmludGVyZmFjZVR5cGU6CiAgICAgICAgaXIuQ2xhc3MgY2xzID0gcmVhZENsYXNzTm9kZSgpOwogICAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPQogICAgICAgICAgICBfcmVhZERhcnRUeXBlTm9kZXMoZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgICByZXR1cm4gbmV3IGlyLkludGVyZmFjZVR5cGUoY2xzLCB0eXBlQXJndW1lbnRzKTsKICAgICAgY2FzZSBEYXJ0VHlwZU5vZGVLaW5kLnRoaXNJbnRlcmZhY2VUeXBlOgogICAgICAgIGlyLkNsYXNzIGNscyA9IHJlYWRDbGFzc05vZGUoKTsKICAgICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICAgICAgX3JlYWREYXJ0VHlwZU5vZGVzKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgcmV0dXJuIG5ldyBUaGlzSW50ZXJmYWNlVHlwZShjbHMsIHR5cGVBcmd1bWVudHMpOwogICAgICBjYXNlIERhcnRUeXBlTm9kZUtpbmQuZXhhY3RJbnRlcmZhY2VUeXBlOgogICAgICAgIGlyLkNsYXNzIGNscyA9IHJlYWRDbGFzc05vZGUoKTsKICAgICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICAgICAgX3JlYWREYXJ0VHlwZU5vZGVzKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICAgICAgcmV0dXJuIG5ldyBFeGFjdEludGVyZmFjZVR5cGUoY2xzLCB0eXBlQXJndW1lbnRzKTsKICAgICAgY2FzZSBEYXJ0VHlwZU5vZGVLaW5kLnR5cGVkZWY6CiAgICAgICAgaXIuVHlwZWRlZiB0eXBlZGVmID0gcmVhZFR5cGVkZWZOb2RlKCk7CiAgICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9CiAgICAgICAgICAgIF9yZWFkRGFydFR5cGVOb2RlcyhmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgICAgIHJldHVybiBuZXcgaXIuVHlwZWRlZlR5cGUodHlwZWRlZiwgdHlwZUFyZ3VtZW50cyk7CiAgICAgIGNhc2UgRGFydFR5cGVOb2RlS2luZC5keW5hbWljVHlwZToKICAgICAgICByZXR1cm4gY29uc3QgaXIuRHluYW1pY1R5cGUoKTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIERhcnRUeXBlS2luZCAka2luZCIpOwogIH0KCiAgX01lbWJlckRhdGEgX3JlYWRNZW1iZXJEYXRhKCkgewogICAgcmV0dXJuIF9tZW1iZXJOb2RlSW5kZXgucmVhZChfcmVhZE1lbWJlckRhdGFJbnRlcm5hbCk7CiAgfQoKICBfTWVtYmVyRGF0YSBfcmVhZE1lbWJlckRhdGFJbnRlcm5hbCgpIHsKICAgIE1lbWJlckNvbnRleHRLaW5kIGtpbmQgPSBfcmVhZEVudW1JbnRlcm5hbChNZW1iZXJDb250ZXh0S2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgTWVtYmVyQ29udGV4dEtpbmQuY2xzOgogICAgICAgIF9DbGFzc0RhdGEgY2xzID0gX3JlYWRDbGFzc0RhdGEoKTsKICAgICAgICBTdHJpbmcgbmFtZSA9IF9yZWFkU3RyaW5nKCk7CiAgICAgICAgcmV0dXJuIGNscy5sb29rdXBNZW1iZXJEYXRhQnlOYW1lKG5hbWUpOwogICAgICBjYXNlIE1lbWJlckNvbnRleHRLaW5kLmxpYnJhcnk6CiAgICAgICAgX0xpYnJhcnlEYXRhIGxpYnJhcnkgPSBfcmVhZExpYnJhcnlEYXRhKCk7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBfcmVhZFN0cmluZygpOwogICAgICAgIHJldHVybiBsaWJyYXJ5Lmxvb2t1cE1lbWJlckRhdGFCeU5hbWUobmFtZSk7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgX01lbWJlcktpbmQgJGtpbmQiKTsKICB9CgogIEBvdmVycmlkZQogIGlyLk1lbWJlciByZWFkTWVtYmVyTm9kZSgpIHsKICAgIF9jaGVja0RhdGFLaW5kKERhdGFLaW5kLm1lbWJlck5vZGUpOwogICAgcmV0dXJuIF9yZWFkTWVtYmVyRGF0YSgpLm5vZGU7CiAgfQoKICBfQ2xhc3NEYXRhIF9yZWFkQ2xhc3NEYXRhKCkgewogICAgX0xpYnJhcnlEYXRhIGxpYnJhcnkgPSBfcmVhZExpYnJhcnlEYXRhKCk7CiAgICBTdHJpbmcgbmFtZSA9IF9yZWFkU3RyaW5nKCk7CiAgICByZXR1cm4gbGlicmFyeS5sb29rdXBDbGFzc0J5TmFtZShuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIGlyLkNsYXNzIHJlYWRDbGFzc05vZGUoKSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC5jbGFzc05vZGUpOwogICAgcmV0dXJuIF9yZWFkQ2xhc3NEYXRhKCkubm9kZTsKICB9CgogIGlyLlR5cGVkZWYgX3JlYWRUeXBlZGVmTm9kZSgpIHsKICAgIF9MaWJyYXJ5RGF0YSBsaWJyYXJ5ID0gX3JlYWRMaWJyYXJ5RGF0YSgpOwogICAgU3RyaW5nIG5hbWUgPSBfcmVhZFN0cmluZygpOwogICAgcmV0dXJuIGxpYnJhcnkubG9va3VwVHlwZWRlZihuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIGlyLlR5cGVkZWYgcmVhZFR5cGVkZWZOb2RlKCkgewogICAgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQudHlwZWRlZk5vZGUpOwogICAgcmV0dXJuIF9yZWFkVHlwZWRlZk5vZGUoKTsKICB9CgogIF9MaWJyYXJ5RGF0YSBfcmVhZExpYnJhcnlEYXRhKCkgewogICAgVXJpIGNhbm9uaWNhbFVyaSA9IF9yZWFkVXJpKCk7CiAgICByZXR1cm4gY29tcG9uZW50TG9va3VwLmdldExpYnJhcnlEYXRhQnlVcmkoY2Fub25pY2FsVXJpKTsKICB9CgogIEBvdmVycmlkZQogIGlyLkxpYnJhcnkgcmVhZExpYnJhcnlOb2RlKCkgewogICAgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQubGlicmFyeU5vZGUpOwogICAgcmV0dXJuIF9yZWFkTGlicmFyeURhdGEoKS5ub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgRSByZWFkRW51bTxFPihMaXN0PEU+IHZhbHVlcykgewogICAgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQuZW51bVZhbHVlKTsKICAgIHJldHVybiBfcmVhZEVudW1JbnRlcm5hbCh2YWx1ZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgVXJpIHJlYWRVcmkoKSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC51cmkpOwogICAgcmV0dXJuIF9yZWFkVXJpKCk7CiAgfQoKICBVcmkgX3JlYWRVcmkoKSB7CiAgICByZXR1cm4gX3VyaUluZGV4LnJlYWQoX3JlYWRVcmlJbnRlcm5hbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHJlYWRCb29sKCkgewogICAgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQuYm9vbCk7CiAgICByZXR1cm4gX3JlYWRCb29sKCk7CiAgfQoKICBib29sIF9yZWFkQm9vbCgpIHsKICAgIGludCB2YWx1ZSA9IF9yZWFkSW50SW50ZXJuYWwoKTsKICAgIGFzc2VydCh2YWx1ZSA9PSAwIHx8IHZhbHVlID09IDEpOwogICAgcmV0dXJuIHZhbHVlID09IDE7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgcmVhZFN0cmluZygpIHsKICAgIF9jaGVja0RhdGFLaW5kKERhdGFLaW5kLnN0cmluZyk7CiAgICByZXR1cm4gX3JlYWRTdHJpbmcoKTsKICB9CgogIFN0cmluZyBfcmVhZFN0cmluZygpIHsKICAgIHJldHVybiBfc3RyaW5nSW5kZXgucmVhZChfcmVhZFN0cmluZ0ludGVybmFsKTsKICB9CgogIEBvdmVycmlkZQogIGludCByZWFkSW50KCkgewogICAgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQudWludDMwKTsKICAgIHJldHVybiBfcmVhZEludEludGVybmFsKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5UcmVlTm9kZSByZWFkVHJlZU5vZGUoKSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC50cmVlTm9kZSk7CiAgICByZXR1cm4gX3JlYWRUcmVlTm9kZShudWxsKTsKICB9CgogIF9NZW1iZXJEYXRhIF9nZXRNZW1iZXJEYXRhKGlyLk1lbWJlciBub2RlKSB7CiAgICBfTGlicmFyeURhdGEgbGlicmFyeURhdGEgPQogICAgICAgIGNvbXBvbmVudExvb2t1cC5nZXRMaWJyYXJ5RGF0YUJ5VXJpKG5vZGUuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmkpOwogICAgaWYgKG5vZGUuZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICBfQ2xhc3NEYXRhIGNsYXNzRGF0YSA9IGxpYnJhcnlEYXRhLmxvb2t1cENsYXNzQnlOb2RlKG5vZGUuZW5jbG9zaW5nQ2xhc3MpOwogICAgICByZXR1cm4gY2xhc3NEYXRhLmxvb2t1cE1lbWJlckRhdGFCeU5vZGUobm9kZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbGlicmFyeURhdGEubG9va3VwTWVtYmVyRGF0YUJ5Tm9kZShub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGlyLlRyZWVOb2RlIHJlYWRUcmVlTm9kZUluQ29udGV4dCgpIHsKICAgIHJldHVybiByZWFkVHJlZU5vZGVJbkNvbnRleHRJbnRlcm5hbChjdXJyZW50TWVtYmVyRGF0YSk7CiAgfQoKICBpci5UcmVlTm9kZSByZWFkVHJlZU5vZGVJbkNvbnRleHRJbnRlcm5hbChfTWVtYmVyRGF0YSBtZW1iZXJEYXRhKSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC50cmVlTm9kZSk7CiAgICByZXR1cm4gX3JlYWRUcmVlTm9kZShtZW1iZXJEYXRhKTsKICB9CgogIEBvdmVycmlkZQogIGlyLlRyZWVOb2RlIHJlYWRUcmVlTm9kZU9yTnVsbEluQ29udGV4dCgpIHsKICAgIGJvb2wgaGFzVmFsdWUgPSByZWFkQm9vbCgpOwogICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgIHJldHVybiByZWFkVHJlZU5vZGVJbkNvbnRleHRJbnRlcm5hbChjdXJyZW50TWVtYmVyRGF0YSk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8RT4gcmVhZFRyZWVOb2Rlc0luQ29udGV4dDxFIGV4dGVuZHMgaXIuVHJlZU5vZGU+KAogICAgICB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PEU+IGxpc3QgPSBuZXcgTGlzdDxFPihjb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgaXIuVHJlZU5vZGUgbm9kZSA9IHJlYWRUcmVlTm9kZUluQ29udGV4dEludGVybmFsKGN1cnJlbnRNZW1iZXJEYXRhKTsKICAgICAgbGlzdFtpXSA9IG5vZGU7CiAgICB9CiAgICByZXR1cm4gbGlzdDsKICB9CgogIEBvdmVycmlkZQogIE1hcDxLLCBWPiByZWFkVHJlZU5vZGVNYXBJbkNvbnRleHQ8SyBleHRlbmRzIGlyLlRyZWVOb2RlLCBWPihWIGYoKSwKICAgICAge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTWFwPEssIFY+IG1hcCA9IHt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGlyLlRyZWVOb2RlIG5vZGUgPSByZWFkVHJlZU5vZGVJbkNvbnRleHRJbnRlcm5hbChjdXJyZW50TWVtYmVyRGF0YSk7CiAgICAgIFYgdmFsdWUgPSBmKCk7CiAgICAgIG1hcFtub2RlXSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgcmVhZENvbnN0YW50KCkgewogICAgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQuY29uc3RhbnQpOwogICAgcmV0dXJuIF9yZWFkQ29uc3RhbnQoKTsKICB9CgogIEBvdmVycmlkZQogIGRvdWJsZSByZWFkRG91YmxlVmFsdWUoKSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC5kb3VibGUpOwogICAgcmV0dXJuIF9yZWFkRG91YmxlVmFsdWUoKTsKICB9CgogIGRvdWJsZSBfcmVhZERvdWJsZVZhbHVlKCkgewogICAgQnl0ZURhdGEgZGF0YSA9IG5ldyBCeXRlRGF0YSg4KTsKICAgIGRhdGEuc2V0VWludDE2KDAsIHJlYWRJbnQoKSk7CiAgICBkYXRhLnNldFVpbnQxNigyLCByZWFkSW50KCkpOwogICAgZGF0YS5zZXRVaW50MTYoNCwgcmVhZEludCgpKTsKICAgIGRhdGEuc2V0VWludDE2KDYsIHJlYWRJbnQoKSk7CiAgICByZXR1cm4gZGF0YS5nZXRGbG9hdDY0KDApOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHJlYWRJbnRlZ2VyVmFsdWUoKSB7CiAgICBfY2hlY2tEYXRhS2luZChEYXRhS2luZC5pbnQpOwogICAgcmV0dXJuIF9yZWFkQmlnSW50KCkudG9JbnQoKTsKICB9CgogIEJpZ0ludCBfcmVhZEJpZ0ludCgpIHsKICAgIHJldHVybiBCaWdJbnQucGFyc2UocmVhZFN0cmluZygpKTsKICB9CgogIENvbnN0YW50VmFsdWUgX3JlYWRDb25zdGFudCgpIHsKICAgIHJldHVybiBfY29uc3RhbnRJbmRleC5yZWFkKF9yZWFkQ29uc3RhbnRJbnRlcm5hbCk7CiAgfQoKICBDb25zdGFudFZhbHVlIF9yZWFkQ29uc3RhbnRJbnRlcm5hbCgpIHsKICAgIENvbnN0YW50VmFsdWVLaW5kIGtpbmQgPSBfcmVhZEVudW1JbnRlcm5hbChDb25zdGFudFZhbHVlS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuQk9PTDoKICAgICAgICBib29sIHZhbHVlID0gcmVhZEJvb2woKTsKICAgICAgICByZXR1cm4gbmV3IEJvb2xDb25zdGFudFZhbHVlKHZhbHVlKTsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5JTlQ6CiAgICAgICAgQmlnSW50IHZhbHVlID0gX3JlYWRCaWdJbnQoKTsKICAgICAgICByZXR1cm4gbmV3IEludENvbnN0YW50VmFsdWUodmFsdWUpOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLkRPVUJMRToKICAgICAgICBkb3VibGUgdmFsdWUgPSBfcmVhZERvdWJsZVZhbHVlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVDb25zdGFudFZhbHVlKHZhbHVlKTsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5TVFJJTkc6CiAgICAgICAgU3RyaW5nIHZhbHVlID0gcmVhZFN0cmluZygpOwogICAgICAgIHJldHVybiBuZXcgU3RyaW5nQ29uc3RhbnRWYWx1ZSh2YWx1ZSk7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuTlVMTDoKICAgICAgICByZXR1cm4gY29uc3QgTnVsbENvbnN0YW50VmFsdWUoKTsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5GVU5DVElPTjoKICAgICAgICBJbmRleGVkRnVuY3Rpb24gZnVuY3Rpb24gPSByZWFkTWVtYmVyKCk7CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25Db25zdGFudFZhbHVlKGZ1bmN0aW9uLCB0eXBlKTsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5MSVNUOgogICAgICAgIERhcnRUeXBlIHR5cGUgPSByZWFkRGFydFR5cGUoKTsKICAgICAgICBMaXN0PENvbnN0YW50VmFsdWU+IGVudHJpZXMgPSByZWFkQ29uc3RhbnRzKCk7CiAgICAgICAgcmV0dXJuIG5ldyBMaXN0Q29uc3RhbnRWYWx1ZSh0eXBlLCBlbnRyaWVzKTsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5TRVQ6CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIE1hcENvbnN0YW50VmFsdWUgZW50cmllcyA9IHJlYWRDb25zdGFudCgpOwogICAgICAgIHJldHVybiBuZXcgY29uc3RhbnRfc3lzdGVtLkphdmFTY3JpcHRTZXRDb25zdGFudCh0eXBlLCBlbnRyaWVzKTsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5NQVA6CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIExpc3RDb25zdGFudFZhbHVlIGtleUxpc3QgPSByZWFkQ29uc3RhbnQoKTsKICAgICAgICBMaXN0PENvbnN0YW50VmFsdWU+IHZhbHVlcyA9IHJlYWRDb25zdGFudHMoKTsKICAgICAgICBDb25zdGFudFZhbHVlIHByb3RvVmFsdWUgPSByZWFkQ29uc3RhbnRPck51bGwoKTsKICAgICAgICBib29sIG9ubHlTdHJpbmdLZXlzID0gcmVhZEJvb2woKTsKICAgICAgICByZXR1cm4gbmV3IGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQoCiAgICAgICAgICAgIHR5cGUsIGtleUxpc3QsIHZhbHVlcywgcHJvdG9WYWx1ZSwgb25seVN0cmluZ0tleXMpOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLkNPTlNUUlVDVEVEOgogICAgICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIE1hcDxGaWVsZEVudGl0eSwgQ29uc3RhbnRWYWx1ZT4gZmllbGRzID0KICAgICAgICAgICAgcmVhZE1lbWJlck1hcDxGaWVsZEVudGl0eSwgQ29uc3RhbnRWYWx1ZT4oCiAgICAgICAgICAgICAgICAoTWVtYmVyRW50aXR5IG1lbWJlcikgPT4gcmVhZENvbnN0YW50KCkpOwogICAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlKHR5cGUsIGZpZWxkcyk7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuVFlQRToKICAgICAgICBEYXJ0VHlwZSByZXByZXNlbnRlZFR5cGUgPSByZWFkRGFydFR5cGUoKTsKICAgICAgICBEYXJ0VHlwZSB0eXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ29uc3RhbnRWYWx1ZShyZXByZXNlbnRlZFR5cGUsIHR5cGUpOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLklOU1RBTlRJQVRJT046CiAgICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IHJlYWREYXJ0VHlwZXMoKTsKICAgICAgICBDb25zdGFudFZhbHVlIGZ1bmN0aW9uID0gcmVhZENvbnN0YW50KCk7CiAgICAgICAgcmV0dXJuIG5ldyBJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSh0eXBlQXJndW1lbnRzLCBmdW5jdGlvbik7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuTk9OX0NPTlNUQU5UOgogICAgICAgIHJldHVybiBuZXcgTm9uQ29uc3RhbnRWYWx1ZSgpOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLklOVEVSQ0VQVE9SOgogICAgICAgIENsYXNzRW50aXR5IGNscyA9IHJlYWRDbGFzcygpOwogICAgICAgIHJldHVybiBuZXcgSW50ZXJjZXB0b3JDb25zdGFudFZhbHVlKGNscyk7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuREVGRVJSRURfR0xPQkFMOgogICAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQgPSByZWFkQ29uc3RhbnQoKTsKICAgICAgICBPdXRwdXRVbml0IHVuaXQgPSByZWFkT3V0cHV0VW5pdFJlZmVyZW5jZSgpOwogICAgICAgIHJldHVybiBuZXcgRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlKGNvbnN0YW50LCB1bml0KTsKICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5EVU1NWV9JTlRFUkNFUFRPUjoKICAgICAgICBBYnN0cmFjdFZhbHVlIGFic3RyYWN0VmFsdWUgPSByZWFkQWJzdHJhY3RWYWx1ZSgpOwogICAgICAgIHJldHVybiBuZXcgRHVtbXlJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUoYWJzdHJhY3RWYWx1ZSk7CiAgICAgIGNhc2UgQ29uc3RhbnRWYWx1ZUtpbmQuVU5SRUFDSEFCTEU6CiAgICAgICAgcmV0dXJuIGNvbnN0IFVucmVhY2hhYmxlQ29uc3RhbnRWYWx1ZSgpOwogICAgICBjYXNlIENvbnN0YW50VmFsdWVLaW5kLkpTX05BTUU6CiAgICAgICAganMuTGl0ZXJhbFN0cmluZyBuYW1lID0gcmVhZEpzTm9kZSgpOwogICAgICAgIHJldHVybiBuZXcgSnNOYW1lQ29uc3RhbnRWYWx1ZShuYW1lKTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGV4dGVkIGNvbnN0YW50IHZhbHVlIGtpbmQgJHtraW5kfS4iKTsKICB9CgogIGlyLlRyZWVOb2RlIF9yZWFkVHJlZU5vZGUoX01lbWJlckRhdGEgbWVtYmVyRGF0YSkgewogICAgX1RyZWVOb2RlS2luZCBraW5kID0gX3JlYWRFbnVtSW50ZXJuYWwoX1RyZWVOb2RlS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgX1RyZWVOb2RlS2luZC5jbHM6CiAgICAgICAgcmV0dXJuIF9yZWFkQ2xhc3NEYXRhKCkubm9kZTsKICAgICAgY2FzZSBfVHJlZU5vZGVLaW5kLm1lbWJlcjoKICAgICAgICByZXR1cm4gX3JlYWRNZW1iZXJEYXRhKCkubm9kZTsKICAgICAgY2FzZSBfVHJlZU5vZGVLaW5kLmZ1bmN0aW9uRGVjbGFyYXRpb25WYXJpYWJsZToKICAgICAgICBpci5GdW5jdGlvbkRlY2xhcmF0aW9uIGZ1bmN0aW9uRGVjbGFyYXRpb24gPSBfcmVhZFRyZWVOb2RlKG1lbWJlckRhdGEpOwogICAgICAgIHJldHVybiBmdW5jdGlvbkRlY2xhcmF0aW9uLnZhcmlhYmxlOwogICAgICBjYXNlIF9UcmVlTm9kZUtpbmQuZnVuY3Rpb25Ob2RlOgogICAgICAgIHJldHVybiBfcmVhZEZ1bmN0aW9uTm9kZShtZW1iZXJEYXRhKTsKICAgICAgY2FzZSBfVHJlZU5vZGVLaW5kLnR5cGVQYXJhbWV0ZXI6CiAgICAgICAgcmV0dXJuIF9yZWFkVHlwZVBhcmFtZXRlcihtZW1iZXJEYXRhKTsKICAgICAgY2FzZSBfVHJlZU5vZGVLaW5kLmNvbnN0YW50OgogICAgICAgIG1lbWJlckRhdGEgPz89IF9yZWFkTWVtYmVyRGF0YSgpOwogICAgICAgIGlyLkNvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uID0gX3JlYWRUcmVlTm9kZShtZW1iZXJEYXRhKTsKICAgICAgICBpci5Db25zdGFudCBjb25zdGFudCA9CiAgICAgICAgICAgIG1lbWJlckRhdGEuZ2V0Q29uc3RhbnRCeUluZGV4KGV4cHJlc3Npb24sIF9yZWFkSW50SW50ZXJuYWwoKSk7CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudFJlZmVyZW5jZShleHByZXNzaW9uLCBjb25zdGFudCk7CiAgICAgIGNhc2UgX1RyZWVOb2RlS2luZC5ub2RlOgogICAgICAgIG1lbWJlckRhdGEgPz89IF9yZWFkTWVtYmVyRGF0YSgpOwogICAgICAgIGludCBpbmRleCA9IF9yZWFkSW50SW50ZXJuYWwoKTsKICAgICAgICBpci5UcmVlTm9kZSB0cmVlTm9kZSA9IG1lbWJlckRhdGEuZ2V0VHJlZU5vZGVCeUluZGV4KGluZGV4KTsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgIHRyZWVOb2RlICE9IG51bGwsCiAgICAgICAgICAgICJObyBUcmVlTm9kZSBmb3VuZCBmb3IgaW5kZXggJGluZGV4IGluICIKICAgICAgICAgICAgIiR7bWVtYmVyRGF0YS5ub2RlfS4kX2Vycm9yQ29udGV4dCIpOwogICAgICAgIHJldHVybiB0cmVlTm9kZTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIF9UcmVlTm9kZUtpbmQgJGtpbmQiKTsKICB9CgogIGlyLkZ1bmN0aW9uTm9kZSBfcmVhZEZ1bmN0aW9uTm9kZShfTWVtYmVyRGF0YSBtZW1iZXJEYXRhKSB7CiAgICBfRnVuY3Rpb25Ob2RlS2luZCBraW5kID0gX3JlYWRFbnVtSW50ZXJuYWwoX0Z1bmN0aW9uTm9kZUtpbmQudmFsdWVzKTsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIF9GdW5jdGlvbk5vZGVLaW5kLnByb2NlZHVyZToKICAgICAgICBpci5Qcm9jZWR1cmUgcHJvY2VkdXJlID0gX3JlYWRNZW1iZXJEYXRhKCkubm9kZTsKICAgICAgICByZXR1cm4gcHJvY2VkdXJlLmZ1bmN0aW9uOwogICAgICBjYXNlIF9GdW5jdGlvbk5vZGVLaW5kLmNvbnN0cnVjdG9yOgogICAgICAgIGlyLkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gX3JlYWRNZW1iZXJEYXRhKCkubm9kZTsKICAgICAgICByZXR1cm4gY29uc3RydWN0b3IuZnVuY3Rpb247CiAgICAgIGNhc2UgX0Z1bmN0aW9uTm9kZUtpbmQuZnVuY3Rpb25FeHByZXNzaW9uOgogICAgICAgIGlyLkZ1bmN0aW9uRXhwcmVzc2lvbiBmdW5jdGlvbkV4cHJlc3Npb24gPSBfcmVhZFRyZWVOb2RlKG1lbWJlckRhdGEpOwogICAgICAgIHJldHVybiBmdW5jdGlvbkV4cHJlc3Npb24uZnVuY3Rpb247CiAgICAgIGNhc2UgX0Z1bmN0aW9uTm9kZUtpbmQuZnVuY3Rpb25EZWNsYXJhdGlvbjoKICAgICAgICBpci5GdW5jdGlvbkRlY2xhcmF0aW9uIGZ1bmN0aW9uRGVjbGFyYXRpb24gPSBfcmVhZFRyZWVOb2RlKG1lbWJlckRhdGEpOwogICAgICAgIHJldHVybiBmdW5jdGlvbkRlY2xhcmF0aW9uLmZ1bmN0aW9uOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuZXhwZWN0ZWQgX0Z1bmN0aW9uTm9kZUtpbmQgJGtpbmQiKTsKICB9CgogIEBvdmVycmlkZQogIGlyLlR5cGVQYXJhbWV0ZXIgcmVhZFR5cGVQYXJhbWV0ZXJOb2RlKCkgewogICAgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQudHlwZVBhcmFtZXRlck5vZGUpOwogICAgcmV0dXJuIF9yZWFkVHlwZVBhcmFtZXRlcihudWxsKTsKICB9CgogIGlyLlR5cGVQYXJhbWV0ZXIgX3JlYWRUeXBlUGFyYW1ldGVyKF9NZW1iZXJEYXRhIG1lbWJlckRhdGEpIHsKICAgIF9UeXBlUGFyYW1ldGVyS2luZCBraW5kID0gX3JlYWRFbnVtSW50ZXJuYWwoX1R5cGVQYXJhbWV0ZXJLaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBfVHlwZVBhcmFtZXRlcktpbmQuY2xzOgogICAgICAgIGlyLkNsYXNzIGNscyA9IF9yZWFkQ2xhc3NEYXRhKCkubm9kZTsKICAgICAgICByZXR1cm4gY2xzLnR5cGVQYXJhbWV0ZXJzW19yZWFkSW50SW50ZXJuYWwoKV07CiAgICAgIGNhc2UgX1R5cGVQYXJhbWV0ZXJLaW5kLmZ1bmN0aW9uTm9kZToKICAgICAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlID0gX3JlYWRGdW5jdGlvbk5vZGUobWVtYmVyRGF0YSk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uTm9kZS50eXBlUGFyYW1ldGVyc1tfcmVhZEludEludGVybmFsKCldOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuZXhwZWN0ZWQgX1R5cGVQYXJhbWV0ZXJLaW5kIGtpbmQgJGtpbmQiKTsKICB9CgogIHZvaWQgX2NoZWNrRGF0YUtpbmQoRGF0YUtpbmQgZXhwZWN0ZWRLaW5kKSB7CiAgICBpZiAoIXVzZURhdGFLaW5kcykgcmV0dXJuOwogICAgRGF0YUtpbmQgYWN0dWFsS2luZCA9IF9yZWFkRW51bUludGVybmFsKERhdGFLaW5kLnZhbHVlcyk7CiAgICBhc3NlcnQoCiAgICAgICAgYWN0dWFsS2luZCA9PSBleHBlY3RlZEtpbmQsCiAgICAgICAgIkludmFsaWQgZGF0YSBraW5kLiAiCiAgICAgICAgIkV4cGVjdGVkICRleHBlY3RlZEtpbmQsIGZvdW5kICRhY3R1YWxLaW5kLiRfZXJyb3JDb250ZXh0Iik7CiAgfQoKICBAb3ZlcnJpZGUKICBMb2NhbCByZWFkTG9jYWwoKSB7CiAgICBMb2NhbEtpbmQga2luZCA9IHJlYWRFbnVtKExvY2FsS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgTG9jYWxLaW5kLmpMb2NhbDoKICAgICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyQ29udGV4dCA9IHJlYWRNZW1iZXIoKTsKICAgICAgICBpbnQgbG9jYWxJbmRleCA9IHJlYWRJbnQoKTsKICAgICAgICByZXR1cm4gbG9jYWxMb29rdXAuZ2V0TG9jYWxCeUluZGV4KG1lbWJlckNvbnRleHQsIGxvY2FsSW5kZXgpOwogICAgICBjYXNlIExvY2FsS2luZC50aGlzTG9jYWw6CiAgICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gcmVhZENsYXNzKCk7CiAgICAgICAgcmV0dXJuIG5ldyBUaGlzTG9jYWwoY2xzKTsKICAgICAgY2FzZSBMb2NhbEtpbmQuYm94TG9jYWw6CiAgICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gcmVhZENsYXNzKCk7CiAgICAgICAgcmV0dXJuIG5ldyBCb3hMb2NhbChjbHMpOwogICAgICBjYXNlIExvY2FsS2luZC5hbm9ueW1vdXNDbG9zdXJlTG9jYWw6CiAgICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gcmVhZENsYXNzKCk7CiAgICAgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNDbG9zdXJlTG9jYWwoY2xzKTsKICAgICAgY2FzZSBMb2NhbEtpbmQudHlwZVZhcmlhYmxlTG9jYWw6CiAgICAgICAgVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUgPSByZWFkRGFydFR5cGUoKTsKICAgICAgICByZXR1cm4gbmV3IFR5cGVWYXJpYWJsZUxvY2FsKHR5cGVWYXJpYWJsZSk7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBsb2NhbCBraW5kICRraW5kIik7CiAgfQoKICBAb3ZlcnJpZGUKICBJbXBvcnRFbnRpdHkgcmVhZEltcG9ydCgpIHsKICAgIF9jaGVja0RhdGFLaW5kKERhdGFLaW5kLmltcG9ydCk7CiAgICByZXR1cm4gX3JlYWRJbXBvcnQoKTsKICB9CgogIEltcG9ydEVudGl0eSBfcmVhZEltcG9ydCgpIHsKICAgIHJldHVybiBfaW1wb3J0SW5kZXgucmVhZChfcmVhZEltcG9ydEludGVybmFsKTsKICB9CgogIEltcG9ydEVudGl0eSBfcmVhZEltcG9ydEludGVybmFsKCkgewogICAgU3RyaW5nIG5hbWUgPSByZWFkU3RyaW5nT3JOdWxsKCk7CiAgICBVcmkgdXJpID0gX3JlYWRVcmkoKTsKICAgIFVyaSBlbmNsb3NpbmdMaWJyYXJ5VXJpID0gX3JlYWRVcmkoKTsKICAgIGJvb2wgaXNEZWZlcnJlZCA9IF9yZWFkQm9vbCgpOwogICAgcmV0dXJuIG5ldyBJbXBvcnRFbnRpdHkoaXNEZWZlcnJlZCwgbmFtZSwgdXJpLCBlbmNsb3NpbmdMaWJyYXJ5VXJpKTsKICB9CgogIEBvdmVycmlkZQogIE91dHB1dFVuaXQgcmVhZE91dHB1dFVuaXRSZWZlcmVuY2UoKSB7CiAgICBhc3NlcnQoCiAgICAgICAgX2NvZGVnZW5SZWFkZXIgIT0gbnVsbCwKICAgICAgICAiQ2FuIG5vdCBkZXNlcmlhbGl6ZSBhbiBPdXRwdXRVbml0IHJlZmVyZW5jZSAiCiAgICAgICAgIndpdGhvdXQgYSByZWdpc3RlcmVkIGNvZGVnZW4gcmVhZGVyLiIpOwogICAgcmV0dXJuIF9jb2RlZ2VuUmVhZGVyLnJlYWRPdXRwdXRVbml0UmVmZXJlbmNlKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSByZWFkQWJzdHJhY3RWYWx1ZSgpIHsKICAgIGFzc2VydCgKICAgICAgICBfY29kZWdlblJlYWRlciAhPSBudWxsLAogICAgICAgICJDYW4gbm90IGRlc2VyaWFsaXplIGFuIEFic3RyYWN0VmFsdWUgIgogICAgICAgICJ3aXRob3V0IGEgcmVnaXN0ZXJlZCBjb2RlZ2VuIHJlYWRlci4iKTsKICAgIHJldHVybiBfY29kZWdlblJlYWRlci5yZWFkQWJzdHJhY3RWYWx1ZSh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGpzLk5vZGUgcmVhZEpzTm9kZSgpIHsKICAgIGFzc2VydChfY29kZWdlblJlYWRlciAhPSBudWxsLAogICAgICAgICJDYW4gbm90IGRlc2VyaWFsaXplIGEgSlMgbm9kZSB3aXRob3V0IGEgcmVnaXN0ZXJlZCBjb2RlZ2VuIHJlYWRlci4iKTsKICAgIHJldHVybiBfY29kZWdlblJlYWRlci5yZWFkSnNOb2RlKHRoaXMpOwogIH0KCiAgLy8vIEFjdHVhbCBkZXNlcmlhbGl6YXRpb24gb2YgYSBzZWN0aW9uIGJlZ2luIHRhZywgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KICB2b2lkIF9iZWdpbihTdHJpbmcgdGFnKTsKCiAgLy8vIEFjdHVhbCBkZXNlcmlhbGl6YXRpb24gb2YgYSBzZWN0aW9uIGVuZCB0YWcsIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuCiAgdm9pZCBfZW5kKFN0cmluZyB0YWcpOwoKICAvLy8gQWN0dWFsIGRlc2VyaWFsaXphdGlvbiBvZiBhIHN0cmluZyB2YWx1ZSwgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KICBTdHJpbmcgX3JlYWRTdHJpbmdJbnRlcm5hbCgpOwoKICAvLy8gQWN0dWFsIGRlc2VyaWFsaXphdGlvbiBvZiBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlLCBpbXBsZW1lbnRlZCBieQogIC8vLyBzdWJjbGFzc2VzLgogIGludCBfcmVhZEludEludGVybmFsKCk7CgogIC8vLyBBY3R1YWwgZGVzZXJpYWxpemF0aW9uIG9mIGEgVVJJIHZhbHVlLCBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLgogIFVyaSBfcmVhZFVyaUludGVybmFsKCk7CgogIC8vLyBBY3R1YWwgZGVzZXJpYWxpemF0aW9uIG9mIGFuIGVudW0gdmFsdWUgaW4gW3ZhbHVlc10sIGltcGxlbWVudGVkIGJ5CiAgLy8vIHN1YmNsYXNzZXMuCiAgRSBfcmVhZEVudW1JbnRlcm5hbDxFPihMaXN0PEU+IHZhbHVlcyk7CgogIC8vLyBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkYXRhIHNvdXJjZQogIC8vLyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBpbiBjb25zaXN0ZW5jaWVzIGJldHdlZW4gc2VyaWFsaXphdGlvbiBhbmQKICAvLy8gZGVzZXJpYWxpemF0aW9uLgogIFN0cmluZyBnZXQgX2Vycm9yQ29udGV4dDsKfQqDEgBOTjwBHgFNGTocGzUkHhwgASYgLywvATABIyIBMzQuPTo9BAEMGyMEAQwZIQQBDEImKAQBKCYdBAEMOSMiBAEiIxoEAQw2IiAEAQwzHBwEASAiGQQBDDUcJB0EAQw3JhsEAQwzODQlHxQoLhMEASYqNEkEAQwbTRsEAQwhSAQBDB1GBAEMIUgEAQwfRwQBDCtNBAEhOhs2MjsGEgQBKDYbPDI/BhIEAQwgKRokIiwEAQwzJycnEQQBTTcUHhUiISY5Lh9ELSYrM0dBIEcnQk0KRE8wMy0zJzo7LQohGBwkHSEcAScoTjYhME5DQyUkIkYvBkEEAQw6Ky4nEQQBUD8UIhUmJCknKCYtLC9CTkcyH0ROKToqJCwwMUwgQyhDNSg4LjgKSzAxNy0tOUQmR0EKTyJFLiw8JwErKCo3OS8oKjc6MCgqNzslMCo3OyknBkEEASI7BAEqShQiKyUxJjMlNQZBBAEMHykjBAEgLyEsBAEMHSgiBAEiLyEoBAEMISofBAEkIz4EAQwhKiQEAQwiKCYEAQwSIhcEARMtBAEMFCMYBAEVJCYXBAEMGCUaBAEZMwQBDBIlHwQBDB8nIAQBLx9OJ1E1DTcGBAEMKD0EAUYnJgQBDC4gFD8GEQQBDDkjGzAnJksWBhEEAQxGIxswGCZLFRkGEAQBDCEnHAQBDB0lHwQBHiUiIiIiHwQBDBsiIgQBGScEASI3BAEqShQjIS0iJiwlKy8lJS8jKicxKDojKDc1IigzSSIoNDY5KjpAKi0xNzo7IzMoPSw4MUgrJyonMi4xNUAwO0EqMSYuLgZLBAE2QhQeJiEnNlAtJy4oLyMqRh9LPB8qKEUQHjUyGQZCBAE+ShQoOSMqPSUxTiwyUC0GRgQBDC0wJQQBQEwUIy43LEZABkwEAS8fPgwkHkUEAQwWMRQdMyRHICcjHyciLCcvKDg0Bj8EAQweJRoEAR8zBAEnJhoqI0kEAQwpDCA3MTkEAQwmDCAwMTMEAQwZI08sBAFQGwFOGQFLIAFNEhoBSBoBShIqAU5GFxwCATdwYWNrYWdlOmNvbXBpbGVyL3NyYy9zZXJpYWxpemF0aW9uL2Fic3RyYWN0X3NvdXJjZS5kYXJ0PHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NlcmlhbGl6YXRpb24vYmluYXJ5X3NpbmsuZGFydIfFLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgJ3NlcmlhbGl6YXRpb24uZGFydCc7CgovLy8gW0RhdGFTaW5rXSB0aGF0IHdyaXRlcyBkYXRhIGFzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuCi8vLwovLy8gVGhpcyBkYXRhIHNpbmsgd29ya3MgdG9nZXRoZXIgd2l0aCBbQmluYXJ5U291cmNlXS4KY2xhc3MgQmluYXJ5U2luayBleHRlbmRzIEFic3RyYWN0RGF0YVNpbmsgewogIGZpbmFsIFNpbms8TGlzdDxpbnQ+PiBzaW5rOwogIEJ1ZmZlcmVkU2luayBfYnVmZmVyZWRTaW5rOwogIGludCBfbGVuZ3RoID0gMDsKCiAgQmluYXJ5U2luayh0aGlzLnNpbmssCiAgICAgIHtib29sIHVzZURhdGFLaW5kczogZmFsc2UsIE1hcDxTdHJpbmcsIGludD4gdGFnRnJlcXVlbmN5TWFwfSkKICAgICAgOiBfYnVmZmVyZWRTaW5rID0gbmV3IEJ1ZmZlcmVkU2luayhzaW5rKSwKICAgICAgICBzdXBlcih1c2VEYXRhS2luZHM6IHVzZURhdGFLaW5kcywgdGFnRnJlcXVlbmN5TWFwOiB0YWdGcmVxdWVuY3lNYXApOwoKICBAb3ZlcnJpZGUKICB2b2lkIF9iZWdpbihTdHJpbmcgdGFnKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IHRhZ3MgaW4gYmluYXJ5IHNlcmlhbGl6YXRpb24/CiAgfQogIEBvdmVycmlkZQogIHZvaWQgX2VuZChTdHJpbmcgdGFnKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IHRhZ3MgaW4gYmluYXJ5IHNlcmlhbGl6YXRpb24/CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF93cml0ZVVyaUludGVybmFsKFVyaSB2YWx1ZSkgewogICAgX3dyaXRlU3RyaW5nKHZhbHVlLnRvU3RyaW5nKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfd3JpdGVTdHJpbmdJbnRlcm5hbChTdHJpbmcgdmFsdWUpIHsKICAgIExpc3Q8aW50PiBieXRlcyA9IHV0ZjguZW5jb2RlKHZhbHVlKTsKICAgIF93cml0ZUludEludGVybmFsKGJ5dGVzLmxlbmd0aCk7CiAgICBfYnVmZmVyZWRTaW5rLmFkZEJ5dGVzKGJ5dGVzKTsKICAgIF9sZW5ndGggKz0gYnl0ZXMubGVuZ3RoOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfd3JpdGVJbnRJbnRlcm5hbChpbnQgdmFsdWUpIHsKICAgIGFzc2VydCh2YWx1ZSA+PSAwICYmIHZhbHVlID4+IDMwID09IDApOwogICAgaWYgKHZhbHVlIDwgMHg4MCkgewogICAgICBfYnVmZmVyZWRTaW5rLmFkZEJ5dGUodmFsdWUpOwogICAgICBfbGVuZ3RoICs9IDE7CiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMHg0MDAwKSB7CiAgICAgIF9idWZmZXJlZFNpbmsuYWRkQnl0ZTIoKHZhbHVlID4+IDgpIHwgMHg4MCwgdmFsdWUgJiAweEZGKTsKICAgICAgX2xlbmd0aCArPSAyOwogICAgfSBlbHNlIHsKICAgICAgX2J1ZmZlcmVkU2luay5hZGRCeXRlNCgodmFsdWUgPj4gMjQpIHwgMHhDMCwgKHZhbHVlID4+IDE2KSAmIDB4RkYsCiAgICAgICAgICAodmFsdWUgPj4gOCkgJiAweEZGLCB2YWx1ZSAmIDB4RkYpOwogICAgICBfbGVuZ3RoICs9IDQ7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF93cml0ZUVudW1JbnRlcm5hbChkeW5hbWljIHZhbHVlKSB7CiAgICBfd3JpdGVJbnRJbnRlcm5hbCh2YWx1ZS5pbmRleCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsb3NlKCkgewogICAgX2J1ZmZlcmVkU2luay5mbHVzaEFuZERlc3Ryb3koKTsKICAgIF9idWZmZXJlZFNpbmsgPSBudWxsOwogICAgc2luay5jbG9zZSgpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoaXMgZGF0YSBzaW5rLgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoID0+IF9sZW5ndGg7Cn0KSwBOTjwBHgE4BDcsHh4TARhEME0BDBxCBAwaQgQBDCYkBAEMLColIx0EAQwmLBgkFCFBFA1JLhQGBAEMKyQEAQwRJRoSBAE9DB0CATNwYWNrYWdlOmNvbXBpbGVyL3NyYy9zZXJpYWxpemF0aW9uL2JpbmFyeV9zaW5rLmRhcnQ+c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc2VyaWFsaXphdGlvbi9iaW5hcnlfc291cmNlLmRhcnSHGS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mICdzZXJpYWxpemF0aW9uLmRhcnQnOwoKLy8vIFtEYXRhU291cmNlXSB0aGF0IHJlYWRzIGRhdGEgZnJvbSBhIHNlcXVlbmNlIG9mIGJ5dGVzLgovLy8KLy8vIFRoaXMgZGF0YSBzb3VyY2Ugd29ya3MgdG9nZXRoZXIgd2l0aCBbQmluYXJ5U2lua10uCmNsYXNzIEJpbmFyeVNvdXJjZUltcGwgZXh0ZW5kcyBBYnN0cmFjdERhdGFTb3VyY2UgewogIGludCBfYnl0ZU9mZnNldCA9IDA7CiAgZmluYWwgTGlzdDxpbnQ+IF9ieXRlczsKCiAgQmluYXJ5U291cmNlSW1wbCh0aGlzLl9ieXRlcywge2Jvb2wgdXNlRGF0YUtpbmRzOiBmYWxzZX0pCiAgICAgIDogc3VwZXIodXNlRGF0YUtpbmRzOiB1c2VEYXRhS2luZHMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIF9iZWdpbihTdHJpbmcgdGFnKSB7fQogIEBvdmVycmlkZQogIHZvaWQgX2VuZChTdHJpbmcgdGFnKSB7fQoKICBpbnQgX3JlYWRCeXRlKCkgPT4gX2J5dGVzW19ieXRlT2Zmc2V0KytdOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgX3JlYWRTdHJpbmdJbnRlcm5hbCgpIHsKICAgIGludCBsZW5ndGggPSBfcmVhZEludEludGVybmFsKCk7CiAgICBMaXN0PGludD4gYnl0ZXMgPSBuZXcgVWludDhMaXN0KGxlbmd0aCk7CiAgICBieXRlcy5zZXRSYW5nZSgwLCBieXRlcy5sZW5ndGgsIF9ieXRlcywgX2J5dGVPZmZzZXQpOwogICAgX2J5dGVPZmZzZXQgKz0gYnl0ZXMubGVuZ3RoOwogICAgcmV0dXJuIHV0ZjguZGVjb2RlKGJ5dGVzKTsKICB9CgogIEBvdmVycmlkZQogIGludCBfcmVhZEludEludGVybmFsKCkgewogICAgdmFyIGJ5dGUgPSBfcmVhZEJ5dGUoKTsKICAgIGlmIChieXRlICYgMHg4MCA9PSAwKSB7CiAgICAgIC8vIDB4eHh4eHh4CiAgICAgIHJldHVybiBieXRlOwogICAgfSBlbHNlIGlmIChieXRlICYgMHg0MCA9PSAwKSB7CiAgICAgIC8vIDEweHh4eHh4CiAgICAgIHJldHVybiAoKGJ5dGUgJiAweDNGKSA8PCA4KSB8IF9yZWFkQnl0ZSgpOwogICAgfSBlbHNlIHsKICAgICAgLy8gMTF4eHh4eHgKICAgICAgcmV0dXJuICgoYnl0ZSAmIDB4M0YpIDw8IDI0KSB8CiAgICAgICAgICAoX3JlYWRCeXRlKCkgPDwgMTYpIHwKICAgICAgICAgIChfcmVhZEJ5dGUoKSA8PCA4KSB8CiAgICAgICAgICBfcmVhZEJ5dGUoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFVyaSBfcmVhZFVyaUludGVybmFsKCkgewogICAgU3RyaW5nIHRleHQgPSBfcmVhZFN0cmluZygpOwogICAgcmV0dXJuIFVyaS5wYXJzZSh0ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEUgX3JlYWRFbnVtSW50ZXJuYWw8RT4oTGlzdDxFPiB2YWx1ZXMpIHsKICAgIGludCBpbmRleCA9IF9yZWFkSW50SW50ZXJuYWwoKTsKICAgIGFzc2VydCgKICAgICAgICAwIDw9IGluZGV4ICYmIGluZGV4IDwgdmFsdWVzLmxlbmd0aCwKICAgICAgICAiSW52YWxpZCBkYXRhIGtpbmQgaW5kZXguICIKICAgICAgICAiRXhwZWN0ZWQgb25lIG9mICR2YWx1ZXMsIGZvdW5kIGluZGV4ICRpbmRleC4iKTsKICAgIHJldHVybiB2YWx1ZXNbaW5kZXhdOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfZXJyb3JDb250ZXh0ID0+ICcgT2Zmc2V0ICRfYnl0ZU9mZnNldCBpbiAke19ieXRlcy5sZW5ndGh9Lic7Cn0KRwBOTjwBHgE7BDc0FxoBPCsBDB0MGwEsAQwhJS06IR8EAQwbHBwSEyMSMQ0SJSAfFwYEAQwbIRwEAQwrJAwtJDkaBAEMSwIBNXBhY2thZ2U6Y29tcGlsZXIvc3JjL3NlcmlhbGl6YXRpb24vYmluYXJ5X3NvdXJjZS5kYXJ0OHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NlcmlhbGl6YXRpb24vaGVscGVycy5kYXJ0rUYvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiAnc2VyaWFsaXphdGlvbi5kYXJ0JzsKCi8vLyBFbnVtIHZhbHVlcyB1c2VkIGZvciBpZGVudGlmeWluZyBkaWZmZXJlbnQga2luZHMgb2Ygc2VyaWFsaXplZCBkYXRhLgovLy8KLy8vIFRoaXMgaXMgdXNlZCB0byBmb3IgZGVidWdnaW5nIGRhdGEgaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gc2VyaWFsaXphdGlvbgovLy8gYW5kIGRlc2VyaWFsaXphdGlvbi4KZW51bSBEYXRhS2luZCB7CiAgYm9vbCwKICB1aW50MzAsCiAgc3RyaW5nLAogIGVudW1WYWx1ZSwKICB1cmksCiAgbGlicmFyeU5vZGUsCiAgY2xhc3NOb2RlLAogIHR5cGVkZWZOb2RlLAogIG1lbWJlck5vZGUsCiAgdHJlZU5vZGUsCiAgdHlwZVBhcmFtZXRlck5vZGUsCiAgZGFydFR5cGUsCiAgZGFydFR5cGVOb2RlLAogIHNvdXJjZVNwYW4sCiAgY29uc3RhbnQsCiAgaW1wb3J0LAogIGRvdWJsZSwKICBpbnQsCn0KCi8vLyBFbnVtIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHRoZSBlbmNsb3NpbmcgZW50aXR5IG9mIGEgbWVtYmVyIGluIHNlcmlhbGl6YXRpb24uCmVudW0gTWVtYmVyQ29udGV4dEtpbmQgeyBsaWJyYXJ5LCBjbHMgfQoKLy8vIEVudW0gdXNlZCBmb3IgaWRlbnRpZnlpbmcgW0xvY2FsXSBzdWJjbGFzc2VzIGluIHNlcmlhbGl6YXRpb24uCmVudW0gTG9jYWxLaW5kIHsKICBqTG9jYWwsCiAgdGhpc0xvY2FsLAogIGJveExvY2FsLAogIGFub255bW91c0Nsb3N1cmVMb2NhbCwKICB0eXBlVmFyaWFibGVMb2NhbCwKfQoKLy8vIEVudW0gdXNlZCBmb3IgaWRlbnRpZnlpbmcgW2lyLlRyZWVOb2RlXSBzdWJjbGFzc2VzIGluIHNlcmlhbGl6YXRpb24uCmVudW0gX1RyZWVOb2RlS2luZCB7CiAgY2xzLAogIG1lbWJlciwKICBub2RlLAogIGZ1bmN0aW9uTm9kZSwKICB0eXBlUGFyYW1ldGVyLAogIGZ1bmN0aW9uRGVjbGFyYXRpb25WYXJpYWJsZSwKICBjb25zdGFudCwKfQoKLy8vIEVudW0gdXNlZCBmb3IgaWRlbnRpZnlpbmcgW2lyLkZ1bmN0aW9uTm9kZV0gY29udGV4dCBpbiBzZXJpYWxpemF0aW9uLgplbnVtIF9GdW5jdGlvbk5vZGVLaW5kIHsKICBwcm9jZWR1cmUsCiAgY29uc3RydWN0b3IsCiAgZnVuY3Rpb25FeHByZXNzaW9uLAogIGZ1bmN0aW9uRGVjbGFyYXRpb24sCn0KCi8vLyBFbnVtIHVzZWQgZm9yIGlkZW50aWZ5aW5nIFtpci5UeXBlUGFyYW1ldGVyXSBjb250ZXh0IGluIHNlcmlhbGl6YXRpb24uCmVudW0gX1R5cGVQYXJhbWV0ZXJLaW5kIHsKICBjbHMsCiAgZnVuY3Rpb25Ob2RlLAp9CgovLy8gQ2xhc3MgdXNlZCBmb3IgZW5jb2RpbmcgdGFncyBpbiBbT2JqZWN0U2lua10gYW5kIFtPYmplY3RTb3VyY2VdLgpjbGFzcyBUYWcgewogIGZpbmFsIFN0cmluZyB2YWx1ZTsKCiAgVGFnKHRoaXMudmFsdWUpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHZhbHVlLmhhc2hDb2RlICogMTM7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgVGFnKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdmFsdWUgPT0gb3RoZXIudmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnVGFnKCR2YWx1ZSknOwp9CgovLy8gRW51bSB1c2VkIGZvciBpZGVudGlmeWluZyBbRGFydFR5cGVdIHN1YmNsYXNzZXMgaW4gc2VyaWFsaXphdGlvbi4KZW51bSBEYXJ0VHlwZUtpbmQgewogIG5vbmUsCiAgdm9pZFR5cGUsCiAgdHlwZVZhcmlhYmxlLAogIGZ1bmN0aW9uVHlwZVZhcmlhYmxlLAogIGZ1bmN0aW9uVHlwZSwKICBpbnRlcmZhY2VUeXBlLAogIHR5cGVkZWYsCiAgZHluYW1pY1R5cGUsCiAgZnV0dXJlT3IsCn0KCi8vLyBWaXNpdG9yIHRoYXQgc2VyaWFsaXplcyBbRGFydFR5cGVdIG9iamVjdCB0b2dldGhlciB3aXRoIFtBYnN0cmFjdERhdGFTaW5rXS4KY2xhc3MgRGFydFR5cGVXcml0ZXIKICAgIGltcGxlbWVudHMgRGFydFR5cGVWaXNpdG9yPHZvaWQsIExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+PiB7CiAgZmluYWwgQWJzdHJhY3REYXRhU2luayBfc2luazsKCiAgRGFydFR5cGVXcml0ZXIodGhpcy5fc2luayk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXQoY292YXJpYW50IERhcnRUeXBlIHR5cGUsCiAgICAgICAgICBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpID0+CiAgICAgIHR5cGUuYWNjZXB0KHRoaXMsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CgogIHZvaWQgdmlzaXRUeXBlcygKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZXMsIExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykgewogICAgX3Npbmsud3JpdGVJbnQodHlwZXMubGVuZ3RoKTsKICAgIGZvciAoRGFydFR5cGUgdHlwZSBpbiB0eXBlcykgewogICAgICBfc2luay5fd3JpdGVEYXJ0VHlwZSh0eXBlLCBmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZvaWRUeXBlKGNvdmFyaWFudCBWb2lkVHlwZSB0eXBlLAogICAgICBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIF9zaW5rLndyaXRlRW51bShEYXJ0VHlwZUtpbmQudm9pZFR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVWYXJpYWJsZVR5cGUoY292YXJpYW50IFR5cGVWYXJpYWJsZVR5cGUgdHlwZSwKICAgICAgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSB7CiAgICBfc2luay53cml0ZUVudW0oRGFydFR5cGVLaW5kLnR5cGVWYXJpYWJsZSk7CiAgICBJbmRleGVkVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSA9IHR5cGUuZWxlbWVudDsKICAgIF9zaW5rLndyaXRlVHlwZVZhcmlhYmxlKHR5cGVWYXJpYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25UeXBlVmFyaWFibGUoY292YXJpYW50IEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHR5cGUsCiAgICAgIExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykgewogICAgaW50IGluZGV4ID0gZnVuY3Rpb25UeXBlVmFyaWFibGVzLmluZGV4T2YodHlwZSk7CiAgICBpZiAoaW5kZXggPT0gLTEpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXZvaWQgZnJlZSB2YXJpYWJsZXMuCiAgICAgIF9zaW5rLl93cml0ZURhcnRUeXBlKGNvbnN0IER5bmFtaWNUeXBlKCksIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICB9IGVsc2UgewogICAgICBfc2luay53cml0ZUVudW0oRGFydFR5cGVLaW5kLmZ1bmN0aW9uVHlwZVZhcmlhYmxlKTsKICAgICAgX3Npbmsud3JpdGVJbnQoaW5kZXgpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZ1bmN0aW9uVHlwZShjb3ZhcmlhbnQgRnVuY3Rpb25UeXBlIHR5cGUsCiAgICAgIExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykgewogICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlS2luZC5mdW5jdGlvblR5cGUpOwogICAgZnVuY3Rpb25UeXBlVmFyaWFibGVzID0KICAgICAgICBuZXcgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4uZnJvbShmdW5jdGlvblR5cGVWYXJpYWJsZXMpCiAgICAgICAgICAuLmFkZEFsbCh0eXBlLnR5cGVWYXJpYWJsZXMpOwogICAgX3Npbmsud3JpdGVJbnQodHlwZS50eXBlVmFyaWFibGVzLmxlbmd0aCk7CiAgICBmb3IgKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHZhcmlhYmxlIGluIHR5cGUudHlwZVZhcmlhYmxlcykgewogICAgICBfc2luay5fd3JpdGVEYXJ0VHlwZSh2YXJpYWJsZS5ib3VuZCwgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgIH0KICAgIF9zaW5rLl93cml0ZURhcnRUeXBlKHR5cGUucmV0dXJuVHlwZSwgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgIHZpc2l0VHlwZXModHlwZS5wYXJhbWV0ZXJUeXBlcywgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgIHZpc2l0VHlwZXModHlwZS5vcHRpb25hbFBhcmFtZXRlclR5cGVzLCBmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgdmlzaXRUeXBlcyh0eXBlLm5hbWVkUGFyYW1ldGVyVHlwZXMsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICBmb3IgKFN0cmluZyBuYW1lZFBhcmFtZXRlciBpbiB0eXBlLm5hbWVkUGFyYW1ldGVycykgewogICAgICBfc2luay53cml0ZVN0cmluZyhuYW1lZFBhcmFtZXRlcik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50ZXJmYWNlVHlwZShjb3ZhcmlhbnQgSW50ZXJmYWNlVHlwZSB0eXBlLAogICAgICBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIF9zaW5rLndyaXRlRW51bShEYXJ0VHlwZUtpbmQuaW50ZXJmYWNlVHlwZSk7CiAgICBfc2luay53cml0ZUNsYXNzKHR5cGUuZWxlbWVudCk7CiAgICB2aXNpdFR5cGVzKHR5cGUudHlwZUFyZ3VtZW50cywgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlZGVmVHlwZShjb3ZhcmlhbnQgVHlwZWRlZlR5cGUgdHlwZSwKICAgICAgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSB7CiAgICBfc2luay53cml0ZUVudW0oRGFydFR5cGVLaW5kLnR5cGVkZWYpOwogICAgX3Npbmsud3JpdGVUeXBlZGVmKHR5cGUuZWxlbWVudCk7CiAgICB2aXNpdFR5cGVzKHR5cGUudHlwZUFyZ3VtZW50cywgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgIF9zaW5rLl93cml0ZURhcnRUeXBlKHR5cGUudW5hbGlhc2VkLCBmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdER5bmFtaWNUeXBlKGNvdmFyaWFudCBEeW5hbWljVHlwZSB0eXBlLAogICAgICBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIF9zaW5rLndyaXRlRW51bShEYXJ0VHlwZUtpbmQuZHluYW1pY1R5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZ1dHVyZU9yVHlwZShjb3ZhcmlhbnQgRnV0dXJlT3JUeXBlIHR5cGUsCiAgICAgIExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykgewogICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlS2luZC5mdXR1cmVPcik7CiAgICBfc2luay5fd3JpdGVEYXJ0VHlwZSh0eXBlLnR5cGVBcmd1bWVudCwgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICB9Cn0KCi8vLyBFbnVtIHVzZWQgZm9yIGlkZW50aWZ5aW5nIFtpci5EYXJ0VHlwZV0gc3ViY2xhc3NlcyBpbiBzZXJpYWxpemF0aW9uLgplbnVtIERhcnRUeXBlTm9kZUtpbmQgewogIG5vbmUsCiAgdm9pZFR5cGUsCiAgdHlwZVBhcmFtZXRlclR5cGUsCiAgZnVuY3Rpb25UeXBlLAogIGZ1bmN0aW9uVHlwZVZhcmlhYmxlLAogIGludGVyZmFjZVR5cGUsCiAgdHlwZWRlZiwKICBkeW5hbWljVHlwZSwKICBib3R0b21UeXBlLAogIGludmFsaWRUeXBlLAogIHRoaXNJbnRlcmZhY2VUeXBlLAogIGV4YWN0SW50ZXJmYWNlVHlwZSwKICBkb2VzTm90Q29tcGxldGUsCn0KCmNvbnN0IFN0cmluZyBmdW5jdGlvblR5cGVOb2RlVGFnID0gJ2Z1bmN0aW9uLXR5cGUtbm9kZSc7CgpjbGFzcyBEYXJ0VHlwZU5vZGVXcml0ZXIKICAgIGV4dGVuZHMgaXIuRGFydFR5cGVWaXNpdG9yMTx2b2lkLCBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+PiB7CiAgZmluYWwgQWJzdHJhY3REYXRhU2luayBfc2luazsKCiAgRGFydFR5cGVOb2RlV3JpdGVyKHRoaXMuX3NpbmspOwoKICB2b2lkIHZpc2l0VHlwZXMoCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVzLCBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykgewogICAgX3Npbmsud3JpdGVJbnQodHlwZXMubGVuZ3RoKTsKICAgIGZvciAoaXIuRGFydFR5cGUgdHlwZSBpbiB0eXBlcykgewogICAgICBfc2luay5fd3JpdGVEYXJ0VHlwZU5vZGUodHlwZSwgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdERhcnRUeXBlKAogICAgICBpci5EYXJ0VHlwZSBub2RlLCBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIlVuZXhwZWN0ZWQgaXIuRGFydFR5cGUgJG5vZGUgKCR7bm9kZS5ydW50aW1lVHlwZX0pLiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludmFsaWRUeXBlKAogICAgICBpci5JbnZhbGlkVHlwZSBub2RlLCBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykgewogICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlTm9kZUtpbmQuaW52YWxpZFR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdER5bmFtaWNUeXBlKAogICAgICBpci5EeW5hbWljVHlwZSBub2RlLCBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykgewogICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlTm9kZUtpbmQuZHluYW1pY1R5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZvaWRUeXBlKAogICAgICBpci5Wb2lkVHlwZSBub2RlLCBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykgewogICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlTm9kZUtpbmQudm9pZFR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJvdHRvbVR5cGUoCiAgICAgIGlyLkJvdHRvbVR5cGUgbm9kZSwgTGlzdDxpci5UeXBlUGFyYW1ldGVyPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIGlmIChub2RlID09IGNvbnN0IERvZXNOb3RDb21wbGV0ZVR5cGUoKSkgewogICAgICBfc2luay53cml0ZUVudW0oRGFydFR5cGVOb2RlS2luZC5kb2VzTm90Q29tcGxldGUpOwogICAgfSBlbHNlIHsKICAgICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlTm9kZUtpbmQuYm90dG9tVHlwZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50ZXJmYWNlVHlwZSgKICAgICAgaXIuSW50ZXJmYWNlVHlwZSBub2RlLCBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykgewogICAgaWYgKG5vZGUgaXMgVGhpc0ludGVyZmFjZVR5cGUpIHsKICAgICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlTm9kZUtpbmQudGhpc0ludGVyZmFjZVR5cGUpOwogICAgfSBlbHNlIGlmIChub2RlIGlzIEV4YWN0SW50ZXJmYWNlVHlwZSkgewogICAgICBfc2luay53cml0ZUVudW0oRGFydFR5cGVOb2RlS2luZC5leGFjdEludGVyZmFjZVR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlTm9kZUtpbmQuaW50ZXJmYWNlVHlwZSk7CiAgICB9CiAgICBfc2luay53cml0ZUNsYXNzTm9kZShub2RlLmNsYXNzTm9kZSk7CiAgICB2aXNpdFR5cGVzKG5vZGUudHlwZUFyZ3VtZW50cywgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvblR5cGUoCiAgICAgIGlyLkZ1bmN0aW9uVHlwZSBub2RlLCBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykgewogICAgX3Npbmsud3JpdGVFbnVtKERhcnRUeXBlTm9kZUtpbmQuZnVuY3Rpb25UeXBlKTsKICAgIF9zaW5rLmJlZ2luKGZ1bmN0aW9uVHlwZU5vZGVUYWcpOwogICAgZnVuY3Rpb25UeXBlVmFyaWFibGVzID0KICAgICAgICBuZXcgTGlzdDxpci5UeXBlUGFyYW1ldGVyPi5mcm9tKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcykKICAgICAgICAgIC4uYWRkQWxsKG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgX3Npbmsud3JpdGVJbnQobm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGgpOwogICAgZm9yIChpci5UeXBlUGFyYW1ldGVyIHBhcmFtZXRlciBpbiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIF9zaW5rLndyaXRlU3RyaW5nKHBhcmFtZXRlci5uYW1lKTsKICAgICAgX3NpbmsuX3dyaXRlRGFydFR5cGVOb2RlKHBhcmFtZXRlci5ib3VuZCwgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgICAgX3NpbmsuX3dyaXRlRGFydFR5cGVOb2RlKHBhcmFtZXRlci5kZWZhdWx0VHlwZSwgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgIH0KICAgIF9zaW5rLl93cml0ZURhcnRUeXBlTm9kZShub2RlLnJldHVyblR5cGUsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyk7CiAgICBfc2luay53cml0ZUludChub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogICAgdmlzaXRUeXBlcyhub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLCBmdW5jdGlvblR5cGVWYXJpYWJsZXMpOwogICAgX3Npbmsud3JpdGVJbnQobm9kZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIGZvciAoaXIuTmFtZWRUeXBlIHBhcmFtZXRlciBpbiBub2RlLm5hbWVkUGFyYW1ldGVycykgewogICAgICBfc2luay53cml0ZVN0cmluZyhwYXJhbWV0ZXIubmFtZSk7CiAgICAgIF9zaW5rLl93cml0ZURhcnRUeXBlTm9kZShwYXJhbWV0ZXIudHlwZSwgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICAgIH0KICAgIF9zaW5rLl93cml0ZURhcnRUeXBlTm9kZShub2RlLnR5cGVkZWZUeXBlLCBmdW5jdGlvblR5cGVWYXJpYWJsZXMsCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIF9zaW5rLmVuZChmdW5jdGlvblR5cGVOb2RlVGFnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZSgKICAgICAgaXIuVHlwZVBhcmFtZXRlclR5cGUgbm9kZSwgTGlzdDxpci5UeXBlUGFyYW1ldGVyPiBmdW5jdGlvblR5cGVWYXJpYWJsZXMpIHsKICAgIGludCBpbmRleCA9IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcy5pbmRleE9mKG5vZGUucGFyYW1ldGVyKTsKICAgIGlmIChpbmRleCAhPSAtMSkgewogICAgICBfc2luay53cml0ZUVudW0oRGFydFR5cGVOb2RlS2luZC5mdW5jdGlvblR5cGVWYXJpYWJsZSk7CiAgICAgIF9zaW5rLndyaXRlSW50KGluZGV4KTsKICAgICAgX3NpbmsuX3dyaXRlRGFydFR5cGVOb2RlKG5vZGUucHJvbW90ZWRCb3VuZCwgZnVuY3Rpb25UeXBlVmFyaWFibGVzLAogICAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIF9zaW5rLndyaXRlRW51bShEYXJ0VHlwZU5vZGVLaW5kLnR5cGVQYXJhbWV0ZXJUeXBlKTsKICAgICAgX3Npbmsud3JpdGVUeXBlUGFyYW1ldGVyTm9kZShub2RlLnBhcmFtZXRlcik7CiAgICAgIF9zaW5rLl93cml0ZURhcnRUeXBlTm9kZShub2RlLnByb21vdGVkQm91bmQsIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcywKICAgICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZWRlZlR5cGUoCiAgICAgIGlyLlR5cGVkZWZUeXBlIG5vZGUsIExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4gZnVuY3Rpb25UeXBlVmFyaWFibGVzKSB7CiAgICBfc2luay53cml0ZUVudW0oRGFydFR5cGVOb2RlS2luZC50eXBlZGVmKTsKICAgIF9zaW5rLndyaXRlVHlwZWRlZk5vZGUobm9kZS50eXBlZGVmTm9kZSk7CiAgICB2aXNpdFR5cGVzKG5vZGUudHlwZUFyZ3VtZW50cywgZnVuY3Rpb25UeXBlVmFyaWFibGVzKTsKICB9Cn0KCi8vLyBEYXRhIHNpbmsgaGVscGVyIHRoYXQgY2Fub25pY2FsaXplcyBbRV0gdmFsdWVzIHVzaW5nIGluZGljZXMuCmNsYXNzIEluZGV4ZWRTaW5rPEU+IHsKICBmaW5hbCBBYnN0cmFjdERhdGFTaW5rIF9zaW5rOwogIGZpbmFsIE1hcDxFLCBpbnQ+IF9jYWNoZSA9IHtudWxsOiAwfTsgLy8gc2xvdCAwIGlzIHByZS1hbGxvY2F0ZWQgdG8gYG51bGxgLgoKICBJbmRleGVkU2luayh0aGlzLl9zaW5rKTsKCiAgLy8vIFdyaXRlIGEgcmVmZXJlbmNlIHRvIFt2YWx1ZV0gdG8gdGhlIGRhdGEgc2luay4KICAvLy8KICAvLy8gSWYgW3ZhbHVlXSBoYXMgbm90IGJlZW4gY2Fub25pY2FsaXplZCB5ZXQsIFt3cml0ZVZhbHVlXSBpcyBjYWxsZWQgdG8KICAvLy8gc2VyaWFsaXplIHRoZSBbdmFsdWVdIGl0c2VsZi4KICB2b2lkIHdyaXRlKEUgdmFsdWUsIHZvaWQgd3JpdGVWYWx1ZShFIHZhbHVlKSkgewogICAgY29uc3QgaW50IHBlbmRpbmcgPSAtMTsKICAgIGludCBpbmRleCA9IF9jYWNoZVt2YWx1ZV07CiAgICBpZiAoaW5kZXggPT0gbnVsbCkgewogICAgICBpbmRleCA9IF9jYWNoZS5sZW5ndGg7CiAgICAgIF9zaW5rLl93cml0ZUludEludGVybmFsKGluZGV4KTsKICAgICAgX2NhY2hlW3ZhbHVlXSA9IHBlbmRpbmc7IC8vIEluY3JlbWVudHMgbGVuZ3RoIHRvIGFsbG9jYXRlIHNsb3QuCiAgICAgIHdyaXRlVmFsdWUodmFsdWUpOwogICAgICBfY2FjaGVbdmFsdWVdID0gaW5kZXg7CiAgICB9IGVsc2UgaWYgKGluZGV4ID09IHBlbmRpbmcpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigiQ3ljbGljIGRlcGVuZGVuY3kgb24gY2FjaGVkIHZhbHVlOiAkdmFsdWUiKTsKICAgIH0gZWxzZSB7CiAgICAgIF9zaW5rLl93cml0ZUludEludGVybmFsKGluZGV4KTsKICAgIH0KICB9Cn0KCi8vLyBEYXRhIHNvdXJjZSBoZWxwZXIgcmVhZHMgY2Fub25pY2FsaXplZCBbRV0gdmFsdWVzIHRocm91Z2ggaW5kaWNlcy4KY2xhc3MgSW5kZXhlZFNvdXJjZTxFPiB7CiAgZmluYWwgQWJzdHJhY3REYXRhU291cmNlIF9zb3VyY2U7CiAgZmluYWwgTGlzdDxFPiBfY2FjaGUgPSBbbnVsbF07IC8vIHNsb3QgMCBpcyBwcmUtYWxsb2NhdGVkIHRvIGBudWxsYC4KCiAgSW5kZXhlZFNvdXJjZSh0aGlzLl9zb3VyY2UpOwoKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYW4gW0VdIHZhbHVlIGZyb20gdGhlIGRhdGEgc291cmNlLgogIC8vLwogIC8vLyBJZiB0aGUgdmFsdWUgaGFzbid0IHlldCBiZWVuIHJlYWQsIFtyZWFkVmFsdWVdIGlzIGNhbGxlZCB0byBkZXNlcmlhbGl6ZQogIC8vLyB0aGUgdmFsdWUgaXRzZWxmLgogIEUgcmVhZChFIHJlYWRWYWx1ZSgpKSB7CiAgICBpbnQgaW5kZXggPSBfc291cmNlLl9yZWFkSW50SW50ZXJuYWwoKTsKICAgIGlmIChpbmRleCA+PSBfY2FjaGUubGVuZ3RoKSB7CiAgICAgIGFzc2VydChpbmRleCA9PSBfY2FjaGUubGVuZ3RoKTsKICAgICAgX2NhY2hlLmFkZChudWxsKTsgLy8gcGxhY2Vob2xkZXIuCiAgICAgIEUgdmFsdWUgPSByZWFkVmFsdWUoKTsKICAgICAgX2NhY2hlW2luZGV4XSA9IHZhbHVlOwogICAgICByZXR1cm4gdmFsdWU7CiAgICB9IGVsc2UgewogICAgICBFIHZhbHVlID0gX2NhY2hlW2luZGV4XTsKICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgaW5kZXggIT0gMCkgewogICAgICAgIHRocm93IFN0YXRlRXJyb3IoJ1VuZmlsbGVkIGluZGV4ICRpbmRleCBvZiAkRScpOwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICB9Cn0KgYgATk48AR4BSQRNGRAICgoNBw8NDw4MFQwQDgwKCgcCAVEoAUMRCg0MGRUCAUkVBwoIEBEfDAIBShkNDxYXAgFLGgcQAgFFDBYBEwEMKwEMHC0lIQQBDCYCAUYUCAwQGBARCw8MAgFQFUMgAR4BDCY/MAETUCIjOQYEAQwuOiwEAQw+OjA1KwQBDEY6NRc0SA06HQYEAQw2OjAcQygvQEMGQjxEQTopBgQBDDg6MSQ7BAEMNDorJjtBBAEMNDovBAEMNjosRAQCAUkYCAwVEBgRCw8ODxUWEwIBOQEZQCABIgETTyImPQYEAQwYSCBABAEMGUszBAEMGUszBAEMFkgwBAEMGEovOQ00BgQBDBtNJTstPA03Bio7BAEMGkw0Jhw/KTA+KUhOBkYxQjE7KUcGRhokBAEMH1E/Fz4dShwNOzRKHAYEAQwZSy8uOwQCAUIXIE4BGwE1BkskMhwfGR0mRhkdI0gNJgYEAgFHGSRHAR8BPgZOGBosIiYoHR0UDR8pOQgUBgQCAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy9zZXJpYWxpemF0aW9uL2hlbHBlcnMuZGFydDxzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zZXJpYWxpemF0aW9uL21lbWJlcl9kYXRhLmRhcnShLi8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mICdzZXJpYWxpemF0aW9uLmRhcnQnOwoKLy8vIEhlbHBlciBmb3IgbG9va2luZyB1cCBvYmplY3QgbGlicmFyeSBkYXRhIGZyb20gYW4gW2lyLkNvbXBvbmVudF0gbm9kZS4KY2xhc3MgQ29tcG9uZW50TG9va3VwIHsKICBmaW5hbCBpci5Db21wb25lbnQgX2NvbXBvbmVudDsKCiAgLy8vIENhY2hlIG9mIFtfTGlicmFyeURhdGFdIGZvciBsaWJyYXJpZXMgaW4gW19jb21wb25lbnRdLgogIE1hcDxVcmksIF9MaWJyYXJ5RGF0YT4gX2xpYnJhcnlNYXA7CgogIENvbXBvbmVudExvb2t1cCh0aGlzLl9jb21wb25lbnQpOwoKICAvLy8gUmV0dXJucyB0aGUgW19MaWJyYXJ5RGF0YV0gb2JqZWN0IGZvciB0aGUgbGlicmFyeSB3aXRoIHRoZSBbY2Fub25pY2FsVXJpXS4KICBfTGlicmFyeURhdGEgZ2V0TGlicmFyeURhdGFCeVVyaShVcmkgY2Fub25pY2FsVXJpKSB7CiAgICBpZiAoX2xpYnJhcnlNYXAgPT0gbnVsbCkgewogICAgICBfbGlicmFyeU1hcCA9IHt9OwogICAgICBmb3IgKGlyLkxpYnJhcnkgbGlicmFyeSBpbiBfY29tcG9uZW50LmxpYnJhcmllcykgewogICAgICAgIF9saWJyYXJ5TWFwW2xpYnJhcnkuaW1wb3J0VXJpXSA9IG5ldyBfTGlicmFyeURhdGEobGlicmFyeSk7CiAgICAgIH0KICAgIH0KICAgIF9MaWJyYXJ5RGF0YSBkYXRhID0gX2xpYnJhcnlNYXBbY2Fub25pY2FsVXJpXTsKICAgIGFzc2VydChkYXRhICE9IG51bGwsICJObyBsaWJyYXJ5IGZvdW5kIGZvciAkY2Fub25pY2FsVXJpLiIpOwogICAgcmV0dXJuIGRhdGE7CiAgfQp9CgovLy8gUmV0dXJucyBhIG5hbWUgdW5pcXVlbHkgaWRlbnRpZnlpbmcgYSBtZW1iZXIgd2l0aGluIGl0cyBlbmNsb3NpbmcgbGlicmFyeQovLy8gb3IgY2xhc3MuClN0cmluZyBfY29tcHV0ZU1lbWJlck5hbWUoaXIuTWVtYmVyIG1lbWJlcikgewogIGlmIChtZW1iZXIubmFtZS5pc1ByaXZhdGUgJiYKICAgICAgbWVtYmVyLm5hbWUubGlicmFyeU5hbWUgIT0gbWVtYmVyLmVuY2xvc2luZ0xpYnJhcnkucmVmZXJlbmNlKSB7CiAgICAvLyBUT0RPKDMzNzMyKTogSGFuZGxlIG5vU3VjaE1ldGhvZCBmb3J3YXJkZXJzIGZvciBwcml2YXRlIG1lbWJlcnMgZnJvbQogICAgLy8gb3RoZXIgbGlicmFyaWVzLgogICAgcmV0dXJuIG51bGw7CiAgfQogIFN0cmluZyBuYW1lID0gbWVtYmVyLm5hbWUubmFtZTsKICBpZiAobWVtYmVyIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICBuYW1lID0gJy4kbmFtZSc7CiAgfSBlbHNlIGlmIChtZW1iZXIgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICBpZiAobWVtYmVyLmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5GYWN0b3J5KSB7CiAgICAgIG5hbWUgPSAnLiRuYW1lJzsKICAgIH0gZWxzZSBpZiAobWVtYmVyLmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5TZXR0ZXIpIHsKICAgICAgbmFtZSArPSAiPSI7CiAgICB9CiAgfQogIHJldHVybiBuYW1lOwp9CgovLy8gSGVscGVyIGZvciBsb29raW5nIHVwIGNsYXNzZXMgYW5kIG1lbWJlcnMgZnJvbSBhbiBbaXIuTGlicmFyeV0gbm9kZS4KY2xhc3MgX0xpYnJhcnlEYXRhIHsKICAvLy8gVGhlIFtpci5MaWJyYXJ5XSB0aGF0IGRlZmluZXMgdGhlIGxpYnJhcnkuCiAgZmluYWwgaXIuTGlicmFyeSBub2RlOwoKICAvLy8gQ2FjaGUgb2YgW19DbGFzc0RhdGFdIGZvciBjbGFzc2VzIGluIHRoaXMgbGlicmFyeS4KICBNYXA8U3RyaW5nLCBfQ2xhc3NEYXRhPiBfY2xhc3Nlc0J5TmFtZTsKICBNYXA8aXIuQ2xhc3MsIF9DbGFzc0RhdGE+IF9jbGFzc2VzQnlOb2RlOwoKICAvLy8gQ2FjaGUgb2YgW2lyLlR5cGVkZWZdIG5vZGVzIGZvciB0eXBlZGVmcyBpbiB0aGlzIGxpYnJhcnkuCiAgTWFwPFN0cmluZywgaXIuVHlwZWRlZj4gX3R5cGVkZWZzOwoKICAvLy8gQ2FjaGUgb2YgW19NZW1iZXJEYXRhXSBmb3IgbWVtYmVycyBpbiB0aGlzIGxpYnJhcnkuCiAgTWFwPFN0cmluZywgX01lbWJlckRhdGE+IF9tZW1iZXJzQnlOYW1lOwogIE1hcDxpci5NZW1iZXIsIF9NZW1iZXJEYXRhPiBfbWVtYmVyc0J5Tm9kZTsKCiAgX0xpYnJhcnlEYXRhKHRoaXMubm9kZSk7CgogIHZvaWQgX2Vuc3VyZUNsYXNzZXMoKSB7CiAgICBpZiAoX2NsYXNzZXNCeU5hbWUgPT0gbnVsbCkgewogICAgICBfY2xhc3Nlc0J5TmFtZSA9IHt9OwogICAgICBfY2xhc3Nlc0J5Tm9kZSA9IHt9OwogICAgICBmb3IgKGlyLkNsYXNzIGNscyBpbiBub2RlLmNsYXNzZXMpIHsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgICFfY2xhc3Nlc0J5TmFtZS5jb250YWluc0tleShjbHMubmFtZSksCiAgICAgICAgICAgICJEdXBsaWNhdGUgY2xhc3MgJyR7Y2xzLm5hbWV9JyBpbiAkX2NsYXNzZXNCeU5hbWUgIgogICAgICAgICAgICAidHJ5aW5nIHRvIGFkZCAkY2xzLiIpOwogICAgICAgIGFzc2VydCgKICAgICAgICAgICAgIV9jbGFzc2VzQnlOb2RlLmNvbnRhaW5zS2V5KGNscyksCiAgICAgICAgICAgICJEdXBsaWNhdGUgY2xhc3MgJyR7Y2xzLm5hbWV9JyBpbiAkX2NsYXNzZXNCeU5vZGUgIgogICAgICAgICAgICAidHJ5aW5nIHRvIGFkZCAkY2xzLiIpOwogICAgICAgIF9jbGFzc2VzQnlOb2RlW2Nsc10gPSBfY2xhc3Nlc0J5TmFtZVtjbHMubmFtZV0gPSBuZXcgX0NsYXNzRGF0YShjbHMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgW19DbGFzc0RhdGFdIGZvciB0aGUgY2xhc3MgW25hbWVdIGluIHRoaXMgbGlicmFyeS4KICBfQ2xhc3NEYXRhIGxvb2t1cENsYXNzQnlOYW1lKFN0cmluZyBuYW1lKSB7CiAgICBfZW5zdXJlQ2xhc3NlcygpOwogICAgcmV0dXJuIF9jbGFzc2VzQnlOYW1lW25hbWVdOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIFtfQ2xhc3NEYXRhXSBmb3IgdGhlIGNsYXNzIFtub2RlXSBpbiB0aGlzIGxpYnJhcnkuCiAgX0NsYXNzRGF0YSBsb29rdXBDbGFzc0J5Tm9kZShpci5DbGFzcyBub2RlKSB7CiAgICBfZW5zdXJlQ2xhc3NlcygpOwogICAgcmV0dXJuIF9jbGFzc2VzQnlOb2RlW25vZGVdOwogIH0KCiAgaXIuVHlwZWRlZiBsb29rdXBUeXBlZGVmKFN0cmluZyBuYW1lKSB7CiAgICBpZiAoX3R5cGVkZWZzID09IG51bGwpIHsKICAgICAgX3R5cGVkZWZzID0ge307CiAgICAgIGZvciAoaXIuVHlwZWRlZiB0eXBlZGVmIGluIG5vZGUudHlwZWRlZnMpIHsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgICFfdHlwZWRlZnMuY29udGFpbnNLZXkodHlwZWRlZi5uYW1lKSwKICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlZGVmICcke3R5cGVkZWYubmFtZX0nIGluICRfdHlwZWRlZnMgIgogICAgICAgICAgICAidHJ5aW5nIHRvIGFkZCAkdHlwZWRlZi4iKTsKICAgICAgICBfdHlwZWRlZnNbdHlwZWRlZi5uYW1lXSA9IHR5cGVkZWY7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfdHlwZWRlZnNbbmFtZV07CiAgfQoKICB2b2lkIF9lbnN1cmVNZW1iZXJzKCkgewogICAgaWYgKF9tZW1iZXJzQnlOYW1lID09IG51bGwpIHsKICAgICAgX21lbWJlcnNCeU5hbWUgPSB7fTsKICAgICAgX21lbWJlcnNCeU5vZGUgPSB7fTsKICAgICAgZm9yIChpci5NZW1iZXIgbWVtYmVyIGluIG5vZGUubWVtYmVycykgewogICAgICAgIFN0cmluZyBuYW1lID0gX2NvbXB1dGVNZW1iZXJOYW1lKG1lbWJlcik7CiAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgY29udGludWU7CiAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICAhX21lbWJlcnNCeU5hbWUuY29udGFpbnNLZXkobmFtZSksCiAgICAgICAgICAgICJEdXBsaWNhdGUgbWVtYmVyICckbmFtZScgaW4gJF9tZW1iZXJzQnlOYW1lICIKICAgICAgICAgICAgInRyeWluZyB0byBhZGQgJG1lbWJlci4iKTsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgICFfbWVtYmVyc0J5Tm9kZS5jb250YWluc0tleShtZW1iZXIpLAogICAgICAgICAgICAiRHVwbGljYXRlIG1lbWJlciAnJG5hbWUnIGluICRfbWVtYmVyc0J5Tm9kZSAiCiAgICAgICAgICAgICJ0cnlpbmcgdG8gYWRkICRtZW1iZXIuIik7CiAgICAgICAgX21lbWJlcnNCeU5vZGVbbWVtYmVyXSA9IF9tZW1iZXJzQnlOYW1lW25hbWVdID0gbmV3IF9NZW1iZXJEYXRhKG1lbWJlcik7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbX01lbWJlckRhdGFdIGZvciB0aGUgbWVtYmVyIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgW25hbWVdIGluCiAgLy8vIHRoaXMgbGlicmFyeS4KICBfTWVtYmVyRGF0YSBsb29rdXBNZW1iZXJEYXRhQnlOYW1lKFN0cmluZyBuYW1lKSB7CiAgICBfZW5zdXJlTWVtYmVycygpOwogICAgcmV0dXJuIF9tZW1iZXJzQnlOYW1lW25hbWVdOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIFtfTWVtYmVyRGF0YV0gZm9yIHRoZSBtZW1iZXIgW25vZGVdIGluIHRoaXMgbGlicmFyeS4KICBfTWVtYmVyRGF0YSBsb29rdXBNZW1iZXJEYXRhQnlOb2RlKGlyLk1lbWJlciBub2RlKSB7CiAgICBfZW5zdXJlTWVtYmVycygpOwogICAgcmV0dXJuIF9tZW1iZXJzQnlOb2RlW25vZGVdOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ19MaWJyYXJ5RGF0YSgkbm9kZSgke2lkZW50aXR5SGFzaENvZGUobm9kZSl9KSknOwp9CgovLy8gSGVscGVyIGZvciBsb29raW5nIHVwIG1lbWJlcnMgZnJvbSBhbiBbaXIuQ2xhc3NdIG5vZGUuCmNsYXNzIF9DbGFzc0RhdGEgewogIC8vLyBUaGUgW2lyLkNsYXNzXSB0aGF0IGRlZmluZXMgdGhlIGNsYXNzLgogIGZpbmFsIGlyLkNsYXNzIG5vZGU7CgogIC8vLyBDYWNoZSBvZiBbX01lbWJlckRhdGFdIGZvciBtZW1iZXJzIGluIHRoaXMgY2xhc3MuCiAgTWFwPFN0cmluZywgX01lbWJlckRhdGE+IF9tZW1iZXJzQnlOYW1lOwogIE1hcDxpci5NZW1iZXIsIF9NZW1iZXJEYXRhPiBfbWVtYmVyc0J5Tm9kZTsKCiAgX0NsYXNzRGF0YSh0aGlzLm5vZGUpOwoKICB2b2lkIF9lbnN1cmVNZW1iZXJzKCkgewogICAgaWYgKF9tZW1iZXJzQnlOYW1lID09IG51bGwpIHsKICAgICAgX21lbWJlcnNCeU5hbWUgPSB7fTsKICAgICAgX21lbWJlcnNCeU5vZGUgPSB7fTsKICAgICAgZm9yIChpci5NZW1iZXIgbWVtYmVyIGluIG5vZGUubWVtYmVycykgewogICAgICAgIFN0cmluZyBuYW1lID0gX2NvbXB1dGVNZW1iZXJOYW1lKG1lbWJlcik7CiAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgY29udGludWU7CiAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICAhX21lbWJlcnNCeU5hbWUuY29udGFpbnNLZXkobmFtZSksCiAgICAgICAgICAgICJEdXBsaWNhdGUgbWVtYmVyICckbmFtZScgaW4gJF9tZW1iZXJzQnlOYW1lICIKICAgICAgICAgICAgInRyeWluZyB0byBhZGQgJG1lbWJlci4iKTsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgICFfbWVtYmVyc0J5Tm9kZS5jb250YWluc0tleShtZW1iZXIpLAogICAgICAgICAgICAiRHVwbGljYXRlIG1lbWJlciAnJG5hbWUnIGluICRfbWVtYmVyc0J5Tm9kZSAiCiAgICAgICAgICAgICJ0cnlpbmcgdG8gYWRkICRtZW1iZXIuIik7CiAgICAgICAgX21lbWJlcnNCeU5vZGVbbWVtYmVyXSA9IF9tZW1iZXJzQnlOYW1lW25hbWVdID0gbmV3IF9NZW1iZXJEYXRhKG1lbWJlcik7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbX01lbWJlckRhdGFdIGZvciB0aGUgbWVtYmVyIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgW25hbWVdIGluCiAgLy8vIHRoaXMgY2xhc3MuCiAgX01lbWJlckRhdGEgbG9va3VwTWVtYmVyRGF0YUJ5TmFtZShTdHJpbmcgbmFtZSkgewogICAgX2Vuc3VyZU1lbWJlcnMoKTsKICAgIHJldHVybiBfbWVtYmVyc0J5TmFtZVtuYW1lXTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbX01lbWJlckRhdGFdIGZvciB0aGUgbWVtYmVyIFtub2RlXSBpbiB0aGlzIGNsYXNzLgogIF9NZW1iZXJEYXRhIGxvb2t1cE1lbWJlckRhdGFCeU5vZGUoaXIuTWVtYmVyIG5vZGUpIHsKICAgIF9lbnN1cmVNZW1iZXJzKCk7CiAgICByZXR1cm4gX21lbWJlcnNCeU5vZGVbbm9kZV07CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnX0NsYXNzRGF0YSgkbm9kZSgke2lkZW50aXR5SGFzaENvZGUobm9kZSl9KSknOwp9CgovLy8gSGVscGVyIGZvciBsb29raW5nIHVwIGNoaWxkIFtpci5UcmVlTm9kZV1zIG9mIGEgW2lyLk1lbWJlcl0gbm9kZS4KY2xhc3MgX01lbWJlckRhdGEgewogIC8vLyBUaGUgW2lyLk1lbWJlcl0gdGhhdCBkZWZpbmVzIHRoZSBtZW1iZXIuCiAgZmluYWwgaXIuTWVtYmVyIG5vZGU7CgogIC8vLyBDYWNoZWQgaW5kZXggdG8gW2lyLlRyZWVOb2RlXSBtYXAgdXNlZCBmb3IgZGVzZXJpYWxpemF0aW9uIG9mCiAgLy8vIFtpci5UcmVlTm9kZV1zLgogIE1hcDxpbnQsIGlyLlRyZWVOb2RlPiBfaW5kZXhUb05vZGVNYXA7CgogIC8vLyBDYWNoZWQgW2lyLlRyZWVOb2RlXSB0byBpbmRleCBtYXAgdXNlZCBmb3Igc2VyaWFsaXphdGlvbiBvZgogIC8vLyBbaXIuVHJlZU5vZGVdcy4KICBNYXA8aXIuVHJlZU5vZGUsIGludD4gX25vZGVUb0luZGV4TWFwOwoKICAvLy8gQ2FjaGVkIFtpci5Db25zdGFudEV4cHJlc3Npb25dIHRvIFtfQ29uc3RhbnROb2RlSW5kZXhlclZpc2l0b3JdIG1hcCB1c2VkCiAgLy8vIGZvciBmYXN0IHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIG9mIGNvbnN0YW50IHJlZmVyZW5jZXMuCiAgTWFwPGlyLkNvbnN0YW50RXhwcmVzc2lvbiwgX0NvbnN0YW50Tm9kZUluZGV4ZXJWaXNpdG9yPiBfY29uc3RhbnRJbmRleE1hcDsKCiAgX01lbWJlckRhdGEodGhpcy5ub2RlKTsKCiAgdm9pZCBfZW5zdXJlTWFwcygpIHsKICAgIGlmIChfaW5kZXhUb05vZGVNYXAgPT0gbnVsbCkgewogICAgICBfaW5kZXhUb05vZGVNYXAgPSB7fTsKICAgICAgX25vZGVUb0luZGV4TWFwID0ge307CiAgICAgIG5vZGUuYWNjZXB0KAogICAgICAgICAgbmV3IF9UcmVlTm9kZUluZGV4ZXJWaXNpdG9yKF9pbmRleFRvTm9kZU1hcCwgX25vZGVUb0luZGV4TWFwKSk7CiAgICB9CiAgfQoKICBfQ29uc3RhbnROb2RlSW5kZXhlclZpc2l0b3IgX2NyZWF0ZUNvbnN0YW50SW5kZXhlcigKICAgICAgaXIuQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIF9Db25zdGFudE5vZGVJbmRleGVyVmlzaXRvciBpbmRleGVyID0gbmV3IF9Db25zdGFudE5vZGVJbmRleGVyVmlzaXRvcigpOwogICAgbm9kZS5jb25zdGFudC5hY2NlcHQoaW5kZXhlcik7CiAgICByZXR1cm4gaW5kZXhlcjsKICB9CgogIGlyLkNvbnN0YW50IGdldENvbnN0YW50QnlJbmRleChpci5Db25zdGFudEV4cHJlc3Npb24gbm9kZSwgaW50IGluZGV4KSB7CiAgICBfY29uc3RhbnRJbmRleE1hcCA/Pz0ge307CiAgICBfQ29uc3RhbnROb2RlSW5kZXhlclZpc2l0b3IgaW5kZXhlciA9CiAgICAgICAgX2NvbnN0YW50SW5kZXhNYXBbbm9kZV0gPz89IF9jcmVhdGVDb25zdGFudEluZGV4ZXIobm9kZSk7CiAgICByZXR1cm4gaW5kZXhlci5nZXRDb25zdGFudChpbmRleCk7CiAgfQoKICBpbnQgZ2V0SW5kZXhCeUNvbnN0YW50KGlyLkNvbnN0YW50RXhwcmVzc2lvbiBub2RlLCBpci5Db25zdGFudCBjb25zdGFudCkgewogICAgX2NvbnN0YW50SW5kZXhNYXAgPz89IHt9OwogICAgX0NvbnN0YW50Tm9kZUluZGV4ZXJWaXNpdG9yIGluZGV4ZXIgPQogICAgICAgIF9jb25zdGFudEluZGV4TWFwW25vZGVdID8/PSBfY3JlYXRlQ29uc3RhbnRJbmRleGVyKG5vZGUpOwogICAgcmV0dXJuIGluZGV4ZXIuZ2V0SW5kZXgoY29uc3RhbnQpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIFtpci5UcmVlTm9kZV0gY29ycmVzcG9uZGluZyB0byBbaW5kZXhdIGluIHRoaXMgbWVtYmVyLgogIGlyLlRyZWVOb2RlIGdldFRyZWVOb2RlQnlJbmRleChpbnQgaW5kZXgpIHsKICAgIF9lbnN1cmVNYXBzKCk7CiAgICBpci5UcmVlTm9kZSB0cmVlTm9kZSA9IF9pbmRleFRvTm9kZU1hcFtpbmRleF07CiAgICBhc3NlcnQodHJlZU5vZGUgIT0gbnVsbCwgIk5vIFRyZWVOb2RlIGZvdW5kIGZvciBpbmRleCAkaW5kZXggaW4gJG5vZGUuIik7CiAgICByZXR1cm4gdHJlZU5vZGU7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgaW5kZXggY29ycmVzcG9uZGluZyB0byBbaXIuVHJlZU5vZGVdIGluIHRoaXMgbWVtYmVyLgogIGludCBnZXRJbmRleEJ5VHJlZU5vZGUoaXIuVHJlZU5vZGUgbm9kZSkgewogICAgX2Vuc3VyZU1hcHMoKTsKICAgIGludCBpbmRleCA9IF9ub2RlVG9JbmRleE1hcFtub2RlXTsKICAgIGFzc2VydChpbmRleCAhPSBudWxsLCAiTm8gaW5kZXggZm91bmQgZm9yICR7bm9kZS5ydW50aW1lVHlwZX0uIik7CiAgICByZXR1cm4gaW5kZXg7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnX01lbWJlckRhdGEoJG5vZGUoJHtpZGVudGl0eUhhc2hDb2RlKG5vZGUpfSkpJzsKfQqBDABOTjwBHgFLGCEBPSYBJAFRNx8YOUQIBjNBEQQCAU4OLh9GTBgRBCIiFSczFzkTBgQPAgFJFTEZATkqLAFAJQE6Ky4BGwEaIhsbKxAzQCQQLkAkTggGBAFFLhYhBAFFMBYhBAEqHRYyEDJBKCsIBhwEARoiGxsvMiQQLzsnEDE7J1EIBgQBUBQ0FiEEAUc3FiEEAQxJAgE7Ey0XATgrLgEZARoiGxsvMiQQLzsnEDE7J1EIBgQBUBI0FiEEAUU3FiEEAQxHAgFGFC8YAUQWKQFCFikBT0VNARoBFyMcHBNKBgQBNiRNIxQEAUoeKkInBAFNHipCJwQBSS4TM04VBAFHLRMnRhIEAQxIAgEzcGFja2FnZTpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi9tZW1iZXJfZGF0YS5kYXJ0N3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NlcmlhbGl6YXRpb24vbWl4aW5zLmRhcnTAAEd3Ly8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgJ3NlcmlhbGl6YXRpb24uZGFydCc7CgovLy8gTWl4aW4gdGhhdCBpbXBsZW1lbnRzIGFsbCBjb252ZW5pZW5jZSBtZXRob2RzIG9mIFtEYXRhU291cmNlXS4KYWJzdHJhY3QgY2xhc3MgRGF0YVNvdXJjZU1peGluIGltcGxlbWVudHMgRGF0YVNvdXJjZSB7CiAgQG92ZXJyaWRlCiAgRSByZWFkVmFsdWVPck51bGw8RT4oRSBmKCkpIHsKICAgIGJvb2wgaGFzVmFsdWUgPSByZWFkQm9vbCgpOwogICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgIHJldHVybiBmKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8RT4gcmVhZExpc3Q8RT4oRSBmKCksIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pIHsKICAgIGludCBjb3VudCA9IHJlYWRJbnQoKTsKICAgIGlmIChjb3VudCA9PSAwICYmIGVtcHR5QXNOdWxsKSByZXR1cm4gbnVsbDsKICAgIExpc3Q8RT4gbGlzdCA9IG5ldyBMaXN0PEU+KGNvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBsaXN0W2ldID0gZigpOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgcmVhZEludE9yTnVsbCgpIHsKICAgIGJvb2wgaGFzVmFsdWUgPSByZWFkQm9vbCgpOwogICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgIHJldHVybiByZWFkSW50KCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyByZWFkU3RyaW5nT3JOdWxsKCkgewogICAgYm9vbCBoYXNWYWx1ZSA9IHJlYWRCb29sKCk7CiAgICBpZiAoaGFzVmFsdWUpIHsKICAgICAgcmV0dXJuIHJlYWRTdHJpbmcoKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxTdHJpbmc+IHJlYWRTdHJpbmdzKHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pIHsKICAgIGludCBjb3VudCA9IHJlYWRJbnQoKTsKICAgIGlmIChjb3VudCA9PSAwICYmIGVtcHR5QXNOdWxsKSByZXR1cm4gbnVsbDsKICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IExpc3Q8U3RyaW5nPihjb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgbGlzdFtpXSA9IHJlYWRTdHJpbmcoKTsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxEYXJ0VHlwZT4gcmVhZERhcnRUeXBlcyh7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PERhcnRUeXBlPiBsaXN0ID0gbmV3IExpc3Q8RGFydFR5cGU+KGNvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBsaXN0W2ldID0gcmVhZERhcnRUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gbGlzdDsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4gcmVhZFR5cGVQYXJhbWV0ZXJOb2Rlcyh7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PGlyLlR5cGVQYXJhbWV0ZXI+IGxpc3QgPSBuZXcgTGlzdDxpci5UeXBlUGFyYW1ldGVyPihjb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgbGlzdFtpXSA9IHJlYWRUeXBlUGFyYW1ldGVyTm9kZSgpOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PEU+IHJlYWRNZW1iZXJzPEUgZXh0ZW5kcyBNZW1iZXJFbnRpdHk+KHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pIHsKICAgIGludCBjb3VudCA9IHJlYWRJbnQoKTsKICAgIGlmIChjb3VudCA9PSAwICYmIGVtcHR5QXNOdWxsKSByZXR1cm4gbnVsbDsKICAgIExpc3Q8RT4gbGlzdCA9IG5ldyBMaXN0PEU+KGNvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gcmVhZE1lbWJlcigpOwogICAgICBsaXN0W2ldID0gbWVtYmVyOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PEU+IHJlYWRNZW1iZXJOb2RlczxFIGV4dGVuZHMgaXIuTWVtYmVyPih7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PEU+IGxpc3QgPSBuZXcgTGlzdDxFPihjb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgaXIuTWVtYmVyIHZhbHVlID0gcmVhZE1lbWJlck5vZGUoKTsKICAgICAgbGlzdFtpXSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PEU+IHJlYWRDbGFzc2VzPEUgZXh0ZW5kcyBDbGFzc0VudGl0eT4oe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTGlzdDxFPiBsaXN0ID0gbmV3IExpc3Q8RT4oY291bnQpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIENsYXNzRW50aXR5IGNscyA9IHJlYWRDbGFzcygpOwogICAgICBsaXN0W2ldID0gY2xzOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8SywgVj4gcmVhZExpYnJhcnlNYXA8SyBleHRlbmRzIExpYnJhcnlFbnRpdHksIFY+KFYgZigpLAogICAgICB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBNYXA8SywgVj4gbWFwID0ge307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5ID0gcmVhZExpYnJhcnkoKTsKICAgICAgViB2YWx1ZSA9IGYoKTsKICAgICAgbWFwW2xpYnJhcnldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPEssIFY+IHJlYWRDbGFzc01hcDxLIGV4dGVuZHMgQ2xhc3NFbnRpdHksIFY+KFYgZigpLAogICAgICB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBNYXA8SywgVj4gbWFwID0ge307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gcmVhZENsYXNzKCk7CiAgICAgIFYgdmFsdWUgPSBmKCk7CiAgICAgIG1hcFtjbHNdID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPEssIFY+IHJlYWRNZW1iZXJNYXA8SyBleHRlbmRzIE1lbWJlckVudGl0eSwgVj4oViBmKE1lbWJlckVudGl0eSBtZW1iZXIpLAogICAgICB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBNYXA8SywgVj4gbWFwID0ge307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IHJlYWRNZW1iZXIoKTsKICAgICAgViB2YWx1ZSA9IGYobWVtYmVyKTsKICAgICAgbWFwW21lbWJlcl0gPSB2YWx1ZTsKICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8SywgVj4gcmVhZE1lbWJlck5vZGVNYXA8SyBleHRlbmRzIGlyLk1lbWJlciwgVj4oViBmKCksCiAgICAgIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pIHsKICAgIGludCBjb3VudCA9IHJlYWRJbnQoKTsKICAgIGlmIChjb3VudCA9PSAwICYmIGVtcHR5QXNOdWxsKSByZXR1cm4gbnVsbDsKICAgIE1hcDxLLCBWPiBtYXAgPSB7fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBpci5NZW1iZXIgbm9kZSA9IHJlYWRNZW1iZXJOb2RlKCk7CiAgICAgIFYgdmFsdWUgPSBmKCk7CiAgICAgIG1hcFtub2RlXSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CgogIEBvdmVycmlkZQogIE1hcDxLLCBWPiByZWFkVHJlZU5vZGVNYXA8SyBleHRlbmRzIGlyLlRyZWVOb2RlLCBWPihWIGYoKSwKICAgICAge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTWFwPEssIFY+IG1hcCA9IHt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGlyLlRyZWVOb2RlIG5vZGUgPSByZWFkVHJlZU5vZGUoKTsKICAgICAgViB2YWx1ZSA9IGYoKTsKICAgICAgbWFwW25vZGVdID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxFPiByZWFkTG9jYWxzPEUgZXh0ZW5kcyBMb2NhbD4oe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTGlzdDxFPiBsaXN0ID0gbmV3IExpc3Q8RT4oY291bnQpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIExvY2FsIGxvY2FsID0gcmVhZExvY2FsKCk7CiAgICAgIGxpc3RbaV0gPSBsb2NhbDsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPEssIFY+IHJlYWRMb2NhbE1hcDxLIGV4dGVuZHMgTG9jYWwsIFY+KFYgZigpLCB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBNYXA8SywgVj4gbWFwID0ge307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgTG9jYWwgbG9jYWwgPSByZWFkTG9jYWwoKTsKICAgICAgViB2YWx1ZSA9IGYoKTsKICAgICAgbWFwW2xvY2FsXSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8RT4gcmVhZFRyZWVOb2RlczxFIGV4dGVuZHMgaXIuVHJlZU5vZGU+KHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pIHsKICAgIGludCBjb3VudCA9IHJlYWRJbnQoKTsKICAgIGlmIChjb3VudCA9PSAwICYmIGVtcHR5QXNOdWxsKSByZXR1cm4gbnVsbDsKICAgIExpc3Q8RT4gbGlzdCA9IG5ldyBMaXN0PEU+KGNvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBpci5UcmVlTm9kZSBub2RlID0gcmVhZFRyZWVOb2RlKCk7CiAgICAgIGxpc3RbaV0gPSBub2RlOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8U3RyaW5nLCBWPiByZWFkU3RyaW5nTWFwPFY+KFYgZigpLCB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBNYXA8U3RyaW5nLCBWPiBtYXAgPSB7fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBTdHJpbmcga2V5ID0gcmVhZFN0cmluZygpOwogICAgICBWIHZhbHVlID0gZigpOwogICAgICBtYXBba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CgogIEBvdmVycmlkZQogIEluZGV4ZWRDbGFzcyByZWFkQ2xhc3NPck51bGwoKSB7CiAgICBib29sIGhhc0NsYXNzID0gcmVhZEJvb2woKTsKICAgIGlmIChoYXNDbGFzcykgewogICAgICByZXR1cm4gcmVhZENsYXNzKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIGlyLlRyZWVOb2RlIHJlYWRUcmVlTm9kZU9yTnVsbCgpIHsKICAgIGJvb2wgaGFzVmFsdWUgPSByZWFkQm9vbCgpOwogICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgIHJldHVybiByZWFkVHJlZU5vZGUoKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5kZXhlZE1lbWJlciByZWFkTWVtYmVyT3JOdWxsKCkgewogICAgYm9vbCBoYXNWYWx1ZSA9IHJlYWRCb29sKCk7CiAgICBpZiAoaGFzVmFsdWUpIHsKICAgICAgcmV0dXJuIHJlYWRNZW1iZXIoKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgTG9jYWwgcmVhZExvY2FsT3JOdWxsKCkgewogICAgYm9vbCBoYXNWYWx1ZSA9IHJlYWRCb29sKCk7CiAgICBpZiAoaGFzVmFsdWUpIHsKICAgICAgcmV0dXJuIHJlYWRMb2NhbCgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHJlYWRDb25zdGFudE9yTnVsbCgpIHsKICAgIGJvb2wgaGFzQ2xhc3MgPSByZWFkQm9vbCgpOwogICAgaWYgKGhhc0NsYXNzKSB7CiAgICAgIHJldHVybiByZWFkQ29uc3RhbnQoKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxFPiByZWFkQ29uc3RhbnRzPEUgZXh0ZW5kcyBDb25zdGFudFZhbHVlPih7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PEU+IGxpc3QgPSBuZXcgTGlzdDxFPihjb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IHJlYWRDb25zdGFudCgpOwogICAgICBsaXN0W2ldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gbGlzdDsKICB9CgogIEBvdmVycmlkZQogIE1hcDxLLCBWPiByZWFkQ29uc3RhbnRNYXA8SyBleHRlbmRzIENvbnN0YW50VmFsdWUsIFY+KFYgZigpLAogICAgICB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBNYXA8SywgVj4gbWFwID0ge307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgQ29uc3RhbnRWYWx1ZSBrZXkgPSByZWFkQ29uc3RhbnQoKTsKICAgICAgViB2YWx1ZSA9IGYoKTsKICAgICAgbWFwW2tleV0gPSB2YWx1ZTsKICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQoKICBAb3ZlcnJpZGUKICBJbmRleGVkTGlicmFyeSByZWFkTGlicmFyeU9yTnVsbCgpIHsKICAgIGJvb2wgaGFzVmFsdWUgPSByZWFkQm9vbCgpOwogICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgIHJldHVybiByZWFkTGlicmFyeSgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBJbXBvcnRFbnRpdHkgcmVhZEltcG9ydE9yTnVsbCgpIHsKICAgIGJvb2wgaGFzQ2xhc3MgPSByZWFkQm9vbCgpOwogICAgaWYgKGhhc0NsYXNzKSB7CiAgICAgIHJldHVybiByZWFkSW1wb3J0KCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8SW1wb3J0RW50aXR5PiByZWFkSW1wb3J0cyh7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PEltcG9ydEVudGl0eT4gbGlzdCA9IG5ldyBMaXN0PEltcG9ydEVudGl0eT4oY291bnQpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGxpc3RbaV0gPSByZWFkSW1wb3J0KCk7CiAgICB9CiAgICByZXR1cm4gbGlzdDsKICB9CgogIEBvdmVycmlkZQogIE1hcDxJbXBvcnRFbnRpdHksIFY+IHJlYWRJbXBvcnRNYXA8Vj4oViBmKCksIHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pIHsKICAgIGludCBjb3VudCA9IHJlYWRJbnQoKTsKICAgIGlmIChjb3VudCA9PSAwICYmIGVtcHR5QXNOdWxsKSByZXR1cm4gbnVsbDsKICAgIE1hcDxJbXBvcnRFbnRpdHksIFY+IG1hcCA9IHt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIEltcG9ydEVudGl0eSBrZXkgPSByZWFkSW1wb3J0KCk7CiAgICAgIFYgdmFsdWUgPSBmKCk7CiAgICAgIG1hcFtrZXldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxpci5EYXJ0VHlwZT4gcmVhZERhcnRUeXBlTm9kZXMoe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTGlzdDxpci5EYXJ0VHlwZT4gbGlzdCA9IG5ldyBMaXN0PGlyLkRhcnRUeXBlPihjb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgbGlzdFtpXSA9IHJlYWREYXJ0VHlwZU5vZGUoKTsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuTmFtZSByZWFkTmFtZSgpIHsKICAgIFN0cmluZyB0ZXh0ID0gcmVhZFN0cmluZygpOwogICAgaXIuTGlicmFyeSBsaWJyYXJ5ID0gcmVhZFZhbHVlT3JOdWxsKHJlYWRMaWJyYXJ5Tm9kZSk7CiAgICByZXR1cm4gbmV3IGlyLk5hbWUodGV4dCwgbGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5MaWJyYXJ5RGVwZW5kZW5jeSByZWFkTGlicmFyeURlcGVuZGVuY3lOb2RlKCkgewogICAgaXIuTGlicmFyeSBsaWJyYXJ5ID0gcmVhZExpYnJhcnlOb2RlKCk7CiAgICBpbnQgaW5kZXggPSByZWFkSW50KCk7CiAgICByZXR1cm4gbGlicmFyeS5kZXBlbmRlbmNpZXNbaW5kZXhdOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuTGlicmFyeURlcGVuZGVuY3kgcmVhZExpYnJhcnlEZXBlbmRlbmN5Tm9kZU9yTnVsbCgpIHsKICAgIHJldHVybiByZWFkVmFsdWVPck51bGwocmVhZExpYnJhcnlEZXBlbmRlbmN5Tm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5Ob2RlIHJlYWRKc05vZGVPck51bGwoKSB7CiAgICBib29sIGhhc1ZhbHVlID0gcmVhZEJvb2woKTsKICAgIGlmIChoYXNWYWx1ZSkgewogICAgICByZXR1cm4gcmVhZEpzTm9kZSgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQp9CgovLy8gTWl4aW4gdGhhdCBpbXBsZW1lbnRzIGFsbCBjb252ZW5pZW5jZSBtZXRob2RzIG9mIFtEYXRhU2lua10uCmFic3RyYWN0IGNsYXNzIERhdGFTaW5rTWl4aW4gaW1wbGVtZW50cyBEYXRhU2luayB7CiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUludE9yTnVsbChpbnQgdmFsdWUpIHsKICAgIHdyaXRlQm9vbCh2YWx1ZSAhPSBudWxsKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlSW50KHZhbHVlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVTdHJpbmdPck51bGwoU3RyaW5nIHZhbHVlKSB7CiAgICB3cml0ZUJvb2wodmFsdWUgIT0gbnVsbCk7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB3cml0ZVN0cmluZyh2YWx1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ2xhc3NPck51bGwoSW5kZXhlZENsYXNzIHZhbHVlKSB7CiAgICB3cml0ZUJvb2wodmFsdWUgIT0gbnVsbCk7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB3cml0ZUNsYXNzKHZhbHVlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVMb2NhbE9yTnVsbChMb2NhbCB2YWx1ZSkgewogICAgd3JpdGVCb29sKHZhbHVlICE9IG51bGwpOwogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgd3JpdGVMb2NhbCh2YWx1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ2xhc3NlcyhJdGVyYWJsZTxDbGFzc0VudGl0eT4gdmFsdWVzLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICB3cml0ZUludCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlSW50KHZhbHVlcy5sZW5ndGgpOwogICAgICBmb3IgKEluZGV4ZWRDbGFzcyB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgICB3cml0ZUNsYXNzKHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRyZWVOb2RlcyhJdGVyYWJsZTxpci5UcmVlTm9kZT4gdmFsdWVzLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICB3cml0ZUludCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlSW50KHZhbHVlcy5sZW5ndGgpOwogICAgICBmb3IgKGlyLlRyZWVOb2RlIHZhbHVlIGluIHZhbHVlcykgewogICAgICAgIHdyaXRlVHJlZU5vZGUodmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlU3RyaW5ncyhJdGVyYWJsZTxTdHJpbmc+IHZhbHVlcywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludCh2YWx1ZXMubGVuZ3RoKTsKICAgICAgZm9yIChTdHJpbmcgdmFsdWUgaW4gdmFsdWVzKSB7CiAgICAgICAgd3JpdGVTdHJpbmcodmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlTWVtYmVyTm9kZXMoSXRlcmFibGU8aXIuTWVtYmVyPiB2YWx1ZXMsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQodmFsdWVzLmxlbmd0aCk7CiAgICAgIGZvciAoaXIuTWVtYmVyIHZhbHVlIGluIHZhbHVlcykgewogICAgICAgIHdyaXRlTWVtYmVyTm9kZSh2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVEYXJ0VHlwZXMoSXRlcmFibGU8RGFydFR5cGU+IHZhbHVlcywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludCh2YWx1ZXMubGVuZ3RoKTsKICAgICAgZm9yIChEYXJ0VHlwZSB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgICB3cml0ZURhcnRUeXBlKHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUxpYnJhcnlNYXA8Vj4oTWFwPExpYnJhcnlFbnRpdHksIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKG1hcCA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICB3cml0ZUludCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlSW50KG1hcC5sZW5ndGgpOwogICAgICBtYXAuZm9yRWFjaCgoTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBWIHZhbHVlKSB7CiAgICAgICAgd3JpdGVMaWJyYXJ5KGxpYnJhcnkpOwogICAgICAgIGYodmFsdWUpOwogICAgICB9KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDbGFzc01hcDxWPihNYXA8Q2xhc3NFbnRpdHksIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKG1hcCA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICB3cml0ZUludCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlSW50KG1hcC5sZW5ndGgpOwogICAgICBtYXAuZm9yRWFjaCgoQ2xhc3NFbnRpdHkgY2xzLCBWIHZhbHVlKSB7CiAgICAgICAgd3JpdGVDbGFzcyhjbHMpOwogICAgICAgIGYodmFsdWUpOwogICAgICB9KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVNZW1iZXJNYXA8Vj4oCiAgICAgIE1hcDxNZW1iZXJFbnRpdHksIFY+IG1hcCwgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIsIFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKG1hcCA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICB3cml0ZUludCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlSW50KG1hcC5sZW5ndGgpOwogICAgICBtYXAuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlciwgViB2YWx1ZSkgewogICAgICAgIHdyaXRlTWVtYmVyKG1lbWJlcik7CiAgICAgICAgZihtZW1iZXIsIHZhbHVlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlU3RyaW5nTWFwPFY+KE1hcDxTdHJpbmcsIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKG1hcCA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICB3cml0ZUludCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlSW50KG1hcC5sZW5ndGgpOwogICAgICBtYXAuZm9yRWFjaCgoU3RyaW5nIGtleSwgViB2YWx1ZSkgewogICAgICAgIHdyaXRlU3RyaW5nKGtleSk7CiAgICAgICAgZih2YWx1ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUxvY2FscyhJdGVyYWJsZTxMb2NhbD4gdmFsdWVzLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICB3cml0ZUludCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlSW50KHZhbHVlcy5sZW5ndGgpOwogICAgICBmb3IgKExvY2FsIHZhbHVlIGluIHZhbHVlcykgewogICAgICAgIHdyaXRlTG9jYWwodmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlTG9jYWxNYXA8Vj4oTWFwPExvY2FsLCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChtYXAgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludChtYXAubGVuZ3RoKTsKICAgICAgbWFwLmZvckVhY2goKExvY2FsIGtleSwgViB2YWx1ZSkgewogICAgICAgIHdyaXRlTG9jYWwoa2V5KTsKICAgICAgICBmKHZhbHVlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlTWVtYmVyTm9kZU1hcDxWPihNYXA8aXIuTWVtYmVyLCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChtYXAgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludChtYXAubGVuZ3RoKTsKICAgICAgbWFwLmZvckVhY2goKGlyLk1lbWJlciBrZXksIFYgdmFsdWUpIHsKICAgICAgICB3cml0ZU1lbWJlck5vZGUoa2V5KTsKICAgICAgICBmKHZhbHVlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVHJlZU5vZGVNYXA8Vj4oTWFwPGlyLlRyZWVOb2RlLCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChtYXAgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludChtYXAubGVuZ3RoKTsKICAgICAgbWFwLmZvckVhY2goKGlyLlRyZWVOb2RlIGtleSwgViB2YWx1ZSkgewogICAgICAgIHdyaXRlVHJlZU5vZGUoa2V5KTsKICAgICAgICBmKHZhbHVlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlTGlzdDxFPihJdGVyYWJsZTxFPiB2YWx1ZXMsIHZvaWQgZihFIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludCh2YWx1ZXMubGVuZ3RoKTsKICAgICAgdmFsdWVzLmZvckVhY2goZik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVHJlZU5vZGVPck51bGwoaXIuVHJlZU5vZGUgdmFsdWUpIHsKICAgIHdyaXRlQm9vbCh2YWx1ZSAhPSBudWxsKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlVHJlZU5vZGUodmFsdWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVZhbHVlT3JOdWxsPEU+KEUgdmFsdWUsIHZvaWQgZihFIHZhbHVlKSkgewogICAgd3JpdGVCb29sKHZhbHVlICE9IG51bGwpOwogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgZih2YWx1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlTWVtYmVyT3JOdWxsKEluZGV4ZWRNZW1iZXIgdmFsdWUpIHsKICAgIHdyaXRlQm9vbCh2YWx1ZSAhPSBudWxsKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlTWVtYmVyKHZhbHVlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVNZW1iZXJzKEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gdmFsdWVzLCB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICB3cml0ZUludCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlSW50KHZhbHVlcy5sZW5ndGgpOwogICAgICBmb3IgKEluZGV4ZWRNZW1iZXIgdmFsdWUgaW4gdmFsdWVzKSB7CiAgICAgICAgd3JpdGVNZW1iZXIodmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVHlwZVBhcmFtZXRlck5vZGVzKEl0ZXJhYmxlPGlyLlR5cGVQYXJhbWV0ZXI+IHZhbHVlcywKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludCh2YWx1ZXMubGVuZ3RoKTsKICAgICAgZm9yIChpci5UeXBlUGFyYW1ldGVyIHZhbHVlIGluIHZhbHVlcykgewogICAgICAgIHdyaXRlVHlwZVBhcmFtZXRlck5vZGUodmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ29uc3RhbnRPck51bGwoQ29uc3RhbnRWYWx1ZSB2YWx1ZSkgewogICAgd3JpdGVCb29sKHZhbHVlICE9IG51bGwpOwogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgd3JpdGVDb25zdGFudCh2YWx1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ29uc3RhbnRzKEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IHZhbHVlcywge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludCh2YWx1ZXMubGVuZ3RoKTsKICAgICAgZm9yIChDb25zdGFudFZhbHVlIHZhbHVlIGluIHZhbHVlcykgewogICAgICAgIHdyaXRlQ29uc3RhbnQodmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ29uc3RhbnRNYXA8Vj4oTWFwPENvbnN0YW50VmFsdWUsIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKG1hcCA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICB3cml0ZUludCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlSW50KG1hcC5sZW5ndGgpOwogICAgICBtYXAuZm9yRWFjaCgoQ29uc3RhbnRWYWx1ZSBrZXksIFYgdmFsdWUpIHsKICAgICAgICB3cml0ZUNvbnN0YW50KGtleSk7CiAgICAgICAgZih2YWx1ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUxpYnJhcnlPck51bGwoSW5kZXhlZExpYnJhcnkgdmFsdWUpIHsKICAgIHdyaXRlQm9vbCh2YWx1ZSAhPSBudWxsKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlTGlicmFyeSh2YWx1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlSW1wb3J0T3JOdWxsKEltcG9ydEVudGl0eSB2YWx1ZSkgewogICAgd3JpdGVCb29sKHZhbHVlICE9IG51bGwpOwogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgd3JpdGVJbXBvcnQodmFsdWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUltcG9ydHMoSXRlcmFibGU8SW1wb3J0RW50aXR5PiB2YWx1ZXMsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQodmFsdWVzLmxlbmd0aCk7CiAgICAgIGZvciAoSW1wb3J0RW50aXR5IHZhbHVlIGluIHZhbHVlcykgewogICAgICAgIHdyaXRlSW1wb3J0KHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUltcG9ydE1hcDxWPihNYXA8SW1wb3J0RW50aXR5LCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChtYXAgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludChtYXAubGVuZ3RoKTsKICAgICAgbWFwLmZvckVhY2goKEltcG9ydEVudGl0eSBrZXksIFYgdmFsdWUpIHsKICAgICAgICB3cml0ZUltcG9ydChrZXkpOwogICAgICAgIGYodmFsdWUpOwogICAgICB9KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVEYXJ0VHlwZU5vZGVzKEl0ZXJhYmxlPGlyLkRhcnRUeXBlPiB2YWx1ZXMsCiAgICAgIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQodmFsdWVzLmxlbmd0aCk7CiAgICAgIGZvciAoaXIuRGFydFR5cGUgdmFsdWUgaW4gdmFsdWVzKSB7CiAgICAgICAgd3JpdGVEYXJ0VHlwZU5vZGUodmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlTmFtZShpci5OYW1lIHZhbHVlKSB7CiAgICB3cml0ZVN0cmluZyh2YWx1ZS5uYW1lKTsKICAgIHdyaXRlVmFsdWVPck51bGwodmFsdWUubGlicmFyeSwgd3JpdGVMaWJyYXJ5Tm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlTGlicmFyeURlcGVuZGVuY3lOb2RlKGlyLkxpYnJhcnlEZXBlbmRlbmN5IHZhbHVlKSB7CiAgICBpci5MaWJyYXJ5IGxpYnJhcnkgPSB2YWx1ZS5wYXJlbnQ7CiAgICB3cml0ZUxpYnJhcnlOb2RlKGxpYnJhcnkpOwogICAgd3JpdGVJbnQobGlicmFyeS5kZXBlbmRlbmNpZXMuaW5kZXhPZih2YWx1ZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUxpYnJhcnlEZXBlbmRlbmN5Tm9kZU9yTnVsbChpci5MaWJyYXJ5RGVwZW5kZW5jeSB2YWx1ZSkgewogICAgd3JpdGVWYWx1ZU9yTnVsbCh2YWx1ZSwgd3JpdGVMaWJyYXJ5RGVwZW5kZW5jeU5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUpzTm9kZU9yTnVsbChqcy5Ob2RlIHZhbHVlKSB7CiAgICB3cml0ZUJvb2wodmFsdWUgIT0gbnVsbCk7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB3cml0ZUpzTm9kZSh2YWx1ZSk7CiAgICB9CiAgfQp9CoMXAE5OPAEeAUM3DCAgFBIGEQQBDDobMCcmFQYRBAEMGCAUGAYRBAEMHiAUGwYRBAEMOBswMSYeBhEEAQw8GzA1JiAGEQQBDE0bMEUmKQYRBAEMSxswJyYqGAYRBAEMTBswJyYqFwYRBAEMShswJyYlFQYRBAEMPiMbMBgmLRUcBhAEAQw6IxswGCYlFRgGEAQBDE8jGzAYJiobGwYQBAEMPSMbMBgmKRUZBhAEAQw9IxswGCYpFRkGEAQBDEMbMCcmIRcGEQQBDFEbMBgmIRUaBhAEAQxMGzAnJikWBhEEAQxGGzAdJiEVGAYQBAEMIyAUGgYRBAEMJSAUHQYRBAEMJSAUGwYRBAEMHCAUGgYRBAEMJyAUHQYRBAEMThswJyYsFwYRBAEMPyMbMBgmKhUYBhAEAQwnIBQcBhEEAQwkIBQbBhEEAQw+GzA9Jh4GEQQBDEwbMCMmJxUYBhAEAQxDGzA7JiQGEQQBDBcgOycEAQw1LBsoBAEMOzcEAQwfIBQbBhEEAgFBMwwjHhkXBgQBDCkeGRoGBAEMLh4ZGQYEAQwnHhkZBgQBDE0aGRMNHysbCAYEAQxPGhkTDR8qHggGBAEMSBoZEw0fJRwIBgQBDE8aGRMNHyggCAYEAQxMGhkTDR8nHggGBAEMRiEXGRMNHDUfEgoGBAEMQiEXGRMNHC8ZEgoGBAEMGkYhFxkTDRwzHRoKBgQBDD4hFxkTDRwqGhIKBgQBDEYaGRMNHyQbCAYEAQw8IRcZEw0cKRkSCgYEAQxFIRcZEw0cLR4SCgYEAQxFIRcZEw0cLxwSCgYEAQw5IRoZEw0fGQYEAQwwHhkcBgQBDDceGRAGBAEMMB4ZGgYEAQxOGhkTDR8sHAgGBAEMQiEaGRMNHy8nCAYEAQwyHhkcBgQBDFEaGRMNHyweCAYEAQxHIRcZEw0cMRwSCgYEAQwyHhkbBgQBDC8eGRoGBAEMThoZEw0fKxwIBgQBDEQhFxkTDRwwGhIKBgQBDDghGhkTDR8qIggGBAEMIh03BAEMQCcfMwQBDEY5BAEMKh4ZGgYEAgEucGFja2FnZTpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi9taXhpbnMuZGFydD1zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zZXJpYWxpemF0aW9uL25vZGVfaW5kZXhlci5kYXJ0ne8vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiAnc2VyaWFsaXphdGlvbi5kYXJ0JzsKCi8vLyBWaXNpdG9yIHRoYXQgYXNjcmliZXMgYW4gaW5kZXggdG8gYWxsIFtpci5UcmVlTm9kZV1zIHRoYXQgcG90ZW50aWFsbHkKLy8vIG5lZWRlZCBmb3Igc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgpjbGFzcyBfVHJlZU5vZGVJbmRleGVyVmlzaXRvciBleHRlbmRzIGlyLlZpc2l0b3I8dm9pZD4gewogIGludCBfY3VycmVudEluZGV4ID0gMDsKICBmaW5hbCBNYXA8aW50LCBpci5UcmVlTm9kZT4gX2luZGV4VG9Ob2RlTWFwOwogIGZpbmFsIE1hcDxpci5UcmVlTm9kZSwgaW50PiBfbm9kZVRvSW5kZXhNYXA7CgogIF9UcmVlTm9kZUluZGV4ZXJWaXNpdG9yKHRoaXMuX2luZGV4VG9Ob2RlTWFwLCB0aGlzLl9ub2RlVG9JbmRleE1hcCk7CgogIHZvaWQgcmVnaXN0ZXJOb2RlKGlyLlRyZWVOb2RlIG5vZGUpIHsKICAgIF9pbmRleFRvTm9kZU1hcFtfY3VycmVudEluZGV4XSA9IG5vZGU7CiAgICBfbm9kZVRvSW5kZXhNYXBbbm9kZV0gPSBfY3VycmVudEluZGV4OwogICAgX2N1cnJlbnRJbmRleCsrOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0VHJlZU5vZGUoaXIuVHJlZU5vZGUgbm9kZSkgewogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihpci5GdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRGdW5jdGlvbkV4cHJlc3Npb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihpci5GdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCbG9jayhpci5CbG9jayBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdEJsb2NrKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZS5wYXJlbnQgaXMhIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgfQogICAgc3VwZXIudmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN3aXRjaFN0YXRlbWVudChpci5Td2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRTd2l0Y2hTdGF0ZW1lbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Rm9yU3RhdGVtZW50KGlyLkZvclN0YXRlbWVudCBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdEZvclN0YXRlbWVudChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGb3JJblN0YXRlbWVudChpci5Gb3JJblN0YXRlbWVudCBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdEZvckluU3RhdGVtZW50KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFdoaWxlU3RhdGVtZW50KGlyLldoaWxlU3RhdGVtZW50IG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0V2hpbGVTdGF0ZW1lbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RG9TdGF0ZW1lbnQoaXIuRG9TdGF0ZW1lbnQgbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXREb1N0YXRlbWVudChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCcmVha1N0YXRlbWVudChpci5CcmVha1N0YXRlbWVudCBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdEJyZWFrU3RhdGVtZW50KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpc3RMaXRlcmFsKGlyLkxpc3RMaXRlcmFsIG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0TGlzdExpdGVyYWwobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0TGl0ZXJhbChpci5TZXRMaXRlcmFsIG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0U2V0TGl0ZXJhbChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXBMaXRlcmFsKGlyLk1hcExpdGVyYWwgbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRNYXBMaXRlcmFsKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFByb3BlcnR5R2V0KGlyLlByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0UHJvcGVydHlHZXQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJvcGVydHlTZXQoaXIuUHJvcGVydHlTZXQgbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRQcm9wZXJ0eVNldChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNZXRob2RJbnZvY2F0aW9uKGlyLk1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRNZXRob2RJbnZvY2F0aW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERpcmVjdFByb3BlcnR5R2V0KGlyLkRpcmVjdFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0RGlyZWN0UHJvcGVydHlHZXQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RGlyZWN0UHJvcGVydHlTZXQoaXIuRGlyZWN0UHJvcGVydHlTZXQgbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXREaXJlY3RQcm9wZXJ0eVNldChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKGlyLkRpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0YXRpY0ludm9jYXRpb24oaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdFN0YXRpY0ludm9jYXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGFiZWxlZFN0YXRlbWVudChpci5MYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0TGFiZWxlZFN0YXRlbWVudChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTd2l0Y2hDYXNlKGlyLlN3aXRjaENhc2Ugbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRTd2l0Y2hDYXNlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KGlyLkNvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIHJlZ2lzdGVyTm9kZShub2RlKTsKICAgIHN1cGVyLnZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKGlyLkNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYXJpYWJsZUdldChpci5WYXJpYWJsZUdldCBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdFZhcmlhYmxlR2V0KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEluc3RhbnRpYXRpb24oaXIuSW5zdGFudGlhdGlvbiBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdEluc3RhbnRpYXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKGlyLlN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICByZWdpc3Rlck5vZGUobm9kZSk7CiAgICBzdXBlci52aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdXBlclByb3BlcnR5R2V0KGlyLlN1cGVyUHJvcGVydHlHZXQgbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRTdXBlclByb3BlcnR5R2V0KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0YW50RXhwcmVzc2lvbihpci5Db25zdGFudEV4cHJlc3Npb24gbm9kZSkgewogICAgcmVnaXN0ZXJOb2RlKG5vZGUpOwogICAgc3VwZXIudmlzaXRDb25zdGFudEV4cHJlc3Npb24obm9kZSk7CiAgfQp9CgovLy8gVmlzaXRvciB0aGF0IGFzY3JpYmVzIGFuIGluZGV4IHRvIGFsbCBbaXIuQ29uc3RhbnRdcyB0aGF0IHdlIHBvdGVudGlhbGx5Ci8vLyBuZWVkIHRvIHJlZmVyZW5jZSBmb3Igc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgovLy8KLy8vIEN1cnJlbnRseSB0aGlzIGlzIG9ubHkgbGlzdCwgbWFwLCBhbmQgc2V0IGNvbnN0YW50cywgd2hpY2ggYXJlIHVzZWQgYXMKLy8vIGFsbG9jYXRpb24gaWRlbnRpdGllcyBpbiB0aGUgZ2xvYmFsIGluZmVyZW5jZS4KY2xhc3MgX0NvbnN0YW50Tm9kZUluZGV4ZXJWaXNpdG9yIGltcGxlbWVudHMgaXIuQ29uc3RhbnRWaXNpdG9yPHZvaWQ+IHsKICBpbnQgX2N1cnJlbnRJbmRleCA9IDA7CiAgZmluYWwgTWFwPGludCwgaXIuQ29uc3RhbnQ+IF9pbmRleFRvTm9kZU1hcCA9IHt9OwogIGZpbmFsIE1hcDxpci5Db25zdGFudCwgaW50PiBfbm9kZVRvSW5kZXhNYXAgPSB7fTsKICBmaW5hbCBTZXQ8aXIuQ29uc3RhbnQ+IF92aXNpdGVkTm9uaW5kZXhlZE5vZGVzID0ge307CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBub2RlIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQuCiAgYm9vbCBfcmVnaXN0ZXIoaXIuQ29uc3RhbnQgbm9kZSkgewogICAgaW50IGluZGV4ID0gX25vZGVUb0luZGV4TWFwW25vZGVdOwogICAgaWYgKGluZGV4ICE9IG51bGwpIHJldHVybiBmYWxzZTsKICAgIF9pbmRleFRvTm9kZU1hcFtfY3VycmVudEluZGV4XSA9IG5vZGU7CiAgICBfbm9kZVRvSW5kZXhNYXBbbm9kZV0gPSBfY3VycmVudEluZGV4OwogICAgX2N1cnJlbnRJbmRleCsrOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBpbnQgZ2V0SW5kZXgoaXIuQ29uc3RhbnQgbm9kZSkgewogICAgYXNzZXJ0KF9ub2RlVG9JbmRleE1hcC5jb250YWluc0tleShub2RlKSwgIkNvbnN0YW50IHdpdGhvdXQgaW5kZXg6ICRub2RlIik7CiAgICByZXR1cm4gX25vZGVUb0luZGV4TWFwW25vZGVdOwogIH0KCiAgaXIuQ29uc3RhbnQgZ2V0Q29uc3RhbnQoaW50IGluZGV4KSB7CiAgICBhc3NlcnQoCiAgICAgICAgX2luZGV4VG9Ob2RlTWFwLmNvbnRhaW5zS2V5KGluZGV4KSwgIkluZGV4IHdpdGhvdXQgY29uc3RhbnQ6ICRpbmRleCIpOwogICAgcmV0dXJuIF9pbmRleFRvTm9kZU1hcFtpbmRleF07CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudChpci5VbmV2YWx1YXRlZENvbnN0YW50IG5vZGUpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KGlyLlR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRlYXJPZmZDb25zdGFudChpci5UZWFyT2ZmQ29uc3RhbnQgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoaXIuUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSB7CiAgICBub2RlLnRlYXJPZmZDb25zdGFudC5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFuY2VDb25zdGFudChpci5JbnN0YW5jZUNvbnN0YW50IG5vZGUpIHsKICAgIGlmIChfdmlzaXRlZE5vbmluZGV4ZWROb2Rlcy5hZGQobm9kZSkpIHsKICAgICAgbm9kZS5maWVsZFZhbHVlcy5mb3JFYWNoKChfLCBpci5Db25zdGFudCB2YWx1ZSkgewogICAgICAgIHZhbHVlLmFjY2VwdCh0aGlzKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0Q29uc3RhbnQoaXIuU2V0Q29uc3RhbnQgbm9kZSkgewogICAgaWYgKF9yZWdpc3Rlcihub2RlKSkgewogICAgICBmb3IgKGlyLkNvbnN0YW50IGVsZW1lbnQgaW4gbm9kZS5lbnRyaWVzKSB7CiAgICAgICAgZWxlbWVudC5hY2NlcHQodGhpcyk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXN0Q29uc3RhbnQoaXIuTGlzdENvbnN0YW50IG5vZGUpIHsKICAgIGlmIChfcmVnaXN0ZXIobm9kZSkpIHsKICAgICAgZm9yIChpci5Db25zdGFudCBlbGVtZW50IGluIG5vZGUuZW50cmllcykgewogICAgICAgIGVsZW1lbnQuYWNjZXB0KHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TWFwQ29uc3RhbnQoaXIuTWFwQ29uc3RhbnQgbm9kZSkgewogICAgaWYgKF9yZWdpc3Rlcihub2RlKSkgewogICAgICBmb3IgKGlyLkNvbnN0YW50TWFwRW50cnkgZW50cnkgaW4gbm9kZS5lbnRyaWVzKSB7CiAgICAgICAgZW50cnkua2V5LmFjY2VwdCh0aGlzKTsKICAgICAgICBlbnRyeS52YWx1ZS5hY2NlcHQodGhpcyk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTeW1ib2xDb25zdGFudChpci5TeW1ib2xDb25zdGFudCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nQ29uc3RhbnQoaXIuU3RyaW5nQ29uc3RhbnQgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvdWJsZUNvbnN0YW50KGlyLkRvdWJsZUNvbnN0YW50IG5vZGUpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRDb25zdGFudChpci5JbnRDb25zdGFudCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm9vbENvbnN0YW50KGlyLkJvb2xDb25zdGFudCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TnVsbENvbnN0YW50KGlyLk51bGxDb25zdGFudCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRDb25zdGFudChpci5Db25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKAogICAgICAgICJVbmV4cGVjdGVkIGNvbnN0YW50OiAkbm9kZSAoJHtub2RlLnJ1bnRpbWVUeXBlfSkiKTsKICB9Cn0KgTgATk48AR4BSjI5GS8vAUcBKCsrFQQBDCseBAEMPRgpBAEMPxgqBAEMIxgcBAEMPzIaBioEAQw3GCYEAQwxGCMEAQw1GCUEAQw1GCUEAQwvGCIEAQw1GCUEAQwvGCIEAQwtGCEEAQwtGCEEAQwvGCIEAQwvGCIEAQw5GCcEAQw7GCgEAQw7GCgEAQxFGC0EAQw5GCcEAQw5GCcEAQwtGCEEAQxHGC4EAQxDGCwEAQwvGCIEAQwzGCQEAQxDGCwEAQw5GCcEAQw9GCkEAgFNPQRLM0gZNDQ3ATUlJyUrKxURBAEjUCIEAScMTyMEAQxAAQxAAQw4AQxRJwQBDDktOBwKBgQBDC8bMh4IBgQBDDEbMh4IBgQBDC8bOCAiCAYEAQw2AQw2AQw2AQwwAQwyAQwyAQwrIj0EAgE0cGFja2FnZTpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi9ub2RlX2luZGV4ZXIuZGFydDxzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zZXJpYWxpemF0aW9uL29iamVjdF9zaW5rLmRhcnSFii8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mICdzZXJpYWxpemF0aW9uLmRhcnQnOwoKLy8vIFtEYXRhU2lua10gdGhhdCB3cml0ZXMgdG8gYSBsaXN0IG9mIG9iamVjdHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi8vLyBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uCi8vLwovLy8gVGhpcyBkYXRhIHNpbmsgd29ya3MgdG9nZXRoZXIgd2l0aCBbT2JqZWN0U291cmNlXS4KY2xhc3MgT2JqZWN0U2luayBleHRlbmRzIEFic3RyYWN0RGF0YVNpbmsgewogIExpc3Q8ZHluYW1pYz4gX2RhdGE7CgogIE9iamVjdFNpbmsodGhpcy5fZGF0YSwge2Jvb2wgdXNlRGF0YUtpbmRzLCBNYXA8U3RyaW5nLCBpbnQ+IHRhZ0ZyZXF1ZW5jeU1hcH0pCiAgICAgIDogc3VwZXIodXNlRGF0YUtpbmRzOiB1c2VEYXRhS2luZHMsIHRhZ0ZyZXF1ZW5jeU1hcDogdGFnRnJlcXVlbmN5TWFwKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBfYmVnaW4oU3RyaW5nIHRhZykgewogICAgX2RhdGEuYWRkKG5ldyBUYWcoJ2JlZ2luOiR0YWcnKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9lbmQoU3RyaW5nIHRhZykgewogICAgX2RhdGEuYWRkKG5ldyBUYWcoJ2VuZDokdGFnJykpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfd3JpdGVFbnVtSW50ZXJuYWwoZHluYW1pYyB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwogICAgX2RhdGEuYWRkKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX3dyaXRlSW50SW50ZXJuYWwoaW50IHZhbHVlKSB7CiAgICBhc3NlcnQodmFsdWUgIT0gbnVsbCk7CiAgICBfZGF0YS5hZGQodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfd3JpdGVTdHJpbmdJbnRlcm5hbChTdHJpbmcgdmFsdWUpIHsKICAgIGFzc2VydCh2YWx1ZSAhPSBudWxsKTsKICAgIF9kYXRhLmFkZCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF93cml0ZVVyaUludGVybmFsKFVyaSB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwogICAgX2RhdGEuYWRkKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSB7CiAgICBfZGF0YSA9IG51bGw7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgd3JpdHRlbiB0byB0aGlzIGRhdGEgc2luay4KICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiBfZGF0YS5sZW5ndGg7Cn0KPQBOTjwBHgFGPwQ3LBcBUE0BDBwmBAEMGiQEAQwrGxYEAQwmGxYEAQwsGxYEAQwmGxYEAQwREgQBPwwiAgEzcGFja2FnZTpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi9vYmplY3Rfc2luay5kYXJ0PnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NlcmlhbGl6YXRpb24vb2JqZWN0X3NvdXJjZS5kYXJ0h5AvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiAnc2VyaWFsaXphdGlvbi5kYXJ0JzsKCi8vLyBbRGF0YVNvdXJjZV0gdGhhdCByZWFkIGZyb20gYSBsaXN0IG9mIG9iamVjdHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi8vLyBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uCi8vLwovLy8gVGhpcyBkYXRhIHNvdXJjZSB3b3JrcyB0b2dldGhlciB3aXRoIFtPYmplY3RTaW5rXS4KY2xhc3MgT2JqZWN0U291cmNlIGV4dGVuZHMgQWJzdHJhY3REYXRhU291cmNlIHsKICBpbnQgX2luZGV4ID0gMDsKICBmaW5hbCBMaXN0PGR5bmFtaWM+IF9kYXRhOwoKICBPYmplY3RTb3VyY2UodGhpcy5fZGF0YSwge2Jvb2wgdXNlRGF0YUtpbmRzfSkKICAgICAgOiBzdXBlcih1c2VEYXRhS2luZHM6IHVzZURhdGFLaW5kcyk7CgogIFQgX3JlYWQ8VD4oKSB7CiAgICBkeW5hbWljIHZhbHVlID0gX2RhdGFbX2luZGV4KytdOwogICAgYXNzZXJ0KHZhbHVlIGlzIFQsICJFeHBlY3RlZCAkVCB2YWx1ZSwgZm91bmQgJHZhbHVlLiRfZXJyb3JDb250ZXh0Iik7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIF9iZWdpbihTdHJpbmcgdGFnKSB7CiAgICBUYWcgZXhwZWN0ZWRUYWcgPSBuZXcgVGFnKCdiZWdpbjokdGFnJyk7CiAgICBUYWcgYWN0dWFsVGFnID0gX3JlYWQoKTsKICAgIGFzc2VydCgKICAgICAgICBleHBlY3RlZFRhZyA9PSBhY3R1YWxUYWcsCiAgICAgICAgIlVuZXhwZWN0ZWQgYmVnaW4gdGFnLiAiCiAgICAgICAgIkV4cGVjdGVkICRleHBlY3RlZFRhZywgZm91bmQgJGFjdHVhbFRhZy4kX2Vycm9yQ29udGV4dCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfZW5kKFN0cmluZyB0YWcpIHsKICAgIFRhZyBleHBlY3RlZFRhZyA9IG5ldyBUYWcoJ2VuZDokdGFnJyk7CiAgICBUYWcgYWN0dWFsVGFnID0gX3JlYWQoKTsKICAgIGFzc2VydCgKICAgICAgICBleHBlY3RlZFRhZyA9PSBhY3R1YWxUYWcsCiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZy4gIgogICAgICAgICJFeHBlY3RlZCAkZXhwZWN0ZWRUYWcsIGZvdW5kICRhY3R1YWxUYWcuJF9lcnJvckNvbnRleHQiKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBfcmVhZFN0cmluZ0ludGVybmFsKCkgPT4gX3JlYWQoKTsKCiAgQG92ZXJyaWRlCiAgRSBfcmVhZEVudW1JbnRlcm5hbDxFPihMaXN0PEU+IHZhbHVlcykgPT4gX3JlYWQoKTsKCiAgQG92ZXJyaWRlCiAgVXJpIF9yZWFkVXJpSW50ZXJuYWwoKSA9PiBfcmVhZCgpOwoKICBAb3ZlcnJpZGUKICBpbnQgX3JlYWRJbnRJbnRlcm5hbCgpID0+IF9yZWFkKCk7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2Vycm9yQ29udGV4dCB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBmb3IgKGludCBpID0gX2luZGV4IC0gNTA7IGkgPCBfaW5kZXggKyAxMDsgaSsrKSB7CiAgICAgIGlmIChpID49IDAgJiYgaSA8IF9kYXRhLmxlbmd0aCkgewogICAgICAgIGlmIChpID09IF9pbmRleCAtIDEpIHsKICAgICAgICAgIHNiLndyaXRlKCdcbj4gJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNiLndyaXRlKCdcbiAgJyk7CiAgICAgICAgfQogICAgICAgIHNiLndyaXRlKGkpOwogICAgICAgIHNiLndyaXRlKCcgJyk7CiAgICAgICAgc2Iud3JpdGUoX2RhdGFbaV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KSwBOTjwBHgFIPwQ3MBIdATArARElShIEAQwcLR0MIiFDBAEMGisdDCIfQwQBDCsBDDUBDCUBDCUBDB0qNigfHBEcChUXHAgGGgQCATVwYWNrYWdlOmNvbXBpbGVyL3NyYy9zZXJpYWxpemF0aW9uL29iamVjdF9zb3VyY2UuZGFydCpzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zc2Evc3NhLmRhcnS1US8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHNzYTsKCmltcG9ydCAnLi4vYmFja2VuZF9zdHJhdGVneS5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHMsIEpFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vY29tbW9uL2NvZGVnZW4uZGFydCcgc2hvdyBDb2RlZ2VuUmVzdWx0LCBDb2RlZ2VuUmVnaXN0cnk7CmltcG9ydCAnLi4vY29tbW9uL3Rhc2tzLmRhcnQnIHNob3cgQ29tcGlsZXJUYXNrLCBNZWFzdXJlcjsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganM7CmltcG9ydCAnLi4vanMvcmV3cml0ZV9hc3luYy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2JhY2tlbmQuZGFydCcgc2hvdyBDb2RlZ2VuSW5wdXRzLCBGdW5jdGlvbkNvbXBpbGVyOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmFtZXIuZGFydCcgc2hvdyBNb2R1bGFyTmFtZXIsIE1vZHVsYXJOYW1lckltcGw7CmltcG9ydCAnLi4vanNfZW1pdHRlci9jb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JyBzaG93IE1vZHVsYXJFbWl0dGVyOwppbXBvcnQgJy4uL2pzX2VtaXR0ZXIvc3RhcnR1cF9lbWl0dGVyL2VtaXR0ZXIuZGFydCcgc2hvdyBNb2R1bGFyRW1pdHRlckltcGw7CmltcG9ydCAnLi4vanNfbW9kZWwvZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvdHlwZV9yZWNpcGUuZGFydCcgc2hvdyBUeXBlRXhwcmVzc2lvblJlY2lwZTsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnIHNob3cgQ2FsbFN0cnVjdHVyZTsKaW1wb3J0ICcuLi91bml2ZXJzZS91c2UuZGFydCcgc2hvdyBTdGF0aWNVc2U7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CgppbXBvcnQgJ2NvZGVnZW4uZGFydCc7CmltcG9ydCAnbm9kZXMuZGFydCc7CmltcG9ydCAnb3B0aW1pemUuZGFydCc7CgpjbGFzcyBTc2FGdW5jdGlvbkNvbXBpbGVyIGltcGxlbWVudHMgRnVuY3Rpb25Db21waWxlciB7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIGZpbmFsIERpYWdub3N0aWNSZXBvcnRlciBfcmVwb3J0ZXI7CiAgZmluYWwgU3NhQ29kZUdlbmVyYXRvclRhc2sgZ2VuZXJhdG9yOwogIGZpbmFsIFNzYUJ1aWxkZXJUYXNrIF9idWlsZGVyOwogIGZpbmFsIFNzYU9wdGltaXplclRhc2sgb3B0aW1pemVyOwogIGZpbmFsIFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kgc291cmNlSW5mb3JtYXRpb25TdHJhdGVneTsKICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0czsKICBDb2RlZ2VuSW5wdXRzIF9jb2RlZ2VuOwoKICBTc2FGdW5jdGlvbkNvbXBpbGVyKAogICAgICB0aGlzLl9vcHRpb25zLAogICAgICB0aGlzLl9yZXBvcnRlciwKICAgICAgQmFja2VuZFN0cmF0ZWd5IGJhY2tlbmRTdHJhdGVneSwKICAgICAgTWVhc3VyZXIgbWVhc3VyZXIsCiAgICAgIHRoaXMuc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSkKICAgICAgOiBnZW5lcmF0b3IgPSBuZXcgU3NhQ29kZUdlbmVyYXRvclRhc2soCiAgICAgICAgICAgIG1lYXN1cmVyLCBfb3B0aW9ucywgc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSksCiAgICAgICAgX2J1aWxkZXIgPSBuZXcgU3NhQnVpbGRlclRhc2soCiAgICAgICAgICAgIG1lYXN1cmVyLCBiYWNrZW5kU3RyYXRlZ3ksIHNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kpLAogICAgICAgIG9wdGltaXplciA9IG5ldyBTc2FPcHRpbWl6ZXJUYXNrKG1lYXN1cmVyLCBfb3B0aW9ucyk7CgogIEBvdmVycmlkZQogIHZvaWQgaW5pdGlhbGl6ZShHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzLAogICAgICBDb2RlZ2VuSW5wdXRzIGNvZGVnZW4pIHsKICAgIF9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzID0gZ2xvYmFsSW5mZXJlbmNlUmVzdWx0czsKICAgIF9jb2RlZ2VuID0gY29kZWdlbjsKICAgIF9idWlsZGVyLm9uQ29kZWdlblN0YXJ0KCk7CiAgfQoKICAvLy8gR2VuZXJhdGVzIEphdmFTY3JpcHQgY29kZSBmb3IgW21lbWJlcl0uCiAgLy8vIFVzaW5nIHRoZSBzc2EgYnVpbGRlciwgb3B0aW1pemVyIGFuZCBjb2RlIGdlbmVyYXRvci4KICBAb3ZlcnJpZGUKICBDb2RlZ2VuUmVzdWx0IGNvbXBpbGUoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkID0gX2dsb2JhbEluZmVyZW5jZVJlc3VsdHMuY2xvc2VkV29ybGQ7CiAgICBDb2RlZ2VuUmVnaXN0cnkgcmVnaXN0cnkgPQogICAgICAgIG5ldyBDb2RlZ2VuUmVnaXN0cnkoY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LCBtZW1iZXIpOwogICAgTW9kdWxhck5hbWVyIG5hbWVyID0gbmV3IE1vZHVsYXJOYW1lckltcGwocmVnaXN0cnksCiAgICAgICAgY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMsIF9jb2RlZ2VuLnJ0aVRhZ3MsIF9jb2RlZ2VuLmZpeGVkTmFtZXMpOwogICAgTW9kdWxhckVtaXR0ZXIgZW1pdHRlciA9IG5ldyBNb2R1bGFyRW1pdHRlckltcGwobmFtZXIsIHJlZ2lzdHJ5LCBfb3B0aW9ucyk7CiAgICBpZiAobWVtYmVyLmlzQ29uc3RydWN0b3IgJiYKICAgICAgICBtZW1iZXIuZW5jbG9zaW5nQ2xhc3MgPT0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuanNOdWxsQ2xhc3MpIHsKICAgICAgLy8gV29yayBhcm91bmQgYSBwcm9ibGVtIGNvbXBpbGluZyBKU051bGwncyBjb25zdHJ1Y3Rvci4KICAgICAgcmV0dXJuIHJlZ2lzdHJ5LmNsb3NlKG51bGwpOwogICAgfQoKICAgIEhHcmFwaCBncmFwaCA9IF9idWlsZGVyLmJ1aWxkKG1lbWJlciwgY2xvc2VkV29ybGQsIF9nbG9iYWxJbmZlcmVuY2VSZXN1bHRzLAogICAgICAgIF9jb2RlZ2VuLCByZWdpc3RyeSwgbmFtZXIsIGVtaXR0ZXIpOwogICAgaWYgKGdyYXBoID09IG51bGwpIHsKICAgICAgcmV0dXJuIHJlZ2lzdHJ5LmNsb3NlKG51bGwpOwogICAgfQogICAgb3B0aW1pemVyLm9wdGltaXplKG1lbWJlciwgZ3JhcGgsIF9jb2RlZ2VuLCBjbG9zZWRXb3JsZCwKICAgICAgICBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywgcmVnaXN0cnkpOwogICAganMuRXhwcmVzc2lvbiByZXN1bHQgPSBnZW5lcmF0b3IuZ2VuZXJhdGVDb2RlKAogICAgICAgIG1lbWJlciwgZ3JhcGgsIF9jb2RlZ2VuLCBjbG9zZWRXb3JsZCwgcmVnaXN0cnksIG5hbWVyLCBlbWl0dGVyKTsKICAgIGlmIChncmFwaC5uZWVkc0FzeW5jUmV3cml0ZSkgewogICAgICBTb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIgc291cmNlSW5mb3JtYXRpb25CdWlsZGVyID0KICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kuY3JlYXRlQnVpbGRlckZvckNvbnRleHQobWVtYmVyKTsKICAgICAgcmVzdWx0ID0gX3Jld3JpdGVBc3luYygKICAgICAgICAgIF9jb2RlZ2VuLAogICAgICAgICAgY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMsCiAgICAgICAgICBjbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgICByZWdpc3RyeSwKICAgICAgICAgIG5hbWVyLAogICAgICAgICAgZW1pdHRlciwKICAgICAgICAgIG1lbWJlciwKICAgICAgICAgIHJlc3VsdCwKICAgICAgICAgIGdyYXBoLmFzeW5jRWxlbWVudFR5cGUsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRBc3luY0JvZHkoKSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEFzeW5jRXhpdCgpKTsKICAgIH0KICAgIGlmIChyZXN1bHQuc291cmNlSW5mb3JtYXRpb24gPT0gbnVsbCkgewogICAgICByZXN1bHQgPSByZXN1bHQud2l0aFNvdXJjZUluZm9ybWF0aW9uKAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb25TdHJhdGVneS5idWlsZFNvdXJjZU1hcHBlZE1hcmtlcigpKTsKICAgIH0KCiAgICByZXR1cm4gcmVnaXN0cnkuY2xvc2UocmVzdWx0KTsKICB9CgogIGpzLkV4cHJlc3Npb24gX3Jld3JpdGVBc3luYygKICAgICAgQ29kZWdlbklucHV0cyBjb2RlZ2VuLAogICAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgSkVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIENvZGVnZW5SZWdpc3RyeSByZWdpc3RyeSwKICAgICAgTW9kdWxhck5hbWVyIG5hbWVyLAogICAgICBNb2R1bGFyRW1pdHRlciBlbWl0dGVyLAogICAgICBGdW5jdGlvbkVudGl0eSBlbGVtZW50LAogICAgICBqcy5FeHByZXNzaW9uIGNvZGUsCiAgICAgIERhcnRUeXBlIGFzeW5jVHlwZVBhcmFtZXRlciwKICAgICAgU291cmNlSW5mb3JtYXRpb24gYm9keVNvdXJjZUluZm9ybWF0aW9uLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBleGl0U291cmNlSW5mb3JtYXRpb24pIHsKICAgIGlmIChlbGVtZW50LmFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLlNZTkMpIHJldHVybiBjb2RlOwoKICAgIEFzeW5jUmV3cml0ZXJCYXNlIHJld3JpdGVyID0gbnVsbDsKICAgIGpzLk5hbWUgbmFtZSA9IG5hbWVyLm1ldGhvZFByb3BlcnR5TmFtZSgKICAgICAgICBlbGVtZW50IGlzIEpHZW5lcmF0b3JCb2R5ID8gZWxlbWVudC5mdW5jdGlvbiA6IGVsZW1lbnQpOwoKICAgIHN3aXRjaCAoZWxlbWVudC5hc3luY01hcmtlcikgewogICAgICBjYXNlIEFzeW5jTWFya2VyLkFTWU5DOgogICAgICAgIHJld3JpdGVyID0gX21ha2VBc3luY1Jld3JpdGVyKAogICAgICAgICAgICBjb2RlZ2VuLAogICAgICAgICAgICBjb21tb25FbGVtZW50cywKICAgICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LAogICAgICAgICAgICByZWdpc3RyeSwKICAgICAgICAgICAgbmFtZXIsCiAgICAgICAgICAgIGVtaXR0ZXIsCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgIGNvZGUsCiAgICAgICAgICAgIGFzeW5jVHlwZVBhcmFtZXRlciwKICAgICAgICAgICAgbmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuU1lOQ19TVEFSOgogICAgICAgIHJld3JpdGVyID0gX21ha2VTeW5jU3RhclJld3JpdGVyKAogICAgICAgICAgICBjb2RlZ2VuLAogICAgICAgICAgICBjb21tb25FbGVtZW50cywKICAgICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LAogICAgICAgICAgICByZWdpc3RyeSwKICAgICAgICAgICAgbmFtZXIsCiAgICAgICAgICAgIGVtaXR0ZXIsCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgIGNvZGUsCiAgICAgICAgICAgIGFzeW5jVHlwZVBhcmFtZXRlciwKICAgICAgICAgICAgbmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuQVNZTkNfU1RBUjoKICAgICAgICByZXdyaXRlciA9IF9tYWtlQXN5bmNTdGFyUmV3cml0ZXIoCiAgICAgICAgICAgIGNvZGVnZW4sCiAgICAgICAgICAgIGNvbW1vbkVsZW1lbnRzLAogICAgICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgICAgIHJlZ2lzdHJ5LAogICAgICAgICAgICBuYW1lciwKICAgICAgICAgICAgZW1pdHRlciwKICAgICAgICAgICAgZWxlbWVudCwKICAgICAgICAgICAgY29kZSwKICAgICAgICAgICAgYXN5bmNUeXBlUGFyYW1ldGVyLAogICAgICAgICAgICBuYW1lKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlKGNvZGUsIGJvZHlTb3VyY2VJbmZvcm1hdGlvbiwgZXhpdFNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIC8vLyBSZXR1cm5zIGFuIG9wdGlvbmFsIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgW3R5cGVdLiAgUmV0dXJucyBgbnVsbGAgaWYKICAvLy8gdGhlIHR5cGUgZXhwcmVzc2lvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvdXRzaWRlIGNvbnRleHQgYW5kIHNob3VsZCBiZQogIC8vLyBhZGRlZCBhcyBhIGZ1bmN0aW9uIHBhcmFtZXRlciB0byB0aGUgcmV3cml0dGVuIGNvZGUuCiAgLy8gVE9ETyhzcmEpOiBXZSBjb3VsZCBhbHNvIHJldHVybiBhbiBlbXB0eSBsaXN0IGlmIHRoZSBnZW5lcmF0b3IgdGFrZXMgbm8KICAvLyB0eXBlIChlLmcuIGR1ZSB0byBydGlOZWVkIG9wdGltaXphdGlvbikuCiAgTGlzdDxqcy5FeHByZXNzaW9uPiBfZmV0Y2hJdGVtVHlwZSgKICAgICAgQ29kZWdlbklucHV0cyBjb2RlZ2VuLCBNb2R1bGFyRW1pdHRlciBlbWl0dGVyLCBEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHZhciBhc3QgPSBjb2RlZ2VuLnJ0aUVuY29kZXIuZ2V0VHlwZVJlcHJlc2VudGF0aW9uKGVtaXR0ZXIsIHR5cGUsIG51bGwpOwogICAgcmV0dXJuIDxqcy5FeHByZXNzaW9uPlthc3RdOwogIH0KCiAgTGlzdDxqcy5FeHByZXNzaW9uPiBfZmV0Y2hJdGVtVHlwZU5ld1J0aSgKICAgICAgQ29kZWdlbklucHV0cyBjb2RlZ2VuLAogICAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgQ29kZWdlblJlZ2lzdHJ5IHJlZ2lzdHJ5LAogICAgICBNb2R1bGFyRW1pdHRlciBlbWl0dGVyLAogICAgICBEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgICBGdW5jdGlvbkVudGl0eSBoZWxwZXJFbGVtZW50ID0gY29tbW9uRWxlbWVudHMuZmluZFR5cGU7CiAgICByZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZSgKICAgICAgICBuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZShoZWxwZXJFbGVtZW50LCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpKTsKICAgIGpzLkV4cHJlc3Npb24gcmVjaXBlID0gY29kZWdlbi5ydGlSZWNpcGVFbmNvZGVyCiAgICAgICAgLmVuY29kZUdyb3VuZFJlY2lwZShlbWl0dGVyLCBUeXBlRXhwcmVzc2lvblJlY2lwZSh0eXBlKSk7CiAgICBqcy5FeHByZXNzaW9uIGhlbHBlciA9IGVtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoaGVscGVyRWxlbWVudCk7CiAgICB2YXIgYXN0ID0ganMuanMocicjKCMpJywgW2hlbHBlciwgcmVjaXBlXSk7CiAgICByZXR1cm4gPGpzLkV4cHJlc3Npb24+W2FzdF07CiAgfQoKICBBc3luY1Jld3JpdGVyIF9tYWtlQXN5bmNSZXdyaXRlcigKICAgICAgQ29kZWdlbklucHV0cyBjb2RlZ2VuLAogICAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgSkVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIENvZGVnZW5SZWdpc3RyeSByZWdpc3RyeSwKICAgICAgTW9kdWxhck5hbWVyIG5hbWVyLAogICAgICBNb2R1bGFyRW1pdHRlciBlbWl0dGVyLAogICAgICBGdW5jdGlvbkVudGl0eSBlbGVtZW50LAogICAgICBqcy5FeHByZXNzaW9uIGNvZGUsCiAgICAgIERhcnRUeXBlIGVsZW1lbnRUeXBlLAogICAgICBqcy5OYW1lIG5hbWUpIHsKICAgIEZ1bmN0aW9uRW50aXR5IHN0YXJ0RnVuY3Rpb24gPSBjb21tb25FbGVtZW50cy5hc3luY0hlbHBlclN0YXJ0U3luYzsKICAgIEZ1bmN0aW9uRW50aXR5IGNvbXBsZXRlckZhY3RvcnkgPSBjb21tb25FbGVtZW50cy5hc3luY0F3YWl0Q29tcGxldGVyRmFjdG9yeTsKCiAgICBMaXN0PGpzLkV4cHJlc3Npb24+IGl0ZW1UeXBlRXhwcmVzc2lvbiA9IF9vcHRpb25zLmV4cGVyaW1lbnROZXdSdGkKICAgICAgICA/IF9mZXRjaEl0ZW1UeXBlTmV3UnRpKAogICAgICAgICAgICBjb2RlZ2VuLCBjb21tb25FbGVtZW50cywgcmVnaXN0cnksIGVtaXR0ZXIsIGVsZW1lbnRUeXBlKQogICAgICAgIDogX2ZldGNoSXRlbVR5cGUoY29kZWdlbiwgZW1pdHRlciwgZWxlbWVudFR5cGUpOwoKICAgIEFzeW5jUmV3cml0ZXIgcmV3cml0ZXIgPSBuZXcgQXN5bmNSZXdyaXRlcihfcmVwb3J0ZXIsIGVsZW1lbnQsCiAgICAgICAgYXN5bmNTdGFydDogZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcyhzdGFydEZ1bmN0aW9uKSwKICAgICAgICBhc3luY0F3YWl0OgogICAgICAgICAgICBlbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGNvbW1vbkVsZW1lbnRzLmFzeW5jSGVscGVyQXdhaXQpLAogICAgICAgIGFzeW5jUmV0dXJuOgogICAgICAgICAgICBlbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGNvbW1vbkVsZW1lbnRzLmFzeW5jSGVscGVyUmV0dXJuKSwKICAgICAgICBhc3luY1JldGhyb3c6CiAgICAgICAgICAgIGVtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoY29tbW9uRWxlbWVudHMuYXN5bmNIZWxwZXJSZXRocm93KSwKICAgICAgICB3cmFwQm9keTogZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2Vzcyhjb21tb25FbGVtZW50cy53cmFwQm9keSksCiAgICAgICAgY29tcGxldGVyRmFjdG9yeTogZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2Vzcyhjb21wbGV0ZXJGYWN0b3J5KSwKICAgICAgICBjb21wbGV0ZXJGYWN0b3J5VHlwZUFyZ3VtZW50czogaXRlbVR5cGVFeHByZXNzaW9uLAogICAgICAgIHNhZmVWYXJpYWJsZU5hbWU6IG5hbWVyLnNhZmVWYXJpYWJsZVByZWZpeEZvckFzeW5jUmV3cml0ZSwKICAgICAgICBib2R5TmFtZTogbmFtZXIuZGVyaXZlQXN5bmNCb2R5TmFtZShuYW1lKSk7CgogICAgcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoCiAgICAgICAgY29tcGxldGVyRmFjdG9yeSwKICAgICAgICBjb25zdCBDYWxsU3RydWN0dXJlLnVubmFtZWQoMCwgMSksCiAgICAgICAgW2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvbkFzeW5jT3JTeW5jU3RhckVsZW1lbnRUeXBlKGVsZW1lbnQpXSkpOwoKICAgIHJldHVybiByZXdyaXRlcjsKICB9CgogIFN5bmNTdGFyUmV3cml0ZXIgX21ha2VTeW5jU3RhclJld3JpdGVyKAogICAgICBDb2RlZ2VuSW5wdXRzIGNvZGVnZW4sCiAgICAgIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBKRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgQ29kZWdlblJlZ2lzdHJ5IHJlZ2lzdHJ5LAogICAgICBNb2R1bGFyTmFtZXIgbmFtZXIsCiAgICAgIE1vZHVsYXJFbWl0dGVyIGVtaXR0ZXIsCiAgICAgIEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsCiAgICAgIGpzLkV4cHJlc3Npb24gY29kZSwKICAgICAgRGFydFR5cGUgYXN5bmNUeXBlUGFyYW1ldGVyLAogICAgICBqcy5OYW1lIG5hbWUpIHsKICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gaXRlbVR5cGVFeHByZXNzaW9uID0gX29wdGlvbnMuZXhwZXJpbWVudE5ld1J0aQogICAgICAgID8gX2ZldGNoSXRlbVR5cGVOZXdSdGkoCiAgICAgICAgICAgIGNvZGVnZW4sIGNvbW1vbkVsZW1lbnRzLCByZWdpc3RyeSwgZW1pdHRlciwgYXN5bmNUeXBlUGFyYW1ldGVyKQogICAgICAgIDogX2ZldGNoSXRlbVR5cGUoY29kZWdlbiwgZW1pdHRlciwgYXN5bmNUeXBlUGFyYW1ldGVyKTsKCiAgICBTeW5jU3RhclJld3JpdGVyIHJld3JpdGVyID0gbmV3IFN5bmNTdGFyUmV3cml0ZXIoX3JlcG9ydGVyLCBlbGVtZW50LAogICAgICAgIGVuZE9mSXRlcmF0aW9uOgogICAgICAgICAgICBlbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGNvbW1vbkVsZW1lbnRzLmVuZE9mSXRlcmF0aW9uKSwKICAgICAgICBpdGVyYWJsZUZhY3Rvcnk6IGVtaXR0ZXIKICAgICAgICAgICAgLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGNvbW1vbkVsZW1lbnRzLnN5bmNTdGFySXRlcmFibGVGYWN0b3J5KSwKICAgICAgICBpdGVyYWJsZUZhY3RvcnlUeXBlQXJndW1lbnRzOiBpdGVtVHlwZUV4cHJlc3Npb24sCiAgICAgICAgeWllbGRTdGFyRXhwcmVzc2lvbjoKICAgICAgICAgICAgZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2Vzcyhjb21tb25FbGVtZW50cy55aWVsZFN0YXIpLAogICAgICAgIHVuY2F1Z2h0RXJyb3JFeHByZXNzaW9uOgogICAgICAgICAgICBlbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGNvbW1vbkVsZW1lbnRzLnN5bmNTdGFyVW5jYXVnaHRFcnJvciksCiAgICAgICAgc2FmZVZhcmlhYmxlTmFtZTogbmFtZXIuc2FmZVZhcmlhYmxlUHJlZml4Rm9yQXN5bmNSZXdyaXRlLAogICAgICAgIGJvZHlOYW1lOiBuYW1lci5kZXJpdmVBc3luY0JvZHlOYW1lKG5hbWUpKTsKCiAgICByZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICBjb21tb25FbGVtZW50cy5zeW5jU3Rhckl0ZXJhYmxlRmFjdG9yeSwKICAgICAgICBjb25zdCBDYWxsU3RydWN0dXJlLnVubmFtZWQoMSwgMSksCiAgICAgICAgW2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvbkFzeW5jT3JTeW5jU3RhckVsZW1lbnRUeXBlKGVsZW1lbnQpXSkpOwoKICAgIHJldHVybiByZXdyaXRlcjsKICB9CgogIEFzeW5jU3RhclJld3JpdGVyIF9tYWtlQXN5bmNTdGFyUmV3cml0ZXIoCiAgICAgIENvZGVnZW5JbnB1dHMgY29kZWdlbiwKICAgICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50LAogICAgICBDb2RlZ2VuUmVnaXN0cnkgcmVnaXN0cnksCiAgICAgIE1vZHVsYXJOYW1lciBuYW1lciwKICAgICAgTW9kdWxhckVtaXR0ZXIgZW1pdHRlciwKICAgICAgRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwKICAgICAganMuRXhwcmVzc2lvbiBjb2RlLAogICAgICBEYXJ0VHlwZSBhc3luY1R5cGVQYXJhbWV0ZXIsCiAgICAgIGpzLk5hbWUgbmFtZSkgewogICAgTGlzdDxqcy5FeHByZXNzaW9uPiBpdGVtVHlwZUV4cHJlc3Npb24gPSBfb3B0aW9ucy5leHBlcmltZW50TmV3UnRpCiAgICAgICAgPyBfZmV0Y2hJdGVtVHlwZU5ld1J0aSgKICAgICAgICAgICAgY29kZWdlbiwgY29tbW9uRWxlbWVudHMsIHJlZ2lzdHJ5LCBlbWl0dGVyLCBhc3luY1R5cGVQYXJhbWV0ZXIpCiAgICAgICAgOiBfZmV0Y2hJdGVtVHlwZShjb2RlZ2VuLCBlbWl0dGVyLCBhc3luY1R5cGVQYXJhbWV0ZXIpOwoKICAgIEFzeW5jU3RhclJld3JpdGVyIHJld3JpdGVyID0gbmV3IEFzeW5jU3RhclJld3JpdGVyKF9yZXBvcnRlciwgZWxlbWVudCwKICAgICAgICBhc3luY1N0YXJIZWxwZXI6CiAgICAgICAgICAgIGVtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoY29tbW9uRWxlbWVudHMuYXN5bmNTdGFySGVscGVyKSwKICAgICAgICBzdHJlYW1PZkNvbnRyb2xsZXI6CiAgICAgICAgICAgIGVtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoY29tbW9uRWxlbWVudHMuc3RyZWFtT2ZDb250cm9sbGVyKSwKICAgICAgICB3cmFwQm9keTogZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2Vzcyhjb21tb25FbGVtZW50cy53cmFwQm9keSksCiAgICAgICAgbmV3Q29udHJvbGxlcjogZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcygKICAgICAgICAgICAgY29tbW9uRWxlbWVudHMuYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckZhY3RvcnkpLAogICAgICAgIG5ld0NvbnRyb2xsZXJUeXBlQXJndW1lbnRzOiBpdGVtVHlwZUV4cHJlc3Npb24sCiAgICAgICAgc2FmZVZhcmlhYmxlTmFtZTogbmFtZXIuc2FmZVZhcmlhYmxlUHJlZml4Rm9yQXN5bmNSZXdyaXRlLAogICAgICAgIHlpZWxkRXhwcmVzc2lvbjoKICAgICAgICAgICAgZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2Vzcyhjb21tb25FbGVtZW50cy55aWVsZFNpbmdsZSksCiAgICAgICAgeWllbGRTdGFyRXhwcmVzc2lvbjoKICAgICAgICAgICAgZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2Vzcyhjb21tb25FbGVtZW50cy55aWVsZFN0YXIpLAogICAgICAgIGJvZHlOYW1lOiBuYW1lci5kZXJpdmVBc3luY0JvZHlOYW1lKG5hbWUpKTsKCiAgICByZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICBjb21tb25FbGVtZW50cy5hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyRmFjdG9yeSwKICAgICAgICBjb25zdCBDYWxsU3RydWN0dXJlLnVubmFtZWQoMSwgMSksCiAgICAgICAgW2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvbkFzeW5jT3JTeW5jU3RhckVsZW1lbnRUeXBlKGVsZW1lbnQpXSkpOwoKICAgIHJldHVybiByZXdyaXRlcjsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENvbXBpbGVyVGFzaz4gZ2V0IHRhc2tzIHsKICAgIHJldHVybiA8Q29tcGlsZXJUYXNrPltfYnVpbGRlciwgb3B0aW1pemVyLCBnZW5lcmF0b3JdOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgU3NhQnVpbGRlciB7CiAgLy8vIENyZWF0ZXMgdGhlIFtIR3JhcGhdIGZvciBbbWVtYmVyXSBvciByZXR1cm5zIGBudWxsYCBpZiBubyBjb2RlIGlzIG5lZWRlZAogIC8vLyBmb3IgW21lbWJlcl0uCiAgSEdyYXBoIGJ1aWxkKAogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMsCiAgICAgIENvZGVnZW5JbnB1dHMgY29kZWdlbiwKICAgICAgQ29kZWdlblJlZ2lzdHJ5IHJlZ2lzdHJ5LAogICAgICBNb2R1bGFyTmFtZXIgbmFtZXIsCiAgICAgIE1vZHVsYXJFbWl0dGVyIGVtaXR0ZXIpOwp9CgpjbGFzcyBTc2FCdWlsZGVyVGFzayBleHRlbmRzIENvbXBpbGVyVGFzayB7CiAgZmluYWwgQmFja2VuZFN0cmF0ZWd5IF9iYWNrZW5kU3RyYXRlZ3k7CiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSBfc291cmNlSW5mb3JtYXRpb25GYWN0b3J5OwogIFNzYUJ1aWxkZXIgX2J1aWxkZXI7CgogIFNzYUJ1aWxkZXJUYXNrKAogICAgICBNZWFzdXJlciBtZWFzdXJlciwgdGhpcy5fYmFja2VuZFN0cmF0ZWd5LCB0aGlzLl9zb3VyY2VJbmZvcm1hdGlvbkZhY3RvcnkpCiAgICAgIDogc3VwZXIobWVhc3VyZXIpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJ1NTQSBidWlsZGVyJzsKCiAgdm9pZCBvbkNvZGVnZW5TdGFydCgpIHsKICAgIF9idWlsZGVyID0KICAgICAgICBfYmFja2VuZFN0cmF0ZWd5LmNyZWF0ZVNzYUJ1aWxkZXIodGhpcywgX3NvdXJjZUluZm9ybWF0aW9uRmFjdG9yeSk7CiAgfQoKICAvLy8gQ3JlYXRlcyB0aGUgW0hHcmFwaF0gZm9yIFttZW1iZXJdIG9yIHJldHVybnMgYG51bGxgIGlmIG5vIGNvZGUgaXMgbmVlZGVkCiAgLy8vIGZvciBbbWVtYmVyXS4KICBIR3JhcGggYnVpbGQoCiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywKICAgICAgQ29kZWdlbklucHV0cyBjb2RlZ2VuLAogICAgICBDb2RlZ2VuUmVnaXN0cnkgcmVnaXN0cnksCiAgICAgIE1vZHVsYXJOYW1lciBuYW1lciwKICAgICAgTW9kdWxhckVtaXR0ZXIgZW1pdHRlcikgewogICAgcmV0dXJuIF9idWlsZGVyLmJ1aWxkKG1lbWJlciwgY2xvc2VkV29ybGQsIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMsIGNvZGVnZW4sCiAgICAgICAgcmVnaXN0cnksIG5hbWVyLCBlbWl0dGVyKTsKICB9Cn0KgXUATk48AQ0BIxlLRTskISEoHiNKR0NNJEEaPS4qARcVGAE4IiYoISQ9NhoBFxUWJxkmLjwnQz4BDEUfNhgfBAEuOwwvRB9FOExQIEs/IwYBUC0ZIwY9LDNJIzpFHhQmKhQRExISIjU2BiwtQAYBIwQBHx0lLiAaHh4aIy8xPgEnLUEBIx4nFRwgFhMVFRIgEw8iKhUcIBYTFRUSIBMPIysVHCAWExUVEiATDwZRBAFPTTtNLiZGI00hBAEsHSUgHhcjATwgSzRCSDAhBAEkHSUuIBoeHhocFkhRAUcgRTkBQ0EUSxVMFk1JSjtDNAE7GitPARUEASodJS4gGh4eGiMWRyBMQAFJGEkhSzodRCFQQzQBOzArTwEVBAEsHSUuIBoeHhojFkcgTEABSxlKHE1JNT44QxlGHUQ0ATs5K08BFQQBDCU7BAIBHE8UEBsgOR0gGh8CASwqPRcBElAZAQwkARoPTAQBTxQQGyA5HSAaIFAjBAIBIXBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9zc2EuZGFydCtzZGtyb290Oi9wa2cvanNfYXN0L2xpYi9zcmMvcHJlY2VkZW5jZS5kYXJ0guQvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBwcmVjZWRlbmNlOwoKY29uc3QgRVhQUkVTU0lPTiA9IDA7CmNvbnN0IEFTU0lHTk1FTlQgPSBFWFBSRVNTSU9OICsgMTsKY29uc3QgTE9HSUNBTF9PUiA9IEFTU0lHTk1FTlQgKyAxOwpjb25zdCBMT0dJQ0FMX0FORCA9IExPR0lDQUxfT1IgKyAxOwpjb25zdCBCSVRfT1IgPSBMT0dJQ0FMX0FORCArIDE7CmNvbnN0IEJJVF9YT1IgPSBCSVRfT1IgKyAxOwpjb25zdCBCSVRfQU5EID0gQklUX1hPUiArIDE7CmNvbnN0IEVRVUFMSVRZID0gQklUX0FORCArIDE7CmNvbnN0IFJFTEFUSU9OQUwgPSBFUVVBTElUWSArIDE7CmNvbnN0IFNISUZUID0gUkVMQVRJT05BTCArIDE7CmNvbnN0IEFERElUSVZFID0gU0hJRlQgKyAxOwpjb25zdCBNVUxUSVBMSUNBVElWRSA9IEFERElUSVZFICsgMTsKY29uc3QgVU5BUlkgPSBNVUxUSVBMSUNBVElWRSArIDE7CmNvbnN0IENBTEwgPSBVTkFSWSArIDE7CmNvbnN0IExFRlRfSEFORF9TSURFID0gQ0FMTCArIDE7CmNvbnN0IFBSSU1BUlkgPSBMRUZUX0hBTkRfU0lERSArIDE7ChgATk48ARQBFiMjJCAcHR4hHhwlIhghJAEicGFja2FnZTpqc19hc3Qvc3JjL3ByZWNlZGVuY2UuZGFydDNzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9jb25zdGFudHMvdmFsdWVzLmRhcnTAAHZ8Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5jb25zdGFudHMudmFsdWVzOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2RlZmVycmVkX2xvYWQuZGFydCcgc2hvdyBPdXRwdXRVbml0OwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqczsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCc7CgplbnVtIENvbnN0YW50VmFsdWVLaW5kIHsKICBGVU5DVElPTiwKICBOVUxMLAogIElOVCwKICBET1VCTEUsCiAgQk9PTCwKICBTVFJJTkcsCiAgTElTVCwKICBTRVQsCiAgTUFQLAogIENPTlNUUlVDVEVELAogIFRZUEUsCiAgSU5URVJDRVBUT1IsCiAgSlNfTkFNRSwKICBEVU1NWV9JTlRFUkNFUFRPUiwKICBVTlJFQUNIQUJMRSwKICBJTlNUQU5USUFUSU9OLAogIERFRkVSUkVEX0dMT0JBTCwKICBOT05fQ09OU1RBTlQsCn0KCmFic3RyYWN0IGNsYXNzIENvbnN0YW50VmFsdWVWaXNpdG9yPFIsIEE+IHsKICBjb25zdCBDb25zdGFudFZhbHVlVmlzaXRvcigpOwoKICBSIHZpc2l0RnVuY3Rpb24oY292YXJpYW50IEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0TnVsbChjb3ZhcmlhbnQgTnVsbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIGNvdmFyaWFudCBBIGFyZyk7CiAgUiB2aXNpdEludChjb3ZhcmlhbnQgSW50Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0RG91YmxlKGNvdmFyaWFudCBEb3VibGVDb25zdGFudFZhbHVlIGNvbnN0YW50LCBjb3ZhcmlhbnQgQSBhcmcpOwogIFIgdmlzaXRCb29sKGNvdmFyaWFudCBCb29sQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0U3RyaW5nKGNvdmFyaWFudCBTdHJpbmdDb25zdGFudFZhbHVlIGNvbnN0YW50LCBjb3ZhcmlhbnQgQSBhcmcpOwogIFIgdmlzaXRMaXN0KGNvdmFyaWFudCBMaXN0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0U2V0KGNvdmFyaWFudCBTZXRDb25zdGFudFZhbHVlIGNvbnN0YW50LCBjb3ZhcmlhbnQgQSBhcmcpOwogIFIgdmlzaXRNYXAoY292YXJpYW50IE1hcENvbnN0YW50VmFsdWUgY29uc3RhbnQsIGNvdmFyaWFudCBBIGFyZyk7CiAgUiB2aXNpdENvbnN0cnVjdGVkKAogICAgICBjb3ZhcmlhbnQgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIGNvbnN0YW50LCBjb3ZhcmlhbnQgQSBhcmcpOwogIFIgdmlzaXRUeXBlKGNvdmFyaWFudCBUeXBlQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0SW50ZXJjZXB0b3IoCiAgICAgIGNvdmFyaWFudCBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgY29uc3RhbnQsIGNvdmFyaWFudCBBIGFyZyk7CiAgUiB2aXNpdER1bW15SW50ZXJjZXB0b3IoCiAgICAgIGNvdmFyaWFudCBEdW1teUludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0VW5yZWFjaGFibGUoCiAgICAgIGNvdmFyaWFudCBVbnJlYWNoYWJsZUNvbnN0YW50VmFsdWUgY29uc3RhbnQsIGNvdmFyaWFudCBBIGFyZyk7CiAgUiB2aXNpdEpzTmFtZShjb3ZhcmlhbnQgSnNOYW1lQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0RGVmZXJyZWRHbG9iYWwoCiAgICAgIGNvdmFyaWFudCBEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIGNvdmFyaWFudCBBIGFyZyk7CiAgUiB2aXNpdE5vbkNvbnN0YW50KGNvdmFyaWFudCBOb25Db25zdGFudFZhbHVlIGNvbnN0YW50LCBjb3ZhcmlhbnQgQSBhcmcpOwogIFIgdmlzaXRJbnN0YW50aWF0aW9uKAogICAgICBjb3ZhcmlhbnQgSW5zdGFudGlhdGlvbkNvbnN0YW50VmFsdWUgY29uc3RhbnQsIGNvdmFyaWFudCBBIGFyZyk7Cn0KCmFic3RyYWN0IGNsYXNzIENvbnN0YW50VmFsdWUgewogIGNvbnN0IENvbnN0YW50VmFsdWUoKTsKCiAgLy8vIGB0cnVlYCBpZiB0aGlzIGlzIGEgdmFsaWQgY29uc3RhbnQgdmFsdWUuCiAgYm9vbCBnZXQgaXNDb25zdGFudCA9PiB0cnVlOwoKICBib29sIGdldCBpc051bGwgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNCb29sID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzVHJ1ZSA9PiBmYWxzZTsKICBib29sIGdldCBpc0ZhbHNlID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzSW50ID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzRG91YmxlID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzTnVtID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzU3RyaW5nID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzTGlzdCA9PiBmYWxzZTsKICBib29sIGdldCBpc1NldCA9PiBmYWxzZTsKICBib29sIGdldCBpc01hcCA9PiBmYWxzZTsKICBib29sIGdldCBpc0NvbnN0cnVjdGVkT2JqZWN0ID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzRnVuY3Rpb24gPT4gZmFsc2U7CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnN0YW50IGlzIG51bGwsIGEgYm9vbCwgYSBudW1iZXIgb3IgYSBzdHJpbmcuCiAgYm9vbCBnZXQgaXNQcmltaXRpdmUgPT4gZmFsc2U7CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnN0YW50IGlzIGEgbGlzdCwgYSBtYXAgb3IgYSBjb25zdHJ1Y3RlZCBvYmplY3QuCiAgYm9vbCBnZXQgaXNPYmplY3QgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNUeXBlID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzSW50ZXJjZXB0b3IgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNEdW1teSA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNOYU4gPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNNaW51c1plcm8gPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNaZXJvID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzT25lID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzUG9zaXRpdmVJbmZpbml0eSA9PiBmYWxzZTsKICBib29sIGdldCBpc05lZ2F0aXZlSW5maW5pdHkgPT4gZmFsc2U7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlcGxhY2Ugd2l0aCBhICd0eXBlJyBnZXR0ZXIuCiAgRGFydFR5cGUgZ2V0VHlwZShDb21tb25FbGVtZW50cyB0eXBlcyk7CgogIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZ2V0RGVwZW5kZW5jaWVzKCk7CgogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpOwoKICAvLy8gVGhlIHZhbHVlIG9mIHRoaXMgY29uc3RhbnQgaW4gRGFydCBzeW50YXgsIGlmIHBvc3NpYmxlLgogIC8vLwogIC8vLyBGb3IgW0NvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZV1zIHRoZXJlIGlzIG5vIHdheSB0byBjcmVhdGUgYSB2YWxpZCBjb25zdAogIC8vLyBleHByZXNzaW9uIGZyb20gdGhlIHZhbHVlIHNvIHRoZSB1bnBhcnNlIG9mIHRoZXNlIGlzIGJlc3QgZWZmb3J0LgogIC8vLwogIC8vLyBGb3IgdGhlIHN5bnRoZXRpYyBjb25zdGFudHMsIFtEZWZlcnJlZENvbnN0YW50VmFsdWVdLAogIC8vLyBbRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlXSwgW1N5bnRoZXRpY0NvbnN0YW50VmFsdWVdLAogIC8vLyBbSW50ZXJjZXB0b3JDb25zdGFudFZhbHVlXSB0aGUgdW5wYXJzZSBpcyBkZXNjcmlwdGl2ZSBvbmx5LgogIFN0cmluZyB0b0RhcnRUZXh0KCk7CgogIC8vLyBSZXR1cm5zIGEgc3RydWN0dXJlZCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0YW50IHN1aXRlZCBmb3IgZGVidWdnaW5nLgogIFN0cmluZyB0b1N0cnVjdHVyZWRUZXh0KCk7CgogIENvbnN0YW50VmFsdWVLaW5kIGdldCBraW5kOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBhc3NlcnREZWJ1Z01vZGUoIlVzZSBDb25zdGFudFZhbHVlLnRvRGFydFRleHQoKSBvciAiCiAgICAgICAgIkNvbnN0YW50VmFsdWUudG9TdHJ1Y3R1cmVkVGV4dCgpICIKICAgICAgICAiaW5zdGVhZCBvZiBDb25zdGFudFZhbHVlLnRvU3RyaW5nKCkuIik7CiAgICByZXR1cm4gdG9TdHJ1Y3R1cmVkVGV4dCgpOwogIH0KfQoKY2xhc3MgRnVuY3Rpb25Db25zdGFudFZhbHVlIGV4dGVuZHMgQ29uc3RhbnRWYWx1ZSB7CiAgZmluYWwgRnVuY3Rpb25FbnRpdHkgZWxlbWVudDsKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTaG91bGQgdGhlIHR5cGUgYmUgZGVyaXZlZCBmcm9tIFtlbGVtZW50XS4KICBmaW5hbCBGdW5jdGlvblR5cGUgdHlwZTsKCiAgRnVuY3Rpb25Db25zdGFudFZhbHVlKHRoaXMuZWxlbWVudCwgdGhpcy50eXBlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNGdW5jdGlvbiA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KHZhciBvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBGdW5jdGlvbkNvbnN0YW50VmFsdWUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBpZGVudGljYWwob3RoZXIuZWxlbWVudCwgZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PENvbnN0YW50VmFsdWU+IGdldERlcGVuZGVuY2llcygpID0+IGNvbnN0IDxDb25zdGFudFZhbHVlPltdOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvblR5cGUgZ2V0VHlwZShDb21tb25FbGVtZW50cyB0eXBlcykgPT4gdHlwZTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiAoMTcgKiBlbGVtZW50Lmhhc2hDb2RlKSAmIDB4N2ZmZmZmZmY7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpID0+IHZpc2l0b3IudmlzaXRGdW5jdGlvbih0aGlzLCBhcmcpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlS2luZCBnZXQga2luZCA9PiBDb25zdGFudFZhbHVlS2luZC5GVU5DVElPTjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvRGFydFRleHQoKSB7CiAgICBpZiAoZWxlbWVudC5lbmNsb3NpbmdDbGFzcyAhPSBudWxsKSB7CiAgICAgIHJldHVybiAnJHtlbGVtZW50LmVuY2xvc2luZ0NsYXNzLm5hbWV9LiR7ZWxlbWVudC5uYW1lfSc7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJyR7ZWxlbWVudC5uYW1lfSc7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dCgpIHsKICAgIHJldHVybiAnRnVuY3Rpb25Db25zdGFudCgke3RvRGFydFRleHQoKX0pJzsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIFByaW1pdGl2ZUNvbnN0YW50VmFsdWUgZXh0ZW5kcyBDb25zdGFudFZhbHVlIHsKICBjb25zdCBQcmltaXRpdmVDb25zdGFudFZhbHVlKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUHJpbWl0aXZlID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0odmFyIG90aGVyKSB7CiAgICAvLyBNYWtpbmcgdGhpcyBtZXRob2QgYWJzdHJhY3QgZG9lcyBub3QgZ2l2ZSB1cyBhbiBlcnJvci4KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdQcmltaXRpdmVDb25zdGFudC49PScpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignUHJpbWl0aXZlQ29uc3RhbnQuaGFzaENvZGUnKTsKCiAgLy8gUHJpbWl0aXZlIGNvbnN0YW50cyBkb24ndCBoYXZlIGRlcGVuZGVuY2llcy4KICBAb3ZlcnJpZGUKICBMaXN0PENvbnN0YW50VmFsdWU+IGdldERlcGVuZGVuY2llcygpID0+IGNvbnN0IDxDb25zdGFudFZhbHVlPltdOwp9CgpjbGFzcyBOdWxsQ29uc3RhbnRWYWx1ZSBleHRlbmRzIFByaW1pdGl2ZUNvbnN0YW50VmFsdWUgewogIC8vLyBUaGUgdmFsdWUgYSBEYXJ0IG51bGwgaXMgY29tcGlsZWQgdG8gaW4gSmF2YVNjcmlwdC4KICBzdGF0aWMgY29uc3QgU3RyaW5nIEpzTnVsbCA9ICJudWxsIjsKCiAgY29uc3QgZmFjdG9yeSBOdWxsQ29uc3RhbnRWYWx1ZSgpID0gTnVsbENvbnN0YW50VmFsdWUuX2ludGVybmFsOwoKICBjb25zdCBOdWxsQ29uc3RhbnRWYWx1ZS5faW50ZXJuYWwoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsID0+IHRydWU7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGUoQ29tbW9uRWxlbWVudHMgdHlwZXMpID0+IHR5cGVzLm51bGxUeXBlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PiBvdGhlciBpcyBOdWxsQ29uc3RhbnRWYWx1ZTsKCiAgLy8gVGhlIG1hZ2ljIGNvbnN0YW50IGhhcyBubyBtZWFuaW5nLiBJdCBpcyBqdXN0IGEgcmFuZG9tIHZhbHVlLgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gNzg1OTY1ODI1OwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRWYWx1ZVZpc2l0b3IgdmlzaXRvciwgYXJnKSA9PiB2aXNpdG9yLnZpc2l0TnVsbCh0aGlzLCBhcmcpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlS2luZCBnZXQga2luZCA9PiBDb25zdGFudFZhbHVlS2luZC5OVUxMOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dCgpID0+ICdOdWxsQ29uc3RhbnQnOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9EYXJ0VGV4dCgpID0+ICdudWxsJzsKfQoKYWJzdHJhY3QgY2xhc3MgTnVtQ29uc3RhbnRWYWx1ZSBleHRlbmRzIFByaW1pdGl2ZUNvbnN0YW50VmFsdWUgewogIGRvdWJsZSBnZXQgZG91YmxlVmFsdWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTnVtID0+IHRydWU7CgogIGNvbnN0IE51bUNvbnN0YW50VmFsdWUoKTsKfQoKY2xhc3MgSW50Q29uc3RhbnRWYWx1ZSBleHRlbmRzIE51bUNvbnN0YW50VmFsdWUgewogIGZpbmFsIEJpZ0ludCBpbnRWYWx1ZTsKCiAgLy8gQ2FjaGluZyBJbnRDb25zdGFudFZhbHVlcyByZXByZXNlbnRpbmcgLTIgdGhyb3VnaCAxMCBzbyB0aGF0IHdlIGRvbid0IGhhdmUKICAvLyB0byBjcmVhdGUgbmV3IG9uZXMgZXZlcnkgdGltZSB0aG9zZSB2YWx1ZXMgYXJlIHVzZWQuCiAgc3RhdGljIE1hcDxCaWdJbnQsIEludENvbnN0YW50VmFsdWU+IF9jYWNoZWRWYWx1ZXMgPSB7fTsKCiAgQG92ZXJyaWRlCiAgZG91YmxlIGdldCBkb3VibGVWYWx1ZSA9PiBpbnRWYWx1ZS50b0RvdWJsZSgpOwoKICBmYWN0b3J5IEludENvbnN0YW50VmFsdWUoQmlnSW50IHZhbHVlKSB7CiAgICB2YXIgZXhpc3RpbmcgPSBfY2FjaGVkVmFsdWVzW3ZhbHVlXTsKICAgIGlmIChleGlzdGluZyAhPSBudWxsKSByZXR1cm4gZXhpc3Rpbmc7CiAgICB2YXIgaW50Q29uc3RhbnRWYWwgPSBuZXcgSW50Q29uc3RhbnRWYWx1ZS5faW50ZXJuYWwodmFsdWUpOwogICAgdmFyIGludFZhbHVlID0gdmFsdWUudG9JbnQoKTsKICAgIGlmIChpbnRWYWx1ZSA8PSAtMiAmJiBpbnRWYWx1ZSA+PSAxMCkgewogICAgICBfY2FjaGVkVmFsdWVzW3ZhbHVlXSA9IGludENvbnN0YW50VmFsOwogICAgfQogICAgcmV0dXJuIGludENvbnN0YW50VmFsOwogIH0KCiAgY29uc3QgSW50Q29uc3RhbnRWYWx1ZS5faW50ZXJuYWwodGhpcy5pbnRWYWx1ZSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSW50ID0+IHRydWU7CgogIGJvb2wgaXNVSW50MzEoKSA9PiBpbnRWYWx1ZS50b1Vuc2lnbmVkKDMxKSA9PSBpbnRWYWx1ZTsKCiAgYm9vbCBpc1VJbnQzMigpID0+IGludFZhbHVlLnRvVW5zaWduZWQoMzIpID09IGludFZhbHVlOwoKICBib29sIGlzUG9zaXRpdmUoKSA9PiBpbnRWYWx1ZSA+PSBCaWdJbnQuemVybzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNaZXJvID0+IGludFZhbHVlID09IEJpZ0ludC56ZXJvOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc09uZSA9PiBpbnRWYWx1ZSA9PSBCaWdJbnQub25lOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRUeXBlKENvbW1vbkVsZW1lbnRzIHR5cGVzKSA9PiB0eXBlcy5pbnRUeXBlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KHZhciBvdGhlcikgewogICAgLy8gSW50cyBhbmQgZG91YmxlcyBhcmUgdHJlYXRlZCBhcyBzZXBhcmF0ZSBjb25zdGFudHMuCiAgICBpZiAob3RoZXIgaXMhIEludENvbnN0YW50VmFsdWUpIHJldHVybiBmYWxzZTsKICAgIEludENvbnN0YW50VmFsdWUgb3RoZXJJbnQgPSBvdGhlcjsKICAgIHJldHVybiBpbnRWYWx1ZSA9PSBvdGhlckludC5pbnRWYWx1ZTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gaW50VmFsdWUuaGFzaENvZGUgJiBIYXNoaW5nLlNNSV9NQVNLOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRWYWx1ZVZpc2l0b3IgdmlzaXRvciwgYXJnKSA9PiB2aXNpdG9yLnZpc2l0SW50KHRoaXMsIGFyZyk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWVLaW5kIGdldCBraW5kID0+IENvbnN0YW50VmFsdWVLaW5kLklOVDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSA9PiAnSW50Q29uc3RhbnQoJHt0b0RhcnRUZXh0KCl9KSc7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b0RhcnRUZXh0KCkgPT4gaW50VmFsdWUudG9TdHJpbmcoKTsKfQoKY2xhc3MgRG91YmxlQ29uc3RhbnRWYWx1ZSBleHRlbmRzIE51bUNvbnN0YW50VmFsdWUgewogIEBvdmVycmlkZQogIGZpbmFsIGRvdWJsZSBkb3VibGVWYWx1ZTsKCiAgZmFjdG9yeSBEb3VibGVDb25zdGFudFZhbHVlKGRvdWJsZSB2YWx1ZSkgewogICAgaWYgKHZhbHVlLmlzTmFOKSB7CiAgICAgIHJldHVybiBjb25zdCBEb3VibGVDb25zdGFudFZhbHVlLl9pbnRlcm5hbChkb3VibGUubmFuKTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gZG91YmxlLmluZmluaXR5KSB7CiAgICAgIHJldHVybiBjb25zdCBEb3VibGVDb25zdGFudFZhbHVlLl9pbnRlcm5hbChkb3VibGUuaW5maW5pdHkpOwogICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtZG91YmxlLmluZmluaXR5KSB7CiAgICAgIHJldHVybiBjb25zdCBEb3VibGVDb25zdGFudFZhbHVlLl9pbnRlcm5hbCgtZG91YmxlLmluZmluaXR5KTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gMC4wICYmICF2YWx1ZS5pc05lZ2F0aXZlKSB7CiAgICAgIHJldHVybiBjb25zdCBEb3VibGVDb25zdGFudFZhbHVlLl9pbnRlcm5hbCgwLjApOwogICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAxLjApIHsKICAgICAgcmV0dXJuIGNvbnN0IERvdWJsZUNvbnN0YW50VmFsdWUuX2ludGVybmFsKDEuMCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IERvdWJsZUNvbnN0YW50VmFsdWUuX2ludGVybmFsKHZhbHVlKTsKICAgIH0KICB9CgogIGNvbnN0IERvdWJsZUNvbnN0YW50VmFsdWUuX2ludGVybmFsKHRoaXMuZG91YmxlVmFsdWUpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0RvdWJsZSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05hTiA9PiBkb3VibGVWYWx1ZS5pc05hTjsKCiAgLy8gV2UgbmVlZCB0byBjaGVjayBmb3IgdGhlIG5lZ2F0aXZlIHNpZ24gc2luY2UgLTAuMCA9PSAwLjAuCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNNaW51c1plcm8gPT4gZG91YmxlVmFsdWUgPT0gMC4wICYmIGRvdWJsZVZhbHVlLmlzTmVnYXRpdmU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzWmVybyA9PiBkb3VibGVWYWx1ZSA9PSAwLjA7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzT25lID0+IGRvdWJsZVZhbHVlID09IDEuMDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNQb3NpdGl2ZUluZmluaXR5ID0+IGRvdWJsZVZhbHVlID09IGRvdWJsZS5pbmZpbml0eTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOZWdhdGl2ZUluZmluaXR5ID0+IGRvdWJsZVZhbHVlID09IC1kb3VibGUuaW5maW5pdHk7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGUoQ29tbW9uRWxlbWVudHMgdHlwZXMpID0+IHR5cGVzLmRvdWJsZVR5cGU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0odmFyIG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIERvdWJsZUNvbnN0YW50VmFsdWUpIHJldHVybiBmYWxzZTsKICAgIERvdWJsZUNvbnN0YW50VmFsdWUgb3RoZXJEb3VibGUgPSBvdGhlcjsKICAgIGRvdWJsZSBvdGhlclZhbHVlID0gb3RoZXJEb3VibGUuZG91YmxlVmFsdWU7CiAgICBpZiAoZG91YmxlVmFsdWUgPT0gMC4wICYmIG90aGVyVmFsdWUgPT0gMC4wKSB7CiAgICAgIHJldHVybiBkb3VibGVWYWx1ZS5pc05lZ2F0aXZlID09IG90aGVyVmFsdWUuaXNOZWdhdGl2ZTsKICAgIH0gZWxzZSBpZiAoZG91YmxlVmFsdWUuaXNOYU4pIHsKICAgICAgcmV0dXJuIG90aGVyVmFsdWUuaXNOYU47CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZG91YmxlVmFsdWUgPT0gb3RoZXJWYWx1ZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gZG91YmxlVmFsdWUuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpID0+IHZpc2l0b3IudmlzaXREb3VibGUodGhpcywgYXJnKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZUtpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRWYWx1ZUtpbmQuRE9VQkxFOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dCgpID0+ICdEb3VibGVDb25zdGFudCgke3RvRGFydFRleHQoKX0pJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvRGFydFRleHQoKSA9PiBkb3VibGVWYWx1ZS50b1N0cmluZygpOwp9CgphYnN0cmFjdCBjbGFzcyBCb29sQ29uc3RhbnRWYWx1ZSBleHRlbmRzIFByaW1pdGl2ZUNvbnN0YW50VmFsdWUgewogIGZhY3RvcnkgQm9vbENvbnN0YW50VmFsdWUodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSA/IG5ldyBUcnVlQ29uc3RhbnRWYWx1ZSgpIDogbmV3IEZhbHNlQ29uc3RhbnRWYWx1ZSgpOwogIH0KCiAgY29uc3QgQm9vbENvbnN0YW50VmFsdWUuX2ludGVybmFsKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQm9vbCA9PiB0cnVlOwoKICBib29sIGdldCBib29sVmFsdWU7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGUoQ29tbW9uRWxlbWVudHMgdHlwZXMpID0+IHR5cGVzLmJvb2xUeXBlOwoKICBCb29sQ29uc3RhbnRWYWx1ZSBuZWdhdGUoKTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50VmFsdWVWaXNpdG9yIHZpc2l0b3IsIGFyZykgPT4gdmlzaXRvci52aXNpdEJvb2wodGhpcywgYXJnKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZUtpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRWYWx1ZUtpbmQuQk9PTDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSA9PiAnQm9vbENvbnN0YW50KCR7dG9EYXJ0VGV4dCgpfSknOwp9CgpjbGFzcyBUcnVlQ29uc3RhbnRWYWx1ZSBleHRlbmRzIEJvb2xDb25zdGFudFZhbHVlIHsKICBmYWN0b3J5IFRydWVDb25zdGFudFZhbHVlKCkgPT4gY29uc3QgVHJ1ZUNvbnN0YW50VmFsdWUuX2ludGVybmFsKCk7CgogIGNvbnN0IFRydWVDb25zdGFudFZhbHVlLl9pbnRlcm5hbCgpIDogc3VwZXIuX2ludGVybmFsKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVHJ1ZSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBib29sVmFsdWUgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgRmFsc2VDb25zdGFudFZhbHVlIG5lZ2F0ZSgpID0+IG5ldyBGYWxzZUNvbnN0YW50VmFsdWUoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PSh2YXIgb3RoZXIpID0+IGlkZW50aWNhbCh0aGlzLCBvdGhlcik7CgogIC8vIFRoZSBtYWdpYyBjb25zdGFudCBpcyBqdXN0IGEgcmFuZG9tIHZhbHVlLiBJdCBkb2VzIG5vdCBoYXZlIGFueQogIC8vIHNpZ25pZmljYW5jZS4KICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IDQ5OTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvRGFydFRleHQoKSA9PiBib29sVmFsdWUudG9TdHJpbmcoKTsKfQoKY2xhc3MgRmFsc2VDb25zdGFudFZhbHVlIGV4dGVuZHMgQm9vbENvbnN0YW50VmFsdWUgewogIGZhY3RvcnkgRmFsc2VDb25zdGFudFZhbHVlKCkgPT4gY29uc3QgRmFsc2VDb25zdGFudFZhbHVlLl9pbnRlcm5hbCgpOwoKICBjb25zdCBGYWxzZUNvbnN0YW50VmFsdWUuX2ludGVybmFsKCkgOiBzdXBlci5faW50ZXJuYWwoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNGYWxzZSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBib29sVmFsdWUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFRydWVDb25zdGFudFZhbHVlIG5lZ2F0ZSgpID0+IG5ldyBUcnVlQ29uc3RhbnRWYWx1ZSgpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KHZhciBvdGhlcikgPT4gaWRlbnRpY2FsKHRoaXMsIG90aGVyKTsKCiAgLy8gVGhlIG1hZ2ljIGNvbnN0YW50IGlzIGp1c3QgYSByYW5kb20gdmFsdWUuIEl0IGRvZXMgbm90IGhhdmUgYW55CiAgLy8gc2lnbmlmaWNhbmNlLgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gNTM2NTU1OTc1OwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9EYXJ0VGV4dCgpID0+IGJvb2xWYWx1ZS50b1N0cmluZygpOwp9CgpjbGFzcyBTdHJpbmdDb25zdGFudFZhbHVlIGV4dGVuZHMgUHJpbWl0aXZlQ29uc3RhbnRWYWx1ZSB7CiAgZmluYWwgU3RyaW5nIHN0cmluZ1ZhbHVlOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGU7CgogIC8vIFRPRE8oZmxvaXRzY2gpOiBjYWNoZSBTdHJpbmdDb25zdGFudHMuCiAgU3RyaW5nQ29uc3RhbnRWYWx1ZShTdHJpbmcgdmFsdWUpCiAgICAgIDogdGhpcy5zdHJpbmdWYWx1ZSA9IHZhbHVlLAogICAgICAgIHRoaXMuaGFzaENvZGUgPSB2YWx1ZS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTdHJpbmcgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0VHlwZShDb21tb25FbGVtZW50cyB0eXBlcykgPT4gdHlwZXMuc3RyaW5nVHlwZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PSh2YXIgb3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgU3RyaW5nQ29uc3RhbnRWYWx1ZSkgcmV0dXJuIGZhbHNlOwogICAgU3RyaW5nQ29uc3RhbnRWYWx1ZSBvdGhlclN0cmluZyA9IG90aGVyOwogICAgcmV0dXJuIGhhc2hDb2RlID09IG90aGVyU3RyaW5nLmhhc2hDb2RlICYmCiAgICAgICAgc3RyaW5nVmFsdWUgPT0gb3RoZXJTdHJpbmcuc3RyaW5nVmFsdWU7CiAgfQoKICBTdHJpbmcgdG9EYXJ0U3RyaW5nKCkgPT4gc3RyaW5nVmFsdWU7CgogIGludCBnZXQgbGVuZ3RoID0+IHN0cmluZ1ZhbHVlLmxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50VmFsdWVWaXNpdG9yIHZpc2l0b3IsIGFyZykgPT4gdmlzaXRvci52aXNpdFN0cmluZyh0aGlzLCBhcmcpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlS2luZCBnZXQga2luZCA9PiBDb25zdGFudFZhbHVlS2luZC5TVFJJTkc7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEVuc3VyZSBjb3JyZWN0IGVzY2FwaW5nLgogIEBvdmVycmlkZQogIFN0cmluZyB0b0RhcnRUZXh0KCkgPT4gJyIke3N0cmluZ1ZhbHVlfSInOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dCgpID0+ICdTdHJpbmdDb25zdGFudCgke3RvRGFydFRleHQoKX0pJzsKfQoKYWJzdHJhY3QgY2xhc3MgT2JqZWN0Q29uc3RhbnRWYWx1ZSBleHRlbmRzIENvbnN0YW50VmFsdWUgewogIGZpbmFsIEludGVyZmFjZVR5cGUgdHlwZTsKCiAgT2JqZWN0Q29uc3RhbnRWYWx1ZSh0aGlzLnR5cGUpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc09iamVjdCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRUeXBlKENvbW1vbkVsZW1lbnRzIHR5cGVzKSA9PiB0eXBlOwoKICB2b2lkIF91bnBhcnNlVHlwZUFyZ3VtZW50cyhTdHJpbmdCdWZmZXIgc2IpIHsKICAgIGlmICghdHlwZS50cmVhdEFzUmF3KSB7CiAgICAgIHNiLndyaXRlKCc8Jyk7CiAgICAgIHNiLndyaXRlKHR5cGUudHlwZUFyZ3VtZW50cy5qb2luKCcsICcpKTsKICAgICAgc2Iud3JpdGUoJz4nKTsKICAgIH0KICB9Cn0KCmNsYXNzIFR5cGVDb25zdGFudFZhbHVlIGV4dGVuZHMgT2JqZWN0Q29uc3RhbnRWYWx1ZSB7CiAgLy8vIFRoZSB1c2VyIHR5cGUgdGhhdCB0aGlzIGNvbnN0YW50IHJlcHJlc2VudHMuCiAgZmluYWwgRGFydFR5cGUgcmVwcmVzZW50ZWRUeXBlOwoKICBUeXBlQ29uc3RhbnRWYWx1ZSh0aGlzLnJlcHJlc2VudGVkVHlwZSwgSW50ZXJmYWNlVHlwZSB0eXBlKSA6IHN1cGVyKHR5cGUpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1R5cGUgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIFR5cGVDb25zdGFudFZhbHVlICYmCiAgICAgICAgcmVwcmVzZW50ZWRUeXBlLnVuYWxpYXNlZCA9PSBvdGhlci5yZXByZXNlbnRlZFR5cGUudW5hbGlhc2VkOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiByZXByZXNlbnRlZFR5cGUudW5hbGlhc2VkLmhhc2hDb2RlICogMTM7CgogIEBvdmVycmlkZQogIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZ2V0RGVwZW5kZW5jaWVzKCkgPT4gY29uc3QgPENvbnN0YW50VmFsdWU+W107CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpID0+IHZpc2l0b3IudmlzaXRUeXBlKHRoaXMsIGFyZyk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWVLaW5kIGdldCBraW5kID0+IENvbnN0YW50VmFsdWVLaW5kLlRZUEU7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b0RhcnRUZXh0KCkgPT4gJyRyZXByZXNlbnRlZFR5cGUnOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dCgpID0+ICdUeXBlQ29uc3RhbnQoJHtyZXByZXNlbnRlZFR5cGV9KSc7Cn0KCmNsYXNzIExpc3RDb25zdGFudFZhbHVlIGV4dGVuZHMgT2JqZWN0Q29uc3RhbnRWYWx1ZSB7CiAgZmluYWwgTGlzdDxDb25zdGFudFZhbHVlPiBlbnRyaWVzOwogIEBvdmVycmlkZQogIGZpbmFsIGludCBoYXNoQ29kZTsKCiAgTGlzdENvbnN0YW50VmFsdWUoSW50ZXJmYWNlVHlwZSB0eXBlLCBMaXN0PENvbnN0YW50VmFsdWU+IGVudHJpZXMpCiAgICAgIDogdGhpcy5lbnRyaWVzID0gZW50cmllcywKICAgICAgICBoYXNoQ29kZSA9IEhhc2hpbmcubGlzdEhhc2goZW50cmllcywgSGFzaGluZy5vYmplY3RIYXNoKHR5cGUpKSwKICAgICAgICBzdXBlcih0eXBlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNMaXN0ID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0odmFyIG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIExpc3RDb25zdGFudFZhbHVlKSByZXR1cm4gZmFsc2U7CiAgICBMaXN0Q29uc3RhbnRWYWx1ZSBvdGhlckxpc3QgPSBvdGhlcjsKICAgIGlmIChoYXNoQ29kZSAhPSBvdGhlckxpc3QuaGFzaENvZGUpIHJldHVybiBmYWxzZTsKICAgIGlmICh0eXBlICE9IG90aGVyTGlzdC50eXBlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZW50cmllcy5sZW5ndGggIT0gb3RoZXJMaXN0LmVudHJpZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGVudHJpZXNbaV0gIT0gb3RoZXJMaXN0LmVudHJpZXNbaV0pIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxDb25zdGFudFZhbHVlPiBnZXREZXBlbmRlbmNpZXMoKSA9PiBlbnRyaWVzOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBlbnRyaWVzLmxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50VmFsdWVWaXNpdG9yIHZpc2l0b3IsIGFyZykgPT4gdmlzaXRvci52aXNpdExpc3QodGhpcywgYXJnKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZUtpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRWYWx1ZUtpbmQuTElTVDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvRGFydFRleHQoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBfdW5wYXJzZVR5cGVBcmd1bWVudHMoc2IpOwogICAgc2Iud3JpdGUoJ1snKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGkgPiAwKSBzYi53cml0ZSgnLCcpOwogICAgICBzYi53cml0ZShlbnRyaWVzW2ldLnRvRGFydFRleHQoKSk7CiAgICB9CiAgICBzYi53cml0ZSgnXScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dCgpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdMaXN0Q29uc3RhbnQoJyk7CiAgICBfdW5wYXJzZVR5cGVBcmd1bWVudHMoc2IpOwogICAgc2Iud3JpdGUoJ1snKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGkgPiAwKSBzYi53cml0ZSgnLCAnKTsKICAgICAgc2Iud3JpdGUoZW50cmllc1tpXS50b1N0cnVjdHVyZWRUZXh0KCkpOwogICAgfQogICAgc2Iud3JpdGUoJ10pJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIFNldENvbnN0YW50VmFsdWUgZXh0ZW5kcyBPYmplY3RDb25zdGFudFZhbHVlIHsKICBmaW5hbCBMaXN0PENvbnN0YW50VmFsdWU+IHZhbHVlczsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGU7CgogIFNldENvbnN0YW50VmFsdWUoSW50ZXJmYWNlVHlwZSB0eXBlLCBMaXN0PENvbnN0YW50VmFsdWU+IHZhbHVlcykKICAgICAgOiB2YWx1ZXMgPSB2YWx1ZXMsCiAgICAgICAgaGFzaENvZGUgPSBIYXNoaW5nLmxpc3RIYXNoKHZhbHVlcywgSGFzaGluZy5vYmplY3RIYXNoKHR5cGUpKSwKICAgICAgICBzdXBlcih0eXBlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTZXQgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PSh2YXIgb3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgU2V0Q29uc3RhbnRWYWx1ZSkgcmV0dXJuIGZhbHNlOwogICAgU2V0Q29uc3RhbnRWYWx1ZSBvdGhlclNldCA9IG90aGVyOwogICAgaWYgKGhhc2hDb2RlICE9IG90aGVyU2V0Lmhhc2hDb2RlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAodHlwZSAhPSBvdGhlclNldC50eXBlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAobGVuZ3RoICE9IG90aGVyU2V0Lmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHZhbHVlc1tpXSAhPSBvdGhlclNldC52YWx1ZXNbaV0pIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxDb25zdGFudFZhbHVlPiBnZXREZXBlbmRlbmNpZXMoKSA9PiB2YWx1ZXM7CgogIGludCBnZXQgbGVuZ3RoID0+IHZhbHVlcy5sZW5ndGg7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpID0+IHZpc2l0b3IudmlzaXRTZXQodGhpcywgYXJnKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvRGFydFRleHQoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBfdW5wYXJzZVR5cGVBcmd1bWVudHMoc2IpOwogICAgc2Iud3JpdGUoJ3snKTsKICAgIHNiLndyaXRlQWxsKHZhbHVlcy5tYXAoKHYpID0+IHYudG9EYXJ0VGV4dCgpKSwgJywnKTsKICAgIHNiLndyaXRlKCd9Jyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cnVjdHVyZWRUZXh0KCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ1NldENvbnN0YW50KCcpOwogICAgX3VucGFyc2VUeXBlQXJndW1lbnRzKHNiKTsKICAgIHNiLndyaXRlKCd7Jyk7CiAgICBzYi53cml0ZUFsbCh2YWx1ZXMubWFwKCh2KSA9PiB2LnRvU3RydWN0dXJlZFRleHQoKSksICcsICcpOwogICAgc2Iud3JpdGUoJ30pJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWVLaW5kIGdldCBraW5kID0+IENvbnN0YW50VmFsdWVLaW5kLlNFVDsKfQoKYWJzdHJhY3QgY2xhc3MgTWFwQ29uc3RhbnRWYWx1ZSBleHRlbmRzIE9iamVjdENvbnN0YW50VmFsdWUgewogIGZpbmFsIExpc3Q8Q29uc3RhbnRWYWx1ZT4ga2V5czsKICBmaW5hbCBMaXN0PENvbnN0YW50VmFsdWU+IHZhbHVlczsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGU7CiAgTWFwPENvbnN0YW50VmFsdWUsIENvbnN0YW50VmFsdWU+IF9sb29rdXBNYXA7CgogIE1hcENvbnN0YW50VmFsdWUoCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwgTGlzdDxDb25zdGFudFZhbHVlPiBrZXlzLCBMaXN0PENvbnN0YW50VmFsdWU+IHZhbHVlcykKICAgICAgOiB0aGlzLmtleXMgPSBrZXlzLAogICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzLAogICAgICAgIHRoaXMuaGFzaENvZGUgPSBIYXNoaW5nLmxpc3RIYXNoKAogICAgICAgICAgICB2YWx1ZXMsIEhhc2hpbmcubGlzdEhhc2goa2V5cywgSGFzaGluZy5vYmplY3RIYXNoKHR5cGUpKSksCiAgICAgICAgc3VwZXIodHlwZSkgewogICAgYXNzZXJ0KGtleXMubGVuZ3RoID09IHZhbHVlcy5sZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNNYXAgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PSh2YXIgb3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgTWFwQ29uc3RhbnRWYWx1ZSkgcmV0dXJuIGZhbHNlOwogICAgTWFwQ29uc3RhbnRWYWx1ZSBvdGhlck1hcCA9IG90aGVyOwogICAgaWYgKGhhc2hDb2RlICE9IG90aGVyTWFwLmhhc2hDb2RlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAodHlwZSAhPSBvdGhlci50eXBlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAobGVuZ3RoICE9IG90aGVyLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAoa2V5c1tpXSAhPSBvdGhlck1hcC5rZXlzW2ldKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmICh2YWx1ZXNbaV0gIT0gb3RoZXJNYXAudmFsdWVzW2ldKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZ2V0RGVwZW5kZW5jaWVzKCkgewogICAgTGlzdDxDb25zdGFudFZhbHVlPiByZXN1bHQgPSA8Q29uc3RhbnRWYWx1ZT5bXTsKICAgIHJlc3VsdC5hZGRBbGwoa2V5cyk7CiAgICByZXN1bHQuYWRkQWxsKHZhbHVlcyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgaW50IGdldCBsZW5ndGggPT4ga2V5cy5sZW5ndGg7CgogIENvbnN0YW50VmFsdWUgbG9va3VwKENvbnN0YW50VmFsdWUga2V5KSB7CiAgICB2YXIgbG9va3VwTWFwID0gX2xvb2t1cE1hcCA/Pz0KICAgICAgICBuZXcgTWFwPENvbnN0YW50VmFsdWUsIENvbnN0YW50VmFsdWU+LmZyb21JdGVyYWJsZXMoa2V5cywgdmFsdWVzKTsKICAgIHJldHVybiBsb29rdXBNYXBba2V5XTsKICB9CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpID0+IHZpc2l0b3IudmlzaXRNYXAodGhpcywgYXJnKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZUtpbmQgZ2V0IGtpbmQgPT4gQ29uc3RhbnRWYWx1ZUtpbmQuTUFQOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9EYXJ0VGV4dCgpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIF91bnBhcnNlVHlwZUFyZ3VtZW50cyhzYik7CiAgICBzYi53cml0ZSgneycpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAoaSA+IDApIHNiLndyaXRlKCcsJyk7CiAgICAgIHNiLndyaXRlKGtleXNbaV0udG9EYXJ0VGV4dCgpKTsKICAgICAgc2Iud3JpdGUoJzonKTsKICAgICAgc2Iud3JpdGUodmFsdWVzW2ldLnRvRGFydFRleHQoKSk7CiAgICB9CiAgICBzYi53cml0ZSgnfScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dCgpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdNYXBDb25zdGFudCgnKTsKICAgIF91bnBhcnNlVHlwZUFyZ3VtZW50cyhzYik7CiAgICBzYi53cml0ZSgneycpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAoaSA+IDApIHNiLndyaXRlKCcsICcpOwogICAgICBzYi53cml0ZShrZXlzW2ldLnRvU3RydWN0dXJlZFRleHQoKSk7CiAgICAgIHNiLndyaXRlKCc6ICcpOwogICAgICBzYi53cml0ZSh2YWx1ZXNbaV0udG9TdHJ1Y3R1cmVkVGV4dCgpKTsKICAgIH0KICAgIHNiLndyaXRlKCd9KScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgZXh0ZW5kcyBDb25zdGFudFZhbHVlIHsKICAvLy8gVGhlIGNsYXNzIGZvciB3aGljaCB0aGlzIGludGVyY2VwdG9yIGhvbGRzIHRoZSBtZXRob2RzLiAgVGhlIGNvbnN0YW50CiAgLy8vIGlzIGEgZGlzcGF0Y2ggdGFibGUgZm9yIHRoaXMgY2xhc3MuCiAgZmluYWwgQ2xhc3NFbnRpdHkgY2xzOwoKICBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUodGhpcy5jbHMpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ludGVyY2VwdG9yID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIHJldHVybiBvdGhlciBpcyBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgJiYgY2xzID09IG90aGVyLmNsczsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gY2xzLmhhc2hDb2RlICogNDM7CgogIEBvdmVycmlkZQogIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZ2V0RGVwZW5kZW5jaWVzKCkgPT4gY29uc3QgPENvbnN0YW50VmFsdWU+W107CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SW50ZXJjZXB0b3IodGhpcywgYXJnKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGUoQ29tbW9uRWxlbWVudHMgdHlwZXMpID0+IHR5cGVzLmR5bmFtaWNUeXBlOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlS2luZCBnZXQga2luZCA9PiBDb25zdGFudFZhbHVlS2luZC5JTlRFUkNFUFRPUjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvRGFydFRleHQoKSB7CiAgICByZXR1cm4gJ2ludGVyY2VwdG9yKCRjbHMpJzsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cnVjdHVyZWRUZXh0KCkgewogICAgcmV0dXJuICdJbnRlcmNlcHRvckNvbnN0YW50KCR7Y2xzLm5hbWV9KSc7CiAgfQp9CgpjbGFzcyBKc05hbWVDb25zdGFudFZhbHVlIGV4dGVuZHMgQ29uc3RhbnRWYWx1ZSB7CiAgZmluYWwganMuTGl0ZXJhbFN0cmluZyBuYW1lOwoKICBKc05hbWVDb25zdGFudFZhbHVlKHRoaXMubmFtZSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRHVtbXkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIEpzTmFtZUNvbnN0YW50VmFsdWUgJiYgbmFtZSA9PSBvdGhlci5uYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAgZ2V0IGhhc2hDb2RlID0+IG5hbWUuaGFzaENvZGUgKiAxNzsKCiAgQG92ZXJyaWRlCiAgTGlzdDxDb25zdGFudFZhbHVlPiBnZXREZXBlbmRlbmNpZXMoKSA9PiBjb25zdCA8Q29uc3RhbnRWYWx1ZT5bXTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50VmFsdWVWaXNpdG9yIHZpc2l0b3IsIGFyZykgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRKc05hbWUodGhpcywgYXJnKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGUoQ29tbW9uRWxlbWVudHMgdHlwZXMpID0+IHR5cGVzLmR5bmFtaWNUeXBlOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlS2luZCBnZXQga2luZCA9PiBDb25zdGFudFZhbHVlS2luZC5KU19OQU1FOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9EYXJ0VGV4dCgpID0+ICdqc19uYW1lKCR7bmFtZX0pJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSA9PiAnSnNOYW1lQ29uc3RhbnQoJHtuYW1lfSknOwp9CgovLy8gQSBjb25zdGFudCB1c2VkIGFzIHRoZSBkdW1teSBpbnRlcmNlcHRvciB2YWx1ZSBmb3IgaW50ZXJjZXB0ZWQgY2FsbHMgd2l0aAovLy8gYSBrbm93biBub24taW50ZXJjZXB0b3IgdGFyZ2V0LgpjbGFzcyBEdW1teUludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBleHRlbmRzIENvbnN0YW50VmFsdWUgewogIGZpbmFsIEFic3RyYWN0VmFsdWUgYWJzdHJhY3RWYWx1ZTsKCiAgRHVtbXlJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUodGhpcy5hYnN0cmFjdFZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNEdW1teSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIgaXMgRHVtbXlJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgJiYKICAgICAgICBhYnN0cmFjdFZhbHVlID09IG90aGVyLmFic3RyYWN0VmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBnZXQgaGFzaENvZGUgPT4gYWJzdHJhY3RWYWx1ZS5oYXNoQ29kZSAqIDE3OwoKICBAb3ZlcnJpZGUKICBMaXN0PENvbnN0YW50VmFsdWU+IGdldERlcGVuZGVuY2llcygpID0+IGNvbnN0IDxDb25zdGFudFZhbHVlPltdOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRWYWx1ZVZpc2l0b3IgdmlzaXRvciwgYXJnKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdER1bW15SW50ZXJjZXB0b3IodGhpcywgYXJnKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGUoQ29tbW9uRWxlbWVudHMgdHlwZXMpID0+IHR5cGVzLmR5bmFtaWNUeXBlOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlS2luZCBnZXQga2luZCA9PiBDb25zdGFudFZhbHVlS2luZC5EVU1NWV9JTlRFUkNFUFRPUjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvRGFydFRleHQoKSA9PiAnZHVtbXlfaW50ZXJjZXB0b3IoJGFic3RyYWN0VmFsdWUpJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSA9PiAnRHVtbXlJbnRlcmNlcHRvckNvbnN0YW50KCRhYnN0cmFjdFZhbHVlKSc7Cn0KCi8vIEEgY29uc3RhbnQgd2l0aCBhbiBlbXB0eSB0eXBlIHVzZWQgaW4gW0hJbnN0cnVjdGlvbl1zIG9mIGFuIGV4cHJlc3Npb24KLy8gaW4gYW4gdW5yZWFjaGFibGUgY29udGV4dC4KY2xhc3MgVW5yZWFjaGFibGVDb25zdGFudFZhbHVlIGV4dGVuZHMgQ29uc3RhbnRWYWx1ZSB7CiAgY29uc3QgVW5yZWFjaGFibGVDb25zdGFudFZhbHVlKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRHVtbXkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxDb25zdGFudFZhbHVlPiBnZXREZXBlbmRlbmNpZXMoKSA9PiBjb25zdCA8Q29uc3RhbnRWYWx1ZT5bXTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50VmFsdWVWaXNpdG9yIHZpc2l0b3IsIGFyZykgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRVbnJlYWNoYWJsZSh0aGlzLCBhcmcpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0VHlwZShDb21tb25FbGVtZW50cyB0eXBlcykgPT4gdHlwZXMuZHluYW1pY1R5cGU7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWVLaW5kIGdldCBraW5kID0+IENvbnN0YW50VmFsdWVLaW5kLlVOUkVBQ0hBQkxFOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9EYXJ0VGV4dCgpID0+ICd1bnJlYWNoYWJsZSgpJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSA9PiAnVW5yZWFjaGFibGVDb25zdGFudCgpJzsKfQoKY2xhc3MgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIGV4dGVuZHMgT2JqZWN0Q29uc3RhbnRWYWx1ZSB7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWFrZSBbZmllbGRzXSBwcml2YXRlIHRvIGF2b2lkIG1pc3VzZSBvZiB0aGUgbWFwCiAgLy8gb3JkZXJpbmcgYW5kIG11dGFiaWxpdHkuCiAgZmluYWwgTWFwPEZpZWxkRW50aXR5LCBDb25zdGFudFZhbHVlPiBmaWVsZHM7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGhhc2hDb2RlOwoKICBDb25zdHJ1Y3RlZENvbnN0YW50VmFsdWUoCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwgTWFwPEZpZWxkRW50aXR5LCBDb25zdGFudFZhbHVlPiBmaWVsZHMpCiAgICAgIDogdGhpcy5maWVsZHMgPSBmaWVsZHMsCiAgICAgICAgaGFzaENvZGUgPSBIYXNoaW5nLnVub3JkZXJlZE1hcEhhc2goZmllbGRzLCBIYXNoaW5nLm9iamVjdEhhc2godHlwZSkpLAogICAgICAgIHN1cGVyKHR5cGUpIHsKICAgIGFzc2VydCh0eXBlICE9IG51bGwpOwogICAgYXNzZXJ0KCFmaWVsZHMuY29udGFpbnNLZXkobnVsbCkpOwogICAgYXNzZXJ0KCFmaWVsZHMuY29udGFpbnNWYWx1ZShudWxsKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnN0cnVjdGVkT2JqZWN0ID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0odmFyIG90aGVyVmFyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyVmFyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXJWYXIgaXMhIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSkgcmV0dXJuIGZhbHNlOwogICAgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIG90aGVyID0gb3RoZXJWYXI7CiAgICBpZiAoaGFzaENvZGUgIT0gb3RoZXIuaGFzaENvZGUpIHJldHVybiBmYWxzZTsKICAgIGlmICh0eXBlICE9IG90aGVyLnR5cGUpIHJldHVybiBmYWxzZTsKICAgIGlmIChmaWVsZHMubGVuZ3RoICE9IG90aGVyLmZpZWxkcy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoRmllbGRFbnRpdHkgZmllbGQgaW4gZmllbGRzLmtleXMpIHsKICAgICAgaWYgKGZpZWxkc1tmaWVsZF0gIT0gb3RoZXIuZmllbGRzW2ZpZWxkXSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PENvbnN0YW50VmFsdWU+IGdldERlcGVuZGVuY2llcygpID0+IGZpZWxkcy52YWx1ZXMudG9MaXN0KCk7CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q29uc3RydWN0ZWQodGhpcywgYXJnKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWVLaW5kIGdldCBraW5kID0+IENvbnN0YW50VmFsdWVLaW5kLkNPTlNUUlVDVEVEOwoKICBJdGVyYWJsZTxGaWVsZEVudGl0eT4gZ2V0IF9maWVsZHNTb3J0ZWRCeU5hbWUgewogICAgcmV0dXJuIGZpZWxkcy5rZXlzLnRvTGlzdCgpLi5zb3J0KChhLCBiKSA9PiBhLm5hbWUuY29tcGFyZVRvKGIubmFtZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvRGFydFRleHQoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSh0eXBlLmVsZW1lbnQubmFtZSk7CiAgICBfdW5wYXJzZVR5cGVBcmd1bWVudHMoc2IpOwogICAgc2Iud3JpdGUoJygnKTsKICAgIGludCBpID0gMDsKICAgIGZvciAoRmllbGRFbnRpdHkgZmllbGQgaW4gX2ZpZWxkc1NvcnRlZEJ5TmFtZSkgewogICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gZmllbGRzW2ZpZWxkXTsKICAgICAgaWYgKGkgPiAwKSBzYi53cml0ZSgnLCcpOwogICAgICBzYi53cml0ZShmaWVsZC5uYW1lKTsKICAgICAgc2Iud3JpdGUoJz0nKTsKICAgICAgc2Iud3JpdGUodmFsdWUudG9EYXJ0VGV4dCgpKTsKICAgICAgaSsrOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnQ29uc3RydWN0ZWRDb25zdGFudCgnKTsKICAgIHNiLndyaXRlKHR5cGUpOwogICAgc2Iud3JpdGUoJygnKTsKICAgIGludCBpID0gMDsKICAgIGZvciAoRmllbGRFbnRpdHkgZmllbGQgaW4gX2ZpZWxkc1NvcnRlZEJ5TmFtZSkgewogICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gZmllbGRzW2ZpZWxkXTsKICAgICAgaWYgKGkgPiAwKSBzYi53cml0ZSgnLCcpOwogICAgICBzYi53cml0ZShmaWVsZC5uYW1lKTsKICAgICAgc2Iud3JpdGUoJz0nKTsKICAgICAgc2Iud3JpdGUodmFsdWUudG9TdHJ1Y3R1cmVkVGV4dCgpKTsKICAgICAgaSsrOwogICAgfQogICAgc2Iud3JpdGUoJykpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCmNsYXNzIEluc3RhbnRpYXRpb25Db25zdGFudFZhbHVlIGV4dGVuZHMgQ29uc3RhbnRWYWx1ZSB7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKICBmaW5hbCBGdW5jdGlvbkNvbnN0YW50VmFsdWUgZnVuY3Rpb247CgogIEluc3RhbnRpYXRpb25Db25zdGFudFZhbHVlKHRoaXMudHlwZUFyZ3VtZW50cywgdGhpcy5mdW5jdGlvbik7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBvdGhlciBpcyBJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSAmJgogICAgICAgIGZ1bmN0aW9uID09IG90aGVyLmZ1bmN0aW9uICYmCiAgICAgICAgZXF1YWxFbGVtZW50cyh0eXBlQXJndW1lbnRzLCBvdGhlci50eXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIEhhc2hpbmcub2JqZWN0SGFzaChmdW5jdGlvbiwgSGFzaGluZy5saXN0SGFzaCh0eXBlQXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PENvbnN0YW50VmFsdWU+IGdldERlcGVuZGVuY2llcygpID0+IDxDb25zdGFudFZhbHVlPltmdW5jdGlvbl07CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXRJbnN0YW50aWF0aW9uKHRoaXMsIGFyZyk7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGUoQ29tbW9uRWxlbWVudHMgdHlwZXMpIHsKICAgIEZ1bmN0aW9uVHlwZSB0eXBlID0gZnVuY3Rpb24uZ2V0VHlwZSh0eXBlcyk7CiAgICByZXR1cm4gdHlwZS5pbnN0YW50aWF0ZSh0eXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWVLaW5kIGdldCBraW5kID0+IENvbnN0YW50VmFsdWVLaW5kLklOU1RBTlRJQVRJT047CgogIEBvdmVycmlkZQogIFN0cmluZyB0b0RhcnRUZXh0KCkgPT4KICAgICAgJzwke3R5cGVBcmd1bWVudHMuam9pbignLCAnKX0+KCR7ZnVuY3Rpb24udG9EYXJ0VGV4dCgpfSknOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dCgpIHsKICAgIHJldHVybiAnSW5zdGFudGlhdGlvbkNvbnN0YW50KCR0eXBlQXJndW1lbnRzLCcKICAgICAgICAnJHtmdW5jdGlvbi50b1N0cnVjdHVyZWRUZXh0KCl9KSc7CiAgfQp9CgovLy8gQSByZWZlcmVuY2UgdG8gYSBjb25zdGFudCBpbiBhbm90aGVyIG91dHB1dCB1bml0LgovLy8KLy8vIFVzZWQgZm9yIHJlZmVycmluZyB0byBkZWZlcnJlZCBjb25zdGFudHMgdGhhdCBhcHBlYXIgYXMgaW5pdGlhbGl6ZXJzIG9mCi8vLyBmaW5hbCAobm9uLWNvbnN0KSBnbG9iYWwgZmllbGRzLgovLy8KLy8gVE9ETyhzaWdtdW5kKTogdGhpcyBzaG91bGQgZXZlbnR1YWxseSBub3QgYmUgYSBjb25zdGFudCB2YWx1ZS4gSW4gcGFydGljdWxhciwKLy8gW0RlZmVycmVkQ29uc3RhbnRWYWx1ZV0gaXMgaW50cm9kdWNlZCBieSB0aGUgY29uc3RhbnQgZXZhbHVhdG9yIHdoZW4gaXQgZmlyc3QKLy8gc2VlcyBjb25zdGFudHMgdXNlZCBpbiB0aGUgcHJvZ3JhbS4gW0RlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZV0gYXJlCi8vIGludHJvZHVjZWQgbGF0ZXIgYnkgdGhlIFNTQSBidWlsZGVyIGFuZCBzaG91bGQgYmUgcmVwcmVzZW50ZWQKLy8gd2l0aCBhIGRlZGljYXRlZCBKRW50aXR5IGluc3RlYWQuIFdlIGN1cnJlbnRseSBtb2RlbCB0aGVtIGFzIGEgcmVndWxhcgovLyBjb25zdGFudCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbWFjaGluZXJ5IHdlIGFscmVhZHkgaGF2ZSBpbiBwbGFjZSB0bwovLyBnZW5lcmF0ZSBkZWZlcnJlZCBjb25zdGFudHMgaW4gdGhlIGVtaXR0ZXIuCmNsYXNzIERlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZSBleHRlbmRzIENvbnN0YW50VmFsdWUgewogIERlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZSh0aGlzLnJlZmVyZW5jZWQsIHRoaXMudW5pdCk7CgogIGZpbmFsIENvbnN0YW50VmFsdWUgcmVmZXJlbmNlZDsKICBmaW5hbCBPdXRwdXRVbml0IHVuaXQ7CgogIGJvb2wgZ2V0IGlzUmVmZXJlbmNlID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIHJldHVybiBvdGhlciBpcyBEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgJiYKICAgICAgICByZWZlcmVuY2VkID09IG90aGVyLnJlZmVyZW5jZWQgJiYKICAgICAgICB1bml0ID09IG90aGVyLnVuaXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBnZXQgaGFzaENvZGUgPT4gKHJlZmVyZW5jZWQuaGFzaENvZGUgKiAxNyArIHVuaXQuaGFzaENvZGUpICYgMHgzZmZmZmZmZjsKCiAgQG92ZXJyaWRlCiAgTGlzdDxDb25zdGFudFZhbHVlPiBnZXREZXBlbmRlbmNpZXMoKSA9PiA8Q29uc3RhbnRWYWx1ZT5bcmVmZXJlbmNlZF07CgogIEBvdmVycmlkZQogIGFjY2VwdChDb25zdGFudFZhbHVlVmlzaXRvciB2aXNpdG9yLCBhcmcpID0+CiAgICAgIHZpc2l0b3IudmlzaXREZWZlcnJlZEdsb2JhbCh0aGlzLCBhcmcpOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRUeXBlKENvbW1vbkVsZW1lbnRzIHR5cGVzKSA9PiByZWZlcmVuY2VkLmdldFR5cGUodHlwZXMpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlS2luZCBnZXQga2luZCA9PiBDb25zdGFudFZhbHVlS2luZC5ERUZFUlJFRF9HTE9CQUw7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b0RhcnRUZXh0KCkgPT4gJ2RlZmVycmVkX2dsb2JhbCgke3JlZmVyZW5jZWQudG9EYXJ0VGV4dCgpfSknOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dCgpIHsKICAgIHJldHVybiAnRGVmZXJyZWRHbG9iYWxDb25zdGFudCgke3JlZmVyZW5jZWQudG9TdHJ1Y3R1cmVkVGV4dCgpfSknOwogIH0KfQoKLy8vIEEgY29uc3RhbnQgdmFsdWUgcmVzdWx0aW5nIGZyb20gYSBub24gY29uc3RhbnQgb3IgZXJyb25lb3VzIGNvbnN0YW50Ci8vLyBleHByZXNzaW9uLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBFeHBhbmQgdGhpcyB0byBjb250YWluIHRoZSBlcnJvciBraW5kLgpjbGFzcyBOb25Db25zdGFudFZhbHVlIGV4dGVuZHMgQ29uc3RhbnRWYWx1ZSB7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDb25zdGFudCA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYWNj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c2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgZXF1YWxFbGVtZW50czsKaW1wb3J0ICdlbnRpdGllcy5kYXJ0JzsKCi8vLyBIaWVyYXJjaHkgdG8gZGVzY3JpYmUgdHlwZXMgaW4gRGFydC4KLy8vCi8vLyBUaGlzIGhpZXJhcmNoeSBpcyBhIHN1cGVyIGhpZXJhcmNoeSBvZiB0aGUgdXNlLWNhc2Ugc3BlY2lmaWMgaGllcmFyY2hpZXMKLy8vIHVzZWQgaW4gZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBjb21waWxlci4gVGhpcyBoaWVyYXJjaHkgYWJzdHJhY3RzIGRldGFpbHMKLy8vIG5vdCBnZW5lcmFsbHkgbmVlZGVkIG9yIHJlcXVpcmVkIGZvciB0aGUgRGFydCB0eXBlIGhpZXJhcmNoeS4gRm9yIGluc3RhbmNlLAovLy8gdGhlIGhpZXJhcmNoeSBpbiAncmVzb2x1dGlvbl90eXBlcy5kYXJ0JyBoYXMgcHJvcGVydGllcyBzdXBwb3J0aW5nIGxhenkKLy8vIGNvbXB1dGF0aW9uIChsaWtlIGNvbXB1dGVBbGlhcykgYW5kIGRpc3RpbmN0aW9ucyBiZXR3ZWVuICdGb28nIGFuZAovLy8gJ0ZvbzxkeW5hbWljPicsIGZlYXR1cmVzIHRoYXQgYXJlIG5vdCBuZWVkZWQgZm9yIGNvZGUgZ2VuZXJhdGlvbiBhbmQgbm90Ci8vLyBzdXBwb3J0ZWQgZnJvbSBrZXJuZWwuCi8vLwovLy8gQ3VycmVudCBvbmx5ICdyZXNvbHV0aW9uX3R5cGVzLmRhcnQnIGltcGxlbWVudCB0aGlzIGhpZXJhcmNoeSBidXQgd2hlbiB0aGUKLy8vIGNvbXBpbGVyIG1vdmVzIHRvIHVzZSBbRW50aXR5XSBpbnN0ZWFkIG9mIFtFbGVtZW50XSB0aGlzIGhpZXJhcmNoeSBjYW4gYmUKLy8vIGltcGxlbWVudGVkIGRpcmVjdGx5IGJ1dCBvdGhlciBlbnRpdHkgc3lzdGVtcywgZm9yIGluc3RhbmNlIGJhc2VkIGRpcmVjdGx5Ci8vLyBvbiBrZXJuZWwgaXIgd2l0aG91dCB0aGUgbmVlZCBmb3IgW0VsZW1lbnRdLgoKYWJzdHJhY3QgY2xhc3MgRGFydFR5cGUgewogIGNvbnN0IERhcnRUeXBlKCk7CgogIC8vLyBSZXR1cm5zIHRoZSB1bmFsaWFzZWQgdHlwZSBvZiB0aGlzIHR5cGUuCiAgLy8vCiAgLy8vIFRoZSB1bmFsaWFzZWQgdHlwZSBvZiBhIHR5cGVkZWYnZCB0eXBlIGlzIHRoZSB1bmFsaWFzZWQgdHlwZSB0byB3aGljaCBpdHMKICAvLy8gbmFtZSBpcyBib3VuZC4gVGhlIHVuYWxpYXNlZCB2ZXJzaW9uIG9mIGFueSBvdGhlciB0eXBlIGlzIHRoZSB0eXBlIGl0c2VsZi4KICAvLy8KICAvLy8gRm9yIGV4YW1wbGUsIHRoZSB1bmFsaWFzZWQgdHlwZSBvZiBgdHlwZWRlZiBBIEZ1bmM8QSxCPihCIGIpYCBpcyB0aGUKICAvLy8gZnVuY3Rpb24gdHlwZSBgKEIpIC0+IEFgIGFuZCB0aGUgdW5hbGlhc2VkIHR5cGUgb2YgYEZ1bmM8aW50LFN0cmluZz5gCiAgLy8vIGlzIHRoZSBmdW5jdGlvbiB0eXBlIGAoU3RyaW5nKSAtPiBpbnRgLgogIERhcnRUeXBlIGdldCB1bmFsaWFzZWQgPT4gdGhpczsKCiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIHR5cGUgaGFzIG5vIG5vbi1keW5hbWljIHR5cGUgYXJndW1lbnRzLgogIGJvb2wgZ2V0IHRyZWF0QXNSYXcgPT4gdHJ1ZTsKCiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIHR5cGUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdGhlIGR5bmFtaWMgdHlwZS4KICBib29sIGdldCB0cmVhdEFzRHluYW1pYyA9PiBmYWxzZTsKCiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIHR5cGUgaXMgdGhlIGR5bmFtaWMgdHlwZS4KICBib29sIGdldCBpc0R5bmFtaWMgPT4gZmFsc2U7CgogIC8vLyBJcyBgdHJ1ZWAgaWYgdGhpcyB0eXBlIGlzIHRoZSB2b2lkIHR5cGUuCiAgYm9vbCBnZXQgaXNWb2lkID0+IGZhbHNlOwoKICAvLy8gSXMgYHRydWVgIGlmIHRoaXMgdHlwZSBpcyBhbiBpbnRlcmZhY2UgdHlwZS4KICBib29sIGdldCBpc0ludGVyZmFjZVR5cGUgPT4gZmFsc2U7CgogIC8vLyBJcyBgdHJ1ZWAgaWYgdGhpcyB0eXBlIGlzIGEgdHlwZWRlZi4KICBib29sIGdldCBpc1R5cGVkZWYgPT4gZmFsc2U7CgogIC8vLyBJcyBgdHJ1ZWAgaWYgdGhpcyB0eXBlIGlzIGEgZnVuY3Rpb24gdHlwZS4KICBib29sIGdldCBpc0Z1bmN0aW9uVHlwZSA9PiBmYWxzZTsKCiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIHR5cGUgaXMgYSB0eXBlIHZhcmlhYmxlLgogIGJvb2wgZ2V0IGlzVHlwZVZhcmlhYmxlID0+IGZhbHNlOwoKICAvLy8gSXMgYHRydWVgIGlmIHRoaXMgdHlwZSBpcyBhIHR5cGUgdmFyaWFibGUgZGVjbGFyZWQgb24gYSBmdW5jdGlvbiB0eXBlCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBgVGAgaW4KICAvLy8gICAgIHZvaWQgRnVuY3Rpb248VD4oVCB0KQogIGJvb2wgZ2V0IGlzRnVuY3Rpb25UeXBlVmFyaWFibGUgPT4gZmFsc2U7CgogIC8vLyBJcyBgdHJ1ZWAgaWYgdGhpcyB0eXBlIGlzIGEgYEZ1dHVyZU9yYCB0eXBlLgogIGJvb2wgZ2V0IGlzRnV0dXJlT3IgPT4gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRoaXMgdHlwZSBjb250YWlucyBhIHR5cGUgdmFyaWFibGUuCiAgYm9vbCBnZXQgY29udGFpbnNUeXBlVmFyaWFibGVzID0+IGZhbHNlOwoKICAvLy8gV2hldGhlciB0aGlzIHR5cGUgY29udGFpbnMgYSBmcmVlIGNsYXNzIHR5cGUgdmFyaWFibGUgb3IgZnVuY3Rpb24gdHlwZQogIC8vLyB2YXJpYWJsZS4KICAvLyBUT0RPKHNyYSk6IFJldmlldyB1c2VzIG9mIFtjb250YWluc1R5cGVWYXJpYWJsZXNdIGZvciB1cGRhdGUgd2l0aAogIC8vIFtjb250YWluc0ZyZWVUeXBlVmFyaWFibGVzXS4KICBib29sIGdldCBjb250YWluc0ZyZWVUeXBlVmFyaWFibGVzID0+IF9jb250YWluc0ZyZWVUeXBlVmFyaWFibGVzKG51bGwpOwoKICAvLy8gSXMgYHRydWVgIGlmIHRoaXMgdHlwZSBpcyB0aGUgJ09iamVjdCcgdHlwZSBkZWZpbmVkIGluICdkYXJ0OmNvcmUnLgogIGJvb2wgZ2V0IGlzT2JqZWN0ID0+IGZhbHNlOwoKICAvLy8gQXBwbGllcyBbZl0gdG8gZWFjaCBvY2N1cmVuY2Ugb2YgYSBbVHlwZVZhcmlhYmxlVHlwZV0gd2l0aGluIHRoaXMKICAvLy8gdHlwZS4gVGhpcyBleGNsdWRlcyBmdW5jdGlvbiB0eXBlIHZhcmlhYmxlcywgd2hldGhlciBmcmVlIG9yIGJvdW5kLgogIHZvaWQgZm9yRWFjaFR5cGVWYXJpYWJsZShmKFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGUpKSB7fQoKICAvLy8gUGVyZm9ybXMgdGhlIHN1YnN0aXR1dGlvbiBgW2FyZ3VtZW50c1tpXS9wYXJhbWV0ZXJzW2ldXXRoaXNgLgogIC8vLwogIC8vLyBUaGUgbm90YXRpb24gaXMga25vd24gZnJvbSB0aGlzIGxhbWJkYSBjYWxjdWx1cyBydWxlOgogIC8vLwogIC8vLyAgICAgKGxhbWJkYSB4LmUwKWUxIC0+IFtlMS94XWUwLgogIC8vLwogIC8vLyBTZWUgW1R5cGVWYXJpYWJsZVR5cGVdIGZvciBhIG1vdGl2YXRpb24gZm9yIHRoaXMgbWV0aG9kLgogIC8vLwogIC8vLyBJbnZhcmlhbnQ6IFRoZXJlIG11c3QgYmUgdGhlIHNhbWUgbnVtYmVyIG9mIFthcmd1bWVudHNdIGFuZCBbcGFyYW1ldGVyc10uCiAgRGFydFR5cGUgc3Vic3QoTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzLCBMaXN0PERhcnRUeXBlPiBwYXJhbWV0ZXJzKTsKCiAgLy8vIENhbGxzIHRoZSB2aXNpdCBtZXRob2Qgb24gW3Zpc2l0b3JdIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyB0eXBlLgogIFIgYWNjZXB0PFIsIEE+KERhcnRUeXBlVmlzaXRvcjxSLCBBPiB2aXNpdG9yLCBBIGFyZ3VtZW50KTsKCiAgYm9vbCBfZXF1YWxzKERhcnRUeXBlIG90aGVyLCBfQXNzdW1wdGlvbnMgYXNzdW1wdGlvbnMpOwoKICBib29sIF9jb250YWluc0ZyZWVUeXBlVmFyaWFibGVzKExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IGJpbmRpbmdzKSA9PiBmYWxzZTsKfQoKLy8vIFBhaXJzIG9mIFtGdW5jdGlvblR5cGVWYXJpYWJsZV1zIHRoYXQgYXJlIGN1cnJlbnRseSBhc3N1bWVkIHRvIGJlCi8vLyBlcXVpdmFsZW50LgovLy8KLy8vIFRoaXMgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBlcXVpdmFsZW5jZSByZWxhdGlvbiBvbiB0eXBlcyBjb2luZHVjdGl2ZWx5LgpjbGFzcyBfQXNzdW1wdGlvbnMgewogIE1hcDxGdW5jdGlvblR5cGVWYXJpYWJsZSwgU2V0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPj4gX2Fzc3VtcHRpb25NYXAgPQogICAgICA8RnVuY3Rpb25UeXBlVmFyaWFibGUsIFNldDxGdW5jdGlvblR5cGVWYXJpYWJsZT4+e307CgogIHZvaWQgX2FkZEFzc3VtcHRpb24oRnVuY3Rpb25UeXBlVmFyaWFibGUgYSwgRnVuY3Rpb25UeXBlVmFyaWFibGUgYikgewogICAgX2Fzc3VtcHRpb25NYXAKICAgICAgICAucHV0SWZBYnNlbnQoYSwgKCkgPT4gbmV3IFNldDxGdW5jdGlvblR5cGVWYXJpYWJsZT4uaWRlbnRpdHkoKSkKICAgICAgICAuYWRkKGIpOwogIH0KCiAgLy8vIEFzc3VtZSB0aGF0IFthXSBhbmQgW2JdIGFyZSBlcXVpdmFsZW50LgogIHZvaWQgYXNzdW1lKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIGEsIEZ1bmN0aW9uVHlwZVZhcmlhYmxlIGIpIHsKICAgIF9hZGRBc3N1bXB0aW9uKGEsIGIpOwogICAgX2FkZEFzc3VtcHRpb24oYiwgYSk7CiAgfQoKICB2b2lkIF9yZW1vdmVBc3N1bXB0aW9uKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIGEsIEZ1bmN0aW9uVHlwZVZhcmlhYmxlIGIpIHsKICAgIFNldDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gc2V0ID0gX2Fzc3VtcHRpb25NYXBbYV07CiAgICBpZiAoc2V0ICE9IG51bGwpIHsKICAgICAgc2V0LnJlbW92ZShiKTsKICAgICAgaWYgKHNldC5pc0VtcHR5KSB7CiAgICAgICAgX2Fzc3VtcHRpb25NYXAucmVtb3ZlKGEpOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gUmVtb3ZlIHRoZSBhc3N1bXB0aW9uIHRoYXQgW2FdIGFuZCBbYl0gYXJlIGVxdWl2YWxlbnQuCiAgdm9pZCBmb3JnZXQoRnVuY3Rpb25UeXBlVmFyaWFibGUgYSwgRnVuY3Rpb25UeXBlVmFyaWFibGUgYikgewogICAgX3JlbW92ZUFzc3VtcHRpb24oYSwgYik7CiAgICBfcmVtb3ZlQXNzdW1wdGlvbihiLCBhKTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbYV0gYW5kIFtiXSBhcmUgYXNzdW1lZCB0byBiZSBlcXVpdmFsZW50LgogIGJvb2wgaXNBc3N1bWVkKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIGEsIEZ1bmN0aW9uVHlwZVZhcmlhYmxlIGIpIHsKICAgIHJldHVybiBfYXNzdW1wdGlvbk1hcFthXT8uY29udGFpbnMoYikgPz8gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnX0Fzc3VtcHRpb25zKCcpOwogICAgU3RyaW5nIGNvbW1hID0gJyc7CiAgICBfYXNzdW1wdGlvbk1hcAogICAgICAgIC5mb3JFYWNoKChGdW5jdGlvblR5cGVWYXJpYWJsZSBhLCBTZXQ8RnVuY3Rpb25UeXBlVmFyaWFibGU+IHNldCkgewogICAgICBzYi53cml0ZSgnJGNvbW1hJGEgKCR7aWRlbnRpdHlIYXNoQ29kZShhKX0pLT4nCiAgICAgICAgICAneyR7c2V0Lm1hcCgoYikgPT4gJyRiICgke2lkZW50aXR5SGFzaENvZGUoYil9KScpLmpvaW4oJywnKX19Jyk7CiAgICAgIGNvbW1hID0gJywnOwogICAgfSk7CiAgICBzYi53cml0ZSgnKScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBJbnRlcmZhY2VUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIGZpbmFsIENsYXNzRW50aXR5IGVsZW1lbnQ7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgSW50ZXJmYWNlVHlwZSh0aGlzLmVsZW1lbnQsIHRoaXMudHlwZUFyZ3VtZW50cyk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSW50ZXJmYWNlVHlwZSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc09iamVjdCB7CiAgICByZXR1cm4gZWxlbWVudC5uYW1lID09ICdPYmplY3QnICYmCiAgICAgICAgZWxlbWVudC5saWJyYXJ5LmNhbm9uaWNhbFVyaSA9PSBVcmlzLmRhcnRfY29yZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGNvbnRhaW5zVHlwZVZhcmlhYmxlcyA9PgogICAgICB0eXBlQXJndW1lbnRzLmFueSgodHlwZSkgPT4gdHlwZS5jb250YWluc1R5cGVWYXJpYWJsZXMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hUeXBlVmFyaWFibGUoZihUeXBlVmFyaWFibGVUeXBlIHZhcmlhYmxlKSkgewogICAgdHlwZUFyZ3VtZW50cy5mb3JFYWNoKCh0eXBlKSA9PiB0eXBlLmZvckVhY2hUeXBlVmFyaWFibGUoZikpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBfY29udGFpbnNGcmVlVHlwZVZhcmlhYmxlcyhMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBiaW5kaW5ncykgewogICAgcmV0dXJuIHR5cGVBcmd1bWVudHMKICAgICAgICAuYW55KCh0eXBlKSA9PiB0eXBlLl9jb250YWluc0ZyZWVUeXBlVmFyaWFibGVzKGJpbmRpbmdzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIHN1YnN0KExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cywgTGlzdDxEYXJ0VHlwZT4gcGFyYW1ldGVycykgewogICAgaWYgKHR5cGVBcmd1bWVudHMuaXNFbXB0eSkgewogICAgICAvLyBSZXR1cm4gZmFzdCBvbiBub24tZ2VuZXJpYyB0eXBlcy4KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBpZiAocGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgIGFzc2VydChhcmd1bWVudHMuaXNFbXB0eSk7CiAgICAgIC8vIFJldHVybiBmYXN0IG9uIGVtcHR5IHN1YnN0aXR1dGlvbnMuCiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgTGlzdDxEYXJ0VHlwZT4gbmV3VHlwZUFyZ3VtZW50cyA9CiAgICAgICAgX3N1YnN0VHlwZXModHlwZUFyZ3VtZW50cywgYXJndW1lbnRzLCBwYXJhbWV0ZXJzKTsKICAgIGlmICghaWRlbnRpY2FsKHR5cGVBcmd1bWVudHMsIG5ld1R5cGVBcmd1bWVudHMpKSB7CiAgICAgIC8vIENyZWF0ZSBhIG5ldyB0eXBlIG9ubHkgaWYgbmVjZXNzYXJ5LgogICAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoZWxlbWVudCwgbmV3VHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IHRyZWF0QXNSYXcgewogICAgZm9yIChEYXJ0VHlwZSB0eXBlIGluIHR5cGVBcmd1bWVudHMpIHsKICAgICAgaWYgKCF0eXBlLnRyZWF0QXNEeW5hbWljKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIFIgYWNjZXB0PFIsIEE+KERhcnRUeXBlVmlzaXRvcjxSLCBBPiB2aXNpdG9yLCBBIGFyZ3VtZW50KSA9PgogICAgICB2aXNpdG9yLnZpc2l0SW50ZXJmYWNlVHlwZSh0aGlzLCBhcmd1bWVudCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgaW50IGhhc2ggPSBlbGVtZW50Lmhhc2hDb2RlOwogICAgZm9yIChEYXJ0VHlwZSBhcmd1bWVudCBpbiB0eXBlQXJndW1lbnRzKSB7CiAgICAgIGludCBhcmd1bWVudEhhc2ggPSBhcmd1bWVudCAhPSBudWxsID8gYXJndW1lbnQuaGFzaENvZGUgOiAwOwogICAgICBoYXNoID0gMTcgKiBoYXNoICsgMyAqIGFyZ3VtZW50SGFzaDsKICAgIH0KICAgIHJldHVybiBoYXNoOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBJbnRlcmZhY2VUeXBlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX2VxdWFsc0ludGVybmFsKG90aGVyLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhEYXJ0VHlwZSBvdGhlciwgX0Fzc3VtcHRpb25zIGFzc3VtcHRpb25zKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIEludGVyZmFjZVR5cGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfZXF1YWxzSW50ZXJuYWwob3RoZXIsIGFzc3VtcHRpb25zKTsKICB9CgogIGJvb2wgX2VxdWFsc0ludGVybmFsKEludGVyZmFjZVR5cGUgb3RoZXIsIF9Bc3N1bXB0aW9ucyBhc3N1bXB0aW9ucykgewogICAgcmV0dXJuIGlkZW50aWNhbChlbGVtZW50LCBvdGhlci5lbGVtZW50KSAmJgogICAgICAgIF9lcXVhbFR5cGVzKHR5cGVBcmd1bWVudHMsIG90aGVyLnR5cGVBcmd1bWVudHMsIGFzc3VtcHRpb25zKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKGVsZW1lbnQubmFtZSk7CiAgICBpZiAodHlwZUFyZ3VtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgIHNiLndyaXRlKCc8Jyk7CiAgICAgIGJvb2wgbmVlZHNDb21tYSA9IGZhbHNlOwogICAgICBmb3IgKERhcnRUeXBlIHR5cGVBcmd1bWVudCBpbiB0eXBlQXJndW1lbnRzKSB7CiAgICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgICAgfQogICAgICAgIHNiLndyaXRlKHR5cGVBcmd1bWVudCk7CiAgICAgICAgbmVlZHNDb21tYSA9IHRydWU7CiAgICAgIH0KICAgICAgc2Iud3JpdGUoJz4nKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgVHlwZWRlZlR5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgZmluYWwgVHlwZWRlZkVudGl0eSBlbGVtZW50OwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CiAgQG92ZXJyaWRlCiAgZmluYWwgRnVuY3Rpb25UeXBlIHVuYWxpYXNlZDsKCiAgVHlwZWRlZlR5cGUodGhpcy5lbGVtZW50LCB0aGlzLnR5cGVBcmd1bWVudHMsIHRoaXMudW5hbGlhc2VkKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNUeXBlZGVmID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGNvbnRhaW5zVHlwZVZhcmlhYmxlcyA9PgogICAgICB0eXBlQXJndW1lbnRzLmFueSgodHlwZSkgPT4gdHlwZS5jb250YWluc1R5cGVWYXJpYWJsZXMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hUeXBlVmFyaWFibGUoZihUeXBlVmFyaWFibGVUeXBlIHZhcmlhYmxlKSkgewogICAgdHlwZUFyZ3VtZW50cy5mb3JFYWNoKCh0eXBlKSA9PiB0eXBlLmZvckVhY2hUeXBlVmFyaWFibGUoZikpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBfY29udGFpbnNGcmVlVHlwZVZhcmlhYmxlcyhMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBiaW5kaW5ncykgPT4KICAgICAgdHlwZUFyZ3VtZW50cy5hbnkoKHR5cGUpID0+IHR5cGUuX2NvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMoYmluZGluZ3MpKTsKCiAgQG92ZXJyaWRlCiAgVHlwZWRlZlR5cGUgc3Vic3QoTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzLCBMaXN0PERhcnRUeXBlPiBwYXJhbWV0ZXJzKSB7CiAgICBpZiAodHlwZUFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgIC8vIFJldHVybiBmYXN0IG9uIG5vbi1nZW5lcmljIHR5cGVzLgogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGlmIChwYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgYXNzZXJ0KGFyZ3VtZW50cy5pc0VtcHR5KTsKICAgICAgLy8gUmV0dXJuIGZhc3Qgb24gZW1wdHkgc3Vic3RpdHV0aW9ucy4KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBMaXN0PERhcnRUeXBlPiBuZXdUeXBlQXJndW1lbnRzID0KICAgICAgICBfc3Vic3RUeXBlcyh0eXBlQXJndW1lbnRzLCBhcmd1bWVudHMsIHBhcmFtZXRlcnMpOwogICAgRnVuY3Rpb25UeXBlIG5ld1VuYWxpYXNlZCA9IHVuYWxpYXNlZC5zdWJzdChhcmd1bWVudHMsIHBhcmFtZXRlcnMpOwogICAgaWYgKCFpZGVudGljYWwodHlwZUFyZ3VtZW50cywgbmV3VHlwZUFyZ3VtZW50cykgfHwKICAgICAgICAhaWRlbnRpY2FsKHVuYWxpYXNlZCwgbmV3VW5hbGlhc2VkKSkgewogICAgICAvLyBDcmVhdGUgYSBuZXcgdHlwZSBvbmx5IGlmIG5lY2Vzc2FyeS4KICAgICAgcmV0dXJuIG5ldyBUeXBlZGVmVHlwZShlbGVtZW50LCBuZXdUeXBlQXJndW1lbnRzLCBuZXdVbmFsaWFzZWQpOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCB0cmVhdEFzUmF3IHsKICAgIGZvciAoRGFydFR5cGUgdHlwZSBpbiB0eXBlQXJndW1lbnRzKSB7CiAgICAgIGlmICghdHlwZS50cmVhdEFzRHluYW1pYykgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDxSLCBBPihEYXJ0VHlwZVZpc2l0b3I8UiwgQT4gdmlzaXRvciwgQSBhcmd1bWVudCkgPT4KICAgICAgdmlzaXRvci52aXNpdFR5cGVkZWZUeXBlKHRoaXMsIGFyZ3VtZW50KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICBpbnQgaGFzaCA9IGVsZW1lbnQuaGFzaENvZGU7CiAgICBmb3IgKERhcnRUeXBlIGFyZ3VtZW50IGluIHR5cGVBcmd1bWVudHMpIHsKICAgICAgaW50IGFyZ3VtZW50SGFzaCA9IGFyZ3VtZW50ICE9IG51bGwgPyBhcmd1bWVudC5oYXNoQ29kZSA6IDA7CiAgICAgIGhhc2ggPSAxNyAqIGhhc2ggKyAzICogYXJndW1lbnRIYXNoOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIFR5cGVkZWZUeXBlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX2VxdWFsc0ludGVybmFsKG90aGVyLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhEYXJ0VHlwZSBvdGhlciwgX0Fzc3VtcHRpb25zIGFzc3VtcHRpb25zKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIFR5cGVkZWZUeXBlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX2VxdWFsc0ludGVybmFsKG90aGVyLCBhc3N1bXB0aW9ucyk7CiAgfQoKICBib29sIF9lcXVhbHNJbnRlcm5hbChUeXBlZGVmVHlwZSBvdGhlciwgX0Fzc3VtcHRpb25zIGFzc3VtcHRpb25zKSB7CiAgICByZXR1cm4gaWRlbnRpY2FsKGVsZW1lbnQsIG90aGVyLmVsZW1lbnQpICYmCiAgICAgICAgX2VxdWFsVHlwZXModHlwZUFyZ3VtZW50cywgb3RoZXIudHlwZUFyZ3VtZW50cywgYXNzdW1wdGlvbnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoZWxlbWVudC5uYW1lKTsKICAgIGlmICh0eXBlQXJndW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgc2Iud3JpdGUoJzwnKTsKICAgICAgYm9vbCBuZWVkc0NvbW1hID0gZmFsc2U7CiAgICAgIGZvciAoRGFydFR5cGUgdHlwZUFyZ3VtZW50IGluIHR5cGVBcmd1bWVudHMpIHsKICAgICAgICBpZiAobmVlZHNDb21tYSkgewogICAgICAgICAgc2Iud3JpdGUoJywnKTsKICAgICAgICB9CiAgICAgICAgc2Iud3JpdGUodHlwZUFyZ3VtZW50KTsKICAgICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKICAgICAgfQogICAgICBzYi53cml0ZSgnPicpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBUeXBlVmFyaWFibGVUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIGZpbmFsIFR5cGVWYXJpYWJsZUVudGl0eSBlbGVtZW50OwoKICBUeXBlVmFyaWFibGVUeXBlKHRoaXMuZWxlbWVudCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVHlwZVZhcmlhYmxlID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGNvbnRhaW5zVHlwZVZhcmlhYmxlcyA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hUeXBlVmFyaWFibGUoZihUeXBlVmFyaWFibGVUeXBlIHZhcmlhYmxlKSkgewogICAgZih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2NvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMoTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gYmluZGluZ3MpID0+IHRydWU7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHN1YnN0KExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cywgTGlzdDxEYXJ0VHlwZT4gcGFyYW1ldGVycykgewogICAgYXNzZXJ0KGFyZ3VtZW50cy5sZW5ndGggPT0gcGFyYW1ldGVycy5sZW5ndGgpOwogICAgaWYgKHBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICAvLyBSZXR1cm4gZmFzdCBvbiBlbXB0eSBzdWJzdGl0dXRpb25zLgogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGludCBpbmRleCA9IHBhcmFtZXRlcnMuaW5kZXhPZih0aGlzKTsKICAgIGlmIChpbmRleCAhPSAtMSkgewogICAgICByZXR1cm4gYXJndW1lbnRzW2luZGV4XTsKICAgIH0KICAgIC8vIFRoZSB0eXBlIHZhcmlhYmxlIHdhcyBub3Qgc3Vic3RpdHV0ZWQuCiAgICByZXR1cm4gdGhpczsKICB9CgogIEBvdmVycmlkZQogIFIgYWNjZXB0PFIsIEE+KERhcnRUeXBlVmlzaXRvcjxSLCBBPiB2aXNpdG9yLCBBIGFyZ3VtZW50KSA9PgogICAgICB2aXNpdG9yLnZpc2l0VHlwZVZhcmlhYmxlVHlwZSh0aGlzLCBhcmd1bWVudCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gMTcgKiBlbGVtZW50Lmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIFR5cGVWYXJpYWJsZVR5cGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBpZGVudGljYWwob3RoZXIuZWxlbWVudCwgZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoRGFydFR5cGUgb3RoZXIsIF9Bc3N1bXB0aW9ucyBhc3N1bXB0aW9ucykgewogICAgaWYgKG90aGVyIGlzIFR5cGVWYXJpYWJsZVR5cGUpIHsKICAgICAgcmV0dXJuIGlkZW50aWNhbChvdGhlci5lbGVtZW50LCBlbGVtZW50KTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICcke2VsZW1lbnQudHlwZURlY2xhcmF0aW9uLm5hbWV9LiR7ZWxlbWVudC5uYW1lfSc7Cn0KCi8vLyBBIHR5cGUgdmFyaWFibGUgZGVjbGFyZWQgb24gYSBmdW5jdGlvbiB0eXBlLgovLy8KLy8vIEZvciBpbnN0YW5jZSBgVGAgaW4KLy8vICAgICB2b2lkIEZ1bmN0aW9uPFQ+KFQgdCkKLy8vCi8vLyBTdWNoIGEgdHlwZSB2YXJpYWJsZSBpcyBkaWZmZXJlbnQgZnJvbSBhIFtUeXBlVmFyaWFibGVUeXBlXSBiZWNhdXNlIGl0Ci8vLyBkb2Vzbid0IGhhdmUgYSB1bmlxdWUgaWRlbnRpdHk7IGlzIGlzIGVxdWFsIHRvIGFueSBvdGhlcgovLy8gW0Z1bmN0aW9uVHlwZVZhcmlhYmxlXSB1c2VkIHNpbWlsYXJseSBpbiBhbm90aGVyIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50Ci8vLyBmdW5jdGlvbiB0eXBlLgpjbGFzcyBGdW5jdGlvblR5cGVWYXJpYWJsZSBleHRlbmRzIERhcnRUeXBlIHsKICAvLy8gVGhlIGluZGV4IG9mIHRoaXMgdHlwZSB3aXRoaW4gdGhlIHR5cGUgdmFyaWFibGVzIG9mIHRoZSBkZWNsYXJpbmcgZnVuY3Rpb24KICAvLy8gdHlwZS4KICBmaW5hbCBpbnQgaW5kZXg7CgogIC8vLyBUaGUgYm91bmQgb2YgdGhpcyBmdW5jdGlvbiB0eXBlIHZhcmlhYmxlLgogIERhcnRUeXBlIF9ib3VuZDsKCiAgRnVuY3Rpb25UeXBlVmFyaWFibGUodGhpcy5pbmRleCk7CgogIERhcnRUeXBlIGdldCBib3VuZCB7CiAgICBhc3NlcnQoX2JvdW5kICE9IG51bGwsICJCb3VuZCBoYXNuJ3QgYmVlbiBzZXQuIik7CiAgICByZXR1cm4gX2JvdW5kOwogIH0KCiAgdm9pZCBzZXQgYm91bmQoRGFydFR5cGUgdmFsdWUpIHsKICAgIGFzc2VydChfYm91bmQgPT0gbnVsbCwgIkJvdW5kIGhhcyBhbHJlYWR5IGJlZW4gc2V0LiIpOwogICAgX2JvdW5kID0gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Z1bmN0aW9uVHlwZVZhcmlhYmxlID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgX2NvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMoTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gYmluZGluZ3MpIHsKICAgIGlmIChiaW5kaW5ncyA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChiaW5kaW5ncy5pbmRleE9mKHRoaXMpID49IDApIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgc3Vic3QoTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzLCBMaXN0PERhcnRUeXBlPiBwYXJhbWV0ZXJzKSB7CiAgICBhc3NlcnQoYXJndW1lbnRzLmxlbmd0aCA9PSBwYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICBpZiAocGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgIC8vIFJldHVybiBmYXN0IG9uIGVtcHR5IHN1YnN0aXR1dGlvbnMuCiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgaW50IGluZGV4ID0gcGFyYW1ldGVycy5pbmRleE9mKHRoaXMpOwogICAgaWYgKGluZGV4ICE9IC0xKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHNbaW5kZXhdOwogICAgfQogICAgLy8gVGhlIGZ1bmN0aW9uIHR5cGUgdmFyaWFibGUgd2FzIG5vdCBzdWJzdGl0dXRlZC4KICAgIHJldHVybiB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBpbmRleC5oYXNoQ29kZSAqIDE5OwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIEZ1bmN0aW9uVHlwZVZhcmlhYmxlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIF9lcXVhbHMoRGFydFR5cGUgb3RoZXIsIF9Bc3N1bXB0aW9ucyBhc3N1bXB0aW9ucykgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBGdW5jdGlvblR5cGVWYXJpYWJsZSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGFzc3VtcHRpb25zICE9IG51bGwpIHJldHVybiBhc3N1bXB0aW9ucy5pc0Fzc3VtZWQodGhpcywgb3RoZXIpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgUiBhY2NlcHQ8UiwgQT4oRGFydFR5cGVWaXNpdG9yPFIsIEE+IHZpc2l0b3IsIEEgYXJndW1lbnQpID0+CiAgICAgIHZpc2l0b3IudmlzaXRGdW5jdGlvblR5cGVWYXJpYWJsZSh0aGlzLCBhcmd1bWVudCk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICcjJHtuZXcgU3RyaW5nLmZyb21DaGFyQ29kZSgweDQxICsgaW5kZXgpfSc7Cn0KCmNsYXNzIFZvaWRUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIGNvbnN0IFZvaWRUeXBlKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVm9pZCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBzdWJzdChMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMsIExpc3Q8RGFydFR5cGU+IHBhcmFtZXRlcnMpIHsKICAgIC8vIGB2b2lkYCBjYW5ub3QgYmUgc3Vic3RpdHV0ZWQuCiAgICByZXR1cm4gdGhpczsKICB9CgogIEBvdmVycmlkZQogIFIgYWNjZXB0PFIsIEE+KERhcnRUeXBlVmlzaXRvcjxSLCBBPiB2aXNpdG9yLCBBIGFyZ3VtZW50KSA9PgogICAgICB2aXNpdG9yLnZpc2l0Vm9pZFR5cGUodGhpcywgYXJndW1lbnQpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IDYwMDc7CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhEYXJ0VHlwZSBvdGhlciwgX0Fzc3VtcHRpb25zIGFzc3VtcHRpb25zKSB7CiAgICByZXR1cm4gaWRlbnRpY2FsKHRoaXMsIG90aGVyKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICd2b2lkJzsKfQoKY2xhc3MgRHluYW1pY1R5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgY29uc3QgRHluYW1pY1R5cGUoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNEeW5hbWljID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IHRyZWF0QXNEeW5hbWljID0+IHRydWU7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHN1YnN0KExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cywgTGlzdDxEYXJ0VHlwZT4gcGFyYW1ldGVycykgewogICAgLy8gYGR5bmFtaWNgIGNhbm5vdCBiZSBzdWJzdGl0dXRlZC4KICAgIHJldHVybiB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgUiBhY2NlcHQ8UiwgQT4oRGFydFR5cGVWaXNpdG9yPFIsIEE+IHZpc2l0b3IsIEEgYXJndW1lbnQpID0+CiAgICAgIHZpc2l0b3IudmlzaXREeW5hbWljVHlwZSh0aGlzLCBhcmd1bWVudCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gOTE7CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhEYXJ0VHlwZSBvdGhlciwgX0Fzc3VtcHRpb25zIGFzc3VtcHRpb25zKSB7CiAgICByZXR1cm4gaWRlbnRpY2FsKHRoaXMsIG90aGVyKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdkeW5hbWljJzsKfQoKY2xhc3MgRnVuY3Rpb25UeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIGZpbmFsIERhcnRUeXBlIHJldHVyblR5cGU7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gcGFyYW1ldGVyVHlwZXM7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gb3B0aW9uYWxQYXJhbWV0ZXJUeXBlczsKCiAgLy8vIFRoZSBuYW1lcyBvZiB0aGUgbmFtZWQgcGFyYW1ldGVycyBvcmRlcmVkIGxleGljb2dyYXBoaWNhbGx5LgogIGZpbmFsIExpc3Q8U3RyaW5nPiBuYW1lZFBhcmFtZXRlcnM7CgogIC8vLyBUaGUgdHlwZXMgb2YgdGhlIG5hbWVkIHBhcmFtZXRlcnMgaW4gdGhlIG9yZGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlCiAgLy8vIFtuYW1lZFBhcmFtZXRlcnNdLgogIGZpbmFsIExpc3Q8RGFydFR5cGU+IG5hbWVkUGFyYW1ldGVyVHlwZXM7CgogIGZpbmFsIExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IHR5cGVWYXJpYWJsZXM7CgogIEZ1bmN0aW9uVHlwZSgKICAgICAgdGhpcy5yZXR1cm5UeXBlLAogICAgICB0aGlzLnBhcmFtZXRlclR5cGVzLAogICAgICB0aGlzLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMsCiAgICAgIHRoaXMubmFtZWRQYXJhbWV0ZXJzLAogICAgICB0aGlzLm5hbWVkUGFyYW1ldGVyVHlwZXMsCiAgICAgIHRoaXMudHlwZVZhcmlhYmxlcykgewogICAgYXNzZXJ0KHJldHVyblR5cGUgIT0gbnVsbCwgIkludmFsaWQgcmV0dXJuIHR5cGUgaW4gJHRoaXMuIik7CiAgICBhc3NlcnQoIXBhcmFtZXRlclR5cGVzLmNvbnRhaW5zKG51bGwpLCAiSW52YWxpZCBwYXJhbWV0ZXIgdHlwZXMgaW4gJHRoaXMuIik7CiAgICBhc3NlcnQoIW9wdGlvbmFsUGFyYW1ldGVyVHlwZXMuY29udGFpbnMobnVsbCksCiAgICAgICAgIkludmFsaWQgb3B0aW9uYWwgcGFyYW1ldGVyIHR5cGVzIGluICR0aGlzLiIpOwogICAgYXNzZXJ0KAogICAgICAgICFuYW1lZFBhcmFtZXRlcnMuY29udGFpbnMobnVsbCksICJJbnZhbGlkIG5hbWVkIHBhcmFtZXRlcnMgaW4gJHRoaXMuIik7CiAgICBhc3NlcnQoIW5hbWVkUGFyYW1ldGVyVHlwZXMuY29udGFpbnMobnVsbCksCiAgICAgICAgIkludmFsaWQgbmFtZWQgcGFyYW1ldGVyIHR5cGVzIGluICR0aGlzLiIpOwogICAgYXNzZXJ0KCF0eXBlVmFyaWFibGVzLmNvbnRhaW5zKG51bGwpLCAiSW52YWxpZCB0eXBlIHZhcmlhYmxlcyBpbiAkdGhpcy4iKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGNvbnRhaW5zVHlwZVZhcmlhYmxlcyB7CiAgICByZXR1cm4gdHlwZVZhcmlhYmxlcy5hbnkoKHR5cGUpID0+IHR5cGUuYm91bmQuY29udGFpbnNUeXBlVmFyaWFibGVzKSB8fAogICAgICAgIHJldHVyblR5cGUuY29udGFpbnNUeXBlVmFyaWFibGVzIHx8CiAgICAgICAgcGFyYW1ldGVyVHlwZXMuYW55KCh0eXBlKSA9PiB0eXBlLmNvbnRhaW5zVHlwZVZhcmlhYmxlcykgfHwKICAgICAgICBvcHRpb25hbFBhcmFtZXRlclR5cGVzLmFueSgodHlwZSkgPT4gdHlwZS5jb250YWluc1R5cGVWYXJpYWJsZXMpIHx8CiAgICAgICAgbmFtZWRQYXJhbWV0ZXJUeXBlcy5hbnkoKHR5cGUpID0+IHR5cGUuY29udGFpbnNUeXBlVmFyaWFibGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFR5cGVWYXJpYWJsZShmKFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGUpKSB7CiAgICB0eXBlVmFyaWFibGVzLmZvckVhY2goKHR5cGUpID0+IHR5cGUuYm91bmQuZm9yRWFjaFR5cGVWYXJpYWJsZShmKSk7CiAgICByZXR1cm5UeXBlLmZvckVhY2hUeXBlVmFyaWFibGUoZik7CiAgICBwYXJhbWV0ZXJUeXBlcy5mb3JFYWNoKCh0eXBlKSA9PiB0eXBlLmZvckVhY2hUeXBlVmFyaWFibGUoZikpOwogICAgb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcy5mb3JFYWNoKCh0eXBlKSA9PiB0eXBlLmZvckVhY2hUeXBlVmFyaWFibGUoZikpOwogICAgbmFtZWRQYXJhbWV0ZXJUeXBlcy5mb3JFYWNoKCh0eXBlKSA9PiB0eXBlLmZvckVhY2hUeXBlVmFyaWFibGUoZikpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBfY29udGFpbnNGcmVlVHlwZVZhcmlhYmxlcyhMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiBiaW5kaW5ncykgewogICAgaW50IHJlc3RvcmU7CiAgICBpZiAodHlwZVZhcmlhYmxlcy5pc05vdEVtcHR5KSB7CiAgICAgIGlmIChiaW5kaW5ncyA9PSBudWxsKSB7CiAgICAgICAgYmluZGluZ3MgPSA8RnVuY3Rpb25UeXBlVmFyaWFibGU+W107CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdG9yZSA9IGJpbmRpbmdzLmxlbmd0aDsKICAgICAgfQogICAgICBiaW5kaW5ncy5hZGRBbGwodHlwZVZhcmlhYmxlcyk7CiAgICB9CgogICAgYm9vbCBoYXNGcmVlKERhcnRUeXBlIHR5cGUpID0+IHR5cGUuX2NvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMoYmluZGluZ3MpOwoKICAgIGJvb2wgcmVzdWx0ID0gaGFzRnJlZShyZXR1cm5UeXBlKSB8fAogICAgICAgIHR5cGVWYXJpYWJsZXMuYW55KCh0eXBlKSA9PiBoYXNGcmVlKHR5cGUuYm91bmQpKSB8fAogICAgICAgIHBhcmFtZXRlclR5cGVzLmFueShoYXNGcmVlKSB8fAogICAgICAgIG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMuYW55KGhhc0ZyZWUpIHx8CiAgICAgICAgbmFtZWRQYXJhbWV0ZXJUeXBlcy5hbnkoaGFzRnJlZSk7CgogICAgaWYgKHJlc3RvcmUgIT0gbnVsbCkgYmluZGluZ3MubGVuZ3RoID0gcmVzdG9yZTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Z1bmN0aW9uVHlwZSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBzdWJzdChMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMsIExpc3Q8RGFydFR5cGU+IHBhcmFtZXRlcnMpIHsKICAgIGlmIChwYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgYXNzZXJ0KGFyZ3VtZW50cy5pc0VtcHR5KTsKICAgICAgLy8gUmV0dXJuIGZhc3Qgb24gZW1wdHkgc3Vic3RpdHV0aW9ucy4KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBEYXJ0VHlwZSBuZXdSZXR1cm5UeXBlID0gcmV0dXJuVHlwZS5zdWJzdChhcmd1bWVudHMsIHBhcmFtZXRlcnMpOwogICAgYm9vbCBjaGFuZ2VkID0gIWlkZW50aWNhbChuZXdSZXR1cm5UeXBlLCByZXR1cm5UeXBlKTsKICAgIExpc3Q8RGFydFR5cGU+IG5ld1BhcmFtZXRlclR5cGVzID0KICAgICAgICBfc3Vic3RUeXBlcyhwYXJhbWV0ZXJUeXBlcywgYXJndW1lbnRzLCBwYXJhbWV0ZXJzKTsKICAgIExpc3Q8RGFydFR5cGU+IG5ld09wdGlvbmFsUGFyYW1ldGVyVHlwZXMgPQogICAgICAgIF9zdWJzdFR5cGVzKG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMsIGFyZ3VtZW50cywgcGFyYW1ldGVycyk7CiAgICBMaXN0PERhcnRUeXBlPiBuZXdOYW1lZFBhcmFtZXRlclR5cGVzID0KICAgICAgICBfc3Vic3RUeXBlcyhuYW1lZFBhcmFtZXRlclR5cGVzLCBhcmd1bWVudHMsIHBhcmFtZXRlcnMpOwogICAgaWYgKCFjaGFuZ2VkICYmCiAgICAgICAgKCFpZGVudGljYWwocGFyYW1ldGVyVHlwZXMsIG5ld1BhcmFtZXRlclR5cGVzKSB8fAogICAgICAgICAgICAhaWRlbnRpY2FsKG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMsIG5ld09wdGlvbmFsUGFyYW1ldGVyVHlwZXMpIHx8CiAgICAgICAgICAgICFpZGVudGljYWwobmFtZWRQYXJhbWV0ZXJUeXBlcywgbmV3TmFtZWRQYXJhbWV0ZXJUeXBlcykpKSB7CiAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgfQogICAgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gbmV3VHlwZVZhcmlhYmxlczsKICAgIGlmICh0eXBlVmFyaWFibGVzLmlzTm90RW1wdHkpIHsKICAgICAgaWYgKHBhcmFtZXRlcnMgPT0gdHlwZVZhcmlhYmxlcykgewogICAgICAgIG5ld1R5cGVWYXJpYWJsZXMgPSBjb25zdCA8RnVuY3Rpb25UeXBlVmFyaWFibGU+W107CiAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW50IGluZGV4ID0gMDsKICAgICAgICBmb3IgKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgICBEYXJ0VHlwZSBuZXdCb3VuZCA9IHR5cGVWYXJpYWJsZS5ib3VuZC5zdWJzdChhcmd1bWVudHMsIHBhcmFtZXRlcnMpOwogICAgICAgICAgaWYgKCFpZGVudGljYWwodHlwZVZhcmlhYmxlLmJvdW5kLCBuZXdCb3VuZCkpIHsKICAgICAgICAgICAgbmV3VHlwZVZhcmlhYmxlcyA/Pz0gdHlwZVZhcmlhYmxlcy5zdWJsaXN0KDAsIGluZGV4KTsKICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXdUeXBlVmFyaWFibGVzPy5hZGQodHlwZVZhcmlhYmxlKTsKICAgICAgICAgIH0KICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgfQogICAgICAgIG5ld1R5cGVWYXJpYWJsZXMgPz89IHR5cGVWYXJpYWJsZXM7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIG5ld1R5cGVWYXJpYWJsZXMgPSB0eXBlVmFyaWFibGVzOwogICAgfQogICAgaWYgKGNoYW5nZWQpIHsKICAgICAgLy8gQ3JlYXRlIGEgbmV3IHR5cGUgb25seSBpZiBuZWNlc3NhcnkuCiAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKAogICAgICAgICAgbmV3UmV0dXJuVHlwZSwKICAgICAgICAgIG5ld1BhcmFtZXRlclR5cGVzLAogICAgICAgICAgbmV3T3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywKICAgICAgICAgIG5hbWVkUGFyYW1ldGVycywKICAgICAgICAgIG5ld05hbWVkUGFyYW1ldGVyVHlwZXMsCiAgICAgICAgICBuZXdUeXBlVmFyaWFibGVzKTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KCiAgRnVuY3Rpb25UeXBlIGluc3RhbnRpYXRlKExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cykgewogICAgcmV0dXJuIHN1YnN0KGFyZ3VtZW50cywgdHlwZVZhcmlhYmxlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDxSLCBBPihEYXJ0VHlwZVZpc2l0b3I8UiwgQT4gdmlzaXRvciwgQSBhcmd1bWVudCkgPT4KICAgICAgdmlzaXRvci52aXNpdEZ1bmN0aW9uVHlwZSh0aGlzLCBhcmd1bWVudCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgaW50IGhhc2ggPSAzICogcmV0dXJuVHlwZS5oYXNoQ29kZTsKICAgIGZvciAoRGFydFR5cGUgcGFyYW1ldGVyIGluIHBhcmFtZXRlclR5cGVzKSB7CiAgICAgIGhhc2ggPSAxNyAqIGhhc2ggKyA1ICogcGFyYW1ldGVyLmhhc2hDb2RlOwogICAgfQogICAgZm9yIChEYXJ0VHlwZSBwYXJhbWV0ZXIgaW4gb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcykgewogICAgICBoYXNoID0gMTkgKiBoYXNoICsgNyAqIHBhcmFtZXRlci5oYXNoQ29kZTsKICAgIH0KICAgIGZvciAoU3RyaW5nIG5hbWUgaW4gbmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIGhhc2ggPSAyMyAqIGhhc2ggKyAxMSAqIG5hbWUuaGFzaENvZGU7CiAgICB9CiAgICBmb3IgKERhcnRUeXBlIHBhcmFtZXRlciBpbiBuYW1lZFBhcmFtZXRlclR5cGVzKSB7CiAgICAgIGhhc2ggPSAyOSAqIGhhc2ggKyAxMyAqIHBhcmFtZXRlci5oYXNoQ29kZTsKICAgIH0KICAgIHJldHVybiBoYXNoOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBGdW5jdGlvblR5cGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfZXF1YWxzSW50ZXJuYWwob3RoZXIsIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBfZXF1YWxzKERhcnRUeXBlIG90aGVyLCBfQXNzdW1wdGlvbnMgYXNzdW1wdGlvbnMpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgRnVuY3Rpb25UeXBlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX2VxdWFsc0ludGVybmFsKG90aGVyLCBhc3N1bXB0aW9ucyk7CiAgfQoKICBib29sIF9lcXVhbHNJbnRlcm5hbChGdW5jdGlvblR5cGUgb3RoZXIsIF9Bc3N1bXB0aW9ucyBhc3N1bXB0aW9ucykgewogICAgaWYgKHR5cGVWYXJpYWJsZXMubGVuZ3RoICE9IG90aGVyLnR5cGVWYXJpYWJsZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICBpZiAodHlwZVZhcmlhYmxlcy5pc05vdEVtcHR5KSB7CiAgICAgIGFzc3VtcHRpb25zID8/PSBuZXcgX0Fzc3VtcHRpb25zKCk7CiAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCB0eXBlVmFyaWFibGVzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgIGFzc3VtcHRpb25zLmFzc3VtZSh0eXBlVmFyaWFibGVzW2luZGV4XSwgb3RoZXIudHlwZVZhcmlhYmxlc1tpbmRleF0pOwogICAgICB9CiAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCB0eXBlVmFyaWFibGVzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgIGlmICghdHlwZVZhcmlhYmxlc1tpbmRleF0KICAgICAgICAgICAgLmJvdW5kCiAgICAgICAgICAgIC5fZXF1YWxzKG90aGVyLnR5cGVWYXJpYWJsZXNbaW5kZXhdLmJvdW5kLCBhc3N1bXB0aW9ucykpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGJvb2wgcmVzdWx0ID0gcmV0dXJuVHlwZS5fZXF1YWxzKG90aGVyLnJldHVyblR5cGUsIGFzc3VtcHRpb25zKSAmJgogICAgICAgIF9lcXVhbFR5cGVzKHBhcmFtZXRlclR5cGVzLCBvdGhlci5wYXJhbWV0ZXJUeXBlcywgYXNzdW1wdGlvbnMpICYmCiAgICAgICAgX2VxdWFsVHlwZXMob3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywgb3RoZXIub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywKICAgICAgICAgICAgYXNzdW1wdGlvbnMpICYmCiAgICAgICAgZXF1YWxFbGVtZW50cyhuYW1lZFBhcmFtZXRlcnMsIG90aGVyLm5hbWVkUGFyYW1ldGVycykgJiYKICAgICAgICBfZXF1YWxUeXBlcygKICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJUeXBlcywgb3RoZXIubmFtZWRQYXJhbWV0ZXJUeXBlcywgYXNzdW1wdGlvbnMpOwogICAgaWYgKHR5cGVWYXJpYWJsZXMuaXNOb3RFbXB0eSkgewogICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdHlwZVZhcmlhYmxlcy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICBhc3N1bXB0aW9ucy5mb3JnZXQodHlwZVZhcmlhYmxlc1tpbmRleF0sIG90aGVyLnR5cGVWYXJpYWJsZXNbaW5kZXhdKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKHJldHVyblR5cGUpOwogICAgc2Iud3JpdGUoJyBGdW5jdGlvbicpOwogICAgaWYgKHR5cGVWYXJpYWJsZXMuaXNOb3RFbXB0eSkgewogICAgICBzYi53cml0ZSgnPCcpOwogICAgICBib29sIG5lZWRzQ29tbWEgPSBmYWxzZTsKICAgICAgZm9yIChGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUgaW4gdHlwZVZhcmlhYmxlcykgewogICAgICAgIGlmIChuZWVkc0NvbW1hKSB7CiAgICAgICAgICBzYi53cml0ZSgnLCcpOwogICAgICAgIH0KICAgICAgICBzYi53cml0ZSh0eXBlVmFyaWFibGUpOwogICAgICAgIERhcnRUeXBlIGJvdW5kID0gdHlwZVZhcmlhYmxlLmJvdW5kOwogICAgICAgIGlmICghYm91bmQuaXNPYmplY3QpIHsKICAgICAgICAgIHNiLndyaXRlKCcgZXh0ZW5kcyAnKTsKICAgICAgICAgIHNiLndyaXRlKHR5cGVWYXJpYWJsZS5ib3VuZCk7CiAgICAgICAgfQogICAgICAgIG5lZWRzQ29tbWEgPSB0cnVlOwogICAgICB9CiAgICAgIHNiLndyaXRlKCc+Jyk7CiAgICB9CiAgICBzYi53cml0ZSgnKCcpOwogICAgYm9vbCBuZWVkc0NvbW1hID0gZmFsc2U7CiAgICBmb3IgKERhcnRUeXBlIHBhcmFtZXRlclR5cGUgaW4gcGFyYW1ldGVyVHlwZXMpIHsKICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICBzYi53cml0ZSgnLCcpOwogICAgICB9CiAgICAgIHNiLndyaXRlKHBhcmFtZXRlclR5cGUpOwogICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKICAgIH0KICAgIGlmIChvcHRpb25hbFBhcmFtZXRlclR5cGVzLmlzTm90RW1wdHkpIHsKICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICBzYi53cml0ZSgnLCcpOwogICAgICB9CiAgICAgIHNiLndyaXRlKCdbJyk7CiAgICAgIGJvb2wgbmVlZHNPcHRpb25hbENvbW1hID0gZmFsc2U7CiAgICAgIGZvciAoRGFydFR5cGUgdHlwZUFyZ3VtZW50IGluIG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMpIHsKICAgICAgICBpZiAobmVlZHNPcHRpb25hbENvbW1hKSB7CiAgICAgICAgICBzYi53cml0ZSgnLCcpOwogICAgICAgIH0KICAgICAgICBzYi53cml0ZSh0eXBlQXJndW1lbnQpOwogICAgICAgIG5lZWRzT3B0aW9uYWxDb21tYSA9IHRydWU7CiAgICAgIH0KICAgICAgc2Iud3JpdGUoJ10nKTsKICAgICAgbmVlZHNDb21tYSA9IHRydWU7CiAgICB9CiAgICBpZiAobmFtZWRQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICBzYi53cml0ZSgnLCcpOwogICAgICB9CiAgICAgIHNiLndyaXRlKCd7Jyk7CiAgICAgIGJvb2wgbmVlZHNOYW1lZENvbW1hID0gZmFsc2U7CiAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBuYW1lZFBhcmFtZXRlcnMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgaWYgKG5lZWRzTmFtZWRDb21tYSkgewogICAgICAgICAgc2Iud3JpdGUoJywnKTsKICAgICAgICB9CiAgICAgICAgc2Iud3JpdGUobmFtZWRQYXJhbWV0ZXJUeXBlc1tpbmRleF0pOwogICAgICAgIHNiLndyaXRlKCcgJyk7CiAgICAgICAgc2Iud3JpdGUobmFtZWRQYXJhbWV0ZXJzW2luZGV4XSk7CiAgICAgICAgbmVlZHNOYW1lZENvbW1hID0gdHJ1ZTsKICAgICAgfQogICAgICBzYi53cml0ZSgnfScpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgRnV0dXJlT3JUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIGZpbmFsIERhcnRUeXBlIHR5cGVBcmd1bWVudDsKCiAgRnV0dXJlT3JUeXBlKHRoaXMudHlwZUFyZ3VtZW50KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNGdXR1cmVPciA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBzdWJzdChMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMsIExpc3Q8RGFydFR5cGU+IHBhcmFtZXRlcnMpIHsKICAgIERhcnRUeXBlIG5ld1R5cGVBcmd1bWVudCA9IHR5cGVBcmd1bWVudC5zdWJzdChhcmd1bWVudHMsIHBhcmFtZXRlcnMpOwogICAgaWYgKGlkZW50aWNhbCh0eXBlQXJndW1lbnQsIG5ld1R5cGVBcmd1bWVudCkpIHJldHVybiB0aGlzOwogICAgcmV0dXJuIG5ldyBGdXR1cmVPclR5cGUobmV3VHlwZUFyZ3VtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGNvbnRhaW5zVHlwZVZhcmlhYmxlcyA9PiB0eXBlQXJndW1lbnQuY29udGFpbnNUeXBlVmFyaWFibGVzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hUeXBlVmFyaWFibGUoZihUeXBlVmFyaWFibGVUeXBlIHZhcmlhYmxlKSkgewogICAgdHlwZUFyZ3VtZW50LmZvckVhY2hUeXBlVmFyaWFibGUoZik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIF9jb250YWluc0ZyZWVUeXBlVmFyaWFibGVzKExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IGJpbmRpbmdzKSA9PgogICAgICB0eXBlQXJndW1lbnQuX2NvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMoYmluZGluZ3MpOwoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDxSLCBBPihEYXJ0VHlwZVZpc2l0b3I8UiwgQT4gdmlzaXRvciwgQSBhcmd1bWVudCkgPT4KICAgICAgdmlzaXRvci52aXNpdEZ1dHVyZU9yVHlwZSh0aGlzLCBhcmd1bWVudCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gdHlwZUFyZ3VtZW50Lmhhc2hDb2RlICogMTM7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgRnV0dXJlT3JUeXBlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX2VxdWFsc0ludGVybmFsKG90aGVyLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2VxdWFscyhEYXJ0VHlwZSBvdGhlciwgX0Fzc3VtcHRpb25zIGFzc3VtcHRpb25zKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIEZ1dHVyZU9yVHlwZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIF9lcXVhbHNJbnRlcm5hbChvdGhlciwgYXNzdW1wdGlvbnMpOwogIH0KCiAgYm9vbCBfZXF1YWxzSW50ZXJuYWwoRnV0dXJlT3JUeXBlIG90aGVyLCBfQXNzdW1wdGlvbnMgYXNzdW1wdGlvbnMpIHsKICAgIHJldHVybiB0eXBlQXJndW1lbnQuX2VxdWFscyhvdGhlci50eXBlQXJndW1lbnQsIGFzc3VtcHRpb25zKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdGdXR1cmVPcicpOwogICAgc2Iud3JpdGUoJzwnKTsKICAgIHNiLndyaXRlKHR5cGVBcmd1bWVudCk7CiAgICBzYi53cml0ZSgnPicpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgovLy8gSGVscGVyIG1ldGhvZCBmb3IgcGVyZm9ybWluZyBzdWJzdGl0dXRpb24gb2YgYSBsaXN0IG9mIHR5cGVzLgovLy8KLy8vIElmIG5vIHR5cGVzIGFyZSBjaGFuZ2VkIGJ5IHRoZSBzdWJzdGl0dXRpb24sIHRoZSBbdHlwZXNdIGlzIHJldHVybmVkCi8vLyBpbnN0ZWFkIG9mIGEgbmV3bHkgY3JlYXRlZCBsaXN0LgpMaXN0PERhcnRUeXBlPiBfc3Vic3RUeXBlcygKICAgIExpc3Q8RGFydFR5cGU+IHR5cGVzLCBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMsIExpc3Q8RGFydFR5cGU+IHBhcmFtZXRlcnMpIHsKICBib29sIGNoYW5nZWQgPSBmYWxzZTsKICBMaXN0PERhcnRUeXBlPiByZXN1bHQgPQogICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZ2VuZXJhdGUodHlwZXMubGVuZ3RoLCAoaW50IGluZGV4KSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gdHlwZXNbaW5kZXhdOwogICAgRGFydFR5cGUgYXJndW1lbnQgPSB0eXBlLnN1YnN0KGFyZ3VtZW50cywgcGFyYW1ldGVycyk7CiAgICBpZiAoIWNoYW5nZWQgJiYgIWlkZW50aWNhbChhcmd1bWVudCwgdHlwZSkpIHsKICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gYXJndW1lbnQ7CiAgfSk7CiAgLy8gVXNlIHRoZSBuZXcgTGlzdCBvbmx5IGlmIG5lY2Vzc2FyeS4KICByZXR1cm4gY2hhbmdlZCA/IHJlc3VsdCA6IHR5cGVzOwp9Cgpib29sIF9lcXVhbFR5cGVzKExpc3Q8RGFydFR5cGU+IGEsIExpc3Q8RGFydFR5cGU+IGIsIF9Bc3N1bXB0aW9ucyBhc3N1bXB0aW9ucykgewogIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBhLmxlbmd0aDsgaW5kZXgrKykgewogICAgaWYgKCFhW2luZGV4XS5fZXF1YWxzKGJbaW5kZXhdLCBhc3N1bXB0aW9ucykpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQoKYWJzdHJhY3QgY2xhc3MgRGFydFR5cGVWaXNpdG9yPFIsIEE+IHsKICBjb25zdCBEYXJ0VHlwZVZpc2l0b3IoKTsKCiAgUiB2aXNpdChjb3ZhcmlhbnQgRGFydFR5cGUgdHlwZSwgQSBhcmd1bWVudCkgPT4gdHlwZS5hY2NlcHQodGhpcywgYXJndW1lbnQpOwoKICBSIHZpc2l0Vm9pZFR5cGUoY292YXJpYW50IFZvaWRUeXBlIHR5cGUsIEEgYXJndW1lbnQpID0+IG51bGw7CgogIFIgdmlzaXRUeXBlVmFyaWFibGVUeXBlKGNvdmFyaWFudCBUeXBlVmFyaWFibGVUeXBlIHR5cGUsIEEgYXJndW1lbnQpID0+IG51bGw7CgogIFIgdmlzaXRGdW5jdGlvblR5cGVWYXJpYWJsZSgKICAgICAgICAgIGNvdmFyaWFudCBGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlLCBBIGFyZ3VtZW50KSA9PgogICAgICBudWxsOwoKICBSIHZpc2l0RnVuY3Rpb25UeXBlKGNvdmFyaWFudCBGdW5jdGlvblR5cGUgdHlwZSwgQSBhcmd1bWVudCkgPT4gbnVsbDsKCiAgUiB2aXNpdEludGVyZmFjZVR5cGUoY292YXJpYW50IEludGVyZmFjZVR5cGUgdHlwZSwgQSBhcmd1bWVudCkgPT4gbnVsbDsKCiAgUiB2aXNpdFR5cGVkZWZUeXBlKGNvdmFyaWFudCBUeXBlZGVmVHlwZSB0eXBlLCBBIGFyZ3VtZW50KSA9PiBudWxsOwoKICBSIHZpc2l0RHluYW1pY1R5cGUoY292YXJpYW50IER5bmFtaWNUeXBlIHR5cGUsIEEgYXJndW1lbnQpID0+IG51bGw7CgogIFIgdmlzaXRGdXR1cmVPclR5cGUoY292YXJpYW50IEZ1dHVyZU9yVHlwZSB0eXBlLCBBIGFyZ3VtZW50KSA9PiBudWxsOwp9CgphYnN0cmFjdCBjbGFzcyBCYXNlRGFydFR5cGVWaXNpdG9yPFIsIEE+IGV4dGVuZHMgRGFydFR5cGVWaXNpdG9yPFIsIEE+IHsKICBjb25zdCBCYXNlRGFydFR5cGVWaXNpdG9yKCk7CgogIFIgdmlzaXRUeXBlKGNvdmFyaWFudCBEYXJ0VHlwZSB0eXBlLCBBIGFyZ3VtZW50KTsKCiAgQG92ZXJyaWRlCiAgUiB2aXNpdFZvaWRUeXBlKGNvdmFyaWFudCBWb2lkVHlwZSB0eXBlLCBBIGFyZ3VtZW50KSA9PgogICAgICB2aXNpdFR5cGUodHlwZSwgYXJndW1lbnQpOwoKICBAb3ZlcnJpZGUKICBSIHZpc2l0VHlwZVZhcmlhYmxlVHlwZShjb3ZhcmlhbnQgVHlwZVZhcmlhYmxlVHlwZSB0eXBlLCBBIGFyZ3VtZW50KSA9PgogICAgICB2aXNpdFR5cGUodHlwZSwgYXJndW1lbnQpOwoKICBAb3ZlcnJpZGUKICBSIHZpc2l0RnVuY3Rpb25UeXBlVmFyaWFibGUoCiAgICAgICAgICBjb3ZhcmlhbnQgRnVuY3Rpb25UeXBlVmFyaWFibGUgdHlwZSwgQSBhcmd1bWVudCkgPT4KICAgICAgdmlzaXRUeXBlKHR5cGUsIGFyZ3VtZW50KTsKCiAgQG92ZXJyaWRlCiAgUiB2aXNpdEZ1bmN0aW9uVHlwZShjb3ZhcmlhbnQgRnVuY3Rpb25UeXBlIHR5cGUsIEEgYXJndW1lbnQpID0+CiAgICAgIHZpc2l0VHlwZSh0eXBlLCBhcmd1bWVudCk7CgogIEBvdmVycmlkZQogIFIgdmlzaXRJbnRlcmZhY2VUeXBlKGNvdmFyaWFudCBJbnRlcmZhY2VUeXBlIHR5cGUsIEEgYXJndW1lbnQpID0+CiAgICAgIHZpc2l0VHlwZSh0eXBlLCBhcmd1bWVudCk7CgogIEBvdmVycmlkZQogIFIgdmlzaXREeW5hbWljVHlwZShjb3ZhcmlhbnQgRHluYW1pY1R5cGUgdHlwZSwgQSBhcmd1bWVudCkgPT4KICAgICAgdmlzaXRUeXBlKHR5cGUsIGFyZ3VtZW50KTsKCiAgQG92ZXJyaWRlCiAgUiB2aXNpdEZ1dHVyZU9yVHlwZShjb3ZhcmlhbnQgRnV0dXJlT3JUeXBlIHR5cGUsIEEgYXJndW1lbnQpID0+CiAgICAgIHZpc2l0VHlwZSh0eXBlLCBhcmd1bWVudCk7Cn0KCi8vLyBBYnN0cmFjdCB2aXNpdG9yIGZvciBkZXRlcm1pbmluZyByZWxhdGlvbnMgYmV0d2VlbiB0eXBlcy4KYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUeXBlUmVsYXRpb248VCBleHRlbmRzIERhcnRUeXBlPgogICAgZXh0ZW5kcyBCYXNlRGFydFR5cGVWaXNpdG9yPGJvb2wsIFQ+IHsKICBDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHM7CgogIGZpbmFsIF9Bc3N1bXB0aW9ucyBhc3N1bXB0aW9ucyA9IG5ldyBfQXNzdW1wdGlvbnMoKTsKCiAgLy8vIEVuc3VyZXMgdGhhdCB0aGUgc3VwZXIgaGllcmFyY2h5IG9mIFt0eXBlXSBpcyBjb21wdXRlZC4KICB2b2lkIGVuc3VyZVJlc29sdmVkKEludGVyZmFjZVR5cGUgdHlwZSkge30KCiAgLy8vIFJldHVybnMgdGhlIHVuYWxpYXNlZCB2ZXJzaW9uIG9mIFt0eXBlXS4KICBUIGdldFVuYWxpYXNlZChUIHR5cGUpID0+IHR5cGUudW5hbGlhc2VkOwoKICAvLy8gUmV0dXJucyBbdHlwZV0gYXMgYW4gaW5zdGFuY2Ugb2YgW2Nsc10sIG9yIGBudWxsYCBpZiBbdHlwZV0gaXMgbm90IHN1YnR5cGUKICAvLy8gaWYgW2Nsc10uCiAgSW50ZXJmYWNlVHlwZSBhc0luc3RhbmNlT2YoSW50ZXJmYWNlVHlwZSB0eXBlLCBDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgYGNhbGxgIG1ldGhvZCBvbiBbdHlwZV0sIG9yIGBudWxsYCBpZiB0aGUgY2xhc3MKICAvLy8gb2YgW3R5cGVdIGRvZXMgbm90IGhhdmUgYSBgY2FsbGAgbWV0aG9kLgogIEZ1bmN0aW9uVHlwZSBnZXRDYWxsVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUpOwoKICAvLy8gUmV0dXJucyB0aGUgZGVjbGFyZWQgYm91bmQgb2YgW2VsZW1lbnRdLgogIERhcnRUeXBlIGdldFR5cGVWYXJpYWJsZUJvdW5kKFR5cGVWYXJpYWJsZUVudGl0eSBlbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFR5cGUoVCB0LCBUIHMpIHsKICAgIHRocm93ICdpbnRlcm5hbCBlcnJvcjogdW5rbm93biB0eXBlICR7dH0nOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFZvaWRUeXBlKFZvaWRUeXBlIHQsIFQgcykgewogICAgYXNzZXJ0KHMgaXMhIFZvaWRUeXBlKTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGJvb2wgaW52YWxpZFR5cGVBcmd1bWVudHMoVCB0LCBUIHMpOwoKICBib29sIGludmFsaWRGdW5jdGlvblJldHVyblR5cGVzKFQgdCwgVCBzKTsKCiAgYm9vbCBpbnZhbGlkRnVuY3Rpb25QYXJhbWV0ZXJUeXBlcyhUIHQsIFQgcyk7CgogIGJvb2wgaW52YWxpZFR5cGVWYXJpYWJsZUJvdW5kcyhUIGJvdW5kLCBUIHMpOwoKICBib29sIGludmFsaWRDYWxsYWJsZVR5cGUoY292YXJpYW50IERhcnRUeXBlIGNhbGxUeXBlLCBjb3ZhcmlhbnQgRGFydFR5cGUgcyk7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgdCwgY292YXJpYW50IERhcnRUeXBlIHMpIHsKICAgIGVuc3VyZVJlc29sdmVkKHQpOwoKICAgIGJvb2wgY2hlY2tUeXBlQXJndW1lbnRzKEludGVyZmFjZVR5cGUgaW5zdGFuY2UsIEludGVyZmFjZVR5cGUgb3RoZXIpIHsKICAgICAgTGlzdDxUPiB0VHlwZUFyZ3MgPSBpbnN0YW5jZS50eXBlQXJndW1lbnRzOwogICAgICBMaXN0PFQ+IHNUeXBlQXJncyA9IG90aGVyLnR5cGVBcmd1bWVudHM7CiAgICAgIGFzc2VydCh0VHlwZUFyZ3MubGVuZ3RoID09IHNUeXBlQXJncy5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRUeXBlQXJncy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpbnZhbGlkVHlwZUFyZ3VtZW50cyh0VHlwZUFyZ3NbaV0sIHNUeXBlQXJnc1tpXSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgaWYgKHMgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBJbnRlcmZhY2VUeXBlIGluc3RhbmNlID0gYXNJbnN0YW5jZU9mKHQsIHMuZWxlbWVudCk7CiAgICAgIGlmIChpbnN0YW5jZSAhPSBudWxsICYmIGNoZWNrVHlwZUFyZ3VtZW50cyhpbnN0YW5jZSwgcykpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIEZ1bmN0aW9uVHlwZSBjYWxsVHlwZSA9IGdldENhbGxUeXBlKHQpOwogICAgaWYgKHMgPT0gY29tbW9uRWxlbWVudHMuZnVuY3Rpb25UeXBlICYmIGNhbGxUeXBlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKHMgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIHJldHVybiBjYWxsVHlwZSAhPSBudWxsICYmICFpbnZhbGlkQ2FsbGFibGVUeXBlKGNhbGxUeXBlLCBzKTsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSB0LCBEYXJ0VHlwZSBzKSB7CiAgICBpZiAocyA9PSBjb21tb25FbGVtZW50cy5mdW5jdGlvblR5cGUpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAocyBpcyEgRnVuY3Rpb25UeXBlKSByZXR1cm4gZmFsc2U7CiAgICBGdW5jdGlvblR5cGUgdGYgPSB0OwogICAgRnVuY3Rpb25UeXBlIHNmID0gczsKICAgIGludCB0eXBlVmFyaWFibGVzQ291bnQgPSBnZXRDb21tb25UeXBlVmFyaWFibGVzQ291bnQodGYsIHNmKTsKICAgIGlmICh0eXBlVmFyaWFibGVzQ291bnQgPT0gbnVsbCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVWYXJpYWJsZXNDb3VudDsgaSsrKSB7CiAgICAgIGFzc3VtcHRpb25zLmFzc3VtZSh0Zi50eXBlVmFyaWFibGVzW2ldLCBzZi50eXBlVmFyaWFibGVzW2ldKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVZhcmlhYmxlc0NvdW50OyBpKyspIHsKICAgICAgaWYgKCF0Zi50eXBlVmFyaWFibGVzW2ldLmJvdW5kCiAgICAgICAgICAuX2VxdWFscyhzZi50eXBlVmFyaWFibGVzW2ldLmJvdW5kLCBhc3N1bXB0aW9ucykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChpbnZhbGlkRnVuY3Rpb25SZXR1cm5UeXBlcyh0Zi5yZXR1cm5UeXBlLCBzZi5yZXR1cm5UeXBlKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgYm9vbCByZXN1bHQgPSB2aXNpdEZ1bmN0aW9uVHlwZUludGVybmFsKHRmLCBzZik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVWYXJpYWJsZXNDb3VudDsgaSsrKSB7CiAgICAgIGFzc3VtcHRpb25zLmZvcmdldCh0Zi50eXBlVmFyaWFibGVzW2ldLCBzZi50eXBlVmFyaWFibGVzW2ldKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBpbnQgZ2V0Q29tbW9uVHlwZVZhcmlhYmxlc0NvdW50KEZ1bmN0aW9uVHlwZSB0LCBGdW5jdGlvblR5cGUgcykgewogICAgaWYgKHQudHlwZVZhcmlhYmxlcy5sZW5ndGggPT0gcy50eXBlVmFyaWFibGVzLmxlbmd0aCkgewogICAgICByZXR1cm4gdC50eXBlVmFyaWFibGVzLmxlbmd0aDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgYm9vbCB2aXNpdEZ1bmN0aW9uVHlwZUludGVybmFsKEZ1bmN0aW9uVHlwZSB0ZiwgRnVuY3Rpb25UeXBlIHNmKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZXdyaXRlIHRoZSBmdW5jdGlvbiBzdWJ0eXBpbmcgdG8gYmUgbW9yZSByZWFkYWJsZQogICAgLy8gYnV0IHN0aWxsIGFzIGVmZmljaWVudC4KCiAgICAvLyBGb3IgdGhlIGNvbW1lbnRzIHdlIHVzZSB0aGUgZm9sbG93aW5nIGFiYnJldmlhdGlvbnM6CiAgICAvLyAgeC5wICAgICA6IHBhcmFtZXRlclR5cGVzIG9uIFs6eDpdLAogICAgLy8gIHgubyAgICAgOiBvcHRpb25hbFBhcmFtZXRlclR5cGVzIG9uIFs6eDpdLCBhbmQKICAgIC8vICBsZW4oeHMpIDogbGVuZ3RoIG9mIGxpc3QgWzp4czpdLgoKICAgIEl0ZXJhdG9yPFQ+IHRwcyA9IHRmLnBhcmFtZXRlclR5cGVzLml0ZXJhdG9yOwogICAgSXRlcmF0b3I8VD4gc3BzID0gc2YucGFyYW1ldGVyVHlwZXMuaXRlcmF0b3I7CiAgICBib29sIHNOb3RFbXB0eSA9IHNwcy5tb3ZlTmV4dCgpOwogICAgYm9vbCB0Tm90RW1wdHkgPSB0cHMubW92ZU5leHQoKTsKICAgIHROZXh0KCkgPT4gKHROb3RFbXB0eSA9IHRwcy5tb3ZlTmV4dCgpKTsKICAgIHNOZXh0KCkgPT4gKHNOb3RFbXB0eSA9IHNwcy5tb3ZlTmV4dCgpKTsKCiAgICBib29sIGluY29tcGF0aWJsZVBhcmFtZXRlcnMoKSB7CiAgICAgIHdoaWxlICh0Tm90RW1wdHkgJiYgc05vdEVtcHR5KSB7CiAgICAgICAgaWYgKGludmFsaWRGdW5jdGlvblBhcmFtZXRlclR5cGVzKHRwcy5jdXJyZW50LCBzcHMuY3VycmVudCkpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICB0TmV4dCgpOwogICAgICAgIHNOZXh0KCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmIChpbmNvbXBhdGlibGVQYXJhbWV0ZXJzKCkpIHJldHVybiBmYWxzZTsKICAgIGlmICh0Tm90RW1wdHkpIHsKICAgICAgLy8gV2UgbXVzdCBoYXZlIFs6IGxlbih0LnApIDw9IGxlbihzLnApIDpdLgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoIXNmLm5hbWVkUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgIC8vIFdlIG11c3QgaGF2ZSBbOiBsZW4odC5wKSA9PSBsZW4ocy5wKSA6XS4KICAgICAgaWYgKHNOb3RFbXB0eSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICAvLyBTaW5jZSBuYW1lZCBwYXJhbWV0ZXJzIGFyZSBnbG9iYWxseSBvcmRlcmVkIHdlIGNhbiBkZXRlcm1pbmUgdGhlCiAgICAgIC8vIHN1YnNldCByZWxhdGlvbiB3aXRoIGEgbGluZWFyIHNlYXJjaCBmb3IgWzpzZi5uYW1lZFBhcmFtZXRlcnM6XQogICAgICAvLyB3aXRoaW4gWzp0Zi5uYW1lZFBhcmFtZXRlcnM6XS4KICAgICAgTGlzdDxTdHJpbmc+IHROYW1lcyA9IHRmLm5hbWVkUGFyYW1ldGVyczsKICAgICAgTGlzdDxUPiB0VHlwZXMgPSB0Zi5uYW1lZFBhcmFtZXRlclR5cGVzOwogICAgICBMaXN0PFN0cmluZz4gc05hbWVzID0gc2YubmFtZWRQYXJhbWV0ZXJzOwogICAgICBMaXN0PFQ+IHNUeXBlcyA9IHNmLm5hbWVkUGFyYW1ldGVyVHlwZXM7CiAgICAgIGludCB0SW5kZXggPSAwOwogICAgICBpbnQgc0luZGV4ID0gMDsKICAgICAgd2hpbGUgKHRJbmRleCA8IHROYW1lcy5sZW5ndGggJiYgc0luZGV4IDwgc05hbWVzLmxlbmd0aCkgewogICAgICAgIGlmICh0TmFtZXNbdEluZGV4XSA9PSBzTmFtZXNbc0luZGV4XSkgewogICAgICAgICAgaWYgKGludmFsaWRGdW5jdGlvblBhcmFtZXRlclR5cGVzKHRUeXBlc1t0SW5kZXhdLCBzVHlwZXNbc0luZGV4XSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgc0luZGV4Kys7CiAgICAgICAgfQogICAgICAgIHRJbmRleCsrOwogICAgICB9CiAgICAgIGlmIChzSW5kZXggPCBzTmFtZXMubGVuZ3RoKSB7CiAgICAgICAgLy8gV2UgZGlkbid0IGZpbmQgYWxsIG5hbWVzLgogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gQ2hlY2sgdGhlIHJlbWFpbmluZyBbOiBzLnAgOl0gYWdhaW5zdCBbOiB0Lm8gOl0uCiAgICAgIHRwcyA9IHRmLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMuaXRlcmF0b3I7CiAgICAgIHROZXh0KCk7CiAgICAgIGlmIChpbmNvbXBhdGlibGVQYXJhbWV0ZXJzKCkpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKHNOb3RFbXB0eSkgewogICAgICAgIC8vIFdlIG11c3QgaGF2ZSBbOiBsZW4odC5wKSArIGxlbih0Lm8pID49IGxlbihzLnApIDpdLgogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoIXNmLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMuaXNFbXB0eSkgewogICAgICAgIC8vIENoZWNrIHRoZSByZW1haW5pbmcgWzogcy5vIDpdIGFnYWluc3QgdGhlIHJlbWFpbmluZyBbOiB0Lm8gOl0uCiAgICAgICAgc3BzID0gc2Yub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcy5pdGVyYXRvcjsKICAgICAgICBzTmV4dCgpOwogICAgICAgIGlmIChpbmNvbXBhdGlibGVQYXJhbWV0ZXJzKCkpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoc05vdEVtcHR5KSB7CiAgICAgICAgICAvLyBXZSBkaWRuJ3QgZmluZCBlbm91Z2ggcGFyYW1ldGVyczoKICAgICAgICAgIC8vIFdlIG11c3QgaGF2ZSBbOiBsZW4odC5wKSArIGxlbih0Lm8pIDw9IGxlbihzLnApICsgbGVuKHMubykgOl0uCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzTm90RW1wdHkpIHsKICAgICAgICAgIC8vIFdlIG11c3QgaGF2ZSBbOiBsZW4odC5wKSArIGxlbih0Lm8pID49IGxlbihzLnApIDpdLgogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHlwZVZhcmlhYmxlVHlwZShUeXBlVmFyaWFibGVUeXBlIHQsIFQgcykgewogICAgLy8gSWRlbnRpdHkgY2hlY2sgaXMgaGFuZGxlZCBpbiBbaXNTdWJ0eXBlXS4KICAgIERhcnRUeXBlIGJvdW5kID0gZ2V0VHlwZVZhcmlhYmxlQm91bmQodC5lbGVtZW50KTsKICAgIGlmIChib3VuZC5pc1R5cGVWYXJpYWJsZSkgewogICAgICAvLyBUaGUgYm91bmQgaXMgcG90ZW50aWFsbHkgY3ljbGljIHNvIHdlIG5lZWQgdG8gYmUgZXh0cmEgY2FyZWZ1bC4KICAgICAgU2V0PFR5cGVWYXJpYWJsZUVudGl0eT4gc2VlblR5cGVWYXJpYWJsZXMgPSBuZXcgU2V0PFR5cGVWYXJpYWJsZUVudGl0eT4oKTsKICAgICAgc2VlblR5cGVWYXJpYWJsZXMuYWRkKHQuZWxlbWVudCk7CiAgICAgIHdoaWxlIChib3VuZC5pc1R5cGVWYXJpYWJsZSkgewogICAgICAgIFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlID0gYm91bmQ7CiAgICAgICAgaWYgKGJvdW5kID09IHMpIHsKICAgICAgICAgIC8vIFt0XSBleHRlbmRzIFtzXS4KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoc2VlblR5cGVWYXJpYWJsZXMuY29udGFpbnModHlwZVZhcmlhYmxlLmVsZW1lbnQpKSB7CiAgICAgICAgICAvLyBXZSBoYXZlIGEgY3ljbGUgYW5kIGhhdmUgYWxyZWFkeSBjaGVja2VkIGFsbCBib3VuZHMgaW4gdGhlIGN5Y2xlCiAgICAgICAgICAvLyBhZ2FpbnN0IFtzXSBhbmQgY2FuIHRoZXJlZm9yZSBjb25jbHVkZSB0aGF0IFt0XSBpcyBub3QgYSBzdWJ0eXBlCiAgICAgICAgICAvLyBvZiBbc10uCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHNlZW5UeXBlVmFyaWFibGVzLmFkZCh0eXBlVmFyaWFibGUuZWxlbWVudCk7CiAgICAgICAgYm91bmQgPSBnZXRUeXBlVmFyaWFibGVCb3VuZCh0eXBlVmFyaWFibGUuZWxlbWVudCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChpbnZhbGlkVHlwZVZhcmlhYmxlQm91bmRzKGJvdW5kLCBzKSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlVmFyaWFibGUoRnVuY3Rpb25UeXBlVmFyaWFibGUgdCwgRGFydFR5cGUgcykgewogICAgaWYgKCFzLmlzRnVuY3Rpb25UeXBlVmFyaWFibGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBhc3N1bXB0aW9ucy5pc0Fzc3VtZWQodCwgcyk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBNb3JlU3BlY2lmaWNWaXNpdG9yPFQgZXh0ZW5kcyBEYXJ0VHlwZT4KICAgIGV4dGVuZHMgQWJzdHJhY3RUeXBlUmVsYXRpb248VD4gewogIGJvb2wgaXNNb3JlU3BlY2lmaWMoVCB0LCBUIHMpIHsKICAgIGlmIChpZGVudGljYWwodCwgcykgfHwKICAgICAgICBzLnRyZWF0QXNEeW5hbWljIHx8CiAgICAgICAgcy5pc1ZvaWQgfHwKICAgICAgICBzID09IGNvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGUgfHwKICAgICAgICB0ID09IGNvbW1vbkVsZW1lbnRzLm51bGxUeXBlKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKHQudHJlYXRBc0R5bmFtaWMpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHQgPSBnZXRVbmFsaWFzZWQodCk7CiAgICBzID0gZ2V0VW5hbGlhc2VkKHMpOwoKICAgIHJldHVybiB0LmFjY2VwdCh0aGlzLCBzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaW52YWxpZFR5cGVBcmd1bWVudHMoVCB0LCBUIHMpIHsKICAgIHJldHVybiAhaXNNb3JlU3BlY2lmaWModCwgcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGludmFsaWRGdW5jdGlvblJldHVyblR5cGVzKFQgdCwgVCBzKSB7CiAgICBpZiAocy50cmVhdEFzRHluYW1pYyAmJiB0LmlzVm9pZCkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gIXMuaXNWb2lkICYmICFpc01vcmVTcGVjaWZpYyh0LCBzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaW52YWxpZEZ1bmN0aW9uUGFyYW1ldGVyVHlwZXMoVCB0LCBUIHMpIHsKICAgIHJldHVybiAhaXNNb3JlU3BlY2lmaWModCwgcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGludmFsaWRUeXBlVmFyaWFibGVCb3VuZHMoVCBib3VuZCwgVCBzKSB7CiAgICByZXR1cm4gIWlzTW9yZVNwZWNpZmljKGJvdW5kLCBzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaW52YWxpZENhbGxhYmxlVHlwZShjb3ZhcmlhbnQgRGFydFR5cGUgY2FsbFR5cGUsIGNvdmFyaWFudCBEYXJ0VHlwZSBzKSB7CiAgICByZXR1cm4gIWlzTW9yZVNwZWNpZmljKGNhbGxUeXBlLCBzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGdXR1cmVPclR5cGUoRnV0dXJlT3JUeXBlIHQsIGNvdmFyaWFudCBEYXJ0VHlwZSBzKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgovLy8gVHlwZSB2aXNpdG9yIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc3VidHlwZSByZWxhdGlvbiB0d28gdHlwZXMuCmFic3RyYWN0IGNsYXNzIFN1YnR5cGVWaXNpdG9yPFQgZXh0ZW5kcyBEYXJ0VHlwZT4KICAgIGV4dGVuZHMgTW9yZVNwZWNpZmljVmlzaXRvcjxUPiB7CiAgYm9vbCBpc1N1YnR5cGUoRGFydFR5cGUgdCwgRGFydFR5cGUgcykgewogICAgaWYgKHMuaXNGdXR1cmVPcikgewogICAgICBGdXR1cmVPclR5cGUgc0Z1dHVyZU9yID0gczsKICAgICAgaWYgKGlzU3VidHlwZSh0LCBzRnV0dXJlT3IudHlwZUFyZ3VtZW50KSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgaWYgKHQuaXNJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgSW50ZXJmYWNlVHlwZSB0SW50ZXJmYWNlID0gdDsKICAgICAgICBpZiAodEludGVyZmFjZS5lbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmZ1dHVyZUNsYXNzICYmCiAgICAgICAgICAgIGlzU3VidHlwZSgKICAgICAgICAgICAgICAgIHRJbnRlcmZhY2UudHlwZUFyZ3VtZW50cy5zaW5nbGUsIHNGdXR1cmVPci50eXBlQXJndW1lbnQpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpc01vcmVTcGVjaWZpYyh0LCBzKTsKICB9CgogIGJvb2wgaXNBc3NpZ25hYmxlKFQgdCwgVCBzKSB7CiAgICByZXR1cm4gaXNTdWJ0eXBlKHQsIHMpIHx8IGlzU3VidHlwZShzLCB0KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaW52YWxpZFR5cGVBcmd1bWVudHMoVCB0LCBUIHMpIHsKICAgIHJldHVybiAhaXNTdWJ0eXBlKHQsIHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpbnZhbGlkRnVuY3Rpb25SZXR1cm5UeXBlcyhUIHQsIFQgcykgewogICAgcmV0dXJuICFpc1N1YnR5cGUodCwgcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGludmFsaWRGdW5jdGlvblBhcmFtZXRlclR5cGVzKFQgdCwgVCBzKSB7CiAgICByZXR1cm4gIWlzU3VidHlwZShzLCB0KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaW52YWxpZFR5cGVWYXJpYWJsZUJvdW5kcyhUIGJvdW5kLCBUIHMpIHsKICAgIHJldHVybiAhaXNTdWJ0eXBlKGJvdW5kLCBzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaW52YWxpZENhbGxhYmxlVHlwZShjb3ZhcmlhbnQgRGFydFR5cGUgY2FsbFR5cGUsIGNvdmFyaWFudCBEYXJ0VHlwZSBzKSB7CiAgICByZXR1cm4gIWlzU3VidHlwZShjYWxsVHlwZSwgcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnV0dXJlT3JUeXBlKEZ1dHVyZU9yVHlwZSB0LCBjb3ZhcmlhbnQgRGFydFR5cGUgcykgewogICAgaWYgKHMuaXNGdXR1cmVPcikgewogICAgICBGdXR1cmVPclR5cGUgc0Z1dHVyZU9yID0gczsKICAgICAgcmV0dXJuIGlzU3VidHlwZSh0LnR5cGVBcmd1bWVudCwgc0Z1dHVyZU9yLnR5cGVBcmd1bWVudCk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgovLy8gVHlwZSB2aXNpdG9yIHRoYXQgZGV0ZXJtaW5lcyBvbmUgdHlwZSBjb3VsZCBhIHN1YnR5cGUgb2YgYW5vdGhlciBnaXZlbiB0aGUKLy8vIHJpZ2h0IHR5cGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLiBUaGUgY29tcHV0YXRpb24gaXMgYXBwcm94aW1hdGUgYW5kIHJldHVybnMKLy8vIGBmYWxzZWAgb25seSBpZiB3ZSBhcmUgc3VyZSBubyBzdWNoIHN1YnN0aXR1dGlvbiBleGlzdHMuCmFic3RyYWN0IGNsYXNzIFBvdGVudGlhbFN1YnR5cGVWaXNpdG9yPFQgZXh0ZW5kcyBEYXJ0VHlwZT4KICAgIGV4dGVuZHMgU3VidHlwZVZpc2l0b3I8VD4gewogIGJvb2wgX2Fzc3VtZUluc3RhbnRpYXRpb25zID0gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1N1YnR5cGUoRGFydFR5cGUgdCwgRGFydFR5cGUgcykgewogICAgaWYgKHQgaXMgVHlwZVZhcmlhYmxlVHlwZSB8fCBzIGlzIFR5cGVWYXJpYWJsZVR5cGUpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoKHQgaXMgRnVuY3Rpb25UeXBlVmFyaWFibGUgfHwgcyBpcyBGdW5jdGlvblR5cGVWYXJpYWJsZSkgJiYKICAgICAgICBfYXNzdW1lSW5zdGFudGlhdGlvbnMpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuaXNTdWJ0eXBlKHQsIHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldENvbW1vblR5cGVWYXJpYWJsZXNDb3VudChGdW5jdGlvblR5cGUgdCwgRnVuY3Rpb25UeXBlIHMpIHsKICAgIGlmICh0LnR5cGVWYXJpYWJsZXMubGVuZ3RoID09IHMudHlwZVZhcmlhYmxlcy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIHQudHlwZVZhcmlhYmxlcy5sZW5ndGg7CiAgICB9CiAgICBpZiAoX2Fzc3VtZUluc3RhbnRpYXRpb25zICYmIHMudHlwZVZhcmlhYmxlcy5sZW5ndGggPT0gMCkgewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgYm9vbCBpc1BvdGVudGlhbFN1YnR5cGUoRGFydFR5cGUgdCwgRGFydFR5cGUgcywKICAgICAge2Jvb2wgYXNzdW1lSW5zdGFudGlhdGlvbnM6IHRydWV9KSB7CiAgICBfYXNzdW1lSW5zdGFudGlhdGlvbnMgPSBhc3N1bWVJbnN0YW50aWF0aW9uczsKICAgIHJldHVybiBpc1N1YnR5cGUodCwgcyk7CiAgfQp9CgovLy8gQmFzaWMgaW50ZXJmYWNlIGZvciB0aGUgRGFydCB0eXBlIHN5c3RlbS4KYWJzdHJhY3QgY2xhc3MgRGFydFR5cGVzIHsKICAvLy8gVGhlIHR5cGVzIGRlZmluZWQgaW4gJ2RhcnQ6Y29yZScuCiAgQ29tbW9uRWxlbWVudHMgZ2V0IGNvbW1vbkVsZW1lbnRzOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW3RdIGlzIGEgc3VidHlwZSBvZiBbc10uCiAgYm9vbCBpc1N1YnR5cGUoRGFydFR5cGUgdCwgRGFydFR5cGUgcyk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbdF0gaXMgYXNzaWduYWJsZSB0byBbc10uCiAgYm9vbCBpc0Fzc2lnbmFibGUoRGFydFR5cGUgdCwgRGFydFR5cGUgcyk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbdF0gbWlnaHQgYmUgYSBzdWJ0eXBlIG9mIFtzXSBmb3Igc29tZSB2YWx1ZXMgb2YKICAvLy8gdHlwZSB2YXJpYWJsZXMgaW4gW3NdIGFuZCBbdF0uCiAgLy8vCiAgLy8vIElmIFthc3N1bWVJbnN0YW50aWF0aW9uc10sIGdlbmVyaWMgZnVuY3Rpb24gdHlwZXMgYXJlIGFzc3VtZWQgdG8gYmUKICAvLy8gcG90ZW50aWFsbHkgaW5zdGFudGlhdGVkLgogIGJvb2wgaXNQb3RlbnRpYWxTdWJ0eXBlKERhcnRUeXBlIHQsIERhcnRUeXBlIHMsCiAgICAgIHtib29sIGFzc3VtZUluc3RhbnRpYXRpb25zOiB0cnVlfSk7CgogIHN0YXRpYyBjb25zdCBpbnQgSVNfU1VCVFlQRSA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBNQVlCRV9TVUJUWVBFID0gMDsKICBzdGF0aWMgY29uc3QgaW50IE5PVF9TVUJUWVBFID0gLTE7CgogIC8vLyBSZXR1cm5zIFtJU19TVUJUWVBFXSwgW01BWUJFX1NVQlRZUEVdLCBvciBbTk9UX1NVQlRZUEVdIGlmIFt0XSBpcyBhCiAgLy8vIChwb3RlbnRpYWwpIHN1YnR5cGUgb2YgW3NdCiAgaW50IGNvbXB1dGVTdWJ0eXBlUmVsYXRpb24oRGFydFR5cGUgdCwgRGFydFR5cGUgcykgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ29tcHV0ZSB0aGlzIGRpcmVjdGx5IGluIFtpc1BvdGVudGlhbFN1YnR5cGVdLgogICAgaWYgKGlzU3VidHlwZSh0LCBzKSkgcmV0dXJuIElTX1NVQlRZUEU7CiAgICByZXR1cm4gaXNQb3RlbnRpYWxTdWJ0eXBlKHQsIHMpID8gTUFZQkVfU1VCVFlQRSA6IE5PVF9TVUJUWVBFOwogIH0KCiAgLy8vIFJldHVybnMgW3R5cGVdIGFzIGFuIGluc3RhbmNlIG9mIFtjbHNdIG9yIGBudWxsYCBpZiBbdHlwZV0gaXMgbm90IGEKICAvLy8gc3VidHlwZSBvZiBbY2xzXS4KICAvLy8KICAvLy8gRm9yIGV4YW1wbGU6IGBhc0luc3RhbmNlT2YoTGlzdDxTdHJpbmc+LCBJdGVyYWJsZSkgPSBJdGVyYWJsZTxTdHJpbmc+YC4KICBJbnRlcmZhY2VUeXBlIGFzSW5zdGFuY2VPZihJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm4gW2Jhc2VdIHdoZXJlIHRoZSB0eXBlIHZhcmlhYmxlIG9mIGBjb250ZXh0LmVsZW1lbnRgIGFyZSByZXBsYWNlZAogIC8vLyBieSB0aGUgdHlwZSBhcmd1bWVudHMgb2YgW2NvbnRleHRdLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UKICAvLy8KICAvLy8gICAgIHN1YnN0QnlDb250ZXh0KEl0ZXJhYmxlPExpc3QuRT4sIExpc3Q8U3RyaW5nPikgPSBJdGVyYWJsZTxTdHJpbmc+CiAgLy8vCiAgRGFydFR5cGUgc3Vic3RCeUNvbnRleHQoRGFydFR5cGUgYmFzZSwgSW50ZXJmYWNlVHlwZSBjb250ZXh0KTsKCiAgLy8vIFJldHVybnMgdGhlICd0aGlzIHR5cGUnIG9mIFtjbHNdLiBUaGF0IGlzLCB0aGUgaW5zdGFudGlhdGlvbiBvZiBbY2xzXQogIC8vLyB3aGVyZSB0aGUgdHlwZSBhcmd1bWVudHMgYXJlIHRoZSB0eXBlIHZhcmlhYmxlcyBvZiBbY2xzXS4KICBJbnRlcmZhY2VUeXBlIGdldFRoaXNUeXBlKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSBzdXBlcnR5cGUgb2YgW2Nsc10sIGkuZS4gdGhlIHR5cGUgaW4gdGhlIGBleHRlbmRzYCBjbGF1c2Ugb2YKICAvLy8gW2Nsc10uCiAgSW50ZXJmYWNlVHlwZSBnZXRTdXBlcnR5cGUoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYWxsIHN1cGVydHlwZXMgb2YgW2Nsc10uCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVGhpcyBzaG91bGQgaW5jbHVkZSBgRnVuY3Rpb25gIGlmIFtjbHNdIGRlY2xhcmVzCiAgLy8gYSBgY2FsbGAgbWV0aG9kLgogIEl0ZXJhYmxlPEludGVyZmFjZVR5cGU+IGdldFN1cGVydHlwZXMoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYWxsIHR5cGVzIGRpcmVjdGx5IGltcGxlbWVudGVkIGJ5IFtjbHNdLgogIEl0ZXJhYmxlPEludGVyZmFjZVR5cGU+IGdldEludGVyZmFjZXMoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGBjYWxsYCBtZXRob2Qgb24gW3R5cGVdLCBvciBgbnVsbGAgaWYgdGhlIGNsYXNzCiAgLy8vIG9mIFt0eXBlXSBkb2VzIG5vdCBoYXZlIGEgYGNhbGxgIG1ldGhvZC4KICBGdW5jdGlvblR5cGUgZ2V0Q2FsbFR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlKTsKCiAgLy8vIENoZWNrcyB0aGUgdHlwZSBhcmd1bWVudHMgb2YgW3R5cGVdIGFnYWluc3QgdGhlIHR5cGUgdmFyaWFibGUgYm91bmRzCiAgLy8vIGRlY2xhcmVkIG9uIGB0eXBlLmVsZW1lbnRgLiBDYWxscyBbY2hlY2tUeXBlVmFyaWFibGVCb3VuZF0gb24gZWFjaCB0eXBlCiAgLy8vIGFyZ3VtZW50IGFuZCBib3VuZC4KICB2b2lkIGNoZWNrVHlwZVZhcmlhYmxlQm91bmRzPFQ+KAogICAgICBUIGNvbnRleHQsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVWYXJpYWJsZXMsCiAgICAgIHZvaWQgY2hlY2tUeXBlVmFyaWFibGVCb3VuZChUIGNvbnRleHQsIERhcnRUeXBlIHR5cGVBcmd1bWVudCwKICAgICAgICAgIFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlLCBEYXJ0VHlwZSBib3VuZCkpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NsYXNzRW50aXR5XSB3aGljaCBkZWNsYXJlcyB0aGUgdHlwZSB2YXJpYWJsZXMgb2NjdXJyaW5nIGluCiAgLy8gW3R5cGVdLCBvciBgbnVsbGAgaWYgW3R5cGVdIGRvZXMgbm90IGNvbnRhaW4gY2xhc3MgdHlwZSB2YXJpYWJsZXMuCiAgc3RhdGljIENsYXNzRW50aXR5IGdldENsYXNzQ29udGV4dChEYXJ0VHlwZSB0eXBlKSB7CiAgICBDbGFzc0VudGl0eSBjb250ZXh0Q2xhc3M7CiAgICB0eXBlLmZvckVhY2hUeXBlVmFyaWFibGUoKFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlKSB7CiAgICAgIGlmICh0eXBlVmFyaWFibGUuZWxlbWVudC50eXBlRGVjbGFyYXRpb24gaXMhIENsYXNzRW50aXR5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YXJ0JzsKCmV4cG9ydCAncGFja2FnZTpqc19hc3QvanNfYXN0LmRhcnQnOwpleHBvcnQgJ2pzX2RlYnVnLmRhcnQnOwoKU3RyaW5nIHByZXR0eVByaW50KE5vZGUgbm9kZSwKICAgIHtib29sIGVuYWJsZU1pbmlmaWNhdGlvbjogZmFsc2UsCiAgICBib29sIGFsbG93VmFyaWFibGVNaW5pZmljYXRpb246IHRydWUsCiAgICBSZW5hbWVyIHJlbmFtZXJGb3JOYW1lczogSmF2YVNjcmlwdFByaW50aW5nT3B0aW9ucy5pZGVudGl0eVJlbmFtZXJ9KSB7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRG8gd2UgbmVlZCBhbGwgdGhlIG9wdGlvbnMgaGVyZT8KICBKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zIG9wdGlvbnMgPSBuZXcgSmF2YVNjcmlwdFByaW50aW5nT3B0aW9ucygKICAgICAgc2hvdWxkQ29tcHJlc3NPdXRwdXQ6IGVuYWJsZU1pbmlmaWNhdGlvbiwKICAgICAgbWluaWZ5TG9jYWxWYXJpYWJsZXM6IGFsbG93VmFyaWFibGVNaW5pZmljYXRpb24sCiAgICAgIHJlbmFtZXJGb3JOYW1lczogcmVuYW1lckZvck5hbWVzKTsKICBTaW1wbGVKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0IGNvbnRleHQgPQogICAgICBuZXcgU2ltcGxlSmF2YVNjcmlwdFByaW50aW5nQ29udGV4dCgpOwogIFByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKG9wdGlvbnMsIGNvbnRleHQpOwogIHByaW50ZXIudmlzaXQobm9kZSk7CiAgcmV0dXJuIGNvbnRleHQuZ2V0VGV4dCgpOwp9CgpDb2RlQnVmZmVyIGNyZWF0ZUNvZGVCdWZmZXIoTm9kZSBub2RlLCBDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zLAogICAgSmF2YVNjcmlwdFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kgc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSwKICAgIHtEdW1wSW5mb1Rhc2sgbW9uaXRvciwKICAgIGJvb2wgYWxsb3dWYXJpYWJsZU1pbmlmaWNhdGlvbjogdHJ1ZSwKICAgIFJlbmFtZXIgcmVuYW1lckZvck5hbWVzOiBKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zLmlkZW50aXR5UmVuYW1lcn0pIHsKICBKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zIG9wdGlvbnMgPSBuZXcgSmF2YVNjcmlwdFByaW50aW5nT3B0aW9ucygKICAgICAgc2hvdWxkQ29tcHJlc3NPdXRwdXQ6IGNvbXBpbGVyT3B0aW9ucy5lbmFibGVNaW5pZmljYXRpb24sCiAgICAgIG1pbmlmeUxvY2FsVmFyaWFibGVzOiBhbGxvd1ZhcmlhYmxlTWluaWZpY2F0aW9uLAogICAgICByZW5hbWVyRm9yTmFtZXM6IHJlbmFtZXJGb3JOYW1lcyk7CiAgQ29kZUJ1ZmZlciBvdXRCdWZmZXIgPSBuZXcgQ29kZUJ1ZmZlcigpOwogIFNvdXJjZUluZm9ybWF0aW9uUHJvY2Vzc29yIHNvdXJjZUluZm9ybWF0aW9uUHJvY2Vzc29yID0KICAgICAgc291cmNlSW5mb3JtYXRpb25TdHJhdGVneS5jcmVhdGVQcm9jZXNzb3IoCiAgICAgICAgICBuZXcgU291cmNlTWFwcGVyUHJvdmlkZXJJbXBsKG91dEJ1ZmZlciksCiAgICAgICAgICBjb25zdCBTb3VyY2VJbmZvcm1hdGlvblJlYWRlcigpKTsKICBEYXJ0MkpTSmF2YVNjcmlwdFByaW50aW5nQ29udGV4dCBjb250ZXh0ID0KICAgICAgbmV3IERhcnQySlNKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0KAogICAgICAgICAgbW9uaXRvciwgb3V0QnVmZmVyLCBzb3VyY2VJbmZvcm1hdGlvblByb2Nlc3Nvcik7CiAgUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIob3B0aW9ucywgY29udGV4dCk7CiAgcHJpbnRlci52aXNpdChub2RlKTsKICBzb3VyY2VJbmZvcm1hdGlvblByb2Nlc3Nvci5wcm9jZXNzKG5vZGUsIG91dEJ1ZmZlcik7CiAgcmV0dXJuIG91dEJ1ZmZlcjsKfQoKY2xhc3MgRGFydDJKU0phdmFTY3JpcHRQcmludGluZ0NvbnRleHQgaW1wbGVtZW50cyBKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0IHsKICBmaW5hbCBEdW1wSW5mb1Rhc2sgbW9uaXRvcjsKICBmaW5hbCBDb2RlQnVmZmVyIG91dEJ1ZmZlcjsKICBmaW5hbCBDb2RlUG9zaXRpb25MaXN0ZW5lciBjb2RlUG9zaXRpb25MaXN0ZW5lcjsKCiAgRGFydDJKU0phdmFTY3JpcHRQcmludGluZ0NvbnRleHQoCiAgICAgIHRoaXMubW9uaXRvciwgdGhpcy5vdXRCdWZmZXIsIHRoaXMuY29kZVBvc2l0aW9uTGlzdGVuZXIpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlKSB7CiAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsIG1lc3NhZ2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbWl0KFN0cmluZyBzdHJpbmcpIHsKICAgIG1vbml0b3I/LmVtaXQoc3RyaW5nKTsKICAgIG91dEJ1ZmZlci5hZGQoc3RyaW5nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW50ZXJOb2RlKE5vZGUgbm9kZSwgaW50IHN0YXJ0UG9zaXRpb24pIHsKICAgIG1vbml0b3I/LmVudGVyTm9kZShub2RlLCBzdGFydFBvc2l0aW9uKTsKICAgIGNvZGVQb3NpdGlvbkxpc3RlbmVyLm9uU3RhcnRQb3NpdGlvbihub2RlLCBzdGFydFBvc2l0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZXhpdE5vZGUoCiAgICAgIE5vZGUgbm9kZSwgaW50IHN0YXJ0UG9zaXRpb24sIGludCBlbmRQb3NpdGlvbiwgaW50IGNsb3NpbmdQb3NpdGlvbikgewogICAgbW9uaXRvcj8uZXhpdE5vZGUobm9kZSwgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24sIGNsb3NpbmdQb3NpdGlvbik7CiAgICBjb2RlUG9zaXRpb25MaXN0ZW5lci5vblBvc2l0aW9ucygKICAgICAgICBub2RlLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwgY2xvc2luZ1Bvc2l0aW9uKTsKICB9Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIGFzdCBub2RlcyB0aGF0IGVuY2Fwc3VsYXRlIGFuIGFzdCB0aGF0IG5lZWRzIHRvIGJlCi8vLyB0cmF2ZXJzZWQgd2hlbiBjb3VudGluZyB0b2tlbnMuCmFic3RyYWN0IGNsYXNzIEFzdENvbnRhaW5lciBpbXBsZW1lbnRzIE5vZGUgewogIEl0ZXJhYmxlPE5vZGU+IGdldCBjb250YWluZWROb2RlczsKfQoKLy8vIEludGVyZmFjZSBmb3IgdGFza3MgaW4gdGhlIGNvbXBpbGVyIHRoYXQgbmVlZCB0byBmaW5hbGl6ZSB0b2tlbnMgYWZ0ZXIKLy8vIGNvdW50aW5nIHRoZW0uCmFic3RyYWN0IGNsYXNzIFRva2VuRmluYWxpemVyIHsKICB2b2lkIGZpbmFsaXplVG9rZW5zKCk7Cn0KCi8vLyBJbXBsZW1lbnRzIHJlZmVyZW5jZSBjb3VudGluZyBmb3IgaW5zdGFuY2VzIG9mIFtSZWZlcmVuY2VDb3VudGVkQXN0Tm9kZV0KY2xhc3MgVG9rZW5Db3VudGVyIGV4dGVuZHMgQmFzZVZpc2l0b3IgewogIEBvdmVycmlkZQogIHZpc2l0Tm9kZShOb2RlIG5vZGUpIHsKICAgIGlmIChub2RlIGlzIEFzdENvbnRhaW5lcikgewogICAgICBmb3IgKE5vZGUgZWxlbWVudCBpbiBub2RlLmNvbnRhaW5lZE5vZGVzKSB7CiAgICAgICAgZWxlbWVudC5hY2NlcHQodGhpcyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobm9kZSBpcyBSZWZlcmVuY2VDb3VudGVkQXN0Tm9kZSkgewogICAgICBub2RlLm1hcmtTZWVuKHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgc3VwZXIudmlzaXROb2RlKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCBjb3VudFRva2VucyhOb2RlIG5vZGUpID0+IG5vZGUuYWNjZXB0KHRoaXMpOwp9CgphYnN0cmFjdCBjbGFzcyBSZWZlcmVuY2VDb3VudGVkQXN0Tm9kZSBpbXBsZW1lbnRzIE5vZGUgewogIHZvaWQgbWFya1NlZW4oVG9rZW5Db3VudGVyIHZpc2l0b3IpOwp9CgovLy8gUmVwcmVzZW50cyB0aGUgTGl0ZXJhbFN0cmluZyByZXN1bHRpbmcgZnJvbSB1bnBhcnNpbmcgW2V4cHJlc3Npb25dLiBUaGUKLy8vIGFjdHVhbCB1bnBhcnNpbmcgaXMgZG9uZSBvbiBkZW1hbmQgd2hlbiByZXF1ZXN0aW5nIHRoZSBbdmFsdWVdIG9mIHRoaXMKLy8vIG5vZGUuCi8vLwovLy8gVGhpcyBpcyB1c2VkIHdoZW4gZ2VuZXJhdGVkIGNvZGUgbmVlZHMgdG8gYmUgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcsCi8vLyBmb3IgZXhhbXBsZSBieSB0aGUgbGF6eSBlbWl0dGVyIG9yIHdoZW4gZ2VuZXJhdGluZyBjb2RlIGdlbmVyYXRvcnMuCmNsYXNzIFVucGFyc2VkTm9kZSBleHRlbmRzIERlZmVycmVkU3RyaW5nIGltcGxlbWVudHMgQXN0Q29udGFpbmVyIHsKICBmaW5hbCBOb2RlIHRyZWU7CiAgZmluYWwgYm9vbCBfZW5hYmxlTWluaWZpY2F0aW9uOwogIGZpbmFsIGJvb2wgX3Byb3RlY3RGb3JFdmFsOwogIExpdGVyYWxTdHJpbmcgX2NhY2hlZExpdGVyYWw7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPE5vZGU+IGdldCBjb250YWluZWROb2RlcyA9PiBbdHJlZV07CgogIC8vLyBBIFtqcy5MaXRlcmFsXSB0aGF0IHJlcHJlc2VudHMgdGhlIHN0cmluZyByZXN1bHQgb2YgdW5wYXJzaW5nIFthc3RdLgogIC8vLwogIC8vLyBXaGVuIGl0cyBzdHJpbmcgW3ZhbHVlXSBpcyByZXF1ZXN0ZWQsIHRoZSBub2RlIHByZXR0eS1wcmludHMgdGhlIGdpdmVuCiAgLy8vIFthc3RdIGFuZCwgaWYgW3Byb3RlY3RGb3JFdmFsXSBpcyB0cnVlLCB3cmFwcyB0aGUgcmVzdWx0aW5nIHN0cmluZyBpbgogIC8vLyBwYXJlbnRoZXNpcy4gVGhlIHJlc3VsdCBpcyBhbHNvIGVzY2FwZWQuCiAgVW5wYXJzZWROb2RlKHRoaXMudHJlZSwgdGhpcy5fZW5hYmxlTWluaWZpY2F0aW9uLCB0aGlzLl9wcm90ZWN0Rm9yRXZhbCk7CgogIExpdGVyYWxTdHJpbmcgZ2V0IF9saXRlcmFsIHsKICAgIGlmIChfY2FjaGVkTGl0ZXJhbCA9PSBudWxsKSB7CiAgICAgIFN0cmluZyB0ZXh0ID0gcHJldHR5UHJpbnQodHJlZSwgZW5hYmxlTWluaWZpY2F0aW9uOiBfZW5hYmxlTWluaWZpY2F0aW9uKTsKICAgICAgaWYgKF9wcm90ZWN0Rm9yRXZhbCkgewogICAgICAgIGlmICh0cmVlIGlzIEZ1bikgdGV4dCA9ICcoJHRleHQpJzsKICAgICAgICBpZiAodHJlZSBpcyBMaXRlcmFsRXhwcmVzc2lvbikgewogICAgICAgICAgTGl0ZXJhbEV4cHJlc3Npb24gbGl0ZXJhbEV4cHJlc3Npb24gPSB0cmVlOwogICAgICAgICAgU3RyaW5nIHRlbXBsYXRlID0gbGl0ZXJhbEV4cHJlc3Npb24udGVtcGxhdGU7CiAgICAgICAgICBpZiAodGVtcGxhdGUuc3RhcnRzV2l0aCgiZnVuY3Rpb24gIikgfHwgdGVtcGxhdGUuc3RhcnRzV2l0aCgieyIpKSB7CiAgICAgICAgICAgIHRleHQgPSAnKCR0ZXh0KSc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIF9jYWNoZWRMaXRlcmFsID0ganMuZXNjYXBlZFN0cmluZyh0ZXh0KTsKICAgIH0KICAgIHJldHVybiBfY2FjaGVkTGl0ZXJhbDsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgdmFsdWUgPT4gX2xpdGVyYWwudmFsdWU7Cn0KCi8vLyBUcnVlIGlmIHRoZSBnaXZlbiB0ZW1wbGF0ZSBjb25zaXN0cyBvZiBqdXN0IGEgcGxhY2Vob2xkZXIuIFN1Y2ggdGVtcGxhdGVzCi8vLyBhcmUgc29tZXRpbWVzIHVzZWQgdG8gbWFudWFsbHkgcHJvbW90ZSB0aGUgdHlwZSBvZiBhbiBleHByZXNzaW9uLgpib29sIGlzSWRlbnRpdHlUZW1wbGF0ZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgewogIHJldHVybiB0ZW1wbGF0ZS5hc3QgaXMgSW50ZXJwb2xhdGVkRXhwcmVzc2lvbjsKfQoKLy8vIFJldHVybnMgYHRydWVgIGlmIFt0ZW1wbGF0ZV0gd2lsbCBpbW1lZGlhdGVseSBnaXZlIGEgVHlwZUVycm9yIGlmIHRoZSBmaXJzdAovLy8gcGxhY2Vob2xkZXIgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLgpib29sIGlzTnVsbEd1YXJkT25GaXJzdEFyZ3VtZW50KFRlbXBsYXRlIHRlbXBsYXRlKSB7CiAgLy8gV2UgbG9vayBmb3IgYSB0ZW1wbGF0ZSBvZiB0aGUgZm9ybQogIC8vCiAgLy8gICAgICMuc29tZXRoaW5nCiAgLy8gICAgICMuc29tZXRoaW5nKCkKICAvLwogIE5vZGUgbm9kZSA9IHRlbXBsYXRlLmFzdDsKICBpZiAobm9kZSBpcyBDYWxsKSB7CiAgICBDYWxsIGNhbGwgPSBub2RlOwogICAgbm9kZSA9IGNhbGwudGFyZ2V0OwogIH0KICBpZiAobm9kZSBpcyBQcm9wZXJ0eUFjY2VzcykgewogICAgUHJvcGVydHlBY2Nlc3MgYWNjZXNzID0gbm9kZTsKICAgIGlmIChhY2Nlc3MucmVjZWl2ZXIgaXMgSW50ZXJwb2xhdGVkRXhwcmVzc2lvbikgewogICAgICBJbnRlcnBvbGF0ZWRFeHByZXNzaW9uIGhvbGUgPSBhY2Nlc3MucmVjZWl2ZXI7CiAgICAgIHJldHVybiBob2xlLmlzUG9zaXRpb25hbCAmJiBob2xlLm5hbWVPclBvc2l0aW9uID09IDA7CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQqAxgBOTjwBDAElARkaLjEhASUYAR4lKks7RTA3KSwtMxccAgFIQxsqS0VANykrOjEzLC0sOzMXNxQCAU4eHjMBJEABDB8uBAEMHRsbBAEMMS0/BAEMEUxKJjwEAgFFJC4lAgFLEyAZAgFNKQwZIDIeCDIbDR0GBAE0AgE5JwIBTEsKBEpIRBMiHiABDC8BSwZNTC9LAR8iUB0rKTY4Th4MCggvBhsEAQwmAgFORi0xAgFQKjUoBRUXBRwWFhgEICI1NTwGBBACAR9wYWNrYWdlOmNvbXBpbGVyL3NyYy9qcy9qcy5kYXJ0M3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvbmFtZXIuZGFydMABhzwvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBqc19iYWNrZW5kLm5hbWVyOwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nIHNob3cgSGFzaE1hcDsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9kYXJ0MmpzLmRhcnQnCiAgICBzaG93ICQwLCAkOSwgJEEsICRaLCAkXywgJGEsICRnLCAkcywgJHo7CgppbXBvcnQgJ3BhY2thZ2U6anNfcnVudGltZS9zaGFyZWQvZW1iZWRkZWRfbmFtZXMuZGFydCcgc2hvdyBKc0dldE5hbWU7CgppbXBvcnQgJy4uL2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi9jb2RlZ2VuLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JyBzaG93IElkZW50aWZpZXJzLCBOYW1lcywgU2VsZWN0b3JzOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IEpFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0YW50X3N5c3RlbS5kYXJ0JyBhcyBjb25zdGFudF9zeXN0ZW07CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBDb21tb25FbGVtZW50cywgRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2RpYWdub3N0aWNzL2ludmFyaWFudC5kYXJ0JyBzaG93IERFQlVHX01PREU7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXR5X3V0aWxzLmRhcnQnIGFzIHV0aWxzOwppbXBvcnQgJy4uL2VsZW1lbnRzL2p1bXBzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ydW50aW1lX3R5cGVzLmRhcnQnIHNob3cgUnVudGltZVR5cGVUYWdzOwppbXBvcnQgJy4uL2pzX21vZGVsL2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvZWxlbWVudHMuZGFydCcgc2hvdyBKR2VuZXJhdG9yQm9keTsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JyBzaG93IENhbGxTdHJ1Y3R1cmU7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvciwgU2VsZWN0b3JLaW5kOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICduYXRpdmVfZGF0YS5kYXJ0JzsKCnBhcnQgJ2ZpZWxkX25hbWluZ19taXhpbi5kYXJ0JzsKcGFydCAnZnJlcXVlbmN5X25hbWVyLmRhcnQnOwpwYXJ0ICdtaW5pZnlfbmFtZXIuZGFydCc7CnBhcnQgJ25hbWVyX25hbWVzLmRhcnQnOwoKLy8vIEFzc2lnbnMgSmF2YVNjcmlwdCBpZGVudGlmaWVycyB0byBEYXJ0IHZhcmlhYmxlcywgY2xhc3MtbmFtZXMgYW5kIG1lbWJlcnMuCi8vLwovLy8gTmFtZXMgYXJlIGdlbmVyYXRlZCB0aHJvdWdoIHRocmVlIHN0YWdlczoKLy8vCi8vLyAxLiBPcmlnaW5hbCBuYW1lcyBhbmQgcHJvcG9zZWQgbmFtZXMKLy8vIDIuIERpc2FtYmlndWF0ZWQgbmFtZXMgKGFsc28ga25vd24gYXMgIm1hbmdsZWQgbmFtZXMiKQovLy8gMy4gQW5ub3RhdGVkIG5hbWVzCi8vLwovLy8gT3JpZ2luYWwgbmFtZXMgYXJlIG5hbWVzIHRha2VuIGRpcmVjdGx5IGZyb20gdGhlIGlucHV0LgovLy8KLy8vIFByb3Bvc2VkIG5hbWVzIGFyZSBlaXRoZXIgb3JpZ2luYWwgbmFtZXMgb3Igc3ludGhlc2l6ZWQgbmFtZXMgZm9yIGlucHV0Ci8vLyBlbGVtZW50cyB0aGF0IGRvIG5vdCBoYXZlIG9yaWdpbmFsIG5hbWVzLgovLy8KLy8vIERpc2FtYmlndWF0ZWQgbmFtZXMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgYWJvdmUsIGJ1dCBhcmUgbWFuZ2xlZCB0byBlbnN1cmUKLy8vIHVuaXF1ZW5lc3Mgd2l0aGluIHNvbWUgbmFtZXNwYWNlIChlLmcuIGFzIGZpZWxkcyBvbiB0aGUgc2FtZSBKUyBvYmplY3QpLgovLy8gSW4gW01pbmlmeU5hbWVyXSwgZGlzYW1iaWd1YXRlZCBuYW1lcyBhcmUgYWxzbyBtaW5pZmllZC4KLy8vCi8vLyBBbm5vdGF0ZWQgbmFtZXMgYXJlIG5hbWVzIGdlbmVyYXRlZCBmcm9tIGEgZGlzYW1iaWd1YXRlZCBuYW1lLiBBbm5vdGF0ZWQKLy8vIG5hbWVzIG11c3QgYmUgY29tcHV0YWJsZSBhdCBydW50aW1lIGJ5IHByZWZpeGluZy9zdWZmaXhpbmcgY29uc3RhbnQgc3RyaW5ncwovLy8gb250byB0aGUgZGlzYW1iaWd1YXRlZCBuYW1lLgovLy8KLy8vIEZvciBleGFtcGxlLCBzb21lIGVudGl0eSBjYWxsZWQgYHhgIG1pZ2h0IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGVzZSBuYW1lczoKLy8vCi8vLyAgICAgT3JpZ2luYWwgbmFtZTogYHhgCi8vLwovLy8gICAgIERpc2FtYmlndWF0ZWQgbmFtZTogYHgxYCAoaWYgc29tZXRoaW5nIGVsc2Ugd2FzIGNhbGxlZCBgeGApCi8vLwovLy8gICAgIEFubm90YXRlZCBuYW1lczogYHgxYCAgICAgKGZpZWxkIG5hbWUpCi8vLyAgICAgICAgICAgICAgICAgICAgICBgZ2V0JHgxYCAoZ2V0dGVyIG5hbWUpCi8vLyAgICAgICAgICAgICAgICAgICAgICBgc2V0JHgxYCAoc2V0dGVyIG5hbWUpCi8vLwovLy8gVGhlIFtOYW1lcl0gY2FuIGNob29zZSB0aGUgZGlzYW1iaWd1YXRlZCBuYW1lcywgYW5kIHRvIHNvbWUgZGVncmVlIHRoZQovLy8gcHJlZml4L3N1ZmZpeCBjb25zdGFudHMgdXNlZCB0byBjb25zdHJ1Y3QgYW5ub3RhdGVkIG5hbWVzLiBJdCBjYW5ub3QgY2hvb3NlCi8vLyBhbm5vdGF0ZWQgbmFtZXMgd2l0aCB0b3RhbCBmcmVlZG9tLCBmb3IgZXhhbXBsZSwgaXQgY2Fubm90IGNob29zZSB0aGF0IHRoZQovLy8gZ2V0dGVyIGZvciBgeDFgIHNob3VsZCBiZSBjYWxsZWQgYGdldFhgIC0tIHRoZSBhbm5vdGF0ZWQgbmFtZXMgYXJlIGFsd2F5cwovLy8gYnVpbHQgYnkgY29uY2F0ZW5hdGlvbi4KLy8vCi8vLyBEaXNhbWJpZ3VhdGVkIG5hbWVzIG11c3QgYmUgY2hvc2VuIHN1Y2ggdGhhdCBub25lIG9mIHRoZSBhbm5vdGF0ZWQgbmFtZXMgY2FuCi8vLyBjbGFzaCB3aXRoIGVhY2ggb3RoZXIuIFRoaXMgbWF5IGhhcHBlbiBldmVuIGlmIHRoZSBkaXNhbWJpZ3VhdGVkIG5hbWVzIGFyZQovLy8gZGlzdGluY3QsIGZvciBleGFtcGxlLCBzdXBwb3NlIGEgZmllbGQgYHhgIGFuZCBgZ2V0JHhgIGV4aXN0cyBpbiB0aGUgaW5wdXQ6Ci8vLwovLy8gICAgIE9yaWdpbmFsIG5hbWVzOiBgeGAgYW5kIGBnZXQkeGAKLy8vCi8vLyAgICAgRGlzYW1iaWd1YXRlZCBuYW1lczogYHhgIGFuZCBgZ2V0JHhgICh0aGUgdHdvIG5hbWVzIGEgZGlmZmVyZW50KQovLy8KLy8vICAgICBBbm5vdGF0ZWQgbmFtZXM6IGB4YCAoZmllbGQgZm9yIGB4YCkKLy8vICAgICAgICAgICAgICAgICAgICAgIGBnZXQkeGAgKGdldHRlciBmb3IgYHhgKQovLy8gICAgICAgICAgICAgICAgICAgICAgYGdldCR4YCAoZmllbGQgZm9yIGBnZXQkeGApCi8vLyAgICAgICAgICAgICAgICAgICAgICBgZ2V0JGdldCR4YCAoZ2V0dGVyIGZvciBgZ2V0JHhgKQovLy8KLy8vIFRoZSBnZXR0ZXIgZm9yIGB4YCBjbGFzaGVzIHdpdGggdGhlIGZpZWxkIG5hbWUgZm9yIGBnZXQkeGAsIHNvIHRoZQovLy8gZGlzYW1iaWd1YXRlZCBuYW1lcyBhcmUgaW52YWxpZC4KLy8vCi8vLyBBZGRpdGlvbmFsbHksIGRpc2FtYmlndWF0ZWQgbmFtZXMgbXVzdCBiZSBjaG9zZW4gc3VjaCB0aGF0IGFsbCBhbm5vdGF0ZWQKLy8vIG5hbWVzIGFyZSB2YWxpZCBKYXZhU2NyaXB0IGlkZW50aWZpZXJzIGFuZCBkbyBub3QgY29pbmNpZGUgd2l0aCBhIG5hdGl2ZQovLy8gSmF2YVNjcmlwdCBwcm9wZXJ0eSBzdWNoIGFzIGBfX3Byb3RvX19gLgovLy8KLy8vIFRoZSBmb2xsb3dpbmcgYW5ub3RhdGVkIG5hbWVzIGFyZSBnZW5lcmF0ZWQgZm9yIGluc3RhbmNlIG1lbWJlcnMsIHdoZXJlCi8vLyA8TkFNRT4gZGVub3RlcyB0aGUgZGlzYW1iaWd1YXRlZCBuYW1lLgovLy8KLy8vIDAuIFRoZSBkaXNhbWJpZ3VhdGVkIG5hbWUgY2FuIGl0c2VsZiBiZSBzZWVuIGFzIGFuIGFubm90YXRlZCBuYW1lLgovLy8KLy8vIDEuIE11bHRpcGxlIGFubm90YXRlZCBuYW1lcyBleGlzdCBmb3IgdGhlIGBjYWxsYCBtZXRob2QsIGVuY29kaW5nIGFyaXR5IGFuZAovLy8gICAgbmFtZWQgcGFyYW1ldGVycyB3aXRoIHRoZSBwYXR0ZXJuOgovLy8KLy8vICAgICAgIGNhbGwkPE4+JG5hbWVkUGFyYW0xLi4uJG5hbWVkUGFyYW08TT4KLy8vCi8vLyAgICB3aGVyZSA8Tj4gaXMgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIChyZXF1aXJlZCBhbmQgb3B0aW9uYWwpIGFuZCA8TT4gaXMKLy8vICAgIHRoZSBudW1iZXIgb2YgbmFtZWQgcGFyYW1ldGVycywgYW5kIG5hbWVkUGFyYW08bj4gYXJlIHRoZSBuYW1lcyBvZiB0aGUKLy8vICAgIG5hbWVkIHBhcmFtZXRlcnMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgovLy8KLy8vICAgIE5vdGUgdGhhdCB0aGUgc2FtZSBjb252ZW50aW9uIGlzIHVzZWQgZm9yIHRoZSAqcHJvcG9zZWQgbmFtZSogb2Ygb3RoZXIKLy8vICAgIG1ldGhvZHMuIFRodXMsIGZvciBvcmRpbmFyeSBtZXRob2RzLCB0aGUgc3VmZml4IGJlY29tZXMgZW1iZWRkZWQgaW4gdGhlCi8vLyAgICBkaXNhbWJpZ3VhdGVkIG5hbWUgKGFuZCBjYW4gYmUgbWluaWZpZWQpLCB3aGVyZWFzIGZvciB0aGUgJ2NhbGwnIG1ldGhvZCwKLy8vICAgIHRoZSBzdWZmaXggaXMgYW4gYW5ub3RhdGlvbiB0aGF0IG11c3QgYmUgY29tcHV0YWJsZSBhdCBydW50aW1lCi8vLyAgICAoYW5kIHRodXMgY2Fubm90IGJlIG1pbmlmaWVkKS4KLy8vCi8vLyAgICBOb3RlIHRoYXQgdGhlIG9yZGVyaW5nIG9mIG5hbWVkIHBhcmFtZXRlcnMgaXMgbm90IGVuY2Fwc3VsYXRlZCBpbiB0aGUKLy8vICAgIFtOYW1lcl0sIGFuZCBpcyBoYXJkY29kZWQgaW50byBvdGhlciBjb21wb25lbnRzLCBzdWNoIGFzIFtFbGVtZW50XSBhbmQKLy8vICAgIFtTZWxlY3Rvcl0uCi8vLwovLy8gMi4gVGhlIGdldHRlci9zZXR0ZXIgZm9yIGEgZmllbGQ6Ci8vLwovLy8gICAgICAgIGdldCQ8TkFNRT4KLy8vICAgICAgICBzZXQkPE5BTUU+Ci8vLwovLy8gICAgKFRoZSBbZ2V0dGVyUHJlZml4XSBhbmQgW3NldHRlclByZWZpeF0gYXJlIGRpZmZlcmVudCBpbiBbTWluaWZ5TmFtZXJdKS4KLy8vCi8vLyAzLiBUaGUgYGlzYCBhbmQgb3BlcmF0b3IgdXNlcyB0aGUgZm9sbG93aW5nIG5hbWVzOgovLy8KLy8vICAgICAgICAkaXM8TkFNRT4KLy8vICAgICAgICAkYXM8TkFNRT4KLy8vCi8vLyBGb3IgbG9jYWwgdmFyaWFibGVzLCB0aGUgW05hbWVyXSBvbmx5IHByb3ZpZGVzICpwcm9wb3NlZCBuYW1lcyouIFRoZXNlIG5hbWVzCi8vLyBtdXN0IGJlIGRpc2FtYmlndWF0ZWQgZWxzZXdoZXJlLgpjbGFzcyBOYW1lciBleHRlbmRzIE1vZHVsYXJOYW1lciB7CiAgc3RhdGljIGNvbnN0IExpc3Q8U3RyaW5nPiBqYXZhU2NyaXB0S2V5d29yZHMgPSBjb25zdCA8U3RyaW5nPlsKICAgIC8vIEVTNSA3LjYuMS4xIEtleXdvcmRzLgogICAgJ2JyZWFrJywKICAgICdkbycsCiAgICAnaW5zdGFuY2VvZicsCiAgICAndHlwZW9mJywKICAgICdjYXNlJywKICAgICdlbHNlJywKICAgICduZXcnLAogICAgJ3ZhcicsCiAgICAnY2F0Y2gnLAogICAgJ2ZpbmFsbHknLAogICAgJ3JldHVybicsCiAgICAndm9pZCcsCiAgICAnY29udGludWUnLAogICAgJ2ZvcicsCiAgICAnc3dpdGNoJywKICAgICd3aGlsZScsCiAgICAnZGVidWdnZXInLAogICAgJ2Z1bmN0aW9uJywKICAgICd0aGlzJywKICAgICd3aXRoJywKICAgICdkZWZhdWx0JywKICAgICdpZicsCiAgICAndGhyb3cnLAogICAgJ2RlbGV0ZScsCiAgICAnaW4nLAogICAgJ3RyeScsCgogICAgLy8gRVM1IDcuNi4xLjIgRnV0dXJlIFJlc2VydmVkIFdvcmRzLgogICAgJ2NsYXNzJywKICAgICdlbnVtJywKICAgICdleHRlbmRzJywKICAgICdzdXBlcicsCiAgICAnY29uc3QnLAogICAgJ2V4cG9ydCcsCiAgICAnaW1wb3J0JywKCiAgICAvLyBFUzUgNy42LjEuMiBXb3JkcyB3aXRoIHNlbWFudGljIHJlc3RyaWN0aW9ucy4KICAgICdpbXBsZW1lbnRzJywKICAgICdsZXQnLAogICAgJ3ByaXZhdGUnLAogICAgJ3B1YmxpYycsCiAgICAneWllbGQnLAogICAgJ2ludGVyZmFjZScsCiAgICAncGFja2FnZScsCiAgICAncHJvdGVjdGVkJywKICAgICdzdGF0aWMnLAoKICAgIC8vIEVTNiAxMS42LjIuMSBLZXl3b3JkcyAoaW5jbHVkaW5nIHJlcGVhdHMgb2YgRVM1IHRvIGVhc2UgY29tcGFyaXNvbiB3aXRoCiAgICAvLyBkb2N1bWVudHMpLgogICAgJ2JyZWFrJywKICAgICdkbycsCiAgICAnaW4nLAogICAgJ3R5cGVvZicsCiAgICAnY2FzZScsCiAgICAnZWxzZScsCiAgICAnaW5zdGFuY2VvZicsCiAgICAndmFyJywKICAgICdjYXRjaCcsCiAgICAnZXhwb3J0JywKICAgICduZXcnLAogICAgJ3ZvaWQnLAogICAgJ2NsYXNzJywKICAgICdleHRlbmRzJywKICAgICdyZXR1cm4nLAogICAgJ3doaWxlJywKICAgICdjb25zdCcsCiAgICAnZmluYWxseScsCiAgICAnc3VwZXInLAogICAgJ3dpdGgnLAogICAgJ2NvbnRpbnVlJywKICAgICdmb3InLAogICAgJ3N3aXRjaCcsCiAgICAneWllbGQnLAogICAgJ2RlYnVnZ2VyJywKICAgICdmdW5jdGlvbicsCiAgICAndGhpcycsCiAgICAnZGVmYXVsdCcsCiAgICAnaWYnLAogICAgJ3Rocm93JywKICAgICdkZWxldGUnLAogICAgJ2ltcG9ydCcsCiAgICAndHJ5JywKCiAgICAvLyBFUzYgMTEuNi4yLjEgV29yZHMgd2l0aCBzZW1hbnRpYyByZXN0cmljdGlvbnMuCiAgICAneWllbGQnLCAnbGV0JywgJ3N0YXRpYycsCgogICAgLy8gRVM2IDExLjYuMi4yIEZ1dHVyZSBSZXNlcnZlZCBXb3Jkcy4KICAgICdlbnVtJywKICAgICdhd2FpdCcsCgogICAgLy8gRVM2IDExLjYuMi4yIC8gRVM2IDEyLjEuMSBXb3JkcyB3aXRoIHNlbWFudGljIHJlc3RyaWN0aW9ucy4KICAgICdpbXBsZW1lbnRzJywKICAgICdwYWNrYWdlJywKICAgICdwcm90ZWN0ZWQnLAogICAgJ2ludGVyZmFjZScsCiAgICAncHJpdmF0ZScsCiAgICAncHVibGljJywKCiAgICAvLyBPdGhlciB3b3JkcyB0byBhdm9pZCBkdWUgdG8gbm9uLXN0YW5kYXJkIGtleXdvcmQtbGlrZSBiZWhhdmlvci4KICBdOwoKICBzdGF0aWMgY29uc3QgTGlzdDxTdHJpbmc+IHJlc2VydmVkUHJvcGVydHlTeW1ib2xzID0gY29uc3QgPFN0cmluZz5bCiAgICAiX19wcm90b19fIiwgInByb3RvdHlwZSIsICJjb25zdHJ1Y3RvciIsICJjYWxsIiwKICAgIC8vICJ1c2Ugc3RyaWN0IiBkaXNhbGxvd3MgdGhlIHVzZSBvZiAiYXJndW1lbnRzIiBhbmQgImV2YWwiIGFzCiAgICAvLyB2YXJpYWJsZSBuYW1lcyBvciBwcm9wZXJ0eSBuYW1lcy4gU2VlIEVDTUEtMjYyLCBFZGl0aW9uIDUuMSwKICAgIC8vIHNlY3Rpb24gMTEuMS41IChmb3IgdGhlIHByb3BlcnR5IG5hbWVzKS4KICAgICJldmFsIiwgImFyZ3VtZW50cyIKICBdOwoKICAvLyBTeW1ib2xzIHRoYXQgd2UgbWlnaHQgYmUgdXNpbmcgaW4gb3VyIEpTIHNuaXBwZXRzLgogIHN0YXRpYyBjb25zdCBMaXN0PFN0cmluZz4gcmVzZXJ2ZWRHbG9iYWxTeW1ib2xzID0gY29uc3QgPFN0cmluZz5bCiAgICAvLyBTZWN0aW9uIHJlZmVyZW5jZXMgYXJlIGZyb20gRWNtYS0yNjIKICAgIC8vIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL2ZpbGVzL0VDTUEtU1QvRWNtYS0yNjIucGRmKQoKICAgIC8vIDE1LjEuMSBWYWx1ZSBQcm9wZXJ0aWVzIG9mIHRoZSBHbG9iYWwgT2JqZWN0CiAgICAiTmFOIiwgIkluZmluaXR5IiwgInVuZGVmaW5lZCIsCgogICAgLy8gMTUuMS4yIEZ1bmN0aW9uIFByb3BlcnRpZXMgb2YgdGhlIEdsb2JhbCBPYmplY3QKICAgICJldmFsIiwgInBhcnNlSW50IiwgInBhcnNlRmxvYXQiLCAiaXNOYU4iLCAiaXNGaW5pdGUiLAoKICAgIC8vIDE1LjEuMyBVUkkgSGFuZGxpbmcgRnVuY3Rpb24gUHJvcGVydGllcwogICAgImRlY29kZVVSSSIsICJkZWNvZGVVUklDb21wb25lbnQiLAogICAgImVuY29kZVVSSSIsCiAgICAiZW5jb2RlVVJJQ29tcG9uZW50IiwKCiAgICAvLyAxNS4xLjQgQ29uc3RydWN0b3IgUHJvcGVydGllcyBvZiB0aGUgR2xvYmFsIE9iamVjdAogICAgIk9iamVjdCIsICJGdW5jdGlvbiIsICJBcnJheSIsICJTdHJpbmciLCAiQm9vbGVhbiIsICJOdW1iZXIiLCAiRGF0ZSIsCiAgICAiUmVnRXhwIiwgIkVycm9yIiwgIkV2YWxFcnJvciIsICJSYW5nZUVycm9yIiwgIlJlZmVyZW5jZUVycm9yIiwKICAgICJTeW50YXhFcnJvciIsICJUeXBlRXJyb3IiLCAiVVJJRXJyb3IiLAoKICAgIC8vIDE1LjEuNSBPdGhlciBQcm9wZXJ0aWVzIG9mIHRoZSBHbG9iYWwgT2JqZWN0CiAgICAiTWF0aCIsCgogICAgLy8gMTAuMS42IEFjdGl2YXRpb24gT2JqZWN0CiAgICAiYXJndW1lbnRzIiwKCiAgICAvLyBCLjIgQWRkaXRpb25hbCBQcm9wZXJ0aWVzIChub24tbm9ybWF0aXZlKQogICAgImVzY2FwZSIsICJ1bmVzY2FwZSIsCgogICAgLy8gV2luZG93IHByb3BzIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vd2luZG93KQogICAgImFwcGxpY2F0aW9uQ2FjaGUiLCAiY2xvc2VkIiwgIkNvbXBvbmVudHMiLCAiY29udGVudCIsICJjb250cm9sbGVycyIsCiAgICAiY3J5cHRvIiwgImRlZmF1bHRTdGF0dXMiLCAiZGlhbG9nQXJndW1lbnRzIiwgImRpcmVjdG9yaWVzIiwKICAgICJkb2N1bWVudCIsICJmcmFtZUVsZW1lbnQiLCAiZnJhbWVzIiwgImZ1bGxTY3JlZW4iLCAiZ2xvYmFsU3RvcmFnZSIsCiAgICAiaGlzdG9yeSIsICJpbm5lckhlaWdodCIsICJpbm5lcldpZHRoIiwgImxlbmd0aCIsCiAgICAibG9jYXRpb24iLCAibG9jYXRpb25iYXIiLCAibG9jYWxTdG9yYWdlIiwgIm1lbnViYXIiLAogICAgIm1veklubmVyU2NyZWVuWCIsICJtb3pJbm5lclNjcmVlblkiLCAibW96U2NyZWVuUGl4ZWxzUGVyQ3NzUGl4ZWwiLAogICAgIm5hbWUiLCAibmF2aWdhdG9yIiwgIm9wZW5lciIsICJvdXRlckhlaWdodCIsICJvdXRlcldpZHRoIiwKICAgICJwYWdlWE9mZnNldCIsICJwYWdlWU9mZnNldCIsICJwYXJlbnQiLCAicGVyc29uYWxiYXIiLCAicGtjczExIiwKICAgICJyZXR1cm5WYWx1ZSIsICJzY3JlZW4iLCAic2Nyb2xsYmFycyIsICJzY3JvbGxNYXhYIiwgInNjcm9sbE1heFkiLAogICAgInNlbGYiLCAic2Vzc2lvblN0b3JhZ2UiLCAic2lkZWJhciIsICJzdGF0dXMiLCAic3RhdHVzYmFyIiwgInRvb2xiYXIiLAogICAgInRvcCIsICJ3aW5kb3ciLAoKICAgIC8vIFdpbmRvdyBtZXRob2RzIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vd2luZG93KQogICAgImFsZXJ0IiwgImFkZEV2ZW50TGlzdGVuZXIiLCAiYXRvYiIsICJiYWNrIiwgImJsdXIiLCAiYnRvYSIsCiAgICAiY2FwdHVyZUV2ZW50cyIsICJjbGVhckludGVydmFsIiwgImNsZWFyVGltZW91dCIsICJjbG9zZSIsICJjb25maXJtIiwKICAgICJkaXNhYmxlRXh0ZXJuYWxDYXB0dXJlIiwgImRpc3BhdGNoRXZlbnQiLCAiZHVtcCIsCiAgICAiZW5hYmxlRXh0ZXJuYWxDYXB0dXJlIiwgImVzY2FwZSIsICJmaW5kIiwgImZvY3VzIiwgImZvcndhcmQiLAogICAgIkdlY2tvQWN0aXZlWE9iamVjdCIsICJnZXRBdHRlbnRpb24iLCAiZ2V0QXR0ZW50aW9uV2l0aEN5Y2xlQ291bnQiLAogICAgImdldENvbXB1dGVkU3R5bGUiLCAiZ2V0U2VsZWN0aW9uIiwgImhvbWUiLCAibWF4aW1pemUiLCAibWluaW1pemUiLAogICAgIm1vdmVCeSIsICJtb3ZlVG8iLCAib3BlbiIsICJvcGVuRGlhbG9nIiwgInBvc3RNZXNzYWdlIiwgInByaW50IiwKICAgICJwcm9tcHQiLCAiUXVlcnlJbnRlcmZhY2UiLCAicmVsZWFzZUV2ZW50cyIsICJyZW1vdmVFdmVudExpc3RlbmVyIiwKICAgICJyZXNpemVCeSIsICJyZXNpemVUbyIsICJyZXN0b3JlIiwgInJvdXRlRXZlbnQiLCAic2Nyb2xsIiwgInNjcm9sbEJ5IiwKICAgICJzY3JvbGxCeUxpbmVzIiwgInNjcm9sbEJ5UGFnZXMiLCAic2Nyb2xsVG8iLCAic2V0SW50ZXJ2YWwiLAogICAgInNldFJlc2l6ZWFibGUiLCAic2V0VGltZW91dCIsICJzaG93TW9kYWxEaWFsb2ciLCAic2l6ZVRvQ29udGVudCIsCiAgICAic3RvcCIsICJ1dWVzY2FwZSIsICJ1cGRhdGVDb21tYW5kcyIsICJYUENOYXRpdmVXcmFwcGVyIiwKICAgICJYUENTYWZlSlNPamJlY3RXcmFwcGVyIiwKCiAgICAvLyBNb3ppbGxhIFdpbmRvdyBldmVudCBoYW5kbGVycywgc2FtZSBjaXRlCiAgICAib25hYm9ydCIsICJvbmJlZm9yZXVubG9hZCIsICJvbmNoYW5nZSIsICJvbmNsaWNrIiwgIm9uY2xvc2UiLAogICAgIm9uY29udGV4dG1lbnUiLCAib25kcmFnZHJvcCIsICJvbmVycm9yIiwgIm9uZm9jdXMiLCAib25oYXNoY2hhbmdlIiwKICAgICJvbmtleWRvd24iLCAib25rZXlwcmVzcyIsICJvbmtleXVwIiwgIm9ubG9hZCIsICJvbm1vdXNlZG93biIsCiAgICAib25tb3VzZW1vdmUiLCAib25tb3VzZW91dCIsICJvbm1vdXNlb3ZlciIsICJvbm1vdXNldXAiLAogICAgIm9ubW96b3JpZW50YXRpb24iLCAib25wYWludCIsICJvbnJlc2V0IiwgIm9ucmVzaXplIiwgIm9uc2Nyb2xsIiwKICAgICJvbnNlbGVjdCIsICJvbnN1Ym1pdCIsICJvbnVubG9hZCIsCgogICAgLy8gU2FmYXJpIFdlYiBDb250ZW50IEd1aWRlCiAgICAvLyBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L3NhZmFyaS8jZG9jdW1lbnRhdGlvbi9BcHBsZUFwcGxpY2F0aW9ucy9SZWZlcmVuY2UvU2FmYXJpV2ViQ29udGVudC9TYWZhcmlXZWJDb250ZW50LnBkZgogICAgLy8gV2ViS2l0IFdpbmRvdyBtZW1iZXIgZGF0YSwgZnJvbSBXZWJLaXQgRE9NIFJlZmVyZW5jZQogICAgLy8gKGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3NhZmFyaS9saWJyYXJ5L2RvY3VtZW50YXRpb24vQXBwbGVBcHBsaWNhdGlvbnMvUmVmZXJlbmNlL1dlYktpdERPTVJlZi9ET01XaW5kb3dfaWRsL0NsYXNzZXMvRE9NV2luZG93L2luZGV4Lmh0bWwpCiAgICAib250b3VjaGNhbmNlbCIsICJvbnRvdWNoZW5kIiwgIm9udG91Y2htb3ZlIiwgIm9udG91Y2hzdGFydCIsCiAgICAib25nZXN0dXJlc3RhcnQiLCAib25nZXN0dXJlY2hhbmdlIiwgIm9uZ2VzdHVyZWVuZCIsCgogICAgLy8gZXh0cmEgd2luZG93IG1ldGhvZHMKICAgICJ1bmV2YWwiLAoKICAgIC8vIGtleXdvcmRzIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL05ld19pbl9KYXZhU2NyaXB0XzEuNywKICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL05ld19pbl9KYXZhU2NyaXB0XzEuOC4xCiAgICAiZ2V0UHJvdG90eXBlT2YiLCAibGV0IiwgInlpZWxkIiwKCiAgICAvLyBJRSBtZXRob2RzCiAgICAvLyAoaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM1ODczKFZTLjg1KS5hc3B4IykKICAgICJhdHRhY2hFdmVudCIsICJjbGllbnRJbmZvcm1hdGlvbiIsICJjbGlwYm9hcmREYXRhIiwgImNyZWF0ZVBvcHVwIiwKICAgICJkaWFsb2dIZWlnaHQiLCAiZGlhbG9nTGVmdCIsICJkaWFsb2dUb3AiLCAiZGlhbG9nV2lkdGgiLAogICAgIm9uYWZ0ZXJwcmludCIsICJvbmJlZm9yZWRlYWN0aXZhdGUiLCAib25iZWZvcmVwcmludCIsCiAgICAib25jb250cm9sc2VsZWN0IiwgIm9uZGVhY3RpdmF0ZSIsICJvbmhlbHAiLCAib25yZXNpemVlbmQiLAoKICAgIC8vIENvbW1vbiBicm93c2VyLWRlZmluZWQgaWRlbnRpZmllcnMgbm90IGRlZmluZWQgaW4gRUNNQVNjcmlwdAogICAgImV2ZW50IiwgImV4dGVybmFsIiwgIkRlYnVnIiwgIkVudW1lcmF0b3IiLCAiR2xvYmFsIiwgIkltYWdlIiwKICAgICJBY3RpdmVYT2JqZWN0IiwgIlZCQXJyYXkiLCAiQ29tcG9uZW50cyIsCgogICAgLy8gRnVuY3Rpb25zIGNvbW1vbmx5IGRlZmluZWQgb24gT2JqZWN0CiAgICAidG9TdHJpbmciLCAiZ2V0Q2xhc3MiLCAiY29uc3RydWN0b3IiLCAicHJvdG90eXBlIiwgInZhbHVlT2YiLAoKICAgIC8vIENsaWVudC1zaWRlIEphdmFTY3JpcHQgaWRlbnRpZmllcnMKICAgICJBbmNob3IiLCAiQXBwbGV0IiwgIkF0dHIiLCAiQ2FudmFzIiwgIkNhbnZhc0dyYWRpZW50IiwKICAgICJDYW52YXNQYXR0ZXJuIiwgIkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCIsICJDREFUQVNlY3Rpb24iLAogICAgIkNoYXJhY3RlckRhdGEiLCAiQ29tbWVudCIsICJDU1MyUHJvcGVydGllcyIsICJDU1NSdWxlIiwKICAgICJDU1NTdHlsZVNoZWV0IiwgIkRvY3VtZW50IiwgIkRvY3VtZW50RnJhZ21lbnQiLCAiRG9jdW1lbnRUeXBlIiwKICAgICJET01FeGNlcHRpb24iLCAiRE9NSW1wbGVtZW50YXRpb24iLCAiRE9NUGFyc2VyIiwgIkVsZW1lbnQiLCAiRXZlbnQiLAogICAgIkV4dGVybmFsSW50ZXJmYWNlIiwgIkZsYXNoUGxheWVyIiwgIkZvcm0iLCAiRnJhbWUiLCAiSGlzdG9yeSIsCiAgICAiSFRNTENvbGxlY3Rpb24iLCAiSFRNTERvY3VtZW50IiwgIkhUTUxFbGVtZW50IiwgIklGcmFtZSIsICJJbWFnZSIsCiAgICAiSW5wdXQiLCAiSlNPYmplY3QiLCAiS2V5RXZlbnQiLCAiTGluayIsICJMb2NhdGlvbiIsICJNaW1lVHlwZSIsCiAgICAiTW91c2VFdmVudCIsICJOYXZpZ2F0b3IiLCAiTm9kZSIsICJOb2RlTGlzdCIsICJPcHRpb24iLCAiUGx1Z2luIiwKICAgICJQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24iLCAiUmFuZ2UiLCAiUmFuZ2VFeGNlcHRpb24iLCAiU2NyZWVuIiwgIlNlbGVjdCIsCiAgICAiVGFibGUiLCAiVGFibGVDZWxsIiwgIlRhYmxlUm93IiwgIlRhYmxlU2VsZWN0aW9uIiwgIlRleHQiLCAiVGV4dEFyZWEiLAogICAgIlVJRXZlbnQiLCAiV2luZG93IiwgIlhNTEh0dHBSZXF1ZXN0IiwgIlhNTFNlcmlhbGl6ZXIiLAogICAgIlhQYXRoRXhjZXB0aW9uIiwgIlhQYXRoUmVzdWx0IiwgIlhTTFRQcm9jZXNzb3IiLAoKICAgIC8vIFRoZXNlIGtleXdvcmRzIHRyaWdnZXIgdGhlIGxvYWRpbmcgb2YgdGhlIGphdmEtcGx1Z2luLiBGb3IgdGhlCiAgICAvLyBuZXh0LWdlbmVyYXRpb24gcGx1Z2luLCB0aGlzIHJlc3VsdHMgaW4gc3RhcnRpbmcgYSBuZXcgSmF2YSBwcm9jZXNzLgogICAgImphdmEiLCAiUGFja2FnZXMiLCAibmV0c2NhcGUiLCAic3VuIiwgIkphdmFPYmplY3QiLCAiSmF2YUNsYXNzIiwKICAgICJKYXZhQXJyYXkiLCAiSmF2YU1lbWJlciIsCgogICAgLy8gRVM2IGNvbGxlY3Rpb25zLgogICAgIk1hcCIsICJTZXQiLAogIF07CgogIHN0YXRpYyBjb25zdCBMaXN0PFN0cmluZz4gcmVzZXJ2ZWRHbG9iYWxPYmplY3ROYW1lcyA9IGNvbnN0IDxTdHJpbmc+WwogICAgIkEiLAogICAgIkIiLAogICAgIkMiLCAvLyBHbG9iYWwgb2JqZWN0IGZvciAqQypvbnN0YW50cy4KICAgICJEIiwKICAgICJFIiwKICAgICJGIiwKICAgICJHIiwKICAgICJIIiwgLy8gR2xvYmFsIG9iamVjdCBmb3IgaW50ZXJuYWwgKCpIKmVscGVyKSBsaWJyYXJpZXMuCiAgICAvLyBJIGlzIHVzZWQgZm9yIHVzZWQgZm9yIHRoZSBJc29sYXRlIGZ1bmN0aW9uLgogICAgIkoiLCAvLyBHbG9iYWwgb2JqZWN0IGZvciB0aGUgaW50ZXJjZXB0b3IgbGlicmFyeS4KICAgICJLIiwKICAgICJMIiwKICAgICJNIiwKICAgICJOIiwKICAgICJPIiwKICAgICJQIiwgLy8gR2xvYmFsIG9iamVjdCBmb3Igb3RoZXIgKlAqbGF0Zm9ybSBsaWJyYXJpZXMuCiAgICAiUSIsCiAgICAiUiIsCiAgICAiUyIsCiAgICAiVCIsCiAgICAiVSIsCiAgICAiViIsCiAgICAiVyIsIC8vIEdsb2JhbCBvYmplY3QgZm9yICpXKmViIGxpYnJhcmllcyAoZGFydDpodG1sKS4KICAgICJYIiwKICAgICJZIiwKICAgICJaIiwKICBdOwoKICBzdGF0aWMgY29uc3QgTGlzdDxTdHJpbmc+IHJlc2VydmVkR2xvYmFsSGVscGVyRnVuY3Rpb25zID0gY29uc3QgPFN0cmluZz5bCiAgICAiaW5pdCIsCiAgICAiSXNvbGF0ZSIsCiAgXTsKCiAgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiB1c2VyR2xvYmFsT2JqZWN0cyA9CiAgICAgIG5ldyBMaXN0LmZyb20ocmVzZXJ2ZWRHbG9iYWxPYmplY3ROYW1lcykKICAgICAgICAuLnJlbW92ZSgnQycpCiAgICAgICAgLi5yZW1vdmUoJ0gnKQogICAgICAgIC4ucmVtb3ZlKCdKJykKICAgICAgICAuLnJlbW92ZSgnUCcpCiAgICAgICAgLi5yZW1vdmUoJ1cnKTsKCiAgU2V0PFN0cmluZz4gX2pzUmVzZXJ2ZWQgPSBudWxsOwoKICAvLy8gTmFtZXMgdGhhdCBjYW5ub3QgYmUgdXNlZCBieSBtZW1iZXJzLCB0b3AgbGV2ZWwgYW5kIHN0YXRpYwogIC8vLyBtZXRob2RzLgogIFNldDxTdHJpbmc+IGdldCBqc1Jlc2VydmVkIHsKICAgIGlmIChfanNSZXNlcnZlZCA9PSBudWxsKSB7CiAgICAgIF9qc1Jlc2VydmVkID0gbmV3IFNldDxTdHJpbmc+KCk7CiAgICAgIF9qc1Jlc2VydmVkLmFkZEFsbChqYXZhU2NyaXB0S2V5d29yZHMpOwogICAgICBfanNSZXNlcnZlZC5hZGRBbGwocmVzZXJ2ZWRQcm9wZXJ0eVN5bWJvbHMpOwogICAgfQogICAgcmV0dXJuIF9qc1Jlc2VydmVkOwogIH0KCiAgZmluYWwgU3RyaW5nIGxhenlHZXR0ZXJQcmVmaXggPSByJyRnZXQkJzsKICBmaW5hbCBTdHJpbmcgc3VwZXJQcmVmaXggPSByJ3N1cGVyJCc7CiAgZmluYWwgU3RyaW5nIG1ldGFkYXRhRmllbGQgPSAnQCc7CiAgZmluYWwgU3RyaW5nIHN0dWJOYW1lRmllbGQgPSByJyRzdHViTmFtZSc7CiAgZmluYWwgU3RyaW5nIHJlZmxlY3Rpb25JbmZvRmllbGQgPSByJyRyZWZsZWN0aW9uSW5mbyc7CiAgZmluYWwgU3RyaW5nIHJlZmxlY3Rpb25OYW1lRmllbGQgPSByJyRyZWZsZWN0aW9uTmFtZSc7CiAgZmluYWwgU3RyaW5nIG1ldGFkYXRhSW5kZXhGaWVsZCA9IHInJG1ldGFkYXRhSW5kZXgnOwogIGZpbmFsIFN0cmluZyBtZXRob2RzV2l0aE9wdGlvbmFsQXJndW1lbnRzRmllbGQgPQogICAgICByJyRtZXRob2RzV2l0aE9wdGlvbmFsQXJndW1lbnRzJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgUnVudGltZVR5cGVUYWdzIHJ0aVRhZ3M7CgogIEBvdmVycmlkZQogIGZpbmFsIEZpeGVkTmFtZXMgZml4ZWROYW1lczsKCiAgLy8vIFRoZSBub24tbWluaWZ5aW5nIG5hbWVyJ3MgW2NhbGxQcmVmaXhdIHdpdGggYSBkb2xsYXIgYWZ0ZXIgaXQuCiAgc3RhdGljIGNvbnN0IFN0cmluZyBfY2FsbFByZWZpeERvbGxhciA9IHInY2FsbCQnOwoKICBzdGF0aWMgZmluYWwganNBc3QuTmFtZSBfbGl0ZXJhbERvbGxhciA9IG5ldyBTdHJpbmdCYWNrZWROYW1lKHInJCcpOwogIHN0YXRpYyBmaW5hbCBqc0FzdC5OYW1lIF9saXRlcmFsVW5kZXJzY29yZSA9IG5ldyBTdHJpbmdCYWNrZWROYW1lKCdfJyk7CiAgc3RhdGljIGZpbmFsIGpzQXN0Lk5hbWUgbGl0ZXJhbFBsdXMgPSBuZXcgU3RyaW5nQmFja2VkTmFtZSgnKycpOwogIHN0YXRpYyBmaW5hbCBqc0FzdC5OYW1lIF9saXRlcmFsRHluYW1pYyA9IG5ldyBTdHJpbmdCYWNrZWROYW1lKCJkeW5hbWljIik7CgogIGpzQXN0Lk5hbWUgX2xpdGVyYWxHZXR0ZXJQcmVmaXg7CiAganNBc3QuTmFtZSBfbGl0ZXJhbFNldHRlclByZWZpeDsKCiAganNBc3QuTmFtZSBfc3RhdGljc1Byb3BlcnR5TmFtZTsKCiAganNBc3QuTmFtZSBnZXQgc3RhdGljc1Byb3BlcnR5TmFtZSA9PgogICAgICBfc3RhdGljc1Byb3BlcnR5TmFtZSA/Pz0gbmV3IFN0cmluZ0JhY2tlZE5hbWUoJ3N0YXRpYycpOwoKICBqc0FzdC5OYW1lIF9ydGlGaWVsZEpzTmFtZTsKCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBnZXQgcnRpRmllbGRKc05hbWUgPT4KICAgICAgX3J0aUZpZWxkSnNOYW1lID8/PSBuZXcgU3RyaW5nQmFja2VkTmFtZShmaXhlZE5hbWVzLnJ0aU5hbWUpOwoKICAvLyBOYW1lIG9mIHByb3BlcnR5IGluIGEgY2xhc3MgZGVzY3JpcHRpb24gZm9yIHRoZSBuYXRpdmUgZGlzcGF0Y2ggbWV0YWRhdGEuCiAgZmluYWwgU3RyaW5nIG5hdGl2ZVNwZWNQcm9wZXJ0eSA9ICclJzsKCiAgc3RhdGljIGZpbmFsIFJlZ0V4cCBJREVOVElGSUVSID0gbmV3IFJlZ0V4cChyJ15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSokJyk7CiAgc3RhdGljIGZpbmFsIFJlZ0V4cCBOT05fSURFTlRJRklFUl9DSEFSID0gbmV3IFJlZ0V4cChyJ1teQS1aYS16XzAtOSRdJyk7CgogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CgogIC8vLyBVc2VkIGRpc2FtYmlndWF0ZWQgbmFtZXMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGlzc3VlZCBieQogIC8vLyBbX2Rpc2FtYmlndWF0ZUdsb2JhbF0sIGFuZCBbX2Rpc2FtYmlndWF0ZUludGVybmFsR2xvYmFsXS4KICAvLy8KICAvLy8gQWx0aG91Z2ggZ2xvYmFsIG5hbWVzIGFyZSBkaXN0cmlidXRlZCBhY3Jvc3MgYSBudW1iZXIgb2YgZ2xvYmFsIG9iamVjdHMsCiAgLy8vIChzZWUgW2dsb2JhbE9iamVjdEZvcl0pLCB3ZSBjdXJyZW50bHkgdXNlIGEgc2luZ2xlIG5hbWVzcGFjZSBmb3IgYWxsIHRoZXNlCiAgLy8vIG5hbWVzLgogIGZpbmFsIE5hbWluZ1Njb3BlIGdsb2JhbFNjb3BlID0gTmFtaW5nU2NvcGUoKTsKICBmaW5hbCBNYXA8RW50aXR5LCBqc0FzdC5OYW1lPiB1c2VyR2xvYmFscyA9IHt9OwogIC8vIFt1c2VyR2xvYmFsc1NlY29uZE5hbWVdIGlzIHVzZWQgd2hlbiBhbiBlbnRpdHkgaGFzIGEgc2Vjb25kIG5hbWUsIGUuZy4gYQogIC8vIGxhemlseSBpbml0aWFsaXplZCBzdGF0aWMgdmFyaWFibGUgaGFzIGEgbG9jYXRpb24gYW5kIGEgZ2V0dGVyLgogIGZpbmFsIE1hcDxFbnRpdHksIGpzQXN0Lk5hbWU+IHVzZXJHbG9iYWxzU2Vjb25kTmFtZSA9IHt9OwogIGZpbmFsIE1hcDxTdHJpbmcsIGpzQXN0Lk5hbWU+IGludGVybmFsR2xvYmFscyA9IHt9OwoKICBfcmVnaXN0ZXJOYW1lKAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCwganNBc3QuTmFtZSBqc05hbWUsIFN0cmluZyBvcmlnaW5hbE5hbWUpIHsKICAgIC8vIE5vbi1maW5hbGl6ZWQgbmFtZXMgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvdXRwdXQgcHJvZ3JhbQogICAgaWYgKGpzTmFtZSBpcyBUb2tlbk5hbWUgJiYgIWpzTmFtZS5pc0ZpbmFsaXplZCkgcmV0dXJuOwogICAgbWFwW2pzTmFtZS5uYW1lXSA9IG9yaWdpbmFsTmFtZTsKICAgIHZhciBnZXR0ZXJOYW1lID0gdXNlckdldHRlcnNbanNOYW1lXTsKICAgIGlmIChnZXR0ZXJOYW1lICE9IG51bGwpIG1hcFtnZXR0ZXJOYW1lLm5hbWVdID0gb3JpZ2luYWxOYW1lOwogICAgdmFyIHNldHRlck5hbWUgPSB1c2VyU2V0dGVyc1tqc05hbWVdOwogICAgaWYgKHNldHRlck5hbWUgIT0gbnVsbCkgbWFwW3NldHRlck5hbWUubmFtZV0gPSBvcmlnaW5hbE5hbWU7CiAgfQoKICBNYXA8U3RyaW5nLCBTdHJpbmc+IGNyZWF0ZU1pbmlmaWVkR2xvYmFsTmFtZU1hcCgpIHsKICAgIHZhciBtYXAgPSA8U3RyaW5nLCBTdHJpbmc+e307CiAgICB1c2VyR2xvYmFscy5mb3JFYWNoKChlbnRpdHksIGpzTmFtZSkgewogICAgICBfcmVnaXN0ZXJOYW1lKG1hcCwganNOYW1lLCBlbnRpdHkubmFtZSk7CiAgICB9KTsKICAgIHVzZXJHbG9iYWxzU2Vjb25kTmFtZS5mb3JFYWNoKChlbnRpdHksIGpzTmFtZSkgewogICAgICBfcmVnaXN0ZXJOYW1lKG1hcCwganNOYW1lLCBlbnRpdHkubmFtZSk7CiAgICB9KTsKICAgIGludGVybmFsR2xvYmFscy5mb3JFYWNoKChuYW1lLCBqc05hbWUpIHsKICAgICAgX3JlZ2lzdGVyTmFtZShtYXAsIGpzTmFtZSwgbmFtZSk7CiAgICB9KTsKICAgIHJldHVybiBtYXA7CiAgfQoKICAvLy8gVXNlZCBkaXNhbWJpZ3VhdGVkIG5hbWVzIGluIHRoZSBpbnN0YW5jZSBuYW1lc3BhY2UsIGlzc3VlZCBieQogIC8vLyBbX2Rpc2FtYmlndWF0ZU1lbWJlcl0sIFtfZGlzYW1iaWd1YXRlSW50ZXJuYWxNZW1iZXJdLAogIC8vLyBbX2Rpc2FtYmlndWF0ZU9wZXJhdG9yXSwgYW5kIFtyZXNlcnZlUHVibGljTWVtYmVyTmFtZV0uCiAgZmluYWwgTmFtaW5nU2NvcGUgaW5zdGFuY2VTY29wZSA9IE5hbWluZ1Njb3BlKCk7CiAgZmluYWwgTWFwPFN0cmluZywganNBc3QuTmFtZT4gdXNlckluc3RhbmNlTWVtYmVycyA9IEhhc2hNYXAoKTsKICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJJbnN0YW5jZU1lbWJlcnNPcmlnaW5hbE5hbWUgPSBIYXNoTWFwKCk7CiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwganNBc3QuTmFtZT4gaW50ZXJuYWxJbnN0YW5jZU1lbWJlcnMgPSBIYXNoTWFwKCk7CiAgZmluYWwgTWFwPFN0cmluZywganNBc3QuTmFtZT4gdXNlckluc3RhbmNlT3BlcmF0b3JzID0gSGFzaE1hcCgpOwogIGZpbmFsIE1hcDxqc0FzdC5OYW1lLCBqc0FzdC5OYW1lPiB1c2VyR2V0dGVycyA9IEhhc2hNYXAoKTsKICBmaW5hbCBNYXA8anNBc3QuTmFtZSwganNBc3QuTmFtZT4gdXNlclNldHRlcnMgPSBIYXNoTWFwKCk7CiAgZmluYWwgTWFwPFR5cGVWYXJpYWJsZUVudGl0eSwganNBc3QuTmFtZT4gX3R5cGVWYXJpYWJsZU5hbWVzID0ge307CgogIE1hcDxTdHJpbmcsIFN0cmluZz4gY3JlYXRlTWluaWZpZWRJbnN0YW5jZU5hbWVNYXAoKSB7CiAgICB2YXIgbWFwID0gPFN0cmluZywgU3RyaW5nPnt9OwogICAgaW50ZXJuYWxJbnN0YW5jZU1lbWJlcnMuZm9yRWFjaCgoZW50aXR5LCBqc05hbWUpIHsKICAgICAgX3JlZ2lzdGVyTmFtZShtYXAsIGpzTmFtZSwgZW50aXR5Lm5hbWUpOwogICAgfSk7CiAgICB1c2VySW5zdGFuY2VNZW1iZXJzLmZvckVhY2goKG5hbWUsIGpzTmFtZSkgewogICAgICBfcmVnaXN0ZXJOYW1lKG1hcCwganNOYW1lLCB1c2VySW5zdGFuY2VNZW1iZXJzT3JpZ2luYWxOYW1lW25hbWVdID8/IG5hbWUpOwogICAgfSk7CgogICAgLy8gVE9ETyhzaWdtdW5kKTogcmV2ZXJzZSB0aGUgb3BlcmF0b3IgbmFtZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgRGFydAogICAgLy8gbmFtZXMuCiAgICB1c2VySW5zdGFuY2VPcGVyYXRvcnMuZm9yRWFjaCgobmFtZSwganNOYW1lKSB7CiAgICAgIF9yZWdpc3Rlck5hbWUobWFwLCBqc05hbWUsIG5hbWUpOwogICAgfSk7CiAgICByZXR1cm4gbWFwOwogIH0KCiAgLy8vIFVzZWQgdG8gZGlzYW1iaWd1YXRlIG5hbWVzIGZvciBjb25zdGFudHMgaW4gW2NvbnN0YW50TmFtZV0uCiAgZmluYWwgTmFtaW5nU2NvcGUgX2NvbnN0YW50U2NvcGUgPSBuZXcgTmFtaW5nU2NvcGUoKTsKCiAgLy8vIFVzZWQgdG8gc3RvcmUgc2NvcGVzIGZvciBpbnN0YW5jZXMgb2YgW1ByaXZhdGVseU5hbWVkSnNFbnRpdHldCiAgZmluYWwgTWFwPEVudGl0eSwgTmFtaW5nU2NvcGU+IF9wcml2YXRlTmFtaW5nU2NvcGVzID0ge307CgogIGZpbmFsIE1hcDxTdHJpbmcsIGludD4gcG9wdWxhck5hbWVDb3VudGVycyA9IHt9OwoKICBmaW5hbCBNYXA8TGlicmFyeUVudGl0eSwgU3RyaW5nPiBsaWJyYXJ5TG9uZ05hbWVzID0gSGFzaE1hcCgpOwoKICBmaW5hbCBNYXA8Q29uc3RhbnRWYWx1ZSwganNBc3QuTmFtZT4gX2NvbnN0YW50TmFtZXMgPSBIYXNoTWFwKCk7CiAgZmluYWwgTWFwPENvbnN0YW50VmFsdWUsIFN0cmluZz4gX2NvbnN0YW50TG9uZ05hbWVzID0ge307CiAgQ29uc3RhbnRDYW5vbmljYWxIYXNoZXIgX2NvbnN0YW50SGFzaGVyOwoKICAvLy8gTWFwcyBwcml2YXRlIG5hbWVzIHRvIGEgbGlicmFyeSB0aGF0IG1heSB1c2UgdGhhdCBuYW1lIHdpdGhvdXQgcHJlZml4aW5nCiAgLy8vIGl0c2VsZi4gVXNlZCBmb3IgYnVpbGRpbmcgcHJvcG9zZWQgbmFtZXMuCiAgZmluYWwgTWFwPFN0cmluZywgTGlicmFyeUVudGl0eT4gc2hvcnRQcml2YXRlTmFtZU93bmVycyA9IHt9OwoKICAvLy8gVXNlZCB0byBzdG9yZSB1bmlxdWUga2V5cyBmb3IgbGlicmFyeSBuYW1lcy4gS2V5cyBhcmUgbm90IHVzZWQgYXMgbmFtZXMsCiAgLy8vIG5vciBhcmUgdGhleSB2aXNpYmxlIGluIHRoZSBvdXRwdXQuIFRoZSBvbmx5IHNlcnZlIGFzIGFuIGludGVybmFsCiAgLy8vIGtleSBpbnRvIG1hcHMuCiAgZmluYWwgTWFwPExpYnJhcnlFbnRpdHksIFN0cmluZz4gX2xpYnJhcnlLZXlzID0gSGFzaE1hcCgpOwoKICBOYW1lcih0aGlzLl9jbG9zZWRXb3JsZCwgdGhpcy5ydGlUYWdzLCB0aGlzLmZpeGVkTmFtZXMpIHsKICAgIF9saXRlcmFsR2V0dGVyUHJlZml4ID0gbmV3IFN0cmluZ0JhY2tlZE5hbWUoZml4ZWROYW1lcy5nZXR0ZXJQcmVmaXgpOwogICAgX2xpdGVyYWxTZXR0ZXJQcmVmaXggPSBuZXcgU3RyaW5nQmFja2VkTmFtZShmaXhlZE5hbWVzLnNldHRlclByZWZpeCk7CiAgfQoKICBKRWxlbWVudEVudmlyb25tZW50IGdldCBfZWxlbWVudEVudmlyb25tZW50ID0+CiAgICAgIF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQ7CgogIEBvdmVycmlkZQogIENvbW1vbkVsZW1lbnRzIGdldCBfY29tbW9uRWxlbWVudHMgPT4gX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzOwoKICBOYXRpdmVEYXRhIGdldCBfbmF0aXZlRGF0YSA9PiBfY2xvc2VkV29ybGQubmF0aXZlRGF0YTsKCiAgU3RyaW5nIGdldCBkZWZlcnJlZE1ldGFkYXRhTmFtZSA9PiAnZGVmZXJyZWRNZXRhZGF0YSc7CiAgU3RyaW5nIGdldCBkZWZlcnJlZFR5cGVzTmFtZSA9PiAnZGVmZXJyZWRUeXBlcyc7CiAgU3RyaW5nIGdldCBpc29sYXRlTmFtZSA9PiAnSXNvbGF0ZSc7CiAgU3RyaW5nIGdldCBpc29sYXRlUHJvcGVydGllc05hbWUgPT4gcickaXNvbGF0ZVByb3BlcnRpZXMnOwogIGpzQXN0Lk5hbWUgZ2V0IG5vU3VjaE1ldGhvZE5hbWUgPT4gaW52b2NhdGlvbk5hbWUoU2VsZWN0b3JzLm5vU3VjaE1ldGhvZF8pOwoKICAvLy8gU29tZSBjbG9zdXJlcyBtdXN0IGNvbnRhaW4gdGhlaXIgbmFtZS4gVGhlIG5hbWUgaXMgc3RvcmVkIGluCiAgLy8vIFtTVEFUSUNfQ0xPU1VSRV9OQU1FX05BTUVdLgogIFN0cmluZyBnZXQgU1RBVElDX0NMT1NVUkVfTkFNRV9OQU1FID0+IHInJG5hbWUnOwogIFN0cmluZyBnZXQgY2xvc3VyZUludm9jYXRpb25TZWxlY3Rvck5hbWUgPT4gSWRlbnRpZmllcnMuY2FsbDsKICBib29sIGdldCBzaG91bGRNaW5pZnkgPT4gZmFsc2U7CgogIE5hbWluZ1Njb3BlIF9nZXRQcml2YXRlU2NvcGVGb3IoUHJpdmF0ZWx5TmFtZWRKU0VudGl0eSBlbnRpdHkpIHsKICAgIHJldHVybiBfcHJpdmF0ZU5hbWluZ1Njb3Blcy5wdXRJZkFic2VudCgKICAgICAgICBlbnRpdHkucm9vdE9mU2NvcGUsICgpID0+IG5ldyBOYW1pbmdTY29wZSgpKTsKICB9CgogIC8vLyBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGdpdmVuIFtuYW1lXS4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGV2ZXJ5IHVzZSBzaXRlIG9mIGEgbmFtZSBoYXMgYSB1bmlxdWUgbm9kZSBzbwogIC8vLyB0aGF0IHdlIGNhbiBwcm9wZXJseSBhdHRyaWJ1dGUgc291cmNlIGluZm9ybWF0aW9uLgogIGpzQXN0Lk5hbWUgX25ld1JlZmVyZW5jZShqc0FzdC5OYW1lIG5hbWUpIHsKICAgIHJldHVybiBuZXcgX05hbWVSZWZlcmVuY2UobmFtZSk7CiAgfQoKICAvLy8gRGlzYW1iaWd1YXRlZCBuYW1lIGZvciBbY29uc3RhbnRdLgogIC8vLwogIC8vLyBVbmlxdWUgd2l0aGluIHRoZSBnbG9iYWwtbWVtYmVyIG5hbWVzcGFjZS4KICBqc0FzdC5OYW1lIGNvbnN0YW50TmFtZShDb25zdGFudFZhbHVlIGNvbnN0YW50KSB7CiAgICAvLyBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gZ2l2ZSBuYW1lcyB0bwogICAgLy8gZnVuY3Rpb24gY29uc3RhbnRzIHNpbmNlIHRoZSBmdW5jdGlvbi1pbXBsZW1lbnRhdGlvbiBpdHNlbGYgc2VydmVzIGFzCiAgICAvLyBjb25zdGFudCBhbmQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LgogICAgYXNzZXJ0KCFjb25zdGFudC5pc0Z1bmN0aW9uKTsKICAgIGpzQXN0Lk5hbWUgcmVzdWx0ID0gX2NvbnN0YW50TmFtZXNbY29uc3RhbnRdOwogICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAgICAgIFN0cmluZyBsb25nTmFtZSA9IGNvbnN0YW50TG9uZ05hbWUoY29uc3RhbnQpOwogICAgICByZXN1bHQgPSBnZXRGcmVzaE5hbWUoX2NvbnN0YW50U2NvcGUsIGxvbmdOYW1lKTsKICAgICAgX2NvbnN0YW50TmFtZXNbY29uc3RhbnRdID0gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIF9uZXdSZWZlcmVuY2UocmVzdWx0KTsKICB9CgogIC8vLyBQcm9wb3NlZCBuYW1lIGZvciBbY29uc3RhbnRdLgogIFN0cmluZyBjb25zdGFudExvbmdOYW1lKENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgIFN0cmluZyBsb25nTmFtZSA9IF9jb25zdGFudExvbmdOYW1lc1tjb25zdGFudF07CiAgICBpZiAobG9uZ05hbWUgPT0gbnVsbCkgewogICAgICBfY29uc3RhbnRIYXNoZXIgPz89IG5ldyBDb25zdGFudENhbm9uaWNhbEhhc2hlcih0aGlzLCBfY2xvc2VkV29ybGQpOwogICAgICBsb25nTmFtZSA9IG5ldyBDb25zdGFudE5hbWluZ1Zpc2l0b3IodGhpcywgX2Nsb3NlZFdvcmxkLCBfY29uc3RhbnRIYXNoZXIpCiAgICAgICAgICAuZ2V0TmFtZShjb25zdGFudCk7CiAgICAgIF9jb25zdGFudExvbmdOYW1lc1tjb25zdGFudF0gPSBsb25nTmFtZTsKICAgIH0KICAgIHJldHVybiBsb25nTmFtZTsKICB9CgogIC8vLyBJZiB0aGUgW29yaWdpbmFsTmFtZV0gaXMgbm90IHByaXZhdGUgcmV0dXJucyBbb3JpZ2luYWxOYW1lXS4gT3RoZXJ3aXNlCiAgLy8vIG1hbmdsZXMgdGhlIFtvcmlnaW5hbE5hbWVdIHNvIHRoYXQgZWFjaCBsaWJyYXJ5IGhhcyBpdHMgb3duIGRpc3Rpbmd1aXNoZWQKICAvLy8gdmVyc2lvbiBvZiB0aGUgbmFtZS4KICAvLy8KICAvLy8gQWx0aG91Z2ggdGhlIG5hbWUgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlIHdpdGhpbiBhbnkgbmFtZXNwYWNlLAogIC8vLyBjbGFzaGVzIGFyZSB2ZXJ5IHVubGlrZWx5IGluIHByYWN0aWNlLiBUaGVyZWZvcmUsIGl0IGNhbiBiZSB1c2VkIGluIGNhc2VzCiAgLy8vIHdoZXJlIHVuaXF1ZW5lc3MgaXMgbmljZSBidXQgbm90IGEgc3RyaWN0IHJlcXVpcmVtZW50LgogIC8vLwogIC8vLyBUaGUgcmVzdWx0aW5nIG5hbWUgaXMgYSAqcHJvcG9zZWQgbmFtZSogYW5kIGlzIG5ldmVyIG1pbmlmaWVkLgogIFN0cmluZyBwcml2YXRlTmFtZShOYW1lIG9yaWdpbmFsTmFtZSkgewogICAgU3RyaW5nIHRleHQgPSBvcmlnaW5hbE5hbWUudGV4dDsKCiAgICAvLyBQdWJsaWMgbmFtZXMgYXJlIGVhc3kuCiAgICBpZiAoIW9yaWdpbmFsTmFtZS5pc1ByaXZhdGUpIHJldHVybiB0ZXh0OwoKICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSA9IG9yaWdpbmFsTmFtZS5saWJyYXJ5OwoKICAgIC8vIFRoZSBmaXJzdCBsaWJyYXJ5IGFza2luZyBmb3IgYSBzaG9ydCBwcml2YXRlIG5hbWUgd2lucy4KICAgIExpYnJhcnlFbnRpdHkgb3duZXIgPQogICAgICAgIHNob3J0UHJpdmF0ZU5hbWVPd25lcnMucHV0SWZBYnNlbnQodGV4dCwgKCkgPT4gbGlicmFyeSk7CgogICAgaWYgKG93bmVyID09IGxpYnJhcnkpIHsKICAgICAgcmV0dXJuIHRleHQ7CiAgICB9IGVsc2UgewogICAgICAvLyBNYWtlIHN1cmUgdG8gcmV0dXJuIGEgcHJpdmF0ZSBuYW1lIHRoYXQgc3RhcnRzIHdpdGggXyBzbyBpdAogICAgICAvLyBjYW5ub3QgY2xhc2ggd2l0aCBhbnkgcHVibGljIG5hbWVzLgogICAgICAvLyBUaGUgbmFtZSBpcyBzdGlsbCBub3QgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUsIHNpbmNlIGJvdGggdGhlIGxpYnJhcnkKICAgICAgLy8gbmFtZSBhbmQgb3JpZ2luYWxOYW1lIGNvdWxkIGNvbnRhaW4gJCBzeW1ib2xzIGFuZCBhcyB0aGUgbGlicmFyeQogICAgICAvLyBuYW1lIGl0c2VsZiBtaWdodCBjbGFzaC4KICAgICAgU3RyaW5nIGxpYnJhcnlOYW1lID0gX3Byb3Bvc2VOYW1lRm9yTGlicmFyeShsaWJyYXJ5KTsKICAgICAgcmV0dXJuICJfJGxpYnJhcnlOYW1lXCQkdGV4dCI7CiAgICB9CiAgfQoKICBTdHJpbmcgX3Byb3Bvc2VOYW1lRm9yQ29uc3RydWN0b3JCb2R5KENvbnN0cnVjdG9yQm9keUVudGl0eSBtZXRob2QpIHsKICAgIFN0cmluZyBuYW1lID0gdXRpbHMucmVjb25zdHJ1Y3RDb25zdHJ1Y3Rvck5hbWVTb3VyY2VTdHJpbmcobWV0aG9kKTsKICAgIC8vIFdlIGluY2x1ZGUgdGhlIG1ldGhvZCBzdWZmaXggb24gY29uc3RydWN0b3IgYm9kaWVzLiBJdCBoYXMgbm8gcHVycG9zZSwKICAgIC8vIGJ1dCB0aGlzIHdheSBpdCBwcm9kdWNlcyB0aGUgc2FtZSBuYW1lcyBhcyBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUKICAgIC8vIE5hbWVyIGNsYXNzIGRpZC4KICAgIExpc3Q8U3RyaW5nPiBzdWZmaXggPSBjYWxsU3VmZml4Rm9yU2lnbmF0dXJlKG1ldGhvZC5wYXJhbWV0ZXJTdHJ1Y3R1cmUpOwogICAgcmV0dXJuICckbmFtZVwkJHtzdWZmaXguam9pbihyJyQnKX0nOwogIH0KCiAgLy8vIE5hbWUgZm9yIGEgY29uc3RydWN0b3IgYm9keS4KICBqc0FzdC5OYW1lIGNvbnN0cnVjdG9yQm9keU5hbWUoQ29uc3RydWN0b3JCb2R5RW50aXR5IGN0b3IpIHsKICAgIHJldHVybiBfZGlzYW1iaWd1YXRlSW50ZXJuYWxNZW1iZXIoCiAgICAgICAgY3RvciwgKCkgPT4gX3Byb3Bvc2VOYW1lRm9yQ29uc3RydWN0b3JCb2R5KGN0b3IpKTsKICB9CgogIC8vLyBOYW1lIGZvciBhIGdlbmVyYXRvciBib2R5LgogIGpzQXN0Lk5hbWUgZ2VuZXJhdG9yQm9keUluc3RhbmNlTWV0aG9kTmFtZShKR2VuZXJhdG9yQm9keSBtZXRob2QpIHsKICAgIGFzc2VydChtZXRob2QuaXNJbnN0YW5jZU1lbWJlcik7CiAgICAvLyBUT0RPKHNyYSk6IEV4Y2VwdCBmb3IgbWV0aG9kcyBkZWNsYXJlZCBpbiBtaXhpbnMsIHdlIGNhbiB1c2UgYSBjb21wYWN0CiAgICAvLyBuYW1pbmcgc2NoZW1lIGxpa2Ugd2UgZG8gZm9yIFtDb25zdHJ1Y3RvckJvZHlFbnRpdHldLgogICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24gPSBtZXRob2QuZnVuY3Rpb247CiAgICByZXR1cm4gX2Rpc2FtYmlndWF0ZUludGVybmFsTWVtYmVyKG1ldGhvZCwgKCkgewogICAgICBTdHJpbmcgaW52b2NhdGlvbk5hbWUgPSBvcGVyYXRvck5hbWVUb0lkZW50aWZpZXIoZnVuY3Rpb24ubmFtZSk7CiAgICAgIC8vIFRPRE8oc3JhKTogSWYgdGhlIGdlbmVyYXRvciBpcyBmb3IgYSBjbG9zdXJlJ3MgJ2NhbGwnIG1ldGhvZCwgd2UgZG9uJ3QKICAgICAgLy8gbmVlZCB0byBpbmNvcnBvcmF0ZSB0aGUgZW5jbG9zaW5nIGNsYXNzLgogICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbWV0aG9kLmVuY2xvc2luZ0NsYXNzLm5hbWUucmVwbGFjZUFsbCgnJicsICdfJyk7CiAgICAgIHJldHVybiAnJHtpbnZvY2F0aW9uTmFtZX1cJGJvZHlcJCR7Y2xhc3NOYW1lfSc7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgaW5zdGFuY2VNZXRob2ROYW1lKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXZvaWQgdGhlIHVzZSBvZiBbQ29uc3RydWN0b3JCb2R5RW50aXR5XSBhbmQKICAgIC8vIFtKR2VuZXJhdG9yQm9keV0uIFRoZSBjb2RlZ2VuIG1vZGVsIHNob3VsZCBiZSBleHBsaWNpdCBhYm91dCBpdHMKICAgIC8vIGNvbnN0cnVjdG9yIGJvZHkgZWxlbWVudHMuCiAgICBpZiAobWV0aG9kIGlzIENvbnN0cnVjdG9yQm9keUVudGl0eSkgewogICAgICByZXR1cm4gY29uc3RydWN0b3JCb2R5TmFtZShtZXRob2QpOwogICAgfQogICAgaWYgKG1ldGhvZCBpcyBKR2VuZXJhdG9yQm9keSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yQm9keUluc3RhbmNlTWV0aG9kTmFtZShtZXRob2QpOwogICAgfQogICAgcmV0dXJuIGludm9jYXRpb25OYW1lKG5ldyBTZWxlY3Rvci5mcm9tRWxlbWVudChtZXRob2QpKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBhbm5vdGF0ZWQgbmFtZSBmb3IgYSB2YXJpYW50IG9mIGBjYWxsYC4KICAvLy8gVGhlIHJlc3VsdCBoYXMgdGhlIGZvcm06CiAgLy8vCiAgLy8vICAgICBjYWxsJDxOPiRuYW1lZFBhcmFtMS4uLiRuYW1lZFBhcmFtPE0+CiAgLy8vCiAgLy8vIFRoaXMgbmFtZSBjYW5ub3QgYmUgbWluaWZpZWQgYmVjYXVzZSBpdCBpcyBnZW5lcmF0ZWQgYnkgc3RyaW5nCiAgLy8vIGNvbmNhdGVuYXRpb24gYXQgcnVudGltZSwgYnkgYXBwbHlGdW5jdGlvbiBpbiBqc19oZWxwZXIuZGFydC4KICBqc0FzdC5OYW1lIGRlcml2ZUNhbGxNZXRob2ROYW1lKExpc3Q8U3RyaW5nPiBzdWZmaXgpIHsKICAgIC8vIFRPRE8oYXNnZXJmKTogQXZvaWQgY2xhc2hlcyB3aGVuIG5hbWVkIHBhcmFtZXRlcnMgY29udGFpbiAkIHN5bWJvbHMuCiAgICByZXR1cm4gbmV3IFN0cmluZ0JhY2tlZE5hbWUoCiAgICAgICAgJyR7Zml4ZWROYW1lcy5jYWxsUHJlZml4fVwkJHtzdWZmaXguam9pbihyJyQnKX0nKTsKICB9CgogIC8vLyBUaGUgc3VmZml4IGxpc3QgZm9yIHRoZSBwYXR0ZXJuOgogIC8vLwogIC8vLyAgICAgJDxUPiQ8Tj4kbmFtZWRQYXJhbTEuLi4kbmFtZWRQYXJhbTxNPgogIC8vLwogIC8vLyBXaGVyZSA8VD4gaXMgdGhlIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cywgPE4+IGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbAogIC8vLyBhcmd1bWVudHMgYW5kIDxNPiBpcyB0aGUgbnVtYmVyIG9mIG5hbWVkIGFyZ3VtZW50cy4KICAvLy8KICAvLy8gSWYgdGhlcmUgYXJlIG5vIHR5cGUgYXJndW1lbnRzIHRoZSBgJDxUPmAgaXMgb21pdHRlZC4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIGZvciB0aGUgYW5ub3RhdGVkIG5hbWVzIG9mIGBjYWxsYCwgYW5kIGZvciB0aGUgcHJvcG9zZWQgbmFtZQogIC8vLyBmb3Igb3RoZXIgaW5zdGFuY2UgbWV0aG9kcy4KICBzdGF0aWMgTGlzdDxTdHJpbmc+IGNhbGxTdWZmaXhGb3JTdHJ1Y3R1cmUoQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICBMaXN0PFN0cmluZz4gc3VmZml4ZXMgPSBbXTsKICAgIGlmIChjYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudENvdW50ID4gMCkgewogICAgICBzdWZmaXhlcy5hZGQoJyR7Y2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudH0nKTsKICAgIH0KICAgIHN1ZmZpeGVzLmFkZCgnJHtjYWxsU3RydWN0dXJlLmFyZ3VtZW50Q291bnR9Jyk7CiAgICBzdWZmaXhlcy5hZGRBbGwoY2FsbFN0cnVjdHVyZS5nZXRPcmRlcmVkTmFtZWRBcmd1bWVudHMoKSk7CiAgICByZXR1cm4gc3VmZml4ZXM7CiAgfQoKICAvLy8gVGhlIHN1ZmZpeCBsaXN0IGZvciB0aGUgcGF0dGVybjoKICAvLy8KICAvLy8gICAgICQ8Tj4kbmFtZWRQYXJhbTEuLi4kbmFtZWRQYXJhbTxNPgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgZm9yIHRoZSBhbm5vdGF0ZWQgbmFtZXMgb2YgYGNhbGxgLCBhbmQgZm9yIHRoZSBwcm9wb3NlZCBuYW1lCiAgLy8vIGZvciBvdGhlciBpbnN0YW5jZSBtZXRob2RzLgogIExpc3Q8U3RyaW5nPiBjYWxsU3VmZml4Rm9yU2lnbmF0dXJlKFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUpIHsKICAgIExpc3Q8U3RyaW5nPiBzdWZmaXhlcyA9IFsnJHtwYXJhbWV0ZXJTdHJ1Y3R1cmUudG90YWxQYXJhbWV0ZXJzfSddOwogICAgc3VmZml4ZXMuYWRkQWxsKHBhcmFtZXRlclN0cnVjdHVyZS5uYW1lZFBhcmFtZXRlcnMpOwogICAgcmV0dXJuIHN1ZmZpeGVzOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBpbnZvY2F0aW9uTmFtZShTZWxlY3RvciBzZWxlY3RvcikgewogICAgc3dpdGNoIChzZWxlY3Rvci5raW5kKSB7CiAgICAgIGNhc2UgU2VsZWN0b3JLaW5kLkdFVFRFUjoKICAgICAgICBqc0FzdC5OYW1lIGRpc2FtYmlndWF0ZWROYW1lID0gX2Rpc2FtYmlndWF0ZU1lbWJlcihzZWxlY3Rvci5tZW1iZXJOYW1lKTsKICAgICAgICByZXR1cm4gZGVyaXZlR2V0dGVyTmFtZShkaXNhbWJpZ3VhdGVkTmFtZSk7CgogICAgICBjYXNlIFNlbGVjdG9yS2luZC5TRVRURVI6CiAgICAgICAganNBc3QuTmFtZSBkaXNhbWJpZ3VhdGVkTmFtZSA9IF9kaXNhbWJpZ3VhdGVNZW1iZXIoc2VsZWN0b3IubWVtYmVyTmFtZSk7CiAgICAgICAgcmV0dXJuIGRlcml2ZVNldHRlck5hbWUoZGlzYW1iaWd1YXRlZE5hbWUpOwoKICAgICAgY2FzZSBTZWxlY3RvcktpbmQuT1BFUkFUT1I6CiAgICAgIGNhc2UgU2VsZWN0b3JLaW5kLklOREVYOgogICAgICAgIFN0cmluZyBvcGVyYXRvcklkZW50aWZpZXIgPSBvcGVyYXRvck5hbWVUb0lkZW50aWZpZXIoc2VsZWN0b3IubmFtZSk7CiAgICAgICAganNBc3QuTmFtZSBkaXNhbWJpZ3VhdGVkTmFtZSA9CiAgICAgICAgICAgIF9kaXNhbWJpZ3VhdGVPcGVyYXRvcihvcGVyYXRvcklkZW50aWZpZXIpOwogICAgICAgIHJldHVybiBkaXNhbWJpZ3VhdGVkTmFtZTsgLy8gT3BlcmF0b3JzIGFyZSBub3QgYW5ub3RhdGVkLgoKICAgICAgY2FzZSBTZWxlY3RvcktpbmQuQ0FMTDoKICAgICAgICBMaXN0PFN0cmluZz4gc3VmZml4ID0gY2FsbFN1ZmZpeEZvclN0cnVjdHVyZShzZWxlY3Rvci5jYWxsU3RydWN0dXJlKTsKICAgICAgICBpZiAoc2VsZWN0b3IubmFtZSA9PSBJZGVudGlmaWVycy5jYWxsKSB7CiAgICAgICAgICAvLyBEZXJpdmUgdGhlIGFubm90YXRlZCBuYW1lIGZvciB0aGlzIHZhcmlhbnQgb2YgJ2NhbGwnLgogICAgICAgICAgcmV0dXJuIGRlcml2ZUNhbGxNZXRob2ROYW1lKHN1ZmZpeCk7CiAgICAgICAgfQogICAgICAgIGpzQXN0Lk5hbWUgZGlzYW1iaWd1YXRlZE5hbWUgPQogICAgICAgICAgICBfZGlzYW1iaWd1YXRlTWVtYmVyKHNlbGVjdG9yLm1lbWJlck5hbWUsIHN1ZmZpeCk7CiAgICAgICAgcmV0dXJuIGRpc2FtYmlndWF0ZWROYW1lOyAvLyBNZXRob2RzIG90aGVyIHRoYW4gY2FsbCBhcmUgbm90IGFubm90YXRlZC4KCiAgICAgIGNhc2UgU2VsZWN0b3JLaW5kLlNQRUNJQUw6CiAgICAgICAgcmV0dXJuIHNwZWNpYWxTZWxlY3Rvck5hbWUoc2VsZWN0b3IpOwoKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgICAnVW5leHBlY3RlZCBzZWxlY3RvciBraW5kOiAke3NlbGVjdG9yLmtpbmR9Jyk7CiAgICB9CiAgfQoKICBqc0FzdC5OYW1lIHNwZWNpYWxTZWxlY3Rvck5hbWUoU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgIGFzc2VydChzZWxlY3Rvci5raW5kID09IFNlbGVjdG9yS2luZC5TUEVDSUFMKTsKICAgIGlmIChzZWxlY3Rvci5tZW1iZXJOYW1lID09IE5hbWVzLmdlbmVyaWNJbnN0YW50aWF0aW9uKSB7CiAgICAgIHJldHVybiBuZXcgU3RyaW5nQmFja2VkTmFtZSgnJHtnZW5lcmljSW5zdGFudGlhdGlvblByZWZpeH0nCiAgICAgICAgICAnJHtzZWxlY3Rvci5jYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudENvdW50fScpOwogICAgfQoKICAgIHRocm93IGZhaWxlZEF0KAogICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICdVbmV4cGVjdGVkIHNwZWNpYWwgc2VsZWN0b3I6ICRzZWxlY3RvcicpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGludGVybmFsIG5hbWUgdXNlZCBmb3IgYW4gaW52b2NhdGlvbiBtaXJyb3Igb2YgdGhpcyBzZWxlY3Rvci4KICBqc0FzdC5OYW1lIGludm9jYXRpb25NaXJyb3JJbnRlcm5hbE5hbWUoU2VsZWN0b3Igc2VsZWN0b3IpID0+CiAgICAgIGludm9jYXRpb25OYW1lKHNlbGVjdG9yKTsKCiAgLy8vIFJldHVybnMgdGhlIGRpc2FtYmlndWF0ZWQgbmFtZSBmb3IgdGhlIGdpdmVuIGZpZWxkLCB1c2VkIGZvciBjb25zdHJ1Y3RpbmcKICAvLy8gdGhlIGdldHRlciBhbmQgc2V0dGVyIG5hbWVzLgogIGpzQXN0Lk5hbWUgZmllbGRBY2Nlc3Nvck5hbWUoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlcgogICAgICAgID8gX2Rpc2FtYmlndWF0ZU1lbWJlcihlbGVtZW50Lm1lbWJlck5hbWUpCiAgICAgICAgOiBfZGlzYW1iaWd1YXRlR2xvYmFsTWVtYmVyKGVsZW1lbnQpOwogIH0KCiAgLy8vIFJldHVybnMgbmFtZSBvZiB0aGUgSmF2YVNjcmlwdCBwcm9wZXJ0eSB1c2VkIHRvIHN0b3JlIGEgc3RhdGljIG9yIGluc3RhbmNlCiAgLy8vIGZpZWxkLgogIGpzQXN0Lk5hbWUgZmllbGRQcm9wZXJ0eU5hbWUoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlcgogICAgICAgID8gaW5zdGFuY2VGaWVsZFByb3BlcnR5TmFtZShlbGVtZW50KQogICAgICAgIDogX2Rpc2FtYmlndWF0ZUdsb2JhbE1lbWJlcihlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgZ2xvYmFsUHJvcGVydHlOYW1lRm9yTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSA9PgogICAgICBfZGlzYW1iaWd1YXRlR2xvYmFsTWVtYmVyKGVsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIGdsb2JhbFByb3BlcnR5TmFtZUZvckNsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQpID0+CiAgICAgIF9kaXNhbWJpZ3VhdGVHbG9iYWxUeXBlKGVsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIGdsb2JhbFByb3BlcnR5TmFtZUZvclR5cGUoRW50aXR5IGVsZW1lbnQpID0+CiAgICAgIF9kaXNhbWJpZ3VhdGVHbG9iYWxUeXBlKGVsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIGdsb2JhbE5hbWVGb3JJbnRlcmZhY2VUeXBlVmFyaWFibGUoVHlwZVZhcmlhYmxlRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBfdHlwZVZhcmlhYmxlTmFtZXNbZWxlbWVudF0gPz89CiAgICAgICAgX2dsb2JhbE5hbWVGb3JJbnRlcmZhY2VUeXBlVmFyaWFibGUoZWxlbWVudCk7CiAgfQoKICBqc0FzdC5OYW1lIF9nbG9iYWxOYW1lRm9ySW50ZXJmYWNlVHlwZVZhcmlhYmxlKFR5cGVWYXJpYWJsZUVudGl0eSBlbGVtZW50KSB7CiAgICAvLyBDb25zdHJ1Y3QgYSBuYW1lIGZyb20gdGhlIGNsYXNzIG5hbWUgYW5kIHR5cGUgdmFyaWFibGUsCiAgICAvLyBlLmcuICJMaXN0TWl4aW4uRSIuIFRoZSBjbGFzcyBuYW1lIGlzIHVuaXF1ZSB3aGljaCBlbnN1cmVzIHRoZSB0eXBlCiAgICAvLyB2YXJpYWJsZSBuYW1lIGlzIHVuaXF1ZS4KICAgIC8vCiAgICAvLyBUT0RPKHNyYSk6IEJldHRlciBtaW5pZmllZCBuYW1pbmcuIFR5cGUgdmFyaWFibGUgbmFtZXMgYXJlIHVzZWQgaW4gdHlwZQogICAgLy8gcmVjaXBlcyBhbmQgbXVzdCBjb250YWluIGEgcGVyaW9kICgnLicpLiBUaGV5IGNhbiBiZSBmcmVxdWVuY3ktYXNzaWduZWQKICAgIC8vIGluZGVwZW5kZW50bHkgb2YgdGhlIGNsYXNzIG5hbWUsIGUuZy4gJy5hJywgJy4yJywgJ2EuJywgZXRjLgogICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50Lm5hbWU7CiAgICBpZiAobmFtZS5sZW5ndGggPiAxKSBuYW1lID0gJyR7ZWxlbWVudC5pbmRleH0nOyAvLyBBdm9pZCBsb25nIG5hbWVzIChyYXJlKS4KICAgIHJldHVybiBDb21wb3VuZE5hbWUoWwogICAgICBnbG9iYWxQcm9wZXJ0eU5hbWVGb3JDbGFzcyhlbGVtZW50LnR5cGVEZWNsYXJhdGlvbiksCiAgICAgIFN0cmluZ0JhY2tlZE5hbWUoJy4kbmFtZScpCiAgICBdKTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgaW5zdGFuY2VGaWVsZFByb3BlcnR5TmFtZShGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICBDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzcyA9IGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3M7CgogICAgaWYgKF9uYXRpdmVEYXRhLmhhc0ZpeGVkQmFja2VuZE5hbWUoZWxlbWVudCkpIHsKICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCYWNrZWROYW1lKF9uYXRpdmVEYXRhLmdldEZpeGVkQmFja2VuZE5hbWUoZWxlbWVudCkpOwogICAgfQoKICAgIC8vIFNvbWUgZWxlbWVudHMsIGxpa2UgZS5nLiBpbnN0YW5jZXMgb2YgQm94RmllbGRFbGVtZW50IGFyZSBzcGVjaWFsLgogICAgLy8gVGhleSBhcmUgY3JlYXRlZCB3aXRoIGEgdW5pcXVlIGFuZCBzYWZlIG5hbWUgZm9yIHRoZSBlbGVtZW50IG1vZGVsLgogICAgLy8gV2hpbGUgdGhlaXIgbmFtZSBpcyB1bmlxdWUsIGl0IGlzIG5vdCB2ZXJ5IHJlYWRhYmxlLiBTbyB3ZSB0cnkgdG8KICAgIC8vIHByZXNlcnZlIHRoZSBvcmlnaW5hbCwgcHJvcG9zZWQgbmFtZS4KICAgIC8vIEhvd2V2ZXIsIGFzIGJveGVzIGFyZSBub3QgcmVhbGx5IGluc3RhbmNlcyBvZiBjbGFzc2VzLCB0aGUgdXN1YWwgbmFtaW5nCiAgICAvLyBzY2hlbWUgdGhhdCB0cmllcyB0byBhdm9pZCBuYW1lIGNsYXNoZXMgd2l0aCBzdXBlciBjbGFzc2VzIGRvZXMgbm90CiAgICAvLyBhcHBseS4gU28gd2UgY2FuIGRpcmVjdGx5IGdyYWIgYSBuYW1lLgogICAgaWYgKGVsZW1lbnQgaXMgSlNFbnRpdHkpIHsKICAgICAgcmV0dXJuIF9kaXNhbWJpZ3VhdGVJbnRlcm5hbE1lbWJlcigKICAgICAgICAgIGVsZW1lbnQsICgpID0+IChlbGVtZW50IGFzIEpTRW50aXR5KS5kZWNsYXJlZE5hbWUpOwogICAgfQoKICAgIC8vIElmIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBtaWdodCBjbGFzaCB3aXRoIGFub3RoZXIgZmllbGQsCiAgICAvLyB1c2UgYSBtYW5nbGVkIGZpZWxkIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGNsYXNoZXMuCiAgICAvLyBOb3RlIHRoYXQgaWYgdGhlIGNsYXNzIGV4dGVuZHMgYSBuYXRpdmUgY2xhc3MsIHRoYXQgbmF0aXZlIGNsYXNzIG1pZ2h0CiAgICAvLyBoYXZlIGZpZWxkcyB3aXRoIGZpeGVkIGJhY2tlbmQgbmFtZXMsIHNvIHdlIGFzc3VtZSB0aGUgd29yc3QgYW5kIGFsd2F5cwogICAgLy8gbWFuZ2xlIHRoZSBmaWVsZCBuYW1lcyBvZiBjbGFzc2VzIGV4dGVuZGluZyBuYXRpdmUgY2xhc3Nlcy4KICAgIC8vIE1ldGhvZHMgb24gc3VjaCBjbGFzc2VzIGFyZSBzdG9yZWQgb24gdGhlIGludGVyY2VwdG9yLCBub3QgdGhlIGluc3RhbmNlLAogICAgLy8gc28gb25seSBmaWVsZHMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIGNsYXNoIHdpdGggYSBuYXRpdmUgcHJvcGVydHkgbmFtZS4KICAgIGlmIChfY2xvc2VkV29ybGQuaXNVc2VkQXNNaXhpbihlbmNsb3NpbmdDbGFzcykgfHwKICAgICAgICBfaXNTaGFkb3dpbmdTdXBlckZpZWxkKGVsZW1lbnQpIHx8CiAgICAgICAgX2lzVXNlckNsYXNzRXh0ZW5kaW5nTmF0aXZlKGVuY2xvc2luZ0NsYXNzKSkgewogICAgICBTdHJpbmcgcHJvcG9zZU5hbWUoKSA9PiAnJHtlbmNsb3NpbmdDbGFzcy5uYW1lfV8ke2VsZW1lbnQubmFtZX0nOwogICAgICByZXR1cm4gX2Rpc2FtYmlndWF0ZUludGVybmFsTWVtYmVyKGVsZW1lbnQsIHByb3Bvc2VOYW1lKTsKICAgIH0KCiAgICAvLyBObyBzdXBlcmNsYXNzIHVzZXMgdGhlIGRpc2FtYmlndWF0ZWQgbmFtZSBhcyBhIHByb3BlcnR5IG5hbWUsIHNvIHdlIGNhbgogICAgLy8gdXNlIGl0IGZvciB0aGlzIGZpZWxkLiBUaGlzIGdlbmVyYXRlcyBuaWNlciBmaWVsZCBuYW1lcyBzaW5jZSBvdGhlcndpc2UKICAgIC8vIHRoZSBmaWVsZCBuYW1lIHdvdWxkIGhhdmUgdG8gYmUgbWFuZ2xlZC4KICAgIHJldHVybiBfZGlzYW1iaWd1YXRlTWVtYmVyKG5ldyBOYW1lKGVsZW1lbnQubmFtZSwgZWxlbWVudC5saWJyYXJ5KSk7CiAgfQoKICBib29sIF9pc1NoYWRvd2luZ1N1cGVyRmllbGQoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KGVsZW1lbnQuaXNGaWVsZCk7CiAgICBTdHJpbmcgZmllbGROYW1lID0gZWxlbWVudC5uYW1lOwogICAgYm9vbCBpc1ByaXZhdGUgPSBOYW1lLmlzUHJpdmF0ZU5hbWUoZmllbGROYW1lKTsKICAgIExpYnJhcnlFbnRpdHkgbWVtYmVyTGlicmFyeSA9IGVsZW1lbnQubGlicmFyeTsKICAgIENsYXNzRW50aXR5IGxvb2t1cENsYXNzID0KICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoZWxlbWVudC5lbmNsb3NpbmdDbGFzcyk7CiAgICB3aGlsZSAobG9va3VwQ2xhc3MgIT0gbnVsbCkgewogICAgICBNZW1iZXJFbnRpdHkgZm91bmRNZW1iZXIgPQogICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5sb29rdXBMb2NhbENsYXNzTWVtYmVyKGxvb2t1cENsYXNzLCBmaWVsZE5hbWUpOwogICAgICBpZiAoZm91bmRNZW1iZXIgIT0gbnVsbCkgewogICAgICAgIGlmIChmb3VuZE1lbWJlci5pc0ZpZWxkKSB7CiAgICAgICAgICBpZiAoIWlzUHJpdmF0ZSB8fCBtZW1iZXJMaWJyYXJ5ID09IGZvdW5kTWVtYmVyLmxpYnJhcnkpIHsKICAgICAgICAgICAgLy8gUHJpdmF0ZSBmaWVsZHMgY2FuIG9ubHkgYmUgc2hhZG93ZWQgYnkgYSBmaWVsZCBkZWNsYXJlZCBpbiB0aGUKICAgICAgICAgICAgLy8gc2FtZSBsaWJyYXJ5LgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgbG9va3VwQ2xhc3MgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MobG9va3VwQ2xhc3MpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIFRydWUgaWYgW2NsYXNzX10gaXMgYSBub24tbmF0aXZlIGNsYXNzIHRoYXQgaW5oZXJpdHMgZnJvbSBhIG5hdGl2ZSBjbGFzcy4KICBib29sIF9pc1VzZXJDbGFzc0V4dGVuZGluZ05hdGl2ZShDbGFzc0VudGl0eSBjbGFzc18pIHsKICAgIHJldHVybiAhX25hdGl2ZURhdGEuaXNOYXRpdmVDbGFzcyhjbGFzc18pICYmCiAgICAgICAgX25hdGl2ZURhdGEuaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoY2xhc3NfKTsKICB9CgogIC8vLyBBbm5vdGF0ZWQgbmFtZSBmb3IgdGhlIHNldHRlciBvZiBbZWxlbWVudF0uCiAganNBc3QuTmFtZSBzZXR0ZXJGb3JNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIC8vIFdlIGR5bmFtaWNhbGx5IGNyZWF0ZSBzZXR0ZXJzIGZyb20gdGhlIGZpZWxkLW5hbWUuIFRoZSBzZXR0ZXIgbmFtZSBtdXN0CiAgICAvLyB0aGVyZWZvcmUgYmUgZGVyaXZlZCBmcm9tIHRoZSBpbnN0YW5jZSBmaWVsZC1uYW1lLgogICAganNBc3QuTmFtZSBuYW1lID0gX2Rpc2FtYmlndWF0ZU1lbWJlcihlbGVtZW50Lm1lbWJlck5hbWUpOwogICAgcmV0dXJuIGRlcml2ZVNldHRlck5hbWUobmFtZSk7CiAgfQoKICAvLy8gQW5ub3RhdGVkIG5hbWUgZm9yIHRoZSBzZXR0ZXIgb2YgYW55IG1lbWJlciB3aXRoIFtkaXNhbWJpZ3VhdGVkTmFtZV0uCiAganNBc3QuTmFtZSBkZXJpdmVTZXR0ZXJOYW1lKGpzQXN0Lk5hbWUgZGlzYW1iaWd1YXRlZE5hbWUpIHsKICAgIC8vIFdlIGR5bmFtaWNhbGx5IGNyZWF0ZSBzZXR0ZXJzIGZyb20gdGhlIGZpZWxkLW5hbWUuIFRoZSBzZXR0ZXIgbmFtZSBtdXN0CiAgICAvLyB0aGVyZWZvcmUgYmUgZGVyaXZlZCBmcm9tIHRoZSBpbnN0YW5jZSBmaWVsZC1uYW1lLgogICAgcmV0dXJuIHVzZXJTZXR0ZXJzW2Rpc2FtYmlndWF0ZWROYW1lXSA/Pz0KICAgICAgICBuZXcgU2V0dGVyTmFtZShfbGl0ZXJhbFNldHRlclByZWZpeCwgZGlzYW1iaWd1YXRlZE5hbWUpOwogIH0KCiAgLy8vIEFubm90YXRlZCBuYW1lIGZvciB0aGUgc2V0dGVyIG9mIGFueSBtZW1iZXIgd2l0aCBbZGlzYW1iaWd1YXRlZE5hbWVdLgogIGpzQXN0Lk5hbWUgZGVyaXZlR2V0dGVyTmFtZShqc0FzdC5OYW1lIGRpc2FtYmlndWF0ZWROYW1lKSB7CiAgICAvLyBXZSBkeW5hbWljYWxseSBjcmVhdGUgZ2V0dGVycyBmcm9tIHRoZSBmaWVsZC1uYW1lLiBUaGUgZ2V0dGVyIG5hbWUgbXVzdAogICAgLy8gdGhlcmVmb3JlIGJlIGRlcml2ZWQgZnJvbSB0aGUgaW5zdGFuY2UgZmllbGQtbmFtZS4KICAgIHJldHVybiB1c2VyR2V0dGVyc1tkaXNhbWJpZ3VhdGVkTmFtZV0gPz89CiAgICAgICAgbmV3IEdldHRlck5hbWUoX2xpdGVyYWxHZXR0ZXJQcmVmaXgsIGRpc2FtYmlndWF0ZWROYW1lKTsKICB9CgogIC8vLyBBbm5vdGF0ZWQgbmFtZSBmb3IgdGhlIGdldHRlciBvZiBbZWxlbWVudF0uCiAganNBc3QuTmFtZSBnZXR0ZXJGb3JFbGVtZW50KE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICAvLyBXZSBkeW5hbWljYWxseSBjcmVhdGUgZ2V0dGVycyBmcm9tIHRoZSBmaWVsZC1uYW1lLiBUaGUgZ2V0dGVyIG5hbWUgbXVzdAogICAgLy8gdGhlcmVmb3JlIGJlIGRlcml2ZWQgZnJvbSB0aGUgaW5zdGFuY2UgZmllbGQtbmFtZS4KICAgIGpzQXN0Lk5hbWUgbmFtZSA9IF9kaXNhbWJpZ3VhdGVNZW1iZXIoZWxlbWVudC5tZW1iZXJOYW1lKTsKICAgIHJldHVybiBkZXJpdmVHZXR0ZXJOYW1lKG5hbWUpOwogIH0KCiAgLy8vIFByb3BlcnR5IG5hbWUgZm9yIHRoZSBnZXR0ZXIgb2YgYW4gaW5zdGFuY2UgbWVtYmVyIHdpdGggW29yaWdpbmFsTmFtZV0uCiAganNBc3QuTmFtZSBnZXR0ZXJGb3JNZW1iZXIoTmFtZSBvcmlnaW5hbE5hbWUpIHsKICAgIGpzQXN0Lk5hbWUgZGlzYW1iaWd1YXRlZE5hbWUgPSBfZGlzYW1iaWd1YXRlTWVtYmVyKG9yaWdpbmFsTmFtZSk7CiAgICByZXR1cm4gZGVyaXZlR2V0dGVyTmFtZShkaXNhbWJpZ3VhdGVkTmFtZSk7CiAgfQoKICAvLy8gRGlzYW1iaWd1YXRlZCBuYW1lIGZvciBhIGNvbXBpbGVyLW93bmVkIGdsb2JhbCB2YXJpYWJsZS4KICAvLy8KICAvLy8gVGhlIHJlc3VsdGluZyBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGdsb2JhbC1tZW1iZXIgbmFtZXNwYWNlLgogIGpzQXN0Lk5hbWUgX2Rpc2FtYmlndWF0ZUludGVybmFsR2xvYmFsKFN0cmluZyBuYW1lKSB7CiAgICBqc0FzdC5OYW1lIG5ld05hbWUgPSBpbnRlcm5hbEdsb2JhbHNbbmFtZV07CiAgICBpZiAobmV3TmFtZSA9PSBudWxsKSB7CiAgICAgIG5ld05hbWUgPSBnZXRGcmVzaE5hbWUoZ2xvYmFsU2NvcGUsIG5hbWUpOwogICAgICBpbnRlcm5hbEdsb2JhbHNbbmFtZV0gPSBuZXdOYW1lOwogICAgfQogICAgcmV0dXJuIF9uZXdSZWZlcmVuY2UobmV3TmFtZSk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZSB0byB1c2UgZm9yIGEgY29tcGlsZXItb3duZXIgZ2xvYmFsIHZhcmlhYmxlLAogIC8vLyBpLmUuIG9uZSB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW55IGVsZW1lbnQgYnV0IGlzIHVzZWQgYXMgYSB1dGlsaXR5CiAgLy8vIGdsb2JhbCBieSBjb2RlIGdlbmVyYXRpb24uCiAgLy8vCiAgLy8vIFtuYW1lXSBmdW5jdGlvbnMgYXMgYm90aCB0aGUgcHJvcG9zZWQgbmFtZSBmb3IgdGhlIGdsb2JhbCwgYW5kIGFzIGEga2V5CiAgLy8vIGlkZW50aWZ5aW5nIHRoZSBnbG9iYWwuIFRoZSBbbmFtZV0gbXVzdCBub3QgY29udGFpbiBgJGAgc3ltYm9scywgc2luY2UKICAvLy8gdGhlIFtOYW1lcl0gdXNlcyB0aG9zZSBuYW1lcyBpbnRlcm5hbGx5LgogIC8vLwogIC8vLyBUaGlzIHByb3ZpZGVzIGFuIGVhc3kgbWVjaGFuaXNtIG9mIGF2b2lkaW5nIGEgbmFtZS1jbGFzaCB3aXRoIHVzZXItc3BhY2UKICAvLy8gZ2xvYmFscywgYWx0aG91Z2ggdGhlIGNhbGxlcnMgb2YgbXVzdCBzdGlsbCB0YWtlIGNhcmUgbm90IHRvIGFjY2lkZW50YWxseQogIC8vLyBwYXNzIGluIHRoZSBzYW1lIFtuYW1lXSBmb3IgdHdvIGRpZmZlcmVudCBpbnRlcm5hbCBnbG9iYWxzLgogIGpzQXN0Lk5hbWUgaW50ZXJuYWxHbG9iYWwoU3RyaW5nIG5hbWUpIHsKICAgIGFzc2VydCghbmFtZS5jb250YWlucyhyJyQnKSk7CiAgICByZXR1cm4gX2Rpc2FtYmlndWF0ZUludGVybmFsR2xvYmFsKG5hbWUpOwogIH0KCiAgLy8vIEdlbmVyYXRlcyBhIHVuaXF1ZSBrZXkgZm9yIFtsaWJyYXJ5XS4KICAvLy8KICAvLy8gS2V5cyBhcmUgbWVhbnQgdG8gYmUgdXNlZCBpbiBtYXBzIGFuZCBzaG91bGQgbm90IGJlIHZpc2libGUgaW4gdGhlIG91dHB1dC4KICBTdHJpbmcgX2dlbmVyYXRlTGlicmFyeUtleShMaWJyYXJ5RW50aXR5IGxpYnJhcnkpIHsKICAgIHJldHVybiBfbGlicmFyeUtleXMucHV0SWZBYnNlbnQobGlicmFyeSwgKCkgewogICAgICBTdHJpbmcga2V5QmFzZSA9IGxpYnJhcnkubmFtZTsKICAgICAgaW50IGNvdW50ZXIgPSAwOwogICAgICBTdHJpbmcga2V5ID0ga2V5QmFzZTsKICAgICAgd2hpbGUgKF9saWJyYXJ5S2V5cy52YWx1ZXMuY29udGFpbnMoa2V5KSkgewogICAgICAgIGtleSA9ICIka2V5QmFzZSR7Y291bnRlcisrfSI7CiAgICAgIH0KICAgICAgcmV0dXJuIGtleTsKICAgIH0pOwogIH0KCiAganNBc3QuTmFtZSBfZGlzYW1iaWd1YXRlR2xvYmFsTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gX2Rpc2FtYmlndWF0ZUdsb2JhbDxNZW1iZXJFbnRpdHk+KAogICAgICAgIGVsZW1lbnQsIF9wcm9wb3NlTmFtZUZvck1lbWJlciwgdXNlckdsb2JhbHMpOwogIH0KCiAganNBc3QuTmFtZSBfZGlzYW1iaWd1YXRlR2xvYmFsVHlwZShFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIF9kaXNhbWJpZ3VhdGVHbG9iYWwoZWxlbWVudCwgX3Byb3Bvc2VOYW1lRm9yVHlwZSwgdXNlckdsb2JhbHMpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGRpc2FtYmlndWF0ZWQgbmFtZSBmb3IgYSB0b3AtbGV2ZWwgb3Igc3RhdGljIGVsZW1lbnQuCiAgLy8vCiAgLy8vIFRoZSByZXN1bHRpbmcgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSBnbG9iYWwtbWVtYmVyIG5hbWVzcGFjZS4KICBqc0FzdC5OYW1lIF9kaXNhbWJpZ3VhdGVHbG9iYWw8VCBleHRlbmRzIEVudGl0eT4oVCBlbGVtZW50LAogICAgICBTdHJpbmcgcHJvcG9zZU5hbWUoVCBlbGVtZW50KSwgTWFwPEVudGl0eSwganNBc3QuTmFtZT4gZ2xvYmFscykgewogICAgLy8gVE9ETyhhc2dlcmYpOiBXZSBjYW4gcmV1c2UgbW9yZSBzaG9ydCBuYW1lcyBpZiB3ZSBkaXNhbWJpZ3VhdGUgd2l0aAogICAgLy8gYSBzZXBhcmF0ZSBuYW1lc3BhY2UgZm9yIGVhY2ggb2YgdGhlIGdsb2JhbCBob2xkZXIgb2JqZWN0cy4KICAgIGpzQXN0Lk5hbWUgbmV3TmFtZSA9IGdsb2JhbHNbZWxlbWVudF07CiAgICBpZiAobmV3TmFtZSA9PSBudWxsKSB7CiAgICAgIFN0cmluZyBwcm9wb3NlZE5hbWUgPSBwcm9wb3NlTmFtZShlbGVtZW50KTsKICAgICAgbmV3TmFtZSA9IGdldEZyZXNoTmFtZShnbG9iYWxTY29wZSwgcHJvcG9zZWROYW1lKTsKICAgICAgZ2xvYmFsc1tlbGVtZW50XSA9IG5ld05hbWU7CiAgICB9CiAgICByZXR1cm4gX25ld1JlZmVyZW5jZShuZXdOYW1lKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBkaXNhbWJpZ3VhdGVkIG5hbWUgZm9yIGFuIGluc3RhbmNlIG1ldGhvZCBvciBmaWVsZAogIC8vLyB3aXRoIFtvcmlnaW5hbE5hbWVdIGluIFtsaWJyYXJ5XS4KICAvLy8KICAvLy8gW2xpYnJhcnldIG1heSBiZSBgbnVsbGAgaWYgW29yaWdpbmFsTmFtZV0gaXMga25vd24gdG8gYmUgcHVibGljLgogIC8vLwogIC8vLyBUaGlzIGlzIHRoZSBuYW1lIHVzZWQgZm9yIGRlcml2aW5nIHByb3BlcnR5IG5hbWVzIG9mIGFjY2Vzc29ycyAoZ2V0dGVycwogIC8vLyBhbmQgc2V0dGVycykgYW5kIGFzIHByb3BlcnR5IG5hbWUgZm9yIHN0b3JpbmcgbWV0aG9kcyBhbmQgbWV0aG9kIHN0dWJzLgogIC8vLwogIC8vLyBbc3VmZml4ZXNdIGRlbm90ZSBhbiBleHRlbnNpb24gb2YgW29yaWdpbmFsTmFtZV0gdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbQogIC8vLyBvdGhlciBtZW1iZXJzIHdpdGggdGhhdCBuYW1lLiBUaGVzZSBhcmUgdXNlZCB0byBlbmNvZGUgdGhlIGFyaXR5IGFuZAogIC8vLyBuYW1lZCBwYXJhbWV0ZXJzIHRvIGEgbWV0aG9kLiBEaXNhbWJpZ3VhdGluZyB0aGUgc2FtZSBbb3JpZ2luYWxOYW1lXSB3aXRoCiAgLy8vIGRpZmZlcmVudCBbc3VmZml4ZXNdIHdpbGwgeWllbGQgZGlmZmVyZW50IGRpc2FtYmlndWF0ZWQgbmFtZXMuCiAgLy8vCiAgLy8vIFRoZSByZXN1bHRpbmcgbmFtZSwgYW5kIGl0cyBhc3NvY2lhdGVkIGFubm90YXRlZCBuYW1lcywgYXJlIHVuaXF1ZQogIC8vLyB0byB0aGUgKFtvcmlnaW5hbE5hbWVdLCBbc3VmZml4ZXNdKSBwYWlyIHdpdGhpbiB0aGUgaW5zdGFuY2UtbWVtYmVyCiAgLy8vIG5hbWVzcGFjZS4KICBqc0FzdC5OYW1lIF9kaXNhbWJpZ3VhdGVNZW1iZXIoTmFtZSBvcmlnaW5hbE5hbWUsCiAgICAgIFtMaXN0PFN0cmluZz4gc3VmZml4ZXMgPSBjb25zdCBbXV0pIHsKICAgIC8vIEJ1aWxkIGEgc3RyaW5nIGVuY29kaW5nIHRoZSBsaWJyYXJ5IG5hbWUsIGlmIHRoZSBuYW1lIGlzIHByaXZhdGUuCiAgICBTdHJpbmcgbGlicmFyeUtleSA9CiAgICAgICAgb3JpZ2luYWxOYW1lLmlzUHJpdmF0ZSA/IF9nZW5lcmF0ZUxpYnJhcnlLZXkob3JpZ2luYWxOYW1lLmxpYnJhcnkpIDogJyc7CgogICAgLy8gSW4gdGhlIHVuaXF1ZSBrZXksIHNlcGFyYXRlIHRoZSBuYW1lIHBhcnRzIGJ5ICdAJy4KICAgIC8vIFRoaXMgYXZvaWRzIGNsYXNoZXMgc2luY2UgdGhlIG9yaWdpbmFsIG5hbWVzIGNhbm5vdCBjb250YWluIHRoYXQgc3ltYm9sLgogICAgU3RyaW5nIGtleSA9ICckbGlicmFyeUtleUAke29yaWdpbmFsTmFtZS50ZXh0fUAke3N1ZmZpeGVzLmpvaW4oJ0AnKX0nOwogICAganNBc3QuTmFtZSBuZXdOYW1lID0gdXNlckluc3RhbmNlTWVtYmVyc1trZXldOwogICAgaWYgKG5ld05hbWUgPT0gbnVsbCkgewogICAgICBTdHJpbmcgcHJvcG9zZWROYW1lID0gcHJpdmF0ZU5hbWUob3JpZ2luYWxOYW1lKTsKICAgICAgaWYgKCFzdWZmaXhlcy5pc0VtcHR5KSB7CiAgICAgICAgLy8gSW4gdGhlIHByb3Bvc2VkIG5hbWUsIHNlcGFyYXRlIHRoZSBuYW1lIHBhcnRzIGJ5ICckJywgYmVjYXVzZSB0aGUKICAgICAgICAvLyBwcm9wb3NlZCBuYW1lIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyLCBidXQgbm90IG5lY2Vzc2FyaWx5IHVuaXF1ZS4KICAgICAgICBwcm9wb3NlZE5hbWUgKz0gcickJyArIHN1ZmZpeGVzLmpvaW4ocickJyk7CiAgICAgIH0KICAgICAgbmV3TmFtZSA9IGdldEZyZXNoTmFtZShpbnN0YW5jZVNjb3BlLCBwcm9wb3NlZE5hbWUsCiAgICAgICAgICBzYW5pdGl6ZUZvckFubm90YXRpb25zOiB0cnVlKTsKICAgICAgdXNlckluc3RhbmNlTWVtYmVyc1trZXldID0gbmV3TmFtZTsKICAgICAgdXNlckluc3RhbmNlTWVtYmVyc09yaWdpbmFsTmFtZVtrZXldID0gJyRvcmlnaW5hbE5hbWUnOwogICAgfQogICAgcmV0dXJuIF9uZXdSZWZlcmVuY2UobmV3TmFtZSk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgZGlzYW1iaWd1YXRlZCBuYW1lIGZvciB0aGUgaW5zdGFuY2UgbWVtYmVyIGlkZW50aWZpZWQgYnkKICAvLy8gW2tleV0uCiAgLy8vCiAgLy8vIFdoZW4gYSBuYW1lIGZvciBhbiBlbGVtZW50IGlzIHJlcXVlc3RlZCBieSBrZXksIGl0IG1heSBub3QgYmUgcmVxdWVzdGVkCiAgLy8vIGJ5IGVsZW1lbnQgYXQgdGhlIHNhbWUgdGltZSwgYXMgdHdvIGRpZmZlcmVudCBuYW1lcyB3b3VsZCBiZSByZXR1cm5lZC4KICAvLy8KICAvLy8gSWYga2V5IGhhcyBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCwgW3Byb3Bvc2VOYW1lXSBpcyB1c2VkIHRvIGdlbmVyYXRlCiAgLy8vIGEgbmFtZSBwcm9wb3NhbCBmb3IgdGhlIGdpdmVuIGtleS4KICAvLy8KICAvLy8gW2tleV0gbXVzdCBub3QgY2xhc2ggd2l0aCB2YWxpZCBpbnN0YW5jZSBuYW1lcy4gVGhpcyBpcyB0eXBpY2FsbHkKICAvLy8gYWNoaWV2ZWQgYnkgdXNpbmcgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBba2V5XSB0aGF0IGlzIG5vdCB2YWxpZCBpbgogIC8vLyBpZGVudGlmaWVycywgZm9yIGV4YW1wbGUgdGhlIEAgc3ltYm9sLgogIGpzQXN0Lk5hbWUgX2Rpc2FtYmlndWF0ZU1lbWJlckJ5S2V5KFN0cmluZyBrZXksIFN0cmluZyBwcm9wb3NlTmFtZSgpKSB7CiAgICBqc0FzdC5OYW1lIG5ld05hbWUgPSB1c2VySW5zdGFuY2VNZW1iZXJzW2tleV07CiAgICBpZiAobmV3TmFtZSA9PSBudWxsKSB7CiAgICAgIFN0cmluZyBuYW1lID0gcHJvcG9zZU5hbWUoKTsKICAgICAgbmV3TmFtZSA9IGdldEZyZXNoTmFtZShpbnN0YW5jZVNjb3BlLCBuYW1lLCBzYW5pdGl6ZUZvckFubm90YXRpb25zOiB0cnVlKTsKICAgICAgdXNlckluc3RhbmNlTWVtYmVyc1trZXldID0gbmV3TmFtZTsKICAgICAgLy8gVE9ETyhzaWdtdW5kKTogY29uc2lkZXIgcGx1bWJpbmcgdGhlIG9yaWdpbmFsIG5hbWUgaW5zdGVhZC4KICAgICAgdXNlckluc3RhbmNlTWVtYmVyc09yaWdpbmFsTmFtZVtrZXldID0gbmFtZTsKICAgIH0KICAgIHJldHVybiBfbmV3UmVmZXJlbmNlKG5ld05hbWUpOwogIH0KCiAgLy8vIEZvcmNlcyB0aGUgcHVibGljIGluc3RhbmNlIG1lbWJlciB3aXRoIFtvcmlnaW5hbE5hbWVdIHRvIGhhdmUgdGhlIGdpdmVuCiAgLy8vIFtkaXNhbWJpZ3VhdGVkTmFtZV0uCiAgLy8vCiAgLy8vIFRoZSBbb3JpZ2luYWxOYW1lXSBtdXN0IG5vdCBoYXZlIGJlZW4gZGlzYW1iaWd1YXRlZCBiZWZvcmUsIGFuZCB0aGUKICAvLy8gW2Rpc2FtYmlndWF0ZWROYW1lXSBtdXN0IG5vdCBoYXZlIGJlZW4gdXNlZC4KICAvLy8KICAvLy8gVXNpbmcgW19kaXNhbWJpZ3VhdGVNZW1iZXJdIHdpdGggdGhlIGdpdmVuIFtvcmlnaW5hbE5hbWVdIGFuZCBubyBzdWZmaXhlcwogIC8vLyB3aWxsIHN1YnNlcXVlbnRseSByZXR1cm4gW2Rpc2FtYmlndWF0ZWROYW1lXS4KICB2b2lkIHJlc2VydmVQdWJsaWNNZW1iZXJOYW1lKFN0cmluZyBvcmlnaW5hbE5hbWUsIFN0cmluZyBkaXNhbWJpZ3VhdGVkTmFtZSkgewogICAgLy8gQnVpbGQgYSBrZXkgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgb25lIGJ1aWx0IGluIGRpc2FtYmlndWF0ZU1lbWJlci4KICAgIFN0cmluZyBsaWJyYXJ5UHJlZml4ID0gJyc7IC8vIFB1YmxpYyBuYW1lcyBoYXZlIGFuIGVtcHR5IGxpYnJhcnkgcHJlZml4LgogICAgU3RyaW5nIHN1ZmZpeCA9ICcnOyAvLyBXZSBkb24ndCBuZWVkIGFueSBzdWZmaXhlcy4KICAgIFN0cmluZyBrZXkgPSAnJGxpYnJhcnlQcmVmaXhAJG9yaWdpbmFsTmFtZUAkc3VmZml4JzsKICAgIGFzc2VydCghdXNlckluc3RhbmNlTWVtYmVycy5jb250YWluc0tleShrZXkpKTsKICAgIGFzc2VydCghaW5zdGFuY2VTY29wZS5pc1VzZWQoZGlzYW1iaWd1YXRlZE5hbWUpKTsKICAgIHVzZXJJbnN0YW5jZU1lbWJlcnNba2V5XSA9IG5ldyBTdHJpbmdCYWNrZWROYW1lKGRpc2FtYmlndWF0ZWROYW1lKTsKICAgIHVzZXJJbnN0YW5jZU1lbWJlcnNPcmlnaW5hbE5hbWVba2V5XSA9IG9yaWdpbmFsTmFtZTsKICAgIGluc3RhbmNlU2NvcGUucmVnaXN0ZXJVc2UoZGlzYW1iaWd1YXRlZE5hbWUpOwogIH0KCiAgLy8vIERpc2FtYmlndWF0ZWQgbmFtZSB1bmlxdWUgdG8gW2VsZW1lbnRdLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgYXMgdGhlIHByb3BlcnR5IG5hbWUgZm9yIGZpZWxkcywgdHlwZSB2YXJpYWJsZXMsCiAgLy8vIGNvbnN0cnVjdG9yIGJvZGllcywgYW5kIHN1cGVyLWFjY2Vzc29ycy4KICAvLy8KICAvLy8gVGhlIHJlc3VsdGluZyBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGluc3RhbmNlLW1lbWJlciBuYW1lc3BhY2UuCiAganNBc3QuTmFtZSBfZGlzYW1iaWd1YXRlSW50ZXJuYWxNZW1iZXIoCiAgICAgIE1lbWJlckVudGl0eSBlbGVtZW50LCBTdHJpbmcgcHJvcG9zZU5hbWUoKSkgewogICAganNBc3QuTmFtZSBuZXdOYW1lID0gaW50ZXJuYWxJbnN0YW5jZU1lbWJlcnNbZWxlbWVudF07CiAgICBpZiAobmV3TmFtZSA9PSBudWxsKSB7CiAgICAgIFN0cmluZyBuYW1lID0gcHJvcG9zZU5hbWUoKTsKCiAgICAgIGlmIChlbGVtZW50IGlzIFByaXZhdGVseU5hbWVkSlNFbnRpdHkpIHsKICAgICAgICBOYW1pbmdTY29wZSBzY29wZSA9IF9nZXRQcml2YXRlU2NvcGVGb3IoZWxlbWVudCk7CiAgICAgICAgbmV3TmFtZSA9IGdldEZyZXNoTmFtZShzY29wZSwgbmFtZSwKICAgICAgICAgICAgc2FuaXRpemVGb3JBbm5vdGF0aW9uczogdHJ1ZSwgc2FuaXRpemVGb3JOYXRpdmVzOiBmYWxzZSk7CiAgICAgICAgaW50ZXJuYWxJbnN0YW5jZU1lbWJlcnNbZWxlbWVudF0gPSBuZXdOYW1lOwogICAgICB9IGVsc2UgewogICAgICAgIGJvb2wgbWF5Q2xhc2hOYXRpdmUgPQogICAgICAgICAgICBfaXNVc2VyQ2xhc3NFeHRlbmRpbmdOYXRpdmUoZWxlbWVudC5lbmNsb3NpbmdDbGFzcyk7CiAgICAgICAgbmV3TmFtZSA9IGdldEZyZXNoTmFtZShpbnN0YW5jZVNjb3BlLCBuYW1lLAogICAgICAgICAgICBzYW5pdGl6ZUZvckFubm90YXRpb25zOiB0cnVlLCBzYW5pdGl6ZUZvck5hdGl2ZXM6IG1heUNsYXNoTmF0aXZlKTsKICAgICAgICBpbnRlcm5hbEluc3RhbmNlTWVtYmVyc1tlbGVtZW50XSA9IG5ld05hbWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfbmV3UmVmZXJlbmNlKG5ld05hbWUpOwogIH0KCiAgLy8vIERpc2FtYmlndWF0ZWQgbmFtZSBmb3IgdGhlIGdpdmVuIG9wZXJhdG9yLgogIC8vLwogIC8vLyBbb3BlcmF0b3JJZGVudGlmaWVyXSBtdXN0IGJlIHRoZSBvcGVyYXRvcidzIGlkZW50aWZpZXIsIGUuZy4KICAvLy8gYCRhZGRgIGFuZCBub3QgYCtgLgogIC8vLwogIC8vLyBUaGUgcmVzdWx0aW5nIG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgaW5zdGFuY2UtbWVtYmVyIG5hbWVzcGFjZS4KICBqc0FzdC5OYW1lIF9kaXNhbWJpZ3VhdGVPcGVyYXRvcihTdHJpbmcgb3BlcmF0b3JJZGVudGlmaWVyKSB7CiAgICBqc0FzdC5OYW1lIG5ld05hbWUgPSB1c2VySW5zdGFuY2VPcGVyYXRvcnNbb3BlcmF0b3JJZGVudGlmaWVyXTsKICAgIGlmIChuZXdOYW1lID09IG51bGwpIHsKICAgICAgbmV3TmFtZSA9IGdldEZyZXNoTmFtZShpbnN0YW5jZVNjb3BlLCBvcGVyYXRvcklkZW50aWZpZXIpOwogICAgICB1c2VySW5zdGFuY2VPcGVyYXRvcnNbb3BlcmF0b3JJZGVudGlmaWVyXSA9IG5ld05hbWU7CiAgICB9CiAgICByZXR1cm4gX25ld1JlZmVyZW5jZShuZXdOYW1lKTsKICB9CgogIFN0cmluZyBfZ2VuZXJhdGVGcmVzaFN0cmluZ0Zvck5hbWUoU3RyaW5nIHByb3Bvc2VkTmFtZSwgTmFtaW5nU2NvcGUgc2NvcGUsCiAgICAgIHtib29sIHNhbml0aXplRm9yQW5ub3RhdGlvbnM6IGZhbHNlLCBib29sIHNhbml0aXplRm9yTmF0aXZlczogZmFsc2V9KSB7CiAgICBpZiAoc2FuaXRpemVGb3JBbm5vdGF0aW9ucykgewogICAgICBwcm9wb3NlZE5hbWUgPSBfc2FuaXRpemVGb3JBbm5vdGF0aW9ucyhwcm9wb3NlZE5hbWUpOwogICAgfQogICAgaWYgKHNhbml0aXplRm9yTmF0aXZlcykgewogICAgICBwcm9wb3NlZE5hbWUgPSBfc2FuaXRpemVGb3JOYXRpdmVzKHByb3Bvc2VkTmFtZSk7CiAgICB9CiAgICBwcm9wb3NlZE5hbWUgPSBfc2FuaXRpemVGb3JLZXl3b3Jkcyhwcm9wb3NlZE5hbWUpOwogICAgU3RyaW5nIGNhbmRpZGF0ZTsKICAgIGlmIChzY29wZS5pc1VudXNlZChwcm9wb3NlZE5hbWUpKSB7CiAgICAgIGNhbmRpZGF0ZSA9IHByb3Bvc2VkTmFtZTsKICAgIH0gZWxzZSB7CiAgICAgIGludCBjb3VudGVyID0gcG9wdWxhck5hbWVDb3VudGVyc1twcm9wb3NlZE5hbWVdOwogICAgICBpbnQgaSA9IChjb3VudGVyID09IG51bGwpID8gMCA6IGNvdW50ZXI7CiAgICAgIHdoaWxlIChzY29wZS5pc1VzZWQoIiRwcm9wb3NlZE5hbWUkaSIpKSB7CiAgICAgICAgaSsrOwogICAgICB9CiAgICAgIHBvcHVsYXJOYW1lQ291bnRlcnNbcHJvcG9zZWROYW1lXSA9IGkgKyAxOwogICAgICBjYW5kaWRhdGUgPSAiJHByb3Bvc2VkTmFtZSRpIjsKICAgIH0KICAgIHNjb3BlLnJlZ2lzdGVyVXNlKGNhbmRpZGF0ZSk7CiAgICByZXR1cm4gY2FuZGlkYXRlOwogIH0KCiAgLy8vIFJldHVybnMgYW4gdW51c2VkIG5hbWUuCiAgLy8vCiAgLy8vIFtwcm9wb3NlZE5hbWVdIG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGlkZW50aWZpZXIuCiAgLy8vCiAgLy8vIElmIFtzYW5pdGl6ZUZvckFubm90YXRpb25zXSBpcyBgdHJ1ZWAsIHRoZW4gdGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIG5vdAogIC8vLyB0byBoYXZlIHRoZSBmb3JtIG9mIGFuIGFubm90YXRlZCBuYW1lLgogIC8vLwogIC8vLyBJZiBbc2FuaXRpemVGb3JOYXRpdmVzXSBpdCBgdHJ1ZWAsIHRoZW4gdGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIG5vdCB0bwogIC8vLyBjbGFzaCB3aXRoIGEgcHJvcGVydHkgbmFtZSBvbiBhIG5hdGl2ZSBvYmplY3QuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCBbTWluaWZ5TmFtZXJdIG92ZXJyaWRlcyB0aGlzIG1ldGhvZCB3aXRoIG9uZSB0aGF0IHByb2R1Y2VzCiAgLy8vIG1pbmlmaWVkIG5hbWVzLgogIGpzQXN0Lk5hbWUgZ2V0RnJlc2hOYW1lKE5hbWluZ1Njb3BlIHNjb3BlLCBTdHJpbmcgcHJvcG9zZWROYW1lLAogICAgICB7Ym9vbCBzYW5pdGl6ZUZvckFubm90YXRpb25zOiBmYWxzZSwgYm9vbCBzYW5pdGl6ZUZvck5hdGl2ZXM6IGZhbHNlfSkgewogICAgU3RyaW5nIGNhbmRpZGF0ZSA9IF9nZW5lcmF0ZUZyZXNoU3RyaW5nRm9yTmFtZShwcm9wb3NlZE5hbWUsIHNjb3BlLAogICAgICAgIHNhbml0aXplRm9yQW5ub3RhdGlvbnM6IHNhbml0aXplRm9yQW5ub3RhdGlvbnMsCiAgICAgICAgc2FuaXRpemVGb3JOYXRpdmVzOiBzYW5pdGl6ZUZvck5hdGl2ZXMpOwogICAgcmV0dXJuIG5ldyBTdHJpbmdCYWNrZWROYW1lKGNhbmRpZGF0ZSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIHZhcmlhbnQgb2YgW25hbWVdIHRoYXQgY2Fubm90IGNsYXNoIHdpdGggdGhlIGFubm90YXRlZAogIC8vLyB2ZXJzaW9uIG9mIGFub3RoZXIgbmFtZSwgdGhhdCBpcywgdGhlIHJlc3VsdGluZyBuYW1lIGNhbiBuZXZlciBiZSByZXR1cm5lZAogIC8vLyBieSBbZGVyaXZlR2V0dGVyTmFtZV0sIFtkZXJpdmVTZXR0ZXJOYW1lXSwgW2Rlcml2ZUNhbGxNZXRob2ROYW1lXSwKICAvLy8gW29wZXJhdG9ySXNdLCBvciBbc3Vic3RpdHV0aW9uTmFtZV0uCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlLCBhIG5hbWUgYGdldCR4YCB3b3VsZCBiZSBjb252ZXJ0ZWQgdG8gYCRnZXQkeGAgdG8gZW5zdXJlIGl0CiAgLy8vIGNhbm5vdCBjbGFzaCB3aXRoIHRoZSBnZXR0ZXIgZm9yIGB4YC4KICAvLy8KICAvLy8gV2UgZG9uJ3Qgd2FudCB0byByZWdpc3RlciBhbGwgcG90ZW50aWFsIGFubm90YXRlZCBuYW1lcyBpbgogIC8vLyBbdXNlZEluc3RhbmNlTmFtZXNdICh0aGVyZSBhcmUgdG9vIG1hbnkpLCBzbyB3ZSB1c2UgdGhpcyBzdGVwIHRvIGF2b2lkCiAgLy8vIGNsYXNoZXMgYmV0d2VlbiBhbm5vdGF0ZWQgYW5kIHVuYW5ub3RhdGVkIG5hbWVzLgogIFN0cmluZyBfc2FuaXRpemVGb3JBbm5vdGF0aW9ucyhTdHJpbmcgbmFtZSkgewogICAgLy8gRW5zdXJlIG5hbWUgZG9lcyBub3QgY2xhc2ggd2l0aCBhIGdldHRlciBvciBzZXR0ZXIgb2YgYW5vdGhlciBuYW1lLAogICAgLy8gb25lIG9mIHRoZSBvdGhlciBzcGVjaWFsIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCBgJGAsIHN1Y2ggYXMgYCRpc2AsCiAgICAvLyBvciB3aXRoIG9uZSBvZiB0aGUgYGNhbGxgIHN0dWJzLCBzdWNoIGFzIGBjYWxsJDFgLgogICAgYXNzZXJ0KHRoaXMgaXMhIE1pbmlmeU5hbWVyKTsKICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgocickJykgfHwKICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoZml4ZWROYW1lcy5nZXR0ZXJQcmVmaXgpIHx8CiAgICAgICAgbmFtZS5zdGFydHNXaXRoKGZpeGVkTmFtZXMuc2V0dGVyUHJlZml4KSB8fAogICAgICAgIG5hbWUuc3RhcnRzV2l0aChfY2FsbFByZWZpeERvbGxhcikpIHsKICAgICAgbmFtZSA9ICdcJCRuYW1lJzsKICAgIH0KICAgIHJldHVybiBuYW1lOwogIH0KCiAgLy8vIFJldHVybnMgYSB2YXJpYW50IG9mIFtuYW1lXSB0aGF0IGNhbm5vdCBjbGFzaCB3aXRoIGEgbmF0aXZlIHByb3BlcnR5IG5hbWUKICAvLy8gKGUuZy4gdGhlIG5hbWUgb2YgYSBtZXRob2Qgb24gYSBKUyBET00gb2JqZWN0KS4KICAvLy8KICAvLy8gSWYgW25hbWVdIGlzIG5vdCBhbiBhbm5vdGF0ZWQgbmFtZSwgdGhlIHJlc3VsdCB3aWxsIG5vdCBiZSBhbiBhbm5vdGF0ZWQKICAvLy8gbmFtZSBlaXRoZXIuCiAgU3RyaW5nIF9zYW5pdGl6ZUZvck5hdGl2ZXMoU3RyaW5nIG5hbWUpIHsKICAgIGlmICghbmFtZS5jb250YWlucyhyJyQnKSkgewogICAgICAvLyBQcmVwZW5kICQkLiBUaGUgcmVzdWx0IG11c3Qgbm90IGNvaW5jaWRlIHdpdGggYW4gYW5ub3RhdGVkIG5hbWUuCiAgICAgIG5hbWUgPSAnXCRcJCRuYW1lJzsKICAgIH0KICAgIHJldHVybiBuYW1lOwogIH0KCiAgLy8vIFJldHVybnMgYSBwcm9wb3NlZCBuYW1lIGZvciB0aGUgZ2l2ZW4gdHlwZWRlZiBvciBjbGFzcyBbZWxlbWVudF0uCiAgLy8vIFRoZSByZXR1cm5lZCBpZCBpcyBndWFyYW50ZWVkIHRvIGJlIGEgdmFsaWQgSmF2YVNjcmlwdCBpZGVudGlmaWVyLgogIFN0cmluZyBfcHJvcG9zZU5hbWVGb3JUeXBlKEVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gZWxlbWVudC5uYW1lLnJlcGxhY2VBbGwoX25vbklkZW50aWZpZXJSRSwgJ18nKTsKICB9CgogIHN0YXRpYyBSZWdFeHAgX25vbklkZW50aWZpZXJSRSA9IG5ldyBSZWdFeHAocidbXkEtWmEtejAtOV8kXScpOwoKICAvLy8gUmV0dXJucyBhIHByb3Bvc2VkIG5hbWUgZm9yIHRoZSBnaXZlbiB0b3AtbGV2ZWwgb3Igc3RhdGljIG1lbWJlcgogIC8vLyBbZWxlbWVudF0uIFRoZSByZXR1cm5lZCBpZCBpcyBndWFyYW50ZWVkIHRvIGJlIGEgdmFsaWQgSmF2YVNjcmlwdAogIC8vLyBpZGVudGlmaWVyLgogIFN0cmluZyBfcHJvcG9zZU5hbWVGb3JNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50LmlzQ29uc3RydWN0b3IpIHsKICAgICAgcmV0dXJuIF9wcm9wb3NlTmFtZUZvckNvbnN0cnVjdG9yKGVsZW1lbnQpOwogICAgfSBlbHNlIGlmIChlbGVtZW50IGlzIEpHZW5lcmF0b3JCb2R5KSB7CiAgICAgIHJldHVybiBfcHJvcG9zZU5hbWVGb3JNZW1iZXIoZWxlbWVudC5mdW5jdGlvbikgKyByJyRib2R5JzsKICAgIH0gZWxzZSBpZiAoZWxlbWVudC5lbmNsb3NpbmdDbGFzcyAhPSBudWxsKSB7CiAgICAgIENsYXNzRW50aXR5IGVuY2xvc2luZ0NsYXNzID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzczsKICAgICAgcmV0dXJuICcke2VuY2xvc2luZ0NsYXNzLm5hbWV9XyR7ZWxlbWVudC5uYW1lfSc7CiAgICB9CiAgICByZXR1cm4gZWxlbWVudC5uYW1lLnJlcGxhY2VBbGwoJysnLCAnXycpOwogIH0KCiAgU3RyaW5nIF9wcm9wb3NlTmFtZUZvckxhenlTdGF0aWNHZXR0ZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiByJyRnZXQkJyArIF9wcm9wb3NlTmFtZUZvck1lbWJlcihlbGVtZW50KTsKICB9CgogIFN0cmluZyBfcHJvcG9zZU5hbWVGb3JDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvckVudGl0eSBlbGVtZW50KSB7CiAgICBTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzcy5uYW1lOwogICAgaWYgKGVsZW1lbnQuaXNHZW5lcmF0aXZlQ29uc3RydWN0b3IpIHsKICAgICAgcmV0dXJuICcke2NsYXNzTmFtZX1cJCR7ZWxlbWVudC5uYW1lfSc7CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDaGFuZ2UgZmFjdG9yeSBuYW1lIGVuY29kaW5nIGFzIHRvIG5vdCBpbmNsdWRlCiAgICAgIC8vIHRoZSBjbGFzcy1uYW1lIHR3aWNlLgogICAgICByZXR1cm4gJyR7Y2xhc3NOYW1lfV8ke3V0aWxzLnJlY29uc3RydWN0Q29uc3RydWN0b3JOYW1lKGVsZW1lbnQpfSc7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyBhIHByb3Bvc2VkIG5hbWUgZm9yIHRoZSBnaXZlbiBbTGlicmFyeUVsZW1lbnRdLgogIC8vLyBUaGUgcmV0dXJuZWQgaWQgaXMgZ3VhcmFudGVlZCB0byBiZSBhIHZhbGlkIEphdmFTY3JpcHQgaWRlbnRpZmllci4KICAvLyBUT0RPKHNyYSk6IFByZS1wcm9jZXNzIGxpYnJhcmllcyB0byBhc3NpZ24gW2xpYnJhcnlMb25nTmFtZXNdIGluIGEgd2F5IHRoYXQKICAvLyBpcyBpbmRlcGVuZGVudCBvZiB0aGUgb3JkZXIgb2YgY2FsbHMgdG8gbmFtZXIuCiAgU3RyaW5nIF9wcm9wb3NlTmFtZUZvckxpYnJhcnkoTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICBTdHJpbmcgbmFtZSA9IGxpYnJhcnlMb25nTmFtZXNbbGlicmFyeV07CiAgICBpZiAobmFtZSAhPSBudWxsKSByZXR1cm4gbmFtZTsKICAgIC8vIFVzZSB0aGUgJ2ZpbGUnIG5hbWUsIGUuZy4gInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IiAtPiAiZXhwZWN0IgogICAgbmFtZSA9IGxpYnJhcnkuY2Fub25pY2FsVXJpLnBhdGg7CiAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZignLycpICsgMSk7CiAgICBpZiAobmFtZS5jb250YWlucygnLicpKSB7CiAgICAgIC8vIERyb3AgZmlsZSBleHRlbnNpb24uCiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxhc3RJbmRleE9mKCcuJykpOwogICAgfQogICAgLy8gVGhlIGZpbGVuYW1lIGJhc2VkIG5hbWUgY2FuIGNvbnRhaW4gYWxsIGtpbmRzIG9mIG5hc3R5IGNoYXJhY3RlcnMuIE1ha2UKICAgIC8vIHN1cmUgaXQgaXMgYW4gaWRlbnRpZmllci4KICAgIGlmICghSURFTlRJRklFUi5oYXNNYXRjaChuYW1lKSkgewogICAgICBTdHJpbmcgcmVwbGFjZXIoTWF0Y2ggbWF0Y2gpIHsKICAgICAgICBTdHJpbmcgcyA9IG1hdGNoWzBdOwogICAgICAgIGlmIChzID09ICcuJykgcmV0dXJuICdfJzsKICAgICAgICByZXR1cm4gcy5jb2RlVW5pdEF0KDApLnRvUmFkaXhTdHJpbmcoMTYpOwogICAgICB9CgogICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsTWFwcGVkKE5PTl9JREVOVElGSUVSX0NIQVIsIHJlcGxhY2VyKTsKICAgICAgaWYgKCFJREVOVElGSUVSLmhhc01hdGNoKG5hbWUpKSB7CiAgICAgICAgLy8gZS5nLiBzdGFydHMgd2l0aCBkaWdpdC4KICAgICAgICBuYW1lID0gJ2xpYl8kbmFtZSc7CiAgICAgIH0KICAgIH0KICAgIC8vIE5hbWVzIGNvbnN0cnVjdGVkIGJhc2VkIG9uIGEgbGliYXJ5IG5hbWUgd2lsbCBiZSBmdXJ0aGVyIGRpc2FtYmlndWF0ZWQuCiAgICAvLyBIb3dldmVyLCBhcyBuYW1lcyBmcm9tIHRoZSBzYW1lIGxpYmFyeSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsaWJyYXJ5CiAgICAvLyBuYW1lIHBhcnQsIHdlIGRpc2FtYmlndWF0ZSB0aGUgbGlicmFyeSBuYW1lIGhlcmUuCiAgICBTdHJpbmcgZGlzYW1iaWd1YXRlZCA9IG5hbWU7CiAgICBmb3IgKGludCBjID0gMDsgbGlicmFyeUxvbmdOYW1lcy5jb250YWluc1ZhbHVlKGRpc2FtYmlndWF0ZWQpOyBjKyspIHsKICAgICAgZGlzYW1iaWd1YXRlZCA9ICIkbmFtZSRjIjsKICAgIH0KICAgIGxpYnJhcnlMb25nTmFtZXNbbGlicmFyeV0gPSBkaXNhbWJpZ3VhdGVkOwogICAgcmV0dXJuIGRpc2FtYmlndWF0ZWQ7CiAgfQoKICBTdHJpbmcgX2dldFN1ZmZpeEZvckludGVyY2VwdGVkQ2xhc3NlcyhJdGVyYWJsZTxDbGFzc0VudGl0eT4gY2xhc3NlcykgewogICAgaWYgKGNsYXNzZXMuaXNFbXB0eSkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIsc3JhKTogSWYgW2NsYXNzZXNdIGlzIGVtcHR5IGl0IHNob3VsZCBlaXRoZXIgaGF2ZQogICAgICAvLyBpdHMgb3duIHN1ZmZpeCAobGlrZSBoZXJlKSwgb3IgYWx3YXlzIGJlIGVxdWF0ZWQgd2l0aCB0aGUgc2V0IG9mCiAgICAgIC8vIGNsYXNzZXMgdGhhdCBjb250YWluIGBJbnRlcmNlcHRvcmAuIEZvciB0aGUgbGF0dGVyIHRvIHdvcmsgd2UgbmVlZCB0bwogICAgICAvLyB1cGRhdGUgYE9uZVNob3RJbnRlcmNlcHRvckRhdGEucmVnaXN0ZXJTcGVjaWFsaXplZEdldEludGVyY2VwdG9yYCwKICAgICAgLy8gc2luY2UgaXQgY3VycmVudGx5IHdvdWxkIG90aGVyd2lzZSBwb3RlbnRpYWxseSBvdmVyd3JpdGUgdGhlIGFsbAogICAgICAvLyBpbnRlcmNlcHRlZCBjbGFzc2VzIGNhc2Ugd2l0aCB0aGUgZW1wdHkgY2FzZS4KICAgICAgcmV0dXJuICd6JzsKICAgIH0gZWxzZSBpZiAoY2xhc3Nlcy5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNJbnRlcmNlcHRvckNsYXNzKSkgewogICAgICAvLyBJZiB0aGUgYmFzZSBJbnRlcmNlcHRvciBjbGFzcyBpcyBpbiB0aGUgc2V0IG9mIGludGVyY2VwdGVkIGNsYXNzZXMsCiAgICAgIC8vIHRoaXMgaXMgdGhlIG1vc3QgZ2VuZXJhbCBzcGVjaWFsaXphdGlvbiB3aGljaCB1c2VzIHRoZSBnZW5lcmljCiAgICAgIC8vIGdldEludGVyY2VwdG9yIG1ldGhvZC4KICAgICAgLy8gVE9ETyhzcmEpOiBGaW5kIGEgd2F5IHRvIGdldCB0aGUgc2ltcGxlIG5hbWUgd2hlbiBPYmplY3QgaXMgbm90IGluIHRoZQogICAgICAvLyBzZXQgb2YgY2xhc3NlcyBmb3IgbW9zdCBnZW5lcmFsIHZhcmlhbnQsIGUuZy4gIiRsdCRuIiBjb3VsZCBiZSAiJGx0Ii4KICAgICAgcmV0dXJuICcnOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHN1ZmZpeEZvckdldEludGVyY2VwdG9yKF9jb21tb25FbGVtZW50cywgX25hdGl2ZURhdGEsIGNsYXNzZXMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBuYW1lRm9yR2V0SW50ZXJjZXB0b3IoSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGNsYXNzZXMpIHsKICAgIC8vIElmIHRoZSBiYXNlIEludGVyY2VwdG9yIGNsYXNzIGlzIGluIHRoZSBzZXQgb2YgaW50ZXJjZXB0ZWQgY2xhc3Nlcywgd2UKICAgIC8vIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgZ2VuZXJpYyBnZXRJbnRlcmNlcHRvciBtZXRob2QgKGFueSBzdWJjbGFzcyBvZiB0aGUKICAgIC8vIGJhc2UgSW50ZXJjZXB0b3IgY291bGQgbWF0Y2gpLCB3aGljaCBpcyBlbmNvZGVkIGFzIGFuIGVtcHR5IHN1ZmZpeC4KICAgIFN0cmluZyBzdWZmaXggPSBfZ2V0U3VmZml4Rm9ySW50ZXJjZXB0ZWRDbGFzc2VzKGNsYXNzZXMpOwogICAgcmV0dXJuIF9kaXNhbWJpZ3VhdGVJbnRlcm5hbEdsb2JhbCgnZ2V0SW50ZXJjZXB0b3JcJCRzdWZmaXgnKTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgbmFtZUZvck9uZVNob3RJbnRlcmNlcHRvcigKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBjbGFzc2VzKSB7CiAgICAvLyBUaGUgb25lLXNob3QgbmFtZSBpcyBhIGdsb2JhbCBuYW1lIGRlcml2ZWQgZnJvbSB0aGUgaW52b2NhdGlvbiBuYW1lLiAgVG8KICAgIC8vIGF2b2lkIGluc3RhYmlsaXR5IHdlIHdvdWxkIGxpa2UgdGhlIG5hbWVzIHRvIGJlIHVuaXF1ZSBhbmQgbm90IGNsYXNoIHdpdGgKICAgIC8vIG90aGVyIGdsb2JhbCBuYW1lcy4KICAgIGpzQXN0Lk5hbWUgcm9vdCA9IGludm9jYXRpb25OYW1lKHNlbGVjdG9yKTsKCiAgICBTdHJpbmcgc3VmZml4ID0gX2dldFN1ZmZpeEZvckludGVyY2VwdGVkQ2xhc3NlcyhjbGFzc2VzKTsKICAgIHJldHVybiBuZXcgQ29tcG91bmROYW1lKAogICAgICAgIFtyb290LCBfbGl0ZXJhbERvbGxhciwgbmV3IFN0cmluZ0JhY2tlZE5hbWUoc3VmZml4KV0pOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBydW50aW1lVHlwZU5hbWUoRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBfbGl0ZXJhbER5bmFtaWM7CiAgICAvLyBUaGUgcmV0dXJuZWQgbmFtZSBhZmZlY3RzIGJvdGggdGhlIGdsb2JhbCBhbmQgaW5zdGFuY2UgbWVtYmVyIG5hbWVzcGFjZXM6CiAgICAvLwogICAgLy8gLSBJZiBnaXZlbiBhIGNsYXNzLCB0aGlzIG11c3QgY29pbmNpZGUgd2l0aCB0aGUgY2xhc3MgbmFtZSwgd2hpY2gKICAgIC8vICAgaXMgYWxzbyB0aGUgR0xPQkFMIHByb3BlcnR5IG5hbWUgb2YgaXRzIGNvbnN0cnVjdG9yLgogICAgLy8KICAgIC8vIC0gVGhlIHJlc3VsdCBpcyB1c2VkIHRvIGRlcml2ZSBgJGlzWGAgYW5kIGAkYXNYYCBuYW1lcywgd2hpY2ggYXJlIHVzZWQKICAgIC8vICAgYXMgSU5TVEFOQ0UgcHJvcGVydHkgbmFtZXMuCiAgICAvLwogICAgLy8gVG8gcHJldmVudCBjbGFzaGVzIGluIGJvdGggbmFtZXNwYWNlcyBhdCBvbmNlLCB3ZSBkaXNhbWJpZ3VhdGUgdGhlIG5hbWUKICAgIC8vIGFzIGEgZ2xvYmFsIGhlcmUsIGFuZCBpbiBbX3Nhbml0aXplRm9yQW5ub3RhdGlvbnNdIHdlIGVuc3VyZSB0aGF0CiAgICAvLyBvcmRpbmFyeSBpbnN0YW5jZSBtZW1iZXJzIGNhbm5vdCBzdGFydCB3aXRoIGAkaXNgIG9yIGAkYXNgLgogICAgcmV0dXJuIF9kaXNhbWJpZ3VhdGVHbG9iYWxUeXBlKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBjbGFzc05hbWUoQ2xhc3NFbnRpdHkgY2xhc3NfKSA9PiBfZGlzYW1iaWd1YXRlR2xvYmFsVHlwZShjbGFzc18pOwoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIGFsaWFzZWRTdXBlck1lbWJlclByb3BlcnR5TmFtZShNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBhc3NlcnQoIW1lbWJlci5pc0ZpZWxkKTsgLy8gRmllbGRzIGRvIG5vdCBuZWVkIHN1cGVyIGFsaWFzZXMuCiAgICByZXR1cm4gX2Rpc2FtYmlndWF0ZUludGVybmFsTWVtYmVyKG1lbWJlciwgKCkgewogICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWUucmVwbGFjZUFsbCgnJicsICdfJyk7CiAgICAgIFN0cmluZyBpbnZvY2F0aW9uTmFtZSA9IG9wZXJhdG9yTmFtZVRvSWRlbnRpZmllcihtZW1iZXIubmFtZSk7CiAgICAgIHJldHVybiAic3VwZXJcJCR7Y2xhc3NOYW1lfVwkJGludm9jYXRpb25OYW1lIjsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBtZXRob2RQcm9wZXJ0eU5hbWUoRnVuY3Rpb25FbnRpdHkgbWV0aG9kKSB7CiAgICByZXR1cm4gbWV0aG9kLmlzSW5zdGFuY2VNZW1iZXIKICAgICAgICA/IGluc3RhbmNlTWV0aG9kTmFtZShtZXRob2QpCiAgICAgICAgOiBnbG9iYWxQcm9wZXJ0eU5hbWVGb3JNZW1iZXIobWV0aG9kKTsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgW2VsZW1lbnRdIGlzIHN0b3JlZCBpbiB0aGUgc3RhdGljIHN0YXRlIGhvbGRlcgogIC8vLyAoW3N0YXRpY1N0YXRlSG9sZGVyXSkuICBXZSBpbnRlbmQgdG8gc3RvcmUgb25seSBtdXRhYmxlIHN0YXRpYyBzdGF0ZQogIC8vLyB0aGVyZSwgd2hlcmVhcyBjb25zdGFudHMgYXJlIHN0b3JlZCBpbiAnQycuIEZ1bmN0aW9ucywgYWNjZXNzb3JzLAogIC8vLyBjbGFzc2VzLCBldGMuIGFyZSBzdG9yZWQgaW4gb25lIG9mIHRoZSBvdGhlciBvYmplY3RzIGluCiAgLy8vIFtyZXNlcnZlZEdsb2JhbE9iamVjdE5hbWVzXS4KICBib29sIF9pc1Byb3BlcnR5T2ZTdGF0aWNTdGF0ZUhvbGRlcihNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgLy8gVE9ETyhhaGUpOiBNYWtlIHN1cmUgdGhpcyBtZXRob2QncyBkb2N1bWVudGF0aW9uIGlzIGFsd2F5cyB0cnVlIGFuZAogICAgLy8gcmVtb3ZlIHRoZSB3b3JkICJpbnRlbmQiLgogICAgcmV0dXJuIGVsZW1lbnQuaXNGaWVsZDsKICB9CgogIC8vLyBSZXR1cm5zIFtzdGF0aWNTdGF0ZUhvbGRlcl0gb3Igb25lIG9mIFtyZXNlcnZlZEdsb2JhbE9iamVjdE5hbWVzXS4KICBTdHJpbmcgZ2xvYmFsT2JqZWN0Rm9yTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoX2lzUHJvcGVydHlPZlN0YXRpY1N0YXRlSG9sZGVyKGVsZW1lbnQpKSByZXR1cm4gc3RhdGljU3RhdGVIb2xkZXI7CiAgICByZXR1cm4gZ2xvYmFsT2JqZWN0Rm9yTGlicmFyeShlbGVtZW50LmxpYnJhcnkpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuVmFyaWFibGVVc2UgcmVhZEdsb2JhbE9iamVjdEZvck1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKF9pc1Byb3BlcnR5T2ZTdGF0aWNTdGF0ZUhvbGRlcihlbGVtZW50KSkgewogICAgICByZXR1cm4gbmV3IGpzQXN0LlZhcmlhYmxlVXNlKHN0YXRpY1N0YXRlSG9sZGVyKTsKICAgIH0KICAgIHJldHVybiByZWFkR2xvYmFsT2JqZWN0Rm9yTGlicmFyeShlbGVtZW50LmxpYnJhcnkpOwogIH0KCiAgU3RyaW5nIGdsb2JhbE9iamVjdEZvckNsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBnbG9iYWxPYmplY3RGb3JMaWJyYXJ5KGVsZW1lbnQubGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5WYXJpYWJsZVVzZSByZWFkR2xvYmFsT2JqZWN0Rm9yQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIHJlYWRHbG9iYWxPYmplY3RGb3JMaWJyYXJ5KGVsZW1lbnQubGlicmFyeSk7CiAgfQoKICBTdHJpbmcgZ2xvYmFsT2JqZWN0Rm9yVHlwZShFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQgaXMgVHlwZWRlZkVudGl0eSkgewogICAgICByZXR1cm4gZ2xvYmFsT2JqZWN0Rm9yTGlicmFyeShlbGVtZW50LmxpYnJhcnkpOwogICAgfQogICAgcmV0dXJuIGdsb2JhbE9iamVjdEZvckNsYXNzKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuVmFyaWFibGVVc2UgcmVhZEdsb2JhbE9iamVjdEZvclR5cGUoRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50IGlzIFR5cGVkZWZFbnRpdHkpIHsKICAgICAgcmV0dXJuIHJlYWRHbG9iYWxPYmplY3RGb3JMaWJyYXJ5KGVsZW1lbnQubGlicmFyeSk7CiAgICB9CiAgICByZXR1cm4gcmVhZEdsb2JhbE9iamVjdEZvckNsYXNzKGVsZW1lbnQpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIFtyZXNlcnZlZEdsb2JhbE9iamVjdE5hbWVzXSBmb3IgW2xpYnJhcnldLgogIFN0cmluZyBnbG9iYWxPYmplY3RGb3JMaWJyYXJ5KExpYnJhcnlFbnRpdHkgbGlicmFyeSkgewogICAgaWYgKGxpYnJhcnkgPT0gX2NvbW1vbkVsZW1lbnRzLmludGVyY2VwdG9yc0xpYnJhcnkpIHJldHVybiAnSic7CiAgICBVcmkgdXJpID0gbGlicmFyeS5jYW5vbmljYWxVcmk7CiAgICBpZiAodXJpLnNjaGVtZSA9PSAnZGFydCcpIHsKICAgICAgaWYgKHVyaS5wYXRoID09ICdodG1sJykgcmV0dXJuICdXJzsKICAgICAgaWYgKHVyaS5wYXRoLnN0YXJ0c1dpdGgoJ18nKSkgcmV0dXJuICdIJzsKICAgICAgcmV0dXJuICdQJzsKICAgIH0KICAgIHJldHVybiB1c2VyR2xvYmFsT2JqZWN0c1tsaWJyYXJ5Lm5hbWUuaGFzaENvZGUgJSB1c2VyR2xvYmFsT2JqZWN0cy5sZW5ndGhdOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuVmFyaWFibGVVc2UgcmVhZEdsb2JhbE9iamVjdEZvckxpYnJhcnkoTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICByZXR1cm4gbmV3IGpzQXN0LlZhcmlhYmxlVXNlKGdsb2JhbE9iamVjdEZvckxpYnJhcnkobGlicmFyeSkpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBsYXp5SW5pdGlhbGl6ZXJOYW1lKEZpZWxkRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChlbGVtZW50LmlzVG9wTGV2ZWwgfHwgZWxlbWVudC5pc1N0YXRpYyk7CiAgICBqc0FzdC5OYW1lIG5hbWUgPSBfZGlzYW1iaWd1YXRlR2xvYmFsPE1lbWJlckVudGl0eT4oCiAgICAgICAgZWxlbWVudCwgX3Byb3Bvc2VOYW1lRm9yTGF6eVN0YXRpY0dldHRlciwgdXNlckdsb2JhbHNTZWNvbmROYW1lKTsKICAgIHJldHVybiBuYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBzdGF0aWNDbG9zdXJlTmFtZShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoZWxlbWVudC5pc1RvcExldmVsIHx8IGVsZW1lbnQuaXNTdGF0aWMpOwogICAgU3RyaW5nIGVuY2xvc2luZyA9CiAgICAgICAgZWxlbWVudC5lbmNsb3NpbmdDbGFzcyA9PSBudWxsID8gIiIgOiBlbGVtZW50LmVuY2xvc2luZ0NsYXNzLm5hbWU7CiAgICBTdHJpbmcgbGlicmFyeSA9IF9wcm9wb3NlTmFtZUZvckxpYnJhcnkoZWxlbWVudC5saWJyYXJ5KTsKICAgIHJldHVybiBfZGlzYW1iaWd1YXRlSW50ZXJuYWxHbG9iYWwoCiAgICAgICAgIiR7bGlicmFyeX1fJHtlbmNsb3Npbmd9XyR7ZWxlbWVudC5uYW1lfVwkY2xvc3VyZSIpOwogIH0KCiAgLy8gVGhpcyBuYW1lIGlzIHVzZWQgYXMgcGFydCBvZiB0aGUgbmFtZSBvZiBhIFR5cGVDb25zdGFudAogIFN0cmluZyB1bmlxdWVOYW1lRm9yVHlwZUNvbnN0YW50RWxlbWVudCgKICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBFbnRpdHkgZWxlbWVudCkgewogICAgLy8gVE9ETyhzcmEpOiBJZiB3ZSByZXBsYWNlIHRoZSBwZXJpb2Qgd2l0aCBhbiBpZGVudGlmaWVyIGNoYXJhY3RlciwKICAgIC8vIFR5cGVDb25zdGFudHMgd2lsbCBoYXZlIGJldHRlciBuYW1lcyBpbiB1bm1pbmlmaWVkIGNvZGUuCiAgICBTdHJpbmcgbGlicmFyeU5hbWUgPSBfcHJvcG9zZU5hbWVGb3JMaWJyYXJ5KGxpYnJhcnkpOwogICAgcmV0dXJuICIke2xpYnJhcnlOYW1lfS4ke2VsZW1lbnQubmFtZX0iOwogIH0KCiAgU3RyaW5nIGdsb2JhbE9iamVjdEZvckNvbnN0YW50KENvbnN0YW50VmFsdWUgY29uc3RhbnQpID0+ICdDJzsKCiAgU3RyaW5nIGdldCBnZW5lcmljSW5zdGFudGlhdGlvblByZWZpeCA9PiByJyRpbnN0YW50aWF0ZSc7CgogIC8vIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB1c2VkIHRvIG9mZnNldCBmdW5jdGlvbiBzaWduYXR1cmVzIGluIGRlZmVycmVkCiAgLy8gcGFydHMgd2l0aCB0aGUgZmFzdC1zdGFydHVwIGVtaXR0ZXIuCiAgU3RyaW5nIGdldCB0eXBlc09mZnNldE5hbWUgPT4gcid0eXBlc09mZnNldCc7CgogIE1hcDxGdW5jdGlvblR5cGUsIGpzQXN0Lk5hbWU+IGZ1bmN0aW9uVHlwZU5hbWVNYXAgPSBIYXNoTWFwKCk7CgogIEZ1bmN0aW9uVHlwZU5hbWVyIF9mdW5jdGlvblR5cGVOYW1lcjsKCiAganNBc3QuTmFtZSBnZXRGdW5jdGlvblR5cGVOYW1lKEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUpIHsKICAgIHJldHVybiBmdW5jdGlvblR5cGVOYW1lTWFwLnB1dElmQWJzZW50KGZ1bmN0aW9uVHlwZSwgKCkgewogICAgICBfZnVuY3Rpb25UeXBlTmFtZXIgPz89IG5ldyBGdW5jdGlvblR5cGVOYW1lcigpOwogICAgICBTdHJpbmcgcHJvcG9zZWROYW1lID0gX2Z1bmN0aW9uVHlwZU5hbWVyLmNvbXB1dGVOYW1lKGZ1bmN0aW9uVHlwZSk7CiAgICAgIHJldHVybiBnZXRGcmVzaE5hbWUoaW5zdGFuY2VTY29wZSwgcHJvcG9zZWROYW1lKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBvcGVyYXRvcklzVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZS5pc0Z1bmN0aW9uVHlwZSkgewogICAgICAvLyBUT0RPKGVyaWtjb3JyeSk6IFJlZHVjZSBmcm9tICRpc3ggdG8gaXggd2hlbiB3ZSBhcmUgbWluaWZ5aW5nLgogICAgICByZXR1cm4gbmV3IENvbXBvdW5kTmFtZShbCiAgICAgICAgbmV3IFN0cmluZ0JhY2tlZE5hbWUoZml4ZWROYW1lcy5vcGVyYXRvcklzUHJlZml4KSwKICAgICAgICBfbGl0ZXJhbFVuZGVyc2NvcmUsCiAgICAgICAgZ2V0RnVuY3Rpb25UeXBlTmFtZSh0eXBlKQogICAgICBdKTsKICAgIH0KICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IHR5cGU7CiAgICByZXR1cm4gb3BlcmF0b3JJcyhpbnRlcmZhY2VUeXBlLmVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBvcGVyYXRvcklzKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIC8vIFRPRE8oZXJpa2NvcnJ5KTogUmVkdWNlIGZyb20gJGlzeCB0byBpeCB3aGVuIHdlIGFyZSBtaW5pZnlpbmcuCiAgICByZXR1cm4gbmV3IENvbXBvdW5kTmFtZShbCiAgICAgIG5ldyBTdHJpbmdCYWNrZWROYW1lKGZpeGVkTmFtZXMub3BlcmF0b3JJc1ByZWZpeCksCiAgICAgIHJ1bnRpbWVUeXBlTmFtZShlbGVtZW50KQogICAgXSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIG5hbWUgdGhhdCBkb2VzIG5vdCBjbGFzaCB3aXRoIHJlc2VydmVkIEpTIGtleXdvcmRzLgogIFN0cmluZyBfc2FuaXRpemVGb3JLZXl3b3JkcyhTdHJpbmcgbmFtZSkgewogICAgaWYgKGpzUmVzZXJ2ZWQuY29udGFpbnMobmFtZSkpIHsKICAgICAgbmFtZSA9ICdcJCRuYW1lJzsKICAgIH0KICAgIGFzc2VydCghanNSZXNlcnZlZC5jb250YWlucyhuYW1lKSk7CiAgICByZXR1cm4gbmFtZTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgc3Vic3RpdHV0aW9uTmFtZShDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gbmV3IENvbXBvdW5kTmFtZShbCiAgICAgIG5ldyBTdHJpbmdCYWNrZWROYW1lKGZpeGVkTmFtZXMub3BlcmF0b3JBc1ByZWZpeCksCiAgICAgIHJ1bnRpbWVUeXBlTmFtZShlbGVtZW50KQogICAgXSk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIGFzTmFtZShTdHJpbmcgbmFtZSkgewogICAgaWYgKG5hbWUuc3RhcnRzV2l0aChmaXhlZE5hbWVzLmdldHRlclByZWZpeCkgJiYKICAgICAgICBuYW1lLmxlbmd0aCA+IGZpeGVkTmFtZXMuZ2V0dGVyUHJlZml4Lmxlbmd0aCkgewogICAgICByZXR1cm4gbmV3IEdldHRlck5hbWUoX2xpdGVyYWxHZXR0ZXJQcmVmaXgsCiAgICAgICAgICBuZXcgU3RyaW5nQmFja2VkTmFtZShuYW1lLnN1YnN0cmluZyhmaXhlZE5hbWVzLmdldHRlclByZWZpeC5sZW5ndGgpKSk7CiAgICB9CiAgICBpZiAobmFtZS5zdGFydHNXaXRoKGZpeGVkTmFtZXMuc2V0dGVyUHJlZml4KSAmJgogICAgICAgIG5hbWUubGVuZ3RoID4gZml4ZWROYW1lcy5zZXR0ZXJQcmVmaXgubGVuZ3RoKSB7CiAgICAgIHJldHVybiBuZXcgR2V0dGVyTmFtZShfbGl0ZXJhbFNldHRlclByZWZpeCwKICAgICAgICAgIG5ldyBTdHJpbmdCYWNrZWROYW1lKG5hbWUuc3Vic3RyaW5nKGZpeGVkTmFtZXMuc2V0dGVyUHJlZml4Lmxlbmd0aCkpKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IFN0cmluZ0JhY2tlZE5hbWUobmFtZSk7CiAgfQoKICBTdHJpbmcgb3BlcmF0b3JOYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7CiAgICBpZiAobmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChuYW1lID09ICc9PScpIHsKICAgICAgcmV0dXJuIHInJGVxJzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnficpIHsKICAgICAgcmV0dXJuIHInJG5vdCc7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJ1tdJykgewogICAgICByZXR1cm4gcickaW5kZXgnOwogICAgfSBlbHNlIGlmIChuYW1lID09ICdbXT0nKSB7CiAgICAgIHJldHVybiByJyRpbmRleFNldCc7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJyonKSB7CiAgICAgIHJldHVybiByJyRtdWwnOwogICAgfSBlbHNlIGlmIChuYW1lID09ICcvJykgewogICAgICByZXR1cm4gcickZGl2JzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnJScpIHsKICAgICAgcmV0dXJuIHInJG1vZCc7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJ34vJykgewogICAgICByZXR1cm4gcickdGRpdic7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJysnKSB7CiAgICAgIHJldHVybiByJyRhZGQnOwogICAgfSBlbHNlIGlmIChuYW1lID09ICc8PCcpIHsKICAgICAgcmV0dXJuIHInJHNobCc7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJz4+JykgewogICAgICByZXR1cm4gcickc2hyJzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnPj4+JykgewogICAgICByZXR1cm4gcickc2hydSc7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJz49JykgewogICAgICByZXR1cm4gcickZ2UnOwogICAgfSBlbHNlIGlmIChuYW1lID09ICc+JykgewogICAgICByZXR1cm4gcickZ3QnOwogICAgfSBlbHNlIGlmIChuYW1lID09ICc8PScpIHsKICAgICAgcmV0dXJuIHInJGxlJzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnPCcpIHsKICAgICAgcmV0dXJuIHInJGx0JzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnJicpIHsKICAgICAgcmV0dXJuIHInJGFuZCc7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJ14nKSB7CiAgICAgIHJldHVybiByJyR4b3InOwogICAgfSBlbHNlIGlmIChuYW1lID09ICd8JykgewogICAgICByZXR1cm4gcickb3InOwogICAgfSBlbHNlIGlmIChuYW1lID09ICctJykgewogICAgICByZXR1cm4gcickc3ViJzsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAndW5hcnktJykgewogICAgICByZXR1cm4gcickbmVnYXRlJzsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuYW1lOwogICAgfQogIH0KCiAgU3RyaW5nIGdldFR5cGVSZXByZXNlbnRhdGlvbkZvclR5cGVDb25zdGFudChEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZS5pc0R5bmFtaWMpIHJldHVybiAiZHluYW1pYyI7CiAgICBpZiAodHlwZSBpcyBUeXBlZGVmVHlwZSkgewogICAgICByZXR1cm4gdW5pcXVlTmFtZUZvclR5cGVDb25zdGFudEVsZW1lbnQoCiAgICAgICAgICB0eXBlLmVsZW1lbnQubGlicmFyeSwgdHlwZS5lbGVtZW50KTsKICAgIH0KICAgIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBZGQgbmFtaW5nIHNjaGVtZSBmb3IgZnVuY3Rpb24gdHlwZSBsaXRlcmFscy4KICAgICAgLy8gVGhlc2UgY3VycmVudGx5IG9ubHkgb2NjdXIgZnJvbSBrZXJuZWwuCiAgICAgIHJldHVybiAnKCktPic7CiAgICB9CiAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZSA9IHR5cGU7CiAgICBTdHJpbmcgbmFtZSA9IHVuaXF1ZU5hbWVGb3JUeXBlQ29uc3RhbnRFbGVtZW50KAogICAgICAgIGludGVyZmFjZS5lbGVtZW50LmxpYnJhcnksIGludGVyZmFjZS5lbGVtZW50KTsKCiAgICAvLyBUeXBlIGNvbnN0YW50cyBjYW4gY3VycmVudGx5IG9ubHkgYmUgcmF3IHR5cGVzLCBzbyB0aGVyZSBpcyBubyBwb2ludAogICAgLy8gYWRkaW5nIGdyb3VuZC10ZXJtIHR5cGUgcGFyYW1ldGVycywgYXMgdGhleSB3b3VsZCBqdXN0IGJlICdkeW5hbWljJy4KICAgIC8vIFRPRE8oc3JhKTogU2luY2UgdGhlIHJlc3VsdCBzdHJpbmcgaXMgdXNlZCBvbmx5IGluIGNvbnN0cnVjdGluZyBjb25zdGFudAogICAgLy8gbmFtZXMsIGl0IHdvdWxkIHJlc3VsdCBpbiBtb3JlIHJlYWRhYmxlIG5hbWVzIGlmIHRoZSBmaW5hbCBzdHJpbmcgd2FzIGEKICAgIC8vIGxlZ2FsIEphdmFTY3JpcHQgaWRlbnRpZmllci4KICAgIGlmIChpbnRlcmZhY2UudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSByZXR1cm4gbmFtZTsKICAgIFN0cmluZyBhcmd1bWVudHMgPQogICAgICAgIG5ldyBMaXN0LmZpbGxlZChpbnRlcmZhY2UudHlwZUFyZ3VtZW50cy5sZW5ndGgsICdkeW5hbWljJykuam9pbignLCAnKTsKICAgIHJldHVybiAnJG5hbWU8JGFyZ3VtZW50cz4nOwogIH0KfQoKLy8vIFJldHVybnMgYSB1bmlxdWUgc3VmZml4IGZvciBhbiBpbnRlcmNlcHRlZCBhY2Nlc3NlcyB0byBbY2xhc3Nlc10uIFRoaXMgaXMKLy8vIHVzZWQgYXMgdGhlIHN1ZmZpeCBmb3IgZW1pdHRlZCBpbnRlcmNlcHRvciBtZXRob2RzIGFuZCBhcyB0aGUgdW5pcXVlIGtleQovLy8gdXNlZCB0byBkaXN0aW5ndWlzaCBlcXVpdmFsZW5jZXMgb2Ygc2V0cyBvZiBpbnRlcmNlcHRlZCBjbGFzc2VzLgpTdHJpbmcgc3VmZml4Rm9yR2V0SW50ZXJjZXB0b3IoQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICBOYXRpdmVEYXRhIG5hdGl2ZURhdGEsIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBjbGFzc2VzKSB7CiAgU3RyaW5nIGFiYnJldmlhdGUoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBpZiAoY2xzID09IGNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSByZXR1cm4gIm8iOwogICAgaWYgKGNscyA9PSBjb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzKSByZXR1cm4gInMiOwogICAgaWYgKGNscyA9PSBjb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MpIHJldHVybiAiYSI7CiAgICBpZiAoY2xzID09IGNvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3MpIHJldHVybiAiZCI7CiAgICBpZiAoY2xzID09IGNvbW1vbkVsZW1lbnRzLmpzSW50Q2xhc3MpIHJldHVybiAiaSI7CiAgICBpZiAoY2xzID09IGNvbW1vbkVsZW1lbnRzLmpzTnVtYmVyQ2xhc3MpIHJldHVybiAibiI7CiAgICBpZiAoY2xzID09IGNvbW1vbkVsZW1lbnRzLmpzTnVsbENsYXNzKSByZXR1cm4gInUiOwogICAgaWYgKGNscyA9PSBjb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzcykgcmV0dXJuICJiIjsKICAgIGlmIChjbHMgPT0gY29tbW9uRWxlbWVudHMuanNJbnRlcmNlcHRvckNsYXNzKSByZXR1cm4gIkkiOwogICAgcmV0dXJuIGNscy5uYW1lOwogIH0KCiAgTGlzdDxTdHJpbmc+IG5hbWVzID0gY2xhc3NlcwogICAgICAud2hlcmUoKGNscykgPT4gIW5hdGl2ZURhdGEuaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoY2xzKSkKICAgICAgLm1hcChhYmJyZXZpYXRlKQogICAgICAudG9MaXN0KCk7CiAgLy8gVGhlcmUgaXMgb25lIGRpc3BhdGNoIG1lY2hhbmlzbSBmb3IgYWxsIG5hdGl2ZSBjbGFzc2VzLgogIGlmIChjbGFzc2VzLmFueSgoY2xzKSA9PiBuYXRpdmVEYXRhLmlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKGNscykpKSB7CiAgICBuYW1lcy5hZGQoIngiKTsKICB9CiAgLy8gU29ydCB0aGUgbmFtZXMgb2YgdGhlIGNsYXNzZXMgYWZ0ZXIgYWJicmV2aWF0aW5nIHRoZW0gdG8gZW5zdXJlCiAgLy8gdGhlIHN1ZmZpeCBpcyBzdGFibGUgYW5kIHByZWRpY3RhYmxlIGZvciB0aGUgc3VnZ2VzdGVkIG5hbWVzLgogIG5hbWVzLnNvcnQoKTsKICByZXR1cm4gbmFtZXMuam9pbigpOwp9CgovLy8gR2VuZXJhdG9yIG9mIG5hbWVzIGZvciBbQ29uc3RhbnRWYWx1ZV0gdmFsdWVzLgovLy8KLy8vIFRoZSBuYW1lcyBhcmUgc3RhYmxlIHVuZGVyIHBlcnR1cmJhdGlvbnMgb2YgdGhlIHNvdXJjZS4gIFRoZSBuYW1lIGlzIGVpdGhlcgovLy8gYSBzaG9ydCBzZXF1ZW5jZSBvZiB3b3JkcywgaWYgdGhpcyBjYW4gYmUgZm91bmQgZnJvbSB0aGUgY29uc3RhbnQsIG9yIGEgdHlwZQovLy8gZm9sbG93ZWQgYnkgYSBoYXNoIHRhZy4KLy8vCi8vLyAgICAgTGlzdF9pbVggICAgICAgICAgICAgICAgLy8gQSBMaXN0LCB3aXRoIGhhc2ggdGFnLgovLy8gICAgIENfU2VudGluZWwgICAgICAgICAgICAgIC8vIGNvbnN0IFNlbnRpbmVsKCksICAiQ18iIGFkZGVkIHRvIGF2b2lkIGNsYXNoCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB3aXRoIGNsYXNzIG5hbWUuCi8vLyAgICAgSlNJbnRfbWV0aG9kcyAgICAgICAgICAgLy8gYW4gaW50ZXJjZXB0b3IuCi8vLyAgICAgRHVyYXRpb25fMTYwMDAgICAgICAgICAgLy8gY29uc3QgRHVyYXRpb24obWlsbGlzZWNvbmRzOiAxNikKLy8vICAgICBFdmVudEtleVByb3ZpZGVyX2tleXVwICAvLyBjb25zdCBFdmVudEtleVByb3ZpZGVyKCdrZXl1cCcpCi8vLwpjbGFzcyBDb25zdGFudE5hbWluZ1Zpc2l0b3IgaW1wbGVtZW50cyBDb25zdGFudFZhbHVlVmlzaXRvciB7CiAgc3RhdGljIGZpbmFsIFJlZ0V4cCBJREVOVElGSUVSID0gbmV3IFJlZ0V4cChyJ15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSokJyk7CiAgc3RhdGljIGNvbnN0IE1BWF9GUkFHTUVOVFMgPSA1OwogIHN0YXRpYyBjb25zdCBNQVhfRVhUUkFfTEVOR1RIID0gMzA7CiAgc3RhdGljIGNvbnN0IERFRkFVTFRfVEFHX0xFTkdUSCA9IDM7CgogIGZpbmFsIE5hbWVyIF9uYW1lcjsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIENvbnN0YW50Q2Fub25pY2FsSGFzaGVyIF9oYXNoZXI7CgogIFN0cmluZyByb290ID0gbnVsbDsgLy8gRmlyc3Qgd29yZCwgdXN1YWxseSBhIHR5cGUgbmFtZS4KICBib29sIGZhaWxlZCA9IGZhbHNlOyAvLyBGYWlsZWQgdG8gZ2VuZXJhdGUgc29tZXRoaW5nIHByZXR0eS4KICBMaXN0PFN0cmluZz4gZnJhZ21lbnRzID0gPFN0cmluZz5bXTsKICBpbnQgbGVuZ3RoID0gMDsKCiAgQ29uc3RhbnROYW1pbmdWaXNpdG9yKHRoaXMuX25hbWVyLCB0aGlzLl9jbG9zZWRXb3JsZCwgdGhpcy5faGFzaGVyKTsKCiAgSkVsZW1lbnRFbnZpcm9ubWVudCBnZXQgX2VsZW1lbnRFbnZpcm9ubWVudCA9PgogICAgICBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50OwogIEpGaWVsZEFuYWx5c2lzIGdldCBfZmllbGRBbmFseXNpcyA9PiBfY2xvc2VkV29ybGQuZmllbGRBbmFseXNpczsKCiAgU3RyaW5nIGdldE5hbWUoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgX3Zpc2l0KGNvbnN0YW50KTsKICAgIGlmIChyb290ID09IG51bGwpIHJldHVybiAnQ09OU1RBTlQnOwogICAgaWYgKGZhaWxlZCkgcmV0dXJuICcke3Jvb3R9XyR7Z2V0SGFzaFRhZyhjb25zdGFudCwgREVGQVVMVF9UQUdfTEVOR1RIKX0nOwogICAgaWYgKGZyYWdtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuICdDXyR7cm9vdH0nOwogICAgcmV0dXJuIGZyYWdtZW50cy5qb2luKCdfJyk7CiAgfQoKICBTdHJpbmcgZ2V0SGFzaFRhZyhDb25zdGFudFZhbHVlIGNvbnN0YW50LCBpbnQgd2lkdGgpID0+CiAgICAgIGhhc2hXb3JkKF9oYXNoZXIuZ2V0SGFzaChjb25zdGFudCksIHdpZHRoKTsKCiAgU3RyaW5nIGhhc2hXb3JkKGludCBoYXNoLCBpbnQgbGVuZ3RoKSB7CiAgICBoYXNoICY9IDB4MWZmZmZmZmY7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGludCBkaWdpdCA9IGhhc2ggJSA2MjsKICAgICAgc2Iud3JpdGUoJzAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ1sKICAgICAgICAgIGRpZ2l0XSk7CiAgICAgIGhhc2ggfi89IDYyOwogICAgICBpZiAoaGFzaCA9PSAwKSBicmVhazsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgdm9pZCBhZGRSb290KFN0cmluZyBmcmFnbWVudCkgewogICAgaWYgKHJvb3QgPT0gbnVsbCAmJiBmcmFnbWVudHMuaXNFbXB0eSkgewogICAgICByb290ID0gZnJhZ21lbnQ7CiAgICB9CiAgICBhZGQoZnJhZ21lbnQpOwogIH0KCiAgdm9pZCBhZGQoU3RyaW5nIGZyYWdtZW50KSB7CiAgICBhc3NlcnQoZnJhZ21lbnQubGVuZ3RoID4gMCk7CiAgICBmcmFnbWVudHMuYWRkKGZyYWdtZW50KTsKICAgIGxlbmd0aCArPSBmcmFnbWVudC5sZW5ndGg7CiAgICBpZiAoZnJhZ21lbnRzLmxlbmd0aCA+IE1BWF9GUkFHTUVOVFMpIGZhaWxlZCA9IHRydWU7CiAgICBpZiAocm9vdCAhPSBudWxsICYmIGxlbmd0aCA+IHJvb3QubGVuZ3RoICsgMSArIE1BWF9FWFRSQV9MRU5HVEgpIHsKICAgICAgZmFpbGVkID0gdHJ1ZTsKICAgIH0KICB9CgogIHZvaWQgYWRkSWRlbnRpZmllcihTdHJpbmcgZnJhZ21lbnQpIHsKICAgIGlmIChmcmFnbWVudC5sZW5ndGggPD0gTUFYX0VYVFJBX0xFTkdUSCAmJiBJREVOVElGSUVSLmhhc01hdGNoKGZyYWdtZW50KSkgewogICAgICBhZGQoZnJhZ21lbnQpOwogICAgfSBlbHNlIHsKICAgICAgZmFpbGVkID0gdHJ1ZTsKICAgIH0KICB9CgogIHZvaWQgX3Zpc2l0KENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgIGNvbnN0YW50LmFjY2VwdCh0aGlzLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvbihGdW5jdGlvbkNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgYWRkKGNvbnN0YW50LmVsZW1lbnQubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFudGlhdGlvbihJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBfdmlzaXQoY29uc3RhbnQuZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE51bGwoTnVsbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgYWRkKCdudWxsJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Tm9uQ29uc3RhbnQoTm9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBhZGQoJ251bGwnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnQoSW50Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICAvLyBObyBgYWRkUm9vdGAgc2luY2UgSW50Q29uc3RhbnRzIGFyZSBhbHdheXMgaW5saW5lZC4KICAgIGlmIChjb25zdGFudC5pbnRWYWx1ZSA8IEJpZ0ludC56ZXJvKSB7CiAgICAgIGFkZCgnbSR7LWNvbnN0YW50LmludFZhbHVlfScpOwogICAgfSBlbHNlIHsKICAgICAgYWRkKCcke2NvbnN0YW50LmludFZhbHVlfScpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvdWJsZShEb3VibGVDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIGZhaWxlZCA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm9vbChCb29sQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBhZGQoY29uc3RhbnQuaXNUcnVlID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nKFN0cmluZ0NvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgLy8gTm8gYGFkZFJvb3RgIHNpbmNlIHN0cmluZyBjb25zdGFudHMgYXJlIGFsd2F5cyBpbmxpbmVkLgogICAgYWRkSWRlbnRpZmllcihjb25zdGFudC5zdHJpbmdWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlzdChMaXN0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICAvLyBUT0RPKDk0NzYpOiBJbmNvcnBvcmF0ZSB0eXBlIHBhcmFtZXRlcnMgaW50byBuYW1lLgogICAgYWRkUm9vdCgnTGlzdCcpOwogICAgaW50IGxlbmd0aCA9IGNvbnN0YW50Lmxlbmd0aDsKICAgIGlmIChjb25zdGFudC5sZW5ndGggPT0gMCkgewogICAgICBhZGQoJ2VtcHR5Jyk7CiAgICB9IGVsc2UgaWYgKGxlbmd0aCA+PSBNQVhfRlJBR01FTlRTKSB7CiAgICAgIGZhaWxlZCA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgX3Zpc2l0KGNvbnN0YW50LmVudHJpZXNbaV0pOwogICAgICAgIGlmIChmYWlsZWQpIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0KFNldENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgLy8gVE9ETyg5NDc2KTogSW5jb3Jwb3JhdGUgdHlwZSBwYXJhbWV0ZXJzIGludG8gbmFtZS4KICAgIGFkZFJvb3QoJ1NldCcpOwogICAgaWYgKGNvbnN0YW50Lmxlbmd0aCA9PSAwKSB7CiAgICAgIGFkZCgnZW1wdHknKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZChnZXRIYXNoVGFnKGNvbnN0YW50LCA1KSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TWFwKGNvdmFyaWFudCBjb25zdGFudF9zeXN0ZW0uSmF2YVNjcmlwdE1hcENvbnN0YW50IGNvbnN0YW50LCBbX10pIHsKICAgIC8vIFRPRE8oOTQ3Nik6IEluY29ycG9yYXRlIHR5cGUgcGFyYW1ldGVycyBpbnRvIG5hbWUuCiAgICBhZGRSb290KCdNYXAnKTsKICAgIGlmIChjb25zdGFudC5sZW5ndGggPT0gMCkgewogICAgICBhZGQoJ2VtcHR5Jyk7CiAgICB9IGVsc2UgewogICAgICAvLyBVc2luZyBzb21lIGJpdHMgZnJvbSB0aGUga2V5cyBoYXNoIHRhZyBncm91cHMgdGhlIG5hbWVzIE1hcHMgd2l0aCB0aGUKICAgICAgLy8gc2FtZSBzdHJ1Y3R1cmUuCiAgICAgIGFkZChnZXRIYXNoVGFnKGNvbnN0YW50LmtleUxpc3QsIDIpICsgZ2V0SGFzaFRhZyhjb25zdGFudCwgMykpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0cnVjdGVkKENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBhZGRSb290KGNvbnN0YW50LnR5cGUuZWxlbWVudC5uYW1lKTsKCiAgICAvLyBSZWNvZ25pemUgZW51bSBjb25zdGFudHMgYW5kIG9ubHkgaW5jbHVkZSB0aGUgaW5kZXguCiAgICBmaW5hbCBNYXA8RmllbGRFbnRpdHksIENvbnN0YW50VmFsdWU+IGZpZWxkTWFwID0gY29uc3RhbnQuZmllbGRzOwogICAgaW50IHNpemUgPSBmaWVsZE1hcC5sZW5ndGg7CiAgICBpZiAoc2l6ZSA9PSAxIHx8IHNpemUgPT0gMikgewogICAgICBGaWVsZEVudGl0eSBpbmRleEZpZWxkOwogICAgICBmb3IgKEZpZWxkRW50aXR5IGZpZWxkIGluIGZpZWxkTWFwLmtleXMpIHsKICAgICAgICBTdHJpbmcgbmFtZSA9IGZpZWxkLm5hbWU7CiAgICAgICAgaWYgKG5hbWUgPT0gJ2luZGV4JykgewogICAgICAgICAgaW5kZXhGaWVsZCA9IGZpZWxkOwogICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnX25hbWUnKSB7CiAgICAgICAgICAvLyBJZ25vcmUgX25hbWUgZmllbGQuCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluZGV4RmllbGQgPSBudWxsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpbmRleEZpZWxkICE9IG51bGwpIHsKICAgICAgICBfdmlzaXQoY29uc3RhbnQuZmllbGRzW2luZGV4RmllbGRdKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIHNob3VsZCBiZSBhY2Nlc3NlZCBmcm9tIGEgY29kZWdlbiBjbG9zZWQgd29ybGQuCiAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hJbnN0YW5jZUZpZWxkKGNvbnN0YW50LnR5cGUuZWxlbWVudCwKICAgICAgICAoXywgRmllbGRFbnRpdHkgZmllbGQpIHsKICAgICAgaWYgKGZhaWxlZCkgcmV0dXJuOwogICAgICBpZiAoX2ZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKGZpZWxkKS5pc0VsaWRlZCkgcmV0dXJuOwogICAgICBfdmlzaXQoY29uc3RhbnQuZmllbGRzW2ZpZWxkXSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlKFR5cGVDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIC8vIEdlbmVyYXRlcyBzb21ldGhpbmcgbGlrZSAnVHlwZV9TdHJpbmdfazhGJywgdXNpbmcgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZQogICAgLy8gdHlwZSBhbmQgYSBoYXNoIHRvIGRpc2FtYmlndWF0ZSB0aGUgc2FtZSBuYW1lIGluIGRpZmZlcmVudCBsaWJyYXJpZXMuCiAgICBhZGRSb290KCdUeXBlJyk7CiAgICBEYXJ0VHlwZSB0eXBlID0gY29uc3RhbnQucmVwcmVzZW50ZWRUeXBlOwogICAgU3RyaW5nIG5hbWU7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIG5hbWUgPSB0eXBlLmVsZW1lbnQubmFtZTsKICAgIH0gZWxzZSBpZiAodHlwZSBpcyBUeXBlZGVmVHlwZSkgewogICAgICBuYW1lID0gdHlwZS5lbGVtZW50Lm5hbWU7CiAgICB9CiAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgIC8vIGUuZy4gRGFydFR5cGUgJ2R5bmFtaWMnIGhhcyBubyBlbGVtZW50LgogICAgICBuYW1lID0gX25hbWVyLmdldFR5cGVSZXByZXNlbnRhdGlvbkZvclR5cGVDb25zdGFudCh0eXBlKTsKICAgIH0KICAgIGFkZElkZW50aWZpZXIobmFtZSk7CiAgICBhZGQoZ2V0SGFzaFRhZyhjb25zdGFudCwgMykpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVyY2VwdG9yKEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICAvLyBUaGUgY2xhc3MgbmFtZSBmb3IgbWl4aW4gYXBwbGljYXRpb25zIGNvbnRhaW4gJysnIHNpZ25zIChpc3N1ZSAyODE5NikuCiAgICBhZGRSb290KGNvbnN0YW50LmNscy5uYW1lLnJlcGxhY2VBbGwoJysnLCAnXycpKTsKICAgIGFkZCgnbWV0aG9kcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdER1bW15SW50ZXJjZXB0b3IoRHVtbXlJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgYWRkKCdkdW1teV9pbnRlcmNlcHRvcicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFVucmVhY2hhYmxlKFVucmVhY2hhYmxlQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBhZGQoJ3VucmVhY2hhYmxlJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SnNOYW1lKEpzTmFtZUNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgYWRkKCduYW1lJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RGVmZXJyZWRHbG9iYWwoRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIGFkZFJvb3QoJ0RlZmVycmVkJyk7CiAgfQp9CgovLy8gR2VuZXJhdGVzIGNhbm9uaWNhbCBoYXNoIHZhbHVlcyBmb3IgW0NvbnN0YW50VmFsdWVdcy4KLy8vCi8vLyBVbmZvcnR1bmF0ZWx5LCBbQ29uc3RhbnQuaGFzaENvZGVdIGlzIG5vdCBzdGFibGUgdW5kZXIgbWlub3IgcGVydHVyYmF0aW9ucywKLy8vIHNvIGl0IGNhbid0IGJlIHVzZWQgZm9yIGdlbmVyYXRpbmcgbmFtZXMuICBUaGlzIGhhc2hlciBrZWVwcyBjb25zaXN0ZW5jeQovLy8gYmV0d2VlbiBydW5zIGJ5IGJhc2luZyBoYXNoIHZhbHVlcyBvZiB0aGUgbmFtZXMgb2YgZWxlbWVudHMsIHJhdGhlciB0aGFuCi8vLyB0aGVpciBoYXNoQ29kZXMuCmNsYXNzIENvbnN0YW50Q2Fub25pY2FsSGFzaGVyIGltcGxlbWVudHMgQ29uc3RhbnRWYWx1ZVZpc2l0b3I8aW50LCBOdWxsPiB7CiAgc3RhdGljIGNvbnN0IF9NQVNLID0gMHgxZmZmZmZmZjsKICBzdGF0aWMgY29uc3QgX1VJTlQzMl9MSU1JVCA9IDQgKiAxMDI0ICogMTAyNCAqIDEwMjQ7CgogIGZpbmFsIE5hbWVyIF9uYW1lcjsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIE1hcDxDb25zdGFudFZhbHVlLCBpbnQ+IF9oYXNoZXMgPSB7fTsKCiAgQ29uc3RhbnRDYW5vbmljYWxIYXNoZXIodGhpcy5fbmFtZXIsIHRoaXMuX2Nsb3NlZFdvcmxkKTsKCiAgSkVsZW1lbnRFbnZpcm9ubWVudCBnZXQgX2VsZW1lbnRFbnZpcm9ubWVudCA9PgogICAgICBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50OwogIEpGaWVsZEFuYWx5c2lzIGdldCBfZmllbGRBbmFseXNpcyA9PiBfY2xvc2VkV29ybGQuZmllbGRBbmFseXNpczsKCiAgaW50IGdldEhhc2goQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgPT4gX3Zpc2l0KGNvbnN0YW50KTsKCiAgaW50IF92aXNpdChDb25zdGFudFZhbHVlIGNvbnN0YW50KSB7CiAgICBpbnQgaGFzaCA9IF9oYXNoZXNbY29uc3RhbnRdOwogICAgaWYgKGhhc2ggPT0gbnVsbCkgewogICAgICBoYXNoID0gX2ZpbmlzaChjb25zdGFudC5hY2NlcHQodGhpcywgbnVsbCkpOwogICAgICBfaGFzaGVzW2NvbnN0YW50XSA9IGhhc2g7CiAgICB9CiAgICByZXR1cm4gaGFzaDsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdE51bGwoTnVsbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgPT4gMTsKCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0Tm9uQ29uc3RhbnQoTm9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSA9PiAxOwoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRCb29sKEJvb2xDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIHJldHVybiBjb25zdGFudC5pc1RydWUgPyAyIDogMzsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdEZ1bmN0aW9uKEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICByZXR1cm4gX2hhc2hTdHJpbmcoMSwgY29uc3RhbnQuZWxlbWVudC5uYW1lKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdEluc3RhbnRpYXRpb24oSW5zdGFudGlhdGlvbkNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgcmV0dXJuIF92aXNpdChjb25zdGFudC5mdW5jdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRJbnQoSW50Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBCaWdJbnQgdmFsdWUgPSBjb25zdGFudC5pbnRWYWx1ZTsKICAgIGlmICh2YWx1ZS50b1NpZ25lZCgzMikgPT0gdmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlLnRvVW5zaWduZWQoMzIpLnRvSW50KCkgJiBfTUFTSzsKICAgIH0KICAgIHJldHVybiBfaGFzaERvdWJsZSh2YWx1ZS50b0RvdWJsZSgpKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdERvdWJsZShEb3VibGVDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIHJldHVybiBfaGFzaERvdWJsZShjb25zdGFudC5kb3VibGVWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRTdHJpbmcoU3RyaW5nQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICByZXR1cm4gX2hhc2hTdHJpbmcoMiwgY29uc3RhbnQuc3RyaW5nVmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0TGlzdChMaXN0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICByZXR1cm4gX2hhc2hMaXN0KGNvbnN0YW50Lmxlbmd0aCwgY29uc3RhbnQuZW50cmllcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRTZXQoU2V0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICByZXR1cm4gX2hhc2hMaXN0KGNvbnN0YW50Lmxlbmd0aCwgY29uc3RhbnQudmFsdWVzKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdE1hcChNYXBDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIGludCBoYXNoID0gX2hhc2hMaXN0KGNvbnN0YW50Lmxlbmd0aCwgY29uc3RhbnQua2V5cyk7CiAgICByZXR1cm4gX2hhc2hMaXN0KGhhc2gsIGNvbnN0YW50LnZhbHVlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRDb25zdHJ1Y3RlZChDb25zdHJ1Y3RlZENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgaW50IGhhc2ggPSBfaGFzaFN0cmluZygzLCBjb25zdGFudC50eXBlLmVsZW1lbnQubmFtZSk7CiAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hJbnN0YW5jZUZpZWxkKGNvbnN0YW50LnR5cGUuZWxlbWVudCwKICAgICAgICAoXywgRmllbGRFbnRpdHkgZmllbGQpIHsKICAgICAgaWYgKF9maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShmaWVsZCkuaXNFbGlkZWQpIHJldHVybjsKICAgICAgaGFzaCA9IF9jb21iaW5lKGhhc2gsIF92aXNpdChjb25zdGFudC5maWVsZHNbZmllbGRdKSk7CiAgICB9KTsKICAgIHJldHVybiBoYXNoOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0VHlwZShUeXBlQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gY29uc3RhbnQucmVwcmVzZW50ZWRUeXBlOwogICAgLy8gVGhpcyBuYW1lIGluY2x1ZGVzIHRoZSBsaWJyYXJ5IG5hbWUgYW5kIHR5cGUgcGFyYW1ldGVycy4KICAgIFN0cmluZyBuYW1lID0gX25hbWVyLmdldFR5cGVSZXByZXNlbnRhdGlvbkZvclR5cGVDb25zdGFudCh0eXBlKTsKICAgIHJldHVybiBfaGFzaFN0cmluZyg0LCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdEludGVyY2VwdG9yKEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBTdHJpbmcgdHlwZU5hbWUgPSBjb25zdGFudC5jbHMubmFtZTsKICAgIHJldHVybiBfaGFzaFN0cmluZyg1LCB0eXBlTmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXREdW1teUludGVyY2VwdG9yKER1bW15SW50ZXJjZXB0b3JDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIHRocm93IGZhaWxlZEF0KAogICAgICAgIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAnRHVtbXlJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgc2hvdWxkIG5ldmVyIGJlIG5hbWVkIGFuZCAnCiAgICAgICAgJ25ldmVyIGJlIHN1YmNvbnN0YW50Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRVbnJlYWNoYWJsZShVbnJlYWNoYWJsZUNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgdGhyb3cgZmFpbGVkQXQoCiAgICAgICAgTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICdVbnJlYWNoYWJsZUNvbnN0YW50VmFsdWUgc2hvdWxkIG5ldmVyIGJlIG5hbWVkIGFuZCAnCiAgICAgICAgJ25ldmVyIGJlIHN1YmNvbnN0YW50Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRKc05hbWUoSnNOYW1lQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICB0aHJvdyBmYWlsZWRBdCgKICAgICAgICBOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgJ0pzTmFtZUNvbnN0YW50VmFsdWUgc2hvdWxkIG5ldmVyIGJlIG5hbWVkIGFuZCAnCiAgICAgICAgJ25ldmVyIGJlIHN1YmNvbnN0YW50Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXREZWZlcnJlZEdsb2JhbChEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgaW50IGhhc2ggPSBjb25zdGFudC51bml0Lmhhc2hDb2RlOwogICAgcmV0dXJuIF9jb21iaW5lKGhhc2gsIF92aXNpdChjb25zdGFudC5yZWZlcmVuY2VkKSk7CiAgfQoKICBpbnQgX2hhc2hTdHJpbmcoaW50IGhhc2gsIFN0cmluZyBzKSB7CiAgICBpbnQgbGVuZ3RoID0gcy5sZW5ndGg7CiAgICBoYXNoID0gX2NvbWJpbmUoaGFzaCwgbGVuZ3RoKTsKICAgIC8vIEluY3JlYXNpbmcgc3RyaWRlIGlzIE8obG9nIE4pIG9uIGxhcmdlIHN0cmluZ3Mgd2hpY2ggYXJlIHVubGlrZWx5IHRvIGhhdmUKICAgIC8vIG1hbnkgY29sbGlzaW9ucy4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEgKyAoaSA+PiAyKSkgewogICAgICBoYXNoID0gX2NvbWJpbmUoaGFzaCwgcy5jb2RlVW5pdEF0KGkpKTsKICAgIH0KICAgIHJldHVybiBoYXNoOwogIH0KCiAgaW50IF9oYXNoTGlzdChpbnQgaGFzaCwgTGlzdDxDb25zdGFudFZhbHVlPiBjb25zdGFudHMpIHsKICAgIGZvciAoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCBpbiBjb25zdGFudHMpIHsKICAgICAgaGFzaCA9IF9jb21iaW5lKGhhc2gsIF92aXNpdChjb25zdGFudCkpOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBzdGF0aWMgaW50IF9oYXNoSW50KGludCB2YWx1ZSkgewogICAgaWYgKHZhbHVlLmFicygpIDwgX1VJTlQzMl9MSU1JVCkgcmV0dXJuIF9NQVNLICYgdmFsdWU7CiAgICByZXR1cm4gX2hhc2hEb3VibGUodmFsdWUudG9Eb3VibGUoKSk7CiAgfQoKICBzdGF0aWMgaW50IF9oYXNoRG91YmxlKGRvdWJsZSB2YWx1ZSkgewogICAgZG91YmxlIG1hZ25pdHVkZSA9IHZhbHVlLmFicygpOwogICAgaW50IHNpZ24gPSB2YWx1ZSA8IDAgPyAxIDogMDsKICAgIGlmIChtYWduaXR1ZGUgPCBfVUlOVDMyX0xJTUlUKSB7CiAgICAgIC8vIDJeMzIKICAgICAgaW50IGludFZhbHVlID0gdmFsdWUudG9JbnQoKTsKICAgICAgLy8gSW50ZWdlciB2YWx1ZWQgZG91YmxlcyBpbiAzMi1iaXQgcmFuZ2UgaGFzaCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgaW50cy4KICAgICAgaW50IGhhc2ggPSBfaGFzaEludChpbnRWYWx1ZSk7CiAgICAgIGlmICh2YWx1ZSA9PSBpbnRWYWx1ZSkgcmV0dXJuIGhhc2g7CiAgICAgIGhhc2ggPSBfY29tYmluZShoYXNoLCBzaWduKTsKICAgICAgaW50IGZyYWN0aW9uID0gKChtYWduaXR1ZGUgLSBpbnRWYWx1ZS5hYnMoKSkgKiAoX01BU0sgKyAxKSkudG9JbnQoKTsKICAgICAgaGFzaCA9IF9jb21iaW5lKGhhc2gsIGZyYWN0aW9uKTsKICAgICAgcmV0dXJuIGhhc2g7CiAgICB9IGVsc2UgaWYgKHZhbHVlLmlzSW5maW5pdGUpIHsKICAgICAgcmV0dXJuIF9jb21iaW5lKDYsIHNpZ24pOwogICAgfSBlbHNlIGlmICh2YWx1ZS5pc05hTikgewogICAgICByZXR1cm4gNzsKICAgIH0gZWxzZSB7CiAgICAgIGludCBoYXNoID0gMDsKICAgICAgd2hpbGUgKG1hZ25pdHVkZSA+PSBfVUlOVDMyX0xJTUlUKSB7CiAgICAgICAgbWFnbml0dWRlID0gbWFnbml0dWRlIC8gX1VJTlQzMl9MSU1JVDsKICAgICAgICBoYXNoKys7CiAgICAgIH0KICAgICAgaGFzaCA9IF9jb21iaW5lKGhhc2gsIHNpZ24pOwogICAgICByZXR1cm4gX2NvbWJpbmUoaGFzaCwgX2hhc2hEb3VibGUobWFnbml0dWRlKSk7CiAgICB9CiAgfQoKICAvLy8gW19jb21iaW5lXSBhbmQgW19maW5pc2hdIGFyZSBwYXJ0cyBvZiB0aGUgW0plbmtpbnMgaGFzaCBmdW5jdGlvbl1bMV0sCiAgLy8vIG1vZGlmaWVkIGJ5IHVzaW5nIG1hc2tpbmcgdG8ga2VlcCB2YWx1ZXMgaW4gU01JIHJhbmdlLgogIC8vLwogIC8vLyBbMV06IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSmVua2luc19oYXNoX2Z1bmN0aW9uCiAgc3RhdGljIGludCBfY29tYmluZShpbnQgaGFzaCwgaW50IHZhbHVlKSB7CiAgICBoYXNoID0gX01BU0sgJiAoaGFzaCArIHZhbHVlKTsKICAgIGhhc2ggPSBfTUFTSyAmIChoYXNoICsgKCgoX01BU0sgPj4gMTApICYgaGFzaCkgPDwgMTApKTsKICAgIGhhc2ggPSBoYXNoIF4gKGhhc2ggPj4gNik7CiAgICByZXR1cm4gaGFzaDsKICB9CgogIHN0YXRpYyBpbnQgX2ZpbmlzaChpbnQgaGFzaCkgewogICAgaGFzaCA9IF9NQVNLICYgKGhhc2ggKyAoKChfTUFTSyA+PiAzKSAmIGhhc2gpIDw8IDMpKTsKICAgIGhhc2ggPSBoYXNoICYgKGhhc2ggPj4gMTEpOwogICAgcmV0dXJuIF9NQVNLICYgKGhhc2ggKyAoKChfTUFTSyA+PiAxNSkgJiBoYXNoKSA8PCAxNSkpOwogIH0KfQoKY2xhc3MgRnVuY3Rpb25UeXBlTmFtZXIgZXh0ZW5kcyBCYXNlRGFydFR5cGVWaXNpdG9yIHsKICBTdHJpbmdCdWZmZXIgc2I7CgogIEZ1bmN0aW9uVHlwZU5hbWVyKCk7CgogIFN0cmluZyBjb21wdXRlTmFtZShEYXJ0VHlwZSB0eXBlKSB7CiAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHZpc2l0KHR5cGUpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdChEYXJ0VHlwZSB0eXBlLCBbX10pIHsKICAgIHR5cGUuYWNjZXB0KHRoaXMsIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUeXBlKERhcnRUeXBlIHR5cGUsIF8pIHt9CgogIEBvdmVycmlkZQogIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUsIF8pIHsKICAgIHNiLndyaXRlKHR5cGUuZWxlbWVudC5uYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgdHlwZSwgXykgewogICAgc2Iud3JpdGUodHlwZS5lbGVtZW50Lm5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUeXBlVmFyaWFibGVUeXBlKFR5cGVWYXJpYWJsZVR5cGUgdHlwZSwgXykgewogICAgc2Iud3JpdGUodHlwZS5lbGVtZW50Lm5hbWUpOwogIH0KCiAgYm9vbCBfaXNTaW1wbGVGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIHR5cGUpIHsKICAgIGlmICghdHlwZS5yZXR1cm5UeXBlLmlzRHluYW1pYykgcmV0dXJuIGZhbHNlOwogICAgaWYgKCF0eXBlLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMuaXNFbXB0eSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKCF0eXBlLm5hbWVkUGFyYW1ldGVyVHlwZXMuaXNFbXB0eSkgcmV0dXJuIGZhbHNlOwogICAgZm9yIChEYXJ0VHlwZSBwYXJhbWV0ZXIgaW4gdHlwZS5wYXJhbWV0ZXJUeXBlcykgewogICAgICBpZiAoIXBhcmFtZXRlci5pc0R5bmFtaWMpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIHR5cGUsIF8pIHsKICAgIGlmIChfaXNTaW1wbGVGdW5jdGlvblR5cGUodHlwZSkpIHsKICAgICAgc2Iud3JpdGUoJ2FyZ3Mke3R5cGUucGFyYW1ldGVyVHlwZXMubGVuZ3RofScpOwogICAgICByZXR1cm47CiAgICB9CiAgICB2aXNpdCh0eXBlLnJldHVyblR5cGUpOwogICAgc2Iud3JpdGUoJ18nKTsKICAgIGZvciAoRGFydFR5cGUgcGFyYW1ldGVyIGluIHR5cGUucGFyYW1ldGVyVHlwZXMpIHsKICAgICAgc2Iud3JpdGUoJ18nKTsKICAgICAgdmlzaXQocGFyYW1ldGVyKTsKICAgIH0KICAgIGJvb2wgZmlyc3QgPSBmYWxzZTsKICAgIGZvciAoRGFydFR5cGUgcGFyYW1ldGVyIGluIHR5cGUub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcykgewogICAgICBpZiAoIWZpcnN0KSB7CiAgICAgICAgc2Iud3JpdGUoJ18nKTsKICAgICAgfQogICAgICBzYi53cml0ZSgnXycpOwogICAgICB2aXNpdChwYXJhbWV0ZXIpOwogICAgICBmaXJzdCA9IHRydWU7CiAgICB9CiAgICBpZiAoIXR5cGUubmFtZWRQYXJhbWV0ZXJUeXBlcy5pc0VtcHR5KSB7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIGZvciAoRGFydFR5cGUgcGFyYW1ldGVyIGluIHR5cGUubmFtZWRQYXJhbWV0ZXJUeXBlcykgewogICAgICAgIGlmICghZmlyc3QpIHsKICAgICAgICAgIHNiLndyaXRlKCdfJyk7CiAgICAgICAgfQogICAgICAgIHNiLndyaXRlKCdfJyk7CiAgICAgICAgdmlzaXQocGFyYW1ldGVyKTsKICAgICAgICBmaXJzdCA9IHRydWU7CiAgICAgIH0KICAgIH0KICB9Cn0KCmNsYXNzIE5hbWluZ1Njb3BlIHsKICAvLy8gTWFwcyBwcm9wb3NlZCBuYW1lcyB0byAqc3VnZ2VzdGVkKiBkaXNhbWJpZ3VhdGVkIG5hbWVzLgogIC8vLwogIC8vLyBTdWdnZXN0ZWQgbmFtZXMgYXJlIGhpbnRzIHRvIHRoZSBbTWluaWZ5TmFtZXJdLCBzdWdnZXN0aW5nIHRoYXQgYSBzcGVjaWZpYwogIC8vLyBuYW1lcyBiZSBnaXZlbiB0byB0aGUgZmlyc3QgaXRlbSB3aXRoIHRoZSBnaXZlbiBwcm9wb3NlZCBuYW1lLgogIC8vLwogIC8vLyBUaGlzIGlzIGN1cnJlbnRseSB1c2VkIGluIFtNaW5pZnlOYW1lcl0gdG8gYXNzaWduIHZlcnkgc2hvcnQgbWluaWZpZWQKICAvLy8gbmFtZXMgdG8gdGhpbmdzIHRoYXQgdGVuZCB0byBiZSB1c2VkIHZlcnkgb2Z0ZW4uCiAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBfc3VnZ2VzdGVkTmFtZXMgPSB7fTsKICBmaW5hbCBTZXQ8U3RyaW5nPiBfdXNlZE5hbWVzID0gU2V0KCk7CgogIGJvb2wgaXNVc2VkKFN0cmluZyBuYW1lKSA9PiBfdXNlZE5hbWVzLmNvbnRhaW5zKG5hbWUpOwogIGJvb2wgaXNVbnVzZWQoU3RyaW5nIG5hbWUpID0+ICFfdXNlZE5hbWVzLmNvbnRhaW5zKG5hbWUpOwogIGJvb2wgcmVnaXN0ZXJVc2UoU3RyaW5nIG5hbWUpID0+IF91c2VkTmFtZXMuYWRkKG5hbWUpOwoKICBTdHJpbmcgc3VnZ2VzdE5hbWUoU3RyaW5nIG9yaWdpbmFsKSA9PiBfc3VnZ2VzdGVkTmFtZXNbb3JpZ2luYWxdOwogIHZvaWQgYWRkU3VnZ2VzdGlvbihTdHJpbmcgb3JpZ2luYWwsIFN0cmluZyBzdWdnZXN0aW9uKSB7CiAgICBhc3NlcnQoIV9zdWdnZXN0ZWROYW1lcy5jb250YWluc0tleShvcmlnaW5hbCkpOwogICAgX3N1Z2dlc3RlZE5hbWVzW29yaWdpbmFsXSA9IHN1Z2dlc3Rpb247CiAgfQoKICBib29sIGhhc1N1Z2dlc3Rpb24oU3RyaW5nIG9yaWdpbmFsKSA9PiBfc3VnZ2VzdGVkTmFtZXMuY29udGFpbnNLZXkob3JpZ2luYWwpOwogIGJvb2wgaXNTdWdnZXN0aW9uKFN0cmluZyBjYW5kaWRhdGUpIHsKICAgIHJldHVybiBfc3VnZ2VzdGVkTmFtZXMuY29udGFpbnNWYWx1ZShjYW5kaWRhdGUpOwogIH0KfQoKLy8vIEZpeGVkIG5hbWVzIHVzYWdlIGJ5IHRoZSBuYW1lci4KY2xhc3MgRml4ZWROYW1lcyB7CiAgY29uc3QgRml4ZWROYW1lcygpOwoKICBTdHJpbmcgZ2V0IGdldHRlclByZWZpeCA9PiByJ2dldCQnOwogIFN0cmluZyBnZXQgc2V0dGVyUHJlZml4ID0+IHInc2V0JCc7CiAgU3RyaW5nIGdldCBjYWxsUHJlZml4ID0+ICdjYWxsJzsKICBTdHJpbmcgZ2V0IGNhbGxDYXRjaEFsbE5hbWUgPT4gcidjYWxsKic7CiAgU3RyaW5nIGdldCBjYWxsTmFtZUZpZWxkID0+IHInJGNhbGxOYW1lJzsKICBTdHJpbmcgZ2V0IHJlZmxlY3RhYmxlRmllbGQgPT4gcickcmVmbGVjdGFibGUnOwogIFN0cmluZyBnZXQgY2xhc3NEZXNjcmlwdG9yUHJvcGVydHkgPT4gcideJzsKICBTdHJpbmcgZ2V0IGRlZmF1bHRWYWx1ZXNGaWVsZCA9PiByJyRkZWZhdWx0VmFsdWVzJzsKICBTdHJpbmcgZ2V0IGRlZmVycmVkQWN0aW9uID0+IHInJGRlZmVycmVkQWN0aW9uJzsKICBTdHJpbmcgZ2V0IG9wZXJhdG9ySXNQcmVmaXggPT4gcickaXMnOwogIFN0cmluZyBnZXQgb3BlcmF0b3JBc1ByZWZpeCA9PiByJyRhcyc7CiAgU3RyaW5nIGdldCBvcGVyYXRvclNpZ25hdHVyZSA9PiByJyRzaWduYXR1cmUnOwogIFN0cmluZyBnZXQgcmVxdWlyZWRQYXJhbWV0ZXJGaWVsZCA9PiByJyRyZXF1aXJlZEFyZ0NvdW50JzsKICBTdHJpbmcgZ2V0IHJ0aU5hbWUgPT4gcickdGknOwp9CgovLy8gTWluaWZpZWQgdmVyc2lvbiBvZiB0aGUgZml4ZWQgbmFtZXMgdXNhZ2UgYnkgdGhlIG5hbWVyLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIHNob3VsZCBpbXBsZW1lbnQgW0ZpeGVkTmFtZXNdIGFuZCBtaW5pZnkgYWxsIGZpeGVkCi8vIG5hbWVzLgpjbGFzcyBNaW5pZmllZEZpeGVkTmFtZXMgZXh0ZW5kcyBGaXhlZE5hbWVzIHsKICBjb25zdCBNaW5pZmllZEZpeGVkTmFtZXMoKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBnZXR0ZXJQcmVmaXggPT4gJ2cnOwogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgc2V0dGVyUHJlZml4ID0+ICdzJzsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGNhbGxQcmVmaXggPT4gJyc7IC8vIHRoaXMgd2lsbCBjcmVhdGUgZnVuY3Rpb24gbmFtZXMgJDxuPgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgb3BlcmF0b3JJc1ByZWZpeCA9PiByJyRpJzsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG9wZXJhdG9yQXNQcmVmaXggPT4gcickYSc7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBjYWxsQ2F0Y2hBbGxOYW1lID0+IHInJEMnOwogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgcmVxdWlyZWRQYXJhbWV0ZXJGaWVsZCA9PiByJyRSJzsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGRlZmF1bHRWYWx1ZXNGaWVsZCA9PiByJyREJzsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG9wZXJhdG9yU2lnbmF0dXJlID0+IHInJFMnOwp9CgovLy8gTmFtZXIgaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgaW4gbW9kdWxhciBjb2RlIGdlbmVyYXRpb24uCmFic3RyYWN0IGNsYXNzIE1vZHVsYXJOYW1lciB7CiAgRml4ZWROYW1lcyBnZXQgZml4ZWROYW1lczsKICBSdW50aW1lVHlwZVRhZ3MgZ2V0IHJ0aVRhZ3M7CgogIC8vLyBSZXR1cm5zIGEgdmFyaWFibGUgdXNlIGZvciBhY2Nlc3NpbmcgW2xpYnJhcnldLgogIC8vLwogIC8vLyBUaGlzIGlzIG9uZSBvZiB0aGUgW3Jlc2VydmVkR2xvYmFsT2JqZWN0TmFtZXNdCiAganNBc3QuRXhwcmVzc2lvbiByZWFkR2xvYmFsT2JqZWN0Rm9yTGlicmFyeShMaWJyYXJ5RW50aXR5IGxpYnJhcnkpOwoKICAvLy8gUmV0dXJucyBhIHZhcmlhYmxlIHVzZSBmb3IgYWNjZXNzaW5nIHRoZSBjbGFzcyBbZWxlbWVudF0uCiAgLy8vCiAgLy8vIFRoaXMgaXMgb25lIG9mIHRoZSBbcmVzZXJ2ZWRHbG9iYWxPYmplY3ROYW1lc10KICBqc0FzdC5FeHByZXNzaW9uIHJlYWRHbG9iYWxPYmplY3RGb3JDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgYSB2YXJpYWJsZSB1c2UgZm9yIGFjY2Vzc2luZyB0aGUgdHlwZSBbZWxlbWVudF0uCiAgLy8vCiAgLy8vIFRoaXMgaXMgb25lIG9mIHRoZSBbcmVzZXJ2ZWRHbG9iYWxPYmplY3ROYW1lc10KICBqc0FzdC5FeHByZXNzaW9uIHJlYWRHbG9iYWxPYmplY3RGb3JUeXBlKEVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgYSB2YXJpYWJsZSB1c2UgZm9yIGFjY2Vzc2luZyB0aGUgbWVtYmVyIFtlbGVtZW50XS4KICAvLy8KICAvLy8gVGhpcyBpcyBlaXRoZXIgdGhlIFtzdGF0aWNTdGF0ZUhvbGRlcl0gb3Igb25lIG9mIHRoZQogIC8vLyBbcmVzZXJ2ZWRHbG9iYWxPYmplY3ROYW1lc10KICBqc0FzdC5FeHByZXNzaW9uIHJlYWRHbG9iYWxPYmplY3RGb3JNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBhIEphdmFTY3JpcHQgcHJvcGVydHkgbmFtZSB1c2VkIHRvIHN0b3JlIHRoZSBjbGFzcyBbZWxlbWVudF0gb24KICAvLy8gb25lIG9mIHRoZSBnbG9iYWwgb2JqZWN0cy4KICAvLy8KICAvLy8gU2hvdWxkIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBbZ2xvYmFsT2JqZWN0Rm9yQ2xhc3NdLCB3aGljaCBkZW5vdGVzIHRoZQogIC8vLyBvYmplY3Qgb24gd2hpY2ggdGhlIHJldHVybmVkIHByb3BlcnR5IG5hbWUgc2hvdWxkIGJlIHVzZWQuCiAganNBc3QuTmFtZSBnbG9iYWxQcm9wZXJ0eU5hbWVGb3JDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgYSBKYXZhU2NyaXB0IHByb3BlcnR5IG5hbWUgdXNlZCB0byBzdG9yZSB0aGUgbWVtYmVyIFtlbGVtZW50XSBvbgogIC8vLyBvbmUgb2YgdGhlIGdsb2JhbCBvYmplY3RzLgogIC8vLwogIC8vLyBTaG91bGQgYmUgdXNlZCB0b2dldGhlciB3aXRoIFtnbG9iYWxPYmplY3RGb3JNZW1iZXJdLCB3aGljaCBkZW5vdGVzIHRoZQogIC8vLyBvYmplY3Qgb24gd2hpY2ggdGhlIHJldHVybmVkIHByb3BlcnR5IG5hbWUgc2hvdWxkIGJlIHVzZWQuCiAganNBc3QuTmFtZSBnbG9iYWxQcm9wZXJ0eU5hbWVGb3JNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBhIEphdmFTY3JpcHQgcHJvcGVydHkgbmFtZSB1c2VkIHRvIHN0b3JlIHRoZSB0eXBlICh0eXBlZGVmKQogIC8vLyBbZWxlbWVudF0gb24gb25lIG9mIHRoZSBnbG9iYWwgb2JqZWN0cy4KICAvLy8KICAvLy8gU2hvdWxkIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBbZ2xvYmFsT2JqZWN0Rm9yVHlwZV0sIHdoaWNoIGRlbm90ZXMgdGhlCiAgLy8vIG9iamVjdCBvbiB3aGljaCB0aGUgcmV0dXJuZWQgcHJvcGVydHkgbmFtZSBzaG91bGQgYmUgdXNlZC4KICBqc0FzdC5OYW1lIGdsb2JhbFByb3BlcnR5TmFtZUZvclR5cGUoRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBhIG5hbWUsIHRoZSBzdHJpbmcgb2Ygd2hpY2ggaXMgYSBnbG9iYWxseSB1bmlxdWUga2V5IGRpc3RpbmN0IGZyb20KICAvLy8gb3RoZXIgZ2xvYmFsIHByb3BlcnR5IG5hbWVzLgogIC8vLwogIC8vLyBUaGUgbmFtZSBpcyBub3QgbmVjZXNzYXJpbHkgYSB2YWxpZCBKYXZhU2NyaXB0IGlkZW50aWZpZXIsIHNvIGl0IG5lZWRzIHRvCiAgLy8vIGJlIHF1b3RlZC4KICBqc0FzdC5OYW1lIGdsb2JhbE5hbWVGb3JJbnRlcmZhY2VUeXBlVmFyaWFibGUoCiAgICAgIFR5cGVWYXJpYWJsZUVudGl0eSB0eXBlVmFyaWFibGUpOwoKICAvLy8gUmV0dXJucyB0aGUgbmFtZSBmb3IgdGhlIGluc3RhbmNlIGZpZWxkIHRoYXQgaG9sZHMgcnVudGltZSB0eXBlIGFyZ3VtZW50cwogIC8vLyBvbiBnZW5lcmljIGNsYXNzZXMuCiAganNBc3QuTmFtZSBnZXQgcnRpRmllbGRKc05hbWU7CgogIC8vLyBQcm9wZXJ0eSBuYW1lIG9uIHdoaWNoIFttZW1iZXJdIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwKICAvLy8gd2l0aG91dCBjbGFzaGluZyB3aXRoIGFub3RoZXIgSlMgcHJvcGVydHkgbmFtZS4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgc3VwZXItY2FsbHMsIHdoZXJlIG9yZGluYXJ5IGRpc3BhdGNoCiAgLy8vIHNlbWFudGljcyBtdXN0IGJlIGNpcmN1bXZlbnRlZC4gRm9yIGV4YW1wbGU6CiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHsgZm9vKCkgfQogIC8vLyAgICAgY2xhc3MgQiBleHRlbmRzIEEgewogIC8vLyAgICAgICAgIGZvbygpIHsgc3VwZXIuZm9vKCkgfQogIC8vLyAgICAgfQogIC8vLwogIC8vLyBFeGFtcGxlIHRyYW5zbGF0aW9uIHRvIEpTOgogIC8vLwogIC8vLyAgICAgQS5wcm90b3R5cGUuc3VwZXIkQSRmb28gPSBmdW5jdGlvbigpIHsuLi59CiAgLy8vICAgICBBLnByb3RvdHlwZS5mb28kMCA9IEEucHJvdG90eXBlLnN1cGVyJEEkZm9vCiAgLy8vCiAgLy8vICAgICBCLnByb3RvdHlwZS5mb28kMCA9IGZ1bmN0aW9uKCkgewogIC8vLyAgICAgICAgIHRoaXMuc3VwZXIkQSRmb28oKTsgLy8gc3VwZXIuZm9vKCkKICAvLy8gICAgIH0KICAvLy8KICBqc0FzdC5OYW1lIGFsaWFzZWRTdXBlck1lbWJlclByb3BlcnR5TmFtZShNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIFJldHVybnMgdGhlIEphdmFTY3JpcHQgcHJvcGVydHkgbmFtZSB1c2VkIHRvIHN0b3JlIGFuIGluc3RhbmNlIGZpZWxkLgogIGpzQXN0Lk5hbWUgaW5zdGFuY2VGaWVsZFByb3BlcnR5TmFtZShGaWVsZEVudGl0eSBlbGVtZW50KTsKCiAgLy8vIEFubm90YXRlZCBuYW1lIGZvciBbbWV0aG9kXSBlbmNvZGluZyBhcml0eSBhbmQgbmFtZWQgcGFyYW1ldGVycy4KICBqc0FzdC5OYW1lIGluc3RhbmNlTWV0aG9kTmFtZShGdW5jdGlvbkVudGl0eSBtZXRob2QpOwoKICAvLy8gVHJhbnNsYXRlcyBhIFtTdHJpbmddIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgW05hbWVdIGRhdGEgc3RydWN0dXJlIGFzCiAgLy8vIHVzZWQgYnkgdGhlIG5hbWVyLgogIC8vLwogIC8vLyBJZiBbbmFtZV0gaXMgYSBzZXR0ZXIgb3IgZ2V0dGVyIG5hbWUsIHRoZSBjb3JyZXNwb25kaW5nIFtHZXR0ZXJOYW1lXSBvcgogIC8vLyBbU2V0dGVyTmFtZV0gZGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZC4KICBqc0FzdC5OYW1lIGFzTmFtZShTdHJpbmcgbmFtZSk7CgogIC8vLyBBbm5vdGF0ZWQgbmFtZSBmb3IgdGhlIG1lbWJlciBiZWluZyBpbnZva2VkIGJ5IFtzZWxlY3Rvcl0uCiAganNBc3QuTmFtZSBpbnZvY2F0aW9uTmFtZShTZWxlY3RvciBzZWxlY3Rvcik7CgogIC8vLyBQcm9wZXJ0eSBuYW1lIHVzZWQgZm9yIGEgc3BlY2lhbGl6YXRpb24gb2YgYGdldEludGVyY2VwdG9yYC4KICAvLy8KICAvLy8ganNfcnVudGltZSBjb250YWlucyBhIHRvcC1sZXZlbCBgZ2V0SW50ZXJjZXB0b3JgIG1ldGhvZC4gVGhlCiAgLy8vIHNwZWNpYWxpemF0aW9ucyBoYXZlIHRoZSBzYW1lIG5hbWUsIGJ1dCB3aXRoIGEgc3VmZml4IHRvIGF2b2lkIG5hbWUKICAvLy8gY29sbGlzaW9ucy4KICBqc0FzdC5OYW1lIG5hbWVGb3JHZXRJbnRlcmNlcHRvcihTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXMpOwoKICAvLy8gUHJvcGVydHkgbmFtZSB1c2VkIGZvciB0aGUgb25lLXNob3QgaW50ZXJjZXB0b3IgbWV0aG9kIGZvciB0aGUgZ2l2ZW4KICAvLy8gW3NlbGVjdG9yXSBhbmQgcmV0dXJuLXR5cGUgc3BlY2lhbGl6YXRpb24uCiAganNBc3QuTmFtZSBuYW1lRm9yT25lU2hvdEludGVyY2VwdG9yKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzKTsKCiAgLy8vIFJldHVybnMgdGhlIHJ1bnRpbWUgbmFtZSBmb3IgW2VsZW1lbnRdLgogIC8vLwogIC8vLyBUaGlzIG5hbWUgaXMgdXNlZCBhcyB0aGUgYmFzaXMgZm9yIGRlcml2aW5nIGBpc2AgYW5kIGBhc2AgcHJvcGVydHkgbmFtZXMKICAvLy8gZm9yIHRoZSBnaXZlbiB0eXBlLgogIC8vLwogIC8vLyBUaGUgcmVzdWx0IGlzIG5vdCBhbHdheXMgc2FmZSBhcyBhIHByb3BlcnR5IG5hbWUgdW5sZXNzIHByZWZpeGluZwogIC8vLyBbb3BlcmF0b3JJc1ByZWZpeF0gb3IgW29wZXJhdG9yQXNQcmVmaXhdLiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24gdHlwZSwKICAvLy8gdGhlbiBieSBjb252ZW50aW9uLCBhbiB1bmRlcnNjb3JlIG11c3QgYWxzbyBzZXBhcmF0ZSBbb3BlcmF0b3JJc1ByZWZpeF0KICAvLy8gZnJvbSB0aGUgdHlwZSBuYW1lLgogIGpzQXN0Lk5hbWUgcnVudGltZVR5cGVOYW1lKEVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFByb3BlcnR5IG5hbWUgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGdpdmVuIHN0YXRpYyBvciBpbnN0YW5jZSBbbWV0aG9kXS4KICAvLy8gRm9yIGluc3RhbmNlIG1ldGhvZHMsIHRoaXMgaW5jbHVkZXMgdGhlIHN1ZmZpeCBlbmNvZGluZyBhcml0eSBhbmQgbmFtZWQKICAvLy8gcGFyYW1ldGVycy4KICAvLy8KICAvLy8gVGhlIG5hbWUgaXMgbm90IG5lY2Vzc2FyaWx5IHVuaXF1ZSB0byBbbWV0aG9kXSwgc2luY2UgYSBzdGF0aWMgbWV0aG9kCiAgLy8vIG1heSBzaGFyZSBpdHMgbmFtZSB3aXRoIGFuIGluc3RhbmNlIG1ldGhvZC4KICBqc0FzdC5OYW1lIG1ldGhvZFByb3BlcnR5TmFtZShGdW5jdGlvbkVudGl0eSBtZXRob2QpOwoKICAvLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYGlzWGAgcHJvcGVydHkgZm9yIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQKICAvLy8gW2VsZW1lbnRdLgogIGpzQXN0Lk5hbWUgb3BlcmF0b3JJcyhDbGFzc0VudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgYGlzWGAgcHJvcGVydHkgZm9yIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgW3R5cGVdLgogIGpzQXN0Lk5hbWUgb3BlcmF0b3JJc1R5cGUoRGFydFR5cGUgdHlwZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBgYXNYYCBmdW5jdGlvbiBmb3IgY2xhc3NlcyB0aGF0IGltcGxlbWVudCB0aGUKICAvLy8gZ2VuZXJpYyBjbGFzcyBbZWxlbWVudF0uCiAganNBc3QuTmFtZSBzdWJzdGl0dXRpb25OYW1lKENsYXNzRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbGF6eSBpbml0aWFsaXplciBmb3IgdGhlIHN0YXRpYyBmaWVsZCBbZWxlbWVudF0uCiAganNBc3QuTmFtZSBsYXp5SW5pdGlhbGl6ZXJOYW1lKEZpZWxkRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2xvc3VyZSBvZiB0aGUgc3RhdGljIG1ldGhvZCBbZWxlbWVudF0uCiAganNBc3QuTmFtZSBzdGF0aWNDbG9zdXJlTmFtZShGdW5jdGlvbkVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIGRpc2FtYmlndWF0ZWQgbmFtZSBvZiBbY2xhc3NfXS4KICAvLy8KICAvLy8gVGhpcyBpcyBib3RoIHRoZSAqcnVudGltZSB0eXBlKiBvZiB0aGUgY2xhc3MgKHNlZSBbcnVudGltZVR5cGVOYW1lXSkKICAvLy8gYW5kIGEgZ2xvYmFsIHByb3BlcnR5IG5hbWUgaW4gd2hpY2ggdG8gc3RvcmUgaXRzIEpTIGNvbnN0cnVjdG9yLgogIGpzQXN0Lk5hbWUgY2xhc3NOYW1lKENsYXNzRW50aXR5IGNsYXNzXyk7CgogIC8vLyBUaGUgcHJlZml4IHVzZWQgZm9yIGVuY29kaW5nIGFzeW5jIHByb3BlcnRpZXMuCiAgZmluYWwgU3RyaW5nIGFzeW5jUHJlZml4ID0gciIkYXN5bmMkIjsKCiAgLy8vIFJldHVybnMgdGhlIG5hbWUgZm9yIHRoZSBob2xkZXIgb2Ygc3RhdGljIHN0YXRlLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgZm9yIG11dGFibGUgc3RhdGljIGZpZWxkcy4KICBmaW5hbCBTdHJpbmcgc3RhdGljU3RhdGVIb2xkZXIgPSByJyQnOwoKICBqc0FzdC5OYW1lIF9saXRlcmFsQXN5bmNQcmVmaXg7CgogIE1vZHVsYXJOYW1lcigpIHsKICAgIF9saXRlcmFsQXN5bmNQcmVmaXggPSBuZXcgU3RyaW5nQmFja2VkTmFtZShhc3luY1ByZWZpeCk7CiAgfQoKICAvLy8gUmV0dXJucyBhIHNhZmUgdmFyaWFibGUgbmFtZSBmb3IgdXNlIGluIGFzeW5jIHJld3JpdGluZy4KICAvLy8KICAvLy8gSGFzIHRoZSBzYW1lIHByb3BlcnR5IGFzIFtzYWZlVmFyaWFibGVOYW1lXSBidXQgZG9lcyBub3QgY2xhc2ggd2l0aAogIC8vLyBuYW1lcyByZXR1cm5lZCBmcm9tIHRoZXJlLgogIC8vLyBBZGRpdGlvbmFsbHksIHdoZW4gdXNlZCBhcyBhIHByZWZpeCB0byBhIHZhcmlhYmxlIG5hbWUsIHRoZSByZXN1bHQKICAvLy8gd2lsbCBiZSBzYWZlIHRvIHVzZSwgYXMgd2VsbC4KICBTdHJpbmcgc2FmZVZhcmlhYmxlUHJlZml4Rm9yQXN5bmNSZXdyaXRlKFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gIiRhc3luY1ByZWZpeCRuYW1lIjsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBuYW1lIGZvciB0aGUgYXN5bmMgYm9keSBvZiB0aGUgbWV0aG9kIHdpdGggdGhlIFtvcmlnaW5hbF0KICAvLy8gbmFtZS4KICBqc0FzdC5OYW1lIGRlcml2ZUFzeW5jQm9keU5hbWUoanNBc3QuTmFtZSBvcmlnaW5hbCkgewogICAgcmV0dXJuIG5ldyBBc3luY05hbWUoX2xpdGVyYWxBc3luY1ByZWZpeCwgb3JpZ2luYWwpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGxhYmVsIG5hbWUgZm9yIFtsYWJlbF0gdXNlZCBhcyBhIGJyZWFrIHRhcmdldC4KICBTdHJpbmcgYnJlYWtMYWJlbE5hbWUoTGFiZWxEZWZpbml0aW9uIGxhYmVsKSB7CiAgICByZXR1cm4gJ1wkJHtsYWJlbC5sYWJlbE5hbWV9XCQke2xhYmVsLnRhcmdldC5uZXN0aW5nTGV2ZWx9JzsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBsYWJlbCBuYW1lIGZvciB0aGUgaW1wbGljaXQgYnJlYWsgbGFiZWwgbmVlZGVkIGZvciB0aGUganVtcAogIC8vLyBbdGFyZ2V0XS4KICBTdHJpbmcgaW1wbGljaXRCcmVha0xhYmVsTmFtZShKdW1wVGFyZ2V0IHRhcmdldCkgewogICAgcmV0dXJuICdcJCR7dGFyZ2V0Lm5lc3RpbmdMZXZlbH0nOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGxhYmVsIG5hbWUgZm9yIFtsYWJlbF0gdXNlZCBhcyBhIGNvbnRpbnVlIHRhcmdldC4KICAvLy8KICAvLy8gV2Ugc29tZXRpbWVzIGhhbmRsZSBjb250aW51ZSB0YXJnZXRzIGRpZmZlcmVudGx5IGZyb20gYnJlYWsgdGFyZ2V0cywKICAvLy8gc28gd2UgaGF2ZSBzcGVjaWFsIGNvbnRpbnVlLW9ubHkgbGFiZWxzLgogIFN0cmluZyBjb250aW51ZUxhYmVsTmFtZShMYWJlbERlZmluaXRpb24gbGFiZWwpIHsKICAgIHJldHVybiAnY1wkJHtsYWJlbC5sYWJlbE5hbWV9XCQke2xhYmVsLnRhcmdldC5uZXN0aW5nTGV2ZWx9JzsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBsYWJlbCBuYW1lIGZvciB0aGUgaW1wbGljaXQgY29udGludWUgbGFiZWwgbmVlZGVkIGZvciB0aGUganVtcAogIC8vLyBbdGFyZ2V0XS4KICBTdHJpbmcgaW1wbGljaXRDb250aW51ZUxhYmVsTmFtZShKdW1wVGFyZ2V0IHRhcmdldCkgewogICAgcmV0dXJuICdjXCQke3RhcmdldC5uZXN0aW5nTGV2ZWx9JzsKICB9CgogIFNldDxTdHJpbmc+IF9qc1ZhcmlhYmxlUmVzZXJ2ZWRDYWNoZSA9IG51bGw7CgogIC8vLyBOYW1lcyB0aGF0IGNhbm5vdCBiZSB1c2VkIGJ5IGxvY2FsIHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycy4KICBTZXQ8U3RyaW5nPiBnZXQgX2pzVmFyaWFibGVSZXNlcnZlZCB7CiAgICBpZiAoX2pzVmFyaWFibGVSZXNlcnZlZENhY2hlID09IG51bGwpIHsKICAgICAgX2pzVmFyaWFibGVSZXNlcnZlZENhY2hlID0gbmV3IFNldDxTdHJpbmc+KCk7CiAgICAgIF9qc1ZhcmlhYmxlUmVzZXJ2ZWRDYWNoZS5hZGRBbGwoTmFtZXIuamF2YVNjcmlwdEtleXdvcmRzKTsKICAgICAgX2pzVmFyaWFibGVSZXNlcnZlZENhY2hlLmFkZEFsbChOYW1lci5yZXNlcnZlZFByb3BlcnR5U3ltYm9scyk7CiAgICAgIF9qc1ZhcmlhYmxlUmVzZXJ2ZWRDYWNoZS5hZGRBbGwoTmFtZXIucmVzZXJ2ZWRHbG9iYWxTeW1ib2xzKTsKICAgICAgX2pzVmFyaWFibGVSZXNlcnZlZENhY2hlLmFkZEFsbChOYW1lci5yZXNlcnZlZEdsb2JhbE9iamVjdE5hbWVzKTsKICAgICAgLy8gMjYgbGV0dGVycyBpbiB0aGUgYWxwaGFiZXQsIDI1IG5vdCBjb3VudGluZyBJLgogICAgICBhc3NlcnQoTmFtZXIucmVzZXJ2ZWRHbG9iYWxPYmplY3ROYW1lcy5sZW5ndGggPT0gMjUpOwogICAgICBfanNWYXJpYWJsZVJlc2VydmVkQ2FjaGUuYWRkQWxsKE5hbWVyLnJlc2VydmVkR2xvYmFsSGVscGVyRnVuY3Rpb25zKTsKICAgIH0KICAgIHJldHVybiBfanNWYXJpYWJsZVJlc2VydmVkQ2FjaGU7CiAgfQoKICAvLy8gUmV0dXJucyBhIHZhcmlhYmxlIG5hbWUgdGhhdCBjYW5ub3QgY2xhc2ggd2l0aCBhIGtleXdvcmQsIGEgZ2xvYmFsCiAgLy8vIHZhcmlhYmxlLCBvciBhbnkgbmFtZSBzdGFydGluZyB3aXRoIGEgc2luZ2xlICckJy4KICAvLy8KICAvLy8gRnVydGhlcm1vcmUsIHRoaXMgZnVuY3Rpb24gaXMgaW5qZWN0aXZlLCB0aGF0IGlzLCBpdCBuZXZlciByZXR1cm5zIHRoZQogIC8vLyBzYW1lIG5hbWUgZm9yIHR3byBkaWZmZXJlbnQgaW5wdXRzLgogIFN0cmluZyBzYWZlVmFyaWFibGVOYW1lKFN0cmluZyBuYW1lKSB7CiAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCcjJywgJ18nKTsKICAgIGlmIChfanNWYXJpYWJsZVJlc2VydmVkLmNvbnRhaW5zKG5hbWUpIHx8IG5hbWUuc3RhcnRzV2l0aChyJyQnKSkgewogICAgICByZXR1cm4gJ1wkJG5hbWUnOwogICAgfQogICAgcmV0dXJuIG5hbWU7CiAgfQoKICBDb21tb25FbGVtZW50cyBnZXQgX2NvbW1vbkVsZW1lbnRzOwoKICAvLy8gUmV0dXJucyB0aGUgc3RyaW5nIHRoYXQgaXMgdG8gYmUgdXNlZCBhcyB0aGUgcmVzdWx0IG9mIGEgY2FsbCB0bwogIC8vLyBbSlNfR0VUX05BTUVdIGF0IFtub2RlXSB3aXRoIGFyZ3VtZW50IFtuYW1lXS4KICBqc0FzdC5OYW1lIGdldE5hbWVGb3JKc0dldE5hbWUoU3Bhbm5hYmxlIHNwYW5uYWJsZSwgSnNHZXROYW1lIG5hbWUpIHsKICAgIHN3aXRjaCAobmFtZSkgewogICAgICBjYXNlIEpzR2V0TmFtZS5HRVRURVJfUFJFRklYOgogICAgICAgIHJldHVybiBhc05hbWUoZml4ZWROYW1lcy5nZXR0ZXJQcmVmaXgpOwogICAgICBjYXNlIEpzR2V0TmFtZS5TRVRURVJfUFJFRklYOgogICAgICAgIHJldHVybiBhc05hbWUoZml4ZWROYW1lcy5zZXR0ZXJQcmVmaXgpOwogICAgICBjYXNlIEpzR2V0TmFtZS5DQUxMX1BSRUZJWDoKICAgICAgICByZXR1cm4gYXNOYW1lKGZpeGVkTmFtZXMuY2FsbFByZWZpeCk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkNBTExfUFJFRklYMDoKICAgICAgICByZXR1cm4gYXNOYW1lKCcke2ZpeGVkTmFtZXMuY2FsbFByZWZpeH1cJDAnKTsKICAgICAgY2FzZSBKc0dldE5hbWUuQ0FMTF9QUkVGSVgxOgogICAgICAgIHJldHVybiBhc05hbWUoJyR7Zml4ZWROYW1lcy5jYWxsUHJlZml4fVwkMScpOwogICAgICBjYXNlIEpzR2V0TmFtZS5DQUxMX1BSRUZJWDI6CiAgICAgICAgcmV0dXJuIGFzTmFtZSgnJHtmaXhlZE5hbWVzLmNhbGxQcmVmaXh9XCQyJyk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkNBTExfUFJFRklYMzoKICAgICAgICByZXR1cm4gYXNOYW1lKCcke2ZpeGVkTmFtZXMuY2FsbFByZWZpeH1cJDMnKTsKICAgICAgY2FzZSBKc0dldE5hbWUuQ0FMTF9QUkVGSVg0OgogICAgICAgIHJldHVybiBhc05hbWUoJyR7Zml4ZWROYW1lcy5jYWxsUHJlZml4fVwkNCcpOwogICAgICBjYXNlIEpzR2V0TmFtZS5DQUxMX1BSRUZJWDU6CiAgICAgICAgcmV0dXJuIGFzTmFtZSgnJHtmaXhlZE5hbWVzLmNhbGxQcmVmaXh9XCQ1Jyk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkNBTExfQ0FUQ0hfQUxMOgogICAgICAgIHJldHVybiBhc05hbWUoZml4ZWROYW1lcy5jYWxsQ2F0Y2hBbGxOYW1lKTsKICAgICAgY2FzZSBKc0dldE5hbWUuUkVGTEVDVEFCTEU6CiAgICAgICAgcmV0dXJuIGFzTmFtZShmaXhlZE5hbWVzLnJlZmxlY3RhYmxlRmllbGQpOwogICAgICBjYXNlIEpzR2V0TmFtZS5DTEFTU19ERVNDUklQVE9SX1BST1BFUlRZOgogICAgICAgIHJldHVybiBhc05hbWUoZml4ZWROYW1lcy5jbGFzc0Rlc2NyaXB0b3JQcm9wZXJ0eSk7CiAgICAgIGNhc2UgSnNHZXROYW1lLlJFUVVJUkVEX1BBUkFNRVRFUl9QUk9QRVJUWToKICAgICAgICByZXR1cm4gYXNOYW1lKGZpeGVkTmFtZXMucmVxdWlyZWRQYXJhbWV0ZXJGaWVsZCk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkRFRkFVTFRfVkFMVUVTX1BST1BFUlRZOgogICAgICAgIHJldHVybiBhc05hbWUoZml4ZWROYW1lcy5kZWZhdWx0VmFsdWVzRmllbGQpOwogICAgICBjYXNlIEpzR2V0TmFtZS5DQUxMX05BTUVfUFJPUEVSVFk6CiAgICAgICAgcmV0dXJuIGFzTmFtZShmaXhlZE5hbWVzLmNhbGxOYW1lRmllbGQpOwogICAgICBjYXNlIEpzR2V0TmFtZS5ERUZFUlJFRF9BQ1RJT05fUFJPUEVSVFk6CiAgICAgICAgcmV0dXJuIGFzTmFtZShmaXhlZE5hbWVzLmRlZmVycmVkQWN0aW9uKTsKICAgICAgY2FzZSBKc0dldE5hbWUuT1BFUkFUT1JfQVNfUFJFRklYOgogICAgICAgIHJldHVybiBhc05hbWUoZml4ZWROYW1lcy5vcGVyYXRvckFzUHJlZml4KTsKICAgICAgY2FzZSBKc0dldE5hbWUuU0lHTkFUVVJFX05BTUU6CiAgICAgICAgcmV0dXJuIGFzTmFtZShmaXhlZE5hbWVzLm9wZXJhdG9yU2lnbmF0dXJlKTsKICAgICAgY2FzZSBKc0dldE5hbWUuUlRJX05BTUU6CiAgICAgICAgcmV0dXJuIGFzTmFtZShmaXhlZE5hbWVzLnJ0aU5hbWUpOwogICAgICBjYXNlIEpzR2V0TmFtZS5UWVBFREVGX1RBRzoKICAgICAgICByZXR1cm4gYXNOYW1lKHJ0aVRhZ3MudHlwZWRlZlRhZyk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkZVTkNUSU9OX1RZUEVfVEFHOgogICAgICAgIHJldHVybiBhc05hbWUocnRpVGFncy5mdW5jdGlvblR5cGVUYWcpOwogICAgICBjYXNlIEpzR2V0TmFtZS5GVU5DVElPTl9UWVBFX0dFTkVSSUNfQk9VTkRTX1RBRzoKICAgICAgICByZXR1cm4gYXNOYW1lKHJ0aVRhZ3MuZnVuY3Rpb25UeXBlR2VuZXJpY0JvdW5kc1RhZyk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkZVTkNUSU9OX1RZUEVfVk9JRF9SRVRVUk5fVEFHOgogICAgICAgIHJldHVybiBhc05hbWUocnRpVGFncy5mdW5jdGlvblR5cGVWb2lkUmV0dXJuVGFnKTsKICAgICAgY2FzZSBKc0dldE5hbWUuRlVOQ1RJT05fVFlQRV9SRVRVUk5fVFlQRV9UQUc6CiAgICAgICAgcmV0dXJuIGFzTmFtZShydGlUYWdzLmZ1bmN0aW9uVHlwZVJldHVyblR5cGVUYWcpOwogICAgICBjYXNlIEpzR2V0TmFtZS5GVU5DVElPTl9UWVBFX1JFUVVJUkVEX1BBUkFNRVRFUlNfVEFHOgogICAgICAgIHJldHVybiBhc05hbWUocnRpVGFncy5mdW5jdGlvblR5cGVSZXF1aXJlZFBhcmFtZXRlcnNUYWcpOwogICAgICBjYXNlIEpzR2V0TmFtZS5GVU5DVElPTl9UWVBFX09QVElPTkFMX1BBUkFNRVRFUlNfVEFHOgogICAgICAgIHJldHVybiBhc05hbWUocnRpVGFncy5mdW5jdGlvblR5cGVPcHRpb25hbFBhcmFtZXRlcnNUYWcpOwogICAgICBjYXNlIEpzR2V0TmFtZS5GVU5DVElPTl9UWVBFX05BTUVEX1BBUkFNRVRFUlNfVEFHOgogICAgICAgIHJldHVybiBhc05hbWUocnRpVGFncy5mdW5jdGlvblR5cGVOYW1lZFBhcmFtZXRlcnNUYWcpOwogICAgICBjYXNlIEpzR2V0TmFtZS5GVVRVUkVfT1JfVEFHOgogICAgICAgIHJldHVybiBhc05hbWUocnRpVGFncy5mdXR1cmVPclRhZyk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkZVVFVSRV9PUl9UWVBFX0FSR1VNRU5UX1RBRzoKICAgICAgICByZXR1cm4gYXNOYW1lKHJ0aVRhZ3MuZnV0dXJlT3JUeXBlVGFnKTsKICAgICAgY2FzZSBKc0dldE5hbWUuSVNfSU5ERVhBQkxFX0ZJRUxEX05BTUU6CiAgICAgICAgcmV0dXJuIG9wZXJhdG9ySXMoX2NvbW1vbkVsZW1lbnRzLmpzSW5kZXhpbmdCZWhhdmlvckludGVyZmFjZSk7CiAgICAgIGNhc2UgSnNHZXROYW1lLk5VTExfQ0xBU1NfVFlQRV9OQU1FOgogICAgICAgIHJldHVybiBydW50aW1lVHlwZU5hbWUoX2NvbW1vbkVsZW1lbnRzLm51bGxDbGFzcyk7CiAgICAgIGNhc2UgSnNHZXROYW1lLk9CSkVDVF9DTEFTU19UWVBFX05BTUU6CiAgICAgICAgcmV0dXJuIHJ1bnRpbWVUeXBlTmFtZShfY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpOwogICAgICBjYXNlIEpzR2V0TmFtZS5GVU5DVElPTl9DTEFTU19UWVBFX05BTUU6CiAgICAgICAgcmV0dXJuIHJ1bnRpbWVUeXBlTmFtZShfY29tbW9uRWxlbWVudHMuZnVuY3Rpb25DbGFzcyk7CiAgICAgIGNhc2UgSnNHZXROYW1lLkZVVFVSRV9DTEFTU19UWVBFX05BTUU6CiAgICAgICAgcmV0dXJuIHJ1bnRpbWVUeXBlTmFtZShfY29tbW9uRWxlbWVudHMuZnV0dXJlQ2xhc3MpOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IGZhaWxlZEF0KHNwYW5uYWJsZSwgJ0Vycm9yOiBOYW1lciBoYXMgbm8gbmFtZSBmb3IgIiRuYW1lIi4nKTsKICAgIH0KICB9Cn0KCmNsYXNzIE1vZHVsYXJOYW1lckltcGwgZXh0ZW5kcyBNb2R1bGFyTmFtZXIgewogIGZpbmFsIENvZGVnZW5SZWdpc3RyeSBfcmVnaXN0cnk7CiAgQG92ZXJyaWRlCiAgZmluYWwgUnVudGltZVR5cGVUYWdzIHJ0aVRhZ3M7CiAgQG92ZXJyaWRlCiAgZmluYWwgRml4ZWROYW1lcyBmaXhlZE5hbWVzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CgogIE1vZHVsYXJOYW1lckltcGwoCiAgICAgIHRoaXMuX3JlZ2lzdHJ5LCB0aGlzLl9jb21tb25FbGVtZW50cywgdGhpcy5ydGlUYWdzLCB0aGlzLmZpeGVkTmFtZXMpOwoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIGdldCBydGlGaWVsZEpzTmFtZSB7CiAgICBqc0FzdC5OYW1lIG5hbWUgPSBuZXcgTW9kdWxhck5hbWUoTW9kdWxhck5hbWVLaW5kLnJ0aUZpZWxkKTsKICAgIF9yZWdpc3RyeS5yZWdpc3Rlck1vZHVsYXJOYW1lKG5hbWUpOwogICAgcmV0dXJuIG5hbWU7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIHJ1bnRpbWVUeXBlTmFtZShFbnRpdHkgZWxlbWVudCkgewogICAganNBc3QuTmFtZSBuYW1lID0KICAgICAgICBuZXcgTW9kdWxhck5hbWUoTW9kdWxhck5hbWVLaW5kLnJ1bnRpbWVUeXBlTmFtZSwgZGF0YTogZWxlbWVudCk7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJNb2R1bGFyTmFtZShuYW1lKTsKICAgIHJldHVybiBuYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBjbGFzc05hbWUoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAganNBc3QuTmFtZSBuYW1lID0gbmV3IE1vZHVsYXJOYW1lKE1vZHVsYXJOYW1lS2luZC5jbGFzc05hbWUsIGRhdGE6IGVsZW1lbnQpOwogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyTW9kdWxhck5hbWUobmFtZSk7CiAgICByZXR1cm4gbmFtZTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gcmVhZEdsb2JhbE9iamVjdEZvckxpYnJhcnkoTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICBqc0FzdC5FeHByZXNzaW9uIGV4cHJlc3Npb24gPSBuZXcgTW9kdWxhckV4cHJlc3Npb24oCiAgICAgICAgTW9kdWxhckV4cHJlc3Npb25LaW5kLmdsb2JhbE9iamVjdEZvckxpYnJhcnksIGxpYnJhcnkpOwogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyTW9kdWxhckV4cHJlc3Npb24oZXhwcmVzc2lvbik7CiAgICByZXR1cm4gZXhwcmVzc2lvbjsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gcmVhZEdsb2JhbE9iamVjdEZvckNsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIGpzQXN0LkV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG5ldyBNb2R1bGFyRXhwcmVzc2lvbigKICAgICAgICBNb2R1bGFyRXhwcmVzc2lvbktpbmQuZ2xvYmFsT2JqZWN0Rm9yQ2xhc3MsIGVsZW1lbnQpOwogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyTW9kdWxhckV4cHJlc3Npb24oZXhwcmVzc2lvbik7CiAgICByZXR1cm4gZXhwcmVzc2lvbjsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gcmVhZEdsb2JhbE9iamVjdEZvclR5cGUoRW50aXR5IGVsZW1lbnQpIHsKICAgIGpzQXN0LkV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG5ldyBNb2R1bGFyRXhwcmVzc2lvbigKICAgICAgICBNb2R1bGFyRXhwcmVzc2lvbktpbmQuZ2xvYmFsT2JqZWN0Rm9yVHlwZSwgZWxlbWVudCk7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJNb2R1bGFyRXhwcmVzc2lvbihleHByZXNzaW9uKTsKICAgIHJldHVybiBleHByZXNzaW9uOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiByZWFkR2xvYmFsT2JqZWN0Rm9yTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBqc0FzdC5FeHByZXNzaW9uIGV4cHJlc3Npb24gPSBuZXcgTW9kdWxhckV4cHJlc3Npb24oCiAgICAgICAgTW9kdWxhckV4cHJlc3Npb25LaW5kLmdsb2JhbE9iamVjdEZvck1lbWJlciwgZWxlbWVudCk7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJNb2R1bGFyRXhwcmVzc2lvbihleHByZXNzaW9uKTsKICAgIHJldHVybiBleHByZXNzaW9uOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBhbGlhc2VkU3VwZXJNZW1iZXJQcm9wZXJ0eU5hbWUoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAganNBc3QuTmFtZSBuYW1lID0KICAgICAgICBuZXcgTW9kdWxhck5hbWUoTW9kdWxhck5hbWVLaW5kLmFsaWFzZWRTdXBlck1lbWJlciwgZGF0YTogbWVtYmVyKTsKICAgIF9yZWdpc3RyeS5yZWdpc3Rlck1vZHVsYXJOYW1lKG5hbWUpOwogICAgcmV0dXJuIG5hbWU7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIHN0YXRpY0Nsb3N1cmVOYW1lKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIGpzQXN0Lk5hbWUgbmFtZSA9CiAgICAgICAgbmV3IE1vZHVsYXJOYW1lKE1vZHVsYXJOYW1lS2luZC5zdGF0aWNDbG9zdXJlLCBkYXRhOiBlbGVtZW50KTsKICAgIF9yZWdpc3RyeS5yZWdpc3Rlck1vZHVsYXJOYW1lKG5hbWUpOwogICAgcmV0dXJuIG5hbWU7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIG1ldGhvZFByb3BlcnR5TmFtZShGdW5jdGlvbkVudGl0eSBtZXRob2QpIHsKICAgIGpzQXN0Lk5hbWUgbmFtZSA9CiAgICAgICAgbmV3IE1vZHVsYXJOYW1lKE1vZHVsYXJOYW1lS2luZC5tZXRob2RQcm9wZXJ0eSwgZGF0YTogbWV0aG9kKTsKICAgIF9yZWdpc3RyeS5yZWdpc3Rlck1vZHVsYXJOYW1lKG5hbWUpOwogICAgcmV0dXJuIG5hbWU7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIGluc3RhbmNlRmllbGRQcm9wZXJ0eU5hbWUoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAganNBc3QuTmFtZSBuYW1lID0KICAgICAgICBuZXcgTW9kdWxhck5hbWUoTW9kdWxhck5hbWVLaW5kLmluc3RhbmNlRmllbGQsIGRhdGE6IGVsZW1lbnQpOwogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyTW9kdWxhck5hbWUobmFtZSk7CiAgICByZXR1cm4gbmFtZTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgb3BlcmF0b3JJc1R5cGUoRGFydFR5cGUgdHlwZSkgewogICAganNBc3QuTmFtZSBuYW1lID0KICAgICAgICBuZXcgTW9kdWxhck5hbWUoTW9kdWxhck5hbWVLaW5kLm9wZXJhdG9ySXNUeXBlLCBkYXRhOiB0eXBlKTsKICAgIF9yZWdpc3RyeS5yZWdpc3Rlck1vZHVsYXJOYW1lKG5hbWUpOwogICAgcmV0dXJuIG5hbWU7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIGluc3RhbmNlTWV0aG9kTmFtZShGdW5jdGlvbkVudGl0eSBtZXRob2QpIHsKICAgIGpzQXN0Lk5hbWUgbmFtZSA9CiAgICAgICAgbmV3IE1vZHVsYXJOYW1lKE1vZHVsYXJOYW1lS2luZC5pbnN0YW5jZU1ldGhvZCwgZGF0YTogbWV0aG9kKTsKICAgIF9yZWdpc3RyeS5yZWdpc3Rlck1vZHVsYXJOYW1lKG5hbWUpOwogICAgcmV0dXJuIG5hbWU7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIGludm9jYXRpb25OYW1lKFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICBqc0FzdC5OYW1lIG5hbWUgPQogICAgICAgIG5ldyBNb2R1bGFyTmFtZShNb2R1bGFyTmFtZUtpbmQuaW52b2NhdGlvbiwgZGF0YTogc2VsZWN0b3IpOwogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyTW9kdWxhck5hbWUobmFtZSk7CiAgICByZXR1cm4gbmFtZTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgbGF6eUluaXRpYWxpemVyTmFtZShGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICBqc0FzdC5OYW1lIG5hbWUgPQogICAgICAgIG5ldyBNb2R1bGFyTmFtZShNb2R1bGFyTmFtZUtpbmQubGF6eUluaXRpYWxpemVyLCBkYXRhOiBlbGVtZW50KTsKICAgIF9yZWdpc3RyeS5yZWdpc3Rlck1vZHVsYXJOYW1lKG5hbWUpOwogICAgcmV0dXJuIG5hbWU7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIG9wZXJhdG9ySXMoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAganNBc3QuTmFtZSBuYW1lID0KICAgICAgICBuZXcgTW9kdWxhck5hbWUoTW9kdWxhck5hbWVLaW5kLm9wZXJhdG9ySXMsIGRhdGE6IGVsZW1lbnQpOwogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyTW9kdWxhck5hbWUobmFtZSk7CiAgICByZXR1cm4gbmFtZTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgZ2xvYmFsUHJvcGVydHlOYW1lRm9yVHlwZShFbnRpdHkgZWxlbWVudCkgewogICAganNBc3QuTmFtZSBuYW1lID0gbmV3IE1vZHVsYXJOYW1lKE1vZHVsYXJOYW1lS2luZC5nbG9iYWxQcm9wZXJ0eU5hbWVGb3JUeXBlLAogICAgICAgIGRhdGE6IGVsZW1lbnQpOwogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyTW9kdWxhck5hbWUobmFtZSk7CiAgICByZXR1cm4gbmFtZTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgZ2xvYmFsUHJvcGVydHlOYW1lRm9yQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAganNBc3QuTmFtZSBuYW1lID0gbmV3IE1vZHVsYXJOYW1lKAogICAgICAgIE1vZHVsYXJOYW1lS2luZC5nbG9iYWxQcm9wZXJ0eU5hbWVGb3JDbGFzcywKICAgICAgICBkYXRhOiBlbGVtZW50KTsKICAgIF9yZWdpc3RyeS5yZWdpc3Rlck1vZHVsYXJOYW1lKG5hbWUpOwogICAgcmV0dXJuIG5hbWU7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIGdsb2JhbFByb3BlcnR5TmFtZUZvck1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAganNBc3QuTmFtZSBuYW1lID0gbmV3IE1vZHVsYXJOYW1lKAogICAgICAgIE1vZHVsYXJOYW1lS2luZC5nbG9iYWxQcm9wZXJ0eU5hbWVGb3JNZW1iZXIsCiAgICAgICAgZGF0YTogZWxlbWVudCk7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJNb2R1bGFyTmFtZShuYW1lKTsKICAgIHJldHVybiBuYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBnbG9iYWxOYW1lRm9ySW50ZXJmYWNlVHlwZVZhcmlhYmxlKFR5cGVWYXJpYWJsZUVudGl0eSBlbGVtZW50KSB7CiAgICBqc0FzdC5OYW1lIG5hbWUgPSBuZXcgTW9kdWxhck5hbWUoCiAgICAgICAgTW9kdWxhck5hbWVLaW5kLmdsb2JhbE5hbWVGb3JJbnRlcmZhY2VUeXBlVmFyaWFibGUsCiAgICAgICAgZGF0YTogZWxlbWVudCk7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJNb2R1bGFyTmFtZShuYW1lKTsKICAgIHJldHVybiBuYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBuYW1lRm9yR2V0SW50ZXJjZXB0b3IoU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzKSB7CiAgICBqc0FzdC5OYW1lIG5hbWUgPQogICAgICAgIG5ldyBNb2R1bGFyTmFtZShNb2R1bGFyTmFtZUtpbmQubmFtZUZvckdldEludGVyY2VwdG9yLCBzZXQ6IGNsYXNzZXMpOwogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyTW9kdWxhck5hbWUobmFtZSk7CiAgICByZXR1cm4gbmFtZTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgbmFtZUZvck9uZVNob3RJbnRlcmNlcHRvcigKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIFNldDxDbGFzc0VudGl0eT4gY2xhc3NlcykgewogICAganNBc3QuTmFtZSBuYW1lID0gbmV3IE1vZHVsYXJOYW1lKE1vZHVsYXJOYW1lS2luZC5uYW1lRm9yT25lU2hvdEludGVyY2VwdG9yLAogICAgICAgIGRhdGE6IHNlbGVjdG9yLCBzZXQ6IGNsYXNzZXMpOwogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyTW9kdWxhck5hbWUobmFtZSk7CiAgICByZXR1cm4gbmFtZTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgYXNOYW1lKFN0cmluZyB0ZXh0KSB7CiAgICBqc0FzdC5OYW1lIG5hbWUgPSBuZXcgTW9kdWxhck5hbWUoTW9kdWxhck5hbWVLaW5kLmFzTmFtZSwgZGF0YTogdGV4dCk7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJNb2R1bGFyTmFtZShuYW1lKTsKICAgIHJldHVybiBuYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBzdWJzdGl0dXRpb25OYW1lKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIGpzQXN0Lk5hbWUgbmFtZSA9CiAgICAgICAgbmV3IE1vZHVsYXJOYW1lKE1vZHVsYXJOYW1lS2luZC5zdWJzdGl0dXRpb24sIGRhdGE6IGVsZW1lbnQpOwogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyTW9kdWxhck5hbWUobmFtZSk7CiAgICByZXR1cm4gbmFtZTsKICB9Cn0KiwIATk48ARoBJwE5LQFHARoZIUI7PyNKOCQxISEhISxAIzg9QBwqGwEgHRoZAU8ELgQpOxcEPARMLgROTT0ETVAhBE4EGwREBC8wMARLUE9OHARRT1AEKARJBC0yNToERyUETU0tBEwrBEcEUCoEMARQTi8ETk9QRiYETU4TBCYEFhYETwQ3BBUVBFElI0EdDQoSDgwMCwsNDw4MEAsODRAQDAwPCg0OCgsBKg0MDw0NDg4BNRILDw4NEQ8RDgFPEw0KCg4MDBILDQ4LDA0PDg0NDw0MEAsODRAQDA8KDQ4OCwE2HgErDA0BQxIPEREPDgFHBQFGNUNEMBgFAThELFMBNCQBNzsBLycRGgE6SkQsATQMASARATEaAUJKQUk2OkhARUdLFQFEQUo3Q0hIRkhLQUc+HgEwQ0lDPUYoASCAgjyAlUI5ARwOAUhAJgESR0g+O0ABREMuASxDASo8QT1FSkRIRUdMTDw2AUZMRh8BGBIFAUgJCSsJCQkJPTQ3CQkJCQk6CQkJCQkJOwkJCQUBTAwPBQEwLxYWFhYXASIBQQ8fHycuMwYYBAEsKCQtOTk3MygBDCEBDB8BRTQBR0pDTQEjIwEjASg/AR4BDCNEAU8pAU5LASMBQkAGT1ENMTJORTw2ARFJQTwlKkEqQQQBNiIrLwg1LwgtKAgQBAFEPD4zQUlLQz09RQE4IjcvCDFRCAFLDjMoCBAEAUI4AUU8ATMBQQFDPCsBTzBAAU9IFT0BPEpKBAExJwEMRQE5ATkzJz1OAUMiM0AiAUMtNgQBLgZQOS4lBAEpBjE0TE0uIjIaNDcpBiIEASQ0NBxLUB4vBhUEAU1QGwZNUD0GRSolAR4uATIBPxpBARwTDUUtT0oiPCUGBAFISE5LGE0qBAEjPyg7BAEhRiVOPS80R1AySjYIBAEMOUlIIisqBiQ2Bj0EATofBjAGRUQ5TCE7BAEnBjAGUToGPAZQIkwgLzoGND8VBAEnBiwGUCJPRzkVBAEMMR0gUTQBIFE0ASIfTSc3QgEeTjFDLwonPlABIS4BDzI7BgQBNjM9QjoGARROBAFQQCABUCM2JDIuBAFRDTYkLS4EAQxCKgEMQCgBDDooAQxOKzYEAU8/SyAHT09EIFAaOyEIBAEMPjkBNE0GAUpLSS1PSy4fKj4GAUA8Tk9DUE82KzdIQAYBT08wSQQBNR0lNDMeQyIhTiEjRE4dGQwKCEQGEgQBUDkxNQQBMjVPOj8jBAFMPk86LkEEAUw+TzouQQQBMjZPOj8jBAFOMkYwBAE/Bkc4MBsxJwYjBAFNUCEGTk0vBk9QQisiLgQBLAZRNjIlFxwyJggSCAQBPy42BAE3SwQBSAZHPkhLQysbMjkiBiMEAUUoBkcGTk4GTktQRQZJShE0LEkYUQE6UEszGzcfTVE0CDopKj4GIwQBSw0GTk0GTCkGSE0tSjMbI1EqRTMGIwQBThsGSjMGUDRQTE03OTM2SDkyBAEuBkQvBkkqNDsbIwEvOixGNA8eQTRPNAgGIwQBMQZDGgZJQEQbQTsGIwQBTU4iPAYeOAY3FiggDTcvMA0IMSUGIhYEAR4GPAZPLQZONQZLFkJOSDgxLAQBR1FJKwZOLAZBTTcwS0o6IiE0NC4YBhEEAVA2Bk4TLCBKGgYRBAFISS87BAFCAUdIEjchMixBMTs3Bi4EAUE2BAFBNCsuDU0fSgYEAT5JUTQ5LSNKJjYeHjcGTyEmJR0iMggBQygjHAgGT0s5IUohBi8aBAFKG05KT0xKNxJHTUggUE8RDU0GBAEMRE5RSz5DBAEMKDpQURswAT4dPwQBDC8xUQdJPgdOJQdPSUMtBAEMTwEMQ0I0SkU1CAQBDDkjJS8EAUVLSD4jPkshHAQBSTdLNAQBDEYzNwY4BAE1NAQBDEQ4BAEvJDYGKgQBDD4kOgYuBAE9OUQkICowEgZQBAEMSEMEAQw4NDlKEQQBDDk0F0s+KD0EAT0rL0lAOi0EAUEBPAFNKjABQQEoAT4+Nko4CAQBDC0fSCA7HCIKBiguBAEML0YeOR8IBAFELSUYBigRBAEMNR45HwgEAQwjNDgyUQY0ODJRBgEnBAExIxgVHhYfGCAbHhYeFh4WHxceFh8WHxYgFx8VHhUfFR4VHhYeFh4VHhYjGQ0TBgQBPyofLy8GIEwxFQYkNDcBTExQTyQ2F08gBAIBTk1FPjwnNzk4OTY5Nzc+FQQBH0AXET1HFARFQxAXAgEzBFBRHAQ6UDYzREMEPk4iJicBFiMpATo/JxIBRwExJ0MBKxYpTjMgBAE6MgEqGConHVETExwGGgQBIi0XBhMEAR4hHR85RxUGBAEoUBUNFQYEASghBAEMPCAEAQxGHwQBDDQRBAEMOhEEAQwyOyslDSMGBAEMOBMEAQw0LQQBDDg/KQQBDDQ6FSIgFCoVDSklGwgGBAEMMjoUIBQNJAYEAQxROhQgFA1PGUYGBAEMQikBPEYgIh4xIh8eJiERHREKCCAtEAgGAVFEIRo/JggEAQw0UE0VLhEhICYgBhgxQAYZIgQBDEJONRQEAQxMHgQBDEIYBAEMOBEEAQxIGQQCAToEUE1NFUsjNwEWIy4BOwExJ0MBOwEnIhgzIAYRBAEMNwEMPQEMMyQEAQw7MgQBDEUmBAEMMSYnMwYqBAEMNy4EAQw3MQQBDDM5BAEMMTgEAQwxOi0EAQxBO0QhPz0IEQQBDDMuQEUhBAEMQSklBAEMSxQfQyEEAQxBFB8+IQQBDDcUHzkhBAEMRyc4BAEoGyNRGDUuBhEEATswLwYRBAEjOyoEASkkIiUOJFElKiNLJxMjIB4QDRQrLxAIIzUGBAFMPQY+LSM8HxEEASE6IDwEAgE2EwEXASYdERoEAQweHQQBDCEBDC4hBAEMKiEEAQw0IQQBMjI8OTYuBhEEAQwsJzUOBhwTNhUYBhg+FBcIFRgUBi0VPRYZChcaFggGBAIBFD4GUUUGTDcyKAE5PDkBRDs0LAQBUCg1BAIBJBMWASYmIyssMi42MykpMT0gAgE8UAouHgEMIgwiDEcMKAwoDCgMLgwqDCkCAUEeHR8BNgY1RgFABjVCAT8GNTwBQQY7IkQBTiEGTUE+AU8hBk5BQAFKLgZMQTgBUSMGUBExKAFQGiEBQDYGSTMGHB4kDAYhBjU2BisxDAZCAUw9AUc4AUwZBk4rIgFBMAFDBkNKEj4BSzEoNAEuBk8aBkhMThouAU1OEgZMMjgBSBEuAU8sAUwfNAFPNwFGOAEyBktHLAE1KQE3Bi4pASIBEz0EAT8GSiFJJDogBAFMDDg5BAFBMUEEAU4QNScEAUQGSy80QgQBURA4KAQBLwFDKCw0QUZESDg8TAYlBAFJOAZNKikmRxgGEQQBJgFHNEgUJDAkMCIuIzYjNiM2IzYjNiM2JTQiNDA7MjouNikxLzIpNCU1HysiKygwNz00OjQ6PEI8Qjk/JCwyMC5IKzstPS8/LT0PTAYEAgEuIwwhDB8BDCgBFEwBDCJBKREEAQwvFkkpEQQBDC5RKREEAQxHOUA1FwQBDEM5PjUXBAEMPTk9NRcEAQxFOT81FwQBDEMWSykRBAEMORZHKREEAQw5FkcpEQQBDD4WRykRBAEMLRZFKREEAQw5FkcpEQQBDDEWRSkRBAEMOBZJKREEAQwvFkQpEQQBDDlRGCkRBAEMPyc0GCkRBAEMQSc1GCkRBAEMTic8GCkRBAEMPxZOKREEAQwoNVEnKREEAQwjSykRBAEMNRZGKREEAgEqcGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9uYW1lci5kYXJ0QHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvZmllbGRfbmFtaW5nX21peGluLmRhcnSiDy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGpzX2JhY2tlbmQubmFtZXI7CgphYnN0cmFjdCBjbGFzcyBfTWluaWZpZWRGaWVsZE5hbWVyIGltcGxlbWVudHMgTmFtZXIgewogIF9GaWVsZE5hbWluZ1JlZ2lzdHJ5IGdldCBmaWVsZFJlZ2lzdHJ5OwoKICAvLyBSZXR1cm5zIGEgbWluaW1hbCBuYW1lIGZvciB0aGUgZmllbGQgdGhhdCBpcyBnbG9iYWxseSB1bmlxdWUgYWxvbmcKICAvLyB0aGUgZ2l2ZW4gZWxlbWVudCdzIGNsYXNzIGluaGVyaXRhbmNlIGNoYWluLgogIC8vCiAgLy8gVGhlIGluaGVyaXRhbmNlIHNjb3BlIGJhc2VkIG5hbWluZyBtaWdodCBub3QgeWllbGQgYSBuYW1lLiBGb3IgaW5zdGFuY2UsCiAgLy8gdGhpcyBjb3VsZCBiZSBiZWNhdXNlIHRoZSBmaWVsZCBiZWxvbmdzIHRvIGEgbWl4aW4uIEluIHN1Y2ggYSBjYXNlIHRoaXMKICAvLyB3aWxsIHJldHVybiBgbnVsbGAgYW5kIGEgbm9ybWFsIGZpZWxkIG5hbWUgaGFzIHRvIGJlIHVzZWQuCiAganNBc3QuTmFtZSBfbWluaWZpZWRJbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lKEZpZWxkRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChfbmF0aXZlRGF0YS5oYXNGaXhlZEJhY2tlbmROYW1lKGVsZW1lbnQpKSB7CiAgICAgIHJldHVybiBuZXcgU3RyaW5nQmFja2VkTmFtZShfbmF0aXZlRGF0YS5nZXRGaXhlZEJhY2tlbmROYW1lKGVsZW1lbnQpKTsKICAgIH0KCiAgICBfRmllbGROYW1pbmdTY29wZSBuYW1lczsKICAgIGlmIChlbGVtZW50IGlzIEpSZWNvcmRGaWVsZCkgewogICAgICBuYW1lcyA9IG5ldyBfRmllbGROYW1pbmdTY29wZS5mb3JCb3goZWxlbWVudC5ib3gsIGZpZWxkUmVnaXN0cnkpOwogICAgfSBlbHNlIHsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzczsKICAgICAgbmFtZXMgPSBuZXcgX0ZpZWxkTmFtaW5nU2NvcGUuZm9yQ2xhc3MoY2xzLCBfY2xvc2VkV29ybGQsIGZpZWxkUmVnaXN0cnkpOwogICAgfQoKICAgIGlmIChuYW1lcy5jb250YWluc0ZpZWxkKGVsZW1lbnQpKSB7CiAgICAgIHJldHVybiBuYW1lc1tlbGVtZW50XTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQoKLy8vIEVuY2Fwc3VsYXRlcyB0aGUgZ2xvYmFsIHN0YXRlIG9mIGZpZWxkIG5hbWluZy4KLy8vCi8vLyBUaGUgZmllbGQgbmFtaW5nIHJlZ2lzdHJ5IGFsbG9jYXRlcyBuYW1lcyB0byBiZSB1c2VkIGFsb25nIGEgcGF0aCBpbiB0aGUKLy8vIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBvZiBmaWVsZHMsIHN0YXJ0aW5nIHdpdGggdGhlIG9iamVjdCBjbGFzcy4gVGhlIGFjdHVhbAovLy8gaGllcmFyY2h5IGlzIGVuY29kZWQgdXNpbmcgaW5zdGFuY2VzIG9mIFtfRmllbGROYW1pbmdTY29wZV0uCmNsYXNzIF9GaWVsZE5hbWluZ1JlZ2lzdHJ5IHsKICBmaW5hbCBOYW1lciBuYW1lcjsKCiAgZmluYWwgTWFwPEVudGl0eSwgX0ZpZWxkTmFtaW5nU2NvcGU+IHNjb3BlcyA9CiAgICAgIG5ldyBNYXA8RW50aXR5LCBfRmllbGROYW1pbmdTY29wZT4oKTsKCiAgZmluYWwgTWFwPEVudGl0eSwganNBc3QuTmFtZT4gZ2xvYmFsTmFtZXMgPSBuZXcgTWFwPEVudGl0eSwganNBc3QuTmFtZT4oKTsKCiAgaW50IGdsb2JhbENvdW50ID0gMDsKCiAgZmluYWwgTGlzdDxqc0FzdC5OYW1lPiBuYW1lU3RvcmUgPSBuZXcgTGlzdDxqc0FzdC5OYW1lPigpOwoKICBfRmllbGROYW1pbmdSZWdpc3RyeSh0aGlzLm5hbWVyKTsKCiAgLy8gUmV0dXJucyB0aGUgbmFtZSB0byBiZSB1c2VkIGZvciBhIGZpZWxkIHdpdGggZGlzdGFuY2UgW2luZGV4XSBmcm9tIHRoZQogIC8vIHJvb3Qgb2YgdGhlIG9iamVjdCBoaWVyYXJjaHkuIFRoZSBkaXN0YW5jZSB0aGVyZWJ5IGlzIGNvbXB1dGVkIGFzIHRoZQogIC8vIG51bWJlciBvZiBmaWVsZHMgcHJlY2VkaW5nIHRoZSBjdXJyZW50IGZpZWxkIGluIGl0cyBjbGFzc2VzIGluaGVyaXRhbmNlCiAgLy8gY2hhaW4uCiAgLy8KICAvLyBUaGUgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IG5hbWVzIGFyZSByZXF1ZWRzdGVkIGluIG9yZGVyLCB0aGF0IGlzIHRoZQogIC8vIG5hbWUgYXQgcG9zaXRpb24gaSsxIGlzIHJlcXVlc3RlZCBhZnRlciB0aGUgbmFtZSBhdCBwb3NpdGlvbiBpIHdhcwogIC8vIHJlcXVlc3RlZC4KICBqc0FzdC5OYW1lIGdldE5hbWUoaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPj0gbmFtZVN0b3JlLmxlbmd0aCkgewogICAgICAvLyBUaGUgbmFtZXIgdXN1YWxseSBkb2VzIG5vdCB1c2UgY2VydGFpbiBuYW1lcyBhcyB0aGV5IGNsYXNoIHdpdGgKICAgICAgLy8gZXhpc3RpbmcgcHJvcGVydGllcyBvbiBKUyBvYmplY3RzIChzZWUgW19yZXNlcnZlZE5hdGl2ZVByb3BlcnRpZXNdKS4KICAgICAgLy8gSG93ZXZlciwgc29tZSBvZiB0aGVtIGFyZSByZWFsbHkgc2hvcnQgYW5kIHNhZmUgdG8gdXNlIGZvciBmaWVsZHMuCiAgICAgIC8vIFRodXMsIHdlIHNob3J0Y3V0IHRoZSBuYW1lciB0byB1c2UgdGhvc2UgZmlyc3QuCiAgICAgIGFzc2VydChpbmRleCA9PSBuYW1lU3RvcmUubGVuZ3RoKTsKICAgICAgaWYgKGluZGV4IDwgTWluaWZ5TmFtZXIuX3Jlc2VydmVkTmF0aXZlUHJvcGVydGllcy5sZW5ndGggJiYKICAgICAgICAgIE1pbmlmeU5hbWVyLl9yZXNlcnZlZE5hdGl2ZVByb3BlcnRpZXNbaW5kZXhdLmxlbmd0aCA8PSAyKSB7CiAgICAgICAgbmFtZVN0b3JlLmFkZCgKICAgICAgICAgICAgbmV3IFN0cmluZ0JhY2tlZE5hbWUoTWluaWZ5TmFtZXIuX3Jlc2VydmVkTmF0aXZlUHJvcGVydGllc1tpbmRleF0pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYW1lU3RvcmUuYWRkKG5hbWVyLmdldEZyZXNoTmFtZShuYW1lci5pbnN0YW5jZVNjb3BlLCAiZmllbGQkaW5kZXgiKSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbmFtZVN0b3JlW2luZGV4XTsKICB9Cn0KCi8vLyBBIFtfRmllbGROYW1pbmdTY29wZV0gZW5jb2RlcyBhIG5vZGUgaW4gdGhlIGluaGVyaXRhbmNlIHRyZWUgb2YgdGhlIGN1cnJlbnQKLy8vIGNsYXNzIGhpZXJhcmNoeS4gVGhlIHJvb3Qgbm9kZSB0eXBpY2FsbHkgaXMgdGhlIG5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUKLy8vIGBPYmplY3RgIGNsYXNzLiBJdCBpcyB1c2VkIHRvIGFzc2lnbiBhIHVuaXF1ZSBuYW1lIHRvIGVhY2ggZmllbGQgb2YgYSBjbGFzcy4KLy8vIFVuaXF1ZSBoZXJlIG1lYW5zIHVuaXF1ZSB3cnQuIGFsbCBmaWVsZHMgYWxvbmcgdGhlIHBhdGggYmFjayB0byB0aGUgcm9vdC4KLy8vIFRoaXMgaXMgYWNoaWV2ZWQgYXQgY29uc3RydWN0aW9uIHRpbWUgdmlhIHRoZSBbX2ZpZWxkTmFtZUNvdW50ZXJdIGZpZWxkIHRoYXQKLy8vIGNvdW50cyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBvbiB0aGUgcGF0aCB0byB0aGUgcm9vdCBub2RlIHRoYXQgaGF2ZSBiZWVuCi8vLyBlbmNvdW50ZXJlZCBzbyBmYXIuCi8vLwovLy8gT2J2aW91c2x5LCB0aGlzIG9ubHkgd29ya3MgaWYgbm8gZmllbGRzIGFyZSBhZGRlZCB0byBhIHBhcmVudCBub2RlIGFmdGVyIGl0cwovLy8gY2hpbGRyZW4gaGF2ZSBhZGRlZCB0aGVpciBmaXJzdCBmaWVsZC4KY2xhc3MgX0ZpZWxkTmFtaW5nU2NvcGUgewogIGZpbmFsIF9GaWVsZE5hbWluZ1Njb3BlIHN1cGVyU2NvcGU7CiAgZmluYWwgRW50aXR5IGNvbnRhaW5lcjsKICBmaW5hbCBNYXA8RW50aXR5LCBqc0FzdC5OYW1lPiBuYW1lcyA9IG5ldyBNYXBsZXQ8RW50aXR5LCBqc0FzdC5OYW1lPigpOwogIGZpbmFsIF9GaWVsZE5hbWluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5OwoKICAvLy8gTmFtaW5nIGNvdW50ZXIgdXNlZCBmb3IgZmllbGRzIG9mIG9yZGluYXJ5IGNsYXNzZXMuCiAgaW50IF9maWVsZE5hbWVDb3VudGVyOwoKICAvLy8gVGhlIG51bWJlciBvZiBmaWVsZHMgYWxvbmcgdGhlIHN1cGVyY2xhc3MgY2hhaW4gdGhhdCB1c2UgaW5oZXJpdGFuY2UKICAvLy8gYmFzZWQgbmFtaW5nLCBpbmNsdWRpbmcgdGhlIG9uZXMgYWxsb2NhdGVkIGZvciB0aGlzIHNjb3BlLgogIGludCBnZXQgaW5oZXJpdGFuY2VCYXNlZEZpZWxkTmFtZUNvdW50ZXIgPT4gX2ZpZWxkTmFtZUNvdW50ZXI7CgogIC8vLyBUaGUgbnVtYmVyIG9mIGxvY2FsbHkgdXNlZCBmaWVsZHMuIERlcGVuZGluZyBvbiB0aGUgbmFtaW5nIHNvdXJjZQogIC8vLyAoZS5nLiBpbmhlcml0YW5jZSBiYXNlZCBvciBnbG9iYWxseSB1bmlxdWUgZm9yIG1peGl4bnMpIHRoaXMKICAvLy8gbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gW2luaGVyaXRhbmNlQmFzZWRGaWVsZE5hbWVDb3VudGVyXS4KICBpbnQgZ2V0IF9sb2NhbEZpZWxkTmFtZUNvdW50ZXIgPT4gX2ZpZWxkTmFtZUNvdW50ZXI7CiAgdm9pZCBzZXQgX2xvY2FsRmllbGROYW1lQ291bnRlcihpbnQgdmFsKSB7CiAgICBfZmllbGROYW1lQ291bnRlciA9IHZhbDsKICB9CgogIGZhY3RvcnkgX0ZpZWxkTmFtaW5nU2NvcGUuZm9yQ2xhc3MoCiAgICAgIENsYXNzRW50aXR5IGNscywgSkNsb3NlZFdvcmxkIHdvcmxkLCBfRmllbGROYW1pbmdSZWdpc3RyeSByZWdpc3RyeSkgewogICAgX0ZpZWxkTmFtaW5nU2NvcGUgcmVzdWx0ID0gcmVnaXN0cnkuc2NvcGVzW2Nsc107CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CgogICAgaWYgKHdvcmxkLmlzVXNlZEFzTWl4aW4oY2xzKSkgewogICAgICByZXN1bHQgPSBuZXcgX01peGluRmllbGROYW1pbmdTY29wZS5taXhpbihjbHMsIHJlZ2lzdHJ5KTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBzdXBlcmNsYXNzID0gd29ybGQuZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY2xzKTsKICAgICAgaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewogICAgICAgIHJlc3VsdCA9IG5ldyBfRmllbGROYW1pbmdTY29wZS5yb290U2NvcGUoY2xzLCByZWdpc3RyeSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX0ZpZWxkTmFtaW5nU2NvcGUgc3VwZXJTY29wZSA9CiAgICAgICAgICAgIG5ldyBfRmllbGROYW1pbmdTY29wZS5mb3JDbGFzcyhzdXBlcmNsYXNzLCB3b3JsZCwgcmVnaXN0cnkpOwogICAgICAgIGlmICh3b3JsZC5lbGVtZW50RW52aXJvbm1lbnQuaXNNaXhpbkFwcGxpY2F0aW9uKGNscykpIHsKICAgICAgICAgIHJlc3VsdCA9CiAgICAgICAgICAgICAgbmV3IF9NaXhpbkZpZWxkTmFtaW5nU2NvcGUubWl4ZWRJbihjbHMsIHN1cGVyU2NvcGUsIHJlZ2lzdHJ5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0ID0gbmV3IF9GaWVsZE5hbWluZ1Njb3BlLmluaGVyaXQoY2xzLCBzdXBlclNjb3BlLCByZWdpc3RyeSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgd29ybGQuZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hDbGFzc01lbWJlcihjbHMsCiAgICAgICAgKENsYXNzRW50aXR5IGRlY2xhcmVyLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgIGlmIChtZW1iZXIuaXNGaWVsZCAmJiBtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgcmVzdWx0LmFkZChtZW1iZXIpOwogICAgfSk7CgogICAgcmVnaXN0cnkuc2NvcGVzW2Nsc10gPSByZXN1bHQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZmFjdG9yeSBfRmllbGROYW1pbmdTY29wZS5mb3JCb3goTG9jYWwgYm94LCBfRmllbGROYW1pbmdSZWdpc3RyeSByZWdpc3RyeSkgewogICAgcmV0dXJuIHJlZ2lzdHJ5LnNjb3BlcwogICAgICAgIC5wdXRJZkFic2VudChib3gsICgpID0+IG5ldyBfQm94RmllbGROYW1pbmdTY29wZShib3gsIHJlZ2lzdHJ5KSk7CiAgfQoKICBfRmllbGROYW1pbmdTY29wZS5yb290U2NvcGUodGhpcy5jb250YWluZXIsIHRoaXMucmVnaXN0cnkpCiAgICAgIDogc3VwZXJTY29wZSA9IG51bGwsCiAgICAgICAgX2ZpZWxkTmFtZUNvdW50ZXIgPSAwOwoKICBfRmllbGROYW1pbmdTY29wZS5pbmhlcml0KHRoaXMuY29udGFpbmVyLCB0aGlzLnN1cGVyU2NvcGUsIHRoaXMucmVnaXN0cnkpIHsKICAgIF9maWVsZE5hbWVDb3VudGVyID0gc3VwZXJTY29wZS5pbmhlcml0YW5jZUJhc2VkRmllbGROYW1lQ291bnRlcjsKICB9CgogIC8vLyBDaGVja3Mgd2hldGhlciBbbmFtZV0gaXMgYWxyZWFkeSB1c2VkIGluIHRoZSBjdXJyZW50IHNjb3BlIGNoYWluLgogIF9pc05hbWVVbnVzZWQoanNBc3QuTmFtZSBuYW1lKSB7CiAgICByZXR1cm4gIW5hbWVzLnZhbHVlcy5jb250YWlucyhuYW1lKSAmJgogICAgICAgICgoc3VwZXJTY29wZSA9PSBudWxsKSB8fCBzdXBlclNjb3BlLl9pc05hbWVVbnVzZWQobmFtZSkpOwogIH0KCiAganNBc3QuTmFtZSBfbmV4dE5hbWUoKSA9PiByZWdpc3RyeS5nZXROYW1lKF9sb2NhbEZpZWxkTmFtZUNvdW50ZXIrKyk7CgogIGpzQXN0Lk5hbWUgb3BlcmF0b3IgW10oRW50aXR5IGZpZWxkKSB7CiAgICBqc0FzdC5OYW1lIG5hbWUgPSBuYW1lc1tmaWVsZF07CiAgICBpZiAobmFtZSA9PSBudWxsICYmIHN1cGVyU2NvcGUgIT0gbnVsbCkgcmV0dXJuIHN1cGVyU2NvcGVbZmllbGRdOwogICAgcmV0dXJuIG5hbWU7CiAgfQoKICB2b2lkIGFkZChFbnRpdHkgZmllbGQpIHsKICAgIGlmIChuYW1lcy5jb250YWluc0tleShmaWVsZCkpIHJldHVybjsKCiAgICBqc0FzdC5OYW1lIHZhbHVlID0gX25leHROYW1lKCk7CiAgICBhc3NlcnQoX2lzTmFtZVVudXNlZCh2YWx1ZSksIGZhaWxlZEF0KGZpZWxkKSk7CiAgICBuYW1lc1tmaWVsZF0gPSB2YWx1ZTsKICB9CgogIGJvb2wgY29udGFpbnNGaWVsZChFbnRpdHkgZmllbGQpID0+IG5hbWVzLmNvbnRhaW5zS2V5KGZpZWxkKTsKfQoKLy8vIEZpZWxkIG5hbWVzIGZvciBtaXhpbnMgaGF2ZSB0d28gY29uc3RyYWludHM6IFRoZXkgbmVlZCB0byBiZSB1bmlxdWUgaW4gdGhlCi8vLyBoaWVyYXJjaHkgb2YgZWFjaCBhcHBsaWNhdGlvbiBvZiBhIG1peGluIGFuZCB0aGV5IG5lZWQgdG8gYmUgdGhlIHNhbWUgZm9yCi8vLyBhbGwgYXBwbGljYXRpb25zIG9mIGEgbWl4aW4uIFRvIGFjaGlldmUgdGhpcywgd2UgdXNlIGdsb2JhbCBuYW1pbmcgZm9yCi8vLyBtaXhpbnMgZnJvbSB0aGUgc2FtZSBuYW1lIHBvb2wgYXMgZmllbGRzIGFuZCBhZGQgYSBgJGAgYXQgdGhlIGVuZCB0byBlbnN1cmUKLy8vIHRoZXkgZG8gbm90IGNvbGxpZGUgd2l0aCBub3JtYWwgZmllbGQgbmFtZXMuIFRoZSBgJGAgc2lnbiBpcyB0eXBpY2FsbHkgdXNlZAovLy8gYXMgYSBzZXBhcmF0b3IgYmV0d2VlbiBtZXRob2QgbmFtZXMgYW5kIGFyZ3VtZW50IGNvdW50cyBhbmQgZG9lcyBub3QgYXBwZWFyCi8vLyBpbiBnZW5lcmF0ZWQgbmFtZXMgdGhlbXNlbHZlcy4KY2xhc3MgX01peGluRmllbGROYW1pbmdTY29wZSBleHRlbmRzIF9GaWVsZE5hbWluZ1Njb3BlIHsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IF9sb2NhbEZpZWxkTmFtZUNvdW50ZXIgPT4gcmVnaXN0cnkuZ2xvYmFsQ291bnQ7CiAgQG92ZXJyaWRlCiAgdm9pZCBzZXQgX2xvY2FsRmllbGROYW1lQ291bnRlcihpbnQgdmFsKSB7CiAgICByZWdpc3RyeS5nbG9iYWxDb3VudCA9IHZhbDsKICB9CgogIEBvdmVycmlkZQogIE1hcDxFbnRpdHksIGpzQXN0Lk5hbWU+IGdldCBuYW1lcyA9PiByZWdpc3RyeS5nbG9iYWxOYW1lczsKCiAgX01peGluRmllbGROYW1pbmdTY29wZS5taXhpbihDbGFzc0VudGl0eSBjbHMsIF9GaWVsZE5hbWluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5KQogICAgICA6IHN1cGVyLnJvb3RTY29wZShjbHMsIHJlZ2lzdHJ5KTsKCiAgX01peGluRmllbGROYW1pbmdTY29wZS5taXhlZEluKENsYXNzRW50aXR5IGNvbnRhaW5lciwKICAgICAgX0ZpZWxkTmFtaW5nU2NvcGUgc3VwZXJTY29wZSwgX0ZpZWxkTmFtaW5nUmVnaXN0cnkgcmVnaXN0cnkpCiAgICAgIDogc3VwZXIuaW5oZXJpdChjb250YWluZXIsIHN1cGVyU2NvcGUsIHJlZ2lzdHJ5KTsKCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBfbmV4dE5hbWUoKSB7CiAgICBqc0FzdC5OYW1lIHByb3Bvc2VkID0gc3VwZXIuX25leHROYW1lKCk7CiAgICByZXR1cm4gbmV3IENvbXBvdW5kTmFtZShbcHJvcG9zZWQsIE5hbWVyLl9saXRlcmFsRG9sbGFyXSk7CiAgfQp9CgovLy8gW0JveEZpZWxkRWxlbWVudF0gZmllbGRzIHdvcmsgZGlmZmVyZW50bHkgaW4gdGhhdCB0aGV5IGRvIG5vdCBiZWxvbmcgdG8gYW4KLy8vIGFjdHVhbCBjbGFzcyBidXQgYW4gYW5vbnltb3VzIGJveCBhc3NvY2lhdGVkIHRvIGEgW0xvY2FsXS4gQXMgdGhlcmUgaXMgbm8KLy8vIGluaGVyaXRhbmNlIGNoYWluLCB3ZSBkbyBub3QgbmVlZCB0byBjb21wdXRlIGZpZWxkcyBhIHByaW9yaSBidXQgY2FuIGFzc2lnbgovLy8gbmFtZXMgb24gdGhlIGZseS4KY2xhc3MgX0JveEZpZWxkTmFtaW5nU2NvcGUgZXh0ZW5kcyBfRmllbGROYW1pbmdTY29wZSB7CiAgX0JveEZpZWxkTmFtaW5nU2NvcGUoTG9jYWwgYm94LCBfRmllbGROYW1pbmdSZWdpc3RyeSByZWdpc3RyeSkKICAgICAgOiBzdXBlci5yb290U2NvcGUoYm94LCByZWdpc3RyeSk7CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnNGaWVsZChfKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIG9wZXJhdG9yIFtdKEVudGl0eSBmaWVsZCkgewogICAgaWYgKCFuYW1lcy5jb250YWluc0tleShmaWVsZCkpIGFkZChmaWVsZCk7CiAgICByZXR1cm4gbmFtZXNbZmllbGRdOwogIH0KfQqA6gBOTjwBGgE2KgFIMgVOTUBHNE0GAR0jSA0wUAYBKB0GEQQCATMETVBBHRUBMCwBTQEXAT0BJAFMS00MBVBIECIlSU5MOSlCRhdRD08IBgEdBAIBUE5RTlFMGARRKxomGkonAToZAUtBQQFIQ0I3LR0EASZMNScBJEANRCBBDydJQBNNEU0KCAYBNTZJCAEjEwQBTxtKBAE9Gx8BTkUEAUgjK0IEAUgBKSRGEQQBGyoBJDMaBAFAAgFPTktQUFAjOQw6DC0gBAEMPQFPKAE4QzgBDBstPwQCAU9OUBY3QSgBDCEBDCkvGQQCATdwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2ZpZWxkX25hbWluZ19taXhpbi5kYXJ0PXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvZnJlcXVlbmN5X25hbWVyLmRhcnSQ0i8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGpzX2JhY2tlbmQubmFtZXI7CgpjbGFzcyBGcmVxdWVuY3lCYXNlZE5hbWVyIGV4dGVuZHMgTmFtZXIKICAgIHdpdGggX01pbmlmaWVkRmllbGROYW1lciwgX01pbmlmaWVkT25lU2hvdEludGVyY2VwdG9yTmFtZXIKICAgIGltcGxlbWVudHMganNBc3QuVG9rZW5GaW5hbGl6ZXIgewogIEBvdmVycmlkZQogIF9GaWVsZE5hbWluZ1JlZ2lzdHJ5IGZpZWxkUmVnaXN0cnk7CiAgTGlzdDxUb2tlbk5hbWU+IHRva2VucyA9IG5ldyBMaXN0PFRva2VuTmFtZT4oKTsKCiAgTWFwPE5hbWluZ1Njb3BlLCBUb2tlblNjb3BlPiBfdG9rZW5TY29wZXMgPQogICAgICBuZXcgTWFwbGV0PE5hbWluZ1Njb3BlLCBUb2tlblNjb3BlPigpOwoKICAvLyBTb21lIGJhc2ljIHNldHRpbmdzIGZvciBzbWFsbGVyIG5hbWVzCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBpc29sYXRlTmFtZSA9PiAnSSc7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBpc29sYXRlUHJvcGVydGllc05hbWUgPT4gJ3AnOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IHNob3VsZE1pbmlmeSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGdlbmVyaWNJbnN0YW50aWF0aW9uUHJlZml4ID0+IHInJEknOwoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIGdldCBzdGF0aWNzUHJvcGVydHlOYW1lID0+CiAgICAgIF9zdGF0aWNzUHJvcGVydHlOYW1lID8/PSBnZXRGcmVzaE5hbWUoaW5zdGFuY2VTY29wZSwgJ3N0YXRpYycpOwoKICBGcmVxdWVuY3lCYXNlZE5hbWVyKAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIFJ1bnRpbWVUeXBlVGFncyBydGlUYWdzLCBGaXhlZE5hbWVzIGZpeGVkTmFtZXMpCiAgICAgIDogc3VwZXIoY2xvc2VkV29ybGQsIHJ0aVRhZ3MsIGZpeGVkTmFtZXMpIHsKICAgIGZpZWxkUmVnaXN0cnkgPSBuZXcgX0ZpZWxkTmFtaW5nUmVnaXN0cnkodGhpcyk7CiAgfQoKICBUb2tlblNjb3BlIG5ld1Njb3BlRm9yKE5hbWluZ1Njb3BlIHNjb3BlKSB7CiAgICBpZiAoc2NvcGUgPT0gaW5zdGFuY2VTY29wZSkgewogICAgICBTZXQ8U3RyaW5nPiBpbGxlZ2FsTmFtZXMgPSBuZXcgU2V0PFN0cmluZz4uZnJvbShqc1Jlc2VydmVkKTsKICAgICAgZm9yIChTdHJpbmcgaWxsZWdhbCBpbiBNaW5pZnlOYW1lci5fcmVzZXJ2ZWROYXRpdmVQcm9wZXJ0aWVzKSB7CiAgICAgICAgaWxsZWdhbE5hbWVzLmFkZChpbGxlZ2FsKTsKICAgICAgICBpZiAoTWluaWZ5TmFtZXIuX2hhc0Jhbm5lZFByZWZpeChpbGxlZ2FsKSkgewogICAgICAgICAgaWxsZWdhbE5hbWVzLmFkZChpbGxlZ2FsLnN1YnN0cmluZygxKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBuZXcgVG9rZW5TY29wZShpbGxlZ2FsTmFtZXMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBUb2tlblNjb3BlKGpzUmVzZXJ2ZWQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBnZXRGcmVzaE5hbWUoTmFtaW5nU2NvcGUgc2NvcGUsIFN0cmluZyBwcm9wb3NlZE5hbWUsCiAgICAgIHtib29sIHNhbml0aXplRm9yTmF0aXZlczogZmFsc2UsIGJvb2wgc2FuaXRpemVGb3JBbm5vdGF0aW9uczogZmFsc2V9KSB7CiAgICAvLyBHcmFiIHRoZSBzY29wZSBmb3IgdGhpcyB0b2tlbgogICAgVG9rZW5TY29wZSB0b2tlblNjb3BlID0KICAgICAgICBfdG9rZW5TY29wZXMucHV0SWZBYnNlbnQoc2NvcGUsICgpID0+IG5ld1Njb3BlRm9yKHNjb3BlKSk7CgogICAgLy8gR2V0IHRoZSBuYW1lIHRoZSBub3JtYWwgbmFtZXIgd291bGQgdXNlIGFzIGEga2V5LgogICAgU3RyaW5nIHByb3Bvc2VkID0gX2dlbmVyYXRlRnJlc2hTdHJpbmdGb3JOYW1lKHByb3Bvc2VkTmFtZSwgc2NvcGUsCiAgICAgICAgc2FuaXRpemVGb3JOYXRpdmVzOiBzYW5pdGl6ZUZvck5hdGl2ZXMsCiAgICAgICAgc2FuaXRpemVGb3JBbm5vdGF0aW9uczogc2FuaXRpemVGb3JBbm5vdGF0aW9ucyk7CgogICAgVG9rZW5OYW1lIG5hbWUgPSBuZXcgVG9rZW5OYW1lKHRva2VuU2NvcGUsIHByb3Bvc2VkKTsKICAgIHRva2Vucy5hZGQobmFtZSk7CiAgICByZXR1cm4gbmFtZTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0Lk5hbWUgaW5zdGFuY2VGaWVsZFByb3BlcnR5TmFtZShGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICBqc0FzdC5OYW1lIHByb3Bvc2VkID0gX21pbmlmaWVkSW5zdGFuY2VGaWVsZFByb3BlcnR5TmFtZShlbGVtZW50KTsKICAgIGlmIChwcm9wb3NlZCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBwcm9wb3NlZDsKICAgIH0KICAgIHJldHVybiBzdXBlci5pbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmaW5hbGl6ZVRva2VucygpIHsKICAgIGludCBjb21wYXJlUmVmZXJlbmNlQ291bnQoVG9rZW5OYW1lIGEsIFRva2VuTmFtZSBiKSB7CiAgICAgIGludCByZXN1bHQgPSBiLl9yYyAtIGEuX3JjOwogICAgICBpZiAocmVzdWx0ID09IDApIHJlc3VsdCA9IGEua2V5LmNvbXBhcmVUbyhiLmtleSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgTGlzdDxUb2tlbk5hbWU+IHVzZWROYW1lcyA9CiAgICAgICAgdG9rZW5zLndoZXJlKChUb2tlbk5hbWUgYSkgPT4gYS5fcmMgPiAwKS50b0xpc3QoKTsKICAgIHVzZWROYW1lcy5zb3J0KGNvbXBhcmVSZWZlcmVuY2VDb3VudCk7CiAgICB1c2VkTmFtZXMuZm9yRWFjaCgoVG9rZW5OYW1lIHRva2VuKSA9PiB0b2tlbi5maW5hbGl6ZSgpKTsKICB9Cn0KCmNsYXNzIFRva2VuU2NvcGUgewogIExpc3Q8aW50PiBfbmV4dE5hbWUgPSBbJGFdOwogIGZpbmFsIFNldDxTdHJpbmc+IGlsbGVnYWxOYW1lczsKCiAgVG9rZW5TY29wZShbdGhpcy5pbGxlZ2FsTmFtZXMgPSBjb25zdCBJbW11dGFibGVFbXB0eVNldCgpXSk7CgogIC8vLyBJbmNyZW1lbnRzIHRoZSBsZXR0ZXIgYXQgW3Bvc10gaW4gdGhlIGN1cnJlbnQgbmFtZS4gQWxzbyB0YWtlcyBjYXJlIG9mCiAgLy8vIG92ZXJmbG93cyB0byB0aGUgbGVmdC4gUmV0dXJucyB0aGUgY2FycnkgYml0LCBpLmUuLCBpdCByZXR1cm5zIGB0cnVlYAogIC8vLyBpZiBhbGwgcG9zaXRpb25zIHRvIHRoZSBsZWZ0IGhhdmUgd3JhcHBlZCBhcm91bmQuCiAgLy8vCiAgLy8vIElmIFtfbmV4dE5hbWVdIGlzIGluaXRpYWxseSAnYScsIHRoaXMgd2lsbCBnZW5lcmF0ZSB0aGUgc2VxdWVuY2UKICAvLy8KICAvLy8gW2EtekEtWl0KICAvLy8gW2EtekEtWl1bXzAtOWEtekEtWl0KICAvLy8gW2EtekEtWl1bXzAtOWEtekEtWl1bXzAtOWEtekEtWl0KICAvLy8gLi4uCiAgYm9vbCBfaW5jcmVtZW50UG9zaXRpb24oaW50IHBvcykgewogICAgYm9vbCBvdmVyZmxvdyA9IGZhbHNlOwogICAgaWYgKHBvcyA8IDApIHJldHVybiB0cnVlOwogICAgaW50IHZhbHVlID0gX25leHROYW1lW3Bvc107CiAgICBpZiAodmFsdWUgPT0gJF8pIHsKICAgICAgdmFsdWUgPSAkMDsKICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gJDkpIHsKICAgICAgdmFsdWUgPSAkYTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gJHopIHsKICAgICAgdmFsdWUgPSAkQTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gJFopIHsKICAgICAgb3ZlcmZsb3cgPSBfaW5jcmVtZW50UG9zaXRpb24ocG9zIC0gMSk7CiAgICAgIHZhbHVlID0gKHBvcyA+IDApID8gJF8gOiAkYTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlKys7CiAgICB9CiAgICBfbmV4dE5hbWVbcG9zXSA9IHZhbHVlOwogICAgcmV0dXJuIG92ZXJmbG93OwogIH0KCiAgX2luY3JlbWVudE5hbWUoKSB7CiAgICBpZiAoX2luY3JlbWVudFBvc2l0aW9uKF9uZXh0TmFtZS5sZW5ndGggLSAxKSkgewogICAgICBfbmV4dE5hbWUuYWRkKCRfKTsKICAgIH0KICB9CgogIFN0cmluZyBnZXROZXh0TmFtZSgpIHsKICAgIFN0cmluZyBwcm9wb3NhbDsKICAgIGRvIHsKICAgICAgcHJvcG9zYWwgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoX25leHROYW1lKTsKICAgICAgX2luY3JlbWVudE5hbWUoKTsKICAgIH0gd2hpbGUgKE1pbmlmeU5hbWVyLl9oYXNCYW5uZWRQcmVmaXgocHJvcG9zYWwpIHx8CiAgICAgICAgaWxsZWdhbE5hbWVzLmNvbnRhaW5zKHByb3Bvc2FsKSk7CgogICAgcmV0dXJuIHByb3Bvc2FsOwogIH0KfQqAlABOTjwBGgEoPyYMJjIBLi0BKwwhDCsMIQEMMgEMKEYBF1AyNAQBLiJDRiM1MgoIKw0pBgQBDEJOJRxDATlHMDkBOhYRBAEMPkccFwY1BAEMGjoiOBUGASA7Kz4EAgETHiIBPwFNTDgGRwYPGycKJRseIBcSHhIeEh4uIw0PBhwVBAEVNBkGBAEZFQk2GDcqARUEAgE0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9mcmVxdWVuY3lfbmFtZXIuZGFydDpzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL21pbmlmeV9uYW1lci5kYXJ0uK4vLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBqc19iYWNrZW5kLm5hbWVyOwoKLy8vIEFzc2lnbnMgSmF2YVNjcmlwdCBpZGVudGlmaWVycyB0byBEYXJ0IHZhcmlhYmxlcywgY2xhc3MtbmFtZXMgYW5kIG1lbWJlcnMuCmNsYXNzIE1pbmlmeU5hbWVyIGV4dGVuZHMgTmFtZXIKICAgIHdpdGgKICAgICAgICBfTWluaWZpZWRGaWVsZE5hbWVyLAogICAgICAgIF9NaW5pZnlDb25zdHJ1Y3RvckJvZHlOYW1lciwKICAgICAgICBfTWluaWZpZWRPbmVTaG90SW50ZXJjZXB0b3JOYW1lciB7CiAgTWluaWZ5TmFtZXIoCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwgUnVudGltZVR5cGVUYWdzIHJ0aVRhZ3MsIEZpeGVkTmFtZXMgZml4ZWROYW1lcykKICAgICAgOiBzdXBlcihjbG9zZWRXb3JsZCwgcnRpVGFncywgZml4ZWROYW1lcykgewogICAgcmVzZXJ2ZUJhY2tlbmROYW1lcygpOwogICAgZmllbGRSZWdpc3RyeSA9IG5ldyBfRmllbGROYW1pbmdSZWdpc3RyeSh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIF9GaWVsZE5hbWluZ1JlZ2lzdHJ5IGZpZWxkUmVnaXN0cnk7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgaXNvbGF0ZU5hbWUgPT4gJ0knOwogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgaXNvbGF0ZVByb3BlcnRpZXNOYW1lID0+ICdwJzsKICBAb3ZlcnJpZGUKICBib29sIGdldCBzaG91bGRNaW5pZnkgPT4gdHJ1ZTsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGdlbmVyaWNJbnN0YW50aWF0aW9uUHJlZml4ID0+IHInJEknOwoKICBmaW5hbCBBTFBIQUJFVF9DSEFSQUNURVJTID0gNTI7IC8vIGEtekEtWi4KICBmaW5hbCBBTFBIQU5VTUVSSUNfQ0hBUkFDVEVSUyA9IDYyOyAvLyBhLXpBLVowLTkuCgogIC8vLyBZb3UgY2FuIHBhc3MgYW4gaW52YWxpZCBpZGVudGlmaWVyIHRvIHRoaXMgYW5kIHVubGlrZSBpdHMgbm9uLW1pbmlmeWluZwogIC8vLyBjb3VudGVycGFydCBpdCB3aWxsIG5ldmVyIHJldHVybiB0aGUgcHJvcG9zZWROYW1lIGFzIHRoZSBuZXcgZnJlc2ggbmFtZS4KICAvLy8KICAvLy8gW3Nhbml0aXplRm9yTmF0aXZlc10gYW5kIFtzYW5pdGl6ZUZvckFubm90YXRpb25zXSBhcmUgaWdub3JlZCBiZWNhdXNlIHRoZQogIC8vLyBtaW5pZmllZCBuYW1lcyB3aWxsIGFsd2F5cyBhdm9pZCBjbGFzaGluZyB3aXRoIGFubm90YXRlZCBuYW1lcyBvciBuYXRpdmVzLgogIEBvdmVycmlkZQogIFN0cmluZyBfZ2VuZXJhdGVGcmVzaFN0cmluZ0Zvck5hbWUoU3RyaW5nIHByb3Bvc2VkTmFtZSwgTmFtaW5nU2NvcGUgc2NvcGUsCiAgICAgIHtib29sIHNhbml0aXplRm9yTmF0aXZlczogZmFsc2UsIGJvb2wgc2FuaXRpemVGb3JBbm5vdGF0aW9uczogZmFsc2V9KSB7CiAgICBTdHJpbmcgZnJlc2hOYW1lOwogICAgU3RyaW5nIHN1Z2dlc3Rpb24gPSBzY29wZS5zdWdnZXN0TmFtZShwcm9wb3NlZE5hbWUpOwogICAgaWYgKHN1Z2dlc3Rpb24gIT0gbnVsbCAmJiBzY29wZS5pc1VudXNlZChzdWdnZXN0aW9uKSkgewogICAgICBmcmVzaE5hbWUgPSBzdWdnZXN0aW9uOwogICAgfSBlbHNlIHsKICAgICAgZnJlc2hOYW1lID0gX2dldFVudXNlZE5hbWUocHJvcG9zZWROYW1lLCBzY29wZSk7CiAgICB9CiAgICBzY29wZS5yZWdpc3RlclVzZShmcmVzaE5hbWUpOwogICAgcmV0dXJuIGZyZXNoTmFtZTsKICB9CgogIC8vIEZyb20gaXNzdWUgNzU1NC4gIFRoZXNlIHNob3VsZCBub3QgYmUgdXNlZCBvbiBvYmplY3RzIChhcyBpbnN0YW5jZQogIC8vIHZhcmlhYmxlcykgYmVjYXVzZSB0aGV5IGNsYXNoIHdpdGggbmFtZXMgZnJvbSB0aGUgRE9NLiBIb3dldmVyLCBpdCBpcwogIC8vIE9LIHRvIHVzZSB0aGVtIGFzIGZpZWxkcywgYXMgd2Ugb25seSBhY2Nlc3MgZmllbGRzIGRpcmVjdGx5IGlmIHdlIGtub3cKICAvLyB0aGUgcmVjZWl2ZXIgdHlwZS4KICBzdGF0aWMgY29uc3QgTGlzdDxTdHJpbmc+IF9yZXNlcnZlZE5hdGl2ZVByb3BlcnRpZXMgPSBjb25zdCA8U3RyaW5nPlsKICAgICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdyJywgJ3gnLCAneScsICd6JywgJ1EnLAogICAgLy8gMi1sZXR0ZXI6CiAgICAnY2gnLCAnY3gnLCAnY3knLCAnZGInLCAnZHgnLCAnZHknLCAnZnInLCAnZngnLCAnZnknLCAnZ28nLCAnaWQnLCAnazEnLAogICAgJ2syJywgJ2szJywgJ2s0JywgJ3IxJywgJ3IyJywgJ3J4JywgJ3J5JywgJ3gxJywgJ3gyJywgJ3kxJywgJ3kyJywKICAgIC8vIDMtbGV0dGVyOgogICAgJ2FkZCcsICdhbGwnLCAnYWx0JywgJ2FyYycsICdDQ1cnLCAnY21wJywgJ2RpcicsICdlbmQnLCAnZ2V0JywgJ2luMScsCiAgICAnaW4yJywgJ0lOVCcsICdrZXknLCAnbG9nJywgJ2xvdycsICdtMTEnLCAnbTEyJywgJ20xMycsICdtMTQnLCAnbTIxJywKICAgICdtMjInLCAnbTIzJywgJ20yNCcsICdtMzEnLCAnbTMyJywgJ20zMycsICdtMzQnLCAnbTQxJywgJ200MicsICdtNDMnLAogICAgJ200NCcsICdtYXgnLCAnbWluJywgJ25vdycsICdPTkUnLCAncHV0JywgJ3JlZCcsICdyZWwnLCAncmV2JywgJ1JHQicsCiAgICAnc2RwJywgJ3NldCcsICdzcmMnLCAndGFnJywgJ3RvcCcsICd1aWQnLCAndXJpJywgJ3VybCcsICdVUkwnLAogICAgLy8gNC1sZXR0ZXI6CiAgICAnYWJicicsICdhdG9iJywgJ0F0dHInLCAnYXhlcycsICdheGlzJywgJ2JhY2snLCAnQkFDSycsICdiZXRhJywgJ2JpYXMnLAogICAgJ0Jsb2InLCAnYmx1ZScsICdibHVyJywgJ0JMVVInLCAnYm9keScsICdCT09MJywgJ0JPVEgnLCAnYnRvYScsICdCWVRFJywKICAgICdjaXRlJywgJ2NsaXAnLCAnY29kZScsICdjb2xzJywgJ2N1ZXMnLCAnZGF0YScsICdERUNSJywgJ0RPTkUnLCAnZmFjZScsCiAgICAnZmlsZScsICdGaWxlJywgJ2ZpbGwnLCAnZmluZCcsICdmb250JywgJ2Zvcm0nLCAnZ2FpbicsICdoYXNoJywgJ2hlYWQnLAogICAgJ2hpZ2gnLCAnaGludCcsICdob3N0JywgJ2hyZWYnLCAnSFJURicsICdJRExFJywgJ0lOQ1InLCAnaW5mbycsICdJTklUJywKICAgICdpc0lkJywgJ2l0ZW0nLCAnS0VFUCcsICdraW5kJywgJ2tuZWUnLCAnbGFuZycsICdsZWZ0JywgJ0xFU1MnLCAnbGluZScsCiAgICAnbGluaycsICdsaXN0JywgJ2xvYWQnLCAnbG9vcCcsICdtb2RlJywgJ25hbWUnLCAnTm9kZScsICdOb25lJywgJ05PTkUnLAogICAgJ29ubHknLCAnb3BlbicsICdPUEVOJywgJ3BpbmcnLCAncGxheScsICdwb3J0JywgJ3JlY3QnLCAnUmVjdCcsICdyZWZYJywKICAgICdyZWZZJywgJ1JHQkEnLCAncm9vdCcsICdyb3dzJywgJ3NhdmUnLCAnc2VlZCcsICdzZWVrJywgJ3NlbGYnLCAnc2VuZCcsCiAgICAnc2hvdycsICdTSU5FJywgJ3NpemUnLCAnc3BhbicsICdzdGF0JywgJ3N0ZXAnLCAnc3RvcCcsICd0YWdzJywgJ3RleHQnLAogICAgJ1RleHQnLCAndGltZScsICd0eXBlJywgJ3ZpZXcnLCAnd2FybicsICd3cmFwJywgJ1pFUk8nCiAgXTsKCiAgdm9pZCByZXNlcnZlQmFja2VuZE5hbWVzKCkgewogICAgZm9yIChTdHJpbmcgbmFtZSBpbiBfcmVzZXJ2ZWROYXRpdmVQcm9wZXJ0aWVzKSB7CiAgICAgIGlmIChuYW1lLmxlbmd0aCA8IDIpIHsKICAgICAgICAvLyBFbnN1cmUgdGhlIDEtbGV0dGVyIG5hbWVzIGFyZSBkaXNhbWJpZ3VhdGVkIHRvIHRoZSBzYW1lIG5hbWUuCiAgICAgICAgU3RyaW5nIGRpc2FtYmlndWF0ZWROYW1lID0gbmFtZTsKICAgICAgICByZXNlcnZlUHVibGljTWVtYmVyTmFtZShuYW1lLCBkaXNhbWJpZ3VhdGVkTmFtZSk7CiAgICAgIH0KICAgICAgaW5zdGFuY2VTY29wZS5yZWdpc3RlclVzZShuYW1lKTsKICAgICAgLy8gR2V0dGVyIGFuZCBzZXR0ZXIgbmFtZXMgYXJlIGF1dG9nZW5lcmF0ZWQgYnkgcHJlcGVuZGluZyAnZycgYW5kICdzJyB0bwogICAgICAvLyBmaWVsZCBuYW1lcy4gIFRoZXJlZm9yZSB0aGVyZSBhcmUgc29tZSBmaWVsZCBuYW1lcyB3ZSBkb24ndCB3YW50IHRvCiAgICAgIC8vIHVzZS4gIEl0IGlzIGltcGxpY2l0IGluIHRoZSBuZXh0IGxpbmUgdGhhdCB0aGUgYmFubmVkIHByZWZpeCBpcwogICAgICAvLyBvbmx5IG9uZSBjaGFyYWN0ZXIuCiAgICAgIGlmIChfaGFzQmFubmVkUHJlZml4KG5hbWUpKSB7CiAgICAgICAgaW5zdGFuY2VTY29wZS5yZWdpc3RlclVzZShuYW1lLnN1YnN0cmluZygxKSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBUaGVzZSBwb3B1bGFyIG5hbWVzIGFyZSBwcmVzZW50IGluIG1vc3QgcHJvZ3JhbXMgYW5kIGRlc2VydmUKICAgIC8vIHNpbmdsZSBjaGFyYWN0ZXIgbWluaWZpZWQgbmFtZXMuICBXZSBjb3VsZCBkZXRlcm1pbmUgdGhlIHBvcHVsYXIgbmFtZXMKICAgIC8vIGluZGl2aWR1YWxseSBwZXIgcHJvZ3JhbSwgYnV0IHRoYXQgd291bGQgbWVhbiB0aGF0IHRoZSBvdXRwdXQgb2YgdGhlCiAgICAvLyBtaW5pZmllciB3YXMgbGVzcyBzdGFibGUgZnJvbSB2ZXJzaW9uIHRvIHZlcnNpb24gb2YgdGhlIHByb2dyYW0gYmVpbmcKICAgIC8vIG1pbmlmaWVkLgogICAgX3BvcHVsYXRlU3VnZ2VzdGVkTmFtZXMoaW5zdGFuY2VTY29wZSwgY29uc3QgPFN0cmluZz5bCiAgICAgIHInJGFkZCcsCiAgICAgIHInYWRkJDEnLAogICAgICByJyRhbmQnLAogICAgICByJyRvcicsCiAgICAgIHInY3VycmVudCcsCiAgICAgIHInJHNocicsCiAgICAgIHInJGVxJywKICAgICAgcickbmUnLAogICAgICByJyRpbmRleCcsCiAgICAgIHInJGluZGV4U2V0JywKICAgICAgcickeG9yJywKICAgICAgcidjbG9uZSQwJywKICAgICAgcidpdGVyYXRvcicsCiAgICAgIHInbGVuZ3RoJywKICAgICAgcickbHQnLAogICAgICByJyRndCcsCiAgICAgIHInJGxlJywKICAgICAgcickZ2UnLAogICAgICByJ21vdmVOZXh0JDAnLAogICAgICByJ25vZGUnLAogICAgICByJ29uJywKICAgICAgcickbmVnYXRlJywKICAgICAgcidwdXNoJywKICAgICAgcidzZWxmJywKICAgICAgcidzdGFydCcsCiAgICAgIHIndGFyZ2V0JywKICAgICAgcickc2hsJywKICAgICAgcid2YWx1ZScsCiAgICAgIHInd2lkdGgnLAogICAgICByJ3N0eWxlJywKICAgICAgcidub1N1Y2hNZXRob2QkMScsCiAgICAgIHInJG11bCcsCiAgICAgIHInJGRpdicsCiAgICAgIHInJHN1YicsCiAgICAgIHInJG5vdCcsCiAgICAgIHInJG1vZCcsCiAgICAgIHInJHRkaXYnLAogICAgICByJ3RvU3RyaW5nJDAnCiAgICBdKTsKCiAgICBfcG9wdWxhdGVTdWdnZXN0ZWROYW1lcyhnbG9iYWxTY29wZSwgY29uc3QgPFN0cmluZz5bCiAgICAgIHInT2JqZWN0JywKICAgICAgJ3dyYXBFeGNlcHRpb24nLAogICAgICByJyRlcScsCiAgICAgIHInUycsCiAgICAgIHInaW9vcmUnLAogICAgICByJ1Vuc3VwcG9ydGVkRXJyb3IkJywKICAgICAgcidsZW5ndGgnLAogICAgICByJyRzdWInLAogICAgICByJyRhZGQnLAogICAgICByJyRndCcsCiAgICAgIHInJGdlJywKICAgICAgcickbHQnLAogICAgICByJyRsZScsCiAgICAgIHInYWRkJywKICAgICAgcidpYWUnLAogICAgICByJ0FyZ3VtZW50RXJyb3IkJywKICAgICAgcidCb3VuZENsb3N1cmUnLAogICAgICByJ0Nsb3N1cmUnLAogICAgICByJ1N0YXRlRXJyb3IkJywKICAgICAgcidnZXRJbnRlcmNlcHRvciQnLAogICAgICByJ21heCcsCiAgICAgIHInJG11bCcsCiAgICAgIHInTWFwJywKICAgICAgcidLZXlfS2V5JywKICAgICAgcickZGl2JywKICAgICAgcidMaXN0X0xpc3QkZnJvbScsCiAgICAgIHInTGlua2VkSGFzaE1hcF9MaW5rZWRIYXNoTWFwJF9lbXB0eScsCiAgICAgIHInTGlua2VkSGFzaE1hcF9MaW5rZWRIYXNoTWFwJF9saXRlcmFsJywKICAgICAgcidtaW4nLAogICAgICByJ1JhbmdlRXJyb3IkdmFsdWUnLAogICAgICByJ0pTU3RyaW5nJywKICAgICAgcidKU051bWJlcicsCiAgICAgIHInSlNBcnJheScsCiAgICAgIHInY3JlYXRlSW52b2NhdGlvbk1pcnJvcicsCiAgICAgIHInU3RyaW5nJywKICAgICAgcidzZXRSdW50aW1lVHlwZUluZm8nLAogICAgICByJ2NyZWF0ZVJ1bnRpbWVUeXBlJwogICAgXSk7CiAgfQoKICB2b2lkIF9wb3B1bGF0ZVN1Z2dlc3RlZE5hbWVzKE5hbWluZ1Njb3BlIHNjb3BlLCBMaXN0PFN0cmluZz4gc3VnZ2VzdGlvbnMpIHsKICAgIGludCBjID0gJGEgLSAxOwogICAgU3RyaW5nIGxldHRlcjsKICAgIGZvciAoU3RyaW5nIG5hbWUgaW4gc3VnZ2VzdGlvbnMpIHsKICAgICAgZG8gewogICAgICAgIGFzc2VydChjICE9ICRaKTsKICAgICAgICBjID0gKGMgPT0gJHopID8gJEEgOiBjICsgMTsKICAgICAgICBsZXR0ZXIgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoW2NdKTsKICAgICAgfSB3aGlsZSAoX2hhc0Jhbm5lZFByZWZpeChsZXR0ZXIpIHx8IHNjb3BlLmlzVXNlZChsZXR0ZXIpKTsKICAgICAgYXNzZXJ0KCFzY29wZS5oYXNTdWdnZXN0aW9uKG5hbWUpKTsKICAgICAgc2NvcGUuYWRkU3VnZ2VzdGlvbihuYW1lLCBsZXR0ZXIpOwogICAgfQogIH0KCiAgLy8gVGhpcyBnZXRzIGEgbWluaWZpZWQgbmFtZSBiYXNlZCBvbiBhIGhhc2ggb2YgdGhlIHByb3Bvc2VkIG5hbWUuICBUaGlzCiAgLy8gaXMgc2xpZ2h0bHkgbGVzcyBlZmZpY2llbnQgdGhhbiBqdXN0IGdldHRpbmcgdGhlIG5leHQgbmFtZSBpbiBhIHNlcmllcywKICAvLyBidXQgaXQgbWVhbnMgdGhhdCBzbWFsbCBjaGFuZ2VzIGluIHRoZSBpbnB1dCBwcm9ncmFtIHdpbGwgZ2l2ZSBzbWFsbGlzaAogIC8vIGNoYW5nZXMgaW4gdGhlIG91dHB1dCwgd2hpY2ggY2FuIGJlIHVzZWZ1bCBmb3IgZGlmZmluZyBldGMuCiAgU3RyaW5nIF9nZXRVbnVzZWROYW1lKFN0cmluZyBwcm9wb3NlZE5hbWUsIE5hbWluZ1Njb3BlIHNjb3BlKSB7CiAgICBpbnQgaGFzaCA9IF9jYWxjdWxhdGVIYXNoKHByb3Bvc2VkTmFtZSk7CiAgICAvLyBBdm9pZCB2ZXJ5IHNtYWxsIGhhc2hlcyB0aGF0IHdvbid0IHRyeSBtYW55IG5hbWVzLgogICAgaGFzaCA9IGhhc2ggPCAxMDAwID8gaGFzaCAqIDMxNDE1OSA6IGhhc2g7IC8vIFllcywgaXQncyBwcmltZS4KCiAgICAvLyBUcnkgb3RoZXIgbi1jaGFyYWN0ZXIgbmFtZXMgYmFzZWQgb24gdGhlIGhhc2guICBXZSB0cnkgb25lIHRvIHRocmVlCiAgICAvLyBjaGFyYWN0ZXIgaWRlbnRpZmllcnMuICBGb3IgZWFjaCBsZW5ndGggd2UgdHJ5IGFyb3VuZCAxMCBkaWZmZXJlbnQgbmFtZXMKICAgIC8vIGluIGEgcHJlZGljdGFibGUgb3JkZXIgZGV0ZXJtaW5lZCBieSB0aGUgcHJvcG9zZWQgbmFtZS4gIFRoaXMgaXMgaW4gb3JkZXIKICAgIC8vIHRvIG1ha2UgdGhlIHJlbmFtZXIgc3RhYmxlOiBzbWFsbCBjaGFuZ2VzIGluIHRoZSBpbnB1dCBzaG91bGQgbm9ybmFsbHkKICAgIC8vIHJlc3VsdCBpbiByZWxhdGl2ZWx5IHNtYWxsIGNoYW5nZXMgaW4gdGhlIG91dHB1dC4KICAgIGZvciAoaW50IG4gPSAxOyBuIDw9IDM7IG4rKykgewogICAgICBpbnQgaCA9IGhhc2g7CiAgICAgIHdoaWxlIChoID4gMTApIHsKICAgICAgICBMaXN0PGludD4gY29kZXMgPSA8aW50PltfbGV0dGVyTnVtYmVyKGgpXTsKICAgICAgICBpbnQgaDIgPSBoIH4vIEFMUEhBQkVUX0NIQVJBQ1RFUlM7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspIHsKICAgICAgICAgIGNvZGVzLmFkZChfYWxwaGFOdW1lcmljTnVtYmVyKGgyKSk7CiAgICAgICAgICBoMiB+Lz0gQUxQSEFOVU1FUklDX0NIQVJBQ1RFUlM7CiAgICAgICAgfQogICAgICAgIGZpbmFsIGNhbmRpZGF0ZSA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2Rlcyk7CiAgICAgICAgaWYgKHNjb3BlLmlzVW51c2VkKGNhbmRpZGF0ZSkgJiYKICAgICAgICAgICAgIWpzUmVzZXJ2ZWQuY29udGFpbnMoY2FuZGlkYXRlKSAmJgogICAgICAgICAgICAhX2hhc0Jhbm5lZFByZWZpeChjYW5kaWRhdGUpICYmCiAgICAgICAgICAgIChuICE9IDEgfHwgc2NvcGUuaXNTdWdnZXN0aW9uKGNhbmRpZGF0ZSkpKSB7CiAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlOwogICAgICAgIH0KICAgICAgICAvLyBUcnkgYWdhaW4gd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBoYXNoLiAgQWZ0ZXIgYXJvdW5kIDEwIHR1cm5zCiAgICAgICAgLy8gYXJvdW5kIHRoaXMgbG9vcCBoIGlzIHplcm8gYW5kIHdlIHRyeSBhIGxvbmdlciBuYW1lLgogICAgICAgIGggfi89IDc7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfYmFkTmFtZShoYXNoLCBzY29wZSk7CiAgfQoKICAvLy8gSW5zdGFuY2UgbWVtYmVycyBzdGFydGluZyB3aXRoIGcgYW5kIHMgYXJlIHJlc2VydmVkIGZvciBnZXR0ZXJzIGFuZAogIC8vLyBzZXR0ZXJzLgogIHN0YXRpYyBib29sIF9oYXNCYW5uZWRQcmVmaXgoU3RyaW5nIG5hbWUpIHsKICAgIGludCBjb2RlID0gbmFtZS5jb2RlVW5pdEF0KDApOwogICAgcmV0dXJuIGNvZGUgPT0gJGcgfHwgY29kZSA9PSAkczsKICB9CgogIGludCBfY2FsY3VsYXRlSGFzaChTdHJpbmcgbmFtZSkgewogICAgaW50IGggPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKSB7CiAgICAgIGggKz0gbmFtZS5jb2RlVW5pdEF0KGkpOwogICAgICBoICY9IDB4ZmZmZmZmZmY7CiAgICAgIGggKz0gaCA8PCAxMDsKICAgICAgaCAmPSAweGZmZmZmZmZmOwogICAgICBoIF49IGggPj4gNjsKICAgICAgaCAmPSAweGZmZmZmZmZmOwogICAgfQogICAgcmV0dXJuIGg7CiAgfQoKICAvLy8gUmVtZW1iZXIgYmFkIGhhc2hlcyB0byBhdm9pZCB1c2luZyBhIHRoZSBzYW1lIGNoYXJhY3RlciB3aXRoIGxvbmcgbnVtYmVycwogIC8vLyBmb3IgZnJlcXVlbnQgaGFzaGVzLiBGb3IgZXhhbXBsZSwgYGNsb3N1cmVgIGlzIGEgdmVyeSBjb21tb24gbmFtZS4KICBNYXA8aW50LCBpbnQ+IF9iYWROYW1lcyA9IG5ldyBNYXA8aW50LCBpbnQ+KCk7CgogIC8vLyBJZiB3ZSBjYW4ndCBmaW5kIGEgaGFzaCBiYXNlZCBuYW1lIGluIHRoZSB0aHJlZS1sZXR0ZXIgc3BhY2UsIHRoZW4gYmFzZQogIC8vLyB0aGUgbmFtZSBvbiBhIGxldHRlciBhbmQgYSBjb3VudGVyLgogIFN0cmluZyBfYmFkTmFtZShpbnQgaGFzaCwgTmFtaW5nU2NvcGUgc2NvcGUpIHsKICAgIGludCBjb3VudCA9IF9iYWROYW1lcy5wdXRJZkFic2VudChoYXNoLCAoKSA9PiAwKTsKICAgIFN0cmluZyBzdGFydExldHRlciA9CiAgICAgICAgbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKFtfbGV0dGVyTnVtYmVyKGhhc2ggKyBjb3VudCldKTsKICAgIF9iYWROYW1lc1toYXNoXSA9IGNvdW50ICsgMTsKICAgIFN0cmluZyBuYW1lOwogICAgaW50IGkgPSAwOwogICAgZG8gewogICAgICBuYW1lID0gIiRzdGFydExldHRlciR7aSsrfSI7CiAgICB9IHdoaWxlIChzY29wZS5pc1VzZWQobmFtZSkpOwogICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgYmFubmVkIHByZWZpeCBiZWNhdXNlIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtCiAgICAvLyB4bm5uLCB3aGVyZSBubm4gaXMgYSBudW1iZXIuICBUaGVyZSBjYW4gYmUgbm8gZ2V0dGVyIG9yIHNldHRlciBjYWxsZWQKICAgIC8vIGdubm4gc2luY2UgdGhhdCB3b3VsZCBpbXBseSBhIG51bWVyaWMgZmllbGQgbmFtZS4KICAgIHJldHVybiBuYW1lOwogIH0KCiAgaW50IF9sZXR0ZXJOdW1iZXIoaW50IHgpIHsKICAgIGlmICh4ID49IEFMUEhBQkVUX0NIQVJBQ1RFUlMpIHggJT0gQUxQSEFCRVRfQ0hBUkFDVEVSUzsKICAgIGlmICh4IDwgMjYpIHJldHVybiAkYSArIHg7CiAgICByZXR1cm4gJEEgKyB4IC0gMjY7CiAgfQoKICBpbnQgX2FscGhhTnVtZXJpY051bWJlcihpbnQgeCkgewogICAgaWYgKHggPj0gQUxQSEFOVU1FUklDX0NIQVJBQ1RFUlMpIHggJT0gQUxQSEFOVU1FUklDX0NIQVJBQ1RFUlM7CiAgICBpZiAoeCA8IDI2KSByZXR1cm4gJGEgKyB4OwogICAgaWYgKHggPCA1MikgcmV0dXJuICRBICsgeCAtIDI2OwogICAgcmV0dXJuICQwICsgeCAtIDUyOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTmFtZSBpbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lKEZpZWxkRW50aXR5IGVsZW1lbnQpIHsKICAgIGpzQXN0Lk5hbWUgcHJvcG9zZWQgPSBfbWluaWZpZWRJbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lKGVsZW1lbnQpOwogICAgaWYgKHByb3Bvc2VkICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHByb3Bvc2VkOwogICAgfQogICAgcmV0dXJuIHN1cGVyLmluc3RhbmNlRmllbGRQcm9wZXJ0eU5hbWUoZWxlbWVudCk7CiAgfQp9CgovLy8gSW1wbGVtZW50cyBuYW1pbmcgZm9yIGNvbnN0cnVjdG9yIGJvZGllcy4KLy8vCi8vLyBDb25zdHJ1Y3RvciBib2RpZXMgYXJlIG9ubHkgY2FsbGVkIGluIHNldHRpbmdzIHdoZXJlIHRoZSB0YXJnZXQgaXMKLy8vIHN0YXRpY2FsbHkga25vd24uIFRoZXJlZm9yZSwgd2UgY2FuIHNoYXJlIHRoZWlyIG5hbWVzIGJldHdlZW4gY2xhc3Nlcy4KLy8vIEhvd2V2ZXIsIHRvIHN1cHBvcnQgY2FsbGluZyB0aGUgY29uc3RydWN0b3IgYm9keSBvZiBhIHN1cGVyIGNvbnN0cnVjdG9yLAovLy8gZWFjaCBsZXZlbCBpbiB0aGUgaW5oZXJpdGFuY2UgdHJlZSBoYXMgdG8gdXNlIGl0cyBvd24gbmFtZXMuCi8vLwovLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgbmFtaW5nIHNjaGVtZSBieSBjb3VudGluZyB0aGUgZGlzdGFuY2UgZnJvbQovLy8gYSBnaXZlbiBjb25zdHJ1Y3RvciB0byBbT2JqZWN0XSwgd2hlcmUgZGlzdGFuY2UgaXMgdGhlIG51bWJlciBvZgovLy8gY29uc3RydWN0b3JzIGRlY2xhcmVkIGFsb25nIHRoZSBpbmhlcml0YW5jZSBjaGFpbi4KY2xhc3MgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlIHsKICBmaW5hbCBpbnQgX3N0YXJ0SW5kZXg7CiAgZmluYWwgTGlzdDxDb25zdHJ1Y3RvckVudGl0eT4gX2NvbnN0cnVjdG9yczsKICBpbnQgZ2V0IG51bWJlck9mQ29uc3RydWN0b3JzID0+IF9jb25zdHJ1Y3RvcnMubGVuZ3RoOwoKICBfQ29uc3RydWN0b3JCb2R5TmFtaW5nU2NvcGUucm9vdFNjb3BlKAogICAgICBDbGFzc0VudGl0eSBjbHMsIEVsZW1lbnRFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKICAgICAgOiBfc3RhcnRJbmRleCA9IDAsCiAgICAgICAgX2NvbnN0cnVjdG9ycyA9IF9nZXRDb25zdHJ1Y3Rvckxpc3QoY2xzLCBlbnZpcm9ubWVudCk7CgogIF9Db25zdHJ1Y3RvckJvZHlOYW1pbmdTY29wZS5mb3JDbGFzcyhDbGFzc0VudGl0eSBjbHMsCiAgICAgIF9Db25zdHJ1Y3RvckJvZHlOYW1pbmdTY29wZSBzdXBlclNjb3BlLCBFbGVtZW50RW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCiAgICAgIDogX3N0YXJ0SW5kZXggPSBzdXBlclNjb3BlLl9zdGFydEluZGV4ICsgc3VwZXJTY29wZS5udW1iZXJPZkNvbnN0cnVjdG9ycywKICAgICAgICBfY29uc3RydWN0b3JzID0gX2dldENvbnN0cnVjdG9yTGlzdChjbHMsIGVudmlyb25tZW50KTsKCiAgLy8gTWl4aW4gQXBwbGljYXRpb25zIGhhdmUgY29uc3RydWN0b3JzIGJ1dCB3ZSBuZXZlciBnZW5lcmF0ZSBjb2RlIGZvciB0aGVtLAogIC8vIHNvIHRoZXkgZG8gbm90IGNvdW50IGluIHRoZSBpbmhlcml0YW5jZSBjaGFpbi4KICBfQ29uc3RydWN0b3JCb2R5TmFtaW5nU2NvcGUuZm9yTWl4aW5BcHBsaWNhdGlvbigKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCBfQ29uc3RydWN0b3JCb2R5TmFtaW5nU2NvcGUgc3VwZXJTY29wZSkKICAgICAgOiBfc3RhcnRJbmRleCA9IHN1cGVyU2NvcGUuX3N0YXJ0SW5kZXggKyBzdXBlclNjb3BlLm51bWJlck9mQ29uc3RydWN0b3JzLAogICAgICAgIF9jb25zdHJ1Y3RvcnMgPSBjb25zdCBbXTsKCiAgZmFjdG9yeSBfQ29uc3RydWN0b3JCb2R5TmFtaW5nU2NvcGUoCiAgICAgIENsYXNzRW50aXR5IGNscywKICAgICAgTWFwPENsYXNzRW50aXR5LCBfQ29uc3RydWN0b3JCb2R5TmFtaW5nU2NvcGU+IHJlZ2lzdHJ5LAogICAgICBFbGVtZW50RW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIHJldHVybiByZWdpc3RyeS5wdXRJZkFic2VudChjbHMsICgpIHsKICAgICAgQ2xhc3NFbnRpdHkgc3VwZXJjbGFzcyA9IGVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY2xzKTsKICAgICAgaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewogICAgICAgIHJldHVybiBuZXcgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlLnJvb3RTY29wZShjbHMsIGVudmlyb25tZW50KTsKICAgICAgfSBlbHNlIGlmIChlbnZpcm9ubWVudC5pc01peGluQXBwbGljYXRpb24oY2xzKSkgewogICAgICAgIHJldHVybiBuZXcgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlLmZvck1peGluQXBwbGljYXRpb24oY2xzLAogICAgICAgICAgICBuZXcgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlKHN1cGVyY2xhc3MsIHJlZ2lzdHJ5LCBlbnZpcm9ubWVudCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlLmZvckNsYXNzKAogICAgICAgICAgICBjbHMsCiAgICAgICAgICAgIG5ldyBfQ29uc3RydWN0b3JCb2R5TmFtaW5nU2NvcGUoc3VwZXJjbGFzcywgcmVnaXN0cnksIGVudmlyb25tZW50KSwKICAgICAgICAgICAgZW52aXJvbm1lbnQpOwogICAgICB9CiAgICB9KTsKICB9CgogIFN0cmluZyBjb25zdHJ1Y3RvckJvZHlLZXlGb3IoQ29uc3RydWN0b3JCb2R5RW50aXR5IGJvZHkpIHsKICAgIGludCBwb3NpdGlvbiA9IF9jb25zdHJ1Y3RvcnMuaW5kZXhPZihib2R5LmNvbnN0cnVjdG9yKTsKICAgIGFzc2VydChwb3NpdGlvbiA+PSAwLCBmYWlsZWRBdChib2R5LCAiY29uc3RydWN0b3IgYm9keSBtaXNzaW5nIikpOwogICAgcmV0dXJuICJAY29uc3RydWN0b3JCb2R5QCR7X3N0YXJ0SW5kZXggKyBwb3NpdGlvbn0iOwogIH0KCiAgc3RhdGljIExpc3Q8Q29uc3RydWN0b3JFbnRpdHk+IF9nZXRDb25zdHJ1Y3Rvckxpc3QoCiAgICAgIENsYXNzRW50aXR5IGNscywgRWxlbWVudEVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICB2YXIgcmVzdWx0ID0gPENvbnN0cnVjdG9yRW50aXR5PltdOwogICAgZW52aXJvbm1lbnQuZm9yRWFjaENvbnN0cnVjdG9yKGNscywgcmVzdWx0LmFkZCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX01pbmlmeUNvbnN0cnVjdG9yQm9keU5hbWVyIGltcGxlbWVudHMgTmFtZXIgewogIE1hcDxDbGFzc0VudGl0eSwgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlPiBfY29uc3RydWN0b3JCb2R5U2NvcGVzID0KICAgICAgbmV3IE1hcDxDbGFzc0VudGl0eSwgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlPigpOwoKICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIGNvbnN0cnVjdG9yQm9keU5hbWUoQ29uc3RydWN0b3JCb2R5RW50aXR5IG1ldGhvZCkgewogICAgX0NvbnN0cnVjdG9yQm9keU5hbWluZ1Njb3BlIHNjb3BlID0gbmV3IF9Db25zdHJ1Y3RvckJvZHlOYW1pbmdTY29wZSgKICAgICAgICBtZXRob2QuZW5jbG9zaW5nQ2xhc3MsIF9jb25zdHJ1Y3RvckJvZHlTY29wZXMsIF9lbGVtZW50RW52aXJvbm1lbnQpOwogICAgU3RyaW5nIGtleSA9IHNjb3BlLmNvbnN0cnVjdG9yQm9keUtleUZvcihtZXRob2QpOwogICAgcmV0dXJuIF9kaXNhbWJpZ3VhdGVNZW1iZXJCeUtleSgKICAgICAgICBrZXksICgpID0+IF9wcm9wb3NlTmFtZUZvckNvbnN0cnVjdG9yQm9keShtZXRob2QpKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9NaW5pZmllZE9uZVNob3RJbnRlcmNlcHRvck5hbWVyIGltcGxlbWVudHMgTmFtZXIgewogIC8vLyBQcm9wZXJ0eSBuYW1lIHVzZWQgZm9yIHRoZSBvbmUtc2hvdCBpbnRlcmNlcHRvciBtZXRob2QgZm9yIHRoZSBnaXZlbgogIC8vLyBbc2VsZWN0b3JdIGFuZCByZXR1cm4tdHlwZSBzcGVjaWFsaXphdGlvbi4KICBAb3ZlcnJpZGUKICBqc0FzdC5OYW1lIG5hbWVGb3JPbmVTaG90SW50ZXJjZXB0b3IoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBJdGVyYWJsZTxDbGFzc0VudGl0eT4gY2xhc3NlcykgewogICAgU3RyaW5nIHJvb3QgPSBzZWxlY3Rvci5pc09wZXJhdG9yCiAgICAgICAgPyBvcGVyYXRvck5hbWVUb0lkZW50aWZpZXIoc2VsZWN0b3IubmFtZSkKICAgICAgICA6IHByaXZhdGVOYW1lKHNlbGVjdG9yLm1lbWJlck5hbWUpOwogICAgU3RyaW5nIHByZWZpeCA9CiAgICAgICAgc2VsZWN0b3IuaXNHZXR0ZXIgPyByIiRnZXQiIDogc2VsZWN0b3IuaXNTZXR0ZXIgPyByIiRzZXQiIDogIiI7CiAgICBTdHJpbmcgY2FsbFN1ZmZpeCA9IHNlbGVjdG9yLmlzQ2FsbAogICAgICAgID8gTmFtZXIuY2FsbFN1ZmZpeEZvclN0cnVjdHVyZShzZWxlY3Rvci5jYWxsU3RydWN0dXJlKS5qb2luKCkKICAgICAgICA6ICIiOwogICAgU3RyaW5nIHN1ZmZpeCA9CiAgICAgICAgc3VmZml4Rm9yR2V0SW50ZXJjZXB0b3IoX2NvbW1vbkVsZW1lbnRzLCBfbmF0aXZlRGF0YSwgY2xhc3Nlcyk7CiAgICBTdHJpbmcgZnVsbE5hbWUgPSAiXCRpbnRlcmNlcHRlZCRwcmVmaXhcJCRyb290JGNhbGxTdWZmaXhcJCRzdWZmaXgiOwogICAgcmV0dXJuIF9kaXNhbWJpZ3VhdGVJbnRlcm5hbEdsb2JhbChmdWxsTmFtZSk7CiAgfQp9CoGVAE5OPAEaAU8gCR0lKw9QMhs0BAEMJgEMIQwrDCEMMgEtNAFOTwZQUQxNThY5PB4NNwYiFgQBSEtMGEg7EUxGEUpKSkpDEUxMTExMTExMTEw7BQEfNR1JKToIJ1BNSR0kNggGAUROTE0ROw8QDw4SDw4OERQPEhMRDg4ODhUPDRIPDxARDxAQEBkPDw8PDxAUCAE5ERcODBAcEQ8PDg4ODg4OGRcSFhoODw4SDxktLw4bExMSIREdGwgEAU4UEycLGSQwQiopBgQBS01NQUItOkMBS1BRTjkjFBczKyYuKgo7KS8sORwKTEARCAYiBAFKDy4jJQQBJA8sHxcUFxMXBg4EAVBJMQFOKjE2GUEhEQ8JIyJQTTkRBAEdPB8YBAEjRB8kGAQBDD5HHBcGNQQCAS4ER0tNQQRIRTckGS84ASk3GT8BOE5QPwFPNDM/UCIBJxc+KCo/IEw4SFEPORFQGggIBAE9PEc5BAE2OSg1EwQCAT5JOwEMQUlNNiU8BAIBQ0sxDCg6JjIsFEgoRg4USEkyBAIBMXBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvbWluaWZ5X25hbWVyLmRhcnQ5c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfYmFja2VuZC9uYW1lcl9uYW1lcy5kYXJ0m94vLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBqc19iYWNrZW5kLm5hbWVyOwoKYWJzdHJhY3QgY2xhc3MgX05hbWVyTmFtZSBleHRlbmRzIGpzQXN0Lk5hbWUgewogIGludCBnZXQgX2tpbmQ7CiAgX05hbWVyTmFtZSBnZXQgX3RhcmdldCA9PiB0aGlzOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBpZiAoREVCVUdfTU9ERSkgewogICAgICByZXR1cm4gJ05hbWUoJGtleSknOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGEgbmFtZSB0byBhIHN0cmluZyIpOwogIH0KfQoKZW51bSBfTmFtZXJOYW1lS2luZHMgeyBTdHJpbmdCYWNrZWQsIEdldHRlciwgU2V0dGVyLCBBc3luYywgQ29tcG91bmQsIFRva2VuIH0KCmNsYXNzIFN0cmluZ0JhY2tlZE5hbWUgZXh0ZW5kcyBfTmFtZXJOYW1lIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IF9raW5kID0+IF9OYW1lck5hbWVLaW5kcy5TdHJpbmdCYWNrZWQuaW5kZXg7CgogIFN0cmluZ0JhY2tlZE5hbWUodGhpcy5uYW1lKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBrZXkgPT4gbmFtZTsKCiAgQG92ZXJyaWRlCiAgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyBfTmFtZVJlZmVyZW5jZSkgb3RoZXIgPSBvdGhlci5fdGFyZ2V0OwogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIChvdGhlciBpcyBTdHJpbmdCYWNrZWROYW1lKSAmJiBvdGhlci5uYW1lID09IG5hbWU7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IG5hbWUuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGludCBjb21wYXJlVG8oanNBc3QuTmFtZSBvdGhlcikgewogICAgX05hbWVyTmFtZSBvdGhlck5hbWVyTmFtZTsKICAgIGlmIChvdGhlciBpcyBNb2R1bGFyTmFtZSkgewogICAgICBvdGhlck5hbWVyTmFtZSA9IG90aGVyLnZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgb3RoZXJOYW1lck5hbWUgPSBvdGhlcjsKICAgIH0KICAgIG90aGVyTmFtZXJOYW1lID0gb3RoZXJOYW1lck5hbWUuX3RhcmdldDsKICAgIGlmIChvdGhlck5hbWVyTmFtZS5fa2luZCAhPSBfa2luZCkgcmV0dXJuIG90aGVyTmFtZXJOYW1lLl9raW5kIC0gX2tpbmQ7CiAgICByZXR1cm4gbmFtZS5jb21wYXJlVG8ob3RoZXJOYW1lck5hbWUubmFtZSk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfUHJlZml4ZWROYW1lIGV4dGVuZHMgX05hbWVyTmFtZSBpbXBsZW1lbnRzIGpzQXN0LkFzdENvbnRhaW5lciB7CiAgZmluYWwganNBc3QuTmFtZSBwcmVmaXg7CiAgZmluYWwganNBc3QuTmFtZSBiYXNlOwogIEBvdmVycmlkZQogIGludCBnZXQgX2tpbmQ7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPGpzQXN0Lk5vZGU+IGdldCBjb250YWluZWROb2RlcyA9PiBbcHJlZml4LCBiYXNlXTsKCiAgX1ByZWZpeGVkTmFtZSh0aGlzLnByZWZpeCwgdGhpcy5iYXNlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+IHByZWZpeC5uYW1lICsgYmFzZS5uYW1lOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGtleSA9PiBwcmVmaXgua2V5ICsgYmFzZS5rZXk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyBfTmFtZVJlZmVyZW5jZSkgb3RoZXIgPSBvdGhlci5fdGFyZ2V0OwogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBfUHJlZml4ZWROYW1lKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gb3RoZXIuYmFzZSA9PSBiYXNlICYmIG90aGVyLnByZWZpeCA9PSBwcmVmaXg7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGJhc2UuaGFzaENvZGUgKiAxMyArIHByZWZpeC5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgaW50IGNvbXBhcmVUbyhqc0FzdC5OYW1lIG90aGVyKSB7CiAgICBfTmFtZXJOYW1lIG90aGVyTmFtZXJOYW1lOwogICAgaWYgKG90aGVyIGlzIE1vZHVsYXJOYW1lKSB7CiAgICAgIG90aGVyTmFtZXJOYW1lID0gb3RoZXIudmFsdWU7CiAgICB9IGVsc2UgewogICAgICBvdGhlck5hbWVyTmFtZSA9IG90aGVyOwogICAgfQogICAgb3RoZXJOYW1lck5hbWUgPSBvdGhlck5hbWVyTmFtZS5fdGFyZ2V0OwogICAgaWYgKG90aGVyTmFtZXJOYW1lLl9raW5kICE9IF9raW5kKSByZXR1cm4gb3RoZXJOYW1lck5hbWUuX2tpbmQgLSBfa2luZDsKICAgIF9QcmVmaXhlZE5hbWUgb3RoZXJTYW1lS2luZCA9IG90aGVyTmFtZXJOYW1lOwogICAgaW50IHJlc3VsdCA9IHByZWZpeC5jb21wYXJlVG8ob3RoZXJTYW1lS2luZC5wcmVmaXgpOwogICAgaWYgKHJlc3VsdCA9PSAwKSB7CiAgICAgIHJlc3VsdCA9IHByZWZpeC5jb21wYXJlVG8ob3RoZXJTYW1lS2luZC5wcmVmaXgpOwogICAgICBpZiAocmVzdWx0ID09IDApIHsKICAgICAgICByZXN1bHQgPSBiYXNlLmNvbXBhcmVUbyhvdGhlclNhbWVLaW5kLmJhc2UpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKY2xhc3MgR2V0dGVyTmFtZSBleHRlbmRzIF9QcmVmaXhlZE5hbWUgewogIEBvdmVycmlkZQogIGludCBnZXQgX2tpbmQgPT4gX05hbWVyTmFtZUtpbmRzLkdldHRlci5pbmRleDsKCiAgR2V0dGVyTmFtZShqc0FzdC5OYW1lIHByZWZpeCwganNBc3QuTmFtZSBiYXNlKSA6IHN1cGVyKHByZWZpeCwgYmFzZSk7Cn0KCmNsYXNzIFNldHRlck5hbWUgZXh0ZW5kcyBfUHJlZml4ZWROYW1lIHsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IF9raW5kID0+IF9OYW1lck5hbWVLaW5kcy5TZXR0ZXIuaW5kZXg7CgogIFNldHRlck5hbWUoanNBc3QuTmFtZSBwcmVmaXgsIGpzQXN0Lk5hbWUgYmFzZSkgOiBzdXBlcihwcmVmaXgsIGJhc2UpOwp9CgpjbGFzcyBBc3luY05hbWUgZXh0ZW5kcyBfUHJlZml4ZWROYW1lIHsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IF9raW5kID0+IF9OYW1lck5hbWVLaW5kcy5Bc3luYy5pbmRleDsKCiAgQXN5bmNOYW1lKGpzQXN0Lk5hbWUgcHJlZml4LCBqc0FzdC5OYW1lIGJhc2UpIDogc3VwZXIocHJlZml4LCBiYXNlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgYWxsb3dSZW5hbWUgPT4gdHJ1ZTsKfQoKY2xhc3MgQ29tcG91bmROYW1lIGV4dGVuZHMgX05hbWVyTmFtZSBpbXBsZW1lbnRzIGpzQXN0LkFzdENvbnRhaW5lciB7CiAgZmluYWwgTGlzdDxfTmFtZXJOYW1lPiBfcGFydHM7CiAgQG92ZXJyaWRlCiAgaW50IGdldCBfa2luZCA9PiBfTmFtZXJOYW1lS2luZHMuQ29tcG91bmQuaW5kZXg7CiAgU3RyaW5nIF9jYWNoZWROYW1lOwogIGludCBfY2FjaGVkSGFzaENvZGUgPSAtMTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8anNBc3QuTm9kZT4gZ2V0IGNvbnRhaW5lZE5vZGVzID0+IF9wYXJ0czsKCiAgQ29tcG91bmROYW1lKHRoaXMuX3BhcnRzKTsKCiAgQ29tcG91bmROYW1lLmZyb20oTGlzdDxqc0FzdC5OYW1lPiBwYXJ0cykgOiB0aGlzKDxfTmFtZXJOYW1lPlsuLi5wYXJ0c10pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgewogICAgaWYgKF9jYWNoZWROYW1lID09IG51bGwpIHsKICAgICAgX2NhY2hlZE5hbWUgPSBfcGFydHMubWFwKChqc0FzdC5OYW1lIG5hbWUpID0+IG5hbWUubmFtZSkuam9pbigpOwogICAgfQogICAgcmV0dXJuIF9jYWNoZWROYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBrZXkgPT4gX3BhcnRzLm1hcCgoX05hbWVyTmFtZSBuYW1lKSA9PiBuYW1lLmtleSkuam9pbigpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMgX05hbWVSZWZlcmVuY2UpIG90aGVyID0gb3RoZXIuX3RhcmdldDsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgQ29tcG91bmROYW1lKSByZXR1cm4gZmFsc2U7CiAgICBpZiAob3RoZXIuX3BhcnRzLmxlbmd0aCAhPSBfcGFydHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9wYXJ0cy5sZW5ndGg7ICsraSkgewogICAgICBpZiAob3RoZXIuX3BhcnRzW2ldICE9IF9wYXJ0c1tpXSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIGlmIChfY2FjaGVkSGFzaENvZGUgPCAwKSB7CiAgICAgIF9jYWNoZWRIYXNoQ29kZSA9IDA7CiAgICAgIGZvciAoanNBc3QuTmFtZSBuYW1lIGluIF9wYXJ0cykgewogICAgICAgIF9jYWNoZWRIYXNoQ29kZSA9IChfY2FjaGVkSGFzaENvZGUgKiAxNyArIG5hbWUuaGFzaENvZGUpICYgMHg3ZmZmZmZmZjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9jYWNoZWRIYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGludCBjb21wYXJlVG8oanNBc3QuTmFtZSBvdGhlcikgewogICAgX05hbWVyTmFtZSBvdGhlck5hbWVyTmFtZTsKICAgIGlmIChvdGhlciBpcyBNb2R1bGFyTmFtZSkgewogICAgICBvdGhlck5hbWVyTmFtZSA9IG90aGVyLnZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgb3RoZXJOYW1lck5hbWUgPSBvdGhlcjsKICAgIH0KICAgIG90aGVyTmFtZXJOYW1lID0gb3RoZXJOYW1lck5hbWUuX3RhcmdldDsKICAgIGlmIChvdGhlck5hbWVyTmFtZS5fa2luZCAhPSBfa2luZCkgcmV0dXJuIG90aGVyTmFtZXJOYW1lLl9raW5kIC0gX2tpbmQ7CiAgICBDb21wb3VuZE5hbWUgb3RoZXJTYW1lS2luZCA9IG90aGVyTmFtZXJOYW1lOwogICAgaWYgKG90aGVyU2FtZUtpbmQuX3BhcnRzLmxlbmd0aCAhPSBfcGFydHMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBvdGhlclNhbWVLaW5kLl9wYXJ0cy5sZW5ndGggLSBfcGFydHMubGVuZ3RoOwogICAgfQogICAgaW50IHJlc3VsdCA9IDA7CiAgICBmb3IgKGludCBwb3MgPSAwOyByZXN1bHQgPT0gMCAmJiBwb3MgPCBfcGFydHMubGVuZ3RoOyBwb3MrKykgewogICAgICByZXN1bHQgPSBfcGFydHNbcG9zXS5jb21wYXJlVG8ob3RoZXJTYW1lS2luZC5fcGFydHNbcG9zXSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKY2xhc3MgVG9rZW5OYW1lIGV4dGVuZHMgX05hbWVyTmFtZSBpbXBsZW1lbnRzIGpzQXN0LlJlZmVyZW5jZUNvdW50ZWRBc3ROb2RlIHsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IF9raW5kID0+IF9OYW1lck5hbWVLaW5kcy5Ub2tlbi5pbmRleDsKICBTdHJpbmcgX25hbWU7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIGtleTsKICBmaW5hbCBUb2tlblNjb3BlIF9zY29wZTsKICBpbnQgX3JjID0gMDsKCiAgVG9rZW5OYW1lKHRoaXMuX3Njb3BlLCB0aGlzLmtleSk7CgogIGJvb2wgZ2V0IGlzRmluYWxpemVkID0+IF9uYW1lICE9IG51bGw7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSB7CiAgICBhc3NlcnQoaXNGaW5hbGl6ZWQsICJUb2tlbk5hbWUoJGtleSkgaGFzIG5vdCBiZWVuIGZpbmFsaXplZC4iKTsKICAgIHJldHVybiBfbmFtZTsKICB9CgogIEBvdmVycmlkZQogIGludCBjb21wYXJlVG8oY292YXJpYW50IF9OYW1lck5hbWUgb3RoZXIpIHsKICAgIG90aGVyID0gb3RoZXIuX3RhcmdldDsKICAgIGlmIChvdGhlci5fa2luZCAhPSBfa2luZCkgcmV0dXJuIG90aGVyLl9raW5kIC0gX2tpbmQ7CiAgICBUb2tlbk5hbWUgb3RoZXJUb2tlbiA9IG90aGVyOwogICAgcmV0dXJuIGtleS5jb21wYXJlVG8ob3RoZXJUb2tlbi5rZXkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBtYXJrU2Vlbihqc0FzdC5Ub2tlbkNvdW50ZXIgY291bnRlcikgPT4gX3JjKys7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyBfTmFtZVJlZmVyZW5jZSkgb3RoZXIgPSBvdGhlci5fdGFyZ2V0OwogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBzdXBlci5oYXNoQ29kZTsKCiAgdm9pZCBmaW5hbGl6ZSgpIHsKICAgIGFzc2VydCgKICAgICAgICAhaXNGaW5hbGl6ZWQsCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAiVG9rZW5OYW1lKCRrZXkpPSRfbmFtZSBoYXMgYWxyZWFkeSBiZWVuIGZpbmFsaXplZC4iKSk7CiAgICBfbmFtZSA9IF9zY29wZS5nZXROZXh0TmFtZSgpOwogIH0KfQoKY2xhc3MgX05hbWVSZWZlcmVuY2UgZXh0ZW5kcyBfTmFtZXJOYW1lIGltcGxlbWVudHMganNBc3QuQXN0Q29udGFpbmVyIHsKICBAb3ZlcnJpZGUKICBfTmFtZXJOYW1lIF90YXJnZXQ7CgogIEBvdmVycmlkZQogIGludCBnZXQgX2tpbmQgPT4gX3RhcmdldC5fa2luZDsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGtleSA9PiBfdGFyZ2V0LmtleTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8anNBc3QuTm9kZT4gZ2V0IGNvbnRhaW5lZE5vZGVzID0+IFtfdGFyZ2V0XTsKCiAgX05hbWVSZWZlcmVuY2UodGhpcy5fdGFyZ2V0KTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+IF90YXJnZXQubmFtZTsKCiAgQG92ZXJyaWRlCiAgaW50IGNvbXBhcmVUbyhqc0FzdC5OYW1lIG90aGVyKSB7CiAgICBfTmFtZXJOYW1lIG90aGVyTmFtZXJOYW1lOwogICAgaWYgKG90aGVyIGlzIE1vZHVsYXJOYW1lKSB7CiAgICAgIG90aGVyTmFtZXJOYW1lID0gb3RoZXIudmFsdWU7CiAgICB9IGVsc2UgewogICAgICBvdGhlck5hbWVyTmFtZSA9IG90aGVyOwogICAgfQogICAgcmV0dXJuIF90YXJnZXQuY29tcGFyZVRvKG90aGVyTmFtZXJOYW1lKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+IF90YXJnZXQgPT0gb3RoZXI7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gX3RhcmdldC5oYXNoQ29kZTsKfQqBHQBOTjwBGgEvESIBDBYWGwZFBAIBTgEsDBUMNwEfAQwaAQwXOC0+BAEMJQEMJB8gJA0eBi1MMAQCAVAbGQwRAQw9ASkBDC4BDCsBDBw4LS85BAEMPAEMJB8gJA0eBi1MMjkXNxk1CAYTBAIBKQwxAUgCASkMMQFIAgEoDDABRwEMIAIBRiEMMxYcAQw1AR0BTAEMFB9HBhgEAQxGAQwcOC0uPC42BhEEAQwVHxsoTwgGHAQBDCQfICQNHgYtTDE4OgYUQ0EGEwQCAU4MMBAMFBsPASQBKQEMFEQSBAEMLhs6IioEAQw2AQwcOC0SBAEMJgEUDBYoRCIEAgFIDBYBDCIMIQEMOAEgAQwjAQwkHyAkDR4GLgQBDC8BDCgCATBwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL25hbWVyX25hbWVzLmRhcnQyc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvbmF0aXZlL2JlaGF2aW9yLmRhcnTAAIAQLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHMsIEVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hdGl2ZV9kYXRhLmRhcnQnIHNob3cgTmF0aXZlQmFzaWNEYXRhOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zaWRlX2VmZmVjdHMuZGFydCcgc2hvdyBTaWRlRWZmZWN0czsKaW1wb3J0ICdqcy5kYXJ0JzsKCnR5cGVkZWYgZHluYW1pYyAvKkRhcnRUeXBlfFNwZWNpYWxUeXBlKi8gVHlwZUxvb2t1cChTdHJpbmcgdHlwZVN0cmluZywKICAgIHtib29sIHJlcXVpcmVkfSk7CgovLy8gVGhpcyBjbGFzcyBpcyBhIHRlbXBvcmFyeSB3b3JrLWFyb3VuZCB1bnRpbCB3ZSBnZXQgYSBtb3JlIHBvd2VyZnVsIERhcnRUeXBlLgpjbGFzcyBTcGVjaWFsVHlwZSB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgY29uc3QgU3BlY2lhbFR5cGUuXyh0aGlzLm5hbWUpOwoKICAvLy8gVGhlIHR5cGUgT2JqZWN0LCBidXQgbm8gc3VidHlwZXM6CiAgc3RhdGljIGNvbnN0IEpzT2JqZWN0ID0gY29uc3QgU3BlY2lhbFR5cGUuXygnPU9iamVjdCcpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IG5hbWUuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7CgogIHN0YXRpYyBTcGVjaWFsVHlwZSBmcm9tTmFtZShTdHJpbmcgbmFtZSkgewogICAgaWYgKG5hbWUgPT0gJz1PYmplY3QnKSB7CiAgICAgIHJldHVybiBKc09iamVjdDsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmtub3duIFNwZWNpYWxUeXBlICckbmFtZScuIik7CiAgICB9CiAgfQp9CgovLy8gRGVzY3JpcHRpb24gb2YgdGhlIGV4Y2VwdGlvbiBiZWhhdmlvdXIgb2YgbmF0aXZlIGNvZGUuCmNsYXNzIE5hdGl2ZVRocm93QmVoYXZpb3IgewogIHN0YXRpYyBjb25zdCBOYXRpdmVUaHJvd0JlaGF2aW9yIE5FVkVSID0gTmF0aXZlVGhyb3dCZWhhdmlvci5fKDApOwogIHN0YXRpYyBjb25zdCBOYXRpdmVUaHJvd0JlaGF2aW9yIE1BWSA9IE5hdGl2ZVRocm93QmVoYXZpb3IuXygxKTsKCiAgLy8vIFRocm93cyBvbmx5IGlmIGZpcnN0IGFyZ3VtZW50IGlzIG51bGwuCiAgc3RhdGljIGNvbnN0IE5hdGl2ZVRocm93QmVoYXZpb3IgTlVMTF9OU00gPSBOYXRpdmVUaHJvd0JlaGF2aW9yLl8oMik7CgogIC8vLyBUaHJvd3MgaWYgZmlyc3QgYXJndW1lbnQgaXMgbnVsbCwgdGhlbiBtYXkgdGhyb3cuCiAgc3RhdGljIGNvbnN0IE5hdGl2ZVRocm93QmVoYXZpb3IgTlVMTF9OU01fVEhFTl9NQVkgPSBOYXRpdmVUaHJvd0JlaGF2aW9yLl8oMyk7CgogIGZpbmFsIGludCBfYml0czsKICBjb25zdCBOYXRpdmVUaHJvd0JlaGF2aW9yLl8odGhpcy5fYml0cyk7CgogIGJvb2wgZ2V0IGNhblRocm93ID0+IHRoaXMgIT0gTkVWRVI7CgogIC8vLyBEb2VzIHRoaXMgYmVoYXZpb3IgYWx3YXlzIHRocm93IGEgbm9TdWNoTWV0aG9kIGNoZWNrIG9uIGEgbnVsbCBmaXJzdAogIC8vLyBhcmd1bWVudCBiZWZvcmUgYW55IHNpZGUgZWZmZWN0IG9yIG90aGVyIGV4Y2VwdGlvbj8KICBib29sIGdldCBpc051bGxOU01HdWFyZCA9PiB0aGlzID09IE5VTExfTlNNIHx8IHRoaXMgPT0gTlVMTF9OU01fVEhFTl9NQVk7CgogIC8vLyBEb2VzIHRoaXMgYmVoYXZpb3IgYWx3YXlzIGFjdCBhcyBhIG51bGwgbm9TdWNoTWV0aG9kIGNoZWNrLCBhbmQgaGFzIG5vCiAgLy8vIG90aGVyIHRocm93aW5nIGJlaGF2aW9yPwogIGJvb2wgZ2V0IGlzT25seU51bGxOU01HdWFyZCA9PiB0aGlzID09IE5VTExfTlNNOwoKICAvLy8gUmV0dXJucyB0aGUgYmVoYXZpb3IgaWYgd2UgYXNzdW1lIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBub3QgbnVsbC4KICBOYXRpdmVUaHJvd0JlaGF2aW9yIGdldCBvbk5vbk51bGwgewogICAgaWYgKHRoaXMgPT0gTlVMTF9OU00pIHJldHVybiBORVZFUjsKICAgIGlmICh0aGlzID09IE5VTExfTlNNX1RIRU5fTUFZKSByZXR1cm4gTUFZOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBpZiAodGhpcyA9PSBORVZFUikgcmV0dXJuICduZXZlcic7CiAgICBpZiAodGhpcyA9PSBNQVkpIHJldHVybiAnbWF5JzsKICAgIGlmICh0aGlzID09IE5VTExfTlNNKSByZXR1cm4gJ251bGwoMSknOwogICAgaWYgKHRoaXMgPT0gTlVMTF9OU01fVEhFTl9NQVkpIHJldHVybiAnbnVsbCgxKSttYXknOwogICAgcmV0dXJuICdOYXRpdmVUaHJvd0JlaGF2aW9yKCRfYml0cyknOwogIH0KCiAgLy8vIENhbm9uaWNhbCBsaXN0IG9mIG1hcmtlciB2YWx1ZXMuCiAgLy8vCiAgLy8vIEFkZGVkIHRvIG1ha2UgW05hdGl2ZVRocm93QmVoYXZpb3JdIGVudW0tbGlrZS4KICBzdGF0aWMgY29uc3QgTGlzdDxOYXRpdmVUaHJvd0JlaGF2aW9yPiB2YWx1ZXMgPSBbCiAgICBORVZFUiwKICAgIE1BWSwKICAgIE5VTExfTlNNLAogICAgTlVMTF9OU01fVEhFTl9NQVksCiAgXTsKCiAgLy8vIEluZGV4IHRvIHRoaXMgbWFya2VyIHdpdGhpbiBbdmFsdWVzXS4KICAvLy8KICAvLy8gQWRkZWQgdG8gbWFrZSBbTmF0aXZlVGhyb3dCZWhhdmlvcl0gZW51bS1saWtlLgogIGludCBnZXQgaW5kZXggPT4gdmFsdWVzLmluZGV4T2YodGhpcyk7CgogIC8vLyBEZXNlcmlhbGl6ZXIgaGVscGVyLgogIHN0YXRpYyBOYXRpdmVUaHJvd0JlaGF2aW9yIF9iaXRzVG9WYWx1ZShpbnQgYml0cykgewogICAgc3dpdGNoIChiaXRzKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICByZXR1cm4gTkVWRVI7CiAgICAgIGNhc2UgMToKICAgICAgICByZXR1cm4gTUFZOwogICAgICBjYXNlIDI6CiAgICAgICAgcmV0dXJuIE5VTExfTlNNOwogICAgICBjYXNlIDM6CiAgICAgICAgcmV0dXJuIE5VTExfTlNNX1RIRU5fTUFZOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgLy8vIFNlcXVlbmNlIG9wZXJhdG9yLgogIE5hdGl2ZVRocm93QmVoYXZpb3IgdGhlbihOYXRpdmVUaHJvd0JlaGF2aW9yIHNlY29uZCkgewogICAgaWYgKHRoaXMgPT0gTkVWRVIpIHJldHVybiBzZWNvbmQ7CiAgICBpZiAodGhpcyA9PSBNQVkpIHJldHVybiBNQVk7CiAgICBpZiAodGhpcyA9PSBOVUxMX05TTV9USEVOX01BWSkgcmV0dXJuIE5VTExfTlNNX1RIRU5fTUFZOwogICAgYXNzZXJ0KHRoaXMgPT0gTlVMTF9OU00pOwogICAgaWYgKHNlY29uZCA9PSBORVZFUikgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gTlVMTF9OU01fVEhFTl9NQVk7CiAgfQoKICAvLy8gQ2hvaWNlIG9wZXJhdG9yLgogIE5hdGl2ZVRocm93QmVoYXZpb3Igb3IoTmF0aXZlVGhyb3dCZWhhdmlvciBvdGhlcikgewogICAgaWYgKHRoaXMgPT0gb3RoZXIpIHJldHVybiB0aGlzOwogICAgcmV0dXJuIE1BWTsKICB9Cn0KCi8vLyBBIHN1bW1hcnkgb2YgdGhlIGJlaGF2aW9yIG9mIGEgbmF0aXZlIGVsZW1lbnQuCi8vLwovLy8gTmF0aXZlIGNvZGUgY2FuIHJldHVybiB2YWx1ZXMgb2Ygb25lIHR5cGUgYW5kIGNhdXNlIG5hdGl2ZSBzdWJ0eXBlcyBvZgovLy8gYW5vdGhlciB0eXBlIHRvIGJlIGluc3RhbnRpYXRlZC4gIEJ5IGRlZmF1bHQsIHdlIGNvbXB1dGUgYm90aCBmcm9tIHRoZQovLy8gZGVjbGFyZWQgdHlwZS4KLy8vCi8vLyBBIGZpZWxkIG1pZ2h0IHlpZWxkIGFueSBuYXRpdmUgdHlwZSB0aGF0ICdpcycgdGhlIGZpZWxkIHR5cGUuCi8vLwovLy8gQSBtZXRob2QgbWlnaHQgY3JlYXRlIGFuZCByZXR1cm4gaW5zdGFuY2VzIG9mIG5hdGl2ZSBzdWJjbGFzc2VzIG9mIGl0cwovLy8gZGVjbGFyZWQgcmV0dXJuIHR5cGUsIGFuZCBhIGNhbGxiYWNrIGFyZ3VtZW50IG1heSBiZSBjYWxsZWQgd2l0aCBpbnN0YW5jZXMKLy8vIG9mIHRoZSBjYWxsYmFjayBwYXJhbWV0ZXIgdHlwZSAoZS5nLiBFdmVudCkuCi8vLwovLy8gSWYgdGhlcmUgaXMgb25lIG9yIG1vcmUgYEBDcmVhdGVzYCBhbm5vdGF0aW9ucywgdGhlIHVuaW9uIG9mIHRoZSBuYW1lZCB0eXBlcwovLy8gcmVwbGFjZXMgdGhlIGluZmVycmVkIGluc3RhbnRpYXRlZCB0eXBlLCBhbmQgdGhlIHJldHVybiB0eXBlIGlzIGlnbm9yZWQgZm9yCi8vLyB0aGUgcHVycG9zZSBvZiBpbmZlcnJpbmcgaW5zdGFudGlhdGVkIHR5cGVzLgovLy8KLy8vICAgICBAQ3JlYXRlcygnSURCQ3Vyc29yJykgICAgLy8gQ3JlYXRlZCBhc3luY2hyb25vdXNseS4KLy8vICAgICBAQ3JlYXRlcygnSURCUmVxdWVzdCcpICAgLy8gQ3JlYXRlZCBzeW5jaHJvbm91c2x5IChmb3IgcmV0dXJuIHZhbHVlKS4KLy8vICAgICBJREJSZXF1ZXN0IG9wZW5DdXJzb3IoKTsKLy8vCi8vLyBJZiB0aGVyZSBpcyBvbmUgb3IgbW9yZSBgQFJldHVybnNgIGFubm90YXRpb25zLCB0aGUgdW5pb24gb2YgdGhlIG5hbWVkIHR5cGVzCi8vLyByZXBsYWNlcyB0aGUgZGVjbGFyZWQgcmV0dXJuIHR5cGUuCi8vLwovLy8gICAgIEBSZXR1cm5zKCdJREJSZXF1ZXN0JykKLy8vICAgICBJREJSZXF1ZXN0IG9wZW5DdXJzb3IoKTsKLy8vCi8vLyBUeXBlcyBpbiBhbm5vdGF0aW9ucyBhcmUgbm9uLW51bGxhYmxlLCBzbyBpbmNsdWRlIGBAUmV0dXJucygnTnVsbCcpYCBpZgovLy8gYG51bGxgIG1heSBiZSByZXR1cm5lZC4KY2xhc3MgTmF0aXZlQmVoYXZpb3IgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbTmF0aXZlQmVoYXZpb3JdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnbmF0aXZlLWJlaGF2aW9yJzsKCiAgLy8vIFtEYXJ0VHlwZV1zIG9yIFtTcGVjaWFsVHlwZV1zIHJldHVybmVkIG9yIHlpZWxkZWQgYnkgdGhlIG5hdGl2ZQogIC8vLyBlbGVtZW50LgogIGZpbmFsIExpc3QgdHlwZXNSZXR1cm5lZCA9IFtdOwoKICAvLy8gW0RhcnRUeXBlXXMgb3IgW1NwZWNpYWxUeXBlXXMgaW5zdGFudGlhdGVkIGJ5IHRoZSBuYXRpdmUKICAvLy8gZWxlbWVudC4KICBmaW5hbCBMaXN0IHR5cGVzSW5zdGFudGlhdGVkID0gW107CgogIFN0cmluZyBjb2RlVGVtcGxhdGVUZXh0OwogIC8vIElmIHRoaXMgYmVoYXZpb3IgaXMgZm9yIGEgSlMgZXhwcmVzc2lvbiwgW2NvZGVUZW1wbGF0ZV0gY29udGFpbnMgdGhlCiAgLy8gcGFyc2VkIHRyZWUuCiAganMuVGVtcGxhdGUgY29kZVRlbXBsYXRlOwoKICBmaW5hbCBTaWRlRWZmZWN0cyBzaWRlRWZmZWN0czsKCiAgTmF0aXZlVGhyb3dCZWhhdmlvciB0aHJvd0JlaGF2aW9yID0gTmF0aXZlVGhyb3dCZWhhdmlvci5NQVk7CgogIGJvb2wgaXNBbGxvY2F0aW9uID0gZmFsc2U7CiAgYm9vbCB1c2VHdm4gPSBmYWxzZTsKCiAgLy8gVE9ETyhzcmEpOiBNYWtlIE5hdGl2ZUJlaGF2aW9yIGltbXV0YWJsZSBzbyBQVVJFIGFuZCBQVVJFX0FMTE9DQVRJT04gY2FuIGJlCiAgLy8gZmluYWwgY29uc3RhbnQtbGlrZSBvYmplY3RzLgogIHN0YXRpYyBOYXRpdmVCZWhhdmlvciBnZXQgUFVSRSA9PiBOYXRpdmVCZWhhdmlvci5fbWFrZVB1cmUoKTsKICBzdGF0aWMgTmF0aXZlQmVoYXZpb3IgZ2V0IFBVUkVfQUxMT0NBVElPTiA9PgogICAgICBOYXRpdmVCZWhhdmlvci5fbWFrZVB1cmUoaXNBbGxvY2F0aW9uOiB0cnVlKTsKICBzdGF0aWMgTmF0aXZlQmVoYXZpb3IgZ2V0IENIQU5HRVNfT1RIRVIgPT4gTmF0aXZlQmVoYXZpb3IuX21ha2VDaGFuZ2VzT3RoZXIoKTsKICBzdGF0aWMgTmF0aXZlQmVoYXZpb3IgZ2V0IERFUEVORFNfT1RIRVIgPT4gTmF0aXZlQmVoYXZpb3IuX21ha2VEZXBlbmRzT3RoZXIoKTsKCiAgTmF0aXZlQmVoYXZpb3IoKSA6IHNpZGVFZmZlY3RzID0gbmV3IFNpZGVFZmZlY3RzLmVtcHR5KCk7CgogIE5hdGl2ZUJlaGF2aW9yLmludGVybmFsKHRoaXMuc2lkZUVmZmVjdHMpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW05hdGl2ZUJlaGF2aW9yXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IE5hdGl2ZUJlaGF2aW9yLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CgogICAgTGlzdCByZWFkVHlwZXMoKSB7CiAgICAgIExpc3QgdHlwZXMgPSBbXTsKICAgICAgdHlwZXMuYWRkQWxsKHNvdXJjZS5yZWFkRGFydFR5cGVzKCkpOwogICAgICBpbnQgc3BlY2lhbENvdW50ID0gc291cmNlLnJlYWRJbnQoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjaWFsQ291bnQ7IGkrKykgewogICAgICAgIFN0cmluZyBuYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgICB0eXBlcy5hZGQoU3BlY2lhbFR5cGUuZnJvbU5hbWUobmFtZSkpOwogICAgICB9CiAgICAgIHJldHVybiB0eXBlczsKICAgIH0KCiAgICBMaXN0IHR5cGVzUmV0dXJuZWQgPSByZWFkVHlwZXMoKTsKICAgIExpc3QgdHlwZXNJbnN0YW50aWF0ZWQgPSByZWFkVHlwZXMoKTsKICAgIFN0cmluZyBjb2RlVGVtcGxhdGVUZXh0ID0gc291cmNlLnJlYWRTdHJpbmdPck51bGwoKTsKICAgIFNpZGVFZmZlY3RzIHNpZGVFZmZlY3RzID0gbmV3IFNpZGVFZmZlY3RzLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgaW50IHRocm93QmVoYXZpb3IgPSBzb3VyY2UucmVhZEludCgpOwogICAgYm9vbCBpc0FsbG9jYXRpb24gPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgdXNlR3ZuID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CgogICAgTmF0aXZlQmVoYXZpb3IgYmVoYXZpb3IgPSBuZXcgTmF0aXZlQmVoYXZpb3IuaW50ZXJuYWwoc2lkZUVmZmVjdHMpOwogICAgYmVoYXZpb3IudHlwZXNSZXR1cm5lZC5hZGRBbGwodHlwZXNSZXR1cm5lZCk7CiAgICBiZWhhdmlvci50eXBlc0luc3RhbnRpYXRlZC5hZGRBbGwodHlwZXNJbnN0YW50aWF0ZWQpOwogICAgaWYgKGNvZGVUZW1wbGF0ZVRleHQgIT0gbnVsbCkgewogICAgICBiZWhhdmlvci5jb2RlVGVtcGxhdGVUZXh0ID0gY29kZVRlbXBsYXRlVGV4dDsKICAgICAgYmVoYXZpb3IuY29kZVRlbXBsYXRlID0ganMuanMucGFyc2VGb3JlaWduSlMoY29kZVRlbXBsYXRlVGV4dCk7CiAgICB9CiAgICBiZWhhdmlvci50aHJvd0JlaGF2aW9yID0gTmF0aXZlVGhyb3dCZWhhdmlvci5fYml0c1RvVmFsdWUodGhyb3dCZWhhdmlvcik7CiAgICBhc3NlcnQoYmVoYXZpb3IudGhyb3dCZWhhdmlvci5fYml0cyA9PSB0aHJvd0JlaGF2aW9yKTsKICAgIGJlaGF2aW9yLmlzQWxsb2NhdGlvbiA9IGlzQWxsb2NhdGlvbjsKICAgIGJlaGF2aW9yLnVzZUd2biA9IHVzZUd2bjsKICAgIHJldHVybiBiZWhhdmlvcjsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW05hdGl2ZUJlaGF2aW9yXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwoKICAgIHZvaWQgd3JpdGVUeXBlcyhMaXN0IHR5cGVzKSB7CiAgICAgIExpc3Q8RGFydFR5cGU+IGRhcnRUeXBlcyA9IFtdOwogICAgICBMaXN0PFNwZWNpYWxUeXBlPiBzcGVjaWFsVHlwZXMgPSBbXTsKICAgICAgZm9yICh2YXIgdHlwZSBpbiB0eXBlcykgewogICAgICAgIGlmICh0eXBlIGlzIERhcnRUeXBlKSB7CiAgICAgICAgICBkYXJ0VHlwZXMuYWRkKHR5cGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzcGVjaWFsVHlwZXMuYWRkKHR5cGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBzaW5rLndyaXRlRGFydFR5cGVzKGRhcnRUeXBlcyk7CiAgICAgIHNpbmsud3JpdGVJbnQoc3BlY2lhbFR5cGVzLmxlbmd0aCk7CiAgICAgIGZvciAoU3BlY2lhbFR5cGUgdHlwZSBpbiBzcGVjaWFsVHlwZXMpIHsKICAgICAgICBzaW5rLndyaXRlU3RyaW5nKHR5cGUubmFtZSk7CiAgICAgIH0KICAgIH0KCiAgICB3cml0ZVR5cGVzKHR5cGVzUmV0dXJuZWQpOwogICAgd3JpdGVUeXBlcyh0eXBlc0luc3RhbnRpYXRlZCk7CiAgICBzaW5rLndyaXRlU3RyaW5nT3JOdWxsKGNvZGVUZW1wbGF0ZVRleHQpOwogICAgc2lkZUVmZmVjdHMud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZUludCh0aHJvd0JlaGF2aW9yLl9iaXRzKTsKICAgIHNpbmsud3JpdGVCb29sKGlzQWxsb2NhdGlvbik7CiAgICBzaW5rLndyaXRlQm9vbCh1c2VHdm4pOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnTmF0aXZlQmVoYXZpb3IoJwogICAgICAgICdyZXR1cm5zOiAke3R5cGVzUmV0dXJuZWR9JwogICAgICAgICcsIGNyZWF0ZXM6ICR7dHlwZXNJbnN0YW50aWF0ZWR9JwogICAgICAgICcsIHNpZGVFZmZlY3RzOiAke3NpZGVFZmZlY3RzfScKICAgICAgICAnLCB0aHJvd3M6ICR7dGhyb3dCZWhhdmlvcn0nCiAgICAgICAgJyR7aXNBbGxvY2F0aW9uID8gIiwgaXNBbGxvY2F0aW9uIiA6ICIifScKICAgICAgICAnJHt1c2VHdm4gPyAiLCB1c2VHdm4iIDogIiJ9JwogICAgICAgICcpJzsKICB9CgogIHN0YXRpYyBOYXRpdmVCZWhhdmlvciBfbWFrZVB1cmUoe2Jvb2wgaXNBbGxvY2F0aW9uOiBmYWxzZX0pIHsKICAgIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yID0gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICBiZWhhdmlvci5zaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgYmVoYXZpb3Iuc2lkZUVmZmVjdHMuY2xlYXJBbGxTaWRlRWZmZWN0cygpOwogICAgYmVoYXZpb3IudGhyb3dCZWhhdmlvciA9IE5hdGl2ZVRocm93QmVoYXZpb3IuTkVWRVI7CiAgICBiZWhhdmlvci5pc0FsbG9jYXRpb24gPSBpc0FsbG9jYXRpb247CiAgICByZXR1cm4gYmVoYXZpb3I7CiAgfQoKICBzdGF0aWMgTmF0aXZlQmVoYXZpb3IgX21ha2VDaGFuZ2VzT3RoZXIoKSB7CiAgICAvLyBUT0RPKDI1NTQ0KTogSGF2ZSBhIGRpc3RpbmN0IGVmZmVjdCBpbnN0ZWFkIG9mIHVzaW5nIHN0YXRpYyBwcm9wZXJ0aWVzIHRvCiAgICAvLyBtb2RlbCAnb3RoZXInIGVmZmVjdHMuCiAgICByZXR1cm4gX21ha2VQdXJlKCkuLnNpZGVFZmZlY3RzLnNldENoYW5nZXNTdGF0aWNQcm9wZXJ0eSgpOwogIH0KCiAgc3RhdGljIE5hdGl2ZUJlaGF2aW9yIF9tYWtlRGVwZW5kc090aGVyKCkgewogICAgLy8gVE9ETygyNTU0NCk6IEhhdmUgYSBkaXN0aW5jdCBlZmZlY3QgaW5zdGVhZCBvZiB1c2luZyBzdGF0aWMgcHJvcGVydGllcyB0bwogICAgLy8gbW9kZWwgJ290aGVyJyBlZmZlY3RzLgogICAgcmV0dXJuIF9tYWtlUHVyZSgpLi5zaWRlRWZmZWN0cy5zZXREZXBlbmRzT25TdGF0aWNQcm9wZXJ0eVN0b3JlKCk7CiAgfQoKICAvLy8gUHJvY2Vzc2VzIHRoZSB0eXBlIHNwZWNpZmljYXRpb24gc3RyaW5nIG9mIGEgY2FsbCB0byBKUyBhbmQgc3RvcmVzIHRoZQogIC8vLyByZXN1bHQgaW4gdGhlIFt0eXBlc1JldHVybmVkXSBhbmQgW3R5cGVzSW5zdGFudGlhdGVkXS4gSXQgZnVydGhlcm1vcmUKICAvLy8gY29tcHV0ZXMgdGhlIHNpZGUgZWZmZWN0cywgYW5kLCBpZiBnaXZlbiwgaW52b2tlcyBbc2V0U2lkZUVmZmVjdHNdIHdpdGgKICAvLy8gdGhlIGNvbXB1dGVkIGVmZmVjdHMuIElmIG5vIHNpZGUgZWZmZWN0cyBhcmUgZW5jb2RlZCBpbiB0aGUgW3NwZWNTdHJpbmddCiAgLy8vIHRoZSBbc2V0U2lkZUVmZmVjdHNdIG1ldGhvZCBpcyBub3QgaW52b2tlZC4KICAvLy8KICAvLy8gVHdvIGZvcm1zIG9mIHRoZSBzdHJpbmcgaXMgc3VwcG9ydGVkOgogIC8vLwogIC8vLyAxKSBBIHNpbmdsZSB0eXBlIHN0cmluZyBvZiB0aGUgZm9ybSAndm9pZCcsICcnLCAndmFyJyBvciAnVDF8Li4ufFRuJyB3aGljaAogIC8vLyAgICBkZWZpbmVzIHRoZSB0eXBlcyByZXR1cm5lZCwgYW5kLCBmb3IgdGhlIGxhc3QgZm9ybSwgdGhlIHR5cGVzIGFsc28KICAvLy8gICAgY3JlYXRlZCBieSB0aGUgY2FsbCB0byBKUy4gICd2YXInIChhbmQgJycpIGFyZSBsaWtlICdkeW5hbWljJyBvcgogIC8vLyAgICAnT2JqZWN0JyBleGNlcHQgdGhhdCAnZHluYW1pYycgd291bGQgaW5kaWNhdGUgdGhhdCBvYmplY3RzIG9mIGFueSB0eXBlCiAgLy8vICAgIGFyZSBjcmVhdGVkLCB3aGljaCBkZWZlYXRzIHRyZWUtc2hha2luZy4gIFRoaW5rIG9mICd2YXInIChhbmQgJycpIGFzCiAgLy8vICAgIG1lYW5pbmcgJ2FueSBwcmUtZXhpc3RpbmcgdHlwZScuCiAgLy8vCiAgLy8vICAgIFRoZSB0eXBlcyBUaSBhcmUgbm9uLW51bGxhYmxlLCBzbyBhZGQgY2xhc3MgYE51bGxgIHRvIHNwZWNpZnkgYQogIC8vLyAgICBudWxsYWJsZSB0eXBlLCBlLmcgYCdTdHJpbmd8TnVsbCdgLgogIC8vLwogIC8vLyAyKSBBIHNlcXVlbmNlIG9mIDx0YWc+Ojx2YWx1ZT4gcGFpcnMgb2YgdGhlIGZvbGxvd2luZyBraW5kcwogIC8vLwogIC8vLyAgICAgICAgPHR5cGUtdGFnPjo8dHlwZS1zdHJpbmc+CiAgLy8vICAgICAgICA8ZWZmZWN0LXRhZz46PGVmZmVjdC1zdHJpbmc+CiAgLy8vICAgICAgICB0aHJvd3M6PHRocm93cy1zdHJpbmc+CiAgLy8vICAgICAgICBndm46PGd2bi1zdHJpbmc+CiAgLy8vICAgICAgICBuZXc6PG5ldy1zdHJpbmc+CiAgLy8vCiAgLy8vICAgIEEgPHR5cGUtdGFnPiBpcyBlaXRoZXIgJ3JldHVybnMnIG9yICdjcmVhdGVzJyBhbmQgPHR5cGUtc3RyaW5nPiBpcyBhCiAgLy8vICAgIHR5cGUgc3RyaW5nIGxpa2UgaW4gMSkuIFRoZSB0eXBlIHN0cmluZyBtYXJrZWQgYnkgJ3JldHVybnMnIGRlZmluZXMgdGhlCiAgLy8vICAgIHR5cGVzIHJldHVybmVkIGFuZCAnY3JlYXRlcycgZGVmaW5lcyB0aGUgdHlwZXMgY3JlYXRlZCBieSB0aGUgY2FsbCB0bwogIC8vLyAgICBKUy4gSWYgJ2NyZWF0ZXMnIGlzIG1pc3NpbmcsIGl0IGRlZmF1bHRzIHRvICdyZXR1cm5zJy4KICAvLy8KICAvLy8gICAgQW4gPGVmZmVjdC10YWc+IGlzIGVpdGhlciAnZWZmZWN0cycgb3IgJ2RlcGVuZHMnIGFuZCA8ZWZmZWN0LXN0cmluZz4gaXMKICAvLy8gICAgZWl0aGVyICdhbGwnLCAnbm9uZScgb3IgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiAnbm8taW5kZXgnLAogIC8vLyAgICAnbm8taW5zdGFuY2UnLCAnbm8tc3RhdGljJy4KICAvLy8KICAvLy8gICAgVGhlIGZsYWcgJ2FsbCcgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGwgYWZmZWN0cy9kZXBlbmRzIG9uIGV2ZXJ5CiAgLy8vICAgIHNpZGUtZWZmZWN0LiBUaGUgZmxhZyAnbm9uZScgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGwgZG9lcyBub3QgYWZmZWN0CiAgLy8vICAgIChyZXNwLiBkZXBlbmRzIG9uKSBhbnl0aGluZy4KICAvLy8KICAvLy8gICAgJ25vLWluZGV4JyBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbCBkb2VzICpub3QqIGRvIGFueSBhcnJheSBpbmRleC1zdG9yZQogIC8vLyAgICAoZm9yICdlZmZlY3RzJyksIG9yIGRlcGVuZHMgb24gYW55IHZhbHVlIGluIGFuIGFycmF5IChmb3IgJ2RlcGVuZHMnKS4KICAvLy8gICAgVGhlIGZsYWcgJ25vLWluc3RhbmNlJyBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbCBkb2VzIG5vdCBtb2RpZnkgKHJlc3AuCiAgLy8vICAgIGRlcGVuZHMgb24pIGFueSBpbnN0YW5jZSB2YXJpYWJsZS4gU2ltaWxhcmx5IHN0YXRpYyB2YXJpYWJsZXMgYXJlCiAgLy8vICAgIGluZGljYXRlZCB3aXRoICduby1zdGF0aWMnLiBUaGUgZmxhZ3MgJ2VmZmVjdHMnIGFuZCAnZGVwZW5kcycgbXVzdCBiZQogIC8vLyAgICB1c2VkIGluIHVuaXNvbiAoZWl0aGVyIGJvdGggYXJlIHByZXNlbnQgb3Igbm9uZSBpcykuCiAgLy8vCiAgLy8vICAgIFRoZSA8dGhyb3dzLXN0cmluZz4gdmFsdWVzIGFyZSAnbmV2ZXInLCAnbWF5JywgJ251bGwoMSknLCBhbmQKICAvLy8gICAgJ251bGwoMSkrbWF5Jy4gIFRoZSBkZWZhdWx0IGlmIHVuc3BlY2lmaWVkIGlzICdtYXknLiAnbnVsbCgxKScgbWVhbnMKICAvLy8gICAgdGhhdCB0aGUgdGVtcGxhdGUgZXhwcmVzc2lvbiB0aHJvd3MgaWYgYW5kIG9ubHkgaWYgdGhlIGZpcnN0IHRlbXBsYXRlCiAgLy8vICAgIHBhcmFtZXRlciBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIGFuZCAnbnVsbCgxKSttYXknIHRocm93cyBpZiB0aGUKICAvLy8gICAgZmlyc3QgYXJndW1lbnQgaXMgYG51bGxgIC8gYHVuZGVmaW5lZGAsIGFuZCB0aGVuIG1heSB0aHJvdyBmb3Igb3RoZXIKICAvLy8gICAgcmVhc29ucy4KICAvLy8KICAvLy8gICAgPGd2bi1zdHJpbmc+IHZhbHVlcyBhcmUgJ3RydWUnIGFuZCAnZmFsc2UnLiBUaGUgZGVmYXVsdCBpZiB1bnNwZWNpZmllZAogIC8vLyAgICBpcyAnZmFsc2UnLgogIC8vLwogIC8vLyAgICA8bmV3LXN0cmluZz4gdmFsdWVzIGFyZSAndHJ1ZScgYW5kICdmYWxzZScuIFRoZSBkZWZhdWx0IGlmIHVuc3BlY2lmaWVkCiAgLy8vICAgIGlzICdmYWxzZScuIEEgJ3RydWUnIHZhbHVlIG1lYW5zIHRoYXQgZWFjaCBldmFsdWF0aW9uIHJldHVybnMgYSBmcmVzaAogIC8vLyAgICAobmV3KSBvYmplY3QgdGhhdCBjYW5ub3QgYmUgdW5hbGlhc2VkIHdpdGggZXhpc3Rpbmcgb2JqZWN0cy4KICAvLy8KICAvLy8gICAgRWFjaCB0YWcga2luZCAoaW5jbHVkaW5nIHRoZSAndHlwZS10YWcncykgY2FuIG9ubHkgb2NjdXIgb25jZSBpbiB0aGUKICAvLy8gICAgc2VxdWVuY2UuCiAgLy8vCiAgLy8vIFtzcGVjU3RyaW5nXSBpcyB0aGUgc3BlY2lmaWNhdGlvbiBzdHJpbmcsIFtsb29rdXBUeXBlXSByZXNvbHZlcyBuYW1lZAogIC8vLyB0eXBlcyBpbnRvIHR5cGUgdmFsdWVzLCBbdHlwZXNSZXR1cm5lZF0gYW5kIFt0eXBlc0luc3RhbnRpYXRlZF0gY29sbGVjdHMKICAvLy8gdGhlIHR5cGVzIGRlZmluZWQgYnkgdGhlIHNwZWNpZmljYXRpb24gc3RyaW5nLCBhbmQgW29iamVjdFR5cGVdIGFuZAogIC8vLyBbbnVsbFR5cGVdIGRlZmluZSB0aGUgdHlwZXMgZm9yIGBPYmplY3RgIGFuZCBgTnVsbGAsIHJlc3BlY3RpdmVseS4gVGhlCiAgLy8vIGxhdHRlciBpcyB1c2VkIGZvciB0aGUgdHlwZSBzdHJpbmdzIG9mIHRoZSBmb3JtICcnIGFuZCAndmFyJy4KICAvLy8gW3ZhbGlkVGFnc10gY2FuIGJlIHVzZWQgdG8gcmVzdHJpY3Qgd2hpY2ggdGFncyBhcmUgYWNjZXB0ZWQuCiAgc3RhdGljIHZvaWQgcHJvY2Vzc1NwZWNTdHJpbmcoCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgU3Bhbm5hYmxlIHNwYW5uYWJsZSwgU3RyaW5nIHNwZWNTdHJpbmcsCiAgICAgIHtJdGVyYWJsZTxTdHJpbmc+IHZhbGlkVGFncywKICAgICAgdm9pZCBzZXRTaWRlRWZmZWN0cyhTaWRlRWZmZWN0cyBuZXdFZmZlY3RzKSwKICAgICAgdm9pZCBzZXRUaHJvd3MoTmF0aXZlVGhyb3dCZWhhdmlvciB0aHJvd0tpbmQpLAogICAgICB2b2lkIHNldElzQWxsb2NhdGlvbihib29sIGlzQWxsb2NhdGlvbiksCiAgICAgIHZvaWQgc2V0VXNlR3ZuKGJvb2wgdXNlR3ZuKSwKICAgICAgVHlwZUxvb2t1cCBsb29rdXBUeXBlLAogICAgICBMaXN0IHR5cGVzUmV0dXJuZWQsCiAgICAgIExpc3QgdHlwZXNJbnN0YW50aWF0ZWQsCiAgICAgIG9iamVjdFR5cGUsCiAgICAgIG51bGxUeXBlfSkgewogICAgYm9vbCBzZWVuRXJyb3IgPSBmYWxzZTsKCiAgICB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBtZXNzYWdlKSB7CiAgICAgIHNlZW5FcnJvciA9IHRydWU7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIHNwYW5uYWJsZSwgTWVzc2FnZUtpbmQuR0VORVJJQywgeyd0ZXh0JzogbWVzc2FnZX0pOwogICAgfQoKICAgIGNvbnN0IExpc3Q8U3RyaW5nPiBrbm93blRhZ3MgPSBjb25zdCBbCiAgICAgICdjcmVhdGVzJywKICAgICAgJ3JldHVybnMnLAogICAgICAnZGVwZW5kcycsCiAgICAgICdlZmZlY3RzJywKICAgICAgJ3Rocm93cycsCiAgICAgICdndm4nLAogICAgICAnbmV3JwogICAgXTsKCiAgICAvLy8gUmVzb2x2ZSBhIHR5cGUgc3RyaW5nIG9mIG9uZSBvZiB0aGUgdGhyZWUgZm9ybXM6CiAgICAvLy8gKiAgJ3ZvaWQnIC0gaW4gd2hpY2ggY2FzZSBbb25Wb2lkXSBpcyBjYWxsZWQsCiAgICAvLy8gKiAgJycgb3IgJ3ZhcicgLSBpbiB3aGljaCBjYXNlIFtvblZhcl0gaXMgY2FsbGVkLAogICAgLy8vICogICdUMXwuLi58VG4nIC0gaW4gd2hpY2ggY2FzZSBbb25UeXBlXSBpcyBjYWxsZWQgZm9yIGVhY2ggcmVzb2x2ZWQgVGkuCiAgICB2b2lkIHJlc29sdmVUeXBlc1N0cmluZyhTdHJpbmcgdHlwZXNTdHJpbmcsCiAgICAgICAge29uVm9pZCgpLCBvblZhcigpLCBvblR5cGUodHlwZSl9KSB7CiAgICAgIC8vIFZhcmlvdXMgdGhpbmdzIHRoYXQgYXJlIG5vdCBpbiBmYWN0IHR5cGVzLgogICAgICBpZiAodHlwZXNTdHJpbmcgPT0gJ3ZvaWQnKSB7CiAgICAgICAgaWYgKG9uVm9pZCAhPSBudWxsKSB7CiAgICAgICAgICBvblZvaWQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0eXBlc1N0cmluZyA9PSAnJyB8fCB0eXBlc1N0cmluZyA9PSAndmFyJykgewogICAgICAgIGlmIChvblZhciAhPSBudWxsKSB7CiAgICAgICAgICBvblZhcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZm9yIChmaW5hbCB0eXBlU3RyaW5nIGluIHR5cGVzU3RyaW5nLnNwbGl0KCd8JykpIHsKICAgICAgICBvblR5cGUoX3BhcnNlVHlwZSh0eXBlU3RyaW5nLnRyaW0oKSwgbG9va3VwVHlwZSkpOwogICAgICB9CiAgICB9CgogICAgaWYgKCFzcGVjU3RyaW5nLmNvbnRhaW5zKCc7JykgJiYgIXNwZWNTdHJpbmcuY29udGFpbnMoJzonKSkgewogICAgICAvLyBGb3JtICgxKSwgdHlwZXMgb3IgcHNldWRvLXR5cGVzIGxpa2UgJ3ZvaWQnIGFuZCAndmFyJy4KICAgICAgcmVzb2x2ZVR5cGVzU3RyaW5nKHNwZWNTdHJpbmcudHJpbSgpLCBvblZhcjogKCkgewogICAgICAgIHR5cGVzUmV0dXJuZWQuYWRkKG9iamVjdFR5cGUpOwogICAgICAgIHR5cGVzUmV0dXJuZWQuYWRkKG51bGxUeXBlKTsKICAgICAgfSwgb25UeXBlOiAodHlwZSkgewogICAgICAgIHR5cGVzSW5zdGFudGlhdGVkLmFkZCh0eXBlKTsKICAgICAgICB0eXBlc1JldHVybmVkLmFkZCh0eXBlKTsKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBMaXN0PFN0cmluZz4gc3BlY3MgPSBzcGVjU3RyaW5nLnNwbGl0KCc7JykubWFwKChzKSA9PiBzLnRyaW0oKSkudG9MaXN0KCk7CiAgICBpZiAoc3BlY3MubGFzdCA9PSAiIikgc3BlY3MucmVtb3ZlTGFzdCgpOyAvLyBBbGxvdyBzZXBhcmF0b3IgdG8gdGVybWluYXRlLgoKICAgIGFzc2VydCgKICAgICAgICB2YWxpZFRhZ3MgPT0gbnVsbCB8fCAodmFsaWRUYWdzLnRvU2V0KCkuLnJlbW92ZUFsbCh2YWxpZFRhZ3MpKS5pc0VtcHR5KTsKICAgIGlmICh2YWxpZFRhZ3MgPT0gbnVsbCkgdmFsaWRUYWdzID0ga25vd25UYWdzOwoKICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gPFN0cmluZywgU3RyaW5nPnt9OwoKICAgIGZvciAoU3RyaW5nIHNwZWMgaW4gc3BlY3MpIHsKICAgICAgTGlzdDxTdHJpbmc+IHRhZ0FuZFZhbHVlID0gc3BlYy5zcGxpdCgnOicpOwogICAgICBpZiAodGFnQW5kVmFsdWUubGVuZ3RoICE9IDIpIHsKICAgICAgICByZXBvcnRFcnJvcigiSW52YWxpZCA8dGFnPjo8dmFsdWU+IHBhaXIgJyRzcGVjJy4iKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBTdHJpbmcgdGFnID0gdGFnQW5kVmFsdWVbMF0udHJpbSgpOwogICAgICBTdHJpbmcgdmFsdWUgPSB0YWdBbmRWYWx1ZVsxXS50cmltKCk7CgogICAgICBpZiAodmFsaWRUYWdzLmNvbnRhaW5zKHRhZykpIHsKICAgICAgICBpZiAodmFsdWVzW3RhZ10gPT0gbnVsbCkgewogICAgICAgICAgdmFsdWVzW3RhZ10gPSB2YWx1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVwb3J0RXJyb3IoIkR1cGxpY2F0ZSB0YWcgJyR0YWcnLiIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoa25vd25UYWdzLmNvbnRhaW5zKHRhZykpIHsKICAgICAgICAgIHJlcG9ydEVycm9yKCJUYWcgJyR0YWcnIGlzIG5vdCB2YWxpZCBoZXJlLiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXBvcnRFcnJvcigiVW5rbm93biB0YWcgJyR0YWcnLiIpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIEVudW0tbGlrZSB0YWdzIGFyZSBsb29rZWQgdXAgaW4gYSBtYXAuIFRydWUgc2lnbmF0dXJlIGlzOgogICAgLy8KICAgIC8vICBUIHRhZ1ZhbHVlTG9va3VwPFQ+KFN0cmluZyB0YWcsIE1hcDxTdHJpbmcsIFQ+IG1hcCk7CiAgICAvLwogICAgZHluYW1pYyB0YWdWYWx1ZUxvb2t1cChTdHJpbmcgdGFnLCBNYXA8U3RyaW5nLCBkeW5hbWljPiBtYXApIHsKICAgICAgU3RyaW5nIHRhZ1N0cmluZyA9IHZhbHVlc1t0YWddOwogICAgICBpZiAodGFnU3RyaW5nID09IG51bGwpIHJldHVybiBudWxsOwogICAgICB2YXIgdmFsdWUgPSBtYXBbdGFnU3RyaW5nXTsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICByZXBvcnRFcnJvcigiVW5rbm93biAnJHRhZycgc3BlY2lmaWNhdGlvbjogJyR0YWdTdHJpbmcnLiIpOwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KCiAgICBTdHJpbmcgcmV0dXJucyA9IHZhbHVlc1sncmV0dXJucyddOwogICAgaWYgKHJldHVybnMgIT0gbnVsbCkgewogICAgICByZXNvbHZlVHlwZXNTdHJpbmcocmV0dXJucywgb25WYXI6ICgpIHsKICAgICAgICB0eXBlc1JldHVybmVkLmFkZChvYmplY3RUeXBlKTsKICAgICAgICB0eXBlc1JldHVybmVkLmFkZChudWxsVHlwZSk7CiAgICAgIH0sIG9uVHlwZTogKHR5cGUpIHsKICAgICAgICB0eXBlc1JldHVybmVkLmFkZCh0eXBlKTsKICAgICAgfSk7CiAgICB9CgogICAgU3RyaW5nIGNyZWF0ZXMgPSB2YWx1ZXNbJ2NyZWF0ZXMnXTsKICAgIGlmIChjcmVhdGVzICE9IG51bGwpIHsKICAgICAgcmVzb2x2ZVR5cGVzU3RyaW5nKGNyZWF0ZXMsIG9uVm9pZDogKCkgewogICAgICAgIHJlcG9ydEVycm9yKCJJbnZhbGlkIHR5cGUgc3RyaW5nICdjcmVhdGVzOiRjcmVhdGVzJyIpOwogICAgICB9LCBvblR5cGU6ICh0eXBlKSB7CiAgICAgICAgdHlwZXNJbnN0YW50aWF0ZWQuYWRkKHR5cGUpOwogICAgICB9KTsKICAgIH0gZWxzZSBpZiAocmV0dXJucyAhPSBudWxsKSB7CiAgICAgIHJlc29sdmVUeXBlc1N0cmluZyhyZXR1cm5zLCBvblR5cGU6ICh0eXBlKSB7CiAgICAgICAgdHlwZXNJbnN0YW50aWF0ZWQuYWRkKHR5cGUpOwogICAgICB9KTsKICAgIH0KCiAgICBjb25zdCB0aHJvd3NPcHRpb24gPSA8U3RyaW5nLCBOYXRpdmVUaHJvd0JlaGF2aW9yPnsKICAgICAgJ25ldmVyJzogTmF0aXZlVGhyb3dCZWhhdmlvci5ORVZFUiwKICAgICAgJ21heSc6IE5hdGl2ZVRocm93QmVoYXZpb3IuTUFZLAogICAgICAnbnVsbCgxKSc6IE5hdGl2ZVRocm93QmVoYXZpb3IuTlVMTF9OU00sCiAgICAgICdudWxsKDEpK21heSc6IE5hdGl2ZVRocm93QmVoYXZpb3IuTlVMTF9OU01fVEhFTl9NQVksCiAgICB9OwoKICAgIGNvbnN0IGJvb2xPcHRpb25zID0gPFN0cmluZywgYm9vbD57J3RydWUnOiB0cnVlLCAnZmFsc2UnOiBmYWxzZX07CgogICAgU2lkZUVmZmVjdHMgc2lkZUVmZmVjdHMgPQogICAgICAgIHByb2Nlc3NFZmZlY3RzKHJlcG9ydEVycm9yLCB2YWx1ZXNbJ2VmZmVjdHMnXSwgdmFsdWVzWydkZXBlbmRzJ10pOwogICAgTmF0aXZlVGhyb3dCZWhhdmlvciB0aHJvd3NLaW5kID0gdGFnVmFsdWVMb29rdXAoJ3Rocm93cycsIHRocm93c09wdGlvbik7CiAgICBib29sIGlzQWxsb2NhdGlvbiA9IHRhZ1ZhbHVlTG9va3VwKCduZXcnLCBib29sT3B0aW9ucyk7CiAgICBib29sIHVzZUd2biA9IHRhZ1ZhbHVlTG9va3VwKCdndm4nLCBib29sT3B0aW9ucyk7CgogICAgaWYgKGlzQWxsb2NhdGlvbiA9PSB0cnVlICYmIHVzZUd2biA9PSB0cnVlKSB7CiAgICAgIHJlcG9ydEVycm9yKCInbmV3JyBhbmQgJ2d2bicgYXJlIGluY29tcGF0aWJsZSIpOwogICAgfQoKICAgIGlmIChzZWVuRXJyb3IpIHJldHVybjsgLy8gQXZvaWQgY2FsbGJhY2tzLgoKICAgIC8vIFRPRE8oc3JhKTogU2ltcGxpZnkgW3Rocm93QmVoYXZpb3JdIHVzaW5nIFtzaWRlRWZmZWN0c10uCgogICAgaWYgKHNpZGVFZmZlY3RzICE9IG51bGwpIHNldFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzKTsKICAgIGlmICh0aHJvd3NLaW5kICE9IG51bGwpIHNldFRocm93cyh0aHJvd3NLaW5kKTsKICAgIGlmIChpc0FsbG9jYXRpb24gIT0gbnVsbCkgc2V0SXNBbGxvY2F0aW9uKGlzQWxsb2NhdGlvbik7CiAgICBpZiAodXNlR3ZuICE9IG51bGwpIHNldFVzZUd2bih1c2VHdm4pOwogIH0KCiAgc3RhdGljIFNpZGVFZmZlY3RzIHByb2Nlc3NFZmZlY3RzKAogICAgICB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBtZXNzYWdlKSwgU3RyaW5nIGVmZmVjdHMsIFN0cmluZyBkZXBlbmRzKSB7CiAgICBpZiAoZWZmZWN0cyA9PSBudWxsICYmIGRlcGVuZHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgaWYgKGVmZmVjdHMgPT0gbnVsbCB8fCBkZXBlbmRzID09IG51bGwpIHsKICAgICAgcmVwb3J0RXJyb3IoIidlZmZlY3RzJyBhbmQgJ2RlcGVuZHMnIG11c3Qgb2NjdXIgdG9nZXRoZXIuIik7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIFNpZGVFZmZlY3RzIHNpZGVFZmZlY3RzID0gbmV3IFNpZGVFZmZlY3RzKCk7CiAgICBpZiAoZWZmZWN0cyA9PSAibm9uZSIpIHsKICAgICAgc2lkZUVmZmVjdHMuY2xlYXJBbGxTaWRlRWZmZWN0cygpOwogICAgfSBlbHNlIGlmIChlZmZlY3RzID09ICJhbGwiKSB7CiAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nLgogICAgfSBlbHNlIHsKICAgICAgTGlzdDxTdHJpbmc+IHNwbGl0RWZmZWN0cyA9IGVmZmVjdHMuc3BsaXQoIiwiKTsKICAgICAgaWYgKHNwbGl0RWZmZWN0cy5pc0VtcHR5KSB7CiAgICAgICAgcmVwb3J0RXJyb3IoIk1pc3Npbmcgc2lkZS1lZmZlY3QgZmxhZy4iKTsKICAgICAgfQogICAgICBmb3IgKFN0cmluZyBlZmZlY3QgaW4gc3BsaXRFZmZlY3RzKSB7CiAgICAgICAgc3dpdGNoIChlZmZlY3QpIHsKICAgICAgICAgIGNhc2UgIm5vLWluZGV4IjoKICAgICAgICAgICAgc2lkZUVmZmVjdHMuY2xlYXJDaGFuZ2VzSW5kZXgoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJuby1pbnN0YW5jZSI6CiAgICAgICAgICAgIHNpZGVFZmZlY3RzLmNsZWFyQ2hhbmdlc0luc3RhbmNlUHJvcGVydHkoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJuby1zdGF0aWMiOgogICAgICAgICAgICBzaWRlRWZmZWN0cy5jbGVhckNoYW5nZXNTdGF0aWNQcm9wZXJ0eSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJlcG9ydEVycm9yKCJVbnJlY29nbml6ZWQgc2lkZS1lZmZlY3QgZmxhZzogJyRlZmZlY3QnLiIpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChkZXBlbmRzID09ICJub25lIikgewogICAgICBzaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgfSBlbHNlIGlmIChkZXBlbmRzID09ICJhbGwiKSB7CiAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nLgogICAgfSBlbHNlIHsKICAgICAgTGlzdDxTdHJpbmc+IHNwbGl0RGVwZW5kZW5jaWVzID0gZGVwZW5kcy5zcGxpdCgiLCIpOwogICAgICBpZiAoc3BsaXREZXBlbmRlbmNpZXMuaXNFbXB0eSkgewogICAgICAgIHJlcG9ydEVycm9yKCJNaXNzaW5nIHNpZGUtZWZmZWN0IGRlcGVuZGVuY3kgZmxhZy4iKTsKICAgICAgfQogICAgICBmb3IgKFN0cmluZyBkZXBlbmRlbmN5IGluIHNwbGl0RGVwZW5kZW5jaWVzKSB7CiAgICAgICAgc3dpdGNoIChkZXBlbmRlbmN5KSB7CiAgICAgICAgICBjYXNlICJuby1pbmRleCI6CiAgICAgICAgICAgIHNpZGVFZmZlY3RzLmNsZWFyRGVwZW5kc09uSW5kZXhTdG9yZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgIm5vLWluc3RhbmNlIjoKICAgICAgICAgICAgc2lkZUVmZmVjdHMuY2xlYXJEZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmUoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJuby1zdGF0aWMiOgogICAgICAgICAgICBzaWRlRWZmZWN0cy5jbGVhckRlcGVuZHNPblN0YXRpY1Byb3BlcnR5U3RvcmUoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXBvcnRFcnJvcigiVW5yZWNvZ25pemVkIHNpZGUtZWZmZWN0IGZsYWc6ICckZGVwZW5kZW5jeScuIik7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHNpZGVFZmZlY3RzOwogIH0KCiAgLy8vIENvbXB1dGUgdGhlIFtOYXRpdmVCZWhhdmlvcl0gZm9yIGEgY2FsbCB0byB0aGUgJ0pTJyBmdW5jdGlvbiB3aXRoIHRoZQogIC8vLyBnaXZlbiBbc3BlY1N0cmluZ10gYW5kIFtjb2RlU3RyaW5nXSAoZmlyc3QgYW5kIHNlY29uZCBhcmd1bWVudHMpLgogIHN0YXRpYyBOYXRpdmVCZWhhdmlvciBvZkpzQ2FsbCgKICAgICAgU3RyaW5nIHNwZWNTdHJpbmcsCiAgICAgIFN0cmluZyBjb2RlU3RyaW5nLAogICAgICBUeXBlTG9va3VwIGxvb2t1cFR5cGUsCiAgICAgIFNwYW5uYWJsZSBzcGFubmFibGUsCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwKICAgICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpIHsKICAgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBvZiBhIEpTLWNhbGwgaXMgYSBzdHJpbmcgZW5jb2RpbmcgdmFyaW91cyBhdHRyaWJ1dGVzCiAgICAvLyBvZiB0aGUgY29kZS4KICAgIC8vCiAgICAvLyAgJ1R5cGUxfFR5cGUyJy4gIEEgdW5pb24gdHlwZS4KICAgIC8vICAnPU9iamVjdCcuICAgICAgQSBKYXZhU2NyaXB0IE9iamVjdCwgbm8gc3VidHlwZS4KCiAgICBOYXRpdmVCZWhhdmlvciBiZWhhdmlvciA9IG5ldyBOYXRpdmVCZWhhdmlvcigpOwoKICAgIGJlaGF2aW9yLmNvZGVUZW1wbGF0ZVRleHQgPSBjb2RlU3RyaW5nOwogICAgYmVoYXZpb3IuY29kZVRlbXBsYXRlID0ganMuanMucGFyc2VGb3JlaWduSlMoYmVoYXZpb3IuY29kZVRlbXBsYXRlVGV4dCk7CgogICAgYm9vbCBzaWRlRWZmZWN0c0FyZUVuY29kZWRJblNwZWNTdHJpbmcgPSBmYWxzZTsKCiAgICB2b2lkIHNldFNpZGVFZmZlY3RzKFNpZGVFZmZlY3RzIG5ld0VmZmVjdHMpIHsKICAgICAgc2lkZUVmZmVjdHNBcmVFbmNvZGVkSW5TcGVjU3RyaW5nID0gdHJ1ZTsKICAgICAgYmVoYXZpb3Iuc2lkZUVmZmVjdHMuc2V0VG8obmV3RWZmZWN0cyk7CiAgICB9CgogICAgYm9vbCB0aHJvd0JlaGF2aW9yRnJvbVNwZWNTdHJpbmcgPSBmYWxzZTsKICAgIHZvaWQgc2V0VGhyb3dzKE5hdGl2ZVRocm93QmVoYXZpb3IgdGhyb3dCZWhhdmlvcikgewogICAgICB0aHJvd0JlaGF2aW9yRnJvbVNwZWNTdHJpbmcgPSB0cnVlOwogICAgICBiZWhhdmlvci50aHJvd0JlaGF2aW9yID0gdGhyb3dCZWhhdmlvcjsKICAgIH0KCiAgICB2b2lkIHNldElzQWxsb2NhdGlvbihib29sIGlzQWxsb2NhdGlvbikgewogICAgICBiZWhhdmlvci5pc0FsbG9jYXRpb24gPSBpc0FsbG9jYXRpb247CiAgICB9CgogICAgdm9pZCBzZXRVc2VHdm4oYm9vbCB1c2VHdm4pIHsKICAgICAgYmVoYXZpb3IudXNlR3ZuID0gdXNlR3ZuOwogICAgfQoKICAgIHByb2Nlc3NTcGVjU3RyaW5nKHJlcG9ydGVyLCBzcGFubmFibGUsIHNwZWNTdHJpbmcsCiAgICAgICAgc2V0U2lkZUVmZmVjdHM6IHNldFNpZGVFZmZlY3RzLAogICAgICAgIHNldFRocm93czogc2V0VGhyb3dzLAogICAgICAgIHNldElzQWxsb2NhdGlvbjogc2V0SXNBbGxvY2F0aW9uLAogICAgICAgIHNldFVzZUd2bjogc2V0VXNlR3ZuLAogICAgICAgIGxvb2t1cFR5cGU6IGxvb2t1cFR5cGUsCiAgICAgICAgdHlwZXNSZXR1cm5lZDogYmVoYXZpb3IudHlwZXNSZXR1cm5lZCwKICAgICAgICB0eXBlc0luc3RhbnRpYXRlZDogYmVoYXZpb3IudHlwZXNJbnN0YW50aWF0ZWQsCiAgICAgICAgb2JqZWN0VHlwZTogY29tbW9uRWxlbWVudHMub2JqZWN0VHlwZSwKICAgICAgICBudWxsVHlwZTogY29tbW9uRWxlbWVudHMubnVsbFR5cGUpOwoKICAgIGlmICghc2lkZUVmZmVjdHNBcmVFbmNvZGVkSW5TcGVjU3RyaW5nKSB7CiAgICAgIG5ldyBTaWRlRWZmZWN0c1Zpc2l0b3IoYmVoYXZpb3Iuc2lkZUVmZmVjdHMpCiAgICAgICAgICAudmlzaXQoYmVoYXZpb3IuY29kZVRlbXBsYXRlLmFzdCk7CiAgICB9CiAgICBpZiAoIXRocm93QmVoYXZpb3JGcm9tU3BlY1N0cmluZykgewogICAgICBiZWhhdmlvci50aHJvd0JlaGF2aW9yID0KICAgICAgICAgIG5ldyBUaHJvd0JlaGF2aW9yVmlzaXRvcigpLmFuYWx5emUoYmVoYXZpb3IuY29kZVRlbXBsYXRlLmFzdCk7CiAgICB9CgogICAgcmV0dXJuIGJlaGF2aW9yOwogIH0KCiAgc3RhdGljIHZvaWQgX2ZpbGxOYXRpdmVCZWhhdmlvck9mQnVpbHRpbk9yRW1iZWRkZWRHbG9iYWwoCiAgICAgIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yLAogICAgICBTcGFubmFibGUgc3Bhbm5hYmxlLAogICAgICBTdHJpbmcgc3BlY1N0cmluZywKICAgICAgVHlwZUxvb2t1cCBsb29rdXBUeXBlLAogICAgICBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIsCiAgICAgIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICB7TGlzdDxTdHJpbmc+IHZhbGlkVGFnc30pIHsKICAgIHZvaWQgc2V0U2lkZUVmZmVjdHMoU2lkZUVmZmVjdHMgbmV3RWZmZWN0cykgewogICAgICBiZWhhdmlvci5zaWRlRWZmZWN0cy5zZXRUbyhuZXdFZmZlY3RzKTsKICAgIH0KCiAgICBwcm9jZXNzU3BlY1N0cmluZyhyZXBvcnRlciwgc3Bhbm5hYmxlLCBzcGVjU3RyaW5nLAogICAgICAgIHZhbGlkVGFnczogdmFsaWRUYWdzLAogICAgICAgIGxvb2t1cFR5cGU6IGxvb2t1cFR5cGUsCiAgICAgICAgc2V0U2lkZUVmZmVjdHM6IHNldFNpZGVFZmZlY3RzLAogICAgICAgIHR5cGVzUmV0dXJuZWQ6IGJlaGF2aW9yLnR5cGVzUmV0dXJuZWQsCiAgICAgICAgdHlwZXNJbnN0YW50aWF0ZWQ6IGJlaGF2aW9yLnR5cGVzSW5zdGFudGlhdGVkLAogICAgICAgIG9iamVjdFR5cGU6IGNvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGUsCiAgICAgICAgbnVsbFR5cGU6IGNvbW1vbkVsZW1lbnRzLm51bGxUeXBlKTsKICB9CgogIHN0YXRpYyBOYXRpdmVCZWhhdmlvciBvZkpzQnVpbHRpbkNhbGwoCiAgICAgIFN0cmluZyBzcGVjU3RyaW5nLAogICAgICBUeXBlTG9va3VwIGxvb2t1cFR5cGUsCiAgICAgIFNwYW5uYWJsZSBzcGFubmFibGUsCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwKICAgICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpIHsKICAgIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yID0gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICBiZWhhdmlvci5zaWRlRWZmZWN0cy5zZXRUbyhuZXcgU2lkZUVmZmVjdHMoKSk7CiAgICBfZmlsbE5hdGl2ZUJlaGF2aW9yT2ZCdWlsdGluT3JFbWJlZGRlZEdsb2JhbCgKICAgICAgICBiZWhhdmlvciwgc3Bhbm5hYmxlLCBzcGVjU3RyaW5nLCBsb29rdXBUeXBlLCByZXBvcnRlciwgY29tbW9uRWxlbWVudHMpOwogICAgcmV0dXJuIGJlaGF2aW9yOwogIH0KCiAgc3RhdGljIE5hdGl2ZUJlaGF2aW9yIG9mSnNFbWJlZGRlZEdsb2JhbENhbGwoCiAgICAgIFN0cmluZyBzcGVjU3RyaW5nLAogICAgICBUeXBlTG9va3VwIGxvb2t1cFR5cGUsCiAgICAgIFNwYW5uYWJsZSBzcGFubmFibGUsCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwKICAgICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpIHsKICAgIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yID0gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICAvLyBUT0RPKHNyYSk6IEFsbG93IHRoZSB1c2Ugc2l0ZSB0byBvdmVycmlkZSB0aGVzZSBkZWZhdWx0cy4KICAgIC8vIEVtYmVkZGVkIGdsb2JhbHMgYXJlIHVzdWFsbHkgcHJlLWNvbXB1dGVkIGRhdGEgc3RydWN0dXJlcyBvciBKYXZhU2NyaXB0CiAgICAvLyBmdW5jdGlvbnMgdGhhdCBuZXZlciBjaGFuZ2UuCiAgICBiZWhhdmlvci5zaWRlRWZmZWN0cy5zZXRUbyhuZXcgU2lkZUVmZmVjdHMuZW1wdHkoKSk7CiAgICBiZWhhdmlvci50aHJvd0JlaGF2aW9yID0gTmF0aXZlVGhyb3dCZWhhdmlvci5ORVZFUjsKICAgIF9maWxsTmF0aXZlQmVoYXZpb3JPZkJ1aWx0aW5PckVtYmVkZGVkR2xvYmFsKAogICAgICAgIGJlaGF2aW9yLCBzcGFubmFibGUsIHNwZWNTdHJpbmcsIGxvb2t1cFR5cGUsIHJlcG9ydGVyLCBjb21tb25FbGVtZW50cywKICAgICAgICB2YWxpZFRhZ3M6IFsncmV0dXJucycsICdjcmVhdGVzJ10pOwogICAgcmV0dXJuIGJlaGF2aW9yOwogIH0KCiAgc3RhdGljIGR5bmFtaWMgLypEYXJ0VHlwZXxTcGVjaWFsVHlwZSovIF9wYXJzZVR5cGUoCiAgICAgIFN0cmluZyB0eXBlU3RyaW5nLCBUeXBlTG9va3VwIGxvb2t1cFR5cGUpIHsKICAgIGlmICh0eXBlU3RyaW5nID09ICc9T2JqZWN0JykgcmV0dXJuIFNwZWNpYWxUeXBlLkpzT2JqZWN0OwogICAgaWYgKHR5cGVTdHJpbmcgPT0gJ2R5bmFtaWMnKSB7CiAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfQogICAgaW50IGluZGV4ID0gdHlwZVN0cmluZy5pbmRleE9mKCc8Jyk7CiAgICB2YXIgdHlwZSA9IGxvb2t1cFR5cGUodHlwZVN0cmluZywgcmVxdWlyZWQ6IGluZGV4ID09IC0xKTsKICAgIGlmICh0eXBlICE9IG51bGwpIHJldHVybiB0eXBlOwoKICAgIGlmIChpbmRleCAhPSAtMSkgewogICAgICB0eXBlID0gbG9va3VwVHlwZSh0eXBlU3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCksIHJlcXVpcmVkOiB0cnVlKTsKICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICAgIC8vIFRPRE8oc3JhKTogUGFyc2UgdHlwZSBwYXJhbWV0ZXJzLgogICAgICAgIHJldHVybiB0eXBlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEJlaGF2aW9yQnVpbGRlciB7CiAgQ29tbW9uRWxlbWVudHMgZ2V0IGNvbW1vbkVsZW1lbnRzOwogIERpYWdub3N0aWNSZXBvcnRlciBnZXQgcmVwb3J0ZXI7CiAgTmF0aXZlQmFzaWNEYXRhIGdldCBuYXRpdmVCYXNpY0RhdGE7CiAgYm9vbCBnZXQgdHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnM7CiAgRWxlbWVudEVudmlyb25tZW50IGdldCBlbGVtZW50RW52aXJvbm1lbnQ7CgogIE5hdGl2ZUJlaGF2aW9yIF9iZWhhdmlvcjsKCiAgdm9pZCBfb3ZlcnJpZGVXaXRoQW5ub3RhdGlvbnMoSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMsCiAgICAgIEl0ZXJhYmxlPFN0cmluZz4gcmV0dXJuc0Fubm90YXRpb25zLCBUeXBlTG9va3VwIGxvb2t1cFR5cGUpIHsKICAgIGlmIChjcmVhdGVzQW5ub3RhdGlvbnMuaXNFbXB0eSAmJiByZXR1cm5zQW5ub3RhdGlvbnMuaXNFbXB0eSkgcmV0dXJuOwoKICAgIExpc3QgY3JlYXRlcyA9IF9jb2xsZWN0KGNyZWF0ZXNBbm5vdGF0aW9ucywgbG9va3VwVHlwZSk7CiAgICBMaXN0IHJldHVybnMgPSBfY29sbGVjdChyZXR1cm5zQW5ub3RhdGlvbnMsIGxvb2t1cFR5cGUpOwoKICAgIGlmIChjcmVhdGVzICE9IG51bGwpIHsKICAgICAgX2JlaGF2aW9yLnR5cGVzSW5zdGFudGlhdGVkCiAgICAgICAgLi5jbGVhcigpCiAgICAgICAgLi5hZGRBbGwoY3JlYXRlcyk7CiAgICB9CiAgICBpZiAocmV0dXJucyAhPSBudWxsKSB7CiAgICAgIF9iZWhhdmlvci50eXBlc1JldHVybmVkCiAgICAgICAgLi5jbGVhcigpCiAgICAgICAgLi5hZGRBbGwocmV0dXJucyk7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyBhIGxpc3Qgb2YgdHlwZSBjb25zdHJhaW50cyBmcm9tIHRoZSBhbm5vdGF0aW9ucyBvZgogIC8vLyBbYW5ub3RhdGlvbkNsYXNzXS4KICAvLy8gUmV0dXJucyBgbnVsbGAgaWYgbm8gY29uc3RyYWludHMuCiAgTGlzdCBfY29sbGVjdChJdGVyYWJsZTxTdHJpbmc+IGFubm90YXRpb25zLCBUeXBlTG9va3VwIGxvb2t1cFR5cGUpIHsKICAgIHZhciB0eXBlcyA9IG51bGw7CiAgICBmb3IgKFN0cmluZyBzcGVjU3RyaW5nIGluIGFubm90YXRpb25zKSB7CiAgICAgIGZvciAoZmluYWwgdHlwZVN0cmluZyBpbiBzcGVjU3RyaW5nLnNwbGl0KCd8JykpIHsKICAgICAgICB2YXIgdHlwZSA9IE5hdGl2ZUJlaGF2aW9yLl9wYXJzZVR5cGUodHlwZVN0cmluZywgbG9va3VwVHlwZSk7CiAgICAgICAgaWYgKHR5cGVzID09IG51bGwpIHR5cGVzID0gW107CiAgICAgICAgdHlwZXMuYWRkKHR5cGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHlwZXM7CiAgfQoKICAvLy8gTW9kZWxzIHRoZSBiZWhhdmlvciBvZiBoYXZpbmcgaW5zdGFuY2VzIG9mIFt0eXBlXSBlc2NhcGUgZnJvbSBEYXJ0IGNvZGUKICAvLy8gaW50byBuYXRpdmUgY29kZS4KICB2b2lkIF9lc2NhcGUoRGFydFR5cGUgdHlwZSwgYm9vbCBpc0pzSW50ZXJvcCkgewogICAgdHlwZSA9IGVsZW1lbnRFbnZpcm9ubWVudC5nZXRVbmFsaWFzZWRUeXBlKHR5cGUpOwogICAgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPSB0eXBlOwogICAgICAvLyBBIGZ1bmN0aW9uIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIG5hdGl2ZSBjb2RlLCBwYXNzaW5nIHVzIG5vdmVsCiAgICAgIC8vIHBhcmFtZXRlcnMuCiAgICAgIF9lc2NhcGUoZnVuY3Rpb25UeXBlLnJldHVyblR5cGUsIGlzSnNJbnRlcm9wKTsKICAgICAgZm9yIChEYXJ0VHlwZSBwYXJhbWV0ZXIgaW4gZnVuY3Rpb25UeXBlLnBhcmFtZXRlclR5cGVzKSB7CiAgICAgICAgX2NhcHR1cmUocGFyYW1ldGVyLCBpc0pzSW50ZXJvcCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBNb2RlbHMgdGhlIGJlaGF2aW9yIG9mIERhcnQgY29kZSByZWNlaXZpbmcgaW5zdGFuY2VzIGFuZCBtZXRob2RzIG9mIFt0eXBlXQogIC8vLyBmcm9tIG5hdGl2ZSBjb2RlLiAgV2UgdXN1YWxseSBzdGFydCB0aGUgYW5hbHlzaXMgYnkgY2FwdHVyaW5nIGEgbmF0aXZlCiAgLy8vIG1ldGhvZCB0aGF0IGhhcyBiZWVuIHVzZWQuCiAgLy8vCiAgLy8vIFdlIGFzc3VtZSB0aGF0IEpTLWludGVyb3AgQVBJcyBjYW5ub3QgaW5zdGFudGlhdGUgRGFydCB0eXBlcyBvcgogIC8vLyBub24tSlNJbnRlcm9wIG5hdGl2ZSB0eXBlcy4KICB2b2lkIF9jYXB0dXJlKERhcnRUeXBlIHR5cGUsIGJvb2wgaXNKc0ludGVyb3ApIHsKICAgIHR5cGUgPSBlbGVtZW50RW52aXJvbm1lbnQuZ2V0VW5hbGlhc2VkVHlwZSh0eXBlKTsKICAgIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0gdHlwZTsKICAgICAgX2NhcHR1cmUoZnVuY3Rpb25UeXBlLnJldHVyblR5cGUsIGlzSnNJbnRlcm9wKTsKICAgICAgZm9yIChEYXJ0VHlwZSBwYXJhbWV0ZXIgaW4gZnVuY3Rpb25UeXBlLnBhcmFtZXRlclR5cGVzKSB7CiAgICAgICAgX2VzY2FwZShwYXJhbWV0ZXIsIGlzSnNJbnRlcm9wKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKCFpc0pzSW50ZXJvcCkgewogICAgICAgIF9iZWhhdmlvci50eXBlc0luc3RhbnRpYXRlZC5hZGQodHlwZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgICAgICBuYXRpdmVCYXNpY0RhdGEuaXNOYXRpdmVDbGFzcyh0eXBlLmVsZW1lbnQpKSB7CiAgICAgICAgICAvLyBBbnkgZGVjbGFyZWQgbmF0aXZlIG9yIGludGVyb3AgdHlwZSAoaXNOYXRpdmUgaW1wbGllcyBpc0pzSW50ZXJvcCkKICAgICAgICAgIC8vIGlzIGFzc3VtZWQgdG8gYmUgYWxsb2NhdGVkLgogICAgICAgICAgX2JlaGF2aW9yLnR5cGVzSW5zdGFudGlhdGVkLmFkZCh0eXBlKTsKICAgICAgICB9CgogICAgICAgIGlmICghdHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnMgfHwKICAgICAgICAgICAgdHlwZS5pc0R5bmFtaWMgfHwKICAgICAgICAgICAgdHlwZSA9PSBjb21tb25FbGVtZW50cy5vYmplY3RUeXBlKSB7CiAgICAgICAgICAvLyBCeSBzYXlpbmcgdGhhdCBvbmx5IEpTLWludGVyb3AgdHlwZXMgY2FuIGJlIGNyZWF0ZWQsIHdlIHByZXZlbnQKICAgICAgICAgIC8vIHB1bGxpbmcgaW4gZXZlcnkgb3RoZXIgbmF0aXZlIHR5cGUgKGUuZy4gYWxsIG9mIGRhcnQ6aHRtbCkgd2hlbiBhCiAgICAgICAgICAvLyBKUyBpbnRlcm9wIEFQSSByZXR1cm5zIGR5bmFtaWMgb3Igd2hlbiB3ZSBkb24ndCB0cnVzdCB0aGUgdHlwZQogICAgICAgICAgLy8gYW5ub3RhdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCB0byBzb21lIGRlZ3JlZSB3ZSBzdGlsbCB1c2UgdGhlIHJldHVybgogICAgICAgICAgLy8gdHlwZSB0byBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIG5hdGl2ZSB0eXBlcywgZXZlbiBpZiB3ZSBkb24ndAogICAgICAgICAgLy8gdHJ1c3QgdGhlIHR5cGUgYW5ub3RhdGlvbi4KICAgICAgICAgIENsYXNzRW50aXR5IGNscyA9IGNvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdE9iamVjdENsYXNzOwogICAgICAgICAgX2JlaGF2aW9yLnR5cGVzSW5zdGFudGlhdGVkLmFkZChlbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoY2xzKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2hlbiB0aGUgZGVjbGFyZWQgdHlwZSBpcyBhIERhcnQgdHlwZSwgd2UgZG8gbm90CiAgICAgICAgICAvLyByZWdpc3RlciBhbiBhbGxvY2F0aW9uIGJlY2F1c2Ugd2UgYXNzdW1lIGl0IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKICAgICAgICAgIC8vIGZyb20gd2l0aGluIHRoZSBKUy1pbnRlcm9wIGNvZGUuIEl0IG11c3QgaGF2ZSBlc2NhcGVkIGZyb20gYW5vdGhlcgogICAgICAgICAgLy8gQVBJLgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgTmF0aXZlQmVoYXZpb3IgYnVpbGRGaWVsZExvYWRCZWhhdmlvcigKICAgICAgRGFydFR5cGUgdHlwZSwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMsCiAgICAgIEl0ZXJhYmxlPFN0cmluZz4gcmV0dXJuc0Fubm90YXRpb25zLAogICAgICBUeXBlTG9va3VwIGxvb2t1cFR5cGUsCiAgICAgIHtib29sIGlzSnNJbnRlcm9wfSkgewogICAgX2JlaGF2aW9yID0gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICAvLyBUT0RPKHNpZ211bmQsc3JhKTogY29uc2lkZXIgZG9pbmcgc29tZXRoaW5nIGJldHRlciBmb3IgbnVtZXJpYyB0eXBlcy4KICAgIF9iZWhhdmlvci50eXBlc1JldHVybmVkLmFkZCghaXNKc0ludGVyb3AgfHwgdHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnMKICAgICAgICA/IHR5cGUKICAgICAgICA6IGNvbW1vbkVsZW1lbnRzLmR5bmFtaWNUeXBlKTsKICAgIC8vIERlY2xhcmVkIHR5cGVzIGFyZSBudWxsYWJsZS4KICAgIF9iZWhhdmlvci50eXBlc1JldHVybmVkLmFkZChjb21tb25FbGVtZW50cy5udWxsVHlwZSk7CiAgICBfY2FwdHVyZSh0eXBlLCBpc0pzSW50ZXJvcCk7CiAgICBfb3ZlcnJpZGVXaXRoQW5ub3RhdGlvbnMoCiAgICAgICAgY3JlYXRlc0Fubm90YXRpb25zLCByZXR1cm5zQW5ub3RhdGlvbnMsIGxvb2t1cFR5cGUpOwogICAgcmV0dXJuIF9iZWhhdmlvcjsKICB9CgogIE5hdGl2ZUJlaGF2aW9yIGJ1aWxkRmllbGRTdG9yZUJlaGF2aW9yKERhcnRUeXBlIHR5cGUpIHsKICAgIF9iZWhhdmlvciA9IG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgX2VzY2FwZSh0eXBlLCBmYWxzZSk7CiAgICAvLyBXZSBkb24ndCBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgLSB0aGUgYW5ub3RhdGlvbnMgYXBwbHkgdG8KICAgIC8vIGxvYWRpbmcgdGhlIGZpZWxkLgogICAgcmV0dXJuIF9iZWhhdmlvcjsKICB9CgogIE5hdGl2ZUJlaGF2aW9yIGJ1aWxkTWV0aG9kQmVoYXZpb3IoCiAgICAgIEZ1bmN0aW9uVHlwZSB0eXBlLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IGNyZWF0ZUFubm90YXRpb25zLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IHJldHVybnNBbm5vdGF0aW9ucywKICAgICAgVHlwZUxvb2t1cCBsb29rdXBUeXBlLAogICAgICB7Ym9vbCBpc0pzSW50ZXJvcH0pIHsKICAgIF9iZWhhdmlvciA9IG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgRGFydFR5cGUgcmV0dXJuVHlwZSA9IHR5cGUucmV0dXJuVHlwZTsKICAgIC8vIE5vdGU6IEZvciBkYXJ0Omh0bWwgYW5kIG90aGVyIGludGVybmFsIGxpYnJhcmllcyB3ZSBtYWludGFpbiwgd2UgY2FuCiAgICAvLyB0cnVzdCB0aGUgcmV0dXJuIHR5cGUgYW5kIHVzZSBpdCB0byBsaW1pdCB3aGF0IHdlIGVucXVldWUuIFdlIGhhdmUgdG8KICAgIC8vIGJlIG1vcmUgY29uc2VydmF0aXZlIGFib3V0IEpTIGludGVyb3AgdHlwZXMgYW5kIGFzc3VtZSB0aGV5IGNhbiByZXR1cm4KICAgIC8vIGFueXRoaW5nICh1bmxlc3MgdGhlIHVzZXIgcHJvdmlkZXMgdGhlIGV4cGVyaW1lbnRhbCBmbGFnIHRvIHRydXN0IHRoZQogICAgLy8gdHlwZSBvZiBqcy1pbnRlcm9wIEFQSXMpLiBXZSBkbyByZXN0cmljdCB0aGUgYWxsb2NhdGlvbiBlZmZlY3RzIGFuZCBzYXkKICAgIC8vIHRoYXQgaW50ZXJvcCBjYWxscyBjcmVhdGUgb25seSBpbnRlcm9wIHR5cGVzICh3aGljaCBtYXkgYmUgdW5zb3VuZCBpZgogICAgLy8gYW4gaW50ZXJvcCBjYWxsIHJldHVybnMgYSBET00gdHlwZSBhbmQgZGVjbGFyZXMgYSBkeW5hbWljIHJldHVybiB0eXBlLAogICAgLy8gYnV0IG90aGVyd2lzZSB3ZSB3b3VsZCBpbmNsdWRlIGEgbG90IG9mIGNvZGUgYnkgZGVmYXVsdCkuCiAgICAvLyBUT0RPKHNpZ211bmQsc3JhKTogY29uc2lkZXIgZG9pbmcgc29tZXRoaW5nIGJldHRlciBmb3IgbnVtZXJpYyB0eXBlcy4KICAgIF9iZWhhdmlvci50eXBlc1JldHVybmVkLmFkZCghaXNKc0ludGVyb3AgfHwgdHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnMKICAgICAgICA/IHJldHVyblR5cGUKICAgICAgICA6IGNvbW1vbkVsZW1lbnRzLmR5bmFtaWNUeXBlKTsKICAgIGlmICghdHlwZS5yZXR1cm5UeXBlLmlzVm9pZCkgewogICAgICAvLyBEZWNsYXJlZCB0eXBlcyBhcmUgbnVsbGFibGUuCiAgICAgIF9iZWhhdmlvci50eXBlc1JldHVybmVkLmFkZChjb21tb25FbGVtZW50cy5udWxsVHlwZSk7CiAgICB9CiAgICBfY2FwdHVyZSh0eXBlLCBpc0pzSW50ZXJvcCk7CgogICAgZm9yIChEYXJ0VHlwZSB0eXBlIGluIHR5cGUub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcykgewogICAgICBfZXNjYXBlKHR5cGUsIGlzSnNJbnRlcm9wKTsKICAgIH0KICAgIGZvciAoRGFydFR5cGUgdHlwZSBpbiB0eXBlLm5hbWVkUGFyYW1ldGVyVHlwZXMpIHsKICAgICAgX2VzY2FwZSh0eXBlLCBpc0pzSW50ZXJvcCk7CiAgICB9CgogICAgX292ZXJyaWRlV2l0aEFubm90YXRpb25zKGNyZWF0ZUFubm90YXRpb25zLCByZXR1cm5zQW5ub3RhdGlvbnMsIGxvb2t1cFR5cGUpOwogICAgcmV0dXJuIF9iZWhhdmlvcjsKICB9Cn0KCkxpc3Q8U3RyaW5nPiBfZ2V0QW5ub3RhdGlvbnMoRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyLAogICAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gbWV0YWRhdGEsIENsYXNzRW50aXR5IGNscykgewogIExpc3Q8U3RyaW5nPiBhbm5vdGF0aW9ucyA9IFtdOwogIGZvciAoQ29uc3RhbnRWYWx1ZSB2YWx1ZSBpbiBtZXRhZGF0YSkgewogICAgaWYgKCF2YWx1ZS5pc0NvbnN0cnVjdGVkT2JqZWN0KSBjb250aW51ZTsKICAgIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSBjb25zdHJ1Y3RlZE9iamVjdCA9IHZhbHVlOwogICAgaWYgKGNvbnN0cnVjdGVkT2JqZWN0LnR5cGUuZWxlbWVudCAhPSBjbHMpIGNvbnRpbnVlOwoKICAgIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IGZpZWxkcyA9IGNvbnN0cnVjdGVkT2JqZWN0LmZpZWxkcy52YWx1ZXM7CiAgICAvLyBUT0RPKHNyYSk6IEJldHRlciB2YWxpZGF0aW9uIG9mIHRoZSBjb25zdGFudC4KICAgIGlmIChmaWVsZHMubGVuZ3RoICE9IDEgfHwgIWZpZWxkcy5zaW5nbGUuaXNTdHJpbmcpIHsKICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcihDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgJ0Fubm90YXRpb25zIG5lZWRzIG9uZSBzdHJpbmc6ICR7dmFsdWUudG9TdHJ1Y3R1cmVkVGV4dCgpfScpOwogICAgfQogICAgU3RyaW5nQ29uc3RhbnRWYWx1ZSBzcGVjU3RyaW5nQ29uc3RhbnQgPSBmaWVsZHMuc2luZ2xlOwogICAgU3RyaW5nIHNwZWNTdHJpbmcgPSBzcGVjU3RyaW5nQ29uc3RhbnQuc3RyaW5nVmFsdWU7CiAgICBhbm5vdGF0aW9ucy5hZGQoc3BlY1N0cmluZyk7CiAgfQogIHJldHVybiBhbm5vdGF0aW9uczsKfQoKTGlzdDxTdHJpbmc+IGdldENyZWF0ZXNBbm5vdGF0aW9ucyhEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIsCiAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gbWV0YWRhdGEpIHsKICByZXR1cm4gX2dldEFubm90YXRpb25zKAogICAgICByZXBvcnRlciwgbWV0YWRhdGEsIGNvbW1vbkVsZW1lbnRzLmFubm90YXRpb25DcmVhdGVzQ2xhc3MpOwp9CgpMaXN0PFN0cmluZz4gZ2V0UmV0dXJuc0Fubm90YXRpb25zKERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwKICAgIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLCBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBtZXRhZGF0YSkgewogIHJldHVybiBfZ2V0QW5ub3RhdGlvbnMoCiAgICAgIHJlcG9ydGVyLCBtZXRhZGF0YSwgY29tbW9uRWxlbWVudHMuYW5ub3RhdGlvblJldHVybnNDbGFzcyk7Cn0Kg6gATk48ARkjSiQhHj4uORIBRxYBURQVIgEoOgEMJQEMHQEtHRcNQgYEAgE7HEVDAS1IAThRARMrASYBSzpMAU0fMwFIJigvEQQBDBYnIyw5KgQBJwY1NAsJDhcFASwGNSkBGzYUDhYOFA4ZDiIPFQYEARk5JiE9HiYeBAEXNiQQBAIBMwRLSxMEQgRLTzEEUVAxBDxOIQRRJwQfIQRMHBdIHS8BRg8hAT8PJQEbShIcASEBPwEdFwFRIkAvNFFRATwBLQE8QRcBFxcsKy8rLwgUBgEmKjlKKislFQFIMjokNEYGTjsqHhUEATIoFQEiJSsgIB8RIgoIJiovJQgGAR8jLicoIhwTBAEMFh0kKiglMiYNBAFANDEwOCoVBAEuUR5ABAEuUR5HBAFNTE5PMgYsBlFMSlBOKgZJLQZCBiYqJB4eBk5RT0AGUUclBklOJgZQT09LTz4GR05PTU4SBlAVBlBPRgZOEwZMT0pNREMhSyMzNS8jHRoeEhMcAScYIz4GASsREREREA0MBwE5NjpQMC00Ix4UChAINx0TChAIOTsIBgFCQDgnJRolIQoOBgFOTwEMUTIBNQEhMiU8EggqLAElIx8RMAoPJzgRLgoIBgFBBz0HQyYqIhtECBQGASgbLiclGiEKBgEoGy8/GiUKIjMlCgYBOComLzwHAUYBHktNPDYBMjcGAS8BQAE6Mz0rBAElSjkBLkMTBgExHSkjHA02IjIILBobLRMeOBMcNhMTRgoIBgEdKiMcDTsnPQg1Hhs0Ex4/Exw9ExNKCggGARgEAUxIIhkZHRsjJ08UByY5ATQBLE0BNAEyMC4GAS44Ki4GAS4sBgEiIAYBNygeKh4gLzcvLAEuMy0GKB9JBgEVBAE8HxsZHSMlIjIuBgE3HiAoLzcvLAQBKRkdGyMnNDMyUBUEATAZHRsjJzRBTyQ5ODJPLBUEATYyPiMiBik+IwEXSRotFQgGIAQCASElIycqLQEcAUVESgE9PQEbIhIbBhseEhsGBAFBGShHFi04RicZCAYSBAFOGDI2IChHFTVAKggGBAFRTSEGRiIzNiAoNkApCA0aLw8lO1ApMQoBLh4xTU9MUU4oRFARSVBQEgoIBgQBKRUrKx0cJk1ODyckOiEePRYEATomGkoaFgQBJhkqKx0cJitMTU5NT01OQU1OFScjJjwGIQE5IgY2IgYBURYEAgE6OSEqLjg5AUY1OThIBjw4IQQWAgFARxpCAgFARxpCAgEpcGFja2FnZTpjb21waWxlci9zcmMvbmF0aXZlL2JlaGF2aW9yLmRhcnQzc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdW5pdmVyc2UvZmVhdHVyZS5kYXJ0nnovLyBUT0RPKHNpZ211bmQpOiByZW5hbWUgdW5pdmVyc2UgPT4gd29ybGQKLy8vIERlc2NyaWJlcyBpbmRpdmlkdWFsIGZlYXR1cmVzIHRoYXQgbWF5IGJlIHNlZW4gaW4gYSBwcm9ncmFtLiBNb3N0IGZlYXR1cmVzCi8vLyBjYW4gYmUgZGVzY3JpYmVkIG9ubHkgYnkgbmFtZSB1c2luZyB0aGUgW0ZlYXR1cmVdIGVudW0sIHNvbWUgZmVhdHVyZXMgYXJlCi8vLyBleHByZXNzZWQgaW5jbHVkaW5nIGRldGFpbHMgb24gaG93IHRoZXkgYXJlIHVzZWQuIEZvciBleGFtcGxlLCB3aGV0aGVyIGEKLy8vIGxpc3QgbGl0ZXJhbCB3YXMgY29uc3RhbnQgb3IgZW1wdHkuCi8vLwovLy8gVGhlIHVzZSBvZiB0aGVzZSBmZWF0dXJlcyBpcyB0eXBpY2FsbHkgZGlzY292ZXJlZCBpbiBhbiBlYXJseSBwaGFzZSBvZiB0aGUKLy8vIGNvbXBpbGF0aW9uIHBpcGVsaW5lLCBmb3IgZXhhbXBsZSBkdXJpbmcgcmVzb2x1dGlvbi4KbGlicmFyeSBjb21waWxlci51bml2ZXJzZS5mZWF0dXJlOwoKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9ydW50aW1lX3R5cGVfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKCi8vLyBBIGxhbmd1YWdlIGZlYXR1cmUgdGhhdCBtYXkgYmUgc2VlbiBpbiB0aGUgcHJvZ3JhbS4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hvdWxkIG1pcnJvciB1c2FnZSBiZSBwYXJ0IG9mIHRoaXM/CmVudW0gRmVhdHVyZSB7CiAgLy8vIEludm9jYXRpb24gb2YgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdGlvbiBvbiBhbiBhYnN0cmFjdCBjbGFzcy4KICBBQlNUUkFDVF9DTEFTU19JTlNUQU5USUFUSU9OLAoKICAvLy8gQW4gYXNzZXJ0IHN0YXRlbWVudCB3aXRoIG5vIG1lc3NhZ2UuCiAgQVNTRVJULAoKICAvLy8gQW4gYXNzZXJ0IHN0YXRlbWVudCB3aXRoIGEgbWVzc2FnZS4KICBBU1NFUlRfV0lUSF9NRVNTQUdFLAoKICAvLy8gQSBtZXRob2Qgd2l0aCBhbiBgYXN5bmNgIGJvZHkgbW9kaWZpZXIuCiAgQVNZTkMsCgogIC8vLyBBbiBhc3luY2hyb25vdXMgZm9yIGluIHN0YXRlbWVudCBsaWtlIGBhd2FpdCBmb3IgKHZhciBlIGluIGkpIHt9YC4KICBBU1lOQ19GT1JfSU4sCgogIC8vLyBBIG1ldGhvZCB3aXRoIGFuIGBhc3luYypgIGJvZHkgbW9kaWZpZXIuCiAgQVNZTkNfU1RBUiwKCiAgLy8vIEEgY2F0Y2ggc3RhdGVtZW50LgogIENBVENIX1NUQVRFTUVOVCwKCiAgLy8vIEEgZmFsbCB0aHJvdWdoIGluIGEgc3dpdGNoIGNhc2UuCiAgRkFMTF9USFJPVUdIX0VSUk9SLAoKICAvLy8gQSBmaWVsZCB3aXRob3V0IGFuIGluaXRpYWxpemVyLgogIEZJRUxEX1dJVEhPVVRfSU5JVElBTElaRVIsCgogIC8vLyBBIGZpZWxkIHdob3NlIGluaXRpYWxpemF0aW9uIGlzIG5vdCBhIGNvbnN0YW50LgogIExBWllfRklFTEQsCgogIC8vLyBBIGxvY2FsIHZhcmlhYmxlIHdpdGhvdXQgYW4gaW5pdGlhbGl6ZXIuCiAgTE9DQUxfV0lUSE9VVF9JTklUSUFMSVpFUiwKCiAgLy8vIEFjY2VzcyB0byBgbG9hZExpYnJhcnlgIG9uIGEgZGVmZXJyZWQgaW1wb3J0LgogIExPQURfTElCUkFSWSwKCiAgLy8vIEEgY2F0Y2ggY2xhdXNlIHdpdGggYSB2YXJpYWJsZSBmb3IgdGhlIHN0YWNrIHRyYWNlLgogIFNUQUNLX1RSQUNFX0lOX0NBVENILAoKICAvLy8gU3RyaW5nIGludGVycG9sYXRpb24uCiAgU1RSSU5HX0lOVEVSUE9MQVRJT04sCgogIC8vLyBTdHJpbmcganV4dGFwb3NpdGlvbi4KICBTVFJJTkdfSlVYVEFQT1NJVElPTiwKCiAgLy8vIEFuIGltcGxpY2l0IGNhbGwgdG8gYHN1cGVyLm5vU3VjaE1ldGhvZGAsIGxpa2UgY2FsbGluZyBhbiB1bnJlc29sdmVkCiAgLy8vIHN1cGVyIG1ldGhvZC4KICBTVVBFUl9OT19TVUNIX01FVEhPRCwKCiAgLy8vIEEgcmVkaXJlY3Rpb24gdG8gdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yLgogIFNZTUJPTF9DT05TVFJVQ1RPUiwKCiAgLy8vIEFuIHN5bmNocm9ub3VzIGZvciBpbiBzdGF0ZW1lbnQsIGxpa2UgYGZvciAodmFyIGUgaW4gaSkge31gLgogIFNZTkNfRk9SX0lOLAoKICAvLy8gQSBtZXRob2Qgd2l0aCBhIGBzeW5jKmAgYm9keSBtb2RpZmllci4KICBTWU5DX1NUQVIsCgogIC8vLyBBIHRocm93IGV4cHJlc3Npb24uCiAgVEhST1dfRVhQUkVTU0lPTiwKCiAgLy8vIEFuIGltcGxpY2l0IHRocm93IG9mIGEgYE5vU3VjaE1ldGhvZEVycm9yYCwgbGlrZSBjYWxsaW5nIGFuIHVucmVzb2x2ZWQKICAvLy8gc3RhdGljIG1ldGhvZC4KICBUSFJPV19OT19TVUNIX01FVEhPRCwKCiAgLy8vIEFuIGltcGxpY2l0IHRocm93IG9mIGEgcnVudGltZSBlcnJvciwgbGlrZSBpbiBhIHJ1bnRpbWUgdHlwZSBjaGVjay4KICBUSFJPV19SVU5USU1FX0VSUk9SLAoKICAvLy8gQW4gaW1wbGljaXQgdGhyb3cgb2YgYSBgVW5zdXBwb3J0ZWRFcnJvcmAsIGxpa2UgY2FsbGluZyBgbmV3CiAgLy8vIGJvb2wuZnJvbUVudmlyb25tZW50YC4KICBUSFJPV19VTlNVUFBPUlRFRF9FUlJPUiwKCiAgLy8vIFRoZSBuZWVkIGZvciBhIHR5cGUgdmFyaWFibGUgYm91bmQgY2hlY2ssIGxpa2UgaW5zdGFudGlhdGlvbiBvZiBhIGdlbmVyaWMKICAvLy8gdHlwZSB3aG9zZSB0eXBlIHZhcmlhYmxlIGhhdmUgbm9uLXRyaXZpYWwgYm91bmRzLgogIFRZUEVfVkFSSUFCTEVfQk9VTkRTX0NIRUNLLAp9CgovLy8gRGVzY3JpYmVzIGEgdXNlIG9mIGEgbWFwIGxpdGVyYWwgaW4gdGhlIHByb2dyYW0uCmNsYXNzIE1hcExpdGVyYWxVc2UgewogIGZpbmFsIEludGVyZmFjZVR5cGUgdHlwZTsKICBmaW5hbCBib29sIGlzQ29uc3RhbnQ7CiAgZmluYWwgYm9vbCBpc0VtcHR5OwoKICBNYXBMaXRlcmFsVXNlKHRoaXMudHlwZSwge3RoaXMuaXNDb25zdGFudDogZmFsc2UsIHRoaXMuaXNFbXB0eTogZmFsc2V9KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gdHlwZS5oYXNoQ29kZSAqIDEzICsKICAgICAgICBpc0NvbnN0YW50Lmhhc2hDb2RlICogMTcgKwogICAgICAgIGlzRW1wdHkuaGFzaENvZGUgKiAxOTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgTWFwTGl0ZXJhbFVzZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHR5cGUgPT0gb3RoZXIudHlwZSAmJgogICAgICAgIGlzQ29uc3RhbnQgPT0gb3RoZXIuaXNDb25zdGFudCAmJgogICAgICAgIGlzRW1wdHkgPT0gb3RoZXIuaXNFbXB0eTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnTWFwTGl0ZXJhbFVzZSgkdHlwZSxpc0NvbnN0YW50OiRpc0NvbnN0YW50LGlzRW1wdHk6JGlzRW1wdHkpJzsKICB9Cn0KCi8vLyBEZXNjcmliZXMgYSB1c2Ugb2YgYSBzZXQgbGl0ZXJhbCBpbiB0aGUgcHJvZ3JhbS4KY2xhc3MgU2V0TGl0ZXJhbFVzZSB7CiAgZmluYWwgSW50ZXJmYWNlVHlwZSB0eXBlOwogIGZpbmFsIGJvb2wgaXNDb25zdGFudDsKICBmaW5hbCBib29sIGlzRW1wdHk7CgogIFNldExpdGVyYWxVc2UodGhpcy50eXBlLCB7dGhpcy5pc0NvbnN0YW50OiBmYWxzZSwgdGhpcy5pc0VtcHR5OiBmYWxzZX0pOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+CiAgICAgIHR5cGUuaGFzaENvZGUgKiAxMyArIGlzQ29uc3RhbnQuaGFzaENvZGUgKiAxNyArIGlzRW1wdHkuaGFzaENvZGUgKiAxOTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBTZXRMaXRlcmFsVXNlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHlwZSA9PSBvdGhlci50eXBlICYmCiAgICAgICAgaXNDb25zdGFudCA9PSBvdGhlci5pc0NvbnN0YW50ICYmCiAgICAgICAgaXNFbXB0eSA9PSBvdGhlci5pc0VtcHR5OwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJ1NldExpdGVyYWxVc2UoJHR5cGUsaXNDb25zdGFudDokaXNDb25zdGFudCxpc0VtcHR5OiRpc0VtcHR5KSc7Cn0KCi8vLyBEZXNjcmliZXMgdGhlIHVzZSBvZiBhIGxpc3QgbGl0ZXJhbCBpbiB0aGUgcHJvZ3JhbS4KY2xhc3MgTGlzdExpdGVyYWxVc2UgewogIGZpbmFsIEludGVyZmFjZVR5cGUgdHlwZTsKICBmaW5hbCBib29sIGlzQ29uc3RhbnQ7CiAgZmluYWwgYm9vbCBpc0VtcHR5OwoKICBMaXN0TGl0ZXJhbFVzZSh0aGlzLnR5cGUsIHt0aGlzLmlzQ29uc3RhbnQ6IGZhbHNlLCB0aGlzLmlzRW1wdHk6IGZhbHNlfSk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIHR5cGUuaGFzaENvZGUgKiAxMyArCiAgICAgICAgaXNDb25zdGFudC5oYXNoQ29kZSAqIDE3ICsKICAgICAgICBpc0VtcHR5Lmhhc2hDb2RlICogMTk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIExpc3RMaXRlcmFsVXNlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHlwZSA9PSBvdGhlci50eXBlICYmCiAgICAgICAgaXNDb25zdGFudCA9PSBvdGhlci5pc0NvbnN0YW50ICYmCiAgICAgICAgaXNFbXB0eSA9PSBvdGhlci5pc0VtcHR5OwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdMaXN0TGl0ZXJhbFVzZSgkdHlwZSxpc0NvbnN0YW50OiRpc0NvbnN0YW50LGlzRW1wdHk6JGlzRW1wdHkpJzsKICB9Cn0KCi8vLyBBIHVzZSBvZiBgT2JqZWN0LnJ1bnRpbWVUeXBlYC4KY2xhc3MgUnVudGltZVR5cGVVc2UgewogIC8vLyBUaGUgdXNlIGtpbmQgb2YgYE9iamVjdC5ydW50aW1lVHlwZWAuCiAgZmluYWwgUnVudGltZVR5cGVVc2VLaW5kIGtpbmQ7CgogIC8vLyBUaGUgc3RhdGljIHR5cGUgb2YgdGhlIHJlY2VpdmVyLgogIGZpbmFsIERhcnRUeXBlIHJlY2VpdmVyVHlwZTsKCiAgLy8vIFRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgYXJndW1lbnQgaWYgW2tpbmRdIGlzIGBSdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzYC4KICBmaW5hbCBEYXJ0VHlwZSBhcmd1bWVudFR5cGU7CgogIFJ1bnRpbWVUeXBlVXNlKHRoaXMua2luZCwgdGhpcy5yZWNlaXZlclR5cGUsIHRoaXMuYXJndW1lbnRUeXBlKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PgogICAgICBraW5kLmhhc2hDb2RlICogMTMgKwogICAgICByZWNlaXZlclR5cGUuaGFzaENvZGUgKiAxNyArCiAgICAgIGFyZ3VtZW50VHlwZS5oYXNoQ29kZSAqIDE5OwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIFJ1bnRpbWVUeXBlVXNlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4ga2luZCA9PSBvdGhlci5raW5kICYmCiAgICAgICAgcmVjZWl2ZXJUeXBlID09IG90aGVyLnJlY2VpdmVyVHlwZSAmJgogICAgICAgIGFyZ3VtZW50VHlwZSA9PSBvdGhlci5hcmd1bWVudFR5cGU7CiAgfQoKICAvLy8gU2hvcnQgdGV4dHVhbCByZXByZXNlbnRhdGlvbiB1c2UgZm9yIHRlc3RpbmcuCiAgU3RyaW5nIGdldCBzaG9ydFRleHQgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgUnVudGltZVR5cGVVc2VLaW5kLnN0cmluZzoKICAgICAgICBzYi53cml0ZSgnc3RyaW5nOicpOwogICAgICAgIHNiLndyaXRlKHJlY2VpdmVyVHlwZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgUnVudGltZVR5cGVVc2VLaW5kLmVxdWFsczoKICAgICAgICBzYi53cml0ZSgnZXF1YWxzOicpOwogICAgICAgIHNiLndyaXRlKHJlY2VpdmVyVHlwZSk7CiAgICAgICAgc2Iud3JpdGUoJy8nKTsKICAgICAgICBzYi53cml0ZShhcmd1bWVudFR5cGUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFJ1bnRpbWVUeXBlVXNlS2luZC51bmtub3duOgogICAgICAgIHNiLndyaXRlKCd1bmtub3duOicpOwogICAgICAgIHNiLndyaXRlKHJlY2VpdmVyVHlwZSk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdSdW50aW1lVHlwZVVzZShraW5kPSRraW5kLHJlY2VpdmVyPSRyZWNlaXZlclR5cGUnCiAgICAgICcsYXJndW1lbnQ9JGFyZ3VtZW50VHlwZSknOwp9CgovLy8gQSBnZW5lcmljIGluc3RhbnRpYXRpb24gb2YgYW4gZXhwcmVzc2lvbiBvZiB0eXBlIFtmdW5jdGlvblR5cGVdIHdpdGggdGhlCi8vLyBnaXZlbiBbdHlwZUFyZ3VtZW50c10uCmNsYXNzIEdlbmVyaWNJbnN0YW50aWF0aW9uIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdnZW5lcmljLWluc3RhbnRpYXRpb24nOwoKICAvLy8gVGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBpbnN0YW50aWF0ZWQgZXhwcmVzc2lvbi4KICBmaW5hbCBEYXJ0VHlwZSBmdW5jdGlvblR5cGU7CgogIC8vLyBUaGUgdHlwZSBhcmd1bWVudHMgb2YgdGhlIGluc3RhbnRpYXRpb24uCiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgR2VuZXJpY0luc3RhbnRpYXRpb24odGhpcy5mdW5jdGlvblR5cGUsIHRoaXMudHlwZUFyZ3VtZW50cyk7CgogIGZhY3RvcnkgR2VuZXJpY0luc3RhbnRpYXRpb24ucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIERhcnRUeXBlIGZ1bmN0aW9uVHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGUoKTsKICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBzb3VyY2UucmVhZERhcnRUeXBlcygpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBHZW5lcmljSW5zdGFudGlhdGlvbihmdW5jdGlvblR5cGUsIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZURhcnRUeXBlKGZ1bmN0aW9uVHlwZSk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVzKHR5cGVBcmd1bWVudHMpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIC8vLyBTaG9ydCB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIHVzZSBmb3IgdGVzdGluZy4KICBTdHJpbmcgZ2V0IHNob3J0VGV4dCA9PiAnPCR7dHlwZUFyZ3VtZW50cy5qb2luKCcsJyl9Pic7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4KICAgICAgSGFzaGluZy5saXN0SGFzaCh0eXBlQXJndW1lbnRzLCBIYXNoaW5nLm9iamVjdEhhc2goZnVuY3Rpb25UeXBlKSk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgR2VuZXJpY0luc3RhbnRpYXRpb24pIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBmdW5jdGlvblR5cGUgPT0gb3RoZXIuZnVuY3Rpb25UeXBlICYmCiAgICAgICAgZXF1YWxFbGVtZW50cyh0eXBlQXJndW1lbnRzLCBvdGhlci50eXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnR2VuZXJpY0luc3RhbnRpYXRpb24oZnVuY3Rpb25UeXBlOiRmdW5jdGlvblR5cGUsJwogICAgICAgICd0eXBlQXJndW1lbnRzOiR0eXBlQXJndW1lbnRzKSc7CiAgfQp9CoEfACtPTk0oBE85IwEhKy4cATg9D0QgASsKASoXAS4JAUkQAS8OARkTAScWASYdATYOAS8dATQQAToYARwYARwYAUsUGAExFgFDDwEtDQEaFAFNFRgBShcBQx0bAVA4HgIBNRYcGRYBSwEMFSAjHwQBDBwtLyEqIgQBDBZLBAIBNRYcGRYBSwEMFk0BDBwtLyEqIgQBDBdGAgE4FxwZFgFMAQwVICMfBAEMHC0wISoiBAEMFkwEAgEjFywhAScfAVAfAUMBDBYbIyIBDBwtMCEuLAQBNBkqFCYdIA8mHSAXIA8nHiAPBhoEAQxKIgIBTRsdNQE2HwEvJgE/AUcXMzsVQgQBKBUmKBMEATQ6AQwWSQEMHC02MTsEAQwWPikEAgEqcGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvZmVhdHVyZS5kYXJ0L3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3VuaXZlcnNlL3VzZS5kYXJ0wAB2nS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gVGhpcyBsaWJyYXJ5IGRlZmluZXMgaW5kaXZpZHVhbCB3b3JsZCBpbXBhY3RzLgovLy8KLy8vIFdlIGNhbGwgdGhlc2UgYnVpbGRpbmcgYmxvY2tzIGB1c2VzYC4gRWFjaCBgdXNlYCBpcyBhIHNpbmdsZSBpbXBhY3Qgb2YgdGhlCi8vLyB3b3JsZC4gU29tZSBleGFtcGxlIHVzZXMgYXJlOgovLy8KLy8vICAqIGFuIGludm9jYXRpb24gb2YgYSB0b3AgbGV2ZWwgZnVuY3Rpb24KLy8vICAqIGEgY2FsbCB0byB0aGUgYGZvbygpYCBtZXRob2Qgb24gYW4gdW5rbm93biBjbGFzcy4KLy8vICAqIGFuIGluc3RhbnRpYXRpb24gb2YgY2xhc3MgVAovLy8KLy8vIFRoZSBkaWZmZXJlbnQgY29tcGlsZXIgc3RhZ2VzIGNvbWJpbmUgdGhlc2UgdXNlcyBpbnRvIGBXb3JsZEltcGFjdGAgb2JqZWN0cywKLy8vIHdoaWNoIGFyZSBsYXRlciB1c2VkIHRvIGNvbnN0cnVjdCBhIGNsb3NlZC13b3JsZCB1bmRlcnN0YW5kaW5nIG9mIHRoZQovLy8gcHJvZ3JhbS4KbGlicmFyeSBkYXJ0MmpzLnVuaXZlcnNlLnVzZTsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9jbG9zdXJlLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JyBzaG93IGVxdWFsRWxlbWVudHMsIEhhc2hpbmc7CmltcG9ydCAnY2FsbF9zdHJ1Y3R1cmUuZGFydCcgc2hvdyBDYWxsU3RydWN0dXJlOwppbXBvcnQgJ3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnd29ybGRfYnVpbGRlci5kYXJ0JyBzaG93IFN0cm9uZ01vZGVDb25zdHJhaW50OwoKZW51bSBEeW5hbWljVXNlS2luZCB7CiAgSU5WT0tFLAogIEdFVCwKICBTRVQsCn0KCi8vLyBUaGUgdXNlIG9mIGEgZHluYW1pYyBwcm9wZXJ0eS4gW3NlbGVjdG9yXSBkZWZpbmVkIHRoZSBuYW1lIGFuZCBraW5kIG9mIHRoZQovLy8gcHJvcGVydHkgYW5kIFtyZWNlaXZlckNvbnN0cmFpbnRdIGRlZmluZXMgdGhlIGtub3duIGNvbnN0cmFpbnQgZm9yIHRoZQovLy8gb2JqZWN0IG9uIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBhY2Nlc3NlZC4KY2xhc3MgRHluYW1pY1VzZSB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnZHluYW1pYy11c2UnOwoKICBmaW5hbCBTZWxlY3RvciBzZWxlY3RvcjsKICBmaW5hbCBPYmplY3QgcmVjZWl2ZXJDb25zdHJhaW50OwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IF90eXBlQXJndW1lbnRzOwoKICBEeW5hbWljVXNlKHRoaXMuc2VsZWN0b3IsIHRoaXMucmVjZWl2ZXJDb25zdHJhaW50LCB0aGlzLl90eXBlQXJndW1lbnRzKSB7CiAgICBhc3NlcnQoCiAgICAgICAgc2VsZWN0b3IuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudCA9PQogICAgICAgICAgICAoX3R5cGVBcmd1bWVudHM/Lmxlbmd0aCA/PyAwKSwKICAgICAgICAiVHlwZSBhcmd1bWVudCBjb3VudCBtaXNtYXRjaC4gU2VsZWN0b3IgaGFzICIKICAgICAgICAiJHtzZWxlY3Rvci5jYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudENvdW50fSBidXQgIgogICAgICAgICIke190eXBlQXJndW1lbnRzPy5sZW5ndGggPz8gMH0gd2VyZSBwYXNzZWQuIik7CiAgfQoKICBmYWN0b3J5IER5bmFtaWNVc2UucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gU2VsZWN0b3IucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBib29sIGhhc0NvbnN0cmFpbnQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIE9iamVjdCByZWNlaXZlckNvbnN0cmFpbnQ7CiAgICBpZiAoaGFzQ29uc3RyYWludCkgewogICAgICByZWNlaXZlckNvbnN0cmFpbnQgPSBzb3VyY2UucmVhZEFic3RyYWN0VmFsdWUoKTsKICAgIH0KICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBzb3VyY2UucmVhZERhcnRUeXBlcyhlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IER5bmFtaWNVc2Uoc2VsZWN0b3IsIHJlY2VpdmVyQ29uc3RyYWludCwgdHlwZUFyZ3VtZW50cyk7CiAgfQoKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzZWxlY3Rvci53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLndyaXRlQm9vbChyZWNlaXZlckNvbnN0cmFpbnQgIT0gbnVsbCk7CiAgICBpZiAocmVjZWl2ZXJDb25zdHJhaW50ICE9IG51bGwpIHsKICAgICAgaWYgKHJlY2VpdmVyQ29uc3RyYWludCBpcyBBYnN0cmFjdFZhbHVlKSB7CiAgICAgICAgc2luay53cml0ZUFic3RyYWN0VmFsdWUocmVjZWl2ZXJDb25zdHJhaW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHJlY2VpdmVyIGNvbnN0cmFpbnQ6ICR7cmVjZWl2ZXJDb25zdHJhaW50fSIpOwogICAgICB9CiAgICB9CiAgICBzaW5rLndyaXRlRGFydFR5cGVzKF90eXBlQXJndW1lbnRzLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIC8vLyBTaG9ydCB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIHVzZSBmb3IgdGVzdGluZy4KICBTdHJpbmcgZ2V0IHNob3J0VGV4dCB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBpZiAocmVjZWl2ZXJDb25zdHJhaW50ICE9IG51bGwpIHsKICAgICAgdmFyIGNvbnN0cmFpbnQgPSByZWNlaXZlckNvbnN0cmFpbnQ7CiAgICAgIGlmIChjb25zdHJhaW50IGlzIFN0cm9uZ01vZGVDb25zdHJhaW50KSB7CiAgICAgICAgaWYgKGNvbnN0cmFpbnQuaXNUaGlzKSB7CiAgICAgICAgICBzYi53cml0ZSgndGhpczonKTsKICAgICAgICB9IGVsc2UgaWYgKGNvbnN0cmFpbnQuaXNFeGFjdCkgewogICAgICAgICAgc2Iud3JpdGUoJ2V4YWN0OicpOwogICAgICAgIH0KICAgICAgICBzYi53cml0ZShjb25zdHJhaW50LmNscy5uYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzYi53cml0ZShjb25zdHJhaW50KTsKICAgICAgfQogICAgICBzYi53cml0ZSgnLicpOwogICAgfQogICAgc2Iud3JpdGUoc2VsZWN0b3IubmFtZSk7CiAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsICYmIHR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICBzYi53cml0ZSgnPCcpOwogICAgICBzYi53cml0ZSh0eXBlQXJndW1lbnRzLmpvaW4oJywnKSk7CiAgICAgIHNiLndyaXRlKCc+Jyk7CiAgICB9CiAgICBpZiAoc2VsZWN0b3IuaXNDYWxsKSB7CiAgICAgIHNiLndyaXRlKHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUuc2hvcnRUZXh0KTsKICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNTZXR0ZXIpIHsKICAgICAgc2Iud3JpdGUoJz0nKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgRHluYW1pY1VzZUtpbmQgZ2V0IGtpbmQgewogICAgaWYgKHNlbGVjdG9yLmlzR2V0dGVyKSB7CiAgICAgIHJldHVybiBEeW5hbWljVXNlS2luZC5HRVQ7CiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmlzU2V0dGVyKSB7CiAgICAgIHJldHVybiBEeW5hbWljVXNlS2luZC5TRVQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gRHluYW1pY1VzZUtpbmQuSU5WT0tFOwogICAgfQogIH0KCiAgTGlzdDxEYXJ0VHlwZT4gZ2V0IHR5cGVBcmd1bWVudHMgPT4gX3R5cGVBcmd1bWVudHMgPz8gY29uc3QgPERhcnRUeXBlPltdOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IEhhc2hpbmcubGlzdEhhc2goCiAgICAgIHR5cGVBcmd1bWVudHMsIEhhc2hpbmcub2JqZWN0c0hhc2goc2VsZWN0b3IsIHJlY2VpdmVyQ29uc3RyYWludCkpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIER5bmFtaWNVc2UpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBzZWxlY3RvciA9PSBvdGhlci5zZWxlY3RvciAmJgogICAgICAgIHJlY2VpdmVyQ29uc3RyYWludCA9PSBvdGhlci5yZWNlaXZlckNvbnN0cmFpbnQgJiYKICAgICAgICBlcXVhbEVsZW1lbnRzKHR5cGVBcmd1bWVudHMsIG90aGVyLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRzZWxlY3RvciwkcmVjZWl2ZXJDb25zdHJhaW50LCR0eXBlQXJndW1lbnRzJzsKfQoKZW51bSBTdGF0aWNVc2VLaW5kIHsKICBTVEFUSUNfVEVBUl9PRkYsCiAgU1VQRVJfVEVBUl9PRkYsCiAgU1VQRVJfRklFTERfU0VULAogIFNVUEVSX0dFVCwKICBTVVBFUl9TRVRURVJfU0VULAogIFNVUEVSX0lOVk9LRSwKICBJTlNUQU5DRV9GSUVMRF9HRVQsCiAgSU5TVEFOQ0VfRklFTERfU0VULAogIENMT1NVUkUsCiAgQ0xPU1VSRV9DQUxMLAogIENBTExfTUVUSE9ELAogIENPTlNUUlVDVE9SX0lOVk9LRSwKICBDT05TVF9DT05TVFJVQ1RPUl9JTlZPS0UsCiAgRElSRUNUX0lOVk9LRSwKICBJTkxJTklORywKICBTVEFUSUNfSU5WT0tFLAogIFNUQVRJQ19HRVQsCiAgU1RBVElDX1NFVCwKICBGSUVMRF9JTklULAogIEZJRUxEX0NPTlNUQU5UX0lOSVQsCn0KCi8vLyBTdGF0aWNhbGx5IGtub3duIHVzZSBvZiBhbiBbRW50aXR5XS4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ3JlYXRlIGJhY2tlbmQtc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIHdpdGggYmV0dGVyCi8vIGludmFyaWFudHMuCmNsYXNzIFN0YXRpY1VzZSB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnc3RhdGljLXVzZSc7CgogIGZpbmFsIEVudGl0eSBlbGVtZW50OwogIGZpbmFsIFN0YXRpY1VzZUtpbmQga2luZDsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGU7CiAgZmluYWwgSW50ZXJmYWNlVHlwZSB0eXBlOwogIGZpbmFsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZTsKICBmaW5hbCBJbXBvcnRFbnRpdHkgZGVmZXJyZWRJbXBvcnQ7CiAgZmluYWwgQ29uc3RhbnRWYWx1ZSBjb25zdGFudDsKICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwoKICBTdGF0aWNVc2UuaW50ZXJuYWwoRW50aXR5IGVsZW1lbnQsIHRoaXMua2luZCwKICAgICAge3RoaXMudHlwZSwKICAgICAgdGhpcy5jYWxsU3RydWN0dXJlLAogICAgICB0aGlzLmRlZmVycmVkSW1wb3J0LAogICAgICB0aGlzLnR5cGVBcmd1bWVudHMsCiAgICAgIHRoaXMuY29uc3RhbnR9KQogICAgICA6IHRoaXMuZWxlbWVudCA9IGVsZW1lbnQsCiAgICAgICAgdGhpcy5oYXNoQ29kZSA9IEhhc2hpbmcubGlzdEhhc2goWwogICAgICAgICAgZWxlbWVudCwKICAgICAgICAgIGtpbmQsCiAgICAgICAgICB0eXBlLAogICAgICAgICAgSGFzaGluZy5saXN0SGFzaCh0eXBlQXJndW1lbnRzKSwKICAgICAgICAgIGNhbGxTdHJ1Y3R1cmUsCiAgICAgICAgICBkZWZlcnJlZEltcG9ydCwKICAgICAgICAgIGNvbnN0YW50CiAgICAgICAgXSk7CgogIGJvb2wgX2NoZWNrR2VuZXJpY0ludmFyaWFudHMoKSB7CiAgICBhc3NlcnQoCiAgICAgICAgKGNhbGxTdHJ1Y3R1cmU/LnR5cGVBcmd1bWVudENvdW50ID8/IDApID09ICh0eXBlQXJndW1lbnRzPy5sZW5ndGggPz8gMCksCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICJUeXBlIGFyZ3VtZW50IGNvdW50IG1pc21hdGNoLiBDYWxsIHN0cnVjdHVyZSBoYXMgIgogICAgICAgICAgICAiJHtjYWxsU3RydWN0dXJlPy50eXBlQXJndW1lbnRDb3VudCA/PyAwfSBidXQgIgogICAgICAgICAgICAiJHt0eXBlQXJndW1lbnRzPy5sZW5ndGggPz8gMH0gd2VyZSBwYXNzZWQgaW4gJHRoaXMuIikpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmYWN0b3J5IFN0YXRpY1VzZS5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgTWVtYmVyRW50aXR5IGVsZW1lbnQgPSBzb3VyY2UucmVhZE1lbWJlcigpOwogICAgU3RhdGljVXNlS2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKFN0YXRpY1VzZUtpbmQudmFsdWVzKTsKICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGUoYWxsb3dOdWxsOiB0cnVlKTsKICAgIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9CiAgICAgICAgc291cmNlLnJlYWRWYWx1ZU9yTnVsbCgoKSA9PiBDYWxsU3RydWN0dXJlLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpKTsKICAgIEltcG9ydEVudGl0eSBkZWZlcnJlZEltcG9ydCA9IHNvdXJjZS5yZWFkSW1wb3J0T3JOdWxsKCk7CiAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gc291cmNlLnJlYWRDb25zdGFudE9yTnVsbCgpOwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IHNvdXJjZS5yZWFkRGFydFR5cGVzKGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIGtpbmQsCiAgICAgICAgdHlwZTogdHlwZSwKICAgICAgICBjYWxsU3RydWN0dXJlOiBjYWxsU3RydWN0dXJlLAogICAgICAgIGRlZmVycmVkSW1wb3J0OiBkZWZlcnJlZEltcG9ydCwKICAgICAgICBjb25zdGFudDogY29uc3RhbnQsCiAgICAgICAgdHlwZUFyZ3VtZW50czogdHlwZUFyZ3VtZW50cyk7CiAgfQoKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBhc3NlcnQoZWxlbWVudCBpcyBNZW1iZXJFbnRpdHksICJVbnN1cHBvcnRlZCBlbnRpdHk6ICRlbGVtZW50Iik7CiAgICBzaW5rLndyaXRlTWVtYmVyKGVsZW1lbnQpOwogICAgc2luay53cml0ZUVudW0oa2luZCk7CiAgICBzaW5rLndyaXRlRGFydFR5cGUodHlwZSwgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVWYWx1ZU9yTnVsbCgKICAgICAgICBjYWxsU3RydWN0dXJlLCAoQ2FsbFN0cnVjdHVyZSBjKSA9PiBjLndyaXRlVG9EYXRhU2luayhzaW5rKSk7CiAgICBzaW5rLndyaXRlSW1wb3J0T3JOdWxsKGRlZmVycmVkSW1wb3J0KTsKICAgIHNpbmsud3JpdGVDb25zdGFudE9yTnVsbChjb25zdGFudCk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVzKHR5cGVBcmd1bWVudHMsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgLy8vIFNob3J0IHRleHR1YWwgcmVwcmVzZW50YXRpb24gdXNlIGZvciB0ZXN0aW5nLgogIFN0cmluZyBnZXQgc2hvcnRUZXh0IHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuSU5TVEFOQ0VfRklFTERfU0VUOgogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuU1VQRVJfRklFTERfU0VUOgogICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuU1VQRVJfU0VUVEVSX1NFVDoKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNUQVRJQ19TRVQ6CiAgICAgICAgc2Iud3JpdGUoJ3NldDonKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkZJRUxEX0lOSVQ6CiAgICAgICAgc2Iud3JpdGUoJ2luaXQ6Jyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DTE9TVVJFOgogICAgICAgIHNiLndyaXRlKCdkZWY6Jyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICB9CiAgICBpZiAoZWxlbWVudCBpcyBNZW1iZXJFbnRpdHkpIHsKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IGVsZW1lbnQ7CiAgICAgIGlmIChtZW1iZXIuZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICAgIHNiLndyaXRlKG1lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lKTsKICAgICAgICBzYi53cml0ZSgnLicpOwogICAgICB9CiAgICB9CiAgICBpZiAoZWxlbWVudC5uYW1lID09IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJzxhbm9ueW1vdXM+Jyk7CiAgICB9IGVsc2UgewogICAgICBzYi53cml0ZShlbGVtZW50Lm5hbWUpOwogICAgfQogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCAmJiB0eXBlQXJndW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgc2Iud3JpdGUoJzwnKTsKICAgICAgc2Iud3JpdGUodHlwZUFyZ3VtZW50cy5qb2luKCcsJykpOwogICAgICBzYi53cml0ZSgnPicpOwogICAgfQogICAgaWYgKGNhbGxTdHJ1Y3R1cmUgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgnKCcpOwogICAgICBzYi53cml0ZShjYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudENvdW50KTsKICAgICAgaWYgKGNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudENvdW50ID4gMCkgewogICAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgICAgc2Iud3JpdGUoY2FsbFN0cnVjdHVyZS5nZXRPcmRlcmVkTmFtZWRBcmd1bWVudHMoKS5qb2luKCcsJykpOwogICAgICB9CiAgICAgIHNiLndyaXRlKCcpJyk7CiAgICB9CiAgICBpZiAoZGVmZXJyZWRJbXBvcnQgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgneycpOwogICAgICBzYi53cml0ZShkZWZlcnJlZEltcG9ydC5uYW1lKTsKICAgICAgc2Iud3JpdGUoJ30nKTsKICAgIH0KICAgIGlmIChjb25zdGFudCAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCc9Jyk7CiAgICAgIHNiLndyaXRlKGNvbnN0YW50LnRvU3RydWN0dXJlZFRleHQoKSk7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIC8vLyBJbnZvY2F0aW9uIG9mIGEgc3RhdGljIG9yIHRvcC1sZXZlbCBbZWxlbWVudF0gd2l0aCB0aGUgZ2l2ZW4KICAvLy8gW2NhbGxTdHJ1Y3R1cmVdLgogIGZhY3RvcnkgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlLAogICAgICBbTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywgSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0XSkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNTdGF0aWMgfHwgZWxlbWVudC5pc1RvcExldmVsLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiU3RhdGljIGludm9rZSBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYSB0b3AtbGV2ZWwgIgogICAgICAgICAgICAib3Igc3RhdGljIG1ldGhvZC4iKSk7CiAgICBhc3NlcnQoZWxlbWVudC5pc0Z1bmN0aW9uLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICJTdGF0aWMgZ2V0IGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpKTsKICAgIGFzc2VydCgKICAgICAgICBjYWxsU3RydWN0dXJlICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoZWxlbWVudCwKICAgICAgICAgICAgIk5vdCBDYWxsU3RydWN0dXJlIGZvciBzdGF0aWMgaW52b2NhdGlvbiBvZiBlbGVtZW50ICRlbGVtZW50LiIpKTsKCiAgICBTdGF0aWNVc2Ugc3RhdGljVXNlID0gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbCgKICAgICAgICBlbGVtZW50LCBTdGF0aWNVc2VLaW5kLlNUQVRJQ19JTlZPS0UsCiAgICAgICAgY2FsbFN0cnVjdHVyZTogY2FsbFN0cnVjdHVyZSwKICAgICAgICB0eXBlQXJndW1lbnRzOiB0eXBlQXJndW1lbnRzLAogICAgICAgIGRlZmVycmVkSW1wb3J0OiBkZWZlcnJlZEltcG9ydCk7CiAgICBhc3NlcnQoc3RhdGljVXNlLl9jaGVja0dlbmVyaWNJbnZhcmlhbnRzKCkpOwogICAgcmV0dXJuIHN0YXRpY1VzZTsKICB9CgogIC8vLyBDbG9zdXJpemF0aW9uIG9mIGEgc3RhdGljIG9yIHRvcC1sZXZlbCBmdW5jdGlvbiBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2Uuc3RhdGljVGVhck9mZihGdW5jdGlvbkVudGl0eSBlbGVtZW50LAogICAgICBbSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0XSkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNTdGF0aWMgfHwgZWxlbWVudC5pc1RvcExldmVsLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiU3RhdGljIHRlYXItb2ZmIGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhIHRvcC1sZXZlbCAiCiAgICAgICAgICAgICJvciBzdGF0aWMgbWV0aG9kLiIpKTsKICAgIGFzc2VydChlbGVtZW50LmlzRnVuY3Rpb24sCiAgICAgICAgZmFpbGVkQXQoZWxlbWVudCwgIlN0YXRpYyBnZXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgZnVuY3Rpb24uIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5TVEFUSUNfVEVBUl9PRkYsCiAgICAgICAgZGVmZXJyZWRJbXBvcnQ6IGRlZmVycmVkSW1wb3J0KTsKICB9CgogIC8vLyBSZWFkIGFjY2VzcyBvZiBhIHN0YXRpYyBvciB0b3AtbGV2ZWwgZmllbGQgb3IgZ2V0dGVyIFtlbGVtZW50XS4KICBmYWN0b3J5IFN0YXRpY1VzZS5zdGF0aWNHZXQoTWVtYmVyRW50aXR5IGVsZW1lbnQsCiAgICAgIFtJbXBvcnRFbnRpdHkgZGVmZXJyZWRJbXBvcnRdKSB7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc1N0YXRpYyB8fCBlbGVtZW50LmlzVG9wTGV2ZWwsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICJTdGF0aWMgZ2V0IGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhIHRvcC1sZXZlbCAiCiAgICAgICAgICAgICJvciBzdGF0aWMgZmllbGQgb3IgZ2V0dGVyLiIpKTsKICAgIGFzc2VydCgKICAgICAgICBlbGVtZW50LmlzRmllbGQgfHwgZWxlbWVudC5pc0dldHRlciwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LAogICAgICAgICAgICAiU3RhdGljIGdldCBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYSBmaWVsZCBvciBhIGdldHRlci4iKSk7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLlNUQVRJQ19HRVQsCiAgICAgICAgZGVmZXJyZWRJbXBvcnQ6IGRlZmVycmVkSW1wb3J0KTsKICB9CgogIC8vLyBXcml0ZSBhY2Nlc3Mgb2YgYSBzdGF0aWMgb3IgdG9wLWxldmVsIGZpZWxkIG9yIHNldHRlciBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2Uuc3RhdGljU2V0KE1lbWJlckVudGl0eSBlbGVtZW50LAogICAgICBbSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0XSkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNTdGF0aWMgfHwgZWxlbWVudC5pc1RvcExldmVsLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiU3RhdGljIHNldCBlbGVtZW50ICRlbGVtZW50ICIKICAgICAgICAgICAgIm11c3QgYmUgYSB0b3AtbGV2ZWwgb3Igc3RhdGljIG1ldGhvZC4iKSk7CiAgICBhc3NlcnQoCiAgICAgICAgKGVsZW1lbnQuaXNGaWVsZCAmJiBlbGVtZW50LmlzQXNzaWduYWJsZSkgfHwgZWxlbWVudC5pc1NldHRlciwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LAogICAgICAgICAgICAiU3RhdGljIHNldCBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYSBmaWVsZCBvciBhIHNldHRlci4iKSk7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLlNUQVRJQ19TRVQsCiAgICAgICAgZGVmZXJyZWRJbXBvcnQ6IGRlZmVycmVkSW1wb3J0KTsKICB9CgogIC8vLyBJbnZvY2F0aW9uIG9mIHRoZSBsYXp5IGluaXRpYWxpemVyIGZvciBhIHN0YXRpYyBvciB0b3AtbGV2ZWwgZmllbGQKICAvLy8gW2VsZW1lbnRdLgogIGZhY3RvcnkgU3RhdGljVXNlLnN0YXRpY0luaXQoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNTdGF0aWMgfHwgZWxlbWVudC5pc1RvcExldmVsLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiU3RhdGljIGluaXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgdG9wLWxldmVsICIKICAgICAgICAgICAgIm9yIHN0YXRpYyBtZXRob2QuIikpOwogICAgYXNzZXJ0KGVsZW1lbnQuaXNGaWVsZCwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LCAiU3RhdGljIGluaXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgZmllbGQuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5GSUVMRF9JTklUKTsKICB9CgogIC8vLyBJbnZvY2F0aW9uIG9mIGEgc3VwZXIgbWV0aG9kIFtlbGVtZW50XSB3aXRoIHRoZSBnaXZlbiBbY2FsbFN0cnVjdHVyZV0uCiAgZmFjdG9yeSBTdGF0aWNVc2Uuc3VwZXJJbnZva2UoCiAgICAgIEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSwKICAgICAgW0xpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHNdKSB7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsCiAgICAgICAgICAgICJTdXBlciBpbnZva2UgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG1ldGhvZC4iKSk7CiAgICBhc3NlcnQoCiAgICAgICAgY2FsbFN0cnVjdHVyZSAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsCiAgICAgICAgICAgICJOb3QgQ2FsbFN0cnVjdHVyZSBmb3Igc3VwZXIgaW52b2NhdGlvbiBvZiBlbGVtZW50ICRlbGVtZW50LiIpKTsKICAgIFN0YXRpY1VzZSBzdGF0aWNVc2UgPSBuZXcgU3RhdGljVXNlLmludGVybmFsKAogICAgICAgIGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuU1VQRVJfSU5WT0tFLAogICAgICAgIGNhbGxTdHJ1Y3R1cmU6IGNhbGxTdHJ1Y3R1cmUsIHR5cGVBcmd1bWVudHM6IHR5cGVBcmd1bWVudHMpOwogICAgYXNzZXJ0KHN0YXRpY1VzZS5fY2hlY2tHZW5lcmljSW52YXJpYW50cygpKTsKICAgIHJldHVybiBzdGF0aWNVc2U7CiAgfQoKICAvLy8gUmVhZCBhY2Nlc3Mgb2YgYSBzdXBlciBmaWVsZCBvciBnZXR0ZXIgW2VsZW1lbnRdLgogIGZhY3RvcnkgU3RhdGljVXNlLnN1cGVyR2V0KE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LCAiU3VwZXIgZ2V0IGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBtZXRob2QuIikpOwogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNGaWVsZCB8fCBlbGVtZW50LmlzR2V0dGVyLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsCiAgICAgICAgICAgICJTdXBlciBnZXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgZmllbGQgb3IgYSBnZXR0ZXIuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5TVVBFUl9HRVQpOwogIH0KCiAgLy8vIFdyaXRlIGFjY2VzcyBvZiBhIHN1cGVyIGZpZWxkIFtlbGVtZW50XS4KICBmYWN0b3J5IFN0YXRpY1VzZS5zdXBlckZpZWxkU2V0KEZpZWxkRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydCgKICAgICAgICBlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsICJTdXBlciBzZXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG1ldGhvZC4iKSk7CiAgICBhc3NlcnQoZWxlbWVudC5pc0ZpZWxkLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICJTdXBlciBzZXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgZmllbGQuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5TVVBFUl9GSUVMRF9TRVQpOwogIH0KCiAgLy8vIFdyaXRlIGFjY2VzcyBvZiBhIHN1cGVyIHNldHRlciBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2Uuc3VwZXJTZXR0ZXJTZXQoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlciwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgZWxlbWVudCwgIlN1cGVyIHNldCBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2UgbWV0aG9kLiIpKTsKICAgIGFzc2VydChlbGVtZW50LmlzU2V0dGVyLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICJTdXBlciBzZXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgc2V0dGVyLiIpKTsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuU1VQRVJfU0VUVEVSX1NFVCk7CiAgfQoKICAvLy8gQ2xvc3VyaXphdGlvbiBvZiBhIHN1cGVyIG1ldGhvZCBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2Uuc3VwZXJUZWFyT2ZmKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydCgKICAgICAgICBlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIgJiYgZWxlbWVudC5pc0Z1bmN0aW9uLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsCiAgICAgICAgICAgICJTdXBlciBpbnZva2UgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG1ldGhvZC4iKSk7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLlNVUEVSX1RFQVJfT0ZGKTsKICB9CgogIC8vLyBJbnZvY2F0aW9uIG9mIGEgY29uc3RydWN0b3IgW2VsZW1lbnRdIHRocm91Z2ggYSB0aGlzIG9yIHN1cGVyCiAgLy8vIGNvbnN0cnVjdG9yIGNhbGwgd2l0aCB0aGUgZ2l2ZW4gW2NhbGxTdHJ1Y3R1cmVdLgogIGZhY3RvcnkgU3RhdGljVXNlLnN1cGVyQ29uc3RydWN0b3JJbnZva2UoCiAgICAgIENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNHZW5lcmF0aXZlQ29uc3RydWN0b3IsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICJDb25zdHJ1Y3RvciBpbnZva2UgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgIgogICAgICAgICAgICAiZ2VuZXJhdGl2ZSBjb25zdHJ1Y3Rvci4iKSk7CiAgICBhc3NlcnQoCiAgICAgICAgY2FsbFN0cnVjdHVyZSAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiTm90IENhbGxTdHJ1Y3R1cmUgZm9yIHN1cGVyIGNvbnN0cnVjdG9yIGludm9jYXRpb24gb2YgZWxlbWVudCAiCiAgICAgICAgICAgICIkZWxlbWVudC4iKSk7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLlNUQVRJQ19JTlZPS0UsCiAgICAgICAgY2FsbFN0cnVjdHVyZTogY2FsbFN0cnVjdHVyZSk7CiAgfQoKICAvLy8gSW52b2NhdGlvbiBvZiBhIGNvbnN0cnVjdG9yIChib2R5KSBbZWxlbWVudF0gdGhyb3VnaCBhIHRoaXMgb3Igc3VwZXIKICAvLy8gY29uc3RydWN0b3IgY2FsbCB3aXRoIHRoZSBnaXZlbiBbY2FsbFN0cnVjdHVyZV0uCiAgZmFjdG9yeSBTdGF0aWNVc2UuY29uc3RydWN0b3JCb2R5SW52b2tlKAogICAgICBDb25zdHJ1Y3RvckJvZHlFbnRpdHkgZWxlbWVudCwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICBhc3NlcnQoCiAgICAgICAgY2FsbFN0cnVjdHVyZSAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiTm90IENhbGxTdHJ1Y3R1cmUgZm9yIGNvbnN0cnVjdG9yIGJvZHkgaW52b2NhdGlvbiBvZiBlbGVtZW50ICIKICAgICAgICAgICAgIiRlbGVtZW50LiIpKTsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuU1RBVElDX0lOVk9LRSwKICAgICAgICBjYWxsU3RydWN0dXJlOiBjYWxsU3RydWN0dXJlKTsKICB9CgogIC8vLyBEaXJlY3QgaW52b2NhdGlvbiBvZiBhIGdlbmVyYXRvciAoYm9keSkgW2VsZW1lbnRdLCBhcyBhIHN0YXRpYyBjYWxsIG9yCiAgLy8vIHRocm91Z2ggYSB0aGlzIG9yIHN1cGVyIGNvbnN0cnVjdG9yIGNhbGwuCiAgZmFjdG9yeSBTdGF0aWNVc2UuZ2VuZXJhdG9yQm9keUludm9rZShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLlNUQVRJQ19JTlZPS0UsCiAgICAgICAgY2FsbFN0cnVjdHVyZTogQ2FsbFN0cnVjdHVyZS5OT19BUkdTKTsKICB9CgogIC8vLyBEaXJlY3QgaW52b2NhdGlvbiBvZiBhIG1ldGhvZCBbZWxlbWVudF0gd2l0aCB0aGUgZ2l2ZW4gW2NhbGxTdHJ1Y3R1cmVdLgogIGZhY3RvcnkgU3RhdGljVXNlLmRpcmVjdEludm9rZShGdW5jdGlvbkVudGl0eSBlbGVtZW50LAogICAgICBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIGFzc2VydCgKICAgICAgICBlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIsCiAgICAgICAgZmFpbGVkQXQoZWxlbWVudCwKICAgICAgICAgICAgIkRpcmVjdCBpbnZva2UgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG1lbWJlci4iKSk7CiAgICBhc3NlcnQoZWxlbWVudC5pc0Z1bmN0aW9uLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICJEaXJlY3QgaW52b2tlIGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhIG1ldGhvZC4iKSk7CiAgICBTdGF0aWNVc2Ugc3RhdGljVXNlID0gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbCgKICAgICAgICBlbGVtZW50LCBTdGF0aWNVc2VLaW5kLkRJUkVDVF9JTlZPS0UsCiAgICAgICAgY2FsbFN0cnVjdHVyZTogY2FsbFN0cnVjdHVyZSwgdHlwZUFyZ3VtZW50czogdHlwZUFyZ3VtZW50cyk7CiAgICBhc3NlcnQoc3RhdGljVXNlLl9jaGVja0dlbmVyaWNJbnZhcmlhbnRzKCkpOwogICAgcmV0dXJuIHN0YXRpY1VzZTsKICB9CgogIC8vLyBEaXJlY3QgcmVhZCBhY2Nlc3Mgb2YgYSBmaWVsZCBvciBnZXR0ZXIgW2VsZW1lbnRdLgogIGZhY3RvcnkgU3RhdGljVXNlLmRpcmVjdEdldChNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlciwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LAogICAgICAgICAgICAiRGlyZWN0IGdldCBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2UgbWVtYmVyLiIpKTsKICAgIGFzc2VydCgKICAgICAgICBlbGVtZW50LmlzRmllbGQgfHwgZWxlbWVudC5pc0dldHRlciwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LAogICAgICAgICAgICAiRGlyZWN0IGdldCBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYSBmaWVsZCBvciBhIGdldHRlci4iKSk7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLlNUQVRJQ19HRVQpOwogIH0KCiAgLy8vIERpcmVjdCB3cml0ZSBhY2Nlc3Mgb2YgYSBmaWVsZCBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2UuZGlyZWN0U2V0KEZpZWxkRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydCgKICAgICAgICBlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIsCiAgICAgICAgZmFpbGVkQXQoZWxlbWVudCwKICAgICAgICAgICAgIkRpcmVjdCBzZXQgZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG1lbWJlci4iKSk7CiAgICBhc3NlcnQoZWxlbWVudC5pc0ZpZWxkLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICJEaXJlY3Qgc2V0IGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhIGZpZWxkLiIpKTsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuU1RBVElDX1NFVCk7CiAgfQoKICAvLy8gQ29uc3RydWN0b3IgaW52b2NhdGlvbiBvZiBbZWxlbWVudF0gd2l0aCB0aGUgZ2l2ZW4gW2NhbGxTdHJ1Y3R1cmVdLgogIGZhY3RvcnkgU3RhdGljVXNlLmNvbnN0cnVjdG9ySW52b2tlKAogICAgICBDb25zdHJ1Y3RvckVudGl0eSBlbGVtZW50LCBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUpIHsKICAgIGFzc2VydCgKICAgICAgICBlbGVtZW50LmlzQ29uc3RydWN0b3IsCiAgICAgICAgZmFpbGVkQXQoZWxlbWVudCwKICAgICAgICAgICAgIkNvbnN0cnVjdG9yIGludm9jYXRpb24gZWxlbWVudCAkZWxlbWVudCBtdXN0IGJlIGEgY29uc3RydWN0b3IuIikpOwogICAgYXNzZXJ0KAogICAgICAgIGNhbGxTdHJ1Y3R1cmUgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgZWxlbWVudCwKICAgICAgICAgICAgIk5vdCBDYWxsU3RydWN0dXJlIGZvciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIG9mIGVsZW1lbnQgIgogICAgICAgICAgICAiJGVsZW1lbnQuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5TVEFUSUNfSU5WT0tFLAogICAgICAgIGNhbGxTdHJ1Y3R1cmU6IGNhbGxTdHJ1Y3R1cmUpOwogIH0KCiAgLy8vIENvbnN0cnVjdG9yIGludm9jYXRpb24gb2YgW2VsZW1lbnRdIHdpdGggdGhlIGdpdmVuIFtjYWxsU3RydWN0dXJlXSBvbgogIC8vLyBbdHlwZV0uCiAgZmFjdG9yeSBTdGF0aWNVc2UudHlwZWRDb25zdHJ1Y3Rvckludm9rZSgKICAgICAgQ29uc3RydWN0b3JFbnRpdHkgZWxlbWVudCwKICAgICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlLAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUsCiAgICAgIEltcG9ydEVudGl0eSBkZWZlcnJlZEltcG9ydCkgewogICAgYXNzZXJ0KHR5cGUgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LCAiTm8gdHlwZSBwcm92aWRlZCBmb3IgY29uc3RydWN0b3IgaW52b2NhdGlvbi4iKSk7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc0NvbnN0cnVjdG9yLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiVHlwZWQgY29uc3RydWN0b3IgaW52b2NhdGlvbiBlbGVtZW50ICRlbGVtZW50ICIKICAgICAgICAgICAgIm11c3QgYmUgYSBjb25zdHJ1Y3Rvci4iKSk7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLkNPTlNUUlVDVE9SX0lOVk9LRSwKICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgIGNhbGxTdHJ1Y3R1cmU6IGNhbGxTdHJ1Y3R1cmUsCiAgICAgICAgZGVmZXJyZWRJbXBvcnQ6IGRlZmVycmVkSW1wb3J0KTsKICB9CgogIC8vLyBDb25zdGFudCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIG9mIFtlbGVtZW50XSB3aXRoIHRoZSBnaXZlbgogIC8vLyBbY2FsbFN0cnVjdHVyZV0gb24gW3R5cGVdLgogIGZhY3RvcnkgU3RhdGljVXNlLmNvbnN0Q29uc3RydWN0b3JJbnZva2UoCiAgICAgIENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQsCiAgICAgIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSwKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlLAogICAgICBJbXBvcnRFbnRpdHkgZGVmZXJyZWRJbXBvcnQpIHsKICAgIGFzc2VydCh0eXBlICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoZWxlbWVudCwgIk5vIHR5cGUgcHJvdmlkZWQgZm9yIGNvbnN0cnVjdG9yIGludm9jYXRpb24uIikpOwogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNDb25zdHJ1Y3RvciwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgZWxlbWVudCwKICAgICAgICAgICAgIkNvbnN0IGNvbnN0cnVjdG9yIGludm9jYXRpb24gZWxlbWVudCAkZWxlbWVudCAiCiAgICAgICAgICAgICJtdXN0IGJlIGEgY29uc3RydWN0b3IuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoCiAgICAgICAgZWxlbWVudCwgU3RhdGljVXNlS2luZC5DT05TVF9DT05TVFJVQ1RPUl9JTlZPS0UsCiAgICAgICAgdHlwZTogdHlwZSwKICAgICAgICBjYWxsU3RydWN0dXJlOiBjYWxsU3RydWN0dXJlLAogICAgICAgIGRlZmVycmVkSW1wb3J0OiBkZWZlcnJlZEltcG9ydCk7CiAgfQoKICAvLy8gSW5pdGlhbGl6YXRpb24gb2YgYW4gaW5zdGFuY2UgZmllbGQgW2VsZW1lbnRdLgogIGZhY3RvcnkgU3RhdGljVXNlLmZpZWxkSW5pdChGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoCiAgICAgICAgZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LCAiRmllbGQgaW5pdCBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2UgZmllbGQuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5GSUVMRF9JTklUKTsKICB9CgogIC8vLyBDb25zdGFudCBpbml0aWFsaXphdGlvbiBvZiBhbiBpbnN0YW5jZSBmaWVsZCBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2UuZmllbGRDb25zdGFudEluaXQoCiAgICAgIEZpZWxkRW50aXR5IGVsZW1lbnQsIENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgIGFzc2VydCgKICAgICAgICBlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsICJGaWVsZCBpbml0IGVsZW1lbnQgJGVsZW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBmaWVsZC4iKSk7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLkZJRUxEX0NPTlNUQU5UX0lOSVQsCiAgICAgICAgY29uc3RhbnQ6IGNvbnN0YW50KTsKICB9CgogIC8vLyBSZWFkIGFjY2VzcyBvZiBhbiBpbnN0YW5jZSBmaWVsZCBvciBib3hlZCBmaWVsZCBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2UuZmllbGRHZXQoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlciB8fCBlbGVtZW50IGlzIEpSZWNvcmRGaWVsZCwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LAogICAgICAgICAgICAiRmllbGQgaW5pdCBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb3IgYm94ZWQgZmllbGQuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5JTlNUQU5DRV9GSUVMRF9HRVQpOwogIH0KCiAgLy8vIFdyaXRlIGFjY2VzcyBvZiBhbiBpbnN0YW5jZSBmaWVsZCBvciBib3hlZCBmaWVsZCBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2UuZmllbGRTZXQoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KAogICAgICAgIGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlciB8fCBlbGVtZW50IGlzIEpSZWNvcmRGaWVsZCwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LAogICAgICAgICAgICAiRmllbGQgaW5pdCBlbGVtZW50ICRlbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb3IgYm94ZWQgZmllbGQuIikpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNVc2UuaW50ZXJuYWwoZWxlbWVudCwgU3RhdGljVXNlS2luZC5JTlNUQU5DRV9GSUVMRF9TRVQpOwogIH0KCiAgLy8vIFJlYWQgb2YgYSBsb2NhbCBmdW5jdGlvbiBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2UuY2xvc3VyZShMb2NhbCBlbGVtZW50KSB7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChlbGVtZW50LCBTdGF0aWNVc2VLaW5kLkNMT1NVUkUpOwogIH0KCiAgLy8vIEFuIGludm9jYXRpb24gb2YgYSBsb2NhbCBmdW5jdGlvbiBbZWxlbWVudF0gd2l0aCB0aGUgcHJvdmlkZWQKICAvLy8gW2NhbGxTdHJ1Y3R1cmVdIGFuZCBbdHlwZUFyZ3VtZW50c10uCiAgZmFjdG9yeSBTdGF0aWNVc2UuY2xvc3VyZUNhbGwoTG9jYWwgZWxlbWVudCwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlLAogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBTdGF0aWNVc2Ugc3RhdGljVXNlID0gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbCgKICAgICAgICBlbGVtZW50LCBTdGF0aWNVc2VLaW5kLkNMT1NVUkVfQ0FMTCwKICAgICAgICBjYWxsU3RydWN0dXJlOiBjYWxsU3RydWN0dXJlLCB0eXBlQXJndW1lbnRzOiB0eXBlQXJndW1lbnRzKTsKICAgIGFzc2VydChzdGF0aWNVc2UuX2NoZWNrR2VuZXJpY0ludmFyaWFudHMoKSk7CiAgICByZXR1cm4gc3RhdGljVXNlOwogIH0KCiAgLy8vIFJlYWQgb2YgYSBjYWxsIFttZXRob2RdIG9uIGEgY2xvc3VyZUNsYXNzLgogIGZhY3RvcnkgU3RhdGljVXNlLmNhbGxNZXRob2QoRnVuY3Rpb25FbnRpdHkgbWV0aG9kKSB7CiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5pbnRlcm5hbChtZXRob2QsIFN0YXRpY1VzZUtpbmQuQ0FMTF9NRVRIT0QpOwogIH0KCiAgLy8vIEltcGxpY2l0IG1ldGhvZC9jb25zdHJ1Y3RvciBpbnZvY2F0aW9uIG9mIFtlbGVtZW50XSBjcmVhdGVkIGJ5IHRoZQogIC8vLyBiYWNrZW5kLgogIGZhY3RvcnkgU3RhdGljVXNlLmltcGxpY2l0SW52b2tlKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuU1RBVElDX0lOVk9LRSwKICAgICAgICBjYWxsU3RydWN0dXJlOiBlbGVtZW50LnBhcmFtZXRlclN0cnVjdHVyZS5jYWxsU3RydWN0dXJlKTsKICB9CgogIC8vLyBJbmxpbmluZyBvZiBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2UuY29uc3RydWN0b3JJbmxpbmluZygKICAgICAgQ29uc3RydWN0b3JFbnRpdHkgZWxlbWVudCwgSW50ZXJmYWNlVHlwZSBpbnN0YW5jZVR5cGUpIHsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuSU5MSU5JTkcsCiAgICAgICAgdHlwZTogaW5zdGFuY2VUeXBlKTsKICB9CgogIC8vLyBJbmxpbmluZyBvZiBbZWxlbWVudF0uCiAgZmFjdG9yeSBTdGF0aWNVc2UubWV0aG9kSW5saW5pbmcoCiAgICAgIEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgU3RhdGljVXNlLmludGVybmFsKGVsZW1lbnQsIFN0YXRpY1VzZUtpbmQuSU5MSU5JTkcsCiAgICAgICAgdHlwZUFyZ3VtZW50czogdHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gb3RoZXIgaXMgU3RhdGljVXNlICYmCiAgICAgICAgZWxlbWVudCA9PSBvdGhlci5lbGVtZW50ICYmCiAgICAgICAga2luZCA9PSBvdGhlci5raW5kICYmCiAgICAgICAgdHlwZSA9PSBvdGhlci50eXBlICYmCiAgICAgICAgY2FsbFN0cnVjdHVyZSA9PSBvdGhlci5jYWxsU3RydWN0dXJlICYmCiAgICAgICAgZXF1YWxFbGVtZW50cyh0eXBlQXJndW1lbnRzLCBvdGhlci50eXBlQXJndW1lbnRzKSAmJgogICAgICAgIGRlZmVycmVkSW1wb3J0ID09IG90aGVyLmRlZmVycmVkSW1wb3J0ICYmCiAgICAgICAgY29uc3RhbnQgPT0gb3RoZXIuY29uc3RhbnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnU3RhdGljVXNlKCRlbGVtZW50LCRraW5kLCR0eXBlLCR0eXBlQXJndW1lbnRzLCRjYWxsU3RydWN0dXJlKSc7Cn0KCmVudW0gVHlwZVVzZUtpbmQgewogIElTX0NIRUNLLAogIEFTX0NBU1QsCiAgQ0FUQ0hfVFlQRSwKICBUWVBFX0xJVEVSQUwsCiAgSU5TVEFOVElBVElPTiwKICBOQVRJVkVfSU5TVEFOVElBVElPTiwKICBDT05TVF9JTlNUQU5USUFUSU9OLAogIElNUExJQ0lUX0NBU1QsCiAgUEFSQU1FVEVSX0NIRUNLLAogIFJUSV9WQUxVRSwKICBUWVBFX0FSR1VNRU5ULAp9CgovLy8gVXNlIG9mIGEgW0RhcnRUeXBlXS4KY2xhc3MgVHlwZVVzZSB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAndHlwZS11c2UnOwoKICBmaW5hbCBEYXJ0VHlwZSB0eXBlOwogIGZpbmFsIFR5cGVVc2VLaW5kIGtpbmQ7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGhhc2hDb2RlOwogIGZpbmFsIEltcG9ydEVudGl0eSBkZWZlcnJlZEltcG9ydDsKCiAgVHlwZVVzZS5pbnRlcm5hbChEYXJ0VHlwZSB0eXBlLCBUeXBlVXNlS2luZCBraW5kLCBbdGhpcy5kZWZlcnJlZEltcG9ydF0pCiAgICAgIDogdGhpcy50eXBlID0gdHlwZSwKICAgICAgICB0aGlzLmtpbmQgPSBraW5kLAogICAgICAgIHRoaXMuaGFzaENvZGUgPSBIYXNoaW5nLm9iamVjdHNIYXNoKHR5cGUsIGtpbmQsIGRlZmVycmVkSW1wb3J0KTsKCiAgZmFjdG9yeSBUeXBlVXNlLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBEYXJ0VHlwZSB0eXBlID0gc291cmNlLnJlYWREYXJ0VHlwZSgpOwogICAgVHlwZVVzZUtpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShUeXBlVXNlS2luZC52YWx1ZXMpOwogICAgSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0ID0gc291cmNlLnJlYWRJbXBvcnRPck51bGwoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgVHlwZVVzZS5pbnRlcm5hbCh0eXBlLCBraW5kLCBkZWZlcnJlZEltcG9ydCk7CiAgfQoKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlRGFydFR5cGUodHlwZSk7CiAgICBzaW5rLndyaXRlRW51bShraW5kKTsKICAgIHNpbmsud3JpdGVJbXBvcnRPck51bGwoZGVmZXJyZWRJbXBvcnQpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIC8vLyBTaG9ydCB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIHVzZSBmb3IgdGVzdGluZy4KICBTdHJpbmcgZ2V0IHNob3J0VGV4dCB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5JU19DSEVDSzoKICAgICAgICBzYi53cml0ZSgnaXM6Jyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuQVNfQ0FTVDoKICAgICAgICBzYi53cml0ZSgnYXM6Jyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuQ0FUQ0hfVFlQRToKICAgICAgICBzYi53cml0ZSgnY2F0Y2g6Jyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuVFlQRV9MSVRFUkFMOgogICAgICAgIHNiLndyaXRlKCdsaXQ6Jyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuSU5TVEFOVElBVElPTjoKICAgICAgICBzYi53cml0ZSgnaW5zdDonKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5DT05TVF9JTlNUQU5USUFUSU9OOgogICAgICAgIHNiLndyaXRlKCdjb25zdDonKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5OQVRJVkVfSU5TVEFOVElBVElPTjoKICAgICAgICBzYi53cml0ZSgnbmF0aXZlOicpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFR5cGVVc2VLaW5kLklNUExJQ0lUX0NBU1Q6CiAgICAgICAgc2Iud3JpdGUoJ2ltcGw6Jyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgVHlwZVVzZUtpbmQuUEFSQU1FVEVSX0NIRUNLOgogICAgICAgIHNiLndyaXRlKCdwYXJhbTonKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5SVElfVkFMVUU6CiAgICAgICAgc2Iud3JpdGUoJ3J0aTonKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBUeXBlVXNlS2luZC5UWVBFX0FSR1VNRU5UOgogICAgICAgIHNiLndyaXRlKCd0eXBlQXJnOicpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgc2Iud3JpdGUodHlwZSk7CiAgICBpZiAoZGVmZXJyZWRJbXBvcnQgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgneycpOwogICAgICBzYi53cml0ZShkZWZlcnJlZEltcG9ydC5uYW1lKTsKICAgICAgc2Iud3JpdGUoJ30nKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgLy8vIFt0eXBlXSB1c2VkIGluIGFuIGlzIGNoZWNrLCBsaWtlIGBlIGlzIFRgIG9yIGBlIGlzISBUYC4KICBmYWN0b3J5IFR5cGVVc2UuaXNDaGVjayhEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gbmV3IFR5cGVVc2UuaW50ZXJuYWwodHlwZSwgVHlwZVVzZUtpbmQuSVNfQ0hFQ0spOwogIH0KCiAgLy8vIFt0eXBlXSB1c2VkIGluIGFuIGFzIGNhc3QsIGxpa2UgYGUgYXMgVGAuCiAgZmFjdG9yeSBUeXBlVXNlLmFzQ2FzdChEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gbmV3IFR5cGVVc2UuaW50ZXJuYWwodHlwZSwgVHlwZVVzZUtpbmQuQVNfQ0FTVCk7CiAgfQoKICAvLy8gW3R5cGVdIHVzZWQgYXMgYSBwYXJhbWV0ZXIgdHlwZSBvciBmaWVsZCB0eXBlIGluIERhcnQgMiwgbGlrZSBgVGAgaW46CiAgLy8vCiAgLy8vICAgIG1ldGhvZChUIHQpIHt9CiAgLy8vICAgIFQgZmllbGQ7CiAgLy8vCiAgZmFjdG9yeSBUeXBlVXNlLnBhcmFtZXRlckNoZWNrKERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBuZXcgVHlwZVVzZS5pbnRlcm5hbCh0eXBlLCBUeXBlVXNlS2luZC5QQVJBTUVURVJfQ0hFQ0spOwogIH0KCiAgLy8vIFt0eXBlXSB1c2VkIGluIGFuIGltcGxpY2l0IGNhc3QgaW4gRGFydCAyLCBsaWtlIGBUYCBpbgogIC8vLwogIC8vLyAgICBkeW5hbWljIGZvbyA9IG5ldyBPYmplY3QoKTsKICAvLy8gICAgVCBiYXIgPSBmb287IC8vIEltcGxpY2l0bHkgYFQgYmFyID0gZm9vIGFzIFRgLgogIC8vLwogIGZhY3RvcnkgVHlwZVVzZS5pbXBsaWNpdENhc3QoRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIG5ldyBUeXBlVXNlLmludGVybmFsKHR5cGUsIFR5cGVVc2VLaW5kLklNUExJQ0lUX0NBU1QpOwogIH0KCiAgLy8vIFt0eXBlXSB1c2VkIGluIGEgb24gdHlwZSBjYXRjaCBjbGF1c2UsIGxpa2UgYHRyeSB7fSBvbiBUIGNhdGNoIChlKSB7fWAuCiAgZmFjdG9yeSBUeXBlVXNlLmNhdGNoVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gbmV3IFR5cGVVc2UuaW50ZXJuYWwodHlwZSwgVHlwZVVzZUtpbmQuQ0FUQ0hfVFlQRSk7CiAgfQoKICAvLy8gW3R5cGVdIHVzZWQgYXMgYSB0eXBlIGxpdGVyYWwsIGxpa2UgYGZvbygpID0+IFQ7YC4KICBmYWN0b3J5IFR5cGVVc2UudHlwZUxpdGVyYWwoRGFydFR5cGUgdHlwZSwgSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0KSB7CiAgICByZXR1cm4gbmV3IFR5cGVVc2UuaW50ZXJuYWwodHlwZSwgVHlwZVVzZUtpbmQuVFlQRV9MSVRFUkFMLCBkZWZlcnJlZEltcG9ydCk7CiAgfQoKICAvLy8gW3R5cGVdIHVzZWQgaW4gYW4gaW5zdGFudGlhdGlvbiwgbGlrZSBgbmV3IFQoKTtgLgogIGZhY3RvcnkgVHlwZVVzZS5pbnN0YW50aWF0aW9uKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgcmV0dXJuIG5ldyBUeXBlVXNlLmludGVybmFsKHR5cGUsIFR5cGVVc2VLaW5kLklOU1RBTlRJQVRJT04pOwogIH0KCiAgLy8vIFt0eXBlXSB1c2VkIGluIGEgY29uc3RhbnQgaW5zdGFudGlhdGlvbiwgbGlrZSBgY29uc3QgVCgpO2AuCiAgZmFjdG9yeSBUeXBlVXNlLmNvbnN0SW5zdGFudGlhdGlvbigKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlLCBJbXBvcnRFbnRpdHkgZGVmZXJyZWRJbXBvcnQpIHsKICAgIHJldHVybiBuZXcgVHlwZVVzZS5pbnRlcm5hbCgKICAgICAgICB0eXBlLCBUeXBlVXNlS2luZC5DT05TVF9JTlNUQU5USUFUSU9OLCBkZWZlcnJlZEltcG9ydCk7CiAgfQoKICAvLy8gW3R5cGVdIHVzZWQgaW4gYSBuYXRpdmUgaW5zdGFudGlhdGlvbi4KICBmYWN0b3J5IFR5cGVVc2UubmF0aXZlSW5zdGFudGlhdGlvbihJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgIHJldHVybiBuZXcgVHlwZVVzZS5pbnRlcm5hbCh0eXBlLCBUeXBlVXNlS2luZC5OQVRJVkVfSU5TVEFOVElBVElPTik7CiAgfQoKICAvLy8gW3R5cGVdIHVzZWQgYXMgYSBkaXJlY3QgUlRJIHZhbHVlLgogIGZhY3RvcnkgVHlwZVVzZS5jb25zdFR5cGVMaXRlcmFsKERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBuZXcgVHlwZVVzZS5pbnRlcm5hbCh0eXBlLCBUeXBlVXNlS2luZC5SVElfVkFMVUUpOwogIH0KCiAgLy8vIFt0eXBlXSB1c2VkIGluIGEgYGluc3RhbmNlb2ZgIGNoZWNrLgogIGZhY3RvcnkgVHlwZVVzZS5pbnN0YW5jZUNvbnN0cnVjdG9yKERhcnRUeXBlIHR5cGUpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcixzcmEpOiBVc2UgYSBzZXBhcmF0ZSB1c2Uga2luZCBpZiBjb25zdHJ1Y3RvcnMgaXMgbm8KICAgIC8vIGxvbmdlciB1c2VkIGZvciBSVEkuCiAgICByZXR1cm4gbmV3IFR5cGVVc2UuaW50ZXJuYWwodHlwZSwgVHlwZVVzZUtpbmQuUlRJX1ZBTFVFKTsKICB9CgogIC8vLyBbdHlwZV0gdXNlZCBkaXJlY3RseSBhcyBhIHR5cGUgYXJndW1lbnQuCiAgLy8vCiAgLy8vIFRoZSBoYXBwZW5zIGR1cmluZyBvcHRpbWl6YXRpb24gd2hlcmUgYSB0eXBlIHZhcmlhYmxlIGNhbiBiZSByZXBsYWNlZCBieQogIC8vLyBhbiBpbnZhcmlhYmxlIHR5cGUgYXJndW1lbnQgZGVyaXZlZCBmcm9tIGEgY29uc3RhbnQgcmVjZWl2ZXIuCiAgZmFjdG9yeSBUeXBlVXNlLnR5cGVBcmd1bWVudChEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gbmV3IFR5cGVVc2UuaW50ZXJuYWwodHlwZSwgVHlwZVVzZUtpbmQuVFlQRV9BUkdVTUVOVCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIFR5cGVVc2UpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0eXBlID09IG90aGVyLnR5cGUgJiYga2luZCA9PSBvdGhlci5raW5kOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1R5cGVVc2UoJHR5cGUsJGtpbmQpJzsKfQoKLy8vIFVzZSBvZiBhIFtDb25zdGFudFZhbHVlXS4KY2xhc3MgQ29uc3RhbnRVc2UgewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2NvbnN0YW50LXVzZSc7CgogIGZpbmFsIENvbnN0YW50VmFsdWUgdmFsdWU7CgogIENvbnN0YW50VXNlLl8odGhpcy52YWx1ZSk7CgogIGZhY3RvcnkgQ29uc3RhbnRVc2UucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBzb3VyY2UucmVhZENvbnN0YW50KCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IENvbnN0YW50VXNlLl8odmFsdWUpOwogIH0KCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUNvbnN0YW50KHZhbHVlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICAvLy8gU2hvcnQgdGV4dHVhbCByZXByZXNlbnRhdGlvbiB1c2UgZm9yIHRlc3RpbmcuCiAgU3RyaW5nIGdldCBzaG9ydFRleHQgewogICAgcmV0dXJuIHZhbHVlLnRvRGFydFRleHQoKTsKICB9CgogIC8vLyBDb25zdGFudCB1c2VkIGFzIHRoZSBpbml0aWFsIHZhbHVlIG9mIGEgZmllbGQuCiAgQ29uc3RhbnRVc2UuaW5pdChDb25zdGFudFZhbHVlIHZhbHVlKSA6IHRoaXMuXyh2YWx1ZSk7CgogIC8vLyBUeXBlIGNvbnN0YW50IHVzZWQgZm9yIHJlZ2lzdHJhdGlvbiBvZiBjdXN0b20gZWxlbWVudHMuCiAgQ29uc3RhbnRVc2UuY3VzdG9tRWxlbWVudHMoVHlwZUNvbnN0YW50VmFsdWUgdmFsdWUpIDogdGhpcy5fKHZhbHVlKTsKCiAgLy8vIENvbnN0YW50IGxpdGVyYWwgdXNlZCBpbiBjb2RlLgogIENvbnN0YW50VXNlLmxpdGVyYWwoQ29uc3RhbnRWYWx1ZSB2YWx1ZSkgOiB0aGlzLl8odmFsdWUpOwoKICAvLy8gRGVmZXJyZWQgY29uc3RhbnQgdXNlZCBpbiBjb2RlLgogIENvbnN0YW50VXNlLmRlZmVycmVkKERlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZSB2YWx1ZSkgOiB0aGlzLl8odmFsdWUpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIENv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dGFibGUgc2V0IGZyb20gdGhlIGJpdCBtYXNrIFt2YWx1ZV0uCiAgY29uc3QgZmFjdG9yeSBFbnVtU2V0LmZpeGVkKGludCB2YWx1ZSkgPSBfQ29uc3RFbnVtU2V0PEU+OwoKICAvLy8gQ3JlYXRlIGEgc2V0IGNvbnRhaW5pbmcgdGhlIFt2YWx1ZXNdLiBJZiBbZml4ZWRdIGlzIGB0cnVlYCB0aGUgc2V0IGlzCiAgLy8vIGltbXV0YWJsZS4KICBmYWN0b3J5IEVudW1TZXQuZnJvbVZhbHVlcyhJdGVyYWJsZTxFPiB2YWx1ZXMsIHtib29sIGZpeGVkOiBmYWxzZX0pIHsKICAgIGlmIChmaXhlZCkgewogICAgICByZXR1cm4gbmV3IF9Db25zdEVudW1TZXQ8RT4uZnJvbVZhbHVlcyh2YWx1ZXMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBfRW51bVNldDxFPi5mcm9tVmFsdWVzKHZhbHVlcyk7CiAgICB9CiAgfQoKICBjb25zdCBFbnVtU2V0Ll8oKTsKCiAgLy8vIFRoZSBiaXQgbWFzayBvZiB0aGUgc2hpZnRlZCBpbmRpY2VzIGZvciB0aGUgZW51bSB2YWx1ZXMgaW4gdGhpcyBzZXQuCiAgaW50IGdldCB2YWx1ZTsKCiAgLy8vIFNldHMgdGhlIGVudW0gdmFsdWVzIGluIHRoaXMgc2V0IHRocm91Z2ggYSBiaXQgbWFzayBvZiB0aGUgc2hpZnRlZCBlbnVtCiAgLy8vIHZhbHVlIGluZGljZXMuCiAgdm9pZCBzZXQgdmFsdWUoaW50IG1hc2spOwoKICAvLy8gQWRkcyBbZW51bVZhbHVlXSB0byB0aGlzIHNldC4gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNldCB3YXMgY2hhbmdlZCBieQogIC8vLyB0aGlzIGFjdGlvbi4KICBib29sIGFkZChFIGVudW1WYWx1ZSk7CgogIC8vLyBBZGRzIGFsbCBlbnVtIHZhbHVlcyBpbiBbc2V0XSB0byB0aGlzIHNldC4KICB2b2lkIGFkZEFsbChFbnVtU2V0PEU+IHNldCk7CgogIC8vLyBSZW1vdmVzIFtlbnVtVmFsdWVdIGZyb20gdGhpcyBzZXQuIFJldHVybnMgYHRydWVgIGlmIHRoZSBzZXQgd2FzIGNoYW5nZWQKICAvLy8gYnkgdGhpcyBhY3Rpb24uCiAgYm9vbCByZW1vdmUoRSBlbnVtVmFsdWUpOwoKICAvLy8gUmVtb3ZlcyBhbGwgZW51bSB2YWx1ZXMgaW4gW3NldF0gZnJvbSB0aGlzIHNldC4gVGhlIHNldCBvZiByZW1vdmVkIHZhbHVlcwogIC8vLyBpcyByZXR1cm5lZC4KICBFbnVtU2V0PEU+IHJlbW92ZUFsbChFbnVtU2V0PEU+IHNldCk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IHNldCBjb250YWluaW5nIGFsbCB2YWx1ZXMgaW4gYm90aCB0aGlzIGFuZCB0aGUgW290aGVyXSBzZXQuCiAgRW51bVNldDxFPiBpbnRlcnNlY3Rpb24oRW51bVNldDxFPiBvdGhlcikgewogICAgcmV0dXJuIG5ldyBFbnVtU2V0LmZyb21WYWx1ZSh2YWx1ZSAmIG90aGVyLnZhbHVlKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgbmV3IHNldCBjb250YWluaW5nIGFsbCB2YWx1ZXMgZWl0aGVyIGluIHRoaXMgc2V0IG9yIGluIHRoZQogIC8vLyBbb3RoZXJdIHNldC4KICBFbnVtU2V0PEU+IHVuaW9uKEVudW1TZXQ8RT4gb3RoZXIpIHsKICAgIHJldHVybiBuZXcgRW51bVNldC5mcm9tVmFsdWUodmFsdWUgfCBvdGhlci52YWx1ZSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIG5ldyBzZXQgY29udGFpbmluZyBhbGwgdmFsdWVzIGluIHRoaXMgc2V0IHRoYXQgYXJlIG5vdCBpbiB0aGUKICAvLy8gW290aGVyXSBzZXQuCiAgRW51bVNldDxFPiBtaW51cyhFbnVtU2V0PEU+IG90aGVyKSB7CiAgICByZXR1cm4gbmV3IEVudW1TZXQuZnJvbVZhbHVlKHZhbHVlICYgfm90aGVyLnZhbHVlKTsKICB9CgogIC8vLyBDbGVhcnMgdGhpcyBzZXQuCiAgdm9pZCBjbGVhcigpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VudW1WYWx1ZV0gaXMgaW4gdGhpcyBzZXQuCiAgYm9vbCBjb250YWlucyhFIGVudW1WYWx1ZSkgewogICAgcmV0dXJuICh2YWx1ZSAmICgxIDw8IChlbnVtVmFsdWUgYXMgZHluYW1pYykuaW5kZXgpKSAhPSAwOwogIH0KCiAgLy8vIFJldHVybnMgYW4gW0l0ZXJhYmxlXSBvZiB0aGUgdmFsdWVzIGlzIGluIHRoaXMgc2V0IHVzaW5nIFt2YWx1ZXNdIHRvCiAgLy8vIGNvbnZlcnQgdGhlIHN0b3JlZCBpbmRpY2VzIHRvIGVudW0gdmFsdWVzLgogIC8vLwogIC8vLyBUaGUgbWV0aG9kIGlzIHR5cGljYWxseSBjYWxsZWQgd2l0aCB0aGUgYHZhbHVlc2AgcHJvcGVydHkgb2YgdGhlIGVudW0KICAvLy8gY2xhc3MgYXMgYXJndW1lbnQ6CiAgLy8vCiAgLy8vICAgICBFbnVtU2V0PEVudW1DbGFzcz4gc2V0ID0gLi4uCiAgLy8vICAgICBJdGVyYWJsZTxFbnVtQ2xhc3M+IGl0ZXJhYmxlID0gc2V0Lml0ZXJhYmxlKEVudW1DbGFzcy52YWx1ZXMpOwogIC8vLwogIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKExpc3Q8RT4gdmFsdWVzKSB7CiAgICByZXR1cm4gbmV3IF9FbnVtU2V0SXRlcmFibGUodGhpcywgdmFsdWVzKTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGFuZCBbb3RoZXJdIGhhdmUgYW55IGVsZW1lbnRzIGluIGNvbW1vbi4KICBib29sIGludGVyc2VjdHMoRW51bVNldDxFPiBvdGhlcikgewogICAgcmV0dXJuICh2YWx1ZSAmIG90aGVyLnZhbHVlKSAhPSAwOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc2V0IGlzIGVtcHR5LgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gdmFsdWUgPT0gMDsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc2V0IGlzIG5vdCBlbXB0eS4KICBib29sIGdldCBpc05vdEVtcHR5ID0+IHZhbHVlICE9IDA7CgogIC8vLyBSZXR1cm5zIGEgbmV3IG11dGFibGUgZW51bSBzZXQgdGhhdCBjb250YWlucyB0aGUgdmFsdWVzIG9mIHRoaXMgc2V0LgogIEVudW1TZXQ8RT4gY2xvbmUoKSA9PiBuZXcgRW51bVNldDxFPi5mcm9tVmFsdWUodmFsdWUpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHZhbHVlLmhhc2hDb2RlICogMTk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgRW51bVNldDxFPikgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHZhbHVlID09IG90aGVyLnZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgaWYgKHZhbHVlID09IDApIHJldHVybiAnMCc7CiAgICBpbnQgaW5kZXggPSB2YWx1ZS5iaXRMZW5ndGggLSAxOwogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgaW50IG1hc2sgPSAxIDw8IGluZGV4OwogICAgd2hpbGUgKGluZGV4ID49IDApIHsKICAgICAgc2Iud3JpdGUoKHZhbHVlICYgbWFzaykgIT0gMCA/ICcxJyA6ICcwJyk7CiAgICAgIGluZGV4LS07CiAgICAgIG1hc2sgPj49IDE7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBNdXRhYmxlIGltcGxlbWVudGF0aW9uIG9mIFtFbnVtU2V0XS4KY2xhc3MgX0VudW1TZXQ8RT4gZXh0ZW5kcyBFbnVtU2V0PEU+IHsKICBpbnQgX3ZhbHVlOwoKICBfRW51bVNldCgpIDogdGhpcy5mcm9tVmFsdWUoMCk7CgogIF9FbnVtU2V0LmZyb21WYWx1ZSh0aGlzLl92YWx1ZSkgOiBzdXBlci5fKCk7CgogIF9FbnVtU2V0LmZyb21WYWx1ZXMoSXRlcmFibGU8RT4gdmFsdWVzKQogICAgICA6IHRoaXMuX3ZhbHVlID0gMCwKICAgICAgICBzdXBlci5fKCkgewogICAgdmFsdWVzLmZvckVhY2goYWRkKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgdmFsdWUgPT4gX3ZhbHVlOwoKICBAb3ZlcnJpZGUKICB2b2lkIHNldCB2YWx1ZShpbnQgbWFzaykgewogICAgX3ZhbHVlID0gbWFzazsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgYWRkKEUgZW51bVZhbHVlKSB7CiAgICBpbnQgYmVmb3JlID0gX3ZhbHVlOwogICAgX3ZhbHVlIHw9IDEgPDwgKGVudW1WYWx1ZSBhcyBkeW5hbWljKS5pbmRleDsKICAgIHJldHVybiBfdmFsdWUgIT0gYmVmb3JlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRBbGwoRW51bVNldDxFPiBzZXQpIHsKICAgIF92YWx1ZSB8PSBzZXQudmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHJlbW92ZShFIGVudW1WYWx1ZSkgewogICAgaW50IGJlZm9yZSA9IF92YWx1ZTsKICAgIF92YWx1ZSAmPSB+KDEgPDwgKGVudW1WYWx1ZSBhcyBkeW5hbWljKS5pbmRleCk7CiAgICByZXR1cm4gX3ZhbHVlICE9IGJlZm9yZTsKICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8RT4gcmVtb3ZlQWxsKEVudW1TZXQ8RT4gc2V0KSB7CiAgICBpbnQgcmVtb3ZlZCA9IF92YWx1ZSAmIHNldC52YWx1ZTsKICAgIF92YWx1ZSAmPSB+c2V0LnZhbHVlOwogICAgcmV0dXJuIG5ldyBFbnVtU2V0PEU+LmZyb21WYWx1ZShyZW1vdmVkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xlYXIoKSB7CiAgICBfdmFsdWUgPSAwOwogIH0KfQoKLy8vIEltbXV0YWJsZSBpbXBsZW1lbnRhdGlvbiBvZiBbRW51bVNldF0uCmNsYXNzIF9Db25zdEVudW1TZXQ8RT4gZXh0ZW5kcyBFbnVtU2V0PEU+IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgdmFsdWU7CgogIGNvbnN0IF9Db25zdEVudW1TZXQodGhpcy52YWx1ZSkgOiBzdXBlci5fKCk7CgogIGZhY3RvcnkgX0NvbnN0RW51bVNldC5mcm9tVmFsdWVzKEl0ZXJhYmxlPEU+IHZhbHVlcykgewogICAgaW50IHZhbHVlID0gMDsKICAgIHZvaWQgYWRkKEUgZW51bVZhbHVlKSB7CiAgICAgIGlmIChlbnVtVmFsdWUgIT0gbnVsbCkgewogICAgICAgIHZhbHVlIHw9IDEgPDwgKGVudW1WYWx1ZSBhcyBkeW5hbWljKS5pbmRleDsKICAgICAgfQogICAgfQoKICAgIHZhbHVlcy5mb3JFYWNoKGFkZCk7CiAgICByZXR1cm4gbmV3IF9Db25zdEVudW1TZXQodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXQgdmFsdWUoaW50IG1hc2spIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdFbnVtU2V0LnZhbHVlPScpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhZGQoRSBlbnVtVmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdFbnVtU2V0LmFkZCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRBbGwoRW51bVNldDxFPiBzZXQpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdFbnVtU2V0LmFkZEFsbCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbGVhcigpIHsKICAgIGlmIChpc0VtcHR5KSB7CiAgICAgIC8vIFdlIGFsbG93IHRoaXMgbm8tb3Agb3BlcmF0aW9uIG9uIGFuIGltbXV0YWJsZSBzZXQgdG8gc3VwcG9ydCB1c2luZyBhCiAgICAgIC8vIGNvbnN0YW50IGVtcHR5IHNldCB0b2dldGhlciB3aXRoIG11dGFibGUgc2V0cyB3aGVyZSBhcHBsaWNhYmxlLgogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ0VudW1TZXQuY2xlYXInKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgcmVtb3ZlKEUgZW51bVZhbHVlKSB7CiAgICBpZiAoaXNFbXB0eSkgewogICAgICAvLyBXZSBhbGxvdyB0aGlzIG5vLW9wIG9wZXJhdGlvbiBvbiBhbiBpbW11dGFibGUgc2V0IHRvIHN1cHBvcnQgdXNpbmcgYQogICAgICAvLyBjb25zdGFudCBlbXB0eSBzZXQgdG9nZXRoZXIgd2l0aCBtdXRhYmxlIHNldHMgd2hlcmUgYXBwbGljYWJsZS4KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ0VudW1TZXQucmVtb3ZlJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBFbnVtU2V0PEU+IHJlbW92ZUFsbChFbnVtU2V0PEU+IHNldCkgewogICAgaWYgKGlzRW1wdHkpIHsKICAgICAgLy8gV2UgYWxsb3cgdGhpcyBuby1vcCBvcGVyYXRpb24gb24gYW4gaW1tdXRhYmxlIHNldCB0byBzdXBwb3J0IHVzaW5nIGEKICAgICAgLy8gY29uc3RhbnQgZW1wdHkgc2V0IHRvZ2V0aGVyIHdpdGggbXV0YWJsZSBzZXRzIHdoZXJlIGFwcGxpY2FibGUuCiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgaWYgKHNldC5pc0VtcHR5KSB7CiAgICAgIC8vIFdlIGFsbG93IHRoaXMgbm8tb3Agb3BlcmF0aW9uIG9uIGFuIGltbXV0YWJsZSBzZXQgdG8gc3VwcG9ydCB1c2luZyBhCiAgICAgIC8vIGNvbnN0YW50IGVtcHR5IHNldCB0b2dldGhlciB3aXRoIG11dGFibGUgc2V0cyB3aGVyZSBhcHBsaWNhYmxlLgogICAgICByZXR1cm4gc2V0LmNsb25lKCk7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignRW51bVNldC5yZW1vdmVBbGwnKTsKICB9Cn0KCmNsYXNzIF9FbnVtU2V0SXRlcmFibGU8RT4gZXh0ZW5kcyBJdGVyYWJsZUJhc2U8RT4gewogIGZpbmFsIEVudW1TZXQ8RT4gX2VudW1TZXQ7CiAgZmluYWwgTGlzdDxFPiBfdmFsdWVzOwoKICBfRW51bVNldEl0ZXJhYmxlKHRoaXMuX2VudW1TZXQsIHRoaXMuX3ZhbHVlcyk7CgogIEBvdmVycmlkZQogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBuZXcgX0VudW1TZXRJdGVyYXRvcihfZW51bVNldC52YWx1ZSwgX3ZhbHVlcyk7Cn0KCmNsYXNzIF9FbnVtU2V0SXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgaW50IF92YWx1ZTsKICBpbnQgX2luZGV4OwogIGludCBfbWFzazsKICBmaW5hbCBMaXN0PEU+IF92YWx1ZXM7CiAgRSBfY3VycmVudDsKCiAgX0VudW1TZXRJdGVyYXRvcih0aGlzLl92YWx1ZSwgdGhpcy5fdmFsdWVzKTsKCiAgQG92ZXJyaWRlCiAgRSBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfdmFsdWUgPT0gMCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICBpZiAoX21hc2sgPT0gbnVsbCkgewogICAgICAgIF9pbmRleCA9IF92YWx1ZS5iaXRMZW5ndGggLSAxOwogICAgICAgIF9tYXNrID0gMSA8PCBfaW5kZXg7CiAgICAgIH0KICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICB3aGlsZSAoX2luZGV4ID49IDApIHsKICAgICAgICBpZiAoX21hc2sgJiBfdmFsdWUgIT0gMCkgewogICAgICAgICAgX2N1cnJlbnQgPSBfdmFsdWVzW19pbmRleF07CiAgICAgICAgfQogICAgICAgIF9tYXNrID4+PSAxOwogICAgICAgIF9pbmRleC0tOwogICAgICAgIGlmIChfY3VycmVudCAhPSBudWxsKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIF9jdXJyZW50ICE9IG51bGw7CiAgICB9CiAgfQp9CoEuAE5OPAEeARoBShwkIwE3QAE6PQFMEUgRNg0xBgQBFQFLEQFOFRwBTRMZATEfAU8WHAFQEygBUC43BAFLEyc3BAFOEyc4BAEXEAE0Hz8EAUsxBkwZBidJBikvBAFGJicEASsiAS8lAUs5AQwrAQwcLSwhBAEMFiAlKhsZMQ8SBhoEAgEpJw4BIgEvASoZFBkEAQwbAQwdEwQBDBoZMR0EAQwgGQQBDB0ZNB0EAQwpJhouBAEMERAEAgErLAwTAS8BORMcHzQIBgEZJQQBDB0yBAEMGi8EAQwgMgQBDBETTkkNMwYEAQwdE05JFAYyBAEMKRNOSRMGF05JGgY1BAIBNB0ZATEBDE0CATMODg0ZDgEvAQwdAQwUFxQNGycdCBccIyYKFRIgEQoIHwYEAgEmcGFja2FnZTpjb21waWxlci9zcmMvdXRpbC9lbnVtc2V0LmRhcnQxc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvZWxlbWVudHMvbmFtZXMuZGFydI+cLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5lbGVtZW50cy5uYW1lczsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9kYXJ0MmpzLmRhcnQnIHNob3cgJF87CgppbXBvcnQgJ2VudGl0aWVzLmRhcnQnIHNob3cgTGlicmFyeUVudGl0eTsKCi8vLyBBIFtOYW1lXSByZXByZXNlbnRzIHRoZSBhYnN0cmFjdGlvbiBvZiBhIERhcnQgaWRlbnRpZmllciB3aGljaCB0YWtlcyBwcml2YWN5Ci8vLyBhbmQgc2V0dGVyIGludG8gYWNjb3VudC4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogVHJ5IHRvIHNoYXJlIGxvZ2ljIHdpdGggW1NlbGVjdG9yXS4KYWJzdHJhY3QgY2xhc3MgTmFtZSB7CiAgLy8vIENyZWF0ZSBhIFtOYW1lXSBmb3IgYW4gaWRlbnRpZmllciBbdGV4dF0uIElmIFt0ZXh0XSBiZWdpbnMgd2l0aCAnXycgYQogIC8vLyBwcml2YXRlIG5hbWUgd2l0aCByZXNwZWN0IHRvIFtsaWJyYXJ5XSBpcyBjcmVhdGVkLiBJZiBbaXNTZXR0ZXJdIGlzIGB0cnVlYAogIC8vLyB0aGUgY3JlYXRlZCBuYW1lIHJlcHJlc2VudHMgdGhlIHNldHRlciBuYW1lICd0ZXh0PScuCiAgZmFjdG9yeSBOYW1lKFN0cmluZyB0ZXh0LCBMaWJyYXJ5RW50aXR5IGxpYnJhcnksIHtib29sIGlzU2V0dGVyOiBmYWxzZX0pIHsKICAgIGlmIChpc1ByaXZhdGVOYW1lKHRleHQpKSB7CiAgICAgIHJldHVybiBuZXcgUHJpdmF0ZU5hbWUodGV4dCwgbGlicmFyeSwgaXNTZXR0ZXI6IGlzU2V0dGVyKTsKICAgIH0KICAgIHJldHVybiBuZXcgUHVibGljTmFtZSh0ZXh0LCBpc1NldHRlcjogaXNTZXR0ZXIpOwogIH0KCiAgLy8vIFRoZSB0ZXh0IG9mIHRoZSBuYW1lIHdpdGhvdXQgcHJlZml4ZWQgbGlicmFyeSBuYW1lIG9yIHN1ZmZpeGVkICc9JyBpZgogIC8vLyBhcHBsaWNhYmxlLgogIFN0cmluZyBnZXQgdGV4dDsKCiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIG5hbWUgcmVwcmVzZW50cyB0aGUgbmFtZSBvZiBhIHNldHRlci4KICBib29sIGdldCBpc1NldHRlcjsKCiAgLy8vIFJldHVybnMgdGhlIGdldHRlciBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBuYW1lLiBJZiB0aGlzIG5hbWUgaXMgYQogIC8vLyBzZXR0ZXIgbmFtZSAndj0nIHRoZW4gdGhlIG5hbWUgJ3YnIGlzIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIG5hbWUgaXRzZWxmCiAgLy8vIGlzIHJldHVybmVkLgogIE5hbWUgZ2V0IGdldHRlcjsKCiAgLy8vIFJldHVybnMgdGhlIHNlZXRlciBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBuYW1lLiBJZiB0aGlzIG5hbWUgaXMgYQogIC8vLyBnZXR0ZXIgbmFtZSAndicgdGhlbiB0aGUgbmFtZSAndj0nIGlzIHJldHVybmVkLCBvdGhlcndzaWUgdGhlIG5hbWUgaXRzZWxmCiAgLy8vIGlzIHJldHVybmVkLgogIE5hbWUgZ2V0IHNldHRlcjsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGFuIGVudGl0eSBvZiB0aGlzIG5hbWUgaXMgYWNjZXNzaWJsZSBmcm9tIGxpYnJhcnkKICAvLy8gW2VsZW1lbnRdLgogIGJvb2wgaXNBY2Nlc3NpYmxlRnJvbShMaWJyYXJ5RW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBuYW1lIGlzIHByaXZhdGUuCiAgYm9vbCBnZXQgaXNQcml2YXRlOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBuYW1lIGlzIHRoZSBzYW1lIGFzIFtvdGhlcl0gbm90IHRha2luZyB0aGUgbGlicmFyeQogIC8vLyBwcml2YWN5IGludG8gYWNjb3VudC4KICBib29sIGlzU2ltaWxhclRvKE5hbWUgb3RoZXIpOwogIGludCBnZXQgc2ltaWxhckhhc2hDb2RlOwoKICBMaWJyYXJ5RW50aXR5IGdldCBsaWJyYXJ5OwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgd2hlbiBbc10gaXMgcHJpdmF0ZSBpZiB1c2VkIGFzIGFuIGlkZW50aWZpZXIuCiAgc3RhdGljIGJvb2wgaXNQcml2YXRlTmFtZShTdHJpbmcgcykgPT4gIXMuaXNFbXB0eSAmJiBzLmNvZGVVbml0QXQoMCkgPT0gJF87CgogIC8vLyBSZXR1cm5zIGB0cnVlYCB3aGVuIFtzXSBpcyBwdWJsaWMgaWYgdXNlZCBhcyBhbiBpZGVudGlmaWVyLgogIHN0YXRpYyBib29sIGlzUHVibGljTmFtZShTdHJpbmcgcykgPT4gIWlzUHJpdmF0ZU5hbWUocyk7Cn0KCmNsYXNzIFB1YmxpY05hbWUgaW1wbGVtZW50cyBOYW1lIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgdGV4dDsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzU2V0dGVyOwoKICBjb25zdCBQdWJsaWNOYW1lKHRoaXMudGV4dCwge3RoaXMuaXNTZXR0ZXI6IGZhbHNlfSk7CgogIEBvdmVycmlkZQogIE5hbWUgZ2V0IGdldHRlciA9PiBpc1NldHRlciA/IG5ldyBQdWJsaWNOYW1lKHRleHQpIDogdGhpczsKCiAgQG92ZXJyaWRlCiAgTmFtZSBnZXQgc2V0dGVyID0+IGlzU2V0dGVyID8gdGhpcyA6IG5ldyBQdWJsaWNOYW1lKHRleHQsIGlzU2V0dGVyOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0FjY2Vzc2libGVGcm9tKExpYnJhcnlFbnRpdHkgZWxlbWVudCkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNQcml2YXRlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHNpbWlsYXJIYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBQdWJsaWNOYW1lKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gaXNTaW1pbGFyVG8ob3RoZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1NpbWlsYXJUbyhOYW1lIG90aGVyKSA9PgogICAgICB0ZXh0ID09IG90aGVyLnRleHQgJiYgaXNTZXR0ZXIgPT0gb3RoZXIuaXNTZXR0ZXI7CiAgQG92ZXJyaWRlCiAgaW50IGdldCBzaW1pbGFySGFzaENvZGUgPT4gdGV4dC5oYXNoQ29kZSArIDExICogaXNTZXR0ZXIuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIExpYnJhcnlFbnRpdHkgZ2V0IGxpYnJhcnkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gaXNTZXR0ZXIgPyAnJHRleHQ9JyA6IHRleHQ7Cn0KCmNsYXNzIFByaXZhdGVOYW1lIGV4dGVuZHMgUHVibGljTmFtZSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTGlicmFyeUVudGl0eSBsaWJyYXJ5OwoKICBQcml2YXRlTmFtZShTdHJpbmcgdGV4dCwgdGhpcy5saWJyYXJ5LCB7Ym9vbCBpc1NldHRlcjogZmFsc2V9KQogICAgICA6IHN1cGVyKHRleHQsIGlzU2V0dGVyOiBpc1NldHRlcik7CgogIEBvdmVycmlkZQogIE5hbWUgZ2V0IGdldHRlciA9PiBpc1NldHRlciA/IG5ldyBQcml2YXRlTmFtZSh0ZXh0LCBsaWJyYXJ5KSA6IHRoaXM7CgogIEBvdmVycmlkZQogIE5hbWUgZ2V0IHNldHRlciB7CiAgICByZXR1cm4gaXNTZXR0ZXIgPyB0aGlzIDogbmV3IFByaXZhdGVOYW1lKHRleHQsIGxpYnJhcnksIGlzU2V0dGVyOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNBY2Nlc3NpYmxlRnJvbShMaWJyYXJ5RW50aXR5IGVsZW1lbnQpID0+IGxpYnJhcnkgPT0gZWxlbWVudDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNQcml2YXRlID0+IHRydWU7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gc3VwZXIuaGFzaENvZGUgKyAxMyAqIGxpYnJhcnkuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgUHJpdmF0ZU5hbWUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBzdXBlciA9PSAob3RoZXIpICYmIGxpYnJhcnkgPT0gb3RoZXIubGlicmFyeTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICcke2xpYnJhcnkubmFtZX0jJHtzdXBlci50b1N0cmluZygpfSc7Cn0KgIsATk48ASABQgErAVEdPBZMUTtNH0EGNQQBTBITAT4VAUxQExMBTFATEwFKETABLhYBUBwgGwEdAUNOAUI7AgEjDBUMFwE3AQw9AQxNAQw4AQwfAQwnAQwcLB8EAQwiOAxFAQwlAQwzAgEnDB8BQSkBDEcBDBRNBAEMRgEMHgEMPgEMHC05BAEMPgIBKHBhY2thZ2U6Y29tcGlsZXIvc3JjL2VsZW1lbnRzL25hbWVzLmRhcnQ6c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydKGxLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5jYWxsX3N0cnVjdHVyZTsKCmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgTmFtZXM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCcgc2hvdyBQYXJhbWV0ZXJTdHJ1Y3R1cmU7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICdzZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwoKLy8vIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGFyZ3VtZW50cyBhdCBhIGNhbGwtc2l0ZS4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hvdWxkIHRoZXNlIGJlIGNhY2hlZD8KLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hvdWxkIGlzR2V0dGVyL2lzU2V0dGVyIGJlIHBhcnQgb2YgdGhlIGNhbGwgc3RydWN0dXJlCi8vIGluc3RlYWQgb2YgdGhlIHNlbGVjdG9yPwpjbGFzcyBDYWxsU3RydWN0dXJlIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0NhbGxTdHJ1Y3R1cmVdIG9iamVjdHMgaW4gYSBkZWJ1Z2dpbmcKICAvLy8gZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY2FsbC1zdHJ1Y3R1cmUnOwoKICBzdGF0aWMgY29uc3QgQ2FsbFN0cnVjdHVyZSBOT19BUkdTID0gY29uc3QgQ2FsbFN0cnVjdHVyZS51bm5hbWVkKDApOwogIHN0YXRpYyBjb25zdCBDYWxsU3RydWN0dXJlIE9ORV9BUkcgPSBjb25zdCBDYWxsU3RydWN0dXJlLnVubmFtZWQoMSk7CiAgc3RhdGljIGNvbnN0IENhbGxTdHJ1Y3R1cmUgVFdPX0FSR1MgPSBjb25zdCBDYWxsU3RydWN0dXJlLnVubmFtZWQoMik7CiAgc3RhdGljIGNvbnN0IENhbGxTdHJ1Y3R1cmUgVEhSRUVfQVJHUyA9IGNvbnN0IENhbGxTdHJ1Y3R1cmUudW5uYW1lZCgzKTsKICBzdGF0aWMgY29uc3QgQ2FsbFN0cnVjdHVyZSBGT1VSX0FSR1MgPSBjb25zdCBDYWxsU3RydWN0dXJlLnVubmFtZWQoNCk7CgogIC8vLyBUaGUgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIG9mIHRoZSBjYWxsLgogIGZpbmFsIGludCB0eXBlQXJndW1lbnRDb3VudDsKCiAgLy8vIFRoZSBudW1iZXJzIG9mIGFyZ3VtZW50cyBvZiB0aGUgY2FsbC4gSW5jbHVkZXMgbmFtZWQgYXJndW1lbnRzLgogIGZpbmFsIGludCBhcmd1bWVudENvdW50OwoKICAvLy8gVGhlIG51bWJlciBvZiBuYW1lZCBhcmd1bWVudHMgb2YgdGhlIGNhbGwuCiAgaW50IGdldCBuYW1lZEFyZ3VtZW50Q291bnQgPT4gMDsKCiAgLy8vIFRoZSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudCBvZiB0aGUgY2FsbC4KICBpbnQgZ2V0IHBvc2l0aW9uYWxBcmd1bWVudENvdW50ID0+IGFyZ3VtZW50Q291bnQ7CgogIGNvbnN0IENhbGxTdHJ1Y3R1cmUudW5uYW1lZCh0aGlzLmFyZ3VtZW50Q291bnQsIFt0aGlzLnR5cGVBcmd1bWVudENvdW50ID0gMF0pOwoKICBmYWN0b3J5IENhbGxTdHJ1Y3R1cmUoaW50IGFyZ3VtZW50Q291bnQsCiAgICAgIFtMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsIGludCB0eXBlQXJndW1lbnRDb3VudCA9IDBdKSB7CiAgICBpZiAobmFtZWRBcmd1bWVudHMgPT0gbnVsbCB8fCBuYW1lZEFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBuZXcgQ2FsbFN0cnVjdHVyZS51bm5hbWVkKGFyZ3VtZW50Q291bnQsIHR5cGVBcmd1bWVudENvdW50KTsKICAgIH0KICAgIHJldHVybiBuZXcgTmFtZWRDYWxsU3RydWN0dXJlKAogICAgICAgIGFyZ3VtZW50Q291bnQsIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRDb3VudCk7CiAgfQoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0NhbGxTdHJ1Y3R1cmVdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgQ2FsbFN0cnVjdHVyZS5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaW50IGFyZ3VtZW50Q291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzID0gc291cmNlLnJlYWRTdHJpbmdzKCk7CiAgICBpbnQgdHlwZUFyZ3VtZW50Q291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBDYWxsU3RydWN0dXJlKGFyZ3VtZW50Q291bnQsIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRDb3VudCk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtDYWxsU3RydWN0dXJlXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUludChhcmd1bWVudENvdW50KTsKICAgIHNpbmsud3JpdGVTdHJpbmdzKG5hbWVkQXJndW1lbnRzKTsKICAgIHNpbmsud3JpdGVJbnQodHlwZUFyZ3VtZW50Q291bnQpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGNhbGwgc3RydWN0dXJlIGlzIG5vcm1hbGl6ZWQsIHRoYXQgaXMsIGl0cyBuYW1lZAogIC8vLyBhcmd1bWVudHMgYXJlIHNvcnRlZC4KICBib29sIGdldCBpc05vcm1hbGl6ZWQgPT4gdHJ1ZTsKCiAgLy8vIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGlzIGNhbGwgc3RydWN0dXJlLgogIC8vLwogIC8vLyBBIFtDYWxsU3RydWN0dXJlXSBpcyBub3JtYWxpemVkIGlmIGl0cyBuYW1lZCBhcmd1bWVudHMgYXJlIHNvcnRlZC4KICBDYWxsU3RydWN0dXJlIHRvTm9ybWFsaXplZCgpID0+IHRoaXM7CgogIENhbGxTdHJ1Y3R1cmUgd2l0aFR5cGVBcmd1bWVudENvdW50KGludCB0eXBlQXJndW1lbnRDb3VudCkgPT4KICAgICAgbmV3IENhbGxTdHJ1Y3R1cmUoYXJndW1lbnRDb3VudCwgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudENvdW50KTsKCiAgLy8vIGB0cnVlYCBpZiB0aGlzIGNhbGwgaGFzIG5hbWVkIGFyZ3VtZW50cy4KICBib29sIGdldCBpc05hbWVkID0+IGZhbHNlOwoKICAvLy8gYHRydWVgIGlmIHRoaXMgY2FsbCBoYXMgbm8gbmFtZWQgYXJndW1lbnRzLgogIGJvb2wgZ2V0IGlzVW5uYW1lZCA9PiB0cnVlOwoKICAvLy8gVGhlIG5hbWVzIG9mIHRoZSBuYW1lZCBhcmd1bWVudHMgaW4gY2FsbC1zaXRlIG9yZGVyLgogIExpc3Q8U3RyaW5nPiBnZXQgbmFtZWRBcmd1bWVudHMgPT4gY29uc3QgPFN0cmluZz5bXTsKCiAgLy8vIFRoZSBuYW1lcyBvZiB0aGUgbmFtZWQgYXJndW1lbnRzIGluIGNhbm9uaWNhbGl6ZWQgb3JkZXIuCiAgTGlzdDxTdHJpbmc+IGdldE9yZGVyZWROYW1lZEFyZ3VtZW50cygpID0+IGNvbnN0IDxTdHJpbmc+W107CgogIENhbGxTdHJ1Y3R1cmUgZ2V0IG5vbkdlbmVyaWMgPT4gdHlwZUFyZ3VtZW50Q291bnQgPT0gMAogICAgICA/IHRoaXMKICAgICAgOiBuZXcgQ2FsbFN0cnVjdHVyZShhcmd1bWVudENvdW50LCBuYW1lZEFyZ3VtZW50cyk7CgogIC8vLyBTaG9ydCB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIHVzZSBmb3IgdGVzdGluZy4KICBTdHJpbmcgZ2V0IHNob3J0VGV4dCB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnKCcpOwogICAgc2Iud3JpdGUocG9zaXRpb25hbEFyZ3VtZW50Q291bnQpOwogICAgaWYgKG5hbWVkQXJndW1lbnRDb3VudCA+IDApIHsKICAgICAgc2Iud3JpdGUoJywnKTsKICAgICAgc2Iud3JpdGUoZ2V0T3JkZXJlZE5hbWVkQXJndW1lbnRzKCkuam9pbignLCcpKTsKICAgIH0KICAgIHNiLndyaXRlKCcpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIC8vLyBBIGRlc2NyaXB0aW9uIG9mIHRoZSBhcmd1bWVudCBzdHJ1Y3R1cmUuCiAgU3RyaW5nIHN0cnVjdHVyZVRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ2FyaXR5PSRhcmd1bWVudENvdW50Jyk7CiAgICBpZiAodHlwZUFyZ3VtZW50Q291bnQgIT0gMCkgewogICAgICBzYi53cml0ZSgnLCB0eXBlcz0kdHlwZUFyZ3VtZW50Q291bnQnKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0NhbGxTdHJ1Y3R1cmUoJHtzdHJ1Y3R1cmVUb1N0cmluZygpfSknOwoKICBTZWxlY3RvciBnZXQgY2FsbFNlbGVjdG9yID0+IG5ldyBTZWxlY3Rvci5jYWxsKE5hbWVzLmNhbGwsIHRoaXMpOwoKICBib29sIG1hdGNoKENhbGxTdHJ1Y3R1cmUgb3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiB0aGlzLmFyZ3VtZW50Q291bnQgPT0gb3RoZXIuYXJndW1lbnRDb3VudCAmJgogICAgICAgIHRoaXMubmFtZWRBcmd1bWVudENvdW50ID09IG90aGVyLm5hbWVkQXJndW1lbnRDb3VudCAmJgogICAgICAgIHRoaXMudHlwZUFyZ3VtZW50Q291bnQgPT0gb3RoZXIudHlwZUFyZ3VtZW50Q291bnQgJiYKICAgICAgICBzYW1lTmFtZXModGhpcy5uYW1lZEFyZ3VtZW50cywgb3RoZXIubmFtZWRBcmd1bWVudHMpOwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2FjaGUgaGFzaCBjb2RlPwogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIEhhc2hpbmcubGlzdEhhc2goCiAgICAgICAgbmFtZWRBcmd1bWVudHMsCiAgICAgICAgSGFzaGluZy5vYmplY3RIYXNoKGFyZ3VtZW50Q291bnQsCiAgICAgICAgICAgIEhhc2hpbmcub2JqZWN0SGFzaCh0eXBlQXJndW1lbnRDb3VudCwgbmFtZWRBcmd1bWVudHMubGVuZ3RoKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBDYWxsU3RydWN0dXJlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gbWF0Y2gob3RoZXIpOwogIH0KCiAgYm9vbCBzaWduYXR1cmVBcHBsaWVzKFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJzKSB7CiAgICBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9IHBhcmFtZXRlcnMucmVxdWlyZWRQYXJhbWV0ZXJzOwogICAgaW50IG9wdGlvbmFsUGFyYW1ldGVyQ291bnQgPSBwYXJhbWV0ZXJzLm9wdGlvbmFsUGFyYW1ldGVyczsKICAgIGludCBwYXJhbWV0ZXJDb3VudCA9IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgKyBvcHRpb25hbFBhcmFtZXRlckNvdW50OwogICAgaWYgKGFyZ3VtZW50Q291bnQgPiBwYXJhbWV0ZXJDb3VudCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKHBvc2l0aW9uYWxBcmd1bWVudENvdW50IDwgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKHR5cGVBcmd1bWVudENvdW50ICE9IDApIHsKICAgICAgaWYgKHR5cGVBcmd1bWVudENvdW50ICE9IHBhcmFtZXRlcnMudHlwZVBhcmFtZXRlcnMpIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAocGFyYW1ldGVycy5uYW1lZFBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICAvLyBXZSBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGFyZQogICAgICAvLyBub3QgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycy4gVGhlcmVmb3JlIHRoZQogICAgICAvLyBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMgYXJlIG5vdCBncmVhdGVyIHRoYW4gdGhlCiAgICAgIC8vIG51bWJlciBvZiBwYXJhbWV0ZXJzLgogICAgICBhc3NlcnQocG9zaXRpb25hbEFyZ3VtZW50Q291bnQgPD0gcGFyYW1ldGVyQ291bnQpOwogICAgICByZXR1cm4gbmFtZWRBcmd1bWVudHMuaXNFbXB0eTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChwb3NpdGlvbmFsQXJndW1lbnRDb3VudCA+IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHJldHVybiBmYWxzZTsKICAgICAgYXNzZXJ0KHBvc2l0aW9uYWxBcmd1bWVudENvdW50ID09IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogICAgICBpZiAobmFtZWRBcmd1bWVudENvdW50ID4gb3B0aW9uYWxQYXJhbWV0ZXJDb3VudCkgcmV0dXJuIGZhbHNlOwoKICAgICAgaW50IG5hbWVJbmRleCA9IDA7CiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZFBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzLm5hbWVkUGFyYW1ldGVyczsKICAgICAgZm9yIChTdHJpbmcgbmFtZSBpbiBnZXRPcmRlcmVkTmFtZWRBcmd1bWVudHMoKSkgewogICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKICAgICAgICAvLyBOb3RlOiB3ZSBzdGFydCBhdCB0aGUgZXhpc3RpbmcgaW5kZXggYmVjYXVzZSBhcmd1bWVudHMgYXJlIHNvcnRlZC4KICAgICAgICB3aGlsZSAobmFtZUluZGV4IDwgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICAgICAgaWYgKG5hbWUgPT0gbmFtZWRQYXJhbWV0ZXJzW25hbWVJbmRleF0pIHsKICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIG5hbWVJbmRleCsrOwogICAgICAgIH0KICAgICAgICBpZiAoIWZvdW5kKSByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQoKICBzdGF0aWMgYm9vbCBzYW1lTmFtZXMoTGlzdDxTdHJpbmc+IGZpcnN0LCBMaXN0PFN0cmluZz4gc2Vjb25kKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpcnN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChmaXJzdFtpXSAhPSBzZWNvbmRbaV0pIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfQoKLy8vIENhbGwgc3RydWN0dXJlIHdpdGggbmFtZWQgYXJndW1lbnRzLgpjbGFzcyBOYW1lZENhbGxTdHJ1Y3R1cmUgZXh0ZW5kcyBDYWxsU3RydWN0dXJlIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHM7CiAgZmluYWwgTGlzdDxTdHJpbmc+IF9vcmRlcmVkTmFtZWRBcmd1bWVudHM7CgogIE5hbWVkQ2FsbFN0cnVjdHVyZSgKICAgICAgaW50IGFyZ3VtZW50Q291bnQsIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywgaW50IHR5cGVBcmd1bWVudENvdW50KQogICAgICA6IHRoaXMuaW50ZXJuYWwoCiAgICAgICAgICAgIGFyZ3VtZW50Q291bnQsIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRDb3VudCwgPFN0cmluZz5bXSk7CgogIE5hbWVkQ2FsbFN0cnVjdHVyZS5pbnRlcm5hbChpbnQgYXJndW1lbnRDb3VudCwgdGhpcy5uYW1lZEFyZ3VtZW50cywKICAgICAgaW50IHR5cGVBcmd1bWVudENvdW50LCB0aGlzLl9vcmRlcmVkTmFtZWRBcmd1bWVudHMpCiAgICAgIDogYXNzZXJ0KG5hbWVkQXJndW1lbnRzLmlzTm90RW1wdHkpLAogICAgICAgIHN1cGVyLnVubmFtZWQoYXJndW1lbnRDb3VudCwgdHlwZUFyZ3VtZW50Q291bnQpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05hbWVkID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVW5uYW1lZCA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBuYW1lZEFyZ3VtZW50Q291bnQgPT4gbmFtZWRBcmd1bWVudHMubGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IHBvc2l0aW9uYWxBcmd1bWVudENvdW50ID0+IGFyZ3VtZW50Q291bnQgLSBuYW1lZEFyZ3VtZW50Q291bnQ7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTm9ybWFsaXplZCA9PiBuYW1lZEFyZ3VtZW50cyA9PSBfb3JkZXJlZE5hbWVkQXJndW1lbnRzOwoKICBAb3ZlcnJpZGUKICBDYWxsU3RydWN0dXJlIHRvTm9ybWFsaXplZCgpID0+IG5ldyBOYW1lZENhbGxTdHJ1Y3R1cmUuaW50ZXJuYWwoCiAgICAgIGFyZ3VtZW50Q291bnQsCiAgICAgIGdldE9yZGVyZWROYW1lZEFyZ3VtZW50cygpLAogICAgICB0eXBlQXJndW1lbnRDb3VudCwKICAgICAgZ2V0T3JkZXJlZE5hbWVkQXJndW1lbnRzKCkpOwoKICBAb3ZlcnJpZGUKICBMaXN0PFN0cmluZz4gZ2V0T3JkZXJlZE5hbWVkQXJndW1lbnRzKCkgewogICAgaWYgKCFfb3JkZXJlZE5hbWVkQXJndW1lbnRzLmlzRW1wdHkpIHJldHVybiBfb3JkZXJlZE5hbWVkQXJndW1lbnRzOwoKICAgIF9vcmRlcmVkTmFtZWRBcmd1bWVudHMuYWRkQWxsKG5hbWVkQXJndW1lbnRzKTsKICAgIF9vcmRlcmVkTmFtZWRBcmd1bWVudHMuc29ydCgoU3RyaW5nIGZpcnN0LCBTdHJpbmcgc2Vjb25kKSB7CiAgICAgIHJldHVybiBmaXJzdC5jb21wYXJlVG8oc2Vjb25kKTsKICAgIH0pOwogICAgcmV0dXJuIF9vcmRlcmVkTmFtZWRBcmd1bWVudHM7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgc3RydWN0dXJlVG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnYXJpdHk9JGFyZ3VtZW50Q291bnQsIG5hbWVkPVske25hbWVkQXJndW1lbnRzLmpvaW4oJywgJyl9XScpOwogICAgaWYgKHR5cGVBcmd1bWVudENvdW50ICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgdHlwZXM9JHR5cGVBcmd1bWVudENvdW50Jyk7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KgQEATk48ASABKjwuHCYBMzBPHBZREy4BR0dISkkBMB8BRhsBMSMBNTQBUQErQjxKBiM7BAE7QBcqOC4VUAQBMSgVIicmEwQBThwhAT0GSSgBQEsBLx0BMh4BOzcBPz8BOQ06ATQZKhMnIhU2BhMaBAEvHyomIi4GGgQBDEABRAEkLTg/PT4EASsMFR0YKkwEAQwcLxkEATlAQEo2SCJIBgEuQkJBHzklDUpBRQEZQTgcTjU0GhMMFwoiCBMGBAFDLS8GEQQCASkxDCUtARZNF0sBRjorOQEMHAEMHwEMNwEMSQEMRQEMQxUiGSMBDCxIATNAJggjBAEMHypMIi4GGgQCATFwYWNrYWdlOmNvbXBpbGVyL3NyYy91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0PHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbnN0YW50cy9jb25zdGFudF9zeXN0ZW0uZGFydMAAdHovLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIENvbnN0YW50IHN5c3RlbSBmb2xsb3dpbmcgdGhlIHNlbWFudGljcyBmb3IgRGFydCBjb2RlIHRoYXQgaGFzIGJlZW4KLy8vIGNvbXBpbGVkIHRvIEphdmFTY3JpcHQuCmxpYnJhcnkgZGFydDJqcy5jb25zdGFudF9zeXN0ZW07CgppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IENvbW1vbkVsZW1lbnRzOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL29wZXJhdG9ycy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICd2YWx1ZXMuZGFydCc7CgpmaW5hbCBfQklUUzMyID0gbmV3IEJpZ0ludC5mcm9tKDB4RkZGRkZGRkYpOwoKY29uc3QgYWRkID0gY29uc3QgQWRkT3BlcmF0aW9uKCk7CmNvbnN0IGJpdEFuZCA9IGNvbnN0IEJpdEFuZE9wZXJhdGlvbigpOwpjb25zdCBiaXROb3QgPSBjb25zdCBCaXROb3RPcGVyYXRpb24oKTsKY29uc3QgYml0T3IgPSBjb25zdCBCaXRPck9wZXJhdGlvbigpOwpjb25zdCBiaXRYb3IgPSBjb25zdCBCaXRYb3JPcGVyYXRpb24oKTsKY29uc3QgYm9vbGVhbkFuZCA9IGNvbnN0IEJvb2xlYW5BbmRPcGVyYXRpb24oKTsKY29uc3QgYm9vbGVhbk9yID0gY29uc3QgQm9vbGVhbk9yT3BlcmF0aW9uKCk7CmNvbnN0IGRpdmlkZSA9IGNvbnN0IERpdmlkZU9wZXJhdGlvbigpOwpjb25zdCBlcXVhbCA9IGNvbnN0IEVxdWFsc09wZXJhdGlvbigpOwpjb25zdCBncmVhdGVyRXF1YWwgPSBjb25zdCBHcmVhdGVyRXF1YWxPcGVyYXRpb24oKTsKY29uc3QgZ3JlYXRlciA9IGNvbnN0IEdyZWF0ZXJPcGVyYXRpb24oKTsKY29uc3QgaWRlbnRpdHkgPSBjb25zdCBJZGVudGl0eU9wZXJhdGlvbigpOwpjb25zdCBpZk51bGwgPSBjb25zdCBJZk51bGxPcGVyYXRpb24oKTsKY29uc3QgbGVzc0VxdWFsID0gY29uc3QgTGVzc0VxdWFsT3BlcmF0aW9uKCk7CmNvbnN0IGxlc3MgPSBjb25zdCBMZXNzT3BlcmF0aW9uKCk7CmNvbnN0IG1vZHVsbyA9IGNvbnN0IE1vZHVsb09wZXJhdGlvbigpOwpjb25zdCBtdWx0aXBseSA9IGNvbnN0IE11bHRpcGx5T3BlcmF0aW9uKCk7CmNvbnN0IG5lZ2F0ZSA9IGNvbnN0IE5lZ2F0ZU9wZXJhdGlvbigpOwpjb25zdCBub3QgPSBjb25zdCBOb3RPcGVyYXRpb24oKTsKY29uc3QgcmVtYWluZGVyID0gY29uc3QgUmVtYWluZGVyT3BlcmF0aW9uKCk7CmNvbnN0IHNoaWZ0TGVmdCA9IGNvbnN0IFNoaWZ0TGVmdE9wZXJhdGlvbigpOwpjb25zdCBzaGlmdFJpZ2h0ID0gY29uc3QgU2hpZnRSaWdodE9wZXJhdGlvbigpOwpjb25zdCBzdWJ0cmFjdCA9IGNvbnN0IFN1YnRyYWN0T3BlcmF0aW9uKCk7CmNvbnN0IHRydW5jYXRpbmdEaXZpZGUgPSBjb25zdCBUcnVuY2F0aW5nRGl2aWRlT3BlcmF0aW9uKCk7CmNvbnN0IGNvZGVVbml0QXQgPSBjb25zdCBDb2RlVW5pdEF0T3BlcmF0aW9uKCk7CmNvbnN0IHJvdW5kID0gY29uc3QgUm91bmRPcGVyYXRpb24oKTsKY29uc3QgYWJzID0gY29uc3QgVW5mb2xkZWRVbmFyeU9wZXJhdGlvbignYWJzJyk7CgovLy8gUmV0dXJucyB0cnVlIGlmIFt2YWx1ZV0gd2lsbCB0dXJuIGludG8gTmFOIG9yIGluZmluaXR5Ci8vLyBhdCBydW50aW1lLgpib29sIF9pbnRlZ2VyQmVjb21lc05hbk9ySW5maW5pdHkoQmlnSW50IHZhbHVlKSB7CiAgZG91YmxlIGRvdWJsZVZhbHVlID0gdmFsdWUudG9Eb3VibGUoKTsKICByZXR1cm4gZG91YmxlVmFsdWUuaXNOYU4gfHwgZG91YmxlVmFsdWUuaXNJbmZpbml0ZTsKfQoKTnVtQ29uc3RhbnRWYWx1ZSBfY29udmVydFRvSmF2YVNjcmlwdENvbnN0YW50KE51bUNvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICBpZiAoY29uc3RhbnQuaXNJbnQpIHsKICAgIEludENvbnN0YW50VmFsdWUgaW50Q29uc3RhbnQgPSBjb25zdGFudDsKICAgIEJpZ0ludCBpbnRWYWx1ZSA9IGludENvbnN0YW50LmludFZhbHVlOwogICAgaWYgKF9pbnRlZ2VyQmVjb21lc05hbk9ySW5maW5pdHkoaW50VmFsdWUpKSB7CiAgICAgIHJldHVybiBuZXcgRG91YmxlQ29uc3RhbnRWYWx1ZShpbnRWYWx1ZS50b0RvdWJsZSgpKTsKICAgIH0KICAgIC8vIElmIHRoZSBpbnRlZ2VyIGxvc2VzIHByZWNpc2lvbiB3aXRoIEphdmFTY3JpcHQgbnVtYmVycywgdXNlCiAgICAvLyB0aGUgZmxvb3JlZCB2ZXJzaW9uIEphdmFTY3JpcHQgd2lsbCB1c2UuCiAgICBCaWdJbnQgZmxvb3JWYWx1ZSA9IG5ldyBCaWdJbnQuZnJvbShpbnRWYWx1ZS50b0RvdWJsZSgpKTsKICAgIGlmIChmbG9vclZhbHVlICE9IGludFZhbHVlKSB7CiAgICAgIHJldHVybiBuZXcgSW50Q29uc3RhbnRWYWx1ZShmbG9vclZhbHVlKTsKICAgIH0KICB9IGVsc2UgaWYgKGNvbnN0YW50LmlzRG91YmxlKSB7CiAgICBEb3VibGVDb25zdGFudFZhbHVlIGRvdWJsZVJlc3VsdCA9IGNvbnN0YW50OwogICAgZG91YmxlIGRvdWJsZVZhbHVlID0gZG91YmxlUmVzdWx0LmRvdWJsZVZhbHVlOwogICAgaWYgKCFkb3VibGVWYWx1ZS5pc0luZmluaXRlICYmCiAgICAgICAgIWRvdWJsZVZhbHVlLmlzTmFOICYmCiAgICAgICAgIWNvbnN0YW50LmlzTWludXNaZXJvKSB7CiAgICAgIGRvdWJsZSB0cnVuY2F0ZWQgPSBkb3VibGVWYWx1ZS50cnVuY2F0ZVRvRG91YmxlKCk7CiAgICAgIGlmICh0cnVuY2F0ZWQgPT0gZG91YmxlVmFsdWUpIHsKICAgICAgICByZXR1cm4gbmV3IEludENvbnN0YW50VmFsdWUobmV3IEJpZ0ludC5mcm9tKHRydW5jYXRlZCkpOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBjb25zdGFudDsKfQoKTnVtQ29uc3RhbnRWYWx1ZSBjcmVhdGVJbnQoQmlnSW50IGkpID0+CiAgICBfY29udmVydFRvSmF2YVNjcmlwdENvbnN0YW50KG5ldyBJbnRDb25zdGFudFZhbHVlKGkpKTsKTnVtQ29uc3RhbnRWYWx1ZSBjcmVhdGVJbnRGcm9tSW50KGludCBpKSA9PiBjcmVhdGVJbnQobmV3IEJpZ0ludC5mcm9tKGkpKTsKTnVtQ29uc3RhbnRWYWx1ZSBfY3JlYXRlSW50MzIoQmlnSW50IGkpID0+IG5ldyBJbnRDb25zdGFudFZhbHVlKGkgJiBfQklUUzMyKTsKTnVtQ29uc3RhbnRWYWx1ZSBjcmVhdGVEb3VibGUoZG91YmxlIGQpID0+CiAgICBfY29udmVydFRvSmF2YVNjcmlwdENvbnN0YW50KG5ldyBEb3VibGVDb25zdGFudFZhbHVlKGQpKTsKU3RyaW5nQ29uc3RhbnRWYWx1ZSBjcmVhdGVTdHJpbmcoU3RyaW5nIHN0cmluZykgPT4KICAgIG5ldyBTdHJpbmdDb25zdGFudFZhbHVlKHN0cmluZyk7CkJvb2xDb25zdGFudFZhbHVlIGNyZWF0ZUJvb2woYm9vbCB2YWx1ZSkgPT4gbmV3IEJvb2xDb25zdGFudFZhbHVlKHZhbHVlKTsKTnVsbENvbnN0YW50VmFsdWUgY3JlYXRlTnVsbCgpID0+IG5ldyBOdWxsQ29uc3RhbnRWYWx1ZSgpOwpMaXN0Q29uc3RhbnRWYWx1ZSBjcmVhdGVMaXN0KEludGVyZmFjZVR5cGUgdHlwZSwgTGlzdDxDb25zdGFudFZhbHVlPiB2YWx1ZXMpID0+CiAgICBuZXcgTGlzdENvbnN0YW50VmFsdWUodHlwZSwgdmFsdWVzKTsKCkNvbnN0YW50VmFsdWUgY3JlYXRlVHlwZShDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywgRGFydFR5cGUgdHlwZSkgewogIEludGVyZmFjZVR5cGUgaW5zdGFuY2VUeXBlID0gY29tbW9uRWxlbWVudHMudHlwZUxpdGVyYWxUeXBlOwogIHJldHVybiBuZXcgVHlwZUNvbnN0YW50VmFsdWUodHlwZSwgaW5zdGFuY2VUeXBlKTsKfQoKLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgW2NvbnN0YW50XSBpcyBhbiBpbnRlZ2VyIGF0IHJ1bnRpbWUuCi8vLwovLy8gSW50ZWdlciBjaGVja3MgcmVwb3J0IHRydWUgZm9yIC0wLjAsIElORklOSVRZLCBhbmQgLUlORklOSVRZLiAgQXQKLy8vIHJ1bnRpbWUgYW4gJ1ggaXMgaW50JyBjaGVjayBpcyBpbXBsZW1lbnRlZCBhczoKLy8vCi8vLyB0eXBlb2YoWCkgPT09ICJudW1iZXIiICYmIE1hdGguZmxvb3IoWCkgPT09IFgKLy8vCi8vLyBXZSBjb25zaXN0ZW50bHkgbWF0Y2ggdGhhdCBydW50aW1lIHNlbWFudGljcyBhdCBjb21waWxlIHRpbWUgYXMgd2VsbC4KYm9vbCBpc0ludChDb25zdGFudFZhbHVlIGNvbnN0YW50KSA9PgogICAgY29uc3RhbnQuaXNJbnQgfHwKICAgIGNvbnN0YW50LmlzTWludXNaZXJvIHx8CiAgICBjb25zdGFudC5pc1Bvc2l0aXZlSW5maW5pdHkgfHwKICAgIGNvbnN0YW50LmlzTmVnYXRpdmVJbmZpbml0eTsKCi8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIFtjb25zdGFudF0gaXMgYSBkb3VibGUgYXQgcnVudGltZS4KYm9vbCBpc0RvdWJsZShDb25zdGFudFZhbHVlIGNvbnN0YW50KSA9PgogICAgY29uc3RhbnQuaXNEb3VibGUgJiYgIWNvbnN0YW50LmlzTWludXNaZXJvOwoKLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgW2NvbnN0YW50XSBpcyBhIHN0cmluZyBhdCBydW50aW1lLgpib29sIGlzU3RyaW5nKENvbnN0YW50VmFsdWUgY29uc3RhbnQpID0+IGNvbnN0YW50LmlzU3RyaW5nOwoKLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgW2NvbnN0YW50XSBpcyBhIGJvb2xlYW4gYXQgcnVudGltZS4KYm9vbCBpc0Jvb2woQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgPT4gY29uc3RhbnQuaXNCb29sOwoKLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgW2NvbnN0YW50XSBpcyBudWxsIGF0IHJ1bnRpbWUuCmJvb2wgaXNOdWxsKENvbnN0YW50VmFsdWUgY29uc3RhbnQpID0+IGNvbnN0YW50LmlzTnVsbDsKCmJvb2wgaXNTdWJ0eXBlKERhcnRUeXBlcyB0eXBlcywgRGFydFR5cGUgcywgRGFydFR5cGUgdCkgewogIC8vIEF0IHJ1bnRpbWUsIGFuIGludGVnZXIgaXMgYm90aCBhbiBpbnRlZ2VyIGFuZCBhIGRvdWJsZTogdGhlCiAgLy8gaW50ZWdlciB0eXBlIGNoZWNrIGlzIE1hdGguZmxvb3IsIHdoaWNoIHdpbGwgcmV0dXJuIHRydWUgb25seQogIC8vIGZvciByZWFsIGludGVnZXJzLCBhbmQgb3VyIGRvdWJsZSB0eXBlIGNoZWNrIGlzICd0eXBlb2YgbnVtYmVyJwogIC8vIHdoaWNoIHdpbGwgcmV0dXJuIHRydWUgZm9yIGJvdGggaW50ZWdlcnMgYW5kIGRvdWJsZXMuCiAgaWYgKHMgPT0gdHlwZXMuY29tbW9uRWxlbWVudHMuaW50VHlwZSAmJgogICAgICB0ID09IHR5cGVzLmNvbW1vbkVsZW1lbnRzLmRvdWJsZVR5cGUpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlKHMsIHQpOwp9CgpTZXRDb25zdGFudFZhbHVlIGNyZWF0ZVNldChDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgIEludGVyZmFjZVR5cGUgc291cmNlVHlwZSwgTGlzdDxDb25zdGFudFZhbHVlPiB2YWx1ZXMpIHsKICBJbnRlcmZhY2VUeXBlIHR5cGUgPSBjb21tb25FbGVtZW50cy5nZXRDb25zdGFudFNldFR5cGVGb3Ioc291cmNlVHlwZSk7CiAgRGFydFR5cGUgZWxlbWVudFR5cGUgPSB0eXBlLnR5cGVBcmd1bWVudHMuZmlyc3Q7CiAgSW50ZXJmYWNlVHlwZSBtYXBUeXBlID0KICAgICAgY29tbW9uRWxlbWVudHMubWFwVHlwZShlbGVtZW50VHlwZSwgY29tbW9uRWxlbWVudHMubnVsbFR5cGUpOwogIExpc3Q8TnVsbENvbnN0YW50VmFsdWU+IG51bGxzID0gbmV3IExpc3Q8TnVsbENvbnN0YW50VmFsdWU+LmZpbGxlZCgKICAgICAgdmFsdWVzLmxlbmd0aCwgY29uc3QgTnVsbENvbnN0YW50VmFsdWUoKSk7CiAgTWFwQ29uc3RhbnRWYWx1ZSBlbnRyaWVzID0gY3JlYXRlTWFwKGNvbW1vbkVsZW1lbnRzLCBtYXBUeXBlLCB2YWx1ZXMsIG51bGxzKTsKICByZXR1cm4gbmV3IEphdmFTY3JpcHRTZXRDb25zdGFudCh0eXBlLCBlbnRyaWVzKTsKfQoKTWFwQ29uc3RhbnRWYWx1ZSBjcmVhdGVNYXAoCiAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgIEludGVyZmFjZVR5cGUgc291cmNlVHlwZSwKICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4ga2V5cywKICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gdmFsdWVzKSB7CiAgYm9vbCBvbmx5U3RyaW5nS2V5cyA9IHRydWU7CiAgQ29uc3RhbnRWYWx1ZSBwcm90b1ZhbHVlID0gbnVsbDsKICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgIGR5bmFtaWMga2V5ID0ga2V5c1tpXTsKICAgIGlmIChrZXkuaXNTdHJpbmcpIHsKICAgICAgaWYgKGtleS5zdHJpbmdWYWx1ZSA9PSBKYXZhU2NyaXB0TWFwQ29uc3RhbnQuUFJPVE9fUFJPUEVSVFkpIHsKICAgICAgICBwcm90b1ZhbHVlID0gdmFsdWVzW2ldOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBvbmx5U3RyaW5nS2V5cyA9IGZhbHNlOwogICAgICAvLyBEb24ndCBoYW5kbGUgX19wcm90b19fIHZhbHVlcyBzcGVjaWFsbHkgaW4gdGhlIGdlbmVyYWwgbWFwIGNhc2UuCiAgICAgIHByb3RvVmFsdWUgPSBudWxsOwogICAgICBicmVhazsKICAgIH0KICB9CgogIGJvb2wgaGFzUHJvdG9LZXkgPSAocHJvdG9WYWx1ZSAhPSBudWxsKTsKICBJbnRlcmZhY2VUeXBlIGtleXNUeXBlOwogIGlmIChzb3VyY2VUeXBlLnRyZWF0QXNSYXcpIHsKICAgIGtleXNUeXBlID0gY29tbW9uRWxlbWVudHMubGlzdFR5cGUoKTsKICB9IGVsc2UgewogICAga2V5c1R5cGUgPSBjb21tb25FbGVtZW50cy5saXN0VHlwZShzb3VyY2VUeXBlLnR5cGVBcmd1bWVudHMuZmlyc3QpOwogIH0KICBMaXN0Q29uc3RhbnRWYWx1ZSBrZXlzTGlzdCA9IG5ldyBMaXN0Q29uc3RhbnRWYWx1ZShrZXlzVHlwZSwga2V5cyk7CiAgSW50ZXJmYWNlVHlwZSB0eXBlID0gY29tbW9uRWxlbWVudHMuZ2V0Q29uc3RhbnRNYXBUeXBlRm9yKHNvdXJjZVR5cGUsCiAgICAgIGhhc1Byb3RvS2V5OiBoYXNQcm90b0tleSwgb25seVN0cmluZ0tleXM6IG9ubHlTdHJpbmdLZXlzKTsKICByZXR1cm4gbmV3IEphdmFTY3JpcHRNYXBDb25zdGFudCgKICAgICAgdHlwZSwga2V5c0xpc3QsIHZhbHVlcywgcHJvdG9WYWx1ZSwgb25seVN0cmluZ0tleXMpOwp9CgpDb25zdGFudFZhbHVlIGNyZWF0ZVN5bWJvbChDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywgU3RyaW5nIHRleHQpIHsKICBJbnRlcmZhY2VUeXBlIHR5cGUgPSBjb21tb25FbGVtZW50cy5zeW1ib2xJbXBsZW1lbnRhdGlvblR5cGU7CiAgRmllbGRFbnRpdHkgZmllbGQgPSBjb21tb25FbGVtZW50cy5zeW1ib2xGaWVsZDsKICBDb25zdGFudFZhbHVlIGFyZ3VtZW50ID0gY3JlYXRlU3RyaW5nKHRleHQpOwogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSB0eXBlIGFyZ3VtZW50cyB3aGVuIGFsbCB1c2VzIG5vIGxvbmdlciBleHBlY3QKICAvLyBhIFtGaWVsZEVsZW1lbnRdLgogIHZhciBmaWVsZHMgPSA8RmllbGRFbnRpdHksIENvbnN0YW50VmFsdWU+e2ZpZWxkOiBhcmd1bWVudH07CiAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RlZENvbnN0YW50VmFsdWUodHlwZSwgZmllbGRzKTsKfQoKVW5hcnlPcGVyYXRpb24gbG9va3VwVW5hcnkoVW5hcnlPcGVyYXRvciBvcGVyYXRvcikgewogIHN3aXRjaCAob3BlcmF0b3Iua2luZCkgewogICAgY2FzZSBVbmFyeU9wZXJhdG9yS2luZC5DT01QTEVNRU5UOgogICAgICByZXR1cm4gYml0Tm90OwogICAgY2FzZSBVbmFyeU9wZXJhdG9yS2luZC5ORUdBVEU6CiAgICAgIHJldHVybiBuZWdhdGU7CiAgICBjYXNlIFVuYXJ5T3BlcmF0b3JLaW5kLk5PVDoKICAgICAgcmV0dXJuIG5vdDsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBudWxsOwogIH0KfQoKQmluYXJ5T3BlcmF0aW9uIGxvb2t1cEJpbmFyeShCaW5hcnlPcGVyYXRvciBvcGVyYXRvcikgewogIHN3aXRjaCAob3BlcmF0b3Iua2luZCkgewogICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuQUREOgogICAgICByZXR1cm4gYWRkOwogICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuU1VCOgogICAgICByZXR1cm4gc3VidHJhY3Q7CiAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5NVUw6CiAgICAgIHJldHVybiBtdWx0aXBseTsKICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkRJVjoKICAgICAgcmV0dXJuIGRpdmlkZTsKICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLk1PRDoKICAgICAgcmV0dXJuIG1vZHVsbzsKICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLklESVY6CiAgICAgIHJldHVybiB0cnVuY2F0aW5nRGl2aWRlOwogICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuT1I6CiAgICAgIHJldHVybiBiaXRPcjsKICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkFORDoKICAgICAgcmV0dXJuIGJpdEFuZDsKICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLlhPUjoKICAgICAgcmV0dXJuIGJpdFhvcjsKICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkxPR0lDQUxfT1I6CiAgICAgIHJldHVybiBib29sZWFuT3I7CiAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5MT0dJQ0FMX0FORDoKICAgICAgcmV0dXJuIGJvb2xlYW5BbmQ7CiAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5TSEw6CiAgICAgIHJldHVybiBzaGlmdExlZnQ7CiAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5TSFI6CiAgICAgIHJldHVybiBzaGlmdFJpZ2h0OwogICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTFQ6CiAgICAgIHJldHVybiBsZXNzOwogICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuTFRFUToKICAgICAgcmV0dXJuIGxlc3NFcXVhbDsKICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkdUOgogICAgICByZXR1cm4gZ3JlYXRlcjsKICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkdURVE6CiAgICAgIHJldHVybiBncmVhdGVyRXF1YWw7CiAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5FUToKICAgICAgcmV0dXJuIGVxdWFsOwogICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuSUZfTlVMTDoKICAgICAgcmV0dXJuIGlmTnVsbDsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBudWxsOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgT3BlcmF0aW9uIHsKICBTdHJpbmcgZ2V0IG5hbWU7Cn0KCmFic3RyYWN0IGNsYXNzIFVuYXJ5T3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uIHsKICAvLy8gUmV0dXJucyBbOm51bGw6XSBpZiBpdCB3YXMgdW5hYmxlIHRvIGZvbGQgdGhlIG9wZXJhdGlvbi4KICBDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCk7Cn0KCmFic3RyYWN0IGNsYXNzIEJpbmFyeU9wZXJhdGlvbiBleHRlbmRzIE9wZXJhdGlvbiB7CiAgLy8vIFJldHVybnMgWzpudWxsOl0gaWYgaXQgd2FzIHVuYWJsZSB0byBmb2xkIHRoZSBvcGVyYXRpb24uCiAgQ29uc3RhbnRWYWx1ZSBmb2xkKENvbnN0YW50VmFsdWUgbGVmdCwgQ29uc3RhbnRWYWx1ZSByaWdodCk7CiAgYXBwbHkobGVmdCwgcmlnaHQpOwp9CgpjbGFzcyBCaXROb3RPcGVyYXRpb24gaW1wbGVtZW50cyBVbmFyeU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnfic7CgogIGNvbnN0IEJpdE5vdE9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgaWYgKGlzSW50KGNvbnN0YW50KSkgewogICAgICAvLyBJbiBKYXZhU2NyaXB0IHdlIGRvbid0IGNoZWNrIGZvciAtMCBhbmQgdHJlYXQgaXQgYXMgaWYgaXQgd2FzIHplcm8uCiAgICAgIGlmIChjb25zdGFudC5pc01pbnVzWmVybykgewogICAgICAgIGNvbnN0YW50ID0gY3JlYXRlSW50KEJpZ0ludC56ZXJvKTsKICAgICAgfQogICAgICBJbnRDb25zdGFudFZhbHVlIGludENvbnN0YW50ID0gY29uc3RhbnQ7CiAgICAgIC8vIFdlIGNvbnZlcnQgdGhlIHJlc3VsdCBvZiBiaXQtb3BlcmF0aW9ucyB0byAzMiBiaXQgdW5zaWduZWQgaW50ZWdlcnMuCiAgICAgIHJldHVybiBfY3JlYXRlSW50MzIofmludENvbnN0YW50LmludFZhbHVlKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQoKY2xhc3MgTmVnYXRlT3BlcmF0aW9uIGltcGxlbWVudHMgVW5hcnlPcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJ25lZ2F0ZSc7CgogIGNvbnN0IE5lZ2F0ZU9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgQ29uc3RhbnRWYWx1ZSBfZm9sZChDb25zdGFudFZhbHVlIGNvbnN0YW50KSB7CiAgICAgIGlmIChjb25zdGFudC5pc0ludCkgewogICAgICAgIEludENvbnN0YW50VmFsdWUgaW50Q29uc3RhbnQgPSBjb25zdGFudDsKICAgICAgICByZXR1cm4gY3JlYXRlSW50KC1pbnRDb25zdGFudC5pbnRWYWx1ZSk7CiAgICAgIH0KICAgICAgaWYgKGNvbnN0YW50LmlzRG91YmxlKSB7CiAgICAgICAgRG91YmxlQ29uc3RhbnRWYWx1ZSBkb3VibGVDb25zdGFudCA9IGNvbnN0YW50OwogICAgICAgIHJldHVybiBjcmVhdGVEb3VibGUoLWRvdWJsZUNvbnN0YW50LmRvdWJsZVZhbHVlKTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZiAoY29uc3RhbnQuaXNJbnQpIHsKICAgICAgSW50Q29uc3RhbnRWYWx1ZSBpbnRDb25zdGFudCA9IGNvbnN0YW50OwogICAgICBpZiAoaW50Q29uc3RhbnQuaW50VmFsdWUgPT0gQmlnSW50Lnplcm8pIHsKICAgICAgICByZXR1cm4gY3JlYXRlRG91YmxlKC0wLjApOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2ZvbGQoY29uc3RhbnQpOwogIH0KfQoKY2xhc3MgTm90T3BlcmF0aW9uIGltcGxlbWVudHMgVW5hcnlPcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJyEnOwoKICBjb25zdCBOb3RPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBmb2xkKENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgIGlmIChjb25zdGFudC5pc0Jvb2wpIHsKICAgICAgQm9vbENvbnN0YW50VmFsdWUgYm9vbENvbnN0YW50ID0gY29uc3RhbnQ7CiAgICAgIHJldHVybiBjcmVhdGVCb29sKCFib29sQ29uc3RhbnQuYm9vbFZhbHVlKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQoKLy8vIE9wZXJhdGlvbnMgdGhhdCBvbmx5IHdvcmsgaWYgYm90aCBhcmd1bWVudHMgYXJlIGludGVnZXJzLgphYnN0cmFjdCBjbGFzcyBCaW5hcnlCaXRPcGVyYXRpb24gaW1wbGVtZW50cyBCaW5hcnlPcGVyYXRpb24gewogIGNvbnN0IEJpbmFyeUJpdE9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBsZWZ0LCBDb25zdGFudFZhbHVlIHJpZ2h0KSB7CiAgICBDb25zdGFudFZhbHVlIF9mb2xkKENvbnN0YW50VmFsdWUgbGVmdCwgQ29uc3RhbnRWYWx1ZSByaWdodCkgewogICAgICBpZiAobGVmdC5pc0ludCAmJiByaWdodC5pc0ludCkgewogICAgICAgIEludENvbnN0YW50VmFsdWUgbGVmdEludCA9IGxlZnQ7CiAgICAgICAgSW50Q29uc3RhbnRWYWx1ZSByaWdodEludCA9IHJpZ2h0OwogICAgICAgIEJpZ0ludCByZXN1bHRWYWx1ZSA9IGZvbGRJbnRzKGxlZnRJbnQuaW50VmFsdWUsIHJpZ2h0SW50LmludFZhbHVlKTsKICAgICAgICBpZiAocmVzdWx0VmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUludChyZXN1bHRWYWx1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLy8gSW4gSmF2YVNjcmlwdCB3ZSBkb24ndCBjaGVjayBmb3IgLTAgYW5kIHRyZWF0IGl0IGFzIGlmIGl0IHdhcyB6ZXJvLgogICAgaWYgKGxlZnQuaXNNaW51c1plcm8pIHsKICAgICAgbGVmdCA9IGNyZWF0ZUludChCaWdJbnQuemVybyk7CiAgICB9CiAgICBpZiAocmlnaHQuaXNNaW51c1plcm8pIHsKICAgICAgcmlnaHQgPSBjcmVhdGVJbnQoQmlnSW50Lnplcm8pOwogICAgfQogICAgSW50Q29uc3RhbnRWYWx1ZSByZXN1bHQgPSBfZm9sZChsZWZ0LCByaWdodCk7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgLy8gV2UgY29udmVydCB0aGUgcmVzdWx0IG9mIGJpdC1vcGVyYXRpb25zIHRvIDMyIGJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4KICAgICAgcmV0dXJuIF9jcmVhdGVJbnQzMihyZXN1bHQuaW50VmFsdWUpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEJpZ0ludCBmb2xkSW50cyhCaWdJbnQgbGVmdCwgQmlnSW50IHJpZ2h0KTsKfQoKY2xhc3MgQml0QW5kT3BlcmF0aW9uIGV4dGVuZHMgQmluYXJ5Qml0T3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICcmJzsKCiAgY29uc3QgQml0QW5kT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIEJpZ0ludCBmb2xkSW50cyhCaWdJbnQgbGVmdCwgQmlnSW50IHJpZ2h0KSA9PiBsZWZ0ICYgcmlnaHQ7CgogIEBvdmVycmlkZQogIGFwcGx5KGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ICYgcmlnaHQ7Cn0KCmNsYXNzIEJpdE9yT3BlcmF0aW9uIGV4dGVuZHMgQmluYXJ5Qml0T3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICd8JzsKCiAgY29uc3QgQml0T3JPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgQmlnSW50IGZvbGRJbnRzKEJpZ0ludCBsZWZ0LCBCaWdJbnQgcmlnaHQpID0+IGxlZnQgfCByaWdodDsKCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQgfCByaWdodDsKfQoKY2xhc3MgQml0WG9yT3BlcmF0aW9uIGV4dGVuZHMgQmluYXJ5Qml0T3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICdeJzsKCiAgY29uc3QgQml0WG9yT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIEJpZ0ludCBmb2xkSW50cyhCaWdJbnQgbGVmdCwgQmlnSW50IHJpZ2h0KSA9PiBsZWZ0IF4gcmlnaHQ7CgogIEBvdmVycmlkZQogIGFwcGx5KGxlZnQsIHJpZ2h0KSA9PiBsZWZ0IF4gcmlnaHQ7Cn0KCmNsYXNzIFNoaWZ0TGVmdE9wZXJhdGlvbiBleHRlbmRzIEJpbmFyeUJpdE9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnPDwnOwoKICBjb25zdCBTaGlmdExlZnRPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgQmlnSW50IGZvbGRJbnRzKEJpZ0ludCBsZWZ0LCBCaWdJbnQgcmlnaHQpIHsKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBmaW5kIGEgYmV0dGVyIHdheSB0byBndWFyZCBhZ2FpbnN0IGV4Y2Vzc2l2ZSBzaGlmdHMgdG8KICAgIC8vIHRoZSBsZWZ0LgogICAgaWYgKHJpZ2h0ID4gbmV3IEJpZ0ludC5mcm9tKDEwMCkgfHwgcmlnaHQgPCBCaWdJbnQuemVybykgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbGVmdCA8PCByaWdodC50b0ludCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQgPDwgcmlnaHQ7Cn0KCmNsYXNzIFNoaWZ0UmlnaHRPcGVyYXRpb24gZXh0ZW5kcyBCaW5hcnlCaXRPcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJz4+JzsKCiAgY29uc3QgU2hpZnRSaWdodE9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBsZWZ0LCBDb25zdGFudFZhbHVlIHJpZ2h0KSB7CiAgICAvLyBUcnVuY2F0ZSB0aGUgaW5wdXQgdmFsdWUgdG8gMzIgYml0cyBpZiBuZWNlc3NhcnkuCiAgICBpZiAobGVmdC5pc0ludCkgewogICAgICBJbnRDb25zdGFudFZhbHVlIGludENvbnN0YW50ID0gbGVmdDsKICAgICAgQmlnSW50IHZhbHVlID0gaW50Q29uc3RhbnQuaW50VmFsdWU7CiAgICAgIEJpZ0ludCB0cnVuY2F0ZWRWYWx1ZSA9IHZhbHVlICYgX0JJVFMzMjsKICAgICAgaWYgKHZhbHVlIDwgQmlnSW50Lnplcm8pIHsKICAgICAgICAvLyBTaWduLWV4dGVuZCBpZiB0aGUgaW5wdXQgd2FzIG5lZ2F0aXZlLiBUaGUgY3VycmVudCBzZW1hbnRpY3MgZG9uJ3QKICAgICAgICAvLyBtYWtlIG11Y2ggc2Vuc2UsIHNpbmNlIHdlIG9ubHkgbG9vayBhdCBiaXQgMzEuCiAgICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IHdlIHNob3VsZCB0cmVhdCB0aGUgaW5wdXQgdG8gcmlnaHQgc2hpZnRzIGFzCiAgICAgICAgLy8gdW5zaWduZWQuCgogICAgICAgIC8vIEEgMzIgYml0IGNvbXBsZW1lbnQtdHdvIHZhbHVlIHggY2FuIGJlIGNvbXB1dGVkIGJ5OgogICAgICAgIC8vICAgIHhfdSAtIDJeMzIgKHdoZXJlIHhfdSBpcyBpdHMgdW5zaWduZWQgcmVwcmVzZW50YXRpb24pLgogICAgICAgIC8vIEV4YW1wbGU6IDB4RkZGRkZGRkYgLSAweDEwMDAwMDAwMCA9PiAtMS4KICAgICAgICAvLyBXZSBzaW1wbHkgYW5kIHdpdGggdGhlIHNpZ24tYml0IGFuZCBtdWx0aXBseSBieSB0d28uIElmIHRoZSBzaWduLWJpdAogICAgICAgIC8vIHdhcyBzZXQsIHRoZW4gdGhlIHJlc3VsdCBpcyAwLiBPdGhlcndpc2UgaXQgd2lsbCBiZWNvbWUgMl4zMi4KICAgICAgICBmaW5hbCBCaWdJbnQgU0lHTl9CSVQgPSBuZXcgQmlnSW50LmZyb20oMHg4MDAwMDAwMCk7CiAgICAgICAgdHJ1bmNhdGVkVmFsdWUgLT0gQmlnSW50LnR3byAqICh0cnVuY2F0ZWRWYWx1ZSAmIFNJR05fQklUKTsKICAgICAgfQogICAgICBpZiAodmFsdWUgIT0gdHJ1bmNhdGVkVmFsdWUpIHsKICAgICAgICBsZWZ0ID0gY3JlYXRlSW50KHRydW5jYXRlZFZhbHVlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1cGVyLmZvbGQobGVmdCwgcmlnaHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQmlnSW50IGZvbGRJbnRzKEJpZ0ludCBsZWZ0LCBCaWdJbnQgcmlnaHQpIHsKICAgIGlmIChyaWdodCA8IEJpZ0ludC56ZXJvKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBsZWZ0ID4+IHJpZ2h0LnRvSW50KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gbGVmdCA+PiByaWdodDsKfQoKYWJzdHJhY3QgY2xhc3MgQmluYXJ5Qm9vbE9wZXJhdGlvbiBpbXBsZW1lbnRzIEJpbmFyeU9wZXJhdGlvbiB7CiAgY29uc3QgQmluYXJ5Qm9vbE9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBsZWZ0LCBDb25zdGFudFZhbHVlIHJpZ2h0KSB7CiAgICBpZiAobGVmdC5pc0Jvb2wgJiYgcmlnaHQuaXNCb29sKSB7CiAgICAgIEJvb2xDb25zdGFudFZhbHVlIGxlZnRCb29sID0gbGVmdDsKICAgICAgQm9vbENvbnN0YW50VmFsdWUgcmlnaHRCb29sID0gcmlnaHQ7CiAgICAgIGJvb2wgcmVzdWx0VmFsdWUgPSBmb2xkQm9vbHMobGVmdEJvb2wuYm9vbFZhbHVlLCByaWdodEJvb2wuYm9vbFZhbHVlKTsKICAgICAgcmV0dXJuIGNyZWF0ZUJvb2wocmVzdWx0VmFsdWUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBib29sIGZvbGRCb29scyhib29sIGxlZnQsIGJvb2wgcmlnaHQpOwp9CgpjbGFzcyBCb29sZWFuQW5kT3BlcmF0aW9uIGV4dGVuZHMgQmluYXJ5Qm9vbE9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnJiYnOwoKICBjb25zdCBCb29sZWFuQW5kT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZm9sZEJvb2xzKGJvb2wgbGVmdCwgYm9vbCByaWdodCkgPT4gbGVmdCAmJiByaWdodDsKCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQgJiYgcmlnaHQ7Cn0KCmNsYXNzIEJvb2xlYW5Pck9wZXJhdGlvbiBleHRlbmRzIEJpbmFyeUJvb2xPcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJ3x8JzsKCiAgY29uc3QgQm9vbGVhbk9yT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZm9sZEJvb2xzKGJvb2wgbGVmdCwgYm9vbCByaWdodCkgPT4gbGVmdCB8fCByaWdodDsKCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQgfHwgcmlnaHQ7Cn0KCmFic3RyYWN0IGNsYXNzIEFyaXRobWV0aWNOdW1PcGVyYXRpb24gaW1wbGVtZW50cyBCaW5hcnlPcGVyYXRpb24gewogIGNvbnN0IEFyaXRobWV0aWNOdW1PcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBmb2xkKENvbnN0YW50VmFsdWUgbGVmdCwgQ29uc3RhbnRWYWx1ZSByaWdodCkgewogICAgQ29uc3RhbnRWYWx1ZSBfZm9sZChDb25zdGFudFZhbHVlIGxlZnQsIENvbnN0YW50VmFsdWUgcmlnaHQpIHsKICAgICAgaWYgKGxlZnQuaXNOdW0gJiYgcmlnaHQuaXNOdW0pIHsKICAgICAgICBOdW1Db25zdGFudFZhbHVlIGxlZnROdW0gPSBsZWZ0OwogICAgICAgIE51bUNvbnN0YW50VmFsdWUgcmlnaHROdW0gPSByaWdodDsKICAgICAgICB2YXIgZm9sZGVkVmFsdWU7CiAgICAgICAgaWYgKGxlZnQuaXNJbnQgJiYgcmlnaHQuaXNJbnQpIHsKICAgICAgICAgIEludENvbnN0YW50VmFsdWUgbGVmdEludCA9IGxlZnROdW07CiAgICAgICAgICBJbnRDb25zdGFudFZhbHVlIHJpZ2h0SW50ID0gcmlnaHROdW07CiAgICAgICAgICBmb2xkZWRWYWx1ZSA9IGZvbGRJbnRzKGxlZnRJbnQuaW50VmFsdWUsIHJpZ2h0SW50LmludFZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9sZGVkVmFsdWUgPSBmb2xkTnVtcyhsZWZ0TnVtLmRvdWJsZVZhbHVlLCByaWdodE51bS5kb3VibGVWYWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8vIEEgZGl2aXNpb24gYnkgMCBtZWFucyB0aGF0IHdlIG1pZ2h0IG5vdCBoYXZlIGEgZm9sZGVkIHZhbHVlLgogICAgICAgIGlmIChmb2xkZWRWYWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICBpZiAobGVmdC5pc0ludCAmJiByaWdodC5pc0ludCAmJiAhaXNEaXZpZGUoKSB8fCBpc1RydW5jYXRpbmdEaXZpZGUoKSkgewogICAgICAgICAgYXNzZXJ0KGZvbGRlZFZhbHVlIGlzIEJpZ0ludCk7CiAgICAgICAgICByZXR1cm4gY3JlYXRlSW50KGZvbGRlZFZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGNyZWF0ZURvdWJsZShmb2xkZWRWYWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIENvbnN0YW50VmFsdWUgcmVzdWx0ID0gX2ZvbGQobGVmdCwgcmlnaHQpOwogICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXR1cm4gcmVzdWx0OwogICAgcmV0dXJuIF9jb252ZXJ0VG9KYXZhU2NyaXB0Q29uc3RhbnQocmVzdWx0KTsKICB9CgogIGJvb2wgaXNEaXZpZGUoKSA9PiBmYWxzZTsKICBib29sIGlzVHJ1bmNhdGluZ0RpdmlkZSgpID0+IGZhbHNlOwogIGZvbGRJbnRzKEJpZ0ludCBsZWZ0LCBCaWdJbnQgcmlnaHQpOwogIGZvbGROdW1zKG51bSBsZWZ0LCBudW0gcmlnaHQpOwp9CgpjbGFzcyBTdWJ0cmFjdE9wZXJhdGlvbiBleHRlbmRzIEFyaXRobWV0aWNOdW1PcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJy0nOwoKICBjb25zdCBTdWJ0cmFjdE9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBCaWdJbnQgZm9sZEludHMoQmlnSW50IGxlZnQsIEJpZ0ludCByaWdodCkgPT4gbGVmdCAtIHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBudW0gZm9sZE51bXMobnVtIGxlZnQsIG51bSByaWdodCkgPT4gbGVmdCAtIHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gbGVmdCAtIHJpZ2h0Owp9CgpjbGFzcyBNdWx0aXBseU9wZXJhdGlvbiBleHRlbmRzIEFyaXRobWV0aWNOdW1PcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJyonOwoKICBjb25zdCBNdWx0aXBseU9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBCaWdJbnQgZm9sZEludHMoQmlnSW50IGxlZnQsIEJpZ0ludCByaWdodCkgPT4gbGVmdCAqIHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBudW0gZm9sZE51bXMobnVtIGxlZnQsIG51bSByaWdodCkgPT4gbGVmdCAqIHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gbGVmdCAqIHJpZ2h0Owp9CgpjbGFzcyBNb2R1bG9PcGVyYXRpb24gZXh0ZW5kcyBBcml0aG1ldGljTnVtT3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICclJzsKCiAgY29uc3QgTW9kdWxvT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIEJpZ0ludCBmb2xkSW50cyhCaWdJbnQgbGVmdCwgQmlnSW50IHJpZ2h0KSB7CiAgICBpZiAocmlnaHQgPT0gQmlnSW50Lnplcm8pIHJldHVybiBudWxsOwogICAgcmV0dXJuIGxlZnQgJSByaWdodDsKICB9CgogIEBvdmVycmlkZQogIG51bSBmb2xkTnVtcyhudW0gbGVmdCwgbnVtIHJpZ2h0KSA9PiBsZWZ0ICUgcmlnaHQ7CgogIEBvdmVycmlkZQogIGFwcGx5KGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ICUgcmlnaHQ7Cn0KCmNsYXNzIFJlbWFpbmRlck9wZXJhdGlvbiBleHRlbmRzIEFyaXRobWV0aWNOdW1PcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJ3JlbWFpbmRlcic7CgogIGNvbnN0IFJlbWFpbmRlck9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBCaWdJbnQgZm9sZEludHMoQmlnSW50IGxlZnQsIEJpZ0ludCByaWdodCkgewogICAgaWYgKHJpZ2h0ID09IEJpZ0ludC56ZXJvKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBsZWZ0LnJlbWFpbmRlcihyaWdodCk7CiAgfQoKICBAb3ZlcnJpZGUKICBudW0gZm9sZE51bXMobnVtIGxlZnQsIG51bSByaWdodCkgPT4gbGVmdC5yZW1haW5kZXIocmlnaHQpOwoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gbGVmdC5yZW1haW5kZXIocmlnaHQpOwp9CgpjbGFzcyBUcnVuY2F0aW5nRGl2aWRlT3BlcmF0aW9uIGV4dGVuZHMgQXJpdGhtZXRpY051bU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnfi8nOwoKICBjb25zdCBUcnVuY2F0aW5nRGl2aWRlT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIEJpZ0ludCBmb2xkSW50cyhCaWdJbnQgbGVmdCwgQmlnSW50IHJpZ2h0KSB7CiAgICBpZiAocmlnaHQgPT0gQmlnSW50Lnplcm8pIHJldHVybiBudWxsOwogICAgcmV0dXJuIGxlZnQgfi8gcmlnaHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBCaWdJbnQgZm9sZE51bXMobnVtIGxlZnQsIG51bSByaWdodCkgewogICAgbnVtIHJhdGlvID0gbGVmdCAvIHJpZ2h0OwogICAgaWYgKHJhdGlvLmlzTmFOIHx8IHJhdGlvLmlzSW5maW5pdGUpIHJldHVybiBudWxsOwogICAgcmV0dXJuIG5ldyBCaWdJbnQuZnJvbShyYXRpby50cnVuY2F0ZSgpLnRvSW50KCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQgfi8gcmlnaHQ7CgogIEBvdmVycmlkZQogIGJvb2wgaXNUcnVuY2F0aW5nRGl2aWRlKCkgPT4gdHJ1ZTsKfQoKY2xhc3MgRGl2aWRlT3BlcmF0aW9uIGV4dGVuZHMgQXJpdGhtZXRpY051bU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnLyc7CgogIGNvbnN0IERpdmlkZU9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBkb3VibGUgZm9sZEludHMoQmlnSW50IGxlZnQsIEJpZ0ludCByaWdodCkgPT4gbGVmdCAvIHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBudW0gZm9sZE51bXMobnVtIGxlZnQsIG51bSByaWdodCkgPT4gbGVmdCAvIHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBib29sIGlzRGl2aWRlKCkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQgLyByaWdodDsKfQoKY2xhc3MgQWRkT3BlcmF0aW9uIGltcGxlbWVudHMgQmluYXJ5T3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICcrJzsKCiAgY29uc3QgQWRkT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZm9sZChDb25zdGFudFZhbHVlIGxlZnQsIENvbnN0YW50VmFsdWUgcmlnaHQpIHsKICAgIENvbnN0YW50VmFsdWUgX2ZvbGQoQ29uc3RhbnRWYWx1ZSBsZWZ0LCBDb25zdGFudFZhbHVlIHJpZ2h0KSB7CiAgICAgIGlmIChsZWZ0LmlzSW50ICYmIHJpZ2h0LmlzSW50KSB7CiAgICAgICAgSW50Q29uc3RhbnRWYWx1ZSBsZWZ0SW50ID0gbGVmdDsKICAgICAgICBJbnRDb25zdGFudFZhbHVlIHJpZ2h0SW50ID0gcmlnaHQ7CiAgICAgICAgQmlnSW50IHJlc3VsdCA9IGxlZnRJbnQuaW50VmFsdWUgKyByaWdodEludC5pbnRWYWx1ZTsKICAgICAgICByZXR1cm4gY3JlYXRlSW50KHJlc3VsdCk7CiAgICAgIH0gZWxzZSBpZiAobGVmdC5pc051bSAmJiByaWdodC5pc051bSkgewogICAgICAgIE51bUNvbnN0YW50VmFsdWUgbGVmdE51bSA9IGxlZnQ7CiAgICAgICAgTnVtQ29uc3RhbnRWYWx1ZSByaWdodE51bSA9IHJpZ2h0OwogICAgICAgIGRvdWJsZSByZXN1bHQgPSBsZWZ0TnVtLmRvdWJsZVZhbHVlICsgcmlnaHROdW0uZG91YmxlVmFsdWU7CiAgICAgICAgcmV0dXJuIGNyZWF0ZURvdWJsZShyZXN1bHQpOwogICAgICB9IGVsc2UgaWYgKGxlZnQuaXNTdHJpbmcgJiYgcmlnaHQuaXNTdHJpbmcpIHsKICAgICAgICBTdHJpbmdDb25zdGFudFZhbHVlIGxlZnRTdHJpbmcgPSBsZWZ0OwogICAgICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgcmlnaHRTdHJpbmcgPSByaWdodDsKICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbGVmdFN0cmluZy5zdHJpbmdWYWx1ZSArIHJpZ2h0U3RyaW5nLnN0cmluZ1ZhbHVlOwogICAgICAgIHJldHVybiBjcmVhdGVTdHJpbmcocmVzdWx0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQoKICAgIENvbnN0YW50VmFsdWUgcmVzdWx0ID0gX2ZvbGQobGVmdCwgcmlnaHQpOwogICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5pc051bSkgewogICAgICByZXR1cm4gX2NvbnZlcnRUb0phdmFTY3JpcHRDb25zdGFudChyZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIGFwcGx5KGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ICsgcmlnaHQ7Cn0KCmFic3RyYWN0IGNsYXNzIFJlbGF0aW9uYWxOdW1PcGVyYXRpb24gaW1wbGVtZW50cyBCaW5hcnlPcGVyYXRpb24gewogIGNvbnN0IFJlbGF0aW9uYWxOdW1PcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBmb2xkKENvbnN0YW50VmFsdWUgbGVmdCwgQ29uc3RhbnRWYWx1ZSByaWdodCkgewogICAgaWYgKCFsZWZ0LmlzTnVtIHx8ICFyaWdodC5pc051bSkgcmV0dXJuIG51bGw7CiAgICBib29sIGZvbGRlZFZhbHVlOwogICAgaWYgKGxlZnQuaXNJbnQgJiYgcmlnaHQuaXNJbnQpIHsKICAgICAgSW50Q29uc3RhbnRWYWx1ZSBsZWZ0SW50ID0gbGVmdDsKICAgICAgSW50Q29uc3RhbnRWYWx1ZSByaWdodEludCA9IHJpZ2h0OwogICAgICBmb2xkZWRWYWx1ZSA9IGZvbGRJbnRzKGxlZnRJbnQuaW50VmFsdWUsIHJpZ2h0SW50LmludFZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIE51bUNvbnN0YW50VmFsdWUgbGVmdE51bSA9IGxlZnQ7CiAgICAgIE51bUNvbnN0YW50VmFsdWUgcmlnaHROdW0gPSByaWdodDsKICAgICAgZm9sZGVkVmFsdWUgPSBmb2xkTnVtcyhsZWZ0TnVtLmRvdWJsZVZhbHVlLCByaWdodE51bS5kb3VibGVWYWx1ZSk7CiAgICB9CiAgICBhc3NlcnQoZm9sZGVkVmFsdWUgIT0gbnVsbCk7CiAgICByZXR1cm4gY3JlYXRlQm9vbChmb2xkZWRWYWx1ZSk7CiAgfQoKICBib29sIGZvbGRJbnRzKEJpZ0ludCBsZWZ0LCBCaWdJbnQgcmlnaHQpOwogIGJvb2wgZm9sZE51bXMobnVtIGxlZnQsIG51bSByaWdodCk7Cn0KCmNsYXNzIExlc3NPcGVyYXRpb24gZXh0ZW5kcyBSZWxhdGlvbmFsTnVtT3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICc8JzsKCiAgY29uc3QgTGVzc09wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBib29sIGZvbGRJbnRzKEJpZ0ludCBsZWZ0LCBCaWdJbnQgcmlnaHQpID0+IGxlZnQgPCByaWdodDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBmb2xkTnVtcyhudW0gbGVmdCwgbnVtIHJpZ2h0KSA9PiBsZWZ0IDwgcmlnaHQ7CgogIEBvdmVycmlkZQogIGFwcGx5KGxlZnQsIHJpZ2h0KSA9PiBsZWZ0IDwgcmlnaHQ7Cn0KCmNsYXNzIExlc3NFcXVhbE9wZXJhdGlvbiBleHRlbmRzIFJlbGF0aW9uYWxOdW1PcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJzw9JzsKCiAgY29uc3QgTGVzc0VxdWFsT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZm9sZEludHMoQmlnSW50IGxlZnQsIEJpZ0ludCByaWdodCkgPT4gbGVmdCA8PSByaWdodDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBmb2xkTnVtcyhudW0gbGVmdCwgbnVtIHJpZ2h0KSA9PiBsZWZ0IDw9IHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gbGVmdCA8PSByaWdodDsKfQoKY2xhc3MgR3JlYXRlck9wZXJhdGlvbiBleHRlbmRzIFJlbGF0aW9uYWxOdW1PcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJz4nOwoKICBjb25zdCBHcmVhdGVyT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZm9sZEludHMoQmlnSW50IGxlZnQsIEJpZ0ludCByaWdodCkgPT4gbGVmdCA+IHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBib29sIGZvbGROdW1zKG51bSBsZWZ0LCBudW0gcmlnaHQpID0+IGxlZnQgPiByaWdodDsKCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQgPiByaWdodDsKfQoKY2xhc3MgR3JlYXRlckVxdWFsT3BlcmF0aW9uIGV4dGVuZHMgUmVsYXRpb25hbE51bU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnPj0nOwoKICBjb25zdCBHcmVhdGVyRXF1YWxPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBmb2xkSW50cyhCaWdJbnQgbGVmdCwgQmlnSW50IHJpZ2h0KSA9PiBsZWZ0ID49IHJpZ2h0OwoKICBAb3ZlcnJpZGUKICBib29sIGZvbGROdW1zKG51bSBsZWZ0LCBudW0gcmlnaHQpID0+IGxlZnQgPj0gcmlnaHQ7CgogIEBvdmVycmlkZQogIGFwcGx5KGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ID49IHJpZ2h0Owp9CgpjbGFzcyBFcXVhbHNPcGVyYXRpb24gaW1wbGVtZW50cyBCaW5hcnlPcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJz09JzsKCiAgY29uc3QgRXF1YWxzT3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZm9sZChDb25zdGFudFZhbHVlIGxlZnQsIENvbnN0YW50VmFsdWUgcmlnaHQpIHsKICAgIC8vIE51bWJlcnMgbmVlZCB0byBiZSB0cmVhdGVkIHNwZWNpYWxseSBiZWNhdXNlOiBOYU4gIT0gTmFOLCAtMC4wID09IDAuMCwKICAgIC8vIGFuZCAxID09IDEuMC4KICAgIGlmIChsZWZ0LmlzSW50ICYmIHJpZ2h0LmlzSW50KSB7CiAgICAgIEludENvbnN0YW50VmFsdWUgbGVmdEludCA9IGxlZnQ7CiAgICAgIEludENvbnN0YW50VmFsdWUgcmlnaHRJbnQgPSByaWdodDsKICAgICAgYm9vbCByZXN1bHQgPSBsZWZ0SW50LmludFZhbHVlID09IHJpZ2h0SW50LmludFZhbHVlOwogICAgICByZXR1cm4gY3JlYXRlQm9vbChyZXN1bHQpOwogICAgfQoKICAgIGlmIChsZWZ0LmlzTnVtICYmIHJpZ2h0LmlzTnVtKSB7CiAgICAgIE51bUNvbnN0YW50VmFsdWUgbGVmdE51bSA9IGxlZnQ7CiAgICAgIE51bUNvbnN0YW50VmFsdWUgcmlnaHROdW0gPSByaWdodDsKICAgICAgYm9vbCByZXN1bHQgPSBsZWZ0TnVtLmRvdWJsZVZhbHVlID09IHJpZ2h0TnVtLmRvdWJsZVZhbHVlOwogICAgICByZXR1cm4gY3JlYXRlQm9vbChyZXN1bHQpOwogICAgfQoKICAgIGlmIChsZWZ0LmlzQ29uc3RydWN0ZWRPYmplY3QpIHsKICAgICAgaWYgKHJpZ2h0LmlzTnVsbCkgewogICAgICAgIHJldHVybiBjcmVhdGVCb29sKGZhbHNlKTsKICAgICAgfQogICAgICAvLyBVbmxlc3Mgd2Uga25vdyB0aGF0IHRoZSB1c2VyLWRlZmluZWQgb2JqZWN0IGRvZXMgbm90IGltcGxlbWVudCB0aGUKICAgICAgLy8gZXF1YWxpdHkgb3BlcmF0b3Igd2UgY2Fubm90IGZvbGQgaGVyZS4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcmV0dXJuIGNyZWF0ZUJvb2wobGVmdCA9PSByaWdodCk7CiAgfQoKICBAb3ZlcnJpZGUKICBhcHBseShsZWZ0LCByaWdodCkgPT4gbGVmdCA9PSByaWdodDsKfQoKY2xhc3MgSWRlbnRpdHlPcGVyYXRpb24gaW1wbGVtZW50cyBCaW5hcnlPcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJz09PSc7CgogIGNvbnN0IElkZW50aXR5T3BlcmF0aW9uKCk7CgogIEBvdmVycmlkZQogIEJvb2xDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBsZWZ0LCBDb25zdGFudFZhbHVlIHJpZ2h0KSB7CiAgICBCb29sQ29uc3RhbnRWYWx1ZSBfZm9sZChDb25zdGFudFZhbHVlIGxlZnQsIENvbnN0YW50VmFsdWUgcmlnaHQpIHsKICAgICAgLy8gSW4gb3JkZXIgdG8gcHJlc2VydmUgcnVudGltZSBzZW1hbnRpY3Mgd2hpY2ggc2F5cyB0aGF0IE5hTiAhPT0gTmFOCiAgICAgIC8vIGRvbid0IGNvbnN0YW50IGZvbGQgTmFOID09PSBOYU4uIE90aGVyd2lzZSB0aGUgb3V0cHV0IGRlcGVuZHMgb24KICAgICAgLy8gaW5saW5lZCB2YXJpYWJsZXMgYW5kIG90aGVyIG9wdGltaXphdGlvbnMuCiAgICAgIGlmIChsZWZ0LmlzTmFOICYmIHJpZ2h0LmlzTmFOKSByZXR1cm4gbmV3IEZhbHNlQ29uc3RhbnRWYWx1ZSgpOwogICAgICByZXR1cm4gY3JlYXRlQm9vbChsZWZ0ID09IHJpZ2h0KTsKICAgIH0KCiAgICBCb29sQ29uc3RhbnRWYWx1ZSByZXN1bHQgPSBfZm9sZChsZWZ0LCByaWdodCk7CiAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmJvb2xWYWx1ZSkgcmV0dXJuIHJlc3VsdDsKICAgIC8vIEluIEphdmFTY3JpcHQgLTAuMCA9PT0gMCBhbmQgYWxsIGRvdWJsZXMgYXJlIGVxdWFsIHRvIHRoZWlyIGludGVnZXIKICAgIC8vIHZhbHVlcy4gRnVydGhlcm1vcmUgTmFOICE9PSBOYU4uCiAgICBpZiAobGVmdC5pc0ludCAmJiByaWdodC5pc0ludCkgewogICAgICBJbnRDb25zdGFudFZhbHVlIGxlZnRJbnQgPSBsZWZ0OwogICAgICBJbnRDb25zdGFudFZhbHVlIHJpZ2h0SW50ID0gcmlnaHQ7CiAgICAgIHJldHVybiBuZXcgQm9vbENvbnN0YW50VmFsdWUobGVmdEludC5pbnRWYWx1ZSA9PSByaWdodEludC5pbnRWYWx1ZSk7CiAgICB9CiAgICBpZiAobGVmdC5pc051bSAmJiByaWdodC5pc051bSkgewogICAgICBOdW1Db25zdGFudFZhbHVlIGxlZnROdW0gPSBsZWZ0OwogICAgICBOdW1Db25zdGFudFZhbHVlIHJpZ2h0TnVtID0gcmlnaHQ7CiAgICAgIGRvdWJsZSBsZWZ0RG91YmxlID0gbGVmdE51bS5kb3VibGVWYWx1ZTsKICAgICAgZG91YmxlIHJpZ2h0RG91YmxlID0gcmlnaHROdW0uZG91YmxlVmFsdWU7CiAgICAgIHJldHVybiBuZXcgQm9vbENvbnN0YW50VmFsdWUobGVmdERvdWJsZSA9PSByaWdodERvdWJsZSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGlkZW50aWNhbChsZWZ0LCByaWdodCk7Cn0KCmNsYXNzIElmTnVsbE9wZXJhdGlvbiBpbXBsZW1lbnRzIEJpbmFyeU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAnPz8nOwoKICBjb25zdCBJZk51bGxPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBmb2xkKENvbnN0YW50VmFsdWUgbGVmdCwgQ29uc3RhbnRWYWx1ZSByaWdodCkgewogICAgaWYgKGxlZnQuaXNOdWxsKSByZXR1cm4gcmlnaHQ7CiAgICByZXR1cm4gbGVmdDsKICB9CgogIEBvdmVycmlkZQogIGFwcGx5KGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ID8/IHJpZ2h0Owp9CgpjbGFzcyBDb2RlVW5pdEF0T3BlcmF0aW9uIGltcGxlbWVudHMgQmluYXJ5T3BlcmF0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICdjaGFyQ29kZUF0JzsKCiAgY29uc3QgQ29kZVVuaXRBdE9wZXJhdGlvbigpOwoKICBAb3ZlcnJpZGUKICBJbnRDb25zdGFudFZhbHVlIGZvbGQoQ29uc3RhbnRWYWx1ZSBsZWZ0LCBDb25zdGFudFZhbHVlIHJpZ2h0KSB7CiAgICBpZiAobGVmdC5pc1N0cmluZyAmJiByaWdodC5pc0ludCkgewogICAgICBTdHJpbmdDb25zdGFudFZhbHVlIHN0cmluZ0NvbnN0YW50ID0gbGVmdDsKICAgICAgSW50Q29uc3RhbnRWYWx1ZSBpbmRleENvbnN0YW50ID0gcmlnaHQ7CiAgICAgIFN0cmluZyBzdHJpbmcgPSBzdHJpbmdDb25zdGFudC5zdHJpbmdWYWx1ZTsKICAgICAgaW50IGluZGV4ID0gaW5kZXhDb25zdGFudC5pbnRWYWx1ZS50b0ludCgpOwogICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHN0cmluZy5sZW5ndGgpIHJldHVybiBudWxsOwogICAgICBpbnQgdmFsdWUgPSBzdHJpbmcuY29kZVVuaXRBdChpbmRleCk7CiAgICAgIHJldHVybiBjcmVhdGVJbnRGcm9tSW50KHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgYXBwbHkobGVmdCwgcmlnaHQpID0+IGxlZnQuY29kZVVuaXRBdChyaWdodCk7Cn0KCmNsYXNzIFJvdW5kT3BlcmF0aW9uIGltcGxlbWVudHMgVW5hcnlPcGVyYXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gJ3JvdW5kJzsKCiAgY29uc3QgUm91bmRPcGVyYXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBmb2xkKENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgIC8vIEJlIGNhcmVmdWwgdG8gcm91bmQoKSBvbmx5IHZhbHVlcyB0aGF0IGRvIG5vdCB0aHJvdyBvbiBlaXRoZXIgdGhlIGhvc3Qgb3IKICAgIC8vIHRhcmdldCBwbGF0Zm9ybS4KICAgIENvbnN0YW50VmFsdWUgdHJ5VG9Sb3VuZChkb3VibGUgdmFsdWUpIHsKICAgICAgLy8gRHVlIHRvIGRpZmZlcmVuY2VzIGJldHdlZW4gYnJvd3NlcnMsIG9ubHkgJ3JvdW5kJyBlYXN5IGNhc2VzLiBBdm9pZAogICAgICAvLyBjYXNlcyB3aGVyZSBudWRnaW5nIHRoZSB2YWx1ZSB1cCBvciBkb3duIGNoYW5nZXMgdGhlIGFuc3dlci4KICAgICAgLy8gMTMgZGlnaXRzIGlzIHNhZmVseSB3aXRoaW4gdGhlIH4xNSBkaWdpdCBwcmVjaXNpb24gb2YgZG91Ymxlcy4KICAgICAgY29uc3Qgc2V2ZXJhbFVMUCA9IDAuMDAwMDAwMDAwMDAwMTsKICAgICAgLy8gVXNlICdyb3VuZFRvRG91YmxlKCknIHRvIGF2b2lkIGV4Y2VwdGlvbnMgb24gcm91bmRpbmcgdGhlIG51ZGdlZCB2YWx1ZS4KICAgICAgZG91YmxlIHJvdW5kZWQgPSB2YWx1ZS5yb3VuZFRvRG91YmxlKCk7CiAgICAgIGRvdWJsZSByb3VuZGVkMSA9ICh2YWx1ZSAqICgxLjAgKyBzZXZlcmFsVUxQKSkucm91bmRUb0RvdWJsZSgpOwogICAgICBkb3VibGUgcm91bmRlZDIgPSAodmFsdWUgKiAoMS4wIC0gc2V2ZXJhbFVMUCkpLnJvdW5kVG9Eb3VibGUoKTsKICAgICAgaWYgKHJvdW5kZWQgIT0gcm91bmRlZDEgfHwgcm91bmRlZCAhPSByb3VuZGVkMikgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBfY29udmVydFRvSmF2YVNjcmlwdENvbnN0YW50KAogICAgICAgICAgbmV3IEludENvbnN0YW50VmFsdWUobmV3IEJpZ0ludC5mcm9tKHZhbHVlLnJvdW5kKCkpKSk7CiAgICB9CgogICAgaWYgKGNvbnN0YW50LmlzSW50KSB7CiAgICAgIEludENvbnN0YW50VmFsdWUgaW50Q29uc3RhbnQgPSBjb25zdGFudDsKICAgICAgZG91YmxlIHZhbHVlID0gaW50Q29uc3RhbnQuaW50VmFsdWUudG9Eb3VibGUoKTsKICAgICAgaWYgKHZhbHVlID49IC1kb3VibGUubWF4RmluaXRlICYmIHZhbHVlIDw9IGRvdWJsZS5tYXhGaW5pdGUpIHsKICAgICAgICByZXR1cm4gdHJ5VG9Sb3VuZCh2YWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjb25zdGFudC5pc0RvdWJsZSkgewogICAgICBEb3VibGVDb25zdGFudFZhbHVlIGRvdWJsZUNvbnN0YW50ID0gY29uc3RhbnQ7CiAgICAgIGRvdWJsZSB2YWx1ZSA9IGRvdWJsZUNvbnN0YW50LmRvdWJsZVZhbHVlOwogICAgICAvLyBOYU4gYW5kIGluZmluaXRpZXMgd2lsbCB0aHJvdy4KICAgICAgaWYgKHZhbHVlLmlzTmFOKSByZXR1cm4gbnVsbDsKICAgICAgaWYgKHZhbHVlLmlzSW5maW5pdGUpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gdHJ5VG9Sb3VuZCh2YWx1ZSk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmNsYXNzIFVuZm9sZGVkVW5hcnlPcGVyYXRpb24gaW1wbGVtZW50cyBVbmFyeU9wZXJhdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIGNvbnN0IFVuZm9sZGVkVW5hcnlPcGVyYXRpb24odGhpcy5uYW1lKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBmb2xkKENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgIHJldHVybiBudWxsOwogIH0KfQoKY2xhc3MgSmF2YVNjcmlwdFNldENvbnN0YW50IGV4dGVuZHMgU2V0Q29uc3RhbnRWYWx1ZSB7CiAgZmluYWwgTWFwQ29uc3RhbnRWYWx1ZSBlbnRyaWVzOwoKICBKYXZhU2NyaXB0U2V0Q29uc3RhbnQoSW50ZXJmYWNlVHlwZSB0eXBlLCB0aGlzLmVudHJpZXMpCiAgICAgIDogc3VwZXIodHlwZSwgZW50cmllcy5rZXlzKTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxDb25zdGFudFZhbHVlPiBnZXREZXBlbmRlbmNpZXMoKSA9PiBbZW50cmllc107Cn0KCmNsYXNzIEphdmFTY3JpcHRNYXBDb25zdGFudCBleHRlbmRzIE1hcENvbnN0YW50VmFsdWUgewogIC8vLyBUaGUgW1BST1RPX1BST1BFUlRZXSBtdXN0IG5vdCBiZSB1c2VkIGFzIG5vcm1hbCBwcm9wZXJ0eSBpbiBhbnkgSmF2YVNjcmlwdAogIC8vLyBvYmplY3QuIEl0IHdvdWxkIGNoYW5nZSB0aGUgcHJvdG90eXBlIGNoYWluLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgUFJPVE9fUFJPUEVSVFkgPSAiX19wcm90b19fIjsKCiAgLy8vIFRoZSBkYXJ0IGNsYXNzIGltcGxlbWVudGluZyBjb25zdGFudCBtYXAgbGl0ZXJhbHMuCiAgc3RhdGljIGNvbnN0IFN0cmluZyBEQVJUX0NMQVNTID0gIkNvbnN0YW50TWFwIjsKICBzdGF0aWMgY29uc3QgU3RyaW5nIERBUlRfU1RSSU5HX0NMQVNTID0gIkNvbnN0YW50U3RyaW5nTWFwIjsKICBzdGF0aWMgY29uc3QgU3RyaW5nIERBUlRfUFJPVE9fQ0xBU1MgPSAiQ29uc3RhbnRQcm90b01hcCI7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBEQVJUX0dFTkVSQUxfQ0xBU1MgPSAiR2VuZXJhbENvbnN0YW50TWFwIjsKICBzdGF0aWMgY29uc3QgU3RyaW5nIExFTkdUSF9OQU1FID0gIl9sZW5ndGgiOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgSlNfT0JKRUNUX05BTUUgPSAiX2pzT2JqZWN0IjsKICBzdGF0aWMgY29uc3QgU3RyaW5nIEtFWVNfTkFNRSA9ICJfa2V5cyI7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBQUk9UT19WQUxVRSA9ICJfcHJvdG9WYWx1ZSI7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBKU19EQVRBX05BTUUgPSAiX2pzRGF0YSI7CgogIGZpbmFsIExpc3RDb25zdGFudFZhbHVlIGtleUxpc3Q7CiAgZmluYWwgQ29uc3RhbnRWYWx1ZSBwcm90b1ZhbHVlOwogIGZpbmFsIGJvb2wgb25seVN0cmluZ0tleXM7CgogIEphdmFTY3JpcHRNYXBDb25zdGFudChJbnRlcmZhY2VUeXBlIHR5cGUsIExpc3RDb25zdGFudFZhbHVlIGtleUxpc3QsCiAgICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gdmFsdWVzLCB0aGlzLnByb3RvVmFsdWUsIHRoaXMub25seVN0cmluZ0tleXMpCiAgICAgIDogdGhpcy5rZXlMaXN0ID0ga2V5TGlzdCwKICAgICAgICBzdXBlcih0eXBlLCBrZXlMaXN0LmVudHJpZXMsIHZhbHVlcyk7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNNYXAgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxDb25zdGFudFZhbHVlPiBnZXREZXBlbmRlbmNpZXMoKSB7CiAgICBMaXN0PENvbnN0YW50VmFsdWU+IHJlc3VsdCA9IDxDb25zdGFudFZhbHVlPltdOwogICAgaWYgKG9ubHlTdHJpbmdLZXlzKSB7CiAgICAgIHJlc3VsdC5hZGQoa2V5TGlzdCk7CiAgICB9IGVsc2UgewogICAgICAvLyBBZGQgdGhlIGtleXMgaW5kaXZpZHVhbGx5IHRvIGF2b2lkIGdlbmVyYXRpbmcgYW4gdW51c2VkIGxpc3QgY29uc3RhbnQKICAgICAgLy8gZm9yIHRoZSBrZXlzLgogICAgICByZXN1bHQuYWRkQWxsKGtleXMpOwogICAgfQogICAgcmVzdWx0LmFkZEFsbCh2YWx1ZXMpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0Kg/4ATk48AUgcIQE2JCUhFgEtASIoKCYoMC4oJzQqLCguJCgsKCIuLjAsPDAmMQE7EDIpNgIBSxgtLDI7BkMwPiIvBiIxMyMeITkmQQgGBBMCASg7S04rPjMlSjtQKQFJPzQCAT0ERjMEMgRKJhYcIyEBOykwATs8ATw4ATc4ATpBQ0U7Ky4RBCACATo8STMaREYxUDMCARwjHh4iHiMqGxhFIAgNHkoZDQYEASsaHyoLSARGSEEkOwIBSUAyL0wXPjUCATUbJxUjFSASDRMEAgE4GyESIRchFyEVIRUiHyAUIRUhFSgYKRkhGCEZIBMiGCAWIhsgFCUVDRMEAgEbEwIBMj8uAgEzPz8WAgEyDBsBGwEMLxtNIisIL04yBhEEAgEyDCABGwEMLzIcMTEIHzc6CBMGARovMSMIBhwEAgEvDBsBGAEMLxsxMgYRBAIBPj8eAQxAQycpK0wuJwgTBgFLHCUGHSYGMhpOLAYTBAEuAgEzDBsBGwEMPgEMJgIBMgwbARoBDD4BDCYCATMMGwEbAQw+AQwmAgE2DBwBHgEML04RSiIEAQwnAgE3DBwBHwEMQDkWKysvIU46SBUBP0U0UEk9RAglKggGJAQBDC8qIgQBDCcCAUAfAQxAJykrTSYGEQQBKQIBOAwcAR8BDDoBDCcCATcMHAEeAQw6AQwnAgFDIgEMQEMnKSsZKS4wRxFNCkguUCkpESwKCBMGAS8nMQQBHCYnIQIBOQwbAR0BDD4BDDUBDCYCATkMGwEdAQw+AQw1AQwmAgE3DBsBGwEMLysZBAEMNQEMJgIBOgwjAR4BDC8rIgQBDD4BDC8CAUEMHAElAQwvKxoEAQwpHjY2BAEMJwEMJQIBNwwbARsBDD4BDDUBDBsBDCYCATAMGwEYAQxAQycpKz4iLikrRCU0LzFKJQ8VCAYBLyozBhMEAQwmAgFDIgEMQDIWJScpQw0nKUkGISQEASwmAgE1DBsBGQEMPAEMNgEMJgIBOgwcAR4BDD0BDDcBDCcCATgMGwEcAQw8AQw2AQwmAgE9DBwBIQEMPQEMNwEMJwIBMwwcARsBDEBOFSUnKTshBgElJylBIQYBJBoiCEwwEwYBJgQBDCcCATUMHQEdAQxER0xKNEYoBgEzO0soJScpSwYlJykvMT8GEwQBDDACATMMHAEbAQxAIxEEAQwnAgE3DCQBHwEMQygxLjIyPCwmBhEEAQwwAgExDB8BGgEML1EYLU1GSCpRLkZGQytBBgEaLzZFIggGHTUxKCQpIAYRBAIBOQwVASsBDC8RBAIBNyIBOiMBDDYCATdRMzQBOTI/PUEvNCszMAEjIh0BR0ggLgwaAQwqNBobDU8XGwYbEwQCATNwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb25zdGFudHMvY29uc3RhbnRfc3lzdGVtLmRhcnQ5c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0wAB1Py8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGpzX2JhY2tlbmQubmF0aXZlX2RhdGE7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IEVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9hbm5vdGF0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9rZXJuZWwvZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnIHNob3cgTmF0aXZlQmVoYXZpb3I7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKCi8vLyBCYXNpYyBpbmZvcm1hdGlvbiBmb3IgbmF0aXZlIGNsYXNzZXMgYW5kIGpzLWludGVyb3AgbGlicmFyaWVzIGFuZCBjbGFzc2VzLgovLy8KLy8vIFRoaXMgaW5mb3JtYXRpb24gaXMgY29tcHV0ZWQgZHVyaW5nIGxvYWRpbmcgdXNpbmcgW05hdGl2ZUJhc2ljRGF0YUJ1aWxkZXJdLgphYnN0cmFjdCBjbGFzcyBOYXRpdmVCYXNpY0RhdGEgewogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbTmF0aXZlQmFzaWNEYXRhXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IE5hdGl2ZUJhc2ljRGF0YS5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgICAgICBEYXRhU291cmNlIHNvdXJjZSwgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCkgPQogICAgICBOYXRpdmVCYXNpY0RhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZTsKCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbTmF0aXZlQmFzaWNEYXRhXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBjb3JyZXNwb25kcyB0byBhIG5hdGl2ZSBKYXZhU2NyaXB0IGNsYXNzLgogIC8vLwogIC8vLyBBIGNsYXNzIGlzIG1hcmtlZCBhcyBuYXRpdmUgZWl0aGVyIHRocm91Z2ggdGhlIGBATmF0aXZlKC4uLilgIGFubm90YXRpb24KICAvLy8gYWxsb3dlZCBmb3IgaW50ZXJuYWwgbGlicmFyaWVzIG9yIHZpYSB0aGUgdHlwZWQgSmF2YVNjcmlwdEludGVyb3AKICAvLy8gbWVjaGFuaXNtIGFsbG93ZWQgZm9yIHVzZXIgbGlicmFyaWVzLgogIGJvb2wgaXNOYXRpdmVDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIGxpc3Qgb2Ygbm9uLWRpcmVjdGl2ZSBuYXRpdmUgdGFnIHdvcmRzIGZvciBbY2xzXS4KICBMaXN0PFN0cmluZz4gZ2V0TmF0aXZlVGFnc09mQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtjbHNdIGhhcyBhIGAhbm9ubGVhZmAgdGFnIHdvcmQuCiAgYm9vbCBoYXNOYXRpdmVUYWdzRm9yY2VkTm9uTGVhZihDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VsZW1lbnRdIG9yIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzIGlzIG5hdGl2ZS4KICBib29sIGlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKENsYXNzRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYganMgaW50ZXJvcCBmZWF0dXJlcyBhcmUgdXNlZC4KICBib29sIGdldCBpc0pzSW50ZXJvcFVzZWQ7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gaXMgYSBKc0ludGVyb3AgbGlicmFyeS4KICBib29sIGlzSnNJbnRlcm9wTGlicmFyeShMaWJyYXJ5RW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VsZW1lbnRdIGlzIGEgSnNJbnRlcm9wIGNsYXNzLgogIGJvb2wgaXNKc0ludGVyb3BDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtlbGVtZW50XSBpcyBhIEpzSW50ZXJvcCBtZW1iZXIuCiAgYm9vbCBpc0pzSW50ZXJvcE1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCk7Cn0KCi8vLyBBZGRpdGlvbmFsIGVsZW1lbnQgaW5mb3JtYXRpb24gZm9yIG5hdGl2ZSBjbGFzc2VzIGFuZCBtZXRob2RzIGFuZCBqcy1pbnRlcm9wCi8vLyBtZXRob2RzLgovLy8KLy8vIFRoaXMgaW5mb3JtYXRpb24gaXMgY29tcHV0ZWQgZHVyaW5nIHJlc29sdXRpb24gdXNpbmcgW05hdGl2ZURhdGFCdWlsZGVyXS4KYWJzdHJhY3QgY2xhc3MgTmF0aXZlRGF0YSBleHRlbmRzIE5hdGl2ZUJhc2ljRGF0YSB7CiAgLy8vIERlc2VyaWFsaXplcyBhIFtOYXRpdmVEYXRhXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IE5hdGl2ZURhdGEucmVhZEZyb21EYXRhU291cmNlKAogICAgICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQpID0KICAgICAgTmF0aXZlRGF0YUltcGwucmVhZEZyb21EYXRhU291cmNlOwoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtOYXRpdmVEYXRhXSB0byBbc2lua10uCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gY29ycmVzcG9uZHMgdG8gYSBuYXRpdmUgSmF2YVNjcmlwdCBtZW1iZXIuCiAgLy8vCiAgLy8vIEEgbWVtYmVyIGlzIG1hcmtlZCBhcyBuYXRpdmUgZWl0aGVyIHRocm91Z2ggdGhlIG5hdGl2ZSBtZWNoYW5pc20KICAvLy8gKGBATmF0aXZlKC4uLilgIG9yIHRoZSBgbmF0aXZlYCBwc2V1ZG8ga2V5d29yZCkgYWxsb3dlZCBmb3IgaW50ZXJuYWwKICAvLy8gbGlicmFyaWVzIG9yIHZpYSB0aGUgdHlwZWQgSmF2YVNjcmlwdEludGVyb3AgbWVjaGFuaXNtIGFsbG93ZWQgZm9yIHVzZXIKICAvLy8gbGlicmFyaWVzLgogIGJvb2wgaXNOYXRpdmVNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyB0aGUgW05hdGl2ZUJlaGF2aW9yXSBmb3IgY2FsbGluZyB0aGUgbmF0aXZlIFttZXRob2RdLgogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZU1ldGhvZEJlaGF2aW9yKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCk7CgogIC8vLyBSZXR1cm5zIHRoZSBbTmF0aXZlQmVoYXZpb3JdIGZvciByZWFkaW5nIGZyb20gdGhlIG5hdGl2ZSBbZmllbGRdLgogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yKEZpZWxkRW50aXR5IGZpZWxkKTsKCiAgLy8vIFJldHVybnMgdGhlIFtOYXRpdmVCZWhhdmlvcl0gZm9yIHdyaXRpbmcgdG8gdGhlIG5hdGl2ZSBbZmllbGRdLgogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcihGaWVsZEVudGl0eSBmaWVsZCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgbmFtZSBvZiBbZWxlbWVudF0gaXMgZml4ZWQgZm9yIHRoZSBnZW5lcmF0ZWQKICAvLy8gSmF2YVNjcmlwdC4KICBib29sIGhhc0ZpeGVkQmFja2VuZE5hbWUoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gQ29tcHV0ZXMgdGhlIG5hbWUgZm9yIFtlbGVtZW50XSB0byB1c2UgaW4gdGhlIGdlbmVyYXRlZCBKYXZhU2NyaXB0LiBUaGlzCiAgLy8vIGlzIGVpdGhlciBnaXZlbiB0aHJvdWdoIGEgbmF0aXZlIGFubm90YXRpb24gb3IgYSBqcyBpbnRlcm9wIGFubm90YXRpb24uCiAgU3RyaW5nIGdldEZpeGVkQmFja2VuZE5hbWUoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gQ29tcHV0ZXMgdGhlIG5hbWUgcHJlZml4IGZvciBbZWxlbWVudF0gdG8gdXNlIGluIHRoZSBnZW5lcmF0ZWQgSmF2YVNjcmlwdC4KICAvLy8KICAvLy8gRm9yIHN0YXRpYyBhbmQgdG9wLWxldmVsIG1lbWJlcnMgYW5kIGNvbnN0cnVjdG9ycyB0aGlzIGlzIGJhc2VkIG9uIHRoZQogIC8vLyBKYXZhU2NyaXB0IG5hbWVzIGZvciB0aGUgbGlicmFyeSBhbmQvb3IgdGhlIGVuY2xvc2luZyBjbGFzcy4KICBTdHJpbmcgZ2V0Rml4ZWRCYWNrZW5kTWV0aG9kUGF0aChGdW5jdGlvbkVudGl0eSBlbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0pzSW50ZXJvcE1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSBleHBsaWNpdCBqcyBpbnRlcm9wIG5hbWUgZm9yIGxpYnJhcnkgW2VsZW1lbnRdLgogIFN0cmluZyBnZXRKc0ludGVyb3BMaWJyYXJ5TmFtZShMaWJyYXJ5RW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2VsZW1lbnRdIGhhcyBhbiBgQEFub255bW91c2AgYW5ub3RhdGlvbi4KICBib29sIGlzQW5vbnltb3VzSnNJbnRlcm9wQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSBleHBsaWNpdCBqcyBpbnRlcm9wIG5hbWUgZm9yIGNsYXNzIFtlbGVtZW50XS4KICBTdHJpbmcgZ2V0SnNJbnRlcm9wQ2xhc3NOYW1lKENsYXNzRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyB0aGUgZXhwbGljaXQganMgaW50ZXJvcCBuYW1lIGZvciBtZW1iZXIgW2VsZW1lbnRdLgogIFN0cmluZyBnZXRKc0ludGVyb3BNZW1iZXJOYW1lKE1lbWJlckVudGl0eSBlbGVtZW50KTsKCiAgLy8vIEFwcGx5IEpTJCBlc2NhcGluZyBzY2hlbWUgdG8gY29udmVydCBwb3NzaWJsZSBlc2NhcGVkIERhcnQgbmFtZXMgaW50bwogIC8vLyBKUyBuYW1lcy4KICBTdHJpbmcgY29tcHV0ZVVuZXNjYXBlZEpTSW50ZXJvcE5hbWUoU3RyaW5nIG5hbWUpOwp9CgphYnN0cmFjdCBjbGFzcyBOYXRpdmVCYXNpY0RhdGFCdWlsZGVyIHsKICAvLy8gU2V0cyB0aGUgbmF0aXZlIHRhZyBpbmZvIGZvciBbY2xzXS4KICAvLy8KICAvLy8gVGhlIHRhZyBpbmZvIHN0cmluZyBjb250YWlucyBjb21tYS1zZXBhcmF0ZWQgJ3dvcmRzJyB3aGljaCBhcmUgZWl0aGVyCiAgLy8vIGRpc3BhdGNoIHRhZ3MgKGhhdmluZyBKYXZhU2NyaXB0IGlkZW50aWZpZXIgc3ludGF4KSBhbmQgZGlyZWN0aXZlcyB0aGF0CiAgLy8vIGJlZ2luIHdpdGggYCFgLgogIHZvaWQgc2V0TmF0aXZlQ2xhc3NUYWdJbmZvKENsYXNzRW50aXR5IGNscywgU3RyaW5nIHRhZ0luZm8pOwoKICAvLy8gTWFya3MgW2VsZW1lbnRdIGFzIGFuIGV4cGxpY2l0IHBhcnQgb2YganMgaW50ZXJvcC4KICAvLy8KICAvLy8gSWYgW25hbWVdIGlzIHByb3ZpZGVkLCBpdCBzZXRzIHRoZSBleHBsaWNpdCBqcyBpbnRlcm9wIG5hbWUgZm9yIHRoZQogIC8vLyBsaWJyYXJ5IFtlbGVtZW50XSwgb3RoZXIgdGhlIGpzIGludGVyb3AgbmFtZSBpcyBleHBlY3RlZCB0byBiZSBjb21wdXRlZAogIC8vLyBsYXRlci4KICB2b2lkIG1hcmtBc0pzSW50ZXJvcExpYnJhcnkoTGlicmFyeUVudGl0eSBlbGVtZW50LCB7U3RyaW5nIG5hbWV9KTsKCiAgLy8vIE1hcmtzIFtlbGVtZW50XSBhcyBhbiBleHBsaWNpdCBwYXJ0IG9mIGpzIGludGVyb3AuCiAgLy8vCiAgLy8vIElmIFtuYW1lXSBpcyBwcm92aWRlZCwgaXQgc2V0cyB0aGUgZXhwbGljaXQganMgaW50ZXJvcCBuYW1lIGZvciB0aGUKICAvLy8gY2xhc3MgW2VsZW1lbnRdLCBvdGhlciB0aGUganMgaW50ZXJvcCBuYW1lIGlzIGV4cGVjdGVkIHRvIGJlIGNvbXB1dGVkCiAgLy8vIGxhdGVyLgogIHZvaWQgbWFya0FzSnNJbnRlcm9wQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCwKICAgICAge1N0cmluZyBuYW1lLCBib29sIGlzQW5vbnltb3VzOiBmYWxzZX0pOwoKICAvLy8gTWFya3MgW2VsZW1lbnRdIGFzIGFuIGV4cGxpY2l0IHBhcnQgb2YganMgaW50ZXJvcCBhbmQgc2V0cyB0aGUgZXhwbGljaXQganMKICAvLy8gaW50ZXJvcCBbbmFtZV0gZm9yIHRoZSBtZW1iZXIgW2VsZW1lbnRdLgogIHZvaWQgbWFya0FzSnNJbnRlcm9wTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50LCBTdHJpbmcgbmFtZSk7CgogIC8vLyBDcmVhdGVzIHRoZSBbTmF0aXZlQmFzaWNEYXRhXSBvYmplY3QgZm9yIHRoZSBkYXRhIGNvbGxlY3RlZCBpbiB0aGlzCiAgLy8vIGJ1aWxkZXIuCiAgTmF0aXZlQmFzaWNEYXRhIGNsb3NlKEVsZW1lbnRFbnZpcm9ubWVudCBlbnZpcm9ubWVudCk7Cn0KCmFic3RyYWN0IGNsYXNzIE5hdGl2ZURhdGFCdWlsZGVyIHsKICAvLy8gUmVnaXN0ZXJzIHRoZSBbYmVoYXZpb3JdIGZvciBjYWxsaW5nIHRoZSBuYXRpdmUgW21ldGhvZF0uCiAgdm9pZCBzZXROYXRpdmVNZXRob2RCZWhhdmlvcihGdW5jdGlvbkVudGl0eSBtZXRob2QsIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yKTsKCiAgLy8vIFJlZ2lzdGVycyB0aGUgW2JlaGF2aW9yXSBmb3IgcmVhZGluZyBmcm9tIHRoZSBuYXRpdmUgW2ZpZWxkXS4KICB2b2lkIHNldE5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yKEZpZWxkRW50aXR5IGZpZWxkLCBOYXRpdmVCZWhhdmlvciBiZWhhdmlvcik7CgogIC8vLyBSZWdpc3RlcnMgdGhlIFtiZWhhdmlvcl0gZm9yIHdyaXRpbmcgdG8gdGhlIG5hdGl2ZSBbZmllbGRdLgogIHZvaWQgc2V0TmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yKEZpZWxkRW50aXR5IGZpZWxkLCBOYXRpdmVCZWhhdmlvciBiZWhhdmlvcik7CgogIC8vLyBTZXRzIHRoZSBuYXRpdmUgW25hbWVdIGZvciB0aGUgbWVtYmVyIFtlbGVtZW50XS4KICAvLy8KICAvLy8gVGhpcyBuYW1lIGlzIHVzZWQgZm9yIFtlbGVtZW50XSBpbiB0aGUgZ2VuZXJhdGVkIEphdmFTY3JpcHQuCiAgdm9pZCBzZXROYXRpdmVNZW1iZXJOYW1lKE1lbWJlckVudGl0eSBlbGVtZW50LCBTdHJpbmcgbmFtZSk7CgogIC8vLyBDbG9zZXMgdGhpcyBidWlsZGVyIGFuZCBjcmVhdGVzIHRoZSByZXN1bHRpbmcgW05hdGl2ZURhdGFdIG9iamVjdC4KICBOYXRpdmVEYXRhIGNsb3NlKCk7Cn0KCmNsYXNzIE5hdGl2ZUJhc2ljRGF0YUJ1aWxkZXJJbXBsIGltcGxlbWVudHMgTmF0aXZlQmFzaWNEYXRhQnVpbGRlciB7CiAgYm9vbCBfY2xvc2VkID0gZmFsc2U7CgogIC8vLyBUYWcgaW5mbyBmb3IgbmF0aXZlIEphdmFTY3JpcHQgY2xhc3NlcyBuYW1lcy4gU2VlCiAgLy8vIFtzZXROYXRpdmVDbGFzc1RhZ0luZm9dLgogIE1hcDxDbGFzc0VudGl0eSwgTmF0aXZlQ2xhc3NUYWc+IG5hdGl2ZUNsYXNzVGFnSW5mbyA9CiAgICAgIDxDbGFzc0VudGl0eSwgTmF0aXZlQ2xhc3NUYWc+e307CgogIC8vLyBUaGUgSmF2YVNjcmlwdCBsaWJyYXJpZXMgaW1wbGVtZW50ZWQgdmlhIHR5cGVkIEphdmFTY3JpcHQgaW50ZXJvcC4KICBNYXA8TGlicmFyeUVudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BMaWJyYXJpZXMgPSA8TGlicmFyeUVudGl0eSwgU3RyaW5nPnt9OwoKICAvLy8gVGhlIEphdmFTY3JpcHQgY2xhc3NlcyBpbXBsZW1lbnRlZCB2aWEgdHlwZWQgSmF2YVNjcmlwdCBpbnRlcm9wLgogIE1hcDxDbGFzc0VudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BDbGFzc2VzID0gPENsYXNzRW50aXR5LCBTdHJpbmc+e307CgogIC8vLyBKYXZhU2NyaXB0IGludGVyb3AgY2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBgQGFub255bW91c2AKICBTZXQ8Q2xhc3NFbnRpdHk+IGFub255bW91c0pzSW50ZXJvcENsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICAvLy8gVGhlIEphdmFTY3JpcHQgbWVtYmVycyBpbXBsZW1lbnRlZCB2aWEgdHlwZWQgSmF2YVNjcmlwdCBpbnRlcm9wLgogIE1hcDxNZW1iZXJFbnRpdHksIFN0cmluZz4ganNJbnRlcm9wTWVtYmVycyA9IDxNZW1iZXJFbnRpdHksIFN0cmluZz57fTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXROYXRpdmVDbGFzc1RhZ0luZm8oQ2xhc3NFbnRpdHkgY2xzLCBTdHJpbmcgdGFnVGV4dCkgewogICAgYXNzZXJ0KAogICAgICAgICFfY2xvc2VkLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBjbHMsCiAgICAgICAgICAgICJOYXRpdmVCYXNpY0RhdGFCdWlsZGVyIGlzIGNsb3NlZC4gIgogICAgICAgICAgICAiVHJ5aW5nIHRvIG1hcmsgJGNscyBhcyBhIG5hdGl2ZSBjbGFzcy4iKSk7CgogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXNzZXJ0IHRoYXQgdGhpcyBpcyBvbmx5IGNhbGxlZCBvbmNlLiBUaGUgbWVtb3J5CiAgICAvLyBjb21waWxlciBjb3BpZXMgcHJlLXByb2Nlc3NlZCBlbGVtZW50cyBpbnRvIGEgbmV3IGNvbXBpbGVyIHRocm91Z2gKICAgIC8vIFtDb21waWxlci5vbkxpYnJhcnlTY2FubmVkXSBhbmQgdGhlcmVieSBjYXVzZXMgbXVsdGlwbGUgY2FsbHMgdG8gdGhpcwogICAgLy8gbWV0aG9kLgogICAgYXNzZXJ0KAogICAgICAgIG5hdGl2ZUNsYXNzVGFnSW5mb1tjbHNdID09IG51bGwgfHwKICAgICAgICAgICAgbmF0aXZlQ2xhc3NUYWdJbmZvW2Nsc10udGV4dCA9PSB0YWdUZXh0LAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBjbHMsCiAgICAgICAgICAgICJOYXRpdmUgdGFnIGluZm8gc2V0IGluY29uc2lzdGVudGx5IG9uICRjbHM6ICIKICAgICAgICAgICAgIkV4aXN0aW5nIHRhZyBpbmZvICcke25hdGl2ZUNsYXNzVGFnSW5mb1tjbHNdfScsICIKICAgICAgICAgICAgIm5ldyB0YWcgaW5mbyAnJHRhZ1RleHQnLiIpKTsKICAgIG5hdGl2ZUNsYXNzVGFnSW5mb1tjbHNdID0gbmV3IE5hdGl2ZUNsYXNzVGFnKHRhZ1RleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBtYXJrQXNKc0ludGVyb3BMaWJyYXJ5KExpYnJhcnlFbnRpdHkgZWxlbWVudCwge1N0cmluZyBuYW1lfSkgewogICAgYXNzZXJ0KAogICAgICAgICFfY2xvc2VkLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAiTmF0aXZlQmFzaWNEYXRhQnVpbGRlciBpcyBjbG9zZWQuICIKICAgICAgICAgICAgIlRyeWluZyB0byBtYXJrICRlbGVtZW50IGFzIGEganMtaW50ZXJvcCBsaWJyYXJ5LiIpKTsKICAgIGpzSW50ZXJvcExpYnJhcmllc1tlbGVtZW50XSA9IG5hbWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG1hcmtBc0pzSW50ZXJvcENsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQsCiAgICAgIHtTdHJpbmcgbmFtZSwgYm9vbCBpc0Fub255bW91czogZmFsc2V9KSB7CiAgICBhc3NlcnQoCiAgICAgICAgIV9jbG9zZWQsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICJOYXRpdmVCYXNpY0RhdGFCdWlsZGVyIGlzIGNsb3NlZC4gIgogICAgICAgICAgICAiVHJ5aW5nIHRvIG1hcmsgJGVsZW1lbnQgYXMgYSBqcy1pbnRlcm9wIGNsYXNzLiIpKTsKICAgIGpzSW50ZXJvcENsYXNzZXNbZWxlbWVudF0gPSBuYW1lOwogICAgaWYgKGlzQW5vbnltb3VzKSB7CiAgICAgIGFub255bW91c0pzSW50ZXJvcENsYXNzZXMuYWRkKGVsZW1lbnQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBtYXJrQXNKc0ludGVyb3BNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQsIFN0cmluZyBuYW1lKSB7CiAgICBhc3NlcnQoCiAgICAgICAgIV9jbG9zZWQsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICJOYXRpdmVCYXNpY0RhdGFCdWlsZGVyIGlzIGNsb3NlZC4gIgogICAgICAgICAgICAiVHJ5aW5nIHRvIG1hcmsgJGVsZW1lbnQgYXMgYSBqcy1pbnRlcm9wIG1lbWJlci4iKSk7CiAgICBqc0ludGVyb3BNZW1iZXJzW2VsZW1lbnRdID0gbmFtZTsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZUJhc2ljRGF0YSBjbG9zZShFbGVtZW50RW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKICAgIF9jbG9zZWQgPSB0cnVlOwogICAgcmV0dXJuIG5ldyBOYXRpdmVCYXNpY0RhdGFJbXBsKAogICAgICAgIGVudmlyb25tZW50LAogICAgICAgIG5hdGl2ZUNsYXNzVGFnSW5mbywKICAgICAgICBqc0ludGVyb3BMaWJyYXJpZXMsCiAgICAgICAganNJbnRlcm9wQ2xhc3NlcywKICAgICAgICBhbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzLAogICAgICAgIGpzSW50ZXJvcE1lbWJlcnMpOwogIH0KCiAgdm9pZCByZW9wZW5Gb3JUZXN0aW5nKCkgewogICAgX2Nsb3NlZCA9IGZhbHNlOwogIH0KfQoKY2xhc3MgTmF0aXZlQmFzaWNEYXRhSW1wbCBpbXBsZW1lbnRzIE5hdGl2ZUJhc2ljRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtOYXRpdmVCYXNpY0RhdGFdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnbmF0aXZlLWJhc2ljLWRhdGEnOwoKICBmaW5hbCBFbGVtZW50RW52aXJvbm1lbnQgX2VudjsKCiAgLy8vIFRhZyBpbmZvIGZvciBuYXRpdmUgSmF2YVNjcmlwdCBjbGFzc2VzIG5hbWVzLiBTZWUKICAvLy8gW3NldE5hdGl2ZUNsYXNzVGFnSW5mb10uCiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBOYXRpdmVDbGFzc1RhZz4gbmF0aXZlQ2xhc3NUYWdJbmZvOwoKICAvLy8gVGhlIEphdmFTY3JpcHQgbGlicmFyaWVzIGltcGxlbWVudGVkIHZpYSB0eXBlZCBKYXZhU2NyaXB0IGludGVyb3AuCiAgZmluYWwgTWFwPExpYnJhcnlFbnRpdHksIFN0cmluZz4ganNJbnRlcm9wTGlicmFyaWVzOwoKICAvLy8gVGhlIEphdmFTY3JpcHQgY2xhc3NlcyBpbXBsZW1lbnRlZCB2aWEgdHlwZWQgSmF2YVNjcmlwdCBpbnRlcm9wLgogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BDbGFzc2VzOwoKICAvLy8gSmF2YVNjcmlwdCBpbnRlcm9wIGNsYXNzZXMgYW5ub3RhdGVkIHdpdGggYEBhbm9ueW1vdXNgCiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBhbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzOwoKICAvLy8gVGhlIEphdmFTY3JpcHQgbWVtYmVycyBpbXBsZW1lbnRlZCB2aWEgdHlwZWQgSmF2YVNjcmlwdCBpbnRlcm9wLgogIGZpbmFsIE1hcDxNZW1iZXJFbnRpdHksIFN0cmluZz4ganNJbnRlcm9wTWVtYmVyczsKCiAgTmF0aXZlQmFzaWNEYXRhSW1wbCgKICAgICAgdGhpcy5fZW52LAogICAgICB0aGlzLm5hdGl2ZUNsYXNzVGFnSW5mbywKICAgICAgdGhpcy5qc0ludGVyb3BMaWJyYXJpZXMsCiAgICAgIHRoaXMuanNJbnRlcm9wQ2xhc3NlcywKICAgICAgdGhpcy5hbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzLAogICAgICB0aGlzLmpzSW50ZXJvcE1lbWJlcnMpOwoKICBmYWN0b3J5IE5hdGl2ZUJhc2ljRGF0YUltcGwuZnJvbUlyKAogICAgICBLZXJuZWxUb0VsZW1lbnRNYXAgbWFwLCBJckFubm90YXRpb25EYXRhIGRhdGEpIHsKICAgIEVsZW1lbnRFbnZpcm9ubWVudCBlbnYgPSBtYXAuZWxlbWVudEVudmlyb25tZW50OwogICAgTWFwPENsYXNzRW50aXR5LCBOYXRpdmVDbGFzc1RhZz4gbmF0aXZlQ2xhc3NUYWdJbmZvID0ge307CiAgICBNYXA8TGlicmFyeUVudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BMaWJyYXJpZXMgPSB7fTsKICAgIE1hcDxDbGFzc0VudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BDbGFzc2VzID0ge307CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGFub255bW91c0pzSW50ZXJvcENsYXNzZXMgPSB7fTsKICAgIE1hcDxNZW1iZXJFbnRpdHksIFN0cmluZz4ganNJbnRlcm9wTWVtYmVycyA9IHt9OwoKICAgIGRhdGEuZm9yRWFjaE5hdGl2ZUNsYXNzKChpci5DbGFzcyBub2RlLCBTdHJpbmcgdGV4dCkgewogICAgICBuYXRpdmVDbGFzc1RhZ0luZm9bbWFwLmdldENsYXNzKG5vZGUpXSA9IG5ldyBOYXRpdmVDbGFzc1RhZyh0ZXh0KTsKICAgIH0pOwogICAgZGF0YS5mb3JFYWNoSnNJbnRlcm9wTGlicmFyeSgoaXIuTGlicmFyeSBub2RlLCBTdHJpbmcgbmFtZSkgewogICAgICBqc0ludGVyb3BMaWJyYXJpZXNbZW52Lmxvb2t1cExpYnJhcnkobm9kZS5pbXBvcnRVcmksIHJlcXVpcmVkOiB0cnVlKV0gPQogICAgICAgICAgbmFtZTsKICAgIH0pOwogICAgZGF0YS5mb3JFYWNoSnNJbnRlcm9wQ2xhc3MoKGlyLkNsYXNzIG5vZGUsIFN0cmluZyBuYW1lLAogICAgICAgIHtib29sIGlzQW5vbnltb3VzfSkgewogICAgICBDbGFzc0VudGl0eSBjbHMgPSBtYXAuZ2V0Q2xhc3Mobm9kZSk7CiAgICAgIGpzSW50ZXJvcENsYXNzZXNbY2xzXSA9IG5hbWU7CiAgICAgIGlmIChpc0Fub255bW91cykgewogICAgICAgIGFub255bW91c0pzSW50ZXJvcENsYXNzZXMuYWRkKGNscyk7CiAgICAgIH0KICAgIH0pOwogICAgZGF0YS5mb3JFYWNoSnNJbnRlcm9wTWVtYmVyKChpci5NZW1iZXIgbm9kZSwgU3RyaW5nIG5hbWUpIHsKICAgICAganNJbnRlcm9wTWVtYmVyc1ttYXAuZ2V0TWVtYmVyKG5vZGUpXSA9IG5hbWU7CiAgICB9KTsKCiAgICByZXR1cm4gbmV3IE5hdGl2ZUJhc2ljRGF0YUltcGwoZW52LCBuYXRpdmVDbGFzc1RhZ0luZm8sIGpzSW50ZXJvcExpYnJhcmllcywKICAgICAgICBqc0ludGVyb3BDbGFzc2VzLCBhbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzLCBqc0ludGVyb3BNZW1iZXJzKTsKICB9CgogIGZhY3RvcnkgTmF0aXZlQmFzaWNEYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50KSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIE1hcDxDbGFzc0VudGl0eSwgTmF0aXZlQ2xhc3NUYWc+IG5hdGl2ZUNsYXNzVGFnSW5mbyA9CiAgICAgICAgc291cmNlLnJlYWRDbGFzc01hcCgoKSB7CiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lcyA9IHNvdXJjZS5yZWFkU3RyaW5ncygpOwogICAgICBib29sIGlzTm9uTGVhZiA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUNsYXNzVGFnLmludGVybmFsKG5hbWVzLCBpc05vbkxlYWYpOwogICAgfSk7CiAgICBNYXA8TGlicmFyeUVudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BMaWJyYXJpZXMgPQogICAgICAgIHNvdXJjZS5yZWFkTGlicmFyeU1hcChzb3VyY2UucmVhZFN0cmluZyk7CiAgICBNYXA8Q2xhc3NFbnRpdHksIFN0cmluZz4ganNJbnRlcm9wQ2xhc3NlcyA9CiAgICAgICAgc291cmNlLnJlYWRDbGFzc01hcChzb3VyY2UucmVhZFN0cmluZyk7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGFub255bW91c0pzSW50ZXJvcENsYXNzZXMgPSBzb3VyY2UucmVhZENsYXNzZXMoKS50b1NldCgpOwogICAgTWFwPE1lbWJlckVudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BNZW1iZXJzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlck1hcCgoTWVtYmVyRW50aXR5IG1lbWJlcikgPT4gc291cmNlLnJlYWRTdHJpbmcoKSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IE5hdGl2ZUJhc2ljRGF0YUltcGwoCiAgICAgICAgZWxlbWVudEVudmlyb25tZW50LAogICAgICAgIG5hdGl2ZUNsYXNzVGFnSW5mbywKICAgICAgICBqc0ludGVyb3BMaWJyYXJpZXMsCiAgICAgICAganNJbnRlcm9wQ2xhc3NlcywKICAgICAgICBhbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzLAogICAgICAgIGpzSW50ZXJvcE1lbWJlcnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUNsYXNzTWFwKG5hdGl2ZUNsYXNzVGFnSW5mbywgKE5hdGl2ZUNsYXNzVGFnIHRhZykgewogICAgICBzaW5rLndyaXRlU3RyaW5ncyh0YWcubmFtZXMpOwogICAgICBzaW5rLndyaXRlQm9vbCh0YWcuaXNOb25MZWFmKTsKICAgIH0pOwogICAgc2luay53cml0ZUxpYnJhcnlNYXAoanNJbnRlcm9wTGlicmFyaWVzLCBzaW5rLndyaXRlU3RyaW5nKTsKICAgIHNpbmsud3JpdGVDbGFzc01hcChqc0ludGVyb3BDbGFzc2VzLCBzaW5rLndyaXRlU3RyaW5nKTsKICAgIHNpbmsud3JpdGVDbGFzc2VzKGFub255bW91c0pzSW50ZXJvcENsYXNzZXMpOwogICAgc2luay53cml0ZU1lbWJlck1hcChqc0ludGVyb3BNZW1iZXJzLAogICAgICAgIChNZW1iZXJFbnRpdHkgbWVtYmVyLCBTdHJpbmcgbmFtZSkgPT4gc2luay53cml0ZVN0cmluZyhuYW1lKSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc05hdGl2ZUNsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChpc0pzSW50ZXJvcENsYXNzKGVsZW1lbnQpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBuYXRpdmVDbGFzc1RhZ0luZm8uY29udGFpbnNLZXkoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PFN0cmluZz4gZ2V0TmF0aXZlVGFnc09mQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gbmF0aXZlQ2xhc3NUYWdJbmZvW2Nsc10ubmFtZXM7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc05hdGl2ZVRhZ3NGb3JjZWROb25MZWFmKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIG5hdGl2ZUNsYXNzVGFnSW5mb1tjbHNdLmlzTm9uTGVhZjsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSnNJbnRlcm9wVXNlZCA9PgogICAgICBqc0ludGVyb3BMaWJyYXJpZXMuaXNOb3RFbXB0eSB8fCBqc0ludGVyb3BDbGFzc2VzLmlzTm90RW1wdHk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNKc0ludGVyb3BMaWJyYXJ5KExpYnJhcnlFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGpzSW50ZXJvcExpYnJhcmllcy5jb250YWluc0tleShlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNKc0ludGVyb3BDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4ganNJbnRlcm9wQ2xhc3Nlcy5jb250YWluc0tleShlbGVtZW50KTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gaXMgZXhwbGljaXRseSBtYXJrZWQgYXMgcGFydCBvZiBKc0ludGVyb3AuCiAgYm9vbCBfaXNKc0ludGVyb3BNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBqc0ludGVyb3BNZW1iZXJzLmNvbnRhaW5zS2V5KGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0pzSW50ZXJvcE1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hhcmUgdGhpcyB3aXRoIFtOYXRpdmVEYXRhSW1wbC5pc0pzSW50ZXJvcE1lbWJlcl0uCiAgICBpZiAoZWxlbWVudC5pc0Z1bmN0aW9uIHx8CiAgICAgICAgZWxlbWVudC5pc0NvbnN0cnVjdG9yIHx8CiAgICAgICAgZWxlbWVudC5pc0dldHRlciB8fAogICAgICAgIGVsZW1lbnQuaXNTZXR0ZXIpIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24gPSBlbGVtZW50OwogICAgICBpZiAoIWZ1bmN0aW9uLmlzRXh0ZXJuYWwpIHJldHVybiBmYWxzZTsKCiAgICAgIGlmIChfaXNKc0ludGVyb3BNZW1iZXIoZnVuY3Rpb24pKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGZ1bmN0aW9uLmVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gaXNKc0ludGVyb3BDbGFzcyhmdW5jdGlvbi5lbmNsb3NpbmdDbGFzcyk7CiAgICAgIH0KICAgICAgaWYgKGZ1bmN0aW9uLmlzVG9wTGV2ZWwpIHsKICAgICAgICByZXR1cm4gaXNKc0ludGVyb3BMaWJyYXJ5KGZ1bmN0aW9uLmxpYnJhcnkpOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfaXNKc0ludGVyb3BNZW1iZXIoZWxlbWVudCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIGlmIChpc05hdGl2ZUNsYXNzKGVsZW1lbnQpIHx8IGlzSnNJbnRlcm9wQ2xhc3MoZWxlbWVudCkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoX2Vudi5nZXRTdXBlckNsYXNzKGVsZW1lbnQpKTsKICB9Cn0KCmNsYXNzIE5hdGl2ZURhdGFCdWlsZGVySW1wbCBpbXBsZW1lbnRzIE5hdGl2ZURhdGFCdWlsZGVyIHsKICBmaW5hbCBOYXRpdmVCYXNpY0RhdGFJbXBsIF9uYXRpdmVCYXNpY0RhdGE7CgogIC8vLyBUaGUgSmF2YVNjcmlwdCBuYW1lcyBmb3IgbmF0aXZlIEphdmFTY3JpcHQgZWxlbWVudHMgaW1wbGVtZW50ZWQuCiAgTWFwPE1lbWJlckVudGl0eSwgU3RyaW5nPiBuYXRpdmVNZW1iZXJOYW1lID0gPE1lbWJlckVudGl0eSwgU3RyaW5nPnt9OwoKICAvLy8gQ2FjaGUgZm9yIFtOYXRpdmVCZWhhdmlvcl1zIGZvciBjYWxsaW5nIG5hdGl2ZSBtZXRob2RzLgogIE1hcDxGdW5jdGlvbkVudGl0eSwgTmF0aXZlQmVoYXZpb3I+IG5hdGl2ZU1ldGhvZEJlaGF2aW9yID0KICAgICAgPEZ1bmN0aW9uRW50aXR5LCBOYXRpdmVCZWhhdmlvcj57fTsKCiAgLy8vIENhY2hlIGZvciBbTmF0aXZlQmVoYXZpb3JdcyBmb3IgcmVhZGluZyBmcm9tIG5hdGl2ZSBmaWVsZHMuCiAgTWFwPE1lbWJlckVudGl0eSwgTmF0aXZlQmVoYXZpb3I+IG5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yID0KICAgICAgPEZpZWxkRW50aXR5LCBOYXRpdmVCZWhhdmlvcj57fTsKCiAgLy8vIENhY2hlIGZvciBbTmF0aXZlQmVoYXZpb3JdcyBmb3Igd3JpdGluZyB0byBuYXRpdmUgZmllbGRzLgogIE1hcDxNZW1iZXJFbnRpdHksIE5hdGl2ZUJlaGF2aW9yPiBuYXRpdmVGaWVsZFN0b3JlQmVoYXZpb3IgPQogICAgICA8RmllbGRFbnRpdHksIE5hdGl2ZUJlaGF2aW9yPnt9OwoKICBOYXRpdmVEYXRhQnVpbGRlckltcGwodGhpcy5fbmF0aXZlQmFzaWNEYXRhKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXROYXRpdmVNZW1iZXJOYW1lKE1lbWJlckVudGl0eSBlbGVtZW50LCBTdHJpbmcgbmFtZSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXZvaWQgc2V0dGluZyB0aGlzIG1vcmUgdGhhbiBvbmNlLiBUaGUgZW5xdWV1ZXIKICAgIC8vIG1pZ2h0IGVucXVldWUgW2VsZW1lbnRdIHNldmVyYWwgdGltZXMgKGJlZm9yZSBwcm9jZXNzaW5nIGl0KSBhbmQgY29tcHV0ZXMKICAgIC8vIG5hbWUgb24gZWFjaCBjYWxsIHRvIGBpbnRlcm5hbEFkZFRvV29ya0xpc3RgLgogICAgYXNzZXJ0KAogICAgICAgIG5hdGl2ZU1lbWJlck5hbWVbZWxlbWVudF0gPT0gbnVsbCB8fCBuYXRpdmVNZW1iZXJOYW1lW2VsZW1lbnRdID09IG5hbWUsCiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICJOYXRpdmUgbWVtYmVyIG5hbWUgc2V0IGluY29uc2lzdGVudGx5IG9uICRlbGVtZW50OiAiCiAgICAgICAgICAgICJFeGlzdGluZyBuYW1lICcke25hdGl2ZU1lbWJlck5hbWVbZWxlbWVudF19JywgIgogICAgICAgICAgICAibmV3IG5hbWUgJyRuYW1lJy4iKSk7CiAgICBuYXRpdmVNZW1iZXJOYW1lW2VsZW1lbnRdID0gbmFtZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgc2V0TmF0aXZlTWV0aG9kQmVoYXZpb3IoRnVuY3Rpb25FbnRpdHkgbWV0aG9kLCBOYXRpdmVCZWhhdmlvciBiZWhhdmlvcikgewogICAgbmF0aXZlTWV0aG9kQmVoYXZpb3JbbWV0aG9kXSA9IGJlaGF2aW9yOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXROYXRpdmVGaWVsZExvYWRCZWhhdmlvcihGaWVsZEVudGl0eSBmaWVsZCwgTmF0aXZlQmVoYXZpb3IgYmVoYXZpb3IpIHsKICAgIG5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yW2ZpZWxkXSA9IGJlaGF2aW9yOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXROYXRpdmVGaWVsZFN0b3JlQmVoYXZpb3IoRmllbGRFbnRpdHkgZmllbGQsIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yKSB7CiAgICBuYXRpdmVGaWVsZFN0b3JlQmVoYXZpb3JbZmllbGRdID0gYmVoYXZpb3I7CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVEYXRhIGNsb3NlKCkgPT4gbmV3IE5hdGl2ZURhdGFJbXBsKF9uYXRpdmVCYXNpY0RhdGEsIG5hdGl2ZU1lbWJlck5hbWUsCiAgICAgIG5hdGl2ZU1ldGhvZEJlaGF2aW9yLCBuYXRpdmVGaWVsZExvYWRCZWhhdmlvciwgbmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yKTsKfQoKLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIGZpZWxkcyB0aGF0IG92ZXJsYXAgd2l0aCBbTmF0aXZlQmFzaWNEYXRhXSwgbGlrZQovLyBbYW5vbnltb3VzSnNJbnRlcm9wQ2xhc3Nlc10uCmNsYXNzIE5hdGl2ZURhdGFJbXBsIGltcGxlbWVudHMgTmF0aXZlRGF0YSwgTmF0aXZlQmFzaWNEYXRhSW1wbCB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtOYXRpdmVEYXRhXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ25hdGl2ZS1kYXRhJzsKCiAgLy8vIFByZWZpeCB1c2VkIHRvIGVzY2FwZSBKUyBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgRGFydCBuYW1lcwogIC8vLyB3aGVuIHVzaW5nIEpTSW50ZXJvcC4KICBzdGF0aWMgY29uc3QgU3RyaW5nIF9qc0ludGVyb3BFc2NhcGVQcmVmaXggPSByJ0pTJCc7CgogIGZpbmFsIE5hdGl2ZUJhc2ljRGF0YUltcGwgX25hdGl2ZUJhc2ljRGF0YTsKCiAgLy8vIFRoZSBKYXZhU2NyaXB0IG5hbWVzIGZvciBuYXRpdmUgSmF2YVNjcmlwdCBlbGVtZW50cyBpbXBsZW1lbnRlZC4KICBmaW5hbCBNYXA8TWVtYmVyRW50aXR5LCBTdHJpbmc+IG5hdGl2ZU1lbWJlck5hbWU7CgogIC8vLyBDYWNoZSBmb3IgW05hdGl2ZUJlaGF2aW9yXXMgZm9yIGNhbGxpbmcgbmF0aXZlIG1ldGhvZHMuCiAgZmluYWwgTWFwPEZ1bmN0aW9uRW50aXR5LCBOYXRpdmVCZWhhdmlvcj4gbmF0aXZlTWV0aG9kQmVoYXZpb3I7CgogIC8vLyBDYWNoZSBmb3IgW05hdGl2ZUJlaGF2aW9yXXMgZm9yIHJlYWRpbmcgZnJvbSBuYXRpdmUgZmllbGRzLgogIGZpbmFsIE1hcDxNZW1iZXJFbnRpdHksIE5hdGl2ZUJlaGF2aW9yPiBuYXRpdmVGaWVsZExvYWRCZWhhdmlvcjsKCiAgLy8vIENhY2hlIGZvciBbTmF0aXZlQmVoYXZpb3JdcyBmb3Igd3JpdGluZyB0byBuYXRpdmUgZmllbGRzLgogIGZpbmFsIE1hcDxNZW1iZXJFbnRpdHksIE5hdGl2ZUJlaGF2aW9yPiBuYXRpdmVGaWVsZFN0b3JlQmVoYXZpb3I7CgogIE5hdGl2ZURhdGFJbXBsKAogICAgICB0aGlzLl9uYXRpdmVCYXNpY0RhdGEsCiAgICAgIHRoaXMubmF0aXZlTWVtYmVyTmFtZSwKICAgICAgdGhpcy5uYXRpdmVNZXRob2RCZWhhdmlvciwKICAgICAgdGhpcy5uYXRpdmVGaWVsZExvYWRCZWhhdmlvciwKICAgICAgdGhpcy5uYXRpdmVGaWVsZFN0b3JlQmVoYXZpb3IpOwoKICBmYWN0b3J5IE5hdGl2ZURhdGFJbXBsLmZyb21JcihLZXJuZWxUb0VsZW1lbnRNYXAgbWFwLCBJckFubm90YXRpb25EYXRhIGRhdGEpIHsKICAgIE5hdGl2ZUJhc2ljRGF0YUltcGwgbmF0aXZlQmFzaWNEYXRhID0KICAgICAgICBuZXcgTmF0aXZlQmFzaWNEYXRhSW1wbC5mcm9tSXIobWFwLCBkYXRhKTsKICAgIE1hcDxNZW1iZXJFbnRpdHksIFN0cmluZz4gbmF0aXZlTWVtYmVyTmFtZSA9IHt9OwogICAgTWFwPEZ1bmN0aW9uRW50aXR5LCBOYXRpdmVCZWhhdmlvcj4gbmF0aXZlTWV0aG9kQmVoYXZpb3IgPSB7fTsKICAgIE1hcDxNZW1iZXJFbnRpdHksIE5hdGl2ZUJlaGF2aW9yPiBuYXRpdmVGaWVsZExvYWRCZWhhdmlvciA9IHt9OwogICAgTWFwPE1lbWJlckVudGl0eSwgTmF0aXZlQmVoYXZpb3I+IG5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvciA9IHt9OwoKICAgIGRhdGEuZm9yRWFjaE5hdGl2ZU1ldGhvZERhdGEoKGlyLk1lbWJlciBub2RlLAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIEl0ZXJhYmxlPFN0cmluZz4gY3JlYXRlc0Fubm90YXRpb25zLAogICAgICAgIEl0ZXJhYmxlPFN0cmluZz4gcmV0dXJuc0Fubm90YXRpb25zKSB7CiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPSBtYXAuZ2V0TWVtYmVyKG5vZGUpOwogICAgICBuYXRpdmVNZW1iZXJOYW1lW21lbWJlcl0gPSBuYW1lOwogICAgICBib29sIGlzSnNJbnRlcm9wID0gbmF0aXZlQmFzaWNEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKG1lbWJlcik7CiAgICAgIG5hdGl2ZU1ldGhvZEJlaGF2aW9yW21lbWJlcl0gPSBtYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JNZXRob2QoCiAgICAgICAgICBub2RlLCBjcmVhdGVzQW5ub3RhdGlvbnMsIHJldHVybnNBbm5vdGF0aW9ucywKICAgICAgICAgIGlzSnNJbnRlcm9wOiBpc0pzSW50ZXJvcCk7CiAgICB9KTsKCiAgICBkYXRhLmZvckVhY2hOYXRpdmVGaWVsZERhdGEoKGlyLk1lbWJlciBub2RlLAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIEl0ZXJhYmxlPFN0cmluZz4gY3JlYXRlc0Fubm90YXRpb25zLAogICAgICAgIEl0ZXJhYmxlPFN0cmluZz4gcmV0dXJuc0Fubm90YXRpb25zKSB7CiAgICAgIEZpZWxkRW50aXR5IGZpZWxkID0gbWFwLmdldE1lbWJlcihub2RlKTsKICAgICAgbmF0aXZlTWVtYmVyTmFtZVtmaWVsZF0gPSBuYW1lOwogICAgICBib29sIGlzSnNJbnRlcm9wID0gbmF0aXZlQmFzaWNEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKGZpZWxkKTsKICAgICAgbmF0aXZlRmllbGRMb2FkQmVoYXZpb3JbZmllbGRdID0gbWFwLmdldE5hdGl2ZUJlaGF2aW9yRm9yRmllbGRMb2FkKAogICAgICAgICAgbm9kZSwgY3JlYXRlc0Fubm90YXRpb25zLCByZXR1cm5zQW5ub3RhdGlvbnMsCiAgICAgICAgICBpc0pzSW50ZXJvcDogaXNKc0ludGVyb3ApOwogICAgICBuYXRpdmVGaWVsZFN0b3JlQmVoYXZpb3JbZmllbGRdID0KICAgICAgICAgIG1hcC5nZXROYXRpdmVCZWhhdmlvckZvckZpZWxkU3RvcmUobm9kZSk7CiAgICB9KTsKCiAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGFJbXBsKAogICAgICAgIG5hdGl2ZUJhc2ljRGF0YSwKICAgICAgICBuYXRpdmVNZW1iZXJOYW1lLAogICAgICAgIG5hdGl2ZU1ldGhvZEJlaGF2aW9yLAogICAgICAgIG5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yLAogICAgICAgIG5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcik7CiAgfQoKICBmYWN0b3J5IE5hdGl2ZURhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZUJhc2ljRGF0YSA9CiAgICAgICAgbmV3IE5hdGl2ZUJhc2ljRGF0YS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBlbGVtZW50RW52aXJvbm1lbnQpOwogICAgTWFwPE1lbWJlckVudGl0eSwgU3RyaW5nPiBuYXRpdmVNZW1iZXJOYW1lID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlck1hcCgoTWVtYmVyRW50aXR5IG1lbWJlcikgPT4gc291cmNlLnJlYWRTdHJpbmcoKSk7CiAgICBNYXA8RnVuY3Rpb25FbnRpdHksIE5hdGl2ZUJlaGF2aW9yPiBuYXRpdmVNZXRob2RCZWhhdmlvciA9CiAgICAgICAgc291cmNlLnJlYWRNZW1iZXJNYXAoKE1lbWJlckVudGl0eSBtZW1iZXIpID0+CiAgICAgICAgICAgIG5ldyBOYXRpdmVCZWhhdmlvci5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKSk7CiAgICBNYXA8TWVtYmVyRW50aXR5LCBOYXRpdmVCZWhhdmlvcj4gbmF0aXZlRmllbGRMb2FkQmVoYXZpb3IgPQogICAgICAgIHNvdXJjZS5yZWFkTWVtYmVyTWFwKChNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PgogICAgICAgICAgICBuZXcgTmF0aXZlQmVoYXZpb3IucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSkpOwogICAgTWFwPE1lbWJlckVudGl0eSwgTmF0aXZlQmVoYXZpb3I+IG5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvciA9CiAgICAgICAgc291cmNlLnJlYWRNZW1iZXJNYXAoKE1lbWJlckVudGl0eSBtZW1iZXIpID0+CiAgICAgICAgICAgIG5ldyBOYXRpdmVCZWhhdmlvci5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGFJbXBsKAogICAgICAgIG5hdGl2ZUJhc2ljRGF0YSwKICAgICAgICBuYXRpdmVNZW1iZXJOYW1lLAogICAgICAgIG5hdGl2ZU1ldGhvZEJlaGF2aW9yLAogICAgICAgIG5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yLAogICAgICAgIG5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBfbmF0aXZlQmFzaWNEYXRhLndyaXRlVG9EYXRhU2luayhzaW5rKTsKCiAgICBzaW5rLndyaXRlTWVtYmVyTWFwKG5hdGl2ZU1lbWJlck5hbWUsCiAgICAgICAgKE1lbWJlckVudGl0eSBtZW1iZXIsIFN0cmluZyBuYW1lKSA9PiBzaW5rLndyaXRlU3RyaW5nKG5hbWUpKTsKCiAgICBzaW5rLndyaXRlTWVtYmVyTWFwKG5hdGl2ZU1ldGhvZEJlaGF2aW9yLAogICAgICAgIChNZW1iZXJFbnRpdHkgbWVtYmVyLCBOYXRpdmVCZWhhdmlvciBiZWhhdmlvcikgewogICAgICBiZWhhdmlvci53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB9KTsKCiAgICBzaW5rLndyaXRlTWVtYmVyTWFwKG5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yLAogICAgICAgIChNZW1iZXJFbnRpdHkgbWVtYmVyLCBOYXRpdmVCZWhhdmlvciBiZWhhdmlvcikgewogICAgICBiZWhhdmlvci53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB9KTsKICAgIHNpbmsud3JpdGVNZW1iZXJNYXAobmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yLAogICAgICAgIChNZW1iZXJFbnRpdHkgbWVtYmVyLCBOYXRpdmVCZWhhdmlvciBiZWhhdmlvcikgewogICAgICBiZWhhdmlvci53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB9KTsKCiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPExpYnJhcnlFbnRpdHksIFN0cmluZz4gZ2V0IGpzSW50ZXJvcExpYnJhcmllcyA9PgogICAgICBfbmF0aXZlQmFzaWNEYXRhLmpzSW50ZXJvcExpYnJhcmllczsKCiAgQG92ZXJyaWRlCiAgU2V0PENsYXNzRW50aXR5PiBnZXQgYW5vbnltb3VzSnNJbnRlcm9wQ2xhc3NlcyA9PgogICAgICBfbmF0aXZlQmFzaWNEYXRhLmFub255bW91c0pzSW50ZXJvcENsYXNzZXM7CgogIEBvdmVycmlkZQogIE1hcDxDbGFzc0VudGl0eSwgU3RyaW5nPiBnZXQganNJbnRlcm9wQ2xhc3NlcyA9PgogICAgICBfbmF0aXZlQmFzaWNEYXRhLmpzSW50ZXJvcENsYXNzZXM7CgogIEBvdmVycmlkZQogIE1hcDxNZW1iZXJFbnRpdHksIFN0cmluZz4gZ2V0IGpzSW50ZXJvcE1lbWJlcnMgPT4KICAgICAgX25hdGl2ZUJhc2ljRGF0YS5qc0ludGVyb3BNZW1iZXJzOwoKICBAb3ZlcnJpZGUKICBib29sIGlzQW5vbnltb3VzSnNJbnRlcm9wQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGFub255bW91c0pzSW50ZXJvcENsYXNzZXMuY29udGFpbnMoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzTmF0aXZlQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCkgPT4KICAgICAgX25hdGl2ZUJhc2ljRGF0YS5pc05hdGl2ZUNsYXNzKGVsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBMaXN0PFN0cmluZz4gZ2V0TmF0aXZlVGFnc09mQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBfbmF0aXZlQmFzaWNEYXRhLmdldE5hdGl2ZVRhZ3NPZkNsYXNzKGNscyk7CgogIEBvdmVycmlkZQogIGJvb2wgaGFzTmF0aXZlVGFnc0ZvcmNlZE5vbkxlYWYoQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBfbmF0aXZlQmFzaWNEYXRhLmhhc05hdGl2ZVRhZ3NGb3JjZWROb25MZWFmKGNscyk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSnNJbnRlcm9wVXNlZCA9PiBfbmF0aXZlQmFzaWNEYXRhLmlzSnNJbnRlcm9wVXNlZDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0pzSW50ZXJvcExpYnJhcnkoTGlicmFyeUVudGl0eSBlbGVtZW50KSA9PgogICAgICBfbmF0aXZlQmFzaWNEYXRhLmlzSnNJbnRlcm9wTGlicmFyeShlbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0pzSW50ZXJvcENsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQpID0+CiAgICAgIF9uYXRpdmVCYXNpY0RhdGEuaXNKc0ludGVyb3BDbGFzcyhlbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShDbGFzc0VudGl0eSBlbGVtZW50KSA9PgogICAgICBfbmF0aXZlQmFzaWNEYXRhLmlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKGVsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0SnNJbnRlcm9wTGlicmFyeU5hbWUoTGlicmFyeUVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4ganNJbnRlcm9wTGlicmFyaWVzW2VsZW1lbnRdOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldEpzSW50ZXJvcENsYXNzTmFtZShDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4ganNJbnRlcm9wQ2xhc3Nlc1tlbGVtZW50XTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXRKc0ludGVyb3BNZW1iZXJOYW1lKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4ganNJbnRlcm9wTWVtYmVyc1tlbGVtZW50XTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgX2lzSnNJbnRlcm9wTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4ganNJbnRlcm9wTWVtYmVycy5jb250YWluc0tleShlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNKc0ludGVyb3BNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50LmlzRnVuY3Rpb24gfHwKICAgICAgICBlbGVtZW50LmlzQ29uc3RydWN0b3IgfHwKICAgICAgICBlbGVtZW50LmlzR2V0dGVyIHx8CiAgICAgICAgZWxlbWVudC5pc1NldHRlcikgewogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiA9IGVsZW1lbnQ7CiAgICAgIGlmICghZnVuY3Rpb24uaXNFeHRlcm5hbCkgcmV0dXJuIGZhbHNlOwoKICAgICAgaWYgKF9pc0pzSW50ZXJvcE1lbWJlcihmdW5jdGlvbikpIHJldHVybiB0cnVlOwogICAgICBpZiAoZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICAgIHJldHVybiBpc0pzSW50ZXJvcENsYXNzKGZ1bmN0aW9uLmVuY2xvc2luZ0NsYXNzKTsKICAgICAgfQogICAgICBpZiAoZnVuY3Rpb24uaXNUb3BMZXZlbCkgewogICAgICAgIHJldHVybiBpc0pzSW50ZXJvcExpYnJhcnkoZnVuY3Rpb24ubGlicmFyeSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9pc0pzSW50ZXJvcE1lbWJlcihlbGVtZW50KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzRml4ZWRCYWNrZW5kTmFtZShNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGlzSnNJbnRlcm9wTWVtYmVyKGVsZW1lbnQpIHx8IG5hdGl2ZU1lbWJlck5hbWUuY29udGFpbnNLZXkoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0Rml4ZWRCYWNrZW5kTmFtZShNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgU3RyaW5nIG5hbWUgPSBuYXRpdmVNZW1iZXJOYW1lW2VsZW1lbnRdOwogICAgaWYgKG5hbWUgPT0gbnVsbCAmJiBpc0pzSW50ZXJvcE1lbWJlcihlbGVtZW50KSkgewogICAgICAvLyBJZiBhbiBlbGVtZW50IGlzSnNJbnRlcm9wIGJ1dCBfaXNKc0ludGVyb3AgaXMgZmFsc2UgdGhhdCBtZWFucyBpdCBpcwogICAgICAvLyBjb25zaWRlcmVkIGludGVyb3AgYXMgdGhlIHBhcmVudCBjbGFzcyBpcyBpbnRlcm9wLgogICAgICBuYW1lID0gZWxlbWVudC5pc0NvbnN0cnVjdG9yCiAgICAgICAgICA/IF9qc0NsYXNzTmFtZUhlbHBlcihlbGVtZW50LmVuY2xvc2luZ0NsYXNzKQogICAgICAgICAgOiBfanNNZW1iZXJOYW1lSGVscGVyKGVsZW1lbnQpOwogICAgICBuYXRpdmVNZW1iZXJOYW1lW2VsZW1lbnRdID0gbmFtZTsKICAgIH0KICAgIHJldHVybiBuYW1lOwogIH0KCiAgU3RyaW5nIF9qc0xpYnJhcnlOYW1lSGVscGVyKExpYnJhcnlFbnRpdHkgZWxlbWVudCkgewogICAgU3RyaW5nIGpzSW50ZXJvcE5hbWUgPSBnZXRKc0ludGVyb3BMaWJyYXJ5TmFtZShlbGVtZW50KTsKICAgIGlmIChqc0ludGVyb3BOYW1lICE9IG51bGwgJiYganNJbnRlcm9wTmFtZS5pc05vdEVtcHR5KSByZXR1cm4ganNJbnRlcm9wTmFtZTsKICAgIHJldHVybiAnc2VsZic7CiAgfQoKICBTdHJpbmcgX2pzQ2xhc3NOYW1lSGVscGVyKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIFN0cmluZyBqc0ludGVyb3BOYW1lID0gZ2V0SnNJbnRlcm9wQ2xhc3NOYW1lKGVsZW1lbnQpOwogICAgaWYgKGpzSW50ZXJvcE5hbWUgIT0gbnVsbCAmJiBqc0ludGVyb3BOYW1lLmlzTm90RW1wdHkpIHJldHVybiBqc0ludGVyb3BOYW1lOwogICAgcmV0dXJuIGNvbXB1dGVVbmVzY2FwZWRKU0ludGVyb3BOYW1lKGVsZW1lbnQubmFtZSk7CiAgfQoKICBTdHJpbmcgX2pzTWVtYmVyTmFtZUhlbHBlcihNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgU3RyaW5nIGpzSW50ZXJvcE5hbWUgPSBqc0ludGVyb3BNZW1iZXJzW2VsZW1lbnRdOwogICAgYXNzZXJ0KAogICAgICAgICEoanNJbnRlcm9wTWVtYmVycy5jb250YWluc0tleShlbGVtZW50KSAmJiBqc0ludGVyb3BOYW1lID09IG51bGwpLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAnTWVtYmVyICRlbGVtZW50IGlzIGpzIGludGVyb3AgYnV0IGpzIGludGVyb3AgbmFtZSBoYXMgbm90IHlldCAnCiAgICAgICAgICAgICdiZWVuIGNvbXB1dGVkLicpKTsKICAgIGlmIChqc0ludGVyb3BOYW1lICE9IG51bGwgJiYganNJbnRlcm9wTmFtZS5pc05vdEVtcHR5KSB7CiAgICAgIHJldHVybiBqc0ludGVyb3BOYW1lOwogICAgfQogICAgcmV0dXJuIGNvbXB1dGVVbmVzY2FwZWRKU0ludGVyb3BOYW1lKGVsZW1lbnQubmFtZSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIEphdmFTY3JpcHQgcGF0aCBzcGVjaWZ5aW5nIHRoZSBjb250ZXh0IGluIHdoaWNoCiAgLy8vIFtlbGVtZW50LmZpeGVkQmFja2VuZE5hbWVdIHNob3VsZCBiZSBldmFsdWF0ZWQuIE9ubHkgYXBwbGljYWJsZSBmb3IKICAvLy8gZWxlbWVudHMgdXNpbmcgdHlwZWQgSmF2YVNjcmlwdCBpbnRlcm9wLgogIC8vLyBGb3IgZXhhbXBsZTogZml4ZWRCYWNrZW5kUGF0aCBmb3IgdGhlIHN0YXRpYyBtZXRob2QgY3JlYXRlTWFwIGluIHRoZQogIC8vLyBNYXAgY2xhc3Mgb2YgdGhlIGdvb2cubWFwIEphdmFTY3JpcHQgbGlicmFyeSB3b3VsZCBoYXZlIHBhdGgKICAvLy8gImdvb2cubWFwcy5NYXAiLgogIEBvdmVycmlkZQogIFN0cmluZyBnZXRGaXhlZEJhY2tlbmRNZXRob2RQYXRoKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmICghaXNKc0ludGVyb3BNZW1iZXIoZWxlbWVudCkpIHJldHVybiBudWxsOwogICAgaWYgKGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlcikgcmV0dXJuICd0aGlzJzsKICAgIGlmIChlbGVtZW50LmlzQ29uc3RydWN0b3IpIHsKICAgICAgcmV0dXJuIF9maXhlZEJhY2tlbmRDbGFzc1BhdGgoZWxlbWVudC5lbmNsb3NpbmdDbGFzcyk7CiAgICB9CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZShfanNMaWJyYXJ5TmFtZUhlbHBlcihlbGVtZW50LmxpYnJhcnkpKTsKICAgIGlmIChlbGVtZW50LmVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgICAgc2IuLndyaXRlKCcuJykuLndyaXRlKF9qc0NsYXNzTmFtZUhlbHBlcihlbGVtZW50LmVuY2xvc2luZ0NsYXNzKSk7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIFN0cmluZyBfZml4ZWRCYWNrZW5kQ2xhc3NQYXRoKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmICghaXNKc0ludGVyb3BDbGFzcyhlbGVtZW50KSkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX2pzTGlicmFyeU5hbWVIZWxwZXIoZWxlbWVudC5saWJyYXJ5KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNOYXRpdmVNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChpc0pzSW50ZXJvcE1lbWJlcihlbGVtZW50KSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gbmF0aXZlTWVtYmVyTmFtZS5jb250YWluc0tleShlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZU1ldGhvZEJlaGF2aW9yKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkgewogICAgYXNzZXJ0KAogICAgICAgIG5hdGl2ZU1ldGhvZEJlaGF2aW9yLmNvbnRhaW5zS2V5KG1ldGhvZCksCiAgICAgICAgZmFpbGVkQXQobWV0aG9kLAogICAgICAgICAgICAiTm8gbmF0aXZlIG1ldGhvZCBiZWhhdmlvciBoYXMgYmVlbiBjb21wdXRlZCBmb3IgJG1ldGhvZC4iKSk7CiAgICByZXR1cm4gbmF0aXZlTWV0aG9kQmVoYXZpb3JbbWV0aG9kXTsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yKEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICBhc3NlcnQoCiAgICAgICAgbmF0aXZlRmllbGRMb2FkQmVoYXZpb3IuY29udGFpbnNLZXkoZmllbGQpLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBmaWVsZCwKICAgICAgICAgICAgIk5vIG5hdGl2ZSBmaWVsZCBsb2FkIGJlaGF2aW9yIGhhcyBiZWVuICIKICAgICAgICAgICAgImNvbXB1dGVkIGZvciAkZmllbGQuIikpOwogICAgcmV0dXJuIG5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9yW2ZpZWxkXTsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcihGaWVsZEVudGl0eSBmaWVsZCkgewogICAgYXNzZXJ0KAogICAgICAgIG5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvci5jb250YWluc0tleShmaWVsZCksCiAgICAgICAgZmFpbGVkQXQoZmllbGQsCiAgICAgICAgICAgICJObyBuYXRpdmUgZmllbGQgc3RvcmUgYmVoYXZpb3IgaGFzIGJlZW4gY29tcHV0ZWQgZm9yICRmaWVsZC4iKSk7CiAgICByZXR1cm4gbmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yW2ZpZWxkXTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBjb21wdXRlVW5lc2NhcGVkSlNJbnRlcm9wTmFtZShTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aChfanNJbnRlcm9wRXNjYXBlUHJlZml4KQogICAgICAgID8gbmFtZS5zdWJzdHJpbmcoX2pzSW50ZXJvcEVzY2FwZVByZWZpeC5sZW5ndGgpCiAgICAgICAgOiBuYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPENsYXNzRW50aXR5LCBOYXRpdmVDbGFzc1RhZz4gZ2V0IG5hdGl2ZUNsYXNzVGFnSW5mbyA9PgogICAgICBfbmF0aXZlQmFzaWNEYXRhLm5hdGl2ZUNsYXNzVGFnSW5mbzsKCiAgQG92ZXJyaWRlCiAgRWxlbWVudEVudmlyb25tZW50IGdldCBfZW52ID0+IF9uYXRpdmVCYXNpY0RhdGEuX2VudjsKfQoKY2xhc3MgTmF0aXZlQ2xhc3NUYWcgewogIGZpbmFsIExpc3Q8U3RyaW5nPiBuYW1lczsKICBmaW5hbCBib29sIGlzTm9uTGVhZjsKCiAgZmFjdG9yeSBOYXRpdmVDbGFzc1RhZyhTdHJpbmcgdGFnVGV4dCkgewogICAgTGlzdDxTdHJpbmc+IHRhZ3MgPSB0YWdUZXh0LnNwbGl0KCcsJyk7CiAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSB0YWdzLndoZXJlKChzKSA9PiAhcy5zdGFydHNXaXRoKCchJykpLnRvTGlzdCgpOwogICAgYm9vbCBpc05vbkxlYWYgPSB0YWdzLmNvbnRhaW5zKCchbm9ubGVhZicpOwogICAgcmV0dXJuIG5ldyBOYXRpdmVDbGFzc1Rh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IGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19tb2RlbC5sb2NhbHM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvaW5kZXhlZC5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9qdW1wcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CgppbXBvcnQgJ2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRzLmRhcnQnIHNob3cgSkdlbmVyYXRvckJvZHk7CgpjbGFzcyBHbG9iYWxMb2NhbHNNYXAgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbR2xvYmFsTG9jYWxzTWFwXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2dsb2JhbC1sb2NhbHMtbWFwJzsKCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgS2VybmVsVG9Mb2NhbHNNYXA+IF9sb2NhbHNNYXBzOwoKICBHbG9iYWxMb2NhbHNNYXAoKSA6IF9sb2NhbHNNYXBzID0ge307CgogIEdsb2JhbExvY2Fsc01hcC5pbnRlcm5hbCh0aGlzLl9sb2NhbHNNYXBzKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtHbG9iYWxMb2NhbHNNYXBdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgR2xvYmFsTG9jYWxzTWFwLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBNYXA8TWVtYmVyRW50aXR5LCBLZXJuZWxUb0xvY2Fsc01hcD4gX2xvY2Fsc01hcHMgPSB7fTsKICAgIGludCBtYXBDb3VudCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcENvdW50OyBpKyspIHsKICAgICAgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwID0KICAgICAgICAgIG5ldyBLZXJuZWxUb0xvY2Fsc01hcEltcGwucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIExpc3Q8TWVtYmVyRW50aXR5PiBtZW1iZXJzID0gc291cmNlLnJlYWRNZW1iZXJzKCk7CiAgICAgIGZvciAoTWVtYmVyRW50aXR5IG1lbWJlciBpbiBtZW1iZXJzKSB7CiAgICAgICAgX2xvY2Fsc01hcHNbbWVtYmVyXSA9IGxvY2Fsc01hcDsKICAgICAgfQogICAgfQogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBHbG9iYWxMb2NhbHNNYXAuaW50ZXJuYWwoX2xvY2Fsc01hcHMpOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbR2xvYmFsTG9jYWxzTWFwXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgLy8gW0tlcm5lbFRvTG9jYWxzTWFwXXMgYXJlIHNoYXJlZCBiZXR3ZWVuIG1lbWJlcnMgYW5kIHRoZWlyIG5lc3RlZAogICAgLy8gY2xvc3VyZXMsIHNvIHdlIHJldmVyc2UgW19sb2NhbHNNYXBzXSB0byBlbnN1cmUgdGhhdCBbS2VybmVsVG9Mb2NhbHNNYXBdcwogICAgLy8gYXJlIHNoYXJlZCB1cG9uIGRlc2VyaWFsaXphdGlvbi4gVGhlIHNoYXJpbmcgaXMgbmVlZGVkIGZvciBjb3JyZWN0bmVzcwogICAgLy8gc2luY2UgY2FwdHVyZWQgdmFyaWFibGVzIHdpbGwgb3RoZXJ3aXNlIGhhdmUgZGlzdGluY3QgbG9jYWxzIGZvciB0aGVpcgogICAgLy8gbm9uLWNhcHR1cmVkIGFuZCBjYXB0dXJlZCB1c2VzLgogICAgTWFwPEtlcm5lbFRvTG9jYWxzTWFwLCBMaXN0PE1lbWJlckVudGl0eT4+IHJldmVyc2VNYXAgPSB7fTsKICAgIF9sb2NhbHNNYXBzLmZvckVhY2goKE1lbWJlckVudGl0eSBtZW1iZXIsIEtlcm5lbFRvTG9jYWxzTWFwIGxvY2Fsc01hcCkgewogICAgICByZXZlcnNlTWFwLnB1dElmQWJzZW50KGxvY2Fsc01hcCwgKCkgPT4gW10pLmFkZChtZW1iZXIpOwogICAgfSk7CiAgICBzaW5rLndyaXRlSW50KHJldmVyc2VNYXAubGVuZ3RoKTsKICAgIHJldmVyc2VNYXAKICAgICAgICAuZm9yRWFjaCgoS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwLCBMaXN0PE1lbWJlckVudGl0eT4gbWVtYmVycykgewogICAgICBsb2NhbHNNYXAud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgICBzaW5rLndyaXRlTWVtYmVycyhtZW1iZXJzKTsKICAgIH0pOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbS2VybmVsVG9Mb2NhbHNNYXBdIGZvciBbbWVtYmVyXS4KICBLZXJuZWxUb0xvY2Fsc01hcCBnZXRMb2NhbHNNYXAoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgLy8gSWYgZWxlbWVudCBpcyBhIENvbnN0cnVjdG9yQm9keUVudGl0eSwgaXRzIGxvY2Fsc01hcCBpcyB0aGUgc2FtZSBhcyBmb3IKICAgIC8vIENvbnN0cnVjdG9yRW50aXR5LCBiZWNhdXNlIGJvdGggb2YgdGhlc2UgZW50aXRpZXMgY2FtZSBmcm9tIHRoZSBzYW1lCiAgICAvLyBjb25zdHJ1Y3RvciBub2RlLiBUaGUgZW50aXRpZXMgYXJlIHR3byBzZXBhcmF0ZSBwYXJ0cyBiZWNhdXNlIEpTIGRvZXMgbm90CiAgICAvLyBoYXZlIHRoZSBjb25jZXB0IG9mIGFuIGluaXRpYWxpemVyIGxpc3QsIHNvIHRoZSBjb25zdHJ1Y3RvciAoaW5pdGlhbGl6ZXIKICAgIC8vIGxpc3QpIGFuZCB0aGUgY29uc3RydWN0b3IgYm9keSBhcmUgaW1wbGVtZW50ZWQgYXMgdHdvIHNlcGFyYXRlCiAgICAvLyBjb25zdHJ1Y3RvciBzdGVwcy4KICAgIE1lbWJlckVudGl0eSBlbnRpdHkgPSBtZW1iZXI7CiAgICBpZiAoZW50aXR5IGlzIENvbnN0cnVjdG9yQm9keUVudGl0eSkgbWVtYmVyID0gZW50aXR5LmNvbnN0cnVjdG9yOwogICAgcmV0dXJuIF9sb2NhbHNNYXBzLnB1dElmQWJzZW50KAogICAgICAgIG1lbWJlciwgKCkgPT4gbmV3IEtlcm5lbFRvTG9jYWxzTWFwSW1wbChtZW1iZXIpKTsKICB9CgogIC8vLyBBc3NvY2lhdGVzIFtsb2NhbHNNYXBdIHdpdGggW21lbWJlcl0uCiAgLy8vCiAgLy8vIFVzZSB0aGlzIGZvciBzaGFyaW5nIG1hcHMgYmV0d2VlbiBtZW1iZXJzIHRoYXQgc2hhcmUgSVIgbm9kZXMuCiAgdm9pZCBzZXRMb2NhbHNNYXAoTWVtYmVyRW50aXR5IG1lbWJlciwgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwKSB7CiAgICBhc3NlcnQobWVtYmVyICE9IG51bGwsICJObyBtZW1iZXIgcHJvdmlkZWQuIik7CiAgICBhc3NlcnQoIV9sb2NhbHNNYXBzLmNvbnRhaW5zS2V5KG1lbWJlciksCiAgICAgICAgIkxvY2FscyBtYXAgYWxyZWFkeSBjcmVhdGVkIGZvciAkbWVtYmVyLiIpOwogICAgX2xvY2Fsc01hcHNbbWVtYmVyXSA9IGxvY2Fsc01hcDsKICB9Cn0KCmNsYXNzIEtlcm5lbFRvTG9jYWxzTWFwSW1wbCBpbXBsZW1lbnRzIEtlcm5lbFRvTG9jYWxzTWFwIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0tlcm5lbFRvTG9jYWxzTWFwSW1wbF0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdsb2NhbHMtbWFwJzsKCiAgTWVtYmVyRW50aXR5IF9jdXJyZW50TWVtYmVyOwogIGZpbmFsIEVudGl0eURhdGFNYXA8SkxvY2FsLCBMb2NhbERhdGE+IF9sb2NhbHMgPQogICAgICBuZXcgRW50aXR5RGF0YU1hcDxKTG9jYWwsIExvY2FsRGF0YT4oKTsKICBNYXA8aXIuVmFyaWFibGVEZWNsYXJhdGlvbiwgSkxvY2FsPiBfdmFyaWFibGVNYXAgPQogICAgICA8aXIuVmFyaWFibGVEZWNsYXJhdGlvbiwgSkxvY2FsPnt9OwogIE1hcDxpci5UcmVlTm9kZSwgSkp1bXBUYXJnZXQ+IF9qdW1wVGFyZ2V0TWFwOwogIEl0ZXJhYmxlPGlyLkJyZWFrU3RhdGVtZW50PiBfYnJlYWtzQXNDb250aW51ZTsKCiAgS2VybmVsVG9Mb2NhbHNNYXBJbXBsKHRoaXMuX2N1cnJlbnRNZW1iZXIpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0tlcm5lbFRvTG9jYWxzTWFwSW1wbF0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgS2VybmVsVG9Mb2NhbHNNYXBJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBfY3VycmVudE1lbWJlciA9IHNvdXJjZS5yZWFkTWVtYmVyKCk7CiAgICBpbnQgbG9jYWxzQ291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbHNDb3VudDsgaSsrKSB7CiAgICAgIGludCBpbmRleCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgIFN0cmluZyBuYW1lID0gc291cmNlLnJlYWRTdHJpbmdPck51bGwoKTsKICAgICAgYm9vbCBpc1JlZ3VsYXJQYXJhbWV0ZXIgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgICAgaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlID0gc291cmNlLnJlYWRUcmVlTm9kZSgpOwogICAgICBKTG9jYWwgbG9jYWwgPSBuZXcgSkxvY2FsKG5hbWUsIGN1cnJlbnRNZW1iZXIsCiAgICAgICAgICBpc1JlZ3VsYXJQYXJhbWV0ZXI6IGlzUmVndWxhclBhcmFtZXRlcik7CiAgICAgIExvY2FsRGF0YSBkYXRhID0gbmV3IExvY2FsRGF0YShub2RlKTsKICAgICAgX2xvY2Fscy5yZWdpc3RlckJ5SW5kZXgoaW5kZXgsIGxvY2FsLCBkYXRhKTsKICAgICAgX3ZhcmlhYmxlTWFwW25vZGVdID0gbG9jYWw7CiAgICB9CiAgICBpbnQganVtcENvdW50ID0gc291cmNlLnJlYWRJbnQoKTsKICAgIGlmIChqdW1wQ291bnQgPiAwKSB7CiAgICAgIF9qdW1wVGFyZ2V0TWFwID0ge307CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwganVtcENvdW50OyBpKyspIHsKICAgICAgICBKSnVtcFRhcmdldCB0YXJnZXQgPSBuZXcgSkp1bXBUYXJnZXQucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgICAgTGlzdDxpci5UcmVlTm9kZT4gbm9kZXMgPSBzb3VyY2UucmVhZFRyZWVOb2RlcygpOwogICAgICAgIGZvciAoaXIuVHJlZU5vZGUgbm9kZSBpbiBub2RlcykgewogICAgICAgICAgX2p1bXBUYXJnZXRNYXBbbm9kZV0gPSB0YXJnZXQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBfYnJlYWtzQXNDb250aW51ZSA9IHNvdXJjZS5yZWFkVHJlZU5vZGVzKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtLZXJuZWxUb0xvY2Fsc01hcEltcGxdIHRvIFtzaW5rXS4KICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVyKGN1cnJlbnRNZW1iZXIpOwogICAgc2luay53cml0ZUludChfbG9jYWxzLnNpemUpOwogICAgX2xvY2Fscy5mb3JFYWNoKChKTG9jYWwgbG9jYWwsIExvY2FsRGF0YSBkYXRhKSB7CiAgICAgIGFzc2VydChsb2NhbC5tZW1iZXJDb250ZXh0ID09IGN1cnJlbnRNZW1iZXIpOwogICAgICBzaW5rLndyaXRlSW50KGxvY2FsLmxvY2FsSW5kZXgpOwogICAgICBzaW5rLndyaXRlU3RyaW5nT3JOdWxsKGxvY2FsLm5hbWUpOwogICAgICBzaW5rLndyaXRlQm9vbChsb2NhbC5pc1JlZ3VsYXJQYXJhbWV0ZXIpOwogICAgICBzaW5rLndyaXRlVHJlZU5vZGUoZGF0YS5ub2RlKTsKICAgIH0pOwogICAgaWYgKF9qdW1wVGFyZ2V0TWFwICE9IG51bGwpIHsKICAgICAgLy8gW0pKdW1wVGFyZ2V0XXMgYXJlIHNoYXJlZCBiZXR3ZWVuIG5vZGVzLCBzbyB3ZSByZXZlcnNlCiAgICAgIC8vIFtfanVtcFRhcmdldE1hcF0gdG8gZW5zdXJlIHRoYXQgW0pKdW1wVGFyZ2V0XXMgYXJlIHNoYXJlZCB1cG9uCiAgICAgIC8vIGRlc2VyaWFsaXphdGlvbi4gVGhpcyBzaGFyaW5nIGlzIG5lZWRlZCBmb3IgY29ycmVjdG5lc3Mgc2luY2UgZm9yCiAgICAgIC8vIGluc3RhbmNlIGEgbGFiZWwgc3RhdGVtZW50IGNvbnRhaW5pbmcgYSBmb3IgbG9vcCBib3RoIGNvbnN0aXR1dGVzIHRoZQogICAgICAvLyBzYW1lIGp1bXAgdGFyZ2V0IGFuZCB0aGUgU1NBIGdyYXBoIGJ1aWxkZXIgZGVwZW5kZW50cyBvbiB0aGlzIHByb3BlcnR5LgogICAgICBNYXA8Skp1bXBUYXJnZXQsIExpc3Q8aXIuVHJlZU5vZGU+PiByZXZlcnNlZE1hcCA9IHt9OwogICAgICBfanVtcFRhcmdldE1hcC5mb3JFYWNoKChpci5UcmVlTm9kZSBub2RlLCBKSnVtcFRhcmdldCB0YXJnZXQpIHsKICAgICAgICByZXZlcnNlZE1hcC5wdXRJZkFic2VudCh0YXJnZXQsICgpID0+IFtdKS5hZGQobm9kZSk7CiAgICAgIH0pOwogICAgICBzaW5rLndyaXRlSW50KHJldmVyc2VkTWFwLmxlbmd0aCk7CiAgICAgIHJldmVyc2VkTWFwLmZvckVhY2goKEpKdW1wVGFyZ2V0IHRhcmdldCwgTGlzdDxpci5UcmVlTm9kZT4gbm9kZXMpIHsKICAgICAgICB0YXJnZXQud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgICAgIHNpbmsud3JpdGVUcmVlTm9kZXMobm9kZXMpOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHNpbmsud3JpdGVJbnQoMCk7CiAgICB9CiAgICBzaW5rLndyaXRlVHJlZU5vZGVzKF9icmVha3NBc0NvbnRpbnVlLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENvbXB1dGUgdGhpcyBlYWdlcmx5IGZyb20gdGhlIHJvb3Qgb2YgdGhlIG1lbWJlci4KICB2b2lkIF9lbnN1cmVKdW1wTWFwKGlyLlRyZWVOb2RlIG5vZGUpIHsKICAgIGlmIChfanVtcFRhcmdldE1hcCA9PSBudWxsKSB7CiAgICAgIEp1bXBWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSnVtcFZpc2l0b3IoY3VycmVudE1lbWJlcik7CgogICAgICAvLyBGaW5kIHRoZSByb290IG5vZGUgZm9yIHRoZSBjdXJyZW50IG1lbWJlci4KICAgICAgd2hpbGUgKG5vZGUgaXMhIGlyLk1lbWJlcikgewogICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgICAgfQoKICAgICAgbm9kZS5hY2NlcHQodmlzaXRvcik7CiAgICAgIF9qdW1wVGFyZ2V0TWFwID0gdmlzaXRvci5qdW1wVGFyZ2V0TWFwOwogICAgICBfYnJlYWtzQXNDb250aW51ZSA9IHZpc2l0b3IuYnJlYWtzQXNDb250aW51ZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBnZXQgY3VycmVudE1lbWJlciA9PiBfY3VycmVudE1lbWJlcjsKCiAgTG9jYWwgZ2V0TG9jYWxCeUluZGV4KGludCBpbmRleCkgewogICAgcmV0dXJuIF9sb2NhbHMuZ2V0RW50aXR5KGluZGV4KTsKICB9CgogIEBvdmVycmlkZQogIEp1bXBUYXJnZXQgZ2V0SnVtcFRhcmdldEZvckJyZWFrKGlyLkJyZWFrU3RhdGVtZW50IG5vZGUpIHsKICAgIF9lbnN1cmVKdW1wTWFwKG5vZGUudGFyZ2V0KTsKICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gX2p1bXBUYXJnZXRNYXBbbm9kZV07CiAgICBhc3NlcnQodGFyZ2V0ICE9IG51bGwsIGZhaWxlZEF0KGN1cnJlbnRNZW1iZXIsICdObyB0YXJnZXQgZm9yICRub2RlLicpKTsKICAgIHJldHVybiB0YXJnZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdlbmVyYXRlQ29udGludWVGb3JCcmVhayhpci5CcmVha1N0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gX2JyZWFrc0FzQ29udGludWUuY29udGFpbnMobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBKdW1wVGFyZ2V0IGdldEp1bXBUYXJnZXRGb3JDb250aW51ZVN3aXRjaChpci5Db250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICBfZW5zdXJlSnVtcE1hcChub2RlLnRhcmdldCk7CiAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IF9qdW1wVGFyZ2V0TWFwW25vZGVdOwogICAgYXNzZXJ0KHRhcmdldCAhPSBudWxsLCBmYWlsZWRBdChjdXJyZW50TWVtYmVyLCAnTm8gdGFyZ2V0IGZvciAkbm9kZS4nKSk7CiAgICByZXR1cm4gdGFyZ2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgSnVtcFRhcmdldCBnZXRKdW1wVGFyZ2V0Rm9yU3dpdGNoQ2FzZShpci5Td2l0Y2hDYXNlIG5vZGUpIHsKICAgIF9lbnN1cmVKdW1wTWFwKG5vZGUpOwogICAgcmV0dXJuIF9qdW1wVGFyZ2V0TWFwW25vZGVdOwogIH0KCiAgQG92ZXJyaWRlCiAgSnVtcFRhcmdldCBnZXRKdW1wVGFyZ2V0Rm9yRG8oaXIuRG9TdGF0ZW1lbnQgbm9kZSkgewogICAgX2Vuc3VyZUp1bXBNYXAobm9kZSk7CiAgICByZXR1cm4gX2p1bXBUYXJnZXRNYXBbbm9kZV07CiAgfQoKICBAb3ZlcnJpZGUKICBKdW1wVGFyZ2V0IGdldEp1bXBUYXJnZXRGb3JMYWJlbChpci5MYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKICAgIF9lbnN1cmVKdW1wTWFwKG5vZGUpOwogICAgcmV0dXJuIF9qdW1wVGFyZ2V0TWFwW25vZGVdOwogIH0KCiAgQG92ZXJyaWRlCiAgSnVtcFRhcmdldCBnZXRKdW1wVGFyZ2V0Rm9yU3dpdGNoKGlyLlN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICBfZW5zdXJlSnVtcE1hcChub2RlKTsKICAgIHJldHVybiBfanVtcFRhcmdldE1hcFtub2RlXTsKICB9CgogIEBvdmVycmlkZQogIEp1bXBUYXJnZXQgZ2V0SnVtcFRhcmdldEZvckZvcihpci5Gb3JTdGF0ZW1lbnQgbm9kZSkgewogICAgX2Vuc3VyZUp1bXBNYXAobm9kZSk7CiAgICByZXR1cm4gX2p1bXBUYXJnZXRNYXBbbm9kZV07CiAgfQoKICBAb3ZlcnJpZGUKICBKdW1wVGFyZ2V0IGdldEp1bXBUYXJnZXRGb3JGb3JJbihpci5Gb3JJblN0YXRlbWVudCBub2RlKSB7CiAgICBfZW5zdXJlSnVtcE1hcChub2RlKTsKICAgIHJldHVybiBfanVtcFRhcmdldE1hcFtub2RlXTsKICB9CgogIEBvdmVycmlkZQogIEp1bXBUYXJnZXQgZ2V0SnVtcFRhcmdldEZvcldoaWxlKGlyLldoaWxlU3RhdGVtZW50IG5vZGUpIHsKICAgIF9lbnN1cmVKdW1wTWFwKG5vZGUpOwogICAgcmV0dXJuIF9qdW1wVGFyZ2V0TWFwW25vZGVdOwogIH0KCiAgQG92ZXJyaWRlCiAgTG9jYWwgZ2V0TG9jYWxWYXJpYWJsZShpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBfdmFyaWFibGVNYXAucHV0SWZBYnNlbnQobm9kZSwgKCkgewogICAgICBKTG9jYWwgbG9jYWwgPSBuZXcgSkxvY2FsKG5vZGUubmFtZSwgY3VycmVudE1lbWJlciwKICAgICAgICAgIGlzUmVndWxhclBhcmFtZXRlcjogbm9kZS5wYXJlbnQgaXMgaXIuRnVuY3Rpb25Ob2RlKTsKICAgICAgX2xvY2Fscy5yZWdpc3RlcjxKTG9jYWwsIExvY2FsRGF0YT4obG9jYWwsIG5ldyBMb2NhbERhdGEobm9kZSkpOwogICAgICByZXR1cm4gbG9jYWw7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIExvY2FsIGdldExvY2FsVHlwZVZhcmlhYmxlKAogICAgICBpci5UeXBlUGFyYW1ldGVyVHlwZSBub2RlLCBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwKSB7CiAgICAvLyBUT0RPKGVmb3J0dW5hLCBqb2hubml3aW50aGVyKTogV2UncmUgbm90IHJlZ2lzdGVyaW5nIHRoZSB0eXBlIHZhcmlhYmxlcwogICAgLy8gbGlrZSB3ZSBhcmUgZm9yIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuIElzIHRoYXQgb2theSBvciBkbyB3ZSBuZWVkIHRvCiAgICAvLyBtYWtlIFR5cGVWYXJpYWJsZUxvY2FsIGEgSkxvY2FsPwogICAgcmV0dXJuIG5ldyBUeXBlVmFyaWFibGVMb2NhbChlbGVtZW50TWFwLmdldFR5cGVWYXJpYWJsZVR5cGUobm9kZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRnVuY3Rpb25Ob2RlIGdldEZ1bmN0aW9uTm9kZUZvclBhcmFtZXRlcihjb3ZhcmlhbnQgSkxvY2FsIHBhcmFtZXRlcikgewogICAgcmV0dXJuIF9sb2NhbHMuZ2V0RGF0YShwYXJhbWV0ZXIpLmZ1bmN0aW9uTm9kZTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldExvY2FsVHlwZShKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBjb3ZhcmlhbnQgSkxvY2FsIGxvY2FsKSB7CiAgICByZXR1cm4gX2xvY2Fscy5nZXREYXRhKGxvY2FsKS5nZXREYXJ0VHlwZShlbGVtZW50TWFwKTsKICB9Cn0KCmNsYXNzIEp1bXBWaXNpdG9yIGV4dGVuZHMgaXIuVmlzaXRvciB7CiAgaW50IGp1bXBJbmRleCA9IDA7CiAgaW50IGxhYmVsSW5kZXggPSAwOwogIGZpbmFsIE1lbWJlckVudGl0eSBtZW1iZXI7CiAgZmluYWwgTWFwPGlyLlRyZWVOb2RlLCBKSnVtcFRhcmdldD4ganVtcFRhcmdldE1hcCA9CiAgICAgIDxpci5UcmVlTm9kZSwgSkp1bXBUYXJnZXQ+e307CiAgZmluYWwgU2V0PGlyLkJyZWFrU3RhdGVtZW50PiBicmVha3NBc0NvbnRpbnVlID0gbmV3IFNldDxpci5CcmVha1N0YXRlbWVudD4oKTsKCiAgSnVtcFZpc2l0b3IodGhpcy5tZW1iZXIpOwoKICBKSnVtcFRhcmdldCBfZ2V0SnVtcFRhcmdldChpci5UcmVlTm9kZSBub2RlKSB7CiAgICByZXR1cm4ganVtcFRhcmdldE1hcC5wdXRJZkFic2VudChub2RlLCAoKSB7CiAgICAgIHJldHVybiBuZXcgSkp1bXBUYXJnZXQobWVtYmVyLCBqdW1wSW5kZXgrKywKICAgICAgICAgIGlzU3dpdGNoOiBub2RlIGlzIGlyLlN3aXRjaFN0YXRlbWVudCwKICAgICAgICAgIGlzU3dpdGNoQ2FzZTogbm9kZSBpcyBpci5Td2l0Y2hDYXNlKTsKICAgIH0pOwogIH0KCiAgSkxhYmVsRGVmaW5pdGlvbiBfZ2V0T3JDcmVhdGVMYWJlbChKSnVtcFRhcmdldCB0YXJnZXQpIHsKICAgIGlmICh0YXJnZXQubGFiZWxzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIHRhcmdldC5hZGRMYWJlbCgnbGFiZWwke2xhYmVsSW5kZXgrK30nKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0YXJnZXQubGFiZWxzLnNpbmdsZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGRlZmF1bHROb2RlKGlyLk5vZGUgbm9kZSkgPT4gbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwoKICBzdGF0aWMgYm9vbCBjYW5CZUJyZWFrVGFyZ2V0KGlyLlRyZWVOb2RlIG5vZGUpIHsKICAgIHJldHVybiBub2RlIGlzIGlyLkZvclN0YXRlbWVudCB8fAogICAgICAgIG5vZGUgaXMgaXIuRm9ySW5TdGF0ZW1lbnQgfHwKICAgICAgICBub2RlIGlzIGlyLldoaWxlU3RhdGVtZW50IHx8CiAgICAgICAgbm9kZSBpcyBpci5Eb1N0YXRlbWVudCB8fAogICAgICAgIG5vZGUgaXMgaXIuU3dpdGNoU3RhdGVtZW50OwogIH0KCiAgc3RhdGljIGJvb2wgY2FuQmVDb250aW51ZVRhcmdldChpci5UcmVlTm9kZSBub2RlKSB7CiAgICByZXR1cm4gbm9kZSBpcyBpci5Gb3JTdGF0ZW1lbnQgfHwKICAgICAgICBub2RlIGlzIGlyLkZvckluU3RhdGVtZW50IHx8CiAgICAgICAgbm9kZSBpcyBpci5XaGlsZVN0YXRlbWVudCB8fAogICAgICAgIG5vZGUgaXMgaXIuRG9TdGF0ZW1lbnQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJyZWFrU3RhdGVtZW50KGlyLkJyZWFrU3RhdGVtZW50IG5vZGUpIHsKICAgIEpKdW1wVGFyZ2V0IHRhcmdldDsKICAgIGlyLlRyZWVOb2RlIGJvZHkgPSBub2RlLnRhcmdldC5ib2R5OwogICAgaXIuVHJlZU5vZGUgcGFyZW50ID0gbm9kZS50YXJnZXQucGFyZW50OwoKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENvb3JkaW5hdGUgd2l0aCBDRkUtdGVhbSB0byBhdm9pZCBzdWNoIGFyYml0cmFyeQogICAgLy8gcmV2ZXJzZSBlbmdpbmVlcmluZyBtaXNtYXRjaGVzOgogICAgaWYgKHBhcmVudCBpcyBpci5CbG9jayAmJiBwYXJlbnQuc3RhdGVtZW50cy5sYXN0ID09IG5vZGUudGFyZ2V0KSB7CiAgICAgIC8vIEluIHN0cm9uZyBtb2RlIGZvciBjb2RlIGxpa2UgdGhpczoKICAgICAgLy8KICAgICAgLy8gICAgIGZvciAoaW50IGkgaW4gbGlzdCkgewogICAgICAvLyAgICAgICBjb250aW51ZTsKICAgICAgLy8gICAgIH0KICAgICAgLy8KICAgICAgLy8gYW4gaW1wbGljaXQgY2FzdCBtYXkgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBsYWJlbCBzdGF0ZW1lbnQsIHJlc3VsdGluZwogICAgICAvLyBpbiBjb2RlIGxpa2UgdGhpczoKICAgICAgLy8KICAgICAgLy8gICAgIGZvciAodmFyIGkgaW4gbGlzdCkgewogICAgICAvLyAgICAgICB2YXIgIzEgPSBpIGFzIGludDsKICAgICAgLy8gICAgICAgbDE6IHsKICAgICAgLy8gICAgICAgICAgYnJlYWsgbDE6CiAgICAgIC8vICAgICAgIH0KICAgICAgLy8gICAgIH0KICAgICAgLy8KICAgICAgLy8gZm9yIHdoaWNoIHdlIHNob3VsZCBzdGlsbCB1c2UgdGhlIGZvciBsb29wIGFzIGEgY29udGludWUgdGFyZ2V0LgogICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50OwogICAgfQogICAgaWYgKGNhbkJlQnJlYWtUYXJnZXQoYm9keSkpIHsKICAgICAgLy8gV2UgaGF2ZSBjb2RlIGxpa2UKICAgICAgLy8KICAgICAgLy8gICAgIGwxOiBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKICAgICAgLy8gICAgICAgIGJyZWFrIGwxOgogICAgICAvLyAgICAgfQogICAgICAvLwogICAgICAvLyBhbmQgY2FuIHRoZXJlZm9yZSB1c2UgdGhlIGZvciBsb29wIGFzIHRoZSBicmVhayB0YXJnZXQuCiAgICAgIHRhcmdldCA9IF9nZXRKdW1wVGFyZ2V0KGJvZHkpOwogICAgICB0YXJnZXQuaXNCcmVha1RhcmdldCA9IHRydWU7CiAgICAgIGlyLlRyZWVOb2RlIHNlYXJjaCA9IG5vZGU7CiAgICAgIGJvb2wgbmVlZHNMYWJlbCA9IGZhbHNlOwogICAgICB3aGlsZSAoc2VhcmNoICE9IG5vZGUudGFyZ2V0KSB7CiAgICAgICAgaWYgKGNhbkJlQnJlYWtUYXJnZXQoc2VhcmNoKSkgewogICAgICAgICAgbmVlZHNMYWJlbCA9IHNlYXJjaCAhPSBib2R5OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHNlYXJjaCA9IHNlYXJjaC5wYXJlbnQ7CiAgICAgIH0KICAgICAgaWYgKG5lZWRzTGFiZWwpIHsKICAgICAgICBKTGFiZWxEZWZpbml0aW9uIGxhYmVsID0gX2dldE9yQ3JlYXRlTGFiZWwodGFyZ2V0KTsKICAgICAgICBsYWJlbC5pc0JyZWFrVGFyZ2V0ID0gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjYW5CZUNvbnRpbnVlVGFyZ2V0KHBhcmVudCkpIHsKICAgICAgLy8gV2UgaGF2ZSBjb2RlIGxpa2UKICAgICAgLy8KICAgICAgLy8gICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgbDE6IHsKICAgICAgLy8gICAgICAgIGJyZWFrIGwxOgogICAgICAvLyAgICAgfQogICAgICAvLwogICAgICAvLyBhbmQgY2FuIHRoZXJlZm9yZSB1c2UgdGhlIGZvciBsb29wIGFzIGEgY29udGludWUgdGFyZ2V0LgogICAgICB0YXJnZXQgPSBfZ2V0SnVtcFRhcmdldChwYXJlbnQpOwogICAgICB0YXJnZXQuaXNDb250aW51ZVRhcmdldCA9IHRydWU7CiAgICAgIGJyZWFrc0FzQ29udGludWUuYWRkKG5vZGUpOwogICAgICBpci5UcmVlTm9kZSBzZWFyY2ggPSBub2RlOwogICAgICBib29sIG5lZWRzTGFiZWwgPSBmYWxzZTsKICAgICAgd2hpbGUgKHNlYXJjaCAhPSBub2RlLnRhcmdldCkgewogICAgICAgIGlmIChjYW5CZUNvbnRpbnVlVGFyZ2V0KHNlYXJjaCkpIHsKICAgICAgICAgIG5lZWRzTGFiZWwgPSBzZWFyY2ggIT0gYm9keTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzZWFyY2ggPSBzZWFyY2gucGFyZW50OwogICAgICB9CiAgICAgIGlmIChuZWVkc0xhYmVsKSB7CiAgICAgICAgSkxhYmVsRGVmaW5pdGlvbiBsYWJlbCA9IF9nZXRPckNyZWF0ZUxhYmVsKHRhcmdldCk7CiAgICAgICAgbGFiZWwuaXNDb250aW51ZVRhcmdldCA9IHRydWU7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIFdlIGhhdmUgY29kZSBsaWtlCiAgICAgIC8vCiAgICAgIC8vICAgICBsYWJlbDogaWYgKGMpIHsKICAgICAgLy8gICAgICAgICBpZiAoYyA8IDEwKSBicmVhayBsYWJlbDsKICAgICAgLy8gICAgIH0KICAgICAgLy8KICAgICAgLy8gYW5kIGxhYmVsIGlzIHRoZXJlZm9yZSBhbHdheXMgbmVlZGVkLgogICAgICB0YXJnZXQgPSBfZ2V0SnVtcFRhcmdldChub2RlLnRhcmdldCk7CiAgICAgIHRhcmdldC5pc0JyZWFrVGFyZ2V0ID0gdHJ1ZTsKICAgICAgSkxhYmVsRGVmaW5pdGlvbiBsYWJlbCA9IF9nZXRPckNyZWF0ZUxhYmVsKHRhcmdldCk7CiAgICAgIGxhYmVsLmlzQnJlYWtUYXJnZXQgPSB0cnVlOwogICAgfQogICAganVtcFRhcmdldE1hcFtub2RlXSA9IHRhcmdldDsKICAgIHN1cGVyLnZpc2l0QnJlYWtTdGF0ZW1lbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KGlyLkNvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIEpKdW1wVGFyZ2V0IHRhcmdldCA9IF9nZXRKdW1wVGFyZ2V0KG5vZGUudGFyZ2V0KTsKICAgIHRhcmdldC5pc0NvbnRpbnVlVGFyZ2V0ID0gdHJ1ZTsKICAgIGp1bXBUYXJnZXRNYXBbbm9kZV0gPSB0YXJnZXQ7CiAgICBKTGFiZWxEZWZpbml0aW9uIGxhYmVsID0gX2dldE9yQ3JlYXRlTGFiZWwodGFyZ2V0KTsKICAgIGxhYmVsLmlzQ29udGludWVUYXJnZXQgPSB0cnVlOwogICAgc3VwZXIudmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3dpdGNoU3RhdGVtZW50KGlyLlN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICBub2RlLmV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwogICAgaWYgKG5vZGUuY2FzZXMuaXNOb3RFbXB0eSkgewogICAgICAvLyBFbnN1cmUgdGhhdCBbbm9kZV0gaGFzIGEgY29ycmVzcG9uZGluZyB0YXJnZXQuIFdlIGdlbmVyYXRlIGEgYnJlYWsgaWY6CiAgICAgIC8vICAgLSBhIHN3aXRjaCBjYXNlIGNhbGxzIGEgZnVuY3Rpb24gdGhhdCBhbHdheXMgdGhyb3dzCiAgICAgIC8vICAgLSB0aGVyZSdzIGEgbWlzc2luZyBicmVhayBvbiB0aGUgbGFzdCBjYXNlIGlmIGl0IGlzbid0IGEgZGVmYXVsdCBjYXNlCiAgICAgIF9nZXRKdW1wVGFyZ2V0KG5vZGUpOwogICAgfQogICAgc3VwZXIudmlzaXRTd2l0Y2hTdGF0ZW1lbnQobm9kZSk7CiAgfQp9CgpjbGFzcyBKSnVtcFRhcmdldCBleHRlbmRzIEp1bXBUYXJnZXQgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSkp1bXBUYXJnZXRdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnanVtcC10YXJnZXQnOwoKICBmaW5hbCBNZW1iZXJFbnRpdHkgbWVtYmVyQ29udGV4dDsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgbmVzdGluZ0xldmVsOwogIExpc3Q8TGFiZWxEZWZpbml0aW9uPiBfbGFiZWxzOwogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgaXNTd2l0Y2g7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc1N3aXRjaENhc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0JyZWFrVGFyZ2V0OwogIEBvdmVycmlkZQogIGJvb2wgaXNDb250aW51ZVRhcmdldDsKCiAgSkp1bXBUYXJnZXQodGhpcy5tZW1iZXJDb250ZXh0LCB0aGlzLm5lc3RpbmdMZXZlbCwKICAgICAge3RoaXMuaXNTd2l0Y2g6IGZhbHNlLAogICAgICB0aGlzLmlzU3dpdGNoQ2FzZTogZmFsc2UsCiAgICAgIHRoaXMuaXNCcmVha1RhcmdldDogZmFsc2UsCiAgICAgIHRoaXMuaXNDb250aW51ZVRhcmdldDogZmFsc2V9KTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtKSnVtcFRhcmdldF0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBKSnVtcFRhcmdldC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgTWVtYmVyRW50aXR5IG1lbWJlckNvbnRleHQgPSBzb3VyY2UucmVhZE1lbWJlcigpOwogICAgaW50IG5lc3RpbmdMZXZlbCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBib29sIGlzU3dpdGNoID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzU3dpdGNoQ2FzZSA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0JyZWFrVGFyZ2V0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzQ29udGludWVUYXJnZXQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIEpKdW1wVGFyZ2V0IHRhcmdldCA9IG5ldyBKSnVtcFRhcmdldChtZW1iZXJDb250ZXh0LCBuZXN0aW5nTGV2ZWwsCiAgICAgICAgaXNTd2l0Y2g6IGlzU3dpdGNoLAogICAgICAgIGlzU3dpdGNoQ2FzZTogaXNTd2l0Y2hDYXNlLAogICAgICAgIGlzQnJlYWtUYXJnZXQ6IGlzQnJlYWtUYXJnZXQsCiAgICAgICAgaXNDb250aW51ZVRhcmdldDogaXNDb250aW51ZVRhcmdldCk7CiAgICBpbnQgbGFiZWxDb3VudCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhYmVsQ291bnQ7IGkrKykgewogICAgICBTdHJpbmcgbGFiZWxOYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgYm9vbCBpc0JyZWFrVGFyZ2V0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICAgIGJvb2wgaXNDb250aW51ZVRhcmdldCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgICB0YXJnZXQuYWRkTGFiZWwobGFiZWxOYW1lLAogICAgICAgICAgaXNCcmVha1RhcmdldDogaXNCcmVha1RhcmdldCwgaXNDb250aW51ZVRhcmdldDogaXNDb250aW51ZVRhcmdldCk7CiAgICB9CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gdGFyZ2V0OwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbSkp1bXBUYXJnZXRdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVyKG1lbWJlckNvbnRleHQpOwogICAgc2luay53cml0ZUludChuZXN0aW5nTGV2ZWwpOwogICAgc2luay53cml0ZUJvb2woaXNTd2l0Y2gpOwogICAgc2luay53cml0ZUJvb2woaXNTd2l0Y2hDYXNlKTsKICAgIHNpbmsud3JpdGVCb29sKGlzQnJlYWtUYXJnZXQpOwogICAgc2luay53cml0ZUJvb2woaXNDb250aW51ZVRhcmdldCk7CiAgICBpZiAoX2xhYmVscyAhPSBudWxsKSB7CiAgICAgIHNpbmsud3JpdGVJbnQoX2xhYmVscy5sZW5ndGgpOwogICAgICBmb3IgKExhYmVsRGVmaW5pdGlvbiBkZWZpbml0aW9uIGluIF9sYWJlbHMpIHsKICAgICAgICBzaW5rLndyaXRlU3RyaW5nKGRlZmluaXRpb24ubmFtZSk7CiAgICAgICAgc2luay53cml0ZUJvb2woZGVmaW5pdGlvbi5pc0JyZWFrVGFyZ2V0KTsKICAgICAgICBzaW5rLndyaXRlQm9vbChkZWZpbml0aW9uLmlzQ29udGludWVUYXJnZXQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzaW5rLndyaXRlSW50KDApOwogICAgfQogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIExhYmVsRGVmaW5pdGlvbiBhZGRMYWJlbChTdHJpbmcgbGFiZWxOYW1lLAogICAgICB7Ym9vbCBpc0JyZWFrVGFyZ2V0OiBmYWxzZSwgYm9vbCBpc0NvbnRpbnVlVGFyZ2V0OiBmYWxzZX0pIHsKICAgIF9sYWJlbHMgPz89IDxMYWJlbERlZmluaXRpb24+W107CiAgICBMYWJlbERlZmluaXRpb24gbGFiZWxEZWZpbml0aW9uID0gbmV3IEpMYWJlbERlZmluaXRpb24odGhpcywgbGFiZWxOYW1lLAogICAgICAgIGlzQnJlYWtUYXJnZXQ6IGlzQnJlYWtUYXJnZXQsIGlzQ29udGludWVUYXJnZXQ6IGlzQ29udGludWVUYXJnZXQpOwogICAgX2xhYmVscy5hZGQobGFiZWxEZWZpbml0aW9uKTsKICAgIHJldHVybiBsYWJlbERlZmluaXRpb247CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PExhYmVsRGVmaW5pdGlvbj4gZ2V0IGxhYmVscyB7CiAgICByZXR1cm4gX2xhYmVscyA/PyBjb25zdCA8TGFiZWxEZWZpbml0aW9uPltdOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ0pKdW1wVGFyZ2V0KCcpOwogICAgc2Iud3JpdGUoJ21lbWJlckNvbnRleHQ9Jyk7CiAgICBzYi53cml0ZShtZW1iZXJDb250ZXh0KTsKICAgIHNiLndyaXRlKCcsbmVzdGluZ0xldmVsPScpOwogICAgc2Iud3JpdGUobmVzdGluZ0xldmVsKTsKICAgIHNiLndyaXRlKCcsaXNCcmVha1RhcmdldD0nKTsKICAgIHNiLndyaXRlKGlzQnJlYWtUYXJnZXQpOwogICAgc2Iud3JpdGUoJyxpc0NvbnRpbnVlVGFyZ2V0PScpOwogICAgc2Iud3JpdGUoaXNDb250aW51ZVRhcmdldCk7CiAgICBpZiAoX2xhYmVscyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCcsbGFiZWxzPScpOwogICAgICBzYi53cml0ZShfbGFiZWxzKTsKICAgIH0KICAgIHNiLndyaXRlKCcpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCmNsYXNzIEpMYWJlbERlZmluaXRpb24gZXh0ZW5kcyBMYWJlbERlZmluaXRpb24gewogIEBvdmVycmlkZQogIGZpbmFsIEp1bXBUYXJnZXQgdGFyZ2V0OwogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBsYWJlbE5hbWU7CiAgQG92ZXJyaWRlCiAgYm9vbCBpc0JyZWFrVGFyZ2V0OwogIEBvdmVycmlkZQogIGJvb2wgaXNDb250aW51ZVRhcmdldDsKCiAgSkxhYmVsRGVmaW5pdGlvbih0aGlzLnRhcmdldCwgdGhpcy5sYWJlbE5hbWUsCiAgICAgIHt0aGlzLmlzQnJlYWtUYXJnZXQ6IGZhbHNlLCB0aGlzLmlzQ29udGludWVUYXJnZXQ6IGZhbHNlfSk7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiBsYWJlbE5hbWU7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ0pMYWJlbERlZmluaXRpb24oJyk7CiAgICBzYi53cml0ZSgnLGxhYmVsTmFtZT0nKTsKICAgIHNiLndyaXRlKGxhYmVsTmFtZSk7CiAgICBzYi53cml0ZSgnLGlzQnJlYWtUYXJnZXQ9Jyk7CiAgICBzYi53cml0ZShpc0JyZWFrVGFyZ2V0KTsKICAgIHNiLndyaXRlKCcsaXNDb250aW51ZVRhcmdldD0nKTsKICAgIHNiLndyaXRlKGlzQ29udGludWVUYXJnZXQpOwogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgSkxvY2FsIGV4dGVuZHMgSW5kZXhlZExvY2FsIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBNZW1iZXJFbnRpdHkgbWVtYmVyQ29udGV4dDsKCiAgLy8vIFRydWUgaWYgdGhpcyBsb2NhbCByZXByZXNlbnRzIGEgbG9jYWwgcGFyYW1ldGVyLgogIGZpbmFsIGJvb2wgaXNSZWd1bGFyUGFyYW1ldGVyOwoKICBKTG9jYWwodGhpcy5uYW1lLCB0aGlzLm1lbWJlckNvbnRleHQsIHt0aGlzLmlzUmVndWxhclBhcmFtZXRlcjogZmFsc2V9KSB7CiAgICBhc3NlcnQobWVtYmVyQ29udGV4dCBpcyEgSkdlbmVyYXRvckJvZHkpOwogIH0KCiAgU3RyaW5nIGdldCBfa2luZCA9PiAnbG9jYWwnOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnJF9raW5kKCcpOwogICAgaWYgKG1lbWJlckNvbnRleHQuZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICBzYi53cml0ZShtZW1iZXJDb250ZXh0LmVuY2xvc2luZ0NsYXNzLm5hbWUpOwogICAgICBzYi53cml0ZSgnLicpOwogICAgfQogICAgc2Iud3JpdGUobWVtYmVyQ29udGV4dC5uYW1lKTsKICAgIHNiLndyaXRlKCcjJyk7CiAgICBzYi53cml0ZShuYW1lKTsKICAgIHNiLndyaXRlKCcpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCmNsYXNzIExvY2FsRGF0YSB7CiAgZmluYWwgaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlOwoKICBEYXJ0VHlwZSBfdHlwZTsKCiAgTG9jYWxEYXRhKHRoaXMubm9kZSk7CgogIERhcnRUeXBlIGdldERhcnRUeXBlKEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBfdHlwZSA/Pz0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLnR5cGUpOwogIH0KCiAgaXIuRnVuY3Rpb25Ob2RlIGdldCBmdW5jdGlvbk5vZGUgPT4gbm9kZS5wYXJlbnQ7Cn0KCi8vLyBDYWxscyBbZl0gZm9yIGVhY2ggcGFyYW1ldGVyIGluIFtmdW5jdGlvbl0gaW4gdGhlIGNhbm9uaWNhbCBvcmRlcjoKLy8vIFBvc2l0aW9uYWwgcGFyYW1ldGVycyBieSBpbmRleCwgdGhlbiBuYW1lZCBwYXJhbWV0ZXJzIGxleGljb2dyYXBoaWNhbGx5Lgp2b2lkIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQXNMb2NhbCgKICAgIEdsb2JhbExvY2Fsc01hcCBnbG9iYWxMb2NhbHNNYXAsCiAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLAogICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24sCiAgICB2b2lkIGYoTG9jYWwgcGFyYW1ldGVyLCB7Ym9vbCBpc0VsaWRlZH0pKSB7CiAgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwID0gZ2xvYmFsTG9jYWxzTWFwLmdldExvY2Fsc01hcChmdW5jdGlvbik7CiAgZm9yRWFjaE9yZGVyZWRQYXJhbWV0ZXIoZWxlbWVudE1hcCwgZnVuY3Rpb24sCiAgICAgIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCB7Ym9vbCBpc0VsaWRlZH0pIHsKICAgIGYobG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUodmFyaWFibGUpLCBpc0VsaWRlZDogaXNFbGlkZWQpOwogIH0pOwp9CoKGAE5OPAEhASgBGhkkIyEhLgEbLAEYSR0xAToBKAEuAT1CFzslKSRAOS0pCAYVNgQBMygVSFFOTidATT8IJg9NJyIIEwQBNDhPTFFQRhoiRiQ6BAEsBkVIMy00JQQCATtPHSoBHzMuNSowMQEuAUNAFyooLCQvMzs1MywzIgYmGRssSToqKQoIBjAVBAE5DCgVJSE1NCcqMCUIIkBIS09RPEY9CilKJiQKDRgGPRMEAUwqIjwBNCMcCAEcLjQGBAEMNAElJQQBDD0hLk0TBAEMOi0EAQxPIS5NEwQBDD4aIQQBDDcaIQQBDD8aIQQBDD8aIQQBDDkaIQQBDD0aIQQBDD0aIQQBDDgvOj9HFAgEAQwePk9QKEgEAQxMNAQBDE07BAIBJxUWHTYkUAEcATEwMjAwCAQBOyE2DSMGBAEMOQEzJiUlIiQEATYmJSUgBAEMMBgpLQFNJ0csCSMZDwlQHAkjIhUcEQ8JSh4GIhsJMBoPCUElIyEfJignEQogCBg8JAguGwkwGg8JQicmIiEfJisnEQogCBg8JwgNGwkdKg8JLywjOiIGIiUEAQxCNiQiOCMuBAEMMiIhUD9RHAYmBAIBJ0UdKwEkDBohDBcMGwwWDBkBNR0gISYBOT4XNiknKywvRhwkJi0nKy4uMSFNBhUTBAEvKBUlIR4iIyYbJTQrMjUIDRgGEwQBDC1DJUxLIhwEAQwlMQQBDBYqHiAdIBwhHSQgGxwZBhMaBAIBMQwbDBoMFgwZATBCAQwgDBYqIx0ZIR0kIBMaBAIBJAwVJAE3IQFMLgQBHwEMFioZMDMVBiITFBMaBAIBEiUBEgEYATQ4BAEzAgFHTSUlHx0wSDA7QQYCASlwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19tb2RlbC9sb2NhbHMuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9rZXJuZWwvZGFydDJqc190YXJnZXQuZGFydJdGLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIFRPRE8oam9obm5pd2ludGhlcik6IEFkZCBhIHRlc3QgdGhhdCBlbnN1cmUgdGhhdCB0aGlzIGxpYnJhcnkgZG9lc24ndCBkZXBlbmQKLy8gb24gdGhlIGRhcnQyanMgaW50ZXJuYWxzLgpsaWJyYXJ5IGNvbXBpbGVyLnNyYy5rZXJuZWwuZGFydDJqc190YXJnZXQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0JzsKaW1wb3J0ICdpbnZvY2F0aW9uX21pcnJvcl9jb25zdGFudHMuZGFydCc7Cgpjb25zdCBJdGVyYWJsZTxTdHJpbmc+IF9hbGxvd2VkRGFydFNjaGVtZVBhdGhzID0gY29uc3QgPFN0cmluZz5bCiAgJ2FzeW5jJywKICAnaHRtbCcsCiAgJ2h0bWxfY29tbW9uJywKICAnaW5kZXhlZF9kYicsCiAgJ2pzJywKICAnanNfdXRpbCcsCiAgJ3N2ZycsCiAgJ19uYXRpdmVfdHlwZWRfZGF0YScsCiAgJ3dlYl9hdWRpbycsCiAgJ3dlYl9nbCcsCiAgJ3dlYl9zcWwnCl07Cgpib29sIG1heWJlRW5hYmxlTmF0aXZlKFVyaSB1cmkpIHsKICBib29sIGFsbG93ZWRUZXN0TGlicmFyeSgpIHsKICAgIFN0cmluZyBzY3JpcHROYW1lID0gdXJpLnBhdGg7CiAgICByZXR1cm4gc2NyaXB0TmFtZS5jb250YWlucygndGVzdHMvY29tcGlsZXIvZGFydDJqc19uYXRpdmUnKSB8fAogICAgICAgIHNjcmlwdE5hbWUuY29udGFpbnMoJ3Rlc3RzL2NvbXBpbGVyL2RhcnQyanNfZXh0cmEnKSB8fAogICAgICAgIHNjcmlwdE5hbWUuY29udGFpbnMoJ2dlbmVyYXRlZF90ZXN0cy9kYXJ0MmpzX25hdGl2ZS9uYXRpdmVfdGVzdCcpOwogIH0KCiAgYm9vbCBhbGxvd2VkRGFydExpYnJhcnkoKSB7CiAgICBpZiAodXJpLnNjaGVtZSAhPSAnZGFydCcpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfYWxsb3dlZERhcnRTY2hlbWVQYXRocy5jb250YWlucyh1cmkucGF0aCk7CiAgfQoKICByZXR1cm4gYWxsb3dlZFRlc3RMaWJyYXJ5KCkgfHwgYWxsb3dlZERhcnRMaWJyYXJ5KCk7Cn0KCi8vLyBBIGtlcm5lbCBbVGFyZ2V0XSB0byBjb25maWd1cmUgdGhlIERhcnQgRnJvbnQgRW5kIGZvciBkYXJ0MmpzLgpjbGFzcyBEYXJ0MmpzVGFyZ2V0IGV4dGVuZHMgVGFyZ2V0IHsKICBmaW5hbCBUYXJnZXRGbGFncyBmbGFnczsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgRGFydDJqc1RhcmdldCh0aGlzLm5hbWUsIHRoaXMuZmxhZ3MpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBsZWdhY3lNb2RlID0+IGZsYWdzLmxlZ2FjeU1vZGU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGVuYWJsZU5vU3VjaE1ldGhvZEZvcndhcmRlcnMgPT4gIWZsYWdzLmxlZ2FjeU1vZGU7CgogIEBvdmVycmlkZQogIExpc3Q8U3RyaW5nPiBnZXQgZXh0cmFSZXF1aXJlZExpYnJhcmllcyA9PiBfcmVxdWlyZWRMaWJyYXJpZXNbbmFtZV07CgogIEBvdmVycmlkZQogIGJvb2wgbWF5RGVmaW5lUmVzdHJpY3RlZFR5cGUoVXJpIHVyaSkgPT4KICAgICAgdXJpLnNjaGVtZSA9PSAnZGFydCcgJiYKICAgICAgKHVyaS5wYXRoID09ICdjb3JlJyB8fCB1cmkucGF0aCA9PSAnX2ludGVyY2VwdG9ycycpOwoKICBAb3ZlcnJpZGUKICBib29sIGFsbG93UGxhdGZvcm1Qcml2YXRlTGlicmFyeUFjY2VzcyhVcmkgaW1wb3J0ZXIsIFVyaSBpbXBvcnRlZCkgPT4KICAgICAgc3VwZXIuYWxsb3dQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzKGltcG9ydGVyLCBpbXBvcnRlZCkgfHwKICAgICAgbWF5YmVFbmFibGVOYXRpdmUoaW1wb3J0ZXIpOwoKICBAb3ZlcnJpZGUKICBib29sIGVuYWJsZU5hdGl2ZShVcmkgdXJpKSA9PiBtYXliZUVuYWJsZU5hdGl2ZSh1cmkpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBuYXRpdmVFeHRlbnNpb25FeHBlY3RzU3RyaW5nID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBlcnJvck9uVW5leGFjdFdlYkludExpdGVyYWxzID0+IHRydWU7CgogIEBvdmVycmlkZQogIHZvaWQgcGVyZm9ybU1vZHVsYXJUcmFuc2Zvcm1hdGlvbnNPbkxpYnJhcmllcygKICAgICAgaXIuQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgICBMaXN0PGlyLkxpYnJhcnk+IGxpYnJhcmllcywKICAgICAgRGlhZ25vc3RpY1JlcG9ydGVyIGRpYWdub3N0aWNSZXBvcnRlciwKICAgICAge3ZvaWQgbG9nZ2VyKFN0cmluZyBtc2cpfSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRXhwcmVzc2lvbiBpbnN0YW50aWF0ZUludm9jYXRpb24oCiAgICAgIENvcmVUeXBlcyBjb3JlVHlwZXMsCiAgICAgIGlyLkV4cHJlc3Npb24gcmVjZWl2ZXIsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBpci5Bcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBpbnQgb2Zmc2V0LAogICAgICBib29sIGlzU3VwZXIpIHsKICAgIGludCBraW5kOwogICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnZ2V0OicpKSB7CiAgICAgIGtpbmQgPSBpbnZvY2F0aW9uTWlycm9yR2V0dGVyS2luZDsKICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDQpOwogICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ3NldDonKSkgewogICAgICBraW5kID0gaW52b2NhdGlvbk1pcnJvclNldHRlcktpbmQ7CiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyg0KTsKICAgIH0gZWxzZSB7CiAgICAgIGtpbmQgPSBpbnZvY2F0aW9uTWlycm9yTWV0aG9kS2luZDsKICAgIH0KICAgIHJldHVybiBuZXcgaXIuU3RhdGljSW52b2NhdGlvbigKICAgICAgICBjb3JlVHlwZXMuaW5kZXgKICAgICAgICAgICAgLmdldFRvcExldmVsTWVtYmVyKCdkYXJ0OmNvcmUnLCAnX2NyZWF0ZUludm9jYXRpb25NaXJyb3InKSwKICAgICAgICBuZXcgaXIuQXJndW1lbnRzKDxpci5FeHByZXNzaW9uPlsKICAgICAgICAgIG5ldyBpci5TdHJpbmdMaXRlcmFsKG5hbWUpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgICAgbmV3IGlyLkxpc3RMaXRlcmFsKAogICAgICAgICAgICAgIGFyZ3VtZW50cy50eXBlcy5tYXAoKHQpID0+IG5ldyBpci5UeXBlTGl0ZXJhbCh0KSkudG9MaXN0KCkpLAogICAgICAgICAgbmV3IGlyLkxpc3RMaXRlcmFsKGFyZ3VtZW50cy5wb3NpdGlvbmFsKS4uZmlsZU9mZnNldCA9IG9mZnNldCwKICAgICAgICAgIG5ldyBpci5NYXBMaXRlcmFsKG5ldyBMaXN0PGlyLk1hcEVudHJ5Pi5mcm9tKAogICAgICAgICAgICAgIGFyZ3VtZW50cy5uYW1lZC5tYXAoKGlyLk5hbWVkRXhwcmVzc2lvbiBhcmcpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBpci5NYXBFbnRyeSgKICAgICAgICAgICAgICAgIG5ldyBpci5TdHJpbmdMaXRlcmFsKGFyZy5uYW1lKS4uZmlsZU9mZnNldCA9IGFyZy5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgYXJnLnZhbHVlKQogICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGFyZy5maWxlT2Zmc2V0OwogICAgICAgICAgfSkpLCBrZXlUeXBlOiBjb3JlVHlwZXMuc3RyaW5nQ2xhc3MucmF3VHlwZSkKICAgICAgICAgICAgLi5pc0NvbnN0ID0gKGFyZ3VtZW50cy5uYW1lZC5sZW5ndGggPT0gMCkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gYXJndW1lbnRzLmZpbGVPZmZzZXQsCiAgICAgICAgICBuZXcgaXIuSW50TGl0ZXJhbChraW5kKS4uZmlsZU9mZnNldCA9IG9mZnNldCwKICAgICAgICBdKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRXhwcmVzc2lvbiBpbnN0YW50aWF0ZU5vU3VjaE1ldGhvZEVycm9yKENvcmVUeXBlcyBjb3JlVHlwZXMsCiAgICAgIGlyLkV4cHJlc3Npb24gcmVjZWl2ZXIsIFN0cmluZyBuYW1lLCBpci5Bcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCBpc01ldGhvZDogZmFsc2UsCiAgICAgIGJvb2wgaXNHZXR0ZXI6IGZhbHNlLAogICAgICBib29sIGlzU2V0dGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc0ZpZWxkOiBmYWxzZSwKICAgICAgYm9vbCBpc0xvY2FsVmFyaWFibGU6IGZhbHNlLAogICAgICBib29sIGlzRHluYW1pYzogZmFsc2UsCiAgICAgIGJvb2wgaXNTdXBlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNTdGF0aWM6IGZhbHNlLAogICAgICBib29sIGlzQ29uc3RydWN0b3I6IGZhbHNlLAogICAgICBib29sIGlzVG9wTGV2ZWw6IGZhbHNlfSkgewogICAgLy8gVE9ETyhzaWdtdW5kKTogaW1wbGVtZW50OwogICAgcmV0dXJuIG5ldyBpci5JbnZhbGlkRXhwcmVzc2lvbihudWxsKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50c0JhY2tlbmQgY29uc3RhbnRzQmFja2VuZChDb3JlVHlwZXMgY29yZVR5cGVzKSA9PgogICAgICBjb25zdCBEYXJ0MmpzQ29uc3RhbnRzQmFja2VuZChzdXBwb3J0c1VuZXZhbHVhdGVkQ29uc3RhbnRzOiB0cnVlKTsKfQoKLy8gVE9ETyhzaWdtdW5kKTogdGhpcyAiZXh0cmFSZXF1aXJlZExpYnJhcmllcyIgbmVlZHMgdG8gYmUgcmVtb3ZlZC4uLgovLyBjb21waWxlLXBsYXRmb3JtIHNob3VsZCBqdXN0IHNwZWNpZnkgd2hpY2ggbGlicmFyaWVzIHRvIGNvbXBpbGUgaW5zdGVhZC4KY29uc3QgX3JlcXVpcmVkTGlicmFyaWVzID0gY29uc3QgPFN0cmluZywgTGlzdDxTdHJpbmc+PnsKICAnZGFydDJqcyc6IGNvbnN0IDxTdHJpbmc+WwogICAgJ2RhcnQ6X2Nocm9tZScsCiAgICAnZGFydDpfZm9yZWlnbl9oZWxwZXInLAogICAgJ2RhcnQ6X2ludGVyY2VwdG9ycycsCiAgICAnZGFydDpfaW50ZXJuYWwnLAogICAgJ2RhcnQ6X2pzX2VtYmVkZGVkX25hbWVzJywKICAgICdkYXJ0Ol9qc19oZWxwZXInLAogICAgJ2RhcnQ6X2pzX25hbWVzJywKICAgICdkYXJ0Ol9uYXRpdmVfdHlwZWRfZGF0YScsCiAgICAnZGFydDphc3luYycsCiAgICAnZGFydDpjb2xsZWN0aW9uJywKICAgICdkYXJ0Omh0bWwnLAogICAgJ2RhcnQ6aHRtbF9jb21tb24nLAogICAgJ2RhcnQ6aW5kZXhlZF9kYicsCiAgICAnZGFydDppbycsCiAgICAnZGFydDpqcycsCiAgICAnZGFydDpqc191dGlsJywKICAgICdkYXJ0Om1pcnJvcnMnLAogICAgJ2RhcnQ6c3ZnJywKICAgICdkYXJ0OndlYl9hdWRpbycsCiAgICAnZGFydDp3ZWJfZ2wnLAogICAgJ2RhcnQ6d2ViX3NxbCcsCiAgXSwKICAnZGFydDJqc19zZXJ2ZXInOiBjb25zdCA8U3RyaW5nPlsKICAgICdkYXJ0Ol9mb3JlaWduX2hlbHBlcicsCiAgICAnZGFydDpfaW50ZXJjZXB0b3JzJywKICAgICdkYXJ0Ol9pbnRlcm5hbCcsCiAgICAnZGFydDpfanNfZW1iZWRkZWRfbmFtZXMnLAogICAgJ2RhcnQ6X2pzX2hlbHBlcicsCiAgICAnZGFydDpfanNfbmFtZXMnLAogICAgJ2RhcnQ6X25hdGl2ZV90eXBlZF9kYXRhJywKICAgICdkYXJ0OmFzeW5jJywKICAgICdkYXJ0OmNvbGxlY3Rpb24nLAogICAgJ2RhcnQ6aW8nLAogICAgJ2RhcnQ6anMnLAogICAgJ2RhcnQ6anNfdXRpbCcsCiAgICAnZGFydDptaXJyb3JzJywKICBdCn07CgpjbGFzcyBEYXJ0MmpzQ29uc3RhbnRzQmFja2VuZCBleHRlbmRzIENvbnN0YW50c0JhY2tlbmQgewogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgc3VwcG9ydHNVbmV2YWx1YXRlZENvbnN0YW50czsKCiAgY29uc3QgRGFydDJqc0NvbnN0YW50c0JhY2tlbmQoe3RoaXMuc3VwcG9ydHNVbmV2YWx1YXRlZENvbnN0YW50c30pOwoKICBAb3ZlcnJpZGUKICBOdW1iZXJTZW1hbnRpY3MgZ2V0IG51bWJlclNlbWFudGljcyA9PiBOdW1iZXJTZW1hbnRpY3MuanM7Cn0KgM0ATk48AVAdLAEoKS4tKwFBCwoREAgNCRgPDAwDASIeIkM/SwQBHiw3BAE3AgFDJRsMFQEoAQwrAQw+AQxHAQwrHjsBDEhFIwEMOAEMMgEMMQEMMR4bICItJAEMJxseEx4SFg4jKSAqKSANKQYkGEgqOx5LSTg9JE0bLTc2MTgMHQQBDEJPHRwcGyMdGxwhISErBAEMPEkCAUdMOR0UHBoWHxcWHxIXERgXDw8UFBAWExQFJBwaFh8XFh8SFw8PFBQEAwE5DCsBRgEMPQIBL3BhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9kYXJ0MmpzX3RhcmdldC5kYXJ0M3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2tlcm5lbC9rZWxlbWVudHMuZGFydJ1HLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBFbnRpdHkgbW9kZWwgZm9yIGVsZW1lbnRzIGRlcml2ZWQgZnJvbSBLZXJuZWwgSVIuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9pbmRleGVkLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwoKY29uc3QgU3RyaW5nIGtFbGVtZW50UHJlZml4ID0gJ2s6JzsKCmNsYXNzIEtMaWJyYXJ5IGV4dGVuZHMgSW5kZXhlZExpYnJhcnkgewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lOwogIEBvdmVycmlkZQogIGZpbmFsIFVyaSBjYW5vbmljYWxVcmk7CgogIEtMaWJyYXJ5KHRoaXMubmFtZSwgdGhpcy5jYW5vbmljYWxVcmkpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtrRWxlbWVudFByZWZpeH1saWJyYXJ5KCRuYW1lKSc7Cn0KCmNsYXNzIEtDbGFzcyBleHRlbmRzIEluZGV4ZWRDbGFzcyB7CiAgQG92ZXJyaWRlCiAgZmluYWwgS0xpYnJhcnkgbGlicmFyeTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0Fic3RyYWN0OwoKICBLQ2xhc3ModGhpcy5saWJyYXJ5LCB0aGlzLm5hbWUsIHt0aGlzLmlzQWJzdHJhY3R9KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDbG9zdXJlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtrRWxlbWVudFByZWZpeH1jbGFzcygkbmFtZSknOwp9CgpjbGFzcyBLVHlwZWRlZiBleHRlbmRzIEluZGV4ZWRUeXBlZGVmIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBLTGlicmFyeSBsaWJyYXJ5OwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgS1R5cGVkZWYodGhpcy5saWJyYXJ5LCB0aGlzLm5hbWUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtrRWxlbWVudFByZWZpeH10eXBlZGVmKCRuYW1lKSc7Cn0KCmFic3RyYWN0IGNsYXNzIEtNZW1iZXIgZXh0ZW5kcyBJbmRleGVkTWVtYmVyIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBLTGlicmFyeSBsaWJyYXJ5OwogIEBvdmVycmlkZQogIGZpbmFsIEtDbGFzcyBlbmNsb3NpbmdDbGFzczsKICBmaW5hbCBOYW1lIF9uYW1lOwogIGZpbmFsIGJvb2wgX2lzU3RhdGljOwoKICBLTWVtYmVyKHRoaXMubGlicmFyeSwgdGhpcy5lbmNsb3NpbmdDbGFzcywgdGhpcy5fbmFtZSwge2Jvb2wgaXNTdGF0aWM6IGZhbHNlfSkKICAgICAgOiBfaXNTdGF0aWMgPSBpc1N0YXRpYzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+IF9uYW1lLnRleHQ7CgogIEBvdmVycmlkZQogIE5hbWUgZ2V0IG1lbWJlck5hbWUgPT4gX25hbWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQXNzaWduYWJsZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDb25zdCA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNBYnN0cmFjdCA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTZXR0ZXIgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzR2V0dGVyID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Z1bmN0aW9uID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZpZWxkID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnN0cnVjdG9yID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0luc3RhbmNlTWVtYmVyID0+IGVuY2xvc2luZ0NsYXNzICE9IG51bGwgJiYgIV9pc1N0YXRpYzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTdGF0aWMgPT4gZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCAmJiBfaXNTdGF0aWM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVG9wTGV2ZWwgPT4gZW5jbG9zaW5nQ2xhc3MgPT0gbnVsbDsKCiAgU3RyaW5nIGdldCBfa2luZDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7a0VsZW1lbnRQcmVmaXh9JF9raW5kJwogICAgICAnKCR7ZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCA/ICcke2VuY2xvc2luZ0NsYXNzLm5hbWV9LicgOiAnJ30kbmFtZSknOwp9CgphYnN0cmFjdCBjbGFzcyBLRnVuY3Rpb24gZXh0ZW5kcyBLTWVtYmVyCiAgICBpbXBsZW1lbnRzIEZ1bmN0aW9uRW50aXR5LCBJbmRleGVkRnVuY3Rpb24gewogIEBvdmVycmlkZQogIGZpbmFsIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmU7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0V4dGVybmFsOwogIEBvdmVycmlkZQogIGZpbmFsIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyOwoKICBLRnVuY3Rpb24oS0xpYnJhcnkgbGlicmFyeSwgS0NsYXNzIGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsCiAgICAgIHRoaXMucGFyYW1ldGVyU3RydWN0dXJlLCB0aGlzLmFzeW5jTWFya2VyLAogICAgICB7Ym9vbCBpc1N0YXRpYzogZmFsc2UsIHRoaXMuaXNFeHRlcm5hbDogZmFsc2V9KQogICAgICA6IHN1cGVyKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBpc1N0YXRpYzogaXNTdGF0aWMpOwp9CgphYnN0cmFjdCBjbGFzcyBLQ29uc3RydWN0b3IgZXh0ZW5kcyBLRnVuY3Rpb24KICAgIGltcGxlbWVudHMgQ29uc3RydWN0b3JFbnRpdHksIEluZGV4ZWRDb25zdHJ1Y3RvciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0NvbnN0OwoKICBLQ29uc3RydWN0b3IoCiAgICAgIEtDbGFzcyBlbmNsb3NpbmdDbGFzcywgTmFtZSBuYW1lLCBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICB7Ym9vbCBpc0V4dGVybmFsLCB0aGlzLmlzQ29uc3R9KQogICAgICA6IHN1cGVyKGVuY2xvc2luZ0NsYXNzLmxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgICAgIEFzeW5jTWFya2VyLlNZTkMsCiAgICAgICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnN0cnVjdG9yID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSW5zdGFuY2VNZW1iZXIgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3RhdGljID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1RvcExldmVsID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9raW5kID0+ICdjb25zdHJ1Y3Rvcic7Cn0KCmNsYXNzIEtHZW5lcmF0aXZlQ29uc3RydWN0b3IgZXh0ZW5kcyBLQ29uc3RydWN0b3IgewogIEtHZW5lcmF0aXZlQ29uc3RydWN0b3IoCiAgICAgIEtDbGFzcyBlbmNsb3NpbmdDbGFzcywgTmFtZSBuYW1lLCBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICB7Ym9vbCBpc0V4dGVybmFsLCBib29sIGlzQ29uc3R9KQogICAgICA6IHN1cGVyKGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZhY3RvcnlDb25zdHJ1Y3RvciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNHZW5lcmF0aXZlQ29uc3RydWN0b3IgPT4gdHJ1ZTsKfQoKY2xhc3MgS0ZhY3RvcnlDb25zdHJ1Y3RvciBleHRlbmRzIEtDb25zdHJ1Y3RvciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yOwoKICBLRmFjdG9yeUNvbnN0cnVjdG9yKAogICAgICBLQ2xhc3MgZW5jbG9zaW5nQ2xhc3MsIE5hbWUgbmFtZSwgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAge2Jvb2wgaXNFeHRlcm5hbCwgYm9vbCBpc0NvbnN0LCB0aGlzLmlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3J9KQogICAgICA6IHN1cGVyKGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZhY3RvcnlDb25zdHJ1Y3RvciA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0dlbmVyYXRpdmVDb25zdHJ1Y3RvciA9PiBmYWxzZTsKfQoKY2xhc3MgS01ldGhvZCBleHRlbmRzIEtGdW5jdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0Fic3RyYWN0OwoKICBLTWV0aG9kKEtMaWJyYXJ5IGxpYnJhcnksIEtDbGFzcyBlbmNsb3NpbmdDbGFzcywgTmFtZSBuYW1lLAogICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLCBBc3luY01hcmtlciBhc3luY01hcmtlciwKICAgICAge2Jvb2wgaXNTdGF0aWMsIGJvb2wgaXNFeHRlcm5hbCwgdGhpcy5pc0Fic3RyYWN0fSkKICAgICAgOiBzdXBlcihsaWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgbmFtZSwgcGFyYW1ldGVyU3RydWN0dXJlLCBhc3luY01hcmtlciwKICAgICAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0V4dGVybmFsOiBpc0V4dGVybmFsKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNGdW5jdGlvbiA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9raW5kID0+ICdtZXRob2QnOwp9CgpjbGFzcyBLR2V0dGVyIGV4dGVuZHMgS0Z1bmN0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQWJzdHJhY3Q7CgogIEtHZXR0ZXIoS0xpYnJhcnkgbGlicmFyeSwgS0NsYXNzIGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyLAogICAgICB7Ym9vbCBpc1N0YXRpYywgYm9vbCBpc0V4dGVybmFsLCB0aGlzLmlzQWJzdHJhY3R9KQogICAgICA6IHN1cGVyKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBjb25zdCBQYXJhbWV0ZXJTdHJ1Y3R1cmUuZ2V0dGVyKCksCiAgICAgICAgICAgIGFzeW5jTWFya2VyLAogICAgICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0dldHRlciA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9raW5kID0+ICdnZXR0ZXInOwp9CgpjbGFzcyBLU2V0dGVyIGV4dGVuZHMgS0Z1bmN0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQWJzdHJhY3Q7CgogIEtTZXR0ZXIoS0xpYnJhcnkgbGlicmFyeSwgS0NsYXNzIGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsCiAgICAgIHtib29sIGlzU3RhdGljLCBib29sIGlzRXh0ZXJuYWwsIHRoaXMuaXNBYnN0cmFjdH0pCiAgICAgIDogc3VwZXIobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsIGNvbnN0IFBhcmFtZXRlclN0cnVjdHVyZS5zZXR0ZXIoKSwKICAgICAgICAgICAgQXN5bmNNYXJrZXIuU1lOQywKICAgICAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0V4dGVybmFsOiBpc0V4dGVybmFsKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNBc3NpZ25hYmxlID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU2V0dGVyID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2tpbmQgPT4gJ3NldHRlcic7Cn0KCmNsYXNzIEtGaWVsZCBleHRlbmRzIEtNZW1iZXIgaW1wbGVtZW50cyBGaWVsZEVudGl0eSwgSW5kZXhlZEZpZWxkIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQXNzaWduYWJsZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQ29uc3Q7CgogIEtGaWVsZChLTGlicmFyeSBsaWJyYXJ5LCBLQ2xhc3MgZW5jbG9zaW5nQ2xhc3MsIE5hbWUgbmFtZSwKICAgICAge2Jvb2wgaXNTdGF0aWMsIHRoaXMuaXNBc3NpZ25hYmxlLCB0aGlzLmlzQ29uc3R9KQogICAgICA6IHN1cGVyKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBpc1N0YXRpYzogaXNTdGF0aWMpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZpZWxkID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2tpbmQgPT4gJ2ZpZWxkJzsKfQoKY2xhc3MgS1R5cGVWYXJpYWJsZSBleHRlbmRzIEluZGV4ZWRUeXBlVmFyaWFibGUgewogIEBvdmVycmlkZQogIGZpbmFsIEVudGl0eSB0eXBlRGVjbGFyYXRpb247CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGluZGV4OwoKICBLVHlwZVZhcmlhYmxlKHRoaXMudHlwZURlY2xhcmF0aW9uLCB0aGlzLm5hbWUsIHRoaXMuaW5kZXgpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnJHtrRWxlbWVudFByZWZpeH10eXBlX3ZhcmlhYmxlKCR7dHlwZURlY2xhcmF0aW9uLm5hbWV9LiRuYW1lKSc7Cn0KCmNsYXNzIEtMb2NhbEZ1bmN0aW9uIGltcGxlbWVudHMgTG9jYWwgewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIE1lbWJlckVudGl0eSBtZW1iZXJDb250ZXh0OwogIGZpbmFsIEVudGl0eSBleGVjdXRhYmxlQ29udGV4dDsKICBmaW5hbCBpci5Mb2NhbEZ1bmN0aW9uIG5vZGU7CiAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZTsKCiAgS0xvY2FsRnVuY3Rpb24oCiAgICAgIHRoaXMubmFtZSwgdGhpcy5tZW1iZXJDb250ZXh0LCB0aGlzLmV4ZWN1dGFibGVDb250ZXh0LCB0aGlzLm5vZGUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtrRWxlbWVudFByZWZpeH1sb2NhbF9mdW5jdGlvbicKICAgICAgJygke21lbWJlckNvbnRleHQubmFtZX0uJHtuYW1lID8/ICc8YW5vbnltb3VzPid9KSc7Cn0KCmNsYXNzIEtMb2NhbFR5cGVWYXJpYWJsZSBpbXBsZW1lbnRzIFR5cGVWYXJpYWJsZUVudGl0eSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgRW50aXR5IHR5cGVEZWNsYXJhdGlvbjsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaW5kZXg7CiAgRGFydFR5cGUgYm91bmQ7CiAgRGFydFR5cGUgZGVmYXVsdFR5cGU7CgogIEtMb2NhbFR5cGVWYXJpYWJsZSh0aGlzLnR5cGVEZWNsYXJhdGlvbiwgdGhpcy5uYW1lLCB0aGlzLmluZGV4KTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJyR7a0VsZW1lbnRQcmVmaXh9bG9jYWxfdHlwZV92YXJpYWJsZSgke3R5cGVEZWNsYXJhdGlvbi5uYW1lfS4kbmFtZSknOwp9CoE4AE5OPAE2ASgkIyEhASQBKAwVDBoBKgEMOgIBJAwaAQwVDBkBNgEMHwEMOAIBKAwaAQwVASUBDDoCAS8MGgwfFBgBUR4BDCEBDCABDCIBDB0BDCABDB4BDB4BDCABDB0BDCMBDEUBDDwBDDEBFAEMMUsCASkxDC8MGQwhAUAxNkICAS43DBYBEE8nUB4lAQwiAQwmAQweAQwgAQwyAQwlAgE0Gk8nODcBDCoBDCwCATEMKwEXT0o4NwEMKQEMLQIBIgwZAT5GOU45AQwfAQwgAgEiDBkBPh85UBk5AQwdAQwgAgEiDBkBPjlQHjkBDCEBDB0BDCACAUQMGwwWAT04QgEMHAEMHwIBMgwgDBUMEwE+AQwXRwIBKAwVJCIfHQESSQEMOToCATkMIAwVDBMSGAFDAQwXTQIBKnBhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9rZWxlbWVudHMuZGFydDNzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvZGFydDJqc19pbmZvL2xpYi9pbmZvLmRhcnTAAEBoLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBEYXRhIHByb2R1Y2VkIGJ5IGRhcnQyanMgd2hlbiBydW4gd2l0aCB0aGUgYC0tZHVtcC1pbmZvYCBmbGFnLgpsaWJyYXJ5IGRhcnQyanNfaW5mby5pbmZvOwoKLy8vIENvbW1vbiBpbnRlcmZhY2UgdG8gbWFueSBwaWVjZXMgb2YgaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGJ5IHRoZSBkYXJ0MmpzCi8vLyBjb21waWxlciB0aGF0IGFyZSBkaXJlY3RseSBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCAoY29tcGlsYXRpb24gdW5pdCwKLy8vIGxpYnJhcnksIGNsYXNzLCBmdW5jdGlvbiwgb3IgZmllbGQpLgphYnN0cmFjdCBjbGFzcyBJbmZvIHsKICAvLy8gQW4gaWRlbnRpZmllciBmb3IgdGhlIGtpbmQgb2YgaW5mb3JtYXRpb24uCiAgSW5mb0tpbmQgZ2V0IGtpbmQ7CgogIC8vLyBOYW1lIG9mIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluZm8uCiAgU3RyaW5nIG5hbWU7CgogIC8vLyBJZCB1c2VkIGJ5IHRoZSBjb21waWxlciB3aGVuIGluc3RydW1lbnRpbmcgY29kZSBmb3IgY29kZSBjb3ZlcmFnZS4KICAvLyBUT0RPKHNpZ211bmQpOiBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHVzZSB0aGUgc2FtZSBpZCBmb3IKICAvLyBzZXJpYWxpemF0aW9uIGFuZCBmb3IgY292ZXJhZ2UuIENvdWxkIHdlIHVuaWZ5IHRoZW0/CiAgU3RyaW5nIGNvdmVyYWdlSWQ7CgogIC8vLyBCeXRlcyB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgY29kZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudC4KICBpbnQgc2l6ZTsKCiAgLy8vIEluZm8gb2YgdGhlIGVuY2xvc2luZyBlbGVtZW50LgogIEluZm8gcGFyZW50OwoKICBUIGFjY2VwdDxUPihJbmZvVmlzaXRvcjxUPiB2aXNpdG9yKTsKfQoKLy8vIENvbW1vbiBpbmZvcm1hdGlvbiB1c2VkIGZvciBtb3N0IGtpbmQgb2YgZWxlbWVudHMuCi8vIFRPRE8oc2lnbXVuZCk6IGFkZCBtb3JlOgovLyAgLSBpbnB1dFNpemU6IGJ5dGVzIHVzZWQgaW4gdGhlIERhcnQgc291cmNlIHByb2dyYW0KYWJzdHJhY3QgY2xhc3MgQmFzaWNJbmZvIGltcGxlbWVudHMgSW5mbyB7CiAgZmluYWwgSW5mb0tpbmQga2luZDsKCiAgU3RyaW5nIGNvdmVyYWdlSWQ7CiAgaW50IHNpemU7CiAgSW5mbyBwYXJlbnQ7CgogIFN0cmluZyBuYW1lOwoKICAvLy8gSWYgdXNpbmcgZGVmZXJyZWQgbGlicmFyaWVzLCB3aGVyZSB0aGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbmZvCiAgLy8vIGlzIGdlbmVyYXRlZC4KICBPdXRwdXRVbml0SW5mbyBvdXRwdXRVbml0OwoKICBCYXNpY0luZm8odGhpcy5raW5kLCB0aGlzLm5hbWUsIHRoaXMub3V0cHV0VW5pdCwgdGhpcy5zaXplLCB0aGlzLmNvdmVyYWdlSWQpOwoKICBCYXNpY0luZm8uaW50ZXJuYWwodGhpcy5raW5kKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRraW5kICRuYW1lIFskc2l6ZV0nOwp9CgovLy8gSW5mbyBhc3NvY2lhdGVkIHdpdGggZWxlbWVudHMgY29udGFpbmluZyBleGVjdXRhYmxlIGNvZGUgKGxpa2UgZmllbGRzIGFuZAovLy8gbWV0aG9kcykKYWJzdHJhY3QgY2xhc3MgQ29kZUluZm8gaW1wbGVtZW50cyBJbmZvIHsKICAvLy8gSG93IGRvZXMgdGhpcyBmdW5jdGlvbiBvciBmaWVsZCBkZXBlbmQgb24gb3RoZXJzLgogIExpc3Q8RGVwZW5kZW5jeUluZm8+IHVzZXMgPSBbXTsKfQoKLy8vIFRoZSBlbnRpcmUgaW5mb3JtYXRpb24gcHJvZHVjZWQgd2hpbGUgY29tcGlsaW5nIGEgcHJvZ3JhbS4KY2xhc3MgQWxsSW5mbyB7CiAgLy8vIFN1bW1hcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2dyYW0uCiAgUHJvZ3JhbUluZm8gcHJvZ3JhbTsKCiAgLy8vIEluZm9ybWF0aW9uIGFib3V0IGVhY2ggbGlicmFyeSBwcm9jZXNzZWQgYnkgdGhlIGNvbXBpbGVyLgogIExpc3Q8TGlicmFyeUluZm8+IGxpYnJhcmllcyA9IDxMaWJyYXJ5SW5mbz5bXTsKCiAgLy8vIEluZm9ybWF0aW9uIGFib3V0IGVhY2ggZnVuY3Rpb24gKGluY2x1ZGVzIG1ldGhvZHMgYW5kIGdldHRlcnMgaW4gYW55CiAgLy8vIGxpYnJhcnkpCiAgTGlzdDxGdW5jdGlvbkluZm8+IGZ1bmN0aW9ucyA9IDxGdW5jdGlvbkluZm8+W107CgogIC8vLyBJbmZvcm1hdGlvbiBhYm91dCB0eXBlIGRlZnMgaW4gdGhlIHByb2dyYW0uCiAgTGlzdDxUeXBlZGVmSW5mbz4gdHlwZWRlZnMgPSA8VHlwZWRlZkluZm8+W107CgogIC8vLyBJbmZvcm1hdGlvbiBhYm91dCBlYWNoIGNsYXNzIChpbiBhbnkgbGlicmFyeSkuCiAgTGlzdDxDbGFzc0luZm8+IGNsYXNzZXMgPSA8Q2xhc3NJbmZvPltdOwoKICAvLy8gSW5mb3JtYXRpb24gYWJvdXQgZmllbGRzIChpbiBhbnkgY2xhc3MpLgogIExpc3Q8RmllbGRJbmZvPiBmaWVsZHMgPSA8RmllbGRJbmZvPltdOwoKICAvLy8gSW5mb3JtYXRpb24gYWJvdXQgY29uc3RhbnRzIGFueXdoZXJlIGluIHRoZSBwcm9ncmFtLgogIC8vIFRPRE8oc2lnbXVuZCk6IGV4cGFuZCBkb2NzIGFib3V0IGNhbm9uaWNhbGl6YXRpb24uIFdlIGRvbid0IHB1dCB0aGVzZQogIC8vIGluc2lkZSBsaWJyYXJ5IGJlY2F1c2UgYSBzaW5nbGUgY29uc3RhbnQgY2FuIGJlIHVzZWQgaW4gbW9yZSB0aGFuIG9uZSBsaWIsCiAgLy8gYW5kIHdlJ2xsIGluY2x1ZGUgaXQgb25seSBvbmNlIGluIHRoZSBvdXRwdXQuCiAgTGlzdDxDb25zdGFudEluZm8+IGNvbnN0YW50cyA9IDxDb25zdGFudEluZm8+W107CgogIC8vLyBJbmZvcm1hdGlvbiBhYm91dCBjbG9zdXJlcyBhbnl3aGVyZSBpbiB0aGUgcHJvZ3JhbS4KICBMaXN0PENsb3N1cmVJbmZvPiBjbG9zdXJlcyA9IDxDbG9zdXJlSW5mbz5bXTsKCiAgLy8vIEluZm9ybWF0aW9uIGFib3V0IG91dHB1dCB1bml0cyAoc2hvdWxkIGJlIGp1c3Qgb25lIGVudHJ5IGlmIG5vdCB1c2luZwogIC8vLyBkZWZlcnJlZCBsb2FkaW5nKS4KICBMaXN0PE91dHB1dFVuaXRJbmZvPiBvdXRwdXRVbml0cyA9IDxPdXRwdXRVbml0SW5mbz5bXTsKCiAgLy8vIERldGFpbHMgYWJvdXQgYWxsIGRlZmVycmVkIGltcG9ydHMgYW5kIHdoYXQgZmlsZXMgd291bGQgYmUgbG9hZGVkIHdoZW4gdGhlCiAgLy8vIGltcG9ydCBpcyByZXNvbHZlZC4KICAvLyBUT0RPKHNpZ211bmQpOiB1c2UgYSBkaWZmZXJlbnQgZm9ybWF0IGZvciBkdW1wLWluZm8uIFRoaXMgY3VycmVudGx5IGVtaXRzCiAgLy8gdGhlIHNhbWUgbWFwIHRoYXQgaXMgY3JlYXRlZCBmb3IgdGhlIGAtLWRlZmVycmVkLW1hcGAgZmxhZy4KICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBkeW5hbWljPj4gZGVmZXJyZWRGaWxlczsKCiAgLy8vIEEgbmV3IHJlcHJlc2VudGF0aW9uIG9mIGRlcGVuZGVuY2llcyBmcm9tIG9uZSBpbmZvIHRvIGFub3RoZXIuIEFuIGVudHJ5IGluCiAgLy8vIHRoaXMgbWFwIGluZGljYXRlcyB0aGF0IGFuIFtJbmZvXSBkZXBlbmRzIG9uIGFub3RoZXIgKGUuZy4gYSBmdW5jdGlvbgogIC8vLyBpbnZva2VzIGFub3RoZXIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBkYXRhIGluIHRoaXMgZmllbGQgbWlnaHQgbm90IGJlCiAgLy8vIGFjY3VyYXRlIHlldCAodGhpcyBpcyB3b3JrIGluIHByb2dyZXNzKS4KICBNYXA8SW5mbywgTGlzdDxJbmZvPj4gZGVwZW5kZW5jaWVzID0ge307CgogIC8vLyBNYWpvciB2ZXJzaW9uIGluZGljYXRpbmcgYnJlYWtpbmcgY2hhbmdlcyBpbiB0aGUgZm9ybWF0LiBBIG5ldyB2ZXJzaW9uCiAgLy8vIG1lYW5zIHRoYXQgYW4gb2xkIGRlc2VyaWFsaXphdGlvbiBhbGdvcml0aG0gd2lsbCBub3Qgd29yayB3aXRoIHRoZSBuZXcKICAvLy8gZm9ybWF0LgogIGZpbmFsIGludCB2ZXJzaW9uID0gNjsKCiAgLy8vIE1pbm9yIHZlcnNpb24gaW5kaWNhdGluZyBub24tYnJlYWtpbmcgY2hhbmdlcyBpbiB0aGUgZm9ybWF0LiBBIGNoYW5nZSBpbgogIC8vLyB0aGlzIHZlcnNpb24gbnVtYmVyIG1lYW5zIHRoYXQgdGhlIGpzb24gcGFyc2luZyBpbiB0aGlzIGxpYnJhcnkgZnJvbSBhCiAgLy8vIHByZXZpb3VzIHdpbGwgY29udGludWUgdG8gd29yayBhZnRlciB0aGUgY2hhbmdlLiBUaGlzIGlzIHR5cGljYWxseQogIC8vLyBpbmNyZWFzZWQgd2hlbiBhZGRpbmcgbmV3IGVudHJpZXMgdG8gdGhlIGZpbGUgZm9ybWF0LgogIC8vIE5vdGU6IHRoZSBkdW1wLWluZm8udmlld2VyIGFwcCB3YXMgd3JpdHRlbiB1c2luZyBhIGpzb24gcGFyc2VyIHZlcnNpb24gMy4yLgogIGZpbmFsIGludCBtaW5vclZlcnNpb24gPSAwOwoKICBBbGxJbmZvKCk7CgogIFQgYWNjZXB0PFQ+KEluZm9WaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRBbGwodGhpcyk7Cn0KCmNsYXNzIFByb2dyYW1JbmZvIHsKICBGdW5jdGlvbkluZm8gZW50cnlwb2ludDsKICBpbnQgc2l6ZTsKICBTdHJpbmcgZGFydDJqc1ZlcnNpb247CiAgRGF0ZVRpbWUgY29tcGlsYXRpb25Nb21lbnQ7CiAgRHVyYXRpb24gY29tcGlsYXRpb25EdXJhdGlvbjsKICBEdXJhdGlvbiB0b0pzb25EdXJhdGlvbjsKICBEdXJhdGlvbiBkdW1wSW5mb0R1cmF0aW9uOwoKICAvLy8gYHRydWVgIGlmIGBub1N1Y2hNZXRob2RgIGlzIHVzZWQuCiAgYm9vbCBub1N1Y2hNZXRob2RFbmFibGVkOwoKICAvLy8gYHRydWVgIGlmIGBPYmplY3QucnVudGltZVR5cGVgIGlzIHVzZWQuCiAgYm9vbCBpc1J1bnRpbWVUeXBlVXNlZDsKCiAgLy8vIGB0cnVlYCBpZiB0aGUgYGRhcnQ6aXNvbGF0ZWAgbGlicmFyeSBpcyBpbiB1c2UuCiAgYm9vbCBpc0lzb2xhdGVJblVzZTsKCiAgLy8vIGB0cnVlYCBpZiBgRnVuY3Rpb24uYXBwbHlgIGlzIHVzZWQuCiAgYm9vbCBpc0Z1bmN0aW9uQXBwbHlVc2VkOwoKICAvLy8gYHRydWVgIGlmIGBkYXJ0Om1pcnJvcnNgIGZlYXR1cmVzIGFyZSB1c2VkLgogIGJvb2wgaXNNaXJyb3JzVXNlZDsKCiAgYm9vbCBtaW5pZmllZDsKCiAgUHJvZ3JhbUluZm8oCiAgICAgIHt0aGlzLmVudHJ5cG9pbnQsCiAgICAgIHRoaXMuc2l6ZSwKICAgICAgdGhpcy5kYXJ0MmpzVmVyc2lvbiwKICAgICAgdGhpcy5jb21waWxhdGlvbk1vbWVudCwKICAgICAgdGhpcy5jb21waWxhdGlvbkR1cmF0aW9uLAogICAgICB0aGlzLnRvSnNvbkR1cmF0aW9uLAogICAgICB0aGlzLmR1bXBJbmZvRHVyYXRpb24sCiAgICAgIHRoaXMubm9TdWNoTWV0aG9kRW5hYmxlZCwKICAgICAgdGhpcy5pc1J1bnRpbWVUeXBlVXNlZCwKICAgICAgdGhpcy5pc0lzb2xhdGVJblVzZSwKICAgICAgdGhpcy5pc0Z1bmN0aW9uQXBwbHlVc2VkLAogICAgICB0aGlzLmlzTWlycm9yc1VzZWQsCiAgICAgIHRoaXMubWluaWZpZWR9KTsKCiAgVCBhY2NlcHQ8VD4oSW5mb1Zpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFByb2dyYW0odGhpcyk7Cn0KCi8vLyBJbmZvIGFzc29jaWF0ZWQgd2l0aCBhIGxpYnJhcnkgZWxlbWVudC4KY2xhc3MgTGlicmFyeUluZm8gZXh0ZW5kcyBCYXNpY0luZm8gewogIC8vLyBDYW5vbmljYWwgdXJpIHRoYXQgaWRlbnRpZmllcyB0aGUgbGlicmFyeS4KICBVcmkgdXJpOwoKICAvLy8gVG9wIGxldmVsIGZ1bmN0aW9ucyBkZWZpbmVkIHdpdGhpbiB0aGUgbGlicmFyeS4KICBMaXN0PEZ1bmN0aW9uSW5mbz4gdG9wTGV2ZWxGdW5jdGlvbnMgPSA8RnVuY3Rpb25JbmZvPltdOwoKICAvLy8gVG9wIGxldmVsIGZpZWxkcyBkZWZpbmVkIHdpdGhpbiB0aGUgbGlicmFyeS4KICBMaXN0PEZpZWxkSW5mbz4gdG9wTGV2ZWxWYXJpYWJsZXMgPSA8RmllbGRJbmZvPltdOwoKICAvLy8gQ2xhc3NlcyBkZWZpbmVkIHdpdGhpbiB0aGUgbGlicmFyeS4KICBMaXN0PENsYXNzSW5mbz4gY2xhc3NlcyA9IDxDbGFzc0luZm8+W107CgogIC8vLyBUeXBlZGVmcyBkZWZpbmVkIHdpdGhpbiB0aGUgbGlicmFyeS4KICBMaXN0PFR5cGVkZWZJbmZvPiB0eXBlZGVmcyA9IDxUeXBlZGVmSW5mbz5bXTsKCiAgLy8gVE9ETyhzaWdtdW5kKTogYWRkIGhlcmUgYSBsaXN0IG9mIHBhcnRzLiBUaGF0IGNhbiBoZWxwIHVzIGltcHJvdmUgaG93IHdlCiAgLy8gZW5jb2RlIHNvdXJjZS1zcGFuIGluZm9ybWF0aW9uIGluIG1ldHJpY3MgKHJhdGhlciB0aGFuIGluY2x1ZGUgdGhlIHVyaSBvbgogIC8vIGVhY2ggZnVuY3Rpb24sIGluY2x1ZGUgYW4gaW5kZXggaW50byB0aGlzIGxpc3QpLgoKICAvLy8gV2hldGhlciB0aGVyZSBpcyBhbnkgaW5mb3JtYXRpb24gcmVjb3JkZWQgZm9yIHRoaXMgbGlicmFyeS4KICBib29sIGdldCBpc0VtcHR5ID0+CiAgICAgIHRvcExldmVsRnVuY3Rpb25zLmlzRW1wdHkgJiYgdG9wTGV2ZWxWYXJpYWJsZXMuaXNFbXB0eSAmJiBjbGFzc2VzLmlzRW1wdHk7CgogIExpYnJhcnlJbmZvKFN0cmluZyBuYW1lLCB0aGlzLnVyaSwgT3V0cHV0VW5pdEluZm8gb3V0cHV0VW5pdCwgaW50IHNpemUpCiAgICAgIDogc3VwZXIoSW5mb0tpbmQubGlicmFyeSwgbmFtZSwgb3V0cHV0VW5pdCwgc2l6ZSwgbnVsbCk7CgogIExpYnJhcnlJbmZvLmludGVybmFsKCkgOiBzdXBlci5pbnRlcm5hbChJbmZvS2luZC5saWJyYXJ5KTsKCiAgVCBhY2NlcHQ8VD4oSW5mb1Zpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdExpYnJhcnkodGhpcyk7Cn0KCi8vLyBJbmZvcm1hdGlvbiBhYm91dCBhbiBvdXRwdXQgdW5pdC4gTm9ybWFsbHkgdGhlcmUgaXMganVzdCBvbmUgZm9yIHRoZSBlbnRpcmUKLy8vIHByb2dyYW0gdW5sZXNzIHRoZSBhcHBsaWNhdGlvbiB1c2VzIGRlZmVycmVkIGltcG9ydHMsIGluIHdoaWNoIGNhc2UgdGhlcmUKLy8vIHdvdWxkIGJlIGFuIGFkZGl0aW9uYWwgb3V0cHV0IHVuaXQgcGVyIGRlZmVycmVkIGNodW5rLgpjbGFzcyBPdXRwdXRVbml0SW5mbyBleHRlbmRzIEJhc2ljSW5mbyB7CiAgU3RyaW5nIGZpbGVuYW1lOwoKICAvLy8gVGhlIGRlZmVycmVkIGltcG9ydHMgdGhhdCB3aWxsIGxvYWQgdGhpcyBvdXRwdXQgdW5pdC4KICBMaXN0PFN0cmluZz4gaW1wb3J0cyA9IDxTdHJpbmc+W107CgogIE91dHB1dFVuaXRJbmZvKHRoaXMuZmlsZW5hbWUsIFN0cmluZyBuYW1lLCBpbnQgc2l6ZSkKICAgICAgOiBzdXBlcihJbmZvS2luZC5vdXRwdXRVbml0LCBuYW1lLCBudWxsLCBzaXplLCBudWxsKTsKCiAgT3V0cHV0VW5pdEluZm8uaW50ZXJuYWwoKSA6IHN1cGVyLmludGVybmFsKEluZm9LaW5kLm91dHB1dFVuaXQpOwoKICBUIGFjY2VwdDxUPihJbmZvVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0T3V0cHV0KHRoaXMpOwp9CgovLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBjbGFzcyBlbGVtZW50LgpjbGFzcyBDbGFzc0luZm8gZXh0ZW5kcyBCYXNpY0luZm8gewogIC8vLyBXaGV0aGVyIHRoZSBjbGFzcyBpcyBhYnN0cmFjdC4KICBib29sIGlzQWJzdHJhY3Q7CgogIC8vIFRPRE8oc2lnbXVuZCk6IHNwbGl0IHN0YXRpYyB2cyBpbnN0YW5jZSB2cyBjbG9zdXJlcwogIC8vLyBGdW5jdGlvbnMgKHN0YXRpYyBvciBpbnN0YW5jZSkgZGVmaW5lZCBpbiB0aGUgY2xhc3MuCiAgTGlzdDxGdW5jdGlvbkluZm8+IGZ1bmN0aW9ucyA9IDxGdW5jdGlvbkluZm8+W107CgogIC8vLyBGaWVsZHMgZGVmaW5lZCBpbiB0aGUgY2xhc3MuCiAgLy8gVE9ETyhzaWdtdW5kKTogY3VycmVudGx5IGFwcGVhcnMgdG8gb25seSBiZSBwb3B1bGF0ZWQgd2l0aCBpbnN0YW5jZSBmaWVsZHMsCiAgLy8gYnV0IHRoaXMgc2hvdWxkIGJlIGZpeGVkLgogIExpc3Q8RmllbGRJbmZvPiBmaWVsZHMgPSA8RmllbGRJbmZvPltdOwoKICBDbGFzc0luZm8oCiAgICAgIHtTdHJpbmcgbmFtZSwgdGhpcy5pc0Fic3RyYWN0LCBPdXRwdXRVbml0SW5mbyBvdXRwdXRVbml0LCBpbnQgc2l6ZTogMH0pCiAgICAgIDogc3VwZXIoSW5mb0tpbmQuY2xhenosIG5hbWUsIG91dHB1dFVuaXQsIHNpemUsIG51bGwpOwoKICBDbGFzc0luZm8uaW50ZXJuYWwoKSA6IHN1cGVyLmludGVybmFsKEluZm9LaW5kLmNsYXp6KTsKCiAgVCBhY2NlcHQ8VD4oSW5mb1Zpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdENsYXNzKHRoaXMpOwp9CgovLy8gQSBjb2RlIHNwYW4gb2YgZ2VuZXJhdGVkIGNvZGUuIEEgW0NvZGVTcGFuXSBvYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGEKLy8vIHNpbmdsZSBbQmFzaWNJbmZvXS4gVGhlIG9mZnNldHMgaW4gdGhlIHNwYW4gY29ycmVzcG9uZHMgdG8gb2Zmc2V0cyBvbiB0aGUKLy8vIGZpbGUgb2YgW0Jhc2ljSW5mby5vdXRwdXRVbml0XS4KY2xhc3MgQ29kZVNwYW4gewogIC8vLyBTdGFydCBvZmZzZXQgaW4gdGhlIGdlbmVyYXRlZCBmaWxlLgogIGludCBzdGFydDsKCiAgLy8vIGVuZCBvZmZzZXQgaW4gdGhlIGdlbmVyYXRlZCBmaWxlLgogIGludCBlbmQ7CgogIC8vLyBUaGUgYWN0dWFsIGNvZGUgKG9wdGlvbmFsLCBibGFuayB3aGVuIHVzaW5nIGEgY29tcGFjdCByZXByZXNlbnRhdGlvbiBvZgogIC8vLyB0aGUgZW5jb2RpbmcpLgogIFN0cmluZyB0ZXh0OwoKICBDb2RlU3Bhbih7dGhpcy5zdGFydCwgdGhpcy5lbmQsIHRoaXMudGV4dH0pOwp9CgovLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBjb25zdGFudCB2YWx1ZS4KLy8gVE9ETyhzaWdtdW5kKTogYWRkIGRlcGVuZGVuY3kgZGF0YSBmb3IgQ29uc3RhbnRJbmZvCmNsYXNzIENvbnN0YW50SW5mbyBleHRlbmRzIEJhc2ljSW5mbyB7CiAgLy8vIFRoZSBhY3R1YWwgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb25zdGFudC4KICBMaXN0PENvZGVTcGFuPiBjb2RlOwoKICAvLyBUT0RPKHNpZ211bmQpOiBBZGQgY292ZXJhZ2Ugc3VwcG9ydCB0byBjb25zdGFudHM/CiAgQ29uc3RhbnRJbmZvKHtpbnQgc2l6ZTogMCwgdGhpcy5jb2RlLCBPdXRwdXRVbml0SW5mbyBvdXRwdXRVbml0fSkKICAgICAgOiBzdXBlcihJbmZvS2luZC5jb25zdGFudCwgbnVsbCwgb3V0cHV0VW5pdCwgc2l6ZSwgbnVsbCk7CgogIENvbnN0YW50SW5mby5pbnRlcm5hbCgpIDogc3VwZXIuaW50ZXJuYWwoSW5mb0tpbmQuY29uc3RhbnQpOwoKICBUIGFjY2VwdDxUPihJbmZvVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0Q29uc3RhbnQodGhpcyk7Cn0KCi8vLyBJbmZvcm1hdGlvbiBhYm91dCBhIGZpZWxkIGVsZW1lbnQuCmNsYXNzIEZpZWxkSW5mbyBleHRlbmRzIEJhc2ljSW5mbyB3aXRoIENvZGVJbmZvIHsKICAvLy8gVGhlIHR5cGUgb2YgdGhlIGZpZWxkLgogIFN0cmluZyB0eXBlOwoKICAvLy8gVGhlIHR5cGUgaW5mZXJyZWQgYnkgZGFydDJqcydzIHdob2xlIHByb2dyYW0gYW5hbHlzaXMKICBTdHJpbmcgaW5mZXJyZWRUeXBlOwoKICAvLy8gTmVzdGVkIGNsb3N1cmVzIHNlZW4gaW4gdGhlIGZpZWxkIGluaXRpYWxpemVyLgogIExpc3Q8Q2xvc3VyZUluZm8+IGNsb3N1cmVzOwoKICAvLy8gVGhlIGFjdHVhbCBnZW5lcmF0ZWQgY29kZSBmb3IgdGhlIGZpZWxkLgogIExpc3Q8Q29kZVNwYW4+IGNvZGU7CgogIC8vLyBXaGV0aGVyIHRoaXMgY29ycmVzcG9uZHMgdG8gYSBjb25zdCBmaWVsZCBkZWNsYXJhdGlvbi4KICBib29sIGlzQ29uc3Q7CgogIC8vLyBXaGVuIFtpc0NvbnN0XSBpcyB0cnVlLCB0aGUgY29uc3RhbnQgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbi4KICBDb25zdGFudEluZm8gaW5pdGlhbGl6ZXI7CgogIEZpZWxkSW5mbygKICAgICAge1N0cmluZyBuYW1lLAogICAgICBTdHJpbmcgY292ZXJhZ2VJZCwKICAgICAgaW50IHNpemU6IDAsCiAgICAgIHRoaXMudHlwZSwKICAgICAgdGhpcy5pbmZlcnJlZFR5cGUsCiAgICAgIHRoaXMuY2xvc3VyZXMsCiAgICAgIHRoaXMuY29kZSwKICAgICAgT3V0cHV0VW5pdEluZm8gb3V0cHV0VW5pdCwKICAgICAgdGhpcy5pc0NvbnN0fSkKICAgICAgOiBzdXBlcihJbmZvS2luZC5maWVsZCwgbmFtZSwgb3V0cHV0VW5pdCwgc2l6ZSwgY292ZXJhZ2VJZCk7CgogIEZpZWxkSW5mby5pbnRlcm5hbCgpIDogc3VwZXIuaW50ZXJuYWwoSW5mb0tpbmQuZmllbGQpOwoKICBUIGFjY2VwdDxUPihJbmZvVmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0RmllbGQodGhpcyk7Cn0KCi8vLyBJbmZvcm1hdGlvbiBhYm91dCBhIHR5cGVkZWYgZGVjbGFyYXRpb24uCmNsYXNzIFR5cGVkZWZJbmZvIGV4dGVuZHMgQmFzaWNJbmZvIHsKICAvLy8gVGhlIGRlY2xhcmVkIHR5cGUuCiAgU3RyaW5nIHR5cGU7CgogIFR5cGVkZWZJbmZvKFN0cmluZyBuYW1lLCB0aGlzLnR5cGUsIE91dHB1dFVuaXRJbmZvIG91dHB1dFVuaXQpCiAgICAgIDogc3VwZXIoSW5mb0tpbmQudHlwZWRlZiwgbmFtZSwgb3V0cHV0VW5pdCwgMCwgbnVsbCk7CgogIFR5cGVkZWZJbmZvLmludGVybmFsKCkgOiBzdXBlci5pbnRlcm5hbChJbmZvS2luZC50eXBlZGVmKTsKCiAgVCBhY2NlcHQ8VD4oSW5mb1Zpc2l0b3I8VD4gdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdFR5cGVkZWYodGhpcyk7Cn0KCi8vLyBJbmZvcm1hdGlvbiBhYm91dCBhIGZ1bmN0aW9uIG9yIG1ldGhvZC4KY2xhc3MgRnVuY3Rpb25JbmZvIGV4dGVuZHMgQmFzaWNJbmZvIHdpdGggQ29kZUluZm8gewogIHN0YXRpYyBjb25zdCBpbnQgVE9QX0xFVkVMX0ZVTkNUSU9OX0tJTkQgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgQ0xPU1VSRV9GVU5DVElPTl9LSU5EID0gMTsKICBzdGF0aWMgY29uc3QgaW50IE1FVEhPRF9GVU5DVElPTl9LSU5EID0gMjsKICBzdGF0aWMgY29uc3QgaW50IENPTlNUUlVDVE9SX0ZVTkNUSU9OX0tJTkQgPSAzOwoKICAvLy8gS2luZCBvZiBmdW5jdGlvbiAodG9wLWxldmVsIGZ1bmN0aW9uLCBjbG9zdXJlLCBtZXRob2QsIG9yIGNvbnN0cnVjdG9yKS4KICBpbnQgZnVuY3Rpb25LaW5kOwoKICAvLy8gTW9kaWZpZXJzIGFwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbi4KICBGdW5jdGlvbk1vZGlmaWVycyBtb2RpZmllcnM7CgogIC8vLyBOZXN0ZWQgY2xvc3VyZXMgdGhhdCBhcHBlYXIgd2l0aGluIHRoZSBib2R5IG9mIHRoaXMgZnVuY3Rpb24uCiAgTGlzdDxDbG9zdXJlSW5mbz4gY2xvc3VyZXM7CgogIC8vLyBUaGUgdHlwZSBvZiB0aGlzIGZ1bmN0aW9uLgogIFN0cmluZyB0eXBlOwoKICAvLy8gVGhlIGRlY2xhcmVkIHJldHVybiB0eXBlLgogIFN0cmluZyByZXR1cm5UeXBlOwoKICAvLy8gVGhlIGluZmVycmVkIHJldHVybiB0eXBlLgogIFN0cmluZyBpbmZlcnJlZFJldHVyblR5cGU7CgogIC8vLyBOYW1lIGFuZCB0eXBlIGluZm9ybWF0aW9uIGZvciBlYWNoIHBhcmFtZXRlci4KICBMaXN0PFBhcmFtZXRlckluZm8+IHBhcmFtZXRlcnM7CgogIC8vLyBTaWRlLWVmZmVjdHMuCiAgLy8gVE9ETyhzaWdtdW5kKTogc2VyaWFsaXplIG1vcmUgcHJlY2lzZWx5LCBub3QganVzdCBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4KICBTdHJpbmcgc2lkZUVmZmVjdHM7CgogIC8vLyBIb3cgbWFueSBmdW5jdGlvbiBjYWxscyB3ZXJlIGlubGluZWQgaW50byB0aGlzIGZ1bmN0aW9uLgogIGludCBpbmxpbmVkQ291bnQ7CgogIC8vLyBUaGUgYWN0dWFsIGdlbmVyYXRlZCBjb2RlLgogIExpc3Q8Q29kZVNwYW4+IGNvZGU7CgogIEZ1bmN0aW9uSW5mbygKICAgICAge1N0cmluZyBuYW1lLAogICAgICBTdHJpbmcgY292ZXJhZ2VJZCwKICAgICAgT3V0cHV0VW5pdEluZm8gb3V0cHV0VW5pdCwKICAgICAgaW50IHNpemU6IDAsCiAgICAgIHRoaXMuZnVuY3Rpb25LaW5kLAogICAgICB0aGlzLm1vZGlmaWVycywKICAgICAgdGhpcy5jbG9zdXJlcywKICAgICAgdGhpcy50eXBlLAogICAgICB0aGlzLnJldHVyblR5cGUsCiAgICAgIHRoaXMuaW5mZXJyZWRSZXR1cm5UeXBlLAogICAgICB0aGlzLnBhcmFtZXRlcnMsCiAgICAgIHRoaXMuc2lkZUVmZmVjdHMsCiAgICAgIHRoaXMuaW5saW5lZENvdW50LAogICAgICB0aGlzLmNvZGV9KQogICAgICA6IHN1cGVyKEluZm9LaW5kLmZ1bmN0aW9uLCBuYW1lLCBvdXRwdXRVbml0LCBzaXplLCBjb3ZlcmFnZUlkKTsKCiAgRnVuY3Rpb25JbmZvLmludGVybmFsKCkgOiBzdXBlci5pbnRlcm5hbChJbmZvS2luZC5mdW5jdGlvbik7CgogIFQgYWNjZXB0PFQ+KEluZm9WaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRGdW5jdGlvbih0aGlzKTsKfQoKLy8vIEluZm9ybWF0aW9uIGFib3V0IGEgY2xvc3VyZSwgYWxzbyBrbm93biBhcyBhIGxvY2FsIGZ1bmN0aW9uLgpjbGFzcyBDbG9zdXJlSW5mbyBleHRlbmRzIEJhc2ljSW5mbyB7CiAgLy8vIFRoZSBmdW5jdGlvbiB0aGF0IGlzIHdyYXBwZWQgYnkgdGhpcyBjbG9zdXJlLgogIEZ1bmN0aW9uSW5mbyBmdW5jdGlvbjsKCiAgQ2xvc3VyZUluZm8oCiAgICAgIHtTdHJpbmcgbmFtZSwgT3V0cHV0VW5pdEluZm8gb3V0cHV0VW5pdCwgaW50IHNpemU6IDAsIHRoaXMuZnVuY3Rpb259KQogICAgICA6IHN1cGVyKEluZm9LaW5kLmNsb3N1cmUsIG5hbWUsIG91dHB1dFVuaXQsIHNpemUsIG51bGwpOwoKICBDbG9zdXJlSW5mby5pbnRlcm5hbCgpIDogc3VwZXIuaW50ZXJuYWwoSW5mb0tpbmQuY2xvc3VyZSk7CgogIFQgYWNjZXB0PFQ+KEluZm9WaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDbG9zdXJlKHRoaXMpOwp9CgovLy8gSW5mb3JtYXRpb24gYWJvdXQgaG93IGEgZGVwZW5kZW5jeSBpcyB1c2VkLgpjbGFzcyBEZXBlbmRlbmN5SW5mbyB7CiAgLy8vIFRoZSBkZXBlbmRlbmN5LCBlaXRoZXIgYSBGdW5jdGlvbkluZm8gb3IgRmllbGRJbmZvLgogIGZpbmFsIEluZm8gdGFyZ2V0OwoKICAvLy8gRWl0aGVyIGEgc2VsZWN0b3IgbWFzayBpbmRpY2F0aW5nIGhvdyB0aGlzIGlzIHVzZWQsIG9yICdpbmxpbmVkJy4KICAvLyBUT0RPKHNpZ211bmQpOiBzcGxpdCBtYXNrIGludG8gYW4gZW51bSBvciBzb21ldGhpbmcgbW9yZSBwcmVjaXNlIHRvIHJlYWxseQogIC8vIGRlc2NyaWJlIHRoZSBkZXBlbmRlbmNpZXMgaW4gZGV0YWlsLgogIGZpbmFsIFN0cmluZyBtYXNrOwoKICBEZXBlbmRlbmN5SW5mbyh0aGlzLnRhcmdldCwgdGhpcy5tYXNrKTsKfQoKLy8vIE5hbWUgYW5kIHR5cGUgaW5mb3JtYXRpb24gYWJvdXQgYSBmdW5jdGlvbiBwYXJhbWV0ZXIuCmNsYXNzIFBhcmFtZXRlckluZm8gewogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIFN0cmluZyB0eXBlOwogIGZpbmFsIFN0cmluZyBkZWNsYXJlZFR5cGU7CgogIFBhcmFtZXRlckluZm8odGhpcy5uYW1lLCB0aGlzLnR5cGUsIHRoaXMuZGVjbGFyZWRUeXBlKTsKfQoKLy8vIE1vZGlmaWVycyB0aGF0IG1heSBhcHBseSB0byBtZXRob2RzLgpjbGFzcyBGdW5jdGlvbk1vZGlmaWVycyB7CiAgZmluYWwgYm9vbCBpc1N0YXRpYzsKICBmaW5hbCBib29sIGlzQ29uc3Q7CiAgZmluYWwgYm9vbCBpc0ZhY3Rvcnk7CiAgZmluYWwgYm9vbCBpc0V4dGVybmFsOwoKICBGdW5jdGlvbk1vZGlmaWVycygKICAgICAge3RoaXMuaXNTdGF0aWM6IGZhbHNlLAogICAgICB0aGlzLmlzQ29uc3Q6IGZhbHNlLAogICAgICB0aGlzLmlzRmFjdG9yeTogZmFsc2UsCiAgICAgIHRoaXMuaXNFeHRlcm5hbDogZmFsc2V9KTsKfQoKLy8vIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgYGtpbmRgIGZpZWxkIGluIHRoZSBzZXJpYWxpemVkIGluZm9zLgplbnVtIEluZm9LaW5kIHsKICBsaWJyYXJ5LAogIGNsYXp6LAogIGZ1bmN0aW9uLAogIGZpZWxkLAogIGNvbnN0YW50LAogIG91dHB1dFVuaXQsCiAgdHlwZWRlZiwKICBjbG9zdXJlLAp9CgpTdHJpbmcga2luZFRvU3RyaW5nKEluZm9LaW5kIGtpbmQpIHsKICBzd2l0Y2ggKGtpbmQpIHsKICAgIGNhc2UgSW5mb0tpbmQubGlicmFyeToKICAgICAgcmV0dXJuICdsaWJyYXJ5JzsKICAgIGNhc2UgSW5mb0tpbmQuY2xheno6CiAgICAgIHJldHVybiAnY2xhc3MnOwogICAgY2FzZSBJbmZvS2luZC5mdW5jdGlvbjoKICAgICAgcmV0dXJuICdmdW5jdGlvbic7CiAgICBjYXNlIEluZm9LaW5kLmZpZWxkOgogICAgICByZXR1cm4gJ2ZpZWxkJzsKICAgIGNhc2UgSW5mb0tpbmQuY29uc3RhbnQ6CiAgICAgIHJldHVybiAnY29uc3RhbnQnOwogICAgY2FzZSBJbmZvS2luZC5vdXRwdXRVbml0OgogICAgICByZXR1cm4gJ291dHB1dFVuaXQnOwogICAgY2FzZSBJbmZvS2luZC50eXBlZGVmOgogICAgICByZXR1cm4gJ3R5cGVkZWYnOwogICAgY2FzZSBJbmZvS2luZC5jbG9zdXJlOgogICAgICByZXR1cm4gJ2Nsb3N1cmUnOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIG51bGw7CiAgfQp9CgpJbmZvS2luZCBraW5kRnJvbVN0cmluZyhTdHJpbmcga2luZCkgewogIHN3aXRjaCAoa2luZCkgewogICAgY2FzZSAnbGlicmFyeSc6CiAgICAgIHJldHVybiBJbmZvS2luZC5saWJyYXJ5OwogICAgY2FzZSAnY2xhc3MnOgogICAgICByZXR1cm4gSW5mb0tpbmQuY2xheno7CiAgICBjYXNlICdmdW5jdGlvbic6CiAgICAgIHJldHVybiBJbmZvS2luZC5mdW5jdGlvbjsKICAgIGNhc2UgJ2ZpZWxkJzoKICAgICAgcmV0dXJuIEluZm9LaW5kLmZpZWxkOwogICAgY2FzZSAnY29uc3RhbnQnOgogICAgICByZXR1cm4gSW5mb0tpbmQuY29uc3RhbnQ7CiAgICBjYXNlICdvdXRwdXRVbml0JzoKICAgICAgcmV0dXJuIEluZm9LaW5kLm91dHB1dFVuaXQ7CiAgICBjYXNlICd0eXBlZGVmJzoKICAgICAgcmV0dXJuIEluZm9LaW5kLnR5cGVkZWY7CiAgICBjYXNlICdjbG9zdXJlJzoKICAgICAgcmV0dXJuIEluZm9LaW5kLmNsb3N1cmU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gbnVsbDsKICB9Cn0KCi8vLyBBIHNpbXBsZSB2aXNpdG9yIGZvciBpbmZvcm1hdGlvbiBwcm9kdWNlZCBieSB0aGUgZGFydDJqcyBjb21waWxlci4KYWJzdHJhY3QgY2xhc3MgSW5mb1Zpc2l0b3I8VD4gewogIFQgdmlzaXRBbGwoQWxsSW5mbyBpbmZvKTsKICBUIHZpc2l0UHJvZ3JhbShQcm9ncmFtSW5mbyBpbmZvKTsKICBUIHZpc2l0TGlicmFyeShMaWJyYXJ5SW5mbyBpbmZvKTsKICBUIHZpc2l0Q2xhc3MoQ2xhc3NJbmZvIGluZm8pOwogIFQgdmlzaXRGaWVsZChGaWVsZEluZm8gaW5mbyk7CiAgVCB2aXNpdENvbnN0YW50KENvbnN0YW50SW5mbyBpbmZvKTsKICBUIHZpc2l0RnVuY3Rpb24oRnVuY3Rpb25JbmZvIGluZm8pOwogIFQgdmlzaXRUeXBlZGVmKFR5cGVkZWZJbmZvIGluZm8pOwogIFQgdmlzaXRDbG9zdXJlKENsb3N1cmVJbmZvIGluZm8pOwogIFQgdmlzaXRPdXRwdXQoT3V0cHV0VW5pdEluZm8gaW5mbyk7Cn0KCi8vLyBBIHZpc2l0b3IgdGhhdCByZWN1cnNpdmVseSB3YWxrcyBlYWNoIHBvcnRpb24gb2YgdGhlIHByb2dyYW0uIEJlY2F1c2UgdGhlCi8vLyBpbmZvIHJlcHJlc2VudGF0aW9uIGlzIHJlZHVuZGFudCwgdGhpcyB2aXNpdG9yIG9ubHkgd2Fsa3MgdGhlIHN0cnVjdHVyZSBvZgovLy8gdGhlIHByb2dyYW0gYW5kIHNraXBzIHNvbWUgcmVkdW5kYW50IGxpbmtzLiBGb3IgZXhhbXBsZSwgZXZlbiB0aG91Z2gKLy8vIHZpc2l0QWxsIGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb25zLCB0aGlzIHZpc2l0b3Igb25seSByZWN1cnNlcyB0bwovLy8gdmlzaXQgbGlicmFyaWVzLCB0aGVuIGZyb20gZWFjaCBsaWJyYXJ5IHdlIHZpc2l0IGZ1bmN0aW9ucyBhbmQgY2xhc3NlcywgYW5kCi8vLyBzbyBvbi4KY2xhc3MgUmVjdXJzaXZlSW5mb1Zpc2l0b3IgZXh0ZW5kcyBJbmZvVmlzaXRvcjxOdWxsPiB7CiAgdmlzaXRBbGwoQWxsSW5mbyBpbmZvKSB7CiAgICAvLyBOb3RlOiB3ZSBkb24ndCB2aXNpdCBmdW5jdGlvbnMsIGZpZWxkcywgY2xhc3NlcywgYW5kIHR5cGVkZWZzIGJlY2F1c2UKICAgIC8vIHRoZXkgYXJlIHJlYWNoYWJsZSBmcm9tIHRoZSBsaWJyYXJ5IGluZm8uCiAgICBpbmZvLmxpYnJhcmllcy5mb3JFYWNoKHZpc2l0TGlicmFyeSk7CiAgICBpbmZvLmNvbnN0YW50cy5mb3JFYWNoKHZpc2l0Q29uc3RhbnQpOwogIH0KCiAgdmlzaXRQcm9ncmFtKFByb2dyYW1JbmZvIGluZm8pIHt9CgogIHZpc2l0TGlicmFyeShMaWJyYXJ5SW5mbyBpbmZvKSB7CiAgICBpbmZvLnRvcExldmVsRnVuY3Rpb25zLmZvckVhY2godmlzaXRGdW5jdGlvbik7CiAgICBpbmZvLnRvcExldmVsVmFyaWFibGVzLmZvckVhY2godmlzaXRGaWVsZCk7CiAgICBpbmZvLmNsYXNzZXMuZm9yRWFjaCh2aXNpdENsYXNzKTsKICAgIGluZm8udHlwZWRlZnMuZm9yRWFjaCh2aXNpdFR5cGVkZWYpOwogIH0KCiAgdmlzaXRDbGFzcyhDbGFzc0luZm8gaW5mbykgewogICAgaW5mby5mdW5jdGlvbnMuZm9yRWFjaCh2aXNpdEZ1bmN0aW9uKTsKICAgIGluZm8uZmllbGRzLmZvckVhY2godmlzaXRGaWVsZCk7CiAgfQoKICB2aXNpdEZpZWxkKEZpZWxkSW5mbyBpbmZvKSB7CiAgICBpbmZvLmNsb3N1cmVzLmZvckVhY2godmlzaXRDbG9zdXJlKTsKICB9CgogIHZpc2l0Q29uc3RhbnQoQ29uc3RhbnRJbmZvIGluZm8pIHt9CgogIHZpc2l0RnVuY3Rpb24oRnVuY3Rpb25JbmZvIGluZm8pIHsKICAgIGluZm8uY2xvc3VyZXMuZm9yRWFjaCh2aXNpdENsb3N1cmUpOwogIH0KCiAgdmlzaXRUeXBlZGVmKFR5cGVkZWZJbmZvIGluZm8pIHt9CiAgdmlzaXRPdXRwdXQoT3V0cHV0VW5pdEluZm8gaW5mbykge30KICB2aXNpdENsb3N1cmUoQ2xvc3VyZUluZm8gaW5mbykgewogICAgdmlzaXRGdW5jdGlvbihpbmZvLmZ1bmN0aW9uKTsKICB9Cn0KgicATk48AUMbAUxNKRYxFQE1DwFJRToVAUYMASUPAScCATccNysXARUMDwEPAU8UHQFQASEBLgIBTg0qOCICAT8QLRcBQDEBSw8zATIwATUrAS8qATtLUDMzATowAUwZOQFRGk9BMwFRTE0vKwFNTQ4ZAU9NSTxRHgENAUECARQbDBkeIBsdASgcAS4aATYXASocATIWAREBDxgRGx4gGx0gHhsgGhcBRQIBLCYxCwE2OwEzNQEqKwErMAFOTzYBQhZRAUo/AT0BRQIBUE47KRMBPCUBNzwBQwFEAgEnJCUTATk7MwEjUR8qAQ1OPQE5AUMCAUxOJBEqDQEoCwFOFQ8BLwIBKDcnMhcBN0RAAT8BRgIBJzIdDwE8FwE1HgEvFwE9EAFDHAENFBkTERkVESEVQwE5AUMCAS0mGQ8BQTwBPQFFAgEsNTAuLTIBThQBKh8BRB4BIQ8BIBUBIB0BNCIBFFAWAT8UASEXARAUGSETGRYVERcfFxgZEkYBPwFGAgFBJjQZAQ9MPwE9AUUCATAXOhUBSFAqFQEqAgE6FhUVHQE6AgEpGhcWGBkBFR0bHSACAUEQCwkMCQwOCwsCASUSGxgZFhwZGRYcGR4bGxgbGA0TBAIBJxIUHxIdFSASHRUgFyIUHxQfDRMEAgFHIBwkJCAgJiYkJCYCAU5PSU1QCzcbTTEqKwQBJAEjMzAmKQQBHyslBAEfKQQBJgElKQQBJCYjIgQCAR5wYWNrYWdlOmRhcnQyanNfaW5mby9pbmZvLmRhcnQ+c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2RhcnQyanNfaW5mby9saWIvanNvbl9pbmZvX2NvZGVjLmRhcnTAAE7ZLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBDb252ZXJ0ZXJzIGFuZCBjb2RlY3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBKU09OIGFuZCBbSW5mb10gY2xhc3Nlcy4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwoKaW1wb3J0ICdwYWNrYWdlOmNvbGxlY3Rpb24vY29sbGVjdGlvbi5kYXJ0JzsKaW1wb3J0ICdzcmMvdXRpbC5kYXJ0JzsKaW1wb3J0ICdpbmZvLmRhcnQnOwoKTGlzdDxTdHJpbmc+IF90b1NvcnRlZFNlcmlhbGl6ZWRJZHMoCiAgICAgICAgSXRlcmFibGU8SW5mbz4gaW5mb3MsIElkIEZ1bmN0aW9uKEluZm8pIGdldElkKSA9PgogICAgaW5mb3MubWFwKChpKSA9PiBnZXRJZChpKS5zZXJpYWxpemVkSWQpLnRvTGlzdCgpLi5zb3J0KGNvbXBhcmVOYXR1cmFsKTsKCi8vIFRPRE8oc2lnbXVuZCk6IGFkZCB1bml0IHRlc3RzLgpjbGFzcyBKc29uVG9BbGxJbmZvQ29udmVydGVyIGV4dGVuZHMgQ29udmVydGVyPE1hcDxTdHJpbmcsIGR5bmFtaWM+LCBBbGxJbmZvPiB7CiAgLy8gVXNpbmcgYE1hc2hNYXBgIGhlcmUgYmVjYXVzZSBpdCdzIGZhc3RlciB0aGFuIHRoZSBkZWZhdWx0IGBMaW5rZWRIYXNoTWFwYC4KICBmaW5hbCBNYXA8U3RyaW5nLCBJbmZvPiByZWdpc3RyeSA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW5mbz4oKTsKCiAgQWxsSW5mbyBjb252ZXJ0KE1hcDxTdHJpbmcsIGR5bmFtaWM+IGpzb24pIHsKICAgIHJlZ2lzdHJ5LmNsZWFyKCk7CgogICAgdmFyIHJlc3VsdCA9IG5ldyBBbGxJbmZvKCk7CiAgICB2YXIgZWxlbWVudHMgPSBqc29uWydlbGVtZW50cyddOwogICAgLy8gVE9ETyhzcmF3bGlucyk6IFNpbmNlIG9ubHkgdGhlIE1hcCB2YWx1ZXMgYXJlIGJlaW5nIGV4dHJhY3RlZCBiZWxvdywKICAgIC8vIHJlcGxhY2UgYGFzYCB3aXRoIGBjYXN0YCB3aGVuIGBjYXN0YCBiZWNvbWVzIGF2YWlsYWJsZSBpbiBEYXJ0IDIuMDoKICAgIC8vCiAgICAvLyAgICAgLmFkZEFsbChlbGVtZW50c1snbGlicmFyeSddLnZhbHVlcy5jYXN0PE1hcD4oKS5tYXAocGFyc2VMaWJyYXJ5KSk7CiAgICByZXN1bHQubGlicmFyaWVzLmFkZEFsbCgKICAgICAgICAoZWxlbWVudHNbJ2xpYnJhcnknXSBhcyBNYXApLnZhbHVlcy5tYXAoKGwpID0+IHBhcnNlTGlicmFyeShsKSkpOwogICAgcmVzdWx0LmNsYXNzZXMKICAgICAgICAuYWRkQWxsKChlbGVtZW50c1snY2xhc3MnXSBhcyBNYXApLnZhbHVlcy5tYXAoKGMpID0+IHBhcnNlQ2xhc3MoYykpKTsKICAgIHJlc3VsdC5mdW5jdGlvbnMuYWRkQWxsKAogICAgICAgIChlbGVtZW50c1snZnVuY3Rpb24nXSBhcyBNYXApLnZhbHVlcy5tYXAoKGYpID0+IHBhcnNlRnVuY3Rpb24oZikpKTsKCiAgICAvLyBUT0RPKGhldCk6IFJldmVydCB0aGlzIHdoZW4gdGhlIGRhcnQyanMgd2l0aCB0aGUgbmV3IGNvZGVjIGlzIGluIHN0YWJsZQogICAgaWYgKGVsZW1lbnRzWydjbG9zdXJlJ10gIT0gbnVsbCkgewogICAgICByZXN1bHQuY2xvc3VyZXMuYWRkQWxsKAogICAgICAgICAgKGVsZW1lbnRzWydjbG9zdXJlJ10gYXMgTWFwKS52YWx1ZXMubWFwKChjKSA9PiBwYXJzZUNsb3N1cmUoYykpKTsKICAgIH0KICAgIHJlc3VsdC5maWVsZHMKICAgICAgICAuYWRkQWxsKChlbGVtZW50c1snZmllbGQnXSBhcyBNYXApLnZhbHVlcy5tYXAoKGYpID0+IHBhcnNlRmllbGQoZikpKTsKICAgIHJlc3VsdC50eXBlZGVmcy5hZGRBbGwoCiAgICAgICAgKGVsZW1lbnRzWyd0eXBlZGVmJ10gYXMgTWFwKS52YWx1ZXMubWFwKCh0KSA9PiBwYXJzZVR5cGVkZWYodCkpKTsKICAgIHJlc3VsdC5jb25zdGFudHMuYWRkQWxsKAogICAgICAgIChlbGVtZW50c1snY29uc3RhbnQnXSBhcyBNYXApLnZhbHVlcy5tYXAoKGMpID0+IHBhcnNlQ29uc3RhbnQoYykpKTsKCiAgICBqc29uWydob2xkaW5nJ10uZm9yRWFjaCgoaywgZGVwcykgewogICAgICBDb2RlSW5mbyBzcmMgPSByZWdpc3RyeVtrXTsKICAgICAgYXNzZXJ0KHNyYyAhPSBudWxsKTsKICAgICAgZm9yICh2YXIgZGVwIGluIGRlcHMpIHsKICAgICAgICB2YXIgdGFyZ2V0ID0gcmVnaXN0cnlbZGVwWydpZCddXTsKICAgICAgICBhc3NlcnQodGFyZ2V0ICE9IG51bGwpOwogICAgICAgIHNyYy51c2VzLmFkZChuZXcgRGVwZW5kZW5jeUluZm8odGFyZ2V0LCBkZXBbJ21hc2snXSkpOwogICAgICB9CiAgICB9KTsKCiAgICBqc29uWydkZXBlbmRlbmNpZXMnXT8uZm9yRWFjaCgoU3RyaW5nIGssIGRlcGVuZGVuY2llcykgewogICAgICBMaXN0PFN0cmluZz4gZGVwcyA9IGRlcGVuZGVuY2llczsKICAgICAgcmVzdWx0LmRlcGVuZGVuY2llc1tyZWdpc3RyeVtrXV0gPSBkZXBzLm1hcCgoZCkgPT4gcmVnaXN0cnlbZF0pLnRvTGlzdCgpOwogICAgfSk7CgogICAgcmVzdWx0Lm91dHB1dFVuaXRzCiAgICAgICAgLmFkZEFsbCgoanNvblsnb3V0cHV0VW5pdHMnXSBhcyBMaXN0KS5tYXAoKG8pID0+IHBhcnNlT3V0cHV0VW5pdChvKSkpOwoKICAgIHJlc3VsdC5wcm9ncmFtID0gcGFyc2VQcm9ncmFtKGpzb25bJ3Byb2dyYW0nXSk7CgogICAgaWYgKGpzb25bJ2RlZmVycmVkRmlsZXMnXSAhPSBudWxsKSB7CiAgICAgIGZpbmFsIGRlZmVycmVkRmlsZXNNYXAgPQogICAgICAgICAgKGpzb25bJ2RlZmVycmVkRmlsZXMnXSBhcyBNYXApLmNhc3Q8U3RyaW5nLCBNYXA8U3RyaW5nLCBkeW5hbWljPj4oKTsKICAgICAgZm9yIChmaW5hbCBsaWJyYXJ5IGluIGRlZmVycmVkRmlsZXNNYXAudmFsdWVzKSB7CiAgICAgICAgaWYgKGxpYnJhcnlbJ2ltcG9ydHMnXSAhPSBudWxsKSB7CiAgICAgICAgICAvLyBUaGUgaW1wb3J0TWFwIG5lZWRzIHRvIGJlIHR5cGVkIGFzIDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4sIGJ1dCB0aGUKICAgICAgICAgIC8vIGpzb24gcGFyc2VyIHByb2R1Y2VzIDxTdHJpbmcsIGR5bmFtaWM+LgogICAgICAgICAgZmluYWwgaW1wb3J0TWFwID0gbGlicmFyeVsnaW1wb3J0cyddIGFzIE1hcDxTdHJpbmcsIGR5bmFtaWM+OwogICAgICAgICAgaW1wb3J0TWFwLmZvckVhY2goKHByZWZpeCwgZmlsZXMpIHsKICAgICAgICAgICAgaW1wb3J0TWFwW3ByZWZpeF0gPSAoZmlsZXMgYXMgTGlzdDxkeW5hbWljPikuY2FzdDxTdHJpbmc+KCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGxpYnJhcnlbJ2ltcG9ydHMnXSA9IGltcG9ydE1hcC5jYXN0PFN0cmluZywgTGlzdDxTdHJpbmc+PigpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXN1bHQuZGVmZXJyZWRGaWxlcyA9IGRlZmVycmVkRmlsZXNNYXA7CiAgICB9CgogICAgLy8gdG9kbzogdmVyc2lvbiwgZXRjCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgT3V0cHV0VW5pdEluZm8gcGFyc2VPdXRwdXRVbml0KE1hcCBqc29uKSB7CiAgICBPdXRwdXRVbml0SW5mbyByZXN1bHQgPSBwYXJzZUlkKGpzb25bJ2lkJ10pOwogICAgcmVzdWx0CiAgICAgIC4uZmlsZW5hbWUgPSBqc29uWydmaWxlbmFtZSddCiAgICAgIC4ubmFtZSA9IGpzb25bJ25hbWUnXQogICAgICAuLnNpemUgPSBqc29uWydzaXplJ107CiAgICByZXN1bHQuaW1wb3J0cwogICAgICAgIC5hZGRBbGwoKGpzb25bJ2ltcG9ydHMnXSBhcyBMaXN0KS5tYXAoKHMpID0+IHMgYXMgU3RyaW5nKSA/PyBjb25zdCBbXSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTGlicmFyeUluZm8gcGFyc2VMaWJyYXJ5KE1hcCBqc29uKSB7CiAgICBMaWJyYXJ5SW5mbyByZXN1bHQgPSBwYXJzZUlkKGpzb25bJ2lkJ10pOwogICAgcmVzdWx0CiAgICAgIC4ubmFtZSA9IGpzb25bJ25hbWUnXQogICAgICAuLnVyaSA9IFVyaS5wYXJzZShqc29uWydjYW5vbmljYWxVcmknXSkKICAgICAgLi5vdXRwdXRVbml0ID0gcGFyc2VJZChqc29uWydvdXRwdXRVbml0J10pCiAgICAgIC4uc2l6ZSA9IGpzb25bJ3NpemUnXTsKICAgIGZvciAodmFyIGNoaWxkIGluIGpzb25bJ2NoaWxkcmVuJ10ubWFwKHBhcnNlSWQpKSB7CiAgICAgIGlmIChjaGlsZCBpcyBGdW5jdGlvbkluZm8pIHsKICAgICAgICByZXN1bHQudG9wTGV2ZWxGdW5jdGlvbnMuYWRkKGNoaWxkKTsKICAgICAgfSBlbHNlIGlmIChjaGlsZCBpcyBGaWVsZEluZm8pIHsKICAgICAgICByZXN1bHQudG9wTGV2ZWxWYXJpYWJsZXMuYWRkKGNoaWxkKTsKICAgICAgfSBlbHNlIGlmIChjaGlsZCBpcyBDbGFzc0luZm8pIHsKICAgICAgICByZXN1bHQuY2xhc3Nlcy5hZGQoY2hpbGQpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChjaGlsZCBpcyBUeXBlZGVmSW5mbyk7CiAgICAgICAgcmVzdWx0LnR5cGVkZWZzLmFkZChjaGlsZCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBDbGFzc0luZm8gcGFyc2VDbGFzcyhNYXAganNvbikgewogICAgQ2xhc3NJbmZvIHJlc3VsdCA9IHBhcnNlSWQoanNvblsnaWQnXSk7CiAgICByZXN1bHQKICAgICAgLi5uYW1lID0ganNvblsnbmFtZSddCiAgICAgIC4ucGFyZW50ID0gcGFyc2VJZChqc29uWydwYXJlbnQnXSkKICAgICAgLi5vdXRwdXRVbml0ID0gcGFyc2VJZChqc29uWydvdXRwdXRVbml0J10pCiAgICAgIC4uc2l6ZSA9IGpzb25bJ3NpemUnXQogICAgICAuLmlzQWJzdHJhY3QgPSBqc29uWydtb2RpZmllcnMnXVsnYWJzdHJhY3QnXSA9PSB0cnVlOwogICAgYXNzZXJ0KHJlc3VsdCBpcyBDbGFzc0luZm8pOwogICAgZm9yICh2YXIgY2hpbGQgaW4ganNvblsnY2hpbGRyZW4nXS5tYXAocGFyc2VJZCkpIHsKICAgICAgaWYgKGNoaWxkIGlzIEZ1bmN0aW9uSW5mbykgewogICAgICAgIHJlc3VsdC5mdW5jdGlvbnMuYWRkKGNoaWxkKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoY2hpbGQgaXMgRmllbGRJbmZvKTsKICAgICAgICByZXN1bHQuZmllbGRzLmFkZChjaGlsZCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBGaWVsZEluZm8gcGFyc2VGaWVsZChNYXAganNvbikgewogICAgRmllbGRJbmZvIHJlc3VsdCA9IHBhcnNlSWQoanNvblsnaWQnXSk7CiAgICByZXR1cm4gcmVzdWx0CiAgICAgIC4ubmFtZSA9IGpzb25bJ25hbWUnXQogICAgICAuLnBhcmVudCA9IHBhcnNlSWQoanNvblsncGFyZW50J10pCiAgICAgIC4uY292ZXJhZ2VJZCA9IGpzb25bJ2NvdmVyYWdlSWQnXQogICAgICAuLm91dHB1dFVuaXQgPSBwYXJzZUlkKGpzb25bJ291dHB1dFVuaXQnXSkKICAgICAgLi5zaXplID0ganNvblsnc2l6ZSddCiAgICAgIC4udHlwZSA9IGpzb25bJ3R5cGUnXQogICAgICAuLmluZmVycmVkVHlwZSA9IGpzb25bJ2luZmVycmVkVHlwZSddCiAgICAgIC4uY29kZSA9IHBhcnNlQ29kZShqc29uWydjb2RlJ10pCiAgICAgIC4uaXNDb25zdCA9IGpzb25bJ2NvbnN0J10gPz8gZmFsc2UKICAgICAgLi5pbml0aWFsaXplciA9IHBhcnNlSWQoanNvblsnaW5pdGlhbGl6ZXInXSkKICAgICAgLi5jbG9zdXJlcyA9IChqc29uWydjaGlsZHJlbiddIGFzIExpc3QpCiAgICAgICAgICAubWFwPENsb3N1cmVJbmZvPigoYykgPT4gcGFyc2VJZChjKSkKICAgICAgICAgIC50b0xpc3QoKTsKICB9CgogIENvbnN0YW50SW5mbyBwYXJzZUNvbnN0YW50KE1hcCBqc29uKSB7CiAgICBDb25zdGFudEluZm8gcmVzdWx0ID0gcGFyc2VJZChqc29uWydpZCddKTsKICAgIHJldHVybiByZXN1bHQKICAgICAgLi5jb2RlID0gcGFyc2VDb2RlKGpzb25bJ2NvZGUnXSkKICAgICAgLi5zaXplID0ganNvblsnc2l6ZSddCiAgICAgIC4ub3V0cHV0VW5pdCA9IHBhcnNlSWQoanNvblsnb3V0cHV0VW5pdCddKTsKICB9CgogIFR5cGVkZWZJbmZvIHBhcnNlVHlwZWRlZihNYXAganNvbikgewogICAgVHlwZWRlZkluZm8gcmVzdWx0ID0gcGFyc2VJZChqc29uWydpZCddKTsKICAgIHJldHVybiByZXN1bHQKICAgICAgLi5uYW1lID0ganNvblsnbmFtZSddCiAgICAgIC4ucGFyZW50ID0gcGFyc2VJZChqc29uWydwYXJlbnQnXSkKICAgICAgLi50eXBlID0ganNvblsndHlwZSddCiAgICAgIC4uc2l6ZSA9IDA7CiAgfQoKICBQcm9ncmFtSW5mbyBwYXJzZVByb2dyYW0oTWFwIGpzb24pIHsKICAgIHZhciBwcm9ncmFtSW5mbyA9IG5ldyBQcm9ncmFtSW5mbygpCiAgICAgIC4uZW50cnlwb2ludCA9IHBhcnNlSWQoanNvblsnZW50cnlwb2ludCddKQogICAgICAuLnNpemUgPSBqc29uWydzaXplJ10KICAgICAgLi5jb21waWxhdGlvbk1vbWVudCA9IERhdGVUaW1lLnBhcnNlKGpzb25bJ2NvbXBpbGF0aW9uTW9tZW50J10pCiAgICAgIC4uZGFydDJqc1ZlcnNpb24gPSBqc29uWydkYXJ0MmpzVmVyc2lvbiddCiAgICAgIC4ubm9TdWNoTWV0aG9kRW5hYmxlZCA9IGpzb25bJ25vU3VjaE1ldGhvZEVuYWJsZWQnXQogICAgICAuLmlzUnVudGltZVR5cGVVc2VkID0ganNvblsnaXNSdW50aW1lVHlwZVVzZWQnXQogICAgICAuLmlzSXNvbGF0ZUluVXNlID0ganNvblsnaXNJc29sYXRlSW5Vc2UnXQogICAgICAuLmlzRnVuY3Rpb25BcHBseVVzZWQgPSBqc29uWydpc0Z1bmN0aW9uQXBwbHlVc2VkJ10KICAgICAgLi5pc01pcnJvcnNVc2VkID0ganNvblsnaXNNaXJyb3JzVXNlZCddCiAgICAgIC4ubWluaWZpZWQgPSBqc29uWydtaW5pZmllZCddOwoKICAgIC8vIFRPRE8oaGV0KTogUmV2ZXJ0IHRoaXMgd2hlbiB0aGUgZGFydDJqcyB3aXRoIHRoZSBuZXcgY29kZWMgaXMgaW4gc3RhYmxlCiAgICB2YXIgY29tcGlsYXRpb25EdXJhdGlvbiA9IGpzb25bJ2NvbXBpbGF0aW9uRHVyYXRpb24nXTsKICAgIGlmIChjb21waWxhdGlvbkR1cmF0aW9uIGlzIFN0cmluZykgewogICAgICBwcm9ncmFtSW5mby5jb21waWxhdGlvbkR1cmF0aW9uID0gX3BhcnNlRHVyYXRpb24oY29tcGlsYXRpb25EdXJhdGlvbik7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoY29tcGlsYXRpb25EdXJhdGlvbiBpcyBpbnQpOwogICAgICBwcm9ncmFtSW5mby5jb21waWxhdGlvbkR1cmF0aW9uID0KICAgICAgICAgIG5ldyBEdXJhdGlvbihtaWNyb3NlY29uZHM6IGNvbXBpbGF0aW9uRHVyYXRpb24pOwogICAgfQoKICAgIHZhciB0b0pzb25EdXJhdGlvbiA9IGpzb25bJ3RvSnNvbkR1cmF0aW9uJ107CiAgICBpZiAodG9Kc29uRHVyYXRpb24gaXMgU3RyaW5nKSB7CiAgICAgIHByb2dyYW1JbmZvLnRvSnNvbkR1cmF0aW9uID0gX3BhcnNlRHVyYXRpb24odG9Kc29uRHVyYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KHRvSnNvbkR1cmF0aW9uIGlzIGludCk7CiAgICAgIHByb2dyYW1JbmZvLnRvSnNvbkR1cmF0aW9uID0gbmV3IER1cmF0aW9uKG1pY3Jvc2Vjb25kczogdG9Kc29uRHVyYXRpb24pOwogICAgfQoKICAgIHZhciBkdW1wSW5mb0R1cmF0aW9uID0ganNvblsnZHVtcEluZm9EdXJhdGlvbiddOwogICAgaWYgKGR1bXBJbmZvRHVyYXRpb24gaXMgU3RyaW5nKSB7CiAgICAgIHByb2dyYW1JbmZvLmR1bXBJbmZvRHVyYXRpb24gPSBfcGFyc2VEdXJhdGlvbihkdW1wSW5mb0R1cmF0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChkdW1wSW5mb0R1cmF0aW9uIGlzIGludCk7CiAgICAgIHByb2dyYW1JbmZvLmR1bXBJbmZvRHVyYXRpb24gPQogICAgICAgICAgbmV3IER1cmF0aW9uKG1pY3Jvc2Vjb25kczogZHVtcEluZm9EdXJhdGlvbik7CiAgICB9CgogICAgcmV0dXJuIHByb2dyYW1JbmZvOwogIH0KCiAgLy8vIFBhcnNlIGEgc3RyaW5nIGZvcm1hdHRlZCBhcyAiWFg6WVk6WlouWlpaWloiIGludG8gYSBbRHVyYXRpb25dLgogIER1cmF0aW9uIF9wYXJzZUR1cmF0aW9uKFN0cmluZyBkdXJhdGlvbikgewogICAgaWYgKCFkdXJhdGlvbi5jb250YWlucygnOicpKSB7CiAgICAgIHJldHVybiBuZXcgRHVyYXRpb24obWlsbGlzZWNvbmRzOiBpbnQucGFyc2UoZHVyYXRpb24pKTsKICAgIH0KICAgIHZhciBwYXJ0cyA9IGR1cmF0aW9uLnNwbGl0KCc6Jyk7CiAgICB2YXIgaG91cnMgPSBkb3VibGUucGFyc2UocGFydHNbMF0pOwogICAgdmFyIG1pbnV0ZXMgPSBkb3VibGUucGFyc2UocGFydHNbMV0pOwogICAgdmFyIHNlY29uZHMgPSBkb3VibGUucGFyc2UocGFydHNbMl0pOwogICAgY29uc3Qgc2Vjb25kc0luTWlsbGlzID0gMTAwMDsKICAgIGNvbnN0IG1pbnV0ZXNJbk1pbGxpcyA9IDYwICogc2Vjb25kc0luTWlsbGlzOwogICAgY29uc3QgaG91cnNJbk1pbGxpcyA9IDYwICogbWludXRlc0luTWlsbGlzOwogICAgdmFyIHRvdGFsTWlsbGlzID0gc2Vjb25kc0luTWlsbGlzICogc2Vjb25kcyArCiAgICAgICAgbWludXRlc0luTWlsbGlzICogbWludXRlcyArCiAgICAgICAgaG91cnNJbk1pbGxpcyAqIGhvdXJzOwogICAgcmV0dXJuIG5ldyBEdXJhdGlvbihtaWxsaXNlY29uZHM6IHRvdGFsTWlsbGlzLnJvdW5kKCkpOwogIH0KCiAgRnVuY3Rpb25JbmZvIHBhcnNlRnVuY3Rpb24oTWFwIGpzb24pIHsKICAgIEZ1bmN0aW9uSW5mbyByZXN1bHQgPSBwYXJzZUlkKGpzb25bJ2lkJ10pOwogICAgcmV0dXJuIHJlc3VsdAogICAgICAuLm5hbWUgPSBqc29uWyduYW1lJ10KICAgICAgLi5wYXJlbnQgPSBwYXJzZUlkKGpzb25bJ3BhcmVudCddKQogICAgICAuLmNvdmVyYWdlSWQgPSBqc29uWydjb3ZlcmFnZUlkJ10KICAgICAgLi5vdXRwdXRVbml0ID0gcGFyc2VJZChqc29uWydvdXRwdXRVbml0J10pCiAgICAgIC4uc2l6ZSA9IGpzb25bJ3NpemUnXQogICAgICAuLnR5cGUgPSBqc29uWyd0eXBlJ10KICAgICAgLi5yZXR1cm5UeXBlID0ganNvblsncmV0dXJuVHlwZSddCiAgICAgIC4uaW5mZXJyZWRSZXR1cm5UeXBlID0ganNvblsnaW5mZXJyZWRSZXR1cm5UeXBlJ10KICAgICAgLi5wYXJhbWV0ZXJzID0KICAgICAgICAgIChqc29uWydwYXJhbWV0ZXJzJ10gYXMgTGlzdCkubWFwKChwKSA9PiBwYXJzZVBhcmFtZXRlcihwKSkudG9MaXN0KCkKICAgICAgLi5jb2RlID0gcGFyc2VDb2RlKGpzb25bJ2NvZGUnXSkKICAgICAgLi5zaWRlRWZmZWN0cyA9IGpzb25bJ3NpZGVFZmZlY3RzJ10KICAgICAgLi5pbmxpbmVkQ291bnQgPSBqc29uWydpbmxpbmVkQ291bnQnXQogICAgICAuLm1vZGlmaWVycyA9CiAgICAgICAgICBwYXJzZU1vZGlmaWVycyhuZXcgTWFwPFN0cmluZywgYm9vbD4uZnJvbShqc29uWydtb2RpZmllcnMnXSkpCiAgICAgIC4uY2xvc3VyZXMgPSAoanNvblsnY2hpbGRyZW4nXSBhcyBMaXN0KQogICAgICAgICAgLm1hcDxDbG9zdXJlSW5mbz4oKGMpID0+IHBhcnNlSWQoYykpCiAgICAgICAgICAudG9MaXN0KCk7CiAgfQoKICBQYXJhbWV0ZXJJbmZvIHBhcnNlUGFyYW1ldGVyKE1hcCBqc29uKSA9PgogICAgICBuZXcgUGFyYW1ldGVySW5mbyhqc29uWyduYW1lJ10sIGpzb25bJ3R5cGUnXSwganNvblsnZGVjbGFyZWRUeXBlJ10pOwoKICBGdW5jdGlvbk1vZGlmaWVycyBwYXJzZU1vZGlmaWVycyhNYXA8U3RyaW5nLCBib29sPiBqc29uKSB7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uTW9kaWZpZXJzKAogICAgICAgIGlzU3RhdGljOiBqc29uWydzdGF0aWMnXSA9PSB0cnVlLAogICAgICAgIGlzQ29uc3Q6IGpzb25bJ2NvbnN0J10gPT0gdHJ1ZSwKICAgICAgICBpc0ZhY3Rvcnk6IGpzb25bJ2ZhY3RvcnknXSA9PSB0cnVlLAogICAgICAgIGlzRXh0ZXJuYWw6IGpzb25bJ2V4dGVybmFsJ10gPT0gdHJ1ZSk7CiAgfQoKICBDbG9zdXJlSW5mbyBwYXJzZUNsb3N1cmUoTWFwIGpzb24pIHsKICAgIENsb3N1cmVJbmZvIHJlc3VsdCA9IHBhcnNlSWQoanNvblsnaWQnXSk7CiAgICByZXR1cm4gcmVzdWx0CiAgICAgIC4ubmFtZSA9IGpzb25bJ25hbWUnXQogICAgICAuLnBhcmVudCA9IHBhcnNlSWQoanNvblsncGFyZW50J10pCiAgICAgIC4ub3V0cHV0VW5pdCA9IHBhcnNlSWQoanNvblsnb3V0cHV0VW5pdCddKQogICAgICAuLnNpemUgPSBqc29uWydzaXplJ10KICAgICAgLi5mdW5jdGlvbiA9IHBhcnNlSWQoanNvblsnZnVuY3Rpb24nXSk7CiAgfQoKICBJbmZvIHBhcnNlSWQoaWQpIHsKICAgIFN0cmluZyBzZXJpYWxpemVkSWQgPSBpZDsKICAgIGlmIChzZXJpYWxpemVkSWQgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiByZWdpc3RyeS5wdXRJZkFic2VudChzZXJpYWxpemVkSWQsICgpIHsKICAgICAgaWYgKHNlcmlhbGl6ZWRJZC5zdGFydHNXaXRoKCdmdW5jdGlvbi8nKSkgewogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25JbmZvLmludGVybmFsKCk7CiAgICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZElkLnN0YXJ0c1dpdGgoJ2Nsb3N1cmUvJykpIHsKICAgICAgICByZXR1cm4gbmV3IENsb3N1cmVJbmZvLmludGVybmFsKCk7CiAgICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZElkLnN0YXJ0c1dpdGgoJ2xpYnJhcnkvJykpIHsKICAgICAgICByZXR1cm4gbmV3IExpYnJhcnlJbmZvLmludGVybmFsKCk7CiAgICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZElkLnN0YXJ0c1dpdGgoJ2NsYXNzLycpKSB7CiAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0luZm8uaW50ZXJuYWwoKTsKICAgICAgfSBlbHNlIGlmIChzZXJpYWxpemVkSWQuc3RhcnRzV2l0aCgnZmllbGQvJykpIHsKICAgICAgICByZXR1cm4gbmV3IEZpZWxkSW5mby5pbnRlcm5hbCgpOwogICAgICB9IGVsc2UgaWYgKHNlcmlhbGl6ZWRJZC5zdGFydHNXaXRoKCdjb25zdGFudC8nKSkgewogICAgICAgIHJldHVybiBuZXcgQ29uc3RhbnRJbmZvLmludGVybmFsKCk7CiAgICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZElkLnN0YXJ0c1dpdGgoJ3R5cGVkZWYvJykpIHsKICAgICAgICByZXR1cm4gbmV3IFR5cGVkZWZJbmZvLmludGVybmFsKCk7CiAgICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZElkLnN0YXJ0c1dpdGgoJ291dHB1dFVuaXQvJykpIHsKICAgICAgICByZXR1cm4gbmV3IE91dHB1dFVuaXRJbmZvLmludGVybmFsKCk7CiAgICAgIH0KICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgIH0pOwogIH0KCiAgTGlzdDxDb2RlU3Bhbj4gcGFyc2VDb2RlKGR5bmFtaWMganNvbikgewogICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBmb3JtYXQgNS4xOgogICAgaWYgKGpzb24gaXMgU3RyaW5nKSB7CiAgICAgIHJldHVybiBbbmV3IENvZGVTcGFuKHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwsIHRleHQ6IGpzb24pXTsKICAgIH0KCiAgICBpZiAoanNvbiBpcyBMaXN0KSB7CiAgICAgIHJldHVybiBqc29uLm1hcCgoZHluYW1pYyB2YWx1ZSkgewogICAgICAgIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGpzb25Db2RlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIG5ldyBDb2RlU3BhbigKICAgICAgICAgICAgc3RhcnQ6IGpzb25Db2RlWydzdGFydCddLAogICAgICAgICAgICBlbmQ6IGpzb25Db2RlWydlbmQnXSwKICAgICAgICAgICAgdGV4dDoganNvbkNvZGVbJ3RleHQnXSk7CiAgICAgIH0pLnRvTGlzdCgpOwogICAgfQoKICAgIHJldHVybiBbXTsKICB9Cn0KCmNsYXNzIEFsbEluZm9Ub0pzb25Db252ZXJ0ZXIgZXh0ZW5kcyBDb252ZXJ0ZXI8QWxsSW5mbywgTWFwPgogICAgaW1wbGVtZW50cyBJbmZvVmlzaXRvcjxNYXA+IHsKICAvLy8gV2hldGhlciB0byBnZW5lcmF0ZSBqc29uIGNvbXBhdGlibGUgd2l0aCBmb3JtYXQgNS4xCiAgZmluYWwgYm9vbCBpc0JhY2t3YXJkQ29tcGF0aWJsZTsKICBmaW5hbCBNYXA8SW5mbywgSWQ+IGlkcyA9IG5ldyBIYXNoTWFwPEluZm8sIElkPigpOwogIGZpbmFsIFNldDxpbnQ+IHVzZWRJZHMgPSBuZXcgU2V0PGludD4oKTsKCiAgQWxsSW5mb1RvSnNvbkNvbnZlcnRlcih7dGhpcy5pc0JhY2t3YXJkQ29tcGF0aWJsZTogZmFsc2V9KTsKCiAgSWQgaWRGb3IoSW5mbyBpbmZvKSB7CiAgICB2YXIgc2VyaWFsaXplZElkID0gaWRzW2luZm9dOwogICAgaWYgKHNlcmlhbGl6ZWRJZCAhPSBudWxsKSByZXR1cm4gc2VyaWFsaXplZElkOwoKICAgIGFzc2VydCgKICAgICAgICBpbmZvIGlzIExpYnJhcnlJbmZvIHx8CiAgICAgICAgICAgIGluZm8gaXMgQ29uc3RhbnRJbmZvIHx8CiAgICAgICAgICAgIGluZm8gaXMgT3V0cHV0VW5pdEluZm8gfHwKICAgICAgICAgICAgaW5mby5wYXJlbnQgIT0gbnVsbCwKICAgICAgICAiJGluZm8iKTsKCiAgICBpbnQgaWQ7CiAgICBpZiAoaW5mbyBpcyBDb25zdGFudEluZm8pIHsKICAgICAgLy8gTm8gbmFtZSBhbmQgbm8gcGFyZW50LCBzbyBgbG9uZ05hbWVgIGlzbid0IGhlbHBmdWwKICAgICAgYXNzZXJ0KGluZm8ubmFtZSA9PSBudWxsKTsKICAgICAgYXNzZXJ0KGluZm8ucGFyZW50ID09IG51bGwpOwogICAgICBhc3NlcnQoaW5mby5jb2RlICE9IG51bGwpOwogICAgICAvLyBJbnN0ZWFkLCB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIGNvZGUuCiAgICAgIGlkID0gaW5mby5jb2RlLmZpcnN0LnRleHQuaGFzaENvZGU7CiAgICB9IGVsc2UgewogICAgICBpZCA9IGxvbmdOYW1lKGluZm8sIHVzZUxpYnJhcnlVcmk6IHRydWUsIGZvcklkOiB0cnVlKS5oYXNoQ29kZTsKICAgIH0KCiAgICB3aGlsZSAoIXVzZWRJZHMuYWRkKGlkKSkgewogICAgICBpZCsrOwogICAgfQogICAgc2VyaWFsaXplZElkID0gbmV3IElkKGluZm8ua2luZCwgJyRpZCcpOwogICAgcmV0dXJuIGlkc1tpbmZvXSA9IHNlcmlhbGl6ZWRJZDsKICB9CgogIE1hcCBjb252ZXJ0KEFsbEluZm8gaW5mbykgPT4gaW5mby5hY2NlcHQodGhpcyk7CgogIE1hcCBfdmlzaXRMaXN0KExpc3Q8SW5mbz4gaW5mb3MpIHsKICAgIC8vIFVzaW5nIFNwbGF5VHJlZSB0byBtYWludGFpbiBhIGNvbnNpc3RlbnQgb3JkZXIgb2Yga2V5cwogICAgdmFyIG1hcCA9IG5ldyBTcGxheVRyZWVNYXA8U3RyaW5nLCBNYXA+KGNvbXBhcmVOYXR1cmFsKTsKICAgIGZvciAodmFyIGluZm8gaW4gaW5mb3MpIHsKICAgICAgbWFwWycke2lkRm9yKGluZm8pLmlkfSddID0gaW5mby5hY2NlcHQodGhpcyk7CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KCiAgTWFwIF92aXNpdEFsbEluZm9FbGVtZW50cyhBbGxJbmZvIGluZm8pIHsKICAgIHZhciBqc29uTGlicmFyaWVzID0gX3Zpc2l0TGlzdChpbmZvLmxpYnJhcmllcyk7CiAgICB2YXIganNvbkNsYXNzZXMgPSBfdmlzaXRMaXN0KGluZm8uY2xhc3Nlcyk7CiAgICB2YXIganNvbkZ1bmN0aW9ucyA9IF92aXNpdExpc3QoaW5mby5mdW5jdGlvbnMpOwogICAgdmFyIGpzb25UeXBlZGVmcyA9IF92aXNpdExpc3QoaW5mby50eXBlZGVmcyk7CiAgICB2YXIganNvbkZpZWxkcyA9IF92aXNpdExpc3QoaW5mby5maWVsZHMpOwogICAgdmFyIGpzb25Db25zdGFudHMgPSBfdmlzaXRMaXN0KGluZm8uY29uc3RhbnRzKTsKICAgIHZhciBqc29uQ2xvc3VyZXMgPSBfdmlzaXRMaXN0KGluZm8uY2xvc3VyZXMpOwogICAgcmV0dXJuIHsKICAgICAgJ2xpYnJhcnknOiBqc29uTGlicmFyaWVzLAogICAgICAnY2xhc3MnOiBqc29uQ2xhc3NlcywKICAgICAgJ2Z1bmN0aW9uJzoganNvbkZ1bmN0aW9ucywKICAgICAgJ3R5cGVkZWYnOiBqc29uVHlwZWRlZnMsCiAgICAgICdmaWVsZCc6IGpzb25GaWVsZHMsCiAgICAgICdjb25zdGFudCc6IGpzb25Db25zdGFudHMsCiAgICAgICdjbG9zdXJlJzoganNvbkNsb3N1cmVzLAogICAgfTsKICB9CgogIE1hcCBfdmlzaXREZXBlbmRlbmN5SW5mbyhEZXBlbmRlbmN5SW5mbyBpbmZvKSA9PgogICAgICB7J2lkJzogaWRGb3IoaW5mby50YXJnZXQpLnNlcmlhbGl6ZWRJZCwgJ21hc2snOiBpbmZvLm1hc2t9OwoKICBNYXAgX3Zpc2l0QWxsSW5mb0hvbGRpbmcoQWxsSW5mbyBhbGxJbmZvKSB7CiAgICB2YXIgbWFwID0gbmV3IFNwbGF5VHJlZU1hcDxTdHJpbmcsIExpc3Q+KGNvbXBhcmVOYXR1cmFsKTsKICAgIHZvaWQgaGVscGVyKENvZGVJbmZvIGluZm8pIHsKICAgICAgaWYgKGluZm8udXNlcy5pc0VtcHR5KSByZXR1cm47CiAgICAgIG1hcFtpZEZvcihpbmZvKS5zZXJpYWxpemVkSWRdID0gaW5mby51c2VzCiAgICAgICAgICAubWFwKF92aXNpdERlcGVuZGVuY3lJbmZvKQogICAgICAgICAgLnRvTGlzdCgpCiAgICAgICAgICAgIC4uc29ydCgoYSwgYikgPT4gYVsnaWQnXS5jb21wYXJlVG8oYlsnaWQnXSkpOwogICAgfQoKICAgIGFsbEluZm8uZnVuY3Rpb25zLmZvckVhY2goaGVscGVyKTsKICAgIGFsbEluZm8uZmllbGRzLmZvckVhY2goaGVscGVyKTsKICAgIHJldHVybiBtYXA7CiAgfQoKICBNYXAgX3Zpc2l0QWxsSW5mb0RlcGVuZGVuY2llcyhBbGxJbmZvIGFsbEluZm8pIHsKICAgIHZhciBtYXAgPSBuZXcgU3BsYXlUcmVlTWFwPFN0cmluZywgTGlzdD4oY29tcGFyZU5hdHVyYWwpOwogICAgYWxsSW5mby5kZXBlbmRlbmNpZXMuZm9yRWFjaCgoaywgdikgewogICAgICBtYXBbaWRGb3Ioaykuc2VyaWFsaXplZElkXSA9IF90b1NvcnRlZFNlcmlhbGl6ZWRJZHModiwgaWRGb3IpOwogICAgfSk7CiAgICByZXR1cm4gbWFwOwogIH0KCiAgTWFwIHZpc2l0QWxsKEFsbEluZm8gaW5mbykgewogICAgdmFyIGVsZW1lbnRzID0gX3Zpc2l0QWxsSW5mb0VsZW1lbnRzKGluZm8pOwogICAgdmFyIGpzb25Ib2xkaW5nID0gX3Zpc2l0QWxsSW5mb0hvbGRpbmcoaW5mbyk7CiAgICB2YXIganNvbkRlcGVuZGVuY2llcyA9IF92aXNpdEFsbEluZm9EZXBlbmRlbmNpZXMoaW5mbyk7CiAgICByZXR1cm4gewogICAgICAnZWxlbWVudHMnOiBlbGVtZW50cywKICAgICAgJ2hvbGRpbmcnOiBqc29uSG9sZGluZywKICAgICAgJ2RlcGVuZGVuY2llcyc6IGpzb25EZXBlbmRlbmNpZXMsCiAgICAgICdvdXRwdXRVbml0cyc6IGluZm8ub3V0cHV0VW5pdHMubWFwKCh1KSA9PiB1LmFjY2VwdCh0aGlzKSkudG9MaXN0KCksCiAgICAgICdkdW1wX3ZlcnNpb24nOiBpc0JhY2t3YXJkQ29tcGF0aWJsZSA/IDUgOiBpbmZvLnZlcnNpb24sCiAgICAgICdkZWZlcnJlZEZpbGVzJzogaW5mby5kZWZlcnJlZEZpbGVzLAogICAgICAnZHVtcF9taW5vcl92ZXJzaW9uJzogaXNCYWNrd2FyZENvbXBhdGlibGUgPyAxIDogaW5mby5taW5vclZlcnNpb24sCiAgICAgICdwcm9ncmFtJzogaW5mby5wcm9ncmFtLmFjY2VwdCh0aGlzKQogICAgfTsKICB9CgogIE1hcCB2aXNpdFByb2dyYW0oUHJvZ3JhbUluZm8gaW5mbykgewogICAgcmV0dXJuIHsKICAgICAgJ2VudHJ5cG9pbnQnOiBpZEZvcihpbmZvLmVudHJ5cG9pbnQpLnNlcmlhbGl6ZWRJZCwKICAgICAgJ3NpemUnOiBpbmZvLnNpemUsCiAgICAgICdkYXJ0MmpzVmVyc2lvbic6IGluZm8uZGFydDJqc1ZlcnNpb24sCiAgICAgICdjb21waWxhdGlvbk1vbWVudCc6ICcke2luZm8uY29tcGlsYXRpb25Nb21lbnR9JywKICAgICAgJ2NvbXBpbGF0aW9uRHVyYXRpb24nOiBpbmZvLmNvbXBpbGF0aW9uRHVyYXRpb24uaW5NaWNyb3NlY29uZHMsCiAgICAgICd0b0pzb25EdXJhdGlvbic6IGluZm8udG9Kc29uRHVyYXRpb24uaW5NaWNyb3NlY29uZHMsCiAgICAgICdkdW1wSW5mb0R1cmF0aW9uJzogaW5mby5kdW1wSW5mb0R1cmF0aW9uLmluTWljcm9zZWNvbmRzLAogICAgICAnbm9TdWNoTWV0aG9kRW5hYmxlZCc6IGluZm8ubm9TdWNoTWV0aG9kRW5hYmxlZCwKICAgICAgJ2lzUnVudGltZVR5cGVVc2VkJzogaW5mby5pc1J1bnRpbWVUeXBlVXNlZCwKICAgICAgJ2lzSXNvbGF0ZUluVXNlJzogaW5mby5pc0lzb2xhdGVJblVzZSwKICAgICAgJ2lzRnVuY3Rpb25BcHBseVVzZWQnOiBpbmZvLmlzRnVuY3Rpb25BcHBseVVzZWQsCiAgICAgICdpc01pcnJvcnNVc2VkJzogaW5mby5pc01pcnJvcnNVc2VkLAogICAgICAnbWluaWZpZWQnOiBpbmZvLm1pbmlmaWVkLAogICAgfTsKICB9CgogIE1hcCBfdmlzaXRCYXNpY0luZm8oQmFzaWNJbmZvIGluZm8pIHsKICAgIHZhciByZXMgPSB7CiAgICAgICdpZCc6IGlkRm9yKGluZm8pLnNlcmlhbGl6ZWRJZCwKICAgICAgJ2tpbmQnOiBraW5kVG9TdHJpbmcoaW5mby5raW5kKSwKICAgICAgJ25hbWUnOiBpbmZvLm5hbWUsCiAgICAgICdzaXplJzogaW5mby5zaXplLAogICAgfTsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IE9taXQgdGhpcyBhbHNvIHdoZW4gb3V0cHV0VW5pdC5pZCA9PSAwIChtb3N0IGNvZGUgaXMgaW4KICAgIC8vIHRoZSBtYWluIG91dHB1dCB1bml0IGJ5IGRlZmF1bHQpLgogICAgaWYgKGluZm8ub3V0cHV0VW5pdCAhPSBudWxsKSB7CiAgICAgIHJlc1snb3V0cHV0VW5pdCddID0gaWRGb3IoaW5mby5vdXRwdXRVbml0KS5zZXJpYWxpemVkSWQ7CiAgICB9CiAgICBpZiAoaW5mby5jb3ZlcmFnZUlkICE9IG51bGwpIHJlc1snY292ZXJhZ2VJZCddID0gaW5mby5jb3ZlcmFnZUlkOwogICAgaWYgKGluZm8ucGFyZW50ICE9IG51bGwpIHJlc1sncGFyZW50J10gPSBpZEZvcihpbmZvLnBhcmVudCkuc2VyaWFsaXplZElkOwogICAgcmV0dXJuIHJlczsKICB9CgogIE1hcCB2aXNpdExpYnJhcnkoTGlicmFyeUluZm8gaW5mbykgewogICAgcmV0dXJuIF92aXNpdEJhc2ljSW5mbyhpbmZvKQogICAgICAuLmFkZEFsbCg8U3RyaW5nLCBPYmplY3Q+ewogICAgICAgICdjaGlsZHJlbic6IF90b1NvcnRlZFNlcmlhbGl6ZWRJZHMoCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICBpbmZvLnRvcExldmVsRnVuY3Rpb25zLAogICAgICAgICAgICAgIGluZm8udG9wTGV2ZWxWYXJpYWJsZXMsCiAgICAgICAgICAgICAgaW5mby5jbGFzc2VzLAogICAgICAgICAgICAgIGluZm8udHlwZWRlZnMKICAgICAgICAgICAgXS5leHBhbmQoKGkpID0+IGkpLAogICAgICAgICAgICBpZEZvciksCiAgICAgICAgJ2Nhbm9uaWNhbFVyaSc6ICcke2luZm8udXJpfScsCiAgICAgIH0pOwogIH0KCiAgTWFwIHZpc2l0Q2xhc3MoQ2xhc3NJbmZvIGluZm8pIHsKICAgIHJldHVybiBfdmlzaXRCYXNpY0luZm8oaW5mbykKICAgICAgLi5hZGRBbGwoPFN0cmluZywgT2JqZWN0PnsKICAgICAgICAvLyBUT0RPKHNpZ211bmQpOiBjaGFuZ2UgZm9ybWF0LCBpbmNsdWRlIG9ubHkgd2hlbiBhYnN0cmFjdCBpcyB0cnVlLgogICAgICAgICdtb2RpZmllcnMnOiB7J2Fic3RyYWN0JzogaW5mby5pc0Fic3RyYWN0fSwKICAgICAgICAnY2hpbGRyZW4nOiBfdG9Tb3J0ZWRTZXJpYWxpemVkSWRzKAogICAgICAgICAgICBbaW5mby5maWVsZHMsIGluZm8uZnVuY3Rpb25zXS5leHBhbmQoKGkpID0+IGkpLCBpZEZvcikKICAgICAgfSk7CiAgfQoKICBNYXAgdmlzaXRGaWVsZChGaWVsZEluZm8gaW5mbykgewogICAgdmFyIHJlc3VsdCA9IF92aXNpdEJhc2ljSW5mbyhpbmZvKQogICAgICAuLmFkZEFsbCg8U3RyaW5nLCBPYmplY3Q+ewogICAgICAgICdjaGlsZHJlbic6IF90b1NvcnRlZFNlcmlhbGl6ZWRJZHMoaW5mby5jbG9zdXJlcywgaWRGb3IpLAogICAgICAgICdpbmZlcnJlZFR5cGUnOiBpbmZvLmluZmVycmVkVHlwZSwKICAgICAgICAnY29kZSc6IF9zZXJpYWxpemVDb2RlKGluZm8uY29kZSksCiAgICAgICAgJ3R5cGUnOiBpbmZvLnR5cGUsCiAgICAgIH0pOwogICAgaWYgKGluZm8uaXNDb25zdCkgewogICAgICByZXN1bHRbJ2NvbnN0J10gPSB0cnVlOwogICAgICBpZiAoaW5mby5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgcmVzdWx0Wydpbml0aWFsaXplciddID0gaWRGb3IoaW5mby5pbml0aWFsaXplcikuc2VyaWFsaXplZElkOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTWFwIHZpc2l0Q29uc3RhbnQoQ29uc3RhbnRJbmZvIGluZm8pID0+IF92aXNpdEJhc2ljSW5mbyhpbmZvKQogICAgLi5hZGRBbGwoPFN0cmluZywgT2JqZWN0PnsnY29kZSc6IF9zZXJpYWxpemVDb2RlKGluZm8uY29kZSl9KTsKCiAgLy8gVE9ETyhzaWdtdW5kKTogZXhjbHVkZSBmYWxzZSB2YWx1ZXMgKHJlcXVpcmVzIGJ1bXBpbmcgdGhlIGZvcm1hdCB2ZXJzaW9uKToKICAvLyAgICAgdmFyIHJlcyA9IDxTdHJpbmcsIGJvb2w+e307CiAgLy8gICAgIGlmIChpc1N0YXRpYykgcmVzWydzdGF0aWMnXSA9IHRydWU7CiAgLy8gICAgIGlmIChpc0NvbnN0KSByZXNbJ2NvbnN0J10gPSB0cnVlOwogIC8vICAgICBpZiAoaXNGYWN0b3J5KSByZXNbJ2ZhY3RvcnknXSA9IHRydWU7CiAgLy8gICAgIGlmIChpc0V4dGVybmFsKSByZXNbJ2V4dGVybmFsJ10gPSB0cnVlOwogIC8vICAgICByZXR1cm4gcmVzOwogIE1hcCBfdmlzaXRGdW5jdGlvbk1vZGlmaWVycyhGdW5jdGlvbk1vZGlmaWVycyBtb2RzKSA9PiB7CiAgICAgICAgJ3N0YXRpYyc6IG1vZHMuaXNTdGF0aWMsCiAgICAgICAgJ2NvbnN0JzogbW9kcy5pc0NvbnN0LAogICAgICAgICdmYWN0b3J5JzogbW9kcy5pc0ZhY3RvcnksCiAgICAgICAgJ2V4dGVybmFsJzogbW9kcy5pc0V4dGVybmFsLAogICAgICB9OwoKICBNYXAgX3Zpc2l0UGFyYW1ldGVySW5mbyhQYXJhbWV0ZXJJbmZvIGluZm8pID0+CiAgICAgIHsnbmFtZSc6IGluZm8ubmFtZSwgJ3R5cGUnOiBpbmZvLnR5cGUsICdkZWNsYXJlZFR5cGUnOiBpbmZvLmRlY2xhcmVkVHlwZX07CgogIE1hcCB2aXNpdEZ1bmN0aW9uKEZ1bmN0aW9uSW5mbyBpbmZvKSB7CiAgICByZXR1cm4gX3Zpc2l0QmFzaWNJbmZvKGluZm8pCiAgICAgIC4uYWRkQWxsKDxTdHJpbmcsIE9iamVjdD57CiAgICAgICAgJ2NoaWxkcmVuJzogX3RvU29ydGVkU2VyaWFsaXplZElkcyhpbmZvLmNsb3N1cmVzLCBpZEZvciksCiAgICAgICAgJ21vZGlmaWVycyc6IF92aXNpdEZ1bmN0aW9uTW9kaWZpZXJzKGluZm8ubW9kaWZpZXJzKSwKICAgICAgICAncmV0dXJuVHlwZSc6IGluZm8ucmV0dXJuVHlwZSwKICAgICAgICAnaW5mZXJyZWRSZXR1cm5UeXBlJzogaW5mby5pbmZlcnJlZFJldHVyblR5cGUsCiAgICAgICAgJ3BhcmFtZXRlcnMnOgogICAgICAgICAgICBpbmZvLnBhcmFtZXRlcnMubWFwKChwKSA9PiBfdmlzaXRQYXJhbWV0ZXJJbmZvKHApKS50b0xpc3QoKSwKICAgICAgICAnc2lkZUVmZmVjdHMnOiBpbmZvLnNpZGVFZmZlY3RzLAogICAgICAgICdpbmxpbmVkQ291bnQnOiBpbmZvLmlubGluZWRDb3VudCwKICAgICAgICAnY29kZSc6IF9zZXJpYWxpemVDb2RlKGluZm8uY29kZSksCiAgICAgICAgJ3R5cGUnOiBpbmZvLnR5cGUsCiAgICAgICAgLy8gTm90ZTogdmVyc2lvbiAzLjIgb2YgZHVtcC1pbmZvIHNlcmlhbGl6ZXMgYHVzZXNgIGluIGEgc2VjdGlvbiBjYWxsZWQKICAgICAgICAvLyBgaG9sZGluZ2AgYXQgdGhlIHRvcC1sZXZlbC4KICAgICAgfSk7CiAgfQoKICBNYXAgdmlzaXRDbG9zdXJlKENsb3N1cmVJbmZvIGluZm8pIHsKICAgIHJldHVybiBfdmlzaXRCYXNpY0luZm8oaW5mbykKICAgICAgLi5hZGRBbGwoPFN0cmluZywgT2JqZWN0PnsnZnVuY3Rpb24nOiBpZEZvcihpbmZvLmZ1bmN0aW9uKS5zZXJpYWxpemVkSWR9KTsKICB9CgogIHZpc2l0VHlwZWRlZihUeXBlZGVmSW5mbyBpbmZvKSA9PiBfdmlzaXRCYXNpY0luZm8oaW5mbykuLlsndHlwZSddID0gaW5mby50eXBlOwoKICB2aXNpdE91dHB1dChPdXRwdXRVbml0SW5mbyBpbmZvKSA9PiBfdmlzaXRCYXNpY0luZm8oaW5mbykKICAgIC4uWydmaWxlbmFtZSddID0gaW5mby5maWxlbmFtZQogICAgLi5bJ2ltcG9ydHMnXSA9IGluZm8uaW1wb3J0czsKCiAgT2JqZWN0IF9zZXJpYWxpemVDb2RlKExpc3Q8Q29kZVNwYW4+IGNvZGUpIHsKICAgIGlmIChpc0JhY2t3YXJkQ29tcGF0aWJsZSkgewogICAgICByZXR1cm4gY29kZS5tYXAoKGMpID0+IGMudGV4dCkuam9pbignXG4nKTsKICAgIH0KICAgIHJldHVybiBjb2RlCiAgICAgICAgLm1hcDxPYmplY3Q+KChjKSA9PiB7CiAgICAgICAgICAgICAgJ3N0YXJ0JzogYy5zdGFydCwKICAgICAgICAgICAgICAnZW5kJzogYy5lbmQsCiAgICAgICAgICAgICAgJ3RleHQnOiBjLnRleHQsCiAgICAgICAgICAgIH0pCiAgICAgICAgLnRvTGlzdCgpOwogIH0KfQoKY2xhc3MgQWxsSW5mb0pzb25Db2RlYyBleHRlbmRzIENvZGVjPEFsbEluZm8sIE1hcD4gewogIGZpbmFsIENvbnZlcnRlcjxBbGxJbmZvLCBNYXA+IGVuY29kZXI7CiAgZmluYWwgQ29udmVydGVyPE1hcCwgQWxsSW5mbz4gZGVjb2RlciA9IG5ldyBKc29uVG9BbGxJbmZvQ29udmVydGVyKCk7CgogIEFsbEluZm9Kc29uQ29kZWMoe2Jvb2wgaXNCYWNrd2FyZENvbXBhdGlibGU6IGZhbHNlfSkKICAgICAgOiBlbmNvZGVyID0gbmV3IEFsbEluZm9Ub0pzb25Db252ZXJ0ZXIoCiAgICAgICAgICAgIGlzQmFja3dhcmRDb21wYXRpYmxlOiBpc0JhY2t3YXJkQ29tcGF0aWJsZSk7Cn0KCmNsYXNzIElkIHsKICBmaW5hbCBJbmZvS2luZCBraW5kOwogIGZpbmFsIFN0cmluZyBpZDsKCiAgSWQodGhpcy5raW5kLCB0aGlzLmlkKTsKCiAgU3RyaW5nIGdldCBzZXJpYWxpemVkSWQgPT4gJyR7a2luZFRvU3RyaW5nKGtpbmQpfS8kaWQnOwp9CoJZAE5OPAFKARoXAS0YFAElOkwBIlBQQgEvFgEgJUxLB04dShNOHUwBTyceTAYSThxKHUwBKCIbHiogPwgIAT0oUAgBF08BNAEpH083KlA1SC5JDkcKCC8GARoTBAEtMQskHB0TUBMEAScuCxwuMR03Iy0nLScjDyYkCAYTBAEjLAscKTEcPCE3IyUPJCIIBhMEASMsEhwpKDEcHCwnKTMuLxUEASkvEiccMgQBJy4SHCkcEgQBJygxHEYwOjYwOi4lAU87KU0NKig7BgExJEMNJU8GATUmRw0nJTgGARgEAUYtIz4GJSgqKiIyMDIkHzwEASkvEhwpKDEcHCg4FU4nKiwUSC4vFQQBLEsBPSIqKCwvBAEnLhIcKTEcLgQBFR4gEwYzMiw4KzgrNik2KTksOCs7LggVCAQBKzAaQQYBGCgvHSYiJRMGAQ8EAgE9IjojNSsBPgEYIjMBDB8kJiESAQwgPCEjIS8qDUYGAR8MBi0lBAEyASU+PR40BhAEASw0MDQyLjQyDSAcIR8bIR8HBAEzQgEuPiElMCUUOgYBJyQQBAEzPipFCBAEAR8wMjwNHB4oSz8rSisHBAEnDTkZLThGPEA3My03KyEHBAEoECYnGRkHTikjPwZGThAEASchISwOJiYcHCAUJwoEASMhIU00LEMKBAEjJyFCKysbChgeJkYIBhMEAUBDAVAlLSsvMRU7IR8jJQkBMVEBKSEhQj4nNxZJKSsrG1AnCgQBJyFRBAFRATwjIgEvIDEGEB4gHB4PEwQCATUpSAE3LjkCAQsXEwEaAToCASlwYWNrYWdlOmRhcnQyanNfaW5mby9qc29uX2luZm9fY29kZWMuZGFydENzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvZGFydDJqc19pbmZvL2xpYi9iaW5hcnlfc2VyaWFsaXphdGlvbi5kYXJ0ucQvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEluZm8gc2VyaWFsaXphdGlvbiB0byBhIGJpbmFyeSBmb3JtLgovLy8KLy8vIFVubGlrZSB0aGUgSlNPTiBjb2RlYywgdGhpcyBzZXJpYWxpemF0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIHN0cmVhbWVkLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwoKaW1wb3J0ICdzcmMvYmluYXJ5L3NpbmsuZGFydCc7CmltcG9ydCAnc3JjL2JpbmFyeS9zb3VyY2UuZGFydCc7CmltcG9ydCAnaW5mby5kYXJ0JzsKCnZvaWQgZW5jb2RlKEFsbEluZm8gaW5mbywgU2luazxMaXN0PGludD4+IHNpbmspIHsKICBuZXcgQmluYXJ5UHJpbnRlcihuZXcgQmluYXJ5U2luayhzaW5rKSkudmlzaXRBbGwoaW5mbyk7Cn0KCkFsbEluZm8gZGVjb2RlKExpc3Q8aW50PiBkYXRhKSB7CiAgcmV0dXJuIG5ldyBCaW5hcnlSZWFkZXIobmV3IEJpbmFyeVNvdXJjZShkYXRhKSkucmVhZEFsbCgpOwp9CgpjbGFzcyBCaW5hcnlQcmludGVyIGltcGxlbWVudHMgSW5mb1Zpc2l0b3I8dm9pZD4gewogIGZpbmFsIEJpbmFyeVNpbmsgc2luazsKCiAgQmluYXJ5UHJpbnRlcih0aGlzLnNpbmspOwoKICB2b2lkIHdyaXRlRGF0ZShEYXRlVGltZSBkYXRlKSB7CiAgICBzaW5rLndyaXRlU3RyaW5nKGRhdGUudG9Jc284NjAxU3RyaW5nKCkpOwogIH0KCiAgdm9pZCB3cml0ZUR1cmF0aW9uKER1cmF0aW9uIGR1cmF0aW9uKSB7CiAgICBzaW5rLndyaXRlSW50KGR1cmF0aW9uLmluTWljcm9zZWNvbmRzKTsKICB9CgogIHZvaWQgd3JpdGVJbmZvV2l0aEtpbmQoSW5mbyBpbmZvKSB7CiAgICBzaW5rLndyaXRlRW51bShpbmZvLmtpbmQpOwogICAgaW5mby5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHZpc2l0QWxsKEFsbEluZm8gaW5mbykgewogICAgc2luay53cml0ZUludChpbmZvLnZlcnNpb24pOwogICAgc2luay53cml0ZUludChpbmZvLm1pbm9yVmVyc2lvbik7CiAgICBzaW5rLndyaXRlTGlzdChpbmZvLmxpYnJhcmllcywgdmlzaXRMaWJyYXJ5KTsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IHN5bnRoZXNpemUgdGhlIGZvbGxvd2luZyBsaXN0cyBpbnN0ZWFkIG9mIHNlcmlhbGl6aW5nIHRoZQogICAgLy8gdmFsdWVzIGFnYWluLgogICAgc2luay53cml0ZUxpc3QoaW5mby5jbGFzc2VzLCB2aXNpdENsYXNzKTsKICAgIHNpbmsud3JpdGVMaXN0KGluZm8uZnVuY3Rpb25zLCB2aXNpdEZ1bmN0aW9uKTsKICAgIHNpbmsud3JpdGVMaXN0KGluZm8udHlwZWRlZnMsIHZpc2l0VHlwZWRlZik7CiAgICBzaW5rLndyaXRlTGlzdChpbmZvLmZpZWxkcywgdmlzaXRGaWVsZCk7CiAgICBzaW5rLndyaXRlTGlzdChpbmZvLmNvbnN0YW50cywgdmlzaXRDb25zdGFudCk7CiAgICBzaW5rLndyaXRlTGlzdChpbmZvLmNsb3N1cmVzLCB2aXNpdENsb3N1cmUpOwoKICAgIHZvaWQgd3JpdGVEZXBlbmRlbmNpZXMoQ29kZUluZm8gaW5mbykgewogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLnVzZXMsIF93cml0ZURlcGVuZGVuY3lJbmZvKTsKICAgIH0KCiAgICBpbmZvLmZpZWxkcy5mb3JFYWNoKHdyaXRlRGVwZW5kZW5jaWVzKTsKICAgIGluZm8uZnVuY3Rpb25zLmZvckVhY2god3JpdGVEZXBlbmRlbmNpZXMpOwoKICAgIHNpbmsud3JpdGVJbnQoaW5mby5kZXBlbmRlbmNpZXMubGVuZ3RoKTsKICAgIGluZm8uZGVwZW5kZW5jaWVzLmZvckVhY2goKEluZm8ga2V5LCBMaXN0PEluZm8+IHZhbHVlcykgewogICAgICB3cml0ZUluZm9XaXRoS2luZChrZXkpOwogICAgICBzaW5rLndyaXRlTGlzdCh2YWx1ZXMsIHdyaXRlSW5mb1dpdGhLaW5kKTsKICAgIH0pOwogICAgc2luay53cml0ZUxpc3QoaW5mby5vdXRwdXRVbml0cywgdmlzaXRPdXRwdXQpOwogICAgc2luay53cml0ZVN0cmluZyhqc29uRW5jb2RlKGluZm8uZGVmZXJyZWRGaWxlcykpOwogICAgdmlzaXRQcm9ncmFtKGluZm8ucHJvZ3JhbSk7CiAgICBzaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIHZpc2l0UHJvZ3JhbShQcm9ncmFtSW5mbyBpbmZvKSB7CiAgICB2aXNpdEZ1bmN0aW9uKGluZm8uZW50cnlwb2ludCk7CiAgICBzaW5rLndyaXRlSW50KGluZm8uc2l6ZSk7CiAgICBzaW5rLndyaXRlU3RyaW5nT3JOdWxsKGluZm8uZGFydDJqc1ZlcnNpb24pOwogICAgd3JpdGVEYXRlKGluZm8uY29tcGlsYXRpb25Nb21lbnQpOwogICAgd3JpdGVEdXJhdGlvbihpbmZvLmNvbXBpbGF0aW9uRHVyYXRpb24pOwogICAgLy8gTm90ZTogd2UgZG9uJ3QgcmVjb3JkIHRoZSAndG9Kc29uRHVyYXRpb24nIGZpZWxkLiBDb25zaWRlciBkZWxldGluZyBpdD8KICAgIHdyaXRlRHVyYXRpb24oaW5mby5kdW1wSW5mb0R1cmF0aW9uKTsKICAgIHNpbmsud3JpdGVCb29sKGluZm8ubm9TdWNoTWV0aG9kRW5hYmxlZCk7CiAgICBzaW5rLndyaXRlQm9vbChpbmZvLmlzUnVudGltZVR5cGVVc2VkKTsKICAgIHNpbmsud3JpdGVCb29sKGluZm8uaXNJc29sYXRlSW5Vc2UpOwogICAgc2luay53cml0ZUJvb2woaW5mby5pc0Z1bmN0aW9uQXBwbHlVc2VkKTsKICAgIHNpbmsud3JpdGVCb29sKGluZm8uaXNNaXJyb3JzVXNlZCk7CiAgICBzaW5rLndyaXRlQm9vbChpbmZvLm1pbmlmaWVkKTsKICB9CgogIHZvaWQgX3Zpc2l0QmFzaWNJbmZvKEJhc2ljSW5mbyBpbmZvKSB7CiAgICBzaW5rLndyaXRlU3RyaW5nT3JOdWxsKGluZm8ubmFtZSk7CiAgICBzaW5rLndyaXRlSW50KGluZm8uc2l6ZSk7CiAgICBzaW5rLndyaXRlU3RyaW5nT3JOdWxsKGluZm8uY292ZXJhZ2VJZCk7CiAgICBfd3JpdGVPdXRwdXRPck51bGwoaW5mby5vdXRwdXRVbml0KTsKICAgIC8vIE5vdGU6IHBhcmVudC1wb2ludGVycyBhcmUgbm90IHNlcmlhbGl6ZWQsIHRoZXkgZ2V0IGRlZHVjZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbi4KICB9CgogIHZvaWQgdmlzaXRMaWJyYXJ5KExpYnJhcnlJbmZvIGxpYnJhcnkpIHsKICAgIHNpbmsud3JpdGVDYWNoZWQobGlicmFyeSwgKExpYnJhcnlJbmZvIGluZm8pIHsKICAgICAgc2luay53cml0ZVVyaShpbmZvLnVyaSk7CiAgICAgIF92aXNpdEJhc2ljSW5mbyhpbmZvKTsKICAgICAgc2luay53cml0ZUxpc3QoaW5mby50b3BMZXZlbEZ1bmN0aW9ucywgdmlzaXRGdW5jdGlvbik7CiAgICAgIHNpbmsud3JpdGVMaXN0KGluZm8udG9wTGV2ZWxWYXJpYWJsZXMsIHZpc2l0RmllbGQpOwogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLmNsYXNzZXMsIHZpc2l0Q2xhc3MpOwogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLnR5cGVkZWZzLCB2aXNpdFR5cGVkZWYpOwogICAgfSk7CiAgfQoKICB2b2lkIHZpc2l0Q2xhc3MoQ2xhc3NJbmZvIGNscykgewogICAgc2luay53cml0ZUNhY2hlZChjbHMsIChDbGFzc0luZm8gaW5mbykgewogICAgICBfdmlzaXRCYXNpY0luZm8oaW5mbyk7CiAgICAgIHNpbmsud3JpdGVCb29sKGluZm8uaXNBYnN0cmFjdCk7CiAgICAgIHNpbmsud3JpdGVMaXN0KGluZm8uZmllbGRzLCB2aXNpdEZpZWxkKTsKICAgICAgc2luay53cml0ZUxpc3QoaW5mby5mdW5jdGlvbnMsIHZpc2l0RnVuY3Rpb24pOwogICAgfSk7CiAgfQoKICB2b2lkIHZpc2l0RmllbGQoRmllbGRJbmZvIGZpZWxkKSB7CiAgICBzaW5rLndyaXRlQ2FjaGVkKGZpZWxkLCAoRmllbGRJbmZvIGluZm8pIHsKICAgICAgX3Zpc2l0QmFzaWNJbmZvKGluZm8pOwogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLmNsb3N1cmVzLCB2aXNpdENsb3N1cmUpOwogICAgICBzaW5rLndyaXRlU3RyaW5nKGluZm8uaW5mZXJyZWRUeXBlKTsKICAgICAgc2luay53cml0ZUxpc3QoaW5mby5jb2RlLCBfdmlzaXRDb2RlU3Bhbik7CiAgICAgIHNpbmsud3JpdGVTdHJpbmcoaW5mby50eXBlKTsKICAgICAgc2luay53cml0ZUJvb2woaW5mby5pc0NvbnN0KTsKICAgICAgaWYgKGluZm8uaXNDb25zdCkgewogICAgICAgIF93cml0ZUNvbnN0YW50T3JOdWxsKGluZm8uaW5pdGlhbGl6ZXIpOwogICAgICB9CiAgICB9KTsKICB9CgogIF92aXNpdENvZGVTcGFuKENvZGVTcGFuIGNvZGUpIHsKICAgIHNpbmsud3JpdGVJbnRPck51bGwoY29kZS5zdGFydCk7CiAgICBzaW5rLndyaXRlSW50T3JOdWxsKGNvZGUuZW5kKTsKICAgIHNpbmsud3JpdGVTdHJpbmdPck51bGwoY29kZS50ZXh0KTsKICB9CgogIHZvaWQgX3dyaXRlQ29uc3RhbnRPck51bGwoQ29uc3RhbnRJbmZvIGluZm8pIHsKICAgIHNpbmsud3JpdGVCb29sKGluZm8gIT0gbnVsbCk7CiAgICBpZiAoaW5mbyAhPSBudWxsKSB7CiAgICAgIHZpc2l0Q29uc3RhbnQoaW5mbyk7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0Q29uc3RhbnQoQ29uc3RhbnRJbmZvIGNvbnN0YW50KSB7CiAgICBzaW5rLndyaXRlQ2FjaGVkKGNvbnN0YW50LCAoQ29uc3RhbnRJbmZvIGluZm8pIHsKICAgICAgX3Zpc2l0QmFzaWNJbmZvKGluZm8pOwogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLmNvZGUsIF92aXNpdENvZGVTcGFuKTsKICAgIH0pOwogIH0KCiAgdm9pZCBfdmlzaXRGdW5jdGlvbk1vZGlmaWVycyhGdW5jdGlvbk1vZGlmaWVycyBtb2RzKSB7CiAgICBpbnQgdmFsdWUgPSAwOwogICAgaWYgKG1vZHMuaXNTdGF0aWMpIHZhbHVlIHw9IF9zdGF0aWNNYXNrOwogICAgaWYgKG1vZHMuaXNDb25zdCkgdmFsdWUgfD0gX2NvbnN0TWFzazsKICAgIGlmIChtb2RzLmlzRmFjdG9yeSkgdmFsdWUgfD0gX2ZhY3RvcnlNYXNrOwogICAgaWYgKG1vZHMuaXNFeHRlcm5hbCkgdmFsdWUgfD0gX2V4dGVybmFsTWFzazsKICAgIHNpbmsud3JpdGVJbnQodmFsdWUpOwogIH0KCiAgdm9pZCBfdmlzaXRQYXJhbWV0ZXJJbmZvKFBhcmFtZXRlckluZm8gaW5mbykgewogICAgc2luay53cml0ZVN0cmluZyhpbmZvLm5hbWUpOwogICAgc2luay53cml0ZVN0cmluZyhpbmZvLnR5cGUpOwogICAgc2luay53cml0ZVN0cmluZyhpbmZvLmRlY2xhcmVkVHlwZSk7CiAgfQoKICB2b2lkIHZpc2l0RnVuY3Rpb24oRnVuY3Rpb25JbmZvIGZ1bmN0aW9uKSB7CiAgICBzaW5rLndyaXRlQ2FjaGVkKGZ1bmN0aW9uLCAoRnVuY3Rpb25JbmZvIGluZm8pIHsKICAgICAgX3Zpc2l0QmFzaWNJbmZvKGluZm8pOwogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLmNsb3N1cmVzLCB2aXNpdENsb3N1cmUpOwogICAgICBfdmlzaXRGdW5jdGlvbk1vZGlmaWVycyhpbmZvLm1vZGlmaWVycyk7CiAgICAgIHNpbmsud3JpdGVTdHJpbmcoaW5mby5yZXR1cm5UeXBlKTsKICAgICAgc2luay53cml0ZVN0cmluZyhpbmZvLmluZmVycmVkUmV0dXJuVHlwZSk7CiAgICAgIHNpbmsud3JpdGVMaXN0KGluZm8ucGFyYW1ldGVycywgX3Zpc2l0UGFyYW1ldGVySW5mbyk7CiAgICAgIHNpbmsud3JpdGVTdHJpbmcoaW5mby5zaWRlRWZmZWN0cyk7CiAgICAgIHNpbmsud3JpdGVJbnRPck51bGwoaW5mby5pbmxpbmVkQ291bnQpOwogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLmNvZGUsIF92aXNpdENvZGVTcGFuKTsKICAgICAgc2luay53cml0ZVN0cmluZyhpbmZvLnR5cGUpOwogICAgfSk7CiAgfQoKICB2b2lkIF93cml0ZURlcGVuZGVuY3lJbmZvKERlcGVuZGVuY3lJbmZvIGluZm8pIHsKICAgIHdyaXRlSW5mb1dpdGhLaW5kKGluZm8udGFyZ2V0KTsKICAgIHNpbmsud3JpdGVTdHJpbmdPck51bGwoaW5mby5tYXNrKTsKICB9CgogIHZvaWQgdmlzaXRDbG9zdXJlKENsb3N1cmVJbmZvIGNsb3N1cmUpIHsKICAgIHNpbmsud3JpdGVDYWNoZWQoY2xvc3VyZSwgKENsb3N1cmVJbmZvIGluZm8pIHsKICAgICAgX3Zpc2l0QmFzaWNJbmZvKGluZm8pOwogICAgICB2aXNpdEZ1bmN0aW9uKGluZm8uZnVuY3Rpb24pOwogICAgfSk7CiAgfQoKICB2b2lkIHZpc2l0VHlwZWRlZihUeXBlZGVmSW5mbyB0eXBlZGVmKSB7CiAgICBzaW5rLndyaXRlQ2FjaGVkKHR5cGVkZWYsIChUeXBlZGVmSW5mbyBpbmZvKSB7CiAgICAgIF92aXNpdEJhc2ljSW5mbyhpbmZvKTsKICAgICAgc2luay53cml0ZVN0cmluZyhpbmZvLnR5cGUpOwogICAgfSk7CiAgfQoKICB2b2lkIF93cml0ZU91dHB1dE9yTnVsbChPdXRwdXRVbml0SW5mbyBpbmZvKSB7CiAgICBzaW5rLndyaXRlQm9vbChpbmZvICE9IG51bGwpOwogICAgaWYgKGluZm8gIT0gbnVsbCkgewogICAgICB2aXNpdE91dHB1dChpbmZvKTsKICAgIH0KICB9CgogIHZvaWQgdmlzaXRPdXRwdXQoT3V0cHV0VW5pdEluZm8gb3V0cHV0KSB7CiAgICBzaW5rLndyaXRlQ2FjaGVkKG91dHB1dCwgKE91dHB1dFVuaXRJbmZvIGluZm8pIHsKICAgICAgX3Zpc2l0QmFzaWNJbmZvKGluZm8pOwogICAgICBzaW5rLndyaXRlU3RyaW5nT3JOdWxsKGluZm8uZmlsZW5hbWUpOwogICAgICBzaW5rLndyaXRlTGlzdChpbmZvLmltcG9ydHMsIHNpbmsud3JpdGVTdHJpbmcpOwogICAgfSk7CiAgfQp9CgpjbGFzcyBCaW5hcnlSZWFkZXIgewogIGZpbmFsIEJpbmFyeVNvdXJjZSBzb3VyY2U7CiAgQmluYXJ5UmVhZGVyKHRoaXMuc291cmNlKTsKCiAgRGF0ZVRpbWUgcmVhZERhdGUoKSB7CiAgICByZXR1cm4gRGF0ZVRpbWUucGFyc2Uoc291cmNlLnJlYWRTdHJpbmcoKSk7CiAgfQoKICBEdXJhdGlvbiByZWFkRHVyYXRpb24oKSB7CiAgICByZXR1cm4gbmV3IER1cmF0aW9uKG1pY3Jvc2Vjb25kczogc291cmNlLnJlYWRJbnQoKSk7CiAgfQoKICBJbmZvIHJlYWRJbmZvV2l0aEtpbmQoKSB7CiAgICBJbmZvS2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKEluZm9LaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBJbmZvS2luZC5saWJyYXJ5OgogICAgICAgIHJldHVybiByZWFkTGlicmFyeSgpOwogICAgICBjYXNlIEluZm9LaW5kLmNsYXp6OgogICAgICAgIHJldHVybiByZWFkQ2xhc3MoKTsKICAgICAgY2FzZSBJbmZvS2luZC5mdW5jdGlvbjoKICAgICAgICByZXR1cm4gcmVhZEZ1bmN0aW9uKCk7CiAgICAgIGNhc2UgSW5mb0tpbmQuZmllbGQ6CiAgICAgICAgcmV0dXJuIHJlYWRGaWVsZCgpOwogICAgICBjYXNlIEluZm9LaW5kLmNvbnN0YW50OgogICAgICAgIHJldHVybiByZWFkQ29uc3RhbnQoKTsKICAgICAgY2FzZSBJbmZvS2luZC5vdXRwdXRVbml0OgogICAgICAgIHJldHVybiByZWFkT3V0cHV0KCk7CiAgICAgIGNhc2UgSW5mb0tpbmQudHlwZWRlZjoKICAgICAgICByZXR1cm4gcmVhZFR5cGVkZWYoKTsKICAgICAgY2FzZSBJbmZvS2luZC5jbG9zdXJlOgogICAgICAgIHJldHVybiByZWFkQ2xvc3VyZSgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBBbGxJbmZvIHJlYWRBbGwoKSB7CiAgICB2YXIgaW5mbyA9IG5ldyBBbGxJbmZvKCk7CiAgICBpbnQgdmVyc2lvbiA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBpbnQgbWlub3JWZXJzaW9uID0gc291cmNlLnJlYWRJbnQoKTsKICAgIGlmIChpbmZvLnZlcnNpb24gIT0gdmVyc2lvbiB8fCBpbmZvLm1pbm9yVmVyc2lvbiAhPSBtaW5vclZlcnNpb24pIHsKICAgICAgcHJpbnQoIndhcm5pbmc6IGRhdGEgd2FzIGVuY29kZWQgd2l0aCBmb3JtYXQgdmVyc2lvbiAiCiAgICAgICAgICAiJHZlcnNpb24uJG1pbm9yVmVyc2lvbiwgYnV0IGRlY29kZWQgd2l0aCAiCiAgICAgICAgICAiJHtpbmZvLnZlcnNpb259LiR7aW5mby5taW5vclZlcnNpb259Iik7CiAgICB9CiAgICBpbmZvLmxpYnJhcmllcyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkTGlicmFyeSk7CiAgICBpbmZvLmNsYXNzZXMgPSBzb3VyY2UucmVhZExpc3QocmVhZENsYXNzKTsKICAgIGluZm8uZnVuY3Rpb25zID0gc291cmNlLnJlYWRMaXN0KHJlYWRGdW5jdGlvbik7CiAgICBpbmZvLnR5cGVkZWZzID0gc291cmNlLnJlYWRMaXN0KHJlYWRUeXBlZGVmKTsKICAgIGluZm8uZmllbGRzID0gc291cmNlLnJlYWRMaXN0KHJlYWRGaWVsZCk7CiAgICBpbmZvLmNvbnN0YW50cyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkQ29uc3RhbnQpOwogICAgaW5mby5jbG9zdXJlcyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkQ2xvc3VyZSk7CgogICAgdm9pZCByZWFkRGVwZW5kZW5jaWVzKENvZGVJbmZvIGluZm8pIHsKICAgICAgaW5mby51c2VzID0gc291cmNlLnJlYWRMaXN0KF9yZWFkRGVwZW5kZW5jeUluZm8pOwogICAgfQoKICAgIGluZm8uZmllbGRzLmZvckVhY2gocmVhZERlcGVuZGVuY2llcyk7CiAgICBpbmZvLmZ1bmN0aW9ucy5mb3JFYWNoKHJlYWREZXBlbmRlbmNpZXMpOwoKICAgIGludCBkZXBlbmRlbmNpZXNUb3RhbCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICB3aGlsZSAoZGVwZW5kZW5jaWVzVG90YWwgPiAwKSB7CiAgICAgIEluZm8ga2V5ID0gcmVhZEluZm9XaXRoS2luZCgpOwogICAgICBMaXN0PEluZm8+IHZhbHVlcyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkSW5mb1dpdGhLaW5kKTsKICAgICAgaW5mby5kZXBlbmRlbmNpZXNba2V5XSA9IHZhbHVlczsKICAgICAgZGVwZW5kZW5jaWVzVG90YWwtLTsKICAgIH0KCiAgICBpbmZvLm91dHB1dFVuaXRzID0gc291cmNlLnJlYWRMaXN0KHJlYWRPdXRwdXQpOwoKICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIGR5bmFtaWM+PiBtYXAgPQogICAgICAgIGpzb25EZWNvZGUoc291cmNlLnJlYWRTdHJpbmcoKSkuY2FzdDxTdHJpbmcsIE1hcDxTdHJpbmcsIGR5bmFtaWM+PigpOwogICAgZm9yIChmaW5hbCBsaWJyYXJ5IGluIG1hcC52YWx1ZXMpIHsKICAgICAgaWYgKGxpYnJhcnlbJ2ltcG9ydHMnXSAhPSBudWxsKSB7CiAgICAgICAgLy8gVGhlIGltcG9ydE1hcCBuZWVkcyB0byBiZSB0eXBlZCBhcyA8U3RyaW5nLCBMaXN0PFN0cmluZz4+LCBidXQgdGhlCiAgICAgICAgLy8ganNvbiBwYXJzZXIgcHJvZHVjZXMgPFN0cmluZywgZHluYW1pYz4uCiAgICAgICAgZmluYWwgaW1wb3J0TWFwID0gbGlicmFyeVsnaW1wb3J0cyddIGFzIE1hcDxTdHJpbmcsIGR5bmFtaWM+OwogICAgICAgIGltcG9ydE1hcC5mb3JFYWNoKChwcmVmaXgsIGZpbGVzKSB7CiAgICAgICAgICBpbXBvcnRNYXBbcHJlZml4XSA9IChmaWxlcyBhcyBMaXN0PGR5bmFtaWM+KS5jYXN0PFN0cmluZz4oKTsKICAgICAgICB9KTsKICAgICAgICBsaWJyYXJ5WydpbXBvcnRzJ10gPSBpbXBvcnRNYXAuY2FzdDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKICAgICAgfQogICAgfQogICAgaW5mby5kZWZlcnJlZEZpbGVzID0gbWFwOwogICAgaW5mby5wcm9ncmFtID0gcmVhZFByb2dyYW0oKTsKICAgIHJldHVybiBpbmZvOwogIH0KCiAgUHJvZ3JhbUluZm8gcmVhZFByb2dyYW0oKSB7CiAgICB2YXIgaW5mbyA9IG5ldyBQcm9ncmFtSW5mbygpOwogICAgaW5mby5lbnRyeXBvaW50ID0gcmVhZEZ1bmN0aW9uKCk7CiAgICBpbmZvLnNpemUgPSBzb3VyY2UucmVhZEludCgpOwogICAgaW5mby5kYXJ0MmpzVmVyc2lvbiA9IHNvdXJjZS5yZWFkU3RyaW5nT3JOdWxsKCk7CiAgICBpbmZvLmNvbXBpbGF0aW9uTW9tZW50ID0gcmVhZERhdGUoKTsKICAgIGluZm8uY29tcGlsYXRpb25EdXJhdGlvbiA9IHJlYWREdXJhdGlvbigpOwogICAgaW5mby50b0pzb25EdXJhdGlvbiA9IG5ldyBEdXJhdGlvbihtaWNyb3NlY29uZHM6IDApOwogICAgaW5mby5kdW1wSW5mb0R1cmF0aW9uID0gcmVhZER1cmF0aW9uKCk7CiAgICBpbmZvLm5vU3VjaE1ldGhvZEVuYWJsZWQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGluZm8uaXNSdW50aW1lVHlwZVVzZWQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGluZm8uaXNJc29sYXRlSW5Vc2UgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGluZm8uaXNGdW5jdGlvbkFwcGx5VXNlZCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgaW5mby5pc01pcnJvcnNVc2VkID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBpbmZvLm1pbmlmaWVkID0gc291cmNlLnJlYWRCb29sKCk7CiAgICByZXR1cm4gaW5mbzsKICB9CgogIHZvaWQgX3JlYWRCYXNpY0luZm8oQmFzaWNJbmZvIGluZm8pIHsKICAgIGluZm8ubmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nT3JOdWxsKCk7CiAgICBpbmZvLnNpemUgPSBzb3VyY2UucmVhZEludCgpOwogICAgaW5mby5jb3ZlcmFnZUlkID0gc291cmNlLnJlYWRTdHJpbmdPck51bGwoKTsKICAgIGluZm8ub3V0cHV0VW5pdCA9IF9yZWFkT3V0cHV0T3JOdWxsKCk7CiAgICAvLyBOb3RlOiBwYXJlbnQgcG9pbnRlcnMgYXJlIGFkZGVkIHdoZW4gZGVzZXJpYWxpemluZyBwYXJlbnQgbm9kZXMuCiAgfQoKICBMaWJyYXJ5SW5mbyByZWFkTGlicmFyeSgpID0+IHNvdXJjZS5yZWFkQ2FjaGVkPExpYnJhcnlJbmZvPigoKSB7CiAgICAgICAgTGlicmFyeUluZm8gaW5mbyA9IG5ldyBMaWJyYXJ5SW5mby5pbnRlcm5hbCgpOwogICAgICAgIGluZm8udXJpID0gc291cmNlLnJlYWRVcmkoKTsKICAgICAgICBfcmVhZEJhc2ljSW5mbyhpbmZvKTsKICAgICAgICBpbmZvLnRvcExldmVsRnVuY3Rpb25zID0gc291cmNlLnJlYWRMaXN0KHJlYWRGdW5jdGlvbik7CiAgICAgICAgaW5mby50b3BMZXZlbFZhcmlhYmxlcyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkRmllbGQpOwogICAgICAgIGluZm8uY2xhc3NlcyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkQ2xhc3MpOwogICAgICAgIGluZm8udHlwZWRlZnMgPSBzb3VyY2UucmVhZExpc3QocmVhZFR5cGVkZWYpOwoKICAgICAgICBzZXRQYXJlbnQoQmFzaWNJbmZvIGNoaWxkKSA9PiBjaGlsZC5wYXJlbnQgPSBpbmZvOwogICAgICAgIGluZm8udG9wTGV2ZWxGdW5jdGlvbnMuZm9yRWFjaChzZXRQYXJlbnQpOwogICAgICAgIGluZm8udG9wTGV2ZWxWYXJpYWJsZXMuZm9yRWFjaChzZXRQYXJlbnQpOwogICAgICAgIGluZm8uY2xhc3Nlcy5mb3JFYWNoKHNldFBhcmVudCk7CiAgICAgICAgaW5mby50eXBlZGVmcy5mb3JFYWNoKHNldFBhcmVudCk7CiAgICAgICAgcmV0dXJuIGluZm87CiAgICAgIH0pOwoKICBDbGFzc0luZm8gcmVhZENsYXNzKCkgPT4gc291cmNlLnJlYWRDYWNoZWQ8Q2xhc3NJbmZvPigoKSB7CiAgICAgICAgQ2xhc3NJbmZvIGluZm8gPSBuZXcgQ2xhc3NJbmZvLmludGVybmFsKCk7CiAgICAgICAgX3JlYWRCYXNpY0luZm8oaW5mbyk7CiAgICAgICAgaW5mby5pc0Fic3RyYWN0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICAgICAgaW5mby5maWVsZHMgPSBzb3VyY2UucmVhZExpc3QocmVhZEZpZWxkKTsKICAgICAgICBpbmZvLmZ1bmN0aW9ucyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkRnVuY3Rpb24pOwoKICAgICAgICBzZXRQYXJlbnQoQmFzaWNJbmZvIGNoaWxkKSA9PiBjaGlsZC5wYXJlbnQgPSBpbmZvOwogICAgICAgIGluZm8uZmllbGRzLmZvckVhY2goc2V0UGFyZW50KTsKICAgICAgICBpbmZvLmZ1bmN0aW9ucy5mb3JFYWNoKHNldFBhcmVudCk7CiAgICAgICAgcmV0dXJuIGluZm87CiAgICAgIH0pOwoKICBGaWVsZEluZm8gcmVhZEZpZWxkKCkgPT4gc291cmNlLnJlYWRDYWNoZWQ8RmllbGRJbmZvPigoKSB7CiAgICAgICAgRmllbGRJbmZvIGluZm8gPSBuZXcgRmllbGRJbmZvLmludGVybmFsKCk7CiAgICAgICAgX3JlYWRCYXNpY0luZm8oaW5mbyk7CiAgICAgICAgaW5mby5jbG9zdXJlcyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkQ2xvc3VyZSk7CiAgICAgICAgaW5mby5pbmZlcnJlZFR5cGUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgIGluZm8uY29kZSA9IHNvdXJjZS5yZWFkTGlzdChfcmVhZENvZGVTcGFuKTsKICAgICAgICBpbmZvLnR5cGUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgIGluZm8uaXNDb25zdCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgICAgIGlmIChpbmZvLmlzQ29uc3QpIHsKICAgICAgICAgIGluZm8uaW5pdGlhbGl6ZXIgPSBfcmVhZENvbnN0YW50T3JOdWxsKCk7CiAgICAgICAgfQogICAgICAgIGluZm8uY2xvc3VyZXMuZm9yRWFjaCgoYykgPT4gYy5wYXJlbnQgPSBpbmZvKTsKICAgICAgICByZXR1cm4gaW5mbzsKICAgICAgfSk7CgogIENvZGVTcGFuIF9yZWFkQ29kZVNwYW4oKSB7CiAgICByZXR1cm4gbmV3IENvZGVTcGFuKCkKICAgICAgLi5zdGFydCA9IHNvdXJjZS5yZWFkSW50T3JOdWxsKCkKICAgICAgLi5lbmQgPSBzb3VyY2UucmVhZEludE9yTnVsbCgpCiAgICAgIC4udGV4dCA9IHNvdXJjZS5yZWFkU3RyaW5nT3JOdWxsKCk7CiAgfQoKICBDb25zdGFudEluZm8gX3JlYWRDb25zdGFudE9yTnVsbCgpIHsKICAgIGJvb2wgaGFzT3V0cHV0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBpZiAoaGFzT3V0cHV0KSByZXR1cm4gcmVhZENvbnN0YW50KCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIENvbnN0YW50SW5mbyByZWFkQ29uc3RhbnQoKSA9PiBzb3VyY2UucmVhZENhY2hlZDxDb25zdGFudEluZm8+KCgpIHsKICAgICAgICBDb25zdGFudEluZm8gaW5mbyA9IG5ldyBDb25zdGFudEluZm8uaW50ZXJuYWwoKTsKICAgICAgICBfcmVhZEJhc2ljSW5mbyhpbmZvKTsKICAgICAgICBpbmZvLmNvZGUgPSBzb3VyY2UucmVhZExpc3QoX3JlYWRDb2RlU3Bhbik7CiAgICAgICAgcmV0dXJuIGluZm87CiAgICAgIH0pOwoKICBGdW5jdGlvbk1vZGlmaWVycyBfcmVhZEZ1bmN0aW9uTW9kaWZpZXJzKCkgewogICAgaW50IHZhbHVlID0gc291cmNlLnJlYWRJbnQoKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25Nb2RpZmllcnMoCiAgICAgICAgaXNTdGF0aWM6IHZhbHVlICYgX3N0YXRpY01hc2sgIT0gMCwKICAgICAgICBpc0NvbnN0OiB2YWx1ZSAmIF9jb25zdE1hc2sgIT0gMCwKICAgICAgICBpc0ZhY3Rvcnk6IHZhbHVlICYgX2ZhY3RvcnlNYXNrICE9IDAsCiAgICAgICAgaXNFeHRlcm5hbDogdmFsdWUgJiBfZXh0ZXJuYWxNYXNrICE9IDApOwogIH0KCiAgUGFyYW1ldGVySW5mbyBfcmVhZFBhcmFtZXRlckluZm8oKSB7CiAgICByZXR1cm4gbmV3IFBhcmFtZXRlckluZm8oCiAgICAgICAgc291cmNlLnJlYWRTdHJpbmcoKSwgc291cmNlLnJlYWRTdHJpbmcoKSwgc291cmNlLnJlYWRTdHJpbmcoKSk7CiAgfQoKICBGdW5jdGlvbkluZm8gcmVhZEZ1bmN0aW9uKCkgPT4gc291cmNlLnJlYWRDYWNoZWQ8RnVuY3Rpb25JbmZvPigoKSB7CiAgICAgICAgRnVuY3Rpb25JbmZvIGluZm8gPSBuZXcgRnVuY3Rpb25JbmZvLmludGVybmFsKCk7CiAgICAgICAgX3JlYWRCYXNpY0luZm8oaW5mbyk7CiAgICAgICAgaW5mby5jbG9zdXJlcyA9IHNvdXJjZS5yZWFkTGlzdChyZWFkQ2xvc3VyZSk7CiAgICAgICAgaW5mby5tb2RpZmllcnMgPSBfcmVhZEZ1bmN0aW9uTW9kaWZpZXJzKCk7CiAgICAgICAgaW5mby5yZXR1cm5UeXBlID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgICBpbmZvLmluZmVycmVkUmV0dXJuVHlwZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgICAgaW5mby5wYXJhbWV0ZXJzID0gc291cmNlLnJlYWRMaXN0KF9yZWFkUGFyYW1ldGVySW5mbyk7CiAgICAgICAgaW5mby5zaWRlRWZmZWN0cyA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgICAgaW5mby5pbmxpbmVkQ291bnQgPSBzb3VyY2UucmVhZEludE9yTnVsbCgpOwogICAgICAgIGluZm8uY29kZSA9IHNvdXJjZS5yZWFkTGlzdChfcmVhZENvZGVTcGFuKTsKICAgICAgICBpbmZvLnR5cGUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgIGluZm8uY2xvc3VyZXMuZm9yRWFjaCgoYykgPT4gYy5wYXJlbnQgPSBpbmZvKTsKICAgICAgICByZXR1cm4gaW5mbzsKICAgICAgfSk7CgogIERlcGVuZGVuY3lJbmZvIF9yZWFkRGVwZW5kZW5jeUluZm8oKSA9PgogICAgICBuZXcgRGVwZW5kZW5jeUluZm8ocmVhZEluZm9XaXRoS2luZCgpLCBzb3VyY2UucmVhZFN0cmluZ09yTnVsbCgpKTsKCiAgQ2xvc3VyZUluZm8gcmVhZENsb3N1cmUoKSA9PiBzb3VyY2UucmVhZENhY2hlZDxDbG9zdXJlSW5mbz4oKCkgewogICAgICAgIENsb3N1cmVJbmZvIGluZm8gPSBuZXcgQ2xvc3VyZUluZm8uaW50ZXJuYWwoKTsKICAgICAgICBfcmVhZEJhc2ljSW5mbyhpbmZvKTsKICAgICAgICBpbmZvLmZ1bmN0aW9uID0gcmVhZEZ1bmN0aW9uKCk7CiAgICAgICAgaW5mby5mdW5jdGlvbi5wYXJlbnQgPSBpbmZvOwogICAgICAgIHJldHVybiBpbmZvOwogICAgICB9KTsKCiAgVHlwZWRlZkluZm8gcmVhZFR5cGVkZWYoKSA9PiBzb3VyY2UucmVhZENhY2hlZDxUeXBlZGVmSW5mbz4oKCkgewogICAgICAgIFR5cGVkZWZJbmZvIGluZm8gPSBuZXcgVHlwZWRlZkluZm8uaW50ZXJuYWwoKTsKICAgICAgICBfcmVhZEJhc2ljSW5mbyhpbmZvKTsKICAgICAgICBpbmZvLnR5cGUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICB9KTsKCiAgT3V0cHV0VW5pdEluZm8gX3JlYWRPdXRwdXRPck51bGwoKSB7CiAgICBib29sIGhhc091dHB1dCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgaWYgKGhhc091dHB1dCkgcmV0dXJuIHJlYWRPdXRwdXQoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgT3V0cHV0VW5pdEluZm8gcmVhZE91dHB1dCgpID0+IHNvdXJjZS5yZWFkQ2FjaGVkPE91dHB1dFVuaXRJbmZvPigoKSB7CiAgICAgICAgT3V0cHV0VW5pdEluZm8gaW5mbyA9IG5ldyBPdXRwdXRVbml0SW5mby5pbnRlcm5hbCgpOwogICAgICAgIF9yZWFkQmFzaWNJbmZvKGluZm8pOwogICAgICAgIGluZm8uZmlsZW5hbWUgPSBzb3VyY2UucmVhZFN0cmluZ09yTnVsbCgpOwogICAgICAgIGluZm8uaW1wb3J0cyA9IHNvdXJjZS5yZWFkTGlzdChzb3VyY2UucmVhZFN0cmluZyk7CiAgICAgICAgcmV0dXJuIGluZm87CiAgICAgIH0pOwp9Cgpjb25zdCBpbnQgX3N0YXRpY01hc2sgPSAxIDw8IDM7CmNvbnN0IGludCBfY29uc3RNYXNrID0gMSA8PCAyOwpjb25zdCBpbnQgX2ZhY3RvcnlNYXNrID0gMSA8PCAxOwpjb25zdCBpbnQgX2V4dGVybmFsTWFzayA9IDEgPDwgMDsKgcwATk48ASkESgEXAR8hFAEyOgIBIT0CATMZARwBIi4EASosBAEmHxcEASAhJjJQFS4zMS0zMQEsNwYBLC8BLT4eMQgzNiASBAEoJB4xJy1PKi4sKS4oIwQBKSceLSlaBAErMx8dPTowMwgEASMtHScvNQgEASUvHTMrMSMkGjAICAQBIiUjJwQBMSIYGwYEAS41HTEIBAE5Ey0rLzEaBAExISEpBAEuNR0zLykxPCouMSMIBAEzJCcEASszHSQIBAErMx0jCAQBMSIYGQYEASw1HS02CAQCARUdHQEYMAQBHDkEARw2FB0eGxweHxscHh8gHR0eHR4GEQQBFh4kKUg9NjMGMy80Mi40MgErOAYBKy4BLiQlPScbBgE0ASxOKChOM0YsRwxFCAYeIhEEAR4iJiI1KS85LDIwLTIsJxEEASgrIjErSAQBQzclHkA9MzYBOzMzKSoVCgE9Mx4tMjgBOygrFQoBPTMeNjE0KSocNAo3FQoBHRonJSoEAScoKhEEAUY5HjQVCgEvIiIsKi4xBAEnHkgEAUY5HjYzLzc/MDQ0KTcVCgEqSQFDNx4oJRUKAUM3HikKAScoKBEEAUg9HjM7FQoCASAfISIBLnBhY2thZ2U6ZGFydDJqc19pbmZvL2JpbmFyeV9zZXJpYWxpemF0aW9uLmRhcnQ8c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfYmFja2VuZC9maWVsZF9hbmFseXNpcy5kYXJ0wABcVi8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXR5X3V0aWxzLmRhcnQnOwppbXBvcnQgJy4uL2lyL3Njb3BlX3Zpc2l0b3IuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvZWxlbWVudHMuZGFydCcgc2hvdyBKRmllbGQ7CmltcG9ydCAnLi4vanNfbW9kZWwvanNfd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9rZXJuZWwvZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9zdHJhdGVneS5kYXJ0JzsKaW1wb3J0ICcuLi9rZXJuZWwva2VsZW1lbnRzLmRhcnQnIHNob3cgS0NsYXNzLCBLRmllbGQsIEtDb25zdHJ1Y3RvcjsKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX3dvcmxkLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL21lbWJlcl91c2FnZS5kYXJ0JzsKCi8vLyBBbGxvY2F0b3JBbmFseXNpcwovLy8KLy8vIEFuYWx5c2lzIHRvIGRldGVybWluZSBmZWF0dXJlcyBvZiB0aGUgYWxsb2NhdG9yIGZ1bmN0aW9ucy4gVGhlIGFsbG9jYXRvcgovLy8gZnVuY3Rpb24gdGFrZXMgcGFyYW1ldGVycyBmb3IgZWFjaCBmaWVsZCBpbml0aWFsaXplciBhbmQgaW5pdGlhbGl6ZXMgdGhlCi8vLyBmaWVsZHMuICBQYXJhbWV0ZXJzIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBpbml0aWFsaXplciBpcyBhbHdheXMgdGhlIHNhbWUKLy8vIGNvbnN0YW50IHZhbHVlLiAgSG93IHRoZSBhbGxvY2F0b3IgaXMgZW1pdHRlZCB3aWxsIGRldGVybWluZSB3aGF0IGtpbmQgb2YKLy8vIGNvbnN0YW50cyBjYW4gYmUgaGFuZGxlZC4gIFRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uIG9ubHkgcGVybWl0cyBgbnVsbGAuCgovLyBUT0RPKHNyYSk6IEFuYWx5c2lzIHRvIGRldGVybWluZSBmaWVsZCBvcmRlci4gQ3VycmVudCBmaWVsZCBvcmRlciBpcwovLyBlc3NlbnRpYWxseSBkZWNsYXJhdGlvbiBvcmRlciwgc3ViY2xhc3MgZmlyc3QuIFdlIGNhbiByZW9yZGVyIGZpZWxkcyBzbyB0aGF0Ci8vIGZpZWxkcyBpbml0aWFsaXplZCB3aXRoIHRoZSBzYW1lIGNvbnN0YW50IGFyZSB0b2dldGhlciB0byBhbGxvdyBjaGFpbmVkCi8vIGluaXRpYWxpemF0aW9uLiBGaWVsZHMgb2YgYSBjbGFzcyBhbmQgc3VwZXJjbGFzcyBjYW4gYmUgcmVvcmRlcmVkIHRvIGFsbG93Ci8vIGNoYWluaW5nLCBlLmcuCi8vCi8vICAgICB0aGlzLnggPSB0aGlzLnogPSBudWxsOwovLwpjbGFzcyBLRmllbGRBbmFseXNpcyB7CiAgZmluYWwgS2VybmVsVG9FbGVtZW50TWFwIF9lbGVtZW50TWFwOwoKICBmaW5hbCBNYXA8S0NsYXNzLCBDbGFzc0RhdGE+IF9jbGFzc0RhdGEgPSB7fTsKICBmaW5hbCBNYXA8S0ZpZWxkLCBTdGF0aWNGaWVsZERhdGE+IF9zdGF0aWNGaWVsZERhdGEgPSB7fTsKCiAgS0ZpZWxkQW5hbHlzaXMoS2VybmVsRnJvbnRlbmRTdHJhdGVneSBrZXJuZWxTdHJhdGVneSkKICAgICAgOiBfZWxlbWVudE1hcCA9IGtlcm5lbFN0cmF0ZWd5LmVsZW1lbnRNYXA7CgogIC8vIFJlZ2lzdGVyIGNsYXNzIGR1cmluZyByZXNvbHV0aW9uLiBVc2Ugc2ltcGxlIHN5bnRhY3RpYyBhbmFseXNpcyB0byBmaW5kCiAgLy8gbnVsbC1pbml0aWFsaXplZCBmaWVsZHMuCiAgdm9pZCByZWdpc3Rlckluc3RhbnRpYXRlZENsYXNzKEtDbGFzcyBjbGFzc18pIHsKICAgIGlyLkNsYXNzIGNsYXNzTm9kZSA9IF9lbGVtZW50TWFwLmdldENsYXNzTm9kZShjbGFzc18pOwoKICAgIExpc3Q8S0NvbnN0cnVjdG9yPiBjb25zdHJ1Y3RvcnMgPSBbXTsKICAgIE1hcDxLRmllbGQsIEFsbG9jYXRvckRhdGE+IGZpZWxkRGF0YSA9IHt9OwogICAgZm9yIChpci5GaWVsZCBmaWVsZCBpbiBjbGFzc05vZGUuZmllbGRzKSB7CiAgICAgIGlmICghZmllbGQuaXNJbnN0YW5jZU1lbWJlcikgY29udGludWU7CgogICAgICBGaWVsZEVudGl0eSBmaWVsZEVsZW1lbnQgPSBfZWxlbWVudE1hcC5nZXRGaWVsZChmaWVsZCk7CiAgICAgIGlyLkV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGZpZWxkLmluaXRpYWxpemVyOwogICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZShleHByZXNzaW9uLAogICAgICAgICAgcmVxdWlyZUNvbnN0YW50OiBmYWxzZSwgaW1wbGljaXROdWxsOiB0cnVlKTsKICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuaXNDb25zdGFudCkgewogICAgICAgIGZpZWxkRGF0YVtmaWVsZEVsZW1lbnRdID0gbmV3IEFsbG9jYXRvckRhdGEodmFsdWUpOwogICAgICB9CiAgICB9CgogICAgZm9yIChpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciBpbiBjbGFzc05vZGUuY29uc3RydWN0b3JzKSB7CiAgICAgIEtDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvckVsZW1lbnQgPSBfZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvcik7CiAgICAgIGNvbnN0cnVjdG9ycy5hZGQoY29uc3RydWN0b3JFbGVtZW50KTsKICAgICAgZm9yIChpci5Jbml0aWFsaXplciBpbml0aWFsaXplciBpbiBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMpIHsKICAgICAgICBpZiAoaW5pdGlhbGl6ZXIgaXMgaXIuRmllbGRJbml0aWFsaXplcikgewogICAgICAgICAgQWxsb2NhdG9yRGF0YSBkYXRhID0KICAgICAgICAgICAgICBmaWVsZERhdGFbX2VsZW1lbnRNYXAuZ2V0RmllbGQoaW5pdGlhbGl6ZXIuZmllbGQpXTsKICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCBpbml0aWFsaXplcnMgd2l0aCBzaWRlLWVmZmVjdHM/CgogICAgICAgICAgICAvLyBUaGUgZmllbGQgaGFzIGEgbm9uLWNvbnN0YW50IGluaXRpYWxpemVyLgogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBJbml0aWFsaXplciBpbml0aWFsaXplclZhbHVlID0gY29uc3QgSW5pdGlhbGl6ZXIuY29tcGxleCgpOwogICAgICAgICAgaXIuRXhwcmVzc2lvbiB2YWx1ZSA9IGluaXRpYWxpemVyLnZhbHVlOwogICAgICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudFZhbHVlID0gX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZSh2YWx1ZSwKICAgICAgICAgICAgICByZXF1aXJlQ29uc3RhbnQ6IGZhbHNlLCBpbXBsaWNpdE51bGw6IHRydWUpOwogICAgICAgICAgaWYgKGNvbnN0YW50VmFsdWUgIT0gbnVsbCAmJiBjb25zdGFudFZhbHVlLmlzQ29uc3RhbnQpIHsKICAgICAgICAgICAgaW5pdGlhbGl6ZXJWYWx1ZSA9IG5ldyBJbml0aWFsaXplci5kaXJlY3QoY29uc3RhbnRWYWx1ZSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIGlyLlZhcmlhYmxlR2V0KSB7CiAgICAgICAgICAgIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gdmFsdWUudmFyaWFibGU7CiAgICAgICAgICAgIGludCBwb3NpdGlvbiA9CiAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5pbmRleE9mKHBhcmFtZXRlcik7CiAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSAtMSkgewogICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgICAgICAgICAgICBjb25zdGFudFZhbHVlID0gX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZSgKICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuaW5pdGlhbGl6ZXIsCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZUNvbnN0YW50OiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdE51bGw6IHRydWUpOwogICAgICAgICAgICAgICAgaWYgKGNvbnN0YW50VmFsdWUgIT0gbnVsbCAmJiBjb25zdGFudFZhbHVlLmlzQ29uc3RhbnQpIHsKICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJWYWx1ZSA9CiAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5pdGlhbGl6ZXIucG9zaXRpb25hbChwb3NpdGlvbiwgY29uc3RhbnRWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBvc2l0aW9uID0KICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmluZGV4T2YocGFyYW1ldGVyKTsKICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gLTEpIHsKICAgICAgICAgICAgICAgIGNvbnN0YW50VmFsdWUgPSBfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKAogICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci5pbml0aWFsaXplciwKICAgICAgICAgICAgICAgICAgICByZXF1aXJlQ29uc3RhbnQ6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGltcGxpY2l0TnVsbDogdHJ1ZSk7CiAgICAgICAgICAgICAgICBpZiAoY29uc3RhbnRWYWx1ZSAhPSBudWxsICYmIGNvbnN0YW50VmFsdWUuaXNDb25zdGFudCkgewogICAgICAgICAgICAgICAgICBpbml0aWFsaXplclZhbHVlID0KICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbml0aWFsaXplci5uYW1lZChwYXJhbWV0ZXIubmFtZSwgY29uc3RhbnRWYWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBkYXRhLmluaXRpYWxpemVyc1tjb25zdHJ1Y3RvckVsZW1lbnRdID0gaW5pdGlhbGl6ZXJWYWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIF9jbGFzc0RhdGFbY2xhc3NfXSA9IG5ldyBDbGFzc0RhdGEoY29uc3RydWN0b3JzLCBmaWVsZERhdGEpOwogIH0KCiAgdm9pZCByZWdpc3RlclN0YXRpY0ZpZWxkKEtGaWVsZCBmaWVsZCwgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IGNvbXBsZXhpdHkpIHsKICAgIGlyLkZpZWxkIG5vZGUgPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJOb2RlKGZpZWxkKTsKICAgIGlyLkV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG5vZGUuaW5pdGlhbGl6ZXI7CiAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZShleHByZXNzaW9uLAogICAgICAgIHJlcXVpcmVDb25zdGFudDogbm9kZS5pc0NvbnN0LCBpbXBsaWNpdE51bGw6IHRydWUpOwogICAgaWYgKHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmlzQ29uc3RhbnQpIHsKICAgICAgdmFsdWUgPSBudWxsOwogICAgfQogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIGV2YWx1YXRpb24gb2YgY29uc3RhbnQgd2hlbiBbY29tcGxleGl0eV0KICAgIC8vIGhvbGRzIHRoZSBjb25zdGFudCBsaXRlcmFsIGZyb20gQ0ZFLgogICAgX3N0YXRpY0ZpZWxkRGF0YVtmaWVsZF0gPSBuZXcgU3RhdGljRmllbGREYXRhKHZhbHVlLCBjb21wbGV4aXR5KTsKICB9CgogIEFsbG9jYXRvckRhdGEgZ2V0QWxsb2NhdG9yRGF0YUZvclRlc3RpbmcoS0ZpZWxkIGZpZWxkKSB7CiAgICByZXR1cm4gX2NsYXNzRGF0YVtmaWVsZC5lbmNsb3NpbmdDbGFzc10uZmllbGREYXRhW2ZpZWxkXTsKICB9CgogIFN0YXRpY0ZpZWxkRGF0YSBnZXRTdGF0aWNGaWVsZERhdGFGb3JUZXN0aW5nKEtGaWVsZCBmaWVsZCkgewogICAgcmV0dXJuIF9zdGF0aWNGaWVsZERhdGFbZmllbGRdOwogIH0KfQoKY2xhc3MgQ2xhc3NEYXRhIHsKICBmaW5hbCBMaXN0PEtDb25zdHJ1Y3Rvcj4gY29uc3RydWN0b3JzOwogIGZpbmFsIE1hcDxLRmllbGQsIEFsbG9jYXRvckRhdGE+IGZpZWxkRGF0YTsKCiAgQ2xhc3NEYXRhKHRoaXMuY29uc3RydWN0b3JzLCB0aGlzLmZpZWxkRGF0YSk7Cn0KCmNsYXNzIFN0YXRpY0ZpZWxkRGF0YSB7CiAgZmluYWwgQ29uc3RhbnRWYWx1ZSBpbml0aWFsVmFsdWU7CiAgZmluYWwgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IGNvbXBsZXhpdHk7CgogIFN0YXRpY0ZpZWxkRGF0YSh0aGlzLmluaXRpYWxWYWx1ZSwgdGhpcy5jb21wbGV4aXR5KTsKCiAgYm9vbCBnZXQgaGFzRGVwZW5kZW5jaWVzID0+IGNvbXBsZXhpdHkgIT0gbnVsbCAmJiBjb21wbGV4aXR5LmZpZWxkcyAhPSBudWxsOwp9CgpjbGFzcyBBbGxvY2F0b3JEYXRhIHsKICBmaW5hbCBDb25zdGFudFZhbHVlIGluaXRpYWxWYWx1ZTsKICBmaW5hbCBNYXA8S0NvbnN0cnVjdG9yLCBJbml0aWFsaXplcj4gaW5pdGlhbGl6ZXJzID0ge307CgogIEFsbG9jYXRvckRhdGEodGhpcy5pbml0aWFsVmFsdWUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnQWxsb2NhdG9yRGF0YShpbml0aWFsVmFsdWU9JHtpbml0aWFsVmFsdWU/LnRvU3RydWN0dXJlZFRleHQoKX0sJwogICAgICAnaW5pdGlhbGl6ZXJzPSRpbml0aWFsaXplcnMpJzsKfQoKZW51bSBJbml0aWFsaXplcktpbmQgewogIGRpcmVjdCwKICBwb3NpdGlvbmFsLAogIG5hbWVkLAogIGNvbXBsZXgsCn0KCmNsYXNzIEluaXRpYWxpemVyIHsKICBmaW5hbCBJbml0aWFsaXplcktpbmQga2luZDsKICBmaW5hbCBpbnQgaW5kZXg7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgQ29uc3RhbnRWYWx1ZSB2YWx1ZTsKCiAgSW5pdGlhbGl6ZXIuZGlyZWN0KHRoaXMudmFsdWUpCiAgICAgIDoga2luZCA9IEluaXRpYWxpemVyS2luZC5kaXJlY3QsCiAgICAgICAgaW5kZXggPSBudWxsLAogICAgICAgIG5hbWUgPSBudWxsOwoKICBJbml0aWFsaXplci5wb3NpdGlvbmFsKHRoaXMuaW5kZXgsIHRoaXMudmFsdWUpCiAgICAgIDoga2luZCA9IEluaXRpYWxpemVyS2luZC5wb3NpdGlvbmFsLAogICAgICAgIG5hbWUgPSBudWxsOwoKICBJbml0aWFsaXplci5uYW1lZCh0aGlzLm5hbWUsIHRoaXMudmFsdWUpCiAgICAgIDoga2luZCA9IEluaXRpYWxpemVyS2luZC5uYW1lZCwKICAgICAgICBpbmRleCA9IG51bGw7CgogIGNvbnN0IEluaXRpYWxpemVyLmNvbXBsZXgoKQogICAgICA6IGtpbmQgPSBJbml0aWFsaXplcktpbmQuY29tcGxleCwKICAgICAgICBpbmRleCA9IG51bGwsCiAgICAgICAgbmFtZSA9IG51bGwsCiAgICAgICAgdmFsdWUgPSBudWxsOwoKICBTdHJpbmcgZ2V0IHNob3J0VGV4dCB7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBJbml0aWFsaXplcktpbmQuZGlyZWN0OgogICAgICAgIHJldHVybiB2YWx1ZS50b1N0cnVjdHVyZWRUZXh0KCk7CiAgICAgIGNhc2UgSW5pdGlhbGl6ZXJLaW5kLnBvc2l0aW9uYWw6CiAgICAgICAgcmV0dXJuICckaW5kZXg6JHt2YWx1ZS50b1N0cnVjdHVyZWRUZXh0KCl9JzsKICAgICAgY2FzZSBJbml0aWFsaXplcktpbmQubmFtZWQ6CiAgICAgICAgcmV0dXJuICckbmFtZToke3ZhbHVlLnRvU3RydWN0dXJlZFRleHQoKX0nOwogICAgICBjYXNlIEluaXRpYWxpemVyS2luZC5jb21wbGV4OgogICAgICAgIHJldHVybiAnPyc7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignVW5leHBlY3RlZCBraW5kICRraW5kJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBzaG9ydFRleHQ7Cn0KCmNsYXNzIEpGaWVsZEFuYWx5c2lzIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pGaWVsZEFuYWx5c2lzXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2ZpZWxkLWFuYWx5c2lzJzsKCiAgLy8gLS1jc3AgYW5kIC0tZmFzdC1zdGFydHVwIGhhdmUgZGlmZmVyZW50IGNvbnN0cmFpbnRzIHRvIHRoZSBnZW5lcmF0ZWQgY29kZS4KCiAgZmluYWwgTWFwPEZpZWxkRW50aXR5LCBGaWVsZEFuYWx5c2lzRGF0YT4gX2ZpZWxkRGF0YTsKCiAgSkZpZWxkQW5hbHlzaXMuXyh0aGlzLl9maWVsZERhdGEpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0pGaWVsZEFuYWx5c2lzXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IEpGaWVsZEFuYWx5c2lzLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIE1hcDxGaWVsZEVudGl0eSwgRmllbGRBbmFseXNpc0RhdGE+IGZpZWxkRGF0YSA9IHNvdXJjZS5yZWFkTWVtYmVyTWFwKAogICAgICAgIChNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PiBuZXcgRmllbGRBbmFseXNpc0RhdGEuZnJvbURhdGFTb3VyY2Uoc291cmNlKSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpGaWVsZEFuYWx5c2lzLl8oZmllbGREYXRhKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0pGaWVsZEFuYWx5c2lzXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZU1lbWJlck1hcCgKICAgICAgICBfZmllbGREYXRhLAogICAgICAgIChNZW1iZXJFbnRpdHkgbWVtYmVyLCBGaWVsZEFuYWx5c2lzRGF0YSBkYXRhKSA9PgogICAgICAgICAgICBkYXRhLndyaXRlVG9EYXRhU2luayhzaW5rKSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgZmFjdG9yeSBKRmllbGRBbmFseXNpcy5mcm9tKEtDbG9zZWRXb3JsZEltcGwgY2xvc2VkV29ybGQsIEpzVG9Gcm9udGVuZE1hcCBtYXAsCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zKSB7CiAgICBNYXA8RmllbGRFbnRpdHksIEZpZWxkQW5hbHlzaXNEYXRhPiBmaWVsZERhdGEgPSB7fTsKCiAgICBib29sIGNhbkJlRWxpZGVkKEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICAgIHJldHVybiAhY2xvc2VkV29ybGQuYW5ub3RhdGlvbnNEYXRhLmhhc05vRWxpc2lvbihmaWVsZCkgJiYKICAgICAgICAgICFjbG9zZWRXb3JsZC5uYXRpdmVEYXRhLmlzTmF0aXZlTWVtYmVyKGZpZWxkKTsKICAgIH0KCiAgICBjbG9zZWRXb3JsZC5maWVsZEFuYWx5c2lzLl9jbGFzc0RhdGEKICAgICAgICAuZm9yRWFjaCgoQ2xhc3NFbnRpdHkgY2xzLCBDbGFzc0RhdGEgY2xhc3NEYXRhKSB7CiAgICAgIGNsYXNzRGF0YS5maWVsZERhdGEuZm9yRWFjaCgoS0ZpZWxkIGtGaWVsZCwgQWxsb2NhdG9yRGF0YSBkYXRhKSB7CiAgICAgICAgSkZpZWxkIGpGaWVsZCA9IG1hcC50b0JhY2tlbmRNZW1iZXIoa0ZpZWxkKTsKICAgICAgICBpZiAoakZpZWxkID09IG51bGwpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNob3VsZCBlbGlkZWQgc3RhdGljIGZpZWxkcyBiZSByZW1vdmVkIGZyb20gdGhlCiAgICAgICAgLy8gSiBtb2RlbD8gU3RhdGljIHNldHRlcnMgbWlnaHQgc3RpbGwgYXNzaWduIHRvIHRoZW0uCgogICAgICAgIE1lbWJlclVzYWdlIG1lbWJlclVzYWdlID0gY2xvc2VkV29ybGQubGl2ZU1lbWJlclVzYWdlW2tGaWVsZF07CiAgICAgICAgaWYgKCFtZW1iZXJVc2FnZS5oYXNSZWFkKSB7CiAgICAgICAgICBpZiAoY2FuQmVFbGlkZWQoa0ZpZWxkKSkgewogICAgICAgICAgICBmaWVsZERhdGFbakZpZWxkXSA9IGNvbnN0IEZpZWxkQW5hbHlzaXNEYXRhKGlzRWxpZGVkOiB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGRhdGEuaW5pdGlhbFZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgQ29uc3RhbnRWYWx1ZSBpbml0aWFsVmFsdWU7CiAgICAgICAgICAgIGJvb2wgaXNUb29Db21wbGV4ID0gZmFsc2U7CgogICAgICAgICAgICB2b2lkIGluY2x1ZGVJbml0aWFsVmFsdWUoQ29uc3RhbnRWYWx1ZSB2YWx1ZSkgewogICAgICAgICAgICAgIGlmIChpc1Rvb0NvbXBsZXgpIHJldHVybjsKICAgICAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbFZhbHVlICE9IHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBudWxsOwogICAgICAgICAgICAgICAgaXNUb29Db21wbGV4ID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG1lbWJlclVzYWdlLmluaXRpYWxDb25zdGFudHMuZm9yRWFjaChpbmNsdWRlSW5pdGlhbFZhbHVlKTsKCiAgICAgICAgICAgIGJvb2wgaW5BbGxDb25zdHJ1Y3RvcnMgPSB0cnVlOwogICAgICAgICAgICBmb3IgKEtDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciBpbiBjbGFzc0RhdGEuY29uc3RydWN0b3JzKSB7CiAgICAgICAgICAgICAgaWYgKGlzVG9vQ29tcGxleCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBNZW1iZXJVc2FnZSBjb25zdHJ1Y3RvclVzYWdlID0KICAgICAgICAgICAgICAgICAgY2xvc2VkV29ybGQubGl2ZU1lbWJlclVzYWdlW2NvbnN0cnVjdG9yXTsKICAgICAgICAgICAgICBpZiAoY29uc3RydWN0b3JVc2FnZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBUaGlzIGNvbnN0cnVjdG9yIGlzbid0IGNhbGxlZC4KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgaW52b2tlZFBhcmFtZXRlcnMgPQogICAgICAgICAgICAgICAgICBjbG9zZWRXb3JsZC5hbm5vdGF0aW9uc0RhdGEuaGFzTm9FbGlzaW9uKGNvbnN0cnVjdG9yKQogICAgICAgICAgICAgICAgICAgICAgPyBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJTdHJ1Y3R1cmUKICAgICAgICAgICAgICAgICAgICAgIDogY29uc3RydWN0b3JVc2FnZS5pbnZva2VkUGFyYW1ldGVyczsKCiAgICAgICAgICAgICAgSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSBkYXRhLmluaXRpYWxpemVyc1tjb25zdHJ1Y3Rvcl07CiAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGluQWxsQ29uc3RydWN0b3JzID0gZmFsc2U7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5pdGlhbGl6ZXIua2luZCkgewogICAgICAgICAgICAgICAgICBjYXNlIEluaXRpYWxpemVyS2luZC5kaXJlY3Q6CiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUluaXRpYWxWYWx1ZShpbml0aWFsaXplci52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgSW5pdGlhbGl6ZXJLaW5kLnBvc2l0aW9uYWw6CiAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyLmluZGV4ID49CiAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZWRQYXJhbWV0ZXJzLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlSW5pdGlhbFZhbHVlKGluaXRpYWxpemVyLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgaXNUb29Db21wbGV4ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgSW5pdGlhbGl6ZXJLaW5kLm5hbWVkOgogICAgICAgICAgICAgICAgICAgIGlmICghaW52b2tlZFBhcmFtZXRlcnMubmFtZWRQYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWlucyhpbml0aWFsaXplci5uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUluaXRpYWxWYWx1ZShpbml0aWFsaXplci52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIGlzVG9vQ29tcGxleCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIEluaXRpYWxpemVyS2luZC5jb21wbGV4OgogICAgICAgICAgICAgICAgICAgIGlzVG9vQ29tcGxleCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaW5BbGxDb25zdHJ1Y3RvcnMpIHsKICAgICAgICAgICAgICBpbmNsdWRlSW5pdGlhbFZhbHVlKGRhdGEuaW5pdGlhbFZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWlzVG9vQ29tcGxleCAmJiBpbml0aWFsVmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBtYXAudG9CYWNrZW5kQ29uc3RhbnQoaW5pdGlhbFZhbHVlKTsKICAgICAgICAgICAgICBib29sIGlzRWZmZWN0aXZlbHlDb25zdGFudCA9IGZhbHNlOwogICAgICAgICAgICAgIGJvb2wgaXNJbml0aWFsaXplZEluQWxsb2NhdG9yID0gZmFsc2U7CiAgICAgICAgICAgICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwogICAgICAgICAgICAgIGlmICghbWVtYmVyVXNhZ2UuaGFzV3JpdGUgJiYgY2FuQmVFbGlkZWQoa0ZpZWxkKSkgewogICAgICAgICAgICAgICAgaXNFZmZlY3RpdmVseUNvbnN0YW50ID0gdHJ1ZTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmlzTnVsbCB8fAogICAgICAgICAgICAgICAgICB2YWx1ZS5pc0ludCB8fAogICAgICAgICAgICAgICAgICB2YWx1ZS5pc0Jvb2wgfHwKICAgICAgICAgICAgICAgICAgdmFsdWUuaXNTdHJpbmcpIHsKICAgICAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcixzcmEpOiBTdXBwb3J0IG5vbi1wcmltaXRpdmUgY29uc3RhbnRzIGluCiAgICAgICAgICAgICAgICAvLyBhbGxvY2F0b3JzIHdoZW4gaXQgZG9lcyBjYXVzZSBhbGxvY2F0b3JzIHRvIGRlb3B0aW1pemVkCiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIG9mIGRlZmVycmVkIGxvYWRpbmcuCiAgICAgICAgICAgICAgICBpc0luaXRpYWxpemVkSW5BbGxvY2F0b3IgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmaWVsZERhdGFbakZpZWxkXSA9IG5ldyBGaWVsZEFuYWx5c2lzRGF0YSgKICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgaXNFZmZlY3RpdmVseUZpbmFsOiBpc0VmZmVjdGl2ZWx5Q29uc3RhbnQsCiAgICAgICAgICAgICAgICAgIGlzRWxpZGVkOiBpc0VmZmVjdGl2ZWx5Q29uc3RhbnQsCiAgICAgICAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWRJbkFsbG9jYXRvcjogaXNJbml0aWFsaXplZEluQWxsb2NhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKCiAgICBMaXN0PEtGaWVsZD4gaW5kZXBlbmRlbnRGaWVsZHMgPSBbXTsKICAgIExpc3Q8S0ZpZWxkPiBkZXBlbmRlbnRGaWVsZHMgPSBbXTsKCiAgICBjbG9zZWRXb3JsZC5saXZlTWVtYmVyVXNhZ2UKICAgICAgICAuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVXNhZ2UgbWVtYmVyVXNhZ2UpIHsKICAgICAgaWYgKG1lbWJlci5pc0ZpZWxkICYmICFtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAgIFN0YXRpY0ZpZWxkRGF0YSBzdGF0aWNGaWVsZERhdGEgPQogICAgICAgICAgICBjbG9zZWRXb3JsZC5maWVsZEFuYWx5c2lzLl9zdGF0aWNGaWVsZERhdGFbbWVtYmVyXTsKICAgICAgICBpZiAoc3RhdGljRmllbGREYXRhLmhhc0RlcGVuZGVuY2llcykgewogICAgICAgICAgZGVwZW5kZW50RmllbGRzLmFkZChtZW1iZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbmRlcGVuZGVudEZpZWxkcy5hZGQobWVtYmVyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIEZpZWxkcyBhbHJlYWR5IHByb2Nlc3NlZC4KICAgIFNldDxLRmllbGQ+IHByb2Nlc3NlZEZpZWxkcyA9IHt9OwoKICAgIC8vIEZpZWxkcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiBVc2UgZm9yIGRldGVjdGluZyBjeWNsaWMgZGVwZW5kZW5jaWVzLgogICAgU2V0PEtGaWVsZD4gY3VycmVudEZpZWxkcyA9IHt9OwoKICAgIC8vIEluZGV4IGFzY3JpYmVkIHRvIGVhZ2VyIGZpZWxkcyB0aGF0IGRlcGVuZCBvbiBvdGhlciBmaWVsZHMuIFRoaXMgaXMKICAgIC8vIHVzZWQgdG8gc29ydCB0aGUgZmllbGQgaW4gZW1pc3Npb24gdG8gZW5zdXJlIHRoYXQgdXNlZCBmaWVsZHMgaGF2ZSBiZWVuCiAgICAvLyBpbml0aWFsaXplZCB3aGVuIHJlYWQuCiAgICBpbnQgZWFnZXJDcmVhdGlvbkluZGV4ID0gMDsKCiAgICAvLy8gQ29tcHV0ZXMgdGhlIFtGaWVsZEFuYWx5c2lzRGF0YV0gZm9yIHRoZSBKRmllbGQgY29ycmVzcG9uZGluZyB0bwogICAgLy8vIFtrRmllbGRdLgogICAgLy8vCiAgICAvLy8gSWYgdGhlIGRhdGEgaXMgY3VycmVudGx5IGJlZW4gY29tcHV0ZWQsIHRoYXQgaXMsIFtrRmllbGRdIGhhcyBhCiAgICAvLy8gY3ljbGljIGRlcGVuZGVuY3ksIGBudWxsYCBpcyByZXR1cm5lZC4KICAgIEZpZWxkQW5hbHlzaXNEYXRhIHByb2Nlc3NGaWVsZChLRmllbGQga0ZpZWxkKSB7CiAgICAgIEpGaWVsZCBqRmllbGQgPSBtYXAudG9CYWNrZW5kTWVtYmVyKGtGaWVsZCk7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENhbiB3ZSBhc3NlcnQgdGhhdCBbakZpZWxkXSBleGlzdHM/CiAgICAgIGlmIChqRmllbGQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgICBGaWVsZEFuYWx5c2lzRGF0YSBkYXRhID0gZmllbGREYXRhW2pGaWVsZF07CiAgICAgIGlmIChwcm9jZXNzZWRGaWVsZHMuY29udGFpbnMoa0ZpZWxkKSkgewogICAgICAgIC8vIFdlIG9ubHkgc3RvcmUgZGF0YSBmb3Igbm9uLXRyaXZpYWwgW0ZpZWxkQW5hbHlzaXNEYXRhXS4KICAgICAgICByZXR1cm4gZGF0YSA/PyBjb25zdCBGaWVsZEFuYWx5c2lzRGF0YSgpOwogICAgICB9CiAgICAgIGlmIChjdXJyZW50RmllbGRzLmNvbnRhaW5zKGtGaWVsZCkpIHsKICAgICAgICAvLyBDeWNsaWMgZGVwZW5kZW5jeS4KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjdXJyZW50RmllbGRzLmFkZChrRmllbGQpOwogICAgICBNZW1iZXJVc2FnZSBtZW1iZXJVc2FnZSA9IGNsb3NlZFdvcmxkLmxpdmVNZW1iZXJVc2FnZVtrRmllbGRdOwogICAgICBpZiAoIW1lbWJlclVzYWdlLmhhc1JlYWQgJiYgY2FuQmVFbGlkZWQoa0ZpZWxkKSkgewogICAgICAgIGRhdGEgPSBmaWVsZERhdGFbakZpZWxkXSA9IGNvbnN0IEZpZWxkQW5hbHlzaXNEYXRhKGlzRWxpZGVkOiB0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBib29sIGlzRWZmZWN0aXZlbHlGaW5hbCA9ICFtZW1iZXJVc2FnZS5oYXNXcml0ZTsKICAgICAgICBTdGF0aWNGaWVsZERhdGEgc3RhdGljRmllbGREYXRhID0KICAgICAgICAgICAgY2xvc2VkV29ybGQuZmllbGRBbmFseXNpcy5fc3RhdGljRmllbGREYXRhW2tGaWVsZF07CiAgICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IG1hcAogICAgICAgICAgICAudG9CYWNrZW5kQ29uc3RhbnQoc3RhdGljRmllbGREYXRhLmluaXRpYWxWYWx1ZSwgYWxsb3dOdWxsOiB0cnVlKTsKCiAgICAgICAgLy8gSWYgdGhlIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IGZpbmFsIHdpdGggYSBjb25zdGFudCBpbml0aWFsaXplciB3ZQogICAgICAgIC8vIGVsaWRlIHRoZSBmaWVsZCwgaWYgYWxsb3dlZCwgYmVjYXVzZSBpdCBpcyBlZmZlY3RpdmVseSBjb25zdGFudC4KICAgICAgICBib29sIGlzRWxpZGVkID0KICAgICAgICAgICAgaXNFZmZlY3RpdmVseUZpbmFsICYmIHZhbHVlICE9IG51bGwgJiYgY2FuQmVFbGlkZWQoa0ZpZWxkKTsKCiAgICAgICAgYm9vbCBpc0VhZ2VyOwoKICAgICAgICAvLyBJZiB0aGUgZmllbGQgaXMgZWFnZXIgYW5kIGRlcGVuZGVudCBvbiBvdGhlciBlYWdlciBmaWVsZHMsCiAgICAgICAgLy8gW2VhZ2VyRmllbGREZXBlbmRlbmNpZXNdIGhvbGRzIHRoZXNlIGZpZWxkcyBhbmQgW2NyZWF0aW9uSW5kZXhdIGlzCiAgICAgICAgLy8gZ2l2ZW4gdGhlIGNyZWF0aW9uIG9yZGVyIGluZGV4IHVzZWQgdG8gZW5zdXJlIHRoYXQgYWxsIGRlcGVuZGVuY2llcwogICAgICAgIC8vIGhhdmUgYmVlbiBhc3NpZ25lZCB0aGVpciB2YWx1ZXMgYmVmb3JlIHRoaXMgZmllbGQgaXMgaW5pdGlhbGl6ZWQuCiAgICAgICAgLy8KICAgICAgICAvLyBTaW5jZSB3ZSBvbmx5IG5lZWQgdGhlIHZhbHVlcyBvZiBbZWFnZXJGaWVsZERlcGVuZGVuY2llc10gZm9yIHRlc3RpbmcKICAgICAgICAvLyBhbmQgb25seSB0aGUgbm9uLWVtcHRpbmVzcyBmb3IgZGV0ZXJtaW5pbmcgdGhlIG5lZWQgZm9yIGNyZWF0aW9uCiAgICAgICAgLy8gb3JkZXIgaW5kaWNlcywgW2VhZ2VyRmllbGREZXBlbmRlbmNpZXNdIGlzIG5vbi1udWxsIGlmIHRoZSBmaWVsZCBoYXMKICAgICAgICAvLyBkZXBlbmRlbmNpZXMgYnV0IG9ubHkgaG9sZCB0aGVzZSB3aGVuIFtyZXRhaW5EYXRhRm9yVGVzdGluZ10gaXMKICAgICAgICAvLyBgdHJ1ZWAuCiAgICAgICAgTGlzdDxGaWVsZEVudGl0eT4gZWFnZXJGaWVsZERlcGVuZGVuY2llczsKICAgICAgICBpbnQgY3JlYXRpb25JbmRleCA9IG51bGw7CgogICAgICAgIGlmIChpc0VsaWRlZCkgewogICAgICAgICAgLy8gSWYgdGhlIGZpZWxkIGlzIGVsaWRlZCBpdCBuZWVkcyBubyBpbml0aWFsaXplciBhbmQgaXMgdGhlcmVmb3JlCiAgICAgICAgICAvLyBub3QgZWFnZXIuCiAgICAgICAgICBpc0VhZ2VyID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIElmIHRoZSBmaWVsZCBoYXMgYSBjb25zdGFudCBpbml0aWFsaXplciB3ZSBrbm93IGl0IGNhbiBiZQogICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgZWFnZXJseS4KICAgICAgICAgIC8vCiAgICAgICAgICAvLyBJZGVhbGx5IHRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzCiAgICAgICAgICAvLyBgc3RhdGljRmllbGREYXRhLmNvbXBsZXhpdHkuaXNDb25zdGFudGAgYnV0IGN1cnJlbnRseSB0aGUgY29uc3RhbnQKICAgICAgICAgIC8vIGV2YWx1YXRvciBoYW5kbGVzIGNhc2VzIHRoYXQgdGhlIGFuYWx5c2lzIGRvZXNuJ3QsIHNvIHdlIHVzZSB0aGUKICAgICAgICAgIC8vIGJldHRlciByZXN1bHQuCiAgICAgICAgICBpc0VhZ2VyID0gdmFsdWUgIT0gbnVsbDsKICAgICAgICAgIGlmICghaXNFYWdlcikgewogICAgICAgICAgICAvLyBUaGUgZmllbGQgbWlnaHQgYmUgZWFnZXIgZGVwZW5kaW5nIG9uIHRoZSBpbml0aWFsaXplciBjb21wbGV4aXR5CiAgICAgICAgICAgIC8vIGFuZCBpdHMgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICBJbml0aWFsaXplckNvbXBsZXhpdHkgY29tcGxleGl0eSA9IHN0YXRpY0ZpZWxkRGF0YS5jb21wbGV4aXR5OwogICAgICAgICAgICBpc0VhZ2VyID0gY29tcGxleGl0eT8uaXNFYWdlciA/PyBmYWxzZTsKICAgICAgICAgICAgaWYgKGlzRWFnZXIgJiYgY29tcGxleGl0eS5maWVsZHMgIT0gbnVsbCkgewogICAgICAgICAgICAgIGZvciAoaXIuRmllbGQgbm9kZSBpbiBjb21wbGV4aXR5LmZpZWxkcykgewogICAgICAgICAgICAgICAgS0ZpZWxkIG90aGVyRmllbGQgPSBjbG9zZWRXb3JsZC5lbGVtZW50TWFwLmdldEZpZWxkKG5vZGUpOwogICAgICAgICAgICAgICAgRmllbGRBbmFseXNpc0RhdGEgb3RoZXJEYXRhID0gcHJvY2Vzc0ZpZWxkKG90aGVyRmllbGQpOwogICAgICAgICAgICAgICAgaWYgKG90aGVyRGF0YSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIC8vIEN5Y2xpYyBkZXBlbmRlbmN5IG9uIFtvdGhlckZpZWxkXS4KICAgICAgICAgICAgICAgICAgaXNFYWdlciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvdGhlckRhdGEuaXNMYXp5KSB7CiAgICAgICAgICAgICAgICAgIC8vIFtvdGhlckZpZWxkXSBuZWVkcyBsYXp5IGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAgICAgICBpc0VhZ2VyID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFvdGhlckRhdGEuaXNFZmZlY3RpdmVseUZpbmFsKSB7CiAgICAgICAgICAgICAgICAgIC8vIFtvdGhlckZpZWxkXSBtaWdodCBub3QgaG9sZCBpdHMgaW5pdGlhbCB2YWx1ZSB3aGVuIHRoaXMgZmllbGQKICAgICAgICAgICAgICAgICAgLy8gaXMgYWNjZXNzZWQgdGhlIGZpcnN0IHRpbWUsIHNvIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGlzCiAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGxhemlseS4KICAgICAgICAgICAgICAgICAgaXNFYWdlciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghb3RoZXJEYXRhLmlzRWZmZWN0aXZlbHlDb25zdGFudCkgewogICAgICAgICAgICAgICAgICBlYWdlckZpZWxkRGVwZW5kZW5jaWVzID8/PSBbXTsKICAgICAgICAgICAgICAgICAgaWYgKHJldGFpbkRhdGFGb3JUZXN0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgZWFnZXJGaWVsZERlcGVuZGVuY2llcy5hZGQobWFwLnRvQmFja2VuZE1lbWJlcihvdGhlckZpZWxkKSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoaXNFYWdlciAmJiBlYWdlckZpZWxkRGVwZW5kZW5jaWVzICE9IG51bGwpIHsKICAgICAgICAgICAgY3JlYXRpb25JbmRleCA9IGVhZ2VyQ3JlYXRpb25JbmRleCsrOwogICAgICAgICAgICBpZiAoIXJldGFpbkRhdGFGb3JUZXN0aW5nKSB7CiAgICAgICAgICAgICAgZWFnZXJGaWVsZERlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVhZ2VyRmllbGREZXBlbmRlbmNpZXMgPSBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGF0YSA9IGZpZWxkRGF0YVtqRmllbGRdID0gbmV3IEZpZWxkQW5hbHlzaXNEYXRhKAogICAgICAgICAgICBpbml0aWFsVmFsdWU6IHZhbHVlLAogICAgICAgICAgICBpc0VmZmVjdGl2ZWx5RmluYWw6IGlzRWZmZWN0aXZlbHlGaW5hbCwKICAgICAgICAgICAgaXNFbGlkZWQ6IGlzRWxpZGVkLAogICAgICAgICAgICBpc0VhZ2VyOiBpc0VhZ2VyLAogICAgICAgICAgICBlYWdlckNyZWF0aW9uSW5kZXg6IGNyZWF0aW9uSW5kZXgsCiAgICAgICAgICAgIGVhZ2VyRmllbGREZXBlbmRlbmNpZXNGb3JUZXN0aW5nOiBlYWdlckZpZWxkRGVwZW5kZW5jaWVzKTsKICAgICAgfQoKICAgICAgY3VycmVudEZpZWxkcy5yZW1vdmUoa0ZpZWxkKTsKICAgICAgcHJvY2Vzc2VkRmllbGRzLmFkZChrRmllbGQpOwogICAgICByZXR1cm4gZGF0YTsKICAgIH0KCiAgICAvLyBQcm9jZXNzIGluZGVwZW5kZW50IGZpZWxkcyBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLiBUaGUgZW1pdHRlciBzb3J0cwogICAgLy8gdGhlc2UgbGF0ZXIuCiAgICBpbmRlcGVuZGVudEZpZWxkcy5mb3JFYWNoKHByb2Nlc3NGaWVsZCk7CgogICAgLy8gUHJvY2VzcyBkZXBlbmRlbnQgZmllbGRzIGluIGRlY2xhcmF0aW9uIG9yZGVyIHRvIG1ha2UgYXNjcmliZWQgY3JlYXRpb24KICAgIC8vIGluZGljZXMgc3RhYmxlLiBUaGUgZW1pdHRlciB1c2VzIHRoZSBjcmVhdGlvbiBpbmRpY2VzIGZvciBzb3J0aW5nCiAgICAvLyBkZXBlbmRlbnQgZmllbGRzLgogICAgZGVwZW5kZW50RmllbGRzLnNvcnQoKEtGaWVsZCBhLCBLRmllbGQgYikgewogICAgICBpbnQgcmVzdWx0ID0KICAgICAgICAgIGNvbXBhcmVMaWJyYXJpZXNVcmlzKGEubGlicmFyeS5jYW5vbmljYWxVcmksIGIubGlicmFyeS5jYW5vbmljYWxVcmkpOwogICAgICBpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7CiAgICAgIGlyLkxvY2F0aW9uIGFMb2NhdGlvbiA9IGNsb3NlZFdvcmxkLmVsZW1lbnRNYXAuZ2V0TWVtYmVyTm9kZShhKS5sb2NhdGlvbjsKICAgICAgaXIuTG9jYXRpb24gYkxvY2F0aW9uID0gY2xvc2VkV29ybGQuZWxlbWVudE1hcC5nZXRNZW1iZXJOb2RlKGIpLmxvY2F0aW9uOwogICAgICByZXN1bHQgPSBjb21wYXJlU291cmNlVXJpcyhhTG9jYXRpb24uZmlsZSwgYkxvY2F0aW9uLmZpbGUpOwogICAgICBpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7CiAgICAgIHJlc3VsdCA9IGFMb2NhdGlvbi5saW5lLmNvbXBhcmVUbyhiTG9jYXRpb24ubGluZSk7CiAgICAgIGlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIHJlc3VsdDsKICAgICAgcmV0dXJuIGFMb2NhdGlvbi5jb2x1bW4uY29tcGFyZVRvKGJMb2NhdGlvbi5jb2x1bW4pOwogICAgfSk7CgogICAgZGVwZW5kZW50RmllbGRzLmZvckVhY2gocHJvY2Vzc0ZpZWxkKTsKCiAgICByZXR1cm4gbmV3IEpGaWVsZEFuYWx5c2lzLl8oZmllbGREYXRhKTsKICB9CgogIC8vIFRPRE8oc3JhKTogQWRkIHdheSB0byBsZXQgaW5qZWN0ZWQgZmllbGRzIGJlIGluaXRpYWxpemVkIHRvIGEgY29uc3RhbnQgaW4KICAvLyBhbGxvY2F0b3IuCgogIEZpZWxkQW5hbHlzaXNEYXRhIGdldEZpZWxkRGF0YShKRmllbGQgZmllbGQpIHsKICAgIHJldHVybiBfZmllbGREYXRhW2ZpZWxkXSA/PyBjb25zdCBGaWVsZEFuYWx5c2lzRGF0YSgpOwogIH0KfQoKLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWVyZ2UgdGhpcyBpbnRvIFtGaWVsZERhdGFdLgpjbGFzcyBGaWVsZEFuYWx5c2lzRGF0YSB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnZmllbGQtYW5hbHlzaXMtZGF0YSc7CgogIGZpbmFsIENvbnN0YW50VmFsdWUgaW5pdGlhbFZhbHVlOwogIGZpbmFsIGJvb2wgaXNJbml0aWFsaXplZEluQWxsb2NhdG9yOwogIGZpbmFsIGJvb2wgaXNFZmZlY3RpdmVseUZpbmFsOwogIGZpbmFsIGJvb2wgaXNFbGlkZWQ7CgogIC8vLyBJZiBgdHJ1ZWAgdGhlIGZpZWxkIGlzIG5vdCBlZmZlY3RpdmVseSBjb25zdGFudCBidXQgdGhlIGluaXRpYWxpemVyIGNhbiBiZQogIC8vLyBnZW5lcmF0ZWQgZWFnZXJseSB3aXRob3V0IHRoZSBuZWVkIGZvciBsYXp5IGluaXRpYWxpemF0aW9uIHdyYXBwZXIuCiAgZmluYWwgYm9vbCBpc0VhZ2VyOwoKICAvLy8gSW5kZXggYXNjcmliZWQgdG8gZWFnZXIgZmllbGRzIHRoYXQgZGVwZW5kIG9uIG90aGVyIGZpZWxkcy4gVGhpcyBpcwogIC8vLyB1c2VkIHRvIHNvcnQgdGhlIGZpZWxkIGluIGVtaXNzaW9uIHRvIGVuc3VyZSB0aGF0IHVzZWQgZmllbGRzIGhhdmUgYmVlbgogIC8vLyBpbml0aWFsaXplZCB3aGVuIHJlYWQuCiAgZmluYWwgaW50IGVhZ2VyQ3JlYXRpb25JbmRleDsKCiAgZmluYWwgTGlzdDxGaWVsZEVudGl0eT4gZWFnZXJGaWVsZERlcGVuZGVuY2llc0ZvclRlc3Rpbmc7CgogIGNvbnN0IEZpZWxkQW5hbHlzaXNEYXRhKAogICAgICB7dGhpcy5pbml0aWFsVmFsdWUsCiAgICAgIHRoaXMuaXNJbml0aWFsaXplZEluQWxsb2NhdG9yOiBmYWxzZSwKICAgICAgdGhpcy5pc0VmZmVjdGl2ZWx5RmluYWw6IGZhbHNlLAogICAgICB0aGlzLmlzRWxpZGVkOiBmYWxzZSwKICAgICAgdGhpcy5pc0VhZ2VyOiBmYWxzZSwKICAgICAgdGhpcy5lYWdlckNyZWF0aW9uSW5kZXg6IG51bGwsCiAgICAgIHRoaXMuZWFnZXJGaWVsZERlcGVuZGVuY2llc0ZvclRlc3Rpbmc6IG51bGx9KTsKCiAgZmFjdG9yeSBGaWVsZEFuYWx5c2lzRGF0YS5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CgogICAgQ29uc3RhbnRWYWx1ZSBpbml0aWFsVmFsdWUgPSBzb3VyY2UucmVhZENvbnN0YW50T3JOdWxsKCk7CiAgICBib29sIGlzSW5pdGlhbGl6ZWRJbkFsbG9jYXRvciA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0VmZmVjdGl2ZWx5RmluYWwgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNFbGlkZWQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNFYWdlciA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgaW50IGVhZ2VyQ3JlYXRpb25JbmRleCA9IHNvdXJjZS5yZWFkSW50T3JOdWxsKCk7CiAgICBMaXN0PEZpZWxkRW50aXR5PiBlYWdlckZpZWxkRGVwZW5kZW5jaWVzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RmllbGRFbnRpdHk+KGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgRmllbGRBbmFseXNpc0RhdGEoCiAgICAgICAgaW5pdGlhbFZhbHVlOiBpbml0aWFsVmFsdWUsCiAgICAgICAgaXNJbml0aWFsaXplZEluQWxsb2NhdG9yOiBpc0luaXRpYWxpemVkSW5BbGxvY2F0b3IsCiAgICAgICAgaXNFZmZlY3RpdmVseUZpbmFsOiBpc0VmZmVjdGl2ZWx5RmluYWwsCiAgICAgICAgaXNFbGlkZWQ6IGlzRWxpZGVkLAogICAgICAgIGlzRWFnZXI6IGlzRWFnZXIsCiAgICAgICAgZWFnZXJDcmVhdGlvbkluZGV4OiBlYWdlckNyZWF0aW9uSW5kZXgsCiAgICAgICAgZWFnZXJGaWVsZERlcGVuZGVuY2llc0ZvclRlc3Rpbmc6IGVhZ2VyRmllbGREZXBlbmRlbmNpZXMpOwogIH0KCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUNvbnN0YW50T3JOdWxsKGluaXRpYWxWYWx1ZSk7CiAgICBzaW5rLndyaXRlQm9vbChpc0luaXRpYWxpemVkSW5BbGxvY2F0b3IpOwogICAgc2luay53cml0ZUJvb2woaXNFZmZlY3RpdmVseUZpbmFsKTsKICAgIHNpbmsud3JpdGVCb29sKGlzRWxpZGVkKTsKICAgIHNpbmsud3JpdGVCb29sKGlzRWFnZXIpOwogICAgc2luay53cml0ZUludE9yTnVsbChlYWdlckNyZWF0aW9uSW5kZXgpOwogICAgc2luay53cml0ZU1lbWJlcnMoZWFnZXJGaWVsZERlcGVuZGVuY2llc0ZvclRlc3RpbmcsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgLy8vIElmIGB0cnVlYCB0aGUgaW5pdGlhbGl6ZXIgZm9yIHRoaXMgZmllbGQgcmVxdWlyZXMgYSBsYXp5IGluaXRpYWxpemF0aW9uCiAgLy8vIHdyYXBwZXIuCiAgYm9vbCBnZXQgaXNMYXp5ID0+IGluaXRpYWxWYWx1ZSA9PSBudWxsICYmICFpc0VhZ2VyOwoKICBib29sIGdldCBpc0VmZmVjdGl2ZWx5Q29uc3RhbnQgPT4KICAgICAgaXNFZmZlY3RpdmVseUZpbmFsICYmIGlzRWxpZGVkICYmIGluaXRpYWxWYWx1ZSAhPSBudWxsOwoKICBDb25zdGFudFZhbHVlIGdldCBjb25zdGFudFZhbHVlID0+IGlzRWZmZWN0aXZlbHlGaW5hbCA/IGluaXRpYWxWYWx1ZSA6IG51bGw7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICdGaWVsZEFuYWx5c2lzRGF0YShpbml0aWFsVmFsdWU9JHtpbml0aWFsVmFsdWU/LnRvU3RydWN0dXJlZFRleHQoKX0sJwogICAgICAnaXNJbml0aWFsaXplZEluQWxsb2NhdG9yPSRpc0luaXRpYWxpemVkSW5BbGxvY2F0b3IsJwogICAgICAnaXNFZmZlY3RpdmVseUZpbmFsPSRpc0VmZmVjdGl2ZWx5RmluYWwsaXNFbGlkZWQ9JGlzRWxpZGVkLCcKICAgICAgJ2lzRWFnZXI9JGlzRWFnZXIsZWFnZXJDcmVhdGlvbkluZGV4PSRlYWdlckNyZWF0aW9uSW5kZXgsJwogICAgICAnZWFnZXJGaWVsZERlcGVuZGVuY2llcz0kZWFnZXJGaWVsZERlcGVuZGVuY2llc0ZvclRlc3RpbmcpJzsKfQqCfQBOTjwBKAEZIyQoIzAsJSlFJhouKAEWBE1NTU5PAUhQS04SAx8DFygBMDwBODEBTR4yOwEqLy8tAT40RTcvPAgGAUFRLEUyH0IeTAE5FgwBRjNMO0NGMD8bTiJNPissKUklSxIQFRlLJD4rLClJJUwSEA4MRAoIBkEEAU02MUM8LhQGTCxGBAE7PgQBPyQEAgESKS4BMAIBGCQqATcBTwIBFiQ6ASQBDBdIJQIBFwoOCQsCARQeExUdASEnFhUBMSsVASsmFgEeKBYVFgEZFCMpJzUiNCQUBjkEAQwiAgEXSB0uAVABOAElATwtNBdKUBUsBAEyKBUZFDkpEwQBUSE4ASpBOQYBKTpINR4SCgFQPwFHJCVJDBErKCcBPCgqJjIlJRAOAUcBK0ciFxABLTwuMhoQNUg3PAFIKSsXLC88GzMtQj4dKxYbLjs3Ph0rFhswKRsSEA4mNg45STI1JUIuKSEiJE9LMDEQOSc9M0cODAoKCAEpJwEgQjgqQC8nESkKCAgBISYBUCQBS08eIAFJEghILzQzQicBMi5DMggsHhUIIUU5TA85KkAiTwFMTBhIARYBRk5PTQtRTFBLEzIiARhNGBsRRyINMFBOHCMaUCVLNDg5S0gpOCMZEig9IxkSNVNPIyMZEjgxLlEUEhAODAE7MiktDhMrDAoBOiE0IB4vRwgBJCMTBgFMFC0BT0kZMBNQJlBQQiY5JjsIASsBLAQBTxABMTsEAgE1GjMBJCchFwFRShYBSk4dIAE8ARsaLCYcGyU1AUAXAT43MScmNS88FSIkPDAcGjBDBAEoFSwuKB4dLUoTBAFODzcBJD4BTwEMF0w8Q0FDAgEzcGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9maWVsZF9hbmFseXNpcy5kYXJ0NHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3V0aWwvc2lua19hZGFwdGVyLmRhcnSBK2ltcG9ydCAnLi4vLi4vY29tcGlsZXJfbmV3LmRhcnQnIGFzIGFwaTsKCmNsYXNzIEJpbmFyeU91dHB1dFNpbmtBZGFwdGVyIGltcGxlbWVudHMgU2luazxMaXN0PGludD4+IHsKICBhcGkuQmluYXJ5T3V0cHV0U2luayBvdXRwdXQ7CgogIEJpbmFyeU91dHB1dFNpbmtBZGFwdGVyKHRoaXMub3V0cHV0KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGRhdGEpIHsKICAgIG91dHB1dC53cml0ZShkYXRhKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSB7CiAgICBvdXRwdXQuY2xvc2UoKTsKICB9Cn0KEwApATsfASgBDB0YBAEMERQEAgErcGFja2FnZTpjb21waWxlci9zcmMvdXRpbC9zaW5rX2FkYXB0ZXIuZGFydDlzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2Fubm90YXRpb25zLmRhcnTAAE50Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkganNfYmFja2VuZC5iYWNrZW5kLmFubm90YXRpb25zOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBLQ29tbW9uRWxlbWVudHMsIEtFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9kaWFnbm9zdGljcy9kaWFnbm9zdGljX2xpc3RlbmVyLmRhcnQnOwppbXBvcnQgJy4uL2RpYWdub3N0aWNzL21lc3NhZ2VzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2lyL2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJy4uL2lyL3V0aWwuZGFydCc7CmltcG9ydCAnLi4va2VybmVsL2RhcnQyanNfdGFyZ2V0LmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvZW51bXNldC5kYXJ0JzsKCmNsYXNzIFByYWdtYUFubm90YXRpb24gewogIGZpbmFsIGludCBfaW5kZXg7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgYm9vbCBmb3JGdW5jdGlvbnNPbmx5OwogIGZpbmFsIGJvb2wgZm9yRmllbGRzT25seTsKICBmaW5hbCBib29sIGludGVybmFsT25seTsKCiAgY29uc3QgUHJhZ21hQW5ub3RhdGlvbih0aGlzLl9pbmRleCwgdGhpcy5uYW1lLAogICAgICB7dGhpcy5mb3JGdW5jdGlvbnNPbmx5OiBmYWxzZSwKICAgICAgdGhpcy5mb3JGaWVsZHNPbmx5OiBmYWxzZSwKICAgICAgdGhpcy5pbnRlcm5hbE9ubHk6IGZhbHNlfSk7CgogIGludCBnZXQgaW5kZXggewogICAgYXNzZXJ0KF9pbmRleCA9PSB2YWx1ZXMuaW5kZXhPZih0aGlzKSk7CiAgICByZXR1cm4gX2luZGV4OwogIH0KCiAgLy8vIFRlbGxzIHRoZSBvcHRpbWl6aW5nIGNvbXBpbGVyIHRvIG5vdCBpbmxpbmUgdGhlIGFubm90YXRlZCBtZXRob2QuCiAgc3RhdGljIGNvbnN0IFByYWdtYUFubm90YXRpb24gbm9JbmxpbmUgPQogICAgICBjb25zdCBQcmFnbWFBbm5vdGF0aW9uKDAsICdub0lubGluZScsIGZvckZ1bmN0aW9uc09ubHk6IHRydWUpOwoKICAvLy8gVGVsbHMgdGhlIG9wdGltaXppbmcgY29tcGlsZXIgdG8gYWx3YXlzIGlubGluZSB0aGUgYW5ub3RhdGVkIG1ldGhvZCwgaWYKICAvLy8gcG9zc2libGUuCiAgc3RhdGljIGNvbnN0IFByYWdtYUFubm90YXRpb24gdHJ5SW5saW5lID0KICAgICAgY29uc3QgUHJhZ21hQW5ub3RhdGlvbigxLCAndHJ5SW5saW5lJywgZm9yRnVuY3Rpb25zT25seTogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBQcmFnbWFBbm5vdGF0aW9uIGRpc2FibGVGaW5hbCA9IGNvbnN0IFByYWdtYUFubm90YXRpb24oCiAgICAgIDIsICdkaXNhYmxlRmluYWwnLAogICAgICBmb3JGdW5jdGlvbnNPbmx5OiB0cnVlLCBpbnRlcm5hbE9ubHk6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgUHJhZ21hQW5ub3RhdGlvbiBub0VsaXNpb24gPQogICAgICBjb25zdCBQcmFnbWFBbm5vdGF0aW9uKDMsICdub0VsaXNpb24nKTsKCiAgLy8vIFRlbGxzIHRoZSBvcHRpbWl6aW5nIGNvbXBpbGVyIHRoYXQgdGhlIGFubm90YXRlZCBtZXRob2QgY2Fubm90IHRocm93LgogIC8vLyBSZXF1aXJlcyBAcHJhZ21hKCdkYXJ0MmpzOm5vSW5saW5lJykgdG8gZnVuY3Rpb24gY29ycmVjdGx5LgogIHN0YXRpYyBjb25zdCBQcmFnbWFBbm5vdGF0aW9uIG5vVGhyb3dzID0gY29uc3QgUHJhZ21hQW5ub3RhdGlvbig0LCAnbm9UaHJvd3MnLAogICAgICBmb3JGdW5jdGlvbnNPbmx5OiB0cnVlLCBpbnRlcm5hbE9ubHk6IHRydWUpOwoKICAvLy8gVGVsbHMgdGhlIG9wdGltaXppbmcgY29tcGlsZXIgdGhhdCB0aGUgYW5ub3RhdGVkIG1ldGhvZCBoYXMgbm8KICAvLy8gc2lkZS1lZmZlY3RzLiBBbGxvY2F0aW9ucyBkb24ndCBjb3VudCBhcyBzaWRlLWVmZmVjdHMsIHNpbmNlIHRoZXkgY2FuIGJlCiAgLy8vIGRyb3BwZWQgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2VtYW50aWNzIG9mIHRoZSBwcm9ncmFtLgogIC8vLwogIC8vLyBSZXF1aXJlcyBAcHJhZ21hKCdkYXJ0MmpzOm5vSW5saW5lJykgdG8gZnVuY3Rpb24gY29ycmVjdGx5LgogIHN0YXRpYyBjb25zdCBQcmFnbWFBbm5vdGF0aW9uIG5vU2lkZUVmZmVjdHMgPSBjb25zdCBQcmFnbWFBbm5vdGF0aW9uKAogICAgICA1LCAnbm9TaWRlRWZmZWN0cycsCiAgICAgIGZvckZ1bmN0aW9uc09ubHk6IHRydWUsIGludGVybmFsT25seTogdHJ1ZSk7CgogIC8vLyBVc2UgdGhpcyBhcyBtZXRhZGF0YSBvbiBtZXRob2QgZGVjbGFyYXRpb25zIHRvIGRpc2FibGUgY2xvc2VkIHdvcmxkCiAgLy8vIGFzc3VtcHRpb25zIG9uIHBhcmFtZXRlcnMsIGVmZmVjdGl2ZWx5IGFzc3VtaW5nIHRoYXQgdGhlIHJ1bnRpbWUgYXJndW1lbnRzCiAgLy8vIGNvdWxkIGJlIGFueSB2YWx1ZS4gTm90ZSB0aGF0IHRoZSBjb25zdHJhaW50cyBkdWUgdG8gc3RhdGljIHR5cGVzIHN0aWxsCiAgLy8vIGFwcGx5LgogIHN0YXRpYyBjb25zdCBQcmFnbWFBbm5vdGF0aW9uIGFzc3VtZUR5bmFtaWMgPSBjb25zdCBQcmFnbWFBbm5vdGF0aW9uKAogICAgICA2LCAnYXNzdW1lRHluYW1pYycsCiAgICAgIGZvckZ1bmN0aW9uc09ubHk6IHRydWUsIGludGVybmFsT25seTogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBQcmFnbWFBbm5vdGF0aW9uIGFzVHJ1c3QgPSBjb25zdCBQcmFnbWFBbm5vdGF0aW9uKDcsICdhczp0cnVzdCcsCiAgICAgIGZvckZ1bmN0aW9uc09ubHk6IGZhbHNlLCBpbnRlcm5hbE9ubHk6IGZhbHNlKTsKCiAgc3RhdGljIGNvbnN0IFByYWdtYUFubm90YXRpb24gYXNDaGVjayA9IGNvbnN0IFByYWdtYUFubm90YXRpb24oOCwgJ2FzOmNoZWNrJywKICAgICAgZm9yRnVuY3Rpb25zT25seTogZmFsc2UsIGludGVybmFsT25seTogZmFsc2UpOwoKICBzdGF0aWMgY29uc3QgUHJhZ21hQW5ub3RhdGlvbiB0eXBlc1RydXN0ID0gY29uc3QgUHJhZ21hQW5ub3RhdGlvbigKICAgICAgOSwgJ3R5cGVzOnRydXN0JywKICAgICAgZm9yRnVuY3Rpb25zT25seTogZmFsc2UsIGludGVybmFsT25seTogZmFsc2UpOwoKICBzdGF0aWMgY29uc3QgUHJhZ21hQW5ub3RhdGlvbiB0eXBlc0NoZWNrID0gY29uc3QgUHJhZ21hQW5ub3RhdGlvbigKICAgICAgMTAsICd0eXBlczpjaGVjaycsCiAgICAgIGZvckZ1bmN0aW9uc09ubHk6IGZhbHNlLCBpbnRlcm5hbE9ubHk6IGZhbHNlKTsKCiAgc3RhdGljIGNvbnN0IFByYWdtYUFubm90YXRpb24gcGFyYW1ldGVyVHJ1c3QgPSBjb25zdCBQcmFnbWFBbm5vdGF0aW9uKAogICAgICAxMSwgJ3BhcmFtZXRlcjp0cnVzdCcsCiAgICAgIGZvckZ1bmN0aW9uc09ubHk6IGZhbHNlLCBpbnRlcm5hbE9ubHk6IGZhbHNlKTsKCiAgc3RhdGljIGNvbnN0IFByYWdtYUFubm90YXRpb24gcGFyYW1ldGVyQ2hlY2sgPSBjb25zdCBQcmFnbWFBbm5vdGF0aW9uKAogICAgICAxMiwgJ3BhcmFtZXRlcjpjaGVjaycsCiAgICAgIGZvckZ1bmN0aW9uc09ubHk6IGZhbHNlLCBpbnRlcm5hbE9ubHk6IGZhbHNlKTsKCiAgc3RhdGljIGNvbnN0IFByYWdtYUFubm90YXRpb24gZG93bmNhc3RUcnVzdCA9IGNvbnN0IFByYWdtYUFubm90YXRpb24oCiAgICAgIDEzLCAnZG93bmNhc3Q6dHJ1c3QnLAogICAgICBmb3JGdW5jdGlvbnNPbmx5OiBmYWxzZSwgaW50ZXJuYWxPbmx5OiBmYWxzZSk7CgogIHN0YXRpYyBjb25zdCBQcmFnbWFBbm5vdGF0aW9uIGRvd25jYXN0Q2hlY2sgPSBjb25zdCBQcmFnbWFBbm5vdGF0aW9uKAogICAgICAxNCwgJ2Rvd25jYXN0OmNoZWNrJywKICAgICAgZm9yRnVuY3Rpb25zT25seTogZmFsc2UsIGludGVybmFsT25seTogZmFsc2UpOwoKICBzdGF0aWMgY29uc3QgTGlzdDxQcmFnbWFBbm5vdGF0aW9uPiB2YWx1ZXMgPSBbCiAgICBub0lubGluZSwKICAgIHRyeUlubGluZSwKICAgIGRpc2FibGVGaW5hbCwKICAgIG5vRWxpc2lvbiwKICAgIG5vVGhyb3dzLAogICAgbm9TaWRlRWZmZWN0cywKICAgIGFzc3VtZUR5bmFtaWMsCiAgICBhc1RydXN0LAogICAgYXNDaGVjaywKICAgIHR5cGVzVHJ1c3QsCiAgICB0eXBlc0NoZWNrLAogICAgcGFyYW1ldGVyVHJ1c3QsCiAgICBwYXJhbWV0ZXJDaGVjaywKICAgIGRvd25jYXN0VHJ1c3QsCiAgICBkb3duY2FzdENoZWNrLAogIF07CgogIHN0YXRpYyBjb25zdCBNYXA8UHJhZ21hQW5ub3RhdGlvbiwgU2V0PFByYWdtYUFubm90YXRpb24+PiBpbXBsaWVzID0gewogICAgdHlwZXNUcnVzdDoge3BhcmFtZXRlclRydXN0LCBkb3duY2FzdFRydXN0fSwKICAgIHR5cGVzQ2hlY2s6IHtwYXJhbWV0ZXJDaGVjaywgZG93bmNhc3RDaGVja30sCiAgfTsKICBzdGF0aWMgY29uc3QgTWFwPFByYWdtYUFubm90YXRpb24sIFNldDxQcmFnbWFBbm5vdGF0aW9uPj4gZXhjbHVkZXMgPSB7CiAgICBub0lubGluZToge3RyeUlubGluZX0sCiAgICB0cnlJbmxpbmU6IHtub0lubGluZX0sCiAgICB0eXBlc1RydXN0OiB7dHlwZXNDaGVjaywgcGFyYW1ldGVyQ2hlY2ssIGRvd25jYXN0Q2hlY2t9LAogICAgdHlwZXNDaGVjazoge3R5cGVzVHJ1c3QsIHBhcmFtZXRlclRydXN0LCBkb3duY2FzdFRydXN0fSwKICAgIHBhcmFtZXRlclRydXN0OiB7cGFyYW1ldGVyQ2hlY2t9LAogICAgcGFyYW1ldGVyQ2hlY2s6IHtwYXJhbWV0ZXJUcnVzdH0sCiAgICBkb3duY2FzdFRydXN0OiB7ZG93bmNhc3RDaGVja30sCiAgICBkb3duY2FzdENoZWNrOiB7ZG93bmNhc3RUcnVzdH0sCiAgICBhc1RydXN0OiB7YXNDaGVja30sCiAgICBhc0NoZWNrOiB7YXNUcnVzdH0sCiAgfTsKICBzdGF0aWMgY29uc3QgTWFwPFByYWdtYUFubm90YXRpb24sIFNldDxQcmFnbWFBbm5vdGF0aW9uPj4gcmVxdWlyZXMgPSB7CiAgICBub1Rocm93czoge25vSW5saW5lfSwKICAgIG5vU2lkZUVmZmVjdHM6IHtub0lubGluZX0sCiAgfTsKfQoKTGlzdDxQcmFnbWFBbm5vdGF0aW9uRGF0YT4gY29tcHV0ZVByYWdtYUFubm90YXRpb25EYXRhKAogICAgS0NvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgS0VsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQsCiAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogIExpc3Q8UHJhZ21hQW5ub3RhdGlvbkRhdGE+IGFubm90YXRpb25zID0gW107CiAgZm9yIChDb25zdGFudFZhbHVlIGNvbnN0YW50VmFsdWUKICAgICAgaW4gZWxlbWVudEVudmlyb25tZW50LmdldE1lbWJlck1ldGFkYXRhKGVsZW1lbnQpKSB7CiAgICBpZiAoIWNvbnN0YW50VmFsdWUuaXNDb25zdHJ1Y3RlZE9iamVjdCkgY29udGludWU7CiAgICBDb25zdHJ1Y3RlZENvbnN0YW50VmFsdWUgdmFsdWUgPSBjb25zdGFudFZhbHVlOwogICAgQ2xhc3NFbnRpdHkgY2xzID0gdmFsdWUudHlwZS5lbGVtZW50OwogICAgYXNzZXJ0KGNscyAhPSBudWxsKTsgLy8gVW5yZXNvbHZlZCBjbGFzc2VzIG51bGwuCgogICAgaWYgKGNscyA9PSBjb21tb25FbGVtZW50cy5tZXRhTm9JbmxpbmVDbGFzcykgewogICAgICBhbm5vdGF0aW9ucy5hZGQoY29uc3QgUHJhZ21hQW5ub3RhdGlvbkRhdGEoJ25vSW5saW5lJykpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gY29tbW9uRWxlbWVudHMubWV0YVRyeUlubGluZUNsYXNzKSB7CiAgICAgIGFubm90YXRpb25zLmFkZChjb25zdCBQcmFnbWFBbm5vdGF0aW9uRGF0YSgndHJ5SW5saW5lJykpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gY29tbW9uRWxlbWVudHMucHJhZ21hQ2xhc3MpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSBuYW1lVmFsdWUgPQogICAgICAgICAgdmFsdWUuZmllbGRzW2NvbW1vbkVsZW1lbnRzLnByYWdtYUNsYXNzTmFtZUZpZWxkXTsKICAgICAgaWYgKG5hbWVWYWx1ZSA9PSBudWxsIHx8ICFuYW1lVmFsdWUuaXNTdHJpbmcpIGNvbnRpbnVlOwogICAgICBTdHJpbmcgbmFtZSA9IChuYW1lVmFsdWUgYXMgU3RyaW5nQ29uc3RhbnRWYWx1ZSkuc3RyaW5nVmFsdWU7CiAgICAgIFN0cmluZyBwcmVmaXggPSAnZGFydDJqczonOwogICAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTsKICAgICAgU3RyaW5nIHN1ZmZpeCA9IG5hbWUuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpOwoKICAgICAgQ29uc3RhbnRWYWx1ZSBvcHRpb25zVmFsdWUgPQogICAgICAgICAgdmFsdWUuZmllbGRzW2NvbW1vbkVsZW1lbnRzLnByYWdtYUNsYXNzT3B0aW9uc0ZpZWxkXTsKICAgICAgYW5ub3RhdGlvbnMuYWRkKAogICAgICAgICAgbmV3IFByYWdtYUFubm90YXRpb25EYXRhKHN1ZmZpeCwgaGFzT3B0aW9uczogIW9wdGlvbnNWYWx1ZS5pc051bGwpKTsKICAgIH0KICB9CiAgcmV0dXJuIGFubm90YXRpb25zOwp9CgpFbnVtU2V0PFByYWdtYUFubm90YXRpb24+IHByb2Nlc3NNZW1iZXJBbm5vdGF0aW9ucygKICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyLAogICAgaXIuTWVtYmVyIG1lbWJlciwKICAgIExpc3Q8UHJhZ21hQW5ub3RhdGlvbkRhdGE+IHByYWdtYUFubm90YXRpb25EYXRhKSB7CiAgRW51bVNldDxQcmFnbWFBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IG5ldyBFbnVtU2V0PFByYWdtYUFubm90YXRpb24+KCk7CgogIFVyaSB1cmkgPSBtZW1iZXIuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmk7CiAgYm9vbCBwbGF0Zm9ybUFubm90YXRpb25zQWxsb3dlZCA9CiAgICAgIG9wdGlvbnMudGVzdE1vZGUgfHwgdXJpLnNjaGVtZSA9PSAnZGFydCcgfHwgbWF5YmVFbmFibGVOYXRpdmUodXJpKTsKCiAgZm9yIChQcmFnbWFBbm5vdGF0aW9uRGF0YSBkYXRhIGluIHByYWdtYUFubm90YXRpb25EYXRhKSB7CiAgICBTdHJpbmcgbmFtZSA9IGRhdGEubmFtZTsKICAgIFN0cmluZyBzdWZmaXggPSBkYXRhLnN1ZmZpeDsKICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKICAgIGZvciAoUHJhZ21hQW5ub3RhdGlvbiBhbm5vdGF0aW9uIGluIFByYWdtYUFubm90YXRpb24udmFsdWVzKSB7CiAgICAgIGlmIChhbm5vdGF0aW9uLm5hbWUgPT0gc3VmZml4KSB7CiAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgIGFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKCiAgICAgICAgaWYgKGRhdGEuaGFzT3B0aW9ucykgewogICAgICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG1lbWJlciksCiAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuR0VORVJJQywKICAgICAgICAgICAgICB7J3RleHQnOiAiQHByYWdtYSgnJG5hbWUnKSBhbm5vdGF0aW9uIGRvZXMgbm90IHRha2Ugb3B0aW9ucyJ9KTsKICAgICAgICB9CiAgICAgICAgaWYgKGFubm90YXRpb24uZm9yRnVuY3Rpb25zT25seSkgewogICAgICAgICAgaWYgKG1lbWJlciBpcyEgaXIuUHJvY2VkdXJlICYmIG1lbWJlciBpcyEgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobWVtYmVyKSwgTWVzc2FnZUtpbmQuR0VORVJJQywgewogICAgICAgICAgICAgICd0ZXh0JzogIkBwcmFnbWEoJyRuYW1lJykgYW5ub3RhdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCAiCiAgICAgICAgICAgICAgICAgICJmb3IgbWV0aG9kcyBhbmQgY29uc3RydWN0b3JzLiIKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChhbm5vdGF0aW9uLmZvckZpZWxkc09ubHkpIHsKICAgICAgICAgIGlmIChtZW1iZXIgaXMhIGlyLkZpZWxkKSB7CiAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG1lbWJlciksIE1lc3NhZ2VLaW5kLkdFTkVSSUMsIHsKICAgICAgICAgICAgICAndGV4dCc6ICJAcHJhZ21hKCckbmFtZScpIGFubm90YXRpb24gaXMgb25seSBzdXBwb3J0ZWQgIgogICAgICAgICAgICAgICAgICAiZm9yIGZpZWxkcy4iCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoYW5ub3RhdGlvbi5pbnRlcm5hbE9ubHkgJiYgIXBsYXRmb3JtQW5ub3RhdGlvbnNBbGxvd2VkKSB7CiAgICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobWVtYmVyKSwKICAgICAgICAgICAgICBNZXNzYWdlS2luZC5HRU5FUklDLAogICAgICAgICAgICAgIHsndGV4dCc6ICJVbnJlY29nbml6ZWQgZGFydDJqcyBwcmFnbWEgQHByYWdtYSgnJG5hbWUnKSJ9KTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghZm91bmQpIHsKICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobWVtYmVyKSwKICAgICAgICAgIE1lc3NhZ2VLaW5kLkdFTkVSSUMsCiAgICAgICAgICB7J3RleHQnOiAiVW5rbm93biBkYXJ0MmpzIHByYWdtYSBAcHJhZ21hKCckbmFtZScpIn0pOwogICAgfQogIH0KCiAgTWFwPFByYWdtYUFubm90YXRpb24sIEVudW1TZXQ8UHJhZ21hQW5ub3RhdGlvbj4+IHJlcG9ydGVkRXhjbHVzaW9ucyA9IHt9OwogIGZvciAoUHJhZ21hQW5ub3RhdGlvbiBhbm5vdGF0aW9uCiAgICAgIGluIGFubm90YXRpb25zLml0ZXJhYmxlKFByYWdtYUFubm90YXRpb24udmFsdWVzKSkgewogICAgU2V0PFByYWdtYUFubm90YXRpb24+IGltcGxpZXMgPSBQcmFnbWFBbm5vdGF0aW9uLmltcGxpZXNbYW5ub3RhdGlvbl07CiAgICBpZiAoaW1wbGllcyAhPSBudWxsKSB7CiAgICAgIGZvciAoUHJhZ21hQW5ub3RhdGlvbiBvdGhlciBpbiBpbXBsaWVzKSB7CiAgICAgICAgaWYgKGFubm90YXRpb25zLmNvbnRhaW5zKG90aGVyKSkgewogICAgICAgICAgcmVwb3J0ZXIucmVwb3J0SGludE1lc3NhZ2UoCiAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobWVtYmVyKSwgTWVzc2FnZUtpbmQuR0VORVJJQywgewogICAgICAgICAgICAndGV4dCc6ICJAcHJhZ21hKCdkYXJ0MmpzOiR7YW5ub3RhdGlvbi5uYW1lfScpIGltcGxpZXMgIgogICAgICAgICAgICAgICAgIkBwcmFnbWEoJ2RhcnQyanM6JHtvdGhlci5uYW1lfScpLiIKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgU2V0PFByYWdtYUFubm90YXRpb24+IGV4Y2x1ZGVzID0gUHJhZ21hQW5ub3RhdGlvbi5leGNsdWRlc1thbm5vdGF0aW9uXTsKICAgIGlmIChleGNsdWRlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoUHJhZ21hQW5ub3RhdGlvbiBvdGhlciBpbiBleGNsdWRlcykgewogICAgICAgIGlmIChhbm5vdGF0aW9ucy5jb250YWlucyhvdGhlcikgJiYKICAgICAgICAgICAgIShyZXBvcnRlZEV4Y2x1c2lvbnNbb3RoZXJdPy5jb250YWlucyhhbm5vdGF0aW9uKSA/PyBmYWxzZSkpIHsKICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShtZW1iZXIpLCBNZXNzYWdlS2luZC5HRU5FUklDLCB7CiAgICAgICAgICAgICd0ZXh0JzogIkBwcmFnbWEoJ2RhcnQyanM6JHthbm5vdGF0aW9uLm5hbWV9JykgbXVzdCBub3QgYmUgdXNlZCAiCiAgICAgICAgICAgICAgICAid2l0aCBAcHJhZ21hKCdkYXJ0MmpzOiR7b3RoZXIubmFtZX0nKS4iCiAgICAgICAgICB9KTsKICAgICAgICAgIChyZXBvcnRlZEV4Y2x1c2lvbnNbYW5ub3RhdGlvbl0gPz89IG5ldyBFbnVtU2V0KCkpLmFkZChvdGhlcik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBTZXQ8UHJhZ21hQW5ub3RhdGlvbj4gcmVxdWlyZXMgPSBQcmFnbWFBbm5vdGF0aW9uLnJlcXVpcmVzW2Fubm90YXRpb25dOwogICAgaWYgKHJlcXVpcmVzICE9IG51bGwpIHsKICAgICAgZm9yIChQcmFnbWFBbm5vdGF0aW9uIG90aGVyIGluIHJlcXVpcmVzKSB7CiAgICAgICAgaWYgKCFhbm5vdGF0aW9ucy5jb250YWlucyhvdGhlcikpIHsKICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShtZW1iZXIpLCBNZXNzYWdlS2luZC5HRU5FUklDLCB7CiAgICAgICAgICAgICd0ZXh0JzogIkBwcmFnbWEoJ2RhcnQyanM6JHthbm5vdGF0aW9uLm5hbWV9Jykgc2hvdWxkIGFsd2F5cyBiZSAiCiAgICAgICAgICAgICAgICAiY29tYmluZWQgd2l0aCBAcHJhZ21hKCdkYXJ0MmpzOiR7b3RoZXIubmFtZX0nKS4iCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGFubm90YXRpb25zOwp9CgphYnN0cmFjdCBjbGFzcyBBbm5vdGF0aW9uc0RhdGEgewogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQW5ub3RhdGlvbnNEYXRhXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IEFubm90YXRpb25zRGF0YS5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywgRGF0YVNvdXJjZSBzb3VyY2UpID0KICAgICAgQW5ub3RhdGlvbnNEYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2U7CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0Fubm90YXRpb25zRGF0YV0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW21lbWJlcl0gaGFzIGFuIGBAcHJhZ21hKCdkYXJ0MmpzOmFzc3VtZUR5bmFtaWMnKWAgYW5ub3RhdGlvbi4KICBib29sIGhhc0Fzc3VtZUR5bmFtaWMoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbWVtYmVyXSBoYXMgYSBgQHByYWdtYSgnZGFydDJqczpub0lubGluZScpYCwgb3IKICAvLy8gYEBwcmFnbWEoJ2RhcnQyanM6bm9JbmxpbmUnKWAgYW5ub3RhdGlvbi4KICBib29sIGhhc05vSW5saW5lKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW21lbWJlcl0gaGFzIGEgYEBwcmFnbWEoJ2RhcnQyanM6dHJ5SW5saW5lJylgLCBvcgogIC8vLyBgQHByYWdtYSgnZGFydDJqczp0cnlJbmxpbmUnKWAgYW5ub3RhdGlvbi4KICBib29sIGhhc1RyeUlubGluZShNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFttZW1iZXJdIGhhcyBhIGBAcHJhZ21hKCdkYXJ0MmpzOmRpc2FibGVGaW5hbCcpYAogIC8vLyBhbm5vdGF0aW9uLgogIGJvb2wgaGFzRGlzYWJsZUZpbmFsKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW21lbWJlcl0gaGFzIGEgYEBwcmFnbWEoJ2RhcnQyanM6bm9FbGlzaW9uJylgCiAgLy8vIGFubm90YXRpb24uCiAgYm9vbCBoYXNOb0VsaXNpb24oTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbWVtYmVyXSBoYXMgYSBgQE5vVGhyb3dzKClgIGFubm90YXRpb24uCiAgYm9vbCBoYXNOb1Rocm93cyhNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFttZW1iZXJdIGhhcyBhIGBATm9TaWRlRWZmZWN0cygpYCBhbm5vdGF0aW9uLgogIGJvb2wgaGFzTm9TaWRlRWZmZWN0cyhNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIENhbGxzIFtmXSBmb3IgYWxsIGZ1bmN0aW9ucyB3aXRoIGEgYEBwcmFnbWEoJ2RhcnQyanM6bm9JbmxpbmUnKWAsIG9yCiAgLy8vIGBAcHJhZ21hKCdkYXJ0MmpzOm5vSW5saW5lJylgIGFubm90YXRpb24uCiAgdm9pZCBmb3JFYWNoTm9JbmxpbmUodm9pZCBmKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKSk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGFsbCBmdW5jdGlvbnMgd2l0aCBhIGBAcHJhZ21hKCdkYXJ0MmpzOnRyeUlubGluZScpYCwgb3IKICAvLy8gYEBwcmFnbWEoJ2RhcnQyanM6dHJ5SW5saW5lJylgIGFubm90YXRpb24uCiAgdm9pZCBmb3JFYWNoVHJ5SW5saW5lKHZvaWQgZihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikpOwoKICAvLy8gQ2FsbHMgW2ZdIGZvciBhbGwgZnVuY3Rpb25zIHdpdGggYSBgQHByYWdtYSgnZGFydDJqczpub1Rocm93cycpYAogIC8vLyBhbm5vdGF0aW9uLgogIHZvaWQgZm9yRWFjaE5vVGhyb3dzKHZvaWQgZihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikpOwoKICAvLy8gQ2FsbHMgW2ZdIGZvciBhbGwgZnVuY3Rpb25zIHdpdGggYSBgQHByYWdtYSgnZGFydDJqczpub1NpZGVFZmZlY3RzJylgCiAgLy8vIGFubm90YXRpb24uCiAgdm9pZCBmb3JFYWNoTm9TaWRlRWZmZWN0cyh2b2lkIGYoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pKTsKCiAgLy8vIFdoYXQgc2hvdWxkIHRoZSBjb21waWxlciBkbyB3aXRoIHBhcmFtZXRlciB0eXBlIGFzc2VydGlvbnMgaW4gW21lbWJlcl0uCiAgLy8vCiAgLy8vIElmIFttZW1iZXJdIGlzIGBudWxsYCwgdGhlIGRlZmF1bHQgcG9saWN5IGlzIHJldHVybmVkLgogIENoZWNrUG9saWN5IGdldFBhcmFtZXRlckNoZWNrUG9saWN5KE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICAvLy8gV2hhdCBzaG91bGQgdGhlIGNvbXBpbGVyIGRvIHdpdGggaW1wbGljaXQgZG93bmNhc3RzIGluIFttZW1iZXJdLgogIC8vLwogIC8vLyBJZiBbbWVtYmVyXSBpcyBgbnVsbGAsIHRoZSBkZWZhdWx0IHBvbGljeSBpcyByZXR1cm5lZC4KICBDaGVja1BvbGljeSBnZXRJbXBsaWNpdERvd25jYXN0Q2hlY2tQb2xpY3koTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBXaGF0IHRoZSBjb21waWxlciBzaG91bGQgZG8gd2l0aCBhIGJvb2xlYW4gdmFsdWUgaW4gYSBjb25kaXRpb24gY29udGV4dAogIC8vLyBpbiBbbWVtYmVyXSB3aGVuIHRoZSBsYW5ndWFnZSBzcGVjaWZpY2F0aW9uIHNheXMgaXQgaXMgYSBydW50aW1lIGVycm9yIGZvcgogIC8vLyBpdCB0byBiZSBudWxsLgogIC8vLwogIC8vLyBJZiBbbWVtYmVyXSBpcyBgbnVsbGAsIHRoZSBkZWZhdWx0IHBvbGljeSBpcyByZXR1cm5lZC4KICBDaGVja1BvbGljeSBnZXRDb25kaXRpb25DaGVja1BvbGljeShNZW1iZXJFbnRpdHkgbWVtYmVyKTsKCiAgLy8vIFdoZXRoZXIgc2hvdWxkIHRoZSBjb21waWxlciBkbyB3aXRoIGV4cGxpY2l0IGNhc3RzIGluIFttZW1iZXJdLgogIC8vLwogIC8vLyBJZiBbbWVtYmVyXSBpcyBgbnVsbGAsIHRoZSBkZWZhdWx0IHBvbGljeSBpcyByZXR1cm5lZC4KICBDaGVja1BvbGljeSBnZXRFeHBsaWNpdENhc3RDaGVja1BvbGljeShNZW1iZXJFbnRpdHkgbWVtYmVyKTsKfQoKY2xhc3MgQW5ub3RhdGlvbnNEYXRhSW1wbCBpbXBsZW1lbnRzIEFubm90YXRpb25zRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtBbm5vdGF0aW9uc0RhdGFdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnYW5ub3RhdGlvbnMtZGF0YSc7CgogIGZpbmFsIENoZWNrUG9saWN5IF9kZWZhdWx0UGFyYW1ldGVyQ2hlY2tQb2xpY3k7CiAgZmluYWwgQ2hlY2tQb2xpY3kgX2RlZmF1bHRJbXBsaWNpdERvd25jYXN0Q2hlY2tQb2xpY3k7CiAgZmluYWwgQ2hlY2tQb2xpY3kgX2RlZmF1bHRDb25kaXRpb25DaGVja1BvbGljeTsKICBmaW5hbCBDaGVja1BvbGljeSBfZGVmYXVsdEV4cGxpY2l0Q2FzdENoZWNrUG9saWN5OwogIGZpbmFsIE1hcDxNZW1iZXJFbnRpdHksIEVudW1TZXQ8UHJhZ21hQW5ub3RhdGlvbj4+IHByYWdtYUFubm90YXRpb25zOwoKICBBbm5vdGF0aW9uc0RhdGFJbXBsKENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLCB0aGlzLnByYWdtYUFubm90YXRpb25zKQogICAgICA6IHRoaXMuX2RlZmF1bHRQYXJhbWV0ZXJDaGVja1BvbGljeSA9IG9wdGlvbnMuZGVmYXVsdFBhcmFtZXRlckNoZWNrUG9saWN5LAogICAgICAgIHRoaXMuX2RlZmF1bHRJbXBsaWNpdERvd25jYXN0Q2hlY2tQb2xpY3kgPQogICAgICAgICAgICBvcHRpb25zLmRlZmF1bHRJbXBsaWNpdERvd25jYXN0Q2hlY2tQb2xpY3ksCiAgICAgICAgdGhpcy5fZGVmYXVsdENvbmRpdGlvbkNoZWNrUG9saWN5ID0gb3B0aW9ucy5kZWZhdWx0Q29uZGl0aW9uQ2hlY2tQb2xpY3ksCiAgICAgICAgdGhpcy5fZGVmYXVsdEV4cGxpY2l0Q2FzdENoZWNrUG9saWN5ID0KICAgICAgICAgICAgb3B0aW9ucy5kZWZhdWx0RXhwbGljaXRDYXN0Q2hlY2tQb2xpY3k7CgogIGZhY3RvcnkgQW5ub3RhdGlvbnNEYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLCBEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBNYXA8TWVtYmVyRW50aXR5LCBFbnVtU2V0PFByYWdtYUFubm90YXRpb24+PiBwcmFnbWFBbm5vdGF0aW9ucyA9CiAgICAgICAgc291cmNlLnJlYWRNZW1iZXJNYXAoCiAgICAgICAgICAgIChNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PiBuZXcgRW51bVNldC5mcm9tVmFsdWUoc291cmNlLnJlYWRJbnQoKSkpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uc0RhdGFJbXBsKG9wdGlvbnMsIHByYWdtYUFubm90YXRpb25zKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXJNYXAocHJhZ21hQW5ub3RhdGlvbnMsCiAgICAgICAgKE1lbWJlckVudGl0eSBtZW1iZXIsIEVudW1TZXQ8UHJhZ21hQW5ub3RhdGlvbj4gc2V0KSB7CiAgICAgIHNpbmsud3JpdGVJbnQoc2V0LnZhbHVlKTsKICAgIH0pOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIGJvb2wgX2hhc1ByYWdtYShNZW1iZXJFbnRpdHkgbWVtYmVyLCBQcmFnbWFBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKICAgIEVudW1TZXQ8UHJhZ21hQW5ub3RhdGlvbj4gc2V0ID0gcHJhZ21hQW5ub3RhdGlvbnNbbWVtYmVyXTsKICAgIHJldHVybiBzZXQgIT0gbnVsbCAmJiBzZXQuY29udGFpbnMoYW5ub3RhdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc0Fzc3VtZUR5bmFtaWMoTWVtYmVyRW50aXR5IG1lbWJlcikgPT4KICAgICAgX2hhc1ByYWdtYShtZW1iZXIsIFByYWdtYUFubm90YXRpb24uYXNzdW1lRHluYW1pYyk7CgogIEBvdmVycmlkZQogIGJvb2wgaGFzTm9JbmxpbmUoTWVtYmVyRW50aXR5IG1lbWJlcikgPT4KICAgICAgX2hhc1ByYWdtYShtZW1iZXIsIFByYWdtYUFubm90YXRpb24ubm9JbmxpbmUpOwoKICBAb3ZlcnJpZGUKICBib29sIGhhc1RyeUlubGluZShNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PgogICAgICBfaGFzUHJhZ21hKG1lbWJlciwgUHJhZ21hQW5ub3RhdGlvbi50cnlJbmxpbmUpOwoKICBAb3ZlcnJpZGUKICBib29sIGhhc0Rpc2FibGVGaW5hbChNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PgogICAgICBfaGFzUHJhZ21hKG1lbWJlciwgUHJhZ21hQW5ub3RhdGlvbi5kaXNhYmxlRmluYWwpOwoKICBAb3ZlcnJpZGUKICBib29sIGhhc05vRWxpc2lvbihNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PgogICAgICBfaGFzUHJhZ21hKG1lbWJlciwgUHJhZ21hQW5ub3RhdGlvbi5ub0VsaXNpb24pOwoKICBAb3ZlcnJpZGUKICBib29sIGhhc05vVGhyb3dzKE1lbWJlckVudGl0eSBtZW1iZXIpID0+CiAgICAgIF9oYXNQcmFnbWEobWVtYmVyLCBQcmFnbWFBbm5vdGF0aW9uLm5vVGhyb3dzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNOb1NpZGVFZmZlY3RzKE1lbWJlckVudGl0eSBtZW1iZXIpID0+CiAgICAgIF9oYXNQcmFnbWEobWVtYmVyLCBQcmFnbWFBbm5vdGF0aW9uLm5vU2lkZUVmZmVjdHMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hOb0lubGluZSh2b2lkIGYoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pKSB7CiAgICBwcmFnbWFBbm5vdGF0aW9ucwogICAgICAgIC5mb3JFYWNoKChNZW1iZXJFbnRpdHkgbWVtYmVyLCBFbnVtU2V0PFByYWdtYUFubm90YXRpb24+IHNldCkgewogICAgICBpZiAoc2V0LmNvbnRhaW5zKFByYWdtYUFubm90YXRpb24ubm9JbmxpbmUpKSB7CiAgICAgICAgZihtZW1iZXIpOwogICAgICB9CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFRyeUlubGluZSh2b2lkIGYoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pKSB7CiAgICBwcmFnbWFBbm5vdGF0aW9ucwogICAgICAgIC5mb3JFYWNoKChNZW1iZXJFbnRpdHkgbWVtYmVyLCBFbnVtU2V0PFByYWdtYUFubm90YXRpb24+IHNldCkgewogICAgICBpZiAoc2V0LmNvbnRhaW5zKFByYWdtYUFubm90YXRpb24udHJ5SW5saW5lKSkgewogICAgICAgIGYobWVtYmVyKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hOb1Rocm93cyh2b2lkIGYoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pKSB7CiAgICBwcmFnbWFBbm5vdGF0aW9ucwogICAgICAgIC5mb3JFYWNoKChNZW1iZXJFbnRpdHkgbWVtYmVyLCBFbnVtU2V0PFByYWdtYUFubm90YXRpb24+IHNldCkgewogICAgICBpZiAoc2V0LmNvbnRhaW5zKFByYWdtYUFubm90YXRpb24ubm9UaHJvd3MpKSB7CiAgICAgICAgZihtZW1iZXIpOwogICAgICB9CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaE5vU2lkZUVmZmVjdHModm9pZCBmKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKSkgewogICAgcHJhZ21hQW5ub3RhdGlvbnMKICAgICAgICAuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlciwgRW51bVNldDxQcmFnbWFBbm5vdGF0aW9uPiBzZXQpIHsKICAgICAgaWYgKHNldC5jb250YWlucyhQcmFnbWFBbm5vdGF0aW9uLm5vU2lkZUVmZmVjdHMpKSB7CiAgICAgICAgZihtZW1iZXIpOwogICAgICB9CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIENoZWNrUG9saWN5IGdldFBhcmFtZXRlckNoZWNrUG9saWN5KE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgIT0gbnVsbCkgewogICAgICBFbnVtU2V0PFByYWdtYUFubm90YXRpb24+IGFubm90YXRpb25zID0gcHJhZ21hQW5ub3RhdGlvbnNbbWVtYmVyXTsKICAgICAgaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKICAgICAgICBpZiAoYW5ub3RhdGlvbnMuY29udGFpbnMoUHJhZ21hQW5ub3RhdGlvbi50eXBlc1RydXN0KSkgewogICAgICAgICAgcmV0dXJuIENoZWNrUG9saWN5LnRydXN0ZWQ7CiAgICAgICAgfSBlbHNlIGlmIChhbm5vdGF0aW9ucy5jb250YWlucyhQcmFnbWFBbm5vdGF0aW9uLnR5cGVzQ2hlY2spKSB7CiAgICAgICAgICByZXR1cm4gQ2hlY2tQb2xpY3kuY2hlY2tlZDsKICAgICAgICB9IGVsc2UgaWYgKGFubm90YXRpb25zLmNvbnRhaW5zKFByYWdtYUFubm90YXRpb24ucGFyYW1ldGVyVHJ1c3QpKSB7CiAgICAgICAgICByZXR1cm4gQ2hlY2tQb2xpY3kudHJ1c3RlZDsKICAgICAgICB9IGVsc2UgaWYgKGFubm90YXRpb25zLmNvbnRhaW5zKFByYWdtYUFubm90YXRpb24ucGFyYW1ldGVyQ2hlY2spKSB7CiAgICAgICAgICByZXR1cm4gQ2hlY2tQb2xpY3kuY2hlY2tlZDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfZGVmYXVsdFBhcmFtZXRlckNoZWNrUG9saWN5OwogIH0KCiAgQG92ZXJyaWRlCiAgQ2hlY2tQb2xpY3kgZ2V0SW1wbGljaXREb3duY2FzdENoZWNrUG9saWN5KE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgIT0gbnVsbCkgewogICAgICBFbnVtU2V0PFByYWdtYUFubm90YXRpb24+IGFubm90YXRpb25zID0gcHJhZ21hQW5ub3RhdGlvbnNbbWVtYmVyXTsKICAgICAgaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKICAgICAgICBpZiAoYW5ub3RhdGlvbnMuY29udGFpbnMoUHJhZ21hQW5ub3RhdGlvbi50eXBlc1RydXN0KSkgewogICAgICAgICAgcmV0dXJuIENoZWNrUG9saWN5LnRydXN0ZWQ7CiAgICAgICAgfSBlbHNlIGlmIChhbm5vdGF0aW9ucy5jb250YWlucyhQcmFnbWFBbm5vdGF0aW9uLnR5cGVzQ2hlY2spKSB7CiAgICAgICAgICByZXR1cm4gQ2hlY2tQb2xpY3kuY2hlY2tlZDsKICAgICAgICB9IGVsc2UgaWYgKGFubm90YXRpb25zLmNvbnRhaW5zKFByYWdtYUFubm90YXRpb24uZG93bmNhc3RUcnVzdCkpIHsKICAgICAgICAgIHJldHVybiBDaGVja1BvbGljeS50cnVzdGVkOwogICAgICAgIH0gZWxzZSBpZiAoYW5ub3RhdGlvbnMuY29udGFpbnMoUHJhZ21hQW5ub3RhdGlvbi5kb3duY2FzdENoZWNrKSkgewogICAgICAgICAgcmV0dXJuIENoZWNrUG9saWN5LmNoZWNrZWQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2RlZmF1bHRJbXBsaWNpdERvd25jYXN0Q2hlY2tQb2xpY3k7CiAgfQoKICBAb3ZlcnJpZGUKICBDaGVja1BvbGljeSBnZXRDb25kaXRpb25DaGVja1BvbGljeShNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyICE9IG51bGwpIHsKICAgICAgRW51bVNldDxQcmFnbWFBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IHByYWdtYUFubm90YXRpb25zW21lbWJlcl07CiAgICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAgICAgICAgaWYgKGFubm90YXRpb25zLmNvbnRhaW5zKFByYWdtYUFubm90YXRpb24udHlwZXNUcnVzdCkpIHsKICAgICAgICAgIHJldHVybiBDaGVja1BvbGljeS50cnVzdGVkOwogICAgICAgIH0gZWxzZSBpZiAoYW5ub3RhdGlvbnMuY29udGFpbnMoUHJhZ21hQW5ub3RhdGlvbi50eXBlc0NoZWNrKSkgewogICAgICAgICAgcmV0dXJuIENoZWNrUG9saWN5LmNoZWNrZWQ7CiAgICAgICAgfSBlbHNlIGlmIChhbm5vdGF0aW9ucy5jb250YWlucyhQcmFnbWFBbm5vdGF0aW9uLmRvd25jYXN0VHJ1c3QpKSB7CiAgICAgICAgICByZXR1cm4gQ2hlY2tQb2xpY3kudHJ1c3RlZDsKICAgICAgICB9IGVsc2UgaWYgKGFubm90YXRpb25zLmNvbnRhaW5zKFByYWdtYUFubm90YXRpb24uZG93bmNhc3RDaGVjaykpIHsKICAgICAgICAgIHJldHVybiBDaGVja1BvbGljeS5jaGVja2VkOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIF9kZWZhdWx0Q29uZGl0aW9uQ2hlY2tQb2xpY3k7CiAgfQoKICBAb3ZlcnJpZGUKICBDaGVja1BvbGljeSBnZXRFeHBsaWNpdENhc3RDaGVja1BvbGljeShNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyICE9IG51bGwpIHsKICAgICAgRW51bVNldDxQcmFnbWFBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IHByYWdtYUFubm90YXRpb25zW21lbWJlcl07CiAgICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAgICAgICAgaWYgKGFubm90YXRpb25zLmNvbnRhaW5zKFByYWdtYUFubm90YXRpb24uYXNUcnVzdCkpIHsKICAgICAgICAgIHJldHVybiBDaGVja1BvbGljeS50cnVzdGVkOwogICAgICAgIH0gZWxzZSBpZiAoYW5ub3RhdGlvbnMuY29udGFpbnMoUHJhZ21hQW5ub3RhdGlvbi5hc0NoZWNrKSkgewogICAgICAgICAgcmV0dXJuIENoZWNrUG9saWN5LmNoZWNrZWQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2RlZmF1bHRFeHBsaWNpdENhc3RDaGVja1BvbGljeTsKICB9Cn0KCmNsYXNzIEFubm90YXRpb25zRGF0YUJ1aWxkZXIgewogIE1hcDxNZW1iZXJFbnRpdHksIEVudW1TZXQ8UHJhZ21hQW5ub3RhdGlvbj4+IHByYWdtYUFubm90YXRpb25zID0ge307CgogIHZvaWQgcmVnaXN0ZXJQcmFnbWFBbm5vdGF0aW9ucygKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwgRW51bVNldDxQcmFnbWFBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucykgewogICAgaWYgKGFubm90YXRpb25zLmlzTm90RW1wdHkpIHsKICAgICAgcHJhZ21hQW5ub3RhdGlvbnNbbWVtYmVyXSA9IGFubm90YXRpb25zOwogICAgfQogIH0KCiAgQW5ub3RhdGlvbnNEYXRhIGNsb3NlKENvbXBpbGVyT3B0aW9ucyBvcHRpb25zKSB7CiAgICByZXR1cm4gbmV3IEFubm90YXRpb25zRGF0YUltcGwob3B0aW9ucywgcHJhZ21hQW5ub3RhdGlvbnMpOwogIH0KfQqCMABOTjwBKAEoARlMIzInJCEaKBouHwEZFBUfHBsBMSUhIgESLBMEAUgrRQFOECxGAUcZMwEsLgFMQlEzAUVPPQZCSBozAUpRTg1IGjMBUDUBUDUBRRg1AUUZNQFJHTUBSR01AUgcNQFIHDUBMQ4PEg8OExMNDRAQFBQTEwUBSDExBUkbGz09JiYkJBgYBUkaHwUCATgkLBwvIzo2NCo1ATM/O0A0ID0+RCIuNQEjQBdPBgQWAgE0HSEWN0sBLyRKATwdIRhDJxYlAR8nNSNOCitGKU5HMhAMCiglKU5HIBAMCkYnNSNJCg8IBhIjMR9ABgQBTCM6ShswKyZMRTQOCggGTBwxK0snTE45DkkKCAZMHDEsJ0xOQg4KCAYEFgIBIT0uOC4BMycBVy4BSTApAUoxKgFJEi0BRhIqAUEpAUYuAUswOQFMMToBRxI5AUwSPgFOBj08AUcGPUMBTlEVBj08AUYGPT8CATdJHTABMjkyNUgBR1EzOFEvNAEyNBdFHk8VQAQBDCgVKz8gCBMEAUY/NAQBDDA6AQwrNQEMLDYBDC85AQwsNgEMKzUBDDA6AQw6Fkg1EwgIBAEMOxZINhMICAQBDDoWSDUTCAgEAQw/Fkg6EwgIBAEMPRpJIUEmSCZMJkwmCggGKQQBDEQaSSFBJkgmSyZLJgoIBjAEAQw9GkkhQSZIJksmSyYKCAYpBAEMQBpJIT4mRSYKCAYsBAIBH0cBIkQiLwYEATNABAIBMHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvYW5ub3RhdGlvbnMuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy91bml2ZXJzZS9tZW1iZXJfdXNhZ2UuZGFydMAAcxEvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0Om1hdGgnIGFzIE1hdGg7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvZW51bXNldC5kYXJ0JzsKaW1wb3J0ICdjYWxsX3N0cnVjdHVyZS5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0VXNhZ2U8VD4gewogIGZpbmFsIEVudW1TZXQ8VD4gX3BlbmRpbmdVc2U7CgogIEFic3RyYWN0VXNhZ2UuY2xvbmVkKHRoaXMuX3BlbmRpbmdVc2UpOwoKICBBYnN0cmFjdFVzYWdlKCkgOiB0aGlzLl9wZW5kaW5nVXNlID0gbmV3IEVudW1TZXQ8VD4oKSB7CiAgICBfcGVuZGluZ1VzZS5hZGRBbGwoX29yaWdpbmFsVXNlKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSB1c2VzIG9mIFtlbnRpdHldIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuCiAgRW51bVNldDxUPiBnZXQgX2FwcGxpZWRVc2UgPT4gX29yaWdpbmFsVXNlLm1pbnVzKF9wZW5kaW5nVXNlKTsKCiAgRW51bVNldDxUPiBnZXQgX29yaWdpbmFsVXNlOwoKICAvLy8gYHRydWVgIGlmIHRoZSBbX2FwcGxpZWRVc2VdIGlzIG5vbi1lbXB0eS4KICBib29sIGdldCBoYXNVc2UgPT4gX2FwcGxpZWRVc2UuaXNOb3RFbXB0eTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtvdGhlcl0gaGFzIHRoZSBzYW1lIG9yaWdpbmFsIGFuZCBwZW5kaW5nIHVzYWdlIGFzIHRoaXMuCiAgYm9vbCBoYXNTYW1lVXNhZ2UoQWJzdHJhY3RVc2FnZTxUPiBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIF9vcmlnaW5hbFVzZS52YWx1ZSA9PSBvdGhlci5fb3JpZ2luYWxVc2UudmFsdWUgJiYKICAgICAgICBfcGVuZGluZ1VzZS52YWx1ZSA9PSBvdGhlci5fcGVuZGluZ1VzZS52YWx1ZTsKICB9Cn0KCi8vLyBSZWdpc3RyeSBmb3IgdGhlIG9ic2VydmVkIHVzZSBvZiBhIG1lbWJlciBbZW50aXR5XSBpbiB0aGUgb3BlbiB3b3JsZC4KYWJzdHJhY3QgY2xhc3MgTWVtYmVyVXNhZ2UgZXh0ZW5kcyBBYnN0cmFjdFVzYWdlPE1lbWJlclVzZT4gewogIC8vLyBDb25zdGFudCBlbXB0eSBhY2Nlc3Mgc2V0IHVzZWQgYXMgdGhlIHBvdGVudGlhbCBhY2Nlc3Mgc2V0IGZvciBpbXBvc3NpYmxlCiAgLy8vIGFjY2Vzc2VzLCBmb3IgaW5zdGFuY2Ugd3JpdGluZyB0byBhIGZpbmFsIGZpZWxkIG9yIGludm9raW5nIGEgc2V0dGVyLgogIHN0YXRpYyBjb25zdCBFbnVtU2V0PEFjY2Vzcz4gZW1wdHlTZXQgPSBjb25zdCBFbnVtU2V0LmZpeGVkKDApOwoKICBmaW5hbCBNZW1iZXJFbnRpdHkgZW50aXR5OwoKICBNZW1iZXJVc2FnZS5pbnRlcm5hbCh0aGlzLmVudGl0eSkgOiBzdXBlcigpOwoKICBNZW1iZXJVc2FnZS5jbG9uZWQodGhpcy5lbnRpdHksIEVudW1TZXQ8TWVtYmVyVXNlPiBwZW5kaW5nVXNlKQogICAgICA6IHN1cGVyLmNsb25lZChwZW5kaW5nVXNlKTsKCiAgZmFjdG9yeSBNZW1iZXJVc2FnZShNZW1iZXJFbnRpdHkgbWVtYmVyLCB7TWVtYmVyQWNjZXNzIHBvdGVudGlhbEFjY2Vzc30pIHsKICAgIC8vLyBDcmVhdGUgdGhlIHNldCBvZiBwb3RlbnRpYWwgYWNjZXNzZXMgdG8gW21lbWJlcl0sIGxpbWl0ZWQgdG8gW29yaWdpbmFsXQogICAgLy8vIGlmIHByb3ZpZGVkLgogICAgRW51bVNldDxBY2Nlc3M+IGNyZWF0ZVBvdGVudGlhbEFjY2Vzc1NldChFbnVtU2V0PEFjY2Vzcz4gb3JpZ2luYWwpIHsKICAgICAgaWYgKG9yaWdpbmFsICE9IG51bGwpIHsKICAgICAgICBpZiAob3JpZ2luYWwuaXNFbXB0eSkgcmV0dXJuIGVtcHR5U2V0OwogICAgICAgIHJldHVybiBvcmlnaW5hbC5jbG9uZSgpOwogICAgICB9CiAgICAgIGlmIChtZW1iZXIuaXNUb3BMZXZlbCB8fCBtZW1iZXIuaXNTdGF0aWMgfHwgbWVtYmVyLmlzQ29uc3RydWN0b3IpIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUcmFjayBzdXBlciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9ucz8KICAgICAgICByZXR1cm4gbmV3IEVudW1TZXQuZnJvbVZhbHVlcyhbQWNjZXNzLnN0YXRpY0FjY2Vzc10pOwogICAgICB9IGVsc2UgaWYgKG1lbWJlci5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgcmV0dXJuIG5ldyBFbnVtU2V0LmZyb21WYWx1ZXMoQWNjZXNzLnZhbHVlcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KG1lbWJlciBpcyBKUmVjb3JkRmllbGQsICJVbmV4cGVjdGVkIG1lbWJlcjogJG1lbWJlciIpOwogICAgICAgIHJldHVybiBuZXcgRW51bVNldCgpOwogICAgICB9CiAgICB9CgogICAgLy8vIENyZWF0ZSB0aGUgc2V0IG9mIHBvdGVudGlhbCByZWFkIGFjY2Vzc2VzIHRvIFttZW1iZXJdLCBsaW1pdGVkIHRvIHJlYWRzCiAgICAvLy8gaW4gW3BvdGVudGlhbEFjY2Vzc10gaWYgcHJvdmlkZWQuCiAgICBFbnVtU2V0PEFjY2Vzcz4gY3JlYXRlUG90ZW50aWFsUmVhZHMoKSB7CiAgICAgIHJldHVybiBjcmVhdGVQb3RlbnRpYWxBY2Nlc3NTZXQocG90ZW50aWFsQWNjZXNzPy5yZWFkcyk7CiAgICB9CgogICAgLy8vIENyZWF0ZSB0aGUgc2V0IG9mIHBvdGVudGlhbCB3cml0ZSBhY2Nlc3NlcyB0byBbbWVtYmVyXSwgbGltaXRlZCB0bwogICAgLy8vIHdyaXRlcyBpbiBbcG90ZW50aWFsQWNjZXNzXSBpZiBwcm92aWRlZC4KICAgIEVudW1TZXQ8QWNjZXNzPiBjcmVhdGVQb3RlbnRpYWxXcml0ZXMoKSB7CiAgICAgIHJldHVybiBjcmVhdGVQb3RlbnRpYWxBY2Nlc3NTZXQocG90ZW50aWFsQWNjZXNzPy53cml0ZXMpOwogICAgfQoKICAgIC8vLyBDcmVhdGUgdGhlIHNldCBvZiBwb3RlbnRpYWwgaW52b2NhdGlvbiBhY2Nlc3NlcyB0byBbbWVtYmVyXSwgbGltaXRlZCB0bwogICAgLy8vIGludm9jYXRpb25zIGluIFtwb3RlbnRpYWxBY2Nlc3NdIGlmIHByb3ZpZGVkLgogICAgRW51bVNldDxBY2Nlc3M+IGNyZWF0ZVBvdGVudGlhbEludm9rZXMoKSB7CiAgICAgIHJldHVybiBjcmVhdGVQb3RlbnRpYWxBY2Nlc3NTZXQocG90ZW50aWFsQWNjZXNzPy5pbnZva2VzKTsKICAgIH0KCiAgICBpZiAobWVtYmVyLmlzRmllbGQpIHsKICAgICAgaWYgKG1lbWJlci5pc0Fzc2lnbmFibGUpIHsKICAgICAgICByZXR1cm4gbmV3IEZpZWxkVXNhZ2UobWVtYmVyLAogICAgICAgICAgICBwb3RlbnRpYWxSZWFkczogY3JlYXRlUG90ZW50aWFsUmVhZHMoKSwKICAgICAgICAgICAgcG90ZW50aWFsV3JpdGVzOiBjcmVhdGVQb3RlbnRpYWxXcml0ZXMoKSwKICAgICAgICAgICAgcG90ZW50aWFsSW52b2tlczogY3JlYXRlUG90ZW50aWFsSW52b2tlcygpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IEZpZWxkVXNhZ2UobWVtYmVyLAogICAgICAgICAgICBwb3RlbnRpYWxSZWFkczogY3JlYXRlUG90ZW50aWFsUmVhZHMoKSwKICAgICAgICAgICAgcG90ZW50aWFsV3JpdGVzOiBlbXB0eVNldCwKICAgICAgICAgICAgcG90ZW50aWFsSW52b2tlczogY3JlYXRlUG90ZW50aWFsSW52b2tlcygpKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChtZW1iZXIuaXNHZXR0ZXIpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVVzYWdlKG1lbWJlciwKICAgICAgICAgIHBvdGVudGlhbFJlYWRzOiBjcmVhdGVQb3RlbnRpYWxSZWFkcygpLAogICAgICAgICAgcG90ZW50aWFsV3JpdGVzOiBlbXB0eVNldCwKICAgICAgICAgIHBvdGVudGlhbEludm9rZXM6IGNyZWF0ZVBvdGVudGlhbEludm9rZXMoKSk7CiAgICB9IGVsc2UgaWYgKG1lbWJlci5pc1NldHRlcikgewogICAgICByZXR1cm4gbmV3IFByb3BlcnR5VXNhZ2UobWVtYmVyLAogICAgICAgICAgcG90ZW50aWFsUmVhZHM6IGVtcHR5U2V0LAogICAgICAgICAgcG90ZW50aWFsV3JpdGVzOiBjcmVhdGVQb3RlbnRpYWxXcml0ZXMoKSwKICAgICAgICAgIHBvdGVudGlhbEludm9rZXM6IGVtcHR5U2V0KTsKICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzQ29uc3RydWN0b3IpIHsKICAgICAgcmV0dXJuIG5ldyBNZXRob2RVc2FnZShtZW1iZXIsCiAgICAgICAgICBwb3RlbnRpYWxSZWFkczogZW1wdHlTZXQsIHBvdGVudGlhbEludm9rZXM6IGNyZWF0ZVBvdGVudGlhbEludm9rZXMoKSk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQobWVtYmVyIGlzIEZ1bmN0aW9uRW50aXR5LAogICAgICAgICAgZmFpbGVkQXQobWVtYmVyLCAiVW5leHBlY3RlZCBtZW1iZXI6ICRtZW1iZXIiKSk7CiAgICAgIHJldHVybiBuZXcgTWV0aG9kVXNhZ2UobWVtYmVyLAogICAgICAgICAgcG90ZW50aWFsUmVhZHM6IGNyZWF0ZVBvdGVudGlhbFJlYWRzKCksCiAgICAgICAgICBwb3RlbnRpYWxJbnZva2VzOiBjcmVhdGVQb3RlbnRpYWxJbnZva2VzKCkpOwogICAgfQogIH0KCiAgLy8vIGB0cnVlYCBpZiBbZW50aXR5XSBoYXMgYmVlbiBpbml0aWFsaXplZC4KICBib29sIGdldCBoYXNJbml0ID0+IHRydWU7CgogIC8vLyBUaGUgc2V0IG9mIGNvbnN0YW50IGluaXRpYWwgdmFsdWVzIGZvciBhIGZpZWxkLgogIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IGdldCBpbml0aWFsQ29uc3RhbnRzID0+IG51bGw7CgogIC8vLyBgdHJ1ZWAgaWYgW2VudGl0eV0gaGFzIGJlZW4gcmVhZCBhcyBhIHZhbHVlLiBGb3IgYSBmaWVsZCB0aGlzIGlzIGEgbm9ybWFsCiAgLy8vIHJlYWQgYWNjZXNzLCBmb3IgYSBmdW5jdGlvbiB0aGlzIGlzIGEgY2xvc3VyaXphdGlvbi4KICBib29sIGdldCBoYXNSZWFkID0+IHJlYWRzLmlzTm90RW1wdHk7CgogIC8vLyBUaGUgc2V0IG9mIHBvdGVudGlhbCByZWFkIGFjY2Vzc2VzIHRvIHRoaXMgbWVtYmVyIHRoYXQgaGF2ZSBub3QgeWV0CiAgLy8vIGJlZW4gcmVnaXN0ZXJlZC4KICBFbnVtU2V0PEFjY2Vzcz4gZ2V0IHBvdGVudGlhbFJlYWRzID0+IGNvbnN0IEVudW1TZXQuZml4ZWQoMCk7CgogIC8vLyBUaGUgc2V0IG9mIHJlZ2lzdGVyZWQgcmVhZCBhY2Nlc3NlcyB0byB0aGlzIG1lbWJlci4KICBFbnVtU2V0PEFjY2Vzcz4gZ2V0IHJlYWRzID0+IGNvbnN0IEVudW1TZXQuZml4ZWQoMCk7CgogIC8vLyBgdHJ1ZWAgaWYgYSB2YWx1ZSBoYXMgYmVlbiB3cml0dGVuIHRvIFtlbnRpdHldLgogIGJvb2wgZ2V0IGhhc1dyaXRlID0+IHdyaXRlcy5pc05vdEVtcHR5OwoKICAvLy8gVGhlIHNldCBvZiBwb3RlbnRpYWwgd3JpdGUgYWNjZXNzZXMgdG8gdGhpcyBtZW1iZXIgdGhhdCBoYXZlIG5vdCB5ZXQKICAvLy8gYmVlbiByZWdpc3RlcmVkLgogIEVudW1TZXQ8QWNjZXNzPiBnZXQgcG90ZW50aWFsV3JpdGVzID0+IGNvbnN0IEVudW1TZXQuZml4ZWQoMCk7CgogIC8vLyBUaGUgc2V0IG9mIHJlZ2lzdGVyZWQgd3JpdGUgYWNjZXNzZXMgdG8gdGhpcyBtZW1iZXIuCiAgRW51bVNldDxBY2Nlc3M+IGdldCB3cml0ZXMgPT4gY29uc3QgRW51bVNldC5maXhlZCgwKTsKCiAgLy8vIGB0cnVlYCBpZiBhbiBpbnZvY2F0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZCBvbiB0aGUgdmFsdWUgW2VudGl0eV0uIEZvciBhCiAgLy8vIGZ1bmN0aW9uIHRoaXMgaXMgYSBub3JtYWwgaW52b2NhdGlvbiwgZm9yIGEgZmllbGQgdGhpcyBpcyBhIHJlYWQgYWNjZXNzCiAgLy8vIGZvbGxvd2VkIGJ5IGFuIGludm9jYXRpb24gb2YgdGhlIGZ1bmN0aW9uLWxpa2UgdmFsdWUuCiAgYm9vbCBnZXQgaGFzSW52b2tlID0+IGludm9rZXMuaXNOb3RFbXB0eTsKCiAgLy8vIFRoZSBzZXQgb2YgcG90ZW50aWFsIGludm9jYXRpb24gYWNjZXNzZXMgdG8gdGhpcyBtZW1iZXIgdGhhdCBoYXZlIG5vdCB5ZXQKICAvLy8gYmVlbiByZWdpc3RlcmVkLgogIEVudW1TZXQ8QWNjZXNzPiBnZXQgcG90ZW50aWFsSW52b2tlcyA9PiBjb25zdCBFbnVtU2V0LmZpeGVkKDApOwoKICAvLy8gVGhlIHNldCBvZiByZWdpc3RlcmVkIGludm9jYXRpb24gYWNjZXNzZXMgdG8gdGhpcyBtZW1iZXIuCiAgRW51bVNldDxBY2Nlc3M+IGdldCBpbnZva2VzID0+IGNvbnN0IEVudW1TZXQuZml4ZWQoMCk7CgogIC8vLyBSZXR1cm5zIHRoZSBbUGFyYW1ldGVyU3RydWN0dXJlXSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXJhbWV0ZXJzIHRoYXQgYXJlCiAgLy8vIHVzZWQgaW4gaW52b2NhdGlvbnMgb2YgW2VudGl0eV0uIEZvciBhIGZpZWxkLCBnZXR0ZXIgb3Igc2V0dGVyIHRoaXMgaXMKICAvLy8gYWx3YXlzIGBudWxsYC4KICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgZ2V0IGludm9rZWRQYXJhbWV0ZXJzID0+IG51bGw7CgogIC8vLyBXaGV0aGVyIHRoaXMgbWVtYmVyIGhhcyBhbnkgcG90ZW50aWFsIGJ1dCB1bnJlZ2lzdGVyZWQgZHluYW1pYyByZWFkcywKICAvLy8gd3JpdGVzIG9yIGludm9jYXRpb25zLgogIGJvb2wgZ2V0IGhhc1BlbmRpbmdEeW5hbWljVXNlID0+CiAgICAgIGhhc1BlbmRpbmdEeW5hbWljSW52b2tlIHx8CiAgICAgIGhhc1BlbmRpbmdEeW5hbWljUmVhZCB8fAogICAgICBoYXNQZW5kaW5nRHluYW1pY1dyaXRlOwoKICAvLy8gV2hldGhlciB0aGlzIG1lbWJlciBoYXMgYW55IHBvdGVudGlhbCBidXQgdW5yZWdpc3RlcmVkIGR5bmFtaWMKICAvLy8gaW52b2NhdGlvbnMuCiAgYm9vbCBnZXQgaGFzUGVuZGluZ0R5bmFtaWNJbnZva2UgPT4KICAgICAgcG90ZW50aWFsSW52b2tlcy5jb250YWlucyhBY2Nlc3MuZHluYW1pY0FjY2Vzcyk7CgogIC8vLyBXaGV0aGVyIHRoaXMgbWVtYmVyIGhhcyBhbnkgcG90ZW50aWFsIGJ1dCB1bnJlZ2lzdGVyZWQgZHluYW1pYyByZWFkcy4KICBib29sIGdldCBoYXNQZW5kaW5nRHluYW1pY1JlYWQgPT4KICAgICAgcG90ZW50aWFsUmVhZHMuY29udGFpbnMoQWNjZXNzLmR5bmFtaWNBY2Nlc3MpOwoKICAvLy8gV2hldGhlciB0aGlzIG1lbWJlciBoYXMgYW55IHBvdGVudGlhbCBidXQgdW5yZWdpc3RlcmVkIGR5bmFtaWMgd3JpdGVzLgogIGJvb2wgZ2V0IGhhc1BlbmRpbmdEeW5hbWljV3JpdGUgPT4KICAgICAgcG90ZW50aWFsV3JpdGVzLmNvbnRhaW5zKEFjY2Vzcy5keW5hbWljQWNjZXNzKTsKCiAgLy8vIFJlZ2lzdGVycyB0aGUgW2VudGl0eV0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYW5kIHJldHVybnMgdGhlIG5ldwogIC8vLyBbTWVtYmVyVXNlXXMgdGhhdCBpdCBjYXVzZWQuCiAgLy8vCiAgLy8vIEZvciBhIGZpZWxkIHRoaXMgaXMgdGhlIGluaXRpYWwgd3JpdGUgYWNjZXNzLCBmb3IgYSBmdW5jdGlvbiB0aGlzIGlzIGEKICAvLy8gbm8tb3AuCiAgRW51bVNldDxNZW1iZXJVc2U+IGluaXQoKSA9PiBNZW1iZXJVc2VzLk5PTkU7CgogIC8vLyBSZWdpc3RlcnMgdGhlIFtlbnRpdHldIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggW2NvbnN0YW50XSBhbmQgcmV0dXJucwogIC8vLyB0aGUgbmV3IFtNZW1iZXJVc2VdcyB0aGF0IGl0IGNhdXNlZC4KICAvLy8KICAvLy8gRm9yIGEgZmllbGQgdGhpcyBpcyB0aGUgaW5pdGlhbCB3cml0ZSBhY2Nlc3MsIGZvciBhIGZ1bmN0aW9uIHRoaXMgaXMgYQogIC8vLyBuby1vcC4KICBFbnVtU2V0PE1lbWJlclVzZT4gY29uc3RhbnRJbml0KENvbnN0YW50VmFsdWUgY29uc3RhbnQpID0+IE1lbWJlclVzZXMuTk9ORTsKCiAgLy8vIFJlZ2lzdGVycyBhIHJlYWQgb2YgdGhlIHZhbHVlIG9mIFtlbnRpdHldIGFuZCByZXR1cm5zIHRoZSBuZXcgW01lbWJlclVzZV1zCiAgLy8vIHRoYXQgaXQgY2F1c2VkLgogIC8vLwogIC8vLyBGb3IgYSBmaWVsZCB0aGlzIGlzIGEgbm9ybWFsIHJlYWQgYWNjZXNzLCBmb3IgYSBmdW5jdGlvbiB0aGlzIGlzIGEKICAvLy8gY2xvc3VyaXphdGlvbi4KICBFbnVtU2V0PE1lbWJlclVzZT4gcmVhZChFbnVtU2V0PEFjY2Vzcz4gYWNjZXNzZXMpID0+IE1lbWJlclVzZXMuTk9ORTsKCiAgLy8vIFJlZ2lzdGVycyBhIHdyaXRlIG9mIGEgdmFsdWUgdG8gW2VudGl0eV0gYW5kIHJldHVybnMgdGhlIG5ldyBbTWVtYmVyVXNlXXMKICAvLy8gdGhhdCBpdCBjYXVzZWQuCiAgRW51bVNldDxNZW1iZXJVc2U+IHdyaXRlKEVudW1TZXQ8QWNjZXNzPiBhY2Nlc3NlcykgPT4gTWVtYmVyVXNlcy5OT05FOwoKICAvLy8gUmVnaXN0ZXJzIGFuIGludm9jYXRpb24gb24gdGhlIHZhbHVlIG9mIFtlbnRpdHldIGFuZCByZXR1cm5zIHRoZSBuZXcKICAvLy8gW01lbWJlclVzZV1zIHRoYXQgaXQgY2F1c2VkLgogIC8vLwogIC8vLyBGb3IgYSBmdW5jdGlvbiB0aGlzIGlzIGEgbm9ybWFsIGludm9jYXRpb24sIGZvciBhIGZpZWxkIHRoaXMgaXMgYSByZWFkCiAgLy8vIGFjY2VzcyBmb2xsb3dlZCBieSBhbiBpbnZvY2F0aW9uIG9mIHRoZSBmdW5jdGlvbi1saWtlIHZhbHVlLgogIEVudW1TZXQ8TWVtYmVyVXNlPiBpbnZva2UoCiAgICAgICAgICBFbnVtU2V0PEFjY2Vzcz4gYWNjZXNzZXMsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgPT4KICAgICAgTWVtYmVyVXNlcy5OT05FOwoKICBAb3ZlcnJpZGUKICBFbnVtU2V0PE1lbWJlclVzZT4gZ2V0IF9vcmlnaW5hbFVzZSA9PiBNZW1iZXJVc2VzLk5PUk1BTF9PTkxZOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGVudGl0eS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBNZW1iZXJVc2FnZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGVudGl0eSA9PSBvdGhlci5lbnRpdHk7CiAgfQoKICBNZW1iZXJVc2FnZSBjbG9uZSgpOwoKICBib29sIGRhdGFFcXVhbHMoTWVtYmVyVXNhZ2Ugb3RoZXIpIHsKICAgIGFzc2VydChlbnRpdHkgPT0gb3RoZXIuZW50aXR5KTsKICAgIHJldHVybiBoYXNJbml0ID09IG90aGVyLmhhc0luaXQgJiYKICAgICAgICBoYXNSZWFkID09IG90aGVyLmhhc1JlYWQgJiYKICAgICAgICBoYXNJbnZva2UgPT0gb3RoZXIuaGFzSW52b2tlICYmCiAgICAgICAgaGFzV3JpdGUgPT0gb3RoZXIuaGFzV3JpdGUgJiYKICAgICAgICBoYXNQZW5kaW5nRHluYW1pY1JlYWQgPT0gb3RoZXIuaGFzUGVuZGluZ0R5bmFtaWNSZWFkICYmCiAgICAgICAgaGFzUGVuZGluZ0R5bmFtaWNXcml0ZSA9PSBvdGhlci5oYXNQZW5kaW5nRHluYW1pY1dyaXRlICYmCiAgICAgICAgaGFzUGVuZGluZ0R5bmFtaWNJbnZva2UgPT0gb3RoZXIuaGFzUGVuZGluZ0R5bmFtaWNJbnZva2UgJiYKICAgICAgICBoYXNQZW5kaW5nRHluYW1pY1VzZSA9PSBvdGhlci5oYXNQZW5kaW5nRHluYW1pY1VzZSAmJgogICAgICAgIF9wZW5kaW5nVXNlID09IG90aGVyLl9wZW5kaW5nVXNlICYmCiAgICAgICAgX2FwcGxpZWRVc2UgPT0gb3RoZXIuX2FwcGxpZWRVc2UgJiYKICAgICAgICByZWFkcyA9PSBvdGhlci5yZWFkcyAmJgogICAgICAgIHdyaXRlcyA9PSBvdGhlci53cml0ZXMgJiYKICAgICAgICBpbnZva2VzID09IG90aGVyLmludm9rZXMgJiYKICAgICAgICBwb3RlbnRpYWxSZWFkcyA9PSBvdGhlci5wb3RlbnRpYWxSZWFkcyAmJgogICAgICAgIHBvdGVudGlhbFdyaXRlcyA9PSBvdGhlci5wb3RlbnRpYWxXcml0ZXMgJiYKICAgICAgICBwb3RlbnRpYWxJbnZva2VzID09IG90aGVyLnBvdGVudGlhbEludm9rZXMgJiYKICAgICAgICBpbnZva2VkUGFyYW1ldGVycyA9PSBvdGhlci5pbnZva2VkUGFyYW1ldGVyczsKICB9Cn0KCi8vLyBNZW1iZXIgdXNhZ2UgdHJhY2tpbmcgZm9yIGEgZ2V0dGVyIG9yIHNldHRlci4KY2xhc3MgUHJvcGVydHlVc2FnZSBleHRlbmRzIE1lbWJlclVzYWdlIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBFbnVtU2V0PEFjY2Vzcz4gcG90ZW50aWFsUmVhZHM7CgogIEBvdmVycmlkZQogIGZpbmFsIEVudW1TZXQ8QWNjZXNzPiBwb3RlbnRpYWxXcml0ZXM7CgogIEBvdmVycmlkZQogIGZpbmFsIEVudW1TZXQ8QWNjZXNzPiBwb3RlbnRpYWxJbnZva2VzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBFbnVtU2V0PEFjY2Vzcz4gcmVhZHM7CgogIEBvdmVycmlkZQogIGZpbmFsIEVudW1TZXQ8QWNjZXNzPiB3cml0ZXM7CgogIEBvdmVycmlkZQogIGZpbmFsIEVudW1TZXQ8QWNjZXNzPiBpbnZva2VzOwoKICBQcm9wZXJ0eVVzYWdlLmNsb25lZChNZW1iZXJFbnRpdHkgbWVtYmVyLCBFbnVtU2V0PE1lbWJlclVzZT4gcGVuZGluZ1VzZSwKICAgICAge3RoaXMucG90ZW50aWFsUmVhZHMsCiAgICAgIHRoaXMucG90ZW50aWFsV3JpdGVzLAogICAgICB0aGlzLnBvdGVudGlhbEludm9rZXMsCiAgICAgIHRoaXMucmVhZHMsCiAgICAgIHRoaXMud3JpdGVzLAogICAgICB0aGlzLmludm9rZXN9KQogICAgICA6IGFzc2VydChwb3RlbnRpYWxSZWFkcyAhPSBudWxsKSwKICAgICAgICBhc3NlcnQocG90ZW50aWFsV3JpdGVzICE9IG51bGwpLAogICAgICAgIGFzc2VydChwb3RlbnRpYWxJbnZva2VzICE9IG51bGwpLAogICAgICAgIGFzc2VydChyZWFkcyAhPSBudWxsKSwKICAgICAgICBhc3NlcnQod3JpdGVzICE9IG51bGwpLAogICAgICAgIGFzc2VydChpbnZva2VzICE9IG51bGwpLAogICAgICAgIHN1cGVyLmNsb25lZChtZW1iZXIsIHBlbmRpbmdVc2UpOwoKICBQcm9wZXJ0eVVzYWdlKE1lbWJlckVudGl0eSBtZW1iZXIsCiAgICAgIHt0aGlzLnBvdGVudGlhbFJlYWRzLCB0aGlzLnBvdGVudGlhbFdyaXRlcywgdGhpcy5wb3RlbnRpYWxJbnZva2VzfSkKICAgICAgOiByZWFkcyA9IG5ldyBFbnVtU2V0KCksCiAgICAgICAgd3JpdGVzID0gbmV3IEVudW1TZXQoKSwKICAgICAgICBpbnZva2VzID0gbmV3IEVudW1TZXQoKSwKICAgICAgICBhc3NlcnQocG90ZW50aWFsUmVhZHMgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KHBvdGVudGlhbFdyaXRlcyAhPSBudWxsKSwKICAgICAgICBhc3NlcnQocG90ZW50aWFsSW52b2tlcyAhPSBudWxsKSwKICAgICAgICBzdXBlci5pbnRlcm5hbChtZW1iZXIpOwoKICBAb3ZlcnJpZGUKICBFbnVtU2V0PE1lbWJlclVzZT4gcmVhZChFbnVtU2V0PEFjY2Vzcz4gYWNjZXNzZXMpIHsKICAgIGJvb2wgYWxyZWFkeUhhc1JlYWQgPSBoYXNSZWFkOwogICAgcmVhZHMuYWRkQWxsKHBvdGVudGlhbFJlYWRzLnJlbW92ZUFsbChhY2Nlc3NlcykpOwogICAgaWYgKGFscmVhZHlIYXNSZWFkKSB7CiAgICAgIHJldHVybiBNZW1iZXJVc2VzLk5PTkU7CiAgICB9CiAgICByZXR1cm4gX3BlbmRpbmdVc2UucmVtb3ZlQWxsKE1lbWJlclVzZXMuTk9STUFMX09OTFkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IHdyaXRlKEVudW1TZXQ8QWNjZXNzPiBhY2Nlc3NlcykgewogICAgYm9vbCBhbHJlYWR5SGFzV3JpdGUgPSBoYXNXcml0ZTsKICAgIHdyaXRlcy5hZGRBbGwocG90ZW50aWFsV3JpdGVzLnJlbW92ZUFsbChhY2Nlc3NlcykpOwogICAgaWYgKGFscmVhZHlIYXNXcml0ZSkgewogICAgICByZXR1cm4gTWVtYmVyVXNlcy5OT05FOwogICAgfQogICAgcmV0dXJuIF9wZW5kaW5nVXNlLnJlbW92ZUFsbChNZW1iZXJVc2VzLk5PUk1BTF9PTkxZKTsKICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBpbnZva2UoCiAgICAgIEVudW1TZXQ8QWNjZXNzPiBhY2Nlc3NlcywgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICAvLyBXZSB1c2UgYGhhc1JlYWRgIGhlcmUgaW5zdGVhZCBvZiBgaGFzSW52b2tlYCBiZWNhdXNlIGdldHRlcnMgb25seSBoYXZlCiAgICAvLyAnbm9ybWFsIHVzZScgKHRoZXkgY2Fubm90IGJlIGNsb3N1cml6ZWQpLiBUaGlzIG1lYW5zIHRoYXQgaW52b2tpbmcgYW4KICAgIC8vIGFscmVhZHkgcmVhZCBnZXR0ZXIgZG9lcyBub3QgcmVzdWx0IGEgbmV3IG1lbWJlciB1c2UuCiAgICBib29sIGFscmVhZHlIYXNSZWFkID0gaGFzUmVhZDsKICAgIHJlYWRzLmFkZEFsbChwb3RlbnRpYWxSZWFkcy5yZW1vdmVBbGwoQWNjZXNzZXMuc3RhdGljQWNjZXNzKSk7CiAgICBpbnZva2VzLmFkZEFsbChwb3RlbnRpYWxJbnZva2VzLnJlbW92ZUFsbChhY2Nlc3NlcykpOwogICAgaWYgKGFscmVhZHlIYXNSZWFkKSB7CiAgICAgIHJldHVybiBNZW1iZXJVc2VzLk5PTkU7CiAgICB9CiAgICByZXR1cm4gX3BlbmRpbmdVc2UucmVtb3ZlQWxsKE1lbWJlclVzZXMuTk9STUFMX09OTFkpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyVXNhZ2UgY2xvbmUoKSB7CiAgICByZXR1cm4gbmV3IFByb3BlcnR5VXNhZ2UuY2xvbmVkKGVudGl0eSwgX3BlbmRpbmdVc2UuY2xvbmUoKSwKICAgICAgICBwb3RlbnRpYWxSZWFkczogcG90ZW50aWFsUmVhZHMuY2xvbmUoKSwKICAgICAgICBwb3RlbnRpYWxXcml0ZXM6IHBvdGVudGlhbFdyaXRlcy5jbG9uZSgpLAogICAgICAgIHBvdGVudGlhbEludm9rZXM6IHBvdGVudGlhbEludm9rZXMuY2xvbmUoKSwKICAgICAgICByZWFkczogcmVhZHMuY2xvbmUoKSwKICAgICAgICB3cml0ZXM6IHdyaXRlcy5jbG9uZSgpLAogICAgICAgIGludm9rZXM6IGludm9rZXMuY2xvbmUoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnUHJvcGVydHlVc2FnZSgkZW50aXR5LCcKICAgICAgJ3JlYWRzPSR7cmVhZHMuaXRlcmFibGUoQWNjZXNzLnZhbHVlcyl9LCcKICAgICAgJ3dyaXRlcz0ke3dyaXRlcy5pdGVyYWJsZShBY2Nlc3MudmFsdWVzKX0sJwogICAgICAnaW52b2tlcz0ke2ludm9rZXMuaXRlcmFibGUoQWNjZXNzLnZhbHVlcyl9LCcKICAgICAgJ3BvdGVudGlhbFJlYWRzPSR7cG90ZW50aWFsUmVhZHMuaXRlcmFibGUoQWNjZXNzLnZhbHVlcyl9LCcKICAgICAgJ3BvdGVudGlhbFdyaXRlcz0ke3BvdGVudGlhbFdyaXRlcy5pdGVyYWJsZShBY2Nlc3MudmFsdWVzKX0sJwogICAgICAncG90ZW50aWFsSW52b2tlcz0ke3BvdGVudGlhbEludm9rZXMuaXRlcmFibGUoQWNjZXNzLnZhbHVlcyl9LCcKICAgICAgJ3BlbmRpbmdVc2U9JHtfcGVuZGluZ1VzZS5pdGVyYWJsZShNZW1iZXJVc2UudmFsdWVzKX0sJwogICAgICAnaW5pdGlhbENvbnN0YW50cz0ke2luaXRpYWxDb25zdGFudHM/Lm1hcCgoYykgPT4gYy50b1N0cnVjdHVyZWRUZXh0KCkpfSknOwp9CgovLy8gTWVtYmVyIHVzYWdlIHRyYWNraW5nIGZvciBhIGZpZWxkLgpjbGFzcyBGaWVsZFVzYWdlIGV4dGVuZHMgTWVtYmVyVXNhZ2UgewogIEBvdmVycmlkZQogIGJvb2wgaGFzSW5pdDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgRW51bVNldDxBY2Nlc3M+IHBvdGVudGlhbFJlYWRzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBFbnVtU2V0PEFjY2Vzcz4gcG90ZW50aWFsV3JpdGVzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBFbnVtU2V0PEFjY2Vzcz4gcG90ZW50aWFsSW52b2tlczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgRW51bVNldDxBY2Nlc3M+IHJlYWRzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBFbnVtU2V0PEFjY2Vzcz4gaW52b2tlczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgRW51bVNldDxBY2Nlc3M+IHdyaXRlczsKCiAgTGlzdDxDb25zdGFudFZhbHVlPiBfaW5pdGlhbENvbnN0YW50czsKCiAgRmllbGRVc2FnZS5jbG9uZWQoRmllbGRFbnRpdHkgZmllbGQsIEVudW1TZXQ8TWVtYmVyVXNlPiBwZW5kaW5nVXNlLAogICAgICB7dGhpcy5wb3RlbnRpYWxSZWFkcywKICAgICAgdGhpcy5wb3RlbnRpYWxXcml0ZXMsCiAgICAgIHRoaXMucG90ZW50aWFsSW52b2tlcywKICAgICAgdGhpcy5oYXNJbml0LAogICAgICB0aGlzLnJlYWRzLAogICAgICB0aGlzLndyaXRlcywKICAgICAgdGhpcy5pbnZva2VzfSkKICAgICAgOiBhc3NlcnQocG90ZW50aWFsUmVhZHMgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KHBvdGVudGlhbFdyaXRlcyAhPSBudWxsKSwKICAgICAgICBhc3NlcnQocG90ZW50aWFsSW52b2tlcyAhPSBudWxsKSwKICAgICAgICBhc3NlcnQocmVhZHMgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KHdyaXRlcyAhPSBudWxsKSwKICAgICAgICBhc3NlcnQoaW52b2tlcyAhPSBudWxsKSwKICAgICAgICBzdXBlci5jbG9uZWQoZmllbGQsIHBlbmRpbmdVc2UpOwoKICBGaWVsZFVzYWdlKEZpZWxkRW50aXR5IGZpZWxkLAogICAgICB7dGhpcy5wb3RlbnRpYWxSZWFkcywgdGhpcy5wb3RlbnRpYWxXcml0ZXMsIHRoaXMucG90ZW50aWFsSW52b2tlc30pCiAgICAgIDogaGFzSW5pdCA9IGZhbHNlLAogICAgICAgIHJlYWRzID0gbmV3IEVudW1TZXQoKSwKICAgICAgICB3cml0ZXMgPSBuZXcgRW51bVNldCgpLAogICAgICAgIGludm9rZXMgPSBuZXcgRW51bVNldCgpLAogICAgICAgIGFzc2VydChwb3RlbnRpYWxSZWFkcyAhPSBudWxsKSwKICAgICAgICBhc3NlcnQocG90ZW50aWFsV3JpdGVzICE9IG51bGwpLAogICAgICAgIGFzc2VydChwb3RlbnRpYWxJbnZva2VzICE9IG51bGwpLAogICAgICAgIHN1cGVyLmludGVybmFsKGZpZWxkKTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gZ2V0IGluaXRpYWxDb25zdGFudHMgPT4gX2luaXRpYWxDb25zdGFudHMgPz8gY29uc3QgW107CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBpbml0KCkgewogICAgaWYgKGhhc0luaXQpIHsKICAgICAgcmV0dXJuIE1lbWJlclVzZXMuTk9ORTsKICAgIH0KICAgIGhhc0luaXQgPSB0cnVlOwogICAgcmV0dXJuIF9wZW5kaW5nVXNlLnJlbW92ZUFsbChNZW1iZXJVc2VzLk5PUk1BTF9PTkxZKTsKICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBjb25zdGFudEluaXQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgX2luaXRpYWxDb25zdGFudHMgPz89IFtdOwogICAgX2luaXRpYWxDb25zdGFudHMuYWRkKGNvbnN0YW50KTsKICAgIHJldHVybiBpbml0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNSZWFkID0+IHJlYWRzLmlzTm90RW1wdHk7CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiByZWFkKEVudW1TZXQ8QWNjZXNzPiBhY2Nlc3NlcykgewogICAgYm9vbCBhbHJlYWR5SGFzUmVhZCA9IGhhc1JlYWQ7CiAgICByZWFkcy5hZGRBbGwocG90ZW50aWFsUmVhZHMucmVtb3ZlQWxsKGFjY2Vzc2VzKSk7CiAgICBpZiAoYWxyZWFkeUhhc1JlYWQpIHsKICAgICAgcmV0dXJuIE1lbWJlclVzZXMuTk9ORTsKICAgIH0KICAgIHJldHVybiBfcGVuZGluZ1VzZS5yZW1vdmVBbGwoTWVtYmVyVXNlcy5OT1JNQUxfT05MWSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNXcml0ZSA9PiB3cml0ZXMuaXNOb3RFbXB0eTsKCiAgQG92ZXJyaWRlCiAgRW51bVNldDxNZW1iZXJVc2U+IHdyaXRlKEVudW1TZXQ8QWNjZXNzPiBhY2Nlc3NlcykgewogICAgYm9vbCBhbHJlYWR5SGFzV3JpdGUgPSBoYXNXcml0ZTsKICAgIHdyaXRlcy5hZGRBbGwocG90ZW50aWFsV3JpdGVzLnJlbW92ZUFsbChhY2Nlc3NlcykpOwogICAgaWYgKGFscmVhZHlIYXNXcml0ZSkgewogICAgICByZXR1cm4gTWVtYmVyVXNlcy5OT05FOwogICAgfQogICAgcmV0dXJuIF9wZW5kaW5nVXNlLnJlbW92ZUFsbChNZW1iZXJVc2VzLk5PUk1BTF9PTkxZKTsKICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBpbnZva2UoCiAgICAgIEVudW1TZXQ8QWNjZXNzPiBhY2Nlc3NlcywgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICAvLyBXZSB1c2UgYGhhc1JlYWRgIGhlcmUgaW5zdGVhZCBvZiBgaGFzSW52b2tlYCBiZWNhdXNlIGZpZWxkcyBvbmx5IGhhdmUKICAgIC8vICdub3JtYWwgdXNlJyAodGhleSBjYW5ub3QgYmUgY2xvc3VyaXplZCkuIFRoaXMgbWVhbnMgdGhhdCBpbnZva2luZyBhbgogICAgLy8gYWxyZWFkeSByZWFkIGZpZWxkIGRvZXMgbm90IHJlc3VsdCBhIG5ldyBtZW1iZXIgdXNlLgogICAgYm9vbCBhbHJlYWR5SGFzUmVhZCA9IGhhc1JlYWQ7CiAgICByZWFkcy5hZGRBbGwocG90ZW50aWFsUmVhZHMucmVtb3ZlQWxsKEFjY2Vzc2VzLnN0YXRpY0FjY2VzcykpOwogICAgaW52b2tlcy5hZGRBbGwocG90ZW50aWFsSW52b2tlcy5yZW1vdmVBbGwoYWNjZXNzZXMpKTsKICAgIGlmIChhbHJlYWR5SGFzUmVhZCkgewogICAgICByZXR1cm4gTWVtYmVyVXNlcy5OT05FOwogICAgfQogICAgcmV0dXJuIF9wZW5kaW5nVXNlLnJlbW92ZUFsbChNZW1iZXJVc2VzLk5PUk1BTF9PTkxZKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlclVzYWdlIGNsb25lKCkgewogICAgcmV0dXJuIG5ldyBGaWVsZFVzYWdlLmNsb25lZChlbnRpdHksIF9wZW5kaW5nVXNlLmNsb25lKCksCiAgICAgICAgcG90ZW50aWFsUmVhZHM6IHBvdGVudGlhbFJlYWRzLmNsb25lKCksCiAgICAgICAgcG90ZW50aWFsV3JpdGVzOiBwb3RlbnRpYWxXcml0ZXMuY2xvbmUoKSwKICAgICAgICBwb3RlbnRpYWxJbnZva2VzOiBwb3RlbnRpYWxJbnZva2VzLmNsb25lKCksCiAgICAgICAgaGFzSW5pdDogaGFzSW5pdCwKICAgICAgICByZWFkczogcmVhZHMuY2xvbmUoKSwKICAgICAgICB3cml0ZXM6IHdyaXRlcy5jbG9uZSgpLAogICAgICAgIGludm9rZXM6IGludm9rZXMuY2xvbmUoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRmllbGRVc2FnZSgkZW50aXR5LGhhc0luaXQ9JGhhc0luaXQsJwogICAgICAncmVhZHM9JHtyZWFkcy5pdGVyYWJsZShBY2Nlc3MudmFsdWVzKX0sJwogICAgICAnd3JpdGVzPSR7d3JpdGVzLml0ZXJhYmxlKEFjY2Vzcy52YWx1ZXMpfSwnCiAgICAgICdpbnZva2VzPSR7aW52b2tlcy5pdGVyYWJsZShBY2Nlc3MudmFsdWVzKX0sJwogICAgICAncG90ZW50aWFsUmVhZHM9JHtwb3RlbnRpYWxSZWFkcy5pdGVyYWJsZShBY2Nlc3MudmFsdWVzKX0sJwogICAgICAncG90ZW50aWFsV3JpdGVzPSR7cG90ZW50aWFsV3JpdGVzLml0ZXJhYmxlKEFjY2Vzcy52YWx1ZXMpfSwnCiAgICAgICdwb3RlbnRpYWxJbnZva2VzPSR7cG90ZW50aWFsSW52b2tlcy5pdGVyYWJsZShBY2Nlc3MudmFsdWVzKX0sJwogICAgICAncGVuZGluZ1VzZT0ke19wZW5kaW5nVXNlLml0ZXJhYmxlKE1lbWJlclVzZS52YWx1ZXMpfSwnCiAgICAgICdpbml0aWFsQ29uc3RhbnRzPSR7aW5pdGlhbENvbnN0YW50cy5tYXAoKGMpID0+IGMudG9TdHJ1Y3R1cmVkVGV4dCgpKX0pJzsKfQoKLy8vIE1lbWJlciB1c2FnZSB0cmFja2luZyBmb3IgYSBjb25zdHJ1Y3RvciBvciBtZXRob2QuCmNsYXNzIE1ldGhvZFVzYWdlIGV4dGVuZHMgTWVtYmVyVXNhZ2UgewogIEBvdmVycmlkZQogIGZpbmFsIEVudW1TZXQ8QWNjZXNzPiBwb3RlbnRpYWxSZWFkczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgRW51bVNldDxBY2Nlc3M+IHBvdGVudGlhbEludm9rZXM7CgogIEBvdmVycmlkZQogIGZpbmFsIEVudW1TZXQ8QWNjZXNzPiByZWFkczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgRW51bVNldDxBY2Nlc3M+IGludm9rZXM7CgogIGZpbmFsIFBhcmFtZXRlclVzYWdlIHBhcmFtZXRlclVzYWdlOwoKICBNZXRob2RVc2FnZS5jbG9uZWQoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24sIHRoaXMucGFyYW1ldGVyVXNhZ2UsCiAgICAgIEVudW1TZXQ8TWVtYmVyVXNlPiBwZW5kaW5nVXNlLAogICAgICB7dGhpcy5wb3RlbnRpYWxSZWFkcywgdGhpcy5yZWFkcywgdGhpcy5wb3RlbnRpYWxJbnZva2VzLCB0aGlzLmludm9rZXN9KQogICAgICA6IGFzc2VydChwb3RlbnRpYWxSZWFkcyAhPSBudWxsKSwKICAgICAgICBhc3NlcnQocG90ZW50aWFsSW52b2tlcyAhPSBudWxsKSwKICAgICAgICBhc3NlcnQocmVhZHMgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KGludm9rZXMgIT0gbnVsbCksCiAgICAgICAgc3VwZXIuY2xvbmVkKGZ1bmN0aW9uLCBwZW5kaW5nVXNlKTsKCiAgTWV0aG9kVXNhZ2UoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24sCiAgICAgIHt0aGlzLnBvdGVudGlhbFJlYWRzLCB0aGlzLnBvdGVudGlhbEludm9rZXN9KQogICAgICA6IHJlYWRzID0gbmV3IEVudW1TZXQoKSwKICAgICAgICBpbnZva2VzID0gbmV3IEVudW1TZXQoKSwKICAgICAgICBwYXJhbWV0ZXJVc2FnZSA9IG5ldyBQYXJhbWV0ZXJVc2FnZShmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUpLAogICAgICAgIGFzc2VydChwb3RlbnRpYWxSZWFkcyAhPSBudWxsKSwKICAgICAgICBhc3NlcnQocG90ZW50aWFsSW52b2tlcyAhPSBudWxsKSwKICAgICAgICBzdXBlci5pbnRlcm5hbChmdW5jdGlvbik7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGhhc0ludm9rZSA9PiBpbnZva2VzLmlzTm90RW1wdHkgJiYgcGFyYW1ldGVyVXNhZ2UuaGFzSW52b2tlOwoKICBAb3ZlcnJpZGUKICBFbnVtU2V0PE1lbWJlclVzZT4gZ2V0IF9vcmlnaW5hbFVzZSA9PgogICAgICBlbnRpdHkuaXNJbnN0YW5jZU1lbWJlciA/IE1lbWJlclVzZXMuQUxMX0lOU1RBTkNFIDogTWVtYmVyVXNlcy5BTExfU1RBVElDOwoKICBAb3ZlcnJpZGUKICBFbnVtU2V0PE1lbWJlclVzZT4gcmVhZChFbnVtU2V0PEFjY2Vzcz4gYWNjZXNzZXMpIHsKICAgIGJvb2wgYWxyZWFkeUhhc0ludm9rZSA9IGhhc0ludm9rZTsKICAgIGJvb2wgYWxyZWFkeUhhc1JlYWQgPSBoYXNSZWFkOwogICAgcmVhZHMuYWRkQWxsKHBvdGVudGlhbFJlYWRzLnJlbW92ZUFsbChhY2Nlc3NlcykpOwogICAgaW52b2tlcy5hZGRBbGwocG90ZW50aWFsSW52b2tlcy5yZW1vdmVBbGwoQWNjZXNzZXMuZHluYW1pY0FjY2VzcykpOwogICAgcGFyYW1ldGVyVXNhZ2UuZnVsbHlVc2UoKTsKICAgIGlmIChhbHJlYWR5SGFzSW52b2tlKSB7CiAgICAgIGlmIChhbHJlYWR5SGFzUmVhZCkgewogICAgICAgIHJldHVybiBNZW1iZXJVc2VzLk5PTkU7CiAgICAgIH0KICAgICAgcmV0dXJuIF9wZW5kaW5nVXNlLnJlbW92ZUFsbChlbnRpdHkuaXNJbnN0YW5jZU1lbWJlcgogICAgICAgICAgPyBNZW1iZXJVc2VzLkNMT1NVUklaRV9JTlNUQU5DRV9PTkxZCiAgICAgICAgICA6IE1lbWJlclVzZXMuQ0xPU1VSSVpFX1NUQVRJQ19PTkxZKTsKICAgIH0gZWxzZSBpZiAoYWxyZWFkeUhhc1JlYWQpIHsKICAgICAgcmV0dXJuIF9wZW5kaW5nVXNlLnJlbW92ZUFsbChNZW1iZXJVc2VzLk5PUk1BTF9PTkxZKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfcGVuZGluZ1VzZS5yZW1vdmVBbGwoZW50aXR5LmlzSW5zdGFuY2VNZW1iZXIKICAgICAgICAgID8gTWVtYmVyVXNlcy5BTExfSU5TVEFOQ0UKICAgICAgICAgIDogTWVtYmVyVXNlcy5BTExfU1RBVElDKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8TWVtYmVyVXNlPiBpbnZva2UoCiAgICAgIEVudW1TZXQ8QWNjZXNzPiBhY2Nlc3NlcywgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICBib29sIGFscmVhZHlIYXNJbnZva2UgPSBoYXNJbnZva2U7CiAgICBwYXJhbWV0ZXJVc2FnZS5pbnZva2UoY2FsbFN0cnVjdHVyZSk7CiAgICBpbnZva2VzLmFkZEFsbChwb3RlbnRpYWxJbnZva2VzLnJlbW92ZUFsbChhY2Nlc3NlcykpOwogICAgaWYgKGFscmVhZHlIYXNJbnZva2UpIHsKICAgICAgcmV0dXJuIE1lbWJlclVzZXMuTk9ORTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfcGVuZGluZ1VzZQogICAgICAgICAgLnJlbW92ZUFsbChoYXNSZWFkID8gTWVtYmVyVXNlcy5OT05FIDogTWVtYmVyVXNlcy5OT1JNQUxfT05MWSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgZ2V0IGludm9rZWRQYXJhbWV0ZXJzID0+IHBhcmFtZXRlclVzYWdlLmludm9rZWRQYXJhbWV0ZXJzOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNQZW5kaW5nRHluYW1pY0ludm9rZSA9PgogICAgICBwb3RlbnRpYWxJbnZva2VzLmNvbnRhaW5zKEFjY2Vzcy5keW5hbWljQWNjZXNzKSB8fAogICAgICAoaW52b2tlcy5jb250YWlucyhBY2Nlc3MuZHluYW1pY0FjY2VzcykgJiYgIXBhcmFtZXRlclVzYWdlLmlzRnVsbHlVc2VkKTsKCiAgQG92ZXJyaWRlCiAgTWVtYmVyVXNhZ2UgY2xvbmUoKSB7CiAgICByZXR1cm4gbmV3IE1ldGhvZFVzYWdlLmNsb25lZCgKICAgICAgICBlbnRpdHksIHBhcmFtZXRlclVzYWdlLmNsb25lKCksIF9wZW5kaW5nVXNlLmNsb25lKCksCiAgICAgICAgcmVhZHM6IHJlYWRzLmNsb25lKCksCiAgICAgICAgcG90ZW50aWFsUmVhZHM6IHBvdGVudGlhbFJlYWRzLmNsb25lKCksCiAgICAgICAgaW52b2tlczogaW52b2tlcy5jbG9uZSgpLAogICAgICAgIHBvdGVudGlhbEludm9rZXM6IHBvdGVudGlhbEludm9rZXMuY2xvbmUoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnTWV0aG9kVXNhZ2UoJGVudGl0eSwnCiAgICAgICdyZWFkcz0ke3JlYWRzLml0ZXJhYmxlKEFjY2Vzcy52YWx1ZXMpfSwnCiAgICAgICdpbnZva2VzPSR7aW52b2tlcy5pdGVyYWJsZShBY2Nlc3MudmFsdWVzKX0sJwogICAgICAncGFyYW1ldGVyVXNhZ2U9JHtwYXJhbWV0ZXJVc2FnZX0sJwogICAgICAncG90ZW50aWFsUmVhZHM9JHtwb3RlbnRpYWxSZWFkcy5pdGVyYWJsZShBY2Nlc3MudmFsdWVzKX0sJwogICAgICAncG90ZW50aWFsSW52b2tlcz0ke3BvdGVudGlhbEludm9rZXMuaXRlcmFibGUoQWNjZXNzLnZhbHVlcyl9LCcKICAgICAgJ3BlbmRpbmdVc2U9JHtfcGVuZGluZ1VzZS5pdGVyYWJsZShNZW1iZXJVc2UudmFsdWVzKX0pJzsKfQoKLy8vIEVudW0gY2xhc3MgZm9yIHRoZSBwb3NzaWJsZSBraW5kIG9mIHVzZSBvZiBbTWVtYmVyRW50aXR5XSBvYmplY3RzLgplbnVtIE1lbWJlclVzZSB7CiAgLy8vIFJlYWQgb3Igd3JpdGUgb2YgYSBmaWVsZCwgb3IgaW52b2NhdGlvbiBvZiBhIG1ldGhvZC4KICBOT1JNQUwsCgogIC8vLyBUZWFyLW9mZiBvZiBhbiBpbnN0YW5jZSBtZXRob2QuCiAgQ0xPU1VSSVpFX0lOU1RBTkNFLAoKICAvLy8gVGVhci1vZmYgb2YgYSBzdGF0aWMgbWV0aG9kLgogIENMT1NVUklaRV9TVEFUSUMsCn0KCi8vLyBDb21tb24gW0VudW1TZXRdcyB1c2VkIGZvciBbTWVtYmVyVXNlXS4KY2xhc3MgTWVtYmVyVXNlcyB7CiAgc3RhdGljIGNvbnN0IEVudW1TZXQ8TWVtYmVyVXNlPiBOT05FID0gY29uc3QgRW51bVNldDxNZW1iZXJVc2U+LmZpeGVkKDApOwogIHN0YXRpYyBjb25zdCBFbnVtU2V0PE1lbWJlclVzZT4gTk9STUFMX09OTFkgPQogICAgICBjb25zdCBFbnVtU2V0PE1lbWJlclVzZT4uZml4ZWQoMSk7CiAgc3RhdGljIGNvbnN0IEVudW1TZXQ8TWVtYmVyVXNlPiBDTE9TVVJJWkVfSU5TVEFOQ0VfT05MWSA9CiAgICAgIGNvbnN0IEVudW1TZXQ8TWVtYmVyVXNlPi5maXhlZCgyKTsKICBzdGF0aWMgY29uc3QgRW51bVNldDxNZW1iZXJVc2U+IENMT1NVUklaRV9TVEFUSUNfT05MWSA9CiAgICAgIGNvbnN0IEVudW1TZXQ8TWVtYmVyVXNlPi5maXhlZCg0KTsKICBzdGF0aWMgY29uc3QgRW51bVNldDxNZW1iZXJVc2U+IEFMTF9JTlNUQU5DRSA9CiAgICAgIGNvbnN0IEVudW1TZXQ8TWVtYmVyVXNlPi5maXhlZCgzKTsKICBzdGF0aWMgY29uc3QgRW51bVNldDxNZW1iZXJVc2U+IEFMTF9TVEFUSUMgPQogICAgICBjb25zdCBFbnVtU2V0PE1lbWJlclVzZT4uZml4ZWQoNSk7Cn0KCnR5cGVkZWYgdm9pZCBNZW1iZXJVc2VkQ2FsbGJhY2soTWVtYmVyRW50aXR5IG1lbWJlciwgRW51bVNldDxNZW1iZXJVc2U+IHVzZVNldCk7CgovLy8gUmVnaXN0cnkgZm9yIHRoZSBvYnNlcnZlZCB1c2Ugb2YgYSBjbGFzcyBbZW50aXR5XSBpbiB0aGUgb3BlbiB3b3JsZC4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWVyZ2UgdGhpcyB3aXRoIFtJbnN0YW50aWF0aW9uSW5mb10uCmNsYXNzIENsYXNzVXNhZ2UgZXh0ZW5kcyBBYnN0cmFjdFVzYWdlPENsYXNzVXNlPiB7CiAgYm9vbCBpc0luc3RhbnRpYXRlZCA9IGZhbHNlOwogIGJvb2wgaXNJbXBsZW1lbnRlZCA9IGZhbHNlOwoKICBmaW5hbCBDbGFzc0VudGl0eSBjbHM7CgogIENsYXNzVXNhZ2UodGhpcy5jbHMpIDogc3VwZXIoKTsKCiAgRW51bVNldDxDbGFzc1VzZT4gaW5zdGFudGlhdGUoKSB7CiAgICBpZiAoaXNJbnN0YW50aWF0ZWQpIHsKICAgICAgcmV0dXJuIENsYXNzVXNlcy5OT05FOwogICAgfQogICAgaXNJbnN0YW50aWF0ZWQgPSB0cnVlOwogICAgcmV0dXJuIF9wZW5kaW5nVXNlLnJlbW92ZUFsbChDbGFzc1VzZXMuSU5TVEFOVElBVEVEX09OTFkpOwogIH0KCiAgRW51bVNldDxDbGFzc1VzZT4gaW1wbGVtZW50KCkgewogICAgaWYgKGlzSW1wbGVtZW50ZWQpIHsKICAgICAgcmV0dXJuIENsYXNzVXNlcy5OT05FOwogICAgfQogICAgaXNJbXBsZW1lbnRlZCA9IHRydWU7CiAgICByZXR1cm4gX3BlbmRpbmdVc2UucmVtb3ZlQWxsKENsYXNzVXNlcy5JTVBMRU1FTlRFRF9PTkxZKTsKICB9CgogIEBvdmVycmlkZQogIEVudW1TZXQ8Q2xhc3NVc2U+IGdldCBfb3JpZ2luYWxVc2UgPT4gQ2xhc3NVc2VzLkFMTDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRjbHM6JHtfYXBwbGllZFVzZS5pdGVyYWJsZShDbGFzc1VzZS52YWx1ZXMpfSc7Cn0KCi8vLyBFbnVtIGNsYXNzIGZvciB0aGUgcG9zc2libGUga2luZCBvZiB1c2Ugb2YgW0NsYXNzRW50aXR5XSBvYmplY3RzLgplbnVtIENsYXNzVXNlIHsgSU5TVEFOVElBVEVELCBJTVBMRU1FTlRFRCB9CgovLy8gQ29tbW9uIFtFbnVtU2V0XXMgdXNlZCBmb3IgW0NsYXNzVXNlXS4KY2xhc3MgQ2xhc3NVc2VzIHsKICBzdGF0aWMgY29uc3QgRW51bVNldDxDbGFzc1VzZT4gTk9ORSA9IGNvbnN0IEVudW1TZXQ8Q2xhc3NVc2U+LmZpeGVkKDApOwogIHN0YXRpYyBjb25zdCBFbnVtU2V0PENsYXNzVXNlPiBJTlNUQU5USUFURURfT05MWSA9CiAgICAgIGNvbnN0IEVudW1TZXQ8Q2xhc3NVc2U+LmZpeGVkKDEpOwogIHN0YXRpYyBjb25zdCBFbnVtU2V0PENsYXNzVXNlPiBJTVBMRU1FTlRFRF9PTkxZID0KICAgICAgY29uc3QgRW51bVNldDxDbGFzc1VzZT4uZml4ZWQoMik7CiAgc3RhdGljIGNvbnN0IEVudW1TZXQ8Q2xhc3NVc2U+IEFMTCA9IGNvbnN0IEVudW1TZXQ8Q2xhc3NVc2U+LmZpeGVkKDMpOwp9Cgp0eXBlZGVmIHZvaWQgQ2xhc3NVc2VkQ2FsbGJhY2soQ2xhc3NFbnRpdHkgY2xzLCBFbnVtU2V0PENsYXNzVXNlPiB1c2VTZXQpOwoKLy8vIE9iamVjdCB1c2VkIGZvciB0cmFja2luZyBwYXJhbWV0ZXIgdXNlIGluIGNvbnN0cnVjdG9yIGFuZCBtZXRob2QKLy8vIGludm9jYXRpb25zLgpjbGFzcyBQYXJhbWV0ZXJVc2FnZSB7CiAgLy8vIFRoZSBvcmlnaW5hbCBwYXJhbWV0ZXIgc3RydWN0dXJlIG9mIHRoZSBtZXRob2Qgb3IgY29uc3RydWN0b3IuCiAgZmluYWwgUGFyYW1ldGVyU3RydWN0dXJlIF9wYXJhbWV0ZXJTdHJ1Y3R1cmU7CgogIC8vLyBgdHJ1ZWAgaWYgdGhlIG1ldGhvZCBvciBjb25zdHJ1Y3RvciBoYXMgYXQgbGVhc3Qgb25lIGludm9jYXRpb24uCiAgYm9vbCBfaGFzSW52b2tlOwoKICAvLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIChvcHRpb25hbCkgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHByb3ZpZGVkIGluCiAgLy8vIGludm9jYXRpb25zIG9mIHRoZSBtZXRob2Qgb3IgY29uc3RydWN0b3IuCiAgLy8vCiAgLy8vIElmIGFsbCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgaGF2aW5nIGJlZW4gcHJvdmlkZWQgdGhpcyBpcyBzZXQgdG8gYG51bGxgLgogIGludCBfcHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVyczsKCiAgLy8vIGB0cnVlYCBpZiBhbGwgdHlwZSBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBwcm92aWRlZCBpbiBhdCBsZWFzdCBvbmUKICAvLy8gaW52b2NhdGlvbiBvZiB0aGUgbWV0aG9kIG9yIGNvbnN0cnVjdG9yLgogIGJvb2wgX2FyZUFsbFR5cGVQYXJhbWV0ZXJzUHJvdmlkZWQ7CgogIC8vLyBUaGUgc2V0IG9mIG5hbWVkIHBhcmFtZXRlcnMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBwcm92aWRlZCBpbiBhbnkKICAvLy8gaW52b2NhdGlvbiBvZiB0aGUgbWV0aG9kIG9yIGNvbnN0cnVjdG9yLgogIC8vLwogIC8vLyBJZiBhbGwgbmFtZWQgcGFyYW1ldGVycyBoYXZlIGJlZW4gcHJvdmlkZWQgdGhpcyBpcyBzZXQgdG8gYG51bGxgLgogIFNldDxTdHJpbmc+IF91bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzOwoKICBQYXJhbWV0ZXJVc2FnZSh0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmUpIHsKICAgIF9oYXNJbnZva2UgPSBmYWxzZTsKICAgIF9hcmVBbGxUeXBlUGFyYW1ldGVyc1Byb3ZpZGVkID0gX3BhcmFtZXRlclN0cnVjdHVyZS50eXBlUGFyYW1ldGVycyA9PSAwOwogICAgX3Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnMgPSBfcGFyYW1ldGVyU3RydWN0dXJlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzID09CiAgICAgICAgICAgIF9wYXJhbWV0ZXJTdHJ1Y3R1cmUucmVxdWlyZWRQYXJhbWV0ZXJzCiAgICAgICAgPyBudWxsCiAgICAgICAgOiAwOwogICAgaWYgKCFfcGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgIF91bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzID0KICAgICAgICAgIG5ldyBTZXQ8U3RyaW5nPi5mcm9tKF9wYXJhbWV0ZXJTdHJ1Y3R1cmUubmFtZWRQYXJhbWV0ZXJzKTsKICAgIH0KICB9CgogIFBhcmFtZXRlclVzYWdlLmNsb25lZCh0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgIHtib29sIGhhc0ludm9rZSwKICAgICAgaW50IHByb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgIGJvb2wgYXJlQWxsVHlwZVBhcmFtZXRlcnNQcm92aWRlZCwKICAgICAgU2V0PFN0cmluZz4gdW5wcm92aWRlZE5hbWVkUGFyYW1ldGVyc30pCiAgICAgIDogX2hhc0ludm9rZSA9IGhhc0ludm9rZSwKICAgICAgICBfcHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVycyA9IHByb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgX2FyZUFsbFR5cGVQYXJhbWV0ZXJzUHJvdmlkZWQgPSBhcmVBbGxUeXBlUGFyYW1ldGVyc1Byb3ZpZGVkLAogICAgICAgIF91bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzID0gdW5wcm92aWRlZE5hbWVkUGFyYW1ldGVyczsKCiAgYm9vbCBpbnZva2UoQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICBpZiAoaXNGdWxseVVzZWQpIHJldHVybiBmYWxzZTsKICAgIF9oYXNJbnZva2UgPSB0cnVlOwogICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CiAgICBpZiAoX3Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBpbnQgbmV3UHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVycyA9IE1hdGgubWF4KAogICAgICAgICAgX3Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnMsIGNhbGxTdHJ1Y3R1cmUucG9zaXRpb25hbEFyZ3VtZW50Q291bnQpOwogICAgICBjaGFuZ2VkIHw9CiAgICAgICAgICBuZXdQcm92aWRlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzICE9IF9wcm92aWRlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgICBfcHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVycyA9IG5ld1Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnM7CiAgICAgIGlmIChfcHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVycyA+PQogICAgICAgICAgX3BhcmFtZXRlclN0cnVjdHVyZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICAgIF9wcm92aWRlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKF91bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzICE9IG51bGwgJiYKICAgICAgICBjYWxsU3RydWN0dXJlLm5hbWVkQXJndW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgaW50IF9wcm92aWRlZE5hbWVkUGFyYW1ldGVyc0NvdW50ID0gX3VucHJvdmlkZWROYW1lZFBhcmFtZXRlcnMubGVuZ3RoOwogICAgICBfdW5wcm92aWRlZE5hbWVkUGFyYW1ldGVycy5yZW1vdmVBbGwoY2FsbFN0cnVjdHVyZS5uYW1lZEFyZ3VtZW50cyk7CiAgICAgIGNoYW5nZWQgfD0KICAgICAgICAgIF9wcm92aWRlZE5hbWVkUGFyYW1ldGVyc0NvdW50ICE9IF91bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsKICAgICAgaWYgKF91bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgICBfdW5wcm92aWRlZE5hbWVkUGFyYW1ldGVycyA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIGlmICghX2FyZUFsbFR5cGVQYXJhbWV0ZXJzUHJvdmlkZWQgJiYgY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudCA+IDApIHsKICAgICAgX2FyZUFsbFR5cGVQYXJhbWV0ZXJzUHJvdmlkZWQgPSB0cnVlOwogICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBjaGFuZ2VkOwogIH0KCiAgYm9vbCBnZXQgaGFzSW52b2tlID0+IF9oYXNJbnZva2U7CgogIGJvb2wgZ2V0IGlzRnVsbHlVc2VkID0+CiAgICAgIF9oYXNJbnZva2UgJiYKICAgICAgX3Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnMgPT0gbnVsbCAmJgogICAgICBfdW5wcm92aWRlZE5hbWVkUGFyYW1ldGVycyA9PSBudWxsICYmCiAgICAgIF9hcmVBbGxUeXBlUGFyYW1ldGVyc1Byb3ZpZGVkOwoKICB2b2lkIGZ1bGx5VXNlKCkgewogICAgX2hhc0ludm9rZSA9IHRydWU7CiAgICBfcHJvdmlkZWRQb3NpdGlvbmFsUGFyYW1ldGVycyA9IG51bGw7CiAgICBfdW5wcm92aWRlZE5hbWVkUGFyYW1ldGVycyA9IG51bGw7CiAgICBfYXJlQWxsVHlwZVBhcmFtZXRlcnNQcm92aWRlZCA9IHRydWU7CiAgfQoKICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgZ2V0IGludm9rZWRQYXJhbWV0ZXJzIHsKICAgIGlmICghX2hhc0ludm9rZSkgcmV0dXJuIG51bGw7CiAgICBpZiAoaXNGdWxseVVzZWQpIHJldHVybiBfcGFyYW1ldGVyU3RydWN0dXJlOwogICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmUoCiAgICAgICAgX3BhcmFtZXRlclN0cnVjdHVyZS5yZXF1aXJlZFBhcmFtZXRlcnMsCiAgICAgICAgX3Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnMgPz8KICAgICAgICAgICAgX3BhcmFtZXRlclN0cnVjdHVyZS5wb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgICBfdW5wcm92aWRlZE5hbWVkUGFyYW1ldGVycyA9PSBudWxsCiAgICAgICAgICAgID8gX3BhcmFtZXRlclN0cnVjdHVyZS5uYW1lZFBhcmFtZXRlcnMKICAgICAgICAgICAgOiBfcGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycwogICAgICAgICAgICAgICAgLndoZXJlKChuKSA9PiAhX3VucHJvdmlkZWROYW1lZFBhcmFtZXRlcnMuY29udGFpbnMobikpCiAgICAgICAgICAgICAgICAudG9MaXN0KCksCiAgICAgICAgX2FyZUFsbFR5cGVQYXJhbWV0ZXJzUHJvdmlkZWQgPyBfcGFyYW1ldGVyU3RydWN0dXJlLnR5cGVQYXJhbWV0ZXJzIDogMCk7CiAgfQoKICBQYXJhbWV0ZXJVc2FnZSBjbG9uZSgpIHsKICAgIHJldHVybiBuZXcgUGFyYW1ldGVyVXNhZ2UuY2xvbmVkKF9wYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgaGFzSW52b2tlOiBfaGFzSW52b2tlLAogICAgICAgIHByb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnM6IF9wcm92aWRlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgIGFyZUFsbFR5cGVQYXJhbWV0ZXJzUHJvdmlkZWQ6IF9hcmVBbGxUeXBlUGFyYW1ldGVyc1Byb3ZpZGVkLAogICAgICAgIHVucHJvdmlkZWROYW1lZFBhcmFtZXRlcnM6IF91bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzPy50b1NldCgpKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnUGFyYW1ldGVyVXNhZ2UoJwogICAgICAgICdfaGFzSW52b2tlPSRfaGFzSW52b2tlLCcKICAgICAgICAnX3Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnM9JF9wcm92aWRlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzLCcKICAgICAgICAnX2FyZUFsbFR5cGVQYXJhbWV0ZXJzUHJvdmlkZWQ9JF9hcmVBbGxUeXBlUGFyYW1ldGVyc1Byb3ZpZGVkLCcKICAgICAgICAnX3VucHJvdmlkZWROYW1lZFBhcmFtZXRlcnM9JF91bnByb3ZpZGVkTmFtZWRQYXJhbWV0ZXJzKSc7CiAgfQp9CgovLy8gRW51bSBmb3IgbWVtYmVyIGFjY2VzcyBraW5kcyB1c2UgaW4gW01lbWJlclVzYWdlXSBjb21wdXRhdGlvbiBkdXJpbmcKLy8vIHJlc29sdXRpb24gb3IgY29kZWdlbiBlbnF1ZXVlaW5nLgplbnVtIEFjY2VzcyB7CiAgLy8vIFN0YXRpY2FsbHkgYm91bmQgYWNjZXNzIG9mIGEgbWVtYmVyLgogIHN0YXRpY0FjY2VzcywKCiAgLy8vIER5bmFtaWNhbGx5IGJvdW5kIGFjY2VzcyBvZiBhIG1lbWJlci4KICBkeW5hbWljQWNjZXNzLAoKICAvLy8gRGlyZWN0IGFjY2VzcyBvZiBhIHN1cGVyIGNsYXNzIG1lbWJlci4KICBzdXBlckFjY2VzcywKfQoKLy8vIEFjY2VzcyBzZXRzIHVzZWQgZm9yIHJlZ2lzdHJhdGlvbiBvZiBtZW1iZXIgdXNhZ2UuCmNsYXNzIEFjY2Vzc2VzIHsKICAvLy8gU3RhdGljYWxseSBib3VuZCBhY2Nlc3Mgb2YgYSBtZW1iZXIuCiAgc3RhdGljIGNvbnN0IEVudW1TZXQ8QWNjZXNzPiBzdGF0aWNBY2Nlc3MgPSBjb25zdCBFbnVtU2V0PEFjY2Vzcz4uZml4ZWQoMSk7CgogIC8vLyBEeW5hbWljYWxseSBib3VuZCBhY2Nlc3Mgb2YgYSBtZW1iZXIuIFRoaXMgaW1wbGllcyB0aGUgc3RhdGljYWxseSBib3VuZAogIC8vLyBhY2Nlc3Mgb2YgdGhlIG1lbWJlci4KICBzdGF0aWMgY29uc3QgRW51bVNldDxBY2Nlc3M+IGR5bmFtaWNBY2Nlc3MgPSBjb25zdCBFbnVtU2V0PEFjY2Vzcz4uZml4ZWQoMyk7CgogIC8vLyBEaXJlY3QgYWNjZXNzIG9mIGEgc3VwZXIgY2xhc3MgbWVtYmVyLiBUaGlzIGltcGxpZXMgdGhlIHN0YXRpY2FsbHkgYm91bmQKICAvLy8gYWNjZXNzIG9mIHRoZSBtZW1iZXIuCiAgc3RhdGljIGNvbnN0IEVudW1TZXQ8QWNjZXNzPiBzdXBlckFjY2VzcyA9IGNvbnN0IEVudW1TZXQ8QWNjZXNzPi5maXhlZCg1KTsKfQoKLy8vIFRoZSBhY2Nlc3NlcyBvZiBhIG1lbWJlciBjb2xsZWN0ZWQgZHVyaW5nIGNsb3NlZCB3b3JsZCBjb21wdXRhdGlvbi4KY2xhc3MgTWVtYmVyQWNjZXNzIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdNZW1iZXJBY2Nlc3MnOwoKICBmaW5hbCBFbnVtU2V0PEFjY2Vzcz4gcmVhZHM7CiAgZmluYWwgRW51bVNldDxBY2Nlc3M+IHdyaXRlczsKICBmaW5hbCBFbnVtU2V0PEFjY2Vzcz4gaW52b2tlczsKCiAgTWVtYmVyQWNjZXNzKHRoaXMucmVhZHMsIHRoaXMud3JpdGVzLCB0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ZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9zdGF0aWNfdHlwZS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hdGl2ZV9kYXRhLmRhcnQnIHNob3cgTmF0aXZlQmFzaWNEYXRhOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgV29ybGQsIEpDbG9zZWRXb3JsZCwgT3BlbldvcmxkOwppbXBvcnQgJ3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAndXNlLmRhcnQnIHNob3cgRHluYW1pY1VzZSwgU3RhdGljVXNlOwoKLy8vIFRoZSBjb21iaW5lZCBjb25zdHJhaW50cyBvbiByZWNlaXZlcnMgYWxsIHRoZSBkeW5hbWljIGNhbGwgc2l0ZXMgb2YgdGhlIHNhbWUKLy8vIHNlbGVjdG9yLgovLy8KLy8vIEZvciBpbnN0YW5jZSBmb3IgdGhlc2UgY2FsbHMKLy8vCi8vLyAgICAgY2xhc3MgQSB7Ci8vLyAgICAgICAgZm9vKGEsIGIpIHt9Ci8vLyAgICAgfQovLy8gICAgIGNsYXNzIEIgewovLy8gICAgICAgIGZvbyhhLCBiKSB7fQovLy8gICAgIH0KLy8vICAgICBjbGFzcyBDIHsKLy8vICAgICAgICBmb28oYSwgYikge30KLy8vICAgICB9Ci8vLyAgICAgbmV3IEEoKS5mb28oYSwgYik7Ci8vLyAgICAgbmV3IEIoKS5mb28oMCwgNDIpOwovLy8KLy8vIHRoZSBzZWxlY3RvciBjb25zdHJhaW50cyBmb3IgZHluYW1pYyBjYWxscyB0byAnZm9vJyB3aXRoIHR3byBwb3NpdGlvbmFsCi8vLyBhcmd1bWVudHMgY291bGQgYmUgJ3JlY2VpdmVyIG9mIGV4YWN0IGluc3RhbmNlIGBBYCBvciBgQmAnLgphYnN0cmFjdCBjbGFzcyBTZWxlY3RvckNvbnN0cmFpbnRzIHsKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW25hbWVdIGFwcGxpZXMgdG8gW2VsZW1lbnRdIHVuZGVyIHRoZXNlIGNvbnN0cmFpbnRzCiAgLy8vIGdpdmVuIHRoZSBjbG9zZWQgW3dvcmxkXS4KICAvLy8KICAvLy8gQ29uc2lkZXIgZm9yIGluc3RhbmNlIGluIHRoaXMgd29ybGQ6CiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHsKICAvLy8gICAgICAgIGZvbyhhLCBiKSB7fQogIC8vLyAgICAgfQogIC8vLyAgICAgY2xhc3MgQiB7CiAgLy8vICAgICAgICBmb28oYSwgYikge30KICAvLy8gICAgIH0KICAvLy8gICAgIG5ldyBBKCkuZm9vKGEsIGIpOwogIC8vLwogIC8vLyBJZGVhbGx5IHRoZSBzZWxlY3RvciBjb25zdHJhaW50cyBmb3IgY2FsbHMgYGZvb2Agd2l0aCB0d28gcG9zaXRpb25hbAogIC8vLyBhcmd1bWVudHMgYXBwbHkgdG8gYEEuZm9vYCBidXQgYEIuZm9vYC4KICBib29sIGNhbkhpdChNZW1iZXJFbnRpdHkgZWxlbWVudCwgTmFtZSBuYW1lLCBjb3ZhcmlhbnQgV29ybGQgd29ybGQpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSByZWNlaXZlcnMgbWF0Y2hpbmcgdGhlc2UgY29uc3RyYWludHMKICAvLy8gaW4gdGhlIGNsb3NlZCBbd29ybGRdIGhhdmUgbm8gaW1wbGVtZW50YXRpb24gbWF0Y2hpbmcgW3NlbGVjdG9yXS4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGZvciB0aGlzIGNvZGUgc25pcHBldAogIC8vLwogIC8vLyAgICAgY2xhc3MgQSB7fQogIC8vLyAgICAgY2xhc3MgQiB7IGZvbygpIHt9IH0KICAvLy8gICAgIG0oYikgPT4gKGIgPyBuZXcgQSgpIDogbmV3IEIoKSkuZm9vKCk7CiAgLy8vCiAgLy8vIHRoZSBwb3RlbnRpYWwgcmVjZWl2ZXIgYG5ldyBBKClgIGhhcyBubyBpbXBsZW1lbnRhdGlvbiBvZiBgZm9vYCBhbmQgdGh1cwogIC8vLyBuZWVkcyB0byBoYW5kbGUgdGhlIGNhbGwgdGhyb3VnaCBpdHMgYG5vU3VjaE1ldGhvZGAgaGFuZGxlci4KICBib29sIG5lZWRzTm9TdWNoTWV0aG9kSGFuZGxpbmcoU2VsZWN0b3Igc2VsZWN0b3IsIGNvdmFyaWFudCBXb3JsZCB3b3JsZCk7Cn0KCi8vLyBBIG11dGFibGUgW1NlbGVjdG9yQ29uc3RyYWludHNdIHVzZWQgaW4gW1dvcmxkQnVpbGRlcl0uCmFic3RyYWN0IGNsYXNzIFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50cyBleHRlbmRzIFNlbGVjdG9yQ29uc3RyYWludHMgewogIC8vLyBBZGRzIFtjb25zdHJhaW50XSB0byB0aGVzZSBzZWxlY3RvciBjb25zdHJhaW50cy4gUmV0dXJuIGB0cnVlYCBpZiB0aGUgc2V0CiAgLy8vIG9mIHBvdGVudGlhbCByZWNlaXZlcnMgZXhwYW5kZWQgZHVlIHRvIHRoZSBuZXcgY29uc3RyYWludC4KICBib29sIGFkZFJlY2VpdmVyQ29uc3RyYWludChjb3ZhcmlhbnQgT2JqZWN0IGNvbnN0cmFpbnQpOwp9CgovLy8gU3RyYXRlZ3kgZm9yIGNvbXB1dGluZyB0aGUgY29uc3RyYWludHMgb24gcG90ZW50aWFsIHJlY2VpdmVycyBvZiBkeW5hbWljCi8vLyBjYWxsIHNpdGVzLgphYnN0cmFjdCBjbGFzcyBTZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kgewogIC8vLyBDcmVhdGUgYSBbVW5pdmVyc2VTZWxlY3RvckNvbnN0cmFpbnRzXSB0byByZXByZXNlbnQgdGhlIGdsb2JhbCByZWNlaXZlcgogIC8vLyBjb25zdHJhaW50cyBmb3IgZHluYW1pYyBjYWxsIHNpdGVzIHdpdGggW3NlbGVjdG9yXS4KICBVbml2ZXJzZVNlbGVjdG9yQ29uc3RyYWludHMgY3JlYXRlU2VsZWN0b3JDb25zdHJhaW50cygKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIE9iamVjdCBpbml0aWFsQ29uc3RyYWludCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCAgaWYgW21lbWJlcl0gaXMgYSBwb3RlbnRpYWwgdGFyZ2V0IG9mIFtkeW5hbWljVXNlXS4KICBib29sIGFwcGxpZWRVbm5hbWVkKER5bmFtaWNVc2UgZHluYW1pY1VzZSwgTWVtYmVyRW50aXR5IG1lbWJlciwgV29ybGQgd29ybGQpOwp9CgovLy8gT3BlbiB3b3JsZCBzdHJhdGVneSB0aGF0IGNvbnN0cmFpbnMgaW5zdGFuY2UgbWVtYmVyIGFjY2VzcyB0byBzdWJ0eXBlcyBvZgovLy8gdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSByZWNlaXZlci4KLy8vCi8vLyBUaGlzIHN0cmF0ZWd5IGlzIHVzZWQgZm9yIERhcnQgMi4KY2xhc3MgU3Ryb25nTW9kZVdvcmxkU3RyYXRlZ3kgaW1wbGVtZW50cyBTZWxlY3RvckNvbnN0cmFpbnRzU3RyYXRlZ3kgewogIGNvbnN0IFN0cm9uZ01vZGVXb3JsZFN0cmF0ZWd5KCk7CgogIEBvdmVycmlkZQogIFN0cm9uZ01vZGVXb3JsZENvbnN0cmFpbnRzIGNyZWF0ZVNlbGVjdG9yQ29uc3RyYWludHMoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBPYmplY3QgaW5pdGlhbENvbnN0cmFpbnQpIHsKICAgIHJldHVybiBuZXcgU3Ryb25nTW9kZVdvcmxkQ29uc3RyYWludHMoKQogICAgICAuLmFkZFJlY2VpdmVyQ29uc3RyYWludChpbml0aWFsQ29uc3RyYWludCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGFwcGxpZWRVbm5hbWVkKAogICAgICBEeW5hbWljVXNlIGR5bmFtaWNVc2UsIE1lbWJlckVudGl0eSBtZW1iZXIsIGNvdmFyaWFudCBPcGVuV29ybGQgd29ybGQpIHsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gZHluYW1pY1VzZS5zZWxlY3RvcjsKICAgIFN0cm9uZ01vZGVDb25zdHJhaW50IGNvbnN0cmFpbnQgPSBkeW5hbWljVXNlLnJlY2VpdmVyQ29uc3RyYWludDsKICAgIHJldHVybiBzZWxlY3Rvci5hcHBsaWVzVW5uYW1lZChtZW1iZXIpICYmCiAgICAgICAgKGNvbnN0cmFpbnQgPT0gbnVsbCB8fAogICAgICAgICAgICBjb25zdHJhaW50LmNhbkhpdChtZW1iZXIsIHNlbGVjdG9yLm1lbWJlck5hbWUsIHdvcmxkKSk7CiAgfQp9CgpjbGFzcyBTdHJvbmdNb2RlV29ybGRDb25zdHJhaW50cyBleHRlbmRzIFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50cyB7CiAgYm9vbCBpc0FsbCA9IGZhbHNlOwogIFNldDxTdHJvbmdNb2RlQ29uc3RyYWludD4gX2NvbnN0cmFpbnRzOwoKICBAb3ZlcnJpZGUKICBib29sIGNhbkhpdChNZW1iZXJFbnRpdHkgZWxlbWVudCwgTmFtZSBuYW1lLCBXb3JsZCB3b3JsZCkgewogICAgaWYgKGlzQWxsKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChfY29uc3RyYWludHMgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgZm9yIChTdHJvbmdNb2RlQ29uc3RyYWludCBjb25zdHJhaW50IGluIF9jb25zdHJhaW50cykgewogICAgICBpZiAoY29uc3RyYWludC5jYW5IaXQoZWxlbWVudCwgbmFtZSwgd29ybGQpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgbmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZyhTZWxlY3RvciBzZWxlY3RvciwgV29ybGQgd29ybGQpIHsKICAgIGlmIChpc0FsbCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChfY29uc3RyYWludHMgIT0gbnVsbCkgewogICAgICBmb3IgKFN0cm9uZ01vZGVDb25zdHJhaW50IGNvbnN0cmFpbnQgaW4gX2NvbnN0cmFpbnRzKSB7CiAgICAgICAgaWYgKGNvbnN0cmFpbnQubmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZyhzZWxlY3Rvciwgd29ybGQpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgYWRkUmVjZWl2ZXJDb25zdHJhaW50KFN0cm9uZ01vZGVDb25zdHJhaW50IGNvbnN0cmFpbnQpIHsKICAgIGlmIChpc0FsbCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGNvbnN0cmFpbnQ/LmNscyA9PSBudWxsKSB7CiAgICAgIGlzQWxsID0gdHJ1ZTsKICAgICAgX2NvbnN0cmFpbnRzID0gbnVsbDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBfY29uc3RyYWludHMgPz89IG5ldyBTZXQ8U3Ryb25nTW9kZUNvbnN0cmFpbnQ+KCk7CiAgICByZXR1cm4gX2NvbnN0cmFpbnRzLmFkZChjb25zdHJhaW50KTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmIChpc0FsbCkgewogICAgICByZXR1cm4gJzxhbGw+JzsKICAgIH0gZWxzZSBpZiAoX2NvbnN0cmFpbnRzICE9IG51bGwpIHsKICAgICAgcmV0dXJuICc8JHtfY29uc3RyYWludHMubWFwKChjKSA9PiBjLmNscykuam9pbignLCcpfT4nOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICc8bm9uZT4nOwogICAgfQogIH0KfQoKY2xhc3MgU3Ryb25nTW9kZUNvbnN0cmFpbnQgewogIGZpbmFsIENsYXNzRW50aXR5IGNsczsKICBmaW5hbCBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uOwoKICBmYWN0b3J5IFN0cm9uZ01vZGVDb25zdHJhaW50KENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBOYXRpdmVCYXNpY0RhdGEgbmF0aXZlQmFzaWNEYXRhLCBDbGFzc0VudGl0eSBjbHMsCiAgICAgIFtDbGFzc1JlbGF0aW9uIHJlbGF0aW9uID0gQ2xhc3NSZWxhdGlvbi5zdWJ0eXBlXSkgewogICAgaWYgKG5hdGl2ZUJhc2ljRGF0YS5pc0pzSW50ZXJvcENsYXNzKGNscykpIHsKICAgICAgLy8gV2UgY2FuIG5vdCB0ZWxsIGpzLWludGVyb3AgY2xhc3NlcyBhcGFydCwgc28gd2UganVzdCBhc3N1bWUgdGhlCiAgICAgIC8vIHJlY2VpdmVyIGNvdWxkIGJlIGFueSBqcy1pbnRlcm9wIGNsYXNzLgogICAgICBjbHMgPSBjb21tb25FbGVtZW50cy5qc0phdmFTY3JpcHRPYmplY3RDbGFzczsKICAgICAgcmVsYXRpb24gPSBDbGFzc1JlbGF0aW9uLnN1YnR5cGU7CiAgICB9CiAgICByZXR1cm4gbmV3IFN0cm9uZ01vZGVDb25zdHJhaW50LmludGVybmFsKGNscywgcmVsYXRpb24pOwogIH0KCiAgY29uc3QgU3Ryb25nTW9kZUNvbnN0cmFpbnQuaW50ZXJuYWwodGhpcy5jbHMsIHRoaXMucmVsYXRpb24pOwoKICBib29sIG5lZWRzTm9TdWNoTWV0aG9kSGFuZGxpbmcoU2VsZWN0b3Igc2VsZWN0b3IsIFdvcmxkIHdvcmxkKSA9PiB0cnVlOwoKICBib29sIGNhbkhpdChNZW1iZXJFbnRpdHkgZWxlbWVudCwgTmFtZSBuYW1lLCBPcGVuV29ybGQgd29ybGQpIHsKICAgIHJldHVybiB3b3JsZC5pc0luaGVyaXRlZEluKGVsZW1lbnQsIGNscywgcmVsYXRpb24pOwogIH0KCiAgYm9vbCBnZXQgaXNFeGFjdCA9PiByZWxhdGlvbiA9PSBDbGFzc1JlbGF0aW9uLmV4YWN0OwoKICBib29sIGdldCBpc1RoaXMgPT4gcmVsYXRpb24gPT0gQ2xhc3NSZWxhdGlvbi50aGlzRXhwcmVzc2lvbjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBvdGhlciBpcyBTdHJvbmdNb2RlQ29uc3RyYWludCAmJgogICAgICAgIGNscyA9PSBvdGhlci5jbHMgJiYKICAgICAgICByZWxhdGlvbiA9PSBvdGhlci5yZWxhdGlvbjsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gY2xzLmhhc2hDb2RlICogMTM7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdTdHJvbmdNb2RlQ29uc3RyYWludCgkY2xzLCRyZWxhdGlvbiknOwp9CgovLy8gVGhlIFtXb3JsZEJ1aWxkZXJdIGlzIGFuIGF1eGlsaWFyeSBjbGFzcyB1c2VkIGluIHRoZSBwcm9jZXNzIG9mIGNvbXB1dGluZwovLy8gdGhlIFtKQ2xvc2VkV29ybGRdLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNb3ZlIGNvbW1vbiBpbXBsZW1lbnRhdGlvbiB0byBhIFtXb3JsZEJ1aWxkZXJCYXNlXSB3aGVuCi8vIHVuaXZlcnNlcyBhbmQgd29ybGRzIGhhdmUgYmVlbiB1bmlmaWVkLgphYnN0cmFjdCBjbGFzcyBXb3JsZEJ1aWxkZXIgewogIC8vLyBBbGwgZGlyZWN0bHkgaW5zdGFudGlhdGVkIGNsYXNzZXMsIHRoYXQgaXMsIGNsYXNzZXMgd2l0aCBhIGdlbmVyYXRpdmUKICAvLy8gY29uc3RydWN0b3IgdGhhdCBoYXMgYmVlbiBjYWxsZWQgZGlyZWN0bHkgYW5kIG5vdCBvbmx5IHRocm91Z2ggYQogIC8vLyBzdXBlci1jYWxsLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEltcHJvdmUgc2VtYW50aWMgcHJlY2lzaW9uLgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzOwp9CgphYnN0cmFjdCBjbGFzcyBXb3JsZEJ1aWxkZXJCYXNlIHsKICBmaW5hbCBNYXA8RW50aXR5LCBTZXQ8RGFydFR5cGU+PiBzdGF0aWNUeXBlQXJndW1lbnREZXBlbmRlbmNpZXMgPQogICAgICA8RW50aXR5LCBTZXQ8RGFydFR5cGU+Pnt9OwoKICBmaW5hbCBNYXA8U2VsZWN0b3IsIFNldDxEYXJ0VHlwZT4+IGR5bmFtaWNUeXBlQXJndW1lbnREZXBlbmRlbmNpZXMgPQogICAgICA8U2VsZWN0b3IsIFNldDxEYXJ0VHlwZT4+e307CgogIGZpbmFsIFNldDxUeXBlVmFyaWFibGVUeXBlPiB0eXBlVmFyaWFibGVUeXBlTGl0ZXJhbHMgPQogICAgICBuZXcgU2V0PFR5cGVWYXJpYWJsZVR5cGU+KCk7CgogIHZvaWQgX3JlZ2lzdGVyU3RhdGljVHlwZUFyZ3VtZW50RGVwZW5kZW5jeSgKICAgICAgRW50aXR5IGVsZW1lbnQsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIHN0YXRpY1R5cGVBcmd1bWVudERlcGVuZGVuY2llcy5wdXRJZkFic2VudCgKICAgICAgICBlbGVtZW50LCAoKSA9PiBuZXcgU2V0PERhcnRUeXBlPigpKQogICAgICAuLmFkZEFsbCh0eXBlQXJndW1lbnRzKTsKICB9CgogIHZvaWQgX3JlZ2lzdGVyRHluYW1pY1R5cGVBcmd1bWVudERlcGVuZGVuY3koCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBkeW5hbWljVHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzLnB1dElmQWJzZW50KAogICAgICAgIHNlbGVjdG9yLCAoKSA9PiBuZXcgU2V0PERhcnRUeXBlPigpKQogICAgICAuLmFkZEFsbCh0eXBlQXJndW1lbnRzKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY1VzZSBzdGF0aWNVc2UpIHsKICAgIGlmIChzdGF0aWNVc2UudHlwZUFyZ3VtZW50cyA9PSBudWxsIHx8IHN0YXRpY1VzZS50eXBlQXJndW1lbnRzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgX3JlZ2lzdGVyU3RhdGljVHlwZUFyZ3VtZW50RGVwZW5kZW5jeSgKICAgICAgICBzdGF0aWNVc2UuZWxlbWVudCwgc3RhdGljVXNlLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgdm9pZCByZWdpc3RlckR5bmFtaWNJbnZvY2F0aW9uKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgaWYgKHR5cGVBcmd1bWVudHMuaXNFbXB0eSkgcmV0dXJuOwogICAgX3JlZ2lzdGVyRHluYW1pY1R5cGVBcmd1bWVudERlcGVuZGVuY3koc2VsZWN0b3IsIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgdm9pZCByZWdpc3RlclR5cGVWYXJpYWJsZVR5cGVMaXRlcmFsKFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlKSB7CiAgICB0eXBlVmFyaWFibGVUeXBlTGl0ZXJhbHMuYWRkKHR5cGVWYXJpYWJsZSk7CiAgfQp9CoEJAE5OPAEXASIkISEhPjwmLgFRDgQhBBIYChIYChIYChscBExAJUwgBisGFBoMFBoMHQZLLkcBUUgGKQYVHzEGT0NMAgE8SVBBOwIBTRAtTjo5NAFJUAIBTiUEJkcjAQw4NSwyBAEMF08tRS4fRAQCAUcWKgEMPhwsPDUVCAYSBAEMQxETBiA+RRcKCAYSBAEMQB0jFBsTBjYpBAEMFhEWJz4NFwYEAgEdGSABPjg6MUkxNCgGPQQBQAFKAUI4BAE3AT8BDCMtLBwkBAEMKQEMPwIBThhQKx5MRxI2OQIBIkQhAUcjATkjAS42MCwfBAEvOTEtHwQBN04OBis1BAEiOSdFBAFIMAQCATBwYWNrYWdlOmNvbXBpbGVyL3NyYy91bml2ZXJzZS93b3JsZF9idWlsZGVyLmRhcnRFc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfYmFja2VuZC9ub19zdWNoX21ldGhvZF9yZWdpc3RyeS5kYXJ0q4ovLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgSWRlbnRpZmllcnMsIFNlbGVjdG9yczsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CgovLy8gW05vU3VjaE1ldGhvZFJlZ2lzdHJ5XSBhbmQgW05vU3VjaE1ldGhvZERhdGFdIGNhdGVnb3JpemVzIGBub1N1Y2hNZXRob2RgCi8vLyBpbXBsZW1lbnRhdGlvbnMuCi8vLwovLy8gSWYgdXNlciBjb2RlIGluY2x1ZGVzIGBub1N1Y2hNZXRob2RgIGltcGxlbWVudGF0aW9ucywgdHlwZSBpbmZlcmVuY2UgaXMKLy8vIGhpbmRlcmVkIGJlY2F1c2UgKGZvciBpbnN0YW5jZSkgYW55IHNlbGVjdG9yIHdoZXJlIHRoZSB0eXBlIG9mIHRoZQovLy8gcmVjZWl2ZXIgaXMgbm90IGtub3duIGFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgYG5vU3VjaE1ldGhvZGAgbXVzdCBiZSB0YWtlbgovLy8gaW50byBhY2NvdW50IHdoZW4gaW5mZXJyaW5nIHRoZSByZXR1cm4gdHlwZS4KLy8vCi8vLyBUaGUgc2l0dWF0aW9uIGNhbiBiZSBhbWVsaW9yYXRlZCB3aXRoIHNvbWUgaGV1cmlzdGljcyBmb3IgZGlzcmVnYXJkaW5nIHNvbWUKLy8vIGBub1N1Y2hNZXRob2RgIGltcGxlbWVudGF0aW9ucyBkdXJpbmcgdHlwZSBpbmZlcmVuY2UuIFdlIGNhbiBwYXJ0aXRpb24KLy8vIGBub1N1Y2hNZXRob2RgIGltcGxlbWVudGF0aW9ucyBpbnRvIDQgY2F0ZWdvcmllcy4KLy8vCi8vLyBJbXBsZW1lbnRhdGlvbnMgaW4gY2F0ZWdvcnkgQSBhcmUgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zCi8vLyBgT2JqZWN0Lm5vU3VjaE1ldGhvZGAgYW5kIGBJbnRlcmNlcHRvci5ub1N1Y2hNZXRob2RgLgovLy8KLy8vIEltcGxlbWVudGF0aW9ucyBpbiBjYXRlZ29yeSBCIHN5bnRhY3RpY2FsbHkgaW1tZWRpYXRlbHkgdGhyb3csIGZvciBleGFtcGxlOgovLy8KLy8vICAgICBub1N1Y2hNZXRob2QoeCkgPT4gdGhyb3cgJ25vdCBpbXBsZW1lbnRlZCcKLy8vCi8vLyBJbXBsZW1lbnRhdGlvbnMgaW4gY2F0ZWdvcnkgQyBhcmUgbm90IGFwcGxpY2FibGUsIGZvciBleGFtcGxlOgovLy8KLy8vICAgICBub1N1Y2hNZXRob2QoKSB7IC8qIG1pc3NpbmcgcGFyYW1ldGVyICovIH0KLy8vICAgICBub1N1Y2hNZXRob2QoYSwgYikgeyAvKiB0b28gbWFueSBwYXJhbWV0ZXJzICovIH0KLy8vCi8vLyBJbXBsZW1lbnRhdGlvbnMgdGhhdCBkbyBub3QgZmFsbCBpbnRvIGNhdGVnb3J5IEEsIEIgb3IgQyBhcmUgaW4gY2F0ZWdvcnkgRC4KLy8vIFRoZXkgYXJlIHRoZSBvbmx5IGNhdGVnb3J5IG9mIGltcGxlbWVudGF0aW9uIHRoYXQgYXJlIGNvbnNpZGVyZWQgZHVyaW5nIHR5cGUKLy8vIGluZmVyZW5jZS4KLy8vCi8vLyBJbXBsZW1lbnRhdGlvbnMgdGhhdCBzeW50YWN0aWNhbGx5IGp1c3QgZm9yd2FyZCB0byB0aGUgc3VwZXIgaW1wbGVtZW50YXRpb24sCi8vLyBmb3IgZXhhbXBsZToKLy8vCi8vLyAgICAgbm9TdWNoTWV0aG9kKHgpID0+IHN1cGVyLm5vU3VjaE1ldGhvZCh4KTsKLy8vCi8vLyBhcmUgaW4gdGhlIHNhbWUgY2F0ZWdvcnkgYXMgdGhlIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24uIFRoaXMgY292ZXJzIGEKLy8vIGNvbW1vbiBjYXNlLCB3aGVyZSB1c2VycyBpbXBsZW1lbnQgYG5vU3VjaE1ldGhvZGAgd2l0aCB0aGVzZSBkdW1teQovLy8gaW1wbGVtZW50YXRpb25zIHRvIGF2b2lkIHdhcm5pbmdzLgoKLy8vIFJlZ2lzdHJ5IGZvciBjb2xsZWN0aW5nIGBub1N1Y2hNZXRob2RgIGltcGxlbWVudGF0aW9ucyBhbmQgY2F0ZWdvcml6aW5nIHRoZW0KLy8vIGludG8gY2F0ZWdvcmllcyBgQWAsIGBCYCwgYENgLCBgRGAuCmFic3RyYWN0IGNsYXNzIE5vU3VjaE1ldGhvZFJlZ2lzdHJ5IHsKICAvLy8gUmVnaXN0ZXIgW25vU3VjaE1ldGhvZEVsZW1lbnRdLgogIHZvaWQgcmVnaXN0ZXJOb1N1Y2hNZXRob2QoRnVuY3Rpb25FbnRpdHkgbm9TdWNoTWV0aG9kRWxlbWVudCk7CgogIC8vLyBDYXRlZ29yaXplcyB0aGUgcmVnaXN0ZXJlZCBtZXRob2RzLgogIHZvaWQgb25RdWV1ZUVtcHR5KCk7CgogIC8vLyBgdHJ1ZWAgaWYgYSBjYXRlZ29yeSBgQmAgbWV0aG9kIGhhcyBiZWVuIHNlZW4gc28gZmFyLgogIGJvb2wgZ2V0IGhhc1Rocm93aW5nTm9TdWNoTWV0aG9kOwoKICAvLy8gYHRydWVgIGlmIGEgY2F0ZWdvcnkgYERgIG1ldGhvZCBoYXMgYmVlbiBzZWVuIHNvIGZhci4KICBib29sIGdldCBoYXNDb21wbGV4Tm9TdWNoTWV0aG9kOwoKICAvLy8gQ2xvc2VzIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJucyBkYXRhIG9iamVjdCB1c2VkIGR1cmluZyB0eXBlIGluZmVyZW5jZS4KICBOb1N1Y2hNZXRob2REYXRhIGNsb3NlKCk7Cn0KCmNsYXNzIE5vU3VjaE1ldGhvZFJlZ2lzdHJ5SW1wbCBpbXBsZW1lbnRzIE5vU3VjaE1ldGhvZFJlZ2lzdHJ5IHsKICAvLy8gVGhlIGltcGxlbWVudGF0aW9ucyB0aGF0IGZhbGwgaW50byBjYXRlZ29yeSBBLCBkZXNjcmliZWQgYWJvdmUuCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBkZWZhdWx0SW1wbHMgPSBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwoKICAvLy8gVGhlIGltcGxlbWVudGF0aW9ucyB0aGF0IGZhbGwgaW50byBjYXRlZ29yeSBCLCBkZXNjcmliZWQgYWJvdmUuCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiB0aHJvd2luZ0ltcGxzID0gbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKCiAgLy8vIFRoZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBmYWxsIGludG8gY2F0ZWdvcnkgQywgZGVzY3JpYmVkIGFib3ZlLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIGNhdGVnb3J5IHdoZW4gRGFydCAxIGlzIG5vIGxvbmdlcgogIC8vIHN1cHBvcnRlZC4KICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IG5vdEFwcGxpY2FibGVJbXBscyA9IG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CgogIC8vLyBUaGUgaW1wbGVtZW50YXRpb25zIHRoYXQgZmFsbCBpbnRvIGNhdGVnb3J5IEQsIGRlc2NyaWJlZCBhYm92ZS4KICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IG90aGVySW1wbHMgPSBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwoKICAvLy8gVGhlIGltcGxlbWVudGF0aW9ucyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNhdGVnb3JpemVkLgogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gX3VuY2F0ZWdvcml6ZWRJbXBscyA9IG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CgogIC8vLyBUaGUgaW1wbGVtZW50YXRpb25zIHRoYXQgYSBmb3J3YXJkaW5nIHN5bnRheCBhcyBkZWZpbmVkIGJ5CiAgLy8vIFtOb1N1Y2hNZXRob2RSZXNvbHZlci5oYXNGb3J3YXJkU3ludGF4XS4KICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IGZvcndhcmRpbmdTeW50YXhJbXBscyA9IG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CgogIGZpbmFsIENvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKICBmaW5hbCBOb1N1Y2hNZXRob2RSZXNvbHZlciBfcmVzb2x2ZXI7CgogIE5vU3VjaE1ldGhvZFJlZ2lzdHJ5SW1wbCh0aGlzLl9jb21tb25FbGVtZW50cywgdGhpcy5fcmVzb2x2ZXIpOwoKICBOb1N1Y2hNZXRob2RSZXNvbHZlciBnZXQgaW50ZXJuYWxSZXNvbHZlckZvclRlc3RpbmcgPT4gX3Jlc29sdmVyOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNUaHJvd2luZ05vU3VjaE1ldGhvZCA9PiB0aHJvd2luZ0ltcGxzLmlzTm90RW1wdHk7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaGFzQ29tcGxleE5vU3VjaE1ldGhvZCA9PiBvdGhlckltcGxzLmlzTm90RW1wdHk7CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJOb1N1Y2hNZXRob2QoRnVuY3Rpb25FbnRpdHkgbm9TdWNoTWV0aG9kRWxlbWVudCkgewogICAgX3VuY2F0ZWdvcml6ZWRJbXBscy5hZGQobm9TdWNoTWV0aG9kRWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG9uUXVldWVFbXB0eSgpIHsKICAgIF91bmNhdGVnb3JpemVkSW1wbHMuZm9yRWFjaChfY2F0ZWdvcml6ZUltcGwpOwogICAgX3VuY2F0ZWdvcml6ZWRJbXBscy5jbGVhcigpOwogIH0KCiAgTnNtQ2F0ZWdvcnkgX2NhdGVnb3JpemVJbXBsKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChlbGVtZW50Lm5hbWUgPT0gSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXyk7CiAgICBhc3NlcnQoIWVsZW1lbnQuaXNBYnN0cmFjdCk7CiAgICBpZiAoZGVmYXVsdEltcGxzLmNvbnRhaW5zKGVsZW1lbnQpKSB7CiAgICAgIHJldHVybiBOc21DYXRlZ29yeS5ERUZBVUxUOwogICAgfQogICAgaWYgKHRocm93aW5nSW1wbHMuY29udGFpbnMoZWxlbWVudCkpIHsKICAgICAgcmV0dXJuIE5zbUNhdGVnb3J5LlRIUk9XSU5HOwogICAgfQogICAgaWYgKG90aGVySW1wbHMuY29udGFpbnMoZWxlbWVudCkpIHsKICAgICAgcmV0dXJuIE5zbUNhdGVnb3J5Lk9USEVSOwogICAgfQogICAgaWYgKG5vdEFwcGxpY2FibGVJbXBscy5jb250YWlucyhlbGVtZW50KSkgewogICAgICByZXR1cm4gTnNtQ2F0ZWdvcnkuTk9UX0FQUExJQ0FCTEU7CiAgICB9CiAgICBpZiAoIVNlbGVjdG9ycy5ub1N1Y2hNZXRob2RfLnNpZ25hdHVyZUFwcGxpZXMoZWxlbWVudCkpIHsKICAgICAgbm90QXBwbGljYWJsZUltcGxzLmFkZChlbGVtZW50KTsKICAgICAgcmV0dXJuIE5zbUNhdGVnb3J5Lk5PVF9BUFBMSUNBQkxFOwogICAgfQogICAgaWYgKF9jb21tb25FbGVtZW50cy5pc0RlZmF1bHROb1N1Y2hNZXRob2RJbXBsZW1lbnRhdGlvbihlbGVtZW50KSkgewogICAgICBkZWZhdWx0SW1wbHMuYWRkKGVsZW1lbnQpOwogICAgICByZXR1cm4gTnNtQ2F0ZWdvcnkuREVGQVVMVDsKICAgIH0gZWxzZSBpZiAoX3Jlc29sdmVyLmhhc0ZvcndhcmRpbmdTeW50YXgoZWxlbWVudCkpIHsKICAgICAgZm9yd2FyZGluZ1N5bnRheEltcGxzLmFkZChlbGVtZW50KTsKICAgICAgLy8gSWYgdGhlIGltcGxlbWVudGF0aW9uIGlzICdub1N1Y2hNZXRob2QoeCkgPT4gc3VwZXIubm9TdWNoTWV0aG9kKHgpOycKICAgICAgLy8gdGhlbiBpdCBpcyBpbiB0aGUgc2FtZSBjYXRlZ29yeSBhcyB0aGUgc3VwZXIgY2FsbC4KICAgICAgRnVuY3Rpb25FbnRpdHkgc3VwZXJDYWxsID0gX3Jlc29sdmVyLmdldFN1cGVyTm9TdWNoTWV0aG9kKGVsZW1lbnQpOwogICAgICBOc21DYXRlZ29yeSBjYXRlZ29yeSA9IF9jYXRlZ29yaXplSW1wbChzdXBlckNhbGwpOwogICAgICBzd2l0Y2ggKGNhdGVnb3J5KSB7CiAgICAgICAgY2FzZSBOc21DYXRlZ29yeS5ERUZBVUxUOgogICAgICAgICAgZGVmYXVsdEltcGxzLmFkZChlbGVtZW50KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTnNtQ2F0ZWdvcnkuVEhST1dJTkc6CiAgICAgICAgICB0aHJvd2luZ0ltcGxzLmFkZChlbGVtZW50KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTnNtQ2F0ZWdvcnkuT1RIRVI6CiAgICAgICAgICBvdGhlckltcGxzLmFkZChlbGVtZW50KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTnNtQ2F0ZWdvcnkuTk9UX0FQUExJQ0FCTEU6CiAgICAgICAgICAvLyBJZiB0aGUgc3VwZXIgbWV0aG9kIGlzIG5vdCBhcHBsaWNhYmxlLCB0aGUgY2FsbCBpcyByZWRpcmVjdGVkIHRvCiAgICAgICAgICAvLyBgT2JqZWN0Lm5vU3VjaE1ldGhvZGAuCiAgICAgICAgICBkZWZhdWx0SW1wbHMuYWRkKGVsZW1lbnQpOwogICAgICAgICAgY2F0ZWdvcnkgPSBOc21DYXRlZ29yeS5ERUZBVUxUOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcmV0dXJuIGNhdGVnb3J5OwogICAgfSBlbHNlIGlmIChfcmVzb2x2ZXIuaGFzVGhyb3dpbmdTeW50YXgoZWxlbWVudCkpIHsKICAgICAgdGhyb3dpbmdJbXBscy5hZGQoZWxlbWVudCk7CiAgICAgIHJldHVybiBOc21DYXRlZ29yeS5USFJPV0lORzsKICAgIH0gZWxzZSB7CiAgICAgIG90aGVySW1wbHMuYWRkKGVsZW1lbnQpOwogICAgICByZXR1cm4gTnNtQ2F0ZWdvcnkuT1RIRVI7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBOb1N1Y2hNZXRob2REYXRhIGNsb3NlKCkgewogICAgcmV0dXJuIG5ldyBOb1N1Y2hNZXRob2REYXRhSW1wbCgKICAgICAgICB0aHJvd2luZ0ltcGxzLCBvdGhlckltcGxzLCBmb3J3YXJkaW5nU3ludGF4SW1wbHMpOwogIH0KfQoKLy8vIERhdGEgb2JqZWN0IHVzZWQgZHVyaW5nIHR5cGUgaW5mZXJlbmNlLgovLy8KLy8vIFBvc3QgaW5mZXJlbmNlIGNvbGxlY3RlZCBjYXRlZ29yeSBgRGAgbWV0aG9kcyBhcmUgaW50byBzdWJjYXRlZ29yaWVzIGBEMWAKLy8vIGFuZCBgRDJgLgphYnN0cmFjdCBjbGFzcyBOb1N1Y2hNZXRob2REYXRhIHsKICAvLy8gRGVzZXJpYWxpemVzIGEgW05vU3VjaE1ldGhvZERhdGFdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgTm9TdWNoTWV0aG9kRGF0YS5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpID0KICAgICAgTm9TdWNoTWV0aG9kRGF0YUltcGwucmVhZEZyb21EYXRhU291cmNlOwoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtOb1N1Y2hNZXRob2REYXRhXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7CgogIC8vLyBSZXR1cm5zIFt0cnVlXSBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBhIGNvbXBsZXggW25vU3VjaE1ldGhvZF0KICAvLy8gaW1wbGVtZW50YXRpb24uIEFuIGltcGxlbWVudGF0aW9uIGlzIGNvbXBsZXggaWYgaXQgZmFsbHMgaW50bwogIC8vLyBjYXRlZ29yeSBELCBhcyBkZXNjcmliZWQgYWJvdmUuCiAgYm9vbCBpc0NvbXBsZXgoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCk7CgogIC8vLyBOb3cgdGhhdCB0eXBlIGluZmVyZW5jZSBpcyBjb21wbGV0ZSwgc3BsaXQgY2F0ZWdvcnkgRCBpbnRvIHR3bwogIC8vLyBzdWJjYXRlZ29yaWVzOiBEMSwgdGhvc2UgdGhhdCBoYXZlIG5vIHJldHVybiB0eXBlLCBhbmQgRDIsIHRob3NlCiAgLy8vIHRoYXQgaGF2ZSBhIHJldHVybiB0eXBlLgogIHZvaWQgY2F0ZWdvcml6ZUNvbXBsZXhJbXBsZW1lbnRhdGlvbnMoR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cyk7CgogIC8vLyBFbWl0cyBhIGRpYWdub3N0aWMgYWJvdXQgbWV0aG9kcyBpbiBjYXRlZ29yaWVzIGBCYCwgYEQxYCBhbmQgYEQyYC4KICB2b2lkIGVtaXREaWFnbm9zdGljKERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlcik7Cn0KCmNsYXNzIE5vU3VjaE1ldGhvZERhdGFJbXBsIGltcGxlbWVudHMgTm9TdWNoTWV0aG9kRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtOb1N1Y2hNZXRob2REYXRhXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ25vLXN1Y2gtbWV0aG9kLWRhdGEnOwoKICAvLy8gVGhlIGltcGxlbWVudGF0aW9ucyB0aGF0IGZhbGwgaW50byBjYXRlZ29yeSBCLCBkZXNjcmliZWQgYWJvdmUuCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiB0aHJvd2luZ0ltcGxzOwoKICAvLy8gVGhlIGltcGxlbWVudGF0aW9ucyB0aGF0IGZhbGwgaW50byBjYXRlZ29yeSBELCBkZXNjcmliZWQgYWJvdmUuCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBvdGhlckltcGxzOwoKICAvLy8gVGhlIGltcGxlbWVudGF0aW9ucyB0aGF0IGZhbGwgaW50byBjYXRlZ29yeSBEMQogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gY29tcGxleE5vUmV0dXJuSW1wbHMgPSBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwoKICAvLy8gVGhlIGltcGxlbWVudGF0aW9ucyB0aGF0IGZhbGwgaW50byBjYXRlZ29yeSBEMgogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gY29tcGxleFJldHVybmluZ0ltcGxzID0gbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBmb3J3YXJkaW5nU3ludGF4SW1wbHM7CgogIE5vU3VjaE1ldGhvZERhdGFJbXBsKAogICAgICB0aGlzLnRocm93aW5nSW1wbHMsIHRoaXMub3RoZXJJbXBscywgdGhpcy5mb3J3YXJkaW5nU3ludGF4SW1wbHMpOwoKICBmYWN0b3J5IE5vU3VjaE1ldGhvZERhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IHRocm93aW5nSW1wbHMgPQogICAgICAgIHNvdXJjZS5yZWFkTWVtYmVyczxGdW5jdGlvbkVudGl0eT4oKS50b1NldCgpOwogICAgU2V0PEZ1bmN0aW9uRW50aXR5PiBvdGhlckltcGxzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RnVuY3Rpb25FbnRpdHk+KCkudG9TZXQoKTsKICAgIFNldDxGdW5jdGlvbkVudGl0eT4gZm9yd2FyZGluZ1N5bnRheEltcGxzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RnVuY3Rpb25FbnRpdHk+KCkudG9TZXQoKTsKICAgIExpc3Q8RnVuY3Rpb25FbnRpdHk+IGNvbXBsZXhOb1JldHVybkltcGxzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RnVuY3Rpb25FbnRpdHk+KCk7CiAgICBMaXN0PEZ1bmN0aW9uRW50aXR5PiBjb21wbGV4UmV0dXJuaW5nSW1wbHMgPQogICAgICAgIHNvdXJjZS5yZWFkTWVtYmVyczxGdW5jdGlvbkVudGl0eT4oKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgTm9TdWNoTWV0aG9kRGF0YUltcGwoCiAgICAgICAgdGhyb3dpbmdJbXBscywgb3RoZXJJbXBscywgZm9yd2FyZGluZ1N5bnRheEltcGxzKQogICAgICAuLmNvbXBsZXhOb1JldHVybkltcGxzLmFkZEFsbChjb21wbGV4Tm9SZXR1cm5JbXBscykKICAgICAgLi5jb21wbGV4UmV0dXJuaW5nSW1wbHMuYWRkQWxsKGNvbXBsZXhSZXR1cm5pbmdJbXBscyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVycyh0aHJvd2luZ0ltcGxzKTsKICAgIHNpbmsud3JpdGVNZW1iZXJzKG90aGVySW1wbHMpOwogICAgc2luay53cml0ZU1lbWJlcnMoZm9yd2FyZGluZ1N5bnRheEltcGxzKTsKICAgIHNpbmsud3JpdGVNZW1iZXJzKGNvbXBsZXhOb1JldHVybkltcGxzKTsKICAgIHNpbmsud3JpdGVNZW1iZXJzKGNvbXBsZXhSZXR1cm5pbmdJbXBscyk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjYXRlZ29yaXplQ29tcGxleEltcGxlbWVudGF0aW9ucyhHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzKSB7CiAgICBvdGhlckltcGxzLmZvckVhY2goKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgICAgaWYgKHJlc3VsdHMucmVzdWx0T2ZNZW1iZXIoZWxlbWVudCkudGhyb3dzQWx3YXlzKSB7CiAgICAgICAgY29tcGxleE5vUmV0dXJuSW1wbHMuYWRkKGVsZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbXBsZXhSZXR1cm5pbmdJbXBscy5hZGQoZWxlbWVudCk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbWl0RGlhZ25vc3RpYyhEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKICAgIHRocm93aW5nSW1wbHMuZm9yRWFjaCgoZSkgewogICAgICBpZiAoIWZvcndhcmRpbmdTeW50YXhJbXBscy5jb250YWlucyhlKSkgewogICAgICAgIHJlcG9ydGVyLnJlcG9ydEhpbnRNZXNzYWdlKGUsIE1lc3NhZ2VLaW5kLkRJUkVDVExZX1RIUk9XSU5HX05TTSk7CiAgICAgIH0KICAgIH0pOwogICAgY29tcGxleE5vUmV0dXJuSW1wbHMuZm9yRWFjaCgoZSkgewogICAgICBpZiAoIWZvcndhcmRpbmdTeW50YXhJbXBscy5jb250YWlucyhlKSkgewogICAgICAgIHJlcG9ydGVyLnJlcG9ydEhpbnRNZXNzYWdlKGUsIE1lc3NhZ2VLaW5kLkNPTVBMRVhfVEhST1dJTkdfTlNNKTsKICAgICAgfQogICAgfSk7CiAgICBjb21wbGV4UmV0dXJuaW5nSW1wbHMuZm9yRWFjaCgoZSkgewogICAgICBpZiAoIWZvcndhcmRpbmdTeW50YXhJbXBscy5jb250YWlucyhlKSkgewogICAgICAgIHJlcG9ydGVyLnJlcG9ydEhpbnRNZXNzYWdlKGUsIE1lc3NhZ2VLaW5kLkNPTVBMRVhfUkVUVVJOSU5HX05TTSk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbXBsZXgoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KGVsZW1lbnQubmFtZSA9PSBJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfKTsKICAgIHJldHVybiBvdGhlckltcGxzLmNvbnRhaW5zKGVsZW1lbnQpOwogIH0KfQoKZW51bSBOc21DYXRlZ29yeSB7CiAgREVGQVVMVCwKICBUSFJPV0lORywKICBOT1RfQVBQTElDQUJMRSwKICBPVEhFUiwKfQoKLy8vIEludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGZvcm0gb2YgYSBgbm9TdWNoTWV0aG9kYCBpbXBsZW1lbnRhdGlvbi4KYWJzdHJhY3QgY2xhc3MgTm9TdWNoTWV0aG9kUmVzb2x2ZXIgewogIC8vLyBDb21wdXRlcyB3aGV0aGVyIFttZXRob2RdIGlzIG9mIHRoZSBmb3JtCiAgLy8vCiAgLy8vICAgICBub1N1Y2hNZXRob2QoaSkgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGkpOwogIC8vLwogIGJvb2wgaGFzRm9yd2FyZGluZ1N5bnRheChjb3ZhcmlhbnQgRnVuY3Rpb25FbnRpdHkgbWV0aG9kKTsKCiAgLy8vIENvbXB1dGVzIHdoZXRoZXIgW21ldGhvZF0gaXMgb2YgdGhlIGZvcm0KICAvLy8KICAvLy8gICAgIG5vU3VjaE1ldGhvZChpKSA9PiB0aHJvdyBuZXcgRXJyb3IoKTsKICAvLy8KICBib29sIGhhc1Rocm93aW5nU3ludGF4KGNvdmFyaWFudCBGdW5jdGlvbkVudGl0eSBtZXRob2QpOwoKICAvLy8gUmV0dXJucyB0aGUgYG5vU3VjaE1ldGhvZGAgdGhhdCBbbWV0aG9kXSBvdmVycmlkZXMuCiAgRnVuY3Rpb25FbnRpdHkgZ2V0U3VwZXJOb1N1Y2hNZXRob2QoY292YXJpYW50IEZ1bmN0aW9uRW50aXR5IG1ldGhvZCk7Cn0KgTsATk48ARk2OyQhLgFNFQRMR04xBFBLNgRCOgRQBDMEQwQzOQRQUQ8EUREEMgRNRycBUSgmJkEBKhcBPCQBPCMBThwCAUFGRgFGRwFGSBBMAUZEAT5NAUEvTwEoKAFCAUQBDEAMPAEMQjIEAQwYMiEEATg3ISoiBisjBiggBjApBj4nKQZIISI5Kk48SjkaIiURIyYRICMRKU4kJSoRCBc3IiMNHyAGBAEMHSU7BAIBLARODiI+Qy8BNCcBRkQmKgFFRx9NAUk0AgE5Sh0zAUYrAUYoATVOATVPATMBGEgBRxcoNiU2MDYwLjEuFSU6Oj0EAQwoFSYjLi0uEwQBDE4yOisPLAgIBAEMNSAwSggIJzBJCAgoMEoICAQBDCs3KQQCARMLDBIJAgFLJi8GNAY9AS8GMAY7ATpIAgE8cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9ub19zdWNoX21ldGhvZF9yZWdpc3RyeS5kYXJ0MXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lyL3N0YXRpY190eXBlLmRhcnTAAQmlLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnIGFzIGlyOwppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCc7CmltcG9ydCAncnVudGltZV90eXBlX2FuYWx5c2lzLmRhcnQnOwppbXBvcnQgJ3Njb3BlLmRhcnQnOwppbXBvcnQgJ3N0YXRpY190eXBlX2Jhc2UuZGFydCc7CmltcG9ydCAnc3RhdGljX3R5cGVfY2FjaGUuZGFydCc7CgovLy8gRW51bSB2YWx1ZXMgZm9yIGhvdyB0aGUgdGFyZ2V0IG9mIGEgc3RhdGljIHR5cGUgc2hvdWxkIGJlIGludGVycHJldGVkLgplbnVtIENsYXNzUmVsYXRpb24gewogIC8vLyBUaGUgdGFyZ2V0IGlzIGFueSBzdWJ0eXBlIG9mIHRoZSBzdGF0aWMgdHlwZS4KICBzdWJ0eXBlLAoKICAvLy8gVGhlIHRhcmdldCBpcyBhIHN1YmNsYXNzIG9yIG1peGluIGFwcGxpY2F0aW9uIG9mIHRoZSBzdGF0aWMgdHlwZS4KICAvLy8KICAvLy8gVGhpcyBjb3JyZXNwb25kcyB0byBhY2Nlc3NpbmcgYSBtZW1iZXIgdGhyb3VnaCBhIHRoaXMgZXhwcmVzc2lvbi4KICB0aGlzRXhwcmVzc2lvbiwKCiAgLy8vIFRoZSB0YXJnZXQgaXMgYW4gZXhhY3QgaW5zdGFuY2Ugb2YgdGhlIHN0YXRpYyB0eXBlLgogIGV4YWN0LAp9CgpDbGFzc1JlbGF0aW9uIGNvbXB1dGVDbGFzc1JlbGF0aW9uRnJvbVR5cGUoaXIuRGFydFR5cGUgdHlwZSkgewogIGlmICh0eXBlIGlzIFRoaXNJbnRlcmZhY2VUeXBlKSB7CiAgICByZXR1cm4gQ2xhc3NSZWxhdGlvbi50aGlzRXhwcmVzc2lvbjsKICB9IGVsc2UgaWYgKHR5cGUgaXMgRXhhY3RJbnRlcmZhY2VUeXBlKSB7CiAgICByZXR1cm4gQ2xhc3NSZWxhdGlvbi5leGFjdDsKICB9IGVsc2UgewogICAgcmV0dXJuIENsYXNzUmVsYXRpb24uc3VidHlwZTsKICB9Cn0KCi8vLyBWaXNpdG9yIHRoYXQgY29tcHV0ZXMgYW5kIGNhY2hlcyB0aGUgc3RhdGljIHR5cGUgb2YgZXhwcmVzc2lvbiB3aGlsZQovLy8gdmlzaXRpbmcgdGhlIGZ1bGwgdHJlZSBhdCBleHByZXNzaW9uIGxldmVsLgovLy8KLy8vIFRvIGVuc3VyZSB0aGF0IHRoZSB0cmF2ZXJzYWwgb25seSB2aXNpdHMgYW5kIGNvbXB1dGVzIHRoZSBleHByZXNzaW9uIHR5cGUKLy8vIGZvciBlYWNoIGV4cHJlc3Npb24gb25jZSwgdGhpcyBjbGFzcyBwZXJmb3JtcyB0aGUgdHJhdmVyc2FsIGV4cGxpY2l0bHkgYW5kCi8vLyBhZGRzICdoYW5kbGVYJyBob29rcyBmb3Igc3ViY2xhc3NlcyB0byBoYW5kbGUgaW5kaXZpZHVhbCBleHByZXNzaW9ucyB1c2luZwovLy8gdGhlIHJlYWRpbHkgY29tcHV0ZSBzdGF0aWMgdHlwZXMgb2Ygc3ViZXhwcmVzc2lvbnMuCmFic3RyYWN0IGNsYXNzIFN0YXRpY1R5cGVWaXNpdG9yIGV4dGVuZHMgU3RhdGljVHlwZUJhc2UgewogIGZpbmFsIE1hcDxpci5FeHByZXNzaW9uLCBpci5EYXJ0VHlwZT4gX2V4cHJlc3Npb25UeXBlQ2FjaGUgPSB7fTsKICBNYXA8aXIuRm9ySW5TdGF0ZW1lbnQsIGlyLkRhcnRUeXBlPiBfZm9ySW5JdGVyYXRvclR5cGVDYWNoZTsKICBNYXA8aXIuRXhwcmVzc2lvbiwgVHlwZU1hcD4gdHlwZU1hcHNGb3JUZXN0aW5nOwogIE1hcDxpci5Qcm9wZXJ0eUdldCwgUnVudGltZVR5cGVVc2VEYXRhPiBfcGVuZGluZ1J1bnRpbWVUeXBlVXNlRGF0YSA9IHt9OwoKICBmaW5hbCBpci5DbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHk7CgogIFRoaXNJbnRlcmZhY2VUeXBlIF90aGlzVHlwZTsKCiAgU3RhdGljVHlwZVZpc2l0b3IoaXIuVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwgdGhpcy5oaWVyYXJjaHkpCiAgICAgIDogc3VwZXIodHlwZUVudmlyb25tZW50KTsKCiAgU3RhdGljVHlwZUNhY2hlIGdldFN0YXRpY1R5cGVDYWNoZSgpIHsKICAgIHJldHVybiBuZXcgU3RhdGljVHlwZUNhY2hlKF9leHByZXNzaW9uVHlwZUNhY2hlLCBfZm9ySW5JdGVyYXRvclR5cGVDYWNoZSk7CiAgfQoKICAvLy8gSWYgYHRydWVgLCB0aGUgZWZmZWN0IG9mIGV4ZWN1dGluZyBhc3NlcnQgc3RhdGVtZW50cyBpcyB0YWtlbiBpbnRvIGFjY291bnQKICAvLy8gd2hlbiBjb21wdXRpbmcgdGhlIHN0YXRpYyB0eXBlLgogIGJvb2wgZ2V0IHVzZUFzc2VydHM7CgogIC8vLyBJZiBgdHJ1ZWAsIHRoZSBzdGF0aWMgdHlwZSBvZiBhbiBlZmZlY3RpdmVseSBmaW5hbCB2YXJpYWJsZSBpcyBpbmZlcnJlZAogIC8vLyBmcm9tIHRoZSBzdGF0aWMgdHlwZSBvZiBpdHMgaW5pdGlhbGl6ZXIuCiAgYm9vbCBnZXQgaW5mZXJFZmZlY3RpdmVseUZpbmFsVmFyaWFibGVUeXBlczsKCiAgVmFyaWFibGVTY29wZU1vZGVsIGdldCB2YXJpYWJsZVNjb3BlTW9kZWw7CgogIEBvdmVycmlkZQogIFRoaXNJbnRlcmZhY2VUeXBlIGdldCB0aGlzVHlwZSB7CiAgICBhc3NlcnQoX3RoaXNUeXBlICE9IG51bGwpOwogICAgcmV0dXJuIF90aGlzVHlwZTsKICB9CgogIHZvaWQgc2V0IHRoaXNUeXBlKFRoaXNJbnRlcmZhY2VUeXBlIHZhbHVlKSB7CiAgICBhc3NlcnQodmFsdWUgPT0gbnVsbCB8fCBfdGhpc1R5cGUgPT0gbnVsbCk7CiAgICBfdGhpc1R5cGUgPSB2YWx1ZTsKICB9CgogIGJvb2wgY29tcGxldGVzKGlyLkRhcnRUeXBlIHR5cGUpID0+IHR5cGUgIT0gY29uc3QgRG9lc05vdENvbXBsZXRlVHlwZSgpOwoKICBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gX2N1cnJlbnRWYXJpYWJsZXM7CiAgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IF9pbnZhbGlkYXRlZFZhcmlhYmxlcyA9CiAgICAgIG5ldyBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4oKTsKCiAgVHlwZU1hcCBfdHlwZU1hcEJhc2UgPSBjb25zdCBUeXBlTWFwKCk7CiAgVHlwZU1hcCBfdHlwZU1hcFdoZW5UcnVlOwogIFR5cGVNYXAgX3R5cGVNYXBXaGVuRmFsc2U7CgogIC8vLyBSZXR1cm5zIHRoZSBsb2NhbCB2YXJpYWJsZSB0eXBlIHByb21vdGlvbnMgZm9yIHdoZW4gdGhlIGJvb2xlYW4gdmFsdWUgb2YKICAvLy8gdGhlIG1vc3QgcmVjZW50IG5vZGUgaXMgbm90IHRha2VuIGludG8gYWNjb3VudC4KICBUeXBlTWFwIGdldCB0eXBlTWFwIHsKICAgIGlmIChfdHlwZU1hcEJhc2UgPT0gbnVsbCkgewogICAgICBfdHlwZU1hcEJhc2UgPSBfdHlwZU1hcFdoZW5UcnVlLmpvaW4oX3R5cGVNYXBXaGVuRmFsc2UpOwogICAgICBfdHlwZU1hcFdoZW5UcnVlID0gX3R5cGVNYXBXaGVuRmFsc2UgPSBudWxsOwogICAgfQogICAgcmV0dXJuIF90eXBlTWFwQmFzZTsKICB9CgogIC8vLyBTZXRzIHRoZSBsb2NhbCB2YXJpYWJsZSB0eXBlIHByb21vdGlvbnMgZm9yIHdoZW4gdGhlIGJvb2xlYW4gdmFsdWUgb2YKICAvLy8gdGhlIG1vc3QgcmVjZW50IG5vZGUgaXMgbm90IHRha2VuIGludG8gYWNjb3VudC4KICB2b2lkIHNldCB0eXBlTWFwKFR5cGVNYXAgdmFsdWUpIHsKICAgIF90eXBlTWFwQmFzZSA9IHZhbHVlOwogICAgX3R5cGVNYXBXaGVuVHJ1ZSA9IF90eXBlTWFwV2hlbkZhbHNlID0gbnVsbDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBsb2NhbCB2YXJpYWJsZSB0eXBlIHByb21vdGlvbnMgZm9yIHdoZW4gdGhlIGJvb2xlYW4gdmFsdWUgb2YKICAvLy8gdGhlIG1vc3QgcmVjZW50IG5vZGUgaXMgYHRydWVgLgogIFR5cGVNYXAgZ2V0IHR5cGVNYXBXaGVuVHJ1ZSA9PiBfdHlwZU1hcFdoZW5UcnVlID8/IF90eXBlTWFwQmFzZTsKCiAgLy8vIFNldHMgdGhlIGxvY2FsIHZhcmlhYmxlIHR5cGUgcHJvbW90aW9ucyBmb3Igd2hlbiB0aGUgYm9vbGVhbiB2YWx1ZSBvZgogIC8vLyB0aGUgbW9zdCByZWNlbnQgbm9kZSBpcyBgdHJ1ZWAuCiAgdm9pZCBzZXQgdHlwZU1hcFdoZW5UcnVlKFR5cGVNYXAgdmFsdWUpIHsKICAgIF90eXBlTWFwV2hlblRydWUgPSB2YWx1ZTsKICAgIF90eXBlTWFwQmFzZSA9IG51bGw7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbG9jYWwgdmFyaWFibGUgdHlwZSBwcm9tb3Rpb25zIGZvciB3aGVuIHRoZSBib29sZWFuIHZhbHVlIG9mCiAgLy8vIHRoZSBtb3N0IHJlY2VudCBub2RlIGlzIGBmYWxzZWAuCiAgVHlwZU1hcCBnZXQgdHlwZU1hcFdoZW5GYWxzZSA9PiBfdHlwZU1hcFdoZW5GYWxzZSA/PyBfdHlwZU1hcEJhc2U7CgogIC8vLyBTZXRzIHRoZSBsb2NhbCB2YXJpYWJsZSB0eXBlIHByb21vdGlvbnMgZm9yIHdoZW4gdGhlIGJvb2xlYW4gdmFsdWUgb2YKICAvLy8gdGhlIG1vc3QgcmVjZW50IG5vZGUgaXMgYGZhbHNlYC4KICB2b2lkIHNldCB0eXBlTWFwV2hlbkZhbHNlKFR5cGVNYXAgdmFsdWUpIHsKICAgIF90eXBlTWFwV2hlbkZhbHNlID0gdmFsdWU7CiAgICBfdHlwZU1hcEJhc2UgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgZGVmYXVsdE5vZGUoaXIuTm9kZSBub2RlKSA9PgogICAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCdVbmhhbmRsZWQgbm9kZSAkbm9kZSAoJHtub2RlLnJ1bnRpbWVUeXBlfSknKTsKCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdENvbXBvbmVudChpci5Db21wb25lbnQgbm9kZSkgewogICAgdmlzaXROb2Rlcyhub2RlLmxpYnJhcmllcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0TGlicmFyeShpci5MaWJyYXJ5IG5vZGUpIHsKICAgIHZpc2l0Tm9kZXMobm9kZS5jbGFzc2VzKTsKICAgIHZpc2l0Tm9kZXMobm9kZS5wcm9jZWR1cmVzKTsKICAgIHZpc2l0Tm9kZXMobm9kZS5maWVsZHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdENsYXNzKGlyLkNsYXNzIG5vZGUpIHsKICAgIHZpc2l0Tm9kZXMobm9kZS5jb25zdHJ1Y3RvcnMpOwogICAgdmlzaXROb2Rlcyhub2RlLnByb2NlZHVyZXMpOwogICAgdmlzaXROb2Rlcyhub2RlLmZpZWxkcyk7CiAgfQoKICBpci5JbnRlcmZhY2VUeXBlIGdldEludGVyZmFjZVR5cGVPZihpci5EYXJ0VHlwZSB0eXBlKSB7CiAgICB3aGlsZSAodHlwZSBpcyBpci5UeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICB0eXBlID0gKHR5cGUgYXMgaXIuVHlwZVBhcmFtZXRlclR5cGUpLnBhcmFtZXRlci5ib3VuZDsKICAgIH0KICAgIHJldHVybiB0eXBlIGlzIGlyLkludGVyZmFjZVR5cGUgPyB0eXBlIDogbnVsbDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiBhcyBhbiBpbnN0YW50aWF0aW9uIG9mCiAgLy8vIFtzdXBlcmNsYXNzXS4KICAvLy8KICAvLy8gU2hvdWxkIG9ubHkgYmUgdXNlZCBvbiBjb2RlIGNvbXBpbGVkIGluIHN0cm9uZyBtb2RlLCBhcyB0aGlzIG1ldGhvZAogIC8vLyBhc3N1bWVzIHRoZSBJUiBpcyBzdHJvbmdseSB0eXBlZC4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgZnVydGhlcm1vcmUgYXNzdW1lcyB0aGF0IHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGFjdHVhbGx5CiAgLy8vIGlzIGEgc3VidHlwZSBvZiAoc29tZSBpbnN0YW50aWF0aW9uIG9mKSB0aGUgZ2l2ZW4gW3N1cGVyY2xhc3NdLgogIC8vLyBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSB0aGUgcmF3IHR5cGUgb2YgW3N1cGVyY2xhc3NdIGlzIHJldHVybmVkLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyBkZXJpdmVkIGZyb20gYGlyLkV4cHJlc3Npb24uZ2V0U3RhdGljVHlwZUFzSW5zdGFuY2VPZmAuCiAgaXIuSW50ZXJmYWNlVHlwZSBnZXRUeXBlQXNJbnN0YW5jZU9mKGlyLkRhcnRUeXBlIHR5cGUsIGlyLkNsYXNzIHN1cGVyY2xhc3MpIHsKICAgIC8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhlIHByb2dyYW0gaXMgY29ycmVjdGx5IHR5cGVkLCBzbyBpZiB0aGUgc3VwZXJjbGFzcwogICAgLy8gaXMgbm90IGdlbmVyaWMsIHdlIGNhbiBqdXN0IHJldHVybiBpdHMgcmF3IHR5cGUgd2l0aG91dCBjb21wdXRpbmcgdGhlCiAgICAvLyB0eXBlIG9mIHRoaXMgZXhwcmVzc2lvbi4gIEl0IGFsc28gZW5zdXJlcyB0aGF0IGFsbCB0eXBlcyBhcmUgY29uc2lkZXJlZAogICAgLy8gc3VidHlwZXMgb2YgT2JqZWN0IChub3QganVzdCBpbnRlcmZhY2UgdHlwZXMpLCBhbmQgZnVuY3Rpb24gdHlwZXMgYXJlCiAgICAvLyBjb25zaWRlcmVkIHN1YnR5cGVzIG9mIEZ1bmN0aW9uLgogICAgaWYgKHN1cGVyY2xhc3MudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICByZXR1cm4gc3VwZXJjbGFzcy5yYXdUeXBlOwogICAgfQogICAgd2hpbGUgKHR5cGUgaXMgaXIuVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgdHlwZSA9ICh0eXBlIGFzIGlyLlR5cGVQYXJhbWV0ZXJUeXBlKS5wYXJhbWV0ZXIuYm91bmQ7CiAgICB9CiAgICBpZiAodHlwZSA9PSB0eXBlRW52aXJvbm1lbnQubnVsbFR5cGUpIHsKICAgICAgcmV0dXJuIHN1cGVyY2xhc3MuYm90dG9tVHlwZTsKICAgIH0KICAgIGlmICh0eXBlIGlzIGlyLkludGVyZmFjZVR5cGUpIHsKICAgICAgaXIuSW50ZXJmYWNlVHlwZSB1cGNhc3RUeXBlID0KICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5nZXRUeXBlQXNJbnN0YW5jZU9mKHR5cGUsIHN1cGVyY2xhc3MpOwogICAgICBpZiAodXBjYXN0VHlwZSAhPSBudWxsKSByZXR1cm4gdXBjYXN0VHlwZTsKICAgIH0gZWxzZSBpZiAodHlwZSBpcyBpci5Cb3R0b21UeXBlKSB7CiAgICAgIHJldHVybiBzdXBlcmNsYXNzLmJvdHRvbVR5cGU7CiAgICB9CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTaG91bGQgd2UgYXNzZXJ0IHRoYXQgdGhpcyBkb2Vzbid0IGhhcHBlbj8KICAgIHJldHVybiBzdXBlcmNsYXNzLnJhd1R5cGU7CiAgfQoKICAvLy8gQ29tcHV0ZXMgdGhlIHJlc3VsdCB0eXBlIG9mIHRoZSBwcm9wZXJ0eSBhY2Nlc3MgW25vZGVdIG9uIGEgcmVjZWl2ZXIgb2YKICAvLy8gdHlwZSBbcmVjZWl2ZXJUeXBlXS4KICAvLy8KICAvLy8gSWYgdGhlIGBub2RlLmludGVyZmFjZVRhcmdldGAgaXMgYG51bGxgIGJ1dCBtYXRjaGVzIGFuIGBPYmplY3RgIG1lbWJlcgogIC8vLyBpdCBpcyB1cGRhdGVkIHRvIHRhcmdldCB0aGlzIG1lbWJlci4KICBpci5EYXJ0VHlwZSBfY29tcHV0ZVByb3BlcnR5R2V0VHlwZSgKICAgICAgaXIuUHJvcGVydHlHZXQgbm9kZSwgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlKSB7CiAgICBpci5NZW1iZXIgaW50ZXJmYWNlVGFyZ2V0ID0gbm9kZS5pbnRlcmZhY2VUYXJnZXQ7CiAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0ID09IG51bGwgJiYgcmVjZWl2ZXJUeXBlIGlzIGlyLkludGVyZmFjZVR5cGUpIHsKICAgICAgaW50ZXJmYWNlVGFyZ2V0ID0gbm9kZS5pbnRlcmZhY2VUYXJnZXQgPQogICAgICAgICAgaGllcmFyY2h5LmdldEludGVyZmFjZU1lbWJlcihyZWNlaXZlclR5cGUuY2xhc3NOb2RlLCBub2RlLm5hbWUpOwogICAgfQogICAgaWYgKGludGVyZmFjZVRhcmdldCAhPSBudWxsKSB7CiAgICAgIGlyLkNsYXNzIHN1cGVyY2xhc3MgPSBpbnRlcmZhY2VUYXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIHJlY2VpdmVyVHlwZSA9IGdldFR5cGVBc0luc3RhbmNlT2YocmVjZWl2ZXJUeXBlLCBzdXBlcmNsYXNzKTsKICAgICAgcmV0dXJuIGlyLlN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZShyZWNlaXZlclR5cGUpCiAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUoaW50ZXJmYWNlVGFyZ2V0LmdldHRlclR5cGUpOwogICAgfQogICAgLy8gVHJlYXQgdGhlIHByb3BlcnRpZXMgb2YgT2JqZWN0IHNwZWNpYWxseS4KICAgIFN0cmluZyBuYW1lU3RyaW5nID0gbm9kZS5uYW1lLm5hbWU7CiAgICBpZiAobmFtZVN0cmluZyA9PSAnaGFzaENvZGUnKSB7CiAgICAgIHJldHVybiB0eXBlRW52aXJvbm1lbnQuaW50VHlwZTsKICAgIH0gZWxzZSBpZiAobmFtZVN0cmluZyA9PSAncnVudGltZVR5cGUnKSB7CiAgICAgIHJldHVybiB0eXBlRW52aXJvbm1lbnQudHlwZVR5cGU7CiAgICB9CiAgICByZXR1cm4gY29uc3QgaXIuRHluYW1pY1R5cGUoKTsKICB9CgogIHZvaWQgaGFuZGxlUHJvcGVydHlHZXQoCiAgICAgIGlyLlByb3BlcnR5R2V0IG5vZGUsIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgaXIuRGFydFR5cGUgcmVzdWx0VHlwZSkge30KCiAgdm9pZCBoYW5kbGVSdW50aW1lVHlwZVVzZShpci5Qcm9wZXJ0eUdldCBub2RlLCBSdW50aW1lVHlwZVVzZUtpbmQga2luZCwKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBpci5EYXJ0VHlwZSBhcmd1bWVudFR5cGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0UHJvcGVydHlHZXQoaXIuUHJvcGVydHlHZXQgbm9kZSkgewogICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gdmlzaXROb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgaXIuRGFydFR5cGUgcmVzdWx0VHlwZSA9IF9leHByZXNzaW9uVHlwZUNhY2hlW25vZGVdID0KICAgICAgICBfY29tcHV0ZVByb3BlcnR5R2V0VHlwZShub2RlLCByZWNlaXZlclR5cGUpOwogICAgcmVjZWl2ZXJUeXBlID0gX25hcnJvd0luc3RhbmNlUmVjZWl2ZXIobm9kZS5pbnRlcmZhY2VUYXJnZXQsIHJlY2VpdmVyVHlwZSk7CiAgICBoYW5kbGVQcm9wZXJ0eUdldChub2RlLCByZWNlaXZlclR5cGUsIHJlc3VsdFR5cGUpOwogICAgaWYgKG5vZGUubmFtZS5uYW1lID09IElkZW50aWZpZXJzLnJ1bnRpbWVUeXBlXykgewogICAgICBSdW50aW1lVHlwZVVzZURhdGEgZGF0YSA9CiAgICAgICAgICBjb21wdXRlUnVudGltZVR5cGVVc2UoX3BlbmRpbmdSdW50aW1lVHlwZVVzZURhdGEsIG5vZGUpOwogICAgICBpZiAoZGF0YS5sZWZ0UnVudGltZVR5cGVFeHByZXNzaW9uID09IG5vZGUpIHsKICAgICAgICAvLyBbbm9kZV0gaXMgdGhlIGxlZnQgKG9yIHNpbmdsZSkgb2NjdXJyZW5jZSBvZiBgLnJ1bnRpbWVUeXBlYCBzbyB3ZQogICAgICAgIC8vIGNhbiBzZXQgdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSByZWNlaXZlciBleHByZXNzaW9uLgogICAgICAgIGRhdGEucmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXJUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFtub2RlXSBpcyB0aGUgcmlnaHQgb2NjdXJyZW5jZSBvZiBgLnJ1bnRpbWVUeXBlYCBzbyB3ZQogICAgICAgIC8vIGNhbiBzZXQgdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBhcmd1bWVudCBleHByZXNzaW9uLgogICAgICAgIGFzc2VydChkYXRhLnJpZ2h0UnVudGltZVR5cGVFeHByZXNzaW9uID09IG5vZGUsCiAgICAgICAgICAgICJVbmV4cGVjdGVkIFJ1bnRpbWVUeXBlVXNlRGF0YSBmb3IgJG5vZGU6ICRkYXRhIik7CiAgICAgICAgZGF0YS5hcmd1bWVudFR5cGUgPSByZWNlaXZlclR5cGU7CiAgICAgIH0KICAgICAgaWYgKGRhdGEuaXNDb21wbGV0ZSkgewogICAgICAgIC8vLyBXZSBub3cgaGF2ZSBhbGwgbmVlZCBzdGF0aWMgdHlwZXMgc28gd2UgY2FuIHJlbW92ZSB0aGUgZGF0YSBmcm9tCiAgICAgICAgLy8vIHRoZSBjYWNoZSBhbmQgaGFuZGxlIHRoZSBydW50aW1lIHR5cGUgdXNlLgogICAgICAgIF9wZW5kaW5nUnVudGltZVR5cGVVc2VEYXRhLnJlbW92ZShkYXRhLmxlZnRSdW50aW1lVHlwZUV4cHJlc3Npb24pOwogICAgICAgIGlmIChkYXRhLnJpZ2h0UnVudGltZVR5cGVFeHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgICAgIF9wZW5kaW5nUnVudGltZVR5cGVVc2VEYXRhLnJlbW92ZShkYXRhLnJpZ2h0UnVudGltZVR5cGVFeHByZXNzaW9uKTsKICAgICAgICB9CiAgICAgICAgaGFuZGxlUnVudGltZVR5cGVVc2UoCiAgICAgICAgICAgIG5vZGUsIGRhdGEua2luZCwgZGF0YS5yZWNlaXZlclR5cGUsIGRhdGEuYXJndW1lbnRUeXBlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdFR5cGU7CiAgfQoKICB2b2lkIGhhbmRsZVByb3BlcnR5U2V0KAogICAgICBpci5Qcm9wZXJ0eVNldCBub2RlLCBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIGlyLkRhcnRUeXBlIHZhbHVlVHlwZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRQcm9wZXJ0eVNldChpci5Qcm9wZXJ0eVNldCBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUgPSB2aXNpdE5vZGUobm9kZS5yZWNlaXZlcik7CiAgICBpci5EYXJ0VHlwZSB2YWx1ZVR5cGUgPSBzdXBlci52aXNpdFByb3BlcnR5U2V0KG5vZGUpOwogICAgaXIuTWVtYmVyIGludGVyZmFjZVRhcmdldCA9IG5vZGUuaW50ZXJmYWNlVGFyZ2V0OwogICAgaWYgKGludGVyZmFjZVRhcmdldCA9PSBudWxsICYmIHJlY2VpdmVyVHlwZSBpcyBpci5JbnRlcmZhY2VUeXBlKSB7CiAgICAgIGludGVyZmFjZVRhcmdldCA9IGhpZXJhcmNoeQogICAgICAgICAgLmdldEludGVyZmFjZU1lbWJlcihyZWNlaXZlclR5cGUuY2xhc3NOb2RlLCBub2RlLm5hbWUsIHNldHRlcjogdHJ1ZSk7CiAgICAgIGlmIChpbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCkgewogICAgICAgIGlyLkNsYXNzIHN1cGVyY2xhc3MgPSBpbnRlcmZhY2VUYXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgaXIuU3Vic3RpdHV0aW9uIHJlY2VpdmVyU3Vic3RpdHV0aW9uID0KICAgICAgICAgICAgaXIuU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKAogICAgICAgICAgICAgICAgZ2V0VHlwZUFzSW5zdGFuY2VPZihyZWNlaXZlclR5cGUsIHN1cGVyY2xhc3MpKTsKICAgICAgICBpci5EYXJ0VHlwZSBzZXR0ZXJUeXBlID0KICAgICAgICAgICAgcmVjZWl2ZXJTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoaW50ZXJmYWNlVGFyZ2V0LnNldHRlclR5cGUpOwogICAgICAgIGlmICghdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKHZhbHVlVHlwZSwgc2V0dGVyVHlwZSkpIHsKICAgICAgICAgIC8vIFdlIG5lZWQgdG8gaW5zZXJ0IGFuIGltcGxpY2l0IGNhc3QgdG8gcHJlc2VydmUgdGhlIGludmFyaWFudCB0aGF0CiAgICAgICAgICAvLyBhIHByb3BlcnR5IHNldCB3aXRoIGEga25vd24gaW50ZXJmYWNlIHRhcmdldCBpcyBhbHNvIHN0YXRpY2FsbHkKICAgICAgICAgIC8vIGNoZWNrZWQuCiAgICAgICAgICBpci5Bc0V4cHJlc3Npb24gaW1wbGljaXRDYXN0ID0KICAgICAgICAgICAgICBuZXcgaXIuQXNFeHByZXNzaW9uKG5vZGUudmFsdWUsIHNldHRlclR5cGUpCiAgICAgICAgICAgICAgICAuLmlzVHlwZUVycm9yID0gdHJ1ZQogICAgICAgICAgICAgICAgLi5wYXJlbnQgPSBub2RlOwogICAgICAgICAgbm9kZS52YWx1ZSA9IGltcGxpY2l0Q2FzdDsKICAgICAgICAgIC8vIFZpc2l0IHRoZSBuZXdseSBjcmVhdGVkIGFzIGV4cHJlc3Npb247IHRoZSBvcmlnaW5hbCB2YWx1ZSBoYXMKICAgICAgICAgIC8vIGFscmVhZHkgYmVlbiB2aXNpdGVkLgogICAgICAgICAgaGFuZGxlQXNFeHByZXNzaW9uKGltcGxpY2l0Q2FzdCwgdmFsdWVUeXBlKTsKICAgICAgICAgIHZhbHVlVHlwZSA9IHNldHRlclR5cGU7CiAgICAgICAgfQogICAgICAgIG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID0gaW50ZXJmYWNlVGFyZ2V0OwogICAgICB9CiAgICB9CiAgICByZWNlaXZlclR5cGUgPSBfbmFycm93SW5zdGFuY2VSZWNlaXZlcihpbnRlcmZhY2VUYXJnZXQsIHJlY2VpdmVyVHlwZSk7CiAgICBoYW5kbGVQcm9wZXJ0eVNldChub2RlLCByZWNlaXZlclR5cGUsIHZhbHVlVHlwZSk7CiAgICByZXR1cm4gdmFsdWVUeXBlOwogIH0KCiAgdm9pZCBoYW5kbGVEaXJlY3RQcm9wZXJ0eUdldChpci5EaXJlY3RQcm9wZXJ0eUdldCBub2RlLAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoaXIuRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gdmlzaXROb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgaXIuQ2xhc3Mgc3VwZXJjbGFzcyA9IG5vZGUudGFyZ2V0LmVuY2xvc2luZ0NsYXNzOwogICAgcmVjZWl2ZXJUeXBlID0gZ2V0VHlwZUFzSW5zdGFuY2VPZihyZWNlaXZlclR5cGUsIHN1cGVyY2xhc3MpOwogICAgaXIuRGFydFR5cGUgcmVzdWx0VHlwZSA9IGlyLlN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZShyZWNlaXZlclR5cGUpCiAgICAgICAgLnN1YnN0aXR1dGVUeXBlKG5vZGUudGFyZ2V0LmdldHRlclR5cGUpOwogICAgX2V4cHJlc3Npb25UeXBlQ2FjaGVbbm9kZV0gPSByZXN1bHRUeXBlOwogICAgaGFuZGxlRGlyZWN0UHJvcGVydHlHZXQobm9kZSwgcmVjZWl2ZXJUeXBlLCByZXN1bHRUeXBlKTsKICAgIHJldHVybiByZXN1bHRUeXBlOwogIH0KCiAgdm9pZCBoYW5kbGVEaXJlY3RNZXRob2RJbnZvY2F0aW9uKAogICAgICBpci5EaXJlY3RNZXRob2RJbnZvY2F0aW9uIG5vZGUsCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzLAogICAgICBpci5EYXJ0VHlwZSByZXR1cm5UeXBlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24oaXIuRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUgPSB2aXNpdE5vZGUobm9kZS5yZWNlaXZlcik7CiAgICBBcmd1bWVudFR5cGVzIGFyZ3VtZW50VHlwZXMgPSBfdmlzaXRBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgaXIuRGFydFR5cGUgcmV0dXJuVHlwZTsKICAgIGlmICh0eXBlRW52aXJvbm1lbnQuaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yKG5vZGUudGFyZ2V0KSkgewogICAgICBpci5EYXJ0VHlwZSBhcmd1bWVudFR5cGUgPSBhcmd1bWVudFR5cGVzLnBvc2l0aW9uYWxbMF07CiAgICAgIHJldHVyblR5cGUgPSB0eXBlRW52aXJvbm1lbnQuZ2V0VHlwZU9mT3ZlcmxvYWRlZEFyaXRobWV0aWMoCiAgICAgICAgICByZWNlaXZlclR5cGUsIGFyZ3VtZW50VHlwZSk7CiAgICB9IGVsc2UgewogICAgICBpci5DbGFzcyBzdXBlcmNsYXNzID0gbm9kZS50YXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIHJlY2VpdmVyVHlwZSA9IGdldFR5cGVBc0luc3RhbmNlT2YocmVjZWl2ZXJUeXBlLCBzdXBlcmNsYXNzKTsKICAgICAgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSA9IGlyLlN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZShyZWNlaXZlclR5cGUpCiAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUobm9kZS50YXJnZXQuZnVuY3Rpb24ucmV0dXJuVHlwZSk7CiAgICAgIHJldHVyblR5cGUgPSBpci5TdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICAgIG5vZGUudGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLCBub2RlLmFyZ3VtZW50cy50eXBlcykKICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZShyZXR1cm5UeXBlKTsKICAgIH0KICAgIF9leHByZXNzaW9uVHlwZUNhY2hlW25vZGVdID0gcmV0dXJuVHlwZTsKICAgIGhhbmRsZURpcmVjdE1ldGhvZEludm9jYXRpb24obm9kZSwgcmVjZWl2ZXJUeXBlLCBhcmd1bWVudFR5cGVzLCByZXR1cm5UeXBlKTsKICAgIHJldHVybiByZXR1cm5UeXBlOwogIH0KCiAgdm9pZCBoYW5kbGVEaXJlY3RQcm9wZXJ0eVNldChpci5EaXJlY3RQcm9wZXJ0eVNldCBub2RlLAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIGlyLkRhcnRUeXBlIHZhbHVlVHlwZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChpci5EaXJlY3RQcm9wZXJ0eVNldCBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUgPSB2aXNpdE5vZGUobm9kZS5yZWNlaXZlcik7CiAgICBpci5EYXJ0VHlwZSB2YWx1ZVR5cGUgPSBzdXBlci52aXNpdERpcmVjdFByb3BlcnR5U2V0KG5vZGUpOwogICAgaGFuZGxlRGlyZWN0UHJvcGVydHlTZXQobm9kZSwgcmVjZWl2ZXJUeXBlLCB2YWx1ZVR5cGUpOwogICAgcmV0dXJuIHZhbHVlVHlwZTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbaW50ZXJmYWNlVGFyZ2V0XSBpcyBhbiBhcml0aG1ldGljIG9wZXJhdG9yIHdob3NlIHJlc3VsdAogIC8vLyB0eXBlIGlzIGNvbXB1dGVkIHVzaW5nIGJvdGggdGhlIHJlY2VpdmVyIHR5cGUgYW5kIHRoZSBhcmd1bWVudCB0eXBlLgogIC8vLwogIC8vLyBWaXNpdG9ycyB0aGF0IHN1YmNsYXNzIHRoZSBbU3RhdGljVHlwZVZpc2l0b3JdIG11c3Qgc3BlY2lhbCBjYXNlIHRoaXMKICAvLy8gdGFyZ2V0IGFzIHRvIGF2b2lkIHZpc2l0aW5nIHRoZSBhcmd1bWVudCB0d2ljZS4KICBib29sIGlzU3BlY2lhbENhc2VkQmluYXJ5T3BlcmF0b3IoaXIuTWVtYmVyIGludGVyZmFjZVRhcmdldCkgewogICAgcmV0dXJuIGludGVyZmFjZVRhcmdldCBpcyBpci5Qcm9jZWR1cmUgJiYKICAgICAgICB0eXBlRW52aXJvbm1lbnQuaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yKGludGVyZmFjZVRhcmdldCk7CiAgfQoKICBpci5NZW1iZXIgX2dldE1lbWJlcihpci5DbGFzcyBjbHMsIFN0cmluZyBuYW1lKSB7CiAgICBmb3IgKGlyLk1lbWJlciBtZW1iZXIgaW4gY2xzLm1lbWJlcnMpIHsKICAgICAgaWYgKG1lbWJlci5uYW1lLm5hbWUgPT0gbmFtZSkgcmV0dXJuIG1lbWJlcjsKICAgIH0KICAgIHRocm93IGZhaWwoIk1lbWJlciAnJG5hbWUnIG5vdCBmb3VuZCBpbiAkY2xzIik7CiAgfQoKICBpci5Qcm9jZWR1cmUgX29iamVjdEVxdWFsczsKICBpci5Qcm9jZWR1cmUgZ2V0IG9iamVjdEVxdWFscyA9PgogICAgICBfb2JqZWN0RXF1YWxzID8/PSBfZ2V0TWVtYmVyKHR5cGVFbnZpcm9ubWVudC5vYmplY3RUeXBlLmNsYXNzTm9kZSwgJz09Jyk7CgogIC8vLyBSZXR1cm5zIFtyZWNlaXZlclR5cGVdIG5hcnJvd2VkIHRvIGVuY2xvc2luZyBjbGFzcyBvZiBbaW50ZXJmYWNlVGFyZ2V0XS4KICAvLy8KICAvLy8gSWYgW2ludGVyZmFjZVRhcmdldF0gaXMgYG51bGxgIG9yIGByZWNlaXZlclR5cGVgIGlzIF9ub3RfIGBkeW5hbWljYCBubwogIC8vLyBuYXJyb3dpbmcgaXMgcGVyZm9ybWVkLgogIGlyLkRhcnRUeXBlIF9uYXJyb3dJbnN0YW5jZVJlY2VpdmVyKAogICAgICBpci5NZW1iZXIgaW50ZXJmYWNlVGFyZ2V0LCBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUpIHsKICAgIGlmIChpbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCAmJiByZWNlaXZlclR5cGUgPT0gY29uc3QgaXIuRHluYW1pY1R5cGUoKSkgewogICAgICByZWNlaXZlclR5cGUgPSBpbnRlcmZhY2VUYXJnZXQuZW5jbG9zaW5nQ2xhc3MudGhpc1R5cGU7CiAgICB9CiAgICByZXR1cm4gcmVjZWl2ZXJUeXBlOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFttZW1iZXJdIGNhbiBiZSBjYWxsZWQgd2l0aCB0aGUgc3RydWN0dXJlIG9mCiAgLy8vIFthcmd1bWVudHNdLgogIGJvb2wgX2lzQXBwbGljYWJsZShpci5Bcmd1bWVudHMgYXJndW1lbnRzLCBpci5NZW1iZXIgbWVtYmVyKSB7CiAgICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2FyZ3VtZW50c10gYXJlIGFwcGxpY2FibGUgdG8gdGhlIGZ1bmN0aW9uIHR5cGUKICAgIC8vLyBzdHJ1Y3R1cmUuCiAgICBib29sIGlzRnVuY3Rpb25UeXBlQXBwbGljYWJsZSgKICAgICAgICBpbnQgdHlwZVBhcmFtZXRlckNvdW50LAogICAgICAgIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIGludCBwb3NpdGlvbmFsUGFyYW1ldGVyQ291bnQsCiAgICAgICAgSXRlcmFibGU8U3RyaW5nPiBGdW5jdGlvbigpIGdldE5hbWVkUGFyYW1ldGVycykgewogICAgICBpZiAoYXJndW1lbnRzLnR5cGVzLmlzTm90RW1wdHkgJiYKICAgICAgICAgIGFyZ3VtZW50cy50eXBlcy5sZW5ndGggIT0gdHlwZVBhcmFtZXRlckNvdW50KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmIChhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPCByZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmIChhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPiBwb3NpdGlvbmFsUGFyYW1ldGVyQ291bnQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgSXRlcmFibGU8U3RyaW5nPiBuYW1lZFBhcmFtZXRlcnMgPSBnZXROYW1lZFBhcmFtZXRlcnMoKTsKICAgICAgaWYgKGFyZ3VtZW50cy5uYW1lZC5sZW5ndGggPiBuYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmIChhcmd1bWVudHMubmFtZWQuaXNOb3RFbXB0eSkgewogICAgICAgIGZvciAoaXIuTmFtZWRFeHByZXNzaW9uIG5hbWVkQXJndW1lbnRzIGluIGFyZ3VtZW50cy5uYW1lZCkgewogICAgICAgICAgaWYgKCFuYW1lZFBhcmFtZXRlcnMuY29udGFpbnMobmFtZWRBcmd1bWVudHMubmFtZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2FyZ3VtZW50c10gYXJlIGFwcGxpY2FibGUgdG8gYSB2YWx1ZSBvZiB0aGUgc3RhdGljCiAgICAvLy8gW3R5cGVdLgogICAgYm9vbCBpc1R5cGVBcHBsaWNhYmxlKGlyLkRhcnRUeXBlIHR5cGUpIHsKICAgICAgaWYgKHR5cGUgaXMgaXIuRHluYW1pY1R5cGUpIHJldHVybiB0cnVlOwogICAgICBpZiAodHlwZSA9PSB0eXBlRW52aXJvbm1lbnQucmF3RnVuY3Rpb25UeXBlKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKHR5cGUgaXMgaXIuRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb25UeXBlQXBwbGljYWJsZSgKICAgICAgICAgICAgdHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGgsCiAgICAgICAgICAgIHR5cGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICAgICAgdHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgsCiAgICAgICAgICAgICgpID0+IHR5cGUubmFtZWRQYXJhbWV0ZXJzLm1hcCgocCkgPT4gcC5uYW1lKS50b1NldCgpKTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKG1lbWJlciBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgaWYgKG1lbWJlci5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuU2V0dGVyIHx8CiAgICAgICAgICBtZW1iZXIua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLkZhY3RvcnkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5HZXR0ZXIpIHsKICAgICAgICByZXR1cm4gaXNUeXBlQXBwbGljYWJsZShtZW1iZXIuZ2V0dGVyVHlwZSk7CiAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5NZXRob2QgfHwKICAgICAgICAgIG1lbWJlci5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuT3BlcmF0b3IpIHsKICAgICAgICByZXR1cm4gaXNGdW5jdGlvblR5cGVBcHBsaWNhYmxlKAogICAgICAgICAgICBtZW1iZXIuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoLAogICAgICAgICAgICBtZW1iZXIuZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICAgICAgbWVtYmVyLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCwKICAgICAgICAgICAgKCkgPT4gbWVtYmVyLmZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5tYXAoKHApID0+IHAubmFtZSkudG9TZXQoKSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobWVtYmVyIGlzIGlyLkZpZWxkKSB7CiAgICAgIHJldHVybiBpc1R5cGVBcHBsaWNhYmxlKG1lbWJlci50eXBlKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBVcGRhdGUgdGhlIGludGVyZmFjZSB0YXJnZXQgb24gW25vZGVdLgogIC8vLwogIC8vLyBUaGlzIGluc2VydHMgYW55IGltcGxpY2l0IGNhc3Qgb2YgdGhlIGFyZ3VtZW50cyBuZWNlc3NhcnkgdG8gdXBob2xkIHRoZQogIC8vLyBpbnZhcmlhbnQgdGhhdCBhIG1ldGhvZCBpbnZvY2F0aW9uIHdpdGggYW4gaW50ZXJmYWNlIHRhcmdldCBoYW5kbGVzCiAgLy8vIHRoZSBzdGF0aWMgdHlwZXMgYXQgdGhlIGNhbGwgc2l0ZS4KICB2b2lkIF91cGRhdGVNZXRob2RJbnZvY2F0aW9uVGFyZ2V0KAogICAgICBpci5NZXRob2RJbnZvY2F0aW9uIG5vZGUsCiAgICAgIEFyZ3VtZW50VHlwZXMgYXJndW1lbnRUeXBlcywKICAgICAgaXIuRGFydFR5cGUgZnVuY3Rpb25UeXBlLAogICAgICBpci5NZW1iZXIgaW50ZXJmYWNlVGFyZ2V0KSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBIYW5kbGUgaW5jcmVtZW50YWwgdGFyZ2V0IGltcHJvdmVtZW50LgogICAgaWYgKG5vZGUuaW50ZXJmYWNlVGFyZ2V0ICE9IG51bGwpIHJldHVybjsKICAgIG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID0gaW50ZXJmYWNlVGFyZ2V0OwogICAgaWYgKGZ1bmN0aW9uVHlwZSBpcyEgaXIuRnVuY3Rpb25UeXBlKSByZXR1cm47CiAgICBpci5GdW5jdGlvblR5cGUgcGFyYW1ldGVyVHlwZXMgPSBmdW5jdGlvblR5cGU7CiAgICBNYXA8aW50LCBpci5EYXJ0VHlwZT4gbmVlZGVkUG9zaXRpb25hbENoZWNrcyA9IHt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlyLkRhcnRUeXBlIGFyZ3VtZW50VHlwZSA9IGFyZ3VtZW50VHlwZXMucG9zaXRpb25hbFtpXTsKICAgICAgaXIuRGFydFR5cGUgcGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGVzLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICBpZiAoIXR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihhcmd1bWVudFR5cGUsIHBhcmFtZXRlclR5cGUpKSB7CiAgICAgICAgbmVlZGVkUG9zaXRpb25hbENoZWNrc1tpXSA9IHBhcmFtZXRlclR5cGU7CiAgICAgIH0KICAgIH0KICAgIE1hcDxpbnQsIGlyLkRhcnRUeXBlPiBuZWVkZWROYW1lZENoZWNrcyA9IHt9OwogICAgZm9yIChpbnQgYXJndW1lbnRJbmRleCA9IDA7CiAgICAgICAgYXJndW1lbnRJbmRleCA8IG5vZGUuYXJndW1lbnRzLm5hbWVkLmxlbmd0aDsKICAgICAgICBhcmd1bWVudEluZGV4KyspIHsKICAgICAgaXIuTmFtZWRFeHByZXNzaW9uIG5hbWVkQXJndW1lbnQgPSBub2RlLmFyZ3VtZW50cy5uYW1lZFthcmd1bWVudEluZGV4XTsKICAgICAgaXIuRGFydFR5cGUgYXJndW1lbnRUeXBlID0gYXJndW1lbnRUeXBlcy5uYW1lZFthcmd1bWVudEluZGV4XTsKICAgICAgaXIuRGFydFR5cGUgcGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGVzLm5hbWVkUGFyYW1ldGVycwogICAgICAgICAgLnNpbmdsZVdoZXJlKChuYW1lZFR5cGUpID0+IG5hbWVkVHlwZS5uYW1lID09IG5hbWVkQXJndW1lbnQubmFtZSkKICAgICAgICAgIC50eXBlOwogICAgICBpZiAoIXR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihhcmd1bWVudFR5cGUsIHBhcmFtZXRlclR5cGUpKSB7CiAgICAgICAgbmVlZGVkTmFtZWRDaGVja3NbYXJndW1lbnRJbmRleF0gPSBwYXJhbWV0ZXJUeXBlOwogICAgICB9CiAgICB9CiAgICBpZiAobmVlZGVkUG9zaXRpb25hbENoZWNrcy5pc0VtcHR5ICYmIG5lZWRlZE5hbWVkQ2hlY2tzLmlzRW1wdHkpIHsKICAgICAgLy8gTm8gaW1wbGljaXQgY2FzdHMgbmVlZGVkCiAgICAgIHJldHVybjsKICAgIH0KCiAgICBMaXN0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IGxldFZhcmlhYmxlcyA9IFtdOwoKICAgIC8vIEFyZ3VtZW50cyBuZWVkIHRvIGJlIGhvaXN0ZWQgdG8gYW4gZW5jbG9zaW5nIGxldCBleHByZXNzaW9uIGluIG9yZGVyCiAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQgYmVmb3JlIGFueSBpbXBsaWNpdCBjYXN0LgoKICAgIGlyLkV4cHJlc3Npb24gdXBkYXRlQXJndW1lbnQoaXIuRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpci5UcmVlTm9kZSBwYXJlbnQsCiAgICAgICAgaXIuRGFydFR5cGUgYXJndW1lbnRUeXBlLCBpci5EYXJ0VHlwZSBjaGVja2VkUGFyYW1ldGVyVHlwZSkgewogICAgICBpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0KICAgICAgICAgIG5ldyBpci5WYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKGV4cHJlc3Npb24sIHR5cGU6IGFyZ3VtZW50VHlwZSk7CiAgICAgIC8vIFZpc2l0IHRoZSBuZXdseSBjcmVhdGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgogICAgICBoYW5kbGVWYXJpYWJsZURlY2xhcmF0aW9uKHZhcmlhYmxlKTsKICAgICAgbGV0VmFyaWFibGVzLmFkZCh2YXJpYWJsZSk7CiAgICAgIGlyLlZhcmlhYmxlR2V0IGdldCA9IG5ldyBpci5WYXJpYWJsZUdldCh2YXJpYWJsZSkuLnBhcmVudCA9IHBhcmVudDsKICAgICAgLy8gVmlzaXQgdGhlIG5ld2x5IGNyZWF0ZWQgdmFyaWFibGUgZ2V0LgogICAgICBoYW5kbGVWYXJpYWJsZUdldChnZXQsIGFyZ3VtZW50VHlwZSk7CiAgICAgIF9leHByZXNzaW9uVHlwZUNhY2hlW2dldF0gPSBhcmd1bWVudFR5cGU7CgogICAgICBpZiAoY2hlY2tlZFBhcmFtZXRlclR5cGUgPT0gbnVsbCkgewogICAgICAgIHJldHVybiBnZXQ7CiAgICAgIH0KICAgICAgLy8gV2UgbmVlZCB0byBpbnNlcnQgYW4gaW1wbGljaXQgY2FzdCB0byBwcmVzZXJ2ZSB0aGUgaW52YXJpYW50IHRoYXQKICAgICAgLy8gYSBtZXRob2QgaW52b2NhdGlvbiB3aXRoIGEga25vd24gaW50ZXJmYWNlIHRhcmdldCBpcyBhbHNvCiAgICAgIC8vIHN0YXRpY2FsbHkgY2hlY2tlZC4KICAgICAgaXIuQXNFeHByZXNzaW9uIGltcGxpY2l0Q2FzdCA9CiAgICAgICAgICBuZXcgaXIuQXNFeHByZXNzaW9uKGdldCwgY2hlY2tlZFBhcmFtZXRlclR5cGUpCiAgICAgICAgICAgIC4uaXNUeXBlRXJyb3IgPSB0cnVlCiAgICAgICAgICAgIC4ucGFyZW50ID0gcGFyZW50OwogICAgICAvLyBWaXNpdCB0aGUgbmV3bHkgY3JlYXRlZCBhcyBleHByZXNzaW9uOyB0aGUgb3JpZ2luYWwgdmFsdWUgaGFzCiAgICAgIC8vIGFscmVhZHkgYmVlbiB2aXNpdGVkLgogICAgICBoYW5kbGVBc0V4cHJlc3Npb24oaW1wbGljaXRDYXN0LCBhcmd1bWVudFR5cGUpOwogICAgICByZXR1cm4gaW1wbGljaXRDYXN0OwogICAgfQoKICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aDsgaW5kZXgrKykgewogICAgICBpci5EYXJ0VHlwZSBhcmd1bWVudFR5cGUgPSBhcmd1bWVudFR5cGVzLnBvc2l0aW9uYWxbaW5kZXhdOwogICAgICBub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsW2luZGV4XSA9IHVwZGF0ZUFyZ3VtZW50KAogICAgICAgICAgbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbFtpbmRleF0sCiAgICAgICAgICBub2RlLmFyZ3VtZW50cywKICAgICAgICAgIGFyZ3VtZW50VHlwZSwKICAgICAgICAgIG5lZWRlZFBvc2l0aW9uYWxDaGVja3NbaW5kZXhdKTsKICAgIH0KICAgIGZvciAoaW50IGFyZ3VtZW50SW5kZXggPSAwOwogICAgICAgIGFyZ3VtZW50SW5kZXggPCBub2RlLmFyZ3VtZW50cy5uYW1lZC5sZW5ndGg7CiAgICAgICAgYXJndW1lbnRJbmRleCsrKSB7CiAgICAgIGlyLk5hbWVkRXhwcmVzc2lvbiBuYW1lZEFyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHMubmFtZWRbYXJndW1lbnRJbmRleF07CiAgICAgIGlyLkRhcnRUeXBlIGFyZ3VtZW50VHlwZSA9IGFyZ3VtZW50VHlwZXMubmFtZWRbYXJndW1lbnRJbmRleF07CiAgICAgIG5hbWVkQXJndW1lbnQudmFsdWUgPSB1cGRhdGVBcmd1bWVudChuYW1lZEFyZ3VtZW50LnZhbHVlLCBuYW1lZEFyZ3VtZW50LAogICAgICAgICAgYXJndW1lbnRUeXBlLCBuZWVkZWROYW1lZENoZWNrc1thcmd1bWVudEluZGV4XSk7CiAgICB9CgogICAgaXIuRXhwcmVzc2lvbiBkdW1teSA9IG5ldyBpci5OdWxsTGl0ZXJhbCgpOwogICAgbm9kZS5yZXBsYWNlV2l0aChkdW1teSk7CiAgICBpci5FeHByZXNzaW9uIGJvZHkgPSBub2RlOwogICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIGxldFZhcmlhYmxlcy5yZXZlcnNlZCkgewogICAgICBib2R5ID0gbmV3IGlyLkxldCh2YXJpYWJsZSwgYm9keSk7CiAgICB9CiAgICBkdW1teS5yZXBsYWNlV2l0aChib2R5KTsKICB9CgogIC8vLyBDb21wdXRlcyB0aGUgcmVzdWx0IHR5cGUgb2YgdGhlIG1ldGhvZCBpbnZvY2F0aW9uIFtub2RlXSBvbiBhIHJlY2VpdmVyIG9mCiAgLy8vIHR5cGUgW3JlY2VpdmVyVHlwZV0uCiAgLy8vCiAgLy8vIElmIHRoZSBgbm9kZS5pbnRlcmZhY2VUYXJnZXRgIGlzIGBudWxsYCBidXQgbWF0Y2hlcyBhbiBgT2JqZWN0YCBtZW1iZXIKICAvLy8gaXQgaXMgdXBkYXRlZCB0byB0YXJnZXQgdGhpcyBtZW1iZXIuCiAgaXIuRGFydFR5cGUgX2NvbXB1dGVNZXRob2RJbnZvY2F0aW9uVHlwZShpci5NZXRob2RJbnZvY2F0aW9uIG5vZGUsCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzKSB7CiAgICBpci5NZW1iZXIgaW50ZXJmYWNlVGFyZ2V0ID0gbm9kZS5pbnRlcmZhY2VUYXJnZXQ7CiAgICAvLyBUT0RPKDM0NjAyKTogUmVtb3ZlIHdoZW4gYGludGVyZmFjZVRhcmdldGAgaXMgc2V0IG9uIHN5bnRoZXRpYyBjYWxscyB0bwogICAgLy8gPT0uCiAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0ID09IG51bGwgJiYKICAgICAgICBub2RlLm5hbWUubmFtZSA9PSAnPT0nICYmCiAgICAgICAgbm9kZS5hcmd1bWVudHMudHlwZXMuaXNFbXB0eSAmJgogICAgICAgIG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoID09IDEgJiYKICAgICAgICBub2RlLmFyZ3VtZW50cy5uYW1lZC5pc0VtcHR5KSB7CiAgICAgIGludGVyZmFjZVRhcmdldCA9IG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID0gb2JqZWN0RXF1YWxzOwogICAgfQogICAgaWYgKGludGVyZmFjZVRhcmdldCA9PSBudWxsICYmIHJlY2VpdmVyVHlwZSBpcyBpci5JbnRlcmZhY2VUeXBlKSB7CiAgICAgIGlyLk1lbWJlciBtZW1iZXIgPQogICAgICAgICAgaGllcmFyY2h5LmdldEludGVyZmFjZU1lbWJlcihyZWNlaXZlclR5cGUuY2xhc3NOb2RlLCBub2RlLm5hbWUpOwogICAgICBpZiAoX2lzQXBwbGljYWJsZShub2RlLmFyZ3VtZW50cywgbWVtYmVyKSkgewogICAgICAgIGludGVyZmFjZVRhcmdldCA9IG1lbWJlcjsKICAgICAgfQogICAgfQogICAgaWYgKGludGVyZmFjZVRhcmdldCAhPSBudWxsKSB7CiAgICAgIGlyLkNsYXNzIHN1cGVyY2xhc3MgPSBpbnRlcmZhY2VUYXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIGlyLlN1YnN0aXR1dGlvbiByZWNlaXZlclN1YnN0aXR1dGlvbiA9IGlyLlN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZSgKICAgICAgICAgIGdldFR5cGVBc0luc3RhbmNlT2YocmVjZWl2ZXJUeXBlLCBzdXBlcmNsYXNzKSk7CiAgICAgIGlyLkRhcnRUeXBlIGdldHRlclR5cGUgPQogICAgICAgICAgcmVjZWl2ZXJTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoaW50ZXJmYWNlVGFyZ2V0LmdldHRlclR5cGUpOwogICAgICBpZiAoZ2V0dGVyVHlwZSBpcyBpci5GdW5jdGlvblR5cGUpIHsKICAgICAgICBpci5GdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0gZ2V0dGVyVHlwZTsKICAgICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0gbm9kZS5hcmd1bWVudHMudHlwZXM7CiAgICAgICAgaWYgKGludGVyZmFjZVRhcmdldCBpcyBpci5Qcm9jZWR1cmUgJiYKICAgICAgICAgICAgaW50ZXJmYWNlVGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkgJiYKICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBhIGR5bmFtaWMgY2FsbCB0aGUgaW52b2NhdGlvbiBkb2VzIG5vdCBoYXZlIHRoZQogICAgICAgICAgLy8gaW5mZXJyZWQgZGVmYXVsdCB0eXBlIGFyZ3VtZW50cyBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGVtIGhlcmUKICAgICAgICAgIC8vIHRvIHBlcmZvcm0gYSB2YWxpZCBzdWJzdGl0dXRpb24uCiAgICAgICAgICB0eXBlQXJndW1lbnRzID0gaW50ZXJmYWNlVGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzCiAgICAgICAgICAgICAgLm1hcCgodCkgPT4gcmVjZWl2ZXJTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUodC5kZWZhdWx0VHlwZSkpCiAgICAgICAgICAgICAgLnRvTGlzdCgpOwogICAgICAgIH0KICAgICAgICBnZXR0ZXJUeXBlID0gaXIuU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgICAgICAgIGZ1bmN0aW9uVHlwZS50eXBlUGFyYW1ldGVycywgdHlwZUFyZ3VtZW50cykKICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKGZ1bmN0aW9uVHlwZS53aXRob3V0VHlwZVBhcmFtZXRlcnMpOwogICAgICB9CiAgICAgIF91cGRhdGVNZXRob2RJbnZvY2F0aW9uVGFyZ2V0KAogICAgICAgICAgbm9kZSwgYXJndW1lbnRUeXBlcywgZ2V0dGVyVHlwZSwgaW50ZXJmYWNlVGFyZ2V0KTsKICAgICAgaWYgKGlzU3BlY2lhbENhc2VkQmluYXJ5T3BlcmF0b3IoaW50ZXJmYWNlVGFyZ2V0KSkgewogICAgICAgIGlyLkRhcnRUeXBlIGFyZ3VtZW50VHlwZSA9IGFyZ3VtZW50VHlwZXMucG9zaXRpb25hbFswXTsKICAgICAgICByZXR1cm4gdHlwZUVudmlyb25tZW50LmdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljKAogICAgICAgICAgICByZWNlaXZlclR5cGUsIGFyZ3VtZW50VHlwZSk7CiAgICAgIH0gZWxzZSBpZiAoZ2V0dGVyVHlwZSBpcyBpci5GdW5jdGlvblR5cGUpIHsKICAgICAgICByZXR1cm4gZ2V0dGVyVHlwZS5yZXR1cm5UeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBjb25zdCBpci5EeW5hbWljVHlwZSgpOwogICAgICB9CiAgICB9CiAgICBpZiAobm9kZS5uYW1lLm5hbWUgPT0gJ2NhbGwnKSB7CiAgICAgIGlmIChyZWNlaXZlclR5cGUgaXMgaXIuRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgaWYgKHJlY2VpdmVyVHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGggIT0gbm9kZS5hcmd1bWVudHMudHlwZXMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gY29uc3QgRG9lc05vdENvbXBsZXRlVHlwZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaXIuU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgICAgICAgIHJlY2VpdmVyVHlwZS50eXBlUGFyYW1ldGVycywgbm9kZS5hcmd1bWVudHMudHlwZXMpCiAgICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZShyZWNlaXZlclR5cGUucmV0dXJuVHlwZSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLm5hbWUubmFtZSA9PSAnPT0nKSB7CiAgICAgIC8vIFdlIHVzZSB0aGlzIHNwZWNpYWwgY2FzZSB0byBzaW1wbGlmeSBnZW5lcmF0aW9uIG9mICc9PScgY2hlY2tzLgogICAgICByZXR1cm4gdHlwZUVudmlyb25tZW50LmJvb2xUeXBlOwogICAgfQogICAgcmV0dXJuIGNvbnN0IGlyLkR5bmFtaWNUeXBlKCk7CiAgfQoKICBBcmd1bWVudFR5cGVzIF92aXNpdEFyZ3VtZW50cyhpci5Bcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBMaXN0PGlyLkRhcnRUeXBlPiBwb3NpdGlvbmFsOwogICAgTGlzdDxpci5EYXJ0VHlwZT4gbmFtZWQ7CiAgICBpZiAoYXJndW1lbnRzLnBvc2l0aW9uYWwuaXNFbXB0eSkgewogICAgICBwb3NpdGlvbmFsID0gY29uc3QgPGlyLkRhcnRUeXBlPltdOwogICAgfSBlbHNlIHsKICAgICAgcG9zaXRpb25hbCA9IG5ldyBMaXN0PGlyLkRhcnRUeXBlPihhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGgpOwogICAgICBpbnQgaW5kZXggPSAwOwogICAgICBmb3IgKGlyLkV4cHJlc3Npb24gYXJndW1lbnQgaW4gYXJndW1lbnRzLnBvc2l0aW9uYWwpIHsKICAgICAgICBwb3NpdGlvbmFsW2luZGV4KytdID0gdmlzaXROb2RlKGFyZ3VtZW50KTsKICAgICAgfQogICAgfQogICAgaWYgKGFyZ3VtZW50cy5uYW1lZC5pc0VtcHR5KSB7CiAgICAgIG5hbWVkID0gY29uc3QgPGlyLkRhcnRUeXBlPltdOwogICAgfSBlbHNlIHsKICAgICAgbmFtZWQgPSBuZXcgTGlzdDxpci5EYXJ0VHlwZT4oYXJndW1lbnRzLm5hbWVkLmxlbmd0aCk7CiAgICAgIGludCBpbmRleCA9IDA7CiAgICAgIGZvciAoaXIuTmFtZWRFeHByZXNzaW9uIGFyZ3VtZW50IGluIGFyZ3VtZW50cy5uYW1lZCkgewogICAgICAgIG5hbWVkW2luZGV4KytdID0gdmlzaXROb2RlKGFyZ3VtZW50KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBBcmd1bWVudFR5cGVzKHBvc2l0aW9uYWwsIG5hbWVkKTsKICB9CgogIHZvaWQgaGFuZGxlTWV0aG9kSW52b2NhdGlvbigKICAgICAgaXIuTWV0aG9kSW52b2NhdGlvbiBub2RlLAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIEFyZ3VtZW50VHlwZXMgYXJndW1lbnRUeXBlcywKICAgICAgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRNZXRob2RJbnZvY2F0aW9uKGlyLk1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzID0gX3Zpc2l0QXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSA9IHZpc2l0Tm9kZShub2RlLnJlY2VpdmVyKTsKICAgIGlyLkRhcnRUeXBlIHJldHVyblR5cGUgPQogICAgICAgIF9jb21wdXRlTWV0aG9kSW52b2NhdGlvblR5cGUobm9kZSwgcmVjZWl2ZXJUeXBlLCBhcmd1bWVudFR5cGVzKTsKICAgIHJlY2VpdmVyVHlwZSA9IF9uYXJyb3dJbnN0YW5jZVJlY2VpdmVyKG5vZGUuaW50ZXJmYWNlVGFyZ2V0LCByZWNlaXZlclR5cGUpOwogICAgaWYgKG5vZGUubmFtZS5uYW1lID09ICc9PScpIHsKICAgICAgaXIuRXhwcmVzc2lvbiBsZWZ0ID0gbm9kZS5yZWNlaXZlcjsKICAgICAgaXIuRXhwcmVzc2lvbiByaWdodCA9IG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWxbMF07CiAgICAgIFR5cGVNYXAgYWZ0ZXJJbnZvY2F0aW9uID0gdHlwZU1hcDsKICAgICAgaWYgKGxlZnQgaXMgaXIuVmFyaWFibGVHZXQgJiYKICAgICAgICAgIHJpZ2h0IGlzIGlyLk51bGxMaXRlcmFsICYmCiAgICAgICAgICAhX2ludmFsaWRhdGVkVmFyaWFibGVzLmNvbnRhaW5zKGxlZnQudmFyaWFibGUpKSB7CiAgICAgICAgLy8gSWYgYGxlZnQgPT0gbnVsbGAgaXMgdHJ1ZSwgd2UgcHJvbW90ZSB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgdG8KICAgICAgICAvLyBgTnVsbGAgYnkgcmVnaXN0ZXJpbmcgdGhhdCBpcyBrbm93biBfbm90XyB0byBiZSBvZiBpdHMgZGVjbGFyZWQgdHlwZS4KICAgICAgICB0eXBlTWFwV2hlblRydWUgPSBhZnRlckludm9jYXRpb24KICAgICAgICAgICAgLnByb21vdGUobGVmdC52YXJpYWJsZSwgbGVmdC52YXJpYWJsZS50eXBlLCBpc1RydWU6IGZhbHNlKTsKICAgICAgICB0eXBlTWFwV2hlbkZhbHNlID0gYWZ0ZXJJbnZvY2F0aW9uCiAgICAgICAgICAgIC5wcm9tb3RlKGxlZnQudmFyaWFibGUsIGxlZnQudmFyaWFibGUudHlwZSwgaXNUcnVlOiB0cnVlKTsKICAgICAgfQogICAgICBpZiAocmlnaHQgaXMgaXIuVmFyaWFibGVHZXQgJiYKICAgICAgICAgIGxlZnQgaXMgaXIuTnVsbExpdGVyYWwgJiYKICAgICAgICAgICFfaW52YWxpZGF0ZWRWYXJpYWJsZXMuY29udGFpbnMocmlnaHQudmFyaWFibGUpKSB7CiAgICAgICAgLy8gSWYgYG51bGwgPT0gcmlnaHRgIGlzIHRydWUsIHdlIHByb21vdGUgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIHRvCiAgICAgICAgLy8gYE51bGxgIGJ5IHJlZ2lzdGVyaW5nIHRoYXQgaXMga25vd24gX25vdF8gdG8gYmUgb2YgaXRzIGRlY2xhcmVkIHR5cGUuCiAgICAgICAgdHlwZU1hcFdoZW5UcnVlID0gYWZ0ZXJJbnZvY2F0aW9uCiAgICAgICAgICAgIC5wcm9tb3RlKHJpZ2h0LnZhcmlhYmxlLCByaWdodC52YXJpYWJsZS50eXBlLCBpc1RydWU6IGZhbHNlKTsKICAgICAgICB0eXBlTWFwV2hlbkZhbHNlID0gYWZ0ZXJJbnZvY2F0aW9uCiAgICAgICAgICAgIC5wcm9tb3RlKHJpZ2h0LnZhcmlhYmxlLCByaWdodC52YXJpYWJsZS50eXBlLCBpc1RydWU6IHRydWUpOwogICAgICB9CiAgICB9CiAgICBfZXhwcmVzc2lvblR5cGVDYWNoZVtub2RlXSA9IHJldHVyblR5cGU7CiAgICBoYW5kbGVNZXRob2RJbnZvY2F0aW9uKG5vZGUsIHJlY2VpdmVyVHlwZSwgYXJndW1lbnRUeXBlcywgcmV0dXJuVHlwZSk7CiAgICByZXR1cm4gcmV0dXJuVHlwZTsKICB9CgogIHZvaWQgaGFuZGxlVmFyaWFibGVHZXQoaXIuVmFyaWFibGVHZXQgbm9kZSwgaXIuRGFydFR5cGUgdHlwZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRWYXJpYWJsZUdldChpci5WYXJpYWJsZUdldCBub2RlKSB7CiAgICBpZiAodHlwZU1hcHNGb3JUZXN0aW5nICE9IG51bGwpIHsKICAgICAgdHlwZU1hcHNGb3JUZXN0aW5nW25vZGVdID0gdHlwZU1hcDsKICAgIH0KICAgIGlyLkRhcnRUeXBlIHByb21vdGVkVHlwZSA9IHR5cGVNYXAudHlwZU9mKG5vZGUsIHR5cGVFbnZpcm9ubWVudCk7CiAgICBhc3NlcnQoCiAgICAgICAgbm9kZS5wcm9tb3RlZFR5cGUgPT0gbnVsbCB8fAogICAgICAgICAgICBwcm9tb3RlZFR5cGUgPT0gdHlwZUVudmlyb25tZW50Lm51bGxUeXBlIHx8CiAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihwcm9tb3RlZFR5cGUsIG5vZGUucHJvbW90ZWRUeXBlKSwKICAgICAgICAiVW5leHBlY3RlZCBwcm9tb3Rpb24gb2YgJHtub2RlLnZhcmlhYmxlfSBpbiAke25vZGUucGFyZW50fS4gIgogICAgICAgICJFeHBlY3RlZCAke25vZGUucHJvbW90ZWRUeXBlfSwgZm91bmQgJHByb21vdGVkVHlwZSIpOwogICAgX2V4cHJlc3Npb25UeXBlQ2FjaGVbbm9kZV0gPSBwcm9tb3RlZFR5cGU7CiAgICBoYW5kbGVWYXJpYWJsZUdldChub2RlLCBwcm9tb3RlZFR5cGUpOwogICAgcmV0dXJuIHByb21vdGVkVHlwZTsKICB9CgogIHZvaWQgaGFuZGxlVmFyaWFibGVTZXQoaXIuVmFyaWFibGVTZXQgbm9kZSwgaXIuRGFydFR5cGUgcmVzdWx0VHlwZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRWYXJpYWJsZVNldChpci5WYXJpYWJsZVNldCBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSByZXN1bHRUeXBlID0gc3VwZXIudmlzaXRWYXJpYWJsZVNldChub2RlKTsKICAgIGhhbmRsZVZhcmlhYmxlU2V0KG5vZGUsIHJlc3VsdFR5cGUpOwogICAgaWYgKCFfY3VycmVudFZhcmlhYmxlcy5jb250YWlucyhub2RlLnZhcmlhYmxlKSkgewogICAgICBfaW52YWxpZGF0ZWRWYXJpYWJsZXMuYWRkKG5vZGUudmFyaWFibGUpOwogICAgICB0eXBlTWFwID0gdHlwZU1hcC5yZW1vdmUoW25vZGUudmFyaWFibGVdKTsKICAgIH0gZWxzZSB7CiAgICAgIHR5cGVNYXAgPSB0eXBlTWFwLnJlZHVjZShub2RlLCByZXN1bHRUeXBlLCB0eXBlRW52aXJvbm1lbnQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdFR5cGU7CiAgfQoKICB2b2lkIGhhbmRsZVN0YXRpY0dldChpci5TdGF0aWNHZXQgbm9kZSwgaXIuRGFydFR5cGUgcmVzdWx0VHlwZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRTdGF0aWNHZXQoaXIuU3RhdGljR2V0IG5vZGUpIHsKICAgIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUgPSBzdXBlci52aXNpdFN0YXRpY0dldChub2RlKTsKICAgIGhhbmRsZVN0YXRpY0dldChub2RlLCByZXN1bHRUeXBlKTsKICAgIHJldHVybiByZXN1bHRUeXBlOwogIH0KCiAgdm9pZCBoYW5kbGVTdGF0aWNTZXQoaXIuU3RhdGljU2V0IG5vZGUsIGlyLkRhcnRUeXBlIHZhbHVlVHlwZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRTdGF0aWNTZXQoaXIuU3RhdGljU2V0IG5vZGUpIHsKICAgIGlyLkRhcnRUeXBlIHZhbHVlVHlwZSA9IHN1cGVyLnZpc2l0U3RhdGljU2V0KG5vZGUpOwogICAgaGFuZGxlU3RhdGljU2V0KG5vZGUsIHZhbHVlVHlwZSk7CiAgICByZXR1cm4gdmFsdWVUeXBlOwogIH0KCiAgdm9pZCBoYW5kbGVTdGF0aWNJbnZvY2F0aW9uKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSwKICAgICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzLCBpci5EYXJ0VHlwZSByZXR1cm5UeXBlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN0YXRpY0ludm9jYXRpb24oaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBBcmd1bWVudFR5cGVzIGFyZ3VtZW50VHlwZXMgPSBfdmlzaXRBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSA9IGlyLlN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgIG5vZGUudGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLCBub2RlLmFyZ3VtZW50cy50eXBlcykKICAgICAgICAuc3Vic3RpdHV0ZVR5cGUobm9kZS50YXJnZXQuZnVuY3Rpb24ucmV0dXJuVHlwZSk7CiAgICBfZXhwcmVzc2lvblR5cGVDYWNoZVtub2RlXSA9IHJldHVyblR5cGU7CiAgICBoYW5kbGVTdGF0aWNJbnZvY2F0aW9uKG5vZGUsIGFyZ3VtZW50VHlwZXMsIHJldHVyblR5cGUpOwogICAgcmV0dXJuIHJldHVyblR5cGU7CiAgfQoKICB2b2lkIGhhbmRsZUNvbnN0cnVjdG9ySW52b2NhdGlvbihpci5Db25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSwKICAgICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzLCBpci5EYXJ0VHlwZSByZXN1bHRUeXBlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihpci5Db25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzID0gX3Zpc2l0QXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKICAgIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUgPSBub2RlLmFyZ3VtZW50cy50eXBlcy5pc0VtcHR5CiAgICAgICAgPyBuZXcgRXhhY3RJbnRlcmZhY2VUeXBlLmZyb20obm9kZS50YXJnZXQuZW5jbG9zaW5nQ2xhc3MucmF3VHlwZSkKICAgICAgICA6IG5ldyBFeGFjdEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIG5vZGUudGFyZ2V0LmVuY2xvc2luZ0NsYXNzLCBub2RlLmFyZ3VtZW50cy50eXBlcyk7CiAgICBfZXhwcmVzc2lvblR5cGVDYWNoZVtub2RlXSA9IHJlc3VsdFR5cGU7CiAgICBoYW5kbGVDb25zdHJ1Y3Rvckludm9jYXRpb24obm9kZSwgYXJndW1lbnRUeXBlcywgcmVzdWx0VHlwZSk7CiAgICByZXR1cm4gcmVzdWx0VHlwZTsKICB9CgogIHZvaWQgaGFuZGxlU3VwZXJQcm9wZXJ0eUdldCgKICAgICAgaXIuU3VwZXJQcm9wZXJ0eUdldCBub2RlLCBpci5EYXJ0VHlwZSByZXN1bHRUeXBlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN1cGVyUHJvcGVydHlHZXQoaXIuU3VwZXJQcm9wZXJ0eUdldCBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSByZXN1bHRUeXBlOwogICAgaWYgKG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID09IG51bGwpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVzb2x2ZSBhbmQgc2V0IHRoZSB0YXJnZXQgaGVyZS4KICAgICAgcmVzdWx0VHlwZSA9IGNvbnN0IGlyLkR5bmFtaWNUeXBlKCk7CiAgICB9IGVsc2UgewogICAgICBpci5DbGFzcyBkZWNsYXJpbmdDbGFzcyA9IG5vZGUuaW50ZXJmYWNlVGFyZ2V0LmVuY2xvc2luZ0NsYXNzOwogICAgICBpZiAoZGVjbGFyaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICAgIHJlc3VsdFR5cGUgPSBub2RlLmludGVyZmFjZVRhcmdldC5nZXR0ZXJUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyID0KICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LmdldFR5cGVBc0luc3RhbmNlT2YodGhpc1R5cGUsIGRlY2xhcmluZ0NsYXNzKTsKICAgICAgICByZXN1bHRUeXBlID0gaXIuU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKHJlY2VpdmVyKQogICAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUobm9kZS5pbnRlcmZhY2VUYXJnZXQuZ2V0dGVyVHlwZSk7CiAgICAgIH0KICAgIH0KICAgIF9leHByZXNzaW9uVHlwZUNhY2hlW25vZGVdID0gcmVzdWx0VHlwZTsKICAgIGhhbmRsZVN1cGVyUHJvcGVydHlHZXQobm9kZSwgcmVzdWx0VHlwZSk7CiAgICByZXR1cm4gcmVzdWx0VHlwZTsKICB9CgogIHZvaWQgaGFuZGxlU3VwZXJQcm9wZXJ0eVNldCgKICAgICAgaXIuU3VwZXJQcm9wZXJ0eVNldCBub2RlLCBpci5EYXJ0VHlwZSB2YWx1ZVR5cGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0U3VwZXJQcm9wZXJ0eVNldChpci5TdXBlclByb3BlcnR5U2V0IG5vZGUpIHsKICAgIGlyLkRhcnRUeXBlIHZhbHVlVHlwZSA9IHN1cGVyLnZpc2l0U3VwZXJQcm9wZXJ0eVNldChub2RlKTsKICAgIGhhbmRsZVN1cGVyUHJvcGVydHlTZXQobm9kZSwgdmFsdWVUeXBlKTsKICAgIHJldHVybiB2YWx1ZVR5cGU7CiAgfQoKICB2b2lkIGhhbmRsZVN1cGVyTWV0aG9kSW52b2NhdGlvbihpci5TdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSwKICAgICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzLCBpci5EYXJ0VHlwZSByZXR1cm5UeXBlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihpci5TdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzID0gX3Zpc2l0QXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKICAgIGlyLkRhcnRUeXBlIHJldHVyblR5cGU7CiAgICBpZiAobm9kZS5pbnRlcmZhY2VUYXJnZXQgPT0gbnVsbCkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZXNvbHZlIGFuZCBzZXQgdGhlIHRhcmdldCBoZXJlLgogICAgICByZXR1cm5UeXBlID0gY29uc3QgaXIuRHluYW1pY1R5cGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIGlyLkNsYXNzIHN1cGVyY2xhc3MgPSBub2RlLmludGVyZmFjZVRhcmdldC5lbmNsb3NpbmdDbGFzczsKICAgICAgaXIuSW50ZXJmYWNlVHlwZSByZWNlaXZlclR5cGUgPQogICAgICAgICAgdHlwZUVudmlyb25tZW50LmdldFR5cGVBc0luc3RhbmNlT2YodGhpc1R5cGUsIHN1cGVyY2xhc3MpOwogICAgICByZXR1cm5UeXBlID0gaXIuU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKHJlY2VpdmVyVHlwZSkKICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZShub2RlLmludGVyZmFjZVRhcmdldC5mdW5jdGlvbi5yZXR1cm5UeXBlKTsKICAgICAgcmV0dXJuVHlwZSA9IGlyLlN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgICAgbm9kZS5pbnRlcmZhY2VUYXJnZXQuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgbm9kZS5hcmd1bWVudHMudHlwZXMpCiAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUocmV0dXJuVHlwZSk7CiAgICB9CiAgICBfZXhwcmVzc2lvblR5cGVDYWNoZVtub2RlXSA9IHJldHVyblR5cGU7CiAgICBoYW5kbGVTdXBlck1ldGhvZEludm9jYXRpb24obm9kZSwgYXJndW1lbnRUeXBlcywgcmV0dXJuVHlwZSk7CiAgICByZXR1cm4gcmV0dXJuVHlwZTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0TG9naWNhbEV4cHJlc3Npb24oaXIuTG9naWNhbEV4cHJlc3Npb24gbm9kZSkgewogICAgaWYgKG5vZGUub3BlcmF0b3IgPT0gJyYmJykgewogICAgICB2aXNpdE5vZGUobm9kZS5sZWZ0KTsKICAgICAgVHlwZU1hcCBhZnRlckxlZnRXaGVuVHJ1ZSA9IHR5cGVNYXBXaGVuVHJ1ZTsKICAgICAgVHlwZU1hcCBhZnRlckxlZnRXaGVuRmFsc2UgPSB0eXBlTWFwV2hlbkZhbHNlOwogICAgICB0eXBlTWFwID0gYWZ0ZXJMZWZ0V2hlblRydWU7CiAgICAgIHZpc2l0Tm9kZShub2RlLnJpZ2h0KTsKICAgICAgVHlwZU1hcCBhZnRlclJpZ2h0V2hlblRydWUgPSB0eXBlTWFwV2hlblRydWU7CiAgICAgIFR5cGVNYXAgYWZ0ZXJSaWdodFdoZW5GYWxzZSA9IHR5cGVNYXBXaGVuRmFsc2U7CiAgICAgIHR5cGVNYXBXaGVuVHJ1ZSA9IGFmdGVyUmlnaHRXaGVuVHJ1ZTsKICAgICAgdHlwZU1hcFdoZW5GYWxzZSA9IGFmdGVyTGVmdFdoZW5GYWxzZS5qb2luKGFmdGVyUmlnaHRXaGVuRmFsc2UpOwogICAgfSBlbHNlIHsKICAgICAgdmlzaXROb2RlKG5vZGUubGVmdCk7CiAgICAgIFR5cGVNYXAgYWZ0ZXJMZWZ0V2hlblRydWUgPSB0eXBlTWFwV2hlblRydWU7CiAgICAgIFR5cGVNYXAgYWZ0ZXJMZWZ0V2hlbkZhbHNlID0gdHlwZU1hcFdoZW5GYWxzZTsKICAgICAgdHlwZU1hcCA9IGFmdGVyTGVmdFdoZW5GYWxzZTsKICAgICAgdmlzaXROb2RlKG5vZGUucmlnaHQpOwogICAgICBUeXBlTWFwIGFmdGVyUmlnaHRXaGVuVHJ1ZSA9IHR5cGVNYXBXaGVuVHJ1ZTsKICAgICAgVHlwZU1hcCBhZnRlclJpZ2h0V2hlbkZhbHNlID0gdHlwZU1hcFdoZW5GYWxzZTsKICAgICAgdHlwZU1hcFdoZW5UcnVlID0gYWZ0ZXJMZWZ0V2hlblRydWUuam9pbihhZnRlclJpZ2h0V2hlblRydWUpOwogICAgICB0eXBlTWFwV2hlbkZhbHNlID0gYWZ0ZXJSaWdodFdoZW5GYWxzZTsKICAgIH0KICAgIHJldHVybiBzdXBlci52aXNpdExvZ2ljYWxFeHByZXNzaW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXROb3QoaXIuTm90IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLm9wZXJhbmQpOwogICAgVHlwZU1hcCBhZnRlck9wZXJhbmRXaGVuVHJ1ZSA9IHR5cGVNYXBXaGVuVHJ1ZTsKICAgIFR5cGVNYXAgYWZ0ZXJPcGVyYW5kV2hlbkZhbHNlID0gdHlwZU1hcFdoZW5GYWxzZTsKICAgIHR5cGVNYXBXaGVuVHJ1ZSA9IGFmdGVyT3BlcmFuZFdoZW5GYWxzZTsKICAgIHR5cGVNYXBXaGVuRmFsc2UgPSBhZnRlck9wZXJhbmRXaGVuVHJ1ZTsKICAgIHJldHVybiBzdXBlci52aXNpdE5vdChub2RlKTsKICB9CgogIGlyLkRhcnRUeXBlIF9oYW5kbGVDb25kaXRpb25hbCgKICAgICAgaXIuRXhwcmVzc2lvbiBjb25kaXRpb24sIGlyLlRyZWVOb2RlIHRoZW4sIGlyLlRyZWVOb2RlIG90aGVyd2lzZSkgewogICAgdmlzaXROb2RlKGNvbmRpdGlvbik7CiAgICBUeXBlTWFwIGFmdGVyQ29uZGl0aW9uV2hlblRydWUgPSB0eXBlTWFwV2hlblRydWU7CiAgICBUeXBlTWFwIGFmdGVyQ29uZGl0aW9uV2hlbkZhbHNlID0gdHlwZU1hcFdoZW5GYWxzZTsKICAgIHR5cGVNYXAgPSBhZnRlckNvbmRpdGlvbldoZW5UcnVlOwogICAgaXIuRGFydFR5cGUgdGhlblR5cGUgPSB2aXNpdE5vZGUodGhlbik7CiAgICBUeXBlTWFwIGFmdGVyVGhlbiA9IHR5cGVNYXA7CiAgICB0eXBlTWFwID0gYWZ0ZXJDb25kaXRpb25XaGVuRmFsc2U7CiAgICBpci5EYXJ0VHlwZSBvdGhlcndpc2VUeXBlID0gdmlzaXROb2RlKG90aGVyd2lzZSk7CiAgICBUeXBlTWFwIGFmdGVyT3RoZXJ3aXNlID0gdHlwZU1hcDsKICAgIGlmIChjb21wbGV0ZXModGhlblR5cGUpICYmIGNvbXBsZXRlcyhvdGhlcndpc2VUeXBlKSkgewogICAgICB0eXBlTWFwID0gYWZ0ZXJUaGVuLmpvaW4oYWZ0ZXJPdGhlcndpc2UpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSBpZiAoY29tcGxldGVzKHRoZW5UeXBlKSkgewogICAgICB0eXBlTWFwID0gYWZ0ZXJUaGVuOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSBpZiAoY29tcGxldGVzKG90aGVyd2lzZVR5cGUpKSB7CiAgICAgIHR5cGVNYXAgPSBhZnRlck90aGVyd2lzZTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICB0eXBlTWFwID0gYWZ0ZXJUaGVuLmpvaW4oYWZ0ZXJPdGhlcndpc2UpOwogICAgICByZXR1cm4gY29uc3QgRG9lc05vdENvbXBsZXRlVHlwZSgpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oaXIuQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNob3VsZCB3ZSByZXR1cm4gYGNvbnN0IERvZXNOb3RDb21wbGV0ZVR5cGUoKWAgaWYKICAgIC8vIGJvdGggYnJhbmNoZXMgYXJlIGZhaWxpbmc/CiAgICBfaGFuZGxlQ29uZGl0aW9uYWwobm9kZS5jb25kaXRpb24sIG5vZGUudGhlbiwgbm9kZS5vdGhlcndpc2UpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKG5vZGUpOwogIH0KCiAgdm9pZCBoYW5kbGVJc0V4cHJlc3Npb24oaXIuSXNFeHByZXNzaW9uIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0SXNFeHByZXNzaW9uKGlyLklzRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpci5FeHByZXNzaW9uIG9wZXJhbmQgPSBub2RlLm9wZXJhbmQ7CiAgICB2aXNpdE5vZGUob3BlcmFuZCk7CiAgICBpZiAob3BlcmFuZCBpcyBpci5WYXJpYWJsZUdldCAmJgogICAgICAgICFfaW52YWxpZGF0ZWRWYXJpYWJsZXMuY29udGFpbnMob3BlcmFuZC52YXJpYWJsZSkpIHsKICAgICAgVHlwZU1hcCBhZnRlck9wZXJhbmQgPSB0eXBlTWFwOwogICAgICB0eXBlTWFwV2hlblRydWUgPQogICAgICAgICAgYWZ0ZXJPcGVyYW5kLnByb21vdGUob3BlcmFuZC52YXJpYWJsZSwgbm9kZS50eXBlLCBpc1RydWU6IHRydWUpOwogICAgICB0eXBlTWFwV2hlbkZhbHNlID0KICAgICAgICAgIGFmdGVyT3BlcmFuZC5wcm9tb3RlKG9wZXJhbmQudmFyaWFibGUsIG5vZGUudHlwZSwgaXNUcnVlOiBmYWxzZSk7CiAgICB9CiAgICBoYW5kbGVJc0V4cHJlc3Npb24obm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRJc0V4cHJlc3Npb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdExldChpci5MZXQgbm9kZSkgewogICAgX3Byb2Nlc3NMb2NhbFZhcmlhYmxlKG5vZGUudmFyaWFibGUpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0TGV0KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRCbG9ja0V4cHJlc3Npb24oaXIuQmxvY2tFeHByZXNzaW9uIG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmJvZHkpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0QmxvY2tFeHByZXNzaW9uKG5vZGUpOwogIH0KCiAgaXIuRGFydFR5cGUgX2NvbXB1dGVJbnN0YW50aWF0aW9uVHlwZSgKICAgICAgaXIuSW5zdGFudGlhdGlvbiBub2RlLCBpci5GdW5jdGlvblR5cGUgZXhwcmVzc2lvblR5cGUpIHsKICAgIHJldHVybiBpci5TdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICBleHByZXNzaW9uVHlwZS50eXBlUGFyYW1ldGVycywgbm9kZS50eXBlQXJndW1lbnRzKQogICAgICAgIC5zdWJzdGl0dXRlVHlwZShleHByZXNzaW9uVHlwZS53aXRob3V0VHlwZVBhcmFtZXRlcnMpOwogIH0KCiAgdm9pZCBoYW5kbGVJbnN0YW50aWF0aW9uKGlyLkluc3RhbnRpYXRpb24gbm9kZSwKICAgICAgaXIuRnVuY3Rpb25UeXBlIGV4cHJlc3Npb25UeXBlLCBpci5EYXJ0VHlwZSByZXN1bHRUeXBlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdEluc3RhbnRpYXRpb24oaXIuSW5zdGFudGlhdGlvbiBub2RlKSB7CiAgICBpci5GdW5jdGlvblR5cGUgZXhwcmVzc2lvblR5cGUgPSB2aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTsKICAgIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUgPSBfY29tcHV0ZUluc3RhbnRpYXRpb25UeXBlKG5vZGUsIGV4cHJlc3Npb25UeXBlKTsKICAgIF9leHByZXNzaW9uVHlwZUNhY2hlW25vZGVdID0gcmVzdWx0VHlwZTsKICAgIGhhbmRsZUluc3RhbnRpYXRpb24obm9kZSwgZXhwcmVzc2lvblR5cGUsIHJlc3VsdFR5cGUpOwogICAgcmV0dXJuIHJlc3VsdFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdEJsb2NrKGlyLkJsb2NrIG5vZGUpIHsKICAgIGFzc2VydChfcGVuZGluZ1J1bnRpbWVUeXBlVXNlRGF0YS5pc0VtcHR5KTsKICAgIGlyLkRhcnRUeXBlIHR5cGU7CiAgICBmb3IgKGlyLlN0YXRlbWVudCBzdGF0ZW1lbnQgaW4gbm9kZS5zdGF0ZW1lbnRzKSB7CiAgICAgIGlmICghY29tcGxldGVzKHZpc2l0Tm9kZShzdGF0ZW1lbnQpKSkgewogICAgICAgIHR5cGUgPSBjb25zdCBEb2VzTm90Q29tcGxldGVUeXBlKCk7CiAgICAgIH0KICAgIH0KICAgIGFzc2VydChfcGVuZGluZ1J1bnRpbWVUeXBlVXNlRGF0YS5pc0VtcHR5LAogICAgICAgICJJbmNvbXBsZXRlIFJ1bnRpbWVUeXBlVXNlRGF0YTogJF9wZW5kaW5nUnVudGltZVR5cGVVc2VEYXRhIik7CiAgICByZXR1cm4gdHlwZTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChpci5FeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIGhhbmRsZUFzRXhwcmVzc2lvbihpci5Bc0V4cHJlc3Npb24gbm9kZSwgaXIuRGFydFR5cGUgb3BlcmFuZFR5cGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0QXNFeHByZXNzaW9uKGlyLkFzRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSBvcGVyYW5kVHlwZSA9IHZpc2l0Tm9kZShub2RlLm9wZXJhbmQpOwogICAgaGFuZGxlQXNFeHByZXNzaW9uKG5vZGUsIG9wZXJhbmRUeXBlKTsKICAgIHJldHVybiBzdXBlci52aXNpdEFzRXhwcmVzc2lvbihub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlU3RyaW5nQ29uY2F0ZW5hdGlvbihpci5TdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihpci5TdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHZpc2l0Tm9kZXMobm9kZS5leHByZXNzaW9ucyk7CiAgICBoYW5kbGVTdHJpbmdDb25jYXRlbmF0aW9uKG5vZGUpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlSW50TGl0ZXJhbChpci5JbnRMaXRlcmFsIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0SW50TGl0ZXJhbChpci5JbnRMaXRlcmFsIG5vZGUpIHsKICAgIGhhbmRsZUludExpdGVyYWwobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRJbnRMaXRlcmFsKG5vZGUpOwogIH0KCiAgdm9pZCBoYW5kbGVEb3VibGVMaXRlcmFsKGlyLkRvdWJsZUxpdGVyYWwgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXREb3VibGVMaXRlcmFsKGlyLkRvdWJsZUxpdGVyYWwgbm9kZSkgewogICAgaGFuZGxlRG91YmxlTGl0ZXJhbChub2RlKTsKICAgIHJldHVybiBzdXBlci52aXNpdERvdWJsZUxpdGVyYWwobm9kZSk7CiAgfQoKICB2b2lkIGhhbmRsZUJvb2xMaXRlcmFsKGlyLkJvb2xMaXRlcmFsIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0Qm9vbExpdGVyYWwoaXIuQm9vbExpdGVyYWwgbm9kZSkgewogICAgaGFuZGxlQm9vbExpdGVyYWwobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRCb29sTGl0ZXJhbChub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlU3RyaW5nTGl0ZXJhbChpci5TdHJpbmdMaXRlcmFsIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0U3RyaW5nTGl0ZXJhbChpci5TdHJpbmdMaXRlcmFsIG5vZGUpIHsKICAgIGhhbmRsZVN0cmluZ0xpdGVyYWwobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRTdHJpbmdMaXRlcmFsKG5vZGUpOwogIH0KCiAgdm9pZCBoYW5kbGVTeW1ib2xMaXRlcmFsKGlyLlN5bWJvbExpdGVyYWwgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRTeW1ib2xMaXRlcmFsKGlyLlN5bWJvbExpdGVyYWwgbm9kZSkgewogICAgaGFuZGxlU3ltYm9sTGl0ZXJhbChub2RlKTsKICAgIHJldHVybiBzdXBlci52aXNpdFN5bWJvbExpdGVyYWwobm9kZSk7CiAgfQoKICB2b2lkIGhhbmRsZU51bGxMaXRlcmFsKGlyLk51bGxMaXRlcmFsIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0TnVsbExpdGVyYWwoaXIuTnVsbExpdGVyYWwgbm9kZSkgewogICAgaGFuZGxlTnVsbExpdGVyYWwobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXROdWxsTGl0ZXJhbChub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlTGlzdExpdGVyYWwoaXIuTGlzdExpdGVyYWwgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRMaXN0TGl0ZXJhbChpci5MaXN0TGl0ZXJhbCBub2RlKSB7CiAgICB2aXNpdE5vZGVzKG5vZGUuZXhwcmVzc2lvbnMpOwogICAgaGFuZGxlTGlzdExpdGVyYWwobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRMaXN0TGl0ZXJhbChub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlU2V0TGl0ZXJhbChpci5TZXRMaXRlcmFsIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0U2V0TGl0ZXJhbChpci5TZXRMaXRlcmFsIG5vZGUpIHsKICAgIHZpc2l0Tm9kZXMobm9kZS5leHByZXNzaW9ucyk7CiAgICBoYW5kbGVTZXRMaXRlcmFsKG5vZGUpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0U2V0TGl0ZXJhbChub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlTWFwTGl0ZXJhbChpci5NYXBMaXRlcmFsIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0TWFwTGl0ZXJhbChpci5NYXBMaXRlcmFsIG5vZGUpIHsKICAgIHZpc2l0Tm9kZXMobm9kZS5lbnRyaWVzKTsKICAgIGhhbmRsZU1hcExpdGVyYWwobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRNYXBMaXRlcmFsKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdE1hcEVudHJ5KGlyLk1hcEVudHJ5IGVudHJ5KSB7CiAgICB2aXNpdE5vZGUoZW50cnkua2V5KTsKICAgIHZpc2l0Tm9kZShlbnRyeS52YWx1ZSk7CiAgfQoKICB2b2lkIGhhbmRsZUZ1bmN0aW9uRXhwcmVzc2lvbihpci5GdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oaXIuRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIFR5cGVNYXAgYmVmb3JlQ2xvc3VyZSA9CiAgICAgICAgdHlwZU1hcC5yZW1vdmUodmFyaWFibGVTY29wZU1vZGVsLmdldFNjb3BlRm9yKG5vZGUpLmFzc2lnbmVkVmFyaWFibGVzKTsKICAgIHR5cGVNYXAgPSB0eXBlTWFwLnJlbW92ZSh2YXJpYWJsZVNjb3BlTW9kZWwuYXNzaWduZWRWYXJpYWJsZXMpOwogICAgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSA9IHN1cGVyLnZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKG5vZGUpOwogICAgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IF9vbGRWYXJpYWJsZXMgPSBfY3VycmVudFZhcmlhYmxlczsKICAgIF9jdXJyZW50VmFyaWFibGVzID0ge307CiAgICB2aXNpdFNpZ25hdHVyZShub2RlLmZ1bmN0aW9uKTsKICAgIHZpc2l0Tm9kZShub2RlLmZ1bmN0aW9uLmJvZHkpOwogICAgaGFuZGxlRnVuY3Rpb25FeHByZXNzaW9uKG5vZGUpOwogICAgX2ludmFsaWRhdGVkVmFyaWFibGVzLnJlbW92ZUFsbChfY3VycmVudFZhcmlhYmxlcyk7CiAgICBfY3VycmVudFZhcmlhYmxlcyA9IF9vbGRWYXJpYWJsZXM7CiAgICB0eXBlTWFwID0gYmVmb3JlQ2xvc3VyZTsKICAgIHJldHVybiByZXR1cm5UeXBlOwogIH0KCiAgdm9pZCBoYW5kbGVUaHJvdyhpci5UaHJvdyBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFRocm93KGlyLlRocm93IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgaGFuZGxlVGhyb3cobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRUaHJvdyhub2RlKTsKICB9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRTd2l0Y2hDYXNlKGlyLlN3aXRjaENhc2Ugbm9kZSkgewogICAgdmlzaXROb2Rlcyhub2RlLmV4cHJlc3Npb25zKTsKICAgIHZpc2l0Tm9kZShub2RlLmJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChpci5Db250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gY29uc3QgRG9lc05vdENvbXBsZXRlVHlwZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoaXIuTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0QnJlYWtTdGF0ZW1lbnQoaXIuQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIGNvbnN0IERvZXNOb3RDb21wbGV0ZVR5cGUoKTsKICB9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRZaWVsZFN0YXRlbWVudChpci5ZaWVsZFN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRBc3NlcnRJbml0aWFsaXplcihpci5Bc3NlcnRJbml0aWFsaXplciBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5zdGF0ZW1lbnQpOwogIH0KCiAgdm9pZCBoYW5kbGVGaWVsZEluaXRpYWxpemVyKGlyLkZpZWxkSW5pdGlhbGl6ZXIgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdEZpZWxkSW5pdGlhbGl6ZXIoaXIuRmllbGRJbml0aWFsaXplciBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CiAgICBoYW5kbGVGaWVsZEluaXRpYWxpemVyKG5vZGUpOwogIH0KCiAgdm9pZCBoYW5kbGVSZWRpcmVjdGluZ0luaXRpYWxpemVyKAogICAgICBpci5SZWRpcmVjdGluZ0luaXRpYWxpemVyIG5vZGUsIEFyZ3VtZW50VHlwZXMgYXJndW1lbnRUeXBlcykge30KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoaXIuUmVkaXJlY3RpbmdJbml0aWFsaXplciBub2RlKSB7CiAgICBBcmd1bWVudFR5cGVzIGFyZ3VtZW50VHlwZXMgPSBfdmlzaXRBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgaGFuZGxlUmVkaXJlY3RpbmdJbml0aWFsaXplcihub2RlLCBhcmd1bWVudFR5cGVzKTsKICB9CgogIHZvaWQgaGFuZGxlU3VwZXJJbml0aWFsaXplcigKICAgICAgaXIuU3VwZXJJbml0aWFsaXplciBub2RlLCBBcmd1bWVudFR5cGVzIGFyZ3VtZW50VHlwZXMpIHt9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRTdXBlckluaXRpYWxpemVyKGlyLlN1cGVySW5pdGlhbGl6ZXIgbm9kZSkgewogICAgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzID0gX3Zpc2l0QXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKICAgIGhhbmRsZVN1cGVySW5pdGlhbGl6ZXIobm9kZSwgYXJndW1lbnRUeXBlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0TG9jYWxJbml0aWFsaXplcihpci5Mb2NhbEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLnZhcmlhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0TmFtZWRFeHByZXNzaW9uKGlyLk5hbWVkRXhwcmVzc2lvbiBub2RlKSA9PgogICAgICB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRFbXB0eVN0YXRlbWVudChpci5FbXB0eVN0YXRlbWVudCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0Rm9yU3RhdGVtZW50KGlyLkZvclN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdE5vZGVzKG5vZGUudmFyaWFibGVzKTsKICAgIFR5cGVNYXAgYmVmb3JlTG9vcCA9IHR5cGVNYXAgPQogICAgICAgIHR5cGVNYXAucmVtb3ZlKHZhcmlhYmxlU2NvcGVNb2RlbC5nZXRTY29wZUZvcihub2RlKS5hc3NpZ25lZFZhcmlhYmxlcyk7CiAgICB2aXNpdE5vZGUobm9kZS5jb25kaXRpb24pOwogICAgdHlwZU1hcCA9IHR5cGVNYXBXaGVuVHJ1ZTsKICAgIHZpc2l0Tm9kZShub2RlLmJvZHkpOwogICAgdmlzaXROb2Rlcyhub2RlLnVwZGF0ZXMpOwogICAgdHlwZU1hcCA9IGJlZm9yZUxvb3A7CiAgfQoKICB2b2lkIGhhbmRsZUZvckluU3RhdGVtZW50KGlyLkZvckluU3RhdGVtZW50IG5vZGUsIGlyLkRhcnRUeXBlIGl0ZXJhYmxlVHlwZSwKICAgICAgaXIuRGFydFR5cGUgaXRlcmF0b3JUeXBlKSB7fQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0Rm9ySW5TdGF0ZW1lbnQoaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgLy8gRm9yIHN5bmMgZm9yLWluIFtpdGVyYWJsZVR5cGVdIGlzIGEgc3VidHlwZSBvZiBgSXRlcmFibGVgLCBmb3IgYXN5bmMKICAgIC8vIGZvci1pbiBbaXRlcmFibGVUeXBlXSBpcyBhIHN1YnR5cGUgb2YgYFN0cmVhbWAuCiAgICBpci5EYXJ0VHlwZSBpdGVyYWJsZVR5cGUgPSB2aXNpdE5vZGUobm9kZS5pdGVyYWJsZSk7CiAgICBpci5EYXJ0VHlwZSBpdGVyYXRvclR5cGUgPSBjb25zdCBpci5EeW5hbWljVHlwZSgpOwogICAgaWYgKG5vZGUuaXNBc3luYykgewogICAgICBpci5JbnRlcmZhY2VUeXBlIHN0cmVhbUludGVyZmFjZVR5cGUgPSBnZXRJbnRlcmZhY2VUeXBlT2YoaXRlcmFibGVUeXBlKTsKICAgICAgaXIuSW50ZXJmYWNlVHlwZSBzdHJlYW1UeXBlID0gdHlwZUVudmlyb25tZW50LmdldFR5cGVBc0luc3RhbmNlT2YoCiAgICAgICAgICBzdHJlYW1JbnRlcmZhY2VUeXBlLCB0eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLnN0cmVhbUNsYXNzKTsKICAgICAgaWYgKHN0cmVhbVR5cGUgIT0gbnVsbCkgewogICAgICAgIGl0ZXJhdG9yVHlwZSA9IG5ldyBpci5JbnRlcmZhY2VUeXBlKAogICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLnN0cmVhbUl0ZXJhdG9yQ2xhc3MsCiAgICAgICAgICAgIHN0cmVhbVR5cGUudHlwZUFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlyLkludGVyZmFjZVR5cGUgaXRlcmFibGVJbnRlcmZhY2VUeXBlID0gZ2V0SW50ZXJmYWNlVHlwZU9mKGl0ZXJhYmxlVHlwZSk7CiAgICAgIGlyLk1lbWJlciBtZW1iZXIgPSBoaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVyKAogICAgICAgICAgaXRlcmFibGVJbnRlcmZhY2VUeXBlLmNsYXNzTm9kZSwgbmV3IGlyLk5hbWUoSWRlbnRpZmllcnMuaXRlcmF0b3IpKTsKICAgICAgaWYgKG1lbWJlciAhPSBudWxsKSB7CiAgICAgICAgaXRlcmF0b3JUeXBlID0gaXIuU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKAogICAgICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LmdldFR5cGVBc0luc3RhbmNlT2YoCiAgICAgICAgICAgICAgICAgICAgaXRlcmFibGVJbnRlcmZhY2VUeXBlLCBtZW1iZXIuZW5jbG9zaW5nQ2xhc3MpKQogICAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUobWVtYmVyLmdldHRlclR5cGUpOwogICAgICB9CiAgICB9CiAgICBfZm9ySW5JdGVyYXRvclR5cGVDYWNoZSA/Pz0ge307CiAgICBfZm9ySW5JdGVyYXRvclR5cGVDYWNoZVtub2RlXSA9IGl0ZXJhdG9yVHlwZTsKICAgIFR5cGVNYXAgYmVmb3JlTG9vcCA9IHR5cGVNYXAgPQogICAgICAgIHR5cGVNYXAucmVtb3ZlKHZhcmlhYmxlU2NvcGVNb2RlbC5nZXRTY29wZUZvcihub2RlKS5hc3NpZ25lZFZhcmlhYmxlcyk7CiAgICB2aXNpdE5vZGUobm9kZS52YXJpYWJsZSk7CiAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICAgIGhhbmRsZUZvckluU3RhdGVtZW50KG5vZGUsIGl0ZXJhYmxlVHlwZSwgaXRlcmF0b3JUeXBlKTsKICAgIHR5cGVNYXAgPSBiZWZvcmVMb29wOwogIH0KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdERvU3RhdGVtZW50KGlyLkRvU3RhdGVtZW50IG5vZGUpIHsKICAgIFR5cGVNYXAgYmVmb3JlTG9vcCA9IHR5cGVNYXAgPQogICAgICAgIHR5cGVNYXAucmVtb3ZlKHZhcmlhYmxlU2NvcGVNb2RlbC5nZXRTY29wZUZvcihub2RlKS5hc3NpZ25lZFZhcmlhYmxlcyk7CiAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICAgIHZpc2l0Tm9kZShub2RlLmNvbmRpdGlvbik7CiAgICB0eXBlTWFwID0gYmVmb3JlTG9vcDsKICB9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRXaGlsZVN0YXRlbWVudChpci5XaGlsZVN0YXRlbWVudCBub2RlKSB7CiAgICBUeXBlTWFwIGJlZm9yZUxvb3AgPSB0eXBlTWFwID0KICAgICAgICB0eXBlTWFwLnJlbW92ZSh2YXJpYWJsZVNjb3BlTW9kZWwuZ2V0U2NvcGVGb3Iobm9kZSkuYXNzaWduZWRWYXJpYWJsZXMpOwogICAgdmlzaXROb2RlKG5vZGUuY29uZGl0aW9uKTsKICAgIHR5cGVNYXAgPSB0eXBlTWFwV2hlblRydWU7CiAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICAgIHR5cGVNYXAgPSBiZWZvcmVMb29wOwogIH0KCiAgdm9pZCBoYW5kbGVTd2l0Y2hTdGF0ZW1lbnQoaXIuU3dpdGNoU3RhdGVtZW50IG5vZGUpIHt9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoaXIuU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgVHlwZU1hcCBhZnRlckV4cHJlc3Npb24gPSB0eXBlTWFwOwogICAgVmFyaWFibGVTY29wZSBzY29wZSA9IHZhcmlhYmxlU2NvcGVNb2RlbC5nZXRTY29wZUZvcihub2RlKTsKICAgIFR5cGVNYXAgYWZ0ZXJTdGF0ZW1lbnQgPSBhZnRlckV4cHJlc3Npb24ucmVtb3ZlKHNjb3BlLmFzc2lnbmVkVmFyaWFibGVzKTsKICAgIFR5cGVNYXAgYmVmb3JlQ2FzZSA9CiAgICAgICAgc2NvcGUuaGFzQ29udGludWVTd2l0Y2ggPyBhZnRlclN0YXRlbWVudCA6IGFmdGVyRXhwcmVzc2lvbjsKICAgIGZvciAoaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlIGluIG5vZGUuY2FzZXMpIHsKICAgICAgdHlwZU1hcCA9IGJlZm9yZUNhc2U7CiAgICAgIHZpc2l0Tm9kZShzd2l0Y2hDYXNlKTsKICAgIH0KICAgIGhhbmRsZVN3aXRjaFN0YXRlbWVudChub2RlKTsKICAgIHR5cGVNYXAgPSBhZnRlclN0YXRlbWVudDsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0UmV0dXJuU3RhdGVtZW50KGlyLlJldHVyblN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTsKICAgIHJldHVybiBjb25zdCBEb2VzTm90Q29tcGxldGVUeXBlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdElmU3RhdGVtZW50KGlyLklmU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBfaGFuZGxlQ29uZGl0aW9uYWwobm9kZS5jb25kaXRpb24sIG5vZGUudGhlbiwgbm9kZS5vdGhlcndpc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdFRyeUNhdGNoKGlyLlRyeUNhdGNoIG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmJvZHkpOwogICAgdmlzaXROb2Rlcyhub2RlLmNhdGNoZXMpOwogIH0KCiAgdm9pZCBoYW5kbGVDYXRjaChpci5DYXRjaCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0Q2F0Y2goaXIuQ2F0Y2ggbm9kZSkgewogICAgaGFuZGxlQ2F0Y2gobm9kZSk7CiAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRUcnlGaW5hbGx5KGlyLlRyeUZpbmFsbHkgbm9kZSkgewogICAgdmlzaXROb2RlKG5vZGUuYm9keSk7CiAgICB2aXNpdE5vZGUobm9kZS5maW5hbGl6ZXIpOwogIH0KCiAgdm9pZCBoYW5kbGVUeXBlTGl0ZXJhbChpci5UeXBlTGl0ZXJhbCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFR5cGVMaXRlcmFsKGlyLlR5cGVMaXRlcmFsIG5vZGUpIHsKICAgIGhhbmRsZVR5cGVMaXRlcmFsKG5vZGUpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0VHlwZUxpdGVyYWwobm9kZSk7CiAgfQoKICB2b2lkIGhhbmRsZUxvYWRMaWJyYXJ5KGlyLkxvYWRMaWJyYXJ5IG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0TG9hZExpYnJhcnkoaXIuTG9hZExpYnJhcnkgbm9kZSkgewogICAgaGFuZGxlTG9hZExpYnJhcnkobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRMb2FkTGlicmFyeShub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlQXNzZXJ0U3RhdGVtZW50KGlyLkFzc2VydFN0YXRlbWVudCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0QXNzZXJ0U3RhdGVtZW50KGlyLkFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAgICBUeXBlTWFwIGJlZm9yZUNvbmRpdGlvbiA9IHR5cGVNYXA7CiAgICB2aXNpdE5vZGUobm9kZS5jb25kaXRpb24pOwogICAgVHlwZU1hcCBhZnRlckNvbmRpdGlvbldoZW5UcnVlID0gdHlwZU1hcFdoZW5UcnVlOwogICAgVHlwZU1hcCBhZnRlckNvbmRpdGlvbldoZW5GYWxzZSA9IHR5cGVNYXBXaGVuRmFsc2U7CiAgICB0eXBlTWFwID0gYWZ0ZXJDb25kaXRpb25XaGVuRmFsc2U7CiAgICB2aXNpdE5vZGUobm9kZS5tZXNzYWdlKTsKICAgIGhhbmRsZUFzc2VydFN0YXRlbWVudChub2RlKTsKICAgIHR5cGVNYXAgPSB1c2VBc3NlcnRzID8gYWZ0ZXJDb25kaXRpb25XaGVuVHJ1ZSA6IGJlZm9yZUNvbmRpdGlvbjsKICB9CgogIHZvaWQgaGFuZGxlRnVuY3Rpb25EZWNsYXJhdGlvbihpci5GdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIE51bGwgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgewogICAgVHlwZU1hcCBiZWZvcmVDbG9zdXJlID0KICAgICAgICB0eXBlTWFwLnJlbW92ZSh2YXJpYWJsZVNjb3BlTW9kZWwuZ2V0U2NvcGVGb3Iobm9kZSkuYXNzaWduZWRWYXJpYWJsZXMpOwogICAgdHlwZU1hcCA9IHR5cGVNYXAucmVtb3ZlKHZhcmlhYmxlU2NvcGVNb2RlbC5hc3NpZ25lZFZhcmlhYmxlcyk7CiAgICBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gX29sZFZhcmlhYmxlcyA9IF9jdXJyZW50VmFyaWFibGVzOwogICAgX2N1cnJlbnRWYXJpYWJsZXMgPSB7fTsKICAgIHZpc2l0U2lnbmF0dXJlKG5vZGUuZnVuY3Rpb24pOwogICAgdmlzaXROb2RlKG5vZGUuZnVuY3Rpb24uYm9keSk7CiAgICBoYW5kbGVGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpOwogICAgX2ludmFsaWRhdGVkVmFyaWFibGVzLnJlbW92ZUFsbChfY3VycmVudFZhcmlhYmxlcyk7CiAgICBfY3VycmVudFZhcmlhYmxlcyA9IF9vbGRWYXJpYWJsZXM7CiAgICB0eXBlTWFwID0gYmVmb3JlQ2xvc3VyZTsKICB9CgogIHZvaWQgaGFuZGxlUGFyYW1ldGVyKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkge30KCiAgdm9pZCB2aXNpdFBhcmFtZXRlcihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIF9jdXJyZW50VmFyaWFibGVzLmFkZChub2RlKTsKICAgIHZpc2l0Tm9kZShub2RlLmluaXRpYWxpemVyKTsKICAgIGhhbmRsZVBhcmFtZXRlcihub2RlKTsKICB9CgogIHZvaWQgaGFuZGxlU2lnbmF0dXJlKGlyLkZ1bmN0aW9uTm9kZSBub2RlKSB7fQoKICB2b2lkIHZpc2l0U2lnbmF0dXJlKGlyLkZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmZvckVhY2godmlzaXRQYXJhbWV0ZXIpOwogICAgbm9kZS5uYW1lZFBhcmFtZXRlcnMuZm9yRWFjaCh2aXNpdFBhcmFtZXRlcik7CiAgICBoYW5kbGVTaWduYXR1cmUobm9kZSk7CiAgfQoKICB2b2lkIGhhbmRsZVByb2NlZHVyZShpci5Qcm9jZWR1cmUgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdFByb2NlZHVyZShpci5Qcm9jZWR1cmUgbm9kZSkgewogICAgdGhpc1R5cGUgPSBuZXcgVGhpc0ludGVyZmFjZVR5cGUuZnJvbShub2RlLmVuY2xvc2luZ0NsYXNzPy50aGlzVHlwZSk7CiAgICBfY3VycmVudFZhcmlhYmxlcyA9IHt9OwogICAgdmlzaXRTaWduYXR1cmUobm9kZS5mdW5jdGlvbik7CiAgICB2aXNpdE5vZGUobm9kZS5mdW5jdGlvbi5ib2R5KTsKICAgIGhhbmRsZVByb2NlZHVyZShub2RlKTsKICAgIF9pbnZhbGlkYXRlZFZhcmlhYmxlcy5yZW1vdmVBbGwoX2N1cnJlbnRWYXJpYWJsZXMpOwogICAgX2N1cnJlbnRWYXJpYWJsZXMgPSBudWxsOwogICAgdGhpc1R5cGUgPSBudWxsOwogIH0KCiAgdm9pZCBoYW5kbGVDb25zdHJ1Y3Rvcihpci5Db25zdHJ1Y3RvciBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0Q29uc3RydWN0b3IoaXIuQ29uc3RydWN0b3Igbm9kZSkgewogICAgdGhpc1R5cGUgPSBuZXcgVGhpc0ludGVyZmFjZVR5cGUuZnJvbShub2RlLmVuY2xvc2luZ0NsYXNzLnRoaXNUeXBlKTsKICAgIF9jdXJyZW50VmFyaWFibGVzID0ge307CiAgICB2aXNpdFNpZ25hdHVyZShub2RlLmZ1bmN0aW9uKTsKICAgIHZpc2l0Tm9kZXMobm9kZS5pbml0aWFsaXplcnMpOwogICAgdmlzaXROb2RlKG5vZGUuZnVuY3Rpb24uYm9keSk7CiAgICBoYW5kbGVDb25zdHJ1Y3Rvcihub2RlKTsKICAgIF9pbnZhbGlkYXRlZFZhcmlhYmxlcy5yZW1vdmVBbGwoX2N1cnJlbnRWYXJpYWJsZXMpOwogICAgX2N1cnJlbnRWYXJpYWJsZXMgPSBudWxsOwogICAgdGhpc1R5cGUgPSBudWxsOwogIH0KCiAgdm9pZCBoYW5kbGVGaWVsZChpci5GaWVsZCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0RmllbGQoaXIuRmllbGQgbm9kZSkgewogICAgdGhpc1R5cGUgPSBuZXcgVGhpc0ludGVyZmFjZVR5cGUuZnJvbShub2RlLmVuY2xvc2luZ0NsYXNzPy50aGlzVHlwZSk7CiAgICBfY3VycmVudFZhcmlhYmxlcyA9IHt9OwogICAgdmlzaXROb2RlKG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgaGFuZGxlRmllbGQobm9kZSk7CiAgICBfaW52YWxpZGF0ZWRWYXJpYWJsZXMucmVtb3ZlQWxsKF9jdXJyZW50VmFyaWFibGVzKTsKICAgIF9jdXJyZW50VmFyaWFibGVzID0gbnVsbDsKICAgIHRoaXNUeXBlID0gbnVsbDsKICB9CgogIHZvaWQgaGFuZGxlVmFyaWFibGVEZWNsYXJhdGlvbihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHt9CgogIHZvaWQgX3Byb2Nlc3NMb2NhbFZhcmlhYmxlKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgX2N1cnJlbnRWYXJpYWJsZXMuYWRkKG5vZGUpOwogICAgaXIuRGFydFR5cGUgdHlwZSA9IHZpc2l0Tm9kZShub2RlLmluaXRpYWxpemVyKTsKICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwgJiYKICAgICAgICB2YXJpYWJsZVNjb3BlTW9kZWwuaXNFZmZlY3RpdmVseUZpbmFsKG5vZGUpICYmCiAgICAgICAgaW5mZXJFZmZlY3RpdmVseUZpbmFsVmFyaWFibGVUeXBlcykgewogICAgICBub2RlLnR5cGUgPSB0eXBlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgTnVsbCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBfcHJvY2Vzc0xvY2FsVmFyaWFibGUobm9kZSk7CiAgICBoYW5kbGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpOwogIH0KCiAgdm9pZCBoYW5kbGVDb25zdGFudEV4cHJlc3Npb24oaXIuQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKGlyLkNvbnN0YW50RXhwcmVzc2lvbiBub2RlKSB7CiAgICBoYW5kbGVDb25zdGFudEV4cHJlc3Npb24obm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRDb25zdGFudEV4cHJlc3Npb24obm9kZSk7CiAgfQp9CgpjbGFzcyBBcmd1bWVudFR5cGVzIHsKICBmaW5hbCBMaXN0PGlyLkRhcnRUeXBlPiBwb3NpdGlvbmFsOwogIGZpbmFsIExpc3Q8aXIuRGFydFR5cGU+IG5hbWVkOwoKICBBcmd1bWVudFR5cGVzKHRoaXMucG9zaXRpb25hbCwgdGhpcy5uYW1lZCk7Cn0KCi8vLyBUeXBlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmb3IgYSBzaW5nbGUgcGF0aCBmb3IgYSBsb2NhbCB2YXJpYWJsZS4KLy8vCi8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IGd1YXJkZWQgdHlwZSBwcm9tb3Rpb24uCi8vLwovLy8gVGhlIHRlcm1pbm9sb2d5IGFuZCBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGlzIHBhcGVyOgovLy8KLy8vICAgaHR0cDovL3d3dy5jcy53aWxsaWFtcy5lZHUvRlRmSlAyMDExLzYtV2ludGhlci5wZGYKLy8vCmNsYXNzIFR5cGVIb2xkZXIgewogIC8vLyBUaGUgZGVjbGFyZWQgdHlwZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUuCiAgZmluYWwgaXIuRGFydFR5cGUgZGVjbGFyZWRUeXBlOwoKICAvLy8gVGhlIHR5cGVzIHRoYXQgdGhlIGxvY2FsIHZhcmlhYmxlIGlzIGtub3duIHRvIGJlIGFuIGluc3RhbmNlIG9mLgogIGZpbmFsIFNldDxpci5EYXJ0VHlwZT4gdHJ1ZVR5cGVzOwoKICAvLy8gVGhlIHR5cGVzIHRoYXQgdGhlIGxvY2FsIHZhcmlhYmxlIGlzIGtub3duIF9ub3RfIHRvIGJlIGFuIGluc3RhbmNlIG9mLgogIGZpbmFsIFNldDxpci5EYXJ0VHlwZT4gZmFsc2VUeXBlczsKCiAgaW50IF9oYXNoQ29kZTsKCiAgVHlwZUhvbGRlcih0aGlzLmRlY2xhcmVkVHlwZSwgdGhpcy50cnVlVHlwZXMsIHRoaXMuZmFsc2VUeXBlcyk7CgogIC8vLyBDb21wdXRlcyBhIHNpbmdsZSB0eXBlIHRoYXQgc291bmRseSByZXByZXNlbnRzIHRoZSBwcm9tb3RlZCB0eXBlIG9mIHRoZQogIC8vLyBsb2NhbCB2YXJpYWJsZSBvbiB0aGlzIHNpbmdsZSBwYXRoLgogIGlyLkRhcnRUeXBlIHR5cGVPZihpci5UeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50KSB7CiAgICBpci5EYXJ0VHlwZSBjYW5kaWRhdGUgPSBkZWNsYXJlZFR5cGU7CiAgICBpZiAoZmFsc2VUeXBlcyAhPSBudWxsKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNwZWNpYWwtY2FzZSB0aGUgYD09IG51bGxgIHJlcHJlc2VudGF0aW9uIHRvCiAgICAgIC8vIG1ha2UgaXQgZmFzdGVyLgogICAgICBmb3IgKGlyLkRhcnRUeXBlIHR5cGUgaW4gZmFsc2VUeXBlcykgewogICAgICAgIGlmICh0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoZGVjbGFyZWRUeXBlLCB0eXBlKSkgewogICAgICAgICAgcmV0dXJuIHR5cGVFbnZpcm9ubWVudC5udWxsVHlwZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICh0cnVlVHlwZXMgIT0gbnVsbCkgewogICAgICBmb3IgKGlyLkRhcnRUeXBlIHR5cGUgaW4gdHJ1ZVR5cGVzKSB7CiAgICAgICAgaWYgKHR5cGUgPT0gdHlwZUVudmlyb25tZW50Lm51bGxUeXBlKSB7CiAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZih0eXBlLCBjYW5kaWRhdGUpKSB7CiAgICAgICAgICBjYW5kaWRhdGUgPSB0eXBlOwogICAgICAgIH0gZWxzZSBpZiAoIXR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihjYW5kaWRhdGUsIHR5cGUpKSB7CiAgICAgICAgICAvLyBXZSBjYW5ub3QgcHJvbW90ZS4gTm8gc2luZ2xlIHR5cGUgaXMgbW9zdCBzcGVjaWZpYy4KICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENvbXB1dGUgaW1wbGllZCB0eXBlcz8gRm9yIGluc3RhbmNlIHdoZW4gdGhlCiAgICAgICAgICAvLyBkZWNsYXJlZCB0eXBlIGlzIGBJdGVyYWJsZTxTdHJpbmc+YCBhbmQgdGVzdGVkIHR5cGUgaXMKICAgICAgICAgIC8vIGBMaXN0PGR5bmFtaWM+YCB3ZSBjb3VsZCBwcm9tb3RlIHRvIHRoZSBpbXBsaWVkIHR5cGUKICAgICAgICAgIC8vIGBMaXN0PFN0cmluZz5gLgogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gY2FuZGlkYXRlOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICBpZiAoX2hhc2hDb2RlID09IG51bGwpIHsKICAgICAgX2hhc2hDb2RlID0gSGFzaGluZy5zZXRIYXNoKGZhbHNlVHlwZXMsCiAgICAgICAgICBIYXNoaW5nLnNldEhhc2godHJ1ZVR5cGVzLCBIYXNoaW5nLm9iamVjdEhhc2goZGVjbGFyZWRUeXBlKSkpOwogICAgfQogICAgcmV0dXJuIF9oYXNoQ29kZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBvdGhlciBpcyBUeXBlSG9sZGVyICYmCiAgICAgICAgZGVjbGFyZWRUeXBlID09IG90aGVyLmRlY2xhcmVkVHlwZSAmJgogICAgICAgIGVxdWFsU2V0cyh0cnVlVHlwZXMsIG90aGVyLnRydWVUeXBlcykgJiYKICAgICAgICBlcXVhbFNldHMoZmFsc2VUeXBlcywgb3RoZXIuZmFsc2VUeXBlcyk7CiAgfQoKICB2b2lkIF9nZXRUZXh0KAogICAgICBTdHJpbmdCdWZmZXIgc2IsIFN0cmluZyBGdW5jdGlvbihJdGVyYWJsZTxpci5EYXJ0VHlwZT4pIHR5cGVzVG9UZXh0KSB7CiAgICBzYi53cml0ZSgneycpOwogICAgU3RyaW5nIGNvbW1hID0gJyc7CiAgICBpZiAodHJ1ZVR5cGVzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJ3RydWU6Jyk7CiAgICAgIHNiLndyaXRlKHR5cGVzVG9UZXh0KHRydWVUeXBlcykpOwogICAgICBjb21tYSA9ICcsJzsKICAgIH0KICAgIGlmIChmYWxzZVR5cGVzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoY29tbWEpOwogICAgICBzYi53cml0ZSgnZmFsc2U6Jyk7CiAgICAgIHNiLndyaXRlKHR5cGVzVG9UZXh0KGZhbHNlVHlwZXMpKTsKICAgIH0KICAgIHNiLndyaXRlKCd9Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnVHlwZUhvbGRlcignKTsKICAgIHNiLndyaXRlKCdkZWNsYXJlZD0kZGVjbGFyZWRUeXBlJyk7CiAgICBpZiAodHJ1ZVR5cGVzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJyx0cnVlPSR0cnVlVHlwZXMnKTsKICAgIH0KICAgIGlmIChmYWxzZVR5cGVzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJyxmYWxzZT0kZmFsc2VUeXBlcycpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKLy8vIFR5cGUgaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIGxvY2FsIHZhcmlhYmxlIG9uIGFsbCBwb3NzaWJsZSBwYXRocy4KLy8vCi8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IGd1YXJkZWQgdHlwZSBwcm9tb3Rpb24uCi8vLwovLy8gVGhlIHRlcm1pbm9sb2d5IGFuZCBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGlzIHBhcGVyOgovLy8KLy8vICAgaHR0cDovL3d3dy5jcy53aWxsaWFtcy5lZHUvRlRmSlAyMDExLzYtV2ludGhlci5wZGYKLy8vCmNsYXNzIFRhcmdldEluZm8gewogIC8vLyBUaGUgZGVjbGFyZWQgdHlwZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUuCiAgZmluYWwgaXIuRGFydFR5cGUgZGVjbGFyZWRUeXBlOwoKICAvLy8gQ29sbGVjdGVkIHR5cGUgaW5mb3JtYXRpb24gZm9yIGRpc2pvaW50IHBhdGhzLgogIGZpbmFsIEl0ZXJhYmxlPFR5cGVIb2xkZXI+IHR5cGVIb2xkZXJzOwoKICAvLy8gVHlwZXMgcmVsZXZhbnQgZm9yIHByb21vdGlvbiBvZiB0aGUgbG9jYWwgdmFyaWFibGUuCiAgZmluYWwgSXRlcmFibGU8aXIuRGFydFR5cGU+IHR5cGVzT2ZJbnRlcmVzdDsKCiAgVGFyZ2V0SW5mbyh0aGlzLmRlY2xhcmVkVHlwZSwgdGhpcy50eXBlSG9sZGVycywgdGhpcy50eXBlc09mSW50ZXJlc3QpOwoKICAvLy8gUmV0dXJucyB0aGUgW1RhcmdldEluZm9dIHRoYXQgZGVzY3JpYmVzIHRoZSBhZGRlZCB0eXBlIGtub3dsZWRnZSBmb3IgdGhlCiAgLy8vIGxvY2FsIHZhcmlhYmxlLiBJZiBbaXNUcnVlXSBpcyBgdHJ1ZWAsIHRoZSBsb2NhbCB2YXJpYWJsZSBpcyBrbm93biB0bwogIC8vLyBiZSBhbiBpbnN0YW5jZSBvZiBbdHlwZV0uIElmIFtpc1RydWVdIGlzIGBmYWxzZWAsIHRoZSBsb2NhbCB2YXJpYWJsZSBpcwogIC8vLyBrbm93biBfbm90XyB0byBiZSBhbiBpbnN0YW5jZSBvZiBbdHlwZV0uCiAgVGFyZ2V0SW5mbyBwcm9tb3RlKGlyLkRhcnRUeXBlIHR5cGUsIHtib29sIGlzVHJ1ZX0pIHsKICAgIFNldDxUeXBlSG9sZGVyPiBuZXdUeXBlSG9sZGVycyA9IG5ldyBTZXQ8VHlwZUhvbGRlcj4oKTsKCiAgICBib29sIGFkZFR5cGVIb2xkZXIoVHlwZUhvbGRlciB0eXBlSG9sZGVyKSB7CiAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwoKICAgICAgU2V0PGlyLkRhcnRUeXBlPiBhZGRBc0NvcHkoU2V0PGlyLkRhcnRUeXBlPiBzZXQsIGlyLkRhcnRUeXBlIHR5cGUpIHsKICAgICAgICBTZXQ8aXIuRGFydFR5cGU+IHJlc3VsdDsKICAgICAgICBpZiAoc2V0ID09IG51bGwpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBTZXQ8aXIuRGFydFR5cGU+KCk7CiAgICAgICAgfSBlbHNlIGlmIChzZXQuY29udGFpbnModHlwZSkpIHsKICAgICAgICAgIHJldHVybiBzZXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdCA9IFNldDxpci5EYXJ0VHlwZT4uZnJvbShzZXQpOwogICAgICAgIH0KICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICByZXR1cm4gcmVzdWx0Li5hZGQodHlwZSk7CiAgICAgIH0KCiAgICAgIFNldDxpci5EYXJ0VHlwZT4gdHJ1ZVR5cGVzID0gdHlwZUhvbGRlcj8udHJ1ZVR5cGVzOwogICAgICBTZXQ8aXIuRGFydFR5cGU+IGZhbHNlVHlwZXMgPSB0eXBlSG9sZGVyPy5mYWxzZVR5cGVzOwogICAgICBpZiAoaXNUcnVlKSB7CiAgICAgICAgdHJ1ZVR5cGVzID0gYWRkQXNDb3B5KHRydWVUeXBlcywgdHlwZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmFsc2VUeXBlcyA9IGFkZEFzQ29weShmYWxzZVR5cGVzLCB0eXBlKTsKICAgICAgfQogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDaGVjayB2YWxpZGl0eTsgaWYgdGhlIHRydWUgdHlwZXMgYXJlCiAgICAgIC8vIGNvbnRyYWRpY3RpbmcsIGZvciBpbnN0YW5jZSBpZiB0aGUgbG9jYWwgaXMga25vd24gdG8gYmUgYW5kIGluc3RhbmNlCiAgICAgIC8vIG9mIHR5cGVzIGBpbnRgIGFuZCBgU3RyaW5nYCBzaW11bHRhbmVvdXNseSwgdGhlbiB3ZSBjb3VsZCBmbGFnIGNvZGUKICAgICAgLy8gYXMgZGVhZCBjb2RlLgogICAgICBuZXdUeXBlSG9sZGVycy5hZGQoVHlwZUhvbGRlcihkZWNsYXJlZFR5cGUsIHRydWVUeXBlcywgZmFsc2VUeXBlcykpOwogICAgICByZXR1cm4gY2hhbmdlZDsKICAgIH0KCiAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKICAgIGlmICh0eXBlSG9sZGVycy5pc0VtcHR5KSB7CiAgICAgIGNoYW5nZWQgfD0gYWRkVHlwZUhvbGRlcihudWxsKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoVHlwZUhvbGRlciB0eXBlSG9sZGVyIGluIHR5cGVIb2xkZXJzKSB7CiAgICAgICAgY2hhbmdlZCB8PSBhZGRUeXBlSG9sZGVyKHR5cGVIb2xkZXIpOwogICAgICB9CiAgICB9CiAgICBJdGVyYWJsZTxpci5EYXJ0VHlwZT4gbmV3VHlwZXNPZkludGVyZXN0OwogICAgaWYgKHR5cGVzT2ZJbnRlcmVzdC5jb250YWlucyh0eXBlKSkgewogICAgICBuZXdUeXBlc09mSW50ZXJlc3QgPSB0eXBlc09mSW50ZXJlc3Q7CiAgICB9IGVsc2UgewogICAgICBuZXdUeXBlc09mSW50ZXJlc3QgPSBuZXcgU2V0PGlyLkRhcnRUeXBlPi5mcm9tKHR5cGVzT2ZJbnRlcmVzdCkKICAgICAgICAuLmFkZCh0eXBlKTsKICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gY2hhbmdlZAogICAgICAgID8gbmV3IFRhcmdldEluZm8oZGVjbGFyZWRUeXBlLCBuZXdUeXBlSG9sZGVycywgbmV3VHlwZXNPZkludGVyZXN0KQogICAgICAgIDogdGhpczsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbVGFyZ2V0SW5mb10gdGhhdCBkZXNjcmliZXMgdGhhdCB0aGUgbG9jYWwgaXMgZWl0aGVyIG9mIFt0aGlzXQogIC8vLyBvciB0aGUgW290aGVyXSB0eXBlLgogIC8vLwogIC8vLyBSZXR1cm5zIGBudWxsYCBpZiB0aGUgam9pbiBpcyBlbXB0eS4KICBUYXJnZXRJbmZvIGpvaW4oVGFyZ2V0SW5mbyBvdGhlcikgewogICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBudWxsOwogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0aGlzOwoKICAgIFNldDxUeXBlSG9sZGVyPiBuZXdUeXBlSG9sZGVycyA9IG5ldyBTZXQ8VHlwZUhvbGRlcj4oKTsKICAgIFNldDxpci5EYXJ0VHlwZT4gbmV3VHlwZXNPZkludGVyZXN0ID0gbmV3IFNldDxpci5EYXJ0VHlwZT4oKTsKCiAgICAvLy8gQWRkcyB0aGUgW3R5cGVIb2xkZXJzXSB0byBbbmV3VHlwZUhvbGRlcnNdIGZvciB0eXBlcyBpbgogICAgLy8vIFtvdGhlclR5cGVzT2ZJbnRlcmVzdF0gd2hpbGUgcmVtb3ZpbmcgdGhlIGluZm9ybWF0aW9uCiAgICAvLy8gaW52YWxpZGF0ZWQgYnkgW290aGVyVHJ1ZVR5cGVzXSBhbmQgW290aGVyRmFsc2VUeXBlc10uCiAgICB2b2lkIGFkZFR5cGVIb2xkZXJzKAogICAgICAgIEl0ZXJhYmxlPFR5cGVIb2xkZXI+IHR5cGVIb2xkZXJzLAogICAgICAgIFNldDxpci5EYXJ0VHlwZT4gb3RoZXJUcnVlVHlwZXMsCiAgICAgICAgU2V0PGlyLkRhcnRUeXBlPiBvdGhlckZhbHNlVHlwZXMsCiAgICAgICAgSXRlcmFibGU8aXIuRGFydFR5cGU+IG90aGVyVHlwZXNPZkludGVyZXN0KSB7CiAgICAgIGZvciAoVHlwZUhvbGRlciB0eXBlSG9sZGVyIGluIHR5cGVIb2xkZXJzKSB7CiAgICAgICAgU2V0PGlyLkRhcnRUeXBlPiBuZXdUcnVlVHlwZXM7CiAgICAgICAgaWYgKHR5cGVIb2xkZXIudHJ1ZVR5cGVzICE9IG51bGwpIHsKICAgICAgICAgIG5ld1RydWVUeXBlcyA9IG5ldyBTZXQ8aXIuRGFydFR5cGU+LmZyb20odHlwZUhvbGRlci50cnVlVHlwZXMpOwoKICAgICAgICAgIC8vLyBPbmx5IHR5cGVzIGluIFtvdGhlclR5cGVzT2ZJbnRlcmVzdF0gaGFzIGluZm9ybWF0aW9uIGZyb20gYWxsCiAgICAgICAgICAvLy8gcGF0aHMuCiAgICAgICAgICBuZXdUcnVlVHlwZXMucmV0YWluQWxsKG90aGVyVHlwZXNPZkludGVyZXN0KTsKCiAgICAgICAgICAvLy8gUmVtb3ZlIHR5cGVzIHRoYXQgYXJlIGtub3duIHRvIGJlIGZhbHNlIG9uIG90aGVyIHBhdGhzOyB0aGVzZQogICAgICAgICAgLy8vIHdvdWxkIGFtb3VudCB0byBrbm93aW5nIHRoYXQgYSB2YXJpYWJsZSBpcyBvciBpcyBub3Qgb2Ygc29tZQogICAgICAgICAgLy8vIHR5cGUuCiAgICAgICAgICBuZXdUcnVlVHlwZXMucmVtb3ZlQWxsKG90aGVyRmFsc2VUeXBlcyk7CiAgICAgICAgICBpZiAobmV3VHJ1ZVR5cGVzLmlzRW1wdHkpIHsKICAgICAgICAgICAgbmV3VHJ1ZVR5cGVzID0gbnVsbDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ld1R5cGVzT2ZJbnRlcmVzdC5hZGRBbGwobmV3VHJ1ZVR5cGVzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgU2V0PGlyLkRhcnRUeXBlPiBuZXdGYWxzZVR5cGVzOwogICAgICAgIGlmICh0eXBlSG9sZGVyLmZhbHNlVHlwZXMgIT0gbnVsbCkgewogICAgICAgICAgbmV3RmFsc2VUeXBlcyA9IG5ldyBTZXQ8aXIuRGFydFR5cGU+LmZyb20odHlwZUhvbGRlci5mYWxzZVR5cGVzKTsKCiAgICAgICAgICAvLy8gT25seSB0eXBlcyBpbiBbb3RoZXJUeXBlc09mSW50ZXJlc3RdIGhhcyBpbmZvcm1hdGlvbiBmcm9tIGFsbAogICAgICAgICAgLy8vIHBhdGhzLgogICAgICAgICAgbmV3RmFsc2VUeXBlcy5yZXRhaW5BbGwob3RoZXJUeXBlc09mSW50ZXJlc3QpOwoKICAgICAgICAgIC8vLyBSZW1vdmUgdHlwZXMgdGhhdCBhcmUga25vd24gdG8gYmUgdHJ1ZSBvbiBvdGhlciBwYXRoczsgdGhlc2UKICAgICAgICAgIC8vLyB3b3VsZCBhbW91bnQgdG8ga25vd2luZyB0aGF0IGEgdmFyaWFibGUgaXMgb3IgaXMgbm90IG9mIHNvbWUKICAgICAgICAgIC8vLyB0eXBlLgogICAgICAgICAgbmV3RmFsc2VUeXBlcy5yZW1vdmVBbGwob3RoZXJUcnVlVHlwZXMpOwogICAgICAgICAgaWYgKG5ld0ZhbHNlVHlwZXMuaXNFbXB0eSkgewogICAgICAgICAgICBuZXdGYWxzZVR5cGVzID0gbnVsbDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ld1R5cGVzT2ZJbnRlcmVzdC5hZGRBbGwobmV3RmFsc2VUeXBlcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChuZXdUcnVlVHlwZXMgIT0gbnVsbCB8fCBuZXdGYWxzZVR5cGVzICE9IG51bGwpIHsKICAgICAgICAgIC8vIE9ubHkgaW5jbHVkZSB0eXBlIGhvbGRlcnMgd2l0aCBpbmZvcm1hdGlvbi4KICAgICAgICAgIG5ld1R5cGVIb2xkZXJzCiAgICAgICAgICAgICAgLmFkZChuZXcgVHlwZUhvbGRlcihkZWNsYXJlZFR5cGUsIG5ld1RydWVUeXBlcywgbmV3RmFsc2VUeXBlcykpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIFNldDxpci5EYXJ0VHlwZT4gdGhpc1RydWVUeXBlcyA9IG5ldyBTZXQ8aXIuRGFydFR5cGU+KCk7CiAgICBTZXQ8aXIuRGFydFR5cGU+IHRoaXNGYWxzZVR5cGVzID0gbmV3IFNldDxpci5EYXJ0VHlwZT4oKTsKICAgIGZvciAoVHlwZUhvbGRlciB0eXBlSG9sZGVyIGluIHR5cGVIb2xkZXJzKSB7CiAgICAgIGlmICh0eXBlSG9sZGVyLnRydWVUeXBlcyAhPSBudWxsKSB7CiAgICAgICAgdGhpc1RydWVUeXBlcy5hZGRBbGwodHlwZUhvbGRlci50cnVlVHlwZXMpOwogICAgICB9CiAgICAgIGlmICh0eXBlSG9sZGVyLmZhbHNlVHlwZXMgIT0gbnVsbCkgewogICAgICAgIHRoaXNGYWxzZVR5cGVzLmFkZEFsbCh0eXBlSG9sZGVyLmZhbHNlVHlwZXMpOwogICAgICB9CiAgICB9CgogICAgU2V0PGlyLkRhcnRUeXBlPiBvdGhlclRydWVUeXBlcyA9IG5ldyBTZXQ8aXIuRGFydFR5cGU+KCk7CiAgICBTZXQ8aXIuRGFydFR5cGU+IG90aGVyRmFsc2VUeXBlcyA9IG5ldyBTZXQ8aXIuRGFydFR5cGU+KCk7CiAgICBmb3IgKFR5cGVIb2xkZXIgdHlwZUhvbGRlciBpbiBvdGhlci50eXBlSG9sZGVycykgewogICAgICBpZiAodHlwZUhvbGRlci50cnVlVHlwZXMgIT0gbnVsbCkgewogICAgICAgIG90aGVyVHJ1ZVR5cGVzLmFkZEFsbCh0eXBlSG9sZGVyLnRydWVUeXBlcyk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVIb2xkZXIuZmFsc2VUeXBlcyAhPSBudWxsKSB7CiAgICAgICAgb3RoZXJGYWxzZVR5cGVzLmFkZEFsbCh0eXBlSG9sZGVyLmZhbHNlVHlwZXMpOwogICAgICB9CiAgICB9CgogICAgYWRkVHlwZUhvbGRlcnModGhpcy50eXBlSG9sZGVycywgb3RoZXJUcnVlVHlwZXMsIG90aGVyRmFsc2VUeXBlcywKICAgICAgICBvdGhlci50eXBlc09mSW50ZXJlc3QpOwogICAgYWRkVHlwZUhvbGRlcnMoCiAgICAgICAgb3RoZXIudHlwZUhvbGRlcnMsIHRoaXNUcnVlVHlwZXMsIHRoaXNGYWxzZVR5cGVzLCB0aGlzLnR5cGVzT2ZJbnRlcmVzdCk7CgogICAgaWYgKG5ld1R5cGVIb2xkZXJzLmlzRW1wdHkpIHsKICAgICAgYXNzZXJ0KG5ld1R5cGVzT2ZJbnRlcmVzdC5pc0VtcHR5KTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcmV0dXJuIG5ldyBUYXJnZXRJbmZvKGRlY2xhcmVkVHlwZSwgbmV3VHlwZUhvbGRlcnMsIG5ld1R5cGVzT2ZJbnRlcmVzdCk7CiAgfQoKICAvLy8gQ29tcHV0ZXMgYSBzaW5nbGUgdHlwZSB0aGF0IHNvdW5kbHkgcmVwcmVzZW50cyB0aGUgcHJvbW90ZWQgdHlwZSBvZiB0aGUKICAvLy8gbG9jYWwgdmFyaWFibGUgb24gYWxsIHBvc3NpYmxlIHBhdGhzLgogIGlyLkRhcnRUeXBlIHR5cGVPZihpci5UeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50KSB7CiAgICBpci5EYXJ0VHlwZSBjYW5kaWRhdGUgPSBudWxsOwogICAgZm9yIChUeXBlSG9sZGVyIHR5cGVIb2xkZXIgaW4gdHlwZUhvbGRlcnMpIHsKICAgICAgaXIuRGFydFR5cGUgdHlwZSA9IHR5cGVIb2xkZXIudHlwZU9mKHR5cGVFbnZpcm9ubWVudCk7CiAgICAgIGlmICh0eXBlID09IG51bGwpIHsKICAgICAgICAvLyBXZSBjYW5ub3QgcHJvbW90ZS4gTm8gc2luZ2xlIHR5cGUgaXMgbW9zdCBzcGVjaWZpYy4KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoY2FuZGlkYXRlID09IG51bGwpIHsKICAgICAgICBjYW5kaWRhdGUgPSB0eXBlOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0eXBlID09IHR5cGVFbnZpcm9ubWVudC5udWxsVHlwZSkgewogICAgICAgICAgLy8gS2VlcCB0aGUgY3VycmVudCBjYW5kaWRhdGUuCiAgICAgICAgfSBlbHNlIGlmIChjYW5kaWRhdGUgPT0gdHlwZUVudmlyb25tZW50Lm51bGxUeXBlKSB7CiAgICAgICAgICBjYW5kaWRhdGUgPSB0eXBlOwogICAgICAgIH0gZWxzZSBpZiAodHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKGNhbmRpZGF0ZSwgdHlwZSkpIHsKICAgICAgICAgIGNhbmRpZGF0ZSA9IHR5cGU7CiAgICAgICAgfSBlbHNlIGlmICghdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKHR5cGUsIGNhbmRpZGF0ZSkpIHsKICAgICAgICAgIC8vIFdlIGNhbm5vdCBwcm9tb3RlLiBObyBwcm9tb3RlZCB0eXBlIG9mIG9uZSBwYXRoIGlzIGEgc3VwZXJ0eXBlIG9mCiAgICAgICAgICAvLyB0aGUgcHJvbW90ZWQgdHlwZSBmcm9tIGFsbCBvdGhlciBwYXRocy4KICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENvbXB1dGUgYSBncmVhdGVzdCBsb3dlciBib3VuZCwgaW5zdGVhZD8KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGNhbmRpZGF0ZTsKICB9CgogIHZvaWQgX2dldFRleHQoCiAgICAgIFN0cmluZ0J1ZmZlciBzYiwgU3RyaW5nIEZ1bmN0aW9uKEl0ZXJhYmxlPGlyLkRhcnRUeXBlPikgdHlwZXNUb1RleHQpIHsKICAgIHNiLndyaXRlKCdbJyk7CiAgICBTdHJpbmcgY29tbWEgPSAnJzsKICAgIGZvciAoVHlwZUhvbGRlciB0eXBlSG9sZGVyIGluIHR5cGVIb2xkZXJzKSB7CiAgICAgIHNiLndyaXRlKGNvbW1hKTsKICAgICAgdHlwZUhvbGRlci5fZ2V0VGV4dChzYiwgdHlwZXNUb1RleHQpOwogICAgICBjb21tYSA9ICcsJzsKICAgIH0KICAgIHNiLndyaXRlKCd8Jyk7CiAgICBzYi53cml0ZSh0eXBlc1RvVGV4dCh0eXBlc09mSW50ZXJlc3QpKTsKICAgIHNiLndyaXRlKCddJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnVGFyZ2V0SW5mbygnKTsKICAgIHNiLndyaXRlKCdkZWNsYXJlZFR5cGU9JGRlY2xhcmVkVHlwZSwnKTsKICAgIHNiLndyaXRlKCd0eXBlSG9sZGVycz0kdHlwZUhvbGRlcnMsJyk7CiAgICBzYi53cml0ZSgnZGVjbGFyYXRpb25zT2ZJbnRlcmVzdD0kdHlwZXNPZkludGVyZXN0Jyk7CiAgICBzYi53cml0ZSgnKScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgovLy8gTWFwIGZyb20gbG9jYWwgdmFyaWFibGVzIHRvIHR5cGUgaW5mb3JtYXRpb24gdXNlZCBmb3IgZ3VhcmRlZCB0eXBlCi8vLyBwcm9tb3Rpb24uCi8vLwovLy8gVGhlIHRlcm1pbm9sb2d5IGFuZCBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGlzIHBhcGVyOgovLy8KLy8vICAgaHR0cDovL3d3dy5jcy53aWxsaWFtcy5lZHUvRlRmSlAyMDExLzYtV2ludGhlci5wZGYKLy8vCmNsYXNzIFR5cGVNYXAgewogIGZpbmFsIE1hcDxpci5WYXJpYWJsZURlY2xhcmF0aW9uLCBUYXJnZXRJbmZvPiBfdGFyZ2V0SW5mb01hcDsKCiAgY29uc3QgVHlwZU1hcChbdGhpcy5fdGFyZ2V0SW5mb01hcCA9IGNvbnN0IHt9XSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbVHlwZU1hcF0gdGhhdCBkZXNjcmliZXMgdGhlIGFkZGVkIHR5cGUga25vd2xlZGdlIGZvciB0aGUKICAvLy8gbG9jYWwgW3ZhcmlhYmxlXS4gSWYgW2lzVHJ1ZV0gaXMgYHRydWVgLCB0aGUgbG9jYWwgW3ZhcmlhYmxlXSBpcyBrbm93biB0bwogIC8vLyBiZSBhbiBpbnN0YW5jZSBvZiBbdHlwZV0uIElmIFtpc1RydWVdIGlzIGBmYWxzZWAsIHRoZSBsb2NhbCBbdmFyaWFibGVdIGlzCiAgLy8vIGtub3duIF9ub3RfIHRvIGJlIGFuIGluc3RhbmNlIG9mIFt0eXBlXS4KICBUeXBlTWFwIHByb21vdGUoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgaXIuRGFydFR5cGUgdHlwZSwKICAgICAge2Jvb2wgaXNUcnVlfSkgewogICAgTWFwPGlyLlZhcmlhYmxlRGVjbGFyYXRpb24sIFRhcmdldEluZm8+IG5ld0luZm9NYXAgPQogICAgICAgIG5ldyBNYXA8aXIuVmFyaWFibGVEZWNsYXJhdGlvbiwgVGFyZ2V0SW5mbz4uZnJvbShfdGFyZ2V0SW5mb01hcCk7CiAgICBUYXJnZXRJbmZvIHRhcmdldEluZm8gPSBuZXdJbmZvTWFwW3ZhcmlhYmxlXTsKICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwogICAgaWYgKHRhcmdldEluZm8gIT0gbnVsbCkgewogICAgICBUYXJnZXRJbmZvIHJlc3VsdCA9IHRhcmdldEluZm8ucHJvbW90ZSh0eXBlLCBpc1RydWU6IGlzVHJ1ZSk7CiAgICAgIGNoYW5nZWQgPSAhaWRlbnRpY2FsKHRhcmdldEluZm8sIHJlc3VsdCk7CiAgICAgIHRhcmdldEluZm8gPSByZXN1bHQ7CiAgICB9IGVsc2UgewogICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgU2V0PGlyLkRhcnRUeXBlPiB0cnVlVHlwZXMgPQogICAgICAgICAgaXNUcnVlID8gKG5ldyBTZXQ8aXIuRGFydFR5cGU+KCkuLmFkZCh0eXBlKSkgOiBudWxsOwogICAgICBTZXQ8aXIuRGFydFR5cGU+IGZhbHNlVHlwZXMgPQogICAgICAgICAgaXNUcnVlID8gbnVsbCA6IChuZXcgU2V0PGlyLkRhcnRUeXBlPigpLi5hZGQodHlwZSkpOwogICAgICBUeXBlSG9sZGVyIHR5cGVIb2xkZXIgPQogICAgICAgICAgbmV3IFR5cGVIb2xkZXIodmFyaWFibGUudHlwZSwgdHJ1ZVR5cGVzLCBmYWxzZVR5cGVzKTsKICAgICAgdGFyZ2V0SW5mbyA9IG5ldyBUYXJnZXRJbmZvKAogICAgICAgICAgdmFyaWFibGUudHlwZSwgPFR5cGVIb2xkZXI+W3R5cGVIb2xkZXJdLCA8aXIuRGFydFR5cGU+W3R5cGVdKTsKICAgIH0KICAgIG5ld0luZm9NYXBbdmFyaWFibGVdID0gdGFyZ2V0SW5mbzsKICAgIHJldHVybiBjaGFuZ2VkID8gbmV3IFR5cGVNYXAobmV3SW5mb01hcCkgOiB0aGlzOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIFtUeXBlTWFwXSB0aGF0IGRlc2NyaWJlcyB0aGF0IHRoZSBsb2NhbHMgYXJlIGVpdGhlciBvZiBbdGhpc10KICAvLy8gb3IgdGhlIFtvdGhlcl0gdHlwZXMuCiAgVHlwZU1hcCBqb2luKFR5cGVNYXAgb3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdGhpczsKCiAgICBNYXA8aXIuVmFyaWFibGVEZWNsYXJhdGlvbiwgVGFyZ2V0SW5mbz4gbmV3SW5mb01hcCA9IHt9OwogICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CiAgICBfdGFyZ2V0SW5mb01hcC5mb3JFYWNoKChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBUYXJnZXRJbmZvIGluZm8pIHsKICAgICAgVGFyZ2V0SW5mbyByZXN1bHQgPSBpbmZvLmpvaW4ob3RoZXIuX3RhcmdldEluZm9NYXBbdmFyaWFibGVdKTsKICAgICAgY2hhbmdlZCB8PSAhaWRlbnRpY2FsKGluZm8sIHJlc3VsdCk7CiAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewogICAgICAgIC8vIEFkZCBvbmx5IG5vbi1lbXB0eSBpbmZvcm1hdGlvbi4KICAgICAgICBuZXdJbmZvTWFwW3ZhcmlhYmxlXSA9IHJlc3VsdDsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gY2hhbmdlZCA/IG5ldyBUeXBlTWFwKG5ld0luZm9NYXApIDogdGhpczsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbVHlwZU1hcF0gaW4gd2hpY2ggYWxsIHR5cGUgaW5mb3JtYXRpb24gZm9yIGFueSBvZiB0aGUKICAvLy8gW3ZhcmlhYmxlc10gaGFzIGJlZW4gcmVtb3ZlZC4KICBUeXBlTWFwIHJlbW92ZShJdGVyYWJsZTxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMpIHsKICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwogICAgTWFwPGlyLlZhcmlhYmxlRGVjbGFyYXRpb24sIFRhcmdldEluZm8+IG5ld0luZm9NYXAgPSB7fTsKICAgIF90YXJnZXRJbmZvTWFwLmZvckVhY2goKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIFRhcmdldEluZm8gaW5mbykgewogICAgICBpZiAoIXZhcmlhYmxlcy5jb250YWlucyh2YXJpYWJsZSkpIHsKICAgICAgICBuZXdJbmZvTWFwW3ZhcmlhYmxlXSA9IGluZm87CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIGNoYW5nZWQgPyBuZXcgVHlwZU1hcChuZXdJbmZvTWFwKSA6IHRoaXM7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgW1R5cGVNYXBdIHdoZXJlIHR5cGUgaW5mb3JtYXRpb24gZm9yIGBub2RlLnZhcmlhYmxlYCBpcwogIC8vLyByZWR1Y2VkIHRvIHRoZSBwcm9tb3Rpb25zIHVwaGVsZCBieSBhbiBhc3NpZ25tZW50IHRvIGBub2RlLnZhcmlhYmxlYCBvZgogIC8vLyB0aGUgc3RhdGljIFt0eXBlXS4KICBUeXBlTWFwIHJlZHVjZShpci5WYXJpYWJsZVNldCBub2RlLCBpci5EYXJ0VHlwZSB0eXBlLAogICAgICBpci5UeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50KSB7CiAgICBNYXA8aXIuVmFyaWFibGVEZWNsYXJhdGlvbiwgVGFyZ2V0SW5mbz4gbmV3SW5mb01hcCA9IHt9OwogICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CiAgICBfdGFyZ2V0SW5mb01hcC5mb3JFYWNoKChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBUYXJnZXRJbmZvIGluZm8pIHsKICAgICAgaWYgKHZhcmlhYmxlICE9IG5vZGUudmFyaWFibGUpIHsKICAgICAgICBuZXdJbmZvTWFwW3ZhcmlhYmxlXSA9IGluZm87CiAgICAgIH0gZWxzZSBpZiAodHlwZSAhPSBudWxsKSB7CiAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgICAgU2V0PGlyLkRhcnRUeXBlPiBuZXdUeXBlc09mSW50ZXJlc3QgPSBuZXcgU2V0PGlyLkRhcnRUeXBlPigpOwogICAgICAgIGZvciAoaXIuRGFydFR5cGUgdHlwZU9mSW50ZXJlc3QgaW4gaW5mby50eXBlc09mSW50ZXJlc3QpIHsKICAgICAgICAgIGlmICh0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YodHlwZSwgdHlwZU9mSW50ZXJlc3QpKSB7CiAgICAgICAgICAgIG5ld1R5cGVzT2ZJbnRlcmVzdC5hZGQodHlwZU9mSW50ZXJlc3QpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobmV3VHlwZXNPZkludGVyZXN0LmlzTm90RW1wdHkpIHsKICAgICAgICAgIFR5cGVIb2xkZXIgdHlwZUhvbGRlcklmTm9uTnVsbCA9CiAgICAgICAgICAgICAgbmV3IFR5cGVIb2xkZXIoaW5mby5kZWNsYXJlZFR5cGUsIG5ld1R5cGVzT2ZJbnRlcmVzdCwgbnVsbCk7CiAgICAgICAgICBUeXBlSG9sZGVyIHR5cGVIb2xkZXJJZk51bGwgPSBuZXcgVHlwZUhvbGRlcihpbmZvLmRlY2xhcmVkVHlwZSwgbnVsbCwKICAgICAgICAgICAgICBuZXcgU2V0PGlyLkRhcnRUeXBlPigpLi5hZGQoaW5mby5kZWNsYXJlZFR5cGUpKTsKICAgICAgICAgIG5ld0luZm9NYXBbdmFyaWFibGVdID0gbmV3IFRhcmdldEluZm8oCiAgICAgICAgICAgICAgaW5mby5kZWNsYXJlZFR5cGUsCiAgICAgICAgICAgICAgPFR5cGVIb2xkZXI+W3R5cGVIb2xkZXJJZk5vbk51bGwsIHR5cGVIb2xkZXJJZk51bGxdLAogICAgICAgICAgICAgIG5ld1R5cGVzT2ZJbnRlcmVzdCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiBjaGFuZ2VkID8gbmV3IFR5cGVNYXAobmV3SW5mb01hcCkgOiB0aGlzOwogIH0KCiAgLy8vIENvbXB1dGVzIGEgc2luZ2xlIHR5cGUgdGhhdCBzb3VuZGx5IHJlcHJlc2VudHMgdGhlIHByb21vdGVkIHR5cGUgb2YKICAvLy8gYG5vZGUudmFyaWFibGVgIG9uIGFsbCBwb3NzaWJsZSBwYXRocy4KICBpci5EYXJ0VHlwZSB0eXBlT2YoaXIuVmFyaWFibGVHZXQgbm9kZSwgaXIuVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCkgewogICAgVGFyZ2V0SW5mbyBpbmZvID0gX3RhcmdldEluZm9NYXBbbm9kZS52YXJpYWJsZV07CiAgICBpci5EYXJ0VHlwZSB0eXBlOwogICAgaWYgKGluZm8gIT0gbnVsbCkgewogICAgICB0eXBlID0gaW5mby50eXBlT2YodHlwZUVudmlyb25tZW50KTsKICAgIH0KICAgIHJldHVybiB0eXBlID8/IG5vZGUucHJvbW90ZWRUeXBlID8/IG5vZGUudmFyaWFibGUudHlwZTsKICB9CgogIFN0cmluZyBnZXRUZXh0KFN0cmluZyBGdW5jdGlvbihJdGVyYWJsZTxpci5EYXJ0VHlwZT4pIHR5cGVzVG9UZXh0KSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgneycpOwogICAgU3RyaW5nIGNvbW1hID0gJyc7CiAgICBfdGFyZ2V0SW5mb01hcC5mb3JFYWNoKChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBUYXJnZXRJbmZvIGluZm8pIHsKICAgICAgc2Iud3JpdGUoJyR7Y29tbWF9JHt2YXJpYWJsZS5uYW1lfTonKTsKICAgICAgaW5mby5fZ2V0VGV4dChzYiwgdHlwZXNUb1RleHQpOwogICAgICBjb21tYSA9ICcsJzsKICAgIH0pOwogICAgc2Iud3JpdGUoJ30nKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ1R5cGVNYXAoJyk7CiAgICBTdHJpbmcgY29tbWEgPSAnJzsKICAgIF90YXJnZXRJbmZvTWFwLmZvckVhY2goKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIFRhcmdldEluZm8gaW5mbykgewogICAgICBzYi53cml0ZSgnJHtjb21tYX0kdmFyaWFibGUtPiRpbmZvJyk7CiAgICAgIGNvbW1hID0gJywnOwogICAgfSk7CiAgICBzYi53cml0ZSgnKScpOwogICAgcmV0dXJu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Kh0tKzkTGgQCAUcPBD8EOQQQQAEzAUxQUC9FFzlKMhoeRDAbDRYjPyQ/HkAjSQYnNQQBUBwgLQE9GlBFKxwrJwgINQQBSSQ/Gj1QKyUPGAgINQQBSk4ZOCw9GlAnJSEYRkNDNAwKLStLUD8xIUMjCg8YCAg1BAFKLVA1FhgrBjwEAUcqExdQLSYTCBMaBAEMFioaF1AsEwgTGgQCAShwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9zdGF0aWNfdHlwZS5kYXJ0O3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3VuaXZlcnNlL2NsYXNzX2hpZXJhcmNoeS5kYXJ0wACLUi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCcgc2hvdyBJbnRlcmZhY2VUeXBlOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICdjbGFzc19zZXQuZGFydCc7CgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNb3ZlIG1vcmUgbWV0aG9kcyBmcm9tIGBKQ2xvc2VkV29ybGRgIHRvCi8vIGBDbGFzc0hpZXJhcmNoeWAuCmFic3RyYWN0IGNsYXNzIENsYXNzSGllcmFyY2h5IHsKICAvLy8gRGVzZXJpYWxpemVzIGEgW0NsYXNzSGllcmFyY2h5XSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IENsYXNzSGllcmFyY2h5LnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPQogICAgICBDbGFzc0hpZXJhcmNoeUltcGwucmVhZEZyb21EYXRhU291cmNlOwoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtDbGFzc0hpZXJhcmNoeV0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2Nsc10gaXMgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5zdGFudGlhdGVkLgogIGJvb2wgaXNJbnN0YW50aWF0ZWQoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtjbHNdIGlzIGRpcmVjdGx5IGluc3RhbnRpYXRlZC4gVGhpcyBtZWFucyB0aGF0IGF0CiAgLy8vIHJ1bnRpbWUgaW5zdGFuY2VzIG9mIGV4YWN0bHkgW2Nsc10gYXJlIGFzc3VtZWQgdG8gZXhpc3QuCiAgYm9vbCBpc0RpcmVjdGx5SW5zdGFudGlhdGVkKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBpcyBhYnN0cmFjdGx5IGluc3RhbnRpYXRlZC4gVGhpcyBtZWFucyB0aGF0IGF0CiAgLy8vIHJ1bnRpbWUgaW5zdGFuY2VzIG9mIFtjbHNdIG9yIHVua25vd24gc3ViY2xhc3NlcyBvZiBbY2xzXSBhcmUgYXNzdW1lZCB0bwogIC8vLyBleGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIHRvIG1hcmsgbmF0aXZlIGFuZC9vciByZWZsZWN0YWJsZSBjbGFzc2VzIGFzIGluc3RhbnRpYXRlZC4KICAvLy8gRm9yIG5hdGl2ZSBjbGFzc2VzIHdlIGRvIG5vdCBrbm93IHRoZSBleGFjdCBjbGFzcyB0aGF0IGluc3RhbnRpYXRlcyBbY2xzXQogIC8vLyBzbyBbY2xzXSBoZXJlIHJlcHJlc2VudHMgdGhlIHJvb3Qgb2YgdGhlIHN1YmNsYXNzZXMuIEZvciByZWZsZWN0YWJsZQogIC8vLyBjbGFzc2VzIHdlIG5lZWQgZXZlbnQgYWJzdHJhY3QgY2xhc3NlcyB0byBiZSAnbGl2ZScgZXZlbiB0aG91Z2ggdGhleQogIC8vLyBjYW5ub3QgdGhlbXNlbHZlcyBiZSBpbnN0YW50aWF0ZWQuCiAgYm9vbCBpc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWQoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtjbHNdIGlzIGVpdGhlciBkaXJlY3RseSBvciBhYnN0cmFjdGx5IGluc3RhbnRpYXRlZC4KICAvLy8KICAvLy8gU2VlIFtpc0RpcmVjdGx5SW5zdGFudGlhdGVkXSBhbmQgW2lzQWJzdHJhY3RseUluc3RhbnRpYXRlZF0uCiAgYm9vbCBpc0V4cGxpY2l0bHlJbnN0YW50aWF0ZWQoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtjbHNdIGlzIGluZGlyZWN0bHkgaW5zdGFudGlhdGVkLCB0aGF0IGlzIHRocm91Z2ggYQogIC8vLyBzdWJjbGFzcy4KICBib29sIGlzSW5kaXJlY3RseUluc3RhbnRpYXRlZChDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJuIGB0cnVlYCBpZiBbeF0gaXMgYSAobm9uLXN0cmljdCkgc3ViY2xhc3Mgb2YgW3ldLgogIGJvb2wgaXNTdWJjbGFzc09mKENsYXNzRW50aXR5IHgsIENsYXNzRW50aXR5IHkpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW3hdIGlzIGEgc3VidHlwZSBvZiBbeV0sIHRoYXQgaXMsIGlmIFt4XSBpbXBsZW1lbnRzIGFuCiAgLy8vIGluc3RhbmNlIG9mIFt5XS4KICBib29sIGlzU3VidHlwZU9mKENsYXNzRW50aXR5IHgsIENsYXNzRW50aXR5IHkpOwoKICAvLy8gUmV0dXJucyBhbiBpdGVyYWJsZSBvdmVyIHRoZSBkaXJlY3RseSBpbnN0YW50aWF0ZWQgY2xhc3NlcyB0aGF0IGV4dGVuZAogIC8vLyBbY2xzXSBwb3NzaWJseSBpbmNsdWRpbmcgW2Nsc10gaXRzZWxmLCBpZiBpdCBpcyBsaXZlLgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBzdWJjbGFzc2VzT2YoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYW4gaXRlcmFibGUgb3ZlciB0aGUgZGlyZWN0bHkgaW5zdGFudGlhdGVkIGNsYXNzZXMgdGhhdCBleHRlbmQKICAvLy8gW2Nsc10gX25vdF8gaW5jbHVkaW5nIFtjbHNdIGl0c2VsZi4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gc3RyaWN0U3ViY2xhc3Nlc09mKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGl2ZSBjbGFzc2VzIHRoYXQgZXh0ZW5kIFtjbHNdIF9ub3RfCiAgLy8vIGluY2x1ZGluZyBbY2xzXSBpdHNlbGYuCiAgaW50IHN0cmljdFN1YmNsYXNzQ291bnQoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIEFwcGxpZXMgW2ZdIHRvIGVhY2ggbGl2ZSBjbGFzcyB0aGF0IGV4dGVuZCBbY2xzXSBfbm90XyBpbmNsdWRpbmcgW2Nsc10KICAvLy8gaXRzZWxmLgogIHZvaWQgZm9yRWFjaFN0cmljdFN1YmNsYXNzT2YoCiAgICAgIENsYXNzRW50aXR5IGNscywgSXRlcmF0aW9uU3RlcCBmKENsYXNzRW50aXR5IGNscykpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW3ByZWRpY2F0ZV0gYXBwbGllcyB0byBhbnkgbGl2ZSBjbGFzcyB0aGF0IGV4dGVuZCBbY2xzXQogIC8vLyBfbm90XyBpbmNsdWRpbmcgW2Nsc10gaXRzZWxmLgogIGJvb2wgYW55U3RyaWN0U3ViY2xhc3NPZihDbGFzc0VudGl0eSBjbHMsIGJvb2wgcHJlZGljYXRlKENsYXNzRW50aXR5IGNscykpOwoKICAvLy8gUmV0dXJucyBhbiBpdGVyYWJsZSBvdmVyIHRoZSBkaXJlY3RseSBpbnN0YW50aWF0ZWQgdGhhdCBpbXBsZW1lbnQgW2Nsc10KICAvLy8gcG9zc2libHkgaW5jbHVkaW5nIFtjbHNdIGl0c2VsZiwgaWYgaXQgaXMgbGl2ZS4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gc3VidHlwZXNPZihDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBhbiBpdGVyYWJsZSBvdmVyIHRoZSBkaXJlY3RseSBpbnN0YW50aWF0ZWQgdGhhdCBpbXBsZW1lbnQgW2Nsc10KICAvLy8gX25vdF8gaW5jbHVkaW5nIFtjbHNdLgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBzdHJpY3RTdWJ0eXBlc09mKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGl2ZSBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IFtjbHNdIF9ub3RfCiAgLy8vIGluY2x1ZGluZyBbY2xzXSBpdHNlbGYuCiAgaW50IHN0cmljdFN1YnR5cGVDb3VudChDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gQXBwbGllcyBbZl0gdG8gZWFjaCBsaXZlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBbY2xzXSBfbm90XyBpbmNsdWRpbmcgW2Nsc10KICAvLy8gaXRzZWxmLgogIHZvaWQgZm9yRWFjaFN0cmljdFN1YnR5cGVPZigKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCBJdGVyYXRpb25TdGVwIGYoQ2xhc3NFbnRpdHkgY2xzKSk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbcHJlZGljYXRlXSBhcHBsaWVzIHRvIGFueSBsaXZlIGNsYXNzIHRoYXQgaW1wbGVtZW50cwogIC8vLyBbY2xzXSBfbm90XyBpbmNsdWRpbmcgW2Nsc10gaXRzZWxmLgogIGJvb2wgYW55U3RyaWN0U3VidHlwZU9mKENsYXNzRW50aXR5IGNscywgYm9vbCBwcmVkaWNhdGUoQ2xhc3NFbnRpdHkgY2xzKSk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbYV0gYW5kIFtiXSBoYXZlIGFueSBrbm93biBjb21tb24gc3VidHlwZXMuCiAgYm9vbCBoYXZlQW55Q29tbW9uU3VidHlwZXMoQ2xhc3NFbnRpdHkgYSwgQ2xhc3NFbnRpdHkgYik7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZGlyZWN0bHkgaW5zdGFudGlhdGVkIGNsYXNzIG90aGVyIHRoYW4gW2Nsc10gZXh0ZW5kcwogIC8vLyBbY2xzXS4KICBib29sIGhhc0FueVN0cmljdFN1YmNsYXNzKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZGlyZWN0bHkgaW5zdGFudGlhdGVkIGNsYXNzIG90aGVyIHRoYW4gW2Nsc10KICAvLy8gaW1wbGVtZW50cyBbY2xzXS4KICBib29sIGhhc0FueVN0cmljdFN1YnR5cGUoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGFsbCBkaXJlY3RseSBpbnN0YW50aWF0ZWQgY2xhc3NlcyB0aGF0IGltcGxlbWVudCBbY2xzXQogIC8vLyBleHRlbmQgaXQuCiAgYm9vbCBoYXNPbmx5U3ViY2xhc3NlcyhDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBhIFtTdWJjbGFzc1Jlc3VsdF0gZm9yIHRoZSBzdWJjbGFzc2VzIHRoYXQgYXJlIGNvbnRhaW5lZCBpbgogIC8vLyB0aGUgc3ViY2xhc3Mvc3VidHlwZSBzZXRzIG9mIGJvdGggW2NsczFdIGFuZCBbY2xzMl0uCiAgLy8vCiAgLy8vIENsYXNzZXMgdGhhdCBhcmUgaW1wbGllZCBieSBpbmNsdWRlZCBzdXBlcmNsYXNzZXMvc3VwZXJ0eXBlcyBhcmUgbm90CiAgLy8vIHJldHVybmVkLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgZm9yIHRoaXMgaGllcmFyY2h5CiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHt9CiAgLy8vICAgICBjbGFzcyBCIHt9CiAgLy8vICAgICBjbGFzcyBDIGltcGxlbWVudHMgQSwgQiB7fQogIC8vLyAgICAgY2xhc3MgRCBleHRlbmRzIEMge30KICAvLy8KICAvLy8gdGhlIHF1ZXJ5CiAgLy8vCiAgLy8vICAgICBjb21tb25TdWJjbGFzc2VzKEEsIENsYXNzUXVlcnkuU1VCVFlQRSwgQiwgQ2xhc3NRdWVyeS5TVUJUWVBFKQogIC8vLwogIC8vLyByZXR1cm4gdGhlIHNldCB7Q30gYmVjYXVzZSBbRF0gaXMgaW1wbGllZCBieSBbQ10uCiAgU3ViY2xhc3NSZXN1bHQgY29tbW9uU3ViY2xhc3NlcygKICAgICAgQ2xhc3NFbnRpdHkgY2xzMSwgQ2xhc3NRdWVyeSBxdWVyeTEsIENsYXNzRW50aXR5IGNsczIsIENsYXNzUXVlcnkgcXVlcnkyKTsKCiAgLy8vIFJldHVybnMgW0NsYXNzSGllcmFyY2h5Tm9kZV0gZm9yIFtjbHNdIHVzZWQgdG8gbW9kZWwgdGhlIGNsYXNzIGhpZXJhcmNoaWVzCiAgLy8vIG9mIGtub3duIGNsYXNzZXMuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgcHJvdmlkZWQgZm9yIHRlc3RpbmcuIEZvciBxdWVyaWVzIG9uIGNsYXNzZXMsIHVzZSB0aGUKICAvLy8gbWV0aG9kcyBkZWZpbmVkIGluIFtKQ2xvc2VkV29ybGRdLgogIENsYXNzSGllcmFyY2h5Tm9kZSBnZXRDbGFzc0hpZXJhcmNoeU5vZGUoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgW0NsYXNzU2V0XSBmb3IgW2Nsc10gdXNlZCB0byBtb2RlbCB0aGUgZXh0ZW5kcyBhbmQgaW1wbGVtZW50cwogIC8vLyByZWxhdGlvbnMgb2Yga25vd24gY2xhc3Nlcy4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgaXMgb25seSBwcm92aWRlZCBmb3IgdGVzdGluZy4gRm9yIHF1ZXJpZXMgb24gY2xhc3NlcywgdXNlIHRoZQogIC8vLyBtZXRob2RzIGRlZmluZWQgaW4gW0pDbG9zZWRXb3JsZF0uCiAgQ2xhc3NTZXQgZ2V0Q2xhc3NTZXQoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsb3NlZCB3b3JsZC4KICAvLy8KICAvLy8gSWYgW2Nsc10gaXMgcHJvdmlkZWQsIHRoZSBkdW1wIHdpbGwgY29udGFpbiBvbmx5IGNsYXNzZXMgcmVsYXRlZCB0byBbY2xzXS4KICBTdHJpbmcgZHVtcChbQ2xhc3NFbnRpdHkgY2xzXSk7Cn0KCmNsYXNzIENsYXNzSGllcmFyY2h5SW1wbCBpbXBsZW1lbnRzIENsYXNzSGllcmFyY2h5IHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0NsYXNzSGllcmFyY2h5XSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2NsYXNzLWhpZXJhcmNoeSc7CgogIGZpbmFsIENvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKICBmaW5hbCBNYXA8Q2xhc3NFbnRpdHksIENsYXNzSGllcmFyY2h5Tm9kZT4gX2NsYXNzSGllcmFyY2h5Tm9kZXM7CiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBDbGFzc1NldD4gX2NsYXNzU2V0czsKCiAgQ2xhc3NIaWVyYXJjaHlJbXBsKAogICAgICB0aGlzLl9jb21tb25FbGVtZW50cywgdGhpcy5fY2xhc3NIaWVyYXJjaHlOb2RlcywgdGhpcy5fY2xhc3NTZXRzKTsKCiAgZmFjdG9yeSBDbGFzc0hpZXJhcmNoeUltcGwucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgTWFwPENsYXNzRW50aXR5LCBDbGFzc0hpZXJhcmNoeU5vZGU+IGNsYXNzSGllcmFyY2h5Tm9kZXMgPQogICAgICAgIG5ldyBDbGFzc0hpZXJhcmNoeU5vZGVzTWFwKCk7CiAgICBpbnQgY2xhc3NDb3VudCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzQ291bnQ7IGkrKykgewogICAgICBDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSA9IG5ldyBDbGFzc0hpZXJhcmNoeU5vZGUucmVhZEZyb21EYXRhU291cmNlKAogICAgICAgICAgc291cmNlLCBjbGFzc0hpZXJhcmNoeU5vZGVzKTsKICAgICAgY2xhc3NIaWVyYXJjaHlOb2Rlc1tub2RlLmNsc10gPSBub2RlOwogICAgfQogICAgTWFwPENsYXNzRW50aXR5LCBDbGFzc1NldD4gY2xhc3NTZXRzID0ge307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzQ291bnQ7IGkrKykgewogICAgICBDbGFzc1NldCBjbGFzc1NldCA9CiAgICAgICAgICBuZXcgQ2xhc3NTZXQucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgY2xhc3NIaWVyYXJjaHlOb2Rlcyk7CiAgICAgIGNsYXNzU2V0c1tjbGFzc1NldC5jbHNdID0gY2xhc3NTZXQ7CiAgICB9CgogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBDbGFzc0hpZXJhcmNoeUltcGwoCiAgICAgICAgY29tbW9uRWxlbWVudHMsIGNsYXNzSGllcmFyY2h5Tm9kZXMsIGNsYXNzU2V0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlSW50KF9jbGFzc1NldHMubGVuZ3RoKTsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlID0KICAgICAgICBnZXRDbGFzc0hpZXJhcmNoeU5vZGUoX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKTsKICAgIG5vZGUuZm9yRWFjaFN1YmNsYXNzKChDbGFzc0VudGl0eSBjbHMpIHsKICAgICAgZ2V0Q2xhc3NIaWVyYXJjaHlOb2RlKGNscykud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0sIENsYXNzSGllcmFyY2h5Tm9kZS5BTEwpOwogICAgQ2xhc3NTZXQgc2V0ID0gZ2V0Q2xhc3NTZXQoX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKTsKICAgIHNldC5mb3JFYWNoU3ViY2xhc3MoKENsYXNzRW50aXR5IGNscykgewogICAgICBnZXRDbGFzc1NldChjbHMpLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9LCBDbGFzc0hpZXJhcmNoeU5vZGUuQUxMKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW5zdGFudGlhdGVkKENsYXNzRW50aXR5IGNscykgewogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUgPSBfY2xhc3NIaWVyYXJjaHlOb2Rlc1tjbHNdOwogICAgcmV0dXJuIG5vZGUgIT0gbnVsbCAmJiBub2RlLmlzSW5zdGFudGlhdGVkOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0RpcmVjdGx5SW5zdGFudGlhdGVkKENsYXNzRW50aXR5IGNscykgewogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUgPSBfY2xhc3NIaWVyYXJjaHlOb2Rlc1tjbHNdOwogICAgcmV0dXJuIG5vZGUgIT0gbnVsbCAmJiBub2RlLmlzRGlyZWN0bHlJbnN0YW50aWF0ZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzQWJzdHJhY3RseUluc3RhbnRpYXRlZChDbGFzc0VudGl0eSBjbHMpIHsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlID0gX2NsYXNzSGllcmFyY2h5Tm9kZXNbY2xzXTsKICAgIHJldHVybiBub2RlICE9IG51bGwgJiYgbm9kZS5pc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRXhwbGljaXRseUluc3RhbnRpYXRlZChDbGFzc0VudGl0eSBjbHMpIHsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlID0gX2NsYXNzSGllcmFyY2h5Tm9kZXNbY2xzXTsKICAgIHJldHVybiBub2RlICE9IG51bGwgJiYgbm9kZS5pc0V4cGxpY2l0bHlJbnN0YW50aWF0ZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW5kaXJlY3RseUluc3RhbnRpYXRlZChDbGFzc0VudGl0eSBjbHMpIHsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlID0gX2NsYXNzSGllcmFyY2h5Tm9kZXNbY2xzXTsKICAgIHJldHVybiBub2RlICE9IG51bGwgJiYgbm9kZS5pc0luZGlyZWN0bHlJbnN0YW50aWF0ZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU3VidHlwZU9mKENsYXNzRW50aXR5IHgsIENsYXNzRW50aXR5IHkpIHsKICAgIENsYXNzU2V0IGNsYXNzU2V0ID0gX2NsYXNzU2V0c1t5XTsKICAgIGFzc2VydCgKICAgICAgICBjbGFzc1NldCAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICB5LAogICAgICAgICAgICAiTm8gQ2xhc3NTZXQgZm9yICR5ICgke3kucnVudGltZVR5cGV9KTogIgogICAgICAgICAgICAiJHtkdW1wKHkpfSA6ICR7X2NsYXNzU2V0c30iKSk7CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgY2xhc3NIaWVyYXJjaHlOb2RlID0gX2NsYXNzSGllcmFyY2h5Tm9kZXNbeF07CiAgICBhc3NlcnQoY2xhc3NIaWVyYXJjaHlOb2RlICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoeCwgIk5vIENsYXNzSGllcmFyY2h5Tm9kZSBmb3IgJHg6ICR7ZHVtcCh4KX0iKSk7CiAgICByZXR1cm4gY2xhc3NTZXQuaGFzU3VidHlwZShjbGFzc0hpZXJhcmNoeU5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1N1YmNsYXNzT2YoQ2xhc3NFbnRpdHkgeCwgQ2xhc3NFbnRpdHkgeSkgewogICAgcmV0dXJuIF9jbGFzc0hpZXJhcmNoeU5vZGVzW3ldLmhhc1N1YmNsYXNzKF9jbGFzc0hpZXJhcmNoeU5vZGVzW3hdKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBzdWJjbGFzc2VzT2YoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgaGllcmFyY2h5ID0gX2NsYXNzSGllcmFyY2h5Tm9kZXNbY2xzXTsKICAgIGlmIChoaWVyYXJjaHkgPT0gbnVsbCkgcmV0dXJuIGNvbnN0IDxDbGFzc0VudGl0eT5bXTsKICAgIHJldHVybiBoaWVyYXJjaHkKICAgICAgICAuc3ViY2xhc3Nlc0J5TWFzayhDbGFzc0hpZXJhcmNoeU5vZGUuRVhQTElDSVRMWV9JTlNUQU5USUFURUQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHN0cmljdFN1YmNsYXNzZXNPZihDbGFzc0VudGl0eSBjbHMpIHsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBzdWJjbGFzc2VzID0gX2NsYXNzSGllcmFyY2h5Tm9kZXNbY2xzXTsKICAgIGlmIChzdWJjbGFzc2VzID09IG51bGwpIHJldHVybiBjb25zdCA8Q2xhc3NFbnRpdHk+W107CiAgICByZXR1cm4gc3ViY2xhc3Nlcy5zdWJjbGFzc2VzQnlNYXNrKAogICAgICAgIENsYXNzSGllcmFyY2h5Tm9kZS5FWFBMSUNJVExZX0lOU1RBTlRJQVRFRCwKICAgICAgICBzdHJpY3Q6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHN0cmljdFN1YmNsYXNzQ291bnQoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgc3ViY2xhc3NlcyA9IF9jbGFzc0hpZXJhcmNoeU5vZGVzW2Nsc107CiAgICBpZiAoc3ViY2xhc3NlcyA9PSBudWxsKSByZXR1cm4gMDsKICAgIHJldHVybiBzdWJjbGFzc2VzLmluc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hTdHJpY3RTdWJjbGFzc09mKAogICAgICBDbGFzc0VudGl0eSBjbHMsIEl0ZXJhdGlvblN0ZXAgZihDbGFzc0VudGl0eSBjbHMpKSB7CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgc3ViY2xhc3NlcyA9IF9jbGFzc0hpZXJhcmNoeU5vZGVzW2Nsc107CiAgICBpZiAoc3ViY2xhc3NlcyA9PSBudWxsKSByZXR1cm47CiAgICBzdWJjbGFzc2VzLmZvckVhY2hTdWJjbGFzcyhmLCBDbGFzc0hpZXJhcmNoeU5vZGUuRVhQTElDSVRMWV9JTlNUQU5USUFURUQsCiAgICAgICAgc3RyaWN0OiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgYW55U3RyaWN0U3ViY2xhc3NPZihDbGFzc0VudGl0eSBjbHMsIGJvb2wgcHJlZGljYXRlKENsYXNzRW50aXR5IGNscykpIHsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBzdWJjbGFzc2VzID0gX2NsYXNzSGllcmFyY2h5Tm9kZXNbY2xzXTsKICAgIGlmIChzdWJjbGFzc2VzID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBzdWJjbGFzc2VzLmFueVN1YmNsYXNzKAogICAgICAgIHByZWRpY2F0ZSwgQ2xhc3NIaWVyYXJjaHlOb2RlLkVYUExJQ0lUTFlfSU5TVEFOVElBVEVELAogICAgICAgIHN0cmljdDogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gc3VidHlwZXNPZihDbGFzc0VudGl0eSBjbHMpIHsKICAgIENsYXNzU2V0IGNsYXNzU2V0ID0gX2NsYXNzU2V0c1tjbHNdOwogICAgaWYgKGNsYXNzU2V0ID09IG51bGwpIHsKICAgICAgcmV0dXJuIGNvbnN0IDxDbGFzc0VudGl0eT5bXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBjbGFzc1NldAogICAgICAgICAgLnN1YnR5cGVzQnlNYXNrKENsYXNzSGllcmFyY2h5Tm9kZS5FWFBMSUNJVExZX0lOU1RBTlRJQVRFRCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gc3RyaWN0U3VidHlwZXNPZihDbGFzc0VudGl0eSBjbHMpIHsKICAgIENsYXNzU2V0IGNsYXNzU2V0ID0gX2NsYXNzU2V0c1tjbHNdOwogICAgaWYgKGNsYXNzU2V0ID09IG51bGwpIHsKICAgICAgcmV0dXJuIGNvbnN0IDxDbGFzc0VudGl0eT5bXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBjbGFzc1NldC5zdWJ0eXBlc0J5TWFzayhDbGFzc0hpZXJhcmNoeU5vZGUuRVhQTElDSVRMWV9JTlNUQU5USUFURUQsCiAgICAgICAgICBzdHJpY3Q6IHRydWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHN0cmljdFN1YnR5cGVDb3VudChDbGFzc0VudGl0eSBjbHMpIHsKICAgIENsYXNzU2V0IGNsYXNzU2V0ID0gX2NsYXNzU2V0c1tjbHNdOwogICAgaWYgKGNsYXNzU2V0ID09IG51bGwpIHJldHVybiAwOwogICAgcmV0dXJuIGNsYXNzU2V0Lmluc3RhbnRpYXRlZFN1YnR5cGVDb3VudDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFN0cmljdFN1YnR5cGVPZigKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCBJdGVyYXRpb25TdGVwIGYoQ2xhc3NFbnRpdHkgY2xzKSkgewogICAgQ2xhc3NTZXQgY2xhc3NTZXQgPSBfY2xhc3NTZXRzW2Nsc107CiAgICBpZiAoY2xhc3NTZXQgPT0gbnVsbCkgcmV0dXJuOwogICAgY2xhc3NTZXQuZm9yRWFjaFN1YnR5cGUoZiwgQ2xhc3NIaWVyYXJjaHlOb2RlLkVYUExJQ0lUTFlfSU5TVEFOVElBVEVELAogICAgICAgIHN0cmljdDogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGFueVN0cmljdFN1YnR5cGVPZihDbGFzc0VudGl0eSBjbHMsIGJvb2wgcHJlZGljYXRlKENsYXNzRW50aXR5IGNscykpIHsKICAgIENsYXNzU2V0IGNsYXNzU2V0ID0gX2NsYXNzU2V0c1tjbHNdOwogICAgaWYgKGNsYXNzU2V0ID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBjbGFzc1NldC5hbnlTdWJ0eXBlKAogICAgICAgIHByZWRpY2F0ZSwgQ2xhc3NIaWVyYXJjaHlOb2RlLkVYUExJQ0lUTFlfSU5TVEFOVElBVEVELAogICAgICAgIHN0cmljdDogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhdmVBbnlDb21tb25TdWJ0eXBlcyhDbGFzc0VudGl0eSBhLCBDbGFzc0VudGl0eSBiKSB7CiAgICBDbGFzc1NldCBjbGFzc1NldEEgPSBfY2xhc3NTZXRzW2FdOwogICAgQ2xhc3NTZXQgY2xhc3NTZXRCID0gX2NsYXNzU2V0c1tiXTsKICAgIGlmIChjbGFzc1NldEEgPT0gbnVsbCB8fCBjbGFzc1NldEIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW1wbGVtZW50IGFuIG9wdGltaXplZCBxdWVyeSBvbiBbQ2xhc3NTZXRdLgogICAgU2V0PENsYXNzRW50aXR5PiBzdWJ0eXBlc09mQiA9IGNsYXNzU2V0Qi5zdWJ0eXBlcygpLnRvU2V0KCk7CiAgICBmb3IgKENsYXNzRW50aXR5IHN1YnR5cGVPZkEgaW4gY2xhc3NTZXRBLnN1YnR5cGVzKCkpIHsKICAgICAgaWYgKHN1YnR5cGVzT2ZCLmNvbnRhaW5zKHN1YnR5cGVPZkEpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzQW55U3RyaWN0U3ViY2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgc3ViY2xhc3NlcyA9IF9jbGFzc0hpZXJhcmNoeU5vZGVzW2Nsc107CiAgICBpZiAoc3ViY2xhc3NlcyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gc3ViY2xhc3Nlcy5pc0luZGlyZWN0bHlJbnN0YW50aWF0ZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc0FueVN0cmljdFN1YnR5cGUoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gc3RyaWN0U3VidHlwZUNvdW50KGNscykgPiAwOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNPbmx5U3ViY2xhc3NlcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IG1vdmUgdGhpcyB0byBDbGFzc1NldD8KICAgIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSByZXR1cm4gdHJ1ZTsKICAgIENsYXNzU2V0IGNsYXNzU2V0ID0gX2NsYXNzU2V0c1tjbHNdOwogICAgaWYgKGNsYXNzU2V0ID09IG51bGwpIHsKICAgICAgLy8gVmFjdW91c2x5IHRydWUuCiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGNsYXNzU2V0Lmhhc09ubHlJbnN0YW50aWF0ZWRTdWJjbGFzc2VzOwogIH0KCiAgQG92ZXJyaWRlCiAgU3ViY2xhc3NSZXN1bHQgY29tbW9uU3ViY2xhc3NlcyhDbGFzc0VudGl0eSBjbHMxLCBDbGFzc1F1ZXJ5IHF1ZXJ5MSwKICAgICAgQ2xhc3NFbnRpdHkgY2xzMiwgQ2xhc3NRdWVyeSBxdWVyeTIpIHsKICAgIGlmIChxdWVyeTEgPT0gQ2xhc3NRdWVyeS5FWEFDVCAmJiBxdWVyeTIgPT0gQ2xhc3NRdWVyeS5FWEFDVCkgewogICAgICAvLyBFeGFjdCBjbGFzc2VzIFtjbHMxXSBhbmQgW2NsczJdIG11c3QgYmUgaWRlbnRpY2FsIHRvIGhhdmUgYW55IGNsYXNzZXMKICAgICAgLy8gaW4gY29tbW9uLgogICAgICBpZiAoY2xzMSAhPSBjbHMyKSB7CiAgICAgICAgcmV0dXJuIFN1YmNsYXNzUmVzdWx0LkVNUFRZOwogICAgICB9CiAgICAgIHJldHVybiBTdWJjbGFzc1Jlc3VsdC5FWEFDVDE7CiAgICB9IGVsc2UgaWYgKHF1ZXJ5MSA9PSBDbGFzc1F1ZXJ5LkVYQUNUKSB7CiAgICAgIGlmIChxdWVyeTIgPT0gQ2xhc3NRdWVyeS5TVUJDTEFTUykgewogICAgICAgIC8vIEV4YWN0IFtjbHMxXSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgW2NsczJdIHRvIGhhdmUgYW55IGNsYXNzZXMgaW4KICAgICAgICAvLyBjb21tb24uCiAgICAgICAgaWYgKGlzU3ViY2xhc3NPZihjbHMxLCBjbHMyKSkgewogICAgICAgICAgcmV0dXJuIFN1YmNsYXNzUmVzdWx0LkVYQUNUMTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocXVlcnkyID09IENsYXNzUXVlcnkuU1VCVFlQRSkgewogICAgICAgIC8vIEV4YWN0IFtjbHMxXSBtdXN0IGJlIGEgc3VidHlwZSBvZiBbY2xzMl0gdG8gaGF2ZSBhbnkgY2xhc3NlcyBpbgogICAgICAgIC8vIGNvbW1vbi4KICAgICAgICBpZiAoaXNTdWJ0eXBlT2YoY2xzMSwgY2xzMikpIHsKICAgICAgICAgIHJldHVybiBTdWJjbGFzc1Jlc3VsdC5FWEFDVDE7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBTdWJjbGFzc1Jlc3VsdC5FTVBUWTsKICAgIH0gZWxzZSBpZiAocXVlcnkyID09IENsYXNzUXVlcnkuRVhBQ1QpIHsKICAgICAgaWYgKHF1ZXJ5MSA9PSBDbGFzc1F1ZXJ5LlNVQkNMQVNTKSB7CiAgICAgICAgLy8gRXhhY3QgW2NsczJdIG11c3QgYmUgYSBzdWJjbGFzcyBvZiBbY2xzMV0gdG8gaGF2ZSBhbnkgY2xhc3NlcyBpbgogICAgICAgIC8vIGNvbW1vbi4KICAgICAgICBpZiAoaXNTdWJjbGFzc09mKGNsczIsIGNsczEpKSB7CiAgICAgICAgICByZXR1cm4gU3ViY2xhc3NSZXN1bHQuRVhBQ1QyOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChxdWVyeTEgPT0gQ2xhc3NRdWVyeS5TVUJUWVBFKSB7CiAgICAgICAgLy8gRXhhY3QgW2NsczJdIG11c3QgYmUgYSBzdWJ0eXBlIG9mIFtjbHMxXSB0byBoYXZlIGFueSBjbGFzc2VzIGluCiAgICAgICAgLy8gY29tbW9uLgogICAgICAgIGlmIChpc1N1YnR5cGVPZihjbHMyLCBjbHMxKSkgewogICAgICAgICAgcmV0dXJuIFN1YmNsYXNzUmVzdWx0LkVYQUNUMjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIFN1YmNsYXNzUmVzdWx0LkVNUFRZOwogICAgfSBlbHNlIGlmIChxdWVyeTEgPT0gQ2xhc3NRdWVyeS5TVUJDTEFTUyAmJiBxdWVyeTIgPT0gQ2xhc3NRdWVyeS5TVUJDTEFTUykgewogICAgICAvLyBbY2xzMV0gbXVzdCBiZSBhIHN1YmNsYXNzIG9mIFtjbHMyXSBvciB2aWNlIHZlcnNhIHRvIGhhdmUgYW55IGNsYXNzZXMKICAgICAgLy8gaW4gY29tbW9uLgogICAgICBpZiAoY2xzMSA9PSBjbHMyIHx8IGlzU3ViY2xhc3NPZihjbHMxLCBjbHMyKSkgewogICAgICAgIC8vIFRoZSBzdWJjbGFzc2VzIG9mIFtjbHMxXSBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGUgc3ViY2xhc3NlcyBvZgogICAgICAgIC8vIFtjbHMyXS4KICAgICAgICByZXR1cm4gU3ViY2xhc3NSZXN1bHQuU1VCQ0xBU1MxOwogICAgICB9IGVsc2UgaWYgKGlzU3ViY2xhc3NPZihjbHMyLCBjbHMxKSkgewogICAgICAgIC8vIFRoZSBzdWJjbGFzc2VzIG9mIFtjbHMyXSBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGUgc3ViY2xhc3NlcyBvZgogICAgICAgIC8vIFtjbHMxXS4KICAgICAgICByZXR1cm4gU3ViY2xhc3NSZXN1bHQuU1VCQ0xBU1MyOwogICAgICB9CiAgICAgIHJldHVybiBTdWJjbGFzc1Jlc3VsdC5FTVBUWTsKICAgIH0gZWxzZSBpZiAocXVlcnkxID09IENsYXNzUXVlcnkuU1VCQ0xBU1MpIHsKICAgICAgaWYgKGlzU3VidHlwZU9mKGNsczEsIGNsczIpKSB7CiAgICAgICAgLy8gVGhlIHN1YmNsYXNzZXMgb2YgW2NsczFdIGFyZSBhbGwgc3VidHlwZXMgb2YgW2NsczJdLgogICAgICAgIHJldHVybiBTdWJjbGFzc1Jlc3VsdC5TVUJDTEFTUzE7CiAgICAgIH0KICAgICAgaWYgKGNsczEgPT0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSB7CiAgICAgICAgLy8gU2luY2UgW2NsczFdIGlzIGBPYmplY3RgIGFsbCBzdWJ0eXBlcyBvZiBbY2xzMl0gYXJlIGNvbnRhaW5lZCB3aXRoaW4KICAgICAgICAvLyB0aGUgc3ViY2xhc3NlcyBvZiBbY2xzMV0uCiAgICAgICAgcmV0dXJuIFN1YmNsYXNzUmVzdWx0LlNVQlRZUEUyOwogICAgICB9CiAgICAgIC8vIEZpbmQgYWxsIHRoZSByb290IHN1YmNsYXNzZXMgb2YgW2NsczFdIG9mIHRoYXQgaW1wbGVtZW50IFtjbHMyXS4KICAgICAgLy8KICAgICAgLy8gRm9yIHRoaXMgaGllcmFyY2h5OgogICAgICAvLwogICAgICAvLyAgICAgY2xhc3MgSSB7fQogICAgICAvLyAgICAgY2xhc3MgQSB7fQogICAgICAvLyAgICAgY2xhc3MgQiBleHRlbmRzIEEgaW1wbGVtZW50cyBJIHt9CiAgICAgIC8vICAgICBjbGFzcyBDIGV4dGVuZHMgQiB7fQogICAgICAvLyAgICAgY2xhc3MgRCBleHRlbmRzIEEgaW1wbGVtZW50cyBJIHt9CiAgICAgIC8vCiAgICAgIC8vIHRoZSBjb21tb24gc3ViY2xhc3NlcyBvZiAic3ViY2xhc3Mgb2YgQSIgYW5kICJzdWJ0eXBlIG9mIEkiIHJldHVybnMKICAgICAgLy8gInN1YmNsYXNzZXMgb2Yge0IsIER9Ii4gVGhlIGluY2x1c2lvbiBvZiBjbGFzcyBgQ2AgaXMgaW1wbGllZCBiZWNhdXNlCiAgICAgIC8vIGl0IGlzIGEgc3ViY2xhc3Mgb2YgYEJgLgogICAgICBMaXN0PENsYXNzRW50aXR5PiBjbGFzc2VzID0gPENsYXNzRW50aXR5PltdOwogICAgICBmb3JFYWNoU3RyaWN0U3ViY2xhc3NPZihjbHMxLCAoQ2xhc3NFbnRpdHkgc3ViY2xhc3MpIHsKICAgICAgICBpZiAoaXNTdWJ0eXBlT2Yoc3ViY2xhc3MsIGNsczIpKSB7CiAgICAgICAgICBjbGFzc2VzLmFkZChzdWJjbGFzcyk7CiAgICAgICAgICAvLyBTa2lwIHN1YmNsYXNzZXMgb2YgW3N1YmNsYXNzXTsgdGhleSBhbGwgaW1wbGVtZW50IFtjbHMyXSBieQogICAgICAgICAgLy8gaW5oZXJpdGFuY2UgYW5kIGFyZSBpbmNsdWRlZCBpbiB0aGUgc3ViY2xhc3NlcyBvZiBbc3ViY2xhc3NdLgogICAgICAgICAgcmV0dXJuIEl0ZXJhdGlvblN0ZXAuU0tJUF9TVUJDTEFTU0VTOwogICAgICAgIH0KICAgICAgICByZXR1cm4gSXRlcmF0aW9uU3RlcC5DT05USU5VRTsKICAgICAgfSk7CiAgICAgIHJldHVybiBuZXcgU3ViY2xhc3NSZXN1bHQoY2xhc3Nlcyk7CiAgICB9IGVsc2UgaWYgKHF1ZXJ5MiA9PSBDbGFzc1F1ZXJ5LlNVQkNMQVNTKSB7CiAgICAgIGlmIChpc1N1YnR5cGVPZihjbHMyLCBjbHMxKSkgewogICAgICAgIC8vIFRoZSBzdWJjbGFzc2VzIG9mIFtjbHMyXSBhcmUgYWxsIHN1YnR5cGVzIG9mIFtjbHMxXS4KICAgICAgICByZXR1cm4gU3ViY2xhc3NSZXN1bHQuU1VCQ0xBU1MyOwogICAgICB9CiAgICAgIGlmIChjbHMyID09IF9jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcykgewogICAgICAgIC8vIFNpbmNlIFtjbHMyXSBpcyBgT2JqZWN0YCBhbGwgc3VidHlwZXMgb2YgW2NsczFdIGFyZSBjb250YWluZWQgd2l0aGluCiAgICAgICAgLy8gdGhlIHN1YmNsYXNzZXMgb2YgW2NsczJdLgogICAgICAgIHJldHVybiBTdWJjbGFzc1Jlc3VsdC5TVUJUWVBFMTsKICAgICAgfQogICAgICAvLyBGaW5kIGFsbCB0aGUgcm9vdCBzdWJjbGFzc2VzIG9mIFtjbHMyXSBvZiB0aGF0IGltcGxlbWVudCBbY2xzMV0uCiAgICAgIExpc3Q8Q2xhc3NFbnRpdHk+IGNsYXNzZXMgPSA8Q2xhc3NFbnRpdHk+W107CiAgICAgIGZvckVhY2hTdHJpY3RTdWJjbGFzc09mKGNsczIsIChDbGFzc0VudGl0eSBzdWJjbGFzcykgewogICAgICAgIGlmIChpc1N1YnR5cGVPZihzdWJjbGFzcywgY2xzMSkpIHsKICAgICAgICAgIGNsYXNzZXMuYWRkKHN1YmNsYXNzKTsKICAgICAgICAgIC8vIFNraXAgc3ViY2xhc3NlcyBvZiBbc3ViY2xhc3NdOyB0aGV5IGFsbCBpbXBsZW1lbnQgW2NsczFdIGJ5CiAgICAgICAgICAvLyBpbmhlcml0YW5jZSBhbmQgYXJlIGluY2x1ZGVkIGluIHRoZSBzdWJjbGFzc2VzIG9mIFtzdWJjbGFzc10uCiAgICAgICAgICByZXR1cm4gSXRlcmF0aW9uU3RlcC5TS0lQX1NVQkNMQVNTRVM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBJdGVyYXRpb25TdGVwLkNPTlRJTlVFOwogICAgICB9KTsKICAgICAgcmV0dXJuIG5ldyBTdWJjbGFzc1Jlc3VsdChjbGFzc2VzKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChjbHMxID09IGNsczIgfHwgaXNTdWJ0eXBlT2YoY2xzMSwgY2xzMikpIHsKICAgICAgICAvLyBUaGUgc3VidHlwZXMgb2YgW2NsczFdIGFyZSBjb250YWluZWQgd2l0aGluIHRoZSBzdWJ0eXBlcyBvZiBbY2xzMl0uCiAgICAgICAgcmV0dXJuIFN1YmNsYXNzUmVzdWx0LlNVQlRZUEUxOwogICAgICB9IGVsc2UgaWYgKGlzU3VidHlwZU9mKGNsczIsIGNsczEpKSB7CiAgICAgICAgLy8gVGhlIHN1YnR5cGVzIG9mIFtjbHMyXSBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGUgc3VidHlwZXMgb2YgW2NsczFdLgogICAgICAgIHJldHVybiBTdWJjbGFzc1Jlc3VsdC5TVUJUWVBFMjsKICAgICAgfQogICAgICAvLyBGaW5kIGFsbCB0aGUgcm9vdCBzdWJjbGFzc2VzIG9mIFtjbHMxXSBvZiB0aGF0IGltcGxlbWVudCBbY2xzMl0uCiAgICAgIC8vCiAgICAgIC8vIEZvciB0aGlzIGhpZXJhcmNoeToKICAgICAgLy8KICAgICAgLy8gICAgIGNsYXNzIEkge30KICAgICAgLy8gICAgIGNsYXNzIEEge30KICAgICAgLy8gICAgIGNsYXNzIEIgZXh0ZW5kcyBBIGltcGxlbWVudHMgSSB7fQogICAgICAvLyAgICAgY2xhc3MgQyBleHRlbmRzIEIge30KICAgICAgLy8gICAgIGNsYXNzIEQgZXh0ZW5kcyBBIGltcGxlbWVudHMgSSB7fQogICAgICAvLyAgICAgY2xhc3MgRSBpbXBsZW1lbnRzIEIge30KICAgICAgLy8gICAgIGNsYXNzIEYgZXh0ZW5kcyBFIHt9CiAgICAgIC8vCiAgICAgIC8vIHRoZSBjb21tb24gc3ViY2xhc3NlcyBvZiAic3VidHlwZSBvZiBBIiBhbmQgInN1YnR5cGUgb2YgSSIgcmV0dXJucwogICAgICAvLyAic3ViY2xhc3NlcyBvZiB7QiwgRCwgRX0iLiBUaGUgaW5jbHVzaW9uIG9mIGNsYXNzZXMgYENgIGFuZCBgRmAgaXMKICAgICAgLy8gaW1wbGllZCBiZWNhdXNlIHRoZXkgYXJlIHN1YmNsYXNzZXMgb2YgYEJgIGFuZCBgRWAsIHJlc3BlY3RpdmVseS4KICAgICAgTGlzdDxDbGFzc0VudGl0eT4gY2xhc3NlcyA9IDxDbGFzc0VudGl0eT5bXTsKICAgICAgZm9yRWFjaFN0cmljdFN1YnR5cGVPZihjbHMxLCAoQ2xhc3NFbnRpdHkgc3ViY2xhc3MpIHsKICAgICAgICBpZiAoaXNTdWJ0eXBlT2Yoc3ViY2xhc3MsIGNsczIpKSB7CiAgICAgICAgICBjbGFzc2VzLmFkZChzdWJjbGFzcyk7CiAgICAgICAgICAvLyBTa2lwIHN1YmNsYXNzZXMgb2YgW3N1YmNsYXNzXTsgdGhleSBhbGwgaW1wbGVtZW50IFtjbHMyXSBieQogICAgICAgICAgLy8gaW5oZXJpdGFuY2UgYW5kIGFyZSBpbmNsdWRlZCBpbiB0aGUgc3ViY2xhc3NlcyBvZiBbc3ViY2xhc3NdLgogICAgICAgICAgcmV0dXJuIEl0ZXJhdGlvblN0ZXAuU0tJUF9TVUJDTEFTU0VTOwogICAgICAgIH0KICAgICAgICByZXR1cm4gSXRlcmF0aW9uU3RlcC5DT05USU5VRTsKICAgICAgfSk7CiAgICAgIHJldHVybiBuZXcgU3ViY2xhc3NSZXN1bHQoY2xhc3Nlcyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0hpZXJhcmNoeU5vZGUgZ2V0Q2xhc3NIaWVyYXJjaHlOb2RlKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIF9jbGFzc0hpZXJhcmNoeU5vZGVzW2Nsc107CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc1NldCBnZXRDbGFzc1NldChDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBfY2xhc3NTZXRzW2Nsc107CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZHVtcChbQ2xhc3NFbnRpdHkgY2xzXSkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgaWYgKGNscyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCJDbGFzc2VzIGluIHRoZSBjbG9zZWQgd29ybGQgcmVsYXRlZCB0byAkY2xzOlxuIik7CiAgICB9IGVsc2UgewogICAgICBzYi53cml0ZSgiSW5zdGFudGlhdGVkIGNsYXNzZXMgaW4gdGhlIGNsb3NlZCB3b3JsZDpcbiIpOwogICAgfQogICAgZ2V0Q2xhc3NIaWVyYXJjaHlOb2RlKF9jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcykKICAgICAgICAucHJpbnRPbihzYiwgJyAnLCBpbnN0YW50aWF0ZWRPbmx5OiBjbHMgPT0gbnVsbCwgd2l0aFJlc3BlY3RUbzogY2xzKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIHsKICAvLyBXZSBrZWVwIHRyYWNrIG9mIHN1YnR5cGUgYW5kIHN1YmNsYXNzIHJlbGF0aW9uc2hpcHMgaW4gZm91cgogIC8vIGRpc3RpbmN0IHNldHMgdG8gbWFrZSBjbGFzcyBoaWVyYXJjaHkgYW5hbHlzaXMgZmFzdGVyLgogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NIaWVyYXJjaHlOb2RlPiBfY2xhc3NIaWVyYXJjaHlOb2RlcyA9CiAgICAgIDxDbGFzc0VudGl0eSwgQ2xhc3NIaWVyYXJjaHlOb2RlPnt9OwogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NTZXQ+IF9jbGFzc1NldHMgPSA8Q2xhc3NFbnRpdHksIENsYXNzU2V0Pnt9OwogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4gbWl4aW5Vc2VzID0KICAgICAgbmV3IE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4oKTsKCiAgZmluYWwgQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwogIGZpbmFsIENsYXNzUXVlcmllcyBfY2xhc3NRdWVyaWVzOwoKICBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIodGhpcy5fY29tbW9uRWxlbWVudHMsIHRoaXMuX2NsYXNzUXVlcmllcyk7CgogIENsYXNzSGllcmFyY2h5IGNsb3NlKCkgewogICAgYXNzZXJ0KAogICAgICAgIF9jbGFzc0hpZXJhcmNoeU5vZGVzLmxlbmd0aCA9PSBfY2xhc3NTZXRzLmxlbmd0aCwKICAgICAgICAiQ2xhc3NIaWVyYXJjaHlOb2RlL0NsYXNzU2V0IG1pc21hdGNoOiAiCiAgICAgICAgIiR7X2NsYXNzSGllcmFyY2h5Tm9kZXN9IHZzICIKICAgICAgICAiJHtfY2xhc3NTZXRzfSIpOwogICAgcmV0dXJuIG5ldyBDbGFzc0hpZXJhcmNoeUltcGwoCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLCBfY2xhc3NIaWVyYXJjaHlOb2RlcywgX2NsYXNzU2V0cyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBfZW5zdXJlQ2xhc3NTZXQoX2NsYXNzUXVlcmllcy5nZXREZWNsYXJhdGlvbihjbHMpKTsKICB9CgogIENsYXNzSGllcmFyY2h5Tm9kZSBfZW5zdXJlQ2xhc3NIaWVyYXJjaHlOb2RlKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIF9jbGFzc0hpZXJhcmNoeU5vZGVzLnB1dElmQWJzZW50KGNscywgKCkgewogICAgICBDbGFzc0hpZXJhcmNoeU5vZGUgcGFyZW50Tm9kZTsKICAgICAgQ2xhc3NFbnRpdHkgc3VwZXJjbGFzcyA9IF9jbGFzc1F1ZXJpZXMuZ2V0U3VwZXJDbGFzcyhjbHMpOwogICAgICBpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7CiAgICAgICAgcGFyZW50Tm9kZSA9IF9lbnN1cmVDbGFzc0hpZXJhcmNoeU5vZGUoc3VwZXJjbGFzcyk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBDbGFzc0hpZXJhcmNoeU5vZGUoCiAgICAgICAgICBwYXJlbnROb2RlLCBjbHMsIF9jbGFzc1F1ZXJpZXMuZ2V0SGllcmFyY2h5RGVwdGgoY2xzKSk7CiAgICB9KTsKICB9CgogIENsYXNzU2V0IF9lbnN1cmVDbGFzc1NldChDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBfY2xhc3NTZXRzLnB1dElmQWJzZW50KGNscywgKCkgewogICAgICBDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSA9IF9lbnN1cmVDbGFzc0hpZXJhcmNoeU5vZGUoY2xzKTsKICAgICAgQ2xhc3NTZXQgY2xhc3NTZXQgPSBuZXcgQ2xhc3NTZXQobm9kZSk7CgogICAgICBmb3IgKEludGVyZmFjZVR5cGUgdHlwZSBpbiBfY2xhc3NRdWVyaWVzLmdldFN1cGVydHlwZXMoY2xzKSkgewogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE9wdGltaXphdGlvbjogQXZvaWQgYWRkaW5nIFtjbHNdIHRvCiAgICAgICAgLy8gc3VwZXJjbGFzc2VzLgogICAgICAgIENsYXNzU2V0IHN1YnR5cGVTZXQgPSBfZW5zdXJlQ2xhc3NTZXQodHlwZS5lbGVtZW50KTsKICAgICAgICBzdWJ0eXBlU2V0LmFkZFN1YnR5cGUobm9kZSk7CiAgICAgIH0KCiAgICAgIENsYXNzRW50aXR5IGFwcGxpZWRNaXhpbiA9IF9jbGFzc1F1ZXJpZXMuZ2V0QXBwbGllZE1peGluKGNscyk7CiAgICAgIHdoaWxlIChhcHBsaWVkTWl4aW4gIT0gbnVsbCkgewogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSB0aGUgZGF0YSBzdG9yZWQgaW4gW0NsYXNzU2V0XS4KICAgICAgICByZWdpc3Rlck1peGluVXNlKGNscywgYXBwbGllZE1peGluKTsKICAgICAgICBDbGFzc1NldCBtaXhpblNldCA9IF9lbnN1cmVDbGFzc1NldChhcHBsaWVkTWl4aW4pOwogICAgICAgIG1peGluU2V0LmFkZE1peGluQXBwbGljYXRpb24obm9kZSk7CgogICAgICAgIC8vIEluIGNhc2Ugb2YKICAgICAgICAvLwogICAgICAgIC8vICAgIGNsYXNzIEEge30KICAgICAgICAvLyAgICBjbGFzcyBCID0gT2JqZWN0IHdpdGggQTsKICAgICAgICAvLyAgICBjbGFzcyBDID0gT2JqZWN0IHdpdGggQjsKICAgICAgICAvLwogICAgICAgIC8vIHdlIG5lZWQgdG8gcmVnaXN0ZXIgdGhhdCBDIG5vdCBvbmx5IG1peGVzIGluIEIgYnV0IGFsc28gQS4KICAgICAgICBhcHBsaWVkTWl4aW4gPSBfY2xhc3NRdWVyaWVzLmdldEFwcGxpZWRNaXhpbihhcHBsaWVkTWl4aW4pOwogICAgICB9CiAgICAgIHJldHVybiBjbGFzc1NldDsKICAgIH0pOwogIH0KCiAgdm9pZCBfdXBkYXRlU3VwZXJDbGFzc0hpZXJhcmNoeU5vZGVGb3JDbGFzcyhDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSkgewogICAgLy8gRW5zdXJlIHRoYXQgY2xhc3NlcyBpbXBsaWNpdGx5IGltcGxlbWVudGluZyBgRnVuY3Rpb25gIGFyZSBpbiBpdHMKICAgIC8vIHN1YnR5cGUgc2V0LgogICAgQ2xhc3NFbnRpdHkgY2xzID0gbm9kZS5jbHM7CiAgICBpZiAoY2xzICE9IF9jb21tb25FbGVtZW50cy5mdW5jdGlvbkNsYXNzICYmCiAgICAgICAgX2NsYXNzUXVlcmllcy5pbXBsZW1lbnRzRnVuY3Rpb24oY2xzKSkgewogICAgICBDbGFzc1NldCBzdWJ0eXBlU2V0ID0gX2Vuc3VyZUNsYXNzU2V0KF9jb21tb25FbGVtZW50cy5mdW5jdGlvbkNsYXNzKTsKICAgICAgc3VidHlwZVNldC5hZGRTdWJ0eXBlKG5vZGUpOwogICAgfQogICAgaWYgKCFub2RlLmlzSW5zdGFudGlhdGVkICYmIG5vZGUucGFyZW50Tm9kZSAhPSBudWxsKSB7CiAgICAgIF91cGRhdGVTdXBlckNsYXNzSGllcmFyY2h5Tm9kZUZvckNsYXNzKG5vZGUucGFyZW50Tm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHVwZGF0ZUNsYXNzSGllcmFyY2h5Tm9kZUZvckNsYXNzKENsYXNzRW50aXR5IGNscywKICAgICAge2Jvb2wgZGlyZWN0bHlJbnN0YW50aWF0ZWQ6IGZhbHNlLCBib29sIGFic3RyYWN0bHlJbnN0YW50aWF0ZWQ6IGZhbHNlfSkgewogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUgPSBfZW5zdXJlQ2xhc3NTZXQoY2xzKS5ub2RlOwogICAgX3VwZGF0ZVN1cGVyQ2xhc3NIaWVyYXJjaHlOb2RlRm9yQ2xhc3Mobm9kZSk7CiAgICBpZiAoZGlyZWN0bHlJbnN0YW50aWF0ZWQpIHsKICAgICAgbm9kZS5pc0RpcmVjdGx5SW5zdGFudGlhdGVkID0gdHJ1ZTsKICAgIH0KICAgIGlmIChhYnN0cmFjdGx5SW5zdGFudGlhdGVkKSB7CiAgICAgIG5vZGUuaXNBYnN0cmFjdGx5SW5zdGFudGlhdGVkID0gdHJ1ZTsKICAgIH0KICB9CgogIHZvaWQgcmVnaXN0ZXJNaXhpblVzZShDbGFzc0VudGl0eSBtaXhpbkFwcGxpY2F0aW9uLCBDbGFzc0VudGl0eSBtaXhpbikgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQWRkIG1hcCByZXN0cmljdGVkIHRvIGxpdmUgY2xhc3Nlcy4KICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcGF0Y2ggY2xhc3NlcyBhcyBtaXhpbi4KICAgIFNldDxDbGFzc0VudGl0eT4gdXNlcnMgPQogICAgICAgIG1peGluVXNlcy5wdXRJZkFic2VudChtaXhpbiwgKCkgPT4gbmV3IFNldDxDbGFzc0VudGl0eT4oKSk7CiAgICB1c2Vycy5hZGQobWl4aW5BcHBsaWNhdGlvbik7CiAgfQoKICBib29sIF9pc1N1YnR5cGVPZihDbGFzc0VudGl0eSB4LCBDbGFzc0VudGl0eSB5KSB7CiAgICBhc3NlcnQoX2NsYXNzU2V0cy5jb250YWluc0tleSh4KSwKICAgICAgICAiQ2xhc3NTZXQgZm9yICR4IGhhcyBub3QgYmVlbiBjb21wdXRlZCB5ZXQuIik7CiAgICBDbGFzc1NldCBjbGFzc1NldCA9IF9jbGFzc1NldHNbeV07CiAgICBhc3NlcnQoY2xhc3NTZXQgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdCh5LCAiTm8gQ2xhc3NTZXQgZm9yICR5ICgke3kucnVudGltZVR5cGV9KTogJHtfY2xhc3NTZXRzfSIpKTsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBjbGFzc0hpZXJhcmNoeU5vZGUgPSBfY2xhc3NIaWVyYXJjaHlOb2Rlc1t4XTsKICAgIGFzc2VydChjbGFzc0hpZXJhcmNoeU5vZGUgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdCh4LCAiTm8gQ2xhc3NIaWVyYXJjaHlOb2RlIGZvciAkeCIpKTsKICAgIHJldHVybiBjbGFzc1NldC5oYXNTdWJ0eXBlKGNsYXNzSGllcmFyY2h5Tm9kZSk7CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYSBkeW5hbWljIGFjY2VzcyBvbiBhbiBpbnN0YW5jZSBvZiBbZXhhY3RDbGFzc10gY2FuCiAgLy8vIHRhcmdldCBhIG1lbWJlciBkZWNsYXJlZCBpbiBbbWVtYmVySG9sZGluZ0NsYXNzXS4KICBib29sIGlzSW5oZXJpdGVkSW5FeGFjdENsYXNzKAogICAgICBDbGFzc0VudGl0eSBtZW1iZXJIb2xkaW5nQ2xhc3MsIENsYXNzRW50aXR5IGV4YWN0Q2xhc3MpIHsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBleGFjdENsYXNzTm9kZSA9IF9jbGFzc0hpZXJhcmNoeU5vZGVzW2V4YWN0Q2xhc3NdOwogICAgaWYgKCFleGFjdENsYXNzTm9kZS5pc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWQgJiYKICAgICAgICAhZXhhY3RDbGFzc05vZGUuaXNEaXJlY3RseUluc3RhbnRpYXRlZCkgewogICAgICAvLyBObyBpbnN0YW5jZXMgb2YgW3RoaXNDbGFzc10gYXJlIGxpdmUuCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIENsYXNzU2V0IG1lbWJlckhvbGRpbmdDbGFzc1NldCA9IF9jbGFzc1NldHNbbWVtYmVySG9sZGluZ0NsYXNzXTsKICAgIGlmIChtZW1iZXJIb2xkaW5nQ2xhc3NTZXQuaGFzU3ViY2xhc3MoZXhhY3RDbGFzc05vZGUpKSB7CiAgICAgIC8vLyBBIG1lbWJlciBmcm9tIGEgc3VwZXIgY2xhc3MgY2FuIGJlIGFjY2Vzc2VkLgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZvciAoQ2xhc3NIaWVyYXJjaHlOb2RlIG1peGluQXBwbGljYXRpb24KICAgICAgICBpbiBtZW1iZXJIb2xkaW5nQ2xhc3NTZXQubWl4aW5BcHBsaWNhdGlvbk5vZGVzKSB7CiAgICAgIGlmIChtaXhpbkFwcGxpY2F0aW9uLmhhc1N1YmNsYXNzKGV4YWN0Q2xhc3NOb2RlKSkgewogICAgICAgIC8vLyBBIG1lbWJlciBmcm9tIGEgbWl4ZWQgaW4gY2xhc3MgY2FuIGJlIGFjY2Vzc2VkLgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBNYXA8Q2xhc3NFbnRpdHksIF9Jbmhlcml0ZWRJblRoaXNDbGFzc0NhY2hlPiBfaW5oZXJpdGVkSW5UaGlzQ2xhc3NDYWNoZU1hcCA9CiAgICAgIHt9OwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYSBgdGhpc2AgZXhwcmVzc2lvbiBpbiBbdGhpc0NsYXNzXSBjYW4gdGFyZ2V0IGEgbWVtYmVyCiAgLy8vIGRlY2xhcmVkIGluIFttZW1iZXJIb2xkaW5nQ2xhc3NdLgogIGJvb2wgaXNJbmhlcml0ZWRJblRoaXNDbGFzcygKICAgICAgQ2xhc3NFbnRpdHkgbWVtYmVySG9sZGluZ0NsYXNzLCBDbGFzc0VudGl0eSB0aGlzQ2xhc3MpIHsKICAgIF9Jbmhlcml0ZWRJblRoaXNDbGFzc0NhY2hlIGNhY2hlID0KICAgICAgICBfaW5oZXJpdGVkSW5UaGlzQ2xhc3NDYWNoZU1hcFttZW1iZXJIb2xkaW5nQ2xhc3NdID8/PQogICAgICAgICAgICBuZXcgX0luaGVyaXRlZEluVGhpc0NsYXNzQ2FjaGUoKTsKICAgIHJldHVybiBjYWNoZS5pc0luaGVyaXRlZEluVGhpc0NsYXNzT2YodGhpcywgbWVtYmVySG9sZGluZ0NsYXNzLCB0aGlzQ2xhc3MpOwogIH0KCiAgTWFwPENsYXNzRW50aXR5LCBfSW5oZXJpdGVkSW5TdWJ0eXBlQ2FjaGU+IF9pbmhlcml0ZWRJblN1YnR5cGVDYWNoZU1hcCA9IHt9OwoKICBib29sIGlzSW5oZXJpdGVkSW5TdWJ0eXBlT2YoQ2xhc3NFbnRpdHkgeCwgQ2xhc3NFbnRpdHkgeSkgewogICAgX0luaGVyaXRlZEluU3VidHlwZUNhY2hlIGNhY2hlID0KICAgICAgICBfaW5oZXJpdGVkSW5TdWJ0eXBlQ2FjaGVNYXBbeF0gPz89IG5ldyBfSW5oZXJpdGVkSW5TdWJ0eXBlQ2FjaGUoKTsKICAgIHJldHVybiBjYWNoZS5pc0luaGVyaXRlZEluU3VidHlwZU9mKHRoaXMsIHgsIHkpOwogIH0KfQoKLy8vIENhY2hlIHVzZWQgZm9yIGNvbXB1dGluZyB3aGVuIGEgbWVtYmVyIG9mIGEgZ2l2ZW4gY2xhc3MsIHRoZSBzby1jYWxsZWQKLy8vIG1lbWJlciBob2xkaW5nIGNsYXNzLCBjYW4gYmUgaW5oZXJpdGVkIGludG8gYSBsaXZlIGNsYXNzLgpjbGFzcyBfSW5oZXJpdGVkSW5UaGlzQ2xhc3NDYWNoZSB7CiAgLy8vIFNldCBvZiBjbGFzc2VzIHRoYXQgaW5oZXJpdHMgbWVtYmVycyBmcm9tIHRoZSBtZW1iZXIgaG9sZGluZyBjbGFzcy4KICBTZXQ8Q2xhc3NFbnRpdHk+IF9pbmhlcml0aW5nQ2xhc3NlczsKCiAgLy8vIENhY2hlIGZvciBsaXZlbmVzcyBjb21wdXRhdGlvbiBmb3IgYSBgdGhpc2AgZXhwcmVzc2lvbnMgb2YgYSBnaXZlbiBjbGFzcy4KICBNYXA8Q2xhc3NFbnRpdHksIF9MaXZlU2V0PiBfbWFwOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgbWVtYmVycyBvZiBbbWVtYmVySG9sZGluZ0NsYXNzXSBjYW4gYmUgaW5oZXJpdGVkIGludG8KICAvLy8gYSBsaXZlIGNsYXNzIHRoYXQgY2FuIGJlIHRoZSB0YXJnZXQgb2YgYSBgdGhpc2AgZXhwcmVzc2lvbiBpbiBbdGhpc0NsYXNzXS4KICBib29sIGlzSW5oZXJpdGVkSW5UaGlzQ2xhc3NPZihDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgYnVpbGRlciwKICAgICAgQ2xhc3NFbnRpdHkgbWVtYmVySG9sZGluZ0NsYXNzLCBDbGFzc0VudGl0eSB0aGlzQ2xhc3MpIHsKICAgIF9MaXZlU2V0IHNldDsKICAgIGlmIChfbWFwID09IG51bGwpIHsKICAgICAgX21hcCA9IHt9OwogICAgfSBlbHNlIHsKICAgICAgc2V0ID0gX21hcFt0aGlzQ2xhc3NdOwogICAgfQogICAgaWYgKHNldCA9PSBudWxsKSB7CiAgICAgIHNldCA9IF9tYXBbdGhpc0NsYXNzXSA9IF9jb21wdXRlSW5oZXJpdGluZ0luVGhpc0NsYXNzU2V0KAogICAgICAgICAgYnVpbGRlciwgbWVtYmVySG9sZGluZ0NsYXNzLCB0aGlzQ2xhc3MpOwogICAgfQogICAgcmV0dXJuIHNldC5oYXNMaXZlQ2xhc3MoYnVpbGRlcik7CiAgfQoKICBfTGl2ZVNldCBfY29tcHV0ZUluaGVyaXRpbmdJblRoaXNDbGFzc1NldChDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgYnVpbGRlciwKICAgICAgQ2xhc3NFbnRpdHkgbWVtYmVySG9sZGluZ0NsYXNzLCBDbGFzc0VudGl0eSB0aGlzQ2xhc3MpIHsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBtZW1iZXJIb2xkaW5nQ2xhc3NOb2RlID0KICAgICAgICBidWlsZGVyLl9jbGFzc0hpZXJhcmNoeU5vZGVzW21lbWJlckhvbGRpbmdDbGFzc107CgogICAgaWYgKF9pbmhlcml0aW5nQ2xhc3NlcyA9PSBudWxsKSB7CiAgICAgIF9pbmhlcml0aW5nQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICAgIF9pbmhlcml0aW5nQ2xhc3Nlcy5hZGRBbGwobWVtYmVySG9sZGluZ0NsYXNzTm9kZQogICAgICAgICAgLnN1YmNsYXNzZXNCeU1hc2soQ2xhc3NIaWVyYXJjaHlOb2RlLkFMTCwgc3RyaWN0OiBmYWxzZSkpOwogICAgICBmb3IgKENsYXNzSGllcmFyY2h5Tm9kZSBtaXhpbkFwcGxpY2F0aW9uCiAgICAgICAgICBpbiBidWlsZGVyLl9jbGFzc1NldHNbbWVtYmVySG9sZGluZ0NsYXNzXS5taXhpbkFwcGxpY2F0aW9uTm9kZXMpIHsKICAgICAgICBfaW5oZXJpdGluZ0NsYXNzZXMuYWRkQWxsKG1peGluQXBwbGljYXRpb24KICAgICAgICAgICAgLnN1YmNsYXNzZXNCeU1hc2soQ2xhc3NIaWVyYXJjaHlOb2RlLkFMTCwgc3RyaWN0OiBmYWxzZSkpOwogICAgICB9CiAgICB9CgogICAgU2V0PENsYXNzRW50aXR5PiB2YWxpZGF0aW5nU2V0ID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgICB2b2lkIHByb2Nlc3NIaWVyYXJjaHkoQ2xhc3NIaWVyYXJjaHlOb2RlIG1peGVyTm9kZSkgewogICAgICBmb3IgKENsYXNzRW50aXR5IGluaGVyaXRpbmdDbGFzcyBpbiBfaW5oZXJpdGluZ0NsYXNzZXMpIHsKICAgICAgICBDbGFzc0hpZXJhcmNoeU5vZGUgaW5oZXJpdGluZ0NsYXNzTm9kZSA9CiAgICAgICAgICAgIGJ1aWxkZXIuX2NsYXNzSGllcmFyY2h5Tm9kZXNbaW5oZXJpdGluZ0NsYXNzXTsKICAgICAgICBpZiAoIXZhbGlkYXRpbmdTZXQuY29udGFpbnMobWl4ZXJOb2RlLmNscykgJiYKICAgICAgICAgICAgaW5oZXJpdGluZ0NsYXNzTm9kZS5oYXNTdWJjbGFzcyhtaXhlck5vZGUpKSB7CiAgICAgICAgICAvLyBJZiBbbWl4ZXJOb2RlLmNsc10gaXMgbGl2ZSB0aGVuIGEgYHRoaXNgIGV4cHJlc3Npb24gY2FuIHRhcmdldAogICAgICAgICAgLy8gbWVtYmVycyBpbmhlcml0ZWQgZnJvbSBbbWVtYmVySG9sZGluZ0NsYXNzXSBpbnRvIFtpbmhlcml0aW5nQ2xhc3NdLgogICAgICAgICAgdmFsaWRhdGluZ1NldC5hZGQobWl4ZXJOb2RlLmNscyk7CiAgICAgICAgfQogICAgICAgIGlmIChtaXhlck5vZGUuaGFzU3ViY2xhc3MoaW5oZXJpdGluZ0NsYXNzTm9kZSkpIHsKICAgICAgICAgIC8vIElmIFtpbmhlcml0aW5nQ2xhc3NdIGlzIGxpdmUgdGhlbiBhIGB0aGlzYCBleHByZXNzaW9uIGNhbiB0YXJnZXQKICAgICAgICAgIC8vIG1lbWJlcnMgaW5oZXJpdGVkIGZyb20gW21lbWJlckhvbGRpbmdDbGFzc10gaW50byBgaW5oZXJpdGluZ0NsYXNzYAogICAgICAgICAgLy8gaW50byBhIHN1YmNsYXNzIG9mIFttaXhlck5vZGUuY2xzXS4KICAgICAgICAgIHZhbGlkYXRpbmdTZXQuYWRkKGluaGVyaXRpbmdDbGFzcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgQ2xhc3NTZXQgdGhpc0NsYXNzU2V0ID0gYnVpbGRlci5fY2xhc3NTZXRzW3RoaXNDbGFzc107CgogICAgcHJvY2Vzc0hpZXJhcmNoeSh0aGlzQ2xhc3NTZXQubm9kZSk7CgogICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgbWl4aW5BcHBsaWNhdGlvbgogICAgICAgIGluIHRoaXNDbGFzc1NldC5taXhpbkFwcGxpY2F0aW9uTm9kZXMpIHsKICAgICAgcHJvY2Vzc0hpZXJhcmNoeShtaXhpbkFwcGxpY2F0aW9uKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IF9MaXZlU2V0KHZhbGlkYXRpbmdTZXQpOwogIH0KfQoKLy8vIEEgY2FjaGUgb2JqZWN0IHVzZWQgZm9yIFtDbGFzc0hpZXJhcmNoeUJ1aWxkZXIuaXNJbmhlcml0ZWRJblN1YnR5cGVPZl0uCmNsYXNzIF9Jbmhlcml0ZWRJblN1YnR5cGVDYWNoZSB7CiAgTWFwPENsYXNzRW50aXR5LCBfTGl2ZVNldD4gX21hcDsKCiAgLy8vIFJldHVybnMgd2hldGhlciBhIGxpdmUgY2xhc3MgY3VycmVudGx5IGtub3duIHRvIGluaGVyaXQgZnJvbSBbeF0gYW5kCiAgLy8vIGltcGxlbWVudCBbeV0uCiAgYm9vbCBpc0luaGVyaXRlZEluU3VidHlwZU9mKAogICAgICBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgYnVpbGRlciwgQ2xhc3NFbnRpdHkgeCwgQ2xhc3NFbnRpdHkgeSkgewogICAgX0xpdmVTZXQgc2V0OwogICAgaWYgKF9tYXAgPT0gbnVsbCkgewogICAgICBfbWFwID0ge307CiAgICB9IGVsc2UgewogICAgICBzZXQgPSBfbWFwW3ldOwogICAgfQogICAgaWYgKHNldCA9PSBudWxsKSB7CiAgICAgIHNldCA9IF9tYXBbeV0gPSBfY29tcHV0ZUluaGVyaXRpbmdJblN1YnR5cGVTZXQoYnVpbGRlciwgeCwgeSk7CiAgICB9CiAgICByZXR1cm4gc2V0Lmhhc0xpdmVDbGFzcyhidWlsZGVyKTsKICB9CgogIC8vLyBDcmVhdGVzIGFuIFtfTGl2ZVNldF0gb2YgY2xhc3NlcyB0aGF0IGluaGVyaXQgbWVtYmVycyBvZiBhIGNsYXNzIFt4XQogIC8vLyB3aGlsZSBpbXBsZW1lbnRpbmcgY2xhc3MgW3ldLgogIF9MaXZlU2V0IF9jb21wdXRlSW5oZXJpdGluZ0luU3VidHlwZVNldCgKICAgICAgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGJ1aWxkZXIsIENsYXNzRW50aXR5IHgsIENsYXNzRW50aXR5IHkpIHsKICAgIENsYXNzU2V0IGNsYXNzU2V0ID0gYnVpbGRlci5fY2xhc3NTZXRzW3hdOwoKICAgIGFzc2VydCgKICAgICAgICBjbGFzc1NldCAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICB4LCAiTm8gQ2xhc3NTZXQgZm9yICR4ICgke3gucnVudGltZVR5cGV9KTogJHtidWlsZGVyLl9jbGFzc1NldHN9IikpOwoKICAgIFNldDxDbGFzc0VudGl0eT4gY2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogICAgaWYgKGJ1aWxkZXIuX2lzU3VidHlwZU9mKHgsIHkpKSB7CiAgICAgIC8vIFt4XSBpbXBsZW1lbnRzIFt5XSBpdHNlbGYsIHBvc3NpYmxlIHRocm91Z2ggc3VwZXJ0eXBlcy4KICAgICAgY2xhc3Nlcy5hZGQoeCk7CiAgICB9CgogICAgLy8vIEFkZCBzdWJjbGFzc2VzIG9mIFtub2RlXSB0aGF0IGltcGxlbWVudCBbeV0uCiAgICB2b2lkIHN1YmNsYXNzSW1wbGVtZW50cyhDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSwge2Jvb2wgc3RyaWN0fSkgewogICAgICBub2RlLmZvckVhY2hTdWJjbGFzcygoQ2xhc3NFbnRpdHkgeikgewogICAgICAgIGlmIChidWlsZGVyLl9pc1N1YnR5cGVPZih6LCB5KSkgewogICAgICAgICAgY2xhc3Nlcy5hZGQoeik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9LCBDbGFzc0hpZXJhcmNoeU5vZGUuQUxMLCBzdHJpY3Q6IHN0cmljdCk7CiAgICB9CgogICAgLy8gQSBzdWJjbGFzc2VzIG9mIFt4XSB0aGF0IGltcGxlbWVudCBbeV0uCiAgICBzdWJjbGFzc0ltcGxlbWVudHMoY2xhc3NTZXQubm9kZSwgc3RyaWN0OiB0cnVlKTsKCiAgICBmb3IgKENsYXNzSGllcmFyY2h5Tm9kZSBtaXhpbkFwcGxpY2F0aW9uCiAgICAgICAgaW4gY2xhc3NTZXQubWl4aW5BcHBsaWNhdGlvbk5vZGVzKSB7CiAgICAgIC8vIEEgc3ViY2xhc3Mgb2YgW21peGluQXBwbGljYXRpb25dIGltcGxlbWVudHMgW3ldLgogICAgICBzdWJjbGFzc0ltcGxlbWVudHMobWl4aW5BcHBsaWNhdGlvbiwgc3RyaWN0OiBmYWxzZSk7CiAgICB9CgogICAgcmV0dXJuIG5ldyBfTGl2ZVNldChjbGFzc2VzKTsKICB9Cn0KCi8vLyBBIHNldCBvZiBwb3RlbnRpYWxseSBsaXZlIGNsYXNzZXMuCi8vLwovLy8gVGhlIHNldCBpcyB1c2VkIFtDbGFzc0hpZXJhcmNoeUJ1aWxkZXIuaXNJbmhlcml0ZWRJblN1YnR5cGVPZl0gYW5kCi8vLyBbQ2xhc3NIaWVyYXJjaHlCdWlsZGVyLmlzSW5oZXJpdGVkSW5UaGlzQ2xhc3NPZl0gdG8gZGV0ZXJtaW5lCi8vLyB3aGVuIG1lbWJlcnMgb2YgYSBjbGFzcyBpcyBsaXZlLgpjbGFzcyBfTGl2ZVNldCB7CiAgLy8vIElmIGB0cnVlYCB0aGUgc2V0IG9mIGNsYXNzZXMgaXMga25vd24gdG8gY29udGFpbiBhIGxpdmUgY2xhc3MuIEluIHRoaXMKICAvLy8gY2FzZSBbX2NsYXNzZXNdIGlzIGBudWxsYC4gSWYgYGZhbHNlYCB0aGUgc2V0IG9mIGNsYXNzZXMgaXMgZW1wdHkgYW5kCiAgLy8vIHRoZXJlZm9yZSBrbm93biBuZXZlciB0byBjb250YWluIGxpdmUgY2xhc3Nlcy4gSW4gdGhpcyBjYXNlIFtfY2xhc3Nlc10KICAvLy8gaXMgYG51bGxgLiBJZiBgbnVsbGAgW19jbGFzc2VzXSBpcyBhIG5vbi1lbXB0eSBzZXQgY29udGFpbmluZyBjbGFzc2VzCiAgLy8vIHRoYXQgYXJlIG5vdCB5ZXQga25vd24gdG8gYmUgbGl2ZS4KICBib29sIF9yZXN1bHQ7CiAgU2V0PENsYXNzRW50aXR5PiBfY2xhc3NlczsKCiAgX0xpdmVTZXQoU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzKQogICAgICA6IF9yZXN1bHQgPSBjbGFzc2VzLmlzRW1wdHkgPyBmYWxzZSA6IG51bGwsCiAgICAgICAgX2NsYXNzZXMgPSBjbGFzc2VzLmlzTm90RW1wdHkgPyBjbGFzc2VzIDogbnVsbDsKCiAgLy8vIFJldHVybnMgd2hldGhlciB0aGUgc2V0IG9mIGNsYXNzZXMgaXMgY3VycmVudGx5IGtub3duIHRvIGNvbnRhaW4gYSBsaXZlCiAgLy8vIGNsYXNzZXMuCiAgLy8vCiAgLy8vIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgY2hhbmdlcyBkdXJpbmcgdGhlIGNsb3NlZCB3b3JsZCBjb21wdXRhdGlvbi4KICAvLy8gSW5pdGlhbGx5LCB3ZSBoYXZlbid0IHNlZW4gYW55IGxpdmUgY2xhc3NlcyBzbyB3ZSB3aWxsIHJldHVybiBgZmFsc2VgIGV2ZW4KICAvLy8gZm9yIGEgbm9uLWVtcHR5IHNldCBvZiBjbGFzc2VzLiBBcyBtb3JlIGNsYXNzZXMgYXJlIG1hcmtlZCBhcwogIC8vLyBpbnN0YW50aWF0ZWQsIGR1cmluZyB0cmVlLXNoYWtpbmcsIHRoZSByZXN1bHQgbWlnaHQgY2hhbmdlIHRvIGB0cnVlYCBpZgogIC8vLyBvbmUgb2YgdGhlIFtfY2xhc3Nlc10gaGFzIGJlZW4gbWFya2VkIGFzIGxpdmUuCiAgLy8vCiAgLy8vIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgX2lzXyBtb25vdG9uZSwgdGhvdWdoOyB3aGVuIHdlIGhhdmUgcmV0dXJuZWQKICAvLy8gYHRydWVgIChiZWNhdXNlIGF0IGxlYXN0IG9uZSBjbGFzcyBpcyBrbm93biB0byBiZSBsaXZlKSB3ZSB3aWxsIGNvbnRpbnVlCiAgLy8vIHRvIHJldHVybiBgdHJ1ZWAuCiAgYm9vbCBoYXNMaXZlQ2xhc3MoQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGJ1aWxkZXIpIHsKICAgIGlmIChfcmVzdWx0ICE9IG51bGwpIHJldHVybiBfcmVzdWx0OwogICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gX2NsYXNzZXMpIHsKICAgICAgaWYgKGJ1aWxkZXIuX2NsYXNzSGllcmFyY2h5Tm9kZXNbY2xzXS5pc0luc3RhbnRpYXRlZCkgewogICAgICAgIC8vIFdlIG5vdyBrbm93IHRoaXMgc2V0IGNvbnRhaW5zIGEgbGl2ZSBjbGFzcyBhbmQgZG9uZSBuZWVkIHRvIHJlbWVtYmVyCiAgICAgICAgLy8gdGhhdCBzZXQgb2YgY2xhc3NlcyBhbnltb3JlLgogICAgICAgIF9yZXN1bHQgPSB0cnVlOwogICAgICAgIF9jbGFzc2VzID0gbnVsbDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgQ2xhc3NRdWVyaWVzIHsKICAvLy8gUmV0dXJucyB0aGUgZGVjbGFyYXRpb24gb2YgW2Nsc10uCiAgQ2xhc3NFbnRpdHkgZ2V0RGVjbGFyYXRpb24oY292YXJpYW50IENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSBjbGFzcyBtaXhlZCBpbnRvIFtjbHNdIGlmIGFueS4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZXBsYWNlIHRoaXMgYnkgYSBgZ2V0QXBwbGllZE1peGluc2AgZnVuY3Rpb24gdGhhdAogIC8vIHJldHVybiB0cmFuc2l0aXZlbHkgbWl4ZWQgaW4gY2xhc3NlcyBsaWtlIGluOgogIC8vICAgICBjbGFzcyBBIHt9CiAgLy8gICAgIGNsYXNzIEIgPSBPYmplY3Qgd2l0aCBBOwogIC8vICAgICBjbGFzcyBDID0gT2JqZWN0IHdpdGggQjsKICBDbGFzc0VudGl0eSBnZXRBcHBsaWVkTWl4aW4oY292YXJpYW50IENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIHRoZSBoaWVyYXJjaHkgZGVwdGggb2YgW2Nsc10uCiAgaW50IGdldEhpZXJhcmNoeURlcHRoKGNvdmFyaWFudCBDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2Nsc10gaW1wbGVtZW50cyBgRnVuY3Rpb25gIGVpdGhlciBleHBsaWNpdGx5IG9yIHRocm91Z2gKICAvLy8gYSBgY2FsbGAgbWV0aG9kLgogIGJvb2wgaW1wbGVtZW50c0Z1bmN0aW9uKGNvdmFyaWFudCBDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyB0aGUgc3VwZXJjbGFzcyBvZiBbY2xzXSBpZiBhbnkuCiAgQ2xhc3NFbnRpdHkgZ2V0U3VwZXJDbGFzcyhjb3ZhcmlhbnQgQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgYWxsIHN1cGVydHlwZXMgb2YgW2Nsc10uCiAgSXRlcmFibGU8SW50ZXJmYWNlVHlwZT4gZ2V0U3VwZXJ0eXBlcyhjb3ZhcmlhbnQgQ2xhc3NFbnRpdHkgY2xzKTsKfQoKLy8vIEVudW0gdmFsdWVzIGRlZmluaW5nIHN1YnNldCBvZiBjbGFzc2VzIGluY2x1ZGVkIGluIHF1ZXJpZXMuCmVudW0gQ2xhc3NRdWVyeSB7CiAgLy8vIE9ubHkgdGhlIGNsYXNzIGl0c2VsZiBpcyBpbmNsdWRlZC4KICBFWEFDVCwKCiAgLy8vIFRoZSBjbGFzcyBhbmQgYWxsIHN1YmNsYXNzZXMgKHRyYW5zaXRpdmVseSkgYXJlIGluY2x1ZGVkLgogIFNVQkNMQVNTLAoKICAvLy8gVGhlIGNsYXNzIGFuZCBhbGwgY2xhc3NlcyB0aGF0IGltcGxlbWVudCBvciBzdWJjbGFzcyBpdCAodHJhbnNpdGl2ZWx5KQogIC8vLyBhcmUgaW5jbHVkZWQuCiAgU1VCVFlQRSwKfQoKLy8vIFJlc3VsdCBraW5kIGZvciBbQ2xhc3NIaWVyYXJjaHkuY29tbW9uU3ViY2xhc3Nlc10uCmVudW0gU3ViY2xhc3NSZXN1bHRLaW5kIHsKICAvLy8gTm8gY29tbW9uIHN1YmNsYXNzZXMuCiAgRU1QVFksCgogIC8vLyBFeGFjdGx5IHRoZSBmaXJzdCBjbGFzcyBpbiBjb21tb24uCiAgRVhBQ1QxLAoKICAvLy8gRXhhY3RseSB0aGUgc2Vjb25kIGNsYXNzIGluIGNvbW1vbi4KICBFWEFDVDIsCgogIC8vLyBTdWJjbGFzc2VzIG9mIHRoZSBmaXJzdCBjbGFzcyBpbiBjb21tb24uCiAgU1VCQ0xBU1MxLAoKICAvLy8gU3ViY2xhc3NlcyBvZiB0aGUgc2Vjb25kIGNsYXNzIGluIGNvbW1vbi4KICBTVUJDTEFTUzIsCgogIC8vLyBTdWJ0eXBlcyBvZiB0aGUgZmlyc3QgY2xhc3MgaW4gY29tbW9uLgogIFNVQlRZUEUxLAoKICAvLy8gU3VidHlwZXMgb2YgdGhlIHNlY29uZCBjbGFzcyBpbiBjb21tb24uCiAgU1VCVFlQRTIsCgogIC8vLyBTdWJjbGFzc2VzIG9mIGEgc2V0IG9mIGNsYXNzZXMgaW4gY29tbW9uLgogIFNFVAp9CgovLy8gUmVzdWx0IGNvbXB1dGVkIGluIFtDbGFzc0hpZXJhcmNoeS5jb21tb25TdWJjbGFzc2VzXS4KY2xhc3MgU3ViY2xhc3NSZXN1bHQgewogIGZpbmFsIFN1YmNsYXNzUmVzdWx0S2luZCBraW5kOwogIGZpbmFsIExpc3Q8Q2xhc3NFbnRpdHk+IGNsYXNzZXM7CgogIFN1YmNsYXNzUmVzdWx0KHRoaXMuY2xhc3NlcykgOiBraW5kID0gU3ViY2xhc3NSZXN1bHRLaW5kLlNFVDsKCiAgY29uc3QgU3ViY2xhc3NSZXN1bHQuaW50ZXJuYWwodGhpcy5raW5kKSA6IGNsYXNzZXMgPSBudWxsOwoKICBzdGF0aWMgY29uc3QgU3ViY2xhc3NSZXN1bHQgRU1QVFkgPQogICAgICBjb25zdCBTdWJjbGFzc1Jlc3VsdC5pbnRlcm5hbChTdWJjbGFzc1Jlc3VsdEtpbmQuRU1QVFkpOwogIHN0YXRpYyBjb25zdCBTdWJjbGFzc1Jlc3VsdCBFWEFDVDEgPQogICAgICBjb25zdCBTdWJjbGFzc1Jlc3VsdC5pbnRlcm5hbChTdWJjbGFzc1Jlc3VsdEtpbmQuRVhBQ1QxKTsKICBzdGF0aWMgY29uc3QgU3ViY2xhc3NSZXN1bHQgRVhBQ1QyID0KICAgICAgY29uc3QgU3ViY2xhc3NSZXN1bHQuaW50ZXJuYWwoU3ViY2xhc3NSZXN1bHRLaW5kLkVYQUNUMik7CiAgc3RhdGljIGNvbnN0IFN1YmNsYXNzUmVzdWx0IFNVQkNMQVNTMSA9CiAgICAgIGNvbnN0IFN1YmNsYXNzUmVzdWx0LmludGVybmFsKFN1YmNsYXNzUmVzdWx0S2luZC5TVUJDTEFTUzEpOwogIHN0YXRpYyBjb25zdCBTdWJjbGFzc1Jlc3VsdCBTVUJDTEFTUzIgPQogICAgICBjb25zdCBTdWJjbGFzc1Jlc3VsdC5pbnRlcm5hbChTdWJjbGFzc1Jlc3VsdEtpbmQuU1VCQ0xBU1MyKTsKICBzdGF0aWMgY29uc3QgU3ViY2xhc3NSZXN1bHQgU1VCVFlQRTEgPQogICAgICBjb25zdCBTdWJjbGFzc1Jlc3VsdC5pbnRlcm5hbChTdWJjbGFzc1Jlc3VsdEtpbmQuU1VCVFlQRTEpOwogIHN0YXRpYyBjb25zdCBTdWJjbGFzc1Jlc3VsdCBTVUJUWVBFMiA9CiAgICAgIGNvbnN0IFN1YmNsYXNzUmVzdWx0LmludGVybmFsKFN1YmNsYXNzUmVzdWx0S2luZC5TVUJUWVBFMik7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdTdWJjbGFzc1Jlc3VsdCgka2luZCxjbGFzc2VzPSRjbGFzc2VzKSc7Cn0Kg+UATk48ARkiJDQuGQFBFSA8LT4tATInAU0oAUs/MAFNTw0GTlBLSykyAU0GQzIBTBAyAT4zAU8XMgFNPDcBTSo9AUEeLAFNDiA6AVAkTgFONjUBTh07AUQeKwFRDh86AU4qTQFEPAFRDS4BSRgtAU8RKwFKOwZLEAYmBhUVJR8GEAZJBjgjUQFRGAZQKT0BTCIGUCkpATsGUSICATVIHS8BKEMvARZJATE6Fz8mJytLKCwGLysaSCoGARUjOQQBDCgVJh48LTgTID0sLhMgEwQBDCk5MAQBDDE5OAQBDDM5OgQBDDM5OgQBDDM5OgQBDDMnDBoSDzYsRSdCNAQBDDRJBAEMOD45FUcEAQw+PzooNBcEAQwtPyYxBAEMIDs/JE4XBAEMTz8qIz8XBAEMNikcJA0WRwYEAQw8KRwkDVEZBgQBDCwpJC4EAQwfOykiSxcEAQxOKSggPxcEAQw9KCg+SEE7LhUIBhIEAQwvPyowBAEMLigEAQwsMzkpHBkTBjMEAQxHLURPFBolCCQtK0wTKCgKMUsTJygKCCMtK0wTKCgKMUsTJygKCCNRTxQ2SxMpLUsTKQgjMCVAKQgxUCUoCEoJHQkYGC8iLwlNTyIzPSshSUswCicKKjAlQCkIMVAlKAhKMz0rIUlLMAonCioNNU8oLE8oCEoJHQkYGC8iLyUiCUxMSzM8KyFJSzAKJwoqBgQBDD4mBAEMKhwEAQwjKhdCDT8GN04aBAIBHkE8RCtLNzABKCQBQwEbDDoxJhojPAQBKDgEAUI2JUEgPAglQggEAS4sQC4BRUQZPSUIAUUlQy07LAEWCxknJwtGRAgXCAQBSUkUIDAxTCMGOz8GBAE5UDkyICoGIiwGBAFLQDAdRCEEATQmNycdTkUnNjQEAUw4IEBKNDIvFAZFPTcTBi06OjwVCAYSBAFPCgFPKB8/Jz4uUAQBTwE+JUs1BAIBSz4jSicBUCMBTlE/PxIYEQ0dBhdAMwYmBAFLPzA6ASYzN0UvTTNHCAYBPQE6QDE7NjpMUSwKOk5QMS4KCAYBOwEpAS0xKgYBKAQCAUwhIwFLFR9FEhgRDRUGF0UGJgQBSyQrRS8BDBoSUQE3ASZBFgYBNUYtKhoKFTIGAS81AS0tOjsGASIEAgEnBEdCJRFNTE1MKRAdASUyOAFODwZNUURONQZNTxg1KSg+UCgYGRUIBhIEAgEeKDkBMU0zFCIiOgEsNAFRFzYBLjgBJ0QCAUASKQkBQAwBTRQLAgE3GhwJASkKASoKAS8NATANAS0MAS4MATAGAgE6FyEjAUABPQEmPydAJ0AqQypDKUIpQgEMQQIBMnBhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL2NsYXNzX2hpZXJhcmNoeS5kYXJ0P3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL3R5cGVfZ3JhcGhfaW5mZXJyZXIuZGFydJadLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdHlwZV9ncmFwaF9pbmZlcnJlcjsKCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJyBzaG93IFF1ZXVlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAnLi4vY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9jb21waWxlci5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2luZmVycmVkX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvZWxlbWVudHMuZGFydCcgc2hvdyBKQ2xvc3VyZUNhbGxNZXRob2Q7CmltcG9ydCAnLi4vd29ybGQuZGFydCc7CmltcG9ydCAnYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJ2luZmVycmVyX2VuZ2luZS5kYXJ0JzsKaW1wb3J0ICd0eXBlX2dyYXBoX25vZGVzLmRhcnQnOwppbXBvcnQgJ3R5cGVzLmRhcnQnOwoKLy8vIEEgd29yayBxdWV1ZSBmb3IgdGhlIGluZmVycmVyLiBJdCBmaWx0ZXJzIG91dCBub2RlcyB0aGF0IGFyZSB0YWdnZWQgYXMKLy8vIFtUeXBlSW5mb3JtYXRpb24uZG9Ob3RFbnF1ZXVlXSwgYXMgd2VsbCBhcyBlbnN1cmVzIHRocm91Z2gKLy8vIFtUeXBlSW5mb3JtYXRpb24uaW5RdWV1ZV0gdGhhdCBhIG5vZGUgaXMgaW4gdGhlIHF1ZXVlIG9ubHkgb25jZSBhdAovLy8gYSB0aW1lLgpjbGFzcyBXb3JrUXVldWUgewogIGZpbmFsIFF1ZXVlPFR5cGVJbmZvcm1hdGlvbj4gcXVldWUgPSBuZXcgUXVldWU8VHlwZUluZm9ybWF0aW9uPigpOwoKICB2b2lkIGFkZChUeXBlSW5mb3JtYXRpb24gZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQuZG9Ob3RFbnF1ZXVlKSByZXR1cm47CiAgICBpZiAoZWxlbWVudC5pblF1ZXVlKSByZXR1cm47CiAgICBxdWV1ZS5hZGRMYXN0KGVsZW1lbnQpOwogICAgZWxlbWVudC5pblF1ZXVlID0gdHJ1ZTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPFR5cGVJbmZvcm1hdGlvbj4gYWxsKSB7CiAgICBhbGwuZm9yRWFjaChhZGQpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIHJlbW92ZSgpIHsKICAgIFR5cGVJbmZvcm1hdGlvbiBlbGVtZW50ID0gcXVldWUucmVtb3ZlRmlyc3QoKTsKICAgIGVsZW1lbnQuaW5RdWV1ZSA9IGZhbHNlOwogICAgcmV0dXJuIGVsZW1lbnQ7CiAgfQoKICBib29sIGdldCBpc0VtcHR5ID0+IHF1ZXVlLmlzRW1wdHk7CgogIGludCBnZXQgbGVuZ3RoID0+IHF1ZXVlLmxlbmd0aDsKfQoKY2xhc3MgVHlwZUdyYXBoSW5mZXJyZXIgaW1wbGVtZW50cyBUeXBlc0luZmVycmVyIHsKICBJbmZlcnJlckVuZ2luZSBpbmZlcnJlcjsKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CgogIGZpbmFsIENvbXBpbGVyIF9jb21waWxlcjsKICBmaW5hbCBJbmZlcnJlZERhdGFCdWlsZGVyIF9pbmZlcnJlZERhdGFCdWlsZGVyOwoKICBUeXBlR3JhcGhJbmZlcnJlcigKICAgICAgdGhpcy5fY29tcGlsZXIsIHRoaXMuY2xvc2VkV29ybGQsIHRoaXMuX2luZmVycmVkRGF0YUJ1aWxkZXIpOwoKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJ0dyYXBoIGluZmVycmVyJzsKCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgYWJzdHJhY3RWYWx1ZURvbWFpbiA9PgogICAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICBAb3ZlcnJpZGUKICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBhbmFseXplTWFpbihGdW5jdGlvbkVudGl0eSBtYWluKSB7CiAgICBpbmZlcnJlciA9IGNyZWF0ZUluZmVycmVyRW5naW5lRm9yKG1haW4pOwogICAgaW5mZXJyZXIucnVuT3ZlckFsbEVsZW1lbnRzKCk7CiAgICByZXR1cm4gYnVpbGRSZXN1bHRzKCk7CiAgfQoKICBJbmZlcnJlckVuZ2luZSBjcmVhdGVJbmZlcnJlckVuZ2luZUZvcihGdW5jdGlvbkVudGl0eSBtYWluKSB7CiAgICByZXR1cm4gbmV3IEluZmVycmVyRW5naW5lSW1wbCgKICAgICAgICBfY29tcGlsZXIub3B0aW9ucywKICAgICAgICBfY29tcGlsZXIucHJvZ3Jlc3MsCiAgICAgICAgX2NvbXBpbGVyLnJlcG9ydGVyLAogICAgICAgIF9jb21waWxlci5vdXRwdXRQcm92aWRlciwKICAgICAgICBjbG9zZWRXb3JsZCwKICAgICAgICBfY29tcGlsZXIuZnJvbnRlbmRTdHJhdGVneS5ub1N1Y2hNZXRob2RSZWdpc3RyeSwKICAgICAgICBtYWluLAogICAgICAgIF9pbmZlcnJlZERhdGFCdWlsZGVyKTsKICB9CgogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZ2V0Q2FsbGVyc09mRm9yVGVzdGluZyhNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGluZmVycmVyLmdldENhbGxlcnNPZkZvclRlc3RpbmcoZWxlbWVudCk7CiAgfQoKICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyBidWlsZFJlc3VsdHMoKSB7CiAgICBpbmZlcnJlci5jbG9zZSgpOwoKICAgIE1hcDxNZW1iZXJFbnRpdHksIEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQ+IG1lbWJlclJlc3VsdHMgPQogICAgICAgIDxNZW1iZXJFbnRpdHksIEdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHQ+e307CiAgICBNYXA8TG9jYWwsIEFic3RyYWN0VmFsdWU+IHBhcmFtZXRlclJlc3VsdHMgPSA8TG9jYWwsIEFic3RyYWN0VmFsdWU+e307CgogICAgdm9pZCBjcmVhdGVNZW1iZXJSZXN1bHRzKAogICAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIsIE1lbWJlclR5cGVJbmZvcm1hdGlvbiB0eXBlSW5mb3JtYXRpb24pIHsKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhIGRhdGEgPQogICAgICAgICAgaW5mZXJyZXIuZGF0YU9mTWVtYmVyKG1lbWJlcikuY29tcHJlc3MoKTsKICAgICAgYm9vbCBpc0pzSW50ZXJvcCA9IGNsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaXNKc0ludGVyb3BNZW1iZXIobWVtYmVyKTsKCiAgICAgIEFic3RyYWN0VmFsdWUgcmV0dXJuVHlwZTsKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlOwoKICAgICAgaWYgKGlzSnNJbnRlcm9wKSB7CiAgICAgICAgcmV0dXJuVHlwZSA9IHR5cGUgPSBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogICAgICB9IGVsc2UgaWYgKG1lbWJlciBpcyBGdW5jdGlvbkVudGl0eSkgewogICAgICAgIHJldHVyblR5cGUgPSB0eXBlSW5mb3JtYXRpb24udHlwZTsKICAgICAgICB0eXBlID0gYWJzdHJhY3RWYWx1ZURvbWFpbi5mdW5jdGlvblR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuVHlwZSA9IGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgICAgICAgdHlwZSA9IHR5cGVJbmZvcm1hdGlvbi50eXBlOwogICAgICB9CgogICAgICBib29sIHRocm93c0Fsd2F5cyA9CiAgICAgICAgICAvLyBBbHdheXMgdGhyb3dzIGlmIHRoZSByZXR1cm4gdHlwZSB3YXMgaW5mZXJyZWQgdG8gYmUgbm9uLW51bGwgZW1wdHkuCiAgICAgICAgICByZXR1cm5UeXBlICE9IG51bGwgJiYKICAgICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmlzRW1wdHkocmV0dXJuVHlwZSkuaXNEZWZpbml0ZWx5VHJ1ZTsKCiAgICAgIGJvb2wgaXNDYWxsZWRPbmNlID0KICAgICAgICAgIHR5cGVJbmZvcm1hdGlvbi5pc0NhbGxlZE9uY2UoKTsgLy9pc01lbWJlckNhbGxlZE9uY2UobWVtYmVyKTsKCiAgICAgIG1lbWJlclJlc3VsdHNbbWVtYmVyXSA9IG5ldyBHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0SW1wbCgKICAgICAgICAgIGRhdGEsIHJldHVyblR5cGUsIHR5cGUsCiAgICAgICAgICB0aHJvd3NBbHdheXM6IHRocm93c0Fsd2F5cywgaXNDYWxsZWRPbmNlOiBpc0NhbGxlZE9uY2UpOwogICAgfQoKICAgIFNldDxGaWVsZEVudGl0eT4gZnJlZVZhcmlhYmxlcyA9IG5ldyBTZXQ8RmllbGRFbnRpdHk+KCk7CiAgICBpbmZlcnJlci50eXBlcy5mb3JFYWNoTWVtYmVyVHlwZSgKICAgICAgICAoTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVHlwZUluZm9ybWF0aW9uIHR5cGVJbmZvcm1hdGlvbikgewogICAgICBjcmVhdGVNZW1iZXJSZXN1bHRzKG1lbWJlciwgdHlwZUluZm9ybWF0aW9uKTsKICAgICAgaWYgKG1lbWJlciBpcyBKQ2xvc3VyZUNhbGxNZXRob2QpIHsKICAgICAgICBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvIGluZm8gPQogICAgICAgICAgICBjbG9zZWRXb3JsZC5jbG9zdXJlRGF0YUxvb2t1cC5nZXRTY29wZUluZm8obWVtYmVyKTsKICAgICAgICBpbmZvLmZvckVhY2hGcmVlVmFyaWFibGUoKExvY2FsIGZyb20sIEZpZWxkRW50aXR5IHRvKSB7CiAgICAgICAgICBmcmVlVmFyaWFibGVzLmFkZCh0byk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogICAgZm9yIChGaWVsZEVudGl0eSBmaWVsZCBpbiBmcmVlVmFyaWFibGVzKSB7CiAgICAgIGlmICghbWVtYmVyUmVzdWx0cy5jb250YWluc0tleShmaWVsZCkpIHsKICAgICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gdHlwZUluZm9ybWF0aW9uID0KICAgICAgICAgICAgaW5mZXJyZXIudHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZmllbGQpOwogICAgICAgIHR5cGVJbmZvcm1hdGlvbi5jb21wdXRlSXNDYWxsZWRPbmNlKCk7CiAgICAgICAgY3JlYXRlTWVtYmVyUmVzdWx0cyhmaWVsZCwgdHlwZUluZm9ybWF0aW9uKTsKICAgICAgfQogICAgfQoKICAgIGluZmVycmVyLnR5cGVzLmZvckVhY2hQYXJhbWV0ZXJUeXBlKAogICAgICAgIChMb2NhbCBwYXJhbWV0ZXIsIFBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbiB0eXBlSW5mb3JtYXRpb24pIHsKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlID0gdHlwZUluZm9ybWF0aW9uLnR5cGU7CiAgICAgIHBhcmFtZXRlclJlc3VsdHNbcGFyYW1ldGVyXSA9IHR5cGU7CiAgICB9KTsKCiAgICBNYXA8aXIuVHJlZU5vZGUsIEFic3RyYWN0VmFsdWU+IGFsbG9jYXRlZExpc3RzID0KICAgICAgICA8aXIuVHJlZU5vZGUsIEFic3RyYWN0VmFsdWU+e307CiAgICBTZXQ8aXIuVHJlZU5vZGU+IGNoZWNrZWRGb3JHcm93YWJsZUxpc3RzID0gbmV3IFNldDxpci5UcmVlTm9kZT4oKTsKICAgIGluZmVycmVyLnR5cGVzLmFsbG9jYXRlZExpc3RzCiAgICAgICAgLmZvckVhY2goKGlyLlRyZWVOb2RlIG5vZGUsIExpc3RUeXBlSW5mb3JtYXRpb24gdHlwZUluZm9ybWF0aW9uKSB7CiAgICAgIExpc3RUeXBlSW5mb3JtYXRpb24gaW5mbyA9IGluZmVycmVyLnR5cGVzLmFsbG9jYXRlZExpc3RzW25vZGVdOwogICAgICBpZiAoaW5mby5jaGVja3NHcm93YWJsZSkgewogICAgICAgIGNoZWNrZWRGb3JHcm93YWJsZUxpc3RzLmFkZChub2RlKTsKICAgICAgfQogICAgICBhbGxvY2F0ZWRMaXN0c1tub2RlXSA9IHR5cGVJbmZvcm1hdGlvbi50eXBlOwogICAgfSk7CgogICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cyA9IG5ldyBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0c0ltcGwoCiAgICAgICAgY2xvc2VkV29ybGQsCiAgICAgICAgX2luZmVycmVkRGF0YUJ1aWxkZXIuY2xvc2UoY2xvc2VkV29ybGQpLAogICAgICAgIG1lbWJlclJlc3VsdHMsCiAgICAgICAgcGFyYW1ldGVyUmVzdWx0cywKICAgICAgICBjaGVja2VkRm9yR3Jvd2FibGVMaXN0cywKICAgICAgICBpbmZlcnJlci5yZXR1cm5zTGlzdEVsZW1lbnRUeXBlU2V0LAogICAgICAgIGFsbG9jYXRlZExpc3RzKTsKCiAgICBpbmZlcnJlci5jbGVhcigpOwoKICAgIHJldHVybiByZXN1bHRzOwogIH0KfQqAtQBOTjwBHQElASgaGyQrPBglHyAVAUs/RwwSRQEmJiEcHAQBLxYEAR0zHRQEASUBIgIBMxsiARwyARVEAScBMScBDEAuIxsEAUAjGxwcIhU5Dh8EAUg1BAEuFgFHO0sBHkYsNEsBIBoBGT0tKzEPNiUIARpRIEgBGkgBRyJDBgE9Jkc0KilAQCEMCAgvLzA7LzUIBgEpRjEqCAE1KEciS0YhKwgzCAFNFTEXGiEsGQEWARQEAgE2cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvdHlwZV9ncmFwaF9pbmZlcnJlci5kYXJ0P3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy9jb25zdGFudHMuZGFydJEILy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdHlwZXMuY29uc3RhbnRzOwoKaW1wb3J0ICcuLi8uLi9jb25zdGFudHMvY29uc3RhbnRfc3lzdGVtLmRhcnQnIGFzIGNvbnN0YW50X3N5c3RlbTsKaW1wb3J0ICcuLi8uLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uLy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwppbXBvcnQgJ21hc2tzLmRhcnQnOwoKLy8vIENvbXB1dGVzIHRoZSBbVHlwZU1hc2tdIGZvciB0aGUgY29uc3RhbnQgW3ZhbHVlXS4KVHlwZU1hc2sgY29tcHV0ZVR5cGVNYXNrKEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwgQ29uc3RhbnRWYWx1ZSB2YWx1ZSkgewogIHJldHVybiB2YWx1ZS5hY2NlcHQoY29uc3QgQ29uc3RhbnRWYWx1ZVR5cGVNYXNrcygpLCBjbG9zZWRXb3JsZCk7Cn0KCmNsYXNzIENvbnN0YW50VmFsdWVUeXBlTWFza3MKICAgIGV4dGVuZHMgQ29uc3RhbnRWYWx1ZVZpc2l0b3I8VHlwZU1hc2ssIEpDbG9zZWRXb3JsZD4gewogIGNvbnN0IENvbnN0YW50VmFsdWVUeXBlTWFza3MoKTsKCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdmlzaXRDb25zdHJ1Y3RlZCgKICAgICAgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIGNvbnN0YW50LCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIGlmIChjbG9zZWRXb3JsZC5pbnRlcmNlcHRvckRhdGEuaXNJbnRlcmNlcHRlZENsYXNzKGNvbnN0YW50LnR5cGUuZWxlbWVudCkpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4ubm9uTnVsbFR5cGU7CiAgICB9CiAgICByZXR1cm4gbmV3IFR5cGVNYXNrLm5vbk51bGxFeGFjdChjb25zdGFudC50eXBlLmVsZW1lbnQsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHZpc2l0RGVmZXJyZWRHbG9iYWwoCiAgICAgIERlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gY29uc3RhbnQucmVmZXJlbmNlZC5hY2NlcHQodGhpcywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdmlzaXREb3VibGUoRG91YmxlQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICAvLyBXZSBoYXZlIHRvIHJlY29nbml6ZSBkb3VibGUgY29uc3RhbnRzIHRoYXQgYXJlICdpcyBpbnQnLgogICAgaWYgKGNvbnN0YW50X3N5c3RlbS5pc0ludChjb25zdGFudCkpIHsKICAgICAgaWYgKGNvbnN0YW50LmlzTWludXNaZXJvKSB7CiAgICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4udWludDMxVHlwZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoY29uc3RhbnQuaXNQb3NpdGl2ZUluZmluaXR5IHx8IGNvbnN0YW50LmlzTmVnYXRpdmVJbmZpbml0eSk7CiAgICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uaW50VHlwZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZG91YmxlVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHZpc2l0RHVtbXlJbnRlcmNlcHRvcigKICAgICAgRHVtbXlJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgY29uc3RhbnQsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGNvbnN0YW50LmFic3RyYWN0VmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB2aXNpdFVucmVhY2hhYmxlKAogICAgICBVbnJlYWNoYWJsZUNvbnN0YW50VmFsdWUgY29uc3RhbnQsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZW1wdHlUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdmlzaXRKc05hbWUoSnNOYW1lQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5zdHJpbmdUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdmlzaXRCb29sKEJvb2xDb25zdGFudFZhbHVlIGNvbnN0YW50LCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdmlzaXRGdW5jdGlvbigKICAgICAgRnVuY3Rpb25Db25zdGFudFZhbHVlIGNvbnN0YW50LCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmZ1bmN0aW9uVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHZpc2l0SW5zdGFudGlhdGlvbigKICAgICAgSW5zdGFudGlhdGlvbkNvbnN0YW50VmFsdWUgY29uc3RhbnQsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZnVuY3Rpb25UeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdmlzaXRJbnQoSW50Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoY29uc3RhbnQuaXNVSW50MzEoKSkgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4udWludDMxVHlwZTsKICAgIGlmIChjb25zdGFudC5pc1VJbnQzMigpKSByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi51aW50MzJUeXBlOwogICAgaWYgKGNvbnN0YW50LmlzUG9zaXRpdmUoKSkKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4ucG9zaXRpdmVJbnRUeXBlOwogICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uaW50VHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHZpc2l0SW50ZXJjZXB0b3IoCiAgICAgIEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5ub25OdWxsVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHZpc2l0TGlzdChMaXN0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5jb25zdExpc3RUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZU1hc2sgdmlzaXRTZXQoU2V0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5jb25zdFNldFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB2aXNpdE1hcChNYXBDb25zdGFudFZhbHVlIGNvbnN0YW50LCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmNvbnN0TWFwVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHZpc2l0TnVsbChOdWxsQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5udWxsVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVNYXNrIHZpc2l0Tm9uQ29uc3RhbnQoCiAgICAgIE5vbkNvbnN0YW50VmFsdWUgY29uc3RhbnQsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4ubnVsbFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB2aXNpdFN0cmluZyhTdHJpbmdDb25zdGFudFZhbHVlIGNvbnN0YW50LCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLnN0cmluZ1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlTWFzayB2aXNpdFR5cGUoVHlwZUNvbnN0YW50VmFsdWUgY29uc3RhbnQsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4udHlwZVR5cGU7CiAgfQp9CoCIAE5OPAEZAUImLRUBNkpEAgEdOyIBDB1FUToGSgQBDCBIOgQBDFFAKyI7D0w4CAY3BAEMIkojBAEMHUU2BAEMUTcEAQxNNQQBDBpCOQQBDB9HOQQBDEtQUB8+NAQBDB1FOAQBDE06BAEMSzkEAQxLOQQBDE01BAEMHT01BAEMUTcEAQxNNQQCATZwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlbWFza3MvY29uc3RhbnRzLmRhcnQ3c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfbW9kZWwvZWxlbWVudF9tYXAuZGFydMAAUskvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IEpDb21tb25FbGVtZW50cywgSkVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9qdW1wcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vaXIvY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9pci9zdGF0aWNfdHlwZV9wcm92aWRlci5kYXJ0JzsKaW1wb3J0ICcuLi9pci91dGlsLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2Nsb3N1cmUuZGFydCcgc2hvdyBKUmVjb3JkRmllbGQ7CmltcG9ydCAnLi4vanNfbW9kZWwvZWxlbWVudHMuZGFydCcgc2hvdyBKR2VuZXJhdG9yQm9keTsKaW1wb3J0ICcuLi9uYXRpdmUvYmVoYXZpb3IuZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3NzYS90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCc7CmltcG9ydCAnY2xvc3VyZS5kYXJ0JzsKCi8vLyBJbnRlcmZhY2UgdGhhdCB0cmFuc2xhdGVzIGJldHdlZW4gS2VybmVsIElSIG5vZGVzIGFuZCBlbnRpdGllcyB1c2VkIGZvcgovLy8gZ2xvYmFsIHR5cGUgaW5mZXJlbmNlIGFuZCBidWlsZGluZyB0aGUgU1NBIGdyYXBoIGZvciBtZW1iZXJzLgphYnN0cmFjdCBjbGFzcyBKc1RvRWxlbWVudE1hcCB7CiAgLy8vIEFjY2VzcyB0byB0aGUgY29tbW9ubHkgdXNlZCBlbGVtZW50cyBhbmQgdHlwZXMuCiAgSkNvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50czsKCiAgLy8vIEFjY2VzcyB0byB0aGUgW0RhcnRUeXBlc10gb2JqZWN0LgogIERhcnRUeXBlcyBnZXQgdHlwZXM7CgogIC8vLyBSZXR1cm5zIHRoZSBbRGFydFR5cGVdIGNvcnJlc3BvbmRpbmcgdG8gW3R5cGVdLgogIERhcnRUeXBlIGdldERhcnRUeXBlKGlyLkRhcnRUeXBlIHR5cGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0ludGVyZmFjZVR5cGVdIGNvcnJlc3BvbmRpbmcgdG8gW3R5cGVdLgogIEludGVyZmFjZVR5cGUgZ2V0SW50ZXJmYWNlVHlwZShpci5JbnRlcmZhY2VUeXBlIHR5cGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW1R5cGVWYXJpYWJsZVR5cGVdIGNvcnJlc3BvbmRpbmcgdG8gW3R5cGVdLgogIFR5cGVWYXJpYWJsZVR5cGUgZ2V0VHlwZVZhcmlhYmxlVHlwZShpci5UeXBlUGFyYW1ldGVyVHlwZSB0eXBlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtGdW5jdGlvblR5cGVdIG9mIHRoZSBbbm9kZV0uCiAgRnVuY3Rpb25UeXBlIGdldEZ1bmN0aW9uVHlwZShpci5GdW5jdGlvbk5vZGUgbm9kZSk7CgogIC8vLyBSZXR1cm4gdGhlIFtJbnRlcmZhY2VUeXBlXSBjb3JyZXNwb25kaW5nIHRvIHRoZSBbY2xzXSB3aXRoIHRoZSBnaXZlbgogIC8vLyBbdHlwZUFyZ3VtZW50c10uCiAgSW50ZXJmYWNlVHlwZSBjcmVhdGVJbnRlcmZhY2VUeXBlKAogICAgICBpci5DbGFzcyBjbHMsIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NhbGxTdHJ1Y3R1cmVdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFthcmd1bWVudHNdLgogIENhbGxTdHJ1Y3R1cmUgZ2V0Q2FsbFN0cnVjdHVyZShpci5Bcmd1bWVudHMgYXJndW1lbnRzKTsKCiAgLy8vIFJldHVybnMgdGhlIFtTZWxlY3Rvcl0gY29ycmVzcG9uZGluZyB0byB0aGUgaW52b2NhdGlvbiBvciBnZXR0ZXIvc2V0dGVyCiAgLy8vIGFjY2VzcyBvZiBbbm9kZV0uCiAgU2VsZWN0b3IgZ2V0U2VsZWN0b3IoaXIuRXhwcmVzc2lvbiBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtNZW1iZXJFbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1lbWJlciBbbm9kZV0uCiAgTWVtYmVyRW50aXR5IGdldE1lbWJlcihpci5NZW1iZXIgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbRnVuY3Rpb25FbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb2NlZHVyZSBbbm9kZV0uCiAgRnVuY3Rpb25FbnRpdHkgZ2V0TWV0aG9kKGlyLlByb2NlZHVyZSBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtDb25zdHJ1Y3RvckVudGl0eV0gY29ycmVzcG9uZGluZyB0byB0aGUgZ2VuZXJhdGl2ZSBvciBmYWN0b3J5CiAgLy8vIGNvbnN0cnVjdG9yIFtub2RlXS4KICBDb25zdHJ1Y3RvckVudGl0eSBnZXRDb25zdHJ1Y3Rvcihpci5NZW1iZXIgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbRmllbGRFbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkIFtub2RlXS4KICBGaWVsZEVudGl0eSBnZXRGaWVsZChpci5GaWVsZCBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtDbGFzc0VudGl0eV0gY29ycmVzcG9uZGluZyB0byB0aGUgY2xhc3MgW25vZGVdLgogIENsYXNzRW50aXR5IGdldENsYXNzKGlyLkNsYXNzIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW1R5cGVkZWZUeXBlXSBjb3JyZXNwb25kaW5nIHRvIHJhdyB0eXBlIG9mIHRoZSB0eXBlZGVmIFtub2RlXS4KICBUeXBlZGVmVHlwZSBnZXRUeXBlZGVmVHlwZShpci5UeXBlZGVmIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgc3VwZXIgW01lbWJlckVudGl0eV0gZm9yIGEgc3VwZXIgaW52b2NhdGlvbiwgZ2V0IG9yIHNldCBvZgogIC8vLyBbbmFtZV0gZnJvbSB0aGUgbWVtYmVyIFtjb250ZXh0XS4KICBNZW1iZXJFbnRpdHkgZ2V0U3VwZXJNZW1iZXIoTWVtYmVyRW50aXR5IGNvbnRleHQsIGlyLk5hbWUgbmFtZSwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZX0pOwoKICAvLy8gUmV0dXJucyB0aGUgYG5vU3VjaE1ldGhvZGAgW0Z1bmN0aW9uRW50aXR5XSBjYWxsIGZyb20gYQogIC8vLyBgc3VwZXIubm9TdWNoTWV0aG9kYCBpbnZvY2F0aW9uIHdpdGhpbiBbY2xzXS4KICBGdW5jdGlvbkVudGl0eSBnZXRTdXBlck5vU3VjaE1ldGhvZChDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gUmV0dXJucyB0aGUgW05hbWVdIGNvcnJlc3BvbmRpbmcgdG8gW25hbWVdLgogIE5hbWUgZ2V0TmFtZShpci5OYW1lIG5hbWUpOwoKICAvLy8gQ29tcHV0ZXMgdGhlIFtuYXRpdmUuTmF0aXZlQmVoYXZpb3JdIGZvciBhIGNhbGwgdG8gdGhlIFtKU10gZnVuY3Rpb24uCiAgTmF0aXZlQmVoYXZpb3IgZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0NhbGwoaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKTsKCiAgLy8vIENvbXB1dGVzIHRoZSBbbmF0aXZlLk5hdGl2ZUJlaGF2aW9yXSBmb3IgYSBjYWxsIHRvIHRoZSBbSlNfQlVJTFRJTl0KICAvLy8gZnVuY3Rpb24uCiAgTmF0aXZlQmVoYXZpb3IgZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0J1aWx0aW5DYWxsKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSk7CgogIC8vLyBDb21wdXRlcyB0aGUgW25hdGl2ZS5OYXRpdmVCZWhhdmlvcl0gZm9yIGEgY2FsbCB0byB0aGUKICAvLy8gW0pTX0VNQkVEREVEX0dMT0JBTF0gZnVuY3Rpb24uCiAgTmF0aXZlQmVoYXZpb3IgZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0VtYmVkZGVkR2xvYmFsQ2FsbCgKICAgICAgaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKTsKCiAgLy8vIENvbXB1dGVzIHRoZSBbQ29uc3RhbnRWYWx1ZV0gZm9yIHRoZSBjb25zdGFudCBbZXhwcmVzc2lvbl0uCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTW92ZSB0byBbS2VybmVsVG9FbGVtZW50TWFwRm9yQnVpbGRpbmddLiBUaGlzIGlzIG9ubHkKICAvLyB1c2VkIGluIGltcGFjdCBidWlsZGVyIGZvciBzeW1ib2wgY29uc3RhbnRzLgogIENvbnN0YW50VmFsdWUgZ2V0Q29uc3RhbnRWYWx1ZShpci5FeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIHtib29sIHJlcXVpcmVDb25zdGFudDogdHJ1ZSwgYm9vbCBpbXBsaWNpdE51bGw6IGZhbHNlfSk7CgogIC8vLyBSZXR1cm4gdGhlIFtJbXBvcnRFbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gW25vZGVdLgogIEltcG9ydEVudGl0eSBnZXRJbXBvcnQoaXIuTGlicmFyeURlcGVuZGVuY3kgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBkZWZpbml0aW9uIGluZm9ybWF0aW9uIGZvciBbY2xzXS4KICBDbGFzc0RlZmluaXRpb24gZ2V0Q2xhc3NEZWZpbml0aW9uKGNvdmFyaWFudCBDbGFzc0VudGl0eSBjbHMpOwoKICAvLy8gW0VsZW1lbnRFbnZpcm9ubWVudF0gZm9yIGxpYnJhcnksIGNsYXNzIGFuZCBtZW1iZXIgbG9va3VwLgogIEpFbGVtZW50RW52aXJvbm1lbnQgZ2V0IGVsZW1lbnRFbnZpcm9ubWVudDsKCiAgLy8vIFJldHVybnMgdGhlIGxpc3Qgb2YgW0RhcnRUeXBlXXMgY29ycmVzcG9uZGluZyB0byBbdHlwZXNdLgogIExpc3Q8RGFydFR5cGU+IGdldERhcnRUeXBlcyhMaXN0PGlyLkRhcnRUeXBlPiB0eXBlcyk7CgogIC8vLyBSZXR1cm5zIHRoZSBkZWZpbml0aW9uIGluZm9ybWF0aW9uIGZvciBbbWVtYmVyXS4KICBNZW1iZXJEZWZpbml0aW9uIGdldE1lbWJlckRlZmluaXRpb24oTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBbaXIuTWVtYmVyXSBjb250YWluaW5nIHRoZSBkZWZpbml0aW9uIG9mIFttZW1iZXJdLCBpZiBhbnkuCiAgaXIuTWVtYmVyIGdldE1lbWJlckNvbnRleHROb2RlKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiBgdGhpc2AgaW4gW21lbWJlcl0sIG9yIGBudWxsYCBpZiBtZW1iZXIgaXMgZGVmaW5lZCBpbgogIC8vLyBhIHN0YXRpYyBjb250ZXh0LgogIEludGVyZmFjZVR5cGUgZ2V0TWVtYmVyVGhpc1R5cGUoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBSZXR1cm5zIGhvdyBbbWVtYmVyXSBoYXMgYWNjZXNzIHRvIHR5cGUgdmFyaWFibGVzIG9mIHRoZSB0aGlzIHR5cGUKICAvLy8gcmV0dXJuZWQgYnkgW2dldE1lbWJlclRoaXNUeXBlXS4KICBDbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyBnZXRDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzc0Zvck1lbWJlcigKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBbTGlicmFyeUVudGl0eV0gY29ycmVzcG9uZGluZyB0byB0aGUgbGlicmFyeSBbbm9kZV0uCiAgTGlicmFyeUVudGl0eSBnZXRMaWJyYXJ5KGlyLkxpYnJhcnkgbm9kZSk7CgogIC8vLyBSZXR1cm5zIGEgW1NwYW5uYWJsZV0gZm9yIGEgbWVzc2FnZSBwb2ludGluZyB0byB0aGUgSVIgW25vZGVdIGluIHRoZQogIC8vLyBjb250ZXh0IG9mIFttZW1iZXJdLgogIFNwYW5uYWJsZSBnZXRTcGFubmFibGUoTWVtYmVyRW50aXR5IG1lbWJlciwgaXIuTm9kZSBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIGNvbnN0cnVjdG9yIGJvZHkgZW50aXR5IGNvcnJlc3BvbmRpbmcgdG8gW2NvbnN0cnVjdG9yXS4KICBGdW5jdGlvbkVudGl0eSBnZXRDb25zdHJ1Y3RvckJvZHkoaXIuQ29uc3RydWN0b3Igbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBjb25zdHJ1Y3RvciBib2R5IGVudGl0eSBjb3JyZXNwb25kaW5nIHRvIFtmdW5jdGlvbl0uCiAgSkdlbmVyYXRvckJvZHkgZ2V0R2VuZXJhdG9yQm9keShGdW5jdGlvbkVudGl0eSBmdW5jdGlvbik7CgogIC8vLyBNYWtlIGEgcmVjb3JkIHRvIGVuc3VyZSB2YXJpYWJsZXMgdGhhdCBhcmUgYXJlIGRlY2xhcmVkIGluIG9uZSBzY29wZSBhbmQKICAvLy8gbW9kaWZpZWQgaW4gYW5vdGhlciBnZXQgdGhlaXIgdmFsdWVzIHVwZGF0ZWQgY29ycmVjdGx5LgogIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBtYWtlUmVjb3JkQ29udGFpbmVyKAogICAgICBLZXJuZWxTY29wZUluZm8gaW5mbywgTWVtYmVyRW50aXR5IG1lbWJlciwgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwKTsKCiAgLy8vIFJldHVybnMgYSBwcm92aWRlciBmb3Igc3RhdGljIHR5cGVzIGZvciBbbWVtYmVyXS4KICBTdGF0aWNUeXBlUHJvdmlkZXIgZ2V0U3RhdGljVHlwZVByb3ZpZGVyKE1lbWJlckVudGl0eSBtZW1iZXIpOwp9CgovLy8gSW50ZXJmYWNlIGZvciB0eXBlIGluZmVyZW5jZSByZXN1bHRzIGZvciBrZXJuZWwgSVIgbm9kZXMuCmFic3RyYWN0IGNsYXNzIEtlcm5lbFRvVHlwZUluZmVyZW5jZU1hcCB7CiAgLy8vIFJldHVybnMgdGhlIGluZmVycmVkIHJldHVybiB0eXBlIG9mIFtmdW5jdGlvbl0uCiAgQWJzdHJhY3RWYWx1ZSBnZXRSZXR1cm5UeXBlT2YoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pOwoKICAvLy8gUmV0dXJucyB0aGUgaW5mZXJyZWQgcmVjZWl2ZXIgdHlwZSBvZiB0aGUgZHluYW1pYyBbaW52b2NhdGlvbl0uCiAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGVPZkludm9jYXRpb24oCiAgICAgIGlyLk1ldGhvZEludm9jYXRpb24gaW52b2NhdGlvbiwgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKTsKCiAgLy8vIFJldHVybnMgdGhlIGluZmVycmVkIHJlY2VpdmVyIHR5cGUgb2YgdGhlIGR5bmFtaWMgW3JlYWRdLgogIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXJUeXBlT2ZHZXQoaXIuUHJvcGVydHlHZXQgcmVhZCk7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCByZWNlaXZlciB0eXBlIG9mIHRoZSBkaXJlY3QgW3JlYWRdLgogIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXJUeXBlT2ZEaXJlY3RHZXQoaXIuRGlyZWN0UHJvcGVydHlHZXQgcmVhZCk7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCByZWNlaXZlciB0eXBlIG9mIHRoZSBkeW5hbWljIFt3cml0ZV0uCiAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGVPZlNldCgKICAgICAgaXIuUHJvcGVydHlTZXQgd3JpdGUsIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbik7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCB0eXBlIG9mIFtsaXN0TGl0ZXJhbF0uCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZMaXN0TGl0ZXJhbCgKICAgICAgaXIuTGlzdExpdGVyYWwgbGlzdExpdGVyYWwsIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbik7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCB0eXBlIG9mIGl0ZXJhdG9yIGluIFtmb3JJblN0YXRlbWVudF0uCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZJdGVyYXRvcihpci5Gb3JJblN0YXRlbWVudCBmb3JJblN0YXRlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCB0eXBlIG9mIGBjdXJyZW50YCBpbiBbZm9ySW5TdGF0ZW1lbnRdLgogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JDdXJyZW50KGlyLkZvckluU3RhdGVtZW50IGZvckluU3RhdGVtZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIGluZmVycmVkIHR5cGUgb2YgYG1vdmVOZXh0YCBpbiBbZm9ySW5TdGF0ZW1lbnRdLgogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JNb3ZlTmV4dChpci5Gb3JJblN0YXRlbWVudCBmb3JJblN0YXRlbWVudCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZm9ySW5TdGF0ZW1lbnRdIGlzIGluZmVycmVkIHRvIGJlIGEgSmF2YVNjcmlwdAogIC8vLyBpbmRleGFibGUgaXRlcmF0b3IuCiAgYm9vbCBpc0pzSW5kZXhhYmxlSXRlcmF0b3IoaXIuRm9ySW5TdGF0ZW1lbnQgZm9ySW5TdGF0ZW1lbnQsCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbik7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCBpbmRleCB0eXBlIG9mIFtmb3JJblN0YXRlbWVudF0uCiAgQWJzdHJhY3RWYWx1ZSBpbmZlcnJlZEluZGV4VHlwZShpci5Gb3JJblN0YXRlbWVudCBmb3JJblN0YXRlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCB0eXBlIG9mIFttZW1iZXJdLgogIEFic3RyYWN0VmFsdWUgZ2V0SW5mZXJyZWRUeXBlT2YoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCB0eXBlIG9mIHRoZSBbcGFyYW1ldGVyXS4KICBBYnN0cmFjdFZhbHVlIGdldEluZmVycmVkVHlwZU9mUGFyYW1ldGVyKExvY2FsIHBhcmFtZXRlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBpbmZlcnJlZCByZXN1bHQgdHlwZSBvZiBhIGR5bmFtaWMgW3NlbGVjdG9yXSBhY2Nlc3Mgb24gdGhlCiAgLy8vIFtyZWNlaXZlcl0uCiAgQWJzdHJhY3RWYWx1ZSByZXN1bHRUeXBlT2ZTZWxlY3RvcihTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlcik7CgogIC8vLyBSZXR1cm5zIHRoZSByZXR1cm5lZCB0eXBlIGFubm90YXRpb24gaW4gdGhlIFtuYXRpdmVCZWhhdmlvcl0uCiAgQWJzdHJhY3RWYWx1ZSB0eXBlRnJvbU5hdGl2ZUJlaGF2aW9yKAogICAgICBOYXRpdmVCZWhhdmlvciBuYXRpdmVCZWhhdmlvciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKfQoKLy8vIE1hcCBmcm9tIGtlcm5lbCBJUiBub2RlcyB0byBsb2NhbCBlbnRpdGllcy4KYWJzdHJhY3QgY2xhc3MgS2VybmVsVG9Mb2NhbHNNYXAgewogIC8vLyBUaGUgbWVtYmVyIGN1cnJlbnRseSBiZWluZyBidWlsdC4KICBNZW1iZXJFbnRpdHkgZ2V0IGN1cnJlbnRNZW1iZXI7CgogIC8vLyBSZXR1cm5zIHRoZSBbTG9jYWxdIGZvciBbbm9kZV0uCiAgTG9jYWwgZ2V0TG9jYWxWYXJpYWJsZShpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpOwoKICBMb2NhbCBnZXRMb2NhbFR5cGVWYXJpYWJsZSgKICAgICAgaXIuVHlwZVBhcmFtZXRlclR5cGUgbm9kZSwgSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCk7CgogIC8vLyBSZXR1cm5zIHRoZSBbaXIuRnVuY3Rpb25Ob2RlXSB0aGF0IGRlY2xhcmVkIFtwYXJhbWV0ZXJdLgogIGlyLkZ1bmN0aW9uTm9kZSBnZXRGdW5jdGlvbk5vZGVGb3JQYXJhbWV0ZXIoTG9jYWwgcGFyYW1ldGVyKTsKCiAgLy8vIFJldHVybnMgdGhlIFtEYXJ0VHlwZV0gb2YgW2xvY2FsXS4KICBEYXJ0VHlwZSBnZXRMb2NhbFR5cGUoSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgTG9jYWwgbG9jYWwpOwoKICAvLy8gUmV0dXJucyB0aGUgW0p1bXBUYXJnZXRdIGZvciB0aGUgYnJlYWsgc3RhdGVtZW50IFtub2RlXS4KICBKdW1wVGFyZ2V0IGdldEp1bXBUYXJnZXRGb3JCcmVhayhpci5CcmVha1N0YXRlbWVudCBub2RlKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtub2RlXSBzaG91bGQgZ2VuZXJhdGUgYSBgY29udGludWVgIHRvIGl0cyBbSnVtcFRhcmdldF0uCiAgYm9vbCBnZW5lcmF0ZUNvbnRpbnVlRm9yQnJlYWsoaXIuQnJlYWtTdGF0ZW1lbnQgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbSnVtcFRhcmdldF0gZGVmaW5lZCBieSB0aGUgbGFiZWxsZWQgc3RhdGVtZW50IFtub2RlXSBvcgogIC8vLyBgbnVsbGAgaWYgW25vZGVdIGlzIG5vdCBhIGp1bXAgdGFyZ2V0LgogIEp1bXBUYXJnZXQgZ2V0SnVtcFRhcmdldEZvckxhYmVsKGlyLkxhYmVsZWRTdGF0ZW1lbnQgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbSnVtcFRhcmdldF0gZGVmaW5lZCBieSB0aGUgc3dpdGNoIHN0YXRlbWVudCBbbm9kZV0gb3IgYG51bGxgCiAgLy8vIGlmIFtub2RlXSBpcyBub3QgYSBqdW1wIHRhcmdldC4KICBKdW1wVGFyZ2V0IGdldEp1bXBUYXJnZXRGb3JTd2l0Y2goaXIuU3dpdGNoU3RhdGVtZW50IG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0p1bXBUYXJnZXRdIGZvciB0aGUgY29udGludWUgc3dpdGNoIHN0YXRlbWVudCBbbm9kZV0uCiAgSnVtcFRhcmdldCBnZXRKdW1wVGFyZ2V0Rm9yQ29udGludWVTd2l0Y2goaXIuQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbSnVtcFRhcmdldF0gZGVmaW5lZCBieSB0aGUgc3dpdGNoIGNhc2UgW25vZGVdIG9yIGBudWxsYAogIC8vLyBpZiBbbm9kZV0gaXMgbm90IGEganVtcCB0YXJnZXQuCiAgSnVtcFRhcmdldCBnZXRKdW1wVGFyZ2V0Rm9yU3dpdGNoQ2FzZShpci5Td2l0Y2hDYXNlIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0p1bXBUYXJnZXRdIGRlZmluZWQgdGhlIGRvIHN0YXRlbWVudCBbbm9kZV0gb3IgYG51bGxgCiAgLy8vIGlmIFtub2RlXSBpcyBub3QgYSBqdW1wIHRhcmdldC4KICBKdW1wVGFyZ2V0IGdldEp1bXBUYXJnZXRGb3JEbyhpci5Eb1N0YXRlbWVudCBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtKdW1wVGFyZ2V0XSBkZWZpbmVkIGJ5IHRoZSBmb3Igc3RhdGVtZW50IFtub2RlXSBvciBgbnVsbGAKICAvLy8gaWYgW25vZGVdIGlzIG5vdCBhIGp1bXAgdGFyZ2V0LgogIEp1bXBUYXJnZXQgZ2V0SnVtcFRhcmdldEZvckZvcihpci5Gb3JTdGF0ZW1lbnQgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbSnVtcFRhcmdldF0gZGVmaW5lZCBieSB0aGUgZm9yLWluIHN0YXRlbWVudCBbbm9kZV0gb3IgYG51bGxgCiAgLy8vIGlmIFtub2RlXSBpcyBub3QgYSBqdW1wIHRhcmdldC4KICBKdW1wVGFyZ2V0IGdldEp1bXBUYXJnZXRGb3JGb3JJbihpci5Gb3JJblN0YXRlbWVudCBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtKdW1wVGFyZ2V0XSBkZWZpbmVkIGJ5IHRoZSB3aGlsZSBzdGF0ZW1lbnQgW25vZGVdIG9yIGBudWxsYAogIC8vLyBpZiBbbm9kZV0gaXMgbm90IGEganVtcCB0YXJnZXQuCiAgSnVtcFRhcmdldCBnZXRKdW1wVGFyZ2V0Rm9yV2hpbGUoaXIuV2hpbGVTdGF0ZW1lbnQgbm9kZSk7CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0tlcm5lbFRvTG9jYWxzTWFwXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7Cn0KCi8vLyBSZXR1cm5zIHRoZSBbaXIuRnVuY3Rpb25Ob2RlXSB0aGF0IGRlZmluZXMgW21lbWJlcl0gb3IgYG51bGxgIGlmIFttZW1iZXJdCi8vLyBpcyBub3QgYSBjb25zdHJ1Y3RvciwgbWV0aG9kIG9yIGxvY2FsIGZ1bmN0aW9uLgppci5GdW5jdGlvbk5vZGUgZ2V0RnVuY3Rpb25Ob2RlKAogICAgSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgTWVtYmVyRW50aXR5IG1lbWJlcikgewogIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihtZW1iZXIpOwogIHN3aXRjaCAoZGVmaW5pdGlvbi5raW5kKSB7CiAgICBjYXNlIE1lbWJlcktpbmQucmVndWxhcjoKICAgICAgaXIuTWVtYmVyIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgIHJldHVybiBub2RlLmZ1bmN0aW9uOwogICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yOgogICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keToKICAgICAgaXIuTWVtYmVyIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgIHJldHVybiBub2RlLmZ1bmN0aW9uOwogICAgY2FzZSBNZW1iZXJLaW5kLmNsb3N1cmVDYWxsOgogICAgICBpci5Mb2NhbEZ1bmN0aW9uIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgIHJldHVybiBub2RlLmZ1bmN0aW9uOwogICAgZGVmYXVsdDoKICB9CiAgcmV0dXJuIG51bGw7Cn0KCi8vIFRPRE8oam9obm5pd2ludGhlcixlZm9ydHVuYSk6IEFkZCBtb3JlIHdoZW4gbmVlZGVkLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTaG91bGQgd2Ugc3BsaXQgcmVndWxhciBpbnRvIG1ldGhvZCwgZmllbGQsIGV0Yy4/CmVudW0gTWVtYmVyS2luZCB7CiAgLy8vIEEgcmVndWxhciBtZW1iZXIgZGVmaW5lZCBieSBhbiBbaXIuTm9kZV0uCiAgcmVndWxhciwKCiAgLy8vIEEgY29uc3RydWN0b3Igd2hvc2UgaW5pdGlhbGl6ZXIgaXMgZGVmaW5lZCBieSBhbiBbaXIuQ29uc3RydWN0b3JdIG5vZGUuCiAgY29uc3RydWN0b3IsCgogIC8vLyBBIGNvbnN0cnVjdG9yIHdob3NlIGJvZHkgaXMgZGVmaW5lZCBieSBhbiBbaXIuQ29uc3RydWN0b3JdIG5vZGUuCiAgY29uc3RydWN0b3JCb2R5LAoKICAvLy8gQSBjbG9zdXJlIGNsYXNzIGBjYWxsYCBtZXRob2Qgd2hvc2UgYm9keSBpcyBkZWZpbmVkIGJ5IGFuCiAgLy8vIFtpci5Mb2NhbEZ1bmN0aW9uXS4KICBjbG9zdXJlQ2FsbCwKCiAgLy8vIEEgZmllbGQgY29ycmVzcG9uZGluZyB0byBhIGNhcHR1cmVkIHZhcmlhYmxlIGluIHRoZSBjbG9zdXJlLiBJdCBkb2VzIG5vdAogIC8vLyBoYXZlIGEgY29ycmVzcG9uZGluZyBpci5Ob2RlLgogIGNsb3N1cmVGaWVsZCwKCiAgLy8vIEEgbWV0aG9kIHRoYXQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gKGluIHRoaXMgY2FzZSB0aGUgdHlwZSBvZgogIC8vLyB0aGUgY2xvc3VyZSBjbGFzcy4gSXQgZG9lcyBub3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgaXIuTm9kZSBvciBhIG1ldGhvZAogIC8vLyBib2R5LgogIHNpZ25hdHVyZSwKCiAgLy8vIEEgc2VwYXJhdGVkIGJvZHkgb2YgYSBnZW5lcmF0b3IgKHN5bmMqL2FzeW5jL2FzeW5jKikgZnVuY3Rpb24uCiAgZ2VuZXJhdG9yQm9keSwKfQoKLy8vIERlZmluaXRpb24gaW5mb3JtYXRpb24gZm9yIGEgW01lbWJlckVudGl0eV0uCmFic3RyYWN0IGNsYXNzIE1lbWJlckRlZmluaXRpb24gewogIC8vLyBUaGUga2luZCBvZiB0aGUgZGVmaW5lZCBtZW1iZXIuIFRoaXMgZGV0ZXJtaW5lcyB0aGUgc2VtYW50aWNzIG9mIFtub2RlXS4KICBNZW1iZXJLaW5kIGdldCBraW5kOwoKICAvLy8gVGhlIGRlZmluaW5nIFtpci5Ob2RlXSBmb3IgdGhpcyBtZW1iZXIsIGlmIHN1cHBvcnRlZCBieSBpdHMgW2tpbmRdLgogIC8vLwogIC8vLyBGb3IgYSByZWd1bGFyIGNsYXNzIHRoaXMgaXMgdGhlIFtpci5DbGFzc10gbm9kZS4gRm9yIGNsb3N1cmUgY2xhc3NlcyB0aGlzCiAgLy8vIG1pZ2h0IGJlIGFuIFtpci5GdW5jdGlvbkV4cHJlc3Npb25dIG5vZGUgaWYgbmVlZGVkLgogIGlyLk5vZGUgZ2V0IG5vZGU7CgogIC8vLyBUaGUgY2Fub25pY2FsIGxvY2F0aW9uIG9mIFttZW1iZXJdLiBUaGlzIGlzIHVzZWQgZm9yIHNvcnRpbmcgdGhlIG1lbWJlcnMKICAvLy8gaW4gdGhlIGVtaXR0ZWQgY29kZS4KICBTb3VyY2VTcGFuIGdldCBsb2NhdGlvbjsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtNZW1iZXJEZWZpbml0aW9uXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IE1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBNZW1iZXJLaW5kIGtpbmQgPSBzb3VyY2UucmVhZEVudW0oTWVtYmVyS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICAgIHJldHVybiBuZXcgUmVndWxhck1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvcjoKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keToKICAgICAgY2FzZSBNZW1iZXJLaW5kLnNpZ25hdHVyZToKICAgICAgY2FzZSBNZW1iZXJLaW5kLmdlbmVyYXRvckJvZHk6CiAgICAgICAgcmV0dXJuIG5ldyBTcGVjaWFsTWVtYmVyRGVmaW5pdGlvbi5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlLCBraW5kKTsKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNsb3N1cmVDYWxsOgogICAgICBjYXNlIE1lbWJlcktpbmQuY2xvc3VyZUZpZWxkOgogICAgICAgIHJldHVybiBuZXcgQ2xvc3VyZU1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwga2luZCk7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBNZW1iZXJLaW5kICRraW5kIik7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtNZW1iZXJEZWZpbml0aW9uXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7Cn0KCmVudW0gQ2xhc3NLaW5kIHsKICByZWd1bGFyLAogIGNsb3N1cmUsCiAgLy8gVE9ETyhlZm9ydHVuYSwgam9obm5pd2ludGhlcik6IFJlY29yZCBpcyBub3QgYSBjbGFzcywgYnV0IGlzCiAgLy8gbWFzcXVlcmFkaW5nIGFzIG9uZSBjdXJyZW50bHkgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIG9sZCBlbGVtZW50IG1vZGVsLgogIHJlY29yZCwKfQoKLy8vIEEgbWVtYmVyIGRpcmVjdGx5IGRlZmluZWQgYnkgaXRzIFtpci5NZW1iZXJdIG5vZGUuCmNsYXNzIFJlZ3VsYXJNZW1iZXJEZWZpbml0aW9uIGltcGxlbWVudHMgTWVtYmVyRGVmaW5pdGlvbiB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtSZWd1bGFyTWVtYmVyRGVmaW5pdGlvbl0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdyZWd1bGFyLW1lbWJlci1kZWZpbml0aW9uJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaXIuTWVtYmVyIG5vZGU7CgogIFJlZ3VsYXJNZW1iZXJEZWZpbml0aW9uKHRoaXMubm9kZSk7CgogIGZhY3RvcnkgUmVndWxhck1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLk1lbWJlciBub2RlID0gc291cmNlLnJlYWRNZW1iZXJOb2RlKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IFJlZ3VsYXJNZW1iZXJEZWZpbml0aW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oTWVtYmVyS2luZC5yZWd1bGFyKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlKG5vZGUpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZVNwYW4gZ2V0IGxvY2F0aW9uID0+IGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBNZW1iZXJLaW5kIGdldCBraW5kID0+IE1lbWJlcktpbmQucmVndWxhcjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1JlZ3VsYXJNZW1iZXJEZWZpbml0aW9uKGtpbmQ6JGtpbmQsJwogICAgICAnbm9kZTokbm9kZSxsb2NhdGlvbjokbG9jYXRpb24pJzsKfQoKLy8vIFRoZSBkZWZpbml0aW9uIG9mIGEgc3BlY2lhbCBraW5kIG9mIG1lbWJlcgpjbGFzcyBTcGVjaWFsTWVtYmVyRGVmaW5pdGlvbiBpbXBsZW1lbnRzIE1lbWJlckRlZmluaXRpb24gewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbU3BlY2lhbE1lbWJlckRlZmluaXRpb25dIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnc3BlY2lhbC1tZW1iZXItZGVmaW5pdGlvbic7CgogIEBvdmVycmlkZQogIGZpbmFsIGlyLlRyZWVOb2RlIG5vZGU7CiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyS2luZCBraW5kOwoKICBTcGVjaWFsTWVtYmVyRGVmaW5pdGlvbih0aGlzLm5vZGUsIHRoaXMua2luZCk7CgogIGZhY3RvcnkgU3BlY2lhbE1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLlRyZWVOb2RlIG5vZGUgPSBzb3VyY2UucmVhZFRyZWVOb2RlKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IFNwZWNpYWxNZW1iZXJEZWZpbml0aW9uKG5vZGUsIGtpbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oa2luZCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlVHJlZU5vZGUobm9kZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlU3BhbiBnZXQgbG9jYXRpb24gPT4gY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdTcGVjaWFsTWVtYmVyRGVmaW5pdGlvbihraW5kOiRraW5kLCcKICAgICAgJ25vZGU6JG5vZGUsbG9jYXRpb246JGxvY2F0aW9uKSc7Cn0KCi8vLyBEZWZpbml0aW9uIGluZm9ybWF0aW9uIGZvciBhIFtDbGFzc0VudGl0eV0uCmFic3RyYWN0IGNsYXNzIENsYXNzRGVmaW5pdGlvbiB7CiAgLy8vIFRoZSBraW5kIG9mIHRoZSBkZWZpbmVkIGNsYXNzLiBUaGlzIGRldGVybWluZXMgdGhlIHNlbWFudGljcyBvZiBbbm9kZV0uCiAgQ2xhc3NLaW5kIGdldCBraW5kOwoKICAvLy8gVGhlIGRlZmluaW5nIFtpci5Ob2RlXSBmb3IgdGhpcyBjbGFzcywgaWYgc3VwcG9ydGVkIGJ5IGl0cyBba2luZF0uCiAgaXIuTm9kZSBnZXQgbm9kZTsKCiAgLy8vIFRoZSBjYW5vbmljYWwgbG9jYXRpb24gb2YgW2Nsc10uIFRoaXMgaXMgdXNlZCBmb3Igc29ydGluZyB0aGUgY2xhc3NlcwogIC8vLyBpbiB0aGUgZW1pdHRlZCBjb2RlLgogIFNvdXJjZVNwYW4gZ2V0IGxvY2F0aW9uOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0NsYXNzRGVmaW5pdGlvbl0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBDbGFzc0RlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBDbGFzc0tpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShDbGFzc0tpbmQudmFsdWVzKTsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIENsYXNzS2luZC5yZWd1bGFyOgogICAgICAgIHJldHVybiBuZXcgUmVndWxhckNsYXNzRGVmaW5pdGlvbi5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBDbGFzc0tpbmQuY2xvc3VyZToKICAgICAgICByZXR1cm4gbmV3IENsb3N1cmVDbGFzc0RlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgQ2xhc3NLaW5kLnJlY29yZDoKICAgICAgICByZXR1cm4gbmV3IFJlY29yZENvbnRhaW5lckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBDbGFzc0tpbmQgJGtpbmQiKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0NsYXNzRGVmaW5pdGlvbl0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspOwp9CgovLy8gQSBjbGFzcyBkaXJlY3RseSBkZWZpbmVkIGJ5IGl0cyBbaXIuQ2xhc3NdIG5vZGUuCmNsYXNzIFJlZ3VsYXJDbGFzc0RlZmluaXRpb24gaW1wbGVtZW50cyBDbGFzc0RlZmluaXRpb24gewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbUmVndWxhckNsYXNzRGVmaW5pdGlvbl0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdyZWd1bGFyLWNsYXNzLWRlZmluaXRpb24nOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBpci5DbGFzcyBub2RlOwoKICBSZWd1bGFyQ2xhc3NEZWZpbml0aW9uKHRoaXMubm9kZSk7CgogIGZhY3RvcnkgUmVndWxhckNsYXNzRGVmaW5pdGlvbi5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuQ2xhc3Mgbm9kZSA9IHNvdXJjZS5yZWFkQ2xhc3NOb2RlKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IFJlZ3VsYXJDbGFzc0RlZmluaXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShraW5kKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVDbGFzc05vZGUobm9kZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlU3BhbiBnZXQgbG9jYXRpb24gPT4gY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSk7CgogIEBvdmVycmlkZQogIENsYXNzS2luZCBnZXQga2luZCA9PiBDbGFzc0tpbmQucmVndWxhcjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1JlZ3VsYXJDbGFzc0RlZmluaXRpb24oa2luZDoka2luZCwnCiAgICAgICdub2RlOiRub2RlLGxvY2F0aW9uOiRsb2NhdGlvbiknOwp9CgovLy8gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZXIgZm9yIFtmaWVsZF0uCi8vLwovLy8gSWYgW2ZpZWxkXSBpcyBhbiBpbnN0YW5jZSBmaWVsZCB3aXRoIGEgbnVsbCBsaXRlcmFsIGluaXRpYWxpemVyIGBudWxsYCBpcwovLy8gcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgaW5pdGlhbGl6ZXIgb2YgdGhlIFtpci5GaWVsZF0gaXMgcmV0dXJuZWQuCmlyLk5vZGUgZ2V0RmllbGRJbml0aWFsaXplcihKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBGaWVsZEVudGl0eSBmaWVsZCkgewogIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihmaWVsZCk7CiAgaXIuRmllbGQgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICBpZiAobm9kZS5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICFub2RlLmlzRmluYWwgJiYKICAgICAgbm9kZS5pbml0aWFsaXplciBpcyBpci5OdWxsTGl0ZXJhbCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiBub2RlLmluaXRpYWxpemVyOwp9Cgp2b2lkIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQnlGdW5jdGlvbk5vZGUoCiAgICBpci5GdW5jdGlvbk5vZGUgbm9kZSwKICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICB2b2lkIGYoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIsIHtib29sIGlzT3B0aW9uYWwsIGJvb2wgaXNFbGlkZWR9KSwKICAgIHtib29sIHVzZU5hdGl2ZU9yZGVyaW5nOiBmYWxzZX0pIHsKICBmb3IgKGludCBwb3NpdGlvbiA9IDA7CiAgICAgIHBvc2l0aW9uIDwgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7CiAgICAgIHBvc2l0aW9uKyspIHsKICAgIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW3Bvc2l0aW9uXTsKICAgIGYodmFyaWFibGUsCiAgICAgICAgaXNPcHRpb25hbDogcG9zaXRpb24gPj0gcGFyYW1ldGVyU3RydWN0dXJlLnJlcXVpcmVkUGFyYW1ldGVycywKICAgICAgICBpc0VsaWRlZDogcG9zaXRpb24gPj0gcGFyYW1ldGVyU3RydWN0dXJlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKTsKICB9CgogIGlmIChub2RlLm5hbWVkUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICByZXR1cm47CiAgfQoKICBMaXN0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycyA9IG5vZGUubmFtZWRQYXJhbWV0ZXJzLnRvTGlzdCgpOwogIGlmICh1c2VOYXRpdmVPcmRlcmluZykgewogICAgbmFtZWRQYXJhbWV0ZXJzLnNvcnQobmF0aXZlT3JkZXJpbmcpOwogIH0gZWxzZSB7CiAgICBuYW1lZFBhcmFtZXRlcnMuc29ydChuYW1lZE9yZGVyaW5nKTsKICB9CiAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIG5hbWVkUGFyYW1ldGVycykgewogICAgZih2YXJpYWJsZSwKICAgICAgICBpc09wdGlvbmFsOiB0cnVlLAogICAgICAgIGlzRWxpZGVkOiAhcGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycy5jb250YWlucyh2YXJpYWJsZS5uYW1lKSk7CiAgfQp9Cgp2b2lkIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyKEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLAogICAgdm9pZCBmKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyLCB7Ym9vbCBpc0VsaWRlZH0pKSB7CiAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSA9IGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZTsKCiAgdm9pZCBoYW5kbGVQYXJhbWV0ZXIoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIsCiAgICAgIHtib29sIGlzT3B0aW9uYWwsIGJvb2wgaXNFbGlkZWR9KSB7CiAgICBmKHBhcmFtZXRlciwgaXNFbGlkZWQ6IGlzRWxpZGVkKTsKICB9CgogIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihmdW5jdGlvbik7CiAgc3dpdGNoIChkZWZpbml0aW9uLmtpbmQpIHsKICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICBpci5Ob2RlIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQnlGdW5jdGlvbk5vZGUoCiAgICAgICAgICAgIG5vZGUuZnVuY3Rpb24sIHBhcmFtZXRlclN0cnVjdHVyZSwgaGFuZGxlUGFyYW1ldGVyKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3I6CiAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3JCb2R5OgogICAgICBpci5Ob2RlIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQnlGdW5jdGlvbk5vZGUoCiAgICAgICAgICAgIG5vZGUuZnVuY3Rpb24sIHBhcmFtZXRlclN0cnVjdHVyZSwgaGFuZGxlUGFyYW1ldGVyKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICAgIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQnlGdW5jdGlvbk5vZGUoCiAgICAgICAgICAgIG5vZGUuZnVuY3Rpb24sIHBhcmFtZXRlclN0cnVjdHVyZSwgaGFuZGxlUGFyYW1ldGVyKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIE1lbWJlcktpbmQuY2xvc3VyZUNhbGw6CiAgICAgIGlyLkxvY2FsRnVuY3Rpb24gbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgZm9yRWFjaE9yZGVyZWRQYXJhbWV0ZXJCeUZ1bmN0aW9uTm9kZSgKICAgICAgICAgIG5vZGUuZnVuY3Rpb24sIHBhcmFtZXRlclN0cnVjdHVyZSwgaGFuZGxlUGFyYW1ldGVyKTsKICAgICAgcmV0dXJuOwogICAgZGVmYXVsdDoKICB9CiAgZmFpbGVkQXQoZnVuY3Rpb24sICJVbmV4cGVjdGVkIGZ1bmN0aW9uIGRlZmluaXRpb24gJGRlZmluaXRpb24uIik7Cn0KglQATk48ASgBGSNMJCEhITEdKho1OCIuIyokGBcBTEIgNiYBKBcBNioBOzkBPkMBMDYBSxclNgFEOgFOGCwBRSoBSi8BURo0AUMnAUMnAVEvAU0oQh0BPjQ4ATIeAUxHAUoQTgE9JTshAUJQMjs/ATk1ATRBAUEuAUA4ATc9AU03AVAYOAFJJz8cAUctAUsbPQFKOgFHPAFPPjBPAThBAgE+KjY6AUYqUAFAOAE/RAFBI0YBMiNMAUFCAUJJAUNKAUgaPzABO0UBLTgBND0BTRJRAUQoQAIBMCMoIgEmNwEePQE/QAEpQQE/PAFROQFLLT4BUCY+AUlOAUsmPQFJJjYBTSY4AVAmPAFPJjwBNScCAU40ITZIHR0oHCElKBwhLxwNBA8CATdKEjALAU4PAUcTAUAaDwFPJBABT04MDQFFEQIBMSJPFwFKBlA6FAFPGxsBPkM6FB9HIychJU0jJE0GPwQBNCcCARELC0JPCgIBNzxRHTkBDBgBJgFKFy4VLgQBDCgoFSATBAEMQgEMLQEMPSgCAS88UR05AQwaDBkBMQE2LBcuFTQEAQwoGhUeEwQBDEIBDD0oAgEwIU4WAUkUAUwbGwE9QjgUHkYeRh1JBj4EATMnAgE1OlAdOAEMFwElAUkXLBUtBAEMKBoVHxMEAQxCAQwrAQw8KAIBKQROR0xHIx8XLBEEGwIBLBorUCcZMxRLEEdIBAEmDAQBUBsqCykEPRAaUAQCAVFBRwE5KiYEAUodHSYiL0EQCA0hJSYiL0EQKy9BEAgNIS8tPw4NBEUCAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19tb2RlbC9lbGVtZW50X21hcC5kYXJ0O3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL2luZmVycmVyX2VuZ2luZS5kYXJ0wADaVy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vLi4vY29tcGlsZXJfbmV3LmRhcnQnOwppbXBvcnQgJy4uL2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21waWxlci5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2luZmVycmVkX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ub19zdWNoX21ldGhvZF9yZWdpc3RyeS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9lbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9qc193b3JsZC5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9sb2NhbHMuZGFydCc7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NpZGVfZWZmZWN0cy5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JzsKaW1wb3J0ICdhYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnYnVpbGRlcl9rZXJuZWwuZGFydCc7CmltcG9ydCAnY2xvc3VyZV90cmFjZXIuZGFydCc7CmltcG9ydCAnZGVidWcuZGFydCcgYXMgZGVidWc7CmltcG9ydCAnbG9jYWxzX2hhbmRsZXIuZGFydCc7CmltcG9ydCAnbGlzdF90cmFjZXIuZGFydCc7CmltcG9ydCAnbWFwX3RyYWNlci5kYXJ0JzsKaW1wb3J0ICdzZXRfdHJhY2VyLmRhcnQnOwppbXBvcnQgJ3R5cGVfZ3JhcGhfZHVtcC5kYXJ0JzsKaW1wb3J0ICd0eXBlX2dyYXBoX2luZmVycmVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfZ3JhcGhfbm9kZXMuZGFydCc7CmltcG9ydCAndHlwZV9zeXN0ZW0uZGFydCc7CmltcG9ydCAndHlwZXMuZGFydCc7CgovLy8gQW4gaW5mZXJlbmNpbmcgZW5naW5lIHRoYXQgY29tcHV0ZXMgYSBjYWxsIGdyYXBoIG9mIFtUeXBlSW5mb3JtYXRpb25dIG5vZGVzCi8vLyBieSB2aXNpdGluZyB0aGUgQVNUIG9mIHRoZSBhcHBsaWNhdGlvbiwgYW5kIHRoZW4gZG9lcyB0aGUgaW5mZXJlbmNpbmcgb24gdGhlCi8vLyBncmFwaC4KYWJzdHJhY3QgY2xhc3MgSW5mZXJyZXJFbmdpbmUgewogIC8vLyBBIHNldCBvZiBzZWxlY3RvciBuYW1lcyB0aGF0IFtMaXN0XSBpbXBsZW1lbnRzLCB0aGF0IHdlIGtub3cgcmV0dXJuIHRoZWlyCiAgLy8vIGVsZW1lbnQgdHlwZS4KICBmaW5hbCBTZXQ8U2VsZWN0b3I+IHJldHVybnNMaXN0RWxlbWVudFR5cGVTZXQgPQogICAgICBuZXcgU2V0PFNlbGVjdG9yPi5mcm9tKDxTZWxlY3Rvcj5bCiAgICBuZXcgU2VsZWN0b3IuZ2V0dGVyKGNvbnN0IFB1YmxpY05hbWUoJ2ZpcnN0JykpLAogICAgbmV3IFNlbGVjdG9yLmdldHRlcihjb25zdCBQdWJsaWNOYW1lKCdsYXN0JykpLAogICAgbmV3IFNlbGVjdG9yLmdldHRlcihjb25zdCBQdWJsaWNOYW1lKCdzaW5nbGUnKSksCiAgICBuZXcgU2VsZWN0b3IuY2FsbChjb25zdCBQdWJsaWNOYW1lKCdzaW5nbGVXaGVyZScpLCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpLAogICAgbmV3IFNlbGVjdG9yLmNhbGwoY29uc3QgUHVibGljTmFtZSgnZWxlbWVudEF0JyksIENhbGxTdHJ1Y3R1cmUuT05FX0FSRyksCiAgICBuZXcgU2VsZWN0b3IuaW5kZXgoKSwKICAgIG5ldyBTZWxlY3Rvci5jYWxsKGNvbnN0IFB1YmxpY05hbWUoJ3JlbW92ZUF0JyksIENhbGxTdHJ1Y3R1cmUuT05FX0FSRyksCiAgICBuZXcgU2VsZWN0b3IuY2FsbChjb25zdCBQdWJsaWNOYW1lKCdyZW1vdmVMYXN0JyksIENhbGxTdHJ1Y3R1cmUuTk9fQVJHUykKICBdKTsKCiAgQ29tcGlsZXJPcHRpb25zIGdldCBvcHRpb25zOwoKICAvLy8gVGhlIFtKQ2xvc2VkV29ybGRdIG9uIHdoaWNoIGluZmVyZW5jZSByZWFzb25pbmcgaXMgYmFzZWQuCiAgSkNsb3NlZFdvcmxkIGdldCBjbG9zZWRXb3JsZDsKICBEaWFnbm9zdGljUmVwb3J0ZXIgZ2V0IHJlcG9ydGVyOwogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IGFic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbjsKICBDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHMgPT4gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHM7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoaXMgc2hvdWxkIGJlIHBhcnQgb2YgW0Nsb3NlZFdvcmxkXSBvcgogIC8vIFtDbG9zdXJlV29ybGRSZWZpbmVyXS4KICBOb1N1Y2hNZXRob2REYXRhIGdldCBub1N1Y2hNZXRob2REYXRhID0+IGNsb3NlZFdvcmxkLm5vU3VjaE1ldGhvZERhdGE7CgogIFR5cGVTeXN0ZW0gZ2V0IHR5cGVzOwogIE1hcDxpci5UcmVlTm9kZSwgVHlwZUluZm9ybWF0aW9uPiBnZXQgY29uY3JldGVUeXBlczsKICBJbmZlcnJlZERhdGFCdWlsZGVyIGdldCBpbmZlcnJlZERhdGFCdWlsZGVyOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgbWFpbkVsZW1lbnQ7CgogIHZvaWQgcnVuT3ZlckFsbEVsZW1lbnRzKCk7CgogIHZvaWQgYW5hbHl6ZShNZW1iZXJFbnRpdHkgbWVtYmVyKTsKICB2b2lkIGFuYWx5emVMaXN0QW5kRW5xdWV1ZShMaXN0VHlwZUluZm9ybWF0aW9uIGluZm8pOwogIHZvaWQgYW5hbHl6ZVNldEFuZEVucXVldWUoU2V0VHlwZUluZm9ybWF0aW9uIGluZm8pOwogIHZvaWQgYW5hbHl6ZU1hcEFuZEVucXVldWUoTWFwVHlwZUluZm9ybWF0aW9uIGluZm8pOwoKICAvLy8gTm90aWZpZXMgdG8gdGhlIGluZmVycmVyIHRoYXQgW2FuYWx5emVkRWxlbWVudF0gY2FuIGhhdmUgcmV0dXJuIHR5cGUKICAvLy8gW25ld1R5cGVdLiBbY3VycmVudFR5cGVdIGlzIHRoZSB0eXBlIHRoZSBpbmZlcmVuY2UgaGFzIGN1cnJlbnRseSBmb3VuZC4KICAvLy8KICAvLy8gUmV0dXJucyB0aGUgbmV3IHR5cGUgZm9yIFthbmFseXplZEVsZW1lbnRdLgogIFR5cGVJbmZvcm1hdGlvbiBhZGRSZXR1cm5UeXBlRm9yTWV0aG9kKAogICAgICBGdW5jdGlvbkVudGl0eSBlbGVtZW50LCBUeXBlSW5mb3JtYXRpb24gdW51c2VkLCBUeXBlSW5mb3JtYXRpb24gbmV3VHlwZSk7CgogIC8vLyBBcHBsaWVzIFtmXSB0byBhbGwgZWxlbWVudHMgaW4gdGhlIHVuaXZlcnNlIHRoYXQgbWF0Y2ggW3NlbGVjdG9yXSBhbmQKICAvLy8gW21hc2tdLiBJZiBbZl0gcmV0dXJucyBmYWxzZSwgYWJvcnRzIHRoZSBpdGVyYXRpb24uCiAgdm9pZCBmb3JFYWNoRWxlbWVudE1hdGNoaW5nKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSBtYXNrLCBib29sIGYoTWVtYmVyRW50aXR5IGVsZW1lbnQpKTsKCiAgLy8vIFJldHVybnMgdGhlIFtUeXBlSW5mb3JtYXRpb25dIG5vZGUgZm9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgcGFyYW1ldGVyLgogIC8vLyBJZiB0aGlzIGlzIHF1ZXJpZWQgYmVmb3JlIGl0IGlzIHNldCBieSBbc2V0RGVmYXVsdFR5cGVPZlBhcmFtZXRlcl0sIGEKICAvLy8gW1BsYWNlaG9sZGVyVHlwZUluZm9ybWF0aW9uXSBpcyByZXR1cm5lZCwgd2hpY2ggd2lsbCBsYXRlciBiZSByZXBsYWNlZAogIC8vLyBieSB0aGUgYWN0dWFsIG5vZGUgd2hlbiBbc2V0RGVmYXVsdFR5cGVPZlBhcmFtZXRlcl0gaXMgY2FsbGVkLgogIC8vLwogIC8vLyBJbnZhcmlhbnQ6IEFmdGVyIGdyYXBoIGNvbnN0cnVjdGlvbiwgbm8gW1BsYWNlaG9sZGVyVHlwZUluZm9ybWF0aW9uXSBub2RlcwogIC8vLyBzaG91bGQgYmUgcHJlc2VudCBhbmQgYSBkZWZhdWx0IHR5cGUgZm9yIGVhY2ggcGFyYW1ldGVyIHNob3VsZCBleGlzdC4KICBUeXBlSW5mb3JtYXRpb24gZ2V0RGVmYXVsdFR5cGVPZlBhcmFtZXRlcihMb2NhbCBwYXJhbWV0ZXIpOwoKICAvLy8gVGhpcyBoZWxwZXIgYnJlYWtzIGFic3RyYWN0aW9ucyBidXQgaXMgY3VycmVudGx5IHJlcXVpcmVkIHRvIHdvcmsgYXJvdW5kCiAgLy8vIHRoZSB3cm9uZyBtb2RlbGluZyBvZiBkZWZhdWx0IHZhbHVlcyBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzIG9mCiAgLy8vIHN5bnRoZXRpYyBjb25zdHJ1Y3RvcnMuCiAgLy8vCiAgLy8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSBvbmNlIGRlZmF1bHQgdmFsdWVzIG9mIHN5bnRoZXRpYyBwYXJhbWV0ZXJzCiAgLy8vIGFyZSBmaXhlZC4KICBib29sIGhhc0FscmVhZHlDb21wdXRlZFR5cGVPZlBhcmFtZXRlckRlZmF1bHQoTG9jYWwgcGFyYW1ldGVyKTsKCiAgLy8vIFNldHMgdGhlIHR5cGUgb2YgYSBwYXJhbWV0ZXIncyBkZWZhdWx0IHZhbHVlIHRvIFt0eXBlXS4gSWYgdGhlIGdsb2JhbAogIC8vLyBtYXBwaW5nIGluIFtkZWZhdWx0VHlwZU9mUGFyYW1ldGVyXSBhbHJlYWR5IGNvbnRhaW5zIGEgdHlwZSwgaXQgbXVzdCBiZQogIC8vLyBhIFtQbGFjZWhvbGRlclR5cGVJbmZvcm1hdGlvbl0sIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQuIEFsbCBpdHMgdXNlcyBhcmUKICAvLy8gdXBkYXRlZC4KICB2b2lkIHNldERlZmF1bHRUeXBlT2ZQYXJhbWV0ZXIoTG9jYWwgcGFyYW1ldGVyLCBUeXBlSW5mb3JtYXRpb24gdHlwZSwKICAgICAge2Jvb2wgaXNJbnN0YW5jZU1lbWJlcn0pOwoKICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGdldENhbGxlcnNPZkZvclRlc3RpbmcoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYWtlIHRoaXMgcHJpdmF0ZSBhZ2Fpbi4KICBHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGEgZGF0YU9mTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KTsKCiAgYm9vbCBjaGVja0lmRXhwb3Nlc1RoaXMoQ29uc3RydWN0b3JFbnRpdHkgZWxlbWVudCk7CgogIHZvaWQgcmVjb3JkRXhwb3Nlc1RoaXMoQ29uc3RydWN0b3JFbnRpdHkgZWxlbWVudCwgYm9vbCBleHBvc2VzVGhpcyk7CgogIC8vLyBSZWNvcmRzIHRoYXQgdGhlIHJldHVybiB0eXBlIFtlbGVtZW50XSBpcyBvZiB0eXBlIFt0eXBlXS4KICB2b2lkIHJlY29yZFJldHVyblR5cGUoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwgVHlwZUluZm9ybWF0aW9uIHR5cGUpOwoKICAvLy8gUmVjb3JkcyB0aGF0IFtlbGVtZW50XSBpcyBvZiB0eXBlIFt0eXBlXS4KICB2b2lkIHJlY29yZFR5cGVPZkZpZWxkKEZpZWxkRW50aXR5IGVsZW1lbnQsIFR5cGVJbmZvcm1hdGlvbiB0eXBlKTsKCiAgLy8vIFJlZ2lzdGVycyBhIGNhbGwgdG8gYXdhaXQgd2l0aCBhbiBleHByZXNzaW9uIG9mIHR5cGUgW2FyZ3VtZW50VHlwZV0gYXMKICAvLy8gYXJndW1lbnQuCiAgVHlwZUluZm9ybWF0aW9uIHJlZ2lzdGVyQXdhaXQoaXIuTm9kZSBub2RlLCBUeXBlSW5mb3JtYXRpb24gYXJndW1lbnQpOwoKICAvLy8gUmVnaXN0ZXJzIGEgY2FsbCB0byB5aWVsZCB3aXRoIGFuIGV4cHJlc3Npb24gb2YgdHlwZSBbYXJndW1lbnRUeXBlXSBhcwogIC8vLyBhcmd1bWVudC4KICBUeXBlSW5mb3JtYXRpb24gcmVnaXN0ZXJZaWVsZChpci5Ob2RlIG5vZGUsIFR5cGVJbmZvcm1hdGlvbiBhcmd1bWVudCk7CgogIC8vLyBSZWdpc3RlcnMgdGhhdCBbY2FsbGVyXSBjYWxscyBbY2xvc3VyZV0gd2l0aCBbYXJndW1lbnRzXS4KICAvLy8KICAvLy8gW3NpZGVFZmZlY3RzQnVpbGRlcl0gd2lsbCBiZSB1cGRhdGVkIHRvIGluY29ycG9yYXRlIHRoZSBwb3RlbnRpYWwgY2FsbGVlcycKICAvLy8gc2lkZSBlZmZlY3RzLgogIC8vLwogIC8vLyBbaW5Mb29wXSB0ZWxscyB3aGV0aGVyIHRoZSBjYWxsIGhhcHBlbnMgaW4gYSBsb29wLgogIFR5cGVJbmZvcm1hdGlvbiByZWdpc3RlckNhbGxlZENsb3N1cmUoCiAgICAgIGlyLk5vZGUgbm9kZSwKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywKICAgICAgVHlwZUluZm9ybWF0aW9uIGNsb3N1cmUsCiAgICAgIE1lbWJlckVudGl0eSBjYWxsZXIsCiAgICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cywKICAgICAgU2lkZUVmZmVjdHNCdWlsZGVyIHNpZGVFZmZlY3RzQnVpbGRlciwKICAgICAge2Jvb2wgaW5Mb29wfSk7CgogIC8vLyBSZWdpc3RlcnMgdGhhdCBbY2FsbGVyXSBjYWxscyBbY2FsbGVlXSBhdCBsb2NhdGlvbiBbbm9kZV0sIHdpdGgKICAvLy8gW3NlbGVjdG9yXSwgYW5kIFthcmd1bWVudHNdLiBOb3RlIHRoYXQgW3NlbGVjdG9yXSBpcyBudWxsIGZvciBmb3J3YXJkaW5nCiAgLy8vIGNvbnN0cnVjdG9ycy4KICAvLy8KICAvLy8gW3NpZGVFZmZlY3RzQnVpbGRlcl0gd2lsbCBiZSB1cGRhdGVkIHRvIGluY29ycG9yYXRlIFtjYWxsZWVdJ3Mgc2lkZQogIC8vLyBlZmZlY3RzLgogIC8vLwogIC8vLyBbaW5Mb29wXSB0ZWxscyB3aGV0aGVyIHRoZSBjYWxsIGhhcHBlbnMgaW4gYSBsb29wLgogIFR5cGVJbmZvcm1hdGlvbiByZWdpc3RlckNhbGxlZE1lbWJlcigKICAgICAgT2JqZWN0IG5vZGUsCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssCiAgICAgIE1lbWJlckVudGl0eSBjYWxsZXIsCiAgICAgIE1lbWJlckVudGl0eSBjYWxsZWUsCiAgICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cywKICAgICAgU2lkZUVmZmVjdHNCdWlsZGVyIHNpZGVFZmZlY3RzQnVpbGRlciwKICAgICAgYm9vbCBpbkxvb3ApOwoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgW2NhbGxlcl0gY2FsbHMgW3NlbGVjdG9yXSB3aXRoIFtyZWNlaXZlclR5cGVdIGFzIHJlY2VpdmVyLAogIC8vLyBhbmQgW2FyZ3VtZW50c10uCiAgLy8vCiAgLy8vIFtzaWRlRWZmZWN0c0J1aWxkZXJdIHdpbGwgYmUgdXBkYXRlZCB0byBpbmNvcnBvcmF0ZSB0aGUgcG90ZW50aWFsIGNhbGxlZXMnCiAgLy8vIHNpZGUgZWZmZWN0cy4KICAvLy8KICAvLy8gW2luTG9vcF0gdGVsbHMgd2hldGhlciB0aGUgY2FsbCBoYXBwZW5zIGluIGEgbG9vcC4KICBUeXBlSW5mb3JtYXRpb24gcmVnaXN0ZXJDYWxsZWRTZWxlY3RvcigKICAgICAgQ2FsbFR5cGUgY2FsbFR5cGUsCiAgICAgIGlyLk5vZGUgbm9kZSwKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywKICAgICAgVHlwZUluZm9ybWF0aW9uIHJlY2VpdmVyVHlwZSwKICAgICAgTWVtYmVyRW50aXR5IGNhbGxlciwKICAgICAgQXJndW1lbnRzVHlwZXMgYXJndW1lbnRzLAogICAgICBTaWRlRWZmZWN0c0J1aWxkZXIgc2lkZUVmZmVjdHNCdWlsZGVyLAogICAgICB7Ym9vbCBpbkxvb3AsCiAgICAgIGJvb2wgaXNDb25kaXRpb25hbH0pOwoKICAvLy8gVXBkYXRlIHRoZSBhc3NpZ25tZW50cyB0byBwYXJhbWV0ZXJzIGluIHRoZSBncmFwaC4gW3JlbW92ZV0gdGVsbHMgd2hldGhlcgogIC8vLyBhc3NpZ25tZW50cyBtdXN0IGJlIGFkZGVkIG9yIHJlbW92ZWQuIElmIFtpbml0XSBpcyBmYWxzZSwgcGFyYW1ldGVycyBhcmUKICAvLy8gYWRkZWQgdG8gdGhlIHdvcmsgcXVldWUuCiAgdm9pZCB1cGRhdGVQYXJhbWV0ZXJBc3NpZ25tZW50cyhUeXBlSW5mb3JtYXRpb24gY2FsbGVyLCBNZW1iZXJFbnRpdHkgY2FsbGVlLAogICAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMsIFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIG1hc2ssCiAgICAgIHtib29sIHJlbW92ZSwgYm9vbCBhZGRUb1F1ZXVlOiB0cnVlfSk7CgogIHZvaWQgdXBkYXRlU2VsZWN0b3JJbk1lbWJlcihNZW1iZXJFbnRpdHkgb3duZXIsIENhbGxUeXBlIGNhbGxUeXBlLAogICAgICBpci5Ob2RlIG5vZGUsIFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIG1hc2spOwoKICAvLy8gUmV0dXJucyB0aGUgcmV0dXJuIHR5cGUgb2YgW2VsZW1lbnRdLgogIFR5cGVJbmZvcm1hdGlvbiByZXR1cm5UeXBlT2ZNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiBbZWxlbWVudF0gd2hlbiBiZWluZyBjYWxsZWQgd2l0aCBbc2VsZWN0b3JdLgogIFR5cGVJbmZvcm1hdGlvbiB0eXBlT2ZNZW1iZXJXaXRoU2VsZWN0b3IoCiAgICAgIE1lbWJlckVudGl0eSBlbGVtZW50LCBTZWxlY3RvciBzZWxlY3Rvcik7CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIG9mIFtlbGVtZW50XS4KICBUeXBlSW5mb3JtYXRpb24gdHlwZU9mTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgW2VsZW1lbnRdLgogIFR5cGVJbmZvcm1hdGlvbiB0eXBlT2ZQYXJhbWV0ZXIoTG9jYWwgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIGZvciBbbmF0aXZlQmVoYXZpb3JdLiBTZWUgZG9jdW1lbnRhdGlvbiBvbgogIC8vLyBbTmF0aXZlQmVoYXZpb3JdLgogIFR5cGVJbmZvcm1hdGlvbiB0eXBlT2ZOYXRpdmVCZWhhdmlvcihOYXRpdmVCZWhhdmlvciBuYXRpdmVCZWhhdmlvcik7CgogIGJvb2wgcmV0dXJuc0xpc3RFbGVtZW50VHlwZShTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSBtYXNrKTsKCiAgYm9vbCByZXR1cm5zTWFwVmFsdWVUeXBlKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIG1hc2spOwoKICB2b2lkIGNsb3NlKCk7CgogIHZvaWQgY2xlYXIoKTsKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBnbG9iYWwgb3B0aW1pemF0aW9ucyBzdWNoIGFzIHR5cGUgaW5mZXJlbmNpbmcgY2FuIGFwcGx5IHRvCiAgLy8vIHRoZSBmaWVsZCBbZWxlbWVudF0uCiAgLy8vCiAgLy8vIE9uZSBjYXRlZ29yeSBvZiBlbGVtZW50cyB0aGF0IGRvIG5vdCBhcHBseSBpcyBydW50aW1lIGhlbHBlcnMgdGhhdCB0aGUKICAvLy8gYmFja2VuZCBjYWxscywgYnV0IHRoZSBvcHRpbWl6YXRpb25zIGRvbid0IHNlZSB0aG9zZSBjYWxscy4KICBib29sIGNhbkZpZWxkQmVVc2VkRm9yR2xvYmFsT3B0aW1pemF0aW9ucyhGaWVsZEVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBnbG9iYWwgb3B0aW1pemF0aW9ucyBzdWNoIGFzIHR5cGUgaW5mZXJlbmNpbmcgY2FuIGFwcGx5IHRvCiAgLy8vIHRoZSBwYXJhbWV0ZXIgW2VsZW1lbnRdLgogIC8vLwogIC8vLyBPbmUgY2F0ZWdvcnkgb2YgZWxlbWVudHMgdGhhdCBkbyBub3QgYXBwbHkgaXMgcnVudGltZSBoZWxwZXJzIHRoYXQgdGhlCiAgLy8vIGJhY2tlbmQgY2FsbHMsIGJ1dCB0aGUgb3B0aW1pemF0aW9ucyBkb24ndCBzZWUgdGhvc2UgY2FsbHMuCiAgYm9vbCBjYW5GdW5jdGlvblBhcmFtZXRlcnNCZVVzZWRGb3JHbG9iYWxPcHRpbWl6YXRpb25zKAogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbik7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBpbmZlcmVuY2Ugb2YgcGFyYW1ldGVyIHR5cGVzIGlzIGRpc2FibGVkIGZvciBbbWVtYmVyXS4KICBib29sIGFzc3VtZUR5bmFtaWMoTWVtYmVyRW50aXR5IG1lbWJlcik7Cn0KCmNsYXNzIEluZmVycmVyRW5naW5lSW1wbCBleHRlbmRzIEluZmVycmVyRW5naW5lIHsKICBmaW5hbCBNYXA8TG9jYWwsIFR5cGVJbmZvcm1hdGlvbj4gZGVmYXVsdFR5cGVPZlBhcmFtZXRlciA9CiAgICAgIG5ldyBNYXA8TG9jYWwsIFR5cGVJbmZvcm1hdGlvbj4oKTsKICBmaW5hbCBXb3JrUXVldWUgd29ya1F1ZXVlID0gbmV3IFdvcmtRdWV1ZSgpOwogIEBvdmVycmlkZQogIGZpbmFsIEZ1bmN0aW9uRW50aXR5IG1haW5FbGVtZW50OwogIGZpbmFsIFNldDxNZW1iZXJFbnRpdHk+IGFuYWx5emVkRWxlbWVudHMgPSBuZXcgU2V0PE1lbWJlckVudGl0eT4oKTsKCiAgLy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB3ZSBhbGxvdyBhIG5vZGUgaW4gdGhlIGdyYXBoIHRvCiAgLy8vIGNoYW5nZSB0eXBlcy4gSWYgYSBub2RlIHJlYWNoZXMgdGhhdCBsaW1pdCwgd2UgZ2l2ZSB1cAogIC8vLyBpbmZlcmVuY2luZyBvbiBpdCBhbmQgZ2l2ZSBpdCB0aGUgZHluYW1pYyB0eXBlLgogIGZpbmFsIGludCBNQVhfQ0hBTkdFX0NPVU5UID0gNjsKCiAgaW50IG92ZXJhbGxSZWZpbmVDb3VudCA9IDA7CiAgaW50IGFkZGVkSW5HcmFwaCA9IDA7CgogIEBvdmVycmlkZQogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zOwogIGZpbmFsIFByb2dyZXNzIHByb2dyZXNzOwogIEBvdmVycmlkZQogIGZpbmFsIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlcjsKICBmaW5hbCBDb21waWxlck91dHB1dCBfY29tcGlsZXJPdXRwdXQ7CgogIEBvdmVycmlkZQogIGZpbmFsIEpzQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CiAgQG92ZXJyaWRlCiAgZmluYWwgSW5mZXJyZWREYXRhQnVpbGRlciBpbmZlcnJlZERhdGFCdWlsZGVyOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBUeXBlU3lzdGVtIHR5cGVzOwogIEBvdmVycmlkZQogIGZpbmFsIE1hcDxpci5UcmVlTm9kZSwgVHlwZUluZm9ybWF0aW9uPiBjb25jcmV0ZVR5cGVzID0KICAgICAgbmV3IE1hcDxpci5UcmVlTm9kZSwgVHlwZUluZm9ybWF0aW9uPigpOwoKICBmaW5hbCBTZXQ8Q29uc3RydWN0b3JFbnRpdHk+IGdlbmVyYXRpdmVDb25zdHJ1Y3RvcnNFeHBvc2luZ1RoaXMgPQogICAgICBuZXcgU2V0PENvbnN0cnVjdG9yRW50aXR5PigpOwoKICAvLy8gRGF0YSBjb21wdXRlZCBpbnRlcm5hbGx5IHdpdGhpbiBlbGVtZW50cywgbGlrZSB0aGUgdHlwZS1tYXNrIG9mIGEgc2VuZCBhCiAgLy8vIGxpc3QgYWxsb2NhdGlvbiwgb3IgYSBmb3ItaW4gbG9vcC4KICBmaW5hbCBNYXA8TWVtYmVyRW50aXR5LCBHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGE+IF9tZW1iZXJEYXRhID0KICAgICAgbmV3IE1hcDxNZW1iZXJFbnRpdHksIEdsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YT4oKTsKCiAgZmluYWwgTm9TdWNoTWV0aG9kUmVnaXN0cnkgbm9TdWNoTWV0aG9kUmVnaXN0cnk7CgogIEluZmVycmVyRW5naW5lSW1wbCgKICAgICAgdGhpcy5vcHRpb25zLAogICAgICB0aGlzLnByb2dyZXNzLAogICAgICB0aGlzLnJlcG9ydGVyLAogICAgICB0aGlzLl9jb21waWxlck91dHB1dCwKICAgICAgdGhpcy5jbG9zZWRXb3JsZCwKICAgICAgdGhpcy5ub1N1Y2hNZXRob2RSZWdpc3RyeSwKICAgICAgdGhpcy5tYWluRWxlbWVudCwKICAgICAgdGhpcy5pbmZlcnJlZERhdGFCdWlsZGVyKQogICAgICA6IHRoaXMudHlwZXMgPSBuZXcgVHlwZVN5c3RlbSgKICAgICAgICAgICAgY2xvc2VkV29ybGQsIG5ldyBLZXJuZWxUeXBlU3lzdGVtU3RyYXRlZ3koY2xvc2VkV29ybGQpKTsKCiAgRWxlbWVudEVudmlyb25tZW50IGdldCBfZWxlbWVudEVudmlyb25tZW50ID0+IGNsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoRWxlbWVudE1hdGNoaW5nKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSBtYXNrLCBib29sIGYoTWVtYmVyRW50aXR5IGVsZW1lbnQpKSB7CiAgICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGVsZW1lbnRzID0gY2xvc2VkV29ybGQubG9jYXRlTWVtYmVycyhzZWxlY3RvciwgbWFzayk7CiAgICBmb3IgKE1lbWJlckVudGl0eSBlIGluIGVsZW1lbnRzKSB7CiAgICAgIGlmICghZihlKSkgcmV0dXJuOwogICAgfQogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWFrZSB0aGlzIHByaXZhdGUgYWdhaW4uCiAgQG92ZXJyaWRlCiAgR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhIGRhdGFPZk1lbWJlcihNZW1iZXJFbnRpdHkgZWxlbWVudCkgPT4KICAgICAgX21lbWJlckRhdGFbZWxlbWVudF0gPz89IG5ldyBLZXJuZWxHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGEoKTsKCiAgLy8vIFVwZGF0ZSBbc2lkZUVmZmVjdHNdIHdpdGggdGhlIHNpZGUgZWZmZWN0cyBvZiBbY2FsbGVlXSBiZWluZwogIC8vLyBjYWxsZWQgd2l0aCBbc2VsZWN0b3JdLgogIHZvaWQgdXBkYXRlU2lkZUVmZmVjdHMoU2lkZUVmZmVjdHNCdWlsZGVyIHNpZGVFZmZlY3RzQnVpbGRlciwKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIE1lbWJlckVudGl0eSBjYWxsZWUpIHsKICAgIGlmIChjYWxsZWUuaXNGaWVsZCkgewogICAgICBpZiAoY2FsbGVlLmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgICBpZiAoc2VsZWN0b3IuaXNTZXR0ZXIpIHsKICAgICAgICAgIHNpZGVFZmZlY3RzQnVpbGRlci5zZXRDaGFuZ2VzSW5zdGFuY2VQcm9wZXJ0eSgpOwogICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNHZXR0ZXIpIHsKICAgICAgICAgIHNpZGVFZmZlY3RzQnVpbGRlci5zZXREZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2lkZUVmZmVjdHNCdWlsZGVyLnNldEFsbFNpZGVFZmZlY3RzQW5kRGVwZW5kc09uU29tZXRoaW5nKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzZWxlY3Rvci5pc1NldHRlcikgewogICAgICAgICAgc2lkZUVmZmVjdHNCdWlsZGVyLnNldENoYW5nZXNTdGF0aWNQcm9wZXJ0eSgpOwogICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNHZXR0ZXIpIHsKICAgICAgICAgIHNpZGVFZmZlY3RzQnVpbGRlci5zZXREZXBlbmRzT25TdGF0aWNQcm9wZXJ0eVN0b3JlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNpZGVFZmZlY3RzQnVpbGRlci5zZXRBbGxTaWRlRWZmZWN0c0FuZERlcGVuZHNPblNvbWV0aGluZygpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChjYWxsZWUuaXNHZXR0ZXIgJiYgIXNlbGVjdG9yLmlzR2V0dGVyKSB7CiAgICAgIHNpZGVFZmZlY3RzQnVpbGRlci5zZXRBbGxTaWRlRWZmZWN0c0FuZERlcGVuZHNPblNvbWV0aGluZygpOwogICAgfSBlbHNlIHsKICAgICAgc2lkZUVmZmVjdHNCdWlsZGVyCiAgICAgICAgICAuYWRkSW5wdXQoaW5mZXJyZWREYXRhQnVpbGRlci5nZXRTaWRlRWZmZWN0c0J1aWxkZXIoY2FsbGVlKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdHlwZU9mTmF0aXZlQmVoYXZpb3IoTmF0aXZlQmVoYXZpb3IgbmF0aXZlQmVoYXZpb3IpIHsKICAgIGlmIChuYXRpdmVCZWhhdmlvciA9PSBudWxsKSByZXR1cm4gdHlwZXMuZHluYW1pY1R5cGU7CiAgICBMaXN0IHR5cGVzUmV0dXJuZWQgPSBuYXRpdmVCZWhhdmlvci50eXBlc1JldHVybmVkOwogICAgaWYgKHR5cGVzUmV0dXJuZWQuaXNFbXB0eSkgcmV0dXJuIHR5cGVzLmR5bmFtaWNUeXBlOwogICAgVHlwZUluZm9ybWF0aW9uIHJldHVyblR5cGU7CiAgICBmb3IgKHZhciB0eXBlIGluIHR5cGVzUmV0dXJuZWQpIHsKICAgICAgVHlwZUluZm9ybWF0aW9uIG1hcHBlZFR5cGU7CiAgICAgIGlmICh0eXBlID09IFNwZWNpYWxUeXBlLkpzT2JqZWN0KSB7CiAgICAgICAgbWFwcGVkVHlwZSA9IHR5cGVzLm5vbk51bGxFeGFjdChjb21tb25FbGVtZW50cy5vYmplY3RDbGFzcyk7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBjb21tb25FbGVtZW50cy5zdHJpbmdUeXBlKSB7CiAgICAgICAgbWFwcGVkVHlwZSA9IHR5cGVzLnN0cmluZ1R5cGU7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBjb21tb25FbGVtZW50cy5pbnRUeXBlKSB7CiAgICAgICAgbWFwcGVkVHlwZSA9IHR5cGVzLmludFR5cGU7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBjb21tb25FbGVtZW50cy5udW1UeXBlIHx8CiAgICAgICAgICB0eXBlID09IGNvbW1vbkVsZW1lbnRzLmRvdWJsZVR5cGUpIHsKICAgICAgICAvLyBOb3RlOiB0aGUgYmFja2VuZCBkb3VibGUgY2xhc3MgaXMgc3BlY2lmaWNhbGx5IGZvciBub24taW50ZWdlcgogICAgICAgIC8vIGRvdWJsZXMsIGFuZCBhIG5hdGl2ZSBiZWhhdmlvciByZXR1cm5pbmcgJ2RvdWJsZScgZG9lcyBub3QgZ3VhcmFudGVlCiAgICAgICAgLy8gYSBub24taW50ZWdlciByZXR1cm4gdHlwZSwgc28gd2UgcmV0dXJuIHRoZSBudW1iZXIgdHlwZSBmb3IgdGhvc2UuCiAgICAgICAgbWFwcGVkVHlwZSA9IHR5cGVzLm51bVR5cGU7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBjb21tb25FbGVtZW50cy5ib29sVHlwZSkgewogICAgICAgIG1hcHBlZFR5cGUgPSB0eXBlcy5ib29sVHlwZTsKICAgICAgfSBlbHNlIGlmICh0eXBlID09IGNvbW1vbkVsZW1lbnRzLm51bGxUeXBlKSB7CiAgICAgICAgbWFwcGVkVHlwZSA9IHR5cGVzLm51bGxUeXBlOwogICAgICB9IGVsc2UgaWYgKHR5cGUuaXNWb2lkKSB7CiAgICAgICAgbWFwcGVkVHlwZSA9IHR5cGVzLm51bGxUeXBlOwogICAgICB9IGVsc2UgaWYgKHR5cGUuaXNEeW5hbWljKSB7CiAgICAgICAgcmV0dXJuIHR5cGVzLmR5bmFtaWNUeXBlOwogICAgICB9IGVsc2UgaWYgKHR5cGUuaXNJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgbWFwcGVkVHlwZSA9IHR5cGVzLm5vbk51bGxTdWJ0eXBlKHR5cGUuZWxlbWVudCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWFwcGVkVHlwZSA9IHR5cGVzLmR5bmFtaWNUeXBlOwogICAgICB9CiAgICAgIHJldHVyblR5cGUgPSB0eXBlcy5jb21wdXRlTFVCKHJldHVyblR5cGUsIG1hcHBlZFR5cGUpOwogICAgICBpZiAocmV0dXJuVHlwZSA9PSB0eXBlcy5keW5hbWljVHlwZSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmV0dXJuVHlwZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdXBkYXRlU2VsZWN0b3JJbk1lbWJlcihNZW1iZXJFbnRpdHkgb3duZXIsIENhbGxUeXBlIGNhbGxUeXBlLAogICAgICBpci5Ob2RlIG5vZGUsIFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIEtlcm5lbEdsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YSBkYXRhID0gZGF0YU9mTWVtYmVyKG93bmVyKTsKICAgIGFzc2VydCh2YWxpZENhbGxUeXBlKGNhbGxUeXBlLCBub2RlKSk7CiAgICBzd2l0Y2ggKGNhbGxUeXBlKSB7CiAgICAgIGNhc2UgQ2FsbFR5cGUuYWNjZXNzOgogICAgICAgIGRhdGEuc2V0VHlwZU1hc2sobm9kZSwgbWFzayk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ2FsbFR5cGUuZm9ySW46CiAgICAgICAgaWYgKHNlbGVjdG9yID09IFNlbGVjdG9ycy5pdGVyYXRvcikgewogICAgICAgICAgZGF0YS5zZXRJdGVyYXRvclR5cGVNYXNrKG5vZGUsIG1hc2spOwogICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT0gU2VsZWN0b3JzLmN1cnJlbnQpIHsKICAgICAgICAgIGRhdGEuc2V0Q3VycmVudFR5cGVNYXNrKG5vZGUsIG1hc2spOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhc3NlcnQoc2VsZWN0b3IgPT0gU2VsZWN0b3JzLm1vdmVOZXh0KTsKICAgICAgICAgIGRhdGEuc2V0TW92ZU5leHRUeXBlTWFzayhub2RlLCBtYXNrKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNoZWNrSWZFeHBvc2VzVGhpcyhDb25zdHJ1Y3RvckVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gZ2VuZXJhdGl2ZUNvbnN0cnVjdG9yc0V4cG9zaW5nVGhpcy5jb250YWlucyhlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVjb3JkRXhwb3Nlc1RoaXMoQ29uc3RydWN0b3JFbnRpdHkgZWxlbWVudCwgYm9vbCBleHBvc2VzVGhpcykgewogICAgaWYgKGV4cG9zZXNUaGlzKSB7CiAgICAgIGdlbmVyYXRpdmVDb25zdHJ1Y3RvcnNFeHBvc2luZ1RoaXMuYWRkKGVsZW1lbnQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCByZXR1cm5zTGlzdEVsZW1lbnRUeXBlKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIHJldHVybiBtYXNrICE9IG51bGwgJiYKICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmlzQ29udGFpbmVyKG1hc2spICYmCiAgICAgICAgcmV0dXJuc0xpc3RFbGVtZW50VHlwZVNldC5jb250YWlucyhzZWxlY3Rvcik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHJldHVybnNNYXBWYWx1ZVR5cGUoU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgcmV0dXJuIG1hc2sgIT0gbnVsbCAmJiBhYnN0cmFjdFZhbHVlRG9tYWluLmlzTWFwKG1hc2spICYmIHNlbGVjdG9yLmlzSW5kZXg7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFuYWx5emVMaXN0QW5kRW5xdWV1ZShMaXN0VHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGlmIChpbmZvLmFuYWx5emVkKSByZXR1cm47CiAgICBpbmZvLmFuYWx5emVkID0gdHJ1ZTsKCiAgICBMaXN0VHJhY2VyVmlzaXRvciB0cmFjZXIgPSBuZXcgTGlzdFRyYWNlclZpc2l0b3IoaW5mbywgdGhpcyk7CiAgICBib29sIHN1Y2NlZWRlZCA9IHRyYWNlci5ydW4oKTsKICAgIGlmICghc3VjY2VlZGVkKSByZXR1cm47CgogICAgaW5mby5iYWlsZWRPdXQgPSBmYWxzZTsKICAgIGluZm8uZWxlbWVudFR5cGUuaW5mZXJyZWQgPSB0cnVlOwogICAgaWYgKGFic3RyYWN0VmFsdWVEb21haW4uaXNTcGVjaWFsaXphdGlvbk9mKAogICAgICAgIGluZm8ub3JpZ2luYWxUeXBlLCBhYnN0cmFjdFZhbHVlRG9tYWluLmZpeGVkTGlzdFR5cGUpKSB7CiAgICAgIGluZm8uY2hlY2tzR3Jvd2FibGUgPSB0cmFjZXIuY2FsbHNHcm93YWJsZU1ldGhvZDsKICAgIH0KICAgIHRyYWNlci5hc3NpZ25tZW50cy5mb3JFYWNoKGluZm8uZWxlbWVudFR5cGUuYWRkQXNzaWdubWVudCk7CiAgICAvLyBFbnF1ZXVlIHRoZSBsaXN0IGZvciBsYXRlciByZWZpbmVtZW50CiAgICB3b3JrUXVldWUuYWRkKGluZm8pOwogICAgd29ya1F1ZXVlLmFkZChpbmZvLmVsZW1lbnRUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYW5hbHl6ZVNldEFuZEVucXVldWUoU2V0VHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGlmIChpbmZvLmFuYWx5emVkKSByZXR1cm47CiAgICBpbmZvLmFuYWx5emVkID0gdHJ1ZTsKCiAgICBTZXRUcmFjZXJWaXNpdG9yIHRyYWNlciA9IG5ldyBTZXRUcmFjZXJWaXNpdG9yKGluZm8sIHRoaXMpOwogICAgYm9vbCBzdWNjZWVkZWQgPSB0cmFjZXIucnVuKCk7CiAgICBpZiAoIXN1Y2NlZWRlZCkgcmV0dXJuOwoKICAgIGluZm8uYmFpbGVkT3V0ID0gZmFsc2U7CiAgICBpbmZvLmVsZW1lbnRUeXBlLmluZmVycmVkID0gdHJ1ZTsKCiAgICB0cmFjZXIuYXNzaWdubWVudHMuZm9yRWFjaChpbmZvLmVsZW1lbnRUeXBlLmFkZEFzc2lnbm1lbnQpOwogICAgLy8gRW5xdWV1ZSB0aGUgc2V0IGZvciBsYXRlciByZWZpbmVtZW50LgogICAgd29ya1F1ZXVlLmFkZChpbmZvKTsKICAgIHdvcmtRdWV1ZS5hZGQoaW5mby5lbGVtZW50VHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFuYWx5emVNYXBBbmRFbnF1ZXVlKE1hcFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBpZiAoaW5mby5hbmFseXplZCkgcmV0dXJuOwogICAgaW5mby5hbmFseXplZCA9IHRydWU7CiAgICBNYXBUcmFjZXJWaXNpdG9yIHRyYWNlciA9IG5ldyBNYXBUcmFjZXJWaXNpdG9yKGluZm8sIHRoaXMpOwoKICAgIGJvb2wgc3VjY2VlZGVkID0gdHJhY2VyLnJ1bigpOwogICAgaWYgKCFzdWNjZWVkZWQpIHJldHVybjsKCiAgICBpbmZvLmJhaWxlZE91dCA9IGZhbHNlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFjZXIua2V5QXNzaWdubWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgVHlwZUluZm9ybWF0aW9uIG5ld1R5cGUgPSBpbmZvLmFkZEVudHJ5QXNzaWdubWVudChhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICAgICAgdHJhY2VyLmtleUFzc2lnbm1lbnRzW2ldLCB0cmFjZXIudmFsdWVBc3NpZ25tZW50c1tpXSk7CiAgICAgIGlmIChuZXdUeXBlICE9IG51bGwpIHdvcmtRdWV1ZS5hZGQobmV3VHlwZSk7CiAgICB9CiAgICBmb3IgKFR5cGVJbmZvcm1hdGlvbiBtYXAgaW4gdHJhY2VyLm1hcEFzc2lnbm1lbnRzKSB7CiAgICAgIHdvcmtRdWV1ZS5hZGRBbGwoaW5mby5hZGRNYXBBc3NpZ25tZW50KGFic3RyYWN0VmFsdWVEb21haW4sIG1hcCkpOwogICAgfQoKICAgIGluZm8ubWFya0FzSW5mZXJyZWQoKTsKICAgIHdvcmtRdWV1ZS5hZGQoaW5mby5rZXlUeXBlKTsKICAgIHdvcmtRdWV1ZS5hZGQoaW5mby52YWx1ZVR5cGUpOwogICAgd29ya1F1ZXVlLmFkZEFsbChpbmZvLnR5cGVJbmZvTWFwLnZhbHVlcyk7CiAgICB3b3JrUXVldWUuYWRkKGluZm8pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBydW5PdmVyQWxsRWxlbWVudHMoKSB7CiAgICBhbmFseXplQWxsRWxlbWVudHMoKTsKICAgIFR5cGVHcmFwaER1bXAgZHVtcCA9CiAgICAgICAgZGVidWcuUFJJTlRfR1JBUEggPyBuZXcgVHlwZUdyYXBoRHVtcChfY29tcGlsZXJPdXRwdXQsIHRoaXMpIDogbnVsbDsKCiAgICBkdW1wPy5iZWZvcmVBbmFseXNpcygpOwogICAgYnVpbGRXb3JrUXVldWUoKTsKICAgIHJlZmluZSgpOwoKICAgIC8vIFRyeSB0byBpbmZlciBlbGVtZW50IHR5cGVzIG9mIGxpc3RzIGFuZCBjb21wdXRlIHRoZWlyIGVzY2FwZSBpbmZvcm1hdGlvbi4KICAgIHR5cGVzLmFsbG9jYXRlZExpc3RzLnZhbHVlcy5mb3JFYWNoKChUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgICBhbmFseXplTGlzdEFuZEVucXVldWUoaW5mbyk7CiAgICB9KTsKCiAgICAvLyBUcnkgdG8gaW5mZXIgZWxlbWVudCB0eXBlcyBvZiBzZXRzIGFuZCBjb21wdXRlIHRoZWlyIGVzY2FwZSBpbmZvcm1hdGlvbi4KICAgIHR5cGVzLmFsbG9jYXRlZFNldHMudmFsdWVzLmZvckVhY2goKFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICAgIGFuYWx5emVTZXRBbmRFbnF1ZXVlKGluZm8pOwogICAgfSk7CgogICAgLy8gVHJ5IHRvIGluZmVyIHRoZSBrZXkgYW5kIHZhbHVlIHR5cGVzIGZvciBtYXBzIGFuZCBjb21wdXRlIHRoZSB2YWx1ZXMnCiAgICAvLyBlc2NhcGUgaW5mb3JtYXRpb24uCiAgICB0eXBlcy5hbGxvY2F0ZWRNYXBzLnZhbHVlcy5mb3JFYWNoKChUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgICBhbmFseXplTWFwQW5kRW5xdWV1ZShpbmZvKTsKICAgIH0pOwoKICAgIFNldDxGdW5jdGlvbkVudGl0eT4gYmFpbGVkT3V0T24gPSBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwoKICAgIC8vIFRyYWNlIGNsb3N1cmVzIHRvIHBvdGVudGlhbGx5IGluZmVyIGFyZ3VtZW50IHR5cGVzLgogICAgdHlwZXMuYWxsb2NhdGVkQ2xvc3VyZXMuZm9yRWFjaCgoZHluYW1pYyBpbmZvKSB7CiAgICAgIHZvaWQgdHJhY2UoCiAgICAgICAgICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZWxlbWVudHMsIENsb3N1cmVUcmFjZXJWaXNpdG9yIHRyYWNlcikgewogICAgICAgIHRyYWNlci5ydW4oKTsKICAgICAgICBpZiAoIXRyYWNlci5jb250aW51ZUFuYWx5emluZykgewogICAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgICAgICAgICBpbmZlcnJlZERhdGFCdWlsZGVyLnJlZ2lzdGVyTWlnaHRCZVBhc3NlZFRvQXBwbHkoZWxlbWVudCk7CiAgICAgICAgICAgIGlmIChkZWJ1Zy5WRVJCT1NFKSB7CiAgICAgICAgICAgICAgcHJpbnQoInRyYWNlZCBjbG9zdXJlICRlbGVtZW50IGFzICR7dHJ1ZX0gKGJhaWwpIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZXMuc3RyYXRlZ3kuZm9yRWFjaFBhcmFtZXRlcihlbGVtZW50LCAoTG9jYWwgcGFyYW1ldGVyKSB7CiAgICAgICAgICAgICAgdHlwZXMKICAgICAgICAgICAgICAgICAgLmdldEluZmVycmVkVHlwZU9mUGFyYW1ldGVyKHBhcmFtZXRlcikKICAgICAgICAgICAgICAgICAgLmdpdmVVcCh0aGlzLCBjbGVhckFzc2lnbm1lbnRzOiBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgICBiYWlsZWRPdXRPbi5hZGRBbGwoZWxlbWVudHMpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBlbGVtZW50cwogICAgICAgICAgICAud2hlcmUoKGUpID0+ICFiYWlsZWRPdXRPbi5jb250YWlucyhlKSkKICAgICAgICAgICAgLmZvckVhY2goKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgICAgICAgIHR5cGVzLnN0cmF0ZWd5LmZvckVhY2hQYXJhbWV0ZXIoZWxlbWVudCwgKExvY2FsIHBhcmFtZXRlcikgewogICAgICAgICAgICBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24gaW5mbyA9CiAgICAgICAgICAgICAgICB0eXBlcy5nZXRJbmZlcnJlZFR5cGVPZlBhcmFtZXRlcihwYXJhbWV0ZXIpOwogICAgICAgICAgICBpbmZvLm1heWJlUmVzdW1lKCk7CiAgICAgICAgICAgIHdvcmtRdWV1ZS5hZGQoaW5mbyk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmICh0cmFjZXIudHJhY2VkVHlwZS5taWdodEJlUGFzc2VkVG9GdW5jdGlvbkFwcGx5KSB7CiAgICAgICAgICAgIGluZmVycmVkRGF0YUJ1aWxkZXIucmVnaXN0ZXJNaWdodEJlUGFzc2VkVG9BcHBseShlbGVtZW50KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChkZWJ1Zy5WRVJCT1NFKSB7CiAgICAgICAgICAgIHByaW50KCJ0cmFjZWQgY2xvc3VyZSAkZWxlbWVudCBhcyAiCiAgICAgICAgICAgICAgICAiJHtpbmZlcnJlZERhdGFCdWlsZGVyLmdldEN1cnJlbnRseUtub3duTWlnaHRCZVBhc3NlZFRvQXBwbHkoZWxlbWVudCl9Iik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGlmIChpbmZvIGlzIENsb3N1cmVUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZWxlbWVudHMgPSBbaW5mby5jbG9zdXJlXTsKICAgICAgICB0cmFjZShlbGVtZW50cywgbmV3IENsb3N1cmVUcmFjZXJWaXNpdG9yKGVsZW1lbnRzLCBpbmZvLCB0aGlzKSk7CiAgICAgIH0gZWxzZSBpZiAoaW5mbyBpcyBDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbikgewogICAgICAgIGlmIChpbmZvIGlzIFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uICYmCiAgICAgICAgICAgIGluZm8uc2VsZWN0b3IgIT0gbnVsbCAmJgogICAgICAgICAgICBpbmZvLnNlbGVjdG9yLmlzQ2FsbCkgewogICAgICAgICAgLy8gVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGNhbGwgdG8gYSBjbGFzcyB3aXRoIGEgY2FsbCBtZXRob2QuIFNvIHdlCiAgICAgICAgICAvLyBuZWVkIHRvIHRyYWNlIHRoZSBjYWxsIG1ldGhvZCBoZXJlLgogICAgICAgICAgRnVuY3Rpb25FbnRpdHkgY2FsbGVkRWxlbWVudCA9IGluZm8uY2FsbGVkRWxlbWVudDsKICAgICAgICAgIGFzc2VydChjYWxsZWRFbGVtZW50IGlzIENvbnN0cnVjdG9yRW50aXR5ICYmCiAgICAgICAgICAgICAgY2FsbGVkRWxlbWVudC5pc0dlbmVyYXRpdmVDb25zdHJ1Y3Rvcik7CiAgICAgICAgICBDbGFzc0VudGl0eSBjbHMgPSBjYWxsZWRFbGVtZW50LmVuY2xvc2luZ0NsYXNzOwogICAgICAgICAgRnVuY3Rpb25FbnRpdHkgY2FsbE1ldGhvZCA9IGxvb2t1cENhbGxNZXRob2QoY2xzKTsKICAgICAgICAgIGFzc2VydChjYWxsTWV0aG9kICE9IG51bGwsIGZhaWxlZEF0KGNscykpOwogICAgICAgICAgSXRlcmFibGU8RnVuY3Rpb25FbnRpdHk+IGVsZW1lbnRzID0gW2NhbGxNZXRob2RdOwogICAgICAgICAgdHJhY2UoZWxlbWVudHMsIG5ldyBDbG9zdXJlVHJhY2VyVmlzaXRvcihlbGVtZW50cywgaW5mbywgdGhpcykpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIGZ1bmN0aW9ucyBoZXJlLCBhcyBvdGhlciB0YXJnZXRzCiAgICAgICAgICAvLyBvZiB0aGlzIGNsb3N1cmUgY2FsbCBhcmUgbm90IGEgcm9vdCB0byB0cmFjZSBidXQgYW4gaW50ZXJtZWRpYXRlCiAgICAgICAgICAvLyBmb3Igc29tZSBvdGhlciBmdW5jdGlvbi4KICAgICAgICAgIEl0ZXJhYmxlPEZ1bmN0aW9uRW50aXR5PiBlbGVtZW50cyA9IG5ldyBMaXN0PEZ1bmN0aW9uRW50aXR5Pi5mcm9tKAogICAgICAgICAgICAgIGluZm8uY2FsbGVlcy53aGVyZSgoZSkgPT4gZS5pc0Z1bmN0aW9uKSk7CiAgICAgICAgICB0cmFjZShlbGVtZW50cywgbmV3IENsb3N1cmVUcmFjZXJWaXNpdG9yKGVsZW1lbnRzLCBpbmZvLCB0aGlzKSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGluZm8gaXMgTWVtYmVyVHlwZUluZm9ybWF0aW9uKSB7CiAgICAgICAgdHJhY2UoPEZ1bmN0aW9uRW50aXR5PltpbmZvLm1lbWJlcl0sCiAgICAgICAgICAgIG5ldyBTdGF0aWNUZWFyT2ZmQ2xvc3VyZVRyYWNlclZpc2l0b3IoaW5mby5tZW1iZXIsIGluZm8sIHRoaXMpKTsKICAgICAgfSBlbHNlIGlmIChpbmZvIGlzIFBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbikgewogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBOT19MT0NBVElPTl9TUEFOTkFCTEUsICdVbmV4cGVjdGVkIGNsb3N1cmUgYWxsb2NhdGlvbiBpbmZvICRpbmZvJyk7CiAgICAgIH0KICAgIH0pOwoKICAgIGR1bXA/LmJlZm9yZVRyYWNpbmcoKTsKCiAgICAvLyBSZXNldCBhbGwgbm9kZXMgdGhhdCB1c2UgbGlzdHMvbWFwcyB0aGF0IGhhdmUgYmVlbiBpbmZlcnJlZCwgYXMgd2VsbAogICAgLy8gYXMgbm9kZXMgdGhhdCB1c2UgZWxlbWVudHMgZmV0Y2hlZCBmcm9tIHRoZXNlIGxpc3RzL21hcHMuIFRoZQogICAgLy8gd29ya3NldCBmb3IgYSBuZXcgcnVuIG9mIHRoZSBhbmFseXNpcyB3aWxsIGJlIHRoZXNlIG5vZGVzLgogICAgU2V0PFR5cGVJbmZvcm1hdGlvbj4gc2VlblR5cGVzID0gbmV3IFNldDxUeXBlSW5mb3JtYXRpb24+KCk7CiAgICB3aGlsZSAoIXdvcmtRdWV1ZS5pc0VtcHR5KSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBpbmZvID0gd29ya1F1ZXVlLnJlbW92ZSgpOwogICAgICBpZiAoc2VlblR5cGVzLmNvbnRhaW5zKGluZm8pKSBjb250aW51ZTsKICAgICAgLy8gSWYgdGhlIG5vZGUgY2Fubm90IGJlIHJlc2V0LCB3ZSBkbyBub3QgbmVlZCB0byB1cGRhdGUgaXRzIHVzZXJzIGVpdGhlci4KICAgICAgaWYgKCFpbmZvLnJlc2V0KHRoaXMpKSBjb250aW51ZTsKICAgICAgc2VlblR5cGVzLmFkZChpbmZvKTsKICAgICAgd29ya1F1ZXVlLmFkZEFsbChpbmZvLnVzZXJzKTsKICAgIH0KCiAgICB3b3JrUXVldWUuYWRkQWxsKHNlZW5UeXBlcyk7CiAgICByZWZpbmUoKTsKCiAgICBpZiAoZGVidWcuUFJJTlRfU1VNTUFSWSkgewogICAgICB0eXBlcy5hbGxvY2F0ZWRMaXN0cy52YWx1ZXMuZm9yRWFjaCgoX2luZm8pIHsKICAgICAgICBMaXN0VHlwZUluZm9ybWF0aW9uIGluZm8gPSBfaW5mbzsKICAgICAgICBwcmludCgnJHtpbmZvLnR5cGV9ICcKICAgICAgICAgICAgJ2ZvciAke2Fic3RyYWN0VmFsdWVEb21haW4uZ2V0QWxsb2NhdGlvbk5vZGUoaW5mby5vcmlnaW5hbFR5cGUpfSAnCiAgICAgICAgICAgICdhdCAke2Fic3RyYWN0VmFsdWVEb21haW4uZ2V0QWxsb2NhdGlvbkVsZW1lbnQoaW5mby5vcmlnaW5hbFR5cGUpfScKICAgICAgICAgICAgJ2FmdGVyICR7aW5mby5yZWZpbmVDb3VudH0nKTsKICAgICAgfSk7CiAgICAgIHR5cGVzLmFsbG9jYXRlZFNldHMudmFsdWVzLmZvckVhY2goKF9pbmZvKSB7CiAgICAgICAgU2V0VHlwZUluZm9ybWF0aW9uIGluZm8gPSBfaW5mbzsKICAgICAgICBwcmludCgnJHtpbmZvLnR5cGV9ICcKICAgICAgICAgICAgJ2ZvciAke2Fic3RyYWN0VmFsdWVEb21haW4uZ2V0QWxsb2NhdGlvbk5vZGUoaW5mby5vcmlnaW5hbFR5cGUpfSAnCiAgICAgICAgICAgICdhdCAke2Fic3RyYWN0VmFsdWVEb21haW4uZ2V0QWxsb2NhdGlvbkVsZW1lbnQoaW5mby5vcmlnaW5hbFR5cGUpfSAnCiAgICAgICAgICAgICdhZnRlciAke2luZm8ucmVmaW5lQ291bnR9Jyk7CiAgICAgIH0pOwogICAgICB0eXBlcy5hbGxvY2F0ZWRNYXBzLnZhbHVlcy5mb3JFYWNoKChfaW5mbykgewogICAgICAgIE1hcFR5cGVJbmZvcm1hdGlvbiBpbmZvID0gX2luZm87CiAgICAgICAgcHJpbnQoJyR7aW5mby50eXBlfSAnCiAgICAgICAgICAgICdmb3IgJHthYnN0cmFjdFZhbHVlRG9tYWluLmdldEFsbG9jYXRpb25Ob2RlKGluZm8ub3JpZ2luYWxUeXBlKX0gJwogICAgICAgICAgICAnYXQgJHthYnN0cmFjdFZhbHVlRG9tYWluLmdldEFsbG9jYXRpb25FbGVtZW50KGluZm8ub3JpZ2luYWxUeXBlKX0nCiAgICAgICAgICAgICdhZnRlciAke2luZm8ucmVmaW5lQ291bnR9Jyk7CiAgICAgIH0pOwogICAgICB0eXBlcy5hbGxvY2F0ZWRDbG9zdXJlcy5mb3JFYWNoKChUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgICAgIGlmIChpbmZvIGlzIEVsZW1lbnRUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgICAgIHByaW50KCcke2luZm8uZ2V0SW5mZXJyZWRTaWduYXR1cmUodHlwZXMpfSBmb3IgJwogICAgICAgICAgICAgICcke2luZm8uZGVidWdOYW1lfScpOwogICAgICAgIH0gZWxzZSBpZiAoaW5mbyBpcyBDbG9zdXJlVHlwZUluZm9ybWF0aW9uKSB7CiAgICAgICAgICBwcmludCgnJHtpbmZvLmdldEluZmVycmVkU2lnbmF0dXJlKHR5cGVzKX0gZm9yICcKICAgICAgICAgICAgICAnJHtpbmZvLmRlYnVnTmFtZX0nKTsKICAgICAgICB9IGVsc2UgaWYgKGluZm8gaXMgRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKSB7CiAgICAgICAgICBpZiAoaW5mby5oYXNDbG9zdXJlQ2FsbFRhcmdldHMpIHsKICAgICAgICAgICAgcHJpbnQoJzxDbG9zdXJlLmNhbGw+Jyk7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKE1lbWJlckVudGl0eSB0YXJnZXQgaW4gaW5mby5jb25jcmV0ZVRhcmdldHMpIHsKICAgICAgICAgICAgaWYgKHRhcmdldCBpcyBGdW5jdGlvbkVudGl0eSkgewogICAgICAgICAgICAgIHByaW50KCcke3R5cGVzLmdldEluZmVycmVkU2lnbmF0dXJlT2ZNZXRob2QodGFyZ2V0KX0gJwogICAgICAgICAgICAgICAgICAnZm9yICR7dGFyZ2V0fScpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHByaW50KCcke3R5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKHRhcmdldCkudHlwZX0gJwogICAgICAgICAgICAgICAgICAnZm9yICR7dGFyZ2V0fScpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChpbmZvIGlzIFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKSB7CiAgICAgICAgICBDbGFzc0VudGl0eSBjbHMgPSBpbmZvLmNhbGxlZEVsZW1lbnQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgICBGdW5jdGlvbkVudGl0eSBjYWxsTWV0aG9kID0gbG9va3VwQ2FsbE1ldGhvZChjbHMpOwogICAgICAgICAgcHJpbnQoJyR7dHlwZXMuZ2V0SW5mZXJyZWRTaWduYXR1cmVPZk1ldGhvZChjYWxsTWV0aG9kKX0gZm9yICR7Y2xzfScpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcmludCgnJHtpbmZvLnR5cGV9IGZvciBzb21lIHVua25vd24ga2luZCBvZiBjbG9zdXJlJyk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgYW5hbHl6ZWRFbGVtZW50cy5mb3JFYWNoKChNZW1iZXJFbnRpdHkgZWxlbSkgewogICAgICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlID0gdHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZWxlbSk7CiAgICAgICAgcHJpbnQoJyR7ZWxlbX0gOjogJHt0eXBlfSBmcm9tICR7dHlwZS5hc3NpZ25tZW50c30gJyk7CiAgICAgIH0pOwogICAgfQogICAgZHVtcD8uYWZ0ZXJBbmFseXNpcygpOwoKICAgIHJlcG9ydGVyLmxvZygnSW5mZXJyZWQgJG92ZXJhbGxSZWZpbmVDb3VudCB0eXBlcy4nKTsKCiAgICBwcm9jZXNzTG9vcEluZm9ybWF0aW9uKCk7CiAgfQoKICAvLy8gQ2FsbCBbYW5hbHl6ZV0gZm9yIGFsbCBsaXZlIG1lbWJlcnMuCiAgdm9pZCBhbmFseXplQWxsRWxlbWVudHMoKSB7CiAgICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IHByb2Nlc3NlZE1lbWJlcnMgPSBjbG9zZWRXb3JsZC5wcm9jZXNzZWRNZW1iZXJzCiAgICAgICAgLndoZXJlKChNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PiAhbWVtYmVyLmlzQWJzdHJhY3QpOwoKICAgIHByb2dyZXNzLnN0YXJ0UGhhc2UoKTsKICAgIHByb2Nlc3NlZE1lbWJlcnMuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICBwcm9ncmVzcy5zaG93UHJvZ3Jlc3MoCiAgICAgICAgICAnQWRkZWQgJywgYWRkZWRJbkdyYXBoLCAnIGVsZW1lbnRzIGluIGluZmVyZW5jaW5nIGdyYXBoLicpOwogICAgICAvLyBUaGlzIGFsc28gZm9yY2VzIHRoZSBjcmVhdGlvbiBvZiB0aGUgW0VsZW1lbnRUeXBlSW5mb3JtYXRpb25dIHRvIGVuc3VyZQogICAgICAvLyBpdCBpcyBpbiB0aGUgZ3JhcGguCiAgICAgIHR5cGVzLndpdGhNZW1iZXIobWVtYmVyLCAoKSA9PiBhbmFseXplKG1lbWJlcikpOwogICAgfSk7CiAgICByZXBvcnRlci5sb2coJ0FkZGVkICRhZGRlZEluR3JhcGggZWxlbWVudHMgaW4gaW5mZXJlbmNpbmcgZ3JhcGguJyk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgYm9keSBub2RlIGZvciBbbWVtYmVyXS4KICBpci5Ob2RlIGNvbXB1dGVNZW1iZXJCb2R5KE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9CiAgICAgICAgY2xvc2VkV29ybGQuZWxlbWVudE1hcC5nZXRNZW1iZXJEZWZpbml0aW9uKG1lbWJlcik7CiAgICBzd2l0Y2ggKGRlZmluaXRpb24ua2luZCkgewogICAgICBjYXNlIE1lbWJlcktpbmQucmVndWxhcjoKICAgICAgICBpci5NZW1iZXIgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICBpZiAobm9kZSBpcyBpci5GaWVsZCkgewogICAgICAgICAgcmV0dXJuIGdldEZpZWxkSW5pdGlhbGl6ZXIoY2xvc2VkV29ybGQuZWxlbWVudE1hcCwgbWVtYmVyKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgICAgICByZXR1cm4gbm9kZS5mdW5jdGlvbjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvcjoKICAgICAgICByZXR1cm4gZGVmaW5pdGlvbi5ub2RlOwogICAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3JCb2R5OgogICAgICAgIGlyLk1lbWJlciBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICAgIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgICAgICByZXR1cm4gbm9kZS5mdW5jdGlvbjsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgICAgICByZXR1cm4gbm9kZS5mdW5jdGlvbjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jbG9zdXJlQ2FsbDoKICAgICAgICBpci5Mb2NhbEZ1bmN0aW9uIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgICAgcmV0dXJuIG5vZGUuZnVuY3Rpb247CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jbG9zdXJlRmllbGQ6CiAgICAgIGNhc2UgTWVtYmVyS2luZC5zaWduYXR1cmU6CiAgICAgIGNhc2UgTWVtYmVyS2luZC5nZW5lcmF0b3JCb2R5OgogICAgICAgIGJyZWFrOwogICAgfQogICAgZmFpbGVkQXQobWVtYmVyLCAnVW5leHBlY3RlZCBtZW1iZXIgZGVmaW5pdGlvbjogJGRlZmluaXRpb24uJyk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBgY2FsbGAgbWV0aG9kIG9uIFtjbHNdIG9yIHRoZSBgbm9TdWNoTWV0aG9kYCBpZiBbY2xzXSBkb2Vzbid0CiAgLy8vIGltcGxlbWVudCBgY2FsbGAuCiAgRnVuY3Rpb25FbnRpdHkgbG9va3VwQ2FsbE1ldGhvZChDbGFzc0VudGl0eSBjbHMpIHsKICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uID0KICAgICAgICBfZWxlbWVudEVudmlyb25tZW50Lmxvb2t1cENsYXNzTWVtYmVyKGNscywgSWRlbnRpZmllcnMuY2FsbCk7CiAgICBpZiAoZnVuY3Rpb24gPT0gbnVsbCB8fCBmdW5jdGlvbi5pc0Fic3RyYWN0KSB7CiAgICAgIGZ1bmN0aW9uID0KICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQubG9va3VwQ2xhc3NNZW1iZXIoY2xzLCBJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYW5hbHl6ZShNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKGFuYWx5emVkRWxlbWVudHMuY29udGFpbnMoZWxlbWVudCkpIHJldHVybjsKICAgIGFuYWx5emVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwoKICAgIGlyLk5vZGUgYm9keSA9IGNvbXB1dGVNZW1iZXJCb2R5KGVsZW1lbnQpOwoKICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlOwogICAgcmVwb3J0ZXIud2l0aEN1cnJlbnRFbGVtZW50KGVsZW1lbnQsICgpIHsKICAgICAgdHlwZSA9IGNvbXB1dGVNZW1iZXJUeXBlSW5mb3JtYXRpb24oZWxlbWVudCwgYm9keSk7CiAgICB9KTsKICAgIGFkZGVkSW5HcmFwaCsrOwoKICAgIGlmIChlbGVtZW50LmlzRmllbGQpIHsKICAgICAgRmllbGRFbnRpdHkgZmllbGQgPSBlbGVtZW50OwogICAgICBpZiAoIWZpZWxkLmlzQXNzaWduYWJsZSkgewogICAgICAgIC8vIElmIFtlbGVtZW50XSBpcyBmaW5hbCBhbmQgaGFzIGFuIGluaXRpYWxpemVyLCB3ZSByZWNvcmQKICAgICAgICAvLyB0aGUgaW5mZXJyZWQgdHlwZS4KICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgICAgICBpZiAodHlwZSBpcyEgTGlzdFR5cGVJbmZvcm1hdGlvbiAmJiB0eXBlIGlzISBNYXBUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgICAgICAgLy8gRm9yIG5vbi1jb250YWluZXIgdHlwZXMsIHRoZSBjb25zdGFudCBoYW5kbGVyIGRvZXMKICAgICAgICAgICAgLy8gY29uc3RhbnQgZm9sZGluZyB0aGF0IGNvdWxkIGdpdmUgbW9yZSBwcmVjaXNlIHJlc3VsdHMuCiAgICAgICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBnZXRGaWVsZENvbnN0YW50KGZpZWxkKTsKICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICBpZiAodmFsdWUuaXNGdW5jdGlvbikgewogICAgICAgICAgICAgICAgRnVuY3Rpb25Db25zdGFudFZhbHVlIGZ1bmN0aW9uQ29uc3RhbnQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uID0gZnVuY3Rpb25Db25zdGFudC5lbGVtZW50OwogICAgICAgICAgICAgICAgdHlwZSA9IHR5cGVzLmFsbG9jYXRlQ2xvc3VyZShmdW5jdGlvbik7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIEFsdGhvdWdoIHdlIG1pZ2h0IGZpbmQgYSBiZXR0ZXIgdHlwZSwgd2UgaGF2ZSB0byBrZWVwCiAgICAgICAgICAgICAgICAvLyB0aGUgb2xkIHR5cGUgYXJvdW5kIHRvIGVuc3VyZSB0aGF0IHdlIGdldCBhIGNvbXBsZXRlIHZpZXcKICAgICAgICAgICAgICAgIC8vIG9mIHRoZSB0eXBlIGdyYXBoIGFuZCBkbyBub3QgZHJvcCBhbnkgZmxvdyBlZGdlcy4KICAgICAgICAgICAgICAgIEFic3RyYWN0VmFsdWUgcmVmaW5lZFR5cGUgPQogICAgICAgICAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uY29tcHV0ZUFic3RyYWN0VmFsdWVGb3JDb25zdGFudCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB0eXBlID0gbmV3IE5hcnJvd1R5cGVJbmZvcm1hdGlvbigKICAgICAgICAgICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLCB0eXBlLCByZWZpbmVkVHlwZSk7CiAgICAgICAgICAgICAgICB0eXBlcy5hbGxvY2F0ZWRUeXBlcy5hZGQodHlwZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZWNvcmRUeXBlT2ZGaWVsZChmaWVsZCwgdHlwZSk7CiAgICAgICAgfSBlbHNlIGlmICghZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgICByZWNvcmRUeXBlT2ZGaWVsZChmaWVsZCwgdHlwZXMubnVsbFR5cGUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChib2R5ID09IG51bGwpIHsKICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0eXBlcyBvZiBzdGF0aWMgZmllbGRzIGlmIHRoZXJlIGlzIG5vCiAgICAgICAgLy8gYXNzaWdubWVudC4gSW5zdGFuY2UgZmllbGRzIGFyZSBkZWFsdCB3aXRoIGluIHRoZSBjb25zdHJ1Y3Rvci4KICAgICAgICBpZiAoZWxlbWVudC5pc1N0YXRpYyB8fCBlbGVtZW50LmlzVG9wTGV2ZWwpIHsKICAgICAgICAgIHJlY29yZFR5cGVPZkZpZWxkKGZpZWxkLCB0eXBlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVjb3JkVHlwZU9mRmllbGQoZmllbGQsIHR5cGUpOwogICAgICB9CiAgICAgIGlmICgoZWxlbWVudC5pc1N0YXRpYyB8fCBlbGVtZW50LmlzVG9wTGV2ZWwpICYmCiAgICAgICAgICBib2R5ICE9IG51bGwgJiYKICAgICAgICAgICFlbGVtZW50LmlzQ29uc3QpIHsKICAgICAgICBpZiAoaXNGaWVsZEluaXRpYWxpemVyUG90ZW50aWFsbHlOdWxsKGVsZW1lbnQsIGJvZHkpKSB7CiAgICAgICAgICByZWNvcmRUeXBlT2ZGaWVsZChmaWVsZCwgdHlwZXMubnVsbFR5cGUpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0gZWxlbWVudDsKICAgICAgcmVjb3JkUmV0dXJuVHlwZShtZXRob2QsIHR5cGUpOwogICAgfQogIH0KCiAgLy8vIFZpc2l0cyBbYm9keV0gdG8gY29tcHV0ZSB0aGUgW1R5cGVJbmZvcm1hdGlvbl0gbm9kZSBmb3IgW21lbWJlcl0uCiAgVHlwZUluZm9ybWF0aW9uIGNvbXB1dGVNZW1iZXJUeXBlSW5mb3JtYXRpb24oCiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIsIGlyLk5vZGUgYm9keSkgewogICAgS2VybmVsVHlwZUdyYXBoQnVpbGRlciB2aXNpdG9yID0gbmV3IEtlcm5lbFR5cGVHcmFwaEJ1aWxkZXIoCiAgICAgICAgb3B0aW9ucywKICAgICAgICBjbG9zZWRXb3JsZCwKICAgICAgICB0aGlzLAogICAgICAgIG1lbWJlciwKICAgICAgICBib2R5LAogICAgICAgIGNsb3NlZFdvcmxkLmdsb2JhbExvY2Fsc01hcC5nZXRMb2NhbHNNYXAobWVtYmVyKSwKICAgICAgICBjbG9zZWRXb3JsZC5lbGVtZW50TWFwLmdldFN0YXRpY1R5cGVQcm92aWRlcihtZW1iZXIpKTsKICAgIHJldHVybiB2aXNpdG9yLnJ1bigpOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoZSBbaW5pdGlhbGl6ZXJdIG9mIHRoZSBub24tY29uc3Qgc3RhdGljIG9yIHRvcC1sZXZlbAogIC8vLyBbZmllbGRdIGlzIHBvdGVudGlhbGx5IGBudWxsYC4KICBib29sIGlzRmllbGRJbml0aWFsaXplclBvdGVudGlhbGx5TnVsbCgKICAgICAgRmllbGRFbnRpdHkgZmllbGQsIGlyLk5vZGUgaW5pdGlhbGl6ZXIpIHsKICAgIC8vIFRPRE8oMTM0MjkpOiBXZSBjb3VsZCBkbyBiZXR0ZXIgaGVyZSBieSB1c2luZyB0aGUKICAgIC8vIGNvbnN0YW50IGhhbmRsZXIgdG8gZmlndXJlIG91dCBpZiBpdCdzIGEgbGF6eSBmaWVsZCBvciBub3QuCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJbXBsZW1lbnQgdGhlIGFkLWhvYyBjaGVjayBpbiBhc3QgaW5mZXJyZXI/IFRoaXMKICAgIC8vIG1pbWlja3MgdGhhdCBhc3QgaW5mZXJyZXIgd2hpY2ggcmV0dXJuIGB0cnVlYCBmb3IgW2FzdC5TZW5kXSBhbmQKICAgIC8vIG5vbi1jb25zdCBbYXN0Lk5ld0V4cHJlc3Npb25dLgogICAgaWYgKGluaXRpYWxpemVyIGlzIGlyLk1ldGhvZEludm9jYXRpb24gfHwKICAgICAgICBpbml0aWFsaXplciBpcyBpci5Qcm9wZXJ0eUdldCB8fAogICAgICAgIGluaXRpYWxpemVyIGlzIGlyLlByb3BlcnR5U2V0IHx8CiAgICAgICAgaW5pdGlhbGl6ZXIgaXMgaXIuU3RhdGljSW52b2NhdGlvbiB8fAogICAgICAgIGluaXRpYWxpemVyIGlzIGlyLlN0YXRpY0dldCB8fAogICAgICAgIGluaXRpYWxpemVyIGlzIGlyLlN0YXRpY1NldCB8fAogICAgICAgIGluaXRpYWxpemVyIGlzIGlyLkxldCB8fAogICAgICAgIGluaXRpYWxpemVyIGlzIGlyLkNvbnN0cnVjdG9ySW52b2NhdGlvbiAmJiAhaW5pdGlhbGl6ZXIuaXNDb25zdCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbQ29uc3RhbnRWYWx1ZV0gZm9yIHRoZSBpbml0aWFsIHZhbHVlIG9mIFtmaWVsZF0sIG9yCiAgLy8vIGBudWxsYCBpZiB0aGUgaW5pdGlhbGl6ZXIgaXMgbm90IGEgY29uc3RhbnQgdmFsdWUuCiAgQ29uc3RhbnRWYWx1ZSBnZXRGaWVsZENvbnN0YW50KEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEoZmllbGQpLmluaXRpYWxWYWx1ZTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBoYXMgYSAnY2FsbCcgbWV0aG9kLgogIGJvb2wgaGFzQ2FsbFR5cGUoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuZWxlbWVudE1hcC50eXBlcwogICAgICAgICAgICAuZ2V0Q2FsbFR5cGUoY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKGNscykpICE9CiAgICAgICAgbnVsbDsKICB9CgogIHZvaWQgcHJvY2Vzc0xvb3BJbmZvcm1hdGlvbigpIHsKICAgIHR5cGVzLmFsbG9jYXRlZENhbGxzLmZvckVhY2goKENhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgICAgaWYgKCFpbmZvLmluTG9vcCkgcmV0dXJuOwogICAgICAvLyBXZSBjYW4ndCBjb21wdXRlIHRoZSBjYWxsZWVzIG9mIGNsb3N1cmVzLCBubyBuZXcgaW5mb3JtYXRpb24gdG8gYWRkLgogICAgICBpZiAoaW5mbyBpcyBDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGluZm8gaXMgU3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gaW5mby5jYWxsZWRFbGVtZW50OwogICAgICAgIGluZmVycmVkRGF0YUJ1aWxkZXIuYWRkRnVuY3Rpb25DYWxsZWRJbkxvb3AobWVtYmVyKTsKICAgICAgfSBlbHNlIGlmIChpbmZvLm1hc2sgIT0gbnVsbCAmJgogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5jb250YWluc0FsbChpbmZvLm1hc2spLmlzRGVmaW5pdGVseUZhbHNlKSB7CiAgICAgICAgLy8gRm9yIGluc3RhbmNlIG1ldGhvZHMsIHdlIG9ubHkgcmVnaXN0ZXIgYSBzZWxlY3RvciBjYWxsZWQgaW4gYQogICAgICAgIC8vIGxvb3AgaWYgaXQgaXMgYSB0eXBlZCBzZWxlY3RvciwgdG8gYXZvaWQgbWFya2luZyB0b28gbWFueQogICAgICAgIC8vIG1ldGhvZHMgYXMgYmVpbmcgY2FsbGVkIGZyb20gd2l0aGluIGEgbG9vcC4gVGhpcyBjdXRzIGRvd24KICAgICAgICAvLyBvbiB0aGUgY29kZSBibG9hdC4KICAgICAgICBpbmZvLmNhbGxlZXMuZm9yRWFjaCgoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgICAgICAgIGluZmVycmVkRGF0YUJ1aWxkZXIuYWRkRnVuY3Rpb25DYWxsZWRJbkxvb3AoZWxlbWVudCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCByZWZpbmUoKSB7CiAgICBwcm9ncmVzcy5zdGFydFBoYXNlKCk7CiAgICB3aGlsZSAoIXdvcmtRdWV1ZS5pc0VtcHR5KSB7CiAgICAgIHByb2dyZXNzLnNob3dQcm9ncmVzcygnSW5mZXJyZWQgJywgb3ZlcmFsbFJlZmluZUNvdW50LCAnIHR5cGVzLicpOwogICAgICBUeXBlSW5mb3JtYXRpb24gaW5mbyA9IHdvcmtRdWV1ZS5yZW1vdmUoKTsKICAgICAgQWJzdHJhY3RWYWx1ZSBvbGRUeXBlID0gaW5mby50eXBlOwogICAgICBBYnN0cmFjdFZhbHVlIG5ld1R5cGUgPSBpbmZvLnJlZmluZSh0aGlzKTsKICAgICAgLy8gQ2hlY2sgdGhhdCByZWZpbmVtZW50IGhhcyBub3QgYWNjaWRlbnRhbGx5IGNoYW5nZWQgdGhlIHR5cGUuCiAgICAgIGFzc2VydChvbGRUeXBlID09IGluZm8udHlwZSk7CiAgICAgIGlmIChpbmZvLmFiYW5kb25JbmZlcmVuY2luZykgaW5mby5kb05vdEVucXVldWUgPSB0cnVlOwogICAgICBpZiAoKGluZm8udHlwZSA9IG5ld1R5cGUpICE9IG9sZFR5cGUpIHsKICAgICAgICBvdmVyYWxsUmVmaW5lQ291bnQrKzsKICAgICAgICBpbmZvLnJlZmluZUNvdW50Kys7CiAgICAgICAgaWYgKGluZm8ucmVmaW5lQ291bnQgPiBNQVhfQ0hBTkdFX0NPVU5UKSB7CiAgICAgICAgICBpZiAoZGVidWcuQU5PTUFMWV9XQVJOKSB7CiAgICAgICAgICAgIHByaW50KCJBTk9NQUxZIFdBUk5JTkc6IG1heCByZWZpbmVtZW50IHJlYWNoZWQgZm9yICRpbmZvIik7CiAgICAgICAgICB9CiAgICAgICAgICBpbmZvLmdpdmVVcCh0aGlzKTsKICAgICAgICAgIGluZm8udHlwZSA9IGluZm8ucmVmaW5lKHRoaXMpOwogICAgICAgICAgaW5mby5kb05vdEVucXVldWUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICB3b3JrUXVldWUuYWRkQWxsKGluZm8udXNlcnMpOwogICAgICAgIGlmIChpbmZvLmhhc1N0YWJsZVR5cGUodGhpcykpIHsKICAgICAgICAgIGluZm8uc3RhYmlsaXplKHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBidWlsZFdvcmtRdWV1ZSgpIHsKICAgIHdvcmtRdWV1ZS5hZGRBbGwodHlwZXMub3JkZXJlZFR5cGVJbmZvcm1hdGlvbnMpOwogICAgd29ya1F1ZXVlLmFkZEFsbCh0eXBlcy5hbGxvY2F0ZWRUeXBlcyk7CiAgICB3b3JrUXVldWUuYWRkQWxsKHR5cGVzLmFsbG9jYXRlZENsb3N1cmVzKTsKICAgIHdvcmtRdWV1ZS5hZGRBbGwodHlwZXMuYWxsb2NhdGVkQ2FsbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB1cGRhdGVQYXJhbWV0ZXJBc3NpZ25tZW50cyhUeXBlSW5mb3JtYXRpb24gY2FsbGVyLCBNZW1iZXJFbnRpdHkgY2FsbGVlLAogICAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMsIFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIG1hc2ssCiAgICAgIHtib29sIHJlbW92ZSwgYm9vbCBhZGRUb1F1ZXVlOiB0cnVlfSkgewogICAgaWYgKGNhbGxlZS5uYW1lID09IElkZW50aWZpZXJzLm5vU3VjaE1ldGhvZF8pIHJldHVybjsKICAgIGlmIChjYWxsZWUuaXNGaWVsZCkgewogICAgICBpZiAoc2VsZWN0b3IuaXNTZXR0ZXIpIHsKICAgICAgICBFbGVtZW50VHlwZUluZm9ybWF0aW9uIGluZm8gPSB0eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihjYWxsZWUpOwogICAgICAgIGlmIChyZW1vdmUpIHsKICAgICAgICAgIGluZm8ucmVtb3ZlQXNzaWdubWVudChhcmd1bWVudHMucG9zaXRpb25hbFswXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluZm8uYWRkQXNzaWdubWVudChhcmd1bWVudHMucG9zaXRpb25hbFswXSk7CiAgICAgICAgfQogICAgICAgIGlmIChhZGRUb1F1ZXVlKSB3b3JrUXVldWUuYWRkKGluZm8pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNhbGxlZS5pc0dldHRlcikgewogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yICE9IG51bGwgJiYgc2VsZWN0b3IuaXNHZXR0ZXIpIHsKICAgICAgLy8gV2UgYXJlIHRlYXJpbmcgYSBmdW5jdGlvbiBvZmYgYW5kIHRodXMgY3JlYXRlIGEgY2xvc3VyZS4KICAgICAgYXNzZXJ0KGNhbGxlZS5pc0Z1bmN0aW9uKTsKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGluZm8gPSB0eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihjYWxsZWUpOwogICAgICBpZiAocmVtb3ZlKSB7CiAgICAgICAgaW5mby5jbG9zdXJpemVkQ291bnQtLTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbmZvLmNsb3N1cml6ZWRDb3VudCsrOwogICAgICAgIGlmIChjYWxsZWUuaXNTdGF0aWMgfHwgY2FsbGVlLmlzVG9wTGV2ZWwpIHsKICAgICAgICAgIHR5cGVzLmFsbG9jYXRlZENsb3N1cmVzLmFkZChpbmZvKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gV2UgYWRkIHRoZSBjYWxsLXNpdGUgdHlwZSBpbmZvcm1hdGlvbiBoZXJlIHNvIHRoYXQgd2UKICAgICAgICAgIC8vIGNhbiBiZW5lZml0IGZyb20gZnVydGhlciByZWZpbmVtZW50IG9mIHRoZSBzZWxlY3Rvci4KICAgICAgICAgIHR5cGVzLmFsbG9jYXRlZENsb3N1cmVzLmFkZChjYWxsZXIpOwogICAgICAgIH0KICAgICAgICB0eXBlcy5zdHJhdGVneS5mb3JFYWNoUGFyYW1ldGVyKGNhbGxlZSwgKExvY2FsIHBhcmFtZXRlcikgewogICAgICAgICAgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uIGluZm8gPQogICAgICAgICAgICAgIHR5cGVzLmdldEluZmVycmVkVHlwZU9mUGFyYW1ldGVyKHBhcmFtZXRlcik7CiAgICAgICAgICBpbmZvLnRhZ0FzVGVhck9mZkNsb3N1cmVQYXJhbWV0ZXIodGhpcyk7CiAgICAgICAgICBpZiAoYWRkVG9RdWV1ZSkgd29ya1F1ZXVlLmFkZChpbmZvKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0gY2FsbGVlOwogICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlID0gbWV0aG9kLnBhcmFtZXRlclN0cnVjdHVyZTsKICAgICAgaW50IHBhcmFtZXRlckluZGV4ID0gMDsKICAgICAgdHlwZXMuc3RyYXRlZ3kuZm9yRWFjaFBhcmFtZXRlcihjYWxsZWUsIChMb2NhbCBwYXJhbWV0ZXIpIHsKICAgICAgICBUeXBlSW5mb3JtYXRpb24gdHlwZTsKICAgICAgICBpZiAocGFyYW1ldGVySW5kZXggPCBwYXJhbWV0ZXJTdHJ1Y3R1cmUucmVxdWlyZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgICB0eXBlID0gYXJndW1lbnRzLnBvc2l0aW9uYWxbcGFyYW1ldGVySW5kZXhdOwogICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgICB0eXBlID0gYXJndW1lbnRzLm5hbWVkW3BhcmFtZXRlci5uYW1lXTsKICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlckluZGV4IDwgYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoKSB7CiAgICAgICAgICB0eXBlID0gYXJndW1lbnRzLnBvc2l0aW9uYWxbcGFyYW1ldGVySW5kZXhdOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB0eXBlID0gZ2V0RGVmYXVsdFR5cGVPZlBhcmFtZXRlcihwYXJhbWV0ZXIpOwogICAgICAgIFR5cGVJbmZvcm1hdGlvbiBpbmZvID0gdHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZQYXJhbWV0ZXIocGFyYW1ldGVyKTsKICAgICAgICBpZiAocmVtb3ZlKSB7CiAgICAgICAgICBpbmZvLnJlbW92ZUFzc2lnbm1lbnQodHlwZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluZm8uYWRkQXNzaWdubWVudCh0eXBlKTsKICAgICAgICB9CiAgICAgICAgcGFyYW1ldGVySW5kZXgrKzsKICAgICAgICBpZiAoYWRkVG9RdWV1ZSkgd29ya1F1ZXVlLmFkZChpbmZvKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHNldERlZmF1bHRUeXBlT2ZQYXJhbWV0ZXIoTG9jYWwgcGFyYW1ldGVyLCBUeXBlSW5mb3JtYXRpb24gdHlwZSwKICAgICAge2Jvb2wgaXNJbnN0YW5jZU1lbWJlcn0pIHsKICAgIGFzc2VydCgKICAgICAgICB0eXBlICE9IG51bGwsIGZhaWxlZEF0KHBhcmFtZXRlciwgIk5vIGRlZmF1bHQgdHlwZSBmb3IgJHBhcmFtZXRlci4iKSk7CiAgICBUeXBlSW5mb3JtYXRpb24gZXhpc3RpbmcgPSBkZWZhdWx0VHlwZU9mUGFyYW1ldGVyW3BhcmFtZXRlcl07CiAgICBkZWZhdWx0VHlwZU9mUGFyYW1ldGVyW3BhcmFtZXRlcl0gPSB0eXBlOwogICAgVHlwZUluZm9ybWF0aW9uIGluZm8gPSB0eXBlcy5nZXRJbmZlcnJlZFR5cGVPZlBhcmFtZXRlcihwYXJhbWV0ZXIpOwogICAgaWYgKGV4aXN0aW5nICE9IG51bGwgJiYgZXhpc3RpbmcgaXMgUGxhY2Vob2xkZXJUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgLy8gUmVwbGFjZSByZWZlcmVuY2VzIHRvIFtleGlzdGluZ10gdG8gdXNlIFt0eXBlXSBpbnN0ZWFkLgogICAgICBpZiAoaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAgIFBhcmFtZXRlckFzc2lnbm1lbnRzIGFzc2lnbm1lbnRzID0gaW5mby5hc3NpZ25tZW50czsKICAgICAgICBhc3NpZ25tZW50cy5yZXBsYWNlKGV4aXN0aW5nLCB0eXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBMaXN0PFR5cGVJbmZvcm1hdGlvbj4gYXNzaWdubWVudHMgPSBpbmZvLmFzc2lnbm1lbnRzOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXNzaWdubWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmIChhc3NpZ25tZW50c1tpXSA9PSBleGlzdGluZykgewogICAgICAgICAgICBhc3NpZ25tZW50c1tpXSA9IHR5cGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIEFsc28gZm9yd2FyZCBhbGwgdXNlcnMuCiAgICAgIHR5cGUuYWRkVXNlcnNPZihleGlzdGluZyk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoZXhpc3RpbmcgPT0gbnVsbCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gZ2V0RGVmYXVsdFR5cGVPZlBhcmFtZXRlcihMb2NhbCBwYXJhbWV0ZXIpIHsKICAgIHJldHVybiBkZWZhdWx0VHlwZU9mUGFyYW1ldGVyLnB1dElmQWJzZW50KHBhcmFtZXRlciwgKCkgewogICAgICByZXR1cm4gbmV3IFBsYWNlaG9sZGVyVHlwZUluZm9ybWF0aW9uKAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbiwgdHlwZXMuY3VycmVudE1lbWJlcik7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzQWxyZWFkeUNvbXB1dGVkVHlwZU9mUGFyYW1ldGVyRGVmYXVsdChMb2NhbCBwYXJhbWV0ZXIpIHsKICAgIFR5cGVJbmZvcm1hdGlvbiBzZWVuID0gZGVmYXVsdFR5cGVPZlBhcmFtZXRlcltwYXJhbWV0ZXJdOwogICAgcmV0dXJuIChzZWVuICE9IG51bGwgJiYgc2VlbiBpcyEgUGxhY2Vob2xkZXJUeXBlSW5mb3JtYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHR5cGVPZlBhcmFtZXRlcihMb2NhbCBlbGVtZW50KSB7CiAgICByZXR1cm4gdHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZQYXJhbWV0ZXIoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdHlwZU9mTWVtYmVyKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoZWxlbWVudCBpcyBGdW5jdGlvbkVudGl0eSkgcmV0dXJuIHR5cGVzLmZ1bmN0aW9uVHlwZTsKICAgIHJldHVybiB0eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiByZXR1cm5UeXBlT2ZNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50IGlzISBGdW5jdGlvbkVudGl0eSkgcmV0dXJuIHR5cGVzLmR5bmFtaWNUeXBlOwogICAgcmV0dXJuIHR5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWNvcmRUeXBlT2ZGaWVsZChGaWVsZEVudGl0eSBlbGVtZW50LCBUeXBlSW5mb3JtYXRpb24gdHlwZSkgewogICAgdHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZWxlbWVudCkuYWRkQXNzaWdubWVudCh0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVjb3JkUmV0dXJuVHlwZShGdW5jdGlvbkVudGl0eSBlbGVtZW50LCBUeXBlSW5mb3JtYXRpb24gdHlwZSkgewogICAgVHlwZUluZm9ybWF0aW9uIGluZm8gPSB0eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihlbGVtZW50KTsKICAgIGlmIChlbGVtZW50Lm5hbWUgPT0gJz09JykgewogICAgICAvLyBFdmVuIGlmIHguPT0gZG9lc24ndCByZXR1cm4gYSBib29sLCAneCA9PSBudWxsJyBldmFsdWF0ZXMgdG8gJ2ZhbHNlJy4KICAgICAgaW5mby5hZGRBc3NpZ25tZW50KHR5cGVzLmJvb2xUeXBlKTsKICAgIH0KICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogQ2xlYW4gdXAuIFdlIGRvIHRoZXNlIGNoZWNrcyBiZWNhdXNlCiAgICAvLyBbU2ltcGxlVHlwZXNJbmZlcnJlcl0gZGVhbHMgd2l0aCB0d28gZGlmZmVyZW50IGluZmVycmVycy4KICAgIGlmICh0eXBlID09IG51bGwpIHJldHVybjsKICAgIGlmIChpbmZvLmFzc2lnbm1lbnRzLmlzRW1wdHkpIGluZm8uYWRkQXNzaWdubWVudCh0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiBhZGRSZXR1cm5UeXBlRm9yTWV0aG9kKAogICAgICBGdW5jdGlvbkVudGl0eSBlbGVtZW50LCBUeXBlSW5mb3JtYXRpb24gdW51c2VkLCBUeXBlSW5mb3JtYXRpb24gbmV3VHlwZSkgewogICAgVHlwZUluZm9ybWF0aW9uIHR5cGUgPSB0eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihlbGVtZW50KTsKICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogQ2xlYW4gdXAuIFdlIGRvIHRoaXMgY2hlY2sgYmVjYXVzZQogICAgLy8gW1NpbXBsZVR5cGVzSW5mZXJyZXJdIGRlYWxzIHdpdGggdHdvIGRpZmZlcmVudCBpbmZlcnJlcnMuCiAgICBpZiAoZWxlbWVudCBpcyBDb25zdHJ1Y3RvckVudGl0eSAmJiBlbGVtZW50LmlzR2VuZXJhdGl2ZUNvbnN0cnVjdG9yKSB7CiAgICAgIHJldHVybiB0eXBlOwogICAgfQogICAgdHlwZS5hZGRBc3NpZ25tZW50KG5ld1R5cGUpOwogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gcmVnaXN0ZXJDYWxsZWRNZW1iZXIoCiAgICAgIE9iamVjdCBub2RlLAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLAogICAgICBNZW1iZXJFbnRpdHkgY2FsbGVyLAogICAgICBNZW1iZXJFbnRpdHkgY2FsbGVlLAogICAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMsCiAgICAgIFNpZGVFZmZlY3RzQnVpbGRlciBzaWRlRWZmZWN0c0J1aWxkZXIsCiAgICAgIGJvb2wgaW5Mb29wKSB7CiAgICBDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKAogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgICAgdHlwZXMuY3VycmVudE1lbWJlciwKICAgICAgICBub2RlLAogICAgICAgIGNhbGxlciwKICAgICAgICBjYWxsZWUsCiAgICAgICAgc2VsZWN0b3IsCiAgICAgICAgbWFzaywKICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgaW5Mb29wKTsKICAgIC8vIElmIHRoaXMgY2xhc3MgaGFzIGEgJ2NhbGwnIG1ldGhvZCB0aGVuIHdlIGhhdmUgZXNzZW50aWFsbHkgY3JlYXRlZCBhCiAgICAvLyBjbG9zdXJlIGhlcmUuIFJlZ2lzdGVyIGl0IGFzIHN1Y2ggc28gdGhhdCBpdCBpcyB0cmFjZWQuCiAgICAvLyBOb3RlOiB3ZSBleGNsdWRlIGZhY3RvcnkgY29uc3RydWN0b3JzIGJlY2F1c2UgdGhleSBkb24ndCBhbHdheXMgY3JlYXRlIGFuCiAgICAvLyBpbnN0YW5jZSBvZiB0aGUgdHlwZS4gVGhleSBhcmUgc3RhdGljIG1ldGhvZHMgdGhhdCBkZWxlZ2F0ZSB0byBzb21lIG90aGVyCiAgICAvLyBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIHRvIGRvIHRoZSBhY3R1YWwgY3JlYXRpb24gb2YgdGhlIG9iamVjdC4KICAgIGlmIChzZWxlY3RvciAhPSBudWxsICYmCiAgICAgICAgc2VsZWN0b3IuaXNDYWxsICYmCiAgICAgICAgY2FsbGVlIGlzIENvbnN0cnVjdG9yRW50aXR5ICYmCiAgICAgICAgY2FsbGVlLmlzR2VuZXJhdGl2ZUNvbnN0cnVjdG9yKSB7CiAgICAgIENsYXNzRW50aXR5IGNscyA9IGNhbGxlZS5lbmNsb3NpbmdDbGFzczsKICAgICAgaWYgKGhhc0NhbGxUeXBlKGNscykpIHsKICAgICAgICB0eXBlcy5hbGxvY2F0ZWRDbG9zdXJlcy5hZGQoaW5mbyk7CiAgICAgIH0KICAgIH0KICAgIGluZm8uYWRkVG9HcmFwaCh0aGlzKTsKICAgIHR5cGVzLmFsbG9jYXRlZENhbGxzLmFkZChpbmZvKTsKICAgIHVwZGF0ZVNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzQnVpbGRlciwgc2VsZWN0b3IsIGNhbGxlZSk7CiAgICByZXR1cm4gaW5mbzsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiByZWdpc3RlckNhbGxlZFNlbGVjdG9yKAogICAgICBDYWxsVHlwZSBjYWxsVHlwZSwKICAgICAgaXIuTm9kZSBub2RlLAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLAogICAgICBUeXBlSW5mb3JtYXRpb24gcmVjZWl2ZXJUeXBlLAogICAgICBNZW1iZXJFbnRpdHkgY2FsbGVyLAogICAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMsCiAgICAgIFNpZGVFZmZlY3RzQnVpbGRlciBzaWRlRWZmZWN0c0J1aWxkZXIsCiAgICAgIHtib29sIGluTG9vcCwKICAgICAgYm9vbCBpc0NvbmRpdGlvbmFsfSkgewogICAgaWYgKHNlbGVjdG9yLmlzQ2xvc3VyZUNhbGwpIHsKICAgICAgcmV0dXJuIHJlZ2lzdGVyQ2FsbGVkQ2xvc3VyZShub2RlLCBzZWxlY3RvciwgbWFzaywgcmVjZWl2ZXJUeXBlLCBjYWxsZXIsCiAgICAgICAgICBhcmd1bWVudHMsIHNpZGVFZmZlY3RzQnVpbGRlciwKICAgICAgICAgIGluTG9vcDogaW5Mb29wKTsKICAgIH0KCiAgICBpZiAoY2xvc2VkV29ybGQuaW5jbHVkZXNDbG9zdXJlQ2FsbChzZWxlY3RvciwgbWFzaykpIHsKICAgICAgc2lkZUVmZmVjdHNCdWlsZGVyLnNldEFsbFNpZGVFZmZlY3RzQW5kRGVwZW5kc09uU29tZXRoaW5nKCk7CiAgICB9CiAgICBjbG9zZWRXb3JsZC5sb2NhdGVNZW1iZXJzKHNlbGVjdG9yLCBtYXNrKS5mb3JFYWNoKChjYWxsZWUpIHsKICAgICAgdXBkYXRlU2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNCdWlsZGVyLCBzZWxlY3RvciwgY2FsbGVlKTsKICAgIH0pOwoKICAgIENhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8gPSBuZXcgRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKAogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgICAgdHlwZXMuY3VycmVudE1lbWJlciwKICAgICAgICBjYWxsVHlwZSwKICAgICAgICBub2RlLAogICAgICAgIGNhbGxlciwKICAgICAgICBzZWxlY3RvciwKICAgICAgICBtYXNrLAogICAgICAgIHJlY2VpdmVyVHlwZSwKICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgaW5Mb29wLAogICAgICAgIGlzQ29uZGl0aW9uYWwpOwoKICAgIGluZm8uYWRkVG9HcmFwaCh0aGlzKTsKICAgIHR5cGVzLmFsbG9jYXRlZENhbGxzLmFkZChpbmZvKTsKICAgIHJldHVybiBpbmZvOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHJlZ2lzdGVyQXdhaXQoaXIuTm9kZSBub2RlLCBUeXBlSW5mb3JtYXRpb24gYXJndW1lbnQpIHsKICAgIEF3YWl0VHlwZUluZm9ybWF0aW9uIGluZm8gPSBuZXcgQXdhaXRUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbiwgdHlwZXMuY3VycmVudE1lbWJlciwgbm9kZSk7CiAgICBpbmZvLmFkZEFzc2lnbm1lbnQoYXJndW1lbnQpOwogICAgdHlwZXMuYWxsb2NhdGVkVHlwZXMuYWRkKGluZm8pOwogICAgcmV0dXJuIGluZm87CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gcmVnaXN0ZXJZaWVsZChpci5Ob2RlIG5vZGUsIFR5cGVJbmZvcm1hdGlvbiBhcmd1bWVudCkgewogICAgWWllbGRUeXBlSW5mb3JtYXRpb24gaW5mbyA9IG5ldyBZaWVsZFR5cGVJbmZvcm1hdGlvbigKICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLCB0eXBlcy5jdXJyZW50TWVtYmVyLCBub2RlKTsKICAgIGluZm8uYWRkQXNzaWdubWVudChhcmd1bWVudCk7CiAgICB0eXBlcy5hbGxvY2F0ZWRUeXBlcy5hZGQoaW5mbyk7CiAgICByZXR1cm4gaW5mbzsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiByZWdpc3RlckNhbGxlZENsb3N1cmUoCiAgICAgIGlyLk5vZGUgbm9kZSwKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywKICAgICAgVHlwZUluZm9ybWF0aW9uIGNsb3N1cmUsCiAgICAgIE1lbWJlckVudGl0eSBjYWxsZXIsCiAgICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cywKICAgICAgU2lkZUVmZmVjdHNCdWlsZGVyIHNpZGVFZmZlY3RzQnVpbGRlciwKICAgICAge2Jvb2wgaW5Mb29wfSkgewogICAgc2lkZUVmZmVjdHNCdWlsZGVyLnNldEFsbFNpZGVFZmZlY3RzQW5kRGVwZW5kc09uU29tZXRoaW5nKCk7CiAgICBDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvID0gbmV3IENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbigKICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICAgIHR5cGVzLmN1cnJlbnRNZW1iZXIsCiAgICAgICAgbm9kZSwKICAgICAgICBjYWxsZXIsCiAgICAgICAgc2VsZWN0b3IsCiAgICAgICAgbWFzaywKICAgICAgICBjbG9zdXJlLAogICAgICAgIGFyZ3VtZW50cywKICAgICAgICBpbkxvb3ApOwogICAgaW5mby5hZGRUb0dyYXBoKHRoaXMpOwogICAgdHlwZXMuYWxsb2NhdGVkQ2FsbHMuYWRkKGluZm8pOwogICAgcmV0dXJuIGluZm87CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsb3NlKCkgewogICAgZm9yIChNZW1iZXJUeXBlSW5mb3JtYXRpb24gdHlwZUluZm9ybWF0aW9uCiAgICAgICAgaW4gdHlwZXMubWVtYmVyVHlwZUluZm9ybWF0aW9ucy52YWx1ZXMpIHsKICAgICAgdHlwZUluZm9ybWF0aW9uLmNvbXB1dGVJc0NhbGxlZE9uY2UoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xlYXIoKSB7CiAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHJldHVybjsKCiAgICB2b2lkIGNsZWFudXAoVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgICAgaW5mby5jbGVhbnVwKCk7CiAgICB9CgogICAgdHlwZXMuYWxsb2NhdGVkQ2FsbHMuZm9yRWFjaChjbGVhbnVwKTsKICAgIHR5cGVzLmFsbG9jYXRlZENhbGxzLmNsZWFyKCk7CgogICAgZGVmYXVsdFR5cGVPZlBhcmFtZXRlci5jbGVhcigpOwoKICAgIHR5cGVzLnBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbnMudmFsdWVzLmZvckVhY2goY2xlYW51cCk7CiAgICB0eXBlcy5tZW1iZXJUeXBlSW5mb3JtYXRpb25zLnZhbHVlcy5mb3JFYWNoKGNsZWFudXApOwoKICAgIHR5cGVzLmFsbG9jYXRlZFR5cGVzLmZvckVhY2goY2xlYW51cCk7CiAgICB0eXBlcy5hbGxvY2F0ZWRUeXBlcy5jbGVhcigpOwoKICAgIHR5cGVzLmNvbmNyZXRlVHlwZXMuY2xlYXIoKTsKCiAgICB0eXBlcy5hbGxvY2F0ZWRDbG9zdXJlcy5mb3JFYWNoKGNsZWFudXApOwogICAgdHlwZXMuYWxsb2NhdGVkQ2xvc3VyZXMuY2xlYXIoKTsKCiAgICBhbmFseXplZEVsZW1lbnRzLmNsZWFyKCk7CiAgICBnZW5lcmF0aXZlQ29uc3RydWN0b3JzRXhwb3NpbmdUaGlzLmNsZWFyKCk7CgogICAgdHlwZXMuYWxsb2NhdGVkTWFwcy52YWx1ZXMuZm9yRWFjaChjbGVhbnVwKTsKICAgIHR5cGVzLmFsbG9jYXRlZFNldHMudmFsdWVzLmZvckVhY2goY2xlYW51cCk7CiAgICB0eXBlcy5hbGxvY2F0ZWRMaXN0cy52YWx1ZXMuZm9yRWFjaChjbGVhbnVwKTsKCiAgICBfbWVtYmVyRGF0YS5jbGVhcigpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXRDYWxsZXJzT2ZGb3JUZXN0aW5nKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gaW5mbyA9IHR5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKGVsZW1lbnQpOwogICAgcmV0dXJuIGluZm8uY2FsbGVyc0ZvclRlc3Rpbmc7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdHlwZU9mTWVtYmVyV2l0aFNlbGVjdG9yKAogICAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCwgU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgIGlmIChlbGVtZW50Lm5hbWUgPT0gSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXyAmJgogICAgICAgIHNlbGVjdG9yLm5hbWUgIT0gZWxlbWVudC5uYW1lKSB7CiAgICAgIC8vIEFuIGludm9jYXRpb24gY2FuIHJlc29sdmUgdG8gYSBbbm9TdWNoTWV0aG9kXSwgaW4gd2hpY2ggY2FzZQogICAgICAvLyB3ZSBnZXQgdGhlIHJldHVybiB0eXBlIG9mIFtub1N1Y2hNZXRob2RdLgogICAgICByZXR1cm4gcmV0dXJuVHlwZU9mTWVtYmVyKGVsZW1lbnQpOwogICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pc0dldHRlcikgewogICAgICBpZiAoZWxlbWVudC5pc0Z1bmN0aW9uKSB7CiAgICAgICAgLy8gW2Z1bmN0aW9uVHlwZV0gaXMgbnVsbCBpZiB0aGUgaW5mZXJyZXIgZGlkIG5vdCBydW4uCiAgICAgICAgcmV0dXJuIHR5cGVzLmZ1bmN0aW9uVHlwZSA9PSBudWxsCiAgICAgICAgICAgID8gdHlwZXMuZHluYW1pY1R5cGUKICAgICAgICAgICAgOiB0eXBlcy5mdW5jdGlvblR5cGU7CiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc0ZpZWxkKSB7CiAgICAgICAgcmV0dXJuIHR5cGVPZk1lbWJlcihlbGVtZW50KTsKICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmlzR2V0dGVyKSB7CiAgICAgICAgcmV0dXJuIHJldHVyblR5cGVPZk1lbWJlcihlbGVtZW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoZmFsc2UsIGZhaWxlZEF0KGVsZW1lbnQsICJVbmV4cGVjdGVkIG1lbWJlciAkZWxlbWVudCIpKTsKICAgICAgICByZXR1cm4gdHlwZXMuZHluYW1pY1R5cGU7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc0dldHRlciB8fCBlbGVtZW50LmlzRmllbGQpIHsKICAgICAgYXNzZXJ0KHNlbGVjdG9yLmlzQ2FsbCB8fCBzZWxlY3Rvci5pc1NldHRlcik7CiAgICAgIHJldHVybiB0eXBlcy5keW5hbWljVHlwZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiByZXR1cm5UeXBlT2ZNZW1iZXIoZWxlbWVudCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNhbkZpZWxkQmVVc2VkRm9yR2xvYmFsT3B0aW1pemF0aW9ucyhGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoY2xvc2VkV29ybGQuYmFja2VuZFVzYWdlLmlzRmllbGRVc2VkQnlCYWNrZW5kKGVsZW1lbnQpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICgoZWxlbWVudC5pc1RvcExldmVsIHx8IGVsZW1lbnQuaXNTdGF0aWMpICYmICFlbGVtZW50LmlzQXNzaWduYWJsZSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjYW5GdW5jdGlvblBhcmFtZXRlcnNCZVVzZWRGb3JHbG9iYWxPcHRpbWl6YXRpb25zKAogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgcmV0dXJuICFjbG9zZWRXb3JsZC5iYWNrZW5kVXNhZ2UuaXNGdW5jdGlvblVzZWRCeUJhY2tlbmQoZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhc3N1bWVEeW5hbWljKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBjbG9zZWRXb3JsZC5hbm5vdGF0aW9uc0RhdGEuaGFzQXNzdW1lRHluYW1pYyhtZW1iZXIpOwogIH0KfQoKY2xhc3MgS2VybmVsVHlwZVN5c3RlbVN0cmF0ZWd5IGltcGxlbWVudHMgVHlwZVN5c3RlbVN0cmF0ZWd5IHsKICBmaW5hbCBKc0Nsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKCiAgS2VybmVsVHlwZVN5c3RlbVN0cmF0ZWd5KHRoaXMuX2Nsb3NlZFdvcmxkKTsKCiAgSkVsZW1lbnRFbnZpcm9ubWVudCBnZXQgX2VsZW1lbnRFbnZpcm9ubWVudCA9PgogICAgICBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50OwoKICBAb3ZlcnJpZGUKICBib29sIGNoZWNrQ2xhc3NFbnRpdHkoQ2xhc3NFbnRpdHkgY2xzKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGNoZWNrTWFwTm9kZShpci5Ob2RlIG5vZGUpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgY2hlY2tTZXROb2RlKGlyLk5vZGUgbm9kZSkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjaGVja0xpc3ROb2RlKGlyLk5vZGUgbm9kZSkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjaGVja0xvb3BQaGlOb2RlKGlyLk5vZGUgbm9kZSkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjaGVja1BoaU5vZGUoaXIuTm9kZSBub2RlKSA9PgogICAgICBub2RlID09IG51bGwgfHwgbm9kZSBpcyBpci5UcnlDYXRjaCB8fCBub2RlIGlzIGlyLlRyeUZpbmFsbHk7CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFBhcmFtZXRlcihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgdm9pZCBmKExvY2FsIHBhcmFtZXRlcikpIHsKICAgIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQXNMb2NhbCgKICAgICAgICBfY2xvc2VkV29ybGQuZ2xvYmFsTG9jYWxzTWFwLCBfY2xvc2VkV29ybGQuZWxlbWVudE1hcCwgZnVuY3Rpb24sCiAgICAgICAgKExvY2FsIHBhcmFtZXRlciwge2Jvb2wgaXNFbGlkZWR9KSB7CiAgICAgIGYocGFyYW1ldGVyKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uIGNyZWF0ZVBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbigKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBjb3ZhcmlhbnQgSkxvY2FsIHBhcmFtZXRlciwKICAgICAgVHlwZVN5c3RlbSB0eXBlcykgewogICAgTWVtYmVyRW50aXR5IGNvbnRleHQgPSBwYXJhbWV0ZXIubWVtYmVyQ29udGV4dDsKICAgIEtlcm5lbFRvTG9jYWxzTWFwIGxvY2Fsc01hcCA9CiAgICAgICAgX2Nsb3NlZFdvcmxkLmdsb2JhbExvY2Fsc01hcC5nZXRMb2NhbHNNYXAoY29udGV4dCk7CiAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlID0KICAgICAgICBsb2NhbHNNYXAuZ2V0RnVuY3Rpb25Ob2RlRm9yUGFyYW1ldGVyKHBhcmFtZXRlcik7CiAgICBEYXJ0VHlwZSB0eXBlID0gbG9jYWxzTWFwLmdldExvY2FsVHlwZShfY2xvc2VkV29ybGQuZWxlbWVudE1hcCwgcGFyYW1ldGVyKTsKICAgIE1lbWJlckVudGl0eSBtZW1iZXI7CiAgICBib29sIGlzQ2xvc3VyZSA9IGZhbHNlOwogICAgaWYgKGZ1bmN0aW9uTm9kZS5wYXJlbnQgaXMgaXIuTWVtYmVyKSB7CiAgICAgIG1lbWJlciA9IF9jbG9zZWRXb3JsZC5lbGVtZW50TWFwLmdldE1lbWJlcihmdW5jdGlvbk5vZGUucGFyZW50KTsKICAgIH0gZWxzZSBpZiAoZnVuY3Rpb25Ob2RlLnBhcmVudCBpcyBpci5Mb2NhbEZ1bmN0aW9uKSB7CiAgICAgIENsb3N1cmVSZXByZXNlbnRhdGlvbkluZm8gaW5mbyA9CiAgICAgICAgICBfY2xvc2VkV29ybGQuY2xvc3VyZURhdGFMb29rdXAuZ2V0Q2xvc3VyZUluZm8oZnVuY3Rpb25Ob2RlLnBhcmVudCk7CiAgICAgIG1lbWJlciA9IGluZm8uY2FsbE1ldGhvZDsKICAgICAgaXNDbG9zdXJlID0gdHJ1ZTsKICAgIH0KICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBtZW1iZXJUeXBlSW5mb3JtYXRpb24gPQogICAgICAgIHR5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKG1lbWJlcik7CiAgICBpZiAoaXNDbG9zdXJlKSB7CiAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uLmxvY2FsRnVuY3Rpb24oCiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLCBtZW1iZXJUeXBlSW5mb3JtYXRpb24sIHBhcmFtZXRlciwgdHlwZSwgbWVtYmVyKTsKICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24uaW5zdGFuY2VNZW1iZXIoCiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICAgICAgbWVtYmVyVHlwZUluZm9ybWF0aW9uLAogICAgICAgICAgcGFyYW1ldGVyLAogICAgICAgICAgdHlwZSwKICAgICAgICAgIG1lbWJlciwKICAgICAgICAgIG5ldyBQYXJhbWV0ZXJBc3NpZ25tZW50cygpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uLnN0YXRpYygKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4sIG1lbWJlclR5cGVJbmZvcm1hdGlvbiwgcGFyYW1ldGVyLCB0eXBlLCBtZW1iZXIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNyZWF0ZU1lbWJlclR5cGVJbmZvcm1hdGlvbigKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyLmlzRmllbGQpIHsKICAgICAgRmllbGRFbnRpdHkgZmllbGQgPSBtZW1iZXI7CiAgICAgIERhcnRUeXBlIHR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldEZpZWxkVHlwZShmaWVsZCk7CiAgICAgIHJldHVybiBuZXcgRmllbGRUeXBlSW5mb3JtYXRpb24oYWJzdHJhY3RWYWx1ZURvbWFpbiwgZmllbGQsIHR5cGUpOwogICAgfSBlbHNlIGlmIChtZW1iZXIuaXNHZXR0ZXIpIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgZ2V0dGVyID0gbWVtYmVyOwogICAgICBEYXJ0VHlwZSB0eXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUoZ2V0dGVyKTsKICAgICAgcmV0dXJuIG5ldyBHZXR0ZXJUeXBlSW5mb3JtYXRpb24oYWJzdHJhY3RWYWx1ZURvbWFpbiwgZ2V0dGVyLCB0eXBlKTsKICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzU2V0dGVyKSB7CiAgICAgIEZ1bmN0aW9uRW50aXR5IHNldHRlciA9IG1lbWJlcjsKICAgICAgcmV0dXJuIG5ldyBTZXR0ZXJUeXBlSW5mb3JtYXRpb24oYWJzdHJhY3RWYWx1ZURvbWFpbiwgc2V0dGVyKTsKICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzRnVuY3Rpb24pIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0gbWVtYmVyOwogICAgICBEYXJ0VHlwZSB0eXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUobWV0aG9kKTsKICAgICAgcmV0dXJuIG5ldyBNZXRob2RUeXBlSW5mb3JtYXRpb24oYWJzdHJhY3RWYWx1ZURvbWFpbiwgbWV0aG9kLCB0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yID0gbWVtYmVyOwogICAgICBpZiAoY29uc3RydWN0b3IuaXNGYWN0b3J5Q29uc3RydWN0b3IpIHsKICAgICAgICBEYXJ0VHlwZSB0eXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUoY29uc3RydWN0b3IpOwogICAgICAgIHJldHVybiBuZXcgRmFjdG9yeUNvbnN0cnVjdG9yVHlwZUluZm9ybWF0aW9uKAogICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLCBjb25zdHJ1Y3RvciwgdHlwZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmF0aXZlQ29uc3RydWN0b3JUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4sIGNvbnN0cnVjdG9yKTsKICAgICAgfQogICAgfQogIH0KfQoKY2xhc3MgS2VybmVsR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhCiAgICBpbXBsZW1lbnRzIEdsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGFdCiAgLy8vIG9iamVjdHMgaW4gYSBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnZ2xvYmFsLXR5cGUtaW5mZXJlbmNlLWVsZW1lbnQtZGF0YSc7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbmFtZSB0aGlzIHRvZ2V0aGVyIHdpdGggW3R5cGVPZlNlbmRdLgogIE1hcDxpci5UcmVlTm9kZSwgQWJzdHJhY3RWYWx1ZT4gX3NlbmRNYXA7CgogIE1hcDxpci5Gb3JJblN0YXRlbWVudCwgQWJzdHJhY3RWYWx1ZT4gX2l0ZXJhdG9yTWFwOwogIE1hcDxpci5Gb3JJblN0YXRlbWVudCwgQWJzdHJhY3RWYWx1ZT4gX2N1cnJlbnRNYXA7CiAgTWFwPGlyLkZvckluU3RhdGVtZW50LCBBYnN0cmFjdFZhbHVlPiBfbW92ZU5leHRNYXA7CgogIEtlcm5lbEdsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YSgpOwoKICBLZXJuZWxHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGEuaW50ZXJuYWwoCiAgICAgIHRoaXMuX3NlbmRNYXAsIHRoaXMuX2l0ZXJhdG9yTWFwLCB0aGlzLl9jdXJyZW50TWFwLCB0aGlzLl9tb3ZlTmV4dE1hcCk7CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IEtlcm5lbEdsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YS5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLAogICAgICBpci5NZW1iZXIgY29udGV4dCwKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluKSB7CiAgICByZXR1cm4gc291cmNlLmluTWVtYmVyQ29udGV4dChjb250ZXh0LCAoKSB7CiAgICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgICBNYXA8aXIuVHJlZU5vZGUsIEFic3RyYWN0VmFsdWU+IHNlbmRNYXAgPSBzb3VyY2UucmVhZFRyZWVOb2RlTWFwSW5Db250ZXh0KAogICAgICAgICAgKCkgPT4gYWJzdHJhY3RWYWx1ZURvbWFpbi5yZWFkQWJzdHJhY3RWYWx1ZUZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICAgIE1hcDxpci5Gb3JJblN0YXRlbWVudCwgQWJzdHJhY3RWYWx1ZT4gaXRlcmF0b3JNYXAgPQogICAgICAgICAgc291cmNlLnJlYWRUcmVlTm9kZU1hcEluQ29udGV4dCgKICAgICAgICAgICAgICAoKSA9PiBhYnN0cmFjdFZhbHVlRG9tYWluLnJlYWRBYnN0cmFjdFZhbHVlRnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICAgIE1hcDxpci5Gb3JJblN0YXRlbWVudCwgQWJzdHJhY3RWYWx1ZT4gY3VycmVudE1hcCA9CiAgICAgICAgICBzb3VyY2UucmVhZFRyZWVOb2RlTWFwSW5Db250ZXh0KAogICAgICAgICAgICAgICgpID0+IGFic3RyYWN0VmFsdWVEb21haW4ucmVhZEFic3RyYWN0VmFsdWVGcm9tRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgICAgTWFwPGlyLkZvckluU3RhdGVtZW50LCBBYnN0cmFjdFZhbHVlPiBtb3ZlTmV4dE1hcCA9CiAgICAgICAgICBzb3VyY2UucmVhZFRyZWVOb2RlTWFwSW5Db250ZXh0KAogICAgICAgICAgICAgICgpID0+IGFic3RyYWN0VmFsdWVEb21haW4ucmVhZEFic3RyYWN0VmFsdWVGcm9tRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgICAgc291cmNlLmVuZCh0YWcpOwogICAgICByZXR1cm4gbmV3IEtlcm5lbEdsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YS5pbnRlcm5hbCgKICAgICAgICAgIHNlbmRNYXAsIGl0ZXJhdG9yTWFwLCBjdXJyZW50TWFwLCBtb3ZlTmV4dE1hcCk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmssIGlyLk1lbWJlciBjb250ZXh0LAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4pIHsKICAgIHNpbmsuaW5NZW1iZXJDb250ZXh0KGNvbnRleHQsICgpIHsKICAgICAgc2luay5iZWdpbih0YWcpOwogICAgICBzaW5rLndyaXRlVHJlZU5vZGVNYXBJbkNvbnRleHQoCiAgICAgICAgICBfc2VuZE1hcCwKICAgICAgICAgIChBYnN0cmFjdFZhbHVlIHZhbHVlKSA9PgogICAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4ud3JpdGVBYnN0cmFjdFZhbHVlVG9EYXRhU2luayhzaW5rLCB2YWx1ZSksCiAgICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgICBzaW5rLndyaXRlVHJlZU5vZGVNYXBJbkNvbnRleHQoCiAgICAgICAgICBfaXRlcmF0b3JNYXAsCiAgICAgICAgICAoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4KICAgICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLndyaXRlQWJzdHJhY3RWYWx1ZVRvRGF0YVNpbmsoc2luaywgdmFsdWUpLAogICAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgICAgc2luay53cml0ZVRyZWVOb2RlTWFwSW5Db250ZXh0KAogICAgICAgICAgX2N1cnJlbnRNYXAsCiAgICAgICAgICAoQWJzdHJhY3RWYWx1ZSB2YWx1ZSkgPT4KICAgICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLndyaXRlQWJzdHJhY3RWYWx1ZVRvRGF0YVNpbmsoc2luaywgdmFsdWUpLAogICAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgICAgc2luay53cml0ZVRyZWVOb2RlTWFwSW5Db250ZXh0KAogICAgICAgICAgX21vdmVOZXh0TWFwLAogICAgICAgICAgKEFic3RyYWN0VmFsdWUgdmFsdWUpID0+CiAgICAgICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi53cml0ZUFic3RyYWN0VmFsdWVUb0RhdGFTaW5rKHNpbmssIHZhbHVlKSwKICAgICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICAgIHNpbmsuZW5kKHRhZyk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIEdsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YSBjb21wcmVzcygpIHsKICAgIGlmIChfc2VuZE1hcCAhPSBudWxsKSB7CiAgICAgIF9zZW5kTWFwLnJlbW92ZVdoZXJlKF9tYXBzVG9OdWxsKTsKICAgICAgaWYgKF9zZW5kTWFwLmlzRW1wdHkpIHsKICAgICAgICBfc2VuZE1hcCA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIGlmIChfaXRlcmF0b3JNYXAgIT0gbnVsbCkgewogICAgICBfaXRlcmF0b3JNYXAucmVtb3ZlV2hlcmUoX21hcHNUb051bGwpOwogICAgICBpZiAoX2l0ZXJhdG9yTWFwLmlzRW1wdHkpIHsKICAgICAgICBfaXRlcmF0b3JNYXAgPSBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAoX2N1cnJlbnRNYXAgIT0gbnVsbCkgewogICAgICBfY3VycmVudE1hcC5yZW1vdmVXaGVyZShfbWFwc1RvTnVsbCk7CiAgICAgIGlmIChfY3VycmVudE1hcC5pc0VtcHR5KSB7CiAgICAgICAgX2N1cnJlbnRNYXAgPSBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAoX21vdmVOZXh0TWFwICE9IG51bGwpIHsKICAgICAgX21vdmVOZXh0TWFwLnJlbW92ZVdoZXJlKF9tYXBzVG9OdWxsKTsKICAgICAgaWYgKF9tb3ZlTmV4dE1hcC5pc0VtcHR5KSB7CiAgICAgICAgX21vdmVOZXh0TWFwID0gbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKF9zZW5kTWFwID09IG51bGwgJiYKICAgICAgICBfaXRlcmF0b3JNYXAgPT0gbnVsbCAmJgogICAgICAgIF9jdXJyZW50TWFwID09IG51bGwgJiYKICAgICAgICBfbW92ZU5leHRNYXAgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZTZW5kKGlyLlRyZWVOb2RlIG5vZGUpIHsKICAgIGlmIChfc2VuZE1hcCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfc2VuZE1hcFtub2RlXTsKICB9CgogIHZvaWQgc2V0Q3VycmVudFR5cGVNYXNrKGlyLkZvckluU3RhdGVtZW50IG5vZGUsIEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgX2N1cnJlbnRNYXAgPz89IDxpci5Gb3JJblN0YXRlbWVudCwgQWJzdHJhY3RWYWx1ZT57fTsKICAgIF9jdXJyZW50TWFwW25vZGVdID0gbWFzazsKICB9CgogIHZvaWQgc2V0TW92ZU5leHRUeXBlTWFzayhpci5Gb3JJblN0YXRlbWVudCBub2RlLCBBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIF9tb3ZlTmV4dE1hcCA/Pz0gPGlyLkZvckluU3RhdGVtZW50LCBBYnN0cmFjdFZhbHVlPnt9OwogICAgX21vdmVOZXh0TWFwW25vZGVdID0gbWFzazsKICB9CgogIHZvaWQgc2V0SXRlcmF0b3JUeXBlTWFzayhpci5Gb3JJblN0YXRlbWVudCBub2RlLCBBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIF9pdGVyYXRvck1hcCA/Pz0gPGlyLkZvckluU3RhdGVtZW50LCBBYnN0cmFjdFZhbHVlPnt9OwogICAgX2l0ZXJhdG9yTWFwW25vZGVdID0gbWFzazsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdHlwZU9mSXRlcmF0b3JDdXJyZW50KGNvdmFyaWFudCBpci5Gb3JJblN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoX2N1cnJlbnRNYXAgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX2N1cnJlbnRNYXBbbm9kZV07CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHR5cGVPZkl0ZXJhdG9yTW92ZU5leHQoY292YXJpYW50IGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIGlmIChfbW92ZU5leHRNYXAgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX21vdmVOZXh0TWFwW25vZGVdOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB0eXBlT2ZJdGVyYXRvcihjb3ZhcmlhbnQgaXIuRm9y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PCM6UBkcLEc6J04gGAYyLxU5UCo6HyEVEBInDTJQBgQBDDVGGiI/SSImQ0siJkUkJkNLDS4uSjY1DzkvCAYEAgErMEsqQgFCLAE2NTYBKgExTgFMQxkZMTAZUU0eOitRIjkrUSI6K1EiF0A6CAQBDDkxJxcmFCNNHCYYI00cJhcjTRwmGCNNHBUIBAEMLhwpHhkIBiAtIh0IBh8sIRwIBiAtIh0IBhwgHyATBhEEAQwvJxsEAUg6HgQBSTsfBAFJOx8EAQxKKh4EAQxLKx8EAQxDKx8EATsxGwQBDDEnGwQCAUoBMnBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL2luZmVycmVyX2VuZ2luZS5kYXJ0OnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lvL3Bvc2l0aW9uX2luZm9ybWF0aW9uLmRhcnTAALG6Ly8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBTb3VyY2UgaW5mb3JtYXRpb24gc3lzdGVtIG1hcHBpbmcgdGhhdCBhdHRlbXB0cyBhIHNlbWFudGljIG1hcHBpbmcgYmV0d2VlbgovLy8gb2Zmc2V0cyBvZiBKYXZhU2NyaXB0IGNvZGUgcG9pbnRzIHRvIG9mZnNldHMgb2YgRGFydCBjb2RlIHBvaW50cy4KCmxpYnJhcnkgZGFydDJqcy5zb3VyY2VfaW5mb3JtYXRpb24ucG9zaXRpb247CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqczsKaW1wb3J0ICcuLi9qcy9qc19kZWJ1Zy5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qc19zb3VyY2VfbWFwcGluZy5kYXJ0JzsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnOwppbXBvcnQgJ2NvZGVfb3V0cHV0LmRhcnQnIHNob3cgQnVmZmVyZWRDb2RlT3V0cHV0OwppbXBvcnQgJ3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKCi8vLyBbU291cmNlSW5mb3JtYXRpb25dIHRoYXQgY29uc2lzdHMgb2YgYW4gb2Zmc2V0IHBvc2l0aW9uIGludG8gdGhlIHNvdXJjZQovLy8gY29kZS4KY2xhc3MgUG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvbiBleHRlbmRzIFNvdXJjZUluZm9ybWF0aW9uIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdzb3VyY2UtaW5mb3JtYXRpb24nOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTb3VyY2VMb2NhdGlvbiBzdGFydFBvc2l0aW9uOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTb3VyY2VMb2NhdGlvbiBpbm5lclBvc2l0aW9uOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBMaXN0PEZyYW1lQ29udGV4dD4gaW5saW5pbmdDb250ZXh0OwoKICBQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uKAogICAgICB0aGlzLnN0YXJ0UG9zaXRpb24sIHRoaXMuaW5uZXJQb3NpdGlvbiwgdGhpcy5pbmxpbmluZ0NvbnRleHQpOwoKICBmYWN0b3J5IFBvc2l0aW9uU291cmNlSW5mb3JtYXRpb24ucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIFNvdXJjZUxvY2F0aW9uIHN0YXJ0UG9zaXRpb24gPSBzb3VyY2UucmVhZENhY2hlZDxTb3VyY2VMb2NhdGlvbj4oCiAgICAgICAgKCkgPT4gU291cmNlTG9jYXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSkpOwogICAgU291cmNlTG9jYXRpb24gaW5uZXJQb3NpdGlvbiA9IHNvdXJjZS5yZWFkQ2FjaGVkPFNvdXJjZUxvY2F0aW9uPigKICAgICAgICAoKSA9PiBTb3VyY2VMb2NhdGlvbi5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKSk7CiAgICBMaXN0PEZyYW1lQ29udGV4dD4gaW5saW5pbmdDb250ZXh0ID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IEZyYW1lQ29udGV4dC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IFBvc2l0aW9uU291cmNlSW5mb3JtYXRpb24oCiAgICAgICAgc3RhcnRQb3NpdGlvbiwgaW5uZXJQb3NpdGlvbiwgaW5saW5pbmdDb250ZXh0KTsKICB9CgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rSW50ZXJuYWwoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUNhY2hlZCgKICAgICAgICBzdGFydFBvc2l0aW9uLAogICAgICAgIChTb3VyY2VMb2NhdGlvbiBzb3VyY2VMb2NhdGlvbikgPT4KICAgICAgICAgICAgU291cmNlTG9jYXRpb24ud3JpdGVUb0RhdGFTaW5rKHNpbmssIHNvdXJjZUxvY2F0aW9uKSk7CiAgICBzaW5rLndyaXRlQ2FjaGVkKAogICAgICAgIGlubmVyUG9zaXRpb24sCiAgICAgICAgKFNvdXJjZUxvY2F0aW9uIHNvdXJjZUxvY2F0aW9uKSA9PgogICAgICAgICAgICBTb3VyY2VMb2NhdGlvbi53cml0ZVRvRGF0YVNpbmsoc2luaywgc291cmNlTG9jYXRpb24pKTsKICAgIHNpbmsud3JpdGVMaXN0KGlubGluaW5nQ29udGV4dCwKICAgICAgICAoRnJhbWVDb250ZXh0IGNvbnRleHQpID0+IGNvbnRleHQud3JpdGVUb0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxTb3VyY2VMb2NhdGlvbj4gZ2V0IHNvdXJjZUxvY2F0aW9ucyB7CiAgICBMaXN0PFNvdXJjZUxvY2F0aW9uPiBsaXN0ID0gPFNvdXJjZUxvY2F0aW9uPltdOwogICAgaWYgKHN0YXJ0UG9zaXRpb24gIT0gbnVsbCkgewogICAgICBsaXN0LmFkZChzdGFydFBvc2l0aW9uKTsKICAgIH0KICAgIGlmIChpbm5lclBvc2l0aW9uICE9IG51bGwpIHsKICAgICAgbGlzdC5hZGQoaW5uZXJQb3NpdGlvbik7CiAgICB9CiAgICByZXR1cm4gbGlzdDsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZVNwYW4gZ2V0IHNvdXJjZVNwYW4gewogICAgU291cmNlTG9jYXRpb24gbG9jYXRpb24gPQogICAgICAgIHN0YXJ0UG9zaXRpb24gIT0gbnVsbCA/IHN0YXJ0UG9zaXRpb24gOiBpbm5lclBvc2l0aW9uOwogICAgVXJpIHVyaSA9IGxvY2F0aW9uLnNvdXJjZVVyaTsKICAgIGludCBvZmZzZXQgPSBsb2NhdGlvbi5vZmZzZXQ7CiAgICByZXR1cm4gbmV3IFNvdXJjZVNwYW4odXJpLCBvZmZzZXQsIG9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBIYXNoaW5nLmxpc3RIYXNoKAogICAgICAgIGlubGluaW5nQ29udGV4dCwgSGFzaGluZy5vYmplY3RzSGFzaChzdGFydFBvc2l0aW9uLCBpbm5lclBvc2l0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gb3RoZXIgaXMgUG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvbiAmJgogICAgICAgIHN0YXJ0UG9zaXRpb24gPT0gb3RoZXIuc3RhcnRQb3NpdGlvbiAmJgogICAgICAgIGlubmVyUG9zaXRpb24gPT0gb3RoZXIuaW5uZXJQb3NpdGlvbiAmJgogICAgICAgIGVxdWFsRWxlbWVudHMoaW5saW5pbmdDb250ZXh0LCBvdGhlci5pbmxpbmluZ0NvbnRleHQpOwogIH0KCiAgLy8vIENyZWF0ZSBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNvdXJjZSBpbmZvcm1hdGlvbiB1c2luZyBbdXJpVGV4dF0KICAvLy8gYXMgdGhlIFVyaSByZXByZXNlbnRhdGlvbi4KICBTdHJpbmcgX2NvbXB1dGVUZXh0KFN0cmluZyB1cmlUZXh0KSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnJHVyaVRleHQ6Jyk7CiAgICAvLyBVc2UgMS1iYXNlZCBsaW5lL2NvbHVtbiBpbmZvIHRvIG1hdGNoIHVzdWFsIGRhcnQgdG9vbCBvdXRwdXQuCiAgICBpZiAoc3RhcnRQb3NpdGlvbiAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCdbJHtzdGFydFBvc2l0aW9uLmxpbmV9LCcKICAgICAgICAgICcke3N0YXJ0UG9zaXRpb24uY29sdW1ufV0nKTsKICAgIH0KICAgIGlmIChpbm5lclBvc2l0aW9uICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJy1bJHtpbm5lclBvc2l0aW9uLmxpbmV9LCcKICAgICAgICAgICcke2lubmVyUG9zaXRpb24uY29sdW1ufV0nKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBzaG9ydFRleHQgewogICAgaWYgKHN0YXJ0UG9zaXRpb24gIT0gbnVsbCkgewogICAgICByZXR1cm4gX2NvbXB1dGVUZXh0KHN0YXJ0UG9zaXRpb24uc291cmNlVXJpLnBhdGhTZWdtZW50cy5sYXN0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfY29tcHV0ZVRleHQoaW5uZXJQb3NpdGlvbi5zb3VyY2VVcmkucGF0aFNlZ21lbnRzLmxhc3QpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgaWYgKHN0YXJ0UG9zaXRpb24gIT0gbnVsbCkgewogICAgICByZXR1cm4gX2NvbXB1dGVUZXh0KCcke3N0YXJ0UG9zaXRpb24uc291cmNlVXJpfScpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9jb21wdXRlVGV4dCgnJHtpbm5lclBvc2l0aW9uLnNvdXJjZVVyaX0nKTsKICAgIH0KICB9Cn0KCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0UG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5CiAgICBpbXBsZW1lbnRzIEphdmFTY3JpcHRTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5IHsKICBjb25zdCBBYnN0cmFjdFBvc2l0aW9uU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSgpOwoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvblByb2Nlc3NvciBjcmVhdGVQcm9jZXNzb3IoCiAgICAgIFNvdXJjZU1hcHBlclByb3ZpZGVyIHByb3ZpZGVyLCBTb3VyY2VJbmZvcm1hdGlvblJlYWRlciByZWFkZXIpIHsKICAgIHJldHVybiBuZXcgUG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvblByb2Nlc3Nvcihwcm92aWRlciwgcmVhZGVyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgb25Db21wbGV0ZSgpIHt9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkU291cmNlTWFwcGVkTWFya2VyKCkgewogICAgcmV0dXJuIGNvbnN0IFNvdXJjZU1hcHBlZE1hcmtlcigpOwogIH0KfQoKLy8vIE1hcmtlciB1c2VkIHRvIHRhZyB0aGUgcm9vdCBub2RlcyBvZiBzb3VyY2UtbWFwcGVkIGNvZGUuCi8vLwovLy8gVGhpcyBpcyBuZWVkZWQgdG8gYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBKYXZhU2NyaXB0IG5vZGVzIHRoYXQgc2hvdWxkbid0Ci8vLyBoYXZlIHNvdXJjZSBsb2NhdGlvbnMgKGxpa2UgdGhlIHByZW1hYmxlKSBmcm9tIHRoZSBub2RlcyB0aGF0IHNob3VsZAovLy8gKGxpa2UgZnVuY3Rpb25zIGNvbXBpbGVkIGZyb20gRGFydCBjb2RlKS4KY2xhc3MgU291cmNlTWFwcGVkTWFya2VyIGV4dGVuZHMgU291cmNlSW5mb3JtYXRpb24gewogIGNvbnN0IFNvdXJjZU1hcHBlZE1hcmtlcigpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHNob3J0VGV4dCA9PiAnJzsKCiAgQG92ZXJyaWRlCiAgTGlzdDxTb3VyY2VMb2NhdGlvbj4gZ2V0IHNvdXJjZUxvY2F0aW9ucyA9PiBjb25zdCA8U291cmNlTG9jYXRpb24+W107CgogIEBvdmVycmlkZQogIFNvdXJjZVNwYW4gZ2V0IHNvdXJjZVNwYW4gPT4gbmV3IFNvdXJjZVNwYW4obnVsbCwgbnVsbCwgbnVsbCk7Cn0KCi8vLyBUaGUgc3RhcnQsIGVuZCBhbmQgY2xvc2luZyBvZmZzZXRzIGZvciBhIFtqcy5Ob2RlXS4KY2xhc3MgQ29kZVBvc2l0aW9uIHsKICBmaW5hbCBpbnQgc3RhcnRQb3NpdGlvbjsKICBmaW5hbCBpbnQgZW5kUG9zaXRpb247CiAgZmluYWwgaW50IGNsb3NpbmdQb3NpdGlvbjsKCiAgQ29kZVBvc2l0aW9uKHRoaXMuc3RhcnRQb3NpdGlvbiwgdGhpcy5lbmRQb3NpdGlvbiwgdGhpcy5jbG9zaW5nUG9zaXRpb24pOwoKICAvLyBpZ25vcmU6IE1JU1NJTkdfUkVUVVJOCiAgaW50IGdldFBvc2l0aW9uKENvZGVQb3NpdGlvbktpbmQga2luZCkgewogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgQ29kZVBvc2l0aW9uS2luZC5TVEFSVDoKICAgICAgICByZXR1cm4gc3RhcnRQb3NpdGlvbjsKICAgICAgY2FzZSBDb2RlUG9zaXRpb25LaW5kLkVORDoKICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247CiAgICAgIGNhc2UgQ29kZVBvc2l0aW9uS2luZC5DTE9TSU5HOgogICAgICAgIHJldHVybiBjbG9zaW5nUG9zaXRpb247CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ0NvZGVQb3NpdGlvbihzdGFydD0kc3RhcnRQb3NpdGlvbiwnCiAgICAgICAgJ2VuZD0kZW5kUG9zaXRpb24sY2xvc2luZz0kY2xvc2luZ1Bvc2l0aW9uKSc7CiAgfQp9CgovLy8gQSBtYXAgZnJvbSBhIFtqcy5Ob2RlXSB0byBpdHMgW0NvZGVQb3NpdGlvbl0uCmFic3RyYWN0IGNsYXNzIENvZGVQb3NpdGlvbk1hcCB7CiAgQ29kZVBvc2l0aW9uIG9wZXJhdG9yIFtdKGpzLk5vZGUgbm9kZSk7Cn0KCi8vLyBSZWdpc3RyeSBmb3IgbWFwcGluZyBbanMuTm9kZV1zIHRvIHRoZWlyIFtDb2RlUG9zaXRpb25dLgpjbGFzcyBDb2RlUG9zaXRpb25SZWNvcmRlciBpbXBsZW1lbnRzIENvZGVQb3NpdGlvbk1hcCB7CiAgTWFwPGpzLk5vZGUsIENvZGVQb3NpdGlvbj4gX2NvZGVQb3NpdGlvbk1hcCA9CiAgICAgIG5ldyBNYXA8anMuTm9kZSwgQ29kZVBvc2l0aW9uPi5pZGVudGl0eSgpOwoKICB2b2lkIHJlZ2lzdGVyUG9zaXRpb25zKAogICAgICBqcy5Ob2RlIG5vZGUsIGludCBzdGFydFBvc2l0aW9uLCBpbnQgZW5kUG9zaXRpb24sIGludCBjbG9zaW5nUG9zaXRpb24pIHsKICAgIHJlZ2lzdGVyQ29kZVBvc2l0aW9uKAogICAgICAgIG5vZGUsIG5ldyBDb2RlUG9zaXRpb24oc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24sIGNsb3NpbmdQb3NpdGlvbikpOwogIH0KCiAgdm9pZCByZWdpc3RlckNvZGVQb3NpdGlvbihqcy5Ob2RlIG5vZGUsIENvZGVQb3NpdGlvbiBjb2RlUG9zaXRpb24pIHsKICAgIF9jb2RlUG9zaXRpb25NYXBbbm9kZV0gPSBjb2RlUG9zaXRpb247CiAgfQoKICBAb3ZlcnJpZGUKICBDb2RlUG9zaXRpb24gb3BlcmF0b3IgW10oanMuTm9kZSBub2RlKSA9PiBfY29kZVBvc2l0aW9uTWFwW25vZGVdOwp9CgovLy8gRW51bSB2YWx1ZXMgZm9yIHRoZSBwYXJ0IG9mIGEgRGFydCBub2RlIHVzZWQgZm9yIHRoZSBzb3VyY2UgbG9jYXRpb24gb2Zmc2V0LgplbnVtIFNvdXJjZVBvc2l0aW9uS2luZCB7CiAgLy8vIFRoZSBzb3VyY2UgbWFwcGluZyBzaG91bGQgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBEYXJ0IG5vZGUuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSB0aGUgZmlyc3QgJygnIGZvciB0aGUgYCgqKSgpYCBjYWxsIGFuZCAnZicgb2YgYm90aCB0aGUKICAvLy8gYGZvbygpYCBhbmQgdGhlIGAqLmJhcigpYCBjYWxsOgogIC8vLwogIC8vLyAgICAgKGZvbygpLmJhcigpKSgpCiAgLy8vICAgICBeICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhcnQgb2YgdGhlIGAoKikoKWAgbm9kZQogIC8vLyAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBgZm9vKClgIG5vZGUKICAvLy8gICAgICBeICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBvZiB0aGUgYCouYmFyKClgIG5vZGUKICAvLy8KICBTVEFSVCwKCiAgLy8vIFRoZSBzb3VyY2UgbWFwcGluZyBzaG91bGQgcG9pbnQgYW4gaW5uZXIgcG9zaXRpb24gb2YgdGhlIERhcnQgbm9kZS4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIHRoZSBzZWNvbmQgJygnIG9mIHRoZSBgKCopKClgIGNhbGwsIHRoZSAnZicgb2YgdGhlIGBmb28oKWAKICAvLy8gY2FsbCBhbmQgdGhlICdiJyBvZiB0aGUgYCouYmFyKClgIGNhbGw6CiAgLy8vCiAgLy8vICAgICAoZm9vKCkuYmFyKCkpKCkKICAvLy8gICAgICAgICAgICAgICAgICBeICAgICAgICAgIC8vIHRoZSBpbm5lciBwb3NpdGlvbiBvZiB0aGUgYCgqKSgpYCBub2RlCiAgLy8vICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5uZXIgcG9zaXRpb24gb2YgdGhlIGBmb28oKWAgbm9kZQogIC8vLyAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgLy8gdGhlIGlubmVyIHBvc2l0aW9uIG9mIHRoZSBgKi5iYXIoKWAgbm9kZQogIC8vLwogIC8vLyBGb3IgZnVuY3Rpb24gZXhwcmVzc2lvbnMgdGhlIGlubmVyIHBvc2l0aW9uIGlzIHRoZSBjbG9zaW5nIGJyYWNlIG9yIHRoZQogIC8vLyBhcnJvdzoKICAvLy8KICAvLy8gICAgIGZvbygpID0+ICgpIHt9CiAgLy8vICAgICAgICAgICBeICAgICAgICAgICAgICAgICAvLyB0aGUgaW5uZXIgcG9zaXRpb24gb2YgdGhlICdmb28nIGZ1bmN0aW9uCiAgLy8vICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAvLyB0aGUgaW5uZXIgcG9zaXRpb24gb2YgdGhlIGNsb3N1cmUKICAvLy8KICBJTk5FUiwKfQoKLy8gaWdub3JlOiBNSVNTSU5HX1JFVFVSTgpTb3VyY2VMb2NhdGlvbiBnZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgIFtTb3VyY2VQb3NpdGlvbktpbmQgc291cmNlUG9zaXRpb25LaW5kID0gU291cmNlUG9zaXRpb25LaW5kLlNUQVJUXSkgewogIGlmIChzb3VyY2VJbmZvcm1hdGlvbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKICBzd2l0Y2ggKHNvdXJjZVBvc2l0aW9uS2luZCkgewogICAgY2FzZSBTb3VyY2VQb3NpdGlvbktpbmQuU1RBUlQ6CiAgICAgIHJldHVybiBzb3VyY2VJbmZvcm1hdGlvbi5zdGFydFBvc2l0aW9uOwogICAgY2FzZSBTb3VyY2VQb3NpdGlvbktpbmQuSU5ORVI6CiAgICAgIHJldHVybiBzb3VyY2VJbmZvcm1hdGlvbi5pbm5lclBvc2l0aW9uID8/IHNvdXJjZUluZm9ybWF0aW9uLnN0YXJ0UG9zaXRpb247CiAgfQp9CgovLy8gRW51bSB2YWx1ZXMgZm9yIHRoZSBwYXJ0IG9mIHRoZSBKYXZhU2NyaXB0IG5vZGUgdXNlZCBmb3IgdGhlIEphdmFTY3JpcHQKLy8vIGNvZGUgb2Zmc2V0IG9mIGEgc291cmNlIG1hcHBpbmcuCmVudW0gQ29kZVBvc2l0aW9uS2luZCB7CiAgLy8vIFRoZSBzb3VyY2UgbWFwcGluZyBpcyBwdXQgb24gbGVmdC1tb3N0IG9mZnNldCBvZiB0aGUgbm9kZS4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIG9uIHRoZSAnZicgb2YgYSBmdW5jdGlvbiBvciAncicgb2YgYSByZXR1cm4gc3RhdGVtZW50OgogIC8vLwogIC8vLyAgICAgZm9vOiBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH0KICAvLy8gICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmdW5jdGlvbiBzdGFydCBwb3NpdGlvbgogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgLy8gdGhlIHJldHVybiBzdGFydCBwb3NpdGlvbgogIFNUQVJULAoKICAvLy8gVGhlIHNvdXJjZSBtYXBwaW5nIGlzIHB1dCBvbiB0aGUgY2xvc2luZyB0b2tlbi4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIG9uIHRoZSAnfScgb2YgYSBmdW5jdGlvbiBvciB0aGUgJzsnIG9mIGEgcmV0dXJuIHN0YXRlbWVudDoKICAvLy8KICAvLy8gICAgIGZvbzogZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9CiAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAvLyB0aGUgZnVuY3Rpb24gY2xvc2luZyBwb3NpdGlvbgogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgLy8gdGhlIHJldHVybiBjbG9zaW5nIHBvc2l0aW9uCiAgLy8vCiAgQ0xPU0lORywKCiAgLy8vIFRoZSBzb3VyY2UgbWFwcGluZyBpcyBwdXQgYXQgdGhlIGVuZCBvZiB0aGUgY29kZSBmb3IgdGhlIG5vZGUuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBhZnRlciAnfScgb2YgYSBmdW5jdGlvbiBvciBhZnRlciB0aGUgJzsnIG9mIGEgcmV0dXJuCiAgLy8vIHN0YXRlbWVudDoKICAvLy8KICAvLy8gICAgIGZvbzogZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9CiAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgLy8gdGhlIGZ1bmN0aW9uIGVuZCBwb3NpdGlvbgogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgIC8vIHRoZSByZXR1cm4gZW5kIHBvc2l0aW9uCiAgLy8vCiAgRU5ELAp9CgovLy8gUHJvY2Vzc29yIHRoYXQgYXNzb2NpYXRlcyBbU291cmNlTG9jYXRpb25dcyBmcm9tIFtTb3VyY2VJbmZvcm1hdGlvbl0gb24KLy8vIFtqcy5Ob2RlXXMgd2l0aCB0aGUgdGFyZ2V0IG9mZnNldHMgaW4gYSBbU291cmNlTWFwcGVyXS4KY2xhc3MgUG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvblByb2Nlc3NvciBleHRlbmRzIFNvdXJjZUluZm9ybWF0aW9uUHJvY2Vzc29yIHsKICAvLy8gVGhlIGlkIGZvciB0aGlzIHNvdXJjZSBpbmZvcm1hdGlvbiBlbmdpbmUuCiAgLy8vCiAgLy8vIFRoZSBpZCBpcyBhZGRlZCB0byB0aGUgc291cmNlIG1hcCBmaWxlIGluIGFuIGV4dHJhICJlbmdpbmUiIHByb3BlcnR5IGFuZAogIC8vLyBzZXJ2ZXMgYXMgYSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIGVuZ2luZS4KICAvLy8KICAvLy8gVGhlIHZlcnNpb24gaGlzdG9yeSBvZiB0aGlzIGVuZ2luZSBpczoKICAvLy8KICAvLy8gICB2MjogVGhlIGluaXRpYWwgdmVyc2lvbiB3aXRoIGFuIGlkLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgaWQgPSAndjInOwoKICBmaW5hbCBDb2RlUG9zaXRpb25SZWNvcmRlciBjb2RlUG9zaXRpb25SZWNvcmRlciA9IG5ldyBDb2RlUG9zaXRpb25SZWNvcmRlcigpOwogIGZpbmFsIFNvdXJjZUluZm9ybWF0aW9uUmVhZGVyIHJlYWRlcjsKICBDb2RlUG9zaXRpb25NYXAgY29kZVBvc2l0aW9uTWFwOwogIExpc3Q8VHJhY2VMaXN0ZW5lcj4gdHJhY2VMaXN0ZW5lcnM7CiAgSW5saW5pbmdUcmFjZUxpc3RlbmVyIGlubGluaW5nTGlzdGVuZXI7CgogIFBvc2l0aW9uU291cmNlSW5mb3JtYXRpb25Qcm9jZXNzb3IoU291cmNlTWFwcGVyUHJvdmlkZXIgcHJvdmlkZXIsIHRoaXMucmVhZGVyLAogICAgICBbQ292ZXJhZ2UgY292ZXJhZ2VdKSB7CiAgICBjb2RlUG9zaXRpb25NYXAgPSBjb3ZlcmFnZSAhPSBudWxsCiAgICAgICAgPyBuZXcgQ29kZVBvc2l0aW9uQ292ZXJhZ2UoY29kZVBvc2l0aW9uUmVjb3JkZXIsIGNvdmVyYWdlKQogICAgICAgIDogY29kZVBvc2l0aW9uUmVjb3JkZXI7CiAgICB2YXIgc291cmNlTWFwcGVyID0gcHJvdmlkZXIuY3JlYXRlU291cmNlTWFwcGVyKGlkKTsKICAgIHRyYWNlTGlzdGVuZXJzID0gWwogICAgICBuZXcgUG9zaXRpb25UcmFjZUxpc3RlbmVyKHNvdXJjZU1hcHBlciwgcmVhZGVyKSwKICAgICAgaW5saW5pbmdMaXN0ZW5lciA9IG5ldyBJbmxpbmluZ1RyYWNlTGlzdGVuZXIoc291cmNlTWFwcGVyLCByZWFkZXIpLAogICAgXTsKICAgIGlmIChjb3ZlcmFnZSAhPSBudWxsKSB7CiAgICAgIHRyYWNlTGlzdGVuZXJzLmFkZChuZXcgQ292ZXJhZ2VMaXN0ZW5lcihjb3ZlcmFnZSwgcmVhZGVyKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByb2Nlc3MoanMuTm9kZSBub2RlLCBCdWZmZXJlZENvZGVPdXRwdXQgY29kZSkgewogICAgbmV3IEphdmFTY3JpcHRUcmFjZXIoY29kZVBvc2l0aW9uTWFwLCByZWFkZXIsIHRyYWNlTGlzdGVuZXJzKS5hcHBseShub2RlKTsKICAgIGlubGluaW5nTGlzdGVuZXI/LmZpbmlzaCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBvblBvc2l0aW9ucygKICAgICAganMuTm9kZSBub2RlLCBpbnQgc3RhcnRQb3NpdGlvbiwgaW50IGVuZFBvc2l0aW9uLCBpbnQgY2xvc2luZ1Bvc2l0aW9uKSB7CiAgICBjb2RlUG9zaXRpb25SZWNvcmRlci5yZWdpc3RlclBvc2l0aW9ucygKICAgICAgICBub2RlLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwgY2xvc2luZ1Bvc2l0aW9uKTsKICB9Cn0KCi8vLyBWaXNpdG9yIHRoYXQgY29tcHV0ZXMgW1NvdXJjZUluZm9ybWF0aW9uXSBmb3IgYSBbanMuTm9kZV0gdXNpbmcgaW5mb3JtYXRpb24KLy8vIGF0dGFjaGVkIHRvIHRoZSBub2RlIGl0c2VsZiBvciBhbHRlcm5hdGl2ZWx5IGZyb20gY2hpbGQgbm9kZXMuCmNsYXNzIE5vZGVTb3VyY2VJbmZvcm1hdGlvbiBleHRlbmRzIGpzLkJhc2VWaXNpdG9yPFNvdXJjZUluZm9ybWF0aW9uPiB7CiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25SZWFkZXIgcmVhZGVyOwoKICBjb25zdCBOb2RlU291cmNlSW5mb3JtYXRpb24odGhpcy5yZWFkZXIpOwoKICBTb3VyY2VJbmZvcm1hdGlvbiB2aXNpdChqcy5Ob2RlIG5vZGUpID0+IG5vZGU/LmFjY2VwdCh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gdmlzaXROb2RlKGpzLk5vZGUgbm9kZSkgPT4KICAgICAgcmVhZGVyLmdldFNvdXJjZUluZm9ybWF0aW9uKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoanMuRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9IHJlYWRlci5nZXRTb3VyY2VJbmZvcm1hdGlvbihub2RlKTsKICAgIGlmIChzb3VyY2VJbmZvcm1hdGlvbiAhPSBudWxsKSB7CiAgICAgIHJldHVybiBzb3VyY2VJbmZvcm1hdGlvbjsKICAgIH0KICAgIHJldHVybiB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgKICAgICAganMuVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qgbm9kZSkgewogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPSByZWFkZXIuZ2V0U291cmNlSW5mb3JtYXRpb24obm9kZSk7CiAgICBpZiAoc291cmNlSW5mb3JtYXRpb24gIT0gbnVsbCkgewogICAgICByZXR1cm4gc291cmNlSW5mb3JtYXRpb247CiAgICB9CiAgICBmb3IgKGpzLk5vZGUgZGVjbGFyYXRpb24gaW4gbm9kZS5kZWNsYXJhdGlvbnMpIHsKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPSB2aXNpdChkZWNsYXJhdGlvbik7CiAgICAgIGlmIChzb3VyY2VJbmZvcm1hdGlvbiAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZUluZm9ybWF0aW9uOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIHZpc2l0VmFyaWFibGVJbml0aWFsaXphdGlvbigKICAgICAganMuVmFyaWFibGVJbml0aWFsaXphdGlvbiBub2RlKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9IHJlYWRlci5nZXRTb3VyY2VJbmZvcm1hdGlvbihub2RlKTsKICAgIGlmIChzb3VyY2VJbmZvcm1hdGlvbiAhPSBudWxsKSB7CiAgICAgIHJldHVybiBzb3VyY2VJbmZvcm1hdGlvbjsKICAgIH0KICAgIHJldHVybiB2aXNpdChub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIHZpc2l0QXNzaWdubWVudChqcy5Bc3NpZ25tZW50IG5vZGUpIHsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0gcmVhZGVyLmdldFNvdXJjZUluZm9ybWF0aW9uKG5vZGUpOwogICAgaWYgKHNvdXJjZUluZm9ybWF0aW9uICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHNvdXJjZUluZm9ybWF0aW9uOwogICAgfQogICAgcmV0dXJuIHZpc2l0KG5vZGUudmFsdWUpOwogIH0KfQoKLy8vIE1peGluIHRoYXQgYWRkIHN1cHBvcnQgZm9yIGNvbXB1dGluZyBbU291cmNlSW5mb3JtYXRpb25dIGZvciBhIFtqcy5Ob2RlXS4KYWJzdHJhY3QgY2xhc3MgTm9kZVRvU291cmNlSW5mb3JtYXRpb25NaXhpbiB7CiAgU291cmNlSW5mb3JtYXRpb25SZWFkZXIgZ2V0IHJlYWRlcjsKCiAgU291cmNlSW5mb3JtYXRpb24gY29tcHV0ZVNvdXJjZUluZm9ybWF0aW9uKGpzLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIG5ldyBOb2RlU291cmNlSW5mb3JtYXRpb24ocmVhZGVyKS52aXNpdChub2RlKTsKICB9Cn0KCi8vLyBbVHJhY2VMaXN0ZW5lcl0gdGhhdCByZWdpc3RlciBpbmxpbmluZyBjb250ZXh0LWRhdGEgd2l0aCBhIFtTb3VyY2VNYXBwZXJdLgpjbGFzcyBJbmxpbmluZ1RyYWNlTGlzdGVuZXIgZXh0ZW5kcyBUcmFjZUxpc3RlbmVyCiAgICB3aXRoIE5vZGVUb1NvdXJjZUluZm9ybWF0aW9uTWl4aW4gewogIGZpbmFsIFNvdXJjZU1hcHBlciBzb3VyY2VNYXBwZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25SZWFkZXIgcmVhZGVyOwogIGZpbmFsIE1hcDxpbnQsIExpc3Q8RnJhbWVDb250ZXh0Pj4gX2ZyYW1lcyA9IHt9OwoKICBJbmxpbmluZ1RyYWNlTGlzdGVuZXIodGhpcy5zb3VyY2VNYXBwZXIsIHRoaXMucmVhZGVyKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBvblN0ZXAoanMuTm9kZSBub2RlLCBPZmZzZXQgb2Zmc2V0LCBTdGVwS2luZCBraW5kKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9IGNvbXB1dGVTb3VyY2VJbmZvcm1hdGlvbihub2RlKTsKICAgIGlmIChzb3VyY2VJbmZvcm1hdGlvbiA9PSBudWxsKSByZXR1cm47CiAgICAvLyBUT0RPKHNpZ211bmQpOiBlbmFibGUgdGhpcyBhc3NlcnRpb24uCiAgICAvLyBhc3NlcnQob2Zmc2V0LnZhbHVlICE9IG51bGwsICJFeHBlY3RlZCBhIHZhbGlkIG9mZnNldDogJG5vZGUgJG9mZnNldCIpOwogICAgaWYgKG9mZnNldC52YWx1ZSA9PSBudWxsKSByZXR1cm47CgogICAgLy8gVE9ETyhzaWdtdW5kKTogZW5hYmxlIHRoaXMgYXNzZXJ0aW9uCiAgICAvL2Fzc2VydChfZnJhbWVzW29mZnNldC52YWx1ZV0gPT0gbnVsbCwKICAgIC8vICAgICAiRXhwZWN0IGEgc2luZ2xlIGVudHJ5IHBlciBvZmZzZXQ6ICRvZmZzZXQgJG5vZGUiKTsKICAgIGlmIChfZnJhbWVzW29mZnNldC52YWx1ZV0gIT0gbnVsbCkgcmV0dXJuOwoKICAgIC8vIER1cmluZyB0cmFjaW5nIHdlIG9ubHkgY29sbGVjdCBpbmZvcm1hdGlvbiBwZXIgb2Zmc2V0IGJlY2F1c2UgdGhlIHRyYWNlcgogICAgLy8gdmlzaXRzIG5vZGVzIGluIHRyZWUgb3JkZXIuIFdlJ2xsIGxhdGVyIHNvcnQgdGhlIGRhdGEgYnkgb2Zmc2V0IGJlZm9yZQogICAgLy8gcmVnaXN0ZXJpbmcgdGhlIGZyYW1lIGRhdGEgd2l0aCBbU291cmNlTWFwcGVyXS4KICAgIGlmIChraW5kID09IFN0ZXBLaW5kLkZVTl9FWElUKSB7CiAgICAgIF9mcmFtZXNbb2Zmc2V0LnZhbHVlXSA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICBfZnJhbWVzW29mZnNldC52YWx1ZV0gPSBzb3VyY2VJbmZvcm1hdGlvbi5pbmxpbmluZ0NvbnRleHQ7CiAgICB9CiAgfQoKICAvLy8gQ29udmVydHMgdGhlIGlubGluaW5nIGNvbnRleHQgZGF0YSBjb2xsZWN0ZWQgZHVyaW5nIHRyYWNpbmcgaW50byBwdXNoL3BvcAogIC8vLyBzdGFjayBvcGVyYXRpb25zIHRoYXQgd2lsbCBiZSBlbWl0dGVkIHdpdGggdGhlIHNvdXJjZS1tYXAgZmlsZXMuCiAgdm9pZCBmaW5pc2goKSB7CiAgICBMaXN0PEZyYW1lQ29udGV4dD4gbGFzdElubGluaW5nQ29udGV4dDsKICAgIGZvciAodmFyIG9mZnNldCBpbiBfZnJhbWVzLmtleXMudG9MaXN0KCkuLnNvcnQoKSkgewogICAgICB2YXIgbmV3SW5saW5pbmdDb250ZXh0ID0gX2ZyYW1lc1tvZmZzZXRdOwoKICAgICAgLy8gTm90ZTogdGhpcyByZWxpZXMgb24gdGhlIGludmFyaWFudCB0aGF0LCB3aGVuIHdlIGJ1aWx0IHRoZSBpbmxpbmluZwogICAgICAvLyBjb250ZXh0IGxpc3RzIGR1cmluZyBTU0EsIHdlIGtlcHQgbGlzdHMgaWRlbnRpY2FsIHdoZW5ldmVyIHRoZXJlIHdlcmUKICAgICAgLy8gbm8gaW5saW5pbmcgY2hhbmdlcy4KICAgICAgaWYgKGxhc3RJbmxpbmluZ0NvbnRleHQgPT0gbmV3SW5saW5pbmdDb250ZXh0KSBjb250aW51ZTsKCiAgICAgIGJvb2wgaXNFbXB0eSA9IGZhbHNlOwogICAgICBpbnQgcG9wQ291bnQgPSAwOwogICAgICBMaXN0PEZyYW1lQ29udGV4dD4gcHVzaGVzID0gY29uc3QgW107CiAgICAgIGlmIChuZXdJbmxpbmluZ0NvbnRleHQgPT0gbnVsbCkgewogICAgICAgIHBvcENvdW50ID0gbGFzdElubGluaW5nQ29udGV4dC5sZW5ndGg7CiAgICAgICAgaXNFbXB0eSA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAobGFzdElubGluaW5nQ29udGV4dCA9PSBudWxsKSB7CiAgICAgICAgcHVzaGVzID0gbmV3SW5saW5pbmdDb250ZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIGludCBtaW4gPSBuZXdJbmxpbmluZ0NvbnRleHQubGVuZ3RoOwogICAgICAgIGlmIChtaW4gPiBsYXN0SW5saW5pbmdDb250ZXh0Lmxlbmd0aCkgbWluID0gbGFzdElubGluaW5nQ29udGV4dC5sZW5ndGg7CiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tbW9uIGZyYW1lcywgdG8gcHJvZHVjZSB0aGUgbWluaW1hbAogICAgICAgIC8vIHNldCBvZiBwb3AgYW5kIHB1c2ggb3BlcmF0aW9ucy4KICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG1pbjsgaSsrKSB7CiAgICAgICAgICBpZiAoIWlkZW50aWNhbChuZXdJbmxpbmluZ0NvbnRleHRbaV0sIGxhc3RJbmxpbmluZ0NvbnRleHRbaV0pKSBicmVhazsKICAgICAgICB9CiAgICAgICAgaXNFbXB0eSA9IGkgPT0gMDsKICAgICAgICBwb3BDb3VudCA9IGxhc3RJbmxpbmluZ0NvbnRleHQubGVuZ3RoIC0gaTsKICAgICAgICBpZiAoaSA8IG5ld0lubGluaW5nQ29udGV4dC5sZW5ndGgpIHsKICAgICAgICAgIHB1c2hlcyA9IG5ld0lubGluaW5nQ29udGV4dC5zdWJsaXN0KGkpOwogICAgICAgIH0KICAgICAgfQogICAgICBsYXN0SW5saW5pbmdDb250ZXh0ID0gbmV3SW5saW5pbmdDb250ZXh0OwoKICAgICAgd2hpbGUgKHBvcENvdW50LS0gPiAwKSB7CiAgICAgICAgc291cmNlTWFwcGVyLnJlZ2lzdGVyUG9wKG9mZnNldCwgaXNFbXB0eTogcG9wQ291bnQgPT0gMCAmJiBpc0VtcHR5KTsKICAgICAgfQogICAgICBmb3IgKEZyYW1lQ29udGV4dCBwdXNoIGluIHB1c2hlcykgewogICAgICAgIHNvdXJjZU1hcHBlci5yZWdpc3RlclB1c2gob2Zmc2V0LAogICAgICAgICAgICBnZXRTb3VyY2VMb2NhdGlvbihwdXNoLmNhbGxJbmZvcm1hdGlvbiksIHB1c2guaW5saW5lZE1ldGhvZE5hbWUpOwogICAgICB9CiAgICB9CiAgfQp9CgovLy8gW1RyYWNlTGlzdGVuZXJdIHRoYXQgcmVnaXN0ZXIgW1NvdXJjZUxvY2F0aW9uXXMgd2l0aCBhIFtTb3VyY2VNYXBwZXJdLgpjbGFzcyBQb3NpdGlvblRyYWNlTGlzdGVuZXIgZXh0ZW5kcyBUcmFjZUxpc3RlbmVyCiAgICB3aXRoIE5vZGVUb1NvdXJjZUluZm9ybWF0aW9uTWl4aW4gewogIGZpbmFsIFNvdXJjZU1hcHBlciBzb3VyY2VNYXBwZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25SZWFkZXIgcmVhZGVyOwoKICBQb3NpdGlvblRyYWNlTGlzdGVuZXIodGhpcy5zb3VyY2VNYXBwZXIsIHRoaXMucmVhZGVyKTsKCiAgLy8vIFJlZ2lzdGVycyBzb3VyY2UgaW5mb3JtYXRpb24gZm9yIFtub2RlXSBvbiB0aGUgW29mZnNldF0gaW4gdGhlIEphdmFTY3JpcHQKICAvLy8gY29kZSB1c2luZyBba2luZF0gdG8gZGV0ZXJtaW5lIHdoYXQgaW5mb3JtYXRpb24gdG8gdXNlLgogIC8vLwogIC8vLyBGb3IgbW9zdCBub2RlcyB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHNvdXJjZSBpbmZvcm1hdGlvbiBpcyB1c2VkLgogIC8vLyBGb3IgaW5zdGFuY2UgYSByZXR1cm4gZXhwcmVzc2lvbiBwb2ludHMgdG8gdGhlIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUKICAvLy8gc291cmNlIGluZm9ybWF0aW9uLCB0eXBpY2FsbHkgdGhlIHN0YXJ0IG9mIHRoZSByZXR1cm4gc3RhdGVtZW50IHRoYXQKICAvLy8gY3JlYXRlZCB0aGUgSmF2YVNjcmlwdCByZXR1cm4gbm9kZToKICAvLy8KICAvLy8gICAgIEphdmFTY3JpcHQ6ICAgICAgICAgICAgICAgICAgICBEYXJ0OgogIC8vLwogIC8vLyAgICAgQHJldHVybiAiZm9vIjsgICAgICAgICAgICAgICAgIHJldHVybiAiZm9vIjsKICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgLy8vIChAIG1hcmtzIHRoZSBjdXJyZW50IEphdmFTY3JpcHQgcG9zaXRpb24gYW5kIF4gcG9pbnQgdG8gdGhlIG1hcHBlZCBEYXJ0CiAgLy8vIGNvZGUgcG9zaXRpb24uKQogIC8vLwogIC8vLwogIC8vLyBGb3IgW1N0ZXBLaW5kLkNBTExdIHRoZSBgQ2FsbFBvc2l0aW9uLmdldFNlbWFudGljUG9zaXRpb25Gb3JDYWxsYCBtZXRob2QKICAvLy8gaXMgY2FsbGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzdGFydCBvciB0aGUgaW5uZXIgcG9zaXRpb24gc2hvdWxkIGJlCiAgLy8vIHVzZWQuIEZvciBpbnN0YW5jZSBpZiB0aGUgcmVjZWl2ZXIgb2YgdGhlIEphdmFTY3JpcHQgY2FsbCBpcyBhICJzaW1wbGUiCiAgLy8vIGV4cHJlc3Npb24gdGhlbiB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHNvdXJjZSBpbmZvcm1hdGlvbiBpcyB1c2VkOgogIC8vLwogIC8vLyAgICAgSmF2YVNjcmlwdDogICAgICAgICAgICAgICAgICAgIERhcnQ6CiAgLy8vCiAgLy8vICAgICB0MS5AZm9vJDAoKSAgICAgICAgICAgICAgICAgICAgbG9jYWwuZm9vKCkKICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgLy8vCiAgLy8vIElmIHRoZSByZWNlaXZlciBvZiB0aGUgSmF2YVNjcmlwdCBjYWxsIGlzICJjb21wbGV4IiB0aGVuIHRoZSBpbm5lcgogIC8vLyBwb3NpdGlvbiBvZiB0aGUgc291cmNlIGluZm9ybWF0aW9uIGlzIHVzZWQ6CiAgLy8vCiAgLy8vICAgICBKYXZhU2NyaXB0OiAgICAgICAgICAgICAgICAgICAgRGFydDoKICAvLy8KICAvLy8gICAgIGdldCRiYXIoKS5AZm9vKCkgICAgICAgICAgICAgICBiYXIuZm9vKCkKICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogIC8vLwogIC8vLyBGb3IgW1N0ZXBLaW5kLkZVTl9FWElUXSB0aGUgaW5uZXIgcG9zaXRpb24gb2YgdGhlIHNvdXJjZSBpbmZvcm1hdGlvbgogIC8vLyBpcyB1c2VkLiBGb3IgYSBKYXZhU2NyaXB0IGZ1bmN0aW9uIHdpdGhvdXQgYSByZXR1cm4gc3RhdGVtZW50IHRoaXMgbWFwcwogIC8vLyB0aGUgZW5kIGJyYWNlIHRvIHRoZSBlbmQgYnJhY2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgRGFydCBmdW5jdGlvbi4gRm9yIGEKICAvLy8gSmF2YVNjcmlwdCBmdW5jdGlvbiBleGl0ZWQgdGhyb3VnaCBhIHJldHVybiBzdGF0ZW1lbnQgdGhpcyBtYXBzIHRoZSBlbmQgb2YKICAvLy8gdGhlIHJldHVybiBzdGF0ZW1lbnQgdG8gdGhlIGVuZCBicmFjZSBvZiB0aGUgRGFydCBmdW5jdGlvbjoKICAvLy8KICAvLy8gICAgIEphdmFTY3JpcHQ6ICAgICAgICAgICAgICAgICAgICBEYXJ0OgogIC8vLwogIC8vLyAgICAgZm9vOiBmdW5jdGlvbigpIHsgICAgICAgICAgICAgIGZvbygpIHsKICAvLy8gICAgIEB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogIC8vLyAgICAgZm9vOiBmdW5jdGlvbigpIHsgICAgICAgICAgICAgIGZvbygpIHsKICAvLy8gICAgICAgcmV0dXJuIDA7QCAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogIC8vLyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgQG92ZXJyaWRlCiAgdm9pZCBvblN0ZXAoanMuTm9kZSBub2RlLCBPZmZzZXQgb2Zmc2V0LCBTdGVwS2luZCBraW5kKSB7CiAgICBpbnQgY29kZUxvY2F0aW9uID0gb2Zmc2V0LnZhbHVlOwogICAgaWYgKGNvZGVMb2NhdGlvbiA9PSBudWxsKSByZXR1cm47CgogICAgaWYgKGtpbmQgPT0gU3RlcEtpbmQuTk9fSU5GTykgewogICAgICBzb3VyY2VNYXBwZXIucmVnaXN0ZXIobm9kZSwgY29kZUxvY2F0aW9uLCBjb25zdCBOb1NvdXJjZUxvY2F0aW9uTWFya2VyKCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPSBjb21wdXRlU291cmNlSW5mb3JtYXRpb24obm9kZSk7CiAgICBpZiAoc291cmNlSW5mb3JtYXRpb24gPT0gbnVsbCkgcmV0dXJuOwoKICAgIHZvaWQgcmVnaXN0ZXJQb3NpdGlvbihTb3VyY2VQb3NpdGlvbktpbmQgc291cmNlUG9zaXRpb25LaW5kKSB7CiAgICAgIFNvdXJjZUxvY2F0aW9uIHNvdXJjZUxvY2F0aW9uID0KICAgICAgICAgIGdldFNvdXJjZUxvY2F0aW9uKHNvdXJjZUluZm9ybWF0aW9uLCBzb3VyY2VQb3NpdGlvbktpbmQpOwogICAgICBpZiAoc291cmNlTG9jYXRpb24gIT0gbnVsbCkgewogICAgICAgIHNvdXJjZU1hcHBlci5yZWdpc3Rlcihub2RlLCBjb2RlTG9jYXRpb24sIHNvdXJjZUxvY2F0aW9uKTsKICAgICAgfQogICAgfQoKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIFN0ZXBLaW5kLkZVTl9FTlRSWToKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyB3aGVuIGZ1bGx5IHRyYW5zaXRpb25lZCB0byB0aGUKICAgICAgICAvLyBuZXcgc291cmNlIGluZm8gc3lzdGVtLiBWZXJpZnkgdGhhdCB0b29scyBubyBsb25nZXIgZXhwZWN0IEpTCiAgICAgICAgLy8gZnVuY3Rpb24gc2lnbmF0dXJlcyB0byBtYXAgdG8gdGhlIG9yaWdpbi4gVGhlIG1haW4gbWV0aG9kIG1heSBzdGlsbAogICAgICAgIC8vIG5lZWQgbWFwcGluZyB0byBlbmFibGUgYnJlYWtwb2ludHMgYmVmb3JlIGNhbGxpbmcgbWFpbi4KICAgICAgICByZWdpc3RlclBvc2l0aW9uKFNvdXJjZVBvc2l0aW9uS2luZC5TVEFSVCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RlcEtpbmQuRlVOX0VYSVQ6CiAgICAgICAgcmVnaXN0ZXJQb3NpdGlvbihTb3VyY2VQb3NpdGlvbktpbmQuSU5ORVIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0ZXBLaW5kLkNBTEw6CiAgICAgICAgQ2FsbFBvc2l0aW9uIGNhbGxQb3NpdGlvbiA9CiAgICAgICAgICAgIENhbGxQb3NpdGlvbi5nZXRTZW1hbnRpY1Bvc2l0aW9uRm9yQ2FsbChub2RlKTsKICAgICAgICByZWdpc3RlclBvc2l0aW9uKGNhbGxQb3NpdGlvbi5zb3VyY2VQb3NpdGlvbktpbmQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0ZXBLaW5kLkFDQ0VTUzoKICAgICAgY2FzZSBTdGVwS2luZC5ORVc6CiAgICAgIGNhc2UgU3RlcEtpbmQuUkVUVVJOOgogICAgICBjYXNlIFN0ZXBLaW5kLkJSRUFLOgogICAgICBjYXNlIFN0ZXBLaW5kLkNPTlRJTlVFOgogICAgICBjYXNlIFN0ZXBLaW5kLlRIUk9XOgogICAgICBjYXNlIFN0ZXBLaW5kLkVYUFJFU1NJT05fU1RBVEVNRU5UOgogICAgICBjYXNlIFN0ZXBLaW5kLklGX0NPTkRJVElPTjoKICAgICAgY2FzZSBTdGVwS2luZC5GT1JfSU5JVElBTElaRVI6CiAgICAgIGNhc2UgU3RlcEtpbmQuRk9SX0NPTkRJVElPTjoKICAgICAgY2FzZSBTdGVwS2luZC5GT1JfVVBEQVRFOgogICAgICBjYXNlIFN0ZXBLaW5kLldISUxFX0NPTkRJVElPTjoKICAgICAgY2FzZSBTdGVwS2luZC5ET19DT05ESVRJT046CiAgICAgIGNhc2UgU3RlcEtpbmQuU1dJVENIX0VYUFJFU1NJT046CiAgICAgICAgcmVnaXN0ZXJQb3NpdGlvbihTb3VyY2VQb3NpdGlvbktpbmQuU1RBUlQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0ZXBLaW5kLk5PX0lORk86CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQp9CgovLy8gVGhlIHBvc2l0aW9uIG9mIGEgW2pzLkNhbGxdIG5vZGUuCmNsYXNzIENhbGxQb3NpdGlvbiB7CiAgLy8vIFRoZSBjYWxsIG5vZGUgZm9yIHdoaWNoIHRoZSBwb3NpdGlvbnMgaGF2ZSBiZWVuIGNvbXB1dGVkLgogIGZpbmFsIGpzLk5vZGUgbm9kZTsKCiAgLy8vIFRoZSBwb3NpdGlvbiBmb3IgW25vZGVdIHVzZWQgYXMgdGhlIG9mZnNldCBpbiB0aGUgSmF2YVNjcmlwdCBjb2RlLgogIC8vLwogIC8vLyBUaGlzIGlzIGVpdGhlciBgQ29kZVBvc2l0aW9uS2luZC5TVEFSVGAgZm9yIGNvZGUgbGlrZQogIC8vLwogIC8vLyAgICAgdDEuZm9vJDAoKQogIC8vLyAgICAgXgogIC8vLyB3aGVyZSB0aGUgbGVmdC1tb3N0IG9mZnNldCBvZiB0aGUgcmVjZWl2ZXIgc2hvdWxkIGJlIHVzZWQsIG9yCiAgLy8vIGBDb2RlUG9zaXRpb25LaW5kLkNMT1NJTkdgIGZvciBjb2RlIGxpa2UKICAvLy8KICAvLy8gICAgIGdldCRiYXIoKS5mb28kMCgpCiAgLy8vICAgICAgICAgICAgICAgXgogIC8vLwogIC8vLyB3aGVyZSB0aGUgbmFtZSBvZiB0aGUgY2FsbGVkIG1ldGhvZCBzaG91bGQgYmUgdXNlZCAoaGVyZSB0aGUgbWV0aG9kCiAgLy8vICdmb28kMCcpLgogIGZpbmFsIENvZGVQb3NpdGlvbktpbmQgY29kZVBvc2l0aW9uS2luZDsKCiAgLy8vIFRoZSBwb3NpdGlvbiBmcm9tIHRoZSBbU291cmNlSW5mb3JtYXRpb25dIHVzZWQgaW4gdGhlIG1hcHBlZCBEYXJ0IGNvZGUuCiAgLy8vCiAgLy8vIFRoaXMgaXMgZWl0aGVyIGBTb3VyY2VQb3NpdGlvbktpbmQuU1RBUlRgIGZvciBjb2RlIGxpa2UKICAvLy8KICAvLy8gICAgIEphdmFTY3JpcHQ6ICAgICAgICAgICAgICAgICAgICBEYXJ0OgogIC8vLwogIC8vLyAgICAgdDEuQGZvbyQwKCkgICAgICAgICAgICAgICAgICAgIGxvY2FsLmZvbygpCiAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogIC8vLwogIC8vLyB3aGVyZSB0aGUgSmF2YVNjcmlwdCByZWNlaXZlciBpcyBhICJzaW1wbGUiIGV4cHJlc3Npb24sIG9yCiAgLy8vIGBTb3VyY2VQb3NpdGlvbktpbmQuQ0xPU0lOR2AgZm9yIGNvZGUgbGlrZQogIC8vLwogIC8vLyAgICAgSmF2YVNjcmlwdDogICAgICAgICAgICAgICAgICAgIERhcnQ6CiAgLy8vCiAgLy8vICAgICBnZXQkYmFyKCkuQGZvbygpICAgICAgICAgICAgICAgYmFyLmZvbygpCiAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KICAvLy8KICAvLy8gd2hlcmUgdGhlIEphdmFTY3JpcHQgcmVjZWl2ZXIgaXMgYSAiY29tcGxleCIgZXhwcmVzc2lvbi4KICAvLy8KICAvLy8gKEAgbWFya3MgdGhlIGN1cnJlbnQgSmF2YVNjcmlwdCBwb3NpdGlvbiBhbmQgXiBwb2ludCB0byB0aGUgbWFwcGVkIERhcnQKICAvLy8gY29kZSBwb3NpdGlvbi4pCiAgZmluYWwgU291cmNlUG9zaXRpb25LaW5kIHNvdXJjZVBvc2l0aW9uS2luZDsKCiAgQ2FsbFBvc2l0aW9uKHRoaXMubm9kZSwgdGhpcy5jb2RlUG9zaXRpb25LaW5kLCB0aGlzLnNvdXJjZVBvc2l0aW9uS2luZCk7CgogIC8vLyBDb21wdXRlcyB0aGUgW0NhbGxQb3NpdGlvbl0gZm9yIHRoZSBjYWxsIFtub2RlXS4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGlmIHRoZSByZWNlaXZlciBvZiB0aGUgSmF2YVNjcmlwdCBjYWxsIGlzIGEgInNpbXBsZSIKICAvLy8gZXhwcmVzc2lvbiB0aGVuIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgc291cmNlIGluZm9ybWF0aW9uIGlzIHVzZWQ6CiAgLy8vCiAgLy8vICAgICBKYXZhU2NyaXB0OiAgICAgICAgICAgICAgICAgICAgRGFydDoKICAvLy8KICAvLy8gICAgIHQxLkBmb28kMCgpICAgICAgICAgICAgICAgICAgICBsb2NhbC5mb28oKQogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KICAvLy8KICAvLy8gSWYgdGhlIHJlY2VpdmVyIG9mIHRoZSBKYXZhU2NyaXB0IGNhbGwgaXMgImNvbXBsZXgiIHRoZW4gdGhlIGlubmVyCiAgLy8vIHBvc2l0aW9uIG9mIHRoZSBzb3VyY2UgaW5mb3JtYXRpb24gaXMgdXNlZDoKICAvLy8KICAvLy8gICAgIEphdmFTY3JpcHQ6ICAgICAgICAgICAgICAgICAgICBEYXJ0OgogIC8vLwogIC8vLyAgICAgZ2V0JGJhcigpLkBmb28oKSAgICAgICAgICAgICAgIGJhci5mb28oKQogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgLy8vIChAIG1hcmtzIHRoZSBjdXJyZW50IEphdmFTY3JpcHQgcG9zaXRpb24gYW5kIF4gcG9pbnQgdG8gdGhlIG1hcHBlZCBEYXJ0CiAgLy8vIGNvZGUgcG9zaXRpb24uKQogIHN0YXRpYyBDYWxsUG9zaXRpb24gZ2V0U2VtYW50aWNQb3NpdGlvbkZvckNhbGwoanMuQ2FsbCBub2RlKSB7CiAgICBqcy5FeHByZXNzaW9uIGFjY2VzcyA9IGpzLnVuZGVmZXIobm9kZS50YXJnZXQpOwogICAgaWYgKGFjY2VzcyBpcyBqcy5Qcm9wZXJ0eUFjY2VzcykgewogICAgICBqcy5Ob2RlIHRhcmdldCA9IGFjY2VzczsKICAgICAgYm9vbCBwdXJlQWNjZXNzID0gZmFsc2U7CiAgICAgIHdoaWxlICh0YXJnZXQgaXMganMuUHJvcGVydHlBY2Nlc3MpIHsKICAgICAgICBqcy5Qcm9wZXJ0eUFjY2VzcyB0YXJnZXRBY2Nlc3MgPSB0YXJnZXQ7CiAgICAgICAganMuTm9kZSByZWNlaXZlciA9IGpzLnVuZGVmZXIodGFyZ2V0QWNjZXNzLnJlY2VpdmVyKTsKICAgICAgICBpZiAocmVjZWl2ZXIgaXMganMuVmFyaWFibGVVc2UgfHwgcmVjZWl2ZXIgaXMganMuVGhpcykgewogICAgICAgICAgcHVyZUFjY2VzcyA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0ID0gcmVjZWl2ZXI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwdXJlQWNjZXNzKSB7CiAgICAgICAgLy8gYS5tKCkgICB0aGlzLm0oKSAgYS5iLmMuZC5tKCkKICAgICAgICAvLyBeICAgICAgIF4gICAgICAgICBeCiAgICAgICAgcmV0dXJuIG5ldyBDYWxsUG9zaXRpb24oCiAgICAgICAgICAgIG5vZGUsIENvZGVQb3NpdGlvbktpbmQuU1RBUlQsIFNvdXJjZVBvc2l0aW9uS2luZC5TVEFSVCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gKi5tKCkgICouYS5iLmMuZC5tKCkKICAgICAgICAvLyAgIF4gICAgICAgICAgICAgIF4KICAgICAgICByZXR1cm4gbmV3IENhbGxQb3NpdGlvbigKICAgICAgICAgICAgYWNjZXNzLnNlbGVjdG9yLCBDb2RlUG9zaXRpb25LaW5kLlNUQVJULCBTb3VyY2VQb3NpdGlvbktpbmQuSU5ORVIpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGFjY2VzcyBpcyBqcy5WYXJpYWJsZVVzZSB8fCBhY2Nlc3MgaXMganMuVGhpcykgewogICAgICAvLyBtKCkgICB0aGlzKCkKICAgICAgLy8gXiAgICAgXgogICAgICByZXR1cm4gbmV3IENhbGxQb3NpdGlvbigKICAgICAgICAgIG5vZGUsIENvZGVQb3NpdGlvbktpbmQuU1RBUlQsIFNvdXJjZVBvc2l0aW9uS2luZC5TVEFSVCk7CiAgICB9IGVsc2UgaWYgKGFjY2VzcyBpcyBqcy5GdW4gfHwKICAgICAgICBhY2Nlc3MgaXMganMuTmV3IHx8CiAgICAgICAgYWNjZXNzIGlzIGpzLk5hbWVkRnVuY3Rpb24pIHsKICAgICAgLy8gZnVuY3Rpb24oKXt9KCkgIG5ldyBGdW5jdGlvbigiLi4uIikoKSAgIGZ1bmN0aW9uIGZvbygpe30oKQogICAgICAvLyAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgIF4KICAgICAgcmV0dXJuIG5ldyBDYWxsUG9zaXRpb24oCiAgICAgICAgICBub2RlLnRhcmdldCwgQ29kZVBvc2l0aW9uS2luZC5FTkQsIFNvdXJjZVBvc2l0aW9uS2luZC5JTk5FUik7CiAgICB9IGVsc2UgaWYgKGFjY2VzcyBpcyBqcy5CaW5hcnkgfHwgYWNjZXNzIGlzIGpzLkNhbGwpIHsKICAgICAgLy8gKDAsYSkoKSAgIG0oKSgpCiAgICAgIC8vICAgICAgXiAgICAgICBeCiAgICAgIHJldHVybiBuZXcgQ2FsbFBvc2l0aW9uKAogICAgICAgICAgbm9kZS50YXJnZXQsIENvZGVQb3NpdGlvbktpbmQuRU5ELCBTb3VyY2VQb3NpdGlvbktpbmQuSU5ORVIpOwogICAgfSBlbHNlIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWF5YmUgcmVtb3ZlIHRoaXMgYXNzZXJ0aW9uLgogICAgICBhc3NlcnQoCiAgICAgICAgICBmYWxzZSwKICAgICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICAgIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICAgICAiVW5leHBlY3RlZCBwcm9wZXJ0eSBhY2Nlc3MgJHtub2RlVG9TdHJpbmcobm9kZSl9OlxuIgogICAgICAgICAgICAgICIke0RlYnVnUHJpbnRlci5wcmV0dHlQcmludChub2RlKX0iKSk7CiAgICAgIC8vIERvbid0IGtub3cuLi4uCiAgICAgIHJldHVybiBuZXcgQ2FsbFBvc2l0aW9uKAogICAgICAgICAgbm9kZSwgQ29kZVBvc2l0aW9uS2luZC5TVEFSVCwgU291cmNlUG9zaXRpb25LaW5kLlNUQVJUKTsKICAgIH0KICB9Cn0KCi8vLyBBbiBvZmZzZXQgb2YgYSBKYXZhU2NyaXB0IG5vZGUgd2l0aGluIHRoZSBvdXRwdXQgY29kZS4KLy8vCi8vLyBUaGlzIG9iamVjdCBob2xkcyB0aHJlZSBkaWZmZXJlbnQgdmFsdWVzIGZvciB0aGUgb2Zmc2V0IGNvcnJlc3BvbmRpbmcgdG8KLy8vIHRocmVlIGRpZmZlcmVudCB3YXlzIGJyb3dzZXJzIGNhbiBjb21wdXRlIHRoZSBvZmZzZXQgb2YgYSBKYXZhU2NyaXB0IG5vZGUuCi8vLwovLy8gQ3VycmVudGx5IFtzdWJleHByZXNzaW9uT2Zmc2V0XSBpcyB1c2VkIHNpbmNlIGl0IGNvcnJlc3BvbmRzIHRoZSBtb3N0IHRvIHRoZQovLy8gb2Zmc2V0IHVzZWQgYnkgbW9zdCBicm93c2Vycy4KY2xhc3MgT2Zmc2V0IHsKICAvLy8gVGhlIG9mZnNldCBvZiB0aGUgZW5jbG9zaW5nIHN0YXRlbWVudCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQogIC8vLyBmaWxlLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2U6CiAgLy8vCiAgLy8vICAgICBmb28oKS5iYXIoYmF6KCkpOwogIC8vLyAgICAgXiAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGF0ZW1lbnQgb2Zmc2V0IG9mIHRoZSBgZm9vKClgIGNhbGwKICAvLy8gICAgIF4gICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhdGVtZW50IG9mZnNldCBvZiB0aGUgYCouYmFyKClgIGNhbGwKICAvLy8gICAgIF4gICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhdGVtZW50IG9mZnNldCBvZiB0aGUgYGJheigpYCBjYWxsCiAgLy8vCiAgZmluYWwgaW50IHN0YXRlbWVudE9mZnNldDsKCiAgLy8vIFRoZSBgc3ViZXhwcmVzc2lvbmAgb2Zmc2V0IG9mIHRoZSBzdGVwLiBUaGlzIGlzIHRoZSAobW9zdGx5KSB1bmlxdWUKICAvLy8gb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUsIHRoYXQgaWRlbnRpZmllcyB0aGUKICAvLy8gY3VycmVudCBvZiBleGVjdXRpb24uCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZToKICAvLy8KICAvLy8gICAgIGZvbygpLmJhcihiYXooKSk7CiAgLy8vICAgICBeICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdWJleHByZXNzaW9uIG9mZnNldCBvZiB0aGUgYGZvbygpYCBjYWxsCiAgLy8vICAgICAgICAgICBeICAgICAgICAgICAgIC8vIHRoZSBzdWJleHByZXNzaW9uIG9mZnNldCBvZiB0aGUgYCouYmFyKClgIGNhbGwKICAvLy8gICAgICAgICAgICAgICBeICAgICAgICAgLy8gdGhlIHN1YmV4cHJlc3Npb24gb2Zmc2V0IG9mIHRoZSBgYmF6KClgIGNhbGwKICAvLy8KICAvLy8gSGVyZSwgZXZlbiB0aG91Z2ggdGhlIEphdmFTY3JpcHQgbm9kZSBmb3IgdGhlIGAqLmJhcigpYCBjYWxsIGNvbnRhaW5zCiAgLy8vIHRoZSBgZm9vKClgIGl0cyBleGVjdXRpb24gaXMgaWRlbnRpZmllZCBieSB0aGUgYGJhcmAgaWRlbnRpZmllciBtb3JlIHRoYW4KICAvLy8gdGhlIGZvbyBpZGVudGlmaWVyLgogIC8vLwogIGZpbmFsIGludCBzdWJleHByZXNzaW9uT2Zmc2V0OwoKICAvLy8gVGhlIGBsZWZ0LXRvLXJpZ2h0YCBvZmZzZXQgb2YgdGhlIHN0ZXAuIFRoaXMgaXMgbGlrZSBbc3ViZXhwcmVzc2lvbk9mZnNldF0KICAvLy8gYnV0IHJlc3RyaWN0ZWQgc28gdGhhdCB0aGUgb2Zmc2V0IG9mIGVhY2ggc3ViZXhwcmVzc2lvbiBpbiBleGVjdXRpb24KICAvLy8gb3JkZXIgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2U6CiAgLy8vCiAgLy8vICAgICBmb28oKS5iYXIoYmF6KCkpOwogIC8vLyAgICAgXiAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGVmdC10by1yaWdodCBvZmZzZXQgb2YgdGhlIGBmb28oKWAgY2FsbAogIC8vLyAgICAgICAgICAgXiAgICAgICAgICAgICAvLyB0aGUgbGVmdC10by1yaWdodCBvZmZzZXQgb2YgdGhlIGAqLmJhcigpYCBjYWxsCiAgLy8vICAgICBeICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsZWZ0LXRvLXJpZ2h0IG9mZnNldCBvZiB0aGUgYGJheigpYCBjYWxsCiAgLy8vCiAgLy8vIEhlcmUsIGBiYXooKWAgaXMgZXhlY3V0ZWQgYmVmb3JlIGBmb28oKWAgc28gd2UgbmVlZCB0byB1c2UgJ2YnIGFzIGl0cyBiZXN0CiAgLy8vIHBvc2l0aW9uIHVuZGVyIHRoZSByZXN0cmljdGlvbi4KICAvLy8KICBmaW5hbCBpbnQgbGVmdFRvUmlnaHRPZmZzZXQ7CgogIE9mZnNldCgKICAgICAgdGhpcy5zdGF0ZW1lbnRPZmZzZXQsIHRoaXMubGVmdFRvUmlnaHRPZmZzZXQsIHRoaXMuc3ViZXhwcmVzc2lvbk9mZnNldCk7CgogIGludCBnZXQgdmFsdWUgPT4gc3ViZXhwcmVzc2lvbk9mZnNldDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdPZmZzZXRbc3RhdGVtZW50T2Zmc2V0PSRzdGF0ZW1lbnRPZmZzZXQsJwogICAgICAgICdsZWZ0VG9SaWdodE9mZnNldD0kbGVmdFRvUmlnaHRPZmZzZXQsJwogICAgICAgICdzdWJleHByZXNzaW9uT2Zmc2V0PSRzdWJleHByZXNzaW9uT2Zmc2V0XSc7CiAgfQp9CgplbnVtIEJyYW5jaEtpbmQgewogIENPTkRJVElPTiwKICBMT09QLAogIENBVENILAogIEZJTkFMTFksCiAgQ0FTRSwKfQoKZW51bSBTdGVwS2luZCB7CiAgRlVOX0VOVFJZLAogIEZVTl9FWElULAogIENBTEwsCiAgTkVXLAogIEFDQ0VTUywKICBSRVRVUk4sCiAgQlJFQUssCiAgQ09OVElOVUUsCiAgVEhST1csCiAgRVhQUkVTU0lPTl9TVEFURU1FTlQsCiAgSUZfQ09ORElUSU9OLAogIEZPUl9JTklUSUFMSVpFUiwKICBGT1JfQ09ORElUSU9OLAogIEZPUl9VUERBVEUsCiAgV0hJTEVfQ09ORElUSU9OLAogIERPX0NPTkRJVElPTiwKICBTV0lUQ0hfRVhQUkVTU0lPTiwKICBOT19JTkZPLAp9CgovLy8gTGlzdGVuZXIgZm9yIHRoZSBbSmF2YVNjcmlwdFRyYWNlcl0uCmFic3RyYWN0IGNsYXNzIFRyYWNlTGlzdGVuZXIgewogIC8vLyBDYWxsZWQgYmVmb3JlIFtyb290XSBub2RlIGlzIHByb2Nlc2VkIGJ5IHRoZSBbSmF2YVNjcmlwdFRyYWNlcl0uCiAgdm9pZCBvblN0YXJ0KGpzLk5vZGUgcm9vdCkge30KCiAgLy8vIENhbGxlZCBhZnRlciBbcm9vdF0gbm9kZSBoYXMgYmVlbiBwcm9jZXNlZCBieSB0aGUgW0phdmFTY3JpcHRUcmFjZXJdLgogIHZvaWQgb25FbmQoanMuTm9kZSByb290KSB7fQoKICAvLy8gQ2FsbGVkIHdoZW4gYSBicmFuY2ggb2YgdGhlIGdpdmVuIFtraW5kXSBpcyBzdGFydGVkLiBbdmFsdWVdIGlzIHByb3ZpZGVkCiAgLy8vIHRvIGRpc3Rpbmd1aXNoIHRydWUvZmFsc2UgYnJhbmNoZXMgb2YgW0JyYW5jaEtpbmQuQ09ORElUSU9OXSBhbmQgY2FzZXMgb2YKICAvLy8gW0JyYW5jaC5DQVNFXS4KICB2b2lkIHB1c2hCcmFuY2goQnJhbmNoS2luZCBraW5kLCBbdmFsdWVdKSB7fQoKICAvLy8gQ2FsbGVkIHdoZW4gdGhlIGN1cnJlbnQgYnJhbmNoIGVuZHMuCiAgdm9pZCBwb3BCcmFuY2goKSB7fQoKICAvLy8gQ2FsbGVkIHdoZW4gW25vZGVdIGRlZmluZXMgYSBzdGVwIG9mIHRoZSBnaXZlbiBba2luZF0gYXQgdGhlIGdpdmVuCiAgLy8vIFtvZmZzZXRdIHdoZW4gdGhlIGdlbmVyYXRlZCBKYXZhU2NyaXB0IGNvZGUuCiAgdm9pZCBvblN0ZXAoanMuTm9kZSBub2RlLCBPZmZzZXQgb2Zmc2V0LCBTdGVwS2luZCBraW5kKSB7fQp9CgovLy8gVmlzaXRvciB0aGF0IGNvbXB1dGVzIHRoZSBbanMuTm9kZV1zIHRoZSBhcmUgcGFydCBvZiB0aGUgSmF2YVNjcmlwdAovLy8gc3RlcHBhYmxlIGV4ZWN1dGlvbiBhbmQgdGh1cyBuZWVkcyBzb3VyY2UgbWFwcGluZyBsb2NhdGlvbnMuCmNsYXNzIEphdmFTY3JpcHRUcmFjZXIgZXh0ZW5kcyBqcy5CYXNlVmlzaXRvciB7CiAgZmluYWwgQ29kZVBvc2l0aW9uTWFwIGNvZGVQb3NpdGlvbnM7CiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25SZWFkZXIgcmVhZGVyOwogIGZpbmFsIExpc3Q8VHJhY2VMaXN0ZW5lcj4gbGlzdGVuZXJzOwoKICAvLy8gVGhlIHN0ZXBzIGFkZGVkIGJ5IHN1YmV4cHJlc3Npb25zLgogIExpc3Qgc3RlcHMgPSBbXTsKCiAgLy8vIFRoZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgc3RhdGVtZW50LgogIGludCBzdGF0ZW1lbnRPZmZzZXQ7CgogIC8vLyBUaGUgY3VycmVudCBvZmZzZXQgaW4gbGVmdC10by1yaWdodCBwcm9ncmVzc2lvbi4KICBpbnQgbGVmdFRvUmlnaHRPZmZzZXQ7CgogIC8vLyBUaGUgb2Zmc2V0IG9mIHRoZSBzdXJyb3VuZGluZyBzdGF0ZW1lbnQsIHVzZWQgZm9yIHRoZSBmaXJzdCBzdWJleHByZXNzaW9uLgogIGludCBvZmZzZXRQb3NpdGlvbjsKCiAgYm9vbCBhY3RpdmU7CgogIEphdmFTY3JpcHRUcmFjZXIodGhpcy5jb2RlUG9zaXRpb25zLCB0aGlzLnJlYWRlciwgdGhpcy5saXN0ZW5lcnMsCiAgICAgIHt0aGlzLmFjdGl2ZTogZmFsc2V9KTsKCiAgdm9pZCBub3RpZnlTdGFydChqcy5Ob2RlIG5vZGUpIHsKICAgIGxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIub25TdGFydChub2RlKSk7CiAgfQoKICB2b2lkIG5vdGlmeUVuZChqcy5Ob2RlIG5vZGUpIHsKICAgIGxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIub25FbmQobm9kZSkpOwogIH0KCiAgdm9pZCBub3RpZnlQdXNoQnJhbmNoKEJyYW5jaEtpbmQga2luZCwgW3ZhbHVlXSkgewogICAgaWYgKGFjdGl2ZSkgewogICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyLnB1c2hCcmFuY2goa2luZCwgdmFsdWUpKTsKICAgIH0KICB9CgogIHZvaWQgbm90aWZ5UG9wQnJhbmNoKCkgewogICAgaWYgKGFjdGl2ZSkgewogICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyLnBvcEJyYW5jaCgpKTsKICAgIH0KICB9CgogIHZvaWQgbm90aWZ5U3RlcChqcy5Ob2RlIG5vZGUsIE9mZnNldCBvZmZzZXQsIFN0ZXBLaW5kIGtpbmQsCiAgICAgIHtib29sIGZvcmNlOiBmYWxzZX0pIHsKICAgIGlmIChhY3RpdmUgfHwgZm9yY2UpIHsKICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lci5vblN0ZXAobm9kZSwgb2Zmc2V0LCBraW5kKSk7CiAgICB9CiAgfQoKICB2b2lkIGFwcGx5KGpzLk5vZGUgbm9kZSkgewogICAgbm90aWZ5U3RhcnQobm9kZSk7CgogICAgaW50IHN0YXJ0UG9zaXRpb24gPSBnZXRTeW50YXhPZmZzZXQobm9kZSwga2luZDogQ29kZVBvc2l0aW9uS2luZC5TVEFSVCk7CiAgICBPZmZzZXQgc3RhcnRPZmZzZXQgPSBnZXRPZmZzZXRGb3JOb2RlKG5vZGUsIHN0YXJ0UG9zaXRpb24pOwogICAgbm90aWZ5U3RlcChub2RlLCBzdGFydE9mZnNldCwgU3RlcEtpbmQuTk9fSU5GTywgZm9yY2U6IHRydWUpOwoKICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogICAgbm90aWZ5RW5kKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXROb2RlKGpzLk5vZGUgbm9kZSkgewogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgdmlzaXQoanMuTm9kZSBub2RlLCBbQnJhbmNoS2luZCBicmFuY2gsIHZhbHVlXSkgewogICAgaWYgKG5vZGUgIT0gbnVsbCkgewogICAgICBpZiAoYnJhbmNoICE9IG51bGwpIHsKICAgICAgICBub3RpZnlQdXNoQnJhbmNoKGJyYW5jaCwgdmFsdWUpOwogICAgICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogICAgICAgIG5vdGlmeVBvcEJyYW5jaCgpOwogICAgICB9IGVsc2UgewogICAgICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICB2aXNpdExpc3QoTGlzdDxqcy5Ob2RlPiBub2RlTGlzdCkgewogICAgaWYgKG5vZGVMaXN0ICE9IG51bGwpIHsKICAgICAgZm9yIChqcy5Ob2RlIG5vZGUgaW4gbm9kZUxpc3QpIHsKICAgICAgICB2aXNpdChub2RlKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfaGFuZGxlRnVuY3Rpb24oanMuTm9kZSBub2RlLCBqcy5Ob2RlIGJvZHkpIHsKICAgIGJvb2wgYWN0aXZlQmVmb3JlID0gYWN0aXZlOwogICAgaWYgKCFhY3RpdmUpIHsKICAgICAgYWN0aXZlID0gcmVhZGVyLmdldFNvdXJjZUluZm9ybWF0aW9uKG5vZGUpICE9IG51bGw7CiAgICB9CiAgICBsZWZ0VG9SaWdodE9mZnNldCA9CiAgICAgICAgc3RhdGVtZW50T2Zmc2V0ID0gZ2V0U3ludGF4T2Zmc2V0KG5vZGUsIGtpbmQ6IENvZGVQb3NpdGlvbktpbmQuU1RBUlQpOwogICAgT2Zmc2V0IGVudHJ5T2Zmc2V0ID0gZ2V0T2Zmc2V0Rm9yTm9kZShub2RlLCBzdGF0ZW1lbnRPZmZzZXQpOwogICAgbm90aWZ5U3RlcChub2RlLCBlbnRyeU9mZnNldCwgU3RlcEtpbmQuRlVOX0VOVFJZKTsKCiAgICB2aXNpdChib2R5KTsKCiAgICBsZWZ0VG9SaWdodE9mZnNldCA9CiAgICAgICAgc3RhdGVtZW50T2Zmc2V0ID0gZ2V0U3ludGF4T2Zmc2V0KG5vZGUsIGtpbmQ6IENvZGVQb3NpdGlvbktpbmQuQ0xPU0lORyk7CiAgICBPZmZzZXQgZXhpdE9mZnNldCA9IGdldE9mZnNldEZvck5vZGUobm9kZSwgc3RhdGVtZW50T2Zmc2V0KTsKICAgIG5vdGlmeVN0ZXAobm9kZSwgZXhpdE9mZnNldCwgU3RlcEtpbmQuRlVOX0VYSVQpOwogICAgaWYgKGFjdGl2ZSAmJiAhYWN0aXZlQmVmb3JlKSB7CiAgICAgIGludCBlbmRQb3NpdGlvbiA9IGdldFN5bnRheE9mZnNldChub2RlLCBraW5kOiBDb2RlUG9zaXRpb25LaW5kLkVORCk7CiAgICAgIE9mZnNldCBlbmRPZmZzZXQgPSBnZXRPZmZzZXRGb3JOb2RlKG5vZGUsIGVuZFBvc2l0aW9uKTsKICAgICAgbm90aWZ5U3RlcChub2RlLCBlbmRPZmZzZXQsIFN0ZXBLaW5kLk5PX0lORk8pOwogICAgfQogICAgYWN0aXZlID0gYWN0aXZlQmVmb3JlOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW4oanMuRnVuIG5vZGUpIHsKICAgIF9oYW5kbGVGdW5jdGlvbihub2RlLCBub2RlLmJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXROYW1lZEZ1bmN0aW9uKGpzLk5hbWVkRnVuY3Rpb24gbm9kZSkgewogICAgX2hhbmRsZUZ1bmN0aW9uKG5vZGUsIG5vZGUuZnVuY3Rpb24uYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJsb2NrKGpzLkJsb2NrIG5vZGUpIHsKICAgIGZvciAoanMuU3RhdGVtZW50IHN0YXRlbWVudCBpbiBub2RlLnN0YXRlbWVudHMpIHsKICAgICAgdmlzaXQoc3RhdGVtZW50KTsKICAgIH0KICB9CgogIGludCBnZXRTeW50YXhPZmZzZXQoanMuTm9kZSBub2RlLAogICAgICB7Q29kZVBvc2l0aW9uS2luZCBraW5kOiBDb2RlUG9zaXRpb25LaW5kLlNUQVJUfSkgewogICAgQ29kZVBvc2l0aW9uIGNvZGVQb3NpdGlvbiA9IGNvZGVQb3NpdGlvbnNbbm9kZV07CiAgICBpZiAoY29kZVBvc2l0aW9uICE9IG51bGwpIHsKICAgICAgcmV0dXJuIGNvZGVQb3NpdGlvbi5nZXRQb3NpdGlvbihraW5kKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdmlzaXRTdWJleHByZXNzaW9uKAogICAgICBqcy5Ob2RlIHBhcmVudCwganMuRXhwcmVzc2lvbiBjaGlsZCwgaW50IGNvZGVPZmZzZXQsIFN0ZXBLaW5kIGtpbmQpIHsKICAgIHZhciBvbGRTdGVwcyA9IHN0ZXBzOwogICAgc3RlcHMgPSBbXTsKICAgIG9mZnNldFBvc2l0aW9uID0gY29kZU9mZnNldDsKICAgIHZpc2l0KGNoaWxkKTsKICAgIGlmIChzdGVwcy5pc0VtcHR5KSB7CiAgICAgIG5vdGlmeVN0ZXAocGFyZW50LCBnZXRPZmZzZXRGb3JOb2RlKHBhcmVudCwgb2Zmc2V0UG9zaXRpb24pLCBraW5kKTsKICAgICAgLy8gVGhlIFtvZmZzZXRQb3NpdGlvbl0gc2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUgZmlyc3Qgc3ViZXhwcmVzc2lvbi4KICAgICAgb2Zmc2V0UG9zaXRpb24gPSBudWxsOwogICAgfQogICAgc3RlcHMgPSBvbGRTdGVwczsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChqcy5FeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKICAgIHN0YXRlbWVudE9mZnNldCA9IGdldFN5bnRheE9mZnNldChub2RlKTsKICAgIHZpc2l0U3ViZXhwcmVzc2lvbigKICAgICAgICBub2RlLCBub2RlLmV4cHJlc3Npb24sIHN0YXRlbWVudE9mZnNldCwgU3RlcEtpbmQuRVhQUkVTU0lPTl9TVEFURU1FTlQpOwogICAgc3RhdGVtZW50T2Zmc2V0ID0gbnVsbDsKICAgIGxlZnRUb1JpZ2h0T2Zmc2V0ID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RW1wdHlTdGF0ZW1lbnQoanMuRW1wdHlTdGF0ZW1lbnQgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdmlzaXRDYWxsKGpzLkNhbGwgbm9kZSkgewogICAgdmlzaXQobm9kZS50YXJnZXQpOwogICAgaW50IG9sZFBvc2l0aW9uID0gb2Zmc2V0UG9zaXRpb247CiAgICBvZmZzZXRQb3NpdGlvbiA9IG51bGw7CiAgICB2aXNpdExpc3Qobm9kZS5hcmd1bWVudHMpOwogICAgb2Zmc2V0UG9zaXRpb24gPSBvbGRQb3NpdGlvbjsKICAgIENhbGxQb3NpdGlvbiBjYWxsUG9zaXRpb24gPSBDYWxsUG9zaXRpb24uZ2V0U2VtYW50aWNQb3NpdGlvbkZvckNhbGwobm9kZSk7CiAgICBqcy5Ob2RlIHBvc2l0aW9uTm9kZSA9IGNhbGxQb3NpdGlvbi5ub2RlOwogICAgaW50IGNhbGxPZmZzZXQgPQogICAgICAgIGdldFN5bnRheE9mZnNldChwb3NpdGlvbk5vZGUsIGtpbmQ6IGNhbGxQb3NpdGlvbi5jb2RlUG9zaXRpb25LaW5kKTsKICAgIGlmIChvZmZzZXRQb3NpdGlvbiA9PSBudWxsKSB7CiAgICAgIC8vIFVzZSB0aGUgY2FsbCBvZmZzZXQgaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IHN1YmV4cHJlc3Npb24uCiAgICAgIG9mZnNldFBvc2l0aW9uID0gY2FsbE9mZnNldDsKICAgIH0KICAgIE9mZnNldCBvZmZzZXQgPSBnZXRPZmZzZXRGb3JOb2RlKHBvc2l0aW9uTm9kZSwgb2Zmc2V0UG9zaXRpb24pOwogICAgbm90aWZ5U3RlcChub2RlLCBvZmZzZXQsIFN0ZXBLaW5kLkNBTEwpOwogICAgc3RlcHMuYWRkKG5vZGUpOwogICAgb2Zmc2V0UG9zaXRpb24gPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXROZXcoanMuTmV3IG5vZGUpIHsKICAgIHZpc2l0KG5vZGUudGFyZ2V0KTsKICAgIGludCBvbGRQb3NpdGlvbiA9IG9mZnNldFBvc2l0aW9uOwogICAgb2Zmc2V0UG9zaXRpb24gPSBudWxsOwogICAgdmlzaXRMaXN0KG5vZGUuYXJndW1lbnRzKTsKICAgIG9mZnNldFBvc2l0aW9uID0gb2xkUG9zaXRpb247CiAgICBpZiAob2Zmc2V0UG9zaXRpb24gPT0gbnVsbCkgewogICAgICAvLyBVc2UgdGhlIHN5bnRheCBvZmZzZXQgaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IHN1YmV4cHJlc3Npb24uCiAgICAgIG9mZnNldFBvc2l0aW9uID0gZ2V0U3ludGF4T2Zmc2V0KG5vZGUpOwogICAgfQogICAgbm90aWZ5U3RlcChub2RlLCBnZXRPZmZzZXRGb3JOb2RlKG5vZGUsIG9mZnNldFBvc2l0aW9uKSwgU3RlcEtpbmQuTkVXKTsKICAgIHN0ZXBzLmFkZChub2RlKTsKICAgIG9mZnNldFBvc2l0aW9uID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QWNjZXNzKGpzLlByb3BlcnR5QWNjZXNzIG5vZGUpIHsKICAgIHZpc2l0KG5vZGUucmVjZWl2ZXIpOwogICAgbm90aWZ5U3RlcCgKICAgICAgICBub2RlLAogICAgICAgIC8vIFRlY2huaWNhbGx5IHdlJ2QgbGlrZSB0byB1c2UgdGhlIG9mZnNldCBvZiB0aGUgYC5gIGluIHRoZSBwcm9wZXJ0eQogICAgICAgIC8vIGFjY2VzcywgYnV0IHRoZSBqc19hc3QgZG9lc24ndCBleHBvc2UgaXQuIFNpbmNlIHRoaXMgaXMgb25seSB1c2VkIHRvCiAgICAgICAgLy8gc2VhcmNoIGJhY2t3YXJkcyBmb3IgaW5saW5lZCBmcmFtZXMsIHdlIHVzZSB0aGUgcmVjZWl2ZXIncyBFTkQgb2Zmc2V0CiAgICAgICAgLy8gaW5zdGVhZCBhcyBhbiBhcHByb3hpbWF0aW9uLiBOb3RlIHRoYXQgdGhlIEVORCBvZmZzZXQgcG9pbnRzIG9uZQogICAgICAgIC8vIGNoYXJhY3RlciBhZnRlciB0aGUgZW5kIG9mIHRoZSBub2RlLCBzbyBpdCBpcyBsaWtlbHkgYWx3YXlzIHRoZQogICAgICAgIC8vIG9mZnNldCB3ZSB3YW50LgogICAgICAgIGdldE9mZnNldEZvck5vZGUoCiAgICAgICAgICAgIG5vZGUsIGdldFN5bnRheE9mZnNldChub2RlLnJlY2VpdmVyLCBraW5kOiBDb2RlUG9zaXRpb25LaW5kLkVORCkpLAogICAgICAgIFN0ZXBLaW5kLkFDQ0VTUyk7CiAgICBzdGVwcy5hZGQobm9kZSk7CiAgICB2aXNpdChub2RlLnNlbGVjdG9yKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VmFyaWFibGVVc2UoanMuVmFyaWFibGVVc2Ugbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdmlzaXRMaXRlcmFsQm9vbChqcy5MaXRlcmFsQm9vbCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2aXNpdExpdGVyYWxTdHJpbmcoanMuTGl0ZXJhbFN0cmluZyBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2aXNpdExpdGVyYWxOdW1iZXIoanMuTGl0ZXJhbE51bWJlciBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2aXNpdExpdGVyYWxOdWxsKGpzLkxpdGVyYWxOdWxsIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIHZpc2l0TmFtZShqcy5OYW1lIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoanMuVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qgbm9kZSkgewogICAgdmlzaXRMaXN0KG5vZGUuZGVjbGFyYXRpb25zKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihqcy5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIHZpc2l0VmFyaWFibGVJbml0aWFsaXphdGlvbihqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uIG5vZGUpIHsKICAgIHZpc2l0KG5vZGUubGVmdEhhbmRTaWRlKTsKICAgIHZpc2l0KG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRBc3NpZ25tZW50KGpzLkFzc2lnbm1lbnQgbm9kZSkgewogICAgdmlzaXQobm9kZS5sZWZ0SGFuZFNpZGUpOwogICAgdmlzaXQobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdElmKGpzLklmIG5vZGUpIHsKICAgIHN0YXRlbWVudE9mZnNldCA9IGdldFN5bnRheE9mZnNldChub2RlKTsKICAgIHZpc2l0U3ViZXhwcmVzc2lvbigKICAgICAgICBub2RlLCBub2RlLmNvbmRpdGlvbiwgc3RhdGVtZW50T2Zmc2V0LCBTdGVwS2luZC5JRl9DT05ESVRJT04pOwogICAgc3RhdGVtZW50T2Zmc2V0ID0gbnVsbDsKICAgIHZpc2l0KG5vZGUudGhlbiwgQnJhbmNoS2luZC5DT05ESVRJT04sIHRydWUpOwogICAgdmlzaXQobm9kZS5vdGhlcndpc2UsIEJyYW5jaEtpbmQuQ09ORElUSU9OLCBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZvcihqcy5Gb3Igbm9kZSkgewogICAgaW50IG9mZnNldCA9IHN0YXRlbWVudE9mZnNldCA9IGdldFN5bnRheE9mZnNldChub2RlKTsKICAgIHN0YXRlbWVudE9mZnNldCA9IG9mZnNldDsKICAgIGxlZnRUb1JpZ2h0T2Zmc2V0ID0gbnVsbDsKICAgIGlmIChub2RlLmluaXQgIT0gbnVsbCkgewogICAgICB2aXNpdFN1YmV4cHJlc3Npb24oCiAgICAgICAgICBub2RlLCBub2RlLmluaXQsIGdldFN5bnRheE9mZnNldChub2RlKSwgU3RlcEtpbmQuRk9SX0lOSVRJQUxJWkVSKTsKICAgIH0KCiAgICBpZiAobm9kZS5jb25kaXRpb24gIT0gbnVsbCkgewogICAgICB2aXNpdFN1YmV4cHJlc3Npb24obm9kZSwgbm9kZS5jb25kaXRpb24sIGdldFN5bnRheE9mZnNldChub2RlLmNvbmRpdGlvbiksCiAgICAgICAgICBTdGVwS2luZC5GT1JfQ09ORElUSU9OKTsKICAgIH0KCiAgICBub3RpZnlQdXNoQnJhbmNoKEJyYW5jaEtpbmQuTE9PUCk7CiAgICB2aXNpdChub2RlLmJvZHkpOwoKICAgIHN0YXRlbWVudE9mZnNldCA9IG9mZnNldDsKICAgIGlmIChub2RlLnVwZGF0ZSAhPSBudWxsKSB7CiAgICAgIHZpc2l0U3ViZXhwcmVzc2lvbigKICAgICAgICAgIG5vZGUsIG5vZGUudXBkYXRlLCBnZXRTeW50YXhPZmZzZXQobm9kZS51cGRhdGUpLCBTdGVwS2luZC5GT1JfVVBEQVRFKTsKICAgIH0KCiAgICBub3RpZnlQb3BCcmFuY2goKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0V2hpbGUoanMuV2hpbGUgbm9kZSkgewogICAgc3RhdGVtZW50T2Zmc2V0ID0gZ2V0U3ludGF4T2Zmc2V0KG5vZGUpOwogICAgaWYgKG5vZGUuY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgdmlzaXRTdWJleHByZXNzaW9uKG5vZGUsIG5vZGUuY29uZGl0aW9uLCBnZXRTeW50YXhPZmZzZXQobm9kZSksCiAgICAgICAgICBTdGVwS2luZC5XSElMRV9DT05ESVRJT04pOwogICAgfQogICAgc3RhdGVtZW50T2Zmc2V0ID0gbnVsbDsKICAgIGxlZnRUb1JpZ2h0T2Zmc2V0ID0gbnVsbDsKCiAgICB2aXNpdChub2RlLmJvZHksIEJyYW5jaEtpbmQuTE9PUCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdERvKGpzLkRvIG5vZGUpIHsKICAgIHN0YXRlbWVudE9mZnNldCA9IGdldFN5bnRheE9mZnNldChub2RlKTsKICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgICBpZiAobm9kZS5jb25kaXRpb24gIT0gbnVsbCkgewogICAgICB2aXNpdFN1YmV4cHJlc3Npb24obm9kZSwgbm9kZS5jb25kaXRpb24sIGdldFN5bnRheE9mZnNldChub2RlLmNvbmRpdGlvbiksCiAgICAgICAgICBTdGVwS2luZC5ET19DT05ESVRJT04pOwogICAgfQogICAgc3RhdGVtZW50T2Zmc2V0ID0gbnVsbDsKICAgIGxlZnRUb1JpZ2h0T2Zmc2V0ID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QmluYXJ5KGpzLkJpbmFyeSBub2RlKSB7CiAgICB2aXNpdChub2RlLmxlZnQpOwogICAgdmlzaXQobm9kZS5yaWdodCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFRoaXMoanMuVGhpcyBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2aXNpdFJldHVybihqcy5SZXR1cm4gbm9kZSkgewogICAgc3RhdGVtZW50T2Zmc2V0ID0gZ2V0U3ludGF4T2Zmc2V0KG5vZGUpOwogICAgdmlzaXQobm9kZS52YWx1ZSk7CiAgICBub3RpZnlTdGVwKAogICAgICAgIG5vZGUsIGdldE9mZnNldEZvck5vZGUobm9kZSwgZ2V0U3ludGF4T2Zmc2V0KG5vZGUpKSwgU3RlcEtpbmQuUkVUVVJOKTsKICAgIE9mZnNldCBleGl0T2Zmc2V0ID0gZ2V0T2Zmc2V0Rm9yTm9kZSgKICAgICAgICBub2RlLCBnZXRTeW50YXhPZmZzZXQobm9kZSwga2luZDogQ29kZVBvc2l0aW9uS2luZC5DTE9TSU5HKSk7CiAgICBub3RpZnlTdGVwKG5vZGUsIGV4aXRPZmZzZXQsIFN0ZXBLaW5kLkZVTl9FWElUKTsKICAgIHN0YXRlbWVudE9mZnNldCA9IG51bGw7CiAgICBsZWZ0VG9SaWdodE9mZnNldCA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFRocm93KGpzLlRocm93IG5vZGUpIHsKICAgIHN0YXRlbWVudE9mZnNldCA9IGdldFN5bnRheE9mZnNldChub2RlKTsKICAgIC8vIERvIG5vdCB1c2UgW29mZnNldFBvc2l0aW9uXSBmb3IgdGhlIHN1YmV4cHJlc3Npb24uCiAgICBvZmZzZXRQb3NpdGlvbiA9IG51bGw7CiAgICB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogICAgbm90aWZ5U3RlcCgKICAgICAgICBub2RlLCBnZXRPZmZzZXRGb3JOb2RlKG5vZGUsIGdldFN5bnRheE9mZnNldChub2RlKSksIFN0ZXBLaW5kLlRIUk9XKTsKICAgIHN0YXRlbWVudE9mZnNldCA9IG51bGw7CiAgICBsZWZ0VG9SaWdodE9mZnNldCA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbnRpbnVlKGpzLkNvbnRpbnVlIG5vZGUpIHsKICAgIHN0YXRlbWVudE9mZnNldCA9IGdldFN5bnRheE9mZnNldChub2RlKTsKICAgIG5vdGlmeVN0ZXAoCiAgICAgICAgbm9kZSwgZ2V0T2Zmc2V0Rm9yTm9kZShub2RlLCBnZXRTeW50YXhPZmZzZXQobm9kZSkpLCBTdGVwS2luZC5DT05USU5VRSk7CiAgICBzdGF0ZW1lbnRPZmZzZXQgPSBudWxsOwogICAgbGVmdFRvUmlnaHRPZmZzZXQgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRCcmVhayhqcy5CcmVhayBub2RlKSB7CiAgICBzdGF0ZW1lbnRPZmZzZXQgPSBnZXRTeW50YXhPZmZzZXQobm9kZSk7CiAgICBub3RpZnlTdGVwKAogICAgICAgIG5vZGUsIGdldE9mZnNldEZvck5vZGUobm9kZSwgZ2V0U3ludGF4T2Zmc2V0KG5vZGUpKSwgU3RlcEtpbmQuQlJFQUspOwogICAgc3RhdGVtZW50T2Zmc2V0ID0gbnVsbDsKICAgIGxlZnRUb1JpZ2h0T2Zmc2V0ID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHJ5KGpzLlRyeSBub2RlKSB7CiAgICB2aXNpdChub2RlLmJvZHkpOwogICAgdmlzaXQobm9kZS5jYXRjaFBhcnQsIEJyYW5jaEtpbmQuQ0FUQ0gpOwogICAgdmlzaXQobm9kZS5maW5hbGx5UGFydCwgQnJhbmNoS2luZC5GSU5BTExZKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2F0Y2goanMuQ2F0Y2ggbm9kZSkgewogICAgdmlzaXQobm9kZS5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q29uZGl0aW9uYWwoanMuQ29uZGl0aW9uYWwgbm9kZSkgewogICAgdmlzaXQobm9kZS5jb25kaXRpb24pOwogICAgdmlzaXQobm9kZS50aGVuLCBCcmFuY2hLaW5kLkNPTkRJVElPTiwgdHJ1ZSk7CiAgICB2aXNpdChub2RlLm90aGVyd2lzZSwgQnJhbmNoS2luZC5DT05ESVRJT04sIGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0UHJlZml4KGpzLlByZWZpeCBub2RlKSB7CiAgICB2aXNpdChub2RlLmFyZ3VtZW50KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0UG9zdGZpeChqcy5Qb3N0Zml4IG5vZGUpIHsKICAgIHZpc2l0KG5vZGUuYXJndW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRPYmplY3RJbml0aWFsaXplcihqcy5PYmplY3RJbml0aWFsaXplciBub2RlKSB7CiAgICB2aXNpdExpc3Qobm9kZS5wcm9wZXJ0aWVzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0UHJvcGVydHkoanMuUHJvcGVydHkgbm9kZSkgewogICAgdmlzaXQobm9kZS5uYW1lKTsKICAgIHZpc2l0KG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRSZWdFeHBMaXRlcmFsKGpzLlJlZ0V4cExpdGVyYWwgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdmlzaXRTd2l0Y2goanMuU3dpdGNoIG5vZGUpIHsKICAgIHN0YXRlbWVudE9mZnNldCA9IGdldFN5bnRheE9mZnNldChub2RlKTsKICAgIHZpc2l0U3ViZXhwcmVzc2lvbigKICAgICAgICBub2RlLCBub2RlLmtleSwgZ2V0U3ludGF4T2Zmc2V0KG5vZGUpLCBTdGVwS2luZC5TV0lUQ0hfRVhQUkVTU0lPTik7CiAgICBzdGF0ZW1lbnRPZmZzZXQgPSBudWxsOwogICAgbGVmdFRvUmlnaHRPZmZzZXQgPSBudWxsOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmNhc2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZpc2l0KG5vZGUuY2FzZXNbaV0sIEJyYW5jaEtpbmQuQ0FTRSwgaSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENhc2UoanMuQ2FzZSBub2RlKSB7CiAgICB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogICAgdmlzaXQobm9kZS5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RGVmYXVsdChqcy5EZWZhdWx0IG5vZGUpIHsKICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEFycmF5SW5pdGlhbGl6ZXIoanMuQXJyYXlJbml0aWFsaXplciBub2RlKSB7CiAgICB2aXNpdExpc3Qobm9kZS5lbGVtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEFycmF5SG9sZShqcy5BcnJheUhvbGUgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdmlzaXRMYWJlbGVkU3RhdGVtZW50KGpzLkxhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgc3RhdGVtZW50T2Zmc2V0ID0gZ2V0U3ludGF4T2Zmc2V0KG5vZGUpOwogICAgdmlzaXQobm9kZS5ib2R5KTsKICAgIHN0YXRlbWVudE9mZnNldCA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdERlZmVycmVkRXhwcmVzc2lvbihqcy5EZWZlcnJlZEV4cHJlc3Npb24gbm9kZSkgewogICAgdmlzaXQobm9kZS52YWx1ZSk7CiAgfQoKICBPZmZzZXQgZ2V0T2Zmc2V0Rm9yTm9kZShqcy5Ob2RlIG5vZGUsIGludCBjb2RlT2Zmc2V0KSB7CiAgICBpZiAoY29kZU9mZnNldCA9PSBudWxsKSB7CiAgICAgIENvZGVQb3NpdGlvbiBjb2RlUG9zaXRpb24gPSBjb2RlUG9zaXRpb25zW25vZGVdOwogICAgICBpZiAoY29kZVBvc2l0aW9uICE9IG51bGwpIHsKICAgICAgICBjb2RlT2Zmc2V0ID0gY29kZVBvc2l0aW9uLnN0YXJ0UG9zaXRpb247CiAgICAgIH0KICAgIH0KICAgIGlmIChsZWZ0VG9SaWdodE9mZnNldCAhPSBudWxsICYmCiAgICAgICAgY29kZU9mZnNldCAhPSBudWxsICYmCiAgICAgICAgbGVmdFRvUmlnaHRPZmZzZXQgPCBjb2RlT2Zmc2V0KSB7CiAgICAgIGxlZnRUb1JpZ2h0T2Zmc2V0ID0gY29kZU9mZnNldDsKICAgIH0KICAgIGlmIChsZWZ0VG9SaWdodE9mZnNldCA9PSBudWxsKSB7CiAgICAgIGxlZnRUb1JpZ2h0T2Zmc2V0ID0gc3RhdGVtZW50T2Zmc2V0OwogICAgfQogICAgcmV0dXJuIG5ldyBPZmZzZXQoc3RhdGVtZW50T2Zmc2V0LCBsZWZ0VG9SaWdodE9mZnNldCwgY29kZU9mZnNldCk7CiAgfQp9CgpjbGFzcyBDb3ZlcmFnZSB7CiAgU2V0PGpzLk5vZGU+IF9ub2Rlc1dpdGhJbmZvID0gbmV3IFNldDxqcy5Ob2RlPigpOwogIGludCBfbm9kZXNXaXRoSW5mb0NvdW50ID0gMDsKICBTZXQ8anMuTm9kZT4gX25vZGVzV2l0aG91dEluZm8gPSBuZXcgU2V0PGpzLk5vZGU+KCk7CiAgaW50IF9ub2Rlc1dpdGhvdXRJbmZvQ291bnQgPSAwOwogIE1hcDxUeXBlLCBpbnQ+IF9ub2Rlc1dpdGhvdXRJbmZvQ291bnRCeVR5cGUgPSA8VHlwZSwgaW50Pnt9OwogIFNldDxqcy5Ob2RlPiBfbm9kZXNXaXRob3V0T2Zmc2V0ID0gbmV3IFNldDxqcy5Ob2RlPigpOwogIGludCBfbm9kZXNXaXRob3V0T2Zmc2V0Q291bnQgPSAwOwoKICB2b2lkIHJlZ2lzdGVyTm9kZVdpdGhJbmZvKGpzLk5vZGUgbm9kZSkgewogICAgX25vZGVzV2l0aEluZm8uYWRkKG5vZGUpOwogIH0KCiAgdm9pZCByZWdpc3Rlck5vZGVXaXRob3V0SW5mbyhqcy5Ob2RlIG5vZGUpIHsKICAgIF9ub2Rlc1dpdGhvdXRJbmZvLmFkZChub2RlKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJOb2Rlc1dpdGhvdXRPZmZzZXQoanMuTm9kZSBub2RlKSB7CiAgICBfbm9kZXNXaXRob3V0T2Zmc2V0LmFkZChub2RlKTsKICB9CgogIHZvaWQgY29sbGFwc2UoKSB7CiAgICBfbm9kZXNXaXRoSW5mb0NvdW50ICs9IF9ub2Rlc1dpdGhJbmZvLmxlbmd0aDsKICAgIF9ub2Rlc1dpdGhJbmZvLmNsZWFyKCk7CiAgICBfbm9kZXNXaXRob3V0T2Zmc2V0Q291bnQgKz0gX25vZGVzV2l0aG91dE9mZnNldC5sZW5ndGg7CiAgICBfbm9kZXNXaXRob3V0T2Zmc2V0LmNsZWFyKCk7CgogICAgX25vZGVzV2l0aG91dEluZm9Db3VudCArPSBfbm9kZXNXaXRob3V0SW5mby5sZW5ndGg7CiAgICBmb3IgKGpzLk5vZGUgbm9kZSBpbiBfbm9kZXNXaXRob3V0SW5mbykgewogICAgICBpZiAobm9kZSBpcyBqcy5FeHByZXNzaW9uU3RhdGVtZW50KSB7CiAgICAgICAgX25vZGVzV2l0aG91dEluZm9Db3VudEJ5VHlwZS5wdXRJZkFic2VudCgKICAgICAgICAgICAgbm9kZS5leHByZXNzaW9uLnJ1bnRpbWVUeXBlLCAoKSA9PiAwKTsKICAgICAgICBfbm9kZXNXaXRob3V0SW5mb0NvdW50QnlUeXBlW25vZGUuZXhwcmVzc2lvbi5ydW50aW1lVHlwZV0rKzsKICAgICAgfSBlbHNlIHsKICAgICAgICBfbm9kZXNXaXRob3V0SW5mb0NvdW50QnlUeXBlLnB1dElmQWJzZW50KG5vZGUucnVudGltZVR5cGUsICgpID0+IDApOwogICAgICAgIF9ub2Rlc1dpdGhvdXRJbmZvQ291bnRCeVR5cGVbbm9kZS5ydW50aW1lVHlwZV0rKzsKICAgICAgfQogICAgfQogICAgX25vZGVzV2l0aG91dEluZm8uY2xlYXIoKTsKICB9CgogIFN0cmluZyBnZXRDb3ZlcmFnZVJlcG9ydCgpIHsKICAgIGNvbGxhcHNlKCk7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBpbnQgdG90YWwgPSBfbm9kZXNXaXRoSW5mb0NvdW50ICsgX25vZGVzV2l0aG91dEluZm9Db3VudDsKICAgIGlmICh0b3RhbCA+IDApIHsKICAgICAgc2Iud3JpdGUoX25vZGVzV2l0aEluZm9Db3VudCk7CiAgICAgIHNiLndyaXRlKCcvJyk7CiAgICAgIHNiLndyaXRlKHRvdGFsKTsKICAgICAgc2Iud3JpdGUoJyAoJyk7CiAgICAgIHNiLndyaXRlKCgxMDAuMCAqIF9ub2Rlc1dpdGhJbmZvQ291bnQgLyB0b3RhbCkudG9TdHJpbmdBc0ZpeGVkKDIpKTsKICAgICAgc2Iud3JpdGUoJyUpIG5vZGVzIHdpdGggaW5mby4nKTsKICAgIH0gZWxzZSB7CiAgICAgIHNiLndyaXRlKCdObyBub2Rlcy4nKTsKICAgIH0KICAgIGlmIChfbm9kZXNXaXRob3V0T2Zmc2V0Q291bnQgPiAwKSB7CiAgICAgIHNiLndyaXRlKCcgJyk7CiAgICAgIHNiLndyaXRlKF9ub2Rlc1dpdGhvdXRPZmZzZXRDb3VudCk7CiAgICAgIHNiLndyaXRlKCcgbm9kZScpOwogICAgICBpZiAoX25vZGVzV2l0aG91dE9mZnNldENvdW50ID4gMSkgewogICAgICAgIHNiLndyaXRlKCdzJyk7CiAgICAgIH0KICAgICAgc2Iud3JpdGUoJyB3aXRob3V0IG9mZnNldC4nKTsKICAgIH0KICAgIGlmIChfbm9kZXNXaXRob3V0SW5mb0NvdW50ID4gMCkgewogICAgICBzYi53cml0ZSgnXG5Ob2RlcyB3aXRob3V0IGluZm8gKCcpOwogICAgICBzYi53cml0ZShfbm9kZXNXaXRob3V0SW5mb0NvdW50KTsKICAgICAgc2Iud3JpdGUoJykgYnkgcnVudGltZSB0eXBlOicpOwogICAgICBMaXN0PFR5cGU+IHR5cGVzID0gX25vZGVzV2l0aG91dEluZm9Db3VudEJ5VHlwZS5rZXlzLnRvTGlzdCgpOwogICAgICB0eXBlcy5zb3J0KChhLCBiKSB7CiAgICAgICAgcmV0dXJuIC1fbm9kZXNXaXRob3V0SW5mb0NvdW50QnlUeXBlW2FdCiAgICAgICAgICAgIC5jb21wYXJlVG8oX25vZGVzV2l0aG91dEluZm9Db3VudEJ5VHlwZVtiXSk7CiAgICAgIH0pOwoKICAgICAgdHlwZXMuZm9yRWFjaCgoVHlwZSB0eXBlKSB7CiAgICAgICAgaW50IGNvdW50ID0gX25vZGVzV2l0aG91dEluZm9Db3VudEJ5VHlwZVt0eXBlXTsKICAgICAgICBzYi53cml0ZSgnXG4gJyk7CiAgICAgICAgc2Iud3JpdGUoY291bnQpOwogICAgICAgIHNiLndyaXRlKCcgJyk7CiAgICAgICAgc2Iud3JpdGUodHlwZSk7CiAgICAgICAgc2Iud3JpdGUoJyBub2RlJyk7CiAgICAgICAgaWYgKGNvdW50ID4gMSkgewogICAgICAgICAgc2Iud3JpdGUoJ3MnKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBzYi53cml0ZSgnXG4nKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gZ2V0Q292ZXJhZ2VSZXBvcnQoKTsKfQoKLy8vIFtUcmFjZUxpc3RlbmVyXSB0aGF0IHJlZ2lzdGVycyBbb25TdGVwXSBjYWxsYmFja3Mgd2l0aCBbY292ZXJhZ2VdLgpjbGFzcyBDb3ZlcmFnZUxpc3RlbmVyIGV4dGVuZHMgVHJhY2VMaXN0ZW5lciB3aXRoIE5vZGVUb1NvdXJjZUluZm9ybWF0aW9uTWl4aW4gewogIGZpbmFsIENvdmVyYWdlIGNvdmVyYWdlOwogIEBvdmVycmlkZQogIGZpbmFsIFNvdXJjZUluZm9ybWF0aW9uUmVhZGVyIHJlYWRlcjsKCiAgQ292ZXJhZ2VMaXN0ZW5lcih0aGlzLmNvdmVyYWdlLCB0aGlzLnJlYWRlcik7CgogIEBvdmVycmlkZQogIHZvaWQgb25TdGVwKGpzLk5vZGUgbm9kZSwgT2Zmc2V0IG9mZnNldCwgU3RlcEtpbmQga2luZCkgewogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPSBjb21wdXRlU291cmNlSW5mb3JtYXRpb24obm9kZSk7CiAgICBpZiAoc291cmNlSW5mb3JtYXRpb24gIT0gbnVsbCkgewogICAgICBjb3ZlcmFnZS5yZWdpc3Rlck5vZGVXaXRoSW5mbyhub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvdmVyYWdlLnJlZ2lzdGVyTm9kZVdpdGhvdXRJbmZvKG5vZGUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBvbkVuZChqcy5Ob2RlIG5vZGUpIHsKICAgIGNvdmVyYWdlLmNvbGxhcHNlKCk7CiAgfQp9CgovLy8gW0NvZGVQb3NpdGlvbk1hcF0gdGhhdCByZWdpc3RlcnMgY2FsbHMgd2l0aCBbQ292ZXJhZ2VdLgpjbGFzcyBDb2RlUG9zaXRpb25Db3ZlcmFnZSBpbXBsZW1lbnRzIENvZGVQb3NpdGlvbk1hcCB7CiAgZmluYWwgQ29kZVBvc2l0aW9uTWFwIGNvZGVQb3NpdGlvbnM7CiAgZmluYWwgQ292ZXJhZ2UgY292ZXJhZ2U7CgogIENvZGVQb3NpdGlvbkNvdmVyYWdlKHRoaXMuY29kZVBvc2l0aW9ucywgdGhpcy5jb3ZlcmFnZSk7CgogIEBvdmVycmlkZQogIENvZGVQb3NpdGlvbiBvcGVyYXRvciBbXShqcy5Ob2RlIG5vZGUpIHsKICAgIENvZGVQb3NpdGlvbiBjb2RlUG9zaXRpb24gPSBjb2RlUG9zaXRpb25zW25vZGVdOwogICAgaWYgKGNvZGVQb3NpdGlvbiA9PSBudWxsKSB7CiAgICAgIGNvdmVyYWdlLnJlZ2lzdGVyTm9kZXNXaXRob3V0T2Zmc2V0KG5vZGUpOwogICAgfQogICAgcmV0dXJuIGNvZGVQb3NpdGlvbjsKICB9Cn0KhbwATk48AU9GAS0BGR4eJy4cMyIBTAo8MgEMJgEMJgEMLAEdRQFMF0Y6Rjo6NxwVKjgEATAVFhcrQxYX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c2hvdyBOYW1lczsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9pbmRleGVkLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jbGFzc19zZXQuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeU5vZGVzTWFwS2V5OwppbXBvcnQgJ2Nsb3N1cmUuZGFydCc7Cgpjb25zdCBTdHJpbmcganNFbGVtZW50UHJlZml4ID0gJ2o6JzsKCmNsYXNzIEpMaWJyYXJ5IGV4dGVuZHMgSW5kZXhlZExpYnJhcnkgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSkxpYnJhcnldIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnbGlicmFyeSc7CgogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lOwogIEBvdmVycmlkZQogIGZpbmFsIFVyaSBjYW5vbmljYWxVcmk7CgogIEpMaWJyYXJ5KHRoaXMubmFtZSwgdGhpcy5jYW5vbmljYWxVcmkpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0pMaWJyYXJ5XSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IEpMaWJyYXJ5LnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICBVcmkgY2Fub25pY2FsVXJpID0gc291cmNlLnJlYWRVcmkoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSkxpYnJhcnkobmFtZSwgY2Fub25pY2FsVXJpKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0pMaWJyYXJ5XSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZVN0cmluZyhuYW1lKTsKICAgIHNpbmsud3JpdGVVcmkoY2Fub25pY2FsVXJpKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtqc0VsZW1lbnRQcmVmaXh9bGlicmFyeSgkbmFtZSknOwp9CgovLy8gRW51bSB1c2VkIGZvciBpZGVudGlmeWluZyBbSkNsYXNzXSBzdWJjbGFzc2VzIGluIHNlcmlhbGl6YXRpb24uCmVudW0gSkNsYXNzS2luZCB7IG5vZGUsIGNsb3N1cmUsIHJlY29yZCB9CgpjbGFzcyBKQ2xhc3MgZXh0ZW5kcyBJbmRleGVkQ2xhc3Mgd2l0aCBDbGFzc0hpZXJhcmNoeU5vZGVzTWFwS2V5IHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pDbGFzc10gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjbGFzcyc7CgogIEBvdmVycmlkZQogIGZpbmFsIEpMaWJyYXJ5IGxpYnJhcnk7CgogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lOwogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgaXNBYnN0cmFjdDsKCiAgSkNsYXNzKHRoaXMubGlicmFyeSwgdGhpcy5uYW1lLCB7dGhpcy5pc0Fic3RyYWN0fSk7CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbSkNsYXNzXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IEpDbGFzcy5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIEpDbGFzc0tpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShKQ2xhc3NLaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBKQ2xhc3NLaW5kLm5vZGU6CiAgICAgICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICAgICAgSkxpYnJhcnkgbGlicmFyeSA9IHNvdXJjZS5yZWFkTGlicmFyeSgpOwogICAgICAgIFN0cmluZyBuYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgICBib29sIGlzQWJzdHJhY3QgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgICAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICAgICAgcmV0dXJuIG5ldyBKQ2xhc3MobGlicmFyeSwgbmFtZSwgaXNBYnN0cmFjdDogaXNBYnN0cmFjdCk7CiAgICAgIGNhc2UgSkNsYXNzS2luZC5jbG9zdXJlOgogICAgICAgIHJldHVybiBuZXcgSkNsb3N1cmVDbGFzcy5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKQ2xhc3NLaW5kLnJlY29yZDoKICAgICAgICByZXR1cm4gbmV3IEpSZWNvcmQucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBDbGFzc0tpbmQgJGtpbmQiKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0pDbGFzc10gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpDbGFzc0tpbmQubm9kZSk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTGlicmFyeShsaWJyYXJ5KTsKICAgIHNpbmsud3JpdGVTdHJpbmcobmFtZSk7CiAgICBzaW5rLndyaXRlQm9vbChpc0Fic3RyYWN0KTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Nsb3N1cmUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICcke2pzRWxlbWVudFByZWZpeH1jbGFzcygkbmFtZSknOwp9CgpjbGFzcyBKVHlwZWRlZiBleHRlbmRzIEluZGV4ZWRUeXBlZGVmIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pUeXBlZGVmXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ3R5cGVkZWYnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBKTGlicmFyeSBsaWJyYXJ5OwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgSlR5cGVkZWYodGhpcy5saWJyYXJ5LCB0aGlzLm5hbWUpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0pUeXBlZGVmXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IEpUeXBlZGVmLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBKTGlicmFyeSBsaWJyYXJ5ID0gc291cmNlLnJlYWRMaWJyYXJ5KCk7CiAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpUeXBlZGVmKGxpYnJhcnksIG5hbWUpOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbSlR5cGVkZWZdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTGlicmFyeShsaWJyYXJ5KTsKICAgIHNpbmsud3JpdGVTdHJpbmcobmFtZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7anNFbGVtZW50UHJlZml4fXR5cGVkZWYoJG5hbWUpJzsKfQoKLy8vIEVudW0gdXNlZCBmb3IgaWRlbnRpZnlpbmcgW0pNZW1iZXJdIHN1YmNsYXNzZXMgaW4gc2VyaWFsaXphdGlvbi4KZW51bSBKTWVtYmVyS2luZCB7CiAgZ2VuZXJhdGl2ZUNvbnN0cnVjdG9yLAogIGZhY3RvcnlDb25zdHJ1Y3RvciwKICBjb25zdHJ1Y3RvckJvZHksCiAgZmllbGQsCiAgZ2V0dGVyLAogIHNldHRlciwKICBtZXRob2QsCiAgY2xvc3VyZUZpZWxkLAogIGNsb3N1cmVDYWxsTWV0aG9kLAogIGdlbmVyYXRvckJvZHksCiAgc2lnbmF0dXJlTWV0aG9kLAogIHJlY29yZEZpZWxkLAp9CgphYnN0cmFjdCBjbGFzcyBKTWVtYmVyIGV4dGVuZHMgSW5kZXhlZE1lbWJlciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgSkxpYnJhcnkgbGlicmFyeTsKICBAb3ZlcnJpZGUKICBmaW5hbCBKQ2xhc3MgZW5jbG9zaW5nQ2xhc3M7CiAgZmluYWwgTmFtZSBfbmFtZTsKICBmaW5hbCBib29sIF9pc1N0YXRpYzsKCiAgSk1lbWJlcih0aGlzLmxpYnJhcnksIHRoaXMuZW5jbG9zaW5nQ2xhc3MsIHRoaXMuX25hbWUsIHtib29sIGlzU3RhdGljOiBmYWxzZX0pCiAgICAgIDogX2lzU3RhdGljID0gaXNTdGF0aWM7CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbSk1lbWJlcl0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBKTWVtYmVyLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgSk1lbWJlcktpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShKTWVtYmVyS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgSk1lbWJlcktpbmQuZ2VuZXJhdGl2ZUNvbnN0cnVjdG9yOgogICAgICAgIHJldHVybiBuZXcgSkdlbmVyYXRpdmVDb25zdHJ1Y3Rvci5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKTWVtYmVyS2luZC5mYWN0b3J5Q29uc3RydWN0b3I6CiAgICAgICAgcmV0dXJuIG5ldyBKRmFjdG9yeUNvbnN0cnVjdG9yLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIEpNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keToKICAgICAgICByZXR1cm4gbmV3IEpDb25zdHJ1Y3RvckJvZHkucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSk1lbWJlcktpbmQuZmllbGQ6CiAgICAgICAgcmV0dXJuIG5ldyBKRmllbGQucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSk1lbWJlcktpbmQuZ2V0dGVyOgogICAgICAgIHJldHVybiBuZXcgSkdldHRlci5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKTWVtYmVyS2luZC5zZXR0ZXI6CiAgICAgICAgcmV0dXJuIG5ldyBKU2V0dGVyLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIEpNZW1iZXJLaW5kLm1ldGhvZDoKICAgICAgICByZXR1cm4gbmV3IEpNZXRob2QucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSk1lbWJlcktpbmQuY2xvc3VyZUZpZWxkOgogICAgICAgIHJldHVybiBuZXcgSkNsb3N1cmVGaWVsZC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKTWVtYmVyS2luZC5jbG9zdXJlQ2FsbE1ldGhvZDoKICAgICAgICByZXR1cm4gbmV3IEpDbG9zdXJlQ2FsbE1ldGhvZC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKTWVtYmVyS2luZC5nZW5lcmF0b3JCb2R5OgogICAgICAgIHJldHVybiBuZXcgSkdlbmVyYXRvckJvZHkucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSk1lbWJlcktpbmQuc2lnbmF0dXJlTWV0aG9kOgogICAgICAgIHJldHVybiBuZXcgSlNpZ25hdHVyZU1ldGhvZC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKTWVtYmVyS2luZC5yZWNvcmRGaWVsZDoKICAgICAgICByZXR1cm4gbmV3IEpSZWNvcmRGaWVsZC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIEpNZW1iZXJLaW5kICRraW5kIik7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtKTWVtYmVyXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiBfbmFtZS50ZXh0OwoKICBAb3ZlcnJpZGUKICBOYW1lIGdldCBtZW1iZXJOYW1lID0+IF9uYW1lOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Fzc2lnbmFibGUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ29uc3QgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQWJzdHJhY3QgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU2V0dGVyID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0dldHRlciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNGdW5jdGlvbiA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNGaWVsZCA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDb25zdHJ1Y3RvciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNJbnN0YW5jZU1lbWJlciA9PiBlbmNsb3NpbmdDbGFzcyAhPSBudWxsICYmICFfaXNTdGF0aWM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3RhdGljID0+IGVuY2xvc2luZ0NsYXNzICE9IG51bGwgJiYgX2lzU3RhdGljOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1RvcExldmVsID0+IGVuY2xvc2luZ0NsYXNzID09IG51bGw7CgogIFN0cmluZyBnZXQgX2tpbmQ7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICcke2pzRWxlbWVudFByZWZpeH0kX2tpbmQnCiAgICAgICcoJHtlbmNsb3NpbmdDbGFzcyAhPSBudWxsID8gJyR7ZW5jbG9zaW5nQ2xhc3MubmFtZX0uJyA6ICcnfSRuYW1lKSc7Cn0KCmFic3RyYWN0IGNsYXNzIEpGdW5jdGlvbiBleHRlbmRzIEpNZW1iZXIKICAgIGltcGxlbWVudHMgRnVuY3Rpb25FbnRpdHksIEluZGV4ZWRGdW5jdGlvbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzRXh0ZXJuYWw7CiAgQG92ZXJyaWRlCiAgZmluYWwgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXI7CgogIEpGdW5jdGlvbihKTGlicmFyeSBsaWJyYXJ5LCBKQ2xhc3MgZW5jbG9zaW5nQ2xhc3MsIE5hbWUgbmFtZSwKICAgICAgdGhpcy5wYXJhbWV0ZXJTdHJ1Y3R1cmUsIHRoaXMuYXN5bmNNYXJrZXIsCiAgICAgIHtib29sIGlzU3RhdGljOiBmYWxzZSwgdGhpcy5pc0V4dGVybmFsOiBmYWxzZX0pCiAgICAgIDogc3VwZXIobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsIGlzU3RhdGljOiBpc1N0YXRpYyk7Cn0KCmFic3RyYWN0IGNsYXNzIEpDb25zdHJ1Y3RvciBleHRlbmRzIEpGdW5jdGlvbgogICAgaW1wbGVtZW50cyBDb25zdHJ1Y3RvckVudGl0eSwgSW5kZXhlZENvbnN0cnVjdG9yIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQ29uc3Q7CgogIEpDb25zdHJ1Y3RvcigKICAgICAgSkNsYXNzIGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgIHtib29sIGlzRXh0ZXJuYWwsIHRoaXMuaXNDb25zdH0pCiAgICAgIDogc3VwZXIoZW5jbG9zaW5nQ2xhc3MubGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICAgICAgQXN5bmNNYXJrZXIuU1lOQywKICAgICAgICAgICAgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ29uc3RydWN0b3IgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNJbnN0YW5jZU1lbWJlciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTdGF0aWMgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVG9wTGV2ZWwgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3IgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2tpbmQgPT4gJ2NvbnN0cnVjdG9yJzsKfQoKY2xhc3MgSkdlbmVyYXRpdmVDb25zdHJ1Y3RvciBleHRlbmRzIEpDb25zdHJ1Y3RvciB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKR2VuZXJhdGl2ZUNvbnN0cnVjdG9yXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2dlbmVyYXRpdmUtY29uc3RydWN0b3InOwoKICBKR2VuZXJhdGl2ZUNvbnN0cnVjdG9yKAogICAgICBKQ2xhc3MgZW5jbG9zaW5nQ2xhc3MsIE5hbWUgbmFtZSwgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAge2Jvb2wgaXNFeHRlcm5hbCwgYm9vbCBpc0NvbnN0fSkKICAgICAgOiBzdXBlcihlbmNsb3NpbmdDbGFzcywgbmFtZSwgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICAgICAgICBpc0V4dGVybmFsOiBpc0V4dGVybmFsLCBpc0NvbnN0OiBpc0NvbnN0KTsKCiAgZmFjdG9yeSBKR2VuZXJhdGl2ZUNvbnN0cnVjdG9yLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBKQ2xhc3MgZW5jbG9zaW5nQ2xhc3MgPSBzb3VyY2UucmVhZENsYXNzKCk7CiAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlID0KICAgICAgICBuZXcgUGFyYW1ldGVyU3RydWN0dXJlLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgYm9vbCBpc0V4dGVybmFsID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzQ29uc3QgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSkdlbmVyYXRpdmVDb25zdHJ1Y3RvcihlbmNsb3NpbmdDbGFzcywKICAgICAgICBuZXcgTmFtZShuYW1lLCBlbmNsb3NpbmdDbGFzcy5saWJyYXJ5KSwgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQ29uc3Q6IGlzQ29uc3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSk1lbWJlcktpbmQuZ2VuZXJhdGl2ZUNvbnN0cnVjdG9yKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVDbGFzcyhlbmNsb3NpbmdDbGFzcyk7CiAgICBzaW5rLndyaXRlU3RyaW5nKG5hbWUpOwogICAgcGFyYW1ldGVyU3RydWN0dXJlLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsud3JpdGVCb29sKGlzRXh0ZXJuYWwpOwogICAgc2luay53cml0ZUJvb2woaXNDb25zdCk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNGYWN0b3J5Q29uc3RydWN0b3IgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzR2VuZXJhdGl2ZUNvbnN0cnVjdG9yID0+IHRydWU7Cn0KCmNsYXNzIEpGYWN0b3J5Q29uc3RydWN0b3IgZXh0ZW5kcyBKQ29uc3RydWN0b3IgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSkZhY3RvcnlDb25zdHJ1Y3Rvcl0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdmYWN0b3J5LWNvbnN0cnVjdG9yJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yOwoKICBKRmFjdG9yeUNvbnN0cnVjdG9yKAogICAgICBKQ2xhc3MgZW5jbG9zaW5nQ2xhc3MsIE5hbWUgbmFtZSwgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAge2Jvb2wgaXNFeHRlcm5hbCwgYm9vbCBpc0NvbnN0LCB0aGlzLmlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3J9KQogICAgICA6IHN1cGVyKGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBmYWN0b3J5IEpGYWN0b3J5Q29uc3RydWN0b3IucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIEpDbGFzcyBlbmNsb3NpbmdDbGFzcyA9IHNvdXJjZS5yZWFkQ2xhc3MoKTsKICAgIFN0cmluZyBuYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUgPQogICAgICAgIG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmUucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBib29sIGlzRXh0ZXJuYWwgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNDb25zdCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpGYWN0b3J5Q29uc3RydWN0b3IoZW5jbG9zaW5nQ2xhc3MsCiAgICAgICAgbmV3IE5hbWUobmFtZSwgZW5jbG9zaW5nQ2xhc3MubGlicmFyeSksIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICBpc0V4dGVybmFsOiBpc0V4dGVybmFsLAogICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QsCiAgICAgICAgaXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3RvcjogaXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3Rvcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKTWVtYmVyS2luZC5mYWN0b3J5Q29uc3RydWN0b3IpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUNsYXNzKGVuY2xvc2luZ0NsYXNzKTsKICAgIHNpbmsud3JpdGVTdHJpbmcobmFtZSk7CiAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmUud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZUJvb2woaXNFeHRlcm5hbCk7CiAgICBzaW5rLndyaXRlQm9vbChpc0NvbnN0KTsKICAgIHNpbmsud3JpdGVCb29sKGlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3IpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRmFjdG9yeUNvbnN0cnVjdG9yID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzR2VuZXJhdGl2ZUNvbnN0cnVjdG9yID0+IGZhbHNlOwp9CgpjbGFzcyBKQ29uc3RydWN0b3JCb2R5IGV4dGVuZHMgSkZ1bmN0aW9uIGltcGxlbWVudHMgQ29uc3RydWN0b3JCb2R5RW50aXR5IHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pDb25zdHJ1Y3RvckJvZHldIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY29uc3RydWN0b3ItYm9keSc7CgogIEBvdmVycmlkZQogIGZpbmFsIEpDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcjsKCiAgSkNvbnN0cnVjdG9yQm9keSh0aGlzLmNvbnN0cnVjdG9yLCBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlKQogICAgICA6IHN1cGVyKGNvbnN0cnVjdG9yLmxpYnJhcnksIGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzLAogICAgICAgICAgICBjb25zdHJ1Y3Rvci5tZW1iZXJOYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsIEFzeW5jTWFya2VyLlNZTkMsCiAgICAgICAgICAgIGlzU3RhdGljOiBmYWxzZSwgaXNFeHRlcm5hbDogZmFsc2UpOwoKICBmYWN0b3J5IEpDb25zdHJ1Y3RvckJvZHkucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIEpDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHNvdXJjZS5yZWFkTWVtYmVyKCk7CiAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlID0KICAgICAgICBuZXcgUGFyYW1ldGVyU3RydWN0dXJlLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKQ29uc3RydWN0b3JCb2R5KGNvbnN0cnVjdG9yLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSk1lbWJlcktpbmQuY29uc3RydWN0b3JCb2R5KTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXIoY29uc3RydWN0b3IpOwogICAgcGFyYW1ldGVyU3RydWN0dXJlLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9raW5kID0+ICdjb25zdHJ1Y3Rvcl9ib2R5JzsKfQoKY2xhc3MgSk1ldGhvZCBleHRlbmRzIEpGdW5jdGlvbiB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKTWV0aG9kXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ21ldGhvZCc7CgogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgaXNBYnN0cmFjdDsKCiAgSk1ldGhvZChKTGlicmFyeSBsaWJyYXJ5LCBKQ2xhc3MgZW5jbG9zaW5nQ2xhc3MsIE5hbWUgbmFtZSwKICAgICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSwgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIsCiAgICAgIHtib29sIGlzU3RhdGljLCBib29sIGlzRXh0ZXJuYWwsIHRoaXMuaXNBYnN0cmFjdH0pCiAgICAgIDogc3VwZXIobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsIHBhcmFtZXRlclN0cnVjdHVyZSwgYXN5bmNNYXJrZXIsCiAgICAgICAgICAgIGlzU3RhdGljOiBpc1N0YXRpYywgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCk7CgogIGZhY3RvcnkgSk1ldGhvZC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgTWVtYmVyQ29udGV4dEtpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShNZW1iZXJDb250ZXh0S2luZC52YWx1ZXMpOwogICAgSkxpYnJhcnkgbGlicmFyeTsKICAgIEpDbGFzcyBlbmNsb3NpbmdDbGFzczsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIE1lbWJlckNvbnRleHRLaW5kLmxpYnJhcnk6CiAgICAgICAgbGlicmFyeSA9IHNvdXJjZS5yZWFkTGlicmFyeSgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1lbWJlckNvbnRleHRLaW5kLmNsczoKICAgICAgICBlbmNsb3NpbmdDbGFzcyA9IHNvdXJjZS5yZWFkQ2xhc3MoKTsKICAgICAgICBsaWJyYXJ5ID0gZW5jbG9zaW5nQ2xhc3MubGlicmFyeTsKICAgICAgICBicmVhazsKICAgIH0KICAgIFN0cmluZyBuYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUgPQogICAgICAgIG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmUucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBBc3luY01hcmtlciBhc3luY01hcmtlciA9IHNvdXJjZS5yZWFkRW51bShBc3luY01hcmtlci52YWx1ZXMpOwogICAgYm9vbCBpc1N0YXRpYyA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0V4dGVybmFsID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzQWJzdHJhY3QgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSk1ldGhvZChsaWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgbmV3IE5hbWUobmFtZSwgbGlicmFyeSksCiAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlLCBhc3luY01hcmtlciwKICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQWJzdHJhY3Q6IGlzQWJzdHJhY3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSk1lbWJlcktpbmQubWV0aG9kKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGlmIChlbmNsb3NpbmdDbGFzcyAhPSBudWxsKSB7CiAgICAgIHNpbmsud3JpdGVFbnVtKE1lbWJlckNvbnRleHRLaW5kLmNscyk7CiAgICAgIHNpbmsud3JpdGVDbGFzcyhlbmNsb3NpbmdDbGFzcyk7CiAgICB9IGVsc2UgewogICAgICBzaW5rLndyaXRlRW51bShNZW1iZXJDb250ZXh0S2luZC5saWJyYXJ5KTsKICAgICAgc2luay53cml0ZUxpYnJhcnkobGlicmFyeSk7CiAgICB9CiAgICBzaW5rLndyaXRlU3RyaW5nKG5hbWUpOwogICAgcGFyYW1ldGVyU3RydWN0dXJlLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsud3JpdGVFbnVtKGFzeW5jTWFya2VyKTsKICAgIHNpbmsud3JpdGVCb29sKGlzU3RhdGljKTsKICAgIHNpbmsud3JpdGVCb29sKGlzRXh0ZXJuYWwpOwogICAgc2luay53cml0ZUJvb2woaXNBYnN0cmFjdCk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNGdW5jdGlvbiA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9raW5kID0+ICdtZXRob2QnOwp9CgpjbGFzcyBKR2VuZXJhdG9yQm9keSBleHRlbmRzIEpGdW5jdGlvbiB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKR2VuZXJhdG9yQm9keV0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdnZW5lcmF0b3ItYm9keSc7CgogIGZpbmFsIEpGdW5jdGlvbiBmdW5jdGlvbjsKICBmaW5hbCBEYXJ0VHlwZSBlbGVtZW50VHlwZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGU7CgogIEpHZW5lcmF0b3JCb2R5KHRoaXMuZnVuY3Rpb24sIHRoaXMuZWxlbWVudFR5cGUpCiAgICAgIDogaGFzaENvZGUgPSBmdW5jdGlvbi5oYXNoQ29kZSArIDEsIC8vIEhhY2sgc3RhYmlsaXplIHNvcnQgb3JkZXIuCiAgICAgICAgc3VwZXIoZnVuY3Rpb24ubGlicmFyeSwgZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3MsIGZ1bmN0aW9uLm1lbWJlck5hbWUsCiAgICAgICAgICAgIGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZSwgZnVuY3Rpb24uYXN5bmNNYXJrZXIsCiAgICAgICAgICAgIGlzU3RhdGljOiBmdW5jdGlvbi5pc1N0YXRpYywgaXNFeHRlcm5hbDogZmFsc2UpOwoKICBmYWN0b3J5IEpHZW5lcmF0b3JCb2R5LnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBKRnVuY3Rpb24gZnVuY3Rpb24gPSBzb3VyY2UucmVhZE1lbWJlcigpOwogICAgRGFydFR5cGUgZWxlbWVudFR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpHZW5lcmF0b3JCb2R5KGZ1bmN0aW9uLCBlbGVtZW50VHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKTWVtYmVyS2luZC5nZW5lcmF0b3JCb2R5KTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXIoZnVuY3Rpb24pOwogICAgc2luay53cml0ZURhcnRUeXBlKGVsZW1lbnRUeXBlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9raW5kID0+ICdnZW5lcmF0b3JfYm9keSc7Cn0KCmNsYXNzIEpHZXR0ZXIgZXh0ZW5kcyBKRnVuY3Rpb24gewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSkdldHRlcl0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdnZXR0ZXInOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQWJzdHJhY3Q7CgogIEpHZXR0ZXIoSkxpYnJhcnkgbGlicmFyeSwgSkNsYXNzIGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyLAogICAgICB7Ym9vbCBpc1N0YXRpYywgYm9vbCBpc0V4dGVybmFsLCB0aGlzLmlzQWJzdHJhY3R9KQogICAgICA6IHN1cGVyKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBjb25zdCBQYXJhbWV0ZXJTdHJ1Y3R1cmUuZ2V0dGVyKCksCiAgICAgICAgICAgIGFzeW5jTWFya2VyLAogICAgICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwpOwoKICBmYWN0b3J5IEpHZXR0ZXIucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIE1lbWJlckNvbnRleHRLaW5kIGtpbmQgPSBzb3VyY2UucmVhZEVudW0oTWVtYmVyQ29udGV4dEtpbmQudmFsdWVzKTsKICAgIEpMaWJyYXJ5IGxpYnJhcnk7CiAgICBKQ2xhc3MgZW5jbG9zaW5nQ2xhc3M7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBNZW1iZXJDb250ZXh0S2luZC5saWJyYXJ5OgogICAgICAgIGxpYnJhcnkgPSBzb3VyY2UucmVhZExpYnJhcnkoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNZW1iZXJDb250ZXh0S2luZC5jbHM6CiAgICAgICAgZW5jbG9zaW5nQ2xhc3MgPSBzb3VyY2UucmVhZENsYXNzKCk7CiAgICAgICAgbGlicmFyeSA9IGVuY2xvc2luZ0NsYXNzLmxpYnJhcnk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICBBc3luY01hcmtlciBhc3luY01hcmtlciA9IHNvdXJjZS5yZWFkRW51bShBc3luY01hcmtlci52YWx1ZXMpOwogICAgYm9vbCBpc1N0YXRpYyA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0V4dGVybmFsID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzQWJzdHJhY3QgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSkdldHRlcigKICAgICAgICBsaWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgbmV3IE5hbWUobmFtZSwgbGlicmFyeSksIGFzeW5jTWFya2VyLAogICAgICAgIGlzU3RhdGljOiBpc1N0YXRpYywgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCwgaXNBYnN0cmFjdDogaXNBYnN0cmFjdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKTWVtYmVyS2luZC5nZXR0ZXIpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgaWYgKGVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgICAgc2luay53cml0ZUVudW0oTWVtYmVyQ29udGV4dEtpbmQuY2xzKTsKICAgICAgc2luay53cml0ZUNsYXNzKGVuY2xvc2luZ0NsYXNzKTsKICAgIH0gZWxzZSB7CiAgICAgIHNpbmsud3JpdGVFbnVtKE1lbWJlckNvbnRleHRLaW5kLmxpYnJhcnkpOwogICAgICBzaW5rLndyaXRlTGlicmFyeShsaWJyYXJ5KTsKICAgIH0KICAgIHNpbmsud3JpdGVTdHJpbmcobmFtZSk7CiAgICBzaW5rLndyaXRlRW51bShhc3luY01hcmtlcik7CiAgICBzaW5rLndyaXRlQm9vbChpc1N0YXRpYyk7CiAgICBzaW5rLndyaXRlQm9vbChpc0V4dGVybmFsKTsKICAgIHNpbmsud3JpdGVCb29sKGlzQWJzdHJhY3QpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzR2V0dGVyID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2tpbmQgPT4gJ2dldHRlcic7Cn0KCmNsYXNzIEpTZXR0ZXIgZXh0ZW5kcyBKRnVuY3Rpb24gewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSlNldHRlcl0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdzZXR0ZXInOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQWJzdHJhY3Q7CgogIEpTZXR0ZXIoSkxpYnJhcnkgbGlicmFyeSwgSkNsYXNzIGVuY2xvc2luZ0NsYXNzLCBOYW1lIG5hbWUsCiAgICAgIHtib29sIGlzU3RhdGljLCBib29sIGlzRXh0ZXJuYWwsIHRoaXMuaXNBYnN0cmFjdH0pCiAgICAgIDogc3VwZXIobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsIGNvbnN0IFBhcmFtZXRlclN0cnVjdHVyZS5zZXR0ZXIoKSwKICAgICAgICAgICAgQXN5bmNNYXJrZXIuU1lOQywKICAgICAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0V4dGVybmFsOiBpc0V4dGVybmFsKTsKCiAgZmFjdG9yeSBKU2V0dGVyLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBNZW1iZXJDb250ZXh0S2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKE1lbWJlckNvbnRleHRLaW5kLnZhbHVlcyk7CiAgICBKTGlicmFyeSBsaWJyYXJ5OwogICAgSkNsYXNzIGVuY2xvc2luZ0NsYXNzOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgTWVtYmVyQ29udGV4dEtpbmQubGlicmFyeToKICAgICAgICBsaWJyYXJ5ID0gc291cmNlLnJlYWRMaWJyYXJ5KCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTWVtYmVyQ29udGV4dEtpbmQuY2xzOgogICAgICAgIGVuY2xvc2luZ0NsYXNzID0gc291cmNlLnJlYWRDbGFzcygpOwogICAgICAgIGxpYnJhcnkgPSBlbmNsb3NpbmdDbGFzcy5saWJyYXJ5OwogICAgICAgIGJyZWFrOwogICAgfQogICAgU3RyaW5nIG5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgYm9vbCBpc1N0YXRpYyA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0V4dGVybmFsID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzQWJzdHJhY3QgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSlNldHRlcigKICAgICAgICBsaWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgbmV3IE5hbWUobmFtZSwgbGlicmFyeSwgaXNTZXR0ZXI6IHRydWUpLAogICAgICAgIGlzU3RhdGljOiBpc1N0YXRpYywgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCwgaXNBYnN0cmFjdDogaXNBYnN0cmFjdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKTWVtYmVyS2luZC5zZXR0ZXIpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgaWYgKGVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgICAgc2luay53cml0ZUVudW0oTWVtYmVyQ29udGV4dEtpbmQuY2xzKTsKICAgICAgc2luay53cml0ZUNsYXNzKGVuY2xvc2luZ0NsYXNzKTsKICAgIH0gZWxzZSB7CiAgICAgIHNpbmsud3JpdGVFbnVtKE1lbWJlckNvbnRleHRLaW5kLmxpYnJhcnkpOwogICAgICBzaW5rLndyaXRlTGlicmFyeShsaWJyYXJ5KTsKICAgIH0KICAgIHNpbmsud3JpdGVTdHJpbmcobmFtZSk7CiAgICBzaW5rLndyaXRlQm9vbChpc1N0YXRpYyk7CiAgICBzaW5rLndyaXRlQm9vbChpc0V4dGVybmFsKTsKICAgIHNpbmsud3JpdGVCb29sKGlzQWJzdHJhY3QpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQXNzaWduYWJsZSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1NldHRlciA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9raW5kID0+ICdzZXR0ZXInOwp9CgpjbGFzcyBKRmllbGQgZXh0ZW5kcyBKTWVtYmVyIGltcGxlbWVudHMgRmllbGRFbnRpdHksIEluZGV4ZWRGaWVsZCB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKRmllbGRdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnZmllbGQnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQXNzaWduYWJsZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQ29uc3Q7CgogIEpGaWVsZChKTGlicmFyeSBsaWJyYXJ5LCBKQ2xhc3MgZW5jbG9zaW5nQ2xhc3MsIE5hbWUgbmFtZSwKICAgICAge2Jvb2wgaXNTdGF0aWMsIHRoaXMuaXNBc3NpZ25hYmxlLCB0aGlzLmlzQ29uc3R9KQogICAgICA6IHN1cGVyKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLCBpc1N0YXRpYzogaXNTdGF0aWMpOwoKICBmYWN0b3J5IEpGaWVsZC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgTWVtYmVyQ29udGV4dEtpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShNZW1iZXJDb250ZXh0S2luZC52YWx1ZXMpOwogICAgSkxpYnJhcnkgbGlicmFyeTsKICAgIEpDbGFzcyBlbmNsb3NpbmdDbGFzczsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIE1lbWJlckNvbnRleHRLaW5kLmxpYnJhcnk6CiAgICAgICAgbGlicmFyeSA9IHNvdXJjZS5yZWFkTGlicmFyeSgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1lbWJlckNvbnRleHRLaW5kLmNsczoKICAgICAgICBlbmNsb3NpbmdDbGFzcyA9IHNvdXJjZS5yZWFkQ2xhc3MoKTsKICAgICAgICBsaWJyYXJ5ID0gZW5jbG9zaW5nQ2xhc3MubGlicmFyeTsKICAgICAgICBicmVhazsKICAgIH0KICAgIFN0cmluZyBuYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgIGJvb2wgaXNTdGF0aWMgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNBc3NpZ25hYmxlID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzQ29uc3QgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSkZpZWxkKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuZXcgTmFtZShuYW1lLCBsaWJyYXJ5KSwKICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsIGlzQXNzaWduYWJsZTogaXNBc3NpZ25hYmxlLCBpc0NvbnN0OiBpc0NvbnN0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJLaW5kLmZpZWxkKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGlmIChlbmNsb3NpbmdDbGFzcyAhPSBudWxsKSB7CiAgICAgIHNpbmsud3JpdGVFbnVtKE1lbWJlckNvbnRleHRLaW5kLmNscyk7CiAgICAgIHNpbmsud3JpdGVDbGFzcyhlbmNsb3NpbmdDbGFzcyk7CiAgICB9IGVsc2UgewogICAgICBzaW5rLndyaXRlRW51bShNZW1iZXJDb250ZXh0S2luZC5saWJyYXJ5KTsKICAgICAgc2luay53cml0ZUxpYnJhcnkobGlicmFyeSk7CiAgICB9CiAgICBzaW5rLndyaXRlU3RyaW5nKG5hbWUpOwogICAgc2luay53cml0ZUJvb2woaXNTdGF0aWMpOwogICAgc2luay53cml0ZUJvb2woaXNBc3NpZ25hYmxlKTsKICAgIHNpbmsud3JpdGVCb29sKGlzQ29uc3QpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRmllbGQgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfa2luZCA9PiAnZmllbGQnOwp9CgpjbGFzcyBKQ2xvc3VyZUNhbGxNZXRob2QgZXh0ZW5kcyBKTWV0aG9kIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pDbG9zdXJlQ2FsbE1ldGhvZF0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjbG9zdXJlLWNhbGwtbWV0aG9kJzsKCiAgSkNsb3N1cmVDYWxsTWV0aG9kKENsYXNzRW50aXR5IGVuY2xvc2luZ0NsYXNzLAogICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLCBBc3luY01hcmtlciBhc3luY01hcmtlcikKICAgICAgOiBzdXBlcihlbmNsb3NpbmdDbGFzcy5saWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgTmFtZXMuY2FsbCwKICAgICAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlLCBhc3luY01hcmtlciwKICAgICAgICAgICAgaXNTdGF0aWM6IGZhbHNlLCBpc0V4dGVybmFsOiBmYWxzZSwgaXNBYnN0cmFjdDogZmFsc2UpOwoKICBmYWN0b3J5IEpDbG9zdXJlQ2FsbE1ldGhvZC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgSkNsYXNzIGVuY2xvc2luZ0NsYXNzID0gc291cmNlLnJlYWRDbGFzcygpOwogICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSA9CiAgICAgICAgbmV3IFBhcmFtZXRlclN0cnVjdHVyZS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyID0gc291cmNlLnJlYWRFbnVtKEFzeW5jTWFya2VyLnZhbHVlcyk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpDbG9zdXJlQ2FsbE1ldGhvZCgKICAgICAgICBlbmNsb3NpbmdDbGFzcywgcGFyYW1ldGVyU3RydWN0dXJlLCBhc3luY01hcmtlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKTWVtYmVyS2luZC5jbG9zdXJlQ2FsbE1ldGhvZCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlQ2xhc3MoZW5jbG9zaW5nQ2xhc3MpOwogICAgcGFyYW1ldGVyU3RydWN0dXJlLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsud3JpdGVFbnVtKGFzeW5jTWFya2VyKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9raW5kID0+ICdjbG9zdXJlX2NhbGwnOwp9CgovLy8gQSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBzaWduYXR1cmUgb2YgdGhlIERhcnQgY2xvc3VyZS90ZWFyb2ZmIHRoYXQgdGhpcwovLy8gbWV0aG9kJ3MgcGFyZW50IGNsYXNzIGlzIHJlcHJlc2VudGluZy4KY2xhc3MgSlNpZ25hdHVyZU1ldGhvZCBleHRlbmRzIEpNZXRob2QgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSlNpZ25hdHVyZU1ldGhvZF0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdzaWduYXR1cmUtbWV0aG9kJzsKCiAgSlNpZ25hdHVyZU1ldGhvZChDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzcykKICAgICAgOiBzdXBlcihlbmNsb3NpbmdDbGFzcy5saWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgTmFtZXMuc2lnbmF0dXJlLAogICAgICAgICAgICBjb25zdCBQYXJhbWV0ZXJTdHJ1Y3R1cmUoMCwgMCwgY29uc3QgW10sIDApLCBBc3luY01hcmtlci5TWU5DLAogICAgICAgICAgICBpc1N0YXRpYzogZmFsc2UsIGlzRXh0ZXJuYWw6IGZhbHNlLCBpc0Fic3RyYWN0OiBmYWxzZSk7CgogIGZhY3RvcnkgSlNpZ25hdHVyZU1ldGhvZC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgSkNsYXNzIGNscyA9IHNvdXJjZS5yZWFkQ2xhc3MoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSlNpZ25hdHVyZU1ldGhvZChjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSk1lbWJlcktpbmQuc2lnbmF0dXJlTWV0aG9kKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVDbGFzcyhlbmNsb3NpbmdDbGFzcyk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfa2luZCA9PiAnc2lnbmF0dXJlJzsKfQoKLy8vIEVudW0gdXNlZCBmb3IgaWRlbnRpZnlpbmcgW0pUeXBlVmFyaWFibGVdIHZhcmlhbnRzIGluIHNlcmlhbGl6YXRpb24uCmVudW0gSlR5cGVWYXJpYWJsZUtpbmQgeyBjbHMsIG1lbWJlciwgdHlwZWRlZiwgbG9jYWwgfQoKY2xhc3MgSlR5cGVWYXJpYWJsZSBleHRlbmRzIEluZGV4ZWRUeXBlVmFyaWFibGUgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSlR5cGVWYXJpYWJsZV0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICd0eXBlLXZhcmlhYmxlJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgRW50aXR5IHR5cGVEZWNsYXJhdGlvbjsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaW5kZXg7CgogIEpUeXBlVmFyaWFibGUodGhpcy50eXBlRGVjbGFyYXRpb24sIHRoaXMubmFtZSwgdGhpcy5pbmRleCk7CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbSlR5cGVWYXJpYWJsZV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBKVHlwZVZhcmlhYmxlLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBKVHlwZVZhcmlhYmxlS2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKEpUeXBlVmFyaWFibGVLaW5kLnZhbHVlcyk7CiAgICBFbnRpdHkgdHlwZURlY2xhcmF0aW9uOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgSlR5cGVWYXJpYWJsZUtpbmQuY2xzOgogICAgICAgIHR5cGVEZWNsYXJhdGlvbiA9IHNvdXJjZS5yZWFkQ2xhc3MoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKVHlwZVZhcmlhYmxlS2luZC5tZW1iZXI6CiAgICAgICAgdHlwZURlY2xhcmF0aW9uID0gc291cmNlLnJlYWRNZW1iZXIoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBKVHlwZVZhcmlhYmxlS2luZC50eXBlZGVmOgogICAgICAgIHR5cGVEZWNsYXJhdGlvbiA9IHNvdXJjZS5yZWFkVHlwZWRlZigpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEpUeXBlVmFyaWFibGVLaW5kLmxvY2FsOgogICAgICAgIC8vIFR5cGUgdmFyaWFibGVzIGRlY2xhcmVkIGJ5IGxvY2FsIGZ1bmN0aW9ucyBkb24ndCBwb2ludCB0byB0aGVpcgogICAgICAgIC8vIGRlY2xhcmF0aW9uLCBzaW5jZSB0aGUgY29ycmVzcG9uZGluZyBjbG9zdXJlIGNhbGwgbWV0aG9kcyBpcyBjcmVhdGVkCiAgICAgICAgLy8gYWZ0ZXIgdGhlIHR5cGUgdmFyaWFibGUuCiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRml4IHRoaXMuCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICBpbnQgaW5kZXggPSBzb3VyY2UucmVhZEludCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKVHlwZVZhcmlhYmxlKHR5cGVEZWNsYXJhdGlvbiwgbmFtZSwgaW5kZXgpOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbSlR5cGVWYXJpYWJsZV0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGlmICh0eXBlRGVjbGFyYXRpb24gaXMgSW5kZXhlZENsYXNzKSB7CiAgICAgIEluZGV4ZWRDbGFzcyBjbHMgPSB0eXBlRGVjbGFyYXRpb247CiAgICAgIHNpbmsud3JpdGVFbnVtKEpUeXBlVmFyaWFibGVLaW5kLmNscyk7CiAgICAgIHNpbmsud3JpdGVDbGFzcyhjbHMpOwogICAgfSBlbHNlIGlmICh0eXBlRGVjbGFyYXRpb24gaXMgSW5kZXhlZE1lbWJlcikgewogICAgICBJbmRleGVkTWVtYmVyIG1lbWJlciA9IHR5cGVEZWNs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dHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMud29ybGQuY2xhc3Nfc2V0OwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nIHNob3cgSXRlcmFibGVCYXNlLCBNYXBCYXNlOwoKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JyBzaG93IENsYXNzRW50aXR5OwppbXBvcnQgJy4uL2VsZW1lbnRzL2luZGV4ZWQuZGFydCcgc2hvdyBJbmRleGVkQ2xhc3M7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvZW51bXNldC5kYXJ0JyBzaG93IEVudW1TZXQ7CgovLy8gRW51bSBmb3IgdGhlIGRpZmZlcmVudCBraW5kcyBvZiBpbnN0YW50aWF0aW9uIG9mIGEgY2xhc3MuCmVudW0gSW5zdGFudGlhdGlvbiB7CiAgVU5JTlNUQU5USUFURUQsCiAgRElSRUNUTFlfSU5TVEFOVElBVEVELAogIElORElSRUNUTFlfSU5TVEFOVElBVEVELAogIEFCU1RSQUNUTFlfSU5TVEFOVElBVEVELAp9CgovLy8gTm9kZSBmb3IgW2Nsc10gaW4gYSB0cmVlIGZvcm1pbmcgdGhlIHN1YmNsYXNzIHJlbGF0aW9uIG9mIFtDbGFzc0VudGl0eV1zLgovLy8KLy8vIFRoaXMgaXMgdXNlZCBieSB0aGUgW0Nsb3NlZFdvcmxkXSB0byBwZXJmb3JtIHF1ZXJpZXMgb24gc3ViY2xhc3MgYW5kIHN1YnR5cGUKLy8vIHJlbGF0aW9ucy4KLy8vCi8vLyBGb3IgdGhpcyBjbGFzcyBoaWVyYXJjaHk6Ci8vLwovLy8gICAgIGNsYXNzIEEge30KLy8vICAgICBjbGFzcyBCIGV4dGVuZHMgQSB7fQovLy8gICAgIGNsYXNzIEMgZXh0ZW5kcyBBIHt9Ci8vLyAgICAgY2xhc3MgRCBleHRlbmRzIEIge30KLy8vICAgICBjbGFzcyBFIGV4dGVuZHMgRCB7fQovLy8KLy8vIHRoZSBbQ2xhc3NIaWVyYXJjaHlOb2RlXXMgZm9ybSB0aGlzIHN1YmNsYXNzIHRyZWU6Ci8vLwovLy8gICAgICAgT2JqZWN0Ci8vLyAgICAgICAgIHwKLy8vICAgICAgICAgQQovLy8gICAgICAgIC8gXAovLy8gICAgICAgQiAgIEMKLy8vICAgICAgIHwKLy8vICAgICAgIEQKLy8vICAgICAgIHwKLy8vICAgICAgIEUKLy8vCmNsYXNzIENsYXNzSGllcmFyY2h5Tm9kZSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtDbGFzc0hpZXJhcmNoeU5vZGVdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY2xhc3MtaGllcmFyY2h5LW5vZGUnOwoKICAvLy8gRW51bSBzZXQgZm9yIHNlbGVjdGluZyBpbnN0YW50aWF0ZWQgY2xhc3NlcyBpbgogIC8vLyBbQ2xhc3NIaWVyYXJjaHlOb2RlLnN1YmNsYXNzZXNCeU1hc2tdLAogIC8vLyBbQ2xhc3NIaWVyYXJjaHlOb2RlLnN1YmNsYXNzZXNCeU1hc2tdIGFuZCBbQ2xhc3NTZXQuc3VidHlwZXNCeU1hc2tdLgogIHN0YXRpYyBmaW5hbCBFbnVtU2V0PEluc3RhbnRpYXRpb24+IElOU1RBTlRJQVRFRCA9CiAgICAgIG5ldyBFbnVtU2V0PEluc3RhbnRpYXRpb24+LmZyb21WYWx1ZXMoY29uc3QgPEluc3RhbnRpYXRpb24+WwogICAgSW5zdGFudGlhdGlvbi5ESVJFQ1RMWV9JTlNUQU5USUFURUQsCiAgICBJbnN0YW50aWF0aW9uLklORElSRUNUTFlfSU5TVEFOVElBVEVELAogICAgSW5zdGFudGlhdGlvbi5BQlNUUkFDVExZX0lOU1RBTlRJQVRFRCwKICBdLCBmaXhlZDogdHJ1ZSk7CgogIC8vLyBFbnVtIHNldCBmb3Igc2VsZWN0aW5nIGRpcmVjdGx5IGFuZCBhYnN0cmFjdGx5IGluc3RhbnRpYXRlZCBjbGFzc2VzIGluCiAgLy8vIFtDbGFzc0hpZXJhcmNoeU5vZGUuc3ViY2xhc3Nlc0J5TWFza10sCiAgLy8vIFtDbGFzc0hpZXJhcmNoeU5vZGUuc3ViY2xhc3Nlc0J5TWFza10gYW5kIFtDbGFzc1NldC5zdWJ0eXBlc0J5TWFza10uCiAgc3RhdGljIGZpbmFsIEVudW1TZXQ8SW5zdGFudGlhdGlvbj4gRVhQTElDSVRMWV9JTlNUQU5USUFURUQgPQogICAgICBuZXcgRW51bVNldDxJbnN0YW50aWF0aW9uPi5mcm9tVmFsdWVzKGNvbnN0IDxJbnN0YW50aWF0aW9uPlsKICAgIEluc3RhbnRpYXRpb24uRElSRUNUTFlfSU5TVEFOVElBVEVELAogICAgSW5zdGFudGlhdGlvbi5BQlNUUkFDVExZX0lOU1RBTlRJQVRFRAogIF0sIGZpeGVkOiB0cnVlKTsKCiAgLy8vIEVudW0gc2V0IGZvciBzZWxlY3RpbmcgYWxsIGNsYXNzZXMgaW4KICAvLy8gW0NsYXNzSGllcmFyY2h5Tm9kZS5zdWJjbGFzc2VzQnlNYXNrXSwKICAvLy8gW0NsYXNzSGllcmFyY2h5Tm9kZS5zdWJjbGFzc2VzQnlNYXNrXSBhbmQgW0NsYXNzU2V0LnN1YnR5cGVzQnlNYXNrXS4KICBzdGF0aWMgZmluYWwgRW51bVNldDxJbnN0YW50aWF0aW9uPiBBTEwgPQogICAgICBuZXcgRW51bVNldDxJbnN0YW50aWF0aW9uPi5mcm9tVmFsdWVzKEluc3RhbnRpYXRpb24udmFsdWVzLCBmaXhlZDogdHJ1ZSk7CgogIC8vLyBDcmVhdGVzIGFuIGVudW0gc2V0IGZvciBzZWxlY3RpbmcgdGhlIHJldHVybmVkIGNsYXNzZXMgaW4KICAvLy8gW0NsYXNzSGllcmFyY2h5Tm9kZS5zdWJjbGFzc2VzQnlNYXNrXSwKICAvLy8gW0NsYXNzSGllcmFyY2h5Tm9kZS5zdWJjbGFzc2VzQnlNYXNrXSBhbmQgW0NsYXNzU2V0LnN1YnR5cGVzQnlNYXNrXS4KICBzdGF0aWMgRW51bVNldDxJbnN0YW50aWF0aW9uPiBjcmVhdGVNYXNrKAogICAgICB7Ym9vbCBpbmNsdWRlRGlyZWN0bHlJbnN0YW50aWF0ZWQ6IHRydWUsCiAgICAgIGJvb2wgaW5jbHVkZUluZGlyZWN0bHlJbnN0YW50aWF0ZWQ6IHRydWUsCiAgICAgIGJvb2wgaW5jbHVkZVVuaW5zdGFudGlhdGVkOiB0cnVlLAogICAgICBib29sIGluY2x1ZGVBYnN0cmFjdGx5SW5zdGFudGlhdGVkOiB0cnVlfSkgewogICAgRW51bVNldDxJbnN0YW50aWF0aW9uPiBtYXNrID0gbmV3IEVudW1TZXQ8SW5zdGFudGlhdGlvbj4oKTsKICAgIGlmIChpbmNsdWRlRGlyZWN0bHlJbnN0YW50aWF0ZWQpIHsKICAgICAgbWFzay5hZGQoSW5zdGFudGlhdGlvbi5ESVJFQ1RMWV9JTlNUQU5USUFURUQpOwogICAgfQogICAgaWYgKGluY2x1ZGVJbmRpcmVjdGx5SW5zdGFudGlhdGVkKSB7CiAgICAgIG1hc2suYWRkKEluc3RhbnRpYXRpb24uSU5ESVJFQ1RMWV9JTlNUQU5USUFURUQpOwogICAgfQogICAgaWYgKGluY2x1ZGVVbmluc3RhbnRpYXRlZCkgewogICAgICBtYXNrLmFkZChJbnN0YW50aWF0aW9uLlVOSU5TVEFOVElBVEVEKTsKICAgIH0KICAgIGlmIChpbmNsdWRlQWJzdHJhY3RseUluc3RhbnRpYXRlZCkgewogICAgICBtYXNrLmFkZChJbnN0YW50aWF0aW9uLkFCU1RSQUNUTFlfSU5TVEFOVElBVEVEKTsKICAgIH0KICAgIHJldHVybiBtYXNrOwogIH0KCiAgZmluYWwgQ2xhc3NIaWVyYXJjaHlOb2RlIHBhcmVudE5vZGU7CiAgZmluYWwgRW51bVNldDxJbnN0YW50aWF0aW9uPiBfbWFzayA9IG5ldyBFbnVtU2V0PEluc3RhbnRpYXRpb24+LmZyb21WYWx1ZXMoCiAgICAgIGNvbnN0IDxJbnN0YW50aWF0aW9uPltJbnN0YW50aWF0aW9uLlVOSU5TVEFOVElBVEVEXSk7CiAgZmluYWwgSW5kZXhlZENsYXNzIGNsczsKCiAgZmluYWwgaW50IGhpZXJhcmNoeURlcHRoOwoKICBDbGFzc0VudGl0eSBfbGVhc3RVcHBlckluc3RhbnRpYXRlZFN1YmNsYXNzOwogIGludCBfaW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudCA9IDA7CgogIC8vLyBgdHJ1ZWAgaWYgW2Nsc10gaGFzIGJlZW4gZGlyZWN0bHkgaW5zdGFudGlhdGVkLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgYENgIGJ1dCBfbm90XyBgQmAgaW46CiAgLy8vICAgY2xhc3MgQiB7fQogIC8vLyAgIGNsYXNzIEMgZXh0ZW5kcyBCIHt9CiAgLy8vICAgbWFpbigpID0+IG5ldyBDKCk7CiAgLy8vCiAgYm9vbCBnZXQgaXNEaXJlY3RseUluc3RhbnRpYXRlZCA9PgogICAgICBfbWFzay5jb250YWlucyhJbnN0YW50aWF0aW9uLkRJUkVDVExZX0lOU1RBTlRJQVRFRCk7CgogIHZvaWQgc2V0IGlzRGlyZWN0bHlJbnN0YW50aWF0ZWQoYm9vbCB2YWx1ZSkgewogICAgaWYgKHZhbHVlICE9IGlzRGlyZWN0bHlJbnN0YW50aWF0ZWQpIHsKICAgICAgX3VwZGF0ZVBhcmVudEluc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQoCiAgICAgICAgICBJbnN0YW50aWF0aW9uLkRJUkVDVExZX0lOU1RBTlRJQVRFRCwKICAgICAgICAgIGFkZDogdmFsdWUpOwogICAgfQogIH0KCiAgLy8vIGB0cnVlYCBpZiBbY2xzXSBoYXMgYmVlbiBhYnN0cmFjdGx5IGluc3RhbnRpYXRlZC4gVGhpcyBtZWFucyB0aGF0IGF0CiAgLy8vIHJ1bnRpbWUgaW5zdGFuY2VzIG9mIFtjbHNdIG9yIHVua25vd24gc3ViY2xhc3NlcyBvZiBbY2xzXSBhcmUgYXNzdW1lZCB0bwogIC8vLyBleGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIHRvIG1hcmsgbmF0aXZlIGFuZC9vciByZWZsZWN0YWJsZSBjbGFzc2VzIGFzIGluc3RhbnRpYXRlZC4KICAvLy8gRm9yIG5hdGl2ZSBjbGFzc2VzIHdlIGRvIG5vdCBrbm93IHRoZSBleGFjdCBjbGFzcyB0aGF0IGluc3RhbnRpYXRlcyBbY2xzXQogIC8vLyBzbyBbY2xzXSBoZXJlIHJlcHJlc2VudHMgdGhlIHJvb3Qgb2YgdGhlIHN1YmNsYXNzZXMuIEZvciByZWZsZWN0YWJsZQogIC8vLyBjbGFzc2VzIHdlIG5lZWQgZXZlbnQgYWJzdHJhY3QgY2xhc3NlcyB0byBiZSAnbGl2ZScgZXZlbiB0aG91Z2ggdGhleQogIC8vLyBjYW5ub3QgdGhlbXNlbHZlcyBiZSBpbnN0YW50aWF0ZWQuCiAgYm9vbCBnZXQgaXNBYnN0cmFjdGx5SW5zdGFudGlhdGVkID0+CiAgICAgIF9tYXNrLmNvbnRhaW5zKEluc3RhbnRpYXRpb24uQUJTVFJBQ1RMWV9JTlNUQU5USUFURUQpOwoKICB2b2lkIHNldCBpc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWQoYm9vbCB2YWx1ZSkgewogICAgaWYgKHZhbHVlICE9IGlzQWJzdHJhY3RseUluc3RhbnRpYXRlZCkgewogICAgICBfdXBkYXRlUGFyZW50SW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudCgKICAgICAgICAgIEluc3RhbnRpYXRpb24uQUJTVFJBQ1RMWV9JTlNUQU5USUFURUQsCiAgICAgICAgICBhZGQ6IHZhbHVlKTsKICAgIH0KICB9CgogIC8vLyBgdHJ1ZWAgaWYgW2Nsc10gaXMgZWl0aGVyIGRpcmVjdGx5IG9yIGFic3RyYWN0bHkgaW5zdGFudGlhdGVkLgogIGJvb2wgZ2V0IGlzRXhwbGljaXRseUluc3RhbnRpYXRlZCA9PgogICAgICBpc0RpcmVjdGx5SW5zdGFudGlhdGVkIHx8IGlzQWJzdHJhY3RseUluc3RhbnRpYXRlZDsKCiAgdm9pZCBfdXBkYXRlUGFyZW50SW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudChJbnN0YW50aWF0aW9uIGluc3RhbnRpYXRpb24sCiAgICAgIHtib29sIGFkZH0pIHsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBwYXJlbnQgPSBwYXJlbnROb2RlOwogICAgaWYgKGFkZCkgewogICAgICBfbWFzay5yZW1vdmUoSW5zdGFudGlhdGlvbi5VTklOU1RBTlRJQVRFRCk7CiAgICAgIF9tYXNrLmFkZChpbnN0YW50aWF0aW9uKTsKICAgICAgd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7CiAgICAgICAgcGFyZW50Ll91cGRhdGVJbnN0YW50aWF0ZWRTdWJjbGFzc0NvdW50KDEpOwogICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBfbWFzay5yZW1vdmUoaW5zdGFudGlhdGlvbik7CiAgICAgIGlmIChfbWFzay5pc0VtcHR5KSB7CiAgICAgICAgX21hc2suYWRkKEluc3RhbnRpYXRpb24uVU5JTlNUQU5USUFURUQpOwogICAgICB9CiAgICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewogICAgICAgIHBhcmVudC5fdXBkYXRlSW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudCgtMSk7CiAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBgdHJ1ZWAgaWYgW2Nsc10gaGFzIGJlZW4gaW5zdGFudGlhdGVkIHRocm91Z2ggc3ViY2xhc3Nlcy4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGBBYCBhbmQgYEJgIGJ1dCBfbm90XyBgQ2AgaW46CiAgLy8vICAgY2xhc3MgQSB7fQogIC8vLyAgIGNsYXNzIEIgZXh0ZW5kcyBBIHt9CiAgLy8vICAgY2xhc3MgQyBleHRlbmRzIEIge30KICAvLy8gICBtYWluKCkgPT4gW25ldyBCKCksIG5ldyBDKCldOwogIC8vLwogIGJvb2wgZ2V0IGlzSW5kaXJlY3RseUluc3RhbnRpYXRlZCA9PiBfaW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudCA+IDA7CgogIC8vLyBUaGUgbnVtYmVyIG9mIHN0cmljdCBzdWJjbGFzc2VzIHRoYXQgYXJlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkKICAvLy8gaW5zdGFudGlhdGVkLgogIGludCBnZXQgaW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudCA9PiBfaW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudDsKCiAgdm9pZCBfdXBkYXRlSW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudChpbnQgY2hhbmdlKSB7CiAgICBib29sIGJlZm9yZSA9IGlzSW5kaXJlY3RseUluc3RhbnRpYXRlZDsKICAgIF9pbnN0YW50aWF0ZWRTdWJjbGFzc0NvdW50ICs9IGNoYW5nZTsKICAgIGJvb2wgYWZ0ZXIgPSBpc0luZGlyZWN0bHlJbnN0YW50aWF0ZWQ7CiAgICBpZiAoYmVmb3JlICE9IGFmdGVyKSB7CiAgICAgIGlmIChhZnRlcikgewogICAgICAgIF9tYXNrLnJlbW92ZShJbnN0YW50aWF0aW9uLlVOSU5TVEFOVElBVEVEKTsKICAgICAgICBfbWFzay5hZGQoSW5zdGFudGlhdGlvbi5JTkRJUkVDVExZX0lOU1RBTlRJQVRFRCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX21hc2sucmVtb3ZlKEluc3RhbnRpYXRpb24uSU5ESVJFQ1RMWV9JTlNUQU5USUFURUQpOwogICAgICAgIGlmIChfbWFzay5pc0VtcHR5KSB7CiAgICAgICAgICBfbWFzay5hZGQoSW5zdGFudGlhdGlvbi5VTklOU1RBTlRJQVRFRCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLy8gVGhlIG5vZGVzIGZvciB0aGUgZGlyZWN0IHN1YmNsYXNzZXMgb2YgW2Nsc10uCiAgTGlzdDxDbGFzc0hpZXJhcmNoeU5vZGU+IF9kaXJlY3RTdWJjbGFzc2VzID0gPENsYXNzSGllcmFyY2h5Tm9kZT5bXTsKCiAgQ2xhc3NIaWVyYXJjaHlOb2RlKHRoaXMucGFyZW50Tm9kZSwgdGhpcy5jbHMsIHRoaXMuaGllcmFyY2h5RGVwdGgpIHsKICAgIGlmIChwYXJlbnROb2RlICE9IG51bGwpIHsKICAgICAgcGFyZW50Tm9kZS5hZGREaXJlY3RTdWJjbGFzcyh0aGlzKTsKICAgIH0KICB9CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQ2xhc3NIaWVyYXJjaHlOb2RlXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IENsYXNzSGllcmFyY2h5Tm9kZS5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBNYXA8Q2xhc3NFbnRpdHksIENsYXNzSGllcmFyY2h5Tm9kZT4gbm9kZU1hcCkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBJbmRleGVkQ2xhc3MgY2xzID0gc291cmNlLnJlYWRDbGFzcygpOwogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIHBhcmVudE5vZGU7CiAgICBJbmRleGVkQ2xhc3Mgc3VwZXJjbGFzcyA9IHNvdXJjZS5yZWFkQ2xhc3NPck51bGwoKTsKICAgIGlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsKICAgICAgcGFyZW50Tm9kZSA9IG5vZGVNYXBbc3VwZXJjbGFzc107CiAgICAgIGFzc2VydChwYXJlbnROb2RlICE9IG51bGwsCiAgICAgICAgICAiTm8gQ2xhc3NIaWVyYXJjaHlOb2RlIGZvciBzdXBlcmNsYXNzICRzdXBlcmNsYXNzLiIpOwogICAgfQogICAgaW50IG1hc2tWYWx1ZSA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBpbnQgaGllcmFyY2h5RGVwdGggPSBzb3VyY2UucmVhZEludCgpOwogICAgaW50IGluc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBDbGFzc0hpZXJhcmNoeU5vZGUocGFyZW50Tm9kZSwgY2xzLCBoaWVyYXJjaHlEZXB0aCkKICAgICAgLi5faW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudCA9IGluc3RhbnRpYXRlZFN1YmNsYXNzQ291bnQKICAgICAgLi5fbWFzay52YWx1ZSA9IG1hc2tWYWx1ZTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0NsYXNzSGllcmFyY2h5Tm9kZV0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVDbGFzcyhjbHMpOwogICAgc2luay53cml0ZUNsYXNzT3JOdWxsKHBhcmVudE5vZGU/LmNscyk7CiAgICBzaW5rLndyaXRlSW50KF9tYXNrLnZhbHVlKTsKICAgIHNpbmsud3JpdGVJbnQoaGllcmFyY2h5RGVwdGgpOwogICAgc2luay53cml0ZUludChfaW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudCk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgLy8vIEFkZHMgW3N1YmNsYXNzXSBhcyBhIGRpcmVjdCBzdWJjbGFzcyBvZiBbY2xzXS4KICB2b2lkIGFkZERpcmVjdFN1YmNsYXNzKENsYXNzSGllcmFyY2h5Tm9kZSBzdWJjbGFzcykgewogICAgYXNzZXJ0KCFfZGlyZWN0U3ViY2xhc3Nlcy5jb250YWlucyhzdWJjbGFzcykpOwogICAgX2RpcmVjdFN1YmNsYXNzZXMuYWRkKHN1YmNsYXNzKTsKICB9CgogIEl0ZXJhYmxlPENsYXNzSGllcmFyY2h5Tm9kZT4gZ2V0IGRpcmVjdFN1YmNsYXNzZXMgPT4gX2RpcmVjdFN1YmNsYXNzZXM7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbb3RoZXJdIGlzIGNvbnRhaW5lZCBpbiB0aGUgc3VidHJlZSBvZiB0aGlzIG5vZGUuCiAgLy8vCiAgLy8vIFRoaXMgbWVhbnMgdGhhdCBbb3RoZXJdIGlzIGEgc3ViY2xhc3Mgb2YgW2Nsc10uCiAgYm9vbCBjb250YWlucyhDbGFzc0hpZXJhcmNoeU5vZGUgb3RoZXIpIHsKICAgIHdoaWxlIChvdGhlciAhPSBudWxsKSB7CiAgICAgIGlmIChjbHMgPT0gb3RoZXIuY2xzKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGhpZXJhcmNoeURlcHRoID49IG90aGVyLmhpZXJhcmNoeURlcHRoKSByZXR1cm4gZmFsc2U7CiAgICAgIG90aGVyID0gb3RoZXIucGFyZW50Tm9kZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBgb3RoZXIuY2xzYCBpcyBhIHN1YmNsYXNzIG9mIFtjbHNdLgogIGJvb2wgaGFzU3ViY2xhc3MoQ2xhc3NIaWVyYXJjaHlOb2RlIG90aGVyKSB7CiAgICByZXR1cm4gY29udGFpbnMob3RoZXIpOwogIH0KCiAgLy8vIGB0cnVlYCBpZiBbY2xzXSBoYXMgYmVlbiBkaXJlY3RseSwgaW5kaXJlY3RseSwgb3IgYWJzdHJhY3RseSBpbnN0YW50aWF0ZWQuCiAgYm9vbCBnZXQgaXNJbnN0YW50aWF0ZWQgPT4KICAgICAgaXNFeHBsaWNpdGx5SW5zdGFudGlhdGVkIHx8IGlzSW5kaXJlY3RseUluc3RhbnRpYXRlZDsKCiAgLy8vIFJldHVybnMgYW4gW0l0ZXJhYmxlXSBvZiB0aGUgc3ViY2xhc3NlcyBvZiBbY2xzXSBwb3NzaWJseSBpbmNsdWRpbmcgW2Nsc10uCiAgLy8vCiAgLy8vIFN1YmNsYXNzZXMgYXJlIGluY2x1ZGVkIGlmIHRoZWlyIGluc3RhbnRpYXRpb24gcHJvcGVydGllcyBpbnRlcnNlY3Qgd2l0aAogIC8vLyB0aGVpciBjb3JyZXNwb25kaW5nIFtJbnN0YW50aWF0aW9uXSB2YWx1ZXMgaW4gW21hc2tdLiBJZiBbc3RyaWN0XSBpcwogIC8vLyBgdHJ1ZWAsIFtjbHNdIGl0c2VsZiBpcyBfbm90XyByZXR1cm5lZC4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gc3ViY2xhc3Nlc0J5TWFzayhFbnVtU2V0PEluc3RhbnRpYXRpb24+IG1hc2ssCiAgICAgIHtib29sIHN0cmljdDogZmFsc2V9KSB7CiAgICByZXR1cm4gbmV3IENsYXNzSGllcmFyY2h5Tm9kZUl0ZXJhYmxlKHRoaXMsIG1hc2ssIGluY2x1ZGVSb290OiAhc3RyaWN0KTsKICB9CgogIC8vLyBBcHBsaWVzIFtwcmVkaWNhdGVdIHRvIGVhY2ggc3ViY2xhc3Mgb2YgW2Nsc10gbWF0Y2hpbmcgdGhlIGNyaXRlcmlhCiAgLy8vIHNwZWNpZmllZCBieSBbbWFza10gYW5kIFtzdHJpY3RdLiBJZiBbcHJlZGljYXRlXSByZXR1cm5zIGB0cnVlYCBvbiBhCiAgLy8vIGNsYXNzLCB2aXNpdGF0aW9uIGlzIHN0b3BwZWQgaW1tZWRpYXRlbHkgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYC4KICAvLy8KICAvLy8gW3ByZWRpY2F0ZV0gaXMgYXBwbGllZCB0byBzdWJjbGFzc2VzIGlmIHRoZWlyIGluc3RhbnRpYXRpb24gcHJvcGVydGllcwogIC8vLyBpbnRlcnNlY3Qgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIFtJbnN0YW50aWF0aW9uXSB2YWx1ZXMgaW4gW21hc2tdLiBJZgogIC8vLyBbc3RyaWN0XSBpcyBgdHJ1ZWAsIFtwcmVkaWNhdGVdIGlzIF9ub3RfIGNhbGxlZCBvbiBbY2xzXSBpdHNlbGYuCiAgYm9vbCBhbnlTdWJjbGFzcyhib29sIHByZWRpY2F0ZShDbGFzc0VudGl0eSBjbHMpLCBFbnVtU2V0PEluc3RhbnRpYXRpb24+IG1hc2ssCiAgICAgIHtib29sIHN0cmljdDogZmFsc2V9KSB7CiAgICBJdGVyYXRpb25TdGVwIHdyYXBwZXIoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICAgIHJldHVybiBwcmVkaWNhdGUoY2xzKSA/IEl0ZXJhdGlvblN0ZXAuU1RPUCA6IEl0ZXJhdGlvblN0ZXAuQ09OVElOVUU7CiAgICB9CgogICAgcmV0dXJuIGZvckVhY2hTdWJjbGFzcyh3cmFwcGVyLCBtYXNrLCBzdHJpY3Q6IHN0cmljdCkgPT0gSXRlcmF0aW9uU3RlcC5TVE9QOwogIH0KCiAgLy8vIEFwcGxpZXMgW2ZdIHRvIGVhY2ggc3ViY2xhc3Mgb2YgW2Nsc10gbWF0Y2hpbmcgdGhlIGNyaXRlcmlhIHNwZWNpZmllZCBieQogIC8vLyBbbWFza10gYW5kIFtzdHJpY3RdLgogIC8vLwogIC8vLyBbZl0gaXMgYSBhcHBsaWVkIHRvIHN1YmNsYXNzZXMgaWYgdGhlaXIgaW5zdGFudGlhdGlvbiBwcm9wZXJ0aWVzIGludGVyc2VjdAogIC8vLyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgW0luc3RhbnRpYXRpb25dIHZhbHVlcyBpbiBbbWFza10uIElmIFtzdHJpY3RdIGlzCiAgLy8vIGB0cnVlYCwgW2ZdIGlzIF9ub3RfIGNhbGxlZCBvbiBbY2xzXSBpdHNlbGYuCiAgLy8vCiAgLy8vIFRoZSB2aXNpdGF0aW9uIG9mIHN1YmNsYXNzZXMgY2FuIGJlIGN1dCBzaG9ydCBieSB0aGUgcmV0dXJuIHZhbHVlIG9mIFtmXS4KICAvLy8gSWYgW0ZvckVhY2guU1RPUF0gaXMgcmV0dXJuZWQsIG5vIGZ1cnRoZXIgY2xhc3NlcyBhcmUgdmlzaXRlZCBhbmQgdGhlCiAgLy8vIGZ1bmN0aW9uIHN0b3BzIGltbWVkaWF0ZWx5LiBJZiBbRm9yRWFjaC5TS0lQX1NVQkNMQVNTRVNdIGlzIHJldHVybmVkLCB0aGUKICAvLy8gc3ViY2xhc3NlcyBvZiB0aGUgbGFzdCB2aXNpdGVkIGNsYXNzIGFyZSBza2lwcGVkLCBidXQgdmlzaXRhdGlvbgogIC8vLyBjb250aW51ZXMuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGlzIGVpdGhlciBbRm9yRWFjaC5TVE9QXSwgaWYKICAvLy8gdmlzaXRhdGlvbiB3YXMgc3RvcHBlZCwgb3IgW0ZvckVhY2guQ09OVElOVUVdIGlmIHZpc2l0YXRpb24gY29udGludWVkIHRvCiAgLy8vIHRoZSBlbmQuCiAgSXRlcmF0aW9uU3RlcCBmb3JFYWNoU3ViY2xhc3MoRm9yRWFjaEZ1bmN0aW9uIGYsIEVudW1TZXQ8SW5zdGFudGlhdGlvbj4gbWFzaywKICAgICAge2Jvb2wgc3RyaWN0OiBmYWxzZX0pIHsKICAgIEl0ZXJhdGlvblN0ZXAgbmV4dFN0ZXA7CiAgICBpZiAoIXN0cmljdCAmJiBtYXNrLmludGVyc2VjdHMoX21hc2spKSB7CiAgICAgIG5leHRTdGVwID0gZihjbHMpOwogICAgfQogICAgLy8gSW50ZXJwcmV0IGBmb3JFYWNoID09IG51bGxgIGFzIGBmb3JFYWNoID09IEZvckVhY2guQ09OVElOVUVgLgogICAgbmV4dFN0ZXAgPz89IEl0ZXJhdGlvblN0ZXAuQ09OVElOVUU7CgogICAgaWYgKG5leHRTdGVwID09IEl0ZXJhdGlvblN0ZXAuQ09OVElOVUUpIHsKICAgICAgaWYgKG1hc2suY29udGFpbnMoSW5zdGFudGlhdGlvbi5VTklOU1RBTlRJQVRFRCkgfHwgaXNJbnN0YW50aWF0ZWQpIHsKICAgICAgICBmb3IgKENsYXNzSGllcmFyY2h5Tm9kZSBzdWJjbGFzcyBpbiBfZGlyZWN0U3ViY2xhc3NlcykgewogICAgICAgICAgSXRlcmF0aW9uU3RlcCBzdWJGb3JFYWNoID0gc3ViY2xhc3MuZm9yRWFjaFN1YmNsYXNzKGYsIG1hc2spOwogICAgICAgICAgaWYgKHN1YkZvckVhY2ggPT0gSXRlcmF0aW9uU3RlcC5TVE9QKSB7CiAgICAgICAgICAgIHJldHVybiBzdWJGb3JFYWNoOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKG5leHRTdGVwID09IEl0ZXJhdGlvblN0ZXAuU1RPUCkgewogICAgICByZXR1cm4gbmV4dFN0ZXA7CiAgICB9CiAgICByZXR1cm4gSXRlcmF0aW9uU3RlcC5DT05USU5VRTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBtb3N0IHNwZWNpZmljIHN1YmNsYXNzIG9mIFtjbHNdIChpbmNsdWRpbmcgW2Nsc10pIHRoYXQgaXMKICAvLy8gZGlyZWN0bHkgaW5zdGFudGlhdGVkIG9yIGEgc3VwZXJjbGFzcyBvZiBhbGwgZGlyZWN0bHkgaW5zdGFudGlhdGVkCiAgLy8vIHN1YmNsYXNzZXMuIElmIFtjbHNdIGlzIG5vdCBpbnN0YW50aWF0ZWQsIGBudWxsYCBpcyByZXR1cm5lZC4KICBDbGFzc0VudGl0eSBnZXRMdWJPZkluc3RhbnRpYXRlZFN1YmNsYXNzZXMoKSB7CiAgICBpZiAoIWlzSW5zdGFudGlhdGVkKSByZXR1cm4gbnVsbDsKICAgIGlmIChfbGVhc3RVcHBlckluc3RhbnRpYXRlZFN1YmNsYXNzID09IG51bGwpIHsKICAgICAgX2xlYXN0VXBwZXJJbnN0YW50aWF0ZWRTdWJjbGFzcyA9CiAgICAgICAgICBfY29tcHV0ZUxlYXN0VXBwZXJJbnN0YW50aWF0ZWRTdWJjbGFzcygpOwogICAgfQogICAgcmV0dXJuIF9sZWFzdFVwcGVySW5zdGFudGlhdGVkU3ViY2xhc3M7CiAgfQoKICBDbGFzc0VudGl0eSBfY29tcHV0ZUxlYXN0VXBwZXJJbnN0YW50aWF0ZWRTdWJjbGFzcygpIHsKICAgIGlmIChpc0V4cGxpY2l0bHlJbnN0YW50aWF0ZWQpIHsKICAgICAgcmV0dXJuIGNsczsKICAgIH0KICAgIGlmICghaXNJbnN0YW50aWF0ZWQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgc3ViY2xhc3M7CiAgICBmb3IgKENsYXNzSGllcmFyY2h5Tm9kZSBub2RlIGluIF9kaXJlY3RTdWJjbGFzc2VzKSB7CiAgICAgIGlmIChub2RlLmlzSW5zdGFudGlhdGVkKSB7CiAgICAgICAgaWYgKHN1YmNsYXNzID09IG51bGwpIHsKICAgICAgICAgIHN1YmNsYXNzID0gbm9kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGNsczsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChzdWJjbGFzcyAhPSBudWxsKSB7CiAgICAgIHJldHVybiBzdWJjbGFzcy5nZXRMdWJPZkluc3RhbnRpYXRlZFN1YmNsYXNzZXMoKTsKICAgIH0KICAgIHJldHVybiBjbHM7CiAgfQoKICB2b2lkIHByaW50T24oU3RyaW5nQnVmZmVyIHNiLCBTdHJpbmcgaW5kZW50YXRpb24sCiAgICAgIHtib29sIGluc3RhbnRpYXRlZE9ubHk6IGZhbHNlLAogICAgICBib29sIHNvcnRlZDogdHJ1ZSwKICAgICAgQ2xhc3NFbnRpdHkgd2l0aFJlc3BlY3RUb30pIHsKICAgIGJvb2wgaXNSZWxhdGVkVG8oQ2xhc3NFbnRpdHkgX3N1YmNsYXNzKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IHRoaXMgZm9yIGtlcm5lbCBiYXNlZCBlbGVtZW50czoKICAgICAgLy8gcmV0dXJuIHN1YmNsYXNzID09IHdpdGhSZXNwZWN0VG8gfHwKICAgICAgLy8gICAgc3ViY2xhc3MuaW1wbGVtZW50c0ludGVyZmFjZSh3aXRoUmVzcGVjdFRvKTsKICAgIH0KCiAgICBzYi53cml0ZShpbmRlbnRhdGlvbik7CiAgICBpZiAoY2xzLmlzQWJzdHJhY3QpIHsKICAgICAgc2Iud3JpdGUoJ2Fic3RyYWN0ICcpOwogICAgfQogICAgc2Iud3JpdGUoJ2NsYXNzICR7Y2xzLm5hbWV9OicpOwogICAgaWYgKGlzRGlyZWN0bHlJbnN0YW50aWF0ZWQpIHsKICAgICAgc2Iud3JpdGUoJyBkaXJlY3RseScpOwogICAgfQogICAgaWYgKGlzSW5kaXJlY3RseUluc3RhbnRpYXRlZCkgewogICAgICBzYi53cml0ZSgnIGluZGlyZWN0bHknKTsKICAgIH0KICAgIGlmIChpc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWQpIHsKICAgICAgc2Iud3JpdGUoJyBhYnN0cmFjdGx5Jyk7CiAgICB9CiAgICBzYi53cml0ZSgnIFsnKTsKICAgIGlmIChfZGlyZWN0U3ViY2xhc3Nlcy5pc0VtcHR5KSB7CiAgICAgIHNiLndyaXRlKCddJyk7CiAgICB9IGVsc2UgewogICAgICBkeW5hbWljIHN1YmNsYXNzZXMgPSBfZGlyZWN0U3ViY2xhc3NlczsKICAgICAgaWYgKHNvcnRlZCkgewogICAgICAgIHN1YmNsYXNzZXMgPSBfZGlyZWN0U3ViY2xhc3Nlcy50b0xpc3QoKQogICAgICAgICAgLi5zb3J0KChhLCBiKSB7CiAgICAgICAgICAgIHJldHVybiBhLmNscy5uYW1lLmNvbXBhcmVUbyhiLmNscy5uYW1lKTsKICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIGJvb2wgbmVlZHNDb21tYSA9IGZhbHNlOwogICAgICBmb3IgKENsYXNzSGllcmFyY2h5Tm9kZSBjaGlsZCBpbiBzdWJjbGFzc2VzKSB7CiAgICAgICAgaWYgKGluc3RhbnRpYXRlZE9ubHkgJiYgIWNoaWxkLmlzSW5zdGFudGlhdGVkKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHdpdGhSZXNwZWN0VG8gIT0gbnVsbCAmJgogICAgICAgICAgICAhY2hpbGQuYW55U3ViY2xhc3MoaXNSZWxhdGVkVG8sIENsYXNzSGllcmFyY2h5Tm9kZS5BTEwpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICAgIHNiLndyaXRlKCcsXG4nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2Iud3JpdGUoJ1xuJyk7CiAgICAgICAgfQogICAgICAgIGNoaWxkLnByaW50T24oc2IsICckaW5kZW50YXRpb24gICcsCiAgICAgICAgICAgIGluc3RhbnRpYXRlZE9ubHk6IGluc3RhbnRpYXRlZE9ubHksCiAgICAgICAgICAgIHNvcnRlZDogc29ydGVkLAogICAgICAgICAgICB3aXRoUmVzcGVjdFRvOiB3aXRoUmVzcGVjdFRvKTsKICAgICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAobmVlZHNDb21tYSkgewogICAgICAgIHNiLndyaXRlKCdcbicpOwogICAgICAgIHNiLndyaXRlKCckaW5kZW50YXRpb25dJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2Iud3JpdGUoJ10nKTsKICAgICAgfQogICAgfQogIH0KCiAgU3RyaW5nIGR1bXAoCiAgICAgIHtTdHJpbmcgaW5kZW50YXRpb246ICcnLAogICAgICBib29sIGluc3RhbnRpYXRlZE9ubHk6IGZhbHNlLAogICAgICBDbGFzc0VudGl0eSB3aXRoUmVzcGVjdFRvfSkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgcHJpbnRPbihzYiwgaW5kZW50YXRpb24sCiAgICAgICAgaW5zdGFudGlhdGVkT25seTogaW5zdGFudGlhdGVkT25seSwgd2l0aFJlc3BlY3RUbzogd2l0aFJlc3BlY3RUbyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IGNscy50b1N0cmluZygpOwp9CgovLy8gT2JqZWN0IGhvbGRpbmcgdGhlIHN1YmNsYXNzIGFuZCBzdWJ0eXBlIHJlbGF0aW9uIGZvciBhIHNpbmdsZQovLy8gW0NsYXNzRW50aXR5XS4KLy8vCi8vLyBUaGUgc3ViY2xhc3MgcmVsYXRpb24gZm9yIGEgY2xhc3MgYENgIGlzIG1vZGVsbGVkIHRocm91Z2ggYSByZWZlcmVuY2UgdG8KLy8vIHRoZSBbQ2xhc3NIaWVyYXJjaHlOb2RlXSBmb3IgYENgIGluIHRoZSBnbG9iYWwgW0NsYXNzSGllcmFyY2h5Tm9kZV0gdHJlZQovLy8gY29tcHV0ZWQgaW4gW1dvcmxkXS4KLy8vCi8vLyBUaGUgc3VidHlwZSByZWxhdGlvbiBmb3IgYSBjbGFzcyBgQ2AgaXMgbW9kZWxsZWQgdGhyb3VnaCBhIGNvbGxlY3Rpb24gb2YKLy8vIGRpc2pvaW50IFtDbGFzc0hpZXJhcmNoeU5vZGVdIHN1YnRyZWVzLiBUaGUgc3ViY2xhc3NlcyBvZiBgQ2AsIG1vZGVsbGVkCi8vLyB0aHJvdWdoIHRoZSBhZm9yZW1lbnRpb25lZCBbQ2xhc3NIaWVyYXJjaHlOb2RlXSBwb2ludGVyLCBhcmUgZXh0ZW5kZWQgd2l0aAovLy8gdGhlIHN1YnR5cGVzIHRoYXQgZG8gbm90IGV4dGVuZCBgQ2AgdGhyb3VnaCBhIGxpc3Qgb2YgYWRkaXRpb25hbAovLy8gW0NsYXNzSGllcmFyY2h5Tm9kZV0gbm9kZXMuIFRoaXMgbGlzdCBpcyBub3JtYWxpemVkIHRvIGNvbnRhaW4gb25seSB0aGUKLy8vIG5vZGVzIGZvciB0aGUgdG9wbW9zdCBzdWJ0eXBlcyBhbmQgaXMgZnVydGhlcm1vcmUgb3JkZXJlZCBpbiBpbmNyZWFzaW5nCi8vLyBoaWVyYXJjaHkgZGVwdGggb3JkZXIuCi8vLwovLy8gRm9yIHRoaXMgY2xhc3MgaGllcmFyY2h5OgovLy8KLy8vICAgICBjbGFzcyBBIHt9Ci8vLyAgICAgY2xhc3MgQiBleHRlbmRzIEEge30KLy8vICAgICBjbGFzcyBDIGltcGxlbWVudHMgQiB7fQovLy8gICAgIGNsYXNzIEQgaW1wbGVtZW50cyBBIHt9Ci8vLyAgICAgY2xhc3MgRSBleHRlbmRzIEQge30KLy8vICAgICBjbGFzcyBGIGltcGxlbWVudHMgRCB7fQovLy8KLy8vIHRoZSBbQ2xhc3NIaWVyYXJjaHlOb2RlXSB0cmVlIGlzCi8vLwovLy8gICAgICAgT2JqZWN0Ci8vLyAgICAgIC8gfCAgfCBcCi8vLyAgICAgQSAgQyAgRCAgRgovLy8gICAgIHwgICAgIHwKLy8vICAgICBCICAgICBFCi8vLwovLy8gYW5kIHRoZSBbQ2xhc3NTZXRdIGZvciBgQWAgaG9sZHMgdGhlc2UgW0NsYXNzSGllcmFyY2h5Tm9kZV0gbm9kZXM6Ci8vLwovLy8gICAgICBBICAtPiAgW0MsIEQsIEZdCi8vLwovLy8gVGhlIHN1YnR5cGVzIGBCYCBhbmQgYEVgIGFyZSBub3QgZGlyZWN0bHkgbW9kZWxlZCBiZWNhdXNlIHRoZXkgYXJlIGltcGxpZWQKLy8vIGJ5IHRoZWlyIHN1YmNsYXNzIHJlbGF0aW9uIHRvIGBBYCBhbmQgYERgLCByZXNwZWN0aXZlbHkuIFRoaXMgY2FuIGJlIHNlZW4KLy8vIGlmIHdlIGV4cGFuZCB0aGUgc3ViY2xhc3Mgc3VidHJlZXM6Ci8vLwovLy8gICAgICBBICAtPiAgW0MsIEQsIEZdCi8vLyAgICAgIHwgICAgICAgICAgfAovLy8gICAgICBCICAgICAgICAgIEUKLy8vCmNsYXNzIENsYXNzU2V0IHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0NsYXNzU2V0XSBvYmplY3RzIGluIGEgZGVidWdnaW5nCiAgLy8vIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2NsYXNzLXNldCc7CgogIGZpbmFsIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlOwogIENsYXNzRW50aXR5IF9sZWFzdFVwcGVySW5zdGFudGlhdGVkU3VidHlwZTsKCiAgLy8vIEEgbGlzdCBvZiB0aGUgY2xhc3MgaGllcmFyY2h5IG5vZGVzIGZvciB0aGUgc3VidHlwZXMgdGhhdCBkZWNsYXJlIGEKICAvLy8gc3VidHlwZSByZWxhdGlvbnNoaXAgdG8gW2Nsc10gZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZQogIC8vLwogIC8vLyAgICAgY2xhc3MgQSB7fQogIC8vLyAgICAgY2xhc3MgQiBleHRlbmRzIEEge30KICAvLy8gICAgIGNsYXNzIEMgaW1wbGVtZW50cyBCIHt9CiAgLy8vICAgICBjbGFzcyBEIGltcGxlbWVudHMgQSB7fQogIC8vLyAgICAgY2xhc3MgRSBleHRlbmRzIEQge30KICAvLy8KICAvLy8gVGhlIGNsYXNzIGhpZXJhcmNoeSBub2RlcyBmb3IgY2xhc3NlcyBgQ2AgYW5kIGBEYCBhcmUgaW4gW19zdWJ0eXBlc10uIGBDYAogIC8vLyBiZWNhdXNlIGl0IGltcGxlbWVudHMgYEFgIHRocm91Z2ggYEJgIGFuZCBgRGAgYmVjYXVzZSBpdCBpbXBsZW1lbnRzIGBBYAogIC8vLyBkaXJlY3RseS4gYEVgIGFsc28gaW1wbGVtZW50cyBgQWAgdGhyb3VnaCBpdHMgZXh0ZW5zaW9uIG9mIGBEYCBhbmQgaXQgaXMKICAvLy8gdGhlcmVmb3JlIGluY2x1ZGVkIHRocm91Z2ggdGhlIGNsYXNzIGhpZXJhcmNoeSBub2RlIGZvciBgRGAuCiAgLy8vCiAgTGlzdDxDbGFzc0hpZXJhcmNoeU5vZGU+IF9zdWJ0eXBlczsKCiAgLy8vIEEgbGlzdCBvZiB0aGUgY2xhc3MgaGllcmFyY2h5IG5vZGVzIGZvciB0aGUgY2xhc3MgdGhhdCBkaXJlY3RseSBtaXggaW4KICAvLy8gW2Nsc10uCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZQogIC8vLwogIC8vLyAgICAgY2xhc3MgQSB7fQogIC8vLyAgICAgY2xhc3MgQiBleHRlbmRzIE9iamVjdCB3aXRoIEEge30KICAvLy8gICAgIGNsYXNzIEMgPSBPYmplY3Qgd2l0aCBBOwogIC8vLyAgICAgY2xhc3MgRCBleHRlbmRzIEIge30KICAvLy8gICAgIGNsYXNzIEUgZXh0ZW5kcyBDIHt9CiAgLy8vCiAgLy8vIFRoZSBjbGFzcyBoaWVyYXJjaHkgbm9kZXMgZm9yIHRoZSB1bm5hbWVkIG1peGluIGFwcGxpY2F0aW9uIGBPYmplY3QrQWAgYW5kCiAgLy8vIHRoZSBuYW1lZCBtaXhpbiBhcHBsaWNhdGlvbiBgQ2AgYXJlIGluIFtfbWl4aW5BcHBsaWNhdGlvbnNdLgogIC8vLwogIExpc3Q8Q2xhc3NIaWVyYXJjaHlOb2RlPiBfbWl4aW5BcHBsaWNhdGlvbnM7CgogIENsYXNzU2V0KHRoaXMubm9kZSk7CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQ2xhc3NTZXRdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgQ2xhc3NTZXQucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgTWFwPENsYXNzRW50aXR5LCBDbGFzc0hpZXJhcmNoeU5vZGU+IG5vZGVNYXApIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUgPSBub2RlTWFwW3NvdXJjZS5yZWFkQ2xhc3MoKV07CiAgICBMaXN0PENsYXNzSGllcmFyY2h5Tm9kZT4gc3VidHlwZXMgPSBzb3VyY2UucmVhZExpc3QoKCkgewogICAgICByZXR1cm4gbm9kZU1hcFtzb3VyY2UucmVhZENsYXNzKCldOwogICAgfSwgZW1wdHlBc051bGw6IHRydWUpOwogICAgTGlzdDxDbGFzc0hpZXJhcmNoeU5vZGU+IG1peGluQXBwbGljYXRpb25zID0gc291cmNlLnJlYWRMaXN0KCgpIHsKICAgICAgcmV0dXJuIG5vZGVNYXBbc291cmNlLnJlYWRDbGFzcygpXTsKICAgIH0sIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgQ2xhc3NTZXQobm9kZSkKICAgICAgLi5fc3VidHlwZXMgPSBzdWJ0eXBlcwogICAgICAuLl9taXhpbkFwcGxpY2F0aW9ucyA9IG1peGluQXBwbGljYXRpb25zOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbQ2xhc3NTZXRdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlQ2xhc3Mobm9kZS5jbHMpOwogICAgc2luay53cml0ZUxpc3QoX3N1YnR5cGVzLCAoQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUpIHsKICAgICAgc2luay53cml0ZUNsYXNzKG5vZGUuY2xzKTsKICAgIH0sIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChfbWl4aW5BcHBsaWNhdGlvbnMsIChDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSkgewogICAgICBzaW5rLndyaXRlQ2xhc3Mobm9kZS5jbHMpOwogICAgfSwgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBDbGFzc0VudGl0eSBnZXQgY2xzID0+IG5vZGUuY2xzOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYG90aGVyLmNsc2AgaXMgYSBzdWJjbGFzcyBvZiBbY2xzXS4KICBib29sIGhhc1N1YmNsYXNzKENsYXNzSGllcmFyY2h5Tm9kZSBvdGhlcikgPT4gbm9kZS5oYXNTdWJjbGFzcyhvdGhlcik7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBgb3RoZXIuY2xzYCBpcyBhIHN1YnR5cGUgb2YgW2Nsc10uCiAgYm9vbCBoYXNTdWJ0eXBlKENsYXNzSGllcmFyY2h5Tm9kZSBvdGhlcikgewogICAgaWYgKGhhc1N1YmNsYXNzKG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAoX3N1YnR5cGVzICE9IG51bGwpIHsKICAgICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgc3VidHlwZU5vZGUgaW4gX3N1YnR5cGVzKSB7CiAgICAgICAgaWYgKHN1YnR5cGVOb2RlLmhhc1N1YmNsYXNzKG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlyZWN0bHkgaW5zdGFudGlhdGVkIHN1YnR5cGVzIG9mIFtjbHNdLgogIGludCBnZXQgaW5zdGFudGlhdGVkU3VidHlwZUNvdW50IHsKICAgIGludCBjb3VudCA9IG5vZGUuaW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudDsKICAgIGlmIChfc3VidHlwZXMgIT0gbnVsbCkgewogICAgICBmb3IgKENsYXNzSGllcmFyY2h5Tm9kZSBzdWJ0eXBlTm9kZSBpbiBfc3VidHlwZXMpIHsKICAgICAgICBpZiAoc3VidHlwZU5vZGUuaXNFeHBsaWNpdGx5SW5zdGFudGlhdGVkKSB7CiAgICAgICAgICBjb3VudCsrOwogICAgICAgIH0KICAgICAgICBjb3VudCArPSBzdWJ0eXBlTm9kZS5pbnN0YW50aWF0ZWRTdWJjbGFzc0NvdW50OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGluc3RhbnRpYXRlZCBzdWJ0eXBlcyBvZiBbY2xzXSBhcmUgc3ViY2xhc3NlcyBvZgogIC8vLyBbY2xzXS4KICBib29sIGdldCBoYXNPbmx5SW5zdGFudGlhdGVkU3ViY2xhc3NlcyB7CiAgICBpZiAoX3N1YnR5cGVzICE9IG51bGwpIHsKICAgICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgc3VidHlwZU5vZGUgaW4gX3N1YnR5cGVzKSB7CiAgICAgICAgaWYgKHN1YnR5cGVOb2RlLmlzSW5zdGFudGlhdGVkKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBSZXR1cm5zIGFuIFtJdGVyYWJsZV0gb2YgdGhlIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgW2Nsc10gZGlyZWN0bHkgb3IKICAvLy8gdGhyb3VnaCBzdXBlcnR5cGVzLgogIC8vLwogIC8vLyBBIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBbY2xzXSB0aHJvdWdoIGl0cyBzdXBlcmNsYXNzZXMgaXMgbm90IGluY2x1ZGVkIGluCiAgLy8vIHRoZSBpdGVyYWJsZS4KICBJdGVyYWJsZTxDbGFzc0hpZXJhcmNoeU5vZGU+IGdldCBzdWJ0eXBlTm9kZXMgewogICAgcmV0dXJuIF9zdWJ0eXBlcyA/PyBjb25zdCA8Q2xhc3NIaWVyYXJjaHlOb2RlPltdOwogIH0KCiAgLy8vIFJldHVybnMgYW4gW0l0ZXJhYmxlXSBvZiB0aGUgY2xhc3NlcyB0aGF0IG1peCBpbiBbY2xzXSBkaXJlY3RseS4KICBJdGVyYWJsZTxDbGFzc0hpZXJhcmNoeU5vZGU+IGdldCBtaXhpbkFwcGxpY2F0aW9uTm9kZXMgewogICAgcmV0dXJuIF9taXhpbkFwcGxpY2F0aW9ucyA/PyBjb25zdCA8Q2xhc3NIaWVyYXJjaHlOb2RlPltdOwogIH0KCiAgLy8vIFJldHVybnMgYW4gW0l0ZXJhYmxlXSBvZiB0aGUgc3ViY2xhc3NlcyBvZiBbY2xzXSBwb3NzaWJseSBpbmNsdWRpbmcgW2Nsc10uCiAgLy8vCiAgLy8vIFN1YmNsYXNzZXMgYXJlIGluY2x1ZGVkIGlmIHRoZWlyIGluc3RhbnRpYXRpb24gcHJvcGVydGllcyBpbnRlcnNlY3Qgd2l0aAogIC8vLyB0aGVpciBjb3JyZXNwb25kaW5nIFtJbnN0YW50aWF0aW9uXSB2YWx1ZXMgaW4gW21hc2tdLiBJZiBbc3RyaWN0XSBpcwogIC8vLyBgdHJ1ZWAsIFtjbHNdIGl0c2VsZiBpcyBfbm90XyByZXR1cm5lZC4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gc3ViY2xhc3Nlc0J5TWFzayhFbnVtU2V0PEluc3RhbnRpYXRpb24+IG1hc2ssCiAgICAgIHtib29sIHN0cmljdDogZmFsc2V9KSB7CiAgICByZXR1cm4gbm9kZS5zdWJjbGFzc2VzQnlNYXNrKG1hc2ssIHN0cmljdDogc3RyaWN0KTsKICB9CgogIC8vLyBSZXR1cm5zIGFuIFtJdGVyYWJsZV0gb2YgdGhlIHN1YnR5cGVzIG9mIFtjbHNdIHBvc3NpYmx5IGluY2x1ZGluZyBbY2xzXS4KICAvLy8KICAvLy8gVGhlIGRpcmVjdGx5IGluc3RhbnRpYXRlZCwgaW5kaXJlY3RseSBpbnN0YW50aWF0ZWQgYW5kIHVuaW5zdGFudGlhdGVkCiAgLy8vIHN1YnR5cGVzIG9mIFtjbHNdIGFyZSByZXR1cm5lZCBpZiBbaW5jbHVkZURpcmVjdGx5SW5zdGFudGlhdGVkXSwKICAvLy8gW2luY2x1ZGVJbmRpcmVjdGx5SW5zdGFudGlhdGVkXSwgYW5kIFtpbmNsdWRlVW5pbnN0YW50aWF0ZWRdIGFyZSBgdHJ1ZWAsCiAgLy8vIHJlc3BlY3RpdmVseS4gSWYgW3N0cmljdF0gaXMgYHRydWVgLCBbY2xzXSBpdHNlbGYgaXMgX25vdF8gcmV0dXJuZWQuCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHN1YnR5cGVzKAogICAgICB7Ym9vbCBpbmNsdWRlRGlyZWN0bHlJbnN0YW50aWF0ZWQ6IHRydWUsCiAgICAgIGJvb2wgaW5jbHVkZUluZGlyZWN0bHlJbnN0YW50aWF0ZWQ6IHRydWUsCiAgICAgIGJvb2wgaW5jbHVkZVVuaW5zdGFudGlhdGVkOiB0cnVlLAogICAgICBib29sIHN0cmljdDogZmFsc2V9KSB7CiAgICBFbnVtU2V0PEluc3RhbnRpYXRpb24+IG1hc2sgPSBDbGFzc0hpZXJhcmNoeU5vZGUuY3JlYXRlTWFzaygKICAgICAgICBpbmNsdWRlRGlyZWN0bHlJbnN0YW50aWF0ZWQ6IGluY2x1ZGVEaXJlY3RseUluc3RhbnRpYXRlZCwKICAgICAgICBpbmNsdWRlSW5kaXJlY3RseUluc3RhbnRpYXRlZDogaW5jbHVkZUluZGlyZWN0bHlJbnN0YW50aWF0ZWQsCiAgICAgICAgaW5jbHVkZVVuaW5zdGFudGlhdGVkOiBpbmNsdWRlVW5pbnN0YW50aWF0ZWQpOwogICAgcmV0dXJuIHN1YnR5cGVzQnlNYXNrKG1hc2ssIHN0cmljdDogc3RyaWN0KTsKICB9CgogIC8vLyBSZXR1cm5zIGFuIFtJdGVyYWJsZV0gb2YgdGhlIHN1YnR5cGVzIG9mIFtjbHNdIHBvc3NpYmx5IGluY2x1ZGluZyBbY2xzXS4KICAvLy8KICAvLy8gU3VidHlwZXMgYXJlIGluY2x1ZGVkIGlmIHRoZWlyIGluc3RhbnRpYXRpb24gcHJvcGVydGllcyBpbnRlcnNlY3Qgd2l0aAogIC8vLyB0aGVpciBjb3JyZXNwb25kaW5nIFtJbnN0YW50aWF0aW9uXSB2YWx1ZXMgaW4gW21hc2tdLiBJZiBbc3RyaWN0XSBpcwogIC8vLyBgdHJ1ZWAsIFtjbHNdIGl0c2VsZiBpcyBfbm90XyByZXR1cm5lZC4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gc3VidHlwZXNCeU1hc2soRW51bVNldDxJbnN0YW50aWF0aW9uPiBtYXNrLAogICAgICB7Ym9vbCBzdHJpY3Q6IGZhbHNlfSkgewogICAgaWYgKF9zdWJ0eXBlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBub2RlLnN1YmNsYXNzZXNCeU1hc2sobWFzaywgc3RyaWN0OiBzdHJpY3QpOwogICAgfQoKICAgIHJldHVybiBuZXcgU3VidHlwZXNJdGVyYWJsZS5TdWJ0eXBlc0l0ZXJhdG9yKHRoaXMsIG1hc2ssCiAgICAgICAgaW5jbHVkZVJvb3Q6ICFzdHJpY3QpOwogIH0KCiAgLy8vIEFwcGxpZXMgW3ByZWRpY2F0ZV0gdG8gZWFjaCBzdWJjbGFzcyBvZiBbY2xzXSBtYXRjaGluZyB0aGUgY3JpdGVyaWEKICAvLy8gc3BlY2lmaWVkIGJ5IFttYXNrXSBhbmQgW3N0cmljdF0uIElmIFtwcmVkaWNhdGVdIHJldHVybnMgYHRydWVgIG9uIGEKICAvLy8gY2xhc3MsIHZpc2l0YXRpb24gaXMgc3RvcHBlZCBpbW1lZGlhdGVseSBhbmQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgLgogIC8vLwogIC8vLyBbcHJlZGljYXRlXSBpcyBhcHBsaWVkIHRvIHN1YmNsYXNzZXMgaWYgdGhlaXIgaW5zdGFudGlhdGlvbiBwcm9wZXJ0aWVzCiAgLy8vIGludGVyc2VjdCB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgW0luc3RhbnRpYXRpb25dIHZhbHVlcyBpbiBbbWFza10uIElmCiAgLy8vIFtzdHJpY3RdIGlzIGB0cnVlYCwgW3ByZWRpY2F0ZV0gaXMgX25vdF8gY2FsbGVkIG9uIFtjbHNdIGl0c2VsZi4KICBib29sIGFueVN1YmNsYXNzKGJvb2wgcHJlZGljYXRlKENsYXNzRW50aXR5IGNscyksIEVudW1TZXQ8SW5zdGFudGlhdGlvbj4gbWFzaywKICAgICAge2Jvb2wgc3RyaWN0OiBmYWxzZX0pIHsKICAgIHJldHVybiBub2RlLmFueVN1YmNsYXNzKHByZWRpY2F0ZSwgbWFzaywgc3RyaWN0OiBzdHJpY3QpOwogIH0KCiAgLy8vIEFwcGxpZXMgW2ZdIHRvIGVhY2ggc3ViY2xhc3Mgb2YgW2Nsc10gbWF0Y2hpbmcgdGhlIGNyaXRlcmlhIHNwZWNpZmllZCBieQogIC8vLyBbbWFza10gYW5kIFtzdHJpY3RdLgogIC8vLwogIC8vLyBbZl0gaXMgYSBhcHBsaWVkIHRvIHN1YmNsYXNzZXMgaWYgdGhlaXIgaW5zdGFudGlhdGlvbiBwcm9wZXJ0aWVzIGludGVyc2VjdAogIC8vLyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgW0luc3RhbnRpYXRpb25dIHZhbHVlcyBpbiBbbWFza10uIElmIFtzdHJpY3RdIGlzCiAgLy8vIGB0cnVlYCwgW2ZdIGlzIF9ub3RfIGNhbGxlZCBvbiBbY2xzXSBpdHNlbGYuCiAgLy8vCiAgLy8vIFRoZSB2aXNpdGF0aW9uIG9mIHN1YmNsYXNzZXMgY2FuIGJlIGN1dCBzaG9ydCBieSB0aGUgcmV0dXJuIHZhbHVlIG9mIFtmXS4KICAvLy8gSWYgW0ZvckVhY2guU1RPUF0gaXMgcmV0dXJuZWQsIG5vIGZ1cnRoZXIgY2xhc3NlcyBhcmUgdmlzaXRlZCBhbmQgdGhlCiAgLy8vIGZ1bmN0aW9uIHN0b3BzIGltbWVkaWF0ZWx5LiBJZiBbRm9yRWFjaC5TS0lQX1NVQkNMQVNTRVNdIGlzIHJldHVybmVkLCB0aGUKICAvLy8gc3ViY2xhc3NlcyBvZiB0aGUgbGFzdCB2aXNpdGVkIGNsYXNzIGFyZSBza2lwcGVkLCBidXQgdmlzaXRhdGlvbgogIC8vLyBjb250aW51ZXMuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGlzIGVpdGhlciBbRm9yRWFjaC5TVE9QXSwgaWYKICAvLy8gdmlzaXRhdGlvbiB3YXMgc3RvcHBlZCwgb3IgW0ZvckVhY2guQ09OVElOVUVdIGlmIHZpc2l0YXRpb24gY29udGludWVkIHRvCiAgLy8vIHRoZSBlbmQuCiAgSXRlcmF0aW9uU3RlcCBmb3JFYWNoU3ViY2xhc3MoRm9yRWFjaEZ1bmN0aW9uIGYsIEVudW1TZXQ8SW5zdGFudGlhdGlvbj4gbWFzaywKICAgICAge2Jvb2wgc3RyaWN0OiBmYWxzZX0pIHsKICAgIHJldHVybiBub2RlLmZvckVhY2hTdWJjbGFzcyhmLCBtYXNrLCBzdHJpY3Q6IHN0cmljdCk7CiAgfQoKICAvLy8gQXBwbGllcyBbcHJlZGljYXRlXSB0byBlYWNoIHN1YnR5cGUgb2YgW2Nsc10gbWF0Y2hpbmcgdGhlIGNyaXRlcmlhCiAgLy8vIHNwZWNpZmllZCBieSBbbWFza10gYW5kIFtzdHJpY3RdLiBJZiBbcHJlZGljYXRlXSByZXR1cm5zIGB0cnVlYCBvbiBhCiAgLy8vIGNsYXNzLCB2aXNpdGF0aW9uIGlzIHN0b3BwZWQgaW1tZWRpYXRlbHkgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYC4KICAvLy8KICAvLy8gW3ByZWRpY2F0ZV0gaXMgYXBwbGllZCB0byBzdWJ0eXBlcyBpZiB0aGVpciBpbnN0YW50aWF0aW9uIHByb3BlcnRpZXMKICAvLy8gaW50ZXJzZWN0IHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyBbSW5zdGFudGlhdGlvbl0gdmFsdWVzIGluIFttYXNrXS4gSWYKICAvLy8gW3N0cmljdF0gaXMgYHRydWVgLCBbcHJlZGljYXRlXSBpcyBfbm90XyBjYWxsZWQgb24gW2Nsc10gaXRzZWxmLgogIGJvb2wgYW55U3VidHlwZShib29sIHByZWRpY2F0ZShDbGFzc0VudGl0eSBjbHMpLCBFbnVtU2V0PEluc3RhbnRpYXRpb24+IG1hc2ssCiAgICAgIHtib29sIHN0cmljdDogZmFsc2V9KSB7CiAgICBJdGVyYXRpb25TdGVwIHdyYXBwZXIoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICAgIHJldHVybiBwcmVkaWNhdGUoY2xzKSA/IEl0ZXJhdGlvblN0ZXAuU1RPUCA6IEl0ZXJhdGlvblN0ZXAuQ09OVElOVUU7CiAgICB9CgogICAgcmV0dXJuIGZvckVhY2hTdWJ0eXBlKHdyYXBwZXIsIG1hc2ssIHN0cmljdDogc3RyaWN0KSA9PSBJdGVyYXRpb25TdGVwLlNUT1A7CiAgfQoKICAvLy8gQXBwbGllcyBbZl0gdG8gZWFjaCBzdWJ0eXBlIG9mIFtjbHNdIG1hdGNoaW5nIHRoZSBjcml0ZXJpYSBzcGVjaWZpZWQgYnkKICAvLy8gW21hc2tdIGFuZCBbc3RyaWN0XS4KICAvLy8KICAvLy8gW2ZdIGlzIGEgYXBwbGllZCB0byBzdWJ0eXBlcyBpZiB0aGVpciBpbnN0YW50aWF0aW9uIHByb3BlcnRpZXMgaW50ZXJzZWN0CiAgLy8vIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyBbSW5zdGFudGlhdGlvbl0gdmFsdWVzIGluIFttYXNrXS4gSWYgW3N0cmljdF0gaXMKICAvLy8gYHRydWVgLCBbZl0gaXMgX25vdF8gY2FsbGVkIG9uIFtjbHNdIGl0c2VsZi4KICAvLy8KICAvLy8gVGhlIHZpc2l0YXRpb24gb2Ygc3VidHlwZXMgY2FuIGJlIGN1dCBzaG9ydCBieSB0aGUgcmV0dXJuIHZhbHVlIG9mIFtmXS4KICAvLy8gSWYgW0ZvckVhY2guU1RPUF0gaXMgcmV0dXJuZWQsIG5vIGZ1cnRoZXIgY2xhc3NlcyBhcmUgdmlzaXRlZCBhbmQgdGhlCiAgLy8vIGZ1bmN0aW9uIHN0b3BzIGltbWVkaWF0ZWx5LiBJZiBbRm9yRWFjaC5TS0lQX1NVQkNMQVNTRVNdIGlzIHJldHVybmVkLCB0aGUKICAvLy8gc3ViY2xhc3NlcyBvZiB0aGUgbGFzdCB2aXNpdGVkIGNsYXNzIGFyZSBza2lwcGVkLCBidXQgdmlzaXRhdGlvbgogIC8vLyBjb250aW51ZXMuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGlzIGVpdGhlciBbRm9yRWFjaC5TVE9QXSwgaWYKICAvLy8gdmlzaXRhdGlvbiB3YXMgc3RvcHBlZCwgb3IgW0ZvckVhY2guQ09OVElOVUVdIGlmIHZpc2l0YXRpb24gY29udGludWVkIHRvCiAgLy8vIHRoZSBlbmQuCiAgSXRlcmF0aW9uU3RlcCBmb3JFYWNoU3VidHlwZShGb3JFYWNoRnVuY3Rpb24gZiwgRW51bVNldDxJbnN0YW50aWF0aW9uPiBtYXNrLAogICAgICB7Ym9vbCBzdHJpY3Q6IGZhbHNlfSkgewogICAgSXRlcmF0aW9uU3RlcCBuZXh0U3RlcCA9CiAgICAgICAgbm9kZS5mb3JFYWNoU3ViY2xhc3MoZiwgbWFzaywgc3RyaWN0OiBzdHJpY3QpID8/IEl0ZXJhdGlvblN0ZXAuQ09OVElOVUU7CiAgICBpZiAobmV4dFN0ZXAgPT0gSXRlcmF0aW9uU3RlcC5DT05USU5VRSAmJiBfc3VidHlwZXMgIT0gbnVsbCkgewogICAgICBmb3IgKENsYXNzSGllcmFyY2h5Tm9kZSBzdWJjbGFzcyBpbiBfc3VidHlwZXMpIHsKICAgICAgICBJdGVyYXRpb25TdGVwIHN1YkZvckVhY2ggPSBzdWJjbGFzcy5mb3JFYWNoU3ViY2xhc3MoZiwgbWFzayk7CiAgICAgICAgaWYgKHN1YkZvckVhY2ggPT0gSXRlcmF0aW9uU3RlcC5TVE9QKSB7CiAgICAgICAgICByZXR1cm4gc3ViRm9yRWFjaDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGFzc2VydChuZXh0U3RlcCAhPSBJdGVyYXRpb25TdGVwLlNLSVBfU1VCQ0xBU1NFUyk7CiAgICByZXR1cm4gbmV4dFN0ZXA7CiAgfQoKICAvLy8gQWRkcyBbc3VidHlwZV0gYXMgYSBzdWJ0eXBlIG9mIFtjbHNdLgogIHZvaWQgYWRkU3VidHlwZShDbGFzc0hpZXJhcmNoeU5vZGUgc3VidHlwZSkgewogICAgaWYgKG5vZGUuY29udGFpbnMoc3VidHlwZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKF9zdWJ0eXBlcyA9PSBudWxsKSB7CiAgICAgIF9zdWJ0eXBlcyA9IDxDbGFzc0hpZXJhcmNoeU5vZGU+W3N1YnR5cGVdOwogICAgfSBlbHNlIHsKICAgICAgaW50IGhpZXJhcmNoeURlcHRoID0gc3VidHlwZS5oaWVyYXJjaHlEZXB0aDsKICAgICAgTGlzdDxDbGFzc0hpZXJhcmNoeU5vZGU+IG5ld1N1YnR5cGVzID0gPENsYXNzSGllcmFyY2h5Tm9kZT5bXTsKICAgICAgYm9vbCBhZGRlZCA9IGZhbHNlOwogICAgICBmb3IgKENsYXNzSGllcmFyY2h5Tm9kZSBvdGhlclN1YnR5cGUgaW4gX3N1YnR5cGVzKSB7CiAgICAgICAgaW50IG90aGVySGllcmFyY2h5RGVwdGggPSBvdGhlclN1YnR5cGUuaGllcmFyY2h5RGVwdGg7CiAgICAgICAgaWYgKGhpZXJhcmNoeURlcHRoID09IG90aGVySGllcmFyY2h5RGVwdGgpIHsKICAgICAgICAgIGlmIChzdWJ0eXBlID09IG90aGVyU3VidHlwZSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBbb3RoZXJTdWJ0eXBlXSBpcyB1bnJlbGF0ZWQgdG8gW3N1YnR5cGVdLgogICAgICAgICAgICBuZXdTdWJ0eXBlcy5hZGQob3RoZXJTdWJ0eXBlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGhpZXJhcmNoeURlcHRoID4gb3RoZXJTdWJ0eXBlLmhpZXJhcmNoeURlcHRoKSB7CiAgICAgICAgICAvLyBbb3RoZXJTdWJ0eXBlXSBjb3VsZCBiZSBhIHN1cGVyY2xhc3Mgb2YgW3N1YnR5cGVdLgogICAgICAgICAgaWYgKG90aGVyU3VidHlwZS5jb250YWlucyhzdWJ0eXBlKSkgewogICAgICAgICAgICAvLyBbc3VidHlwZV0gaXMgYWxyZWFkeSBpbiB0aGlzIHNldC4KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gW290aGVyU3VidHlwZV0gaXMgdW5yZWxhdGVkIHRvIFtzdWJ0eXBlXS4KICAgICAgICAgICAgbmV3U3VidHlwZXMuYWRkKG90aGVyU3VidHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghYWRkZWQpIHsKICAgICAgICAgICAgLy8gSW5zZXJ0IFtzdWJ0eXBlXSBiZWZvcmUgb3RoZXIgc3VidHlwZXMgb2YgaGlnaGVyIGhpZXJhcmNoeSBkZXB0aC4KICAgICAgICAgICAgbmV3U3VidHlwZXMuYWRkKHN1YnR5cGUpOwogICAgICAgICAgICBhZGRlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBbc3VidHlwZV0gY291bGQgYmUgYSBzdXBlcmNsYXNzIG9mIFtvdGhlclN1YnR5cGVdLgogICAgICAgICAgaWYgKHN1YnR5cGUuY29udGFpbnMob3RoZXJTdWJ0eXBlKSkgewogICAgICAgICAgICAvLyBSZXBsYWNlIFtvdGhlclN1YnR5cGVdLgogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV3U3VidHlwZXMuYWRkKG90aGVyU3VidHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghYWRkZWQpIHsKICAgICAgICBuZXdTdWJ0eXBlcy5hZGQoc3VidHlwZSk7CiAgICAgIH0KICAgICAgX3N1YnR5cGVzID0gbmV3U3VidHlwZXM7CiAgICB9CiAgfQoKICAvLy8gQWRkcyBbbWl4aW5BcHBsaWNhdGlvbl0gYXMgYSBjbGFzcyB0aGF0IG1peGVzIGluIFtjbHNdLgogIHZvaWQgYWRkTWl4aW5BcHBsaWNhdGlvbihDbGFzc0hpZXJhcmNoeU5vZGUgbWl4aW5BcHBsaWNhdGlvbikgewogICAgaWYgKF9taXhpbkFwcGxpY2F0aW9ucyA9PSBudWxsKSB7CiAgICAgIF9taXhpbkFwcGxpY2F0aW9ucyA9IDxDbGFzc0hpZXJhcmNoeU5vZGU+W21peGluQXBwbGljYXRpb25dOwogICAgfSBlbHNlIHsKICAgICAgX21peGluQXBwbGljYXRpb25zLmFkZChtaXhpbkFwcGxpY2F0aW9uKTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSBtb3N0IHNwZWNpZmljIHN1YnR5cGUgb2YgW2Nsc10gKGluY2x1ZGluZyBbY2xzXSkgdGhhdCBpcwogIC8vLyBkaXJlY3RseSBpbnN0YW50aWF0ZWQgb3IgYSBzdXBlcmNsYXNzIG9mIGFsbCBkaXJlY3RseSBpbnN0YW50aWF0ZWQKICAvLy8gc3VidHlwZXMuIElmIG5vIHN1YnR5cGVzIG9mIFtjbHNdIGFyZSBpbnN0YW50aWF0ZWQsIGBudWxsYCBpcyByZXR1cm5lZC4KICBDbGFzc0VudGl0eSBnZXRMdWJPZkluc3RhbnRpYXRlZFN1YnR5cGVzKCkgewogICAgaWYgKF9sZWFzdFVwcGVySW5zdGFudGlhdGVkU3VidHlwZSA9PSBudWxsKSB7CiAgICAgIF9sZWFzdFVwcGVySW5zdGFudGlhdGVkU3VidHlwZSA9IF9jb21wdXRlTGVhc3RVcHBlckluc3RhbnRpYXRlZFN1YnR5cGUoKTsKICAgIH0KICAgIHJldHVybiBfbGVhc3RVcHBlckluc3RhbnRpYXRlZFN1YnR5cGU7CiAgfQoKICBDbGFzc0VudGl0eSBfY29tcHV0ZUxlYXN0VXBwZXJJbnN0YW50aWF0ZWRTdWJ0eXBlKCkgewogICAgaWYgKG5vZGUuaXNFeHBsaWNpdGx5SW5zdGFudGlhdGVkKSB7CiAgICAgIHJldHVybiBjbHM7CiAgICB9CiAgICBpZiAoX3N1YnR5cGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5vZGUuZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJjbGFzc2VzKCk7CiAgICB9CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgc3VidHlwZTsKICAgIGlmIChub2RlLmlzSW5zdGFudGlhdGVkKSB7CiAgICAgIHN1YnR5cGUgPSBub2RlOwogICAgfQogICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgc3Vibm9kZSBpbiBfc3VidHlwZXMpIHsKICAgICAgaWYgKHN1Ym5vZGUuaXNJbnN0YW50aWF0ZWQpIHsKICAgICAgICBpZiAoc3VidHlwZSA9PSBudWxsKSB7CiAgICAgICAgICBzdWJ0eXBlID0gc3Vibm9kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGNsczsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChzdWJ0eXBlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHN1YnR5cGUuZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJjbGFzc2VzKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdbXG4nKTsKICAgIG5vZGUucHJpbnRPbihzYiwgJyAgJyk7CiAgICBzYi53cml0ZSgnXG4nKTsKICAgIGlmIChfc3VidHlwZXMgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgnICBzdWJ0eXBlczpcbicpOwogICAgICBmb3IgKENsYXNzSGllcmFyY2h5Tm9kZSBub2RlIGluIF9zdWJ0eXBlcykgewogICAgICAgIG5vZGUucHJpbnRPbihzYiwgJyAgJyk7CiAgICAgICAgc2Iud3JpdGUoJ1xuJyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfbWl4aW5BcHBsaWNhdGlvbnMgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgnICBtaXhpbi1hcHBsaWNhdGlvbnM6XG4nKTsKICAgICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSBpbiBfbWl4aW5BcHBsaWNhdGlvbnMpIHsKICAgICAgICBub2RlLnByaW50T24oc2IsICcgICcpOwogICAgICAgIHNiLndyaXRlKCdcbicpOwogICAgICB9CiAgICB9CiAgICBzYi53cml0ZSgnXScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgovLy8gSXRlcmFibGUgZm9yIHN1YmNsYXNzZXMgb2YgYSBbQ2xhc3NIaWVyYXJjaHlOb2RlXS4KY2xhc3MgQ2xhc3NIaWVyYXJjaHlOb2RlSXRlcmFibGUgZXh0ZW5kcyBJdGVyYWJsZUJhc2U8Q2xhc3NFbnRpdHk+IHsKICBmaW5hbCBDbGFzc0hpZXJhcmNoeU5vZGUgcm9vdDsKICBmaW5hbCBFbnVtU2V0PEluc3RhbnRpYXRpb24+IG1hc2s7CiAgZmluYWwgYm9vbCBpbmNsdWRlUm9vdDsKCiAgQ2xhc3NIaWVyYXJjaHlOb2RlSXRlcmFibGUodGhpcy5yb290LCB0aGlzLm1hc2ssIHt0aGlzLmluY2x1ZGVSb290OiB0cnVlfSkgewogICAgaWYgKHJvb3QgPT0gbnVsbCkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIk5vIHJvb3QgZm9yIGl0ZXJhYmxlLiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmF0b3I8Q2xhc3NFbnRpdHk+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IENsYXNzSGllcmFyY2h5Tm9kZUl0ZXJhdG9yKHRoaXMpOwogIH0KfQoKLy8vIEl0ZXJhdG9yIGZvciBzdWJjbGFzc2VzIG9mIGEgW0NsYXNzSGllcmFyY2h5Tm9kZV0uCi8vLwovLy8gQ2xhc3NlcyBhcmUgcmV0dXJuZWQgaW4gcHJlLW9yZGVyIERGUyBmYXNoaW9uLgpjbGFzcyBDbGFzc0hpZXJhcmNoeU5vZGVJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPENsYXNzRW50aXR5PiB7CiAgZmluYWwgQ2xhc3NIaWVyYXJjaHlOb2RlSXRlcmFibGUgaXRlcmFibGU7CgogIC8vLyBUaGUgY2xhc3Mgbm9kZSBob2xkaW5nIHRoZSBbY3VycmVudF0gY2xhc3MuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYG51bGxgIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0byBbbW92ZU5leHRdIGFuZCBhdCB0aGUgZW5kIG9mCiAgLy8vIGl0ZXJhdGlvbiwgaS5lLiBhZnRlciBbbW92ZU5leHRdIGhhcyByZXR1cm5lZCBgZmFsc2VgLgogIENsYXNzSGllcmFyY2h5Tm9kZSBjdXJyZW50Tm9kZTsKCiAgLy8vIFN0YWNrIG9mIHBlbmRpbmcgY2xhc3Mgbm9kZXMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYG51bGxgIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0byBbbW92ZU5leHRdLgogIExpc3Q8Q2xhc3NIaWVyYXJjaHlOb2RlPiBzdGFjazsKCiAgQ2xhc3NIaWVyYXJjaHlOb2RlSXRlcmF0b3IodGhpcy5pdGVyYWJsZSk7CgogIENsYXNzSGllcmFyY2h5Tm9kZSBnZXQgcm9vdCA9PiBpdGVyYWJsZS5yb290OwoKICBib29sIGdldCBpbmNsdWRlUm9vdCA9PiBpdGVyYWJsZS5pbmNsdWRlUm9vdDsKCiAgRW51bVNldDxJbnN0YW50aWF0aW9uPiBnZXQgbWFzayA9PiBpdGVyYWJsZS5tYXNrOwoKICBib29sIGdldCBpbmNsdWRlVW5pbnN0YW50aWF0ZWQgewogICAgcmV0dXJuIG1hc2suY29udGFpbnMoSW5zdGFudGlhdGlvbi5VTklOU1RBTlRJQVRFRCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgY3VycmVudCB7CiAgICByZXR1cm4gY3VycmVudE5vZGUgIT0gbnVsbCA/IGN1cnJlbnROb2RlLmNscyA6IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKHN0YWNrID09IG51bGwpIHsKICAgICAgLy8gRmlyc3QgY2FsbCB0byBtb3ZlTmV4dAogICAgICBzdGFjayA9IFtyb290XTsKICAgICAgcmV0dXJuIF9maW5kTmV4dCgpOwogICAgfSBlbHNlIHsKICAgICAgLy8gSW5pdGlhbGl6ZWQgc3RhdGUuCiAgICAgIGlmIChjdXJyZW50Tm9kZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIHJldHVybiBfZmluZE5leHQoKTsKICAgIH0KICB9CgogIC8vLyBGaW5kIHRoZSBuZXh0IGNsYXNzIHVzaW5nIHRoZSBbc3RhY2tdLgogIGJvb2wgX2ZpbmROZXh0KCkgewogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKHN0YWNrLmlzRW1wdHkpIHsKICAgICAgICAvLyBObyBtb3JlIGNsYXNzZXMuIFNldCBbY3VycmVudE5vZGVdIHRvIGBudWxsYCB0byBzaWduYWwgdGhlIGVuZCBvZgogICAgICAgIC8vIGl0ZXJhdGlvbi4KICAgICAgICBjdXJyZW50Tm9kZSA9IG51bGw7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGN1cnJlbnROb2RlID0gc3RhY2sucmVtb3ZlTGFzdCgpOwogICAgICBpZiAoIWluY2x1ZGVVbmluc3RhbnRpYXRlZCAmJiAhY3VycmVudE5vZGUuaXNJbnN0YW50aWF0ZWQpIHsKICAgICAgICAvLyBXZSdyZSBvbmx5IGl0ZXJhdGluZyBpbnN0YW50aWF0ZWQgY2xhc3NlcyBzbyB0aGVyZSBpcyBubyB1c2UgaW4KICAgICAgICAvLyB2aXNpdGluZyB0aGUgY3VycmVudCBub2RlIGFuZCBpdHMgc3VidHJlZS4KICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICAvLyBBZGQgZGlyZWN0IHN1YmNsYXNzZXMgaW4gcmV2ZXJzZSBvcmRlciBzbyB3aWxsIHZpc2l0IHRoZW0gaW4gdGhlIGxpc3QKICAgICAgLy8gb3JkZXIuCiAgICAgIGZvciAoaW50IGkgPSBjdXJyZW50Tm9kZS5fZGlyZWN0U3ViY2xhc3Nlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIHN0YWNrLmFkZChjdXJyZW50Tm9kZS5fZGlyZWN0U3ViY2xhc3Nlc1tpXSk7CiAgICAgIH0KICAgICAgaWYgKF9pc1ZhbGlkKGN1cnJlbnROb2RlKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNsYXNzIG9mIFtub2RlXSBpcyBhIHZhbGlkIHJlc3VsdCBmb3IgdGhpcyBpdGVyYXRvci4KICBib29sIF9pc1ZhbGlkKENsYXNzSGllcmFyY2h5Tm9kZSBub2RlKSB7CiAgICBpZiAoIWluY2x1ZGVSb290ICYmIG5vZGUgPT0gcm9vdCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIG1hc2suaW50ZXJzZWN0cyhub2RlLl9tYXNrKTsKICB9Cn0KCi8vLyBJdGVyYWJsZSBmb3IgdGhlIHN1YnR5cGVzIGluIGEgW0NsYXNzU2V0XS4KY2xhc3MgU3VidHlwZXNJdGVyYWJsZSBleHRlbmRzIEl0ZXJhYmxlQmFzZTxDbGFzc0VudGl0eT4gewogIGZpbmFsIENsYXNzU2V0IHN1YnR5cGVTZXQ7CiAgZmluYWwgRW51bVNldDxJbnN0YW50aWF0aW9uPiBtYXNrOwogIGZpbmFsIGJvb2wgaW5jbHVkZVJvb3Q7CgogIFN1YnR5cGVzSXRlcmFibGUuU3VidHlwZXNJdGVyYXRvcih0aGlzLnN1YnR5cGVTZXQsIHRoaXMubWFzaywKICAgICAge3RoaXMuaW5jbHVkZVJvb3Q6IHRydWV9KTsKCiAgQG92ZXJyaWRlCiAgSXRlcmF0b3I8Q2xhc3NFbnRpdHk+IGdldCBpdGVyYXRvciA9PiBuZXcgU3VidHlwZXNJdGVyYXRvcih0aGlzKTsKfQoKLy8vIEl0ZXJhdG9yIGZvciB0aGUgc3VidHlwZXMgaW4gYSBbQ2xhc3NTZXRdLgpjbGFzcyBTdWJ0eXBlc0l0ZXJhdG9yIGV4dGVuZHMgSXRlcmF0b3I8Q2xhc3NFbnRpdHk+IHsKICBmaW5hbCBTdWJ0eXBlc0l0ZXJhYmxlIGl0ZXJhYmxlOwogIEl0ZXJhdG9yPENsYXNzRW50aXR5PiBlbGVtZW50czsKICBJdGVyYXRvcjxDbGFzc0hpZXJhcmNoeU5vZGU+IGhpZXJhcmNoeU5vZGVzOwoKICBTdWJ0eXBlc0l0ZXJhdG9yKHRoaXMuaXRlcmFibGUpOwoKICBib29sIGdldCBpbmNsdWRlUm9vdCA9PiBpdGVyYWJsZS5pbmNsdWRlUm9vdDsKCiAgRW51bVNldDxJbnN0YW50aWF0aW9uPiBnZXQgbWFzayA9PiBpdGVyYWJsZS5tYXNrOwoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXQgY3VycmVudCB7CiAgICBpZiAoZWxlbWVudHMgIT0gbnVsbCkgewogICAgICByZXR1cm4gZWxlbWVudHMuY3VycmVudDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChlbGVtZW50cyA9PSBudWxsICYmIGhpZXJhcmNoeU5vZGVzID09IG51bGwpIHsKICAgICAgLy8gSW5pdGlhbCBzdGF0ZS4gSXRlcmF0ZSB0aHJvdWdoIHN1YmNsYXNzZXMuCiAgICAgIGVsZW1lbnRzID0gaXRlcmFibGUuc3VidHlwZVNldC5ub2RlCiAgICAgICAgICAuc3ViY2xhc3Nlc0J5TWFzayhtYXNrLCBzdHJpY3Q6ICFpbmNsdWRlUm9vdCkKICAgICAgICAgIC5pdGVyYXRvcjsKICAgIH0KICAgIGlmIChlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzLm1vdmVOZXh0KCkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoaGllcmFyY2h5Tm9kZXMgPT0gbnVsbCkgewogICAgICAvLyBTdGFydCBpdGVyYXRpbmcgdGhyb3VnaCBzdWJ0eXBlcy4KICAgICAgaGllcmFyY2h5Tm9kZXMgPSBpdGVyYWJsZS5zdWJ0eXBlU2V0Ll9zdWJ0eXBlcy5pdGVyYXRvcjsKICAgIH0KICAgIHdoaWxlIChoaWVyYXJjaHlOb2Rlcy5tb3ZlTmV4dCgpKSB7CiAgICAgIGVsZW1lbnRzID0gaGllcmFyY2h5Tm9kZXMuY3VycmVudC5zdWJjbGFzc2VzQnlNYXNrKG1hc2spLml0ZXJhdG9yOwogICAgICBpZiAoZWxlbWVudHMubW92ZU5leHQoKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgovLy8gRW51bSB2YWx1ZXMgcmV0dXJuZWQgZnJvbSB0aGUgW0ZvckVhY2hGdW5jdGlvbl0gcHJvdmlkZWQgdG8gdGhlIGBmb3JFYWNoWGAKLy8vIGZ1bmN0aW9ucyBvZiBbQ2xhc3NIaWVyYXJjaHlOb2RlXSBhbmQgW0NsYXNzU2V0XS4gVGhlIHZhbHVlIGlzIHVzZWQgdG8KLy8vIGNvbnRyb2wgdGhlIGNvbnRpbnVlZCBpdGVyYXRpb24uCmVudW0gSXRlcmF0aW9uU3RlcCB7CiAgLy8vIEl0ZXJhdGlvbiBjb250aW51ZXMuCiAgQ09OVElOVUUsCgogIC8vLyBJdGVyYXRpb24gc3RvcHMgaW1tZWRpYXRlbHkuCiAgU1RPUCwKCiAgLy8vIEl0ZXJhdGlvbiBza2lwcyB0aGUgc3ViY2xhc3NlcyBvZiB0aGUgY3VycmVudCBjbGFzcy4KICBTS0lQX1NVQkNMQVNTRVMsCn0KCi8vLyBWaXNpdGluZyBmdW5jdGlvbiB1c2VkIGZvciB0aGUgYGZvckVhY2hYYCBmdW5jdGlvbnMgb2YgW0NsYXNzSGllcmFyY2h5Tm9kZV0KLy8vIGFuZCBbQ2xhc3NTZXRdLiBUaGUgcmV0dXJuIHZhbHVlIGNvbnRyb2xzIHRoZSBjb250aW51ZWQgaXRlcmF0aW9uLiBJZiBgbnVsbGAKLy8vIGlzIHJldHVybmVkLCBpdGVyYXRpb24gY29udGludWVzIHRvIHRoZSBlbmQuCnR5cGVkZWYgSXRlcmF0aW9uU3RlcCBGb3JFYWNoRnVuY3Rpb24oQ2xhc3NFbnRpdHkgY2xzKTsKCi8vLyBTaW5nbGV0b24gbWFwIGltcGxlbWVudGVkIGFzIGEgZmllbGQgb24gdGhlIGtleS4KY2xhc3MgQ2xhc3NIaWVyYXJjaHlOb2Rlc01hcCBleHRlbmRzIE1hcEJhc2U8Q2xhc3NFbnRpdHksIENsYXNzSGllcmFyY2h5Tm9kZT4gewogIEBvdmVycmlkZQogIENsYXNzSGllcmFyY2h5Tm9kZSBvcGVyYXRvciBbXShPYmplY3QgY2xzKSB7CiAgICAvLyBUT0RPKHNyYSk6IENoYW5nZSB0aGUga2V5IHR5cGUgdG8gYGNvdmFyaWFudCBDbGFzc0hpZXJhcmNoeU5vZGVzTWFwS2V5YC4KICAgIGlmIChjbHMgaXMgQ2xhc3NIaWVyYXJjaHlOb2Rlc01hcEtleSkgewogICAgICByZXR1cm4gY2xzLl9jbGFzc0hpZXJhcmNoeU5vZGU7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCdDbGFzc0hpZXJhcmNoeU5vZGVzTWFwIGZvciAkY2xzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBvcGVyYXRvciBbXT0oT2JqZWN0IGNscywgQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUpIHsKICAgIC8vIFRPRE8oc3JhKTogQ2hhbmdlIHRoZSBrZXkgdHlwZSB0byBgY292YXJpYW50IENsYXNzSGllcmFyY2h5Tm9kZXNNYXBLZXlgLgogICAgaWYgKGNscyBpcyBDbGFzc0hpZXJhcmNoeU5vZGVzTWFwS2V5KSB7CiAgICAgIGNscy5fY2xhc3NIaWVyYXJjaHlOb2RlID0gbm9kZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcignQ2xhc3NIaWVyYXJjaHlOb2Rlc01hcCBmb3IgJGNs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aHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB0cmFjZXI7CgppbXBvcnQgJy4uL2NvbXBpbGVyX25ldy5kYXJ0JyBhcyBhcGk7CmltcG9ydCAnc3NhL25vZGVzLmRhcnQnIGFzIHNzYSBzaG93IEhHcmFwaDsKaW1wb3J0ICdzc2Evc3NhX3RyYWNlci5kYXJ0JyBzaG93IEhUcmFjZXI7CmltcG9ydCAndXRpbC91dGlsLmRhcnQnIHNob3cgSW5kZW50YXRpb247CmltcG9ydCAnd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CgovLy8gSWYgbm9uLW51bGwsIHdlIG9ubHkgdHJhY2UgbWV0aG9kcyB3aG9zZSBuYW1lIG1hdGNoIHRoZSByZWdleHAgZGVmaW5lZCBieQovLy8gdGhlIGdpdmVuIHBhdHRlcm4uClN0cmluZyBnZXQgVFJBQ0VfRklMVEVSX1BBVFRFUk4gPT4KICAgIFRSQUNFX0ZJTFRFUl9QQVRURVJOX0ZST01fRU5WSVJPTk1FTlQgPz8gVFJBQ0VfRklMVEVSX1BBVFRFUk5fRk9SX1RFU1Q7Cgpjb25zdCBTdHJpbmcgVFJBQ0VfRklMVEVSX1BBVFRFUk5fRlJPTV9FTlZJUk9OTUVOVCA9CiAgICBjb25zdCBTdHJpbmcuZnJvbUVudmlyb25tZW50KCJEVU1QX0lSIik7ClN0cmluZyBUUkFDRV9GSUxURVJfUEFUVEVSTl9GT1JfVEVTVDsKCi8vLyBEdW1wcyB0aGUgaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uIGFmdGVyIGVhY2ggcGhhc2UgaW4gYSBmb3JtYXQKLy8vIHJlYWRhYmxlIGJ5IElSIEh5ZHJhLgpjbGFzcyBUcmFjZXIgZXh0ZW5kcyBUcmFjZXJVdGlsIHsKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CiAgYm9vbCB0cmFjZUFjdGl2ZSA9IGZhbHNlOwogIEBvdmVycmlkZQogIGZpbmFsIGFwaS5PdXRwdXRTaW5rIG91dHB1dDsKICBmaW5hbCBSZWdFeHAgdHJhY2VGaWx0ZXI7CgogIFRyYWNlcih0aGlzLmNsb3NlZFdvcmxkLCBhcGkuQ29tcGlsZXJPdXRwdXQgY29tcGlsZXJPdXRwdXQpCiAgICAgIDogdHJhY2VGaWx0ZXIgPSBUUkFDRV9GSUxURVJfUEFUVEVSTiA9PSBudWxsCiAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICA6IG5ldyBSZWdFeHAoVFJBQ0VfRklMVEVSX1BBVFRFUk4pLAogICAgICAgIG91dHB1dCA9IFRSQUNFX0ZJTFRFUl9QQVRURVJOICE9IG51bGwKICAgICAgICAgICAgPyBjb21waWxlck91dHB1dC5jcmVhdGVPdXRwdXRTaW5rKAogICAgICAgICAgICAgICAgJ2RhcnQnLCAnY2ZnJywgYXBpLk91dHB1dFR5cGUuZGVidWcpCiAgICAgICAgICAgIDogbnVsbDsKCiAgYm9vbCBnZXQgaXNFbmFibGVkID0+IHRyYWNlRmlsdGVyICE9IG51bGw7CgogIHZvaWQgdHJhY2VDb21waWxhdGlvbihTdHJpbmcgbWV0aG9kTmFtZSkgewogICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjsKICAgIHRyYWNlQWN0aXZlID0gdHJhY2VGaWx0ZXIuaGFzTWF0Y2gobWV0aG9kTmFtZSk7CiAgICBpZiAoIXRyYWNlQWN0aXZlKSByZXR1cm47CiAgICB0YWcoImNvbXBpbGF0aW9uIiwgKCkgewogICAgICBwcmludFByb3BlcnR5KCJuYW1lIiwgbWV0aG9kTmFtZSk7CiAgICAgIHByaW50UHJvcGVydHkoIm1ldGhvZCIsIG1ldGhvZE5hbWUpOwogICAgICBwcmludFByb3BlcnR5KCJkYXRlIiwgbmV3IERhdGVUaW1lLm5vdygpLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2gpOwogICAgfSk7CiAgfQoKICB2b2lkIHRyYWNlR3JhcGgoU3RyaW5nIG5hbWUsIHZhciBpck9iamVjdCkgewogICAgaWYgKCF0cmFjZUFjdGl2ZSkgcmV0dXJuOwogICAgaWYgKGlyT2JqZWN0IGlzIHNzYS5IR3JhcGgpIHsKICAgICAgbmV3IEhUcmFjZXIob3V0cHV0LCBjbG9zZWRXb3JsZCkudHJhY2VHcmFwaChuYW1lLCBpck9iamVjdCk7CiAgICB9CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgaWYgKG91dHB1dCAhPSBudWxsKSB7CiAgICAgIG91dHB1dC5jbG9zZSgpOwogICAgfQogIH0KfQoKYWJzdHJhY3QgY2xhc3MgVHJhY2VyVXRpbCB7CiAgYXBpLk91dHB1dFNpbmsgZ2V0IG91dHB1dDsKICBmaW5hbCBJbmRlbnRhdGlvbiBfaW5kID0gbmV3IEluZGVudGF0aW9uKCk7CgogIHZvaWQgdGFnKFN0cmluZyB0YWdOYW1lLCBGdW5jdGlvbiBmKSB7CiAgICBwcmludGxuKCJiZWdpbl8kdGFnTmFtZSIpOwogICAgX2luZC5pbmRlbnRCbG9jayhmKTsKICAgIHByaW50bG4oImVuZF8kdGFnTmFtZSIpOwogIH0KCiAgdm9pZCBwcmludGxuKFN0cmluZyBzdHJpbmcpIHsKICAgIGFkZEluZGVudCgpOwogICAgYWRkKHN0cmluZyk7CiAgICBhZGQoIlxuIik7CiAgfQoKICB2b2lkIHByaW50RW1wdHlQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAgICBwcmludGxuKHByb3BlcnR5TmFtZSk7CiAgfQoKICBTdHJpbmcgZm9ybWF0UHJ0eSh4KSB7CiAgICBpZiAoeCBpcyBudW0pIHsKICAgICAgcmV0dXJuICcke3h9JzsKICAgIH0gZWxzZSBpZiAoeCBpcyBTdHJpbmcpIHsKICAgICAgcmV0dXJuICciJHt4fSInOwogICAgfSBlbHNlIGlmICh4IGlzIEl0ZXJhYmxlKSB7CiAgICAgIHJldHVybiB4Lm1hcCgocykgPT4gZm9ybWF0UHJ0eShzKSkuam9pbignICcpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgImludmFsaWQgcHJvcGVydHkgdHlwZTogJHt4fSI7CiAgICB9CiAgfQoKICB2b2lkIHByaW50UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgdmFsdWUpIHsKICAgIHByaW50bG4oIiRwcm9wZXJ0eU5hbWUgJHtmb3JtYXRQcnR5KHZhbHVlKX0iKTsKICB9CgogIHZvaWQgYWRkKFN0cmluZyBzdHJpbmcpIHsKICAgIG91dHB1dC5hZGQoc3RyaW5nKTsKICB9CgogIHZvaWQgYWRkSW5kZW50KCkgewogICAgYWRkKF9pbmQuaW5kZW50YXRpb24pOwogIH0KfQpwAE5OPAEQASYsKyonAU4XI0wBNS0mAUcaIiIcDB8cAT4zEzAuLzUUAS0BLRw0HhwpK0gIBAEvHiJDBgQBERoWBgQCARwdLgEpHxkdBAEgEREPBAExGwQBGRQVHhcgNA0rBgQBMzMEARwYBAEVGwQCASBwYWNrYWdlOmNvbXBpbGVyL3NyYy90cmFjZXIuZGFydEJzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2NoZWNrZWRfbW9kZV9oZWxwZXJzLmRhcnSsoi8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganNBc3Q7CmltcG9ydCAnLi4vanMvanMuZGFydCcgc2hvdyBqczsKaW1wb3J0ICcuLi9zc2EvY29kZWdlbi5kYXJ0JyBzaG93IFNzYUNvZGVHZW5lcmF0b3I7CmltcG9ydCAnLi4vc3NhL25vZGVzLmRhcnQnIHNob3cgSFR5cGVDb252ZXJzaW9uOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnIHNob3cgQ2FsbFN0cnVjdHVyZTsKaW1wb3J0ICcuLi91bml2ZXJzZS91c2UuZGFydCcgc2hvdyBTdGF0aWNVc2U7CmltcG9ydCAnbmFtZXIuZGFydCcgc2hvdyBNb2R1bGFyTmFtZXI7CgpjbGFzcyBDaGVja2VkTW9kZUhlbHBlciB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIGNvbnN0IENoZWNrZWRNb2RlSGVscGVyKFN0cmluZyB0aGlzLm5hbWUpOwoKICBTdGF0aWNVc2UgZ2V0U3RhdGljVXNlKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZWZhY3RvciB0aGlzIHRvIGF2b2lkIGxvb2tpbmcgdXAgZGlyZWN0bHkgaW4gdGhlCiAgICAvLyBqcyBoZWxwZXIgbGlicmFyeSBidXQgaW5zdGVhZCBhY2Nlc3MgY29tbW9uRWxlbWVudHMuCiAgICByZXR1cm4gbmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoCiAgICAgICAgY29tbW9uRWxlbWVudHMuZmluZEhlbHBlckZ1bmN0aW9uKG5hbWUpLCBjYWxsU3RydWN0dXJlKTsKICB9CgogIENhbGxTdHJ1Y3R1cmUgZ2V0IGNhbGxTdHJ1Y3R1cmUgPT4gQ2FsbFN0cnVjdHVyZS5PTkVfQVJHOwoKICB2b2lkIGdlbmVyYXRlQWRkaXRpb25hbEFyZ3VtZW50cyhTc2FDb2RlR2VuZXJhdG9yIGNvZGVnZW4sIE1vZHVsYXJOYW1lciBuYW1lciwKICAgICAgSFR5cGVDb252ZXJzaW9uIG5vZGUsIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gYXJndW1lbnRzKSB7CiAgICAvLyBObyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBuZWVkZWQuCiAgfQp9CgpjbGFzcyBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyIGV4dGVuZHMgQ2hlY2tlZE1vZGVIZWxwZXIgewogIGNvbnN0IFByb3BlcnR5Q2hlY2tlZE1vZGVIZWxwZXIoU3RyaW5nIG5hbWUpIDogc3VwZXIobmFtZSk7CgogIEBvdmVycmlkZQogIENhbGxTdHJ1Y3R1cmUgZ2V0IGNhbGxTdHJ1Y3R1cmUgPT4gQ2FsbFN0cnVjdHVyZS5UV09fQVJHUzsKCiAgQG92ZXJyaWRlCiAgdm9pZCBnZW5lcmF0ZUFkZGl0aW9uYWxBcmd1bWVudHMoU3NhQ29kZUdlbmVyYXRvciBjb2RlZ2VuLCBNb2R1bGFyTmFtZXIgbmFtZXIsCiAgICAgIEhUeXBlQ29udmVyc2lvbiBub2RlLCBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGFyZ3VtZW50cykgewogICAgRGFydFR5cGUgdHlwZSA9IG5vZGUudHlwZUV4cHJlc3Npb247CiAgICBqc0FzdC5OYW1lIGFkZGl0aW9uYWxBcmd1bWVudCA9IG5hbWVyLm9wZXJhdG9ySXNUeXBlKHR5cGUpOwogICAgYXJndW1lbnRzLmFkZChqcy5xdW90ZU5hbWUoYWRkaXRpb25hbEFyZ3VtZW50KSk7CiAgfQp9CgpjbGFzcyBUeXBlVmFyaWFibGVDaGVja2VkTW9kZUhlbHBlciBleHRlbmRzIENoZWNrZWRNb2RlSGVscGVyIHsKICBjb25zdCBUeXBlVmFyaWFibGVDaGVja2VkTW9kZUhlbHBlcihTdHJpbmcgbmFtZSkgOiBzdXBlcihuYW1lKTsKCiAgQG92ZXJyaWRlCiAgQ2FsbFN0cnVjdHVyZSBnZXQgY2FsbFN0cnVjdHVyZSA9PiBDYWxsU3RydWN0dXJlLlRXT19BUkdTOwoKICBAb3ZlcnJpZGUKICB2b2lkIGdlbmVyYXRlQWRkaXRpb25hbEFyZ3VtZW50cyhTc2FDb2RlR2VuZXJhdG9yIGNvZGVnZW4sIE1vZHVsYXJOYW1lciBuYW1lciwKICAgICAgSFR5cGVDb252ZXJzaW9uIG5vZGUsIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gYXJndW1lbnRzKSB7CiAgICBhc3NlcnQobm9kZS50eXBlRXhwcmVzc2lvbi5pc1R5cGVWYXJpYWJsZSk7CiAgICBjb2RlZ2VuLnVzZShub2RlLnR5cGVSZXByZXNlbnRhdGlvbik7CiAgICBhcmd1bWVudHMuYWRkKGNvZGVnZW4ucG9wKCkpOwogIH0KfQoKY2xhc3MgRnVuY3Rpb25UeXBlUmVwcmVzZW50YXRpb25DaGVja2VkTW9kZUhlbHBlciBleHRlbmRzIENoZWNrZWRNb2RlSGVscGVyIHsKICBjb25zdCBGdW5jdGlvblR5cGVSZXByZXNlbnRhdGlvbkNoZWNrZWRNb2RlSGVscGVyKFN0cmluZyBuYW1lKSA6IHN1cGVyKG5hbWUpOwoKICBAb3ZlcnJpZGUKICBDYWxsU3RydWN0dXJlIGdldCBjYWxsU3RydWN0dXJlID0+IENhbGxTdHJ1Y3R1cmUuVFdPX0FSR1M7CgogIEBvdmVycmlkZQogIHZvaWQgZ2VuZXJhdGVBZGRpdGlvbmFsQXJndW1lbnRzKFNzYUNvZGVHZW5lcmF0b3IgY29kZWdlbiwgTW9kdWxhck5hbWVyIG5hbWVyLAogICAgICBIVHlwZUNvbnZlcnNpb24gbm9kZSwgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBhcmd1bWVudHMpIHsKICAgIGFzc2VydChub2RlLnR5cGVFeHByZXNzaW9uLmlzRnVuY3Rpb25UeXBlKTsKICAgIGNvZGVnZW4udXNlKG5vZGUudHlwZVJlcHJlc2VudGF0aW9uKTsKICAgIGFyZ3VtZW50cy5hZGQoY29kZWdlbi5wb3AoKSk7CiAgfQp9CgpjbGFzcyBGdXR1cmVPclJlcHJlc2VudGF0aW9uQ2hlY2tlZE1vZGVIZWxwZXIgZXh0ZW5kcyBDaGVja2VkTW9kZUhlbHBlciB7CiAgY29uc3QgRnV0dXJlT3JSZXByZXNlbnRhdGlvbkNoZWNrZWRNb2RlSGVscGVyKFN0cmluZyBuYW1lKSA6IHN1cGVyKG5hbWUpOwoKICBAb3ZlcnJpZGUKICBDYWxsU3RydWN0dXJlIGdldCBjYWxsU3RydWN0dXJlID0+IENhbGxTdHJ1Y3R1cmUuVFdPX0FSR1M7CgogIEBvdmVycmlkZQogIHZvaWQgZ2VuZXJhdGVBZGRpdGlvbmFsQXJndW1lbnRzKFNzYUNvZGVHZW5lcmF0b3IgY29kZWdlbiwgTW9kdWxhck5hbWVyIG5hbWVyLAogICAgICBIVHlwZUNvbnZlcnNpb24gbm9kZSwgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBhcmd1bWVudHMpIHsKICAgIGFzc2VydChub2RlLnR5cGVFeHByZXNzaW9uLmlzRnV0dXJlT3IpOwogICAgY29kZWdlbi51c2Uobm9kZS50eXBlUmVwcmVzZW50YXRpb24pOwogICAgYXJndW1lbnRzLmFkZChjb2RlZ2VuLnBvcCgpKTsKICB9Cn0KCmNsYXNzIFN1YnR5cGVDaGVja2VkTW9kZUhlbHBlciBleHRlbmRzIENoZWNrZWRNb2RlSGVscGVyIHsKICBjb25zdCBTdWJ0eXBlQ2hlY2tlZE1vZGVIZWxwZXIoU3RyaW5nIG5hbWUpIDogc3VwZXIobmFtZSk7CgogIEBvdmVycmlkZQogIENhbGxTdHJ1Y3R1cmUgZ2V0IGNhbGxTdHJ1Y3R1cmUgPT4gY29uc3QgQ2FsbFN0cnVjdHVyZS51bm5hbWVkKDQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGdlbmVyYXRlQWRkaXRpb25hbEFyZ3VtZW50cyhTc2FDb2RlR2VuZXJhdG9yIGNvZGVnZW4sIE1vZHVsYXJOYW1lciBuYW1lciwKICAgICAgSFR5cGVDb252ZXJzaW9uIG5vZGUsIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gYXJndW1lbnRzKSB7CiAgICAvLyBUT0RPKHNyYSk6IE1vdmUgdGhlc2UgY2FsbHMgaW50byB0aGUgU1NBIGdyYXBoIHNvIHRoYXQgdGhlIGFyZ3VtZW50cyBjYW4KICAgIC8vIGJlIG9wdGltaXplZCwgZSxnLCBHVk5lZC4KICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IG5vZGUudHlwZUV4cHJlc3Npb247CiAgICBDbGFzc0VudGl0eSBlbGVtZW50ID0gdHlwZS5lbGVtZW50OwogICAganNBc3QuTmFtZSBpc0ZpZWxkID0gbmFtZXIub3BlcmF0b3JJcyhlbGVtZW50KTsKICAgIGFyZ3VtZW50cy5hZGQoanMucXVvdGVOYW1lKGlzRmllbGQpKTsKICAgIGNvZGVnZW4udXNlKG5vZGUudHlwZVJlcHJlc2VudGF0aW9uKTsKICAgIGFyZ3VtZW50cy5hZGQoY29kZWdlbi5wb3AoKSk7CiAgICBqc0FzdC5OYW1lIGFzRmllbGQgPSBuYW1lci5zdWJzdGl0dXRpb25OYW1lKGVsZW1lbnQpOwogICAgYXJndW1lbnRzLmFkZChqcy5xdW90ZU5hbWUoYXNGaWVsZCkpOwogIH0KfQoKY2xhc3MgQ2hlY2tlZE1vZGVIZWxwZXJzIHsKICBDaGVja2VkTW9kZUhlbHBlcnMoKTsKCiAgLy8vIEFsbCB0aGUgY2hlY2tlZCBtb2RlIGhlbHBlcnMuCiAgc3RhdGljIGNvbnN0IExpc3Q8Q2hlY2tlZE1vZGVIZWxwZXI+IGhlbHBlcnMgPSBjb25zdCA8Q2hlY2tlZE1vZGVIZWxwZXI+WwogICAgY29uc3QgQ2hlY2tlZE1vZGVIZWxwZXIoJ3N0cmluZ1R5cGVDYXN0JyksCiAgICBjb25zdCBDaGVja2VkTW9kZUhlbHBlcignc3RyaW5nVHlwZUNoZWNrJyksCiAgICBjb25zdCBDaGVja2VkTW9kZUhlbHBlcignZG91YmxlVHlwZUNhc3QnKSwKICAgIGNvbnN0IENoZWNrZWRNb2RlSGVscGVyKCdkb3VibGVUeXBlQ2hlY2snKSwKICAgIGNvbnN0IENoZWNrZWRNb2RlSGVscGVyKCdudW1UeXBlQ2FzdCcpLAogICAgY29uc3QgQ2hlY2tlZE1vZGVIZWxwZXIoJ251bVR5cGVDaGVjaycpLAogICAgY29uc3QgQ2hlY2tlZE1vZGVIZWxwZXIoJ2Jvb2xDb252ZXJzaW9uQ2hlY2snKSwKICAgIGNvbnN0IENoZWNrZWRNb2RlSGVscGVyKCdib29sVHlwZUNhc3QnKSwKICAgIGNvbnN0IENoZWNrZWRNb2RlSGVscGVyKCdib29sVHlwZUNoZWNrJyksCiAgICBjb25zdCBDaGVja2VkTW9kZUhlbHBlcignaW50VHlwZUNhc3QnKSwKICAgIGNvbnN0IENoZWNrZWRNb2RlSGVscGVyKCdpbnRUeXBlQ2hlY2snKSwKICAgIGNvbnN0IFByb3BlcnR5Q2hlY2tlZE1vZGVIZWxwZXIoJ251bWJlck9yU3RyaW5nU3VwZXJOYXRpdmVUeXBlQ2FzdCcpLAogICAgY29uc3QgUHJvcGVydHlDaGVja2VkTW9kZUhlbHBlcignbnVtYmVyT3JTdHJpbmdTdXBlck5hdGl2ZVR5cGVDaGVjaycpLAogICAgY29uc3QgUHJvcGVydHlDaGVja2VkTW9kZUhlbHBlcignbnVtYmVyT3JTdHJpbmdTdXBlclR5cGVDYXN0JyksCiAgICBjb25zdCBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyKCdudW1iZXJPclN0cmluZ1N1cGVyVHlwZUNoZWNrJyksCiAgICBjb25zdCBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyKCdzdHJpbmdTdXBlck5hdGl2ZVR5cGVDYXN0JyksCiAgICBjb25zdCBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyKCdzdHJpbmdTdXBlck5hdGl2ZVR5cGVDaGVjaycpLAogICAgY29uc3QgUHJvcGVydHlDaGVja2VkTW9kZUhlbHBlcignc3RyaW5nU3VwZXJUeXBlQ2FzdCcpLAogICAgY29uc3QgUHJvcGVydHlDaGVja2VkTW9kZUhlbHBlcignc3RyaW5nU3VwZXJUeXBlQ2hlY2snKSwKICAgIGNvbnN0IENoZWNrZWRNb2RlSGVscGVyKCdsaXN0VHlwZUNhc3QnKSwKICAgIGNvbnN0IENoZWNrZWRNb2RlSGVscGVyKCdsaXN0VHlwZUNoZWNrJyksCiAgICBjb25zdCBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyKCdsaXN0U3VwZXJOYXRpdmVUeXBlQ2FzdCcpLAogICAgY29uc3QgUHJvcGVydHlDaGVja2VkTW9kZUhlbHBlcignbGlzdFN1cGVyTmF0aXZlVHlwZUNoZWNrJyksCiAgICBjb25zdCBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyKCdsaXN0U3VwZXJUeXBlQ2FzdCcpLAogICAgY29uc3QgUHJvcGVydHlDaGVja2VkTW9kZUhlbHBlcignbGlzdFN1cGVyVHlwZUNoZWNrJyksCiAgICBjb25zdCBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyKCdpbnRlcmNlcHRlZFR5cGVDYXN0JyksCiAgICBjb25zdCBQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyKCdpbnRlcmNlcHRlZFR5cGVDaGVjaycpLAogICAgY29uc3QgU3VidHlwZUNoZWNrZWRNb2RlSGVscGVyKCdzdWJ0eXBlQ2FzdCcpLAogICAgY29uc3QgU3VidHlwZUNoZWNrZWRNb2RlSGVscGVyKCdhc3NlcnRTdWJ0eXBlJyksCiAgICBjb25zdCBUeXBlVmFyaWFibGVDaGVja2VkTW9kZUhlbHBlcignc3VidHlwZU9mUnVudGltZVR5cGVDYXN0JyksCiAgICBjb25zdCBUeXBlVmFyaWFibGVDaGVja2VkTW9kZUhlbHBlcignYXNzZXJ0U3VidHlwZU9mUnVudGltZVR5cGUnKSwKICAgIGNvbnN0IFByb3BlcnR5Q2hlY2tlZE1vZGVIZWxwZXIoJ3Byb3BlcnR5VHlwZUNhc3QnKSwKICAgIGNvbnN0IFByb3BlcnR5Q2hlY2tlZE1vZGVIZWxwZXIoJ3Byb3BlcnR5VHlwZUNoZWNrJyksCiAgICBjb25zdCBGdW5jdGlvblR5cGVSZXByZXNlbnRhdGlvbkNoZWNrZWRNb2RlSGVscGVyKCdmdW5jdGlvblR5cGVDYXN0JyksCiAgICBjb25zdCBGdW5jdGlvblR5cGVSZXByZXNlbnRhdGlvbkNoZWNrZWRNb2RlSGVscGVyKCdmdW5jdGlvblR5cGVDaGVjaycpLAogICAgY29uc3QgRnV0dXJlT3JSZXByZXNlbnRhdGlvbkNoZWNrZWRNb2RlSGVscGVyKCdmdXR1cmVPckNhc3QnKSwKICAgIGNvbnN0IEZ1dHVyZU9yUmVwcmVzZW50YXRpb25DaGVja2VkTW9kZUhlbHBlcignZnV0dXJlT3JDaGVjaycpLAogIF07CgogIC8vIENoZWNrZWQgbW9kZSBoZWxwZXJzIGluZGV4ZWQgYnkgbmFtZS4KICBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQ2hlY2tlZE1vZGVIZWxwZXI+IGNoZWNrZWRNb2RlSGVscGVyQnlOYW1lID0KICAgICAgbmV3IE1hcDxTdHJpbmcsIENoZWNrZWRNb2RlSGVscGVyPi5mcm9tSXRlcmFibGUoaGVscGVycywKICAgICAgICAgIGtleTogKGhlbHBlcikgPT4gaGVscGVyLm5hbWUpOwoKICAvLy8gUmV0dXJucyB0aGUgY2hlY2tlZCBtb2RlIGhlbHBlciB0aGF0IHdpbGwgYmUgbmVlZGVkIHRvIGRvIGEgdHlwZQogIC8vLyBjaGVjay90eXBlIGNhc3Qgb24gW3R5cGVdIGF0IHJ1bnRpbWUuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBiZWluZwogIC8vLyBjYWxsZWQgYm90aCBieSB0aGUgcmVzb2x2ZXIgd2l0aCBpbnRlcmZhY2UgdHlwZXMgKGludCwgU3RyaW5nLCAuLi4pLCBhbmQKICAvLy8gYnkgdGhlIFNTQSBiYWNrZW5kIHdpdGggaW1wbGVtZW50YXRpb24gdHlwZXMgKEpTSW50LCBKU1N0cmluZywgLi4uKS4KICBDaGVja2VkTW9kZUhlbHBlciBnZXRDaGVja2VkTW9kZUhlbHBlcigKICAgICAgRGFydFR5cGUgdHlwZSwgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIHtib29sIHR5cGVDYXN0fSkgewogICAgcmV0dXJuIGdldENoZWNrZWRNb2RlSGVscGVySW50ZXJuYWwodHlwZSwgY29tbW9uRWxlbWVudHMsCiAgICAgICAgdHlwZUNhc3Q6IHR5cGVDYXN0LCBuYXRpdmVDaGVja09ubHk6IGZhbHNlKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBuYXRpdmUgY2hlY2tlZCBtb2RlIGhlbHBlciB0aGF0IHdpbGwgYmUgbmVlZGVkIHRvIGRvIGEgdHlwZQogIC8vLyBjaGVjay90eXBlIGNhc3Qgb24gW3R5cGVdIGF0IHJ1bnRpbWUuIElmIG5vIG5hdGl2ZSBoZWxwZXIgZXhpc3RzIGZvcgogIC8vLyBbdHlwZV0sIFs6bnVsbDpdIGlzIHJldHVybmVkLgogIENoZWNrZWRNb2RlSGVscGVyIGdldE5hdGl2ZUNoZWNrZWRNb2RlSGVscGVyKAogICAgICBEYXJ0VHlwZSB0eXBlLCBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAge2Jvb2wgdHlwZUNhc3R9KSB7CiAgICByZXR1cm4gZ2V0Q2hlY2tlZE1vZGVIZWxwZXJJbnRlcm5hbCh0eXBlLCBjb21tb25FbGVtZW50cywKICAgICAgICB0eXBlQ2FzdDogdHlwZUNhc3QsIG5hdGl2ZUNoZWNrT25seTogdHJ1ZSk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgY2hlY2tlZCBtb2RlIGhlbHBlciBmb3IgdGhlIHR5cGUgY2hlY2svdHlwZSBjYXN0IGZvcgogIC8vLyBbdHlwZV0uIElmIFtuYXRpdmVDaGVja09ubHldIGlzIFs6dHJ1ZTpdLCBvbmx5IG5hbWVzIGZvciBuYXRpdmUgaGVscGVycwogIC8vLyBhcmUgcmV0dXJuZWQuCiAgQ2hlY2tlZE1vZGVIZWxwZXIgZ2V0Q2hlY2tlZE1vZGVIZWxwZXJJbnRlcm5hbCgKICAgICAgRGFydFR5cGUgdHlwZSwgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIHtib29sIHR5cGVDYXN0LCBib29sIG5hdGl2ZUNoZWNrT25seX0pIHsKICAgIFN0cmluZyBuYW1lID0gZ2V0Q2hlY2tlZE1vZGVIZWxwZXJOYW1lSW50ZXJuYWwodHlwZSwgY29tbW9uRWxlbWVudHMsCiAgICAgICAgdHlwZUNhc3Q6IHR5cGVDYXN0LCBuYXRpdmVDaGVja09ubHk6IG5hdGl2ZUNoZWNrT25seSk7CiAgICBpZiAobmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIENoZWNrZWRNb2RlSGVscGVyIGhlbHBlciA9IGNoZWNrZWRNb2RlSGVscGVyQnlOYW1lW25hbWVdOwogICAgYXNzZXJ0KGhlbHBlciAhPSBudWxsKTsKICAgIHJldHVybiBoZWxwZXI7CiAgfQoKICBTdHJpbmcgZ2V0Q2hlY2tlZE1vZGVIZWxwZXJOYW1lSW50ZXJuYWwoCiAgICAgIERhcnRUeXBlIHR5cGUsIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICB7Ym9vbCB0eXBlQ2FzdCwgYm9vbCBuYXRpdmVDaGVja09ubHl9KSB7CiAgICBhc3NlcnQoIXR5cGUuaXNUeXBlZGVmKTsKCiAgICBpZiAodHlwZS5pc1R5cGVWYXJpYWJsZSkgewogICAgICByZXR1cm4gdHlwZUNhc3QKICAgICAgICAgID8gJ3N1YnR5cGVPZlJ1bnRpbWVUeXBlQ2FzdCcKICAgICAgICAgIDogJ2Fzc2VydFN1YnR5cGVPZlJ1bnRpbWVUeXBlJzsKICAgIH0KCiAgICBpZiAodHlwZS5pc0Z1bmN0aW9uVHlwZSkgewogICAgICByZXR1cm4gdHlwZUNhc3QgPyAnZnVuY3Rpb25UeXBlQ2FzdCcgOiAnZnVuY3Rpb25UeXBlQ2hlY2snOwogICAgfQoKICAgIGlmICh0eXBlLmlzRnV0dXJlT3IpIHsKICAgICAgcmV0dXJuIHR5cGVDYXN0ID8gJ2Z1dHVyZU9yQ2FzdCcgOiAnZnV0dXJlT3JDaGVjayc7CiAgICB9CgogICAgYXNzZXJ0KHR5cGUuaXNJbnRlcmZhY2VUeXBlLAogICAgICAgIGZhaWxlZEF0KE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwgIlVuZXhwZWN0ZWQgdHlwZTogJHR5cGUiKSk7CiAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZVR5cGUgPSB0eXBlOwogICAgQ2xhc3NFbnRpdHkgZWxlbWVudCA9IGludGVyZmFjZVR5cGUuZWxlbWVudDsKICAgIGJvb2wgbmF0aXZlQ2hlY2sgPSB0cnVlOwogICAgLy8gVE9ETygxMzk1NSksIFRPRE8oOTczMSkuICBUaGUgdGVzdCBmb3Igbm9uLXByaW1pdGl2ZSB0eXBlcyBzaG91bGQgdXNlIGFuCiAgICAvLyBpbnRlcmNlcHRvci4gIFRoZSBpbnRlcmNlcHRvciBzaG91bGQgYmUgYW4gYXJndW1lbnQgdG8gSFR5cGVDb252ZXJzaW9uIHNvCiAgICAvLyB0aGF0IGl0IGNhbiBiZSBvcHRpbWl6ZWQgYnkgc3RhbmRhcmQgaW50ZXJjZXB0b3Igb3B0aW1pemF0aW9ucy4KICAgIC8vICBuYXRpdmVDaGVja09ubHkgfHwgZW1pdHRlci5uYXRpdmVFbWl0dGVyLnJlcXVpcmVzTmF0aXZlSXNDaGVjayhlbGVtZW50KTsKCiAgICB2YXIgc3VmZml4ID0gdHlwZUNhc3QgPyAnVHlwZUNhc3QnIDogJ1R5cGVDaGVjayc7CiAgICBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5zdHJpbmdDbGFzcykgewogICAgICBpZiAobmF0aXZlQ2hlY2tPbmx5KSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuICdzdHJpbmckc3VmZml4JzsKICAgIH0KCiAgICBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5kb3VibGVDbGFzcykgewogICAgICBpZiAobmF0aXZlQ2hlY2tPbmx5KSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuICdkb3VibGUkc3VmZml4JzsKICAgIH0KCiAgICBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5udW1DbGFzcykgewogICAgICBpZiAobmF0aXZlQ2hlY2tPbmx5KSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuICdudW0kc3VmZml4JzsKICAgIH0KCiAgICBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuYm9vbENsYXNzKSB7CiAgICAgIGlmIChuYXRpdmVDaGVja09ubHkpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gJ2Jvb2wkc3VmZml4JzsKICAgIH0KCiAgICBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc0ludENsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5pbnRDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuanNVSW50MzJDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuanNVSW50MzFDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzKSB7CiAgICAgIGlmIChuYXRpdmVDaGVja09ubHkpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gJ2ludCRzdWZmaXgnOwogICAgfQoKICAgIGlmIChjb21tb25FbGVtZW50cy5pc051bWJlck9yU3RyaW5nU3VwZXJ0eXBlKGVsZW1lbnQpKSB7CiAgICAgIHJldHVybiBuYXRpdmVDaGVjawogICAgICAgICAgPyAnbnVtYmVyT3JTdHJpbmdTdXBlck5hdGl2ZSRzdWZmaXgnCiAgICAgICAgICA6ICdudW1iZXJPclN0cmluZ1N1cGVyJHN1ZmZpeCc7CiAgICB9CgogICAgaWYgKGNvbW1vbkVsZW1lbnRzLmlzU3RyaW5nT25seVN1cGVydHlwZShlbGVtZW50KSkgewogICAgICByZXR1cm4gbmF0aXZlQ2hlY2sgPyAnc3RyaW5nU3VwZXJOYXRpdmUkc3VmZml4JyA6ICdzdHJpbmdTdXBlciRzdWZmaXgnOwogICAgfQoKICAgIGlmICgoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5saXN0Q2xhc3MgfHwKICAgICAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MpICYmCiAgICAgICAgdHlwZS50cmVhdEFzUmF3KSB7CiAgICAgIGlmIChuYXRpdmVDaGVja09ubHkpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gJ2xpc3Qkc3VmZml4JzsKICAgIH0KCiAgICBpZiAoY29tbW9uRWxlbWVudHMuaXNMaXN0U3VwZXJ0eXBlKGVsZW1lbnQpICYmIHR5cGUudHJlYXRBc1JhdykgewogICAgICByZXR1cm4gbmF0aXZlQ2hlY2sgPyAnbGlzdFN1cGVyTmF0aXZlJHN1ZmZpeCcgOiAnbGlzdFN1cGVyJHN1ZmZpeCc7CiAgICB9CgogICAgaWYgKHR5cGUuaXNJbnRlcmZhY2VUeXBlICYmICF0eXBlLnRyZWF0QXNSYXcpIHsKICAgICAgcmV0dXJuIHR5cGVDYXN0ID8gJ3N1YnR5cGVDYXN0JyA6ICdhc3NlcnRTdWJ0eXBlJzsKICAgIH0KCiAgICBpZiAobmF0aXZlQ2hlY2spIHsKICAgICAgLy8gVE9ETyhrYXJsa2xvc2UpOiBjYW4gd2UgZ2V0IHJpZCBvZiB0aGlzIGJyYW5jaCB3aGVuIHdlIHVzZQogICAgICAvLyBpbnRlcmNlcHRvcnM/CiAgICAgIHJldHVybiAnaW50ZXJjZXB0ZWQkc3VmZml4JzsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAncHJvcGVydHkkc3VmZml4JzsKICAgIH0KICB9Cn0KgS0ATk48ARkiJCEhIDQxPS4nARoVAS0BOk48J0EEATwBUUAnBAIBPD4BDD0BDFFAKUA1BAIBQEIBDD0BDFFAMCoiBAIBTlABDD0BDFFAMCoiBAIBSkwBDD0BDFFALCoiBAIBOz0BDEUBDFFAUCEuKDQqKiI6KgQCARsYASRMLzAvMCwtNC0uLC1KS0RFQkM8PS0uQEE6Ozw9MzVFRzk6S0xDRAUBK0g/KQFHS09LKjQZPjUEAU5LJDA0GT40BAFHThQyNC9JPyM+HBMEASs0Lx0BHxYnKgYBH0IGARs6BgEhRCgxHVBRR1EBNjMxKB4GATMxKB4GATMuKBsGATEvKBwGATAuMzM4KBsGAT0ZLyoGATlOBgEwNxsoHAYBRkoGATQ5BgEXRBcjDSAGBAIBOXBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvY2hlY2tlZF9tb2RlX2hlbHBlcnMuZGFydDtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydMAA074vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBqc19iYWNrZW5kLnJ1bnRpbWVfdHlwZXM7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCcgc2hvdyBJZGVudGlmaWVyczsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcKICAgIHNob3cKICAgICAgICBDb21tb25FbGVtZW50cywKICAgICAgICBFbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgSkNvbW1vbkVsZW1lbnRzLAogICAgICAgIEpFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganNBc3Q7CmltcG9ydCAnLi4vanMvanMuZGFydCcgc2hvdyBqczsKaW1wb3J0ICcuLi9qc19lbWl0dGVyL2pzX2VtaXR0ZXIuZGFydCcgc2hvdyBNb2R1bGFyRW1pdHRlcjsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NvZGVnZW5fd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9mZWF0dXJlLmRhcnQnOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnOwppbXBvcnQgJ25hbWVyLmRhcnQnOwppbXBvcnQgJ25hdGl2ZV9kYXRhLmRhcnQnOwppbXBvcnQgJ3J1bnRpbWVfdHlwZXNfY29kZWdlbi5kYXJ0JzsKaW1wb3J0ICdydW50aW1lX3R5cGVzX3Jlc29sdXRpb24uZGFydCc7Cgp0eXBlZGVmIGpzQXN0LkV4cHJlc3Npb24gT25WYXJpYWJsZUNhbGxiYWNrKFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGUpOwp0eXBlZGVmIGJvb2wgU2hvdWxkRW5jb2RlVHlwZWRlZkNhbGxiYWNrKFR5cGVkZWZUeXBlIHZhcmlhYmxlKTsKCi8vLyBJbnRlcmZhY2UgZm9yIHRoZSBuZWVkZWQgcnVudGltZSB0eXBlIGNoZWNrcy4KYWJzdHJhY3QgY2xhc3MgUnVudGltZVR5cGVzQ2hlY2tzIHsKICAvLy8gUmV0dXJucyB0aGUgcmVxdWlyZWQgcnVudGltZSB0eXBlIGNoZWNrcy4KICBUeXBlQ2hlY2tzIGdldCByZXF1aXJlZENoZWNrczsKCiAgLy8vIFJldHVybiBhbGwgY2xhc3NlcyBuZWVkZWQgZm9yIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbi4KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IHJlcXVpcmVkQ2xhc3NlczsKfQoKY2xhc3MgVHJpdmlhbFR5cGVzQ2hlY2tzIGltcGxlbWVudHMgUnVudGltZVR5cGVzQ2hlY2tzIHsKICBmaW5hbCBUeXBlQ2hlY2tzIF90eXBlQ2hlY2tzOwogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gX2FsbENsYXNzZXM7CgogIFRyaXZpYWxUeXBlc0NoZWNrcyh0aGlzLl90eXBlQ2hlY2tzKQogICAgICA6IF9hbGxDbGFzc2VzID0gX3R5cGVDaGVja3MuY2xhc3Nlcy50b1NldCgpOwoKICBAb3ZlcnJpZGUKICBUeXBlQ2hlY2tzIGdldCByZXF1aXJlZENoZWNrcyA9PiBfdHlwZUNoZWNrczsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCByZXF1aXJlZENsYXNzZXMgPT4gX2FsbENsYXNzZXM7Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIGNvbXB1dGluZyB0aGUgbmVlZGVkIHJ1bnRpbWUgdHlwZSBjaGVja3MuCmFic3RyYWN0IGNsYXNzIFJ1bnRpbWVUeXBlc0NoZWNrc0J1aWxkZXIgewogIHZvaWQgcmVnaXN0ZXJUeXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2soCiAgICAgIERhcnRUeXBlIHR5cGVBcmd1bWVudCwgRGFydFR5cGUgYm91bmQpOwoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgYSBnZW5lcmljIFtpbnN0YW50aWF0aW9uXSBpcyB1c2VkLgogIHZvaWQgcmVnaXN0ZXJHZW5lcmljSW5zdGFudGlhdGlvbihHZW5lcmljSW5zdGFudGlhdGlvbiBpbnN0YW50aWF0aW9uKTsKCiAgLy8vIENvbXB1dGVzIHRoZSBbUnVudGltZVR5cGVzQ2hlY2tzXSBmb3IgdGhlIGRhdGEgaW4gdGhpcyBidWlsZGVyLgogIFJ1bnRpbWVUeXBlc0NoZWNrcyBjb21wdXRlUmVxdWlyZWRDaGVja3MoCiAgICAgIENvZGVnZW5Xb3JsZCBjb2RlZ2VuV29ybGQsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zKTsKCiAgYm9vbCBnZXQgcnRpQ2hlY2tzQnVpbGRlckNsb3NlZDsKfQoKY2xhc3MgVHJpdmlhbFJ1bnRpbWVUeXBlc0NoZWNrc0J1aWxkZXIgaW1wbGVtZW50cyBSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyIHsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIFRyaXZpYWxSdW50aW1lVHlwZXNTdWJzdGl0dXRpb25zIF9zdWJzdGl0dXRpb25zOwogIEBvdmVycmlkZQogIGJvb2wgcnRpQ2hlY2tzQnVpbGRlckNsb3NlZCA9IGZhbHNlOwoKICBUcml2aWFsUnVudGltZVR5cGVzQ2hlY2tzQnVpbGRlcih0aGlzLl9jbG9zZWRXb3JsZCwgdGhpcy5fc3Vic3RpdHV0aW9ucyk7CgogIEVsZW1lbnRFbnZpcm9ubWVudCBnZXQgX2VsZW1lbnRFbnZpcm9ubWVudCA9PiBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50OwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyVHlwZVZhcmlhYmxlQm91bmRzU3VidHlwZUNoZWNrKAogICAgICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQsIERhcnRUeXBlIGJvdW5kKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyR2VuZXJpY0luc3RhbnRpYXRpb24oR2VuZXJpY0luc3RhbnRpYXRpb24gaW5zdGFudGlhdGlvbikge30KCiAgQG92ZXJyaWRlCiAgUnVudGltZVR5cGVzQ2hlY2tzIGNvbXB1dGVSZXF1aXJlZENoZWNrcygKICAgICAgQ29kZWdlbldvcmxkIGNvZGVnZW5Xb3JsZCwgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMpIHsKICAgIHJ0aUNoZWNrc0J1aWxkZXJDbG9zZWQgPSB0cnVlOwoKICAgIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NVc2U+IGNsYXNzVXNlTWFwID0gPENsYXNzRW50aXR5LCBDbGFzc1VzZT57fTsKICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xzIGluIF9jbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeQogICAgICAgIC5nZXRDbGFzc1NldChfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpCiAgICAgICAgLnN1YnR5cGVzKCkpIHsKICAgICAgQ2xhc3NVc2UgY2xhc3NVc2UgPSBuZXcgQ2xhc3NVc2UoKQogICAgICAgIC4uZGlyZWN0SW5zdGFuY2UgPSB0cnVlCiAgICAgICAgLi5jaGVja2VkSW5zdGFuY2UgPSB0cnVlCiAgICAgICAgLi50eXBlQXJndW1lbnQgPSB0cnVlCiAgICAgICAgLi5jaGVja2VkVHlwZUFyZ3VtZW50ID0gdHJ1ZQogICAgICAgIC4udHlwZUxpdGVyYWwgPSB0cnVlCiAgICAgICAgLi5mdW5jdGlvblR5cGUgPSBfY29tcHV0ZUZ1bmN0aW9uVHlwZShfZWxlbWVudEVudmlyb25tZW50LCBjbHMpOwogICAgICBjbGFzc1VzZU1hcFtjbHNdID0gY2xhc3NVc2U7CiAgICB9CiAgICBUeXBlQ2hlY2tzIHR5cGVDaGVja3MgPSBfc3Vic3RpdHV0aW9ucy5fcmVxdWlyZWRDaGVja3MgPQogICAgICAgIF9zdWJzdGl0dXRpb25zLl9jb21wdXRlQ2hlY2tzKGNsYXNzVXNlTWFwKTsKICAgIHJldHVybiBuZXcgVHJpdmlhbFR5cGVzQ2hlY2tzKHR5cGVDaGVja3MpOwogIH0KCiAgU2V0PENsYXNzRW50aXR5PiBjb21wdXRlQ2hlY2tlZENsYXNzZXMoCiAgICAgIENvZGVnZW5Xb3JsZEJ1aWxkZXIgY29kZWdlbldvcmxkQnVpbGRlciwgU2V0PERhcnRUeXBlPiBpbXBsaWNpdElzQ2hlY2tzKSB7CiAgICByZXR1cm4gX2Nsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5CiAgICAgICAgLmdldENsYXNzU2V0KF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcykKICAgICAgICAuc3VidHlwZXMoKQogICAgICAgIC50b1NldCgpOwogIH0KCiAgU2V0PEZ1bmN0aW9uVHlwZT4gY29tcHV0ZUNoZWNrZWRGdW5jdGlvbnMoCiAgICAgIENvZGVnZW5Xb3JsZEJ1aWxkZXIgY29kZWdlbldvcmxkQnVpbGRlciwgU2V0PERhcnRUeXBlPiBpbXBsaWNpdElzQ2hlY2tzKSB7CiAgICByZXR1cm4gbmV3IFNldDxGdW5jdGlvblR5cGU+KCk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBSdW50aW1lVHlwZXNTdWJzdGl0dXRpb25zTWl4aW4KICAgIGltcGxlbWVudHMgUnVudGltZVR5cGVzU3Vic3RpdHV0aW9ucyB7CiAgSkNsb3NlZFdvcmxkIGdldCBfY2xvc2VkV29ybGQ7CiAgVHlwZUNoZWNrcyBnZXQgX3JlcXVpcmVkQ2hlY2tzOwoKICBKRWxlbWVudEVudmlyb25tZW50IGdldCBfZWxlbWVudEVudmlyb25tZW50ID0+CiAgICAgIF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQ7CiAgRGFydFR5cGVzIGdldCBfdHlwZXMgPT4gX2Nsb3NlZFdvcmxkLmRhcnRUeXBlczsKICBSdW50aW1lVHlwZXNOZWVkIGdldCBfcnRpTmVlZCA9PiBfY2xvc2VkV29ybGQucnRpTmVlZDsKCiAgLy8vIENvbXB1dGUgdGhlIHJlcXVpcmVkIHR5cGUgY2hlY2tzIGFuZCBzdWJzdGl0dXRpb25zIGZvciB0aGUgZ2l2ZW4KICAvLy8gaW5zdGFudGlhdGVkIGFuZCBjaGVja2VkIGNsYXNzZXMuCiAgVHlwZUNoZWNrcyBfY29tcHV0ZUNoZWNrcyhNYXA8Q2xhc3NFbnRpdHksIENsYXNzVXNlPiBjbGFzc1VzZU1hcCkgewogICAgLy8gUnVuIHRocm91Z2ggdGhlIGNvbWJpbmF0aW9uIG9mIGluc3RhbnRpYXRlZCBhbmQgY2hlY2tlZAogICAgLy8gYXJndW1lbnRzIGFuZCByZWNvcmQgYWxsIGNvbWJpbmF0aW9uIHdoZXJlIHRoZSBlbGVtZW50IG9mIGEgY2hlY2tlZAogICAgLy8gYXJndW1lbnQgaXMgYSBzdXBlcmNsYXNzIG9mIHRoZSBlbGVtZW50IG9mIGFuIGluc3RhbnRpYXRlZCB0eXBlLgogICAgVHlwZUNoZWNrTWFwcGluZyByZXN1bHQgPSBuZXcgVHlwZUNoZWNrTWFwcGluZygpOwogICAgU2V0PENsYXNzRW50aXR5PiBoYW5kbGVkID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgICAvLyBFbXB0eSB1c2FnZSBvYmplY3QgZm9yIGNsYXNzZXMgd2l0aCBubyBkaXJlY3QgcnRpIHVzYWdlLgogICAgZmluYWwgQ2xhc3NVc2UgZW1wdHlVc2UgPSBuZXcgQ2xhc3NVc2UoKTsKCiAgICAvLy8gQ29tcHV0ZSB0aGUgJGlzWCBhbmQgJGFzWCBmdW5jdGlvbnMgbmVlZCBmb3IgW2Nsc10uCiAgICBDbGFzc0NoZWNrcyBjb21wdXRlQ2hlY2tzKENsYXNzRW50aXR5IGNscykgewogICAgICBpZiAoIWhhbmRsZWQuYWRkKGNscykpIHJldHVybiByZXN1bHRbY2xzXTsKCiAgICAgIENsYXNzVXNlIGNsYXNzVXNlID0gY2xhc3NVc2VNYXBbY2xzXSA/PyBlbXB0eVVzZTsKICAgICAgQ2xhc3NDaGVja3MgY2hlY2tzID0gbmV3IENsYXNzQ2hlY2tzKGNsYXNzVXNlLmZ1bmN0aW9uVHlwZSk7CiAgICAgIHJlc3VsdFtjbHNdID0gY2hlY2tzOwoKICAgICAgLy8gRmluZCB0aGUgc3VwZXJjbGFzcyBmcm9tIHdoaWNoIFtjbHNdIGluaGVyaXRzIGNoZWNrcy4KICAgICAgQ2xhc3NFbnRpdHkgc3VwZXJDbGFzcyA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhjbHMsCiAgICAgICAgICBza2lwVW5uYW1lZE1peGluQXBwbGljYXRpb25zOiB0cnVlKTsKICAgICAgQ2xhc3NDaGVja3Mgc3VwZXJDaGVja3M7CiAgICAgIGJvb2wgZXh0ZW5kc1N1cGVyQ2xhc3NUcml2aWFsbHkgPSBmYWxzZTsKICAgICAgaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCkgewogICAgICAgIC8vIENvbXB1dGUgdGhlIGNoZWNrcyBpbmhlcml0ZWQgZnJvbSBbc3VwZXJDbGFzc10uCiAgICAgICAgc3VwZXJDaGVja3MgPSBjb21wdXRlQ2hlY2tzKHN1cGVyQ2xhc3MpOwoKICAgICAgICAvLyBEb2VzIFtjbHNdIGV4dGVuZCBbc3VwZXJDbGFzc10gdHJpdmlhbGx5PwogICAgICAgIC8vCiAgICAgICAgLy8gRm9yIGluc3RhbmNlOgogICAgICAgIC8vCiAgICAgICAgLy8gICAgIGNsYXNzIEE8VD4ge30KICAgICAgICAvLyAgICAgY2xhc3MgQjxTPiBleHRlbmRzIEE8Uz4ge30KICAgICAgICAvLyAgICAgY2xhc3MgQzxVLCBWPiBleHRlbmRzIEE8VT4ge30KICAgICAgICAvLyAgICAgY2xhc3MgRCBleHRlbmRzIEE8aW50PiB7fQogICAgICAgIC8vCiAgICAgICAgLy8gaGVyZSBgQmAgZXh0ZW5kcyBgQWAgdHJpdmlhbGx5LCBidXQgYENgIGFuZCBgRGAgZG9uJ3QuCiAgICAgICAgZXh0ZW5kc1N1cGVyQ2xhc3NUcml2aWFsbHkgPSBpc1RyaXZpYWxTdWJzdGl0dXRpb24oY2xzLCBzdXBlckNsYXNzKTsKICAgICAgfQoKICAgICAgYm9vbCBpc05hdGl2ZUNsYXNzID0gX2Nsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaXNOYXRpdmVDbGFzcyhjbHMpOwogICAgICBpZiAoY2xhc3NVc2UudHlwZUFyZ3VtZW50IHx8CiAgICAgICAgICBjbGFzc1VzZS50eXBlTGl0ZXJhbCB8fAogICAgICAgICAgKGlzTmF0aXZlQ2xhc3MgJiYgY2xhc3NVc2UuY2hlY2tlZEluc3RhbmNlKSkgewogICAgICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBjb21wdXRlU3Vic3RpdHV0aW9uKGNscywgY2xzKTsKICAgICAgICAvLyBXZSBuZWVkIFtjbHNdIGF0IHJ1bnRpbWUgLSBldmVuIGlmIFtjbHNdIGlzIG5vdCBpbnN0YW50aWF0ZWQuIEVpdGhlcgogICAgICAgIC8vIGFzIGEgdHlwZSBhcmd1bWVudCwgZm9yIGEgdHlwZSBsaXRlcmFsIG9yIGZvciBhbiBpcy10ZXN0IGlmIFtjbHNdIGlzCiAgICAgICAgLy8gbmF0aXZlLgogICAgICAgIGNoZWNrcy5hZGQobmV3IFR5cGVDaGVjayhjbHMsIHN1YnN0aXR1dGlvbiwgbmVlZHNJczogaXNOYXRpdmVDbGFzcykpOwogICAgICB9CgogICAgICAvLyBDb21wdXRlIHRoZSBzZXQgb2YgY2xhc3NlcyB0aGF0IFtjbHNdIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGZyb20uCiAgICAgIC8vCiAgICAgIC8vIFRoaXMgc2V0IHJlZmxlY3RzIHRoZSBlbWl0dGVkIGNsYXNzIGhpZXJhcmNoeSBhbmQgdGhlcmVmb3JlIHVzZXMKICAgICAgLy8gYGdldEVmZmVjdGl2ZU1peGluQ2xhc3NgIHRvIGZpbmQgdGhlIGluaGVyaXRlZCBtaXhpbnMuCiAgICAgIFNldDxDbGFzc0VudGl0eT4gaW5oZXJpdGVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICAgIENsYXNzRW50aXR5IG90aGVyID0gY2xzOwogICAgICB3aGlsZSAob3RoZXIgIT0gbnVsbCkgewogICAgICAgIGluaGVyaXRlZENsYXNzZXMuYWRkKG90aGVyKTsKICAgICAgICBpZiAoY2xhc3NVc2UuaW5zdGFuY2UgJiYKICAgICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5pc01peGluQXBwbGljYXRpb24ob3RoZXIpKSB7CiAgICAgICAgICAvLyBXZSBkb24ndCBtaXhpbiBbb3RoZXJdIGlmIFtjbHNdIGlzbid0IGluc3RhbnRpYXRlZCwgZGlyZWN0bHkgb3IKICAgICAgICAgIC8vIGluZGlyZWN0bHkuCiAgICAgICAgICBpbmhlcml0ZWRDbGFzc2VzCiAgICAgICAgICAgICAgLmFkZChfZWxlbWVudEVudmlyb25tZW50LmdldEVmZmVjdGl2ZU1peGluQ2xhc3Mob3RoZXIpKTsKICAgICAgICB9CiAgICAgICAgb3RoZXIgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3Mob3RoZXIpOwogICAgICB9CgogICAgICAvLy8gQ29tcHV0ZSB0aGUgbmVlZGVkIGNoZWNrIGZvciBbY2xzXSBhZ2FpbnN0IHRoZSBjbGFzcyBvZiB0aGUgc3VwZXIKICAgICAgLy8vIFt0eXBlXS4KICAgICAgdm9pZCBwcm9jZXNzU3VwZXJ0eXBlKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgICAgIENsYXNzRW50aXR5IGNoZWNrZWRDbGFzcyA9IHR5cGUuZWxlbWVudDsKICAgICAgICBDbGFzc1VzZSBjaGVja2VkQ2xhc3NVc2UgPSBjbGFzc1VzZU1hcFtjaGVja2VkQ2xhc3NdID8/IGVtcHR5VXNlOwoKICAgICAgICAvLyBXaGVyZSBbY2xzXSBpbmhlcml0cyBwcm9wZXJ0aWVzIGZvciBbY2hlY2tlZENsYXNzXS4KICAgICAgICBib29sIGluaGVyaXRzRnJvbUNoZWNrZWRDbGFzcyA9IGluaGVyaXRlZENsYXNzZXMuY29udGFpbnMoY2hlY2tlZENsYXNzKTsKCiAgICAgICAgLy8gSWYgW2Nsc10gaW5oZXJpdHMgcHJvcGVydGllcyBmcm9tIFtjaGVja2VkQ2xhc3NdIGFuZCBbY2hlY2tlZENsYXNzXQogICAgICAgIC8vIG5lZWRzIHR5cGUgYXJndW1lbnRzLCBbY2xzXSBtdXN0IHByb3ZpZGUgYSBzdWJzdGl0dXRpb24gZm9yCiAgICAgICAgLy8gW2NoZWNrZWRDbGFzc10uCiAgICAgICAgLy8KICAgICAgICAvLyBGb3IgaW5zdGFuY2U6CiAgICAgICAgLy8KICAgICAgICAvLyAgICAgY2xhc3MgTTxUPiB7CiAgICAgICAgLy8gICAgICAgIG0oKSA9PiBUOwogICAgICAgIC8vICAgICB9CiAgICAgICAgLy8gICAgIGNsYXNzIFMge30KICAgICAgICAvLyAgICAgY2xhc3MgQyBleHRlbmRzIFMgd2l0aCBNPGludD4ge30KICAgICAgICAvLwogICAgICAgIC8vIEhlcmUgYENgIG5lZWRzIGFuIGAkYXNNYCBzdWJzdGl0dXRpb24gZnVuY3Rpb24gdG8gcHJvdmlkZSB0aGUgdmFsdWUKICAgICAgICAvLyBvZiBgVGAgaW4gYE0ubWAuCiAgICAgICAgYm9vbCBuZWVkc1R5cGVBcmd1bWVudHNGb3JDaGVja2VkQ2xhc3MgPSBpbmhlcml0c0Zyb21DaGVja2VkQ2xhc3MgJiYKICAgICAgICAgICAgX3J0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoY2hlY2tlZENsYXNzKTsKCiAgICAgICAgLy8gV2hldGhlciBbY2hlY2tlZENsYXNzXSBpcyB1c2VkIGluIGFuIGluc3RhbmNlIHRlc3Qgb3IgdHlwZSBhcmd1bWVudAogICAgICAgIC8vIHRlc3QuCiAgICAgICAgLy8KICAgICAgICAvLyBGb3IgaW5zdGFuY2U6CiAgICAgICAgLy8KICAgICAgICAvLyAgICBjbGFzcyBBIHt9CiAgICAgICAgLy8gICAgY2xhc3MgQiB7fQogICAgICAgIC8vICAgIHRlc3QobykgPT4gbyBpcyBBIHx8IG8gaXMgTGlzdDxCPjsKICAgICAgICAvLwogICAgICAgIC8vIEhlcmUgYEFgIGlzIHVzZWQgaW4gYW4gaW5zdGFuY2UgdGVzdCBhbmQgYEJgIGlzIHVzZWQgaW4gYSB0eXBlCiAgICAgICAgLy8gYXJndW1lbnQgdGVzdC4KICAgICAgICBib29sIGlzQ2hlY2tlZCA9IGNoZWNrZWRDbGFzc1VzZS5jaGVja2VkVHlwZUFyZ3VtZW50IHx8CiAgICAgICAgICAgIGNoZWNrZWRDbGFzc1VzZS5jaGVja2VkSW5zdGFuY2U7CgogICAgICAgIGlmIChpc0NoZWNrZWQgfHwgbmVlZHNUeXBlQXJndW1lbnRzRm9yQ2hlY2tlZENsYXNzKSB7CiAgICAgICAgICAvLyBXZSBuZWVkIGFuICRpc1ggYW5kL29yICRhc1ggcHJvcGVydHkgb24gW2Nsc10gZm9yIFtjaGVja2VkQ2xhc3NdLgoKICAgICAgICAgIC8vIFdoZXRoZXIgYGNsc2AgaW1wbGVtZW50cyBgY2hlY2tlZENsYXNzYCB0cml2aWFsbHkuCiAgICAgICAgICAvLwogICAgICAgICAgLy8gRm9yIGluc3RhbmNlOgogICAgICAgICAgLy8KICAgICAgICAgIC8vICAgICBjbGFzcyBBPFQ+IHt9CiAgICAgICAgICAvLyAgICAgY2xhc3MgQjxTPiBpbXBsZW1lbnRzIEE8Uz4ge30KICAgICAgICAgIC8vICAgICBjbGFzcyBDPFUsIFY+IGltcGxlbWVudHMgQTxVPiB7fQogICAgICAgICAgLy8gICAgIGNsYXNzIEQgaW1wbGVtZW50cyBBPGludD4ge30KICAgICAgICAgIC8vCiAgICAgICAgICAvLyBoZXJlIGBCYCBpbXBsZW1lbnRzIGBBYCB0cml2aWFsbHksIGJ1dCBgQ2AgYW5kIGBEYCBkb24ndC4KICAgICAgICAgIGJvb2wgaW1wbGVtZW50c0NoZWNrZWRUcml2aWFsbHkgPQogICAgICAgICAgICAgIGlzVHJpdmlhbFN1YnN0aXR1dGlvbihjbHMsIGNoZWNrZWRDbGFzcyk7CgogICAgICAgICAgLy8gV2hldGhlciBbY2hlY2tlZENsYXNzXSBpcyBnZW5lcmljLgogICAgICAgICAgLy8KICAgICAgICAgIC8vIEN1cnJlbnRseSBbaXNUcml2aWFsU3Vic3RpdHV0aW9uXSByZXBvcnRzIHRoYXQgW2Nsc10gaW1wbGVtZW50cwogICAgICAgICAgLy8gW2NoZWNrZWRDbGFzc10gdHJpdmlhbGx5IGlmIFtjaGVja2VkQ2xhc3NdIGlzIG5vdCBnZW5lcmljLiBJbiB0aGlzCiAgICAgICAgICAvLyBjYXNlIHRoZSBzdWJzdGl0dXRpb24gaXMgbm90IG9ubHkgdHJpdmlhbCBpdCBpcyBhbHNvIG5vdCBuZWVkZWQuCiAgICAgICAgICBib29sIGlzQ2hlY2tlZEdlbmVyaWMgPQogICAgICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuaXNHZW5lcmljQ2xhc3MoY2hlY2tlZENsYXNzKTsKCiAgICAgICAgICAvLyBUaGUgY2hlY2tzIGZvciBbY2hlY2tlZENsYXNzXSBpbmhlcml0ZWQgZm9yIFtzdXBlckNsYXNzXS4KICAgICAgICAgIFR5cGVDaGVjayBjaGVja0Zyb21TdXBlckNsYXNzID0KICAgICAgICAgICAgICBzdXBlckNoZWNrcyAhPSBudWxsID8gc3VwZXJDaGVja3NbY2hlY2tlZENsYXNzXSA6IG51bGw7CgogICAgICAgICAgLy8gV2hldGhlciBbY2xzXSBuZWVkIGFuIGV4cGxpY2l0ICRpc1ggcHJvcGVydHkgZm9yIFtjaGVja2VkQ2xhc3NdLgogICAgICAgICAgLy8KICAgICAgICAgIC8vIElmIFtjbHNdIGluaGVyaXRzIGZyb20gW2NoZWNrZWRDbGFzc10gaXQgYWxzbyBpbmhlcml0cyB0aGUgJGlzWAogICAgICAgICAgLy8gcHJvcGVydHkgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgb24gW2NoZWNrZWRDbGFzc10uCiAgICAgICAgICBib29sIG5lZWRzSXMgPSAhaW5oZXJpdHNGcm9tQ2hlY2tlZENsYXNzICYmIGlzQ2hlY2tlZDsKCiAgICAgICAgICBpZiAoY2hlY2tGcm9tU3VwZXJDbGFzcyAhPSBudWxsKSB7CiAgICAgICAgICAgIC8vIFRoZSBzdXBlcmNsYXNzIGhhcyBhIHN1YnN0aXR1dGlvbiBmdW5jdGlvbiBmb3IgW2NoZWNrZWRDbGFzc10uCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGNhbiByZXVzZSB0aGlzIGl0IG9mIG5lZWQgdG8gb3ZlcnJpZGUgaXQuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSBpbmhlcml0ZWQgJGlzWCBwcm9wZXJ0eSBkb2VzIF9ub3RfIG5lZWQgdG8gYmUgb3ZlcnJpZGluZy4KICAgICAgICAgICAgaWYgKGV4dGVuZHNTdXBlckNsYXNzVHJpdmlhbGx5KSB7CiAgICAgICAgICAgICAgLy8gW2Nsc10gaW1wbGVtZW50cyBbY2hlY2tlZENsYXNzXSB0aGUgc2FtZSB3YXkgYXMgW3N1cGVyQ2xhc3NdCiAgICAgICAgICAgICAgLy8gc28gdGhlIGluaGVyaXRlZCBzdWJzdGl0dXRpb24gZnVuY3Rpb24gYWxyZWFkeSB3b3Jrcy4KICAgICAgICAgICAgICBjaGVja3MuYWRkKG5ldyBUeXBlQ2hlY2soY2hlY2tlZENsYXNzLCBudWxsLCBuZWVkc0lzOiBmYWxzZSkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIFtjbHNdIGltcGxlbWVudHMgW2NoZWNrZWRDbGFzc10gZGlmZmVyZW50bHkgZnJvbSBbc3VwZXJDbGFzc10KICAgICAgICAgICAgICAvLyBzbyB0aGUgaW5oZXJpdGVkIHN1YnN0aXR1dGlvbiBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXBsYWNlZC4KICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50c0NoZWNrZWRUcml2aWFsbHkpIHsKICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgYW4gZXhwbGljaXQgdHJpdmlhbCBzdWJzdGl0dXRpb24gZnVuY3Rpb24gZm9yCiAgICAgICAgICAgICAgICAvLyBbY2hlY2tlZENsYXNzXSB0aGF0IG92ZXJyaWRlcyB0aGUgaW5oZXJpdGVkIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgY2hlY2tzLmFkZChuZXcgVHlwZUNoZWNrKGNoZWNrZWRDbGFzcywKICAgICAgICAgICAgICAgICAgICBpc0NoZWNrZWRHZW5lcmljID8gY29uc3QgU3Vic3RpdHV0aW9uLnRyaXZpYWwoKSA6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgbmVlZHNJczogZmFsc2UpKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gV2UgbmVlZCBhIG5vbi10cml2aWFsIHN1YnN0aXR1dGlvbiBmdW5jdGlvbiBmb3IKICAgICAgICAgICAgICAgIC8vIFtjaGVja2VkQ2xhc3NdLgogICAgICAgICAgICAgICAgY2hlY2tzLmFkZChuZXcgVHlwZUNoZWNrKAogICAgICAgICAgICAgICAgICAgIGNoZWNrZWRDbGFzcywgY29tcHV0ZVN1YnN0aXR1dGlvbihjbHMsIGNoZWNrZWRDbGFzcyksCiAgICAgICAgICAgICAgICAgICAgbmVlZHNJczogZmFsc2UpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFRoZSBzdXBlcmNsYXNzIGhhcyBubyBzdWJzdGl0dXRpb24gZnVuY3Rpb24gZm9yIFtjaGVja2VkQ2xhc3NdLgogICAgICAgICAgICBpZiAoaW1wbGVtZW50c0NoZWNrZWRUcml2aWFsbHkpIHsKICAgICAgICAgICAgICAvLyBXZSBkb24ndCBhZGQgYW4gZXhwbGljaXQgc3Vic3RpdHV0aW9uIGZ1bmN0aW9uIGZvcgogICAgICAgICAgICAgIC8vIFtjaGVja2VkQ2xhc3NdIGJlY2F1c2UgdGhlIHN1YnN0aXR1dGlvbiBpcyB0cml2aWFsIGFuZCBkb2Vzbid0CiAgICAgICAgICAgICAgLy8gbmVlZCB0byBvdmVycmlkZSBhbiBpbmhlcml0ZWQgZnVuY3Rpb24uCiAgICAgICAgICAgICAgY2hlY2tzLmFkZChuZXcgVHlwZUNoZWNrKGNoZWNrZWRDbGFzcywgbnVsbCwgbmVlZHNJczogbmVlZHNJcykpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIFdlIG5lZWQgYSBub24tdHJpdmlhbCBzdWJzdGl0dXRpb24gZnVuY3Rpb24gZm9yCiAgICAgICAgICAgICAgLy8gW2NoZWNrZWRDbGFzc10uCiAgICAgICAgICAgICAgY2hlY2tzLmFkZChuZXcgVHlwZUNoZWNrKAogICAgICAgICAgICAgICAgICBjaGVja2VkQ2xhc3MsIGNvbXB1dGVTdWJzdGl0dXRpb24oY2xzLCBjaGVja2VkQ2xhc3MpLAogICAgICAgICAgICAgICAgICBuZWVkc0lzOiBuZWVkc0lzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSB0eXBlIGluIF90eXBlcy5nZXRTdXBlcnR5cGVzKGNscykpIHsKICAgICAgICBwcm9jZXNzU3VwZXJ0eXBlKHR5cGUpOwogICAgICB9CiAgICAgIEZ1bmN0aW9uVHlwZSBjYWxsVHlwZSA9IF90eXBlcy5nZXRDYWxsVHlwZShfdHlwZXMuZ2V0VGhpc1R5cGUoY2xzKSk7CiAgICAgIGlmIChjYWxsVHlwZSAhPSBudWxsKSB7CiAgICAgICAgcHJvY2Vzc1N1cGVydHlwZShfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuZnVuY3Rpb25UeXBlKTsKICAgICAgfQogICAgICByZXR1cm4gY2hlY2tzOwogICAgfQoKICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xzIGluIGNsYXNzVXNlTWFwLmtleXMpIHsKICAgICAgQ2xhc3NVc2UgY2xhc3NVc2UgPSBjbGFzc1VzZU1hcFtjbHNdID8/IGVtcHR5VXNlOwogICAgICBpZiAoY2xhc3NVc2UuZGlyZWN0SW5zdGFuY2UgfHwKICAgICAgICAgIGNsYXNzVXNlLnR5cGVBcmd1bWVudCB8fAogICAgICAgICAgY2xhc3NVc2UudHlwZUxpdGVyYWwpIHsKICAgICAgICAvLyBBZGQgY2hlY2tzIG9ubHkgZm9yIGNsYXNzZXMgdGhhdCBhcmUgbGl2ZSBlaXRoZXIgYXMgaW5zdGFudGlhdGVkCiAgICAgICAgLy8gY2xhc3NlcyBvciB0eXBlIGFyZ3VtZW50cyBwYXNzZWQgYXQgcnVudGltZS4KICAgICAgICBjb21wdXRlQ2hlY2tzKGNscyk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgU2V0PENsYXNzRW50aXR5PiBnZXRDbGFzc2VzVXNlZEluU3Vic3RpdHV0aW9ucyhUeXBlQ2hlY2tzIGNoZWNrcykgewogICAgU2V0PENsYXNzRW50aXR5PiBpbnN0YW50aWF0ZWQgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwogICAgQXJndW1lbnRDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IEFyZ3VtZW50Q29sbGVjdG9yKCk7CiAgICBmb3IgKENsYXNzRW50aXR5IHRhcmdldCBpbiBjaGVja3MuY2xhc3NlcykgewogICAgICBDbGFzc0NoZWNrcyBjbGFzc0NoZWNrcyA9IGNoZWNrc1t0YXJnZXRdOwogICAgICBmb3IgKFR5cGVDaGVjayBjaGVjayBpbiBjbGFzc0NoZWNrcy5jaGVja3MpIHsKICAgICAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gY2hlY2suc3Vic3RpdHV0aW9uOwogICAgICAgIGlmIChzdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICAgICAgY29sbGVjdG9yLmNvbGxlY3RBbGwoc3Vic3RpdHV0aW9uLmFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gaW5zdGFudGlhdGVkLi5hZGRBbGwoY29sbGVjdG9yLmNsYXNzZXMpOwoKICAgIC8vIFRPRE8oc3JhKTogVGhpcyBjb21wdXRhdGlvbiBtaXNzZXMgc3Vic3RpdHV0aW9ucyBmb3IgcmVhZGluZyB0eXBlCiAgICAvLyBwYXJhbWV0ZXJzLgogIH0KCiAgLy8gVE9ETyhrYXJsa2xvc2UpOiBtYXliZSBwcmVjb21wdXRlIHRoaXMgdmFsdWUgYW5kIHN0b3JlIGl0IGluIHR5cGVDaGVja3M/CiAgQG92ZXJyaWRlCiAgYm9vbCBpc1RyaXZpYWxTdWJzdGl0dXRpb24oQ2xhc3NFbnRpdHkgY2xzLCBDbGFzc0VudGl0eSBjaGVjaykgewogICAgaWYgKGNscy5pc0Nsb3N1cmUpIHsKICAgICAgLy8gVE9ETyhrYXJsa2xvc2UpOiBoYW5kbGUgY2xvc3VyZXMuCiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIElmIHRoZXJlIGFyZSBubyB0eXBlIHZhcmlhYmxlcywgd2UgZG8gbm90IG5lZWQgYSBzdWJzdGl0dXRpb24uCiAgICBpZiAoIV9lbGVtZW50RW52aXJvbm1lbnQuaXNHZW5lcmljQ2xhc3MoY2hlY2spKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIEpTLWludGVyb3AgY2xhc3NlcyBuZWVkIGFuIGV4cGxpY2l0IHN1YnN0aXR1dGlvbiB0byBtYXJrIHRoZSB0eXBlCiAgICAvLyBhcmd1bWVudHMgYXMgYGFueWAgdHlwZS4KICAgIGlmIChfY2xvc2VkV29ybGQubmF0aXZlRGF0YS5pc0pzSW50ZXJvcENsYXNzKGNscykpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIElmIHRoZSB0eXBlIGlzIHRoZSBzYW1lLCB3ZSBkbyBub3QgbmVlZCBhIHN1YnN0aXR1dGlvbi4KICAgIGlmIChjbHMgPT0gY2hlY2spIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgSW50ZXJmYWNlVHlwZSBvcmlnaW5hbFR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKGNscyk7CiAgICBJbnRlcmZhY2VUeXBlIHR5cGUgPSBfdHlwZXMuYXNJbnN0YW5jZU9mKG9yaWdpbmFsVHlwZSwgY2hlY2spOwogICAgLy8gW3R5cGVdIGlzIG5vdCBhIHN1YnR5cGUgb2YgW2NoZWNrXS4gd2UgZG8gbm90IGdlbmVyYXRlIGEgY2hlY2sgYW5kIGRvIG5vdAogICAgLy8gbmVlZCBhIHN1YnN0aXR1dGlvbi4KICAgIGlmICh0eXBlID09IG51bGwpIHJldHVybiB0cnVlOwoKICAgIC8vIFJ1biB0aHJvdWdoIGJvdGggbGlzdHMgb2YgdHlwZSB2YXJpYWJsZXMgYW5kIGNoZWNrIGlmIHRoZSB0eXBlIHZhcmlhYmxlcwogICAgLy8gYXJlIGlkZW50aWNhbCBhdCBlYWNoIHBvc2l0aW9uLiBJZiB0aGV5IGFyZSBub3QsIHdlIG5lZWQgdG8gY2FsY3VsYXRlIGEKICAgIC8vIHN1YnN0aXR1dGlvbiBmdW5jdGlvbi4KICAgIExpc3Q8RGFydFR5cGU+IHZhcmlhYmxlcyA9IG9yaWdpbmFsVHlwZS50eXBlQXJndW1lbnRzOwogICAgTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzID0gdHlwZS50eXBlQXJndW1lbnRzOwogICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggIT0gYXJndW1lbnRzLmxlbmd0aCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdmFyaWFibGVzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICBpZiAodmFyaWFibGVzW2luZGV4XSAhPSBhcmd1bWVudHNbaW5kZXhdKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIFN1YnN0aXR1dGlvbiBnZXRTdWJzdGl0dXRpb24oQ2xhc3NFbnRpdHkgY2xzLCBDbGFzc0VudGl0eSBvdGhlcikgewogICAgLy8gTG9vayBmb3IgYSBwcmVjb21wdXRlZCBjaGVjay4KICAgIGZvciAoVHlwZUNoZWNrIGNoZWNrIGluIF9yZXF1aXJlZENoZWNrc1tjbHNdLmNoZWNrcykgewogICAgICBpZiAoY2hlY2suY2xzID09IG90aGVyKSB7CiAgICAgICAgcmV0dXJuIGNoZWNrLnN1YnN0aXR1dGlvbjsKICAgICAgfQogICAgfQogICAgLy8gVGhlcmUgaXMgbm8gcHJlY29tcHV0ZWQgY2hlY2sgZm9yIHRoaXMgcGFpciAoYmVjYXVzZSB0aGUgY2hlY2sgaXMgbm90CiAgICAvLyBkb25lIG9uIHR5cGUgYXJndW1lbnRzIG9ubHkuICBDb21wdXRlIGEgbmV3IHN1YnN0aXR1dGlvbi4KICAgIHJldHVybiBjb21wdXRlU3Vic3RpdHV0aW9uKGNscywgb3RoZXIpOwogIH0KCiAgU3Vic3RpdHV0aW9uIGNvbXB1dGVTdWJzdGl0dXRpb24oQ2xhc3NFbnRpdHkgY2xzLCBDbGFzc0VudGl0eSBjaGVjaywKICAgICAge2Jvb2wgYWx3YXlzR2VuZXJhdGVGdW5jdGlvbjogZmFsc2V9KSB7CiAgICBpZiAoaXNUcml2aWFsU3Vic3RpdHV0aW9uKGNscywgY2hlY2spKSByZXR1cm4gbnVsbDsKCiAgICAvLyBVbm5hbWVkIG1peGluIGFwcGxpY2F0aW9uIGNsYXNzZXMgZG8gbm90IG5lZWQgc3Vic3RpdHV0aW9ucywgYmVjYXVzZSB0aGV5CiAgICAvLyBhcmUgbmV2ZXIgaW5zdGFudGlhdGVkIGFuZCB0aGVpciBjaGVja3MgYXJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjbGFzcyB0aGF0CiAgICAvLyB0aGV5IGFyZSBtaXhlZCBpbnRvLgogICAgSW50ZXJmYWNlVHlwZSB0eXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShjbHMpOwogICAgSW50ZXJmYWNlVHlwZSB0YXJnZXQgPSBfdHlwZXMuYXNJbnN0YW5jZU9mKHR5cGUsIGNoZWNrKTsKICAgIExpc3Q8RGFydFR5cGU+IHR5cGVWYXJpYWJsZXMgPSB0eXBlLnR5cGVBcmd1bWVudHM7CiAgICBpZiAoX2Nsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyhjbHMpKSB7CiAgICAgIGludCB0eXBlQXJndW1lbnRzID0gdGFyZ2V0LnR5cGVBcmd1bWVudHMubGVuZ3RoOwogICAgICAvLyBHZW5lcmljIEpTLWludGVyb3AgY2xhc3MgbmVlZCBhbiBleHBsaWNpdCBzdWJzdGl0dXRpb24gdG8gbWFyawogICAgICAvLyB0aGUgdHlwZSBhcmd1bWVudHMgYXMgYGFueWAgdHlwZS4KICAgICAgcmV0dXJuIG5ldyBTdWJzdGl0dXRpb24uanNJbnRlcm9wKHR5cGVBcmd1bWVudHMpOwogICAgfSBlbHNlIGlmICh0eXBlVmFyaWFibGVzLmlzRW1wdHkgJiYgIWFsd2F5c0dlbmVyYXRlRnVuY3Rpb24pIHsKICAgICAgcmV0dXJuIG5ldyBTdWJzdGl0dXRpb24ubGlzdCh0YXJnZXQudHlwZUFyZ3VtZW50cyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IFN1YnN0aXR1dGlvbi5mdW5jdGlvbih0YXJnZXQudHlwZUFyZ3VtZW50cywgdHlwZVZhcmlhYmxlcyk7CiAgICB9CiAgfQp9CgpjbGFzcyBUcml2aWFsUnVudGltZVR5cGVzU3Vic3RpdHV0aW9ucyBleHRlbmRzIFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnNNaXhpbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKICBAb3ZlcnJpZGUKICBUeXBlQ2hlY2tzIF9yZXF1aXJlZENoZWNrczsKCiAgVHJpdmlhbFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnModGhpcy5fY2xvc2VkV29ybGQpOwp9CgphYnN0cmFjdCBjbGFzcyBSdW50aW1lVHlwZXNFbmNvZGVyIHsKICBqc0FzdC5FeHByZXNzaW9uIGdldFNpZ25hdHVyZUVuY29kaW5nKE1vZHVsYXJOYW1lciBuYW1lciwKICAgICAgTW9kdWxhckVtaXR0ZXIgZW1pdHRlciwgRGFydFR5cGUgdHlwZSwganNBc3QuRXhwcmVzc2lvbiB0aGlzXyk7CgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0IHRlbXBsYXRlIHRvIGRldGVybWluZSBhdCBydW50aW1lIGlmIGEgdHlwZSBvYmplY3QKICAvLy8gaXMgYSBmdW5jdGlvbiB0eXBlLgogIGpzQXN0LlRlbXBsYXRlIGdldCB0ZW1wbGF0ZUZvcklzRnVuY3Rpb25UeXBlOwoKICAvLy8gUmV0dXJucyB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSB0byBkZXRlcm1pbmUgYXQgcnVudGltZSBpZiBhIHR5cGUgb2JqZWN0CiAgLy8vIGlzIGEgRnV0dXJlT3IgdHlwZS4KICBqc0FzdC5UZW1wbGF0ZSBnZXQgdGVtcGxhdGVGb3JJc0Z1dHVyZU9yVHlwZTsKCiAgLy8vIFJldHVybnMgdGhlIEphdmFTY3JpcHQgdGVtcGxhdGUgdG8gZGV0ZXJtaW5lIGF0IHJ1bnRpbWUgaWYgYSB0eXBlIG9iamVjdAogIC8vLyBpcyB0aGUgdm9pZCB0eXBlLgogIGpzQXN0LlRlbXBsYXRlIGdldCB0ZW1wbGF0ZUZvcklzVm9pZFR5cGU7CgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0IHRlbXBsYXRlIHRvIGRldGVybWluZSBhdCBydW50aW1lIGlmIGEgdHlwZSBvYmplY3QKICAvLy8gaXMgdGhlIGR5bmFtaWMgdHlwZS4KICBqc0FzdC5UZW1wbGF0ZSBnZXQgdGVtcGxhdGVGb3JJc0R5bmFtaWNUeXBlOwoKICAvLy8gUmV0dXJucyB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSB0byBkZXRlcm1pbmUgYXQgcnVudGltZSBpZiBhIHR5cGUgb2JqZWN0CiAgLy8vIGlzIGEgdHlwZSBhcmd1bWVudCBvZiBqcy1pbnRlcm9wIGNsYXNzLgogIGpzQXN0LlRlbXBsYXRlIGdldCB0ZW1wbGF0ZUZvcklzSnNJbnRlcm9wVHlwZUFyZ3VtZW50OwoKICAvLy8gUmV0dXJucyBhIFtqc0FzdC5FeHByZXNzaW9uXSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIFt0eXBlXS4gVHlwZSB2YXJpYWJsZXMKICAvLy8gYXJlIHJlcGxhY2VkIGJ5IHRoZSBbanNBc3QuRXhwcmVzc2lvbl0gcmV0dXJuZWQgYnkgW29uVmFyaWFibGVdLgogIGpzQXN0LkV4cHJlc3Npb24gZ2V0VHlwZVJlcHJlc2VudGF0aW9uKAogICAgICBNb2R1bGFyRW1pdHRlciBlbWl0dGVyLCBEYXJ0VHlwZSB0eXBlLCBPblZhcmlhYmxlQ2FsbGJhY2sgb25WYXJpYWJsZSwKICAgICAgW1Nob3VsZEVuY29kZVR5cGVkZWZDYWxsYmFjayBzaG91bGRFbmNvZGVUeXBlZGVmXSk7CgogIGpzQXN0LkV4cHJlc3Npb24gZ2V0SnNJbnRlcm9wVHlwZUFyZ3VtZW50cyhpbnQgY291bnQpOwoKICAvLy8gRml4ZWQgc3RyaW5ncyB1c2VkIGZvciBydW50aW1lIHR5cGVzIGVuY29kaW5nLgogIFJ1bnRpbWVUeXBlVGFncyBnZXQgcnRpVGFnczsKfQoKY2xhc3MgX1J1bnRpbWVUeXBlc0NoZWNrcyBpbXBsZW1lbnRzIFJ1bnRpbWVUeXBlc0NoZWNrcyB7CiAgZmluYWwgUnVudGltZVR5cGVzU3Vic3RpdHV0aW9ucyBfc3Vic3RpdHV0aW9uczsKICBAb3ZlcnJpZGUKICBmaW5hbCBUeXBlQ2hlY2tzIHJlcXVpcmVkQ2hlY2tzOwogIGZpbmFsIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBfdHlwZUxpdGVyYWxzOwogIGZpbmFsIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBfdHlwZUFyZ3VtZW50czsKCiAgX1J1bnRpbWVUeXBlc0NoZWNrcyh0aGlzLl9zdWJzdGl0dXRpb25zLCB0aGlzLnJlcXVpcmVkQ2hlY2tzLAogICAgICB0aGlzLl90eXBlTGl0ZXJhbHMsIHRoaXMuX3R5cGVBcmd1bWVudHMpOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IHJlcXVpcmVkQ2xhc3NlcyB7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IHJlcXVpcmVkID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgIHJlcXVpcmVkLmFkZEFsbChfdHlwZUFyZ3VtZW50cyk7CiAgICByZXF1aXJlZC5hZGRBbGwoX3R5cGVMaXRlcmFscyk7CiAgICByZXF1aXJlZAogICAgICAgIC5hZGRBbGwoX3N1YnN0aXR1dGlvbnMuZ2V0Q2xhc3Nlc1VzZWRJblN1YnN0aXR1dGlvbnMocmVxdWlyZWRDaGVja3MpKTsKICAgIHJldHVybiByZXF1aXJlZDsKICB9Cn0KCmNsYXNzIFJ1bnRpbWVUeXBlc0ltcGwKICAgIHdpdGggUnVudGltZVR5cGVzU3Vic3RpdHV0aW9uc01peGluCiAgICBpbXBsZW1lbnRzIFJ1bnRpbWVUeXBlc0NoZWNrc0J1aWxkZXIgewogIEBvdmVycmlkZQogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CgogIC8vIFRoZSBzZXQgb2YgdHlwZSBhcmd1bWVudHMgdGVzdGVkIGFnYWluc3QgdHlwZSB2YXJpYWJsZSBib3VuZHMuCiAgZmluYWwgU2V0PERhcnRUeXBlPiBjaGVja2VkVHlwZUFyZ3VtZW50cyA9IG5ldyBTZXQ8RGFydFR5cGU+KCk7CiAgLy8gVGhlIHNldCBvZiB0ZXN0ZWQgdHlwZSB2YXJpYWJsZSBib3VuZHMuCiAgZmluYWwgU2V0PERhcnRUeXBlPiBjaGVja2VkQm91bmRzID0gbmV3IFNldDxEYXJ0VHlwZT4oKTsKCiAgVHlwZUNoZWNrcyBjYWNoZWRSZXF1aXJlZENoZWNrczsKCiAgQG92ZXJyaWRlCiAgYm9vbCBydGlDaGVja3NCdWlsZGVyQ2xvc2VkID0gZmFsc2U7CgogIFJ1bnRpbWVUeXBlc0ltcGwodGhpcy5fY2xvc2VkV29ybGQpOwoKICBKQ29tbW9uRWxlbWVudHMgZ2V0IF9jb21tb25FbGVtZW50cyA9PiBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHM7CiAgQG92ZXJyaWRlCiAgSkVsZW1lbnRFbnZpcm9ubWVudCBnZXQgX2VsZW1lbnRFbnZpcm9ubWVudCA9PgogICAgICBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50OwogIEBvdmVycmlkZQogIFJ1bnRpbWVUeXBlc05lZWQgZ2V0IF9ydGlOZWVkID0+IF9jbG9zZWRXb3JsZC5ydGlOZWVkOwoKICBAb3ZlcnJpZGUKICBUeXBlQ2hlY2tzIGdldCBfcmVxdWlyZWRDaGVja3MgPT4gY2FjaGVkUmVxdWlyZWRDaGVja3M7CgogIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NVc2U+IGNsYXNzVXNlTWFwRm9yVGVzdGluZzsKCiAgZmluYWwgU2V0PEdlbmVyaWNJbnN0YW50aWF0aW9uPiBfZ2VuZXJpY0luc3RhbnRpYXRpb25zID0KICAgICAgbmV3IFNldDxHZW5lcmljSW5zdGFudGlhdGlvbj4oKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVjaygKICAgICAgRGFydFR5cGUgdHlwZUFyZ3VtZW50LCBEYXJ0VHlwZSBib3VuZCkgewogICAgY2hlY2tlZFR5cGVBcmd1bWVudHMuYWRkKHR5cGVBcmd1bWVudCk7CiAgICBjaGVja2VkQm91bmRzLmFkZChib3VuZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyR2VuZXJpY0luc3RhbnRpYXRpb24oR2VuZXJpY0luc3RhbnRpYXRpb24gaW5zdGFudGlhdGlvbikgewogICAgX2dlbmVyaWNJbnN0YW50aWF0aW9ucy5hZGQoaW5zdGFudGlhdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBSdW50aW1lVHlwZXNDaGVja3MgY29tcHV0ZVJlcXVpcmVkQ2hlY2tzKAogICAgICBDb2RlZ2VuV29ybGQgY29kZWdlbldvcmxkLCBDb21waWxlck9wdGlvbnMgb3B0aW9ucykgewogICAgVHlwZVZhcmlhYmxlVGVzdHMgdHlwZVZhcmlhYmxlVGVzdHMgPSBuZXcgVHlwZVZhcmlhYmxlVGVzdHMoCiAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICBfY29tbW9uRWxlbWVudHMsCiAgICAgICAgX3R5cGVzLAogICAgICAgIGNvZGVnZW5Xb3JsZCwKICAgICAgICBfZ2VuZXJpY0luc3RhbnRpYXRpb25zLAogICAgICAgIGZvclJ0aU5lZWRzOiBmYWxzZSk7CiAgICBTZXQ8RGFydFR5cGU+IGV4cGxpY2l0SXNDaGVja3MgPSB0eXBlVmFyaWFibGVUZXN0cy5leHBsaWNpdElzQ2hlY2tzOwogICAgU2V0PERhcnRUeXBlPiBpbXBsaWNpdElzQ2hlY2tzID0gdHlwZVZhcmlhYmxlVGVzdHMuaW1wbGljaXRJc0NoZWNrczsKCiAgICBNYXA8Q2xhc3NFbnRpdHksIENsYXNzVXNlPiBjbGFzc1VzZU1hcCA9IDxDbGFzc0VudGl0eSwgQ2xhc3NVc2U+e307CiAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgY2xhc3NVc2VNYXBGb3JUZXN0aW5nID0gY2xhc3NVc2VNYXA7CiAgICB9CgogICAgU2V0PEZ1bmN0aW9uVHlwZT4gY2hlY2tlZEZ1bmN0aW9uVHlwZXMgPSBuZXcgU2V0PEZ1bmN0aW9uVHlwZT4oKTsKICAgIFNldDxDbGFzc0VudGl0eT4gdHlwZUxpdGVyYWxzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgIFNldDxDbGFzc0VudGl0eT4gdHlwZUFyZ3VtZW50cyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogICAgLy8gVGhlIFtsaXZlVHlwZVZpc2l0b3JdIGlzIHVzZWQgdG8gcmVnaXN0ZXIgY2xhc3MgdXNlIGluIHRoZSB0eXBlIG9mCiAgICAvLyBpbnN0YW50aWF0ZWQgb2JqZWN0cyBsaWtlIGBuZXcgVGAgYW5kIHRoZSBmdW5jdGlvbiB0eXBlcyBvZgogICAgLy8gdGVhciBvZmZzIGFuZCBjbG9zdXJlcy4KICAgIC8vCiAgICAvLyBBIHR5cGUgZm91bmQgaW4gYSBjb3ZhcmlhbnQgcG9zaXRpb24gb2Ygc3VjaCB0eXBlcyBpcyBjb25zaWRlcmVkIGxpdmUKICAgIC8vIHdoZXJlYXMgYSB0eXBlIGZvdW5kIGluIGEgY29udHJhdmFyaWFudCBwb3NpdGlvbiBvZiBzdWNoIHR5cGVzIGlzCiAgICAvLyBjb25zaWRlcmVkIHRlc3RlZC4KICAgIC8vCiAgICAvLyBGb3IgaW5zdGFuY2UKICAgIC8vCiAgICAvLyAgICBuZXcgQTxCIEZ1bmN0aW9uKEMpPigpOwogICAgLy8KICAgIC8vIG1ha2VzIEEgYW5kIEIgbGl2ZSBidXQgQyB0ZXN0ZWQuCiAgICBUeXBlVmlzaXRvciBsaXZlVHlwZVZpc2l0b3IgPQogICAgICAgIG5ldyBUeXBlVmlzaXRvcihvbkNsYXNzOiAoQ2xhc3NFbnRpdHkgY2xzLCB7VHlwZVZpc2l0b3JTdGF0ZSBzdGF0ZX0pIHsKICAgICAgQ2xhc3NVc2UgY2xhc3NVc2UgPSBjbGFzc1VzZU1hcC5wdXRJZkFic2VudChjbHMsICgpID0+IG5ldyBDbGFzc1VzZSgpKTsKICAgICAgc3dpdGNoIChzdGF0ZSkgewogICAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS5jb3ZhcmlhbnRUeXBlQXJndW1lbnQ6CiAgICAgICAgICBjbGFzc1VzZS50eXBlQXJndW1lbnQgPSB0cnVlOwogICAgICAgICAgdHlwZUFyZ3VtZW50cy5hZGQoY2xzKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS5jb250cmF2YXJpYW50VHlwZUFyZ3VtZW50OgogICAgICAgICAgY2xhc3NVc2UudHlwZUFyZ3VtZW50ID0gdHJ1ZTsKICAgICAgICAgIGNsYXNzVXNlLmNoZWNrZWRUeXBlQXJndW1lbnQgPSB0cnVlOwogICAgICAgICAgdHlwZUFyZ3VtZW50cy5hZGQoY2xzKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS50eXBlTGl0ZXJhbDoKICAgICAgICAgIGNsYXNzVXNlLnR5cGVMaXRlcmFsID0gdHJ1ZTsKICAgICAgICAgIHR5cGVMaXRlcmFscy5hZGQoY2xzKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS5kaXJlY3Q6CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSk7CgogICAgLy8gVGhlIFt0ZXN0ZWRUeXBlVmlzaXRvcl0gaXMgdXNlZCB0byByZWdpc3RlciBjbGFzcyB1c2UgaW4gdHlwZSB0ZXN0cyBsaWtlCiAgICAvLyBgbyBpcyBUYCBhbmQgYG8gYXMgVGAgKGJvdGggaW1wbGljaXQgYW5kIGV4cGxpY2l0KS4KICAgIC8vCiAgICAvLyBBIHR5cGUgZm91bmQgaW4gYSBjb3ZhcmlhbnQgcG9zaXRpb24gb2Ygc3VjaCB0eXBlcyBpcyBjb25zaWRlcmVkIHRlc3RlZAogICAgLy8gd2hlcmVhcyBhIHR5cGUgZm91bmQgaW4gYSBjb250cmF2YXJpYW50IHBvc2l0aW9uIG9mIHN1Y2ggdHlwZXMgaXMKICAgIC8vIGNvbnNpZGVyZWQgbGl2ZS4KICAgIC8vCiAgICAvLyBGb3IgaW5zdGFuY2UKICAgIC8vCiAgICAvLyAgICBvIGlzIEE8QiBGdW5jdGlvbihDKT47CiAgICAvLwogICAgLy8gbWFrZXMgQSBhbmQgQiB0ZXN0ZWQgYnV0IEMgbGl2ZS4KICAgIFR5cGVWaXNpdG9yIHRlc3RlZFR5cGVWaXNpdG9yID0KICAgICAgICBuZXcgVHlwZVZpc2l0b3Iob25DbGFzczogKENsYXNzRW50aXR5IGNscywge1R5cGVWaXNpdG9yU3RhdGUgc3RhdGV9KSB7CiAgICAgIENsYXNzVXNlIGNsYXNzVXNlID0gY2xhc3NVc2VNYXAucHV0SWZBYnNlbnQoY2xzLCAoKSA9PiBuZXcgQ2xhc3NVc2UoKSk7CiAgICAgIHN3aXRjaCAoc3RhdGUpIHsKICAgICAgICBjYXNlIFR5cGVWaXNpdG9yU3RhdGUuY292YXJpYW50VHlwZUFyZ3VtZW50OgogICAgICAgICAgY2xhc3NVc2UudHlwZUFyZ3VtZW50ID0gdHJ1ZTsKICAgICAgICAgIGNsYXNzVXNlLmNoZWNrZWRUeXBlQXJndW1lbnQgPSB0cnVlOwogICAgICAgICAgdHlwZUFyZ3VtZW50cy5hZGQoY2xzKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS5jb250cmF2YXJpYW50VHlwZUFyZ3VtZW50OgogICAgICAgICAgY2xhc3NVc2UudHlwZUFyZ3VtZW50ID0gdHJ1ZTsKICAgICAgICAgIHR5cGVBcmd1bWVudHMuYWRkKGNscyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFR5cGVWaXNpdG9yU3RhdGUudHlwZUxpdGVyYWw6CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFR5cGVWaXNpdG9yU3RhdGUuZGlyZWN0OgogICAgICAgICAgY2xhc3NVc2UuY2hlY2tlZEluc3RhbmNlID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9KTsKCiAgICBjb2RlZ2VuV29ybGQuaW5zdGFudGlhdGVkQ2xhc3Nlcy5mb3JFYWNoKChDbGFzc0VudGl0eSBjbHMpIHsKICAgICAgQ2xhc3NVc2UgY2xhc3NVc2UgPSBjbGFzc1VzZU1hcC5wdXRJZkFic2VudChjbHMsICgpID0+IG5ldyBDbGFzc1VzZSgpKTsKICAgICAgY2xhc3NVc2UuaW5zdGFuY2UgPSB0cnVlOwogICAgfSk7CgogICAgU2V0PENsYXNzRW50aXR5PiB2aXNpdGVkU3VwZXJDbGFzc2VzID0ge307CiAgICBjb2RlZ2VuV29ybGQuaW5zdGFudGlhdGVkVHlwZXMuZm9yRWFjaCgoSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICAgIGxpdmVUeXBlVmlzaXRvci52aXNpdFR5cGUodHlwZSwgVHlwZVZpc2l0b3JTdGF0ZS5kaXJlY3QpOwogICAgICBDbGFzc1VzZSBjbGFzc1VzZSA9CiAgICAgICAgICBjbGFzc1VzZU1hcC5wdXRJZkFic2VudCh0eXBlLmVsZW1lbnQsICgpID0+IG5ldyBDbGFzc1VzZSgpKTsKICAgICAgY2xhc3NVc2UuZGlyZWN0SW5zdGFuY2UgPSB0cnVlOwogICAgICBGdW5jdGlvblR5cGUgY2FsbFR5cGUgPSBfdHlwZXMuZ2V0Q2FsbFR5cGUodHlwZSk7CiAgICAgIGlmIChjYWxsVHlwZSAhPSBudWxsKSB7CiAgICAgICAgbGl2ZVR5cGVWaXNpdG9yLnZpc2l0VHlwZShjYWxsVHlwZSwgVHlwZVZpc2l0b3JTdGF0ZS5kaXJlY3QpOwogICAgICB9CgogICAgICAvLyBTdXBlcmNsYXNzIG1pZ2h0IG1ha2UgY2xhc3NlcyBsaXZlIGFzIHR5cGUgYXJndW1lbnRzLiBGb3IgaW5zdGFuY2UKICAgICAgLy8KICAgICAgLy8gICAgY2xhc3MgQSB7fQogICAgICAvLyAgICBjbGFzcyBCPFQ+IHt9CiAgICAgIC8vICAgIGNsYXNzIEMgaW1wbGVtZW50cyBCPEE+IHt9CiAgICAgIC8vICAgIG1haW4oKSA9PiBuZXcgQygpOwogICAgICAvLwogICAgICAvLyBIZXJlIGBBYCBpcyBsaXZlIGFzIGEgdHlwZSBhcmd1bWVudCB0aHJvdWdoIHRoZSBsaXZlbmVzcyBvZiBgQ2AuCiAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUKICAgICAgICAgIGluIF9jbG9zZWRXb3JsZC5kYXJ0VHlwZXMuZ2V0U3VwZXJ0eXBlcyh0eXBlLmVsZW1lbnQpKSB7CiAgICAgICAgaWYgKHN1cGVydHlwZS50eXBlQXJndW1lbnRzLmlzRW1wdHkgJiYKICAgICAgICAgICAgdmlzaXRlZFN1cGVyQ2xhc3Nlcy5jb250YWlucyhzdXBlcnR5cGUuZWxlbWVudCkpIHsKICAgICAgICAgIC8vIElmIFtzdXBlcmNsYXNzXSBpcyBub3QgZ2VuZXJpYyB0aGVuIGEgc2Vjb25kIHZpc2l0IGNhbm5vdCBhZGQgbW9yZQogICAgICAgICAgLy8gaW5mb3JtYXRpb24gdGhhdCB0aGUgZmlyc3QuIEluIHRoZSBleGFtcGxlIGFib3ZlLCB2aXNpdGluZyBgQ2AKICAgICAgICAgIC8vIHR3aWNlIGNhbiBvbmx5IHJlc3VsdCBpbiBhIHNlY29uZCByZWdpc3RyYXRpb24gb2YgYEFgIGFzIGxpdmUKICAgICAgICAgIC8vIHR5cGUgYXJndW1lbnQuCiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgdmlzaXRlZFN1cGVyQ2xhc3Nlcy5hZGQoc3VwZXJ0eXBlLmVsZW1lbnQpOwogICAgICAgIGxpdmVUeXBlVmlzaXRvci52aXNpdFR5cGUoc3VwZXJ0eXBlLCBUeXBlVmlzaXRvclN0YXRlLmRpcmVjdCk7CiAgICAgIH0KICAgIH0pOwoKICAgIGZvciAoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCBpbiBjb2RlZ2VuV29ybGQuY2xvc3VyaXplZFN0YXRpY3MpIHsKICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKGVsZW1lbnQpOwogICAgICBsaXZlVHlwZVZpc2l0b3IudmlzaXRUeXBlKGZ1bmN0aW9uVHlwZSwgVHlwZVZpc2l0b3JTdGF0ZS5kaXJlY3QpOwogICAgfQoKICAgIGZvciAoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCBpbiBjb2RlZ2VuV29ybGQuY2xvc3VyaXplZE1lbWJlcnMpIHsKICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKGVsZW1lbnQpOwogICAgICBsaXZlVHlwZVZpc2l0b3IudmlzaXRUeXBlKGZ1bmN0aW9uVHlwZSwgVHlwZVZpc2l0b3JTdGF0ZS5kaXJlY3QpOwogICAgfQoKICAgIHZvaWQgcHJvY2Vzc01ldGhvZFR5cGVBcmd1bWVudHMoXywgU2V0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICAgIGZvciAoRGFydFR5cGUgdHlwZUFyZ3VtZW50IGluIHR5cGVBcmd1bWVudHMpIHsKICAgICAgICBsaXZlVHlwZVZpc2l0b3IudmlzaXQoCiAgICAgICAgICAgIHR5cGVBcmd1bWVudCwgVHlwZVZpc2l0b3JTdGF0ZS5jb3ZhcmlhbnRUeXBlQXJndW1lbnQpOwogICAgICB9CiAgICB9CgogICAgY29kZWdlbldvcmxkLmZvckVhY2hTdGF0aWNUeXBlQXJndW1lbnQocHJvY2Vzc01ldGhvZFR5cGVBcmd1bWVudHMpOwogICAgY29kZWdlbldvcmxkLmZvckVhY2hEeW5hbWljVHlwZUFyZ3VtZW50KHByb2Nlc3NNZXRob2RUeXBlQXJndW1lbnRzKTsKICAgIGNvZGVnZW5Xb3JsZC5saXZlVHlwZUFyZ3VtZW50cy5mb3JFYWNoKChEYXJ0VHlwZSB0eXBlKSB7CiAgICAgIGxpdmVUeXBlVmlzaXRvci52aXNpdFR5cGUodHlwZSwgVHlwZVZpc2l0b3JTdGF0ZS5jb3ZhcmlhbnRUeXBlQXJndW1lbnQpOwogICAgfSk7CiAgICBjb2RlZ2VuV29ybGQuY29uc3RUeXBlTGl0ZXJhbHMuZm9yRWFjaCgoRGFydFR5cGUgdHlwZSkgewogICAgICBsaXZlVHlwZVZpc2l0b3IudmlzaXRUeXBlKHR5cGUsIFR5cGVWaXNpdG9yU3RhdGUudHlwZUxpdGVyYWwpOwogICAgfSk7CgogICAgYm9vbCBpc0Z1bmN0aW9uQ2hlY2tlZCA9IGZhbHNlOwoKICAgIHZvaWQgcHJvY2Vzc0NoZWNrZWRUeXBlKERhcnRUeXBlIHQpIHsKICAgICAgaWYgKHQgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgY2hlY2tlZEZ1bmN0aW9uVHlwZXMuYWRkKHQpOwogICAgICB9IGVsc2UgaWYgKHQgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgIGlzRnVuY3Rpb25DaGVja2VkID0KICAgICAgICAgICAgaXNGdW5jdGlvbkNoZWNrZWQgfHwgdC5lbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5mdW5jdGlvbkNsYXNzOwogICAgICB9CiAgICAgIHRlc3RlZFR5cGVWaXNpdG9yLnZpc2l0VHlwZSh0LCBUeXBlVmlzaXRvclN0YXRlLmRpcmVjdCk7CiAgICB9CgogICAgZXhwbGljaXRJc0NoZWNrcy5mb3JFYWNoKHByb2Nlc3NDaGVja2VkVHlwZSk7CiAgICBpbXBsaWNpdElzQ2hlY2tzLmZvckVhY2gocHJvY2Vzc0NoZWNrZWRUeXBlKTsKCiAgICAvLyBBIGNsb3N1cmUgY2xhc3MgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb24gdHlwZSBvZiBpdHMgYGNhbGxgCiAgICAvLyBtZXRob2QgYW5kIG5lZWRzIGEgc2lnbmF0dXJlIGZ1bmN0aW9uIGZvciB0ZXN0aW5nIGl0cyBmdW5jdGlvbiB0eXBlCiAgICAvLyBhZ2FpbnN0IHR5cGVkZWZzIGFuZCBmdW5jdGlvbiB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGlzLWNoZWNrcy4gU2luY2UKICAgIC8vIGNsb3N1cmVzIGhhdmUgYSBzaWduYXR1cmUgbWV0aG9kIGlmZiB0aGV5IG5lZWQgaXQgYW5kIHNob3VsZCBoYXZlIGEKICAgIC8vIGZ1bmN0aW9uIHR5cGUgaWZmIHRoZXkgaGF2ZSBhIHNpZ25hdHVyZSwgd2UgcHJvY2VzcyBhbGwgY2xhc3Nlcy4KICAgIHZvaWQgcHJvY2Vzc0NsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgICBDbGFzc0Z1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPQogICAgICAgICAgX2NvbXB1dGVGdW5jdGlvblR5cGUoX2VsZW1lbnRFbnZpcm9ubWVudCwgY2xzKTsKICAgICAgaWYgKGZ1bmN0aW9uVHlwZSAhPSBudWxsKSB7CiAgICAgICAgQ2xhc3NVc2UgY2xhc3NVc2UgPSBjbGFzc1VzZU1hcC5wdXRJZkFic2VudChjbHMsICgpID0+IG5ldyBDbGFzc1VzZSgpKTsKICAgICAgICBjbGFzc1VzZS5mdW5jdGlvblR5cGUgPSBmdW5jdGlvblR5cGU7CiAgICAgIH0KICAgIH0KCiAgICAvLyBDb2xsZWN0IGNsYXNzZXMgdGhhdCBhcmUgJ2xpdmUnIGVpdGhlciB0aHJvdWdoIGluc3RhbnRpYXRpb24gb3IgdXNlIGluCiAgICAvLyB0eXBlIGFyZ3VtZW50cy4KICAgIExpc3Q8Q2xhc3NFbnRpdHk+IGxpdmVDbGFzc2VzID0gPENsYXNzRW50aXR5PltdOwogICAgY2xhc3NVc2VNYXAuZm9yRWFjaCgoQ2xhc3NFbnRpdHkgY2xzLCBDbGFzc1VzZSBjbGFzc1VzZSkgewogICAgICBpZiAoY2xhc3NVc2UuaXNMaXZlKSB7CiAgICAgICAgbGl2ZUNsYXNzZXMuYWRkKGNscyk7CiAgICAgIH0KICAgIH0pOwogICAgbGl2ZUNsYXNzZXMuZm9yRWFjaChwcm9jZXNzQ2xhc3MpOwoKICAgIGNvZGVnZW5Xb3JsZC5mb3JFYWNoR2VuZXJpY01ldGhvZCgoRnVuY3Rpb25FbnRpdHkgbWV0aG9kKSB7CiAgICAgIGlmIChfY2xvc2VkV29ybGQuYW5ub3RhdGlvbnNEYXRhCiAgICAgICAgICAuZ2V0UGFyYW1ldGVyQ2hlY2tQb2xpY3kobWV0aG9kKQogICAgICAgICAgLmlzRW1pdHRlZCkgewogICAgICAgIGlmIChfcnRpTmVlZC5tZXRob2ROZWVkc1R5cGVBcmd1bWVudHMobWV0aG9kKSkgewogICAgICAgICAgZm9yIChUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZQogICAgICAgICAgICAgIGluIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKG1ldGhvZCkpIHsKICAgICAgICAgICAgRGFydFR5cGUgYm91bmQgPQogICAgICAgICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRUeXBlVmFyaWFibGVCb3VuZCh0eXBlVmFyaWFibGUuZWxlbWVudCk7CiAgICAgICAgICAgIHByb2Nlc3NDaGVja2VkVHlwZShib3VuZCk7CiAgICAgICAgICAgIGxpdmVUeXBlVmlzaXRvci52aXNpdCgKICAgICAgICAgICAgICAgIGJvdW5kLCBUeXBlVmlzaXRvclN0YXRlLmNvdmFyaWFudFR5cGVBcmd1bWVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICBjYWNoZWRSZXF1aXJlZENoZWNrcyA9IF9jb21wdXRlQ2hlY2tzKGNsYXNzVXNlTWFwKTsKICAgIHJ0aUNoZWNrc0J1aWxkZXJDbG9zZWQgPSB0cnVlOwogICAgcmV0dXJuIG5ldyBfUnVudGltZVR5cGVzQ2hlY2tzKAogICAgICAgIHRoaXMsIGNhY2hlZFJlcXVpcmVkQ2hlY2tzLCB0eXBlQXJndW1lbnRzLCB0eXBlTGl0ZXJhbHMpOwogIH0KfQoKLy8vIENvbXB1dGVzIHRoZSBmdW5jdGlvbiB0eXBlIG9mIFtjbHNdLCBpZiBhbnkuCi8vLwovLy8gSW4gRGFydCAxLCBhbnkgY2xhc3Mgd2l0aCBhIGBjYWxsYCBtZXRob2QgaGFzIGEgZnVuY3Rpb24gdHlwZSwgaW4gRGFydCAyCi8vLyBvbmx5IGNsb3N1cmUgY2xhc3NlcyBoYXZlIGEgZnVuY3Rpb24gdHlwZS4KQ2xhc3NGdW5jdGlvblR5cGUgX2NvbXB1dGVGdW5jdGlvblR5cGUoCiAgICBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50LCBDbGFzc0VudGl0eSBjbHMpIHsKICBGdW5jdGlvbkVudGl0eSBzaWduYXR1cmVGdW5jdGlvbjsKICBpZiAoY2xzLmlzQ2xvc3VyZSkgewogICAgLy8gVXNlIHNpZ25hdHVyZSBmdW5jdGlvbiBpZiBhdmFpbGFibGUuCiAgICBzaWduYXR1cmVGdW5jdGlvbiA9CiAgICAgICAgZWxlbWVudEVudmlyb25tZW50Lmxvb2t1cExvY2FsQ2xhc3NNZW1iZXIoY2xzLCBJZGVudGlmaWVycy5zaWduYXR1cmUpOwogICAgaWYgKHNpZ25hdHVyZUZ1bmN0aW9uID09IG51bGwpIHsKICAgICAgLy8gSW4gRGFydCAyLCBhIGNsb3N1cmUgb25seSBuZWVkcyBpdHMgZnVuY3Rpb24gdHlwZSBpZiBpdCBoYXMgYQogICAgICAvLyBzaWduYXR1cmUgZnVuY3Rpb24uCiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0gZWxzZSB7CiAgICAvLyBPbmx5IGNsb3N1cmVzIGhhdmUgZnVuY3Rpb24gdHlwZSBpbiBEYXJ0IDIuCiAgICByZXR1cm4gbnVsbDsKICB9CiAgTWVtYmVyRW50aXR5IGNhbGwgPQogICAgICBlbGVtZW50RW52aXJvbm1lbnQubG9va3VwTG9jYWxDbGFzc01lbWJlcihjbHMsIElkZW50aWZpZXJzLmNhbGwpOwogIGlmIChjYWxsICE9IG51bGwgJiYgY2FsbC5pc0Z1bmN0aW9uKSB7CiAgICBGdW5jdGlvbkVudGl0eSBjYWxsRnVuY3Rpb24gPSBjYWxsOwogICAgRnVuY3Rpb25UeXBlIGNhbGxUeXBlID0gZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShjYWxsRnVuY3Rpb24pOwogICAgcmV0dXJuIG5ldyBDbGFzc0Z1bmN0aW9uVHlwZShjYWxsRnVuY3Rpb24sIGNhbGxUeXBlLCBzaWduYXR1cmVGdW5jdGlvbik7CiAgfQogIHJldHVybiBudWxsOwp9CgpjbGFzcyBSdW50aW1lVHlwZXNFbmNvZGVySW1wbCBpbXBsZW1lbnRzIFJ1bnRpbWVUeXBlc0VuY29kZXIgewogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzOwogIGZpbmFsIFR5cGVSZXByZXNlbnRhdGlvbkdlbmVyYXRvciBfcmVwcmVzZW50YXRpb25HZW5lcmF0b3I7CiAgZmluYWwgUnVudGltZVR5cGVzTmVlZCBfcnRpTmVlZDsKICBAb3ZlcnJpZGUKICBmaW5hbCBSdW50aW1lVHlwZVRhZ3MgcnRpVGFnczsKCiAgUnVudGltZVR5cGVzRW5jb2RlckltcGwodGhpcy5ydGlUYWdzLCBOYXRpdmVCYXNpY0RhdGEgbmF0aXZlRGF0YSwKICAgICAgdGhpcy5fZWxlbWVudEVudmlyb25tZW50LCB0aGlzLmNvbW1vbkVsZW1lbnRzLCB0aGlzLl9ydGlOZWVkKQogICAgICA6IF9yZXByZXNlbnRhdGlvbkdlbmVyYXRvciA9CiAgICAgICAgICAgIG5ldyBUeXBlUmVwcmVzZW50YXRpb25HZW5lcmF0b3IocnRpVGFncywgbmF0aXZlRGF0YSk7CgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0IHRlbXBsYXRlIHRvIGRldGVybWluZSBhdCBydW50aW1lIGlmIGEgdHlwZSBvYmplY3QKICAvLy8gaXMgYSBmdW5jdGlvbiB0eXBlLgogIEBvdmVycmlkZQogIGpzQXN0LlRlbXBsYXRlIGdldCB0ZW1wbGF0ZUZvcklzRnVuY3Rpb25UeXBlIHsKICAgIHJldHVybiBfcmVwcmVzZW50YXRpb25HZW5lcmF0b3IudGVtcGxhdGVGb3JJc0Z1bmN0aW9uVHlwZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0IHRlbXBsYXRlIHRvIGRldGVybWluZSBhdCBydW50aW1lIGlmIGEgdHlwZSBvYmplY3QKICAvLy8gaXMgYSBGdXR1cmVPciB0eXBlLgogIEBvdmVycmlkZQogIGpzQXN0LlRlbXBsYXRlIGdldCB0ZW1wbGF0ZUZvcklzRnV0dXJlT3JUeXBlIHsKICAgIHJldHVybiBfcmVwcmVzZW50YXRpb25HZW5lcmF0b3IudGVtcGxhdGVGb3JJc0Z1dHVyZU9yVHlwZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0IHRlbXBsYXRlIHRvIGRldGVybWluZSBhdCBydW50aW1lIGlmIGEgdHlwZSBvYmplY3QKICAvLy8gaXMgdGhlIHZvaWQgdHlwZS4KICBAb3ZlcnJpZGUKICBqc0FzdC5UZW1wbGF0ZSBnZXQgdGVtcGxhdGVGb3JJc1ZvaWRUeXBlIHsKICAgIHJldHVybiBfcmVwcmVzZW50YXRpb25HZW5lcmF0b3IudGVtcGxhdGVGb3JJc1ZvaWRUeXBlOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIEphdmFTY3JpcHQgdGVtcGxhdGUgdG8gZGV0ZXJtaW5lIGF0IHJ1bnRpbWUgaWYgYSB0eXBlIG9iamVjdAogIC8vLyBpcyB0aGUgZHluYW1pYyB0eXBlLgogIEBvdmVycmlkZQogIGpzQXN0LlRlbXBsYXRlIGdldCB0ZW1wbGF0ZUZvcklzRHluYW1pY1R5cGUgewogICAgcmV0dXJuIF9yZXByZXNlbnRhdGlvbkdlbmVyYXRvci50ZW1wbGF0ZUZvcklzRHluYW1pY1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5UZW1wbGF0ZSBnZXQgdGVtcGxhdGVGb3JJc0pzSW50ZXJvcFR5cGVBcmd1bWVudCB7CiAgICByZXR1cm4gX3JlcHJlc2VudGF0aW9uR2VuZXJhdG9yLnRlbXBsYXRlRm9ySXNKc0ludGVyb3BUeXBlQXJndW1lbnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIGdldFR5cGVSZXByZXNlbnRhdGlvbigKICAgICAgTW9kdWxhckVtaXR0ZXIgZW1pdHRlciwgRGFydFR5cGUgdHlwZSwgT25WYXJpYWJsZUNhbGxiYWNrIG9uVmFyaWFibGUsCiAgICAgIFtTaG91bGRFbmNvZGVUeXBlZGVmQ2FsbGJhY2sgc2hvdWxkRW5jb2RlVHlwZWRlZl0pIHsKICAgIHJldHVybiBfcmVwcmVzZW50YXRpb25HZW5lcmF0b3IuZ2V0VHlwZVJlcHJlc2VudGF0aW9uKAogICAgICAgIGVtaXR0ZXIsIHR5cGUsIG9uVmFyaWFibGUsIHNob3VsZEVuY29kZVR5cGVkZWYpOwogIH0KCiAgU3RyaW5nIGdldFR5cGVWYXJpYWJsZU5hbWUoVHlwZVZhcmlhYmxlVHlwZSB0eXBlKSB7CiAgICBTdHJpbmcgbmFtZSA9IHR5cGUuZWxlbWVudC5uYW1lOwogICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnIycsICdfJyk7CiAgfQoKICBqc0FzdC5FeHByZXNzaW9uIGdldFR5cGVFbmNvZGluZyhNb2R1bGFyRW1pdHRlciBlbWl0dGVyLCBEYXJ0VHlwZSB0eXBlLAogICAgICB7Ym9vbCBhbHdheXNHZW5lcmF0ZUZ1bmN0aW9uOiBmYWxzZX0pIHsKICAgIENsYXNzRW50aXR5IGNvbnRleHRDbGFzcyA9IERhcnRUeXBlcy5nZXRDbGFzc0NvbnRleHQodHlwZSk7CiAgICBqc0FzdC5FeHByZXNzaW9uIG9uVmFyaWFibGUoVHlwZVZhcmlhYmxlVHlwZSB2KSB7CiAgICAgIHJldHVybiBuZXcganNBc3QuVmFyaWFibGVVc2UoZ2V0VHlwZVZhcmlhYmxlTmFtZSh2KSk7CiAgICB9CgogICAganNBc3QuRXhwcmVzc2lvbiBlbmNvZGluZyA9CiAgICAgICAgZ2V0VHlwZVJlcHJlc2VudGF0aW9uKGVtaXR0ZXIsIHR5cGUsIG9uVmFyaWFibGUpOwogICAgaWYgKGNvbnRleHRDbGFzcyA9PSBudWxsICYmICFhbHdheXNHZW5lcmF0ZUZ1bmN0aW9uKSB7CiAgICAgIHJldHVybiBlbmNvZGluZzsKICAgIH0gZWxzZSB7CiAgICAgIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJzID0gY29uc3QgPFN0cmluZz5bXTsKICAgICAgaWYgKGNvbnRleHRDbGFzcyAhPSBudWxsKSB7CiAgICAgICAgcGFyYW1ldGVycyA9IF9lbGVtZW50RW52aXJvbm1lbnQKICAgICAgICAgICAgLmdldFRoaXNUeXBlKGNvbnRleHRDbGFzcykKICAgICAgICAgICAgLnR5cGVBcmd1bWVudHMKICAgICAgICAgICAgLm1hcCgoRGFydFR5cGUgX3R5cGUpIHsKICAgICAgICAgIFR5cGVWYXJpYWJsZVR5cGUgdHlwZSA9IF90eXBlOwogICAgICAgICAgcmV0dXJuIGdldFR5cGVWYXJpYWJsZU5hbWUodHlwZSk7CiAgICAgICAgfSkudG9MaXN0KCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGpzKCdmdW5jdGlvbigjKSB7IHJldHVybiAjIH0nLCBbcGFyYW1ldGVycywgZW5jb2RpbmddKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gZ2V0U2lnbmF0dXJlRW5jb2RpbmcoTW9kdWxhck5hbWVyIG5hbWVyLAogICAgICBNb2R1bGFyRW1pdHRlciBlbWl0dGVyLCBEYXJ0VHlwZSB0eXBlLCBqc0FzdC5FeHByZXNzaW9uIHRoaXNfKSB7CiAgICBDbGFzc0VudGl0eSBjb250ZXh0Q2xhc3MgPSBEYXJ0VHlwZXMuZ2V0Q2xhc3NDb250ZXh0KHR5cGUpOwogICAganNBc3QuRXhwcmVzc2lvbiBlbmNvZGluZyA9CiAgICAgICAgZ2V0VHlwZUVuY29kaW5nKGVtaXR0ZXIsIHR5cGUsIGFsd2F5c0dlbmVyYXRlRnVuY3Rpb246IHRydWUpOwogICAgaWYgKGNvbnRleHRDbGFzcyAhPSBudWxsICYmCiAgICAgICAgLy8gV2Ugb25seSBnZW5lcmF0ZSBmb2xkaW5nIHVzaW5nICdjb21wdXRlU2lnbmF0dXJlJyBpZiBbY29udGV4dENsYXNzXQogICAgICAgIC8vIGhhcyByZWlmaWVkIHR5cGUgYXJndW1lbnRzLiBUaGUgJ2NvbXB1dGVTaWduYXR1cmUnIGZ1bmN0aW9uIG1pZ2h0IG5vdAogICAgICAgIC8vIGJlIGVtaXR0ZWQgKGlmIGl0J3Mgbm90IG5lZWRlZCBlbHNld2hlcmUpIGFuZCB0aGUgZ2VuZXJhdGVkIHNpZ25hdHVyZQogICAgICAgIC8vIHdpbGwgaGF2ZSBgdW5kZWZpbmVkYCBhcyBpdHMgdHlwZSB2YXJpYWJsZXMgaW4gYW55IGNhc2UuCiAgICAgICAgLy8KICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBzcGVjaWZpY2FsbHkgZm9yIC0tbGF4LXJ1bnRpbWUtdHlwZS10by1zdHJpbmcgd2hpY2gKICAgICAgICAvLyBtYXkgcmVxdWlyZSBhIHNpZ25hdHVyZSBvbiBhIG1ldGhvZCB0aGF0IHVzZXMgY2xhc3MgdHlwZSB2YXJpYWJsZXMKICAgICAgICAvLyB3aGlsZSBhdCB0aGUgc2FtZSB0aW1lIG5vdCBuZWVkaW5nIHR5cGUgYXJndW1lbnRzIG9uIHRoZSBjbGFzcy4KICAgICAgICBfcnRpTmVlZC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cyhjb250ZXh0Q2xhc3MpKSB7CiAgICAgIGpzQXN0Lk5hbWUgY29udGV4dE5hbWUgPSBuYW1lci5jbGFzc05hbWUoY29udGV4dENsYXNzKTsKICAgICAgcmV0dXJuIGpzKCdmdW5jdGlvbiAoKSB7IHJldHVybiAjKCMsICMsICMpOyB9JywgWwogICAgICAgIGVtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoY29tbW9uRWxlbWVudHMuY29tcHV0ZVNpZ25hdHVyZSksCiAgICAgICAgZW5jb2RpbmcsCiAgICAgICAgdGhpc18sCiAgICAgICAganMucXVvdGVOYW1lKGNvbnRleHROYW1lKQogICAgICBdKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBlbmNvZGluZzsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gZ2V0SnNJbnRlcm9wVHlwZUFyZ3VtZW50cyhpbnQgY291bnQpIHsKICAgIHJldHVybiBfcmVwcmVzZW50YXRpb25HZW5lcmF0b3IuZ2V0SnNJbnRlcm9wVHlwZUFyZ3VtZW50cyhjb3VudCk7CiAgfQp9CgovLy8gRml4ZWQgc3RyaW5ncyB1c2VkIGZvciBydW50aW1lIHR5cGVzIGVuY29kaW5nLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgZGlmZmVyZW50IG5hbWVzIGZvciBtaW5pZmllZCBjb2RlPwpjbGFzcyBSdW50aW1lVHlwZVRhZ3MgewogIGNvbnN0IFJ1bnRpbWVUeXBlVGFncygpOwoKICBTdHJpbmcgZ2V0IHR5cGVkZWZUYWcgPT4gcid0eXBlZGVmJzsKCiAgU3RyaW5nIGdldCBmdW5jdGlvblR5cGVUYWcgPT4gcidmdW5jJzsKCiAgU3RyaW5nIGdldCBmdW5jdGlvblR5cGVWb2lkUmV0dXJuVGFnID0+IHIndic7CgogIFN0cmluZyBnZXQgZnVuY3Rpb25UeXBlUmV0dXJuVHlwZVRhZyA9PiByJ3JldCc7CgogIFN0cmluZyBnZXQgZnVuY3Rpb25UeXBlUmVxdWlyZWRQYXJhbWV0ZXJzVGFnID0+IHInYXJncyc7CgogIFN0cmluZyBnZXQgZnVuY3Rpb25UeXBlT3B0aW9uYWxQYXJhbWV0ZXJzVGFnID0+IHInb3B0JzsKCiAgU3RyaW5nIGdldCBmdW5jdGlvblR5cGVOYW1lZFBhcmFtZXRlcnNUYWcgPT4gciduYW1lZCc7CgogIFN0cmluZyBnZXQgZnVuY3Rpb25UeXBlR2VuZXJpY0JvdW5kc1RhZyA9PiByJ2JvdW5kcyc7CgogIFN0cmluZyBnZXQgZnV0dXJlT3JUYWcgPT4gcidmdXR1cmVPcic7CgogIFN0cmluZyBnZXQgZnV0dXJlT3JUeXBlVGFnID0+IHIndHlwZSc7Cn0KCmNsYXNzIFR5cGVSZXByZXNlbnRhdGlvbkdlbmVyYXRvcgogICAgaW1wbGVtZW50cyBEYXJ0VHlwZVZpc2l0b3I8anNBc3QuRXhwcmVzc2lvbiwgTW9kdWxhckVtaXR0ZXI+IHsKICBmaW5hbCBSdW50aW1lVHlwZVRhZ3MgX3J0aVRhZ3M7CiAgZmluYWwgTmF0aXZlQmFzaWNEYXRhIF9uYXRpdmVEYXRhOwoKICBPblZhcmlhYmxlQ2FsbGJhY2sgb25WYXJpYWJsZTsKICBTaG91bGRFbmNvZGVUeXBlZGVmQ2FsbGJhY2sgc2hvdWxkRW5jb2RlVHlwZWRlZjsKICBNYXA8VHlwZVZhcmlhYmxlVHlwZSwganNBc3QuRXhwcmVzc2lvbj4gdHlwZWRlZkJpbmRpbmdzOwogIExpc3Q8RnVuY3Rpb25UeXBlVmFyaWFibGU+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcyA9IDxGdW5jdGlvblR5cGVWYXJpYWJsZT5bXTsKCiAgVHlwZVJlcHJlc2VudGF0aW9uR2VuZXJhdG9yKHRoaXMuX3J0aVRhZ3MsIHRoaXMuX25hdGl2ZURhdGEpOwoKICAvLy8gQ3JlYXRlcyBhIHR5cGUgcmVwcmVzZW50YXRpb24gZm9yIFt0eXBlXS4gW29uVmFyaWFibGVdIGlzIGNhbGxlZCB0bwogIC8vLyBwcm92aWRlIHRoZSB0eXBlIHJlcHJlc2VudGF0aW9uIGZvciB0eXBlIHZhcmlhYmxlcy4KICBqc0FzdC5FeHByZXNzaW9uIGdldFR5cGVSZXByZXNlbnRhdGlvbigKICAgICAgTW9kdWxhckVtaXR0ZXIgZW1pdHRlciwKICAgICAgRGFydFR5cGUgdHlwZSwKICAgICAgT25WYXJpYWJsZUNhbGxiYWNrIG9uVmFyaWFibGUsCiAgICAgIFNob3VsZEVuY29kZVR5cGVkZWZDYWxsYmFjayBlbmNvZGVUeXBlZGVmKSB7CiAgICBhc3NlcnQodHlwZWRlZkJpbmRpbmdzID09IG51bGwpOwogICAgdGhpcy5vblZhcmlhYmxlID0gb25WYXJpYWJsZTsKICAgIHRoaXMuc2hvdWxkRW5jb2RlVHlwZWRlZiA9CiAgICAgICAgKGVuY29kZVR5cGVkZWYgIT0gbnVsbCkgPyBlbmNvZGVUeXBlZGVmIDogKFR5cGVkZWZUeXBlIHR5cGUpID0+IGZhbHNlOwogICAganNBc3QuRXhwcmVzc2lvbiByZXByZXNlbnRhdGlvbiA9IHZpc2l0KHR5cGUsIGVtaXR0ZXIpOwogICAgdGhpcy5vblZhcmlhYmxlID0gbnVsbDsKICAgIHRoaXMuc2hvdWxkRW5jb2RlVHlwZWRlZiA9IG51bGw7CiAgICBhc3NlcnQoZnVuY3Rpb25UeXBlVmFyaWFibGVzLmlzRW1wdHkpOwogICAgcmV0dXJuIHJlcHJlc2VudGF0aW9uOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiBnZXRKYXZhU2NyaXB0Q2xhc3NOYW1lKAogICAgICBFbnRpdHkgZWxlbWVudCwgTW9kdWxhckVtaXR0ZXIgZW1pdHRlcikgewogICAgcmV0dXJuIGVtaXR0ZXIudHlwZUFjY2VzcyhlbGVtZW50KTsKICB9CgogIGpzQXN0LkV4cHJlc3Npb24gZ2V0RHluYW1pY1ZhbHVlKCkgPT4ganMoJ251bGwnKTsKCiAganNBc3QuRXhwcmVzc2lvbiBnZXRWb2lkVmFsdWUoKSA9PiBqcygnLTEnKTsKCiAganNBc3QuRXhwcmVzc2lvbiBnZXRKc0ludGVyb3BUeXBlQXJndW1lbnRWYWx1ZSgpID0+IGpzKCctMicpOwogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXQoRGFydFR5cGUgdHlwZSwgTW9kdWxhckVtaXR0ZXIgZW1pdHRlcikgPT4KICAgICAgdHlwZS5hY2NlcHQodGhpcywgZW1pdHRlcik7CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRUeXBlVmFyaWFibGVUeXBlKAogICAgICBUeXBlVmFyaWFibGVUeXBlIHR5cGUsIE1vZHVsYXJFbWl0dGVyIGVtaXR0ZXIpIHsKICAgIGlmICh0eXBlZGVmQmluZGluZ3MgIT0gbnVsbCkgewogICAgICBhc3NlcnQodHlwZWRlZkJpbmRpbmdzW3R5cGVdICE9IG51bGwpOwogICAgICByZXR1cm4gdHlwZWRlZkJpbmRpbmdzW3R5cGVdOwogICAgfQogICAgcmV0dXJuIG9uVmFyaWFibGUodHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0RnVuY3Rpb25UeXBlVmFyaWFibGUoCiAgICAgIEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHR5cGUsIE1vZHVsYXJFbWl0dGVyIGVtaXR0ZXIpIHsKICAgIGludCBwb3NpdGlvbiA9IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcy5pbmRleE9mKHR5cGUpOwogICAgYXNzZXJ0KHBvc2l0aW9uID49IDApOwogICAgcmV0dXJuIGpzLm51bWJlcihmdW5jdGlvblR5cGVWYXJpYWJsZXMubGVuZ3RoIC0gcG9zaXRpb24gLSAxKTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSB0eXBlLCBNb2R1bGFyRW1pdHRlciBlbWl0dGVyKSB7CiAgICByZXR1cm4gZ2V0RHluYW1pY1ZhbHVlKCk7CiAgfQoKICBqc0FzdC5FeHByZXNzaW9uIGdldEpzSW50ZXJvcFR5cGVBcmd1bWVudHMoaW50IGNvdW50LAogICAgICB7anNBc3QuRXhwcmVzc2lvbiBuYW1lfSkgewogICAgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBlbGVtZW50cyA9IDxqc0FzdC5FeHByZXNzaW9uPltdOwogICAgaWYgKG5hbWUgIT0gbnVsbCkgewogICAgICBlbGVtZW50cy5hZGQobmFtZSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgZWxlbWVudHMuYWRkKGdldEpzSW50ZXJvcFR5cGVBcmd1bWVudFZhbHVlKCkpOwogICAgfQogICAgcmV0dXJuIG5ldyBqc0FzdC5BcnJheUluaXRpYWxpemVyKGVsZW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRJbnRlcmZhY2VUeXBlKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUsIE1vZHVsYXJFbWl0dGVyIGVtaXR0ZXIpIHsKICAgIGpzQXN0LkV4cHJlc3Npb24gbmFtZSA9IGdldEphdmFTY3JpcHRDbGFzc05hbWUodHlwZS5lbGVtZW50LCBlbWl0dGVyKTsKICAgIGpzQXN0LkV4cHJlc3Npb24gcmVzdWx0OwogICAgaWYgKHR5cGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgIHJlc3VsdCA9IG5hbWU7CiAgICB9IGVsc2UgewogICAgICAvLyBWaXNpdCBhbGwgdHlwZSBhcmd1bWVudHMuIFRoaXMgaXMgZG9uZSBldmVuIGZvciBqc2ludGVyb3AgY2xhc3NlcyB0bwogICAgICAvLyBlbmZvcmNlIHRoZSBpbnZhcmlhbnQgdGhhdCBbb25WYXJpYWJsZV0gaXMgY2FsbGVkIGZvciBlYWNoIHR5cGUKICAgICAgLy8gdmFyaWFibGUgaW4gdGhlIHR5cGUuCiAgICAgIHJlc3VsdCA9IHZpc2l0TGlzdCh0eXBlLnR5cGVBcmd1bWVudHMsIGVtaXR0ZXIsIGhlYWQ6IG5hbWUpOwogICAgICBpZiAoX25hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyh0eXBlLmVsZW1lbnQpKSB7CiAgICAgICAgLy8gUmVwbGFjZSB0eXBlIGFyZ3VtZW50cyBvZiBnZW5lcmljIGpzaW50ZXJvcCBjbGFzc2VzIHdpdGggJ2FueScgdHlwZS4KICAgICAgICByZXN1bHQgPQogICAgICAgICAgICBnZXRKc0ludGVyb3BUeXBlQXJndW1lbnRzKHR5cGUudHlwZUFyZ3VtZW50cy5sZW5ndGgsIG5hbWU6IG5hbWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdExpc3QoTGlzdDxEYXJ0VHlwZT4gdHlwZXMsIE1vZHVsYXJFbWl0dGVyIGVtaXR0ZXIsCiAgICAgIHtqc0FzdC5FeHByZXNzaW9uIGhlYWR9KSB7CiAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGVsZW1lbnRzID0gPGpzQXN0LkV4cHJlc3Npb24+W107CiAgICBpZiAoaGVhZCAhPSBudWxsKSB7CiAgICAgIGVsZW1lbnRzLmFkZChoZWFkKTsKICAgIH0KICAgIGZvciAoRGFydFR5cGUgdHlwZSBpbiB0eXBlcykgewogICAgICBqc0FzdC5FeHByZXNzaW9uIGVsZW1lbnQgPSB2aXNpdCh0eXBlLCBlbWl0dGVyKTsKICAgICAgaWYgKGVsZW1lbnQgaXMganNBc3QuTGl0ZXJhbE51bGwpIHsKICAgICAgICBlbGVtZW50cy5hZGQobmV3IGpzQXN0LkFycmF5SG9sZSgpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbGVtZW50cy5hZGQoZWxlbWVudCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcganNBc3QuQXJyYXlJbml0aWFsaXplcihlbGVtZW50cyk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSB0byBkZXRlcm1pbmUgYXQgcnVudGltZSBpZiBhIHR5cGUgb2JqZWN0CiAgLy8vIGlzIGEgZnVuY3Rpb24gdHlwZS4KICBqc0FzdC5UZW1wbGF0ZSBnZXQgdGVtcGxhdGVGb3JJc0Z1bmN0aW9uVHlwZSB7CiAgICByZXR1cm4ganNBc3QuanMuZXhwcmVzc2lvblRlbXBsYXRlRm9yKCInJHtfcnRpVGFncy5mdW5jdGlvblR5cGVUYWd9JyBpbiAjIik7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSB0byBkZXRlcm1pbmUgYXQgcnVudGltZSBpZiBhIHR5cGUgb2JqZWN0CiAgLy8vIGlzIGEgRnV0dXJlT3IgdHlwZS4KICBqc0FzdC5UZW1wbGF0ZSBnZXQgdGVtcGxhdGVGb3JJc0Z1dHVyZU9yVHlwZSB7CiAgICByZXR1cm4ganNBc3QuanMuZXhwcmVzc2lvblRlbXBsYXRlRm9yKCInJHtfcnRpVGFncy5mdXR1cmVPclRhZ30nIGluICMiKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0IHRlbXBsYXRlIHRvIGRldGVybWluZSBhdCBydW50aW1lIGlmIGEgdHlwZSBvYmplY3QKICAvLy8gaXMgdGhlIHZvaWQgdHlwZS4KICBqc0FzdC5UZW1wbGF0ZSBnZXQgdGVtcGxhdGVGb3JJc1ZvaWRUeXBlIHsKICAgIHJldHVybiBqc0FzdC5qcy5leHByZXNzaW9uVGVtcGxhdGVGb3IoIiMgPT09IC0xIik7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSB0byBkZXRlcm1pbmUgYXQgcnVudGltZSBpZiBhIHR5cGUgb2JqZWN0CiAgLy8vIGlzIHRoZSBkeW5hbWljIHR5cGUuCiAganNBc3QuVGVtcGxhdGUgZ2V0IHRlbXBsYXRlRm9ySXNEeW5hbWljVHlwZSB7CiAgICByZXR1cm4ganNBc3QuanMuZXhwcmVzc2lvblRlbXBsYXRlRm9yKCIjID09IG51bGwiKTsKICB9CgogIGpzQXN0LlRlbXBsYXRlIGdldCB0ZW1wbGF0ZUZvcklzSnNJbnRlcm9wVHlwZUFyZ3VtZW50IHsKICAgIHJldHVybiBqc0FzdC5qcy5leHByZXNzaW9uVGVtcGxhdGVGb3IoIiMgPT09IC0yIik7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0RnVuY3Rpb25UeXBlKAogICAgICBGdW5jdGlvblR5cGUgdHlwZSwgTW9kdWxhckVtaXR0ZXIgZW1pdHRlcikgewogICAgTGlzdDxqc0FzdC5Qcm9wZXJ0eT4gcHJvcGVydGllcyA9IDxqc0FzdC5Qcm9wZXJ0eT5bXTsKCiAgICB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBuYW1lLCBqc0FzdC5FeHByZXNzaW9uIHZhbHVlKSB7CiAgICAgIHByb3BlcnRpZXMuYWRkKG5ldyBqc0FzdC5Qcm9wZXJ0eShqcy5zdHJpbmcobmFtZSksIHZhbHVlKSk7CiAgICB9CgogICAgLy8gVHlwZSByZXByZXNlbnRhdGlvbnMgZm9yIGZ1bmN0aW9ucyBoYXZlIGEgcHJvcGVydHkgd2hpY2ggaXMgYSB0YWcgbWFya2luZwogICAgLy8gdGhlbSBhcyBmdW5jdGlvbiB0eXBlcy4gVGhlIHZhbHVlIGlzIG5vdCB1c2VkLCBzbyAnMScgaXMganVzdCBhIGR1bW15LgogICAgYWRkUHJvcGVydHkoX3J0aVRhZ3MuZnVuY3Rpb25UeXBlVGFnLCBqcy5udW1iZXIoMSkpOwoKICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMuaXNOb3RFbXB0eSkgewogICAgICAvLyBHZW5lcmljIGZ1bmN0aW9uIHR5cGVzIGhhdmUgdHlwZSBwYXJhbWV0ZXJzIHdoaWNoIGFyZSByZWR1Y2VkIHRvIGRlCiAgICAgIC8vIEJydWlqbiBpbmRleGVzLgogICAgICBmb3IgKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHZhcmlhYmxlIGluIHR5cGUudHlwZVZhcmlhYmxlcy5yZXZlcnNlZCkgewogICAgICAgIGZ1bmN0aW9uVHlwZVZhcmlhYmxlcy5hZGQodmFyaWFibGUpOwogICAgICB9CiAgICAgIC8vIFRPRE8oc3JhKTogVGhpcyBlbWl0cyBgUC5PYmplY3RgIGZvciB0aGUgY29tbW9uIHVuYm91bmRlZCBjYXNlLiBXZQogICAgICAvLyBjb3VsZCByZXBsYWNlIHRoZSBPYmplY3QgYm91bmRzIHdpdGggYW4gYXJyYXkgaG9sZSBmb3IgYSBjb21wYWN0IGBbLCxdYAogICAgICAvLyByZXByZXNlbnRhdGlvbi4KICAgICAgYWRkUHJvcGVydHkoX3J0aVRhZ3MuZnVuY3Rpb25UeXBlR2VuZXJpY0JvdW5kc1RhZywKICAgICAgICAgIHZpc2l0TGlzdCh0eXBlLnR5cGVWYXJpYWJsZXMubWFwKCh2KSA9PiB2LmJvdW5kKS50b0xpc3QoKSwgZW1pdHRlcikpOwogICAgfQoKICAgIGlmICghdHlwZS5yZXR1cm5UeXBlLnRyZWF0QXNEeW5hbWljKSB7CiAgICAgIGFkZFByb3BlcnR5KAogICAgICAgICAgX3J0aVRhZ3MuZnVuY3Rpb25UeXBlUmV0dXJuVHlwZVRhZywgdmlzaXQodHlwZS5yZXR1cm5UeXBlLCBlbWl0dGVyKSk7CiAgICB9CiAgICBpZiAoIXR5cGUucGFyYW1ldGVyVHlwZXMuaXNFbXB0eSkgewogICAgICBhZGRQcm9wZXJ0eShfcnRpVGFncy5mdW5jdGlvblR5cGVSZXF1aXJlZFBhcmFtZXRlcnNUYWcsCiAgICAgICAgICB2aXNpdExpc3QodHlwZS5wYXJhbWV0ZXJUeXBlcywgZW1pdHRlcikpOwogICAgfQogICAgaWYgKCF0eXBlLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMuaXNFbXB0eSkgewogICAgICBhZGRQcm9wZXJ0eShfcnRpVGFncy5mdW5jdGlvblR5cGVPcHRpb25hbFBhcmFtZXRlcnNUYWcsCiAgICAgICAgICB2aXNpdExpc3QodHlwZS5vcHRpb25hbFBhcmFtZXRlclR5cGVzLCBlbWl0dGVyKSk7CiAgICB9CiAgICBpZiAoIXR5cGUubmFtZWRQYXJhbWV0ZXJUeXBlcy5pc0VtcHR5KSB7CiAgICAgIExpc3Q8anNBc3QuUHJvcGVydHk+IG5hbWVkQXJndW1lbnRzID0gPGpzQXN0LlByb3BlcnR5PltdOwogICAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSB0eXBlLm5hbWVkUGFyYW1ldGVyczsKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZXMgPSB0eXBlLm5hbWVkUGFyYW1ldGVyVHlwZXM7CiAgICAgIGFzc2VydCh0eXBlcy5sZW5ndGggPT0gbmFtZXMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHR5cGVzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgIGpzQXN0LkV4cHJlc3Npb24gbmFtZSA9IGpzLnN0cmluZyhuYW1lc1tpbmRleF0pOwogICAgICAgIG5hbWVkQXJndW1lbnRzCiAgICAgICAgICAgIC5hZGQobmV3IGpzQXN0LlByb3BlcnR5KG5hbWUsIHZpc2l0KHR5cGVzW2luZGV4XSwgZW1pdHRlcikpKTsKICAgICAgfQogICAgICBhZGRQcm9wZXJ0eShfcnRpVGFncy5mdW5jdGlvblR5cGVOYW1lZFBhcmFtZXRlcnNUYWcsCiAgICAgICAgICBuZXcganNBc3QuT2JqZWN0SW5pdGlhbGl6ZXIobmFtZWRBcmd1bWVudHMpKTsKICAgIH0KCiAgICAvLyBFeGl0IGdlbmVyaWMgZnVuY3Rpb24gc2NvcGUuCiAgICBpZiAodHlwZS50eXBlVmFyaWFibGVzLmlzTm90RW1wdHkpIHsKICAgICAgZnVuY3Rpb25UeXBlVmFyaWFibGVzLmxlbmd0aCAtPSB0eXBlLnR5cGVWYXJpYWJsZXMubGVuZ3RoOwogICAgfQoKICAgIHJldHVybiBuZXcganNBc3QuT2JqZWN0SW5pdGlhbGl6ZXIocHJvcGVydGllcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgdHlwZSwgTW9kdWxhckVtaXR0ZXIgZW1pdHRlcikgewogICAgcmV0dXJuIGdldFZvaWRWYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIHR5cGUsIE1vZHVsYXJFbWl0dGVyIGVtaXR0ZXIpIHsKICAgIGJvb2wgc2hvdWxkRW5jb2RlID0gc2hvdWxkRW5jb2RlVHlwZWRlZih0eXBlKTsKICAgIERhcnRUeXBlIHVuYWxpYXNlZFR5cGUgPSB0eXBlLnVuYWxpYXNlZDsKCiAgICB2YXIgb2xkQmluZGluZ3MgPSB0eXBlZGVmQmluZGluZ3M7CiAgICBpZiAodHlwZWRlZkJpbmRpbmdzID09IG51bGwpIHsKICAgICAgLy8gRmlyc3QgbGV2ZWwgdHlwZWRlZiAtIGNhcHR1cmUgYXJndW1lbnRzIGZvciByZS11c2Ugd2l0aGluIHR5cGVkZWYgYm9keS4KICAgICAgLy8KICAgICAgLy8gVGhlIHR5cGUgYE1hcDxULCBGb288U2V0PFQ+Pj5gIGNvbnRhaW5zIG9uZSB0eXBlIHZhcmlhYmxlIHJlZmVyZW5jZWQKICAgICAgLy8gdHdpY2UsIHNvIHRoZXJlIGFyZSB0d28gaW5wdXRzIGludG8gdGhlIEhUeXBlSW5mb0V4cHJlc3Npb24KICAgICAgLy8gaW5zdHJ1Y3Rpb24uCiAgICAgIC8vCiAgICAgIC8vIElmIEZvbyBpcyBhIHR5cGVkZWYsIFQgY2FuIGJlIHJldXNlZCwgZS5nLgogICAgICAvLwogICAgICAvLyAgICAgdHlwZWRlZiBFIEZvbzxFPihFIGEsIEUgYik7CiAgICAgIC8vCiAgICAgIC8vIEFzIHRoZSB0eXBlZGVmIGlzIGV4cGFuZGVkICh0byAoU2V0PFQ+LCBTZXQ8VD4pID0+IFNldDxUPikgaXQgc2hvdWxkCiAgICAgIC8vIG5vdCBjb25zdW1lIGFkZGl0aW9uYWwgdHlwZXMgZnJvbSB0aGUgdG8tbGV2ZWwgaW5wdXQuICBXZSBwcmV2ZW50IHRoaXMKICAgICAgLy8gYnkgY2FwdHVyaW5nIHRoZSB0eXBlcyBhbmQgdXNpbmcgdGhlIGNhcHR1cmVkIHR5cGUgZXhwcmVzc2lvbnMgaW5zaWRlCiAgICAgIC8vIHRoZSB0eXBlZGVmIGV4cGFuc2lvbi4KICAgICAgLy8KICAgICAgLy8gVE9ETyhzcmEpOiBXZSBzaG91bGQgbWFrZSB0aGUgdHlwZSBzdWJleHByZXNzaW9uIEZvbzwuLi4+IGJlIGEgc2Vjb25kCiAgICAgIC8vIEhUeXBlSW5mb0V4cHJlc3Npb24sIHdpdGggU2V0PFQ+IGFzIGl0cyBpbnB1dCAoYSB0aGlyZAogICAgICAvLyBIVHlwZUluZm9FeHByZXNzaW9uKS4gVGhpcyB3b3VsZCBzaGFyZSBhbGwgdGhlIFNldDxUPiBzdWJleHByZXNzaW9ucwogICAgICAvLyBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIHRoZW0uIFRoaXMgd291bGQgcmVxdWlyZSBIVHlwZUluZm9FeHByZXNzaW9uCiAgICAgIC8vIGlucHV0cyB0byBjb3JyZXNwb25kIHRvIHR5cGUgdmFyaWFibGVzIEFORCB0eXBlZGVmcy4KICAgICAgdHlwZWRlZkJpbmRpbmdzID0gPFR5cGVWYXJpYWJsZVR5cGUsIGpzQXN0LkV4cHJlc3Npb24+e307CiAgICAgIHR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZSgoVHlwZVZhcmlhYmxlVHlwZSB2YXJpYWJsZSkgewogICAgICAgIHR5cGVkZWZCaW5kaW5nc1t2YXJpYWJsZV0gPSBvblZhcmlhYmxlKHZhcmlhYmxlKTsKICAgICAgfSk7CiAgICB9CgogICAganNBc3QuRXhwcmVzc2lvbiBmaW5pc2goanNBc3QuRXhwcmVzc2lvbiByZXN1bHQpIHsKICAgICAgdHlwZWRlZkJpbmRpbmdzID0gb2xkQmluZGluZ3M7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgaWYgKHNob3VsZEVuY29kZSkgewogICAgICBqc0FzdC5PYmplY3RJbml0aWFsaXplciBpbml0aWFsaXplciA9IHZpc2l0KHVuYWxpYXNlZFR5cGUsIGVtaXR0ZXIpOwogICAgICAvLyBXZSBoYXZlIHRvIGVuY29kZSB0aGUgYWxpYXNlZCB0eXBlLgogICAgICBqc0FzdC5FeHByZXNzaW9uIG5hbWUgPSBnZXRKYXZhU2NyaXB0Q2xhc3NOYW1lKHR5cGUuZWxlbWVudCwgZW1pdHRlcik7CiAgICAgIGpzQXN0LkV4cHJlc3Npb24gZW5jb2RlZFR5cGVkZWYgPSB0eXBlLnRyZWF0QXNSYXcKICAgICAgICAgID8gbmFtZQogICAgICAgICAgOiB2aXNpdExpc3QodHlwZS50eXBlQXJndW1lbnRzLCBlbWl0dGVyLCBoZWFkOiBuYW1lKTsKCiAgICAgIC8vIEFkZCBpdCB0byB0aGUgZnVuY3Rpb24tdHlwZSBvYmplY3QuCiAgICAgIGpzQXN0LkxpdGVyYWxTdHJpbmcgdGFnID0ganMuc3RyaW5nKF9ydGlUYWdzLnR5cGVkZWZUYWcpOwogICAgICBpbml0aWFsaXplci5wcm9wZXJ0aWVzLmFkZChuZXcganNBc3QuUHJvcGVydHkodGFnLCBlbmNvZGVkVHlwZWRlZikpOwogICAgICByZXR1cm4gZmluaXNoKGluaXRpYWxpemVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmaW5pc2godmlzaXQodW5hbGlhc2VkVHlwZSwgZW1pdHRlcikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdEZ1dHVyZU9yVHlwZSgKICAgICAgRnV0dXJlT3JUeXBlIHR5cGUsIE1vZHVsYXJFbWl0dGVyIGVtaXR0ZXIpIHsKICAgIExpc3Q8anNBc3QuUHJvcGVydHk+IHByb3BlcnRpZXMgPSA8anNBc3QuUHJvcGVydHk+W107CgogICAgdm9pZCBhZGRQcm9wZXJ0eShTdHJpbmcgbmFtZSwganNBc3QuRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICBwcm9wZXJ0aWVzLmFkZChuZXcganNBc3QuUHJvcGVydHkoanMuc3RyaW5nKG5hbWUpLCB2YWx1ZSkpOwogICAgfQoKICAgIC8vIFR5cGUgcmVwcmVzZW50YXRpb25zIGZvciBGdXR1cmVPciBoYXZlIGEgcHJvcGVydHkgd2hpY2ggaXMgYSB0YWcgbWFya2luZwogICAgLy8gdGhlbSBhcyBGdXR1cmVPciB0eXBlcy4gVGhlIHZhbHVlIGlzIG5vdCB1c2VkLCBzbyAnMScgaXMganVzdCBhIGR1bW15LgogICAgYWRkUHJvcGVydHkoX3J0aVRhZ3MuZnV0dXJlT3JUYWcsIGpzLm51bWJlcigxKSk7CiAgICBpZiAoIXR5cGUudHlwZUFyZ3VtZW50LnRyZWF0QXNEeW5hbWljKSB7CiAgICAgIGFkZFByb3BlcnR5KF9ydGlUYWdzLmZ1dHVyZU9yVHlwZVRhZywgdmlzaXQodHlwZS50eXBlQXJndW1lbnQsIGVtaXR0ZXIpKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IGpzQXN0Lk9iamVjdEluaXRpYWxpemVyKHByb3BlcnRpZXMpOwogIH0KfQoKY2xhc3MgVHlwZUNoZWNrTWFwcGluZyBpbXBsZW1lbnRzIFR5cGVDaGVja3MgewogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NDaGVja3M+IG1hcCA9IG5ldyBNYXA8Q2xhc3NFbnRpdHksIENsYXNzQ2hlY2tzPigpOwoKICBAb3ZlcnJpZGUKICBDbGFzc0NoZWNrcyBvcGVyYXRvciBbXShDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICBDbGFzc0NoZWNrcyByZXN1bHQgPSBtYXBbZWxlbWVudF07CiAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiBjb25zdCBDbGFzc0NoZWNrcy5lbXB0eSgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oQ2xhc3NFbnRpdHkgZWxlbWVudCwgQ2xhc3NDaGVja3MgY2hlY2tzKSB7CiAgICBtYXBbZWxlbWVudF0gPSBjaGVja3M7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGNsYXNzZXMgPT4gbWFwLmtleXM7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAoQ2xhc3NFbnRpdHkgaG9sZGVyIGluIGNsYXNzZXMpIHsKICAgICAgZm9yIChUeXBlQ2hlY2sgY2hlY2sgaW4gdGhpc1tob2xkZXJdLmNoZWNrcykgewogICAgICAgIHNiLndyaXRlKCcke2hvbGRlci5uYW1lfSA8OiAke2NoZWNrLmNscy5uYW1lfSwgJyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAnWyRzYl0nOwogIH0KfQoKY2xhc3MgQXJndW1lbnRDb2xsZWN0b3IgZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8ZHluYW1pYywgYm9vbD4gewogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gY2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogIHZvaWQgYWRkQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBjbGFzc2VzLmFkZChjbHMpOwogIH0KCiAgY29sbGVjdChEYXJ0VHlwZSB0eXBlLCB7Ym9vbCBpc1R5cGVBcmd1bWVudDogZmFsc2V9KSB7CiAgICB2aXNpdCh0eXBlLCBpc1R5cGVBcmd1bWVudCk7CiAgfQoKICAvLy8gQ29sbGVjdCBhbGwgdHlwZXMgaW4gdGhlIGxpc3QgYXMgaWYgdGhleSB3ZXJlIGFyZ3VtZW50cyBvZiBhbgogIC8vLyBJbnRlcmZhY2VUeXBlLgogIGNvbGxlY3RBbGwoTGlzdDxEYXJ0VHlwZT4gdHlwZXMsIHtib29sIGlzVHlwZUFyZ3VtZW50OiBmYWxzZX0pIHsKICAgIGZvciAoRGFydFR5cGUgdHlwZSBpbiB0eXBlcykgewogICAgICB2aXNpdCh0eXBlLCB0cnVlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgdHlwZSwgYm9vbCBpc1R5cGVBcmd1bWVudCkgewogICAgY29sbGVjdCh0eXBlLnVuYWxpYXNlZCwgaXNUeXBlQXJndW1lbnQ6IGlzVHlwZUFyZ3VtZW50KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUsIGJvb2wgaXNUeXBlQXJndW1lbnQpIHsKICAgIGlmIChpc1R5cGVBcmd1bWVudCkgYWRkQ2xhc3ModHlwZS5lbGVtZW50KTsKICAgIGNvbGxlY3RBbGwodHlwZS50eXBlQXJndW1lbnRzLCBpc1R5cGVBcmd1bWVudDogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgdHlwZSwgXykgewogICAgY29sbGVjdCh0eXBlLnJldHVyblR5cGUsIGlzVHlwZUFyZ3VtZW50OiB0cnVlKTsKICAgIGNvbGxlY3RBbGwodHlwZS5wYXJhbWV0ZXJUeXBlcywgaXNUeXBlQXJndW1lbnQ6IHRydWUpOwogICAgY29sbGVjdEFsbCh0eXBlLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMsIGlzVHlwZUFyZ3VtZW50OiB0cnVlKTsKICAgIGNvbGxlY3RBbGwodHlwZS5uYW1lZFBhcmFtZXRlclR5cGVzLCBpc1R5cGVBcmd1bWVudDogdHJ1ZSk7CiAgfQp9CgpjbGFzcyBGdW5jdGlvbkFyZ3VtZW50Q29sbGVjdG9yIGV4dGVuZHMgRGFydFR5cGVWaXNpdG9yPGR5bmFtaWMsIGJvb2w+IHsKICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICBGdW5jdGlvbkFyZ3VtZW50Q29sbGVjdG9yKCk7CgogIGNvbGxlY3QoRGFydFR5cGUgdHlwZSwge2Jvb2wgaW5GdW5jdGlvblR5cGU6IGZhbHNlfSkgewogICAgdmlzaXQodHlwZSwgaW5GdW5jdGlvblR5cGUpOwogIH0KCiAgY29sbGVjdEFsbChJdGVyYWJsZTxEYXJ0VHlwZT4gdHlwZXMsIHtib29sIGluRnVuY3Rpb25UeXBlOiBmYWxzZX0pIHsKICAgIGZvciAoRGFydFR5cGUgdHlwZSBpbiB0eXBlcykgewogICAgICB2aXNpdCh0eXBlLCBpbkZ1bmN0aW9uVHlwZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIHR5cGUsIGJvb2wgaW5GdW5jdGlvblR5cGUpIHsKICAgIGNvbGxlY3QodHlwZS51bmFsaWFzZWQsIGluRnVuY3Rpb25UeXBlOiBpbkZ1bmN0aW9uVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlLCBib29sIGluRnVuY3Rpb25UeXBlKSB7CiAgICBpZiAoaW5GdW5jdGlvblR5cGUpIHsKICAgICAgY2xhc3Nlcy5hZGQodHlwZS5lbGVtZW50KTsKICAgIH0KICAgIGNvbGxlY3RBbGwodHlwZS50eXBlQXJndW1lbnRzLCBpbkZ1bmN0aW9uVHlwZTogaW5GdW5jdGlvblR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIHR5cGUsIF8pIHsKICAgIGNvbGxlY3QodHlwZS5yZXR1cm5UeXBlLCBpbkZ1bmN0aW9uVHlwZTogdHJ1ZSk7CiAgICBjb2xsZWN0QWxsKHR5cGUucGFyYW1ldGVyVHlwZXMsIGluRnVuY3Rpb25UeXBlOiB0cnVlKTsKICAgIGNvbGxlY3RBbGwodHlwZS5vcHRpb25hbFBhcmFtZXRlclR5cGVzLCBpbkZ1bmN0aW9uVHlwZTogdHJ1ZSk7CiAgICBjb2xsZWN0QWxsKHR5cGUubmFtZWRQYXJhbWV0ZXJUeXBlcywgaW5GdW5jdGlvblR5cGU6IHRydWUpOwogICAgY29sbGVjdEFsbCh0eXBlLnR5cGVWYXJpYWJsZXMubWFwKCh0eXBlKSA9PiB0eXBlLmJvdW5kKSwKICAgICAgICBpbkZ1bmN0aW9uVHlwZTogdHJ1ZSk7CiAgfQp9CgplbnVtIFR5cGVWaXNpdG9yU3RhdGUgewogIGRpcmVjdCwKICBjb3ZhcmlhbnRUeXBlQXJndW1lbnQsCiAgY29udHJhdmFyaWFudFR5cGVBcmd1bWVudCwKICB0eXBlTGl0ZXJhbCwKfQoKY2xhc3MgVHlwZVZpc2l0b3IgZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8dm9pZCwgVHlwZVZpc2l0b3JTdGF0ZT4gewogIFNldDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gX3Zpc2l0ZWRGdW5jdGlvblR5cGVWYXJpYWJsZXMgPQogICAgICBuZXcgU2V0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPigpOwoKICBmaW5hbCB2b2lkIEZ1bmN0aW9uKENsYXNzRW50aXR5IGVudGl0eSwge1R5cGVWaXNpdG9yU3RhdGUgc3RhdGV9KSBvbkNsYXNzOwogIGZpbmFsIHZvaWQgRnVuY3Rpb24oVHlwZVZhcmlhYmxlRW50aXR5IGVudGl0eSwge1R5cGVWaXNpdG9yU3RhdGUgc3RhdGV9KQogICAgICBvblR5cGVWYXJpYWJsZTsKICBmaW5hbCB2b2lkIEZ1bmN0aW9uKEZ1bmN0aW9uVHlwZSB0eXBlLCB7VHlwZVZpc2l0b3JTdGF0ZSBzdGF0ZX0pCiAgICAgIG9uRnVuY3Rpb25UeXBlOwoKICBUeXBlVmlzaXRvcih7dGhpcy5vbkNsYXNzLCB0aGlzLm9uVHlwZVZhcmlhYmxlLCB0aGlzLm9uRnVuY3Rpb25UeXBlfSk7CgogIHZpc2l0VHlwZShEYXJ0VHlwZSB0eXBlLCBUeXBlVmlzaXRvclN0YXRlIHN0YXRlKSA9PiB0eXBlLmFjY2VwdCh0aGlzLCBzdGF0ZSk7CgogIFR5cGVWaXNpdG9yU3RhdGUgY292YXJpYW50QXJndW1lbnQoVHlwZVZpc2l0b3JTdGF0ZSBzdGF0ZSkgewogICAgc3dpdGNoIChzdGF0ZSkgewogICAgICBjYXNlIFR5cGVWaXNpdG9yU3RhdGUuZGlyZWN0OgogICAgICAgIHJldHVybiBUeXBlVmlzaXRvclN0YXRlLmNvdmFyaWFudFR5cGVBcmd1bWVudDsKICAgICAgY2FzZSBUeXBlVmlzaXRvclN0YXRlLmNvdmFyaWFudFR5cGVBcmd1bWVudDoKICAgICAgICByZXR1cm4gVHlwZVZpc2l0b3JTdGF0ZS5jb3ZhcmlhbnRUeXBlQXJndW1lbnQ7CiAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS5jb250cmF2YXJpYW50VHlwZUFyZ3VtZW50OgogICAgICAgIHJldHVybiBUeXBlVmlzaXRvclN0YXRlLmNvbnRyYXZhcmlhbnRUeXBlQXJndW1lbnQ7CiAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS50eXBlTGl0ZXJhbDoKICAgICAgICByZXR1cm4gVHlwZVZpc2l0b3JTdGF0ZS50eXBlTGl0ZXJhbDsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIFR5cGVWaXNpdG9yU3RhdGUgJHN0YXRlIik7CiAgfQoKICBUeXBlVmlzaXRvclN0YXRlIGNvbnRyYXZhcmlhbnRBcmd1bWVudChUeXBlVmlzaXRvclN0YXRlIHN0YXRlKSB7CiAgICBzd2l0Y2ggKHN0YXRlKSB7CiAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS5kaXJlY3Q6CiAgICAgICAgcmV0dXJuIFR5cGVWaXNpdG9yU3RhdGUuY29udHJhdmFyaWFudFR5cGVBcmd1bWVudDsKICAgICAgY2FzZSBUeXBlVmlzaXRvclN0YXRlLmNvdmFyaWFudFR5cGVBcmd1bWVudDoKICAgICAgICByZXR1cm4gVHlwZVZpc2l0b3JTdGF0ZS5jb250cmF2YXJpYW50VHlwZUFyZ3VtZW50OwogICAgICBjYXNlIFR5cGVWaXNpdG9yU3RhdGUuY29udHJhdmFyaWFudFR5cGVBcmd1bWVudDoKICAgICAgICByZXR1cm4gVHlwZVZpc2l0b3JTdGF0ZS5jb3ZhcmlhbnRUeXBlQXJndW1lbnQ7CiAgICAgIGNhc2UgVHlwZVZpc2l0b3JTdGF0ZS50eXBlTGl0ZXJhbDoKICAgICAgICByZXR1cm4gVHlwZVZpc2l0b3JTdGF0ZS50eXBlTGl0ZXJhbDsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIFR5cGVWaXNpdG9yU3RhdGUgJHN0YXRlIik7CiAgfQoKICB2aXNpdFR5cGVzKExpc3Q8RGFydFR5cGU+IHR5cGVzLCBUeXBlVmlzaXRvclN0YXRlIHN0YXRlKSB7CiAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gdHlwZXMpIHsKICAgICAgdmlzaXRUeXBlKHR5cGUsIHN0YXRlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlVmFyaWFibGVUeXBlKFR5cGVWYXJpYWJsZVR5cGUgdHlwZSwgVHlwZVZpc2l0b3JTdGF0ZSBzdGF0ZSkgewogICAgaWYgKG9uVHlwZVZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgb25UeXBlVmFyaWFibGUodHlwZS5lbGVtZW50LCBzdGF0ZTogc3RhdGUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgdHlwZSwgVHlwZVZpc2l0b3JTdGF0ZSBzdGF0ZSkgewogICAgaWYgKG9uQ2xhc3MgIT0gbnVsbCkgewogICAgICBvbkNsYXNzKHR5cGUuZWxlbWVudCwgc3RhdGU6IHN0YXRlKTsKICAgIH0KICAgIHZpc2l0VHlwZXModHlwZS50eXBlQXJndW1lbnRzLCBjb3ZhcmlhbnRBcmd1bWVudChzdGF0ZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIHR5cGUsIFR5cGVWaXNpdG9yU3RhdGUgc3RhdGUpIHsKICAgIGlmIChvbkZ1bmN0aW9uVHlwZSAhPSBudWxsKSB7CiAgICAgIG9uRnVuY3Rpb25UeXBlKHR5cGUsIHN0YXRlOiBzdGF0ZSk7CiAgICB9CiAgICAvLyBWaXNpdCBhbGwgbmVzdGVkIHR5cGVzIGFzIHR5cGUgYXJndW1lbnRzOyB0aGVzZSB0eXBlcyBhcmUgbm90IHJ1bnRpbWUKICAgIC8vIGluc3RhbmNlcyBidXQgcnVudGltZSB0eXBlIHJlcHJlc2VudGF0aW9ucy4KICAgIHZpc2l0VHlwZSh0eXBlLnJldHVyblR5cGUsIGNvdmFyaWFudEFyZ3VtZW50KHN0YXRlKSk7CiAgICB2aXNpdFR5cGVzKHR5cGUucGFyYW1ldGVyVHlwZXMsIGNvbnRyYXZhcmlhbnRBcmd1bWVudChzdGF0ZSkpOwogICAgdmlzaXRUeXBlcyh0eXBlLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMsIGNvbnRyYXZhcmlhbnRBcmd1bWVudChzdGF0ZSkpOwogICAgdmlzaXRUeXBlcyh0eXBlLm5hbWVkUGFyYW1ldGVyVHlwZXMsIGNvbnRyYXZhcmlhbnRBcmd1bWVudChzdGF0ZSkpOwogICAgX3Zpc2l0ZWRGdW5jdGlvblR5cGVWYXJpYWJsZXMucmVtb3ZlQWxsKHR5cGUudHlwZVZhcmlhYmxlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIHR5cGUsIFR5cGVWaXNpdG9yU3RhdGUgc3RhdGUpIHsKICAgIHZpc2l0VHlwZSh0eXBlLnVuYWxpYXNlZCwgc3RhdGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvblR5cGVWYXJpYWJsZShGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlLCBUeXBlVmlzaXRvclN0YXRlIHN0YXRlKSB7CiAgICBpZiAoX3Zpc2l0ZWRGdW5jdGlvblR5cGVWYXJpYWJsZXMuYWRkKHR5cGUpKSB7CiAgICAgIHZpc2l0VHlwZSh0eXBlLmJvdW5kLCBzdGF0ZSk7CiAgICB9CiAgfQp9CgovLy8gUnVudGltZSB0eXBlIHVzYWdlIGZvciBhIGNsYXNzLgpjbGFzcyBDbGFzc1VzZSB7CiAgLy8vIFdoZXRoZXIgdGhlIGNsYXNzIGlzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5zdGFudGlhdGVkLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgYEFgIGFuZCBgQmAgaW46CiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHt9CiAgLy8vICAgICBjbGFzcyBCIGV4dGVuZHMgQSB7fQogIC8vLyAgICAgbWFpbigpID0+IG5ldyBCKCk7CiAgLy8vCiAgYm9vbCBpbnN0YW5jZSA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0aGUgY2xhc3MgaXMgZGlyZWN0bHkgaW5zdGFudGlhdGVkLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgYEJgIGluOgogIC8vLwogIC8vLyAgICAgY2xhc3MgQSB7fQogIC8vLyAgICAgY2xhc3MgQiBleHRlbmRzIEEge30KICAvLy8gICAgIG1haW4oKSA9PiBuZXcgQigpOwogIC8vLwogIGJvb2wgZGlyZWN0SW5zdGFuY2UgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgb2JqZWN0cyBhcmUgY2hlY2tlZCB0byBiZSBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgYEFgIGluOgogIC8vLwogIC8vLyAgICAgY2xhc3MgQSB7fQogIC8vLyAgICAgbWFpbigpID0+IG51bGwgaXMgQTsKICAvLy8KICBib29sIGNoZWNrZWRJbnN0YW5jZSA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0aGUgY2xhc3MgaXMgcGFzc2VkIGFzIGEgdHlwZSBhcmd1bWVudCBhdCBydW50aW1lLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgYEFgIGluOgogIC8vLwogIC8vLyAgICAgY2xhc3MgQSB7fQogIC8vLyAgICAgbWFpbigpID0+IG5ldyBMaXN0PEE+KCkgaXMgTGlzdDxTdHJpbmc+OwogIC8vLwogIGJvb2wgdHlwZUFyZ3VtZW50ID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRoZSBjbGFzcyBpcyBjaGVja2VkIGFzIGEgdHlwZSBhcmd1bWVudCBhdCBydW50aW1lLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgYEFgIGluOgogIC8vLwogIC8vLyAgICAgY2xhc3MgQSB7fQogIC8vLyAgICAgbWFpbigpID0+IG5ldyBMaXN0PFN0cmluZz4oKSBpcyBMaXN0PEE+OwogIC8vLwogIGJvb2wgY2hlY2tlZFR5cGVBcmd1bWVudCA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0aGUgY2xhc3MgaXMgdXNlZCBpbiBhIGNvbnN0YW50IHR5cGUgbGl0ZXJhbC4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGBBYDoKICAvLy8KICAvLy8gICAgIGNsYXNzIEEge30KICAvLy8gICAgIG1haW4oKSA9PiBBOwogIC8vLwogIGJvb2wgdHlwZUxpdGVyYWwgPSBmYWxzZTsKCiAgLy8vIFRoZSBmdW5jdGlvbiB0eXBlIG9mIHRoZSBjbGFzcywgaWYgYW55LgogIC8vLwogIC8vLyBUaGlzIGlzIG9ubHkgc2V0IGlmIHRoZSBmdW5jdGlvbiB0eXBlIGlzIG5lZWRlZCBhdCBydW50aW1lLiBGb3IgaW5zdGFuY2UsCiAgLy8vIGlmIG5vIGZ1bmN0aW9uIHR5cGVzIGFyZSBjaGVja2VkIGF0IHJ1bnRpbWUgdGhlbiB0aGUgZnVuY3Rpb24gdHlwZSBpc24ndAogIC8vLyBuZWVkZWQuCiAgLy8vCiAgLy8vIEZ1cnRoZXJtb3JlIG9wdGltaXphdGlvbiBtaWdodCBhbHNvIG9taXQgZnVuY3Rpb24gdHlwZSB0aGF0IGFyZSBrbm93biBub3QKICAvLy8gdG8gYmUgdmFsaWQgaW4gYW55IHN1YnR5cGUgdGVzdC4KICBDbGFzc0Z1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGU7CgogIC8vLyBgdHJ1ZWAgaWYgdGhlIGNsYXNzIGlzICdsaXZlJyBlaXRoZXIgdGhyb3VnaCBpbnN0YW50aWF0aW9uIG9yIHVzZSBpbgogIC8vLyB0eXBlIGFyZ3VtZW50cy4KICBib29sIGdldCBpc0xpdmUgPT4gZGlyZWN0SW5zdGFuY2UgfHwgdHlwZUFyZ3VtZW50OwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBMaXN0PFN0cmluZz4gcHJvcGVydGllcyA9IDxTdHJpbmc+W107CiAgICBpZiAoaW5zdGFuY2UpIHsKICAgICAgcHJvcGVydGllcy5hZGQoJ2luc3RhbmNlJyk7CiAgICB9CiAgICBpZiAoZGlyZWN0SW5zdGFuY2UpIHsKICAgICAgcHJvcGVydGllcy5hZGQoJ2RpcmVjdEluc3RhbmNlJyk7CiAgICB9CiAgICBpZiAoY2hlY2tlZEluc3RhbmNlKSB7CiAgICAgIHByb3BlcnRpZXMuYWRkKCdjaGVja2VkSW5zdGFuY2UnKTsKICAgIH0KICAgIGlmICh0eXBlQXJndW1lbnQpIHsKICAgICAgcHJvcGVydGllcy5hZGQoJ3R5cGVBcmd1bWVudCcpOwogICAgfQogICAgaWYgKGNoZWNrZWRUeXBlQXJndW1lbnQpIHsKICAgICAgcHJvcGVydGllcy5hZGQoJ2NoZWNrZWRUeXBlQXJndW1lbnQnKTsKICAgIH0KICAgIGlmICh0eXBlTGl0ZXJhbCkgewogICAgICBwcm9wZXJ0aWVzLmFkZCgncnRpVmFsdWUnKTsKICAgIH0KICAgIGlmIChmdW5jdGlvblR5cGUgIT0gbnVsbCkgewogICAgICBwcm9wZXJ0aWVzLmFkZCgnZnVuY3Rpb25UeXBlJyk7CiAgICB9CiAgICByZXR1cm4gJ0NsYXNzVXNlKCR7cHJvcGVydGllcy5qb2luKCcsJyl9KSc7CiAgfQp9CoYEAE5OPAEiARkwIQkYHBkdJCEhIDwaMSMYFRslKAFIQAEyJDAhAT4tAgE5ICYBJzMBDDABDDwCATwrLy4BOEkBRiw7ASMCAU4jOQwnAUwBUQEMLzABDEsBDCw8IwFIOD4XKSAhHiUdSSMGPTQvBAEqUSc+FBIEAS1RJAQCAS4rISIBMScyOQFHKEY/S0g2NwFALgE8MTEBOEMcAT9GLx8vIDsxATULGQsdKi0pC0JNCAFHIyI5Q1BQE04IAUoJSkBCHx4lIT1NGRtHCjoIAUwSMjFKAT9RAU9HGwsZCxwcERowC08cTTwBTxELGQsZGTELShpALQE+TwFADRsNHy8yLg1HLDgBMA1NUE4iQAFHKkYBTg1NQUEBLU5FD00uTkdNFU9OMElJN0wmF0MjKkomEA4TTy5EUDlPFUEhKEgmDgwKCAE+IAhLHkQIFQYBMDglIyJMOBwIBgETBAEMRjw7MTA0OCQ4CggGNAFJEwQBTgxDGSsTBgFGNhMGAUkgORQGAT8YEwYBR0NRHCMBUE8eOzMwFAY9MhYIBhEEAQxFJTsgIwgGTUEsBAFHLjgBUVEcPz03OTdIKzhDOg1NBgQCAVAMIwweATcCASU8RgFPGjABTxowAU8YLAFPGy8BTy45AVFHKkw6ATkBNR8CAToyDCMtLgFAMAEMLjglJA1PFQQCARcoKwwjAURCLTsBIwEMJwEnAUYMMScMOQEMOgE0ATsnAQwvLyweBAEMSi8EAQwsPEEdGRAWIB1JSQFIICsGAUY8PQFKQx8HTUkaBxQHIgcoIk9OFzUoIhE5KC8iESsnIREmEQgIAVA7B09JGAcUByEHKCRPThc1KC8iETkoIhErESYrEQgIAUFOIAgBL0JAGkcmOB5GCAFMCRcaJx8JSiNDLz9QTEscEQo0RwgIAUVQSAYBRVBIBgFGNR9DCAYBSEk9Twg9RQgBJAEqHyUnHE0IPwYBMjIBQktNS0gpJzoiUC4IBgFOFzU/HR4ICCcBQCcrGDktSR1QJyNADAoICAE4IyRCBAIBMQRNLyg+JBcsGE8lRx0TBgszEQQWSCkoTk0EDwIBPzAnPiMMIQFERCNCAU8aDDE/BAFPGgwxPwQBTxgMLTsEAU8bDDA+BAEMOkgEAQwqTDs7OQQBNiUmBAFKLkA2PAYBIDo7Fw0yIiknGyQpLBUIRQYEAQw8R0AgRiBPUVFEC05OSzo+OEcSDyIKDRcGBAEMOkYEAgEzPxgbAScBKQEwATIBOwE6ATkBOAEpASkCASJDIiUBITM7TwFAAUo6Kh4VJTMlIh9PPBwlKxsEASswKAQBNAEvAUAMQyIBDCo3Iy0kBh0EAQwuOzgbQwQBDFAeBAE4ITwYGgYmNQYxBAEMJzRLHSYVDU5JH0M4UBFOCAYTBAFLITwYGgYjNyotDx8IBjEEAU8aMVEEAU8aMU0EAU8YLTcEAU8bMDgEATo3BAEMJjM6ATxCBgFRTjkBKU0ZSy0ITFEZOVAGASsTUAYoPjQGMD48Bi1AMTcsOzkXSgg7OAYBJClBBgE0BAEMShsEAQxQMy0BJyNRCU5FFgk0CSkJTlBPIAlPQE5NPkA9OgoGATclFQYBGEstTTgRQAEtQEsiDTQGBAEMJjM6ATxCBgFQTjUtUAYBNAQCAS9RAQwxJ0AEAT8bBAEMMQEMFioqNTsIBhQEAgFBOwEjFgQBOSEEAUQVQyMZBgQBDDw9BAEMQDA6BAEMLDQ7Q0AEAgFJOwEfATkhBAFHIyMGBAEMPD0EAQxAGiEGRAQBDCw0O0NAPR8EAgEYChkdDwIBRDwnAU1LFkMWAUkBUAE/FSQ3Mzc3OyktBkYEAUMVJDszOzc3KS0GRgQBPSMeBgQBDE4iMgYEAQxDGysGPgQBDEEiKgZNMzpDS0hBBAEMPyYEAQxRMyQGBAIBJBFABiMGFR8dBhkBMgYbBhUfHQYfAUAGGwYVHwYgAUEGGwYVMwYdAUIGGwYVMwYkATwGGAYVFwYcAS4GUE8OBlAnIgFLFjUBDBYqFCIGGigGGykGGCYGHy0GFyIGICYGMAQCATJwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydENzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXNfY29kZWdlbi5kYXJ0kGIvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBqc19iYWNrZW5kLnJ1bnRpbWVfdHlwZXNfY29kZWdlbjsKCmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CgovLy8gRGF0YSBuZWVkZWQgZm9yIGdlbmVyYXRpbmcgYSBzaWduYXR1cmUgZnVuY3Rpb24gZm9yIHRoZSBmdW5jdGlvbiB0eXBlIG9mCi8vLyBhIGNsYXNzLgpjbGFzcyBDbGFzc0Z1bmN0aW9uVHlwZSB7CiAgLy8vIFRoZSBgY2FsbGAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIHRoZSBmdW5jdGlvbiB0eXBlLgogIGZpbmFsIEZ1bmN0aW9uRW50aXR5IGNhbGxGdW5jdGlvbjsKCiAgLy8vIFRoZSB0eXBlIG9mIHRoZSBgY2FsbGAgZnVuY3Rpb24uCiAgZmluYWwgRnVuY3Rpb25UeXBlIGNhbGxUeXBlOwoKICAvLy8gVGhlIHNpZ25hdHVyZSBmdW5jdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIHR5cGUuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgRGFydCAyLgogIGZpbmFsIEZ1bmN0aW9uRW50aXR5IHNpZ25hdHVyZUZ1bmN0aW9uOwoKICBDbGFzc0Z1bmN0aW9uVHlwZSh0aGlzLmNhbGxGdW5jdGlvbiwgdGhpcy5jYWxsVHlwZSwgdGhpcy5zaWduYXR1cmVGdW5jdGlvbik7Cn0KCi8vLyBBIHBhaXIgb2YgYSBjbGFzcyB0aGF0IHdlIG5lZWQgYSBjaGVjayBhZ2FpbnN0IGFuZCB0aGUgdHlwZSBhcmd1bWVudAovLy8gc3Vic3RpdHV0aW9uIGZvciB0aGlzIGNoZWNrLgpjbGFzcyBUeXBlQ2hlY2sgewogIGZpbmFsIENsYXNzRW50aXR5IGNsczsKICBmaW5hbCBib29sIG5lZWRzSXM7CiAgZmluYWwgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbjsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGUgPSBfbmV4dEhhc2ggPSAoX25leHRIYXNoICsgMTAwMDAzKS50b1Vuc2lnbmVkKDMwKTsKICBzdGF0aWMgaW50IF9uZXh0SGFzaCA9IDA7CgogIFR5cGVDaGVjayh0aGlzLmNscywgdGhpcy5zdWJzdGl0dXRpb24sIHt0aGlzLm5lZWRzSXM6IHRydWV9KTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJ1R5cGVDaGVjayhjbHM9JGNscyxuZWVkc0lzPSRuZWVkc0lzLHN1YnN0aXR1dGlvbj0kc3Vic3RpdHV0aW9uKSc7Cn0KCi8vLyBbVHlwZUNoZWNrXXMgbmVlZCBmb3IgYSBzaW5nbGUgY2xhc3MuCmNsYXNzIENsYXNzQ2hlY2tzIHsKICBmaW5hbCBNYXA8Q2xhc3NFbnRpdHksIFR5cGVDaGVjaz4gX21hcDsKCiAgZmluYWwgQ2xhc3NGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlOwoKICBDbGFzc0NoZWNrcyh0aGlzLmZ1bmN0aW9uVHlwZSkgOiBfbWFwID0gPENsYXNzRW50aXR5LCBUeXBlQ2hlY2s+e307CgogIGNvbnN0IENsYXNzQ2hlY2tzLmVtcHR5KCkKICAgICAgOiBfbWFwID0gY29uc3QgPENsYXNzRW50aXR5LCBUeXBlQ2hlY2s+e30sCiAgICAgICAgZnVuY3Rpb25UeXBlID0gbnVsbDsKCiAgdm9pZCBhZGQoVHlwZUNoZWNrIGNoZWNrKSB7CiAgICBfbWFwW2NoZWNrLmNsc10gPSBjaGVjazsKICB9CgogIFR5cGVDaGVjayBvcGVyYXRvciBbXShDbGFzc0VudGl0eSBjbHMpID0+IF9tYXBbY2xzXTsKCiAgSXRlcmFibGU8VHlwZUNoZWNrPiBnZXQgY2hlY2tzID0+IF9tYXAudmFsdWVzOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ0NsYXNzQ2hlY2tzKCRjaGVja3MpJzsKICB9Cn0KCi8vLyBGb3IgZWFjaCBjbGFzcywgc3RvcmVzIHRoZSBwb3NzaWJsZSBjbGFzcyBzdWJ0eXBlIHRlc3RzIHRoYXQgY291bGQgc3VjY2VlZC4KYWJzdHJhY3QgY2xhc3MgVHlwZUNoZWNrcyB7CiAgLy8vIEdldCB0aGUgc2V0IG9mIGNoZWNrcyByZXF1aXJlZCBmb3IgY2xhc3MgW2VsZW1lbnRdLgogIENsYXNzQ2hlY2tzIG9wZXJhdG9yIFtdKENsYXNzRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gR2V0IHRoZSBpdGVyYWJsZSBmb3IgYWxsIGNsYXNzZXMgdGhhdCBuZWVkIHR5cGUgY2hlY2tzLgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgY2xhc3NlczsKfQoKLy8vIFJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdWJzdGl0dXRpb24gb2YgdHlwZSBhcmd1bWVudHMgd2hlbiBnb2luZyBmcm9tIHRoZQovLy8gdHlwZSBvZiBhIGNsYXNzIHRvIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcy4KLy8vCi8vLyBGb3IgYGNsYXNzIEI8VD4gZXh0ZW5kcyBBPExpc3Q8VD4sIGludD5gLCB0aGUgc3Vic3RpdHV0aW9uIGlzIHRoZQovLy8gcmVwcmVzZW50YXRpb24gb2YgYChUKSA9PiBbPExpc3QsIFQ+LCBpbnRdYC4gRm9yIG1vcmUgZGV0YWlscyBvZiB0aGUKLy8vIHJlcHJlc2VudGF0aW9uIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gb2YgW2dldFN1cGVydHlwZVN1YnN0aXR1dGlvbl0uCi8vVE9ETyhmbG9pdHNjaCk6IFJlbW92ZSBzdXBwb3J0IGZvciBub24tZnVuY3Rpb24gc3Vic3RpdHV0aW9ucy4KY2xhc3MgU3Vic3RpdHV0aW9uIHsKICBmaW5hbCBib29sIGlzVHJpdmlhbDsKICBmaW5hbCBib29sIGlzRnVuY3Rpb247CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzOwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHBhcmFtZXRlcnM7CiAgZmluYWwgaW50IGxlbmd0aDsKCiAgY29uc3QgU3Vic3RpdHV0aW9uLnRyaXZpYWwoKQogICAgICA6IGlzVHJpdmlhbCA9IHRydWUsCiAgICAgICAgaXNGdW5jdGlvbiA9IGZhbHNlLAogICAgICAgIGxlbmd0aCA9IG51bGwsCiAgICAgICAgYXJndW1lbnRzID0gY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgIHBhcmFtZXRlcnMgPSBjb25zdCA8RGFydFR5cGU+W107CgogIFN1YnN0aXR1dGlvbi5saXN0KHRoaXMuYXJndW1lbnRzKQogICAgICA6IGlzVHJpdmlhbCA9IGZhbHNlLAogICAgICAgIGlzRnVuY3Rpb24gPSBmYWxzZSwKICAgICAgICBsZW5ndGggPSBudWxsLAogICAgICAgIHBhcmFtZXRlcnMgPSBjb25zdCA8RGFydFR5cGU+W107CgogIFN1YnN0aXR1dGlvbi5mdW5jdGlvbih0aGlzLmFyZ3VtZW50cywgdGhpcy5wYXJhbWV0ZXJzKQogICAgICA6IGlzVHJpdmlhbCA9IGZhbHNlLAogICAgICAgIGlzRnVuY3Rpb24gPSB0cnVlLAogICAgICAgIGxlbmd0aCA9IG51bGw7CgogIFN1YnN0aXR1dGlvbi5qc0ludGVyb3AodGhpcy5sZW5ndGgpCiAgICAgIDogaXNUcml2aWFsID0gZmFsc2UsCiAgICAgICAgaXNGdW5jdGlvbiA9IGZhbHNlLAogICAgICAgIGFyZ3VtZW50cyA9IGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICBwYXJhbWV0ZXJzID0gY29uc3QgPERhcnRUeXBlPltdOwoKICBib29sIGdldCBpc0pzSW50ZXJvcCA9PiBsZW5ndGggIT0gbnVsbDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1N1YnN0aXR1dGlvbihpc1RyaXZpYWw9JGlzVHJpdmlhbCwnCiAgICAgICdpc0Z1bmN0aW9uPSRpc0Z1bmN0aW9uLGlzSnNJbnRlcm9wPSRpc0pzSW50ZXJvcCxhcmd1bWVudHM9JGFyZ3VtZW50cywnCiAgICAgICdwYXJhbWV0ZXJzPSRwYXJhbWV0ZXJzLGxlbmd0aD0kbGVuZ3RoKSc7Cn0KCi8vLyBJbnRlcmZhY2UgZm9yIGNvbXB1dGluZyBzdWJzdGl0dXRpb25zIG5lZWQgZm9yIHJ1bnRpbWUgdHlwZSBjaGVja3MuCmFic3RyYWN0IGNsYXNzIFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnMgewogIGJvb2wgaXNUcml2aWFsU3Vic3RpdHV0aW9uKENsYXNzRW50aXR5IGNscywgQ2xhc3NFbnRpdHkgY2hlY2spOwoKICBTdWJzdGl0dXRpb24gZ2V0U3Vic3RpdHV0aW9uKENsYXNzRW50aXR5IGNscywgQ2xhc3NFbnRpdHkgb3RoZXIpOwoKICBTZXQ8Q2xhc3NFbnRpdHk+IGdldENsYXNzZXNVc2VkSW5TdWJzdGl0dXRpb25zKFR5cGVDaGVja3MgY2hlY2tzKTsKCiAgc3RhdGljIGJvb2wgaGFzVHlwZUFyZ3VtZW50cyhEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IHR5cGU7CiAgICAgIHJldHVybiAhaW50ZXJmYWNlVHlwZS50cmVhdEFzUmF3OwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KfQqAjgBOTjwBKgEkIQFNDRo6JQEnHwE0Bh8qAU8CAUkhEhkWIwxIHAFAAQwXSQIBKhQqASgBRgEcMR0BHh0EATcBMQEMFiMEAgFQHDowAT4lAgFNLgRGSUxBFRgZIiMUAR8aHBcoKQEkGxwXKQE5GxsXASYbHCgpASoBDDxOMAIBSCtCAUQBRQEwISooBhIEAgE6cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9ydW50aW1lX3R5cGVzX2NvZGVnZW4uZGFydD9zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXNfbmV3LmRhcnTAAESFLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkganNfYmFja2VuZC5ydW50aW1lX3R5cGVzX25ldzsKCmltcG9ydCAncGFja2FnZTpqc19ydW50aW1lL3NoYXJlZC9yZWNpcGVfc3ludGF4LmRhcnQnOwoKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcKICAgIHNob3cgQ29tbW9uRWxlbWVudHMsIEpDb21tb25FbGVtZW50cywgSkVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqc0FzdDsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBzaG93IGpzOwppbXBvcnQgJy4uL2pzX21vZGVsL3R5cGVfcmVjaXBlLmRhcnQnOwppbXBvcnQgJy4uL2pzX2VtaXR0ZXIvanNfZW1pdHRlci5kYXJ0JyBzaG93IE1vZHVsYXJFbWl0dGVyOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JzsKaW1wb3J0ICduYW1lci5kYXJ0JzsKaW1wb3J0ICduYXRpdmVfZGF0YS5kYXJ0JzsKaW1wb3J0ICdydW50aW1lX3R5cGVzX2NvZGVnZW4uZGFydCcgc2hvdyBSdW50aW1lVHlwZXNTdWJzdGl0dXRpb25zOwppbXBvcnQgJ3J1bnRpbWVfdHlwZXNfcmVzb2x1dGlvbi5kYXJ0JyBzaG93IFJ1bnRpbWVUeXBlc05lZWQ7CgphYnN0cmFjdCBjbGFzcyBSZWNpcGVFbmNvZGVyIHsKICAvLy8gUmV0dXJucyBhIFtqc0FzdC5MaXRlcmFsXSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIFtyZWNpcGVdIHRvIGJlCiAgLy8vIGV2YWx1YXRlZCBhZ2FpbnN0IGEgdHlwZSBlbnZpcm9ubWVudCB3aXRoIHNoYXBlIFtzdHJ1Y3R1cmVdLgogIGpzQXN0LkxpdGVyYWwgZW5jb2RlUmVjaXBlKE1vZHVsYXJFbWl0dGVyIGVtaXR0ZXIsCiAgICAgIFR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZSBlbnZpcm9ubWVudFN0cnVjdHVyZSwgVHlwZVJlY2lwZSByZWNpcGUpOwoKICBqc0FzdC5MaXRlcmFsIGVuY29kZUdyb3VuZFJlY2lwZShNb2R1bGFyRW1pdHRlciBlbWl0dGVyLCBUeXBlUmVjaXBlIHJlY2lwZSk7CgogIC8vLyBSZXR1cm4gdGhlIHJlY2lwZSB3aXRoIHR5cGUgdmFyaWFibGVzIHJlcGxhY2VkIHdpdGggPGFueT4uIFRoaXMgaXMgYSBoYWNrCiAgLy8vIHVudGlsIERhcnRUeXBlIGNvbnRhaW5zIDxhbnk+IGFuZCB0aGUgcGFyYW1ldGVyIHN0dWIgZW1pdHRlciBpcyByZXBsYWNlZAogIC8vLyB3aXRoIGFuIFNTQSBwYXRoLgogIC8vIFRPRE8oMzM0MjIpOiBSZW1vdmUgbmVlZCBmb3IgdGhpcy4KICBqc0FzdC5MaXRlcmFsIGVuY29kZVJlY2lwZVdpdGhWYXJpYWJsZXNSZXBsYWNlQnlBbnkoCiAgICAgIE1vZHVsYXJFbWl0dGVyIGVtaXR0ZXIsIERhcnRUeXBlIGRhcnRUeXBlKTsKCiAgLy8vIENvbnZlcnRzIGEgcmVjaXBlIGludG8gYSBmcmFnbWVudCBvZiBjb2RlIHRoYXQgYWNjZXNzZXMgdGhlIGV2YWx1YXRlZAogIC8vLyByZWNpcGUuCiAgLy8gVE9ETygzMzQyMik6IFJlbW92ZSBuZWVkIGZvciB0aGlzIGJ5IHB1c2hpbmcgc3R1YnMgdGhyb3VnaCBTU0EuCiAganNBc3QuRXhwcmVzc2lvbiBldmFsdWF0ZVJlY2lwZShNb2R1bGFyRW1pdHRlciBlbWl0dGVyLCBqc0FzdC5MaXRlcmFsIHJlY2lwZSk7CgogIC8vIFRPRE8oc3JhKTogU3RpbGwgbmVlZCBhICRzaWduYXR1cmUgZnVuY3Rpb24gd2hlbiB0aGUgZnVuY3Rpb24gdHlwZSBpcyBhCiAgLy8gZnVuY3Rpb24gb2YgY2xvc2VkIHR5cGUgdmFyaWFibGVzLiBTZWUgaWYgdGhlICRzaWduYXR1cmUgbWV0aG9kIGNhbiBhbHdheXMKICAvLyBiZSBnZW5lcmF0ZWQgdGhyb3VnaCBTU0EgaW4gdGhvc2UgY2FzZXMuCiAganNBc3QuRXhwcmVzc2lvbiBlbmNvZGVTaWduYXR1cmUoTW9kdWxhck5hbWVyIG5hbWVyLCBNb2R1bGFyRW1pdHRlciBlbWl0dGVyLAogICAgICBEYXJ0VHlwZSB0eXBlLCBqc0FzdC5FeHByZXNzaW9uIHRoaXNfKTsKfQoKY2xhc3MgUmVjaXBlRW5jb2RlckltcGwgaW1wbGVtZW50cyBSZWNpcGVFbmNvZGVyIHsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnMgX3J0aVN1YnN0aXR1dGlvbnM7CiAgZmluYWwgTmF0aXZlQmFzaWNEYXRhIF9uYXRpdmVEYXRhOwogIGZpbmFsIEpFbGVtZW50RW52aXJvbm1lbnQgX2VsZW1lbnRFbnZpcm9ubWVudDsKICBmaW5hbCBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHM7CiAgZmluYWwgUnVudGltZVR5cGVzTmVlZCBfcnRpTmVlZDsKCiAgUmVjaXBlRW5jb2RlckltcGwodGhpcy5fY2xvc2VkV29ybGQsIHRoaXMuX3J0aVN1YnN0aXR1dGlvbnMsIHRoaXMuX25hdGl2ZURhdGEsCiAgICAgIHRoaXMuX2VsZW1lbnRFbnZpcm9ubWVudCwgdGhpcy5jb21tb25FbGVtZW50cywgdGhpcy5fcnRpTmVlZCk7CgogIEBvdmVycmlkZQogIGpzQXN0LkxpdGVyYWwgZW5jb2RlUmVjaXBlKE1vZHVsYXJFbWl0dGVyIGVtaXR0ZXIsCiAgICAgIFR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZSBlbnZpcm9ubWVudFN0cnVjdHVyZSwgVHlwZVJlY2lwZSByZWNpcGUpIHsKICAgIHJldHVybiBfUmVjaXBlR2VuZXJhdG9yKHRoaXMsIGVtaXR0ZXIsIGVudmlyb25tZW50U3RydWN0dXJlLCByZWNpcGUpLnJ1bigpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuTGl0ZXJhbCBlbmNvZGVHcm91bmRSZWNpcGUoTW9kdWxhckVtaXR0ZXIgZW1pdHRlciwgVHlwZVJlY2lwZSByZWNpcGUpIHsKICAgIHJldHVybiBfUmVjaXBlR2VuZXJhdG9yKHRoaXMsIGVtaXR0ZXIsIG51bGwsIHJlY2lwZSkucnVuKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5MaXRlcmFsIGVuY29kZVJlY2lwZVdpdGhWYXJpYWJsZXNSZXBsYWNlQnlBbnkoCiAgICAgIE1vZHVsYXJFbWl0dGVyIGVtaXR0ZXIsIERhcnRUeXBlIGRhcnRUeXBlKSB7CiAgICByZXR1cm4gX1JlY2lwZUdlbmVyYXRvcih0aGlzLCBlbWl0dGVyLCBudWxsLCBUeXBlRXhwcmVzc2lvblJlY2lwZShkYXJ0VHlwZSksCiAgICAgICAgICAgIGhhY2tUeXBlVmFyaWFibGVzVG9Bbnk6IHRydWUpCiAgICAgICAgLnJ1bigpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiBldmFsdWF0ZVJlY2lwZSgKICAgICAgTW9kdWxhckVtaXR0ZXIgZW1pdHRlciwganNBc3QuTGl0ZXJhbCByZWNpcGUpIHsKICAgIHJldHVybiBqcygnIygjKScsCiAgICAgICAgW2VtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoY29tbW9uRWxlbWVudHMuZmluZFR5cGUpLCByZWNpcGVdKTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gZW5jb2RlU2lnbmF0dXJlKE1vZHVsYXJOYW1lciBuYW1lciwgTW9kdWxhckVtaXR0ZXIgZW1pdHRlciwKICAgICAgRGFydFR5cGUgdHlwZSwganNBc3QuRXhwcmVzc2lvbiB0aGlzXykgewogICAgLy8gVE9ETyhzcmEpOiBUaGVzZSBpbnB1dHMgKHJlZmVyZW5jZWQgdG8gcXVlbGwgbGludHMpIGFyZSB1c2VkIGJ5IHRoZSBvbGQKICAgIC8vIHJ0aSBzaWduYXR1cmUgZ2VuZXJhdG9yLiBEbyB3ZSBuZWVkIHRoZW0/CiAgICBfcnRpTmVlZDsKICAgIGNvbW1vbkVsZW1lbnRzOwogICAgX2VsZW1lbnRFbnZpcm9ubWVudDsKICAgIHRocm93IFVuaW1wbGVtZW50ZWRFcnJvcignUmVjaXBlRW5jb2RlckltcGwuZ2V0U2lnbmF0dXJlRW5jb2RpbmcnKTsKICB9Cn0KCmNsYXNzIF9SZWNpcGVHZW5lcmF0b3IgaW1wbGVtZW50cyBEYXJ0VHlwZVZpc2l0b3I8dm9pZCwgdm9pZD4gewogIGZpbmFsIFJlY2lwZUVuY29kZXJJbXBsIF9lbmNvZGVyOwogIGZpbmFsIE1vZHVsYXJFbWl0dGVyIF9lbWl0dGVyOwogIGZpbmFsIFR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZSBfZW52aXJvbm1lbnQ7CiAgZmluYWwgVHlwZVJlY2lwZSBfcmVjaXBlOwogIGZpbmFsIGJvb2wgaGFja1R5cGVWYXJpYWJsZXNUb0FueTsKCiAgZmluYWwgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gZnVuY3Rpb25UeXBlVmFyaWFibGVzID0gW107CgogIC8vIEFjY3VtdWxhdGVkIHJlY2lwZS4KICBmaW5hbCBMaXN0PGpzQXN0LkxpdGVyYWw+IF9mcmFnbWVudHMgPSBbXTsKICBmaW5hbCBMaXN0PGludD4gX2NvZGVzID0gW107CgogIF9SZWNpcGVHZW5lcmF0b3IoCiAgICAgIHRoaXMuX2VuY29kZXIsIHRoaXMuX2VtaXR0ZXIsIHRoaXMuX2Vudmlyb25tZW50LCB0aGlzLl9yZWNpcGUsCiAgICAgIHt0aGlzLmhhY2tUeXBlVmFyaWFibGVzVG9BbnkgPSBmYWxzZX0pOwoKICBKQ2xvc2VkV29ybGQgZ2V0IF9jbG9zZWRXb3JsZCA9PiBfZW5jb2Rlci5fY2xvc2VkV29ybGQ7CiAgTmF0aXZlQmFzaWNEYXRhIGdldCBfbmF0aXZlRGF0YSA9PiBfZW5jb2Rlci5fbmF0aXZlRGF0YTsKICBSdW50aW1lVHlwZXNTdWJzdGl0dXRpb25zIGdldCBfcnRpU3Vic3RpdHV0aW9ucyA9PiBfZW5jb2Rlci5fcnRpU3Vic3RpdHV0aW9uczsKCiAganNBc3QuTGl0ZXJhbCBydW4oKSB7CiAgICBfc3RhcnQoX3JlY2lwZSk7CiAgICBhc3NlcnQoZnVuY3Rpb25UeXBlVmFyaWFibGVzLmlzRW1wdHkpOwogICAgaWYgKF9mcmFnbWVudHMuaXNFbXB0eSkgewogICAgICByZXR1cm4ganMuc3RyaW5nKFN0cmluZy5mcm9tQ2hhckNvZGVzKF9jb2RlcykpOwogICAgfQogICAgX2ZsdXNoQ29kZXMoKTsKICAgIGpzQXN0LkxpdGVyYWxTdHJpbmcgcXVvdGUgPSBqc0FzdC5MaXRlcmFsU3RyaW5nKCciJyk7CiAgICByZXR1cm4ganNBc3QuU3RyaW5nQ29uY2F0ZW5hdGlvbihbcXVvdGUsIC4uLl9mcmFnbWVudHMsIHF1b3RlXSk7CiAgfQoKICB2b2lkIF9zdGFydChUeXBlUmVjaXBlIHJlY2lwZSkgewogICAgaWYgKHJlY2lwZSBpcyBUeXBlRXhwcmVzc2lvblJlY2lwZSkgewogICAgICB2aXNpdChyZWNpcGUudHlwZSwgbnVsbCk7CiAgICB9IGVsc2UgaWYgKHJlY2lwZSBpcyBTaW5nbGV0b25UeXBlRW52aXJvbm1lbnRSZWNpcGUpIHsKICAgICAgdmlzaXQocmVjaXBlLnR5cGUsIG51bGwpOwogICAgfSBlbHNlIGlmIChyZWNpcGUgaXMgRnVsbFR5cGVFbnZpcm9ubWVudFJlY2lwZSkgewogICAgICBfc3RhcnRGdWxsVHlwZUVudmlyb25tZW50UmVjaXBlKHJlY2lwZSwgbnVsbCk7CiAgICB9CiAgfQoKICB2b2lkIF9zdGFydEZ1bGxUeXBlRW52aXJvbm1lbnRSZWNpcGUoRnVsbFR5cGVFbnZpcm9ubWVudFJlY2lwZSByZWNpcGUsIF8pIHsKICAgIGlmIChyZWNpcGUuY2xhc3NUeXBlID09IG51bGwpIHsKICAgICAgX2VtaXRDb2RlKFJlY2lwZS5wdXNoRHluYW1pYyk7CiAgICAgIGFzc2VydChyZWNpcGUudHlwZXMuaXNOb3RFbXB0eSk7CiAgICB9IGVsc2UgewogICAgICB2aXNpdChyZWNpcGUuY2xhc3NUeXBlLCBudWxsKTsKICAgICAgLy8gVE9ETyhzcmEpOiBUaGUgc2VwYXJhdG9yIGNhbiBiZSBvbWl0dGVkIHdoZW4gdGhlIHBhcnNlciB3aWxsIGhhdmUKICAgICAgLy8gcmVkdWNlZCB0byB0aGUgdG9wIG9mIHN0YWNrIHRvIGFuIFJ0aSB2YWx1ZS4KICAgICAgX2VtaXRDb2RlKFJlY2lwZS50b1R5cGUpOwogICAgfQoKICAgIGlmIChyZWNpcGUudHlwZXMuaXNOb3RFbXB0eSkgewogICAgICBfZW1pdENvZGUoUmVjaXBlLnN0YXJ0VHlwZUFyZ3VtZW50cyk7CiAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gcmVjaXBlLnR5cGVzKSB7CiAgICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgICAgX2VtaXRDb2RlKFJlY2lwZS5zZXBhcmF0b3IpOwogICAgICAgIH0KICAgICAgICB2aXNpdCh0eXBlLCBfKTsKICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICB9CiAgICAgIF9lbWl0Q29kZShSZWNpcGUuZW5kVHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgfQoKICB2b2lkIF9lbWl0Q29kZShpbnQgY29kZSkgewogICAgLy8gVE9ETyhzcmEpOiBXZSBzaG91bGQgcGVybWl0IGNvZGVzIHdpdGggc2hvcnQgZXNjYXBlcyAobGlrZSAnXG4nKSBmb3IKICAgIC8vIGluZnJlcXVlbnQgb3BlcmF0b3JzLgogICAgYXNzZXJ0KGNvZGUgPj0gMHgyMCAmJiBjb2RlIDw9IDB4N0UgJiYgY29kZSAhPSAweDIyKTsKICAgIF9jb2Rlcy5hZGQoY29kZSk7CiAgfQoKICB2b2lkIF9mbHVzaENvZGVzKCkgewogICAgaWYgKF9jb2Rlcy5pc0VtcHR5KSByZXR1cm47CiAgICAvLyBUT0RPKHNyYSk6IGNvZGVzIG5lZWQgc29tZSBlc2NhcGluZy4KICAgIF9mcmFnbWVudHMuYWRkKFN0cmluZ0JhY2tlZE5hbWUoU3RyaW5nLmZyb21DaGFyQ29kZXMoX2NvZGVzKSkpOwogICAgX2NvZGVzLmNsZWFyKCk7CiAgfQoKICB2b2lkIF9lbWl0SW50ZWdlcihpbnQgdmFsdWUpIHsKICAgIGlmIChfY29kZXMuaXNFbXB0eSA/IF9mcmFnbWVudHMuaXNOb3RFbXB0eSA6IFJlY2lwZS5pc0RpZ2l0KF9jb2Rlcy5sYXN0KSkgewogICAgICBfZW1pdENvZGUoUmVjaXBlLnNlcGFyYXRvcik7CiAgICB9CiAgICBfZW1pdFN0cmluZ1VuZXNjYXBlZCgnJHZhbHVlJyk7CiAgfQoKICB2b2lkIF9lbWl0U3RyaW5nVW5lc2NhcGVkKFN0cmluZyBzdHJpbmcpIHsKICAgIGZvciAoaW50IGNvZGUgaW4gc3RyaW5nLmNvZGVVbml0cykgewogICAgICBfZW1pdENvZGUoY29kZSk7CiAgICB9CiAgfQoKICB2b2lkIF9lbWl0TmFtZShqc0FzdC5OYW1lIG5hbWUpIHsKICAgIGlmIChfZnJhZ21lbnRzLmlzTm90RW1wdHkgJiYgX2NvZGVzLmlzRW1wdHkpIHsKICAgICAgX2VtaXRDb2RlKFJlY2lwZS5zZXBhcmF0b3IpOwogICAgfQogICAgX2ZsdXNoQ29kZXMoKTsKICAgIF9mcmFnbWVudHMuYWRkKG5hbWUpOwogIH0KCiAgdm9pZCBfZW1pdEV4dGVuc2lvbk9wKGludCB2YWx1ZSkgewogICAgX2VtaXRJbnRlZ2VyKHZhbHVlKTsKICAgIF9lbWl0Q29kZShSZWNpcGUuZXh0ZW5zaW9uT3ApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdChEYXJ0VHlwZSB0eXBlLCBfKSA9PiB0eXBlLmFjY2VwdCh0aGlzLCBfKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVWYXJpYWJsZVR5cGUoVHlwZVZhcmlhYmxlVHlwZSB0eXBlLCBfKSB7CiAgICBpZiAoaGFja1R5cGVWYXJpYWJsZXNUb0FueSkgewogICAgICAvLyBFbWl0ICdhbnknIHR5cGUuCiAgICAgIF9lbWl0RXh0ZW5zaW9uT3AoUmVjaXBlLnB1c2hBbnlFeHRlbnNpb24pOwogICAgICByZXR1cm47CiAgICB9CgogICAgVHlwZUVudmlyb25tZW50U3RydWN0dXJlIGVudmlyb25tZW50ID0gX2Vudmlyb25tZW50OwogICAgaWYgKGVudmlyb25tZW50IGlzIFNpbmdsZXRvblR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZSkgewogICAgICBpZiAodHlwZSA9PSBlbnZpcm9ubWVudC52YXJpYWJsZSkgewogICAgICAgIF9lbWl0SW50ZWdlcigwKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIGlmIChlbnZpcm9ubWVudCBpcyBGdWxsVHlwZUVudmlyb25tZW50U3RydWN0dXJlKSB7CiAgICAgIGludCBpID0gZW52aXJvbm1lbnQuYmluZGluZ3MuaW5kZXhPZih0eXBlKTsKICAgICAgaWYgKGkgPj0gMCkgewogICAgICAgIC8vIEluZGV4ZXMgYXJlIDEtYmFzZWQgc2luY2UgJzAnIGVuY29kZXMgdXNpbmcgdGhlIGVudGlyZSB0eXBlIGZvciB0aGUKICAgICAgICAvLyBzaW5nbGV0b24gc3RydWN0dXJlLgogICAgICAgIF9lbWl0SW50ZWdlcihpICsgMSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpbnQgaW5kZXggPSBfaW5kZXhJbnRvQ2xhc3NUeXBlVmFyaWFibGVzKHR5cGUpOwogICAgICBpZiAoaW5kZXggIT0gbnVsbCkgewogICAgICAgIC8vIEluZGV4ZWQgY2xhc3MgdHlwZSB2YXJpYWJsZXMgY29tZSBhZnRlciB0aGUgYm91bmQgZnVuY3Rpb24gdHlwZQogICAgICAgIC8vIHZhcmlhYmxlcy4KICAgICAgICBfZW1pdEludGVnZXIoMSArIGVudmlyb25tZW50LmJpbmRpbmdzLmxlbmd0aCArIGluZGV4KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAganNBc3QuTmFtZSBuYW1lID0gX2VtaXR0ZXIudHlwZVZhcmlhYmxlQWNjZXNzTmV3UnRpKHR5cGUuZWxlbWVudCk7CiAgICAgIF9lbWl0TmFtZShuYW1lKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gVE9ETyhzcmEpOiBIYW5kbGUgbWlzc2luZyBjYXNlcy4gVGhpcyBqdXN0IGVtaXRzIHNvbWUgcmVhZGFibGUganVuay4gVGhlCiAgICAvLyBiYWNrdGlja3MgZW5zdXJlIGl0IHdvbid0IHBhcnNlIGF0IHJ1bnRpbWUuCiAgICAnYCR0eXBlYCcuY29kZVVuaXRzLmZvckVhY2goX2VtaXRDb2RlKTsKICB9CgogIGludCAvKj8qLyBfaW5kZXhJbnRvQ2xhc3NUeXBlVmFyaWFibGVzKFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGUpIHsKICAgIFR5cGVWYXJpYWJsZUVudGl0eSBlbGVtZW50ID0gdmFyaWFibGUuZWxlbWVudDsKICAgIENsYXNzRW50aXR5IGNscyA9IGVsZW1lbnQudHlwZURlY2xhcmF0aW9uOwoKICAgIC8vIFRPRE8oc3JhKTogV2UgbWlnaHQgYmUgaW4gYSBjb250ZXh0IHdoZXJlIHRoZSBjbGFzcyB0eXBlIHZhcmlhYmxlIGhhcyBhbgogICAgLy8gaW5kZXgsIGV2ZW4gdGhvdWdoIGluIHRoZSBnZW5lcmFsIGNhc2UgaXQgaXMgbm90IGF0IGEgc3BlY2lmaWMgaW5kZXguCgogICAgaWYgKF9jbG9zZWRXb3JsZC5pc1VzZWRBc01peGluKGNscykpIHJldHVybiBudWxsOwoKICAgIENsYXNzSGllcmFyY2h5IGNsYXNzSGllcmFyY2h5ID0gX2Nsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5OwogICAgaWYgKGNsYXNzSGllcmFyY2h5LmFueVN0cmljdFN1YmNsYXNzT2YoY2xzLCAoQ2xhc3NFbnRpdHkgc3ViY2xhc3MpIHsKICAgICAgcmV0dXJuICFfcnRpU3Vic3RpdHV0aW9ucy5pc1RyaXZpYWxTdWJzdGl0dXRpb24oc3ViY2xhc3MsIGNscyk7CiAgICB9KSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBlbGVtZW50LmluZGV4OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZ1bmN0aW9uVHlwZVZhcmlhYmxlKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHR5cGUsIF8pIHsKICAgIGludCBwb3NpdGlvbiA9IGZ1bmN0aW9uVHlwZVZhcmlhYmxlcy5pbmRleE9mKHR5cGUpOwogICAgYXNzZXJ0KHBvc2l0aW9uID49IDApOwogICAgLy8gU2VlIFt2aXNpdEZ1bmN0aW9uVHlwZV0gZm9yIGV4cGxhbmF0aW9uLgogICAgX2VtaXRJbnRlZ2VyKGZ1bmN0aW9uVHlwZVZhcmlhYmxlcy5sZW5ndGggLSBwb3NpdGlvbiAtIDEpOwogICAgX2VtaXRDb2RlKFJlY2lwZS5nZW5lcmljRnVuY3Rpb25UeXBlUGFyYW1ldGVySW5kZXgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIHR5cGUsIF8pIHsKICAgIF9lbWl0Q29kZShSZWNpcGUucHVzaER5bmFtaWMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlLCBfKSB7CiAgICBqc0FzdC5OYW1lIG5hbWUgPSBfZW1pdHRlci50eXBlQWNjZXNzTmV3UnRpKHR5cGUuZWxlbWVudCk7CiAgICBpZiAodHlwZS50eXBlQXJndW1lbnRzLmlzRW1wdHkpIHsKICAgICAgLy8gUHVzaCB0aGUgbmFtZSwgd2hpY2ggaXMgbGF0ZXIgY29udmVydGVkIGJ5IGFuIGltcGxpY2l0IHRvVHlwZQogICAgICAvLyBvcGVyYXRpb24uCiAgICAgIF9lbWl0TmFtZShuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIF9lbWl0TmFtZShuYW1lKTsKICAgICAgX2VtaXRDb2RlKFJlY2lwZS5zdGFydFR5cGVBcmd1bWVudHMpOwogICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICAgZm9yIChEYXJ0VHlwZSBhcmd1bWVudFR5cGUgaW4gdHlwZS50eXBlQXJndW1lbnRzKSB7CiAgICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgICAgX2VtaXRDb2RlKFJlY2lwZS5zZXBhcmF0b3IpOwogICAgICAgIH0KICAgICAgICBpZiAoX25hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyh0eXBlLmVsZW1lbnQpKSB7CiAgICAgICAgICAvLyBFbWl0ICdhbnknIHR5cGUuCiAgICAgICAgICBfZW1pdEV4dGVuc2lvbk9wKFJlY2lwZS5wdXNoQW55RXh0ZW5zaW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmlzaXQoYXJndW1lbnRUeXBlLCBfKTsKICAgICAgICB9CiAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgfQogICAgICBfZW1pdENvZGUoUmVjaXBlLmVuZFR5cGVBcmd1bWVudHMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgdHlwZSwgXykgewogICAgaWYgKHR5cGUudHlwZVZhcmlhYmxlcy5pc05vdEVtcHR5KSB7CiAgICAgIC8vIEVudGVyIGdlbmVyaWMgZnVuY3Rpb24gc2NvcGUuCiAgICAgIC8vCiAgICAgIC8vIEZ1bmN0aW9uIHR5cGUgdmFyaWFibGVzIGFyZSBlbmNvZGVkIGFzIGEgbW9kaWZpZWQgZGUgQnJ1aW4gaW5kZXguIFdlCiAgICAgIC8vIGNvdW50IHZhcmlhYmxlcyBmcm9tIHRoZSBjdXJyZW50IHNjb3BlIG91dHdhcmRzLCBjb3VudGluZyB0aGUgdmFyaWFibGVzCiAgICAgIC8vIGluIHRoZSBzYW1lIHNjb3BlIGxlZnQtdG8tcmlnaHQuCiAgICAgIC8vCiAgICAgIC8vIElmIHdlIHB1c2ggdGhlIGN1cnJlbnQgc2NvcGUncyB2YXJpYWJsZXMgaW4gcmV2ZXJzZSwgdGhlbiB0aGUgaW5kZXggaXMKICAgICAgLy8gdGhlIHBvc2l0aW9uIG1lYXN1cmVkIGZyb20gdGhlIGVuZC4KICAgICAgLy8KICAgICAgLy8gICAgZm9vPEFBLEJCPigpID0+IC4uLgogICAgICAvLyAgICAgIC8vXjAgXjEKICAgICAgLy8gICAgZnVuY3Rpb25UeXBlVmFyaWFibGVzOiBbQkIsQUFdCiAgICAgIC8vCiAgICAgIC8vICAgIGZvbzxBQSxCQj4oKSA9PiA8VVUsVlYsV1c+KCkgPT4gLi4uCiAgICAgIC8vICAgICAgICBeMyBeNCAgICAgICAgXjAgXjEgXjIKICAgICAgLy8gICAgZnVuY3Rpb25UeXBlVmFyaWFibGVzOiBbQkIsQUEsV1csVlYsVVVdCiAgICAgIC8vCiAgICAgIGZvciAoRnVuY3Rpb25UeXBlVmFyaWFibGUgdmFyaWFibGUgaW4gdHlwZS50eXBlVmFyaWFibGVzLnJldmVyc2VkKSB7CiAgICAgICAgZnVuY3Rpb25UeXBlVmFyaWFibGVzLmFkZCh2YXJpYWJsZSk7CiAgICAgIH0KICAgIH0KCiAgICB2aXNpdCh0eXBlLnJldHVyblR5cGUsIF8pOwogICAgX2VtaXRDb2RlKFJlY2lwZS5zdGFydEZ1bmN0aW9uQXJndW1lbnRzKTsKCiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGZvciAoRGFydFR5cGUgcGFyYW1ldGVyVHlwZSBpbiB0eXBlLnBhcmFtZXRlclR5cGVzKSB7CiAgICAgIGlmICghZmlyc3QpIHsKICAgICAgICBfZW1pdENvZGUoUmVjaXBlLnNlcGFyYXRvcik7CiAgICAgIH0KICAgICAgdmlzaXQocGFyYW1ldGVyVHlwZSwgXyk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CgogICAgaWYgKHR5cGUub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcy5pc05vdEVtcHR5KSB7CiAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgX2VtaXRDb2RlKFJlY2lwZS5zdGFydE9wdGlvbmFsR3JvdXApOwogICAgICBmb3IgKERhcnRUeXBlIHBhcmFtZXRlclR5cGUgaW4gdHlwZS5vcHRpb25hbFBhcmFtZXRlclR5cGVzKSB7CiAgICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgICAgX2VtaXRDb2RlKFJlY2lwZS5zZXBhcmF0b3IpOwogICAgICAgIH0KICAgICAgICB2aXNpdChwYXJhbWV0ZXJUeXBlLCBfKTsKICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICB9CiAgICAgIF9lbWl0Q29kZShSZWNpcGUuZW5kT3B0aW9uYWxHcm91cCk7CiAgICB9CgogICAgdm9pZCBlbWl0TmFtZWRHcm91cChMaXN0PFN0cmluZz4gbmFtZXMsIExpc3Q8RGFydFR5cGU+IHR5cGVzKSB7CiAgICAgIGFzc2VydChuYW1lcy5sZW5ndGggPT0gdHlwZXMubGVuZ3RoKTsKICAgICAgZmlyc3QgPSB0cnVlOwogICAgICBfZW1pdENvZGUoUmVjaXBlLnN0YXJ0TmFtZWRHcm91cCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoIWZpcnN0KSB7CiAgICAgICAgICBfZW1pdENvZGUoUmVjaXBlLnNlcGFyYXRvcik7CiAgICAgICAgfQogICAgICAgIF9lbWl0U3RyaW5nVW5lc2NhcGVkKG5hbWVzW2ldKTsKICAgICAgICBfZW1pdENvZGUoUmVjaXBlLm5hbWVTZXBhcmF0b3IpOwogICAgICAgIHZpc2l0KHR5cGVzW2ldLCBfKTsKICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICB9CiAgICAgIF9lbWl0Q29kZShSZWNpcGUuZW5kTmFtZWRHcm91cCk7CiAgICB9CgogICAgLy8gVE9ETyhzcmEpOiBUaGVzZSBhcmUgb3B0aW9uYWwgbmFtZWQgcGFyYW1ldGVycy4gSGFuZGxlIHJlcXVpcmVkIG5hbWVkCiAgICAvLyBwYXJhbWV0ZXJzIHRoZSBzYW1lIHdheSB3aGVuIHRoZXkgYXJlIGltcGxlbWVudGVkLgogICAgaWYgKHR5cGUubmFtZWRQYXJhbWV0ZXJUeXBlcy5pc05vdEVtcHR5KSB7CiAgICAgIGVtaXROYW1lZEdyb3VwKHR5cGUubmFtZWRQYXJhbWV0ZXJzLCB0eXBlLm5hbWVkUGFyYW1ldGVyVHlwZXMpOwogICAgfQoKICAgIF9lbWl0Q29kZShSZWNpcGUuZW5kRnVuY3Rpb25Bcmd1bWVudHMpOwoKICAgIC8vIEVtaXQgZ2VuZXJpYyB0eXBlIGJvdW5kcy4KICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMuaXNOb3RFbXB0eSkgewogICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICAgX2VtaXRDb2RlKFJlY2lwZS5zdGFydFR5cGVBcmd1bWVudHMpOwogICAgICBmb3IgKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSBpbiB0eXBlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgICBpZiAoIWZpcnN0KSB7CiAgICAgICAgICBfZW1pdENvZGUoUmVjaXBlLnNlcGFyYXRvcik7CiAgICAgICAgfQogICAgICAgIHZpc2l0KHR5cGVWYXJpYWJsZS5ib3VuZCwgXyk7CiAgICAgIH0KICAgICAgX2VtaXRDb2RlKFJlY2lwZS5lbmRUeXBlQXJndW1lbnRzKTsKICAgIH0KCiAgICBpZiAodHlwZS50eXBlVmFyaWFibGVzLmlzTm90RW1wdHkpIHsKICAgICAgLy8gRXhpdCBnZW5lcmljIGZ1bmN0aW9uIHNjb3BlLiBSZW1vdmUgdGhlIHR5cGUgdmFyaWFibGVzIHB1c2hlZCBhdCBlbnRyeS4KICAgICAgZnVuY3Rpb25UeXBlVmFyaWFibGVzLmxlbmd0aCAtPSB0eXBlLnR5cGVWYXJpYWJsZXMubGVuZ3RoOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZvaWRUeXBlKFZvaWRUeXBlIHR5cGUsIF8pIHsKICAgIF9lbWl0Q29kZShSZWNpcGUucHVzaFZvaWQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIHR5cGUsIF8pIHsKICAgIHZpc2l0KHR5cGUudW5hbGlhc2VkLCBfKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdXR1cmVPclR5cGUoRnV0dXJlT3JUeXBlIHR5cGUsIF8pIHsKICAgIHZpc2l0KHR5cGUudHlwZUFyZ3VtZW50LCBfKTsKICAgIF9lbWl0Q29kZShSZWNpcGUud3JhcEZ1dHVyZU9yKTsKICB9Cn0KCmNsYXNzIFJ1bGVzZXRFbmNvZGVyIHsKICBmaW5hbCBEYXJ0VHlwZXMgX2RhcnRUeXBlczsKICBmaW5hbCBNb2R1bGFyRW1pdHRlciBfZW1pdHRlcjsKICBmaW5hbCBSZWNpcGVFbmNvZGVyIF9yZWNpcGVFbmNvZGVyOwoKICBSdWxlc2V0RW5jb2Rlcih0aGlzLl9kYXJ0VHlwZXMsIHRoaXMuX2VtaXR0ZXIsIHRoaXMuX3JlY2lwZUVuY29kZXIpOwoKICBDb21tb25FbGVtZW50cyBnZXQgX2NvbW1vbkVsZW1lbnRzID0+IF9kYXJ0VHlwZXMuY29tbW9uRWxlbWVudHM7CiAgQ2xhc3NFbnRpdHkgZ2V0IF9vYmplY3RDbGFzcyA9PiBfY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3M7CgogIGZpbmFsIF9sZWZ0QnJhY2UgPSBqcy5zdHJpbmdQYXJ0KCd7Jyk7CiAgZmluYWwgX3JpZ2h0QnJhY2UgPSBqcy5zdHJpbmdQYXJ0KCd9Jyk7CiAgZmluYWwgX2xlZnRCcmFja2V0ID0ganMuc3RyaW5nUGFydCgnWycpOwogIGZpbmFsIF9yaWdodEJyYWNrZXQgPSBqcy5zdHJpbmdQYXJ0KCddJyk7CiAgZmluYWwgX2NvbG9uID0ganMuc3RyaW5nUGFydCgnOicpOwogIGZpbmFsIF9jb21tYSA9IGpzLnN0cmluZ1BhcnQoJywnKTsKICBmaW5hbCBfcXVvdGUgPSBqcy5zdHJpbmdQYXJ0KCInIik7CgogIGJvb2wgX2lzT2JqZWN0KEludGVyZmFjZVR5cGUgdHlwZSkgPT4gaWRlbnRpY2FsKHR5cGUuZWxlbWVudCwgX29iamVjdENsYXNzKTsKCiAgLy8gVE9ETyhmaXNoeXRoZWZpc2gpOiBDb21tb24gc3Vic3RyaW5nIGVsaW1pbmF0aW9uLgoKICAvLy8gUHJvZHVjZXMgYSBzdHJpbmcgcmVhZGFibGUgYnkgYEpTT04ucGFyc2UoKWAuCiAganNBc3QuU3RyaW5nQ29uY2F0ZW5hdGlvbiBlbmNvZGVSdWxlc2V0KAogICAgICAgICAgTWFwPEludGVyZmFjZVR5cGUsIEl0ZXJhYmxlPEludGVyZmFjZVR5cGU+PiBydWxlc2V0KSA9PgogICAgICBqcy5jb25jYXRlbmF0ZVN0cmluZ3MoWwogICAgICAgIF9xdW90ZSwKICAgICAgICBfbGVmdEJyYWNlLAogICAgICAgIC4uLmpzLmpvaW5MaXRlcmFscygKICAgICAgICAgICAgcnVsZXNldC5lbnRyaWVzCiAgICAgICAgICAgICAgICAud2hlcmUoKGVudHJ5KSA9PiAhX2lzT2JqZWN0KGVudHJ5LmtleSkpCiAgICAgICAgICAgICAgICAubWFwKChlbnRyeSkgPT4gX2VuY29kZVJ1bGUoZW50cnkua2V5LCBlbnRyeS52YWx1ZSkpLAogICAgICAgICAgICBfY29tbWEpLAogICAgICAgIF9yaWdodEJyYWNlLAogICAgICAgIF9xdW90ZSwKICAgICAgXSk7CgogIGpzQXN0LlN0cmluZ0NvbmNhdGVuYXRpb24gX2VuY29kZVJ1bGUoCiAgICAgICAgICBJbnRlcmZhY2VUeXBlIHRhcmdldFR5cGUsIEl0ZXJhYmxlPEludGVyZmFjZVR5cGU+IHN1cGVydHlwZXMpID0+CiAgICAgIGpzLmNvbmNhdGVuYXRlU3RyaW5ncyhbCiAgICAgICAganMucXVvdGVOYW1lKF9lbWl0dGVyLnR5cGVBY2Nlc3NOZXdSdGkodGFyZ2V0VHlwZS5lbGVtZW50KSksCiAgICAgICAgX2NvbG9uLAogICAgICAgIF9sZWZ0QnJhY2UsCiAgICAgICAgLi4uanMuam9pbkxpdGVyYWxzKAogICAgICAgICAgICBzdXBlcnR5cGVzCiAgICAgICAgICAgICAgICAud2hlcmUoKEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlKSA9PiAhX2lzT2JqZWN0KHN1cGVydHlwZSkpCiAgICAgICAgICAgICAgICAubWFwKChJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSkgPT4KICAgICAgICAgICAgICAgICAgICBfZW5jb2RlU3VwZXJ0eXBlKHRhcmdldFR5cGUsIHN1cGVydHlwZSkpLAogICAgICAgICAgICBfY29tbWEpLAogICAgICAgIF9yaWdodEJyYWNlLAogICAgICBdKTsKCiAganNBc3QuU3RyaW5nQ29uY2F0ZW5hdGlvbiBfZW5jb2RlU3VwZXJ0eXBlKAogICAgICAgICAgSW50ZXJmYWNlVHlwZSB0YXJnZXRUeXBlLCBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSkgPT4KICAgICAganMuY29uY2F0ZW5hdGVTdHJpbmdzKGpzLmpvaW5MaXRlcmFscyhbCiAgICAgICAgX2VuY29kZVN1cGVydHlwZUludGVyZmFjZSh0YXJnZXRUeXBlLCBzdXBlcnR5cGUpLAogICAgICAgIC4uLl9lbmNvZGVTdXBlcnR5cGVUeXBlVmFyaWFibGVzKHRhcmdldFR5cGUsIHN1cGVydHlwZSksCiAgICAgIF0sIF9jb21tYSkpOwoKICBqc0FzdC5TdHJpbmdDb25jYXRlbmF0aW9uIF9lbmNvZGVTdXBlcnR5cGVJbnRlcmZhY2UoCiAgICAgICAgICBJbnRlcmZhY2VUeXBlIHRhcmdldFR5cGUsIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlKSA9PgogICAgICBqcy5jb25jYXRlbmF0ZVN0cmluZ3MoWwogICAgICAgIGpzLnF1b3RlTmFtZShfZW1pdHRlci50eXBlQWNjZXNzTmV3UnRpKHN1cGVydHlwZS5lbGVtZW50KSksCiAgICAgICAgX2NvbG9uLAogICAgICAgIF9sZWZ0QnJhY2tldCwKICAgICAgICAuLi5qcy5qb2luTGl0ZXJhbHMoCiAgICAgICAgICAgIHN1cGVydHlwZS50eXBlQXJndW1lbnRzLm1hcCgoRGFydFR5cGUgc3VwZXJ0eXBlQXJndW1lbnQpID0+CiAgICAgICAgICAgICAgICBfZW5jb2RlU3VwZXJ0eXBlQXJndW1lbnQodGFyZ2V0VHlwZSwgc3VwZXJ0eXBlQXJndW1lbnQpKSwKICAgICAgICAgICAgX2NvbW1hKSwKICAgICAgICBfcmlnaHRCcmFja2V0LAogICAgICBdKTsKCiAgTGlzdDxqc0FzdC5TdHJpbmdDb25jYXRlbmF0aW9uPiBfZW5jb2RlU3VwZXJ0eXBlVHlwZVZhcmlhYmxlcygKICAgICAgSW50ZXJmYWNlVHlwZSB0YXJnZXRUeXBlLCBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSkgewogICAgSW50ZXJmYWNlVHlwZSB0aGlzU3VwZXJ0eXBlID0gX2RhcnRUeXBlcy5nZXRUaGlzVHlwZShzdXBlcnR5cGUuZWxlbWVudCk7CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlVmFyaWFibGVzID0gdGhpc1N1cGVydHlwZS50eXBlQXJndW1lbnRzOwogICAgTGlzdDxEYXJ0VHlwZT4gc3VwZXJ0eXBlQXJndW1lbnRzID0gc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHM7CiAgICBpbnQgbGVuZ3RoID0gdHlwZVZhcmlhYmxlcy5sZW5ndGg7CiAgICBhc3NlcnQoc3VwZXJ0eXBlQXJndW1lbnRzLmxlbmd0aCA9PSBsZW5ndGgpOwogICAgTGlzdDxqc0FzdC5TdHJpbmdDb25jYXRlbmF0aW9uPiByZXN1bHQgPSBMaXN0KGxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIERhcnRUeXBlIHR5cGVWYXJpYWJsZSA9IHR5cGVWYXJpYWJsZXNbaV07CiAgICAgIGFzc2VydCh0eXBlVmFyaWFibGUuaXNUeXBlVmFyaWFibGUpOwogICAgICB0eXBlVmFyaWFibGUuZm9yRWFjaFR5cGVWYXJpYWJsZSgoVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUpIHsKICAgICAgICByZXN1bHRbaV0gPSBfZW5jb2RlU3VwZXJ0eXBlVHlwZVZhcmlhYmxlKAogICAgICAgICAgICB0YXJnZXRUeXBlLCB0eXBlVmFyaWFibGUsIHN1cGVydHlwZUFyZ3VtZW50c1tpXSk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGpzQXN0LlN0cmluZ0NvbmNhdGVuYXRpb24gX2VuY29kZVN1cGVydHlwZVR5cGVWYXJpYWJsZSgKICAgICAgICAgIEludGVyZmFjZVR5cGUgdGFyZ2V0VHlwZSwKICAgICAgICAgIFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlLAogICAgICAgICAgRGFydFR5cGUgc3VwZXJ0eXBlQXJndW1lbnQpID0+CiAgICAgIGpzLmNvbmNhdGVuYXRlU3RyaW5ncyhbCiAgICAgICAganMucXVvdGVOYW1lKF9lbWl0dGVyLnR5cGVWYXJpYWJsZUFjY2Vzc05ld1J0aSh0eXBlVmFyaWFibGUuZWxlbWVudCkpLAogICAgICAgIF9jb2xvbiwKICAgICAgICBfZW5jb2RlU3VwZXJ0eXBlQXJndW1lbnQodGFyZ2V0VHlwZSwgc3VwZXJ0eXBlQXJndW1lbnQpLAogICAgICBdKTsKCiAganNBc3QuTGl0ZXJhbCBfZW5jb2RlU3VwZXJ0eXBlQXJndW1lbnQoCiAgICAgIEludGVyZmFjZVR5cGUgdGFyZ2V0VHlwZSwgRGFydFR5cGUgc3VwZXJ0eXBlQXJndW1lbnQpIHsKICAgIFR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZSBlbnZpcm9ubWVudCA9CiAgICAgICAgRnVsbFR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZShjbGFzc1R5cGU6IHRhcmdldFR5cGUpOwogICAgVHlwZVJlY2lwZSByZWNpcGUgPSBUeXBlRXhwcmVzc2lvblJlY2lwZShzdXBlcnR5cGVBcmd1bWVudCk7CiAgICByZXR1cm4gX3JlY2lwZUVuY29kZXIuZW5jb2RlUmVjaXBlKF9lbWl0dGVyLCBlbnZpcm9ubWVudCwgcmVjaXBlKTsKICB9Cn0KghEATk48ASYBNwEhPyQhISAnPCsYFRtEPgEfRkM1SQFPAVBPGCg3MgFMDkVRAU1QLk8uAgEzIzUlMSgjAVFFAQw1SlAEAQxQQAQBDDczUSoQBAEMIzYWSgQBDE8vTzEOFBlIBAIBQCQhLxwlAT8BGS0fARRFLgE6O1EBGBUrHjYGEzpFBAEjKiA7IDY1BgQBTiQlJw0lSzYgBgEjLBksFicKGBcIKgYEAR1MHToWBAEXICxEFAQBIVAjBiQEAS0pFwYEASQzIwYTGgQBJRkjBAEMOAEMOSIaMQ4GATk8KhkQCAY3MhRPIB0QCAE2G0sWPxAISRcOBlAzLAQBRjMvAVBNATYBQUlGChMGGgQBDEE4GzA/OQQBDC8jBAEMMz8mRxQXDRcsGToWJwo6HjURIgoXCCoGBAEMMSknCU5RKglQLQkgFisJMCY0CUstCAYBHy4BFzoUJQgfFQYBMhQsRBYnCiEXCCoGAUQsFCkvFicKKCkcFwgnBgFNOi9GBgEsASEpGSxGFicKJggqBgEpUUEGBAEMKSAEAQwvHgQBDDEhJAQCARceISYBRwFDPwEpKissJSUlAU8BNwE0K0IeEBQcHDlGFRUQCgEpSx5FEBQcF0syPhUVCgEuQC46QRMBN0AeRBAWHEhKFRcKAUE7TUBBJzE7JzArSTI+CgYTBAE6JCkpHk8QQQoBKj4rPUFHBAIBNnBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvcnVudGltZV90eXBlc19uZXcuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy91bml2ZXJzZS9zaWRlX2VmZmVjdHMuZGFydKE+Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdW5pdmVyc2Uuc2lkZV9lZmZlY3RzOwoKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CgpjbGFzcyBTaWRlRWZmZWN0cyB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtTaWRlRWZmZWN0c10gb2JqZWN0cyBpbiBhIGRlYnVnZ2luZwogIC8vLyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdzaWRlLWVmZmVjdHMnOwoKICAvLyBDaGFuZ2VzIGZsYWdzLgogIHN0YXRpYyBjb25zdCBpbnQgRkxBR19DSEFOR0VTX0lOREVYID0gMDsKICBzdGF0aWMgY29uc3QgaW50IEZMQUdfQ0hBTkdFU19JTlNUQU5DRV9QUk9QRVJUWSA9IEZMQUdfQ0hBTkdFU19JTkRFWCArIDE7CiAgc3RhdGljIGNvbnN0IGludCBGTEFHX0NIQU5HRVNfU1RBVElDX1BST1BFUlRZID0KICAgICAgRkxBR19DSEFOR0VTX0lOU1RBTkNFX1BST1BFUlRZICsgMTsKICBzdGF0aWMgY29uc3QgaW50IEZMQUdfQ0hBTkdFU19DT1VOVCA9IEZMQUdfQ0hBTkdFU19TVEFUSUNfUFJPUEVSVFkgKyAxOwoKICAvLyBEZXBlbmRzIGZsYWdzIChvbmUgZm9yIGVhY2ggY2hhbmdlcyBmbGFnKS4KICBzdGF0aWMgY29uc3QgaW50IEZMQUdfREVQRU5EU19PTl9JTkRFWF9TVE9SRSA9IEZMQUdfQ0hBTkdFU19DT1VOVDsKICBzdGF0aWMgY29uc3QgaW50IEZMQUdfREVQRU5EU19PTl9JTlNUQU5DRV9QUk9QRVJUWV9TVE9SRSA9CiAgICAgIEZMQUdfREVQRU5EU19PTl9JTkRFWF9TVE9SRSArIDE7CiAgc3RhdGljIGNvbnN0IGludCBGTEFHX0RFUEVORFNfT05fU1RBVElDX1BST1BFUlRZX1NUT1JFID0KICAgICAgRkxBR19ERVBFTkRTX09OX0lOU1RBTkNFX1BST1BFUlRZX1NUT1JFICsgMTsKICBzdGF0aWMgY29uc3QgaW50IEZMQUdfREVQRU5EU19PTl9DT1VOVCA9CiAgICAgIEZMQUdfREVQRU5EU19PTl9TVEFUSUNfUFJPUEVSVFlfU1RPUkUgKyAxOwoKICBpbnQgX2ZsYWdzID0gMDsKCiAgU2lkZUVmZmVjdHMoKSB7CiAgICBzZXRBbGxTaWRlRWZmZWN0cygpOwogICAgc2V0RGVwZW5kc09uU29tZXRoaW5nKCk7CiAgfQoKICBTaWRlRWZmZWN0cy5lbXB0eSgpIHsKICAgIGNsZWFyQWxsRGVwZW5kZW5jaWVzKCk7CiAgICBjbGVhckFsbFNpZGVFZmZlY3RzKCk7CiAgfQoKICBTaWRlRWZmZWN0cy5mcm9tRmxhZ3ModGhpcy5fZmxhZ3MpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW1NpZGVFZmZlY3RzXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IFNpZGVFZmZlY3RzLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpbnQgZmxhZ3MgPSBzb3VyY2UucmVhZEludCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBTaWRlRWZmZWN0cy5mcm9tRmxhZ3MoZmxhZ3MpOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbU2lkZUVmZmVjdHNdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlSW50KF9mbGFncyk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4gX2ZsYWdzID09IG90aGVyLl9mbGFnczsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignU2lkZUVmZmVjdHMuaGFzaENvZGUnKTsKCiAgYm9vbCBfZ2V0RmxhZyhpbnQgcG9zaXRpb24pIHsKICAgIHJldHVybiAoX2ZsYWdzICYgKDEgPDwgcG9zaXRpb24pKSAhPSAwOwogIH0KCiAgYm9vbCBfc2V0RmxhZyhpbnQgcG9zaXRpb24pIHsKICAgIGludCBiZWZvcmUgPSBfZmxhZ3M7CiAgICBfZmxhZ3MgfD0gKDEgPDwgcG9zaXRpb24pOwogICAgcmV0dXJuIGJlZm9yZSAhPSBfZmxhZ3M7CiAgfQoKICBib29sIF9jbGVhckZsYWcoaW50IHBvc2l0aW9uKSB7CiAgICBpbnQgYmVmb3JlID0gX2ZsYWdzOwogICAgX2ZsYWdzICY9IH4oMSA8PCBwb3NpdGlvbik7CiAgICByZXR1cm4gYmVmb3JlICE9IF9mbGFnczsKICB9CgogIGludCBnZXRDaGFuZ2VzRmxhZ3MoKSB7CiAgICByZXR1cm4gX2ZsYWdzICYgKCgxIDw8IEZMQUdfQ0hBTkdFU19DT1VOVCkgLSAxKTsKICB9CgogIGludCBnZXREZXBlbmRzT25GbGFncygpIHsKICAgIHJldHVybiAoX2ZsYWdzICYgKCgxIDw8IEZMQUdfREVQRU5EU19PTl9DT1VOVCkgLSAxKSkgPj4gRkxBR19DSEFOR0VTX0NPVU5UOwogIH0KCiAgYm9vbCBoYXNTaWRlRWZmZWN0cygpID0+IGdldENoYW5nZXNGbGFncygpICE9IDA7CiAgYm9vbCBkZXBlbmRzT25Tb21ldGhpbmcoKSA9PiBnZXREZXBlbmRzT25GbGFncygpICE9IDA7CgogIGJvb2wgc2V0QWxsU2lkZUVmZmVjdHMoKSB7CiAgICBpbnQgYmVmb3JlID0gX2ZsYWdzOwogICAgX2ZsYWdzIHw9ICgoMSA8PCBGTEFHX0NIQU5HRVNfQ09VTlQpIC0gMSk7CiAgICByZXR1cm4gYmVmb3JlICE9IF9mbGFnczsKICB9CgogIGJvb2wgY2xlYXJBbGxTaWRlRWZmZWN0cygpIHsKICAgIGludCBiZWZvcmUgPSBfZmxhZ3M7CiAgICBfZmxhZ3MgJj0gfigoMSA8PCBGTEFHX0NIQU5HRVNfQ09VTlQpIC0gMSk7CiAgICByZXR1cm4gYmVmb3JlICE9IF9mbGFnczsKICB9CgogIGJvb2wgc2V0RGVwZW5kc09uU29tZXRoaW5nKCkgewogICAgaW50IGJlZm9yZSA9IF9mbGFnczsKICAgIGludCBjb3VudCA9IEZMQUdfREVQRU5EU19PTl9DT1VOVCAtIEZMQUdfQ0hBTkdFU19DT1VOVDsKICAgIF9mbGFncyB8PSAoKCgxIDw8IGNvdW50KSAtIDEpIDw8IEZMQUdfQ0hBTkdFU19DT1VOVCk7CiAgICByZXR1cm4gYmVmb3JlICE9IF9mbGFnczsKICB9CgogIGJvb2wgY2xlYXJBbGxEZXBlbmRlbmNpZXMoKSB7CiAgICBpbnQgYmVmb3JlID0gX2ZsYWdzOwogICAgaW50IGNvdW50ID0gRkxBR19ERVBFTkRTX09OX0NPVU5UIC0gRkxBR19DSEFOR0VTX0NPVU5UOwogICAgX2ZsYWdzICY9IH4oKCgxIDw8IGNvdW50KSAtIDEpIDw8IEZMQUdfQ0hBTkdFU19DT1VOVCk7CiAgICByZXR1cm4gYmVmb3JlICE9IF9mbGFnczsKICB9CgogIGJvb2wgZGVwZW5kc09uU3RhdGljUHJvcGVydHlTdG9yZSgpIHsKICAgIHJldHVybiBfZ2V0RmxhZyhGTEFHX0RFUEVORFNfT05fU1RBVElDX1BST1BFUlRZX1NUT1JFKTsKICB9CgogIGJvb2wgc2V0RGVwZW5kc09uU3RhdGljUHJvcGVydHlTdG9yZSgpIHsKICAgIHJldHVybiBfc2V0RmxhZyhGTEFHX0RFUEVORFNfT05fU1RBVElDX1BST1BFUlRZX1NUT1JFKTsKICB9CgogIGJvb2wgY2xlYXJEZXBlbmRzT25TdGF0aWNQcm9wZXJ0eVN0b3JlKCkgewogICAgcmV0dXJuIF9jbGVhckZsYWcoRkxBR19ERVBFTkRTX09OX1NUQVRJQ19QUk9QRVJUWV9TVE9SRSk7CiAgfQoKICBib29sIHNldENoYW5nZXNTdGF0aWNQcm9wZXJ0eSgpIHsKICAgIHJldHVybiBfc2V0RmxhZyhGTEFHX0NIQU5HRVNfU1RBVElDX1BST1BFUlRZKTsKICB9CgogIGJvb2wgY2xlYXJDaGFuZ2VzU3RhdGljUHJvcGVydHkoKSB7CiAgICByZXR1cm4gX2NsZWFyRmxhZyhGTEFHX0NIQU5HRVNfU1RBVElDX1BST1BFUlRZKTsKICB9CgogIGJvb2wgY2hhbmdlc1N0YXRpY1Byb3BlcnR5KCkgPT4gX2dldEZsYWcoRkxBR19DSEFOR0VTX1NUQVRJQ19QUk9QRVJUWSk7CgogIGJvb2wgZGVwZW5kc09uSW5kZXhTdG9yZSgpID0+IF9nZXRGbGFnKEZMQUdfREVQRU5EU19PTl9JTkRFWF9TVE9SRSk7CgogIGJvb2wgc2V0RGVwZW5kc09uSW5kZXhTdG9yZSgpIHsKICAgIHJldHVybiBfc2V0RmxhZyhGTEFHX0RFUEVORFNfT05fSU5ERVhfU1RPUkUpOwogIH0KCiAgYm9vbCBjbGVhckRlcGVuZHNPbkluZGV4U3RvcmUoKSB7CiAgICByZXR1cm4gX2NsZWFyRmxhZyhGTEFHX0RFUEVORFNfT05fSU5ERVhfU1RPUkUpOwogIH0KCiAgYm9vbCBzZXRDaGFuZ2VzSW5kZXgoKSB7CiAgICByZXR1cm4gX3NldEZsYWcoRkxBR19DSEFOR0VTX0lOREVYKTsKICB9CgogIGJvb2wgY2xlYXJDaGFuZ2VzSW5kZXgoKSB7CiAgICByZXR1cm4gX2NsZWFyRmxhZyhGTEFHX0NIQU5HRVNfSU5ERVgpOwogIH0KCiAgYm9vbCBjaGFuZ2VzSW5kZXgoKSA9PiBfZ2V0RmxhZyhGTEFHX0NIQU5HRVNfSU5ERVgpOwoKICBib29sIGRlcGVuZHNPbkluc3RhbmNlUHJvcGVydHlTdG9yZSgpIHsKICAgIHJldHVybiBfZ2V0RmxhZyhGTEFHX0RFUEVORFNfT05fSU5TVEFOQ0VfUFJPUEVSVFlfU1RPUkUpOwogIH0KCiAgYm9vbCBzZXREZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmUoKSB7CiAgICByZXR1cm4gX3NldEZsYWcoRkxBR19ERVBFTkRTX09OX0lOU1RBTkNFX1BST1BFUlRZX1NUT1JFKTsKICB9CgogIGJvb2wgY2xlYXJEZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmUoKSB7CiAgICByZXR1cm4gX3NldEZsYWcoRkxBR19ERVBFTkRTX09OX0lOU1RBTkNFX1BST1BFUlRZX1NUT1JFKTsKICB9CgogIGJvb2wgc2V0Q2hhbmdlc0luc3RhbmNlUHJvcGVydHkoKSB7CiAgICByZXR1cm4gX3NldEZsYWcoRkxBR19DSEFOR0VTX0lOU1RBTkNFX1BST1BFUlRZKTsKICB9CgogIGJvb2wgY2xlYXJDaGFuZ2VzSW5zdGFuY2VQcm9wZXJ0eSgpIHsKICAgIHJldHVybiBfY2xlYXJGbGFnKEZMQUdfQ0hBTkdFU19JTlNUQU5DRV9QUk9QRVJUWSk7CiAgfQoKICBib29sIGNoYW5nZXNJbnN0YW5jZVByb3BlcnR5KCkgPT4gX2dldEZsYWcoRkxBR19DSEFOR0VTX0lOU1RBTkNFX1BST1BFUlRZKTsKCiAgc3RhdGljIGludCBjb21wdXRlRGVwZW5kc09uRmxhZ3MoaW50IGZsYWdzKSA9PiBmbGFncyA8PCBGTEFHX0NIQU5HRVNfQ09VTlQ7CgogIGJvb2wgZGVwZW5kc09uKGludCBkZXBlbmRzRmxhZ3MpIHsKICAgIHJldHVybiAoX2ZsYWdzICYgZGVwZW5kc0ZsYWdzKSAhPSAwOwogIH0KCiAgYm9vbCBhZGQoU2lkZUVmZmVjdHMgb3RoZXIpIHsKICAgIGludCBiZWZvcmUgPSBfZmxhZ3M7CiAgICBfZmxhZ3MgfD0gb3RoZXIuX2ZsYWdzOwogICAgcmV0dXJuIGJlZm9yZSAhPSBfZmxhZ3M7CiAgfQoKICB2b2lkIHNldFRvKFNpZGVFZmZlY3RzIG90aGVyKSB7CiAgICBfZmxhZ3MgPSBvdGhlci5fZmxhZ3M7CiAgfQoKICBib29sIGNvbnRhaW5zKFNpZGVFZmZlY3RzIG90aGVyKSB7CiAgICByZXR1cm4gKF9mbGFncyB8IG90aGVyLl9mbGFncykgPT0gX2ZsYWdzOwogIH0KCiAgaW50IGdldCBmbGFncyA9PiBfZmxhZ3M7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBidWZmZXIud3JpdGUoJ1NpZGVFZmZlY3RzKHJlYWRzJyk7CiAgICBpZiAoIWRlcGVuZHNPblNvbWV0aGluZygpKSB7CiAgICAgIGJ1ZmZlci53cml0ZSgnIG5vdGhpbmcnKTsKICAgIH0gZWxzZSBpZiAoZGVwZW5kc09uSW5kZXhTdG9yZSgpICYmCiAgICAgICAgZGVwZW5kc09uSW5zdGFuY2VQcm9wZXJ0eVN0b3JlKCkgJiYKICAgICAgICBkZXBlbmRzT25TdGF0aWNQcm9wZXJ0eVN0b3JlKCkpIHsKICAgICAgYnVmZmVyLndyaXRlKCcgYW55dGhpbmcnKTsKICAgIH0gZWxzZSB7CiAgICAgIFN0cmluZyBjb21tYSA9ICcnOwogICAgICBpZiAoZGVwZW5kc09uSW5kZXhTdG9yZSgpKSB7CiAgICAgICAgYnVmZmVyLndyaXRlKCcgaW5kZXgnKTsKICAgICAgICBjb21tYSA9ICcsJzsKICAgICAgfQogICAgICBpZiAoZGVwZW5kc09uSW5zdGFuY2VQcm9wZXJ0eVN0b3JlKCkpIHsKICAgICAgICBidWZmZXIud3JpdGUoJyRjb21tYSBmaWVsZCcpOwogICAgICAgIGNvbW1hID0gJywnOwogICAgICB9CiAgICAgIGlmIChkZXBlbmRzT25TdGF0aWNQcm9wZXJ0eVN0b3JlKCkpIHsKICAgICAgICBidWZmZXIud3JpdGUoJyRjb21tYSBzdGF0aWMnKTsKICAgICAgfQogICAgfQogICAgYnVmZmVyLndyaXRlKCc7IHdyaXRlcycpOwogICAgaWYgKCFoYXNTaWRlRWZmZWN0cygpKSB7CiAgICAgIGJ1ZmZlci53cml0ZSgnIG5vdGhpbmcnKTsKICAgIH0gZWxzZSBpZiAoY2hhbmdlc0luZGV4KCkgJiYKICAgICAgICBjaGFuZ2VzSW5zdGFuY2VQcm9wZXJ0eSgpICYmCiAgICAgICAgY2hhbmdlc1N0YXRpY1Byb3BlcnR5KCkpIHsKICAgICAgYnVmZmVyLndyaXRlKCcgYW55dGhpbmcnKTsKICAgIH0gZWxzZSB7CiAgICAgIFN0cmluZyBjb21tYSA9ICcnOwogICAgICBpZiAoY2hhbmdlc0luZGV4KCkpIHsKICAgICAgICBidWZmZXIud3JpdGUoJyBpbmRleCcpOwogICAgICAgIGNvbW1hID0gJywnOwogICAgICB9CiAgICAgIGlmIChjaGFuZ2VzSW5zdGFuY2VQcm9wZXJ0eSgpKSB7CiAgICAgICAgYnVmZmVyLndyaXRlKCckY29tbWEgZmllbGQnKTsKICAgICAgICBjb21tYSA9ICcsJzsKICAgICAgfQogICAgICBpZiAoY2hhbmdlc1N0YXRpY1Byb3BlcnR5KCkpIHsKICAgICAgICBidWZmZXIud3JpdGUoJyRjb21tYSBzdGF0aWMnKTsKICAgICAgfQogICAgfQogICAgYnVmZmVyLndyaXRlKCcpJyk7CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBTaWRlRWZmZWN0c0J1aWxkZXIgewogIGZpbmFsIE1lbWJlckVudGl0eSBfbWVtYmVyOwogIGZpbmFsIFNpZGVFZmZlY3RzIF9zaWRlRWZmZWN0cyA9IG5ldyBTaWRlRWZmZWN0cy5lbXB0eSgpOwogIGZpbmFsIGJvb2wgX2ZyZWU7CiAgU2V0PFNpZGVFZmZlY3RzQnVpbGRlcj4gX2RlcGVuZGluZzsKCiAgU2lkZUVmZmVjdHNCdWlsZGVyKHRoaXMuX21lbWJlcikgOiBfZnJlZSA9IGZhbHNlOwoKICBTaWRlRWZmZWN0c0J1aWxkZXIuZnJlZSh0aGlzLl9tZW1iZXIpIDogX2ZyZWUgPSB0cnVlOwoKICB2b2lkIHNldENoYW5nZXNJbnN0YW5jZVByb3BlcnR5KCkgewogICAgaWYgKF9mcmVlKSByZXR1cm47CiAgICBfc2lkZUVmZmVjdHMuc2V0Q2hhbmdlc0luc3RhbmNlUHJvcGVydHkoKTsKICB9CgogIHZvaWQgc2V0RGVwZW5kc09uSW5zdGFuY2VQcm9wZXJ0eVN0b3JlKCkgewogICAgaWYgKF9mcmVlKSByZXR1cm47CiAgICBfc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uSW5zdGFuY2VQcm9wZXJ0eVN0b3JlKCk7CiAgfQoKICB2b2lkIHNldENoYW5nZXNTdGF0aWNQcm9wZXJ0eSgpIHsKICAgIGlmIChfZnJlZSkgcmV0dXJuOwogICAgX3NpZGVFZmZlY3RzLnNldENoYW5nZXNTdGF0aWNQcm9wZXJ0eSgpOwogIH0KCiAgdm9pZCBzZXREZXBlbmRzT25TdGF0aWNQcm9wZXJ0eVN0b3JlKCkgewogICAgaWYgKF9mcmVlKSByZXR1cm47CiAgICBfc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uU3RhdGljUHJvcGVydHlTdG9yZSgpOwogIH0KCiAgdm9pZCBzZXRBbGxTaWRlRWZmZWN0c0FuZERlcGVuZHNPblNvbWV0aGluZygpIHsKICAgIGlmIChfZnJlZSkgcmV0dXJuOwogICAgX3NpZGVFZmZlY3RzLnNldEFsbFNpZGVFZmZlY3RzKCk7CiAgICBfc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uU29tZXRoaW5nKCk7CiAgfQoKICB2b2lkIHNldEFsbFNpZGVFZmZlY3RzKCkgewogICAgaWYgKF9mcmVlKSByZXR1cm47CiAgICBfc2lkZUVmZmVjdHMuc2V0QWxsU2lkZUVmZmVjdHMoKTsKICB9CgogIHZvaWQgYWRkSW5wdXQoU2lkZUVmZmVjdHNCdWlsZGVyIGlucHV0KSB7CiAgICBpZiAoX2ZyZWUpIHJldHVybjsKICAgIChpbnB1dC5fZGVwZW5kaW5nID8/PSBuZXcgU2V0PFNpZGVFZmZlY3RzQnVpbGRlcj4oKSkuYWRkKHRoaXMpOwogIH0KCiAgYm9vbCBhZGQoU2lkZUVmZmVjdHMgaW5wdXQpIHsKICAgIGlmIChfZnJlZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIF9zaWRlRWZmZWN0cy5hZGQoaW5wdXQpOwogIH0KCiAgU2lkZUVmZmVjdHMgZ2V0IHNpZGVFZmZlY3RzID0+IF9zaWRlRWZmZWN0czsKCiAgSXRlcmFibGU8U2lkZUVmZmVjdHNCdWlsZGVyPiBnZXQgZGVwZW5kaW5nID0+CiAgICAgIF9kZXBlbmRpbmcgIT0gbnVsbCA/IF9kZXBlbmRpbmcgOiBjb25zdCA8U2lkZUVmZmVjdHNCdWlsZGVyPltdOwoKICBNZW1iZXJFbnRpdHkgZ2V0IG1lbWJlciA9PiBfbWVtYmVyOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnU2lkZUVmZmVjdHNCdWlsZGVyKG1lbWJlcj0kbWVtYmVyLCcpOwogICAgc2Iud3JpdGUoJ2ZyZWU9JF9mcmVlLCcpOwogICAgc2Iud3JpdGUoJ3NpZGVFZmZlY3RzPSRzaWRlRWZmZWN0cywnKTsKICAgIHNiLndyaXRlKCdkZXBlbmRpbmc9JHtkZXBlbmRpbmcubWFwKChzKSA9PiBzLm1lbWJlcikuam9pbignLCcpfSwnKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQqBRABOTjwBHwEkLgEUTxMsARQrTDIqSgEwRT0nOzMrMQESARIZHQQBGBwbBAEmATk+FyIVLQQBLygVGxMEAQw1AQxKASAsBAEgGR8dBAEiGSAdBAEaNQQBHFAEATM5AR0ZLx0EAR8ZMB0EASEZPDodBAEgGTw7HQQBKDwEASs8BAEtPgQBJDMEASY1BAFKAUcBIjIEASQ0BAEbKQQBHSsEATcBKj4EAS0+BAEvPgQBJjUEASg3BAFOAU4BJSkEASAZHB0EASIbBAElLgQBGwEMFi4nISAoLCohDRkjIBUILiYVCCwnCAYeHSAhJSMhDRkcIBUIJyYVCCUnCAYXHgQCARsePBQmATQBOAEmFy8EAS0XNgQBJBctBAErFzQEATIXJioEAR0XJgQBLBdEBAEgHSQEAS8BMEYBJgEMFio0HitIGgQCAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy91bml2ZXJzZS9zaWRlX2VmZmVjdHMuZGFydD9zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pby9rZXJuZWxfc291cmNlX2luZm9ybWF0aW9uLmRhcnS6Vi8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gU291cmNlIGluZm9ybWF0aW9uIHN5c3RlbSBtYXBwaW5nIHRoYXQgYXR0ZW1wdHMgYSBzZW1hbnRpYyBtYXBwaW5nIGJldHdlZW4KLy8vIG9mZnNldHMgb2YgSmF2YVNjcmlwdCBjb2RlIHBvaW50cyB0byBvZmZzZXRzIG9mIERhcnQgY29kZSBwb2ludHMuCgpsaWJyYXJ5IGRhcnQyanMuc291cmNlX2luZm9ybWF0aW9uLmtlcm5lbDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2pzX3N0cmF0ZWd5LmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnOwppbXBvcnQgJ3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKaW1wb3J0ICdwb3NpdGlvbl9pbmZvcm1hdGlvbi5kYXJ0JzsKCmNsYXNzIEtlcm5lbFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kKICAgIGV4dGVuZHMgQWJzdHJhY3RQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kgewogIGZpbmFsIEpzQmFja2VuZFN0cmF0ZWd5IF9iYWNrZW5kU3RyYXRlZ3k7CgogIGNvbnN0IEtlcm5lbFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kodGhpcy5fYmFja2VuZFN0cmF0ZWd5KTsKCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb25CdWlsZGVyIGNyZWF0ZUJ1aWxkZXJGb3JDb250ZXh0KE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBuZXcgS2VybmVsU291cmNlSW5mb3JtYXRpb25CdWlsZGVyKAogICAgICAgIF9iYWNrZW5kU3RyYXRlZ3kKICAgICAgICAgICAgLy8gaWdub3JlOmRlcHJlY2F0ZWRfbWVtYmVyX3VzZV9mcm9tX3NhbWVfcGFja2FnZQogICAgICAgICAgICAuZWxlbWVudE1hcCwKICAgICAgICBtZW1iZXIpOwogIH0KfQoKLy8vIENvbXB1dGUgdGhlIHNvdXJjZSBtYXAgbmFtZSBmb3Iga2VybmVsIGJhc2VkIFttZW1iZXJdLiBJZiBbY2FsbFN0cnVjdHVyZV0KLy8vIGlzIG5vbi1udWxsIGl0IGlzIHVzZWQgdG8gbmFtZSB0aGUgcGFyYW1ldGVyIHN0dWIgZm9yIFtlbGVtZW50XS4KLy8vCi8vLyBbZWxlbWVudE1hcF0gaXMgdXNlZCB0byBjb21wdXRlIG5hbWVzIGZvciBjbG9zdXJlIGNhbGwgbWV0aG9kcy4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWFrZSB0aGUgY2xvc3VyZSBjYWxsIG5hbWVzIGF2YWlsYWJsZSB0bwovLyBgc291cmNlbWFwX2hlbHBlci5kYXJ0YC4KU3RyaW5nIGNvbXB1dGVLZXJuZWxFbGVtZW50TmFtZUZvclNvdXJjZU1hcHMoCiAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBNZW1iZXJFbnRpdHkgbWVtYmVyLAogICAgW0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZV0pIHsKICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPSBlbGVtZW50TWFwLmdldE1lbWJlckRlZmluaXRpb24obWVtYmVyKTsKICBzd2l0Y2ggKGRlZmluaXRpb24ua2luZCkgewogICAgY2FzZSBNZW1iZXJLaW5kLmNsb3N1cmVDYWxsOgogICAgICBpci5UcmVlTm9kZSBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICBTdHJpbmcgbmFtZTsKICAgICAgd2hpbGUgKG5vZGUgaXMhIGlyLk1lbWJlcikgewogICAgICAgIGlmIChub2RlIGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgbmFtZSA9ICcke25vZGUudmFyaWFibGUubmFtZX0uJG5hbWUnOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmFtZSA9IG5vZGUudmFyaWFibGUubmFtZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgIG5hbWUgPSAnPGFub255bW91cyBmdW5jdGlvbj4uJG5hbWUnOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmFtZSA9ICc8YW5vbnltb3VzIGZ1bmN0aW9uPic7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgICAgfQogICAgICBNZW1iZXJFbnRpdHkgZW5jbG9zaW5nTWVtYmVyID0gZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZSk7CiAgICAgIFN0cmluZyBlbmNsb3NpbmdNZW1iZXJOYW1lID0KICAgICAgICAgIGNvbXB1dGVFbGVtZW50TmFtZUZvclNvdXJjZU1hcHMoZW5jbG9zaW5nTWVtYmVyLCBjYWxsU3RydWN0dXJlKTsKICAgICAgcmV0dXJuICckZW5jbG9zaW5nTWVtYmVyTmFtZS4kbmFtZSc7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gY29tcHV0ZUVsZW1lbnROYW1lRm9yU291cmNlTWFwcyhtZW1iZXIsIGNhbGxTdHJ1Y3R1cmUpOwogIH0KfQoKLy8vIFtTb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXJdIHRoYXQgZ2VuZXJhdGVzIFtQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uXSBmcm9tCi8vLyBLZXJuZWwgbm9kZXMuCmNsYXNzIEtlcm5lbFNvdXJjZUluZm9ybWF0aW9uQnVpbGRlciBpbXBsZW1lbnRzIFNvdXJjZUluZm9ybWF0aW9uQnVpbGRlciB7CiAgZmluYWwgSnNUb0VsZW1lbnRNYXAgX2VsZW1lbnRNYXA7CiAgZmluYWwgTWVtYmVyRW50aXR5IF9tZW1iZXI7CiAgZmluYWwgU3RyaW5nIF9uYW1lOwoKICAvLy8gSW5saW5pbmcgY29udGV4dCBvciBudWxsIHdoZW4gbm8gaW5saW5pbmcgaGFzIHRha2VuIHBsYWNlLgogIC8vLwogIC8vLyBBIG5ldyBidWlsZGVyIGlzIGNyZWF0ZWQgZXZlcnkgdGltZSB0aGUgYmFja2VuZCBpbmxpbmVzIGEgbWV0aG9kLiBUaGlzCiAgLy8vIGZpZWxkIGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiBldmVyeSBjYWxsIHNpdGUgdGhhdCBoYXMgYmVlbiBpbmxpbmVkLiBUaGUKICAvLy8gbGFzdCBlbnRyeSBvbiB0aGUgbGlzdCBpcyBhbHdheXMgYSBjYWxsIHRvIFtfbWVtYmVyXS4KICBmaW5hbCBMaXN0PEZyYW1lQ29udGV4dD4gaW5saW5pbmdDb250ZXh0OwoKICBLZXJuZWxTb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIodGhpcy5fZWxlbWVudE1hcCwgdGhpcy5fbWVtYmVyKQogICAgICA6IF9uYW1lID0gY29tcHV0ZUtlcm5lbEVsZW1lbnROYW1lRm9yU291cmNlTWFwcyhfZWxlbWVudE1hcCwgX21lbWJlciksCiAgICAgICAgaW5saW5pbmdDb250ZXh0ID0gbnVsbDsKCiAgS2VybmVsU291cmNlSW5mb3JtYXRpb25CdWlsZGVyLndpdGhDb250ZXh0KAogICAgICB0aGlzLl9lbGVtZW50TWFwLCB0aGlzLl9tZW1iZXIsIHRoaXMuaW5saW5pbmdDb250ZXh0LCB0aGlzLl9uYW1lKTsKCiAgLy8vIFJldHVybnMgdGhlIFtTb3VyY2VMb2NhdGlvbl0gZm9yIHRoZSBbb2Zmc2V0XSB3aXRoaW4gW25vZGVdIHVzaW5nIFtuYW1lXQogIC8vLyBhcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGxvY2F0aW9uLgogIC8vLwogIC8vLyBJZiBbb2Zmc2V0XSBpcyBgbnVsbGAsIHRoZSBmaXJzdCBgZmlsZU9mZnNldGAgb2YgW25vZGVdIG9yIGl0cyBwYXJlbnRzIGlzCiAgLy8vIHVzZWQuCiAgU291cmNlTG9jYXRpb24gX2dldFNvdXJjZUxvY2F0aW9uKFN0cmluZyBuYW1lLCBpci5UcmVlTm9kZSBub2RlLAogICAgICBbaW50IG9mZnNldF0pIHsKICAgIGlyLkxvY2F0aW9uIGxvY2F0aW9uOwogICAgaWYgKG9mZnNldCAhPSBudWxsKSB7CiAgICAgIGxvY2F0aW9uID0gbm9kZS5sb2NhdGlvbjsKICAgICAgbG9jYXRpb24gPSBub2RlLmVuY2xvc2luZ0NvbXBvbmVudC5nZXRMb2NhdGlvbihsb2NhdGlvbi5maWxlLCBvZmZzZXQpOwogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmZpbGVPZmZzZXQgPT0gaXIuVHJlZU5vZGUubm9PZmZzZXQpIHsKICAgICAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICAgIH0KICAgICAgbG9jYXRpb24gPSBub2RlLmxvY2F0aW9uOwogICAgICBvZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICB9CiAgICBhc3NlcnQoCiAgICAgICAgbG9jYXRpb24gIT0gbnVsbCwgIk5vIGxvY2F0aW9uIGZvdW5kIGZvciAkbm9kZSAoJHtub2RlLnJ1bnRpbWVUeXBlfSkiKTsKICAgIHJldHVybiBuZXcgS2VybmVsU291cmNlTG9jYXRpb24obG9jYXRpb24sIG9mZnNldCwgbmFtZSk7CiAgfQoKICAvLy8gQ3JlYXRlcyB0aGUgc291cmNlIGluZm9ybWF0aW9uIGZvciBhIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lZCBieSB0aGUKICAvLy8gcm9vdCBbbm9kZV0gYW5kIGl0cyBbZnVuY3Rpb25Ob2RlXS4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIG1ldGhvZHMsIGNvbnN0cnVjdG9ycywgYW5kIGxvY2FsIGZ1bmN0aW9ucy4KICBTb3VyY2VJbmZvcm1hdGlvbiBfYnVpbGRGdW5jdGlvbigKICAgICAgU3RyaW5nIG5hbWUsIGlyLlRyZWVOb2RlIG5vZGUsIGlyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbk5vZGUpIHsKICAgIGlmIChmdW5jdGlvbk5vZGUuZmlsZUVuZE9mZnNldCAhPSBpci5UcmVlTm9kZS5ub09mZnNldCkgewogICAgICByZXR1cm4gbmV3IFBvc2l0aW9uU291cmNlSW5mb3JtYXRpb24oCiAgICAgICAgICBfZ2V0U291cmNlTG9jYXRpb24obmFtZSwgbm9kZSksCiAgICAgICAgICBfZ2V0U291cmNlTG9jYXRpb24obmFtZSwgZnVuY3Rpb25Ob2RlLCBmdW5jdGlvbk5vZGUuZmlsZUVuZE9mZnNldCksCiAgICAgICAgICB0aGlzLmlubGluaW5nQ29udGV4dCk7CiAgICB9CiAgICByZXR1cm4gX2J1aWxkVHJlZU5vZGUobm9kZSk7CiAgfQoKICAvLy8gQ3JlYXRlcyB0aGUgc291cmNlIGluZm9ybWF0aW9uIGZvciBhIFtiYXNlXSBhbmQgZW5kIG9mIFttZW1iZXJdLiBJZiBbYmFzZV0KICAvLy8gaXMgbm90IHByb3ZpZGVkLCB0aGUgb2Zmc2V0IG9mIFttZW1iZXJdIGlzIHVzZWQgYXMgdGhlIHN0YXJ0IHBvc2l0aW9uLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCByZXR1cm4gZXhwcmVzc2lvbnMgd2hpY2ggYm90aCBwb2ludAogIC8vLyB0byB0aGUgZW5kIG9mIHRoZSBtZW1iZXIgYXMgdGhlIGNsb3NpbmcgcG9zaXRpb24uCiAgU291cmNlSW5mb3JtYXRpb24gX2J1aWxkRnVuY3Rpb25FbmQoTWVtYmVyRW50aXR5IG1lbWJlciwgW2lyLlRyZWVOb2RlIGJhc2VdKSB7CiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJEZWZpbml0aW9uKG1lbWJlcik7CiAgICBTdHJpbmcgbmFtZSA9IGNvbXB1dGVLZXJuZWxFbGVtZW50TmFtZUZvclNvdXJjZU1hcHMoX2VsZW1lbnRNYXAsIG1lbWJlcik7CiAgICBzd2l0Y2ggKGRlZmluaXRpb24ua2luZCkgewogICAgICBjYXNlIE1lbWJlcktpbmQucmVndWxhcjoKICAgICAgICBpci5NZW1iZXIgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICBpZiAobm9kZSBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgICAgIHJldHVybiBfYnVpbGRGdW5jdGlvbihuYW1lLCBiYXNlID8/IG5vZGUsIG5vZGUuZnVuY3Rpb24pOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yOgogICAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3JCb2R5OgogICAgICAgIGlyLk1lbWJlciBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICAgIHJldHVybiBfYnVpbGRGdW5jdGlvbihuYW1lLCBiYXNlID8/IG5vZGUsIG5vZGUuZnVuY3Rpb24pOwogICAgICBjYXNlIE1lbWJlcktpbmQuY2xvc3VyZUNhbGw6CiAgICAgICAgaXIuTG9jYWxGdW5jdGlvbiBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICAgIHJldHVybiBfYnVpbGRGdW5jdGlvbihuYW1lLCBiYXNlID8/IG5vZGUsIG5vZGUuZnVuY3Rpb24pOwogICAgICAvLyBUT0RPKHNyYSk6IGdlbmVyYXRvckJvZHkKICAgICAgZGVmYXVsdDoKICAgIH0KICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShiYXNlID8/IGRlZmluaXRpb24ubm9kZSwgbmFtZTogbmFtZSk7CiAgfQoKICAvLy8gQ3JlYXRlcyB0aGUgc291cmNlIGluZm9ybWF0aW9uIGZvciBleGl0aW5nIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVkCiAgLy8vIGJ5IHRoZSByb290IFtub2RlXSBhbmQgaXRzIFtmdW5jdGlvbk5vZGVdLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBoYW5kbGVzIGJvdGggbWV0aG9kcywgY29uc3RydWN0b3JzLCBhbmQgbG9jYWwgZnVuY3Rpb25zLgogIFNvdXJjZUluZm9ybWF0aW9uIF9idWlsZEZ1bmN0aW9uRXhpdCgKICAgICAgaXIuVHJlZU5vZGUgbm9kZSwgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZSkgewogICAgaWYgKGZ1bmN0aW9uTm9kZS5maWxlRW5kT2Zmc2V0ICE9IGlyLlRyZWVOb2RlLm5vT2Zmc2V0KSB7CiAgICAgIHJldHVybiBuZXcgUG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvbigKICAgICAgICAgIF9nZXRTb3VyY2VMb2NhdGlvbihfbmFtZSwgZnVuY3Rpb25Ob2RlLCBmdW5jdGlvbk5vZGUuZmlsZUVuZE9mZnNldCksCiAgICAgICAgICBudWxsLAogICAgICAgICAgdGhpcy5pbmxpbmluZ0NvbnRleHQpOwogICAgfQogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgLy8vIENyZWF0ZXMgdGhlIHNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIFtib2R5XSBvZiBbbm9kZV0uCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZm9yIGNvZGUgaW4gdGhlIGJlZ2lubmluZyBvZiBhIG1ldGhvZCwgbGlrZQogIC8vLyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgaW4gdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24uCiAgU291cmNlSW5mb3JtYXRpb24gX2J1aWxkQm9keShpci5UcmVlTm9kZSBub2RlLCBpci5UcmVlTm9kZSBib2R5KSB7CiAgICBTb3VyY2VMb2NhdGlvbiBsb2NhdGlvbjsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgaWYgKGJvZHkgaXMgaXIuQmxvY2sgJiYgYm9keS5zdGF0ZW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgICBsb2NhdGlvbiA9IF9nZXRTb3VyY2VMb2NhdGlvbihfbmFtZSwgYm9keS5zdGF0ZW1lbnRzLmZpcnN0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhdGlvbiA9IF9nZXRTb3VyY2VMb2NhdGlvbihfbmFtZSwgYm9keSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGxvY2F0aW9uID0gX2dldFNvdXJjZUxvY2F0aW9uKF9uYW1lLCBub2RlKTsKICAgIH0KICAgIHJldHVybiBuZXcgUG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvbihsb2NhdGlvbiwgbnVsbCwgaW5saW5pbmdDb250ZXh0KTsKICB9CgogIC8vLyBDcmVhdGVzIHNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGJvZHkgb2YgdGhlIGN1cnJlbnQgbWVtYmVyLgogIFNvdXJjZUluZm9ybWF0aW9uIF9idWlsZE1lbWJlckJvZHkoKSB7CiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJEZWZpbml0aW9uKF9tZW1iZXIpOwogICAgc3dpdGNoIChkZWZpbml0aW9uLmtpbmQpIHsKICAgICAgY2FzZSBNZW1iZXJLaW5kLnJlZ3VsYXI6CiAgICAgICAgaXIuTm9kZSBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICAgIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgICAgcmV0dXJuIF9idWlsZEJvZHkobm9kZSwgbm9kZS5mdW5jdGlvbi5ib2R5KTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuRmllbGQpIHsKICAgICAgICAgIHJldHVybiBfYnVpbGRCb2R5KG5vZGUsIG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yOgogICAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3JCb2R5OgogICAgICAgIGlyLk5vZGUgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICBpZiAobm9kZSBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgICAgIHJldHVybiBfYnVpbGRCb2R5KG5vZGUsIG5vZGUuZnVuY3Rpb24uYm9keSk7CiAgICAgICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgICAgICByZXR1cm4gX2J1aWxkQm9keShub2RlLCBub2RlLmZ1bmN0aW9uLmJvZHkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNsb3N1cmVDYWxsOgogICAgICAgIGlyLkxvY2FsRnVuY3Rpb24gbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICByZXR1cm4gX2J1aWxkQm9keShub2RlLCBub2RlLmZ1bmN0aW9uLmJvZHkpOwogICAgICBjYXNlIE1lbWJlcktpbmQuZ2VuZXJhdG9yQm9keToKICAgICAgICBpci5Ob2RlIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgICAgaWYgKG5vZGUgaXMgaXIuTG9jYWxGdW5jdGlvbikgewogICAgICAgICAgcmV0dXJuIF9idWlsZEJvZHkobm9kZSwgbm9kZS5mdW5jdGlvbi5ib2R5KTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuTWVtYmVyICYmIG5vZGUuZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIF9idWlsZEJvZHkobm9kZSwgbm9kZS5mdW5jdGlvbi5ib2R5KTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICB9CiAgICByZXR1cm4gX2J1aWxkVHJlZU5vZGUoZGVmaW5pdGlvbi5ub2RlKTsKICB9CgogIC8vLyBDcmVhdGVzIHNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGV4aXQgb2YgdGhlIGN1cnJlbnQgbWVtYmVyLgogIFNvdXJjZUluZm9ybWF0aW9uIF9idWlsZE1lbWJlckV4aXQoKSB7CiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJEZWZpbml0aW9uKF9tZW1iZXIpOwogICAgc3dpdGNoIChkZWZpbml0aW9uLmtpbmQpIHsKICAgICAgY2FzZSBNZW1iZXJLaW5kLnJlZ3VsYXI6CiAgICAgICAgaXIuTm9kZSBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICAgIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICAgICAgcmV0dXJuIF9idWlsZEZ1bmN0aW9uRXhpdChub2RlLCBub2RlLmZ1bmN0aW9uKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvcjoKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keToKICAgICAgICBpci5NZW1iZXIgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICByZXR1cm4gX2J1aWxkRnVuY3Rpb25FeGl0KG5vZGUsIG5vZGUuZnVuY3Rpb24pOwogICAgICBjYXNlIE1lbWJlcktpbmQuY2xvc3VyZUNhbGw6CiAgICAgICAgaXIuTG9jYWxGdW5jdGlvbiBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICAgIHJldHVybiBfYnVpbGRGdW5jdGlvbkV4aXQobm9kZSwgbm9kZS5mdW5jdGlvbik7CiAgICAgIGRlZmF1bHQ6CiAgICB9CiAgICByZXR1cm4gX2J1aWxkVHJlZU5vZGUoZGVmaW5pdGlvbi5ub2RlKTsKICB9CgogIC8vLyBDcmVhdGVzIHNvdXJjZSBpbmZvcm1hdGlvbiBiYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgW25vZGVdLgogIFNvdXJjZUluZm9ybWF0aW9uIF9idWlsZFRyZWVOb2RlKGlyLlRyZWVOb2RlIG5vZGUsCiAgICAgIHtTb3VyY2VMb2NhdGlvbiBjbG9zaW5nUG9zaXRpb24sIFN0cmluZyBuYW1lfSkgewogICAgcmV0dXJuIG5ldyBQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uKAogICAgICAgIF9nZXRTb3VyY2VMb2NhdGlvbihuYW1lID8/IF9uYW1lLCBub2RlKSwKICAgICAgICBjbG9zaW5nUG9zaXRpb24sCiAgICAgICAgaW5saW5pbmdDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uQnVpbGRlciBmb3JDb250ZXh0KAogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyLCBTb3VyY2VJbmZvcm1hdGlvbiBjb250ZXh0KSB7CiAgICBMaXN0PEZyYW1lQ29udGV4dD4gbmV3Q29udGV4dCA9IGlubGluaW5nQ29udGV4dD8udG9MaXN0KCkgPz8gW107CiAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CiAgICAgIG5ld0NvbnRleHQuYWRkKG5ldyBGcmFtZUNvbnRleHQoY29udGV4dCwgbWVtYmVyLm5hbWUpKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IGludmVzdGlnYXRlIHdoZXRoZXIgd2UgaGF2ZSBhbnkgbW9yZSBjYXNlcyB3aGVyZSBjb250ZXh0CiAgICAgIC8vIGlzIG51bGwuCiAgICAgIG5ld0NvbnRleHQgPSBpbmxpbmluZ0NvbnRleHQ7CiAgICB9CgogICAgU3RyaW5nIG5hbWUgPSBjb21wdXRlS2VybmVsRWxlbWVudE5hbWVGb3JTb3VyY2VNYXBzKF9lbGVtZW50TWFwLCBfbWVtYmVyKTsKICAgIHJldHVybiBuZXcgS2VybmVsU291cmNlSW5mb3JtYXRpb25CdWlsZGVyLndpdGhDb250ZXh0KAogICAgICAgIF9lbGVtZW50TWFwLCBtZW1iZXIsIG5ld0NvbnRleHQsIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRTd2l0Y2hDYXNlKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRTd2l0Y2goaXIuTm9kZSBub2RlKSB7CiAgICByZXR1cm4gX2J1aWxkVHJlZU5vZGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEFzKGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRJcyhpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkVHJ5KGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRDYXRjaChpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQmluYXJ5KGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRVbmFyeShpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkSW5kZXhTZXQoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEluZGV4KGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRGb3JJblNldChpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkRm9ySW5DdXJyZW50KGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRGb3JJbk1vdmVOZXh0KGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRGb3JJbkl0ZXJhdG9yKGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRTdHJpbmdJbnRlcnBvbGF0aW9uKGlyLk5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRGb3JlaWduQ29kZShpci5Ob2RlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkVmFyaWFibGVEZWNsYXJhdGlvbigpIHsKICAgIHJldHVybiBfYnVpbGRNZW1iZXJCb2R5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEF3YWl0KGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRZaWVsZChpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQXN5bmNCb2R5KCkgewogICAgcmV0dXJuIF9idWlsZE1lbWJlckJvZHkoKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQXN5bmNFeGl0KCkgewogICAgcmV0dXJuIF9idWlsZE1lbWJlckV4aXQoKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQXNzaWdubWVudChpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkVGhyb3coaXIuTm9kZSBub2RlKSB7CiAgICByZXR1cm4gX2J1aWxkVHJlZU5vZGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEFzc2VydChpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkTmV3KGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRJZihpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkQ2FsbCgKICAgICAgY292YXJpYW50IGlyLlRyZWVOb2RlIHJlY2VpdmVyLCBjb3ZhcmlhbnQgaXIuVHJlZU5vZGUgY2FsbCkgewogICAgcmV0dXJuIG5ldyBQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uKF9nZXRTb3VyY2VMb2NhdGlvbihfbmFtZSwgcmVjZWl2ZXIpLAogICAgICAgIF9nZXRTb3VyY2VMb2NhdGlvbihfbmFtZSwgY2FsbCksIGlubGluaW5nQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEdldChpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkU2V0KGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRMb29wKGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRJbXBsaWNpdFJldHVybihNZW1iZXJFbnRpdHkgZWxlbWVudCkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRSZXR1cm4oaXIuTm9kZSBub2RlKSB7CiAgICByZXR1cm4gX2J1aWxkRnVuY3Rpb25FbmQoX21lbWJlciwgbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZENyZWF0ZShpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBfYnVpbGRUcmVlTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFNvdXJjZUluZm9ybWF0aW9uIGJ1aWxkTGlzdExpdGVyYWwoaXIuTm9kZSBub2RlKSB7CiAgICByZXR1cm4gX2J1aWxkVHJlZU5vZGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZEdlbmVyaWMoaXIuTm9kZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBTb3VyY2VJbmZvcm1hdGlvbiBidWlsZERlY2xhcmF0aW9uKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBfYnVpbGRGdW5jdGlvbkVuZChtZW1iZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRTdHViKAogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJEZWZpbml0aW9uKGZ1bmN0aW9uKTsKICAgIFN0cmluZyBuYW1lID0gY29tcHV0ZUtlcm5lbEVsZW1lbnROYW1lRm9yU291cmNlTWFwcygKICAgICAgICBfZWxlbWVudE1hcCwgZnVuY3Rpb24sIGNhbGxTdHJ1Y3R1cmUpOwogICAgaXIuTm9kZSBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUsIG5hbWU6IG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU291cmNlSW5mb3JtYXRpb24gYnVpbGRHb3RvKGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9idWlsZFRyZWVOb2RlKG5vZGUpOwogIH0KfQoKY2xhc3MgS2VybmVsU291cmNlTG9jYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFNvdXJjZUxvY2F0aW9uIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgb2Zmc2V0OwogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBzb3VyY2VOYW1lOwogIEBvdmVycmlkZQogIGZpbmFsIFVyaSBzb3VyY2VVcmk7CgogIEtlcm5lbFNvdXJjZUxvY2F0aW9uKGlyLkxvY2F0aW9uIGxvY2F0aW9uLCB0aGlzLm9mZnNldCwgdGhpcy5zb3VyY2VOYW1lKQogICAgICA6IHNvdXJjZVVyaSA9IGxvY2F0aW9uLmZpbGUsCiAgICAgICAgc3VwZXIuZnJvbUxvY2F0aW9uKGxvY2F0aW9uKTsKCiAgS2VybmVsU291cmNlTG9jYXRpb24uZnJvbU90aGVyKEtlcm5lbFNvdXJjZUxvY2F0aW9uIG90aGVyLCB0aGlzLnNvdXJjZU5hbWUpCiAgICAgIDogc291cmNlVXJpID0gb3RoZXIuc291cmNlVXJpLAogICAgICAgIG9mZnNldCA9IG90aGVyLm9mZnNldCwKICAgICAgICBzdXBlci5mcm9tT3RoZXIob3RoZXIpOwp9CoHgAE5OPAFPRgErASgkJycqIiQBJjgsAUABDEovGT4ZEQQCAU5FBERBHC40JUgdISoTIy4eMhMnDDQeMRMrDAocCEEjSysNRQQCAU8SSyQeFgFBBk1QPCwBQU0gAS5JAU8qBlAMQxYaGiBNDUgcCCAgBgxQPQQBTioGSyRFPiwqTiEGIQQBUU0GUThRS04fHyokRAoPIycqQiMxQiIPBkAEAU8xBksoOD4sTxAhBiEEAT8GSThFHRg8RQ80CA0yBksEAUUpTB8fKCQ3JzUKDyMnKCQ3LTcKDyMxNSUoKDdBNwoPDwYsBAFFKUwfHygkOgoPIycqOCMxOA8GLAQBQjU3KjEZGgQBDCc4RRs+DVESJAYBTzswBAEMOwEMMCEEAQwsIQQBDCwhBAEMLSEEAQwvIQQBDDAhBAEMLyEEAQw5AQw2AQwyIQQBDDYhBAEMNyEEAQw3IQQBDEQBDDwBDDEfBAEMLyEEAQwvIQQBDCcfBAEMJx8EAQw0IQQBDC8hBAEMMCEEAQwtIQQBDCwhBAEMH0ROOwQBDC0hBAEMLSEEAQwuIQQBDEcBDDAtBAEMMCEEAQw1IQQBDDgBDDwmBAEMHz5NOS8kLQQBDC4hBAIBPAwUDBsMFwFLIyYBTiUfIAIBNnBhY2thZ2U6Y29tcGlsZXIvc3JjL2lvL2tlcm5lbF9zb3VyY2VfaW5mb3JtYXRpb24uZGFydDdzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qcy9qc19zb3VyY2VfbWFwcGluZy5kYXJ0kHwvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBqcy5zb3VyY2VfbWFwcGluZzsKCmltcG9ydCAnLi4vaW8vY29kZV9vdXRwdXQuZGFydCcKICAgIHNob3cgQnVmZmVyZWRDb2RlT3V0cHV0LCBTb3VyY2VMb2NhdGlvbnMsIFNvdXJjZUxvY2F0aW9uc1Byb3ZpZGVyOwppbXBvcnQgJy4uL2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JwogICAgc2hvdyBTb3VyY2VMb2NhdGlvbiwgU291cmNlSW5mb3JtYXRpb24sIFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3k7CmltcG9ydCAnanMuZGFydCc7CgovLy8gW1NvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3ldIHRoYXQgY2FuIGFzc29jaWF0ZSBzb3VyY2UgaW5mb3JtYXRpb24gd2l0aAovLy8gSmF2YVNjcmlwdCBvdXRwdXQuCmNsYXNzIEphdmFTY3JpcHRTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5IGV4dGVuZHMgU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSB7CiAgY29uc3QgSmF2YVNjcmlwdFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3koKTsKCiAgLy8vIENyZWF0ZXMgYSBwcm9jZXNzb3IgdGhhdCBjYW4gYXNzb2NpYXRlIHNvdXJjZSBpbmZvcm1hdGlvbiBvbiBbTm9kZV0gd2l0aAogIC8vLyBjb2RlIG9mZnNldHMgaW4gYSBbU291cmNlTWFwcGVyXSBwcm92aWRlZCBieSBbc291cmNlTWFwcGVyUHJvdmlkZXJdLgogIC8vLyBTb3VyY2UgaW5mb3JtYXRpb24gZm9yIGVhY2ggW05vZGVdIGlzIHByb3ZpZGVyIGJ5IFtyZWFkZXJdLgogIFNvdXJjZUluZm9ybWF0aW9uUHJvY2Vzc29yIGNyZWF0ZVByb2Nlc3NvcigKICAgICAgU291cmNlTWFwcGVyUHJvdmlkZXIgc291cmNlTWFwcGVyUHJvdmlkZXIsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uUmVhZGVyIHJlYWRlcikgewogICAgcmV0dXJuIGNvbnN0IFNvdXJjZUluZm9ybWF0aW9uUHJvY2Vzc29yKCk7CiAgfQp9CgovLy8gSW50ZXJmYWNlIGZvciBkZXJpdmluZyBbU291cmNlSW5mb3JtYXRpb25dIGZyb20gYSBbTm9kZV0uCi8vLwovLy8gVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gcmVhZCB0aGUgdmFsdWUgb2YgdGhlIG5vZGUgaXRzZWxmLgpjbGFzcyBTb3VyY2VJbmZvcm1hdGlvblJlYWRlciB7CiAgY29uc3QgU291cmNlSW5mb3JtYXRpb25SZWFkZXIoKTsKCiAgU291cmNlSW5mb3JtYXRpb24gZ2V0U291cmNlSW5mb3JtYXRpb24oTm9kZSBub2RlKSA9PiBub2RlLnNvdXJjZUluZm9ybWF0aW9uOwp9CgovLy8gQW4gb2JzZXJ2ZXIgb2YgY29kZSBwb3NpdGlvbnMgb2YgcHJpbnRlZCBKYXZhU2NyaXB0IFtOb2RlXXMuCmNsYXNzIENvZGVQb3NpdGlvbkxpc3RlbmVyIHsKICBjb25zdCBDb2RlUG9zaXRpb25MaXN0ZW5lcigpOwoKICAvLy8gQ2FsbGVkIHRvIGFzc29jaWF0ZSBbbm9kZV0gd2l0aCB0aGUgcHJvdmlkZWQgc3RhcnQgcG9zaXRpb24uCiAgLy8vCiAgLy8vIFRoZSBub2RlcyBhcmUgc2VlbiBpbiBwcmUtdHJhdmVyc2FsIG9yZGVyLgogIHZvaWQgb25TdGFydFBvc2l0aW9uKE5vZGUgbm9kZSwgaW50IHN0YXJ0UG9zaXRpb24pIHt9CgogIC8vLyBDYWxsZWQgdG8gYXNzb2NpYXRlIFtub2RlXSB3aXRoIHRoZSBwcm92aWRlZCBzdGFydCwgZW5kIGFuZCBjbG9zaW5nCiAgLy8vIHBvc2l0aW9ucy4KICAvLy8KICAvLy8gVGhlIG5vZGVzIGFyZSBzZWVuIGluIHBvc3QtdHJhdmVyc2FsIG9yZGVyLgogIHZvaWQgb25Qb3NpdGlvbnMoCiAgICAgIE5vZGUgbm9kZSwgaW50IHN0YXJ0UG9zaXRpb24sIGludCBlbmRQb3NpdGlvbiwgaW50IGNsb3NpbmdQb3NpdGlvbikge30KfQoKLy8vIEludGVyZmFjZSBmb3IgY3JlYXRpbmcgW1NvdXJjZU1hcHBlcl1zIGZvciBtdWx0aXBsZSBzb3VyY2UgaW5mb3JtYXRpb24KLy8vIGVuZ2luZXMuCmFic3RyYWN0IGNsYXNzIFNvdXJjZU1hcHBlclByb3ZpZGVyIHsKICBTb3VyY2VNYXBwZXIgY3JlYXRlU291cmNlTWFwcGVyKFN0cmluZyBuYW1lKTsKfQoKLy8vIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgW1NvdXJjZU1hcHBlclByb3ZpZGVyXS4KY2xhc3MgU291cmNlTWFwcGVyUHJvdmlkZXJJbXBsIGltcGxlbWVudHMgU291cmNlTWFwcGVyUHJvdmlkZXIgewogIGZpbmFsIFNvdXJjZUxvY2F0aW9uc1Byb3ZpZGVyIHByb3ZpZGVyOwoKICBTb3VyY2VNYXBwZXJQcm92aWRlckltcGwodGhpcy5wcm92aWRlcik7CgogIEBvdmVycmlkZQogIFNvdXJjZU1hcHBlciBjcmVhdGVTb3VyY2VNYXBwZXIoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBuZXcgU291cmNlTG9jYXRpb25zTWFwcGVyKHByb3ZpZGVyLmNyZWF0ZVNvdXJjZUxvY2F0aW9ucyhuYW1lKSk7CiAgfQp9CgovLy8gQW4gaW50ZXJmYWNlIGZvciBtYXBwaW5nIGNvZGUgb2Zmc2V0cyB3aXRoIFtTb3VyY2VMb2NhdGlvbl1zIGZvciBKYXZhU2NyaXB0Ci8vLyBbTm9kZV1zLgphYnN0cmFjdCBjbGFzcyBTb3VyY2VNYXBwZXIgewogIC8vLyBBc3NvY2lhdGUgW2NvZGVPZmZzZXRdIHdpdGggW3NvdXJjZUxvY2F0aW9uXSBmb3IgW25vZGVdLgogIHZvaWQgcmVnaXN0ZXIoTm9kZSBub2RlLCBpbnQgY29kZU9mZnNldCwgU291cmNlTG9jYXRpb24gc291cmNlTG9jYXRpb24pOwoKICAvLy8gQXNzb2NpYXRlIFtjb2RlT2Zmc2V0XSB3aXRoIGFuIGlubGluaW5nIGNhbGwgYXQgW3NvdXJjZUxvY2F0aW9uXS4KICB2b2lkIHJlZ2lzdGVyUHVzaCgKICAgICAgaW50IGNvZGVPZmZzZXQsIFNvdXJjZUxvY2F0aW9uIHNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgaW5saW5lZE1ldGhvZE5hbWUpOwoKICAvLy8gQXNzb2NpYXRlIFtjb2RlT2Zmc2V0XSB3aXRoIGFuIGlubGluaW5nIHJldHVybi4KICAvLy8KICAvLy8gSWYgW2lzRW1wdHldIGlzIHRydWUsIGFsc28gYXNzb2NpYXRlIHRoYXQgdGhlIGlubGluaW5nIHN0YWNrIGlzIGVtcHR5IGF0CiAgLy8vIFtjb2RlT2Zmc2V0XS4KICB2b2lkIHJlZ2lzdGVyUG9wKGludCBjb2RlT2Zmc2V0LCB7Ym9vbCBpc0VtcHR5OiBmYWxzZX0pOwp9CgovLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgW1NvdXJjZU1hcHBlcl0gdGhhdCBzdG9yZXMgdGhlIGluZm9ybWF0aW9uIGRpcmVjdGx5Ci8vLyBpbnRvIGEgW1NvdXJjZUxvY2F0aW9uc10gb2JqZWN0LgpjbGFzcyBTb3VyY2VMb2NhdGlvbnNNYXBwZXIgaW1wbGVtZW50cyBTb3VyY2VNYXBwZXIgewogIGZpbmFsIFNvdXJjZUxvY2F0aW9ucyBzb3VyY2VMb2NhdGlvbnM7CgogIFNvdXJjZUxvY2F0aW9uc01hcHBlcih0aGlzLnNvdXJjZUxvY2F0aW9ucyk7CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXIoTm9kZSBub2RlLCBpbnQgY29kZU9mZnNldCwgU291cmNlTG9jYXRpb24gc291cmNlTG9jYXRpb24pIHsKICAgIHNvdXJjZUxvY2F0aW9ucy5hZGRTb3VyY2VMb2NhdGlvbihjb2RlT2Zmc2V0LCBzb3VyY2VMb2NhdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUHVzaCgKICAgICAgaW50IGNvZGVPZmZzZXQsIFNvdXJjZUxvY2F0aW9uIHNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgaW5saW5lZE1ldGhvZE5hbWUpIHsKICAgIHNvdXJjZUxvY2F0aW9ucy5hZGRQdXNoKGNvZGVPZmZzZXQsIHNvdXJjZUxvY2F0aW9uLCBpbmxpbmVkTWV0aG9kTmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUG9wKGludCBjb2RlT2Zmc2V0LCB7Ym9vbCBpc0VtcHR5OiBmYWxzZX0pIHsKICAgIHNvdXJjZUxvY2F0aW9ucy5hZGRQb3AoY29kZU9mZnNldCwgaXNFbXB0eSk7CiAgfQp9CgovLy8gQSBwcm9jZXNzb3IgdGhhdCBhc3NvY2lhdGVzIFtTb3VyY2VJbmZvcm1hdGlvbl0gd2l0aCBjb2RlIHBvc2l0aW9uIG9mCi8vLyBKYXZhU2NyaXB0IFtOb2RlXXMuCmNsYXNzIFNvdXJjZUluZm9ybWF0aW9uUHJvY2Vzc29yIGV4dGVuZHMgQ29kZVBvc2l0aW9uTGlzdGVuZXIgewogIGNvbnN0IFNvdXJjZUluZm9ybWF0aW9uUHJvY2Vzc29yKCk7CgogIC8vLyBQcm9jZXNzIHRoZSBzb3VyY2UgaW5mb3JtYXRpb24gYW5kIGNvZGUgcG9zaXRpb25zIGZvciB0aGUgW25vZGVdIGFuZCBhbGwKICAvLy8gaXRzIGNoaWxkcmVuLgogIHZvaWQgcHJvY2VzcyhOb2RlIG5vZGUsIEJ1ZmZlcmVkQ29kZU91dHB1dCBjb2RlKSB7fQp9CnsATk48ARsBIEcnRxIBSxdOLwFPS0IuMSgvBAIBPgQ/ICMBTwIBQR0gAUMGMTgBShEGMhRNAgFLDSYwAgEzQSoBKwEMMUwEAgFQDR4/SwFIFVABNgZPFDsCAU0lNikBLwEMTEMEAQwVUUwEAQw8MQQCAUoYQCYBTxQ2AgEucGFja2FnZTpjb21waWxlci9zcmMvanMvanNfc291cmNlX21hcHBpbmcuZGFydDxzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2JhY2tlbmRfaW1wYWN0LmRhcnTAAGSXLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19oZWxwZXJzLmltcGFjdDsKCmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IENvbW1vbkVsZW1lbnRzLCBFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCcgc2hvdyBJbnRlcmZhY2VUeXBlOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0JwogICAgc2hvdyBXb3JsZEltcGFjdCwgV29ybGRJbXBhY3RCdWlsZGVyLCBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL2VudW1zZXQuZGFydCc7CgovLy8gQmFja2VuZCBzcGVjaWZpYyBmZWF0dXJlcyByZXF1aXJlZCBieSBhIGJhY2tlbmQgaW1wYWN0LgplbnVtIEJhY2tlbmRGZWF0dXJlIHsKICBuZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnLAogIG5lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5LAp9CgovLy8gQSBzZXQgb2YgSmF2YVNjcmlwdCBiYWNrZW5kIGRlcGVuZGVuY2llcy4KY2xhc3MgQmFja2VuZEltcGFjdCB7CiAgZmluYWwgTGlzdDxGdW5jdGlvbkVudGl0eT4gc3RhdGljVXNlczsKICBmaW5hbCBMaXN0PEZ1bmN0aW9uRW50aXR5PiBnbG9iYWxVc2VzOwogIGZpbmFsIExpc3Q8U2VsZWN0b3I+IGR5bmFtaWNVc2VzOwogIGZpbmFsIExpc3Q8SW50ZXJmYWNlVHlwZT4gaW5zdGFudGlhdGVkVHlwZXM7CiAgZmluYWwgTGlzdDxDbGFzc0VudGl0eT4gaW5zdGFudGlhdGVkQ2xhc3NlczsKICBmaW5hbCBMaXN0PENsYXNzRW50aXR5PiBnbG9iYWxDbGFzc2VzOwogIGZpbmFsIExpc3Q8QmFja2VuZEltcGFjdD4gb3RoZXJJbXBhY3RzOwogIGZpbmFsIEVudW1TZXQ8QmFja2VuZEZlYXR1cmU+IF9mZWF0dXJlczsKCiAgY29uc3QgQmFja2VuZEltcGFjdCgKICAgICAge3RoaXMuc3RhdGljVXNlczogY29uc3QgPEZ1bmN0aW9uRW50aXR5PltdLAogICAgICB0aGlzLmdsb2JhbFVzZXM6IGNvbnN0IDxGdW5jdGlvbkVudGl0eT5bXSwKICAgICAgdGhpcy5keW5hbWljVXNlczogY29uc3QgPFNlbGVjdG9yPltdLAogICAgICB0aGlzLmluc3RhbnRpYXRlZFR5cGVzOiBjb25zdCA8SW50ZXJmYWNlVHlwZT5bXSwKICAgICAgdGhpcy5pbnN0YW50aWF0ZWRDbGFzc2VzOiBjb25zdCA8Q2xhc3NFbnRpdHk+W10sCiAgICAgIHRoaXMuZ2xvYmFsQ2xhc3NlczogY29uc3QgPENsYXNzRW50aXR5PltdLAogICAgICB0aGlzLm90aGVySW1wYWN0czogY29uc3QgPEJhY2tlbmRJbXBhY3Q+W10sCiAgICAgIEVudW1TZXQ8QmFja2VuZEZlYXR1cmU+IGZlYXR1cmVzOiBjb25zdCBFbnVtU2V0PEJhY2tlbmRGZWF0dXJlPi5maXhlZCgwKX0pCiAgICAgIDogdGhpcy5fZmVhdHVyZXMgPSBmZWF0dXJlczsKCiAgSXRlcmFibGU8QmFja2VuZEZlYXR1cmU+IGdldCBmZWF0dXJlcyA9PgogICAgICBfZmVhdHVyZXMuaXRlcmFibGUoQmFja2VuZEZlYXR1cmUudmFsdWVzKTsKCiAgV29ybGRJbXBhY3QgY3JlYXRlSW1wYWN0KEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQpIHsKICAgIFdvcmxkSW1wYWN0QnVpbGRlckltcGwgaW1wYWN0QnVpbGRlciA9IG5ldyBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsKCk7CiAgICByZWdpc3RlckltcGFjdChpbXBhY3RCdWlsZGVyLCBlbGVtZW50RW52aXJvbm1lbnQpOwogICAgcmV0dXJuIGltcGFjdEJ1aWxkZXI7CiAgfQoKICAvLy8gUmVnaXN0ZXIgdGhpcyBiYWNrZW5kIGltcGFjdCB0byB0aGUgW3dvcmxkSW1wYWN0QnVpbGRlcl0uCiAgdm9pZCByZWdpc3RlckltcGFjdChXb3JsZEltcGFjdEJ1aWxkZXIgd29ybGRJbXBhY3RCdWlsZGVyLAogICAgICBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50KSB7CiAgICBmb3IgKEZ1bmN0aW9uRW50aXR5IHN0YXRpY1VzZSBpbiBzdGF0aWNVc2VzKSB7CiAgICAgIGFzc2VydChzdGF0aWNVc2UgIT0gbnVsbCk7CiAgICAgIHdvcmxkSW1wYWN0QnVpbGRlcgogICAgICAgICAgLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2UuaW1wbGljaXRJbnZva2Uoc3RhdGljVXNlKSk7CiAgICB9CiAgICBmb3IgKEZ1bmN0aW9uRW50aXR5IHN0YXRpY1VzZSBpbiBnbG9iYWxVc2VzKSB7CiAgICAgIGFzc2VydChzdGF0aWNVc2UgIT0gbnVsbCk7CiAgICAgIHdvcmxkSW1wYWN0QnVpbGRlcgogICAgICAgICAgLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2UuaW1wbGljaXRJbnZva2Uoc3RhdGljVXNlKSk7CiAgICB9CiAgICBmb3IgKFNlbGVjdG9yIHNlbGVjdG9yIGluIGR5bmFtaWNVc2VzKSB7CiAgICAgIGFzc2VydChzZWxlY3RvciAhPSBudWxsKTsKICAgICAgd29ybGRJbXBhY3RCdWlsZGVyCiAgICAgICAgICAucmVnaXN0ZXJEeW5hbWljVXNlKG5ldyBEeW5hbWljVXNlKHNlbGVjdG9yLCBudWxsLCBjb25zdCBbXSkpOwogICAgfQogICAgZm9yIChJbnRlcmZhY2VUeXBlIGluc3RhbnRpYXRlZFR5cGUgaW4gaW5zdGFudGlhdGVkVHlwZXMpIHsKICAgICAgd29ybGRJbXBhY3RCdWlsZGVyCiAgICAgICAgICAucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24oaW5zdGFudGlhdGVkVHlwZSkpOwogICAgfQogICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gaW5zdGFudGlhdGVkQ2xhc3NlcykgewogICAgICB3b3JsZEltcGFjdEJ1aWxkZXIucmVnaXN0ZXJUeXBlVXNlKAogICAgICAgICAgbmV3IFR5cGVVc2UuaW5zdGFudGlhdGlvbihlbGVtZW50RW52aXJvbm1lbnQuZ2V0UmF3VHlwZShjbHMpKSk7CiAgICB9CiAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBnbG9iYWxDbGFzc2VzKSB7CiAgICAgIHdvcmxkSW1wYWN0QnVpbGRlci5yZWdpc3RlclR5cGVVc2UoCiAgICAgICAgICBuZXcgVHlwZVVzZS5pbnN0YW50aWF0aW9uKGVsZW1lbnRFbnZpcm9ubWVudC5nZXRSYXdUeXBlKGNscykpKTsKICAgIH0KICAgIGZvciAoQmFja2VuZEltcGFjdCBvdGhlckltcGFjdCBpbiBvdGhlckltcGFjdHMpIHsKICAgICAgb3RoZXJJbXBhY3QucmVnaXN0ZXJJbXBhY3Qod29ybGRJbXBhY3RCdWlsZGVyLCBlbGVtZW50RW52aXJvbm1lbnQpOwogICAgfQogIH0KfQoKLy8vIFRoZSBKYXZhU2NyaXB0IGJhY2tlbmQgZGVwZW5kZW5jaWVzIGZvciB2YXJpb3VzIGZlYXR1cmVzLgpjbGFzcyBCYWNrZW5kSW1wYWN0cyB7CiAgZmluYWwgQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwogIGZpbmFsIGJvb2wgX25ld1J0aTsKCiAgQmFja2VuZEltcGFjdHModGhpcy5fY29tbW9uRWxlbWVudHMsIHRoaXMuX25ld1J0aSk7CgogIEJhY2tlbmRJbXBhY3QgX2dldFJ1bnRpbWVUeXBlQXJndW1lbnQ7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGdldFJ1bnRpbWVUeXBlQXJndW1lbnQgewogICAgcmV0dXJuIF9nZXRSdW50aW1lVHlwZUFyZ3VtZW50ID8/PSBuZXcgQmFja2VuZEltcGFjdChnbG9iYWxVc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy5nZXRSdW50aW1lVHlwZUFyZ3VtZW50SW50ZXJjZXB0ZWQsCiAgICAgIF9jb21tb25FbGVtZW50cy5nZXRSdW50aW1lVHlwZUFyZ3VtZW50LAogICAgICBfY29tbW9uRWxlbWVudHMuZ2V0VHlwZUFyZ3VtZW50QnlJbmRleCwKICAgIF0sIG90aGVySW1wYWN0czogbmV3UnRpSW1wYWN0cygnZ2V0UnVudGltZVR5cGVBcmd1bWVudCcpKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2NvbXB1dGVTaWduYXR1cmU7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGNvbXB1dGVTaWduYXR1cmUgewogICAgcmV0dXJuIF9jb21wdXRlU2lnbmF0dXJlID8/PSBuZXcgQmFja2VuZEltcGFjdChnbG9iYWxVc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy5zZXRSdW50aW1lVHlwZUluZm8sCiAgICAgIF9jb21tb25FbGVtZW50cy5nZXRSdW50aW1lVHlwZUluZm8sCiAgICAgIF9jb21tb25FbGVtZW50cy5jb21wdXRlU2lnbmF0dXJlLAogICAgICBfY29tbW9uRWxlbWVudHMuZ2V0UnVudGltZVR5cGVBcmd1bWVudHMsCiAgICBdLCBvdGhlckltcGFjdHM6IFsKICAgICAgbGlzdFZhbHVlcwogICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9tYWluV2l0aEFyZ3VtZW50czsKCiAgQmFja2VuZEltcGFjdCBnZXQgbWFpbldpdGhBcmd1bWVudHMgewogICAgcmV0dXJuIF9tYWluV2l0aEFyZ3VtZW50cyA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoaW5zdGFudGlhdGVkQ2xhc3NlczogWwogICAgICBfY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzLAogICAgICBfY29tbW9uRWxlbWVudHMuanNTdHJpbmdDbGFzcwogICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9hc3luY0JvZHk7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGFzeW5jQm9keSA9PiBfYXN5bmNCb2R5ID8/PSBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmFzeW5jSGVscGVyQXdhaXQsCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmFzeW5jSGVscGVyUmV0dXJuLAogICAgICAgIF9jb21tb25FbGVtZW50cy5hc3luY0hlbHBlclJldGhyb3csCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnN0cmVhbUl0ZXJhdG9yQ29uc3RydWN0b3IsCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLndyYXBCb2R5LAogICAgICAgIF9jb21tb25FbGVtZW50cy5hc3luY0hlbHBlclN0YXJ0U3luYwogICAgICBdKTsKCiAgQmFja2VuZEltcGFjdCBfc3luY1N0YXJCb2R5OwoKICBCYWNrZW5kSW1wYWN0IGdldCBzeW5jU3RhckJvZHkgewogICAgcmV0dXJuIF9zeW5jU3RhckJvZHkgPz89IG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLmVuZE9mSXRlcmF0aW9uLAogICAgICBfY29tbW9uRWxlbWVudHMueWllbGRTdGFyLAogICAgICBfY29tbW9uRWxlbWVudHMuc3luY1N0YXJVbmNhdWdodEVycm9yLAogICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9hc3luY1N0YXJCb2R5OwoKICBCYWNrZW5kSW1wYWN0IGdldCBhc3luY1N0YXJCb2R5IHsKICAgIHJldHVybiBfYXN5bmNTdGFyQm9keSA/Pz0gbmV3IEJhY2tlbmRJbXBhY3Qoc3RhdGljVXNlczogWwogICAgICBfY29tbW9uRWxlbWVudHMuYXN5bmNTdGFySGVscGVyLAogICAgICBfY29tbW9uRWxlbWVudHMuc3RyZWFtT2ZDb250cm9sbGVyLAogICAgICBfY29tbW9uRWxlbWVudHMueWllbGRTaW5nbGUsCiAgICAgIF9jb21tb25FbGVtZW50cy55aWVsZFN0YXIsCiAgICAgIF9jb21tb25FbGVtZW50cy5zdHJlYW1JdGVyYXRvckNvbnN0cnVjdG9yLAogICAgICBfY29tbW9uRWxlbWVudHMud3JhcEJvZHksCiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3R5cGVWYXJpYWJsZUJvdW5kQ2hlY2s7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IHR5cGVWYXJpYWJsZUJvdW5kQ2hlY2sgewogICAgcmV0dXJuIF90eXBlVmFyaWFibGVCb3VuZENoZWNrID8/PSBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy50aHJvd1R5cGVFcnJvciwKICAgICAgX2NvbW1vbkVsZW1lbnRzLmFzc2VydElzU3VidHlwZSwKICAgICAgaWYgKF9uZXdSdGkpIF9jb21tb25FbGVtZW50cy5jaGVja1R5cGVCb3VuZCwKICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfYWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb247CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uIHsKICAgIHJldHVybiBfYWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24gPz89IG5ldyBCYWNrZW5kSW1wYWN0KAogICAgICAgIHN0YXRpY1VzZXM6IFtfY29tbW9uRWxlbWVudHMudGhyb3dBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yXSwKICAgICAgICBvdGhlckltcGFjdHM6IFtfbmVlZHNTdHJpbmcoJ05lZWRlZCB0byBlbmNvZGUgdGhlIG1lc3NhZ2UuJyldKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2ZhbGxUaHJvdWdoRXJyb3I7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGZhbGxUaHJvdWdoRXJyb3IgewogICAgcmV0dXJuIF9mYWxsVGhyb3VnaEVycm9yID8/PQogICAgICAgIG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFtfY29tbW9uRWxlbWVudHMuZmFsbFRocm91Z2hFcnJvcl0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfYXNDaGVjazsKCiAgQmFja2VuZEltcGFjdCBnZXQgYXNDaGVjayB7CiAgICByZXR1cm4gX2FzQ2hlY2sgPz89IG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLnRocm93UnVudGltZUVycm9yLAogICAgXSwgb3RoZXJJbXBhY3RzOiBuZXdSdGlJbXBhY3RzKCdhc0NoZWNrJykpOwogIH0KCiAgQmFja2VuZEltcGFjdCBfdGhyb3dOb1N1Y2hNZXRob2Q7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IHRocm93Tm9TdWNoTWV0aG9kIHsKICAgIHJldHVybiBfdGhyb3dOb1N1Y2hNZXRob2QgPz89IG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLnRocm93Tm9TdWNoTWV0aG9kLAogICAgXSwgb3RoZXJJbXBhY3RzOiBbCiAgICAgIC8vIEFsc28gcmVnaXN0ZXIgdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoaXMgbWV0aG9kLgogICAgICBfbmVlZHNMaXN0KCdOZWVkZWQgdG8gZW5jb2RlIHRoZSBhcmd1bWVudHMgZm9yIHRocm93IE5vU3VjaE1ldGhvZEVycm9yLicpLAogICAgICBfbmVlZHNTdHJpbmcoJ05lZWRlZCB0byBlbmNvZGUgdGhlIG5hbWUgZm9yIHRocm93IE5vU3VjaE1ldGhvZEVycm9yLicpLAogICAgICBtYXBMaXRlcmFsQ2xhc3MsIC8vIG5vU3VjaE1ldGhvZCBoZWxwZXJzIGFyZSBwYXNzZWQgYSBNYXAuCiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3N0cmluZ1ZhbHVlczsKCiAgQmFja2VuZEltcGFjdCBnZXQgc3RyaW5nVmFsdWVzIHsKICAgIHJldHVybiBfc3RyaW5nVmFsdWVzID8/PQogICAgICAgIG5ldyBCYWNrZW5kSW1wYWN0KGluc3RhbnRpYXRlZENsYXNzZXM6IFtfY29tbW9uRWxlbWVudHMuanNTdHJpbmdDbGFzc10pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfbnVtVmFsdWVzOwoKICBCYWNrZW5kSW1wYWN0IGdldCBudW1WYWx1ZXMgewogICAgcmV0dXJuIF9udW1WYWx1ZXMgPz89IG5ldyBCYWNrZW5kSW1wYWN0KGluc3RhbnRpYXRlZENsYXNzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzSW50Q2xhc3MsCiAgICAgIF9jb21tb25FbGVtZW50cy5qc1Bvc2l0aXZlSW50Q2xhc3MsCiAgICAgIF9jb21tb25FbGVtZW50cy5qc1VJbnQzMkNsYXNzLAogICAgICBfY29tbW9uRWxlbWVudHMuanNVSW50MzFDbGFzcywKICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzTnVtYmVyQ2xhc3MsCiAgICAgIF9jb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzCiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGludFZhbHVlcyA9PiBudW1WYWx1ZXM7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGRvdWJsZVZhbHVlcyA9PiBudW1WYWx1ZXM7CgogIEJhY2tlbmRJbXBhY3QgX2Jvb2xWYWx1ZXM7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGJvb2xWYWx1ZXMgewogICAgcmV0dXJuIF9ib29sVmFsdWVzID8/PQogICAgICAgIG5ldyBCYWNrZW5kSW1wYWN0KGluc3RhbnRpYXRlZENsYXNzZXM6IFtfY29tbW9uRWxlbWVudHMuanNCb29sQ2xhc3NdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX251bGxWYWx1ZTsKCiAgQmFja2VuZEltcGFjdCBnZXQgbnVsbFZhbHVlIHsKICAgIHJldHVybiBfbnVsbFZhbHVlID8/PQogICAgICAgIG5ldyBCYWNrZW5kSW1wYWN0KGluc3RhbnRpYXRlZENsYXNzZXM6IFtfY29tbW9uRWxlbWVudHMuanNOdWxsQ2xhc3NdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2xpc3RWYWx1ZXM7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGxpc3RWYWx1ZXMgewogICAgcmV0dXJuIF9saXN0VmFsdWVzID8/PSBuZXcgQmFja2VuZEltcGFjdChnbG9iYWxDbGFzc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MsCiAgICAgIF9jb21tb25FbGVtZW50cy5qc011dGFibGVBcnJheUNsYXNzLAogICAgICBfY29tbW9uRWxlbWVudHMuanNGaXhlZEFycmF5Q2xhc3MsCiAgICAgIF9jb21tb25FbGVtZW50cy5qc0V4dGVuZGFibGVBcnJheUNsYXNzLAogICAgICBfY29tbW9uRWxlbWVudHMuanNVbm1vZGlmaWFibGVBcnJheUNsYXNzCiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3Rocm93UnVudGltZUVycm9yOwoKICBCYWNrZW5kSW1wYWN0IGdldCB0aHJvd1J1bnRpbWVFcnJvciB7CiAgICByZXR1cm4gX3Rocm93UnVudGltZUVycm9yID8/PSBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy50aHJvd1J1bnRpbWVFcnJvciwKICAgIF0sIG90aGVySW1wYWN0czogWwogICAgICAvLyBBbHNvIHJlZ2lzdGVyIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4KICAgICAgc3RyaW5nVmFsdWVzCiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3Rocm93VW5zdXBwb3J0ZWRFcnJvcjsKCiAgQmFja2VuZEltcGFjdCBnZXQgdGhyb3dVbnN1cHBvcnRlZEVycm9yIHsKICAgIHJldHVybiBfdGhyb3dVbnN1cHBvcnRlZEVycm9yID8/PSBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy50aHJvd1Vuc3VwcG9ydGVkRXJyb3IKICAgIF0sIG90aGVySW1wYWN0czogWwogICAgICAvLyBBbHNvIHJlZ2lzdGVyIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4KICAgICAgc3RyaW5nVmFsdWVzCiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3N1cGVyTm9TdWNoTWV0aG9kOwoKICBCYWNrZW5kSW1wYWN0IGdldCBzdXBlck5vU3VjaE1ldGhvZCB7CiAgICByZXR1cm4gX3N1cGVyTm9TdWNoTWV0aG9kID8/PSBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy5jcmVhdGVJbnZvY2F0aW9uTWlycm9yLAogICAgICBfY29tbW9uRWxlbWVudHMub2JqZWN0Tm9TdWNoTWV0aG9kCiAgICBdLCBvdGhlckltcGFjdHM6IFsKICAgICAgX25lZWRzSW50KCdOZWVkZWQgdG8gZW5jb2RlIHRoZSBpbnZvY2F0aW9uIGtpbmQgb2Ygc3VwZXIubm9TdWNoTWV0aG9kLicpLAogICAgICBfbmVlZHNMaXN0KCdOZWVkZWQgdG8gZW5jb2RlIHRoZSBhcmd1bWVudHMgb2Ygc3VwZXIubm9TdWNoTWV0aG9kLicpLAogICAgICBfbmVlZHNTdHJpbmcoJ05lZWRlZCB0byBlbmNvZGUgdGhlIG5hbWUgb2Ygc3VwZXIubm9TdWNoTWV0aG9kLicpCiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2NvbnN0YW50TWFwTGl0ZXJhbDsKCiAgQmFja2VuZEltcGFjdCBnZXQgY29uc3RhbnRNYXBMaXRlcmFsIHsKICAgIHJldHVybiBfY29uc3RhbnRNYXBMaXRlcmFsID8/PSBuZXcgQmFja2VuZEltcGFjdChpbnN0YW50aWF0ZWRDbGFzc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy5jb25zdGFudE1hcENsYXNzLAogICAgICBfY29tbW9uRWxlbWVudHMuY29uc3RhbnRQcm90b01hcENsYXNzLAogICAgICBfY29tbW9uRWxlbWVudHMuY29uc3RhbnRTdHJpbmdNYXBDbGFzcywKICAgICAgX2NvbW1vbkVsZW1lbnRzLmdlbmVyYWxDb25zdGFudE1hcENsYXNzLAogICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9jb25zdGFudFNldExpdGVyYWw7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGNvbnN0YW50U2V0TGl0ZXJhbCA9PgogICAgICBfY29uc3RhbnRTZXRMaXRlcmFsID8/PSBuZXcgQmFja2VuZEltcGFjdChpbnN0YW50aWF0ZWRDbGFzc2VzOiBbCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmNvbnN0U2V0TGl0ZXJhbENsYXNzLAogICAgICBdLCBvdGhlckltcGFjdHM6IFsKICAgICAgICBjb25zdGFudE1hcExpdGVyYWwKICAgICAgXSk7CgogIEJhY2tlbmRJbXBhY3QgX3N5bWJvbENvbnN0cnVjdG9yOwoKICBCYWNrZW5kSW1wYWN0IGdldCBzeW1ib2xDb25zdHJ1Y3RvciB7CiAgICByZXR1cm4gX3N5bWJvbENvbnN0cnVjdG9yID8/PSBuZXcgQmFja2VuZEltcGFjdCgKICAgICAgICBzdGF0aWNVc2VzOiBbX2NvbW1vbkVsZW1lbnRzLnN5bWJvbFZhbGlkYXRlZENvbnN0cnVjdG9yXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9jb25zdFN5bWJvbDsKCiAgQmFja2VuZEltcGFjdCBnZXQgY29uc3RTeW1ib2wgewogICAgcmV0dXJuIF9jb25zdFN5bWJvbCA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoCiAgICAgICAgaW5zdGFudGlhdGVkQ2xhc3NlczogW19jb21tb25FbGVtZW50cy5zeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzXSwKICAgICAgICBzdGF0aWNVc2VzOiBbX2NvbW1vbkVsZW1lbnRzLnN5bWJvbENvbnN0cnVjdG9yVGFyZ2V0XSk7CiAgfQoKICAvLy8gSGVscGVyIGZvciByZWdpc3RlcmluZyB0aGF0IGBpbnRgIGlzIG5lZWRlZC4KICBCYWNrZW5kSW1wYWN0IF9uZWVkc0ludChTdHJpbmcgcmVhc29uKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZWdpc3RlciBbcmVhc29uXSBmb3IgdXNlIGluIGR1bXAtaW5mby4KICAgIHJldHVybiBpbnRWYWx1ZXM7CiAgfQoKICAvLy8gSGVscGVyIGZvciByZWdpc3RlcmluZyB0aGF0IGBMaXN0YCBpcyBuZWVkZWQuCiAgQmFja2VuZEltcGFjdCBfbmVlZHNMaXN0KFN0cmluZyByZWFzb24pIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlZ2lzdGVyIFtyZWFzb25dIGZvciB1c2UgaW4gZHVtcC1pbmZvLgogICAgcmV0dXJuIGxpc3RWYWx1ZXM7CiAgfQoKICAvLy8gSGVscGVyIGZvciByZWdpc3RlcmluZyB0aGF0IGBTdHJpbmdgIGlzIG5lZWRlZC4KICBCYWNrZW5kSW1wYWN0IF9uZWVkc1N0cmluZyhTdHJpbmcgcmVhc29uKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZWdpc3RlciBbcmVhc29uXSBmb3IgdXNlIGluIGR1bXAtaW5mby4KICAgIHJldHVybiBzdHJpbmdWYWx1ZXM7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9hc3NlcnRXaXRob3V0TWVzc2FnZTsKCiAgQmFja2VuZEltcGFjdCBnZXQgYXNzZXJ0V2l0aG91dE1lc3NhZ2UgewogICAgcmV0dXJuIF9hc3NlcnRXaXRob3V0TWVzc2FnZSA/Pz0KICAgICAgICBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbX2NvbW1vbkVsZW1lbnRzLmFzc2VydEhlbHBlcl0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfYXNzZXJ0V2l0aE1lc3NhZ2U7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGFzc2VydFdpdGhNZXNzYWdlIHsKICAgIHJldHVybiBfYXNzZXJ0V2l0aE1lc3NhZ2UgPz89IG5ldyBCYWNrZW5kSW1wYWN0KAogICAgICAgIHN0YXRpY1VzZXM6IFtfY29tbW9uRWxlbWVudHMuYXNzZXJ0VGVzdCwgX2NvbW1vbkVsZW1lbnRzLmFzc2VydFRocm93XSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9hc3luY0ZvckluOwoKICBCYWNrZW5kSW1wYWN0IGdldCBhc3luY0ZvckluIHsKICAgIHJldHVybiBfYXN5bmNGb3JJbiA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoCiAgICAgICAgc3RhdGljVXNlczogW19jb21tb25FbGVtZW50cy5zdHJlYW1JdGVyYXRvckNvbnN0cnVjdG9yXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9zdHJpbmdJbnRlcnBvbGF0aW9uOwoKICBCYWNrZW5kSW1wYWN0IGdldCBzdHJpbmdJbnRlcnBvbGF0aW9uIHsKICAgIHJldHVybiBfc3RyaW5nSW50ZXJwb2xhdGlvbiA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoCiAgICAgICAgZHluYW1pY1VzZXM6IFtTZWxlY3RvcnMudG9TdHJpbmdfXSwKICAgICAgICBzdGF0aWNVc2VzOiBbX2NvbW1vbkVsZW1lbnRzLnN0cmluZ0ludGVycG9sYXRpb25IZWxwZXJdLAogICAgICAgIG90aGVySW1wYWN0czogW19uZWVkc1N0cmluZygnU3RyaW5ncyBhcmUgY3JlYXRlZC4nKV0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfc3RyaW5nSnV4dGFwb3NpdGlvbjsKCiAgQmFja2VuZEltcGFjdCBnZXQgc3RyaW5nSnV4dGFwb3NpdGlvbiB7CiAgICByZXR1cm4gX3N0cmluZ0p1eHRhcG9zaXRpb24gPz89IF9uZWVkc1N0cmluZygnU3RyaW5nLmNvbmNhdCBpcyB1c2VkLicpOwogIH0KCiAgQmFja2VuZEltcGFjdCBnZXQgbnVsbExpdGVyYWwgPT4gbnVsbFZhbHVlOwoKICBCYWNrZW5kSW1wYWN0IGdldCBib29sTGl0ZXJhbCA9PiBib29sVmFsdWVzOwoKICBCYWNrZW5kSW1wYWN0IGdldCBpbnRMaXRlcmFsID0+IGludFZhbHVlczsKCiAgQmFja2VuZEltcGFjdCBnZXQgZG91YmxlTGl0ZXJhbCA9PiBkb3VibGVWYWx1ZXM7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IHN0cmluZ0xpdGVyYWwgPT4gc3RyaW5nVmFsdWVzOwoKICBCYWNrZW5kSW1wYWN0IF9jYXRjaFN0YXRlbWVudDsKCiAgQmFja2VuZEltcGFjdCBnZXQgY2F0Y2hTdGF0ZW1lbnQgewogICAgcmV0dXJuIF9jYXRjaFN0YXRlbWVudCA/Pz0gbmV3IEJhY2tlbmRJbXBhY3Qoc3RhdGljVXNlczogWwogICAgICBfY29tbW9uRWxlbWVudHMuZXhjZXB0aW9uVW53cmFwcGVyCiAgICBdLCBpbnN0YW50aWF0ZWRDbGFzc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy5qc1BsYWluSmF2YVNjcmlwdE9iamVjdENsYXNzLAogICAgICBfY29tbW9uRWxlbWVudHMuanNVbmtub3duSmF2YVNjcmlwdE9iamVjdENsYXNzCiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3Rocm93RXhwcmVzc2lvbjsKCiAgQmFja2VuZEltcGFjdCBnZXQgdGhyb3dFeHByZXNzaW9uIHsKICAgIHJldHVybiBfdGhyb3dFeHByZXNzaW9uID8/PSBuZXcgQmFja2VuZEltcGFjdCgKICAgICAgICAvLyBXZSBkb24ndCBrbm93IGFoZWFkIG9mIHRpbWUgd2hldGhlciB3ZSB3aWxsIG5lZWQgdGhlIHRocm93IGluIGEKICAgICAgICAvLyBzdGF0ZW1lbnQgY29udGV4dCBvciBhbiBleHByZXNzaW9uIGNvbnRleHQsIHNvIHdlIHJlZ2lzdGVyIGJvdGgKICAgICAgICAvLyBoZXJlLCBldmVuIHRob3VnaCB3ZSBtYXkgbm90IG5lZWQgdGhlIHRocm93RXhwcmVzc2lvbiBoZWxwZXIuCiAgICAgICAgc3RhdGljVXNlczogWwogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLndyYXBFeGNlcHRpb25IZWxwZXIsCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMudGhyb3dFeHByZXNzaW9uSGVscGVyCiAgICAgICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9sYXp5RmllbGQ7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGxhenlGaWVsZCB7CiAgICByZXR1cm4gX2xhenlGaWVsZCA/Pz0KICAgICAgICBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbX2NvbW1vbkVsZW1lbnRzLmN5Y2xpY1Rocm93SGVscGVyXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF90eXBlTGl0ZXJhbDsKCiAgQmFja2VuZEltcGFjdCBnZXQgdHlwZUxpdGVyYWwgewogICAgcmV0dXJuIF90eXBlTGl0ZXJhbCA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoaW5zdGFudGlhdGVkQ2xhc3NlczogWwogICAgICBfY29tbW9uRWxlbWVudHMudHlwZUxpdGVyYWxDbGFzcwogICAgXSwgc3RhdGljVXNlczogWwogICAgICBfY29tbW9uRWxlbWVudHMuY3JlYXRlUnVudGltZVR5cGUsCiAgICAgIGlmIChfbmV3UnRpKSBfY29tbW9uRWxlbWVudHMudHlwZUxpdGVyYWxNYWtlciwKICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfc3RhY2tUcmFjZUluQ2F0Y2g7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IHN0YWNrVHJhY2VJbkNhdGNoIHsKICAgIHJldHVybiBfc3RhY2tUcmFjZUluQ2F0Y2ggPz89IG5ldyBCYWNrZW5kSW1wYWN0KAogICAgICAgIGluc3RhbnRpYXRlZENsYXNzZXM6IFtfY29tbW9uRWxlbWVudHMuc3RhY2tUcmFjZUhlbHBlckNsYXNzXSwKICAgICAgICBzdGF0aWNVc2VzOiBbX2NvbW1vbkVsZW1lbnRzLnRyYWNlRnJvbUV4Y2VwdGlvbl0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfc3luY0ZvckluOwoKICBCYWNrZW5kSW1wYWN0IGdldCBzeW5jRm9ySW4gewogICAgcmV0dXJuIF9zeW5jRm9ySW4gPz89IG5ldyBCYWNrZW5kSW1wYWN0KAogICAgICAgIC8vIFRoZSBTU0EgYnVpbGRlciByZWNvZ25pemVzIGNlcnRhaW4gZm9yLWluIGxvb3BzIGFuZCBjYW4gZ2VuZXJhdGUKICAgICAgICAvLyBjYWxscyB0byB0aHJvd0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvci4KICAgICAgICBzdGF0aWNVc2VzOiBbX2NvbW1vbkVsZW1lbnRzLmNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF90eXBlVmFyaWFibGVFeHByZXNzaW9uOwoKICBCYWNrZW5kSW1wYWN0IGdldCB0eXBlVmFyaWFibGVFeHByZXNzaW9uIHsKICAgIHJldHVybiBfdHlwZVZhcmlhYmxlRXhwcmVzc2lvbiA/Pz0gbmV3IEJhY2tlbmRJbXBhY3Qoc3RhdGljVXNlczogWwogICAgICBfY29tbW9uRWxlbWVudHMuc2V0UnVudGltZVR5cGVJbmZvLAogICAgICBfY29tbW9uRWxlbWVudHMuZ2V0UnVudGltZVR5cGVJbmZvLAogICAgICBfY29tbW9uRWxlbWVudHMuY3JlYXRlUnVudGltZVR5cGUKICAgIF0sIG90aGVySW1wYWN0czogWwogICAgICBsaXN0VmFsdWVzLAogICAgICBnZXRSdW50aW1lVHlwZUFyZ3VtZW50LAogICAgICBfbmVlZHNJbnQoJ05lZWRlZCBmb3IgYWNjZXNzaW5nIGEgdHlwZSB2YXJpYWJsZSBsaXRlcmFsIG9uIHRoaXMuJykKICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfdHlwZUNoZWNrOwoKICBCYWNrZW5kSW1wYWN0IGdldCB0eXBlQ2hlY2sgewogICAgcmV0dXJuIF90eXBlQ2hlY2sgPz89IG5ldyBCYWNrZW5kSW1wYWN0KG90aGVySW1wYWN0czogW2Jvb2xWYWx1ZXNdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2dlbmVyaWNUeXBlQ2hlY2s7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGdlbmVyaWNUeXBlQ2hlY2sgewogICAgcmV0dXJuIF9nZW5lcmljVHlwZUNoZWNrID8/PSBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy5jaGVja1N1YnR5cGUsCiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEludmVzdGlnYXRlIHdoeSB0aGlzIGlzIG5lZWRlZC4KICAgICAgX2NvbW1vbkVsZW1lbnRzLnNldFJ1bnRpbWVUeXBlSW5mbywKICAgICAgX2NvbW1vbkVsZW1lbnRzLmdldFJ1bnRpbWVUeXBlSW5mbwogICAgXSwgb3RoZXJJbXBhY3RzOiBbCiAgICAgIGxpc3RWYWx1ZXMsCiAgICAgIGdldFJ1bnRpbWVUeXBlQXJndW1lbnQKICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfZ2VuZXJpY0lzQ2hlY2s7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGdlbmVyaWNJc0NoZWNrIHsKICAgIHJldHVybiBfZ2VuZXJpY0lzQ2hlY2sgPz89IG5ldyBCYWNrZW5kSW1wYWN0KG90aGVySW1wYWN0czogW2ludFZhbHVlc10pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfdHlwZVZhcmlhYmxlVHlwZUNoZWNrOwoKICBCYWNrZW5kSW1wYWN0IGdldCB0eXBlVmFyaWFibGVUeXBlQ2hlY2sgewogICAgcmV0dXJuIF90eXBlVmFyaWFibGVUeXBlQ2hlY2sgPz89IG5ldyBCYWNrZW5kSW1wYWN0KAogICAgICAgIHN0YXRpY1VzZXM6IFtfY29tbW9uRWxlbWVudHMuY2hlY2tTdWJ0eXBlT2ZSdW50aW1lVHlwZV0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfZnVuY3Rpb25UeXBlQ2hlY2s7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGZ1bmN0aW9uVHlwZUNoZWNrIHsKICAgIHJldHVybiBfZnVuY3Rpb25UeXBlQ2hlY2sgPz89CiAgICAgICAgbmV3IEJhY2tlbmRJbXBhY3Qoc3RhdGljVXNlczogWy8qaGVscGVycy5mdW5jdGlvblR5cGVUZXN0TWV0YUhlbHBlciovXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9mdXR1cmVPclR5cGVDaGVjazsKCiAgQmFja2VuZEltcGFjdCBnZXQgZnV0dXJlT3JUeXBlQ2hlY2sgewogICAgcmV0dXJuIF9mdXR1cmVPclR5cGVDaGVjayA/Pz0KICAgICAgICBuZXcgQmFja2VuZEltcGFjdChzdGF0aWNVc2VzOiBbX2NvbW1vbkVsZW1lbnRzLmZ1dHVyZU9yVGVzdF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfbmF0aXZlVHlwZUNoZWNrOwoKICBCYWNrZW5kSW1wYWN0IGdldCBuYXRpdmVUeXBlQ2hlY2sgewogICAgcmV0dXJuIF9uYXRpdmVUeXBlQ2hlY2sgPz89IG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFsKICAgICAgLy8gV2Ugd2lsbCBuZWVkIHRvIGFkZCB0aGUgIiRpcyIgYW5kICIkYXMiIHByb3BlcnRpZXMgb24gdGhlCiAgICAgIC8vIEphdmFTY3JpcHQgb2JqZWN0IHByb3RvdHlwZSwgc28gd2UgbWFrZSBzdXJlCiAgICAgIC8vIFs6ZGVmaW5lUHJvcGVydHk6XSBpcyBjb21waWxlZC4KICAgICAgX2NvbW1vbkVsZW1lbnRzLmRlZmluZVByb3BlcnR5CiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2Nsb3N1cmU7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGNsb3N1cmUgewogICAgcmV0dXJuIF9jbG9zdXJlID8/PQogICAgICAgIG5ldyBCYWNrZW5kSW1wYWN0KGluc3RhbnRpYXRlZENsYXNzZXM6IFtfY29tbW9uRWxlbWVudHMuZnVuY3Rpb25DbGFzc10pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfaW50ZXJjZXB0b3JVc2U7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGludGVyY2VwdG9yVXNlIHsKICAgIHJldHVybiBfaW50ZXJjZXB0b3JVc2UgPz89IG5ldyBCYWNrZW5kSW1wYWN0KAogICAgICAgIHN0YXRpY1VzZXM6IFsKICAgICAgICAgIF9jb21tb25FbGVtZW50cy5nZXROYXRpdmVJbnRlcmNlcHRvck1ldGhvZAogICAgICAgIF0sCiAgICAgICAgaW5zdGFudGlhdGVkQ2xhc3NlczogWwogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdE9iamVjdENsYXNzLAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmpzUGxhaW5KYXZhU2NyaXB0T2JqZWN0Q2xhc3MsCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuanNKYXZhU2NyaXB0RnVuY3Rpb25DbGFzcwogICAgICAgIF0sCiAgICAgICAgZmVhdHVyZXM6IG5ldyBFbnVtU2V0PEJhY2tlbmRGZWF0dXJlPi5mcm9tVmFsdWVzKFsKICAgICAgICAgIEJhY2tlbmRGZWF0dXJlLm5lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5LAogICAgICAgICAgQmFja2VuZEZlYXR1cmUubmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZwogICAgICAgIF0sIGZpeGVkOiB0cnVlKSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9udW1DbGFzc2VzOwoKICBCYWNrZW5kSW1wYWN0IGdldCBudW1DbGFzc2VzIHsKICAgIHJldHVybiBfbnVtQ2xhc3NlcyA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoCiAgICAgICAgLy8gVGhlIGJhY2tlbmQgd2lsbCB0cnkgdG8gb3B0aW1pemUgbnVtYmVyIG9wZXJhdGlvbnMgYW5kIHVzZSB0aGUKICAgICAgICAvLyBgaWFlYCBoZWxwZXIgZGlyZWN0bHkuCiAgICAgICAgZ2xvYmFsVXNlczogW19jb21tb25FbGVtZW50cy50aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfbGlzdE9yU3RyaW5nQ2xhc3NlczsKCiAgQmFja2VuZEltcGFjdCBnZXQgbGlzdE9yU3RyaW5nQ2xhc3NlcyB7CiAgICByZXR1cm4gX2xpc3RPclN0cmluZ0NsYXNzZXMgPz89IG5ldyBCYWNrZW5kSW1wYWN0KAogICAgICAgIC8vIFRoZSBiYWNrZW5kIHdpbGwgdHJ5IHRvIG9wdGltaXplIGFycmF5IGFuZCBzdHJpbmcgYWNjZXNzIGFuZCB1c2UgdGhlCiAgICAgICAgLy8gYGlvb3JlYCBhbmQgYGlhZWAgX2NvbW1vbkVsZW1lbnRzIGRpcmVjdGx5LgogICAgICAgIGdsb2JhbFVzZXM6IFsKICAgICAgICAgIF9jb21tb25FbGVtZW50cy50aHJvd0luZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiwKICAgICAgICAgIF9jb21tb25FbGVtZW50cy50aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfZnVuY3Rpb25DbGFzczsKCiAgQmFja2VuZEltcGFjdCBnZXQgZnVuY3Rpb25DbGFzcyB7CiAgICByZXR1cm4gX2Z1bmN0aW9uQ2xhc3MgPz89CiAgICAgICAgbmV3IEJhY2tlbmRJbXBhY3QoZ2xvYmFsQ2xhc3NlczogW19jb21tb25FbGVtZW50cy5jbG9zdXJlQ2xhc3NdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX21hcENsYXNzOwoKICBCYWNrZW5kSW1wYWN0IGdldCBtYXBDbGFzcyB7CiAgICByZXR1cm4gX21hcENsYXNzID8/PSBuZXcgQmFja2VuZEltcGFjdCgKICAgICAgICAvLyBUaGUgYmFja2VuZCB3aWxsIHVzZSBhIGxpdGVyYWwgbGlzdCB0byBpbml0aWFsaXplIHRoZSBlbnRyaWVzCiAgICAgICAgLy8gb2YgdGhlIG1hcC4KICAgICAgICBnbG9iYWxDbGFzc2VzOiBbCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMubGlzdENsYXNzLAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLm1hcExpdGVyYWxDbGFzcwogICAgICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfc2V0Q2xhc3M7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IHNldENsYXNzID0+IF9zZXRDbGFzcyA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoZ2xvYmFsQ2xhc3NlczogWwogICAgICAgIC8vIFRoZSBiYWNrZW5kIHdpbGwgdXNlIGEgbGl0ZXJhbCBsaXN0IHRvIGluaXRpYWxpemUgdGhlIGVudHJpZXMKICAgICAgICAvLyBvZiB0aGUgc2V0LgogICAgICAgIF9jb21tb25FbGVtZW50cy5saXN0Q2xhc3MsCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnNldExpdGVyYWxDbGFzcywKICAgICAgXSk7CgogIEJhY2tlbmRJbXBhY3QgX2JvdW5kQ2xvc3VyZUNsYXNzOwoKICBCYWNrZW5kSW1wYWN0IGdldCBib3VuZENsb3N1cmVDbGFzcyB7CiAgICByZXR1cm4gX2JvdW5kQ2xvc3VyZUNsYXNzID8/PQogICAgICAgIG5ldyBCYWNrZW5kSW1wYWN0KGdsb2JhbENsYXNzZXM6IFtfY29tbW9uRWxlbWVudHMuYm91bmRDbG9zdXJlQ2xhc3NdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX25hdGl2ZU9yRXh0ZW5kc0NsYXNzOwoKICBCYWNrZW5kSW1wYWN0IGdldCBuYXRpdmVPckV4dGVuZHNDbGFzcyB7CiAgICByZXR1cm4gX25hdGl2ZU9yRXh0ZW5kc0NsYXNzID8/PSBuZXcgQmFja2VuZEltcGFjdChnbG9iYWxVc2VzOiBbCiAgICAgIF9jb21tb25FbGVtZW50cy5nZXROYXRpdmVJbnRlcmNlcHRvck1ldGhvZAogICAgXSwgZ2xvYmFsQ2xhc3NlczogWwogICAgICBfY29tbW9uRWxlbWVudHMuanNJbnRlcmNlcHRvckNsYXNzLAogICAgICBfY29tbW9uRWxlbWVudHMuanNKYXZhU2NyaXB0T2JqZWN0Q2xhc3MsCiAgICAgIF9jb21tb25FbGVtZW50cy5qc1BsYWluSmF2YVNjcmlwdE9iamVjdENsYXNzLAogICAgICBfY29tbW9uRWxlbWVudHMuanNKYXZhU2NyaXB0RnVuY3Rpb25DbGFzcwogICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9tYXBMaXRlcmFsQ2xhc3M7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IG1hcExpdGVyYWxDbGFzcyB7CiAgICByZXR1cm4gX21hcExpdGVyYWxDbGFzcyA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoZ2xvYmFsVXNlczogWwogICAgICBfY29tbW9uRWxlbWVudHMubWFwTGl0ZXJhbENvbnN0cnVjdG9yLAogICAgICBfY29tbW9uRWxlbWVudHMubWFwTGl0ZXJhbENvbnN0cnVjdG9yRW1wdHksCiAgICAgIF9jb21tb25FbGVtZW50cy5tYXBMaXRlcmFsVW50eXBlZE1ha2VyLAogICAgICBfY29tbW9uRWxlbWVudHMubWFwTGl0ZXJhbFVudHlwZWRFbXB0eU1ha2VyCiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3NldExpdGVyYWxDbGFzczsKCiAgQmFja2VuZEltcGFjdCBnZXQgc2V0TGl0ZXJhbENsYXNzID0+CiAgICAgIF9zZXRMaXRlcmFsQ2xhc3MgPz89IG5ldyBCYWNrZW5kSW1wYWN0KGdsb2JhbFVzZXM6IFsKICAgICAgICBfY29tbW9uRWxlbWVudHMuc2V0TGl0ZXJhbENvbnN0cnVjdG9yLAogICAgICAgIF9jb21tb25FbGVtZW50cy5zZXRMaXRlcmFsQ29uc3RydWN0b3JFbXB0eSwKICAgICAgICBfY29tbW9uRWxlbWVudHMuc2V0TGl0ZXJhbFVudHlwZWRNYWtlciwKICAgICAgICBfY29tbW9uRWxlbWVudHMuc2V0TGl0ZXJhbFVudHlwZWRFbXB0eU1ha2VyLAogICAgICBdKTsKCiAgQmFja2VuZEltcGFjdCBfY2xvc3VyZUNsYXNzOwoKICBCYWNrZW5kSW1wYWN0IGdldCBjbG9zdXJlQ2xhc3MgewogICAgcmV0dXJuIF9jbG9zdXJlQ2xhc3MgPz89CiAgICAgICAgbmV3IEJhY2tlbmRJbXBhY3QoZ2xvYmFsVXNlczogW19jb21tb25FbGVtZW50cy5jbG9zdXJlRnJvbVRlYXJPZmZdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2xpc3RDbGFzc2VzOwoKICBCYWNrZW5kSW1wYWN0IGdldCBsaXN0Q2xhc3NlcyB7CiAgICByZXR1cm4gX2xpc3RDbGFzc2VzID8/PSBuZXcgQmFja2VuZEltcGFjdCgKICAgICAgICAvLyBMaXRlcmFsIGxpc3RzIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gY2FsbHMgdG8gdGhlc2UgZnVuY3Rpb25zOgogICAgICAgIGdsb2JhbFVzZXM6IFsKICAgICAgICAgIF9jb21tb25FbGVtZW50cy5qc0FycmF5VHlwZWRDb25zdHJ1Y3RvciwKICAgICAgICAgIF9jb21tb25FbGVtZW50cy5zZXRSdW50aW1lVHlwZUluZm8sCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuZ2V0VHlwZUFyZ3VtZW50QnlJbmRleAogICAgICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfanNJbmRleGluZ0JlaGF2aW9yOwoKICBCYWNrZW5kSW1wYWN0IGdldCBqc0luZGV4aW5nQmVoYXZpb3IgewogICAgcmV0dXJuIF9qc0luZGV4aW5nQmVoYXZpb3IgPz89IG5ldyBCYWNrZW5kSW1wYWN0KAogICAgICAgIC8vIFRoZXNlIHR3byBfY29tbW9uRWxlbWVudHMgYXJlIHVzZWQgYnkgdGhlIGVtaXR0ZXIgYW5kIHRoZSBjb2RlZ2VuLgogICAgICAgIC8vIEJlY2F1c2Ugd2UgY2Fubm90IGVucXVldWUgZWxlbWVudHMgYXQgdGhlIHRpbWUgb2YgZW1pc3Npb24sCiAgICAgICAgLy8gd2UgbWFrZSBzdXJlIHRoZXkgYXJlIGFsd2F5cyBnZW5lcmF0ZWQuCiAgICAgICAgZ2xvYmFsVXNlczogW19jb21tb25FbGVtZW50cy5pc0pzSW5kZXhhYmxlXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF90cmFjZUhlbHBlcjsKCiAgQmFja2VuZEltcGFjdCBnZXQgdHJhY2VIZWxwZXIgewogICAgcmV0dXJuIF90cmFjZUhlbHBlciA/Pz0KICAgICAgICBuZXcgQmFja2VuZEltcGFjdChnbG9iYWxVc2VzOiBbX2NvbW1vbkVsZW1lbnRzLnRyYWNlSGVscGVyXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9hc3NlcnRVbnJlYWNoYWJsZTsKCiAgQmFja2VuZEltcGFjdCBnZXQgYXNzZXJ0VW5yZWFjaGFibGUgewogICAgcmV0dXJuIF9hc3NlcnRVbnJlYWNoYWJsZSA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoCiAgICAgICAgZ2xvYmFsVXNlczogW19jb21tb25FbGVtZW50cy5hc3NlcnRVbnJlYWNoYWJsZU1ldGhvZF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfcnVudGltZVR5cGVTdXBwb3J0OwoKICBCYWNrZW5kSW1wYWN0IGdldCBydW50aW1lVHlwZVN1cHBvcnQgewogICAgcmV0dXJuIF9ydW50aW1lVHlwZVN1cHBvcnQgPz89IG5ldyBCYWNrZW5kSW1wYWN0KGdsb2JhbENsYXNzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLmxpc3RDbGFzcwogICAgXSwgZ2xvYmFsVXNlczogWwogICAgICBfY29tbW9uRWxlbWVudHMuc2V0UnVudGltZVR5cGVJbmZvLAogICAgICBfY29tbW9uRWxlbWVudHMuZ2V0UnVudGltZVR5cGVJbmZvCiAgICBdLCBvdGhlckltcGFjdHM6IFsKICAgICAgZ2V0UnVudGltZVR5cGVBcmd1bWVudCwKICAgICAgY29tcHV0ZVNpZ25hdHVyZQogICAgXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9kZWZlcnJlZExvYWRpbmc7CgogIEJhY2tlbmRJbXBhY3QgZ2V0IGRlZmVycmVkTG9hZGluZyB7CiAgICByZXR1cm4gX2RlZmVycmVkTG9hZGluZyA/Pz0KICAgICAgICBuZXcgQmFja2VuZEltcGFjdChnbG9iYWxVc2VzOiBbX2NvbW1vbkVsZW1lbnRzLmNoZWNrRGVmZXJyZWRJc0xvYWRlZF0sCiAgICAgICAgICAgIC8vIEFsc28gcmVnaXN0ZXIgdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoaXMgbWV0aG9kLgogICAgICAgICAgICBnbG9iYWxDbGFzc2VzOiBbX2NvbW1vbkVsZW1lbnRzLnN0cmluZ0NsYXNzXSk7CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9ub1N1Y2hNZXRob2RTdXBwb3J0OwoKICBCYWNrZW5kSW1wYWN0IGdldCBub1N1Y2hNZXRob2RTdXBwb3J0IHsKICAgIHJldHVybiBfbm9TdWNoTWV0aG9kU3VwcG9ydCA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoZ2xvYmFsVXNlczogWwogICAgICBfY29tbW9uRWxlbWVudHMuY3JlYXRlSW52b2NhdGlvbk1pcnJvciwKICAgICAgX2NvbW1vbkVsZW1lbnRzLmNyZWF0ZVVubWFuZ2xlZEludm9jYXRpb25NaXJyb3IKICAgIF0sIGR5bmFtaWNVc2VzOiBbCiAgICAgIFNlbGVjdG9ycy5ub1N1Y2hNZXRob2RfCiAgICBdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX2xvYWRMaWJyYXJ5OwoKICAvLy8gQmFja2VuZCBpbXBhY3QgZm9yIGFjY2Vzc2luZyBhIGBsb2FkTGlicmFyeWAgZnVuY3Rpb24gb24gYSBkZWZlcnJlZAogIC8vLyBwcmVmaXguCiAgQmFja2VuZEltcGFjdCBnZXQgbG9hZExpYnJhcnkgewogICAgcmV0dXJuIF9sb2FkTGlicmFyeSA/Pz0gbmV3IEJhY2tlbmRJbXBhY3QoZ2xvYmFsVXNlczogWwogICAgICAvLyBUT0RPKHJlZGVtcHRpb24pOiBkZWxldGUgd3JhcHBlciB3aGVuIHdlIHN1bnNldCB0aGUgb2xkIGZyb250ZW5kLgogICAgICBfY29tbW9uRWxlbWVudHMubG9hZExpYnJhcnlXcmFwcGVyLAogICAgICBfY29tbW9uRWxlbWVudHMubG9hZERlZmVycmVkTGlicmFyeSwKICAgIF0pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfbWVtYmVyQ2xvc3VyZTsKCiAgLy8vIEJhY2tlbmQgaW1wYWN0IGZvciBwZXJmb3JtaW5nIG1lbWJlciBjbG9zdXJpemF0aW9uLgogIEJhY2tlbmRJbXBhY3QgZ2V0IG1lbWJlckNsb3N1cmUgewogICAgcmV0dXJuIF9tZW1iZXJDbG9zdXJlID8/PQogICAgICAgIG5ldyBCYWNrZW5kSW1wYWN0KGdsb2JhbENsYXNzZXM6IFtfY29tbW9uRWxlbWVudHMuYm91bmRDbG9zdXJlQ2xhc3NdKTsKICB9CgogIEJhY2tlbmRJbXBhY3QgX3N0YXRpY0Nsb3N1cmU7CgogIC8vLyBCYWNrZW5kIGltcGFjdCBmb3IgcGVyZm9ybWluZyBjbG9zdXJpemF0aW9uIG9mIGEgdG9wLWxldmVsIG9yIHN0YXRpYwogIC8vLyBmdW5jdGlvbi4KICBCYWNrZW5kSW1wYWN0IGdldCBzdGF0aWNDbG9zdXJlIHsKICAgIHJldHVybiBfc3RhdGljQ2xvc3VyZSA/Pz0KICAgICAgICBuZXcgQmFja2VuZEltcGFjdChnbG9iYWxDbGFzc2VzOiBbX2NvbW1vbkVsZW1lbnRzLmNsb3N1cmVDbGFzc10pOwogIH0KCiAgQmFja2VuZEltcGFjdCBfdHlwZVZhcmlhYmxlTWlycm9yOwoKICAvLy8gQmFja2VuZCBpbXBhY3QgZm9yIHR5cGUgdmFyaWFibGVzIHRocm91Z2ggbWlycm9ycy4KICBCYWNrZW5kSW1wYWN0IGdldCB0eXBlVmFyaWFibGVNaXJyb3IgewogICAgcmV0dXJuIF90eXBlVmFyaWFibGVNaXJyb3IgPz89IG5ldyBCYWNrZW5kSW1wYWN0KHN0YXRpY1VzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLnR5cGVWYXJpYWJsZUNvbnN0cnVjdG9yLAogICAgICBfY29tbW9uRWxlbWVudHMuY3JlYXRlUnVudGltZVR5cGUKICAgIF0sIGluc3RhbnRpYXRlZENsYXNzZXM6IFsKICAgICAgX2NvbW1vbkVsZW1lbnRzLnR5cGVWYXJpYWJsZUNsYXNzCiAgICBdKTsKICB9CgogIE1hcDxpbnQsIEJhY2tlbmRJbXBhY3Q+IF9nZW5lcmljSW5zdGFudGlhdGlvbiA9IDxpbnQsIEJhY2tlbmRJbXBhY3Q+e307CgogIEJhY2tlbmRJbXBhY3QgZ2V0R2VuZXJpY0luc3RhbnRpYXRpb24oaW50IHR5cGVBcmd1bWVudENvdW50KSA9PgogICAgICBfZ2VuZXJpY0luc3RhbnRpYXRpb25bdHlwZUFyZ3VtZW50Q291bnRdID8/PQogICAgICAgICAgbmV3IEJhY2tlbmRJbXBhY3Qoc3RhdGljVXNlczogWwogICAgICAgIF9jb21tb25FbGVtZW50cy5nZXRJbnN0YW50aWF0ZUZ1bmN0aW9uKHR5cGVBcmd1bWVudENvdW50KSwKICAgICAgICBfY29tbW9uRWxlbWVudHMuaW5zdGFudGlhdGVkR2VuZXJpY0Z1bmN0aW9uVHlwZSwKICAgICAgICBfY29tbW9uRWxlbWVudHMuZXh0cmFjdEZ1bmN0aW9uVHlwZU9iamVjdEZyb21JbnRlcm5hbCwKICAgICAgXSwgaW5zdGFudGlhdGVkQ2xhc3NlczogWwogICAgICAgIF9jb21tb25FbGVtZW50cy5nZXRJbnN0YW50aWF0aW9uQ2xhc3ModHlwZUFyZ3VtZW50Q291bnQpLAogICAgICBdKTsKCiAgLy8vIEJhY2tlbmQgaW1wYWN0IGZvciAtLWV4cGVyaW1lbnQtbmV3LXJ0aS4KICBMaXN0PEJhY2tlbmRJbXBhY3Q+IG5ld1J0aUltcGFjdHMoU3RyaW5nIHdoYXQpIHsKICAgIGlmICghX25ld1J0aSkgcmV0dXJuIFtdOwogICAgLy8gVE9ETyhzcmEpOiBTcGxpdCBpbnRvIHJlZmluZWQgaW1wYWN0cy4KICAgIHJldHVybiBbCiAgICAgIEJhY2tlbmRJbXBhY3Qoc3RhdGljVXNlczogWwogICAgICAgIF9jb21tb25FbGVtZW50cy5maW5kVHlwZSwKICAgICAgICBfY29tbW9uRWxlbWVudHMuaW5zdGFuY2VUeXBlLAogICAgICAgIF9jb21tb25FbGVtZW50cy5ydGlFdmFsTWV0aG9kLAogICAgICAgIF9jb21tb25FbGVtZW50cy5ydGlCaW5kTWV0aG9kLAogICAgICAgIF9jb21tb25FbGVtZW50cy5nZW5lcmFsSXNUZXN0SW1wbGVtZW50YXRpb24sCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmdlbmVyYWxBc0NoZWNrSW1wbGVtZW50YXRpb24sCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmdlbmVyYWxUeXBlQ2hlY2tJbXBsZW1lbnRhdGlvbiwKICAgICAgICAvLyBTcGVjaWFsaXplZCBjaGVja3MuCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnNwZWNpYWxpemVkSXNCb29sLAogICAgICAgIF9jb21tb25FbGVtZW50cy5zcGVjaWFsaXplZEFzQm9vbE51bGxhYmxlLAogICAgICAgIF9jb21tb25FbGVtZW50cy5zcGVjaWFsaXplZENoZWNrQm9vbE51bGxhYmxlLAogICAgICAgIC8vIG5vIHNwZWNpYWxpemVkSXNEb3VibGUuCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnNwZWNpYWxpemVkQXNEb3VibGVOdWxsYWJsZSwKICAgICAgICBfY29tbW9uRWxlbWVudHMuc3BlY2lhbGl6ZWRDaGVja0RvdWJsZU51bGxhYmxlLAogICAgICAgIF9jb21tb25FbGVtZW50cy5zcGVjaWFsaXplZElzSW50LAogICAgICAgIF9jb21tb25FbGVtZW50cy5zcGVjaWFsaXplZEFzSW50TnVsbGFibGUsCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnNwZWNpYWxpemVkQ2hlY2tJbnROdWxsYWJsZSwKICAgICAgICBfY29tbW9uRWxlbWVudHMuc3BlY2lhbGl6ZWRJc051bSwKICAgICAgICBfY29tbW9uRWxlbWVudHMuc3BlY2lhbGl6ZWRBc051bU51bGxhYmxlLAogICAgICAgIF9jb21tb25FbGVtZW50cy5zcGVjaWFsaXplZENoZWNrTnVtTnVsbGFibGUsCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnNwZWNpYWxpemVkSXNTdHJpbmcsCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnNwZWNpYWxpemVkQXNTdHJpbmdOdWxsYWJsZSwKICAgICAgICBfY29tbW9uRWxlbWVudHMuc3BlY2lhbGl6ZWRDaGVja1N0cmluZ051bGxhYmxlLAogICAgICBdLCBnbG9iYWxVc2VzOiBbXSkKICAgIF07CiAgfQoKICBCYWNrZW5kSW1wYWN0IF9ydGlBZGRSdWxlczsKCiAgQmFja2VuZEltcGFjdCBnZXQgcnRpQWRkUnVsZXMgPT4gX3J0aUFkZFJ1bGVzID8/PSBCYWNrZW5kSW1wYWN0KAogICAgICBnbG9iYWxVc2VzOiBbX2NvbW1vbkVsZW1lbnRzLnJ0aUFkZFJ1bGVzTWV0aG9kXSwKICAgICAgb3RoZXJJbXBhY3RzOiBbX25lZWRzU3RyaW5nKCdOZWVkZWQgdG8gZW5jb2RlIHRoZSBuZXcgUlRJIHJ1bGVzZXQuJyldKTsKfQqDKQBOTjwBIwEfSjQkJCdCHx8BPBYmJAIBLhYpKSQvLykqKwEXMjEsNzcxMlEjASsxAURJNxoEAUA9LzMhGUcGMyEZRwYtIBlJBkAZSQYzKkoGLSpKBjZKBgQCAT4XKBYBNgEpAS1HOS4uPwQBIwEnQSoqKC8XEQgEASQBKEskJAgEARwBUCorLDMiLQoBHwEjPSYhLQgEASABJD4nKiMhMSAIBAEpAS1HJiczCAQBLQExPkxIBAEjASchSwQBGgEeOCkwBAEkAShCKRdJUU5BCAQBHwEjHVEEARwBIEMiKiUlJSQIBAEsAS8BHQEhG08EARwBIBpPBAEdASE+JCspLi8IBAEkAShCKRdJEwgEASgBLEYsF0kTCAQBJAEoQi4pF1BLRwgEASUBKUwoLS4vCAQBJQEqRy4ZGwoBJAEoNUMEAR4BIi9KQAQBMytEFgQBNCxEFwQBNi5EGQQBJwErJUcEASQBKDVQBAEdASEuQgQBJgEqNyxBPwQBJgEqTAQBLgEvAS0BMwEzASEBJT8pHjQ1CAQBIgEmM0tLSRYvMAwEARwBIBpMBAEeASJFJxUpNQgEASQBKDVGOwQBHAEgLUw2SQQBKQEtRyoqKBcSHkkIBAEcASBJBAEjASdBJD4qKRcSHQgEASEBJU0EASgBLDlCBAEkASgiUQQBJAEoIkcEASIBJkBDNiklCAQBGgEeGFEEASEBJTIWNQsfMzg0Czs7PBoEAR0BIS5KIkYEASYBKjdQNxY5OAwEASABJB5KBAEbAR8sSRcZJSoMBAEbAVFJFyMpCgEkASgiTwQBJwErRTEYKi80MAgEASIBJkAtMi4yCAQBIgEnOy80MDUKAR8BIx1NBAEeASIvShYzLjEMBAElASk2TkczNgQBHgEiHEYEASQBKDVABAElASlGIBUqKRceFwgEASIBJiBPTzsEASYBKkQuNhYeCAQBHgFKDiI8SyorCAQBIAE6JB5PBAEgAUsQJB5KBAElATkpQy8oHigIBAFKAUIzKkM5PyBCCgEvMx0uDSIiJicnNTY4HyszNiM1OCoyNSoyNS01OBkHBAEeAUM3TgIBM3BhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvYmFja2VuZF9pbXBhY3QuZGFydD5zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2NvZGVnZW5fbGlzdGVuZXIuZGFydLE4Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkganNfYmFja2VuZC5iYWNrZW5kLmNvZGVnZW5fbGlzdGVuZXI7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JyBzaG93IElkZW50aWZpZXJzOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IENvbW1vbkVsZW1lbnRzLCBFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbnF1ZXVlLmRhcnQnIHNob3cgRW5xdWV1ZXIsIEVucXVldWVyTGlzdGVuZXI7CmltcG9ydCAnLi4vbmF0aXZlL2VucXVldWUuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JyBzaG93IENhbGxTdHJ1Y3R1cmU7CmltcG9ydCAnLi4vdW5pdmVyc2UvdXNlLmRhcnQnIHNob3cgU3RhdGljVXNlLCBUeXBlVXNlOwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0JwogICAgc2hvdyBXb3JsZEltcGFjdCwgV29ybGRJbXBhY3RCdWlsZGVyLCBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsOwppbXBvcnQgJ2JhY2tlbmRfaW1wYWN0LmRhcnQnOwppbXBvcnQgJ2JhY2tlbmRfdXNhZ2UuZGFydCc7CmltcG9ydCAnY3VzdG9tX2VsZW1lbnRzX2FuYWx5c2lzLmRhcnQnOwppbXBvcnQgJ3J1bnRpbWVfdHlwZXNfcmVzb2x1dGlvbi5kYXJ0JzsKCmNsYXNzIENvZGVnZW5FbnF1ZXVlckxpc3RlbmVyIGV4dGVuZHMgRW5xdWV1ZXJMaXN0ZW5lciB7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIENvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKICBmaW5hbCBCYWNrZW5kSW1wYWN0cyBfaW1wYWN0czsKCiAgZmluYWwgQmFja2VuZFVzYWdlIF9iYWNrZW5kVXNhZ2U7CiAgZmluYWwgUnVudGltZVR5cGVzTmVlZCBfcnRpTmVlZDsKCiAgZmluYWwgQ3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXMgX2N1c3RvbUVsZW1lbnRzQW5hbHlzaXM7CgogIGZpbmFsIE5hdGl2ZUNvZGVnZW5FbnF1ZXVlciBfbmF0aXZlRW5xdWV1ZXI7CgogIGJvb2wgX2lzTm9TdWNoTWV0aG9kVXNlZCA9IGZhbHNlOwogIGJvb2wgX2lzTmV3UnRpVXNlZCA9IGZhbHNlOwoKICBDb2RlZ2VuRW5xdWV1ZXJMaXN0ZW5lcigKICAgICAgdGhpcy5fb3B0aW9ucywKICAgICAgdGhpcy5fZWxlbWVudEVudmlyb25tZW50LAogICAgICB0aGlzLl9jb21tb25FbGVtZW50cywKICAgICAgdGhpcy5faW1wYWN0cywKICAgICAgdGhpcy5fYmFja2VuZFVzYWdlLAogICAgICB0aGlzLl9ydGlOZWVkLAogICAgICB0aGlzLl9jdXN0b21FbGVtZW50c0FuYWx5c2lzLAogICAgICB0aGlzLl9uYXRpdmVFbnF1ZXVlcik7CgogIEBvdmVycmlkZQogIFdvcmxkSW1wYWN0IHJlZ2lzdGVyQ2xvc3VyaXplZE1lbWJlcihGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIGltcGFjdEJ1aWxkZXIgPSBuZXcgV29ybGRJbXBhY3RCdWlsZGVySW1wbCgpOwogICAgaW1wYWN0QnVpbGRlcgogICAgICAgIC5hZGRJbXBhY3QoX2ltcGFjdHMubWVtYmVyQ2xvc3VyZS5jcmVhdGVJbXBhY3QoX2VsZW1lbnRFbnZpcm9ubWVudCkpOwogICAgRnVuY3Rpb25UeXBlIHR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShlbGVtZW50KTsKICAgIGlmICh0eXBlLmNvbnRhaW5zVHlwZVZhcmlhYmxlcyAmJiBfcnRpTmVlZC5tZXRob2ROZWVkc1NpZ25hdHVyZShlbGVtZW50KSkgewogICAgICBpbXBhY3RCdWlsZGVyLmFkZEltcGFjdChfcmVnaXN0ZXJDb21wdXRlU2lnbmF0dXJlKCkpOwogICAgfQogICAgcmV0dXJuIGltcGFjdEJ1aWxkZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBXb3JsZEltcGFjdCByZWdpc3RlckdldE9mU3RhdGljRnVuY3Rpb24oKSB7CiAgICByZXR1cm4gX2ltcGFjdHMuc3RhdGljQ2xvc3VyZS5jcmVhdGVJbXBhY3QoX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgfQoKICBXb3JsZEltcGFjdCBfcmVnaXN0ZXJDb21wdXRlU2lnbmF0dXJlKCkgewogICAgcmV0dXJuIF9pbXBhY3RzLmNvbXB1dGVTaWduYXR1cmUuY3JlYXRlSW1wYWN0KF9lbGVtZW50RW52aXJvbm1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlckluc3RhbnRpYXRlZFR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlLAogICAgICB7Ym9vbCBpc0dsb2JhbDogZmFsc2UsIGJvb2wgbmF0aXZlVXNhZ2U6IGZhbHNlfSkgewogICAgaWYgKG5hdGl2ZVVzYWdlKSB7CiAgICAgIF9uYXRpdmVFbnF1ZXVlci5vbkluc3RhbnRpYXRlZFR5cGUodHlwZSk7CiAgICB9CiAgfQoKICAvLy8gQ29tcHV0ZXMgdGhlIFtXb3JsZEltcGFjdF0gb2YgY2FsbGluZyBbbWFpbk1ldGhvZF0gYXMgdGhlIGVudHJ5IHBvaW50LgogIFdvcmxkSW1wYWN0IF9jb21wdXRlTWFpbkltcGFjdChGdW5jdGlvbkVudGl0eSBtYWluTWV0aG9kKSB7CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIG1haW5JbXBhY3QgPSBuZXcgV29ybGRJbXBhY3RCdWlsZGVySW1wbCgpOwogICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbWFpbk1ldGhvZC5wYXJhbWV0ZXJTdHJ1Y3R1cmUuY2FsbFN0cnVjdHVyZTsKICAgIGlmIChjYWxsU3RydWN0dXJlLmFyZ3VtZW50Q291bnQgPiAwKSB7CiAgICAgIF9pbXBhY3RzLm1haW5XaXRoQXJndW1lbnRzCiAgICAgICAgICAucmVnaXN0ZXJJbXBhY3QobWFpbkltcGFjdCwgX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgICAgIG1haW5JbXBhY3QucmVnaXN0ZXJTdGF0aWNVc2UoCiAgICAgICAgICBuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZShtYWluTWV0aG9kLCBjYWxsU3RydWN0dXJlKSk7CiAgICB9CiAgICBpZiAobWFpbk1ldGhvZC5pc0dldHRlcikgewogICAgICBtYWluSW1wYWN0LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljR2V0KG1haW5NZXRob2QpKTsKICAgIH0gZWxzZSB7CiAgICAgIG1haW5JbXBhY3QucmVnaXN0ZXJTdGF0aWNVc2UoCiAgICAgICAgICBuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZShtYWluTWV0aG9kLCBDYWxsU3RydWN0dXJlLk5PX0FSR1MpKTsKICAgIH0KICAgIHJldHVybiBtYWluSW1wYWN0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBvblF1ZXVlT3BlbigKICAgICAgRW5xdWV1ZXIgZW5xdWV1ZXIsIEZ1bmN0aW9uRW50aXR5IG1haW5NZXRob2QsIEl0ZXJhYmxlPFVyaT4gbGlicmFyaWVzKSB7CiAgICBlbnF1ZXVlci5hcHBseUltcGFjdChfbmF0aXZlRW5xdWV1ZXIucHJvY2Vzc05hdGl2ZUNsYXNzZXMobGlicmFyaWVzKSk7CiAgICBpZiAobWFpbk1ldGhvZCAhPSBudWxsKSB7CiAgICAgIGVucXVldWVyLmFwcGx5SW1wYWN0KF9jb21wdXRlTWFpbkltcGFjdChtYWluTWV0aG9kKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9uUXVldWVFbXB0eShFbnF1ZXVlciBlbnF1ZXVlciwgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHJlY2VudENsYXNzZXMpIHsKICAgIC8vIEFkZCBlbGVtZW50cyB1c2VkIHN5bnRoZXRpY2FsbHksIHRoYXQgaXMsIHRocm91Z2ggZmVhdHVyZXMgcmF0aGVyIHRoYW4KICAgIC8vIHN5bnRheCwgZm9yIGluc3RhbmNlIGN1c3RvbSBlbGVtZW50cy4KICAgIC8vCiAgICAvLyBSZXR1cm4gZWFybHkgaWYgYW55IGVsZW1lbnRzIGFyZSBhZGRlZCB0byBhdm9pZCBjb3VudGluZyB0aGUgZWxlbWVudHMgYXMKICAgIC8vIGR1ZSB0byBtaXJyb3JzLgogICAgZW5xdWV1ZXIuYXBwbHlJbXBhY3QoX2N1c3RvbUVsZW1lbnRzQW5hbHlzaXMuZmx1c2goKSk7CgogICAgaWYgKF9iYWNrZW5kVXNhZ2UuaXNOb1N1Y2hNZXRob2RVc2VkICYmICFfaXNOb1N1Y2hNZXRob2RVc2VkKSB7CiAgICAgIGVucXVldWVyLmFwcGx5SW1wYWN0KAogICAgICAgICAgX2ltcGFjdHMubm9TdWNoTWV0aG9kU3VwcG9ydC5jcmVhdGVJbXBhY3QoX2VsZW1lbnRFbnZpcm9ubWVudCkpOwogICAgICBfaXNOb1N1Y2hNZXRob2RVc2VkID0gdHJ1ZTsKICAgIH0KCiAgICAvLyBUT0RPKGZpc2h5dGhlZmlzaCk6IEF2b2lkIHJlZ2lzdGVyaW5nIHVubmVjZXNzYXJ5IGltcGFjdHMuCiAgICBpZiAoX29wdGlvbnMuZXhwZXJpbWVudE5ld1J0aSAmJiAhX2lzTmV3UnRpVXNlZCkgewogICAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIG5ld1J0aUltcGFjdCA9IG5ldyBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsKCk7CiAgICAgIG5ld1J0aUltcGFjdC5yZWdpc3RlclN0YXRpY1VzZShTdGF0aWNVc2Uuc3RhdGljSW52b2tlKAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnJ0aUFkZFJ1bGVzTWV0aG9kLCBDYWxsU3RydWN0dXJlLlRXT19BUkdTKSk7CiAgICAgIGVucXVldWVyLmFwcGx5SW1wYWN0KG5ld1J0aUltcGFjdCk7CiAgICAgIF9pc05ld1J0aVVzZWQgPSB0cnVlOwogICAgfQoKICAgIGlmICghZW5xdWV1ZXIucXVldWVJc0VtcHR5KSByZXR1cm4gZmFsc2U7CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG9uUXVldWVDbG9zZWQoKSB7fQoKICAvLy8gQWRkcyB0aGUgaW1wYWN0IG9mIFtjb25zdGFudF0gdG8gW2ltcGFjdEJ1aWxkZXJdLgogIHZvaWQgX2NvbXB1dGVJbXBhY3RGb3JDb21waWxlVGltZUNvbnN0YW50KENvbnN0YW50VmFsdWUgY29uc3RhbnQsCiAgICAgIFdvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyLCBTZXQ8Q29uc3RhbnRWYWx1ZT4gdmlzaXRlZCkgewogICAgaWYgKHZpc2l0ZWQuYWRkKGNvbnN0YW50KSkgewogICAgICBfY29tcHV0ZUltcGFjdEZvckNvbXBpbGVUaW1lQ29uc3RhbnRJbnRlcm5hbChjb25zdGFudCwgaW1wYWN0QnVpbGRlcik7CgogICAgICBmb3IgKENvbnN0YW50VmFsdWUgZGVwZW5kZW5jeSBpbiBjb25zdGFudC5nZXREZXBlbmRlbmNpZXMoKSkgewogICAgICAgIF9jb21wdXRlSW1wYWN0Rm9yQ29tcGlsZVRpbWVDb25zdGFudCgKICAgICAgICAgICAgZGVwZW5kZW5jeSwgaW1wYWN0QnVpbGRlciwgdmlzaXRlZCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX2NvbXB1dGVJbXBhY3RGb3JDb21waWxlVGltZUNvbnN0YW50SW50ZXJuYWwoCiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFdvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gY29uc3RhbnQuZ2V0VHlwZShfY29tbW9uRWxlbWVudHMpOwogICAgX2NvbXB1dGVJbXBhY3RGb3JJbnN0YW50aWF0ZWRDb25zdGFudFR5cGUodHlwZSwgaW1wYWN0QnVpbGRlcik7CgogICAgaWYgKGNvbnN0YW50LmlzRnVuY3Rpb24pIHsKICAgICAgRnVuY3Rpb25Db25zdGFudFZhbHVlIGZ1bmN0aW9uID0gY29uc3RhbnQ7CiAgICAgIGltcGFjdEJ1aWxkZXIKICAgICAgICAgIC5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY1RlYXJPZmYoZnVuY3Rpb24uZWxlbWVudCkpOwogICAgfSBlbHNlIGlmIChjb25zdGFudC5pc0ludGVyY2VwdG9yKSB7CiAgICAgIC8vIEFuIGludGVyY2VwdG9yIGNvbnN0YW50IHJlZmVyZW5jZXMgdGhlIGNsYXNzJ3MgcHJvdG90eXBlIGNoYWluLgogICAgICBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgaW50ZXJjZXB0b3IgPSBjb25zdGFudDsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gaW50ZXJjZXB0b3IuY2xzOwogICAgICBfY29tcHV0ZUltcGFjdEZvckluc3RhbnRpYXRlZENvbnN0YW50VHlwZSgKICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoY2xzKSwgaW1wYWN0QnVpbGRlcik7CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50LmlzVHlwZSkgewogICAgICBpbXBhY3RCdWlsZGVyCiAgICAgICAgICAucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLnR5cGVUeXBlKSk7CiAgICAgIC8vIElmIHRoZSB0eXBlIGlzIGEgd2ViIGNvbXBvbmVudCwgd2UgbmVlZCB0byBlbnN1cmUgdGhlIGNvbnN0cnVjdG9ycyBhcmUKICAgICAgLy8gYXZhaWxhYmxlIHRvICd1cGdyYWRlJyB0aGUgbmF0aXZlIG9iamVjdC4KICAgICAgVHlwZUNvbnN0YW50VmFsdWUgdHlwZSA9IGNvbnN0YW50OwogICAgICBpZiAodHlwZS5yZXByZXNlbnRlZFR5cGUuaXNJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgSW50ZXJmYWNlVHlwZSByZXByZXNlbnRlZFR5cGUgPSB0eXBlLnJlcHJlc2VudGVkVHlwZTsKICAgICAgICBfY3VzdG9tRWxlbWVudHNBbmFseXNpcy5yZWdpc3RlclR5cGVDb25zdGFudChyZXByZXNlbnRlZFR5cGUuZWxlbWVudCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgSW5zdGFudGlhdGlvbkNvbnN0YW50VmFsdWUpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVnaXN0ZXIgdGhlc2UgdXNpbmcgYEJhY2tlbmRJbXBhY3RgLgogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyVHlwZVVzZShuZXcgVHlwZVVzZS5pbnN0YW50aWF0aW9uKAogICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShfY29tbW9uRWxlbWVudHMKICAgICAgICAgICAgICAuZ2V0SW5zdGFudGlhdGlvbkNsYXNzKGNvbnN0YW50LnR5cGVBcmd1bWVudHMubGVuZ3RoKSkpKTsKICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICAgIF9jb21tb25FbGVtZW50cy5pbnN0YW50aWF0ZWRHZW5lcmljRnVuY3Rpb25UeXBlLAogICAgICAgICAgQ2FsbFN0cnVjdHVyZS5UV09fQVJHUykpOwogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmV4dHJhY3RGdW5jdGlvblR5cGVPYmplY3RGcm9tSW50ZXJuYWwsCiAgICAgICAgICBDYWxsU3RydWN0dXJlLk9ORV9BUkcpKTsKICAgIH0KICB9CgogIHZvaWQgX2NvbXB1dGVJbXBhY3RGb3JJbnN0YW50aWF0ZWRDb25zdGFudFR5cGUoCiAgICAgIERhcnRUeXBlIHR5cGUsIFdvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24odHlwZSkpOwogICAgICBpZiAoX3J0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHModHlwZS5lbGVtZW50KSkgewogICAgICAgIEZ1bmN0aW9uRW50aXR5IGhlbHBlciA9IF9jb21tb25FbGVtZW50cy5zZXRSdW50aW1lVHlwZUluZm87CiAgICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICAgICAgaGVscGVyLCBoZWxwZXIucGFyYW1ldGVyU3RydWN0dXJlLmNhbGxTdHJ1Y3R1cmUpKTsKICAgICAgfQogICAgICBpZiAodHlwZS5lbGVtZW50ID09IF9jb21tb25FbGVtZW50cy50eXBlTGl0ZXJhbENsYXNzKSB7CiAgICAgICAgLy8gSWYgd2UgdXNlIGEgdHlwZSBsaXRlcmFsIGluIGEgY29uc3RhbnQsIHRoZSBjb21waWxlIHRpbWUgY29uc3RhbnQKICAgICAgICAvLyBlbWl0dGVyIHdpbGwgZ2VuZXJhdGUgYSBjYWxsIHRvIGEgaGVscGVyIHNvIHdlIHJlZ2lzdGVyIHRoZSBpbXBhY3QKICAgICAgICAvLyB0aGF0IGNvbnRhaW5zIHRoYXQgY2FsbC4KICAgICAgICBfaW1wYWN0cy50eXBlTGl0ZXJhbC5yZWdpc3RlckltcGFjdChpbXBhY3RCdWlsZGVyLCBfZWxlbWVudEVudmlyb25tZW50KTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgV29ybGRJbXBhY3QgcmVnaXN0ZXJVc2VkQ29uc3RhbnQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgV29ybGRJbXBhY3RCdWlsZGVySW1wbCBpbXBhY3RCdWlsZGVyID0gbmV3IFdvcmxkSW1wYWN0QnVpbGRlckltcGwoKTsKICAgIF9jb21wdXRlSW1wYWN0Rm9yQ29tcGlsZVRpbWVDb25zdGFudCgKICAgICAgICBjb25zdGFudCwgaW1wYWN0QnVpbGRlciwgbmV3IExpbmtlZEhhc2hTZXQuaWRlbnRpdHkoKSk7CiAgICByZXR1cm4gaW1wYWN0QnVpbGRlcjsKICB9CgogIEBvdmVycmlkZQogIFdvcmxkSW1wYWN0IHJlZ2lzdGVyVXNlZEVsZW1lbnQoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgV29ybGRJbXBhY3RCdWlsZGVySW1wbCB3b3JsZEltcGFjdCA9IG5ldyBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsKCk7CiAgICBfY3VzdG9tRWxlbWVudHNBbmFseXNpcy5yZWdpc3RlclN0YXRpY1VzZShtZW1iZXIpOwoKICAgIGlmIChtZW1iZXIuaXNGdW5jdGlvbiAmJiBtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICBDbGFzc0VudGl0eSBjbHMgPSBtZW1iZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIGlmIChtZW1iZXIubmFtZSA9PSBJZGVudGlmaWVycy5jYWxsICYmCiAgICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LmlzR2VuZXJpY0NsYXNzKGNscykgJiYKICAgICAgICAgIF9ydGlOZWVkLm1ldGhvZE5lZWRzU2lnbmF0dXJlKG1lbWJlcikpIHsKICAgICAgICB3b3JsZEltcGFjdC5hZGRJbXBhY3QoX3JlZ2lzdGVyQ29tcHV0ZVNpZ25hdHVyZSgpKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB3b3JsZEltcGFjdDsKICB9CgogIFdvcmxkSW1wYWN0IF9wcm9jZXNzQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIGltcGFjdEJ1aWxkZXIgPSBuZXcgV29ybGRJbXBhY3RCdWlsZGVySW1wbCgpOwogICAgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuY2xvc3VyZUNsYXNzKSB7CiAgICAgIF9pbXBhY3RzLmNsb3N1cmVDbGFzcy5yZWdpc3RlckltcGFjdChpbXBhY3RCdWlsZGVyLCBfZWxlbWVudEVudmlyb25tZW50KTsKICAgIH0KCiAgICB2b2lkIHJlZ2lzdGVySW5zdGFudGlhdGlvbihDbGFzc0VudGl0eSBjbHMpIHsKICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclR5cGVVc2UoCiAgICAgICAgICBuZXcgVHlwZVVzZS5pbnN0YW50aWF0aW9uKF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0UmF3VHlwZShjbHMpKSk7CiAgICB9CgogICAgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuc3RyaW5nQ2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzU3RyaW5nQ2xhc3MpIHsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5saXN0Q2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNGaXhlZEFycmF5Q2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzRXh0ZW5kYWJsZUFycmF5Q2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzVW5tb2RpZmlhYmxlQXJyYXlDbGFzcykgewogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcyk7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNNdXRhYmxlQXJyYXlDbGFzcyk7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNGaXhlZEFycmF5Q2xhc3MpOwogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzRXh0ZW5kYWJsZUFycmF5Q2xhc3MpOwogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzVW5tb2RpZmlhYmxlQXJyYXlDbGFzcyk7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuaW50Q2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzSW50Q2xhc3MpIHsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc0ludENsYXNzKTsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc1Bvc2l0aXZlSW50Q2xhc3MpOwogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzVUludDMyQ2xhc3MpOwogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzVUludDMxQ2xhc3MpOwogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzTnVtYmVyQ2xhc3MpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmRvdWJsZUNsYXNzIHx8CiAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzKSB7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzcyk7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNOdW1iZXJDbGFzcyk7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuYm9vbENsYXNzIHx8CiAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzcykgewogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzQm9vbENsYXNzKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5udWxsQ2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzTnVsbENsYXNzKSB7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNOdWxsQ2xhc3MpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLm51bUNsYXNzIHx8CiAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzKSB7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcyk7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzKTsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc1VJbnQzMkNsYXNzKTsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc1VJbnQzMUNsYXNzKTsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzKTsKICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKF9jb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc0phdmFTY3JpcHRPYmplY3RDbGFzcykgewogICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdE9iamVjdENsYXNzKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc1BsYWluSmF2YVNjcmlwdE9iamVjdENsYXNzKSB7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNQbGFpbkphdmFTY3JpcHRPYmplY3RDbGFzcyk7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNVbmtub3duSmF2YVNjcmlwdE9iamVjdENsYXNzKSB7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNVbmtub3duSmF2YVNjcmlwdE9iamVjdENsYXNzKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc0phdmFTY3JpcHRGdW5jdGlvbkNsYXNzKSB7CiAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuanNKYXZhU2NyaXB0RnVuY3Rpb25DbGFzcyk7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNJbmRleGluZ0JlaGF2aW9ySW50ZXJmYWNlKSB7CiAgICAgIF9pbXBhY3RzLmpzSW5kZXhpbmdCZWhhdmlvcgogICAgICAgICAgLnJlZ2lzdGVySW1wYWN0KGltcGFjdEJ1aWxkZXIsIF9lbGVtZW50RW52aXJvbm1lbnQpOwogICAgfQoKICAgIF9jdXN0b21FbGVtZW50c0FuYWx5c2lzLnJlZ2lzdGVySW5zdGFudGlhdGVkQ2xhc3MoY2xzKTsKICAgIHJldHVybiBpbXBhY3RCdWlsZGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgV29ybGRJbXBhY3QgcmVnaXN0ZXJJbXBsZW1lbnRlZENsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIF9wcm9jZXNzQ2xhc3MoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIFdvcmxkSW1wYWN0IHJlZ2lzdGVySW5zdGFudGlhdGVkQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gX3Byb2Nlc3NDbGFzcyhjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsb2dTdW1tYXJ5KHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSkgewogICAgX25hdGl2ZUVucXVldWVyLmxvZ1N1bW1hcnkobG9nKTsKICB9Cn0KgT4ATk48AS0BGgEwSiMkITohGj03J0IeHSgoATkiMCghASQjAT8BLwEkHgEbFSAcFRoVJB0BDEFJEk5GUDwGGgQBDC5FBAEsSAQBDDQ5FzAGBAFNPkZPKyE8JEIGH0kNJEoGFwQBDBRPSx48BgQBDE5OLQdQFzsBRBxLIgYBQjdKPUcqHAYBLgERBAEMGgE4REYhTQFFLjEIBgQBNUI3RAEfMRRNKUk3KTFAIhRRUDMpMj5PCDlEPzpIQjskQkEjBgQBMjkhRjxERD8IPk1OJFEIBgQBDD1JKkAaBAEMOUc3ATgvLTUzPAgGARgEAS9JL1AGATIlSwYBLjA8My80OTs7QkBFRzItOUE8PDw1MDw8My46My46MjA5QTw8PDxBRkZLSE1DSEUiPwYBPBoEAQw6HwQBDDsfBAEMLiUEAgE1cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9jb2RlZ2VuX2xpc3RlbmVyLmRhcnRGc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfYmFja2VuZC9jdXN0b21fZWxlbWVudHNfYW5hbHlzaXMuZGFydKXmLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy9jb25zdGFudF9zeXN0ZW0uZGFydCcgYXMgY29uc3RhbnRfc3lzdGVtOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvdXNlLmRhcnQnIHNob3cgQ29uc3RhbnRVc2UsIFN0YXRpY1VzZTsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydCcKICAgIHNob3cgV29ybGRJbXBhY3QsIFN0YWdlZFdvcmxkSW1wYWN0QnVpbGRlcjsKaW1wb3J0ICdiYWNrZW5kX3VzYWdlLmRhcnQnIHNob3cgQmFja2VuZFVzYWdlQnVpbGRlcjsKaW1wb3J0ICduYXRpdmVfZGF0YS5kYXJ0JzsKCi8vLyBTdXBwb3J0IGZvciBDdXN0b20gRWxlbWVudHMuCi8vLwovLy8gVGhlIHN1cHBvcnQgZm9yIGN1c3RvbSBlbGVtZW50cyB0aGUgY29tcGlsZXIgYnVpbGRzIGEgdGFibGUgdGhhdCBtYXBzIHRoZQovLy8gY3VzdG9tIGVsZW1lbnQgY2xhc3MncyBbVHlwZV0gdG8gdGhlIGludGVyY2VwdG9yIGZvciB0aGUgY2xhc3MgYW5kIHRoZQovLy8gY29uc3RydWN0b3IocykgZm9yIHRoZSBjbGFzcy4KLy8vCi8vLyBXZSB3YW50IHRoZSB0YWJsZSB0byBjb250YWluIG9ubHkgdGhlIGN1c3RvbSBlbGVtZW50IGNsYXNzZXMgdXNlZCwgYW5kIHdlCi8vLyB3YW50IHRvIGF2b2lkIHJlc29sdmluZyBhbmQgY29tcGlsaW5nIGNvbnN0cnVjdG9ycyB0aGF0IGFyZSBub3QgdXNlZCBzaW5jZQovLy8gdGhhdCBtYXkgYnJpbmcgaW4gdW51c2VkIGNvZGUuICBUaGlzIGNsYXNzIGNvbnRyb2xzIHRoZSByZXNvbHV0aW9uIGFuZCBjb2RlCi8vLyBnZW5lcmF0aW9uIHRvIHJlc3RyaWN0IHRoZSBpbXBhY3QuCi8vLwovLy8gVGhlIGZvbGxvd2luZyBsaW5lIG9mIGNvZGUgcmVxdWlyZXMgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGdlbmVyYXRpdmUKLy8vIGNvbnN0cnVjdG9yIGZhY3RvcnkgZnVuY3Rpb24ocykgZm9yIEZhbmN5QnV0dG9uLCBhbmQgdGhlaXIgaW5zZXJ0aW9uIGludG8KLy8vIHRoZSB0YWJsZToKLy8vCi8vLyAgICAgZG9jdW1lbnQucmVnaXN0ZXIoRmFuY3lCdXR0b24sICd4LWZhbmN5LWJ1dHRvbicpOwovLy8KLy8vIFdlIGRldGVjdCB0aGlzIGJ5ICdqb2luaW5nJyB0aGUgY2xhc3NlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGFzIHR5cGUgbGl0ZXJhbHMKLy8vIHdpdGggdGhlIGNsYXNzZXMgdGhhdCBhcmUgY3VzdG9tIGVsZW1lbnRzLCBlbmFibGVkIGJ5IGRldGVjdGluZyB0aGUgcHJlc2VuY2UKLy8vIG9mIHRoZSB0YWJsZSBhY2Nlc3MgY29kZSB1c2VkIGJ5IGRvY3VtZW50LnJlZ2lzdGVyLgovLy8KLy8vIFdlIGhhdmUgdG8gYmUgbW9yZSBjb25zZXJ2YXRpdmUgd2hlbiB0aGUgdHlwZSBpcyB1bmtub3duLCBlLmcuCi8vLwovLy8gICAgIGRvY3VtZW50LnJlZ2lzdGVyKGNsYXNzTWlycm9yLnJlZmxlY3RlZFR5cGUsIHRhZ0Zyb21NZXRhZGF0YSk7Ci8vLwovLy8gYW5kCi8vLwovLy8gICAgIGNsYXNzIENvbXBvbmVudDxUPiB7Ci8vLyAgICAgICBmaW5hbCB0YWc7Ci8vLyAgICAgICBDb21wb25lbnQodGhpcy50YWcpOwovLy8gICAgICAgdm9pZCByZWdpc3RlcigpID0+IGRvY3VtZW50LnJlZ2lzdGVyKFQsIHRhZyk7Ci8vLyAgICAgfQovLy8gICAgIGNvbnN0IENvbXBvbmVudDxGYW5jeUJ1dHRvbj4oJ3gtZmFuY3ktYnV0dG9uJykucmVnaXN0ZXIoKTsKLy8vCi8vLyBJbiB0aGVzZSBjYXNlcyB3ZSBjb25zZXJ2YXRpdmVseSBnZW5lcmF0ZSBhbGwgdmlhYmxlIGVudHJpZXMgaW4gdGhlIHRhYmxlLgphYnN0cmFjdCBjbGFzcyBDdXN0b21FbGVtZW50c0FuYWx5c2lzQmFzZSB7CiAgZmluYWwgTmF0aXZlQmFzaWNEYXRhIF9uYXRpdmVEYXRhOwogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIENvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKCiAgQ3VzdG9tRWxlbWVudHNBbmFseXNpc0Jhc2UoCiAgICAgIHRoaXMuX2VsZW1lbnRFbnZpcm9ubWVudCwgdGhpcy5fY29tbW9uRWxlbWVudHMsIHRoaXMuX25hdGl2ZURhdGEpOwoKICBDdXN0b21FbGVtZW50c0FuYWx5c2lzSm9pbiBnZXQgam9pbjsKCiAgdm9pZCByZWdpc3Rlckluc3RhbnRpYXRlZENsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgaWYgKCFfbmF0aXZlRGF0YS5pc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShjbHMpKSByZXR1cm47CiAgICBpZiAoX2VsZW1lbnRFbnZpcm9ubWVudC5pc1VubmFtZWRNaXhpbkFwcGxpY2F0aW9uKGNscykpIHJldHVybjsKICAgIGlmIChjbHMuaXNBYnN0cmFjdCkgcmV0dXJuOwogICAgLy8gSnNJbnRlcm9wIGNsYXNzZXMgYXJlIG9wYXF1ZSBpbnRlcmZhY2VzIHdpdGhvdXQgYSBjb25jcmV0ZQogICAgLy8gaW1wbGVtZW50YXRpb24uCiAgICBpZiAoX25hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyhjbHMpKSByZXR1cm47CiAgICBqb2luLmluc3RhbnRpYXRlZENsYXNzZXMuYWRkKGNscyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyU3RhdGljVXNlKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoZWxlbWVudCAhPSBudWxsKTsKICAgIGlmIChfY29tbW9uRWxlbWVudHMuaXNGaW5kSW5kZXhGb3JOYXRpdmVTdWJjbGFzc1R5cGUoZWxlbWVudCkpIHsKICAgICAgam9pbi5kZW1hbmRlZCA9IHRydWU7CiAgICB9CiAgfQoKICAvLy8gQ29tcHV0ZXMgdGhlIFtXb3JsZEltcGFjdF0gb2YgdGhlIGNsYXNzZXMgcmVnaXN0ZXJlZCBzaW5jZSBsYXN0IGZsdXNoLgogIFdvcmxkSW1wYWN0IGZsdXNoKCkgPT4gam9pbi5mbHVzaCgpOwp9CgpjbGFzcyBDdXN0b21FbGVtZW50c1Jlc29sdXRpb25BbmFseXNpcyBleHRlbmRzIEN1c3RvbUVsZW1lbnRzQW5hbHlzaXNCYXNlIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBDdXN0b21FbGVtZW50c0FuYWx5c2lzSm9pbiBqb2luOwoKICBDdXN0b21FbGVtZW50c1Jlc29sdXRpb25BbmFseXNpcygKICAgICAgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIE5hdGl2ZUJhc2ljRGF0YSBuYXRpdmVEYXRhLAogICAgICBCYWNrZW5kVXNhZ2VCdWlsZGVyIGJhY2tlbmRVc2FnZUJ1aWxkZXIpCiAgICAgIDogam9pbiA9IG5ldyBDdXN0b21FbGVtZW50c0FuYWx5c2lzSm9pbigKICAgICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LCBjb21tb25FbGVtZW50cywgbmF0aXZlRGF0YSwKICAgICAgICAgICAgYmFja2VuZFVzYWdlQnVpbGRlcjogYmFja2VuZFVzYWdlQnVpbGRlciksCiAgICAgICAgc3VwZXIoZWxlbWVudEVudmlyb25tZW50LCBjb21tb25FbGVtZW50cywgbmF0aXZlRGF0YSkgewogICAgLy8gVE9ETyhzcmEpOiBSZW1vdmUgdGhpcyB3b3JrLWFyb3VuZC4gIFdlIHNob3VsZCBtYXJrIGFsbENsYXNzZXNTZWxlY3RlZCBpbgogICAgLy8gYm90aCBqb2lucyBvbmx5IHdoZW4gd2Ugc2VlIGEgY29uc3RydWN0IGdlbmVyYXRpbmcgYW4gdW5rbm93biBbVHlwZV0gYnV0CiAgICAvLyB3ZSBjYW4ndCBjdXJyZW50bHkgcmVjb2duaXplIGFsbCBjYXNlcy4gIEluIHBhcnRpY3VsYXIsIHRoZSB3b3JrLWFyb3VuZAogICAgLy8gZm9yIHRoZSB1bmltcGxlbWVudGVkIGBDbGFzc01pcnJvci5yZWZsZWN0ZWRUeXBlYCBpcyBub3QgcmVjb2duaXphYmxlLgogICAgLy8gVE9ETygxMjYwNyk6IE1hdGNoIG9uIFtDbGFzc01pcnJvci5yZWZsZWN0ZWRUeXBlXQogICAgam9pbi5hbGxDbGFzc2VzU2VsZWN0ZWQgPSB0cnVlOwogIH0KCiAgdm9pZCByZWdpc3RlclR5cGVMaXRlcmFsKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlVHlwZSkgewogICAgICAvLyBUT0RPKHNyYSk6IElmIHdlIGhhZCBhIGZsb3cgcXVlcnkgZnJvbSB0aGUgdHlwZSBsaXRlcmFsIGV4cHJlc3Npb24gdG8KICAgICAgLy8gdGhlIFR5cGUgYXJndW1lbnQgb2YgdGhlIG1ldGFkYXRhIGxvb2t1cCwgd2UgY291bGQgdGVsbCBpZiB0aGlzIHR5cGUKICAgICAgLy8gbGl0ZXJhbCBpcyByZWFsbHkgYSBkZW1hbmQgZm9yIHRoZSBtZXRhZGF0YS4KICAgICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlID0gdHlwZTsKICAgICAgam9pbi5zZWxlY3RlZENsYXNzZXMuYWRkKGludGVyZmFjZVR5cGUuZWxlbWVudCk7CiAgICB9IGVsc2UgaWYgKHR5cGUuaXNUeXBlVmFyaWFibGUpIHsKICAgICAgLy8gVGhpcyBpcyBhIHR5cGUgcGFyYW1ldGVyIG9mIGEgcGFyYW1ldGVyaXplZCBjbGFzcy4KICAgICAgLy8gVE9ETyhzcmEpOiBJcyB0aGVyZSBhIHdheSB0byBkZXRlcm1pbmUgd2hpY2ggdHlwZXMgYXJlIGJvdW5kIHRvIHRoZQogICAgICAvLyBwYXJhbWV0ZXI/CiAgICAgIGpvaW4uYWxsQ2xhc3Nlc1NlbGVjdGVkID0gdHJ1ZTsKICAgIH0KICB9Cn0KCmNsYXNzIEN1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzIGV4dGVuZHMgQ3VzdG9tRWxlbWVudHNBbmFseXNpc0Jhc2UgewogIEBvdmVycmlkZQogIGZpbmFsIEN1c3RvbUVsZW1lbnRzQW5hbHlzaXNKb2luIGpvaW47CgogIEN1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50LCBOYXRpdmVCYXNpY0RhdGEgbmF0aXZlRGF0YSkKICAgICAgOiBqb2luID0gbmV3IEN1c3RvbUVsZW1lbnRzQW5hbHlzaXNKb2luKAogICAgICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQsIGNvbW1vbkVsZW1lbnRzLCBuYXRpdmVEYXRhKSwKICAgICAgICBzdXBlcihlbGVtZW50RW52aXJvbm1lbnQsIGNvbW1vbkVsZW1lbnRzLCBuYXRpdmVEYXRhKSB7CiAgICAvLyBUT0RPKHNyYSk6IFJlbW92ZSB0aGlzIHdvcmstYXJvdW5kLiAgV2Ugc2hvdWxkIG1hcmsgYWxsQ2xhc3Nlc1NlbGVjdGVkIGluCiAgICAvLyBib3RoIGpvaW5zIG9ubHkgd2hlbiB3ZSBzZWUgYSBjb25zdHJ1Y3QgZ2VuZXJhdGluZyBhbiB1bmtub3duIFtUeXBlXSBidXQKICAgIC8vIHdlIGNhbid0IGN1cnJlbnRseSByZWNvZ25pemUgYWxsIGNhc2VzLiAgSW4gcGFydGljdWxhciwgdGhlIHdvcmstYXJvdW5kCiAgICAvLyBmb3IgdGhlIHVuaW1wbGVtZW50ZWQgYENsYXNzTWlycm9yLnJlZmxlY3RlZFR5cGVgIGlzIG5vdCByZWNvZ25pemFibGUuCiAgICAvLyBUT0RPKDEyNjA3KTogTWF0Y2ggb24gW0NsYXNzTWlycm9yLnJlZmxlY3RlZFR5cGVdCiAgICBqb2luLmFsbENsYXNzZXNTZWxlY3RlZCA9IHRydWU7CiAgfQoKICB2b2lkIHJlZ2lzdGVyVHlwZUNvbnN0YW50KENsYXNzRW50aXR5IGNscykgewogICAgam9pbi5zZWxlY3RlZENsYXNzZXMuYWRkKGNscyk7CiAgfQoKICBib29sIGdldCBuZWVkc1RhYmxlID0+IGpvaW4uZGVtYW5kZWQ7CgogIGJvb2wgbmVlZHNDbGFzcyhDbGFzc0VudGl0eSBjbHMpID0+IGpvaW4uYWN0aXZlQ2xhc3Nlcy5jb250YWlucyhjbHMpOwoKICBMaXN0PENvbnN0cnVjdG9yRW50aXR5PiBjb25zdHJ1Y3RvcnMoQ2xhc3NFbnRpdHkgY2xzKSA9PgogICAgICBqb2luLmNvbXB1dGVFc2NhcGluZ0NvbnN0cnVjdG9ycyhjbHMpOwp9CgpjbGFzcyBDdXN0b21FbGVtZW50c0FuYWx5c2lzSm9pbiB7CiAgZmluYWwgRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CiAgZmluYWwgQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwogIGZpbmFsIE5hdGl2ZUJhc2ljRGF0YSBfbmF0aXZlRGF0YTsKICBmaW5hbCBCYWNrZW5kVXNhZ2VCdWlsZGVyIF9iYWNrZW5kVXNhZ2VCdWlsZGVyOwoKICBmaW5hbCBib29sIGZvclJlc29sdXRpb247CgogIGZpbmFsIFN0YWdlZFdvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyID0gbmV3IFN0YWdlZFdvcmxkSW1wYWN0QnVpbGRlcigpOwoKICAvLyBDbGFzc2VzIHRoYXQgYXJlIGNhbmRpZGF0ZXMgZm9yIG5lZWRpbmcgY29uc3RydWN0b3JzLiAgQ2xhc3NlcyBhcmUgbW92ZWQgdG8KICAvLyBbYWN0aXZlQ2xhc3Nlc10gd2hlbiB3ZSBrbm93IHRoZXkgbmVlZCBjb25zdHJ1Y3RvcnMuCiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBpbnN0YW50aWF0ZWRDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgLy8gQ2xhc3NlcyBleHBsaWNpdGx5IG5hbWVkLgogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gc2VsZWN0ZWRDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgLy8gVHJ1ZSBpZiB3ZSBtdXN0IGNvbnNlcnZhdGl2ZWx5IGluY2x1ZGUgYWxsIGV4dGVuc2lvbiBjbGFzc2VzLgogIGJvb2wgYWxsQ2xhc3Nlc1NlbGVjdGVkID0gZmFsc2U7CgogIC8vIERpZCB3ZSBzZWUgYSBkZW1hbmQgZm9yIHRoZSBkYXRhPwogIGJvb2wgZGVtYW5kZWQgPSBmYWxzZTsKCiAgLy8gQ2xhc3Nlc091dHB1dDogY2xhc3NlcyByZXF1aXJpbmcgbWV0YWRhdGEuCiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBhY3RpdmVDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgQ3VzdG9tRWxlbWVudHNBbmFseXNpc0pvaW4oCiAgICAgIHRoaXMuX2VsZW1lbnRFbnZpcm9ubWVudCwgdGhpcy5fY29tbW9uRWxlbWVudHMsIHRoaXMuX25hdGl2ZURhdGEsCiAgICAgIHtCYWNrZW5kVXNhZ2VCdWlsZGVyIGJhY2tlbmRVc2FnZUJ1aWxkZXJ9KQogICAgICA6IHRoaXMuX2JhY2tlbmRVc2FnZUJ1aWxkZXIgPSBiYWNrZW5kVXNhZ2VCdWlsZGVyLAogICAgICAgIHRoaXMuZm9yUmVzb2x1dGlvbiA9IGJhY2tlbmRVc2FnZUJ1aWxkZXIgIT0gbnVsbDsKCiAgV29ybGRJbXBhY3QgZmx1c2goKSB7CiAgICBpZiAoIWRlbWFuZGVkKSByZXR1cm4gY29uc3QgV29ybGRJbXBhY3QoKTsKICAgIHZhciBuZXdBY3RpdmVDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xzIGluIGluc3RhbnRpYXRlZENsYXNzZXMpIHsKICAgICAgYm9vbCBpc05hdGl2ZSA9IF9uYXRpdmVEYXRhLmlzTmF0aXZlQ2xhc3MoY2xzKTsKICAgICAgYm9vbCBpc0V4dGVuc2lvbiA9ICFpc05hdGl2ZSAmJiBfbmF0aXZlRGF0YS5pc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShjbHMpOwogICAgICAvLyBHZW5lcmF0ZSB0YWJsZSBlbnRyaWVzIGZvciBuYXRpdmUgY2xhc3NlcyB0aGF0IGFyZSBleHBsaWNpdGx5IG5hbWVkIGFuZAogICAgICAvLyBleHRlbnNpb25zIHRoYXQgZml4IG91ciBjcml0ZXJpYS4KICAgICAgaWYgKChpc05hdGl2ZSAmJiBzZWxlY3RlZENsYXNzZXMuY29udGFpbnMoY2xzKSkgfHwKICAgICAgICAgIChpc0V4dGVuc2lvbiAmJgogICAgICAgICAgICAgIChhbGxDbGFzc2VzU2VsZWN0ZWQgfHwgc2VsZWN0ZWRDbGFzc2VzLmNvbnRhaW5zKGNscykpKSkgewogICAgICAgIG5ld0FjdGl2ZUNsYXNzZXMuYWRkKGNscyk7CiAgICAgICAgSXRlcmFibGU8Q29uc3RydWN0b3JFbnRpdHk+IGVzY2FwaW5nQ29uc3RydWN0b3JzID0KICAgICAgICAgICAgY29tcHV0ZUVzY2FwaW5nQ29uc3RydWN0b3JzKGNscyk7CiAgICAgICAgZm9yIChDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciBpbiBlc2NhcGluZ0NvbnN0cnVjdG9ycykgewogICAgICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLmNvbnN0cnVjdG9ySW52b2tlKAogICAgICAgICAgICAgIGNvbnN0cnVjdG9yLCBDYWxsU3RydWN0dXJlLk5PX0FSR1MpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZvclJlc29sdXRpb24pIHsKICAgICAgICAgIGVzY2FwaW5nQ29uc3RydWN0b3JzCiAgICAgICAgICAgICAgLmZvckVhY2goX2JhY2tlbmRVc2FnZUJ1aWxkZXIucmVnaXN0ZXJHbG9iYWxGdW5jdGlvbkRlcGVuZGVuY3kpOwogICAgICAgIH0KICAgICAgICAvLyBGb3JjZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgdHlwZSBjb25zdGFudCB0aGF0IGlzIHRoZSBrZXkgdG8gYW4gZW50cnkKICAgICAgICAvLyBpbiB0aGUgZ2VuZXJhdGVkIHRhYmxlLgogICAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQgPSBfbWFrZVR5cGVDb25zdGFudChjbHMpOwogICAgICAgIGltcGFjdEJ1aWxkZXIKICAgICAgICAgICAgLnJlZ2lzdGVyQ29uc3RhbnRVc2UobmV3IENvbnN0YW50VXNlLmN1c3RvbUVsZW1lbnRzKGNvbnN0YW50KSk7CiAgICAgIH0KICAgIH0KICAgIGFjdGl2ZUNsYXNzZXMuYWRkQWxsKG5ld0FjdGl2ZUNsYXNzZXMpOwogICAgaW5zdGFudGlhdGVkQ2xhc3Nlcy5yZW1vdmVBbGwobmV3QWN0aXZlQ2xhc3Nlcyk7CiAgICByZXR1cm4gaW1wYWN0QnVpbGRlci5mbHVzaCgpOwogIH0KCiAgVHlwZUNvbnN0YW50VmFsdWUgX21ha2VUeXBlQ29uc3RhbnQoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRSYXdUeXBlKGNscyk7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZVR5cGUoX2NvbW1vbkVsZW1lbnRzLCB0eXBlKTsKICB9CgogIExpc3Q8Q29uc3RydWN0b3JFbnRpdHk+IGNvbXB1dGVFc2NhcGluZ0NvbnN0cnVjdG9ycyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIExpc3Q8Q29uc3RydWN0b3JFbnRpdHk+IHJlc3VsdCA9IDxDb25zdHJ1Y3RvckVudGl0eT5bXTsKICAgIC8vIE9ubHkgY2xhc3NlcyB0aGF0IGV4dGVuZCBuYXRpdmUgY2xhc3NlcyBoYXZlIGNvbnN0cnVjdG9ycyBpbiB0aGUgdGFibGUuCiAgICAvLyBXZSBjb3VsZCByZWZpbmUgdGhpcyB0byBjbGFzc2VzIHRoYXQgZXh0ZW5kIEVsZW1lbnQsIGJ1dCB0aGF0IHdvdWxkIGJyZWFrCiAgICAvLyB0aGUgdGVzdHMgYW5kIHRoZXJlIGlzIG5vIHNhbmUgcmVhc29uIHRvIHN1YmNsYXNzIG90aGVyIG5hdGl2ZSBjbGFzc2VzLgogICAgaWYgKF9uYXRpdmVEYXRhLmlzTmF0aXZlQ2xhc3MoY2xzKSkgcmV0dXJuIHJlc3VsdDsKCiAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hDb25zdHJ1Y3RvcihjbHMsCiAgICAgICAgKENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yKSB7CiAgICAgIGlmIChjb25zdHJ1Y3Rvci5pc0dlbmVyYXRpdmVDb25zdHJ1Y3RvcikgewogICAgICAgIC8vIEVuc3VyZSB0aGF0IHBhcmFtZXRlciBzdHJ1Y3R1cmUgaGFzIGJlZW4gY29tcHV0ZWQgYnkgcXVlcnlpbmcgdGhlCiAgICAgICAgLy8gZnVuY3Rpb24gdHlwZS4KICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShjb25zdHJ1Y3Rvcik7CiAgICAgICAgLy8gSWdub3JlIGNvbnN0cnVjdG9ycyB0aGF0IGNhbm5vdCBiZSBjYWxsZWQgd2l0aCB6ZXJvIGFyZ3VtZW50cy4KICAgICAgICBpZiAoY29uc3RydWN0b3IucGFyYW1ldGVyU3RydWN0dXJlLnJlcXVpcmVkUGFyYW1ldGVycyA9PSAwKSB7CiAgICAgICAgICByZXN1bHQuYWRkKGNvbnN0cnVjdG9yKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KgPMATk48ASI/IyQhKjsnMDYbASEETksiBE5PUCcESU4PBDoEUVE4BEMERwQIBB0VHzgKQwRPLCUwKAEeSQEnATQ7RCBCFzMnBAExHUUcBgQBTScCAUwMKQEkLSUiLy88N0BRUE9OOSQEASwgT042KjcmPE0UJgYEAgFJDCkBP0kvPUBRUE9OOSQEAS8jBAEoAUgBOy0CASMwKCUyARwBUQFROkcBH0MBQyMBJxkBMEEBHkgxOToBGC8zMzZQUSs5GkgjOy5GSzQKHR9PClEjORZMCAYsNSIEATk5PgQBSTxPUU83ATAqMU0aOkpGIwoICBMEAgE9cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9jdXN0b21fZWxlbWVudHNfYW5hbHlzaXMuZGFydEBzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2ltcGFjdF90cmFuc2Zvcm1lci5kYXJ0wABGIC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGpzX2JhY2tlbmQuYmFja2VuZC5pbXBhY3RfdHJhbnNmb3JtZXI7CgppbXBvcnQgJy4uL3VuaXZlcnNlL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5QnVpbGRlcjsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vYmFja2VuZF9hcGkuZGFydCcgc2hvdyBJbXBhY3RUcmFuc2Zvcm1lcjsKaW1wb3J0ICcuLi9jb21tb24vY29kZWdlbi5kYXJ0JyBzaG93IENvZGVnZW5JbXBhY3Q7CmltcG9ydCAnLi4vY29tbW9uL3Jlc29sdXRpb24uZGFydCcgc2hvdyBSZXNvbHV0aW9uSW1wYWN0OwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IEVsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICcuLi9jb25zdGFudHMvZXhwcmVzc2lvbnMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19lbWl0dGVyL25hdGl2ZV9lbWl0dGVyLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9lbnF1ZXVlLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9iZWhhdmlvci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9mZWF0dXJlLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydCcgc2hvdyBUcmFuc2Zvcm1lZFdvcmxkSW1wYWN0LCBXb3JsZEltcGFjdDsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCc7CmltcG9ydCAnYW5ub3RhdGlvbnMuZGFydCc7CmltcG9ydCAnYmFja2VuZF9pbXBhY3QuZGFydCc7CmltcG9ydCAnYmFja2VuZF91c2FnZS5kYXJ0JzsKaW1wb3J0ICdjdXN0b21fZWxlbWVudHNfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnaW50ZXJjZXB0b3JfZGF0YS5kYXJ0JzsKaW1wb3J0ICduYW1lci5kYXJ0JzsKaW1wb3J0ICduYXRpdmVfZGF0YS5kYXJ0JzsKaW1wb3J0ICdydW50aW1lX3R5cGVzLmRhcnQnOwppbXBvcnQgJ3J1bnRpbWVfdHlwZXNfcmVzb2x1dGlvbi5kYXJ0JzsKCmNsYXNzIEphdmFTY3JpcHRJbXBhY3RUcmFuc2Zvcm1lciBleHRlbmRzIEltcGFjdFRyYW5zZm9ybWVyIHsKICBmaW5hbCBFbGVtZW50RW52aXJvbm1lbnQgX2VsZW1lbnRFbnZpcm9ubWVudDsKICBmaW5hbCBDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CiAgZmluYWwgQmFja2VuZEltcGFjdHMgX2ltcGFjdHM7CiAgZmluYWwgTmF0aXZlQmFzaWNEYXRhIF9uYXRpdmVCYXNpY0RhdGE7CiAgZmluYWwgTmF0aXZlUmVzb2x1dGlvbkVucXVldWVyIF9uYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXI7CiAgZmluYWwgQmFja2VuZFVzYWdlQnVpbGRlciBfYmFja2VuZFVzYWdlQnVpbGRlcjsKICBmaW5hbCBDdXN0b21FbGVtZW50c1Jlc29sdXRpb25BbmFseXNpcyBfY3VzdG9tRWxlbWVudHNSZXNvbHV0aW9uQW5hbHlzaXM7CiAgZmluYWwgUnVudGltZVR5cGVzTmVlZEJ1aWxkZXIgX3J0aU5lZWRCdWlsZGVyOwogIGZpbmFsIENsYXNzSGllcmFyY2h5QnVpbGRlciBfY2xhc3NIaWVyYXJjaHlCdWlsZGVyOwogIGZpbmFsIEFubm90YXRpb25zRGF0YSBfYW5ub3RhdGlvbnNEYXRhOwoKICBKYXZhU2NyaXB0SW1wYWN0VHJhbnNmb3JtZXIoCiAgICAgIHRoaXMuX2VsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgdGhpcy5fY29tbW9uRWxlbWVudHMsCiAgICAgIHRoaXMuX2ltcGFjdHMsCiAgICAgIHRoaXMuX25hdGl2ZUJhc2ljRGF0YSwKICAgICAgdGhpcy5fbmF0aXZlUmVzb2x1dGlvbkVucXVldWVyLAogICAgICB0aGlzLl9iYWNrZW5kVXNhZ2VCdWlsZGVyLAogICAgICB0aGlzLl9jdXN0b21FbGVtZW50c1Jlc29sdXRpb25BbmFseXNpcywKICAgICAgdGhpcy5fcnRpTmVlZEJ1aWxkZXIsCiAgICAgIHRoaXMuX2NsYXNzSGllcmFyY2h5QnVpbGRlciwKICAgICAgdGhpcy5fYW5ub3RhdGlvbnNEYXRhKTsKCiAgQG92ZXJyaWRlCiAgV29ybGRJbXBhY3QgdHJhbnNmb3JtUmVzb2x1dGlvbkltcGFjdChSZXNvbHV0aW9uSW1wYWN0IHdvcmxkSW1wYWN0KSB7CiAgICBUcmFuc2Zvcm1lZFdvcmxkSW1wYWN0IHRyYW5zZm9ybWVkID0KICAgICAgICBuZXcgVHJhbnNmb3JtZWRXb3JsZEltcGFjdCh3b3JsZEltcGFjdCk7CgogICAgdm9pZCByZWdpc3RlckltcGFjdChCYWNrZW5kSW1wYWN0IGltcGFjdCkgewogICAgICBpbXBhY3QucmVnaXN0ZXJJbXBhY3QodHJhbnNmb3JtZWQsIF9lbGVtZW50RW52aXJvbm1lbnQpOwogICAgICBfYmFja2VuZFVzYWdlQnVpbGRlci5wcm9jZXNzQmFja2VuZEltcGFjdChpbXBhY3QpOwogICAgfQoKICAgIGZvciAoRmVhdHVyZSBmZWF0dXJlIGluIHdvcmxkSW1wYWN0LmZlYXR1cmVzKSB7CiAgICAgIHN3aXRjaCAoZmVhdHVyZSkgewogICAgICAgIGNhc2UgRmVhdHVyZS5BQlNUUkFDVF9DTEFTU19JTlNUQU5USUFUSU9OOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuYWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLkFTU0VSVDoKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLmFzc2VydFdpdGhvdXRNZXNzYWdlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRmVhdHVyZS5BU1NFUlRfV0lUSF9NRVNTQUdFOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuYXNzZXJ0V2l0aE1lc3NhZ2UpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLkFTWU5DOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuYXN5bmNCb2R5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRmVhdHVyZS5BU1lOQ19GT1JfSU46CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5hc3luY0ZvckluKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRmVhdHVyZS5BU1lOQ19TVEFSOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuYXN5bmNTdGFyQm9keSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZlYXR1cmUuQ0FUQ0hfU1RBVEVNRU5UOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuY2F0Y2hTdGF0ZW1lbnQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLkZBTExfVEhST1VHSF9FUlJPUjoKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLmZhbGxUaHJvdWdoRXJyb3IpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLkZJRUxEX1dJVEhPVVRfSU5JVElBTElaRVI6CiAgICAgICAgY2FzZSBGZWF0dXJlLkxPQ0FMX1dJVEhPVVRfSU5JVElBTElaRVI6CiAgICAgICAgICB0cmFuc2Zvcm1lZC5yZWdpc3RlclR5cGVVc2UoCiAgICAgICAgICAgICAgbmV3IFR5cGVVc2UuaW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMubnVsbFR5cGUpKTsKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLm51bGxMaXRlcmFsKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRmVhdHVyZS5MQVpZX0ZJRUxEOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMubGF6eUZpZWxkKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRmVhdHVyZS5TVEFDS19UUkFDRV9JTl9DQVRDSDoKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLnN0YWNrVHJhY2VJbkNhdGNoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRmVhdHVyZS5TVFJJTkdfSU5URVJQT0xBVElPTjoKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLnN0cmluZ0ludGVycG9sYXRpb24pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLlNUUklOR19KVVhUQVBPU0lUSU9OOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuc3RyaW5nSnV4dGFwb3NpdGlvbik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZlYXR1cmUuU1VQRVJfTk9fU1VDSF9NRVRIT0Q6CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5zdXBlck5vU3VjaE1ldGhvZCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZlYXR1cmUuU1lNQk9MX0NPTlNUUlVDVE9SOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuc3ltYm9sQ29uc3RydWN0b3IpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLlNZTkNfRk9SX0lOOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuc3luY0ZvckluKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRmVhdHVyZS5TWU5DX1NUQVI6CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5zeW5jU3RhckJvZHkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLlRIUk9XX0VYUFJFU1NJT046CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy50aHJvd0V4cHJlc3Npb24pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLlRIUk9XX05PX1NVQ0hfTUVUSE9EOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMudGhyb3dOb1N1Y2hNZXRob2QpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLlRIUk9XX1JVTlRJTUVfRVJST1I6CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy50aHJvd1J1bnRpbWVFcnJvcik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZlYXR1cmUuVEhST1dfVU5TVVBQT1JURURfRVJST1I6CiAgICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy50aHJvd1Vuc3VwcG9ydGVkRXJyb3IpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBGZWF0dXJlLlRZUEVfVkFSSUFCTEVfQk9VTkRTX0NIRUNLOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMudHlwZVZhcmlhYmxlQm91bmRDaGVjayk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZlYXR1cmUuTE9BRF9MSUJSQVJZOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMubG9hZExpYnJhcnkpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBib29sIGhhc0FzQ2FzdCA9IGZhbHNlOwogICAgYm9vbCBoYXNUeXBlTGl0ZXJhbCA9IGZhbHNlOwogICAgZm9yIChUeXBlVXNlIHR5cGVVc2UgaW4gd29ybGRJbXBhY3QudHlwZVVzZXMpIHsKICAgICAgRGFydFR5cGUgdHlwZSA9IHR5cGVVc2UudHlwZTsKICAgICAgc3dpdGNoICh0eXBlVXNlLmtpbmQpIHsKICAgICAgICBjYXNlIFR5cGVVc2VLaW5kLklOU1RBTlRJQVRJT046CiAgICAgICAgY2FzZSBUeXBlVXNlS2luZC5DT05TVF9JTlNUQU5USUFUSU9OOgogICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuTkFUSVZFX0lOU1RBTlRJQVRJT046CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFR5cGVVc2VLaW5kLklTX0NIRUNLOgogICAgICAgICAgb25Jc0NoZWNrKHR5cGUsIHRyYW5zZm9ybWVkKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuQVNfQ0FTVDoKICAgICAgICAgIGlmIChfYW5ub3RhdGlvbnNEYXRhCiAgICAgICAgICAgICAgLmdldEV4cGxpY2l0Q2FzdENoZWNrUG9saWN5KHdvcmxkSW1wYWN0Lm1lbWJlcikKICAgICAgICAgICAgICAuaXNFbWl0dGVkKSB7CiAgICAgICAgICAgIG9uSXNDaGVjayh0eXBlLCB0cmFuc2Zvcm1lZCk7CiAgICAgICAgICAgIGhhc0FzQ2FzdCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFR5cGVVc2VLaW5kLklNUExJQ0lUX0NBU1Q6CiAgICAgICAgICBpZiAoX2Fubm90YXRpb25zRGF0YQogICAgICAgICAgICAgIC5nZXRJbXBsaWNpdERvd25jYXN0Q2hlY2tQb2xpY3kod29ybGRJbXBhY3QubWVtYmVyKQogICAgICAgICAgICAgIC5pc0VtaXR0ZWQpIHsKICAgICAgICAgICAgb25Jc0NoZWNrKHR5cGUsIHRyYW5zZm9ybWVkKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuUEFSQU1FVEVSX0NIRUNLOgogICAgICAgICAgaWYgKF9hbm5vdGF0aW9uc0RhdGEKICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyQ2hlY2tQb2xpY3kod29ybGRJbXBhY3QubWVtYmVyKQogICAgICAgICAgICAgIC5pc0VtaXR0ZWQpIHsKICAgICAgICAgICAgb25Jc0NoZWNrKHR5cGUsIHRyYW5zZm9ybWVkKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVVzZUtpbmQuQ0FUQ0hfVFlQRToKICAgICAgICAgIG9uSXNDaGVjayh0eXBlLCB0cmFuc2Zvcm1lZCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFR5cGVVc2VLaW5kLlRZUEVfTElURVJBTDoKICAgICAgICAgIF9jdXN0b21FbGVtZW50c1Jlc29sdXRpb25BbmFseXNpcy5yZWdpc3RlclR5cGVMaXRlcmFsKHR5cGUpOwogICAgICAgICAgaWYgKHR5cGUuaXNUeXBlVmFyaWFibGUpIHsKICAgICAgICAgICAgVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUgPSB0eXBlOwogICAgICAgICAgICBFbnRpdHkgdHlwZURlY2xhcmF0aW9uID0gdHlwZVZhcmlhYmxlLmVsZW1lbnQudHlwZURlY2xhcmF0aW9uOwogICAgICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGlzIENsYXNzRW50aXR5KSB7CiAgICAgICAgICAgICAgX3J0aU5lZWRCdWlsZGVyCiAgICAgICAgICAgICAgICAgIC5yZWdpc3RlckNsYXNzVXNpbmdUeXBlVmFyaWFibGVMaXRlcmFsKHR5cGVEZWNsYXJhdGlvbik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZURlY2xhcmF0aW9uIGlzIEZ1bmN0aW9uRW50aXR5KSB7CiAgICAgICAgICAgICAgX3J0aU5lZWRCdWlsZGVyCiAgICAgICAgICAgICAgICAgIC5yZWdpc3Rlck1ldGhvZFVzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbCh0eXBlRGVjbGFyYXRpb24pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVEZWNsYXJhdGlvbiBpcyBMb2NhbCkgewogICAgICAgICAgICAgIF9ydGlOZWVkQnVpbGRlci5yZWdpc3RlckxvY2FsRnVuY3Rpb25Vc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWwoCiAgICAgICAgICAgICAgICAgIHR5cGVEZWNsYXJhdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMudHlwZVZhcmlhYmxlRXhwcmVzc2lvbik7CiAgICAgICAgICB9CiAgICAgICAgICBoYXNUeXBlTGl0ZXJhbCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFR5cGVVc2VLaW5kLlJUSV9WQUxVRToKICAgICAgICBjYXNlIFR5cGVVc2VLaW5kLlRZUEVfQVJHVU1FTlQ6CiAgICAgICAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCAiVW5leHBlY3RlZCB0eXBlIHVzZTogJHR5cGVVc2UuIik7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIGlmIChoYXNBc0Nhc3QpIHsKICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuYXNDaGVjayk7CiAgICB9CgogICAgaWYgKGhhc1R5cGVMaXRlcmFsKSB7CiAgICAgIHRyYW5zZm9ybWVkCiAgICAgICAgICAucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLnR5cGVUeXBlKSk7CiAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLnR5cGVMaXRlcmFsKTsKICAgIH0KCiAgICBmb3IgKE1hcExpdGVyYWxVc2UgbWFwTGl0ZXJhbFVzZSBpbiB3b3JsZEltcGFjdC5tYXBMaXRlcmFscykgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgdGhlIFtpc0VtcHR5XSBwcm9wZXJ0eSB3aGVuIGZhY3RvcnkKICAgICAgLy8gY29uc3RydWN0b3JzIGFyZSByZWdpc3RlcmVkIGRpcmVjdGx5LgogICAgICBpZiAobWFwTGl0ZXJhbFVzZS5pc0NvbnN0YW50KSB7CiAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuY29uc3RhbnRNYXBMaXRlcmFsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0cmFuc2Zvcm1lZAogICAgICAgICAgICAucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24obWFwTGl0ZXJhbFVzZS50eXBlKSk7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKFNldExpdGVyYWxVc2Ugc2V0TGl0ZXJhbFVzZSBpbiB3b3JsZEltcGFjdC5zZXRMaXRlcmFscykgewogICAgICBpZiAoc2V0TGl0ZXJhbFVzZS5pc0NvbnN0YW50KSB7CiAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuY29uc3RhbnRTZXRMaXRlcmFsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0cmFuc2Zvcm1lZAogICAgICAgICAgICAucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24oc2V0TGl0ZXJhbFVzZS50eXBlKSk7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKExpc3RMaXRlcmFsVXNlIGxpc3RMaXRlcmFsVXNlIGluIHdvcmxkSW1wYWN0Lmxpc3RMaXRlcmFscykgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgdGhlIFtpc0NvbnN0YW50XSBhbmQgW2lzRW1wdHldIHByb3BlcnR5IHdoZW4KICAgICAgLy8gZmFjdG9yeSBjb25zdHJ1Y3RvcnMgYXJlIHJlZ2lzdGVyZWQgZGlyZWN0bHkuCiAgICAgIHRyYW5zZm9ybWVkCiAgICAgICAgICAucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24obGlzdExpdGVyYWxVc2UudHlwZSkpOwogICAgfQoKICAgIGZvciAoUnVudGltZVR5cGVVc2UgcnVudGltZVR5cGVVc2UgaW4gd29ybGRJbXBhY3QucnVudGltZVR5cGVVc2VzKSB7CiAgICAgIC8vIEVuYWJsZSBydW50aW1lIHR5cGUgc3VwcG9ydCBpZiB3ZSBkaXNjb3ZlciBhIGdldHRlciBjYWxsZWQKICAgICAgLy8gcnVudGltZVR5cGUuIFdlIGhhdmUgdG8gZW5hYmxlIHJ1bnRpbWUgdHlwZSBiZWZvcmUgaGl0dGluZyB0aGUKICAgICAgLy8gY29kZWdlbiwgc28gdGhhdCBjb25zdHJ1Y3RvcnMga25vdyB3aGV0aGVyIHRoZXkgbmVlZCB0byBnZW5lcmF0ZSBjb2RlCiAgICAgIC8vIGZvciBydW50aW1lIHR5cGUuCiAgICAgIF9iYWNrZW5kVXNhZ2VCdWlsZGVyLnJlZ2lzdGVyUnVudGltZVR5cGVVc2UocnVudGltZVR5cGVVc2UpOwogICAgfQoKICAgIGlmICh3b3JsZEltcGFjdC5jb25zdFN5bWJvbE5hbWVzLmlzTm90RW1wdHkpIHsKICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuY29uc3RTeW1ib2wpOwogICAgfQoKICAgIGZvciAoU3RhdGljVXNlIHN0YXRpY1VzZSBpbiB3b3JsZEltcGFjdC5zdGF0aWNVc2VzKSB7CiAgICAgIHN3aXRjaCAoc3RhdGljVXNlLmtpbmQpIHsKICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuQ0xPU1VSRToKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLmNsb3N1cmUpOwogICAgICAgICAgTG9jYWwgY2xvc3VyZSA9IHN0YXRpY1VzZS5lbGVtZW50OwogICAgICAgICAgRnVuY3Rpb25UeXBlIHR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldExvY2FsRnVuY3Rpb25UeXBlKGNsb3N1cmUpOwogICAgICAgICAgaWYgKHR5cGUuY29udGFpbnNUeXBlVmFyaWFibGVzIHx8CiAgICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2FuIHdlIGF2b2lkIHRoZSBuZWVkIGZvciBzaWduYXR1cmVzIGluCiAgICAgICAgICAgICAgLy8gRGFydCAyPwogICAgICAgICAgICAgIHRydWUpIHsKICAgICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuY29tcHV0ZVNpZ25hdHVyZSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICB9CiAgICB9CgogICAgZm9yIChDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnQgaW4gd29ybGRJbXBhY3QuY29uc3RhbnRMaXRlcmFscykgewogICAgICBzd2l0Y2ggKGNvbnN0YW50LmtpbmQpIHsKICAgICAgICBjYXNlIENvbnN0YW50RXhwcmVzc2lvbktpbmQuTlVMTDoKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLm51bGxMaXRlcmFsKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ29uc3RhbnRFeHByZXNzaW9uS2luZC5CT09MOgogICAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuYm9vbExpdGVyYWwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDb25zdGFudEV4cHJlc3Npb25LaW5kLklOVDoKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLmludExpdGVyYWwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDb25zdGFudEV4cHJlc3Npb25LaW5kLkRPVUJMRToKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLmRvdWJsZUxpdGVyYWwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDb25zdGFudEV4cHJlc3Npb25LaW5kLlNUUklORzoKICAgICAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLnN0cmluZ0xpdGVyYWwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGFzc2VydCgKICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICBmYWlsZWRBdChOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGNvbnN0YW50IGxpdGVyYWw6ICR7Y29uc3RhbnQua2luZH0uIikpOwogICAgICB9CiAgICB9CgogICAgZm9yIChOYXRpdmVCZWhhdmlvciBiZWhhdmlvciBpbiB3b3JsZEltcGFjdC5uYXRpdmVEYXRhKSB7CiAgICAgIF9uYXRpdmVSZXNvbHV0aW9uRW5xdWV1ZXIucmVnaXN0ZXJOYXRpdmVCZWhhdmlvcigKICAgICAgICAgIHRyYW5zZm9ybWVkLCBiZWhhdmlvciwgd29ybGRJbXBhY3QpOwogICAgfQoKICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xhc3NFbnRpdHkgaW4gd29ybGRJbXBhY3Quc2VlbkNsYXNzZXMpIHsKICAgICAgX2NsYXNzSGllcmFyY2h5QnVpbGRlci5yZWdpc3RlckNsYXNzKGNsYXNzRW50aXR5KTsKICAgIH0KCiAgICBpZiAod29ybGRJbXBhY3QuZ2VuZXJpY0luc3RhbnRpYXRpb25zLmlzTm90RW1wdHkpIHsKICAgICAgZm9yIChHZW5lcmljSW5zdGFudGlhdGlvbiBpbnN0YW50aWF0aW9uCiAgICAgICAgICBpbiB3b3JsZEltcGFjdC5nZW5lcmljSW5zdGFudGlhdGlvbnMpIHsKICAgICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cwogICAgICAgICAgICAuZ2V0R2VuZXJpY0luc3RhbnRpYXRpb24oaW5zdGFudGlhdGlvbi50eXBlQXJndW1lbnRzLmxlbmd0aCkpOwogICAgICAgIF9ydGlOZWVkQnVpbGRlci5yZWdpc3RlckdlbmVyaWNJbnN0YW50aWF0aW9uKGluc3RhbnRpYXRpb24pOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRyYW5zZm9ybWVkOwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWF5YmUgc3BsaXQgdGhpcyBpbnRvIFtvbkFzc2VydFR5cGVdIGFuZCBbb25UZXN0VHlwZV0uCiAgdm9pZCBvbklzQ2hlY2soRGFydFR5cGUgdHlwZSwgVHJhbnNmb3JtZWRXb3JsZEltcGFjdCB0cmFuc2Zvcm1lZCkgewogICAgdm9pZCByZWdpc3RlckltcGFjdChCYWNrZW5kSW1wYWN0IGltcGFjdCkgewogICAgICBpbXBhY3QucmVnaXN0ZXJJbXBhY3QodHJhbnNmb3JtZWQsIF9lbGVtZW50RW52aXJvbm1lbnQpOwogICAgICBfYmFja2VuZFVzYWdlQnVpbGRlci5wcm9jZXNzQmFja2VuZEltcGFjdChpbXBhY3QpOwogICAgfQoKICAgIHR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFVuYWxpYXNlZFR5cGUodHlwZSk7CiAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy50eXBlQ2hlY2spOwoKICAgIGlmICghdHlwZS50cmVhdEFzUmF3IHx8IHR5cGUuY29udGFpbnNUeXBlVmFyaWFibGVzIHx8IHR5cGUuaXNGdW5jdGlvblR5cGUpIHsKICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMuZ2VuZXJpY1R5cGVDaGVjayk7CiAgICAgIGlmICh0eXBlLmlzVHlwZVZhcmlhYmxlKSB7CiAgICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMudHlwZVZhcmlhYmxlVHlwZUNoZWNrKTsKICAgICAgfQogICAgfQogICAgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIHJlZ2lzdGVySW1wYWN0KF9pbXBhY3RzLmZ1bmN0aW9uVHlwZUNoZWNrKTsKICAgIH0KICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYgX25hdGl2ZUJhc2ljRGF0YS5pc05hdGl2ZUNsYXNzKHR5cGUuZWxlbWVudCkpIHsKICAgICAgcmVnaXN0ZXJJbXBhY3QoX2ltcGFjdHMubmF0aXZlVHlwZUNoZWNrKTsKICAgIH0KICAgIGlmICh0eXBlIGlzIEZ1dHVyZU9yVHlwZSkgewogICAgICByZWdpc3RlckltcGFjdChfaW1wYWN0cy5mdXR1cmVPclR5cGVDaGVjayk7CiAgICB9CiAgfQp9CgpjbGFzcyBDb2RlZ2VuSW1wYWN0VHJhbnNmb3JtZXIgewogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CiAgZmluYWwgRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CiAgZmluYWwgQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwogIGZpbmFsIEJhY2tlbmRJbXBhY3RzIF9pbXBhY3RzOwogIGZpbmFsIE5hdGl2ZURhdGEgX25hdGl2ZURhdGE7CiAgZmluYWwgQmFja2VuZFVzYWdlIF9iYWNrZW5kVXNhZ2U7CiAgZmluYWwgUnVudGltZVR5cGVzTmVlZCBfcnRpTmVlZDsKICBmaW5hbCBOYXRpdmVDb2RlZ2VuRW5xdWV1ZXIgX25hdGl2ZUNvZGVnZW5FbnF1ZXVlcjsKICBmaW5hbCBOYW1lciBfbmFtZXI7CiAgZmluYWwgT25lU2hvdEludGVyY2VwdG9yRGF0YSBfb25lU2hvdEludGVyY2VwdG9yRGF0YTsKICBmaW5hbCBSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyIF9ydGlDaGVja3NCdWlsZGVyOwogIGZpbmFsIE5hdGl2ZUVtaXR0ZXIgX25hdGl2ZUVtaXR0ZXI7CgogIENvZGVnZW5JbXBhY3RUcmFuc2Zvcm1lcigKICAgICAgdGhpcy5fY2xvc2VkV29ybGQsCiAgICAgIHRoaXMuX2VsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgdGhpcy5fY29tbW9uRWxlbWVudHMsCiAgICAgIHRoaXMuX2ltcGFjdHMsCiAgICAgIHRoaXMuX25hdGl2ZURhdGEsCiAgICAgIHRoaXMuX2JhY2tlbmRVc2FnZSwKICAgICAgdGhpcy5fcnRpTmVlZCwKICAgICAgdGhpcy5fbmF0aXZlQ29kZWdlbkVucXVldWVyLAogICAgICB0aGlzLl9uYW1lciwKICAgICAgdGhpcy5fb25lU2hvdEludGVyY2VwdG9yRGF0YSwKICAgICAgdGhpcy5fcnRpQ2hlY2tzQnVpbGRlciwKICAgICAgdGhpcy5fbmF0aXZlRW1pdHRlcik7CgogIHZvaWQgb25Jc0NoZWNrRm9yQ29kZWdlbihEYXJ0VHlwZSB0eXBlLCBUcmFuc2Zvcm1lZFdvcmxkSW1wYWN0IHRyYW5zZm9ybWVkKSB7CiAgICBpZiAodHlwZS5pc0R5bmFtaWMpIHJldHVybjsKICAgIGlmICh0eXBlLmlzVm9pZCkgcmV0dXJuOwogICAgdHlwZSA9IHR5cGUudW5hbGlhc2VkOwogICAgX2ltcGFjdHMudHlwZUNoZWNrLnJlZ2lzdGVySW1wYWN0KHRyYW5zZm9ybWVkLCBfZWxlbWVudEVudmlyb25tZW50KTsKCiAgICBpZiAoIXR5cGUudHJlYXRBc1JhdyB8fCB0eXBlLmNvbnRhaW5zVHlwZVZhcmlhYmxlcykgewogICAgICBfaW1wYWN0cy5nZW5lcmljSXNDaGVjay5yZWdpc3RlckltcGFjdCh0cmFuc2Zvcm1lZCwgX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgICB9CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmIF9uYXRpdmVEYXRhLmlzTmF0aXZlQ2xhc3ModHlwZS5lbGVtZW50KSkgewogICAgICAvLyBXZSB3aWxsIG5lZWVkIHRvIGFkZCB0aGUgIiRpcyIgYW5kICIkYXMiIHByb3BlcnRpZXMgb24gdGhlCiAgICAgIC8vIEphdmFTY3JpcHQgb2JqZWN0IHByb3RvdHlwZSwgc28gd2UgbWFrZSBzdXJlCiAgICAgIC8vIFs6ZGVmaW5lUHJvcGVydHk6XSBpcyBjb21waWxlZC4KICAgICAgX2ltcGFjdHMubmF0aXZlVHlwZUNoZWNrLnJlZ2lzdGVySW1wYWN0KHRyYW5zZm9ybWVkLCBfZWxlbWVudEVudmlyb25tZW50KTsKICAgIH0KICB9CgogIFdvcmxkSW1wYWN0IHRyYW5zZm9ybUNvZGVnZW5JbXBhY3QoQ29kZWdlbkltcGFjdCBpbXBhY3QpIHsKICAgIFRyYW5zZm9ybWVkV29ybGRJbXBhY3QgdHJhbnNmb3JtZWQgPSBuZXcgVHJhbnNmb3JtZWRXb3JsZEltcGFjdChpbXBhY3QpOwoKICAgIGZvciAoVHlwZVVzZSB0eXBlVXNlIGluIGltcGFjdC50eXBlVXNlcykgewogICAgICBEYXJ0VHlwZSB0eXBlID0gdHlwZVVzZS50eXBlOwogICAgICBpZiAodHlwZVVzZS5raW5kID09IFR5cGVVc2VLaW5kLklTX0NIRUNLKSB7CiAgICAgICAgb25Jc0NoZWNrRm9yQ29kZWdlbih0eXBlLCB0cmFuc2Zvcm1lZCk7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKENvbnN0YW50VXNlIGNvbnN0YW50VXNlIGluIGltcGFjdC5jb25zdGFudFVzZXMpIHsKICAgICAgc3dpdGNoIChjb25zdGFudFVzZS52YWx1ZS5raW5kKSB7CiAgICAgICAgY2FzZSBDb25zdGFudFZhbHVlS2luZC5ERUZFUlJFRF9HTE9CQUw6CiAgICAgICAgICBfY2xvc2VkV29ybGQub3V0cHV0VW5pdERhdGEKICAgICAgICAgICAgICAucmVnaXN0ZXJDb25zdGFudERlZmVycmVkVXNlKGNvbnN0YW50VXNlLnZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIGZvciAoUGFpcjxEYXJ0VHlwZSwgRGFydFR5cGU+IGNoZWNrCiAgICAgICAgaW4gaW1wYWN0LnR5cGVWYXJpYWJsZUJvdW5kc1N1YnR5cGVDaGVja3MpIHsKICAgICAgX3J0aUNoZWNrc0J1aWxkZXIucmVnaXN0ZXJUeXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2soCiAgICAgICAgICBjaGVjay5hLCBjaGVjay5iKTsKICAgIH0KCiAgICBmb3IgKFN0YXRpY1VzZSBzdGF0aWNVc2UgaW4gaW1wYWN0LnN0YXRpY1VzZXMpIHsKICAgICAgc3dpdGNoIChzdGF0aWNVc2Uua2luZCkgewogICAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DQUxMX01FVEhPRDoKICAgICAgICAgIEZ1bmN0aW9uRW50aXR5IGNhbGxNZXRob2QgPSBzdGF0aWNVc2UuZWxlbWVudDsKICAgICAgICAgIGlmIChfcnRpTmVlZC5tZXRob2ROZWVkc1NpZ25hdHVyZShjYWxsTWV0aG9kKSkgewogICAgICAgICAgICBfaW1wYWN0cy5jb21wdXRlU2lnbmF0dXJlCiAgICAgICAgICAgICAgICAucmVnaXN0ZXJJbXBhY3QodHJhbnNmb3JtZWQsIF9lbGVtZW50RW52aXJvbm1lbnQpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNUQVRJQ19URUFSX09GRjoKICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuSU5TVEFOQ0VfRklFTERfR0VUOgogICAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5JTlNUQU5DRV9GSUVMRF9TRVQ6CiAgICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLlNVUEVSX0lOVk9LRToKICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuU1RBVElDX0lOVk9LRToKICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuU1VQRVJfRklFTERfU0VUOgogICAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVVBFUl9TRVRURVJfU0VUOgogICAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVEFUSUNfU0VUOgogICAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVVBFUl9URUFSX09GRjoKICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuU1VQRVJfR0VUOgogICAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5TVEFUSUNfR0VUOgogICAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5GSUVMRF9JTklUOgogICAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5GSUVMRF9DT05TVEFOVF9JTklUOgogICAgICAgIGNhc2UgU3RhdGljVXNlS2luZC5DT05TVFJVQ1RPUl9JTlZPS0U6CiAgICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNPTlNUX0NPTlNUUlVDVE9SX0lOVk9LRToKICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuRElSRUNUX0lOVk9LRToKICAgICAgICBjYXNlIFN0YXRpY1VzZUtpbmQuSU5MSU5JTkc6CiAgICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNMT1NVUkU6CiAgICAgICAgY2FzZSBTdGF0aWNVc2VLaW5kLkNMT1NVUkVfQ0FMTDoKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgZm9yIChTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXMgaW4gaW1wYWN0LnNwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JzKSB7CiAgICAgIF9vbmVTaG90SW50ZXJjZXB0b3JEYXRhLnJlZ2lzdGVyU3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcigKICAgICAgICAgIGNsYXNzZXMsIF9uYW1lcik7CiAgICB9CgogICAgaWYgKGltcGFjdC51c2VzSW50ZXJjZXB0b3IpIHsKICAgICAgaWYgKF9uYXRpdmVDb2RlZ2VuRW5xdWV1ZXIuaGFzSW5zdGFudGlhdGVkTmF0aXZlQ2xhc3NlcykgewogICAgICAgIF9pbXBhY3RzLmludGVyY2VwdG9yVXNlCiAgICAgICAgICAgIC5yZWdpc3RlckltcGFjdCh0cmFuc2Zvcm1lZCwgX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXZvaWQgdGhlc2Ugd29ya2Fyb3VuZHMuCiAgICAgICAgX2JhY2tlbmRVc2FnZS5uZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnID0gdHJ1ZTsKICAgICAgICBfYmFja2VuZFVzYWdlLm5lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5ID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIGZvciAoQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIgaW4gaW1wYWN0LmFzeW5jTWFya2VycykgewogICAgICBzd2l0Y2ggKGFzeW5jTWFya2VyKSB7CiAgICAgICAgY2FzZSBBc3luY01hcmtlci5BU1lOQzoKICAgICAgICAgIF9pbXBhY3RzLmFzeW5jQm9keS5yZWdpc3RlckltcGFjdCh0cmFuc2Zvcm1lZCwgX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFzeW5jTWFya2VyLlNZTkNfU1RBUjoKICAgICAgICAgIF9pbXBhY3RzLnN5bmNTdGFyQm9keQogICAgICAgICAgICAgIC5yZWdpc3RlckltcGFjdCh0cmFuc2Zvcm1lZCwgX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFzeW5jTWFya2VyLkFTWU5DX1NUQVI6CiAgICAgICAgICBfaW1wYWN0cy5hc3luY1N0YXJCb2R5CiAgICAgICAgICAgICAgLnJlZ2lzdGVySW1wYWN0KHRyYW5zZm9ybWVkLCBfZWxlbWVudEVudmlyb25tZW50KTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgZm9yIChHZW5lcmljSW5zdGFudGlhdGlvbiBpbnN0YW50aWF0aW9uIGluIGltcGFjdC5nZW5lcmljSW5zdGFudGlhdGlvbnMpIHsKICAgICAgX3J0aUNoZWNrc0J1aWxkZXIucmVnaXN0ZXJHZW5lcmljSW5zdGFudGlhdGlvbihpbnN0YW50aWF0aW9uKTsKICAgIH0KCiAgICBmb3IgKE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yIGluIGltcGFjdC5uYXRpdmVCZWhhdmlvcnMpIHsKICAgICAgX25hdGl2ZUNvZGVnZW5FbnF1ZXVlci5yZWdpc3Rlck5hdGl2ZUJlaGF2aW9yKAogICAgICAgICAgdHJhbnNmb3JtZWQsIGJlaGF2aW9yLCBpbXBhY3QpOwogICAgfQoKICAgIGZvciAoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24gaW4gaW1wYWN0Lm5hdGl2ZU1ldGhvZHMpIHsKICAgICAgX25hdGl2ZUVtaXR0ZXIubmF0aXZlTWV0aG9kcy5hZGQoZnVuY3Rpb24pOwogICAgfQoKICAgIGZvciAoU2VsZWN0b3Igc2VsZWN0b3IgaW4gaW1wYWN0Lm9uZVNob3RJbnRlcmNlcHRvcnMpIHsKICAgICAgX29uZVNob3RJbnRlcmNlcHRvckRhdGEucmVnaXN0ZXJPbmVTaG90SW50ZXJjZXB0b3IoCiAgICAgICAgICBzZWxlY3RvciwgX25hbWVyLCBfY2xvc2VkV29ybGQpOwogICAgfQoKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSBlYWdlciByZWdpc3RyYXRpb24uCiAgICByZXR1cm4gdHJhbnNmb3JtZWQ7CiAgfQp9CoH+AE5OPAEvAUYBGSI8NDo6KCMkISwhIiMkH1EcGBseHSggFRsdKAE+MCghKjwyTDE2KgEfIBwVHSYhLhwjHgEMSCkxATA/OQYBNBkzPxEdOREqNhEcLhEjLxEhMhEmMxEpNREwMCdEMBEhLhErNhErOBErOBErNhEpNhEiLhEgMREnNBErNhEqNhEuOhExOxEjMBEIBgEcITQkHiguLxEjKBEiHz4cKh4MESgfQhwqDBEqHzscKgwRJSgRJ0clMksyHks8HkwzTSQOPQwhESQoUREIBgEVKAYBGhJRLAYBQ0YvJjUPFE0IBgFDJjUPFE0IBgFGTzcSTAYBSURITxtDBgEzLAYBOiAkLC1RLE4ZFjcMEREIBgFIHyowESowESkvESwyESwyERESFS5GCAYBPjgvBgE/OQYBOC4yIEtFCAYBGAQBUUYwPzkGATcoAVExITgIBiAyBlEwBiAyBgQCASEjMCghICQjNhY4NSYBHBkgHBUYGhUjEyQeHAFQIB0bSQE6UAZMRDYpUQYEAT1NAS8kMjAIBgE7KDAmPxEREQgGASg1QB0GATUgKDk7JkMMESwvLykqLC0nKyYnJzAvNSolJCkRCAYBSkEcBgEiQSA/OUE/CAYBOx0gTxEkIEERJSFBEQgGAU9FBgE+NSoGATwyBgE8OisGATcYBAIBN3BhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvaW1wYWN0X3RyYW5zZm9ybWVyLmRhcnQ+c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnS/Li8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGpzX2JhY2tlbmQuaW50ZXJjZXB0b3JfZGF0YTsKCmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgSWRlbnRpZmllcnM7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnCiAgICBzaG93IENvbW1vbkVsZW1lbnRzLCBLQ29tbW9uRWxlbWVudHMsIEtFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jbGFzc19zZXQuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CmltcG9ydCAnbmFtZXIuZGFydCcgc2hvdyBNb2R1bGFyTmFtZXIsIHN1ZmZpeEZvckdldEludGVyY2VwdG9yOwppbXBvcnQgJ25hdGl2ZV9kYXRhLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgSW50ZXJjZXB0b3JEYXRhIHsKICAvLy8gRGVzZXJpYWxpemVzIGEgW0ludGVyY2VwdG9yRGF0YV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBJbnRlcmNlcHRvckRhdGEucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwKICAgICAgTmF0aXZlRGF0YSBuYXRpdmVEYXRhLAogICAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgPSBJbnRlcmNlcHRvckRhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZTsKCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbSW50ZXJjZXB0b3JEYXRhXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBpcyBhbiBpbnRlcmNlcHRlZCBjbGFzcy4KICBib29sIGlzSW50ZXJjZXB0ZWRDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KTsKCiAgYm9vbCBpc0ludGVyY2VwdGVkTWV0aG9kKE1lbWJlckVudGl0eSBlbGVtZW50KTsKICBib29sIGZpZWxkSGFzSW50ZXJjZXB0ZWRHZXR0ZXIoRmllbGRFbnRpdHkgZWxlbWVudCk7CiAgYm9vbCBmaWVsZEhhc0ludGVyY2VwdGVkU2V0dGVyKEZpZWxkRW50aXR5IGVsZW1lbnQpOwogIGJvb2wgaXNJbnRlcmNlcHRlZE5hbWUoU3RyaW5nIG5hbWUpOwogIGJvb2wgaXNJbnRlcmNlcHRlZFNlbGVjdG9yKFNlbGVjdG9yIHNlbGVjdG9yKTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmZiBbc2VsZWN0b3JdIG1hdGNoZXMgYW4gZWxlbWVudCBkZWZpbmVkIGluIGEgY2xhc3MgbWl4ZWQKICAvLy8gaW50byBhbiBpbnRlcmNlcHRlZCBjbGFzcy4KICAvLy8KICAvLy8gVGhlc2Ugc2VsZWN0b3JzIGFyZSBub3QgZWxpZ2libGUgZm9yIHRoZSAnZHVtbXkgZXhwbGljaXQgcmVjZWl2ZXInCiAgLy8vIG9wdGltaXphdGlvbi4KICBib29sIGlzSW50ZXJjZXB0ZWRNaXhpblNlbGVjdG9yKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSBtYXNrLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwoKICAvLy8gU2V0IG9mIGNsYXNzZXMgd2hvc2UgbWV0aG9kcyBhcmUgaW50ZXJjZXB0ZWQuCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCBpbnRlcmNlcHRlZENsYXNzZXM7CiAgYm9vbCBpc01peGVkSW50b0ludGVyY2VwdGVkQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCk7CgogIC8vLyBSZXR1cm5zIGEgc2V0IG9mIGludGVyY2VwdG9yIGNsYXNzZXMgdGhhdCBjb250YWluIGEgbWVtYmVyIG5hbWVkIFtuYW1lXQogIC8vLwogIC8vLyBSZXR1cm5zIGFuIGVtcHR5IHNldCBpZiB0aGVyZSBpcyBubyBjbGFzcy4gRG8gbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc2V0LgogIFNldDxDbGFzc0VudGl0eT4gZ2V0SW50ZXJjZXB0ZWRDbGFzc2VzT24oCiAgICAgIFN0cmluZyBuYW1lLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwoKICAvLy8gV2hldGhlciB0aGUgY29tcGlsZXIgY2FuIHVzZSB0aGUgbmF0aXZlIGBpbnN0YW5jZW9mYCBjaGVjayB0byB0ZXN0IGZvcgogIC8vLyBpbnN0YW5jZXMgb2YgW3R5cGVdLiBUaGlzIGlzIHRydWUgZm9yIHR5cGVzIHRoYXQgYXJlIG5vdCB1c2VkIGFzIG1peGlucyBvcgogIC8vLyBpbnRlcmZhY2VzLgogIGJvb2wgbWF5R2VuZXJhdGVJbnN0YW5jZW9mQ2hlY2soRGFydFR5cGUgdHlwZSwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKfQoKYWJzdHJhY3QgY2xhc3MgSW50ZXJjZXB0b3JEYXRhQnVpbGRlciB7CiAgdm9pZCBhZGRJbnRlcmNlcHRvcnMoQ2xhc3NFbnRpdHkgY2xzKTsKICB2b2lkIGFkZEludGVyY2VwdG9yc0Zvck5hdGl2ZUNsYXNzTWVtYmVycyhDbGFzc0VudGl0eSBjbHMpOwogIEludGVyY2VwdG9yRGF0YSBjbG9zZSgpOwp9CgpjbGFzcyBJbnRlcmNlcHRvckRhdGFJbXBsIGltcGxlbWVudHMgSW50ZXJjZXB0b3JEYXRhIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0ludGVyY2VwdG9yRGF0YV0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdpbnRlcmNlcHRvci1kYXRhJzsKCiAgZmluYWwgTmF0aXZlQmFzaWNEYXRhIF9uYXRpdmVEYXRhOwogIGZpbmFsIENvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKCiAgLy8vIFRoZSBtZW1iZXJzIG9mIGluc3RhbnRpYXRlZCBpbnRlcmNlcHRvciBjbGFzc2VzOiBtYXBzIGEgbWVtYmVyIG5hbWUgdG8gdGhlCiAgLy8vIGxpc3Qgb2YgbWVtYmVycyB0aGF0IGhhdmUgdGhhdCBuYW1lLiBUaGlzIG1hcCBpcyB1c2VkIGJ5IHRoZSBjb2RlZ2VuIHRvCiAgLy8vIGtub3cgd2hldGhlciBhIHNlbmQgbXVzdCBiZSBpbnRlcmNlcHRlZCBvciBub3QuCiAgZmluYWwgTWFwPFN0cmluZywgU2V0PE1lbWJlckVudGl0eT4+IGludGVyY2VwdGVkTWVtYmVyczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBpbnRlcmNlcHRlZENsYXNzZXM7CgogIC8vLyBTZXQgb2YgY2xhc3NlcyB1c2VkIGFzIG1peGlucyBvbiBpbnRlcmNlcHRlZCAobmF0aXZlIGFuZCBwcmltaXRpdmUpCiAgLy8vIGNsYXNzZXMuIE1ldGhvZHMgb24gdGhlc2UgY2xhc3NlcyBtaWdodCBhbHNvIGJlIG1peGVkIGluIHRvIHJlZ3VsYXIgRGFydAogIC8vLyAodW5pbnRlcmNlcHRlZCkgY2xhc3Nlcy4KICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXNNaXhlZEludG9JbnRlcmNlcHRlZENsYXNzZXM7CgogIC8vLyBUaGUgbWVtYmVycyBvZiBtaXhpbiBjbGFzc2VzIHRoYXQgYXJlIG1peGVkIGludG8gYW4gaW5zdGFudGlhdGVkCiAgLy8vIGludGVyY2VwdG9yIGNsYXNzLiAgVGhpcyBpcyBhIGNhY2hlZCBzdWJzZXQgb2YgW19pbnRlcmNlcHRlZEVsZW1lbnRzXS4KICAvLy8KICAvLy8gTWl4aW4gbWV0aG9kcyBhcmUgbm90IHNwZWNpYWxpemVkIGZvciB0aGUgY2xhc3MgdGhleSBhcmUgbWl4ZWQgaW50by4KICAvLy8gTWV0aG9kcyBtaXhlZCBpbnRvIGludGVyY2VwdGVkIGNsYXNzZXMgdGh1cyBhbHdheXMgbWFrZSB1c2Ugb2YgdGhlCiAgLy8vIGV4cGxpY2l0IHJlY2VpdmVyIGFyZ3VtZW50LCBldmVuIHdoZW4gbWl4ZWQgaW50byBub24taW50ZXJjZXB0b3IgY2xhc3Nlcy4KICAvLy8KICAvLy8gVGhlc2UgbWVtYmVycyBtdXN0IGJlIGludm9rZWQgd2l0aCBhIGNvcnJlY3QgZXhwbGljaXQgcmVjZWl2ZXIgZXZlbiB3aGVuCiAgLy8vIHRoZSByZWNlaXZlciBpcyBub3QgYW4gaW50ZXJjZXB0ZWQgY2xhc3MuCiAgZmluYWwgTWFwPFN0cmluZywgU2V0PE1lbWJlckVudGl0eT4+IF9pbnRlcmNlcHRlZE1peGluRWxlbWVudHMgPQogICAgICBuZXcgTWFwPFN0cmluZywgU2V0PE1lbWJlckVudGl0eT4+KCk7CgogIGZpbmFsIE1hcDxTdHJpbmcsIFNldDxDbGFzc0VudGl0eT4+IF9pbnRlcmNlcHRlZENsYXNzZXNDYWNoZSA9CiAgICAgIG5ldyBNYXA8U3RyaW5nLCBTZXQ8Q2xhc3NFbnRpdHk+PigpOwoKICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IF9ub0NsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICBJbnRlcmNlcHRvckRhdGFJbXBsKAogICAgICB0aGlzLl9uYXRpdmVEYXRhLAogICAgICB0aGlzLl9jb21tb25FbGVtZW50cywKICAgICAgdGhpcy5pbnRlcmNlcHRlZE1lbWJlcnMsCiAgICAgIHRoaXMuaW50ZXJjZXB0ZWRDbGFzc2VzLAogICAgICB0aGlzLmNsYXNzZXNNaXhlZEludG9JbnRlcmNlcHRlZENsYXNzZXMpOwoKICBmYWN0b3J5IEludGVyY2VwdG9yRGF0YUltcGwucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgTmF0aXZlRGF0YSBuYXRpdmVEYXRhLCBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cykgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpbnQgaW50ZXJjZXB0ZWRNZW1iZXJzQ291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgTWFwPFN0cmluZywgU2V0PE1lbWJlckVudGl0eT4+IGludGVyY2VwdGVkTWVtYmVycyA9IHt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmNlcHRlZE1lbWJlcnNDb3VudDsgaSsrKSB7CiAgICAgIFN0cmluZyBuYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgU2V0PE1lbWJlckVudGl0eT4gbWVtYmVycyA9IHNvdXJjZS5yZWFkTWVtYmVycygpLnRvU2V0KCk7CiAgICAgIGludGVyY2VwdGVkTWVtYmVyc1tuYW1lXSA9IG1lbWJlcnM7CiAgICB9CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGludGVyY2VwdGVkQ2xhc3NlcyA9IHNvdXJjZS5yZWFkQ2xhc3NlcygpLnRvU2V0KCk7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXNNaXhlZEludG9JbnRlcmNlcHRlZENsYXNzZXMgPQogICAgICAgIHNvdXJjZS5yZWFkQ2xhc3NlcygpLnRvU2V0KCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEludGVyY2VwdG9yRGF0YUltcGwoCiAgICAgICAgbmF0aXZlRGF0YSwKICAgICAgICBjb21tb25FbGVtZW50cywKICAgICAgICBpbnRlcmNlcHRlZE1lbWJlcnMsCiAgICAgICAgaW50ZXJjZXB0ZWRDbGFzc2VzLAogICAgICAgIGNsYXNzZXNNaXhlZEludG9JbnRlcmNlcHRlZENsYXNzZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUludChpbnRlcmNlcHRlZE1lbWJlcnMubGVuZ3RoKTsKICAgIGludGVyY2VwdGVkTWVtYmVycy5mb3JFYWNoKChTdHJpbmcgbmFtZSwgU2V0PE1lbWJlckVudGl0eT4gbWVtYmVycykgewogICAgICBzaW5rLndyaXRlU3RyaW5nKG5hbWUpOwogICAgICBzaW5rLndyaXRlTWVtYmVycyhtZW1iZXJzKTsKICAgIH0pOwogICAgc2luay53cml0ZUNsYXNzZXMoaW50ZXJjZXB0ZWRDbGFzc2VzKTsKICAgIHNpbmsud3JpdGVDbGFzc2VzKGNsYXNzZXNNaXhlZEludG9JbnRlcmNlcHRlZENsYXNzZXMpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbnRlcmNlcHRlZE1ldGhvZChNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKCFlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIpIHJldHVybiBmYWxzZTsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIHRoaXMgaGFjay4KICAgIGlmIChlbGVtZW50IGlzIENvbnN0cnVjdG9yQm9keUVudGl0eSkgewogICAgICByZXR1cm4gX25hdGl2ZURhdGEuaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoZWxlbWVudC5lbmNsb3NpbmdDbGFzcyk7CiAgICB9CiAgICByZXR1cm4gaW50ZXJjZXB0ZWRNZW1iZXJzW2VsZW1lbnQubmFtZV0gIT0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZmllbGRIYXNJbnRlcmNlcHRlZEdldHRlcihGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gaW50ZXJjZXB0ZWRNZW1iZXJzW2VsZW1lbnQubmFtZV0gIT0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZmllbGRIYXNJbnRlcmNlcHRlZFNldHRlcihGaWVsZEVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gaW50ZXJjZXB0ZWRNZW1iZXJzW2VsZW1lbnQubmFtZV0gIT0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbnRlcmNlcHRlZE5hbWUoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBpbnRlcmNlcHRlZE1lbWJlcnNbbmFtZV0gIT0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbnRlcmNlcHRlZFNlbGVjdG9yKFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICByZXR1cm4gaW50ZXJjZXB0ZWRNZW1iZXJzW3NlbGVjdG9yLm5hbWVdICE9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJjZXB0ZWRNaXhpblNlbGVjdG9yKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSBtYXNrLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIFNldDxNZW1iZXJFbnRpdHk+IGVsZW1lbnRzID0KICAgICAgICBfaW50ZXJjZXB0ZWRNaXhpbkVsZW1lbnRzLnB1dElmQWJzZW50KHNlbGVjdG9yLm5hbWUsICgpIHsKICAgICAgU2V0PE1lbWJlckVudGl0eT4gZWxlbWVudHMgPSBpbnRlcmNlcHRlZE1lbWJlcnNbc2VsZWN0b3IubmFtZV07CiAgICAgIGlmIChlbGVtZW50cyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIGVsZW1lbnRzCiAgICAgICAgICAud2hlcmUoKGVsZW1lbnQpID0+IGNsYXNzZXNNaXhlZEludG9JbnRlcmNlcHRlZENsYXNzZXMKICAgICAgICAgICAgICAuY29udGFpbnMoZWxlbWVudC5lbmNsb3NpbmdDbGFzcykpCiAgICAgICAgICAudG9TZXQoKTsKICAgIH0pOwoKICAgIGlmIChlbGVtZW50cyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZWxlbWVudHMuaXNFbXB0eSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGVsZW1lbnRzLmFueSgoZWxlbWVudCkgewogICAgICByZXR1cm4gc2VsZWN0b3IuYXBwbGllcyhlbGVtZW50KSAmJgogICAgICAgICAgKG1hc2sgPT0gbnVsbCB8fAogICAgICAgICAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgICAgICAgICAgLmlzVGFyZ2V0aW5nTWVtYmVyKG1hc2ssIGVsZW1lbnQsIHNlbGVjdG9yLm1lbWJlck5hbWUpCiAgICAgICAgICAgICAgICAgIC5pc1BvdGVudGlhbGx5VHJ1ZSk7CiAgICB9KTsKICB9CgogIC8vLyBUcnVlIGlmIHRoZSBnaXZlbiBjbGFzcyBpcyBhbiBpbnRlcm5hbCBjbGFzcyB1c2VkIGZvciB0eXBlIGluZmVyZW5jZQogIC8vLyBhbmQgbmV2ZXIgZXhpc3RzIGF0IHJ1bnRpbWUuCiAgYm9vbCBfaXNDb21waWxlVGltZU9ubHlDbGFzcyhDbGFzc0VudGl0eSBjbGFzc18pIHsKICAgIHJldHVybiBjbGFzc18gPT0gX2NvbW1vbkVsZW1lbnRzLmpzUG9zaXRpdmVJbnRDbGFzcyB8fAogICAgICAgIGNsYXNzXyA9PSBfY29tbW9uRWxlbWVudHMuanNVSW50MzJDbGFzcyB8fAogICAgICAgIGNsYXNzXyA9PSBfY29tbW9uRWxlbWVudHMuanNVSW50MzFDbGFzcyB8fAogICAgICAgIGNsYXNzXyA9PSBfY29tbW9uRWxlbWVudHMuanNGaXhlZEFycmF5Q2xhc3MgfHwKICAgICAgICBjbGFzc18gPT0gX2NvbW1vbkVsZW1lbnRzLmpzVW5tb2RpZmlhYmxlQXJyYXlDbGFzcyB8fAogICAgICAgIGNsYXNzXyA9PSBfY29tbW9uRWxlbWVudHMuanNNdXRhYmxlQXJyYXlDbGFzcyB8fAogICAgICAgIGNsYXNzXyA9PSBfY29tbW9uRWxlbWVudHMuanNFeHRlbmRhYmxlQXJyYXlDbGFzczsKICB9CgogIC8vLyBSZXR1cm5zIGEgc2V0IG9mIGludGVyY2VwdG9yIGNsYXNzZXMgdGhhdCBjb250YWluIGEgbWVtYmVyIG5hbWVkIFtuYW1lXQogIC8vLwogIC8vLyBSZXR1cm5zIGFuIGVtcHR5IHNldCBpZiB0aGVyZSBpcyBubyBjbGFzcy4gRG8gbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc2V0LgogIEBvdmVycmlkZQogIFNldDxDbGFzc0VudGl0eT4gZ2V0SW50ZXJjZXB0ZWRDbGFzc2VzT24oCiAgICAgIFN0cmluZyBuYW1lLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIFNldDxNZW1iZXJFbnRpdHk+IGludGVyY2VwdGVkID0gaW50ZXJjZXB0ZWRNZW1iZXJzW25hbWVdOwogICAgaWYgKGludGVyY2VwdGVkID09IG51bGwpIHJldHVybiBfbm9DbGFzc2VzOwogICAgcmV0dXJuIF9pbnRlcmNlcHRlZENsYXNzZXNDYWNoZS5wdXRJZkFic2VudChuYW1lLCAoKSB7CiAgICAgIC8vIFBvcHVsYXRlIHRoZSBjYWNoZSBieSBydW5uaW5nIHRocm91Z2ggYWxsIHRoZSBlbGVtZW50cyBhbmQKICAgICAgLy8gZGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBzZWxlY3RvciBhcHBsaWVzIHRvIHRoZW0uCiAgICAgIFNldDxDbGFzc0VudGl0eT4gcmVzdWx0ID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgICAgZm9yIChNZW1iZXJFbnRpdHkgZWxlbWVudCBpbiBpbnRlcmNlcHRlZCkgewogICAgICAgIENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCA9IGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgaWYgKF9pc0NvbXBpbGVUaW1lT25seUNsYXNzKGNsYXNzRWxlbWVudCkpIGNvbnRpbnVlOwogICAgICAgIGlmIChfbmF0aXZlRGF0YS5pc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShjbGFzc0VsZW1lbnQpIHx8CiAgICAgICAgICAgIGludGVyY2VwdGVkQ2xhc3Nlcy5jb250YWlucyhjbGFzc0VsZW1lbnQpKSB7CiAgICAgICAgICByZXN1bHQuYWRkKGNsYXNzRWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIGlmIChjbGFzc2VzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzc2VzLmNvbnRhaW5zKGNsYXNzRWxlbWVudCkpIHsKICAgICAgICAgIFNldDxDbGFzc0VudGl0eT4gbmF0aXZlU3ViY2xhc3NlcyA9CiAgICAgICAgICAgICAgbmF0aXZlU3ViY2xhc3Nlc09mTWl4aW4oY2xhc3NFbGVtZW50LCBjbG9zZWRXb3JsZCk7CiAgICAgICAgICBpZiAobmF0aXZlU3ViY2xhc3NlcyAhPSBudWxsKSByZXN1bHQuYWRkQWxsKG5hdGl2ZVN1YmNsYXNzZXMpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSk7CiAgfQoKICBTZXQ8Q2xhc3NFbnRpdHk+IG5hdGl2ZVN1YmNsYXNzZXNPZk1peGluKAogICAgICBDbGFzc0VudGl0eSBtaXhpbiwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gdXNlcyA9IGNsb3NlZFdvcmxkLm1peGluVXNlc09mKG1peGluKTsKICAgIFNldDxDbGFzc0VudGl0eT4gcmVzdWx0ID0gbnVsbDsKICAgIGZvciAoQ2xhc3NFbnRpdHkgdXNlIGluIHVzZXMpIHsKICAgICAgY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuZm9yRWFjaFN0cmljdFN1YmNsYXNzT2YodXNlLAogICAgICAgICAgKENsYXNzRW50aXR5IHN1YmNsYXNzKSB7CiAgICAgICAgaWYgKF9uYXRpdmVEYXRhLmlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKHN1YmNsYXNzKSkgewogICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwogICAgICAgICAgcmVzdWx0LmFkZChzdWJjbGFzcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBJdGVyYXRpb25TdGVwLkNPTlRJTlVFOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJjZXB0ZWRDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoX25hdGl2ZURhdGEuaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoZWxlbWVudCkpIHJldHVybiB0cnVlOwogICAgaWYgKGludGVyY2VwdGVkQ2xhc3Nlcy5jb250YWlucyhlbGVtZW50KSkgcmV0dXJuIHRydWU7CiAgICBpZiAoY2xhc3Nlc01peGVkSW50b0ludGVyY2VwdGVkQ2xhc3Nlcy5jb250YWlucyhlbGVtZW50KSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzcyhDbGFzc0VudGl0eSBlbGVtZW50KSA9PgogICAgICBjbGFzc2VzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzc2VzLmNvbnRhaW5zKGVsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBib29sIG1heUdlbmVyYXRlSW5zdGFuY2VvZkNoZWNrKERhcnRUeXBlIHR5cGUsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgLy8gV2UgY2FuIHVzZSBhbiBpbnN0YW5jZW9mIGNoZWNrIGZvciByYXcgdHlwZXMgdGhhdCBoYXZlIG5vIHN1YmNsYXNzIHRoYXQKICAgIC8vIGlzIG1peGVkLWluIG9yIGluIGFuIGltcGxlbWVudHMgY2xhdXNlLgoKICAgIGlmICghdHlwZS50cmVhdEFzUmF3KSByZXR1cm4gZmFsc2U7CiAgICBpZiAodHlwZS5pc0Z1dHVyZU9yKSByZXR1cm4gZmFsc2U7CiAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZVR5cGUgPSB0eXBlOwogICAgQ2xhc3NFbnRpdHkgY2xhc3NFbGVtZW50ID0gaW50ZXJmYWNlVHlwZS5lbGVtZW50OwogICAgaWYgKGlzSW50ZXJjZXB0ZWRDbGFzcyhjbGFzc0VsZW1lbnQpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaGFzT25seVN1YmNsYXNzZXMoY2xhc3NFbGVtZW50KTsKICB9Cn0KCmNsYXNzIEludGVyY2VwdG9yRGF0YUJ1aWxkZXJJbXBsIGltcGxlbWVudHMgSW50ZXJjZXB0b3JEYXRhQnVpbGRlciB7CiAgZmluYWwgTmF0aXZlQmFzaWNEYXRhIF9uYXRpdmVEYXRhOwogIGZpbmFsIEtFbGVtZW50RW52aXJvbm1lbnQgX2VsZW1lbnRFbnZpcm9ubWVudDsKICBmaW5hbCBLQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwoKICAvLy8gVGhlIG1lbWJlcnMgb2YgaW5zdGFudGlhdGVkIGludGVyY2VwdG9yIGNsYXNzZXM6IG1hcHMgYSBtZW1iZXIgbmFtZSB0byB0aGUKICAvLy8gbGlzdCBvZiBtZW1iZXJzIHRoYXQgaGF2ZSB0aGF0IG5hbWUuIFRoaXMgbWFwIGlzIHVzZWQgYnkgdGhlIGNvZGVnZW4gdG8KICAvLy8ga25vdyB3aGV0aGVyIGEgc2VuZCBtdXN0IGJlIGludGVyY2VwdGVkIG9yIG5vdC4KICBmaW5hbCBNYXA8U3RyaW5nLCBTZXQ8TWVtYmVyRW50aXR5Pj4gX2ludGVyY2VwdGVkRWxlbWVudHMgPQogICAgICA8U3RyaW5nLCBTZXQ8TWVtYmVyRW50aXR5Pj57fTsKCiAgLy8vIFNldCBvZiBjbGFzc2VzIHdob3NlIG1ldGhvZHMgYXJlIGludGVyY2VwdGVkLgogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gX2ludGVyY2VwdGVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogIC8vLyBTZXQgb2YgY2xhc3NlcyB1c2VkIGFzIG1peGlucyBvbiBpbnRlcmNlcHRlZCAobmF0aXZlIGFuZCBwcmltaXRpdmUpCiAgLy8vIGNsYXNzZXMuIE1ldGhvZHMgb24gdGhlc2UgY2xhc3NlcyBtaWdodCBhbHNvIGJlIG1peGVkIGluIHRvIHJlZ3VsYXIgRGFydAogIC8vLyAodW5pbnRlcmNlcHRlZCkgY2xhc3Nlcy4KICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IF9jbGFzc2VzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzc2VzID0KICAgICAgbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgSW50ZXJjZXB0b3JEYXRhQnVpbGRlckltcGwoCiAgICAgIHRoaXMuX25hdGl2ZURhdGEsIHRoaXMuX2VsZW1lbnRFbnZpcm9ubWVudCwgdGhpcy5fY29tbW9uRWxlbWVudHMpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmNlcHRvckRhdGEgY2xvc2UoKSB7CiAgICByZXR1cm4gbmV3IEludGVyY2VwdG9yRGF0YUltcGwoCiAgICAgICAgX25hdGl2ZURhdGEsCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLAogICAgICAgIF9pbnRlcmNlcHRlZEVsZW1lbnRzLAogICAgICAgIF9pbnRlcmNlcHRlZENsYXNzZXMsCiAgICAgICAgX2NsYXNzZXNNaXhlZEludG9JbnRlcmNlcHRlZENsYXNzZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRJbnRlcmNlcHRvcnNGb3JOYXRpdmVDbGFzc01lbWJlcnMoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hDbGFzc01lbWJlcihjbHMsCiAgICAgICAgKENsYXNzRW50aXR5IGNscywgTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICBpZiAobWVtYmVyLm5hbWUgPT0gSWRlbnRpZmllcnMuY2FsbCkgcmV0dXJuOwogICAgICAvLyBBbGwgbWV0aG9kcyBvbiBbT2JqZWN0XSBhcmUgc2hhZG93ZWQgYnkgW0ludGVyY2VwdG9yXS4KICAgICAgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpIHJldHVybjsKICAgICAgU2V0PE1lbWJlckVudGl0eT4gc2V0ID0KICAgICAgICAgIF9pbnRlcmNlcHRlZEVsZW1lbnRzW21lbWJlci5uYW1lXSA/Pz0gbmV3IFNldDxNZW1iZXJFbnRpdHk+KCk7CiAgICAgIHNldC5hZGQobWVtYmVyKTsKICAgIH0pOwoKICAgIC8vIFdhbGsgc3VwZXJjbGFzcyBjaGFpbiB0byBmaW5kIG1peGlucy4KICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaE1peGluKGNscywgKENsYXNzRW50aXR5IG1peGluKSB7CiAgICAgIF9jbGFzc2VzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzc2VzLmFkZChtaXhpbik7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkSW50ZXJjZXB0b3JzKENsYXNzRW50aXR5IGNscykgewogICAgaWYgKF9pbnRlcmNlcHRlZENsYXNzZXMuYWRkKGNscykpIHsKICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoQ2xhc3NNZW1iZXIoY2xzLAogICAgICAgICAgKENsYXNzRW50aXR5IGNscywgTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICAgIC8vIEFsbCBtZXRob2RzIG9uIFtPYmplY3RdIGFyZSBzaGFkb3dlZCBieSBbSW50ZXJjZXB0b3JdLgogICAgICAgIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSByZXR1cm47CiAgICAgICAgU2V0PE1lbWJlckVudGl0eT4gc2V0ID0KICAgICAgICAgICAgX2ludGVyY2VwdGVkRWxlbWVudHNbbWVtYmVyLm5hbWVdID8/PSBuZXcgU2V0PE1lbWJlckVudGl0eT4oKTsKICAgICAgICBzZXQuYWRkKG1lbWJlcik7CiAgICAgIH0pOwogICAgfQogICAgX2ludGVyY2VwdGVkQ2xhc3Nlcy5hZGQoX2NvbW1vbkVsZW1lbnRzLmpzSW50ZXJjZXB0b3JDbGFzcyk7CiAgfQp9CgpjbGFzcyBPbmVTaG90SW50ZXJjZXB0b3JEYXRhIHsKICBmaW5hbCBJbnRlcmNlcHRvckRhdGEgX2ludGVyY2VwdG9yRGF0YTsKICBmaW5hbCBDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CiAgZmluYWwgTmF0aXZlRGF0YSBfbmF0aXZlRGF0YTsKCiAgT25lU2hvdEludGVyY2VwdG9yRGF0YSgKICAgICAgdGhpcy5faW50ZXJjZXB0b3JEYXRhLCB0aGlzLl9jb21tb25FbGVtZW50cywgdGhpcy5fbmF0aXZlRGF0YSk7CgogIEl0ZXJhYmxlPE9uZVNob3RJbnRlcmNlcHRvcj4gZ2V0IG9uZVNob3RJbnRlcmNlcHRvcnMgewogICAgTGlzdDxPbmVTaG90SW50ZXJjZXB0b3I+IGludGVyY2VwdG9ycyA9IFtdOwogICAgZm9yICh2YXIgbWFwIGluIF9vbmVTaG90SW50ZXJjZXB0b3JzLnZhbHVlcykgewogICAgICBpbnRlcmNlcHRvcnMuYWRkQWxsKG1hcC52YWx1ZXMpOwogICAgfQogICAgcmV0dXJuIGludGVyY2VwdG9yczsKICB9CgogIE1hcDxTZWxlY3RvciwgTWFwPFN0cmluZywgT25lU2hvdEludGVyY2VwdG9yPj4gX29uZVNob3RJbnRlcmNlcHRvcnMgPSB7fTsKCiAgLy8vIEEgc2V0IG9mIHNwZWNpYWxpemVkIHZlcnNpb25zIG9mIHRoZSBbZ2V0SW50ZXJjZXB0b3JNZXRob2RdLgogIC8vLwogIC8vLyBTaW5jZSBbZ2V0SW50ZXJjZXB0b3JNZXRob2RdIGlzIGEgaG90IG1ldGhvZCBhdCBydW50aW1lLCB3ZSdyZSBhbHdheXMKICAvLy8gc3BlY2lhbGl6aW5nIGl0IGJhc2VkIG9uIHRoZSBpbmNvbWluZyB0eXBlLiBUaGUga2V5cyBpbiB0aGUgbWFwIGFyZSB0aGUKICAvLy8gbmFtZXMgb2YgdGhlc2Ugc3BlY2lhbGl6ZWQgdmVyc2lvbnMuIE5vdGUgdGhhdCB0aGUgZ2VuZXJpYyB2ZXJzaW9uIHRoYXQKICAvLy8gY29udGFpbnMgYWxsIHBvc3NpYmxlIHR5cGUgY2hlY2tzIGlzIGFsc28gc3RvcmVkIGluIHRoaXMgbWFwLgogIEl0ZXJhYmxlPFNwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3I+IGdldCBzcGVjaWFsaXplZEdldEludGVyY2VwdG9ycyA9PgogICAgICBfc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnMudmFsdWVzOwoKICBNYXA8U3RyaW5nLCBTcGVjaWFsaXplZEdldEludGVyY2VwdG9yPiBfc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnMgPSB7fTsKCiAganNBc3QuTmFtZSByZWdpc3Rlck9uZVNob3RJbnRlcmNlcHRvcigKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIE1vZHVsYXJOYW1lciBuYW1lciwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnRvTm9ybWFsaXplZCgpOwogICAgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzID0KICAgICAgICBfaW50ZXJjZXB0b3JEYXRhLmdldEludGVyY2VwdGVkQ2xhc3Nlc09uKHNlbGVjdG9yLm5hbWUsIGNsb3NlZFdvcmxkKTsKICAgIFN0cmluZyBrZXkgPSBzdWZmaXhGb3JHZXRJbnRlcmNlcHRvcihfY29tbW9uRWxlbWVudHMsIF9uYXRpdmVEYXRhLCBjbGFzc2VzKTsKICAgIE1hcDxTdHJpbmcsIE9uZVNob3RJbnRlcmNlcHRvcj4gaW50ZXJjZXB0b3JzID0KICAgICAgICBfb25lU2hvdEludGVyY2VwdG9yc1tzZWxlY3Rvcl0gPz89IHt9OwogICAgT25lU2hvdEludGVyY2VwdG9yIGludGVyY2VwdG9yID0KICAgICAgICBpbnRlcmNlcHRvcnNba2V5XSA/Pz0gbmV3IE9uZVNob3RJbnRlcmNlcHRvcihrZXksIHNlbGVjdG9yKTsKICAgIGludGVyY2VwdG9yLmNsYXNzZXMuYWRkQWxsKGNsYXNzZXMpOwogICAgcmVnaXN0ZXJTcGVjaWFsaXplZEdldEludGVyY2VwdG9yKGNsYXNzZXMsIG5hbWVyKTsKICAgIHJldHVybiBuYW1lci5uYW1lRm9yT25lU2hvdEludGVyY2VwdG9yKHNlbGVjdG9yLCBjbGFzc2VzKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTcGVjaWFsaXplZEdldEludGVyY2VwdG9yKAogICAgICBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXMsIE1vZHVsYXJOYW1lciBuYW1lcikgewogICAgaWYgKGNsYXNzZXMuY29udGFpbnMoX2NvbW1vbkVsZW1lbnRzLmpzSW50ZXJjZXB0b3JDbGFzcykpIHsKICAgICAgLy8gV2UgY2FuJ3QgdXNlIGEgc3BlY2lhbGl6ZWQgW2dldEludGVyY2VwdG9yTWV0aG9kXSwgc28gd2UgbWFrZQogICAgICAvLyBzdXJlIHdlIGVtaXQgdGhlIG9uZSB3aXRoIGFsbCBjaGVja3MuCiAgICAgIGNsYXNzZXMgPSBfaW50ZXJjZXB0b3JEYXRhLmludGVyY2VwdGVkQ2xhc3NlczsKICAgIH0KICAgIFN0cmluZyBrZXkgPSBzdWZmaXhGb3JHZXRJbnRlcmNlcHRvcihfY29tbW9uRWxlbWVudHMsIF9uYXRpdmVEYXRhLCBjbGFzc2VzKTsKICAgIFNwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3IgaW50ZXJjZXB0b3IgPQogICAgICAgIF9zcGVjaWFsaXplZEdldEludGVyY2VwdG9yc1trZXldID8/PSBuZXcgU3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcihrZXkpOwogICAgaW50ZXJjZXB0b3IuY2xhc3Nlcy5hZGRBbGwoY2xhc3Nlcyk7CiAgfQp9CgpjbGFzcyBPbmVTaG90SW50ZXJjZXB0b3IgewogIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yOwogIGZpbmFsIFN0cmluZyBrZXk7CiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzID0ge307CgogIE9uZVNob3RJbnRlcmNlcHRvcih0aGlzLmtleSwgdGhpcy5zZWxlY3Rvcik7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICdPbmVTaG90SW50ZXJjZXB0b3Ioc2VsZWN0b3I9JHNlbGVjdG9yLGtleT0ka2V5LGNsYXNzZXM9JGNsYXNzZXMpJzsKfQoKY2xhc3MgU3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvciB7CiAgZmluYWwgU3RyaW5nIGtleTsKICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXMgPSB7fTsKCiAgU3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcih0aGlzLmtleSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdTcGVjaWFsaXplZEdldEludGVyY2VwdG9yKGtleT0ka2V5LGNsYXNzZXM9JGNsYXNzZXMpJzsKfQqBtABOTjwBJQEwIT8kITEhLiUkKkAbASE9LhkdTwEzJwE3MAEyNzcnMQFQIQZJFCNIATQwOQFOBlEsLgFNURJMAgEoKT4bAgE3SR0wASUoAVFONjsBDC0BSk8fPQFHTQZLSVAGTzBDLAFBKwE+ARcYHB8fMAEyURc0PDgpQCoGSDomFSQUGBwcLQQBDCgVLkoeIggrOxMEAQwzMS0sSgY1BAEMODUEAQw4NQQBDCgtBAEMMjYEAQwjSSFCRikWQTEUCAEoKCQqGy5JJwgEAUsjNTszMzc+OToEAU4GUQwsLz4wO0Q6ODI7PUE5JApJLkJJCggVCAQBLDVBJCQ+Iz0/IAonCgYTBAEMMSdDO0sSBAEMOzwBDE1PLwEoJyg2OEcEAgFFJTEpAVFONj4lATRHAUpPHz8eAR5JAQwcJBUZHh0uBAEMPzAxM0A2HkkXCAEtQDYIBAEMKigyM0I4IEsZCgZBBAIBHyooIAEaRgE5MDMnBhkEAUwBQwZMTk5ESCoBSwEpSSgfTlEzLyVFKTc/BAEqNkBHLzUGUSxRKQQCARsbFCcBLwEMF0oCASIUJwEnAQxPAgE1cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnQ4c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfZW1pdHRlci9qc19lbWl0dGVyLmRhcnSCiS8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuanNfZW1pdHRlcjsKCmV4cG9ydCAnY2xhc3Nfc3R1Yl9nZW5lcmF0b3IuZGFydCc7CmV4cG9ydCAnY29kZV9lbWl0dGVyX3Rhc2suZGFydCc7CmV4cG9ydCAnaW5zdGFudGlhdGlvbl9zdHViX2dlbmVyYXRvci5kYXJ0JzsKZXhwb3J0ICdpbnRlcmNlcHRvcl9zdHViX2dlbmVyYXRvci5kYXJ0JzsKZXhwb3J0ICdtYWluX2NhbGxfc3R1Yl9nZW5lcmF0b3IuZGFydCc7CmV4cG9ydCAnbWV0YWRhdGFfY29sbGVjdG9yLmRhcnQnOwpleHBvcnQgJ25hdGl2ZV9lbWl0dGVyLmRhcnQnOwpleHBvcnQgJ25hdGl2ZV9nZW5lcmF0b3IuZGFydCc7CmV4cG9ydCAncGFyYW1ldGVyX3N0dWJfZ2VuZXJhdG9yLmRhcnQnOwpleHBvcnQgJ3J1bnRpbWVfdHlwZV9nZW5lcmF0b3IuZGFydCc7CmV4cG9ydCAndHlwZV90ZXN0X3JlZ2lzdHJ5LmRhcnQnOwoTAE5OPAEcASQhLCooIh4gKCYiAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL2pzX2VtaXR0ZXIuZGFydDFzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9uYXRpdmUvZW5xdWV1ZS5kYXJ0rI4vLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBDb21tb25FbGVtZW50cywgRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCcgc2hvdyBOYXRpdmVEYXRhOwppbXBvcnQgJy4uL2pzX2VtaXR0ZXIvanNfZW1pdHRlci5kYXJ0JyBzaG93IENvZGVFbWl0dGVyVGFzaywgTmF0aXZlRW1pdHRlcjsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JyBzaG93IFR5cGVVc2U7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfaW1wYWN0LmRhcnQnCiAgICBzaG93IFdvcmxkSW1wYWN0LCBXb3JsZEltcGFjdEJ1aWxkZXIsIFdvcmxkSW1wYWN0QnVpbGRlckltcGw7CmltcG9ydCAnYmVoYXZpb3IuZGFydCc7CmltcG9ydCAncmVzb2x2ZXIuZGFydCcgc2hvdyBOYXRpdmVDbGFzc0ZpbmRlcjsKCi8vLyBUaGlzIGNvdWxkIGJlIGFuIGFic3RyYWN0IGNsYXNzIGJ1dCB3ZSB1c2UgaXQgYXMgYSBzdHViIGZvciB0aGUKLy8vIGRhcnRfYmFja2VuZC4KY2xhc3MgTmF0aXZlRW5xdWV1ZXIgewogIC8vLyBDYWxsZWQgd2hlbiBhIFt0eXBlXSBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgbmF0aXZlbHkuCiAgdm9pZCBvbkluc3RhbnRpYXRlZFR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlKSB7fQoKICAvLy8gSW5pdGlhbCBlbnRyeSBwb2ludCB0byBuYXRpdmUgZW5xdWV1ZXIuCiAgV29ybGRJbXBhY3QgcHJvY2Vzc05hdGl2ZUNsYXNzZXMoSXRlcmFibGU8VXJpPiBsaWJyYXJpZXMpID0+CiAgICAgIGNvbnN0IFdvcmxkSW1wYWN0KCk7CgogIC8vLyBSZWdpc3RlcnMgdGhlIFtuYXRpdmVCZWhhdmlvcl0uIEFkZHMgdGhlIGxpdmVuZXNzIG9mIGl0cyBpbnN0YW50aWF0ZWQKICAvLy8gdHlwZXMgdG8gdGhlIHdvcmxkLgogIHZvaWQgcmVnaXN0ZXJOYXRpdmVCZWhhdmlvcigKICAgICAgV29ybGRJbXBhY3RCdWlsZGVyIGltcGFjdEJ1aWxkZXIsIE5hdGl2ZUJlaGF2aW9yIG5hdGl2ZUJlaGF2aW9yLCBjYXVzZSkge30KCiAgLy8vIFJldHVybnMgd2hldGhlciBuYXRpdmUgY2xhc3NlcyBhcmUgYmVpbmcgdXNlZC4KICBib29sIGdldCBoYXNJbnN0YW50aWF0ZWROYXRpdmVDbGFzc2VzID0+IGZhbHNlOwoKICAvLy8gRW1pdHMgYSBzdW1tYXJ5IGluZm9ybWF0aW9uIHVzaW5nIHRoZSBbbG9nXSBmdW5jdGlvbi4KICB2b2lkIGxvZ1N1bW1hcnkodm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpKSB7fQp9CgphYnN0cmFjdCBjbGFzcyBOYXRpdmVFbnF1ZXVlckJhc2UgaW1wbGVtZW50cyBOYXRpdmVFbnF1ZXVlciB7CiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBfcmVnaXN0ZXJlZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gX3VudXNlZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNJbnN0YW50aWF0ZWROYXRpdmVDbGFzc2VzID0+ICFfcmVnaXN0ZXJlZENsYXNzZXMuaXNFbXB0eTsKCiAgLy8vIExvZyBtZXNzYWdlIHJlcG9ydGVkIGlmIGFsbCBuYXRpdmUgdHlwZXMgYXJlIHVzZWQuCiAgU3RyaW5nIF9hbGxVc2VkTWVzc2FnZTsKCiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIERhcnRUeXBlcyBfZGFydFR5cGVzOwogIGZpbmFsIENvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKCiAgLy8vIFN1YmNsYXNzZXMgb2YgW05hdGl2ZUVucXVldWVyQmFzZV0gYXJlIGNvbnN0cnVjdGVkIGJ5IHRoZSBiYWNrZW5kLgogIE5hdGl2ZUVucXVldWVyQmFzZSh0aGlzLl9vcHRpb25zLCB0aGlzLl9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIHRoaXMuX2NvbW1vbkVsZW1lbnRzLCB0aGlzLl9kYXJ0VHlwZXMpOwoKICBib29sIGdldCBlbmFibGVMaXZlVHlwZUFuYWx5c2lzID0+IF9vcHRpb25zLmVuYWJsZU5hdGl2ZUxpdmVUeXBlQW5hbHlzaXM7CgogIEBvdmVycmlkZQogIHZvaWQgb25JbnN0YW50aWF0ZWRUeXBlKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgaWYgKF91bnVzZWRDbGFzc2VzLnJlbW92ZSh0eXBlLmVsZW1lbnQpKSB7CiAgICAgIF9yZWdpc3RlcmVkQ2xhc3Nlcy5hZGQodHlwZS5lbGVtZW50KTsKICAgIH0KICB9CgogIC8vLyBSZWdpc3RlciBbY2xhc3Nlc10gYXMgbmF0aXZlbHkgaW5zdGFudGlhdGVkIGluIFtpbXBhY3RCdWlsZGVyXS4KICB2b2lkIF9yZWdpc3RlclR5cGVVc2VzKAogICAgICBXb3JsZEltcGFjdEJ1aWxkZXIgaW1wYWN0QnVpbGRlciwgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzLCBjYXVzZSkgewogICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gY2xhc3NlcykgewogICAgICBpZiAoIV91bnVzZWRDbGFzc2VzLmNvbnRhaW5zKGNscykpIHsKICAgICAgICAvLyBObyBuZWVkIHRvIGFkZCBbY2xhc3NFbGVtZW50XSB0byBbaW1wYWN0QnVpbGRlcl06IGl0IGhhcyBhbHJlYWR5IGJlZW4KICAgICAgICAvLyBpbnN0YW50aWF0ZWQgYW5kIHdlIGRvbid0IHRyYWNrIG9yaWdpbnMgb2YgbmF0aXZlIGluc3RhbnRpYXRpb25zCiAgICAgICAgLy8gcHJlY2lzZWx5LgogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJUeXBlVXNlKAogICAgICAgICAgbmV3IFR5cGVVc2UubmF0aXZlSW5zdGFudGlhdGlvbihfZWxlbWVudEVudmlyb25tZW50LmdldFJhd1R5cGUoY2xzKSkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck5hdGl2ZUJlaGF2aW9yKAogICAgICBXb3JsZEltcGFjdEJ1aWxkZXIgaW1wYWN0QnVpbGRlciwgTmF0aXZlQmVoYXZpb3IgbmF0aXZlQmVoYXZpb3IsIGNhdXNlKSB7CiAgICBfcHJvY2Vzc05hdGl2ZUJlaGF2aW9yKGltcGFjdEJ1aWxkZXIsIG5hdGl2ZUJlaGF2aW9yLCBjYXVzZSk7CiAgfQoKICB2b2lkIF9wcm9jZXNzTmF0aXZlQmVoYXZpb3IoCiAgICAgIFdvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyLCBOYXRpdmVCZWhhdmlvciBiZWhhdmlvciwgY2F1c2UpIHsKICAgIHZvaWQgcmVnaXN0ZXJJbnN0YW50aWF0aW9uKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyVHlwZVVzZShuZXcgVHlwZVVzZS5uYXRpdmVJbnN0YW50aWF0aW9uKHR5cGUpKTsKICAgIH0KCiAgICBpbnQgdW51c2VkQmVmb3JlID0gX3VudXNlZENsYXNzZXMubGVuZ3RoOwogICAgU2V0PENsYXNzRW50aXR5PiBtYXRjaGluZ0NsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwogICAgZm9yICh2YXIgdHlwZSBpbiBiZWhhdmlvci50eXBlc0luc3RhbnRpYXRlZCkgewogICAgICBpZiAodHlwZSBpcyBTcGVjaWFsVHlwZSkgewogICAgICAgIGlmICh0eXBlID09IFNwZWNpYWxUeXBlLkpzT2JqZWN0KSB7CiAgICAgICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGUpOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgaWYgKHR5cGUgPT0gX2NvbW1vbkVsZW1lbnRzLm51bVR5cGUpIHsKICAgICAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMuZG91YmxlVHlwZSk7CiAgICAgICAgICByZWdpc3Rlckluc3RhbnRpYXRpb24oX2NvbW1vbkVsZW1lbnRzLmludFR5cGUpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBfY29tbW9uRWxlbWVudHMuaW50VHlwZSB8fAogICAgICAgICAgICB0eXBlID09IF9jb21tb25FbGVtZW50cy5kb3VibGVUeXBlIHx8CiAgICAgICAgICAgIHR5cGUgPT0gX2NvbW1vbkVsZW1lbnRzLnN0cmluZ1R5cGUgfHwKICAgICAgICAgICAgdHlwZSA9PSBfY29tbW9uRWxlbWVudHMubnVsbFR5cGUgfHwKICAgICAgICAgICAgdHlwZSA9PSBfY29tbW9uRWxlbWVudHMuYm9vbFR5cGUgfHwKICAgICAgICAgICAgX2RhcnRUeXBlcy5pc1N1YnR5cGUodHlwZSwKICAgICAgICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0UmF3VHlwZShfY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzKSkpIHsKICAgICAgICAgIHJlZ2lzdGVySW5zdGFudGlhdGlvbih0eXBlKTsKICAgICAgICB9CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW1wcm92ZSBzcGVjIHN0cmluZyBwcmVjaXNpb24gdG8gaGFuZGxlIHR5cGUKICAgICAgICAvLyBhcmd1bWVudHMgYW5kIGltcGxlbWVudHMgcmVsYXRpb25zIHRoYXQgcHJlc2VydmUgZ2VuZXJpY3MuIEN1cnJlbnRseQogICAgICAgIC8vIHdlIGNhbm5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGBMaXN0YCwgYExpc3Q8ZHluYW1pYz5gLCBhbmQKICAgICAgICAvLyBgTGlzdDxpbnQ+YCBhbmQgdGFrZSBhbGwgdG8gbWVhbiBgTGlzdDxFPmA7IGluIGVmZmVjdCBub3QgaW5jbHVkaW5nCiAgICAgICAgLy8gYW55IG5hdGl2ZSBzdWJjbGFzc2VzIG9mIGdlbmVyaWMgY2xhc3Nlcy4KICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIsc3JhKTogRmluZCBhbmQgcmVwbGFjZSB1c2VzIG9mIGBMaXN0YCB3aXRoIHRoZQogICAgICAgIC8vIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIHN1Y2ggYXMgYEpTQXJyYXlgIGV0IGFsLgogICAgICAgIG1hdGNoaW5nQ2xhc3NlcwogICAgICAgICAgICAuYWRkQWxsKF9maW5kVW51c2VkQ2xhc3Nlc01hdGNoaW5nKChDbGFzc0VudGl0eSBuYXRpdmVDbGFzcykgewogICAgICAgICAgSW50ZXJmYWNlVHlwZSBuYXRpdmVUeXBlID0KICAgICAgICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LmdldFJhd1R5cGUobmF0aXZlQ2xhc3MpOwogICAgICAgICAgSW50ZXJmYWNlVHlwZSBzcGVjVHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0UmF3VHlwZSh0eXBlLmVsZW1lbnQpOwogICAgICAgICAgcmV0dXJuIF9kYXJ0VHlwZXMuaXNTdWJ0eXBlKG5hdGl2ZVR5cGUsIHNwZWNUeXBlKTsKICAgICAgICB9KSk7CiAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0R5bmFtaWMpIHsKICAgICAgICBtYXRjaGluZ0NsYXNzZXMuYWRkQWxsKF91bnVzZWRDbGFzc2VzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQodHlwZSBpcyBWb2lkVHlwZSwgJyR0eXBlIHdhcyAke3R5cGUucnVudGltZVR5cGV9Jyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChtYXRjaGluZ0NsYXNzZXMuaXNOb3RFbXB0eSAmJiBfcmVnaXN0ZXJlZENsYXNzZXMuaXNFbXB0eSkgewogICAgICBtYXRjaGluZ0NsYXNzZXMuYWRkQWxsKF9vbkZpcnN0TmF0aXZlQ2xhc3MoaW1wYWN0QnVpbGRlcikpOwogICAgfQogICAgX3JlZ2lzdGVyVHlwZVVzZXMoaW1wYWN0QnVpbGRlciwgbWF0Y2hpbmdDbGFzc2VzLCBjYXVzZSk7CgogICAgLy8gR2l2ZSBhbiBpbmZvIHNvIHRoYXQgbGlicmFyeSBkZXZlbG9wZXJzIGNhbiBjb21waWxlIHdpdGggLXYgdG8gZmluZCB3aHkKICAgIC8vIGFsbCB0aGUgbmF0aXZlIGNsYXNzZXMgYXJlIGluY2x1ZGVkLgogICAgaWYgKHVudXNlZEJlZm9yZSA+IDAgJiYgdW51c2VkQmVmb3JlID09IG1hdGNoaW5nQ2xhc3Nlcy5sZW5ndGgpIHsKICAgICAgX2FsbFVzZWRNZXNzYWdlID8/PSAnQWxsIG5hdGl2ZSB0eXBlcyBtYXJrZWQgYXMgdXNlZCBkdWUgdG8gJGNhdXNlLic7CiAgICB9CiAgfQoKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gX2ZpbmRVbnVzZWRDbGFzc2VzTWF0Y2hpbmcoCiAgICAgIGJvb2wgcHJlZGljYXRlKENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCkpIHsKICAgIHJldHVybiBfdW51c2VkQ2xhc3Nlcy53aGVyZShwcmVkaWNhdGUpOwogIH0KCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IF9vbkZpcnN0TmF0aXZlQ2xhc3MoV29ybGRJbXBhY3RCdWlsZGVyIGltcGFjdEJ1aWxkZXIpIHsKICAgIHJldHVybiBfZmluZE5hdGl2ZUV4Y2VwdGlvbnMoKTsKICB9CgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBfZmluZE5hdGl2ZUV4Y2VwdGlvbnMoKSB7CiAgICByZXR1cm4gX2ZpbmRVbnVzZWRDbGFzc2VzTWF0Y2hpbmcoKENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCkgewogICAgICAvLyBUT0RPKHNyYSk6IEFubm90YXRlIGV4Y2VwdGlvbiBjbGFzc2VzIGluIGRhcnQ6aHRtbC4KICAgICAgU3RyaW5nIG5hbWUgPSBjbGFzc0VsZW1lbnQubmFtZTsKICAgICAgaWYgKG5hbWUuY29udGFpbnMoJ0V4Y2VwdGlvbicpKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKG5hbWUuY29udGFpbnMoJ0Vycm9yJykpIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgbG9nU3VtbWFyeSh2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkpIHsKICAgIGlmIChfYWxsVXNlZE1lc3NhZ2UgIT0gbnVsbCkgewogICAgICBsb2coX2FsbFVzZWRNZXNzYWdlKTsKICAgIH0KICB9Cn0KCmNsYXNzIE5hdGl2ZVJlc29sdXRpb25FbnF1ZXVlciBleHRlbmRzIE5hdGl2ZUVucXVldWVyQmFzZSB7CiAgZmluYWwgTmF0aXZlQ2xhc3NGaW5kZXIgX25hdGl2ZUNsYXNzRmluZGVyOwoKICAvLy8gVGhlIHNldCBvZiBhbGwgbmF0aXZlIGNsYXNzZXMuICBFYWNoIG5hdGl2ZSBjbGFzcyBpcyBpbiBbbmF0aXZlQ2xhc3Nlc10KICAvLy8gYW5kIGV4YWN0bHkgb25lIG9mIFt1bnVzZWRDbGFzc2VzXSBhbmQgW3JlZ2lzdGVyZWRDbGFzc2VzXS4KICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IF9uYXRpdmVDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgTmF0aXZlUmVzb2x1dGlvbkVucXVldWVyKAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIERhcnRUeXBlcyBkYXJ0VHlwZXMsCiAgICAgIHRoaXMuX25hdGl2ZUNsYXNzRmluZGVyKQogICAgICA6IHN1cGVyKG9wdGlvbnMsIGVsZW1lbnRFbnZpcm9ubWVudCwgY29tbW9uRWxlbWVudHMsIGRhcnRUeXBlcyk7CgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgbmF0aXZlQ2xhc3Nlc0ZvclRlc3RpbmcgPT4gX25hdGl2ZUNsYXNzZXM7CgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgcmVnaXN0ZXJlZENsYXNzZXNGb3JUZXN0aW5nID0+IF9yZWdpc3RlcmVkQ2xhc3NlczsKCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGdldCBsaXZlTmF0aXZlQ2xhc3NlcyA9PiBfcmVnaXN0ZXJlZENsYXNzZXM7CgogIEBvdmVycmlkZQogIFdvcmxkSW1wYWN0IHByb2Nlc3NOYXRpdmVDbGFzc2VzKEl0ZXJhYmxlPFVyaT4gbGlicmFyaWVzKSB7CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIGltcGFjdEJ1aWxkZXIgPSBuZXcgV29ybGRJbXBhY3RCdWlsZGVySW1wbCgpOwogICAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IG5hdGl2ZUNsYXNzZXMgPQogICAgICAgIF9uYXRpdmVDbGFzc0ZpbmRlci5jb21wdXRlTmF0aXZlQ2xhc3NlcyhsaWJyYXJpZXMpOwogICAgX25hdGl2ZUNsYXNzZXMuYWRkQWxsKG5hdGl2ZUNsYXNzZXMpOwogICAgX3VudXNlZENsYXNzZXMuYWRkQWxsKG5hdGl2ZUNsYXNzZXMpOwogICAgaWYgKCFlbmFibGVMaXZlVHlwZUFuYWx5c2lzKSB7CiAgICAgIF9yZWdpc3RlclR5cGVVc2VzKGltcGFjdEJ1aWxkZXIsIF9uYXRpdmVDbGFzc2VzLCAnZm9yY2VkJyk7CiAgICB9CiAgICByZXR1cm4gaW1wYWN0QnVpbGRlcjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgbG9nU3VtbWFyeSh2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkpIHsKICAgIHN1cGVyLmxvZ1N1bW1hcnkobG9nKTsKICAgIGxvZygnUmVzb2x2ZWQgJHtfcmVnaXN0ZXJlZENsYXNzZXMubGVuZ3RofSBuYXRpdmUgZWxlbWVudHMgdXNlZCwgJwogICAgICAgICcke191bnVzZWRDbGFzc2VzLmxlbmd0aH0gbmF0aXZlIGVsZW1lbnRzIGRlYWQuJyk7CiAgfQp9CgpjbGFzcyBOYXRpdmVDb2RlZ2VuRW5xdWV1ZXIgZXh0ZW5kcyBOYXRpdmVFbnF1ZXVlckJhc2UgewogIGZpbmFsIENvZGVFbWl0dGVyVGFzayBfZW1pdHRlcjsKICBmaW5hbCBJdGVyYWJsZTxDbGFzc0VudGl0eT4gX25hdGl2ZUNsYXNzZXM7CiAgZmluYWwgTmF0aXZlRGF0YSBfbmF0aXZlRGF0YTsKCiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBfZG9uZUFkZFN1YnR5cGVzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgTmF0aXZlQ29kZWdlbkVucXVldWVyKAogICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucywKICAgICAgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIERhcnRUeXBlcyBkYXJ0VHlwZXMsCiAgICAgIHRoaXMuX2VtaXR0ZXIsCiAgICAgIHRoaXMuX25hdGl2ZUNsYXNzZXMsCiAgICAgIHRoaXMuX25hdGl2ZURhdGEpCiAgICAgIDogc3VwZXIob3B0aW9ucywgZWxlbWVudEVudmlyb25tZW50LCBjb21tb25FbGVtZW50cywgZGFydFR5cGVzKTsKCiAgQG92ZXJyaWRlCiAgV29ybGRJbXBhY3QgcHJvY2Vzc05hdGl2ZUNsYXNzZXMoSXRlcmFibGU8VXJpPiBsaWJyYXJpZXMpIHsKICAgIFdvcmxkSW1wYWN0QnVpbGRlckltcGwgaW1wYWN0QnVpbGRlciA9IG5ldyBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsKCk7CiAgICBfdW51c2VkQ2xhc3Nlcy5hZGRBbGwoX25hdGl2ZUNsYXNzZXMpOwoKICAgIGlmICghZW5hYmxlTGl2ZVR5cGVBbmFseXNpcykgewogICAgICBfcmVnaXN0ZXJUeXBlVXNlcyhpbXBhY3RCdWlsZGVyLCBfbmF0aXZlQ2xhc3NlcywgJ2ZvcmNlZCcpOwogICAgfQoKICAgIC8vIEhBQ0sgSEFDSyAtIGFkZCBhbGwgdGhlIHJlc29sdmVkIGNsYXNzZXMuCiAgICBTZXQ8Q2xhc3NFbnRpdHk+IG1hdGNoaW5nQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICBmb3IgKENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCBpbiBfbmF0aXZlQ2xhc3NlcykgewogICAgICBpZiAoX3VudXNlZENsYXNzZXMuY29udGFpbnMoY2xhc3NFbGVtZW50KSkgewogICAgICAgIG1hdGNoaW5nQ2xhc3Nlcy5hZGQoY2xhc3NFbGVtZW50KTsKICAgICAgfQogICAgfQogICAgaWYgKG1hdGNoaW5nQ2xhc3Nlcy5pc05vdEVtcHR5ICYmIF9yZWdpc3RlcmVkQ2xhc3Nlcy5pc0VtcHR5KSB7CiAgICAgIG1hdGNoaW5nQ2xhc3Nlcy5hZGRBbGwoX29uRmlyc3ROYXRpdmVDbGFzcyhpbXBhY3RCdWlsZGVyKSk7CiAgICB9CiAgICBfcmVnaXN0ZXJUeXBlVXNlcyhpbXBhY3RCdWlsZGVyLCBtYXRjaGluZ0NsYXNzZXMsICd3YXMgcmVzb2x2ZWQnKTsKICAgIHJldHVybiBpbXBhY3RCdWlsZGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfcmVnaXN0ZXJUeXBlVXNlcygKICAgICAgV29ybGRJbXBhY3RCdWlsZGVyIGltcGFjdEJ1aWxkZXIsIFNldDxDbGFzc0VudGl0eT4gY2xhc3NlcywgY2F1c2UpIHsKICAgIHN1cGVyLl9yZWdpc3RlclR5cGVVc2VzKGltcGFjdEJ1aWxkZXIsIGNsYXNzZXMsIGNhdXNlKTsKCiAgICBmb3IgKENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCBpbiBjbGFzc2VzKSB7CiAgICAgIC8vIEFkZCB0aGUgaW5mb3JtYXRpb24gdGhhdCB0aGlzIGNsYXNzIGlzIGEgc3VidHlwZSBvZiBpdHMgc3VwZXJ0eXBlcy4gVGhlCiAgICAgIC8vIGNvZGUgZW1pdHRlciBhbmQgdGhlIHNzYSBidWlsZGVyIHVzZSB0aGF0IGluZm9ybWF0aW9uLgogICAgICBfYWRkU3VidHlwZXMoY2xhc3NFbGVtZW50LCBfZW1pdHRlci5uYXRpdmVFbWl0dGVyKTsKICAgIH0KICB9CgogIHZvaWQgX2FkZFN1YnR5cGVzKENsYXNzRW50aXR5IGNscywgTmF0aXZlRW1pdHRlciBlbWl0dGVyKSB7CiAgICBpZiAoIV9uYXRpdmVEYXRhLmlzTmF0aXZlQ2xhc3MoY2xzKSkgcmV0dXJuOwogICAgaWYgKF9kb25lQWRkU3VidHlwZXMuY29udGFpbnMoY2xzKSkgcmV0dXJuOwogICAgX2RvbmVBZGRTdWJ0eXBlcy5hZGQoY2xzKTsKCiAgICAvLyBXYWxrIHRoZSBzdXBlcmNsYXNzIGNoYWluIHNpbmNlIGNsYXNzZXMgb24gdGhlIHN1cGVyY2xhc3MgY2hhaW4gbWlnaHQgbm90CiAgICAvLyBiZSBpbnN0YW50aWF0ZWQgKGFic3RyYWN0IG9yIHNpbXBseSB1bnVzZWQpLgogICAgX2FkZFN1YnR5cGVzKF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhjbHMpLCBlbWl0dGVyKTsKCiAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hTdXBlcnR5cGUoY2xzLCAoSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICAgIExpc3Q8Q2xhc3NFbnRpdHk+IHN1YnR5cGVzID0KICAgICAgICAgIGVtaXR0ZXIuc3VidHlwZXNbdHlwZS5lbGVtZW50XSA/Pz0gPENsYXNzRW50aXR5PltdOwogICAgICBzdWJ0eXBlcy5hZGQoY2xzKTsKICAgIH0pOwoKICAgIC8vIFNraXAgdGhyb3VnaCBhbGwgdGhlIG1peGluIGFwcGxpY2F0aW9ucyBpbiB0aGUgc3VwZXIgY2xhc3MKICAgIC8vIGNoYWluLiBUaGF0IHdheSwgdGhlIGRpcmVjdCBzdWJ0eXBlcyBzZXQgb25seSBjb250YWluIHRoZQogICAgLy8gbmF0aXZlcyBjbGFzc2VzLgogICAgQ2xhc3NFbnRpdHkgc3VwZXJjbGFzcyA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhjbHMpOwogICAgd2hpbGUgKHN1cGVyY2xhc3MgIT0gbnVsbCAmJgogICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuaXNNaXhpbkFwcGxpY2F0aW9uKHN1cGVyY2xhc3MpKSB7CiAgICAgIGFzc2VydCghX25hdGl2ZURhdGEuaXNOYXRpdmVDbGFzcyhzdXBlcmNsYXNzKSk7CiAgICAgIHN1cGVyY2xhc3MgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3Moc3VwZXJjbGFzcyk7CiAgICB9CgogICAgTGlzdDxDbGFzc0VudGl0eT4gZGlyZWN0U3VidHlwZXMgPQogICAgICAgIGVtaXR0ZXIuZGlyZWN0U3VidHlwZXNbc3VwZXJjbGFzc10gPz89IDxDbGFzc0VudGl0eT5bXTsKICAgIGRpcmVjdFN1YnR5cGVzLmFkZChjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsb2dTdW1tYXJ5KHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSkgewogICAgc3VwZXIubG9nU3VtbWFyeShsb2cpOwogICAgbG9nKCdDb21waWxlZCAke19yZWdpc3RlcmVkQ2xhc3Nlcy5sZW5ndGh9IG5hdGl2ZSBjbGFzc2VzLCAnCiAgICAgICAgJyR7X3VudXNlZENsYXNzZXMubGVuZ3RofSBuYXRpdmUgY2xhc3NlcyBvbWl0dGVkLicpOwogIH0KfQqBMwBOTjwBSiQhOUwaLCdCGC8BRBIXOzEBLj8bAUwaH1EBNTIBPC8CAT5GQgEMSAE5GgEiMB4oAUk+LgFMAQwwLywGBAFGGksnK1FMFhIIJVEGBAEMH1BCBAEfSjVMBgEuPzMhLD0KEggjLz06NjIyMDAnUScKTVBGTzVNQhhLJTtRPQ0jMA9DCAZEQgY+AU8sRkwGBAE0MiwEAVAkBAEyQz0nMy8UCAQBDC4jHAYEAgE8LgFOQkIBHB8tJRsfRwFHAU8BRQEMPkkqPCoqI0IGGgQBDC4bRzsEAgE5Ii4gAUQBGR8tJRsVGxhHAQw+SSsBI0IGATE/NzMrCAZEQgZHGgQBDBpLPAEwUUA6BgQBPjEwHwFRNEMBRSM+GQgBQkEYRSE+NkIGASdAHQQBDC4bQT0EAgEocGFja2FnZTpjb21waWxlci9zcmMvbmF0aXZlL2VucXVldWUuZGFydDVzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zc2EvYnVpbGRlcl9rZXJuZWwuZGFydMAEH8ovLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmpzX3J1bnRpbWUvc2hhcmVkL2VtYmVkZGVkX25hbWVzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL2NvZGVnZW4uZGFydCcgc2hvdyBDb2RlZ2VuUmVnaXN0cnk7CmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvY29uc3RhbnRfc3lzdGVtLmRhcnQnIGFzIGNvbnN0YW50X3N5c3RlbTsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2RlZmVycmVkX2xvYWQuZGFydCc7CmltcG9ydCAnLi4vZHVtcF9pbmZvLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2p1bXBzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCc7CmltcG9ydCAnLi4vaXIvc3RhdGljX3R5cGUuZGFydCc7CmltcG9ydCAnLi4vaXIvc3RhdGljX3R5cGVfcHJvdmlkZXIuZGFydCc7CmltcG9ydCAnLi4vaXIvdXRpbC5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2JhY2tlbmQuZGFydCcgc2hvdyBGdW5jdGlvbklubGluZUNhY2hlOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCcKICAgIHNob3cgRmllbGRBbmFseXNpc0RhdGEsIEpGaWVsZEFuYWx5c2lzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvaW50ZXJjZXB0b3JfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2luZmVycmVkX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYW1lci5kYXJ0JyBzaG93IE1vZHVsYXJOYW1lcjsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hdGl2ZV9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvcnVudGltZV90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXNfcmVzb2x1dGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9qc19lbWl0dGVyL2NvZGVfZW1pdHRlcl90YXNrLmRhcnQnIHNob3cgTW9kdWxhckVtaXR0ZXI7CmltcG9ydCAnLi4vanNfbW9kZWwvbG9jYWxzLmRhcnQnIHNob3cgSnVtcFZpc2l0b3I7CmltcG9ydCAnLi4vanNfbW9kZWwvZWxlbWVudHMuZGFydCcgc2hvdyBKR2VuZXJhdG9yQm9keTsKaW1wb3J0ICcuLi9qc19tb2RlbC9lbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9qc19zdHJhdGVneS5kYXJ0JzsKaW1wb3J0ICcuLi9rZXJuZWwvaW52b2NhdGlvbl9taXJyb3JfY29uc3RhbnRzLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9iZWhhdmlvci5kYXJ0JzsKaW1wb3J0ICcuLi9uYXRpdmUvanMuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi90cmFjZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvZmVhdHVyZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9tZW1iZXJfdXNhZ2UuZGFydCcgc2hvdyBNZW1iZXJBY2Nlc3M7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2lkZV9lZmZlY3RzLmRhcnQnIHNob3cgU2lkZUVmZmVjdHM7CmltcG9ydCAnLi4vdW5pdmVyc2UvdGFyZ2V0X2NoZWNrcy5kYXJ0JyBzaG93IFRhcmdldENoZWNrczsKaW1wb3J0ICcuLi91bml2ZXJzZS91c2UuZGFydCcgc2hvdyBDb25zdGFudFVzZSwgU3RhdGljVXNlOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnOwppbXBvcnQgJ2p1bXBfaGFuZGxlci5kYXJ0JzsKaW1wb3J0ICdrZXJuZWxfc3RyaW5nX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbG9jYWxzX2hhbmRsZXIuZGFydCc7CmltcG9ydCAnbG9vcF9oYW5kbGVyLmRhcnQnOwppbXBvcnQgJ25vZGVzLmRhcnQnOwppbXBvcnQgJ3NzYV9icmFuY2hfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdzd2l0Y2hfY29udGludWVfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAndHlwZV9idWlsZGVyLmRhcnQnOwoKLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWVyZ2UgdGhpcyB3aXRoIFtLZXJuZWxJbmxpbmluZ1N0YXRlXS4KY2xhc3MgU3RhY2tGcmFtZSB7CiAgZmluYWwgU3RhY2tGcmFtZSBwYXJlbnQ7CiAgZmluYWwgTWVtYmVyRW50aXR5IG1lbWJlcjsKICBmaW5hbCBBc3luY01hcmtlciBhc3luY01hcmtlcjsKICBmaW5hbCBLZXJuZWxUb0xvY2Fsc01hcCBsb2NhbHNNYXA7CiAgLy8gW2lyLkxldF0gYW5kIFtpci5Mb2NhbEluaXRpYWxpemVyXSBiaW5kaW5ncy4KICBmaW5hbCBNYXA8aXIuVmFyaWFibGVEZWNsYXJhdGlvbiwgSEluc3RydWN0aW9uPiBsZXRCaW5kaW5nczsKICBmaW5hbCBLZXJuZWxUb1R5cGVJbmZlcmVuY2VNYXAgdHlwZUluZmVyZW5jZU1hcDsKICBmaW5hbCBTb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIgc291cmNlSW5mb3JtYXRpb25CdWlsZGVyOwogIGZpbmFsIFN0YXRpY1R5cGVQcm92aWRlciBzdGF0aWNUeXBlUHJvdmlkZXI7CgogIFN0YWNrRnJhbWUoCiAgICAgIHRoaXMucGFyZW50LAogICAgICB0aGlzLm1lbWJlciwKICAgICAgdGhpcy5hc3luY01hcmtlciwKICAgICAgdGhpcy5sb2NhbHNNYXAsCiAgICAgIHRoaXMubGV0QmluZGluZ3MsCiAgICAgIHRoaXMudHlwZUluZmVyZW5jZU1hcCwKICAgICAgdGhpcy5zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIsCiAgICAgIHRoaXMuc3RhdGljVHlwZVByb3ZpZGVyKTsKfQoKY2xhc3MgS2VybmVsU3NhR3JhcGhCdWlsZGVyIGV4dGVuZHMgaXIuVmlzaXRvciB7CiAgLy8vIEhvbGRzIHRoZSByZXN1bHRpbmcgU1NBIGdyYXBoLgogIGZpbmFsIEhHcmFwaCBncmFwaCA9IG5ldyBIR3JhcGgoKTsKCiAgLy8vIFRydWUgaWYgdGhlIGJ1aWxkZXIgaXMgcHJvY2Vzc2luZyBub2RlcyBpbnNpZGUgYSB0cnkgc3RhdGVtZW50LiBUaGlzIGlzCiAgLy8vIGltcG9ydGFudCBmb3IgZ2VuZXJhdGluZyBjb250cm9sIGZsb3cgb3V0IG9mIGEgdHJ5IGJsb2NrIGxpa2UgcmV0dXJucyBvcgogIC8vLyBicmVha3MuCiAgYm9vbCBfaW5UcnlTdGF0ZW1lbnQgPSBmYWxzZTsKCiAgLy8vIFVzZWQgdG8gdHJhY2sgdGhlIGxvY2FscyB3aGlsZSBidWlsZGluZyB0aGUgZ3JhcGguCiAgTG9jYWxzSGFuZGxlciBsb2NhbHNIYW5kbGVyOwoKICAvLy8gQSBzdGFjayBvZiBpbnN0cnVjdGlvbnMuCiAgLy8vCiAgLy8vIFdlIGJ1aWxkIHRoZSBTU0EgZ3JhcGggYnkgc2ltdWxhdGluZyBhIHN0YWNrIG1hY2hpbmUuCiAgTGlzdDxISW5zdHJ1Y3Rpb24+IHN0YWNrID0gPEhJbnN0cnVjdGlvbj5bXTsKCiAgLy8vIFRoZSBjb3VudCBvZiBuZXN0ZWQgbG9vcHMgd2UgYXJlIGN1cnJlbnRseSBidWlsZGluZy4KICAvLy8KICAvLy8gVGhlIGxvb3AgbmVzdGluZyBpcyBjb25zdWx0ZWQgd2hlbiBpbmxpbmluZyBhIGZ1bmN0aW9uIGludm9jYXRpb24uIFRoZQogIC8vLyBpbmxpbmluZyBoZXVyaXN0aWNzIHRha2UgdGhpcyBpbmZvcm1hdGlvbiBpbnRvIGFjY291bnQuCiAgaW50IGxvb3BEZXB0aCA9IDA7CgogIC8vLyBBIG1hcHBpbmcgZnJvbSBqdW1wIHRhcmdldHMgdG8gdGhlaXIgaGFuZGxlcnMuCiAgTWFwPEp1bXBUYXJnZXQsIEp1bXBIYW5kbGVyPiBqdW1wVGFyZ2V0cyA9IDxKdW1wVGFyZ2V0LCBKdW1wSGFuZGxlcj57fTsKCiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnM7CiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyOwogIGZpbmFsIE1vZHVsYXJFbWl0dGVyIF9lbWl0dGVyOwogIGZpbmFsIE1vZHVsYXJOYW1lciBfbmFtZXI7CiAgZmluYWwgTWVtYmVyRW50aXR5IHRhcmdldEVsZW1lbnQ7CiAgZmluYWwgTWVtYmVyRW50aXR5IF9pbml0aWFsVGFyZ2V0RWxlbWVudDsKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CiAgZmluYWwgQ29kZWdlblJlZ2lzdHJ5IHJlZ2lzdHJ5OwogIGZpbmFsIENsb3N1cmVEYXRhIF9jbG9zdXJlRGF0YUxvb2t1cDsKICBmaW5hbCBUcmFjZXIgX3RyYWNlcjsKICBmaW5hbCBSdW50aW1lVHlwZXNFbmNvZGVyIF9ydGlFbmNvZGVyOwoKICAvLy8gQSBzdGFjayBvZiBbSW50ZXJmYWNlVHlwZV1zIHRoYXQgaGF2ZSBiZWVuIHNlZW4gZHVyaW5nIGlubGluaW5nIG9mCiAgLy8vIGZhY3RvcnkgY29uc3RydWN0b3JzLiAgVGhlc2UgdHlwZXMgYXJlIHByZXNlcnZlZCBpbiBbSEludm9rZVN0YXRpY11zIGFuZAogIC8vLyBbSENyZWF0ZV1zIGluc2lkZSB0aGUgaW5saW5lIGNvZGUgYW5kIHJlZ2lzdGVyZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgogIC8vLyBmb3IgdGhlc2Ugbm9kZXMuCiAgLy8gVE9ETyhrYXJsa2xvc2UpOiBjb25zaWRlciByZW1vdmluZyB0aGlzIGFuZCBrZWVwaW5nIHRoZSAoc3Vic3RpdHV0ZWQpIHR5cGVzCiAgLy8gb2YgdGhlIHR5cGUgdmFyaWFibGVzIGluIGFuIGVudmlyb25tZW50IChsaWtlIHRoZSBbTG9jYWxzSGFuZGxlcl0pLgogIGZpbmFsIExpc3Q8SW50ZXJmYWNlVHlwZT4gX2N1cnJlbnRJbXBsaWNpdEluc3RhbnRpYXRpb25zID0gPEludGVyZmFjZVR5cGU+W107CgogIC8vLyBVc2VkIHRvIHJlcG9ydCBpbmZvcm1hdGlvbiBhYm91dCBpbmxpbmluZyAod2hpY2ggb2NjdXJzIHdoaWxlIGJ1aWxkaW5nIHRoZQogIC8vLyBTU0EgZ3JhcGgpLCB3aGVuIGR1bXAtaW5mbyBpcyBlbmFibGVkLgogIGZpbmFsIEluZm9SZXBvcnRlciBfaW5mb1JlcG9ydGVyOwoKICBISW5zdHJ1Y3Rpb24gX3JldGhyb3dhYmxlRXhjZXB0aW9uOwoKICBmaW5hbCBTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5IF9zb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5OwogIGZpbmFsIEpzVG9FbGVtZW50TWFwIF9lbGVtZW50TWFwOwogIGZpbmFsIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdsb2JhbEluZmVyZW5jZVJlc3VsdHM7CiAgTG9vcEhhbmRsZXIgX2xvb3BIYW5kbGVyOwogIFR5cGVCdWlsZGVyIF90eXBlQnVpbGRlcjsKCiAgLy8vIFRydWUgaWYgd2UgYXJlIHZpc2l0aW5nIHRoZSBleHByZXNzaW9uIG9mIGEgdGhyb3cgc3RhdGVtZW50OyB3ZSBhc3N1bWUKICAvLy8gdGhpcyBpcyBhIHNsb3cgcGF0aC4KICBib29sIF9pbkV4cHJlc3Npb25PZlRocm93ID0gZmFsc2U7CgogIGZpbmFsIExpc3Q8S2VybmVsSW5saW5pbmdTdGF0ZT4gX2lubGluaW5nU3RhY2sgPSA8S2VybmVsSW5saW5pbmdTdGF0ZT5bXTsKICBMb2NhbCBfcmV0dXJuTG9jYWw7CiAgRGFydFR5cGUgX3JldHVyblR5cGU7CiAgYm9vbCBfaW5MYXp5SW5pdGlhbGl6ZXJFeHByZXNzaW9uID0gZmFsc2U7CgogIFN0YWNrRnJhbWUgX2N1cnJlbnRGcmFtZTsKCiAgZmluYWwgRnVuY3Rpb25JbmxpbmVDYWNoZSBfaW5saW5lQ2FjaGU7CiAgZmluYWwgSW5saW5lRGF0YUNhY2hlIF9pbmxpbmVEYXRhQ2FjaGU7CgogIEtlcm5lbFNzYUdyYXBoQnVpbGRlcigKICAgICAgdGhpcy5vcHRpb25zLAogICAgICB0aGlzLnJlcG9ydGVyLAogICAgICB0aGlzLl9pbml0aWFsVGFyZ2V0RWxlbWVudCwKICAgICAgSW50ZXJmYWNlVHlwZSBpbnN0YW5jZVR5cGUsCiAgICAgIHRoaXMuX2luZm9SZXBvcnRlciwKICAgICAgdGhpcy5fZWxlbWVudE1hcCwKICAgICAgdGhpcy5nbG9iYWxJbmZlcmVuY2VSZXN1bHRzLAogICAgICB0aGlzLmNsb3NlZFdvcmxkLAogICAgICB0aGlzLnJlZ2lzdHJ5LAogICAgICB0aGlzLl9uYW1lciwKICAgICAgdGhpcy5fZW1pdHRlciwKICAgICAgdGhpcy5fdHJhY2VyLAogICAgICB0aGlzLl9ydGlFbmNvZGVyLAogICAgICB0aGlzLl9zb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5LAogICAgICB0aGlzLl9pbmxpbmVDYWNoZSwKICAgICAgdGhpcy5faW5saW5lRGF0YUNhY2hlKQogICAgICA6IHRoaXMudGFyZ2V0RWxlbWVudCA9IF9lZmZlY3RpdmVUYXJnZXRFbGVtZW50Rm9yKF9pbml0aWFsVGFyZ2V0RWxlbWVudCksCiAgICAgICAgdGhpcy5fY2xvc3VyZURhdGFMb29rdXAgPSBjbG9zZWRXb3JsZC5jbG9zdXJlRGF0YUxvb2t1cCB7CiAgICBfZW50ZXJGcmFtZSh0YXJnZXRFbGVtZW50LCBudWxsKTsKICAgIHRoaXMuX2xvb3BIYW5kbGVyID0gbmV3IEtlcm5lbExvb3BIYW5kbGVyKHRoaXMpOwogICAgX3R5cGVCdWlsZGVyID0gbmV3IEtlcm5lbFR5cGVCdWlsZGVyKHRoaXMsIF9lbGVtZW50TWFwKTsKICAgIGdyYXBoLmVsZW1lbnQgPSB0YXJnZXRFbGVtZW50OwogICAgZ3JhcGguc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRWYXJpYWJsZURlY2xhcmF0aW9uKCk7CiAgICB0aGlzLmxvY2Fsc0hhbmRsZXIgPSBuZXcgTG9jYWxzSGFuZGxlcih0aGlzLCB0YXJnZXRFbGVtZW50LCB0YXJnZXRFbGVtZW50LAogICAgICAgIGluc3RhbmNlVHlwZSwgX25hdGl2ZURhdGEsIF9pbnRlcmNlcHRvckRhdGEpOwogIH0KCiAgS2VybmVsVG9Mb2NhbHNNYXAgZ2V0IF9sb2NhbHNNYXAgPT4gX2N1cnJlbnRGcmFtZS5sb2NhbHNNYXA7CgogIE1hcDxpci5WYXJpYWJsZURlY2xhcmF0aW9uLCBISW5zdHJ1Y3Rpb24+IGdldCBfbGV0QmluZGluZ3MgPT4KICAgICAgX2N1cnJlbnRGcmFtZS5sZXRCaW5kaW5nczsKCiAgSkNvbW1vbkVsZW1lbnRzIGdldCBfY29tbW9uRWxlbWVudHMgPT4gX2VsZW1lbnRNYXAuY29tbW9uRWxlbWVudHM7CgogIEpFbGVtZW50RW52aXJvbm1lbnQgZ2V0IF9lbGVtZW50RW52aXJvbm1lbnQgPT4gX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50OwoKICBKRmllbGRBbmFseXNpcyBnZXQgX2ZpZWxkQW5hbHlzaXMgPT4gY2xvc2VkV29ybGQuZmllbGRBbmFseXNpczsKCiAgS2VybmVsVG9UeXBlSW5mZXJlbmNlTWFwIGdldCBfdHlwZUluZmVyZW5jZU1hcCA9PgogICAgICBfY3VycmVudEZyYW1lLnR5cGVJbmZlcmVuY2VNYXA7CgogIFNvdXJjZUluZm9ybWF0aW9uQnVpbGRlciBnZXQgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlciA9PgogICAgICBfY3VycmVudEZyYW1lLnNvdXJjZUluZm9ybWF0aW9uQnVpbGRlcjsKCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgX2Fic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbjsKCiAgTmF0aXZlRGF0YSBnZXQgX25hdGl2ZURhdGEgPT4gY2xvc2VkV29ybGQubmF0aXZlRGF0YTsKCiAgSW50ZXJjZXB0b3JEYXRhIGdldCBfaW50ZXJjZXB0b3JEYXRhID0+IGNsb3NlZFdvcmxkLmludGVyY2VwdG9yRGF0YTsKCiAgUnVudGltZVR5cGVzTmVlZCBnZXQgX3J0aU5lZWQgPT4gY2xvc2VkV29ybGQucnRpTmVlZDsKCiAgSW5mZXJyZWREYXRhIGdldCBfaW5mZXJyZWREYXRhID0+IGdsb2JhbEluZmVyZW5jZVJlc3VsdHMuaW5mZXJyZWREYXRhOwoKICBEYXJ0VHlwZXMgZ2V0IHR5cGVzID0+IGNsb3NlZFdvcmxkLmRhcnRUeXBlczsKCiAgdm9pZCBwdXNoKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgYWRkKGluc3RydWN0aW9uKTsKICAgIHN0YWNrLmFkZChpbnN0cnVjdGlvbik7CiAgfQoKICBISW5zdHJ1Y3Rpb24gcG9wKCkgewogICAgcmV0dXJuIHN0YWNrLnJlbW92ZUxhc3QoKTsKICB9CgogIC8vLyBQdXNoZXMgYSBib29sZWFuIGNoZWNraW5nIFtleHByZXNzaW9uXSBhZ2FpbnN0IG51bGwuCiAgcHVzaENoZWNrTnVsbChISW5zdHJ1Y3Rpb24gZXhwcmVzc2lvbikgewogICAgcHVzaChuZXcgSElkZW50aXR5KGV4cHJlc3Npb24sIGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCksIG51bGwsCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpKTsKICB9CgogIEhCYXNpY0Jsb2NrIF9jdXJyZW50OwoKICAvLy8gVGhlIGN1cnJlbnQgYmxvY2sgdG8gYWRkIGluc3RydWN0aW9ucyB0by4gTWlnaHQgYmUgbnVsbCwgaWYgd2UgYXJlCiAgLy8vIHZpc2l0aW5nIGRlYWQgY29kZSwgYnV0IHNlZSBbX2lzUmVhY2hhYmxlXS4KICBIQmFzaWNCbG9jayBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKCiAgdm9pZCBzZXQgY3VycmVudChjKSB7CiAgICBfaXNSZWFjaGFibGUgPSBjICE9IG51bGw7CiAgICBfY3VycmVudCA9IGM7CiAgfQoKICAvLy8gVGhlIG1vc3QgcmVjZW50bHkgb3BlbmVkIGJsb2NrLiBIYXMgdGhlIHNhbWUgdmFsdWUgYXMgW2N1cnJlbnRdIHdoaWxlCiAgLy8vIHRoZSBibG9jayBpcyBvcGVuLCBidXQgdW5saWtlIFtjdXJyZW50XSwgaXQgaXNuJ3QgY2xlYXJlZCB3aGVuIHRoZQogIC8vLyBjdXJyZW50IGJsb2NrIGlzIGNsb3NlZC4KICBIQmFzaWNCbG9jayBsYXN0T3BlbmVkQmxvY2s7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VycmVudCBibG9jayBpcyBkZWFkIChiZWNhdXNlIGl0IGhhcyBhIHRocm93IG9yIGEKICAvLy8gcmV0dXJuIGZ1cnRoZXIgdXApLiBJZiB0aGlzIGlzIGZhbHNlLCB0aGVuIFtjdXJyZW50XSBtYXkgYmUgbnVsbC4gSWYgdGhlCiAgLy8vIGJsb2NrIGlzIGRlYWQgdGhlbiBpdCBtYXkgYWxzbyBiZSBhYm9ydGVkLCBidXQgZm9yIHNpbXBsaWNpdHkgd2Ugb25seQogIC8vLyBhYm9ydCBvbiBzdGF0ZW1lbnQgYm91bmRhcmllcywgbm90IGluIHRoZSBtaWRkbGUgb2YgZXhwcmVzc2lvbnMuIFNlZQogIC8vLyBbaXNBYm9ydGVkXS4KICBib29sIF9pc1JlYWNoYWJsZSA9IHRydWU7CgogIEhMb2NhbFZhbHVlIGxhc3RBZGRlZFBhcmFtZXRlcjsKCiAgTWFwPExvY2FsLCBISW5zdHJ1Y3Rpb24+IHBhcmFtZXRlcnMgPSA8TG9jYWwsIEhJbnN0cnVjdGlvbj57fTsKICBTZXQ8TG9jYWw+IGVsaWRlZFBhcmFtZXRlcnM7CgogIEhCYXNpY0Jsb2NrIGFkZE5ld0Jsb2NrKCkgewogICAgSEJhc2ljQmxvY2sgYmxvY2sgPSBncmFwaC5hZGROZXdCbG9jaygpOwogICAgLy8gSWYgYWRkaW5nIGEgbmV3IGJsb2NrIGR1cmluZyBidWlsZGluZyBvZiBhbiBleHByZXNzaW9uLCBpdCBpcyBkdWUgdG8KICAgIC8vIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zIG9yIHNob3J0LWNpcmN1aXQgbG9naWNhbCBvcGVyYXRvcnMuCiAgICByZXR1cm4gYmxvY2s7CiAgfQoKICB2b2lkIG9wZW4oSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGJsb2NrLm9wZW4oKTsKICAgIGN1cnJlbnQgPSBibG9jazsKICAgIGxhc3RPcGVuZWRCbG9jayA9IGJsb2NrOwogIH0KCiAgSEJhc2ljQmxvY2sgY2xvc2UoSENvbnRyb2xGbG93IGVuZCkgewogICAgSEJhc2ljQmxvY2sgcmVzdWx0ID0gY3VycmVudDsKICAgIGN1cnJlbnQuY2xvc2UoZW5kKTsKICAgIGN1cnJlbnQgPSBudWxsOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEhCYXNpY0Jsb2NrIF9jbG9zZUFuZEdvdG9FeGl0KEhDb250cm9sRmxvdyBlbmQpIHsKICAgIEhCYXNpY0Jsb2NrIHJlc3VsdCA9IGN1cnJlbnQ7CiAgICBjdXJyZW50LmNsb3NlKGVuZCk7CiAgICBjdXJyZW50ID0gbnVsbDsKICAgIHJlc3VsdC5hZGRTdWNjZXNzb3IoZ3JhcGguZXhpdCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBnb3RvKEhCYXNpY0Jsb2NrIGZyb20sIEhCYXNpY0Jsb2NrIHRvKSB7CiAgICBmcm9tLmNsb3NlKG5ldyBIR290byhfYWJzdHJhY3RWYWx1ZURvbWFpbikpOwogICAgZnJvbS5hZGRTdWNjZXNzb3IodG8pOwogIH0KCiAgYm9vbCBpc0Fib3J0ZWQoKSB7CiAgICByZXR1cm4gY3VycmVudCA9PSBudWxsOwogIH0KCiAgLy8vIENyZWF0ZXMgYSBuZXcgYmxvY2ssIHRyYW5zaXRpb25zIHRvIGl0IGZyb20gYW55IGN1cnJlbnQgYmxvY2ssIGFuZAogIC8vLyBvcGVucyB0aGUgbmV3IGJsb2NrLgogIEhCYXNpY0Jsb2NrIG9wZW5OZXdCbG9jaygpIHsKICAgIEhCYXNpY0Jsb2NrIG5ld0Jsb2NrID0gYWRkTmV3QmxvY2soKTsKICAgIGlmICghaXNBYm9ydGVkKCkpIGdvdG8oY3VycmVudCwgbmV3QmxvY2spOwogICAgb3BlbihuZXdCbG9jayk7CiAgICByZXR1cm4gbmV3QmxvY2s7CiAgfQoKICB2b2lkIGFkZChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGN1cnJlbnQuYWRkKGluc3RydWN0aW9uKTsKICB9CgogIEhMb2NhbFZhbHVlIGFkZFBhcmFtZXRlcihFbnRpdHkgcGFyYW1ldGVyLCBBYnN0cmFjdFZhbHVlIHR5cGUsCiAgICAgIHtib29sIGlzRWxpZGVkOiBmYWxzZX0pIHsKICAgIEhMb2NhbFZhbHVlIHJlc3VsdCA9IGlzRWxpZGVkCiAgICAgICAgPyBuZXcgSExvY2FsVmFsdWUocGFyYW1ldGVyLCB0eXBlKQogICAgICAgIDogbmV3IEhQYXJhbWV0ZXJWYWx1ZShwYXJhbWV0ZXIsIHR5cGUpOwogICAgaWYgKGxhc3RBZGRlZFBhcmFtZXRlciA9PSBudWxsKSB7CiAgICAgIGdyYXBoLmVudHJ5LmFkZEJlZm9yZShncmFwaC5lbnRyeS5maXJzdCwgcmVzdWx0KTsKICAgIH0gZWxzZSB7CiAgICAgIGdyYXBoLmVudHJ5LmFkZEFmdGVyKGxhc3RBZGRlZFBhcmFtZXRlciwgcmVzdWx0KTsKICAgIH0KICAgIGxhc3RBZGRlZFBhcmFtZXRlciA9IHJlc3VsdDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uIHdyYXBTdGF0ZW1lbnRHcmFwaChTdWJHcmFwaCBzdGF0ZW1lbnRzKSB7CiAgICBpZiAoc3RhdGVtZW50cyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBuZXcgSFN1YkdyYXBoQmxvY2tJbmZvcm1hdGlvbihzdGF0ZW1lbnRzKTsKICB9CgogIEhTdWJFeHByZXNzaW9uQmxvY2tJbmZvcm1hdGlvbiB3cmFwRXhwcmVzc2lvbkdyYXBoKFN1YkV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmV3IEhTdWJFeHByZXNzaW9uQmxvY2tJbmZvcm1hdGlvbihleHByZXNzaW9uKTsKICB9CgogIEhMaXRlcmFsTGlzdCBfYnVpbGRMaXRlcmFsTGlzdChMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzKSB7CiAgICByZXR1cm4gbmV3IEhMaXRlcmFsTGlzdChpbnB1dHMsIF9hYnN0cmFjdFZhbHVlRG9tYWluLmdyb3dhYmxlTGlzdFR5cGUpOwogIH0KCiAgSEluc3RydWN0aW9uIF9jYWxsU2V0UnVudGltZVR5cGVJbmZvV2l0aFR5cGVBcmd1bWVudHMoCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IHJ0aUlucHV0cywKICAgICAgSEluc3RydWN0aW9uIG5ld09iamVjdCwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIGlmICghX3J0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHModHlwZS5lbGVtZW50KSkgewogICAgICByZXR1cm4gbmV3T2JqZWN0OwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiB0eXBlSW5mbyA9IG5ldyBIVHlwZUluZm9FeHByZXNzaW9uKAogICAgICAgIFR5cGVJbmZvRXhwcmVzc2lvbktpbmQuSU5TVEFOQ0UsCiAgICAgICAgY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKHR5cGUuZWxlbWVudCksCiAgICAgICAgcnRpSW5wdXRzLAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlKTsKICAgIGFkZCh0eXBlSW5mbyk7CiAgICByZXR1cm4gX2NhbGxTZXRSdW50aW1lVHlwZUluZm8odHlwZUluZm8sIG5ld09iamVjdCwgc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgLy8vIENhbGxlZCB3aGVuIGNvbnRyb2wgZmxvdyBpcyBhYm91dCB0byBjaGFuZ2UsIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0bwogIC8vLyBzcGVjaWZ5IHNwZWNpYWwgc3VjY2Vzc29ycyBpZiB3ZSBhcmUgYWxyZWFkeSBpbiBhIHRyeS9jYXRjaC9maW5hbGx5IGJsb2NrLgogIHZvaWQgX2hhbmRsZUluVHJ5U3RhdGVtZW50KCkgewogICAgaWYgKCFfaW5UcnlTdGF0ZW1lbnQpIHJldHVybjsKICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gY2xvc2UobmV3IEhFeGl0VHJ5KF9hYnN0cmFjdFZhbHVlRG9tYWluKSk7CiAgICBIQmFzaWNCbG9jayBuZXdCbG9jayA9IGdyYXBoLmFkZE5ld0Jsb2NrKCk7CiAgICBibG9jay5hZGRTdWNjZXNzb3IobmV3QmxvY2spOwogICAgb3BlbihuZXdCbG9jayk7CiAgfQoKICAvLy8gSGVscGVyIHRvIGltcGxlbWVudCBKU19HRVRfRkxBRy4KICAvLy8KICAvLy8gVGhlIGNvbmNyZXRlIFNTQSBncmFwaCBidWlsZGVyIHdpbGwgZXh0cmFjdCBhIGZsYWcgcGFyYW1ldGVyIGZyb20gdGhlCiAgLy8vIEpTX0dFVF9GTEFHIGNhbGwgYW5kIHRoZW4gcHVzaCBhIGJvb2xlYW4gcmVzdWx0IG9udG8gdGhlIHN0YWNrLiBUaGlzCiAgLy8vIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSBib29sZWFuIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFtmbGFnTmFtZV0uCiAgLy8vIElmIFtmbGFnTmFtZV0gaXMgbm90IHJlY29nbml6ZWQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBgbnVsbGAgYW5kIHRoZQogIC8vLyBjb25jcmV0ZSBTU0EgYnVpbGRlciByZXBvcnRzIGFuIGVycm9yLgogIGJvb2wgX2dldEZsYWdWYWx1ZShTdHJpbmcgZmxhZ05hbWUpIHsKICAgIHN3aXRjaCAoZmxhZ05hbWUpIHsKICAgICAgY2FzZSAnTUlOSUZJRUQnOgogICAgICAgIHJldHVybiBvcHRpb25zLmVuYWJsZU1pbmlmaWNhdGlvbjsKICAgICAgY2FzZSAnTVVTVF9SRVRBSU5fTUVUQURBVEEnOgogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgY2FzZSAnVVNFX0NPTlRFTlRfU0VDVVJJVFlfUE9MSUNZJzoKICAgICAgICByZXR1cm4gb3B0aW9ucy51c2VDb250ZW50U2VjdXJpdHlQb2xpY3k7CiAgICAgIGNhc2UgJ1VTRV9ORVdfUlRJJzoKICAgICAgICByZXR1cm4gb3B0aW9ucy5leHBlcmltZW50TmV3UnRpOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgU3RhdGljVHlwZSBfZ2V0U3RhdGljVHlwZShpci5FeHByZXNzaW9uIG5vZGUpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFN1YnN0aXR1dGUgdGhlIHR5cGUgYnkgdGhlIHRoaXMgdHlwZSBhbmQgdHlwZQogICAgLy8gYXJndW1lbnRzIG9mIHRoZSBjdXJyZW50IGZyYW1lLgogICAgaXIuRGFydFR5cGUgdHlwZSA9IF9jdXJyZW50RnJhbWUuc3RhdGljVHlwZVByb3ZpZGVyLmdldFN0YXRpY1R5cGUobm9kZSk7CiAgICByZXR1cm4gbmV3IFN0YXRpY1R5cGUoCiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUodHlwZSksIGNvbXB1dGVDbGFzc1JlbGF0aW9uRnJvbVR5cGUodHlwZSkpOwogIH0KCiAgU3RhdGljVHlwZSBfZ2V0U3RhdGljRm9ySW5JdGVyYXRvclR5cGUoaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3Vic3RpdHV0ZSB0aGUgdHlwZSBieSB0aGUgdGhpcyB0eXBlIGFuZCB0eXBlCiAgICAvLyBhcmd1bWVudHMgb2YgdGhlIGN1cnJlbnQgZnJhbWUuCiAgICBpci5EYXJ0VHlwZSB0eXBlID0KICAgICAgICBfY3VycmVudEZyYW1lLnN0YXRpY1R5cGVQcm92aWRlci5nZXRGb3JJbkl0ZXJhdG9yVHlwZShub2RlKTsKICAgIHJldHVybiBuZXcgU3RhdGljVHlwZSgKICAgICAgICBfZWxlbWVudE1hcC5nZXREYXJ0VHlwZSh0eXBlKSwgY29tcHV0ZUNsYXNzUmVsYXRpb25Gcm9tVHlwZSh0eXBlKSk7CiAgfQoKICBzdGF0aWMgTWVtYmVyRW50aXR5IF9lZmZlY3RpdmVUYXJnZXRFbGVtZW50Rm9yKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgSkdlbmVyYXRvckJvZHkpIHJldHVybiBtZW1iZXIuZnVuY3Rpb247CiAgICByZXR1cm4gbWVtYmVyOwogIH0KCiAgdm9pZCBfZW50ZXJGcmFtZSgKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwgU291cmNlSW5mb3JtYXRpb24gY2FsbFNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBBc3luY01hcmtlciBhc3luY01hcmtlciA9IEFzeW5jTWFya2VyLlNZTkM7CiAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb24gPSBnZXRGdW5jdGlvbk5vZGUoX2VsZW1lbnRNYXAsIG1lbWJlcik7CiAgICBpZiAoZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICBhc3luY01hcmtlciA9IGdldEFzeW5jTWFya2VyKGZ1bmN0aW9uKTsKICAgIH0KICAgIF9jdXJyZW50RnJhbWUgPSBuZXcgU3RhY2tGcmFtZSgKICAgICAgICBfY3VycmVudEZyYW1lLAogICAgICAgIG1lbWJlciwKICAgICAgICBhc3luY01hcmtlciwKICAgICAgICBjbG9zZWRXb3JsZC5nbG9iYWxMb2NhbHNNYXAuZ2V0TG9jYWxzTWFwKG1lbWJlciksCiAgICAgICAge30sCiAgICAgICAgbmV3IEtlcm5lbFRvVHlwZUluZmVyZW5jZU1hcEltcGwobWVtYmVyLCBnbG9iYWxJbmZlcmVuY2VSZXN1bHRzKSwKICAgICAgICBfY3VycmVudEZyYW1lICE9IG51bGwKICAgICAgICAgICAgPyBfY3VycmVudEZyYW1lLnNvdXJjZUluZm9ybWF0aW9uQnVpbGRlcgogICAgICAgICAgICAgICAgLmZvckNvbnRleHQobWVtYmVyLCBjYWxsU291cmNlSW5mb3JtYXRpb24pCiAgICAgICAgICAgIDogX3NvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kuY3JlYXRlQnVpbGRlckZvckNvbnRleHQobWVtYmVyKSwKICAgICAgICBfZWxlbWVudE1hcC5nZXRTdGF0aWNUeXBlUHJvdmlkZXIobWVtYmVyKSk7CiAgfQoKICB2b2lkIF9sZWF2ZUZyYW1lKCkgewogICAgX2N1cnJlbnRGcmFtZSA9IF9jdXJyZW50RnJhbWUucGFyZW50OwogIH0KCiAgSEdyYXBoIGJ1aWxkKCkgewogICAgcmV0dXJuIHJlcG9ydGVyLndpdGhDdXJyZW50RWxlbWVudChfbG9jYWxzTWFwLmN1cnJlbnRNZW1iZXIsICgpIHsKICAgICAgLy8gVE9ETyhoZXQpOiBubyByZWFzb24gdG8gZG8gdGhpcyBoZXJlLi4uCiAgICAgIEhJbnN0cnVjdGlvbi5pZENvdW50ZXIgPSAwOwogICAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPQogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihfaW5pdGlhbFRhcmdldEVsZW1lbnQpOwoKICAgICAgc3dpdGNoIChkZWZpbml0aW9uLmtpbmQpIHsKICAgICAgICBjYXNlIE1lbWJlcktpbmQucmVndWxhcjoKICAgICAgICBjYXNlIE1lbWJlcktpbmQuY2xvc3VyZUNhbGw6CiAgICAgICAgICBpci5Ob2RlIHRhcmdldCA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICAgIGlmICh0YXJnZXQgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgICAgICAgIGlmICh0YXJnZXQuaXNFeHRlcm5hbCkgewogICAgICAgICAgICAgIF9idWlsZEV4dGVybmFsRnVuY3Rpb25Ob2RlKAogICAgICAgICAgICAgICAgICB0YXJnZXRFbGVtZW50LCBfZW5zdXJlRGVmYXVsdEFyZ3VtZW50VmFsdWVzKHRhcmdldC5mdW5jdGlvbikpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIF9idWlsZEZ1bmN0aW9uTm9kZSgKICAgICAgICAgICAgICAgICAgdGFyZ2V0RWxlbWVudCwgX2Vuc3VyZURlZmF1bHRBcmd1bWVudFZhbHVlcyh0YXJnZXQuZnVuY3Rpb24pKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaXMgaXIuRmllbGQpIHsKICAgICAgICAgICAgRmllbGRBbmFseXNpc0RhdGEgZmllbGREYXRhID0KICAgICAgICAgICAgICAgIGNsb3NlZFdvcmxkLmZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKHRhcmdldEVsZW1lbnQpOwoKICAgICAgICAgICAgaWYgKGZpZWxkRGF0YS5pbml0aWFsVmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQ29uc3RhbnRVc2UoCiAgICAgICAgICAgICAgICAgIG5ldyBDb25zdGFudFVzZS5pbml0KGZpZWxkRGF0YS5pbml0aWFsVmFsdWUpKTsKICAgICAgICAgICAgICBpZiAodGFyZ2V0RWxlbWVudC5pc1N0YXRpYyB8fCB0YXJnZXRFbGVtZW50LmlzVG9wTGV2ZWwpIHsKICAgICAgICAgICAgICAgIC8vLyBObyBjb2RlIGlzIGNyZWF0ZWQgZm9yIHRoaXMgZmllbGQ6IEFsbCByZWZlcmVuY2VzIGlubGluZSB0aGUKICAgICAgICAgICAgICAgIC8vLyBjb25zdGFudCB2YWx1ZS4KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZERhdGEuaXNMYXp5KSB7CiAgICAgICAgICAgICAgLy8gVGhlIGdlbmVyYXRlZCBpbml0aWFsaXplciBuZWVkcyBiZSB3cmFwcGVkIGluIHRoZSBjeWNsaWMtZXJyb3IKICAgICAgICAgICAgICAvLyBoZWxwZXIuCiAgICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoCiAgICAgICAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmN5Y2xpY1Rocm93SGVscGVyLAogICAgICAgICAgICAgICAgICBDYWxsU3RydWN0dXJlLk9ORV9BUkcpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0RWxlbWVudC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgICAgICAgaWYgKGZpZWxkRGF0YS5pc0VmZmVjdGl2ZWx5RmluYWwgfHwKICAgICAgICAgICAgICAgICAgIWNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YQogICAgICAgICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlckNoZWNrUG9saWN5KHRhcmdldEVsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgICAuaXNFbWl0dGVkKSB7CiAgICAgICAgICAgICAgICAvLyBObyBuZWVkIGZvciBhIGNoZWNrZWQgc2V0dGVyLgogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIF9idWlsZEZpZWxkKHRhcmdldCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpcyBpci5Mb2NhbEZ1bmN0aW9uKSB7CiAgICAgICAgICAgIF9idWlsZEZ1bmN0aW9uTm9kZSgKICAgICAgICAgICAgICAgIHRhcmdldEVsZW1lbnQsIF9lbnN1cmVEZWZhdWx0QXJndW1lbnRWYWx1ZXModGFyZ2V0LmZ1bmN0aW9uKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAnTm8gY2FzZSBpbXBsZW1lbnRlZCB0byBoYW5kbGUgdGFyZ2V0OiAnCiAgICAgICAgICAgICAgICAnJHRhcmdldCBmb3IgJHRhcmdldEVsZW1lbnQnOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yOgogICAgICAgICAgaXIuQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgICAgICBfZW5zdXJlRGVmYXVsdEFyZ3VtZW50VmFsdWVzKGNvbnN0cnVjdG9yLmZ1bmN0aW9uKTsKICAgICAgICAgIF9idWlsZENvbnN0cnVjdG9yKHRhcmdldEVsZW1lbnQsIGNvbnN0cnVjdG9yKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvckJvZHk6CiAgICAgICAgICBpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICAgIF9lbnN1cmVEZWZhdWx0QXJndW1lbnRWYWx1ZXMoY29uc3RydWN0b3IuZnVuY3Rpb24pOwogICAgICAgICAgX2J1aWxkQ29uc3RydWN0b3JCb2R5KGNvbnN0cnVjdG9yKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTWVtYmVyS2luZC5jbG9zdXJlRmllbGQ6CiAgICAgICAgICAvLyBDbG9zdXJlIGZpZWxkcyBoYXZlIG5vIHNldHRlciBhbmQgdGhlcmVmb3JlIG5ldmVyIHJlcXVpcmUgYW55IGNvZGUuCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBjYXNlIE1lbWJlcktpbmQuc2lnbmF0dXJlOgogICAgICAgICAgaXIuTm9kZSB0YXJnZXQgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgICAgICBpci5GdW5jdGlvbk5vZGUgb3JpZ2luYWxDbG9zdXJlTm9kZTsKICAgICAgICAgIGlmICh0YXJnZXQgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgICAgICAgIG9yaWdpbmFsQ2xvc3VyZU5vZGUgPSB0YXJnZXQuZnVuY3Rpb247CiAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpcyBpci5Mb2NhbEZ1bmN0aW9uKSB7CiAgICAgICAgICAgIG9yaWdpbmFsQ2xvc3VyZU5vZGUgPSB0YXJnZXQuZnVuY3Rpb247CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgICAgIHRhcmdldEVsZW1lbnQsCiAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBmdW5jdGlvbiBzaWduYXR1cmU6ICIKICAgICAgICAgICAgICAgICIkdGFyZ2V0RWxlbWVudCBpbnNpZGUgYSBub24tY2xvc3VyZTogJHRhcmdldCIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wdGlvbnMuZXhwZXJpbWVudE5ld1J0aSkgewogICAgICAgICAgICBfYnVpbGRNZXRob2RTaWduYXR1cmVOZXdSdGkob3JpZ2luYWxDbG9zdXJlTm9kZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfYnVpbGRNZXRob2RTaWduYXR1cmUob3JpZ2luYWxDbG9zdXJlTm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1lbWJlcktpbmQuZ2VuZXJhdG9yQm9keToKICAgICAgICAgIF9idWlsZEdlbmVyYXRvckJvZHkoCiAgICAgICAgICAgICAgX2luaXRpYWxUYXJnZXRFbGVtZW50LCBfZnVuY3Rpb25Ob2RlT2YoZGVmaW5pdGlvbi5ub2RlKSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBhc3NlcnQoZ3JhcGguaXNWYWxpZCgpLCAiSW52YWxpZCBncmFwaCBmb3IgJF9pbml0aWFsVGFyZ2V0RWxlbWVudC4iKTsKCiAgICAgIGlmIChfdHJhY2VyLmlzRW5hYmxlZCkgewogICAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPSBfaW5pdGlhbFRhcmdldEVsZW1lbnQ7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBtZW1iZXIubmFtZTsKICAgICAgICBpZiAobWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIgfHwKICAgICAgICAgICAgbWVtYmVyLmlzQ29uc3RydWN0b3IgfHwKICAgICAgICAgICAgbWVtYmVyLmlzU3RhdGljKSB7CiAgICAgICAgICBuYW1lID0gIiR7bWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiRuYW1lIjsKICAgICAgICAgIGlmIChkZWZpbml0aW9uLmtpbmQgPT0gTWVtYmVyS2luZC5jb25zdHJ1Y3RvckJvZHkpIHsKICAgICAgICAgICAgbmFtZSArPSAiIChib2R5KSI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF90cmFjZXIudHJhY2VDb21waWxhdGlvbihuYW1lKTsKICAgICAgICBfdHJhY2VyLnRyYWNlR3JhcGgoJ2J1aWxkZXInLCBncmFwaCk7CiAgICAgIH0KCiAgICAgIHJldHVybiBncmFwaDsKICAgIH0pOwogIH0KCiAgaXIuRnVuY3Rpb25Ob2RlIF9mdW5jdGlvbk5vZGVPZihpci5UcmVlTm9kZSBub2RlKSB7CiAgICBpZiAobm9kZSBpcyBpci5NZW1iZXIpIHJldHVybiBub2RlLmZ1bmN0aW9uOwogICAgaWYgKG5vZGUgaXMgaXIuTG9jYWxGdW5jdGlvbikgcmV0dXJuIG5vZGUuZnVuY3Rpb247CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGlyLkZ1bmN0aW9uTm9kZSBfZW5zdXJlRGVmYXVsdEFyZ3VtZW50VmFsdWVzKGlyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbikgewogICAgLy8gUmVnaXN0ZXIgYWxsIFtmdW5jdGlvbl0ncyBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlcy4KICAgIC8vCiAgICAvLyBEZWZhdWx0IHZhbHVlcyBtaWdodCBiZSAob3IgY29udGFpbikgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCByZWZlcmVuY2VkCiAgICAvLyBmcm9tIGFueXdoZXJlIGVsc2Ugc28gd2UgbmVlZCB0byBlbnN1cmUgdGhlc2UgYXJlIGVucXVldWVkLiAgU3R1YnMgYW5kCiAgICAvLyBgRnVuY3Rpb24uYXBwbHlgIGRhdGEgYXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIGNvZGVnZW4gcXVldWUgaXMgY2xvc2VkLCBzbwogICAgLy8gd2UgZm9yY2UgdGhlc2UgZnVuY3Rpb25zIGludG8gdGhlIHF1ZXVlIGJ5IHJlZ2lzdGVyaW5nIHRoZSBjb25zdGFudHMgYXMKICAgIC8vIHVzZWQgaW4gYWR2YW5jZS4gU2VlIGxhbmd1YWdlL2N5Y2xpY19kZWZhdWx0X3ZhbHVlc190ZXN0LmRhcnQgZm9yIGFuCiAgICAvLyBleGFtcGxlLgogICAgLy8KICAgIC8vIFRPRE8oc3JhKTogV2UgY291bGQgYmUgbW9yZSBwcmVjaXNlIGlmIHN0dWJzIGFuZCBgRnVuY3Rpb24uYXBwbHlgIGRhdGEKICAgIC8vIHdlcmUgZ2VuZXJhdGVkIGJ5IHRoZSBjb2RlZ2VuIGVucXVldWVyLiBJbiBwcmFjdGljZSBldmVuIGluIGh1Z2UgcHJvZ3JhbXMKICAgIC8vIHRoZXJlIGFyZSBvbmx5IHZlcnkgc21hbGwgbnVtYmVyIG9mIGNvbnN0YW50cyBjcmVhdGVkIGhlcmUgdGhhdCBhcmUgbm90CiAgICAvLyBhY3R1YWxseSB1c2VkLgogICAgdm9pZCBfcmVnaXN0ZXJEZWZhdWx0VmFsdWUoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnRWYWx1ZSA9CiAgICAgICAgICBfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKG5vZGUuaW5pdGlhbGl6ZXIsIGltcGxpY2l0TnVsbDogdHJ1ZSk7CiAgICAgIGFzc2VydCgKICAgICAgICAgIGNvbnN0YW50VmFsdWUgIT0gbnVsbCwKICAgICAgICAgIGZhaWxlZEF0KF9lbGVtZW50TWFwLmdldE1ldGhvZChmdW5jdGlvbi5wYXJlbnQpLAogICAgICAgICAgICAgICdObyBjb25zdGFudCBjb21wdXRlZCBmb3IgJG5vZGUnKSk7CiAgICAgIHJlZ2lzdHJ5Py5yZWdpc3RlckNvbnN0YW50VXNlKG5ldyBDb25zdGFudFVzZS5pbml0KGNvbnN0YW50VmFsdWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycwogICAgICAgIC5za2lwKGZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpCiAgICAgICAgLmZvckVhY2goX3JlZ2lzdGVyRGVmYXVsdFZhbHVlKTsKICAgIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5mb3JFYWNoKF9yZWdpc3RlckRlZmF1bHRWYWx1ZSk7CiAgICByZXR1cm4gZnVuY3Rpb247CiAgfQoKICB2b2lkIF9idWlsZEZpZWxkKGlyLkZpZWxkIG5vZGUpIHsKICAgIF9pbkxhenlJbml0aWFsaXplckV4cHJlc3Npb24gPSBub2RlLmlzU3RhdGljOwogICAgRmllbGRFbnRpdHkgZmllbGQgPSBfZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZSk7CiAgICBfb3BlbkZ1bmN0aW9uKGZpZWxkLCBjaGVja3M6IFRhcmdldENoZWNrcy5ub25lKTsKICAgIGlmIChub2RlLmlzSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICBjbG9zZWRXb3JsZC5hbm5vdGF0aW9uc0RhdGEuZ2V0UGFyYW1ldGVyQ2hlY2tQb2xpY3koZmllbGQpLmlzRW1pdHRlZCkgewogICAgICBISW5zdHJ1Y3Rpb24gdGhpc0luc3RydWN0aW9uID0gbG9jYWxzSGFuZGxlci5yZWFkVGhpcygKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkR2V0KG5vZGUpKTsKICAgICAgLy8gVXNlIGR5bmFtaWMgdHlwZSBiZWNhdXNlIHRoZSB0eXBlIGNvbXB1dGVkIGJ5IHRoZSBpbmZlcnJlciBpcwogICAgICAvLyBuYXJyb3dlZCB0byB0aGUgdHlwZSBhbm5vdGF0aW9uLgogICAgICBISW5zdHJ1Y3Rpb24gcGFyYW1ldGVyID0KICAgICAgICAgIG5ldyBIUGFyYW1ldGVyVmFsdWUoZmllbGQsIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlKTsKICAgICAgLy8gQWRkIHRoZSBwYXJhbWV0ZXIgYXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gb2YgdGhlIGVudHJ5IGJsb2NrLgogICAgICAvLyBJZiB0aGUgbWV0aG9kIGlzIGludGVyY2VwdGVkLCB3ZSB3YW50IHRoZSBhY3R1YWwgcmVjZWl2ZXIKICAgICAgLy8gdG8gYmUgdGhlIGZpcnN0IHBhcmFtZXRlci4KICAgICAgZ3JhcGguZW50cnkuYWRkQmVmb3JlKGdyYXBoLmVudHJ5Lmxhc3QsIHBhcmFtZXRlcik7CiAgICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IF90eXBlQnVpbGRlci5wb3RlbnRpYWxseUNoZWNrT3JUcnVzdFR5cGVPZlBhcmFtZXRlcigKICAgICAgICAgIGZpZWxkLCBwYXJhbWV0ZXIsIF9nZXREYXJ0VHlwZUlmVmFsaWQobm9kZS50eXBlKSk7CiAgICAgIGlmICghX2ZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKGZpZWxkKS5pc0VsaWRlZCkgewogICAgICAgIGFkZChuZXcgSEZpZWxkU2V0KF9hYnN0cmFjdFZhbHVlRG9tYWluLCBmaWVsZCwgdGhpc0luc3RydWN0aW9uLCB2YWx1ZSkpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAobm9kZS5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgbm9kZS5pbml0aWFsaXplci5hY2NlcHQodGhpcyk7CiAgICAgICAgSEluc3RydWN0aW9uIGZpZWxkVmFsdWUgPSBwb3AoKTsKICAgICAgICBISW5zdHJ1Y3Rpb24gY2hlY2tJbnN0cnVjdGlvbiA9CiAgICAgICAgICAgIF90eXBlQnVpbGRlci5wb3RlbnRpYWxseUNoZWNrT3JUcnVzdFR5cGVPZkFzc2lnbm1lbnQoCiAgICAgICAgICAgICAgICBmaWVsZCwgZmllbGRWYWx1ZSwgX2dldERhcnRUeXBlSWZWYWxpZChub2RlLnR5cGUpKTsKICAgICAgICBzdGFjay5hZGQoY2hlY2tJbnN0cnVjdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogICAgICB9CiAgICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IHBvcCgpOwogICAgICBfY2xvc2VBbmRHb3RvRXhpdChuZXcgSFJldHVybihfYWJzdHJhY3RWYWx1ZURvbWFpbiwgdmFsdWUsCiAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkUmV0dXJuKG5vZGUpKSk7CiAgICB9CiAgICBfY2xvc2VGdW5jdGlvbigpOwogIH0KCiAgRGFydFR5cGUgX2dldERhcnRUeXBlSWZWYWxpZChpci5EYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSBpcyBpci5JbnZhbGlkVHlwZSkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUodHlwZSk7CiAgfQoKICAvLy8gUG9wcyB0aGUgbW9zdCByZWNlbnQgaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgc3RhY2sgYW5kIGVuc3VyZXMgdGhhdCBpdCBpcyBhCiAgLy8vIG5vbi1udWxsIGJvb2wuCiAgSEluc3RydWN0aW9uIHBvcEJvb2xpZmllZCgpIHsKICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IHBvcCgpOwogICAgcmV0dXJuIF90eXBlQnVpbGRlci5wb3RlbnRpYWxseUNoZWNrT3JUcnVzdFR5cGVPZkNvbmRpdGlvbigKICAgICAgICBfY3VycmVudEZyYW1lLm1lbWJlciwgdmFsdWUpOwogIH0KCiAgLy8vIEV4dGVuZCBjdXJyZW50IG1ldGhvZCBwYXJhbWV0ZXJzIHdpdGggcGFyYW1ldGVycyBmb3IgdGhlIGNsYXNzIHR5cGUKICAvLy8gcGFyYW1ldGVycy4gIElmIHRoZSBjbGFzcyBoYXMgdHlwZSBwYXJhbWV0ZXJzIGJ1dCBkb2VzIG5vdCBuZWVkIHRoZW0sIGJpbmQKICAvLy8gdG8gYGR5bmFtaWNgIChyZXByZXNlbnRlZCBhcyBgbnVsbGApIHNvIHRoZSBiaW5kaW5ncyBhcmUgYXZhaWxhYmxlIGZvcgogIC8vLyBidWlsZGluZyB0eXBlcyB1cCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4gb2YgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvcnMuCiAgdm9pZCBfYWRkQ2xhc3NUeXBlVmFyaWFibGVzSWZOZWVkZWQoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgaWYgKCFtZW1iZXIuaXNDb25zdHJ1Y3RvciAmJiBtZW1iZXIgaXMhIENvbnN0cnVjdG9yQm9keUVudGl0eSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBDbGFzc0VudGl0eSBjbHMgPSBtZW1iZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShjbHMpOwogICAgaWYgKHRoaXNUeXBlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBib29sIG5lZWRzVHlwZUFyZ3VtZW50cyA9IF9ydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGNscyk7CiAgICB0aGlzVHlwZS50eXBlQXJndW1lbnRzLmZvckVhY2goKERhcnRUeXBlIF90eXBlVmFyaWFibGUpIHsKICAgICAgVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGVUeXBlID0gX3R5cGVWYXJpYWJsZTsKICAgICAgSEluc3RydWN0aW9uIHBhcmFtOwogICAgICBpZiAobmVlZHNUeXBlQXJndW1lbnRzKSB7CiAgICAgICAgcGFyYW0gPSBhZGRQYXJhbWV0ZXIoCiAgICAgICAgICAgIHR5cGVWYXJpYWJsZVR5cGUuZWxlbWVudCwgX2Fic3RyYWN0VmFsdWVEb21haW4ubm9uTnVsbFR5cGUpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFVudXNlZCwgc28gYmluZCB0byBgZHluYW1pY2AuCiAgICAgICAgcGFyYW0gPSBncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpOwogICAgICB9CiAgICAgIExvY2FsIGxvY2FsID0gbG9jYWxzSGFuZGxlci5nZXRUeXBlVmFyaWFibGVBc0xvY2FsKHR5cGVWYXJpYWJsZVR5cGUpOwogICAgICBsb2NhbHNIYW5kbGVyLmRpcmVjdExvY2Fsc1tsb2NhbF0gPSBwYXJhbTsKICAgIH0pOwogIH0KCiAgLy8vIEV4dGVuZCBjdXJyZW50IG1ldGhvZCBwYXJhbWV0ZXJzIHdpdGggcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uIHR5cGUKICAvLy8gdmFyaWFibGVzLgogIC8vLwogIC8vLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBEbyB3ZSBuZWVkIHRoaXM/CiAgLy8vIElmIHRoZSBtZXRob2QgaGFzIHR5cGUgdmFyaWFibGVzIGJ1dCBkb2VzIG5vdCBuZWVkIHRoZW0sIGJpbmQgdG8gYGR5bmFtaWNgCiAgLy8vIChyZXByZXNlbnRlZCBhcyBgbnVsbGApLgogIHZvaWQgX2FkZEZ1bmN0aW9uVHlwZVZhcmlhYmxlc0lmTmVlZGVkKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMhIEZ1bmN0aW9uRW50aXR5KSByZXR1cm47CgogICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24gPSBtZW1iZXI7CiAgICBMaXN0PFR5cGVWYXJpYWJsZVR5cGU+IHR5cGVWYXJpYWJsZXMgPQogICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKGZ1bmN0aW9uKTsKICAgIGlmICh0eXBlVmFyaWFibGVzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgYm9vbCBuZWVkc1R5cGVBcmd1bWVudHMgPSBfcnRpTmVlZC5tZXRob2ROZWVkc1R5cGVBcmd1bWVudHMoZnVuY3Rpb24pOwogICAgYm9vbCBlbGlkZVR5cGVQYXJhbWV0ZXJzID0gZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlLnR5cGVQYXJhbWV0ZXJzID09IDA7CiAgICBmb3IgKFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlCiAgICAgICAgaW4gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGVWYXJpYWJsZXMoZnVuY3Rpb24pKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBwYXJhbTsKICAgICAgaWYgKGVsaWRlVHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICAvLyBBZGQgZWxpZGVkIHR5cGUgcGFyYW1ldGVycy4KICAgICAgICBwYXJhbSA9IF9jb21wdXRlVHlwZUFyZ3VtZW50RGVmYXVsdFZhbHVlKGZ1bmN0aW9uLCB0eXBlVmFyaWFibGUpOwogICAgICB9IGVsc2UgaWYgKG5lZWRzVHlwZUFyZ3VtZW50cykgewogICAgICAgIHBhcmFtID0gYWRkUGFyYW1ldGVyKAogICAgICAgICAgICB0eXBlVmFyaWFibGUuZWxlbWVudCwgX2Fic3RyYWN0VmFsdWVEb21haW4ubm9uTnVsbFR5cGUpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFVudXNlZCwgc28gYmluZCB0byBgZHluYW1pY2AuCiAgICAgICAgcGFyYW0gPSBncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpOwogICAgICB9CiAgICAgIExvY2FsIGxvY2FsID0gbG9jYWxzSGFuZGxlci5nZXRUeXBlVmFyaWFibGVBc0xvY2FsKHR5cGVWYXJpYWJsZSk7CiAgICAgIGxvY2Fsc0hhbmRsZXIuZGlyZWN0TG9jYWxzW2xvY2FsXSA9IHBhcmFtOwogICAgICBfZnVuY3Rpb25UeXBlUGFyYW1ldGVyTG9jYWxzLmFkZChsb2NhbCk7CiAgICB9CiAgfQoKICBMaXN0PExvY2FsPiBfZnVuY3Rpb25UeXBlUGFyYW1ldGVyTG9jYWxzID0gPExvY2FsPltdOwoKICAvLy8gQnVpbGRzIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3Rvci4KICAvLy8KICAvLy8gR2VuZXJhdGl2ZSBjb25zdHJ1Y3RvcnMgYXJlIGJ1aWx0IGluIHN0YWdlcywgaW4gZWZmZWN0IGlubGluaW5nIHRoZQogIC8vLyBpbml0aWFsaXplcnMgYW5kIGNvbnN0cnVjdG9yIGJvZGllcyB1cCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4uCiAgLy8vCiAgLy8vICAxLiBFeHRlbmQgbWV0aG9kIHBhcmFtZXRlcnMgd2l0aCBwYXJhbWV0ZXJzIHRoZSBjbGFzcydzIHR5cGUgcGFyYW1ldGVycy4KICAvLy8KICAvLy8gIDIuIEFkZCB0eXBlIGNoZWNrcyBmb3IgdmFsdWUgcGFyYW1ldGVycyAobWlnaHQgbmVlZCByZXN1bHQgb2YgKDEpKS4KICAvLy8KICAvLy8gIDMuIFdhbGsgaW5oZXJpdGFuY2UgY2hhaW4gdG8gYnVpbGQgYmluZGluZ3MgZm9yIHR5cGUgcGFyYW1ldGVycyBvZgogIC8vLyAgICAgc3VwZXJjbGFzc2VzIGFuZCBtaXhlZC1pbiBjbGFzc2VzLgogIC8vLwogIC8vLyAgNC4gQ29sbGVjdCBpbml0aWFsaXplciB2YWx1ZXMuIFdhbGsgdXAgaW5oZXJpdGFuY2UgY2hhaW4gdG8gY29sbGVjdCBmaWVsZAogIC8vLyAgICAgaW5pdGlhbGl6ZXJzIGZyb20gZmllbGQgZGVjbGFyYXRpb25zLCBpbml0aWFsaXppbmcgcGFyYW1ldGVycyBhbmQKICAvLy8gICAgIGluaXRpYWxpemVyLgogIC8vLwogIC8vLyAgNS4gQ3JlYXRlIHJlaWZpZWQgdHlwZSBpbmZvcm1hdGlvbiBmb3IgaW5zdGFuY2UuCiAgLy8vCiAgLy8vICA2LiBBbGxvY2F0ZSBpbnN0YW5jZSBhbmQgYXNzaWduIGluaXRpYWxpemVycyBhbmQgcmVpZmllZCB0eXBlIGluZm9ybWF0aW9uCiAgLy8vICAgICB0byBmaWVsZHMgYnkgY2FsbGluZyBKYXZhU2NyaXB0IGNvbnN0cnVjdG9yLgogIC8vLwogIC8vLyAgNy4gV2FsayBpbmhlcml0YW5jZSBjaGFpbiB0byBjYWxsIG9yIGlubGluZSBjb25zdHJ1Y3RvciBib2RpZXMuCiAgLy8vCiAgLy8vIEFsbCB0aGUgYmluZGluZ3MgYXJlIHB1dCBpbiB0aGUgY29uc3RydWN0b3IncyBsb2NhbHMgaGFuZGxlci4gVGhlCiAgLy8vIGltcGxpY2F0aW9uIGlzIHRoYXQgYSBjbGFzcyBjYW5ub3QgYmUgZXh0ZW5kZWQgb3IgbWl4ZWQtaW4gdHdpY2UuIElmIHdlIGluCiAgLy8vIGZ1dHVyZSBzdXBwb3J0IHJlcGVhdGVkIHVzZXMgb2YgYSBtaXhpbiBjbGFzcywgd2Ugc2hvdWxkIGRvIHNvIGJ5IGNsb25pbmcKICAvLy8gdGhlIG1peGluIGNsYXNzIGluIHRoZSBLZXJuZWwgaW5wdXQuCiAgdm9pZCBfYnVpbGRDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciwgaXIuQ29uc3RydWN0b3Igbm9kZSkgewogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRDcmVhdGUobm9kZSk7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzczsKCiAgICBpZiAoX2lubGluaW5nU3RhY2suaXNFbXB0eSkgewogICAgICBfb3BlbkZ1bmN0aW9uKGNvbnN0cnVjdG9yLAogICAgICAgICAgZnVuY3Rpb25Ob2RlOiBub2RlLmZ1bmN0aW9uLAogICAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlOiBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgICBjaGVja3M6IFRhcmdldENoZWNrcy5ub25lKTsKICAgIH0KCiAgICAvLyBbY29uc3RydWN0b3JEYXRhLmZpZWxkVmFsdWVzXSBhY2N1bXVsYXRlcyB0aGUgZmllbGQgaW5pdGlhbGl6ZXIgdmFsdWVzLAogICAgLy8gd2hpY2ggbWF5IGJlIG92ZXJ3cml0dGVuIGJ5IGluaXRpYWxpemVyLWxpc3QgaW5pdGlhbGl6ZXJzLgogICAgQ29uc3RydWN0b3JEYXRhIGNvbnN0cnVjdG9yRGF0YSA9IENvbnN0cnVjdG9yRGF0YSgpOwogICAgX2J1aWxkSW5pdGlhbGl6ZXJzKG5vZGUsIGNvbnN0cnVjdG9yRGF0YSk7CgogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGNvbnN0cnVjdG9yQXJndW1lbnRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgIC8vIERvaW5nIHRoaXMgaW5zdGVhZCBvZiBmaWVsZFZhbHVlcy5mb3JFYWNoIGJlY2F1c2Ugd2UgaGF2ZW4ndCBkZWZpbmVkIHRoZQogICAgLy8gb3JkZXIgb2YgdGhlIGFyZ3VtZW50cyBoZXJlLiBXZSBjYW4gZGVmaW5lIHRoYXQgd2l0aCBKRWxlbWVudHMuCiAgICBib29sIGlzQ3VzdG9tRWxlbWVudCA9IF9uYXRpdmVEYXRhLmlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKGNscykgJiYKICAgICAgICAhX25hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyhjbHMpOwogICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoY2xzKTsKICAgIExpc3Q8RmllbGRFbnRpdHk+IGZpZWxkcyA9IDxGaWVsZEVudGl0eT5bXTsKICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaEluc3RhbmNlRmllbGQoY2xzLAogICAgICAgIChDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzcywgRmllbGRFbnRpdHkgbWVtYmVyKSB7CiAgICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IGNvbnN0cnVjdG9yRGF0YS5maWVsZFZhbHVlc1ttZW1iZXJdOwogICAgICBGaWVsZEFuYWx5c2lzRGF0YSBmaWVsZERhdGEgPSBfZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEobWVtYmVyKTsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgIGZpZWxkRGF0YS5pc0luaXRpYWxpemVkSW5BbGxvY2F0b3IgfHwKICAgICAgICAgICAgICAgIGlzQ3VzdG9tRWxlbWVudCB8fAogICAgICAgICAgICAgICAgcmVwb3J0ZXIuaGFzUmVwb3J0ZWRFcnJvciwKICAgICAgICAgICAgJ05vIGluaXRpYWxpemVyIHZhbHVlIGZvciBmaWVsZCAke21lbWJlcn0nKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIWZpZWxkRGF0YS5pc0VsaWRlZCkgewogICAgICAgICAgZmllbGRzLmFkZChtZW1iZXIpOwogICAgICAgICAgRGFydFR5cGUgdHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RmllbGRUeXBlKG1lbWJlcik7CiAgICAgICAgICB0eXBlID0gbG9jYWxzSGFuZGxlci5zdWJzdEluQ29udGV4dCh0eXBlKTsKICAgICAgICAgIGNvbnN0cnVjdG9yQXJndW1lbnRzLmFkZChfdHlwZUJ1aWxkZXIKICAgICAgICAgICAgICAucG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZBc3NpZ25tZW50KG1lbWJlciwgdmFsdWUsIHR5cGUpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIF9hZGRJbXBsaWNpdEluc3RhbnRpYXRpb24odGhpc1R5cGUpOwogICAgTGlzdDxEYXJ0VHlwZT4gaW5zdGFudGlhdGVkVHlwZXMgPQogICAgICAgIG5ldyBMaXN0PEludGVyZmFjZVR5cGU+LmZyb20oX2N1cnJlbnRJbXBsaWNpdEluc3RhbnRpYXRpb25zKTsKCiAgICBISW5zdHJ1Y3Rpb24gbmV3T2JqZWN0OwogICAgaWYgKGlzQ3VzdG9tRWxlbWVudCkgewogICAgICAvLyBCdWxrIGFzc2lnbiB0byB0aGUgaW5pdGlhbGl6ZWQgZmllbGRzLgogICAgICBuZXdPYmplY3QgPSBncmFwaC5leHBsaWNpdFJlY2VpdmVyUGFyYW1ldGVyOwogICAgICAvLyBOdWxsIGd1YXJkIGVuc3VyZXMgYW4gZXJyb3IgaWYgd2UgYXJlIGJlaW5nIGNhbGxlZCBmcm9tIGFuIGV4cGxpY2l0CiAgICAgIC8vICduZXcnIG9mIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIHZpYSBhbiB1cGdyYWRlLiBJdCBpcyBvcHRpbWl6ZWQgb3V0CiAgICAgIC8vIGlmIHRoZXJlIGFyZSBmaWVsZCBpbml0aWFsaXplcnMuCiAgICAgIGFkZChuZXcgSEZpZWxkR2V0KAogICAgICAgICAgbnVsbCwgbmV3T2JqZWN0LCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwgc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgICBpc0Fzc2lnbmFibGU6IGZhbHNlKSk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgYWRkKG5ldyBIRmllbGRTZXQoX2Fic3RyYWN0VmFsdWVEb21haW4sIGZpZWxkc1tpXSwgbmV3T2JqZWN0LAogICAgICAgICAgICBjb25zdHJ1Y3RvckFyZ3VtZW50c1tpXSkpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBDcmVhdGUgdGhlIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiwgaWYgbmVlZGVkLgogICAgICBib29sIG5lZWRzVHlwZUFyZ3VtZW50cyA9CiAgICAgICAgICBjbG9zZWRXb3JsZC5ydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGNscyk7CiAgICAgIGlmIChuZWVkc1R5cGVBcmd1bWVudHMpIHsKICAgICAgICBpZiAob3B0aW9ucy5leHBlcmltZW50TmV3UnRpKSB7CiAgICAgICAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShjbHMpOwogICAgICAgICAgSEluc3RydWN0aW9uIHR5cGVBcmd1bWVudCA9CiAgICAgICAgICAgICAgX3R5cGVCdWlsZGVyLmFuYWx5emVUeXBlQXJndW1lbnROZXdSdGkodGhpc1R5cGUsIHNvdXJjZUVsZW1lbnQpOwogICAgICAgICAgY29uc3RydWN0b3JBcmd1bWVudHMuYWRkKHR5cGVBcmd1bWVudCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFJlYWQgdGhlIHZhbHVlcyBvZiB0aGUgdHlwZSBhcmd1bWVudHMgYW5kIGNyZWF0ZSBhCiAgICAgICAgICAvLyBIVHlwZUluZm9FeHByZXNzaW9uIHRvIHNldCBvbiB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QuCiAgICAgICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gdHlwZUFyZ3VtZW50cyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICAgICAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShjbHMpOwogICAgICAgICAgZm9yIChEYXJ0VHlwZSB0eXBlVmFyaWFibGUgaW4gdGhpc1R5cGUudHlwZUFyZ3VtZW50cykgewogICAgICAgICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQgPSBsb2NhbHNIYW5kbGVyCiAgICAgICAgICAgICAgICAucmVhZExvY2FsKGxvY2Fsc0hhbmRsZXIuZ2V0VHlwZVZhcmlhYmxlQXNMb2NhbCh0eXBlVmFyaWFibGUpKTsKICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5hZGQoYXJndW1lbnQpOwogICAgICAgICAgfQoKICAgICAgICAgIEhJbnN0cnVjdGlvbiB0eXBlSW5mbyA9IG5ldyBIVHlwZUluZm9FeHByZXNzaW9uKAogICAgICAgICAgICAgIFR5cGVJbmZvRXhwcmVzc2lvbktpbmQuSU5TVEFOQ0UsCiAgICAgICAgICAgICAgdGhpc1R5cGUsCiAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cywKICAgICAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSk7CiAgICAgICAgICBhZGQodHlwZUluZm8pOwogICAgICAgICAgY29uc3RydWN0b3JBcmd1bWVudHMuYWRkKHR5cGVJbmZvKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbmV3T2JqZWN0ID0gbmV3IEhDcmVhdGUoY2xzLCBjb25zdHJ1Y3RvckFyZ3VtZW50cywKICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxFeGFjdChjbHMpLCBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgIGluc3RhbnRpYXRlZFR5cGVzOiBpbnN0YW50aWF0ZWRUeXBlcywKICAgICAgICAgIGhhc1J0aUlucHV0OiBuZWVkc1R5cGVBcmd1bWVudHMpOwoKICAgICAgYWRkKG5ld09iamVjdCk7CiAgICB9CiAgICBfcmVtb3ZlSW1wbGljaXRJbnN0YW50aWF0aW9uKHRoaXNUeXBlKTsKCiAgICBISW5zdHJ1Y3Rpb24gaW50ZXJjZXB0b3I7CiAgICAvLyBHZW5lcmF0ZSBjYWxscyB0byB0aGUgY29uc3RydWN0b3IgYm9kaWVzLgogICAgZm9yIChpci5Db25zdHJ1Y3RvciBib2R5IGluIGNvbnN0cnVjdG9yRGF0YS5jb25zdHJ1Y3RvckNoYWluLnJldmVyc2VkKSB7CiAgICAgIGlmIChfaXNFbXB0eVN0YXRlbWVudChib2R5LmZ1bmN0aW9uLmJvZHkpKSBjb250aW51ZTsKCiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBib2R5Q2FsbElucHV0cyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICAgIGlmIChpc0N1c3RvbUVsZW1lbnQpIHsKICAgICAgICBpZiAoaW50ZXJjZXB0b3IgPT0gbnVsbCkgewogICAgICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IG5ldyBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUoY2xzKTsKICAgICAgICAgIGludGVyY2VwdG9yID0gZ3JhcGguYWRkQ29uc3RhbnQoY29uc3RhbnQsIGNsb3NlZFdvcmxkKTsKICAgICAgICB9CiAgICAgICAgYm9keUNhbGxJbnB1dHMuYWRkKGludGVyY2VwdG9yKTsKICAgICAgfQogICAgICBib2R5Q2FsbElucHV0cy5hZGQobmV3T2JqZWN0KTsKCiAgICAgIC8vIFBhc3MgdW5jYXB0dXJlZCBhcmd1bWVudHMgZmlyc3QsIGNhcHR1cmVkIGFyZ3VtZW50cyBpbiBhIGJveCwgdGhlbiB0eXBlCiAgICAgIC8vIGFyZ3VtZW50cy4KCiAgICAgIENvbnN0cnVjdG9yRW50aXR5IGlubGluZWRDb25zdHJ1Y3RvciA9IF9lbGVtZW50TWFwLmdldENvbnN0cnVjdG9yKGJvZHkpOwoKICAgICAgX2lubGluZWRGcm9tKAogICAgICAgICAgaW5saW5lZENvbnN0cnVjdG9yLCBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQ2FsbChib2R5LCBib2R5KSwKICAgICAgICAgICgpIHsKICAgICAgICBDb25zdHJ1Y3RvckJvZHlFbnRpdHkgY29uc3RydWN0b3JCb2R5ID0KICAgICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0Q29uc3RydWN0b3JCb2R5KGJvZHkpOwoKICAgICAgICB2b2lkIGhhbmRsZVBhcmFtZXRlcihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUsIHtib29sIGlzRWxpZGVkfSkgewogICAgICAgICAgaWYgKGlzRWxpZGVkKSByZXR1cm47CgogICAgICAgICAgTG9jYWwgcGFyYW1ldGVyID0gX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKG5vZGUpOwogICAgICAgICAgLy8gSWYgW3BhcmFtZXRlcl0gaXMgYm94ZWQsIGl0IHdpbGwgYmUgYSBmaWVsZCBpbiB0aGUgYm94IHBhc3NlZCBhcwogICAgICAgICAgLy8gdGhlIGxhc3QgcGFyYW1ldGVyLiBTbyBubyBuZWVkIHRvIGRpcmVjdGx5IHBhc3MgaXQuCiAgICAgICAgICBpZiAoIWxvY2Fsc0hhbmRsZXIuaXNCb3hlZChwYXJhbWV0ZXIpKSB7CiAgICAgICAgICAgIGJvZHlDYWxsSW5wdXRzLmFkZChsb2NhbHNIYW5kbGVyLnJlYWRMb2NhbChwYXJhbWV0ZXIpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFByb3ZpZGUgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgYm9keS4KICAgICAgICBmb3JFYWNoT3JkZXJlZFBhcmFtZXRlcihfZWxlbWVudE1hcCwgY29uc3RydWN0b3JCb2R5LCBoYW5kbGVQYXJhbWV0ZXIpOwoKICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbG9jYWxzIHRoYXQgZXNjYXBlIChpLmUuIG11dGF0ZWQgaW4gY2xvc3VyZXMpLCB3ZSBwYXNzIHRoZQogICAgICAgIC8vIGJveCB0byB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgQ2FwdHVyZWRTY29wZSBzY29wZURhdGEgPQogICAgICAgICAgICBfY2xvc3VyZURhdGFMb29rdXAuZ2V0Q2FwdHVyZWRTY29wZShjb25zdHJ1Y3RvckJvZHkpOwogICAgICAgIGlmIChzY29wZURhdGEucmVxdWlyZXNDb250ZXh0Qm94KSB7CiAgICAgICAgICBib2R5Q2FsbElucHV0cy5hZGQobG9jYWxzSGFuZGxlci5yZWFkTG9jYWwoc2NvcGVEYXRhLmNvbnRleHQpKTsKICAgICAgICB9CgogICAgICAgIC8vIFBhc3MgdHlwZSBhcmd1bWVudHMuCiAgICAgICAgQ2xhc3NFbnRpdHkgaW5saW5lZENvbnN0cnVjdG9yQ2xhc3MgPSBjb25zdHJ1Y3RvckJvZHkuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgaWYgKGNsb3NlZFdvcmxkLnJ0aU5lZWQKICAgICAgICAgICAgLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGlubGluZWRDb25zdHJ1Y3RvckNsYXNzKSkgewogICAgICAgICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9CiAgICAgICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShpbmxpbmVkQ29uc3RydWN0b3JDbGFzcyk7CiAgICAgICAgICBmb3IgKERhcnRUeXBlIHR5cGVWYXJpYWJsZSBpbiB0aGlzVHlwZS50eXBlQXJndW1lbnRzKSB7CiAgICAgICAgICAgIERhcnRUeXBlIHJlc3VsdCA9IGxvY2Fsc0hhbmRsZXIuc3Vic3RJbkNvbnRleHQodHlwZVZhcmlhYmxlKTsKICAgICAgICAgICAgSEluc3RydWN0aW9uIGFyZ3VtZW50ID0KICAgICAgICAgICAgICAgIF90eXBlQnVpbGRlci5hbmFseXplVHlwZUFyZ3VtZW50KHJlc3VsdCwgc291cmNlRWxlbWVudCk7CiAgICAgICAgICAgIGJvZHlDYWxsSW5wdXRzLmFkZChhcmd1bWVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlzQ3VzdG9tRWxlbWVudCAmJiAvLyBUT0RPKDEzODM2KTogRml4IGlubGluaW5nLgogICAgICAgICAgICBfdHJ5SW5saW5lTWV0aG9kKGNvbnN0cnVjdG9yQm9keSwgbnVsbCwgbnVsbCwgYm9keUNhbGxJbnB1dHMsIG51bGwsCiAgICAgICAgICAgICAgICBub2RlLCBzb3VyY2VJbmZvcm1hdGlvbikpIHsKICAgICAgICAgIHBvcCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfaW52b2tlQ29uc3RydWN0b3JCb2R5KGJvZHksIGJvZHlDYWxsSW5wdXRzLAogICAgICAgICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGREZWNsYXJhdGlvbihjb25zdHJ1Y3RvcikpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgaWYgKF9pbmxpbmluZ1N0YWNrLmlzRW1wdHkpIHsKICAgICAgX2Nsb3NlQW5kR290b0V4aXQoCiAgICAgICAgICBuZXcgSFJldHVybihfYWJzdHJhY3RWYWx1ZURvbWFpbiwgbmV3T2JqZWN0LCBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICBfY2xvc2VGdW5jdGlvbigpOwogICAgfSBlbHNlIHsKICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChfcmV0dXJuTG9jYWwsIG5ld09iamVjdCwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgfQoKICBzdGF0aWMgYm9vbCBfaXNFbXB0eVN0YXRlbWVudChpci5TdGF0ZW1lbnQgYm9keSkgewogICAgaWYgKGJvZHkgaXMgaXIuRW1wdHlTdGF0ZW1lbnQpIHJldHVybiB0cnVlOwogICAgaWYgKGJvZHkgaXMgaXIuQmxvY2spIHJldHVybiBib2R5LnN0YXRlbWVudHMuZXZlcnkoX2lzRW1wdHlTdGF0ZW1lbnQpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBfaW52b2tlQ29uc3RydWN0b3JCb2R5KGlyLkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLAogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgTWVtYmVyRW50aXR5IGNvbnN0cnVjdG9yQm9keSA9IF9lbGVtZW50TWFwLmdldENvbnN0cnVjdG9yQm9keShjb25zdHJ1Y3Rvcik7CiAgICBISW52b2tlQ29uc3RydWN0b3JCb2R5IGludm9rZSA9IG5ldyBISW52b2tlQ29uc3RydWN0b3JCb2R5KGNvbnN0cnVjdG9yQm9keSwKICAgICAgICBpbnB1dHMsIF9hYnN0cmFjdFZhbHVlRG9tYWluLm5vbk51bGxUeXBlLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBhZGQoaW52b2tlKTsKICB9CgogIC8vLyBTZXRzIGNvbnRleHQgZm9yIGdlbmVyYXRpbmcgY29kZSB0aGF0IGlzIHRoZSByZXN1bHQgb2YgaW5saW5pbmcKICAvLy8gW2lubGluZWRUYXJnZXRdLgogIHZvaWQgX2lubGluZWRGcm9tKE1lbWJlckVudGl0eSBpbmxpbmVkVGFyZ2V0LAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBjYWxsU291cmNlSW5mb3JtYXRpb24sIGYoKSkgewogICAgcmVwb3J0ZXIud2l0aEN1cnJlbnRFbGVtZW50KGlubGluZWRUYXJnZXQsICgpIHsKICAgICAgX2VudGVyRnJhbWUoaW5saW5lZFRhcmdldCwgY2FsbFNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgdmFyIHJlc3VsdCA9IGYoKTsKICAgICAgX2xlYXZlRnJhbWUoKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0pOwogIH0KCiAgdm9pZCBfZW5zdXJlVHlwZVZhcmlhYmxlc0ZvckluaXRpYWxpemVycygKICAgICAgQ29uc3RydWN0b3JEYXRhIGNvbnN0cnVjdG9yRGF0YSwgQ2xhc3NFbnRpdHkgZW5jbG9zaW5nQ2xhc3MpIHsKICAgIGlmICghY29uc3RydWN0b3JEYXRhLmluY2x1ZGVkQ2xhc3Nlcy5hZGQoZW5jbG9zaW5nQ2xhc3MpKSByZXR1cm47CiAgICBpZiAoX3J0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoZW5jbG9zaW5nQ2xhc3MpKSB7CiAgICAgIC8vIElmIFtlbmNsb3NpbmdDbGFzc10gbmVlZHMgUlRJLCB3ZSBoYXZlIHRvIGdpdmUgYSB2YWx1ZSB0byBpdHMgdHlwZQogICAgICAvLyBwYXJhbWV0ZXJzLiBGb3IgYSBzdXBlciBjb25zdHJ1Y3RvciBjYWxsLCB0aGUgdHlwZSBpcyB0aGUgc3VwZXJ0eXBlCiAgICAgIC8vIG9mIGN1cnJlbnQgY2xhc3MuIEZvciBhIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yLCB0aGUgdHlwZSBpcyB0aGUKICAgICAgLy8gY3VycmVudCB0eXBlLiBbTG9jYWxzSGFuZGxlci5zdWJzdEluQ29udGV4dF0gdGFrZXMgY2FyZSBvZiBib3RoLgogICAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShlbmNsb3NpbmdDbGFzcyk7CiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IGxvY2Fsc0hhbmRsZXIuc3Vic3RJbkNvbnRleHQodGhpc1R5cGUpOwogICAgICBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMgPSB0eXBlLnR5cGVBcmd1bWVudHM7CiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVWYXJpYWJsZXMgPSB0aGlzVHlwZS50eXBlQXJndW1lbnRzOwogICAgICBhc3NlcnQoYXJndW1lbnRzLmxlbmd0aCA9PSB0eXBlVmFyaWFibGVzLmxlbmd0aCk7CiAgICAgIEl0ZXJhdG9yPERhcnRUeXBlPiB2YXJpYWJsZXMgPSB0eXBlVmFyaWFibGVzLml0ZXJhdG9yOwogICAgICB0eXBlLnR5cGVBcmd1bWVudHMuZm9yRWFjaCgoRGFydFR5cGUgYXJndW1lbnQpIHsKICAgICAgICB2YXJpYWJsZXMubW92ZU5leHQoKTsKICAgICAgICBUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZSA9IHZhcmlhYmxlcy5jdXJyZW50OwogICAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwoCiAgICAgICAgICAgIGxvY2Fsc0hhbmRsZXIuZ2V0VHlwZVZhcmlhYmxlQXNMb2NhbCh0eXBlVmFyaWFibGUpLAogICAgICAgICAgICBfdHlwZUJ1aWxkZXIuYW5hbHl6ZVR5cGVBcmd1bWVudChhcmd1bWVudCwgc291cmNlRWxlbWVudCkpOwogICAgICB9KTsKICAgIH0KICB9CgogIC8vLyBDb2xsZWN0cyB0aGUgdmFsdWVzIGZvciBmaWVsZCBpbml0aWFsaXplcnMgZm9yIHRoZSBkaXJlY3QgZmllbGRzIG9mCiAgLy8vIFtjbGF6el0uCiAgdm9pZCBfY29sbGVjdEZpZWxkVmFsdWVzKGlyLkNsYXNzIGNsYXp6LCBDb25zdHJ1Y3RvckRhdGEgY29uc3RydWN0b3JEYXRhKSB7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBfZWxlbWVudE1hcC5nZXRDbGFzcyhjbGF6eik7CiAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hEaXJlY3RJbnN0YW5jZUZpZWxkKGNscywgKEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICAgIF9lbnN1cmVUeXBlVmFyaWFibGVzRm9ySW5pdGlhbGl6ZXJzKAogICAgICAgICAgY29uc3RydWN0b3JEYXRhLCBmaWVsZC5lbmNsb3NpbmdDbGFzcyk7CgogICAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJEZWZpbml0aW9uKGZpZWxkKTsKICAgICAgaXIuRmllbGQgbm9kZTsKICAgICAgc3dpdGNoIChkZWZpbml0aW9uLmtpbmQpIHsKICAgICAgICBjYXNlIE1lbWJlcktpbmQucmVndWxhcjoKICAgICAgICAgIG5vZGUgPSBkZWZpbml0aW9uLm5vZGU7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgZmFpbGVkQXQoZmllbGQsICJVbmV4cGVjdGVkIG1lbWJlciBkZWZpbml0aW9uICRkZWZpbml0aW9uLiIpOwogICAgICB9CgogICAgICBib29sIGlnbm9yZUFsbG9jYXRvckFuYWx5c2lzID0gZmFsc2U7CiAgICAgIGlmIChfbmF0aXZlRGF0YS5pc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShjbHMpKSB7CiAgICAgICAgLy8gQE5hdGl2ZSBjbGFzc2VzIGhhdmUgJ2ZpZWxkcycgd2hpY2ggYXJlIHJlYWxseSBnZXR0ZXJzL3NldHRlci4gIERvCiAgICAgICAgLy8gbm90IHRyeSB0byBpbml0aWFsaXplIGUuZy4gJ3RhZ05hbWUnLgogICAgICAgIGlmIChfbmF0aXZlRGF0YS5pc05hdGl2ZUNsYXNzKGNscykpIHJldHVybjsKICAgICAgICAvLyBGaWVsZHMgdGhhdCBzdXJ2aXZlIHRoaXMgdGVzdCBhcmUgZmllbGRzIG9mIGN1c3RvbSBlbGVtZW50cy4KICAgICAgICBpZ25vcmVBbGxvY2F0b3JBbmFseXNpcyA9IHRydWU7CiAgICAgIH0KCiAgICAgIGlmIChpZ25vcmVBbGxvY2F0b3JBbmFseXNpcyB8fAogICAgICAgICAgIV9maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShmaWVsZCkuaXNJbml0aWFsaXplZEluQWxsb2NhdG9yKSB7CiAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgPT0gbnVsbCkgewogICAgICAgICAgY29uc3RydWN0b3JEYXRhLmZpZWxkVmFsdWVzW2ZpZWxkXSA9CiAgICAgICAgICAgICAgZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQ29tcGlsZSB0aGUgaW5pdGlhbGl6ZXIgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGZpZWxkIHNvIHdlIGtub3cgdGhhdAogICAgICAgICAgLy8gY2xhc3MgdHlwZSBwYXJhbWV0ZXJzIGFyZSBhY2Nlc3NlZCBhcyB2YWx1ZXMuCiAgICAgICAgICAvLyBUT0RPKHNyYSk6IEl0IHdvdWxkIGJlIHN1ZmZpY2llbnQgdG8ga25vdyB0aGUgY29udGV4dCB3YXMgYSBmaWVsZAogICAgICAgICAgLy8gaW5pdGlhbGl6ZXIuCiAgICAgICAgICBfaW5saW5lZEZyb20oZmllbGQsCiAgICAgICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEFzc2lnbm1lbnQobm9kZS5pbml0aWFsaXplciksICgpIHsKICAgICAgICAgICAgbm9kZS5pbml0aWFsaXplci5hY2NlcHQodGhpcyk7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yRGF0YS5maWVsZFZhbHVlc1tmaWVsZF0gPSBwb3AoKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfQoKICBzdGF0aWMgYm9vbCBfaXNSZWRpcmVjdGluZ0NvbnN0cnVjdG9yKGlyLkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSA9PgogICAgICBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMKICAgICAgICAgIC5hbnkoKGluaXRpYWxpemVyKSA9PiBpbml0aWFsaXplciBpcyBpci5SZWRpcmVjdGluZ0luaXRpYWxpemVyKTsKCiAgLy8vIENvbGxlY3RzIGZpZWxkIGluaXRpYWxpemVycyBhbGwgdGhlIHdheSB1cCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4uCiAgdm9pZCBfYnVpbGRJbml0aWFsaXplcnMoCiAgICAgIGlyLkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLCBDb25zdHJ1Y3RvckRhdGEgY29uc3RydWN0b3JEYXRhKSB7CiAgICBhc3NlcnQoCiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0Q29uc3RydWN0b3IoY29uc3RydWN0b3IpID09IF9sb2NhbHNNYXAuY3VycmVudE1lbWJlciwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgX2xvY2Fsc01hcC5jdXJyZW50TWVtYmVyLAogICAgICAgICAgICAnRXhwZWN0ZWQgJHtfbG9jYWxzTWFwLmN1cnJlbnRNZW1iZXJ9ICcKICAgICAgICAgICAgJ2J1dCBmb3VuZCAke19lbGVtZW50TWFwLmdldENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKX0uJykpOwogICAgY29uc3RydWN0b3JEYXRhLmNvbnN0cnVjdG9yQ2hhaW4uYWRkKGNvbnN0cnVjdG9yKTsKCiAgICBpZiAoIV9pc1JlZGlyZWN0aW5nQ29uc3RydWN0b3IoY29uc3RydWN0b3IpKSB7CiAgICAgIC8vIENvbXB1dGUgdmFsdWVzIGZvciBmaWVsZCBpbml0aWFsaXplcnMsIGJ1dCBvbmx5IGlmIHRoaXMgaXMgbm90IGEKICAgICAgLy8gcmVkaXJlY3RpbmcgY29uc3RydWN0b3IsIHNpbmNlIHRoZSB0YXJnZXQgd2lsbCBjb21wdXRlIHRoZSBmaWVsZHMuCiAgICAgIF9jb2xsZWN0RmllbGRWYWx1ZXMoY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3MsIGNvbnN0cnVjdG9yRGF0YSk7CiAgICB9CiAgICB2YXIgZm91bmRTdXBlck9yUmVkaXJlY3RDYWxsID0gZmFsc2U7CiAgICBmb3IgKHZhciBpbml0aWFsaXplciBpbiBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMpIHsKICAgICAgaWYgKGluaXRpYWxpemVyIGlzIGlyLkZpZWxkSW5pdGlhbGl6ZXIpIHsKICAgICAgICBGaWVsZEVudGl0eSBmaWVsZCA9IF9lbGVtZW50TWFwLmdldEZpZWxkKGluaXRpYWxpemVyLmZpZWxkKTsKICAgICAgICBpZiAoIV9maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShmaWVsZCkuaXNJbml0aWFsaXplZEluQWxsb2NhdG9yKSB7CiAgICAgICAgICBpbml0aWFsaXplci52YWx1ZS5hY2NlcHQodGhpcyk7CiAgICAgICAgICBjb25zdHJ1Y3RvckRhdGEuZmllbGRWYWx1ZXNbZmllbGRdID0gcG9wKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGluaXRpYWxpemVyIGlzIGlyLlN1cGVySW5pdGlhbGl6ZXIpIHsKICAgICAgICBhc3NlcnQoIWZvdW5kU3VwZXJPclJlZGlyZWN0Q2FsbCk7CiAgICAgICAgZm91bmRTdXBlck9yUmVkaXJlY3RDYWxsID0gdHJ1ZTsKICAgICAgICBfaW5saW5lU3VwZXJJbml0aWFsaXplcihpbml0aWFsaXplciwgY29uc3RydWN0b3JEYXRhLCBjb25zdHJ1Y3Rvcik7CiAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXIgaXMgaXIuUmVkaXJlY3RpbmdJbml0aWFsaXplcikgewogICAgICAgIGFzc2VydCghZm91bmRTdXBlck9yUmVkaXJlY3RDYWxsKTsKICAgICAgICBmb3VuZFN1cGVyT3JSZWRpcmVjdENhbGwgPSB0cnVlOwogICAgICAgIF9pbmxpbmVSZWRpcmVjdGluZ0luaXRpYWxpemVyKAogICAgICAgICAgICBpbml0aWFsaXplciwgY29uc3RydWN0b3JEYXRhLCBjb25zdHJ1Y3Rvcik7CiAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXIgaXMgaXIuTG9jYWxJbml0aWFsaXplcikgewogICAgICAgIC8vIExvY2FsSW5pdGlhbGl6ZXIgaXMgbGlrZSBhIGxldC1leHByZXNzaW9uIHRoYXQgaXMgaW4gc2NvcGUgZm9yIHRoZQogICAgICAgIC8vIHJlc3Qgb2YgdGhlIGluaXRpYWxpemVycy4KICAgICAgICBpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gaW5pdGlhbGl6ZXIudmFyaWFibGU7CiAgICAgICAgYXNzZXJ0KHZhcmlhYmxlLmlzRmluYWwpOwogICAgICAgIHZhcmlhYmxlLmluaXRpYWxpemVyLmFjY2VwdCh0aGlzKTsKICAgICAgICBISW5zdHJ1Y3Rpb24gdmFsdWUgPSBwb3AoKTsKICAgICAgICAvLyBUT0RPKHNyYSk6IEFwcGx5IGluZmVycmVkIHR5cGUgaW5mb3JtYXRpb24uCiAgICAgICAgX2xldEJpbmRpbmdzW3ZhcmlhYmxlXSA9IHZhbHVlOwogICAgICB9IGVsc2UgaWYgKGluaXRpYWxpemVyIGlzIGlyLkFzc2VydEluaXRpYWxpemVyKSB7CiAgICAgICAgLy8gQXNzZXJ0IGluIGluaXRpYWxpemVyIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGluIGRhcnQyanMuCiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCBhc3NlcnQgaW4gaW5pdGlhbGl6ZXIuCiAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXIgaXMgaXIuSW52YWxpZEluaXRpYWxpemVyKSB7CiAgICAgICAgYXNzZXJ0KGZhbHNlLCAnaXIuSW52YWxpZEluaXRpYWxpemVyIG5vdCBoYW5kbGVkJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KGZhbHNlLCAnVW5oYW5kbGVkIGluaXRpYWxpemVyIGlyLiR7aW5pdGlhbGl6ZXIucnVudGltZVR5cGV9Jyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIWZvdW5kU3VwZXJPclJlZGlyZWN0Q2FsbCkgewogICAgICBhc3NlcnQoCiAgICAgICAgICBfZWxlbWVudE1hcC5nZXRDbGFzcyhjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzcykgPT0KICAgICAgICAgICAgICAgICAgX2VsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MgfHwKICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMuYW55KF9FcnJvbmVvdXNJbml0aWFsaXplclZpc2l0b3IuY2hlY2spLAogICAgICAgICAgJ0FsbCBjb25zdHJ1Y3RvcnMgc2hvdWxkIGhhdmUgc3VwZXItIG9yIHJlZGlyZWN0aW5nLSBpbml0aWFsaXplcnMsJwogICAgICAgICAgJyBleGNlcHQgT2JqZWN0KCknCiAgICAgICAgICAnICR7Y29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzfScpOwogICAgfQogIH0KCiAgTGlzdDxISW5zdHJ1Y3Rpb24+IF9ub3JtYWxpemVBbmRCdWlsZEFyZ3VtZW50cygKICAgICAgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLCBpci5Bcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICB2YXIgYnVpbHRBcmd1bWVudHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgdmFyIHBvc2l0aW9uYWxJbmRleCA9IDA7CiAgICBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5mb3JFYWNoKChpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgICAgaWYgKHBvc2l0aW9uYWxJbmRleCA8IGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCkgewogICAgICAgIGFyZ3VtZW50cy5wb3NpdGlvbmFsW3Bvc2l0aW9uYWxJbmRleCsrXS5hY2NlcHQodGhpcyk7CiAgICAgICAgYnVpbHRBcmd1bWVudHMuYWRkKHBvcCgpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50VmFsdWUgPQogICAgICAgICAgICBfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKG5vZGUuaW5pdGlhbGl6ZXIsIGltcGxpY2l0TnVsbDogdHJ1ZSk7CiAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICBjb25zdGFudFZhbHVlICE9IG51bGwsCiAgICAgICAgICAgIGZhaWxlZEF0KF9lbGVtZW50TWFwLmdldE1ldGhvZChmdW5jdGlvbi5wYXJlbnQpLAogICAgICAgICAgICAgICAgJ05vIGNvbnN0YW50IGNvbXB1dGVkIGZvciAkbm9kZScpKTsKICAgICAgICBidWlsdEFyZ3VtZW50cy5hZGQoZ3JhcGguYWRkQ29uc3RhbnQoY29uc3RhbnRWYWx1ZSwgY2xvc2VkV29ybGQpKTsKICAgICAgfQogICAgfSk7CiAgICBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMudG9MaXN0KCkKICAgICAgLi5zb3J0KG5hbWVkT3JkZXJpbmcpCiAgICAgIC4uZm9yRWFjaCgoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICAgICAgdmFyIGNvcnJlc3BvbmRpbmdOYW1lZCA9IGFyZ3VtZW50cy5uYW1lZAogICAgICAgICAgICAuZmlyc3RXaGVyZSgobmFtZWQpID0+IG5hbWVkLm5hbWUgPT0gbm9kZS5uYW1lLCBvckVsc2U6ICgpID0+IG51bGwpOwogICAgICAgIGlmIChjb3JyZXNwb25kaW5nTmFtZWQgIT0gbnVsbCkgewogICAgICAgICAgY29ycmVzcG9uZGluZ05hbWVkLnZhbHVlLmFjY2VwdCh0aGlzKTsKICAgICAgICAgIGJ1aWx0QXJndW1lbnRzLmFkZChwb3AoKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnRWYWx1ZSA9IF9lbGVtZW50TWFwCiAgICAgICAgICAgICAgLmdldENvbnN0YW50VmFsdWUobm9kZS5pbml0aWFsaXplciwgaW1wbGljaXROdWxsOiB0cnVlKTsKICAgICAgICAgIGFzc2VydCgKICAgICAgICAgICAgICBjb25zdGFudFZhbHVlICE9IG51bGwsCiAgICAgICAgICAgICAgZmFpbGVkQXQoX2VsZW1lbnRNYXAuZ2V0TWV0aG9kKGZ1bmN0aW9uLnBhcmVudCksCiAgICAgICAgICAgICAgICAgICdObyBjb25zdGFudCBjb21wdXRlZCBmb3IgJG5vZGUnKSk7CiAgICAgICAgICBidWlsdEFyZ3VtZW50cy5hZGQoZ3JhcGguYWRkQ29uc3RhbnQoY29uc3RhbnRWYWx1ZSwgY2xvc2VkV29ybGQpKTsKICAgICAgICB9CiAgICAgIH0pOwoKICAgIHJldHVybiBidWlsdEFyZ3VtZW50czsKICB9CgogIC8vLyBJbmxpbmVzIHRoZSBnaXZlbiByZWRpcmVjdGluZyBbY29uc3RydWN0b3JdJ3MgaW5pdGlhbGl6ZXJzIGJ5IGNvbGxlY3RpbmcKICAvLy8gaXRzIGZpZWxkIHZhbHVlcyBhbmQgYnVpbGRpbmcgaXRzIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4gV2UgdmlzaXQgc3VwZXIKICAvLy8gY29uc3RydWN0b3JzIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSBbT2JqZWN0XSBjb25zdHJ1Y3Rvci4KICB2b2lkIF9pbmxpbmVSZWRpcmVjdGluZ0luaXRpYWxpemVyKGlyLlJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsCiAgICAgIENvbnN0cnVjdG9yRGF0YSBjb25zdHJ1Y3RvckRhdGEsIGlyLkNvbnN0cnVjdG9yIGNhbGxlcikgewogICAgdmFyIHN1cGVyT3JSZWRpcmVjdENvbnN0cnVjdG9yID0gaW5pdGlhbGl6ZXIudGFyZ2V0OwogICAgdmFyIGFyZ3VtZW50cyA9IF9ub3JtYWxpemVBbmRCdWlsZEFyZ3VtZW50cygKICAgICAgICBzdXBlck9yUmVkaXJlY3RDb25zdHJ1Y3Rvci5mdW5jdGlvbiwgaW5pdGlhbGl6ZXIuYXJndW1lbnRzKTsKCiAgICAvLyBSZWRpcmVjdGluZyBpbml0aWFsaXplciBhbHJlYWR5IGhhcyBbbG9jYWxzSGFuZGxlcl0gYmluZGluZ3MgZm9yIHR5cGUKICAgIC8vIHBhcmFtZXRlcnMgZnJvbSB0aGUgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IuCgogICAgLy8gRm9yIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9ycywgdGhlIGZpZWxkcyB3aWxsIGJlIGluaXRpYWxpemVkIGxhdGVyIGJ5IHRoZQogICAgLy8gZWZmZWN0aXZlIHRhcmdldCwgc28gd2UgZG9uJ3QgZG8gaXQgaGVyZS4KCiAgICBfaW5saW5lU3VwZXJPclJlZGlyZWN0Q29tbW9uKGluaXRpYWxpemVyLCBzdXBlck9yUmVkaXJlY3RDb25zdHJ1Y3RvciwKICAgICAgICBhcmd1bWVudHMsIGNvbnN0cnVjdG9yRGF0YSwgY2FsbGVyKTsKICB9CgogIC8vLyBJbmxpbmVzIHRoZSBnaXZlbiBzdXBlciBbY29uc3RydWN0b3JdJ3MgaW5pdGlhbGl6ZXJzIGJ5IGNvbGxlY3RpbmcgaXRzCiAgLy8vIGZpZWxkIHZhbHVlcyBhbmQgYnVpbGRpbmcgaXRzIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4gV2UgdmlzaXQgc3VwZXIKICAvLy8gY29uc3RydWN0b3JzIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSBbT2JqZWN0XSBjb25zdHJ1Y3Rvci4KICB2b2lkIF9pbmxpbmVTdXBlckluaXRpYWxpemVyKGlyLlN1cGVySW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsCiAgICAgIENvbnN0cnVjdG9yRGF0YSBjb25zdHJ1Y3RvckRhdGEsIGlyLkNvbnN0cnVjdG9yIGNhbGxlcikgewogICAgdmFyIHRhcmdldCA9IGluaXRpYWxpemVyLnRhcmdldDsKICAgIHZhciBhcmd1bWVudHMgPQogICAgICAgIF9ub3JtYWxpemVBbmRCdWlsZEFyZ3VtZW50cyh0YXJnZXQuZnVuY3Rpb24sIGluaXRpYWxpemVyLmFyZ3VtZW50cyk7CgogICAgaXIuQ2xhc3MgY2FsbGVyQ2xhc3MgPSBjYWxsZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICBpci5TdXBlcnR5cGUgc3VwZXJ0eXBlID0gY2FsbGVyQ2xhc3Muc3VwZXJ0eXBlOwoKICAgIC8vIFRoZSBjbGFzcyBvZiB0aGUgc3VwZXItY29uc3RydWN0b3IgbWF5IG5vdCBiZSB0aGUgc3VwZXJ0eXBlIGNsYXNzLiBJbgogICAgLy8gdGhpcyBjYXNlLCB3ZSBtdXN0IGdvIHVwIHRoZSBjbGFzcyBoaWVyYXJjaHkgdW50aWwgd2UgcmVhY2ggdGhlIGNsYXNzCiAgICAvLyBjb250YWluaW5nIHRoZSBzdXBlci1jb25zdHJ1Y3Rvci4KICAgIHdoaWxlIChzdXBlcnR5cGUuY2xhc3NOb2RlICE9IHRhcmdldC5lbmNsb3NpbmdDbGFzcykgewogICAgICAvLyBGaWVsZHMgZnJvbSB1bm5hbWVkIG1peGluIGFwcGxpY2F0aW9uIGNsYXNzZXMgKGllIE9iamVjdCZGb28pIGdldAogICAgICAvLyAiY29sbGVjdGVkIiB3aXRoIHRoZSByZWd1bGFyIHN1cGVydHlwZSBmaWVsZHMsIHNvIHdlIG11c3QgYmluZCB0eXBlCiAgICAgIC8vIHBhcmFtZXRlcnMgZnJvbSBib3RoIHRoZSBzdXBlcnR5cGUgYW5kIHRoZSBzdXBlcnR5cGUncyBtaXhpbiBjbGFzc2VzCiAgICAgIC8vIGJlZm9yZSBjb2xsZWN0aW5nIHRoZSBmaWVsZCB2YWx1ZXMuCiAgICAgIF9jb2xsZWN0RmllbGRWYWx1ZXMoc3VwZXJ0eXBlLmNsYXNzTm9kZSwgY29uc3RydWN0b3JEYXRhKTsKICAgICAgc3VwZXJ0eXBlID0gc3VwZXJ0eXBlLmNsYXNzTm9kZS5zdXBlcnR5cGU7CiAgICB9CiAgICBzdXBlcnR5cGUgPSBzdXBlcnR5cGUuY2xhc3NOb2RlLnN1cGVydHlwZTsKCiAgICBfaW5saW5lU3VwZXJPclJlZGlyZWN0Q29tbW9uKAogICAgICAgIGluaXRpYWxpemVyLCB0YXJnZXQsIGFyZ3VtZW50cywgY29uc3RydWN0b3JEYXRhLCBjYWxsZXIpOwogIH0KCiAgdm9pZCBfaW5saW5lU3VwZXJPclJlZGlyZWN0Q29tbW9uKAogICAgICBpci5Jbml0aWFsaXplciBpbml0aWFsaXplciwKICAgICAgaXIuQ29uc3RydWN0b3IgY29uc3RydWN0b3IsCiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudHMsCiAgICAgIENvbnN0cnVjdG9yRGF0YSBjb25zdHJ1Y3RvckRhdGEsCiAgICAgIGlyLkNvbnN0cnVjdG9yIGNhbGxlcikgewogICAgdmFyIGluZGV4ID0gMDsKCiAgICBDb25zdHJ1Y3RvckVudGl0eSBlbGVtZW50ID0gX2VsZW1lbnRNYXAuZ2V0Q29uc3RydWN0b3IoY29uc3RydWN0b3IpOwogICAgU2NvcGVJbmZvIG9sZFNjb3BlSW5mbyA9IGxvY2Fsc0hhbmRsZXIuc2NvcGVJbmZvOwoKICAgIF9pbmxpbmVkRnJvbSgKICAgICAgICBlbGVtZW50LCBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQ2FsbChpbml0aWFsaXplciwgaW5pdGlhbGl6ZXIpLAogICAgICAgICgpIHsKICAgICAgdm9pZCBoYW5kbGVQYXJhbWV0ZXIoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICAgICAgTG9jYWwgcGFyYW1ldGVyID0gX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKG5vZGUpOwogICAgICAgIEhJbnN0cnVjdGlvbiBhcmd1bWVudCA9IGFyZ3VtZW50c1tpbmRleCsrXTsKICAgICAgICAvLyBCZWNhdXNlIHdlIGFyZSBpbmxpbmluZyB0aGUgaW5pdGlhbGl6ZXIsIHdlIG11c3QgdXBkYXRlCiAgICAgICAgLy8gd2hhdCB3YXMgZ2l2ZW4gYXMgcGFyYW1ldGVyLiBUaGlzIHdpbGwgYmUgdXNlZCBpbiBjYXNlCiAgICAgICAgLy8gdGhlcmUgaXMgYSBwYXJhbWV0ZXIgY2hlY2sgZXhwcmVzc2lvbiBpbiB0aGUgaW5pdGlhbGl6ZXIuCiAgICAgICAgcGFyYW1ldGVyc1twYXJhbWV0ZXJdID0gYXJndW1lbnQ7CiAgICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChwYXJhbWV0ZXIsIGFyZ3VtZW50KTsKICAgICAgfQoKICAgICAgY29uc3RydWN0b3IuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMuZm9yRWFjaChoYW5kbGVQYXJhbWV0ZXIpOwogICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMudG9MaXN0KCkKICAgICAgICAuLnNvcnQobmFtZWRPcmRlcmluZykKICAgICAgICAuLmZvckVhY2goaGFuZGxlUGFyYW1ldGVyKTsKCiAgICAgIF9lbnN1cmVUeXBlVmFyaWFibGVzRm9ySW5pdGlhbGl6ZXJzKAogICAgICAgICAgY29uc3RydWN0b3JEYXRhLCBlbGVtZW50LmVuY2xvc2luZ0NsYXNzKTsKCiAgICAgIC8vIFNldCB0aGUgbG9jYWxzIGhhbmRsZXIgc3RhdGUgYXMgaWYgd2Ugd2VyZSBpbmxpbmluZyB0aGUgY29uc3RydWN0b3IuCiAgICAgIFNjb3BlSW5mbyBuZXdTY29wZUluZm8gPSBfY2xvc3VyZURhdGFMb29rdXAuZ2V0U2NvcGVJbmZvKGVsZW1lbnQpOwogICAgICBsb2NhbHNIYW5kbGVyLnNjb3BlSW5mbyA9IG5ld1Njb3BlSW5mbzsKICAgICAgbG9jYWxzSGFuZGxlci5lbnRlclNjb3BlKF9jbG9zdXJlRGF0YUxvb2t1cC5nZXRDYXB0dXJlZFNjb3BlKGVsZW1lbnQpLAogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZERlY2xhcmF0aW9uKGVsZW1lbnQpKTsKICAgICAgX2J1aWxkSW5pdGlhbGl6ZXJzKGNvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvckRhdGEpOwogICAgfSk7CiAgICBsb2NhbHNIYW5kbGVyLnNjb3BlSW5mbyA9IG9sZFNjb3BlSW5mbzsKICB9CgogIC8vLyBDb25zdHJ1Y3RzIGEgc3BlY2lhbCBzaWduYXR1cmUgZnVuY3Rpb24gZm9yIGEgY2xvc3VyZS4gSXQgaXMgdW5pcXVlIGluCiAgLy8vIHRoYXQgbm8gY29ycmVzcG9uZGluZyBpci5Ob2RlIGFjdHVhbGx5IGV4aXN0cyBmb3IgaXQuIFdlIGp1c3QgdXNlIHRoZQogIC8vLyB0YXJnZXRFbGVtZW50LgogIHZvaWQgX2J1aWxkTWV0aG9kU2lnbmF0dXJlKGlyLkZ1bmN0aW9uTm9kZSBvcmlnaW5hbENsb3N1cmVOb2RlKSB7CiAgICBfb3BlbkZ1bmN0aW9uKHRhcmdldEVsZW1lbnQsIGNoZWNrczogVGFyZ2V0Q2hlY2tzLm5vbmUpOwogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IHR5cGVBcmd1bWVudHMgPSA8SEluc3RydWN0aW9uPltdOwoKICAgIC8vIEFkZCBmdW5jdGlvbiB0eXBlIHZhcmlhYmxlcy4KICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPQogICAgICAgIF9lbGVtZW50TWFwLmdldEZ1bmN0aW9uVHlwZShvcmlnaW5hbENsb3N1cmVOb2RlKTsKICAgIGZ1bmN0aW9uVHlwZS5mb3JFYWNoVHlwZVZhcmlhYmxlKChUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZVR5cGUpIHsKICAgICAgRGFydFR5cGUgcmVzdWx0ID0gbG9jYWxzSGFuZGxlci5zdWJzdEluQ29udGV4dCh0eXBlVmFyaWFibGVUeXBlKTsKICAgICAgSEluc3RydWN0aW9uIGFyZ3VtZW50ID0KICAgICAgICAgIF90eXBlQnVpbGRlci5hbmFseXplVHlwZUFyZ3VtZW50KHJlc3VsdCwgc291cmNlRWxlbWVudCk7CiAgICAgIHR5cGVBcmd1bWVudHMuYWRkKGFyZ3VtZW50KTsKICAgIH0pOwogICAgcHVzaChuZXcgSFR5cGVJbmZvRXhwcmVzc2lvbigKICAgICAgICBUeXBlSW5mb0V4cHJlc3Npb25LaW5kLkNPTVBMRVRFLAogICAgICAgIF9lbGVtZW50TWFwLmdldEZ1bmN0aW9uVHlwZShvcmlnaW5hbENsb3N1cmVOb2RlKSwKICAgICAgICB0eXBlQXJndW1lbnRzLAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmZ1bmN0aW9uVHlwZSkpOwogICAgSEluc3RydWN0aW9uIHZhbHVlID0gcG9wKCk7CiAgICBjbG9zZShuZXcgSFJldHVybihfYWJzdHJhY3RWYWx1ZURvbWFpbiwgdmFsdWUsCiAgICAgICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRSZXR1cm4ob3JpZ2luYWxDbG9zdXJlTm9kZSkpKQogICAgICAgIC5hZGRTdWNjZXNzb3IoZ3JhcGguZXhpdCk7CgogICAgX2Nsb3NlRnVuY3Rpb24oKTsKICB9CgogIC8vLyBDb25zdHJ1Y3RzIGEgc3BlY2lhbCBzaWduYXR1cmUgZnVuY3Rpb24gZm9yIGEgY2xvc3VyZS4KICB2b2lkIF9idWlsZE1ldGhvZFNpZ25hdHVyZU5ld1J0aShpci5GdW5jdGlvbk5vZGUgb3JpZ2luYWxDbG9zdXJlTm9kZSkgewogICAgLy8gVGhlIHNpZ25hdHVyZSBmdW5jdGlvbiBoYXMgbm8gY29ycmVzcG9uZGluZyBpci5Ob2RlLCBzbyB3ZSBqdXN0IHVzZSB0aGUKICAgIC8vIHRhcmdldEVsZW1lbnQgdG8gc2V0IHVwIHRoZSB0eXBlIGVudmlyb25tZW50LgogICAgX29wZW5GdW5jdGlvbih0YXJnZXRFbGVtZW50LCBjaGVja3M6IFRhcmdldENoZWNrcy5ub25lKTsKICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPQogICAgICAgIF9lbGVtZW50TWFwLmdldEZ1bmN0aW9uVHlwZShvcmlnaW5hbENsb3N1cmVOb2RlKTsKICAgIEhJbnN0cnVjdGlvbiBydGkgPQogICAgICAgIF90eXBlQnVpbGRlci5hbmFseXplVHlwZUFyZ3VtZW50TmV3UnRpKGZ1bmN0aW9uVHlwZSwgc291cmNlRWxlbWVudCk7CiAgICBjbG9zZShuZXcgSFJldHVybihfYWJzdHJhY3RWYWx1ZURvbWFpbiwgcnRpLAogICAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkUmV0dXJuKG9yaWdpbmFsQ2xvc3VyZU5vZGUpKSkKICAgICAgICAuYWRkU3VjY2Vzc29yKGdyYXBoLmV4aXQpOwogICAgX2Nsb3NlRnVuY3Rpb24oKTsKICB9CgogIC8vLyBCdWlsZHMgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBib2R5LgogIHZvaWQgX2J1aWxkQ29uc3RydWN0b3JCb2R5KGlyLkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB7CiAgICBGdW5jdGlvbkVudGl0eSBjb25zdHJ1Y3RvckJvZHkgPQogICAgICAgIF9lbGVtZW50TWFwLmdldENvbnN0cnVjdG9yQm9keShjb25zdHJ1Y3Rvcik7CiAgICBfb3BlbkZ1bmN0aW9uKGNvbnN0cnVjdG9yQm9keSwKICAgICAgICBmdW5jdGlvbk5vZGU6IGNvbnN0cnVjdG9yLmZ1bmN0aW9uLAogICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZTogY29uc3RydWN0b3JCb2R5LnBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICBjaGVja3M6IFRhcmdldENoZWNrcy5ub25lKTsKICAgIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLmJvZHkuYWNjZXB0KHRoaXMpOwogICAgX2Nsb3NlRnVuY3Rpb24oKTsKICB9CgogIC8vLyBCdWlsZHMgYSBTU0EgZ3JhcGggZm9yIEZ1bmN0aW9uTm9kZXMsIGZvdW5kIGluIEZ1bmN0aW9uRXhwcmVzc2lvbnMgYW5kCiAgLy8vIFByb2NlZHVyZXMuCiAgdm9pZCBfYnVpbGRGdW5jdGlvbk5vZGUoCiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLCBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlKSB7CiAgICBpZiAoZnVuY3Rpb25Ob2RlLmFzeW5jTWFya2VyICE9IGlyLkFzeW5jTWFya2VyLlN5bmMpIHsKICAgICAgX2J1aWxkR2VuZXJhdG9yKGZ1bmN0aW9uLCBmdW5jdGlvbk5vZGUpOwogICAgICByZXR1cm47CiAgICB9CgogICAgX29wZW5GdW5jdGlvbihmdW5jdGlvbiwKICAgICAgICBmdW5jdGlvbk5vZGU6IGZ1bmN0aW9uTm9kZSwKICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmU6IGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICBjaGVja3M6IF9jaGVja3NGb3JGdW5jdGlvbihmdW5jdGlvbikpOwoKICAgIC8vIElmIFtmdW5jdGlvbk5vZGVdIGlzIGBvcGVyYXRvcj09YCB3ZSBleHBsaWNpdGx5IGFkZCBhIG51bGwgY2hlY2sgYXQgdGhlCiAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIG1ldGhvZC4gVGhpcyBpcyB0byBhdm9pZCBoYXZpbmcgY2FsbCBzaXRlcyBkbyB0aGUgbnVsbAogICAgLy8gY2hlY2suCiAgICBpZiAoZnVuY3Rpb24ubmFtZSA9PSAnPT0nKSB7CiAgICAgIGlmICghX2NvbW1vbkVsZW1lbnRzLm9wZXJhdG9yRXFIYW5kbGVzTnVsbEFyZ3VtZW50KGZ1bmN0aW9uKSkgewogICAgICAgIF9oYW5kbGVJZigKICAgICAgICAgICAgdmlzaXRDb25kaXRpb246ICgpIHsKICAgICAgICAgICAgICBIUGFyYW1ldGVyVmFsdWUgcGFyYW1ldGVyID0gcGFyYW1ldGVycy52YWx1ZXMuZmlyc3Q7CiAgICAgICAgICAgICAgcHVzaChuZXcgSElkZW50aXR5KHBhcmFtZXRlciwgZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSwKICAgICAgICAgICAgICAgICAgbnVsbCwgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdmlzaXRUaGVuOiAoKSB7CiAgICAgICAgICAgICAgX2Nsb3NlQW5kR290b0V4aXQobmV3IEhSZXR1cm4oCiAgICAgICAgICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICAgICAgICAgICAgICBncmFwaC5hZGRDb25zdGFudEJvb2woZmFsc2UsIGNsb3NlZFdvcmxkKSwKICAgICAgICAgICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZFJldHVybihmdW5jdGlvbk5vZGUpKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHZpc2l0RWxzZTogbnVsbCwKICAgICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRJZihmdW5jdGlvbk5vZGUpKTsKICAgICAgfQogICAgfQogICAgaWYgKGNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCd1bnJlYWNoYWJsZS10aHJvdycpKSB7CiAgICAgIHZhciBlbXB0eVBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzLnZhbHVlcy53aGVyZSgocCkgPT4KICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzRW1wdHkocC5pbnN0cnVjdGlvblR5cGUpLmlzRGVmaW5pdGVseVRydWUpOwogICAgICBpZiAoZW1wdHlQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgICBfYWRkQ29tbWVudCgnJHtlbXB0eVBhcmFtZXRlcnN9IGluZmVycmVkIGFzIFtlbXB0eV0nKTsKICAgICAgICBhZGQobmV3IEhJbnZva2VTdGF0aWMoCiAgICAgICAgICAgIF9jb21tb25FbGVtZW50cy5hc3NlcnRVbnJlYWNoYWJsZU1ldGhvZCwKICAgICAgICAgICAgPEhJbnN0cnVjdGlvbj5bXSwKICAgICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUsCiAgICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSkpOwogICAgICAgIF9jbG9zZUZ1bmN0aW9uKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbk5vZGUuYm9keS5hY2NlcHQodGhpcyk7CiAgICBfY2xvc2VGdW5jdGlvbigpOwogIH0KCiAgLy8vIEFkZHMgYSBKYXZhU2NyaXB0IGNvbW1lbnQgdG8gdGhlIG91dHB1dC4gVGhlIGNvbW1lbnQgd2lsbCBiZSBvbWl0dGVkIGluCiAgLy8vIG1pbmlmaWVkIG1vZGUuICBFYWNoIGxpbmUgaW4gW3RleHRdIGlzIHByZWNlZGVkIHdpdGggYC8vYCBhbmQgaW5kZW50ZWQuCiAgLy8vIFVzZSBzcGFyaW5nbHkuIEluIG9yZGVyIGZvciB0aGUgY29tbWVudCB0byBiZSByZXRhaW5lZCBpdCBpcyBtb2RlbGVkIGFzCiAgLy8vIGhhdmluZyBzaWRlIGVmZmVjdHMgd2hpY2ggd2lsbCBpbmhpYml0IGNvZGUgbW90aW9uLgogIC8vIFRPRE8oc3JhKTogRmlndXJlIG91dCBob3cgdG8ga2VlcCBjb21tZW50IGFuY2hvcmVkIHdpdGhvdXQgZWZmZWN0cy4KICB2b2lkIF9hZGRDb21tZW50KFN0cmluZyB0ZXh0KSB7CiAgICBhZGQobmV3IEhGb3JlaWduQ29kZShqcy5qcy5zdGF0ZW1lbnRUZW1wbGF0ZVlpZWxkaW5nKG5ldyBqcy5Db21tZW50KHRleHQpKSwKICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwgPEhJbnN0cnVjdGlvbj5bXSwKICAgICAgICBpc1N0YXRlbWVudDogdHJ1ZSkpOwogIH0KCiAgLy8vIEJ1aWxkcyBhIFNTQSBncmFwaCBmb3IgYSBzeW5jKi9hc3luYy9hc3luYyogZ2VuZXJhdG9yLiAgV2UgZ2VuZXJhdGUgYQogIC8vLyBlbnRyeSBmdW5jdGlvbiB3aGljaCB0YWlsLWNhbGxzIGEgYm9keSBmdW5jdGlvbi4gVGhlIGVudHJ5IGNvbnRhaW5zCiAgLy8vIHBlci1pbnZvY2F0aW9uIGNoZWNrcyBhbmQgdGhlIGJvZHksIHdoaWNoIGlzIGxhdGVyIHRyYW5zZm9ybWVkLCBjb250YWlucwogIC8vLyB0aGUgcmUtZW50cmFudCAnc3RhdGUgbWFjaGluZScgY29kZS4KICB2b2lkIF9idWlsZEdlbmVyYXRvcihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZSkgewogICAgX29wZW5GdW5jdGlvbihmdW5jdGlvbiwKICAgICAgICBmdW5jdGlvbk5vZGU6IGZ1bmN0aW9uTm9kZSwKICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmU6IGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICBjaGVja3M6IF9jaGVja3NGb3JGdW5jdGlvbihmdW5jdGlvbikpOwoKICAgIC8vIFByZXBhcmUgdG8gdGFpbC1jYWxsIHRoZSBib2R5LgoKICAgIC8vIElzICdidWlsZEFzeW5jQm9keScgdGhlIGJlc3QgbG9jYXRpb24gZm9yIHRoZSBlbnRyeT8KICAgIHZhciBzb3VyY2VJbmZvcm1hdGlvbiA9IF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRBc3luY0JvZHkoKTsKCiAgICAvLyBGb3J3YXJkIGFsbCB0aGUgcGFyYW1ldGVycyB0byB0aGUgYm9keS4KICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgaWYgKGdyYXBoLnRoaXNJbnN0cnVjdGlvbiAhPSBudWxsKSB7CiAgICAgIGlucHV0cy5hZGQoZ3JhcGgudGhpc0luc3RydWN0aW9uKTsKICAgIH0KICAgIGlmIChncmFwaC5leHBsaWNpdFJlY2VpdmVyUGFyYW1ldGVyICE9IG51bGwpIHsKICAgICAgaW5wdXRzLmFkZChncmFwaC5leHBsaWNpdFJlY2VpdmVyUGFyYW1ldGVyKTsKICAgIH0KICAgIGZvciAoTG9jYWwgbG9jYWwgaW4gcGFyYW1ldGVycy5rZXlzKSB7CiAgICAgIGlmICghZWxpZGVkUGFyYW1ldGVycy5jb250YWlucyhsb2NhbCkpIHsKICAgICAgICBpbnB1dHMuYWRkKGxvY2Fsc0hhbmRsZXIucmVhZExvY2FsKGxvY2FsKSk7CiAgICAgIH0KICAgIH0KICAgIGZvciAoTG9jYWwgbG9jYWwgaW4gX2Z1bmN0aW9uVHlwZVBhcmFtZXRlckxvY2FscykgewogICAgICBpbnB1dHMuYWRkKGxvY2Fsc0hhbmRsZXIucmVhZExvY2FsKGxvY2FsKSk7CiAgICB9CgogICAgLy8gQWRkIHRoZSB0eXBlIHBhcmFtZXRlciBmb3IgdGhlIGdlbmVyYXRvcidzIGVsZW1lbnQgdHlwZS4KICAgIERhcnRUeXBlIGVsZW1lbnRUeXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRBc3luY09yU3luY1N0YXJFbGVtZW50VHlwZSgKICAgICAgICBmdW5jdGlvbi5hc3luY01hcmtlciwgX3JldHVyblR5cGUpOwoKICAgIGlmIChlbGVtZW50VHlwZS5jb250YWluc0ZyZWVUeXBlVmFyaWFibGVzKSB7CiAgICAgIC8vIFR5cGUgbXVzdCBiZSBjb21wdXRlZCBpbiB0aGUgZW50cnkgZnVuY3Rpb24sIHdoZXJlIHRoZSB0eXBlIHZhcmlhYmxlcwogICAgICAvLyBhcmUgaW4gc2NvcGUsIGFuZCBwYXNzZWQgdG8gdGhlIGJvZHkgZnVuY3Rpb24uCiAgICAgIGlmIChvcHRpb25zLmV4cGVyaW1lbnROZXdSdGkpIHsKICAgICAgICBpbnB1dHMKICAgICAgICAgICAgLmFkZChfdHlwZUJ1aWxkZXIuYW5hbHl6ZVR5cGVBcmd1bWVudE5ld1J0aShlbGVtZW50VHlwZSwgZnVuY3Rpb24pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnB1dHMuYWRkKF90eXBlQnVpbGRlci5hbmFseXplVHlwZUFyZ3VtZW50KGVsZW1lbnRUeXBlLCBmdW5jdGlvbikpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBUeXBlcyB3aXRoIG5vIHR5cGUgdmFyaWFibGVzIGNhbiBiZSBlbWl0dGVkIGFzIHBhcnQgb2YgdGhlIGdlbmVyYXRvciwKICAgICAgLy8gYXZvaWRpbmcgYW4gZXh0cmEgYXJndW1lbnQuCiAgICAgIGlmIChfZ2VuZXJhdGVkRW50cnlJc0VtcHR5KCkpIHsKICAgICAgICAvLyBJZiB0aGUgZW50cnkgZnVuY3Rpb24gaXMgZW1wdHkgKGUuZy4gbm8gYXJndW1lbnQgY2hlY2tzKSBhbmQgdGhlIHR5cGUKICAgICAgICAvLyBjYW4gYmUgZ2VuZXJhdGVkIGluIGJvZHksICdpbmxpbmUnIHRoZSBib2R5IGJ5IGdlbmVyYXRpbmcgaXQgaW4KICAgICAgICAvLyBwbGFjZS4gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBzdWJzZXF1ZW50IHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBjb2RlCiAgICAgICAgLy8gaXMgJ2NvcnJlY3QnIGZvciB0aGUgZW1wdHkgZW50cnkgZnVuY3Rpb24gY29kZS4KICAgICAgICBncmFwaC5uZWVkc0FzeW5jUmV3cml0ZSA9IHRydWU7CiAgICAgICAgZ3JhcGguYXN5bmNFbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOwogICAgICAgIGZ1bmN0aW9uTm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICAgICAgICBfY2xvc2VGdW5jdGlvbigpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIEpHZW5lcmF0b3JCb2R5IGJvZHkgPSBfZWxlbWVudE1hcC5nZXRHZW5lcmF0b3JCb2R5KGZ1bmN0aW9uKTsKICAgIHB1c2gobmV3IEhJbnZva2VHZW5lcmF0b3JCb2R5KAogICAgICAgIGJvZHksCiAgICAgICAgaW5wdXRzLAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLCAvLyBUT0RPOiBiZXR0ZXIgdHlwZS4KICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbikpOwoKICAgIF9jbG9zZUFuZEdvdG9FeGl0KAogICAgICAgIG5ldyBIUmV0dXJuKF9hYnN0cmFjdFZhbHVlRG9tYWluLCBwb3AoKSwgc291cmNlSW5mb3JtYXRpb24pKTsKCiAgICBfY2xvc2VGdW5jdGlvbigpOwogIH0KCiAgLy8vIEJ1aWxkcyBhIFNTQSBncmFwaCBmb3IgYSBzeW5jKi9hc3luYy9hc3luYyogZ2VuZXJhdG9yIGJvZHkuCiAgdm9pZCBfYnVpbGRHZW5lcmF0b3JCb2R5KAogICAgICBKR2VuZXJhdG9yQm9keSBmdW5jdGlvbiwgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZSkgewogICAgRnVuY3Rpb25FbnRpdHkgZW50cnkgPSBmdW5jdGlvbi5mdW5jdGlvbjsKICAgIF9vcGVuRnVuY3Rpb24oZW50cnksCiAgICAgICAgZnVuY3Rpb25Ob2RlOiBmdW5jdGlvbk5vZGUsCiAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlOiBmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgY2hlY2tzOiBUYXJnZXRDaGVja3Mubm9uZSk7CiAgICBncmFwaC5uZWVkc0FzeW5jUmV3cml0ZSA9IHRydWU7CiAgICBpZiAoIWZ1bmN0aW9uLmVsZW1lbnRUeXBlLmNvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMpIHsKICAgICAgLy8gV2UgY2FuIGdlbmVyYXRlIHRoZSBlbGVtZW50IHR5cGUgaW4gcGxhY2UKICAgICAgZ3JhcGguYXN5bmNFbGVtZW50VHlwZSA9IGZ1bmN0aW9uLmVsZW1lbnRUeXBlOwogICAgfQogICAgZnVuY3Rpb25Ob2RlLmJvZHkuYWNjZXB0KHRoaXMpOwogICAgX2Nsb3NlRnVuY3Rpb24oKTsKICB9CgogIGJvb2wgX2dlbmVyYXRlZEVudHJ5SXNFbXB0eSgpIHsKICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gY3VycmVudDsKICAgIC8vIElmIGBibG9jay5pZGAgaXMgbm90IDEgdGhlbiB3ZSBnZW5lcmF0ZWQgc29tZSBjb250cm9sIGZsb3cuCiAgICBpZiAoYmxvY2suaWQgIT0gMSkgcmV0dXJuIGZhbHNlOwogICAgZm9yIChISW5zdHJ1Y3Rpb24gbm9kZSA9IGJsb2NrLmZpcnN0OyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLm5leHQpIHsKICAgICAgaWYgKG5vZGUgaXMgSEdvdG8pIGNvbnRpbnVlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgX3BvdGVudGlhbGx5QWRkRnVuY3Rpb25QYXJhbWV0ZXJUeXBlQ2hlY2tzKAogICAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb24sIFRhcmdldENoZWNrcyB0YXJnZXRDaGVja3MpIHsKICAgIC8vIFB1dCB0aGUgdHlwZSBjaGVja3MgaW4gdGhlIGZpcnN0IHN1Y2Nlc3NvciBvZiB0aGUgZW50cnksCiAgICAvLyBiZWNhdXNlIHRoYXQgaXMgd2hlcmUgdGhlIHR5cGUgZ3VhcmRzIHdpbGwgYWxzbyBiZSBpbnNlcnRlZC4KICAgIC8vIFRoaXMgd2F5IHdlIGVuc3VyZSB0aGF0IGEgdHlwZSBndWFyZCB3aWxsIGRvbWluYXRlIHRoZSB0eXBlCiAgICAvLyBjaGVjay4KCiAgICBpZiAodGFyZ2V0Q2hlY2tzLmNoZWNrVHlwZVBhcmFtZXRlcnMpIHsKICAgICAgX2NoZWNrVHlwZVZhcmlhYmxlQm91bmRzKHRhcmdldEVsZW1lbnQpOwogICAgfQoKICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9CiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbih0YXJnZXRFbGVtZW50KTsKICAgIGJvb2wgbm9kZUlzQ29uc3RydWN0b3JCb2R5ID0gZGVmaW5pdGlvbi5raW5kID09IE1lbWJlcktpbmQuY29uc3RydWN0b3JCb2R5OwoKICAgIHZvaWQgX2hhbmRsZVBhcmFtZXRlcihpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICAgIExvY2FsIGxvY2FsID0gX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKHZhcmlhYmxlKTsKICAgICAgaWYgKG5vZGVJc0NvbnN0cnVjdG9yQm9keSAmJgogICAgICAgICAgX2Nsb3N1cmVEYXRhTG9va3VwCiAgICAgICAgICAgICAgLmdldENhcHR1cmVkU2NvcGUodGFyZ2V0RWxlbWVudCkKICAgICAgICAgICAgICAuaXNCb3hlZFZhcmlhYmxlKGxvY2FsKSkgewogICAgICAgIC8vIElmIGxvY2FsIGlzIGJveGVkLCB0aGVuIGB2YXJpYWJsZWAgd2lsbCBiZSBhIGZpZWxkIGluc2lkZSB0aGUgYm94CiAgICAgICAgLy8gcGFzc2VkIGFzIHRoZSBsYXN0IHBhcmFtZXRlciwgc28gbm8gbmVlZCB0byB1cGRhdGUgb3VyIGxvY2FscwogICAgICAgIC8vIGhhbmRsZXIgb3IgY2hlY2sgdHlwZXMgYXQgdGhpcyBwb2ludC4KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgSEluc3RydWN0aW9uIG5ld1BhcmFtZXRlciA9IGxvY2Fsc0hhbmRsZXIuZGlyZWN0TG9jYWxzW2xvY2FsXTsKICAgICAgYXNzZXJ0KG5ld1BhcmFtZXRlciAhPSBudWxsLCAiTm8gaW5pdGlhbCBpbnN0cnVjdGlvbiBmb3IgJHtsb2NhbH0uIik7CiAgICAgIERhcnRUeXBlIHR5cGUgPSBfZ2V0RGFydFR5cGVJZlZhbGlkKHZhcmlhYmxlLnR5cGUpOwoKICAgICAgaWYgKHRhcmdldENoZWNrcy5jaGVja0FsbFBhcmFtZXRlcnMgfHwKICAgICAgICAgICh0YXJnZXRDaGVja3MuY2hlY2tDb3ZhcmlhbnRQYXJhbWV0ZXJzICYmCiAgICAgICAgICAgICAgKHZhcmlhYmxlLmlzR2VuZXJpY0NvdmFyaWFudEltcGwgfHwgdmFyaWFibGUuaXNDb3ZhcmlhbnQpKSkgewogICAgICAgIG5ld1BhcmFtZXRlciA9IF90eXBlQnVpbGRlci5wb3RlbnRpYWxseUNoZWNrT3JUcnVzdFR5cGVPZlBhcmFtZXRlcigKICAgICAgICAgICAgdGFyZ2V0RWxlbWVudCwgbmV3UGFyYW1ldGVyLCB0eXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuZXdQYXJhbWV0ZXIgPSBfdHlwZUJ1aWxkZXIudHJ1c3RUeXBlT2ZQYXJhbWV0ZXIobmV3UGFyYW1ldGVyLCB0eXBlKTsKICAgICAgfQoKICAgICAgbG9jYWxzSGFuZGxlci5kaXJlY3RMb2NhbHNbbG9jYWxdID0gbmV3UGFyYW1ldGVyOwogICAgfQoKICAgIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmZvckVhY2goX2hhbmRsZVBhcmFtZXRlcik7CiAgICBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMudG9MaXN0KCkuLmZvckVhY2goX2hhbmRsZVBhcmFtZXRlcik7CiAgfQoKICB2b2lkIF9jaGVja1R5cGVWYXJpYWJsZUJvdW5kcyhGdW5jdGlvbkVudGl0eSBtZXRob2QpIHsKICAgIGlmIChfcnRpTmVlZC5tZXRob2ROZWVkc1R5cGVBcmd1bWVudHMobWV0aG9kKSAmJgogICAgICAgIGNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YS5nZXRQYXJhbWV0ZXJDaGVja1BvbGljeShtZXRob2QpLmlzRW1pdHRlZCkgewogICAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb24gPSBnZXRGdW5jdGlvbk5vZGUoX2VsZW1lbnRNYXAsIG1ldGhvZCk7CiAgICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgTG9jYWwgbG9jYWwgPSBfbG9jYWxzTWFwLmdldExvY2FsVHlwZVZhcmlhYmxlKAogICAgICAgICAgICBuZXcgaXIuVHlwZVBhcmFtZXRlclR5cGUodHlwZVBhcmFtZXRlciksIF9lbGVtZW50TWFwKTsKICAgICAgICBISW5zdHJ1Y3Rpb24gbmV3UGFyYW1ldGVyID0gbG9jYWxzSGFuZGxlci5kaXJlY3RMb2NhbHNbbG9jYWxdOwogICAgICAgIERhcnRUeXBlIGJvdW5kID0gX2dldERhcnRUeXBlSWZWYWxpZCh0eXBlUGFyYW1ldGVyLmJvdW5kKTsKICAgICAgICBpZiAoIWJvdW5kLmlzRHluYW1pYyAmJgogICAgICAgICAgICAhYm91bmQuaXNWb2lkICYmCiAgICAgICAgICAgIGJvdW5kICE9IF9jb21tb25FbGVtZW50cy5vYmplY3RUeXBlKSB7CiAgICAgICAgICBpZiAob3B0aW9ucy5leHBlcmltZW50TmV3UnRpKSB7CiAgICAgICAgICAgIF9jaGVja1R5cGVCb3VuZChuZXdQYXJhbWV0ZXIsIGJvdW5kLCBsb2NhbC5uYW1lKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9hc3NlcnRJc1R5cGUoCiAgICAgICAgICAgICAgICBuZXdQYXJhbWV0ZXIsCiAgICAgICAgICAgICAgICBib3VuZCwKICAgICAgICAgICAgICAgICJUaGUgdHlwZSBhcmd1bWVudCAnIiwKICAgICAgICAgICAgICAgICInIGlzIG5vdCBhIHN1YnR5cGUgb2YgdGhlIHR5cGUgdmFyaWFibGUgYm91bmQgJyIsCiAgICAgICAgICAgICAgICAiJyBvZiB0eXBlIHZhcmlhYmxlICcke2xvY2FsLm5hbWV9JyBpbiAnJHttZXRob2QubmFtZX0nLiIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8vIEJ1aWxkcyBhIFNTQSBncmFwaCBmb3IgRnVuY3Rpb25Ob2RlcyBvZiBleHRlcm5hbCBtZXRob2RzLgogIHZvaWQgX2J1aWxkRXh0ZXJuYWxGdW5jdGlvbk5vZGUoCiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLCBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBOb24tanMtaW50ZXJvcCBleHRlcm5hbCBmdW5jdGlvbnMgc2hvdWxkCiAgICAvLyB0aHJvdyBhIHJ1bnRpbWUgZXJyb3IuCiAgICBhc3NlcnQoZnVuY3Rpb25Ob2RlLmJvZHkgPT0gbnVsbCk7CiAgICBfb3BlbkZ1bmN0aW9uKGZ1bmN0aW9uLAogICAgICAgIGZ1bmN0aW9uTm9kZTogZnVuY3Rpb25Ob2RlLAogICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZTogZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlLAogICAgICAgIGNoZWNrczogX2NoZWNrc0ZvckZ1bmN0aW9uKGZ1bmN0aW9uKSk7CgogICAgaWYgKGNsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaXNOYXRpdmVNZW1iZXIodGFyZ2V0RWxlbWVudCkpIHsKICAgICAgcmVnaXN0cnkucmVnaXN0ZXJOYXRpdmVNZXRob2QodGFyZ2V0RWxlbWVudCk7CiAgICAgIFN0cmluZyBuYXRpdmVOYW1lOwogICAgICBpZiAoY2xvc2VkV29ybGQubmF0aXZlRGF0YS5oYXNGaXhlZEJhY2tlbmROYW1lKHRhcmdldEVsZW1lbnQpKSB7CiAgICAgICAgbmF0aXZlTmFtZSA9IGNsb3NlZFdvcmxkLm5hdGl2ZURhdGEuZ2V0Rml4ZWRCYWNrZW5kTmFtZSh0YXJnZXRFbGVtZW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYXRpdmVOYW1lID0gdGFyZ2V0RWxlbWVudC5uYW1lOwogICAgICB9CgogICAgICBTdHJpbmcgdGVtcGxhdGVSZWNlaXZlciA9ICcnOwogICAgICBMaXN0PFN0cmluZz4gdGVtcGxhdGVBcmd1bWVudHMgPSA8U3RyaW5nPltdOwogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgICAgaWYgKHRhcmdldEVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAgIHRlbXBsYXRlUmVjZWl2ZXIgPSAnIy4nOwogICAgICAgIGlucHV0cy5hZGQobG9jYWxzSGFuZGxlci5yZWFkVGhpcygKICAgICAgICAgICAgc291cmNlSW5mb3JtYXRpb246CiAgICAgICAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkR2V0KGZ1bmN0aW9uTm9kZSkpKTsKICAgICAgfQoKICAgICAgdm9pZCBoYW5kbGVQYXJhbWV0ZXIoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbSkgewogICAgICAgIHRlbXBsYXRlQXJndW1lbnRzLmFkZCgnIycpOwogICAgICAgIExvY2FsIGxvY2FsID0gX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKHBhcmFtKTsKICAgICAgICAvLyBDb252ZXJ0IERhcnQgZnVuY3Rpb24gdG8gSmF2YVNjcmlwdCBmdW5jdGlvbi4KICAgICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQgPSBsb2NhbHNIYW5kbGVyLnJlYWRMb2NhbChsb2NhbCk7CiAgICAgICAgaXIuRGFydFR5cGUgdHlwZSA9IHBhcmFtLnR5cGU7CiAgICAgICAgaWYgKHR5cGUgaXMgaXIuRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICBpbnQgYXJpdHkgPSB0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsKICAgICAgICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgICBfY29tbW9uRWxlbWVudHMuY2xvc3VyZUNvbnZlcnRlciwKICAgICAgICAgICAgICBbYXJndW1lbnQsIGdyYXBoLmFkZENvbnN0YW50SW50KGFyaXR5LCBjbG9zZWRXb3JsZCldLAogICAgICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLAogICAgICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogbnVsbCk7CiAgICAgICAgICBhcmd1bWVudCA9IHBvcCgpOwogICAgICAgIH0KICAgICAgICBpbnB1dHMuYWRkKGFyZ3VtZW50KTsKICAgICAgfQoKICAgICAgZm9yIChpbnQgcG9zaXRpb24gPSAwOwogICAgICAgICAgcG9zaXRpb24gPCBmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUucG9zaXRpb25hbFBhcmFtZXRlcnM7CiAgICAgICAgICBwb3NpdGlvbisrKSB7CiAgICAgICAgaGFuZGxlUGFyYW1ldGVyKGZ1bmN0aW9uTm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1twb3NpdGlvbl0pOwogICAgICB9CiAgICAgIGlmIChmdW5jdGlvbk5vZGUubmFtZWRQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICBMaXN0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycyA9IGZ1bmN0aW9uTm9kZQogICAgICAgICAgICAubmFtZWRQYXJhbWV0ZXJzCiAgICAgICAgICAgIC8vIEZpbHRlciBlbGlkZWQgcGFyYW1ldGVycy4KICAgICAgICAgICAgLndoZXJlKChwKSA9PgogICAgICAgICAgICAgICAgZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycy5jb250YWlucyhwLm5hbWUpKQogICAgICAgICAgICAudG9MaXN0KCk7CiAgICAgICAgLy8gU29ydCBieSBmaWxlIG9mZnNldCB0byB2aXNpdCBwYXJhbWV0ZXJzIGluIGRlY2xhcmF0aW9uIG9yZGVyLgogICAgICAgIG5hbWVkUGFyYW1ldGVycy5zb3J0KG5hdGl2ZU9yZGVyaW5nKTsKICAgICAgICBuYW1lZFBhcmFtZXRlcnMuZm9yRWFjaChoYW5kbGVQYXJhbWV0ZXIpOwogICAgICB9CgogICAgICBTdHJpbmcgYXJndW1lbnRzID0gdGVtcGxhdGVBcmd1bWVudHMuam9pbignLCcpOwoKICAgICAgLy8gVE9ETyhzcmEpOiBVc2UgZGVjbGFyZWQgdHlwZSBvciBOYXRpdmVCZWhhdmlvciB0eXBlLgogICAgICBBYnN0cmFjdFZhbHVlIHR5cGVNYXNrID0gX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgICAgIFN0cmluZyB0ZW1wbGF0ZTsKICAgICAgaWYgKHRhcmdldEVsZW1lbnQuaXNHZXR0ZXIpIHsKICAgICAgICB0ZW1wbGF0ZSA9ICcke3RlbXBsYXRlUmVjZWl2ZXJ9JG5hdGl2ZU5hbWUnOwogICAgICB9IGVsc2UgaWYgKHRhcmdldEVsZW1lbnQuaXNTZXR0ZXIpIHsKICAgICAgICB0ZW1wbGF0ZSA9ICcke3RlbXBsYXRlUmVjZWl2ZXJ9JG5hdGl2ZU5hbWUgPSAke2FyZ3VtZW50c30nOwogICAgICB9IGVsc2UgewogICAgICAgIHRlbXBsYXRlID0gJyR7dGVtcGxhdGVSZWNlaXZlcn0kbmF0aXZlTmFtZSgke2FyZ3VtZW50c30pJzsKICAgICAgfQoKICAgICAgcHVzaChuZXcgSEZvcmVpZ25Db2RlKAogICAgICAgICAganMuanMudW5jYWNoZWRFeHByZXNzaW9uVGVtcGxhdGUodGVtcGxhdGUpLCB0eXBlTWFzaywgaW5wdXRzLAogICAgICAgICAgZWZmZWN0czogbmV3IFNpZGVFZmZlY3RzKCkpKTsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUHJvdmlkZSBzb3VyY2UgaW5mb3JtYXRpb24uCiAgICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IHBvcCgpOwogICAgICBpZiAodGFyZ2V0RWxlbWVudC5pc1NldHRlcikgewogICAgICAgIHZhbHVlID0gZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKTsKICAgICAgfQogICAgICBjbG9zZShuZXcgSFJldHVybihfYWJzdHJhY3RWYWx1ZURvbWFpbiwgdmFsdWUsCiAgICAgICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZFJldHVybihmdW5jdGlvbk5vZGUpKSkKICAgICAgICAgIC5hZGRTdWNjZXNzb3IoZ3JhcGguZXhpdCk7CiAgICB9CiAgICAvLyBUT0RPKHNyYSk6IEhhbmRsZSBKUy1pbnRlcm9wIG1ldGhvZHMuCiAgICBfY2xvc2VGdW5jdGlvbigpOwogIH0KCiAgdm9pZCBfYWRkSW1wbGljaXRJbnN0YW50aWF0aW9uKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlICE9IG51bGwpIHsKICAgICAgX2N1cnJlbnRJbXBsaWNpdEluc3RhbnRpYXRpb25zLmFkZCh0eXBlKTsKICAgIH0KICB9CgogIHZvaWQgX3JlbW92ZUltcGxpY2l0SW5zdGFudGlhdGlvbihEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSAhPSBudWxsKSB7CiAgICAgIF9jdXJyZW50SW1wbGljaXRJbnN0YW50aWF0aW9ucy5yZW1vdmVMYXN0KCk7CiAgICB9CiAgfQoKICBUYXJnZXRDaGVja3MgX2NoZWNrc0ZvckZ1bmN0aW9uKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKSB7CiAgICBpZiAoIWZ1bmN0aW9uLmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgLy8gU3RhdGljIG1ldGhvZHMgd2l0aCBubyB0ZWFyLW9mZiBjYW4gYmUgZ2VuZXJhdGVkIHdpdGggbm8gY2hlY2tzLgogICAgICBNZW1iZXJBY2Nlc3MgYWNjZXNzID0gY2xvc2VkV29ybGQuZ2V0TWVtYmVyQWNjZXNzKGZ1bmN0aW9uKTsKICAgICAgaWYgKGFjY2VzcyAhPSBudWxsICYmIGFjY2Vzcy5yZWFkcy5pc0VtcHR5KSB7CiAgICAgICAgcmV0dXJuIFRhcmdldENoZWNrcy5ub25lOwogICAgICB9CiAgICB9CiAgICAvLyBUT0RPKHNyYSk6IEluc3RhbmNlIG1ldGhvZHMgY2FuIGJlIGdlbmVyYXRlZCB3aXRoIHJlZHVjZWQgY2hlY2tzIGlmCiAgICAvLyBjYWxsZWQgb25seSBmcm9tIG5vbi1keW5hbWljIGNhbGwtc2l0ZXMuCiAgICByZXR1cm4gVGFyZ2V0Q2hlY2tzLmR5bmFtaWNDaGVja3M7CiAgfQoKICB2b2lkIF9vcGVuRnVuY3Rpb24oTWVtYmVyRW50aXR5IG1lbWJlciwKICAgICAge2lyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbk5vZGUsCiAgICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgIFRhcmdldENoZWNrcyBjaGVja3N9KSB7CiAgICBhc3NlcnQoY2hlY2tzICE9IG51bGwpOwoKICAgIE1hcDxMb2NhbCwgQWJzdHJhY3RWYWx1ZT4gcGFyYW1ldGVyTWFwID0ge307CiAgICBMaXN0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IGVsaWRlZFBhcmFtZXRlcnMgPSBbXTsKICAgIFNldDxMb2NhbD4gZWxpZGVkUGFyYW1ldGVyU2V0ID0gbmV3IFNldCgpOwogICAgaWYgKGZ1bmN0aW9uTm9kZSAhPSBudWxsKSB7CiAgICAgIGFzc2VydChwYXJhbWV0ZXJTdHJ1Y3R1cmUgIT0gbnVsbCk7CgogICAgICB2b2lkIGhhbmRsZVBhcmFtZXRlcihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUsCiAgICAgICAgICB7Ym9vbCBpc09wdGlvbmFsLCBib29sIGlzRWxpZGVkfSkgewogICAgICAgIExvY2FsIGxvY2FsID0gX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKG5vZGUpOwogICAgICAgIGlmIChpc0VsaWRlZCkgewogICAgICAgICAgZWxpZGVkUGFyYW1ldGVycy5hZGQobm9kZSk7CiAgICAgICAgICBlbGlkZWRQYXJhbWV0ZXJTZXQuYWRkKGxvY2FsKTsKICAgICAgICB9CiAgICAgICAgcGFyYW1ldGVyTWFwW2xvY2FsXSA9CiAgICAgICAgICAgIF90eXBlSW5mZXJlbmNlTWFwLmdldEluZmVycmVkVHlwZU9mUGFyYW1ldGVyKGxvY2FsKTsKICAgICAgfQoKICAgICAgZm9yRWFjaE9yZGVyZWRQYXJhbWV0ZXJCeUZ1bmN0aW9uTm9kZSgKICAgICAgICAgIGZ1bmN0aW9uTm9kZSwgcGFyYW1ldGVyU3RydWN0dXJlLCBoYW5kbGVQYXJhbWV0ZXIpOwoKICAgICAgX3JldHVyblR5cGUgPSBfZWxlbWVudE1hcC5nZXREYXJ0VHlwZShmdW5jdGlvbk5vZGUucmV0dXJuVHlwZSk7CiAgICB9CgogICAgSEJhc2ljQmxvY2sgYmxvY2sgPSBncmFwaC5hZGROZXdCbG9jaygpOwogICAgLy8gQ3JlYXRlIGBncmFwaC5lbnRyeWAgYXMgYW4gaW5pdGlhbGx5IGVtcHR5IGJsb2NrLiBgZ3JhcGguZW50cnlgIGlzCiAgICAvLyB0cmVhdGVkIHNwZWNpYWxseSAoaG9sZGluZyBwYXJhbWV0ZXJzLCBsb2NhbCB2YXJpYWJsZXMgYW5kIGNvbnN0YW50cykKICAgIC8vIGJ1dCBjYW5ub3QgcmVjZWl2ZSBjb25zdGFudHMgYmVmb3JlIGl0IGhhcyBiZWVuIGNsb3NlZC4gQnkgY2xvc2luZyBpdAogICAgLy8gaGVyZSwgd2UgY2FuIHVzZSBjb25zdGFudHMgaW4gdGhlIGNvZGUgdGhhdCBzZXRzIHVwIHRoZSBmdW5jdGlvbi4KICAgIG9wZW4oZ3JhcGguZW50cnkpOwogICAgY2xvc2UobmV3IEhHb3RvKF9hYnN0cmFjdFZhbHVlRG9tYWluKSkuYWRkU3VjY2Vzc29yKGJsb2NrKTsKICAgIG9wZW4oYmxvY2spOwoKICAgIGxvY2Fsc0hhbmRsZXIuc3RhcnRGdW5jdGlvbigKICAgICAgICB0YXJnZXRFbGVtZW50LAogICAgICAgIF9jbG9zdXJlRGF0YUxvb2t1cC5nZXRTY29wZUluZm8odGFyZ2V0RWxlbWVudCksCiAgICAgICAgX2Nsb3N1cmVEYXRhTG9va3VwLmdldENhcHR1cmVkU2NvcGUodGFyZ2V0RWxlbWVudCksCiAgICAgICAgcGFyYW1ldGVyTWFwLAogICAgICAgIGVsaWRlZFBhcmFtZXRlclNldCwKICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkRGVjbGFyYXRpb24odGFyZ2V0RWxlbWVudCksCiAgICAgICAgaXNHZW5lcmF0aXZlQ29uc3RydWN0b3JCb2R5OiB0YXJnZXRFbGVtZW50IGlzIENvbnN0cnVjdG9yQm9keUVudGl0eSk7CgogICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUgaW4gZWxpZGVkUGFyYW1ldGVycykgewogICAgICBMb2NhbCBsb2NhbCA9IF9sb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZShub2RlKTsKICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChsb2NhbCwgX2RlZmF1bHRWYWx1ZUZvclBhcmFtZXRlcihub2RlKSk7CiAgICB9CgogICAgX2FkZENsYXNzVHlwZVZhcmlhYmxlc0lmTmVlZGVkKG1lbWJlcik7CiAgICBfYWRkRnVuY3Rpb25UeXBlVmFyaWFibGVzSWZOZWVkZWQobWVtYmVyKTsKCiAgICBpZiAoZnVuY3Rpb25Ob2RlICE9IG51bGwpIHsKICAgICAgX3BvdGVudGlhbGx5QWRkRnVuY3Rpb25QYXJhbWV0ZXJUeXBlQ2hlY2tzKGZ1bmN0aW9uTm9kZSwgY2hlY2tzKTsKICAgIH0KICAgIF9pbnNlcnRDb3ZlcmFnZUNhbGwobWVtYmVyKTsKICB9CgogIHZvaWQgX2Nsb3NlRnVuY3Rpb24oKSB7CiAgICBpZiAoIWlzQWJvcnRlZCgpKSBfY2xvc2VBbmRHb3RvRXhpdChuZXcgSEdvdG8oX2Fic3RyYWN0VmFsdWVEb21haW4pKTsKICAgIGdyYXBoLmZpbmFsaXplKF9hYnN0cmFjdFZhbHVlRG9tYWluKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdE5vZGUoaXIuTm9kZSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5oYW5kbGVkIG5vZGUgJG5vZGUgKCR7bm9kZS5ydW50aW1lVHlwZX0pIik7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBzb3VyY2UgZWxlbWVudC4gVGhpcyBpcyB1c2VkIGJ5IHRoZSB0eXBlIGJ1aWxkZXIuCiAgLy8gVE9ETyhlZm9ydHVuYSk6IFVwZGF0ZSB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IGlubGluaW5nLgogIC8vIFRPRE8oc3JhKTogUmUtaW1wbGVtZW50IHR5cGUgYnVpbGRlciB1c2luZyBLZXJuZWwgdHlwZXMgYW5kIHRoZQogIC8vIGB0YXJnZXRgIGZvciBjb250ZXh0LgogIE1lbWJlckVudGl0eSBnZXQgc291cmNlRWxlbWVudCA9PiBfY3VycmVudEZyYW1lLm1lbWJlcjsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkKGlyLkNoZWNrTGlicmFyeUlzTG9hZGVkIGNoZWNrTG9hZCkgewogICAgSW1wb3J0RW50aXR5IGltcG9ydCA9IF9lbGVtZW50TWFwLmdldEltcG9ydChjaGVja0xvYWQuaW1wb3J0KTsKICAgIFN0cmluZyBsb2FkSWQgPSBjbG9zZWRXb3JsZC5vdXRwdXRVbml0RGF0YS5nZXRJbXBvcnREZWZlck5hbWUoCiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3Bhbm5hYmxlKHRhcmdldEVsZW1lbnQsIGNoZWNrTG9hZCksIGltcG9ydCk7CiAgICBISW5zdHJ1Y3Rpb24gcHJlZml4Q29uc3RhbnQgPSBncmFwaC5hZGRDb25zdGFudFN0cmluZyhsb2FkSWQsIGNsb3NlZFdvcmxkKTsKICAgIEhJbnN0cnVjdGlvbiB1cmlDb25zdGFudCA9CiAgICAgICAgZ3JhcGguYWRkQ29uc3RhbnRTdHJpbmcoJyR7aW1wb3J0LnVyaX0nLCBjbG9zZWRXb3JsZCk7CiAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmNoZWNrRGVmZXJyZWRJc0xvYWRlZCwKICAgICAgICBbcHJlZml4Q29uc3RhbnQsIHVyaUNvbnN0YW50XSwKICAgICAgICBfdHlwZUluZmVyZW5jZU1hcAogICAgICAgICAgICAuZ2V0UmV0dXJuVHlwZU9mKF9jb21tb25FbGVtZW50cy5jaGVja0RlZmVycmVkSXNMb2FkZWQpLAogICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TG9hZExpYnJhcnkoaXIuTG9hZExpYnJhcnkgbG9hZExpYnJhcnkpIHsKICAgIFN0cmluZyBsb2FkSWQgPSBjbG9zZWRXb3JsZC5vdXRwdXRVbml0RGF0YS5nZXRJbXBvcnREZWZlck5hbWUoCiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3Bhbm5hYmxlKHRhcmdldEVsZW1lbnQsIGxvYWRMaWJyYXJ5KSwKICAgICAgICBfZWxlbWVudE1hcC5nZXRJbXBvcnQobG9hZExpYnJhcnkuaW1wb3J0KSk7CiAgICAvLyBUT0RPKGVmb3J0dW5hKTogU291cmNlIGluZm9ybWF0aW9uIQogICAgcHVzaChuZXcgSEludm9rZVN0YXRpYygKICAgICAgICBfY29tbW9uRWxlbWVudHMubG9hZERlZmVycmVkTGlicmFyeSwKICAgICAgICA8SEluc3RydWN0aW9uPltncmFwaC5hZGRDb25zdGFudFN0cmluZyhsb2FkSWQsIGNsb3NlZFdvcmxkKV0sCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4ubm9uTnVsbFR5cGUsCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgIHRhcmdldENhblRocm93OiBmYWxzZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJsb2NrKGlyLkJsb2NrIGJsb2NrKSB7CiAgICBhc3NlcnQoIWlzQWJvcnRlZCgpKTsKICAgIGlmICghX2lzUmVhY2hhYmxlKSByZXR1cm47IC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gaW5saW5pbmcuCiAgICBmb3IgKGlyLlN0YXRlbWVudCBzdGF0ZW1lbnQgaW4gYmxvY2suc3RhdGVtZW50cykgewogICAgICBzdGF0ZW1lbnQuYWNjZXB0KHRoaXMpOwogICAgICBpZiAoIV9pc1JlYWNoYWJsZSkgewogICAgICAgIC8vIFRoZSBibG9jayBoYXMgYmVlbiBhYm9ydGVkIGJ5IGEgcmV0dXJuIG9yIGEgdGhyb3cuCiAgICAgICAgaWYgKHN0YWNrLmlzTm90RW1wdHkpIHsKICAgICAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3IoCiAgICAgICAgICAgICAgTk9fTE9DQVRJT05fU1BBTk5BQkxFLCAnTm9uLWVtcHR5IGluc3RydWN0aW9uIHN0YWNrLicpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIGFzc2VydCghY3VycmVudC5pc0Nsb3NlZCgpKTsKICAgIGlmIChzdGFjay5pc05vdEVtcHR5KSB7CiAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3IoCiAgICAgICAgICBOT19MT0NBVElPTl9TUEFOTkFCTEUsICdOb24tZW1wdHkgaW5zdHJ1Y3Rpb24gc3RhY2snKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRFbXB0eVN0YXRlbWVudChpci5FbXB0eVN0YXRlbWVudCBub2RlKSB7CiAgICAvLyBFbXB0eSBzdGF0ZW1lbnQgYWRkcyBubyBpbnN0cnVjdGlvbnMgdG8gY3VycmVudCBibG9jay4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KGlyLkV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKCFfaXNSZWFjaGFibGUpIHJldHVybjsKICAgIGlyLkV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG5vZGUuZXhwcmVzc2lvbjsKICAgIGlmIChleHByZXNzaW9uIGlzIGlyLlRocm93ICYmIF9pbmxpbmluZ1N0YWNrLmlzRW1wdHkpIHsKICAgICAgX3Zpc2l0VGhyb3dFeHByZXNzaW9uKGV4cHJlc3Npb24uZXhwcmVzc2lvbik7CiAgICAgIF9oYW5kbGVJblRyeVN0YXRlbWVudCgpOwogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkVGhyb3cobm9kZS5leHByZXNzaW9uKTsKICAgICAgX2Nsb3NlQW5kR290b0V4aXQoCiAgICAgICAgICBuZXcgSFRocm93KF9hYnN0cmFjdFZhbHVlRG9tYWluLCBwb3AoKSwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIGV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwogICAgICBwb3AoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oaXIuQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKG5vZGUpOwogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRHZXQobm9kZSk7CiAgICBpZiAoIWNsb3NlZFdvcmxkLm91dHB1dFVuaXREYXRhCiAgICAgICAgLmhhc09ubHlOb25EZWZlcnJlZEltcG9ydFBhdGhzVG9Db25zdGFudCh0YXJnZXRFbGVtZW50LCB2YWx1ZSkpIHsKICAgICAgT3V0cHV0VW5pdCBvdXRwdXRVbml0ID0KICAgICAgICAgIGNsb3NlZFdvcmxkLm91dHB1dFVuaXREYXRhLm91dHB1dFVuaXRGb3JDb25zdGFudCh2YWx1ZSk7CiAgICAgIENvbnN0YW50VmFsdWUgZGVmZXJyZWRDb25zdGFudCA9CiAgICAgICAgICBuZXcgRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlKHZhbHVlLCBvdXRwdXRVbml0KTsKICAgICAgcmVnaXN0cnkucmVnaXN0ZXJDb25zdGFudFVzZShuZXcgQ29uc3RhbnRVc2UuZGVmZXJyZWQoZGVmZXJyZWRDb25zdGFudCkpOwogICAgICBzdGFjay5hZGQoZ3JhcGguYWRkRGVmZXJyZWRDb25zdGFudCgKICAgICAgICAgIGRlZmVycmVkQ29uc3RhbnQsIHNvdXJjZUluZm9ybWF0aW9uLCBjbG9zZWRXb3JsZCkpOwogICAgfSBlbHNlIHsKICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50KHZhbHVlLCBjbG9zZWRXb3JsZCwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJldHVyblN0YXRlbWVudChpci5SZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRSZXR1cm4obm9kZSk7CiAgICBISW5zdHJ1Y3Rpb24gdmFsdWU7CiAgICBpZiAobm9kZS5leHByZXNzaW9uID09IG51bGwpIHsKICAgICAgdmFsdWUgPSBncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpOwogICAgfSBlbHNlIHsKICAgICAgbm9kZS5leHByZXNzaW9uLmFjY2VwdCh0aGlzKTsKICAgICAgdmFsdWUgPSBwb3AoKTsKICAgICAgaWYgKF9jdXJyZW50RnJhbWUuYXN5bmNNYXJrZXIgPT0gQXN5bmNNYXJrZXIuQVNZTkMpIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJcyB0aGlzIHNwZWNpYWwtY2FzaW5nIG9mIGFzeW5jIHN0aWxsIG5lZWRlZAogICAgICAgIC8vIG9yIHNob3VsZCB3ZSB1c2UgdGhlIGdlbmVyYWwgY2hlY2sgYmVsb3c/CiAgICAgICAgLyppZiAob3B0aW9ucy5lbmFibGVUeXBlQXNzZXJ0aW9ucyAmJgogICAgICAgICAgICAhaXNWYWxpZEFzeW5jUmV0dXJuVHlwZShfcmV0dXJuVHlwZSkpIHsKICAgICAgICAgIGdlbmVyYXRlVHlwZUVycm9yKAogICAgICAgICAgICAgICJBc3luYyBmdW5jdGlvbiByZXR1cm5lZCBhIEZ1dHVyZSwiCiAgICAgICAgICAgICAgIiB3YXMgZGVjbGFyZWQgdG8gcmV0dXJuIGEgJHtfcmV0dXJuVHlwZX0uIiwKICAgICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgICBwb3AoKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9Ki8KICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZSA9IF90eXBlQnVpbGRlci5wb3RlbnRpYWxseUNoZWNrT3JUcnVzdFR5cGVPZkFzc2lnbm1lbnQoCiAgICAgICAgICAgIF9jdXJyZW50RnJhbWUubWVtYmVyLCB2YWx1ZSwgX3JldHVyblR5cGUpOwogICAgICB9CiAgICB9CiAgICBfaGFuZGxlSW5UcnlTdGF0ZW1lbnQoKTsKICAgIGlmIChfaW5saW5pbmdTdGFjay5pc0VtcHR5ICYmIHRhcmdldEVsZW1lbnQuaXNTZXR0ZXIpIHsKICAgICAgaWYgKG5vZGUucGFyZW50IGlzIGlyLkZ1bmN0aW9uTm9kZSkgewogICAgICAgIC8vIEFuIGFycm93IGZ1bmN0aW9uIGRlZmluaXRpb24gb2YgYSBzZXR0ZXIgaGFzIGEgUmV0dXJuU3RhdGVtbnQgYXMgYQogICAgICAgIC8vIGJvZHksIGUuZy4gInNldCBmb28oeCkgPT4gdGhpcy5feCA9IHg7Ii4gVGhlcmUgaXMgbm8gd2F5IHRvIGFjY2VzcwogICAgICAgIC8vIHRoZSByZXR1cm5lZCB2YWx1ZSwgc28gZG9uJ3QgZW1pdCBhIHJldHVybi4KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIF9lbWl0UmV0dXJuKHZhbHVlLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Rm9yU3RhdGVtZW50KGlyLkZvclN0YXRlbWVudCBub2RlKSB7CiAgICBhc3NlcnQoX2lzUmVhY2hhYmxlKTsKICAgIGFzc2VydChub2RlLmJvZHkgIT0gbnVsbCk7CiAgICB2b2lkIGJ1aWxkSW5pdGlhbGl6ZXIoKSB7CiAgICAgIGZvciAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiBpbiBub2RlLnZhcmlhYmxlcykgewogICAgICAgIGRlY2xhcmF0aW9uLmFjY2VwdCh0aGlzKTsKICAgICAgfQogICAgfQoKICAgIEhJbnN0cnVjdGlvbiBidWlsZENvbmRpdGlvbigpIHsKICAgICAgaWYgKG5vZGUuY29uZGl0aW9uID09IG51bGwpIHsKICAgICAgICByZXR1cm4gZ3JhcGguYWRkQ29uc3RhbnRCb29sKHRydWUsIGNsb3NlZFdvcmxkKTsKICAgICAgfQogICAgICBub2RlLmNvbmRpdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgIHJldHVybiBwb3BCb29saWZpZWQoKTsKICAgIH0KCiAgICB2b2lkIGJ1aWxkVXBkYXRlKCkgewogICAgICBmb3IgKGlyLkV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBub2RlLnVwZGF0ZXMpIHsKICAgICAgICBleHByZXNzaW9uLmFjY2VwdCh0aGlzKTsKICAgICAgICBhc3NlcnQoIWlzQWJvcnRlZCgpKTsKICAgICAgICAvLyBUaGUgcmVzdWx0IG9mIHRoZSB1cGRhdGUgaW5zdHJ1Y3Rpb24gaXNuJ3QgdXNlZCwgYW5kIGNhbiBqdXN0CiAgICAgICAgLy8gYmUgZHJvcHBlZC4KICAgICAgICBwb3AoKTsKICAgICAgfQogICAgfQoKICAgIHZvaWQgYnVpbGRCb2R5KCkgewogICAgICBub2RlLmJvZHkuYWNjZXB0KHRoaXMpOwogICAgfQoKICAgIEp1bXBUYXJnZXQganVtcFRhcmdldCA9IF9sb2NhbHNNYXAuZ2V0SnVtcFRhcmdldEZvckZvcihub2RlKTsKICAgIF9sb29wSGFuZGxlci5oYW5kbGVMb29wKAogICAgICAgIG5vZGUsCiAgICAgICAgX2Nsb3N1cmVEYXRhTG9va3VwLmdldENhcHR1cmVkTG9vcFNjb3BlKG5vZGUpLAogICAgICAgIGp1bXBUYXJnZXQsCiAgICAgICAgYnVpbGRJbml0aWFsaXplciwKICAgICAgICBidWlsZENvbmRpdGlvbiwKICAgICAgICBidWlsZFVwZGF0ZSwKICAgICAgICBidWlsZEJvZHksCiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZExvb3Aobm9kZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZvckluU3RhdGVtZW50KGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIGlmIChub2RlLmlzQXN5bmMpIHsKICAgICAgX2J1aWxkQXN5bmNGb3JJbihub2RlKTsKICAgIH0gZWxzZSBpZiAoX3R5cGVJbmZlcmVuY2VNYXAuaXNKc0luZGV4YWJsZUl0ZXJhdG9yKAogICAgICAgIG5vZGUsIF9hYnN0cmFjdFZhbHVlRG9tYWluKSkgewogICAgICAvLyBJZiB0aGUgZXhwcmVzc2lvbiBiZWluZyBpdGVyYXRlZCBvdmVyIGlzIGEgSlMgaW5kZXhhYmxlIHR5cGUsIHdlIGNhbgogICAgICAvLyBnZW5lcmF0ZSBhbiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBmb3ItaW4gdGhhdCB1c2VzIGluZGV4aW5nLgogICAgICBfYnVpbGRGb3JJbkluZGV4YWJsZShub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIF9idWlsZEZvckluSXRlcmF0b3Iobm9kZSk7CiAgICB9CiAgfQoKICAvLy8gQnVpbGRzIHRoZSBncmFwaCBmb3IgYSBmb3ItaW4gbm9kZSB3aXRoIGFuIGluZGV4YWJsZSBleHByZXNzaW9uLgogIC8vLwogIC8vLyBJbiB0aGlzIGNhc2Ugd2UgYnVpbGQ6CiAgLy8vCiAgLy8vICAgIGludCBlbmQgPSBhLmxlbmd0aDsKICAvLy8gICAgZm9yIChpbnQgaSA9IDA7CiAgLy8vICAgICAgICAgaSA8IGEubGVuZ3RoOwogIC8vLyAgICAgICAgIGNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKGEubGVuZ3RoID09IGVuZCwgYSksICsraSkgewogIC8vLyAgICAgIDxkZWNsYXJlZElkZW50aWZpZXI+ID0gYVtpXTsKICAvLy8gICAgICA8Ym9keT4KICAvLy8gICAgfQogIHZvaWQgX2J1aWxkRm9ySW5JbmRleGFibGUoaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgU3ludGhldGljTG9jYWwgaW5kZXhWYXJpYWJsZSA9IGxvY2Fsc0hhbmRsZXIuY3JlYXRlTG9jYWwoJ19pJyk7CgogICAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSBzaGFyZWQgYnkgaW5pdGlhbGl6ZXIsIGNvbmRpdGlvbiwgYm9keSBhbmQgdXBkYXRlLgogICAgSEluc3RydWN0aW9uIGFycmF5OyAvLyBTZXQgaW4gYnVpbGRJbml0aWFsaXplci4KICAgIGJvb2wgaXNGaXhlZDsgLy8gU2V0IGluIGJ1aWxkSW5pdGlhbGl6ZXIuCiAgICBISW5zdHJ1Y3Rpb24gb3JpZ2luYWxMZW5ndGggPSBudWxsOyAvLyBTZXQgZm9yIGdyb3dhYmxlIGxpc3RzLgoKICAgIEhJbnN0cnVjdGlvbiBidWlsZEdldExlbmd0aChTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgICBIR2V0TGVuZ3RoIHJlc3VsdCA9IG5ldyBIR2V0TGVuZ3RoKAogICAgICAgICAgYXJyYXksIF9hYnN0cmFjdFZhbHVlRG9tYWluLnBvc2l0aXZlSW50VHlwZSwKICAgICAgICAgIGlzQXNzaWduYWJsZTogIWlzRml4ZWQpCiAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgICBhZGQocmVzdWx0KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICB2b2lkIGJ1aWxkQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yQ2hlY2soKSB7CiAgICAgIGlmIChvcmlnaW5hbExlbmd0aCA9PSBudWxsKSByZXR1cm47CiAgICAgIC8vIFRoZSBzdGF0aWMgY2FsbCBjaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcigpIGlzIGV4cGFuZGVkIGluCiAgICAgIC8vIGNvZGVnZW4gdG86CiAgICAgIC8vCiAgICAgIC8vICAgICBhcnJheS5sZW5ndGggPT0gX2VuZCB8fCB0aHJvd0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcihhcnJheSkKICAgICAgLy8KICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEZvckluTW92ZU5leHQobm9kZSk7CiAgICAgIEhJbnN0cnVjdGlvbiBsZW5ndGggPSBidWlsZEdldExlbmd0aChzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIHB1c2gobmV3IEhJZGVudGl0eSgKICAgICAgICAgIGxlbmd0aCwgb3JpZ2luYWxMZW5ndGgsIG51bGwsIF9hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlKQogICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgIF9jb21tb25FbGVtZW50cy5jaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvciwKICAgICAgICAgIFtwb3AoKSwgYXJyYXldLAogICAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAuZ2V0UmV0dXJuVHlwZU9mKAogICAgICAgICAgICAgIF9jb21tb25FbGVtZW50cy5jaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvciksCiAgICAgICAgICBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgICBwb3AoKTsKICAgIH0KCiAgICB2b2lkIGJ1aWxkSW5pdGlhbGl6ZXIoKSB7CiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRGb3JJbkl0ZXJhdG9yKG5vZGUpOwoKICAgICAgbm9kZS5pdGVyYWJsZS5hY2NlcHQodGhpcyk7CiAgICAgIGFycmF5ID0gcG9wKCk7CiAgICAgIGlzRml4ZWQgPSBfYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgLmlzRml4ZWRMZW5ndGhKc0luZGV4YWJsZShhcnJheS5pbnN0cnVjdGlvblR5cGUpCiAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZTsKICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbCgKICAgICAgICAgIGluZGV4VmFyaWFibGUsIGdyYXBoLmFkZENvbnN0YW50SW50KDAsIGNsb3NlZFdvcmxkKSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIG9yaWdpbmFsTGVuZ3RoID0gYnVpbGRHZXRMZW5ndGgoc291cmNlSW5mb3JtYXRpb24pOwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiBidWlsZENvbmRpdGlvbigpIHsKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEZvckluTW92ZU5leHQobm9kZSk7CiAgICAgIEhJbnN0cnVjdGlvbiBpbmRleCA9IGxvY2Fsc0hhbmRsZXIucmVhZExvY2FsKGluZGV4VmFyaWFibGUsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgICBISW5zdHJ1Y3Rpb24gbGVuZ3RoID0gYnVpbGRHZXRMZW5ndGgoc291cmNlSW5mb3JtYXRpb24pOwogICAgICBISW5zdHJ1Y3Rpb24gY29tcGFyZSA9CiAgICAgICAgICBuZXcgSExlc3MoaW5kZXgsIGxlbmd0aCwgbnVsbCwgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpCiAgICAgICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgYWRkKGNvbXBhcmUpOwogICAgICByZXR1cm4gY29tcGFyZTsKICAgIH0KCiAgICB2b2lkIGJ1aWxkQm9keSgpIHsKICAgICAgLy8gSWYgd2UgaGFkIG1lY2hhbmljYWxseSBpbmxpbmVkIEFycmF5SXRlcmF0b3IubW92ZU5leHQoKSwgaXQgd291bGQgaGF2ZQogICAgICAvLyBpbnNlcnRlZCB0aGUgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yIGNoZWNrIGFzIHBhcnQgb2YgdGhlCiAgICAgIC8vIGNvbmRpdGlvbi4gIEl0IGlzIG5vdCBuZWNlc3Nhcnkgb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiBzaW5jZSB0aGVyZSBpcwogICAgICAvLyBubyBjb2RlIGJldHdlZW4gY2FsbHMgdG8gYGdldCBpdGVyYXRvcmAgYW5kIGBtb3ZlTmV4dGAsIHNvIHRoZSB0ZXN0IGlzCiAgICAgIC8vIG1vdmVkIHRvIHRoZSBsb29wIHVwZGF0ZS4KCiAgICAgIC8vIEZpbmQgYSB0eXBlIGZvciB0aGUgZWxlbWVudC4gVXNlIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGluZGV4ZXIgb2YgdGhlCiAgICAgIC8vIGFycmF5LCBhcyB0aGlzIGlzIHN0cm9uZ2VyIHRoYW4gdGhlIGl0ZXJhdG9yJ3MgYGdldCBjdXJyZW50YCB0eXBlLCBmb3IKICAgICAgLy8gZXhhbXBsZSwgYGdldCBjdXJyZW50YCBpbmNsdWRlcyBudWxsLgogICAgICAvLyBUT0RPKHNyYSk6IFRoZSBlbGVtZW50IHR5cGUgb2YgYSBjb250YWluZXIgdHlwZSBtYXNrIG1pZ2h0IGJlIGJldHRlci4KICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlID0gX3R5cGVJbmZlcmVuY2VNYXAuaW5mZXJyZWRJbmRleFR5cGUobm9kZSk7CgogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkRm9ySW5DdXJyZW50KG5vZGUpOwogICAgICBISW5zdHJ1Y3Rpb24gaW5kZXggPSBsb2NhbHNIYW5kbGVyLnJlYWRMb2NhbChpbmRleFZhcmlhYmxlLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgSEluc3RydWN0aW9uIHZhbHVlID0gbmV3IEhJbmRleChhcnJheSwgaW5kZXgsIG51bGwsIHR5cGUpCiAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgICBhZGQodmFsdWUpOwoKICAgICAgTG9jYWwgbG9vcFZhcmlhYmxlTG9jYWwgPSBfbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUobm9kZS52YXJpYWJsZSk7CiAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwobG9vcFZhcmlhYmxlTG9jYWwsIHZhbHVlLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgLy8gSGludCB0byBuYW1lIGxvb3AgdmFsdWUgYWZ0ZXIgbmFtZSBvZiBsb29wIHZhcmlhYmxlLgogICAgICBpZiAobG9vcFZhcmlhYmxlTG9jYWwgaXMhIFN5bnRoZXRpY0xvY2FsKSB7CiAgICAgICAgdmFsdWUuc291cmNlRWxlbWVudCA/Pz0gbG9vcFZhcmlhYmxlTG9jYWw7CiAgICAgIH0KCiAgICAgIG5vZGUuYm9keS5hY2NlcHQodGhpcyk7CiAgICB9CgogICAgdm9pZCBidWlsZFVwZGF0ZSgpIHsKICAgICAgLy8gU2VlIGJ1aWxkQm9keSBhcyB0byB3aHkgd2UgY2hlY2sgaGVyZS4KICAgICAgYnVpbGRDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3JDaGVjaygpOwoKICAgICAgLy8gVE9ETyhzcmEpOiBJdCB3b3VsZCBiZSBzbGlnaHRseSBzaG9ydGVyIHRvIGdlbmVyYXRlIGBhW2krK11gIGluIHRoZQogICAgICAvLyBib2R5IChhbmQgdGhhdCBtb3JlIGNsb3NlbHkgZm9sbG93cyB3aGF0IGFuIGlubGluZWQgaXRlcmF0b3Igd291bGQgZG8pCiAgICAgIC8vIGJ1dCB0aGUgY29kZSBpcyBob3JyaWJsZSBhcyBgaSsxYCBpcyBjYXJyaWVkIGFyb3VuZCB0aGUgbG9vcCBpbiBhbgogICAgICAvLyBhZGRpdGlvbmFsIHZhcmlhYmxlLgogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkRm9ySW5TZXQobm9kZSk7CiAgICAgIEhJbnN0cnVjdGlvbiBpbmRleCA9IGxvY2Fsc0hhbmRsZXIucmVhZExvY2FsKGluZGV4VmFyaWFibGUsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgICBISW5zdHJ1Y3Rpb24gb25lID0gZ3JhcGguYWRkQ29uc3RhbnRJbnQoMSwgY2xvc2VkV29ybGQpOwogICAgICBISW5zdHJ1Y3Rpb24gYWRkSW5zdHJ1Y3Rpb24gPQogICAgICAgICAgbmV3IEhBZGQoaW5kZXgsIG9uZSwgbnVsbCwgX2Fic3RyYWN0VmFsdWVEb21haW4ucG9zaXRpdmVJbnRUeXBlKQogICAgICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICAgIGFkZChhZGRJbnN0cnVjdGlvbik7CiAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwoaW5kZXhWYXJpYWJsZSwgYWRkSW5zdHJ1Y3Rpb24sCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgfQoKICAgIF9sb29wSGFuZGxlci5oYW5kbGVMb29wKAogICAgICAgIG5vZGUsCiAgICAgICAgX2Nsb3N1cmVEYXRhTG9va3VwLmdldENhcHR1cmVkTG9vcFNjb3BlKG5vZGUpLAogICAgICAgIF9sb2NhbHNNYXAuZ2V0SnVtcFRhcmdldEZvckZvckluKG5vZGUpLAogICAgICAgIGJ1aWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgYnVpbGRDb25kaXRpb24sCiAgICAgICAgYnVpbGRVcGRhdGUsCiAgICAgICAgYnVpbGRCb2R5LAogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRMb29wKG5vZGUpKTsKICB9CgogIHZvaWQgX2J1aWxkRm9ySW5JdGVyYXRvcihpci5Gb3JJblN0YXRlbWVudCBub2RlKSB7CiAgICAvLyBHZW5lcmF0ZSBhIHN0cnVjdHVyZSBlcXVpdmFsZW50IHRvOgogICAgLy8gICBJdGVyYXRvcjxFPiAkaXRlciA9IDxpdGVyYWJsZT4uaXRlcmF0b3I7CiAgICAvLyAgIHdoaWxlICgkaXRlci5tb3ZlTmV4dCgpKSB7CiAgICAvLyAgICAgPHZhcmlhYmxlPiA9ICRpdGVyLmN1cnJlbnQ7CiAgICAvLyAgICAgPGJvZHk+CiAgICAvLyAgIH0KCiAgICAvLyBUaGUgaXRlcmF0b3IgaXMgc2hhcmVkIGJldHdlZW4gaW5pdGlhbGl6ZXIsIGNvbmRpdGlvbiBhbmQgYm9keS4KICAgIEhJbnN0cnVjdGlvbiBpdGVyYXRvcjsKICAgIFN0YXRpY1R5cGUgaXRlcmF0b3JUeXBlID0gX2dldFN0YXRpY0ZvckluSXRlcmF0b3JUeXBlKG5vZGUpOwoKICAgIHZvaWQgYnVpbGRJbml0aWFsaXplcigpIHsKICAgICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGUgPSBfdHlwZUluZmVyZW5jZU1hcC50eXBlT2ZJdGVyYXRvcihub2RlKTsKICAgICAgbm9kZS5pdGVyYWJsZS5hY2NlcHQodGhpcyk7CiAgICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IHBvcCgpOwogICAgICBfcHVzaER5bmFtaWNJbnZvY2F0aW9uKAogICAgICAgICAgbm9kZSwKICAgICAgICAgIF9nZXRTdGF0aWNUeXBlKG5vZGUuaXRlcmFibGUpLAogICAgICAgICAgcmVjZWl2ZXJUeXBlLAogICAgICAgICAgU2VsZWN0b3JzLml0ZXJhdG9yLAogICAgICAgICAgPEhJbnN0cnVjdGlvbj5bcmVjZWl2ZXJdLAogICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEZvckluSXRlcmF0b3Iobm9kZSkpOwogICAgICBpdGVyYXRvciA9IHBvcCgpOwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiBidWlsZENvbmRpdGlvbigpIHsKICAgICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGUgPQogICAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAudHlwZU9mSXRlcmF0b3JNb3ZlTmV4dChub2RlKTsKICAgICAgX3B1c2hEeW5hbWljSW52b2NhdGlvbigKICAgICAgICAgIG5vZGUsCiAgICAgICAgICBpdGVyYXRvclR5cGUsCiAgICAgICAgICByZWNlaXZlclR5cGUsCiAgICAgICAgICBTZWxlY3RvcnMubW92ZU5leHQsCiAgICAgICAgICA8SEluc3RydWN0aW9uPltpdGVyYXRvcl0sCiAgICAgICAgICBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkRm9ySW5Nb3ZlTmV4dChub2RlKSk7CiAgICAgIHJldHVybiBwb3BCb29saWZpZWQoKTsKICAgIH0KCiAgICB2b2lkIGJ1aWxkQm9keSgpIHsKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEZvckluQ3VycmVudChub2RlKTsKICAgICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGUgPQogICAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAudHlwZU9mSXRlcmF0b3JDdXJyZW50KG5vZGUpOwogICAgICBfcHVzaER5bmFtaWNJbnZvY2F0aW9uKG5vZGUsIGl0ZXJhdG9yVHlwZSwgcmVjZWl2ZXJUeXBlLAogICAgICAgICAgU2VsZWN0b3JzLmN1cnJlbnQsIFtpdGVyYXRvcl0sIGNvbnN0IDxEYXJ0VHlwZT5bXSwgc291cmNlSW5mb3JtYXRpb24pOwoKICAgICAgTG9jYWwgbG9vcFZhcmlhYmxlTG9jYWwgPSBfbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUobm9kZS52YXJpYWJsZSk7CiAgICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IF90eXBlQnVpbGRlci5wb3RlbnRpYWxseUNoZWNrT3JUcnVzdFR5cGVPZkFzc2lnbm1lbnQoCiAgICAgICAgICBfY3VycmVudEZyYW1lLm1lbWJlciwgcG9wKCksIF9nZXREYXJ0VHlwZUlmVmFsaWQobm9kZS52YXJpYWJsZS50eXBlKSk7CiAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwobG9vcFZhcmlhYmxlTG9jYWwsIHZhbHVlLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgLy8gSGludCB0byBuYW1lIGxvb3AgdmFsdWUgYWZ0ZXIgbmFtZSBvZiBsb29wIHZhcmlhYmxlLgogICAgICBpZiAobG9vcFZhcmlhYmxlTG9jYWwgaXMhIFN5bnRoZXRpY0xvY2FsKSB7CiAgICAgICAgdmFsdWUuc291cmNlRWxlbWVudCA/Pz0gbG9vcFZhcmlhYmxlTG9jYWw7CiAgICAgIH0KICAgICAgbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICAgIH0KCiAgICBfbG9vcEhhbmRsZXIuaGFuZGxlTG9vcCgKICAgICAgICBub2RlLAogICAgICAgIF9jbG9zdXJlRGF0YUxvb2t1cC5nZXRDYXB0dXJlZExvb3BTY29wZShub2RlKSwKICAgICAgICBfbG9jYWxzTWFwLmdldEp1bXBUYXJnZXRGb3JGb3JJbihub2RlKSwKICAgICAgICBidWlsZEluaXRpYWxpemVyLAogICAgICAgIGJ1aWxkQ29uZGl0aW9uLAogICAgICAgICgpIHt9LAogICAgICAgIGJ1aWxkQm9keSwKICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkTG9vcChub2RlKSk7CiAgfQoKICB2b2lkIF9idWlsZEFzeW5jRm9ySW4oaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgLy8gVGhlIGFzeW5jLWZvciBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgU3RyZWFtSXRlcmF0b3IuCiAgICBISW5zdHJ1Y3Rpb24gc3RyZWFtSXRlcmF0b3I7CgogICAgbm9kZS5pdGVyYWJsZS5hY2NlcHQodGhpcyk7CgogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGFyZ3VtZW50cyA9IFtwb3AoKV07CiAgICBDbGFzc0VudGl0eSBjbHMgPSBfY29tbW9uRWxlbWVudHMuc3RyZWFtSXRlcmF0b3I7CiAgICBEYXJ0VHlwZSB0eXBlQXJnID0gX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS52YXJpYWJsZS50eXBlKTsKICAgIEludGVyZmFjZVR5cGUgaW5zdGFuY2VUeXBlID0KICAgICAgICBsb2NhbHNIYW5kbGVyLnN1YnN0SW5Db250ZXh0KG5ldyBJbnRlcmZhY2VUeXBlKGNscywgW3R5cGVBcmddKSk7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIHNob3VsZCBiZSB0aGUgZXhhY3QgdHlwZS4KICAgIFN0YXRpY1R5cGUgc3RhdGljSW5zdGFuY2VUeXBlID0KICAgICAgICBuZXcgU3RhdGljVHlwZShpbnN0YW5jZVR5cGUsIENsYXNzUmVsYXRpb24uc3VidHlwZSk7CiAgICBfYWRkSW1wbGljaXRJbnN0YW50aWF0aW9uKGluc3RhbmNlVHlwZSk7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEZvckluSXRlcmF0b3Iobm9kZSk7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBQYXNzIHR5cGUgYXJndW1lbnRzIHRvIGNvbnN0cnVjdG9ycyBsaWtlIGNhbGxpbmcKICAgIC8vIGEgZ2VuZXJpYyBtZXRob2QuCiAgICBpZiAoX3J0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoY2xzKSkgewogICAgICBfYWRkVHlwZUFyZ3VtZW50cyhhcmd1bWVudHMsIFt0eXBlQXJnXSwgc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPSBfY29tbW9uRWxlbWVudHMuc3RyZWFtSXRlcmF0b3JDb25zdHJ1Y3RvcjsKICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbihjb25zdHJ1Y3RvciwgYXJndW1lbnRzLAogICAgICAgIF90eXBlSW5mZXJlbmNlTWFwLmdldFJldHVyblR5cGVPZihjb25zdHJ1Y3RvciksIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICBpbnN0YW5jZVR5cGU6IGluc3RhbmNlVHlwZSwgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgICBzdHJlYW1JdGVyYXRvciA9IHBvcCgpOwoKICAgIHZvaWQgYnVpbGRJbml0aWFsaXplcigpIHt9CgogICAgSEluc3RydWN0aW9uIGJ1aWxkQ29uZGl0aW9uKCkgewogICAgICBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyVHlwZSA9CiAgICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC50eXBlT2ZJdGVyYXRvck1vdmVOZXh0KG5vZGUpOwogICAgICBfcHVzaER5bmFtaWNJbnZvY2F0aW9uKAogICAgICAgICAgbm9kZSwKICAgICAgICAgIHN0YXRpY0luc3RhbmNlVHlwZSwKICAgICAgICAgIHJlY2VpdmVyVHlwZSwKICAgICAgICAgIFNlbGVjdG9ycy5tb3ZlTmV4dCwKICAgICAgICAgIFtzdHJlYW1JdGVyYXRvcl0sCiAgICAgICAgICBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkRm9ySW5Nb3ZlTmV4dChub2RlKSk7CiAgICAgIEhJbnN0cnVjdGlvbiBmdXR1cmUgPSBwb3AoKTsKICAgICAgcHVzaChuZXcgSEF3YWl0KGZ1dHVyZSwgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpKTsKICAgICAgcmV0dXJuIHBvcEJvb2xpZmllZCgpOwogICAgfQoKICAgIHZvaWQgYnVpbGRCb2R5KCkgewogICAgICBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyVHlwZSA9CiAgICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC50eXBlT2ZJdGVyYXRvckN1cnJlbnQobm9kZSk7CiAgICAgIF9wdXNoRHluYW1pY0ludm9jYXRpb24oCiAgICAgICAgICBub2RlLAogICAgICAgICAgc3RhdGljSW5zdGFuY2VUeXBlLAogICAgICAgICAgcmVjZWl2ZXJUeXBlLAogICAgICAgICAgU2VsZWN0b3JzLmN1cnJlbnQsCiAgICAgICAgICBbc3RyZWFtSXRlcmF0b3JdLAogICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEZvckluSXRlcmF0b3Iobm9kZSkpOwogICAgICBsb2NhbHNIYW5kbGVyLnVwZGF0ZUxvY2FsKAogICAgICAgICAgX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKG5vZGUudmFyaWFibGUpLCBwb3AoKSk7CiAgICAgIG5vZGUuYm9keS5hY2NlcHQodGhpcyk7CiAgICB9CgogICAgdm9pZCBidWlsZFVwZGF0ZSgpIHt9CgogICAgLy8gQ3JlYXRlcyBhIHN5bnRoZXRpYyB0cnkvZmluYWxseSBibG9jayBpbiBjYXNlIGFueXRoaW5nIGFzeW5jIGdvZXMgYW1pc3MuCiAgICBUcnlDYXRjaEZpbmFsbHlCdWlsZGVyIHRyeUJ1aWxkZXIgPSBuZXcgVHJ5Q2F0Y2hGaW5hbGx5QnVpbGRlcigKICAgICAgICB0aGlzLCBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkTG9vcChub2RlKSk7CiAgICAvLyBCdWlsZCBmYWtlIHRyeSBib2R5OgogICAgX2xvb3BIYW5kbGVyLmhhbmRsZUxvb3AoCiAgICAgICAgbm9kZSwKICAgICAgICBfY2xvc3VyZURhdGFMb29rdXAuZ2V0Q2FwdHVyZWRMb29wU2NvcGUobm9kZSksCiAgICAgICAgX2xvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yRm9ySW4obm9kZSksCiAgICAgICAgYnVpbGRJbml0aWFsaXplciwKICAgICAgICBidWlsZENvbmRpdGlvbiwKICAgICAgICBidWlsZFVwZGF0ZSwKICAgICAgICBidWlsZEJvZHksCiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZExvb3Aobm9kZSkpOwoKICAgIHZvaWQgZmluYWxpemVyRnVuY3Rpb24oKSB7CiAgICAgIF9wdXNoRHluYW1pY0ludm9jYXRpb24oCiAgICAgICAgICBub2RlLAogICAgICAgICAgc3RhdGljSW5zdGFuY2VUeXBlLAogICAgICAgICAgbnVsbCwKICAgICAgICAgIFNlbGVjdG9ycy5jYW5jZWwsCiAgICAgICAgICBbc3RyZWFtSXRlcmF0b3JdLAogICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlcgogICAgICAgICAgICAgIC8vIGlnbm9yZTpkZXByZWNhdGVkX21lbWJlcl91c2VfZnJvbV9zYW1lX3BhY2thZ2UKICAgICAgICAgICAgICAuYnVpbGRHZW5lcmljKG5vZGUpKTsKICAgICAgYWRkKG5ldyBIQXdhaXQocG9wKCksIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlKSk7CiAgICB9CgogICAgdHJ5QnVpbGRlcgogICAgICAuLmNsb3NlVHJ5Qm9keSgpCiAgICAgIC4uYnVpbGRGaW5hbGx5QmxvY2soZmluYWxpemVyRnVuY3Rpb24pCiAgICAgIC4uY2xlYW5VcCgpOwogIH0KCiAgSEluc3RydWN0aW9uIF9jYWxsU2V0UnVudGltZVR5cGVJbmZvKEhJbnN0cnVjdGlvbiB0eXBlSW5mbywKICAgICAgSEluc3RydWN0aW9uIG5ld09iamVjdCwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIC8vIFNldCB0aGUgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIG9uIHRoZSBvYmplY3QuCiAgICBGdW5jdGlvbkVudGl0eSB0eXBlSW5mb1NldHRlckZuID0gX2NvbW1vbkVsZW1lbnRzLnNldFJ1bnRpbWVUeXBlSW5mbzsKICAgIC8vIFRPRE8oZWZvcnR1bmEpOiBJbnNlcnQgc291cmNlIGluZm9ybWF0aW9uIGluIHRoaXMgc3RhdGljIGludm9jYXRpb24uCiAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24odHlwZUluZm9TZXR0ZXJGbiwgPEhJbnN0cnVjdGlvbj5bbmV3T2JqZWN0LCB0eXBlSW5mb10sCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwoKICAgIC8vIFRoZSBuZXcgb2JqZWN0IHdpbGwgbm93IGJlIHJlZmVyZW5jZWQgdGhyb3VnaCB0aGUKICAgIC8vIGBzZXRSdW50aW1lVHlwZUluZm9gIGNhbGwuIFdlIHRoZXJlZm9yZSBzZXQgdGhlIHR5cGUgb2YgdGhhdAogICAgLy8gaW5zdHJ1Y3Rpb24gdG8gYmUgb2YgdGhlIG9iamVjdCdzIHR5cGUuCiAgICBhc3NlcnQoCiAgICAgICAgc3RhY2subGFzdCBpcyBISW52b2tlU3RhdGljIHx8IHN0YWNrLmxhc3QgPT0gbmV3T2JqZWN0LAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgICAiVW5leHBlY3RlZCBgc3RhY2subGFzdGA6IEZvdW5kICR7c3RhY2subGFzdH0sICIKICAgICAgICAgICAgImV4cGVjdGVkICR7bmV3T2JqZWN0fSBvciBhbiBISW52b2tlU3RhdGljLiAiCiAgICAgICAgICAgICJTdGF0ZTogdHlwZUluZm89JHR5cGVJbmZvLCBzdGFjaz0kc3RhY2suIikpOwogICAgc3RhY2subGFzdC5pbnN0cnVjdGlvblR5cGUgPSBuZXdPYmplY3QuaW5zdHJ1Y3Rpb25UeXBlOwogICAgcmV0dXJuIHBvcCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFdoaWxlU3RhdGVtZW50KGlyLldoaWxlU3RhdGVtZW50IG5vZGUpIHsKICAgIGFzc2VydChfaXNSZWFjaGFibGUpOwogICAgSEluc3RydWN0aW9uIGJ1aWxkQ29uZGl0aW9uKCkgewogICAgICBub2RlLmNvbmRpdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgIHJldHVybiBwb3BCb29saWZpZWQoKTsKICAgIH0KCiAgICBfbG9vcEhhbmRsZXIuaGFuZGxlTG9vcCgKICAgICAgICBub2RlLAogICAgICAgIF9jbG9zdXJlRGF0YUxvb2t1cC5nZXRDYXB0dXJlZExvb3BTY29wZShub2RlKSwKICAgICAgICBfbG9jYWxzTWFwLmdldEp1bXBUYXJnZXRGb3JXaGlsZShub2RlKSwKICAgICAgICAoKSB7fSwKICAgICAgICBidWlsZENvbmRpdGlvbiwKICAgICAgICAoKSB7fSwgKCkgewogICAgICBub2RlLmJvZHkuYWNjZXB0KHRoaXMpOwogICAgfSwgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZExvb3Aobm9kZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvU3RhdGVtZW50KGlyLkRvU3RhdGVtZW50IG5vZGUpIHsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkTG9vcChub2RlKTsKICAgIC8vIFRPRE8oZWZvcnR1bmEpOiBJIHRoaW5rIHRoaXMgY2FuIGJlIHJld3JpdHRlbiB1c2luZwogICAgLy8gTG9vcEhhbmRsZXIuaGFuZGxlTG9vcCB3aXRoIHNvbWUgdHJpY2tzIGFib3V0IHdoZW4gdGhlICJ1cGRhdGUiIGhhcHBlbnMuCiAgICBMb2NhbHNIYW5kbGVyIHNhdmVkTG9jYWxzID0gbmV3IExvY2Fsc0hhbmRsZXIuZnJvbShsb2NhbHNIYW5kbGVyKTsKICAgIENhcHR1cmVkTG9vcFNjb3BlIGxvb3BDbG9zdXJlSW5mbyA9CiAgICAgICAgX2Nsb3N1cmVEYXRhTG9va3VwLmdldENhcHR1cmVkTG9vcFNjb3BlKG5vZGUpOwogICAgbG9jYWxzSGFuZGxlci5zdGFydExvb3AobG9vcENsb3N1cmVJbmZvLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IF9sb2NhbHNNYXAuZ2V0SnVtcFRhcmdldEZvckRvKG5vZGUpOwogICAgSnVtcEhhbmRsZXIganVtcEhhbmRsZXIgPSBfbG9vcEhhbmRsZXIuYmVnaW5Mb29wSGVhZGVyKG5vZGUsIHRhcmdldCk7CiAgICBITG9vcEluZm9ybWF0aW9uIGxvb3BJbmZvID0gY3VycmVudC5sb29wSW5mb3JtYXRpb247CiAgICBIQmFzaWNCbG9jayBsb29wRW50cnlCbG9jayA9IGN1cnJlbnQ7CiAgICBIQmFzaWNCbG9jayBib2R5RW50cnlCbG9jayA9IGN1cnJlbnQ7CiAgICBib29sIGhhc0NvbnRpbnVlcyA9IHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5pc0NvbnRpbnVlVGFyZ2V0OwogICAgaWYgKGhhc0NvbnRpbnVlcykgewogICAgICAvLyBBZGQgZXh0cmEgYmxvY2sgdG8gaGFuZyBsYWJlbHMgb24uCiAgICAgIC8vIEl0IGRvZXNuJ3QgY3VycmVudGx5IHdvcmsgaWYgdGhleSBhcmUgb24gdGhlIHNhbWUgYmxvY2sgYXMgdGhlCiAgICAgIC8vIEhMb29wSW5mby4gVGhlIGhhbmRsaW5nIG9mIEhMYWJlbGVkQmxvY2tJbmZvcm1hdGlvbiB3aWxsIHZpc2l0IGEKICAgICAgLy8gU3ViR3JhcGggdGhhdCBzdGFydHMgYXQgdGhlIHNhbWUgYmxvY2sgYWdhaW4sIHNvIHRoZSBITG9vcEluZm8gaXMKICAgICAgLy8gZWl0aGVyIGhhbmRsZWQgdHdpY2UsIG9yIGl0J3MgaGFuZGxlZCBhZnRlciB0aGUgbGFiZWxlZCBibG9jayBpbmZvLAogICAgICAvLyBib3RoIG9mIHdoaWNoIGdlbmVyYXRlIHRoZSB3cm9uZyBjb2RlLgogICAgICAvLyBVc2luZyBhIHNlcGFyYXRlIGJsb2NrIGlzIGp1c3QgYSBzaW1wbGUgd29ya2Fyb3VuZC4KICAgICAgYm9keUVudHJ5QmxvY2sgPSBvcGVuTmV3QmxvY2soKTsKICAgIH0KICAgIGxvY2Fsc0hhbmRsZXIuZW50ZXJMb29wQm9keShsb29wQ2xvc3VyZUluZm8sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIG5vZGUuYm9keS5hY2NlcHQodGhpcyk7CgogICAgLy8gSWYgdGhlcmUgYXJlIG5vIGNvbnRpbnVlcyB3ZSBjb3VsZCBhdm9pZCB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbmRpdGlvbgogICAgLy8gYmxvY2suIFRoaXMgY291bGQgYWxzbyBsZWFkIHRvIGEgYmxvY2sgaGF2aW5nIG11bHRpcGxlIGVudHJpZXMgYW5kIGV4aXRzLgogICAgSEJhc2ljQmxvY2sgYm9keUV4aXRCbG9jazsKICAgIGJvb2wgaXNBYm9ydGluZ0JvZHkgPSBmYWxzZTsKICAgIGlmIChjdXJyZW50ICE9IG51bGwpIHsKICAgICAgYm9keUV4aXRCbG9jayA9IGNsb3NlKG5ldyBIR290byhfYWJzdHJhY3RWYWx1ZURvbWFpbikpOwogICAgfSBlbHNlIHsKICAgICAgaXNBYm9ydGluZ0JvZHkgPSB0cnVlOwogICAgICBib2R5RXhpdEJsb2NrID0gbGFzdE9wZW5lZEJsb2NrOwogICAgfQoKICAgIFN1YkV4cHJlc3Npb24gY29uZGl0aW9uRXhwcmVzc2lvbjsKICAgIGJvb2wgbG9vcElzRGVnZW5lcmF0ZSA9IGlzQWJvcnRpbmdCb2R5ICYmICFoYXNDb250aW51ZXM7CiAgICBpZiAoIWxvb3BJc0RlZ2VuZXJhdGUpIHsKICAgICAgSEJhc2ljQmxvY2sgY29uZGl0aW9uQmxvY2sgPSBhZGROZXdCbG9jaygpOwoKICAgICAgTGlzdDxMb2NhbHNIYW5kbGVyPiBjb250aW51ZUhhbmRsZXJzID0gPExvY2Fsc0hhbmRsZXI+W107CiAgICAgIGp1bXBIYW5kbGVyCiAgICAgICAgICAuZm9yRWFjaENvbnRpbnVlKChIQ29udGludWUgaW5zdHJ1Y3Rpb24sIExvY2Fsc0hhbmRsZXIgbG9jYWxzKSB7CiAgICAgICAgaW5zdHJ1Y3Rpb24uYmxvY2suYWRkU3VjY2Vzc29yKGNvbmRpdGlvbkJsb2NrKTsKICAgICAgICBjb250aW51ZUhhbmRsZXJzLmFkZChsb2NhbHMpOwogICAgICB9KTsKCiAgICAgIGlmICghaXNBYm9ydGluZ0JvZHkpIHsKICAgICAgICBib2R5RXhpdEJsb2NrLmFkZFN1Y2Nlc3Nvcihjb25kaXRpb25CbG9jayk7CiAgICAgIH0KCiAgICAgIGlmICghY29udGludWVIYW5kbGVycy5pc0VtcHR5KSB7CiAgICAgICAgaWYgKCFpc0Fib3J0aW5nQm9keSkgY29udGludWVIYW5kbGVycy5hZGQobG9jYWxzSGFuZGxlcik7CiAgICAgICAgbG9jYWxzSGFuZGxlciA9CiAgICAgICAgICAgIHNhdmVkTG9jYWxzLm1lcmdlTXVsdGlwbGUoY29udGludWVIYW5kbGVycywgY29uZGl0aW9uQmxvY2spOwogICAgICAgIFN1YkdyYXBoIGJvZHlHcmFwaCA9IG5ldyBTdWJHcmFwaChib2R5RW50cnlCbG9jaywgYm9keUV4aXRCbG9jayk7CiAgICAgICAgTGlzdDxMYWJlbERlZmluaXRpb24+IGxhYmVscyA9IGp1bXBIYW5kbGVyLmxhYmVsczsKICAgICAgICBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uIGJvZHlJbmZvID0KICAgICAgICAgICAgbmV3IEhTdWJHcmFwaEJsb2NrSW5mb3JtYXRpb24oYm9keUdyYXBoKTsKICAgICAgICBITGFiZWxlZEJsb2NrSW5mb3JtYXRpb24gaW5mbzsKICAgICAgICBpZiAoIWxhYmVscy5pc0VtcHR5KSB7CiAgICAgICAgICBpbmZvID0KICAgICAgICAgICAgICBuZXcgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uKGJvZHlJbmZvLCBsYWJlbHMsIGlzQ29udGludWU6IHRydWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbmZvID0gbmV3IEhMYWJlbGVkQmxvY2tJbmZvcm1hdGlvbi5pbXBsaWNpdChib2R5SW5mbywgdGFyZ2V0LAogICAgICAgICAgICAgIGlzQ29udGludWU6IHRydWUpOwogICAgICAgIH0KICAgICAgICBib2R5RW50cnlCbG9jay5zZXRCbG9ja0Zsb3coaW5mbywgY29uZGl0aW9uQmxvY2spOwogICAgICB9CiAgICAgIG9wZW4oY29uZGl0aW9uQmxvY2spOwoKICAgICAgbm9kZS5jb25kaXRpb24uYWNjZXB0KHRoaXMpOwogICAgICBhc3NlcnQoIWlzQWJvcnRlZCgpKTsKICAgICAgSEluc3RydWN0aW9uIGNvbmRpdGlvbkluc3RydWN0aW9uID0gcG9wQm9vbGlmaWVkKCk7CiAgICAgIEhCYXNpY0Jsb2NrIGNvbmRpdGlvbkVuZEJsb2NrID0gY2xvc2UobmV3IEhMb29wQnJhbmNoKAogICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sCiAgICAgICAgICBjb25kaXRpb25JbnN0cnVjdGlvbiwKICAgICAgICAgIEhMb29wQnJhbmNoLkRPX1dISUxFX0xPT1ApKTsKCiAgICAgIEhCYXNpY0Jsb2NrIGF2b2lkQ3JpdGljYWxFZGdlID0gYWRkTmV3QmxvY2soKTsKICAgICAgY29uZGl0aW9uRW5kQmxvY2suYWRkU3VjY2Vzc29yKGF2b2lkQ3JpdGljYWxFZGdlKTsKICAgICAgb3Blbihhdm9pZENyaXRpY2FsRWRnZSk7CiAgICAgIGNsb3NlKG5ldyBIR290byhfYWJzdHJhY3RWYWx1ZURvbWFpbikpOwogICAgICBhdm9pZENyaXRpY2FsRWRnZS5hZGRTdWNjZXNzb3IobG9vcEVudHJ5QmxvY2spOyAvLyBUaGUgYmFjay1lZGdlLgoKICAgICAgY29uZGl0aW9uRXhwcmVzc2lvbiA9CiAgICAgICAgICBuZXcgU3ViRXhwcmVzc2lvbihjb25kaXRpb25CbG9jaywgY29uZGl0aW9uRW5kQmxvY2spOwoKICAgICAgLy8gQXZvaWQgYSBjcml0aWNhbCBlZGdlIGZyb20gdGhlIGNvbmRpdGlvbiB0byB0aGUgbG9vcC1leGl0IGJvZHkuCiAgICAgIEhCYXNpY0Jsb2NrIGNvbmRpdGlvbkV4aXRCbG9jayA9IGFkZE5ld0Jsb2NrKCk7CiAgICAgIG9wZW4oY29uZGl0aW9uRXhpdEJsb2NrKTsKICAgICAgY2xvc2UobmV3IEhHb3RvKF9hYnN0cmFjdFZhbHVlRG9tYWluKSk7CiAgICAgIGNvbmRpdGlvbkVuZEJsb2NrLmFkZFN1Y2Nlc3Nvcihjb25kaXRpb25FeGl0QmxvY2spOwoKICAgICAgX2xvb3BIYW5kbGVyLmVuZExvb3AoCiAgICAgICAgICBsb29wRW50cnlCbG9jaywgY29uZGl0aW9uRXhpdEJsb2NrLCBqdW1wSGFuZGxlciwgbG9jYWxzSGFuZGxlcik7CgogICAgICBsb29wRW50cnlCbG9jay5wb3N0UHJvY2Vzc0xvb3BIZWFkZXIoKTsKICAgICAgU3ViR3JhcGggYm9keUdyYXBoID0gbmV3IFN1YkdyYXBoKGxvb3BFbnRyeUJsb2NrLCBib2R5RXhpdEJsb2NrKTsKICAgICAgSExvb3BCbG9ja0luZm9ybWF0aW9uIGxvb3BCbG9ja0luZm8gPSBuZXcgSExvb3BCbG9ja0luZm9ybWF0aW9uKAogICAgICAgICAgSExvb3BCbG9ja0luZm9ybWF0aW9uLkRPX1dISUxFX0xPT1AsCiAgICAgICAgICBudWxsLAogICAgICAgICAgd3JhcEV4cHJlc3Npb25HcmFwaChjb25kaXRpb25FeHByZXNzaW9uKSwKICAgICAgICAgIHdyYXBTdGF0ZW1lbnRHcmFwaChib2R5R3JhcGgpLAogICAgICAgICAgbnVsbCwKICAgICAgICAgIGxvb3BFbnRyeUJsb2NrLmxvb3BJbmZvcm1hdGlvbi50YXJnZXQsCiAgICAgICAgICBsb29wRW50cnlCbG9jay5sb29wSW5mb3JtYXRpb24ubGFiZWxzLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogICAgICBsb29wRW50cnlCbG9jay5zZXRCbG9ja0Zsb3cobG9vcEJsb2NrSW5mbywgY3VycmVudCk7CiAgICAgIGxvb3BJbmZvLmxvb3BCbG9ja0luZm9ybWF0aW9uID0gbG9vcEJsb2NrSW5mbzsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFNpbmNlIHRoZSBsb29wIGhhcyBubyBiYWNrIGVkZ2UsIHdlIHJlbW92ZSB0aGUgbG9vcCBpbmZvcm1hdGlvbiBvbiB0aGUKICAgICAgLy8gaGVhZGVyLgogICAgICBsb29wRW50cnlCbG9jay5sb29wSW5mb3JtYXRpb24gPSBudWxsOwoKICAgICAgaWYgKGp1bXBIYW5kbGVyLmhhc0FueUJyZWFrKCkpIHsKICAgICAgICAvLyBOdWxsIGJyYW5jaEJsb2NrIGJlY2F1c2UgdGhlIGJvZHkgb2YgdGhlIGRvLXdoaWxlIGxvb3AgYWx3YXlzIGFib3J0cywKICAgICAgICAvLyBzbyB3ZSBuZXZlciBnZXQgdG8gdGhlIGNvbmRpdGlvbi4KICAgICAgICBfbG9vcEhhbmRsZXIuZW5kTG9vcChsb29wRW50cnlCbG9jaywgbnVsbCwganVtcEhhbmRsZXIsIGxvY2Fsc0hhbmRsZXIpOwoKICAgICAgICAvLyBTaW5jZSB0aGUgYm9keSBvZiB0aGUgbG9vcCBoYXMgYSBicmVhaywgd2UgYXR0YWNoIGEgc3ludGhlc2l6ZWQgbGFiZWwKICAgICAgICAvLyB0byB0aGUgYm9keS4KICAgICAgICBTdWJHcmFwaCBib2R5R3JhcGggPSBuZXcgU3ViR3JhcGgoYm9keUVudHJ5QmxvY2ssIGJvZHlFeGl0QmxvY2spOwogICAgICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gX2xvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yRG8obm9kZSk7CiAgICAgICAgTGFiZWxEZWZpbml0aW9uIGxhYmVsID0gdGFyZ2V0LmFkZExhYmVsKCdsb29wJywgaXNCcmVha1RhcmdldDogdHJ1ZSk7CiAgICAgICAgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uIGluZm8gPSBuZXcgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uKAogICAgICAgICAgICBuZXcgSFN1YkdyYXBoQmxvY2tJbmZvcm1hdGlvbihib2R5R3JhcGgpLCA8TGFiZWxEZWZpbml0aW9uPltsYWJlbF0pOwogICAgICAgIGxvb3BFbnRyeUJsb2NrLnNldEJsb2NrRmxvdyhpbmZvLCBjdXJyZW50KTsKICAgICAgICBqdW1wSGFuZGxlci5mb3JFYWNoQnJlYWsoKEhCcmVhayBicmVha0luc3RydWN0aW9uLCBfKSB7CiAgICAgICAgICBIQmFzaWNCbG9jayBibG9jayA9IGJyZWFrSW5zdHJ1Y3Rpb24uYmxvY2s7CiAgICAgICAgICBibG9jay5hZGRBdEV4aXQobmV3IEhCcmVhay50b0xhYmVsKAogICAgICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLCBsYWJlbCwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgICAgIGJsb2NrLnJlbW92ZShicmVha0luc3RydWN0aW9uKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAganVtcEhhbmRsZXIuY2xvc2UoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJZlN0YXRlbWVudChpci5JZlN0YXRlbWVudCBub2RlKSB7CiAgICBfaGFuZGxlSWYoCiAgICAgICAgdmlzaXRDb25kaXRpb246ICgpID0+IG5vZGUuY29uZGl0aW9uLmFjY2VwdCh0aGlzKSwKICAgICAgICB2aXNpdFRoZW46ICgpID0+IG5vZGUudGhlbi5hY2NlcHQodGhpcyksCiAgICAgICAgdmlzaXRFbHNlOiAoKSA9PiBub2RlLm90aGVyd2lzZT8uYWNjZXB0KHRoaXMpLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkSWYobm9kZSkpOwogIH0KCiAgdm9pZCBfaGFuZGxlSWYoCiAgICAgIHtpci5Ob2RlIG5vZGUsCiAgICAgIHZvaWQgdmlzaXRDb25kaXRpb24oKSwKICAgICAgdm9pZCB2aXNpdFRoZW4oKSwKICAgICAgdm9pZCB2aXNpdEVsc2UoKSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb259KSB7CiAgICBTc2FCcmFuY2hCdWlsZGVyIGJyYW5jaEJ1aWxkZXIgPSBuZXcgU3NhQnJhbmNoQnVpbGRlcih0aGlzLAogICAgICAgIG5vZGUgPT0gbnVsbCA/IG51bGwgOiBfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgbm9kZSkpOwogICAgYnJhbmNoQnVpbGRlci5oYW5kbGVJZih2aXNpdENvbmRpdGlvbiwgdmlzaXRUaGVuLCB2aXNpdEVsc2UsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBc0V4cHJlc3Npb24oaXIuQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlyLkV4cHJlc3Npb24gb3BlcmFuZCA9IG5vZGUub3BlcmFuZDsKICAgIG9wZXJhbmQuYWNjZXB0KHRoaXMpOwoKICAgIFN0YXRpY1R5cGUgb3BlcmFuZFR5cGUgPSBfZ2V0U3RhdGljVHlwZShvcGVyYW5kKTsKICAgIERhcnRUeXBlIHR5cGUgPSBfZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLnR5cGUpOwogICAgaWYgKF9lbGVtZW50TWFwLnR5cGVzLmlzU3VidHlwZShvcGVyYW5kVHlwZS50eXBlLCB0eXBlKSkgewogICAgICAvLyBTa2lwIHVubmVlZGVkIGNhc3RzLgogICAgICBpZiAob3BlcmFuZCBpcyEgaXIuUHJvcGVydHlHZXQpIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IHByb3BlcnR5IGdldC4gQ3VycmVudGx5IENGRSBpbnNlcnRzCiAgICAgICAgLy8gYSBzZWVtaW5nbHkgdW5uZWNlc3NhcnkgY2FzdCBvbiB0ZWFyb2ZmcyB0aGF0IGNvbnRhaW4gdHlwZSB2YXJpYWJsZXMKICAgICAgICAvLyBpbiBjb250cmF2YXJpYW50IHBvc2l0aW9ucy4gU2luY2UgdGhlc2UgY2FzdHMgYXJlIG5vdCBtYXJrZWQgd2UKICAgICAgICAvLyBjYW5ub3QgZWFzaWx5IGRldGVjdCB3aGVuIHdlIGFjdHVhbGx5IG5lZWQgdGhlIGNhc3QuIFNlZSB0ZXN0CiAgICAgICAgLy8gYGxhbmd1YWdlXzIvaW5zdGFudGlhdGVfdGVhcm9mZl9hZnRlcl9jb250cmF2YXJpYW5jZV9jaGVja190ZXN0YC4KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEFzKG5vZGUpOwogICAgSEluc3RydWN0aW9uIGV4cHJlc3Npb25JbnN0cnVjdGlvbiA9IHBvcCgpOwoKICAgIGlmIChub2RlLnR5cGUgaXMgaXIuSW52YWxpZFR5cGUpIHsKICAgICAgX2dlbmVyYXRlVHlwZUVycm9yKCdpbnZhbGlkIHR5cGUnLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBDaGVja1BvbGljeSBwb2xpY3k7CiAgICBpZiAobm9kZS5pc1R5cGVFcnJvcikgewogICAgICBwb2xpY3kgPSBjbG9zZWRXb3JsZC5hbm5vdGF0aW9uc0RhdGEKICAgICAgICAgIC5nZXRJbXBsaWNpdERvd25jYXN0Q2hlY2tQb2xpY3koX2N1cnJlbnRGcmFtZS5tZW1iZXIpOwogICAgfSBlbHNlIHsKICAgICAgcG9saWN5ID0gY2xvc2VkV29ybGQuYW5ub3RhdGlvbnNEYXRhCiAgICAgICAgICAuZ2V0RXhwbGljaXRDYXN0Q2hlY2tQb2xpY3koX2N1cnJlbnRGcmFtZS5tZW1iZXIpOwogICAgfQoKICAgIGlmIChwb2xpY3kuaXNFbWl0dGVkKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQgPSBfdHlwZUJ1aWxkZXIuYnVpbGRUeXBlQ29udmVyc2lvbigKICAgICAgICAgIGV4cHJlc3Npb25JbnN0cnVjdGlvbiwKICAgICAgICAgIGxvY2Fsc0hhbmRsZXIuc3Vic3RJbkNvbnRleHQodHlwZSksCiAgICAgICAgICBub2RlLmlzVHlwZUVycm9yCiAgICAgICAgICAgICAgPyBIVHlwZUNvbnZlcnNpb24uVFlQRV9DSEVDSwogICAgICAgICAgICAgIDogSFR5cGVDb252ZXJzaW9uLkNBU1RfQ0hFQ0ssCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgICBpZiAoY29udmVydGVkICE9IGV4cHJlc3Npb25JbnN0cnVjdGlvbikgewogICAgICAgIGFkZChjb252ZXJ0ZWQpOwogICAgICB9CiAgICAgIHN0YWNrLmFkZChjb252ZXJ0ZWQpOwogICAgfSBlbHNlIHsKICAgICAgc3RhY2suYWRkKGV4cHJlc3Npb25JbnN0cnVjdGlvbik7CiAgICB9CiAgfQoKICB2b2lkIF9nZW5lcmF0ZUVycm9yKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLCBTdHJpbmcgbWVzc2FnZSwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlTWFzaywgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIEhJbnN0cnVjdGlvbiBlcnJvck1lc3NhZ2UgPSBncmFwaC5hZGRDb25zdGFudFN0cmluZyhtZXNzYWdlLCBjbG9zZWRXb3JsZCk7CiAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgZnVuY3Rpb24sIFtlcnJvck1lc3NhZ2VdLCB0eXBlTWFzaywgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICB2b2lkIF9nZW5lcmF0ZVR5cGVFcnJvcihTdHJpbmcgbWVzc2FnZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIF9nZW5lcmF0ZUVycm9yKAogICAgICAgIF9jb21tb25FbGVtZW50cy50aHJvd1R5cGVFcnJvciwKICAgICAgICBtZXNzYWdlLAogICAgICAgIF90eXBlSW5mZXJlbmNlTWFwLmdldFJldHVyblR5cGVPZihfY29tbW9uRWxlbWVudHMudGhyb3dUeXBlRXJyb3IpLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIHZvaWQgX2dlbmVyYXRlVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgU3RyaW5nIG1lc3NhZ2UsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBfZ2VuZXJhdGVFcnJvcigKICAgICAgICBfY29tbW9uRWxlbWVudHMudGhyb3dVbnN1cHBvcnRlZEVycm9yLAogICAgICAgIG1lc3NhZ2UsCiAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAKICAgICAgICAgICAgLmdldFJldHVyblR5cGVPZihfY29tbW9uRWxlbWVudHMudGhyb3dVbnN1cHBvcnRlZEVycm9yKSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXNzZXJ0U3RhdGVtZW50KGlyLkFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoIW9wdGlvbnMuZW5hYmxlVXNlckFzc2VydGlvbnMpIHJldHVybjsKICAgIHZhciBzb3VyY2VJbmZvcm1hdGlvbiA9IF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRBc3NlcnQobm9kZSk7CiAgICBpZiAobm9kZS5tZXNzYWdlID09IG51bGwpIHsKICAgICAgbm9kZS5jb25kaXRpb24uYWNjZXB0KHRoaXMpOwogICAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuYXNzZXJ0SGVscGVyLAogICAgICAgICAgPEhJbnN0cnVjdGlvbj5bcG9wKCldLAogICAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAuZ2V0UmV0dXJuVHlwZU9mKF9jb21tb25FbGVtZW50cy5hc3NlcnRIZWxwZXIpLAogICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgcG9wKCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBpZiAoYXNzZXJ0VGVzdChjb25kaXRpb24pKSBhc3NlcnRUaHJvdyhtZXNzYWdlKTsKICAgIHZvaWQgYnVpbGRDb25kaXRpb24oKSB7CiAgICAgIG5vZGUuY29uZGl0aW9uLmFjY2VwdCh0aGlzKTsKICAgICAgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmFzc2VydFRlc3QsCiAgICAgICAgICA8SEluc3RydWN0aW9uPltwb3AoKV0sCiAgICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC5nZXRSZXR1cm5UeXBlT2YoX2NvbW1vbkVsZW1lbnRzLmFzc2VydFRlc3QpLAogICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KCiAgICB2b2lkIGZhaWwoKSB7CiAgICAgIG5vZGUubWVzc2FnZS5hY2NlcHQodGhpcyk7CiAgICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgIF9jb21tb25FbGVtZW50cy5hc3NlcnRUaHJvdywKICAgICAgICAgIDxISW5zdHJ1Y3Rpb24+W3BvcCgpXSwKICAgICAgICAgIF90eXBlSW5mZXJlbmNlTWFwLmdldFJldHVyblR5cGVPZihfY29tbW9uRWxlbWVudHMuYXNzZXJ0VGhyb3cpLAogICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgcG9wKCk7CiAgICB9CgogICAgX2hhbmRsZUlmKHZpc2l0Q29uZGl0aW9uOiBidWlsZENvbmRpdGlvbiwgdmlzaXRUaGVuOiBmYWlsKTsKICB9CgogIC8vLyBDcmVhdGVzIGEgW0p1bXBIYW5kbGVyXSBmb3IgYSBzdGF0ZW1lbnQuIFRoZSBub2RlIG11c3QgYmUgYSBqdW1wCiAgLy8vIHRhcmdldC4gSWYgdGhlcmUgYXJlIG5vIGJyZWFrcyBvciBjb250aW51ZXMgdGFyZ2V0aW5nIHRoZSBzdGF0ZW1lbnQsCiAgLy8vIGEgc3BlY2lhbCAibnVsbCBoYW5kbGVyIiBpcyByZXR1cm5lZC4KICAvLy8KICAvLy8gW2lzTG9vcEp1bXBdIGlzIHRydWUgd2hlbiB0aGUganVtcCBoYW5kbGVyIGlzIGZvciBhIGxvb3AuIFRoaXMgaXMgdXNlZAogIC8vLyB0byBkaXN0aW5ndWlzaCB0aGUgc3ludGhlc2l6ZWQgbG9vcCBjcmVhdGVkIGZvciBhIHN3aXRjaCBzdGF0ZW1lbnQgd2l0aAogIC8vLyBjb250aW51ZSBzdGF0ZW1lbnRzIGZyb20gc2ltcGxlIHN3aXRjaCBzdGF0ZW1lbnRzLgogIEp1bXBIYW5kbGVyIGNyZWF0ZUp1bXBIYW5kbGVyKGlyLlRyZWVOb2RlIG5vZGUsIEp1bXBUYXJnZXQgdGFyZ2V0LAogICAgICB7Ym9vbCBpc0xvb3BKdW1wOiBmYWxzZX0pIHsKICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewogICAgICAvLyBObyBicmVha3Mgb3IgY29udGludWVzIHRvIHRoaXMgbm9kZS4KICAgICAgcmV0dXJuIG5ldyBOdWxsSnVtcEhhbmRsZXIocmVwb3J0ZXIpOwogICAgfQogICAgaWYgKGlzTG9vcEp1bXAgJiYgbm9kZSBpcyBpci5Td2l0Y2hTdGF0ZW1lbnQpIHsKICAgICAgcmV0dXJuIG5ldyBLZXJuZWxTd2l0Y2hDYXNlSnVtcEhhbmRsZXIodGhpcywgdGFyZ2V0LCBub2RlLCBfbG9jYWxzTWFwKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IEp1bXBIYW5kbGVyKHRoaXMsIHRhcmdldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QnJlYWtTdGF0ZW1lbnQoaXIuQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewogICAgYXNzZXJ0KCFpc0Fib3J0ZWQoKSk7CiAgICBfaGFuZGxlSW5UcnlTdGF0ZW1lbnQoKTsKICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gX2xvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yQnJlYWsobm9kZSk7CiAgICBhc3NlcnQodGFyZ2V0ICE9IG51bGwpOwogICAgSnVtcEhhbmRsZXIgaGFuZGxlciA9IGp1bXBUYXJnZXRzW3RhcmdldF07CiAgICBhc3NlcnQoaGFuZGxlciAhPSBudWxsKTsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkR290byhub2RlKTsKICAgIGlmIChfbG9jYWxzTWFwLmdlbmVyYXRlQ29udGludWVGb3JCcmVhayhub2RlKSkgewogICAgICBpZiAoaGFuZGxlci5sYWJlbHMuaXNOb3RFbXB0eSkgewogICAgICAgIGhhbmRsZXIuZ2VuZXJhdGVDb250aW51ZShzb3VyY2VJbmZvcm1hdGlvbiwgaGFuZGxlci5sYWJlbHMuZmlyc3QpOwogICAgICB9IGVsc2UgewogICAgICAgIGhhbmRsZXIuZ2VuZXJhdGVDb250aW51ZShzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChoYW5kbGVyLmxhYmVscy5pc05vdEVtcHR5KSB7CiAgICAgICAgaGFuZGxlci5nZW5lcmF0ZUJyZWFrKHNvdXJjZUluZm9ybWF0aW9uLCBoYW5kbGVyLmxhYmVscy5maXJzdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaGFuZGxlci5nZW5lcmF0ZUJyZWFrKHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoaXIuTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAgICBpci5TdGF0ZW1lbnQgYm9keSA9IG5vZGUuYm9keTsKICAgIGlmIChKdW1wVmlzaXRvci5jYW5CZUJyZWFrVGFyZ2V0KGJvZHkpKSB7CiAgICAgIC8vIGxvb3BzIGFuZCBzd2l0Y2hlcyBoYW5kbGUgYnJlYWtzIG9uIHRoZWlyIG93bgogICAgICBib2R5LmFjY2VwdCh0aGlzKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgSnVtcFRhcmdldCBqdW1wVGFyZ2V0ID0gX2xvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yTGFiZWwobm9kZSk7CiAgICBpZiAoanVtcFRhcmdldCA9PSBudWxsKSB7CiAgICAgIC8vIFRoZSBsYWJlbCBpcyBub3QgbmVlZGVkLgogICAgICBib2R5LmFjY2VwdCh0aGlzKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIEp1bXBIYW5kbGVyIGhhbmRsZXIgPSBjcmVhdGVKdW1wSGFuZGxlcihub2RlLCBqdW1wVGFyZ2V0KTsKCiAgICBMb2NhbHNIYW5kbGVyIGJlZm9yZUxvY2FscyA9IG5ldyBMb2NhbHNIYW5kbGVyLmZyb20obG9jYWxzSGFuZGxlcik7CgogICAgSEJhc2ljQmxvY2sgbmV3QmxvY2sgPSBvcGVuTmV3QmxvY2soKTsKICAgIGJvZHkuYWNjZXB0KHRoaXMpOwogICAgU3ViR3JhcGggYm9keUdyYXBoID0gbmV3IFN1YkdyYXBoKG5ld0Jsb2NrLCBsYXN0T3BlbmVkQmxvY2spOwoKICAgIEhCYXNpY0Jsb2NrIGpvaW5CbG9jayA9IGdyYXBoLmFkZE5ld0Jsb2NrKCk7CiAgICBMaXN0PExvY2Fsc0hhbmRsZXI+IGJyZWFrSGFuZGxlcnMgPSA8TG9jYWxzSGFuZGxlcj5bXTsKICAgIGhhbmRsZXIuZm9yRWFjaEJyZWFrKChIQnJlYWsgYnJlYWtJbnN0cnVjdGlvbiwgTG9jYWxzSGFuZGxlciBsb2NhbHMpIHsKICAgICAgYnJlYWtJbnN0cnVjdGlvbi5ibG9jay5hZGRTdWNjZXNzb3Ioam9pbkJsb2NrKTsKICAgICAgYnJlYWtIYW5kbGVycy5hZGQobG9jYWxzKTsKICAgIH0pOwoKICAgIGlmICghaXNBYm9ydGVkKCkpIHsKICAgICAgZ290byhjdXJyZW50LCBqb2luQmxvY2spOwogICAgICBicmVha0hhbmRsZXJzLmFkZChsb2NhbHNIYW5kbGVyKTsKICAgIH0KCiAgICBvcGVuKGpvaW5CbG9jayk7CiAgICBsb2NhbHNIYW5kbGVyID0gYmVmb3JlTG9jYWxzLm1lcmdlTXVsdGlwbGUoYnJlYWtIYW5kbGVycywgam9pbkJsb2NrKTsKCiAgICAvLyBUaGVyZSB3YXMgYXQgbGVhc3Qgb25lIHJlYWNoYWJsZSBicmVhaywgc28gdGhlIGxhYmVsIGlzIG5lZWRlZC4KICAgIG5ld0Jsb2NrLnNldEJsb2NrRmxvdygKICAgICAgICBuZXcgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uKAogICAgICAgICAgICBuZXcgSFN1YkdyYXBoQmxvY2tJbmZvcm1hdGlvbihib2R5R3JhcGgpLCBoYW5kbGVyLmxhYmVscyksCiAgICAgICAgam9pbkJsb2NrKTsKICAgIGhhbmRsZXIuY2xvc2UoKTsKICB9CgogIC8vLyBMb29wIHRocm91Z2ggdGhlIGNhc2VzIGluIGEgc3dpdGNoIGFuZCBjcmVhdGUgYSBtYXBwaW5nIG9mIGNhc2UKICAvLy8gZXhwcmVzc2lvbnMgdG8gY29uc3RhbnRzLgogIE1hcDxpci5FeHByZXNzaW9uLCBDb25zdGFudFZhbHVlPiBfYnVpbGRTd2l0Y2hDYXNlQ29uc3RhbnRzKAogICAgICBpci5Td2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50KSB7CiAgICBNYXA8aXIuRXhwcmVzc2lvbiwgQ29uc3RhbnRWYWx1ZT4gY29uc3RhbnRzID0KICAgICAgICBuZXcgTWFwPGlyLkV4cHJlc3Npb24sIENvbnN0YW50VmFsdWU+KCk7CiAgICBmb3IgKGlyLlN3aXRjaENhc2Ugc3dpdGNoQ2FzZSBpbiBzd2l0Y2hTdGF0ZW1lbnQuY2FzZXMpIHsKICAgICAgZm9yIChpci5FeHByZXNzaW9uIGNhc2VFeHByZXNzaW9uIGluIHN3aXRjaENhc2UuZXhwcmVzc2lvbnMpIHsKICAgICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZShjYXNlRXhwcmVzc2lvbik7CiAgICAgICAgY29uc3RhbnRzW2Nhc2VFeHByZXNzaW9uXSA9IGNvbnN0YW50OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY29uc3RhbnRzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KGlyLkNvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIF9oYW5kbGVJblRyeVN0YXRlbWVudCgpOwogICAgSnVtcFRhcmdldCB0YXJnZXQgPSBfbG9jYWxzTWFwLmdldEp1bXBUYXJnZXRGb3JDb250aW51ZVN3aXRjaChub2RlKTsKICAgIGFzc2VydCh0YXJnZXQgIT0gbnVsbCk7CiAgICBKdW1wSGFuZGxlciBoYW5kbGVyID0ganVtcFRhcmdldHNbdGFyZ2V0XTsKICAgIGFzc2VydChoYW5kbGVyICE9IG51bGwpOwogICAgYXNzZXJ0KHRhcmdldC5sYWJlbHMuaXNOb3RFbXB0eSk7CiAgICBoYW5kbGVyLmdlbmVyYXRlQ29udGludWUoCiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEdvdG8obm9kZSksIHRhcmdldC5sYWJlbHMuZmlyc3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN3aXRjaFN0YXRlbWVudChpci5Td2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRTd2l0Y2gobm9kZSk7CiAgICAvLyBUaGUgc3dpdGNoIGNhc2UgaW5kaWNlcyBtdXN0IG1hdGNoIHRob3NlIGNvbXB1dGVkIGluCiAgICAvLyBbS2VybmVsU3dpdGNoQ2FzZUp1bXBIYW5kbGVyXS4KICAgIGJvb2wgaGFzQ29udGludWUgPSBmYWxzZTsKICAgIE1hcDxpci5Td2l0Y2hDYXNlLCBpbnQ+IGNhc2VJbmRleCA9IG5ldyBNYXA8aXIuU3dpdGNoQ2FzZSwgaW50PigpOwogICAgaW50IHN3aXRjaEluZGV4ID0gMTsKICAgIGJvb2wgaGFzRGVmYXVsdCA9IGZhbHNlOwogICAgZm9yIChpci5Td2l0Y2hDYXNlIHN3aXRjaENhc2UgaW4gbm9kZS5jYXNlcykgewogICAgICBpZiAoX2lzRGVmYXVsdENhc2Uoc3dpdGNoQ2FzZSkpIHsKICAgICAgICBoYXNEZWZhdWx0ID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoU3dpdGNoQ29udGludWVBbmFseXNpcy5jb250YWluc0NvbnRpbnVlKHN3aXRjaENhc2UuYm9keSkpIHsKICAgICAgICBoYXNDb250aW51ZSA9IHRydWU7CiAgICAgIH0KICAgICAgY2FzZUluZGV4W3N3aXRjaENhc2VdID0gc3dpdGNoSW5kZXg7CiAgICAgIHN3aXRjaEluZGV4Kys7CiAgICB9CgogICAgSnVtcEhhbmRsZXIganVtcEhhbmRsZXIgPQogICAgICAgIGNyZWF0ZUp1bXBIYW5kbGVyKG5vZGUsIF9sb2NhbHNNYXAuZ2V0SnVtcFRhcmdldEZvclN3aXRjaChub2RlKSk7CiAgICBpZiAoIWhhc0NvbnRpbnVlKSB7CiAgICAgIC8vIElmIHRoZSBzd2l0Y2ggc3RhdGVtZW50IGhhcyBubyBzd2l0Y2ggY2FzZXMgdGFyZ2V0ZWQgYnkgY29udGludWUKICAgICAgLy8gc3RhdGVtZW50cyB3ZSBlbmNvZGUgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgZGlyZWN0bHkuCiAgICAgIF9idWlsZFNpbXBsZVN3aXRjaFN0YXRlbWVudChub2RlLCBqdW1wSGFuZGxlciwgc291cmNlSW5mb3JtYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgX2J1aWxkQ29tcGxleFN3aXRjaFN0YXRlbWVudCgKICAgICAgICAgIG5vZGUsIGp1bXBIYW5kbGVyLCBjYXNlSW5kZXgsIGhhc0RlZmF1bHQsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICB9CgogIC8vLyBIZWxwZXIgZm9yIGJ1aWxkaW5nIHN3aXRjaCBzdGF0ZW1lbnRzLgogIHN0YXRpYyBib29sIF9pc0RlZmF1bHRDYXNlKGlyLlN3aXRjaENhc2Ugc3dpdGNoQ2FzZSkgPT4KICAgICAgc3dpdGNoQ2FzZSA9PSBudWxsIHx8IHN3aXRjaENhc2UuaXNEZWZhdWx0OwoKICAvLy8gSGVscGVyIGZvciBidWlsZGluZyBzd2l0Y2ggc3RhdGVtZW50cy4KICBISW5zdHJ1Y3Rpb24gX2J1aWxkRXhwcmVzc2lvbihpci5Td2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50KSB7CiAgICBzd2l0Y2hTdGF0ZW1lbnQuZXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7CiAgICByZXR1cm4gcG9wKCk7CiAgfQoKICAvLy8gSGVscGVyIG1ldGhvZCBmb3IgY3JlYXRpbmcgdGhlIGxpc3Qgb2YgY29uc3RhbnRzIHRoYXQgbWFrZSB1cCB0aGUKICAvLy8gc3dpdGNoIGNhc2UgYnJhbmNoZXMuCiAgTGlzdDxDb25zdGFudFZhbHVlPiBfZ2V0U3dpdGNoQ29uc3RhbnRzKAogICAgICBpci5Td2l0Y2hTdGF0ZW1lbnQgcGFyZW50U3dpdGNoLCBpci5Td2l0Y2hDYXNlIHN3aXRjaENhc2UpIHsKICAgIE1hcDxpci5FeHByZXNzaW9uLCBDb25zdGFudFZhbHVlPiBjb25zdGFudHNMb29rdXAgPQogICAgICAgIF9idWlsZFN3aXRjaENhc2VDb25zdGFudHMocGFyZW50U3dpdGNoKTsKICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gY29uc3RhbnRMaXN0ID0gPENvbnN0YW50VmFsdWU+W107CiAgICBpZiAoc3dpdGNoQ2FzZSAhPSBudWxsKSB7CiAgICAgIGZvciAodmFyIGV4cHJlc3Npb24gaW4gc3dpdGNoQ2FzZS5leHByZXNzaW9ucykgewogICAgICAgIGNvbnN0YW50TGlzdC5hZGQoY29uc3RhbnRzTG9va3VwW2V4cHJlc3Npb25dKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvbnN0YW50TGlzdDsKICB9CgogIC8vLyBCdWlsZHMgYSBzaW1wbGUgc3dpdGNoIHN0YXRlbWVudCB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdXNlcyBvZiBjb250aW51ZQogIC8vLyBzdGF0ZW1lbnRzIHRvIGxhYmVsZWQgc3dpdGNoIGNhc2VzLgogIHZvaWQgX2J1aWxkU2ltcGxlU3dpdGNoU3RhdGVtZW50KGlyLlN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQsCiAgICAgIEp1bXBIYW5kbGVyIGp1bXBIYW5kbGVyLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgdm9pZCBidWlsZFN3aXRjaENhc2UoaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlKSB7CiAgICAgIHN3aXRjaENhc2UuYm9keS5hY2NlcHQodGhpcyk7CiAgICB9CgogICAgX2hhbmRsZVN3aXRjaCgKICAgICAgICBzd2l0Y2hTdGF0ZW1lbnQsCiAgICAgICAganVtcEhhbmRsZXIsCiAgICAgICAgX2J1aWxkRXhwcmVzc2lvbiwKICAgICAgICBzd2l0Y2hTdGF0ZW1lbnQuY2FzZXMsCiAgICAgICAgX2dldFN3aXRjaENvbnN0YW50cywKICAgICAgICBfaXNEZWZhdWx0Q2FzZSwKICAgICAgICBidWlsZFN3aXRjaENhc2UsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogICAganVtcEhhbmRsZXIuY2xvc2UoKTsKICB9CgogIC8vLyBCdWlsZHMgYSBzd2l0Y2ggc3RhdGVtZW50IHRoYXQgY2FuIGhhbmRsZSBhcmJpdHJhcnkgdXNlcyBvZiBjb250aW51ZQogIC8vLyBzdGF0ZW1lbnRzIHRvIGxhYmVsZWQgc3dpdGNoIGNhc2VzLgogIHZvaWQgX2J1aWxkQ29tcGxleFN3aXRjaFN0YXRlbWVudCgKICAgICAgaXIuU3dpdGNoU3RhdGVtZW50IHN3aXRjaFN0YXRlbWVudCwKICAgICAgSnVtcEhhbmRsZXIganVtcEhhbmRsZXIsCiAgICAgIE1hcDxpci5Td2l0Y2hDYXNlLCBpbnQ+IGNhc2VJbmRleCwKICAgICAgYm9vbCBoYXNEZWZhdWx0LAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgLy8gSWYgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgaGFzIHN3aXRjaCBjYXNlcyB0YXJnZXRlZCBieSBjb250aW51ZQogICAgLy8gc3RhdGVtZW50cyB3ZSBjcmVhdGUgdGhlIGZvbGxvd2luZyBlbmNvZGluZzoKICAgIC8vCiAgICAvLyAgIHN3aXRjaCAoZSkgewogICAgLy8gICAgIGxfMTogY2FzZSBlMDogc18xOyBicmVhazsKICAgIC8vICAgICBsXzI6IGNhc2UgZTE6IHNfMjsgY29udGludWUgbF9pOwogICAgLy8gICAgIC4uLgogICAgLy8gICAgIGxfbjogZGVmYXVsdDogc19uOyBjb250aW51ZSBsX2o7CiAgICAvLyAgIH0KICAgIC8vCiAgICAvLyBpcyBlbmNvZGVkIGFzCiAgICAvLwogICAgLy8gICB2YXIgdGFyZ2V0OwogICAgLy8gICBzd2l0Y2ggKGUpIHsKICAgIC8vICAgICBjYXNlIGUxOiB0YXJnZXQgPSAxOyBicmVhazsKICAgIC8vICAgICBjYXNlIGUyOiB0YXJnZXQgPSAyOyBicmVhazsKICAgIC8vICAgICAuLi4KICAgIC8vICAgICBkZWZhdWx0OiB0YXJnZXQgPSBuOyBicmVhazsKICAgIC8vICAgfQogICAgLy8gICBsOiB3aGlsZSAodHJ1ZSkgewogICAgLy8gICAgc3dpdGNoICh0YXJnZXQpIHsKICAgIC8vICAgICAgIGNhc2UgMTogc18xOyBicmVhayBsOwogICAgLy8gICAgICAgY2FzZSAyOiBzXzI7IHRhcmdldCA9IGk7IGNvbnRpbnVlIGw7CiAgICAvLyAgICAgICAuLi4KICAgIC8vICAgICAgIGNhc2Ugbjogc19uOyB0YXJnZXQgPSBqOyBjb250aW51ZSBsOwogICAgLy8gICAgIH0KICAgIC8vICAgfQogICAgLy8KICAgIC8vIFRoaXMgaXMgYmVjYXVzZSBKUyBkb2VzIG5vdCBoYXZlIHRoaXMgc2FtZSAiY29udGludWUgbGFiZWwiIHNlbWFudGljcyBzbwogICAgLy8gd2UgZW5jb2RlIGl0IGluIHRoZSBmb3JtIG9mIGEgc3RhdGUgbWFjaGluZS4KCiAgICBKdW1wVGFyZ2V0IHN3aXRjaFRhcmdldCA9CiAgICAgICAgX2xvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yU3dpdGNoKHN3aXRjaFN0YXRlbWVudCk7CiAgICBsb2NhbHNIYW5kbGVyLnVwZGF0ZUxvY2FsKHN3aXRjaFRhcmdldCwgZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7CgogICAgdmFyIHN3aXRjaENhc2VzID0gc3dpdGNoU3RhdGVtZW50LmNhc2VzOwogICAgaWYgKCFoYXNEZWZhdWx0KSB7CiAgICAgIC8vIFVzZSBudWxsIGFzIHRoZSBtYXJrZXIgZm9yIGEgc3ludGhldGljIGRlZmF1bHQgY2xhdXNlLgogICAgICAvLyBUaGUgc3ludGhldGljIGRlZmF1bHQgaXMgYWRkZWQgYmVjYXVzZSBvdGhlcndpc2UgdGhlcmUgd291bGQgYmUgbm8KICAgICAgLy8gZ29vZCBwbGFjZSB0byBnaXZlIGEgZGVmYXVsdCB2YWx1ZSB0byB0aGUgbG9jYWwuCiAgICAgIHN3aXRjaENhc2VzID0gbmV3IExpc3Q8aXIuU3dpdGNoQ2FzZT4uZnJvbShzd2l0Y2hDYXNlcyk7CiAgICAgIHN3aXRjaENhc2VzLmFkZChudWxsKTsKICAgIH0KCiAgICB2b2lkIGJ1aWxkU3dpdGNoQ2FzZShpci5Td2l0Y2hDYXNlIHN3aXRjaENhc2UpIHsKICAgICAgU291cmNlSW5mb3JtYXRpb24gY2FzZVNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICAgIGlmIChzd2l0Y2hDYXNlICE9IG51bGwpIHsKICAgICAgICBjYXNlU291cmNlSW5mb3JtYXRpb24gPSBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkR290byhzd2l0Y2hDYXNlKTsKICAgICAgICAvLyBHZW5lcmF0ZSAndGFyZ2V0ID0gaTsgYnJlYWs7JyBmb3Igc3dpdGNoIGNhc2UgaS4KICAgICAgICBpbnQgaW5kZXggPSBjYXNlSW5kZXhbc3dpdGNoQ2FzZV07CiAgICAgICAgSEluc3RydWN0aW9uIHZhbHVlID0gZ3JhcGguYWRkQ29uc3RhbnRJbnQoaW5kZXgsIGNsb3NlZFdvcmxkKTsKICAgICAgICBsb2NhbHNIYW5kbGVyLnVwZGF0ZUxvY2FsKHN3aXRjaFRhcmdldCwgdmFsdWUsCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBjYXNlU291cmNlSW5mb3JtYXRpb24pOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEdlbmVyYXRlIHN5bnRoZXRpYyBkZWZhdWx0IGNhc2UgJ3RhcmdldCA9IG51bGw7IGJyZWFrOycuCiAgICAgICAgSEluc3RydWN0aW9uIG51bGxWYWx1ZSA9IGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCk7CiAgICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChzd2l0Y2hUYXJnZXQsIG51bGxWYWx1ZSwKICAgICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IGNhc2VTb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0KICAgICAganVtcFRhcmdldHNbc3dpdGNoVGFyZ2V0XS5nZW5lcmF0ZUJyZWFrKGNhc2VTb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CgogICAgX2hhbmRsZVN3aXRjaCgKICAgICAgICBzd2l0Y2hTdGF0ZW1lbnQsCiAgICAgICAganVtcEhhbmRsZXIsCiAgICAgICAgX2J1aWxkRXhwcmVzc2lvbiwKICAgICAgICBzd2l0Y2hDYXNlcywKICAgICAgICBfZ2V0U3dpdGNoQ29uc3RhbnRzLAogICAgICAgIF9pc0RlZmF1bHRDYXNlLAogICAgICAgIGJ1aWxkU3dpdGNoQ2FzZSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqdW1wSGFuZGxlci5jbG9zZSgpOwoKICAgIEhJbnN0cnVjdGlvbiBidWlsZENvbmRpdGlvbigpID0+IGdyYXBoLmFkZENvbnN0YW50Qm9vbCh0cnVlLCBjbG9zZWRXb3JsZCk7CgogICAgdm9pZCBidWlsZFN3aXRjaCgpIHsKICAgICAgSEluc3RydWN0aW9uIGJ1aWxkRXhwcmVzc2lvbihpci5Td2l0Y2hTdGF0ZW1lbnQgbm90VXNlZCkgewogICAgICAgIHJldHVybiBsb2NhbHNIYW5kbGVyLnJlYWRMb2NhbChzd2l0Y2hUYXJnZXQpOwogICAgICB9CgogICAgICBMaXN0PENvbnN0YW50VmFsdWU+IGdldENvbnN0YW50cygKICAgICAgICAgIGlyLlN3aXRjaFN0YXRlbWVudCBwYXJlbnRTd2l0Y2gsIGlyLlN3aXRjaENhc2Ugc3dpdGNoQ2FzZSkgewogICAgICAgIHJldHVybiA8Q29uc3RhbnRWYWx1ZT5bCiAgICAgICAgICBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50RnJvbUludChjYXNlSW5kZXhbc3dpdGNoQ2FzZV0pCiAgICAgICAgXTsKICAgICAgfQoKICAgICAgdm9pZCBidWlsZFN3aXRjaENhc2UoaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlKSB7CiAgICAgICAgc3dpdGNoQ2FzZS5ib2R5LmFjY2VwdCh0aGlzKTsKICAgICAgICBpZiAoIWlzQWJvcnRlZCgpKSB7CiAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBicmVhayB0aGUgbG9vcCBpZiB0aGUgY2FzZSBmYWxscyB0aHJvdWdoLiAoVGhpcwogICAgICAgICAgLy8gaXMgb25seSBwb3NzaWJsZSBmb3IgdGhlIGxhc3QgY2FzZS4pCiAgICAgICAgICBqdW1wVGFyZ2V0c1tzd2l0Y2hUYXJnZXRdLmdlbmVyYXRlQnJlYWsoc291cmNlSW5mb3JtYXRpb24pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gUGFzcyBhIFtOdWxsSnVtcEhhbmRsZXJdIGJlY2F1c2UgdGhlIHRhcmdldCBmb3IgdGhlIGNvbnRhaW5lZCBicmVhawogICAgICAvLyBpcyBub3QgdGhlIGdlbmVyYXRlZCBzd2l0Y2ggc3RhdGVtZW50IGJ1dCBpbnN0ZWFkIHRoZSBsb29wIGdlbmVyYXRlZAogICAgICAvLyBpbiB0aGUgY2FsbCB0byBbaGFuZGxlTG9vcF0gYmVsb3cuCiAgICAgIF9oYW5kbGVTd2l0Y2goCiAgICAgICAgICBzd2l0Y2hTdGF0ZW1lbnQsIC8vIG5vciBpcyBidWlsZEV4cHJlc3Npb24uCiAgICAgICAgICBuZXcgTnVsbEp1bXBIYW5kbGVyKHJlcG9ydGVyKSwKICAgICAgICAgIGJ1aWxkRXhwcmVzc2lvbiwKICAgICAgICAgIHN3aXRjaFN0YXRlbWVudC5jYXNlcywKICAgICAgICAgIGdldENvbnN0YW50cywKICAgICAgICAgIChfKSA9PiBmYWxzZSwgLy8gTm8gY2FzZSBpcyBkZWZhdWx0LgogICAgICAgICAgYnVpbGRTd2l0Y2hDYXNlLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogICAgfQoKICAgIHZvaWQgYnVpbGRMb29wKCkgewogICAgICBfbG9vcEhhbmRsZXIuaGFuZGxlTG9vcCgKICAgICAgICAgIHN3aXRjaFN0YXRlbWVudCwKICAgICAgICAgIF9jbG9zdXJlRGF0YUxvb2t1cC5nZXRDYXB0dXJlZExvb3BTY29wZShzd2l0Y2hTdGF0ZW1lbnQpLAogICAgICAgICAgc3dpdGNoVGFyZ2V0LAogICAgICAgICAgKCkge30sCiAgICAgICAgICBidWlsZENvbmRpdGlvbiwKICAgICAgICAgICgpIHt9LAogICAgICAgICAgYnVpbGRTd2l0Y2gsCiAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkTG9vcChzd2l0Y2hTdGF0ZW1lbnQpKTsKICAgIH0KCiAgICBpZiAoaGFzRGVmYXVsdCkgewogICAgICBidWlsZExvb3AoKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIElmIHRoZSBzd2l0Y2ggc3RhdGVtZW50IGhhcyBubyBkZWZhdWx0IGNhc2UsIHN1cnJvdW5kIHRoZSBsb29wIHdpdGgKICAgICAgLy8gYSB0ZXN0IG9mIHRoZSB0YXJnZXQuIFNvOgogICAgICAvLyBgaWYgKHRhcmdldCkgd2hpbGUgKHRydWUpIC4uLmAgSWYgdGhlcmUncyBubyBkZWZhdWx0IGNhc2UsIHRhcmdldCBpcwogICAgICAvLyBudWxsLCBzbyB3ZSBkb24ndCBkcm9wIGludG8gdGhlIHdoaWxlIGxvb3AuCiAgICAgIHZvaWQgYnVpbGRDb25kaXRpb24oKSB7CiAgICAgICAganMuVGVtcGxhdGUgY29kZSA9IGpzLmpzLnBhcnNlRm9yZWlnbkpTKCcjJyk7CiAgICAgICAgcHVzaChuZXcgSEZvcmVpZ25Db2RlKGNvZGUsIF9hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlLAogICAgICAgICAgICBbbG9jYWxzSGFuZGxlci5yZWFkTG9jYWwoc3dpdGNoVGFyZ2V0KV0sCiAgICAgICAgICAgIG5hdGl2ZUJlaGF2aW9yOiBOYXRpdmVCZWhhdmlvci5QVVJFKSk7CiAgICAgIH0KCiAgICAgIF9oYW5kbGVJZigKICAgICAgICAgIG5vZGU6IHN3aXRjaFN0YXRlbWVudCwKICAgICAgICAgIHZpc2l0Q29uZGl0aW9uOiBidWlsZENvbmRpdGlvbiwKICAgICAgICAgIHZpc2l0VGhlbjogYnVpbGRMb29wLAogICAgICAgICAgdmlzaXRFbHNlOiAoKSA9PiB7fSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgfQoKICAvLy8gQ3JlYXRlcyBhIHN3aXRjaCBzdGF0ZW1lbnQuCiAgLy8vCiAgLy8vIFtqdW1wSGFuZGxlcl0gaXMgdGhlIFtKdW1wSGFuZGxlcl0gZm9yIHRoZSBjcmVhdGVkIHN3aXRjaCBzdGF0ZW1lbnQuCiAgLy8vIFtidWlsZFN3aXRjaENhc2VdIGNyZWF0ZXMgdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBzd2l0Y2ggY2FzZS4KICB2b2lkIF9oYW5kbGVTd2l0Y2goCiAgICAgIGlyLlN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQsCiAgICAgIEp1bXBIYW5kbGVyIGp1bXBIYW5kbGVyLAogICAgICBISW5zdHJ1Y3Rpb24gYnVpbGRFeHByZXNzaW9uKGlyLlN3aXRjaFN0YXRlbWVudCBzdGF0ZW1lbnQpLAogICAgICBMaXN0PGlyLlN3aXRjaENhc2U+IHN3aXRjaENhc2VzLAogICAgICBMaXN0PENvbnN0YW50VmFsdWU+IGdldENvbnN0YW50cygKICAgICAgICAgIGlyLlN3aXRjaFN0YXRlbWVudCBwYXJlbnRTd2l0Y2gsIGlyLlN3aXRjaENhc2Ugc3dpdGNoQ2FzZSksCiAgICAgIGJvb2wgaXNEZWZhdWx0Q2FzZShpci5Td2l0Y2hDYXNlIHN3aXRjaENhc2UpLAogICAgICB2b2lkIGJ1aWxkU3dpdGNoQ2FzZShpci5Td2l0Y2hDYXNlIHN3aXRjaENhc2UpLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgSEJhc2ljQmxvY2sgZXhwcmVzc2lvblN0YXJ0ID0gb3Blbk5ld0Jsb2NrKCk7CiAgICBISW5zdHJ1Y3Rpb24gZXhwcmVzc2lvbiA9IGJ1aWxkRXhwcmVzc2lvbihzd2l0Y2hTdGF0ZW1lbnQpOwoKICAgIGlmIChzd2l0Y2hDYXNlcy5pc0VtcHR5KSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBIU3dpdGNoIHN3aXRjaEluc3RydWN0aW9uID0KICAgICAgICBuZXcgSFN3aXRjaChfYWJzdHJhY3RWYWx1ZURvbWFpbiwgPEhJbnN0cnVjdGlvbj5bZXhwcmVzc2lvbl0pOwogICAgSEJhc2ljQmxvY2sgZXhwcmVzc2lvbkVuZCA9IGNsb3NlKHN3aXRjaEluc3RydWN0aW9uKTsKICAgIExvY2Fsc0hhbmRsZXIgc2F2ZWRMb2NhbHMgPSBsb2NhbHNIYW5kbGVyOwoKICAgIExpc3Q8SFN0YXRlbWVudEluZm9ybWF0aW9uPiBzdGF0ZW1lbnRzID0gPEhTdGF0ZW1lbnRJbmZvcm1hdGlvbj5bXTsKICAgIGJvb2wgaGFzRGVmYXVsdCA9IGZhbHNlOwogICAgZm9yIChpci5Td2l0Y2hDYXNlIHN3aXRjaENhc2UgaW4gc3dpdGNoQ2FzZXMpIHsKICAgICAgSEJhc2ljQmxvY2sgYmxvY2sgPSBncmFwaC5hZGROZXdCbG9jaygpOwogICAgICBmb3IgKENvbnN0YW50VmFsdWUgY29uc3RhbnQKICAgICAgICAgIGluIGdldENvbnN0YW50cyhzd2l0Y2hTdGF0ZW1lbnQsIHN3aXRjaENhc2UpKSB7CiAgICAgICAgSENvbnN0YW50IGhDb25zdGFudCA9IGdyYXBoLmFkZENvbnN0YW50KGNvbnN0YW50LCBjbG9zZWRXb3JsZCk7CiAgICAgICAgc3dpdGNoSW5zdHJ1Y3Rpb24uaW5wdXRzLmFkZChoQ29uc3RhbnQpOwogICAgICAgIGhDb25zdGFudC51c2VkQnkuYWRkKHN3aXRjaEluc3RydWN0aW9uKTsKICAgICAgICBleHByZXNzaW9uRW5kLmFkZFN1Y2Nlc3NvcihibG9jayk7CiAgICAgIH0KCiAgICAgIGlmIChpc0RlZmF1bHRDYXNlKHN3aXRjaENhc2UpKSB7CiAgICAgICAgLy8gQW4gSFN3aXRjaCBoYXMgbiBpbnB1dHMgYW5kIG4rMSBzdWNjZXNzb3JzLCB0aGUgbGFzdCBiZWluZyB0aGUKICAgICAgICAvLyBkZWZhdWx0IGNhc2UuCiAgICAgICAgZXhwcmVzc2lvbkVuZC5hZGRTdWNjZXNzb3IoYmxvY2spOwogICAgICAgIGhhc0RlZmF1bHQgPSB0cnVlOwogICAgICB9CiAgICAgIG9wZW4oYmxvY2spOwogICAgICBsb2NhbHNIYW5kbGVyID0gbmV3IExvY2Fsc0hhbmRsZXIuZnJvbShzYXZlZExvY2Fscyk7CiAgICAgIGJ1aWxkU3dpdGNoQ2FzZShzd2l0Y2hDYXNlKTsKICAgICAgaWYgKCFpc0Fib3J0ZWQoKSAmJgogICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVpbnNlcnQgdGhpcyBpZiBgaXNSZWFjaGFibGVgIGlzIG5vIGxvbmdlcgogICAgICAgICAgLy8gc2V0IHRvIGBmYWxzZWAgd2hlbiBgX3RyeUlubGluZU1ldGhvZGAgc2VlcyBhbiBhbHdheXMgdGhyb3dpbmcKICAgICAgICAgIC8vIG1ldGhvZC4KICAgICAgICAgIC8vc3dpdGNoQ2FzZSA9PSBzd2l0Y2hDYXNlcy5sYXN0ICYmCiAgICAgICAgICAhaXNEZWZhdWx0Q2FzZShzd2l0Y2hDYXNlKSkgewogICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGRlZmF1bHQsIHdlIHdpbGwgYWRkIG9uZSBsYXRlciB0byBhdm9pZAogICAgICAgIC8vIHRoZSBjcml0aWNhbCBlZGdlLiBTbyB3ZSBnZW5lcmF0ZSBhIGJyZWFrIHN0YXRlbWVudCB0byBtYWtlCiAgICAgICAgLy8gc3VyZSB0aGUgbGFzdCBjYXNlIGRvZXMgbm90IGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBjYXNlLgogICAgICAgIGp1bXBIYW5kbGVyLmdlbmVyYXRlQnJlYWsoc291cmNlSW5mb3JtYXRpb24pOwogICAgICB9CiAgICAgIHN0YXRlbWVudHMuYWRkKAogICAgICAgICAgbmV3IEhTdWJHcmFwaEJsb2NrSW5mb3JtYXRpb24obmV3IFN1YkdyYXBoKGJsb2NrLCBsYXN0T3BlbmVkQmxvY2spKSk7CiAgICB9CgogICAgLy8gQWRkIGEgam9pbi1ibG9jayBpZiBuZWNlc3NhcnkuCiAgICAvLyBXZSBjcmVhdGUgW2pvaW5CbG9ja10gZWFybHksIGFuZCB0aGVuIGdvIHRocm91Z2ggdGhlIGNhc2VzIHRoYXQgbWlnaHQKICAgIC8vIHdhbnQgdG8ganVtcCB0byBpdC4gSW4gZWFjaCBjYXNlLCBpZiB3ZSBhZGQgW2pvaW5CbG9ja10gYXMgYSBzdWNjZXNzb3IKICAgIC8vIG9mIGFub3RoZXIgYmxvY2ssIHdlIGFsc28gYWRkIGFuIGVsZW1lbnQgdG8gW2Nhc2VIYW5kbGVyc10gdGhhdCBpcyB1c2VkCiAgICAvLyB0byBjcmVhdGUgdGhlIHBoaXMgaW4gW2pvaW5CbG9ja10uCiAgICAvLyBJZiB3ZSBuZXZlciBqdW1wIHRvIHRoZSBqb2luIGJsb2NrLCBbY2FzZUhhbmRsZXJzXSB3aWxsIHN0YXkgZW1wdHksIGFuZAogICAgLy8gdGhlIGpvaW4gYmxvY2sgaXMgbmV2ZXIgYWRkZWQgdG8gdGhlIGdyYXBoLgogICAgSEJhc2ljQmxvY2sgam9pbkJsb2NrID0gbmV3IEhCYXNpY0Jsb2NrKCk7CiAgICBMaXN0PExvY2Fsc0hhbmRsZXI+IGNhc2VIYW5kbGVycyA9IDxMb2NhbHNIYW5kbGVyPltdOwogICAganVtcEhhbmRsZXIuZm9yRWFjaEJyZWFrKChIQnJlYWsgaW5zdHJ1Y3Rpb24sIExvY2Fsc0hhbmRsZXIgbG9jYWxzKSB7CiAgICAgIGluc3RydWN0aW9uLmJsb2NrLmFkZFN1Y2Nlc3Nvcihqb2luQmxvY2spOwogICAgICBjYXNlSGFuZGxlcnMuYWRkKGxvY2Fscyk7CiAgICB9KTsKICAgIGp1bXBIYW5kbGVyLmZvckVhY2hDb250aW51ZSgoSENvbnRpbnVlIGluc3RydWN0aW9uLCBMb2NhbHNIYW5kbGVyIGxvY2FscykgewogICAgICBhc3NlcnQoCiAgICAgICAgICBmYWxzZSwKICAgICAgICAgIGZhaWxlZEF0KF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBzd2l0Y2hTdGF0ZW1lbnQpLAogICAgICAgICAgICAgICdDb250aW51ZSBjYW5ub3QgdGFyZ2V0IGEgc3dpdGNoLicpKTsKICAgIH0pOwogICAgaWYgKCFpc0Fib3J0ZWQoKSkgewogICAgICBjdXJyZW50LmNsb3NlKG5ldyBIR290byhfYWJzdHJhY3RWYWx1ZURvbWFpbikpOwogICAgICBsYXN0T3BlbmVkQmxvY2suYWRkU3VjY2Vzc29yKGpvaW5CbG9jayk7CiAgICAgIGNhc2VIYW5kbGVycy5hZGQobG9jYWxzSGFuZGxlcik7CiAgICB9CiAgICBpZiAoIWhhc0RlZmF1bHQpIHsKICAgICAgLy8gQWx3YXlzIGNyZWF0ZSBhIGRlZmF1bHQgY2FzZSwgdG8gYXZvaWQgYSBjcml0aWNhbCBlZGdlIGluIHRoZQogICAgICAvLyBncmFwaC4KICAgICAgSEJhc2ljQmxvY2sgZGVmYXVsdENhc2UgPSBhZGROZXdCbG9jaygpOwogICAgICBleHByZXNzaW9uRW5kLmFkZFN1Y2Nlc3NvcihkZWZhdWx0Q2FzZSk7CiAgICAgIG9wZW4oZGVmYXVsdENhc2UpOwogICAgICBjbG9zZShuZXcgSEdvdG8oX2Fic3RyYWN0VmFsdWVEb21haW4pKTsKICAgICAgZGVmYXVsdENhc2UuYWRkU3VjY2Vzc29yKGpvaW5CbG9jayk7CiAgICAgIGNhc2VIYW5kbGVycy5hZGQoc2F2ZWRMb2NhbHMpOwogICAgICBzdGF0ZW1lbnRzLmFkZChuZXcgSFN1YkdyYXBoQmxvY2tJbmZvcm1hdGlvbigKICAgICAgICAgIG5ldyBTdWJHcmFwaChkZWZhdWx0Q2FzZSwgZGVmYXVsdENhc2UpKSk7CiAgICB9CiAgICBhc3NlcnQoY2FzZUhhbmRsZXJzLmxlbmd0aCA9PSBqb2luQmxvY2sucHJlZGVjZXNzb3JzLmxlbmd0aCk7CiAgICBpZiAoY2FzZUhhbmRsZXJzLmlzTm90RW1wdHkpIHsKICAgICAgZ3JhcGguYWRkQmxvY2soam9pbkJsb2NrKTsKICAgICAgb3Blbihqb2luQmxvY2spOwogICAgICBpZiAoY2FzZUhhbmRsZXJzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgbG9jYWxzSGFuZGxlciA9IGNhc2VIYW5kbGVyc1swXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbHNIYW5kbGVyID0gc2F2ZWRMb2NhbHMubWVyZ2VNdWx0aXBsZShjYXNlSGFuZGxlcnMsIGpvaW5CbG9jayk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIFRoZSBqb2luYmxvY2sgaXMgbm90IHVzZWQuCiAgICAgIGpvaW5CbG9jayA9IG51bGw7CiAgICB9CgogICAgSFN1YkV4cHJlc3Npb25CbG9ja0luZm9ybWF0aW9uIGV4cHJlc3Npb25JbmZvID0KICAgICAgICBuZXcgSFN1YkV4cHJlc3Npb25CbG9ja0luZm9ybWF0aW9uKAogICAgICAgICAgICBuZXcgU3ViRXhwcmVzc2lvbihleHByZXNzaW9uU3RhcnQsIGV4cHJlc3Npb25FbmQpKTsKICAgIGV4cHJlc3Npb25TdGFydC5zZXRCbG9ja0Zsb3coCiAgICAgICAgbmV3IEhTd2l0Y2hCbG9ja0luZm9ybWF0aW9uKGV4cHJlc3Npb25JbmZvLCBzdGF0ZW1lbnRzLAogICAgICAgICAgICBqdW1wSGFuZGxlci50YXJnZXQsIGp1bXBIYW5kbGVyLmxhYmVscywgc291cmNlSW5mb3JtYXRpb24pLAogICAgICAgIGpvaW5CbG9jayk7CgogICAganVtcEhhbmRsZXIuY2xvc2UoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oaXIuQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIFNzYUJyYW5jaEJ1aWxkZXIgYnJhbmNoZXIgPSBuZXcgU3NhQnJhbmNoQnVpbGRlcih0aGlzKTsKICAgIGJyYW5jaGVyLmhhbmRsZUNvbmRpdGlvbmFsKCgpID0+IG5vZGUuY29uZGl0aW9uLmFjY2VwdCh0aGlzKSwKICAgICAgICAoKSA9PiBub2RlLnRoZW4uYWNjZXB0KHRoaXMpLCAoKSA9PiBub2RlLm90aGVyd2lzZS5hY2NlcHQodGhpcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKGlyLkxvZ2ljYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIFNzYUJyYW5jaEJ1aWxkZXIgYnJhbmNoZXIgPSBuZXcgU3NhQnJhbmNoQnVpbGRlcih0aGlzKTsKICAgIFN0cmluZyBvcGVyYXRvciA9IG5vZGUub3BlcmF0b3I7CiAgICAvLyBpci5Mb2dpY2FsRXhwcmVzc2lvbiBjbGFpbXMgdG8gYWxsb3cgJz8/JyBhcyBhbiBvcGVyYXRvciBidXQgY3VycmVudGx5CiAgICAvLyB0aGF0IGlzIGV4cGFuZGVkIGludG8gYSBsZXQtdHJlZS4KICAgIGFzc2VydChvcGVyYXRvciA9PSAnJiYnIHx8IG9wZXJhdG9yID09ICd8fCcpOwogICAgX2hhbmRsZUxvZ2ljYWxFeHByZXNzaW9uKG5vZGUubGVmdCwgKCkgPT4gbm9kZS5yaWdodC5hY2NlcHQodGhpcyksIGJyYW5jaGVyLAogICAgICAgIG9wZXJhdG9yLCBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQmluYXJ5KG5vZGUpKTsKICB9CgogIC8vLyBPcHRpbWl6ZXMgbG9naWNhbCBiaW5hcnkgZXhwcmVzc2lvbiB3aGVyZSB0aGUgbGVmdCBoYXMgdGhlIHNhbWUgbG9naWNhbAogIC8vLyBiaW5hcnkgb3BlcmF0b3IuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgdGhlIG9wZXJhdG9yIGJ5IG9wdGltaXppbmcgdGhlIGNhc2Ugd2hlcmUgW2xlZnRdIGlzCiAgLy8vIGEgbG9naWNhbCAiYW5kIiBvciBsb2dpY2FsICJvciIuIFRoZW4gaXQgdXNlcyBbYnJhbmNoQnVpbGRlcl0gdG8gYnVpbGQgdGhlCiAgLy8vIGdyYXBoIGZvciB0aGUgb3B0aW1pemVkIGV4cHJlc3Npb24uCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlLCBgKHggJiYgeSkgJiYgemAgaXMgdHJhbnNmb3JtZWQgaW50byBgeCAmJiAoeSAmJiB6KWA6CiAgLy8vCiAgdm9pZCBfaGFuZGxlTG9naWNhbEV4cHJlc3Npb24oCiAgICAgIGlyLkV4cHJlc3Npb24gbGVmdCwKICAgICAgdm9pZCB2aXNpdFJpZ2h0KCksCiAgICAgIFNzYUJyYW5jaEJ1aWxkZXIgYnJhbmNoZXIsCiAgICAgIFN0cmluZyBvcGVyYXRvciwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIGlmIChsZWZ0IGlzIGlyLkxvZ2ljYWxFeHByZXNzaW9uICYmIGxlZnQub3BlcmF0b3IgPT0gb3BlcmF0b3IpIHsKICAgICAgaXIuRXhwcmVzc2lvbiBpbm5lckxlZnQgPSBsZWZ0LmxlZnQ7CiAgICAgIGlyLkV4cHJlc3Npb24gbWlkZGxlID0gbGVmdC5yaWdodDsKICAgICAgX2hhbmRsZUxvZ2ljYWxFeHByZXNzaW9uKAogICAgICAgICAgaW5uZXJMZWZ0LAogICAgICAgICAgKCkgPT4gX2hhbmRsZUxvZ2ljYWxFeHByZXNzaW9uKG1pZGRsZSwgdmlzaXRSaWdodCwgYnJhbmNoZXIsIG9wZXJhdG9yLAogICAgICAgICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRCaW5hcnkobWlkZGxlKSksCiAgICAgICAgICBicmFuY2hlciwKICAgICAgICAgIG9wZXJhdG9yLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgYnJhbmNoZXIuaGFuZGxlTG9naWNhbEJpbmFyeSgKICAgICAgICAgICgpID0+IGxlZnQuYWNjZXB0KHRoaXMpLCB2aXNpdFJpZ2h0LCBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgIGlzQW5kOiBvcGVyYXRvciA9PSAnJiYnKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRMaXRlcmFsKGlyLkludExpdGVyYWwgbm9kZSkgewogICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50SW50QXNVbnNpZ25lZChub2RlLnZhbHVlLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvdWJsZUxpdGVyYWwoaXIuRG91YmxlTGl0ZXJhbCBub2RlKSB7CiAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnREb3VibGUobm9kZS52YWx1ZSwgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb29sTGl0ZXJhbChpci5Cb29sTGl0ZXJhbCBub2RlKSB7CiAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnRCb29sKG5vZGUudmFsdWUsIGNsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nTGl0ZXJhbChpci5TdHJpbmdMaXRlcmFsIG5vZGUpIHsKICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudFN0cmluZyhub2RlLnZhbHVlLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN5bWJvbExpdGVyYWwoaXIuU3ltYm9sTGl0ZXJhbCBub2RlKSB7CiAgICBzdGFjay5hZGQoCiAgICAgICAgZ3JhcGguYWRkQ29uc3RhbnQoX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZShub2RlKSwgY2xvc2VkV29ybGQpKTsKICAgIHJlZ2lzdHJ5Py5yZWdpc3RlckNvbnN0U3ltYm9sKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE51bGxMaXRlcmFsKGlyLk51bGxMaXRlcmFsIG5vZGUpIHsKICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpKTsKICB9CgogIC8vLyBTZXQgdGhlIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBpZiBuZWNlc3NhcnkuCiAgSEluc3RydWN0aW9uIF9zZXRMaXN0UnVudGltZVR5cGVJbmZvSWZOZWVkZWQoSEluc3RydWN0aW9uIG9iamVjdCwKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaWYgKCFfcnRpTmVlZC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cyh0eXBlLmVsZW1lbnQpIHx8IHR5cGUudHJlYXRBc1JhdykgewogICAgICByZXR1cm4gb2JqZWN0OwogICAgfQogICAgaWYgKG9wdGlvbnMuZXhwZXJpbWVudE5ld1J0aSkgewogICAgICAvLyBbdHlwZV0gY291bGQgYmUgYExpc3Q8VD5gLCBzbyBlbnN1cmUgaXQgaXMgYEpTQXJyYXk8VD5gLgogICAgICBJbnRlcmZhY2VUeXBlIGFycmF5VHlwZSA9CiAgICAgICAgICBJbnRlcmZhY2VUeXBlKF9jb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MsIHR5cGUudHlwZUFyZ3VtZW50cyk7CiAgICAgIEhJbnN0cnVjdGlvbiBydGkgPQogICAgICAgICAgX3R5cGVCdWlsZGVyLmFuYWx5emVUeXBlQXJndW1lbnROZXdSdGkoYXJyYXlUeXBlLCBzb3VyY2VFbGVtZW50KTsKCiAgICAgIC8vIFRPRE8oMTU0ODkpOiBSZWdpc3RlciBhdCBjb2RlZ2VuLgogICAgICByZWdpc3RyeT8ucmVnaXN0ZXJJbnN0YW50aWF0aW9uKHR5cGUpOwogICAgICByZXR1cm4gX2NhbGxTZXRSdW50aW1lVHlwZUluZm8ocnRpLCBvYmplY3QsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICAgIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgZm9yIChEYXJ0VHlwZSBhcmd1bWVudCBpbiB0eXBlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgYXJndW1lbnRzLmFkZChfdHlwZUJ1aWxkZXIuYW5hbHl6ZVR5cGVBcmd1bWVudChhcmd1bWVudCwgc291cmNlRWxlbWVudCkpOwogICAgfQogICAgLy8gVE9ETygxNTQ4OSk6IFJlZ2lzdGVyIGF0IGNvZGVnZW4uCiAgICByZWdpc3RyeT8ucmVnaXN0ZXJJbnN0YW50aWF0aW9uKHR5cGUpOwogICAgcmV0dXJuIF9jYWxsU2V0UnVudGltZVR5cGVJbmZvV2l0aFR5cGVBcmd1bWVudHMoCiAgICAgICAgdHlwZSwgYXJndW1lbnRzLCBvYmplY3QsIHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXN0TGl0ZXJhbChpci5MaXN0TGl0ZXJhbCBub2RlKSB7CiAgICBISW5zdHJ1Y3Rpb24gbGlzdEluc3RydWN0aW9uOwogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICBsaXN0SW5zdHJ1Y3Rpb24gPQogICAgICAgICAgZ3JhcGguYWRkQ29uc3RhbnQoX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZShub2RlKSwgY2xvc2VkV29ybGQpOwogICAgfSBlbHNlIHsKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGVsZW1lbnRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgICAgZm9yIChpci5FeHByZXNzaW9uIGVsZW1lbnQgaW4gbm9kZS5leHByZXNzaW9ucykgewogICAgICAgIGVsZW1lbnQuYWNjZXB0KHRoaXMpOwogICAgICAgIGVsZW1lbnRzLmFkZChwb3AoKSk7CiAgICAgIH0KICAgICAgbGlzdEluc3RydWN0aW9uID0gX2J1aWxkTGl0ZXJhbExpc3QoZWxlbWVudHMpOwogICAgICBhZGQobGlzdEluc3RydWN0aW9uKTsKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZExpc3RMaXRlcmFsKG5vZGUpOwogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUgPSBsb2NhbHNIYW5kbGVyLnN1YnN0SW5Db250ZXh0KAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmxpc3RUeXBlKF9lbGVtZW50TWFwLmdldERhcnRUeXBlKG5vZGUudHlwZUFyZ3VtZW50KSkpOwogICAgICBsaXN0SW5zdHJ1Y3Rpb24gPSBfc2V0TGlzdFJ1bnRpbWVUeXBlSW5mb0lmTmVlZGVkKAogICAgICAgICAgbGlzdEluc3RydWN0aW9uLCB0eXBlLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CgogICAgQWJzdHJhY3RWYWx1ZSB0eXBlID0KICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC50eXBlT2ZMaXN0TGl0ZXJhbChub2RlLCBfYWJzdHJhY3RWYWx1ZURvbWFpbik7CiAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4uY29udGFpbnNBbGwodHlwZSkuaXNEZWZpbml0ZWx5RmFsc2UpIHsKICAgICAgbGlzdEluc3RydWN0aW9uLmluc3RydWN0aW9uVHlwZSA9IHR5cGU7CiAgICB9CiAgICBzdGFjay5hZGQobGlzdEluc3RydWN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTZXRMaXRlcmFsKGlyLlNldExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICBzdGFjay5hZGQoCiAgICAgICAgICBncmFwaC5hZGRDb25zdGFudChfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKG5vZGUpLCBjbG9zZWRXb3JsZCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gVGhlIHNldCBsaXRlcmFsIGNvbnN0cnVjdG9ycyB0YWtlIHRoZSBlbGVtZW50cyBhcyBhIExpc3QuCiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gZWxlbWVudHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgZm9yIChpci5FeHByZXNzaW9uIGVsZW1lbnQgaW4gbm9kZS5leHByZXNzaW9ucykgewogICAgICBlbGVtZW50LmFjY2VwdCh0aGlzKTsKICAgICAgZWxlbWVudHMuYWRkKHBvcCgpKTsKICAgIH0KCiAgICAvLyBUaGUgY29uc3RydWN0b3IgaXMgYSBwcm9jZWR1cmUgYmVjYXVzZSBpdCdzIGEgZmFjdG9yeS4KICAgIEZ1bmN0aW9uRW50aXR5IGNvbnN0cnVjdG9yOwogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICBpZiAoZWxlbWVudHMuaXNFbXB0eSkgewogICAgICBjb25zdHJ1Y3RvciA9IF9jb21tb25FbGVtZW50cy5zZXRMaXRlcmFsQ29uc3RydWN0b3JFbXB0eTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0cnVjdG9yID0gX2NvbW1vbkVsZW1lbnRzLnNldExpdGVyYWxDb25zdHJ1Y3RvcjsKICAgICAgSExpdGVyYWxMaXN0IGFyZ0xpc3QgPSBfYnVpbGRMaXRlcmFsTGlzdChlbGVtZW50cyk7CiAgICAgIGFkZChhcmdMaXN0KTsKICAgICAgaW5wdXRzLmFkZChhcmdMaXN0KTsKICAgIH0KCiAgICBhc3NlcnQoCiAgICAgICAgY29uc3RydWN0b3IgaXMgQ29uc3RydWN0b3JFbnRpdHkgJiYgY29uc3RydWN0b3IuaXNGYWN0b3J5Q29uc3RydWN0b3IpOwoKICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IGxvY2Fsc0hhbmRsZXIuc3Vic3RJbkNvbnRleHQoCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnNldFR5cGUoX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS50eXBlQXJndW1lbnQpKSk7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzczsKCiAgICBpZiAoX3J0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoY2xzKSkgewogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gdHlwZUlucHV0cyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICAgIHR5cGUudHlwZUFyZ3VtZW50cy5mb3JFYWNoKChEYXJ0VHlwZSBhcmd1bWVudCkgewogICAgICAgIHR5cGVJbnB1dHMKICAgICAgICAgICAgLmFkZChfdHlwZUJ1aWxkZXIuYW5hbHl6ZVR5cGVBcmd1bWVudChhcmd1bWVudCwgc291cmNlRWxlbWVudCkpOwogICAgICB9KTsKCiAgICAgIC8vIFdlIGxpZnQgdGhpcyBjb21tb24gY2FsbCBwYXR0ZXJuIGludG8gYSBoZWxwZXIgZnVuY3Rpb24gdG8gc2F2ZSBzcGFjZQogICAgICAvLyBpbiB0aGUgb3V0cHV0LgogICAgICBpZiAodHlwZUlucHV0cy5ldmVyeSgoSEluc3RydWN0aW9uIGlucHV0KSA9PgogICAgICAgICAgaW5wdXQuaXNOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSkgewogICAgICAgIGlmIChlbGVtZW50cy5pc0VtcHR5KSB7CiAgICAgICAgICBjb25zdHJ1Y3RvciA9IF9jb21tb25FbGVtZW50cy5zZXRMaXRlcmFsVW50eXBlZEVtcHR5TWFrZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0cnVjdG9yID0gX2NvbW1vbkVsZW1lbnRzLnNldExpdGVyYWxVbnR5cGVkTWFrZXI7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlucHV0cy5hZGRBbGwodHlwZUlucHV0cyk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBJZiBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gaXMgbmVlZGVkIGFuZCB0aGUgc2V0IGxpdGVyYWwgaGFzIG5vIHR5cGUKICAgIC8vIHBhcmFtZXRlciwgJ2NvbnN0cnVjdG9yJyBpcyBhIHN0YXRpYyBmdW5jdGlvbiB0aGF0IGZvcndhcmRzIHRoZSBjYWxsIHRvCiAgICAvLyB0aGUgZmFjdG9yeSBjb25zdHJ1Y3RvciB3aXRob3V0IGEgdHlwZSBwYXJhbWV0ZXIuCiAgICBhc3NlcnQoY29uc3RydWN0b3IuaXNGdW5jdGlvbiB8fAogICAgICAgIChjb25zdHJ1Y3RvciBpcyBDb25zdHJ1Y3RvckVudGl0eSAmJiBjb25zdHJ1Y3Rvci5pc0ZhY3RvcnlDb25zdHJ1Y3RvcikpOwoKICAgIC8vIFRoZSBpbnN0cnVjdGlvbiB0eXBlIHdpbGwgYWx3YXlzIGJlIGEgc3VidHlwZSBvZiB0aGUgc2V0TGl0ZXJhbENsYXNzLCBidXQKICAgIC8vIHR5cGUgaW5mZXJlbmNlIG1pZ2h0IGRpc2NvdmVyIGEgbW9yZSBzcGVjaWZpYyB0eXBlIG9yIGZpbmQgbm90aGluZyAoaW4KICAgIC8vIGRhcnQyanMgdW5pdCB0ZXN0cykuCgogICAgQWJzdHJhY3RWYWx1ZSBzZXRUeXBlID0gX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAuY3JlYXRlTm9uTnVsbFN1YnR5cGUoX2NvbW1vbkVsZW1lbnRzLnNldExpdGVyYWxDbGFzcyk7CiAgICBBYnN0cmFjdFZhbHVlIHJldHVyblR5cGVNYXNrID0KICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC5nZXRSZXR1cm5UeXBlT2YoY29uc3RydWN0b3IpOwogICAgQWJzdHJhY3RWYWx1ZSBpbnN0cnVjdGlvblR5cGUgPQogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmludGVyc2VjdGlvbihzZXRUeXBlLCByZXR1cm5UeXBlTWFzayk7CgogICAgX2FkZEltcGxpY2l0SW5zdGFudGlhdGlvbih0eXBlKTsKICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbigKICAgICAgICBjb25zdHJ1Y3RvciwgaW5wdXRzLCBpbnN0cnVjdGlvblR5cGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZE5ldyhub2RlKSk7CiAgICBfcmVtb3ZlSW1wbGljaXRJbnN0YW50aWF0aW9uKHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1hcExpdGVyYWwoaXIuTWFwTGl0ZXJhbCBub2RlKSB7CiAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIHN0YWNrLmFkZCgKICAgICAgICAgIGdyYXBoLmFkZENvbnN0YW50KF9lbGVtZW50TWFwLmdldENvbnN0YW50VmFsdWUobm9kZSksIGNsb3NlZFdvcmxkKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBUaGUgbWFwIGxpdGVyYWwgY29uc3RydWN0b3JzIHRha2UgdGhlIGtleS12YWx1ZSBwYWlycyBhcyBhIExpc3QKICAgIExpc3Q8SEluc3RydWN0aW9uPiBjb25zdHJ1Y3RvckFyZ3MgPSA8SEluc3RydWN0aW9uPltdOwogICAgZm9yIChpci5NYXBFbnRyeSBtYXBFbnRyeSBpbiBub2RlLmVudHJpZXMpIHsKICAgICAgbWFwRW50cnkua2V5LmFjY2VwdCh0aGlzKTsKICAgICAgY29uc3RydWN0b3JBcmdzLmFkZChwb3AoKSk7CiAgICAgIG1hcEVudHJ5LnZhbHVlLmFjY2VwdCh0aGlzKTsKICAgICAgY29uc3RydWN0b3JBcmdzLmFkZChwb3AoKSk7CiAgICB9CgogICAgLy8gVGhlIGNvbnN0cnVjdG9yIGlzIGEgcHJvY2VkdXJlIGJlY2F1c2UgaXQncyBhIGZhY3RvcnkuCiAgICBGdW5jdGlvbkVudGl0eSBjb25zdHJ1Y3RvcjsKICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgaWYgKGNvbnN0cnVjdG9yQXJncy5pc0VtcHR5KSB7CiAgICAgIGNvbnN0cnVjdG9yID0gX2NvbW1vbkVsZW1lbnRzLm1hcExpdGVyYWxDb25zdHJ1Y3RvckVtcHR5OwogICAgfSBlbHNlIHsKICAgICAgY29uc3RydWN0b3IgPSBfY29tbW9uRWxlbWVudHMubWFwTGl0ZXJhbENvbnN0cnVjdG9yOwogICAgICBITGl0ZXJhbExpc3QgYXJnTGlzdCA9IF9idWlsZExpdGVyYWxMaXN0KGNvbnN0cnVjdG9yQXJncyk7CiAgICAgIGFkZChhcmdMaXN0KTsKICAgICAgaW5wdXRzLmFkZChhcmdMaXN0KTsKICAgIH0KCiAgICBhc3NlcnQoCiAgICAgICAgY29uc3RydWN0b3IgaXMgQ29uc3RydWN0b3JFbnRpdHkgJiYgY29uc3RydWN0b3IuaXNGYWN0b3J5Q29uc3RydWN0b3IpOwoKICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IGxvY2Fsc0hhbmRsZXIuc3Vic3RJbkNvbnRleHQoX2NvbW1vbkVsZW1lbnRzLm1hcFR5cGUoCiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS5rZXlUeXBlKSwKICAgICAgICBfZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLnZhbHVlVHlwZSkpKTsKICAgIENsYXNzRW50aXR5IGNscyA9IGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzOwoKICAgIGlmIChfcnRpTmVlZC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cyhjbHMpKSB7CiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiB0eXBlSW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgICAgdHlwZS50eXBlQXJndW1lbnRzLmZvckVhY2goKERhcnRUeXBlIGFyZ3VtZW50KSB7CiAgICAgICAgdHlwZUlucHV0cwogICAgICAgICAgICAuYWRkKF90eXBlQnVpbGRlci5hbmFseXplVHlwZUFyZ3VtZW50KGFyZ3VtZW50LCBzb3VyY2VFbGVtZW50KSk7CiAgICAgIH0pOwoKICAgICAgLy8gV2UgbGlmdCB0aGlzIGNvbW1vbiBjYWxsIHBhdHRlcm4gaW50byBhIGhlbHBlciBmdW5jdGlvbiB0byBzYXZlIHNwYWNlCiAgICAgIC8vIGluIHRoZSBvdXRwdXQuCiAgICAgIGlmICh0eXBlSW5wdXRzLmV2ZXJ5KChISW5zdHJ1Y3Rpb24gaW5wdXQpID0+CiAgICAgICAgICBpbnB1dC5pc051bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpKSB7CiAgICAgICAgaWYgKGNvbnN0cnVjdG9yQXJncy5pc0VtcHR5KSB7CiAgICAgICAgICBjb25zdHJ1Y3RvciA9IF9jb21tb25FbGVtZW50cy5tYXBMaXRlcmFsVW50eXBlZEVtcHR5TWFrZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0cnVjdG9yID0gX2NvbW1vbkVsZW1lbnRzLm1hcExpdGVyYWxVbnR5cGVkTWFrZXI7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlucHV0cy5hZGRBbGwodHlwZUlucHV0cyk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBJZiBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gaXMgbmVlZGVkIGFuZCB0aGUgbWFwIGxpdGVyYWwgaGFzIG5vIHR5cGUKICAgIC8vIHBhcmFtZXRlcnMsICdjb25zdHJ1Y3RvcicgaXMgYSBzdGF0aWMgZnVuY3Rpb24gdGhhdCBmb3J3YXJkcyB0aGUgY2FsbCB0bwogICAgLy8gdGhlIGZhY3RvcnkgY29uc3RydWN0b3Igd2l0aG91dCB0eXBlIHBhcmFtZXRlcnMuCiAgICBhc3NlcnQoY29uc3RydWN0b3IuaXNGdW5jdGlvbiB8fAogICAgICAgIChjb25zdHJ1Y3RvciBpcyBDb25zdHJ1Y3RvckVudGl0eSAmJiBjb25zdHJ1Y3Rvci5pc0ZhY3RvcnlDb25zdHJ1Y3RvcikpOwoKICAgIC8vIFRoZSBpbnN0cnVjdGlvbiB0eXBlIHdpbGwgYWx3YXlzIGJlIGEgc3VidHlwZSBvZiB0aGUgbWFwTGl0ZXJhbENsYXNzLCBidXQKICAgIC8vIHR5cGUgaW5mZXJlbmNlIG1pZ2h0IGRpc2NvdmVyIGEgbW9yZSBzcGVjaWZpYyB0eXBlLCBvciBmaW5kIG5vdGhpbmcgKGluCiAgICAvLyBkYXJ0MmpzIHVuaXQgdGVzdHMpLgoKICAgIEFic3RyYWN0VmFsdWUgbWFwVHlwZSA9IF9hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgLmNyZWF0ZU5vbk51bGxTdWJ0eXBlKF9jb21tb25FbGVtZW50cy5tYXBMaXRlcmFsQ2xhc3MpOwogICAgQWJzdHJhY3RWYWx1ZSByZXR1cm5UeXBlTWFzayA9CiAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAuZ2V0UmV0dXJuVHlwZU9mKGNvbnN0cnVjdG9yKTsKICAgIEFic3RyYWN0VmFsdWUgaW5zdHJ1Y3Rpb25UeXBlID0KICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5pbnRlcnNlY3Rpb24obWFwVHlwZSwgcmV0dXJuVHlwZU1hc2spOwoKICAgIF9hZGRJbXBsaWNpdEluc3RhbnRpYXRpb24odHlwZSk7CiAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgY29uc3RydWN0b3IsIGlucHV0cywgaW5zdHJ1Y3Rpb25UeXBlLCBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGROZXcobm9kZSkpOwogICAgX3JlbW92ZUltcGxpY2l0SW5zdGFudGlhdGlvbih0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXBFbnRyeShpci5NYXBFbnRyeSBub2RlKSB7CiAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICdpci5NYXBFbnRyeSBzaG91bGQgYmUgaGFuZGxlZCBpbiB2aXNpdE1hcExpdGVyYWwnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlTGl0ZXJhbChpci5UeXBlTGl0ZXJhbCBub2RlKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEdldChub2RlKTsKICAgIGlyLkRhcnRUeXBlIHR5cGUgPSBub2RlLnR5cGU7CiAgICBpZiAodHlwZSBpcyBpci5JbnRlcmZhY2VUeXBlIHx8CiAgICAgICAgdHlwZSBpcyBpci5EeW5hbWljVHlwZSB8fAogICAgICAgIHR5cGUgaXMgaXIuVHlwZWRlZlR5cGUgfHwKICAgICAgICB0eXBlIGlzIGlyLkZ1bmN0aW9uVHlwZSkgewogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZShub2RlKTsKICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50KGNvbnN0YW50LCBjbG9zZWRXb3JsZCwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICByZXR1cm47CiAgICB9CiAgICBhc3NlcnQoCiAgICAgICAgdHlwZSBpcyBpci5UeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgIlVuZXhwZWN0ZWQgdHlwZSBsaXRlcmFsICR7bm9kZX0uIikpOwogICAgLy8gRm9yIG90aGVyIHR5cGVzIChlLmcuIFR5cGVQYXJhbWV0ZXJUeXBlLCBmdW5jdGlvbiB0eXBlcyBmcm9tIGV4cGFuZGVkCiAgICAvLyB0eXBlZGVmcyksIGxvb2stdXAgb3IgY29uc3RydWN0IGEgcmVpZmllZCB0eXBlIHJlcHJlc2VudGF0aW9uIGFuZCBjb252ZXJ0CiAgICAvLyB0byBhIFJ1bnRpbWVUeXBlLgoKICAgIERhcnRUeXBlIGRhcnRUeXBlID0gX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUodHlwZSk7CiAgICBkYXJ0VHlwZSA9IGxvY2Fsc0hhbmRsZXIuc3Vic3RJbkNvbnRleHQoZGFydFR5cGUpOwogICAgSEluc3RydWN0aW9uIHZhbHVlID0gX3R5cGVCdWlsZGVyLmFuYWx5emVUeXBlQXJndW1lbnQoCiAgICAgICAgZGFydFR5cGUsIHNvdXJjZUVsZW1lbnQsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbigKICAgICAgICBfY29tbW9uRWxlbWVudHMuY3JlYXRlUnVudGltZVR5cGUsCiAgICAgICAgPEhJbnN0cnVjdGlvbj5bdmFsdWVdLAogICAgICAgIF90eXBlSW5mZXJlbmNlTWFwLmdldFJldHVyblR5cGVPZihfY29tbW9uRWxlbWVudHMuY3JlYXRlUnVudGltZVR5cGUpLAogICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0YXRpY0dldChpci5TdGF0aWNHZXQgbm9kZSkgewogICAgaXIuTWVtYmVyIHN0YXRpY1RhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRHZXQobm9kZSk7CiAgICBpZiAoc3RhdGljVGFyZ2V0IGlzIGlyLlByb2NlZHVyZSAmJgogICAgICAgIHN0YXRpY1RhcmdldC5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuR2V0dGVyKSB7CiAgICAgIEZ1bmN0aW9uRW50aXR5IGdldHRlciA9IF9lbGVtZW50TWFwLmdldE1lbWJlcihzdGF0aWNUYXJnZXQpOwogICAgICAvLyBJbnZva2UgdGhlIGdldHRlcgogICAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oZ2V0dGVyLCBjb25zdCA8SEluc3RydWN0aW9uPltdLAogICAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAuZ2V0UmV0dXJuVHlwZU9mKGdldHRlciksIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9IGVsc2UgaWYgKHN0YXRpY1RhcmdldCBpcyBpci5GaWVsZCkgewogICAgICBGaWVsZEVudGl0eSBmaWVsZCA9IF9lbGVtZW50TWFwLmdldEZpZWxkKHN0YXRpY1RhcmdldCk7CiAgICAgIEZpZWxkQW5hbHlzaXNEYXRhIGZpZWxkRGF0YSA9IF9maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShmaWVsZCk7CiAgICAgIGlmIChmaWVsZERhdGEuaXNFYWdlcikgewogICAgICAgIHB1c2gobmV3IEhTdGF0aWMoZmllbGQsIF90eXBlSW5mZXJlbmNlTWFwLmdldEluZmVycmVkVHlwZU9mKGZpZWxkKSwKICAgICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgfSBlbHNlIGlmIChmaWVsZERhdGEuaXNFZmZlY3RpdmVseUNvbnN0YW50KSB7CiAgICAgICAgT3V0cHV0VW5pdCBvdXRwdXRVbml0ID0KICAgICAgICAgICAgY2xvc2VkV29ybGQub3V0cHV0VW5pdERhdGEub3V0cHV0VW5pdEZvck1lbWJlcihmaWVsZCk7CiAgICAgICAgLy8gVE9ETyhzaWdtdW5kKTogdGhpcyBpcyBub3QgZXF1aXZhbGVudCB0byB3aGF0IHRoZSBvbGQgRkUgZG9lczogaWYKICAgICAgICAvLyB0aGVyZSBpcyBubyBwcmVmaXggdGhlIG9sZCBGRSB3b3VsZG4ndCB0cmVhdCB0aGlzIGluIGFueSBzcGVjaWFsCiAgICAgICAgLy8gd2F5LiBBbHNvLCBpZiB0aGUgcHJlZml4IHBvaW50cyB0byBhIGNvbnN0YW50IGluIHRoZSBtYWluIG91dHB1dAogICAgICAgIC8vIHVuaXQsIHRoZSBvbGQgRkUgd291bGQgc3RpbGwgZ2VuZXJhdGUgYSBkZWZlcnJlZCB3cmFwcGVyIGhlcmUuCiAgICAgICAgaWYgKCFjbG9zZWRXb3JsZC5vdXRwdXRVbml0RGF0YQogICAgICAgICAgICAuaGFzT25seU5vbkRlZmVycmVkSW1wb3J0UGF0aHModGFyZ2V0RWxlbWVudCwgZmllbGQpKSB7CiAgICAgICAgICBDb25zdGFudFZhbHVlIGRlZmVycmVkQ29uc3RhbnQgPSBuZXcgRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlKAogICAgICAgICAgICAgIGZpZWxkRGF0YS5pbml0aWFsVmFsdWUsIG91dHB1dFVuaXQpOwogICAgICAgICAgcmVnaXN0cnkKICAgICAgICAgICAgICAucmVnaXN0ZXJDb25zdGFudFVzZShuZXcgQ29uc3RhbnRVc2UuZGVmZXJyZWQoZGVmZXJyZWRDb25zdGFudCkpOwogICAgICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZERlZmVycmVkQ29uc3RhbnQoCiAgICAgICAgICAgICAgZGVmZXJyZWRDb25zdGFudCwgc291cmNlSW5mb3JtYXRpb24sIGNsb3NlZFdvcmxkKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudChmaWVsZERhdGEuaW5pdGlhbFZhbHVlLCBjbG9zZWRXb3JsZCwKICAgICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICBmaWVsZERhdGEuaXNMYXp5LCAiVW5leHBlY3RlZCBmaWVsZCBkYXRhIGZvciAkZmllbGQ6ICRmaWVsZERhdGEiKTsKICAgICAgICBwdXNoKG5ldyBITGF6eVN0YXRpYyhmaWVsZCwgX3R5cGVJbmZlcmVuY2VNYXAuZ2V0SW5mZXJyZWRUeXBlT2YoZmllbGQpLAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIGlzIGEgY29uc3RhbnQgdGVhciBvZmYsIHNvIHdlIHNob3VsZCBoYXZlCiAgICAgIC8vIGNyZWF0ZWQgYSBjb25zdGFudCB2YWx1ZSBpbnN0ZWFkLiBSZW1vdmUgdGhpcyBjYXNlIHdoZW4gd2UgdXNlIENGRQogICAgICAvLyBjb25zdGFudHMuCiAgICAgIEZ1bmN0aW9uRW50aXR5IG1lbWJlciA9IF9lbGVtZW50TWFwLmdldE1lbWJlcihzdGF0aWNUYXJnZXQpOwogICAgICBwdXNoKG5ldyBIU3RhdGljKG1lbWJlciwgX3R5cGVJbmZlcmVuY2VNYXAuZ2V0SW5mZXJyZWRUeXBlT2YobWVtYmVyKSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljU2V0KGlyLlN0YXRpY1NldCBub2RlKSB7CiAgICBub2RlLnZhbHVlLmFjY2VwdCh0aGlzKTsKICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IHBvcCgpOwoKICAgIGlyLk1lbWJlciBzdGF0aWNUYXJnZXQgPSBub2RlLnRhcmdldDsKICAgIGlmIChzdGF0aWNUYXJnZXQgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgIEZ1bmN0aW9uRW50aXR5IHNldHRlciA9IF9lbGVtZW50TWFwLmdldE1lbWJlcihzdGF0aWNUYXJnZXQpOwogICAgICAvLyBJbnZva2UgdGhlIHNldHRlcgogICAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oc2V0dGVyLCA8SEluc3RydWN0aW9uPlt2YWx1ZV0sCiAgICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC5nZXRSZXR1cm5UeXBlT2Yoc2V0dGVyKSwgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRTZXQobm9kZSkpOwogICAgICBwb3AoKTsKICAgIH0gZWxzZSB7CiAgICAgIE1lbWJlckVudGl0eSB0YXJnZXQgPSBfZWxlbWVudE1hcC5nZXRNZW1iZXIoc3RhdGljVGFyZ2V0KTsKICAgICAgaWYgKCFfZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEodGFyZ2V0KS5pc0VsaWRlZCkgewogICAgICAgIGFkZChuZXcgSFN0YXRpY1N0b3JlKAogICAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgICAgICAgdGFyZ2V0LAogICAgICAgICAgICBfdHlwZUJ1aWxkZXIucG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZBc3NpZ25tZW50KAogICAgICAgICAgICAgICAgdGFyZ2V0LCB2YWx1ZSwgX2dldERhcnRUeXBlSWZWYWxpZChzdGF0aWNUYXJnZXQuc2V0dGVyVHlwZSkpKSk7CiAgICAgIH0KICAgIH0KICAgIHN0YWNrLmFkZCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJvcGVydHlHZXQoaXIuUHJvcGVydHlHZXQgbm9kZSkgewogICAgbm9kZS5yZWNlaXZlci5hY2NlcHQodGhpcyk7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBwb3AoKTsKCiAgICBfcHVzaER5bmFtaWNJbnZvY2F0aW9uKAogICAgICAgIG5vZGUsCiAgICAgICAgX2dldFN0YXRpY1R5cGUobm9kZS5yZWNlaXZlciksCiAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAucmVjZWl2ZXJUeXBlT2ZHZXQobm9kZSksCiAgICAgICAgbmV3IFNlbGVjdG9yLmdldHRlcihfZWxlbWVudE1hcC5nZXROYW1lKG5vZGUubmFtZSkpLAogICAgICAgIDxISW5zdHJ1Y3Rpb24+W3JlY2VpdmVyXSwKICAgICAgICBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEdldChub2RlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VmFyaWFibGVHZXQoaXIuVmFyaWFibGVHZXQgbm9kZSkgewogICAgaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5vZGUudmFyaWFibGU7CiAgICBISW5zdHJ1Y3Rpb24gbGV0QmluZGluZyA9IF9sZXRCaW5kaW5nc1t2YXJpYWJsZV07CiAgICBpZiAobGV0QmluZGluZyAhPSBudWxsKSB7CiAgICAgIHN0YWNrLmFkZChsZXRCaW5kaW5nKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIExvY2FsIGxvY2FsID0gX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKG5vZGUudmFyaWFibGUpOwogICAgc3RhY2suYWRkKGxvY2Fsc0hhbmRsZXIucmVhZExvY2FsKGxvY2FsLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkR2V0KG5vZGUpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJvcGVydHlTZXQoaXIuUHJvcGVydHlTZXQgbm9kZSkgewogICAgbm9kZS5yZWNlaXZlci5hY2NlcHQodGhpcyk7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBwb3AoKTsKICAgIG5vZGUudmFsdWUuYWNjZXB0KHRoaXMpOwogICAgSEluc3RydWN0aW9uIHZhbHVlID0gcG9wKCk7CgogICAgX3B1c2hEeW5hbWljSW52b2NhdGlvbigKICAgICAgICBub2RlLAogICAgICAgIF9nZXRTdGF0aWNUeXBlKG5vZGUucmVjZWl2ZXIpLAogICAgICAgIF90eXBlSW5mZXJlbmNlTWFwLnJlY2VpdmVyVHlwZU9mU2V0KG5vZGUsIF9hYnN0cmFjdFZhbHVlRG9tYWluKSwKICAgICAgICBuZXcgU2VsZWN0b3Iuc2V0dGVyKF9lbGVtZW50TWFwLmdldE5hbWUobm9kZS5uYW1lKSksCiAgICAgICAgPEhJbnN0cnVjdGlvbj5bcmVjZWl2ZXIsIHZhbHVlXSwKICAgICAgICBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEFzc2lnbm1lbnQobm9kZSkpOwoKICAgIHBvcCgpOwogICAgc3RhY2suYWRkKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREaXJlY3RQcm9wZXJ0eUdldChpci5EaXJlY3RQcm9wZXJ0eUdldCBub2RlKSB7CiAgICBub2RlLnJlY2VpdmVyLmFjY2VwdCh0aGlzKTsKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IHBvcCgpOwoKICAgIC8vIEZha2UgZGlyZWN0IGNhbGwgd2l0aCBhIGR5bmFtaWMgY2FsbC4KICAgIC8vIFRPRE8oc3JhKTogSW1wbGVtZW50IGRpcmVjdCBpbnZvY2F0aW9ucyBwcm9wZXJseS4KICAgIF9wdXNoRHluYW1pY0ludm9jYXRpb24oCiAgICAgICAgbm9kZSwKICAgICAgICBfZ2V0U3RhdGljVHlwZShub2RlLnJlY2VpdmVyKSwKICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC5yZWNlaXZlclR5cGVPZkRpcmVjdEdldChub2RlKSwKICAgICAgICBuZXcgU2VsZWN0b3IuZ2V0dGVyKF9lbGVtZW50TWFwLmdldE1lbWJlcihub2RlLnRhcmdldCkubWVtYmVyTmFtZSksCiAgICAgICAgPEhJbnN0cnVjdGlvbj5bcmVjZWl2ZXJdLAogICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkR2V0KG5vZGUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChpci5EaXJlY3RQcm9wZXJ0eVNldCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCdpci5EaXJlY3RQcm9wZXJ0eVNldCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24oaXIuRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCdpci5EaXJlY3RNZXRob2RJbnZvY2F0aW9uJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3VwZXJQcm9wZXJ0eVNldChpci5TdXBlclByb3BlcnR5U2V0IG5vZGUpIHsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQXNzaWdubWVudChub2RlKTsKICAgIG5vZGUudmFsdWUuYWNjZXB0KHRoaXMpOwogICAgSEluc3RydWN0aW9uIHZhbHVlID0gcG9wKCk7CgogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IF9lbGVtZW50TWFwCiAgICAgICAgLmdldFN1cGVyTWVtYmVyKF9jdXJyZW50RnJhbWUubWVtYmVyLCBub2RlLm5hbWUsIHNldHRlcjogdHJ1ZSk7CiAgICBpZiAobWVtYmVyID09IG51bGwpIHsKICAgICAgX2dlbmVyYXRlU3VwZXJOb1N1Y2hNZXRob2Qobm9kZSwgX2VsZW1lbnRNYXAuZ2V0U2VsZWN0b3Iobm9kZSkubmFtZSArICI9IiwKICAgICAgICAgIDxISW5zdHJ1Y3Rpb24+W3ZhbHVlXSwgY29uc3QgPERhcnRUeXBlPltdLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9IGVsc2UgewogICAgICBfYnVpbGRJbnZva2VTdXBlcigKICAgICAgICAgIF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKG5vZGUpLAogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0Q2xhc3MoX2NvbnRhaW5pbmdDbGFzcyhub2RlKSksCiAgICAgICAgICBtZW1iZXIsCiAgICAgICAgICA8SEluc3RydWN0aW9uPlt2YWx1ZV0sCiAgICAgICAgICBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgICBwb3AoKTsKICAgIHN0YWNrLmFkZCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VmFyaWFibGVTZXQoaXIuVmFyaWFibGVTZXQgbm9kZSkgewogICAgbm9kZS52YWx1ZS5hY2NlcHQodGhpcyk7CiAgICBISW5zdHJ1Y3Rpb24gdmFsdWUgPSBwb3AoKTsKICAgIF92aXNpdExvY2FsU2V0dGVyKAogICAgICAgIG5vZGUudmFyaWFibGUsIHZhbHVlLCBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQXNzaWdubWVudChub2RlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIExvY2FsIGxvY2FsID0gX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKG5vZGUpOwogICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgPT0gbnVsbCkgewogICAgICBISW5zdHJ1Y3Rpb24gaW5pdGlhbFZhbHVlID0gZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKTsKICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChsb2NhbCwgaW5pdGlhbFZhbHVlKTsKICAgIH0gZWxzZSBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQgPSBfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgICBhc3NlcnQoY29uc3RhbnQgIT0gbnVsbCwgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSkpOwogICAgICBISW5zdHJ1Y3Rpb24gaW5pdGlhbFZhbHVlID0gZ3JhcGguYWRkQ29uc3RhbnQoY29uc3RhbnQsIGNsb3NlZFdvcmxkKTsKICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChsb2NhbCwgaW5pdGlhbFZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIG5vZGUuaW5pdGlhbGl6ZXIuYWNjZXB0KHRoaXMpOwogICAgICBISW5zdHJ1Y3Rpb24gaW5pdGlhbFZhbHVlID0gcG9wKCk7CgogICAgICBfdmlzaXRMb2NhbFNldHRlcigKICAgICAgICAgIG5vZGUsIGluaXRpYWxWYWx1ZSwgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEFzc2lnbm1lbnQobm9kZSkpOwoKICAgICAgLy8gSWdub3JlIHZhbHVlCiAgICAgIHBvcCgpOwogICAgfQogIH0KCiAgdm9pZCBfdmlzaXRMb2NhbFNldHRlcihpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBISW5zdHJ1Y3Rpb24gdmFsdWUsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBMb2NhbCBsb2NhbCA9IF9sb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZSh2YXJpYWJsZSk7CgogICAgLy8gR2l2ZSB0aGUgdmFsdWUgYSBuYW1lIGlmIGl0IGRvZXNuJ3QgaGF2ZSBvbmUgYWxyZWFkeS4KICAgIGlmICh2YWx1ZS5zb3VyY2VFbGVtZW50ID09IG51bGwpIHsKICAgICAgdmFsdWUuc291cmNlRWxlbWVudCA9IGxvY2FsOwogICAgfQoKICAgIHN0YWNrLmFkZCh2YWx1ZSk7CiAgICBsb2NhbHNIYW5kbGVyLnVwZGF0ZUxvY2FsKAogICAgICAgIGxvY2FsLAogICAgICAgIF90eXBlQnVpbGRlci5wb3RlbnRpYWxseUNoZWNrT3JUcnVzdFR5cGVPZkFzc2lnbm1lbnQoCiAgICAgICAgICAgIF9jdXJyZW50RnJhbWUubWVtYmVyLCB2YWx1ZSwgX2dldERhcnRUeXBlSWZWYWxpZCh2YXJpYWJsZS50eXBlKSksCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMZXQoaXIuTGV0IG5vZGUpIHsKICAgIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBub2RlLnZhcmlhYmxlOwogICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIuYWNjZXB0KHRoaXMpOwogICAgSEluc3RydWN0aW9uIGluaXRpYWxpemVkVmFsdWUgPSBwb3AoKTsKICAgIC8vIFRPRE8oc3JhKTogQXBwbHkgaW5mZXJyZWQgdHlwZSBpbmZvcm1hdGlvbi4KICAgIF9sZXRCaW5kaW5nc1t2YXJpYWJsZV0gPSBpbml0aWFsaXplZFZhbHVlOwogICAgbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCbG9ja0V4cHJlc3Npb24oaXIuQmxvY2tFeHByZXNzaW9uIG5vZGUpIHsKICAgIG5vZGUuYm9keS5hY2NlcHQodGhpcyk7CiAgICBub2RlLnZhbHVlLmFjY2VwdCh0aGlzKTsKICB9CgogIC8vLyBFeHRyYWN0cyB0aGUgbGlzdCBvZiBpbnN0cnVjdGlvbnMgZm9yIHRoZSBwb3NpdGlvbmFsIHN1YnNldCBvZiBhcmd1bWVudHMuCiAgTGlzdDxISW5zdHJ1Y3Rpb24+IF92aXNpdFBvc2l0aW9uYWxBcmd1bWVudHMoaXIuQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IHJlc3VsdCA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICBmb3IgKGlyLkV4cHJlc3Npb24gYXJndW1lbnQgaW4gYXJndW1lbnRzLnBvc2l0aW9uYWwpIHsKICAgICAgYXJndW1lbnQuYWNjZXB0KHRoaXMpOwogICAgICByZXN1bHQuYWRkKHBvcCgpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gQnVpbGRzIHRoZSBsaXN0IG9mIGluc3RydWN0aW9ucyBmb3IgdGhlIGV4cHJlc3Npb25zIGluIHRoZSBhcmd1bWVudHMgdG8gYQogIC8vLyBkeW5hbWljIHRhcmdldCAobWVtYmVyIGZ1bmN0aW9uKS4gIER5bmFtaWMgdGFyZ2V0cyB1c2Ugc3R1YnMgdG8gYWRkCiAgLy8vIGRlZmF1bHRlZCBhcmd1bWVudHMsIHNvICh1bmxpa2Ugc3RhdGljIHRhcmdldHMpIHdlIGRvIG5vdCBhZGQgdGhlIGRlZmF1bHQKICAvLy8gdmFsdWVzLgogIExpc3Q8SEluc3RydWN0aW9uPiBfdmlzaXRBcmd1bWVudHNGb3JEeW5hbWljVGFyZ2V0KAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgaXIuQXJndW1lbnRzIGFyZ3VtZW50cywgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAgW1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uXSkgewogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IHZhbHVlcyA9IF92aXNpdFBvc2l0aW9uYWxBcmd1bWVudHMoYXJndW1lbnRzKTsKCiAgICBpZiAoYXJndW1lbnRzLm5hbWVkLmlzTm90RW1wdHkpIHsKICAgICAgTWFwPFN0cmluZywgSEluc3RydWN0aW9uPiBuYW1lZFZhbHVlcyA9IDxTdHJpbmcsIEhJbnN0cnVjdGlvbj57fTsKICAgICAgZm9yIChpci5OYW1lZEV4cHJlc3Npb24gYXJndW1lbnQgaW4gYXJndW1lbnRzLm5hbWVkKSB7CiAgICAgICAgYXJndW1lbnQudmFsdWUuYWNjZXB0KHRoaXMpOwogICAgICAgIG5hbWVkVmFsdWVzW2FyZ3VtZW50Lm5hbWVdID0gcG9wKCk7CiAgICAgIH0KICAgICAgZm9yIChTdHJpbmcgbmFtZSBpbiBzZWxlY3Rvci5jYWxsU3RydWN0dXJlLmdldE9yZGVyZWROYW1lZEFyZ3VtZW50cygpKSB7CiAgICAgICAgdmFsdWVzLmFkZChuYW1lZFZhbHVlc1tuYW1lXSk7CiAgICAgIH0KICAgIH0KCiAgICBfYWRkVHlwZUFyZ3VtZW50cyh2YWx1ZXMsIHR5cGVBcmd1bWVudHMsIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgICByZXR1cm4gdmFsdWVzOwogIH0KCiAgLy8vIEJ1aWxkIHRoZSBhcmd1bWVudCBsaXN0IGZvciBKUy1pbnRlcm9wIGludm9jYXRpb25zLCB3aGljaCBoYXZlIHNsaWdodGx5CiAgLy8vIGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiBkYXJ0IGJlY2F1c2Ugb2YgSlMncyBudWxsIHZzIHVuZGVmaW5lZCBhbmQgbGFjawogIC8vLyBvZiBuYW1lZCBhcmd1bWVudHMuIFJldHVybiBudWxsIGlmIHRoZSBhcmd1bWVudHMgY291bGQgbm90IGJlIGNvcnJlY3RseQogIC8vLyBwYXJzZWQgYmVjYXVzZSB0aGUgdXNlciBwcm92aWRlZCBjb2RlIHdpdGggbmFtZWQgcGFyYW1ldGVycyBpbiBhIEpTIChub24KICAvLy8gZmFjdG9yeSkgZnVuY3Rpb24uCiAgTGlzdDxISW5zdHJ1Y3Rpb24+IF92aXNpdEFyZ3VtZW50c0Zvck5hdGl2ZVN0YXRpY1RhcmdldCgKICAgICAgaXIuRnVuY3Rpb25Ob2RlIHRhcmdldCwgaXIuQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgLy8gVmlzaXQgYXJndW1lbnRzIGluIHNvdXJjZSBvcmRlciwgdGhlbiByZS1vcmRlciBhbmQgZmlsbCBpbiBkZWZhdWx0cy4KICAgIHZhciB2YWx1ZXMgPSBfdmlzaXRQb3NpdGlvbmFsQXJndW1lbnRzKGFyZ3VtZW50cyk7CgogICAgaWYgKHRhcmdldC5uYW1lZFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICAvLyBPbmx5IGFub255bW91cyBmYWN0b3J5IGNvbnN0cnVjdG9ycyBpbnZvbHZpbmcgSlMgaW50ZXJvcCBhcmUgYWxsb3dlZCB0bwogICAgICAvLyBoYXZlIG5hbWVkIHBhcmFtZXRlcnMuIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3IuCiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyKHRhcmdldC5wYXJlbnQpOwogICAgICBpZiAoZnVuY3Rpb24gaXMgQ29uc3RydWN0b3JFbnRpdHkgJiYgZnVuY3Rpb24uaXNGYWN0b3J5Q29uc3RydWN0b3IpIHsKICAgICAgICAvLyBUT0RPKHNyYSk6IEhhdmUgYSAiQ29tcGlsZWRBcmd1bWVudHMiIHN0cnVjdHVyZSB0byBqdXN0IHVwZGF0ZSB3aXRoCiAgICAgICAgLy8gd2hhdCB2YWx1ZXMgd2UgaGF2ZSByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG1hcCBhbmQgZGUtcG9wdWxhdGluZyBpdC4KICAgICAgICB2YXIgbmFtZWRWYWx1ZXMgPSA8U3RyaW5nLCBISW5zdHJ1Y3Rpb24+e307CiAgICAgICAgZm9yIChpci5OYW1lZEV4cHJlc3Npb24gYXJndW1lbnQgaW4gYXJndW1lbnRzLm5hbWVkKSB7CiAgICAgICAgICBhcmd1bWVudC52YWx1ZS5hY2NlcHQodGhpcyk7CiAgICAgICAgICBuYW1lZFZhbHVlc1thcmd1bWVudC5uYW1lXSA9IHBvcCgpOwogICAgICAgIH0KCiAgICAgICAgLy8gVmlzaXQgbmFtZWQgYXJndW1lbnRzIGluIHBhcmFtZXRlci1wb3NpdGlvbiBvcmRlciwgc2VsZWN0aW5nIHByb3ZpZGVkCiAgICAgICAgLy8gb3IgZGVmYXVsdCB2YWx1ZS4KICAgICAgICB2YXIgbmFtZWRQYXJhbWV0ZXJzID0gdGFyZ2V0Lm5hbWVkUGFyYW1ldGVycy50b0xpc3QoKTsKICAgICAgICBuYW1lZFBhcmFtZXRlcnMuc29ydChuYXRpdmVPcmRlcmluZyk7CiAgICAgICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciBpbiBuYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IG5hbWVkVmFsdWVzW3BhcmFtZXRlci5uYW1lXTsKICAgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOwogICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgbmFtZWRWYWx1ZXMucmVtb3ZlKHBhcmFtZXRlci5uYW1lKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYXNzZXJ0KG5hbWVkVmFsdWVzLmlzRW1wdHkpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRocm93IGFuIGVycm9yIGJlY2F1c2UgSlMgY2Fubm90IGhhbmRsZSBuYW1lZCBwYXJhbWV0ZXJzLgogICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3Bhbm5hYmxlKHRhcmdldEVsZW1lbnQsIHRhcmdldCksCiAgICAgICAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfTUVUSE9EX1dJVEhfTkFNRURfQVJHVU1FTlRTLAogICAgICAgICAgICB7J21ldGhvZCc6IGZ1bmN0aW9uLm5hbWV9KTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbHVlczsKICB9CgogIC8vLyBGaWxscyBbdHlwZUFyZ3VtZW50c10gd2l0aCB0aGUgdHlwZSBhcmd1bWVudHMgbmVlZGVkIGZvciBbc2VsZWN0b3JdIGFuZAogIC8vLyByZXR1cm5zIHRoZSBzZWxlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXNzZWQgdHlwZSBhcmd1bWVudHMuCiAgU2VsZWN0b3IgX2ZpbGxEeW5hbWljVHlwZUFyZ3VtZW50cygKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIGlyLkFyZ3VtZW50cyBhcmd1bWVudHMsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIGlmIChzZWxlY3Rvci50eXBlQXJndW1lbnRDb3VudCA+IDApIHsKICAgICAgaWYgKF9ydGlOZWVkLnNlbGVjdG9yTmVlZHNUeXBlQXJndW1lbnRzKHNlbGVjdG9yKSkgewogICAgICAgIHR5cGVBcmd1bWVudHMuYWRkQWxsKGFyZ3VtZW50cy50eXBlcy5tYXAoX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gc2VsZWN0b3IudG9Ob25HZW5lcmljKCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzZWxlY3RvcjsKICB9CgogIExpc3Q8RGFydFR5cGU+IF9nZXRDb25zdHJ1Y3RvclR5cGVBcmd1bWVudHMoCiAgICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yLCBpci5Bcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBQYXNzIHR5cGUgYXJndW1lbnRzIHRvIGNvbnN0cnVjdG9ycyBsaWtlIGNhbGxpbmcKICAgIC8vIGEgZ2VuZXJpYyBtZXRob2QuCiAgICByZXR1cm4gY29uc3QgPERhcnRUeXBlPltdOwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiB0eXBlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvCiAgLy8gY29uc3RydWN0b3JzIGxpa2UgY2FsbGluZyBhIGdlbmVyaWMgbWV0aG9kLgogIExpc3Q8RGFydFR5cGU+IF9nZXRDbGFzc1R5cGVBcmd1bWVudHMoCiAgICAgIENsYXNzRW50aXR5IGNscywgaXIuQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgaWYgKF9ydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGNscykpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy50eXBlcy5tYXAoX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUpLnRvTGlzdCgpOwogICAgfQogICAgcmV0dXJuIGNvbnN0IDxEYXJ0VHlwZT5bXTsKICB9CgogIExpc3Q8RGFydFR5cGU+IF9nZXRTdGF0aWNUeXBlQXJndW1lbnRzKAogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgaXIuQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgaWYgKF9ydGlOZWVkLm1ldGhvZE5lZWRzVHlwZUFyZ3VtZW50cyhmdW5jdGlvbikpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy50eXBlcy5tYXAoX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUpLnRvTGlzdCgpOwogICAgfQogICAgcmV0dXJuIGNvbnN0IDxEYXJ0VHlwZT5bXTsKICB9CgogIC8vLyBCdWlsZCBhcmd1bWVudCBsaXN0IGluIGNhbm9uaWNhbCBvcmRlciBmb3IgYSBzdGF0aWMgW3RhcmdldF0sIGluY2x1ZGluZwogIC8vLyBmaWxsaW5nIGluIHRoZSBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlLgogIExpc3Q8SEluc3RydWN0aW9uPiBfdmlzaXRBcmd1bWVudHNGb3JTdGF0aWNUYXJnZXQoCiAgICAgIGlyLkZ1bmN0aW9uTm9kZSB0YXJnZXQsCiAgICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgIGlyLkFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAvLyBWaXNpdCBhcmd1bWVudHMgaW4gc291cmNlIG9yZGVyLCB0aGVuIHJlLW9yZGVyIGFuZCBmaWxsIGluIGRlZmF1bHRzLgogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IHZhbHVlcyA9IF92aXNpdFBvc2l0aW9uYWxBcmd1bWVudHMoYXJndW1lbnRzKTsKCiAgICB3aGlsZSAodmFsdWVzLmxlbmd0aCA8IHBhcmFtZXRlclN0cnVjdHVyZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBpci5WYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9CiAgICAgICAgICB0YXJnZXQucG9zaXRpb25hbFBhcmFtZXRlcnNbdmFsdWVzLmxlbmd0aF07CiAgICAgIHZhbHVlcy5hZGQoX2RlZmF1bHRWYWx1ZUZvclBhcmFtZXRlcihwYXJhbWV0ZXIpKTsKICAgIH0KCiAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIE1hcDxTdHJpbmcsIEhJbnN0cnVjdGlvbj4gbmFtZWRWYWx1ZXMgPSB7fTsKICAgICAgZm9yIChpci5OYW1lZEV4cHJlc3Npb24gYXJndW1lbnQgaW4gYXJndW1lbnRzLm5hbWVkKSB7CiAgICAgICAgYXJndW1lbnQudmFsdWUuYWNjZXB0KHRoaXMpOwogICAgICAgIG5hbWVkVmFsdWVzW2FyZ3VtZW50Lm5hbWVdID0gcG9wKCk7CiAgICAgIH0KCiAgICAgIC8vIFZpc2l0IG5hbWVkIGFyZ3VtZW50cyBpbiBwYXJhbWV0ZXItcG9zaXRpb24gb3JkZXIsIHNlbGVjdGluZyBwcm92aWRlZAogICAgICAvLyBvciBkZWZhdWx0IHZhbHVlLgogICAgICAvLyBUT0RPKHNyYSk6IEVuc3VyZSB0aGUgc3RvcmVkIG9yZGVyIGlzIGNhbm9uaWNhbCBzbyB3ZSBkb24ndCBoYXZlIHRvCiAgICAgIC8vIHNvcnQuIFRoZSBvbGQgYnVpbGRlciB1c2VzIENhbGxTdHJ1Y3R1cmUubWFrZUFyZ3VtZW50TGlzdCB3aGljaCBkZXBlbmRzCiAgICAgIC8vIG9uIHRoZSBvbGQgZWxlbWVudCBtb2RlbC4KICAgICAgTGlzdDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBuYW1lZFBhcmFtZXRlcnMgPSB0YXJnZXQubmFtZWRQYXJhbWV0ZXJzCiAgICAgICAgICAvLyBGaWx0ZXIgZWxpZGVkIHBhcmFtZXRlcnMuCiAgICAgICAgICAud2hlcmUoKHApID0+IHBhcmFtZXRlclN0cnVjdHVyZS5uYW1lZFBhcmFtZXRlcnMuY29udGFpbnMocC5uYW1lKSkKICAgICAgICAgIC50b0xpc3QoKQogICAgICAgICAgICAuLnNvcnQobmFtZWRPcmRlcmluZyk7CiAgICAgIGZvciAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgaW4gbmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgSEluc3RydWN0aW9uIHZhbHVlID0gbmFtZWRWYWx1ZXNbcGFyYW1ldGVyLm5hbWVdOwogICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICB2YWx1ZXMuYWRkKF9kZWZhdWx0VmFsdWVGb3JQYXJhbWV0ZXIocGFyYW1ldGVyKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOwogICAgICAgICAgbmFtZWRWYWx1ZXMucmVtb3ZlKHBhcmFtZXRlci5uYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYXNzZXJ0KG5hbWVkVmFsdWVzLmlzRW1wdHkpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGFyZ3VtZW50cy5uYW1lZC5pc0VtcHR5KTsKICAgIH0KCiAgICBfYWRkVHlwZUFyZ3VtZW50cyh2YWx1ZXMsIHR5cGVBcmd1bWVudHMsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIHJldHVybiB2YWx1ZXM7CiAgfQoKICB2b2lkIF9hZGRUeXBlQXJndW1lbnRzKExpc3Q8SEluc3RydWN0aW9uPiB2YWx1ZXMsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBpZiAodHlwZUFyZ3VtZW50cy5pc0VtcHR5KSByZXR1cm47CiAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gdHlwZUFyZ3VtZW50cykgewogICAgICB2YWx1ZXMuYWRkKF90eXBlQnVpbGRlci5hbmFseXplVHlwZUFyZ3VtZW50KHR5cGUsIHNvdXJjZUVsZW1lbnQsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIEhJbnN0cnVjdGlvbiBfZGVmYXVsdFZhbHVlRm9yUGFyYW1ldGVyKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyKSB7CiAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0KICAgICAgICBfZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKHBhcmFtZXRlci5pbml0aWFsaXplciwgaW1wbGljaXROdWxsOiB0cnVlKTsKICAgIGFzc2VydChjb25zdGFudCAhPSBudWxsLCBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFKSk7CiAgICByZXR1cm4gZ3JhcGguYWRkQ29uc3RhbnQoY29uc3RhbnQsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgaXIuUHJvY2VkdXJlIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRDYWxsKG5vZGUsIG5vZGUpOwogICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24gPSBfZWxlbWVudE1hcC5nZXRNZW1iZXIodGFyZ2V0KTsKICAgIGlmIChfY29tbW9uRWxlbWVudHMuaXNGb3JlaWduSGVscGVyKGZ1bmN0aW9uKSkgewogICAgICBfaGFuZGxlSW52b2tlU3RhdGljRm9yZWlnbihub2RlLCBmdW5jdGlvbik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoX2NvbW1vbkVsZW1lbnRzLmlzRXh0cmFjdFR5cGVBcmd1bWVudHMoZnVuY3Rpb24pICYmCiAgICAgICAgX2hhbmRsZUV4dHJhY3RUeXBlQXJndW1lbnRzKG5vZGUsIHNvdXJjZUluZm9ybWF0aW9uKSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgQWJzdHJhY3RWYWx1ZSB0eXBlTWFzayA9IF90eXBlSW5mZXJlbmNlTWFwLmdldFJldHVyblR5cGVPZihmdW5jdGlvbik7CgogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9CiAgICAgICAgX2dldFN0YXRpY1R5cGVBcmd1bWVudHMoZnVuY3Rpb24sIG5vZGUuYXJndW1lbnRzKTsKICAgIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudHMgPSBjbG9zZWRXb3JsZC5uYXRpdmVEYXRhCiAgICAgICAgICAgIC5pc0pzSW50ZXJvcE1lbWJlcihmdW5jdGlvbikKICAgICAgICA/IF92aXNpdEFyZ3VtZW50c0Zvck5hdGl2ZVN0YXRpY1RhcmdldCh0YXJnZXQuZnVuY3Rpb24sIG5vZGUuYXJndW1lbnRzKQogICAgICAgIDogX3Zpc2l0QXJndW1lbnRzRm9yU3RhdGljVGFyZ2V0KAogICAgICAgICAgICB0YXJnZXQuZnVuY3Rpb24sCiAgICAgICAgICAgIGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICAgICAgbm9kZS5hcmd1bWVudHMsCiAgICAgICAgICAgIHR5cGVBcmd1bWVudHMsCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgICAvLyBFcnJvciBpbiB0aGUgYXJndW1lbnRzIHByb3ZpZGVkLiBEbyBub3QgcHJvY2VzcyBmdXJ0aGVyLgogICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpKTsgLy8gUmVzdWx0IGV4cGVjdGVkIG9uIHN0YWNrCiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoZnVuY3Rpb24gaXMgQ29uc3RydWN0b3JFbnRpdHkgJiYgZnVuY3Rpb24uaXNGYWN0b3J5Q29uc3RydWN0b3IpIHsKICAgICAgX2hhbmRsZUludm9rZUZhY3RvcnlDb25zdHJ1Y3RvcigKICAgICAgICAgIG5vZGUsIGZ1bmN0aW9uLCB0eXBlTWFzaywgYXJndW1lbnRzLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBTdGF0aWMgbWV0aG9kcyBjdXJyZW50bHkgaWdub3JlIHRoZSB0eXBlIHBhcmFtZXRlcnMuCiAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oZnVuY3Rpb24sIGFyZ3VtZW50cywgdHlwZU1hc2ssIHR5cGVBcmd1bWVudHMsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIHZvaWQgX2hhbmRsZUludm9rZUZhY3RvcnlDb25zdHJ1Y3RvcigKICAgICAgaXIuU3RhdGljSW52b2NhdGlvbiBpbnZvY2F0aW9uLAogICAgICBDb25zdHJ1Y3RvckVudGl0eSBmdW5jdGlvbiwKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlTWFzaywKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGFyZ3VtZW50cywKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIGlmIChmdW5jdGlvbi5pc0V4dGVybmFsICYmIGZ1bmN0aW9uLmlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3IpIHsKICAgICAgaWYgKGludm9jYXRpb24uaXNDb25zdCkgewogICAgICAgIC8vIEp1c3QgbGlrZSBhbGwgY29uc3QgY29uc3RydWN0b3JzIChzZWUgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24pLgogICAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudCgKICAgICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZShpbnZvY2F0aW9uKSwgY2xvc2VkV29ybGQsCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB9IGVsc2UgewogICAgICAgIF9nZW5lcmF0ZVVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAgICcke2Z1bmN0aW9uLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiR7ZnVuY3Rpb24ubmFtZX0gJwogICAgICAgICAgICAnY2FuIG9ubHkgYmUgdXNlZCBhcyBhIGNvbnN0IGNvbnN0cnVjdG9yJywKICAgICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBib29sIGlzRml4ZWRMaXN0ID0gZmFsc2U7IC8vIEFueSBmaXhlZCBsaXN0LCBlLmcuIG5ldyBMaXN0KDEwKSwgIFVJbnQ4TGlzdC4KCiAgICAvLyBSZWNvZ25pemUgYG5ldyBMaXN0KClgIGFuZCBgbmV3IExpc3QobilgLgogICAgYm9vbCBpc0ZpeGVkTGlzdENvbnN0cnVjdG9yQ2FsbCA9IGZhbHNlOwogICAgYm9vbCBpc0dyb3dhYmxlTGlzdENvbnN0cnVjdG9yQ2FsbCA9IGZhbHNlOwogICAgaWYgKF9jb21tb25FbGVtZW50cy5pc1VubmFtZWRMaXN0Q29uc3RydWN0b3IoZnVuY3Rpb24pICYmCiAgICAgICAgaW52b2NhdGlvbi5hcmd1bWVudHMubmFtZWQuaXNFbXB0eSkgewogICAgICBpbnQgYXJndW1lbnRDb3VudCA9IGludm9jYXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoOwogICAgICBpc0ZpeGVkTGlzdENvbnN0cnVjdG9yQ2FsbCA9IGFyZ3VtZW50Q291bnQgPT0gMTsKICAgICAgaXNHcm93YWJsZUxpc3RDb25zdHJ1Y3RvckNhbGwgPSBhcmd1bWVudENvdW50ID09IDA7CiAgICAgIGlzRml4ZWRMaXN0ID0gaXNGaXhlZExpc3RDb25zdHJ1Y3RvckNhbGw7CiAgICB9CgogICAgSW50ZXJmYWNlVHlwZSBpbnN0YW5jZVR5cGUgPSBfZWxlbWVudE1hcC5jcmVhdGVJbnRlcmZhY2VUeXBlKAogICAgICAgIGludm9jYXRpb24udGFyZ2V0LmVuY2xvc2luZ0NsYXNzLCBpbnZvY2F0aW9uLmFyZ3VtZW50cy50eXBlcyk7CgogICAgQWJzdHJhY3RWYWx1ZSByZXN1bHRUeXBlID0gdHlwZU1hc2s7CgogICAgYm9vbCBpc0pTQXJyYXlUeXBlZENvbnN0cnVjdG9yID0KICAgICAgICBmdW5jdGlvbiA9PSBfY29tbW9uRWxlbWVudHMuanNBcnJheVR5cGVkQ29uc3RydWN0b3I7CgogICAgX2luZmVycmVkVHlwZU9mTmV3TGlzdChpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgICAgcmV0dXJuIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMudHlwZU9mTmV3TGlzdChub2RlKSA/PwogICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgICB9CgogICAgaWYgKGlzRml4ZWRMaXN0Q29uc3RydWN0b3JDYWxsKSB7CiAgICAgIGFzc2VydCgKICAgICAgICAgIC8vIEFyZ3VtZW50cyBtYXkgaW5jbHVkZSB0aGUgdHlwZS4KICAgICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPT0gMSB8fCBhcmd1bWVudHMubGVuZ3RoID09IDIsCiAgICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgICBmdW5jdGlvbiwKICAgICAgICAgICAgICAiVW5leHBlY3RlZCBhcmd1bWVudHMuICIKICAgICAgICAgICAgICAiRXhwZWN0ZWQgMS0yIGFyZ3VtZW50LCBhY3R1YWw6ICRhcmd1bWVudHMuIikpOwogICAgICBISW5zdHJ1Y3Rpb24gbGVuZ3RoSW5wdXQgPSBhcmd1bWVudHMuZmlyc3Q7CiAgICAgIGlmIChsZW5ndGhJbnB1dC5pc051bWJlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNQb3RlbnRpYWxseUZhbHNlKSB7CiAgICAgICAgSFByaW1pdGl2ZUNoZWNrIGNvbnZlcnNpb24gPSBuZXcgSFByaW1pdGl2ZUNoZWNrKAogICAgICAgICAgICBfY29tbW9uRWxlbWVudHMubnVtVHlwZSwKICAgICAgICAgICAgSFByaW1pdGl2ZUNoZWNrLkFSR1VNRU5UX1RZUEVfQ0hFQ0ssCiAgICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLm51bVR5cGUsCiAgICAgICAgICAgIGxlbmd0aElucHV0LAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgYWRkKGNvbnZlcnNpb24pOwogICAgICAgIGxlbmd0aElucHV0ID0gY29udmVyc2lvbjsKICAgICAgfQogICAgICBqcy5UZW1wbGF0ZSBjb2RlID0ganMuanMucGFyc2VGb3JlaWduSlMoJ25ldyBBcnJheSgjKScpOwogICAgICB2YXIgYmVoYXZpb3IgPSBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKCiAgICAgIHZhciBleHBlY3RlZFR5cGUgPQogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUoaW52b2NhdGlvbi5nZXRTdGF0aWNUeXBlKG51bGwpKTsKICAgICAgYmVoYXZpb3IudHlwZXNJbnN0YW50aWF0ZWQuYWRkKGV4cGVjdGVkVHlwZSk7CiAgICAgIGJlaGF2aW9yLnR5cGVzUmV0dXJuZWQuYWRkKGV4cGVjdGVkVHlwZSk7CgogICAgICAvLyBUaGUgYWxsb2NhdGlvbiBjYW4gdGhyb3cgb25seSBpZiB0aGUgZ2l2ZW4gbGVuZ3RoIGlzIGEgZG91YmxlIG9yCiAgICAgIC8vIG91dHNpZGUgdGhlIHVuc2lnbmVkIDMyIGJpdCByYW5nZS4KICAgICAgLy8gVE9ETyhzcmEpOiBBcnJheSBhbGxvY2F0aW9uIHNob3VsZCBiZSBhbiBpbnN0cnVjdGlvbiBzbyB0aGF0IGNhblRocm93CiAgICAgIC8vIGNhbiBkZXBlbmQgb24gYSBsZW5ndGggdHlwZSBkaXNjb3ZlcmVkIGluIG9wdGltaXphdGlvbi4KICAgICAgYm9vbCBjYW5UaHJvdyA9IHRydWU7CiAgICAgIGlmIChsZW5ndGhJbnB1dC5pc1VJbnQzMihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAgIGNhblRocm93ID0gZmFsc2U7CiAgICAgIH0KCiAgICAgIHZhciBpbmZlcnJlZFR5cGUgPSBfaW5mZXJyZWRUeXBlT2ZOZXdMaXN0KGludm9jYXRpb24pOwogICAgICByZXN1bHRUeXBlID0KICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmNvbnRhaW5zQWxsKGluZmVycmVkVHlwZSkuaXNQb3RlbnRpYWxseVRydWUKICAgICAgICAgICAgICA/IF9hYnN0cmFjdFZhbHVlRG9tYWluLmZpeGVkTGlzdFR5cGUKICAgICAgICAgICAgICA6IGluZmVycmVkVHlwZTsKICAgICAgSEZvcmVpZ25Db2RlIGZvcmVpZ24gPSBuZXcgSEZvcmVpZ25Db2RlKAogICAgICAgICAgY29kZSwgcmVzdWx0VHlwZSwgPEhJbnN0cnVjdGlvbj5bbGVuZ3RoSW5wdXRdLAogICAgICAgICAgbmF0aXZlQmVoYXZpb3I6IGJlaGF2aW9yLAogICAgICAgICAgdGhyb3dCZWhhdmlvcjoKICAgICAgICAgICAgICBjYW5UaHJvdyA/IE5hdGl2ZVRocm93QmVoYXZpb3IuTUFZIDogTmF0aXZlVGhyb3dCZWhhdmlvci5ORVZFUikKICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICAgIHB1c2goZm9yZWlnbik7CiAgICAgIC8vIFRPRE8ocmVkZW1wdGlvbik6IEdsb2JhbCB0eXBlIGFuYWx5c2lzIHRyYWNpbmcgbWF5IGhhdmUgZGV0ZXJtaW5lZCB0aGF0CiAgICAgIC8vIHRoZSBmaXhlZC1sZW5ndGggcHJvcGVydHkgaXMgbmV2ZXIgY2hlY2tlZC4gSWYgc28sIHdlIGNhbiBhdm9pZCBtYXJraW5nCiAgICAgIC8vIHRoZSBhcnJheS4KICAgICAgewogICAgICAgIGpzLlRlbXBsYXRlIGNvZGUgPSBqcy5qcy5wYXJzZUZvcmVpZ25KUyhyJyMuZml4ZWQkbGVuZ3RoID0gQXJyYXknKTsKICAgICAgICAvLyBXZSBzZXQgdGhlIGluc3RydWN0aW9uIGFzIFtjYW5UaHJvd10gdG8gYXZvaWQgaXQgYmVpbmcgZGVhZCBjb2RlLgogICAgICAgIC8vIFdlIG5lZWQgYSBmaW5lciBncmFpbmVkIHNpZGUgZWZmZWN0LgogICAgICAgIGFkZChuZXcgSEZvcmVpZ25Db2RlKGNvZGUsIF9hYnN0cmFjdFZhbHVlRG9tYWluLm51bGxUeXBlLCBbc3RhY2subGFzdF0sCiAgICAgICAgICAgIHRocm93QmVoYXZpb3I6IE5hdGl2ZVRocm93QmVoYXZpb3IuTUFZKSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaXNHcm93YWJsZUxpc3RDb25zdHJ1Y3RvckNhbGwpIHsKICAgICAgcHVzaChfYnVpbGRMaXRlcmFsTGlzdCg8SEluc3RydWN0aW9uPltdKSk7CiAgICAgIHZhciBpbmZlcnJlZFR5cGUgPSBfaW5mZXJyZWRUeXBlT2ZOZXdMaXN0KGludm9jYXRpb24pOwogICAgICByZXN1bHRUeXBlID0KICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmNvbnRhaW5zQWxsKGluZmVycmVkVHlwZSkuaXNQb3RlbnRpYWxseVRydWUKICAgICAgICAgICAgICA/IF9hYnN0cmFjdFZhbHVlRG9tYWluLmdyb3dhYmxlTGlzdFR5cGUKICAgICAgICAgICAgICA6IGluZmVycmVkVHlwZTsKICAgICAgc3RhY2subGFzdC5pbnN0cnVjdGlvblR5cGUgPSByZXN1bHRUeXBlOwogICAgfSBlbHNlIGlmIChpc0pTQXJyYXlUeXBlZENvbnN0cnVjdG9yKSB7CiAgICAgIC8vIFRPRE8oc3JhKTogSW5zdGVhZCBvZiBjYWxsaW5nIHRoZSBpZGVudGl0eS1saWtlIGZhY3RvcnkgY29uc3RydWN0b3IsCiAgICAgIC8vIHNpbXBseSBzZWxlY3QgdGhlIHNpbmdsZSBhcmd1bWVudC4KICAgICAgLy8gRmFjdG9yeSBjb25zdHJ1Y3RvcnMgdGFrZSB0eXBlIHBhcmFtZXRlcnMuCiAgICAgIGlmIChjbG9zZWRXb3JsZC5ydGlOZWVkCiAgICAgICAgICAuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3MpKSB7fQogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICAgIF9nZXRDb25zdHJ1Y3RvclR5cGVBcmd1bWVudHMoZnVuY3Rpb24sIGludm9jYXRpb24uYXJndW1lbnRzKTsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiB0eXBlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvCiAgICAgIC8vIGNvbnN0cnVjdG9ycyBsaWtlIGNhbGxpbmcgYSBnZW5lcmljIG1ldGhvZC4KICAgICAgX2FkZFR5cGVBcmd1bWVudHMoCiAgICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgICBfZ2V0Q2xhc3NUeXBlQXJndW1lbnRzKGZ1bmN0aW9uLmVuY2xvc2luZ0NsYXNzLCBpbnZvY2F0aW9uLmFyZ3VtZW50cyksCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbihmdW5jdGlvbiwgYXJndW1lbnRzLCB0eXBlTWFzaywgdHlwZUFyZ3VtZW50cywKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9IGVsc2UgewogICAgICAvLyBGYWN0b3J5IGNvbnN0cnVjdG9ycyB0YWtlIHR5cGUgcGFyYW1ldGVycy4KICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9CiAgICAgICAgICBfZ2V0Q29uc3RydWN0b3JUeXBlQXJndW1lbnRzKGZ1bmN0aW9uLCBpbnZvY2F0aW9uLmFyZ3VtZW50cyk7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHdoZW4gdHlwZSBhcmd1bWVudHMgYXJlIHBhc3NlZCB0bwogICAgICAvLyBjb25zdHJ1Y3RvcnMgbGlrZSBjYWxsaW5nIGEgZ2VuZXJpYyBtZXRob2QuCiAgICAgIF9hZGRUeXBlQXJndW1lbnRzKAogICAgICAgICAgYXJndW1lbnRzLAogICAgICAgICAgX2dldENsYXNzVHlwZUFyZ3VtZW50cyhmdW5jdGlvbi5lbmNsb3NpbmdDbGFzcywgaW52b2NhdGlvbi5hcmd1bWVudHMpLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogICAgICBpbnN0YW5jZVR5cGUgPSBsb2NhbHNIYW5kbGVyLnN1YnN0SW5Db250ZXh0KGluc3RhbmNlVHlwZSk7CiAgICAgIF9hZGRJbXBsaWNpdEluc3RhbnRpYXRpb24oaW5zdGFuY2VUeXBlKTsKICAgICAgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKGZ1bmN0aW9uLCBhcmd1bWVudHMsIHR5cGVNYXNrLCB0eXBlQXJndW1lbnRzLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uLCBpbnN0YW5jZVR5cGU6IGluc3RhbmNlVHlwZSk7CiAgICB9CgogICAgSEluc3RydWN0aW9uIG5ld0luc3RhbmNlID0gc3RhY2subGFzdDsKCiAgICBpZiAoaXNGaXhlZExpc3QpIHsKICAgICAgLy8gSWYgd2UgaW5saW5lZCBhIGNvbnN0cnVjdG9yIHRoZSBjYWxsLXNpdGUtc3BlY2lmaWMgdHlwZSBmcm9tIHR5cGUKICAgICAgLy8gaW5mZXJlbmNlIChlLmcuIGEgY29udGFpbmVyIHR5cGUpIHdpbGwgbm90IGJlIG9uIHRoZSBub2RlLiBTdG9yZSB0aGUKICAgICAgLy8gbW9yZSBzcGVjaWFsaXplZCB0eXBlIG9uIHRoZSBhbGxvY2F0aW9uLgogICAgICBuZXdJbnN0YW5jZS5pbnN0cnVjdGlvblR5cGUgPSByZXN1bHRUeXBlOwogICAgICBncmFwaC5hbGxvY2F0ZWRGaXhlZExpc3RzLmFkZChuZXdJbnN0YW5jZSk7CiAgICB9CgogICAgaWYgKF9ydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKF9jb21tb25FbGVtZW50cy5saXN0Q2xhc3MpICYmCiAgICAgICAgKGlzRml4ZWRMaXN0Q29uc3RydWN0b3JDYWxsIHx8CiAgICAgICAgICAgIGlzR3Jvd2FibGVMaXN0Q29uc3RydWN0b3JDYWxsIHx8CiAgICAgICAgICAgIGlzSlNBcnJheVR5cGVkQ29uc3RydWN0b3IpKSB7CiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IF9lbGVtZW50TWFwLmNyZWF0ZUludGVyZmFjZVR5cGUoCiAgICAgICAgICBpbnZvY2F0aW9uLnRhcmdldC5lbmNsb3NpbmdDbGFzcywgaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXMpOwogICAgICBzdGFjawogICAgICAgICAgLmFkZChfc2V0TGlzdFJ1bnRpbWVUeXBlSW5mb0lmTmVlZGVkKHBvcCgpLCB0eXBlLCBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogIH0KCiAgLy8vIFJlcGxhY2UgY2FsbHMgdG8gYGV4dHJhY3RUeXBlQXJndW1lbnRzYCB3aXRoIGVxdWl2YWxlbnQgY29kZS4gUmV0dXJucwogIC8vLyBgdHJ1ZWAgaWYgYGV4dHJhY3RUeXBlQXJndW1lbnRzYCBpcyBoYW5kbGVkLgogIGJvb2wgX2hhbmRsZUV4dHJhY3RUeXBlQXJndW1lbnRzKAogICAgICBpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24sIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAvLyBFeHBhbmQgY2FsbHMgYXMgZm9sbG93czoKICAgIC8vCiAgICAvLyAgICAgciA9IGV4dHJhY3RUeXBlQXJndW1lbnRzPE1hcD4oZSwgZikKICAgIC8vIC0tPgogICAgLy8gICAgIGludGVyY2VwdG9yID0gZ2V0SW50ZXJjZXB0b3IoZSk7CiAgICAvLyAgICAgVDEgPSBnZXRSdW50aW1lVHlwZUFyZ3VtZW50SW50ZXJjZXB0ZWQoaW50ZXJjZXB0b3IsIGUsICdNYXAnLCAwKTsKICAgIC8vICAgICBUMiA9IGdldFJ1bnRpbWVUeXBlQXJndW1lbnRJbnRlcmNlcHRlZChpbnRlcmNlcHRvciwgZSwgJ01hcCcsIDEpOwogICAgLy8gICAgIHIgPSBmPFQxLCBUMj4oKTsKICAgIC8vCiAgICAvLyBUT0RPKHNyYSk6IFNob3VsZCB3ZSBhZGQgYSBjaGVjayBiZWZvcmUgdGhlIHZhcmlhYmxlIGV4dHJhY3Rpb24/IFdlIGNvdWxkCiAgICAvLyBhZGQgYSB0eXBlIGNoZWNrICh3aGljaCB3b3VsZCBwZXJtaXQgYG51bGxgKSwgb3IgYWRkIGFuIGlzLWNoZWNrIHdpdGggYW4KICAgIC8vIGV4cGxpY2l0IHRocm93LgoKICAgIGlmIChpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCAhPSAyKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoaW52b2NhdGlvbi5hcmd1bWVudHMubmFtZWQuaXNOb3RFbXB0eSkgcmV0dXJuIGZhbHNlOwogICAgdmFyIHR5cGVzID0gaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXM7CiAgICBpZiAodHlwZXMubGVuZ3RoICE9IDEpIHJldHVybiBmYWxzZTsKCiAgICAvLyBUaGUgdHlwZSBzaG91bGQgYmUgYSBzaW5nbGUgdHlwZSBuYW1lLgogICAgaXIuRGFydFR5cGUgdHlwZSA9IHR5cGVzLmZpcnN0OwogICAgRGFydFR5cGUgdHlwZVZhbHVlID0KICAgICAgICBsb2NhbHNIYW5kbGVyLnN1YnN0SW5Db250ZXh0KF9lbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpKTsKICAgIGlmICh0eXBlVmFsdWUgaXMhIEludGVyZmFjZVR5cGUpIHJldHVybiBmYWxzZTsKICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IHR5cGVWYWx1ZTsKICAgIGlmICghaW50ZXJmYWNlVHlwZS50cmVhdEFzUmF3KSByZXR1cm4gZmFsc2U7CgogICAgQ2xhc3NFbnRpdHkgY2xzID0gaW50ZXJmYWNlVHlwZS5lbGVtZW50OwogICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoY2xzKTsKCiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gYXJndW1lbnRzID0KICAgICAgICBfdmlzaXRQb3NpdGlvbmFsQXJndW1lbnRzKGludm9jYXRpb24uYXJndW1lbnRzKTsKCiAgICBISW5zdHJ1Y3Rpb24gb2JqZWN0ID0gYXJndW1lbnRzWzBdOwogICAgSEluc3RydWN0aW9uIGNsb3N1cmUgPSBhcmd1bWVudHNbMV07CiAgICBISW5zdHJ1Y3Rpb24gaW50ZXJjZXB0b3IgPSBfaW50ZXJjZXB0b3JGb3Iob2JqZWN0LCBzb3VyY2VJbmZvcm1hdGlvbik7CgogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IDxISW5zdHJ1Y3Rpb24+W2Nsb3N1cmVdOwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IDxEYXJ0VHlwZT5bXTsKCiAgICB0aGlzVHlwZS50eXBlQXJndW1lbnRzLmZvckVhY2goKF90eXBlVmFyaWFibGUpIHsKICAgICAgVHlwZVZhcmlhYmxlVHlwZSB2YXJpYWJsZSA9IF90eXBlVmFyaWFibGU7CiAgICAgIHR5cGVBcmd1bWVudHMuYWRkKHZhcmlhYmxlKTsKICAgICAgSEluc3RydWN0aW9uIHJlYWRUeXBlID0gbmV3IEhUeXBlSW5mb1JlYWRWYXJpYWJsZS5pbnRlcmNlcHRlZCgKICAgICAgICAgIHZhcmlhYmxlLCBpbnRlcmNlcHRvciwgb2JqZWN0LCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSk7CiAgICAgIGFkZChyZWFkVHlwZSk7CiAgICAgIGlucHV0cy5hZGQocmVhZFR5cGUpOwogICAgfSk7CgogICAgLy8gVE9ETyhzcmEpOiBJbiBjb21wbGlhbmNlIG1vZGUsIGluc2VydCBhIGNoZWNrIHRoYXQgW2Nsb3N1cmVdIGlzIGEKICAgIC8vIGZ1bmN0aW9uIG9mIE4gdHlwZSBhcmd1bWVudHMuCgogICAgU2VsZWN0b3Igc2VsZWN0b3IgPQogICAgICAgIG5ldyBTZWxlY3Rvci5jYWxsQ2xvc3VyZSgwLCBjb25zdCA8U3RyaW5nPltdLCB0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBTdGF0aWNUeXBlIHJlY2VpdmVyU3RhdGljVHlwZSA9CiAgICAgICAgX2dldFN0YXRpY1R5cGUoaW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbFsxXSk7CiAgICBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyVHlwZSA9IF9hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgLmNyZWF0ZUZyb21TdGF0aWNUeXBlKAogICAgICAgICAgICByZWNlaXZlclN0YXRpY1R5cGUudHlwZSwgcmVjZWl2ZXJTdGF0aWNUeXBlLnJlbGF0aW9uKQogICAgICAgIC5hYnN0cmFjdFZhbHVlOwogICAgcHVzaChuZXcgSEludm9rZUNsb3N1cmUoc2VsZWN0b3IsIHJlY2VpdmVyVHlwZSwgaW5wdXRzLAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLCB0eXBlQXJndW1lbnRzKSk7CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICB2b2lkIF9oYW5kbGVJbnZva2VTdGF0aWNGb3JlaWduKAogICAgICBpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24sIE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIFN0cmluZyBuYW1lID0gbWVtYmVyLm5hbWU7CiAgICBpZiAobmFtZSA9PSAnSlMnKSB7CiAgICAgIF9oYW5kbGVGb3JlaWduSnMoaW52b2NhdGlvbik7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJ0RBUlRfQ0xPU1VSRV9UT19KUycpIHsKICAgICAgX2hhbmRsZUZvcmVpZ25EYXJ0Q2xvc3VyZVRvSnMoaW52b2NhdGlvbiwgJ0RBUlRfQ0xPU1VSRV9UT19KUycpOwogICAgfSBlbHNlIGlmIChuYW1lID09ICdSQVdfREFSVF9GVU5DVElPTl9SRUYnKSB7CiAgICAgIF9oYW5kbGVGb3JlaWduUmF3RnVuY3Rpb25SZWYoaW52b2NhdGlvbiwgJ1JBV19EQVJUX0ZVTkNUSU9OX1JFRicpOwogICAgfSBlbHNlIGlmIChuYW1lID09ICdKU19TRVRfU1RBVElDX1NUQVRFJykgewogICAgICBfaGFuZGxlRm9yZWlnbkpzU2V0U3RhdGljU3RhdGUoaW52b2NhdGlvbik7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJ0pTX0dFVF9TVEFUSUNfU1RBVEUnKSB7CiAgICAgIF9oYW5kbGVGb3JlaWduSnNHZXRTdGF0aWNTdGF0ZShpbnZvY2F0aW9uKTsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnSlNfR0VUX05BTUUnKSB7CiAgICAgIF9oYW5kbGVGb3JlaWduSnNHZXROYW1lKGludm9jYXRpb24pOwogICAgfSBlbHNlIGlmIChuYW1lID09ICdKU19FTUJFRERFRF9HTE9CQUwnKSB7CiAgICAgIF9oYW5kbGVGb3JlaWduSnNFbWJlZGRlZEdsb2JhbChpbnZvY2F0aW9uKTsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnSlNfQlVJTFRJTicpIHsKICAgICAgX2hhbmRsZUZvcmVpZ25Kc0J1aWx0aW4oaW52b2NhdGlvbik7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJ0pTX0dFVF9GTEFHJykgewogICAgICBfaGFuZGxlRm9yZWlnbkpzR2V0RmxhZyhpbnZvY2F0aW9uKTsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnSlNfRUZGRUNUJykgewogICAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJ0pTX0lOVEVSQ0VQVE9SX0NPTlNUQU5UJykgewogICAgICBfaGFuZGxlSnNJbnRlcmNlcHRvckNvbnN0YW50KGludm9jYXRpb24pOwogICAgfSBlbHNlIGlmIChuYW1lID09ICdnZXRJbnRlcmNlcHRvcicpIHsKICAgICAgX2hhbmRsZUZvcmVpZ25HZXRJbnRlcmNlcHRvcihpbnZvY2F0aW9uKTsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnZ2V0SlNBcnJheUludGVyb3BSdGknKSB7CiAgICAgIF9oYW5kbGVGb3JlaWduR2V0SlNBcnJheUludGVyb3BSdGkoaW52b2NhdGlvbik7CiAgICB9IGVsc2UgaWYgKG5hbWUgPT0gJ0pTX1NUUklOR19DT05DQVQnKSB7CiAgICAgIF9oYW5kbGVKc1N0cmluZ0NvbmNhdChpbnZvY2F0aW9uKTsKICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnX2NyZWF0ZUludm9jYXRpb25NaXJyb3InKSB7CiAgICAgIF9oYW5kbGVDcmVhdGVJbnZvY2F0aW9uTWlycm9yKGludm9jYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcigKICAgICAgICAgIF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBpbnZvY2F0aW9uKSwKICAgICAgICAgICJVbmtub3duIGZvcmVpZ246ICR7bmFtZX0iKTsKICAgIH0KICB9CgogIHZvaWQgX2hhbmRsZUNyZWF0ZUludm9jYXRpb25NaXJyb3IoaXIuU3RhdGljSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICBpci5TdHJpbmdMaXRlcmFsIG5hbWVMaXRlcmFsID0gaW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbFswXTsKICAgIFN0cmluZyBuYW1lID0gbmFtZUxpdGVyYWwudmFsdWU7CgogICAgaXIuTGlzdExpdGVyYWwgdHlwZUFyZ3VtZW50c0xpdGVyYWwgPSBpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzFdOwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9CiAgICAgICAgdHlwZUFyZ3VtZW50c0xpdGVyYWwuZXhwcmVzc2lvbnMubWFwKChpci5FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgICAgaXIuVHlwZUxpdGVyYWwgdHlwZUxpdGVyYWwgPSBleHByZXNzaW9uOwogICAgICByZXR1cm4gX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUodHlwZUxpdGVyYWwudHlwZSk7CiAgICB9KS50b0xpc3QoKTsKCiAgICBpci5MaXN0TGl0ZXJhbCBwb3NpdGlvbmFsQXJndW1lbnRzTGl0ZXJhbCA9CiAgICAgICAgaW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbFsyXTsKICAgIGlyLkV4cHJlc3Npb24gbmFtZWRBcmd1bWVudHNMaXRlcmFsID0gaW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbFszXTsKICAgIE1hcDxTdHJpbmcsIGlyLkV4cHJlc3Npb24+IG5hbWVkQXJndW1lbnRzID0ge307CiAgICBpci5JbnRMaXRlcmFsIGtpbmRMaXRlcmFsID0gaW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbFs0XTsKCiAgICBOYW1lIG1lbWJlck5hbWUgPSBuZXcgTmFtZShuYW1lLCBfY3VycmVudEZyYW1lLm1lbWJlci5saWJyYXJ5KTsKICAgIFNlbGVjdG9yIHNlbGVjdG9yOwogICAgc3dpdGNoIChraW5kTGl0ZXJhbC52YWx1ZSkgewogICAgICBjYXNlIGludm9jYXRpb25NaXJyb3JHZXR0ZXJLaW5kOgogICAgICAgIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yLmdldHRlcihtZW1iZXJOYW1lKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBpbnZvY2F0aW9uTWlycm9yU2V0dGVyS2luZDoKICAgICAgICBzZWxlY3RvciA9IG5ldyBTZWxlY3Rvci5zZXR0ZXIobWVtYmVyTmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgaW52b2NhdGlvbk1pcnJvck1ldGhvZEtpbmQ6CiAgICAgICAgaWYgKG1lbWJlck5hbWUgPT0gTmFtZXMuSU5ERVhfTkFNRSkgewogICAgICAgICAgc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3IuaW5kZXgoKTsKICAgICAgICB9IGVsc2UgaWYgKG1lbWJlck5hbWUgPT0gTmFtZXMuSU5ERVhfU0VUX05BTUUpIHsKICAgICAgICAgIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yLmluZGV4U2V0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChuYW1lZEFyZ3VtZW50c0xpdGVyYWwgaXMgaXIuTWFwTGl0ZXJhbCkgewogICAgICAgICAgICBuYW1lZEFyZ3VtZW50c0xpdGVyYWwuZW50cmllcy5mb3JFYWNoKChpci5NYXBFbnRyeSBlbnRyeSkgewogICAgICAgICAgICAgIGlyLlN0cmluZ0xpdGVyYWwga2V5ID0gZW50cnkua2V5OwogICAgICAgICAgICAgIG5hbWVkQXJndW1lbnRzW2tleS52YWx1ZV0gPSBlbnRyeS52YWx1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVkQXJndW1lbnRzTGl0ZXJhbCBpcyBpci5Db25zdGFudEV4cHJlc3Npb24gJiYKICAgICAgICAgICAgICBuYW1lZEFyZ3VtZW50c0xpdGVyYWwuY29uc3RhbnQgaXMgaXIuTWFwQ29uc3RhbnQpIHsKICAgICAgICAgICAgaXIuTWFwQ29uc3RhbnQgY29uc3RhbnQgPSBuYW1lZEFyZ3VtZW50c0xpdGVyYWwuY29uc3RhbnQ7CiAgICAgICAgICAgIGZvciAoaXIuQ29uc3RhbnRNYXBFbnRyeSBlbnRyeSBpbiBjb25zdGFudC5lbnRyaWVzKSB7CiAgICAgICAgICAgICAgaXIuU3RyaW5nQ29uc3RhbnQga2V5ID0gZW50cnkua2V5OwogICAgICAgICAgICAgIG5hbWVkQXJndW1lbnRzW2tleS52YWx1ZV0gPQogICAgICAgICAgICAgICAgICBuZXcgaXIuQ29uc3RhbnRFeHByZXNzaW9uKGVudHJ5LnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcigKICAgICAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKGludm9jYXRpb24pLAogICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgbmFtZWQgYXJndW1lbnRzIHZhbHVlIGluIGNyZWF0ZUludm9jYXRpb25NaXJycm9yOiAiCiAgICAgICAgICAgICAgICAiJHtuYW1lZEFyZ3VtZW50c0xpdGVyYWx9LiIpOwogICAgICAgICAgfQogICAgICAgICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IENhbGxTdHJ1Y3R1cmUoCiAgICAgICAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50c0xpdGVyYWwuZXhwcmVzc2lvbnMubGVuZ3RoLAogICAgICAgICAgICAgIG5hbWVkQXJndW1lbnRzLmtleXMudG9MaXN0KCksCiAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgICAgICAgaWYgKFNlbGVjdG9yLmlzT3BlcmF0b3JOYW1lKG5hbWUpKSB7CiAgICAgICAgICAgIHNlbGVjdG9yID0KICAgICAgICAgICAgICAgIG5ldyBTZWxlY3RvcihTZWxlY3RvcktpbmQuT1BFUkFUT1IsIG1lbWJlck5hbWUsIGNhbGxTdHJ1Y3R1cmUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3IuY2FsbChtZW1iZXJOYW1lLCBjYWxsU3RydWN0dXJlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgSENvbnN0YW50IG5hbWVDb25zdGFudCA9IGdyYXBoLmFkZENvbnN0YW50KAogICAgICAgIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVTeW1ib2woY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMsIG5hbWUpLAogICAgICAgIGNsb3NlZFdvcmxkKTsKCiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gYXJndW1lbnRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgIGZvciAoaXIuRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBwb3NpdGlvbmFsQXJndW1lbnRzTGl0ZXJhbC5leHByZXNzaW9ucykgewogICAgICBhcmd1bWVudC5hY2NlcHQodGhpcyk7CiAgICAgIGFyZ3VtZW50cy5hZGQocG9wKCkpOwogICAgfQogICAgaWYgKG5hbWVkQXJndW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgTWFwPFN0cmluZywgSEluc3RydWN0aW9uPiBuYW1lZFZhbHVlcyA9IDxTdHJpbmcsIEhJbnN0cnVjdGlvbj57fTsKICAgICAgbmFtZWRBcmd1bWVudHMuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIGlyLkV4cHJlc3Npb24gdmFsdWUpIHsKICAgICAgICB2YWx1ZS5hY2NlcHQodGhpcyk7CiAgICAgICAgbmFtZWRWYWx1ZXNbbmFtZV0gPSBwb3AoKTsKICAgICAgfSk7CiAgICAgIGZvciAoU3RyaW5nIG5hbWUgaW4gc2VsZWN0b3IuY2FsbFN0cnVjdHVyZS5nZXRPcmRlcmVkTmFtZWRBcmd1bWVudHMoKSkgewogICAgICAgIGFyZ3VtZW50cy5hZGQobmFtZWRWYWx1ZXNbbmFtZV0pOwogICAgICB9CiAgICB9CgogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRDYWxsKGludm9jYXRpb24sIGludm9jYXRpb24pOwogICAgX2FkZFR5cGVBcmd1bWVudHMoYXJndW1lbnRzLCB0eXBlQXJndW1lbnRzLCBzb3VyY2VJbmZvcm1hdGlvbik7CgogICAgSEluc3RydWN0aW9uIGFyZ3VtZW50c0luc3RydWN0aW9uID0gX2J1aWxkTGl0ZXJhbExpc3QoYXJndW1lbnRzKTsKICAgIGFkZChhcmd1bWVudHNJbnN0cnVjdGlvbik7CgogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGFyZ3VtZW50TmFtZXMgPSA8SEluc3RydWN0aW9uPltdOwogICAgZm9yIChTdHJpbmcgYXJndW1lbnROYW1lCiAgICAgICAgaW4gc2VsZWN0b3IuY2FsbFN0cnVjdHVyZS5nZXRPcmRlcmVkTmFtZWRBcmd1bWVudHMoKSkgewogICAgICBDb25zdGFudFZhbHVlIGFyZ3VtZW50TmFtZUNvbnN0YW50ID0KICAgICAgICAgIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVTdHJpbmcoYXJndW1lbnROYW1lKTsKICAgICAgYXJndW1lbnROYW1lcy5hZGQoZ3JhcGguYWRkQ29uc3RhbnQoYXJndW1lbnROYW1lQ29uc3RhbnQsIGNsb3NlZFdvcmxkKSk7CiAgICB9CiAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnROYW1lc0luc3RydWN0aW9uID0gX2J1aWxkTGl0ZXJhbExpc3QoYXJndW1lbnROYW1lcyk7CiAgICBhZGQoYXJndW1lbnROYW1lc0luc3RydWN0aW9uKTsKCiAgICBISW5zdHJ1Y3Rpb24gdHlwZUFyZ3VtZW50Q291bnQgPQogICAgICAgIGdyYXBoLmFkZENvbnN0YW50SW50KHR5cGVBcmd1bWVudHMubGVuZ3RoLCBjbG9zZWRXb3JsZCk7CgogICAganMuTmFtZSBpbnRlcm5hbE5hbWUgPSBfbmFtZXIuaW52b2NhdGlvbk5hbWUoc2VsZWN0b3IpOwoKICAgIENvbnN0YW50VmFsdWUga2luZENvbnN0YW50ID0KICAgICAgICBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50RnJvbUludChzZWxlY3Rvci5pbnZvY2F0aW9uTWlycm9yS2luZCk7CgogICAgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgIF9jb21tb25FbGVtZW50cy5jcmVhdGVVbm1hbmdsZWRJbnZvY2F0aW9uTWlycm9yLAogICAgICAgIFsKICAgICAgICAgIG5hbWVDb25zdGFudCwKICAgICAgICAgIGdyYXBoLmFkZENvbnN0YW50U3RyaW5nRnJvbU5hbWUoaW50ZXJuYWxOYW1lLCBjbG9zZWRXb3JsZCksCiAgICAgICAgICBncmFwaC5hZGRDb25zdGFudChraW5kQ29uc3RhbnQsIGNsb3NlZFdvcmxkKSwKICAgICAgICAgIGFyZ3VtZW50c0luc3RydWN0aW9uLAogICAgICAgICAgYXJndW1lbnROYW1lc0luc3RydWN0aW9uLAogICAgICAgICAgdHlwZUFyZ3VtZW50Q291bnQsCiAgICAgICAgXSwKICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwKICAgICAgICBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIGJvb2wgX3VuZXhwZWN0ZWRGb3JlaWduQXJndW1lbnRzKGlyLlN0YXRpY0ludm9jYXRpb24gaW52b2NhdGlvbiwKICAgICAge2ludCBtaW5Qb3NpdGlvbmFsLCBpbnQgbWF4UG9zaXRpb25hbCwgaW50IHR5cGVBcmd1bWVudENvdW50ID0gMH0pIHsKICAgIFN0cmluZyBwbHVyYWxpemVBcmd1bWVudHMoaW50IGNvdW50LCBbU3RyaW5nIGFkamVjdGl2ZSA9ICcnXSkgewogICAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuICdubyAke2FkamVjdGl2ZX1hcmd1bWVudHMnOwogICAgICBpZiAoY291bnQgPT0gMSkgcmV0dXJuICdvbmUgJHthZGplY3RpdmV9YXJndW1lbnQnOwogICAgICBpZiAoY291bnQgPT0gMikgcmV0dXJuICd0d28gJHthZGplY3RpdmV9YXJndW1lbnRzJzsKICAgICAgcmV0dXJuICckY291bnQgJHthZGplY3RpdmV9YXJndW1lbnRzJzsKICAgIH0KCiAgICBTdHJpbmcgbmFtZSgpID0+IGludm9jYXRpb24udGFyZ2V0Lm5hbWUubmFtZTsKCiAgICBpci5Bcmd1bWVudHMgYXJndW1lbnRzID0gaW52b2NhdGlvbi5hcmd1bWVudHM7CiAgICBib29sIGJhZCA9IGZhbHNlOwogICAgaWYgKGFyZ3VtZW50cy50eXBlcy5sZW5ndGggIT0gdHlwZUFyZ3VtZW50Q291bnQpIHsKICAgICAgU3RyaW5nIGV4cGVjdGVkID0gcGx1cmFsaXplQXJndW1lbnRzKHR5cGVBcmd1bWVudENvdW50LCAndHlwZSAnKTsKICAgICAgU3RyaW5nIGFjdHVhbCA9IHBsdXJhbGl6ZUFyZ3VtZW50cyhhcmd1bWVudHMudHlwZXMubGVuZ3RoLCAndHlwZSAnKTsKICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3Bhbm5hYmxlKHRhcmdldEVsZW1lbnQsIGludm9jYXRpb24pLAogICAgICAgICAgTWVzc2FnZUtpbmQuR0VORVJJQywKICAgICAgICAgIHsndGV4dCc6ICJFcnJvcjogJyR7bmFtZSgpfScgdGFrZXMgJGV4cGVjdGVkLCBub3QgJGFjdHVhbC4ifSk7CiAgICAgIGJhZCA9IHRydWU7CiAgICB9CiAgICBpZiAoYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoIDwgbWluUG9zaXRpb25hbCkgewogICAgICBTdHJpbmcgcGhyYXNlID0gcGx1cmFsaXplQXJndW1lbnRzKG1pblBvc2l0aW9uYWwpOwogICAgICBpZiAobWF4UG9zaXRpb25hbCAhPSBtaW5Qb3NpdGlvbmFsKSBwaHJhc2UgPSAnYXQgbGVhc3QgJHBocmFzZSc7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBpbnZvY2F0aW9uKSwKICAgICAgICAgIE1lc3NhZ2VLaW5kLkdFTkVSSUMsCiAgICAgICAgICB7J3RleHQnOiAiRXJyb3I6IFRvbyBmZXcgYXJndW1lbnRzLiAnJHtuYW1lKCl9JyB0YWtlcyAkcGhyYXNlLiJ9KTsKICAgICAgYmFkID0gdHJ1ZTsKICAgIH0KICAgIGlmIChtYXhQb3NpdGlvbmFsICE9IG51bGwgJiYgYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoID4gbWF4UG9zaXRpb25hbCkgewogICAgICBTdHJpbmcgcGhyYXNlID0gcGx1cmFsaXplQXJndW1lbnRzKG1heFBvc2l0aW9uYWwpOwogICAgICBpZiAobWF4UG9zaXRpb25hbCAhPSBtaW5Qb3NpdGlvbmFsKSBwaHJhc2UgPSAnYXQgbW9zdCAkcGhyYXNlJzsKICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3Bhbm5hYmxlKHRhcmdldEVsZW1lbnQsIGludm9jYXRpb24pLAogICAgICAgICAgTWVzc2FnZUtpbmQuR0VORVJJQywKICAgICAgICAgIHsndGV4dCc6ICJFcnJvcjogVG9vIG1hbnkgYXJndW1lbnRzLiAnJHtuYW1lKCl9JyB0YWtlcyAkcGhyYXNlLiJ9KTsKICAgICAgYmFkID0gdHJ1ZTsKICAgIH0KICAgIGlmIChhcmd1bWVudHMubmFtZWQuaXNOb3RFbXB0eSkgewogICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICBfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgaW52b2NhdGlvbiksCiAgICAgICAgICBNZXNzYWdlS2luZC5HRU5FUklDLAogICAgICAgICAgeyd0ZXh0JzogIkVycm9yOiAnJHtuYW1lKCl9JyBkb2VzIG5vdCB0YWtlIG5hbWVkIGFyZ3VtZW50cy4ifSk7CiAgICAgIGJhZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gYmFkOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgYXJndW1lbnQuIFRoZSBhcmd1bWVudCBtdXN0IGV2YWx1YXRlIHRvIGEKICAvLy8gY29uc3RhbnQuICBJZiB0aGVyZSBpcyBhbiBlcnJvciwgdGhlIGVycm9yIGlzIHJlcG9ydGVkIGFuZCBgbnVsbGAgaXMKICAvLy8gcmV0dXJuZWQuCiAgU3RyaW5nIF9mb3JlaWduQ29uc3RhbnRTdHJpbmdBcmd1bWVudCgKICAgICAgaXIuU3RhdGljSW52b2NhdGlvbiBpbnZvY2F0aW9uLCBpbnQgcG9zaXRpb24sIFN0cmluZyBtZXRob2ROYW1lLAogICAgICBbU3RyaW5nIGFkamVjdGl2ZSA9ICcnXSkgewogICAgaXIuRXhwcmVzc2lvbiBhcmd1bWVudCA9IGludm9jYXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWxbcG9zaXRpb25dOwogICAgYXJndW1lbnQuYWNjZXB0KHRoaXMpOwogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gcG9wKCk7CgogICAgaWYgKCFpbnN0cnVjdGlvbi5pc0NvbnN0YW50U3RyaW5nKCkpIHsKICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3Bhbm5hYmxlKHRhcmdldEVsZW1lbnQsIGFyZ3VtZW50KSwKICAgICAgICAgIE1lc3NhZ2VLaW5kLkdFTkVSSUMsIHsKICAgICAgICAndGV4dCc6ICJFcnJvcjogRXhwZWN0ZWQgU3RyaW5nIGNvbnN0YW50IGFzICR7YWRqZWN0aXZlfWFyZ3VtZW50ICIKICAgICAgICAgICAgInRvICckbWV0aG9kTmFtZScuIgogICAgICB9KTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgSENvbnN0YW50IGhDb25zdGFudCA9IGluc3RydWN0aW9uOwogICAgU3RyaW5nQ29uc3RhbnRWYWx1ZSBzdHJpbmdDb25zdGFudCA9IGhDb25zdGFudC5jb25zdGFudDsKICAgIHJldHVybiBzdHJpbmdDb25zdGFudC5zdHJpbmdWYWx1ZTsKICB9CgogIHZvaWQgX2hhbmRsZUZvcmVpZ25EYXJ0Q2xvc3VyZVRvSnMoCiAgICAgIGlyLlN0YXRpY0ludm9jYXRpb24gaW52b2NhdGlvbiwgU3RyaW5nIG5hbWUpIHsKICAgIC8vIFRPRE8oc3JhKTogRG8gd2UgbmVlZCB0byB3cmFwIHRoZSBjbG9zdXJlIGluIHNvbWV0aGluZyB0aGF0IHNhdmVzIHRoZQogICAgLy8gY3VycmVudCBpc29sYXRlPwogICAgX2hhbmRsZUZvcmVpZ25SYXdGdW5jdGlvblJlZihpbnZvY2F0aW9uLCBuYW1lKTsKICB9CgogIHZvaWQgX2hhbmRsZUZvcmVpZ25SYXdGdW5jdGlvblJlZigKICAgICAgaXIuU3RhdGljSW52b2NhdGlvbiBpbnZvY2F0aW9uLCBTdHJpbmcgbmFtZSkgewogICAgaWYgKF91bmV4cGVjdGVkRm9yZWlnbkFyZ3VtZW50cyhpbnZvY2F0aW9uLAogICAgICAgIG1pblBvc2l0aW9uYWw6IDEsIG1heFBvc2l0aW9uYWw6IDEpKSB7CiAgICAgIC8vIFJlc3VsdCBleHBlY3RlZCBvbiBzdGFjay4KICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaXIuRXhwcmVzc2lvbiBjbG9zdXJlID0gaW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbC5zaW5nbGU7CiAgICBTdHJpbmcgcHJvYmxlbSA9ICdyZXF1aXJlcyBhIHN0YXRpYyBtZXRob2Qgb3IgdG9wLWxldmVsIG1ldGhvZCc7CgogICAgYm9vbCBoYW5kbGVUYXJnZXQoaXIuUHJvY2VkdXJlIHByb2NlZHVyZSkgewogICAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb24gPSBwcm9jZWR1cmUuZnVuY3Rpb247CiAgICAgIGlmIChmdW5jdGlvbiAhPSBudWxsICYmCiAgICAgICAgICBmdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50ID09CiAgICAgICAgICAgICAgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICYmCiAgICAgICAgICBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICAgIHB1c2gobmV3IEhGb3JlaWduQ29kZSgKICAgICAgICAgICAganMuanMuZXhwcmVzc2lvblRlbXBsYXRlWWllbGRpbmcoX2VtaXR0ZXIKICAgICAgICAgICAgICAgIC5zdGF0aWNGdW5jdGlvbkFjY2VzcyhfZWxlbWVudE1hcC5nZXRNZXRob2QocHJvY2VkdXJlKSkpLAogICAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwKICAgICAgICAgICAgPEhJbnN0cnVjdGlvbj5bXSwKICAgICAgICAgICAgbmF0aXZlQmVoYXZpb3I6IE5hdGl2ZUJlaGF2aW9yLlBVUkUsCiAgICAgICAgICAgIGZvcmVpZ25GdW5jdGlvbjogX2VsZW1lbnRNYXAuZ2V0TWV0aG9kKHByb2NlZHVyZSkpKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBwcm9ibGVtID0gJ2RvZXMgbm90IGhhbmRsZSBhIGNsb3N1cmUgd2l0aCBvcHRpb25hbCBwYXJhbWV0ZXJzJzsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmIChjbG9zdXJlIGlzIGlyLlN0YXRpY0dldCkgewogICAgICBpci5NZW1iZXIgc3RhdGljVGFyZ2V0ID0gY2xvc3VyZS50YXJnZXQ7CiAgICAgIGlmIChzdGF0aWNUYXJnZXQgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgICAgaWYgKHN0YXRpY1RhcmdldC5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuTWV0aG9kKSB7CiAgICAgICAgICBpZiAoaGFuZGxlVGFyZ2V0KHN0YXRpY1RhcmdldCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChjbG9zdXJlIGlzIGlyLkNvbnN0YW50RXhwcmVzc2lvbiAmJgogICAgICAgIGNsb3N1cmUuY29uc3RhbnQgaXMgaXIuVGVhck9mZkNvbnN0YW50KSB7CiAgICAgIGlyLlRlYXJPZmZDb25zdGFudCB0ZWFyT2ZmID0gY2xvc3VyZS5jb25zdGFudDsKICAgICAgaWYgKGhhbmRsZVRhcmdldCh0ZWFyT2ZmLnByb2NlZHVyZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3Bhbm5hYmxlKHRhcmdldEVsZW1lbnQsIGludm9jYXRpb24pLAogICAgICAgIE1lc3NhZ2VLaW5kLkdFTkVSSUMsCiAgICAgICAgeyd0ZXh0JzogIickbmFtZScgJHByb2JsZW0uIn0pOwogICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOyAvLyBSZXN1bHQgZXhwZWN0ZWQgb24gc3RhY2suCiAgICByZXR1cm47CiAgfQoKICB2b2lkIF9oYW5kbGVGb3JlaWduSnNTZXRTdGF0aWNTdGF0ZShpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24pIHsKICAgIGlmIChfdW5leHBlY3RlZEZvcmVpZ25Bcmd1bWVudHMoaW52b2NhdGlvbiwKICAgICAgICBtaW5Qb3NpdGlvbmFsOiAxLCBtYXhQb3NpdGlvbmFsOiAxKSkgewogICAgICAvLyBSZXN1bHQgZXhwZWN0ZWQgb24gc3RhY2suCiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSBfdmlzaXRQb3NpdGlvbmFsQXJndW1lbnRzKGludm9jYXRpb24uYXJndW1lbnRzKTsKCiAgICBTdHJpbmcgaXNvbGF0ZU5hbWUgPSBfbmFtZXIuc3RhdGljU3RhdGVIb2xkZXI7CiAgICBTaWRlRWZmZWN0cyBzaWRlRWZmZWN0cyA9IG5ldyBTaWRlRWZmZWN0cy5lbXB0eSgpOwogICAgc2lkZUVmZmVjdHMuc2V0QWxsU2lkZUVmZmVjdHMoKTsKICAgIHB1c2gobmV3IEhGb3JlaWduQ29kZShqcy5qcy5wYXJzZUZvcmVpZ25KUygiJGlzb2xhdGVOYW1lID0gIyIpLAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLCBpbnB1dHMsCiAgICAgICAgbmF0aXZlQmVoYXZpb3I6IE5hdGl2ZUJlaGF2aW9yLkNIQU5HRVNfT1RIRVIsIGVmZmVjdHM6IHNpZGVFZmZlY3RzKSk7CiAgfQoKICB2b2lkIF9oYW5kbGVGb3JlaWduSnNHZXRTdGF0aWNTdGF0ZShpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24pIHsKICAgIGlmIChfdW5leHBlY3RlZEZvcmVpZ25Bcmd1bWVudHMoaW52b2NhdGlvbiwKICAgICAgICBtaW5Qb3NpdGlvbmFsOiAwLCBtYXhQb3NpdGlvbmFsOiAwKSkgewogICAgICAvLyBSZXN1bHQgZXhwZWN0ZWQgb24gc3RhY2suCiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHB1c2gobmV3IEhGb3JlaWduQ29kZShqcy5qcy5wYXJzZUZvcmVpZ25KUyhfbmFtZXIuc3RhdGljU3RhdGVIb2xkZXIpLAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLCA8SEluc3RydWN0aW9uPltdLAogICAgICAgIG5hdGl2ZUJlaGF2aW9yOiBOYXRpdmVCZWhhdmlvci5ERVBFTkRTX09USEVSKSk7CiAgfQoKICB2b2lkIF9oYW5kbGVGb3JlaWduSnNHZXROYW1lKGlyLlN0YXRpY0ludm9jYXRpb24gaW52b2NhdGlvbikgewogICAgaWYgKF91bmV4cGVjdGVkRm9yZWlnbkFyZ3VtZW50cyhpbnZvY2F0aW9uLAogICAgICAgIG1pblBvc2l0aW9uYWw6IDEsIG1heFBvc2l0aW9uYWw6IDEpKSB7CiAgICAgIC8vIFJlc3VsdCBleHBlY3RlZCBvbiBzdGFjay4KICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaXIuTm9kZSBhcmd1bWVudCA9IGludm9jYXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWwuZmlyc3Q7CiAgICBhcmd1bWVudC5hY2NlcHQodGhpcyk7CiAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBwb3AoKTsKCiAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSENvbnN0YW50KSB7CiAgICAgIGpzLk5hbWUgbmFtZSA9IF9nZXROYW1lRm9ySnNHZXROYW1lKGluc3RydWN0aW9uLmNvbnN0YW50LCBfbmFtZXIpOwogICAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnRTdHJpbmdGcm9tTmFtZShuYW1lLCBjbG9zZWRXb3JsZCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgIF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBhcmd1bWVudCksCiAgICAgICAgTWVzc2FnZUtpbmQuR0VORVJJQywKICAgICAgICB7J3RleHQnOiAnRXJyb3I6IEV4cGVjdGVkIGEgSnNHZXROYW1lIGVudW0gdmFsdWUuJ30pOwogICAgLy8gUmVzdWx0IGV4cGVjdGVkIG9uIHN0YWNrLgogICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogIH0KCiAgaW50IF9leHRyYWN0RW51bUluZGV4RnJvbUNvbnN0YW50VmFsdWUoCiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQsIENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCkgewogICAgaWYgKGNvbnN0YW50IGlzIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSkgewogICAgICBpZiAoY29uc3RhbnQudHlwZS5lbGVtZW50ID09IGNsYXNzRWxlbWVudCkgewogICAgICAgIGFzc2VydChjb25zdGFudC5maWVsZHMubGVuZ3RoID09IDEgfHwgY29uc3RhbnQuZmllbGRzLmxlbmd0aCA9PSAyKTsKICAgICAgICBDb25zdGFudFZhbHVlIGluZGV4Q29uc3RhbnQgPSBjb25zdGFudC5maWVsZHMudmFsdWVzLmZpcnN0OwogICAgICAgIGlmIChpbmRleENvbnN0YW50IGlzIEludENvbnN0YW50VmFsdWUpIHsKICAgICAgICAgIHJldHVybiBpbmRleENvbnN0YW50LmludFZhbHVlLnRvSW50KCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbanMuTmFtZV0gZm9yIHRoZSBgSnNHZXROYW1lYCBbY29uc3RhbnRdIHZhbHVlLgogIGpzLk5hbWUgX2dldE5hbWVGb3JKc0dldE5hbWUoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgTW9kdWxhck5hbWVyIG5hbWVyKSB7CiAgICBpbnQgaW5kZXggPSBfZXh0cmFjdEVudW1JbmRleEZyb21Db25zdGFudFZhbHVlKAogICAgICAgIGNvbnN0YW50LCBfY29tbW9uRWxlbWVudHMuanNHZXROYW1lRW51bSk7CiAgICBpZiAoaW5kZXggPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmFtZXIuZ2V0TmFtZUZvckpzR2V0TmFtZSgKICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCBKc0dldE5hbWUudmFsdWVzW2luZGV4XSk7CiAgfQoKICB2b2lkIF9oYW5kbGVGb3JlaWduSnNFbWJlZGRlZEdsb2JhbChpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24pIHsKICAgIGlmIChfdW5leHBlY3RlZEZvcmVpZ25Bcmd1bWVudHMoaW52b2NhdGlvbiwKICAgICAgICBtaW5Qb3NpdGlvbmFsOiAyLCBtYXhQb3NpdGlvbmFsOiAyKSkgewogICAgICAvLyBSZXN1bHQgZXhwZWN0ZWQgb24gc3RhY2suCiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgU3RyaW5nIGdsb2JhbE5hbWUgPSBfZm9yZWlnbkNvbnN0YW50U3RyaW5nQXJndW1lbnQoCiAgICAgICAgaW52b2NhdGlvbiwgMSwgJ0pTX0VNQkVEREVEX0dMT0JBTCcsICdzZWNvbmQgJyk7CiAgICBqcy5UZW1wbGF0ZSBleHByID0ganMuanMuZXhwcmVzc2lvblRlbXBsYXRlWWllbGRpbmcoCiAgICAgICAgX2VtaXR0ZXIuZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhnbG9iYWxOYW1lKSk7CgogICAgTmF0aXZlQmVoYXZpb3IgbmF0aXZlQmVoYXZpb3IgPQogICAgICAgIF9lbGVtZW50TWFwLmdldE5hdGl2ZUJlaGF2aW9yRm9ySnNFbWJlZGRlZEdsb2JhbENhbGwoaW52b2NhdGlvbik7CiAgICBhc3NlcnQoCiAgICAgICAgbmF0aXZlQmVoYXZpb3IgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgaW52b2NhdGlvbiksCiAgICAgICAgICAgICJObyBOYXRpdmVCZWhhdmlvciBmb3IgJGludm9jYXRpb24iKSk7CgogICAgQWJzdHJhY3RWYWx1ZSBzc2FUeXBlID0KICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC50eXBlRnJvbU5hdGl2ZUJlaGF2aW9yKG5hdGl2ZUJlaGF2aW9yLCBjbG9zZWRXb3JsZCk7CiAgICBwdXNoKG5ldyBIRm9yZWlnbkNvZGUoZXhwciwgc3NhVHlwZSwgY29uc3QgPEhJbnN0cnVjdGlvbj5bXSwKICAgICAgICBuYXRpdmVCZWhhdmlvcjogbmF0aXZlQmVoYXZpb3IpKTsKICB9CgogIHZvaWQgX2hhbmRsZUZvcmVpZ25Kc0J1aWx0aW4oaXIuU3RhdGljSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICBpZiAoX3VuZXhwZWN0ZWRGb3JlaWduQXJndW1lbnRzKGludm9jYXRpb24sIG1pblBvc2l0aW9uYWw6IDIpKSB7CiAgICAgIC8vIFJlc3VsdCBleHBlY3RlZCBvbiBzdGFjay4KICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgTGlzdDxpci5FeHByZXNzaW9uPiBhcmd1bWVudHMgPSBpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsOwogICAgaXIuRXhwcmVzc2lvbiBuYW1lQXJndW1lbnQgPSBhcmd1bWVudHNbMV07CgogICAgbmFtZUFyZ3VtZW50LmFjY2VwdCh0aGlzKTsKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IHBvcCgpOwoKICAgIGpzLlRlbXBsYXRlIHRlbXBsYXRlOwogICAgaWYgKGluc3RydWN0aW9uIGlzIEhDb25zdGFudCkgewogICAgICB0ZW1wbGF0ZSA9IF9nZXRKc0J1aWx0aW5UZW1wbGF0ZShpbnN0cnVjdGlvbi5jb25zdGFudCwgX2VtaXR0ZXIpOwogICAgfQogICAgaWYgKHRlbXBsYXRlID09IG51bGwpIHsKICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3Bhbm5hYmxlKHRhcmdldEVsZW1lbnQsIG5hbWVBcmd1bWVudCksCiAgICAgICAgICBNZXNzYWdlS2luZC5HRU5FUklDLAogICAgICAgICAgeyd0ZXh0JzogJ0Vycm9yOiBFeHBlY3RlZCBhIEpzQnVpbHRpbiBlbnVtIHZhbHVlLid9KTsKICAgICAgLy8gUmVzdWx0IGV4cGVjdGVkIG9uIHN0YWNrLgogICAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgIGZvciAoaXIuRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBhcmd1bWVudHMuc2tpcCgyKSkgewogICAgICBhcmd1bWVudC5hY2NlcHQodGhpcyk7CiAgICAgIGlucHV0cy5hZGQocG9wKCkpOwogICAgfQoKICAgIE5hdGl2ZUJlaGF2aW9yIG5hdGl2ZUJlaGF2aW9yID0KICAgICAgICBfZWxlbWVudE1hcC5nZXROYXRpdmVCZWhhdmlvckZvckpzQnVpbHRpbkNhbGwoaW52b2NhdGlvbik7CiAgICBhc3NlcnQoCiAgICAgICAgbmF0aXZlQmVoYXZpb3IgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdChfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgaW52b2NhdGlvbiksCiAgICAgICAgICAgICJObyBOYXRpdmVCZWhhdmlvciBmb3IgJGludm9jYXRpb24iKSk7CgogICAgQWJzdHJhY3RWYWx1ZSBzc2FUeXBlID0KICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC50eXBlRnJvbU5hdGl2ZUJlaGF2aW9yKG5hdGl2ZUJlaGF2aW9yLCBjbG9zZWRXb3JsZCk7CiAgICBwdXNoKG5ldyBIRm9yZWlnbkNvZGUodGVtcGxhdGUsIHNzYVR5cGUsIGlucHV0cywKICAgICAgICBuYXRpdmVCZWhhdmlvcjogbmF0aXZlQmVoYXZpb3IpKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbanMuVGVtcGxhdGVdIGZvciB0aGUgYEpzQnVpbHRpbmAgW2NvbnN0YW50XSB2YWx1ZS4KICBqcy5UZW1wbGF0ZSBfZ2V0SnNCdWlsdGluVGVtcGxhdGUoCiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQsIE1vZHVsYXJFbWl0dGVyIGVtaXR0ZXIpIHsKICAgIGludCBpbmRleCA9IF9leHRyYWN0RW51bUluZGV4RnJvbUNvbnN0YW50VmFsdWUoCiAgICAgICAgY29uc3RhbnQsIF9jb21tb25FbGVtZW50cy5qc0J1aWx0aW5FbnVtKTsKICAgIGlmIChpbmRleCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfdGVtcGxhdGVGb3JCdWlsdGluKEpzQnVpbHRpbi52YWx1ZXNbaW5kZXhdKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBKUyB0ZW1wbGF0ZSBmb3IgdGhlIGdpdmVuIFtidWlsdGluXS4KICBqcy5UZW1wbGF0ZSBfdGVtcGxhdGVGb3JCdWlsdGluKEpzQnVpbHRpbiBidWlsdGluKSB7CiAgICBzd2l0Y2ggKGJ1aWx0aW4pIHsKICAgICAgY2FzZSBKc0J1aWx0aW4uZGFydE9iamVjdENvbnN0cnVjdG9yOgogICAgICAgIENsYXNzRW50aXR5IG9iamVjdENsYXNzID0gY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3M7CiAgICAgICAgcmV0dXJuIGpzLmpzCiAgICAgICAgICAgIC5leHByZXNzaW9uVGVtcGxhdGVZaWVsZGluZyhfZW1pdHRlci50eXBlQWNjZXNzKG9iamVjdENsYXNzKSk7CgogICAgICBjYXNlIEpzQnVpbHRpbi5kYXJ0Q2xvc3VyZUNvbnN0cnVjdG9yOgogICAgICAgIENsYXNzRW50aXR5IGNsb3N1cmVDbGFzcyA9IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmNsb3N1cmVDbGFzczsKICAgICAgICByZXR1cm4ganMuanMKICAgICAgICAgICAgLmV4cHJlc3Npb25UZW1wbGF0ZVlpZWxkaW5nKF9lbWl0dGVyLnR5cGVBY2Nlc3MoY2xvc3VyZUNsYXNzKSk7CgogICAgICBjYXNlIEpzQnVpbHRpbi5pc0NoZWNrUHJvcGVydHlUb0pzQ29uc3RydWN0b3JOYW1lOgogICAgICAgIGludCBpc1ByZWZpeExlbmd0aCA9IF9uYW1lci5maXhlZE5hbWVzLm9wZXJhdG9ySXNQcmVmaXgubGVuZ3RoOwogICAgICAgIHJldHVybiBqcy5qcy5leHByZXNzaW9uVGVtcGxhdGVGb3IoJyMuc3Vic3RyaW5nKCRpc1ByZWZpeExlbmd0aCknKTsKCiAgICAgIGNhc2UgSnNCdWlsdGluLmlzRnVuY3Rpb25UeXBlOgogICAgICAgIHJldHVybiBfcnRpRW5jb2Rlci50ZW1wbGF0ZUZvcklzRnVuY3Rpb25UeXBlOwoKICAgICAgY2FzZSBKc0J1aWx0aW4uaXNGdXR1cmVPclR5cGU6CiAgICAgICAgcmV0dXJuIF9ydGlFbmNvZGVyLnRlbXBsYXRlRm9ySXNGdXR1cmVPclR5cGU7CgogICAgICBjYXNlIEpzQnVpbHRpbi5pc1ZvaWRUeXBlOgogICAgICAgIHJldHVybiBfcnRpRW5jb2Rlci50ZW1wbGF0ZUZvcklzVm9pZFR5cGU7CgogICAgICBjYXNlIEpzQnVpbHRpbi5pc0R5bmFtaWNUeXBlOgogICAgICAgIHJldHVybiBfcnRpRW5jb2Rlci50ZW1wbGF0ZUZvcklzRHluYW1pY1R5cGU7CgogICAgICBjYXNlIEpzQnVpbHRpbi5pc0pzSW50ZXJvcFR5cGVBcmd1bWVudDoKICAgICAgICByZXR1cm4gX3J0aUVuY29kZXIudGVtcGxhdGVGb3JJc0pzSW50ZXJvcFR5cGVBcmd1bWVudDsKCiAgICAgIGNhc2UgSnNCdWlsdGluLnJhd1J0aVRvSnNDb25zdHJ1Y3Rvck5hbWU6CiAgICAgICAgcmV0dXJuIGpzLmpzLmV4cHJlc3Npb25UZW1wbGF0ZUZvcigiIy5uYW1lIik7CgogICAgICBjYXNlIEpzQnVpbHRpbi5yYXdSdW50aW1lVHlwZToKICAgICAgICByZXR1cm4ganMuanMuZXhwcmVzc2lvblRlbXBsYXRlRm9yKCIjLmNvbnN0cnVjdG9yIik7CgogICAgICBjYXNlIEpzQnVpbHRpbi5pc1N1YnR5cGU6CiAgICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IG1vdmUgdGhpcyBjbG9zZXIgdG8gd2hlcmUgaXMtY2hlY2sgcHJvcGVydGllcyBhcmUKICAgICAgICAvLyBidWlsdC4KICAgICAgICBTdHJpbmcgaXNQcmVmaXggPSBfbmFtZXIuZml4ZWROYW1lcy5vcGVyYXRvcklzUHJlZml4OwogICAgICAgIHJldHVybiBqcy5qcy5leHByZXNzaW9uVGVtcGxhdGVGb3IoIignJGlzUHJlZml4JyArICMpIGluICMucHJvdG90eXBlIik7CgogICAgICBjYXNlIEpzQnVpbHRpbi5pc0dpdmVuVHlwZVJ0aToKICAgICAgICByZXR1cm4ganMuanMuZXhwcmVzc2lvblRlbXBsYXRlRm9yKCcjLm5hbWUgPT09ICMnKTsKCiAgICAgIGNhc2UgSnNCdWlsdGluLmdldE1ldGFkYXRhOgogICAgICAgIFN0cmluZyBtZXRhZGF0YUFjY2VzcyA9CiAgICAgICAgICAgIF9lbWl0dGVyLmdlbmVyYXRlRW1iZWRkZWRHbG9iYWxBY2Nlc3NTdHJpbmcoTUVUQURBVEEpOwogICAgICAgIHJldHVybiBqcy5qcy5leHByZXNzaW9uVGVtcGxhdGVGb3IoIiRtZXRhZGF0YUFjY2Vzc1sjXSIpOwoKICAgICAgY2FzZSBKc0J1aWx0aW4uZ2V0VHlwZToKICAgICAgICBTdHJpbmcgdHlwZXNBY2Nlc3MgPSBfZW1pdHRlci5nZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzU3RyaW5nKFRZUEVTKTsKICAgICAgICByZXR1cm4ganMuanMuZXhwcmVzc2lvblRlbXBsYXRlRm9yKCIkdHlwZXNBY2Nlc3NbI10iKTsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcigKICAgICAgICAgICAgTk9fTE9DQVRJT05fU1BBTk5BQkxFLCAiVW5oYW5kbGVkIEJ1aWx0aW46ICRidWlsdGluIik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICB2b2lkIF9oYW5kbGVGb3JlaWduSnNHZXRGbGFnKGlyLlN0YXRpY0ludm9jYXRpb24gaW52b2NhdGlvbikgewogICAgaWYgKF91bmV4cGVjdGVkRm9yZWlnbkFyZ3VtZW50cyhpbnZvY2F0aW9uLAogICAgICAgIG1pblBvc2l0aW9uYWw6IDEsIG1heFBvc2l0aW9uYWw6IDEpKSB7CiAgICAgIHN0YWNrLmFkZCgKICAgICAgICAgIC8vIFJlc3VsdCBleHBlY3RlZCBvbiBzdGFjay4KICAgICAgICAgIGdyYXBoLmFkZENvbnN0YW50Qm9vbChmYWxzZSwgY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgU3RyaW5nIG5hbWUgPSBfZm9yZWlnbkNvbnN0YW50U3RyaW5nQXJndW1lbnQoaW52b2NhdGlvbiwgMCwgJ0pTX0dFVF9GTEFHJyk7CiAgICBib29sIHZhbHVlID0gX2dldEZsYWdWYWx1ZShuYW1lKTsKICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBpbnZvY2F0aW9uKSwKICAgICAgICAgIE1lc3NhZ2VLaW5kLkdFTkVSSUMsCiAgICAgICAgICB7J3RleHQnOiAnRXJyb3I6IFVua25vd24gaW50ZXJuYWwgZmxhZyAiJG5hbWUiLid9KTsKICAgIH0gZWxzZSB7CiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudEJvb2wodmFsdWUsIGNsb3NlZFdvcmxkKSk7CiAgICB9CiAgfQoKICB2b2lkIF9oYW5kbGVKc0ludGVyY2VwdG9yQ29uc3RhbnQoaXIuU3RhdGljSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICAvLyBTaW5nbGUgYXJndW1lbnQgbXVzdCBiZSBhIFR5cGVDb25zdGFudCB3aGljaCBpcyBjb252ZXJ0ZWQgaW50byBhCiAgICAvLyBJbnRlcmNlcHRvckNvbnN0YW50LgogICAgaWYgKF91bmV4cGVjdGVkRm9yZWlnbkFyZ3VtZW50cyhpbnZvY2F0aW9uLAogICAgICAgIG1pblBvc2l0aW9uYWw6IDEsIG1heFBvc2l0aW9uYWw6IDEpKSB7CiAgICAgIC8vIFJlc3VsdCBleHBlY3RlZCBvbiBzdGFjay4KICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpci5FeHByZXNzaW9uIGFyZ3VtZW50ID0gaW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbC5zaW5nbGU7CiAgICBhcmd1bWVudC5hY2NlcHQodGhpcyk7CiAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnRJbnN0cnVjdGlvbiA9IHBvcCgpOwogICAgaWYgKGFyZ3VtZW50SW5zdHJ1Y3Rpb24gaXMgSENvbnN0YW50KSB7CiAgICAgIENvbnN0YW50VmFsdWUgYXJndW1lbnRDb25zdGFudCA9IGFyZ3VtZW50SW5zdHJ1Y3Rpb24uY29uc3RhbnQ7CiAgICAgIGlmIChhcmd1bWVudENvbnN0YW50IGlzIFR5cGVDb25zdGFudFZhbHVlICYmCiAgICAgICAgICBhcmd1bWVudENvbnN0YW50LnJlcHJlc2VudGVkVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlID0gYXJndW1lbnRDb25zdGFudC5yZXByZXNlbnRlZFR5cGU7CiAgICAgICAgLy8gVE9ETyhzcmEpOiBDaGVjayB0aGF0IHR5cGUgaXMgYSBzdWJjbGFzcyBvZiBbSW50ZXJjZXB0b3JdLgogICAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQgPSBuZXcgSW50ZXJjZXB0b3JDb25zdGFudFZhbHVlKHR5cGUuZWxlbWVudCk7CiAgICAgICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gZ3JhcGguYWRkQ29uc3RhbnQoY29uc3RhbnQsIGNsb3NlZFdvcmxkKTsKICAgICAgICBzdGFjay5hZGQoaW5zdHJ1Y3Rpb24pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICBfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgaW52b2NhdGlvbiksCiAgICAgICAgTWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTX0lOVEVSQ0VQVE9SX0NPTlNUQU5UKTsKICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpKTsKICB9CgogIHZvaWQgX2hhbmRsZUZvcmVpZ25HZXRJbnRlcmNlcHRvcihpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24pIHsKICAgIC8vIFNpbmdsZSBhcmd1bWVudCBpcyB0aGUgaW50ZXJjZXB0ZWQgb2JqZWN0LgogICAgaWYgKF91bmV4cGVjdGVkRm9yZWlnbkFyZ3VtZW50cyhpbnZvY2F0aW9uLAogICAgICAgIG1pblBvc2l0aW9uYWw6IDEsIG1heFBvc2l0aW9uYWw6IDEpKSB7CiAgICAgIC8vIFJlc3VsdCBleHBlY3RlZCBvbiBzdGFjay4KICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpci5FeHByZXNzaW9uIGFyZ3VtZW50ID0gaW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbC5zaW5nbGU7CiAgICBhcmd1bWVudC5hY2NlcHQodGhpcyk7CiAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnRJbnN0cnVjdGlvbiA9IHBvcCgpOwoKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQ2FsbChpbnZvY2F0aW9uLCBpbnZvY2F0aW9uKTsKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9CiAgICAgICAgX2ludGVyY2VwdG9yRm9yKGFyZ3VtZW50SW5zdHJ1Y3Rpb24sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIHN0YWNrLmFkZChpbnN0cnVjdGlvbik7CiAgfQoKICB2b2lkIF9oYW5kbGVGb3JlaWduR2V0SlNBcnJheUludGVyb3BSdGkoaXIuU3RhdGljSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICBpZiAoX3VuZXhwZWN0ZWRGb3JlaWduQXJndW1lbnRzKGludm9jYXRpb24sCiAgICAgICAgICAgIG1pblBvc2l0aW9uYWw6IDAsIG1heFBvc2l0aW9uYWw6IDApIHx8CiAgICAgICAgIW9wdGlvbnMuZXhwZXJpbWVudE5ld1J0aSkgewogICAgICAvLyBSZXN1bHQgZXhwZWN0ZWQgb24gc3RhY2suCiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gVE9ETyhzcmEpOiBJbnRyb2R1Y2UgJ2FueScgdHlwZS4KICAgIEludGVyZmFjZVR5cGUgaW50ZXJvcFR5cGUgPQogICAgICAgIEludGVyZmFjZVR5cGUoX2NvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcywgW0R5bmFtaWNUeXBlKCldKTsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQ2FsbChpbnZvY2F0aW9uLCBpbnZvY2F0aW9uKTsKICAgIEhJbnN0cnVjdGlvbiBydGkgPSBITG9hZFR5cGUoaW50ZXJvcFR5cGUsIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlKQogICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICBwdXNoKHJ0aSk7CiAgfQoKICB2b2lkIF9oYW5kbGVGb3JlaWduSnMoaXIuU3RhdGljSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICBpZiAoX3VuZXhwZWN0ZWRGb3JlaWduQXJndW1lbnRzKGludm9jYXRpb24sCiAgICAgICAgbWluUG9zaXRpb25hbDogMiwgbWF4UG9zaXRpb25hbDogbnVsbCwgdHlwZUFyZ3VtZW50Q291bnQ6IDEpKSB7CiAgICAgIC8vIFJlc3VsdCBleHBlY3RlZCBvbiBzdGFjay4KICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgTmF0aXZlQmVoYXZpb3IgbmF0aXZlQmVoYXZpb3IgPQogICAgICAgIF9lbGVtZW50TWFwLmdldE5hdGl2ZUJlaGF2aW9yRm9ySnNDYWxsKGludm9jYXRpb24pOwogICAgYXNzZXJ0KAogICAgICAgIG5hdGl2ZUJlaGF2aW9yICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoX2VsZW1lbnRNYXAuZ2V0U3Bhbm5hYmxlKHRhcmdldEVsZW1lbnQsIGludm9jYXRpb24pLAogICAgICAgICAgICAiTm8gTmF0aXZlQmVoYXZpb3IgZm9yICRpbnZvY2F0aW9uIikpOwoKICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgZm9yIChpci5FeHByZXNzaW9uIGFyZ3VtZW50IGluIGludm9jYXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWwuc2tpcCgyKSkgewogICAgICBhcmd1bWVudC5hY2NlcHQodGhpcyk7CiAgICAgIGlucHV0cy5hZGQocG9wKCkpOwogICAgfQoKICAgIGlmIChuYXRpdmVCZWhhdmlvci5jb2RlVGVtcGxhdGUucG9zaXRpb25hbEFyZ3VtZW50Q291bnQgIT0gaW5wdXRzLmxlbmd0aCkgewogICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICBfZWxlbWVudE1hcC5nZXRTcGFubmFibGUodGFyZ2V0RWxlbWVudCwgaW52b2NhdGlvbiksCiAgICAgICAgICBNZXNzYWdlS2luZC5HRU5FUklDLCB7CiAgICAgICAgJ3RleHQnOiAnTWlzbWF0Y2ggYmV0d2VlbiBudW1iZXIgb2YgcGxhY2Vob2xkZXJzJwogICAgICAgICAgICAnIGFuZCBudW1iZXIgb2YgYXJndW1lbnRzLicKICAgICAgfSk7CiAgICAgIC8vIFJlc3VsdCBleHBlY3RlZCBvbiBzdGFjay4KICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKEhhc0NhcHR1cmVkUGxhY2Vob2xkZXJzLmNoZWNrKG5hdGl2ZUJlaGF2aW9yLmNvZGVUZW1wbGF0ZS5hc3QpKSB7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBpbnZvY2F0aW9uKSwKICAgICAgICAgIE1lc3NhZ2VLaW5kLkpTX1BMQUNFSE9MREVSX0NBUFRVUkUpOwogICAgfQoKICAgIEFic3RyYWN0VmFsdWUgc3NhVHlwZSA9CiAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAudHlwZUZyb21OYXRpdmVCZWhhdmlvcihuYXRpdmVCZWhhdmlvciwgY2xvc2VkV29ybGQpOwoKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0gbnVsbDsKICAgIEhJbnN0cnVjdGlvbiBjb2RlID0gbmV3IEhGb3JlaWduQ29kZSgKICAgICAgICBuYXRpdmVCZWhhdmlvci5jb2RlVGVtcGxhdGUsIHNzYVR5cGUsIGlucHV0cywKICAgICAgICBpc1N0YXRlbWVudDogIW5hdGl2ZUJlaGF2aW9yLmNvZGVUZW1wbGF0ZS5pc0V4cHJlc3Npb24sCiAgICAgICAgZWZmZWN0czogbmF0aXZlQmVoYXZpb3Iuc2lkZUVmZmVjdHMsCiAgICAgICAgbmF0aXZlQmVoYXZpb3I6IG5hdGl2ZUJlaGF2aW9yKQogICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICBwdXNoKGNvZGUpOwoKICAgIERhcnRUeXBlIHR5cGUgPSBfZ2V0RGFydFR5cGVJZlZhbGlkKGludm9jYXRpb24uYXJndW1lbnRzLnR5cGVzLnNpbmdsZSk7CiAgICBBYnN0cmFjdFZhbHVlIHRydXN0ZWRNYXNrID0gX3R5cGVCdWlsZGVyLnRydXN0VHlwZU1hc2sodHlwZSk7CgogICAgaWYgKHRydXN0ZWRNYXNrICE9IG51bGwpIHsKICAgICAgLy8gV2Ugb25seSBhbGxvdyB0aGUgdHlwZSBhcmd1bWVudCB0byBuYXJyb3cgYGR5bmFtaWNgLCB3aGljaCBwcm9iYWJseQogICAgICAvLyBjb21lcyBmcm9tIGFuIHVuc3BlY2lmaWVkIHJldHVybiB0eXBlIGluIHRoZSBOYXRpdmVCZWhhdmlvci4KICAgICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAuY29udGFpbnNBbGwoY29kZS5pbnN0cnVjdGlvblR5cGUpCiAgICAgICAgICAuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIHR5cGUgd2l0aCB0aGUgbmFycm93ZXIgdHlwZS4KICAgICAgICBjb2RlLmluc3RydWN0aW9uVHlwZSA9IHRydXN0ZWRNYXNrOwogICAgICB9IGVsc2UgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAuY29udGFpbnModHJ1c3RlZE1hc2ssIGNvZGUuaW5zdHJ1Y3Rpb25UeXBlKQogICAgICAgICAgLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgICAgLy8gSXQgaXMgYWNjZXB0YWJsZSBmb3IgdGhlIHR5cGUgcGFyYW1ldGVyIHRvIGJlIGJyb2FkZXIgdGhhbiB0aGUKICAgICAgICAvLyBzcGVjaWZpZWQgdHlwZS4KICAgICAgfSBlbHNlIHsKICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgIF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBpbnZvY2F0aW9uKSwKICAgICAgICAgICAgTWVzc2FnZUtpbmQuR0VORVJJQywgewogICAgICAgICAgJ3RleHQnOiAnVHlwZSBhcmd1bWVudCB0b28gbmFycm93IGZvciBzcGVjaWZpZWQgYmVoYXZpb3IgdHlwZSAnCiAgICAgICAgICAgICAgJygke3RydXN0ZWRNYXNrfSBkb2VzIG5vdCBhbGxvdyAnCiAgICAgICAgICAgICAgJ2FsbCB2YWx1ZXMgaW4gJHtjb2RlLmluc3RydWN0aW9uVHlwZX0pJwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIF9oYW5kbGVKc1N0cmluZ0NvbmNhdChpci5TdGF0aWNJbnZvY2F0aW9uIGludm9jYXRpb24pIHsKICAgIGlmIChfdW5leHBlY3RlZEZvcmVpZ25Bcmd1bWVudHMoaW52b2NhdGlvbiwKICAgICAgICBtaW5Qb3NpdGlvbmFsOiAyLCBtYXhQb3NpdGlvbmFsOiAyKSkgewogICAgICAvLyBSZXN1bHQgZXhwZWN0ZWQgb24gc3RhY2suCiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IF92aXNpdFBvc2l0aW9uYWxBcmd1bWVudHMoaW52b2NhdGlvbi5hcmd1bWVudHMpOwogICAgcHVzaChuZXcgSFN0cmluZ0NvbmNhdCgKICAgICAgICBpbnB1dHNbMF0sIGlucHV0c1sxXSwgX2Fic3RyYWN0VmFsdWVEb21haW4uc3RyaW5nVHlwZSkpOwogIH0KCiAgdm9pZCBfcHVzaFN0YXRpY0ludm9jYXRpb24oTWVtYmVyRW50aXR5IHRhcmdldCwgTGlzdDxISW5zdHJ1Y3Rpb24+IGFyZ3VtZW50cywKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlTWFzaywgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAge1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uLCBJbnRlcmZhY2VUeXBlIGluc3RhbmNlVHlwZX0pIHsKICAgIC8vIFRPRE8ocmVkZW1wdGlvbik6IFBhc3MgY3VycmVudCBub2RlIGlmIG5lZWRlZC4KICAgIGlmIChfdHJ5SW5saW5lTWV0aG9kKAogICAgICAgIHRhcmdldCwgbnVsbCwgbnVsbCwgYXJndW1lbnRzLCB0eXBlQXJndW1lbnRzLCBudWxsLCBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICBpbnN0YW5jZVR5cGU6IGluc3RhbmNlVHlwZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBpbnN0cnVjdGlvbjsKICAgIGlmIChjbG9zZWRXb3JsZC5uYXRpdmVEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKHRhcmdldCkpIHsKICAgICAgaW5zdHJ1Y3Rpb24gPSBfaW52b2tlSnNJbnRlcm9wRnVuY3Rpb24odGFyZ2V0LCBhcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgaW5zdHJ1Y3Rpb24gPSBuZXcgSEludm9rZVN0YXRpYygKICAgICAgICAgIHRhcmdldCwgYXJndW1lbnRzLCB0eXBlTWFzaywgdHlwZUFyZ3VtZW50cywKICAgICAgICAgIHRhcmdldENhblRocm93OiAhX2luZmVycmVkRGF0YS5nZXRDYW5ub3RUaHJvdyh0YXJnZXQpKQogICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKCiAgICAgIGlmIChfY3VycmVudEltcGxpY2l0SW5zdGFudGlhdGlvbnMuaXNOb3RFbXB0eSkgewogICAgICAgIGluc3RydWN0aW9uLmluc3RhbnRpYXRlZFR5cGVzID0KICAgICAgICAgICAgbmV3IExpc3Q8SW50ZXJmYWNlVHlwZT4uZnJvbShfY3VycmVudEltcGxpY2l0SW5zdGFudGlhdGlvbnMpOwogICAgICB9CiAgICAgIGluc3RydWN0aW9uLnNpZGVFZmZlY3RzID0gX2luZmVycmVkRGF0YS5nZXRTaWRlRWZmZWN0c09mRWxlbWVudCh0YXJnZXQpOwogICAgfQogICAgcHVzaChpbnN0cnVjdGlvbik7CiAgfQoKICB2b2lkIF9wdXNoRHluYW1pY0ludm9jYXRpb24oCiAgICAgIGlyLk5vZGUgbm9kZSwKICAgICAgU3RhdGljVHlwZSBzdGF0aWNSZWNlaXZlclR5cGUsCiAgICAgIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXJUeXBlLAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGFyZ3VtZW50cywKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIEFic3RyYWN0VmFsdWUgdHlwZUJvdW5kID0gX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAuY3JlYXRlRnJvbVN0YXRpY1R5cGUoCiAgICAgICAgICAgIHN0YXRpY1JlY2VpdmVyVHlwZS50eXBlLCBzdGF0aWNSZWNlaXZlclR5cGUucmVsYXRpb24pCiAgICAgICAgLmFic3RyYWN0VmFsdWU7CiAgICByZWNlaXZlclR5cGUgPSByZWNlaXZlclR5cGUgPT0gbnVsbAogICAgICAgID8gdHlwZUJvdW5kCiAgICAgICAgOiBfYWJzdHJhY3RWYWx1ZURvbWFpbi5pbnRlcnNlY3Rpb24ocmVjZWl2ZXJUeXBlLCB0eXBlQm91bmQpOwoKICAgIC8vIFdlIHByZWZlciB0byBub3QgaW5saW5lIGNlcnRhaW4gb3BlcmF0aW9ucyBvbiBpbmRleGFibGVzLAogICAgLy8gYmVjYXVzZSB0aGUgY29uc3RhbnQgZm9sZGVyIHdpbGwgaGFuZGxlIHRoZW0gYmV0dGVyIGFuZCB0dXJuCiAgICAvLyB0aGVtIGludG8gc2ltcGxlciBpbnN0cnVjdGlvbnMgdGhhdCBhbGxvdyBmdXJ0aGVyCiAgICAvLyBvcHRpbWl6YXRpb25zLgogICAgYm9vbCBpc09wdGltaXphYmxlT3BlcmF0aW9uT25JbmRleGFibGUoCiAgICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsIE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICAgIGJvb2wgaXNMZW5ndGggPSBzZWxlY3Rvci5pc0dldHRlciAmJiBzZWxlY3Rvci5uYW1lID09ICJsZW5ndGgiOwogICAgICBpZiAoaXNMZW5ndGggfHwgc2VsZWN0b3IuaXNJbmRleCkgewogICAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc1N1YnR5cGVPZigKICAgICAgICAgICAgZWxlbWVudC5lbmNsb3NpbmdDbGFzcywgX2NvbW1vbkVsZW1lbnRzLmpzSW5kZXhhYmxlQ2xhc3MpOwogICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmlzSW5kZXhTZXQpIHsKICAgICAgICByZXR1cm4gY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNTdWJ0eXBlT2YoCiAgICAgICAgICAgIGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MsIF9jb21tb25FbGVtZW50cy5qc011dGFibGVJbmRleGFibGVDbGFzcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CgogICAgYm9vbCBpc09wdGltaXphYmxlT3BlcmF0aW9uKFNlbGVjdG9yIHNlbGVjdG9yLCBNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgICBDbGFzc0VudGl0eSBjbHMgPSBlbGVtZW50LmVuY2xvc2luZ0NsYXNzOwogICAgICBpZiAoaXNPcHRpbWl6YWJsZU9wZXJhdGlvbk9uSW5kZXhhYmxlKHNlbGVjdG9yLCBlbGVtZW50KSkgcmV0dXJuIHRydWU7CiAgICAgIGlmICghX2ludGVyY2VwdG9yRGF0YS5pbnRlcmNlcHRlZENsYXNzZXMuY29udGFpbnMoY2xzKSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoc2VsZWN0b3IuaXNPcGVyYXRvcikgcmV0dXJuIHRydWU7CiAgICAgIGlmIChzZWxlY3Rvci5pc1NldHRlcikgcmV0dXJuIHRydWU7CiAgICAgIGlmIChzZWxlY3Rvci5pc0luZGV4KSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKHNlbGVjdG9yLmlzSW5kZXhTZXQpIHJldHVybiB0cnVlOwogICAgICBpZiAoZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuanNBcnJheUFkZCB8fAogICAgICAgICAgZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuanNBcnJheVJlbW92ZUxhc3QgfHwKICAgICAgICAgIF9jb21tb25FbGVtZW50cy5pc0pzU3RyaW5nU3BsaXQoZWxlbWVudCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgTWVtYmVyRW50aXR5IGVsZW1lbnQgPQogICAgICAgIGNsb3NlZFdvcmxkLmxvY2F0ZVNpbmdsZU1lbWJlcihzZWxlY3RvciwgcmVjZWl2ZXJUeXBlKTsKICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYKICAgICAgICAhZWxlbWVudC5pc0ZpZWxkICYmCiAgICAgICAgIShlbGVtZW50LmlzR2V0dGVyICYmIHNlbGVjdG9yLmlzQ2FsbCkgJiYKICAgICAgICAhKGVsZW1lbnQuaXNGdW5jdGlvbiAmJiBzZWxlY3Rvci5pc0dldHRlcikgJiYKICAgICAgICAhaXNPcHRpbWl6YWJsZU9wZXJhdGlvbihzZWxlY3RvciwgZWxlbWVudCkpIHsKICAgICAgaWYgKF90cnlJbmxpbmVNZXRob2QoZWxlbWVudCwgc2VsZWN0b3IsIHJlY2VpdmVyVHlwZSwgYXJndW1lbnRzLAogICAgICAgICAgdHlwZUFyZ3VtZW50cywgbm9kZSwgc291cmNlSW5mb3JtYXRpb24pKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gYXJndW1lbnRzLmZpcnN0OwogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IDxISW5zdHJ1Y3Rpb24+W107CgogICAgc2VsZWN0b3IgPz89IF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKG5vZGUpOwoKICAgIGJvb2wgaXNJbnRlcmNlcHRlZCA9CiAgICAgICAgY2xvc2VkV29ybGQuaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRTZWxlY3RvcihzZWxlY3Rvcik7CgogICAgaWYgKGlzSW50ZXJjZXB0ZWQpIHsKICAgICAgSEludGVyY2VwdG9yIGludGVyY2VwdG9yID0gX2ludGVyY2VwdG9yRm9yKHJlY2VpdmVyLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIGlucHV0cy5hZGQoaW50ZXJjZXB0b3IpOwogICAgfQogICAgaW5wdXRzLmFkZEFsbChhcmd1bWVudHMpOwoKICAgIEFic3RyYWN0VmFsdWUgcmVzdWx0VHlwZSA9CiAgICAgICAgX3R5cGVJbmZlcmVuY2VNYXAucmVzdWx0VHlwZU9mU2VsZWN0b3Ioc2VsZWN0b3IsIHJlY2VpdmVyVHlwZSk7CiAgICBpZiAoc2VsZWN0b3IuaXNHZXR0ZXIpIHsKICAgICAgcHVzaChuZXcgSEludm9rZUR5bmFtaWNHZXR0ZXIoc2VsZWN0b3IsIHJlY2VpdmVyVHlwZSwgZWxlbWVudCwgaW5wdXRzLAogICAgICAgICAgaXNJbnRlcmNlcHRlZCwgcmVzdWx0VHlwZSwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNTZXR0ZXIpIHsKICAgICAgcHVzaChuZXcgSEludm9rZUR5bmFtaWNTZXR0ZXIoc2VsZWN0b3IsIHJlY2VpdmVyVHlwZSwgZWxlbWVudCwgaW5wdXRzLAogICAgICAgICAgaXNJbnRlcmNlcHRlZCwgcmVzdWx0VHlwZSwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNDbG9zdXJlQ2FsbCkgewogICAgICBhc3NlcnQoIWlzSW50ZXJjZXB0ZWQpOwogICAgICBwdXNoKG5ldyBISW52b2tlQ2xvc3VyZSgKICAgICAgICAgIHNlbGVjdG9yLCByZWNlaXZlclR5cGUsIGlucHV0cywgcmVzdWx0VHlwZSwgdHlwZUFyZ3VtZW50cykKICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChuZXcgSEludm9rZUR5bmFtaWNNZXRob2Qoc2VsZWN0b3IsIHJlY2VpdmVyVHlwZSwgaW5wdXRzLCByZXN1bHRUeXBlLAogICAgICAgICAgdHlwZUFyZ3VtZW50cywgc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgICBpc0ludGVyY2VwdGVkOiBpc0ludGVyY2VwdGVkKSk7CiAgICB9CiAgfQoKICBIRm9yZWlnbkNvZGUgX2ludm9rZUpzSW50ZXJvcEZ1bmN0aW9uKAogICAgICBGdW5jdGlvbkVudGl0eSBlbGVtZW50LCBMaXN0PEhJbnN0cnVjdGlvbj4gYXJndW1lbnRzKSB7CiAgICBhc3NlcnQoY2xvc2VkV29ybGQubmF0aXZlRGF0YS5pc0pzSW50ZXJvcE1lbWJlcihlbGVtZW50KSk7CiAgICByZWdpc3RyeS5yZWdpc3Rlck5hdGl2ZU1ldGhvZChlbGVtZW50KTsKCiAgICBpZiAoZWxlbWVudCBpcyBDb25zdHJ1Y3RvckVudGl0eSAmJgogICAgICAgIGVsZW1lbnQuaXNGYWN0b3J5Q29uc3RydWN0b3IgJiYKICAgICAgICBfbmF0aXZlRGF0YS5pc0Fub255bW91c0pzSW50ZXJvcENsYXNzKGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MpKSB7CiAgICAgIC8vIEZhY3RvcnkgY29uc3RydWN0b3IgdGhhdCBpcyBzeW50YWN0aWMgc3VnYXIgZm9yIGNyZWF0aW5nIGEgSmF2YVNjcmlwdAogICAgICAvLyBvYmplY3QgbGl0ZXJhbC4KICAgICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPSBlbGVtZW50OwogICAgICBpbnQgaSA9IDA7CiAgICAgIGludCBwb3NpdGlvbnMgPSAwOwogICAgICB2YXIgZmlsdGVyZWRBcmd1bWVudHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgICB2YXIgcGFyYW1ldGVyTmFtZU1hcCA9IG5ldyBNYXA8U3RyaW5nLCBqcy5FeHByZXNzaW9uPigpOwoKICAgICAgLy8gTm90ZTogd2UgZG9uJ3QgdXNlIGBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJTdHJ1Y3R1cmVgIGhlcmUgYmVjYXVzZQogICAgICAvLyB3ZSBkb24ndCBlbGlkZSBwYXJhbWV0ZXJzIHRvIGpzLWludGVyb3AgZXh0ZXJuYWwgc3RhdGljIHRhcmdldHMKICAgICAgLy8gKGluY2x1ZGluZyBmYWN0b3J5IGNvbnN0cnVjdG9ycy4pCiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IGNhbiB3ZSBlbGlkZSB0aG9zZSBwYXJhbWV0ZXJzPyBUaGlzIHNob3VsZCBiZQogICAgICAvLyBjb25zaXN0ZW50IHdpdGggd2hhdCB3ZSBkbyB3aXRoIGluc3RhbmNlIG1ldGhvZHMuCiAgICAgIGlyLlByb2NlZHVyZSBub2RlID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihjb25zdHJ1Y3Rvcikubm9kZTsKICAgICAgTGlzdDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBuYW1lZFBhcmFtZXRlcnMgPQogICAgICAgICAgbm9kZS5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMudG9MaXN0KCk7CiAgICAgIG5hbWVkUGFyYW1ldGVycy5zb3J0KG5hdGl2ZU9yZGVyaW5nKTsKICAgICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIG5hbWVkUGFyYW1ldGVycykgewogICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gdmFyaWFibGUubmFtZTsKICAgICAgICAvLyBUT0RPKGphY29icik6IGNvbnNpZGVyIHRocm93aW5nIGlmIHBhcmFtZXRlciBuYW1lcyBkbyBub3QgbWF0Y2gKICAgICAgICAvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIGluIHRoZSBjbGFzcy4KICAgICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQgPSBhcmd1bWVudHNbaV07CiAgICAgICAgaWYgKGFyZ3VtZW50ICE9IG51bGwpIHsKICAgICAgICAgIGZpbHRlcmVkQXJndW1lbnRzLmFkZChhcmd1bWVudCk7CiAgICAgICAgICB2YXIganNOYW1lID0gX25hdGl2ZURhdGEuY29tcHV0ZVVuZXNjYXBlZEpTSW50ZXJvcE5hbWUocGFyYW1ldGVyTmFtZSk7CiAgICAgICAgICBwYXJhbWV0ZXJOYW1lTWFwW2pzTmFtZV0gPSBuZXcganMuSW50ZXJwb2xhdGVkRXhwcmVzc2lvbihwb3NpdGlvbnMrKyk7CiAgICAgICAgfQogICAgICAgIGkrKzsKICAgICAgfQogICAgICB2YXIgY29kZVRlbXBsYXRlID0KICAgICAgICAgIG5ldyBqcy5UZW1wbGF0ZShudWxsLCBqcy5vYmplY3RMaXRlcmFsKHBhcmFtZXRlck5hbWVNYXApKTsKCiAgICAgIHZhciBuYXRpdmVCZWhhdmlvciA9IG5ldyBOYXRpdmVCZWhhdmlvcigpLi5jb2RlVGVtcGxhdGUgPSBjb2RlVGVtcGxhdGU7CiAgICAgIGlmIChvcHRpb25zLnRydXN0SlNJbnRlcm9wVHlwZUFubm90YXRpb25zKSB7CiAgICAgICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9CiAgICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3MpOwogICAgICAgIG5hdGl2ZUJlaGF2aW9yLnR5cGVzUmV0dXJuZWQuYWRkKHRoaXNUeXBlKTsKICAgICAgfQogICAgICAvLyBUT0RPKGVmb3J0dW5hKTogU291cmNlIGluZm9ybWF0aW9uLgogICAgICByZXR1cm4gbmV3IEhGb3JlaWduQ29kZSgKICAgICAgICAgIGNvZGVUZW1wbGF0ZSwgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUsIGZpbHRlcmVkQXJndW1lbnRzLAogICAgICAgICAgbmF0aXZlQmVoYXZpb3I6IG5hdGl2ZUJlaGF2aW9yKTsKICAgIH0KCiAgICB2YXIgdGFyZ2V0ID0gbmV3IEhGb3JlaWduQ29kZSgKICAgICAgICBqcy5qcwogICAgICAgICAgICAucGFyc2VGb3JlaWduSlMoIiR7X25hdGl2ZURhdGEuZ2V0Rml4ZWRCYWNrZW5kTWV0aG9kUGF0aChlbGVtZW50KX0uIgogICAgICAgICAgICAgICAgIiR7X25hdGl2ZURhdGEuZ2V0Rml4ZWRCYWNrZW5kTmFtZShlbGVtZW50KX0iKSwKICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwKICAgICAgICA8SEluc3RydWN0aW9uPltdKTsKICAgIGFkZCh0YXJnZXQpOwogICAgLy8gU3RyaXAgb2ZmIHRyYWlsaW5nIGFyZ3VtZW50cyB0aGF0IHdlcmUgbm90IHNwZWNpZmllZC4KICAgIC8vIHdlIGNvdWxkIGFzc2VydCB0aGF0IHRoZSB0cmFpbGluZyBhcmd1bWVudHMgYXJlIGFsbCBudWxsLgogICAgLy8gVE9ETyhqYWNvYnIpOiByZXdyaXRlIG5hbWVkIGFyZ3VtZW50cyB0byBhbiBvYmplY3QgbGl0ZXJhbCBtYXRjaGluZwogICAgLy8gdGhlIGZhY3RvcnkgY29uc3RydWN0b3IgY2FzZS4KICAgIGFyZ3VtZW50cyA9IGFyZ3VtZW50cy53aGVyZSgoYXJnKSA9PiBhcmcgIT0gbnVsbCkudG9MaXN0KCk7CiAgICB2YXIgaW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bdGFyZ2V0XS4uYWRkQWxsKGFyZ3VtZW50cyk7CgogICAgdmFyIG5hdGl2ZUJlaGF2aW9yID0gbmV3IE5hdGl2ZUJlaGF2aW9yKCkuLnNpZGVFZmZlY3RzLnNldEFsbFNpZGVFZmZlY3RzKCk7CgogICAgRGFydFR5cGUgdHlwZSA9IGVsZW1lbnQgaXMgQ29uc3RydWN0b3JFbnRpdHkKICAgICAgICA/IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoZWxlbWVudC5lbmNsb3NpbmdDbGFzcykKICAgICAgICA6IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKGVsZW1lbnQpLnJldHVyblR5cGU7CiAgICAvLyBOYXRpdmUgYmVoYXZpb3IgZWZmZWN0cyBoZXJlIGFyZSBzaW1pbGFyIHRvIG5hdGl2ZS9iZWhhdmlvci5kYXJ0LgogICAgLy8gVGhlIHJldHVybiB0eXBlIGlzIGR5bmFtaWMgaWYgd2UgZG9uJ3QgdHJ1c3QganMtaW50ZXJvcCB0eXBlCiAgICAvLyBkZWNsYXJhdGlvbnMuCiAgICBuYXRpdmVCZWhhdmlvci50eXBlc1JldHVybmVkLmFkZCgKICAgICAgICBvcHRpb25zLnRydXN0SlNJbnRlcm9wVHlwZUFubm90YXRpb25zID8gdHlwZSA6IGNvbnN0IER5bmFtaWNUeXBlKCkpOwoKICAgIC8vIFRoZSBhbGxvY2F0aW9uIGVmZmVjdHMgaW5jbHVkZSB0aGUgZGVjbGFyZWQgdHlwZSBpZiBpdCBpcyBuYXRpdmUgKHdoaWNoCiAgICAvLyBpbmNsdWRlcyBqcyBpbnRlcm9wIHR5cGVzKS4KICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYgX25hdGl2ZURhdGEuaXNOYXRpdmVDbGFzcyh0eXBlLmVsZW1lbnQpKSB7CiAgICAgIG5hdGl2ZUJlaGF2aW9yLnR5cGVzSW5zdGFudGlhdGVkLmFkZCh0eXBlKTsKICAgIH0KCiAgICAvLyBJdCBhbHNvIGluY2x1ZGVzIGFueSBvdGhlciBKUyBpbnRlcm9wIHR5cGUgaWYgd2UgZG9uJ3QgdHJ1c3QgdGhlCiAgICAvLyBhbm5vdGF0aW9uIG9yIGlmIGlzIGRlY2xhcmVkIHRvbyBicm9hZC4KICAgIGlmICghb3B0aW9ucy50cnVzdEpTSW50ZXJvcFR5cGVBbm5vdGF0aW9ucyB8fAogICAgICAgIHR5cGUgPT0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGUgfHwKICAgICAgICB0eXBlIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgIG5hdGl2ZUJlaGF2aW9yLnR5cGVzSW5zdGFudGlhdGVkLmFkZChfZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgICAuZ2V0VGhpc1R5cGUoX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdE9iamVjdENsYXNzKSk7CiAgICB9CgogICAgU3RyaW5nIHRlbXBsYXRlOwogICAgaWYgKGVsZW1lbnQuaXNHZXR0ZXIpIHsKICAgICAgdGVtcGxhdGUgPSAnIyc7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaXNTZXR0ZXIpIHsKICAgICAgdGVtcGxhdGUgPSAnIyA9ICMnOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGFyZ3MgPSBuZXcgTGlzdC5maWxsZWQoYXJndW1lbnRzLmxlbmd0aCwgJyMnKS5qb2luKCcsJyk7CiAgICAgIHRlbXBsYXRlID0gZWxlbWVudC5pc0NvbnN0cnVjdG9yID8gIm5ldyAjKCRhcmdzKSIgOiAiIygkYXJncykiOwogICAgfQogICAganMuVGVtcGxhdGUgY29kZVRlbXBsYXRlID0ganMuanMucGFyc2VGb3JlaWduSlModGVtcGxhdGUpOwogICAgbmF0aXZlQmVoYXZpb3IuY29kZVRlbXBsYXRlID0gY29kZVRlbXBsYXRlOwoKICAgIC8vIFRPRE8oZWZvcnR1bmEpOiBBZGQgc291cmNlIGluZm9ybWF0aW9uLgogICAgcmV0dXJuIG5ldyBIRm9yZWlnbkNvZGUoCiAgICAgICAgY29kZVRlbXBsYXRlLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwgaW5wdXRzLAogICAgICAgIG5hdGl2ZUJlaGF2aW9yOiBuYXRpdmVCZWhhdmlvcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25Ob2RlKGlyLkZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZENyZWF0ZShub2RlKTsKICAgIENsb3N1cmVSZXByZXNlbnRhdGlvbkluZm8gY2xvc3VyZUluZm8gPQogICAgICAgIF9jbG9zdXJlRGF0YUxvb2t1cC5nZXRDbG9zdXJlSW5mbyhub2RlLnBhcmVudCk7CiAgICBDbGFzc0VudGl0eSBjbG9zdXJlQ2xhc3NFbnRpdHkgPSBjbG9zdXJlSW5mby5jbG9zdXJlQ2xhc3NFbnRpdHk7CgogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGNhcHR1cmVkVmFyaWFibGVzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaEluc3RhbmNlRmllbGQoY2xvc3VyZUNsYXNzRW50aXR5LAogICAgICAgIChfLCBGaWVsZEVudGl0eSBmaWVsZCkgewogICAgICBpZiAoX2ZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKGZpZWxkKS5pc0VsaWRlZCkgcmV0dXJuOwogICAgICBjYXB0dXJlZFZhcmlhYmxlcwogICAgICAgICAgLmFkZChsb2NhbHNIYW5kbGVyLnJlYWRMb2NhbChjbG9zdXJlSW5mby5nZXRMb2NhbEZvckZpZWxkKGZpZWxkKSkpOwogICAgfSk7CgogICAgQWJzdHJhY3RWYWx1ZSB0eXBlID0KICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVOb25OdWxsRXhhY3QoY2xvc3VyZUNsYXNzRW50aXR5KTsKICAgIC8vIFRPRE8oZWZvcnR1bmEpOiBBZGQgc291cmNlIGluZm9ybWF0aW9uIGhlcmUuCiAgICBwdXNoKG5ldyBIQ3JlYXRlKAogICAgICAgIGNsb3N1cmVDbGFzc0VudGl0eSwgY2FwdHVyZWRWYXJpYWJsZXMsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgIGNhbGxNZXRob2Q6IGNsb3N1cmVJbmZvLmNhbGxNZXRob2QpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICAgIGFzc2VydChfaXNSZWFjaGFibGUpOwogICAgZGVjbGFyYXRpb24uZnVuY3Rpb24uYWNjZXB0KHRoaXMpOwogICAgTG9jYWwgbG9jYWwgPSBfbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUoZGVjbGFyYXRpb24udmFyaWFibGUpOwogICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChsb2NhbCwgcG9wKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihpci5GdW5jdGlvbkV4cHJlc3Npb24gZnVuY0V4cHJlc3Npb24pIHsKICAgIGZ1bmNFeHByZXNzaW9uLmZ1bmN0aW9uLmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnN0YW50aWF0aW9uKGlyLkluc3RhbnRpYXRpb24gbm9kZSkgewogICAgdmFyIGFyZ3VtZW50cyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICBub2RlLmV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwogICAgYXJndW1lbnRzLmFkZChwb3AoKSk7CiAgICBTdGF0aWNUeXBlIGV4cHJlc3Npb25UeXBlID0gX2dldFN0YXRpY1R5cGUobm9kZS5leHByZXNzaW9uKTsKICAgIGJvb2wgdHlwZUFyZ3VtZW50c05lZWRlZCA9IF9ydGlOZWVkLmluc3RhbnRpYXRpb25OZWVkc1R5cGVBcmd1bWVudHMoCiAgICAgICAgZXhwcmVzc2lvblR5cGUudHlwZSwgbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0gbm9kZS50eXBlQXJndW1lbnRzCiAgICAgICAgLm1hcCgodHlwZSkgPT4gdHlwZUFyZ3VtZW50c05lZWRlZAogICAgICAgICAgICA/IF9lbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpCiAgICAgICAgICAgIDogX2NvbW1vbkVsZW1lbnRzLmR5bmFtaWNUeXBlKQogICAgICAgIC50b0xpc3QoKTsKICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyR2VuZXJpY0luc3RhbnRpYXRpb24oCiAgICAgICAgbmV3IEdlbmVyaWNJbnN0YW50aWF0aW9uKGV4cHJlc3Npb25UeXBlLnR5cGUsIHR5cGVBcmd1bWVudHMpKTsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENhbiB3ZSBhdm9pZCBjcmVhdGluZyB0aGUgaW5zdGFudGlhdGlvbiBvYmplY3Q/CiAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gdHlwZUFyZ3VtZW50cykgewogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPQogICAgICAgICAgX3R5cGVCdWlsZGVyLmFuYWx5emVUeXBlQXJndW1lbnQodHlwZSwgc291cmNlRWxlbWVudCk7CiAgICAgIGFyZ3VtZW50cy5hZGQoaW5zdHJ1Y3Rpb24pOwogICAgfQogICAgaW50IHR5cGVBcmd1bWVudENvdW50ID0gbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aDsKICAgIGJvb2wgdGFyZ2V0Q2FuVGhyb3cgPSBmYWxzZTsgLy8gVE9ETyhzcmEpOiBJcyB0aGlzIHRydWU/CiAgICBGdW5jdGlvbkVudGl0eSB0YXJnZXQgPQogICAgICAgIF9jb21tb25FbGVtZW50cy5nZXRJbnN0YW50aWF0ZUZ1bmN0aW9uKHR5cGVBcmd1bWVudENvdW50KTsKICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3Bhbm5hYmxlKHRhcmdldEVsZW1lbnQsIG5vZGUpLAogICAgICAgICAgJ0dlbmVyaWMgZnVuY3Rpb24gaW5zdGFudGlhdGlvbiBub3QgaW1wbGVtZW50ZWQgZm9yICcKICAgICAgICAgICcke3R5cGVBcmd1bWVudENvdW50fSB0eXBlIGFyZ3VtZW50cycpOwogICAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IG5ldyBISW52b2tlU3RhdGljKAogICAgICAgIHRhcmdldCwgYXJndW1lbnRzLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5mdW5jdGlvblR5cGUsIDxEYXJ0VHlwZT5bXSwKICAgICAgICB0YXJnZXRDYW5UaHJvdzogdGFyZ2V0Q2FuVGhyb3cpOwogICAgLy8gVE9ETyhzcmEpOiAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb24KICAgIGluc3RydWN0aW9uLnNpZGVFZmZlY3RzCiAgICAgIC4uY2xlYXJBbGxEZXBlbmRlbmNpZXMoKQogICAgICAuLmNsZWFyQWxsU2lkZUVmZmVjdHMoKTsKCiAgICBwdXNoKGluc3RydWN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNZXRob2RJbnZvY2F0aW9uKGlyLk1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgbm9kZS5yZWNlaXZlci5hY2NlcHQodGhpcyk7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBwb3AoKTsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gX2VsZW1lbnRNYXAuZ2V0U2VsZWN0b3Iobm9kZSk7CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0gPERhcnRUeXBlPltdOwogICAgc2VsZWN0b3IgPQogICAgICAgIF9maWxsRHluYW1pY1R5cGVBcmd1bWVudHMoc2VsZWN0b3IsIG5vZGUuYXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKTsKICAgIF9wdXNoRHluYW1pY0ludm9jYXRpb24oCiAgICAgICAgbm9kZSwKICAgICAgICBfZ2V0U3RhdGljVHlwZShub2RlLnJlY2VpdmVyKSwKICAgICAgICBfdHlwZUluZmVyZW5jZU1hcC5yZWNlaXZlclR5cGVPZkludm9jYXRpb24obm9kZSwgX2Fic3RyYWN0VmFsdWVEb21haW4pLAogICAgICAgIHNlbGVjdG9yLAogICAgICAgIDxISW5zdHJ1Y3Rpb24+W3JlY2VpdmVyXS4uYWRkQWxsKF92aXNpdEFyZ3VtZW50c0ZvckR5bmFtaWNUYXJnZXQoCiAgICAgICAgICAgIHNlbGVjdG9yLCBub2RlLmFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cykpLAogICAgICAgIHR5cGVBcmd1bWVudHMsCiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZENhbGwobm9kZS5yZWNlaXZlciwgbm9kZSkpOwogIH0KCiAgSEludGVyY2VwdG9yIF9pbnRlcmNlcHRvckZvcigKICAgICAgSEluc3RydWN0aW9uIGludGVyY2VwdGVkLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgSEludGVyY2VwdG9yIGludGVyY2VwdG9yID0KICAgICAgICBuZXcgSEludGVyY2VwdG9yKGludGVyY2VwdGVkLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5ub25OdWxsVHlwZSkKICAgICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICAgIGFkZChpbnRlcmNlcHRvcik7CiAgICByZXR1cm4gaW50ZXJjZXB0b3I7CiAgfQoKICBzdGF0aWMgaXIuQ2xhc3MgX2NvbnRhaW5pbmdDbGFzcyhpci5UcmVlTm9kZSBub2RlKSB7CiAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7CiAgICAgIGlmIChub2RlIGlzIGlyLkNsYXNzKSByZXR1cm4gbm9kZTsKICAgICAgbm9kZSA9IG5vZGUucGFyZW50OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIF9nZW5lcmF0ZVN1cGVyTm9TdWNoTWV0aG9kKAogICAgICBpci5FeHByZXNzaW9uIGludm9jYXRpb24sCiAgICAgIFN0cmluZyBwdWJsaWNOYW1lLAogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gYXJndW1lbnRzLAogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBfZWxlbWVudE1hcC5nZXRTZWxlY3RvcihpbnZvY2F0aW9uKTsKICAgIENsYXNzRW50aXR5IGNvbnRhaW5pbmdDbGFzcyA9CiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0Q2xhc3MoX2NvbnRhaW5pbmdDbGFzcyhpbnZvY2F0aW9uKSk7CiAgICBGdW5jdGlvbkVudGl0eSBub1N1Y2hNZXRob2QgPQogICAgICAgIF9lbGVtZW50TWFwLmdldFN1cGVyTm9TdWNoTWV0aG9kKGNvbnRhaW5pbmdDbGFzcyk7CgogICAgQ29uc3RhbnRWYWx1ZSBuYW1lQ29uc3RhbnQgPSBjb25zdGFudF9zeXN0ZW0uY3JlYXRlU3RyaW5nKHB1YmxpY05hbWUpOwoKICAgIGpzLk5hbWUgaW50ZXJuYWxOYW1lID0gX25hbWVyLmludm9jYXRpb25OYW1lKHNlbGVjdG9yKTsKCiAgICB2YXIgYXJndW1lbnRzSW5zdHJ1Y3Rpb24gPSBfYnVpbGRMaXRlcmFsTGlzdChhcmd1bWVudHMpOwogICAgYWRkKGFyZ3VtZW50c0luc3RydWN0aW9uKTsKCiAgICB2YXIgYXJndW1lbnROYW1lcyA9IG5ldyBMaXN0PEhJbnN0cnVjdGlvbj4oKTsKICAgIGZvciAoU3RyaW5nIGFyZ3VtZW50TmFtZSBpbiBzZWxlY3Rvci5uYW1lZEFyZ3VtZW50cykgewogICAgICBDb25zdGFudFZhbHVlIGFyZ3VtZW50TmFtZUNvbnN0YW50ID0KICAgICAgICAgIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVTdHJpbmcoYXJndW1lbnROYW1lKTsKICAgICAgYXJndW1lbnROYW1lcy5hZGQoZ3JhcGguYWRkQ29uc3RhbnQoYXJndW1lbnROYW1lQ29uc3RhbnQsIGNsb3NlZFdvcmxkKSk7CiAgICB9CiAgICB2YXIgYXJndW1lbnROYW1lc0luc3RydWN0aW9uID0gX2J1aWxkTGl0ZXJhbExpc3QoYXJndW1lbnROYW1lcyk7CiAgICBhZGQoYXJndW1lbnROYW1lc0luc3RydWN0aW9uKTsKCiAgICBDb25zdGFudFZhbHVlIGtpbmRDb25zdGFudCA9CiAgICAgICAgY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUludEZyb21JbnQoc2VsZWN0b3IuaW52b2NhdGlvbk1pcnJvcktpbmQpOwoKICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbigKICAgICAgICBfY29tbW9uRWxlbWVudHMuY3JlYXRlSW52b2NhdGlvbk1pcnJvciwKICAgICAgICBbCiAgICAgICAgICBncmFwaC5hZGRDb25zdGFudChuYW1lQ29uc3RhbnQsIGNsb3NlZFdvcmxkKSwKICAgICAgICAgIGdyYXBoLmFkZENvbnN0YW50U3RyaW5nRnJvbU5hbWUoaW50ZXJuYWxOYW1lLCBjbG9zZWRXb3JsZCksCiAgICAgICAgICBncmFwaC5hZGRDb25zdGFudChraW5kQ29uc3RhbnQsIGNsb3NlZFdvcmxkKSwKICAgICAgICAgIGFyZ3VtZW50c0luc3RydWN0aW9uLAogICAgICAgICAgYXJndW1lbnROYW1lc0luc3RydWN0aW9uLAogICAgICAgICAgZ3JhcGguYWRkQ29uc3RhbnRJbnQodHlwZUFyZ3VtZW50cy5sZW5ndGgsIGNsb3NlZFdvcmxkKSwKICAgICAgICBdLAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLAogICAgICAgIHR5cGVBcmd1bWVudHMsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgICBfYnVpbGRJbnZva2VTdXBlcihTZWxlY3RvcnMubm9TdWNoTWV0aG9kXywgY29udGFpbmluZ0NsYXNzLCBub1N1Y2hNZXRob2QsCiAgICAgICAgPEhJbnN0cnVjdGlvbj5bcG9wKCldLCB0eXBlQXJndW1lbnRzLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBISW5zdHJ1Y3Rpb24gX2J1aWxkSW52b2tlU3VwZXIoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBDbGFzc0VudGl0eSBjb250YWluaW5nQ2xhc3MsCiAgICAgIE1lbWJlckVudGl0eSB0YXJnZXQsCiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudHMsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPQogICAgICAgIGxvY2Fsc0hhbmRsZXIucmVhZFRoaXMoc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgIGJvb2wgaXNJbnRlcmNlcHRlZCA9CiAgICAgICAgY2xvc2VkV29ybGQuaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRTZWxlY3RvcihzZWxlY3Rvcik7CiAgICBpZiAoaXNJbnRlcmNlcHRlZCkgewogICAgICBpbnB1dHMuYWRkKF9pbnRlcmNlcHRvckZvcihyZWNlaXZlciwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICAgIGlucHV0cy5hZGQocmVjZWl2ZXIpOwogICAgaW5wdXRzLmFkZEFsbChhcmd1bWVudHMpOwoKICAgIEFic3RyYWN0VmFsdWUgdHlwZU1hc2s7CiAgICBpZiAodGFyZ2V0IGlzIEZ1bmN0aW9uRW50aXR5KSB7CiAgICAgIHR5cGVNYXNrID0gX3R5cGVJbmZlcmVuY2VNYXAuZ2V0UmV0dXJuVHlwZU9mKHRhcmdldCk7CiAgICB9IGVsc2UgewogICAgICB0eXBlTWFzayA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogICAgfQogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gbmV3IEhJbnZva2VTdXBlcigKICAgICAgICB0YXJnZXQsCiAgICAgICAgY29udGFpbmluZ0NsYXNzLAogICAgICAgIHNlbGVjdG9yLAogICAgICAgIGlucHV0cywKICAgICAgICBpc0ludGVyY2VwdGVkLAogICAgICAgIHR5cGVNYXNrLAogICAgICAgIHR5cGVBcmd1bWVudHMsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgaXNTZXR0ZXI6IHNlbGVjdG9yLmlzU2V0dGVyIHx8IHNlbGVjdG9yLmlzSW5kZXhTZXQpOwogICAgaW5zdHJ1Y3Rpb24uc2lkZUVmZmVjdHMgPQogICAgICAgIF9pbmZlcnJlZERhdGEuZ2V0U2lkZUVmZmVjdHNPZlNlbGVjdG9yKHNlbGVjdG9yLCBudWxsKTsKICAgIHB1c2goaW5zdHJ1Y3Rpb24pOwogICAgcmV0dXJuIGluc3RydWN0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN1cGVyUHJvcGVydHlHZXQoaXIuU3VwZXJQcm9wZXJ0eUdldCBub2RlKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEdldChub2RlKTsKICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPQogICAgICAgIF9lbGVtZW50TWFwLmdldFN1cGVyTWVtYmVyKF9jdXJyZW50RnJhbWUubWVtYmVyLCBub2RlLm5hbWUpOwogICAgaWYgKG1lbWJlciA9PSBudWxsKSB7CiAgICAgIF9nZW5lcmF0ZVN1cGVyTm9TdWNoTWV0aG9kKG5vZGUsIF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKG5vZGUpLm5hbWUsCiAgICAgICAgICBjb25zdCA8SEluc3RydWN0aW9uPltdLCBjb25zdCA8RGFydFR5cGU+W10sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG1lbWJlci5pc0ZpZWxkKSB7CiAgICAgIEZpZWxkQW5hbHlzaXNEYXRhIGZpZWxkRGF0YSA9IF9maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShtZW1iZXIpOwogICAgICBpZiAoZmllbGREYXRhLmlzRWZmZWN0aXZlbHlDb25zdGFudCkgewogICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBmaWVsZERhdGEuY29uc3RhbnRWYWx1ZTsKICAgICAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnQodmFsdWUsIGNsb3NlZFdvcmxkLAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIF9idWlsZEludm9rZVN1cGVyKAogICAgICAgIF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKG5vZGUpLAogICAgICAgIF9lbGVtZW50TWFwLmdldENsYXNzKF9jb250YWluaW5nQ2xhc3Mobm9kZSkpLAogICAgICAgIG1lbWJlciwKICAgICAgICBjb25zdCA8SEluc3RydWN0aW9uPltdLAogICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKGlyLlN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZENhbGwobm9kZSwgbm9kZSk7CiAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0KICAgICAgICBfZWxlbWVudE1hcC5nZXRTdXBlck1lbWJlcihfY3VycmVudEZyYW1lLm1lbWJlciwgbm9kZS5uYW1lKTsKICAgIGlmIChtZW1iZXIgPT0gbnVsbCkgewogICAgICBTZWxlY3RvciBzZWxlY3RvciA9IF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKG5vZGUpOwogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0gPERhcnRUeXBlPltdOwogICAgICBzZWxlY3RvciA9CiAgICAgICAgICBfZmlsbER5bmFtaWNUeXBlQXJndW1lbnRzKHNlbGVjdG9yLCBub2RlLmFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cyk7CiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudHMgPSBfdmlzaXRBcmd1bWVudHNGb3JEeW5hbWljVGFyZ2V0KAogICAgICAgICAgc2VsZWN0b3IsIG5vZGUuYXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKTsKICAgICAgX2dlbmVyYXRlU3VwZXJOb1N1Y2hNZXRob2QoCiAgICAgICAgICBub2RlLCBzZWxlY3Rvci5uYW1lLCBhcmd1bWVudHMsIHR5cGVBcmd1bWVudHMsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9CiAgICAgICAgX2dldFN0YXRpY1R5cGVBcmd1bWVudHMobWVtYmVyLCBub2RlLmFyZ3VtZW50cyk7CgogICAgTWVtYmVyRGVmaW5pdGlvbiB0YXJnZXREZWZpbml0aW9uID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihtZW1iZXIpOwogICAgaXIuUHJvY2VkdXJlIHRhcmdldCA9IHRhcmdldERlZmluaXRpb24ubm9kZTsKICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uID0gbWVtYmVyOwogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGFyZ3VtZW50cyA9IF92aXNpdEFyZ3VtZW50c0ZvclN0YXRpY1RhcmdldCgKICAgICAgICB0YXJnZXQuZnVuY3Rpb24sCiAgICAgICAgZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlLAogICAgICAgIG5vZGUuYXJndW1lbnRzLAogICAgICAgIHR5cGVBcmd1bWVudHMsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogICAgX2J1aWxkSW52b2tlU3VwZXIoCiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U2VsZWN0b3Iobm9kZSksCiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0Q2xhc3MoX2NvbnRhaW5pbmdDbGFzcyhub2RlKSksCiAgICAgICAgbWVtYmVyLAogICAgICAgIGFyZ3VtZW50cywKICAgICAgICB0eXBlQXJndW1lbnRzLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIHZvaWQgX2Fzc2VydElzVHlwZShISW5zdHJ1Y3Rpb24gc3VidHlwZUluc3RydWN0aW9uLCBEYXJ0VHlwZSBzdXBlcnR5cGUsCiAgICAgIFN0cmluZyBwcmVmaXgsIFN0cmluZyBpbmZpeCwgU3RyaW5nIHN1ZmZpeCkgewogICAgSEluc3RydWN0aW9uIHN1cGVydHlwZUluc3RydWN0aW9uID0gX3R5cGVCdWlsZGVyLmFuYWx5emVUeXBlQXJndW1lbnQoCiAgICAgICAgbG9jYWxzSGFuZGxlci5zdWJzdEluQ29udGV4dChzdXBlcnR5cGUpLCBzb3VyY2VFbGVtZW50KTsKICAgIEhJbnN0cnVjdGlvbiBwcmVmaXhJbnN0cnVjdGlvbiA9CiAgICAgICAgZ3JhcGguYWRkQ29uc3RhbnRTdHJpbmcocHJlZml4LCBjbG9zZWRXb3JsZCk7CiAgICBISW5zdHJ1Y3Rpb24gaW5maXhJbnN0cnVjdGlvbiA9IGdyYXBoLmFkZENvbnN0YW50U3RyaW5nKGluZml4LCBjbG9zZWRXb3JsZCk7CiAgICBISW5zdHJ1Y3Rpb24gc3VmZml4SW5zdHJ1Y3Rpb24gPQogICAgICAgIGdyYXBoLmFkZENvbnN0YW50U3RyaW5nKHN1ZmZpeCwgY2xvc2VkV29ybGQpOwogICAgRnVuY3Rpb25FbnRpdHkgZWxlbWVudCA9IF9jb21tb25FbGVtZW50cy5hc3NlcnRJc1N1YnR5cGU7CiAgICB2YXIgaW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bCiAgICAgIHN1YnR5cGVJbnN0cnVjdGlvbiwKICAgICAgc3VwZXJ0eXBlSW5zdHJ1Y3Rpb24sCiAgICAgIHByZWZpeEluc3RydWN0aW9uLAogICAgICBpbmZpeEluc3RydWN0aW9uLAogICAgICBzdWZmaXhJbnN0cnVjdGlvbgogICAgXTsKICAgIEhJbnN0cnVjdGlvbiBhc3NlcnRJc1N1YnR5cGUgPSBuZXcgSEludm9rZVN0YXRpYyhlbGVtZW50LCBpbnB1dHMsCiAgICAgICAgc3VidHlwZUluc3RydWN0aW9uLmluc3RydWN0aW9uVHlwZSwgY29uc3QgPERhcnRUeXBlPltdKTsKICAgIGFkZChhc3NlcnRJc1N1YnR5cGUpOwogIH0KCiAgdm9pZCBfY2hlY2tUeXBlQm91bmQoCiAgICAgIEhJbnN0cnVjdGlvbiB0eXBlSW5zdHJ1Y3Rpb24sIERhcnRUeXBlIGJvdW5kLCBTdHJpbmcgdmFyaWFibGVOYW1lKSB7CiAgICBISW5zdHJ1Y3Rpb24gYm91bmRJbnN0cnVjdGlvbiA9IF90eXBlQnVpbGRlci5hbmFseXplVHlwZUFyZ3VtZW50TmV3UnRpKAogICAgICAgIGxvY2Fsc0hhbmRsZXIuc3Vic3RJbkNvbnRleHQoYm91bmQpLCBzb3VyY2VFbGVtZW50KTsKCiAgICBISW5zdHJ1Y3Rpb24gdmFyaWFibGVOYW1lSW5zdHJ1Y3Rpb24gPQogICAgICAgIGdyYXBoLmFkZENvbnN0YW50U3RyaW5nKHZhcmlhYmxlTmFtZSwgY2xvc2VkV29ybGQpOwogICAgRnVuY3Rpb25FbnRpdHkgZWxlbWVudCA9IF9jb21tb25FbGVtZW50cy5jaGVja1R5cGVCb3VuZDsKICAgIHZhciBpbnB1dHMgPSA8SEluc3RydWN0aW9uPlsKICAgICAgdHlwZUluc3RydWN0aW9uLAogICAgICBib3VuZEluc3RydWN0aW9uLAogICAgICB2YXJpYWJsZU5hbWVJbnN0cnVjdGlvbgogICAgXTsKICAgIEhJbnN0cnVjdGlvbiBjaGVja0JvdW5kID0gbmV3IEhJbnZva2VTdGF0aWMoCiAgICAgICAgZWxlbWVudCwgaW5wdXRzLCB0eXBlSW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25UeXBlLCBjb25zdCA8RGFydFR5cGU+W10pOwogICAgYWRkKGNoZWNrQm91bmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihpci5Db25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24gPQogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGROZXcobm9kZSk7CiAgICBpci5Db25zdHJ1Y3RvciB0YXJnZXQgPSBub2RlLnRhcmdldDsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IF9lbGVtZW50TWFwLmdldENvbnN0YW50VmFsdWUobm9kZSk7CiAgICAgIHN0YWNrLmFkZChncmFwaC5hZGRDb25zdGFudChjb25zdGFudCwgY2xvc2VkV29ybGQsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yID0gX2VsZW1lbnRNYXAuZ2V0Q29uc3RydWN0b3IodGFyZ2V0KTsKICAgIENsYXNzRW50aXR5IGNscyA9IGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzOwogICAgQWJzdHJhY3RWYWx1ZSB0eXBlTWFzayA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxFeGFjdChjbHMpOwogICAgSW50ZXJmYWNlVHlwZSBpbnN0YW5jZVR5cGUgPSBfZWxlbWVudE1hcC5jcmVhdGVJbnRlcmZhY2VUeXBlKAogICAgICAgIHRhcmdldC5lbmNsb3NpbmdDbGFzcywgbm9kZS5hcmd1bWVudHMudHlwZXMpOwogICAgaW5zdGFuY2VUeXBlID0gbG9jYWxzSGFuZGxlci5zdWJzdEluQ29udGV4dChpbnN0YW5jZVR5cGUpOwoKICAgIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgaWYgKGNvbnN0cnVjdG9yLmlzR2VuZXJhdGl2ZUNvbnN0cnVjdG9yICYmCiAgICAgICAgX25hdGl2ZURhdGEuaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3MpICYmCiAgICAgICAgIV9uYXRpdmVEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKGNvbnN0cnVjdG9yKSkgewogICAgICAvLyBOYXRpdmUgY2xhc3MgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvcnMgdGFrZSBhIHByZS1jb25zdHJ1Y3RlZCBvYmplY3QuCiAgICAgIGFyZ3VtZW50cy5hZGQoZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7CiAgICB9CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICBfZ2V0Q29uc3RydWN0b3JUeXBlQXJndW1lbnRzKGNvbnN0cnVjdG9yLCBub2RlLmFyZ3VtZW50cyk7CiAgICBhcmd1bWVudHMuYWRkQWxsKGNsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaXNKc0ludGVyb3BNZW1iZXIoY29uc3RydWN0b3IpCiAgICAgICAgPyBfdmlzaXRBcmd1bWVudHNGb3JOYXRpdmVTdGF0aWNUYXJnZXQodGFyZ2V0LmZ1bmN0aW9uLCBub2RlLmFyZ3VtZW50cykKICAgICAgICA6IF92aXNpdEFyZ3VtZW50c0ZvclN0YXRpY1RhcmdldCgKICAgICAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uLAogICAgICAgICAgICBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgICAgIG5vZGUuYXJndW1lbnRzLAogICAgICAgICAgICB0eXBlQXJndW1lbnRzLAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgaWYgKF9jb21tb25FbGVtZW50cy5pc1N5bWJvbENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKSkgewogICAgICBjb25zdHJ1Y3RvciA9IF9jb21tb25FbGVtZW50cy5zeW1ib2xWYWxpZGF0ZWRDb25zdHJ1Y3RvcjsKICAgIH0KICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHdoZW4gdHlwZSBhcmd1bWVudHMgYXJlIHBhc3NlZCB0bwogICAgLy8gY29uc3RydWN0b3JzIGxpa2UgY2FsbGluZyBhIGdlbmVyaWMgbWV0aG9kLgogICAgX2FkZFR5cGVBcmd1bWVudHMoYXJndW1lbnRzLCBfZ2V0Q2xhc3NUeXBlQXJndW1lbnRzKGNscywgbm9kZS5hcmd1bWVudHMpLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIF9hZGRJbXBsaWNpdEluc3RhbnRpYXRpb24oaW5zdGFuY2VUeXBlKTsKICAgIF9wdXNoU3RhdGljSW52b2NhdGlvbihjb25zdHJ1Y3RvciwgYXJndW1lbnRzLCB0eXBlTWFzaywgdHlwZUFyZ3VtZW50cywKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24sIGluc3RhbmNlVHlwZTogaW5zdGFuY2VUeXBlKTsKICAgIF9yZW1vdmVJbXBsaWNpdEluc3RhbnRpYXRpb24oaW5zdGFuY2VUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJc0V4cHJlc3Npb24oaXIuSXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIG5vZGUub3BlcmFuZC5hY2NlcHQodGhpcyk7CiAgICBISW5zdHJ1Y3Rpb24gZXhwcmVzc2lvbiA9IHBvcCgpOwogICAgX3B1c2hJc1Rlc3Qobm9kZS50eXBlLCBleHByZXNzaW9uLCBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkSXMobm9kZSkpOwogIH0KCiAgdm9pZCBfcHVzaElzVGVzdChpci5EYXJ0VHlwZSB0eXBlLCBISW5zdHJ1Y3Rpb24gZXhwcmVzc2lvbiwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIC8vIE5vdGU6IFRoZSBjYWxsIHRvICJ1bmFsaWFzIiB0aGlzIHR5cGUgbGlrZSBpbiB0aGUgb3JpZ2luYWwgU1NBIGJ1aWxkZXIgaXMKICAgIC8vIHVubmVjZXNzYXJ5IGluIGtlcm5lbCBiZWNhdXNlIEtlcm5lbCBoYXMgbm8gbm90aW9uIG9mIHR5cGVkZWYuCiAgICAvLyBUT0RPKGVmb3J0dW5hKTogQWRkIHRlc3QgZm9yIHRoaXMuCgogICAgaWYgKHR5cGUgaXMgaXIuSW52YWxpZFR5cGUpIHsKICAgICAgLy8gVE9ETyhzcmEpOiBNYWtlIEludmFsaWRUeXBlIGNhcnJ5IGEgbWVzc2FnZS4KICAgICAgX2dlbmVyYXRlVHlwZUVycm9yKCdpbnZhbGlkIHR5cGUnLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIHBvcCgpOwogICAgICBzdGFjay5hZGQoZ3JhcGguYWRkQ29uc3RhbnRCb29sKHRydWUsIGNsb3NlZFdvcmxkKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBEYXJ0VHlwZSB0eXBlVmFsdWUgPQogICAgICAgIGxvY2Fsc0hhbmRsZXIuc3Vic3RJbkNvbnRleHQoX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUodHlwZSkpOwoKICAgIGlmICh0eXBlVmFsdWUudHJlYXRBc0R5bmFtaWMpIHsKICAgICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50Qm9vbCh0cnVlLCBjbG9zZWRXb3JsZCkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKG9wdGlvbnMuZXhwZXJpbWVudE5ld1J0aSkgewogICAgICBISW5zdHJ1Y3Rpb24gcnRpID0KICAgICAgICAgIF90eXBlQnVpbGRlci5hbmFseXplVHlwZUFyZ3VtZW50TmV3UnRpKHR5cGVWYWx1ZSwgc291cmNlRWxlbWVudCk7CiAgICAgIHB1c2goSElzVGVzdCh0eXBlVmFsdWUsIGV4cHJlc3Npb24sIHJ0aSwgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICh0eXBlVmFsdWUgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIEhJbnN0cnVjdGlvbiByZXByZXNlbnRhdGlvbiA9CiAgICAgICAgICBfdHlwZUJ1aWxkZXIuYW5hbHl6ZVR5cGVBcmd1bWVudCh0eXBlVmFsdWUsIHNvdXJjZUVsZW1lbnQpOwogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bCiAgICAgICAgZXhwcmVzc2lvbiwKICAgICAgICByZXByZXNlbnRhdGlvbiwKICAgICAgXTsKICAgICAgX3B1c2hTdGF0aWNJbnZvY2F0aW9uKF9jb21tb25FbGVtZW50cy5mdW5jdGlvblR5cGVUZXN0LCBpbnB1dHMsCiAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSwgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgSEluc3RydWN0aW9uIGNhbGwgPSBwb3AoKTsKICAgICAgcHVzaChuZXcgSElzLmNvbXBvdW5kKHR5cGVWYWx1ZSwgZXhwcmVzc2lvbiwgY2FsbCwKICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlLCBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHR5cGVWYWx1ZSBpcyBGdXR1cmVPclR5cGUpIHsKICAgICAgSEluc3RydWN0aW9uIHJlcHJlc2VudGF0aW9uID0KICAgICAgICAgIF90eXBlQnVpbGRlci5hbmFseXplVHlwZUFyZ3VtZW50KHR5cGVWYWx1ZSwgc291cmNlRWxlbWVudCk7CiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSA8SEluc3RydWN0aW9uPlsKICAgICAgICBleHByZXNzaW9uLAogICAgICAgIHJlcHJlc2VudGF0aW9uLAogICAgICBdOwogICAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oX2NvbW1vbkVsZW1lbnRzLmZ1dHVyZU9yVGVzdCwgaW5wdXRzLAogICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIEhJbnN0cnVjdGlvbiBjYWxsID0gcG9wKCk7CiAgICAgIHB1c2gobmV3IEhJcy5jb21wb3VuZCh0eXBlVmFsdWUsIGV4cHJlc3Npb24sIGNhbGwsCiAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICh0eXBlVmFsdWUgaXMgVHlwZVZhcmlhYmxlVHlwZSkgewogICAgICBISW5zdHJ1Y3Rpb24gcnVudGltZVR5cGUgPQogICAgICAgICAgX3R5cGVCdWlsZGVyLmFkZFR5cGVWYXJpYWJsZVJlZmVyZW5jZSh0eXBlVmFsdWUsIHNvdXJjZUVsZW1lbnQpOwogICAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuY2hlY2tTdWJ0eXBlT2ZSdW50aW1lVHlwZSwKICAgICAgICAgIDxISW5zdHJ1Y3Rpb24+W2V4cHJlc3Npb24sIHJ1bnRpbWVUeXBlXSwKICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlLAogICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgcHVzaChuZXcgSElzLnZhcmlhYmxlKHR5cGVWYWx1ZSwgZXhwcmVzc2lvbiwgcG9wKCksCiAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICh0eXBlVmFsdWUgaXMgSW50ZXJmYWNlVHlwZSAmJiAhX2Nhbklnbm9yZVR5cGVBcmd1bWVudHModHlwZVZhbHVlKSkgewogICAgICBISW5zdHJ1Y3Rpb24gcmVwcmVzZW50YXRpb25zID0gX3R5cGVCdWlsZGVyCiAgICAgICAgICAuYnVpbGRUeXBlQXJndW1lbnRSZXByZXNlbnRhdGlvbnModHlwZVZhbHVlLCBzb3VyY2VFbGVtZW50KTsKICAgICAgYWRkKHJlcHJlc2VudGF0aW9ucyk7CiAgICAgIENsYXNzRW50aXR5IGVsZW1lbnQgPSB0eXBlVmFsdWUuZWxlbWVudDsKICAgICAganMuTmFtZSBvcGVyYXRvciA9IF9uYW1lci5vcGVyYXRvcklzKGVsZW1lbnQpOwogICAgICBISW5zdHJ1Y3Rpb24gaXNGaWVsZE5hbWUgPQogICAgICAgICAgZ3JhcGguYWRkQ29uc3RhbnRTdHJpbmdGcm9tTmFtZShvcGVyYXRvciwgY2xvc2VkV29ybGQpOwogICAgICBISW5zdHJ1Y3Rpb24gYXNGaWVsZE5hbWUgPQogICAgICAgICAgY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaGFzQW55U3RyaWN0U3VidHlwZShlbGVtZW50KSB8fAogICAgICAgICAgICAgICAgICBjbG9zZWRXb3JsZC5uYXRpdmVEYXRhLmlzSnNJbnRlcm9wQ2xhc3MoZWxlbWVudCkKICAgICAgICAgICAgICA/IGdyYXBoLmFkZENvbnN0YW50U3RyaW5nRnJvbU5hbWUoCiAgICAgICAgICAgICAgICAgIF9uYW1lci5zdWJzdGl0dXRpb25OYW1lKGVsZW1lbnQpLCBjbG9zZWRXb3JsZCkKICAgICAgICAgICAgICA6IGdyYXBoLmFkZENvbnN0YW50TnVsbChjbG9zZWRXb3JsZCk7CiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSA8SEluc3RydWN0aW9uPlsKICAgICAgICBleHByZXNzaW9uLAogICAgICAgIGlzRmllbGROYW1lLAogICAgICAgIHJlcHJlc2VudGF0aW9ucywKICAgICAgICBhc0ZpZWxkTmFtZQogICAgICBdOwogICAgICBfcHVzaFN0YXRpY0ludm9jYXRpb24oX2NvbW1vbkVsZW1lbnRzLmNoZWNrU3VidHlwZSwgaW5wdXRzLAogICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIHB1c2gobmV3IEhJcy5jb21wb3VuZCh0eXBlVmFsdWUsIGV4cHJlc3Npb24sIHBvcCgpLAogICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUsIHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoX2hhc0RpcmVjdENoZWNrRm9yKHR5cGVWYWx1ZSkpIHsKICAgICAgcHVzaChuZXcgSElzLmRpcmVjdCh0eXBlVmFsdWUsIGV4cHJlc3Npb24sIF9hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gVGhlIGludGVyY2VwdG9yIGlzIG5vdCBhbHdheXMgbmVlZGVkLiAgSXQgaXMgcmVtb3ZlZCBieSBvcHRpbWl6YXRpb24KICAgIC8vIHdoZW4gdGhlIHJlY2VpdmVyIHR5cGUgb3IgdGVzdGVkIHR5cGUgcGVybWl0LgogICAgcHVzaChuZXcgSElzLnJhdygKICAgICAgICB0eXBlVmFsdWUsCiAgICAgICAgZXhwcmVzc2lvbiwKICAgICAgICBfaW50ZXJjZXB0b3JGb3IoZXhwcmVzc2lvbiwgc291cmNlSW5mb3JtYXRpb24pLAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICByZXR1cm47CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNoZWNraW5nIG9mIFt0eXBlXSBpcyBwZXJmb3JtZWQgZGlyZWN0bHkgb24gdGhlCiAgLy8vIG9iamVjdCBhbmQgbm90IG9uIGFuIGludGVyY2VwdG9yLgogIGJvb2wgX2hhc0RpcmVjdENoZWNrRm9yKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICghdHlwZS5pc0ludGVyZmFjZVR5cGUpIHJldHVybiBmYWxzZTsKICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IHR5cGU7CiAgICBDbGFzc0VudGl0eSBlbGVtZW50ID0gaW50ZXJmYWNlVHlwZS5lbGVtZW50OwogICAgcmV0dXJuIGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLnN0cmluZ0NsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuYm9vbENsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMubnVtQ2xhc3MgfHwKICAgICAgICBlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5pbnRDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLmRvdWJsZUNsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuanNNdXRhYmxlQXJyYXlDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLmpzRXh0ZW5kYWJsZUFycmF5Q2xhc3MgfHwKICAgICAgICBlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5qc0ZpeGVkQXJyYXlDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLmpzVW5tb2RpZmlhYmxlQXJyYXlDbGFzczsKICB9CgogIC8vLyBXaGV0aGVyIGFuIGlzLWNoZWNrIGZvciBbdHlwZV0gY2FuIGJlIGRvbmUgaWdub3JpbmcgdHlwZS1hcmd1bWVudHMuCiAgLy8vIFRoaXMgd2lsbCBiZSB0cnVlIGlmIFt0eXBlXSBpcyByYXcsIG9yIGFsbCBpdHMgdHlwZS1hcmd1bWVudHMgbWF0Y2ggdGhlCiAgLy8vIHR5cGUtcGFyYW1ldGVyIGJvdW5kcy4KICBib29sIF9jYW5JZ25vcmVUeXBlQXJndW1lbnRzKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUodHlwZS5lbGVtZW50KTsKICAgIExpc3Q8RGFydFR5cGU+IGJvdW5kcyA9IHRoaXNUeXBlLnR5cGVBcmd1bWVudHM7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGJvdW5kcy5sZW5ndGg7IGkrKykgewogICAgICBEYXJ0VHlwZSBhcmcgPSB0eXBlLnR5cGVBcmd1bWVudHNbaV07CiAgICAgIGlmIChhcmcudHJlYXRBc0R5bmFtaWMpIGNvbnRpbnVlOwogICAgICBUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZSA9IGJvdW5kc1tpXTsKICAgICAgRGFydFR5cGUgYm91bmQgPQogICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRUeXBlVmFyaWFibGVCb3VuZCh0eXBlVmFyaWFibGUuZWxlbWVudCk7CiAgICAgIGlmIChib3VuZCAhPSBhcmcpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRocm93KGlyLlRocm93IG5vZGUpIHsKICAgIF92aXNpdFRocm93RXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pOwogICAgaWYgKF9pc1JlYWNoYWJsZSkgewogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkVGhyb3cobm9kZSk7CiAgICAgIF9oYW5kbGVJblRyeVN0YXRlbWVudCgpOwogICAgICBwdXNoKAogICAgICAgICAgbmV3IEhUaHJvd0V4cHJlc3Npb24oX2Fic3RyYWN0VmFsdWVEb21haW4sIHBvcCgpLCBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICBfaXNSZWFjaGFibGUgPSBmYWxzZTsKICAgIH0KICB9CgogIHZvaWQgX3Zpc2l0VGhyb3dFeHByZXNzaW9uKGlyLkV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgYm9vbCBvbGQgPSBfaW5FeHByZXNzaW9uT2ZUaHJvdzsKICAgIHRyeSB7CiAgICAgIF9pbkV4cHJlc3Npb25PZlRocm93ID0gdHJ1ZTsKICAgICAgZXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7CiAgICB9IGZpbmFsbHkgewogICAgICBfaW5FeHByZXNzaW9uT2ZUaHJvdyA9IG9sZDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRZaWVsZFN0YXRlbWVudChpci5ZaWVsZFN0YXRlbWVudCBub2RlKSB7CiAgICBub2RlLmV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwogICAgYWRkKG5ldyBIWWllbGQoX2Fic3RyYWN0VmFsdWVEb21haW4sIHBvcCgpLCBub2RlLmlzWWllbGRTdGFyLAogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRZaWVsZChub2RlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEF3YWl0RXhwcmVzc2lvbihpci5Bd2FpdEV4cHJlc3Npb24gbm9kZSkgewogICAgbm9kZS5vcGVyYW5kLmFjY2VwdCh0aGlzKTsKICAgIEhJbnN0cnVjdGlvbiBhd2FpdGVkID0gcG9wKCk7CiAgICAvLyBUT0RPKGhlcmh1dCk6IEltcHJvdmUgdGhpcyB0eXBlLgogICAgcHVzaChuZXcgSEF3YWl0KGF3YWl0ZWQsIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlKQogICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEF3YWl0KG5vZGUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRSZXRocm93KGlyLlJldGhyb3cgbm9kZSkgewogICAgSEluc3RydWN0aW9uIGV4Y2VwdGlvbiA9IF9yZXRocm93YWJsZUV4Y2VwdGlvbjsKICAgIGlmIChleGNlcHRpb24gPT0gbnVsbCkgewogICAgICBleGNlcHRpb24gPSBncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpOwogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKF9lbGVtZW50TWFwLmdldFNwYW5uYWJsZSh0YXJnZXRFbGVtZW50LCBub2RlKSwKICAgICAgICAgICdyZXRocm93YWJsZUV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIG51bGwuJyk7CiAgICB9CiAgICBfaGFuZGxlSW5UcnlTdGF0ZW1lbnQoKTsKICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgICAgICBfc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkVGhyb3cobm9kZSk7CiAgICBfY2xvc2VBbmRHb3RvRXhpdChuZXcgSFRocm93KAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLCBleGNlcHRpb24sIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgIGlzUmV0aHJvdzogdHJ1ZSkpOwogICAgLy8gaXIuUmV0aHJvdyBpcyBhbiBleHByZXNzaW9uIHNvIHdlIG5lZWQgdG8gcHVzaCBhIHZhbHVlIC0gYSBjb25zdGFudCB3aXRoCiAgICAvLyBubyB0eXBlLgogICAgc3RhY2suYWRkKGdyYXBoLmFkZENvbnN0YW50VW5yZWFjaGFibGUoY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUaGlzRXhwcmVzc2lvbihpci5UaGlzRXhwcmVzc2lvbiBub2RlKSB7CiAgICBzdGFjay5hZGQobG9jYWxzSGFuZGxlci5yZWFkVGhpcygKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZEdldChub2RlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE5vdChpci5Ob3Qgbm9kZSkgewogICAgbm9kZS5vcGVyYW5kLmFjY2VwdCh0aGlzKTsKICAgIHB1c2gobmV3IEhOb3QocG9wQm9vbGlmaWVkKCksIF9hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlKQogICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZFVuYXJ5KG5vZGUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKGlyLlN0cmluZ0NvbmNhdGVuYXRpb24gc3RyaW5nQ29uY2F0KSB7CiAgICBLZXJuZWxTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIgPSBuZXcgS2VybmVsU3RyaW5nQnVpbGRlcih0aGlzKTsKICAgIHN0cmluZ0NvbmNhdC5hY2NlcHQoc3RyaW5nQnVpbGRlcik7CiAgICBzdGFjay5hZGQoc3RyaW5nQnVpbGRlci5yZXN1bHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRyeUNhdGNoKGlyLlRyeUNhdGNoIG5vZGUpIHsKICAgIFRyeUNhdGNoRmluYWxseUJ1aWxkZXIgdHJ5QnVpbGRlciA9IG5ldyBUcnlDYXRjaEZpbmFsbHlCdWlsZGVyKAogICAgICAgIHRoaXMsIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRUcnkobm9kZSkpOwogICAgbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICAgIHRyeUJ1aWxkZXIKICAgICAgLi5jbG9zZVRyeUJvZHkoKQogICAgICAuLmJ1aWxkQ2F0Y2gobm9kZSkKICAgICAgLi5jbGVhblVwKCk7CiAgfQoKICAvLy8gYHRyeSB7IC4uLiB9IGNhdGNoIHsgLi4uIH0gZmluYWxseSB7IC4uLiB9YCBzdGF0ZW1lbnRzIGFyZSBhIGxpdHRsZSBmdW5ueQogIC8vLyBiZWNhdXNlIGEgdHJ5IGNhbiBoYXZlIG9uZSBvciBib3RoIG9mIHtjYXRjaHxmaW5hbGx5fS4gVGhlIHdheSB0aGlzIGlzCiAgLy8vIGVuY29kZWQgaW4ga2VybmVsIEFTVCBhcmUgdHdvIHNlcGFyYXRlIGNsYXNzZXMgd2l0aCBubyBjb21tb24gc3VwZXJjbGFzcwogIC8vLyBhc2lkZSBmcm9tIFN0YXRlbWVudC4gSWYgYSBzdGF0ZW1lbnQgaGFzIGJvdGggYGNhdGNoYCBhbmQgYGZpbmFsbHlgCiAgLy8vIGNsYXVzZXMgdGhlbiBpdCBpcyBlbmNvZGVkIGluIGtlcm5lbCBhcyBzbyB0aGF0IHRoZSBUcnlDYXRjaCBpcyB0aGUgYm9keQogIC8vLyBzdGF0ZW1lbnQgb2YgdGhlIFRyeUZpbmFsbHkuIFRvIHByb2R1Y2UgbW9yZSBlZmZpY2llbnQgY29kZSByYXRoZXIgdGhhbgogIC8vLyBuZXN0ZWQgdHJ5IHN0YXRlbWVudHMsIHRoZSB2aXNpdG9ycyBhdm9pZCBvbmUgcG90ZW50aWFsIGxldmVsIG9mCiAgLy8vIHJlY3Vyc2lvbi4KICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHJ5RmluYWxseShpci5UcnlGaW5hbGx5IG5vZGUpIHsKICAgIFRyeUNhdGNoRmluYWxseUJ1aWxkZXIgdHJ5QnVpbGRlciA9IG5ldyBUcnlDYXRjaEZpbmFsbHlCdWlsZGVyKAogICAgICAgIHRoaXMsIF9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRUcnkobm9kZSkpOwoKICAgIC8vIFdlIGRvIHRoZXNlIHNoZW5hbmlnYW5zIHRvIHByb2R1Y2UgYmV0dGVyIGxvb2tpbmcgY29kZSB0aGF0IGRvZXNuJ3QKICAgIC8vIGhhdmUgbmVzdGVkIHRyeSBzdGF0ZW1lbnRzLgogICAgaWYgKG5vZGUuYm9keSBpcyBpci5UcnlDYXRjaCkgewogICAgICBpci5UcnlDYXRjaCB0cnlDYXRjaCA9IG5vZGUuYm9keTsKICAgICAgdHJ5Q2F0Y2guYm9keS5hY2NlcHQodGhpcyk7CiAgICAgIHRyeUJ1aWxkZXIKICAgICAgICAuLmNsb3NlVHJ5Qm9keSgpCiAgICAgICAgLi5idWlsZENhdGNoKHRyeUNhdGNoKTsKICAgIH0gZWxzZSB7CiAgICAgIG5vZGUuYm9keS5hY2NlcHQodGhpcyk7CiAgICAgIHRyeUJ1aWxkZXIuY2xvc2VUcnlCb2R5KCk7CiAgICB9CgogICAgdHJ5QnVpbGRlcgogICAgICAuLmJ1aWxkRmluYWxseUJsb2NrKCgpIHsKICAgICAgICBub2RlLmZpbmFsaXplci5hY2NlcHQodGhpcyk7CiAgICAgIH0pCiAgICAgIC4uY2xlYW5VcCgpOwogIH0KCiAgLy8vIFRyeSB0byBpbmxpbmUgW2VsZW1lbnRdIHdpdGhpbiB0aGUgY29ycmVjdCBjb250ZXh0IG9mIHRoZSBidWlsZGVyLiBUaGUKICAvLy8gaW5zZXJ0aW9uIHBvaW50IGlzIHRoZSBzdGF0ZSBvZiB0aGUgYnVpbGRlci4KICBib29sIF90cnlJbmxpbmVNZXRob2QoCiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLAogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gcHJvdmlkZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIGlyLk5vZGUgY3VycmVudE5vZGUsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICB7SW50ZXJmYWNlVHlwZSBpbnN0YW5jZVR5cGV9KSB7CiAgICBpZiAoZnVuY3Rpb24uaXNFeHRlcm5hbCkgewogICAgICAvLyBEb24ndCBpbmxpbmUgZXh0ZXJuYWwgbWV0aG9kczsgdGhlc2Ugc2hvdWxkIGp1c3QgZmFpbCBhdCBydW50aW1lLgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKF9uYXRpdmVEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKGZ1bmN0aW9uKSAmJgogICAgICAgICEoZnVuY3Rpb24gaXMgQ29uc3RydWN0b3JFbnRpdHkgJiYgZnVuY3Rpb24uaXNGYWN0b3J5Q29uc3RydWN0b3IpKSB7CiAgICAgIC8vIFdlIG9ubHkgaW5saW5lIGZhY3RvcnkgSmF2YVNjcmlwdCBpbnRlcm9wIGNvbnN0cnVjdG9ycy4KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGJvb2wgaW5zaWRlTG9vcCA9IGxvb3BEZXB0aCA+IDAgfHwgZ3JhcGguY2FsbGVkSW5Mb29wOwoKICAgIC8vIEJhaWwgb3V0IGVhcmx5IGlmIHRoZSBpbmxpbmluZyBkZWNpc2lvbiBpcyBpbiB0aGUgY2FjaGUgYW5kIHdlIGNhbid0CiAgICAvLyBpbmxpbmUgKG5vIG5lZWQgdG8gY2hlY2sgdGhlIGhhcmQgY29uc3RyYWludHMpLgogICAgaWYgKF9pbmxpbmVDYWNoZS5tYXJrZWRBc05vSW5saW5lKGZ1bmN0aW9uKSkgcmV0dXJuIGZhbHNlOwogICAgYm9vbCBjYWNoZWRDYW5CZUlubGluZWQgPQogICAgICAgIF9pbmxpbmVDYWNoZS5jYW5JbmxpbmUoZnVuY3Rpb24sIGluc2lkZUxvb3A6IGluc2lkZUxvb3ApOwogICAgaWYgKGNhY2hlZENhbkJlSW5saW5lZCA9PSBmYWxzZSkgcmV0dXJuIGZhbHNlOwoKICAgIGJvb2wgbWVldHNIYXJkQ29uc3RyYWludHMoKSB7CiAgICAgIGlmIChvcHRpb25zLmRpc2FibGVJbmxpbmluZykgcmV0dXJuIGZhbHNlOwoKICAgICAgYXNzZXJ0KAogICAgICAgICAgc2VsZWN0b3IgIT0gbnVsbCB8fAogICAgICAgICAgICAgIGZ1bmN0aW9uLmlzU3RhdGljIHx8CiAgICAgICAgICAgICAgZnVuY3Rpb24uaXNUb3BMZXZlbCB8fAogICAgICAgICAgICAgIGZ1bmN0aW9uLmlzQ29uc3RydWN0b3IgfHwKICAgICAgICAgICAgICBmdW5jdGlvbiBpcyBDb25zdHJ1Y3RvckJvZHlFbnRpdHksCiAgICAgICAgICBmYWlsZWRBdChmdW5jdGlvbiwgIk1pc3Npbmcgc2VsZWN0b3IgZm9yIGlubGluaW5nIG9mICRmdW5jdGlvbi4iKSk7CiAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7CiAgICAgICAgaWYgKCFzZWxlY3Rvci5hcHBsaWVzKGZ1bmN0aW9uKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChtYXNrICE9IG51bGwgJiYKICAgICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgICAgICAgIC5pc1RhcmdldGluZ01lbWJlcihtYXNrLCBmdW5jdGlvbiwgc2VsZWN0b3IubWVtYmVyTmFtZSkKICAgICAgICAgICAgICAgIC5pc0RlZmluaXRlbHlGYWxzZSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKF9uYXRpdmVEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKGZ1bmN0aW9uKSkgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gRG9uJ3QgaW5saW5lIG9wZXJhdG9yPT0gbWV0aG9kcyBpZiB0aGUgcGFyYW1ldGVyIGNhbiBiZSBudWxsLgogICAgICBpZiAoZnVuY3Rpb24ubmFtZSA9PSAnPT0nKSB7CiAgICAgICAgaWYgKGZ1bmN0aW9uLmVuY2xvc2luZ0NsYXNzICE9IF9jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcyAmJgogICAgICAgICAgICBwcm92aWRlZEFyZ3VtZW50c1sxXQogICAgICAgICAgICAgICAgLmlzTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgICAgIC5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gR2VuZXJhdGl2ZSBjb25zdHJ1Y3RvcnMgb2YgbmF0aXZlIGNsYXNzZXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkKICAgICAgLy8gYW5kIGhhdmUgYW4gZXh0cmEgYXJndW1lbnQgdGhhdCBjYXVzZXMgcHJvYmxlbXMgd2l0aCBpbmxpbmluZy4KICAgICAgaWYgKGZ1bmN0aW9uIGlzIENvbnN0cnVjdG9yRW50aXR5ICYmCiAgICAgICAgICBmdW5jdGlvbi5pc0dlbmVyYXRpdmVDb25zdHJ1Y3RvciAmJgogICAgICAgICAgX25hdGl2ZURhdGEuaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3MpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvLyBBIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgYm9keSBpcyBub3Qgc2VlbiBieSBnbG9iYWwgYW5hbHlzaXMsCiAgICAgIC8vIHNvIHdlIHNob3VsZCBub3QgcXVlcnkgZm9yIGl0cyB0eXBlLgogICAgICBpZiAoZnVuY3Rpb24gaXMhIENvbnN0cnVjdG9yQm9keUVudGl0eSkgewogICAgICAgIGlmIChnbG9iYWxJbmZlcmVuY2VSZXN1bHRzLnJlc3VsdE9mTWVtYmVyKGZ1bmN0aW9uKS50aHJvd3NBbHdheXMpIHsKICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEl0IHNlZW1zIHdyb25nIHRvIHNldCBgaXNSZWFjaGFibGVgIHRvIGBmYWxzZWAKICAgICAgICAgIC8vIHNpbmNlIHdlIGFyZSBfbm90XyBnb2luZyB0byBpbmxpbmUgW2Z1bmN0aW9uXS4gVGhpcyBoYXMKICAgICAgICAgIC8vIGltcGxpY2F0aW9ucyBpbiBzd2l0Y2ggY2FzZXMgd2hlcmUgd2UgbWlnaHQgbmVlZCB0byBpbnNlcnQgYQogICAgICAgICAgLy8gYGJyZWFrYCB0aGF0IHdhcyBza2lwcGVkIGR1ZSB0byBgaXNSZWFjaGFibGVgIGJlaW5nIGBmYWxzZWAuCiAgICAgICAgICBfaXNSZWFjaGFibGUgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGJvb2wgZG9lc05vdENvbnRhaW5Db2RlKElubGluZURhdGEgaW5saW5lRGF0YSkgewogICAgICAvLyBBIGZ1bmN0aW9uIHdpdGggc2l6ZSAxIGRvZXMgbm90IGNvbnRhaW4gYW55IGNvZGUuCiAgICAgIHJldHVybiBpbmxpbmVEYXRhLmNhbkJlSW5saW5lZChtYXhJbmxpbmluZ05vZGVzOiAxKTsKICAgIH0KCiAgICBib29sIHJlZHVjdGl2ZUhldXJpc3RpYyhJbmxpbmVEYXRhIGlubGluZURhdGEpIHsKICAgICAgLy8gVGhlIGNhbGwgaXMgb24gYSBwYXRoIHdoaWNoIGlzIGV4ZWN1dGVkIHJhcmVseSwgc28gaW5saW5lIG9ubHkgaWYgaXQKICAgICAgLy8gZG9lcyBub3QgbWFrZSB0aGUgcHJvZ3JhbSBsYXJnZXIuCiAgICAgIGlmIChfaXNDYWxsZWRPbmNlKGZ1bmN0aW9uKSkgewogICAgICAgIHJldHVybiBpbmxpbmVEYXRhLmNhbkJlSW5saW5lZCgpOwogICAgICB9CiAgICAgIGlmIChpbmxpbmVEYXRhLmNhbkJlSW5saW5lZFJlZHVjdGl2ZSgKICAgICAgICAgIGFyZ3VtZW50Q291bnQ6IHByb3ZpZGVkQXJndW1lbnRzLmxlbmd0aCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZG9lc05vdENvbnRhaW5Db2RlKGlubGluZURhdGEpOwogICAgfQoKICAgIGJvb2wgaGV1cmlzdGljU2F5R29vZFRvR28oKSB7CiAgICAgIC8vIERvbid0IGlubGluZSByZWN1cnNpdmVseSwKICAgICAgaWYgKF9pbmxpbmluZ1N0YWNrLmFueSgoZW50cnkpID0+IGVudHJ5LmZ1bmN0aW9uID09IGZ1bmN0aW9uKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgLy8gRG9uJ3QgaW5saW5lIGFjcm9zcyBkZWZlcnJlZCBpbXBvcnQgdG8gcHJldmVudCBsZWFraW5nIGNvZGUuIFRoZSBvbmx5CiAgICAgIC8vIGV4Y2VwdGlvbiBpcyBhbiBlbXB0eSBmdW5jdGlvbiAod2hpY2ggZG9lcyBub3QgY29udGFpbiBjb2RlKS4KICAgICAgYm9vbCBoYXNPbmx5Tm9uRGVmZXJyZWRJbXBvcnRQYXRocyA9IGNsb3NlZFdvcmxkLm91dHB1dFVuaXREYXRhCiAgICAgICAgICAuaGFzT25seU5vbkRlZmVycmVkSW1wb3J0UGF0aHMoX2luaXRpYWxUYXJnZXRFbGVtZW50LCBmdW5jdGlvbik7CgogICAgICBJbmxpbmVEYXRhIGlubGluZURhdGEgPQogICAgICAgICAgX2lubGluZURhdGFDYWNoZS5nZXRJbmxpbmVEYXRhKF9lbGVtZW50TWFwLCBmdW5jdGlvbik7CgogICAgICBpZiAoIWhhc09ubHlOb25EZWZlcnJlZEltcG9ydFBhdGhzKSB7CiAgICAgICAgcmV0dXJuIGRvZXNOb3RDb250YWluQ29kZShpbmxpbmVEYXRhKTsKICAgICAgfQoKICAgICAgLy8gRG8gbm90IGlubGluZSBjb2RlIHRoYXQgaXMgcmFyZWx5IGV4ZWN1dGVkIHVubGVzcyBpdCByZWR1Y2VzIHNpemUuCiAgICAgIGlmIChfaW5FeHByZXNzaW9uT2ZUaHJvdyB8fCBfaW5MYXp5SW5pdGlhbGl6ZXJFeHByZXNzaW9uKSB7CiAgICAgICAgcmV0dXJuIHJlZHVjdGl2ZUhldXJpc3RpYyhpbmxpbmVEYXRhKTsKICAgICAgfQoKICAgICAgaWYgKGNhY2hlZENhbkJlSW5saW5lZCA9PSB0cnVlKSB7CiAgICAgICAgLy8gV2UgbWF5IGhhdmUgZm9yY2VkIHRoZSBpbmxpbmluZyBvZiBzb21lIG1ldGhvZHMuIFRoZXJlZm9yZSBjaGVjawogICAgICAgIC8vIGlmIHdlIGNhbiBpbmxpbmUgdGhpcyBtZXRob2QgcmVnYXJkbGVzcyBvZiBzaXplLgogICAgICAgIFN0cmluZyByZWFzb247CiAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICAocmVhc29uID0gaW5saW5lRGF0YS5jYW5ub3RCZUlubGluZWRSZWFzb24oYWxsb3dMb29wczogdHJ1ZSkpID09CiAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICBmYWlsZWRBdChmdW5jdGlvbiwgIkNhbm5vdCBpbmxpbmUgJGZ1bmN0aW9uOiAkcmVhc29uIikpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICBpbnQgbnVtUGFyYW1ldGVycyA9IGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZS50b3RhbFBhcmFtZXRlcnM7CiAgICAgIGludCBtYXhJbmxpbmluZ05vZGVzOwogICAgICBpZiAoaW5zaWRlTG9vcCkgewogICAgICAgIG1heElubGluaW5nTm9kZXMgPSBJbmxpbmVXZWVkZXIuSU5MSU5JTkdfTk9ERVNfSU5TSURFX0xPT1AgKwogICAgICAgICAgICBJbmxpbmVXZWVkZXIuSU5MSU5JTkdfTk9ERVNfSU5TSURFX0xPT1BfQVJHX0ZBQ1RPUiAqIG51bVBhcmFtZXRlcnM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWF4SW5saW5pbmdOb2RlcyA9IElubGluZVdlZWRlci5JTkxJTklOR19OT0RFU19PVVRTSURFX0xPT1AgKwogICAgICAgICAgICBJbmxpbmVXZWVkZXIuSU5MSU5JTkdfTk9ERVNfT1VUU0lERV9MT09QX0FSR19GQUNUT1IgKiBudW1QYXJhbWV0ZXJzOwogICAgICB9CgogICAgICBib29sIG1hcmtlZFRyeUlubGluZSA9IF9pbmxpbmVDYWNoZS5tYXJrZWRBc1RyeUlubGluZShmdW5jdGlvbik7CiAgICAgIGJvb2wgY2FsbGVkT25jZSA9IF9pc0NhbGxlZE9uY2UoZnVuY3Rpb24pOwogICAgICAvLyBJZiBhIG1ldGhvZCBpcyBjYWxsZWQgb25seSBvbmNlLCBhbmQgYWxsIHRoZSBtZXRob2RzIGluIHRoZSBpbmxpbmluZwogICAgICAvLyBzdGFjayBhcmUgY2FsbGVkIG9ubHkgb25jZSBhcyB3ZWxsLCB3ZSBrbm93IHdlIHdpbGwgc2F2ZSBvbiBvdXRwdXQgc2l6ZQogICAgICAvLyBieSBpbmxpbmluZyB0aGlzIG1ldGhvZC4KICAgICAgaWYgKG1hcmtlZFRyeUlubGluZSB8fCBjYWxsZWRPbmNlKSB7CiAgICAgICAgbWF4SW5saW5pbmdOb2RlcyA9IG51bGw7CiAgICAgIH0KICAgICAgYm9vbCBhbGxvd0xvb3BzID0gZmFsc2U7CiAgICAgIGlmIChtYXJrZWRUcnlJbmxpbmUpIHsKICAgICAgICBhbGxvd0xvb3BzID0gdHJ1ZTsKICAgICAgfQoKICAgICAgYm9vbCBjYW5JbmxpbmUgPSBpbmxpbmVEYXRhLmNhbkJlSW5saW5lZCgKICAgICAgICAgIG1heElubGluaW5nTm9kZXM6IG1heElubGluaW5nTm9kZXMsIGFsbG93TG9vcHM6IGFsbG93TG9vcHMpOwogICAgICBpZiAobWFya2VkVHJ5SW5saW5lKSB7CiAgICAgICAgaWYgKGNhbklubGluZSkgewogICAgICAgICAgX2lubGluZUNhY2hlLm1hcmtBc0lubGluYWJsZShmdW5jdGlvbiwgaW5zaWRlTG9vcDogdHJ1ZSk7CiAgICAgICAgICBfaW5saW5lQ2FjaGUubWFya0FzSW5saW5hYmxlKGZ1bmN0aW9uLCBpbnNpZGVMb29wOiBmYWxzZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9pbmxpbmVDYWNoZS5tYXJrQXNOb25JbmxpbmFibGUoZnVuY3Rpb24sIGluc2lkZUxvb3A6IHRydWUpOwogICAgICAgICAgX2lubGluZUNhY2hlLm1hcmtBc05vbklubGluYWJsZShmdW5jdGlvbiwgaW5zaWRlTG9vcDogZmFsc2UpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjYWxsZWRPbmNlKSB7CiAgICAgICAgLy8gVE9ETygzNDIwMyk6IFdlIGNhbid0IHVwZGF0ZSB0aGUgZGVjaXNpb24gZHVlIHRvIGltcHJlY2lzaW9uIGluIHRoZQogICAgICAgIC8vIGNhbGxlZE9uY2UgZGF0YSwgZGVzY3JpYmVkIGluIElzc3VlIDM0MjAzLgogICAgICB9IGVsc2UgewogICAgICAgIGlmIChjYW5JbmxpbmUpIHsKICAgICAgICAgIF9pbmxpbmVDYWNoZS5tYXJrQXNJbmxpbmFibGUoZnVuY3Rpb24sIGluc2lkZUxvb3A6IGluc2lkZUxvb3ApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoX2lzRnVuY3Rpb25DYWxsZWRPbmNlKGZ1bmN0aW9uKSkgewogICAgICAgICAgICAvLyBUT0RPKDM0MjAzKTogV2UgY2FuJ3QgdXBkYXRlIHRoZSBkZWNpc2lvbiBkdWUgdG8gaW1wcmVjaXNpb24gaW4KICAgICAgICAgICAgLy8gdGhlIGNhbGxlZE9uY2UgZGF0YSwgZGVzY3JpYmVkIGluIElzc3VlIDM0MjAzLgogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX2lubGluZUNhY2hlLm1hcmtBc05vbklubGluYWJsZShmdW5jdGlvbiwgaW5zaWRlTG9vcDogaW5zaWRlTG9vcCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjYW5JbmxpbmU7CiAgICB9CgogICAgdm9pZCBkb0lubGluaW5nKCkgewogICAgICBpZiAoZnVuY3Rpb24uaXNDb25zdHJ1Y3RvcikgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKAogICAgICAgICAgICBuZXcgU3RhdGljVXNlLmNvbnN0cnVjdG9ySW5saW5pbmcoZnVuY3Rpb24sIGluc3RhbmNlVHlwZSkpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChpbnN0YW5jZVR5cGUgPT0gbnVsbCwKICAgICAgICAgICAgIlVuZXhwZWN0ZWQgaW5zdGFuY2UgdHlwZSBmb3IgJGZ1bmN0aW9uOiAkaW5zdGFuY2VUeXBlIik7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UoCiAgICAgICAgICAgIG5ldyBTdGF0aWNVc2UubWV0aG9kSW5saW5pbmcoZnVuY3Rpb24sIHR5cGVBcmd1bWVudHMpKTsKICAgICAgfQoKICAgICAgLy8gQWRkIGFuIGV4cGxpY2l0IG51bGwgY2hlY2sgb24gdGhlIHJlY2VpdmVyIGJlZm9yZSBkb2luZyB0aGUKICAgICAgLy8gaW5saW5pbmcuIFdlIHVzZSBbZWxlbWVudF0gdG8gZ2V0IHRoZSBzYW1lIG5hbWUgaW4gdGhlCiAgICAgIC8vIE5vU3VjaE1ldGhvZEVycm9yIG1lc3NhZ2UgYXMgaWYgd2UgaGFkIGNhbGxlZCBpdC4KICAgICAgaWYgKGZ1bmN0aW9uLmlzSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICAgIGZ1bmN0aW9uIGlzISBDb25zdHJ1Y3RvckJvZHlFbnRpdHkgJiYKICAgICAgICAgIChtYXNrID09IG51bGwgfHwKICAgICAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc051bGwobWFzaykuaXNQb3RlbnRpYWxseVRydWUpKSB7CiAgICAgICAgYWRkKG5ldyBIRmllbGRHZXQobnVsbCwgcHJvdmlkZWRBcmd1bWVudHNbMF0sCiAgICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLCBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgICAgaXNBc3NpZ25hYmxlOiBmYWxzZSkpOwogICAgICB9CiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBjb21waWxlZEFyZ3VtZW50cyA9IF9jb21wbGV0ZUNhbGxBcmd1bWVudHNMaXN0KAogICAgICAgICAgZnVuY3Rpb24sIHNlbGVjdG9yLCBwcm92aWRlZEFyZ3VtZW50cywgY3VycmVudE5vZGUpOwogICAgICBfZW50ZXJJbmxpbmVkTWV0aG9kKGZ1bmN0aW9uLCBjb21waWxlZEFyZ3VtZW50cywgaW5zdGFuY2VUeXBlKTsKICAgICAgX2lubGluZWRGcm9tKGZ1bmN0aW9uLCBzb3VyY2VJbmZvcm1hdGlvbiwgKCkgewogICAgICAgIGlmICghX2lzUmVhY2hhYmxlKSB7CiAgICAgICAgICBfZW1pdFJldHVybihncmFwaC5hZGRDb25zdGFudE51bGwoY2xvc2VkV29ybGQpLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9kb0lubGluZShmdW5jdGlvbik7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgX2xlYXZlSW5saW5lZE1ldGhvZCgpOwogICAgfQoKICAgIGlmIChtZWV0c0hhcmRDb25zdHJhaW50cygpICYmIGhldXJpc3RpY1NheUdvb2RUb0dvKCkpIHsKICAgICAgZG9JbmxpbmluZygpOwogICAgICBfaW5mb1JlcG9ydGVyPy5yZXBvcnRJbmxpbmVkKAogICAgICAgICAgZnVuY3Rpb24sCiAgICAgICAgICBfaW5saW5pbmdTdGFjay5pc0VtcHR5CiAgICAgICAgICAgICAgPyB0YXJnZXRFbGVtZW50CiAgICAgICAgICAgICAgOiBfaW5saW5pbmdTdGFjay5sYXN0LmZ1bmN0aW9uKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIFJldHVybnMgYSBjb21wbGV0ZSBhcmd1bWVudCBsaXN0IGZvciBhIGNhbGwgb2YgW2Z1bmN0aW9uXS4KICBMaXN0PEhJbnN0cnVjdGlvbj4gX2NvbXBsZXRlQ2FsbEFyZ3VtZW50c0xpc3QoCiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLAogICAgICBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IHByb3ZpZGVkQXJndW1lbnRzLAogICAgICBpci5Ob2RlIGN1cnJlbnROb2RlKSB7CiAgICBhc3NlcnQocHJvdmlkZWRBcmd1bWVudHMgIT0gbnVsbCk7CgogICAgYm9vbCBpc0luc3RhbmNlTWVtYmVyID0gZnVuY3Rpb24uaXNJbnN0YW5jZU1lbWJlcjsKICAgIC8vIEZvciBzdGF0aWMgY2FsbHMsIFtwcm92aWRlZEFyZ3VtZW50c10gaXMgY29tcGxldGUsIGRlZmF1bHQgYXJndW1lbnRzCiAgICAvLyBoYXZlIGJlZW4gaW5jbHVkZWQgaWYgbmVjZXNzYXJ5LCBzZWUgW21ha2VTdGF0aWNBcmd1bWVudExpc3RdLgogICAgaWYgKCFpc0luc3RhbmNlTWVtYmVyIHx8CiAgICAgICAgY3VycmVudE5vZGUgPT0gbnVsbCB8fCAvLyBJbiBlcnJvbmVvdXMgY29kZSwgY3VycmVudE5vZGUgY2FuIGJlIG51bGwuCiAgICAgICAgX3Byb3ZpZGVkQXJndW1lbnRzS25vd25Ub0JlQ29tcGxldGUoY3VycmVudE5vZGUpIHx8CiAgICAgICAgZnVuY3Rpb24gaXMgQ29uc3RydWN0b3JCb2R5RW50aXR5IHx8CiAgICAgICAgc2VsZWN0b3IuaXNHZXR0ZXIpIHsKICAgICAgLy8gRm9yIHRoZXNlIGNhc2VzLCB0aGUgcHJvdmlkZWQgYXJndW1lbnQgbGlzdCBpcyBrbm93biB0byBiZSBjb21wbGV0ZS4KICAgICAgcmV0dXJuIHByb3ZpZGVkQXJndW1lbnRzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9jb21wbGV0ZUR5bmFtaWNDYWxsQXJndW1lbnRzTGlzdCgKICAgICAgICAgIHNlbGVjdG9yLCBmdW5jdGlvbiwgcHJvdmlkZWRBcmd1bWVudHMpOwogICAgfQogIH0KCiAgLy8vIFJldHVybnMgYSBjb21wbGV0ZSBhcmd1bWVudCBsaXN0IGZvciBhIGR5bmFtaWMgY2FsbCBvZiBbZnVuY3Rpb25dLiBUaGUKICAvLy8gaW5pdGlhbCBhcmd1bWVudCBsaXN0IFtwcm92aWRlZEFyZ3VtZW50c10sIGNyZWF0ZWQgYnkKICAvLy8gW2FkZER5bmFtaWNTZW5kQXJndW1lbnRzVG9MaXN0XSwgZG9lcyBub3QgaW5jbHVkZSB2YWx1ZXMgZm9yIGRlZmF1bHQKICAvLy8gYXJndW1lbnRzIHVzZWQgaW4gdGhlIGNhbGwuIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgdGFyZ2V0IGZ1bmN0aW9uICh3aGljaAogIC8vLyBkZWZpbmVzIHRoZSBkZWZhdWx0cykgaXMgbm90IGtub3duLgogIC8vLwogIC8vLyBIb3dldmVyLCBpbmxpbmluZyBjYW4gb25seSBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGNhbiBiZQogIC8vLyByZXNvbHZlZCBzdGF0aWNhbGx5LiBUaGUgZGVmYXVsdHMgY2FuIHRoZXJlZm9yZSBiZSBpbmNsdWRlZCBhdCB0aGlzIHBvaW50LgogIC8vLwogIC8vLyBUaGUgW3Byb3ZpZGVkQXJndW1lbnRzXSBsaXN0IGNvbnRhaW5zIGZpcnN0IGFsbCBwb3NpdGlvbmFsIGFyZ3VtZW50cywgdGhlbgogIC8vLyB0aGUgcHJvdmlkZWQgbmFtZWQgYXJndW1lbnRzICh0aGUgbmFtZWQgYXJndW1lbnRzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlCiAgLy8vIFtzZWxlY3Rvcl0pIGluIGEgc3BlY2lmaWMgb3JkZXIgKHNlZSBbYWRkRHluYW1pY1NlbmRBcmd1bWVudHNUb0xpc3RdKS4KICBMaXN0PEhJbnN0cnVjdGlvbj4gX2NvbXBsZXRlRHluYW1pY0NhbGxBcmd1bWVudHNMaXN0KFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgTGlzdDxISW5zdHJ1Y3Rpb24+IHByb3ZpZGVkQXJndW1lbnRzKSB7CiAgICBhc3NlcnQoc2VsZWN0b3IuYXBwbGllcyhmdW5jdGlvbikpOwogICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gc2VsZWN0b3IuY2FsbFN0cnVjdHVyZTsKICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUgPSBmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmU7CiAgICBMaXN0PFN0cmluZz4gc2VsZWN0b3JBcmd1bWVudE5hbWVzID0KICAgICAgICBzZWxlY3Rvci5jYWxsU3RydWN0dXJlLmdldE9yZGVyZWROYW1lZEFyZ3VtZW50cygpOwogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGNvbXBpbGVkQXJndW1lbnRzID0gbmV3IExpc3Q8SEluc3RydWN0aW9uPigKICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmUudG90YWxQYXJhbWV0ZXJzICsKICAgICAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlLnR5cGVQYXJhbWV0ZXJzICsKICAgICAgICAgICAgMSk7IC8vIFBsdXMgb25lIGZvciByZWNlaXZlci4KCiAgICBpbnQgY29tcGlsZWRBcmd1bWVudEluZGV4ID0gMDsKCiAgICAvLyBDb3B5IHJlY2VpdmVyLgogICAgY29tcGlsZWRBcmd1bWVudHNbY29tcGlsZWRBcmd1bWVudEluZGV4KytdID0gcHJvdmlkZWRBcmd1bWVudHNbMF07CgogICAgLy8vIE9mZnNldCBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cyBpbiBbcHJvdmlkZWRBcmd1bWVudHNdLgogICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudE9mZnNldCA9IDE7CgogICAgLy8vIE9mZnNldCBvZiBuYW1lZCBhcmd1bWVudHMgaW4gW3Byb3ZpZGVkQXJndW1lbnRzXS4KICAgIGludCBuYW1lZEFyZ3VtZW50T2Zmc2V0ID0gY2FsbFN0cnVjdHVyZS5wb3NpdGlvbmFsQXJndW1lbnRDb3VudCArIDE7CgogICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudEluZGV4ID0gMDsKICAgIGludCBuYW1lZEFyZ3VtZW50SW5kZXggPSAwOwoKICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaFBhcmFtZXRlcihmdW5jdGlvbiwKICAgICAgICAoRGFydFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIENvbnN0YW50VmFsdWUgZGVmYXVsdFZhbHVlKSB7CiAgICAgIGlmIChwb3NpdGlvbmFsQXJndW1lbnRJbmRleCA8IHBhcmFtZXRlclN0cnVjdHVyZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICAgIGlmIChwb3NpdGlvbmFsQXJndW1lbnRJbmRleCA8IGNhbGxTdHJ1Y3R1cmUucG9zaXRpb25hbEFyZ3VtZW50Q291bnQpIHsKICAgICAgICAgIGNvbXBpbGVkQXJndW1lbnRzW2NvbXBpbGVkQXJndW1lbnRJbmRleCsrXSA9IHByb3ZpZGVkQXJndW1lbnRzWwogICAgICAgICAgICAgIHBvc2l0aW9uYWxBcmd1bWVudE9mZnNldCArIHBvc2l0aW9uYWxBcmd1bWVudEluZGV4KytdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhc3NlcnQoZGVmYXVsdFZhbHVlICE9IG51bGwsCiAgICAgICAgICAgICAgZmFpbGVkQXQoZnVuY3Rpb24sICdObyBjb25zdGFudCBjb21wdXRlZCBmb3IgcGFyYW1ldGVyICRuYW1lJykpOwogICAgICAgICAgY29tcGlsZWRBcmd1bWVudHNbY29tcGlsZWRBcmd1bWVudEluZGV4KytdID0KICAgICAgICAgICAgICBncmFwaC5hZGRDb25zdGFudChkZWZhdWx0VmFsdWUsIGNsb3NlZFdvcmxkKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gRXhhbXBsZToKICAgICAgICAvLyAgICAgdm9pZCBmb28oYSwge2IsIGQsIGN9KQogICAgICAgIC8vICAgICBmb28oMCwgZCA9IDEsIGIgPSAyKQogICAgICAgIC8vCiAgICAgICAgLy8gcHJvdmlkZWRBcmd1bWVudHMgPSBbMCwgMiwgMV0KICAgICAgICAvLyBzZWxlY3RvckFyZ3VtZW50TmFtZXMgPSBbYiwgZF0KICAgICAgICAvLyBwYXJhbWV0ZXJTdHJ1Y3R1cmUubmFtZWRQYXJhbWV0ZXJzID0gW2IsIGMsIGRdCiAgICAgICAgLy8KICAgICAgICAvLyBGb3IgZWFjaCBwYXJhbWV0ZXIgbmFtZSBpbiB0aGUgc2lnbmF0dXJlLCBpZiB0aGUgYXJndW1lbnQgbmFtZQogICAgICAgIC8vIG1hdGNoZXMgd2UgdXNlIHRoZSBuZXh0IHByb3ZpZGVkIGFyZ3VtZW50LCBvdGhlcndpc2Ugd2UgZ2V0IHRoZQogICAgICAgIC8vIGRlZmF1bHQuCiAgICAgICAgaWYgKG5hbWVkQXJndW1lbnRJbmRleCA8IHNlbGVjdG9yQXJndW1lbnROYW1lcy5sZW5ndGggJiYKICAgICAgICAgICAgbmFtZSA9PSBzZWxlY3RvckFyZ3VtZW50TmFtZXNbbmFtZWRBcmd1bWVudEluZGV4XSkgewogICAgICAgICAgLy8gVGhlIG5hbWVkIGFyZ3VtZW50IHdhcyBwcm92aWRlZCBpbiB0aGUgZnVuY3Rpb24gaW52b2NhdGlvbi4KICAgICAgICAgIGNvbXBpbGVkQXJndW1lbnRzW2NvbXBpbGVkQXJndW1lbnRJbmRleCsrXSA9CiAgICAgICAgICAgICAgcHJvdmlkZWRBcmd1bWVudHNbbmFtZWRBcmd1bWVudE9mZnNldCArIG5hbWVkQXJndW1lbnRJbmRleCsrXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXNzZXJ0KGRlZmF1bHRWYWx1ZSAhPSBudWxsLAogICAgICAgICAgICAgIGZhaWxlZEF0KGZ1bmN0aW9uLCAnTm8gY29uc3RhbnQgY29tcHV0ZWQgZm9yIHBhcmFtZXRlciAkbmFtZScpKTsKICAgICAgICAgIGNvbXBpbGVkQXJndW1lbnRzW2NvbXBpbGVkQXJndW1lbnRJbmRleCsrXSA9CiAgICAgICAgICAgICAgZ3JhcGguYWRkQ29uc3RhbnQoZGVmYXVsdFZhbHVlLCBjbG9zZWRXb3JsZCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIGlmIChfcnRpTmVlZC5tZXRob2ROZWVkc1R5cGVBcmd1bWVudHMoZnVuY3Rpb24pKSB7CiAgICAgIGlmIChjYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudENvdW50ID09CiAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmUudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICAvLy8gT2Zmc2V0IG9mIHR5cGUgYXJndW1lbnRzIGluIFtwcm92aWRlZEFyZ3VtZW50c10uCiAgICAgICAgaW50IHR5cGVBcmd1bWVudE9mZnNldCA9IGNhbGxTdHJ1Y3R1cmUuYXJndW1lbnRDb3VudCArIDE7CiAgICAgICAgLy8gUGFzcyBleHBsaWNpdCB0eXBlIGFyZ3VtZW50cy4KICAgICAgICBmb3IgKGludCB0eXBlQXJndW1lbnRJbmRleCA9IDA7CiAgICAgICAgICAgIHR5cGVBcmd1bWVudEluZGV4IDwgY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudDsKICAgICAgICAgICAgdHlwZUFyZ3VtZW50SW5kZXgrKykgewogICAgICAgICAgY29tcGlsZWRBcmd1bWVudHNbY29tcGlsZWRBcmd1bWVudEluZGV4KytdID0KICAgICAgICAgICAgICBwcm92aWRlZEFyZ3VtZW50c1t0eXBlQXJndW1lbnRPZmZzZXQgKyB0eXBlQXJndW1lbnRJbmRleF07CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChjYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudENvdW50ID09IDApOwogICAgICAgIC8vIFBhc3MgdHlwZSB2YXJpYWJsZSBib3VuZHMgYXMgdHlwZSBhcmd1bWVudHMuCiAgICAgICAgZm9yIChUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZQogICAgICAgICAgICBpbiBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhmdW5jdGlvbikpIHsKICAgICAgICAgIGNvbXBpbGVkQXJndW1lbnRzW2NvbXBpbGVkQXJndW1lbnRJbmRleCsrXSA9CiAgICAgICAgICAgICAgX2NvbXB1dGVUeXBlQXJndW1lbnREZWZhdWx0VmFsdWUoZnVuY3Rpb24sIHR5cGVWYXJpYWJsZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gY29tcGlsZWRBcmd1bWVudHM7CiAgfQoKICBISW5zdHJ1Y3Rpb24gX2NvbXB1dGVUeXBlQXJndW1lbnREZWZhdWx0VmFsdWUoCiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLCBUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZSkgewogICAgRGFydFR5cGUgYm91bmQgPQogICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0VHlwZVZhcmlhYmxlRGVmYXVsdFR5cGUodHlwZVZhcmlhYmxlLmVsZW1lbnQpOwogICAgaWYgKGJvdW5kLmNvbnRhaW5zVHlwZVZhcmlhYmxlcykgewogICAgICAvLyBUT0RPKDMzNDIyKTogU3VwcG9ydCB0eXBlIHZhcmlhYmxlcyBpbiBkZWZhdWx0CiAgICAgIC8vIHR5cGVzLiBUZW1wb3JhcmlseSB1c2luZyB0aGUgImFueSIgdHlwZSAoZW5jb2RlZCBhcyAtMikgdG8KICAgICAgLy8gYXZvaWQgZmFpbGluZyBvbiBib3VuZHMgY2hlY2tzLgogICAgICByZXR1cm4gZ3JhcGguYWRkQ29uc3RhbnRJbnQoLTIsIGNsb3NlZFdvcmxkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfdHlwZUJ1aWxkZXIuYW5hbHl6ZVR5cGVBcmd1bWVudChib3VuZCwgZnVuY3Rpb24pOwogICAgfQogIH0KCiAgLy8vIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYmVmb3JlIGlubGluaW5nIHRoZSBib2R5IG9mIFtmdW5jdGlvbl0gaW50byB0aGlzCiAgLy8vIFtTc2FHcmFwaEJ1aWxkZXJdLgogIHZvaWQgX2VudGVySW5saW5lZE1ldGhvZChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwKICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGNvbXBpbGVkQXJndW1lbnRzLCBJbnRlcmZhY2VUeXBlIGluc3RhbmNlVHlwZSkgewogICAgS2VybmVsSW5saW5pbmdTdGF0ZSBzdGF0ZSA9IG5ldyBLZXJuZWxJbmxpbmluZ1N0YXRlKAogICAgICAgIGZ1bmN0aW9uLAogICAgICAgIF9yZXR1cm5Mb2NhbCwKICAgICAgICBfcmV0dXJuVHlwZSwKICAgICAgICBzdGFjaywKICAgICAgICBsb2NhbHNIYW5kbGVyLAogICAgICAgIF9pblRyeVN0YXRlbWVudCwKICAgICAgICBfaXNDYWxsZWRPbmNlKGZ1bmN0aW9uKSk7CiAgICBfaW5saW5pbmdTdGFjay5hZGQoc3RhdGUpOwoKICAgIC8vIFNldHRpbmcgdXAgdGhlIHN0YXRlIG9mIHRoZSAoQVNUKSBidWlsZGVyIGlzIHBlcmZvcm1lZCBldmVuIHdoZW4gdGhlCiAgICAvLyBpbmxpbmVkIGZ1bmN0aW9uIGlzIGluIElSLCBiZWNhdXNlIHRoZSBpcklubGluZXIgdXNlcyB0aGUgW3JldHVybkVsZW1lbnRdCiAgICAvLyBvZiB0aGUgQVNUIGJ1aWxkZXIuCiAgICBfc2V0dXBTdGF0ZUZvcklubGluaW5nKGZ1bmN0aW9uLCBjb21waWxlZEFyZ3VtZW50cywgaW5zdGFuY2VUeXBlKTsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBzZXRzIHVwIHRoZSBsb2NhbCBzdGF0ZSBvZiB0aGUgYnVpbGRlciBmb3IgaW5saW5pbmcKICAvLy8gW2Z1bmN0aW9uXS4gVGhlIGFyZ3VtZW50cyBvZiB0aGUgZnVuY3Rpb24gYXJlIGluc2VydGVkIGludG8gdGhlCiAgLy8vIFtsb2NhbHNIYW5kbGVyXS4KICAvLy8KICAvLy8gV2hlbiBpbmxpbmluZyBhIGZ1bmN0aW9uLCBgcmV0dXJuYCBzdGF0ZW1lbnRzIGFyZSBub3QgZW1pdHRlZCBhcwogIC8vLyBbSFJldHVybl0gaW5zdHJ1Y3Rpb25zLiBJbnN0ZWFkLCB0aGUgdmFsdWUgb2YgYSBzeW50aGV0aWMgZWxlbWVudCBpcwogIC8vLyB1cGRhdGVkIGluIHRoZSBbbG9jYWxzSGFuZGxlcl0uIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBzdWNoIGFuIGVsZW1lbnQgYW5kCiAgLy8vIHN0b3JlcyBpdCBpbiB0aGUgW19yZXR1cm5Mb2NhbF0gZmllbGQuCiAgdm9pZCBfc2V0dXBTdGF0ZUZvcklubGluaW5nKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLAogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gY29tcGlsZWRBcmd1bWVudHMsIEludGVyZmFjZVR5cGUgaW5zdGFuY2VUeXBlKSB7CiAgICBsb2NhbHNIYW5kbGVyID0gbmV3IExvY2Fsc0hhbmRsZXIoCiAgICAgICAgdGhpcywKICAgICAgICBmdW5jdGlvbiwKICAgICAgICBmdW5jdGlvbiwKICAgICAgICBpbnN0YW5jZVR5cGUgPz8gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyVGhpc1R5cGUoZnVuY3Rpb24pLAogICAgICAgIF9uYXRpdmVEYXRhLAogICAgICAgIF9pbnRlcmNlcHRvckRhdGEpOwogICAgbG9jYWxzSGFuZGxlci5zY29wZUluZm8gPSBfY2xvc3VyZURhdGFMb29rdXAuZ2V0U2NvcGVJbmZvKGZ1bmN0aW9uKTsKCiAgICBDYXB0dXJlZFNjb3BlIHNjb3BlRGF0YSA9IF9jbG9zdXJlRGF0YUxvb2t1cC5nZXRDYXB0dXJlZFNjb3BlKGZ1bmN0aW9uKTsKICAgIGJvb2wgZm9yR2VuZXJhdGl2ZUNvbnN0cnVjdG9yQm9keSA9IGZ1bmN0aW9uIGlzIENvbnN0cnVjdG9yQm9keUVudGl0eTsKCiAgICBfcmV0dXJuTG9jYWwgPSBuZXcgU3ludGhldGljTG9jYWwoInJlc3VsdCIsIGZ1bmN0aW9uLCBmdW5jdGlvbik7CiAgICBsb2NhbHNIYW5kbGVyLnVwZGF0ZUxvY2FsKF9yZXR1cm5Mb2NhbCwgZ3JhcGguYWRkQ29uc3RhbnROdWxsKGNsb3NlZFdvcmxkKSk7CgogICAgX2luVHJ5U3RhdGVtZW50ID0gZmFsc2U7IC8vIFRPRE8obHJ5KTogd2h5PyBEb2N1bWVudC4KCiAgICBpbnQgYXJndW1lbnRJbmRleCA9IDA7CiAgICBpZiAoZnVuY3Rpb24uaXNJbnN0YW5jZU1lbWJlcikgewogICAgICBsb2NhbHNIYW5kbGVyLnVwZGF0ZUxvY2FsKGxvY2Fsc0hhbmRsZXIuc2NvcGVJbmZvLnRoaXNMb2NhbCwKICAgICAgICAgIGNvbXBpbGVkQXJndW1lbnRzW2FyZ3VtZW50SW5kZXgrK10pOwogICAgfQoKICAgIGJvb2wgaGFzQm94ID0gZmFsc2U7CiAgICBLZXJuZWxUb0xvY2Fsc01hcCBsb2NhbHNNYXAgPQogICAgICAgIGNsb3NlZFdvcmxkLmdsb2JhbExvY2Fsc01hcC5nZXRMb2NhbHNNYXAoZnVuY3Rpb24pOwogICAgZm9yRWFjaE9yZGVyZWRQYXJhbWV0ZXIoX2VsZW1lbnRNYXAsIGZ1bmN0aW9uLAogICAgICAgIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCB7Ym9vbCBpc0VsaWRlZH0pIHsKICAgICAgTG9jYWwgbG9jYWwgPSBsb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZSh2YXJpYWJsZSk7CiAgICAgIGlmIChpc0VsaWRlZCkgewogICAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwobG9jYWwsIF9kZWZhdWx0VmFsdWVGb3JQYXJhbWV0ZXIodmFyaWFibGUpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGZvckdlbmVyYXRpdmVDb25zdHJ1Y3RvckJvZHkgJiYgc2NvcGVEYXRhLmlzQm94ZWRWYXJpYWJsZShsb2NhbCkpIHsKICAgICAgICAvLyBUaGUgcGFyYW1ldGVyIHdpbGwgYmUgYSBmaWVsZCBpbiB0aGUgYm94IHBhc3NlZCBhcyB0aGUgbGFzdAogICAgICAgIC8vIHBhcmFtZXRlci4gU28gbm8gbmVlZCB0byBoYXZlIGl0LgogICAgICAgIGhhc0JveCA9IHRydWU7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIEhJbnN0cnVjdGlvbiBhcmd1bWVudCA9IGNvbXBpbGVkQXJndW1lbnRzW2FyZ3VtZW50SW5kZXgrK107CiAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwobG9jYWwsIGFyZ3VtZW50KTsKICAgIH0pOwoKICAgIGlmIChoYXNCb3gpIHsKICAgICAgSEluc3RydWN0aW9uIGJveCA9IGNvbXBpbGVkQXJndW1lbnRzW2FyZ3VtZW50SW5kZXgrK107CiAgICAgIGFzc2VydChib3ggaXMgSENyZWF0ZUJveCk7CiAgICAgIC8vIFRPRE8oc3JhKTogTWFrZSBpbmxpbmluZyBvZiBjbG9zdXJlcyB3b3JrLiBXZSBzaG91bGQgYWx3YXlzIGNhbGwKICAgICAgLy8gZW50ZXJTY29wZSwgYW5kIHBhc3MgaW4gdGhlIGlubGluZWQgJ3RoaXMnIGFzIHdlbGwgYXMgdGhlICdib3gnLgogICAgICBsb2NhbHNIYW5kbGVyLmVudGVyU2NvcGUoc2NvcGVEYXRhLCBudWxsLAogICAgICAgICAgaW5saW5lZEJveDogYm94LAogICAgICAgICAgZm9yR2VuZXJhdGl2ZUNvbnN0cnVjdG9yQm9keTogZm9yR2VuZXJhdGl2ZUNvbnN0cnVjdG9yQm9keSk7CiAgICB9CgogICAgQ2xhc3NFbnRpdHkgZW5jbG9zaW5nID0gZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3M7CiAgICBpZiAoKGZ1bmN0aW9uLmlzQ29uc3RydWN0b3IgfHwgZnVuY3Rpb24gaXMgQ29uc3RydWN0b3JCb2R5RW50aXR5KSAmJgogICAgICAgIF9ydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGVuY2xvc2luZykpIHsKICAgICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoZW5jbG9zaW5nKTsKICAgICAgdGhpc1R5cGUudHlwZUFyZ3VtZW50cy5mb3JFYWNoKChfdHlwZVZhcmlhYmxlKSB7CiAgICAgICAgVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUgPSBfdHlwZVZhcmlhYmxlOwogICAgICAgIEhJbnN0cnVjdGlvbiBhcmd1bWVudCA9IGNvbXBpbGVkQXJndW1lbnRzW2FyZ3VtZW50SW5kZXgrK107CiAgICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbCgKICAgICAgICAgICAgbG9jYWxzSGFuZGxlci5nZXRUeXBlVmFyaWFibGVBc0xvY2FsKHR5cGVWYXJpYWJsZSksIGFyZ3VtZW50KTsKICAgICAgfSk7CiAgICB9CiAgICBpZiAoX3J0aU5lZWQubWV0aG9kTmVlZHNUeXBlQXJndW1lbnRzKGZ1bmN0aW9uKSkgewogICAgICBib29sIGlubGluZVR5cGVQYXJhbWV0ZXJzID0KICAgICAgICAgIGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZS50eXBlUGFyYW1ldGVycyA9PSAwOwogICAgICBmb3IgKFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlCiAgICAgICAgICBpbiBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhmdW5jdGlvbikpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQ7CiAgICAgICAgaWYgKGlubGluZVR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAvLyBBZGQgaW5saW5lZCB0eXBlIHBhcmFtZXRlcnMuCiAgICAgICAgICBhcmd1bWVudCA9IF9jb21wdXRlVHlwZUFyZ3VtZW50RGVmYXVsdFZhbHVlKGZ1bmN0aW9uLCB0eXBlVmFyaWFibGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhcmd1bWVudCA9IGNvbXBpbGVkQXJndW1lbnRzW2FyZ3VtZW50SW5kZXgrK107CiAgICAgICAgfQogICAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwoCiAgICAgICAgICAgIGxvY2Fsc0hhbmRsZXIuZ2V0VHlwZVZhcmlhYmxlQXNMb2NhbCh0eXBlVmFyaWFibGUpLCBhcmd1bWVudCk7CiAgICAgIH0KICAgIH0KICAgIGFzc2VydCgKICAgICAgICBhcmd1bWVudEluZGV4ID09IGNvbXBpbGVkQXJndW1lbnRzLmxlbmd0aCB8fAogICAgICAgICAgICAhX3J0aU5lZWQubWV0aG9kTmVlZHNUeXBlQXJndW1lbnRzKGZ1bmN0aW9uKSAmJgogICAgICAgICAgICAgICAgY29tcGlsZWRBcmd1bWVudHMubGVuZ3RoIC0gYXJndW1lbnRJbmRleCA9PQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZS50eXBlUGFyYW1ldGVycywKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgZnVuY3Rpb24sCiAgICAgICAgICAgICJPbmx5ICR7YXJndW1lbnRJbmRleH0gb2YgJHtjb21waWxlZEFyZ3VtZW50cy5sZW5ndGh9ICIKICAgICAgICAgICAgImFyZ3VtZW50cyBoYXZlIGJlZW4gcmVhZCBmcm9tOiAke2NvbXBpbGVkQXJndW1lbnRzfSBwYXNzZWQgdG8gIgogICAgICAgICAgICAiJGZ1bmN0aW9uLiIpKTsKCiAgICBfcmV0dXJuVHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKGZ1bmN0aW9uKS5yZXR1cm5UeXBlOwogICAgc3RhY2sgPSA8SEluc3RydWN0aW9uPltdOwoKICAgIF9pbnNlcnRDb3ZlcmFnZUNhbGwoZnVuY3Rpb24pOwogIH0KCiAgdm9pZCBfbGVhdmVJbmxpbmVkTWV0aG9kKCkgewogICAgSEluc3RydWN0aW9uIHJlc3VsdCA9IGxvY2Fsc0hhbmRsZXIucmVhZExvY2FsKF9yZXR1cm5Mb2NhbCk7CiAgICBLZXJuZWxJbmxpbmluZ1N0YXRlIHN0YXRlID0gX2lubGluaW5nU3RhY2sucmVtb3ZlTGFzdCgpOwogICAgX3Jlc3RvcmVTdGF0ZShzdGF0ZSk7CiAgICBzdGFjay5hZGQocmVzdWx0KTsKICB9CgogIHZvaWQgX3Jlc3RvcmVTdGF0ZShLZXJuZWxJbmxpbmluZ1N0YXRlIHN0YXRlKSB7CiAgICBsb2NhbHNIYW5kbGVyID0gc3RhdGUub2xkTG9jYWxzSGFuZGxlcjsKICAgIF9yZXR1cm5Mb2NhbCA9IHN0YXRlLm9sZFJldHVybkxvY2FsOwogICAgX2luVHJ5U3RhdGVtZW50ID0gc3RhdGUuaW5UcnlTdGF0ZW1lbnQ7CiAgICBfcmV0dXJuVHlwZSA9IHN0YXRlLm9sZFJldHVyblR5cGU7CiAgICBhc3NlcnQoc3RhY2suaXNFbXB0eSk7CiAgICBzdGFjayA9IHN0YXRlLm9sZFN0YWNrOwogIH0KCiAgYm9vbCBfcHJvdmlkZWRBcmd1bWVudHNLbm93blRvQmVDb21wbGV0ZShpci5Ob2RlIGN1cnJlbnROb2RlKSB7CiAgICAvKiBXaGVuIGlubGluaW5nIHRoZSBpdGVyYXRvciBtZXRob2RzIGdlbmVyYXRlZCBmb3IgYSBmb3ItaW4gbG9vcCwgdGhlCiAgICAgKiBbY3VycmVudE5vZGVdIGlzIHRoZSBbRm9ySW5dIHRyZWUuIFRoZSBjb21waWxlci1nZW5lcmF0ZWQgaXRlcmF0b3IKICAgICAqIGludm9jYXRpb25zIGFyZSBrbm93biB0byBoYXZlIGZ1bGx5IHNwZWNpZmllZCBhcmd1bWVudCBsaXN0cywgbm8gZGVmYXVsdAogICAgICogYXJndW1lbnRzIGFyZSB1c2VkLiBTZWUgaW52b2NhdGlvbnMgb2YgW3B1c2hJbnZva2VEeW5hbWljXSBpbgogICAgICogW3Zpc2l0Rm9ySW5dLgogICAgICovCiAgICAvLyBUT0RPKHJlZGVtcHRpb24pOiBJcyB0aGlzIHZhbGlkIGhlcmU/CiAgICByZXR1cm4gY3VycmVudE5vZGUgaXMgaXIuRm9ySW5TdGF0ZW1lbnQ7CiAgfQoKICB2b2lkIF9lbWl0UmV0dXJuKEhJbnN0cnVjdGlvbiB2YWx1ZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIGlmIChfaW5saW5pbmdTdGFjay5pc0VtcHR5KSB7CiAgICAgIF9jbG9zZUFuZEdvdG9FeGl0KAogICAgICAgICAgbmV3IEhSZXR1cm4oX2Fic3RyYWN0VmFsdWVEb21haW4sIHZhbHVlLCBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfSBlbHNlIHsKICAgICAgbG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbChfcmV0dXJuTG9jYWwsIHZhbHVlKTsKICAgIH0KICB9CgogIHZvaWQgX2RvSW5saW5lKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKSB7CiAgICBfdmlzaXRJbmxpbmVkRnVuY3Rpb24oZnVuY3Rpb24pOwogIH0KCiAgLy8vIFJ1biB0aGlzIGJ1aWxkZXIgb24gdGhlIGJvZHkgb2YgdGhlIFtmdW5jdGlvbl0gdG8gYmUgaW5saW5lZC4KICB2b2lkIF92aXNpdElubGluZWRGdW5jdGlvbihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgX3BvdGVudGlhbGx5Q2hlY2tJbmxpbmVkUGFyYW1ldGVyVHlwZXMoZnVuY3Rpb24pOwoKICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9IF9lbGVtZW50TWFwLmdldE1lbWJlckRlZmluaXRpb24oZnVuY3Rpb24pOwogICAgc3dpdGNoIChkZWZpbml0aW9uLmtpbmQpIHsKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yOgogICAgICAgIF9idWlsZENvbnN0cnVjdG9yKGZ1bmN0aW9uLCBkZWZpbml0aW9uLm5vZGUpOwogICAgICAgIHJldHVybjsKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keToKICAgICAgICBpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5LmFjY2VwdCh0aGlzKTsKICAgICAgICByZXR1cm47CiAgICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICAgIGlyLk5vZGUgbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICBpZiAobm9kZSBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICAgICAgbm9kZS5mdW5jdGlvbi5ib2R5LmFjY2VwdCh0aGlzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgICAgICBub2RlLmZ1bmN0aW9uLmJvZHkuYWNjZXB0KHRoaXMpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNsb3N1cmVDYWxsOgogICAgICAgIGlyLkxvY2FsRnVuY3Rpb24gbm9kZSA9IGRlZmluaXRpb24ubm9kZTsKICAgICAgICBub2RlLmZ1bmN0aW9uLmJvZHkuYWNjZXB0KHRoaXMpOwogICAgICAgIHJldHVybjsKICAgICAgZGVmYXVsdDoKICAgICAgICBicmVhazsKICAgIH0KICAgIGZhaWxlZEF0KGZ1bmN0aW9uLCAiVW5leHBlY3RlZCBpbmxpbmVkIGZ1bmN0aW9uOiAkZGVmaW5pdGlvbiIpOwogIH0KCiAgLy8vIEdlbmVyYXRlcyB0eXBlIHRlc3RzIGZvciB0aGUgcGFyYW1ldGVycyBvZiB0aGUgaW5saW5lZCBmdW5jdGlvbi4KICB2b2lkIF9wb3RlbnRpYWxseUNoZWNrSW5saW5lZFBhcmFtZXRlclR5cGVzKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKSB7CiAgICAvLyBUT0RPKHNyYSk6IEluY29ycG9yYXRlIHByb3BlcnRpZXMgb2YgY2FsbCBzaXRlIHRvIGhlbHAgZGV0ZXJtaW5lIHdoaWNoCiAgICAvLyB0eXBlIHBhcmFtZXRlcnMgYW5kIHZhbHVlIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBjaGVja2VkLgogICAgYm9vbCB0cnVzdGVkID0gZmFsc2U7CiAgICBpZiAoZnVuY3Rpb24uaXNTdGF0aWMgfHwKICAgICAgICBmdW5jdGlvbi5pc1RvcExldmVsIHx8CiAgICAgICAgZnVuY3Rpb24uaXNDb25zdHJ1Y3RvciB8fAogICAgICAgIGZ1bmN0aW9uIGlzIENvbnN0cnVjdG9yQm9keUVudGl0eSkgewogICAgICAvLyBXZSBpbmxpbmUgc3RhdGljIG1ldGhvZHMsIHRvcC1sZXZlbCBtZXRob2RzLCBjb25zdHJ1Y3RvcnMgYW5kCiAgICAgIC8vIGNvbnN0cnVjdG9yIGJvZGllcyBvbmx5IGZyb20gZGlyZWN0IGNhbGwgc2l0ZXMuCiAgICAgIHRydXN0ZWQgPSB0cnVlOwogICAgfQoKICAgIGlmICghdHJ1c3RlZCkgewogICAgICBfY2hlY2tUeXBlVmFyaWFibGVCb3VuZHMoZnVuY3Rpb24pOwogICAgfQoKICAgIEtlcm5lbFRvTG9jYWxzTWFwIGxvY2Fsc01hcCA9CiAgICAgICAgY2xvc2VkV29ybGQuZ2xvYmFsTG9jYWxzTWFwLmdldExvY2Fsc01hcChmdW5jdGlvbik7CiAgICBmb3JFYWNoT3JkZXJlZFBhcmFtZXRlcihfZWxlbWVudE1hcCwgZnVuY3Rpb24sCiAgICAgICAgKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIHtib29sIGlzRWxpZGVkfSkgewogICAgICBMb2NhbCBwYXJhbWV0ZXIgPSBsb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZSh2YXJpYWJsZSk7CiAgICAgIEhJbnN0cnVjdGlvbiBhcmd1bWVudCA9IGxvY2Fsc0hhbmRsZXIucmVhZExvY2FsKHBhcmFtZXRlcik7CiAgICAgIERhcnRUeXBlIHR5cGUgPSBsb2NhbHNNYXAuZ2V0TG9jYWxUeXBlKF9lbGVtZW50TWFwLCBwYXJhbWV0ZXIpOwogICAgICBISW5zdHJ1Y3Rpb24gY2hlY2tlZE9yVHJ1c3RlZDsKICAgICAgaWYgKHRydXN0ZWQpIHsKICAgICAgICBjaGVja2VkT3JUcnVzdGVkID0gX3R5cGVCdWlsZGVyLnRydXN0VHlwZU9mUGFyYW1ldGVyKGFyZ3VtZW50LCB0eXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjaGVja2VkT3JUcnVzdGVkID0gX3R5cGVCdWlsZGVyLnBvdGVudGlhbGx5Q2hlY2tPclRydXN0VHlwZU9mUGFyYW1ldGVyKAogICAgICAgICAgICBmdW5jdGlvbiwgYXJndW1lbnQsIHR5cGUpOwogICAgICB9CiAgICAgIGxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwocGFyYW1ldGVyLCBjaGVja2VkT3JUcnVzdGVkKTsKICAgIH0pOwogIH0KCiAgYm9vbCBnZXQgX2FsbElubGluZWRGdW5jdGlvbnNDYWxsZWRPbmNlIHsKICAgIHJldHVybiBfaW5saW5pbmdTdGFjay5pc0VtcHR5IHx8IF9pbmxpbmluZ1N0YWNrLmxhc3QuYWxsRnVuY3Rpb25zQ2FsbGVkT25jZTsKICB9CgogIGJvb2wgX2lzRnVuY3Rpb25DYWxsZWRPbmNlKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIC8vIENvbnN0cnVjdG9yQm9keUVsZW1lbnRzIGFyZSBub3QgaW4gdGhlIHR5cGUgaW5mZXJlbmNlIGdyYXBoLgogICAgaWYgKGVsZW1lbnQgaXMgQ29uc3RydWN0b3JCb2R5RW50aXR5KSB7CiAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBzdWJjbGFzc2VzIHdpdGggY29uc3RydWN0b3JzIHRoYXQgaGF2ZSB0aGlzIGNvbnN0cnVjdG9yCiAgICAgIC8vIGFzIGEgc3VwZXJjb25zdHJ1Y3RvciwgaXQgaXMgY2FsbGVkIG9uY2UgYnkgdGhlIGdlbmVyYXRpdmUKICAgICAgLy8gY29uc3RydWN0b3IncyBmYWN0b3J5LiAgQSBzaW1wbGlmaWVkIHZlcnNpb24gaXMgdG8gY2hlY2sgdGhpcyBpcyBhCiAgICAgIC8vIGNvbnN0cnVjdG9yIGJvZHkgZm9yIGEgbGVhZiBjbGFzcy4KICAgICAgQ2xhc3NFbnRpdHkgY2xhc3NfID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzczsKICAgICAgaWYgKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzRGlyZWN0bHlJbnN0YW50aWF0ZWQoY2xhc3NfKSkgewogICAgICAgIHJldHVybiAhY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNJbmRpcmVjdGx5SW5zdGFudGlhdGVkKGNsYXNzXyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIGdsb2JhbEluZmVyZW5jZVJlc3VsdHMucmVzdWx0T2ZNZW1iZXIoZWxlbWVudCkuaXNDYWxsZWRPbmNlOwogIH0KCiAgYm9vbCBfaXNDYWxsZWRPbmNlKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBfYWxsSW5saW5lZEZ1bmN0aW9uc0NhbGxlZE9uY2UgJiYgX2lzRnVuY3Rpb25DYWxsZWRPbmNlKGVsZW1lbnQpOwogIH0KCiAgdm9pZCBfaW5zZXJ0Q292ZXJhZ2VDYWxsKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoIW9wdGlvbnMuZXhwZXJpbWVudENhbGxJbnN0cnVtZW50YXRpb24pIHJldHVybjsKICAgIGlmIChlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy50cmFjZUhlbHBlcikgcmV0dXJuOwogICAgLy8gVE9ETyhzaWdtdW5kKTogY3JlYXRlIGEgYmV0dGVyIHV1aWQgZm9yIGVsZW1lbnRzLgogICAgSENvbnN0YW50IGlkQ29uc3RhbnQgPSBncmFwaC5hZGRDb25zdGFudEludChlbGVtZW50Lmhhc2hDb2RlLCBjbG9zZWRXb3JsZCk7CiAgICBuKGUpID0+IGUgPT0gbnVsbCA/ICcnIDogZS5uYW1lOwogICAgU3RyaW5nIG5hbWUgPSAiJHtuKGVsZW1lbnQubGlicmFyeSl9OiR7bihlbGVtZW50LmVuY2xvc2luZ0NsYXNzKX0uIgogICAgICAgICIke24oZWxlbWVudCl9IjsKICAgIEhDb25zdGFudCBuYW1lQ29uc3RhbnQgPSBncmFwaC5hZGRDb25zdGFudFN0cmluZyhuYW1lLCBjbG9zZWRXb3JsZCk7CiAgICBhZGQobmV3IEhJbnZva2VTdGF0aWMoCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnRyYWNlSGVscGVyLAogICAgICAgIDxISW5zdHJ1Y3Rpb24+W2lkQ29uc3RhbnQsIG5hbWVDb25zdGFudF0sCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUsCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdKSk7CiAgfQp9CgovLy8gRGF0YSBjb2xsZWN0ZWQgdG8gY3JlYXRlIGEgY29uc3RydWN0b3IuCmNsYXNzIENvbnN0cnVjdG9yRGF0YSB7CiAgLy8vIElubGluZWQgKHN1cGVyKSBjb25zdHJ1Y3RvcnMuCiAgZmluYWwgTGlzdDxpci5Db25zdHJ1Y3Rvcj4gY29uc3RydWN0b3JDaGFpbiA9IDxpci5Db25zdHJ1Y3Rvcj5bXTsKCiAgLy8vIEluaXRpYWwgdmFsdWVzIGZvciBhbGwgaW5zdGFuY2UgZmllbGRzLgogIGZpbmFsIE1hcDxGaWVsZEVudGl0eSwgSEluc3RydWN0aW9uPiBmaWVsZFZhbHVlcyA9CiAgICAgIDxGaWVsZEVudGl0eSwgSEluc3RydWN0aW9uPnt9OwoKICAvLy8gQ2xhc3NlcyBmb3Igd2hpY2ggdHlwZSB2YXJpYWJsZXMgaGF2ZSBiZWVuIHByZXBhcmVkLgogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gaW5jbHVkZWRDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKfQoKY2xhc3MgS2VybmVsSW5saW5pbmdTdGF0ZSB7CiAgZmluYWwgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb247CiAgZmluYWwgTG9jYWwgb2xkUmV0dXJuTG9jYWw7CiAgZmluYWwgRGFydFR5cGUgb2xkUmV0dXJuVHlwZTsKICBmaW5hbCBMaXN0PEhJbnN0cnVjdGlvbj4gb2xkU3RhY2s7CiAgZmluYWwgTG9jYWxzSGFuZGxlciBvbGRMb2NhbHNIYW5kbGVyOwogIGZpbmFsIGJvb2wgaW5UcnlTdGF0ZW1lbnQ7CiAgZmluYWwgYm9vbCBhbGxGdW5jdGlvbnNDYWxsZWRPbmNlOwoKICBLZXJuZWxJbmxpbmluZ1N0YXRlKAogICAgICB0aGlzLmZ1bmN0aW9uLAogICAgICB0aGlzLm9sZFJldHVybkxvY2FsLAogICAgICB0aGlzLm9sZFJldHVyblR5cGUsCiAgICAgIHRoaXMub2xkU3RhY2ssCiAgICAgIHRoaXMub2xkTG9jYWxzSGFuZGxlciwKICAgICAgdGhpcy5pblRyeVN0YXRlbWVudCwKICAgICAgdGhpcy5hbGxGdW5jdGlvbnNDYWxsZWRPbmNlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0tlcm5lbElubGluaW5nU3RhdGUoJGZ1bmN0aW9uLCcKICAgICAgJ2FsbEZ1bmN0aW9uc0NhbGxlZE9uY2U9JGFsbEZ1bmN0aW9uc0NhbGxlZE9uY2UpJzsKfQoKLy8vIENsYXNzIGluIGNoYXJnZSBvZiBidWlsZGluZyB0cnksIGNhdGNoIGFuZC9vciBmaW5hbGx5IGJsb2Nrcy4gVGhpcyBoYW5kbGVzCi8vLyB0aGUgaW5zdHJ1Y3Rpb25zIHRoYXQgbmVlZCB0byBiZSBvdXRwdXQgYW5kIHRoZSBkb21pbmF0b3IgY2FsY3VsYXRpb24gb2YKLy8vIHRoaXMgc2VxdWVuY2Ugb2YgY29kZS4KY2xhc3MgVHJ5Q2F0Y2hGaW5hbGx5QnVpbGRlciB7CiAgZmluYWwgS2VybmVsU3NhR3JhcGhCdWlsZGVyIGtlcm5lbEJ1aWxkZXI7CiAgZmluYWwgU291cmNlSW5mb3JtYXRpb24gdHJ5U291cmNlSW5mb3JtYXRpb247CgogIEhCYXNpY0Jsb2NrIGVudGVyQmxvY2s7CiAgSEJhc2ljQmxvY2sgc3RhcnRUcnlCbG9jazsKICBIQmFzaWNCbG9jayBlbmRUcnlCbG9jazsKICBIQmFzaWNCbG9jayBzdGFydENhdGNoQmxvY2s7CiAgSEJhc2ljQmxvY2sgZW5kQ2F0Y2hCbG9jazsKICBIQmFzaWNCbG9jayBzdGFydEZpbmFsbHlCbG9jazsKICBIQmFzaWNCbG9jayBlbmRGaW5hbGx5QmxvY2s7CiAgSEJhc2ljQmxvY2sgZXhpdEJsb2NrOwogIEhUcnkgdHJ5SW5zdHJ1Y3Rpb247CiAgSExvY2FsVmFsdWUgZXhjZXB0aW9uOwoKICAvLy8gVHJ1ZSBpZiB0aGUgY29kZSBzdXJyb3VuZGluZyB0aGlzIHRyeSBzdGF0ZW1lbnQgd2FzIGFsc28gcGFydCBvZiBhCiAgLy8vIHRyeS9jYXRjaC9maW5hbGx5IHN0YXRlbWVudC4KICBib29sIHByZXZpb3VzbHlJblRyeVN0YXRlbWVudDsKCiAgU3ViR3JhcGggYm9keUdyYXBoOwogIFN1YkdyYXBoIGNhdGNoR3JhcGg7CiAgU3ViR3JhcGggZmluYWxseUdyYXBoOwoKICAvLyBUaGUgb3JpZ2luYWwgc2V0IG9mIGxvY2FscyB0aGF0IHdlcmUgZGVmaW5lZCBiZWZvcmUgdGhpcyB0cnkgYmxvY2suCiAgLy8gVGhlIGNhdGNoIGJsb2NrIGFuZCB0aGUgZmluYWxseSBibG9jayBtdXN0IG5vdCByZXVzZSB0aGUgZXhpc3RpbmcgbG9jYWxzCiAgLy8gaGFuZGxlci4gTm9uZSBvZiB0aGUgdmFyaWFibGVzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgaW4gdGhlIGJvZHktYmxvY2sKICAvLyB3aWxsIGJlIHVzZWQsIGJ1dCBmb3IgbG9vcHMgd2Ugd2lsbCBhZGQgKHVubmVjZXNzYXJ5KSBwaGlzIHRoYXQgd2lsbAogIC8vIHJlZmVyZW5jZSB0aGUgYm9keSB2YXJpYWJsZXMuIFRoaXMgbWFrZXMgaXQgbG9vayBhcyBpZiB0aGUgdmFyaWFibGVzIHdlcmUKICAvLyB1c2VkIGluIGEgbm9uLWRvbWluYXRlZCBibG9jay4KICBMb2NhbHNIYW5kbGVyIG9yaWdpbmFsU2F2ZWRMb2NhbHM7CgogIFRyeUNhdGNoRmluYWxseUJ1aWxkZXIodGhpcy5rZXJuZWxCdWlsZGVyLCB0aGlzLnRyeVNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICB0cnlJbnN0cnVjdGlvbiA9IG5ldyBIVHJ5KGtlcm5lbEJ1aWxkZXIuX2Fic3RyYWN0VmFsdWVEb21haW4pOwogICAgb3JpZ2luYWxTYXZlZExvY2FscyA9IG5ldyBMb2NhbHNIYW5kbGVyLmZyb20oa2VybmVsQnVpbGRlci5sb2NhbHNIYW5kbGVyKTsKICAgIGVudGVyQmxvY2sgPSBrZXJuZWxCdWlsZGVyLm9wZW5OZXdCbG9jaygpOwogICAga2VybmVsQnVpbGRlci5jbG9zZSh0cnlJbnN0cnVjdGlvbik7CiAgICBwcmV2aW91c2x5SW5UcnlTdGF0ZW1lbnQgPSBrZXJuZWxCdWlsZGVyLl9pblRyeVN0YXRlbWVudDsKICAgIGtlcm5lbEJ1aWxkZXIuX2luVHJ5U3RhdGVtZW50ID0gdHJ1ZTsKCiAgICBzdGFydFRyeUJsb2NrID0ga2VybmVsQnVpbGRlci5ncmFwaC5hZGROZXdCbG9jaygpOwogICAga2VybmVsQnVpbGRlci5vcGVuKHN0YXJ0VHJ5QmxvY2spOwogIH0KCiAgdm9pZCBfYWRkRXhpdFRyeVN1Y2Nlc3NvcihzdWNjZXNzb3IpIHsKICAgIGlmIChzdWNjZXNzb3IgPT0gbnVsbCkgcmV0dXJuOwogICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBibG9ja3MgY3JlYXRlZCBpbnNpZGUgdGhpcyB0cnkvY2F0Y2gsIGFuZAogICAgLy8gYXR0YWNoIHN1Y2Nlc3NvciBpbmZvcm1hdGlvbiB0byBibG9ja3MgdGhhdCBlbmQgd2l0aAogICAgLy8gW0hFeGl0VHJ5XS4KICAgIGZvciAoaW50IGkgPSBzdGFydFRyeUJsb2NrLmlkOyBpIDwgc3VjY2Vzc29yLmlkOyBpKyspIHsKICAgICAgSEJhc2ljQmxvY2sgYmxvY2sgPSBrZXJuZWxCdWlsZGVyLmdyYXBoLmJsb2Nrc1tpXTsKICAgICAgdmFyIGxhc3QgPSBibG9jay5sYXN0OwogICAgICBpZiAobGFzdCBpcyBIRXhpdFRyeSkgewogICAgICAgIGJsb2NrLmFkZFN1Y2Nlc3NvcihzdWNjZXNzb3IpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIF9hZGRPcHRpb25hbFN1Y2Nlc3NvcihibG9jazEsIGJsb2NrMikgewogICAgaWYgKGJsb2NrMiAhPSBudWxsKSBibG9jazEuYWRkU3VjY2Vzc29yKGJsb2NrMik7CiAgfQoKICAvLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHNldCB1cCBiYXNpYyBibG9jayBzdWNjZXNzb3JzIGZvciB0cnktY2F0Y2gtZmluYWxseQogIC8vLyBzZXF1ZW5jZXMuCiAgdm9pZCBfc2V0QmxvY2tTdWNjZXNzb3JzKCkgewogICAgLy8gU2V0dXAgYWxsIHN1Y2Nlc3NvcnMuIFRoZSBlbnRyeSBibG9jayB0aGF0IGNvbnRhaW5zIHRoZSBbSFRyeV0KICAgIC8vIGhhcyAxKSB0aGUgYm9keSwgMikgdGhlIGNhdGNoLCAzKSB0aGUgZmluYWxseSwgYW5kIDQpIHRoZSBleGl0CiAgICAvLyBibG9ja3MgYXMgc3VjY2Vzc29ycy4KICAgIGVudGVyQmxvY2suYWRkU3VjY2Vzc29yKHN0YXJ0VHJ5QmxvY2spOwogICAgX2FkZE9wdGlvbmFsU3VjY2Vzc29yKGVudGVyQmxvY2ssIHN0YXJ0Q2F0Y2hCbG9jayk7CiAgICBfYWRkT3B0aW9uYWxTdWNjZXNzb3IoZW50ZXJCbG9jaywgc3RhcnRGaW5hbGx5QmxvY2spOwogICAgZW50ZXJCbG9jay5hZGRTdWNjZXNzb3IoZXhpdEJsb2NrKTsKCiAgICAvLyBUaGUgYm9keSBoYXMgZWl0aGVyIHRoZSBjYXRjaCBvciB0aGUgZmluYWxseSBibG9jayBhcyBzdWNjZXNzb3IuCiAgICBpZiAoZW5kVHJ5QmxvY2sgIT0gbnVsbCkgewogICAgICBhc3NlcnQoc3RhcnRDYXRjaEJsb2NrICE9IG51bGwgfHwgc3RhcnRGaW5hbGx5QmxvY2sgIT0gbnVsbCk7CiAgICAgIGVuZFRyeUJsb2NrLmFkZFN1Y2Nlc3NvcigKICAgICAgICAgIHN0YXJ0Q2F0Y2hCbG9jayAhPSBudWxsID8gc3RhcnRDYXRjaEJsb2NrIDogc3RhcnRGaW5hbGx5QmxvY2spOwogICAgICBlbmRUcnlCbG9jay5hZGRTdWNjZXNzb3IoZXhpdEJsb2NrKTsKICAgIH0KCiAgICAvLyBUaGUgY2F0Y2ggYmxvY2sgaGFzIGVpdGhlciB0aGUgZmluYWxseSBvciB0aGUgZXhpdCBibG9jayBhcwogICAgLy8gc3VjY2Vzc29yLgogICAgZW5kQ2F0Y2hCbG9jaz8uYWRkU3VjY2Vzc29yKAogICAgICAgIHN0YXJ0RmluYWxseUJsb2NrICE9IG51bGwgPyBzdGFydEZpbmFsbHlCbG9jayA6IGV4aXRCbG9jayk7CgogICAgLy8gVGhlIGZpbmFsbHkgYmxvY2sgaGFzIHRoZSBleGl0IGJsb2NrIGFzIHN1Y2Nlc3Nvci4KICAgIGVuZEZpbmFsbHlCbG9jaz8uYWRkU3VjY2Vzc29yKGV4aXRCbG9jayk7CgogICAgLy8gSWYgYSBibG9jayBpbnNpZGUgdHJ5L2NhdGNoIGFib3J0cyAoZWcgd2l0aCBhIHJldHVybiBzdGF0ZW1lbnQpLAogICAgLy8gd2UgZXhwbGljaXRseSBtYXJrIHRoaXMgYmxvY2sgYSBwcmVkZWNlc3NvciBvZiB0aGUgY2F0Y2gKICAgIC8vIGJsb2NrIGFuZCB0aGUgZmluYWxseSBibG9jay4KICAgIF9hZGRFeGl0VHJ5U3VjY2Vzc29yKHN0YXJ0Q2F0Y2hCbG9jayk7CiAgICBfYWRkRXhpdFRyeVN1Y2Nlc3NvcihzdGFydEZpbmFsbHlCbG9jayk7CiAgfQoKICAvLy8gQnVpbGQgdGhlIGZpbmFsbHl7fSBjbGF1c2Ugb2YgYSB0cnkve2NhdGNofS9maW5hbGx5IHN0YXRlbWVudC4gTm90ZSB0aGlzCiAgLy8vIGRvZXMgbm90IGV4YW1pbmUgdGhlIGJvZHkgb2YgdGhlIHRyeSBjbGF1c2UsIG9ubHkgdGhlIGZpbmFsbHkgcG9ydGlvbi4KICB2b2lkIGJ1aWxkRmluYWxseUJsb2NrKHZvaWQgYnVpbGRGaW5hbGl6ZXIoKSkgewogICAga2VybmVsQnVpbGRlci5sb2NhbHNIYW5kbGVyID0gbmV3IExvY2Fsc0hhbmRsZXIuZnJvbShvcmlnaW5hbFNhdmVkTG9jYWxzKTsKICAgIHN0YXJ0RmluYWxseUJsb2NrID0ga2VybmVsQnVpbGRlci5ncmFwaC5hZGROZXdCbG9jaygpOwogICAga2VybmVsQnVpbGRlci5vcGVuKHN0YXJ0RmluYWxseUJsb2NrKTsKICAgIGJ1aWxkRmluYWxpemVyKCk7CiAgICBpZiAoIWtlcm5lbEJ1aWxkZXIuaXNBYm9ydGVkKCkpIHsKICAgICAgZW5kRmluYWxseUJsb2NrID0KICAgICAgICAgIGtlcm5lbEJ1aWxkZXIuY2xvc2UobmV3IEhHb3RvKGtlcm5lbEJ1aWxkZXIuX2Fic3RyYWN0VmFsdWVEb21haW4pKTsKICAgIH0KICAgIHRyeUluc3RydWN0aW9uLmZpbmFsbHlCbG9jayA9IHN0YXJ0RmluYWxseUJsb2NrOwogICAgZmluYWxseUdyYXBoID0KICAgICAgICBuZXcgU3ViR3JhcGgoc3RhcnRGaW5hbGx5QmxvY2ssIGtlcm5lbEJ1aWxkZXIubGFzdE9wZW5lZEJsb2NrKTsKICB9CgogIHZvaWQgY2xvc2VUcnlCb2R5KCkgewogICAgLy8gV2UgdXNlIGEgW0hFeGl0VHJ5XSBpbnN0ZWFkIG9mIGEgW0hHb3RvXSBmb3IgdGhlIHRyeSBibG9jawogICAgLy8gYmVjYXVzZSBpdCB3aWxsIGhhdmUgbXVsdGlwbGUgc3VjY2Vzc29yczogdGhlIGpvaW4gYmxvY2ssIGFuZAogICAgLy8gdGhlIGNhdGNoIG9yIGZpbmFsbHkgYmxvY2suCiAgICBpZiAoIWtlcm5lbEJ1aWxkZXIuaXNBYm9ydGVkKCkpIHsKICAgICAgZW5kVHJ5QmxvY2sgPQogICAgICAgICAga2VybmVsQnVpbGRlci5jbG9zZShuZXcgSEV4aXRUcnkoa2VybmVsQnVpbGRlci5fYWJzdHJhY3RWYWx1ZURvbWFpbikpOwogICAgfQogICAgYm9keUdyYXBoID0gbmV3IFN1YkdyYXBoKHN0YXJ0VHJ5QmxvY2ssIGtlcm5lbEJ1aWxkZXIubGFzdE9wZW5lZEJsb2NrKTsKICB9CgogIHZvaWQgYnVpbGRDYXRjaChpci5UcnlDYXRjaCB0cnlDYXRjaCkgewogICAga2VybmVsQnVpbGRlci5sb2NhbHNIYW5kbGVyID0gbmV3IExvY2Fsc0hhbmRsZXIuZnJvbShvcmlnaW5hbFNhdmVkTG9jYWxzKTsKICAgIHN0YXJ0Q2F0Y2hCbG9jayA9IGtlcm5lbEJ1aWxkZXIuZ3JhcGguYWRkTmV3QmxvY2soKTsKICAgIGtlcm5lbEJ1aWxkZXIub3BlbihzdGFydENhdGNoQmxvY2spOwogICAgLy8gTm90ZSB0aGF0IHRoZSBuYW1lIG9mIHRoaXMgbG9jYWwgaXMgaXJyZWxldmFudC4KICAgIFN5bnRoZXRpY0xvY2FsIGxvY2FsID0ga2VybmVsQnVpbGRlci5sb2NhbHNIYW5kbGVyLmNyZWF0ZUxvY2FsKCdleGNlcHRpb24nKTsKICAgIGV4Y2VwdGlvbiA9CiAgICAgICAgbmV3IEhMb2NhbFZhbHVlKGxvY2FsLCBrZXJuZWxCdWlsZGVyLl9hYnN0cmFjdFZhbHVlRG9tYWluLm5vbk51bGxUeXBlKQogICAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHRyeVNvdXJjZUluZm9ybWF0aW9uOwogICAga2VybmVsQnVpbGRlci5hZGQoZXhjZXB0aW9uKTsKICAgIEhJbnN0cnVjdGlvbiBvbGRSZXRocm93YWJsZUV4Y2VwdGlvbiA9IGtlcm5lbEJ1aWxkZXIuX3JldGhyb3dhYmxlRXhjZXB0aW9uOwogICAga2VybmVsQnVpbGRlci5fcmV0aHJvd2FibGVFeGNlcHRpb24gPSBleGNlcHRpb247CgogICAga2VybmVsQnVpbGRlci5fcHVzaFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAga2VybmVsQnVpbGRlci5fY29tbW9uRWxlbWVudHMuZXhjZXB0aW9uVW53cmFwcGVyLAogICAgICAgIFtleGNlcHRpb25dLAogICAgICAgIGtlcm5lbEJ1aWxkZXIuX3R5cGVJbmZlcmVuY2VNYXAKICAgICAgICAgICAgLmdldFJldHVyblR5cGVPZihrZXJuZWxCdWlsZGVyLl9jb21tb25FbGVtZW50cy5leGNlcHRpb25VbndyYXBwZXIpLAogICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogdHJ5U291cmNlSW5mb3JtYXRpb24pOwogICAgSEludm9rZVN0YXRpYyB1bndyYXBwZWRFeGNlcHRpb24gPSBrZXJuZWxCdWlsZGVyLnBvcCgpOwogICAgdHJ5SW5zdHJ1Y3Rpb24uZXhjZXB0aW9uID0gZXhjZXB0aW9uOwogICAgaW50IGNhdGNoZXNJbmRleCA9IDA7CgogICAgdm9pZCBwdXNoQ29uZGl0aW9uKGlyLkNhdGNoIGNhdGNoQmxvY2spIHsKICAgICAgLy8gYGd1YXJkYCBpcyBvZnRlbiBgZHluYW1pY2AsIHdoaWNoIGdlbmVyYXRlcyBgdHJ1ZWAuCiAgICAgIGtlcm5lbEJ1aWxkZXIuX3B1c2hJc1Rlc3QoY2F0Y2hCbG9jay5ndWFyZCwgdW53cmFwcGVkRXhjZXB0aW9uLAogICAgICAgICAga2VybmVsQnVpbGRlci5fc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQ2F0Y2goY2F0Y2hCbG9jaykpOwogICAgfQoKICAgIHZvaWQgdmlzaXRUaGVuKCkgewogICAgICBpci5DYXRjaCBjYXRjaEJsb2NrID0gdHJ5Q2F0Y2guY2F0Y2hlc1tjYXRjaGVzSW5kZXhdOwogICAgICBjYXRjaGVzSW5kZXgrKzsKICAgICAgaWYgKGNhdGNoQmxvY2suZXhjZXB0aW9uICE9IG51bGwpIHsKICAgICAgICBMb2NhbCBleGNlcHRpb25WYXJpYWJsZSA9CiAgICAgICAgICAgIGtlcm5lbEJ1aWxkZXIuX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKGNhdGNoQmxvY2suZXhjZXB0aW9uKTsKICAgICAgICBrZXJuZWxCdWlsZGVyLmxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwoCiAgICAgICAgICAgIGV4Y2VwdGlvblZhcmlhYmxlLCB1bndyYXBwZWRFeGNlcHRpb24sCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOgogICAgICAgICAgICAgICAga2VybmVsQnVpbGRlci5fc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkQ2F0Y2goY2F0Y2hCbG9jaykpOwogICAgICB9CiAgICAgIGlmIChjYXRjaEJsb2NrLnN0YWNrVHJhY2UgIT0gbnVsbCkgewogICAgICAgIGtlcm5lbEJ1aWxkZXIuX3B1c2hTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgICAgICBrZXJuZWxCdWlsZGVyLl9jb21tb25FbGVtZW50cy50cmFjZUZyb21FeGNlcHRpb24sCiAgICAgICAgICAgIFtleGNlcHRpb25dLAogICAgICAgICAgICBrZXJuZWxCdWlsZGVyLl90eXBlSW5mZXJlbmNlTWFwLmdldFJldHVyblR5cGVPZigKICAgICAgICAgICAgICAgIGtlcm5lbEJ1aWxkZXIuX2NvbW1vbkVsZW1lbnRzLnRyYWNlRnJvbUV4Y2VwdGlvbiksCiAgICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgICAgICAgc291cmNlSW5mb3JtYXRpb246CiAgICAgICAgICAgICAgICBrZXJuZWxCdWlsZGVyLl9zb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIuYnVpbGRDYXRjaChjYXRjaEJsb2NrKSk7CiAgICAgICAgSEluc3RydWN0aW9uIHRyYWNlSW5zdHJ1Y3Rpb24gPSBrZXJuZWxCdWlsZGVyLnBvcCgpOwogICAgICAgIExvY2FsIHRyYWNlVmFyaWFibGUgPQogICAgICAgICAgICBrZXJuZWxCdWlsZGVyLl9sb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZShjYXRjaEJsb2NrLnN0YWNrVHJhY2UpOwogICAgICAgIGtlcm5lbEJ1aWxkZXIubG9jYWxzSGFuZGxlci51cGRhdGVMb2NhbCh0cmFjZVZhcmlhYmxlLCB0cmFjZUluc3RydWN0aW9uLAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjoKICAgICAgICAgICAgICAgIGtlcm5lbEJ1aWxkZXIuX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZENhdGNoKGNhdGNoQmxvY2spKTsKICAgICAgfQogICAgICBjYXRjaEJsb2NrLmJvZHkuYWNjZXB0KGtlcm5lbEJ1aWxkZXIpOwogICAgfQoKICAgIHZvaWQgdmlzaXRFbHNlKCkgewogICAgICBpZiAoY2F0Y2hlc0luZGV4ID49IHRyeUNhdGNoLmNhdGNoZXMubGVuZ3RoKSB7CiAgICAgICAga2VybmVsQnVpbGRlci5fY2xvc2VBbmRHb3RvRXhpdChuZXcgSFRocm93KAogICAgICAgICAgICBrZXJuZWxCdWlsZGVyLl9hYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICAgICAgICBleGNlcHRpb24sCiAgICAgICAgICAgIGV4Y2VwdGlvbi5zb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgICAgaXNSZXRocm93OiB0cnVlKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaXIuQ2F0Y2ggbmV4dENhdGNoID0gdHJ5Q2F0Y2guY2F0Y2hlc1tjYXRjaGVzSW5kZXhdOwogICAgICAgIGtlcm5lbEJ1aWxkZXIuX2hhbmRsZUlmKAogICAgICAgICAgICB2aXNpdENvbmRpdGlvbjogKCkgewogICAgICAgICAgICAgIHB1c2hDb25kaXRpb24obmV4dENhdGNoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdmlzaXRUaGVuOiB2aXNpdFRoZW4sCiAgICAgICAgICAgIHZpc2l0RWxzZTogdmlzaXRFbHNlLAogICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjoKICAgICAgICAgICAgICAgIGtlcm5lbEJ1aWxkZXIuX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZENhdGNoKG5leHRDYXRjaCkpOwogICAgICB9CiAgICB9CgogICAgaXIuQ2F0Y2ggZmlyc3RCbG9jayA9IHRyeUNhdGNoLmNhdGNoZXNbY2F0Y2hlc0luZGV4XTsKICAgIGtlcm5lbEJ1aWxkZXIuX2hhbmRsZUlmKAogICAgICAgIHZpc2l0Q29uZGl0aW9uOiAoKSB7CiAgICAgICAgICBwdXNoQ29uZGl0aW9uKGZpcnN0QmxvY2spOwogICAgICAgIH0sCiAgICAgICAgdmlzaXRUaGVuOiB2aXNpdFRoZW4sCiAgICAgICAgdmlzaXRFbHNlOiB2aXNpdEVsc2UsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246CiAgICAgICAgICAgIGtlcm5lbEJ1aWxkZXIuX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZENhdGNoKGZpcnN0QmxvY2spKTsKICAgIGlmICgha2VybmVsQnVpbGRlci5pc0Fib3J0ZWQoKSkgewogICAgICBlbmRDYXRjaEJsb2NrID0KICAgICAgICAgIGtlcm5lbEJ1aWxkZXIuY2xvc2UobmV3IEhHb3RvKGtlcm5lbEJ1aWxkZXIuX2Fic3RyYWN0VmFsdWVEb21haW4pKTsKICAgIH0KCiAgICBrZXJuZWxCdWlsZGVyLl9yZXRocm93YWJsZUV4Y2VwdGlvbiA9IG9sZFJldGhyb3dhYmxlRXhjZXB0aW9uOwogICAgdHJ5SW5zdHJ1Y3Rpb24uY2F0Y2hCbG9jayA9IHN0YXJ0Q2F0Y2hCbG9jazsKICAgIGNhdGNoR3JhcGggPSBuZXcgU3ViR3JhcGgoc3RhcnRDYXRjaEJsb2NrLCBrZXJuZWxCdWlsZGVyLmxhc3RPcGVuZWRCbG9jayk7CiAgfQoKICB2b2lkIGNsZWFuVXAoKSB7CiAgICBleGl0QmxvY2sgPSBrZXJuZWxCdWlsZGVyLmdyYXBoLmFkZE5ld0Jsb2NrKCk7CiAgICBfc2V0QmxvY2tTdWNjZXNzb3JzKCk7CgogICAgLy8gVXNlIHRoZSBsb2NhbHMgaGFuZGxlciBub3QgYWx0ZXJlZCBieSB0aGUgY2F0Y2ggYW5kIGZpbmFsbHkKICAgIC8vIGJsb2Nrcy4KICAgIGtlcm5lbEJ1aWxkZXIubG9jYWxzSGFuZGxlciA9IG9yaWdpbmFsU2F2ZWRMb2NhbHM7CiAgICBrZXJuZWxCdWlsZGVyLm9wZW4oZXhpdEJsb2NrKTsKICAgIGVudGVyQmxvY2suc2V0QmxvY2tGbG93KAogICAgICAgIG5ldyBIVHJ5QmxvY2tJbmZvcm1hdGlvbigKICAgICAgICAgICAga2VybmVsQnVpbGRlci53cmFwU3RhdGVtZW50R3JhcGgoYm9keUdyYXBoKSwKICAgICAgICAgICAgZXhjZXB0aW9uLAogICAgICAgICAgICBrZXJuZWxCdWlsZGVyLndyYXBTdGF0ZW1lbnRHcmFwaChjYXRjaEdyYXBoKSwKICAgICAgICAgICAga2VybmVsQnVpbGRlci53cmFwU3RhdGVtZW50R3JhcGgoZmluYWxseUdyYXBoKSksCiAgICAgICAgZXhpdEJsb2NrKTsKICAgIGtlcm5lbEJ1aWxkZXIuX2luVHJ5U3RhdGVtZW50ID0gcHJldmlvdXNseUluVHJ5U3RhdGVtZW50OwogIH0KfQoKY2xhc3MgS2VybmVsVHlwZUJ1aWxkZXIgZXh0ZW5kcyBUeXBlQnVpbGRlciB7CiAgSnNUb0VsZW1lbnRNYXAgX2VsZW1lbnRNYXA7CgogIEtlcm5lbFR5cGVCdWlsZGVyKEtlcm5lbFNzYUdyYXBoQnVpbGRlciBidWlsZGVyLCB0aGlzLl9lbGVtZW50TWFwKQogICAgICA6IHN1cGVyKGJ1aWxkZXIpOwoKICBAb3ZlcnJpZGUKICBLZXJuZWxTc2FHcmFwaEJ1aWxkZXIgZ2V0IGJ1aWxkZXIgPT4gc3VwZXIuYnVpbGRlcjsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgY29tcHV0ZVR5cGVWYXJpYWJsZUFjY2VzcyhNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gX2VsZW1lbnRNYXAuZ2V0Q2xhc3NUeXBlVmFyaWFibGVBY2Nlc3NGb3JNZW1iZXIobWVtYmVyKTsKICB9Cn0KCmNsYXNzIF9FcnJvbmVvdXNJbml0aWFsaXplclZpc2l0b3IgZXh0ZW5kcyBpci5WaXNpdG9yPGJvb2w+IHsKICBfRXJyb25lb3VzSW5pdGlhbGl6ZXJWaXNpdG9yKCk7CgogIC8vIFRPRE8oMzA4MDkpOiBVc2UgY29uc3QgY29uc3RydWN0b3IuCiAgc3RhdGljIGJvb2wgY2hlY2soaXIuSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpID0+CiAgICAgIGluaXRpYWxpemVyLmFjY2VwdChuZXcgX0Vycm9uZW91c0luaXRpYWxpemVyVmlzaXRvcigpKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBkZWZhdWx0SW5pdGlhbGl6ZXIoaXIuTm9kZSBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludmFsaWRJbml0aWFsaXplcihpci5JbnZhbGlkSW5pdGlhbGl6ZXIgbm9kZSkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExvY2FsSW5pdGlhbGl6ZXIoaXIuTG9jYWxJbml0aWFsaXplciBub2RlKSB7CiAgICByZXR1cm4gbm9kZS52YXJpYWJsZS5pbml0aWFsaXplcj8uYWNjZXB0KHRoaXMpID8/IGZhbHNlOwogIH0KCiAgLy8gRXhwcmVzc2lvbnM6IERvZXMgdGhlIGV4cHJlc3Npb24gYWx3YXlzIHRocm93PwogIEBvdmVycmlkZQogIGJvb2wgZGVmYXVsdEV4cHJlc3Npb24oaXIuRXhwcmVzc2lvbiBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFRocm93KGlyLlRocm93IG5vZGUpID0+IHRydWU7CgogIC8vIFRPRE8oc3JhKTogV2UgbWlnaHQgbmVlZCB0byBtYXRjaCBvdGhlciBleHByZXNzaW9ucyB0aGF0IGFsd2F5cyB0aHJvdyBidXQKICAvLyBpbiBhIHN1YmV4cHJlc3Npb24uCn0KCi8vLyBTcGVjaWFsIFtKdW1wSGFuZGxlcl0gaW1wbGVtZW50YXRpb24gdXNlZCB0byBoYW5kbGUgY29udGludWUgc3RhdGVtZW50cwovLy8gdGFyZ2V0aW5nIHN3aXRjaCBjYXNlcy4KY2xhc3MgS2VybmVsU3dpdGNoQ2FzZUp1bXBIYW5kbGVyIGV4dGVuZHMgU3dpdGNoQ2FzZUp1bXBIYW5kbGVyIHsKICBLZXJuZWxTd2l0Y2hDYXNlSnVtcEhhbmRsZXIoS2VybmVsU3NhR3JhcGhCdWlsZGVyIGJ1aWxkZXIsIEp1bXBUYXJnZXQgdGFyZ2V0LAogICAgICBpci5Td2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50LCBLZXJuZWxUb0xvY2Fsc01hcCBsb2NhbHNNYXApCiAgICAgIDogc3VwZXIoYnVpbGRlciwgdGFyZ2V0KSB7CiAgICAvLyBUaGUgc3dpdGNoIGNhc2UgaW5kaWNlcyBtdXN0IG1hdGNoIHRob3NlIGNvbXB1dGVkIGluCiAgICAvLyBbS2VybmVsU3NhQnVpbGRlci5idWlsZFN3aXRjaENhc2VDb25zdGFudHNdLgogICAgLy8gU3dpdGNoIGluZGljZXMgYXJlIDEtYmFzZWQgc28gd2UgY2FuIGJ5cGFzcyB0aGUgc3ludGhldGljIGxvb3Agd2hlbiBubwogICAgLy8gY2FzZXMgbWF0Y2ggc2ltcGx5IGJ5IGJyYW5jaGluZyBvbiB0aGUgaW5kZXggKHdoaWNoIGRlZmF1bHRzIHRvIG51bGwpLgogICAgLy8gVE9ETwogICAgaW50IHN3aXRjaEluZGV4ID0gMTsKICAgIGZvciAoaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlIGluIHN3aXRjaFN0YXRlbWVudC5jYXNlcykgewogICAgICBKdW1wVGFyZ2V0IGNvbnRpbnVlVGFyZ2V0ID0KICAgICAgICAgIGxvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yU3dpdGNoQ2FzZShzd2l0Y2hDYXNlKTsKICAgICAgaWYgKGNvbnRpbnVlVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgICB0YXJnZXRJbmRleE1hcFtjb250aW51ZVRhcmdldF0gPSBzd2l0Y2hJbmRleDsKICAgICAgICBhc3NlcnQoYnVpbGRlci5qdW1wVGFyZ2V0c1tjb250aW51ZVRhcmdldF0gPT0gbnVsbCk7CiAgICAgICAgYnVpbGRlci5qdW1wVGFyZ2V0c1tjb250aW51ZVRhcmdldF0gPSB0aGlzOwogICAgICB9CiAgICAgIHN3aXRjaEluZGV4Kys7CiAgICB9CiAgfQp9CgpjbGFzcyBTdGF0aWNUeXBlIHsKICBmaW5hbCBEYXJ0VHlwZSB0eXBlOwogIGZpbmFsIENsYXNzUmVsYXRpb24gcmVsYXRpb247CgogIFN0YXRpY1R5cGUodGhpcy50eXBlLCB0aGlzLnJlbGF0aW9uKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0eXBlLmhhc2hDb2RlICogMTMgKyByZWxhdGlvbi5oYXNoQ29kZSAqIDE5OwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gb3RoZXIgaXMgU3RhdGljVHlwZSAmJgogICAgICAgIHR5cGUgPT0gb3RoZXIudHlwZSAmJgogICAgICAgIHJlbGF0aW9uID09IG90aGVyLnJlbGF0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1N0YXRpY1R5cGUoJHR5cGUsJHJlbGF0aW9uKSc7Cn0KCmNsYXNzIElubGluZURhdGEgewogIGJvb2wgaXNDb25zdHJ1Y3RvciA9IGZhbHNlOwogIGJvb2wgY29kZUFmdGVyUmV0dXJuID0gZmFsc2U7CiAgYm9vbCBoYXNMb29wID0gZmFsc2U7CiAgYm9vbCBoYXNDbG9zdXJlID0gZmFsc2U7CiAgYm9vbCBoYXNUcnkgPSBmYWxzZTsKICBib29sIGhhc0FzeW5jQXdhaXQgPSBmYWxzZTsKICBib29sIGhhc1Rocm93ID0gZmFsc2U7CiAgYm9vbCBoYXNMb25nU3RyaW5nID0gZmFsc2U7CiAgYm9vbCBoYXNFeHRlcm5hbENvbnN0YW50Q29uc3RydWN0b3JDYWxsID0gZmFsc2U7CiAgYm9vbCBoYXNUeXBlQXJndW1lbnRzID0gZmFsc2U7CiAgYm9vbCBoYXNBcmd1bWVudERlZmF1bHRpbmcgPSBmYWxzZTsKICBib29sIGhhc0Nhc3QgPSBmYWxzZTsKICBib29sIGhhc0lmID0gZmFsc2U7CiAgTGlzdDxpbnQ+IGFyZ3VtZW50Q291bnRzID0gW107CiAgaW50IHJlZ3VsYXJOb2RlQ291bnQgPSAwOwogIGludCBjYWxsQ291bnQgPSAwOwogIGludCByZWR1Y3RpdmVOb2RlQ291bnQgPSAwOwoKICBJbmxpbmVEYXRhKCk7CgogIElubGluZURhdGEuaW50ZXJuYWwoCiAgICAgIHt0aGlzLmNvZGVBZnRlclJldHVybiwKICAgICAgdGhpcy5oYXNMb29wLAogICAgICB0aGlzLmhhc0Nsb3N1cmUsCiAgICAgIHRoaXMuaGFzVHJ5LAogICAgICB0aGlzLmhhc0FzeW5jQXdhaXQsCiAgICAgIHRoaXMuaGFzVGhyb3csCiAgICAgIHRoaXMuaGFzTG9uZ1N0cmluZywKICAgICAgdGhpcy5yZWd1bGFyTm9kZUNvdW50LAogICAgICB0aGlzLmNhbGxDb3VudH0pOwoKICBib29sIGNhbkJlSW5saW5lZCh7aW50IG1heElubGluaW5nTm9kZXMsIGJvb2wgYWxsb3dMb29wczogZmFsc2V9KSB7CiAgICByZXR1cm4gY2Fubm90QmVJbmxpbmVkUmVhc29uKAogICAgICAgICAgICBtYXhJbmxpbmluZ05vZGVzOiBtYXhJbmxpbmluZ05vZGVzLCBhbGxvd0xvb3BzOiBhbGxvd0xvb3BzKSA9PQogICAgICAgIG51bGw7CiAgfQoKICBTdHJpbmcgY2Fubm90QmVJbmxpbmVkUmVhc29uKHtpbnQgbWF4SW5saW5pbmdOb2RlcywgYm9vbCBhbGxvd0xvb3BzOiBmYWxzZX0pIHsKICAgIGlmIChoYXNMb29wICYmICFhbGxvd0xvb3BzKSB7CiAgICAgIHJldHVybiAnbG9vcCc7CiAgICB9IGVsc2UgaWYgKGhhc1RyeSkgewogICAgICByZXR1cm4gJ3RyeSc7CiAgICB9IGVsc2UgaWYgKGhhc0Nsb3N1cmUpIHsKICAgICAgcmV0dXJuICdjbG9zdXJlJzsKICAgIH0gZWxzZSBpZiAoY29kZUFmdGVyUmV0dXJuKSB7CiAgICAgIHJldHVybiAnY29kZSBhZnRlciByZXR1cm4nOwogICAgfSBlbHNlIGlmIChoYXNBc3luY0F3YWl0KSB7CiAgICAgIHJldHVybiAnYXN5bmMvYXdhaXQnOwogICAgfSBlbHNlIGlmIChtYXhJbmxpbmluZ05vZGVzICE9IG51bGwgJiYKICAgICAgICByZWd1bGFyTm9kZUNvdW50IC0gMSA+IG1heElubGluaW5nTm9kZXMpIHsKICAgICAgcmV0dXJuICd0b28gbWFueSBub2RlcyAoJHtyZWd1bGFyTm9kZUNvdW50IC0gMX0+JG1heElubGluaW5nTm9kZXMpJzsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgYm9vbCBjYW5CZUlubGluZWRSZWR1Y3RpdmUoe2ludCBhcmd1bWVudENvdW50fSkgewogICAgcmV0dXJuIGNhbm5vdEJlSW5saW5lZFJlZHVjdGl2ZVJlYXNvbihhcmd1bWVudENvdW50OiBhcmd1bWVudENvdW50KSA9PSBudWxsOwogIH0KCiAgU3RyaW5nIGNhbm5vdEJlSW5saW5lZFJlZHVjdGl2ZVJlYXNvbih7aW50IGFyZ3VtZW50Q291bnR9KSB7CiAgICBpZiAoaGFzVHJ5KSB7CiAgICAgIHJldHVybiAndHJ5JzsKICAgIH0gZWxzZSBpZiAoaGFzQ2xvc3VyZSkgewogICAgICByZXR1cm4gJ2Nsb3N1cmUnOwogICAgfSBlbHNlIGlmIChjb2RlQWZ0ZXJSZXR1cm4pIHsKICAgICAgcmV0dXJuICdjb2RlIGFmdGVyIHJldHVybic7CiAgICB9IGVsc2UgaWYgKGhhc0FzeW5jQXdhaXQpIHsKICAgICAgcmV0dXJuICdhc3luYy9hd2FpdCc7CiAgICB9IGVsc2UgaWYgKGNhbGxDb3VudCA+IDEpIHsKICAgICAgcmV0dXJuICd0b28gbWFueSBjYWxscyc7CiAgICB9IGVsc2UgaWYgKGhhc1Rocm93KSB7CiAgICAgIHJldHVybiAndGhyb3cnOwogICAgfSBlbHNlIGlmIChoYXNMb25nU3RyaW5nKSB7CiAgICAgIHJldHVybiAnbG9uZyBzdHJpbmcnOwogICAgfSBlbHNlIGlmIChoYXNFeHRlcm5hbENvbnN0YW50Q29uc3RydWN0b3JDYWxsKSB7CiAgICAgIHJldHVybiAnZXh0ZXJuYWwgY29uc3QgY29uc3RydWN0b3InOwogICAgfSBlbHNlIGlmIChoYXNUeXBlQXJndW1lbnRzKSB7CiAgICAgIHJldHVybiAndHlwZSBhcmd1bWVudHMnOwogICAgfSBlbHNlIGlmIChoYXNBcmd1bWVudERlZmF1bHRpbmcpIHsKICAgICAgcmV0dXJuICdhcmd1bWVudCBkZWZhdWx0aW5nJzsKICAgIH0gZWxzZSBpZiAoaGFzQ2FzdCkgewogICAgICByZXR1cm4gJ2Nhc3QnOwogICAgfSBlbHNlIGlmIChoYXNJZikgewogICAgICByZXR1cm4gJ2lmJzsKICAgIH0gZWxzZSBpZiAoaXNDb25zdHJ1Y3RvcikgewogICAgICByZXR1cm4gJ2NvbnN0cnVjdG9yJzsKICAgIH0KICAgIGZvciAoaW50IGNvdW50IGluIGFyZ3VtZW50Q291bnRzKSB7CiAgICAgIGlmIChjb3VudCA+IGFyZ3VtZW50Q291bnQpIHsKICAgICAgICByZXR1cm4gJ2luY3JlYXNpbmcgYXJndW1lbnRzJzsKICAgICAgfQogICAgfQogICAgLy8gTm9kZSBidWRnZXQgdGhhdCBjb3ZlcnMgb25lIGNhbGwgYW5kIHRoZSBwYXNzZWQtaW4gYXJndW1lbnRzLgogICAgLy8gVGhlICsxIGFsc28gYWxsb3dzIGEgdG9wLWxldmVsIHplcm8tYXJndW1lbnQgdG8gYmUgaW5saW5lZCBpZiBpdAogICAgLy8gcmV0dXJucyBhIGNvbnN0YW50LgogICAgaW50IG1heElubGluaW5nTm9kZXMgPSBhcmd1bWVudENvdW50ICsgMTsKICAgIGlmIChyZWR1Y3RpdmVOb2RlQ291bnQgPiBtYXhJbmxpbmluZ05vZGVzKSB7CiAgICAgIHJldHVybiAndG9vIG1hbnkgbm9kZXMgKCR7cmVkdWN0aXZlTm9kZUNvdW50fT4kbWF4SW5saW5pbmdOb2RlcyknOwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ0lubGluZURhdGEoJyk7CiAgICBTdHJpbmcgY29tbWEgPSAnJzsKICAgIGlmIChpc0NvbnN0cnVjdG9yKSB7CiAgICAgIHNiLndyaXRlKCdpc0NvbnN0cnVjdG9yJyk7CiAgICAgIGNvbW1hID0gJywnOwogICAgfQogICAgaWYgKGNvZGVBZnRlclJldHVybikgewogICAgICBzYi53cml0ZShjb21tYSk7CiAgICAgIHNiLndyaXRlKCdjb2RlQWZ0ZXJSZXR1cm4nKTsKICAgICAgY29tbWEgPSAnLCc7CiAgICB9CiAgICBpZiAoaGFzTG9vcCkgewogICAgICBzYi53cml0ZShjb21tYSk7CiAgICAgIHNiLndyaXRlKCdoYXNMb29wJyk7CiAgICAgIGNvbW1hID0gJywnOwogICAgfQogICAgaWYgKGhhc0Nsb3N1cmUpIHsKICAgICAgc2Iud3JpdGUoY29tbWEpOwogICAgICBzYi53cml0ZSgnaGFzQ2xvc3VyZScpOwogICAgICBjb21tYSA9ICcsJzsKICAgIH0KICAgIGlmIChoYXNUcnkpIHsKICAgICAgc2Iud3JpdGUoY29tbWEpOwogICAgICBzYi53cml0ZSgnaGFzVHJ5Jyk7CiAgICAgIGNvbW1hID0gJywnOwogICAgfQogICAgaWYgKGhhc0FzeW5jQXdhaXQpIHsKICAgICAgc2Iud3JpdGUoY29tbWEpOwogICAgICBzYi53cml0ZSgnaGFzQXN5bmNBd2FpdCcpOwogICAgICBjb21tYSA9ICcsJzsKICAgIH0KICAgIGlmIChoYXNUaHJvdykgewogICAgICBzYi53cml0ZShjb21tYSk7CiAgICAgIHNiLndyaXRlKCdoYXNUaHJvdycpOwogICAgICBjb21tYSA9ICcsJzsKICAgIH0KICAgIGlmIChoYXNMb25nU3RyaW5nKSB7CiAgICAgIHNiLndyaXRlKGNvbW1hKTsKICAgICAgc2Iud3JpdGUoJ2hhc0xvbmdTdHJpbmcnKTsKICAgICAgY29tbWEgPSAnLCc7CiAgICB9CiAgICBpZiAoaGFzRXh0ZXJuYWxDb25zdGFudENvbnN0cnVjdG9yQ2FsbCkgewogICAgICBzYi53cml0ZShjb21tYSk7CiAgICAgIHNiLndyaXRlKCdoYXNFeHRlcm5hbENvbnN0YW50Q29uc3RydWN0b3JDYWxsJyk7CiAgICAgIGNvbW1hID0gJywnOwogICAgfQogICAgaWYgKGhhc1R5cGVBcmd1bWVudHMpIHsKICAgICAgc2Iud3JpdGUoY29tbWEpOwogICAgICBzYi53cml0ZSgnaGFzVHlwZUFyZ3VtZW50cycpOwogICAgICBjb21tYSA9ICcsJzsKICAgIH0KICAgIGlmIChoYXNBcmd1bWVudERlZmF1bHRpbmcpIHsKICAgICAgc2Iud3JpdGUoY29tbWEpOwogICAgICBzYi53cml0ZSgnaGFzQXJndW1lbnREZWZhdWx0aW5nJyk7CiAgICAgIGNvbW1hID0gJywnOwogICAgfQogICAgaWYgKGhhc0Nhc3QpIHsKICAgICAgc2Iud3JpdGUoY29tbWEpOwogICAgICBzYi53cml0ZSgnaGFzQ2FzdCcpOwogICAgICBjb21tYSA9ICcsJzsKICAgIH0KICAgIGlmIChoYXNJZikgewogICAgICBzYi53cml0ZShjb21tYSk7CiAgICAgIHNiLndyaXRlKCdoYXNJZicpOwogICAgICBjb21tYSA9ICcsJzsKICAgIH0KICAgIGlmIChhcmd1bWVudENvdW50cy5pc05vdEVtcHR5KSB7CiAgICAgIHNiLndyaXRlKGNvbW1hKTsKICAgICAgc2Iud3JpdGUoJ2FyZ3VtZW50Q291bnRzPXske2FyZ3VtZW50Q291bnRzLmpvaW4oJywnKX19Jyk7CiAgICAgIGNvbW1hID0gJywnOwogICAgfQogICAgc2Iud3JpdGUoY29tbWEpOwogICAgc2Iud3JpdGUoJ3JlZ3VsYXJOb2RlQ291bnQ9JHJlZ3VsYXJOb2RlQ291bnQsJyk7CiAgICBzYi53cml0ZSgnY2FsbENvdW50PSRjYWxsQ291bnQsJyk7CiAgICBzYi53cml0ZSgncmVkdWN0aXZlTm9kZUNvdW50PSRyZWR1Y3RpdmVOb2RlQ291bnQnKTsKICAgIHNiLndyaXRlKCcpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCmNsYXNzIElubGluZURhdGFDYWNoZSB7CiAgZmluYWwgYm9vbCBlbmFibGVVc2VyQXNzZXJ0aW9uczsKICBmaW5hbCBib29sIG9taXRJbXBsaWNpdENhc3RzOwoKICBJbmxpbmVEYXRhQ2FjaGUoCiAgICAgIHt0aGlzLmVuYWJsZVVzZXJBc3NlcnRpb25zOiBmYWxzZSwgdGhpcy5vbWl0SW1wbGljaXRDYXN0czogZmFsc2V9KTsKCiAgTWFwPEZ1bmN0aW9uRW50aXR5LCBJbmxpbmVEYXRhPiBfY2FjaGUgPSB7fTsKCiAgSW5saW5lRGF0YSBnZXRJbmxpbmVEYXRhKEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKSB7CiAgICByZXR1cm4gX2NhY2hlW2Z1bmN0aW9uXSA/Pz0gSW5saW5lV2VlZGVyLmNvbXB1dGVJbmxpbmVEYXRhKAogICAgICAgIGVsZW1lbnRNYXAsIGZ1bmN0aW9uLAogICAgICAgIGVuYWJsZVVzZXJBc3NlcnRpb25zOiBlbmFibGVVc2VyQXNzZXJ0aW9ucywKICAgICAgICBvbWl0SW1wbGljaXRDYXN0czogb21pdEltcGxpY2l0Q2FzdHMpOwogIH0KfQoKY2xhc3MgSW5saW5lV2VlZGVyIGV4dGVuZHMgaXIuVmlzaXRvciB7CiAgLy8gSW52YXJpYW50OiAqSU5TSURFX0xPT1AqID4gKk9VVFNJREVfTE9PUCoKICBzdGF0aWMgY29uc3QgSU5MSU5JTkdfTk9ERVNfT1VUU0lERV9MT09QID0gMTU7CiAgc3RhdGljIGNvbnN0IElOTElOSU5HX05PREVTX09VVFNJREVfTE9PUF9BUkdfRkFDVE9SID0gMzsKICBzdGF0aWMgY29uc3QgSU5MSU5JTkdfTk9ERVNfSU5TSURFX0xPT1AgPSAzNDsKICBzdGF0aWMgY29uc3QgSU5MSU5JTkdfTk9ERVNfSU5TSURFX0xPT1BfQVJHX0ZBQ1RPUiA9IDQ7CgogIGZpbmFsIGJvb2wgZW5hYmxlVXNlckFzc2VydGlvbnM7CiAgZmluYWwgYm9vbCBvbWl0SW1wbGljaXRDYXN0czsKCiAgZmluYWwgSW5saW5lRGF0YSBkYXRhID0gbmV3IElubGluZURhdGEoKTsKICBib29sIHNlZW5SZXR1cm4gPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgbm9kZS1jb3VudCBpcyBjb2xsZWN0b3IgdG8gZGV0ZXJtaW5lIGlmIGEgZnVuY3Rpb24gY2FuIGJlCiAgLy8vIGlubGluZWQuCiAgYm9vbCBjb3VudFJlZ3VsYXJOb2RlID0gdHJ1ZTsKCiAgLy8vIFdoZXRoZXIgbm9kZS1jb3VudCBpcyBjb2xsZWN0ZWQgdG8gZGV0ZXJtaW5lIGlmIGlubGluaW5nIGEgZnVuY3Rpb24gaXMKICAvLy8gdmVyeSBsaWtlbHkgdG8gcmVkdWNlIGNvZGUgc2l6ZS4KICAvLy8KICAvLy8gRm9yIHRoZSByZWR1Y3RpdmUgYW5hbHlzaXM6CiAgLy8vIFdlIGFsbG93IHRoZSBib2R5IHRvIGJlIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGwgdGhhdCBkb2VzIG5vdCBoYXZlIGFueSBtb3JlCiAgLy8vIGlucHV0cyB0aGFuIHRoZSBpbmxpbmVlLgogIC8vLwogIC8vLyBXZSBhbGxvdyB0aGUgYm9keSB0byBiZSB0aGUgcmV0dXJuIG9mIGFuICdlbGlnaWJsZScgY29uc3RhbnQuIEEgY29uc3RhbnQKICAvLy8gaXMgJ2VsaWdpYmxlJyBpZiBpdCBpcyBub3QgbGFyZ2UgKGUuZy4gYSBsb25nIHN0cmluZykuCiAgLy8vCiAgLy8vIFdlIHNraXAgJ2UgYXN7VHlwZUVycm9yfSBUJyB3aGVuIHRoZSBjaGVja3MgYXJlIG9taXR0ZWQuCiAgLy8KICAvLyBUT0RPKHNyYSk6IENvbnNpZGVyIHNsaWdodGx5IGV4cGFuc2l2ZSBzaW1wbGUgY29uc3RydWN0b3JzIHdoZXJlIGFsbCB3ZQogIC8vIGdhaW4gaXMgYSAnbmV3JyBrZXl3b3JkLCBlLmcuIGBuZXcgWC5Gb28oYSlgIHZzIGBYLkZvbyQoYSlgLgogIC8vCiAgLy8gVE9ETygyNTIzMSk6IE1ha2UgbGFyZ2VyIHN0cmluZyBjb25zdGFudHMgZWxpZ2libGUgYnkgc2hhcmluZyByZWZlcmVuY2VzLgogIGJvb2wgY291bnRSZWR1Y3RpdmVOb2RlID0gdHJ1ZTsKCiAgSW5saW5lV2VlZGVyKAogICAgICB7dGhpcy5lbmFibGVVc2VyQXNzZXJ0aW9uczogZmFsc2UsIHRoaXMub21pdEltcGxpY2l0Q2FzdHM6IGZhbHNlfSk7CgogIHN0YXRpYyBJbmxpbmVEYXRhIGNvbXB1dGVJbmxpbmVEYXRhKAogICAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwKICAgICAge2Jvb2wgZW5hYmxlVXNlckFzc2VydGlvbnM6IGZhbHNlLCBib29sIG9taXRJbXBsaWNpdENhc3RzOiBmYWxzZX0pIHsKICAgIElubGluZVdlZWRlciB2aXNpdG9yID0gbmV3IElubGluZVdlZWRlcigKICAgICAgICBlbmFibGVVc2VyQXNzZXJ0aW9uczogZW5hYmxlVXNlckFzc2VydGlvbnMsCiAgICAgICAgb21pdEltcGxpY2l0Q2FzdHM6IG9taXRJbXBsaWNpdENhc3RzKTsKICAgIGlyLkZ1bmN0aW9uTm9kZSBub2RlID0gZ2V0RnVuY3Rpb25Ob2RlKGVsZW1lbnRNYXAsIGZ1bmN0aW9uKTsKICAgIG5vZGUuYWNjZXB0KHZpc2l0b3IpOwogICAgaWYgKGZ1bmN0aW9uLmlzQ29uc3RydWN0b3IpIHsKICAgICAgdmlzaXRvci5kYXRhLmlzQ29uc3RydWN0b3IgPSB0cnVlOwogICAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPSBlbGVtZW50TWFwLmdldE1lbWJlckRlZmluaXRpb24oZnVuY3Rpb24pOwogICAgICB2aXNpdG9yLnNraXBSZWR1Y3RpdmVOb2RlcygoKSB7CiAgICAgICAgaXIuTm9kZSBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICAgIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgICAgICB2aXNpdG9yLnZpc2l0TGlzdChub2RlLmluaXRpYWxpemVycyk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiB2aXNpdG9yLmRhdGE7CiAgfQoKICB2b2lkIHNraXBSZWd1bGFyTm9kZXModm9pZCBmKCkpIHsKICAgIGJvb2wgb2xkQ291bnRSZWd1bGFyTm9kZSA9IGNvdW50UmVndWxhck5vZGU7CiAgICBjb3VudFJlZ3VsYXJOb2RlID0gZmFsc2U7CiAgICBmKCk7CiAgICBjb3VudFJlZ3VsYXJOb2RlID0gb2xkQ291bnRSZWd1bGFyTm9kZTsKICB9CgogIHZvaWQgc2tpcFJlZHVjdGl2ZU5vZGVzKHZvaWQgZigpKSB7CiAgICBib29sIG9sZENvdW50UmVkdWN0aXZlTm9kZSA9IGNvdW50UmVkdWN0aXZlTm9kZTsKICAgIGNvdW50UmVkdWN0aXZlTm9kZSA9IGZhbHNlOwogICAgZigpOwogICAgY291bnRSZWR1Y3RpdmVOb2RlID0gb2xkQ291bnRSZWR1Y3RpdmVOb2RlOwogIH0KCiAgdm9pZCByZWdpc3RlclJlZ3VsYXJOb2RlKCkgewogICAgaWYgKGNvdW50UmVndWxhck5vZGUpIHsKICAgICAgZGF0YS5yZWd1bGFyTm9kZUNvdW50Kys7CiAgICAgIGlmIChzZWVuUmV0dXJuKSB7CiAgICAgICAgZGF0YS5jb2RlQWZ0ZXJSZXR1cm4gPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHJlZ2lzdGVyUmVkdWN0aXZlTm9kZSgpIHsKICAgIGlmIChjb3VudFJlZHVjdGl2ZU5vZGUpIHsKICAgICAgZGF0YS5yZWR1Y3RpdmVOb2RlQ291bnQrKzsKICAgICAgaWYgKHNlZW5SZXR1cm4pIHsKICAgICAgICBkYXRhLmNvZGVBZnRlclJldHVybiA9IHRydWU7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgdW5yZWdpc3RlclJlZHVjdGl2ZU5vZGUoKSB7CiAgICBpZiAoY291bnRSZWR1Y3RpdmVOb2RlKSB7CiAgICAgIGRhdGEucmVkdWN0aXZlTm9kZUNvdW50LS07CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0KGlyLk5vZGUgbm9kZSkgPT4gbm9kZT8uYWNjZXB0KHRoaXMpOwoKICB2b2lkIHZpc2l0TGlzdChMaXN0PGlyLk5vZGU+IG5vZGVzKSB7CiAgICBmb3IgKGlyLk5vZGUgbm9kZSBpbiBub2RlcykgewogICAgICB2aXNpdChub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGRlZmF1bHROb2RlKGlyLk5vZGUgbm9kZSkgewogICAgcmVnaXN0ZXJSZWd1bGFyTm9kZSgpOwogICAgcmVnaXN0ZXJSZWR1Y3RpdmVOb2RlKCk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbnN0YW50RXhwcmVzc2lvbihpci5Db25zdGFudEV4cHJlc3Npb24gbm9kZSkgewogICAgcmVnaXN0ZXJSZWd1bGFyTm9kZSgpOwogICAgcmVnaXN0ZXJSZWR1Y3RpdmVOb2RlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFJldHVyblN0YXRlbWVudChpci5SZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogICAgcmVnaXN0ZXJSZWd1bGFyTm9kZSgpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgc2VlblJldHVybiA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFRocm93KGlyLlRocm93IG5vZGUpIHsKICAgIHJlZ2lzdGVyUmVndWxhck5vZGUoKTsKICAgIGRhdGEuaGFzVGhyb3cgPSB0cnVlOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgX2hhbmRsZUxvb3AoaXIuTm9kZSBub2RlKSB7CiAgICAvLyBJdCdzIGFjdHVhbGx5IG5vdCBkaWZmaWN1bHQgdG8gaW5saW5lIGEgbWV0aG9kIHdpdGggYSBsb29wLCBidXQgb3VyCiAgICAvLyBtZWFzdXJlbWVudHMgc2hvdyB0aGF0IGl0J3MgY3VycmVudGx5IGJldHRlciB0byBub3QgaW5saW5lIGEgbWV0aG9kIHRoYXQKICAgIC8vIGNvbnRhaW5zIGEgbG9vcC4KICAgIGRhdGEuaGFzTG9vcCA9IHRydWU7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZvclN0YXRlbWVudChpci5Gb3JTdGF0ZW1lbnQgbm9kZSkgewogICAgX2hhbmRsZUxvb3Aobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZvckluU3RhdGVtZW50KGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIF9oYW5kbGVMb29wKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRXaGlsZVN0YXRlbWVudChpci5XaGlsZVN0YXRlbWVudCBub2RlKSB7CiAgICBfaGFuZGxlTG9vcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RG9TdGF0ZW1lbnQoaXIuRG9TdGF0ZW1lbnQgbm9kZSkgewogICAgX2hhbmRsZUxvb3Aobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFRyeUNhdGNoKGlyLlRyeUNhdGNoIG5vZGUpIHsKICAgIGRhdGEuaGFzVHJ5ID0gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHJ5RmluYWxseShpci5UcnlGaW5hbGx5IG5vZGUpIHsKICAgIGRhdGEuaGFzVHJ5ID0gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKGlyLkZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZWdpc3RlclJlZ3VsYXJOb2RlKCk7CiAgICBkYXRhLmhhc0Nsb3N1cmUgPSB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgewogICAgcmVnaXN0ZXJSZWd1bGFyTm9kZSgpOwogICAgZGF0YS5oYXNDbG9zdXJlID0gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RnVuY3Rpb25Ob2RlKGlyLkZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBpZiAobm9kZS5hc3luY01hcmtlciAhPSBpci5Bc3luY01hcmtlci5TeW5jKSB7CiAgICAgIGRhdGEuaGFzQXN5bmNBd2FpdCA9IHRydWU7CiAgICB9CiAgICAvLyBUT0RPKHNyYSk6IENvc3Qgb2YgcGFyYW1ldGVyIGNoZWNraW5nPwogICAgc2tpcFJlZHVjdGl2ZU5vZGVzKCgpIHsKICAgICAgdmlzaXRMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgICB2aXNpdExpc3Qobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycyk7CiAgICAgIHZpc2l0TGlzdChub2RlLm5hbWVkUGFyYW1ldGVycyk7CiAgICAgIHZpc2l0KG5vZGUucmV0dXJuVHlwZSk7CiAgICB9KTsKICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihpci5Db25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewogICAgLy8gSGV1cmlzdGljOiBJbiAicGFyYW1ldGVyID8gQSA6IEIiIHRoZXJlIGlzIGEgaGlnaCBwcm9iYWJpbGl0eSB0aGF0CiAgICAvLyBwYXJhbWV0ZXIgaXMgYSBjb25zdGFudC4gQXNzdW1pbmcgdGhlIHBhcmFtZXRlciBpcyBjb25zdGFudCwgd2UgY2FuCiAgICAvLyBjb21wdXRlIGEgY291bnQgdGhhdCBpcyBib3VuZGVkIGJ5IHRoZSBsYXJnZXN0IGFybSByYXRoZXIgdGhhbiB0aGUgc3VtIG9mCiAgICAvLyBib3RoIGFybXMuCiAgICBpci5FeHByZXNzaW9uIGNvbmRpdGlvbiA9IG5vZGUuY29uZGl0aW9uOwogICAgdmlzaXQoY29uZGl0aW9uKTsKICAgIGludCBjb21tb25QcmVmaXhDb3VudCA9IGRhdGEucmVndWxhck5vZGVDb3VudDsKCiAgICB2aXNpdChub2RlLnRoZW4pOwogICAgaW50IHRoZW5Db3VudCA9IGRhdGEucmVndWxhck5vZGVDb3VudCAtIGNvbW1vblByZWZpeENvdW50OwoKICAgIGRhdGEucmVndWxhck5vZGVDb3VudCA9IGNvbW1vblByZWZpeENvdW50OwogICAgdmlzaXQobm9kZS5vdGhlcndpc2UpOwogICAgaW50IGVsc2VDb3VudCA9IGRhdGEucmVndWxhck5vZGVDb3VudCAtIGNvbW1vblByZWZpeENvdW50OwoKICAgIGRhdGEucmVndWxhck5vZGVDb3VudCA9IGNvbW1vblByZWZpeENvdW50ICsgdGhlbkNvdW50ICsgZWxzZUNvdW50OwogICAgaWYgKGNvbmRpdGlvbiBpcyBpci5WYXJpYWJsZUdldCAmJgogICAgICAgIGNvbmRpdGlvbi52YXJpYWJsZS5wYXJlbnQgaXMgaXIuRnVuY3Rpb25Ob2RlKSB7CiAgICAgIGRhdGEucmVndWxhck5vZGVDb3VudCA9CiAgICAgICAgICBjb21tb25QcmVmaXhDb3VudCArICh0aGVuQ291bnQgPiBlbHNlQ291bnQgPyB0aGVuQ291bnQgOiBlbHNlQ291bnQpOwogICAgfQogICAgLy8gVGhpcyBpcyBsYXN0IHNvIHRoYXQgW3Rvb0RpZmZpY3VsdF0gaXMgYWx3YXlzIHVwZGF0ZWQuCiAgICByZWdpc3RlclJlZ3VsYXJOb2RlKCk7CiAgICByZWdpc3RlclJlZHVjdGl2ZU5vZGUoKTsKICAgIHNraXBSZWd1bGFyTm9kZXMoKCkgPT4gdmlzaXQobm9kZS5zdGF0aWNUeXBlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEFzc2VydEluaXRpYWxpemVyKGlyLkFzc2VydEluaXRpYWxpemVyIG5vZGUpIHsKICAgIGlmICghZW5hYmxlVXNlckFzc2VydGlvbnMpIHJldHVybjsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QXNzZXJ0U3RhdGVtZW50KGlyLkFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoIWVuYWJsZVVzZXJBc3NlcnRpb25zKSByZXR1cm47CiAgICBkZWZhdWx0Tm9kZShub2RlKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJDYWxsKCkgewogICAgKytkYXRhLmNhbGxDb3VudDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RW1wdHlTdGF0ZW1lbnQoaXIuRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewogICAgcmVnaXN0ZXJSZWd1bGFyTm9kZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KGlyLkV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgcmVnaXN0ZXJSZWd1bGFyTm9kZSgpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRCbG9jayhpci5CbG9jayBub2RlKSB7CiAgICByZWdpc3RlclJlZ3VsYXJOb2RlKCk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0cmluZ0xpdGVyYWwoaXIuU3RyaW5nTGl0ZXJhbCBub2RlKSB7CiAgICByZWdpc3RlclJlZ3VsYXJOb2RlKCk7CiAgICByZWdpc3RlclJlZHVjdGl2ZU5vZGUoKTsKICAgIC8vIEF2b2lkIGNvcHlpbmcgbG9uZyBzdHJpbmdzIGludG8gY2FsbCBzaXRlLgogICAgaWYgKG5vZGUudmFsdWUubGVuZ3RoID4gMTQpIHsKICAgICAgZGF0YS5oYXNMb25nU3RyaW5nID0gdHJ1ZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0UHJvcGVydHlHZXQoaXIuUHJvcGVydHlHZXQgbm9kZSkgewogICAgcmVnaXN0ZXJDYWxsKCk7CiAgICByZWdpc3RlclJlZ3VsYXJOb2RlKCk7CiAgICByZWdpc3RlclJlZHVjdGl2ZU5vZGUoKTsKICAgIHNraXBSZWR1Y3RpdmVOb2RlcygoKSA9PiB2aXNpdChub2RlLm5hbWUpKTsKICAgIHZpc2l0KG5vZGUucmVjZWl2ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREaXJlY3RQcm9wZXJ0eUdldChpci5EaXJlY3RQcm9wZXJ0eUdldCBub2RlKSB7CiAgICByZWdpc3RlckNhbGwoKTsKICAgIHJlZ2lzdGVyUmVndWxhck5vZGUoKTsKICAgIHJlZ2lzdGVyUmVkdWN0aXZlTm9kZSgpOwogICAgdmlzaXQobm9kZS5yZWNlaXZlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb3BlcnR5U2V0KGlyLlByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHJlZ2lzdGVyQ2FsbCgpOwogICAgcmVnaXN0ZXJSZWd1bGFyTm9kZSgpOwogICAgcmVnaXN0ZXJSZWR1Y3RpdmVOb2RlKCk7CiAgICBza2lwUmVkdWN0aXZlTm9kZXMoKCkgPT4gdmlzaXQobm9kZS5uYW1lKSk7CiAgICB2aXNpdChub2RlLnJlY2VpdmVyKTsKICAgIHZpc2l0KG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChpci5EaXJlY3RQcm9wZXJ0eVNldCBub2RlKSB7CiAgICByZWdpc3RlckNhbGwoKTsKICAgIHJlZ2lzdGVyUmVndWxhck5vZGUoKTsKICAgIHJlZ2lzdGVyUmVkdWN0aXZlTm9kZSgpOwogICAgdmlzaXQobm9kZS5yZWNlaXZlcik7CiAgICB2aXNpdChub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VmFyaWFibGVHZXQoaXIuVmFyaWFibGVHZXQgbm9kZSkgewogICAgcmVnaXN0ZXJSZWd1bGFyTm9kZSgpOwogICAgcmVnaXN0ZXJSZWR1Y3RpdmVOb2RlKCk7CiAgICBza2lwUmVkdWN0aXZlTm9kZXMoKCkgPT4gdmlzaXQobm9kZS5wcm9tb3RlZFR5cGUpKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VGhpc0V4cHJlc3Npb24oaXIuVGhpc0V4cHJlc3Npb24gbm9kZSkgewogICAgcmVnaXN0ZXJSZWd1bGFyTm9kZSgpOwogICAgcmVnaXN0ZXJSZWR1Y3RpdmVOb2RlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY0dldChpci5TdGF0aWNHZXQgbm9kZSkgewogICAgLy8gQXNzdW1lIGxhenktaW5pdCBzdGF0aWMsIGxvYWRlZCB2aWEgYSBjYWxsOiBgJC4kZ2V0JGZvbygpYC4KICAgIHJlZ2lzdGVyQ2FsbCgpOwogICAgcmVnaXN0ZXJSZWd1bGFyTm9kZSgpOwogICAgcmVnaXN0ZXJSZWR1Y3RpdmVOb2RlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihpci5Db25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgcmVnaXN0ZXJSZWd1bGFyTm9kZSgpOwogICAgcmVnaXN0ZXJSZWR1Y3RpdmVOb2RlKCk7CiAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIC8vIEEgY29uc3QgY29uc3RydWN0b3IgY2FsbCBjb21waWxlcyB0byBhIGNvbnN0YW50IHBvb2wgcmVmZXJlbmNlLgogICAgICBza2lwUmVkdWN0aXZlTm9kZXMoKCkgPT4gbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlZ2lzdGVyQ2FsbCgpOwogICAgICBfcHJvY2Vzc0FyZ3VtZW50cyhub2RlLmFyZ3VtZW50cywgbm9kZS50YXJnZXQ/LmZ1bmN0aW9uKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3RhdGljSW52b2NhdGlvbihpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHJlZ2lzdGVyUmVndWxhck5vZGUoKTsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgZGF0YS5oYXNFeHRlcm5hbENvbnN0YW50Q29uc3RydWN0b3JDYWxsID0gdHJ1ZTsKICAgICAgc2tpcFJlZHVjdGl2ZU5vZGVzKCgpID0+IG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKSk7CiAgICB9IGVsc2UgewogICAgICByZWdpc3RlckNhbGwoKTsKICAgICAgcmVnaXN0ZXJSZWR1Y3RpdmVOb2RlKCk7CiAgICAgIF9wcm9jZXNzQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzLCBub2RlLnRhcmdldD8uZnVuY3Rpb24pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRNZXRob2RJbnZvY2F0aW9uKGlyLk1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgcmVnaXN0ZXJSZWd1bGFyTm9kZSgpOwogICAgcmVnaXN0ZXJSZWR1Y3RpdmVOb2RlKCk7CiAgICByZWdpc3RlckNhbGwoKTsKICAgIHZpc2l0KG5vZGUucmVjZWl2ZXIpOwogICAgc2tpcFJlZHVjdGl2ZU5vZGVzKCgpID0+IHZpc2l0KG5vZGUubmFtZSkpOwogICAgX3Byb2Nlc3NBcmd1bWVudHMobm9kZS5hcmd1bWVudHMsIG51bGwpOwogIH0KCiAgX3Byb2Nlc3NBcmd1bWVudHMoaXIuQXJndW1lbnRzIGFyZ3VtZW50cywgaXIuRnVuY3Rpb25Ob2RlIHRhcmdldCkgewogICAgcmVnaXN0ZXJSZWd1bGFyTm9kZSgpOwogICAgaWYgKGFyZ3VtZW50cy50eXBlcy5pc05vdEVtcHR5KSB7CiAgICAgIGRhdGEuaGFzVHlwZUFyZ3VtZW50cyA9IHRydWU7CiAgICAgIHNraXBSZWR1Y3RpdmVOb2RlcygoKSA9PiB2aXNpdExpc3QoYXJndW1lbnRzLnR5cGVzKSk7CiAgICB9CiAgICBpbnQgY291bnQgPSBhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggKyBhcmd1bWVudHMubmFtZWQubGVuZ3RoOwogICAgZGF0YS5hcmd1bWVudENvdW50cy5hZGQoY291bnQpOwoKICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewogICAgICAvLyBEaXNhbGxvdyBkZWZhdWx0ZWQgb3B0aW9uYWwgYXJndW1lbnRzIHNpbmNlIHRoZXkgd2lsbCBiZSBwYXNzZWQKICAgICAgLy8gZXhwbGljaXRseS4KICAgICAgaWYgKHRhcmdldC5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggKyB0YXJnZXQubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCA+CiAgICAgICAgICBjb3VudCkgewogICAgICAgIGRhdGEuaGFzQXJndW1lbnREZWZhdWx0aW5nID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIHZpc2l0TGlzdChhcmd1bWVudHMucG9zaXRpb25hbCk7CiAgICBmb3IgKGlyLk5hbWVkRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGFyZ3VtZW50cy5uYW1lZCkgewogICAgICByZWdpc3RlclJlZ3VsYXJOb2RlKCk7CiAgICAgIGV4cHJlc3Npb24udmFsdWUuYWNjZXB0KHRoaXMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRBc0V4cHJlc3Npb24oaXIuQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJlZ2lzdGVyUmVndWxhck5vZGUoKTsKICAgIHZpc2l0KG5vZGUub3BlcmFuZCk7CiAgICBza2lwUmVkdWN0aXZlTm9kZXMoKCkgPT4gdmlzaXQobm9kZS50eXBlKSk7CiAgICBpZiAoIShub2RlLmlzVHlwZUVycm9yICYmIG9taXRJbXBsaWNpdENhc3RzKSkgewogICAgICBkYXRhLmhhc0Nhc3QgPSB0cnVlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgcmVnaXN0ZXJSZWd1bGFyTm9kZSgpOwogICAgc2tpcFJlZHVjdGl2ZU5vZGVzKCgpIHsKICAgICAgdmlzaXRMaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgICB2aXNpdChub2RlLnR5cGUpOwogICAgfSk7CiAgICB2aXNpdChub2RlLmluaXRpYWxpemVyKTsKCiAgICAvLyBBIGxvY2FsIHZhcmlhYmxlIGlzIGFuIGFsaWFzIGZvciB0aGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbi4KICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgdW5yZWdpc3RlclJlZHVjdGl2ZU5vZGUoKTsgLy8gZGlzY291bnQgb25lIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUuCiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdElmU3RhdGVtZW50KGlyLklmU3RhdGVtZW50IG5vZGUpIHsKICAgIHJlZ2lzdGVyUmVndWxhck5vZGUoKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIGRhdGEuaGFzSWYgPSB0cnVlOwogIH0KfQqcggBOTjwBOCgBGhk2HyI/IyAcJCEhITEhKCEqGh4+KywuKzUpKzZDMzgnJzUiHBoZKiM6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SRVPEysIBgElPR0lBgQBDCwbGTA0GwYEAQw6GxwjGAgdAUQkTAYEAQwqGx4XBAIBLHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9idWlsZGVyX2tlcm5lbC5kYXJ0LHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NzYS90eXBlcy5kYXJ0i0svLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBDb21tb25FbGVtZW50czsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CgpjbGFzcyBBYnN0cmFjdFZhbHVlRmFjdG9yeSB7CiAgc3RhdGljIEFic3RyYWN0VmFsdWUgaW5mZXJyZWRSZXR1cm5UeXBlRm9yRWxlbWVudCgKICAgICAgRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cykgewogICAgcmV0dXJuIHJlc3VsdHMucmVzdWx0T2ZNZW1iZXIoZWxlbWVudCkucmV0dXJuVHlwZSA/PwogICAgICAgIHJlc3VsdHMuY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZTsKICB9CgogIHN0YXRpYyBBYnN0cmFjdFZhbHVlIGluZmVycmVkVHlwZUZvck1lbWJlcigKICAgICAgTWVtYmVyRW50aXR5IGVsZW1lbnQsIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMpIHsKICAgIHJldHVybiByZXN1bHRzLnJlc3VsdE9mTWVtYmVyKGVsZW1lbnQpLnR5cGUgPz8KICAgICAgICByZXN1bHRzLmNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgfQoKICBzdGF0aWMgQWJzdHJhY3RWYWx1ZSBpbmZlcnJlZFR5cGVGb3JQYXJhbWV0ZXIoCiAgICAgIExvY2FsIGVsZW1lbnQsIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMpIHsKICAgIHJldHVybiByZXN1bHRzLnJlc3VsdE9mUGFyYW1ldGVyKGVsZW1lbnQpID8/CiAgICAgICAgcmVzdWx0cy5jbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogIH0KCiAgc3RhdGljIEFic3RyYWN0VmFsdWUgaW5mZXJyZWRSZXN1bHRUeXBlRm9yU2VsZWN0b3IoU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXIsIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMpIHsKICAgIHJldHVybiByZXN1bHRzLnJlc3VsdFR5cGVPZlNlbGVjdG9yKHNlbGVjdG9yLCByZWNlaXZlcikgPz8KICAgICAgICByZXN1bHRzLmNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgfQoKICBzdGF0aWMgQWJzdHJhY3RWYWx1ZSBmcm9tTmF0aXZlQmVoYXZpb3IoCiAgICAgIE5hdGl2ZUJlaGF2aW9yIG5hdGl2ZUJlaGF2aW9yLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiA9IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CiAgICB2YXIgdHlwZXNSZXR1cm5lZCA9IG5hdGl2ZUJlaGF2aW9yLnR5cGVzUmV0dXJuZWQ7CiAgICBpZiAodHlwZXNSZXR1cm5lZC5pc0VtcHR5KSByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZTsKCiAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cyA9IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzOwoKICAgIC8vIFt0eXBlXSBpcyBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgW0RhcnRUeXBlXSBvciBzcGVjaWFsIG9iamVjdHMKICAgIC8vIGxpa2UgW25hdGl2ZS5TcGVjaWFsVHlwZS5Kc09iamVjdF0uCiAgICBBYnN0cmFjdFZhbHVlIGZyb21OYXRpdmVUeXBlKGR5bmFtaWMgdHlwZSkgewogICAgICBpZiAodHlwZSA9PSBTcGVjaWFsVHlwZS5Kc09iamVjdCkgewogICAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAgIC5jcmVhdGVOb25OdWxsRXhhY3QoY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpOwogICAgICB9IGVsc2UgaWYgKHR5cGUuaXNWb2lkKSB7CiAgICAgICAgcmV0dXJuIGFic3RyYWN0VmFsdWVEb21haW4ubnVsbFR5cGU7CiAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0R5bmFtaWMpIHsKICAgICAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZTsKICAgICAgfSBlbHNlIGlmICh0eXBlID09IGNvbW1vbkVsZW1lbnRzLm51bGxUeXBlKSB7CiAgICAgICAgcmV0dXJuIGFic3RyYWN0VmFsdWVEb21haW4ubnVsbFR5cGU7CiAgICAgIH0gZWxzZSBpZiAodHlwZS50cmVhdEFzRHluYW1pYykgewogICAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxTdWJ0eXBlKHR5cGUuZWxlbWVudCk7CiAgICAgIH0KICAgIH0KCiAgICBBYnN0cmFjdFZhbHVlIHJlc3VsdCA9CiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi51bmlvbk9mTWFueSh0eXBlc1JldHVybmVkLm1hcChmcm9tTmF0aXZlVHlwZSkpOwogICAgYXNzZXJ0KGFic3RyYWN0VmFsdWVEb21haW4uaXNFbXB0eShyZXN1bHQpLmlzUG90ZW50aWFsbHlGYWxzZSwKICAgICAgICAiVW5leHBlY3RlZCBlbXB0eSByZXR1cm4gdmFsdWUgZm9yICRuYXRpdmVCZWhhdmlvci4iKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CkkATk48ATYkMSEiMioBHTVEOT0EAS5CMz0EATE7MT0EAUhEPz0EAStBTzZHAUABRSsxKiM9IC0jMDQtKDAPRwgGARtMQz8TBAIBI3BhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS90eXBlcy5kYXJ0M3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX21vZGVsL2Nsb3N1cmUuZGFydMAAq70vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy9leHByZXNzaW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9uYW1lcy5kYXJ0JyBzaG93IE5hbWU7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaXIvY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9pci9lbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICcuLi9pci9zdGF0aWNfdHlwZV9jYWNoZS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2Vudi5kYXJ0JzsKaW1wb3J0ICcuLi9vcmRlcmVkX3R5cGVzZXQuZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3NzYS90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnZWxlbWVudHMuZGFydCc7CmltcG9ydCAnanNfd29ybGRfYnVpbGRlci5kYXJ0JyBzaG93IEpzQ2xvc2VkV29ybGRCdWlsZGVyOwppbXBvcnQgJ2xvY2Fscy5kYXJ0JzsKCmNsYXNzIENsb3N1cmVEYXRhSW1wbCBpbXBsZW1lbnRzIENsb3N1cmVEYXRhIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0Nsb3N1cmVEYXRhXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2Nsb3N1cmUtZGF0YSc7CgogIGZpbmFsIEpzVG9FbGVtZW50TWFwIF9lbGVtZW50TWFwOwoKICAvLy8gTWFwIG9mIHRoZSBzY29waW5nIGluZm9ybWF0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGVudGl0eS4KICBmaW5hbCBNYXA8TWVtYmVyRW50aXR5LCBTY29wZUluZm8+IF9zY29wZU1hcDsKICBmaW5hbCBNYXA8aXIuVHJlZU5vZGUsIENhcHR1cmVkU2NvcGU+IF9jYXB0dXJlZFNjb3Blc01hcDsKICAvLyBJbmRpY2F0ZXMgdGhlIHR5cGUgdmFyaWFibGVzIChpZiBhbnkpIHRoYXQgYXJlIGNhcHR1cmVkIGluIGEgZ2l2ZW4KICAvLyBTaWduYXR1cmUgZnVuY3Rpb24uCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgQ2FwdHVyZWRTY29wZT4gX2NhcHR1cmVkU2NvcGVGb3JTaWduYXR1cmVNYXA7CgogIGZpbmFsIE1hcDxpci5Mb2NhbEZ1bmN0aW9uLCBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvPgogICAgICBfbG9jYWxDbG9zdXJlUmVwcmVzZW50YXRpb25NYXA7CgogIENsb3N1cmVEYXRhSW1wbCh0aGlzLl9lbGVtZW50TWFwLCB0aGlzLl9zY29wZU1hcCwgdGhpcy5fY2FwdHVyZWRTY29wZXNNYXAsCiAgICAgIHRoaXMuX2NhcHR1cmVkU2NvcGVGb3JTaWduYXR1cmVNYXAsIHRoaXMuX2xvY2FsQ2xvc3VyZVJlcHJlc2VudGF0aW9uTWFwKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtDbG9zdXJlRGF0YV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBDbG9zdXJlRGF0YUltcGwucmVhZEZyb21EYXRhU291cmNlKAogICAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IHNoYXJlZCBbU2NvcGVJbmZvXS4KICAgIE1hcDxNZW1iZXJFbnRpdHksIFNjb3BlSW5mbz4gc2NvcGVNYXAgPSBzb3VyY2UucmVhZE1lbWJlck1hcCgKICAgICAgICAoTWVtYmVyRW50aXR5IG1lbWJlcikgPT4gbmV3IFNjb3BlSW5mby5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKSk7CiAgICBNYXA8aXIuVHJlZU5vZGUsIENhcHR1cmVkU2NvcGU+IGNhcHR1cmVkU2NvcGVzTWFwID0gc291cmNlCiAgICAgICAgLnJlYWRUcmVlTm9kZU1hcCgoKSA9PiBuZXcgQ2FwdHVyZWRTY29wZS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKSk7CiAgICBNYXA8TWVtYmVyRW50aXR5LCBDYXB0dXJlZFNjb3BlPiBjYXB0dXJlZFNjb3BlRm9yU2lnbmF0dXJlTWFwID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlck1hcCgoTWVtYmVyRW50aXR5IG1lbWJlcikgPT4KICAgICAgICAgICAgbmV3IENhcHR1cmVkU2NvcGUucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSkpOwogICAgTWFwPGlyLkxvY2FsRnVuY3Rpb24sIENsb3N1cmVSZXByZXNlbnRhdGlvbkluZm8+CiAgICAgICAgbG9jYWxDbG9zdXJlUmVwcmVzZW50YXRpb25NYXAgPSBzb3VyY2UucmVhZFRyZWVOb2RlTWFwKAogICAgICAgICAgICAoKSA9PiBuZXcgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mby5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IENsb3N1cmVEYXRhSW1wbChlbGVtZW50TWFwLCBzY29wZU1hcCwgY2FwdHVyZWRTY29wZXNNYXAsCiAgICAgICAgY2FwdHVyZWRTY29wZUZvclNpZ25hdHVyZU1hcCwgbG9jYWxDbG9zdXJlUmVwcmVzZW50YXRpb25NYXApOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbQ2xvc3VyZURhdGFdIHRvIFtzaW5rXS4KICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVyTWFwKF9zY29wZU1hcCwKICAgICAgICAoTWVtYmVyRW50aXR5IG1lbWJlciwgU2NvcGVJbmZvIGluZm8pID0+IGluZm8ud3JpdGVUb0RhdGFTaW5rKHNpbmspKTsKICAgIHNpbmsud3JpdGVUcmVlTm9kZU1hcChfY2FwdHVyZWRTY29wZXNNYXAsIChDYXB0dXJlZFNjb3BlIHNjb3BlKSB7CiAgICAgIHNjb3BlLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIH0pOwogICAgc2luay53cml0ZU1lbWJlck1hcCgKICAgICAgICBfY2FwdHVyZWRTY29wZUZvclNpZ25hdHVyZU1hcCwKICAgICAgICAoTWVtYmVyRW50aXR5IG1lbWJlciwgQ2FwdHVyZWRTY29wZSBzY29wZSkgPT4KICAgICAgICAgICAgc2NvcGUud3JpdGVUb0RhdGFTaW5rKHNpbmspKTsKICAgIHNpbmsud3JpdGVUcmVlTm9kZU1hcChfbG9jYWxDbG9zdXJlUmVwcmVzZW50YXRpb25NYXAsCiAgICAgICAgKENsb3N1cmVSZXByZXNlbnRhdGlvbkluZm8gaW5mbykgewogICAgICBpbmZvLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIH0pOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFNjb3BlSW5mbyBnZXRTY29wZUluZm8oTWVtYmVyRW50aXR5IGVudGl0eSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgY2hlY2sgd2hlbiBjb25zdHJ1Y3RvciBib2RpZXMgYSBjcmVhdGVkCiAgICAvLyBlYWdlcmx5IHdpdGggdGhlIEotbW9kZWw7IGEgY29uc3RydWN0b3IgYm9keSBzaG91bGQgaGF2ZSBpdCdzIG93bgogICAgLy8gW0Nsb3N1cmVSZXByZXNlbnRhdGlvbkluZm9dLgogICAgaWYgKGVudGl0eSBpcyBDb25zdHJ1Y3RvckJvZHlFbnRpdHkpIHsKICAgICAgQ29uc3RydWN0b3JCb2R5RW50aXR5IGNvbnN0cnVjdG9yQm9keSA9IGVudGl0eTsKICAgICAgZW50aXR5ID0gY29uc3RydWN0b3JCb2R5LmNvbnN0cnVjdG9yOwogICAgfQoKICAgIFNjb3BlSW5mbyBzY29wZUluZm8gPSBfc2NvcGVNYXBbZW50aXR5XTsKICAgIGFzc2VydCgKICAgICAgICBzY29wZUluZm8gIT0gbnVsbCwgZmFpbGVkQXQoZW50aXR5LCAiTWlzc2luZyBzY29wZSBpbmZvIGZvciAkZW50aXR5LiIpKTsKICAgIHJldHVybiBzY29wZUluZm87CiAgfQoKICAvLyBUT0RPKGVmb3J0dW5hKTogRXZlbnR1YWxseSBjYXB0dXJlZFNjb3Blc01hcFtub2RlXSBzaG91bGQgYWx3YXlzCiAgLy8gYmUgbm9uLW51bGwsIGFuZCB3ZSBzaG91bGQganVzdCB0ZXN0IHRoYXQgd2l0aCBhbiBhc3NlcnQuCiAgQG92ZXJyaWRlCiAgQ2FwdHVyZWRTY29wZSBnZXRDYXB0dXJlZFNjb3BlKE1lbWJlckVudGl0eSBlbnRpdHkpIHsKICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9IF9lbGVtZW50TWFwLmdldE1lbWJlckRlZmluaXRpb24oZW50aXR5KTsKICAgIHN3aXRjaCAoZGVmaW5pdGlvbi5raW5kKSB7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3I6CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvckJvZHk6CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jbG9zdXJlQ2FsbDoKICAgICAgICByZXR1cm4gX2NhcHR1cmVkU2NvcGVzTWFwW2RlZmluaXRpb24ubm9kZV0gPz8gY29uc3QgQ2FwdHVyZWRTY29wZSgpOwogICAgICBjYXNlIE1lbWJlcktpbmQuc2lnbmF0dXJlOgogICAgICAgIHJldHVybiBfY2FwdHVyZWRTY29wZUZvclNpZ25hdHVyZU1hcFtlbnRpdHldID8/IGNvbnN0IENhcHR1cmVkU2NvcGUoKTsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBmYWlsZWRBdChlbnRpdHksICJVbmV4cGVjdGVkIG1lbWJlciBkZWZpbml0aW9uICRkZWZpbml0aW9uIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICAvLyBUT0RPKGVmb3J0dW5hKTogRXZlbnR1YWxseSBjYXB0dXJlZFNjb3Blc01hcFtub2RlXSBzaG91bGQgYWx3YXlzCiAgLy8gYmUgbm9uLW51bGwsIGFuZCB3ZSBzaG91bGQganVzdCB0ZXN0IHRoYXQgd2l0aCBhbiBhc3NlcnQuCiAgQ2FwdHVyZWRMb29wU2NvcGUgZ2V0Q2FwdHVyZWRMb29wU2NvcGUoaXIuTm9kZSBsb29wTm9kZSkgPT4KICAgICAgX2NhcHR1cmVkU2NvcGVzTWFwW2xvb3BOb2RlXSA/PyBjb25zdCBDYXB0dXJlZExvb3BTY29wZSgpOwoKICBAb3ZlcnJpZGUKICBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvIGdldENsb3N1cmVJbmZvKGlyLkxvY2FsRnVuY3Rpb24gbm9kZSkgewogICAgdmFyIGNsb3N1cmUgPSBfbG9jYWxDbG9zdXJlUmVwcmVzZW50YXRpb25NYXBbbm9kZV07CiAgICBhc3NlcnQoCiAgICAgICAgY2xvc3VyZSAhPSBudWxsLAogICAgICAgICJDb3JyZXNwb25kaW5nIGNsb3N1cmUgY2xhc3Mgbm90IGZvdW5kIGZvciAkbm9kZS4gIgogICAgICAgICJDbG9zdXJlcyBmb3VuZCBmb3IgJHtfbG9jYWxDbG9zdXJlUmVwcmVzZW50YXRpb25NYXAua2V5c30iKTsKICAgIHJldHVybiBjbG9zdXJlOwogIH0KfQoKLy8vIENsb3N1cmUgY29udmVyc2lvbiBjb2RlIHVzaW5nIG91ciBuZXcgRW50aXR5IG1vZGVsLiBDbG9zdXJlIGNvbnZlcnNpb24gaXMKLy8vIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBzZW1hbnRpY3Mgb2YgY2xvc3VyZXMgYXJlIHNsaWdodGx5IGRpZmZlcmVudCBpbiBEYXJ0Ci8vLyB0aGFuIEphdmFTY3JpcHQuIENsb3N1cmUgY29udmVyc2lvbiBpcyBzZXBhcmF0ZWQgb3V0IGludG8gdHdvIHBoYXNlczoKLy8vIGdlbmVyYXRpb24gb2YgYSBuZXcgKHRlbXBvcmFyeSkgcmVwcmVzZW50YXRpb24gdG8gc3RvcmUgd2hlcmUgdmFyaWFibGVzIG5lZWQKLy8vIHRvIGJlIGhvaXN0ZWQvY2FwdHVyZWQgdXAgYXQgYW5vdGhlciBsZXZlbCB0byByZS13cml0ZSB0aGUgY2xvc3VyZSwgYW5kIHRoZW4KLy8vIHRoZSBjb2RlIGdlbmVyYXRpb24gcGhhc2Ugd2hlcmUgd2UgZ2VuZXJhdGUgZWxlbWVudHMgYW5kL29yIGluc3RydWN0aW9ucyB0bwovLy8gcmVwcmVzZW50IHRoaXMgbmV3IGNvZGUgcGF0aC4KLy8vCi8vLyBGb3IgYSBnZW5lcmFsIGV4cGxhbmF0aW9uIG9mIGhvdyBjbG9zdXJlIGNvbnZlcnNpb24gd29ya3MgYXQgYSBoaWdoIGxldmVsLAovLy8gY2hlY2sgb3V0OgovLy8gaHR0cDovL3NpZWsuYmxvZ3Nwb3QuY29tLzIwMTIvMDcvZXNzZW5jZS1vZi1jbG9zdXJlLWNvbnZlcnNpb24uaHRtbCBvcgovLy8gaHR0cDovL21hdHQubWlnaHQubmV0L2FydGljbGVzL2Nsb3N1cmUtY29udmVyc2lvbi8uCgpjbGFzcyBDbG9zdXJlRGF0YUJ1aWxkZXIgewogIGZpbmFsIEpzVG9FbGVtZW50TWFwIF9lbGVtZW50TWFwOwogIGZpbmFsIEdsb2JhbExvY2Fsc01hcCBfZ2xvYmFsTG9jYWxzTWFwOwogIGZpbmFsIEFubm90YXRpb25zRGF0YSBfYW5ub3RhdGlvbnNEYXRhOwoKICAvLy8gTWFwIG9mIHRoZSBzY29waW5nIGluZm9ybWF0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGVudGl0eS4KICBNYXA8TWVtYmVyRW50aXR5LCBTY29wZUluZm8+IF9zY29wZU1hcCA9IHt9OwogIE1hcDxpci5UcmVlTm9kZSwgQ2FwdHVyZWRTY29wZT4gX2NhcHR1cmVkU2NvcGVzTWFwID0ge307CiAgLy8gSW5kaWNhdGVzIHRoZSB0eXBlIHZhcmlhYmxlcyAoaWYgYW55KSB0aGF0IGFyZSBjYXB0dXJlZCBpbiBhIGdpdmVuCiAgLy8gU2lnbmF0dXJlIGZ1bmN0aW9uLgogIE1hcDxNZW1iZXJFbnRpdHksIENhcHR1cmVkU2NvcGU+IF9jYXB0dXJlZFNjb3BlRm9yU2lnbmF0dXJlTWFwID0ge307CgogIE1hcDxpci5Mb2NhbEZ1bmN0aW9uLCBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvPgogICAgICBfbG9jYWxDbG9zdXJlUmVwcmVzZW50YXRpb25NYXAgPSB7fTsKCiAgQ2xvc3VyZURhdGFCdWlsZGVyKAogICAgICB0aGlzLl9lbGVtZW50TWFwLCB0aGlzLl9nbG9iYWxMb2NhbHNNYXAsIHRoaXMuX2Fubm90YXRpb25zRGF0YSk7CgogIHZvaWQgX3VwZGF0ZVNjb3BlQmFzZWRPblJ0aU5lZWQoS2VybmVsU2NvcGVJbmZvIHNjb3BlLCBDbG9zdXJlUnRpTmVlZCBydGlOZWVkLAogICAgICBNZW1iZXJFbnRpdHkgb3V0ZXJtb3N0RW50aXR5KSB7CiAgICBib29sIGluY2x1ZGVGb3JSdGkoU2V0PFZhcmlhYmxlVXNlPiB1c2VTZXQpIHsKICAgICAgZm9yIChWYXJpYWJsZVVzZSB1c2FnZSBpbiB1c2VTZXQpIHsKICAgICAgICBzd2l0Y2ggKHVzYWdlLmtpbmQpIHsKICAgICAgICAgIGNhc2UgVmFyaWFibGVVc2VLaW5kLmV4cGxpY2l0OgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZhcmlhYmxlVXNlS2luZC5pbXBsaWNpdENhc3Q6CiAgICAgICAgICAgIGlmIChfYW5ub3RhdGlvbnNEYXRhCiAgICAgICAgICAgICAgICAuZ2V0SW1wbGljaXREb3duY2FzdENoZWNrUG9saWN5KG91dGVybW9zdEVudGl0eSkKICAgICAgICAgICAgICAgIC5pc0VtaXR0ZWQpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgVmFyaWFibGVVc2VLaW5kLmxvY2FsVHlwZToKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZhcmlhYmxlVXNlS2luZC5jb25zdHJ1Y3RvclR5cGVBcmd1bWVudDoKICAgICAgICAgICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPQogICAgICAgICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0Q29uc3RydWN0b3IodXNhZ2UubWVtYmVyKTsKICAgICAgICAgICAgaWYgKHJ0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3MpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZhcmlhYmxlVXNlS2luZC5zdGF0aWNUeXBlQXJndW1lbnQ6CiAgICAgICAgICAgIEZ1bmN0aW9uRW50aXR5IG1ldGhvZCA9IF9lbGVtZW50TWFwLmdldE1ldGhvZCh1c2FnZS5tZW1iZXIpOwogICAgICAgICAgICBpZiAocnRpTmVlZC5tZXRob2ROZWVkc1R5cGVBcmd1bWVudHMobWV0aG9kKSkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWYXJpYWJsZVVzZUtpbmQuaW5zdGFuY2VUeXBlQXJndW1lbnQ6CiAgICAgICAgICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gX2VsZW1lbnRNYXAuZ2V0U2VsZWN0b3IodXNhZ2UuaW52b2NhdGlvbik7CiAgICAgICAgICAgIGlmIChydGlOZWVkLnNlbGVjdG9yTmVlZHNUeXBlQXJndW1lbnRzKHNlbGVjdG9yKSkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWYXJpYWJsZVVzZUtpbmQubG9jYWxUeXBlQXJndW1lbnQ6CiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFdlIHNob3VsZCBiZSBhYmxlIHRvIHRyYWNrIGRpcmVjdCBsb2NhbAogICAgICAgICAgICAvLyBmdW5jdGlvbiBpbnZvY2F0aW9ucyBhbmQgbm90IGhhdmUgdG8gdXNlIHRoZSBzZWxlY3RvciBoZXJlLgogICAgICAgICAgICBTZWxlY3RvciBzZWxlY3RvciA9IF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKHVzYWdlLmludm9jYXRpb24pOwogICAgICAgICAgICBpZiAocnRpTmVlZC5sb2NhbEZ1bmN0aW9uTmVlZHNUeXBlQXJndW1lbnRzKHVzYWdlLmxvY2FsRnVuY3Rpb24pIHx8CiAgICAgICAgICAgICAgICBydGlOZWVkLnNlbGVjdG9yTmVlZHNUeXBlQXJndW1lbnRzKHNlbGVjdG9yKSkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWYXJpYWJsZVVzZUtpbmQubWVtYmVyUGFyYW1ldGVyOgogICAgICAgICAgICBpZiAoX2Fubm90YXRpb25zRGF0YQogICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlckNoZWNrUG9saWN5KG91dGVybW9zdEVudGl0eSkKICAgICAgICAgICAgICAgIC5pc0VtaXR0ZWQpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBGdW5jdGlvbkVudGl0eSBtZXRob2QgPSBfZWxlbWVudE1hcC5nZXRNZXRob2QodXNhZ2UubWVtYmVyKTsKICAgICAgICAgICAgICBpZiAocnRpTmVlZC5tZXRob2ROZWVkc1NpZ25hdHVyZShtZXRob2QpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZhcmlhYmxlVXNlS2luZC5sb2NhbFBhcmFtZXRlcjoKICAgICAgICAgICAgaWYgKF9hbm5vdGF0aW9uc0RhdGEKICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXJDaGVja1BvbGljeShvdXRlcm1vc3RFbnRpdHkpCiAgICAgICAgICAgICAgICAuaXNFbWl0dGVkKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocnRpTmVlZAogICAgICAgICAgICAgICAgLmxvY2FsRnVuY3Rpb25OZWVkc1NpZ25hdHVyZSh1c2FnZS5sb2NhbEZ1bmN0aW9uKSkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWYXJpYWJsZVVzZUtpbmQubWVtYmVyUmV0dXJuVHlwZToKICAgICAgICAgICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0gX2VsZW1lbnRNYXAuZ2V0TWV0aG9kKHVzYWdlLm1lbWJlcik7CiAgICAgICAgICAgIGlmIChydGlOZWVkLm1ldGhvZE5lZWRzU2lnbmF0dXJlKG1ldGhvZCkpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgVmFyaWFibGVVc2VLaW5kLmxvY2FsUmV0dXJuVHlwZToKICAgICAgICAgICAgaWYgKHJ0aU5lZWQubG9jYWxGdW5jdGlvbk5lZWRzU2lnbmF0dXJlKHVzYWdlLmxvY2FsRnVuY3Rpb24pKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZhcmlhYmxlVXNlS2luZC5maWVsZFR5cGU6CiAgICAgICAgICAgIGlmIChfYW5ub3RhdGlvbnNEYXRhCiAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyQ2hlY2tQb2xpY3kob3V0ZXJtb3N0RW50aXR5KQogICAgICAgICAgICAgICAgLmlzRW1pdHRlZCkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWYXJpYWJsZVVzZUtpbmQubGlzdExpdGVyYWw6CiAgICAgICAgICAgIGlmIChydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKAogICAgICAgICAgICAgICAgX2VsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzKSkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWYXJpYWJsZVVzZUtpbmQuc2V0TGl0ZXJhbDoKICAgICAgICAgICAgaWYgKHJ0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50cy5zZXRMaXRlcmFsQ2xhc3MpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZhcmlhYmxlVXNlS2luZC5tYXBMaXRlcmFsOgogICAgICAgICAgICBpZiAocnRpTmVlZC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cygKICAgICAgICAgICAgICAgIF9lbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzLm1hcExpdGVyYWxDbGFzcykpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgVmFyaWFibGVVc2VLaW5kLmluc3RhbnRpYXRpb25UeXBlQXJndW1lbnQ6CiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uCiAgICAgICAgICAgIGlmIChydGlOZWVkLmluc3RhbnRpYXRpb25OZWVkc1R5cGVBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBudWxsLCB1c2FnZS5pbnN0YW50aWF0aW9uLnR5cGVBcmd1bWVudHMubGVuZ3RoKSkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKGluY2x1ZGVGb3JSdGkoc2NvcGUudGhpc1VzZWRBc0ZyZWVWYXJpYWJsZUlmTmVlZHNSdGkpKSB7CiAgICAgIHNjb3BlLnRoaXNVc2VkQXNGcmVlVmFyaWFibGUgPSB0cnVlOwogICAgfQogICAgc2NvcGUuZnJlZVZhcmlhYmxlc0ZvclJ0aS5mb3JFYWNoKAogICAgICAgIChUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQgdHlwZVZhcmlhYmxlLCBTZXQ8VmFyaWFibGVVc2U+IHVzZVNldCkgewogICAgICBpZiAoaW5jbHVkZUZvclJ0aSh1c2VTZXQpKSB7CiAgICAgICAgc2NvcGUuZnJlZVZhcmlhYmxlcy5hZGQodHlwZVZhcmlhYmxlKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBDbG9zdXJlRGF0YSBjcmVhdGVDbG9zdXJlRW50aXRpZXMoCiAgICAgIEpzQ2xvc2VkV29ybGRCdWlsZGVyIGNsb3NlZFdvcmxkQnVpbGRlciwKICAgICAgTWFwPE1lbWJlckVudGl0eSwgQ2xvc3VyZVNjb3BlTW9kZWw+IGNsb3N1cmVNb2RlbHMsCiAgICAgIENsb3N1cmVSdGlOZWVkIHJ0aU5lZWQsCiAgICAgIExpc3Q8RnVuY3Rpb25FbnRpdHk+IGNhbGxNZXRob2RzKSB7CiAgICBjbG9zdXJlTW9kZWxzLmZvckVhY2goKE1lbWJlckVudGl0eSBtZW1iZXIsIENsb3N1cmVTY29wZU1vZGVsIG1vZGVsKSB7CiAgICAgIEtlcm5lbFRvTG9jYWxzTWFwIGxvY2Fsc01hcCA9IF9nbG9iYWxMb2NhbHNNYXAuZ2V0TG9jYWxzTWFwKG1lbWJlcik7CiAgICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBhbGxCb3hlZFZhcmlhYmxlcyA9CiAgICAgICAgICBfZWxlbWVudE1hcC5tYWtlUmVjb3JkQ29udGFpbmVyKG1vZGVsLnNjb3BlSW5mbywgbWVtYmVyLCBsb2NhbHNNYXApOwogICAgICBfc2NvcGVNYXBbbWVtYmVyXSA9IG5ldyBKc1Njb3BlSW5mby5mcm9tKAogICAgICAgICAgYWxsQm94ZWRWYXJpYWJsZXMsIG1vZGVsLnNjb3BlSW5mbywgbG9jYWxzTWFwLCBfZWxlbWVudE1hcCk7CgogICAgICBtb2RlbC5jYXB0dXJlZFNjb3Blc01hcAogICAgICAgICAgLmZvckVhY2goKGlyLk5vZGUgbm9kZSwgS2VybmVsQ2FwdHVyZWRTY29wZSBzY29wZSkgewogICAgICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBib3hlZFZhcmlhYmxlcyA9CiAgICAgICAgICAgIF9lbGVtZW50TWFwLm1ha2VSZWNvcmRDb250YWluZXIoc2NvcGUsIG1lbWJlciwgbG9jYWxzTWFwKTsKICAgICAgICBfdXBkYXRlU2NvcGVCYXNlZE9uUnRpTmVlZChzY29wZSwgcnRpTmVlZCwgbWVtYmVyKTsKCiAgICAgICAgaWYgKHNjb3BlIGlzIEtlcm5lbENhcHR1cmVkTG9vcFNjb3BlKSB7CiAgICAgICAgICBfY2FwdHVyZWRTY29wZXNNYXBbbm9kZV0gPSBuZXcgSnNDYXB0dXJlZExvb3BTY29wZS5mcm9tKAogICAgICAgICAgICAgIGJveGVkVmFyaWFibGVzLCBzY29wZSwgbG9jYWxzTWFwLCBfZWxlbWVudE1hcCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9jYXB0dXJlZFNjb3Blc01hcFtub2RlXSA9IG5ldyBKc0NhcHR1cmVkU2NvcGUuZnJvbSgKICAgICAgICAgICAgICBib3hlZFZhcmlhYmxlcywgc2NvcGUsIGxvY2Fsc01hcCwgX2VsZW1lbnRNYXApOwogICAgICAgIH0KICAgICAgICBhbGxCb3hlZFZhcmlhYmxlcy5hZGRBbGwoYm94ZWRWYXJpYWJsZXMpOwogICAgICB9KTsKCiAgICAgIE1hcDxpci5Mb2NhbEZ1bmN0aW9uLCBLZXJuZWxTY29wZUluZm8+IGNsb3N1cmVzVG9HZW5lcmF0ZSA9CiAgICAgICAgICBtb2RlbC5jbG9zdXJlc1RvR2VuZXJhdGU7CiAgICAgIGZvciAoaXIuTG9jYWxGdW5jdGlvbiBub2RlIGluIGNsb3N1cmVzVG9HZW5lcmF0ZS5rZXlzKSB7CiAgICAgICAgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZSA9IG5vZGUuZnVuY3Rpb247CiAgICAgICAgS2VybmVsQ2xvc3VyZUNsYXNzSW5mbyBjbG9zdXJlQ2xhc3NJbmZvID0gX3Byb2R1Y2VTeW50aGV0aWNFbGVtZW50cygKICAgICAgICAgICAgY2xvc2VkV29ybGRCdWlsZGVyLAogICAgICAgICAgICBtZW1iZXIsCiAgICAgICAgICAgIGZ1bmN0aW9uTm9kZSwKICAgICAgICAgICAgY2xvc3VyZXNUb0dlbmVyYXRlW25vZGVdLAogICAgICAgICAgICBhbGxCb3hlZFZhcmlhYmxlcywKICAgICAgICAgICAgcnRpTmVlZCwKICAgICAgICAgICAgY3JlYXRlU2lnbmF0dXJlTWV0aG9kOgogICAgICAgICAgICAgICAgcnRpTmVlZC5sb2NhbEZ1bmN0aW9uTmVlZHNTaWduYXR1cmUoZnVuY3Rpb25Ob2RlLnBhcmVudCkpOwogICAgICAgIC8vIEFkZCBhbHNvIGZvciB0aGUgY2FsbCBtZXRob2QuCiAgICAgICAgX3Njb3BlTWFwW2Nsb3N1cmVDbGFzc0luZm8uY2FsbE1ldGhvZF0gPSBjbG9zdXJlQ2xhc3NJbmZvOwogICAgICAgIGlmIChjbG9zdXJlQ2xhc3NJbmZvLnNpZ25hdHVyZU1ldGhvZCAhPSBudWxsKSB7CiAgICAgICAgICBfc2NvcGVNYXBbY2xvc3VyZUNsYXNzSW5mby5zaWduYXR1cmVNZXRob2RdID0gY2xvc3VyZUNsYXNzSW5mbzsKCiAgICAgICAgICAvLyBTZXQgdXAgY2FwdHVyZWRTY29wZSBmb3Igc2lnbmF0dXJlIG1ldGhvZC4gVGhpcyBpcyBkaXN0aW5jdCBmcm9tCiAgICAgICAgICAvLyBfY2FwdHVyZWRTY29wZXNNYXAgYmVjYXVzZSB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIGlyLk5vZGUgZm9yCiAgICAgICAgICAvLyB0aGUgc2lnbmF0dXJlLgogICAgICAgICAgaWYgKHJ0aU5lZWQubG9jYWxGdW5jdGlvbk5lZWRzU2lnbmF0dXJlKGZ1bmN0aW9uTm9kZS5wYXJlbnQpICYmCiAgICAgICAgICAgICAgbW9kZWwuY2FwdHVyZWRTY29wZXNNYXBbZnVuY3Rpb25Ob2RlXSAhPSBudWxsKSB7CiAgICAgICAgICAgIEtlcm5lbENhcHR1cmVkU2NvcGUgY2FwdHVyZWRTY29wZSA9CiAgICAgICAgICAgICAgICBtb2RlbC5jYXB0dXJlZFNjb3Blc01hcFtmdW5jdGlvbk5vZGVdOwogICAgICAgICAgICBhc3NlcnQoY2FwdHVyZWRTY29wZSBpcyEgS2VybmVsQ2FwdHVyZWRMb29wU2NvcGUpOwogICAgICAgICAgICBLZXJuZWxDYXB0dXJlZFNjb3BlIHNpZ25hdHVyZUNhcHR1cmVkU2NvcGUgPQogICAgICAgICAgICAgICAgbmV3IEtlcm5lbENhcHR1cmVkU2NvcGUuZm9yU2lnbmF0dXJlKGNhcHR1cmVkU2NvcGUpOwogICAgICAgICAgICBfdXBkYXRlU2NvcGVCYXNlZE9uUnRpTmVlZChzaWduYXR1cmVDYXB0dXJlZFNjb3BlLCBydGlOZWVkLCBtZW1iZXIpOwogICAgICAgICAgICBfY2FwdHVyZWRTY29wZUZvclNpZ25hdHVyZU1hcFtjbG9zdXJlQ2xhc3NJbmZvLnNpZ25hdHVyZU1ldGhvZF0gPQogICAgICAgICAgICAgICAgbmV3IEpzQ2FwdHVyZWRTY29wZS5mcm9tKAogICAgICAgICAgICAgICAgICAgIHt9LCBzaWduYXR1cmVDYXB0dXJlZFNjb3BlLCBsb2NhbHNNYXAsIF9lbGVtZW50TWFwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2FsbE1ldGhvZHMuYWRkKGNsb3N1cmVDbGFzc0luZm8uY2FsbE1ldGhvZCk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIG5ldyBDbG9zdXJlRGF0YUltcGwoX2VsZW1lbnRNYXAsIF9zY29wZU1hcCwgX2NhcHR1cmVkU2NvcGVzTWFwLAogICAgICAgIF9jYXB0dXJlZFNjb3BlRm9yU2lnbmF0dXJlTWFwLCBfbG9jYWxDbG9zdXJlUmVwcmVzZW50YXRpb25NYXApOwogIH0KCiAgLy8vIEdpdmVuIHdoYXQgdmFyaWFibGVzIGFyZSBjYXB0dXJlZCBhdCBlYWNoIHBvaW50LCBjb25zdHJ1Y3QgY2xvc3VyZSBjbGFzc2VzCiAgLy8vIHdpdGggZmllbGRzIGNvbnRhaW5pbmcgdGhlIGNhcHR1cmVkIHZhcmlhYmxlcyB0byByZXBsaWNhdGUgdGhlIERhcnQKICAvLy8gY2xvc3VyZSBzZW1hbnRpY3MgaW4gSlMuIElmIHRoaXMgY2xvc3VyZSBjYXB0dXJlcyBhbnkgdmFyaWFibGVzIChtZWFuaW5nCiAgLy8vIHRoZSBjbG9zdXJlIGFjY2Vzc2VzIGEgdmFyaWFibGUgdGhhdCBnZXRzIGFjY2Vzc2VkIGF0IHNvbWUgcG9pbnQpLCB0aGVuCiAgLy8vIGJveEZvckNhcHR1cmVkVmFyaWFibGVzIHN0b3JlcyB0aGUgbG9jYWwgY29udGV4dCBmb3IgdGhvc2UgdmFyaWFibGVzLgogIC8vLyBJZiBubyB2YXJpYWJsZXMgYXJlIGNhcHR1cmVkLCB0aGlzIHBhcmFtZXRlciBpcyBudWxsLgogIEtlcm5lbENsb3N1cmVDbGFzc0luZm8gX3Byb2R1Y2VTeW50aGV0aWNFbGVtZW50cygKICAgICAgSnNDbG9zZWRXb3JsZEJ1aWxkZXIgY2xvc2VkV29ybGRCdWlsZGVyLAogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyLAogICAgICBpci5GdW5jdGlvbk5vZGUgbm9kZSwKICAgICAgS2VybmVsU2NvcGVJbmZvIGluZm8sCiAgICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBib3hlZFZhcmlhYmxlcywKICAgICAgQ2xvc3VyZVJ0aU5lZWQgcnRpTmVlZCwKICAgICAge2Jvb2wgY3JlYXRlU2lnbmF0dXJlTWV0aG9kfSkgewogICAgX3VwZGF0ZVNjb3BlQmFzZWRPblJ0aU5lZWQoaW5mbywgcnRpTmVlZCwgbWVtYmVyKTsKICAgIEtlcm5lbFRvTG9jYWxzTWFwIGxvY2Fsc01hcCA9IF9nbG9iYWxMb2NhbHNNYXAuZ2V0TG9jYWxzTWFwKG1lbWJlcik7CiAgICBLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvIGNsb3N1cmVDbGFzc0luZm8gPQogICAgICAgIGNsb3NlZFdvcmxkQnVpbGRlci5idWlsZENsb3N1cmVDbGFzcygKICAgICAgICAgICAgbWVtYmVyLCBub2RlLCBtZW1iZXIubGlicmFyeSwgYm94ZWRWYXJpYWJsZXMsIGluZm8sIGxvY2Fsc01hcCwKICAgICAgICAgICAgY3JlYXRlU2lnbmF0dXJlTWV0aG9kOiBjcmVhdGVTaWduYXR1cmVNZXRob2QpOwoKICAgIC8vIFdlIHdhbnQgdGhlIG9yaWdpbmFsIGRlY2xhcmF0aW9uIHdoZXJlIHRoYXQgZnVuY3Rpb24gaXMgdXNlZCB0byBwb2ludAogICAgLy8gdG8gdGhlIGNvcnJlY3QgY2xvc3VyZSBjbGFzcy4KICAgIF9nbG9iYWxMb2NhbHNNYXAuc2V0TG9jYWxzTWFwKGNsb3N1cmVDbGFzc0luZm8uY2FsbE1ldGhvZCwgbG9jYWxzTWFwKTsKICAgIGlmIChjbG9zdXJlQ2xhc3NJbmZvLnNpZ25hdHVyZU1ldGhvZCAhPSBudWxsKSB7CiAgICAgIF9nbG9iYWxMb2NhbHNNYXAuc2V0TG9jYWxzTWFwKAogICAgICAgICAgY2xvc3VyZUNsYXNzSW5mby5zaWduYXR1cmVNZXRob2QsIGxvY2Fsc01hcCk7CiAgICB9CiAgICBpZiAobm9kZS5wYXJlbnQgaXMgaXIuTWVtYmVyKSB7CiAgICAgIGFzc2VydChfZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZS5wYXJlbnQpID09IG1lbWJlcik7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQobm9kZS5wYXJlbnQgaXMgaXIuTG9jYWxGdW5jdGlvbik7CiAgICAgIF9sb2NhbENsb3N1cmVSZXByZXNlbnRhdGlvbk1hcFtub2RlLnBhcmVudF0gPSBjbG9zdXJlQ2xhc3NJbmZvOwogICAgfQogICAgcmV0dXJuIGNsb3N1cmVDbGFzc0luZm87CiAgfQp9CgovLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgb3IgY3JlYXRlIGEgTG9jYWwgdmFyaWFibGUgb3V0IG9mIGEgdmFyaWFibGUKLy8vIGRlY2xhcmF0aW9uIG9yIHR5cGUgcGFyYW1ldGVyLgpMb2NhbCBfZ2V0TG9jYWwoCiAgICBpci5Ob2RlIHZhcmlhYmxlLCBLZXJuZWxUb0xvY2Fsc01hcCBsb2NhbHNNYXAsIEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICBhc3NlcnQodmFyaWFibGUgaXMgaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB8fAogICAgICB2YXJpYWJsZSBpcyBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQpOwogIGlmICh2YXJpYWJsZSBpcyBpci5WYXJpYWJsZURlY2xhcmF0aW9uKSB7CiAgICByZXR1cm4gbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUodmFyaWFibGUpOwogIH0gZWxzZSBpZiAodmFyaWFibGUgaXMgVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0KSB7CiAgICByZXR1cm4gbG9jYWxzTWFwLmdldExvY2FsVHlwZVZhcmlhYmxlKHZhcmlhYmxlLnR5cGUsIGVsZW1lbnRNYXApOwogIH0KICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignT25seSBrbm93IGhvdyB0byBnZXQvY3JlYXRlIGxvY2FscyBmb3IgJwogICAgICAnVmFyaWFibGVEZWNsYXJhdGlvbnMgb3IgVHlwZVBhcmFtZXRlclR5cGVXaXRoQ29udGV4dC4gUmVjaWV2ZWQgJwogICAgICAnJHt2YXJpYWJsZS5ydW50aW1lVHlwZX0nKTsKfQoKY2xhc3MgSnNTY29wZUluZm8gZXh0ZW5kcyBTY29wZUluZm8gewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSnNTY29wZUluZm9dIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnc2NvcGUtaW5mbyc7CgogIGZpbmFsIEl0ZXJhYmxlPExvY2FsPiBsb2NhbHNVc2VkSW5UcnlPclN5bmM7CiAgQG92ZXJyaWRlCiAgZmluYWwgTG9jYWwgdGhpc0xvY2FsOwogIGZpbmFsIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBib3hlZFZhcmlhYmxlczsKCiAgLy8vIFRoZSBzZXQgb2YgdmFyaWFibGVzIHRoYXQgd2VyZSBkZWZpbmVkIGluIGFub3RoZXIgc2NvcGUsIGJ1dCBhcmUgdXNlZCBpbgogIC8vLyB0aGlzIHNjb3BlLgogIGZpbmFsIFNldDxMb2NhbD4gZnJlZVZhcmlhYmxlczsKCiAgSnNTY29wZUluZm8uaW50ZXJuYWwodGhpcy5sb2NhbHNVc2VkSW5UcnlPclN5bmMsIHRoaXMudGhpc0xvY2FsLAogICAgICB0aGlzLmJveGVkVmFyaWFibGVzLCB0aGlzLmZyZWVWYXJpYWJsZXMpOwoKICBKc1Njb3BlSW5mby5mcm9tKHRoaXMuYm94ZWRWYXJpYWJsZXMsIEtlcm5lbFNjb3BlSW5mbyBpbmZvLAogICAgICBLZXJuZWxUb0xvY2Fsc01hcCBsb2NhbHNNYXAsIEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApCiAgICAgIDogdGhpcy50aGlzTG9jYWwgPSBpbmZvLmhhc1RoaXNMb2NhbAogICAgICAgICAgICA/IG5ldyBUaGlzTG9jYWwobG9jYWxzTWFwLmN1cnJlbnRNZW1iZXIuZW5jbG9zaW5nQ2xhc3MpCiAgICAgICAgICAgIDogbnVsbCwKICAgICAgICB0aGlzLmxvY2Fsc1VzZWRJblRyeU9yU3luYyA9CiAgICAgICAgICAgIGluZm8ubG9jYWxzVXNlZEluVHJ5T3JTeW5jLm1hcChsb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZSkudG9TZXQoKSwKICAgICAgICB0aGlzLmZyZWVWYXJpYWJsZXMgPSBpbmZvLmZyZWVWYXJpYWJsZXMKICAgICAgICAgICAgLm1hcCgoaXIuTm9kZSBub2RlKSA9PiBfZ2V0TG9jYWwobm9kZSwgbG9jYWxzTWFwLCBlbGVtZW50TWFwKSkKICAgICAgICAgICAgLnRvU2V0KCkgewogICAgaWYgKGluZm8udGhpc1VzZWRBc0ZyZWVWYXJpYWJsZSkgewogICAgICB0aGlzLmZyZWVWYXJpYWJsZXMuYWRkKHRoaXMudGhpc0xvY2FsKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaEJveGVkVmFyaWFibGUoZihMb2NhbCBsb2NhbCwgRmllbGRFbnRpdHkgZmllbGQpKSB7CiAgICBib3hlZFZhcmlhYmxlcy5mb3JFYWNoKChMb2NhbCBsLCBKUmVjb3JkRmllbGQgYm94KSB7CiAgICAgIGYobCwgYm94KTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBsb2NhbElzVXNlZEluVHJ5T3JTeW5jKExvY2FsIHZhcmlhYmxlKSA9PgogICAgICBsb2NhbHNVc2VkSW5UcnlPclN5bmMuY29udGFpbnModmFyaWFibGUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgndGhpcz0kdGhpc0xvY2FsLCcpOwogICAgc2Iud3JpdGUoJ2xvY2Fsc1VzZWRJblRyeU9yU3luYz17JHtsb2NhbHNVc2VkSW5UcnlPclN5bmMuam9pbignLCAnKX19Jyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNCb3hlZFZhcmlhYmxlKExvY2FsIHZhcmlhYmxlKSA9PiBib3hlZFZhcmlhYmxlcy5jb250YWluc0tleSh2YXJpYWJsZSk7CgogIGZhY3RvcnkgSnNTY29wZUluZm8ucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIEl0ZXJhYmxlPExvY2FsPiBsb2NhbHNVc2VkSW5UcnlPclN5bmMgPSBzb3VyY2UucmVhZExvY2FscygpOwogICAgTG9jYWwgdGhpc0xvY2FsID0gc291cmNlLnJlYWRMb2NhbE9yTnVsbCgpOwogICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IGJveGVkVmFyaWFibGVzID0KICAgICAgICBzb3VyY2UucmVhZExvY2FsTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+KCgpID0+IHNvdXJjZS5yZWFkTWVtYmVyKCkpOwogICAgU2V0PExvY2FsPiBmcmVlVmFyaWFibGVzID0gc291cmNlLnJlYWRMb2NhbHMoKS50b1NldCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKc1Njb3BlSW5mby5pbnRlcm5hbCgKICAgICAgICBsb2NhbHNVc2VkSW5UcnlPclN5bmMsIHRoaXNMb2NhbCwgYm94ZWRWYXJpYWJsZXMsIGZyZWVWYXJpYWJsZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oU2NvcGVJbmZvS2luZC5zY29wZUluZm8pOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUxvY2Fscyhsb2NhbHNVc2VkSW5UcnlPclN5bmMpOwogICAgc2luay53cml0ZUxvY2FsT3JOdWxsKHRoaXNMb2NhbCk7CiAgICBzaW5rLndyaXRlTG9jYWxNYXAoYm94ZWRWYXJpYWJsZXMsIHNpbmsud3JpdGVNZW1iZXIpOwogICAgc2luay53cml0ZUxvY2FscyhmcmVlVmFyaWFibGVzKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQp9CgpjbGFzcyBKc0NhcHR1cmVkU2NvcGUgZXh0ZW5kcyBKc1Njb3BlSW5mbyBpbXBsZW1lbnRzIENhcHR1cmVkU2NvcGUgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSnNDYXB0dXJlZFNjb3BlXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2NhcHR1cmVkLXNjb3BlJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTG9jYWwgY29udGV4dDsKCiAgSnNDYXB0dXJlZFNjb3BlLmludGVybmFsKAogICAgICBJdGVyYWJsZTxMb2NhbD4gbG9jYWxzVXNlZEluVHJ5T3JTeW5jLAogICAgICBMb2NhbCB0aGlzTG9jYWwsCiAgICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBib3hlZFZhcmlhYmxlcywKICAgICAgU2V0PExvY2FsPiBmcmVlVmFyaWFibGVzLAogICAgICB0aGlzLmNvbnRleHQpCiAgICAgIDogc3VwZXIuaW50ZXJuYWwoCiAgICAgICAgICAgIGxvY2Fsc1VzZWRJblRyeU9yU3luYywgdGhpc0xvY2FsLCBib3hlZFZhcmlhYmxlcywgZnJlZVZhcmlhYmxlcyk7CgogIEpzQ2FwdHVyZWRTY29wZS5mcm9tKAogICAgICBNYXA8TG9jYWwsIEpSZWNvcmRGaWVsZD4gYm94ZWRWYXJpYWJsZXMsCiAgICAgIEtlcm5lbENhcHR1cmVkU2NvcGUgY2FwdHVyZWRTY29wZSwKICAgICAgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwLAogICAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwKQogICAgICA6IHRoaXMuY29udGV4dCA9CiAgICAgICAgICAgIGJveGVkVmFyaWFibGVzLmlzTm90RW1wdHkgPyBib3hlZFZhcmlhYmxlcy52YWx1ZXMuZmlyc3QuYm94IDogbnVsbCwKICAgICAgICBzdXBlci5mcm9tKGJveGVkVmFyaWFibGVzLCBjYXB0dXJlZFNjb3BlLCBsb2NhbHNNYXAsIGVsZW1lbnRNYXApOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCByZXF1aXJlc0NvbnRleHRCb3ggPT4gYm94ZWRWYXJpYWJsZXMuaXNOb3RFbXB0eTsKCiAgZmFjdG9yeSBKc0NhcHR1cmVkU2NvcGUucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIEl0ZXJhYmxlPExvY2FsPiBsb2NhbHNVc2VkSW5UcnlPclN5bmMgPSBzb3VyY2UucmVhZExvY2FscygpOwogICAgTG9jYWwgdGhpc0xvY2FsID0gc291cmNlLnJlYWRMb2NhbE9yTnVsbCgpOwogICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IGJveGVkVmFyaWFibGVzID0KICAgICAgICBzb3VyY2UucmVhZExvY2FsTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+KCgpID0+IHNvdXJjZS5yZWFkTWVtYmVyKCkpOwogICAgU2V0PExvY2FsPiBmcmVlVmFyaWFibGVzID0gc291cmNlLnJlYWRMb2NhbHMoKS50b1NldCgpOwogICAgTG9jYWwgY29udGV4dCA9IHNvdXJjZS5yZWFkTG9jYWxPck51bGwoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSnNDYXB0dXJlZFNjb3BlLmludGVybmFsKGxvY2Fsc1VzZWRJblRyeU9yU3luYywgdGhpc0xvY2FsLAogICAgICAgIGJveGVkVmFyaWFibGVzLCBmcmVlVmFyaWFibGVzLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKFNjb3BlSW5mb0tpbmQuY2FwdHVyZWRTY29wZSk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTG9jYWxzKGxvY2Fsc1VzZWRJblRyeU9yU3luYyk7CiAgICBzaW5rLndyaXRlTG9jYWxPck51bGwodGhpc0xvY2FsKTsKICAgIHNpbmsud3JpdGVMb2NhbE1hcChib3hlZFZhcmlhYmxlcywgc2luay53cml0ZU1lbWJlcik7CiAgICBzaW5rLndyaXRlTG9jYWxzKGZyZWVWYXJpYWJsZXMpOwogICAgc2luay53cml0ZUxvY2FsT3JOdWxsKGNvbnRleHQpOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIEpzQ2FwdHVyZWRMb29wU2NvcGUgZXh0ZW5kcyBKc0NhcHR1cmVkU2NvcGUgaW1wbGVtZW50cyBDYXB0dXJlZExvb3BTY29wZSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKc0NhcHR1cmVkTG9vcFNjb3BlXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2NhcHR1cmVkLWxvb3Atc2NvcGUnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBMaXN0PExvY2FsPiBib3hlZExvb3BWYXJpYWJsZXM7CgogIEpzQ2FwdHVyZWRMb29wU2NvcGUuaW50ZXJuYWwoCiAgICAgIEl0ZXJhYmxlPExvY2FsPiBsb2NhbHNVc2VkSW5UcnlPclN5bmMsCiAgICAgIExvY2FsIHRoaXNMb2NhbCwKICAgICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IGJveGVkVmFyaWFibGVzLAogICAgICBTZXQ8TG9jYWw+IGZyZWVWYXJpYWJsZXMsCiAgICAgIExvY2FsIGNvbnRleHQsCiAgICAgIHRoaXMuYm94ZWRMb29wVmFyaWFibGVzKQogICAgICA6IHN1cGVyLmludGVybmFsKGxvY2Fsc1VzZWRJblRyeU9yU3luYywgdGhpc0xvY2FsLCBib3hlZFZhcmlhYmxlcywKICAgICAgICAgICAgZnJlZVZhcmlhYmxlcywgY29udGV4dCk7CgogIEpzQ2FwdHVyZWRMb29wU2NvcGUuZnJvbSgKICAgICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IGJveGVkVmFyaWFibGVzLAogICAgICBLZXJuZWxDYXB0dXJlZExvb3BTY29wZSBjYXB0dXJlZFNjb3BlLAogICAgICBLZXJuZWxUb0xvY2Fsc01hcCBsb2NhbHNNYXAsCiAgICAgIEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApCiAgICAgIDogdGhpcy5ib3hlZExvb3BWYXJpYWJsZXMgPSBjYXB0dXJlZFNjb3BlLmJveGVkTG9vcFZhcmlhYmxlcwogICAgICAgICAgICAubWFwKGxvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKQogICAgICAgICAgICAudG9MaXN0KCksCiAgICAgICAgc3VwZXIuZnJvbShib3hlZFZhcmlhYmxlcywgY2FwdHVyZWRTY29wZSwgbG9jYWxzTWFwLCBlbGVtZW50TWFwKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaGFzQm94ZWRMb29wVmFyaWFibGVzID0+IGJveGVkTG9vcFZhcmlhYmxlcy5pc05vdEVtcHR5OwoKICBmYWN0b3J5IEpzQ2FwdHVyZWRMb29wU2NvcGUucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIEl0ZXJhYmxlPExvY2FsPiBsb2NhbHNVc2VkSW5UcnlPclN5bmMgPSBzb3VyY2UucmVhZExvY2FscygpOwogICAgTG9jYWwgdGhpc0xvY2FsID0gc291cmNlLnJlYWRMb2NhbE9yTnVsbCgpOwogICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IGJveGVkVmFyaWFibGVzID0KICAgICAgICBzb3VyY2UucmVhZExvY2FsTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+KCgpID0+IHNvdXJjZS5yZWFkTWVtYmVyKCkpOwogICAgU2V0PExvY2FsPiBmcmVlVmFyaWFibGVzID0gc291cmNlLnJlYWRMb2NhbHMoKS50b1NldCgpOwogICAgTG9jYWwgY29udGV4dCA9IHNvdXJjZS5yZWFkTG9jYWxPck51bGwoKTsKICAgIExpc3Q8TG9jYWw+IGJveGVkTG9vcFZhcmlhYmxlcyA9IHNvdXJjZS5yZWFkTG9jYWxzKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpzQ2FwdHVyZWRMb29wU2NvcGUuaW50ZXJuYWwobG9jYWxzVXNlZEluVHJ5T3JTeW5jLCB0aGlzTG9jYWwsCiAgICAgICAgYm94ZWRWYXJpYWJsZXMsIGZyZWVWYXJpYWJsZXMsIGNvbnRleHQsIGJveGVkTG9vcFZhcmlhYmxlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShTY29wZUluZm9LaW5kLmNhcHR1cmVkTG9vcFNjb3BlKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVMb2NhbHMobG9jYWxzVXNlZEluVHJ5T3JTeW5jKTsKICAgIHNpbmsud3JpdGVMb2NhbE9yTnVsbCh0aGlzTG9jYWwpOwogICAgc2luay53cml0ZUxvY2FsTWFwKGJveGVkVmFyaWFibGVzLCBzaW5rLndyaXRlTWVtYmVyKTsKICAgIHNpbmsud3JpdGVMb2NhbHMoZnJlZVZhcmlhYmxlcyk7CiAgICBzaW5rLndyaXRlTG9jYWxPck51bGwoY29udGV4dCk7CiAgICBzaW5rLndyaXRlTG9jYWxzKGJveGVkTG9vcFZhcmlhYmxlcyk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVuYW1lIHRoaXMgY2xhc3MuCi8vIFRPRE8oam9obm5pd2ludGhlcik6IEFkZCB1bml0dGVzdCBmb3IgdGhlIGNvbXB1dGVkIFtDbG9zdXJlQ2xhc3NdLgpjbGFzcyBLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvIGV4dGVuZHMgSnNTY29wZUluZm8KICAgIGltcGxlbWVudHMgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbyB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2Nsb3N1cmUtcmVwcmVzZW50YXRpb24taW5mbyc7CgogIEBvdmVycmlkZQogIEpGdW5jdGlvbiBjYWxsTWV0aG9kOwogIEBvdmVycmlkZQogIEpTaWduYXR1cmVNZXRob2Qgc2lnbmF0dXJlTWV0aG9kOwogIEBvdmVycmlkZQogIGZpbmFsIExvY2FsIGNsb3N1cmVFbnRpdHk7CiAgQG92ZXJyaWRlCiAgZmluYWwgTG9jYWwgdGhpc0xvY2FsOwogIEBvdmVycmlkZQogIGZpbmFsIEpDbGFzcyBjbG9zdXJlQ2xhc3NFbnRpdHk7CgogIGZpbmFsIE1hcDxMb2NhbCwgSkZpZWxkPiBsb2NhbFRvRmllbGRNYXA7CgogIEtlcm5lbENsb3N1cmVDbGFzc0luZm8uaW50ZXJuYWwoCiAgICAgIEl0ZXJhYmxlPExvY2FsPiBsb2NhbHNVc2VkSW5UcnlPclN5bmMsCiAgICAgIHRoaXMudGhpc0xvY2FsLAogICAgICBNYXA8TG9jYWwsIEpSZWNvcmRGaWVsZD4gYm94ZWRWYXJpYWJsZXMsCiAgICAgIFNldDxMb2NhbD4gZnJlZVZhcmlhYmxlcywKICAgICAgdGhpcy5jYWxsTWV0aG9kLAogICAgICB0aGlzLnNpZ25hdHVyZU1ldGhvZCwKICAgICAgdGhpcy5jbG9zdXJlRW50aXR5LAogICAgICB0aGlzLmNsb3N1cmVDbGFzc0VudGl0eSwKICAgICAgdGhpcy5sb2NhbFRvRmllbGRNYXApCiAgICAgIDogc3VwZXIuaW50ZXJuYWwoCiAgICAgICAgICAgIGxvY2Fsc1VzZWRJblRyeU9yU3luYywgdGhpc0xvY2FsLCBib3hlZFZhcmlhYmxlcywgZnJlZVZhcmlhYmxlcyk7CgogIEtlcm5lbENsb3N1cmVDbGFzc0luZm8uZnJvbVNjb3BlSW5mbygKICAgICAgdGhpcy5jbG9zdXJlQ2xhc3NFbnRpdHksCiAgICAgIGlyLkZ1bmN0aW9uTm9kZSBjbG9zdXJlU291cmNlTm9kZSwKICAgICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IGJveGVkVmFyaWFibGVzLAogICAgICBLZXJuZWxTY29wZUluZm8gaW5mbywKICAgICAgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwLAogICAgICB0aGlzLmNsb3N1cmVFbnRpdHksCiAgICAgIHRoaXMudGhpc0xvY2FsLAogICAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwKQogICAgICA6IGxvY2FsVG9GaWVsZE1hcCA9IG5ldyBNYXA8TG9jYWwsIEpGaWVsZD4oKSwKICAgICAgICBzdXBlci5mcm9tKGJveGVkVmFyaWFibGVzLCBpbmZvLCBsb2NhbHNNYXAsIGVsZW1lbnRNYXApOwoKICBmYWN0b3J5IEtlcm5lbENsb3N1cmVDbGFzc0luZm8ucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIEl0ZXJhYmxlPExvY2FsPiBsb2NhbHNVc2VkSW5UcnlPclN5bmMgPSBzb3VyY2UucmVhZExvY2FscygpOwogICAgTG9jYWwgdGhpc0xvY2FsID0gc291cmNlLnJlYWRMb2NhbE9yTnVsbCgpOwogICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IGJveGVkVmFyaWFibGVzID0KICAgICAgICBzb3VyY2UucmVhZExvY2FsTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+KCgpID0+IHNvdXJjZS5yZWFkTWVtYmVyKCkpOwogICAgU2V0PExvY2FsPiBmcmVlVmFyaWFibGVzID0gc291cmNlLnJlYWRMb2NhbHMoKS50b1NldCgpOwogICAgSkZ1bmN0aW9uIGNhbGxNZXRob2QgPSBzb3VyY2UucmVhZE1lbWJlcigpOwogICAgSlNpZ25hdHVyZU1ldGhvZCBzaWduYXR1cmVNZXRob2QgPSBzb3VyY2UucmVhZE1lbWJlck9yTnVsbCgpOwogICAgTG9jYWwgY2xvc3VyZUVudGl0eSA9IHNvdXJjZS5yZWFkTG9jYWxPck51bGwoKTsKICAgIEpDbGFzcyBjbG9zdXJlQ2xhc3NFbnRpdHkgPSBzb3VyY2UucmVhZENsYXNzKCk7CiAgICBNYXA8TG9jYWwsIEpGaWVsZD4gbG9jYWxUb0ZpZWxkTWFwID0KICAgICAgICBzb3VyY2UucmVhZExvY2FsTWFwKCgpID0+IHNvdXJjZS5yZWFkTWVtYmVyKCkpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvLmludGVybmFsKAogICAgICAgIGxvY2Fsc1VzZWRJblRyeU9yU3luYywKICAgICAgICB0aGlzTG9jYWwsCiAgICAgICAgYm94ZWRWYXJpYWJsZXMsCiAgICAgICAgZnJlZVZhcmlhYmxlcywKICAgICAgICBjYWxsTWV0aG9kLAogICAgICAgIHNpZ25hdHVyZU1ldGhvZCwKICAgICAgICBjbG9zdXJlRW50aXR5LAogICAgICAgIGNsb3N1cmVDbGFzc0VudGl0eSwKICAgICAgICBsb2NhbFRvRmllbGRNYXApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oU2NvcGVJbmZvS2luZC5jbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVMb2NhbHMobG9jYWxzVXNlZEluVHJ5T3JTeW5jKTsKICAgIHNpbmsud3JpdGVMb2NhbE9yTnVsbCh0aGlzTG9jYWwpOwogICAgc2luay53cml0ZUxvY2FsTWFwKGJveGVkVmFyaWFibGVzLCBzaW5rLndyaXRlTWVtYmVyKTsKICAgIHNpbmsud3JpdGVMb2NhbHMoZnJlZVZhcmlhYmxlcyk7CiAgICBzaW5rLndyaXRlTWVtYmVyKGNhbGxNZXRob2QpOwogICAgc2luay53cml0ZU1lbWJlck9yTnVsbChzaWduYXR1cmVNZXRob2QpOwogICAgc2luay53cml0ZUxvY2FsT3JOdWxsKGNsb3N1cmVFbnRpdHkpOwogICAgc2luay53cml0ZUNsYXNzKGNsb3N1cmVDbGFzc0VudGl0eSk7CiAgICBzaW5rLndyaXRlTG9jYWxNYXAobG9jYWxUb0ZpZWxkTWFwLCBzaW5rLndyaXRlTWVtYmVyKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PExvY2FsPiBnZXQgY3JlYXRlZEZpZWxkRW50aXRpZXMgPT4gbG9jYWxUb0ZpZWxkTWFwLmtleXMudG9MaXN0KCk7CgogIEBvdmVycmlkZQogIExvY2FsIGdldExvY2FsRm9yRmllbGQoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgIGZvciAoTG9jYWwgbG9jYWwgaW4gbG9jYWxUb0ZpZWxkTWFwLmtleXMpIHsKICAgICAgaWYgKGxvY2FsVG9GaWVsZE1hcFtsb2NhbF0gPT0gZmllbGQpIHsKICAgICAgICByZXR1cm4gbG9jYWw7CiAgICAgIH0KICAgIH0KICAgIGZhaWxlZEF0KGZpZWxkLCAiTm8gbG9jYWwgZm9yICRmaWVsZC4gT3B0aW9uczogJGxvY2FsVG9GaWVsZE1hcCIpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBGaWVsZEVudGl0eSBnZXQgdGhpc0ZpZWxkRW50aXR5ID0+IGxvY2FsVG9GaWVsZE1hcFt0aGlzTG9jYWxdOwoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hGcmVlVmFyaWFibGUoZihMb2NhbCB2YXJpYWJsZSwgSkZpZWxkIGZpZWxkKSkgewogICAgbG9jYWxUb0ZpZWxkTWFwLmZvckVhY2goZik7CiAgICBib3hlZFZhcmlhYmxlcy5mb3JFYWNoKGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDbG9zdXJlID0+IHRydWU7Cn0KCmNsYXNzIEpDbG9zdXJlQ2xhc3MgZXh0ZW5kcyBKQ2xhc3MgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSkNsb3N1cmVDbGFzc10gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjbG9zdXJlLWNsYXNzJzsKCiAgSkNsb3N1cmVDbGFzcyhKTGlicmFyeSBsaWJyYXJ5LCBTdHJpbmcgbmFtZSkKICAgICAgOiBzdXBlcihsaWJyYXJ5LCBuYW1lLCBpc0Fic3RyYWN0OiBmYWxzZSk7CgogIGZhY3RvcnkgSkNsb3N1cmVDbGFzcy5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgSkxpYnJhcnkgbGlicmFyeSA9IHNvdXJjZS5yZWFkTGlicmFyeSgpOwogICAgU3RyaW5nIG5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKQ2xvc3VyZUNsYXNzKGxpYnJhcnksIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSkNsYXNzS2luZC5jbG9zdXJlKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVMaWJyYXJ5KGxpYnJhcnkpOwogICAgc2luay53cml0ZVN0cmluZyhuYW1lKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Nsb3N1cmUgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7anNFbGVtZW50UHJlZml4fWNsb3N1cmVfY2xhc3MoJG5hbWUpJzsKfQoKY2xhc3MgQW5vbnltb3VzQ2xvc3VyZUxvY2FsIGltcGxlbWVudHMgTG9jYWwgewogIGZpbmFsIEpDbG9zdXJlQ2xhc3MgY2xvc3VyZUNsYXNzOwoKICBBbm9ueW1vdXNDbG9zdXJlTG9jYWwodGhpcy5jbG9zdXJlQ2xhc3MpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJyc7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gY2xvc3VyZUNsYXNzLmhhc2hDb2RlICogMTM7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgQW5vbnltb3VzQ2xvc3VyZUxvY2FsKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gY2xvc3VyZUNsYXNzID09IG90aGVyLmNsb3N1cmVDbGFzczsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICcke2pzRWxlbWVudFByZWZpeH1hbm9ueW1vdXNfY2xvc3VyZV9sb2NhbCgke2Nsb3N1cmVDbGFzcy5uYW1lfSknOwp9CgpjbGFzcyBKQ2xvc3VyZUZpZWxkIGV4dGVuZHMgSkZpZWxkIGltcGxlbWVudHMgUHJpdmF0ZWx5TmFtZWRKU0VudGl0eSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKQ2xvc3VyZUNsYXNzXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2Nsb3N1cmUtZmllbGQnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgZGVjbGFyZWROYW1lOwoKICBKQ2xvc3VyZUZpZWxkKAogICAgICBTdHJpbmcgbmFtZSwgS2VybmVsQ2xvc3VyZUNsYXNzSW5mbyBjb250YWluaW5nQ2xhc3MsIFN0cmluZyBkZWNsYXJlZE5hbWUsCiAgICAgIHtib29sIGlzQ29uc3QsIGJvb2wgaXNBc3NpZ25hYmxlfSkKICAgICAgOiB0aGlzLmludGVybmFsKAogICAgICAgICAgICBjb250YWluaW5nQ2xhc3MuY2xvc3VyZUNsYXNzRW50aXR5LmxpYnJhcnksCiAgICAgICAgICAgIGNvbnRhaW5pbmdDbGFzcy5jbG9zdXJlQ2xhc3NFbnRpdHksCiAgICAgICAgICAgIG5ldyBOYW1lKG5hbWUsIGNvbnRhaW5pbmdDbGFzcy5jbG9zdXJlQ2xhc3NFbnRpdHkubGlicmFyeSksCiAgICAgICAgICAgIGRlY2xhcmVkTmFtZSwKICAgICAgICAgICAgaXNBc3NpZ25hYmxlOiBpc0Fzc2lnbmFibGUsCiAgICAgICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBKQ2xvc3VyZUZpZWxkLmludGVybmFsKEpMaWJyYXJ5IGxpYnJhcnksIEpDbG9zdXJlQ2xhc3MgZW5jbG9zaW5nQ2xhc3MsCiAgICAgIE5hbWUgbWVtYmVyTmFtZSwgdGhpcy5kZWNsYXJlZE5hbWUsIHtib29sIGlzQ29uc3QsIGJvb2wgaXNBc3NpZ25hYmxlfSkKICAgICAgOiBzdXBlcihsaWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgbWVtYmVyTmFtZSwKICAgICAgICAgICAgaXNBc3NpZ25hYmxlOiBpc0Fzc2lnbmFibGUsIGlzQ29uc3Q6IGlzQ29uc3QsIGlzU3RhdGljOiBmYWxzZSk7CgogIGZhY3RvcnkgSkNsb3N1cmVGaWVsZC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgSkNsYXNzIGNscyA9IHNvdXJjZS5yZWFkQ2xhc3MoKTsKICAgIFN0cmluZyBuYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgIFN0cmluZyBkZWNsYXJlZE5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgYm9vbCBpc0NvbnN0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzQXNzaWduYWJsZSA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKQ2xvc3VyZUZpZWxkLmludGVybmFsKAogICAgICAgIGNscy5saWJyYXJ5LCBjbHMsIG5ldyBOYW1lKG5hbWUsIGNscy5saWJyYXJ5KSwgZGVjbGFyZWROYW1lLAogICAgICAgIGlzQXNzaWduYWJsZTogaXNBc3NpZ25hYmxlLCBpc0NvbnN0OiBpc0NvbnN0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJLaW5kLmNsb3N1cmVGaWVsZCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlQ2xhc3MoZW5jbG9zaW5nQ2xhc3MpOwogICAgc2luay53cml0ZVN0cmluZyhuYW1lKTsKICAgIHNpbmsud3JpdGVTdHJpbmcoZGVjbGFyZWROYW1lKTsKICAgIHNpbmsud3JpdGVCb29sKGlzQ29uc3QpOwogICAgc2luay53cml0ZUJvb2woaXNBc3NpZ25hYmxlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBFbnRpdHkgZ2V0IHJvb3RPZlNjb3BlID0+IGVuY2xvc2luZ0NsYXNzOwp9CgpjbGFzcyBSZWNvcmRDbGFzc0RhdGEgaW1wbGVtZW50cyBKQ2xhc3NEYXRhIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW1JlY29yZENsYXNzRGF0YV0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdyZWNvcmQtY2xhc3MtZGF0YSc7CgogIEBvdmVycmlkZQogIGZpbmFsIENsYXNzRGVmaW5pdGlvbiBkZWZpbml0aW9uOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBPcmRlcmVkVHlwZVNldCBvcmRlcmVkVHlwZVNldDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGU7CgogIFJlY29yZENsYXNzRGF0YSgKICAgICAgdGhpcy5kZWZpbml0aW9uLCB0aGlzLnRoaXNUeXBlLCB0aGlzLnN1cGVydHlwZSwgdGhpcy5vcmRlcmVkVHlwZVNldCk7CgogIGZhY3RvcnkgUmVjb3JkQ2xhc3NEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBDbGFzc0RlZmluaXRpb24gZGVmaW5pdGlvbiA9IG5ldyBDbGFzc0RlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZSgpOwogICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlKCk7CiAgICBPcmRlcmVkVHlwZVNldCBvcmRlcmVkVHlwZVNldCA9CiAgICAgICAgbmV3IE9yZGVyZWRUeXBlU2V0LnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBSZWNvcmRDbGFzc0RhdGEoZGVmaW5pdGlvbiwgdGhpc1R5cGUsIHN1cGVydHlwZSwgb3JkZXJlZFR5cGVTZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSkNsYXNzRGF0YUtpbmQucmVjb3JkKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGRlZmluaXRpb24ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZURhcnRUeXBlKHRoaXNUeXBlKTsKICAgIHNpbmsud3JpdGVEYXJ0VHlwZShzdXBlcnR5cGUpOwogICAgb3JkZXJlZFR5cGVTZXQud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTWl4aW5BcHBsaWNhdGlvbiA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbnVtQ2xhc3MgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldCBjYWxsVHlwZSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBMaXN0PEludGVyZmFjZVR5cGU+IGdldCBpbnRlcmZhY2VzID0+IGNvbnN0IDxJbnRlcmZhY2VUeXBlPltdOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCBtaXhlZEluVHlwZSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCByYXdUeXBlID0+IHRoaXNUeXBlOwp9CgovLy8gQSBjb250YWluZXIgZm9yIHZhcmlhYmxlcyBkZWNsYXJlZCBpbiBhIHBhcnRpY3VsYXIgc2NvcGUgdGhhdCBhcmUgYWNjZXNzZWQKLy8vIGVsc2V3aGVyZS4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogRG9uJ3QgaW1wbGVtZW50IEpDbGFzcy4gVGhpcyBpc24ndCBhY3R1YWxseSBhCi8vIGNsYXNzLgpjbGFzcyBKUmVjb3JkIGV4dGVuZHMgSkNsYXNzIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pSZWNvcmRdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAncmVjb3JkJzsKCiAgSlJlY29yZChMaWJyYXJ5RW50aXR5IGxpYnJhcnksIFN0cmluZyBuYW1lKQogICAgICA6IHN1cGVyKGxpYnJhcnksIG5hbWUsIGlzQWJzdHJhY3Q6IGZhbHNlKTsKCiAgZmFjdG9yeSBKUmVjb3JkLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBKTGlicmFyeSBsaWJyYXJ5ID0gc291cmNlLnJlYWRMaWJyYXJ5KCk7CiAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpSZWNvcmQobGlicmFyeSwgbmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKQ2xhc3NLaW5kLnJlY29yZCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTGlicmFyeShsaWJyYXJ5KTsKICAgIHNpbmsud3JpdGVTdHJpbmcobmFtZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDbG9zdXJlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHtqc0VsZW1lbnRQcmVmaXh9cmVjb3JkX2NvbnRhaW5lcigkbmFtZSknOwp9CgovLy8gQSB2YXJpYWJsZSB0aGF0IGhhcyBiZWVuICJib3hlZCIgdG8gcHJldmVudCBuYW1lIHNoYWRvd2luZyB3aXRoIHRoZQovLy8gb3JpZ2luYWwgdmFyaWFibGUgYW5kIGVuc3VyZSB0aGF0IHRoaXMgdmFyaWFibGUgaXMgdXBkYXRlZC9yZWFkIHdpdGggdGhlCi8vLyBtb3N0IHJlY2VudCB2YWx1ZS4KY2xhc3MgSlJlY29yZEZpZWxkIGV4dGVuZHMgSkZpZWxkIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pSZWNvcmRGaWVsZF0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdyZWNvcmQtZmllbGQnOwoKICBmaW5hbCBCb3hMb2NhbCBib3g7CgogIEpSZWNvcmRGaWVsZChTdHJpbmcgbmFtZSwgdGhpcy5ib3gsIHtib29sIGlzQ29uc3R9KQogICAgICA6IHN1cGVyKGJveC5jb250YWluZXIubGlicmFyeSwgYm94LmNvbnRhaW5lciwKICAgICAgICAgICAgbmV3IE5hbWUobmFtZSwgYm94LmNvbnRhaW5lci5saWJyYXJ5KSwKICAgICAgICAgICAgaXNTdGF0aWM6IGZhbHNlLCBpc0Fzc2lnbmFibGU6IHRydWUsIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBmYWN0b3J5IEpSZWNvcmRGaWVsZC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgU3RyaW5nIG5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgSkNsYXNzIGVuY2xvc2luZ0NsYXNzID0gc291cmNlLnJlYWRDbGFzcygpOwogICAgYm9vbCBpc0NvbnN0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpSZWNvcmRGaWVsZChuYW1lLCBuZXcgQm94TG9jYWwoZW5jbG9zaW5nQ2xhc3MpLAogICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSk1lbWJlcktpbmQucmVjb3JkRmllbGQpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZVN0cmluZyhuYW1lKTsKICAgIHNpbmsud3JpdGVDbGFzcyhlbmNsb3NpbmdDbGFzcyk7CiAgICBzaW5rLndyaXRlQm9vbChpc0NvbnN0KTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhlc2UgYW5vbWFsaWVzLiBNYXliZSBieSBzZXBhcmF0aW5nIHRoZQogIC8vIEotZW50aXRpZXMgZnJvbSB0aGUgSy1lbnRpdGllcy4KICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0luc3RhbmNlTWVtYmVyID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1RvcExldmVsID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1N0YXRpYyA9PiBmYWxzZTsKfQoKY2xhc3MgQ2xvc3VyZUNsYXNzRGF0YSBleHRlbmRzIFJlY29yZENsYXNzRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtDbG9zdXJlQ2xhc3NEYXRhXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2Nsb3N1cmUtY2xhc3MtZGF0YSc7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uVHlwZSBjYWxsVHlwZTsKCiAgQ2xvc3VyZUNsYXNzRGF0YShDbGFzc0RlZmluaXRpb24gZGVmaW5pdGlvbiwgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSwKICAgICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUsIE9yZGVyZWRUeXBlU2V0IG9yZGVyZWRUeXBlU2V0KQogICAgICA6IHN1cGVyKGRlZmluaXRpb24sIHRoaXNUeXBlLCBzdXBlcnR5cGUsIG9yZGVyZWRUeXBlU2V0KTsKCiAgZmFjdG9yeSBDbG9zdXJlQ2xhc3NEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBDbGFzc0RlZmluaXRpb24gZGVmaW5pdGlvbiA9IG5ldyBDbGFzc0RlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZSgpOwogICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlKCk7CiAgICBPcmRlcmVkVHlwZVNldCBvcmRlcmVkVHlwZVNldCA9CiAgICAgICAgbmV3IE9yZGVyZWRUeXBlU2V0LnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgRnVuY3Rpb25UeXBlIGNhbGxUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZSgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBDbG9zdXJlQ2xhc3NEYXRhKGRlZmluaXRpb24sIHRoaXNUeXBlLCBzdXBlcnR5cGUsIG9yZGVyZWRUeXBlU2V0KQogICAgICAuLmNhbGxUeXBlID0gY2FsbFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKQ2xhc3NEYXRhS2luZC5jbG9zdXJlKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGRlZmluaXRpb24ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZURhcnRUeXBlKHRoaXNUeXBlKTsKICAgIHNpbmsud3JpdGVEYXJ0VHlwZShzdXBlcnR5cGUpOwogICAgb3JkZXJlZFR5cGVTZXQud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZURhcnRUeXBlKGNhbGxUeXBlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQp9CgpjbGFzcyBDbG9zdXJlQ2xhc3NEZWZpbml0aW9uIGltcGxlbWVudHMgQ2xhc3NEZWZpbml0aW9uIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0Nsb3N1cmVDbGFzc0RlZmluaXRpb25dIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY2xvc3VyZS1jbGFzcy1kZWZpbml0aW9uJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU291cmNlU3BhbiBsb2NhdGlvbjsKCiAgQ2xvc3VyZUNsYXNzRGVmaW5pdGlvbih0aGlzLmxvY2F0aW9uKTsKCiAgZmFjdG9yeSBDbG9zdXJlQ2xhc3NEZWZpbml0aW9uLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBTb3VyY2VTcGFuIGxvY2F0aW9uID0gc291cmNlLnJlYWRTb3VyY2VTcGFuKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IENsb3N1cmVDbGFzc0RlZmluaXRpb24obG9jYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oQ2xhc3NLaW5kLmNsb3N1cmUpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZVNvdXJjZVNwYW4obG9jYXRpb24pOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzS2luZCBnZXQga2luZCA9PiBDbGFzc0tpbmQuY2xvc3VyZTsKCiAgQG92ZXJyaWRlCiAgaXIuTm9kZSBnZXQgbm9kZSA9PgogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignQ2xvc3VyZUNsYXNzRGVmaW5pdGlvbi5ub2RlIGZvciAkbG9jYXRpb24nKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0Nsb3N1cmVDbGFzc0RlZmluaXRpb24oa2luZDoka2luZCxsb2NhdGlvbjokbG9jYXRpb24pJzsKfQoKYWJzdHJhY3QgY2xhc3MgQ2xvc3VyZU1lbWJlckRhdGEgaW1wbGVtZW50cyBKTWVtYmVyRGF0YSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uOwogIGZpbmFsIEludGVyZmFjZVR5cGUgbWVtYmVyVGhpc1R5cGU7CgogIENsb3N1cmVNZW1iZXJEYXRhKHRoaXMuZGVmaW5pdGlvbiwgdGhpcy5tZW1iZXJUaGlzVHlwZSk7CgogIEBvdmVycmlkZQogIFN0YXRpY1R5cGVDYWNoZSBnZXQgc3RhdGljVHlwZXMgewogICAgLy8gVGhlIGNhY2hlZCB0eXBlcyBhcmUgc3RvcmVkIGluIHRoZSBkYXRhIGZvciBlbmNsb3NpbmcgbWVtYmVyLgogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNsb3N1cmVNZW1iZXJEYXRhLnN0YXRpY1R5cGVzIik7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldE1lbWJlclRoaXNUeXBlKEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBtZW1iZXJUaGlzVHlwZTsKICB9Cn0KCmNsYXNzIENsb3N1cmVGdW5jdGlvbkRhdGEgZXh0ZW5kcyBDbG9zdXJlTWVtYmVyRGF0YQogICAgd2l0aCBGdW5jdGlvbkRhdGFUeXBlVmFyaWFibGVzTWl4aW4sIEZ1bmN0aW9uRGF0YUZvckVhY2hQYXJhbWV0ZXJNaXhpbgogICAgaW1wbGVtZW50cyBGdW5jdGlvbkRhdGEgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbQ2xvc3VyZUZ1bmN0aW9uRGF0YV0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjbG9zdXJlLWZ1bmN0aW9uLWRhdGEnOwoKICBmaW5hbCBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlOwogIEBvdmVycmlkZQogIGZpbmFsIGlyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbk5vZGU7CiAgQG92ZXJyaWRlCiAgZmluYWwgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3M7CgogIENsb3N1cmVGdW5jdGlvbkRhdGEoCiAgICAgIENsb3N1cmVNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24sCiAgICAgIEludGVyZmFjZVR5cGUgbWVtYmVyVGhpc1R5cGUsCiAgICAgIHRoaXMuZnVuY3Rpb25UeXBlLAogICAgICB0aGlzLmZ1bmN0aW9uTm9kZSwKICAgICAgdGhpcy5jbGFzc1R5cGVWYXJpYWJsZUFjY2VzcykKICAgICAgOiBzdXBlcihkZWZpbml0aW9uLCBtZW1iZXJUaGlzVHlwZSk7CgogIGZhY3RvcnkgQ2xvc3VyZUZ1bmN0aW9uRGF0YS5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgQ2xvc3VyZU1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9CiAgICAgICAgbmV3IE1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBJbnRlcmZhY2VUeXBlIG1lbWJlclRoaXNUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZShhbGxvd051bGw6IHRydWUpOwogICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGUoKTsKICAgIGlyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbk5vZGUgPSBzb3VyY2UucmVhZFRyZWVOb2RlKCk7CiAgICBDbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyBjbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyA9CiAgICAgICAgc291cmNlLnJlYWRFbnVtKENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzLnZhbHVlcyk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IENsb3N1cmVGdW5jdGlvbkRhdGEoZGVmaW5pdGlvbiwgbWVtYmVyVGhpc1R5cGUsIGZ1bmN0aW9uVHlwZSwKICAgICAgICBmdW5jdGlvbk5vZGUsIGNsYXNzVHlwZVZhcmlhYmxlQWNjZXNzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJEYXRhS2luZC5jbG9zdXJlRnVuY3Rpb24pOwogICAgc2luay5iZWdpbih0YWcpOwogICAgZGVmaW5pdGlvbi53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLndyaXRlRGFydFR5cGUobWVtYmVyVGhpc1R5cGUsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlRGFydFR5cGUoZnVuY3Rpb25UeXBlKTsKICAgIHNpbmsud3JpdGVUcmVlTm9kZShmdW5jdGlvbk5vZGUpOwogICAgc2luay53cml0ZUVudW0oY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uVHlwZSBnZXRGdW5jdGlvblR5cGUoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgcmV0dXJuIGZ1bmN0aW9uVHlwZTsKICB9Cn0KCmNsYXNzIENsb3N1cmVGaWVsZERhdGEgZXh0ZW5kcyBDbG9zdXJlTWVtYmVyRGF0YSBpbXBsZW1lbnRzIEpGaWVsZERhdGEgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbQ2xvc3VyZUZpZWxkRGF0YV0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjbG9zdXJlLWZpZWxkLWRhdGEnOwoKICBEYXJ0VHlwZSBfdHlwZTsKCiAgQ2xvc3VyZUZpZWxkRGF0YShNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24sIEludGVyZmFjZVR5cGUgbWVtYmVyVGhpc1R5cGUpCiAgICAgIDogc3VwZXIoZGVmaW5pdGlvbiwgbWVtYmVyVGhpc1R5cGUpOwoKICBmYWN0b3J5IENsb3N1cmVGaWVsZERhdGEucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9CiAgICAgICAgbmV3IE1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBJbnRlcmZhY2VUeXBlIG1lbWJlclRoaXNUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZShhbGxvd051bGw6IHRydWUpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBDbG9zdXJlRmllbGREYXRhKGRlZmluaXRpb24sIG1lbWJlclRoaXNUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJEYXRhS2luZC5jbG9zdXJlRmllbGQpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgZGVmaW5pdGlvbi53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLndyaXRlRGFydFR5cGUobWVtYmVyVGhpc1R5cGUsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0RmllbGRUeXBlKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIGlmIChfdHlwZSAhPSBudWxsKSByZXR1cm4gX3R5cGU7CiAgICBpci5UcmVlTm9kZSBzb3VyY2VOb2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgaXIuRGFydFR5cGUgdHlwZTsKICAgIGlmIChzb3VyY2VOb2RlIGlzIGlyLkNsYXNzKSB7CiAgICAgIHR5cGUgPSBzb3VyY2VOb2RlLnRoaXNUeXBlOwogICAgfSBlbHNlIGlmIChzb3VyY2VOb2RlIGlzIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgdHlwZSA9IHNvdXJjZU5vZGUudHlwZTsKICAgIH0gZWxzZSBpZiAoc291cmNlTm9kZSBpcyBpci5GaWVsZCkgewogICAgICB0eXBlID0gc291cmNlTm9kZS50eXBlOwogICAgfSBlbHNlIGlmIChzb3VyY2VOb2RlIGlzIGlyLlR5cGVMaXRlcmFsKSB7CiAgICAgIHR5cGUgPSBzb3VyY2VOb2RlLnR5cGU7CiAgICB9IGVsc2UgaWYgKHNvdXJjZU5vZGUgaXMgaXIuVHlwZWRlZikgewogICAgICB0eXBlID0gc291cmNlTm9kZS50eXBlOwogICAgfSBlbHNlIGlmIChzb3VyY2VOb2RlIGlzIGlyLlR5cGVQYXJhbWV0ZXIpIHsKICAgICAgdHlwZSA9IHNvdXJjZU5vZGUuYm91bmQ7CiAgICB9IGVsc2UgewogICAgICBmYWlsZWRBdCgKICAgICAgICAgIGRlZmluaXRpb24ubG9jYXRpb24sCiAgICAgICAgICAnVW5leHBlY3RlZCBub2RlIHR5cGUgJHtzb3VyY2VOb2RlfSBpbiAnCiAgICAgICAgICAnQ2xvc3VyZUZpZWxkRGF0YS5nZXRGaWVsZFR5cGUnKTsKICAgIH0KICAgIHJldHVybiBfdHlwZSA9IGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUodHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb24oSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgZmFpbGVkQXQoCiAgICAgICAgZGVmaW5pdGlvbi5sb2NhdGlvbiwKICAgICAgICAiVW5leHBlY3RlZCBmaWVsZCAke2RlZmluaXRpb259IGluICIKICAgICAgICAiQ2xvc3VyZUZpZWxkRGF0YS5nZXRGaWVsZENvbnN0YW50RXhwcmVzc2lvbiIpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyBnZXQgY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgPT4KICAgICAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3Mubm9uZTsKfQoKY2xhc3MgQ2xvc3VyZU1lbWJlckRlZmluaXRpb24gaW1wbGVtZW50cyBNZW1iZXJEZWZpbml0aW9uIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0Nsb3N1cmVNZW1iZXJEZWZpbml0aW9uXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2Nsb3N1cmUtbWVtYmVyLWRlZmluaXRpb24nOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTb3VyY2VTcGFuIGxvY2F0aW9uOwogIEBvdmVycmlkZQogIGZpbmFsIE1lbWJlcktpbmQga2luZDsKICBAb3ZlcnJpZGUKICBmaW5hbCBpci5UcmVlTm9kZSBub2RlOwoKICBDbG9zdXJlTWVtYmVyRGVmaW5pdGlvbih0aGlzLmxvY2F0aW9uLCB0aGlzLmtpbmQsIHRoaXMubm9kZSkKICAgICAgOiBhc3NlcnQoCiAgICAgICAgICAgIGtpbmQgPT0gTWVtYmVyS2luZC5jbG9zdXJlQ2FsbCB8fCBraW5kID09IE1lbWJlcktpbmQuY2xvc3VyZUZpZWxkKTsKCiAgZmFjdG9yeSBDbG9zdXJlTWVtYmVyRGVmaW5pdGlvbi5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgU291cmNlU3BhbiBsb2NhdGlvbiA9IHNvdXJjZS5yZWFkU291cmNlU3BhbigpOwogICAgaXIuVHJlZU5vZGUgbm9kZSA9IHNvdXJjZS5yZWFkVHJlZU5vZGUoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgQ2xvc3VyZU1lbWJlckRlZmluaXRpb24obG9jYXRpb24sIGtpbmQsIG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oa2luZCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlU291cmNlU3Bhbihsb2NhdGlvbik7CiAgICBzaW5rLndyaXRlVHJlZU5vZGUobm9kZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0Nsb3N1cmVNZW1iZXJEZWZpbml0aW9uKGtpbmQ6JGtpbmQsbG9jYXRpb246JGxvY2F0aW9uKSc7Cn0KCmNsYXNzIFJlY29yZENvbnRhaW5lckRlZmluaXRpb24gaW1wbGVtZW50cyBDbGFzc0RlZmluaXRpb24gewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbUmVjb3JkQ29udGFpbmVyRGVmaW5pdGlvbl0gb2JqZWN0cyBpbgogIC8vLyBhIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdyZWNvcmQtZGVmaW5pdGlvbic7CgogIEBvdmVycmlkZQogIGZpbmFsIFNvdXJjZVNwYW4gbG9jYXRpb247CgogIFJlY29yZENvbnRhaW5lckRlZmluaXRpb24odGhpcy5sb2NhdGlvbik7CgogIGZhY3RvcnkgUmVjb3JkQ29udGFpbmVyRGVmaW5pdGlvbi5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgU291cmNlU3BhbiBsb2NhdGlvbiA9IHNvdXJjZS5yZWFkU291cmNlU3BhbigpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBSZWNvcmRDb250YWluZXJEZWZpbml0aW9uKGxvY2F0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKENsYXNzS2luZC5yZWNvcmQpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZVNvdXJjZVNwYW4obG9jYXRpb24pOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzS2luZCBnZXQga2luZCA9PiBDbGFzc0tpbmQucmVjb3JkOwoKICBAb3ZlcnJpZGUKICBpci5Ob2RlIGdldCBub2RlID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAnUmVjb3JkQ29udGFpbmVyRGVmaW5pdGlvbi5ub2RlIGZvciAkbG9jYXRpb24nKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJ1JlY29yZENvbnRhaW5lckRlZmluaXRpb24oa2luZDoka2luZCxsb2NhdGlvbjokbG9jYXRpb24pJzsKfQoKYWJzdHJhY3QgY2xhc3MgQ2xvc3VyZVJ0aU5lZWQgewogIGJvb2wgY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgYm9vbCBtZXRob2ROZWVkc1R5cGVBcmd1bWVudHMoRnVuY3Rpb25FbnRpdHkgbWV0aG9kKTsKCiAgYm9vbCBtZXRob2ROZWVkc1NpZ25hdHVyZShNZW1iZXJFbnRpdHkgbWV0aG9kKTsKCiAgYm9vbCBsb2NhbEZ1bmN0aW9uTmVlZHNUeXBlQXJndW1lbnRzKGlyLkxvY2FsRnVuY3Rpb24gbm9kZSk7CgogIGJvb2wgbG9jYWxGdW5jdGlvbk5lZWRzU2lnbmF0dXJlKGlyLkxvY2FsRnVuY3Rpb24gbm9kZSk7CgogIGJvb2wgc2VsZWN0b3JOZWVkc1R5cGVBcmd1bWVudHMoU2VsZWN0b3Igc2VsZWN0b3IpOwoKICBib29sIGluc3RhbnRpYXRpb25OZWVkc1R5cGVBcmd1bWVudHMoCiAgICAgIERhcnRUeXBlIGZ1bmN0aW9uVHlwZSwgaW50IHR5cGVBcmd1bWVudENvdW50KTsKfQqFAwBOTjwBKAEaGSgkKyEdIScpJx8iLiMkGDoWAS9FHSwBJAFOMDxIGUgBOSYBTVABOS42FzhCTD9ORDY7NUBNFUhGBAEvDCgVI05GIwgZJzYqOisiCBMEAQwwUEkkKzYsBgEtDFEWBAFGPww4Sx8fIycjTSFPD0wGBAEMRj8+QQEMRDgMGTxGFAQCAU5PSlFRUCIETw9LOAEbJCoqAU4vO0gZRwEzKwEWRwFRJjIqHikZEy0hQR4bDhMqEzgsOk8bDhMzSTwbDhM1S0AbDhMyTEtLUEAbDhMwIToeGxVLOh0QDhMvIToeGx9FGw4TMUk4Gw4TMEwbDhMqIToeGw4TLDE8Gw4TKzE/Gw4TKzE/Gw4TOks5QxsOEwoIFAYBQSsGJ04jLwgIBAElLzoeKktLM08wRwEePzJHPAEwQz4RPz4KMgoBQiQ/Nk0gFBomHxUjSylDOEoBTk4cSj8wNz85RVFOKkkMCjYICEtIBAFRSk9OTDw0LxscHC8eJjdJLi5LOwFNJUs0JTgGJDwNL0YGHQQCAUYjEVAvMCwxOEYEREgiAgEmRR0qAS8MGTEBTxIiAUMwAT4+K0QUJVAwSxcnLgYEAQxBOREIBAEMMTABDBYqIk0aBAEMUAE+F0EwLk08FSVKBAEMKC0VLSY6JRMEAgFFSR0uAQwXARwtFy8gFBhOARgvKSMhF1BKAQw8AUIXQTAuTTwuFUoxBAEMKDEVLSY6JSQTBAIBUU0dMwEMKAEgLRcvIBUfSSUBHC8tIyFDLRdKAQxDAUYXQTAuTTwuOhVORQQBDCg1FS0mOiUkKhMEAgErRjErUB07AQwYDCQMHQwZDCMBLAEjLRYvIBccGh8cGE4BKB8pLxwjGhYhNEEBSRdBMC5NPDBCNDQpOBUwHxMYFxQZFxwaBAEMKD0VLSY6JSItKik7EwQBDEkBDC4wLRYIBkcRBAEMQQEMPiAfBAEMHgIBJUcdLQEvMQFAFy0nFS0EAQwoKBUgHBMEAQweAQxBAgEvJAEsAQwZAQwyAQwcLTcvBAEMF0kCAUdHHS0BDB0BEVApFzgwSBooHwFJTTNMAUAXJScvJisVJ0U3BAEMKC4VJRwkHSITBAEMLAIBLkkdMQEMJAEMIAEMJwEMIQETTAFCF1E0NSQ3FVEEAQwoKxUmIiMqEwQBDCgBDCEBDCEBDEEBDCkBDCkCAU8PRgofQR0mAS4xAToXLScVJwQBDCgnFSAcEwQBDB8BDEQCAUhNFyRGHSwBFgE2NDNEAT8XJzAmFUAbBAEMKC0VHCUdEwQBSiUMJgEMIAEMHgIBMUodMgEMGQFHPkABQxdRNDUkNzMVUR0EAQwoLBUmIiMqIhMEAgE6UB04AQwdASkBSRczFTEEAQwoJxUkEwQBDCsBDBZPAQxQAgE6DCUmATsBDCRFQQQBDD8bBAIBNEseTR01ASMMJgw5ARcqJBkZJCsBRhcpOUk3OjY5FU0wBAEMKDUVJjkmJi0TBAEMPBkEAgFJSh0yARIBTisBQxciOUkVPQQBDCgyFSY5EwQBDDUlLhYiIjceKR4vHiseMR8NEB8zLAYxBAEMTQ4dLTgRBAEMOSQCATxRHTkBDB0MGQwaAT8QUAE2LBczLhU+BAEMKBoVJB4TBAEMUQIBPVEfMQEMHQEsAUwXMxU0BAEMKCYVJBMEAQwqAQwyNwEMF0ICASAxATgBMgE/ATsBNgEoNQIBKnBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX21vZGVsL2Nsb3N1cmUuZGFydC9zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19tb2RlbC9lbnYuZGFydMAAhakvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX21vZGVsLmVudjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0cnVjdG9ycy5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvZXhwcmVzc2lvbnMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9pbmRleGVkLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2lyL2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJy4uL2lyL3N0YXRpY190eXBlX2NhY2hlLmRhcnQnOwppbXBvcnQgJy4uL2lyL3Zpc2l0b3JzLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJy4uL29yZGVyZWRfdHlwZXNldC5kYXJ0JzsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vc3NhL3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdjbG9zdXJlLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRfbWFwX2ltcGwuZGFydCc7CmltcG9ydCAnZWxlbWVudHMuZGFydCc7CgovLy8gRW52aXJvbm1lbnQgZm9yIGZhc3QgbG9va3VwIG9mIGNvbXBvbmVudCBsaWJyYXJpZXMuCmNsYXNzIEpQcm9ncmFtRW52IHsKICBmaW5hbCBJdGVyYWJsZTxpci5Db21wb25lbnQ+IF9jb21wb25lbnRzOwogIGZpbmFsIE1hcDxVcmksIEpMaWJyYXJ5RW52PiBfbGlicmFyeU1hcCA9IHt9OwoKICBKUHJvZ3JhbUVudih0aGlzLl9jb21wb25lbnRzKTsKCiAgLy8vIFRPRE8oam9obm5pd2ludGhlcik6IEhhbmRsZSBhcmJpdHJhcnkgbG9hZCBvcmRlciBpZiBuZWVkZWQuCiAgaXIuTWVtYmVyIGdldCBtYWluTWV0aG9kID0+IF9jb21wb25lbnRzLmZpcnN0Py5tYWluTWV0aG9kOwoKICBpci5Db21wb25lbnQgZ2V0IG1haW5Db21wb25lbnQgPT4gX2NvbXBvbmVudHMuZmlyc3Q7CgogIHZvaWQgcmVnaXN0ZXJMaWJyYXJ5KEpMaWJyYXJ5RW52IGVudikgewogICAgX2xpYnJhcnlNYXBbZW52LmxpYnJhcnkuaW1wb3J0VXJpXSA9IGVudjsKICB9CgogIC8vLyBSZXR1cm4gdGhlIFtKTGlicmFyeUVudl0gZm9yIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGNhbm9uaWNhbCBbdXJpXS4KICBKTGlicmFyeUVudiBsb29rdXBMaWJyYXJ5KFVyaSB1cmkpIHsKICAgIHJldHVybiBfbGlicmFyeU1hcFt1cmldOwogIH0KCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBsaWJyYXJ5IGluIHRoaXMgZW52aXJvbm1lbnQuCiAgdm9pZCBmb3JFYWNoTGlicmFyeSh2b2lkIGYoSkxpYnJhcnlFbnYgbGlicmFyeSkpIHsKICAgIF9saWJyYXJ5TWFwLnZhbHVlcy5mb3JFYWNoKGYpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBsaWJyYXJpZXMgaW4gdGhpcyBlbnZpcm9ubWVudC4KICBpbnQgZ2V0IGxlbmd0aCB7CiAgICByZXR1cm4gX2xpYnJhcnlNYXAubGVuZ3RoOwogIH0KfQoKLy8vIEVudmlyb25tZW50IGZvciBmYXN0IGxvb2t1cCBvZiBsaWJyYXJ5IGNsYXNzZXMgYW5kIG1lbWJlcnMuCmNsYXNzIEpMaWJyYXJ5RW52IHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pMaWJyYXJ5RW52XSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2xpYnJhcnktZW52JzsKCiAgZmluYWwgaXIuTGlicmFyeSBsaWJyYXJ5OwogIGZpbmFsIE1hcDxTdHJpbmcsIEpDbGFzc0Vudj4gX2NsYXNzTWFwID0ge307CiAgZmluYWwgTWFwPFN0cmluZywgaXIuTWVtYmVyPiBfbWVtYmVyTWFwOwogIGZpbmFsIE1hcDxTdHJpbmcsIGlyLk1lbWJlcj4gX3NldHRlck1hcDsKCiAgSkxpYnJhcnlFbnYodGhpcy5saWJyYXJ5LCB0aGlzLl9tZW1iZXJNYXAsIHRoaXMuX3NldHRlck1hcCk7CgogIC8vLyBEZXNlcmlhbGl6ZXMgYSBbSkxpYnJhcnlFbnZdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgSkxpYnJhcnlFbnYucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLkxpYnJhcnkgbGlicmFyeSA9IHNvdXJjZS5yZWFkTGlicmFyeU5vZGUoKTsKICAgIE1hcDxTdHJpbmcsIGlyLk1lbWJlcj4gbWVtYmVyTWFwID0KICAgICAgICBzb3VyY2UucmVhZFN0cmluZ01hcChzb3VyY2UucmVhZE1lbWJlck5vZGUpOwogICAgTWFwPFN0cmluZywgaXIuTWVtYmVyPiBzZXR0ZXJNYXAgPQogICAgICAgIHNvdXJjZS5yZWFkU3RyaW5nTWFwKHNvdXJjZS5yZWFkTWVtYmVyTm9kZSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpMaWJyYXJ5RW52KGxpYnJhcnksIG1lbWJlck1hcCwgc2V0dGVyTWFwKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0pMaWJyYXJ5RW52XSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUxpYnJhcnlOb2RlKGxpYnJhcnkpOwogICAgc2luay53cml0ZVN0cmluZ01hcChfbWVtYmVyTWFwLCBzaW5rLndyaXRlTWVtYmVyTm9kZSk7CiAgICBzaW5rLndyaXRlU3RyaW5nTWFwKF9zZXR0ZXJNYXAsIHNpbmsud3JpdGVNZW1iZXJOb2RlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQ2xhc3MoU3RyaW5nIG5hbWUsIEpDbGFzc0VudiBjbGFzc0VudikgewogICAgX2NsYXNzTWFwW25hbWVdID0gY2xhc3NFbnY7CiAgfQoKICAvLy8gUmV0dXJuIHRoZSBbSkNsYXNzRW52XSBmb3IgdGhlIGNsYXNzIFtuYW1lXSBpbiBbbGlicmFyeV0uCiAgSkNsYXNzRW52IGxvb2t1cENsYXNzKFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gX2NsYXNzTWFwW25hbWVdOwogIH0KCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBjbGFzcyBpbiB0aGlzIGxpYnJhcnkuCiAgdm9pZCBmb3JFYWNoQ2xhc3Modm9pZCBmKEpDbGFzc0VudiBjbHMpKSB7CiAgICBfY2xhc3NNYXAudmFsdWVzLmZvckVhY2goZik7CiAgfQoKICAvLy8gUmV0dXJuIHRoZSBbaXIuTWVtYmVyXSBmb3IgdGhlIG1lbWJlciBbbmFtZV0gaW4gW2xpYnJhcnldLgogIGlyLk1lbWJlciBsb29rdXBNZW1iZXIoU3RyaW5nIG5hbWUsIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICByZXR1cm4gc2V0dGVyID8gX3NldHRlck1hcFtuYW1lXSA6IF9tZW1iZXJNYXBbbmFtZV07CiAgfQoKICB2b2lkIGZvckVhY2hNZW1iZXIodm9pZCBmKGlyLk1lbWJlciBtZW1iZXIpKSB7CiAgICBfbWVtYmVyTWFwLnZhbHVlcy5mb3JFYWNoKGYpOwogICAgZm9yIChpci5NZW1iZXIgbWVtYmVyIGluIF9zZXR0ZXJNYXAudmFsdWVzKSB7CiAgICAgIGlmIChtZW1iZXIgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgICAgZihtZW1iZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNraXAgZmllbGRzOyB0aGVzZSBhcmUgYWxzbyBpbiBfbWVtYmVyTWFwLgogICAgICB9CiAgICB9CiAgfQp9CgpjbGFzcyBKTGlicmFyeURhdGEgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSkxpYnJhcnlEYXRhXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2xpYnJhcnktZGF0YSc7CgogIGZpbmFsIGlyLkxpYnJhcnkgbGlicmFyeTsKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCBkaXJlY3QgYWNjZXNzIHRvIFtpbXBvcnRzXS4gSXQgbWlnaHQgYmUgbnVsbCBpZgogIC8vIGl0IGhhc24ndCBiZWVuIGNvbXB1dGVkIGZvciB0aGUgY29ycmVzcG9uZGluZyBbS0xpYnJhcnlEYXRhXS4KICBmaW5hbCBNYXA8aXIuTGlicmFyeURlcGVuZGVuY3ksIEltcG9ydEVudGl0eT4gaW1wb3J0czsKCiAgSkxpYnJhcnlEYXRhKHRoaXMubGlicmFyeSwgdGhpcy5pbXBvcnRzKTsKCiAgZmFjdG9yeSBKTGlicmFyeURhdGEucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLkxpYnJhcnkgbGlicmFyeSA9IHNvdXJjZS5yZWFkTGlicmFyeU5vZGUoKTsKICAgIGludCBpbXBvcnRDb3VudCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBNYXA8aXIuTGlicmFyeURlcGVuZGVuY3ksIEltcG9ydEVudGl0eT4gaW1wb3J0czsKICAgIGlmIChpbXBvcnRDb3VudCA+IDApIHsKICAgICAgaW1wb3J0cyA9IHt9OwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydENvdW50OyBpKyspIHsKICAgICAgICBpbnQgaW5kZXggPSBzb3VyY2UucmVhZEludCgpOwogICAgICAgIEltcG9ydEVudGl0eSBpbXBvcnQgPSBzb3VyY2UucmVhZEltcG9ydCgpOwogICAgICAgIGltcG9ydHNbbGlicmFyeS5kZXBlbmRlbmNpZXNbaW5kZXhdXSA9IGltcG9ydDsKICAgICAgfQogICAgfQogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKTGlicmFyeURhdGEobGlicmFyeSwgaW1wb3J0cyk7CiAgfQoKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTGlicmFyeU5vZGUobGlicmFyeSk7CiAgICBpZiAoaW1wb3J0cyA9PSBudWxsKSB7CiAgICAgIHNpbmsud3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICBzaW5rLndyaXRlSW50KGltcG9ydHMubGVuZ3RoKTsKICAgICAgaW50IGluZGV4ID0gMDsKICAgICAgZm9yIChpci5MaWJyYXJ5RGVwZW5kZW5jeSBub2RlIGluIGxpYnJhcnkuZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgSW1wb3J0RW50aXR5IGltcG9ydCA9IGltcG9ydHNbbm9kZV07CiAgICAgICAgaWYgKGltcG9ydCAhPSBudWxsKSB7CiAgICAgICAgICBzaW5rLndyaXRlSW50KGluZGV4KTsKICAgICAgICAgIHNpbmsud3JpdGVJbXBvcnQoaW1wb3J0KTsKICAgICAgICB9CiAgICAgICAgaW5kZXgrKzsKICAgICAgfQogICAgfQogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCi8vLyBFbnVtIHVzZWQgZm9yIGlkZW50aWZ5aW5nIFtKQ2xhc3NFbnZdIHN1YmNsYXNzZXMgaW4gc2VyaWFsaXphdGlvbi4KZW51bSBKQ2xhc3NFbnZLaW5kIHsgbm9kZSwgY2xvc3VyZSwgcmVjb3JkIH0KCi8vLyBNZW1iZXIgZGF0YSBmb3IgYSBjbGFzcy4KYWJzdHJhY3QgY2xhc3MgSkNsYXNzRW52IHsKICAvLy8gRGVzZXJpYWxpemVzIGEgW0pDbGFzc0Vudl0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBKQ2xhc3NFbnYucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBKQ2xhc3NFbnZLaW5kIGtpbmQgPSBzb3VyY2UucmVhZEVudW0oSkNsYXNzRW52S2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgSkNsYXNzRW52S2luZC5ub2RlOgogICAgICAgIHJldHVybiBuZXcgSkNsYXNzRW52SW1wbC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKQ2xhc3NFbnZLaW5kLmNsb3N1cmU6CiAgICAgICAgcmV0dXJuIG5ldyBDbG9zdXJlQ2xhc3NFbnYucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSkNsYXNzRW52S2luZC5yZWNvcmQ6CiAgICAgICAgcmV0dXJuIG5ldyBSZWNvcmRFbnYucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgSkNsYXNzRW52S2luZCAka2luZCIpOwogIH0KCiAgLy8vIFNlcmlhbGl6ZXMgdGhpcyBbSkNsYXNzRW52XSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7CgogIC8vLyBUaGUgW2lyLkNsYXNzXSB0aGF0IGRlZmluZWQgdGhlIGNsYXNzLCBpZiBhbnkuCiAgaXIuQ2xhc3MgZ2V0IGNsczsKCiAgLy8vIFdoZXRoZXIgdGhlIGNsYXNzIGlzIGFuIHVubmFtZWQgbWl4aW4gYXBwbGljYXRpb24uCiAgYm9vbCBnZXQgaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbjsKCiAgLy8vIFdoZXRoZXIgdGhlIGNsYXNzIGlzIGEgbWl4aW4gYXBwbGljYXRpb24gdGhhdCBtaXhlcyBpbiBtZXRob2RzIHdpdGggc3VwZXIKICAvLy8gY2FsbHMuCiAgYm9vbCBnZXQgaXNTdXBlck1peGluQXBwbGljYXRpb247CgogIC8vLyBSZXR1cm4gdGhlIFtNZW1iZXJFbnRpdHldIGZvciB0aGUgbWVtYmVyIFtuYW1lXSBpbiB0aGUgY2xhc3MuIElmIFtzZXR0ZXJdCiAgLy8vIGlzIGB0cnVlYCwgdGhlIHNldHRlciBvciBhc3NpZ25hYmxlIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gW25hbWVdIGlzCiAgLy8vIHJldHVybmVkLgogIE1lbWJlckVudGl0eSBsb29rdXBNZW1iZXIoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KTsKCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBtZW1iZXIgb2YgW2Nsc10uCiAgdm9pZCBmb3JFYWNoTWVtYmVyKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSk7CgogIC8vLyBSZXR1cm4gdGhlIFtDb25zdHJ1Y3RvckVudGl0eV0gZm9yIHRoZSBjb25zdHJ1Y3RvciBbbmFtZV0gaW4gW2Nsc10uCiAgQ29uc3RydWN0b3JFbnRpdHkgbG9va3VwQ29uc3RydWN0b3IoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgU3RyaW5nIG5hbWUpOwoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGNvbnN0cnVjdG9yIG9mIFtjbHNdLgogIHZvaWQgZm9yRWFjaENvbnN0cnVjdG9yKAogICAgICBJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCB2b2lkIGYoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpKTsKCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBjb25zdHJ1Y3RvciBib2R5IGZvciB0aGUgbGl2ZSBjb25zdHJ1Y3RvcnMgaW4gdGhlCiAgLy8vIGNsYXNzLgogIHZvaWQgZm9yRWFjaENvbnN0cnVjdG9yQm9keSh2b2lkIGYoQ29uc3RydWN0b3JCb2R5RW50aXR5IGNvbnN0cnVjdG9yKSk7Cn0KCi8vLyBFbnZpcm9ubWVudCBmb3IgZmFzdCBsb29rdXAgb2YgY2xhc3MgbWVtYmVycy4KY2xhc3MgSkNsYXNzRW52SW1wbCBpbXBsZW1lbnRzIEpDbGFzc0VudiB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKQ2xhc3NFbnZdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY2xhc3MtZW52JzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaXIuQ2xhc3MgY2xzOwogIGZpbmFsIE1hcDxTdHJpbmcsIGlyLk1lbWJlcj4gX2NvbnN0cnVjdG9yTWFwOwogIGZpbmFsIE1hcDxTdHJpbmcsIGlyLk1lbWJlcj4gX21lbWJlck1hcDsKICBmaW5hbCBNYXA8U3RyaW5nLCBpci5NZW1iZXI+IF9zZXR0ZXJNYXA7CiAgZmluYWwgTGlzdDxpci5NZW1iZXI+IF9tZW1iZXJzOyAvLyBpbiBkZWNsYXJhdGlvbiBvcmRlci4KICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uOwoKICAvLy8gQ29uc3RydWN0b3IgYm9kaWVzIGNyZWF0ZWQgZm9yIHRoaXMgY2xhc3MuCiAgTGlzdDxDb25zdHJ1Y3RvckJvZHlFbnRpdHk+IF9jb25zdHJ1Y3RvckJvZHlMaXN0OwoKICBKQ2xhc3NFbnZJbXBsKHRoaXMuY2xzLCB0aGlzLl9jb25zdHJ1Y3Rvck1hcCwgdGhpcy5fbWVtYmVyTWFwLAogICAgICB0aGlzLl9zZXR0ZXJNYXAsIHRoaXMuX21lbWJlcnMsIHRoaXMuaXNTdXBlck1peGluQXBwbGljYXRpb24pOwoKICBmYWN0b3J5IEpDbGFzc0VudkltcGwucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLkNsYXNzIGNscyA9IHNvdXJjZS5yZWFkQ2xhc3NOb2RlKCk7CiAgICBNYXA8U3RyaW5nLCBpci5NZW1iZXI+IGNvbnN0cnVjdG9yTWFwID0KICAgICAgICBzb3VyY2UucmVhZFN0cmluZ01hcChzb3VyY2UucmVhZE1lbWJlck5vZGUpOwogICAgTWFwPFN0cmluZywgaXIuTWVtYmVyPiBtZW1iZXJNYXAgPQogICAgICAgIHNvdXJjZS5yZWFkU3RyaW5nTWFwKHNvdXJjZS5yZWFkTWVtYmVyTm9kZSk7CiAgICBNYXA8U3RyaW5nLCBpci5NZW1iZXI+IHNldHRlck1hcCA9CiAgICAgICAgc291cmNlLnJlYWRTdHJpbmdNYXAoc291cmNlLnJlYWRNZW1iZXJOb2RlKTsKICAgIExpc3Q8aXIuTWVtYmVyPiBtZW1iZXJzID0gc291cmNlLnJlYWRNZW1iZXJOb2RlcygpOwogICAgYm9vbCBpc1N1cGVyTWl4aW5BcHBsaWNhdGlvbiA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKQ2xhc3NFbnZJbXBsKGNscywgY29uc3RydWN0b3JNYXAsIG1lbWJlck1hcCwgc2V0dGVyTWFwLCBtZW1iZXJzLAogICAgICAgIGlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpDbGFzc0VudktpbmQubm9kZSk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlQ2xhc3NOb2RlKGNscyk7CiAgICBzaW5rLndyaXRlU3RyaW5nTWFwKF9jb25zdHJ1Y3Rvck1hcCwgc2luay53cml0ZU1lbWJlck5vZGUpOwogICAgc2luay53cml0ZVN0cmluZ01hcChfbWVtYmVyTWFwLCBzaW5rLndyaXRlTWVtYmVyTm9kZSk7CiAgICBzaW5rLndyaXRlU3RyaW5nTWFwKF9zZXR0ZXJNYXAsIHNpbmsud3JpdGVNZW1iZXJOb2RlKTsKICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlcyhfbWVtYmVycyk7CiAgICBzaW5rLndyaXRlQm9vbChpc1N1cGVyTWl4aW5BcHBsaWNhdGlvbik7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbiA9PiBjbHMuaXNBbm9ueW1vdXNNaXhpbjsKCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGxvb2t1cE1lbWJlcihJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZX0pIHsKICAgIGlyLk1lbWJlciBtZW1iZXIgPSBzZXR0ZXIgPyBfc2V0dGVyTWFwW25hbWVdIDogX21lbWJlck1hcFtuYW1lXTsKICAgIHJldHVybiBtZW1iZXIgIT0gbnVsbCA/IGVsZW1lbnRNYXAuZ2V0TWVtYmVyKG1lbWJlcikgOiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoTWVtYmVyKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgX21lbWJlcnMuZm9yRWFjaCgoaXIuTWVtYmVyIG1lbWJlcikgewogICAgICBmKGVsZW1lbnRNYXAuZ2V0TWVtYmVyKG1lbWJlcikpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBsb29rdXBDb25zdHJ1Y3RvcihJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBTdHJpbmcgbmFtZSkgewogICAgaXIuTWVtYmVyIGNvbnN0cnVjdG9yID0gX2NvbnN0cnVjdG9yTWFwW25hbWVdOwogICAgcmV0dXJuIGNvbnN0cnVjdG9yICE9IG51bGwgPyBlbGVtZW50TWFwLmdldENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKSA6IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hDb25zdHJ1Y3RvcigKICAgICAgSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgdm9pZCBmKENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yKSkgewogICAgX2NvbnN0cnVjdG9yTWFwLnZhbHVlcy5mb3JFYWNoKChpci5NZW1iZXIgY29uc3RydWN0b3IpIHsKICAgICAgZihlbGVtZW50TWFwLmdldENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKSk7CiAgICB9KTsKICB9CgogIHZvaWQgYWRkQ29uc3RydWN0b3JCb2R5KENvbnN0cnVjdG9yQm9keUVudGl0eSBjb25zdHJ1Y3RvckJvZHkpIHsKICAgIF9jb25zdHJ1Y3RvckJvZHlMaXN0ID8/PSA8Q29uc3RydWN0b3JCb2R5RW50aXR5PltdOwogICAgX2NvbnN0cnVjdG9yQm9keUxpc3QuYWRkKGNvbnN0cnVjdG9yQm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hDb25zdHJ1Y3RvckJvZHkodm9pZCBmKENvbnN0cnVjdG9yQm9keUVudGl0eSBjb25zdHJ1Y3RvcikpIHsKICAgIF9jb25zdHJ1Y3RvckJvZHlMaXN0Py5mb3JFYWNoKGYpOwogIH0KfQoKY2xhc3MgUmVjb3JkRW52IGltcGxlbWVudHMgSkNsYXNzRW52IHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW1JlY29yZEVudl0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdyZWNvcmQtZW52JzsKCiAgZmluYWwgTWFwPFN0cmluZywgSW5kZXhlZE1lbWJlcj4gX21lbWJlck1hcDsKCiAgUmVjb3JkRW52KHRoaXMuX21lbWJlck1hcCk7CgogIGZhY3RvcnkgUmVjb3JkRW52LnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBNYXA8U3RyaW5nLCBJbmRleGVkTWVtYmVyPiBfbWVtYmVyTWFwID0KICAgICAgICBzb3VyY2UucmVhZFN0cmluZ01hcCgoKSA9PiBzb3VyY2UucmVhZE1lbWJlcigpKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgUmVjb3JkRW52KF9tZW1iZXJNYXApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSkNsYXNzRW52S2luZC5yZWNvcmQpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZVN0cmluZ01hcCgKICAgICAgICBfbWVtYmVyTWFwLCAoSW5kZXhlZE1lbWJlciBtZW1iZXIpID0+IHNpbmsud3JpdGVNZW1iZXIobWVtYmVyKSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoQ29uc3RydWN0b3JCb2R5KHZvaWQgZihDb25zdHJ1Y3RvckJvZHlFbnRpdHkgY29uc3RydWN0b3IpKSB7CiAgICAvLyBXZSBkbyBub3QgY3JlYXRlIGNvbnN0cnVjdG9yIGJvZGllcyBmb3IgY29udGFpbmVycy4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaENvbnN0cnVjdG9yKAogICAgICBJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCB2b2lkIGYoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpKSB7CiAgICAvLyBXZSBkbyBub3QgY3JlYXRlIGNvbnN0cnVjdG9ycyBmb3IgY29udGFpbmVycy4KICB9CgogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yRW50aXR5IGxvb2t1cENvbnN0cnVjdG9yKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIFN0cmluZyBuYW1lKSB7CiAgICAvLyBXZSBkbyBub3QgY3JlYXRlIGNvbnN0cnVjdG9ycyBmb3IgY29udGFpbmVycy4KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoTWVtYmVyKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgX21lbWJlck1hcC52YWx1ZXMuZm9yRWFjaChmKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBsb29rdXBNZW1iZXIoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICByZXR1cm4gX21lbWJlck1hcFtuYW1lXTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVW5uYW1lZE1peGluQXBwbGljYXRpb24gPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBpci5DbGFzcyBnZXQgY2xzID0+IG51bGw7Cn0KCmNsYXNzIENsb3N1cmVDbGFzc0VudiBleHRlbmRzIFJlY29yZEVudiB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtDbG9zdXJlQ2xhc3NFbnZdIG9iamVjdHMgaW4gYQogIC8vLyBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnY2xvc3VyZS1jbGFzcy1lbnYnOwoKICBDbG9zdXJlQ2xhc3NFbnYoTWFwPFN0cmluZywgTWVtYmVyRW50aXR5PiBtZW1iZXJNYXApIDogc3VwZXIobWVtYmVyTWFwKTsKCiAgZmFjdG9yeSBDbG9zdXJlQ2xhc3NFbnYucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIE1hcDxTdHJpbmcsIEluZGV4ZWRNZW1iZXI+IF9tZW1iZXJNYXAgPQogICAgICAgIHNvdXJjZS5yZWFkU3RyaW5nTWFwKCgpID0+IHNvdXJjZS5yZWFkTWVtYmVyKCkpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBDbG9zdXJlQ2xhc3NFbnYoX21lbWJlck1hcCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKQ2xhc3NFbnZLaW5kLmNsb3N1cmUpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZVN0cmluZ01hcCgKICAgICAgICBfbWVtYmVyTWFwLCAoSW5kZXhlZE1lbWJlciBtZW1iZXIpID0+IHNpbmsud3JpdGVNZW1iZXIobWVtYmVyKSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGxvb2t1cE1lbWJlcihJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZX0pIHsKICAgIGlmIChzZXR0ZXIpIHsKICAgICAgLy8gQWxsIGNsb3N1cmUgZmllbGRzIGFyZSBmaW5hbC4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gc3VwZXIubG9va3VwTWVtYmVyKGVsZW1lbnRNYXAsIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICB9Cn0KCi8vLyBFbnVtIHVzZWQgZm9yIGlkZW50aWZ5aW5nIFtKQ2xhc3NEYXRhXSBzdWJjbGFzc2VzIGluIHNlcmlhbGl6YXRpb24uCmVudW0gSkNsYXNzRGF0YUtpbmQgeyBub2RlLCBjbG9zdXJlLCByZWNvcmQgfQoKYWJzdHJhY3QgY2xhc3MgSkNsYXNzRGF0YSB7CiAgLy8vIERlc2VyaWFsaXplcyBhIFtKQ2xhc3NEYXRhXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IEpDbGFzc0RhdGEucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBKQ2xhc3NEYXRhS2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKEpDbGFzc0RhdGFLaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBKQ2xhc3NEYXRhS2luZC5ub2RlOgogICAgICAgIHJldHVybiBuZXcgSkNsYXNzRGF0YUltcGwucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSkNsYXNzRGF0YUtpbmQuY2xvc3VyZToKICAgICAgICByZXR1cm4gbmV3IENsb3N1cmVDbGFzc0RhdGEucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSkNsYXNzRGF0YUtpbmQucmVjb3JkOgogICAgICAgIHJldHVybiBuZXcgUmVjb3JkQ2xhc3NEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuZXhwZWN0ZWQgSkNsYXNzRGF0YUtpbmQgJGtpbmQiKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0pDbGFzc0RhdGFdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKTsKCiAgQ2xhc3NEZWZpbml0aW9uIGdldCBkZWZpbml0aW9uOwoKICBJbnRlcmZhY2VUeXBlIGdldCB0aGlzVHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCByYXdUeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IHN1cGVydHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCBtaXhlZEluVHlwZTsKICBMaXN0PEludGVyZmFjZVR5cGU+IGdldCBpbnRlcmZhY2VzOwogIE9yZGVyZWRUeXBlU2V0IGdldCBvcmRlcmVkVHlwZVNldDsKICBEYXJ0VHlwZSBnZXQgY2FsbFR5cGU7CgogIGJvb2wgZ2V0IGlzRW51bUNsYXNzOwogIGJvb2wgZ2V0IGlzTWl4aW5BcHBsaWNhdGlvbjsKfQoKY2xhc3MgSkNsYXNzRGF0YUltcGwgaW1wbGVtZW50cyBKQ2xhc3NEYXRhIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pDbGFzc0RhdGFJbXBsXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2NsYXNzLWRhdGEnOwoKICBmaW5hbCBpci5DbGFzcyBjbHM7CiAgQG92ZXJyaWRlCiAgZmluYWwgQ2xhc3NEZWZpbml0aW9uIGRlZmluaXRpb247CiAgQG92ZXJyaWRlCiAgYm9vbCBpc01peGluQXBwbGljYXRpb247CiAgYm9vbCBpc0NhbGxUeXBlQ29tcHV0ZWQgPSBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZTsKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIHJhd1R5cGU7CiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGU7CiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBtaXhlZEluVHlwZTsKICBAb3ZlcnJpZGUKICBMaXN0PEludGVyZmFjZVR5cGU+IGludGVyZmFjZXM7CiAgQG92ZXJyaWRlCiAgT3JkZXJlZFR5cGVTZXQgb3JkZXJlZFR5cGVTZXQ7CgogIEpDbGFzc0RhdGFJbXBsKHRoaXMuY2xzLCB0aGlzLmRlZmluaXRpb24pOwoKICBmYWN0b3J5IEpDbGFzc0RhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5DbGFzcyBjbHMgPSBzb3VyY2UucmVhZENsYXNzTm9kZSgpOwogICAgQ2xhc3NEZWZpbml0aW9uIGRlZmluaXRpb24gPSBuZXcgQ2xhc3NEZWZpbml0aW9uLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKQ2xhc3NEYXRhSW1wbChjbHMsIGRlZmluaXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSkNsYXNzRGF0YUtpbmQubm9kZSk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlQ2xhc3NOb2RlKGNscyk7CiAgICBkZWZpbml0aW9uLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0VudW1DbGFzcyA9PiBjbHMgIT0gbnVsbCAmJiBjbHMuaXNFbnVtOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXQgY2FsbFR5cGUgPT4gbnVsbDsKfQoKLy8vIEVudW0gdXNlZCBmb3IgaWRlbnRpZnlpbmcgW0pNZW1iZXJEYXRhXSBzdWJjbGFzc2VzIGluIHNlcmlhbGl6YXRpb24uCmVudW0gSk1lbWJlckRhdGFLaW5kIHsKICBmdW5jdGlvbiwKICBmaWVsZCwKICBjb25zdHJ1Y3RvciwKICBjb25zdHJ1Y3RvckJvZHksCiAgc2lnbmF0dXJlLAogIGdlbmVyYXRvckJvZHksCiAgY2xvc3VyZUZ1bmN0aW9uLAogIGNsb3N1cmVGaWVsZCwKfQoKYWJzdHJhY3QgY2xhc3MgSk1lbWJlckRhdGEgewogIE1lbWJlckRlZmluaXRpb24gZ2V0IGRlZmluaXRpb247CgogIEludGVyZmFjZVR5cGUgZ2V0TWVtYmVyVGhpc1R5cGUoSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCk7CgogIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIGdldCBjbGFzc1R5cGVWYXJpYWJsZUFjY2VzczsKCiAgU3RhdGljVHlwZUNhY2hlIGdldCBzdGF0aWNUeXBlczsKCiAgSk1lbWJlckRhdGEoKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtKTWVtYmVyRGF0YV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBKTWVtYmVyRGF0YS5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIEpNZW1iZXJEYXRhS2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKEpNZW1iZXJEYXRhS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgSk1lbWJlckRhdGFLaW5kLmZ1bmN0aW9uOgogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25EYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKTWVtYmVyRGF0YUtpbmQuZmllbGQ6CiAgICAgICAgcmV0dXJuIG5ldyBKRmllbGREYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKTWVtYmVyRGF0YUtpbmQuY29uc3RydWN0b3I6CiAgICAgICAgcmV0dXJuIG5ldyBKQ29uc3RydWN0b3JEYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKTWVtYmVyRGF0YUtpbmQuY29uc3RydWN0b3JCb2R5OgogICAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3JCb2R5RGF0YUltcGwucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSk1lbWJlckRhdGFLaW5kLnNpZ25hdHVyZToKICAgICAgICByZXR1cm4gbmV3IFNpZ25hdHVyZUZ1bmN0aW9uRGF0YS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBKTWVtYmVyRGF0YUtpbmQuZ2VuZXJhdG9yQm9keToKICAgICAgICByZXR1cm4gbmV3IEdlbmVyYXRvckJvZHlGdW5jdGlvbkRhdGEucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSk1lbWJlckRhdGFLaW5kLmNsb3N1cmVGdW5jdGlvbjoKICAgICAgICByZXR1cm4gbmV3IENsb3N1cmVGdW5jdGlvbkRhdGEucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgSk1lbWJlckRhdGFLaW5kLmNsb3N1cmVGaWVsZDoKICAgICAgICByZXR1cm4gbmV3IENsb3N1cmVGaWVsZERhdGEucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBKTWVtYmVyRGF0YUtpbmQgJGtpbmQiKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0pNZW1iZXJEYXRhXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7Cn0KCmFic3RyYWN0IGNsYXNzIEpNZW1iZXJEYXRhSW1wbCBpbXBsZW1lbnRzIEpNZW1iZXJEYXRhIHsKICBmaW5hbCBpci5NZW1iZXIgbm9kZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTdGF0aWNUeXBlQ2FjaGUgc3RhdGljVHlwZXM7CgogIEpNZW1iZXJEYXRhSW1wbCh0aGlzLm5vZGUsIHRoaXMuZGVmaW5pdGlvbiwgdGhpcy5zdGF0aWNUeXBlcyk7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0TWVtYmVyVGhpc1R5cGUoSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyKG5vZGUpOwogICAgQ2xhc3NFbnRpdHkgY2xzID0gbWVtYmVyLmVuY2xvc2luZ0NsYXNzOwogICAgaWYgKGNscyAhPSBudWxsKSB7CiAgICAgIHJldHVybiBlbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShjbHMpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBGdW5jdGlvbkRhdGEgaW1wbGVtZW50cyBKTWVtYmVyRGF0YSB7CiAgRnVuY3Rpb25UeXBlIGdldEZ1bmN0aW9uVHlwZShJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwKTsKCiAgTGlzdDxUeXBlVmFyaWFibGVUeXBlPiBnZXRGdW5jdGlvblR5cGVWYXJpYWJsZXMoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCk7CgogIHZvaWQgZm9yRWFjaFBhcmFtZXRlcigKICAgICAgSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwKICAgICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgdm9pZCBmKERhcnRUeXBlIHR5cGUsIFN0cmluZyBuYW1lLCBDb25zdGFudFZhbHVlIGRlZmF1bHRWYWx1ZSksCiAgICAgIHtib29sIGlzTmF0aXZlOiBmYWxzZX0pOwp9CgphYnN0cmFjdCBjbGFzcyBGdW5jdGlvbkRhdGFUeXBlVmFyaWFibGVzTWl4aW4gaW1wbGVtZW50cyBGdW5jdGlvbkRhdGEgewogIGlyLkZ1bmN0aW9uTm9kZSBnZXQgZnVuY3Rpb25Ob2RlOwogIExpc3Q8VHlwZVZhcmlhYmxlVHlwZT4gX3R5cGVWYXJpYWJsZXM7CgogIEBvdmVycmlkZQogIExpc3Q8VHlwZVZhcmlhYmxlVHlwZT4gZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKAogICAgICBjb3ZhcmlhbnQgSnNLZXJuZWxUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgaWYgKF90eXBlVmFyaWFibGVzID09IG51bGwpIHsKICAgICAgaWYgKGZ1bmN0aW9uTm9kZS50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgICAgX3R5cGVWYXJpYWJsZXMgPSBjb25zdCA8VHlwZVZhcmlhYmxlVHlwZT5bXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpci5UcmVlTm9kZSBwYXJlbnQgPSBmdW5jdGlvbk5vZGUucGFyZW50OwogICAgICAgIGlmIChwYXJlbnQgaXMgaXIuQ29uc3RydWN0b3IgfHwKICAgICAgICAgICAgKHBhcmVudCBpcyBpci5Qcm9jZWR1cmUgJiYKICAgICAgICAgICAgICAgIHBhcmVudC5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuRmFjdG9yeSkpIHsKICAgICAgICAgIF90eXBlVmFyaWFibGVzID0gY29uc3QgPFR5cGVWYXJpYWJsZVR5cGU+W107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF90eXBlVmFyaWFibGVzID0gZnVuY3Rpb25Ob2RlLnR5cGVQYXJhbWV0ZXJzCiAgICAgICAgICAgICAgLm1hcDxUeXBlVmFyaWFibGVUeXBlPigoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50TWFwCiAgICAgICAgICAgICAgICAuZ2V0RGFydFR5cGUobmV3IGlyLlR5cGVQYXJhbWV0ZXJUeXBlKHR5cGVQYXJhbWV0ZXIpKTsKICAgICAgICAgIH0pLnRvTGlzdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIF90eXBlVmFyaWFibGVzOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgRnVuY3Rpb25EYXRhRm9yRWFjaFBhcmFtZXRlck1peGluIGltcGxlbWVudHMgRnVuY3Rpb25EYXRhIHsKICBpci5GdW5jdGlvbk5vZGUgZ2V0IGZ1bmN0aW9uTm9kZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoUGFyYW1ldGVyKAogICAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLAogICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICB2b2lkIGYoRGFydFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIENvbnN0YW50VmFsdWUgZGVmYXVsdFZhbHVlKSwKICAgICAge2Jvb2wgaXNOYXRpdmU6IGZhbHNlfSkgewogICAgdm9pZCBoYW5kbGVQYXJhbWV0ZXIoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlLCB7Ym9vbCBpc09wdGlvbmFsOiB0cnVlfSkgewogICAgICBEYXJ0VHlwZSB0eXBlID0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLnR5cGUpOwogICAgICBTdHJpbmcgbmFtZSA9IG5vZGUubmFtZTsKICAgICAgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0VmFsdWU7CiAgICAgIGlmIChpc09wdGlvbmFsKSB7CiAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgZGVmYXVsdFZhbHVlID0gZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBuZXcgTnVsbENvbnN0YW50VmFsdWUoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZih0eXBlLCBuYW1lLCBkZWZhdWx0VmFsdWUpOwogICAgfQoKICAgIGZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQnlGdW5jdGlvbk5vZGUoZnVuY3Rpb25Ob2RlLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyLCB7Ym9vbCBpc09wdGlvbmFsLCBib29sIGlzRWxpZGVkfSkgewogICAgICBpZiAoIWlzRWxpZGVkKSB7CiAgICAgICAgaGFuZGxlUGFyYW1ldGVyKHBhcmFtZXRlciwgaXNPcHRpb25hbDogaXNPcHRpb25hbCk7CiAgICAgIH0KICAgIH0sIHVzZU5hdGl2ZU9yZGVyaW5nOiBpc05hdGl2ZSk7CiAgfQp9CgpjbGFzcyBGdW5jdGlvbkRhdGFJbXBsIGV4dGVuZHMgSk1lbWJlckRhdGFJbXBsCiAgICB3aXRoIEZ1bmN0aW9uRGF0YVR5cGVWYXJpYWJsZXNNaXhpbiwgRnVuY3Rpb25EYXRhRm9yRWFjaFBhcmFtZXRlck1peGluCiAgICBpbXBsZW1lbnRzIEZ1bmN0aW9uRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtGdW5jdGlvbkRhdGFJbXBsXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2Z1bmN0aW9uLWRhdGEnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlOwogIEZ1bmN0aW9uVHlwZSBfdHlwZTsKCiAgRnVuY3Rpb25EYXRhSW1wbChpci5NZW1iZXIgbm9kZSwgdGhpcy5mdW5jdGlvbk5vZGUsCiAgICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RhdGljVHlwZUNhY2hlIHN0YXRpY1R5cGVzKQogICAgICA6IHN1cGVyKG5vZGUsIGRlZmluaXRpb24sIHN0YXRpY1R5cGVzKTsKCiAgZmFjdG9yeSBGdW5jdGlvbkRhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5NZW1iZXIgbm9kZSA9IHNvdXJjZS5yZWFkTWVtYmVyTm9kZSgpOwogICAgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZTsKICAgIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICBmdW5jdGlvbk5vZGUgPSBub2RlLmZ1bmN0aW9uOwogICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgIGZ1bmN0aW9uTm9kZSA9IG5vZGUuZnVuY3Rpb247CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJVbmV4cGVjdGVkIG1lbWJlciBub2RlICRub2RlICgke25vZGUucnVudGltZVR5cGV9KS4iKTsKICAgIH0KICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9CiAgICAgICAgbmV3IE1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBTdGF0aWNUeXBlQ2FjaGUgc3RhdGljVHlwZXMgPQogICAgICAgIG5ldyBTdGF0aWNUeXBlQ2FjaGUucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgbm9kZSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uRGF0YUltcGwobm9kZSwgZnVuY3Rpb25Ob2RlLCBkZWZpbml0aW9uLCBzdGF0aWNUeXBlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKTWVtYmVyRGF0YUtpbmQuZnVuY3Rpb24pOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZU1lbWJlck5vZGUobm9kZSk7CiAgICBkZWZpbml0aW9uLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHN0YXRpY1R5cGVzLndyaXRlVG9EYXRhU2luayhzaW5rLCBub2RlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvblR5cGUgZ2V0RnVuY3Rpb25UeXBlKGNvdmFyaWFudCBKc0tlcm5lbFRvRWxlbWVudE1hcCBlbGVtZW50TWFwKSB7CiAgICByZXR1cm4gX3R5cGUgPz89IGVsZW1lbnRNYXAuZ2V0RnVuY3Rpb25UeXBlKGZ1bmN0aW9uTm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyBnZXQgY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgewogICAgaWYgKG5vZGUuaXNJbnN0YW5jZU1lbWJlcikgcmV0dXJuIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzLnByb3BlcnR5OwogICAgcmV0dXJuIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzLm5vbmU7CiAgfQp9CgpjbGFzcyBTaWduYXR1cmVGdW5jdGlvbkRhdGEgaW1wbGVtZW50cyBGdW5jdGlvbkRhdGEgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbU2lnbmF0dXJlRnVuY3Rpb25EYXRhXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ3NpZ25hdHVyZS1mdW5jdGlvbi1kYXRhJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uOwogIGZpbmFsIEludGVyZmFjZVR5cGUgbWVtYmVyVGhpc1R5cGU7CiAgQG92ZXJyaWRlCiAgZmluYWwgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3M7CiAgZmluYWwgTGlzdDxpci5UeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKCiAgU2lnbmF0dXJlRnVuY3Rpb25EYXRhKHRoaXMuZGVmaW5pdGlvbiwgdGhpcy5tZW1iZXJUaGlzVHlwZSwKICAgICAgdGhpcy50eXBlUGFyYW1ldGVycywgdGhpcy5jbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcyk7CgogIGZhY3RvcnkgU2lnbmF0dXJlRnVuY3Rpb25EYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPQogICAgICAgIG5ldyBNZW1iZXJEZWZpbml0aW9uLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgSW50ZXJmYWNlVHlwZSBtZW1iZXJUaGlzVHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGUoYWxsb3dOdWxsOiB0cnVlKTsKICAgIExpc3Q8aXIuVHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBzb3VyY2UucmVhZFR5cGVQYXJhbWV0ZXJOb2RlcygpOwogICAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgPQogICAgICAgIHNvdXJjZS5yZWFkRW51bShDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy52YWx1ZXMpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBTaWduYXR1cmVGdW5jdGlvbkRhdGEoCiAgICAgICAgZGVmaW5pdGlvbiwgbWVtYmVyVGhpc1R5cGUsIHR5cGVQYXJhbWV0ZXJzLCBjbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlRW51bShKTWVtYmVyRGF0YUtpbmQuc2lnbmF0dXJlKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGRlZmluaXRpb24ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZURhcnRUeXBlKG1lbWJlclRoaXNUeXBlLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZVR5cGVQYXJhbWV0ZXJOb2Rlcyh0eXBlUGFyYW1ldGVycyk7CiAgICBzaW5rLndyaXRlRW51bShjbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcyk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGljVHlwZUNhY2hlIGdldCBzdGF0aWNUeXBlcyA9PiBjb25zdCBTdGF0aWNUeXBlQ2FjaGUoKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25UeXBlIGdldEZ1bmN0aW9uVHlwZShjb3ZhcmlhbnQgSnNLZXJuZWxUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlNpZ25hdHVyZUZ1bmN0aW9uRGF0YS5nZXRGdW5jdGlvblR5cGUiKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8VHlwZVZhcmlhYmxlVHlwZT4gZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiB0eXBlUGFyYW1ldGVycwogICAgICAgIC5tYXA8VHlwZVZhcmlhYmxlVHlwZT4oKGlyLlR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlcikgewogICAgICByZXR1cm4gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShuZXcgaXIuVHlwZVBhcmFtZXRlclR5cGUodHlwZVBhcmFtZXRlcikpOwogICAgfSkudG9MaXN0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hQYXJhbWV0ZXIoCiAgICAgIEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsCiAgICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgIHZvaWQgZihEYXJ0VHlwZSB0eXBlLCBTdHJpbmcgbmFtZSwgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0VmFsdWUpLAogICAgICB7Ym9vbCBpc05hdGl2ZTogZmFsc2V9KSB7CiAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCdTaWduYXR1cmVEYXRhLmZvckVhY2hQYXJhbWV0ZXInKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0TWVtYmVyVGhpc1R5cGUoSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgcmV0dXJuIG1lbWJlclRoaXNUeXBlOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgRGVsZWdhdGVkRnVuY3Rpb25EYXRhIGltcGxlbWVudHMgRnVuY3Rpb25EYXRhIHsKICBmaW5hbCBGdW5jdGlvbkRhdGEgYmFzZURhdGE7CgogIERlbGVnYXRlZEZ1bmN0aW9uRGF0YSh0aGlzLmJhc2VEYXRhKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25UeXBlIGdldEZ1bmN0aW9uVHlwZShjb3ZhcmlhbnQgSnNLZXJuZWxUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgcmV0dXJuIGJhc2VEYXRhLmdldEZ1bmN0aW9uVHlwZShlbGVtZW50TWFwKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8VHlwZVZhcmlhYmxlVHlwZT4gZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBiYXNlRGF0YS5nZXRGdW5jdGlvblR5cGVWYXJpYWJsZXMoZWxlbWVudE1hcCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hQYXJhbWV0ZXIoCiAgICAgIEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsCiAgICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgIHZvaWQgZihEYXJ0VHlwZSB0eXBlLCBTdHJpbmcgbmFtZSwgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0VmFsdWUpLAogICAgICB7Ym9vbCBpc05hdGl2ZTogZmFsc2V9KSB7CiAgICByZXR1cm4gYmFzZURhdGEuZm9yRWFjaFBhcmFtZXRlcihlbGVtZW50TWFwLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsIGYsCiAgICAgICAgaXNOYXRpdmU6IGlzTmF0aXZlKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0TWVtYmVyVGhpc1R5cGUoSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgcmV0dXJuIGJhc2VEYXRhLmdldE1lbWJlclRoaXNUeXBlKGVsZW1lbnRNYXApOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgZ2V0IGNsYXNzVHlwZVZhcmlhYmxlQWNjZXNzID0+CiAgICAgIGJhc2VEYXRhLmNsYXNzVHlwZVZhcmlhYmxlQWNjZXNzOwp9CgpjbGFzcyBHZW5lcmF0b3JCb2R5RnVuY3Rpb25EYXRhIGV4dGVuZHMgRGVsZWdhdGVkRnVuY3Rpb25EYXRhIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0dlbmVyYXRvckJvZHlGdW5jdGlvbkRhdGFdIG9iamVjdHMgaW4KICAvLy8gYSBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnZ2VuZXJhdG9yLWJvZHktZGF0YSc7CgogIEBvdmVycmlkZQogIGZpbmFsIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbjsKCiAgR2VuZXJhdG9yQm9keUZ1bmN0aW9uRGF0YShGdW5jdGlvbkRhdGEgYmFzZURhdGEsIHRoaXMuZGVmaW5pdGlvbikKICAgICAgOiBzdXBlcihiYXNlRGF0YSk7CgogIGZhY3RvcnkgR2VuZXJhdG9yQm9keUZ1bmN0aW9uRGF0YS5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hhcmUgdGhlIG9yaWdpbmFsIGJhc2UgZGF0YSBvbiBkZXNlcmlhbGl6YXRpb24uCiAgICBGdW5jdGlvbkRhdGEgYmFzZURhdGEgPSBuZXcgSk1lbWJlckRhdGEucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPQogICAgICAgIG5ldyBNZW1iZXJEZWZpbml0aW9uLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBHZW5lcmF0b3JCb2R5RnVuY3Rpb25EYXRhKGJhc2VEYXRhLCBkZWZpbml0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJEYXRhS2luZC5nZW5lcmF0b3JCb2R5KTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIGJhc2VEYXRhLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIGRlZmluaXRpb24ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRpY1R5cGVDYWNoZSBnZXQgc3RhdGljVHlwZXMgPT4gY29uc3QgU3RhdGljVHlwZUNhY2hlKCk7Cn0KCmFic3RyYWN0IGNsYXNzIEpDb25zdHJ1Y3RvckRhdGEgZXh0ZW5kcyBGdW5jdGlvbkRhdGEgewogIENvbnN0YW50Q29uc3RydWN0b3IgZ2V0Q29uc3RydWN0b3JDb25zdGFudCgKICAgICAgSnNLZXJuZWxUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpOwp9CgpjbGFzcyBKQ29uc3RydWN0b3JEYXRhSW1wbCBleHRlbmRzIEZ1bmN0aW9uRGF0YUltcGwKICAgIGltcGxlbWVudHMgSkNvbnN0cnVjdG9yRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKQ29uc3RydWN0b3JEYXRhSW1wbF0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjb25zdHJ1Y3Rvci1kYXRhJzsKCiAgQ29uc3RhbnRDb25zdHJ1Y3RvciBfY29uc3RhbnRDb25zdHJ1Y3RvcjsKICBKQ29uc3RydWN0b3JCb2R5IGNvbnN0cnVjdG9yQm9keTsKCiAgSkNvbnN0cnVjdG9yRGF0YUltcGwoaXIuTWVtYmVyIG5vZGUsIGlyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbk5vZGUsCiAgICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RhdGljVHlwZUNhY2hlIHN0YXRpY1R5cGVzKQogICAgICA6IHN1cGVyKG5vZGUsIGZ1bmN0aW9uTm9kZSwgZGVmaW5pdGlvbiwgc3RhdGljVHlwZXMpOwoKICBmYWN0b3J5IEpDb25zdHJ1Y3RvckRhdGFJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5NZW1iZXIgbm9kZSA9IHNvdXJjZS5yZWFkTWVtYmVyTm9kZSgpOwogICAgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZTsKICAgIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICBmdW5jdGlvbk5vZGUgPSBub2RlLmZ1bmN0aW9uOwogICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgIGZ1bmN0aW9uTm9kZSA9IG5vZGUuZnVuY3Rpb247CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJVbmV4cGVjdGVkIG1lbWJlciBub2RlICRub2RlICgke25vZGUucnVudGltZVR5cGV9KS4iKTsKICAgIH0KICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9CiAgICAgICAgbmV3IE1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBTdGF0aWNUeXBlQ2FjaGUgc3RhdGljVHlwZXMgPQogICAgICAgIG5ldyBTdGF0aWNUeXBlQ2FjaGUucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgbm9kZSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpDb25zdHJ1Y3RvckRhdGFJbXBsKAogICAgICAgIG5vZGUsIGZ1bmN0aW9uTm9kZSwgZGVmaW5pdGlvbiwgc3RhdGljVHlwZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUVudW0oSk1lbWJlckRhdGFLaW5kLmNvbnN0cnVjdG9yKTsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlKG5vZGUpOwogICAgZGVmaW5pdGlvbi53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBhc3NlcnQoY29uc3RydWN0b3JCb2R5ID09IG51bGwpOwogICAgc3RhdGljVHlwZXMud3JpdGVUb0RhdGFTaW5rKHNpbmssIG5vZGUpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50Q29uc3RydWN0b3IgZ2V0Q29uc3RydWN0b3JDb25zdGFudCgKICAgICAgSnNLZXJuZWxUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpIHsKICAgIGlmIChfY29uc3RhbnRDb25zdHJ1Y3RvciA9PSBudWxsKSB7CiAgICAgIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yICYmIGNvbnN0cnVjdG9yLmlzQ29uc3QpIHsKICAgICAgICBfY29uc3RhbnRDb25zdHJ1Y3RvciA9CiAgICAgICAgICAgIG5ldyBDb25zdGFudGlmaWVyKGVsZW1lbnRNYXApLmNvbXB1dGVDb25zdGFudENvbnN0cnVjdG9yKG5vZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBjb25zdHJ1Y3RvciwKICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY29uc3RydWN0b3IgJGNvbnN0cnVjdG9yIGluICIKICAgICAgICAgICAgIkNvbnN0cnVjdG9yRGF0YUltcGwuX2dldENvbnN0cnVjdG9yQ29uc3RhbnQiKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9jb25zdGFudENvbnN0cnVjdG9yOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgZ2V0IGNsYXNzVHlwZVZhcmlhYmxlQWNjZXNzID0+CiAgICAgIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzLnBhcmFtZXRlcjsKfQoKY2xhc3MgQ29uc3RydWN0b3JCb2R5RGF0YUltcGwgZXh0ZW5kcyBGdW5jdGlvbkRhdGFJbXBsIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0NvbnN0cnVjdG9yQm9keURhdGFJbXBsXSBvYmplY3RzIGluCiAgLy8vIGEgZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2NvbnN0cnVjdG9yLWJvZHktZGF0YSc7CgogIENvbnN0cnVjdG9yQm9keURhdGFJbXBsKGlyLk1lbWJlciBub2RlLCBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlLAogICAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0YXRpY1R5cGVDYWNoZSBzdGF0aWNUeXBlcykKICAgICAgOiBzdXBlcihub2RlLCBmdW5jdGlvbk5vZGUsIGRlZmluaXRpb24sIHN0YXRpY1R5cGVzKTsKCiAgZmFjdG9yeSBDb25zdHJ1Y3RvckJvZHlEYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuTWVtYmVyIG5vZGUgPSBzb3VyY2UucmVhZE1lbWJlck5vZGUoKTsKICAgIGlyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbk5vZGU7CiAgICBpZiAobm9kZSBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgZnVuY3Rpb25Ob2RlID0gbm9kZS5mdW5jdGlvbjsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICBmdW5jdGlvbk5vZGUgPSBub2RlLmZ1bmN0aW9uOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiVW5leHBlY3RlZCBtZW1iZXIgbm9kZSAkbm9kZSAoJHtub2RlLnJ1bnRpbWVUeXBlfSkuIik7CiAgICB9CiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPQogICAgICAgIG5ldyBNZW1iZXJEZWZpbml0aW9uLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgU3RhdGljVHlwZUNhY2hlIHN0YXRpY1R5cGVzID0KICAgICAgICBuZXcgU3RhdGljVHlwZUNhY2hlLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIG5vZGUpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvckJvZHlEYXRhSW1wbCgKICAgICAgICBub2RlLCBmdW5jdGlvbk5vZGUsIGRlZmluaXRpb24sIHN0YXRpY1R5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJEYXRhS2luZC5jb25zdHJ1Y3RvckJvZHkpOwogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZU1lbWJlck5vZGUobm9kZSk7CiAgICBkZWZpbml0aW9uLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHN0YXRpY1R5cGVzLndyaXRlVG9EYXRhU2luayhzaW5rLCBub2RlKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIsc3JhKTogQ29uc3RydWN0b3IgYm9kaWVzIHNob3VsZCBhY2Nlc3MgdHlwZSB2YXJpYWJsZXMKICAvLyB0aHJvdWdoIGB0aGlzYC4KICBAb3ZlcnJpZGUKICBDbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyBnZXQgY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgPT4KICAgICAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MucGFyYW1ldGVyOwp9CgphYnN0cmFjdCBjbGFzcyBKRmllbGREYXRhIGV4dGVuZHMgSk1lbWJlckRhdGEgewogIERhcnRUeXBlIGdldEZpZWxkVHlwZShJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwKTsKCiAgQ29uc3RhbnRFeHByZXNzaW9uIGdldEZpZWxkQ29uc3RhbnRFeHByZXNzaW9uKAogICAgICBKc0tlcm5lbFRvRWxlbWVudE1hcCBlbGVtZW50TWFwKTsKfQoKY2xhc3MgSkZpZWxkRGF0YUltcGwgZXh0ZW5kcyBKTWVtYmVyRGF0YUltcGwgaW1wbGVtZW50cyBKRmllbGREYXRhIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pGaWVsZERhdGFJbXBsXSBvYmplY3RzIGluCiAgLy8vIGEgZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2ZpZWxkLWRhdGEnOwoKICBEYXJ0VHlwZSBfdHlwZTsKICBDb25zdGFudEV4cHJlc3Npb24gX2NvbnN0YW50RXhwcmVzc2lvbjsKCiAgSkZpZWxkRGF0YUltcGwoCiAgICAgIGlyLkZpZWxkIG5vZGUsIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RhdGljVHlwZUNhY2hlIHN0YXRpY1R5cGVzKQogICAgICA6IHN1cGVyKG5vZGUsIGRlZmluaXRpb24sIHN0YXRpY1R5cGVzKTsKCiAgZmFjdG9yeSBKRmllbGREYXRhSW1wbC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuTWVtYmVyIG5vZGUgPSBzb3VyY2UucmVhZE1lbWJlck5vZGUoKTsKICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbiA9CiAgICAgICAgbmV3IE1lbWJlckRlZmluaXRpb24ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBTdGF0aWNUeXBlQ2FjaGUgc3RhdGljVHlwZXMgPQogICAgICAgIG5ldyBTdGF0aWNUeXBlQ2FjaGUucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSwgbm9kZSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEpGaWVsZERhdGFJbXBsKG5vZGUsIGRlZmluaXRpb24sIHN0YXRpY1R5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVFbnVtKEpNZW1iZXJEYXRhS2luZC5maWVsZCk7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVyTm9kZShub2RlKTsKICAgIGRlZmluaXRpb24ud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc3RhdGljVHlwZXMud3JpdGVUb0RhdGFTaW5rKHNpbmssIG5vZGUpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIGlyLkZpZWxkIGdldCBub2RlID0+IHN1cGVyLm5vZGU7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldEZpZWxkVHlwZShjb3ZhcmlhbnQgSnNLZXJuZWxUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgcmV0dXJuIF90eXBlID8/PSBlbGVtZW50TWFwLmdldERhcnRUeXBlKG5vZGUudHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb24oCiAgICAgIEpzS2VybmVsVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIGlmIChfY29uc3RhbnRFeHByZXNzaW9uID09IG51bGwpIHsKICAgICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICAgIF9jb25zdGFudEV4cHJlc3Npb24gPQogICAgICAgICAgICBuZXcgQ29uc3RhbnRpZmllcihlbGVtZW50TWFwKS52aXNpdChub2RlLmluaXRpYWxpemVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgZGVmaW5pdGlvbi5sb2NhdGlvbiwKICAgICAgICAgICAgIlVuZXhwZWN0ZWQgZmllbGQgJHtkZWZpbml0aW9ufSBpbiAiCiAgICAgICAgICAgICJGaWVsZERhdGFJbXBsLmdldEZpZWxkQ29uc3RhbnQiKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9jb25zdGFudEV4cHJlc3Npb247CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyBnZXQgY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgewogICAgaWYgKG5vZGUuaXNJbnN0YW5jZU1lbWJlcikgcmV0dXJuIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzLmluc3RhbmNlRmllbGQ7CiAgICByZXR1cm4gQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3Mubm9uZTsKICB9Cn0KCmNsYXNzIEpUeXBlZGVmRGF0YSB7CiAgLy8vIFRhZyB1c2VkIGZvciBpZGVudGlmeWluZyBzZXJpYWxpemVkIFtKVHlwZWRlZkRhdGFdIG9iamVjdHMgaW4KICAvLy8gYSBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAndHlwZWRlZi1kYXRhJzsKCiAgZmluYWwgaXIuVHlwZWRlZiBub2RlOwogIGZpbmFsIFR5cGVkZWZUeXBlIHJhd1R5cGU7CgogIEpUeXBlZGVmRGF0YSh0aGlzLm5vZGUsIHRoaXMucmF3VHlwZSk7CgogIGZhY3RvcnkgSlR5cGVkZWZEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5UeXBlZGVmIG5vZGUgPSBzb3VyY2UucmVhZFR5cGVkZWZOb2RlKCk7CiAgICBUeXBlZGVmVHlwZSByYXdUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZSgpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBKVHlwZWRlZkRhdGEobm9kZSwgcmF3VHlwZSk7CiAgfQoKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlVHlwZWRlZk5vZGUobm9kZSk7CiAgICBzaW5rLndyaXRlRGFydFR5cGUocmF3VHlwZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgSlR5cGVWYXJpYWJsZURhdGEgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbSlR5cGVWYXJpYWJsZURhdGFdIG9iamVjdHMgaW4KICAvLy8gYSBkZWJ1Z2dpbmcgZGF0YSBzdHJlYW0uCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAndHlwZS12YXJpYWJsZS1kYXRhJzsKCiAgZmluYWwgaXIuVHlwZVBhcmFtZXRlciBub2RlOwogIERhcnRUeXBlIF9ib3VuZDsKICBEYXJ0VHlwZSBfZGVmYXVsdFR5cGU7CgogIEpUeXBlVmFyaWFibGVEYXRhKHRoaXMubm9kZSk7CgogIGZhY3RvcnkgSlR5cGVWYXJpYWJsZURhdGEucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLlR5cGVQYXJhbWV0ZXIgbm9kZSA9IHNvdXJjZS5yZWFkVHlwZVBhcmFtZXRlck5vZGUoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgSlR5cGVWYXJpYWJsZURhdGEobm9kZSk7CiAgfQoKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlVHlwZVBhcmFtZXRlck5vZGUobm9kZSk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgRGFydFR5cGUgZ2V0Qm91bmQoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCkgewogICAgcmV0dXJuIF9ib3VuZCA/Pz0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLmJvdW5kKTsKICB9CgogIERhcnRUeXBlIGdldERlZmF1bHRUeXBlKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBfZGVmYXVsdFR5cGUgPz89IGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS5kZWZhdWx0VHlwZSk7CiAgfQp9CoRJAE5OPAEeASgBGSkoIyQjISEnHiciLiMXGyAYATgULDABIQFCPQE3ASouBAFJJx0EATY1IwQBOxMfBAIBQBRFHSsBHC8rKwE/ATk+FzMnNSc1FTsEAS8oFSQ7OxMEATggBAFAJxwEATAtIQQBQT45BAExIjIkEw82CAYEAgEVRh0sARxQQzkBLAE/FzMoNRsULiYzNwgGFS8EASgVJBsYDSUVQC0eICQKEQgGEwQCAUctAR0bNzxAFB89Ij8hOQZDBAEtJwE1FAE5JgFQDSQBUEsQRB0BKk4BSk8BLxtJAUsNSgIBMitDHSkBDBYwKys7DCYBMTQBQUUBQBcrLDUnNSc1ODYVUSIEAQwoKBUeQDs7JS0TBAEMPgEMRB5FQQQBDE8qJwgEAQxQM1AEAQwbSj0xCAQBQzgvBAEMSyYEAgEnQx0qAS8BHgE8Fyw5FSYEAQwoKhUZSRMEAQxLOwQBDBtKNQQBDFA1EQQBDE8iBAEMRB4dBAEMLwEMLQEMHAIBKkkdMQFLAUIXLDkVLAQBDCgrFRlJEwQBDEQeEicTBkEEAgFILgEcOD1CFCA+I0AiPwZDBAEuJwEiAR4dHyEmJRkBGB8CAS1IHSoBFgwkDBsjAQwaDBkMGwwdDCIMIQEtAUEXK1EVMAQBDCgpFR4mEwQBDDUBDCECAUkXDAkPEw0RExACAR0jAT4BNwEjAREBOT5EFCVAIj4oRCxHJkUqSSxDKUAGRAQBLycCATgYAQwlAQwlAUEBDD82LRc9BhEEAgE1OwFOARkhLUYfAgFIJCkBDDMzIjE1DzIoJzw3ETdIHkcXCggGGwQCAUskAQwZIS1GIFE5HyIYKEgRMgoIIwYBTE8XPAglBAIBL0seSh0tAQwmFgE2QC4BQxcuIiAkKSQNIkIGIjkiPhVOBAEMKC4VICYtEwQBDEw/BAEMOEgpBAIBNk8dNwEMJSYMOS8BPjoBSBciOUlNNjkVJk4EAQwoLxUmOTItEwQBDD4BDExJBAEMTxpCThEEAQwZIS1GIEQEAQw/GwQCAT8fASgBDEwxBAEMTzoEAQwZIS1GIEgdBAEMPzMEAQw5KAIBQFEfMwEMJQFEGQFMF01IIjkVQAQBDCgzFSQmEwQBDD4CATcuRwIBNCJOHTABLCQBRUA8AUcXLiIgJCkkDSJCBiI5Ij4VJTYEAQwoMRUgJiUtEwQBDC5IKDsfTA8SGTY8CAYhBAEMOSkCATlPHzUBSEA8AUoXLiIgJCkkDSJCBiI5Ij4VKDYEAQwoNRUgJi0TBAFOFQw5KQIBMDQBMSgCAUVGHyoBEioBEk8uAUEXLiI5Ij4VPgQBDCgrFSAmLRMEAQwjAQxFOAQBDDEpJxoeQw8SITEvCAYgBAEMOE0pBAIBFUQfLAEZHQEpAT8XMDEVLAQBKBUhIRMEAgEaSR8yAR8TGQEgAUQXPBUoBAEoFScTBAExOgQBN0YEAgEmcGFja2FnZTpjb21waWxlci9zcmMvanNfbW9kZWwvZW52LmRhcnQ8c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfbW9kZWwvZWxlbWVudF9tYXBfaW1wbC5kYXJ0wAF7uC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JyBzaG93IExpbmssIExpbmtCdWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2Nsb3N1cmUuZGFydCcgc2hvdyBCb3hMb2NhbCwgVGhpc0xvY2FsOwppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbXBpbGVfdGltZV9jb25zdGFudHMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0cnVjdG9ycy5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvZXZhbHVhdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvZXhwcmVzc2lvbnMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9kZWZlcnJlZF9sb2FkLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0eV91dGlscy5kYXJ0JyBhcyB1dGlsczsKaW1wb3J0ICcuLi9lbGVtZW50cy9pbmRleGVkLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2Vudmlyb25tZW50LmRhcnQnOwppbXBvcnQgJy4uL2lyL2NhY2hlZF9zdGF0aWNfdHlwZS5kYXJ0JzsKaW1wb3J0ICcuLi9pci9jbG9zdXJlLmRhcnQnOwppbXBvcnQgJy4uL2lyL2RlYnVnLmRhcnQnOwppbXBvcnQgJy4uL2lyL2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJy4uL2lyL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2lyL3Zpc2l0b3JzLmRhcnQnOwppbXBvcnQgJy4uL2lyL3N0YXRpY190eXBlX2Jhc2UuZGFydCc7CmltcG9ydCAnLi4vaXIvc3RhdGljX3R5cGVfY2FjaGUuZGFydCc7CmltcG9ydCAnLi4vaXIvc3RhdGljX3R5cGVfcHJvdmlkZXIuZGFydCc7CmltcG9ydCAnLi4vaXIvdXRpbC5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnLi4va2VybmVsL2VsZW1lbnRfbWFwX2ltcGwuZGFydCc7CmltcG9ydCAnLi4va2VybmVsL2Vudi5kYXJ0JzsKaW1wb3J0ICcuLi9rZXJuZWwva2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9iZWhhdmlvci5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL29yZGVyZWRfdHlwZXNldC5kYXJ0JzsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vc3NhL3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9tZW1iZXJfdXNhZ2UuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CgppbXBvcnQgJ2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnZWxlbWVudHMuZGFydCc7CmltcG9ydCAnZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnZW52LmRhcnQnOwppbXBvcnQgJ2xvY2Fscy5kYXJ0JzsKCmNsYXNzIEpzS2VybmVsVG9FbGVtZW50TWFwIGltcGxlbWVudHMgSnNUb0VsZW1lbnRNYXAsIElyVG9FbGVtZW50TWFwIHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW0pzS2VybmVsVG9FbGVtZW50TWFwXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2pzLWtlcm5lbC10by1lbGVtZW50LW1hcCc7CgogIC8vLyBUYWdzIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgc3Vic2VjdGlvbnMgb2YgYQogIC8vLyBbSnNLZXJuZWxUb0VsZW1lbnRNYXBdIG9iamVjdCBpbiBhIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIGxpYnJhcnlUYWcgPSAnbGlicmFyaWVzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGNsYXNzVGFnID0gJ2NsYXNzZXMnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgdHlwZWRlZlRhZyA9ICd0eXBlZGVmcyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBtZW1iZXJUYWcgPSAnbWVtYmVycyc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0eXBlVmFyaWFibGVUYWcgPSAndHlwZS12YXJpYWJsZXMnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgbGlicmFyeURhdGFUYWcgPSAnbGlicmFyeS1kYXRhJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGNsYXNzRGF0YVRhZyA9ICdjbGFzcy1kYXRhJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHR5cGVkZWZEYXRhVGFnID0gJ3R5cGVkZWYtZGF0YSc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBtZW1iZXJEYXRhVGFnID0gJ21lbWJlci1kYXRhJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHR5cGVWYXJpYWJsZURhdGFUYWcgPSAndHlwZS12YXJpYWJsZS1kYXRhJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIG5lc3RlZENsb3N1cmVzVGFnID0gJ25lc3RlZC1jbG9zdXJlcyc7CgogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zOwogIEBvdmVycmlkZQogIGZpbmFsIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlcjsKICBDb21tb25FbGVtZW50c0ltcGwgX2NvbW1vbkVsZW1lbnRzOwogIEpzRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CiAgRGFydFR5cGVDb252ZXJ0ZXIgX3R5cGVDb252ZXJ0ZXI7CiAgSnNDb25zdGFudEVudmlyb25tZW50IF9jb25zdGFudEVudmlyb25tZW50OwogIEtlcm5lbERhcnRUeXBlcyBfdHlwZXM7CiAgaXIuVHlwZUVudmlyb25tZW50IF90eXBlRW52aXJvbm1lbnQ7CiAgaXIuQ2xhc3NIaWVyYXJjaHkgX2NsYXNzSGllcmFyY2h5OwogIENvbnN0YW50VmFsdWVmaWVyIF9jb25zdGFudFZhbHVlZmllcjsKCiAgLy8vIExpYnJhcnkgZW52aXJvbm1lbnQuIFVzZWQgZm9yIGZhc3QgbG9va3VwLgogIEpQcm9ncmFtRW52IHByb2dyYW1FbnY7CgogIGZpbmFsIEVudGl0eURhdGFFbnZNYXA8SW5kZXhlZExpYnJhcnksIEpMaWJyYXJ5RGF0YSwgSkxpYnJhcnlFbnY+IGxpYnJhcmllcyA9CiAgICAgIG5ldyBFbnRpdHlEYXRhRW52TWFwPEluZGV4ZWRMaWJyYXJ5LCBKTGlicmFyeURhdGEsIEpMaWJyYXJ5RW52PigpOwogIGZpbmFsIEVudGl0eURhdGFFbnZNYXA8SW5kZXhlZENsYXNzLCBKQ2xhc3NEYXRhLCBKQ2xhc3NFbnY+IGNsYXNzZXMgPQogICAgICBuZXcgRW50aXR5RGF0YUVudk1hcDxJbmRleGVkQ2xhc3MsIEpDbGFzc0RhdGEsIEpDbGFzc0Vudj4oKTsKICBmaW5hbCBFbnRpdHlEYXRhTWFwPEluZGV4ZWRNZW1iZXIsIEpNZW1iZXJEYXRhPiBtZW1iZXJzID0KICAgICAgbmV3IEVudGl0eURhdGFNYXA8SW5kZXhlZE1lbWJlciwgSk1lbWJlckRhdGE+KCk7CiAgZmluYWwgRW50aXR5RGF0YU1hcDxJbmRleGVkVHlwZVZhcmlhYmxlLCBKVHlwZVZhcmlhYmxlRGF0YT4gdHlwZVZhcmlhYmxlcyA9CiAgICAgIG5ldyBFbnRpdHlEYXRhTWFwPEluZGV4ZWRUeXBlVmFyaWFibGUsIEpUeXBlVmFyaWFibGVEYXRhPigpOwogIGZpbmFsIEVudGl0eURhdGFNYXA8SW5kZXhlZFR5cGVkZWYsIEpUeXBlZGVmRGF0YT4gdHlwZWRlZnMgPQogICAgICBuZXcgRW50aXR5RGF0YU1hcDxJbmRleGVkVHlwZWRlZiwgSlR5cGVkZWZEYXRhPigpOwoKICBmaW5hbCBNYXA8aXIuTGlicmFyeSwgSW5kZXhlZExpYnJhcnk+IGxpYnJhcnlNYXAgPSB7fTsKICBmaW5hbCBNYXA8aXIuQ2xhc3MsIEluZGV4ZWRDbGFzcz4gY2xhc3NNYXAgPSB7fTsKICBmaW5hbCBNYXA8aXIuVHlwZWRlZiwgSW5kZXhlZFR5cGVkZWY+IHR5cGVkZWZNYXAgPSB7fTsKCiAgLy8vIE1hcCBmcm9tIFtpci5UeXBlUGFyYW1ldGVyXSBub2RlcyB0byB0aGUgY29ycmVzcG9uZGluZwogIC8vLyBbVHlwZVZhcmlhYmxlRW50aXR5XS4KICAvLy8KICAvLy8gTm9ybWFsbHkgdGhlIHR5cGUgdmFyaWFibGVzIGFyZSBbSW5kZXhlZFR5cGVWYXJpYWJsZV1zLCBidXQgZm9yIHR5cGUKICAvLy8gcGFyYW1ldGVycyBvbiBsb2NhbCBmdW5jdGlvbiAoaW4gdGhlIGZyb250ZW5kKSB0aGVzZSBhcmUgX25vdF8gc2luY2UKICAvLy8gdGhlaXIgdHlwZSBkZWNsYXJhdGlvbiBpcyBuZWl0aGVyIGEgY2xhc3Mgbm9yIGEgbWVtYmVyLiBJbiB0aGUgYmFja2VuZCwKICAvLy8gdGhlc2UgdHlwZSBwYXJhbWV0ZXJzIGJlbG9uZyB0byB0aGUgY2FsbC1tZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgaW5kZXhlZC4KICBmaW5hbCBNYXA8aXIuVHlwZVBhcmFtZXRlciwgVHlwZVZhcmlhYmxlRW50aXR5PiB0eXBlVmFyaWFibGVNYXAgPSB7fTsKICBmaW5hbCBNYXA8aXIuTWVtYmVyLCBJbmRleGVkQ29uc3RydWN0b3I+IGNvbnN0cnVjdG9yTWFwID0ge307CiAgZmluYWwgTWFwPGlyLlByb2NlZHVyZSwgSW5kZXhlZEZ1bmN0aW9uPiBtZXRob2RNYXAgPSB7fTsKICBmaW5hbCBNYXA8aXIuRmllbGQsIEluZGV4ZWRGaWVsZD4gZmllbGRNYXAgPSB7fTsKICBmaW5hbCBNYXA8aXIuVHJlZU5vZGUsIExvY2FsPiBsb2NhbEZ1bmN0aW9uTWFwID0ge307CgogIC8vLyBNYXAgZnJvbSBtZW1iZXJzIHRvIHRoZSBjYWxsIG1ldGhvZHMgY3JlYXRlZCBmb3IgdGhlaXIgbmVzdGVkIGNsb3N1cmVzLgogIE1hcDxJbmRleGVkTWVtYmVyLCBMaXN0PEluZGV4ZWRGdW5jdGlvbj4+IF9uZXN0ZWRDbG9zdXJlTWFwID0ge307CgogIC8vLyBOYXRpdmVEYXRhIGlzIG5lZWQgZm9yIGNvbXB1dGF0aW9uIG9mIHRoZSBkZWZhdWx0IHN1cGVyIGNsYXNzIGFuZAogIC8vLyBwYXJhbWV0ZXIgb3JkZXJpbmcuCiAgTmF0aXZlRGF0YSBuYXRpdmVEYXRhOwoKICBNYXA8SW5kZXhlZEZ1bmN0aW9uLCBKR2VuZXJhdG9yQm9keT4gX2dlbmVyYXRvckJvZGllcyA9IHt9OwoKICBNYXA8SW5kZXhlZENsYXNzLCBMaXN0PEluZGV4ZWRNZW1iZXI+PiBfaW5qZWN0ZWRDbGFzc01lbWJlcnMgPSB7fTsKCiAgTGF0ZU91dHB1dFVuaXREYXRhQnVpbGRlciBsYXRlT3V0cHV0VW5pdERhdGFCdWlsZGVyOwoKICBKc0tlcm5lbFRvRWxlbWVudE1hcCgKICAgICAgdGhpcy5yZXBvcnRlciwKICAgICAgRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCiAgICAgIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgX2VsZW1lbnRNYXAsCiAgICAgIE1hcDxNZW1iZXJFbnRpdHksIE1lbWJlclVzYWdlPiBsaXZlTWVtYmVyVXNhZ2UsCiAgICAgIEFubm90YXRpb25zRGF0YSBhbm5vdGF0aW9ucykKICAgICAgOiB0aGlzLm9wdGlvbnMgPSBfZWxlbWVudE1hcC5vcHRpb25zIHsKICAgIF9lbGVtZW50RW52aXJvbm1lbnQgPSBuZXcgSnNFbGVtZW50RW52aXJvbm1lbnQodGhpcyk7CiAgICBfY29tbW9uRWxlbWVudHMgPQogICAgICAgIG5ldyBDb21tb25FbGVtZW50c0ltcGwoX2VsZW1lbnRFbnZpcm9ubWVudCwgX2VsZW1lbnRNYXAub3B0aW9ucyk7CiAgICBfY29uc3RhbnRFbnZpcm9ubWVudCA9IG5ldyBKc0NvbnN0YW50RW52aXJvbm1lbnQodGhpcywgZW52aXJvbm1lbnQpOwogICAgX3R5cGVDb252ZXJ0ZXIgPSBuZXcgRGFydFR5cGVDb252ZXJ0ZXIodGhpcyk7CiAgICBfdHlwZXMgPSBuZXcgS2VybmVsRGFydFR5cGVzKHRoaXMpOwogICAgX2NvbnN0YW50VmFsdWVmaWVyID0gbmV3IENvbnN0YW50VmFsdWVmaWVyKHRoaXMpOwoKICAgIHByb2dyYW1FbnYgPSBfZWxlbWVudE1hcC5lbnYuY29udmVydCgpOwogICAgZm9yIChpbnQgbGlicmFyeUluZGV4ID0gMDsKICAgICAgICBsaWJyYXJ5SW5kZXggPCBfZWxlbWVudE1hcC5saWJyYXJpZXMubGVuZ3RoOwogICAgICAgIGxpYnJhcnlJbmRleCsrKSB7CiAgICAgIEluZGV4ZWRMaWJyYXJ5IG9sZExpYnJhcnkgPSBfZWxlbWVudE1hcC5saWJyYXJpZXMuZ2V0RW50aXR5KGxpYnJhcnlJbmRleCk7CiAgICAgIEtMaWJyYXJ5RW52IG9sZEVudiA9IF9lbGVtZW50TWFwLmxpYnJhcmllcy5nZXRFbnYob2xkTGlicmFyeSk7CiAgICAgIEtMaWJyYXJ5RGF0YSBkYXRhID0gX2VsZW1lbnRNYXAubGlicmFyaWVzLmdldERhdGEob2xkTGlicmFyeSk7CiAgICAgIEluZGV4ZWRMaWJyYXJ5IG5ld0xpYnJhcnkgPQogICAgICAgICAgbmV3IEpMaWJyYXJ5KG9sZExpYnJhcnkubmFtZSwgb2xkTGlicmFyeS5jYW5vbmljYWxVcmkpOwogICAgICBKTGlicmFyeUVudiBuZXdFbnYgPSBvbGRFbnYuY29udmVydChfZWxlbWVudE1hcCwgbGl2ZU1lbWJlclVzYWdlKTsKICAgICAgbGlicmFyeU1hcFtvbGRFbnYubGlicmFyeV0gPQogICAgICAgICAgbGlicmFyaWVzLnJlZ2lzdGVyPEluZGV4ZWRMaWJyYXJ5LCBKTGlicmFyeURhdGEsIEpMaWJyYXJ5RW52PigKICAgICAgICAgICAgICBuZXdMaWJyYXJ5LCBkYXRhLmNvbnZlcnQoKSwgbmV3RW52KTsKICAgICAgYXNzZXJ0KG5ld0xpYnJhcnkubGlicmFyeUluZGV4ID09IG9sZExpYnJhcnkubGlicmFyeUluZGV4KTsKICAgICAgcHJvZ3JhbUVudi5yZWdpc3RlckxpYnJhcnkobmV3RW52KTsKICAgIH0KICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEZpbHRlciB1bnVzZWQgY2xhc3Nlcy4KICAgIGZvciAoaW50IGNsYXNzSW5kZXggPSAwOwogICAgICAgIGNsYXNzSW5kZXggPCBfZWxlbWVudE1hcC5jbGFzc2VzLmxlbmd0aDsKICAgICAgICBjbGFzc0luZGV4KyspIHsKICAgICAgSW5kZXhlZENsYXNzIG9sZENsYXNzID0gX2VsZW1lbnRNYXAuY2xhc3Nlcy5nZXRFbnRpdHkoY2xhc3NJbmRleCk7CiAgICAgIEtDbGFzc0VudiBlbnYgPSBfZWxlbWVudE1hcC5jbGFzc2VzLmdldEVudihvbGRDbGFzcyk7CiAgICAgIEtDbGFzc0RhdGEgZGF0YSA9IF9lbGVtZW50TWFwLmNsYXNzZXMuZ2V0RGF0YShvbGRDbGFzcyk7CiAgICAgIEluZGV4ZWRMaWJyYXJ5IG9sZExpYnJhcnkgPSBvbGRDbGFzcy5saWJyYXJ5OwogICAgICBMaWJyYXJ5RW50aXR5IG5ld0xpYnJhcnkgPSBsaWJyYXJpZXMuZ2V0RW50aXR5KG9sZExpYnJhcnkubGlicmFyeUluZGV4KTsKICAgICAgSW5kZXhlZENsYXNzIG5ld0NsYXNzID0gbmV3IEpDbGFzcyhuZXdMaWJyYXJ5LCBvbGRDbGFzcy5uYW1lLAogICAgICAgICAgaXNBYnN0cmFjdDogb2xkQ2xhc3MuaXNBYnN0cmFjdCk7CiAgICAgIEpDbGFzc0VudiBuZXdFbnYgPSBlbnYuY29udmVydChfZWxlbWVudE1hcCwgbGl2ZU1lbWJlclVzYWdlKTsKICAgICAgY2xhc3NNYXBbZW52LmNsc10gPSBjbGFzc2VzLnJlZ2lzdGVyKG5ld0NsYXNzLCBkYXRhLmNvbnZlcnQoKSwgbmV3RW52KTsKICAgICAgYXNzZXJ0KG5ld0NsYXNzLmNsYXNzSW5kZXggPT0gb2xkQ2xhc3MuY2xhc3NJbmRleCk7CiAgICAgIGxpYnJhcmllcy5nZXRFbnYobmV3Q2xhc3MubGlicmFyeSkucmVnaXN0ZXJDbGFzcyhuZXdDbGFzcy5uYW1lLCBuZXdFbnYpOwogICAgfQogICAgZm9yIChpbnQgdHlwZWRlZkluZGV4ID0gMDsKICAgICAgICB0eXBlZGVmSW5kZXggPCBfZWxlbWVudE1hcC50eXBlZGVmcy5sZW5ndGg7CiAgICAgICAgdHlwZWRlZkluZGV4KyspIHsKICAgICAgSW5kZXhlZFR5cGVkZWYgb2xkVHlwZWRlZiA9IF9lbGVtZW50TWFwLnR5cGVkZWZzLmdldEVudGl0eSh0eXBlZGVmSW5kZXgpOwogICAgICBLVHlwZWRlZkRhdGEgZGF0YSA9IF9lbGVtZW50TWFwLnR5cGVkZWZzLmdldERhdGEob2xkVHlwZWRlZik7CiAgICAgIEluZGV4ZWRMaWJyYXJ5IG9sZExpYnJhcnkgPSBvbGRUeXBlZGVmLmxpYnJhcnk7CiAgICAgIExpYnJhcnlFbnRpdHkgbmV3TGlicmFyeSA9IGxpYnJhcmllcy5nZXRFbnRpdHkob2xkTGlicmFyeS5saWJyYXJ5SW5kZXgpOwogICAgICBJbmRleGVkVHlwZWRlZiBuZXdUeXBlZGVmID0gbmV3IEpUeXBlZGVmKG5ld0xpYnJhcnksIG9sZFR5cGVkZWYubmFtZSk7CiAgICAgIHR5cGVkZWZNYXBbZGF0YS5ub2RlXSA9IHR5cGVkZWZzLnJlZ2lzdGVyKAogICAgICAgICAgbmV3VHlwZWRlZiwKICAgICAgICAgIG5ldyBKVHlwZWRlZkRhdGEoCiAgICAgICAgICAgICAgZGF0YS5ub2RlLAogICAgICAgICAgICAgIG5ldyBUeXBlZGVmVHlwZSgKICAgICAgICAgICAgICAgICAgbmV3VHlwZWRlZiwKICAgICAgICAgICAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgICAgICAgICAgICAgIGRhdGEubm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGgsIGNvbnN0IER5bmFtaWNUeXBlKCkpLAogICAgICAgICAgICAgICAgICBnZXREYXJ0VHlwZShkYXRhLm5vZGUudHlwZSkpKSk7CiAgICAgIGFzc2VydChuZXdUeXBlZGVmLnR5cGVkZWZJbmRleCA9PSBvbGRUeXBlZGVmLnR5cGVkZWZJbmRleCk7CiAgICB9CgogICAgZm9yIChpbnQgbWVtYmVySW5kZXggPSAwOwogICAgICAgIG1lbWJlckluZGV4IDwgX2VsZW1lbnRNYXAubWVtYmVycy5sZW5ndGg7CiAgICAgICAgbWVtYmVySW5kZXgrKykgewogICAgICBJbmRleGVkTWVtYmVyIG9sZE1lbWJlciA9IF9lbGVtZW50TWFwLm1lbWJlcnMuZ2V0RW50aXR5KG1lbWJlckluZGV4KTsKICAgICAgTWVtYmVyVXNhZ2UgbWVtYmVyVXNhZ2UgPSBsaXZlTWVtYmVyVXNhZ2Vbb2xkTWVtYmVyXTsKICAgICAgaWYgKG1lbWJlclVzYWdlID09IG51bGwpIHsKICAgICAgICBtZW1iZXJzLnNraXBJbmRleChvbGRNZW1iZXIubWVtYmVySW5kZXgpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIEtNZW1iZXJEYXRhIGRhdGEgPSBfZWxlbWVudE1hcC5tZW1iZXJzLmdldERhdGEob2xkTWVtYmVyKTsKICAgICAgSW5kZXhlZExpYnJhcnkgb2xkTGlicmFyeSA9IG9sZE1lbWJlci5saWJyYXJ5OwogICAgICBJbmRleGVkQ2xhc3Mgb2xkQ2xhc3MgPSBvbGRNZW1iZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIExpYnJhcnlFbnRpdHkgbmV3TGlicmFyeSA9IGxpYnJhcmllcy5nZXRFbnRpdHkob2xkTGlicmFyeS5saWJyYXJ5SW5kZXgpOwogICAgICBDbGFzc0VudGl0eSBuZXdDbGFzcyA9CiAgICAgICAgICBvbGRDbGFzcyAhPSBudWxsID8gY2xhc3Nlcy5nZXRFbnRpdHkob2xkQ2xhc3MuY2xhc3NJbmRleCkgOiBudWxsOwogICAgICBJbmRleGVkTWVtYmVyIG5ld01lbWJlcjsKICAgICAgTmFtZSBtZW1iZXJOYW1lID0gbmV3IE5hbWUob2xkTWVtYmVyLm1lbWJlck5hbWUudGV4dCwgbmV3TGlicmFyeSwKICAgICAgICAgIGlzU2V0dGVyOiBvbGRNZW1iZXIubWVtYmVyTmFtZS5pc1NldHRlcik7CiAgICAgIGlmIChvbGRNZW1iZXIuaXNGaWVsZCkgewogICAgICAgIEluZGV4ZWRGaWVsZCBmaWVsZCA9IG9sZE1lbWJlcjsKICAgICAgICBuZXdNZW1iZXIgPSBuZXcgSkZpZWxkKG5ld0xpYnJhcnksIG5ld0NsYXNzLCBtZW1iZXJOYW1lLAogICAgICAgICAgICBpc1N0YXRpYzogZmllbGQuaXNTdGF0aWMsCiAgICAgICAgICAgIGlzQXNzaWduYWJsZTogZmllbGQuaXNBc3NpZ25hYmxlLAogICAgICAgICAgICBpc0NvbnN0OiBmaWVsZC5pc0NvbnN0KTsKICAgICAgfSBlbHNlIGlmIChvbGRNZW1iZXIuaXNDb25zdHJ1Y3RvcikgewogICAgICAgIEluZGV4ZWRDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IG9sZE1lbWJlcjsKICAgICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlID0KICAgICAgICAgICAgYW5ub3RhdGlvbnMuaGFzTm9FbGlzaW9uKGNvbnN0cnVjdG9yKQogICAgICAgICAgICAgICAgPyBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJTdHJ1Y3R1cmUKICAgICAgICAgICAgICAgIDogbWVtYmVyVXNhZ2UuaW52b2tlZFBhcmFtZXRlcnM7CiAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmlzRmFjdG9yeUNvbnN0cnVjdG9yKSB7CiAgICAgICAgICAvLyBUT0RPKHJlZGVtcHRpb24pOiBUaGlzIHNob3VsZCBiZSBhIEpGdW5jdGlvbi4KICAgICAgICAgIG5ld01lbWJlciA9IG5ldyBKRmFjdG9yeUNvbnN0cnVjdG9yKAogICAgICAgICAgICAgIG5ld0NsYXNzLCBtZW1iZXJOYW1lLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgICAgICAgaXNFeHRlcm5hbDogY29uc3RydWN0b3IuaXNFeHRlcm5hbCwKICAgICAgICAgICAgICBpc0NvbnN0OiBjb25zdHJ1Y3Rvci5pc0NvbnN0LAogICAgICAgICAgICAgIGlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3I6CiAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3IpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdNZW1iZXIgPSBuZXcgSkdlbmVyYXRpdmVDb25zdHJ1Y3RvcigKICAgICAgICAgICAgICBuZXdDbGFzcywgbWVtYmVyTmFtZSwgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICAgICAgICAgIGlzRXh0ZXJuYWw6IGNvbnN0cnVjdG9yLmlzRXh0ZXJuYWwsIGlzQ29uc3Q6IGNvbnN0cnVjdG9yLmlzQ29uc3QpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChvbGRNZW1iZXIuaXNHZXR0ZXIpIHsKICAgICAgICBJbmRleGVkRnVuY3Rpb24gZ2V0dGVyID0gb2xkTWVtYmVyOwogICAgICAgIG5ld01lbWJlciA9IG5ldyBKR2V0dGVyKAogICAgICAgICAgICBuZXdMaWJyYXJ5LCBuZXdDbGFzcywgbWVtYmVyTmFtZSwgZ2V0dGVyLmFzeW5jTWFya2VyLAogICAgICAgICAgICBpc1N0YXRpYzogZ2V0dGVyLmlzU3RhdGljLAogICAgICAgICAgICBpc0V4dGVybmFsOiBnZXR0ZXIuaXNFeHRlcm5hbCwKICAgICAgICAgICAgaXNBYnN0cmFjdDogZ2V0dGVyLmlzQWJzdHJhY3QpOwogICAgICB9IGVsc2UgaWYgKG9sZE1lbWJlci5pc1NldHRlcikgewogICAgICAgIEluZGV4ZWRGdW5jdGlvbiBzZXR0ZXIgPSBvbGRNZW1iZXI7CiAgICAgICAgbmV3TWVtYmVyID0gbmV3IEpTZXR0ZXIobmV3TGlicmFyeSwgbmV3Q2xhc3MsIG1lbWJlck5hbWUsCiAgICAgICAgICAgIGlzU3RhdGljOiBzZXR0ZXIuaXNTdGF0aWMsCiAgICAgICAgICAgIGlzRXh0ZXJuYWw6IHNldHRlci5pc0V4dGVybmFsLAogICAgICAgICAgICBpc0Fic3RyYWN0OiBzZXR0ZXIuaXNBYnN0cmFjdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgSW5kZXhlZEZ1bmN0aW9uIGZ1bmN0aW9uID0gb2xkTWVtYmVyOwogICAgICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUgPQogICAgICAgICAgICBhbm5vdGF0aW9ucy5oYXNOb0VsaXNpb24oZnVuY3Rpb24pCiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZQogICAgICAgICAgICAgICAgOiBtZW1iZXJVc2FnZS5pbnZva2VkUGFyYW1ldGVyczsKICAgICAgICBuZXdNZW1iZXIgPSBuZXcgSk1ldGhvZChuZXdMaWJyYXJ5LCBuZXdDbGFzcywgbWVtYmVyTmFtZSwKICAgICAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlLCBmdW5jdGlvbi5hc3luY01hcmtlciwKICAgICAgICAgICAgaXNTdGF0aWM6IGZ1bmN0aW9uLmlzU3RhdGljLAogICAgICAgICAgICBpc0V4dGVybmFsOiBmdW5jdGlvbi5pc0V4dGVybmFsLAogICAgICAgICAgICBpc0Fic3RyYWN0OiBmdW5jdGlvbi5pc0Fic3RyYWN0KTsKICAgICAgfQogICAgICBtZW1iZXJzLnJlZ2lzdGVyKG5ld01lbWJlciwgZGF0YS5jb252ZXJ0KCkpOwogICAgICBhc3NlcnQoCiAgICAgICAgICBuZXdNZW1iZXIubWVtYmVySW5kZXggPT0gb2xkTWVtYmVyLm1lbWJlckluZGV4LAogICAgICAgICAgIk1lbWJlciBpbmRleCBtaXNtYXRjaDogIgogICAgICAgICAgIk9sZCBtZW1iZXIgJG9sZE1lbWJlciBoYXMgaW5kZXggJHtvbGRNZW1iZXIubWVtYmVySW5kZXh9ICIKICAgICAgICAgICJ3aGVyZWFzIG5ldyBtZW1iZXIgJG5ld01lbWJlciBoYXMgaW5kZXggJHtuZXdNZW1iZXIubWVtYmVySW5kZXh9Iik7CiAgICAgIGlmIChuZXdNZW1iZXIuaXNGaWVsZCkgewogICAgICAgIGZpZWxkTWFwW2RhdGEubm9kZV0gPSBuZXdNZW1iZXI7CiAgICAgIH0gZWxzZSBpZiAobmV3TWVtYmVyLmlzQ29uc3RydWN0b3IpIHsKICAgICAgICBjb25zdHJ1Y3Rvck1hcFtkYXRhLm5vZGVdID0gbmV3TWVtYmVyOwogICAgICB9IGVsc2UgewogICAgICAgIG1ldGhvZE1hcFtkYXRhLm5vZGVdID0gbmV3TWVtYmVyOwogICAgICB9CiAgICB9CiAgICBmb3IgKGludCB0eXBlVmFyaWFibGVJbmRleCA9IDA7CiAgICAgICAgdHlwZVZhcmlhYmxlSW5kZXggPCBfZWxlbWVudE1hcC50eXBlVmFyaWFibGVzLmxlbmd0aDsKICAgICAgICB0eXBlVmFyaWFibGVJbmRleCsrKSB7CiAgICAgIEluZGV4ZWRUeXBlVmFyaWFibGUgb2xkVHlwZVZhcmlhYmxlID0KICAgICAgICAgIF9lbGVtZW50TWFwLnR5cGVWYXJpYWJsZXMuZ2V0RW50aXR5KHR5cGVWYXJpYWJsZUluZGV4KTsKICAgICAgS1R5cGVWYXJpYWJsZURhdGEgb2xkVHlwZVZhcmlhYmxlRGF0YSA9CiAgICAgICAgICBfZWxlbWVudE1hcC50eXBlVmFyaWFibGVzLmdldERhdGEob2xkVHlwZVZhcmlhYmxlKTsKICAgICAgRW50aXR5IG5ld1R5cGVEZWNsYXJhdGlvbjsKICAgICAgaWYgKG9sZFR5cGVWYXJpYWJsZS50eXBlRGVjbGFyYXRpb24gaXMgQ2xhc3NFbnRpdHkpIHsKICAgICAgICBJbmRleGVkQ2xhc3MgY2xzID0gb2xkVHlwZVZhcmlhYmxlLnR5cGVEZWNsYXJhdGlvbjsKICAgICAgICBuZXdUeXBlRGVjbGFyYXRpb24gPSBjbGFzc2VzLmdldEVudGl0eShjbHMuY2xhc3NJbmRleCk7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2tpcCB0eXBlIHZhcmlhYmxlcyBvZiB1bnVzZWQgY2xhc3Nlcy4KICAgICAgfSBlbHNlIGlmIChvbGRUeXBlVmFyaWFibGUudHlwZURlY2xhcmF0aW9uIGlzIE1lbWJlckVudGl0eSkgewogICAgICAgIEluZGV4ZWRNZW1iZXIgbWVtYmVyID0gb2xkVHlwZVZhcmlhYmxlLnR5cGVEZWNsYXJhdGlvbjsKICAgICAgICBuZXdUeXBlRGVjbGFyYXRpb24gPSBtZW1iZXJzLmdldEVudGl0eShtZW1iZXIubWVtYmVySW5kZXgpOwogICAgICAgIGlmIChuZXdUeXBlRGVjbGFyYXRpb24gPT0gbnVsbCkgewogICAgICAgICAgdHlwZVZhcmlhYmxlcy5za2lwSW5kZXgodHlwZVZhcmlhYmxlSW5kZXgpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChvbGRUeXBlVmFyaWFibGUudHlwZURlY2xhcmF0aW9uIGlzIExvY2FsKTsKICAgICAgfQogICAgICBJbmRleGVkVHlwZVZhcmlhYmxlIG5ld1R5cGVWYXJpYWJsZSA9IGNyZWF0ZVR5cGVWYXJpYWJsZSgKICAgICAgICAgIG5ld1R5cGVEZWNsYXJhdGlvbiwgb2xkVHlwZVZhcmlhYmxlLm5hbWUsIG9sZFR5cGVWYXJpYWJsZS5pbmRleCk7CiAgICAgIHR5cGVWYXJpYWJsZU1hcFtvbGRUeXBlVmFyaWFibGVEYXRhLm5vZGVdID0KICAgICAgICAgIHR5cGVWYXJpYWJsZXMucmVnaXN0ZXI8SW5kZXhlZFR5cGVWYXJpYWJsZSwgSlR5cGVWYXJpYWJsZURhdGE+KAogICAgICAgICAgICAgIG5ld1R5cGVWYXJpYWJsZSwgb2xkVHlwZVZhcmlhYmxlRGF0YS5jb3B5KCkpOwogICAgICBhc3NlcnQobmV3VHlwZVZhcmlhYmxlLnR5cGVWYXJpYWJsZUluZGV4ID09CiAgICAgICAgICBvbGRUeXBlVmFyaWFibGUudHlwZVZhcmlhYmxlSW5kZXgpOwogICAgfQogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogV2Ugc2hvdWxkIGNsb3NlIHRoZSBlbnZpcm9ubWVudCBpbiB0aGUgYmVnaW5uaW5nIG9mCiAgICAvLyB0aGlzIGNvbnN0cnVjdG9yIGJ1dCBjdXJyZW50bHkgd2UgbmVlZCB0aGUgW01lbWJlckVudGl0eV0gdG8gcXVlcnkgaWYgdGhlCiAgICAvLyBtZW1iZXIgaXMgbGl2ZSwgdGh1cyBwb3RlbnRpYWxseSBjcmVhdGluZyB0aGUgW01lbWJlckVudGl0eV0gaW4gdGhlCiAgICAvLyBwcm9jZXNzLiBBdm9pZCB0aGlzLgogICAgX2VsZW1lbnRNYXAuZW52SXNDbG9zZWQgPSB0cnVlOwogIH0KCiAgSnNLZXJuZWxUb0VsZW1lbnRNYXAucmVhZEZyb21EYXRhU291cmNlKHRoaXMub3B0aW9ucywgdGhpcy5yZXBvcnRlciwKICAgICAgRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIGlyLkNvbXBvbmVudCBjb21wb25lbnQsIERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBfZWxlbWVudEVudmlyb25tZW50ID0gbmV3IEpzRWxlbWVudEVudmlyb25tZW50KHRoaXMpOwogICAgX2NvbW1vbkVsZW1lbnRzID0gbmV3IENvbW1vbkVsZW1lbnRzSW1wbChfZWxlbWVudEVudmlyb25tZW50LCBvcHRpb25zKTsKICAgIF9jb25zdGFudEVudmlyb25tZW50ID0gbmV3IEpzQ29uc3RhbnRFbnZpcm9ubWVudCh0aGlzLCBlbnZpcm9ubWVudCk7CiAgICBfdHlwZUNvbnZlcnRlciA9IG5ldyBEYXJ0VHlwZUNvbnZlcnRlcih0aGlzKTsKICAgIF90eXBlcyA9IG5ldyBLZXJuZWxEYXJ0VHlwZXModGhpcyk7CiAgICBfY29uc3RhbnRWYWx1ZWZpZXIgPSBuZXcgQ29uc3RhbnRWYWx1ZWZpZXIodGhpcyk7CgogICAgc291cmNlLnJlZ2lzdGVyQ29tcG9uZW50TG9va3VwKG5ldyBDb21wb25lbnRMb29rdXAoY29tcG9uZW50KSk7CiAgICBfRW50aXR5TG9va3VwIGVudGl0eUxvb2t1cCA9IG5ldyBfRW50aXR5TG9va3VwKCk7CiAgICBzb3VyY2UucmVnaXN0ZXJFbnRpdHlMb29rdXAoZW50aXR5TG9va3VwKTsKCiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIHNvdXJjZS5iZWdpbihsaWJyYXJ5VGFnKTsKICAgIGludCBsaWJyYXJ5Q291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJyYXJ5Q291bnQ7IGkrKykgewogICAgICBpbnQgaW5kZXggPSBzb3VyY2UucmVhZEludCgpOwogICAgICBKTGlicmFyeSBsaWJyYXJ5ID0gbmV3IEpMaWJyYXJ5LnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBlbnRpdHlMb29rdXAucmVnaXN0ZXJMaWJyYXJ5KGluZGV4LCBsaWJyYXJ5KTsKICAgIH0KICAgIHNvdXJjZS5lbmQobGlicmFyeVRhZyk7CgogICAgc291cmNlLmJlZ2luKGNsYXNzVGFnKTsKICAgIGludCBjbGFzc0NvdW50ID0gc291cmNlLnJlYWRJbnQoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NDb3VudDsgaSsrKSB7CiAgICAgIGludCBpbmRleCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgIEpDbGFzcyBjbHMgPSBuZXcgSkNsYXNzLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBlbnRpdHlMb29rdXAucmVnaXN0ZXJDbGFzcyhpbmRleCwgY2xzKTsKICAgIH0KICAgIHNvdXJjZS5lbmQoY2xhc3NUYWcpOwoKICAgIHNvdXJjZS5iZWdpbih0eXBlZGVmVGFnKTsKICAgIGludCB0eXBlZGVmQ291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlZGVmQ291bnQ7IGkrKykgewogICAgICBpbnQgaW5kZXggPSBzb3VyY2UucmVhZEludCgpOwogICAgICBKVHlwZWRlZiB0eXBlZGVmID0gbmV3IEpUeXBlZGVmLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBlbnRpdHlMb29rdXAucmVnaXN0ZXJUeXBlZGVmKGluZGV4LCB0eXBlZGVmKTsKICAgIH0KICAgIHNvdXJjZS5lbmQodHlwZWRlZlRhZyk7CgogICAgc291cmNlLmJlZ2luKG1lbWJlclRhZyk7CiAgICBpbnQgbWVtYmVyQ291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJDb3VudDsgaSsrKSB7CiAgICAgIGludCBpbmRleCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgIEpNZW1iZXIgbWVtYmVyID0gbmV3IEpNZW1iZXIucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGVudGl0eUxvb2t1cC5yZWdpc3Rlck1lbWJlcihpbmRleCwgbWVtYmVyKTsKICAgIH0KICAgIHNvdXJjZS5lbmQobWVtYmVyVGFnKTsKCiAgICBzb3VyY2UuYmVnaW4odHlwZVZhcmlhYmxlVGFnKTsKICAgIGludCB0eXBlVmFyaWFibGVDb3VudCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVWYXJpYWJsZUNvdW50OyBpKyspIHsKICAgICAgaW50IGluZGV4ID0gc291cmNlLnJlYWRJbnQoKTsKICAgICAgSlR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUgPSBuZXcgSlR5cGVWYXJpYWJsZS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgZW50aXR5TG9va3VwLnJlZ2lzdGVyVHlwZVZhcmlhYmxlKGluZGV4LCB0eXBlVmFyaWFibGUpOwogICAgfQogICAgc291cmNlLmVuZCh0eXBlVmFyaWFibGVUYWcpOwoKICAgIHByb2dyYW1FbnYgPSBuZXcgSlByb2dyYW1FbnYoW2NvbXBvbmVudF0pOwogICAgc291cmNlLmJlZ2luKGxpYnJhcnlEYXRhVGFnKTsKICAgIGVudGl0eUxvb2t1cC5mb3JFYWNoTGlicmFyeSgoaW50IGluZGV4LCBKTGlicmFyeSBsaWJyYXJ5KSB7CiAgICAgIEpMaWJyYXJ5RW52IGVudiA9IG5ldyBKTGlicmFyeUVudi5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgSkxpYnJhcnlEYXRhIGRhdGEgPSBuZXcgSkxpYnJhcnlEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBsaWJyYXJ5TWFwW2Vudi5saWJyYXJ5XSA9CiAgICAgICAgICBsaWJyYXJpZXMucmVnaXN0ZXJCeUluZGV4KGluZGV4LCBsaWJyYXJ5LCBkYXRhLCBlbnYpOwogICAgICBwcm9ncmFtRW52LnJlZ2lzdGVyTGlicmFyeShlbnYpOwogICAgICBhc3NlcnQoaW5kZXggPT0gbGlicmFyeS5saWJyYXJ5SW5kZXgpOwogICAgfSk7CiAgICBzb3VyY2UuZW5kKGxpYnJhcnlEYXRhVGFnKTsKCiAgICBzb3VyY2UuYmVnaW4oY2xhc3NEYXRhVGFnKTsKICAgIGVudGl0eUxvb2t1cC5mb3JFYWNoQ2xhc3MoKGludCBpbmRleCwgSkNsYXNzIGNscykgewogICAgICBKQ2xhc3NFbnYgZW52ID0gbmV3IEpDbGFzc0Vudi5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgSkNsYXNzRGF0YSBkYXRhID0gbmV3IEpDbGFzc0RhdGEucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNsYXNzTWFwW2Vudi5jbHNdID0gY2xhc3Nlcy5yZWdpc3RlckJ5SW5kZXgoaW5kZXgsIGNscywgZGF0YSwgZW52KTsKICAgICAgaWYgKGNscyBpcyEgSlJlY29yZCAmJiBjbHMgaXMhIEpDbG9zdXJlQ2xhc3MpIHsKICAgICAgICAvLyBTeW50aGVzaXplZCBjbGFzc2VzIGFyZSBub3QgcGFydCBvZiB0aGUgbGlicmFyeSBlbnZpcm9ubWVudC4KICAgICAgICBsaWJyYXJpZXMuZ2V0RW52KGNscy5saWJyYXJ5KS5yZWdpc3RlckNsYXNzKGNscy5uYW1lLCBlbnYpOwogICAgICB9CiAgICAgIGFzc2VydChpbmRleCA9PSBjbHMuY2xhc3NJbmRleCk7CiAgICB9KTsKICAgIHNvdXJjZS5lbmQoY2xhc3NEYXRhVGFnKTsKCiAgICBzb3VyY2UuYmVnaW4odHlwZWRlZkRhdGFUYWcpOwogICAgZW50aXR5TG9va3VwLmZvckVhY2hUeXBlZGVmKChpbnQgaW5kZXgsIEpUeXBlZGVmIHR5cGVkZWYpIHsKICAgICAgSlR5cGVkZWZEYXRhIGRhdGEgPSBuZXcgSlR5cGVkZWZEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICB0eXBlZGVmTWFwW2RhdGEubm9kZV0gPSB0eXBlZGVmcy5yZWdpc3RlckJ5SW5kZXgoaW5kZXgsIHR5cGVkZWYsIGRhdGEpOwogICAgICBhc3NlcnQoaW5kZXggPT0gdHlwZWRlZi50eXBlZGVmSW5kZXgpOwogICAgfSk7CiAgICBzb3VyY2UuZW5kKHR5cGVkZWZEYXRhVGFnKTsKCiAgICBzb3VyY2UuYmVnaW4obWVtYmVyRGF0YVRhZyk7CiAgICBlbnRpdHlMb29rdXAuZm9yRWFjaE1lbWJlcigoaW50IGluZGV4LCBJbmRleGVkTWVtYmVyIG1lbWJlcikgewogICAgICBKTWVtYmVyRGF0YSBkYXRhID0gbmV3IEpNZW1iZXJEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBtZW1iZXJzLnJlZ2lzdGVyQnlJbmRleChpbmRleCwgbWVtYmVyLCBkYXRhKTsKICAgICAgc3dpdGNoIChkYXRhLmRlZmluaXRpb24ua2luZCkgewogICAgICAgIGNhc2UgTWVtYmVyS2luZC5yZWd1bGFyOgogICAgICAgIGNhc2UgTWVtYmVyS2luZC5jb25zdHJ1Y3RvcjoKICAgICAgICAgIGlyLk1lbWJlciBub2RlID0gZGF0YS5kZWZpbml0aW9uLm5vZGU7CiAgICAgICAgICBpZiAobWVtYmVyLmlzRmllbGQpIHsKICAgICAgICAgICAgZmllbGRNYXBbbm9kZV0gPSBtZW1iZXI7CiAgICAgICAgICB9IGVsc2UgaWYgKG1lbWJlci5pc0NvbnN0cnVjdG9yKSB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yTWFwW25vZGVdID0gbWVtYmVyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWV0aG9kTWFwW25vZGVdID0gbWVtYmVyOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgfQogICAgICBhc3NlcnQoaW5kZXggPT0gbWVtYmVyLm1lbWJlckluZGV4KTsKICAgIH0pOwogICAgc291cmNlLmVuZChtZW1iZXJEYXRhVGFnKTsKCiAgICBzb3VyY2UuYmVnaW4odHlwZVZhcmlhYmxlRGF0YVRhZyk7CiAgICBlbnRpdHlMb29rdXAuZm9yRWFjaFR5cGVWYXJpYWJsZSgoaW50IGluZGV4LCBKVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSkgewogICAgICBKVHlwZVZhcmlhYmxlRGF0YSBkYXRhID0gbmV3IEpUeXBlVmFyaWFibGVEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICB0eXBlVmFyaWFibGVNYXBbZGF0YS5ub2RlXSA9CiAgICAgICAgICB0eXBlVmFyaWFibGVzLnJlZ2lzdGVyQnlJbmRleChpbmRleCwgdHlwZVZhcmlhYmxlLCBkYXRhKTsKICAgICAgYXNzZXJ0KGluZGV4ID09IHR5cGVWYXJpYWJsZS50eXBlVmFyaWFibGVJbmRleCk7CiAgICB9KTsKICAgIHNvdXJjZS5lbmQodHlwZVZhcmlhYmxlRGF0YVRhZyk7CgogICAgc291cmNlLmJlZ2luKG5lc3RlZENsb3N1cmVzVGFnKTsKICAgIF9uZXN0ZWRDbG9zdXJlTWFwLmFkZEFsbChzb3VyY2UucmVhZE1lbWJlck1hcCgKICAgICAgICAoTWVtYmVyRW50aXR5IG1lbWJlcikgPT4gc291cmNlLnJlYWRNZW1iZXJzPEluZGV4ZWRGdW5jdGlvbj4oKSkpOwogICAgc291cmNlLmVuZChuZXN0ZWRDbG9zdXJlc1RhZyk7CgogICAgc291cmNlLmVuZCh0YWcpOwogIH0KCiAgLy8vIFByZXBhcmVzIHRoZSBlbnRpdHkgbWFwcyBmb3IgY29kZWdlbiBzZXJpYWxpemF0aW9uIGFuZCByZXR1cm5zIHRoZSBtZW1iZXIKICAvLy8gaW5kZXggbGltaXQgZm9yIGVhcmx5IG1lbWJlcnMuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYWxsIGxhdGUgbWVtYmVycywgc3VjaCBhcyBjb25zdHJ1Y3RvciBib2RpZXMgYW5kCiAgLy8vIGdlbmVyYXRvciBib2RpZXMsIGFuZCBjbG9zZXMgdGhlIGVudGl0eSBtYXBzIGZvciBmdXJ0aGVyIHJlZ2lzdHJhdGlvbi4KICBpbnQgcHJlcGFyZUZvckNvZGVnZW5TZXJpYWxpemF0aW9uKCkgewogICAgaW50IGxlbmd0aCA9IG1lbWJlcnMubGVuZ3RoOwogICAgZm9yIChpbnQgbWVtYmVySW5kZXggPSAwOyBtZW1iZXJJbmRleCA8IGxlbmd0aDsgbWVtYmVySW5kZXgrKykgewogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gbWVtYmVycy5nZXRFbnRpdHkobWVtYmVySW5kZXgpOwogICAgICBpZiAobWVtYmVyID09IG51bGwpIGNvbnRpbnVlOwogICAgICBpZiAobWVtYmVyIGlzIEpHZW5lcmF0aXZlQ29uc3RydWN0b3IpIHsKICAgICAgICBnZXRDb25zdHJ1Y3RvckJvZHkobWVtYmVycy5nZXREYXRhKG1lbWJlcikuZGVmaW5pdGlvbi5ub2RlKTsKICAgICAgfQogICAgICBpZiAobWVtYmVyIGlzIEluZGV4ZWRGdW5jdGlvbiAmJiBtZW1iZXIuYXN5bmNNYXJrZXIgIT0gQXN5bmNNYXJrZXIuU1lOQykgewogICAgICAgIGdldEdlbmVyYXRvckJvZHkobWVtYmVyKTsKICAgICAgfQogICAgfQogICAgbGlicmFyaWVzLmNsb3NlKCk7CiAgICBjbGFzc2VzLmNsb3NlKCk7CiAgICBtZW1iZXJzLmNsb3NlKCk7CiAgICB0eXBlZGVmcy5jbG9zZSgpOwogICAgdHlwZVZhcmlhYmxlcy5jbG9zZSgpOwogICAgcmV0dXJuIGxlbmd0aDsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0pzVG9FbGVtZW50TWFwXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwoKICAgIC8vIFNlcmlhbGl6ZSB0aGUgZW50aXRpZXMgYmVmb3JlIHNlcmlhbGl6aW5nIHRoZSBkYXRhLgogICAgc2luay5iZWdpbihsaWJyYXJ5VGFnKTsKICAgIHNpbmsud3JpdGVJbnQobGlicmFyaWVzLnNpemUpOwogICAgbGlicmFyaWVzLmZvckVhY2goKEpMaWJyYXJ5IGxpYnJhcnksIF8sIF9fKSB7CiAgICAgIHNpbmsud3JpdGVJbnQobGlicmFyeS5saWJyYXJ5SW5kZXgpOwogICAgICBsaWJyYXJ5LndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIH0pOwogICAgc2luay5lbmQobGlicmFyeVRhZyk7CgogICAgc2luay5iZWdpbihjbGFzc1RhZyk7CiAgICBzaW5rLndyaXRlSW50KGNsYXNzZXMuc2l6ZSk7CiAgICBjbGFzc2VzLmZvckVhY2goKEpDbGFzcyBjbHMsIF8sIF9fKSB7CiAgICAgIHNpbmsud3JpdGVJbnQoY2xzLmNsYXNzSW5kZXgpOwogICAgICBjbHMud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgfSk7CiAgICBzaW5rLmVuZChjbGFzc1RhZyk7CgogICAgc2luay5iZWdpbih0eXBlZGVmVGFnKTsKICAgIHNpbmsud3JpdGVJbnQodHlwZWRlZnMuc2l6ZSk7CiAgICB0eXBlZGVmcy5mb3JFYWNoKChKVHlwZWRlZiB0eXBlZGVmLCBfKSB7CiAgICAgIHNpbmsud3JpdGVJbnQodHlwZWRlZi50eXBlZGVmSW5kZXgpOwogICAgICB0eXBlZGVmLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIH0pOwogICAgc2luay5lbmQodHlwZWRlZlRhZyk7CgogICAgc2luay5iZWdpbihtZW1iZXJUYWcpOwogICAgc2luay53cml0ZUludChtZW1iZXJzLnNpemUpOwogICAgbWVtYmVycy5mb3JFYWNoKChKTWVtYmVyIG1lbWJlciwgXykgewogICAgICBzaW5rLndyaXRlSW50KG1lbWJlci5tZW1iZXJJbmRleCk7CiAgICAgIG1lbWJlci53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB9KTsKICAgIHNpbmsuZW5kKG1lbWJlclRhZyk7CgogICAgc2luay5iZWdpbih0eXBlVmFyaWFibGVUYWcpOwogICAgc2luay53cml0ZUludCh0eXBlVmFyaWFibGVzLnNpemUpOwogICAgdHlwZVZhcmlhYmxlcy5mb3JFYWNoKChKVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSwgXykgewogICAgICBzaW5rLndyaXRlSW50KHR5cGVWYXJpYWJsZS50eXBlVmFyaWFibGVJbmRleCk7CiAgICAgIHR5cGVWYXJpYWJsZS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB9KTsKICAgIHNpbmsuZW5kKHR5cGVWYXJpYWJsZVRhZyk7CgogICAgLy8gU2VyaWFsaXplIHRoZSBlbnRpdHkgZGF0YSBhZnRlciBoYXZpbmcgc2VyaWFsaXplZCB0aGUgZW50aXRpZXMuCiAgICBzaW5rLmJlZ2luKGxpYnJhcnlEYXRhVGFnKTsKICAgIGxpYnJhcmllcy5mb3JFYWNoKChfLCBKTGlicmFyeURhdGEgZGF0YSwgSkxpYnJhcnlFbnYgZW52KSB7CiAgICAgIGVudi53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICAgIGRhdGEud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgfSk7CiAgICBzaW5rLmVuZChsaWJyYXJ5RGF0YVRhZyk7CgogICAgc2luay5iZWdpbihjbGFzc0RhdGFUYWcpOwogICAgY2xhc3Nlcy5mb3JFYWNoKChfLCBKQ2xhc3NEYXRhIGRhdGEsIEpDbGFzc0VudiBlbnYpIHsKICAgICAgZW52LndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgICAgZGF0YS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB9KTsKICAgIHNpbmsuZW5kKGNsYXNzRGF0YVRhZyk7CgogICAgc2luay5iZWdpbih0eXBlZGVmRGF0YVRhZyk7CiAgICB0eXBlZGVmcy5mb3JFYWNoKChfLCBKVHlwZWRlZkRhdGEgZGF0YSkgewogICAgICBkYXRhLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIH0pOwogICAgc2luay5lbmQodHlwZWRlZkRhdGFUYWcpOwoKICAgIHNpbmsuYmVnaW4obWVtYmVyRGF0YVRhZyk7CiAgICBtZW1iZXJzLmZvckVhY2goKF8sIEpNZW1iZXJEYXRhIGRhdGEpIHsKICAgICAgZGF0YS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB9KTsKICAgIHNpbmsuZW5kKG1lbWJlckRhdGFUYWcpOwoKICAgIHNpbmsuYmVnaW4odHlwZVZhcmlhYmxlRGF0YVRhZyk7CiAgICB0eXBlVmFyaWFibGVzLmZvckVhY2goKF8sIEpUeXBlVmFyaWFibGVEYXRhIGRhdGEpIHsKICAgICAgZGF0YS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICB9KTsKICAgIHNpbmsuZW5kKHR5cGVWYXJpYWJsZURhdGFUYWcpOwoKICAgIHNpbmsuYmVnaW4obmVzdGVkQ2xvc3VyZXNUYWcpOwogICAgc2luay53cml0ZU1lbWJlck1hcCgKICAgICAgICBfbmVzdGVkQ2xvc3VyZU1hcCwKICAgICAgICAoTWVtYmVyRW50aXR5IG1lbWJlciwgTGlzdDxJbmRleGVkRnVuY3Rpb24+IGZ1bmN0aW9ucykgPT4KICAgICAgICAgICAgc2luay53cml0ZU1lbWJlcnMoZnVuY3Rpb25zKSk7CiAgICBzaW5rLmVuZChuZXN0ZWRDbG9zdXJlc1RhZyk7CgogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlcyBnZXQgdHlwZXMgPT4gX3R5cGVzOwoKICBAb3ZlcnJpZGUKICBKc0VsZW1lbnRFbnZpcm9ubWVudCBnZXQgZWxlbWVudEVudmlyb25tZW50ID0+IF9lbGVtZW50RW52aXJvbm1lbnQ7CgogIEBvdmVycmlkZQogIENvbW1vbkVsZW1lbnRzSW1wbCBnZXQgY29tbW9uRWxlbWVudHMgPT4gX2NvbW1vbkVsZW1lbnRzOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgX21haW5GdW5jdGlvbiB7CiAgICByZXR1cm4gcHJvZ3JhbUVudi5tYWluTWV0aG9kICE9IG51bGwKICAgICAgICA/IGdldE1ldGhvZEludGVybmFsKHByb2dyYW1FbnYubWFpbk1ldGhvZCkKICAgICAgICA6IG51bGw7CiAgfQoKICBMaWJyYXJ5RW50aXR5IGdldCBfbWFpbkxpYnJhcnkgewogICAgcmV0dXJuIHByb2dyYW1FbnYubWFpbk1ldGhvZCAhPSBudWxsCiAgICAgICAgPyBnZXRMaWJyYXJ5SW50ZXJuYWwocHJvZ3JhbUVudi5tYWluTWV0aG9kLmVuY2xvc2luZ0xpYnJhcnkpCiAgICAgICAgOiBudWxsOwogIH0KCiAgU291cmNlU3BhbiBnZXRTb3VyY2VTcGFuKFNwYW5uYWJsZSBzcGFubmFibGUsIEVudGl0eSBjdXJyZW50RWxlbWVudCkgewogICAgU291cmNlU3BhbiBmcm9tU3Bhbm5hYmxlKFNwYW5uYWJsZSBzcGFubmFibGUpIHsKICAgICAgaWYgKHNwYW5uYWJsZSBpcyBJbmRleGVkTGlicmFyeSAmJgogICAgICAgICAgc3Bhbm5hYmxlLmxpYnJhcnlJbmRleCA8IGxpYnJhcmllcy5sZW5ndGgpIHsKICAgICAgICBKTGlicmFyeUVudiBlbnYgPSBsaWJyYXJpZXMuZ2V0RW52KHNwYW5uYWJsZSk7CiAgICAgICAgcmV0dXJuIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKGVudi5saWJyYXJ5KTsKICAgICAgfSBlbHNlIGlmIChzcGFubmFibGUgaXMgSW5kZXhlZENsYXNzICYmCiAgICAgICAgICBzcGFubmFibGUuY2xhc3NJbmRleCA8IGNsYXNzZXMubGVuZ3RoKSB7CiAgICAgICAgSkNsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKHNwYW5uYWJsZSk7CiAgICAgICAgYXNzZXJ0KGRhdGEgIT0gbnVsbCwgIk5vIGRhdGEgZm9yICRzcGFubmFibGUgaW4gJHRoaXMiKTsKICAgICAgICByZXR1cm4gZGF0YS5kZWZpbml0aW9uLmxvY2F0aW9uOwogICAgICB9IGVsc2UgaWYgKHNwYW5uYWJsZSBpcyBJbmRleGVkTWVtYmVyICYmCiAgICAgICAgICBzcGFubmFibGUubWVtYmVySW5kZXggPCBtZW1iZXJzLmxlbmd0aCkgewogICAgICAgIEpNZW1iZXJEYXRhIGRhdGEgPSBtZW1iZXJzLmdldERhdGEoc3Bhbm5hYmxlKTsKICAgICAgICBhc3NlcnQoZGF0YSAhPSBudWxsLCAiTm8gZGF0YSBmb3IgJHNwYW5uYWJsZSBpbiAkdGhpcyIpOwogICAgICAgIHJldHVybiBkYXRhLmRlZmluaXRpb24ubG9jYXRpb247CiAgICAgIH0gZWxzZSBpZiAoc3Bhbm5hYmxlIGlzIEpMb2NhbCkgewogICAgICAgIHJldHVybiBnZXRTb3VyY2VTcGFuKHNwYW5uYWJsZS5tZW1iZXJDb250ZXh0LCBjdXJyZW50RWxlbWVudCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgU291cmNlU3BhbiBzb3VyY2VTcGFuID0gZnJvbVNwYW5uYWJsZShzcGFubmFibGUpOwogICAgc291cmNlU3BhbiA/Pz0gZnJvbVNwYW5uYWJsZShjdXJyZW50RWxlbWVudCk7CiAgICByZXR1cm4gc291cmNlU3BhbjsKICB9CgogIExpYnJhcnlFbnRpdHkgbG9va3VwTGlicmFyeShVcmkgdXJpKSB7CiAgICBKTGlicmFyeUVudiBsaWJyYXJ5RW52ID0gcHJvZ3JhbUVudi5sb29rdXBMaWJyYXJ5KHVyaSk7CiAgICBpZiAobGlicmFyeUVudiA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBnZXRMaWJyYXJ5SW50ZXJuYWwobGlicmFyeUVudi5saWJyYXJ5LCBsaWJyYXJ5RW52KTsKICB9CgogIFN0cmluZyBfZ2V0TGlicmFyeU5hbWUoSW5kZXhlZExpYnJhcnkgbGlicmFyeSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGxpYnJhcnkpKTsKICAgIEpMaWJyYXJ5RW52IGxpYnJhcnlFbnYgPSBsaWJyYXJpZXMuZ2V0RW52KGxpYnJhcnkpOwogICAgcmV0dXJuIGxpYnJhcnlFbnYubGlicmFyeS5uYW1lID8/ICcnOwogIH0KCiAgTWVtYmVyRW50aXR5IGxvb2t1cExpYnJhcnlNZW1iZXIoSW5kZXhlZExpYnJhcnkgbGlicmFyeSwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkobGlicmFyeSkpOwogICAgSkxpYnJhcnlFbnYgbGlicmFyeUVudiA9IGxpYnJhcmllcy5nZXRFbnYobGlicmFyeSk7CiAgICBpci5NZW1iZXIgbWVtYmVyID0gbGlicmFyeUVudi5sb29rdXBNZW1iZXIobmFtZSwgc2V0dGVyOiBzZXR0ZXIpOwogICAgcmV0dXJuIG1lbWJlciAhPSBudWxsID8gZ2V0TWVtYmVyKG1lbWJlcikgOiBudWxsOwogIH0KCiAgdm9pZCBfZm9yRWFjaExpYnJhcnlNZW1iZXIoCiAgICAgIEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnksIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGxpYnJhcnkpKTsKICAgIEpMaWJyYXJ5RW52IGxpYnJhcnlFbnYgPSBsaWJyYXJpZXMuZ2V0RW52KGxpYnJhcnkpOwogICAgbGlicmFyeUVudi5mb3JFYWNoTWVtYmVyKChpci5NZW1iZXIgbm9kZSkgewogICAgICBmKGdldE1lbWJlcihub2RlKSk7CiAgICB9KTsKICB9CgogIENsYXNzRW50aXR5IGxvb2t1cENsYXNzKEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnksIFN0cmluZyBuYW1lKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkobGlicmFyeSkpOwogICAgSkxpYnJhcnlFbnYgbGlicmFyeUVudiA9IGxpYnJhcmllcy5nZXRFbnYobGlicmFyeSk7CiAgICBKQ2xhc3NFbnYgY2xhc3NFbnYgPSBsaWJyYXJ5RW52Lmxvb2t1cENsYXNzKG5hbWUpOwogICAgaWYgKGNsYXNzRW52ICE9IG51bGwpIHsKICAgICAgcmV0dXJuIGdldENsYXNzSW50ZXJuYWwoY2xhc3NFbnYuY2xzLCBjbGFzc0Vudik7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgX2ZvckVhY2hDbGFzcyhJbmRleGVkTGlicmFyeSBsaWJyYXJ5LCB2b2lkIGYoQ2xhc3NFbnRpdHkgY2xzKSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGxpYnJhcnkpKTsKICAgIEpMaWJyYXJ5RW52IGxpYnJhcnlFbnYgPSBsaWJyYXJpZXMuZ2V0RW52KGxpYnJhcnkpOwogICAgbGlicmFyeUVudi5mb3JFYWNoQ2xhc3MoKEpDbGFzc0VudiBjbGFzc0VudikgewogICAgICBpZiAoIWNsYXNzRW52LmlzVW5uYW1lZE1peGluQXBwbGljYXRpb24pIHsKICAgICAgICBmKGdldENsYXNzSW50ZXJuYWwoY2xhc3NFbnYuY2xzLCBjbGFzc0VudikpOwogICAgICB9CiAgICB9KTsKICB9CgogIE1lbWJlckVudGl0eSBsb29rdXBDbGFzc01lbWJlcihJbmRleGVkQ2xhc3MgY2xzLCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZX0pIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEpDbGFzc0VudiBjbGFzc0VudiA9IGNsYXNzZXMuZ2V0RW52KGNscyk7CiAgICByZXR1cm4gY2xhc3NFbnYubG9va3VwTWVtYmVyKHRoaXMsIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICB9CgogIENvbnN0cnVjdG9yRW50aXR5IGxvb2t1cENvbnN0cnVjdG9yKEluZGV4ZWRDbGFzcyBjbHMsIFN0cmluZyBuYW1lKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBKQ2xhc3NFbnYgY2xhc3NFbnYgPSBjbGFzc2VzLmdldEVudihjbHMpOwogICAgcmV0dXJuIGNsYXNzRW52Lmxvb2t1cENvbnN0cnVjdG9yKHRoaXMsIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBjcmVhdGVJbnRlcmZhY2VUeXBlKAogICAgICBpci5DbGFzcyBjbHMsIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShnZXRDbGFzcyhjbHMpLCBnZXREYXJ0VHlwZXModHlwZUFyZ3VtZW50cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlicmFyeUVudGl0eSBnZXRMaWJyYXJ5KGlyLkxpYnJhcnkgbm9kZSkgPT4gZ2V0TGlicmFyeUludGVybmFsKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXRDbGFzcyhpci5DbGFzcyBub2RlKSA9PiBnZXRDbGFzc0ludGVybmFsKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldFN1cGVyVHlwZShJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBKQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoY2xzKTsKICAgIF9lbnN1cmVTdXBlcnR5cGVzKGNscywgZGF0YSk7CiAgICByZXR1cm4gZGF0YS5zdXBlcnR5cGU7CiAgfQoKICB2b2lkIF9lbnN1cmVUaGlzQW5kUmF3VHlwZShDbGFzc0VudGl0eSBjbHMsIEpDbGFzc0RhdGEgZGF0YSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgaWYgKGRhdGEgaXMgSkNsYXNzRGF0YUltcGwgJiYgZGF0YS50aGlzVHlwZSA9PSBudWxsKSB7CiAgICAgIGlyLkNsYXNzIG5vZGUgPSBkYXRhLmNsczsKICAgICAgaWYgKG5vZGUudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICAgIGRhdGEudGhpc1R5cGUgPQogICAgICAgICAgICBkYXRhLnJhd1R5cGUgPSBuZXcgSW50ZXJmYWNlVHlwZShjbHMsIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGF0YS50aGlzVHlwZSA9IG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBjbHMsCiAgICAgICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5nZW5lcmF0ZShub2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwKICAgICAgICAgICAgICAgIChpbnQgaW5kZXgpIHsKICAgICAgICAgICAgICByZXR1cm4gbmV3IFR5cGVWYXJpYWJsZVR5cGUoCiAgICAgICAgICAgICAgICAgIGdldFR5cGVWYXJpYWJsZUludGVybmFsKG5vZGUudHlwZVBhcmFtZXRlcnNbaW5kZXhdKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICBkYXRhLnJhd1R5cGUgPSBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgY2xzLAogICAgICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGgsIGNvbnN0IER5bmFtaWNUeXBlKCkpKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZVZhcmlhYmxlRW50aXR5IGdldFR5cGVWYXJpYWJsZShpci5UeXBlUGFyYW1ldGVyIG5vZGUpID0+CiAgICAgIGdldFR5cGVWYXJpYWJsZUludGVybmFsKG5vZGUpOwoKICB2b2lkIF9lbnN1cmVTdXBlcnR5cGVzKENsYXNzRW50aXR5IGNscywgSkNsYXNzRGF0YSBkYXRhKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBpZiAoZGF0YSBpcyBKQ2xhc3NEYXRhSW1wbCAmJiBkYXRhLm9yZGVyZWRUeXBlU2V0ID09IG51bGwpIHsKICAgICAgX2Vuc3VyZVRoaXNBbmRSYXdUeXBlKGNscywgZGF0YSk7CgogICAgICBpci5DbGFzcyBub2RlID0gZGF0YS5jbHM7CgogICAgICBpZiAobm9kZS5zdXBlcnR5cGUgPT0gbnVsbCkgewogICAgICAgIGRhdGEub3JkZXJlZFR5cGVTZXQgPSBuZXcgT3JkZXJlZFR5cGVTZXQuc2luZ2xldG9uKGRhdGEudGhpc1R5cGUpOwogICAgICAgIGRhdGEuaXNNaXhpbkFwcGxpY2F0aW9uID0gZmFsc2U7CiAgICAgICAgZGF0YS5pbnRlcmZhY2VzID0gY29uc3QgPEludGVyZmFjZVR5cGU+W107CiAgICAgIH0gZWxzZSB7CiAgICAgICAgSW50ZXJmYWNlVHlwZSBwcm9jZXNzU3VwZXJ0eXBlKGlyLlN1cGVydHlwZSBub2RlKSB7CiAgICAgICAgICBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSA9IF90eXBlQ29udmVydGVyLnZpc2l0U3VwZXJ0eXBlKG5vZGUpOwogICAgICAgICAgSW5kZXhlZENsYXNzIHN1cGVyY2xhc3MgPSBzdXBlcnR5cGUuZWxlbWVudDsKICAgICAgICAgIEpDbGFzc0RhdGEgc3VwZXJkYXRhID0gY2xhc3Nlcy5nZXREYXRhKHN1cGVyY2xhc3MpOwogICAgICAgICAgX2Vuc3VyZVN1cGVydHlwZXMoc3VwZXJjbGFzcywgc3VwZXJkYXRhKTsKICAgICAgICAgIHJldHVybiBzdXBlcnR5cGU7CiAgICAgICAgfQoKICAgICAgICBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZTsKICAgICAgICBMaW5rQnVpbGRlcjxJbnRlcmZhY2VUeXBlPiBsaW5rQnVpbGRlciA9CiAgICAgICAgICAgIG5ldyBMaW5rQnVpbGRlcjxJbnRlcmZhY2VUeXBlPigpOwogICAgICAgIGlmIChub2RlLmlzTWl4aW5EZWNsYXJhdGlvbikgewogICAgICAgICAgLy8gQSBtaXhpbiBkZWNsYXJhdGlvbgogICAgICAgICAgLy8KICAgICAgICAgIC8vICAgbWl4aW4gTSBvbiBBLCBCLCBDIHt9CiAgICAgICAgICAvLwogICAgICAgICAgLy8gaXMgZW5jb2RlZCBieSBDRkUgYXMKICAgICAgICAgIC8vCiAgICAgICAgICAvLyAgIGFic3RyYWN0IGNsYXNzIE0gZXh0ZW5kcyBBIGltcGxlbWVudHMgQiwgQyB7fQogICAgICAgICAgLy8gICBhYnN0cmFjdCBjbGFzcyBNIGV4dGVuZHMgQSZCJkMge30KICAgICAgICAgIC8vCiAgICAgICAgICAvLyBidXQgd2UgZW5jb2RlIGl0IGFzCiAgICAgICAgICAvLwogICAgICAgICAgLy8gICBhYnN0cmFjdCBjbGFzcyBNIGV4dGVuZHMgT2JqZWN0IGltcGxlbWVudHMgQSwgQiwgQyB7fQogICAgICAgICAgLy8KICAgICAgICAgIC8vIHNvIHdlIG5lZWQgZ2V0IHRoZSBzdXBlcmNsYXNzZXMgZnJvbSB0aGUgb24tY2xhdXNlLCBBLCBCLCBhbmQgQywKICAgICAgICAgIC8vIHRocm91Z2ggW3N1cGVyY2xhc3NDb25zdHJhaW50c10uCiAgICAgICAgICBmb3IgKGlyLlN1cGVydHlwZSBjb25zdHJhaW50IGluIG5vZGUuc3VwZXJjbGFzc0NvbnN0cmFpbnRzKCkpIHsKICAgICAgICAgICAgbGlua0J1aWxkZXIuYWRkTGFzdChwcm9jZXNzU3VwZXJ0eXBlKGNvbnN0cmFpbnQpKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFNldCBzdXBlcmNsYXNzIHRvIGBPYmplY3RgLgogICAgICAgICAgc3VwZXJ0eXBlID0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN1cGVydHlwZSA9IHByb2Nlc3NTdXBlcnR5cGUobm9kZS5zdXBlcnR5cGUpOwogICAgICAgIH0KICAgICAgICBpZiAoc3VwZXJ0eXBlID09IF9jb21tb25FbGVtZW50cy5vYmplY3RUeXBlKSB7CiAgICAgICAgICBDbGFzc0VudGl0eSBkZWZhdWx0U3VwZXJjbGFzcyA9CiAgICAgICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmdldERlZmF1bHRTdXBlcmNsYXNzKGNscywgbmF0aXZlRGF0YSk7CiAgICAgICAgICBkYXRhLnN1cGVydHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0UmF3VHlwZShkZWZhdWx0U3VwZXJjbGFzcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRhdGEuc3VwZXJ0eXBlID0gc3VwZXJ0eXBlOwogICAgICAgIH0KICAgICAgICBpZiAobm9kZS5taXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgICAgICBkYXRhLmlzTWl4aW5BcHBsaWNhdGlvbiA9IHRydWU7CiAgICAgICAgICBsaW5rQnVpbGRlcgogICAgICAgICAgICAgIC5hZGRMYXN0KGRhdGEubWl4ZWRJblR5cGUgPSBwcm9jZXNzU3VwZXJ0eXBlKG5vZGUubWl4ZWRJblR5cGUpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGF0YS5pc01peGluQXBwbGljYXRpb24gPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgbm9kZS5pbXBsZW1lbnRlZFR5cGVzLmZvckVhY2goKGlyLlN1cGVydHlwZSBzdXBlcnR5cGUpIHsKICAgICAgICAgIGxpbmtCdWlsZGVyLmFkZExhc3QocHJvY2Vzc1N1cGVydHlwZShzdXBlcnR5cGUpKTsKICAgICAgICB9KTsKICAgICAgICBMaW5rPEludGVyZmFjZVR5cGU+IGludGVyZmFjZXMgPQogICAgICAgICAgICBsaW5rQnVpbGRlci50b0xpbmsoY29uc3QgTGluazxJbnRlcmZhY2VUeXBlPigpKTsKICAgICAgICBPcmRlcmVkVHlwZVNldEJ1aWxkZXIgc2V0QnVpbGRlciA9CiAgICAgICAgICAgIG5ldyBLZXJuZWxPcmRlcmVkVHlwZVNldEJ1aWxkZXIodGhpcywgY2xzKTsKICAgICAgICBkYXRhLm9yZGVyZWRUeXBlU2V0ID0gc2V0QnVpbGRlci5jcmVhdGVPcmRlcmVkVHlwZVNldCgKICAgICAgICAgICAgZGF0YS5zdXBlcnR5cGUsIGludGVyZmFjZXMucmV2ZXJzZShjb25zdCBMaW5rPEludGVyZmFjZVR5cGU+KCkpKTsKICAgICAgICBkYXRhLmludGVyZmFjZXMgPSBuZXcgTGlzdDxJbnRlcmZhY2VUeXBlPi5mcm9tKGludGVyZmFjZXMudG9MaXN0KCkpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlZGVmVHlwZSBnZXRUeXBlZGVmVHlwZShpci5UeXBlZGVmIG5vZGUpIHsKICAgIEluZGV4ZWRUeXBlZGVmIHR5cGVkZWYgPSBnZXRUeXBlZGVmSW50ZXJuYWwobm9kZSk7CiAgICByZXR1cm4gdHlwZWRlZnMuZ2V0RGF0YSh0eXBlZGVmKS5yYXdUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGdldE1lbWJlcihpci5NZW1iZXIgbm9kZSkgewogICAgaWYgKG5vZGUgaXMgaXIuRmllbGQpIHsKICAgICAgcmV0dXJuIGdldEZpZWxkSW50ZXJuYWwobm9kZSk7CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgcmV0dXJuIGdldENvbnN0cnVjdG9ySW50ZXJuYWwobm9kZSk7CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgIGlmIChub2RlLmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5GYWN0b3J5KSB7CiAgICAgICAgcmV0dXJuIGdldENvbnN0cnVjdG9ySW50ZXJuYWwobm9kZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGdldE1ldGhvZEludGVybmFsKG5vZGUpOwogICAgICB9CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBtZW1iZXI6ICRub2RlIik7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXJFbnRpdHkgZ2V0U3VwZXJNZW1iZXIoTWVtYmVyRW50aXR5IGNvbnRleHQsIGlyLk5hbWUgbmFtZSwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZX0pIHsKICAgIC8vIFdlIGNhbiBubyBsb25nZXIgdHJ1c3QgdGhlIGludGVyZmFjZSB0YXJnZXQgb2YgdGhlIHN1cGVyIGFjY2VzcyBzaW5jZSBpdAogICAgLy8gbWlnaHQgYmUgYSBtZW1iZXIgdGhhdCB3ZSBoYXZlIGNsb25lZC4KICAgIENsYXNzRW50aXR5IGNscyA9IGdldE1lbWJlclRoaXNUeXBlKGNvbnRleHQpLmVsZW1lbnQ7CiAgICBhc3NlcnQoCiAgICAgICAgY2xzICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoY29udGV4dCwKICAgICAgICAgICAgIk5vIGVuY2xvc2luZyBjbGFzcyBmb3Igc3VwZXIgbWVtYmVyIGFjY2VzcyBpbiAkY29udGV4dC4iKSk7CiAgICBJbmRleGVkQ2xhc3Mgc3VwZXJjbGFzcyA9IGdldFN1cGVyVHlwZShjbHMpPy5lbGVtZW50OwogICAgd2hpbGUgKHN1cGVyY2xhc3MgIT0gbnVsbCkgewogICAgICBKQ2xhc3NFbnYgZW52ID0gY2xhc3Nlcy5nZXRFbnYoc3VwZXJjbGFzcyk7CiAgICAgIE1lbWJlckVudGl0eSBzdXBlck1lbWJlciA9CiAgICAgICAgICBlbnYubG9va3VwTWVtYmVyKHRoaXMsIG5hbWUubmFtZSwgc2V0dGVyOiBzZXR0ZXIpOwogICAgICBpZiAoc3VwZXJNZW1iZXIgIT0gbnVsbCkgewogICAgICAgIGlmICghc3VwZXJNZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgcmV0dXJuIG51bGw7CiAgICAgICAgaWYgKCFzdXBlck1lbWJlci5pc0Fic3RyYWN0KSB7CiAgICAgICAgICByZXR1cm4gc3VwZXJNZW1iZXI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN1cGVyY2xhc3MgPSBnZXRTdXBlclR5cGUoc3VwZXJjbGFzcyk/LmVsZW1lbnQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yRW50aXR5IGdldENvbnN0cnVjdG9yKGlyLk1lbWJlciBub2RlKSA9PgogICAgICBnZXRDb25zdHJ1Y3RvckludGVybmFsKG5vZGUpOwoKICBDb25zdHJ1Y3RvckVudGl0eSBnZXRTdXBlckNvbnN0cnVjdG9yKAogICAgICBpci5Db25zdHJ1Y3RvciBzb3VyY2VOb2RlLCBpci5NZW1iZXIgdGFyZ2V0Tm9kZSkgewogICAgQ29uc3RydWN0b3JFbnRpdHkgc291cmNlID0gZ2V0Q29uc3RydWN0b3Ioc291cmNlTm9kZSk7CiAgICBDbGFzc0VudGl0eSBzb3VyY2VDbGFzcyA9IHNvdXJjZS5lbmNsb3NpbmdDbGFzczsKICAgIENvbnN0cnVjdG9yRW50aXR5IHRhcmdldCA9IGdldENvbnN0cnVjdG9yKHRhcmdldE5vZGUpOwogICAgQ2xhc3NFbnRpdHkgdGFyZ2V0Q2xhc3MgPSB0YXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICBJbmRleGVkQ2xhc3Mgc3VwZXJDbGFzcyA9IGdldFN1cGVyVHlwZShzb3VyY2VDbGFzcyk/LmVsZW1lbnQ7CiAgICBpZiAoc3VwZXJDbGFzcyA9PSB0YXJnZXRDbGFzcykgewogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgSkNsYXNzRW52IGVudiA9IGNsYXNzZXMuZ2V0RW52KHN1cGVyQ2xhc3MpOwogICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPSBlbnYubG9va3VwQ29uc3RydWN0b3IodGhpcywgdGFyZ2V0Lm5hbWUpOwogICAgaWYgKGNvbnN0cnVjdG9yICE9IG51bGwpIHsKICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yOwogICAgfQogICAgdGhyb3cgZmFpbGVkQXQoc291cmNlLCAiU3VwZXIgY29uc3RydWN0b3IgZm9yICRzb3VyY2Ugbm90IGZvdW5kLiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0TWV0aG9kKGlyLlByb2NlZHVyZSBub2RlKSA9PiBnZXRNZXRob2RJbnRlcm5hbChub2RlKTsKCiAgQG92ZXJyaWRlCiAgRmllbGRFbnRpdHkgZ2V0RmllbGQoaXIuRmllbGQgbm9kZSkgPT4gZ2V0RmllbGRJbnRlcm5hbChub2RlKTsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0RGFydFR5cGUoaXIuRGFydFR5cGUgdHlwZSkgPT4gX3R5cGVDb252ZXJ0ZXIuY29udmVydCh0eXBlKTsKCiAgQG92ZXJyaWRlCiAgVHlwZVZhcmlhYmxlVHlwZSBnZXRUeXBlVmFyaWFibGVUeXBlKGlyLlR5cGVQYXJhbWV0ZXJUeXBlIHR5cGUpID0+CiAgICAgIGdldERhcnRUeXBlKHR5cGUpOwoKICBAb3ZlcnJpZGUKICBMaXN0PERhcnRUeXBlPiBnZXREYXJ0VHlwZXMoTGlzdDxpci5EYXJ0VHlwZT4gdHlwZXMpIHsKICAgIExpc3Q8RGFydFR5cGU+IGxpc3QgPSA8RGFydFR5cGU+W107CiAgICB0eXBlcy5mb3JFYWNoKChpci5EYXJ0VHlwZSB0eXBlKSB7CiAgICAgIGxpc3QuYWRkKGdldERhcnRUeXBlKHR5cGUpKTsKICAgIH0pOwogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldEludGVyZmFjZVR5cGUoaXIuSW50ZXJmYWNlVHlwZSB0eXBlKSA9PgogICAgICBfdHlwZUNvbnZlcnRlci5jb252ZXJ0KHR5cGUpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvblR5cGUgZ2V0RnVuY3Rpb25UeXBlKGlyLkZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBEYXJ0VHlwZSByZXR1cm5UeXBlOwogICAgaWYgKG5vZGUucGFyZW50IGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgIC8vIFRoZSByZXR1cm4gdHlwZSBvbiBnZW5lcmF0aXZlIGNvbnN0cnVjdG9ycyBpcyBgdm9pZGAsIGJ1dCB3ZSBuZWVkCiAgICAgIC8vIGBkeW5hbWljYCB0eXBlIHRvIG1hdGNoIHRoZSBlbGVtZW50IG1vZGVsLgogICAgICByZXR1cm5UeXBlID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVyblR5cGUgPSBnZXREYXJ0VHlwZShub2RlLnJldHVyblR5cGUpOwogICAgfQogICAgTGlzdDxEYXJ0VHlwZT4gcGFyYW1ldGVyVHlwZXMgPSA8RGFydFR5cGU+W107CiAgICBMaXN0PERhcnRUeXBlPiBvcHRpb25hbFBhcmFtZXRlclR5cGVzID0gPERhcnRUeXBlPltdOwoKICAgIERhcnRUeXBlIGdldFBhcmFtZXRlclR5cGUoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgICBpZiAodmFyaWFibGUuaXNDb3ZhcmlhbnQgfHwgdmFyaWFibGUuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgIC8vIEEgY292YXJpYW50IHBhcmFtZXRlciBoYXMgdHlwZSBgT2JqZWN0YCBpbiB0aGUgbWV0aG9kIHNpZ25hdHVyZS4KICAgICAgICByZXR1cm4gY29tbW9uRWxlbWVudHMub2JqZWN0VHlwZTsKICAgICAgfQogICAgICByZXR1cm4gZ2V0RGFydFR5cGUodmFyaWFibGUudHlwZSk7CiAgICB9CgogICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMpIHsKICAgICAgaWYgKHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgICBvcHRpb25hbFBhcmFtZXRlclR5cGVzLmFkZChnZXRQYXJhbWV0ZXJUeXBlKHZhcmlhYmxlKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGFyYW1ldGVyVHlwZXMuYWRkKGdldFBhcmFtZXRlclR5cGUodmFyaWFibGUpKTsKICAgICAgfQogICAgfQogICAgTGlzdDxTdHJpbmc+IG5hbWVkUGFyYW1ldGVycyA9IDxTdHJpbmc+W107CiAgICBMaXN0PERhcnRUeXBlPiBuYW1lZFBhcmFtZXRlclR5cGVzID0gPERhcnRUeXBlPltdOwogICAgTGlzdDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBzb3J0ZWROYW1lZFBhcmFtZXRlcnMgPQogICAgICAgIG5vZGUubmFtZWRQYXJhbWV0ZXJzLnRvTGlzdCgpLi5zb3J0KChhLCBiKSA9PiBhLm5hbWUuY29tcGFyZVRvKGIubmFtZSkpOwogICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIHNvcnRlZE5hbWVkUGFyYW1ldGVycykgewogICAgICBuYW1lZFBhcmFtZXRlcnMuYWRkKHZhcmlhYmxlLm5hbWUpOwogICAgICBuYW1lZFBhcmFtZXRlclR5cGVzLmFkZChnZXRQYXJhbWV0ZXJUeXBlKHZhcmlhYmxlKSk7CiAgICB9CiAgICBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiB0eXBlVmFyaWFibGVzOwogICAgaWYgKG5vZGUudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlUGFyYW1ldGVycyA9IDxEYXJ0VHlwZT5bXTsKICAgICAgZm9yIChpci5UeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgaW4gbm9kZS50eXBlUGFyYW1ldGVycykgewogICAgICAgIHR5cGVQYXJhbWV0ZXJzCiAgICAgICAgICAgIC5hZGQoZ2V0RGFydFR5cGUobmV3IGlyLlR5cGVQYXJhbWV0ZXJUeXBlKHR5cGVQYXJhbWV0ZXIpKSk7CiAgICAgIH0KICAgICAgdHlwZVZhcmlhYmxlcyA9IG5ldyBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPi5nZW5lcmF0ZSgKICAgICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoLAogICAgICAgICAgKGludCBpbmRleCkgPT4gbmV3IEZ1bmN0aW9uVHlwZVZhcmlhYmxlKGluZGV4KSk7CgogICAgICBEYXJ0VHlwZSBzdWJzdChEYXJ0VHlwZSB0eXBlKSB7CiAgICAgICAgcmV0dXJuIHR5cGUuc3Vic3QodHlwZVZhcmlhYmxlcywgdHlwZVBhcmFtZXRlcnMpOwogICAgICB9CgogICAgICByZXR1cm5UeXBlID0gc3Vic3QocmV0dXJuVHlwZSk7CiAgICAgIHBhcmFtZXRlclR5cGVzID0gcGFyYW1ldGVyVHlwZXMubWFwKHN1YnN0KS50b0xpc3QoKTsKICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcyA9IG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMubWFwKHN1YnN0KS50b0xpc3QoKTsKICAgICAgbmFtZWRQYXJhbWV0ZXJUeXBlcyA9IG5hbWVkUGFyYW1ldGVyVHlwZXMubWFwKHN1YnN0KS50b0xpc3QoKTsKICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHR5cGVWYXJpYWJsZXMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgdHlwZVZhcmlhYmxlc1tpbmRleF0uYm91bmQgPQogICAgICAgICAgICBzdWJzdChnZXREYXJ0VHlwZShub2RlLnR5cGVQYXJhbWV0ZXJzW2luZGV4XS5ib3VuZCkpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0eXBlVmFyaWFibGVzID0gY29uc3QgPEZ1bmN0aW9uVHlwZVZhcmlhYmxlPltdOwogICAgfQoKICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKHJldHVyblR5cGUsIHBhcmFtZXRlclR5cGVzLCBvcHRpb25hbFBhcmFtZXRlclR5cGVzLAogICAgICAgIG5hbWVkUGFyYW1ldGVycywgbmFtZWRQYXJhbWV0ZXJUeXBlcywgdHlwZVZhcmlhYmxlcyk7CiAgfQoKICBDb25zdGFudFZhbHVlIGNvbXB1dGVDb25zdGFudFZhbHVlKAogICAgICBTcGFubmFibGUgc3Bhbm5hYmxlLCBDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnQsCiAgICAgIHtib29sIHJlcXVpcmVDb25zdGFudDogdHJ1ZX0pIHsKICAgIHJldHVybiBfY29uc3RhbnRFbnZpcm9ubWVudC5fZ2V0Q29uc3RhbnRWYWx1ZShzcGFubmFibGUsIGNvbnN0YW50LAogICAgICAgIGNvbnN0YW50UmVxdWlyZWQ6IHJlcXVpcmVDb25zdGFudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBzdWJzdEJ5Q29udGV4dChEYXJ0VHlwZSB0eXBlLCBJbnRlcmZhY2VUeXBlIGNvbnRleHQpIHsKICAgIHJldHVybiB0eXBlLnN1YnN0KAogICAgICAgIGNvbnRleHQudHlwZUFyZ3VtZW50cywgZ2V0VGhpc1R5cGUoY29udGV4dC5lbGVtZW50KS50eXBlQXJndW1lbnRzKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBgY2FsbGAgbWV0aG9kIG9uICd0eXBlJy4KICAvLy8KICAvLy8gSWYgW3R5cGVdIGRvZXNuJ3QgaGF2ZSBhIGBjYWxsYCBtZW1iZXIgYG51bGxgIGlzIHJldHVybmVkLiBJZiBbdHlwZV0gaGFzCiAgLy8vIGFuIGludmFsaWQgYGNhbGxgIG1lbWJlciAobm9uLW1ldGhvZCBvciBhIHN5bnRoZXNpemVkIG1ldGhvZCB3aXRoIGJvdGgKICAvLy8gb3B0aW9uYWwgYW5kIG5hbWVkIHBhcmFtZXRlcnMpIGEgW0R5bmFtaWNUeXBlXSBpcyByZXR1cm5lZC4KICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRDYWxsVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgIEluZGV4ZWRDbGFzcyBjbHMgPSB0eXBlLmVsZW1lbnQ7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBKQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoY2xzKTsKICAgIGlmIChkYXRhLmNhbGxUeXBlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHN1YnN0QnlDb250ZXh0KGRhdGEuY2FsbFR5cGUsIHR5cGUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldFRoaXNUeXBlKEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEpDbGFzc0RhdGEgZGF0YSA9IGNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgX2Vuc3VyZVRoaXNBbmRSYXdUeXBlKGNscywgZGF0YSk7CiAgICByZXR1cm4gZGF0YS50aGlzVHlwZTsKICB9CgogIEludGVyZmFjZVR5cGUgX2dldFJhd1R5cGUoSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgSkNsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlVGhpc0FuZFJhd1R5cGUoY2xzLCBkYXRhKTsKICAgIHJldHVybiBkYXRhLnJhd1R5cGU7CiAgfQoKICBGdW5jdGlvblR5cGUgX2dldEZ1bmN0aW9uVHlwZShJbmRleGVkRnVuY3Rpb24gZnVuY3Rpb24pIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShmdW5jdGlvbikpOwogICAgRnVuY3Rpb25EYXRhIGRhdGEgPSBtZW1iZXJzLmdldERhdGEoZnVuY3Rpb24pOwogICAgcmV0dXJuIGRhdGEuZ2V0RnVuY3Rpb25UeXBlKHRoaXMpOwogIH0KCiAgTGlzdDxUeXBlVmFyaWFibGVUeXBlPiBfZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKEluZGV4ZWRGdW5jdGlvbiBmdW5jdGlvbikgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGZ1bmN0aW9uKSk7CiAgICBGdW5jdGlvbkRhdGEgZGF0YSA9IG1lbWJlcnMuZ2V0RGF0YShmdW5jdGlvbik7CiAgICByZXR1cm4gZGF0YS5nZXRGdW5jdGlvblR5cGVWYXJpYWJsZXModGhpcyk7CiAgfQoKICBEYXJ0VHlwZSBfZ2V0RmllbGRUeXBlKEluZGV4ZWRGaWVsZCBmaWVsZCkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGZpZWxkKSk7CiAgICBKRmllbGREYXRhIGRhdGEgPSBtZW1iZXJzLmdldERhdGEoZmllbGQpOwogICAgcmV0dXJuIGRhdGEuZ2V0RmllbGRUeXBlKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0VHlwZVZhcmlhYmxlQm91bmQoSW5kZXhlZFR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseSh0eXBlVmFyaWFibGUpKTsKICAgIEpUeXBlVmFyaWFibGVEYXRhIGRhdGEgPSB0eXBlVmFyaWFibGVzLmdldERhdGEodHlwZVZhcmlhYmxlKTsKICAgIHJldHVybiBkYXRhLmdldEJvdW5kKHRoaXMpOwogIH0KCiAgRGFydFR5cGUgX2dldFR5cGVWYXJpYWJsZURlZmF1bHRUeXBlKEluZGV4ZWRUeXBlVmFyaWFibGUgdHlwZVZhcmlhYmxlKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkodHlwZVZhcmlhYmxlKSk7CiAgICBKVHlwZVZhcmlhYmxlRGF0YSBkYXRhID0gdHlwZVZhcmlhYmxlcy5nZXREYXRhKHR5cGVWYXJpYWJsZSk7CiAgICByZXR1cm4gZGF0YS5nZXREZWZhdWx0VHlwZSh0aGlzKTsKICB9CgogIENsYXNzRW50aXR5IGdldEFwcGxpZWRNaXhpbihJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBKQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoY2xzKTsKICAgIF9lbnN1cmVTdXBlcnR5cGVzKGNscywgZGF0YSk7CiAgICByZXR1cm4gZGF0YS5taXhlZEluVHlwZT8uZWxlbWVudDsKICB9CgogIGJvb2wgX2lzTWl4aW5BcHBsaWNhdGlvbihJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBKQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoY2xzKTsKICAgIF9lbnN1cmVTdXBlcnR5cGVzKGNscywgZGF0YSk7CiAgICByZXR1cm4gZGF0YS5pc01peGluQXBwbGljYXRpb247CiAgfQoKICBib29sIF9pc1VubmFtZWRNaXhpbkFwcGxpY2F0aW9uKEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEpDbGFzc0VudiBlbnYgPSBjbGFzc2VzLmdldEVudihjbHMpOwogICAgcmV0dXJuIGVudi5pc1VubmFtZWRNaXhpbkFwcGxpY2F0aW9uOwogIH0KCiAgYm9vbCBfaXNTdXBlck1peGluQXBwbGljYXRpb24oSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgSkNsYXNzRW52IGVudiA9IGNsYXNzZXMuZ2V0RW52KGNscyk7CiAgICByZXR1cm4gZW52LmlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uOwogIH0KCiAgdm9pZCBfZm9yRWFjaFN1cGVydHlwZShJbmRleGVkQ2xhc3MgY2xzLCB2b2lkIGYoSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUpKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBKQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoY2xzKTsKICAgIF9lbnN1cmVTdXBlcnR5cGVzKGNscywgZGF0YSk7CiAgICBkYXRhLm9yZGVyZWRUeXBlU2V0LnN1cGVydHlwZXMuZm9yRWFjaChmKTsKICB9CgogIHZvaWQgX2ZvckVhY2hDb25zdHJ1Y3RvcihJbmRleGVkQ2xhc3MgY2xzLCB2b2lkIGYoQ29uc3RydWN0b3JFbnRpdHkgbWVtYmVyKSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgSkNsYXNzRW52IGVudiA9IGNsYXNzZXMuZ2V0RW52KGNscyk7CiAgICBlbnYuZm9yRWFjaENvbnN0cnVjdG9yKHRoaXMsIGYpOwogIH0KCiAgdm9pZCBfZm9yRWFjaExvY2FsQ2xhc3NNZW1iZXIoSW5kZXhlZENsYXNzIGNscywgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIpKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBKQ2xhc3NFbnYgZW52ID0gY2xhc3Nlcy5nZXRFbnYoY2xzKTsKICAgIGVudi5mb3JFYWNoTWVtYmVyKHRoaXMsIChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgIGYobWVtYmVyKTsKICAgIH0pOwogIH0KCiAgdm9pZCBfZm9yRWFjaENsYXNzTWVtYmVyKAogICAgICBJbmRleGVkQ2xhc3MgY2xzLCB2b2lkIGYoQ2xhc3NFbnRpdHkgY2xzLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgSkNsYXNzRW52IGVudiA9IGNsYXNzZXMuZ2V0RW52KGNscyk7CiAgICBlbnYuZm9yRWFjaE1lbWJlcih0aGlzLCAoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICBmKGNscywgbWVtYmVyKTsKICAgIH0pOwogICAgSkNsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgaWYgKGRhdGEuc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgX2ZvckVhY2hDbGFzc01lbWJlcihkYXRhLnN1cGVydHlwZS5lbGVtZW50LCBmKTsKICAgIH0KICB9CgogIENvbnN0YW50Q29uc3RydWN0b3IgX2dldENvbnN0cnVjdG9yQ29uc3RhbnQoSW5kZXhlZENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY29uc3RydWN0b3IpKTsKICAgIEpDb25zdHJ1Y3RvckRhdGEgZGF0YSA9IG1lbWJlcnMuZ2V0RGF0YShjb25zdHJ1Y3Rvcik7CiAgICByZXR1cm4gZGF0YS5nZXRDb25zdHJ1Y3RvckNvbnN0YW50KHRoaXMsIGNvbnN0cnVjdG9yKTsKICB9CgogIENvbnN0YW50RXhwcmVzc2lvbiBfZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb24oSW5kZXhlZEZpZWxkIGZpZWxkKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoZmllbGQpKTsKICAgIEpGaWVsZERhdGEgZGF0YSA9IG1lbWJlcnMuZ2V0RGF0YShmaWVsZCk7CiAgICByZXR1cm4gZGF0YS5nZXRGaWVsZENvbnN0YW50RXhwcmVzc2lvbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgYXNJbnN0YW5jZU9mKEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBPcmRlcmVkVHlwZVNldCBvcmRlcmVkVHlwZVNldCA9IGdldE9yZGVyZWRUeXBlU2V0KHR5cGUuZWxlbWVudCk7CiAgICBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSA9CiAgICAgICAgb3JkZXJlZFR5cGVTZXQuYXNJbnN0YW5jZU9mKGNscywgZ2V0SGllcmFyY2h5RGVwdGgoY2xzKSk7CiAgICBpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgc3VwZXJ0eXBlID0gc3Vic3RCeUNvbnRleHQoc3VwZXJ0eXBlLCB0eXBlKTsKICAgIH0KICAgIHJldHVybiBzdXBlcnR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBPcmRlcmVkVHlwZVNldCBnZXRPcmRlcmVkVHlwZVNldChJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBKQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoY2xzKTsKICAgIF9lbnN1cmVTdXBlcnR5cGVzKGNscywgZGF0YSk7CiAgICByZXR1cm4gZGF0YS5vcmRlcmVkVHlwZVNldDsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXRIaWVyYXJjaHlEZXB0aChJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBKQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoY2xzKTsKICAgIF9lbnN1cmVTdXBlcnR5cGVzKGNscywgZGF0YSk7CiAgICByZXR1cm4gZGF0YS5vcmRlcmVkVHlwZVNldC5tYXhEZXB0aDsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEludGVyZmFjZVR5cGU+IGdldEludGVyZmFjZXMoSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgSkNsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgcmV0dXJuIGRhdGEuaW50ZXJmYWNlczsKICB9CgogIE1lbWJlckRlZmluaXRpb24gZ2V0TWVtYmVyRGVmaW5pdGlvbkludGVybmFsKGNvdmFyaWFudCBJbmRleGVkTWVtYmVyIG1lbWJlcikgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KG1lbWJlcikpOwogICAgcmV0dXJuIG1lbWJlcnMuZ2V0RGF0YShtZW1iZXIpLmRlZmluaXRpb247CiAgfQoKICBDbGFzc0RlZmluaXRpb24gZ2V0Q2xhc3NEZWZpbml0aW9uSW50ZXJuYWwoY292YXJpYW50IEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIHJldHVybiBjbGFzc2VzLmdldERhdGEoY2xzKS5kZWZpbml0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgSW1wb3J0RW50aXR5IGdldEltcG9ydChpci5MaWJyYXJ5RGVwZW5kZW5jeSBub2RlKSB7CiAgICBpci5MaWJyYXJ5IGxpYnJhcnkgPSBub2RlLnBhcmVudDsKICAgIEpMaWJyYXJ5RGF0YSBkYXRhID0gbGlicmFyaWVzLmdldERhdGEoZ2V0TGlicmFyeUludGVybmFsKGxpYnJhcnkpKTsKICAgIHJldHVybiBkYXRhLmltcG9ydHNbbm9kZV07CiAgfQoKICBpci5UeXBlRW52aXJvbm1lbnQgZ2V0IHR5cGVFbnZpcm9ubWVudCB7CiAgICBpZiAoX3R5cGVFbnZpcm9ubWVudCA9PSBudWxsKSB7CiAgICAgIF90eXBlRW52aXJvbm1lbnQgPz89IG5ldyBpci5UeXBlRW52aXJvbm1lbnQoCiAgICAgICAgICBuZXcgaXIuQ29yZVR5cGVzKHByb2dyYW1FbnYubWFpbkNvbXBvbmVudCksIGNsYXNzSGllcmFyY2h5KTsKICAgIH0KICAgIHJldHVybiBfdHlwZUVudmlyb25tZW50OwogIH0KCiAgaXIuQ2xhc3NIaWVyYXJjaHkgZ2V0IGNsYXNzSGllcmFyY2h5IHsKICAgIGlmIChfY2xhc3NIaWVyYXJjaHkgPT0gbnVsbCkgewogICAgICBfY2xhc3NIaWVyYXJjaHkgPz89IG5ldyBpci5DbGFzc0hpZXJhcmNoeShwcm9ncmFtRW52Lm1haW5Db21wb25lbnQpOwogICAgfQogICAgcmV0dXJuIF9jbGFzc0hpZXJhcmNoeTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRpY1R5cGVQcm92aWRlciBnZXRTdGF0aWNUeXBlUHJvdmlkZXIoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgTWVtYmVyRGVmaW5pdGlvbiBtZW1iZXJEZWZpbml0aW9uID0gbWVtYmVycy5nZXREYXRhKG1lbWJlcikuZGVmaW5pdGlvbjsKICAgIFN0YXRpY1R5cGVDYWNoZSBjYWNoZWRTdGF0aWNUeXBlczsKICAgIGlyLkludGVyZmFjZVR5cGUgdGhpc1R5cGU7CiAgICBzd2l0Y2ggKG1lbWJlckRlZmluaXRpb24ua2luZCkgewogICAgICBjYXNlIE1lbWJlcktpbmQucmVndWxhcjoKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yOgogICAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3JCb2R5OgogICAgICAgIGlyLk1lbWJlciBub2RlID0gbWVtYmVyRGVmaW5pdGlvbi5ub2RlOwogICAgICAgIHRoaXNUeXBlID0gbm9kZS5lbmNsb3NpbmdDbGFzcz8udGhpc1R5cGU7CiAgICAgICAgY2FjaGVkU3RhdGljVHlwZXMgPSBtZW1iZXJzLmdldERhdGEobWVtYmVyKS5zdGF0aWNUeXBlczsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNsb3N1cmVDYWxsOgogICAgICAgIGlyLlRyZWVOb2RlIG5vZGUgPSBtZW1iZXJEZWZpbml0aW9uLm5vZGU7CiAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewogICAgICAgICAgaWYgKG5vZGUgaXMgaXIuTWVtYmVyKSB7CiAgICAgICAgICAgIGlyLk1lbWJlciBtZW1iZXIgPSBub2RlOwogICAgICAgICAgICB0aGlzVHlwZSA9IG1lbWJlci5lbmNsb3NpbmdDbGFzcz8udGhpc1R5cGU7CiAgICAgICAgICAgIGNhY2hlZFN0YXRpY1R5cGVzID0gbWVtYmVycy5nZXREYXRhKGdldE1lbWJlcihtZW1iZXIpKS5zdGF0aWNUeXBlczsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1lbWJlcktpbmQuY2xvc3VyZUZpZWxkOgogICAgICBjYXNlIE1lbWJlcktpbmQuc2lnbmF0dXJlOgogICAgICBjYXNlIE1lbWJlcktpbmQuZ2VuZXJhdG9yQm9keToKICAgICAgICBjYWNoZWRTdGF0aWNUeXBlcyA9IGNvbnN0IFN0YXRpY1R5cGVDYWNoZSgpOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIGFzc2VydChjYWNoZWRTdGF0aWNUeXBlcyAhPSBudWxsLCAiTm8gc3RhdGljIHR5cGVzIGNhY2hlZCBmb3IgJG1lbWJlci4iKTsKICAgIHJldHVybiBuZXcgQ2FjaGVkU3RhdGljVHlwZSh0eXBlRW52aXJvbm1lbnQsIGNhY2hlZFN0YXRpY1R5cGVzLAogICAgICAgIG5ldyBUaGlzSW50ZXJmYWNlVHlwZS5mcm9tKHRoaXNUeXBlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBOYW1lIGdldE5hbWUoaXIuTmFtZSBuYW1lKSB7CiAgICByZXR1cm4gbmV3IE5hbWUoCiAgICAgICAgbmFtZS5uYW1lLCBuYW1lLmlzUHJpdmF0ZSA/IGdldExpYnJhcnkobmFtZS5saWJyYXJ5KSA6IG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2FsbFN0cnVjdHVyZSBnZXRDYWxsU3RydWN0dXJlKGlyLkFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIGludCBhcmd1bWVudENvdW50ID0gYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoICsgYXJndW1lbnRzLm5hbWVkLmxlbmd0aDsKICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cyA9IGFyZ3VtZW50cy5uYW1lZC5tYXAoKGUpID0+IGUubmFtZSkudG9MaXN0KCk7CiAgICByZXR1cm4gbmV3IENhbGxTdHJ1Y3R1cmUoCiAgICAgICAgYXJndW1lbnRDb3VudCwgbmFtZWRBcmd1bWVudHMsIGFyZ3VtZW50cy50eXBlcy5sZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgU2VsZWN0b3IgZ2V0U2VsZWN0b3IoaXIuRXhwcmVzc2lvbiBub2RlKSB7CiAgICAvLyBUT0RPKGVmb3J0dW5hKTogVGhpcyBpcyBzY3JlYW1pbmcgZm9yIGEgY29tbW9uIGludGVyZmFjZSBiZXR3ZWVuCiAgICAvLyBQcm9wZXJ0eUdldCBhbmQgU3VwZXJQcm9wZXJ0eUdldCAoYW5kIHNhbWUgZm9yICpHZXQpLiBUYWxrIHRvIGtlcm5lbAogICAgLy8gZm9sa3MuCiAgICBpZiAobm9kZSBpcyBpci5Qcm9wZXJ0eUdldCkgewogICAgICByZXR1cm4gZ2V0R2V0dGVyU2VsZWN0b3Iobm9kZS5uYW1lKTsKICAgIH0KICAgIGlmIChub2RlIGlzIGlyLkRpcmVjdFByb3BlcnR5R2V0KSB7CiAgICAgIHJldHVybiBnZXRHZXR0ZXJTZWxlY3Rvcihub2RlLnRhcmdldC5uYW1lKTsKICAgIH0KICAgIGlmIChub2RlIGlzIGlyLlN1cGVyUHJvcGVydHlHZXQpIHsKICAgICAgcmV0dXJuIGdldEdldHRlclNlbGVjdG9yKG5vZGUubmFtZSk7CiAgICB9CiAgICBpZiAobm9kZSBpcyBpci5Qcm9wZXJ0eVNldCkgewogICAgICByZXR1cm4gZ2V0U2V0dGVyU2VsZWN0b3Iobm9kZS5uYW1lKTsKICAgIH0KICAgIGlmIChub2RlIGlzIGlyLlN1cGVyUHJvcGVydHlTZXQpIHsKICAgICAgcmV0dXJuIGdldFNldHRlclNlbGVjdG9yKG5vZGUubmFtZSk7CiAgICB9CiAgICBpZiAobm9kZSBpcyBpci5JbnZvY2F0aW9uRXhwcmVzc2lvbikgewogICAgICByZXR1cm4gZ2V0SW52b2NhdGlvblNlbGVjdG9yKG5vZGUpOwogICAgfQogICAgdGhyb3cgZmFpbGVkQXQoCiAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAiQ2FuIG9ubHkgZ2V0IHRoZSBzZWxlY3RvciBmb3IgYSBwcm9wZXJ0eSBnZXQgb3IgYW4gaW52b2NhdGlvbjogIgogICAgICAgICIke25vZGV9Iik7CiAgfQoKICBTZWxlY3RvciBnZXRJbnZvY2F0aW9uU2VsZWN0b3IoaXIuSW52b2NhdGlvbkV4cHJlc3Npb24gaW52b2NhdGlvbikgewogICAgTmFtZSBuYW1lID0gZ2V0TmFtZShpbnZvY2F0aW9uLm5hbWUpOwogICAgU2VsZWN0b3JLaW5kIGtpbmQ7CiAgICBpZiAoU2VsZWN0b3IuaXNPcGVyYXRvck5hbWUobmFtZS50ZXh0KSkgewogICAgICBpZiAobmFtZSA9PSBOYW1lcy5JTkRFWF9OQU1FIHx8IG5hbWUgPT0gTmFtZXMuSU5ERVhfU0VUX05BTUUpIHsKICAgICAgICBraW5kID0gU2VsZWN0b3JLaW5kLklOREVYOwogICAgICB9IGVsc2UgewogICAgICAgIGtpbmQgPSBTZWxlY3RvcktpbmQuT1BFUkFUT1I7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGtpbmQgPSBTZWxlY3RvcktpbmQuQ0FMTDsKICAgIH0KCiAgICBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUgPSBnZXRDYWxsU3RydWN0dXJlKGludm9jYXRpb24uYXJndW1lbnRzKTsKICAgIHJldHVybiBuZXcgU2VsZWN0b3Ioa2luZCwgbmFtZSwgY2FsbFN0cnVjdHVyZSk7CiAgfQoKICBTZWxlY3RvciBnZXRHZXR0ZXJTZWxlY3Rvcihpci5OYW1lIGlyTmFtZSkgewogICAgTmFtZSBuYW1lID0gbmV3IE5hbWUoCiAgICAgICAgaXJOYW1lLm5hbWUsIGlyTmFtZS5pc1ByaXZhdGUgPyBnZXRMaWJyYXJ5KGlyTmFtZS5saWJyYXJ5KSA6IG51bGwpOwogICAgcmV0dXJuIG5ldyBTZWxlY3Rvci5nZXR0ZXIobmFtZSk7CiAgfQoKICBTZWxlY3RvciBnZXRTZXR0ZXJTZWxlY3Rvcihpci5OYW1lIGlyTmFtZSkgewogICAgTmFtZSBuYW1lID0gbmV3IE5hbWUoCiAgICAgICAgaXJOYW1lLm5hbWUsIGlyTmFtZS5pc1ByaXZhdGUgPyBnZXRMaWJyYXJ5KGlyTmFtZS5saWJyYXJ5KSA6IG51bGwpOwogICAgcmV0dXJuIG5ldyBTZWxlY3Rvci5zZXR0ZXIobmFtZSk7CiAgfQoKICAvLy8gTG9va3MgdXAgW3R5cGVOYW1lXSBmb3IgdXNlIGluIHRoZSBzcGVjLXN0cmluZyBvZiBhIGBKU2AgY2FsbC4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgdGhpcyBpbiBbbmF0aXZlLk5hdGl2ZUJlaGF2aW9yXSBpbnN0ZWFkIG9mIGNhbGxpbmcKICAvLyB0aGUgYEZvcmVpZ25SZXNvbHZlcmAuCiAgVHlwZUxvb2t1cCB0eXBlTG9va3VwKHtib29sIHJlc29sdmVBc1JhdzogdHJ1ZX0pIHsKICAgIHJldHVybiByZXNvbHZlQXNSYXcKICAgICAgICA/IChfY2FjaGVkVHlwZUxvb2t1cFJhdyA/Pz0gX3R5cGVMb29rdXAocmVzb2x2ZUFzUmF3OiB0cnVlKSkKICAgICAgICA6IChfY2FjaGVkVHlwZUxvb2t1cEZ1bGwgPz89IF90eXBlTG9va3VwKHJlc29sdmVBc1JhdzogZmFsc2UpKTsKICB9CgogIFR5cGVMb29rdXAgX2NhY2hlZFR5cGVMb29rdXBSYXc7CiAgVHlwZUxvb2t1cCBfY2FjaGVkVHlwZUxvb2t1cEZ1bGw7CgogIFR5cGVMb29rdXAgX3R5cGVMb29rdXAoe2Jvb2wgcmVzb2x2ZUFzUmF3OiB0cnVlfSkgewogICAgYm9vbCBjYWNoZWRNYXlMb29rdXBJbk1haW47CiAgICBib29sIG1heUxvb2t1cEluTWFpbigpIHsKICAgICAgdmFyIG1haW5VcmkgPSBlbGVtZW50RW52aXJvbm1lbnQubWFpbkxpYnJhcnkuY2Fub25pY2FsVXJpOwogICAgICAvLyBUZXN0cyBwZXJtaXQgbG9va3VwIG91dHNpZGUgb2YgZGFydDogbGlicmFyaWVzLgogICAgICByZXR1cm4gbWFpblVyaS5wYXRoLmNvbnRhaW5zKCd0ZXN0cy9jb21waWxlci9kYXJ0MmpzX25hdGl2ZScpIHx8CiAgICAgICAgICBtYWluVXJpLnBhdGguY29udGFpbnMoJ3Rlc3RzL2NvbXBpbGVyL2RhcnQyanNfZXh0cmEnKTsKICAgIH0KCiAgICBEYXJ0VHlwZSBsb29rdXAoU3RyaW5nIHR5cGVOYW1lLCB7Ym9vbCByZXF1aXJlZH0pIHsKICAgICAgRGFydFR5cGUgZmluZEluTGlicmFyeShMaWJyYXJ5RW50aXR5IGxpYnJhcnkpIHsKICAgICAgICBpZiAobGlicmFyeSAhPSBudWxsKSB7CiAgICAgICAgICBDbGFzc0VudGl0eSBjbHMgPSBlbGVtZW50RW52aXJvbm1lbnQubG9va3VwQ2xhc3MobGlicmFyeSwgdHlwZU5hbWUpOwogICAgICAgICAgaWYgKGNscyAhPSBudWxsKSB7CiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEFsaWduIHNlbWFudGljcy4KICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVBc1JhdwogICAgICAgICAgICAgICAgPyBlbGVtZW50RW52aXJvbm1lbnQuZ2V0UmF3VHlwZShjbHMpCiAgICAgICAgICAgICAgICA6IGVsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShjbHMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgRGFydFR5cGUgZmluZEluKFVyaSB1cmkpIHsKICAgICAgICByZXR1cm4gZmluZEluTGlicmFyeShlbGVtZW50RW52aXJvbm1lbnQubG9va3VwTGlicmFyeSh1cmkpKTsKICAgICAgfQoKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTmFycm93IHRoZSBzZXQgb2YgbG9va3VwcyBiYXNlZCBvbiB0aGUgZGVwZW5kaW5nCiAgICAgIC8vIGxpYnJhcnkuCiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENhY2hlIG1vcmUgcmVzdWx0cyB0byBhdm9pZCByZWR1bmRhbnQgbG9va3Vwcz8KICAgICAgRGFydFR5cGUgdHlwZTsKICAgICAgaWYgKGNhY2hlZE1heUxvb2t1cEluTWFpbiA/Pz0gbWF5TG9va3VwSW5NYWluKCkpIHsKICAgICAgICB0eXBlID8/PSBmaW5kSW5MaWJyYXJ5KGVsZW1lbnRFbnZpcm9ubWVudC5tYWluTGlicmFyeSk7CiAgICAgIH0KICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9jb3JlKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9fanNfaGVscGVyKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9faW50ZXJjZXB0b3JzKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9fbmF0aXZlX3R5cGVkX2RhdGEpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X2NvbGxlY3Rpb24pOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X21hdGgpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X2h0bWwpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X2h0bWxfY29tbW9uKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9zdmcpOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X3dlYl9hdWRpbyk7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfd2ViX2dsKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF93ZWJfc3FsKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9pbmRleGVkX2RiKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF90eXBlZF9kYXRhKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9fcnRpKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9taXJyb3JzKTsKICAgICAgaWYgKHR5cGUgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZShDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgICBNZXNzYWdlS2luZC5HRU5FUklDLCB7J3RleHQnOiAiVHlwZSAnJHR5cGVOYW1lJyBub3QgZm91bmQuIn0pOwogICAgICB9CiAgICAgIHJldHVybiB0eXBlOwogICAgfQoKICAgIHJldHVybiBsb29rdXA7CiAgfQoKICBTdHJpbmcgX2dldFN0cmluZ0FyZ3VtZW50KGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSwgaW50IGluZGV4KSB7CiAgICByZXR1cm4gbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbFtpbmRleF0uYWNjZXB0KG5ldyBTdHJpbmdpZmllcigpKTsKICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENhY2hlIHRoaXMgZm9yIGxhdGVyIHVzZS4KICBAb3ZlcnJpZGUKICBOYXRpdmVCZWhhdmlvciBnZXROYXRpdmVCZWhhdmlvckZvckpzQ2FsbChpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA8IDIgfHwKICAgICAgICBub2RlLmFyZ3VtZW50cy5uYW1lZC5pc05vdEVtcHR5KSB7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsIE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KUyk7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKICAgIH0KICAgIFN0cmluZyBzcGVjU3RyaW5nID0gX2dldFN0cmluZ0FyZ3VtZW50KG5vZGUsIDApOwogICAgaWYgKHNwZWNTdHJpbmcgPT0gbnVsbCkgewogICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCBNZXNzYWdlS2luZC5XUk9OR19BUkdVTUVOVF9GT1JfSlNfRklSU1QpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CgogICAgU3RyaW5nIGNvZGVTdHJpbmcgPSBfZ2V0U3RyaW5nQXJndW1lbnQobm9kZSwgMSk7CiAgICBpZiAoY29kZVN0cmluZyA9PSBudWxsKSB7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsIE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KU19TRUNPTkQpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CgogICAgcmV0dXJuIE5hdGl2ZUJlaGF2aW9yLm9mSnNDYWxsKAogICAgICAgIHNwZWNTdHJpbmcsCiAgICAgICAgY29kZVN0cmluZywKICAgICAgICB0eXBlTG9va3VwKHJlc29sdmVBc1JhdzogdHJ1ZSksCiAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICByZXBvcnRlciwKICAgICAgICBjb21tb25FbGVtZW50cyk7CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDYWNoZSB0aGlzIGZvciBsYXRlciB1c2UuCiAgQG92ZXJyaWRlCiAgTmF0aXZlQmVoYXZpb3IgZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0J1aWx0aW5DYWxsKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoIDwgMSkgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgIkpTIGJ1aWx0aW4gZXhwcmVzc2lvbiBoYXMgbm8gdHlwZS4iKTsKICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgfQogICAgaWYgKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoIDwgMikgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgIkpTIGJ1aWx0aW4gaXMgbWlzc2luZyBuYW1lLiIpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CiAgICBTdHJpbmcgc3BlY1N0cmluZyA9IF9nZXRTdHJpbmdBcmd1bWVudChub2RlLCAwKTsKICAgIGlmIChzcGVjU3RyaW5nID09IG51bGwpIHsKICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcigKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICJVbmV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50LiIpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CiAgICByZXR1cm4gTmF0aXZlQmVoYXZpb3Iub2ZKc0J1aWx0aW5DYWxsKAogICAgICAgIHNwZWNTdHJpbmcsCiAgICAgICAgdHlwZUxvb2t1cChyZXNvbHZlQXNSYXc6IHRydWUpLAogICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgcmVwb3J0ZXIsCiAgICAgICAgY29tbW9uRWxlbWVudHMpOwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2FjaGUgdGhpcyBmb3IgbGF0ZXIgdXNlLgogIEBvdmVycmlkZQogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUJlaGF2aW9yRm9ySnNFbWJlZGRlZEdsb2JhbENhbGwoCiAgICAgIGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoIDwgMSkgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAiSlMgZW1iZWRkZWQgZ2xvYmFsIGV4cHJlc3Npb24gaGFzIG5vIHR5cGUuIik7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKICAgIH0KICAgIGlmIChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA8IDIpIHsKICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcigKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICJKUyBlbWJlZGRlZCBnbG9iYWwgaXMgbWlzc2luZyBuYW1lLiIpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CiAgICBpZiAobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPiAyIHx8CiAgICAgICAgbm9kZS5hcmd1bWVudHMubmFtZWQuaXNOb3RFbXB0eSkgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAiSlMgZW1iZWRkZWQgZ2xvYmFsIGhhcyBtb3JlIHRoYW4gMiBhcmd1bWVudHMuIik7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKICAgIH0KICAgIFN0cmluZyBzcGVjU3RyaW5nID0gX2dldFN0cmluZ0FyZ3VtZW50KG5vZGUsIDApOwogICAgaWYgKHNwZWNTdHJpbmcgPT0gbnVsbCkgewogICAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgIlVuZXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQuIik7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKICAgIH0KICAgIHJldHVybiBOYXRpdmVCZWhhdmlvci5vZkpzRW1iZWRkZWRHbG9iYWxDYWxsKAogICAgICAgIHNwZWNTdHJpbmcsCiAgICAgICAgdHlwZUxvb2t1cChyZXNvbHZlQXNSYXc6IHRydWUpLAogICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgcmVwb3J0ZXIsCiAgICAgICAgY29tbW9uRWxlbWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBnZXRDb25zdGFudFZhbHVlKGlyLkV4cHJlc3Npb24gbm9kZSwKICAgICAge2Jvb2wgcmVxdWlyZUNvbnN0YW50OiB0cnVlLCBib29sIGltcGxpY2l0TnVsbDogZmFsc2V9KSB7CiAgICBpZiAobm9kZSBpcyBpci5Db25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgcmV0dXJuIF9jb25zdGFudFZhbHVlZmllci52aXNpdENvbnN0YW50KG5vZGUuY29uc3RhbnQpOwogICAgfQoKICAgIENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudDsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgaWYgKCFpbXBsaWNpdE51bGwpIHsKICAgICAgICB0aHJvdyBmYWlsZWRBdCgKICAgICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgJ05vIGV4cHJlc3Npb24gZm9yIGNvbnN0YW50LicpOwogICAgICB9CiAgICAgIGNvbnN0YW50ID0gbmV3IE51bGxDb25zdGFudEV4cHJlc3Npb24oKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0YW50ID0KICAgICAgICAgIG5ldyBDb25zdGFudGlmaWVyKHRoaXMsIHJlcXVpcmVDb25zdGFudDogcmVxdWlyZUNvbnN0YW50KS52aXNpdChub2RlKTsKICAgIH0KICAgIGlmIChjb25zdGFudCA9PSBudWxsKSB7CiAgICAgIGlmIChyZXF1aXJlQ29uc3RhbnQpIHsKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICAgJ05vIGNvbnN0YW50IGZvciAke0RlYnVnUHJpbnRlci5wcmV0dHlQcmludChub2RlKX0nKTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBjb21wdXRlQ29uc3RhbnRWYWx1ZSgKICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShub2RlKSwgY29uc3RhbnQsCiAgICAgICAgcmVxdWlyZUNvbnN0YW50OiByZXF1aXJlQ29uc3RhbnQpOwogICAgaWYgKCF2YWx1ZS5pc0NvbnN0YW50ICYmICFyZXF1aXJlQ29uc3RhbnQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICAvLy8gQ29udmVydHMgW2Fubm90YXRpb25zXSBpbnRvIGEgbGlzdCBvZiBbQ29uc3RhbnRWYWx1ZV1zLgogIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZ2V0TWV0YWRhdGEoTGlzdDxpci5FeHByZXNzaW9uPiBhbm5vdGF0aW9ucykgewogICAgaWYgKGFubm90YXRpb25zLmlzRW1wdHkpIHJldHVybiBjb25zdCA8Q29uc3RhbnRWYWx1ZT5bXTsKICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gbWV0YWRhdGEgPSA8Q29uc3RhbnRWYWx1ZT5bXTsKICAgIGFubm90YXRpb25zLmZvckVhY2goKGlyLkV4cHJlc3Npb24gbm9kZSkgewogICAgICBtZXRhZGF0YS5hZGQoZ2V0Q29uc3RhbnRWYWx1ZShub2RlKSk7CiAgICB9KTsKICAgIHJldHVybiBtZXRhZGF0YTsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldFN1cGVyTm9TdWNoTWV0aG9kKENsYXNzRW50aXR5IGNscykgewogICAgd2hpbGUgKGNscyAhPSBudWxsKSB7CiAgICAgIGNscyA9IGVsZW1lbnRFbnZpcm9ubWVudC5nZXRTdXBlckNsYXNzKGNscyk7CiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPSBlbGVtZW50RW52aXJvbm1lbnQubG9va3VwTG9jYWxDbGFzc01lbWJlcigKICAgICAgICAgIGNscywgSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXyk7CiAgICAgIGlmIChtZW1iZXIgIT0gbnVsbCAmJiAhbWVtYmVyLmlzQWJzdHJhY3QpIHsKICAgICAgICBpZiAobWVtYmVyLmlzRnVuY3Rpb24pIHsKICAgICAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uID0gbWVtYmVyOwogICAgICAgICAgaWYgKGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZS5wb3NpdGlvbmFsUGFyYW1ldGVycyA+PSAxKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gSWYgW21lbWJlcl0gaXMgbm90IGEgdmFsaWQgYG5vU3VjaE1ldGhvZGAgdGhlIHRhcmdldCBpcwogICAgICAgIC8vIGBPYmplY3Quc3VwZXJOb1N1Y2hNZXRob2RgLgogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiA9IGVsZW1lbnRFbnZpcm9ubWVudC5sb29rdXBMb2NhbENsYXNzTWVtYmVyKAogICAgICAgIGNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzLCBJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfKTsKICAgIGFzc2VydChmdW5jdGlvbiAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KGNscywgIk5vIHN1cGVyIG5vU3VjaE1ldGhvZCBmb3VuZCBmb3IgY2xhc3MgJGNscy4iKSk7CiAgICByZXR1cm4gZnVuY3Rpb247CiAgfQoKICBUeXBlVmFyaWFibGVFbnRpdHkgY3JlYXRlVHlwZVZhcmlhYmxlKAogICAgICBFbnRpdHkgdHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgaW50IGluZGV4KSB7CiAgICByZXR1cm4gbmV3IEpUeXBlVmFyaWFibGUodHlwZURlY2xhcmF0aW9uLCBuYW1lLCBpbmRleCk7CiAgfQoKICBKQ29uc3RydWN0b3JCb2R5IGNyZWF0ZUNvbnN0cnVjdG9yQm9keSgKICAgICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IsIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUpIHsKICAgIHJldHVybiBuZXcgSkNvbnN0cnVjdG9yQm9keShjb25zdHJ1Y3RvciwgcGFyYW1ldGVyU3RydWN0dXJlKTsKICB9CgogIEpHZW5lcmF0b3JCb2R5IGNyZWF0ZUdlbmVyYXRvckJvZHkoCiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLCBEYXJ0VHlwZSBlbGVtZW50VHlwZSkgewogICAgcmV0dXJuIG5ldyBKR2VuZXJhdG9yQm9keShmdW5jdGlvbiwgZWxlbWVudFR5cGUpOwogIH0KCiAgdm9pZCBmb3JFYWNoTmVzdGVkQ2xvc3VyZSgKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwgdm9pZCBmKEZ1bmN0aW9uRW50aXR5IGNsb3N1cmUpKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkobWVtYmVyKSk7CiAgICBfbmVzdGVkQ2xvc3VyZU1hcFttZW1iZXJdPy5mb3JFYWNoKGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRNZW1iZXJUaGlzVHlwZShNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gbWVtYmVycy5nZXREYXRhKG1lbWJlcikuZ2V0TWVtYmVyVGhpc1R5cGUodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyBnZXRDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzc0Zvck1lbWJlcigKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgcmV0dXJuIG1lbWJlcnMuZ2V0RGF0YShtZW1iZXIpLmNsYXNzVHlwZVZhcmlhYmxlQWNjZXNzOwogIH0KCiAgYm9vbCBjaGVja0ZhbWlseShFbnRpdHkgZW50aXR5KSB7CiAgICBhc3NlcnQoCiAgICAgICAgJyRlbnRpdHknLnN0YXJ0c1dpdGgoanNFbGVtZW50UHJlZml4KSwKICAgICAgICBmYWlsZWRBdChlbnRpdHksCiAgICAgICAgICAgICJVbmV4cGVjdGVkIGVudGl0eSAkZW50aXR5LCBleHBlY3RlZCBmYW1pbHkgJGpzRWxlbWVudFByZWZpeC4iKSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIFNwYW5uYWJsZSBnZXRTcGFubmFibGUoTWVtYmVyRW50aXR5IG1lbWJlciwgaXIuTm9kZSBub2RlKSB7CiAgICBTb3VyY2VTcGFuIHNvdXJjZVNwYW47CiAgICBpZiAobm9kZSBpcyBpci5UcmVlTm9kZSkgewogICAgICBzb3VyY2VTcGFuID0gY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSk7CiAgICB9CiAgICBzb3VyY2VTcGFuID8/PSBnZXRTb3VyY2VTcGFuKG1lbWJlciwgbnVsbCk7CiAgICByZXR1cm4gc291cmNlU3BhbjsKICB9CgogIEl0ZXJhYmxlPExpYnJhcnlFbnRpdHk+IGdldCBsaWJyYXJ5TGlzdEludGVybmFsIHsKICAgIHJldHVybiBsaWJyYXJ5TWFwLnZhbHVlczsKICB9CgogIExpYnJhcnlFbnRpdHkgZ2V0TGlicmFyeUludGVybmFsKGlyLkxpYnJhcnkgbm9kZSwgW0pMaWJyYXJ5RW52IGVudl0pIHsKICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSA9IGxpYnJhcnlNYXBbbm9kZV07CiAgICBhc3NlcnQobGlicmFyeSAhPSBudWxsLCAiTm8gbGlicmFyeSBlbnRpdHkgZm9yICRub2RlIik7CiAgICByZXR1cm4gbGlicmFyeTsKICB9CgogIENsYXNzRW50aXR5IGdldENsYXNzSW50ZXJuYWwoaXIuQ2xhc3Mgbm9kZSwgW0pDbGFzc0VudiBlbnZdKSB7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBjbGFzc01hcFtub2RlXTsKICAgIGFzc2VydChjbHMgIT0gbnVsbCwgIk5vIGNsYXNzIGVudGl0eSBmb3IgJG5vZGUiKTsKICAgIHJldHVybiBjbHM7CiAgfQoKICBGaWVsZEVudGl0eSBnZXRGaWVsZEludGVybmFsKGlyLkZpZWxkIG5vZGUpIHsKICAgIEZpZWxkRW50aXR5IGZpZWxkID0gZmllbGRNYXBbbm9kZV07CiAgICBhc3NlcnQoZmllbGQgIT0gbnVsbCwgIk5vIGZpZWxkIGVudGl0eSBmb3IgJG5vZGUiKTsKICAgIHJldHVybiBmaWVsZDsKICB9CgogIEZ1bmN0aW9uRW50aXR5IGdldE1ldGhvZEludGVybmFsKGlyLlByb2NlZHVyZSBub2RlKSB7CiAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiA9IG1ldGhvZE1hcFtub2RlXTsKICAgIGFzc2VydChmdW5jdGlvbiAhPSBudWxsLCAiTm8gZnVuY3Rpb24gZW50aXR5IGZvciAkbm9kZSIpOwogICAgcmV0dXJuIGZ1bmN0aW9uOwogIH0KCiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0Q29uc3RydWN0b3JJbnRlcm5hbChpci5NZW1iZXIgbm9kZSkgewogICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPSBjb25zdHJ1Y3Rvck1hcFtub2RlXTsKICAgIGFzc2VydChjb25zdHJ1Y3RvciAhPSBudWxsLCAiTm8gY29uc3RydWN0b3IgZW50aXR5IGZvciAkbm9kZSIpOwogICAgcmV0dXJuIGNvbnN0cnVjdG9yOwogIH0KCiAgVHlwZVZhcmlhYmxlRW50aXR5IGdldFR5cGVWYXJpYWJsZUludGVybmFsKGlyLlR5cGVQYXJhbWV0ZXIgbm9kZSkgewogICAgVHlwZVZhcmlhYmxlRW50aXR5IHR5cGVWYXJpYWJsZSA9IHR5cGVWYXJpYWJsZU1hcFtub2RlXTsKICAgIGlmICh0eXBlVmFyaWFibGUgPT0gbnVsbCkgewogICAgICBpZiAobm9kZS5wYXJlbnQgaXMgaXIuRnVuY3Rpb25Ob2RlKSB7CiAgICAgICAgaXIuRnVuY3Rpb25Ob2RlIGZ1bmMgPSBub2RlLnBhcmVudDsKICAgICAgICBpbnQgaW5kZXggPSBmdW5jLnR5cGVQYXJhbWV0ZXJzLmluZGV4T2Yobm9kZSk7CiAgICAgICAgaWYgKGZ1bmMucGFyZW50IGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgICAgICBpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGZ1bmMucGFyZW50OwogICAgICAgICAgaXIuQ2xhc3MgY2xzID0gY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3M7CiAgICAgICAgICB0eXBlVmFyaWFibGVNYXBbbm9kZV0gPQogICAgICAgICAgICAgIHR5cGVWYXJpYWJsZSA9IGdldFR5cGVWYXJpYWJsZUludGVybmFsKGNscy50eXBlUGFyYW1ldGVyc1tpbmRleF0pOwogICAgICAgIH0gZWxzZSBpZiAoZnVuYy5wYXJlbnQgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgICAgICBpci5Qcm9jZWR1cmUgcHJvY2VkdXJlID0gZnVuYy5wYXJlbnQ7CiAgICAgICAgICBpZiAocHJvY2VkdXJlLmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5GYWN0b3J5KSB7CiAgICAgICAgICAgIGlyLkNsYXNzIGNscyA9IHByb2NlZHVyZS5lbmNsb3NpbmdDbGFzczsKICAgICAgICAgICAgdHlwZVZhcmlhYmxlTWFwW25vZGVdID0gdHlwZVZhcmlhYmxlID0KICAgICAgICAgICAgICAgIGdldFR5cGVWYXJpYWJsZUludGVybmFsKGNscy50eXBlUGFyYW1ldGVyc1tpbmRleF0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXNzZXJ0KAogICAgICAgIHR5cGVWYXJpYWJsZSAhPSBudWxsLAogICAgICAgICJObyB0eXBlIHZhcmlhYmxlIGVudGl0eSBmb3IgJG5vZGUgb24gIgogICAgICAgICIke25vZGUucGFyZW50IGlzIGlyLkZ1bmN0aW9uTm9kZSA/IG5vZGUucGFyZW50LnBhcmVudCA6IG5vZGUucGFyZW50fSIpOwogICAgcmV0dXJuIHR5cGVWYXJpYWJsZTsKICB9CgogIFR5cGVkZWZFbnRpdHkgZ2V0VHlwZWRlZkludGVybmFsKGlyLlR5cGVkZWYgbm9kZSkgewogICAgVHlwZWRlZkVudGl0eSB0eXBlZGVmID0gdHlwZWRlZk1hcFtub2RlXTsKICAgIGFzc2VydCh0eXBlZGVmICE9IG51bGwsICJObyB0eXBlZGVmIGVudGl0eSBmb3IgJG5vZGUiKTsKICAgIHJldHVybiB0eXBlZGVmOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0Q29uc3RydWN0b3JCb2R5KGlyLkNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yID0gZ2V0Q29uc3RydWN0b3Iobm9kZSk7CiAgICByZXR1cm4gX2dldENvbnN0cnVjdG9yQm9keShjb25zdHJ1Y3Rvcik7CiAgfQoKICBKQ29uc3RydWN0b3JCb2R5IF9nZXRDb25zdHJ1Y3RvckJvZHkoSW5kZXhlZENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB7CiAgICBKQ29uc3RydWN0b3JEYXRhSW1wbCBkYXRhID0gbWVtYmVycy5nZXREYXRhKGNvbnN0cnVjdG9yKTsKICAgIGlmIChkYXRhLmNvbnN0cnVjdG9yQm9keSA9PSBudWxsKSB7CiAgICAgIC8vLyBUaGUgY29uc3RydWN0b3IgY2FsbHMgdGhlIGNvbnN0cnVjdG9yIGJvZHkgd2l0aCBhbGwgcGFyYW1ldGVycy4KICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHBhcmFtZXRlcnMgdGhhdCBhcmUgbm90IHVzZWQgaW4gdGhlCiAgICAgIC8vICBjb25zdHJ1Y3RvciBib2R5LgogICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlID0KICAgICAgICAgIF9nZXRQYXJhbWV0ZXJTdHJ1Y3R1cmVGcm9tRnVuY3Rpb25Ob2RlKGRhdGEubm9kZS5mdW5jdGlvbik7CgogICAgICBKQ29uc3RydWN0b3JCb2R5IGNvbnN0cnVjdG9yQm9keSA9CiAgICAgICAgICBjcmVhdGVDb25zdHJ1Y3RvckJvZHkoY29uc3RydWN0b3IsIHBhcmFtZXRlclN0cnVjdHVyZSk7CiAgICAgIG1lbWJlcnMucmVnaXN0ZXI8SW5kZXhlZEZ1bmN0aW9uLCBGdW5jdGlvbkRhdGE+KAogICAgICAgICAgY29uc3RydWN0b3JCb2R5LAogICAgICAgICAgbmV3IENvbnN0cnVjdG9yQm9keURhdGFJbXBsKAogICAgICAgICAgICAgIGRhdGEubm9kZSwKICAgICAgICAgICAgICBkYXRhLm5vZGUuZnVuY3Rpb24sCiAgICAgICAgICAgICAgbmV3IFNwZWNpYWxNZW1iZXJEZWZpbml0aW9uKAogICAgICAgICAgICAgICAgICBkYXRhLm5vZGUsIE1lbWJlcktpbmQuY29uc3RydWN0b3JCb2R5KSwKICAgICAgICAgICAgICBkYXRhLnN0YXRpY1R5cGVzKSk7CiAgICAgIEluZGV4ZWRDbGFzcyBjbHMgPSBjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzczsKICAgICAgSkNsYXNzRW52SW1wbCBjbGFzc0VudiA9IGNsYXNzZXMuZ2V0RW52KGNscyk7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIHRoaXMgYnkgb25seSBpbmNsdWRpbmcgbGl2ZSBtZW1iZXJzIGluIHRoZQogICAgICAvLyBqcy1tb2RlbC4KICAgICAgY2xhc3NFbnYuYWRkQ29uc3RydWN0b3JCb2R5KGNvbnN0cnVjdG9yQm9keSk7CiAgICAgIGxhdGVPdXRwdXRVbml0RGF0YUJ1aWxkZXIucmVnaXN0ZXJDb2xvY2F0ZWRNZW1iZXJzKAogICAgICAgICAgY29uc3RydWN0b3IsIGNvbnN0cnVjdG9yQm9keSk7CiAgICAgIGRhdGEuY29uc3RydWN0b3JCb2R5ID0gY29uc3RydWN0b3JCb2R5OwogICAgfQogICAgcmV0dXJuIGRhdGEuY29uc3RydWN0b3JCb2R5OwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRGVmaW5pdGlvbiBnZXRNZW1iZXJEZWZpbml0aW9uKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgIHJldHVybiBnZXRNZW1iZXJEZWZpbml0aW9uSW50ZXJuYWwobWVtYmVyKTsKICB9CgogIEBvdmVycmlkZQogIGlyLk1lbWJlciBnZXRNZW1iZXJDb250ZXh0Tm9kZShNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBpci5NZW1iZXIgZ2V0UGFyZW50TWVtYmVyKGlyLlRyZWVOb2RlIG5vZGUpIHsKICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewogICAgICAgIGlmIChub2RlIGlzIGlyLk1lbWJlcikgewogICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgfQogICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRNZW1iZXJEZWZpbml0aW9uKG1lbWJlcik7CiAgICBzd2l0Y2ggKGRlZmluaXRpb24ua2luZCkgewogICAgICBjYXNlIE1lbWJlcktpbmQucmVndWxhcjoKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNvbnN0cnVjdG9yOgogICAgICBjYXNlIE1lbWJlcktpbmQuY29uc3RydWN0b3JCb2R5OgogICAgICAgIHJldHVybiBkZWZpbml0aW9uLm5vZGU7CiAgICAgIGNhc2UgTWVtYmVyS2luZC5jbG9zdXJlQ2FsbDoKICAgICAgY2FzZSBNZW1iZXJLaW5kLmNsb3N1cmVGaWVsZDoKICAgICAgY2FzZSBNZW1iZXJLaW5kLnNpZ25hdHVyZToKICAgICAgY2FzZSBNZW1iZXJLaW5kLmdlbmVyYXRvckJvZHk6CiAgICAgICAgcmV0dXJuIGdldFBhcmVudE1lbWJlcihkZWZpbml0aW9uLm5vZGUpOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1VuZXhwZWN0ZWQgbWVtYmVyIGtpbmQgJHtkZWZpbml0aW9ufScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NEZWZpbml0aW9uIGdldENsYXNzRGVmaW5pdGlvbihDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBnZXRDbGFzc0RlZmluaXRpb25JbnRlcm5hbChjbHMpOwogIH0KCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBwYXJhbWV0ZXIgb2YgW2Z1bmN0aW9uXSBwcm92aWRpbmcgdGhlIHR5cGUgYW5kIG5hbWUgb2YKICAvLy8gdGhlIHBhcmFtZXRlciBhbmQgdGhlIFtkZWZhdWx0VmFsdWVdIGlmIHRoZSBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuCiAgdm9pZCBmb3JFYWNoUGFyYW1ldGVyKGNvdmFyaWFudCBJbmRleGVkRnVuY3Rpb24gZnVuY3Rpb24sCiAgICAgIHZvaWQgZihEYXJ0VHlwZSB0eXBlLCBTdHJpbmcgbmFtZSwgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0VmFsdWUpLAogICAgICB7Ym9vbCBpc05hdGl2ZTogZmFsc2V9KSB7CiAgICBGdW5jdGlvbkRhdGEgZGF0YSA9IG1lbWJlcnMuZ2V0RGF0YShmdW5jdGlvbik7CiAgICBkYXRhLmZvckVhY2hQYXJhbWV0ZXIodGhpcywgZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlLCBmLAogICAgICAgIGlzTmF0aXZlOiBpc05hdGl2ZSk7CiAgfQoKICB2b2lkIGZvckVhY2hDb25zdHJ1Y3RvckJvZHkoCiAgICAgIEluZGV4ZWRDbGFzcyBjbHMsIHZvaWQgZihDb25zdHJ1Y3RvckJvZHlFbnRpdHkgbWVtYmVyKSkgewogICAgSkNsYXNzRW52IGVudiA9IGNsYXNzZXMuZ2V0RW52KGNscyk7CiAgICBlbnYuZm9yRWFjaENvbnN0cnVjdG9yQm9keShmKTsKICB9CgogIHZvaWQgZm9yRWFjaEluamVjdGVkQ2xhc3NNZW1iZXIoCiAgICAgIEluZGV4ZWRDbGFzcyBjbHMsIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgX2luamVjdGVkQ2xhc3NNZW1iZXJzW2Nsc10/LmZvckVhY2goZik7CiAgfQoKICBKUmVjb3JkRmllbGQgX2NvbnN0cnVjdFJlY29yZEZpZWxkRW50cnkoCiAgICAgIEludGVyZmFjZVR5cGUgbWVtYmVyVGhpc1R5cGUsCiAgICAgIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsCiAgICAgIEJveExvY2FsIGJveExvY2FsLAogICAgICBNYXA8U3RyaW5nLCBNZW1iZXJFbnRpdHk+IG1lbWJlck1hcCwKICAgICAgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwKSB7CiAgICBMb2NhbCBsb2NhbCA9IGxvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKHZhcmlhYmxlKTsKICAgIEpSZWNvcmRGaWVsZCBib3hlZEZpZWxkID0KICAgICAgICBuZXcgSlJlY29yZEZpZWxkKGxvY2FsLm5hbWUsIGJveExvY2FsLCBpc0NvbnN0OiB2YXJpYWJsZS5pc0NvbnN0KTsKICAgIG1lbWJlcnMucmVnaXN0ZXIoCiAgICAgICAgYm94ZWRGaWVsZCwKICAgICAgICBuZXcgQ2xvc3VyZUZpZWxkRGF0YSgKICAgICAgICAgICAgbmV3IENsb3N1cmVNZW1iZXJEZWZpbml0aW9uKGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKHZhcmlhYmxlKSwKICAgICAgICAgICAgICAgIE1lbWJlcktpbmQuY2xvc3VyZUZpZWxkLCB2YXJpYWJsZSksCiAgICAgICAgICAgIG1lbWJlclRoaXNUeXBlKSk7CiAgICBtZW1iZXJNYXBbYm94ZWRGaWVsZC5uYW1lXSA9IGJveGVkRmllbGQ7CgogICAgcmV0dXJuIGJveGVkRmllbGQ7CiAgfQoKICAvLy8gTWFrZSBhIGNvbnRhaW5lciBjb250cm9sbGluZyBhY2Nlc3MgdG8gcmVjb3JkcywgdGhhdCBpcywgdmFyaWFibGVzIHRoYXQKICAvLy8gYXJlIGFjY2Vzc2VkIGluIGRpZmZlcmVudCBzY29wZXMuIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgY29udGFpbmVyCiAgLy8vIGFuZCByZXR1cm5zIGEgbWFwIG9mIGxvY2FscyB0byB0aGUgY29ycmVzcG9uZGluZyByZWNvcmRzIGNyZWF0ZWQuCiAgQG92ZXJyaWRlCiAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IG1ha2VSZWNvcmRDb250YWluZXIoCiAgICAgIEtlcm5lbFNjb3BlSW5mbyBpbmZvLCBNZW1iZXJFbnRpdHkgbWVtYmVyLCBLZXJuZWxUb0xvY2Fsc01hcCBsb2NhbHNNYXApIHsKICAgIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiBib3hlZEZpZWxkcyA9IHt9OwogICAgaWYgKGluZm8uYm94ZWRWYXJpYWJsZXMuaXNOb3RFbXB0eSkgewogICAgICBOb2RlQm94IGJveCA9IGluZm8uY2FwdHVyZWRWYXJpYWJsZXNBY2Nlc3NvcjsKCiAgICAgIE1hcDxTdHJpbmcsIEluZGV4ZWRNZW1iZXI+IG1lbWJlck1hcCA9IDxTdHJpbmcsIEluZGV4ZWRNZW1iZXI+e307CiAgICAgIEpSZWNvcmQgY29udGFpbmVyID0gbmV3IEpSZWNvcmQobWVtYmVyLmxpYnJhcnksIGJveC5uYW1lKTsKICAgICAgQm94TG9jYWwgYm94TG9jYWwgPSBuZXcgQm94TG9jYWwoY29udGFpbmVyKTsKICAgICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9IG5ldyBJbnRlcmZhY2VUeXBlKGNvbnRhaW5lciwgY29uc3QgPERhcnRUeXBlPltdKTsKICAgICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUgPSBjb21tb25FbGVtZW50cy5vYmplY3RUeXBlOwogICAgICBKQ2xhc3NEYXRhIGNvbnRhaW5lckRhdGEgPSBuZXcgUmVjb3JkQ2xhc3NEYXRhKAogICAgICAgICAgbmV3IFJlY29yZENvbnRhaW5lckRlZmluaXRpb24oZ2V0TWVtYmVyRGVmaW5pdGlvbihtZW1iZXIpLmxvY2F0aW9uKSwKICAgICAgICAgIHRoaXNUeXBlLAogICAgICAgICAgc3VwZXJ0eXBlLAogICAgICAgICAgZ2V0T3JkZXJlZFR5cGVTZXQoc3VwZXJ0eXBlLmVsZW1lbnQpLmV4dGVuZENsYXNzKHRoaXNUeXBlKSk7CiAgICAgIGNsYXNzZXMucmVnaXN0ZXIoY29udGFpbmVyLCBjb250YWluZXJEYXRhLCBuZXcgUmVjb3JkRW52KG1lbWJlck1hcCkpOwoKICAgICAgSW50ZXJmYWNlVHlwZSBtZW1iZXJUaGlzVHlwZSA9IG1lbWJlci5lbmNsb3NpbmdDbGFzcyAhPSBudWxsCiAgICAgICAgICA/IGVsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZShtZW1iZXIuZW5jbG9zaW5nQ2xhc3MpCiAgICAgICAgICA6IG51bGw7CiAgICAgIGZvciAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSBpbiBpbmZvLmJveGVkVmFyaWFibGVzKSB7CiAgICAgICAgYm94ZWRGaWVsZHNbbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUodmFyaWFibGUpXSA9CiAgICAgICAgICAgIF9jb25zdHJ1Y3RSZWNvcmRGaWVsZEVudHJ5KAogICAgICAgICAgICAgICAgbWVtYmVyVGhpc1R5cGUsIHZhcmlhYmxlLCBib3hMb2NhbCwgbWVtYmVyTWFwLCBsb2NhbHNNYXApOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYm94ZWRGaWVsZHM7CiAgfQoKICBib29sIF9pc0luUmVjb3JkKAogICAgICAgICAgTG9jYWwgbG9jYWwsIE1hcDxMb2NhbCwgSlJlY29yZEZpZWxkPiByZWNvcmRGaWVsZHNWaXNpYmxlSW5TY29wZSkgPT4KICAgICAgcmVjb3JkRmllbGRzVmlzaWJsZUluU2NvcGUuY29udGFpbnNLZXkobG9jYWwpOwoKICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgX2dldFBhcmFtZXRlclN0cnVjdHVyZUZyb21GdW5jdGlvbk5vZGUoCiAgICAgIGlyLkZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJzID0gbm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50OwogICAgaW50IHBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7CiAgICBpbnQgdHlwZVBhcmFtZXRlcnMgPSBub2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKICAgIExpc3Q8U3RyaW5nPiBuYW1lZFBhcmFtZXRlcnMgPQogICAgICAgIG5vZGUubmFtZWRQYXJhbWV0ZXJzLm1hcCgocCkgPT4gcC5uYW1lKS50b0xpc3QoKS4uc29ydCgpOwogICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmUocmVxdWlyZWRQYXJhbWV0ZXJzLCBwb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgICBuYW1lZFBhcmFtZXRlcnMsIHR5cGVQYXJhbWV0ZXJzKTsKICB9CgogIEtlcm5lbENsb3N1cmVDbGFzc0luZm8gY29uc3RydWN0Q2xvc3VyZUNsYXNzKAogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyLAogICAgICBpci5GdW5jdGlvbk5vZGUgbm9kZSwKICAgICAgSkxpYnJhcnkgZW5jbG9zaW5nTGlicmFyeSwKICAgICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IHJlY29yZEZpZWxkc1Zpc2libGVJblNjb3BlLAogICAgICBLZXJuZWxTY29wZUluZm8gaW5mbywKICAgICAgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwLAogICAgICBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSwKICAgICAge2Jvb2wgY3JlYXRlU2lnbmF0dXJlTWV0aG9kfSkgewogICAgSW50ZXJmYWNlVHlwZSBtZW1iZXJUaGlzVHlwZSA9IG1lbWJlci5lbmNsb3NpbmdDbGFzcyAhPSBudWxsCiAgICAgICAgPyBlbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUobWVtYmVyLmVuY2xvc2luZ0NsYXNzKQogICAgICAgIDogbnVsbDsKICAgIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIHR5cGVWYXJpYWJsZUFjY2VzcyA9CiAgICAgICAgbWVtYmVycy5nZXREYXRhKG1lbWJlcikuY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3M7CiAgICBpZiAodHlwZVZhcmlhYmxlQWNjZXNzID09IENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzLmluc3RhbmNlRmllbGQpIHsKICAgICAgLy8gQSBjbG9zdXJlIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIgd2lsbCBvbmx5IGJlIGV4ZWN1dGVkIGluIHRoZQogICAgICAvLyBjb25zdHJ1Y3RvciBhbmQgdHlwZSB2YXJpYWJsZXMgYXJlIHRoZXJlZm9yZSBhY2Nlc3NlZCB0aHJvdWdoCiAgICAgIC8vIHBhcmFtZXRlcnMuCiAgICAgIHR5cGVWYXJpYWJsZUFjY2VzcyA9IENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzLnBhcmFtZXRlcjsKICAgIH0KICAgIFN0cmluZyBuYW1lID0gX2NvbXB1dGVDbG9zdXJlTmFtZShub2RlKTsKICAgIFNvdXJjZVNwYW4gbG9jYXRpb24gPSBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShub2RlKTsKICAgIE1hcDxTdHJpbmcsIEluZGV4ZWRNZW1iZXI+IG1lbWJlck1hcCA9IDxTdHJpbmcsIEluZGV4ZWRNZW1iZXI+e307CgogICAgSkNsYXNzIGNsYXNzRW50aXR5ID0gbmV3IEpDbG9zdXJlQ2xhc3MoZW5jbG9zaW5nTGlicmFyeSwgbmFtZSk7CiAgICAvLyBDcmVhdGUgYSBjbGFzc0RhdGEgYW5kIHNldCB1cCB0aGUgaW50ZXJmYWNlcyBhbmQgc3ViY2xhc3MKICAgIC8vIHJlbGF0aW9uc2hpcHMgdGhhdCBfZW5zdXJlU3VwZXJ0eXBlcyBhbmQgX2Vuc3VyZVRoaXNBbmRSYXdUeXBlIGFyZSBkb2luZwogICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9IG5ldyBJbnRlcmZhY2VUeXBlKGNsYXNzRW50aXR5LCBjb25zdCA8RGFydFR5cGU+W10pOwogICAgQ2xvc3VyZUNsYXNzRGF0YSBjbG9zdXJlRGF0YSA9IG5ldyBDbG9zdXJlQ2xhc3NEYXRhKAogICAgICAgIG5ldyBDbG9zdXJlQ2xhc3NEZWZpbml0aW9uKGxvY2F0aW9uKSwKICAgICAgICB0aGlzVHlwZSwKICAgICAgICBzdXBlcnR5cGUsCiAgICAgICAgZ2V0T3JkZXJlZFR5cGVTZXQoc3VwZXJ0eXBlLmVsZW1lbnQpLmV4dGVuZENsYXNzKHRoaXNUeXBlKSk7CiAgICBjbGFzc2VzLnJlZ2lzdGVyKGNsYXNzRW50aXR5LCBjbG9zdXJlRGF0YSwgbmV3IENsb3N1cmVDbGFzc0VudihtZW1iZXJNYXApKTsKCiAgICBMb2NhbCBjbG9zdXJlRW50aXR5OwogICAgaWYgKG5vZGUucGFyZW50IGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiBwYXJlbnQgPSBub2RlLnBhcmVudDsKICAgICAgY2xvc3VyZUVudGl0eSA9IGxvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKHBhcmVudC52YXJpYWJsZSk7CiAgICB9IGVsc2UgaWYgKG5vZGUucGFyZW50IGlzIGlyLkZ1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICBjbG9zdXJlRW50aXR5ID0gbmV3IEFub255bW91c0Nsb3N1cmVMb2NhbChjbGFzc0VudGl0eSk7CiAgICB9CgogICAgSW5kZXhlZEZ1bmN0aW9uIGNhbGxNZXRob2QgPSBuZXcgSkNsb3N1cmVDYWxsTWV0aG9kKGNsYXNzRW50aXR5LAogICAgICAgIF9nZXRQYXJhbWV0ZXJTdHJ1Y3R1cmVGcm9tRnVuY3Rpb25Ob2RlKG5vZGUpLCBnZXRBc3luY01hcmtlcihub2RlKSk7CiAgICBfbmVzdGVkQ2xvc3VyZU1hcAogICAgICAgIC5wdXRJZkFic2VudChtZW1iZXIsICgpID0+IDxJbmRleGVkRnVuY3Rpb24+W10pCiAgICAgICAgLmFkZChjYWxsTWV0aG9kKTsKICAgIC8vIFdlIG5lZWQgY3JlYXRlIHRoZSB0eXBlIHZhcmlhYmxlIGhlcmUgLSBiZWZvcmUgd2UgdHJ5IHRvIG1ha2UgbG9jYWwKICAgIC8vIHZhcmlhYmxlcyBmcm9tIHRoZW0gKGluIGBKc1Njb3BlSW5mby5mcm9tYCBjYWxsZWQgdGhyb3VnaAogICAgLy8gYEtlcm5lbENsb3N1cmVDbGFzc0luZm8uZnJvbVNjb3BlSW5mb2AgYmVsb3cpLgogICAgaW50IGluZGV4ID0gMDsKICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIG5vZGUudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgdHlwZVZhcmlhYmxlTWFwW3R5cGVQYXJhbWV0ZXJdID0gdHlwZVZhcmlhYmxlcy5yZWdpc3RlcigKICAgICAgICAgIGNyZWF0ZVR5cGVWYXJpYWJsZShjYWxsTWV0aG9kLCB0eXBlUGFyYW1ldGVyLm5hbWUsIGluZGV4KSwKICAgICAgICAgIG5ldyBKVHlwZVZhcmlhYmxlRGF0YSh0eXBlUGFyYW1ldGVyKSk7CiAgICAgIGluZGV4Kys7CiAgICB9CgogICAgS2VybmVsQ2xvc3VyZUNsYXNzSW5mbyBjbG9zdXJlQ2xhc3NJbmZvID0KICAgICAgICBuZXcgS2VybmVsQ2xvc3VyZUNsYXNzSW5mby5mcm9tU2NvcGVJbmZvKAogICAgICAgICAgICBjbGFzc0VudGl0eSwKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgPExvY2FsLCBKUmVjb3JkRmllbGQ+e30sCiAgICAgICAgICAgIGluZm8sCiAgICAgICAgICAgIGxvY2Fsc01hcCwKICAgICAgICAgICAgY2xvc3VyZUVudGl0eSwKICAgICAgICAgICAgaW5mby5oYXNUaGlzTG9jYWwKICAgICAgICAgICAgICAgID8gbmV3IFRoaXNMb2NhbChsb2NhbHNNYXAuY3VycmVudE1lbWJlci5lbmNsb3NpbmdDbGFzcykKICAgICAgICAgICAgICAgIDogbnVsbCwKICAgICAgICAgICAgdGhpcyk7CiAgICBfYnVpbGRDbG9zdXJlQ2xhc3NGaWVsZHMoY2xvc3VyZUNsYXNzSW5mbywgbWVtYmVyLCBtZW1iZXJUaGlzVHlwZSwgaW5mbywKICAgICAgICBsb2NhbHNNYXAsIHJlY29yZEZpZWxkc1Zpc2libGVJblNjb3BlLCBtZW1iZXJNYXApOwoKICAgIGlmIChjcmVhdGVTaWduYXR1cmVNZXRob2QpIHsKICAgICAgX2NvbnN0cnVjdFNpZ25hdHVyZU1ldGhvZChjbG9zdXJlQ2xhc3NJbmZvLCBtZW1iZXJNYXAsIG5vZGUsCiAgICAgICAgICBtZW1iZXJUaGlzVHlwZSwgbG9jYXRpb24sIHR5cGVWYXJpYWJsZUFjY2Vzcyk7CiAgICB9CgogICAgY2xvc3VyZURhdGEuY2FsbFR5cGUgPSBnZXRGdW5jdGlvblR5cGUobm9kZSk7CgogICAgbWVtYmVycy5yZWdpc3RlcjxJbmRleGVkRnVuY3Rpb24sIEZ1bmN0aW9uRGF0YT4oCiAgICAgICAgY2FsbE1ldGhvZCwKICAgICAgICBuZXcgQ2xvc3VyZUZ1bmN0aW9uRGF0YSgKICAgICAgICAgICAgbmV3IENsb3N1cmVNZW1iZXJEZWZpbml0aW9uKAogICAgICAgICAgICAgICAgbG9jYXRpb24sIE1lbWJlcktpbmQuY2xvc3VyZUNhbGwsIG5vZGUucGFyZW50KSwKICAgICAgICAgICAgbWVtYmVyVGhpc1R5cGUsCiAgICAgICAgICAgIGNsb3N1cmVEYXRhLmNhbGxUeXBlLAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICB0eXBlVmFyaWFibGVBY2Nlc3MpKTsKICAgIG1lbWJlck1hcFtjYWxsTWV0aG9kLm5hbWVdID0gY2xvc3VyZUNsYXNzSW5mby5jYWxsTWV0aG9kID0gY2FsbE1ldGhvZDsKICAgIHJldHVybiBjbG9zdXJlQ2xhc3NJbmZvOwogIH0KCiAgdm9pZCBfYnVpbGRDbG9zdXJlQ2xhc3NGaWVsZHMoCiAgICAgIEtlcm5lbENsb3N1cmVDbGFzc0luZm8gY2xvc3VyZUNsYXNzSW5mbywKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwKICAgICAgSW50ZXJmYWNlVHlwZSBtZW1iZXJUaGlzVHlwZSwKICAgICAgS2VybmVsU2NvcGVJbmZvIGluZm8sCiAgICAgIEtlcm5lbFRvTG9jYWxzTWFwIGxvY2Fsc01hcCwKICAgICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IHJlY29yZEZpZWxkc1Zpc2libGVJblNjb3BlLAogICAgICBNYXA8U3RyaW5nLCBNZW1iZXJFbnRpdHk+IG1lbWJlck1hcCkgewogICAgLy8gVE9ETyhlZm9ydHVuYSk6IExpbWl0IGZpZWxkIG51bWJlciB1c2FnZSB0byB3aGVuIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2gKICAgIC8vIGJldHdlZW4gdHdvIHZhcmlhYmxlcyB3aXRoIHRoZSBzYW1lIG5hbWUgZnJvbSBkaWZmZXJlbnQgc2NvcGVzLgogICAgaW50IGZpZWxkTnVtYmVyID0gMDsKCiAgICAvLyBGb3IgdGhlIGNhcHR1cmVkIHZhcmlhYmxlcyB0aGF0IGFyZSBib3hlZCwgZW5zdXJlIHRoaXMgY2xvc3VyZSBoYXMgYQogICAgLy8gZmllbGQgdG8gcmVmZXJlbmNlIHRoZSBib3guIFRoaXMgcHV0cyB0aGUgYm94ZXMgZmlyc3QgaW4gdGhlIGNsb3N1cmUgbGlrZQogICAgLy8gdGhlIEFTVCBmcm9udC1lbmQsIGJ1dCBvdGhlcndpc2UgdGhlcmUgaXMgbm8gcmVhc29uIHRvIHNlcGFyYXRlIHRoaXMgbG9vcAogICAgLy8gZnJvbSB0aGUgb25lIGJlbG93LgogICAgLy8gVE9ETyhyZWRlbXB0aW9uKTogTWVyZ2UgdGhpcyBsb29wIGFuZCB0aGUgZm9sbG93aW5nLgoKICAgIGZvciAoaXIuTm9kZSB2YXJpYWJsZSBpbiBpbmZvLmZyZWVWYXJpYWJsZXMpIHsKICAgICAgaWYgKHZhcmlhYmxlIGlzIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgICBMb2NhbCBjYXB0dXJlZExvY2FsID0gbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUodmFyaWFibGUpOwogICAgICAgIGlmIChfaXNJblJlY29yZChjYXB0dXJlZExvY2FsLCByZWNvcmRGaWVsZHNWaXNpYmxlSW5TY29wZSkpIHsKICAgICAgICAgIGJvb2wgY29uc3RydWN0ZWRGaWVsZCA9IF9jb25zdHJ1Y3RDbG9zdXJlRmllbGRGb3JSZWNvcmQoCiAgICAgICAgICAgICAgY2FwdHVyZWRMb2NhbCwKICAgICAgICAgICAgICBjbG9zdXJlQ2xhc3NJbmZvLAogICAgICAgICAgICAgIG1lbWJlclRoaXNUeXBlLAogICAgICAgICAgICAgIG1lbWJlck1hcCwKICAgICAgICAgICAgICB2YXJpYWJsZSwKICAgICAgICAgICAgICByZWNvcmRGaWVsZHNWaXNpYmxlSW5TY29wZSwKICAgICAgICAgICAgICBmaWVsZE51bWJlcik7CiAgICAgICAgICBpZiAoY29uc3RydWN0ZWRGaWVsZCkgZmllbGROdW1iZXIrKzsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBBZGQgYSBmaWVsZCBmb3IgdGhlIGNhcHR1cmVkICd0aGlzJy4KICAgIGlmIChpbmZvLnRoaXNVc2VkQXNGcmVlVmFyaWFibGUpIHsKICAgICAgX2NvbnN0cnVjdENsb3N1cmVGaWVsZCgKICAgICAgICAgIGNsb3N1cmVDbGFzc0luZm8udGhpc0xvY2FsLAogICAgICAgICAgY2xvc3VyZUNsYXNzSW5mbywKICAgICAgICAgIG1lbWJlclRoaXNUeXBlLAogICAgICAgICAgbWVtYmVyTWFwLAogICAgICAgICAgZ2V0Q2xhc3NEZWZpbml0aW9uKG1lbWJlci5lbmNsb3NpbmdDbGFzcykubm9kZSwKICAgICAgICAgIHRydWUsCiAgICAgICAgICBmYWxzZSwKICAgICAgICAgIGZpZWxkTnVtYmVyKTsKICAgICAgZmllbGROdW1iZXIrKzsKICAgIH0KCiAgICBmb3IgKGlyLk5vZGUgdmFyaWFibGUgaW4gaW5mby5mcmVlVmFyaWFibGVzKSB7CiAgICAgIC8vIE1ha2UgYSBjb3JyZXNwb25kaW5nIGZpZWxkIGVudGl0eSBpbiB0aGlzIGNsb3N1cmUgY2xhc3MgZm9yIHRoZQogICAgICAvLyBmcmVlIHZhcmlhYmxlcyBpbiB0aGUgS2VybmVsU2NvcGVJbmZvLmZyZWVWYXJpYWJsZS4KICAgICAgaWYgKHZhcmlhYmxlIGlzIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgICBMb2NhbCBjYXB0dXJlZExvY2FsID0gbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUodmFyaWFibGUpOwogICAgICAgIGlmICghX2lzSW5SZWNvcmQoY2FwdHVyZWRMb2NhbCwgcmVjb3JkRmllbGRzVmlzaWJsZUluU2NvcGUpKSB7CiAgICAgICAgICBfY29uc3RydWN0Q2xvc3VyZUZpZWxkKAogICAgICAgICAgICAgIGNhcHR1cmVkTG9jYWwsCiAgICAgICAgICAgICAgY2xvc3VyZUNsYXNzSW5mbywKICAgICAgICAgICAgICBtZW1iZXJUaGlzVHlwZSwKICAgICAgICAgICAgICBtZW1iZXJNYXAsCiAgICAgICAgICAgICAgdmFyaWFibGUsCiAgICAgICAgICAgICAgdmFyaWFibGUuaXNDb25zdCwKICAgICAgICAgICAgICBmYWxzZSwgLy8gQ2xvc3VyZSBmaWVsZCBpcyBuZXZlciBhc3NpZ25lZCAob25seSBib3ggZmllbGRzKS4KICAgICAgICAgICAgICBmaWVsZE51bWJlcik7CiAgICAgICAgICBmaWVsZE51bWJlcisrOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh2YXJpYWJsZSBpcyBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQpIHsKICAgICAgICBfY29uc3RydWN0Q2xvc3VyZUZpZWxkKAogICAgICAgICAgICBsb2NhbHNNYXAuZ2V0TG9jYWxUeXBlVmFyaWFibGUodmFyaWFibGUudHlwZSwgdGhpcyksCiAgICAgICAgICAgIGNsb3N1cmVDbGFzc0luZm8sCiAgICAgICAgICAgIG1lbWJlclRoaXNUeXBlLAogICAgICAgICAgICBtZW1iZXJNYXAsCiAgICAgICAgICAgIHZhcmlhYmxlLnR5cGUucGFyYW1ldGVyLAogICAgICAgICAgICB0cnVlLAogICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgZmllbGROdW1iZXIpOwogICAgICAgIGZpZWxkTnVtYmVyKys7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuZXhwZWN0ZWQgZmllbGQgbm9kZSB0eXBlOiAkdmFyaWFibGUiKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIFJlY29yZHMgcG9pbnQgdG8gb25lIG9yIG1vcmUgbG9jYWwgdmFyaWFibGVzIGRlY2xhcmVkIGluIGFub3RoZXIgc2NvcGUKICAvLy8gdGhhdCBhcmUgY2FwdHVyZWQgaW4gYSBzY29wZS4gQWNjZXNzIHRvIHRob3NlIHZhcmlhYmxlcyBnb2VzIGVudGlyZWx5CiAgLy8vIHRocm91Z2ggdGhlIHJlY29yZCBjb250YWluZXIsIHNvIHdlIG9ubHkgY3JlYXRlIGEgZmllbGQgZm9yIHRoZSAqcmVjb3JkKgogIC8vLyBob2xkaW5nIFtjYXB0dXJlZExvY2FsXSBhbmQgbm90IHRoZSBpbmRpdmlkdWFsIGxvY2FsIHZhcmlhYmxlcyBhY2Nlc3NlZAogIC8vLyB0aHJvdWdoIHRoZSByZWNvcmQuIFJlY29yZHMsIGJ5IGRlZmluaXRpb24sIGFyZSBub3QgbXV0YWJsZSAodGhvdWdoIHRoZQogIC8vLyBsb2NhbHMgdGhleSBjb250YWluIG1heSBiZSkuIFJldHVybnMgYHRydWVgIGlmIHdlIGNvbnN0cnVjdGVkIGEgbmV3IGZpZWxkCiAgLy8vIGluIHRoZSBjbG9zdXJlIGNsYXNzLgogIGJvb2wgX2NvbnN0cnVjdENsb3N1cmVGaWVsZEZvclJlY29yZCgKICAgICAgTG9jYWwgY2FwdHVyZWRMb2NhbCwKICAgICAgS2VybmVsQ2xvc3VyZUNsYXNzSW5mbyBjbG9zdXJlQ2xhc3NJbmZvLAogICAgICBJbnRlcmZhY2VUeXBlIG1lbWJlclRoaXNUeXBlLAogICAgICBNYXA8U3RyaW5nLCBNZW1iZXJFbnRpdHk+IG1lbWJlck1hcCwKICAgICAgaXIuVHJlZU5vZGUgc291cmNlTm9kZSwKICAgICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IHJlY29yZEZpZWxkc1Zpc2libGVJblNjb3BlLAogICAgICBpbnQgZmllbGROdW1iZXIpIHsKICAgIEpSZWNvcmRGaWVsZCByZWNvcmRGaWVsZCA9IHJlY29yZEZpZWxkc1Zpc2libGVJblNjb3BlW2NhcHR1cmVkTG9jYWxdOwoKICAgIC8vIERvbid0IGNvbnN0cnVjdCBhIG5ldyBmaWVsZCBpZiB0aGUgYm94IHRoYXQgaG9sZHMgdGhpcyBsb2NhbCBhbHJlYWR5IGhhcwogICAgLy8gYSBmaWVsZCBpbiB0aGUgY2xvc3VyZSBjbGFzcy4KICAgIGlmIChjbG9zdXJlQ2xhc3NJbmZvLmxvY2FsVG9GaWVsZE1hcC5jb250YWluc0tleShyZWNvcmRGaWVsZC5ib3gpKSB7CiAgICAgIGNsb3N1cmVDbGFzc0luZm8uYm94ZWRWYXJpYWJsZXNbY2FwdHVyZWRMb2NhbF0gPSByZWNvcmRGaWVsZDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIEZpZWxkRW50aXR5IGNsb3N1cmVGaWVsZCA9IG5ldyBKQ2xvc3VyZUZpZWxkKAogICAgICAgICdfYm94XyRmaWVsZE51bWJlcicsIGNsb3N1cmVDbGFzc0luZm8sIHJlY29yZEZpZWxkLmJveC5uYW1lLAogICAgICAgIGlzQ29uc3Q6IHRydWUsIGlzQXNzaWduYWJsZTogZmFsc2UpOwoKICAgIG1lbWJlcnMucmVnaXN0ZXI8SW5kZXhlZEZpZWxkLCBKRmllbGREYXRhPigKICAgICAgICBjbG9zdXJlRmllbGQsCiAgICAgICAgbmV3IENsb3N1cmVGaWVsZERhdGEoCiAgICAgICAgICAgIG5ldyBDbG9zdXJlTWVtYmVyRGVmaW5pdGlvbigKICAgICAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKHNvdXJjZU5vZGUpLAogICAgICAgICAgICAgICAgTWVtYmVyS2luZC5jbG9zdXJlRmllbGQsCiAgICAgICAgICAgICAgICBzb3VyY2VOb2RlKSwKICAgICAgICAgICAgbWVtYmVyVGhpc1R5cGUpKTsKICAgIG1lbWJlck1hcFtjbG9zdXJlRmllbGQubmFtZV0gPSBjbG9zdXJlRmllbGQ7CiAgICBjbG9zdXJlQ2xhc3NJbmZvLmxvY2FsVG9GaWVsZE1hcFtyZWNvcmRGaWVsZC5ib3hdID0gY2xvc3VyZUZpZWxkOwogICAgY2xvc3VyZUNsYXNzSW5mby5ib3hlZFZhcmlhYmxlc1tjYXB0dXJlZExvY2FsXSA9IHJlY29yZEZpZWxkOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICB2b2lkIF9jb25zdHJ1Y3RTaWduYXR1cmVNZXRob2QoCiAgICAgIEtlcm5lbENsb3N1cmVDbGFzc0luZm8gY2xvc3VyZUNsYXNzSW5mbywKICAgICAgTWFwPFN0cmluZywgTWVtYmVyRW50aXR5PiBtZW1iZXJNYXAsCiAgICAgIGlyLkZ1bmN0aW9uTm9kZSBjbG9zdXJlU291cmNlTm9kZSwKICAgICAgSW50ZXJmYWNlVHlwZSBtZW1iZXJUaGlzVHlwZSwKICAgICAgU291cmNlU3BhbiBsb2NhdGlvbiwKICAgICAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgdHlwZVZhcmlhYmxlQWNjZXNzKSB7CiAgICBGdW5jdGlvbkVudGl0eSBzaWduYXR1cmVNZXRob2QgPQogICAgICAgIG5ldyBKU2lnbmF0dXJlTWV0aG9kKGNsb3N1cmVDbGFzc0luZm8uY2xvc3VyZUNsYXNzRW50aXR5KTsKICAgIG1lbWJlcnMucmVnaXN0ZXI8SW5kZXhlZEZ1bmN0aW9uLCBGdW5jdGlvbkRhdGE+KAogICAgICAgIHNpZ25hdHVyZU1ldGhvZCwKICAgICAgICBuZXcgU2lnbmF0dXJlRnVuY3Rpb25EYXRhKAogICAgICAgICAgICBuZXcgU3BlY2lhbE1lbWJlckRlZmluaXRpb24oCiAgICAgICAgICAgICAgICBjbG9zdXJlU291cmNlTm9kZS5wYXJlbnQsIE1lbWJlcktpbmQuc2lnbmF0dXJlKSwKICAgICAgICAgICAgbWVtYmVyVGhpc1R5cGUsCiAgICAgICAgICAgIGNsb3N1cmVTb3VyY2VOb2RlLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgICB0eXBlVmFyaWFibGVBY2Nlc3MpKTsKICAgIG1lbWJlck1hcFtzaWduYXR1cmVNZXRob2QubmFtZV0gPQogICAgICAgIGNsb3N1cmVDbGFzc0luZm8uc2lnbmF0dXJlTWV0aG9kID0gc2lnbmF0dXJlTWV0aG9kOwogIH0KCiAgdm9pZCBfY29uc3RydWN0Q2xvc3VyZUZpZWxkKAogICAgICBMb2NhbCBjYXB0dXJlZExvY2FsLAogICAgICBLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvIGNsb3N1cmVDbGFzc0luZm8sCiAgICAgIEludGVyZmFjZVR5cGUgbWVtYmVyVGhpc1R5cGUsCiAgICAgIE1hcDxTdHJpbmcsIE1lbWJlckVudGl0eT4gbWVtYmVyTWFwLAogICAgICBpci5UcmVlTm9kZSBzb3VyY2VOb2RlLAogICAgICBib29sIGlzQ29uc3QsCiAgICAgIGJvb2wgaXNBc3NpZ25hYmxlLAogICAgICBpbnQgZmllbGROdW1iZXIpIHsKICAgIEZpZWxkRW50aXR5IGNsb3N1cmVGaWVsZCA9IG5ldyBKQ2xvc3VyZUZpZWxkKAogICAgICAgIF9nZXRDbG9zdXJlVmFyaWFibGVOYW1lKGNhcHR1cmVkTG9jYWwubmFtZSwgZmllbGROdW1iZXIpLAogICAgICAgIGNsb3N1cmVDbGFzc0luZm8sCiAgICAgICAgY2FwdHVyZWRMb2NhbC5uYW1lLAogICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QsCiAgICAgICAgaXNBc3NpZ25hYmxlOiBpc0Fzc2lnbmFibGUpOwoKICAgIG1lbWJlcnMucmVnaXN0ZXI8SW5kZXhlZEZpZWxkLCBKRmllbGREYXRhPigKICAgICAgICBjbG9zdXJlRmllbGQsCiAgICAgICAgbmV3IENsb3N1cmVGaWVsZERhdGEoCiAgICAgICAgICAgIG5ldyBDbG9zdXJlTWVtYmVyRGVmaW5pdGlvbigKICAgICAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKHNvdXJjZU5vZGUpLAogICAgICAgICAgICAgICAgTWVtYmVyS2luZC5jbG9zdXJlRmllbGQsCiAgICAgICAgICAgICAgICBzb3VyY2VOb2RlKSwKICAgICAgICAgICAgbWVtYmVyVGhpc1R5cGUpKTsKICAgIG1lbWJlck1hcFtjbG9zdXJlRmllbGQubmFtZV0gPSBjbG9zdXJlRmllbGQ7CiAgICBjbG9zdXJlQ2xhc3NJbmZvLmxvY2FsVG9GaWVsZE1hcFtjYXB0dXJlZExvY2FsXSA9IGNsb3N1cmVGaWVsZDsKICB9CgogIC8vIFJldHVybnMgYSBub24tdW5pcXVlIG5hbWUgZm9yIHRoZSBnaXZlbiBjbG9zdXJlIGVsZW1lbnQuCiAgU3RyaW5nIF9jb21wdXRlQ2xvc3VyZU5hbWUoaXIuVHJlZU5vZGUgdHJlZU5vZGUpIHsKICAgIHZhciBwYXJ0cyA9IDxTdHJpbmc+W107CiAgICAvLyBGaXJzdCBhbm9ueW1vdXMgaXMgY2FsbGVkICdjbG9zdXJlJywgb3V0ZXIgb25lcyBjYWxsZWQgJycgdG8gZ2l2ZSBhCiAgICAvLyBjb21wb3VuZCBuYW1lIHdoZXJlIGluY3JlYXNpbmcgbmVzdGluZyBsZXZlbCBjb3JyZXNwb25kcyB0byBleHRyYQogICAgLy8gdW5kZXJzY29yZXMuCiAgICB2YXIgYW5vbnltb3VzID0gJ2Nsb3N1cmUnOwogICAgaXIuVHJlZU5vZGUgY3VycmVudCA9IHRyZWVOb2RlOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2ltcGxpZnkgY29tcHV0ZWQgbmFtZXMuCiAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CiAgICAgIHZhciBub2RlID0gY3VycmVudDsKICAgICAgaWYgKG5vZGUgaXMgaXIuRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgICAgcGFydHMuYWRkKGFub255bW91cyk7CiAgICAgICAgYW5vbnltb3VzID0gJyc7CiAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5GdW5jdGlvbkRlY2xhcmF0aW9uKSB7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBub2RlLnZhcmlhYmxlLm5hbWU7CiAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lICE9ICIiKSB7CiAgICAgICAgICBwYXJ0cy5hZGQodXRpbHMub3BlcmF0b3JOYW1lVG9JZGVudGlmaWVyKG5hbWUpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcGFydHMuYWRkKGFub255bW91cyk7CiAgICAgICAgICBhbm9ueW1vdXMgPSAnJzsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5DbGFzcykgewogICAgICAgIC8vIFRPRE8oc3JhKTogRG8gc29tZXRoaW5nIHdpdGggYWJzdHJhY3RlZCBtaXhpbiB0eXBlIG5hbWVzIGxpa2UgJ14jVTAnLgogICAgICAgIHBhcnRzLmFkZChub2RlLm5hbWUpOwogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgICAgaWYgKG5vZGUua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLkZhY3RvcnkpIHsKICAgICAgICAgIHBhcnRzLmFkZCh1dGlscy5yZWNvbnN0cnVjdENvbnN0cnVjdG9yTmFtZShnZXRNZW1iZXIobm9kZSkpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcGFydHMuYWRkKHV0aWxzLm9wZXJhdG9yTmFtZVRvSWRlbnRpZmllcihub2RlLm5hbWUubmFtZSkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgICAgcGFydHMuYWRkKHV0aWxzLnJlY29uc3RydWN0Q29uc3RydWN0b3JOYW1lKGdldE1lbWJlcihub2RlKSkpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDsKICAgIH0KICAgIHJldHVybiBwYXJ0cy5yZXZlcnNlZC5qb2luKCdfJyk7CiAgfQoKICAvLy8gR2VuZXJhdGUgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIFtpZF10aCBjbG9zdXJlIGZpZWxkLCB3aXRoIHByb3Bvc2VkIG5hbWUKICAvLy8gW25hbWVdLgogIC8vLwogIC8vLyBUaGUgcmVzdWx0IGlzIHVzZWQgYXMgdGhlIG5hbWUgb2YgW0Nsb3N1cmVGaWVsZEVsZW1lbnRdcywgYW5kIG11c3QKICAvLy8gdGhlcmVmb3JlIGJlIHVuaXF1ZSB0byBhdm9pZCBicmVha2luZyBhbiBpbnZhcmlhbnQgaW4gdGhlIGVsZW1lbnQgbW9kZWwKICAvLy8gKGNsYXNzZXMgY2Fubm90IGRlY2xhcmUgbXVsdGlwbGUgZmllbGRzIHdpdGggdGhlIHNhbWUgbmFtZSkuCiAgLy8vCiAgLy8vIEFsc28sIHRoZSBuYW1lcyBzaG91bGQgYmUgZGlzdGluY3QgZnJvbSByZWFsIGZpZWxkIG5hbWVzIHRvIHByZXZlbnQKICAvLy8gY2xhc2hlcyB3aXRoIHNlbGVjdG9ycyBmb3IgdGhvc2UgZmllbGRzLgogIC8vLwogIC8vLyBUaGVzZSBuYW1lcyBhcmUgbm90IHVzZWQgaW4gZ2VuZXJhdGVkIGNvZGUsIGp1c3QgYXMgZWxlbWVudCBuYW1lLgogIFN0cmluZyBfZ2V0Q2xvc3VyZVZhcmlhYmxlTmFtZShTdHJpbmcgbmFtZSwgaW50IGlkKSB7CiAgICByZXR1cm4gIl9jYXB0dXJlZF8ke25hbWV9XyRpZCI7CiAgfQoKICBAb3ZlcnJpZGUKICBKR2VuZXJhdG9yQm9keSBnZXRHZW5lcmF0b3JCb2R5KGNvdmFyaWFudCBJbmRleGVkRnVuY3Rpb24gZnVuY3Rpb24pIHsKICAgIEpHZW5lcmF0b3JCb2R5IGdlbmVyYXRvckJvZHkgPSBfZ2VuZXJhdG9yQm9kaWVzW2Z1bmN0aW9uXTsKICAgIGlmIChnZW5lcmF0b3JCb2R5ID09IG51bGwpIHsKICAgICAgRnVuY3Rpb25EYXRhIGZ1bmN0aW9uRGF0YSA9IG1lbWJlcnMuZ2V0RGF0YShmdW5jdGlvbik7CiAgICAgIGlyLlRyZWVOb2RlIG5vZGUgPSBmdW5jdGlvbkRhdGEuZGVmaW5pdGlvbi5ub2RlOwogICAgICBEYXJ0VHlwZSBlbGVtZW50VHlwZSA9CiAgICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25Bc3luY09yU3luY1N0YXJFbGVtZW50VHlwZShmdW5jdGlvbik7CiAgICAgIGdlbmVyYXRvckJvZHkgPSBjcmVhdGVHZW5lcmF0b3JCb2R5KGZ1bmN0aW9uLCBlbGVtZW50VHlwZSk7CiAgICAgIG1lbWJlcnMucmVnaXN0ZXI8SW5kZXhlZEZ1bmN0aW9uLCBGdW5jdGlvbkRhdGE+KAogICAgICAgICAgZ2VuZXJhdG9yQm9keSwKICAgICAgICAgIG5ldyBHZW5lcmF0b3JCb2R5RnVuY3Rpb25EYXRhKGZ1bmN0aW9uRGF0YSwKICAgICAgICAgICAgICBuZXcgU3BlY2lhbE1lbWJlckRlZmluaXRpb24obm9kZSwgTWVtYmVyS2luZC5nZW5lcmF0b3JCb2R5KSkpOwoKICAgICAgaWYgKGZ1bmN0aW9uLmVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgICAgICAvLyBUT0RPKHNyYSk6IEludGVncmF0ZSB0aGlzIHdpdGggQ2xhc3NFbnZJbXBsLmFkZENvbnN0cnVjdG9yQm9keSA/CiAgICAgICAgKF9pbmplY3RlZENsYXNzTWVtYmVyc1tmdW5jdGlvbi5lbmNsb3NpbmdDbGFzc10gPz89IDxJbmRleGVkTWVtYmVyPltdKQogICAgICAgICAgICAuYWRkKGdlbmVyYXRvckJvZHkpOwogICAgICB9CiAgICAgIGxhdGVPdXRwdXRVbml0RGF0YUJ1aWxkZXIucmVnaXN0ZXJDb2xvY2F0ZWRNZW1iZXJzKAogICAgICAgICAgZ2VuZXJhdG9yQm9keS5mdW5jdGlvbiwgZ2VuZXJhdG9yQm9keSk7CiAgICAgIF9nZW5lcmF0b3JCb2RpZXNbZnVuY3Rpb25dID0gZ2VuZXJhdG9yQm9keTsKICAgIH0KICAgIHJldHVybiBnZW5lcmF0b3JCb2R5OwogIH0KfQoKY2xhc3MgSnNFbGVtZW50RW52aXJvbm1lbnQgZXh0ZW5kcyBFbGVtZW50RW52aXJvbm1lbnQKICAgIGltcGxlbWVudHMgSkVsZW1lbnRFbnZpcm9ubWVudCB7CiAgZmluYWwgSnNLZXJuZWxUb0VsZW1lbnRNYXAgZWxlbWVudE1hcDsKCiAgSnNFbGVtZW50RW52aXJvbm1lbnQodGhpcy5lbGVtZW50TWFwKTsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0IGR5bmFtaWNUeXBlID0+IGNvbnN0IER5bmFtaWNUeXBlKCk7CgogIEBvdmVycmlkZQogIExpYnJhcnlFbnRpdHkgZ2V0IG1haW5MaWJyYXJ5ID0+IGVsZW1lbnRNYXAuX21haW5MaWJyYXJ5OwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvbkVudGl0eSBnZXQgbWFpbkZ1bmN0aW9uID0+IGVsZW1lbnRNYXAuX21haW5GdW5jdGlvbjsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8TGlicmFyeUVudGl0eT4gZ2V0IGxpYnJhcmllcyA9PiBlbGVtZW50TWFwLmxpYnJhcnlMaXN0SW50ZXJuYWw7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXRMaWJyYXJ5TmFtZShMaWJyYXJ5RW50aXR5IGxpYnJhcnkpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9nZXRMaWJyYXJ5TmFtZShsaWJyYXJ5KTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0VGhpc1R5cGUoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRUaGlzVHlwZShjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRSYXdUeXBlKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuX2dldFJhd1R5cGUoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNHZW5lcmljQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZ2V0VGhpc1R5cGUoY2xzKS50eXBlQXJndW1lbnRzLmlzTm90RW1wdHk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzTWl4aW5BcHBsaWNhdGlvbihDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9pc01peGluQXBwbGljYXRpb24oY2xzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbihDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9pc1VubmFtZWRNaXhpbkFwcGxpY2F0aW9uKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuX2lzU3VwZXJNaXhpbkFwcGxpY2F0aW9uKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXRFZmZlY3RpdmVNaXhpbkNsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgaWYgKCFpc01peGluQXBwbGljYXRpb24oY2xzKSkgcmV0dXJuIG51bGw7CiAgICBkbyB7CiAgICAgIGNscyA9IGVsZW1lbnRNYXAuZ2V0QXBwbGllZE1peGluKGNscyk7CiAgICB9IHdoaWxlIChpc01peGluQXBwbGljYXRpb24oY2xzKSk7CiAgICByZXR1cm4gY2xzOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0VHlwZVZhcmlhYmxlQm91bmQoVHlwZVZhcmlhYmxlRW50aXR5IHR5cGVWYXJpYWJsZSkgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0VHlwZVZhcmlhYmxlQm91bmQodHlwZVZhcmlhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGVWYXJpYWJsZURlZmF1bHRUeXBlKFR5cGVWYXJpYWJsZUVudGl0eSB0eXBlVmFyaWFibGUpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9nZXRUeXBlVmFyaWFibGVEZWZhdWx0VHlwZSh0eXBlVmFyaWFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBjcmVhdGVJbnRlcmZhY2VUeXBlKAogICAgICBDbGFzc0VudGl0eSBjbHMsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShjbHMsIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25UeXBlIGdldEZ1bmN0aW9uVHlwZShGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuX2dldEZ1bmN0aW9uVHlwZShmdW5jdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PFR5cGVWYXJpYWJsZVR5cGU+IGdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuX2dldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhmdW5jdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRGdW5jdGlvbkFzeW5jT3JTeW5jU3RhckVsZW1lbnRUeXBlKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKSB7CiAgICAvLyBUT0RPKHNyYSk6IFNob3VsZCBiZSBnZXR0aW5nIHRoZSBEYXJ0VHlwZSBmcm9tIHRoZSBub2RlLgogICAgRGFydFR5cGUgcmV0dXJuVHlwZSA9IGdldEZ1bmN0aW9uVHlwZShmdW5jdGlvbikucmV0dXJuVHlwZTsKICAgIHJldHVybiBnZXRBc3luY09yU3luY1N0YXJFbGVtZW50VHlwZShmdW5jdGlvbi5hc3luY01hcmtlciwgcmV0dXJuVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRBc3luY09yU3luY1N0YXJFbGVtZW50VHlwZSgKICAgICAgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIsIERhcnRUeXBlIHJldHVyblR5cGUpIHsKICAgIHN3aXRjaCAoYXN5bmNNYXJrZXIpIHsKICAgICAgY2FzZSBBc3luY01hcmtlci5TWU5DOgogICAgICAgIHJldHVybiByZXR1cm5UeXBlOwogICAgICBjYXNlIEFzeW5jTWFya2VyLlNZTkNfU1RBUjoKICAgICAgICBpZiAocmV0dXJuVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lbGVtZW50ID09IGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMuaXRlcmFibGVDbGFzcykgewogICAgICAgICAgICByZXR1cm4gcmV0dXJuVHlwZS50eXBlQXJndW1lbnRzLmZpcnN0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZHluYW1pY1R5cGU7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuQVNZTkM6CiAgICAgICAgaWYgKHJldHVyblR5cGUgaXMgRnV0dXJlT3JUeXBlKSByZXR1cm4gcmV0dXJuVHlwZS50eXBlQXJndW1lbnQ7CiAgICAgICAgaWYgKHJldHVyblR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgaWYgKHJldHVyblR5cGUuZWxlbWVudCA9PSBlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzLmZ1dHVyZUNsYXNzKSB7CiAgICAgICAgICAgIHJldHVybiByZXR1cm5UeXBlLnR5cGVBcmd1bWVudHMuZmlyc3Q7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBkeW5hbWljVHlwZTsKICAgICAgY2FzZSBBc3luY01hcmtlci5BU1lOQ19TVEFSOgogICAgICAgIGlmIChyZXR1cm5UeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVsZW1lbnQgPT0gZWxlbWVudE1hcC5jb21tb25FbGVtZW50cy5zdHJlYW1DbGFzcykgewogICAgICAgICAgICByZXR1cm4gcmV0dXJuVHlwZS50eXBlQXJndW1lbnRzLmZpcnN0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZHluYW1pY1R5cGU7CiAgICB9CiAgICBhc3NlcnQoZmFsc2UsICdVbmV4cGVjdGVkIG1hcmtlciAke2FzeW5jTWFya2VyfScpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRGaWVsZFR5cGUoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9nZXRGaWVsZFR5cGUoZmllbGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25UeXBlIGdldExvY2FsRnVuY3Rpb25UeXBlKGNvdmFyaWFudCBLTG9jYWxGdW5jdGlvbiBmdW5jdGlvbikgewogICAgcmV0dXJuIGZ1bmN0aW9uLmZ1bmN0aW9uVHlwZTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFVuYWxpYXNlZFR5cGUoRGFydFR5cGUgdHlwZSkgPT4gdHlwZTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3JFbnRpdHkgbG9va3VwQ29uc3RydWN0b3IoQ2xhc3NFbnRpdHkgY2xzLCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPSBlbGVtZW50TWFwLmxvb2t1cENvbnN0cnVjdG9yKGNscywgbmFtZSk7CiAgICBpZiAoY29uc3RydWN0b3IgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgICB0aHJvdyBmYWlsZWRBdCgKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAiVGhlIGNvbnN0cnVjdG9yICckbmFtZScgd2FzIG5vdCBmb3VuZCBpbiBjbGFzcyAnJHtjbHMubmFtZX0nICIKICAgICAgICAgICJpbiBsaWJyYXJ5ICR7Y2xzLmxpYnJhcnkuY2Fub25pY2FsVXJpfS4iKTsKICAgIH0KICAgIHJldHVybiBjb25zdHJ1Y3RvcjsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBsb29rdXBMb2NhbENsYXNzTWVtYmVyKENsYXNzRW50aXR5IGNscywgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2UsIGJvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9CiAgICAgICAgZWxlbWVudE1hcC5sb29rdXBDbGFzc01lbWJlcihjbHMsIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICAgIGlmIChtZW1iZXIgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgICB0aHJvdyBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgIlRoZSBtZW1iZXIgJyRuYW1lJyB3YXMgbm90IGZvdW5kIGluICR7Y2xzLm5hbWV9LiIpOwogICAgfQogICAgcmV0dXJuIG1lbWJlcjsKICB9CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldFN1cGVyQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzLAogICAgICB7Ym9vbCBza2lwVW5uYW1lZE1peGluQXBwbGljYXRpb25zOiBmYWxzZX0pIHsKICAgIGFzc2VydChlbGVtZW50TWFwLmNoZWNrRmFtaWx5KGNscykpOwogICAgQ2xhc3NFbnRpdHkgc3VwZXJjbGFzcyA9IGVsZW1lbnRNYXAuZ2V0U3VwZXJUeXBlKGNscyk/LmVsZW1lbnQ7CiAgICBpZiAoc2tpcFVubmFtZWRNaXhpbkFwcGxpY2F0aW9ucykgewogICAgICB3aGlsZSAoc3VwZXJjbGFzcyAhPSBudWxsICYmCiAgICAgICAgICBlbGVtZW50TWFwLl9pc1VubmFtZWRNaXhpbkFwcGxpY2F0aW9uKHN1cGVyY2xhc3MpKSB7CiAgICAgICAgc3VwZXJjbGFzcyA9IGVsZW1lbnRNYXAuZ2V0U3VwZXJUeXBlKHN1cGVyY2xhc3MpPy5lbGVtZW50OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3VwZXJjbGFzczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFN1cGVydHlwZShDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSkpIHsKICAgIGVsZW1lbnRNYXAuX2ZvckVhY2hTdXBlcnR5cGUoY2xzLCBmKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaExvY2FsQ2xhc3NNZW1iZXIoQ2xhc3NFbnRpdHkgY2xzLCB2b2lkIGYoTWVtYmVyRW50aXR5IG1lbWJlcikpIHsKICAgIGVsZW1lbnRNYXAuX2ZvckVhY2hMb2NhbENsYXNzTWVtYmVyKGNscywgZik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hJbmplY3RlZENsYXNzTWVtYmVyKAogICAgICBDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgZWxlbWVudE1hcC5mb3JFYWNoSW5qZWN0ZWRDbGFzc01lbWJlcihjbHMsIGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoQ2xhc3NNZW1iZXIoCiAgICAgIENsYXNzRW50aXR5IGNscywgdm9pZCBmKENsYXNzRW50aXR5IGRlY2xhcmVyLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgZWxlbWVudE1hcC5fZm9yRWFjaENsYXNzTWVtYmVyKGNscywgZik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hDb25zdHJ1Y3RvcigKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCB2b2lkIGYoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpKSB7CiAgICBlbGVtZW50TWFwLl9mb3JFYWNoQ29uc3RydWN0b3IoY2xzLCBmKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaENvbnN0cnVjdG9yQm9keSgKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCB2b2lkIGYoQ29uc3RydWN0b3JCb2R5RW50aXR5IGNvbnN0cnVjdG9yKSkgewogICAgZWxlbWVudE1hcC5mb3JFYWNoQ29uc3RydWN0b3JCb2R5KGNscywgZik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hOZXN0ZWRDbG9zdXJlKAogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyLCB2b2lkIGYoRnVuY3Rpb25FbnRpdHkgY2xvc3VyZSkpIHsKICAgIGVsZW1lbnRNYXAuZm9yRWFjaE5lc3RlZENsb3N1cmUobWVtYmVyLCBmKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaExpYnJhcnlNZW1iZXIoCiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSwgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIpKSB7CiAgICBlbGVtZW50TWFwLl9mb3JFYWNoTGlicmFyeU1lbWJlcihsaWJyYXJ5LCBmKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBsb29rdXBMaWJyYXJ5TWVtYmVyKExpYnJhcnlFbnRpdHkgbGlicmFyeSwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2UsIGJvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9CiAgICAgICAgZWxlbWVudE1hcC5sb29rdXBMaWJyYXJ5TWVtYmVyKGxpYnJhcnksIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICAgIGlmIChtZW1iZXIgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgIlRoZSBtZW1iZXIgJyR7bmFtZX0nIHdhcyBub3QgZm91bmQgaW4gbGlicmFyeSAnJHtsaWJyYXJ5Lm5hbWV9Jy4iKTsKICAgIH0KICAgIHJldHVybiBtZW1iZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBsb29rdXBDbGFzcyhMaWJyYXJ5RW50aXR5IGxpYnJhcnksIFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCByZXF1aXJlZDogZmFsc2V9KSB7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBlbGVtZW50TWFwLmxvb2t1cENsYXNzKGxpYnJhcnksIG5hbWUpOwogICAgaWYgKGNscyA9PSBudWxsICYmIHJlcXVpcmVkKSB7CiAgICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAiVGhlIGNsYXNzICckbmFtZScgIHdhcyBub3QgZm91bmQgaW4gbGlicmFyeSAnJHtsaWJyYXJ5Lm5hbWV9Jy4iKTsKICAgIH0KICAgIHJldHVybiBjbHM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hDbGFzcyhMaWJyYXJ5RW50aXR5IGxpYnJhcnksIHZvaWQgZihDbGFzc0VudGl0eSBjbHMpKSB7CiAgICBlbGVtZW50TWFwLl9mb3JFYWNoQ2xhc3MobGlicmFyeSwgZik7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RW50aXR5IGxvb2t1cExpYnJhcnkoVXJpIHVyaSwge2Jvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5ID0gZWxlbWVudE1hcC5sb29rdXBMaWJyYXJ5KHVyaSk7CiAgICBpZiAobGlicmFyeSA9PSBudWxsICYmIHJlcXVpcmVkKSB7CiAgICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICJUaGUgbGlicmFyeSAnJHVyaScgd2FzIG5vdCBmb3VuZC4iKTsKICAgIH0KICAgIHJldHVybiBsaWJyYXJ5OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0VudW1DbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIGFzc2VydChlbGVtZW50TWFwLmNoZWNrRmFtaWx5KGNscykpOwogICAgSkNsYXNzRGF0YSBjbGFzc0RhdGEgPSBlbGVtZW50TWFwLmNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgcmV0dXJuIGNsYXNzRGF0YS5pc0VudW1DbGFzczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFBhcmFtZXRlcihGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwKICAgICAgdm9pZCBmKERhcnRUeXBlIHR5cGUsIFN0cmluZyBuYW1lLCBDb25zdGFudFZhbHVlIGRlZmF1bHRWYWx1ZSkpIHsKICAgIGVsZW1lbnRNYXAuZm9yRWFjaFBhcmFtZXRlcihmdW5jdGlvbiwgZiwKICAgICAgICBpc05hdGl2ZTogZWxlbWVudE1hcC5uYXRpdmVEYXRhLmlzTmF0aXZlTWVtYmVyKGZ1bmN0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hQYXJhbWV0ZXJBc0xvY2FsKEdsb2JhbExvY2Fsc01hcCBnbG9iYWxMb2NhbHNNYXAsCiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLCB2b2lkIGYoTG9jYWwgcGFyYW1ldGVyKSkgewogICAgZm9yRWFjaE9yZGVyZWRQYXJhbWV0ZXJBc0xvY2FsKGdsb2JhbExvY2Fsc01hcCwgZWxlbWVudE1hcCwgZnVuY3Rpb24sCiAgICAgICAgKExvY2FsIHBhcmFtZXRlciwge2Jvb2wgaXNFbGlkZWR9KSB7CiAgICAgIGlmICghaXNFbGlkZWQpIHsKICAgICAgICBmKHBhcmFtZXRlcik7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoSW5zdGFuY2VGaWVsZCgKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCB2b2lkIGYoQ2xhc3NFbnRpdHkgZGVjbGFyZXIsIEZpZWxkRW50aXR5IGZpZWxkKSkgewogICAgZm9yRWFjaENsYXNzTWVtYmVyKGNscywgKENsYXNzRW50aXR5IGRlY2xhcmVyLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgIGlmIChtZW1iZXIuaXNGaWVsZCAmJiBtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAgIGYoZGVjbGFyZXIsIG1lbWJlcik7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoRGlyZWN0SW5zdGFuY2VGaWVsZChDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihGaWVsZEVudGl0eSBmaWVsZCkpIHsKICAgIC8vIFRPRE8oc3JhKTogQWRkIEVsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoRGlyZWN0SW5zdGFuY2VGaWVsZCBvcgogICAgLy8gcGFyYW1ldGVyaXplIFtmb3JFYWNoSW5zdGFuY2VGaWVsZF0gdG8gZmlsdGVyIG1lbWJlcnMgdG8gYXZvaWQgYQogICAgLy8gcG90ZW50aWFsbHkgTyhuXjIpIHNjYW4gb2YgdGhlIHN1cGVyY2xhc3Nlcy4KICAgIGZvckVhY2hDbGFzc01lbWJlcihjbHMsIChDbGFzc0VudGl0eSBkZWNsYXJlciwgTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICBpZiAoZGVjbGFyZXIgIT0gY2xzKSByZXR1cm47CiAgICAgIGlmICghbWVtYmVyLmlzRmllbGQpIHJldHVybjsKICAgICAgaWYgKCFtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgcmV0dXJuOwogICAgICBmKG1lbWJlcik7CiAgICB9KTsKICB9Cn0KCi8vLyBbQmVoYXZpb3JCdWlsZGVyXSBmb3Iga2VybmVsIGJhc2VkIGVsZW1lbnRzLgpjbGFzcyBKc0JlaGF2aW9yQnVpbGRlciBleHRlbmRzIEJlaGF2aW9yQnVpbGRlciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudDsKICBAb3ZlcnJpZGUKICBmaW5hbCBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50czsKICBAb3ZlcnJpZGUKICBmaW5hbCBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZUJhc2ljRGF0YTsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CgogIEpzQmVoYXZpb3JCdWlsZGVyKHRoaXMuZWxlbWVudEVudmlyb25tZW50LCB0aGlzLmNvbW1vbkVsZW1lbnRzLAogICAgICB0aGlzLm5hdGl2ZUJhc2ljRGF0YSwgdGhpcy5yZXBvcnRlciwgdGhpcy5fb3B0aW9ucyk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IHRydXN0SlNJbnRlcm9wVHlwZUFubm90YXRpb25zID0+CiAgICAgIF9vcHRpb25zLnRydXN0SlNJbnRlcm9wVHlwZUFubm90YXRpb25zOwp9CgovLy8gQ29uc3RhbnQgZW52aXJvbm1lbnQgbWFwcGluZyBbQ29uc3RhbnRFeHByZXNzaW9uXXMgdG8gW0NvbnN0YW50VmFsdWVdcyB1c2luZwovLy8gW19FdmFsdWF0aW9uRW52aXJvbm1lbnRdIGZvciB0aGUgZXZhbHVhdGlvbi4KY2xhc3MgSnNDb25zdGFudEVudmlyb25tZW50IGltcGxlbWVudHMgQ29uc3RhbnRFbnZpcm9ubWVudCB7CiAgZmluYWwgSnNLZXJuZWxUb0VsZW1lbnRNYXAgX2VsZW1lbnRNYXA7CiAgZmluYWwgRW52aXJvbm1lbnQgX2Vudmlyb25tZW50OwoKICBNYXA8Q29uc3RhbnRFeHByZXNzaW9uLCBDb25zdGFudFZhbHVlPiBfdmFsdWVNYXAgPQogICAgICA8Q29uc3RhbnRFeHByZXNzaW9uLCBDb25zdGFudFZhbHVlPnt9OwoKICBKc0NvbnN0YW50RW52aXJvbm1lbnQodGhpcy5fZWxlbWVudE1hcCwgdGhpcy5fZW52aXJvbm1lbnQpOwoKICBDb25zdGFudFZhbHVlIF9nZXRDb25zdGFudFZhbHVlKAogICAgICBTcGFubmFibGUgc3Bhbm5hYmxlLCBDb25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbiwKICAgICAge2Jvb2wgY29uc3RhbnRSZXF1aXJlZH0pIHsKICAgIHJldHVybiBfdmFsdWVNYXAucHV0SWZBYnNlbnQoZXhwcmVzc2lvbiwgKCkgewogICAgICByZXR1cm4gZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgSnNFdmFsdWF0aW9uRW52aXJvbm1lbnQoCiAgICAgICAgICBfZWxlbWVudE1hcCwgX2Vudmlyb25tZW50LCBzcGFubmFibGUsCiAgICAgICAgICBjb25zdGFudFJlcXVpcmVkOiBjb25zdGFudFJlcXVpcmVkKSk7CiAgICB9KTsKICB9Cn0KCi8vLyBFdmFsdWF0aW9uIGVudmlyb25tZW50IHVzZWQgZm9yIGNvbXB1dGluZyBbQ29uc3RhbnRWYWx1ZV1zIGZvcgovLy8ga2VybmVsIGJhc2VkIFtDb25zdGFudEV4cHJlc3Npb25dcy4KY2xhc3MgSnNFdmFsdWF0aW9uRW52aXJvbm1lbnQgZXh0ZW5kcyBFdmFsdWF0aW9uRW52aXJvbm1lbnRCYXNlIHsKICBmaW5hbCBKc0tlcm5lbFRvRWxlbWVudE1hcCBfZWxlbWVudE1hcDsKICBmaW5hbCBFbnZpcm9ubWVudCBfZW52aXJvbm1lbnQ7CgogIEpzRXZhbHVhdGlvbkVudmlyb25tZW50KAogICAgICB0aGlzLl9lbGVtZW50TWFwLCB0aGlzLl9lbnZpcm9ubWVudCwgU3Bhbm5hYmxlIHNwYW5uYWJsZSwKICAgICAge2Jvb2wgY29uc3RhbnRSZXF1aXJlZH0pCiAgICAgIDogc3VwZXIoc3Bhbm5hYmxlLCBjb25zdGFudFJlcXVpcmVkOiBjb25zdGFudFJlcXVpcmVkKTsKCiAgQG92ZXJyaWRlCiAgQ29tbW9uRWxlbWVudHMgZ2V0IGNvbW1vbkVsZW1lbnRzID0+IF9lbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZXMgZ2V0IHR5cGVzID0+IF9lbGVtZW50TWFwLnR5cGVzOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBzdWJzdEJ5Q29udGV4dChEYXJ0VHlwZSBiYXNlLCBJbnRlcmZhY2VUeXBlIHRhcmdldCkgewogICAgcmV0dXJuIF9lbGVtZW50TWFwLnN1YnN0QnlDb250ZXh0KGJhc2UsIHRhcmdldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudENvbnN0cnVjdG9yIGdldENvbnN0cnVjdG9yQ29uc3RhbnQoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpIHsKICAgIHJldHVybiBfZWxlbWVudE1hcC5fZ2V0Q29uc3RydWN0b3JDb25zdGFudChjb25zdHJ1Y3Rvcik7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gZ2V0RmllbGRDb25zdGFudChGaWVsZEVudGl0eSBmaWVsZCkgewogICAgcmV0dXJuIF9lbGVtZW50TWFwLl9nZXRGaWVsZENvbnN0YW50RXhwcmVzc2lvbihmaWVsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gZ2V0TG9jYWxDb25zdGFudChMb2NhbCBsb2NhbCkgewogICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigiX0V2YWx1YXRpb25FbnZpcm9ubWVudC5nZXRMb2NhbENvbnN0YW50Iik7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgcmVhZEZyb21FbnZpcm9ubWVudChTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIF9lbnZpcm9ubWVudC52YWx1ZU9mKG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGlhZ25vc3RpY1JlcG9ydGVyIGdldCByZXBvcnRlciA9PiBfZWxlbWVudE1hcC5yZXBvcnRlcjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgZW5hYmxlQXNzZXJ0aW9ucyA9PiBfZWxlbWVudE1hcC5vcHRpb25zLmVuYWJsZVVzZXJBc3NlcnRpb25zOwp9CgovLy8gW0VudGl0eUxvb2t1cF0gaW1wbGVtZW50YXRpb24gdXNlZCB0byBkZXNlcmlhbGl6ZSBbSnNLZXJuZWxUb0VsZW1lbnRNYXBdLgovLy8KLy8vIFNpbmNlIGRhdGEgb2JqZWN0cyBhbmQgZW52aXJvbm1lbnRzIGFyZSByZWdpc3RlcmVkIHRvZ2V0aGVyIHdpdGggdGhlaXIKLy8vIGVudGl0eSB3ZSBuZWVkIHRvIGhhdmUgYSBzZXBhcmF0ZSBsb29rdXAtYnktaW5kZXggbWVjaGFuaXNtIHRvIGFsbG93IGZvcgovLy8gaW5kZXgtYmFzZWQgcmVmZXJlbmNlIHdpdGhpbiBkYXRhIG9iamVjdHMgYW5kIGVudmlyb25tZW50cy4KY2xhc3MgX0VudGl0eUxvb2t1cCBpbXBsZW1lbnRzIEVudGl0eUxvb2t1cCB7CiAgZmluYWwgTWFwPGludCwgSkxpYnJhcnk+IF9saWJyYXJpZXMgPSB7fTsKICBmaW5hbCBNYXA8aW50LCBKQ2xhc3M+IF9jbGFzc2VzID0ge307CiAgZmluYWwgTWFwPGludCwgSlR5cGVkZWY+IF90eXBlZGVmcyA9IHt9OwogIGZpbmFsIE1hcDxpbnQsIEpNZW1iZXI+IF9tZW1iZXJzID0ge307CiAgZmluYWwgTWFwPGludCwgSlR5cGVWYXJpYWJsZT4gX3R5cGVWYXJpYWJsZXMgPSB7fTsKCiAgdm9pZCByZWdpc3RlckxpYnJhcnkoaW50IGluZGV4LCBKTGlicmFyeSBsaWJyYXJ5KSB7CiAgICBhc3NlcnQoIV9saWJyYXJpZXMuY29udGFpbnNLZXkoaW5kZXgpLAogICAgICAgICJMaWJyYXJ5IGZvciBpbmRleCAkaW5kZXggaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiIpOwogICAgX2xpYnJhcmllc1tpbmRleF0gPSBsaWJyYXJ5OwogIH0KCiAgdm9pZCByZWdpc3RlckNsYXNzKGludCBpbmRleCwgSkNsYXNzIGNscykgewogICAgYXNzZXJ0KCFfY2xhc3Nlcy5jb250YWluc0tleShpbmRleCksCiAgICAgICAgIkNsYXNzIGZvciBpbmRleCAkaW5kZXggaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiIpOwogICAgX2NsYXNzZXNbaW5kZXhdID0gY2xzOwogIH0KCiAgdm9pZCByZWdpc3RlclR5cGVkZWYoaW50IGluZGV4LCBKVHlwZWRlZiB0eXBlZGVmKSB7CiAgICBhc3NlcnQoIV90eXBlZGVmcy5jb250YWluc0tleShpbmRleCksCiAgICAgICAgIlR5cGVkZWYgZm9yIGluZGV4ICRpbmRleCBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIik7CiAgICBfdHlwZWRlZnNbaW5kZXhdID0gdHlwZWRlZjsKICB9CgogIHZvaWQgcmVnaXN0ZXJNZW1iZXIoaW50IGluZGV4LCBKTWVtYmVyIG1lbWJlcikgewogICAgYXNzZXJ0KCFfbWVtYmVycy5jb250YWluc0tleShpbmRleCksCiAgICAgICAgIk1lbWJlciBmb3IgaW5kZXggJGluZGV4IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4iKTsKICAgIF9tZW1iZXJzW2luZGV4XSA9IG1lbWJlcjsKICB9CgogIHZvaWQgcmVnaXN0ZXJUeXBlVmFyaWFibGUoaW50IGluZGV4LCBKVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSkgewogICAgYXNzZXJ0KCFfdHlwZVZhcmlhYmxlcy5jb250YWluc0tleShpbmRleCksCiAgICAgICAgIlR5cGUgdmFyaWFibGUgZm9yIGluZGV4ICRpbmRleCBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIik7CiAgICBfdHlwZVZhcmlhYmxlc1tpbmRleF0gPSB0eXBlVmFyaWFibGU7CiAgfQoKICB2b2lkIGZvckVhY2hMaWJyYXJ5KHZvaWQgZihpbnQgaW5kZXgsIEpMaWJyYXJ5IGxpYnJhcnkpKSB7CiAgICBfbGlicmFyaWVzLmZvckVhY2goZik7CiAgfQoKICB2b2lkIGZvckVhY2hDbGFzcyh2b2lkIGYoaW50IGluZGV4LCBKQ2xhc3MgY2xzKSkgewogICAgX2NsYXNzZXMuZm9yRWFjaChmKTsKICB9CgogIHZvaWQgZm9yRWFjaFR5cGVkZWYodm9pZCBmKGludCBpbmRleCwgSlR5cGVkZWYgdHlwZWRlZikpIHsKICAgIF90eXBlZGVmcy5mb3JFYWNoKGYpOwogIH0KCiAgdm9pZCBmb3JFYWNoTWVtYmVyKHZvaWQgZihpbnQgaW5kZXgsIEpNZW1iZXIgbWVtYmVyKSkgewogICAgX21lbWJlcnMuZm9yRWFjaChmKTsKICB9CgogIHZvaWQgZm9yRWFjaFR5cGVWYXJpYWJsZSh2b2lkIGYoaW50IGluZGV4LCBKVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSkpIHsKICAgIF90eXBlVmFyaWFibGVzLmZvckVhY2goZik7CiAgfQoKICBAb3ZlcnJpZGUKICBJbmRleGVkTGlicmFyeSBnZXRMaWJyYXJ5QnlJbmRleChpbnQgaW5kZXgpIHsKICAgIEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnkgPSBfbGlicmFyaWVzW2luZGV4XTsKICAgIGFzc2VydChsaWJyYXJ5ICE9IG51bGwsICJObyBsaWJyYXJ5IGZvdW5kIGZvciBpbmRleCAkaW5kZXgiKTsKICAgIHJldHVybiBsaWJyYXJ5OwogIH0KCiAgQG92ZXJyaWRlCiAgSW5kZXhlZENsYXNzIGdldENsYXNzQnlJbmRleChpbnQgaW5kZXgpIHsKICAgIEluZGV4ZWRDbGFzcyBjbHMgPSBfY2xhc3Nlc1tpbmRleF07CiAgICBhc3NlcnQoY2xzICE9IG51bGwsICJObyBjbGFzcyBmb3VuZCBmb3IgaW5kZXggJGluZGV4Iik7CiAgICByZXR1cm4gY2xzOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5kZXhlZFR5cGVkZWYgZ2V0VHlwZWRlZkJ5SW5kZXgoaW50IGluZGV4KSB7CiAgICBJbmRleGVkVHlwZWRlZiB0eXBlZGVmID0gX3R5cGVkZWZzW2luZGV4XTsKICAgIGFzc2VydCh0eXBlZGVmICE9IG51bGwsICJObyB0eXBlZGVmIGZvdW5kIGZvciBpbmRleCAkaW5kZXgiKTsKICAgIHJldHVybiB0eXBlZGVmOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5kZXhlZE1lbWJlciBnZXRNZW1iZXJCeUluZGV4KGludCBpbmRleCkgewogICAgSW5kZXhlZE1lbWJlciBtZW1iZXIgPSBfbWVtYmVyc1tpbmRleF07CiAgICBhc3NlcnQobWVtYmVyICE9IG51bGwsICJObyBtZW1iZXIgZm91bmQgZm9yIGluZGV4ICRpbmRleCIpOwogICAgcmV0dXJuIG1lbWJlcjsKICB9CgogIEBvdmVycmlkZQogIEluZGV4ZWRUeXBlVmFyaWFibGUgZ2V0VHlwZVZhcmlhYmxlQnlJbmRleChpbnQgaW5kZXgpIHsKICAgIEluZGV4ZWRUeXBlVmFyaWFibGUgdHlwZVZhcmlhYmxlID0gX3R5cGVWYXJpYWJsZXNbaW5kZXhdOwogICAgYXNzZXJ0KHR5cGVWYXJpYWJsZSAhPSBudWxsLCAiTm8gdHlwZSB2YXJpYWJsZSBmb3VuZCBmb3IgaW5kZXggJGluZGV4Iik7CiAgICByZXR1cm4gdHlwZVZhcmlhYmxlOwogIH0KfQoKLy8vIFtFbnRpdHlMb29rdXBdIGltcGxlbWVudGF0aW9uIGZvciBhbiBmdWxseSBidWlsdCBbSnNLZXJuZWxUb0VsZW1lbnRNYXBdLgpjbGFzcyBDbG9zZWRFbnRpdHlMb29rdXAgaW1wbGVtZW50cyBFbnRpdHlMb29rdXAgewogIGZpbmFsIEpzS2VybmVsVG9FbGVtZW50TWFwIF9lbGVtZW50TWFwOwoKICBDbG9zZWRFbnRpdHlMb29rdXAodGhpcy5fZWxlbWVudE1hcCk7CgogIEBvdmVycmlkZQogIEluZGV4ZWRUeXBlVmFyaWFibGUgZ2V0VHlwZVZhcmlhYmxlQnlJbmRleChpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZWxlbWVudE1hcC50eXBlVmFyaWFibGVzLmdldEVudGl0eShpbmRleCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbmRleGVkTWVtYmVyIGdldE1lbWJlckJ5SW5kZXgoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2VsZW1lbnRNYXAubWVtYmVycy5nZXRFbnRpdHkoaW5kZXgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5kZXhlZFR5cGVkZWYgZ2V0VHlwZWRlZkJ5SW5kZXgoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2VsZW1lbnRNYXAudHlwZWRlZnMuZ2V0RW50aXR5KGluZGV4KTsKICB9CgogIEBvdmVycmlkZQogIEluZGV4ZWRDbGFzcyBnZXRDbGFzc0J5SW5kZXgoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2VsZW1lbnRNYXAuY2xhc3Nlcy5nZXRFbnRpdHkoaW5kZXgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5kZXhlZExpYnJhcnkgZ2V0TGlicmFyeUJ5SW5kZXgoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2VsZW1lbnRNYXAubGlicmFyaWVzLmdldEVudGl0eShpbmRleCk7CiAgfQp9CgovLy8gRW51bSB1c2VkIGZvciBzZXJpYWxpemF0aW9uIG9mICdsYXRlIG1lbWJlcnMnLCB0aGF0IGlzLCBtZW1iZXJzIG5vcm1hbGx5Ci8vLyBjcmVhdGVkIG9uIGRlbWFuZCwgbGlrZSBjb25zdHJ1Y3RvciBib2RpZXMgYW5kIGdlbmVyYXRvciBib2RpZXMuCmVudW0gTGF0ZU1lbWJlcktpbmQgewogIGNvbnN0cnVjdG9yQm9keSwKICBnZW5lcmF0b3JCb2R5LAp9CgovLy8gRW50aXR5IHJlYWRlciB0aGF0IHN1cHBvcnRzIG1lbWJlciBlbnRpdGllcyBub3JtYWxseSBjcmVhdGVkIG9uLWRlbWFuZCwgbGlrZQovLy8gY29uc3RydWN0b3IgYm9kaWVzIGFuZCBnZW5lcmF0b3IgYm9kaWVzLgovLy8KLy8vIFRoZSBzdXBwb3J0IGVuY29kaW5nIGNvcnJlc3BvbmRzIHRvIHRoZSBlbmNvZGluZyBnZW5lcmF0ZWQgYnkgdGhlCi8vLyBbQ2xvc2VkRW50aXR5V3JpdGVyXS4KY2xhc3MgQ2xvc2VkRW50aXR5UmVhZGVyIGV4dGVuZHMgRW50aXR5UmVhZGVyIHsKICBmaW5hbCBKc0tlcm5lbFRvRWxlbWVudE1hcCBfZWxlbWVudE1hcDsKCiAgQ2xvc2VkRW50aXR5UmVhZGVyKHRoaXMuX2VsZW1lbnRNYXApOwoKICBAb3ZlcnJpZGUKICBJbmRleGVkTWVtYmVyIHJlYWRNZW1iZXJGcm9tRGF0YVNvdXJjZSgKICAgICAgRGF0YVNvdXJjZSBzb3VyY2UsIEVudGl0eUxvb2t1cCBlbnRpdHlMb29rdXApIHsKICAgIGludCBpbmRleCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICBpZiAoaW5kZXggPT0gMCkgewogICAgICByZXR1cm4gX3JlYWRMYXRlTWVtYmVyRnJvbURhdGFTb3VyY2Uoc291cmNlLCBlbnRpdHlMb29rdXApOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGVudGl0eUxvb2t1cC5nZXRNZW1iZXJCeUluZGV4KGluZGV4IC0gMSk7CiAgICB9CiAgfQoKICBJbmRleGVkTWVtYmVyIF9yZWFkTGF0ZU1lbWJlckZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgRW50aXR5TG9va3VwIGVudGl0eUxvb2t1cCkgewogICAgTGF0ZU1lbWJlcktpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShMYXRlTWVtYmVyS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgTGF0ZU1lbWJlcktpbmQuY29uc3RydWN0b3JCb2R5OgogICAgICAgIEluZGV4ZWRDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHNvdXJjZS5yZWFkTWVtYmVyKCk7CiAgICAgICAgcmV0dXJuIF9lbGVtZW50TWFwLl9nZXRDb25zdHJ1Y3RvckJvZHkoY29uc3RydWN0b3IpOwogICAgICBjYXNlIExhdGVNZW1iZXJLaW5kLmdlbmVyYXRvckJvZHk6CiAgICAgICAgSW5kZXhlZEZ1bmN0aW9uIGZ1bmN0aW9uID0gc291cmNlLnJlYWRNZW1iZXIoKTsKICAgICAgICByZXR1cm4gX2VsZW1lbnRNYXAuZ2V0R2VuZXJhdG9yQm9keShmdW5jdGlvbik7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBsYXRlIG1lbWJlciBraW5kOiAka2luZC4iKTsKICB9Cn0KCi8vLyBFbnRpdHkgd3JpdGVyIHRoYXQgc3VwcG9ydHMgbWVtYmVyIGVudGl0aWVzIG5vcm1hbGx5IGNyZWF0ZWQgb24tZGVtYW5kLCBsaWtlCi8vLyBjb25zdHJ1Y3RvciBib2RpZXMgYW5kIGdlbmVyYXRvciBib2RpZXMuCi8vLwovLy8gVGhlIGdlbmVyYXRlZCBlbmNvZGluZyBjb3JyZXNwb25kcyB0byB0aGUgZW5jb2RpbmcgcmVhZCBieSB0aGUKLy8vIFtDbG9zZWRFbnRpdHlSZWFkZXJdLgpjbGFzcyBDbG9zZWRFbnRpdHlXcml0ZXIgZXh0ZW5kcyBFbnRpdHlXcml0ZXIgewogIGZpbmFsIGludCBfZWFybHlNZW1iZXJJbmRleExpbWl0OwoKICBmaW5hbCBKc0tlcm5lbFRvRWxlbWVudE1hcCBfZWxlbWVudE1hcDsKCiAgQ2xvc2VkRW50aXR5V3JpdGVyKHRoaXMuX2VsZW1lbnRNYXAsIHRoaXMuX2Vhcmx5TWVtYmVySW5kZXhMaW1pdCk7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVNZW1iZXJUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmssIEluZGV4ZWRNZW1iZXIgdmFsdWUpIHsKICAgIGlmICh2YWx1ZS5tZW1iZXJJbmRleCA+PSBfZWFybHlNZW1iZXJJbmRleExpbWl0KSB7CiAgICAgIHNpbmsud3JpdGVJbnQoMCk7CiAgICAgIF93cml0ZUxhdGVNZW1iZXJUb0RhdGFTaW5rKHNpbmssIHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHNpbmsud3JpdGVJbnQodmFsdWUubWVtYmVySW5kZXggKyAxKTsKICAgIH0KICB9CgogIHZvaWQgX3dyaXRlTGF0ZU1lbWJlclRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaywgSW5kZXhlZE1lbWJlciB2YWx1ZSkgewogICAgaWYgKHZhbHVlIGlzIEpDb25zdHJ1Y3RvckJvZHkpIHsKICAgICAgc2luay53cml0ZUVudW0oTGF0ZU1lbWJlcktpbmQuY29uc3RydWN0b3JCb2R5KTsKICAgICAgc2luay53cml0ZU1lbWJlcih2YWx1ZS5jb25zdHJ1Y3Rvcik7CiAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIEpHZW5lcmF0b3JCb2R5KSB7CiAgICAgIHNpbmsud3JpdGVFbnVtKExhdGVNZW1iZXJLaW5kLmdlbmVyYXRvckJvZHkpOwogICAgICBzaW5rLndyaXRlTWVtYmVyKHZhbHVlLmZ1bmN0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIGxhdGUgbWVtYmVyICR2YWx1ZS4iKTsKICAgIH0KICB9Cn0Kis4ATk48AVEBKDQvMTUBMxkfIikpJygjICQxIyEhHigdGyEbHiYnKhopKSodIyIaIi4jKigkARcYGxMWAUdOHTgBPEAwLC8tOjczNzVCPQEhDCUmLCQuGiclKAExGgFQSUhDPDdOQz85ATkzOQE9HAZLS05RSEA7MzcBTkQBSBoZAT4BRQE3ARgVHyo2Iy06FkpJMig2ASwfNRpRRUUiQkkjSTNCKgYzHTEYSTw/NE9ELEROOk8GHzQaUEQ2T00xFhwZHx4tTTJCBgEeMhlMPCEyEghBNThPHUwfSDQfKEEmLiUsNDAyMTEwOy84MiwsPREyOFEKJywhQicrLCcsQicrLA8uMC8uMUI2KS0uCDMOOiRGTx8pLC8PKggGJD4fLEIuPiE8PEBHREBEKjYUCg86CEBMMko8Mi4GUFFLHCQEAUdMOkxJMig2AUQ2LwEXHiktJEI0BhwBHCcrJDouBhoBHiktJEI0BhwBHSgsJD8yBhsBIy4yJFE+BiEBLyJAREcgQCctCCABIDhAQ0o2SEQIJwgeASJAR04tCCABIUNFNCYhJTEgJS0rEyYMEREIKwgfASdPUSNENwglASUzSiMBFQQBUCUGS00pIUU8JC5FCFEiCAYXFRUWGxMEATIoFQE7HCMyKyUIGgEaISolIQgYARwiLSslCBoBGyEqKSQIGQEhJzw1KggfAUcgQCEiCB4BHjohIggcASAuIggeAR8sIggdASU4IggjASMZG0IrIQETBAEMIQEMRgEMPAElKTMQBAEjKUUQBAFJNCk3NzsuMzZBKS80N0EpKEcIEwYBNjIXBAEpPCk/BAEzIjgqBAFIHiI4RjYEAR49IjgwGggEAUEiODccNwYRBAFIIjgzMTUICAQBQB4eLj4EAUceLjMEAQwlN0oEAQxJAQxBAQwxHiwiGwQBQR47ICkYRw8rEUQeK0gRKhEnQwgGBAEMPyUBPR5BKAEgASRLKTMPPEk3PjQcCgEhMS4nIQ0lDSINPTENIQ1FDU4uSj8MKTIROAo3KkVOESYKKCoWTxErCkE8DCk9Kzg/Tk0IBgQBDDA3LgQBDCscJSkrJzMtDygIBjwEAQxCHlAuOgwVGkk6ITIhPSE4Jx4KCDYGEQQBDDYkASk5OzU7NUIlFQYwTh8aBkgEAQxKAQxBAQxKAQxFGQEMOSgnIwgRBAEMOyQBDDcZKUs0KA0xBjI6AUFFTCoIKQYBSUJADzgIBi83OVFFKjsGLio0RBdICD8mOwEmOggBJjtLRUMlQggNNgYBUD4EASY4JkcsBAEMQhdMBAE3Bk9NQgwtJR4sITIGEQQBDDAeLCYaBAEwHiwmGQQBPCMzJwQBTyMzMAQBLyAuJAQBDEQnQiAEAUsnQiYEATIeLCImBAEvHiwiJAQBNh4pKgQBNB4pKAQBTh4sIi8EAVEeKSUEAVEeKTQRCAQBHEgeKTQWCCwiIjYGBAFQJjo7BAFHIC4yBAEMRB5FHkIdMwYWBAEMNx4sIiAEAQwsHiwiKQQBDDweLCIcBAFRIS8EAUseLAQBDDYmSB8EASskM0cGHQQBKSNLBhwEAQxCTCcfJR8jJzAyQQ8jMh8jJThQEwweCg8kISU1DwYBTkQvBAEMHxVGBAEMO05PHkAEAQwtSEwOIisGKDIGJysGIisGJysGKyoGFCNKFAQBRyoXLkYjDyYIDSAGAUo0BAEvGkwmBAEvGkwmBAFFURw1GEVIBAEjJAE2IB1BOUdBBgE4Nh9PHTUgNTcMChUIASFFCAFPEk0VOUAIJy0wNS0nJy4mLCkqLS0nKiY/SwgTBgETBAFDRwQBNAxIMCsjSSMGNR4jTyMGATUeI1AjBgEkFBQoIxIZBAE0DE8wHkwjBjAeRSMGNR4eRCMGKxQoIxIZBAE0DDsiMDg5IwYwHk0jBjArODwjBjUeHkQjBjIUKCMSGQQBDDVAKT4GASEYGxhHCC8NEVEGHB0kQggTBjA3KzETBhIEAT5FPTYvLAgVBAEMORozRysyISxHHQwKQycPCAZJQB1HFQQBKTg8BAEqTkIEASY3NgQBHT0hKwQBDDk8BAEMPx08BAEkDC8ZThEEAQw+Gx84BjAXBAE0HgQBSS48FAQBQSY2EAQBMCg4EgQBOC8+FQQBPTpEGAQBRj0gLCw3LTQ1IlEyMDw1M0QMCggGDB4wURkEATYuPBQEAQw7Oi0EAUk+KEpJHC5GASlCNxsnGSIrOiI1NE8TNDopLgYhBAEMPjAEAQw4Mh0hFwocCBMGAT8fHyMnICMkISUxBkgEAQw4LAQBUEk8RiAzQB0EAR9AKSMEASM3LAQBKyQnGSslOB5LFhQeUTQeLQEXBAFOTEgMMFAvKjQBSEEzUTs2TxQVR0wBQ0ISRTwoSwgGGAQBFE81AT0eOkE1I0JMKgQBMBscITscIx8mQUAQMTlHR0cVPgYtP0YBREFQUTkuEhNFUAEZMTNDNz4GAUVNFjgaS0E2E0I/RTEPBgEuMhkSJRIXGx5IGBNNOwEhQzkGATIBNRQhKUAcIhIiSx0EASEvGyQcIzstT0cZAUxRURs8ATMwREZDHSAeGRgqHC8KCAYBLCceJhwaFToQERgVBgEzST0wREciHSAeGRggSxwZCjwgQR4cFyUSExoXD00IBgQBTUxPTk5QHCgbLyQrHjsZSgFQJUlEFAYBMkUtATAWHik7KR0eMUZCEQQBIi8rKSQbNCVDNRkjKUEcLiImPAQBHxsvJCseFBkZMkIaHBolATAWHik7KR0eMUQEAT41HEtJFB8kNR4aKx4YMyoqOxEgGgolUR4PKTVIEUUKK0YPCCAGJQQBTg4GSU5DBkovBkg4JAQBDEg/IT03HU5CNxk2TQEtTE8hCDoyMgYaBAIBNiUpASkBDDMBDDwBDD8BDEsBDDEwBAEMLygEAQwuKAQBDCk2BAEMLTAEAQw0NwQBDDI1BAEMOC8JLScQBAEMQzoEAQxJQQQBDCU3MgQBDDoyBAEMTTsEAQxMQEBMBAEMKjYbHRsiK08zDAocHkgrTTMMChwjK00zDAocBjcRBAEMLSwEAQxJIgQBDDQBDEQgTSsWJUo2BhgEAQxENBpBJjA/BhMEAQwtNClEKCM/QwgGFwQBDEwqBAEMTzEEAQwjNjMEAQwbTCwEAQwbQCwEAQwfRC8EAQwdPTAEAQwdPDIEAQxHNBpHJipPBhMEAQw+ID0jKk0GEAQBDEYqBAEMQTsnUAYUBAEMJik8IgQBDDFILUMEAQxAOkotFxYICAQBDB1KSjcdCAgEAQxQR0g0SiMjLBEIBAIBMTIMLwwnDCUMKSIBQjsBDCwuAgFRMT0qIgE1LQE+ASM6ITI+MDAIBAIBQyhCKiIBG0AfPgEMQwEMLAEMQTUEAQxOPQQBDDs7BAEMNU0EAQwsJwQBDDsBDEkCAU4ES01ALiwoKyk1ATYrPyEEAS4pPRsEATYqPyAEATMpPh4EAUUvRSoEAT0bBAE1GQQBPRoEAToZBAFMHwQBDDAwQhQEAQwsKDwQBAEMMC9CFAQBDC4sQBMEAQw6Pk0ZBAIBTTMqASgBDDo3BAEMLjEEAQwwMgQBDCwxBAEMMDMEAgFNRRYTEQIBUS0ERhowKgEoAQwqNiIWQg03BgQBLzZCFCs+PSk4NwZHBAIBUS0EQxowJAEqAUUBDEM3GC8NLAYEAUglNisqNCgNRAYEAgEzcGFja2FnZTpjb21waWxlci9zcmMvanNfbW9kZWwvZWxlbWVudF9tYXBfaW1wbC5kYXJ0NHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX21vZGVsL2pzX3dvcmxkLmRhcnTAAFiWLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JyBzaG93IExpbms7CgppbXBvcnQgJy4uL2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBKQ29tbW9uRWxlbWVudHMsIEpFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vZGVmZXJyZWRfbG9hZC5kYXJ0JzsKaW1wb3J0ICcuLi9kaWFnbm9zdGljcy9kaWFnbm9zdGljX2xpc3RlbmVyLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0eV91dGlscy5kYXJ0JyBhcyB1dGlsczsKaW1wb3J0ICcuLi9lbGVtZW50cy9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbnZpcm9ubWVudC5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vanNfZW1pdHRlci9zb3J0ZXIuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9hbm5vdGF0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ZpZWxkX2FuYWx5c2lzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYmFja2VuZF91c2FnZS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ludGVyY2VwdG9yX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25vX3N1Y2hfbWV0aG9kX3JlZ2lzdHJ5LmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvcnVudGltZV90eXBlc19yZXNvbHV0aW9uLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2xvY2Fscy5kYXJ0JzsKaW1wb3J0ICcuLi9vcmRlcmVkX3R5cGVzZXQuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2xhc3NfaGllcmFyY2h5LmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NsYXNzX3NldC5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9mdW5jdGlvbl9zZXQuZGFydCcgc2hvdyBGdW5jdGlvblNldDsKaW1wb3J0ICcuLi91bml2ZXJzZS9tZW1iZXJfdXNhZ2UuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCc7CmltcG9ydCAnZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnZWxlbWVudF9tYXBfaW1wbC5kYXJ0JzsKaW1wb3J0ICdsb2NhbHMuZGFydCc7CgpjbGFzcyBKc0Nsb3NlZFdvcmxkIGltcGxlbWVudHMgSkNsb3NlZFdvcmxkIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdjbG9zZWQtd29ybGQnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBOYXRpdmVEYXRhIG5hdGl2ZURhdGE7CiAgQG92ZXJyaWRlCiAgZmluYWwgSW50ZXJjZXB0b3JEYXRhIGludGVyY2VwdG9yRGF0YTsKICBAb3ZlcnJpZGUKICBmaW5hbCBCYWNrZW5kVXNhZ2UgYmFja2VuZFVzYWdlOwogIEBvdmVycmlkZQogIGZpbmFsIE5vU3VjaE1ldGhvZERhdGEgbm9TdWNoTWV0aG9kRGF0YTsKCiAgRnVuY3Rpb25TZXQgX2FsbEZ1bmN0aW9uczsKCiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBTZXQ8Q2xhc3NFbnRpdHk+PiBtaXhpblVzZXM7CiAgTWFwPENsYXNzRW50aXR5LCBMaXN0PENsYXNzRW50aXR5Pj4gX2xpdmVNaXhpblVzZXM7CgogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4gdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3NlczsKCiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBNYXA8Q2xhc3NFbnRpdHksIGJvb2w+PiBfc3VidHlwZUNvdmVyZWRCeUNhY2hlID0KICAgICAgPENsYXNzRW50aXR5LCBNYXA8Q2xhc3NFbnRpdHksIGJvb2w+Pnt9OwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDYW4gdGhpcyBiZSBkZXJpdmVkIGZyb20gW0NsYXNzU2V0XXM/CiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBpbXBsZW1lbnRlZENsYXNzZXM7CgogIGZpbmFsIFNldDxNZW1iZXJFbnRpdHk+IGxpdmVJbnN0YW5jZU1lbWJlcnM7CgogIC8vLyBNZW1iZXJzIHRoYXQgYXJlIHdyaXR0ZW4gZWl0aGVyIGRpcmVjdGx5IG9yIHRocm91Z2ggYSBzZXR0ZXIgc2VsZWN0b3IuCiAgZmluYWwgU2V0PE1lbWJlckVudGl0eT4gYXNzaWduZWRJbnN0YW5jZU1lbWJlcnM7CgogIEBvdmVycmlkZQogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gbGl2ZU5hdGl2ZUNsYXNzZXM7CgogIEBvdmVycmlkZQogIGZpbmFsIFNldDxNZW1iZXJFbnRpdHk+IHByb2Nlc3NlZE1lbWJlcnM7CgogIEBvdmVycmlkZQogIGZpbmFsIENsYXNzSGllcmFyY2h5IGNsYXNzSGllcmFyY2h5OwoKICBmaW5hbCBKc0tlcm5lbFRvRWxlbWVudE1hcCBlbGVtZW50TWFwOwogIEBvdmVycmlkZQogIGZpbmFsIFJ1bnRpbWVUeXBlc05lZWQgcnRpTmVlZDsKICBBYnN0cmFjdFZhbHVlRG9tYWluIF9hYnN0cmFjdFZhbHVlRG9tYWluOwogIEBvdmVycmlkZQogIGZpbmFsIEpGaWVsZEFuYWx5c2lzIGZpZWxkQW5hbHlzaXM7CiAgQG92ZXJyaWRlCiAgZmluYWwgQW5ub3RhdGlvbnNEYXRhIGFubm90YXRpb25zRGF0YTsKICBAb3ZlcnJpZGUKICBmaW5hbCBHbG9iYWxMb2NhbHNNYXAgZ2xvYmFsTG9jYWxzTWFwOwogIEBvdmVycmlkZQogIGZpbmFsIENsb3N1cmVEYXRhIGNsb3N1cmVEYXRhTG9va3VwOwogIEBvdmVycmlkZQogIGZpbmFsIE91dHB1dFVuaXREYXRhIG91dHB1dFVuaXREYXRhOwogIFNvcnRlciBfc29ydGVyOwoKICBmaW5hbCBNYXA8TWVtYmVyRW50aXR5LCBNZW1iZXJBY2Nlc3M+IG1lbWJlckFjY2VzczsKCiAgSnNDbG9zZWRXb3JsZCgKICAgICAgdGhpcy5lbGVtZW50TWFwLAogICAgICB0aGlzLm5hdGl2ZURhdGEsCiAgICAgIHRoaXMuaW50ZXJjZXB0b3JEYXRhLAogICAgICB0aGlzLmJhY2tlbmRVc2FnZSwKICAgICAgdGhpcy5ydGlOZWVkLAogICAgICB0aGlzLmZpZWxkQW5hbHlzaXMsCiAgICAgIHRoaXMubm9TdWNoTWV0aG9kRGF0YSwKICAgICAgdGhpcy5pbXBsZW1lbnRlZENsYXNzZXMsCiAgICAgIHRoaXMubGl2ZU5hdGl2ZUNsYXNzZXMsCiAgICAgIHRoaXMubGl2ZUluc3RhbmNlTWVtYmVycywKICAgICAgdGhpcy5hc3NpZ25lZEluc3RhbmNlTWVtYmVycywKICAgICAgdGhpcy5wcm9jZXNzZWRNZW1iZXJzLAogICAgICB0aGlzLm1peGluVXNlcywKICAgICAgdGhpcy50eXBlc0ltcGxlbWVudGVkQnlTdWJjbGFzc2VzLAogICAgICB0aGlzLmNsYXNzSGllcmFyY2h5LAogICAgICBBYnN0cmFjdFZhbHVlU3RyYXRlZ3kgYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5LAogICAgICB0aGlzLmFubm90YXRpb25zRGF0YSwKICAgICAgdGhpcy5nbG9iYWxMb2NhbHNNYXAsCiAgICAgIHRoaXMuY2xvc3VyZURhdGFMb29rdXAsCiAgICAgIHRoaXMub3V0cHV0VW5pdERhdGEsCiAgICAgIHRoaXMubWVtYmVyQWNjZXNzKSB7CiAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbiA9IGFic3RyYWN0VmFsdWVTdHJhdGVneS5jcmVhdGVEb21haW4odGhpcyk7CiAgfQoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0pzQ2xvc2VkV29ybGRdIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgSnNDbG9zZWRXb3JsZC5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXIsCiAgICAgIEVudmlyb25tZW50IGVudmlyb25tZW50LAogICAgICBBYnN0cmFjdFZhbHVlU3RyYXRlZ3kgYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5LAogICAgICBpci5Db21wb25lbnQgY29tcG9uZW50LAogICAgICBEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CgogICAgSnNLZXJuZWxUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCA9CiAgICAgICAgbmV3IEpzS2VybmVsVG9FbGVtZW50TWFwLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgICAgICAgb3B0aW9ucywgcmVwb3J0ZXIsIGVudmlyb25tZW50LCBjb21wb25lbnQsIHNvdXJjZSk7CiAgICBHbG9iYWxMb2NhbHNNYXAgZ2xvYmFsTG9jYWxzTWFwID0KICAgICAgICBuZXcgR2xvYmFsTG9jYWxzTWFwLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgc291cmNlLnJlZ2lzdGVyTG9jYWxMb29rdXAobmV3IExvY2FsTG9va3VwSW1wbChnbG9iYWxMb2NhbHNNYXApKTsKICAgIENsYXNzSGllcmFyY2h5IGNsYXNzSGllcmFyY2h5ID0gbmV3IENsYXNzSGllcmFyY2h5LnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgICBzb3VyY2UsIGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMpOwogICAgTmF0aXZlRGF0YSBuYXRpdmVEYXRhID0gbmV3IE5hdGl2ZURhdGEucmVhZEZyb21EYXRhU291cmNlKAogICAgICAgIHNvdXJjZSwgZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQpOwogICAgZWxlbWVudE1hcC5uYXRpdmVEYXRhID0gbmF0aXZlRGF0YTsKICAgIEludGVyY2VwdG9yRGF0YSBpbnRlcmNlcHRvckRhdGEgPSBuZXcgSW50ZXJjZXB0b3JEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgICBzb3VyY2UsIG5hdGl2ZURhdGEsIGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMpOwogICAgQmFja2VuZFVzYWdlIGJhY2tlbmRVc2FnZSA9IG5ldyBCYWNrZW5kVXNhZ2UucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBSdW50aW1lVHlwZXNOZWVkIHJ0aU5lZWQgPSBuZXcgUnVudGltZVR5cGVzTmVlZC5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgICAgc291cmNlLCBlbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudCk7CiAgICBKRmllbGRBbmFseXNpcyBhbGxvY2F0b3JBbmFseXNpcyA9CiAgICAgICAgbmV3IEpGaWVsZEFuYWx5c2lzLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UsIG9wdGlvbnMpOwogICAgTm9TdWNoTWV0aG9kRGF0YSBub1N1Y2hNZXRob2REYXRhID0KICAgICAgICBuZXcgTm9TdWNoTWV0aG9kRGF0YS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKCiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGltcGxlbWVudGVkQ2xhc3NlcyA9IHNvdXJjZS5yZWFkQ2xhc3NlcygpLnRvU2V0KCk7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGxpdmVOYXRpdmVDbGFzc2VzID0gc291cmNlLnJlYWRDbGFzc2VzKCkudG9TZXQoKTsKICAgIFNldDxNZW1iZXJFbnRpdHk+IGxpdmVJbnN0YW5jZU1lbWJlcnMgPSBzb3VyY2UucmVhZE1lbWJlcnMoKS50b1NldCgpOwogICAgU2V0PE1lbWJlckVudGl0eT4gYXNzaWduZWRJbnN0YW5jZU1lbWJlcnMgPSBzb3VyY2UucmVhZE1lbWJlcnMoKS50b1NldCgpOwogICAgU2V0PE1lbWJlckVudGl0eT4gcHJvY2Vzc2VkTWVtYmVycyA9IHNvdXJjZS5yZWFkTWVtYmVycygpLnRvU2V0KCk7CiAgICBNYXA8Q2xhc3NFbnRpdHksIFNldDxDbGFzc0VudGl0eT4+IG1peGluVXNlcyA9CiAgICAgICAgc291cmNlLnJlYWRDbGFzc01hcCgoKSA9PiBzb3VyY2UucmVhZENsYXNzZXMoKS50b1NldCgpKTsKICAgIE1hcDxDbGFzc0VudGl0eSwgU2V0PENsYXNzRW50aXR5Pj4gdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3NlcyA9CiAgICAgICAgc291cmNlLnJlYWRDbGFzc01hcCgoKSA9PiBzb3VyY2UucmVhZENsYXNzZXMoKS50b1NldCgpKTsKCiAgICBBbm5vdGF0aW9uc0RhdGEgYW5ub3RhdGlvbnNEYXRhID0KICAgICAgICBuZXcgQW5ub3RhdGlvbnNEYXRhLnJlYWRGcm9tRGF0YVNvdXJjZShvcHRpb25zLCBzb3VyY2UpOwoKICAgIENsb3N1cmVEYXRhIGNsb3N1cmVEYXRhID0KICAgICAgICBuZXcgQ2xvc3VyZURhdGEucmVhZEZyb21EYXRhU291cmNlKGVsZW1lbnRNYXAsIHNvdXJjZSk7CgogICAgT3V0cHV0VW5pdERhdGEgb3V0cHV0VW5pdERhdGEgPQogICAgICAgIG5ldyBPdXRwdXRVbml0RGF0YS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIGVsZW1lbnRNYXAubGF0ZU91dHB1dFVuaXREYXRhQnVpbGRlciA9CiAgICAgICAgbmV3IExhdGVPdXRwdXRVbml0RGF0YUJ1aWxkZXIob3V0cHV0VW5pdERhdGEpOwoKICAgIE1hcDxNZW1iZXJFbnRpdHksIE1lbWJlckFjY2Vzcz4gbWVtYmVyQWNjZXNzID0gc291cmNlLnJlYWRNZW1iZXJNYXAoCiAgICAgICAgKE1lbWJlckVudGl0eSBtZW1iZXIpID0+IG5ldyBNZW1iZXJBY2Nlc3MucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSkpOwoKICAgIHNvdXJjZS5lbmQodGFnKTsKCiAgICByZXR1cm4gbmV3IEpzQ2xvc2VkV29ybGQoCiAgICAgICAgZWxlbWVudE1hcCwKICAgICAgICBuYXRpdmVEYXRhLAogICAgICAgIGludGVyY2VwdG9yRGF0YSwKICAgICAgICBiYWNrZW5kVXNhZ2UsCiAgICAgICAgcnRpTmVlZCwKICAgICAgICBhbGxvY2F0b3JBbmFseXNpcywKICAgICAgICBub1N1Y2hNZXRob2REYXRhLAogICAgICAgIGltcGxlbWVudGVkQ2xhc3NlcywKICAgICAgICBsaXZlTmF0aXZlQ2xhc3NlcywKICAgICAgICBsaXZlSW5zdGFuY2VNZW1iZXJzLAogICAgICAgIGFzc2lnbmVkSW5zdGFuY2VNZW1iZXJzLAogICAgICAgIHByb2Nlc3NlZE1lbWJlcnMsCiAgICAgICAgbWl4aW5Vc2VzLAogICAgICAgIHR5cGVzSW1wbGVtZW50ZWRCeVN1YmNsYXNzZXMsCiAgICAgICAgY2xhc3NIaWVyYXJjaHksCiAgICAgICAgYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5LAogICAgICAgIGFubm90YXRpb25zRGF0YSwKICAgICAgICBnbG9iYWxMb2NhbHNNYXAsCiAgICAgICAgY2xvc3VyZURhdGEsCiAgICAgICAgb3V0cHV0VW5pdERhdGEsCiAgICAgICAgbWVtYmVyQWNjZXNzKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW0pzQ2xvc2VkV29ybGRdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBlbGVtZW50TWFwLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIGdsb2JhbExvY2Fsc01hcC53cml0ZVRvRGF0YVNpbmsoc2luayk7CgogICAgY2xhc3NIaWVyYXJjaHkud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgbmF0aXZlRGF0YS53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBpbnRlcmNlcHRvckRhdGEud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgYmFja2VuZFVzYWdlLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHJ0aU5lZWQud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgZmllbGRBbmFseXNpcy53cml0ZVRvRGF0YVNpbmsoc2luayk7CiAgICBub1N1Y2hNZXRob2REYXRhLndyaXRlVG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsud3JpdGVDbGFzc2VzKGltcGxlbWVudGVkQ2xhc3Nlcyk7CiAgICBzaW5rLndyaXRlQ2xhc3NlcyhsaXZlTmF0aXZlQ2xhc3Nlcyk7CiAgICBzaW5rLndyaXRlTWVtYmVycyhsaXZlSW5zdGFuY2VNZW1iZXJzKTsKICAgIHNpbmsud3JpdGVNZW1iZXJzKGFzc2lnbmVkSW5zdGFuY2VNZW1iZXJzKTsKICAgIHNpbmsud3JpdGVNZW1iZXJzKHByb2Nlc3NlZE1lbWJlcnMpOwogICAgc2luay53cml0ZUNsYXNzTWFwKAogICAgICAgIG1peGluVXNlcywgKFNldDxDbGFzc0VudGl0eT4gc2V0KSA9PiBzaW5rLndyaXRlQ2xhc3NlcyhzZXQpKTsKICAgIHNpbmsud3JpdGVDbGFzc01hcCh0eXBlc0ltcGxlbWVudGVkQnlTdWJjbGFzc2VzLAogICAgICAgIChTZXQ8Q2xhc3NFbnRpdHk+IHNldCkgPT4gc2luay53cml0ZUNsYXNzZXMoc2V0KSk7CiAgICBhbm5vdGF0aW9uc0RhdGEud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgY2xvc3VyZURhdGFMb29rdXAud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgb3V0cHV0VW5pdERhdGEud3JpdGVUb0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZU1lbWJlck1hcCgKICAgICAgICBtZW1iZXJBY2Nlc3MsCiAgICAgICAgKE1lbWJlckVudGl0eSBtZW1iZXIsIE1lbWJlckFjY2VzcyBhY2Nlc3MpID0+CiAgICAgICAgICAgIGFjY2Vzcy53cml0ZVRvRGF0YVNpbmsoc2luaykpOwogICAgc2luay5lbmQodGFnKTsKICB9CgogIEBvdmVycmlkZQogIEpFbGVtZW50RW52aXJvbm1lbnQgZ2V0IGVsZW1lbnRFbnZpcm9ubWVudCA9PiBlbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudDsKCiAgQG92ZXJyaWRlCiAgSkNvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50cyA9PiBlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZXMgZ2V0IGRhcnRUeXBlcyA9PiBlbGVtZW50TWFwLnR5cGVzOwoKICBAb3ZlcnJpZGUKICBib29sIGlzSW1wbGVtZW50ZWQoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gaW1wbGVtZW50ZWRDbGFzc2VzLmNvbnRhaW5zKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXRMdWJPZkluc3RhbnRpYXRlZFN1YmNsYXNzZXMoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBpZiAobmF0aXZlRGF0YS5pc0pzSW50ZXJvcENsYXNzKGNscykpIHsKICAgICAgcmV0dXJuIGNvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdE9iamVjdENsYXNzOwogICAgfQogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIGhpZXJhcmNoeSA9IGNsYXNzSGllcmFyY2h5LmdldENsYXNzSGllcmFyY2h5Tm9kZShjbHMpOwogICAgcmV0dXJuIGhpZXJhcmNoeSAhPSBudWxsCiAgICAgICAgPyBoaWVyYXJjaHkuZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJjbGFzc2VzKCkKICAgICAgICA6IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXRMdWJPZkluc3RhbnRpYXRlZFN1YnR5cGVzKENsYXNzRW50aXR5IGNscykgewogICAgaWYgKG5hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyhjbHMpKSB7CiAgICAgIHJldHVybiBjb21tb25FbGVtZW50cy5qc0phdmFTY3JpcHRPYmplY3RDbGFzczsKICAgIH0KICAgIENsYXNzU2V0IGNsYXNzU2V0ID0gY2xhc3NIaWVyYXJjaHkuZ2V0Q2xhc3NTZXQoY2xzKTsKICAgIHJldHVybiBjbGFzc1NldCAhPSBudWxsID8gY2xhc3NTZXQuZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJ0eXBlcygpIDogbnVsbDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNVc2VkQXNNaXhpbihDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiAhbWl4aW5Vc2VzT2YoY2xzKS5pc0VtcHR5OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNBbnlTdWJjbGFzc09mTWl4aW5Vc2VUaGF0SW1wbGVtZW50cygKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCBDbGFzc0VudGl0eSB0eXBlKSB7CiAgICByZXR1cm4gbWl4aW5Vc2VzT2YoY2xzKQogICAgICAgIC5hbnkoKHVzZSkgPT4gaGFzQW55U3ViY2xhc3NUaGF0SW1wbGVtZW50cyh1c2UsIHR5cGUpKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZXZlcnlTdWJ0eXBlSXNTdWJjbGFzc09mT3JNaXhpblVzZU9mKENsYXNzRW50aXR5IHgsIENsYXNzRW50aXR5IHkpIHsKICAgIE1hcDxDbGFzc0VudGl0eSwgYm9vbD4gc2Vjb25kTWFwID0KICAgICAgICBfc3VidHlwZUNvdmVyZWRCeUNhY2hlW3hdID8/PSA8Q2xhc3NFbnRpdHksIGJvb2w+e307CiAgICByZXR1cm4gc2Vjb25kTWFwW3ldID8/PSBjbGFzc0hpZXJhcmNoeS5zdWJ0eXBlc09mKHgpLmV2ZXJ5KAogICAgICAgIChDbGFzc0VudGl0eSBjbHMpID0+CiAgICAgICAgICAgIGNsYXNzSGllcmFyY2h5LmlzU3ViY2xhc3NPZihjbHMsIHkpIHx8CiAgICAgICAgICAgIGlzU3ViY2xhc3NPZk1peGluVXNlT2YoY2xzLCB5KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc0FueVN1YmNsYXNzVGhhdEltcGxlbWVudHMoQ2xhc3NFbnRpdHkgc3VwZXJjbGFzcywgQ2xhc3NFbnRpdHkgdHlwZSkgewogICAgU2V0PENsYXNzRW50aXR5PiBzdWJjbGFzc2VzID0gdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3Nlc1tzdXBlcmNsYXNzXTsKICAgIGlmIChzdWJjbGFzc2VzID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBzdWJjbGFzc2VzLmNvbnRhaW5zKHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBuZWVkc05vU3VjaE1ldGhvZCgKICAgICAgQ2xhc3NFbnRpdHkgYmFzZSwgU2VsZWN0b3Igc2VsZWN0b3IsIENsYXNzUXVlcnkgcXVlcnkpIHsKICAgIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBzdWJjbGFzc2VzIGluIHRoZSBbcm9vdE5vZGVdIHRyZWUgbmVlZHMgbm9TdWNoTWV0aG9kCiAgICAvLy8gaGFuZGxpbmcuCiAgICBib29sIHN1YmNsYXNzZXNOZWVkTm9TdWNoTWV0aG9kKENsYXNzSGllcmFyY2h5Tm9kZSByb290Tm9kZSkgewogICAgICBpZiAoIXJvb3ROb2RlLmlzSW5zdGFudGlhdGVkKSB7CiAgICAgICAgLy8gTm8gc3ViY2xhc3MgbmVlZHMgbm9TdWNoTWV0aG9kIGhhbmRsaW5nIHNpbmNlIHRoZXkgYXJlIGFsbAogICAgICAgIC8vIHVuaW5zdGFudGlhdGVkLgogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBDbGFzc0VudGl0eSByb290Q2xhc3MgPSByb290Tm9kZS5jbHM7CiAgICAgIGlmIChfaGFzQ29uY3JldGVNYXRjaChyb290Q2xhc3MsIHNlbGVjdG9yKSkgewogICAgICAgIC8vIFRoZSByb290IHN1YmNsYXNzIGhhcyBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIHNvIG5vIHN1YmNsYXNzIG5lZWRzCiAgICAgICAgLy8gbm9TdWNoTWV0aG9kIGhhbmRsaW5nLgogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSBlbHNlIGlmIChyb290Tm9kZS5pc0V4cGxpY2l0bHlJbnN0YW50aWF0ZWQpIHsKICAgICAgICAvLyBUaGUgcm9vdCBjbGFzcyBuZWVkIG5vU3VjaE1ldGhvZCBoYW5kbGluZy4KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBJdGVyYXRpb25TdGVwIHJlc3VsdCA9IHJvb3ROb2RlLmZvckVhY2hTdWJjbGFzcygoQ2xhc3NFbnRpdHkgc3ViY2xhc3MpIHsKICAgICAgICBpZiAoX2hhc0NvbmNyZXRlTWF0Y2goc3ViY2xhc3MsIHNlbGVjdG9yLAogICAgICAgICAgICBzdG9wQXRTdXBlcmNsYXNzOiByb290Q2xhc3MpKSB7CiAgICAgICAgICAvLyBGb3VuZCBhIG1hdGNoIC0gc2tpcCBhbGwgc3ViY2xhc3Nlcy4KICAgICAgICAgIHJldHVybiBJdGVyYXRpb25TdGVwLlNLSVBfU1VCQ0xBU1NFUzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gU3RvcCBmYXN0IC0gd2UgZm91bmQgYSBuZWVkIGZvciBub1N1Y2hNZXRob2QgaGFuZGxpbmcuCiAgICAgICAgICByZXR1cm4gSXRlcmF0aW9uU3RlcC5TVE9QOwogICAgICAgIH0KICAgICAgfSwgQ2xhc3NIaWVyYXJjaHlOb2RlLkVYUExJQ0lUTFlfSU5TVEFOVElBVEVELCBzdHJpY3Q6IHRydWUpOwogICAgICAvLyBXZSBzdG9wcGVkIGZhc3Qgc28gd2UgbmVlZCBub1N1Y2hNZXRob2QgaGFuZGxpbmcuCiAgICAgIHJldHVybiByZXN1bHQgPT0gSXRlcmF0aW9uU3RlcC5TVE9QOwogICAgfQoKICAgIENsYXNzU2V0IGNsYXNzU2V0ID0gY2xhc3NIaWVyYXJjaHkuZ2V0Q2xhc3NTZXQoYmFzZSk7CiAgICBhc3NlcnQoY2xhc3NTZXQgIT0gbnVsbCwgZmFpbGVkQXQoYmFzZSwgIk5vIGNsYXNzIHNldCBmb3IgJGJhc2UuIikpOwogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUgPSBjbGFzc1NldC5ub2RlOwogICAgaWYgKHF1ZXJ5ID09IENsYXNzUXVlcnkuRVhBQ1QpIHsKICAgICAgcmV0dXJuIG5vZGUuaXNFeHBsaWNpdGx5SW5zdGFudGlhdGVkICYmCiAgICAgICAgICAhX2hhc0NvbmNyZXRlTWF0Y2goYmFzZSwgc2VsZWN0b3IpOwogICAgfSBlbHNlIGlmIChxdWVyeSA9PSBDbGFzc1F1ZXJ5LlNVQkNMQVNTKSB7CiAgICAgIHJldHVybiBzdWJjbGFzc2VzTmVlZE5vU3VjaE1ldGhvZChub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChzdWJjbGFzc2VzTmVlZE5vU3VjaE1ldGhvZChub2RlKSkgcmV0dXJuIHRydWU7CiAgICAgIGZvciAoQ2xhc3NIaWVyYXJjaHlOb2RlIHN1YnR5cGVOb2RlIGluIGNsYXNzU2V0LnN1YnR5cGVOb2RlcykgewogICAgICAgIGlmIChzdWJjbGFzc2VzTmVlZE5vU3VjaE1ldGhvZChzdWJ0eXBlTm9kZSkpIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBjb21tb25TdXBlcnR5cGVzT2YoSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGNsYXNzZXMpIHsKICAgIEl0ZXJhdG9yPENsYXNzRW50aXR5PiBpdGVyYXRvciA9IGNsYXNzZXMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHJldHVybiBjb25zdCA8Q2xhc3NFbnRpdHk+W107CgogICAgQ2xhc3NFbnRpdHkgY2xzID0gaXRlcmF0b3IuY3VycmVudDsKICAgIE9yZGVyZWRUeXBlU2V0IHR5cGVTZXQgPSBlbGVtZW50TWFwLmdldE9yZGVyZWRUeXBlU2V0KGNscyk7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHJldHVybiB0eXBlU2V0LnR5cGVzLm1hcCgodHlwZSkgPT4gdHlwZS5lbGVtZW50KTsKCiAgICBpbnQgZGVwdGggPSB0eXBlU2V0Lm1heERlcHRoOwogICAgTGluazxPcmRlcmVkVHlwZVNldD4gb3RoZXJUeXBlU2V0cyA9IGNvbnN0IExpbms8T3JkZXJlZFR5cGVTZXQ+KCk7CiAgICBkbyB7CiAgICAgIENsYXNzRW50aXR5IG90aGVyQ2xhc3MgPSBpdGVyYXRvci5jdXJyZW50OwogICAgICBPcmRlcmVkVHlwZVNldCBvdGhlclR5cGVTZXQgPSBlbGVtZW50TWFwLmdldE9yZGVyZWRUeXBlU2V0KG90aGVyQ2xhc3MpOwogICAgICBvdGhlclR5cGVTZXRzID0gb3RoZXJUeXBlU2V0cy5wcmVwZW5kKG90aGVyVHlwZVNldCk7CiAgICAgIGlmIChvdGhlclR5cGVTZXQubWF4RGVwdGggPCBkZXB0aCkgewogICAgICAgIGRlcHRoID0gb3RoZXJUeXBlU2V0Lm1heERlcHRoOwogICAgICB9CiAgICB9IHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKTsKCiAgICBMaXN0PENsYXNzRW50aXR5PiBjb21tb25TdXBlcnR5cGVzID0gPENsYXNzRW50aXR5PltdOwogICAgT1VURVI6CiAgICBmb3IgKExpbms8SW50ZXJmYWNlVHlwZT4gbGluayA9IHR5cGVTZXRbZGVwdGhdOwogICAgICAgIGxpbmsuaGVhZC5lbGVtZW50ICE9IGNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzOwogICAgICAgIGxpbmsgPSBsaW5rLnRhaWwpIHsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gbGluay5oZWFkLmVsZW1lbnQ7CiAgICAgIGZvciAoTGluazxPcmRlcmVkVHlwZVNldD4gbGluayA9IG90aGVyVHlwZVNldHM7CiAgICAgICAgICAhbGluay5pc0VtcHR5OwogICAgICAgICAgbGluayA9IGxpbmsudGFpbCkgewogICAgICAgIGlmIChsaW5rLmhlYWQuYXNJbnN0YW5jZU9mKGNscywgZWxlbWVudE1hcC5nZXRIaWVyYXJjaHlEZXB0aChjbHMpKSA9PQogICAgICAgICAgICBudWxsKSB7CiAgICAgICAgICBjb250aW51ZSBPVVRFUjsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29tbW9uU3VwZXJ0eXBlcy5hZGQoY2xzKTsKICAgIH0KICAgIGNvbW1vblN1cGVydHlwZXMuYWRkKGNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKTsKICAgIHJldHVybiBjb21tb25TdXBlcnR5cGVzOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IG1peGluVXNlc09mKENsYXNzRW50aXR5IGNscykgewogICAgaWYgKF9saXZlTWl4aW5Vc2VzID09IG51bGwpIHsKICAgICAgX2xpdmVNaXhpblVzZXMgPSBuZXcgTWFwPENsYXNzRW50aXR5LCBMaXN0PENsYXNzRW50aXR5Pj4oKTsKICAgICAgZm9yIChDbGFzc0VudGl0eSBtaXhpbiBpbiBtaXhpblVzZXMua2V5cykgewogICAgICAgIExpc3Q8Q2xhc3NFbnRpdHk+IHVzZXMgPSA8Q2xhc3NFbnRpdHk+W107CgogICAgICAgIHZvaWQgYWRkTGl2ZVVzZShDbGFzc0VudGl0eSBtaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgICBpZiAoY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQobWl4aW5BcHBsaWNhdGlvbikpIHsKICAgICAgICAgICAgdXNlcy5hZGQobWl4aW5BcHBsaWNhdGlvbik7CiAgICAgICAgICB9IGVsc2UgaWYgKF9pc05hbWVkTWl4aW5BcHBsaWNhdGlvbihtaXhpbkFwcGxpY2F0aW9uKSkgewogICAgICAgICAgICBTZXQ8Q2xhc3NFbnRpdHk+IG5leHQgPSBtaXhpblVzZXNbbWl4aW5BcHBsaWNhdGlvbl07CiAgICAgICAgICAgIGlmIChuZXh0ICE9IG51bGwpIHsKICAgICAgICAgICAgICBuZXh0LmZvckVhY2goYWRkTGl2ZVVzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG1peGluVXNlc1ttaXhpbl0uZm9yRWFjaChhZGRMaXZlVXNlKTsKICAgICAgICBpZiAodXNlcy5pc05vdEVtcHR5KSB7CiAgICAgICAgICBfbGl2ZU1peGluVXNlc1ttaXhpbl0gPSB1c2VzOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IHVzZXMgPSBfbGl2ZU1peGluVXNlc1tjbHNdOwogICAgcmV0dXJuIHVzZXMgIT0gbnVsbCA/IHVzZXMgOiBjb25zdCA8Q2xhc3NFbnRpdHk+W107CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc0FueVN1YmNsYXNzVGhhdE1peGVzKENsYXNzRW50aXR5IHN1cGVyY2xhc3MsIENsYXNzRW50aXR5IG1peGluKSB7CiAgICByZXR1cm4gbWl4aW5Vc2VzT2YobWl4aW4pLmFueSgoQ2xhc3NFbnRpdHkgZWFjaCkgewogICAgICByZXR1cm4gY2xhc3NIaWVyYXJjaHkuaXNTdWJjbGFzc09mKGVhY2gsIHN1cGVyY2xhc3MpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU3ViY2xhc3NPZk1peGluVXNlT2YoQ2xhc3NFbnRpdHkgY2xzLCBDbGFzc0VudGl0eSBtaXhpbikgewogICAgaWYgKGlzVXNlZEFzTWl4aW4obWl4aW4pKSB7CiAgICAgIENsYXNzRW50aXR5IGN1cnJlbnQgPSBjbHM7CiAgICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKICAgICAgICBDbGFzc0VudGl0eSBjdXJyZW50TWl4aW4gPSBlbGVtZW50TWFwLmdldEFwcGxpZWRNaXhpbihjdXJyZW50KTsKICAgICAgICBpZiAoY3VycmVudE1peGluID09IG1peGluKSByZXR1cm4gdHJ1ZTsKICAgICAgICBjdXJyZW50ID0gZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY3VycmVudCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgX2Vuc3VyZUZ1bmN0aW9uU2V0KCkgewogICAgaWYgKF9hbGxGdW5jdGlvbnMgPT0gbnVsbCkgewogICAgICAvLyBbRnVuY3Rpb25TZXRdIGlzIGNyZWF0ZWQgbGF6aWx5IGJlY2F1c2UgaXQgaXMgbm90IHVzZWQgd2hlbiB3ZSBzd2l0Y2gKICAgICAgLy8gZnJvbSBhIGZyb250ZW5kIHRvIGEgYmFja2VuZCBtb2RlbCBiZWZvcmUgaW5mZXJlbmNlLgogICAgICBfYWxsRnVuY3Rpb25zID0gbmV3IEZ1bmN0aW9uU2V0KGxpdmVJbnN0YW5jZU1lbWJlcnMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpbmNsdWRlc0Nsb3N1cmVDYWxsKFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyKSB7CiAgICByZXR1cm4gc2VsZWN0b3IubmFtZSA9PSBJZGVudGlmaWVycy5jYWxsICYmCiAgICAgICAgKHJlY2VpdmVyID09IG51bGwgfHwKICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hvdWxkIHRoaXMgaGF2ZSBiZWVuIGBpbnRlcnNlY3RzYCBpbnN0ZWFkPwogICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAgICAgICAuY29udGFpbnMocmVjZWl2ZXIsIGFic3RyYWN0VmFsdWVEb21haW4uZnVuY3Rpb25UeXBlKQogICAgICAgICAgICAgICAgLmlzUG90ZW50aWFsbHlUcnVlKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVJlY2VpdmVyVHlwZShTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlcikgewogICAgX2Vuc3VyZUZ1bmN0aW9uU2V0KCk7CiAgICBpZiAoaW5jbHVkZXNDbG9zdXJlQ2FsbChzZWxlY3RvciwgcmVjZWl2ZXIpKSB7CiAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogICAgfQogICAgcmV0dXJuIF9hbGxGdW5jdGlvbnMucmVjZWl2ZXJUeXBlKHNlbGVjdG9yLCByZWNlaXZlciwgYWJzdHJhY3RWYWx1ZURvbWFpbik7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGxvY2F0ZU1lbWJlcnMoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyKSB7CiAgICBfZW5zdXJlRnVuY3Rpb25TZXQoKTsKICAgIHJldHVybiBfYWxsRnVuY3Rpb25zLmZpbHRlcihzZWxlY3RvciwgcmVjZWl2ZXIsIGFic3RyYWN0VmFsdWVEb21haW4pOwogIH0KCiAgYm9vbCBoYXNBbnlVc2VyRGVmaW5lZEdldHRlcihTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlcikgewogICAgX2Vuc3VyZUZ1bmN0aW9uU2V0KCk7CiAgICByZXR1cm4gX2FsbEZ1bmN0aW9ucwogICAgICAgIC5maWx0ZXIoc2VsZWN0b3IsIHJlY2VpdmVyLCBhYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5hbnkoKGVhY2gpID0+IGVhY2guaXNHZXR0ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGxvY2F0ZVNpbmdsZU1lbWJlcihTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlcikgewogICAgaWYgKGluY2x1ZGVzQ2xvc3VyZUNhbGwoc2VsZWN0b3IsIHJlY2VpdmVyKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJlY2VpdmVyID8/PSBhYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogICAgcmV0dXJuIGFic3RyYWN0VmFsdWVEb21haW4ubG9jYXRlU2luZ2xlTWVtYmVyKHJlY2VpdmVyLCBzZWxlY3Rvcik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGZpZWxkTmV2ZXJDaGFuZ2VzKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBpZiAoIWVsZW1lbnQuaXNGaWVsZCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG5hdGl2ZURhdGEuaXNOYXRpdmVNZW1iZXIoZWxlbWVudCkpIHsKICAgICAgLy8gU29tZSBuYXRpdmUgZmllbGRzIGFyZSB2aWV3cyBvZiBkYXRhIHRoYXQgbWF5IGJlIGNoYW5nZWQgYnkgb3BlcmF0aW9ucy4KICAgICAgLy8gRS5nLiBub2RlLmZpcnN0Q2hpbGQgZGVwZW5kcyBvbiBwYXJlbnROb2RlLnJlbW92ZUJlZm9yZShuMSwgbjIpLgogICAgICAvLyBUT0RPKHNyYSk6IFJlZmluZSB0aGUgZWZmZWN0IGNsYXNzaWZpY2F0aW9uIHNvIHRoYXQgbmF0aXZlIGVmZmVjdHMgYXJlCiAgICAgIC8vIGRpc3RpbmN0IGZyb20gb3JkaW5hcnkgRGFydCBlZmZlY3RzLgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKCFlbGVtZW50LmlzQXNzaWduYWJsZSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgcmV0dXJuICFhc3NpZ25lZEluc3RhbmNlTWVtYmVycy5jb250YWlucyhlbGVtZW50KTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIFNvcnRlciBnZXQgc29ydGVyIHsKICAgIHJldHVybiBfc29ydGVyID8/PSBuZXcgS2VybmVsU29ydGVyKGVsZW1lbnRNYXApOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgYWJzdHJhY3RWYWx1ZURvbWFpbiB7CiAgICByZXR1cm4gX2Fic3RyYWN0VmFsdWVEb21haW47CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc0VsZW1lbnRJbihDbGFzc0VudGl0eSBjbHMsIE5hbWUgbmFtZSwgRW50aXR5IGVsZW1lbnQpIHsKICAgIHdoaWxlIChjbHMgIT0gbnVsbCkgewogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgICAubG9va3VwTG9jYWxDbGFzc01lbWJlcihjbHMsIG5hbWUudGV4dCwgc2V0dGVyOiBuYW1lLmlzU2V0dGVyKTsKICAgICAgaWYgKG1lbWJlciAhPSBudWxsICYmCiAgICAgICAgICAhbWVtYmVyLmlzQWJzdHJhY3QgJiYKICAgICAgICAgICghbmFtZS5pc1ByaXZhdGUgfHwgbWVtYmVyLmxpYnJhcnkgPT0gbmFtZS5saWJyYXJ5KSkgewogICAgICAgIHJldHVybiBtZW1iZXIgPT0gZWxlbWVudDsKICAgICAgfQogICAgICBjbHMgPSBlbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhjbHMpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIFJldHVybnMgd2hldGhlciBhIFtzZWxlY3Rvcl0gY2FsbCBvbiBhbiBpbnN0YW5jZSBvZiBbY2xzXQogIC8vLyB3aWxsIGhpdCBhIG1ldGhvZCBhdCBydW50aW1lLCBhbmQgbm90IGdvIHRocm91Z2ggW25vU3VjaE1ldGhvZF0uCiAgYm9vbCBfaGFzQ29uY3JldGVNYXRjaChDbGFzc0VudGl0eSBjbHMsIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICB7Q2xhc3NFbnRpdHkgc3RvcEF0U3VwZXJjbGFzc30pIHsKICAgIGFzc2VydChjbGFzc0hpZXJhcmNoeS5pc0luc3RhbnRpYXRlZChjbHMpLAogICAgICAgIGZhaWxlZEF0KGNscywgJyRjbHMgaGFzIG5vdCBiZWVuIGluc3RhbnRpYXRlZC4nKSk7CiAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCA9IGVsZW1lbnRFbnZpcm9ubWVudAogICAgICAgIC5sb29rdXBDbGFzc01lbWJlcihjbHMsIHNlbGVjdG9yLm5hbWUsIHNldHRlcjogc2VsZWN0b3IuaXNTZXR0ZXIpOwogICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwoKICAgIGlmIChlbGVtZW50LmlzQWJzdHJhY3QpIHsKICAgICAgQ2xhc3NFbnRpdHkgZW5jbG9zaW5nQ2xhc3MgPSBlbGVtZW50LmVuY2xvc2luZ0NsYXNzOwogICAgICByZXR1cm4gX2hhc0NvbmNyZXRlTWF0Y2goCiAgICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhlbmNsb3NpbmdDbGFzcyksIHNlbGVjdG9yKTsKICAgIH0KICAgIHJldHVybiBzZWxlY3Rvci5hcHBsaWVzVW5uYW1lZChlbGVtZW50KTsKICB9CgogIGJvb2wgX2lzTmFtZWRNaXhpbkFwcGxpY2F0aW9uKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRFbnZpcm9ubWVudC5pc01peGluQXBwbGljYXRpb24oY2xzKSAmJgogICAgICAgICFlbGVtZW50RW52aXJvbm1lbnQuaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbihjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyQWNjZXNzIGdldE1lbWJlckFjY2VzcyhNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICByZXR1cm4gbWVtYmVyQWNjZXNzW21lbWJlcl07CiAgfQp9CgpjbGFzcyBLZXJuZWxTb3J0ZXIgaW1wbGVtZW50cyBTb3J0ZXIgewogIGZpbmFsIEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXA7CgogIEtlcm5lbFNvcnRlcih0aGlzLmVsZW1lbnRNYXApOwoKICBpbnQgX2NvbXBhcmVMaWJyYXJpZXMoTGlicmFyeUVudGl0eSBhLCBMaWJyYXJ5RW50aXR5IGIpIHsKICAgIHJldHVybiB1dGlscy5jb21wYXJlTGlicmFyaWVzVXJpcyhhLmNhbm9uaWNhbFVyaSwgYi5jYW5vbmljYWxVcmkpOwogIH0KCiAgaW50IF9jb21wYXJlU291cmNlU3BhbnMoRW50aXR5IGVudGl0eTEsIFNvdXJjZVNwYW4gc291cmNlU3BhbjEsCiAgICAgIEVudGl0eSBlbnRpdHkyLCBTb3VyY2VTcGFuIHNvdXJjZVNwYW4yKSB7CiAgICBpbnQgciA9IHV0aWxzLmNvbXBhcmVTb3VyY2VVcmlzKHNvdXJjZVNwYW4xLnVyaSwgc291cmNlU3BhbjIudXJpKTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgcmV0dXJuIHV0aWxzLmNvbXBhcmVFbnRpdGllcygKICAgICAgICBlbnRpdHkxLCBzb3VyY2VTcGFuMS5iZWdpbiwgbnVsbCwgZW50aXR5Miwgc291cmNlU3BhbjIuYmVnaW4sIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8TGlicmFyeUVudGl0eT4gc29ydExpYnJhcmllcyhJdGVyYWJsZTxMaWJyYXJ5RW50aXR5PiBsaWJyYXJpZXMpIHsKICAgIHJldHVybiBsaWJyYXJpZXMudG9MaXN0KCkuLnNvcnQoX2NvbXBhcmVMaWJyYXJpZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8VD4gc29ydE1lbWJlcnM8VCBleHRlbmRzIE1lbWJlckVudGl0eT4oSXRlcmFibGU8VD4gbWVtYmVycykgewogICAgcmV0dXJuIG1lbWJlcnMudG9MaXN0KCkuLnNvcnQoY29tcGFyZU1lbWJlcnNCeUxvY2F0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBzb3J0Q2xhc3NlcyhJdGVyYWJsZTxDbGFzc0VudGl0eT4gY2xhc3NlcykgewogICAgTGlzdDxDbGFzc0VudGl0eT4gcmVndWxhckNsYXNzZXMgPSA8Q2xhc3NFbnRpdHk+W107CiAgICBMaXN0PENsYXNzRW50aXR5PiB1bm5hbWVkTWl4aW5zID0gPENsYXNzRW50aXR5PltdOwogICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gY2xhc3NlcykgewogICAgICBpZiAoZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbihjbHMpKSB7CiAgICAgICAgdW5uYW1lZE1peGlucy5hZGQoY2xzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZWd1bGFyQ2xhc3Nlcy5hZGQoY2xzKTsKICAgICAgfQogICAgfQogICAgTGlzdDxDbGFzc0VudGl0eT4gc29ydGVkID0gPENsYXNzRW50aXR5PltdOwogICAgcmVndWxhckNsYXNzZXMuc29ydChjb21wYXJlQ2xhc3Nlc0J5TG9jYXRpb24pOwogICAgc29ydGVkLmFkZEFsbChyZWd1bGFyQ2xhc3Nlcyk7CiAgICB1bm5hbWVkTWl4aW5zLnNvcnQoKGEsIGIpIHsKICAgICAgaW50IHJlc3VsdCA9IF9jb21wYXJlTGlicmFyaWVzKGEubGlicmFyeSwgYi5saWJyYXJ5KTsKICAgICAgaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gcmVzdWx0OwogICAgICByZXN1bHQgPSBhLm5hbWUuY29tcGFyZVRvKGIubmFtZSk7CiAgICAgIGFzc2VydChyZXN1bHQgIT0gMCwKICAgICAgICAgIGZhaWxlZEF0KGEsICJNdWx0aXBsZSBtaXhpbnMgbmFtZWQgJHthLm5hbWV9OiAkYSB2cyAkYi4iKSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9KTsKICAgIHNvcnRlZC5hZGRBbGwodW5uYW1lZE1peGlucyk7CiAgICByZXR1cm4gc29ydGVkOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8VHlwZWRlZkVudGl0eT4gc29ydFR5cGVkZWZzKEl0ZXJhYmxlPFR5cGVkZWZFbnRpdHk+IHR5cGVkZWZzKSB7CiAgICAvLyBUT0RPKHJlZGVtcHRpb24pOiBTdXBwb3J0IHRoaXMuCiAgICBhc3NlcnQodHlwZWRlZnMuaXNFbXB0eSk7CiAgICByZXR1cm4gdHlwZWRlZnM7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgY29tcGFyZUxpYnJhcmllc0J5TG9jYXRpb24oTGlicmFyeUVudGl0eSBhLCBMaWJyYXJ5RW50aXR5IGIpIHsKICAgIHJldHVybiBfY29tcGFyZUxpYnJhcmllcyhhLCBiKTsKICB9CgogIEBvdmVycmlkZQogIGludCBjb21wYXJlQ2xhc3Nlc0J5TG9jYXRpb24oQ2xhc3NFbnRpdHkgYSwgQ2xhc3NFbnRpdHkgYikgewogICAgaW50IHIgPSBfY29tcGFyZUxpYnJhcmllcyhhLmxpYnJhcnksIGIubGlicmFyeSk7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICAgIENsYXNzRGVmaW5pdGlvbiBkZWZpbml0aW9uMSA9IGVsZW1lbnRNYXAuZ2V0Q2xhc3NEZWZpbml0aW9uKGEpOwogICAgQ2xhc3NEZWZpbml0aW9uIGRlZmluaXRpb24yID0gZWxlbWVudE1hcC5nZXRDbGFzc0RlZmluaXRpb24oYik7CiAgICByZXR1cm4gX2NvbXBhcmVTb3VyY2VTcGFucygKICAgICAgICBhLCBkZWZpbml0aW9uMS5sb2NhdGlvbiwgYiwgZGVmaW5pdGlvbjIubG9jYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGNvbXBhcmVUeXBlZGVmc0J5TG9jYXRpb24oVHlwZWRlZkVudGl0eSBhLCBUeXBlZGVmRW50aXR5IGIpIHsKICAgIC8vIFRPRE8ocmVkZW1wdGlvbik6IFN1cHBvcnQgdGhpcy4KICAgIGZhaWxlZEF0KGEsICdLZXJuZWxTb3J0ZXIuY29tcGFyZVR5cGVkZWZzQnlMb2NhdGlvbiB1bmltcGxlbWVudGVkJyk7CiAgICByZXR1cm4gMDsKICB9CgogIEBvdmVycmlkZQogIGludCBjb21wYXJlTWVtYmVyc0J5TG9jYXRpb24oTWVtYmVyRW50aXR5IGEsIE1lbWJlckVudGl0eSBiKSB7CiAgICBpbnQgciA9IF9jb21wYXJlTGlicmFyaWVzKGEubGlicmFyeSwgYi5saWJyYXJ5KTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgTWVtYmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uMSA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyRGVmaW5pdGlvbihhKTsKICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbjIgPSBlbGVtZW50TWFwLmdldE1lbWJlckRlZmluaXRpb24oYik7CiAgICByZXR1cm4gX2NvbXBhcmVTb3VyY2VTcGFucygKICAgICAgICBhLCBkZWZpbml0aW9uMS5sb2NhdGlvbiwgYiwgZGVmaW5pdGlvbjIubG9jYXRpb24pOwogIH0KfQoKLy8vIFtMb2NhbExvb2t1cF0gaW1wbGVtZW50YXRpb24gdXNlZCB0byBkZXNlcmlhbGl6ZSBbSnNDbG9zZWRXb3JsZF0uCmNsYXNzIExvY2FsTG9va3VwSW1wbCBpbXBsZW1lbnRzIExvY2FsTG9va3VwIHsKICBmaW5hbCBHbG9iYWxMb2NhbHNNYXAgX2dsb2JhbExvY2Fsc01hcDsKCiAgTG9jYWxMb29rdXBJbXBsKHRoaXMuX2dsb2JhbExvY2Fsc01hcCk7CgogIEBvdmVycmlkZQogIExvY2FsIGdldExvY2FsQnlJbmRleChNZW1iZXJFbnRpdHkgbWVtYmVyQ29udGV4dCwgaW50IGluZGV4KSB7CiAgICBLZXJuZWxUb0xvY2Fsc01hcEltcGwgbWFwID0gX2dsb2JhbExvY2Fsc01hcC5nZXRMb2NhbHNNYXAobWVtYmVyQ29udGV4dCk7CiAgICByZXR1cm4gbWFwLmdldExvY2FsQnlJbmRleChpbmRleCk7CiAgfQp9CoKdAE5OPAEoRAEaGR9MIDIkMSEhHjEkKSwrLik1NiIiGi4rJTkoJBgbIBYBLiwBDB8MKQwjDCsBHQE2NgFJAUovAUAtAS8BTTMBDCwBDCwBDCcBKQwiLAwmDCkMKQwnDCcSATYBERcXHBkUGh0fHiAkHRYpGzMcHB4bG0UEATssHyMfMx4bFwEmNUAmOEZLLD8wKE44TUgwJ0AoOQFIR0pORzNBRkEBJkEBHkABJDcrNwFJTwEVAR4UFBkWERsaHBsdIRoTJhgfGRkVGBcEATEoFSYrASomKygjKSwrKiwwKRhGNTsrLSoZFjYrEwQBDE8BDEMBDC8BDCgtBAEMQCw1Bk4dNRAEAQw+LDUGOU4EAQwoJgQBDC8rHEAEAQxMJz1AHTMtBAEMUEwqJgQBDBo/TxJDJkYbFggsNFAiFjY2FQhPMiwyMBFEJQpEOysGATpJLSUuLi8vDTlGQggUBgQBDEw3PAEoQFABIkcJMU47KycIIwE6CzQ5HCs2GR5OFBoKCCEGNh0EAQw3IkIyMgE4QShDQSAoDgwKAS4fKAoIBjY4BAEMTDc8CAQBDEQgISBIMD0IBhIEAR4hTz48BgQBDEgwHVAgRiUEAQxRGjMuBlAEAQwoMxpKBAFMGhk5JwQBDE8zEwYyRwQBDDEoLlFKUC4UBgEhEwYkOQYSBAEMFjUEAQwwIQQBDEIaL0ocIEEiCDMGEgQBQEc9KC87LksnAR47IEcGLQQBMzk8BAEMNiEEAgEnIwEhATxHBAFCMEcaIk0EAQxNOAQBDEk9BAEMRTg3J0ogDyEIBjAzIyA8JikaRhUIIhMEAQxLJx4VBAEMRSQEAQw/NRpERCA7BAEMRCdJDgQBDEE1GkZGIDsEAgFGLyoBKgEMQU4nBAIBK3BhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX21vZGVsL2pzX3dvcmxkLmRhcnQ8c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfbW9kZWwvanNfd29ybGRfYnVpbGRlci5kYXJ0wACNey8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy9jb25zdGFudF9zeXN0ZW0uZGFydCcgYXMgY29uc3RhbnRfc3lzdGVtOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZGVmZXJyZWRfbG9hZC5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9pbmRleGVkLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9pci9jbG9zdXJlLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYW5ub3RhdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9iYWNrZW5kX3VzYWdlLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ub19zdWNoX21ldGhvZF9yZWdpc3RyeS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXNfcmVzb2x1dGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9rZXJuZWwva2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9iZWhhdmlvci5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jbGFzc19zZXQuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvZmVhdHVyZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9tZW1iZXJfdXNhZ2UuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCc7CmltcG9ydCAnY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50X21hcF9pbXBsLmRhcnQnOwppbXBvcnQgJ2pzX3dvcmxkLmRhcnQnOwppbXBvcnQgJ2xvY2Fscy5kYXJ0JzsKCmNsYXNzIEpzQ2xvc2VkV29ybGRCdWlsZGVyIHsKICBmaW5hbCBKc0tlcm5lbFRvRWxlbWVudE1hcCBfZWxlbWVudE1hcDsKICBmaW5hbCBNYXA8Q2xhc3NFbnRpdHksIENsYXNzSGllcmFyY2h5Tm9kZT4gX2NsYXNzSGllcmFyY2h5Tm9kZXMgPQogICAgICBuZXcgQ2xhc3NIaWVyYXJjaHlOb2Rlc01hcCgpOwogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgQ2xhc3NTZXQ+IF9jbGFzc1NldHMgPSA8Q2xhc3NFbnRpdHksIENsYXNzU2V0Pnt9OwogIGZpbmFsIEdsb2JhbExvY2Fsc01hcCBfZ2xvYmFsTG9jYWxzTWFwOwogIGZpbmFsIENsb3N1cmVEYXRhQnVpbGRlciBfY2xvc3VyZURhdGFCdWlsZGVyOwogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBfb3B0aW9uczsKICBmaW5hbCBBYnN0cmFjdFZhbHVlU3RyYXRlZ3kgX2Fic3RyYWN0VmFsdWVTdHJhdGVneTsKCiAgSnNDbG9zZWRXb3JsZEJ1aWxkZXIodGhpcy5fZWxlbWVudE1hcCwgdGhpcy5fZ2xvYmFsTG9jYWxzTWFwLAogICAgICB0aGlzLl9jbG9zdXJlRGF0YUJ1aWxkZXIsIHRoaXMuX29wdGlvbnMsIHRoaXMuX2Fic3RyYWN0VmFsdWVTdHJhdGVneSk7CgogIEVsZW1lbnRFbnZpcm9ubWVudCBnZXQgX2VsZW1lbnRFbnZpcm9ubWVudCA9PiBfZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQ7CiAgQ29tbW9uRWxlbWVudHMgZ2V0IF9jb21tb25FbGVtZW50cyA9PiBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgSnNDbG9zZWRXb3JsZCBjb252ZXJ0Q2xvc2VkV29ybGQoCiAgICAgIEtDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgTWFwPE1lbWJlckVudGl0eSwgQ2xvc3VyZVNjb3BlTW9kZWw+IGNsb3N1cmVNb2RlbHMsCiAgICAgIE91dHB1dFVuaXREYXRhIGtPdXRwdXRVbml0RGF0YSkgewogICAgSnNUb0Zyb250ZW5kTWFwIG1hcCA9IG5ldyBKc1RvRnJvbnRlbmRNYXBJbXBsKF9lbGVtZW50TWFwKTsKCiAgICBCYWNrZW5kVXNhZ2UgYmFja2VuZFVzYWdlID0KICAgICAgICBfY29udmVydEJhY2tlbmRVc2FnZShtYXAsIGNsb3NlZFdvcmxkLmJhY2tlbmRVc2FnZSk7CiAgICBOYXRpdmVEYXRhIG5hdGl2ZURhdGEgPSBfY29udmVydE5hdGl2ZURhdGEobWFwLCBjbG9zZWRXb3JsZC5uYXRpdmVEYXRhKTsKICAgIF9lbGVtZW50TWFwLm5hdGl2ZURhdGEgPSBuYXRpdmVEYXRhOwogICAgSW50ZXJjZXB0b3JEYXRhIGludGVyY2VwdG9yRGF0YSA9CiAgICAgICAgX2NvbnZlcnRJbnRlcmNlcHRvckRhdGEobWFwLCBuYXRpdmVEYXRhLCBjbG9zZWRXb3JsZC5pbnRlcmNlcHRvckRhdGEpOwoKICAgIFNldDxDbGFzc0VudGl0eT4gaW1wbGVtZW50ZWRDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgICAvLy8gQ29udmVydHMgW25vZGVdIGZyb20gdGhlIGZyb250ZW5kIHdvcmxkIHRvIHRoZSBjb3JyZXNwb25kaW5nCiAgICAvLy8gW0NsYXNzSGllcmFyY2h5Tm9kZV0gZm9yIHRoZSBiYWNrZW5kIHdvcmxkLgogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIGNvbnZlcnRDbGFzc0hpZXJhcmNoeU5vZGUoQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUpIHsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gbWFwLnRvQmFja2VuZENsYXNzKG5vZGUuY2xzKTsKICAgICAgaWYgKGNsb3NlZFdvcmxkLmlzSW1wbGVtZW50ZWQobm9kZS5jbHMpKSB7CiAgICAgICAgaW1wbGVtZW50ZWRDbGFzc2VzLmFkZChjbHMpOwogICAgICB9CiAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBuZXdOb2RlID0gX2NsYXNzSGllcmFyY2h5Tm9kZXMucHV0SWZBYnNlbnQoY2xzLCAoKSB7CiAgICAgICAgQ2xhc3NIaWVyYXJjaHlOb2RlIHBhcmVudE5vZGU7CiAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSAhPSBudWxsKSB7CiAgICAgICAgICBwYXJlbnROb2RlID0gY29udmVydENsYXNzSGllcmFyY2h5Tm9kZShub2RlLnBhcmVudE5vZGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IENsYXNzSGllcmFyY2h5Tm9kZShwYXJlbnROb2RlLCBjbHMsIG5vZGUuaGllcmFyY2h5RGVwdGgpOwogICAgICB9KTsKICAgICAgbmV3Tm9kZS5pc0Fic3RyYWN0bHlJbnN0YW50aWF0ZWQgPSBub2RlLmlzQWJzdHJhY3RseUluc3RhbnRpYXRlZDsKICAgICAgbmV3Tm9kZS5pc0RpcmVjdGx5SW5zdGFudGlhdGVkID0gbm9kZS5pc0RpcmVjdGx5SW5zdGFudGlhdGVkOwogICAgICByZXR1cm4gbmV3Tm9kZTsKICAgIH0KCiAgICAvLy8gQ29udmVydHMgW2NsYXNzU2V0XSBmcm9tIHRoZSBmcm9udGVuZCB3b3JsZCB0byB0aGUgY29ycmVzcG9uZGluZwogICAgLy8vIFtDbGFzc1NldF0gZm9yIHRoZSBiYWNrZW5kIHdvcmxkLgogICAgQ2xhc3NTZXQgY29udmVydENsYXNzU2V0KENsYXNzU2V0IGNsYXNzU2V0KSB7CiAgICAgIENsYXNzRW50aXR5IGNscyA9IG1hcC50b0JhY2tlbmRDbGFzcyhjbGFzc1NldC5jbHMpOwogICAgICByZXR1cm4gX2NsYXNzU2V0cy5wdXRJZkFic2VudChjbHMsICgpIHsKICAgICAgICBDbGFzc0hpZXJhcmNoeU5vZGUgbmV3Tm9kZSA9IGNvbnZlcnRDbGFzc0hpZXJhcmNoeU5vZGUoY2xhc3NTZXQubm9kZSk7CiAgICAgICAgQ2xhc3NTZXQgbmV3Q2xhc3NTZXQgPSBuZXcgQ2xhc3NTZXQobmV3Tm9kZSk7CiAgICAgICAgZm9yIChDbGFzc0hpZXJhcmNoeU5vZGUgc3VidHlwZSBpbiBjbGFzc1NldC5zdWJ0eXBlTm9kZXMpIHsKICAgICAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBuZXdTdWJ0eXBlID0gY29udmVydENsYXNzSGllcmFyY2h5Tm9kZShzdWJ0eXBlKTsKICAgICAgICAgIG5ld0NsYXNzU2V0LmFkZFN1YnR5cGUobmV3U3VidHlwZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdDbGFzc1NldDsKICAgICAgfSk7CiAgICB9CgogICAgY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkKICAgICAgICAuZ2V0Q2xhc3NIaWVyYXJjaHlOb2RlKGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKQogICAgICAgIC5mb3JFYWNoU3ViY2xhc3MoKENsYXNzRW50aXR5IGNscykgewogICAgICBjb252ZXJ0Q2xhc3NTZXQoY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuZ2V0Q2xhc3NTZXQoY2xzKSk7CiAgICAgIHJldHVybiBJdGVyYXRpb25TdGVwLkNPTlRJTlVFOwogICAgfSwgQ2xhc3NIaWVyYXJjaHlOb2RlLkFMTCk7CgogICAgU2V0PE1lbWJlckVudGl0eT4gbGl2ZUluc3RhbmNlTWVtYmVycyA9CiAgICAgICAgbWFwLnRvQmFja2VuZE1lbWJlclNldChjbG9zZWRXb3JsZC5saXZlSW5zdGFuY2VNZW1iZXJzKTsKCiAgICBNYXA8Q2xhc3NFbnRpdHksIFNldDxDbGFzc0VudGl0eT4+IG1peGluVXNlcyA9CiAgICAgICAgbWFwLnRvQmFja2VuZENsYXNzTWFwKGNsb3NlZFdvcmxkLm1peGluVXNlcywgbWFwLnRvQmFja2VuZENsYXNzU2V0KTsKCiAgICBNYXA8Q2xhc3NFbnRpdHksIFNldDxDbGFzc0VudGl0eT4+IHR5cGVzSW1wbGVtZW50ZWRCeVN1YmNsYXNzZXMgPQogICAgICAgIG1hcC50b0JhY2tlbmRDbGFzc01hcCgKICAgICAgICAgICAgY2xvc2VkV29ybGQudHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3NlcywgbWFwLnRvQmFja2VuZENsYXNzU2V0KTsKCiAgICBTZXQ8TWVtYmVyRW50aXR5PiBhc3NpZ25lZEluc3RhbmNlTWVtYmVycyA9CiAgICAgICAgbWFwLnRvQmFja2VuZE1lbWJlclNldChjbG9zZWRXb3JsZC5hc3NpZ25lZEluc3RhbmNlTWVtYmVycyk7CgogICAgU2V0PENsYXNzRW50aXR5PiBsaXZlTmF0aXZlQ2xhc3NlcyA9CiAgICAgICAgbWFwLnRvQmFja2VuZENsYXNzU2V0KGNsb3NlZFdvcmxkLmxpdmVOYXRpdmVDbGFzc2VzKTsKCiAgICBTZXQ8TWVtYmVyRW50aXR5PiBwcm9jZXNzZWRNZW1iZXJzID0KICAgICAgICBtYXAudG9CYWNrZW5kTWVtYmVyU2V0KGNsb3NlZFdvcmxkLmxpdmVNZW1iZXJVc2FnZS5rZXlzKTsKCiAgICBSdW50aW1lVHlwZXNOZWVkIHJ0aU5lZWQ7CgogICAgTGlzdDxGdW5jdGlvbkVudGl0eT4gY2FsbE1ldGhvZHMgPSA8RnVuY3Rpb25FbnRpdHk+W107CiAgICBDbG9zdXJlRGF0YSBjbG9zdXJlRGF0YTsKICAgIGlmIChfb3B0aW9ucy5kaXNhYmxlUnRpT3B0aW1pemF0aW9uKSB7CiAgICAgIHJ0aU5lZWQgPSBuZXcgVHJpdmlhbFJ1bnRpbWVUeXBlc05lZWQoKTsKICAgICAgY2xvc3VyZURhdGEgPSBfY2xvc3VyZURhdGFCdWlsZGVyLmNyZWF0ZUNsb3N1cmVFbnRpdGllcygKICAgICAgICAgIHRoaXMsCiAgICAgICAgICBtYXAudG9CYWNrZW5kTWVtYmVyTWFwKGNsb3N1cmVNb2RlbHMsIGlkZW50aXR5KSwKICAgICAgICAgIGNvbnN0IFRyaXZpYWxDbG9zdXJlUnRpTmVlZCgpLAogICAgICAgICAgY2FsbE1ldGhvZHMpOwogICAgfSBlbHNlIHsKICAgICAgUnVudGltZVR5cGVzTmVlZEltcGwga2VybmVsUnRpTmVlZCA9IGNsb3NlZFdvcmxkLnJ0aU5lZWQ7CiAgICAgIFNldDxpci5Mb2NhbEZ1bmN0aW9uPiBsb2NhbEZ1bmN0aW9uc05vZGVzTmVlZGluZ1NpZ25hdHVyZSA9CiAgICAgICAgICBuZXcgU2V0PGlyLkxvY2FsRnVuY3Rpb24+KCk7CiAgICAgIGZvciAoS0xvY2FsRnVuY3Rpb24gbG9jYWxGdW5jdGlvbgogICAgICAgICAgaW4ga2VybmVsUnRpTmVlZC5sb2NhbEZ1bmN0aW9uc05lZWRpbmdTaWduYXR1cmUpIHsKICAgICAgICBpci5Mb2NhbEZ1bmN0aW9uIG5vZGUgPSBsb2NhbEZ1bmN0aW9uLm5vZGU7CiAgICAgICAgbG9jYWxGdW5jdGlvbnNOb2Rlc05lZWRpbmdTaWduYXR1cmUuYWRkKG5vZGUpOwogICAgICB9CiAgICAgIFNldDxpci5Mb2NhbEZ1bmN0aW9uPiBsb2NhbEZ1bmN0aW9uc05vZGVzTmVlZGluZ1R5cGVBcmd1bWVudHMgPQogICAgICAgICAgbmV3IFNldDxpci5Mb2NhbEZ1bmN0aW9uPigpOwogICAgICBmb3IgKEtMb2NhbEZ1bmN0aW9uIGxvY2FsRnVuY3Rpb24KICAgICAgICAgIGluIGtlcm5lbFJ0aU5lZWQubG9jYWxGdW5jdGlvbnNOZWVkaW5nVHlwZUFyZ3VtZW50cykgewogICAgICAgIGlyLkxvY2FsRnVuY3Rpb24gbm9kZSA9IGxvY2FsRnVuY3Rpb24ubm9kZTsKICAgICAgICBsb2NhbEZ1bmN0aW9uc05vZGVzTmVlZGluZ1R5cGVBcmd1bWVudHMuYWRkKG5vZGUpOwogICAgICB9CgogICAgICBSdW50aW1lVHlwZXNOZWVkSW1wbCBqUnRpTmVlZCA9CiAgICAgICAgICBfY29udmVydFJ1bnRpbWVUeXBlc05lZWQobWFwLCBiYWNrZW5kVXNhZ2UsIGtlcm5lbFJ0aU5lZWQpOwogICAgICBjbG9zdXJlRGF0YSA9IF9jbG9zdXJlRGF0YUJ1aWxkZXIuY3JlYXRlQ2xvc3VyZUVudGl0aWVzKAogICAgICAgICAgdGhpcywKICAgICAgICAgIG1hcC50b0JhY2tlbmRNZW1iZXJNYXAoY2xvc3VyZU1vZGVscywgaWRlbnRpdHkpLAogICAgICAgICAgbmV3IEpzQ2xvc3VyZVJ0aU5lZWQoCiAgICAgICAgICAgICAgalJ0aU5lZWQsCiAgICAgICAgICAgICAgbG9jYWxGdW5jdGlvbnNOb2Rlc05lZWRpbmdUeXBlQXJndW1lbnRzLAogICAgICAgICAgICAgIGxvY2FsRnVuY3Rpb25zTm9kZXNOZWVkaW5nU2lnbmF0dXJlKSwKICAgICAgICAgIGNhbGxNZXRob2RzKTsKCiAgICAgIExpc3Q8RnVuY3Rpb25FbnRpdHk+IGNhbGxNZXRob2RzTmVlZGluZ1NpZ25hdHVyZSA9IDxGdW5jdGlvbkVudGl0eT5bXTsKICAgICAgZm9yIChpci5Mb2NhbEZ1bmN0aW9uIG5vZGUgaW4gbG9jYWxGdW5jdGlvbnNOb2Rlc05lZWRpbmdTaWduYXR1cmUpIHsKICAgICAgICBjYWxsTWV0aG9kc05lZWRpbmdTaWduYXR1cmUKICAgICAgICAgICAgLmFkZChjbG9zdXJlRGF0YS5nZXRDbG9zdXJlSW5mbyhub2RlKS5jYWxsTWV0aG9kKTsKICAgICAgfQogICAgICBMaXN0PEZ1bmN0aW9uRW50aXR5PiBjYWxsTWV0aG9kc05lZWRpbmdUeXBlQXJndW1lbnRzID0gPEZ1bmN0aW9uRW50aXR5PltdOwogICAgICBmb3IgKGlyLkxvY2FsRnVuY3Rpb24gbm9kZSBpbiBsb2NhbEZ1bmN0aW9uc05vZGVzTmVlZGluZ1R5cGVBcmd1bWVudHMpIHsKICAgICAgICBjYWxsTWV0aG9kc05lZWRpbmdUeXBlQXJndW1lbnRzCiAgICAgICAgICAgIC5hZGQoY2xvc3VyZURhdGEuZ2V0Q2xvc3VyZUluZm8obm9kZSkuY2FsbE1ldGhvZCk7CiAgICAgIH0KICAgICAgalJ0aU5lZWQubWV0aG9kc05lZWRpbmdTaWduYXR1cmUuYWRkQWxsKGNhbGxNZXRob2RzTmVlZGluZ1NpZ25hdHVyZSk7CiAgICAgIGpSdGlOZWVkLm1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cwogICAgICAgICAgLmFkZEFsbChjYWxsTWV0aG9kc05lZWRpbmdUeXBlQXJndW1lbnRzKTsKCiAgICAgIHJ0aU5lZWQgPSBqUnRpTmVlZDsKICAgIH0KCiAgICBOb1N1Y2hNZXRob2REYXRhSW1wbCBvbGROb1N1Y2hNZXRob2REYXRhID0gY2xvc2VkV29ybGQubm9TdWNoTWV0aG9kRGF0YTsKICAgIE5vU3VjaE1ldGhvZERhdGEgbm9TdWNoTWV0aG9kRGF0YSA9IG5ldyBOb1N1Y2hNZXRob2REYXRhSW1wbCgKICAgICAgICBtYXAudG9CYWNrZW5kRnVuY3Rpb25TZXQob2xkTm9TdWNoTWV0aG9kRGF0YS50aHJvd2luZ0ltcGxzKSwKICAgICAgICBtYXAudG9CYWNrZW5kRnVuY3Rpb25TZXQob2xkTm9TdWNoTWV0aG9kRGF0YS5vdGhlckltcGxzKSwKICAgICAgICBtYXAudG9CYWNrZW5kRnVuY3Rpb25TZXQob2xkTm9TdWNoTWV0aG9kRGF0YS5mb3J3YXJkaW5nU3ludGF4SW1wbHMpKTsKCiAgICBKRmllbGRBbmFseXNpcyBhbGxvY2F0b3JBbmFseXNpcyA9CiAgICAgICAgSkZpZWxkQW5hbHlzaXMuZnJvbShjbG9zZWRXb3JsZCwgbWFwLCBfb3B0aW9ucyk7CgogICAgQW5ub3RhdGlvbnNEYXRhSW1wbCBvbGRBbm5vdGF0aW9uc0RhdGEgPSBjbG9zZWRXb3JsZC5hbm5vdGF0aW9uc0RhdGE7CiAgICBBbm5vdGF0aW9uc0RhdGEgYW5ub3RhdGlvbnNEYXRhID0gbmV3IEFubm90YXRpb25zRGF0YUltcGwoX29wdGlvbnMsCiAgICAgICAgbWFwLnRvQmFja2VuZE1lbWJlck1hcChvbGRBbm5vdGF0aW9uc0RhdGEucHJhZ21hQW5ub3RhdGlvbnMsIGlkZW50aXR5KSk7CgogICAgT3V0cHV0VW5pdERhdGEgb3V0cHV0VW5pdERhdGEgPQogICAgICAgIF9jb252ZXJ0T3V0cHV0VW5pdERhdGEobWFwLCBrT3V0cHV0VW5pdERhdGEsIGNsb3N1cmVEYXRhKTsKCiAgICBNYXA8TWVtYmVyRW50aXR5LCBNZW1iZXJBY2Nlc3M+IG1lbWJlckFjY2VzcyA9IG1hcC50b0JhY2tlbmRNZW1iZXJNYXAoCiAgICAgICAgY2xvc2VkV29ybGQubGl2ZU1lbWJlclVzYWdlLAogICAgICAgIChNZW1iZXJVc2FnZSB1c2FnZSkgPT4KICAgICAgICAgICAgbmV3IE1lbWJlckFjY2Vzcyh1c2FnZS5yZWFkcywgdXNhZ2Uud3JpdGVzLCB1c2FnZS5pbnZva2VzKSk7CgogICAgcmV0dXJuIG5ldyBKc0Nsb3NlZFdvcmxkKAogICAgICAgIF9lbGVtZW50TWFwLAogICAgICAgIG5hdGl2ZURhdGEsCiAgICAgICAgaW50ZXJjZXB0b3JEYXRhLAogICAgICAgIGJhY2tlbmRVc2FnZSwKICAgICAgICBydGlOZWVkLAogICAgICAgIGFsbG9jYXRvckFuYWx5c2lzLAogICAgICAgIG5vU3VjaE1ldGhvZERhdGEsCiAgICAgICAgaW1wbGVtZW50ZWRDbGFzc2VzLAogICAgICAgIGxpdmVOYXRpdmVDbGFzc2VzLAogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEluY2x1ZGUgdGhlIGNhbGwgbWV0aG9kIHdoZW4gd2UgY2FuIGFsc28KICAgICAgICAvLyByZXByZXNlbnQgdGhlIHN5bnRoZXNpemVkIGNhbGwgbWV0aG9kcyBmb3Igc3RhdGljIGFuZCBpbnN0YW5jZSBtZXRob2QKICAgICAgICAvLyBjbG9zdXJpemF0aW9ucy4KICAgICAgICBsaXZlSW5zdGFuY2VNZW1iZXJzIC8qLi5hZGRBbGwoY2FsbE1ldGhvZHMpKi8sCiAgICAgICAgYXNzaWduZWRJbnN0YW5jZU1lbWJlcnMsCiAgICAgICAgcHJvY2Vzc2VkTWVtYmVycywKICAgICAgICBtaXhpblVzZXMsCiAgICAgICAgdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3NlcywKICAgICAgICBuZXcgQ2xhc3NIaWVyYXJjaHlJbXBsKAogICAgICAgICAgICBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50cywgX2NsYXNzSGllcmFyY2h5Tm9kZXMsIF9jbGFzc1NldHMpLAogICAgICAgIF9hYnN0cmFjdFZhbHVlU3RyYXRlZ3ksCiAgICAgICAgYW5ub3RhdGlvbnNEYXRhLAogICAgICAgIF9nbG9iYWxMb2NhbHNNYXAsCiAgICAgICAgY2xvc3VyZURhdGEsCiAgICAgICAgb3V0cHV0VW5pdERhdGEsCiAgICAgICAgbWVtYmVyQWNjZXNzKTsKICB9CgogIEJhY2tlbmRVc2FnZSBfY29udmVydEJhY2tlbmRVc2FnZSgKICAgICAgSnNUb0Zyb250ZW5kTWFwIG1hcCwgQmFja2VuZFVzYWdlSW1wbCBiYWNrZW5kVXNhZ2UpIHsKICAgIFNldDxGdW5jdGlvbkVudGl0eT4gZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXMgPQogICAgICAgIG1hcC50b0JhY2tlbmRGdW5jdGlvblNldChiYWNrZW5kVXNhZ2UuZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXMpOwogICAgU2V0PENsYXNzRW50aXR5PiBnbG9iYWxDbGFzc0RlcGVuZGVuY2llcyA9CiAgICAgICAgbWFwLnRvQmFja2VuZENsYXNzU2V0KGJhY2tlbmRVc2FnZS5nbG9iYWxDbGFzc0RlcGVuZGVuY2llcyk7CiAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IGhlbHBlckZ1bmN0aW9uc1VzZWQgPQogICAgICAgIG1hcC50b0JhY2tlbmRGdW5jdGlvblNldChiYWNrZW5kVXNhZ2UuaGVscGVyRnVuY3Rpb25zVXNlZCk7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGhlbHBlckNsYXNzZXNVc2VkID0KICAgICAgICBtYXAudG9CYWNrZW5kQ2xhc3NTZXQoYmFja2VuZFVzYWdlLmhlbHBlckNsYXNzZXNVc2VkKTsKICAgIFNldDxSdW50aW1lVHlwZVVzZT4gcnVudGltZVR5cGVVc2VzID0KICAgICAgICBiYWNrZW5kVXNhZ2UucnVudGltZVR5cGVVc2VzLm1hcCgoUnVudGltZVR5cGVVc2UgcnVudGltZVR5cGVVc2UpIHsKICAgICAgcmV0dXJuIG5ldyBSdW50aW1lVHlwZVVzZSgKICAgICAgICAgIHJ1bnRpbWVUeXBlVXNlLmtpbmQsCiAgICAgICAgICBtYXAudG9CYWNrZW5kVHlwZShydW50aW1lVHlwZVVzZS5yZWNlaXZlclR5cGUpLAogICAgICAgICAgbWFwLnRvQmFja2VuZFR5cGUocnVudGltZVR5cGVVc2UuYXJndW1lbnRUeXBlKSk7CiAgICB9KS50b1NldCgpOwoKICAgIHJldHVybiBuZXcgQmFja2VuZFVzYWdlSW1wbCgKICAgICAgICBnbG9iYWxGdW5jdGlvbkRlcGVuZGVuY2llczogZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXMsCiAgICAgICAgZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXM6IGdsb2JhbENsYXNzRGVwZW5kZW5jaWVzLAogICAgICAgIGhlbHBlckZ1bmN0aW9uc1VzZWQ6IGhlbHBlckZ1bmN0aW9uc1VzZWQsCiAgICAgICAgaGVscGVyQ2xhc3Nlc1VzZWQ6IGhlbHBlckNsYXNzZXNVc2VkLAogICAgICAgIG5lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWc6CiAgICAgICAgICAgIGJhY2tlbmRVc2FnZS5uZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnLAogICAgICAgIG5lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5OgogICAgICAgICAgICBiYWNrZW5kVXNhZ2UubmVlZFRvSW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHksCiAgICAgICAgcmVxdWlyZXNQcmVhbWJsZTogYmFja2VuZFVzYWdlLnJlcXVpcmVzUHJlYW1ibGUsCiAgICAgICAgcnVudGltZVR5cGVVc2VzOiBydW50aW1lVHlwZVVzZXMsCiAgICAgICAgaXNGdW5jdGlvbkFwcGx5VXNlZDogYmFja2VuZFVzYWdlLmlzRnVuY3Rpb25BcHBseVVzZWQsCiAgICAgICAgaXNNaXJyb3JzVXNlZDogYmFja2VuZFVzYWdlLmlzTWlycm9yc1VzZWQsCiAgICAgICAgaXNOb1N1Y2hNZXRob2RVc2VkOiBiYWNrZW5kVXNhZ2UuaXNOb1N1Y2hNZXRob2RVc2VkLAogICAgICAgIGlzSHRtbExvYWRlZDogYmFja2VuZFVzYWdlLmlzSHRtbExvYWRlZCk7CiAgfQoKICBOYXRpdmVCYXNpY0RhdGEgX2NvbnZlcnROYXRpdmVCYXNpY0RhdGEoCiAgICAgIEpzVG9Gcm9udGVuZE1hcCBtYXAsIE5hdGl2ZUJhc2ljRGF0YUltcGwgbmF0aXZlQmFzaWNEYXRhKSB7CiAgICBNYXA8Q2xhc3NFbnRpdHksIE5hdGl2ZUNsYXNzVGFnPiBuYXRpdmVDbGFzc1RhZ0luZm8gPQogICAgICAgIDxDbGFzc0VudGl0eSwgTmF0aXZlQ2xhc3NUYWc+e307CiAgICBuYXRpdmVCYXNpY0RhdGEubmF0aXZlQ2xhc3NUYWdJbmZvCiAgICAgICAgLmZvckVhY2goKENsYXNzRW50aXR5IGNscywgTmF0aXZlQ2xhc3NUYWcgdGFnKSB7CiAgICAgIG5hdGl2ZUNsYXNzVGFnSW5mb1ttYXAudG9CYWNrZW5kQ2xhc3MoY2xzKV0gPSB0YWc7CiAgICB9KTsKICAgIE1hcDxMaWJyYXJ5RW50aXR5LCBTdHJpbmc+IGpzSW50ZXJvcExpYnJhcmllcyA9CiAgICAgICAgbWFwLnRvQmFja2VuZExpYnJhcnlNYXAobmF0aXZlQmFzaWNEYXRhLmpzSW50ZXJvcExpYnJhcmllcywgaWRlbnRpdHkpOwogICAgTWFwPENsYXNzRW50aXR5LCBTdHJpbmc+IGpzSW50ZXJvcENsYXNzZXMgPQogICAgICAgIG1hcC50b0JhY2tlbmRDbGFzc01hcChuYXRpdmVCYXNpY0RhdGEuanNJbnRlcm9wQ2xhc3NlcywgaWRlbnRpdHkpOwogICAgU2V0PENsYXNzRW50aXR5PiBhbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzID0KICAgICAgICBtYXAudG9CYWNrZW5kQ2xhc3NTZXQobmF0aXZlQmFzaWNEYXRhLmFub255bW91c0pzSW50ZXJvcENsYXNzZXMpOwogICAgTWFwPE1lbWJlckVudGl0eSwgU3RyaW5nPiBqc0ludGVyb3BNZW1iZXJzID0KICAgICAgICBtYXAudG9CYWNrZW5kTWVtYmVyTWFwKG5hdGl2ZUJhc2ljRGF0YS5qc0ludGVyb3BNZW1iZXJzLCBpZGVudGl0eSk7CiAgICByZXR1cm4gbmV3IE5hdGl2ZUJhc2ljRGF0YUltcGwoCiAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICBuYXRpdmVDbGFzc1RhZ0luZm8sCiAgICAgICAganNJbnRlcm9wTGlicmFyaWVzLAogICAgICAgIGpzSW50ZXJvcENsYXNzZXMsCiAgICAgICAgYW5vbnltb3VzSnNJbnRlcm9wQ2xhc3NlcywKICAgICAgICBqc0ludGVyb3BNZW1iZXJzKTsKICB9CgogIE5hdGl2ZURhdGEgX2NvbnZlcnROYXRpdmVEYXRhKAogICAgICBKc1RvRnJvbnRlbmRNYXAgbWFwLCBOYXRpdmVEYXRhSW1wbCBuYXRpdmVEYXRhKSB7CiAgICBjb252ZXJ0TmF0aXZlQmVoYXZpb3JUeXBlKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgaXMgRGFydFR5cGUpIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCBmcmVlIHZhcmlhYmxlcyBpbiB0eXBlcy4gSWYgdGhlIHR5cGUKICAgICAgICAvLyBwdWxsZWQgZnJvbSBhIGdlbmVyaWMgZnVuY3Rpb24gdHlwZSBpdCBtaWdodCBjb250YWluIGEgZnVuY3Rpb24KICAgICAgICAvLyB0eXBlIHZhcmlhYmxlIHRoYXQgc2hvdWxkIHByb2JhYmx5IGhhdmUgYmVlbiByZXBsYWNlZCBieSBpdHMgYm91bmQuCiAgICAgICAgcmV0dXJuIG1hcC50b0JhY2tlbmRUeXBlKHR5cGUsIGFsbG93RnJlZVZhcmlhYmxlczogdHJ1ZSk7CiAgICAgIH0KICAgICAgYXNzZXJ0KHR5cGUgaXMgU3BlY2lhbFR5cGUpOwogICAgICByZXR1cm4gdHlwZTsKICAgIH0KCiAgICBOYXRpdmVCZWhhdmlvciBjb252ZXJ0TmF0aXZlQmVoYXZpb3IoTmF0aXZlQmVoYXZpb3IgYmVoYXZpb3IpIHsKICAgICAgTmF0aXZlQmVoYXZpb3IgbmV3QmVoYXZpb3IgPSBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKCiAgICAgIGZvciAoZHluYW1pYyB0eXBlIGluIGJlaGF2aW9yLnR5cGVzUmV0dXJuZWQpIHsKICAgICAgICBuZXdCZWhhdmlvci50eXBlc1JldHVybmVkLmFkZChjb252ZXJ0TmF0aXZlQmVoYXZpb3JUeXBlKHR5cGUpKTsKICAgICAgfQogICAgICBmb3IgKGR5bmFtaWMgdHlwZSBpbiBiZWhhdmlvci50eXBlc0luc3RhbnRpYXRlZCkgewogICAgICAgIG5ld0JlaGF2aW9yLnR5cGVzSW5zdGFudGlhdGVkLmFkZChjb252ZXJ0TmF0aXZlQmVoYXZpb3JUeXBlKHR5cGUpKTsKICAgICAgfQoKICAgICAgbmV3QmVoYXZpb3IuY29kZVRlbXBsYXRlVGV4dCA9IGJlaGF2aW9yLmNvZGVUZW1wbGF0ZVRleHQ7CiAgICAgIG5ld0JlaGF2aW9yLmNvZGVUZW1wbGF0ZSA9IGJlaGF2aW9yLmNvZGVUZW1wbGF0ZTsKICAgICAgbmV3QmVoYXZpb3IudGhyb3dCZWhhdmlvciA9IGJlaGF2aW9yLnRocm93QmVoYXZpb3I7CiAgICAgIG5ld0JlaGF2aW9yLmlzQWxsb2NhdGlvbiA9IGJlaGF2aW9yLmlzQWxsb2NhdGlvbjsKICAgICAgbmV3QmVoYXZpb3IudXNlR3ZuID0gYmVoYXZpb3IudXNlR3ZuOwogICAgICByZXR1cm4gbmV3QmVoYXZpb3I7CiAgICB9CgogICAgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZUJhc2ljRGF0YSA9IF9jb252ZXJ0TmF0aXZlQmFzaWNEYXRhKG1hcCwgbmF0aXZlRGF0YSk7CgogICAgTWFwPE1lbWJlckVudGl0eSwgU3RyaW5nPiBuYXRpdmVNZW1iZXJOYW1lID0KICAgICAgICBtYXAudG9CYWNrZW5kTWVtYmVyTWFwKG5hdGl2ZURhdGEubmF0aXZlTWVtYmVyTmFtZSwgaWRlbnRpdHkpOwogICAgTWFwPEZ1bmN0aW9uRW50aXR5LCBOYXRpdmVCZWhhdmlvcj4gbmF0aXZlTWV0aG9kQmVoYXZpb3IgPQogICAgICAgIDxGdW5jdGlvbkVudGl0eSwgTmF0aXZlQmVoYXZpb3I+e307CiAgICBuYXRpdmVEYXRhLm5hdGl2ZU1ldGhvZEJlaGF2aW9yCiAgICAgICAgLmZvckVhY2goKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCwgTmF0aXZlQmVoYXZpb3IgYmVoYXZpb3IpIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgYmFja2VuZE1ldGhvZCA9IG1hcC50b0JhY2tlbmRNZW1iZXIobWV0aG9kKTsKICAgICAgaWYgKGJhY2tlbmRNZXRob2QgIT0gbnVsbCkgewogICAgICAgIC8vIElmIFttZXRob2RdIGlzbid0IHVzZWQgaXQgZG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBiYWNrZW5kCiAgICAgICAgLy8gbWV0aG9kLgogICAgICAgIG5hdGl2ZU1ldGhvZEJlaGF2aW9yW2JhY2tlbmRNZXRob2RdID0gY29udmVydE5hdGl2ZUJlaGF2aW9yKGJlaGF2aW9yKTsKICAgICAgfQogICAgfSk7CiAgICBNYXA8TWVtYmVyRW50aXR5LCBOYXRpdmVCZWhhdmlvcj4gbmF0aXZlRmllbGRMb2FkQmVoYXZpb3IgPQogICAgICAgIG1hcC50b0JhY2tlbmRNZW1iZXJNYXAoCiAgICAgICAgICAgIG5hdGl2ZURhdGEubmF0aXZlRmllbGRMb2FkQmVoYXZpb3IsIGNvbnZlcnROYXRpdmVCZWhhdmlvcik7CiAgICBNYXA8TWVtYmVyRW50aXR5LCBOYXRpdmVCZWhhdmlvcj4gbmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yID0KICAgICAgICBtYXAudG9CYWNrZW5kTWVtYmVyTWFwKAogICAgICAgICAgICBuYXRpdmVEYXRhLm5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvciwgY29udmVydE5hdGl2ZUJlaGF2aW9yKTsKICAgIHJldHVybiBuZXcgTmF0aXZlRGF0YUltcGwoCiAgICAgICAgbmF0aXZlQmFzaWNEYXRhLAogICAgICAgIG5hdGl2ZU1lbWJlck5hbWUsCiAgICAgICAgbmF0aXZlTWV0aG9kQmVoYXZpb3IsCiAgICAgICAgbmF0aXZlRmllbGRMb2FkQmVoYXZpb3IsCiAgICAgICAgbmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yKTsKICB9CgogIEludGVyY2VwdG9yRGF0YSBfY29udmVydEludGVyY2VwdG9yRGF0YShKc1RvRnJvbnRlbmRNYXAgbWFwLAogICAgICBOYXRpdmVEYXRhIG5hdGl2ZURhdGEsIEludGVyY2VwdG9yRGF0YUltcGwgaW50ZXJjZXB0b3JEYXRhKSB7CiAgICBNYXA8U3RyaW5nLCBTZXQ8TWVtYmVyRW50aXR5Pj4gaW50ZXJjZXB0ZWRNZW1iZXJzID0KICAgICAgICA8U3RyaW5nLCBTZXQ8TWVtYmVyRW50aXR5Pj57fTsKICAgIGludGVyY2VwdG9yRGF0YS5pbnRlcmNlcHRlZE1lbWJlcnMKICAgICAgICAuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIFNldDxNZW1iZXJFbnRpdHk+IG1lbWJlcnMpIHsKICAgICAgaW50ZXJjZXB0ZWRNZW1iZXJzW25hbWVdID0gbWFwLnRvQmFja2VuZE1lbWJlclNldChtZW1iZXJzKTsKICAgIH0pOwogICAgcmV0dXJuIG5ldyBJbnRlcmNlcHRvckRhdGFJbXBsKAogICAgICAgIG5hdGl2ZURhdGEsCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLAogICAgICAgIGludGVyY2VwdGVkTWVtYmVycywKICAgICAgICBtYXAudG9CYWNrZW5kQ2xhc3NTZXQoaW50ZXJjZXB0b3JEYXRhLmludGVyY2VwdGVkQ2xhc3NlcyksCiAgICAgICAgbWFwLnRvQmFja2VuZENsYXNzU2V0KAogICAgICAgICAgICBpbnRlcmNlcHRvckRhdGEuY2xhc3Nlc01peGVkSW50b0ludGVyY2VwdGVkQ2xhc3NlcykpOwogIH0KCiAgUnVudGltZVR5cGVzTmVlZCBfY29udmVydFJ1bnRpbWVUeXBlc05lZWQoSnNUb0Zyb250ZW5kTWFwIG1hcCwKICAgICAgQmFja2VuZFVzYWdlIGJhY2tlbmRVc2FnZSwgUnVudGltZVR5cGVzTmVlZEltcGwgcnRpTmVlZCkgewogICAgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzTmVlZGluZ1R5cGVBcmd1bWVudHMgPQogICAgICAgIG1hcC50b0JhY2tlbmRDbGFzc1NldChydGlOZWVkLmNsYXNzZXNOZWVkaW5nVHlwZUFyZ3VtZW50cyk7CiAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IG1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cyA9CiAgICAgICAgbWFwLnRvQmFja2VuZEZ1bmN0aW9uU2V0KHJ0aU5lZWQubWV0aG9kc05lZWRpbmdUeXBlQXJndW1lbnRzKTsKICAgIFNldDxGdW5jdGlvbkVudGl0eT4gbWV0aG9kc05lZWRpbmdTaWduYXR1cmUgPQogICAgICAgIG1hcC50b0JhY2tlbmRGdW5jdGlvblNldChydGlOZWVkLm1ldGhvZHNOZWVkaW5nU2lnbmF0dXJlKTsKICAgIFNldDxTZWxlY3Rvcj4gc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHMgPQogICAgICAgIHJ0aU5lZWQuc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHMubWFwKChTZWxlY3RvciBzZWxlY3RvcikgewogICAgICBpZiAoc2VsZWN0b3IubWVtYmVyTmFtZS5pc1ByaXZhdGUpIHsKICAgICAgICByZXR1cm4gbmV3IFNlbGVjdG9yKAogICAgICAgICAgICBzZWxlY3Rvci5raW5kLAogICAgICAgICAgICBuZXcgUHJpdmF0ZU5hbWUoc2VsZWN0b3IubWVtYmVyTmFtZS50ZXh0LAogICAgICAgICAgICAgICAgbWFwLnRvQmFja2VuZExpYnJhcnkoc2VsZWN0b3IubWVtYmVyTmFtZS5saWJyYXJ5KSwKICAgICAgICAgICAgICAgIGlzU2V0dGVyOiBzZWxlY3Rvci5tZW1iZXJOYW1lLmlzU2V0dGVyKSwKICAgICAgICAgICAgc2VsZWN0b3IuY2FsbFN0cnVjdHVyZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNlbGVjdG9yOwogICAgfSkudG9TZXQoKTsKICAgIHJldHVybiBuZXcgUnVudGltZVR5cGVzTmVlZEltcGwoCiAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICBjbGFzc2VzTmVlZGluZ1R5cGVBcmd1bWVudHMsCiAgICAgICAgbWV0aG9kc05lZWRpbmdTaWduYXR1cmUsCiAgICAgICAgbWV0aG9kc05lZWRpbmdUeXBlQXJndW1lbnRzLAogICAgICAgIG51bGwsCiAgICAgICAgbnVsbCwKICAgICAgICBzZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgICBydGlOZWVkLmluc3RhbnRpYXRpb25zTmVlZGluZ1R5cGVBcmd1bWVudHMpOwogIH0KCiAgLy8vIENvbnN0cnVjdCBhIGNsb3N1cmUgY2xhc3MgYW5kIHNldCB1cCB0aGUgbmVjZXNzYXJ5IGNsYXNzIGluZmVyZW5jZQogIC8vLyBoaWVyYXJjaHkuCiAgS2VybmVsQ2xvc3VyZUNsYXNzSW5mbyBidWlsZENsb3N1cmVDbGFzcygKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwKICAgICAgaXIuRnVuY3Rpb25Ob2RlIG9yaWdpbmFsQ2xvc3VyZUZ1bmN0aW9uTm9kZSwKICAgICAgSkxpYnJhcnkgZW5jbG9zaW5nTGlicmFyeSwKICAgICAgTWFwPExvY2FsLCBKUmVjb3JkRmllbGQ+IGJveGVkVmFyaWFibGVzLAogICAgICBLZXJuZWxTY29wZUluZm8gaW5mbywKICAgICAgS2VybmVsVG9Mb2NhbHNNYXAgbG9jYWxzTWFwLAogICAgICB7Ym9vbCBjcmVhdGVTaWduYXR1cmVNZXRob2R9KSB7CiAgICBDbGFzc0VudGl0eSBzdXBlcmNsYXNzID0gX2NvbW1vbkVsZW1lbnRzLmNsb3N1cmVDbGFzczsKCiAgICBLZXJuZWxDbG9zdXJlQ2xhc3NJbmZvIGNsb3N1cmVDbGFzc0luZm8gPSBfZWxlbWVudE1hcC5jb25zdHJ1Y3RDbG9zdXJlQ2xhc3MoCiAgICAgICAgbWVtYmVyLAogICAgICAgIG9yaWdpbmFsQ2xvc3VyZUZ1bmN0aW9uTm9kZSwKICAgICAgICBlbmNsb3NpbmdMaWJyYXJ5LAogICAgICAgIGJveGVkVmFyaWFibGVzLAogICAgICAgIGluZm8sCiAgICAgICAgbG9jYWxzTWFwLAogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKHN1cGVyY2xhc3MsIGNvbnN0IFtdKSwKICAgICAgICBjcmVhdGVTaWduYXR1cmVNZXRob2Q6IGNyZWF0ZVNpZ25hdHVyZU1ldGhvZCk7CgogICAgLy8gVGVsbCB0aGUgaGllcmFyY2h5IHRoYXQgdGhpcyBpcyB0aGUgc3VwZXIgY2xhc3MuIHRoZW4gd2UgY2FuIHVzZQogICAgLy8gLmdldFN1cGVydHlwZXMoY2xhc3MpCiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgcGFyZW50Tm9kZSA9IF9jbGFzc0hpZXJhcmNoeU5vZGVzW3N1cGVyY2xhc3NdOwogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIG5vZGUgPSBuZXcgQ2xhc3NIaWVyYXJjaHlOb2RlKHBhcmVudE5vZGUsCiAgICAgICAgY2xvc3VyZUNsYXNzSW5mby5jbG9zdXJlQ2xhc3NFbnRpdHksIHBhcmVudE5vZGUuaGllcmFyY2h5RGVwdGggKyAxKTsKICAgIF9jbGFzc0hpZXJhcmNoeU5vZGVzW2Nsb3N1cmVDbGFzc0luZm8uY2xvc3VyZUNsYXNzRW50aXR5XSA9IG5vZGU7CiAgICBfY2xhc3NTZXRzW2Nsb3N1cmVDbGFzc0luZm8uY2xvc3VyZUNsYXNzRW50aXR5XSA9IG5ldyBDbGFzc1NldChub2RlKTsKICAgIG5vZGUuaXNEaXJlY3RseUluc3RhbnRpYXRlZCA9IHRydWU7CgogICAgcmV0dXJuIGNsb3N1cmVDbGFzc0luZm87CiAgfQoKICBPdXRwdXRVbml0RGF0YSBfY29udmVydE91dHB1dFVuaXREYXRhKEpzVG9Gcm9udGVuZE1hcEltcGwgbWFwLAogICAgICBPdXRwdXRVbml0RGF0YSBkYXRhLCBDbG9zdXJlRGF0YSBjbG9zdXJlRGF0YUxvb2t1cCkgewogICAgLy8gQ29udmVydCBmcm9udC1lbmQgbWFwcyBjb250YWluaW5nIEstY2xhc3MgYW5kIEstbG9jYWwgZnVuY3Rpb24ga2V5cyB0byBhCiAgICAvLyBiYWNrZW5kIG1hcCB1c2luZyBKLWNsYXNzZXMgYXMga2V5cy4KICAgIE1hcDxDbGFzc0VudGl0eSwgT3V0cHV0VW5pdD4gY29udmVydENsYXNzTWFwKAogICAgICAgIE1hcDxDbGFzc0VudGl0eSwgT3V0cHV0VW5pdD4gY2xhc3NNYXAsCiAgICAgICAgTWFwPExvY2FsLCBPdXRwdXRVbml0PiBsb2NhbEZ1bmN0aW9uTWFwKSB7CiAgICAgIHZhciByZXN1bHQgPSA8Q2xhc3NFbnRpdHksIE91dHB1dFVuaXQ+e307CiAgICAgIGNsYXNzTWFwLmZvckVhY2goKENsYXNzRW50aXR5IGVudGl0eSwgT3V0cHV0VW5pdCB1bml0KSB7CiAgICAgICAgQ2xhc3NFbnRpdHkgYmFja2VuZEVudGl0eSA9IG1hcC50b0JhY2tlbmRDbGFzcyhlbnRpdHkpOwogICAgICAgIGlmIChiYWNrZW5kRW50aXR5ICE9IG51bGwpIHsKICAgICAgICAgIC8vIElmIFtlbnRpdHldIGlzbid0IHVzZWQgaXQgZG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBiYWNrZW5kCiAgICAgICAgICAvLyBlbnRpdHkuCiAgICAgICAgICByZXN1bHRbYmFja2VuZEVudGl0eV0gPSB1bml0OwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGxvY2FsRnVuY3Rpb25NYXAuZm9yRWFjaCgoTG9jYWwgZW50aXR5LCBPdXRwdXRVbml0IHVuaXQpIHsKICAgICAgICAvLyBFbnN1cmUgY2xvc3VyZSBjbGFzc2VzIGFyZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IHVuaXQgY29ycmVzcG9uZGluZwogICAgICAgIC8vIHRvIHRoZSBsb2NhbCBmdW5jdGlvbi4KICAgICAgICBpZiAoZW50aXR5IGlzIEtMb2NhbEZ1bmN0aW9uKSB7CiAgICAgICAgICB2YXIgY2xvc3VyZUluZm8gPSBjbG9zdXJlRGF0YUxvb2t1cC5nZXRDbG9zdXJlSW5mbyhlbnRpdHkubm9kZSk7CiAgICAgICAgICByZXN1bHRbY2xvc3VyZUluZm8uY2xvc3VyZUNsYXNzRW50aXR5XSA9IHVuaXQ7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvLyBDb252ZXJ0IGZyb250LWVuZCBtYXBzIGNvbnRhaW5pbmcgSy1tZW1iZXIgYW5kIEstbG9jYWwgZnVuY3Rpb24ga2V5cyB0bwogICAgLy8gYSBiYWNrZW5kIG1hcCB1c2luZyBKLW1lbWJlcnMgYXMga2V5cy4KICAgIE1hcDxNZW1iZXJFbnRpdHksIE91dHB1dFVuaXQ+IGNvbnZlcnRNZW1iZXJNYXAoCiAgICAgICAgTWFwPE1lbWJlckVudGl0eSwgT3V0cHV0VW5pdD4gbWVtYmVyTWFwLAogICAgICAgIE1hcDxMb2NhbCwgT3V0cHV0VW5pdD4gbG9jYWxGdW5jdGlvbk1hcCkgewogICAgICB2YXIgcmVzdWx0ID0gPE1lbWJlckVudGl0eSwgT3V0cHV0VW5pdD57fTsKICAgICAgbWVtYmVyTWFwLmZvckVhY2goKE1lbWJlckVudGl0eSBlbnRpdHksIE91dHB1dFVuaXQgdW5pdCkgewogICAgICAgIE1lbWJlckVudGl0eSBiYWNrZW5kRW50aXR5ID0gbWFwLnRvQmFja2VuZE1lbWJlcihlbnRpdHkpOwogICAgICAgIGlmIChiYWNrZW5kRW50aXR5ICE9IG51bGwpIHsKICAgICAgICAgIC8vIElmIFtlbnRpdHldIGlzbid0IHVzZWQgaXQgZG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBiYWNrZW5kCiAgICAgICAgICAvLyBlbnRpdHkuCiAgICAgICAgICByZXN1bHRbYmFja2VuZEVudGl0eV0gPSB1bml0OwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGxvY2FsRnVuY3Rpb25NYXAuZm9yRWFjaCgoTG9jYWwgZW50aXR5LCBPdXRwdXRVbml0IHVuaXQpIHsKICAgICAgICAvLyBFbnN1cmUgY2xvc3VyZSBjYWxsLW1ldGhvZHMgYXJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgdW5pdAogICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2FsIGZ1bmN0aW9uLgogICAgICAgIGlmIChlbnRpdHkgaXMgS0xvY2FsRnVuY3Rpb24pIHsKICAgICAgICAgIHZhciBjbG9zdXJlSW5mbyA9IGNsb3N1cmVEYXRhTG9va3VwLmdldENsb3N1cmVJbmZvKGVudGl0eS5ub2RlKTsKICAgICAgICAgIHJlc3VsdFtjbG9zdXJlSW5mby5jYWxsTWV0aG9kXSA9IHVuaXQ7CiAgICAgICAgICBpZiAoY2xvc3VyZUluZm8uc2lnbmF0dXJlTWV0aG9kICE9IG51bGwpIHsKICAgICAgICAgICAgcmVzdWx0W2Nsb3N1cmVJbmZvLnNpZ25hdHVyZU1ldGhvZF0gPSB1bml0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgcmV0dXJuIG5ldyBPdXRwdXRVbml0RGF0YS5mcm9tKAogICAgICAgIGRhdGEsCiAgICAgICAgbWFwLnRvQmFja2VuZExpYnJhcnksCiAgICAgICAgY29udmVydENsYXNzTWFwLAogICAgICAgIGNvbnZlcnRNZW1iZXJNYXAsCiAgICAgICAgKG0pID0+IGNvbnZlcnRNYXA8Q29uc3RhbnRWYWx1ZSwgT3V0cHV0VW5pdCwgT3V0cHV0VW5pdD4oCiAgICAgICAgICAgIG0sIG1hcC50b0JhY2tlbmRDb25zdGFudCwgKHYpID0+IHYpKTsKICB9Cn0KCmNsYXNzIFRyaXZpYWxDbG9zdXJlUnRpTmVlZCBpbXBsZW1lbnRzIENsb3N1cmVSdGlOZWVkIHsKICBjb25zdCBUcml2aWFsQ2xvc3VyZVJ0aU5lZWQoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBsb2NhbEZ1bmN0aW9uTmVlZHNTaWduYXR1cmUoaXIuTm9kZSBub2RlKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKENsYXNzRW50aXR5IGNscykgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBtZXRob2ROZWVkc1R5cGVBcmd1bWVudHMoRnVuY3Rpb25FbnRpdHkgbWV0aG9kKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGxvY2FsRnVuY3Rpb25OZWVkc1R5cGVBcmd1bWVudHMoaXIuTm9kZSBub2RlKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIHNlbGVjdG9yTmVlZHNUeXBlQXJndW1lbnRzKFNlbGVjdG9yIHNlbGVjdG9yKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIG1ldGhvZE5lZWRzU2lnbmF0dXJlKE1lbWJlckVudGl0eSBtZXRob2QpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgaW5zdGFudGlhdGlvbk5lZWRzVHlwZUFyZ3VtZW50cygKICAgICAgICAgIERhcnRUeXBlIGZ1bmN0aW9uVHlwZSwgaW50IHR5cGVBcmd1bWVudENvdW50KSA9PgogICAgICB0cnVlOwp9CgpjbGFzcyBKc0Nsb3N1cmVSdGlOZWVkIGltcGxlbWVudHMgQ2xvc3VyZVJ0aU5lZWQgewogIGZpbmFsIFJ1bnRpbWVUeXBlc05lZWQgcnRpTmVlZDsKICBmaW5hbCBTZXQ8aXIuTG9jYWxGdW5jdGlvbj4gbG9jYWxGdW5jdGlvbnNOb2Rlc05lZWRpbmdUeXBlQXJndW1lbnRzOwogIGZpbmFsIFNldDxpci5Mb2NhbEZ1bmN0aW9uPiBsb2NhbEZ1bmN0aW9uc05vZGVzTmVlZGluZ1NpZ25hdHVyZTsKCiAgSnNDbG9zdXJlUnRpTmVlZCh0aGlzLnJ0aU5lZWQsIHRoaXMubG9jYWxGdW5jdGlvbnNOb2Rlc05lZWRpbmdUeXBlQXJndW1lbnRzLAogICAgICB0aGlzLmxvY2FsRnVuY3Rpb25zTm9kZXNOZWVkaW5nU2lnbmF0dXJlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBsb2NhbEZ1bmN0aW9uTmVlZHNTaWduYXR1cmUoaXIuTG9jYWxGdW5jdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbG9jYWxGdW5jdGlvbnNOb2Rlc05lZWRpbmdTaWduYXR1cmUuY29udGFpbnMobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKENsYXNzRW50aXR5IGNscykgPT4KICAgICAgcnRpTmVlZC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cyhjbHMpOwoKICBAb3ZlcnJpZGUKICBib29sIG1ldGhvZE5lZWRzVHlwZUFyZ3VtZW50cyhGdW5jdGlvbkVudGl0eSBtZXRob2QpID0+CiAgICAgIHJ0aU5lZWQubWV0aG9kTmVlZHNUeXBlQXJndW1lbnRzKG1ldGhvZCk7CgogIEBvdmVycmlkZQogIGJvb2wgbG9jYWxGdW5jdGlvbk5lZWRzVHlwZUFyZ3VtZW50cyhpci5Mb2NhbEZ1bmN0aW9uIG5vZGUpIHsKICAgIHJldHVybiBsb2NhbEZ1bmN0aW9uc05vZGVzTmVlZGluZ1R5cGVBcmd1bWVudHMuY29udGFpbnMobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHNlbGVjdG9yTmVlZHNUeXBlQXJndW1lbnRzKFNlbGVjdG9yIHNlbGVjdG9yKSA9PgogICAgICBydGlOZWVkLnNlbGVjdG9yTmVlZHNUeXBlQXJndW1lbnRzKHNlbGVjdG9yKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBtZXRob2ROZWVkc1NpZ25hdHVyZShNZW1iZXJFbnRpdHkgbWV0aG9kKSA9PgogICAgICBydGlOZWVkLm1ldGhvZE5lZWRzU2lnbmF0dXJlKG1ldGhvZCk7CgogIEBvdmVycmlkZQogIGJvb2wgaW5zdGFudGlhdGlvbk5lZWRzVHlwZUFyZ3VtZW50cygKICAgICAgICAgIERhcnRUeXBlIGZ1bmN0aW9uVHlwZSwgaW50IHR5cGVBcmd1bWVudENvdW50KSA9PgogICAgICBydGlOZWVkLmluc3RhbnRpYXRpb25OZWVkc1R5cGVBcmd1bWVudHMoZnVuY3Rpb25UeXBlLCB0eXBlQXJndW1lbnRDb3VudCk7Cn0KCi8vLyBNYXAgZnJvbSAnZnJvbnRlbmQnIHRvICdiYWNrZW5kJyBlbGVtZW50cy4KLy8vCi8vLyBGcm9udGVuZCBlbGVtZW50cyBhcmUgd2hhdCB3ZSByZWFkIGluLCB0aGVzZSB0eXBpY2FsbHkgcmVwcmVzZW50cyBjb25jZXB0cwovLy8gaW4gRGFydC4gQmFja2VuZCBlbGVtZW50cyBhcmUgd2hhdCB3ZSBnZW5lcmF0ZSwgdGhlc2UgbWF5IGluY2x1ZGUgZWxlbWVudHMKLy8vIHRoYXQgZG8gbm90IGNvcnJlc3BvbmQgdG8gYSBEYXJ0IGNvbmNlcHQsIHN1Y2ggYXMgY2xvc3VyZSBjbGFzc2VzLgovLy8KLy8vIFF1ZXJ5aW5nIGZvciB0aGUgZnJvbnRlbmQgZWxlbWVudCBmb3IgYSBiYWNrZW5kLW9ubHkgZWxlbWVudCB0aHJvd3MgYW4KLy8vIGV4Y2VwdGlvbi4KYWJzdHJhY3QgY2xhc3MgSnNUb0Zyb250ZW5kTWFwIHsKICBMaWJyYXJ5RW50aXR5IHRvQmFja2VuZExpYnJhcnkoTGlicmFyeUVudGl0eSBsaWJyYXJ5KTsKCiAgQ2xhc3NFbnRpdHkgdG9CYWNrZW5kQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgdGhlIGJhY2tlbmQgbWVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gW21lbWJlcl0uIElmIGEgbWVtYmVyIGlzbid0CiAgLy8vIGxpdmUsIGl0IGRvZXNuJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgYmFja2VuZCBtZW1iZXIgYW5kIGBudWxsYCBpcwogIC8vLyByZXR1cm5lZCBpbnN0ZWFkLgogIE1lbWJlckVudGl0eSB0b0JhY2tlbmRNZW1iZXIoTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIERhcnRUeXBlIHRvQmFja2VuZFR5cGUoRGFydFR5cGUgdHlwZSwge2Jvb2wgYWxsb3dGcmVlVmFyaWFibGVzOiBmYWxzZX0pOwoKICBDb25zdGFudFZhbHVlIHRvQmFja2VuZENvbnN0YW50KENvbnN0YW50VmFsdWUgdmFsdWUsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgU2V0PExpYnJhcnlFbnRpdHk+IHRvQmFja2VuZExpYnJhcnlTZXQoSXRlcmFibGU8TGlicmFyeUVudGl0eT4gc2V0KSB7CiAgICByZXR1cm4gc2V0Lm1hcCh0b0JhY2tlbmRMaWJyYXJ5KS50b1NldCgpOwogIH0KCiAgU2V0PENsYXNzRW50aXR5PiB0b0JhY2tlbmRDbGFzc1NldChJdGVyYWJsZTxDbGFzc0VudGl0eT4gc2V0KSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBGaWx0ZXIgdW51c2VkIGNsYXNzZXMuCiAgICByZXR1cm4gc2V0Lm1hcCh0b0JhY2tlbmRDbGFzcykudG9TZXQoKTsKICB9CgogIFNldDxNZW1iZXJFbnRpdHk+IHRvQmFja2VuZE1lbWJlclNldChJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IHNldCkgewogICAgcmV0dXJuIHNldC5tYXAodG9CYWNrZW5kTWVtYmVyKS53aGVyZSgoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICAvLyBNZW1iZXJzIHRoYXQgYXJlIG5vdCBsaXZlIGRvbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGJhY2tlbmQgbWVtYmVyLgogICAgICByZXR1cm4gbWVtYmVyICE9IG51bGw7CiAgICB9KS50b1NldCgpOwogIH0KCiAgU2V0PEZpZWxkRW50aXR5PiB0b0JhY2tlbmRGaWVsZFNldChJdGVyYWJsZTxGaWVsZEVudGl0eT4gc2V0KSB7CiAgICBTZXQ8RmllbGRFbnRpdHk+IG5ld1NldCA9IG5ldyBTZXQ8RmllbGRFbnRpdHk+KCk7CiAgICBmb3IgKEZpZWxkRW50aXR5IGVsZW1lbnQgaW4gc2V0KSB7CiAgICAgIEZpZWxkRW50aXR5IGJhY2tlbmRGaWVsZCA9IHRvQmFja2VuZE1lbWJlcihlbGVtZW50KTsKICAgICAgaWYgKGJhY2tlbmRGaWVsZCAhPSBudWxsKSB7CiAgICAgICAgLy8gTWVtYmVycyB0aGF0IGFyZSBub3QgbGl2ZSBkb24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBiYWNrZW5kIG1lbWJlci4KICAgICAgICBuZXdTZXQuYWRkKGJhY2tlbmRGaWVsZCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXdTZXQ7CiAgfQoKICBTZXQ8RnVuY3Rpb25FbnRpdHk+IHRvQmFja2VuZEZ1bmN0aW9uU2V0KEl0ZXJhYmxlPEZ1bmN0aW9uRW50aXR5PiBzZXQpIHsKICAgIFNldDxGdW5jdGlvbkVudGl0eT4gbmV3U2V0ID0gbmV3IFNldDxGdW5jdGlvbkVudGl0eT4oKTsKICAgIGZvciAoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCBpbiBzZXQpIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgYmFja2VuZEZ1bmN0aW9uID0gdG9CYWNrZW5kTWVtYmVyKGVsZW1lbnQpOwogICAgICBpZiAoYmFja2VuZEZ1bmN0aW9uICE9IG51bGwpIHsKICAgICAgICAvLyBNZW1iZXJzIHRoYXQgYXJlIG5vdCBsaXZlIGRvbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGJhY2tlbmQgbWVtYmVyLgogICAgICAgIG5ld1NldC5hZGQoYmFja2VuZEZ1bmN0aW9uKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ld1NldDsKICB9CgogIE1hcDxMaWJyYXJ5RW50aXR5LCBWPiB0b0JhY2tlbmRMaWJyYXJ5TWFwPFY+KAogICAgICBNYXA8TGlicmFyeUVudGl0eSwgVj4gbWFwLCBWIGNvbnZlcnQoViB2YWx1ZSkpIHsKICAgIHJldHVybiBjb252ZXJ0TWFwKG1hcCwgdG9CYWNrZW5kTGlicmFyeSwgY29udmVydCk7CiAgfQoKICBNYXA8Q2xhc3NFbnRpdHksIFY+IHRvQmFja2VuZENsYXNzTWFwPFY+KAogICAgICBNYXA8Q2xhc3NFbnRpdHksIFY+IG1hcCwgViBjb252ZXJ0KFYgdmFsdWUpKSB7CiAgICByZXR1cm4gY29udmVydE1hcChtYXAsIHRvQmFja2VuZENsYXNzLCBjb252ZXJ0KTsKICB9CgogIE1hcDxNZW1iZXJFbnRpdHksIFYyPiB0b0JhY2tlbmRNZW1iZXJNYXA8VjEsIFYyPigKICAgICAgTWFwPE1lbWJlckVudGl0eSwgVjE+IG1hcCwgVjIgY29udmVydChWMSB2YWx1ZSkpIHsKICAgIHJldHVybiBjb252ZXJ0TWFwKG1hcCwgdG9CYWNrZW5kTWVtYmVyLCBjb252ZXJ0KTsKICB9Cn0KCkUgaWRlbnRpdHk8RT4oRSBlbGVtZW50KSA9PiBlbGVtZW50OwoKTWFwPEssIFYyPiBjb252ZXJ0TWFwPEssIFYxLCBWMj4oCiAgICBNYXA8SywgVjE+IG1hcCwgSyBjb252ZXJ0S2V5KEsga2V5KSwgVjIgY29udmVydFZhbHVlKFYxIHZhbHVlKSkgewogIE1hcDxLLCBWMj4gbmV3TWFwID0gPEssIFYyPnt9OwogIG1hcC5mb3JFYWNoKChLIGtleSwgVjEgdmFsdWUpIHsKICAgIEsgbmV3S2V5ID0gY29udmVydEtleShrZXkpOwogICAgVjIgbmV3VmFsdWUgPSBjb252ZXJ0VmFsdWUodmFsdWUpOwogICAgaWYgKG5ld0tleSAhPSBudWxsICYmIG5ld1ZhbHVlICE9IG51bGwpIHsKICAgICAgLy8gRW50aXRpZXMgdGhhdCBhcmUgbm90IHVzZWQgZG9uJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgYmFja2VuZCBlbnRpdHkuCiAgICAgIG5ld01hcFtuZXdLZXldID0gbmV3VmFsdWU7CiAgICB9CiAgfSk7CiAgcmV0dXJuIG5ld01hcDsKfQoKY2xhc3MgSnNUb0Zyb250ZW5kTWFwSW1wbCBleHRlbmRzIEpzVG9Gcm9udGVuZE1hcCB7CiAgZmluYWwgSnNLZXJuZWxUb0VsZW1lbnRNYXAgX2JhY2tlbmQ7CgogIEpzVG9Gcm9udGVuZE1hcEltcGwodGhpcy5fYmFja2VuZCk7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHRvQmFja2VuZFR5cGUoRGFydFR5cGUgdHlwZSwge2Jvb2wgYWxsb3dGcmVlVmFyaWFibGVzOiBmYWxzZX0pID0+CiAgICAgIHR5cGUgPT0gbnVsbAogICAgICAgICAgPyBudWxsCiAgICAgICAgICA6IG5ldyBfVHlwZUNvbnZlcnRlcihhbGxvd0ZyZWVWYXJpYWJsZXM6IGFsbG93RnJlZVZhcmlhYmxlcykKICAgICAgICAgICAgICAudmlzaXQodHlwZSwgdG9CYWNrZW5kRW50aXR5KTsKCiAgRW50aXR5IHRvQmFja2VuZEVudGl0eShFbnRpdHkgZW50aXR5KSB7CiAgICBpZiAoZW50aXR5IGlzIENsYXNzRW50aXR5KSByZXR1cm4gdG9CYWNrZW5kQ2xhc3MoZW50aXR5KTsKICAgIGlmIChlbnRpdHkgaXMgTWVtYmVyRW50aXR5KSByZXR1cm4gdG9CYWNrZW5kTWVtYmVyKGVudGl0eSk7CiAgICBpZiAoZW50aXR5IGlzIFR5cGVkZWZFbnRpdHkpIHJldHVybiB0b0JhY2tlbmRUeXBlZGVmKGVudGl0eSk7CiAgICBpZiAoZW50aXR5IGlzIFR5cGVWYXJpYWJsZUVudGl0eSkgewogICAgICByZXR1cm4gdG9CYWNrZW5kVHlwZVZhcmlhYmxlKGVudGl0eSk7CiAgICB9CiAgICBhc3NlcnQoZW50aXR5IGlzIExpYnJhcnlFbnRpdHksICd1bmV4cGVjdGVkIGVudGl0eSAke2VudGl0eS5ydW50aW1lVHlwZX0nKTsKICAgIHJldHVybiB0b0JhY2tlbmRMaWJyYXJ5KGVudGl0eSk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RW50aXR5IHRvQmFja2VuZExpYnJhcnkoY292YXJpYW50IEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIHJldHVybiBfYmFja2VuZC5saWJyYXJpZXMuZ2V0RW50aXR5KGxpYnJhcnkubGlicmFyeUluZGV4KTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IHRvQmFja2VuZENsYXNzKGNvdmFyaWFudCBJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICByZXR1cm4gX2JhY2tlbmQuY2xhc3Nlcy5nZXRFbnRpdHkoY2xzLmNsYXNzSW5kZXgpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IHRvQmFja2VuZE1lbWJlcihjb3ZhcmlhbnQgSW5kZXhlZE1lbWJlciBtZW1iZXIpIHsKICAgIHJldHVybiBfYmFja2VuZC5tZW1iZXJzLmdldEVudGl0eShtZW1iZXIubWVtYmVySW5kZXgpOwogIH0KCiAgVHlwZWRlZkVudGl0eSB0b0JhY2tlbmRUeXBlZGVmKGNvdmFyaWFudCBJbmRleGVkVHlwZWRlZiB0eXBlZGVmKSB7CiAgICByZXR1cm4gX2JhY2tlbmQudHlwZWRlZnMuZ2V0RW50aXR5KHR5cGVkZWYudHlwZWRlZkluZGV4KTsKICB9CgogIFR5cGVWYXJpYWJsZUVudGl0eSB0b0JhY2tlbmRUeXBlVmFyaWFibGUoVHlwZVZhcmlhYmxlRW50aXR5IHR5cGVWYXJpYWJsZSkgewogICAgaWYgKHR5cGVWYXJpYWJsZSBpcyBLTG9jYWxUeXBlVmFyaWFibGUpIHsKICAgICAgZmFpbGVkQXQoCiAgICAgICAgICB0eXBlVmFyaWFibGUsICJMb2NhbCBmdW5jdGlvbiB0eXBlIHZhcmlhYmxlcyBhcmUgbm90IHN1cHBvcnRlZC4iKTsKICAgIH0KICAgIEluZGV4ZWRUeXBlVmFyaWFibGUgaW5kZXhlZFR5cGVWYXJpYWJsZSA9IHR5cGVWYXJpYWJsZTsKICAgIHJldHVybiBfYmFja2VuZC50eXBlVmFyaWFibGVzCiAgICAgICAgLmdldEVudGl0eShpbmRleGVkVHlwZVZhcmlhYmxlLnR5cGVWYXJpYWJsZUluZGV4KTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdG9CYWNrZW5kQ29uc3RhbnQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChjb25zdGFudCA9PSBudWxsKSB7CiAgICAgIGlmICghYWxsb3dOdWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ051bGwgbm90IGFsbG93ZWQgYXMgY29uc3RhbnQgdmFsdWUuJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gY29uc3RhbnQuYWNjZXB0KG5ldyBfQ29uc3RhbnRDb252ZXJ0ZXIodG9CYWNrZW5kRW50aXR5KSwgbnVsbCk7CiAgfQp9Cgp0eXBlZGVmIEVudGl0eSBfRW50aXR5Q29udmVydGVyKEVudGl0eSBjbHMpOwoKY2xhc3MgX1R5cGVDb252ZXJ0ZXIgaW1wbGVtZW50cyBEYXJ0VHlwZVZpc2l0b3I8RGFydFR5cGUsIF9FbnRpdHlDb252ZXJ0ZXI+IHsKICBmaW5hbCBib29sIGFsbG93RnJlZVZhcmlhYmxlczsKCiAgTWFwPEZ1bmN0aW9uVHlwZVZhcmlhYmxlLCBGdW5jdGlvblR5cGVWYXJpYWJsZT4gX2Z1bmN0aW9uVHlwZVZhcmlhYmxlcyA9CiAgICAgIDxGdW5jdGlvblR5cGVWYXJpYWJsZSwgRnVuY3Rpb25UeXBlVmFyaWFibGU+e307CgogIF9UeXBlQ29udmVydGVyKHt0aGlzLmFsbG93RnJlZVZhcmlhYmxlczogZmFsc2V9KTsKCiAgTGlzdDxEYXJ0VHlwZT4gY29udmVydFR5cGVzKAogICAgICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZXMsIF9FbnRpdHlDb252ZXJ0ZXIgY29udmVydGVyKSA9PgogICAgICB2aXNpdExpc3QodHlwZXMsIGNvbnZlcnRlcik7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0KERhcnRUeXBlIHR5cGUsIF9FbnRpdHlDb252ZXJ0ZXIgY29udmVydGVyKSB7CiAgICByZXR1cm4gdHlwZS5hY2NlcHQodGhpcywgY29udmVydGVyKTsKICB9CgogIExpc3Q8RGFydFR5cGU+IHZpc2l0TGlzdChMaXN0PERhcnRUeXBlPiB0eXBlcywgX0VudGl0eUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKICAgIExpc3Q8RGFydFR5cGU+IGxpc3QgPSA8RGFydFR5cGU+W107CiAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gdHlwZXMpIHsKICAgICAgbGlzdC5hZGQodmlzaXQodHlwZSwgY29udmVydGVyKSk7CiAgICB9CiAgICByZXR1cm4gbGlzdDsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgdHlwZSwgX0VudGl0eUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgdHlwZSwgX0VudGl0eUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBjb252ZXJ0ZXIodHlwZS5lbGVtZW50KSwgdmlzaXRMaXN0KHR5cGUudHlwZUFyZ3VtZW50cywgY29udmVydGVyKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIHR5cGUsIF9FbnRpdHlDb252ZXJ0ZXIgY29udmVydGVyKSB7CiAgICByZXR1cm4gbmV3IFR5cGVkZWZUeXBlKAogICAgICAgIGNvbnZlcnRlcih0eXBlLmVsZW1lbnQpLAogICAgICAgIHZpc2l0TGlzdCh0eXBlLnR5cGVBcmd1bWVudHMsIGNvbnZlcnRlciksCiAgICAgICAgdmlzaXQodHlwZS51bmFsaWFzZWQsIGNvbnZlcnRlcikpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRUeXBlVmFyaWFibGVUeXBlKAogICAgICBUeXBlVmFyaWFibGVUeXBlIHR5cGUsIF9FbnRpdHlDb252ZXJ0ZXIgY29udmVydGVyKSB7CiAgICByZXR1cm4gbmV3IFR5cGVWYXJpYWJsZVR5cGUoY29udmVydGVyKHR5cGUuZWxlbWVudCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIHR5cGUsIF9FbnRpdHlDb252ZXJ0ZXIgY29udmVydGVyKSB7CiAgICBMaXN0PEZ1bmN0aW9uVHlwZVZhcmlhYmxlPiB0eXBlVmFyaWFibGVzID0gPEZ1bmN0aW9uVHlwZVZhcmlhYmxlPltdOwogICAgZm9yIChGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUgaW4gdHlwZS50eXBlVmFyaWFibGVzKSB7CiAgICAgIHR5cGVWYXJpYWJsZXMuYWRkKF9mdW5jdGlvblR5cGVWYXJpYWJsZXNbdHlwZVZhcmlhYmxlXSA9CiAgICAgICAgICBuZXcgRnVuY3Rpb25UeXBlVmFyaWFibGUodHlwZVZhcmlhYmxlLmluZGV4KSk7CiAgICB9CiAgICBmb3IgKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSBpbiB0eXBlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgX2Z1bmN0aW9uVHlwZVZhcmlhYmxlc1t0eXBlVmFyaWFibGVdLmJvdW5kID0gdHlwZVZhcmlhYmxlLmJvdW5kICE9IG51bGwKICAgICAgICAgID8gdmlzaXQodHlwZVZhcmlhYmxlLmJvdW5kLCBjb252ZXJ0ZXIpCiAgICAgICAgICA6IG51bGw7CiAgICB9CiAgICBEYXJ0VHlwZSByZXR1cm5UeXBlID0gdmlzaXQodHlwZS5yZXR1cm5UeXBlLCBjb252ZXJ0ZXIpOwogICAgTGlzdDxEYXJ0VHlwZT4gcGFyYW1ldGVyVHlwZXMgPSB2aXNpdExpc3QodHlwZS5wYXJhbWV0ZXJUeXBlcywgY29udmVydGVyKTsKICAgIExpc3Q8RGFydFR5cGU+IG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMgPQogICAgICAgIHZpc2l0TGlzdCh0eXBlLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMsIGNvbnZlcnRlcik7CiAgICBMaXN0PERhcnRUeXBlPiBuYW1lZFBhcmFtZXRlclR5cGVzID0KICAgICAgICB2aXNpdExpc3QodHlwZS5uYW1lZFBhcmFtZXRlclR5cGVzLCBjb252ZXJ0ZXIpOwogICAgZm9yIChGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUgaW4gdHlwZS50eXBlVmFyaWFibGVzKSB7CiAgICAgIF9mdW5jdGlvblR5cGVWYXJpYWJsZXMucmVtb3ZlKHR5cGVWYXJpYWJsZSk7CiAgICB9CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZShyZXR1cm5UeXBlLCBwYXJhbWV0ZXJUeXBlcywgb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywKICAgICAgICB0eXBlLm5hbWVkUGFyYW1ldGVycywgbmFtZWRQYXJhbWV0ZXJUeXBlcywgdHlwZVZhcmlhYmxlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEZ1bmN0aW9uVHlwZVZhcmlhYmxlKAogICAgICBGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlLCBfRW50aXR5Q29udmVydGVyIGNvbnZlcnRlcikgewogICAgRGFydFR5cGUgcmVzdWx0ID0gX2Z1bmN0aW9uVHlwZVZhcmlhYmxlc1t0eXBlXTsKICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiBhbGxvd0ZyZWVWYXJpYWJsZXMpIHsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CiAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwsCiAgICAgICAgIkZ1bmN0aW9uIHR5cGUgdmFyaWFibGUgJHR5cGUgbm90IGZvdW5kIGluICRfZnVuY3Rpb25UeXBlVmFyaWFibGVzIik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSB0eXBlLCBfRW50aXR5Q29udmVydGVyIGNvbnZlcnRlcikgewogICAgcmV0dXJuIGNvbnN0IFZvaWRUeXBlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEZ1dHVyZU9yVHlwZShGdXR1cmVPclR5cGUgdHlwZSwgX0VudGl0eUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKICAgIHJldHVybiBuZXcgRnV0dXJlT3JUeXBlKHZpc2l0KHR5cGUudHlwZUFyZ3VtZW50LCBjb252ZXJ0ZXIpKTsKICB9Cn0KCmNsYXNzIF9Db25zdGFudENvbnZlcnRlciBpbXBsZW1lbnRzIENvbnN0YW50VmFsdWVWaXNpdG9yPENvbnN0YW50VmFsdWUsIE51bGw+IHsKICBmaW5hbCBFbnRpdHkgRnVuY3Rpb24oRW50aXR5KSB0b0JhY2tlbmRFbnRpdHk7CiAgZmluYWwgX1R5cGVDb252ZXJ0ZXIgdHlwZUNvbnZlcnRlcjsKCiAgX0NvbnN0YW50Q29udmVydGVyKHRoaXMudG9CYWNrZW5kRW50aXR5KQogICAgICA6IHR5cGVDb252ZXJ0ZXIgPSBuZXcgX1R5cGVDb252ZXJ0ZXIoKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdE51bGwoTnVsbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIF8pID0+IGNvbnN0YW50OwogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXRJbnQoSW50Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgXykgPT4gY29uc3RhbnQ7CiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdERvdWJsZShEb3VibGVDb25zdGFudFZhbHVlIGNvbnN0YW50LCBfKSA9PiBjb25zdGFudDsKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0Qm9vbChCb29sQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgXykgPT4gY29uc3RhbnQ7CiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdFN0cmluZyhTdHJpbmdDb25zdGFudFZhbHVlIGNvbnN0YW50LCBfKSA9PiBjb25zdGFudDsKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0RHVtbXlJbnRlcmNlcHRvcigKICAgICAgICAgIER1bW15SW50ZXJjZXB0b3JDb25zdGFudFZhbHVlIGNvbnN0YW50LCBfKSA9PgogICAgICBjb25zdGFudDsKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0VW5yZWFjaGFibGUoVW5yZWFjaGFibGVDb25zdGFudFZhbHVlIGNvbnN0YW50LCBfKSA9PgogICAgICBjb25zdGFudDsKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0SnNOYW1lKEpzTmFtZUNvbnN0YW50VmFsdWUgY29uc3RhbnQsIF8pID0+IGNvbnN0YW50OwogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXROb25Db25zdGFudChOb25Db25zdGFudFZhbHVlIGNvbnN0YW50LCBfKSA9PiBjb25zdGFudDsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdEZ1bmN0aW9uKEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgXykgewogICAgcmV0dXJuIG5ldyBGdW5jdGlvbkNvbnN0YW50VmFsdWUodG9CYWNrZW5kRW50aXR5KGNvbnN0YW50LmVsZW1lbnQpLAogICAgICAgIHR5cGVDb252ZXJ0ZXIudmlzaXQoY29uc3RhbnQudHlwZSwgdG9CYWNrZW5kRW50aXR5KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0TGlzdChMaXN0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgXykgewogICAgRGFydFR5cGUgdHlwZSA9IHR5cGVDb252ZXJ0ZXIudmlzaXQoY29uc3RhbnQudHlwZSwgdG9CYWNrZW5kRW50aXR5KTsKICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZW50cmllcyA9IF9oYW5kbGVWYWx1ZXMoY29uc3RhbnQuZW50cmllcyk7CiAgICBpZiAoaWRlbnRpY2FsKGVudHJpZXMsIGNvbnN0YW50LmVudHJpZXMpICYmIHR5cGUgPT0gY29uc3RhbnQudHlwZSkgewogICAgICByZXR1cm4gY29uc3RhbnQ7CiAgICB9CiAgICByZXR1cm4gbmV3IExpc3RDb25zdGFudFZhbHVlKHR5cGUsIGVudHJpZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdFNldCgKICAgICAgY292YXJpYW50IGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0U2V0Q29uc3RhbnQgY29uc3RhbnQsIF8pIHsKICAgIERhcnRUeXBlIHR5cGUgPSB0eXBlQ29udmVydGVyLnZpc2l0KGNvbnN0YW50LnR5cGUsIHRvQmFja2VuZEVudGl0eSk7CiAgICBNYXBDb25zdGFudFZhbHVlIGVudHJpZXMgPSBjb25zdGFudC5lbnRyaWVzLmFjY2VwdCh0aGlzLCBudWxsKTsKICAgIGlmIChpZGVudGljYWwoZW50cmllcywgY29uc3RhbnQuZW50cmllcykgJiYgdHlwZSA9PSBjb25zdGFudC50eXBlKSB7CiAgICAgIHJldHVybiBjb25zdGFudDsKICAgIH0KICAgIHJldHVybiBuZXcgY29uc3RhbnRfc3lzdGVtLkphdmFTY3JpcHRTZXRDb25zdGFudCh0eXBlLCBlbnRyaWVzKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXRNYXAoCiAgICAgIGNvdmFyaWFudCBjb25zdGFudF9zeXN0ZW0uSmF2YVNjcmlwdE1hcENvbnN0YW50IGNvbnN0YW50LCBfKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gdHlwZUNvbnZlcnRlci52aXNpdChjb25zdGFudC50eXBlLCB0b0JhY2tlbmRFbnRpdHkpOwogICAgTGlzdENvbnN0YW50VmFsdWUga2V5cyA9IGNvbnN0YW50LmtleUxpc3QuYWNjZXB0KHRoaXMsIG51bGwpOwogICAgTGlzdDxDb25zdGFudFZhbHVlPiB2YWx1ZXMgPSBfaGFuZGxlVmFsdWVzKGNvbnN0YW50LnZhbHVlcyk7CiAgICBDb25zdGFudFZhbHVlIHByb3RvVmFsdWUgPSBjb25zdGFudC5wcm90b1ZhbHVlPy5hY2NlcHQodGhpcywgbnVsbCk7CiAgICBpZiAoaWRlbnRpY2FsKGtleXMsIGNvbnN0YW50LmtleXMpICYmCiAgICAgICAgaWRlbnRpY2FsKHZhbHVlcywgY29uc3RhbnQudmFsdWVzKSAmJgogICAgICAgIHR5cGUgPT0gY29uc3RhbnQudHlwZSAmJgogICAgICAgIHByb3RvVmFsdWUgPT0gY29uc3RhbnQucHJvdG9WYWx1ZSkgewogICAgICByZXR1cm4gY29uc3RhbnQ7CiAgICB9CiAgICByZXR1cm4gbmV3IGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQoCiAgICAgICAgdHlwZSwga2V5cywgdmFsdWVzLCBwcm90b1ZhbHVlLCBjb25zdGFudC5vbmx5U3RyaW5nS2V5cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0Q29uc3RydWN0ZWQoQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlIGNvbnN0YW50LCBfKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gdHlwZUNvbnZlcnRlci52aXNpdChjb25zdGFudC50eXBlLCB0b0JhY2tlbmRFbnRpdHkpOwogICAgTWFwPEZpZWxkRW50aXR5LCBDb25zdGFudFZhbHVlPiBmaWVsZHMgPSB7fTsKICAgIGNvbnN0YW50LmZpZWxkcy5mb3JFYWNoKChmLCB2KSB7CiAgICAgIEZpZWxkRW50aXR5IGJhY2tlbmRGaWVsZCA9IHRvQmFja2VuZEVudGl0eShmKTsKICAgICAgYXNzZXJ0KGJhY2tlbmRGaWVsZCAhPSBudWxsLCAiTm8gYmFja2VuZCBmaWVsZCBmb3IgJGYuIik7CiAgICAgIGZpZWxkc1tiYWNrZW5kRmllbGRdID0gdi5hY2NlcHQodGhpcywgbnVsbCk7CiAgICB9KTsKICAgIHJldHVybiBuZXcgQ29uc3RydWN0ZWRDb25zdGFudFZhbHVlKHR5cGUsIGZpZWxkcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0VHlwZShUeXBlQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgXykgewogICAgRGFydFR5cGUgdHlwZSA9IHR5cGVDb252ZXJ0ZXIudmlzaXQoY29uc3RhbnQudHlwZSwgdG9CYWNrZW5kRW50aXR5KTsKICAgIERhcnRUeXBlIHJlcHJlc2VudGVkVHlwZSA9CiAgICAgICAgdHlwZUNvbnZlcnRlci52aXNpdChjb25zdGFudC5yZXByZXNlbnRlZFR5cGUsIHRvQmFja2VuZEVudGl0eSk7CiAgICBpZiAodHlwZSA9PSBjb25zdGFudC50eXBlICYmIHJlcHJlc2VudGVkVHlwZSA9PSBjb25zdGFudC5yZXByZXNlbnRlZFR5cGUpIHsKICAgICAgcmV0dXJuIGNvbnN0YW50OwogICAgfQogICAgcmV0dXJuIG5ldyBUeXBlQ29uc3RhbnRWYWx1ZShyZXByZXNlbnRlZFR5cGUsIHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdEludGVyY2VwdG9yKEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgXykgewogICAgLy8gSW50ZXJjZXB0b3IgY29uc3RhbnRzIGFyZSBvbmx5IGNyZWF0ZWQgaW4gdGhlIFNTQSBncmFwaCBidWlsZGVyLgogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIlVuZXhwZWN0ZWQgdmlzaXRJbnRlcmNlcHRvciAke2NvbnN0YW50LnRvU3RydWN0dXJlZFRleHQoKX0iKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXREZWZlcnJlZEdsb2JhbChEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIF8pIHsKICAgIC8vIERlZmVycmVkIGdsb2JhbCBjb25zdGFudHMgYXJlIG9ubHkgY3JlYXRlZCBpbiB0aGUgU1NBIGdyYXBoIGJ1aWxkZXIuCiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiVW5leHBlY3RlZCBEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgJHtjb25zdGFudC50b1N0cnVjdHVyZWRUZXh0KCl9Iik7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0SW5zdGFudGlhdGlvbihJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgXykgewogICAgQ29uc3RhbnRWYWx1ZSBmdW5jdGlvbiA9IGNvbnN0YW50LmZ1bmN0aW9uLmFjY2VwdCh0aGlzLCBudWxsKTsKICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPQogICAgICAgIHR5cGVDb252ZXJ0ZXIuY29udmVydFR5cGVzKGNvbnN0YW50LnR5cGVBcmd1bWVudHMsIHRvQmFja2VuZEVudGl0eSk7CiAgICByZXR1cm4gbmV3IEluc3RhbnRpYXRpb25Db25zdGFudFZhbHVlKHR5cGVBcmd1bWVudHMsIGZ1bmN0aW9uKTsKICB9CgogIExpc3Q8Q29uc3RhbnRWYWx1ZT4gX2hhbmRsZVZhbHVlcyhMaXN0PENvbnN0YW50VmFsdWU+IHZhbHVlcykgewogICAgTGlzdDxDb25zdGFudFZhbHVlPiByZXN1bHQ7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbaV07CiAgICAgIHZhciBuZXdWYWx1ZSA9IHZhbHVlLmFjY2VwdCh0aGlzLCBudWxsKTsKICAgICAgaWYgKG5ld1ZhbHVlICE9IHZhbHVlICYmIHJlc3VsdCA9PSBudWxsKSB7CiAgICAgICAgcmVzdWx0ID0gdmFsdWVzLnN1Ymxpc3QoMCwgaSkudG9MaXN0KCk7CiAgICAgIH0KICAgICAgcmVzdWx0Py5hZGQobmV3VmFsdWUpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdCA/PyB2YWx1ZXM7CiAgfQp9CoPDAE5OPAEoARoZIj8jICQjISExHSkrLC4pNTYjIhorJSMoJBgXGBsgGBYBHSpEJEsqMCI2AUBNAVBEASQgOihAASA9TSkmTwFCAUU0TDYxJQhOJydDCk0KSEQWBgFJKjI6Lk82RE4uChwKBgEfRy1EJSABLEEBM00BRh9OATBFASk+ASlCAR4BOx0rLz8QOykYDUBCJyg9NDcIRicoQTQ7CAEmRj8QOyAYNzQYAU1LJD8IUU8oPwhMKzQBGgYBTUJFQk4BJzkBSkhRASRDAUslH0kBHhUUGRYRGxocG0lRGzchGhMmIEsgGRoVGBcEASU8NUsvRS5EKT8qSyEfOjsQASFAOjIuLD0qOzkqPzM9MgQBK0I6KSc5OQg0TzBLMUoxTCQdHBwaIxsEASE4Jh5LS09CCCMTBgFEOQE1SAg5TAgBQDg6OCwaBgFQATFHPywkREIjShNPCAhAIEhBIEkfGRoeISMEAT9EOCcnPEIIJBQZHEMfQgQBQUEzRDZHMkMySCsdGzZDOSUIFxAlHSUhJQ4OJzUEAUkRLBszIS8cIyY7AVEQJRoYDhMxNwFIHUZBTUZKKAEdBAFBPFAsMi8zMD9AJUwVKAoKQVAiKEs5CgoVBgFPLjQxMzFBQiVMFSgKCkFHMChLMTU4DAoKFQYBJA4eGRpCMgQCATghAQw6AQw5AQxAAQw+AQw+AQw6AQwoOwwCATMiR0MBTzEBDDw/BAEMMywBDDowAQxAQwQBDDg0AQw0LAEMKDtQAgEvBE9PRwRLDyE5AS8BTkkYNQFLAVEBSC4EAUIzLAQBRUJOHRAEAUI2JzsiUCIIBhMEAUs8KkElUCUIBhMEATA3NwQBLDU1BAE0OTYEAgElASJGISIgJy5PIQYGEQIBNCcBJgEMTRMRRy0BKj5AQigsBlAlBAEMRT8EAQw7NwQBDEE7BAFFPgQBTi4QTQY8IjsEAQw6IRwYSwgTBksEAgEtAU4hAUs2ATQBHz8jAQw+KQQBTygjKAYRBAEMTCAEAQxQHkwEAQxMHCEyKwQBDCI7OgQBDE5JRD85BkROMRIGPU8sOyk4RDMGUEMEAQwmPzQwEwYbThMEAQxGHQQBDE5CBAIBUDEmASsuAQxGDEQMSgxGDEoMJzgQDEoQDEoMTAEMQ0g+BAEMO0lDSRcGMQQBDBpFSURJFwZFBAEMGkVJQkFIKi4hLRcGNkIEAQxJSTElNUAzCDcEAQw7SR9IUBcGOQQBDElIIEcEAQxPTCBSBAEMTUMjTUQEAUIgLh0vMTAIHQYdBAIBM3BhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX21vZGVsL2pzX3dvcmxkX2J1aWxkZXIuZGFydDVzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9jb21tb24vYmFja2VuZF9hcGkuZGFydIPeLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5iYWNrZW5kX2FwaTsKCmltcG9ydCAnLi4vY29tbW9uL3Jlc29sdXRpb24uZGFydCcgc2hvdyBSZXNvbHV0aW9uSW1wYWN0OwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0JyBzaG93IFdvcmxkSW1wYWN0OwoKLy8vIFRhcmdldC1zcGVjaWZpYyB0cmFuc2Zvcm1hdGlvbiBmb3IgcmVzb2x1dGlvbiB3b3JsZCBpbXBhY3RzLgovLy8KLy8vIFRoaXMgcHJvY2Vzc2VzIHRhcmdldC1hZ25vc3RpYyBbUmVzb2x1dGlvbkltcGFjdF1zIGFuZCBjcmVhdGVzIFtXb3JsZEltcGFjdF0KLy8vIGluIHdoaWNoIGJhY2tlbmQvdGFyZ2V0IHNwZWNpZmljIGltcGFjdCBkYXRhIGlzIGFkZGVkLCBmb3IgZXhhbXBsZTogaWYKLy8vIGNlcnRhaW4gZmVhdHVyZSBpcyB1c2VkIHRoYXQgcmVxdWlyZXMgc29tZSBoZWxwZXIgY29kZSBmcm9tIHRoZSBiYWNrZW5kCi8vLyBsaWJyYXJpZXMsIHRoaXMgd2lsbCBiZSBpbmNsdWRlZCBieSB0aGUgaW1wYWN0IHRyYW5zZm9ybWVyLgpjbGFzcyBJbXBhY3RUcmFuc2Zvcm1lciB7CiAgLy8vIFRyYW5zZm9ybSB0aGUgW1Jlc29sdXRpb25JbXBhY3RdIGludG8gYSBbV29ybGRJbXBhY3RdIGFkZGluZyB0aGUKICAvLy8gYmFja2VuZCBkZXBlbmRlbmNpZXMgZm9yIGZlYXR1cmVzIHVzZWQgaW4gW3dvcmxkSW1wYWN0XS4KICBXb3JsZEltcGFjdCB0cmFuc2Zvcm1SZXNvbHV0aW9uSW1wYWN0KFJlc29sdXRpb25JbXBhY3Qgd29ybGRJbXBhY3QpIHsKICAgIHJldHVybiB3b3JsZEltcGFjdDsKICB9Cn0KGABOTjwBHQE6OQFBBFFLTEAaRz9IGAQCASxwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21tb24vYmFja2VuZF9hcGkuZGFydDRzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9jb21tb24vcmVzb2x1dGlvbi5kYXJ0hNsvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmNvbW1vbi5yZXNvbHV0aW9uOwoKaW1wb3J0ICcuLi9jb25zdGFudHMvZXhwcmVzc2lvbnMuZGFydCcgc2hvdyBDb25zdGFudEV4cHJlc3Npb247CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfaW1wYWN0LmRhcnQnIHNob3cgV29ybGRJbXBhY3Q7CmltcG9ydCAnLi4vdW5pdmVyc2UvZmVhdHVyZS5kYXJ0JzsKCmNsYXNzIFJlc29sdXRpb25JbXBhY3QgZXh0ZW5kcyBXb3JsZEltcGFjdCB7CiAgY29uc3QgUmVzb2x1dGlvbkltcGFjdCgpOwoKICBJdGVyYWJsZTxGZWF0dXJlPiBnZXQgZmVhdHVyZXMgPT4gY29uc3QgPEZlYXR1cmU+W107CiAgSXRlcmFibGU8TWFwTGl0ZXJhbFVzZT4gZ2V0IG1hcExpdGVyYWxzID0+IGNvbnN0IDxNYXBMaXRlcmFsVXNlPltdOwogIEl0ZXJhYmxlPFNldExpdGVyYWxVc2U+IGdldCBzZXRMaXRlcmFscyA9PiBjb25zdCA8U2V0TGl0ZXJhbFVzZT5bXTsKICBJdGVyYWJsZTxMaXN0TGl0ZXJhbFVzZT4gZ2V0IGxpc3RMaXRlcmFscyA9PiBjb25zdCA8TGlzdExpdGVyYWxVc2U+W107CiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgY29uc3RTeW1ib2xOYW1lcyA9PiBjb25zdCA8U3RyaW5nPltdOwogIEl0ZXJhYmxlPENvbnN0YW50RXhwcmVzc2lvbj4gZ2V0IGNvbnN0YW50TGl0ZXJhbHMgPT4KICAgICAgY29uc3QgPENvbnN0YW50RXhwcmVzc2lvbj5bXTsKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IHNlZW5DbGFzc2VzID0+IGNvbnN0IDxDbGFzc0VudGl0eT5bXTsKICBJdGVyYWJsZTxSdW50aW1lVHlwZVVzZT4gZ2V0IHJ1bnRpbWVUeXBlVXNlcyA9PiBjb25zdCA8UnVudGltZVR5cGVVc2U+W107CgogIEl0ZXJhYmxlPGR5bmFtaWM+IGdldCBuYXRpdmVEYXRhID0+IGNvbnN0IDxkeW5hbWljPltdOwoKICBJdGVyYWJsZTxHZW5lcmljSW5zdGFudGlhdGlvbj4gZ2V0IGdlbmVyaWNJbnN0YW50aWF0aW9ucyA9PgogICAgICBjb25zdCA8R2VuZXJpY0luc3RhbnRpYXRpb24+W107Cn0KHwBOTjwBIwFAJDkjAS0cATdGRkk9NyRCTAE5AT4mAgErcGFja2FnZTpjb21waWxlci9zcmMvY29tbW9uL3Jlc29sdXRpb24uZGFydDFzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pci9hbm5vdGF0aW9ucy5kYXJ0stwvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnOwppbXBvcnQgJ21vZHVsYXIuZGFydCc7CgpjbGFzcyBJckFubm90YXRpb25EYXRhIHsKICBNYXA8aXIuQ2xhc3MsIFN0cmluZz4gX25hdGl2ZUNsYXNzTmFtZXMgPSB7fTsKICBTZXQ8aXIuTWVtYmVyPiBfbmF0aXZlTWVtYmVycyA9IHt9OwogIE1hcDxpci5NZW1iZXIsIFN0cmluZz4gX25hdGl2ZU1lbWJlck5hbWVzID0ge307CiAgTWFwPGlyLk1lbWJlciwgTGlzdDxTdHJpbmc+PiBfY3JlYXRlc0Fubm90YXRpb25zID0ge307CiAgTWFwPGlyLk1lbWJlciwgTGlzdDxTdHJpbmc+PiBfcmV0dXJuc0Fubm90YXRpb25zID0ge307CgogIE1hcDxpci5MaWJyYXJ5LCBTdHJpbmc+IF9qc0ludGVyb3BMaWJyYXJ5TmFtZXMgPSB7fTsKICBNYXA8aXIuQ2xhc3MsIFN0cmluZz4gX2pzSW50ZXJvcENsYXNzTmFtZXMgPSB7fTsKICBTZXQ8aXIuQ2xhc3M+IF9hbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzID0ge307CiAgTWFwPGlyLk1lbWJlciwgU3RyaW5nPiBfanNJbnRlcm9wTWVtYmVyTmFtZXMgPSB7fTsKCiAgTWFwPGlyLk1lbWJlciwgTGlzdDxQcmFnbWFBbm5vdGF0aW9uRGF0YT4+IF9tZW1iZXJQcmFnbWFBbm5vdGF0aW9ucyA9IHt9OwoKICAvLyBSZXR1cm5zIHRoZSB0ZXh0IGZyb20gdGhlIGBATmF0aXZlKDx0ZXh0PilgIGFubm90YXRpb24gb2YgW25vZGVdLCBpZiBhbnkuCiAgU3RyaW5nIGdldE5hdGl2ZUNsYXNzTmFtZShpci5DbGFzcyBub2RlKSA9PiBfbmF0aXZlQ2xhc3NOYW1lc1tub2RlXTsKCiAgLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW25vZGVdIGhhcyBhIG5hdGl2ZSBib2R5LCBhcyBpbiBgbWV0aG9kKCkgbmF0aXZlO2AuCiAgYm9vbCBoYXNOYXRpdmVCb2R5KGlyLk1lbWJlciBub2RlKSA9PiBfbmF0aXZlTWVtYmVycy5jb250YWlucyhub2RlKTsKCiAgLy8gUmV0dXJucyB0aGUgdGV4dCBmcm9tIHRoZSBgQEpTTmFtZSg8dGV4dD4pYCBhbm5vdGF0aW9uIG9mIFtub2RlXSwgaWYgYW55LgogIFN0cmluZyBnZXROYXRpdmVNZW1iZXJOYW1lKGlyLk1lbWJlciBub2RlKSA9PiBfbmF0aXZlTWVtYmVyTmFtZXNbbm9kZV07CgogIC8vIFJldHVybnMgYSBsaXN0IG9mIHRoZSB0ZXh0IGZyb20gdGhlIGBAQ3JlYXRlcyg8dGV4dD4pYCBhbm5vdGF0aW9uIG9mCiAgLy8gW25vZGVdLgogIExpc3Q8U3RyaW5nPiBnZXRDcmVhdGVzQW5ub3RhdGlvbnMoaXIuTWVtYmVyIG5vZGUpID0+CiAgICAgIF9jcmVhdGVzQW5ub3RhdGlvbnNbbm9kZV0gPz8gY29uc3QgW107CgogIC8vIFJldHVybnMgYSBsaXN0IG9mIHRoZSB0ZXh0IGZyb20gdGhlIGBAUmV0dXJucyg8dGV4dD4pYCBhbm5vdGF0aW9uIG9mCiAgLy8gW25vZGVdLgogIExpc3Q8U3RyaW5nPiBnZXRSZXR1cm5zQW5ub3RhdGlvbnMoaXIuTWVtYmVyIG5vZGUpID0+CiAgICAgIF9yZXR1cm5zQW5ub3RhdGlvbnNbbm9kZV0gPz8gY29uc3QgW107CgogIC8vIFJldHVybnMgdGhlIHRleHQgZnJvbSB0aGUgYEBKUyg8dGV4dD4pYCBhbm5vdGF0aW9uIG9mIFtub2RlXSwgaWYgYW55LgogIFN0cmluZyBnZXRKc0ludGVyb3BMaWJyYXJ5TmFtZShpci5MaWJyYXJ5IG5vZGUpID0+CiAgICAgIF9qc0ludGVyb3BMaWJyYXJ5TmFtZXNbbm9kZV07CgogIC8vIFJldHVybnMgdGhlIHRleHQgZnJvbSB0aGUgYEBKUyg8dGV4dD4pYCBhbm5vdGF0aW9uIG9mIFtub2RlXSwgaWYgYW55LgogIFN0cmluZyBnZXRKc0ludGVyb3BDbGFzc05hbWUoaXIuQ2xhc3Mgbm9kZSkgPT4gX2pzSW50ZXJvcENsYXNzTmFtZXNbbm9kZV07CgogIC8vIFJldHVybnMgYHRydWVgIGlmIFtub2RlXSBpcyBhbm5vdGF0ZWQgd2l0aCBgQGFub255bW91c2AuCiAgYm9vbCBpc0Fub255bW91c0pzSW50ZXJvcENsYXNzKGlyLkNsYXNzIG5vZGUpID0+CiAgICAgIF9hbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzLmNvbnRhaW5zKG5vZGUpOwoKICAvLyBSZXR1cm5zIHRoZSB0ZXh0IGZyb20gdGhlIGBASlMoPHRleHQ+KWAgYW5ub3RhdGlvbiBvZiBbbm9kZV0sIGlmIGFueS4KICBTdHJpbmcgZ2V0SnNJbnRlcm9wTWVtYmVyTmFtZShpci5NZW1iZXIgbm9kZSkgPT4gX2pzSW50ZXJvcE1lbWJlck5hbWVzW25vZGVdOwoKICAvLyBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgYEBwcmFnbWEoJ2RhcnQyanM6PHN1ZmZpeD4nKWAgYW5ub3RhdGlvbnMgb24gW25vZGVdLgogIExpc3Q8UHJhZ21hQW5ub3RhdGlvbkRhdGE+IGdldE1lbWJlclByYWdtYUFubm90YXRpb25EYXRhKGlyLk1lbWJlciBub2RlKSA9PgogICAgICBfbWVtYmVyUHJhZ21hQW5ub3RhdGlvbnNbbm9kZV0gPz8gY29uc3QgW107CgogIHZvaWQgZm9yRWFjaE5hdGl2ZUNsYXNzKHZvaWQgRnVuY3Rpb24oaXIuQ2xhc3MsIFN0cmluZykgZikgewogICAgX25hdGl2ZUNsYXNzTmFtZXMuZm9yRWFjaChmKTsKICB9CgogIHZvaWQgZm9yRWFjaEpzSW50ZXJvcExpYnJhcnkodm9pZCBGdW5jdGlvbihpci5MaWJyYXJ5LCBTdHJpbmcpIGYpIHsKICAgIF9qc0ludGVyb3BMaWJyYXJ5TmFtZXMuZm9yRWFjaChmKTsKICB9CgogIHZvaWQgZm9yRWFjaEpzSW50ZXJvcENsYXNzKAogICAgICB2b2lkIEZ1bmN0aW9uKGlyLkNsYXNzLCBTdHJpbmcsIHtib29sIGlzQW5vbnltb3VzfSkgZikgewogICAgX2pzSW50ZXJvcENsYXNzTmFtZXMuZm9yRWFjaCgoaXIuQ2xhc3Mgbm9kZSwgU3RyaW5nIG5hbWUpIHsKICAgICAgZihub2RlLCBuYW1lLCBpc0Fub255bW91czogaXNBbm9ueW1vdXNKc0ludGVyb3BDbGFzcyhub2RlKSk7CiAgICB9KTsKICB9CgogIHZvaWQgZm9yRWFjaEpzSW50ZXJvcE1lbWJlcih2b2lkIEZ1bmN0aW9uKGlyLk1lbWJlciwgU3RyaW5nKSBmKSB7CiAgICBfanNJbnRlcm9wTGlicmFyeU5hbWVzLmZvckVhY2goKGlyLkxpYnJhcnkgbGlicmFyeSwgXykgewogICAgICBmb3IgKGlyLk1lbWJlciBtZW1iZXIgaW4gbGlicmFyeS5tZW1iZXJzKSB7CiAgICAgICAgaWYgKG1lbWJlci5pc0V4dGVybmFsKSB7CiAgICAgICAgICBmKG1lbWJlciwgX2pzSW50ZXJvcE1lbWJlck5hbWVzW21lbWJlcl0gPz8gbWVtYmVyLm5hbWUubmFtZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIF9qc0ludGVyb3BDbGFzc05hbWVzLmZvckVhY2goKGlyLkNsYXNzIGNscywgXykgewogICAgICBmb3IgKGlyLk1lbWJlciBtZW1iZXIgaW4gY2xzLm1lbWJlcnMpIHsKICAgICAgICBpZiAobWVtYmVyIGlzIGlyLkZpZWxkKSBjb250aW51ZTsKICAgICAgICBTdHJpbmcgbmFtZSA9IF9qc0ludGVyb3BNZW1iZXJOYW1lc1ttZW1iZXJdOwogICAgICAgIGlmIChtZW1iZXIuaXNFeHRlcm5hbCkgewogICAgICAgICAgbmFtZSA/Pz0gbWVtYmVyLm5hbWUubmFtZTsKICAgICAgICB9CiAgICAgICAgZihtZW1iZXIsIG5hbWUpOwogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgZm9yRWFjaE5hdGl2ZU1ldGhvZERhdGEoCiAgICAgIHZvaWQgRnVuY3Rpb24oaXIuTWVtYmVyLCBTdHJpbmcgbmFtZSwgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMsCiAgICAgICAgICAgICAgSXRlcmFibGU8U3RyaW5nPiByZXR1cm5zQW5ub3RhdGlvbnMpCiAgICAgICAgICBmKSB7CiAgICBmb3IgKGlyLk1lbWJlciBub2RlIGluIF9uYXRpdmVNZW1iZXJzKSB7CiAgICAgIGlmIChub2RlIGlzISBpci5GaWVsZCkgewogICAgICAgIFN0cmluZyBuYW1lID0gX25hdGl2ZU1lbWJlck5hbWVzW25vZGVdID8/IG5vZGUubmFtZS5uYW1lOwogICAgICAgIGYobm9kZSwgbmFtZSwgZ2V0Q3JlYXRlc0Fubm90YXRpb25zKG5vZGUpLCBnZXRSZXR1cm5zQW5ub3RhdGlvbnMobm9kZSkpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGZvckVhY2hOYXRpdmVGaWVsZERhdGEoCiAgICAgIHZvaWQgRnVuY3Rpb24oaXIuTWVtYmVyLCBTdHJpbmcgbmFtZSwgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMsCiAgICAgICAgICAgICAgSXRlcmFibGU8U3RyaW5nPiByZXR1cm5zQW5ub3RhdGlvbnMpCiAgICAgICAgICBmKSB7CiAgICBmb3IgKGlyLkNsYXNzIGNscyBpbiBfbmF0aXZlQ2xhc3NOYW1lcy5rZXlzKSB7CiAgICAgIGZvciAoaXIuRmllbGQgZmllbGQgaW4gY2xzLmZpZWxkcykgewogICAgICAgIGlmIChmaWVsZC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgICBTdHJpbmcgbmFtZSA9IF9uYXRpdmVNZW1iZXJOYW1lc1tmaWVsZF0gPz8gZmllbGQubmFtZS5uYW1lOwogICAgICAgICAgZihmaWVsZCwgbmFtZSwgZ2V0Q3JlYXRlc0Fubm90YXRpb25zKGZpZWxkKSwKICAgICAgICAgICAgICBnZXRSZXR1cm5zQW5ub3RhdGlvbnMoZmllbGQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCklyQW5ub3RhdGlvbkRhdGEgcHJvY2Vzc0Fubm90YXRpb25zKE1vZHVsYXJDb3JlIG1vZHVsYXJDb3JlKSB7CiAgaXIuQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsYXJDb3JlLmNvbXBvbmVudDsKICBJckFubm90YXRpb25EYXRhIGRhdGEgPSBuZXcgSXJBbm5vdGF0aW9uRGF0YSgpOwoKICB2b2lkIHByb2Nlc3NNZW1iZXIoaXIuTWVtYmVyIG1lbWJlcikgewogICAgTGlzdDxQcmFnbWFBbm5vdGF0aW9uRGF0YT4gcHJhZ21hQW5ub3RhdGlvbnM7CiAgICBMaXN0PFN0cmluZz4gY3JlYXRlc0Fubm90YXRpb25zOwogICAgTGlzdDxTdHJpbmc+IHJldHVybnNBbm5vdGF0aW9uczsKICAgIGZvciAoaXIuRXhwcmVzc2lvbiBhbm5vdGF0aW9uIGluIG1lbWJlci5hbm5vdGF0aW9ucykgewogICAgICBpZiAoYW5ub3RhdGlvbiBpcyBpci5Db25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgICBpci5Db25zdGFudCBjb25zdGFudCA9CiAgICAgICAgICAgIG1vZHVsYXJDb3JlLmNvbnN0YW50RXZhbHVhdG9yLmV2YWx1YXRlKGFubm90YXRpb24pOwoKICAgICAgICBTdHJpbmcganNOYW1lID0gX2dldEpzSW50ZXJvcE5hbWUoY29uc3RhbnQpOwogICAgICAgIGlmIChqc05hbWUgIT0gbnVsbCkgewogICAgICAgICAgZGF0YS5fanNJbnRlcm9wTWVtYmVyTmFtZXNbbWVtYmVyXSA9IGpzTmFtZTsKICAgICAgICB9CgogICAgICAgIGJvb2wgaXNOYXRpdmVNZW1iZXIgPSBfaXNOYXRpdmVNZW1iZXIoY29uc3RhbnQpOwogICAgICAgIGlmIChpc05hdGl2ZU1lbWJlcikgewogICAgICAgICAgZGF0YS5fbmF0aXZlTWVtYmVycy5hZGQobWVtYmVyKTsKICAgICAgICB9CgogICAgICAgIFN0cmluZyBuYXRpdmVOYW1lID0gX2dldE5hdGl2ZU1lbWJlck5hbWUoY29uc3RhbnQpOwogICAgICAgIGlmIChuYXRpdmVOYW1lICE9IG51bGwpIHsKICAgICAgICAgIGRhdGEuX25hdGl2ZU1lbWJlck5hbWVzW21lbWJlcl0gPSBuYXRpdmVOYW1lOwogICAgICAgIH0KCiAgICAgICAgU3RyaW5nIGNyZWF0ZXMgPSBfZ2V0Q3JlYXRlc0Fubm90YXRpb24oY29uc3RhbnQpOwogICAgICAgIGlmIChjcmVhdGVzICE9IG51bGwpIHsKICAgICAgICAgIGlmIChjcmVhdGVzQW5ub3RhdGlvbnMgPT0gbnVsbCkgewogICAgICAgICAgICBkYXRhLl9jcmVhdGVzQW5ub3RhdGlvbnNbbWVtYmVyXSA9IGNyZWF0ZXNBbm5vdGF0aW9ucyA9IFtdOwogICAgICAgICAgfQogICAgICAgICAgY3JlYXRlc0Fubm90YXRpb25zLmFkZChjcmVhdGVzKTsKICAgICAgICB9CgogICAgICAgIFN0cmluZyByZXR1cm5zID0gX2dldFJldHVybnNBbm5vdGF0aW9uKGNvbnN0YW50KTsKICAgICAgICBpZiAocmV0dXJucyAhPSBudWxsKSB7CiAgICAgICAgICBpZiAocmV0dXJuc0Fubm90YXRpb25zID09IG51bGwpIHsKICAgICAgICAgICAgZGF0YS5fcmV0dXJuc0Fubm90YXRpb25zW21lbWJlcl0gPSByZXR1cm5zQW5ub3RhdGlvbnMgPSBbXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybnNBbm5vdGF0aW9ucy5hZGQocmV0dXJucyk7CiAgICAgICAgfQoKICAgICAgICBQcmFnbWFBbm5vdGF0aW9uRGF0YSBwcmFnbWFBbm5vdGF0aW9uID0gX2dldFByYWdtYUFubm90YXRpb24oY29uc3RhbnQpOwogICAgICAgIGlmIChwcmFnbWFBbm5vdGF0aW9uICE9IG51bGwpIHsKICAgICAgICAgIGlmIChwcmFnbWFBbm5vdGF0aW9ucyA9PSBudWxsKSB7CiAgICAgICAgICAgIGRhdGEuX21lbWJlclByYWdtYUFubm90YXRpb25zW21lbWJlcl0gPSBwcmFnbWFBbm5vdGF0aW9ucyA9IFtdOwogICAgICAgICAgfQogICAgICAgICAgcHJhZ21hQW5ub3RhdGlvbnMuYWRkKHByYWdtYUFubm90YXRpb24pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZm9yIChpci5MaWJyYXJ5IGxpYnJhcnkgaW4gY29tcG9uZW50LmxpYnJhcmllcykgewogICAgZm9yIChpci5FeHByZXNzaW9uIGFubm90YXRpb24gaW4gbGlicmFyeS5hbm5vdGF0aW9ucykgewogICAgICBpZiAoYW5ub3RhdGlvbiBpcyBpci5Db25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgICBpci5Db25zdGFudCBjb25zdGFudCA9CiAgICAgICAgICAgIG1vZHVsYXJDb3JlLmNvbnN0YW50RXZhbHVhdG9yLmV2YWx1YXRlKGFubm90YXRpb24pOwoKICAgICAgICBTdHJpbmcganNOYW1lID0gX2dldEpzSW50ZXJvcE5hbWUoY29uc3RhbnQpOwogICAgICAgIGlmIChqc05hbWUgIT0gbnVsbCkgewogICAgICAgICAgZGF0YS5fanNJbnRlcm9wTGlicmFyeU5hbWVzW2xpYnJhcnldID0ganNOYW1lOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZm9yIChpci5DbGFzcyBjbHMgaW4gbGlicmFyeS5jbGFzc2VzKSB7CiAgICAgIGZvciAoaXIuRXhwcmVzc2lvbiBhbm5vdGF0aW9uIGluIGNscy5hbm5vdGF0aW9ucykgewogICAgICAgIGlmIChhbm5vdGF0aW9uIGlzIGlyLkNvbnN0YW50RXhwcmVzc2lvbikgewogICAgICAgICAgaXIuQ29uc3RhbnQgY29uc3RhbnQgPQogICAgICAgICAgICAgIG1vZHVsYXJDb3JlLmNvbnN0YW50RXZhbHVhdG9yLmV2YWx1YXRlKGFubm90YXRpb24pOwoKICAgICAgICAgIFN0cmluZyBuYXRpdmVDbGFzc05hbWUgPSBfZ2V0TmF0aXZlQ2xhc3NOYW1lKGNvbnN0YW50KTsKICAgICAgICAgIGlmIChuYXRpdmVDbGFzc05hbWUgIT0gbnVsbCkgewogICAgICAgICAgICBkYXRhLl9uYXRpdmVDbGFzc05hbWVzW2Nsc10gPSBuYXRpdmVDbGFzc05hbWU7CiAgICAgICAgICB9CgogICAgICAgICAgU3RyaW5nIGpzTmFtZSA9IF9nZXRKc0ludGVyb3BOYW1lKGNvbnN0YW50KTsKICAgICAgICAgIGlmIChqc05hbWUgIT0gbnVsbCkgewogICAgICAgICAgICBkYXRhLl9qc0ludGVyb3BDbGFzc05hbWVzW2Nsc10gPSBqc05hbWU7CiAgICAgICAgICB9CgogICAgICAgICAgYm9vbCBpc0Fub255bW91c0pzSW50ZXJvcENsYXNzID0gX2lzQW5vbnltb3VzSnNJbnRlcm9wKGNvbnN0YW50KTsKICAgICAgICAgIGlmIChpc0Fub255bW91c0pzSW50ZXJvcENsYXNzKSB7CiAgICAgICAgICAgIGRhdGEuX2Fub255bW91c0pzSW50ZXJvcENsYXNzZXMuYWRkKGNscyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAoaXIuTWVtYmVyIG1lbWJlciBpbiBjbHMubWVtYmVycykgewogICAgICAgIHByb2Nlc3NNZW1iZXIobWVtYmVyKTsKICAgICAgfQogICAgfQogICAgZm9yIChpci5NZW1iZXIgbWVtYmVyIGluIGxpYnJhcnkubWVtYmVycykgewogICAgICBwcm9jZXNzTWVtYmVyKG1lbWJlcik7CiAgICB9CiAgfQogIHJldHVybiBkYXRhOwp9CgpTdHJpbmcgX2dldE5hdGl2ZUNsYXNzTmFtZShpci5Db25zdGFudCBjb25zdGFudCkgewogIGlmIChjb25zdGFudCBpcyBpci5JbnN0YW5jZUNvbnN0YW50KSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBZGQgYW4gSXJDb21tb25FbGVtZW50cyBmb3IgdGhlc2UgcXVlcmllczsgaS5lLgogICAgLy8gYGNvbW1vbkVsZW1lbnRzLmlzTmF0aXZlQW5ub3RhdGlvbkNsYXNzKGNvbnN0YW50LmNsYXNzTm9kZSlgLgogICAgaWYgKGNvbnN0YW50LmNsYXNzTm9kZS5uYW1lID09ICdOYXRpdmUnICYmCiAgICAgICAgY29uc3RhbnQuY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpID09IFVyaXMuZGFydF9fanNfaGVscGVyKSB7CiAgICAgIGlmIChjb25zdGFudC5maWVsZFZhbHVlcy5sZW5ndGggPT0gMSkgewogICAgICAgIGlyLkNvbnN0YW50IGZpZWxkVmFsdWUgPSBjb25zdGFudC5maWVsZFZhbHVlcy52YWx1ZXMuc2luZ2xlOwogICAgICAgIFN0cmluZyBuYW1lOwogICAgICAgIGlmIChmaWVsZFZhbHVlIGlzIGlyLlN0cmluZ0NvbnN0YW50KSB7CiAgICAgICAgICBuYW1lID0gZmllbGRWYWx1ZS52YWx1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBudWxsOwp9Cgpib29sIF9pc05hdGl2ZU1lbWJlcihpci5Db25zdGFudCBjb25zdGFudCkgewogIHJldHVybiBjb25zdGFudCBpcyBpci5JbnN0YW5jZUNvbnN0YW50ICYmCiAgICAgIGNvbnN0YW50LmNsYXNzTm9kZS5uYW1lID09ICdFeHRlcm5hbE5hbWUnICYmCiAgICAgIGNvbnN0YW50LmNsYXNzTm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaSA9PSBVcmlzLmRhcnRfX2ludGVybmFsOwp9CgpTdHJpbmcgX2dldE5hdGl2ZU1lbWJlck5hbWUoaXIuQ29uc3RhbnQgY29uc3RhbnQpIHsKICBpZiAoY29uc3RhbnQgaXMgaXIuSW5zdGFuY2VDb25zdGFudCAmJgogICAgICBjb25zdGFudC5jbGFzc05vZGUubmFtZSA9PSAnSlNOYW1lJyAmJgogICAgICBjb25zdGFudC5jbGFzc05vZGUuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmkgPT0gVXJpcy5kYXJ0X19qc19oZWxwZXIpIHsKICAgIGFzc2VydChjb25zdGFudC5maWVsZFZhbHVlcy5sZW5ndGggPT0gMSk7CiAgICBpci5Db25zdGFudCBmaWVsZFZhbHVlID0gY29uc3RhbnQuZmllbGRWYWx1ZXMudmFsdWVzLnNpbmdsZTsKICAgIGlmIChmaWVsZFZhbHVlIGlzIGlyLlN0cmluZ0NvbnN0YW50KSB7CiAgICAgIHJldHVybiBmaWVsZFZhbHVlLnZhbHVlOwogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfQoKU3RyaW5nIF9nZXRDcmVhdGVzQW5ub3RhdGlvbihpci5Db25zdGFudCBjb25zdGFudCkgewogIGlmIChjb25zdGFudCBpcyBpci5JbnN0YW5jZUNvbnN0YW50ICYmCiAgICAgIGNvbnN0YW50LmNsYXNzTm9kZS5uYW1lID09ICdDcmVhdGVzJyAmJgogICAgICBjb25zdGFudC5jbGFzc05vZGUuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmkgPT0gVXJpcy5kYXJ0X19qc19oZWxwZXIpIHsKICAgIGFzc2VydChjb25zdGFudC5maWVsZFZhbHVlcy5sZW5ndGggPT0gMSk7CiAgICBpci5Db25zdGFudCBmaWVsZFZhbHVlID0gY29uc3RhbnQuZmllbGRWYWx1ZXMudmFsdWVzLnNpbmdsZTsKICAgIGlmIChmaWVsZFZhbHVlIGlzIGlyLlN0cmluZ0NvbnN0YW50KSB7CiAgICAgIHJldHVybiBmaWVsZFZhbHVlLnZhbHVlOwogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfQoKU3RyaW5nIF9nZXRSZXR1cm5zQW5ub3RhdGlvbihpci5Db25zdGFudCBjb25zdGFudCkgewogIGlmIChjb25zdGFudCBpcyBpci5JbnN0YW5jZUNvbnN0YW50ICYmCiAgICAgIGNvbnN0YW50LmNsYXNzTm9kZS5uYW1lID09ICdSZXR1cm5zJyAmJgogICAgICBjb25zdGFudC5jbGFzc05vZGUuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmkgPT0gVXJpcy5kYXJ0X19qc19oZWxwZXIpIHsKICAgIGFzc2VydChjb25zdGFudC5maWVsZFZhbHVlcy5sZW5ndGggPT0gMSk7CiAgICBpci5Db25zdGFudCBmaWVsZFZhbHVlID0gY29uc3RhbnQuZmllbGRWYWx1ZXMudmFsdWVzLnNpbmdsZTsKICAgIGlmIChmaWVsZFZhbHVlIGlzIGlyLlN0cmluZ0NvbnN0YW50KSB7CiAgICAgIHJldHVybiBmaWVsZFZhbHVlLnZhbHVlOwogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfQoKU3RyaW5nIF9nZXRKc0ludGVyb3BOYW1lKGlyLkNvbnN0YW50IGNvbnN0YW50KSB7CiAgaWYgKGNvbnN0YW50IGlzIGlyLkluc3RhbmNlQ29uc3RhbnQgJiYKICAgICAgY29uc3RhbnQuY2xhc3NOb2RlLm5hbWUgPT0gJ0pTJyAmJgogICAgICBjb25zdGFudC5jbGFzc05vZGUuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmkgPT0gVXJpcy5wYWNrYWdlX2pzKSB7CiAgICBhc3NlcnQoY29uc3RhbnQuZmllbGRWYWx1ZXMubGVuZ3RoID09IDEpOwogICAgaXIuQ29uc3RhbnQgZmllbGRWYWx1ZSA9IGNvbnN0YW50LmZpZWxkVmFsdWVzLnZhbHVlcy5zaW5nbGU7CiAgICBpZiAoZmllbGRWYWx1ZSBpcyBpci5OdWxsQ29uc3RhbnQpIHsKICAgICAgcmV0dXJuICcnOwogICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlIGlzIGlyLlN0cmluZ0NvbnN0YW50KSB7CiAgICAgIHJldHVybiBmaWVsZFZhbHVlLnZhbHVlOwogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfQoKYm9vbCBfaXNBbm9ueW1vdXNKc0ludGVyb3AoaXIuQ29uc3RhbnQgY29uc3RhbnQpIHsKICByZXR1cm4gY29uc3RhbnQgaXMgaXIuSW5zdGFuY2VDb25zdGFudCAmJgogICAgICBjb25zdGFudC5jbGFzc05vZGUubmFtZSA9PSAnX0Fub255bW91cycgJiYKICAgICAgY29uc3RhbnQuY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpID09IFVyaXMucGFja2FnZV9qczsKfQoKY2xhc3MgUHJhZ21hQW5ub3RhdGlvbkRhdGEgewogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFN1cHBvcnQgbm9uICdkYXJ0MmpzOicgcHJhZ21hIG5hbWVzIGlmIG5lY2Vzc2FyeS4KICBmaW5hbCBTdHJpbmcgc3VmZml4OwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IG9wdGlvbnMgb2JqZWN0cyB3aGVuIG5lY2Vzc2FyeS4KICBmaW5hbCBib29sIGhhc09wdGlvbnM7CgogIGNvbnN0IFByYWdtYUFubm90YXRpb25EYXRhKHRoaXMuc3VmZml4LCB7dGhpcy5oYXNPcHRpb25zOiBmYWxzZX0pOwoKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJ2RhcnQyanM6JHN1ZmZpeCc7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdQcmFnbWFBbm5vdGF0aW9uRGF0YSgkbmFtZSknOwp9CgpQcmFnbWFBbm5vdGF0aW9uRGF0YSBfZ2V0UHJhZ21hQW5ub3RhdGlvbihpci5Db25zdGFudCBjb25zdGFudCkgewogIGlmIChjb25zdGFudCBpcyEgaXIuSW5zdGFuY2VDb25zdGFudCkgcmV0dXJuIG51bGw7CiAgaXIuSW5zdGFuY2VDb25zdGFudCB2YWx1ZSA9IGNvbnN0YW50OwogIGlyLkNsYXNzIGNscyA9IHZhbHVlLmNsYXNzTm9kZTsKICBVcmkgdXJpID0gY2xzLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpOwogIGlmICh1cmkgPT0gVXJpcy5wYWNrYWdlX21ldGFfZGFydDJqcykgewogICAgaWYgKGNscy5uYW1lID09ICdfTm9JbmxpbmUnKSB7CiAgICAgIHJldHVybiBjb25zdCBQcmFnbWFBbm5vdGF0aW9uRGF0YSgnbm9JbmxpbmUnKTsKICAgIH0gZWxzZSBpZiAoY2xzLm5hbWUgPT0gJ19UcnlJbmxpbmUnKSB7CiAgICAgIHJldHVybiBjb25zdCBQcmFnbWFBbm5vdGF0aW9uRGF0YSgndHJ5SW5saW5lJyk7CiAgICB9CiAgfSBlbHNlIGlmICh1cmkgPT0gVXJpcy5kYXJ0X2NvcmUgJiYgY2xzLm5hbWUgPT0gJ3ByYWdtYScpIHsKICAgIGlyLkNvbnN0YW50IG5hbWVWYWx1ZTsKICAgIGlyLkNvbnN0YW50IG9wdGlvbnNWYWx1ZTsKICAgIHZhbHVlLmZpZWxkVmFsdWVzLmZvckVhY2goKGlyLlJlZmVyZW5jZSByZWZlcmVuY2UsIGlyLkNvbnN0YW50IGZpZWxkVmFsdWUpIHsKICAgICAgaXIuRmllbGQgZmllbGQgPSByZWZlcmVuY2UuYXNGaWVsZDsKICAgICAgaWYgKGZpZWxkLm5hbWUubmFtZSA9PSAnbmFtZScpIHsKICAgICAgICBuYW1lVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICB9IGVsc2UgaWYgKGZpZWxkLm5hbWUubmFtZSA9PSAnb3B0aW9ucycpIHsKICAgICAgICBvcHRpb25zVmFsdWUgPSBmaWVsZFZhbHVlOwogICAgICB9CiAgICB9KTsKICAgIGlmIChuYW1lVmFsdWUgaXMhIGlyLlN0cmluZ0NvbnN0YW50KSByZXR1cm4gbnVsbDsKICAgIGlyLlN0cmluZ0NvbnN0YW50IHN0cmluZ1ZhbHVlID0gbmFtZVZhbHVlOwogICAgU3RyaW5nIG5hbWUgPSBzdHJpbmdWYWx1ZS52YWx1ZTsKICAgIFN0cmluZyBwcmVmaXggPSAnZGFydDJqczonOwogICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkgcmV0dXJuIG51bGw7CiAgICBTdHJpbmcgc3VmZml4ID0gbmFtZS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCk7CiAgICByZXR1cm4gbmV3IFByYWdtYUFubm90YXRpb25EYXRhKHN1ZmZpeCwKICAgICAgICBoYXNPcHRpb25zOiBvcHRpb25zVmFsdWUgaXMhIGlyLk51bGxDb25zdGFudCk7CiAgfQogIHJldHVybiBudWxsOwp9CgpMaXN0PFByYWdtYUFubm90YXRpb25EYXRhPiBjb21wdXRlUHJhZ21hQW5ub3RhdGlvbkRhdGFGcm9tSXIoaXIuTWVtYmVyIG1lbWJlcikgewogIExpc3Q8UHJhZ21hQW5ub3RhdGlvbkRhdGE+IGFubm90YXRpb25zID0gW107CiAgZm9yIChpci5FeHByZXNzaW9uIG1ldGFkYXRhIGluIG1lbWJlci5hbm5vdGF0aW9ucykgewogICAgaWYgKG1ldGFkYXRhIGlzISBpci5Db25zdGFudEV4cHJlc3Npb24pIGNvbnRpbnVlOwogICAgaXIuQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50RXhwcmVzc2lvbiA9IG1ldGFkYXRhOwogICAgaXIuQ29uc3RhbnQgY29uc3RhbnQgPSBjb25zdGFudEV4cHJlc3Npb24uY29uc3RhbnQ7CiAgICBhc3NlcnQoY29uc3RhbnQgaXMhIGlyLlVuZXZhbHVhdGVkQ29uc3RhbnQsCiAgICAgICAgIlVuZXhwZWN0ZWQgdW5ldmFsdWF0ZWQgY29uc3RhbnQgb24gJG1lbWJlcjogJG1ldGFkYXRhIik7CiAgICBQcmFnbWFBbm5vdGF0aW9uRGF0YSBkYXRhID0gX2dldFByYWdtYUFubm90YXRpb24oY29uc3RhbnQpOwogICAgaWYgKGRhdGEgIT0gbnVsbCkgewogICAgICBhbm5vdGF0aW9ucy5hZGQoZGF0YSk7CiAgICB9CiAgfQogIHJldHVybiBhbm5vdGF0aW9uczsKfQqBdwBOTjwBKB8XARkwJjI5OQE3MzE1AUwBT0cBS0cBT0oBSg04LQFKDTgtAUs1JAFLTQE+MzEBS1ABUE4yAT8iBAFGJwQBHj9AQwgEAUQ9MiFICggINS4qNSElChkICAQBIFEzDy0fQlEIBgQBH1EzDzMrJkY3LQoIBgQCAT8yMgEpMiUlOzEfQAE1HjcKATkeKwoBPCI4CgE6HyxIDCsKATofLEgMKwoBUCgrTAwzCggGBAE0PDEfQAE1HjkKCAYsOjMhQgFCKTsMATcgNQwBTCs2DAoILh8IBjAdBgQPAgEzKUxFL1EuRRUvIwocFwoIBgQPAgEtLDNMAgE0KS1PLkErHwYEDwIBNSkuTy5BKx8GBA8CATUpLk8uQSsfBgQPAgExKSlKLkEpETIfBgQPAgEzLDFIAgEdTBcBQhkBRQEoAQw2AgFCNSgiLCojNSs2Bj4bHlEqJyAxIwgINi8lIC8zLDcEDwIBUS83Njk4MEJAGB0GBBYCAShwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9hbm5vdGF0aW9ucy5kYXJ0LXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lyL2Nsb3N1cmUuZGFydLi5Ly8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwoKLy8vIENvbGxlY3Rpb24gb2Ygc2NvcGUgZGF0YSBjb2xsZWN0ZWQgZm9yIGEgc2luZ2xlIG1lbWJlci4KY2xhc3MgQ2xvc3VyZVNjb3BlTW9kZWwgewogIC8vLyBDb2xsZWN0aW9uIFtTY29wZUluZm9dIGRhdGEgZm9yIHRoZSBtZW1iZXIuCiAgS2VybmVsU2NvcGVJbmZvIHNjb3BlSW5mbzsKCiAgLy8vIENvbGxlY3RlZCBbQ2FwdHVyZWRTY29wZV0gZGF0YSBmb3Igbm9kZXMuCiAgTWFwPGlyLk5vZGUsIEtlcm5lbENhcHR1cmVkU2NvcGU+IGNhcHR1cmVkU2NvcGVzTWFwID0KICAgICAgPGlyLk5vZGUsIEtlcm5lbENhcHR1cmVkU2NvcGU+e307CgogIC8vLyBDb2xsZWN0ZWQgW1Njb3BlSW5mb10gZGF0YSBmb3Igbm9kZXMuCiAgTWFwPGlyLkxvY2FsRnVuY3Rpb24sIEtlcm5lbFNjb3BlSW5mbz4gY2xvc3VyZXNUb0dlbmVyYXRlID0KICAgICAgPGlyLkxvY2FsRnVuY3Rpb24sIEtlcm5lbFNjb3BlSW5mbz57fTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICckc2NvcGVJbmZvXG4kY2FwdHVyZWRTY29wZXNNYXBcbiRjbG9zdXJlc1RvR2VuZXJhdGUnOwogIH0KfQoKY2xhc3MgS2VybmVsU2NvcGVJbmZvIHsKICBmaW5hbCBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gbG9jYWxzVXNlZEluVHJ5T3JTeW5jOwogIGZpbmFsIGJvb2wgaGFzVGhpc0xvY2FsOwogIGZpbmFsIFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBib3hlZFZhcmlhYmxlczsKICAvLyBJZiBib3hlZFZhcmlhYmxlcyBpcyBlbXB0eSwgdGhpcyB3aWxsIGJlIG51bGwsIGJlY2F1c2Ugbm8gdmFyaWFibGVzIHdpbGwKICAvLyBuZWVkIHRvIGJlIGJveGVkLgogIGZpbmFsIE5vZGVCb3ggY2FwdHVyZWRWYXJpYWJsZXNBY2Nlc3NvcjsKCiAgLy8vIFRoZSBzZXQgb2YgdmFyaWFibGVzIHRoYXQgd2VyZSBkZWZpbmVkIGluIGFub3RoZXIgc2NvcGUsIGJ1dCBhcmUgdXNlZCBpbgogIC8vLyB0aGlzIHNjb3BlLiBUaGUgaXRlbXMgaW4gdGhpcyBzZXQgYXJlIGVpdGhlciBvZiB0eXBlIFZhcmlhYmxlRGVjbGFyYXRpb24KICAvLy8gb3IgVHlwZVBhcmFtZXRlclR5cGVXaXRoQ29udGV4dC4KICBTZXQ8aXIuTm9kZSAvKiBWYXJpYWJsZURlY2xhcmF0aW9uIHwgVHlwZVBhcmFtZXRlclR5cGVXaXRoQ29udGV4dCAqLyA+CiAgICAgIGZyZWVWYXJpYWJsZXMgPSBuZXcgU2V0PGlyLk5vZGU+KCk7CgogIC8vLyBBIHNldCBvZiB0eXBlIHBhcmFtZXRlcnMgdGhhdCBhcmUgZGVmaW5lZCBpbiBhbm90aGVyIHNjb3BlIGFuZCBhcmUgb25seQogIC8vLyB1c2VkIGlmIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBpcyBjaGVja2VkLiBJZiBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24KICAvLy8gbmVlZHMgdG8gYmUgcmV0YWluZWQsIGFsbCBvZiB0aGVzZSB0eXBlIHZhcmlhYmxlcyB3aWxsIGJlIGFkZGVkIG90IHRoZQogIC8vLyBmcmVlVmFyaWFibGVzIHNldC4gV2hldGhlciB0aGVzZSB2YXJpYWJsZXMgYXJlIGFjdHVhbGx5IHVzZWQgYXMKICAvLy8gZnJlZVZhcmlhYmxlcyB3aWxsIGJlIHNldCBieSB0aGUgdGltZSB0aGlzIHN0cnVjdHVyZSBpcyBjb252ZXJ0ZWQgdG8gYQogIC8vLyBKc1Njb3BlSW5mbywgc28gSnNTY29wZUluZm8gZG9lcyBub3QgbmVlZCB0byB1c2UgdGhlbS4KICBNYXA8VHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0LCBTZXQ8VmFyaWFibGVVc2U+PiBmcmVlVmFyaWFibGVzRm9yUnRpID0KICAgICAgPFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCwgU2V0PFZhcmlhYmxlVXNlPj57fTsKCiAgLy8vIElmIHRydWUsIGB0aGlzYCBpcyB1c2VkIGFzIGEgZnJlZSB2YXJpYWJsZSwgaW4gdGhpcyBzY29wZS4gSXQgaXMgc3RvcmVkCiAgLy8vIHNlcGFyYXRlbHkgZnJvbSBbZnJlZVZhcmlhYmxlc10gYmVjYXVzZSB0aGVyZSBpcyBubyBzaW5nbGUKICAvLy8gYFZhcmlhYmxlRGVjbGFyYXRpb25gIG5vZGUgdGhhdCByZXByZXNlbnRzIGB0aGlzYC4KICBib29sIHRoaXNVc2VkQXNGcmVlVmFyaWFibGUgPSBmYWxzZTsKCiAgLy8vIElmIHRydWUsIGB0aGlzYCBpcyB1c2VkIGFzIGEgZnJlZSB2YXJpYWJsZSwgaW4gdGhpcyBzY29wZSBpZiB3ZSBhcmUgYWxzbwogIC8vLyBwZXJmb3JtaW5nIHJ1bnRpbWUgdHlwZSBjaGVja3MuIEl0IGlzIHN0b3JlZAogIC8vLyBzZXBhcmF0ZWx5IGZyb20gW3RoaXNVc2VkQXNGcmVlVmFyaWFibGVdIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBhdCB0aGlzCiAgLy8vIHN0YWdlIGlmIHdlIHdpbGwgYmUgbmVlZGluZyB0eXBlIGNoZWNrcyBmb3IgdGhpcyBzY29wZS4KICBTZXQ8VmFyaWFibGVVc2U+IHRoaXNVc2VkQXNGcmVlVmFyaWFibGVJZk5lZWRzUnRpID0gbmV3IFNldDxWYXJpYWJsZVVzZT4oKTsKCiAgS2VybmVsU2NvcGVJbmZvKHRoaXMuaGFzVGhpc0xvY2FsKQogICAgICA6IGxvY2Fsc1VzZWRJblRyeU9yU3luYyA9IG5ldyBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4oKSwKICAgICAgICBib3hlZFZhcmlhYmxlcyA9IG5ldyBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4oKSwKICAgICAgICBjYXB0dXJlZFZhcmlhYmxlc0FjY2Vzc29yID0gbnVsbDsKCiAgS2VybmVsU2NvcGVJbmZvLmZyb20odGhpcy5oYXNUaGlzTG9jYWwsIEtlcm5lbFNjb3BlSW5mbyBpbmZvKQogICAgICA6IGxvY2Fsc1VzZWRJblRyeU9yU3luYyA9IGluZm8ubG9jYWxzVXNlZEluVHJ5T3JTeW5jLAogICAgICAgIGJveGVkVmFyaWFibGVzID0gaW5mby5ib3hlZFZhcmlhYmxlcywKICAgICAgICBjYXB0dXJlZFZhcmlhYmxlc0FjY2Vzc29yID0gbnVsbDsKCiAgS2VybmVsU2NvcGVJbmZvLndpdGhCb3hlZFZhcmlhYmxlcygKICAgICAgdGhpcy5ib3hlZFZhcmlhYmxlcywKICAgICAgdGhpcy5jYXB0dXJlZFZhcmlhYmxlc0FjY2Vzc29yLAogICAgICB0aGlzLmxvY2Fsc1VzZWRJblRyeU9yU3luYywKICAgICAgdGhpcy5mcmVlVmFyaWFibGVzLAogICAgICB0aGlzLmZyZWVWYXJpYWJsZXNGb3JSdGksCiAgICAgIHRoaXMudGhpc1VzZWRBc0ZyZWVWYXJpYWJsZSwKICAgICAgdGhpcy50aGlzVXNlZEFzRnJlZVZhcmlhYmxlSWZOZWVkc1J0aSwKICAgICAgdGhpcy5oYXNUaGlzTG9jYWwpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnS2VybmVsU2NvcGVJbmZvKHRoaXM9JGhhc1RoaXNMb2NhbCwnKTsKICAgIHNiLndyaXRlKCdmcmVlVnJpYWJsZXM9JGZyZWVWYXJpYWJsZXMsJyk7CiAgICBzYi53cml0ZSgnbG9jYWxzVXNlZEluVHJ5T3JTeW5jPXske2xvY2Fsc1VzZWRJblRyeU9yU3luYy5qb2luKCcsICcpfX0nKTsKICAgIFN0cmluZyBjb21tYSA9ICcnOwogICAgc2Iud3JpdGUoJ2ZyZWVWYXJpYWJsZXNGb3JSdGk9eycpOwogICAgZnJlZVZhcmlhYmxlc0ZvclJ0aS5mb3JFYWNoKChrZXksIHZhbHVlKSB7CiAgICAgIHNiLndyaXRlKCckY29tbWEka2V5OiR2YWx1ZScpOwogICAgICBjb21tYSA9ICcsJzsKICAgIH0pOwogICAgc2Iud3JpdGUoJ30pJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCmNsYXNzIEtlcm5lbENhcHR1cmVkU2NvcGUgZXh0ZW5kcyBLZXJuZWxTY29wZUluZm8gewogIEtlcm5lbENhcHR1cmVkU2NvcGUoCiAgICAgIFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBib3hlZFZhcmlhYmxlcywKICAgICAgTm9kZUJveCBjYXB0dXJlZFZhcmlhYmxlc0FjY2Vzc29yLAogICAgICBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gbG9jYWxzVXNlZEluVHJ5T3JTeW5jLAogICAgICBTZXQ8aXIuTm9kZSAvKiBWYXJpYWJsZURlY2xhcmF0aW9uIHwgVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0ICovID4KICAgICAgICAgIGZyZWVWYXJpYWJsZXMsCiAgICAgIE1hcDxUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQsIFNldDxWYXJpYWJsZVVzZT4+IGZyZWVWYXJpYWJsZXNGb3JSdGksCiAgICAgIGJvb2wgdGhpc1VzZWRBc0ZyZWVWYXJpYWJsZSwKICAgICAgU2V0PFZhcmlhYmxlVXNlPiB0aGlzVXNlZEFzRnJlZVZhcmlhYmxlSWZOZWVkc1J0aSwKICAgICAgYm9vbCBoYXNUaGlzTG9jYWwpCiAgICAgIDogc3VwZXIud2l0aEJveGVkVmFyaWFibGVzKAogICAgICAgICAgICBib3hlZFZhcmlhYmxlcywKICAgICAgICAgICAgY2FwdHVyZWRWYXJpYWJsZXNBY2Nlc3NvciwKICAgICAgICAgICAgbG9jYWxzVXNlZEluVHJ5T3JTeW5jLAogICAgICAgICAgICBmcmVlVmFyaWFibGVzLAogICAgICAgICAgICBmcmVlVmFyaWFibGVzRm9yUnRpLAogICAgICAgICAgICB0aGlzVXNlZEFzRnJlZVZhcmlhYmxlLAogICAgICAgICAgICB0aGlzVXNlZEFzRnJlZVZhcmlhYmxlSWZOZWVkc1J0aSwKICAgICAgICAgICAgaGFzVGhpc0xvY2FsKTsKCiAgLy8gTG9vcHMgdGhyb3VnaCB0aGUgZnJlZSB2YXJpYWJsZXMgb2YgYW4gZXhpc3RpbmcgS2VybmVsQ2FwdHVyZWRTY29wZSBhbmQKICAvLyBjcmVhdGVzIGEgbmV3IEtlcm5lbENhcHR1cmVkU2NvcGUgdGhhdCBvbmx5IGNhcHR1cmVzIHR5cGUgdmFyaWFibGVzLgogIEtlcm5lbENhcHR1cmVkU2NvcGUuZm9yU2lnbmF0dXJlKEtlcm5lbENhcHR1cmVkU2NvcGUgc2NvcGUpCiAgICAgIDogdGhpcygKICAgICAgICAgICAgX2VtcHR5LAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBfZW1wdHksCiAgICAgICAgICAgIHNjb3BlLmZyZWVWYXJpYWJsZXMud2hlcmUoCiAgICAgICAgICAgICAgICAoaXIuTm9kZSB2YXJpYWJsZSkgPT4gdmFyaWFibGUgaXMgVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0KSwKICAgICAgICAgICAgc2NvcGUuZnJlZVZhcmlhYmxlc0ZvclJ0aSwKICAgICAgICAgICAgc2NvcGUudGhpc1VzZWRBc0ZyZWVWYXJpYWJsZSwKICAgICAgICAgICAgc2NvcGUudGhpc1VzZWRBc0ZyZWVWYXJpYWJsZUlmTmVlZHNSdGksCiAgICAgICAgICAgIHNjb3BlLmhhc1RoaXNMb2NhbCk7CgogIC8vIFNpbGx5IGhhY2sgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGNvbnN0IHNldHMuCiAgc3RhdGljIGZpbmFsIFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBfZW1wdHkgPSBuZXcgU2V0KCk7CgogIGJvb2wgZ2V0IHJlcXVpcmVzQ29udGV4dEJveCA9PiBib3hlZFZhcmlhYmxlcy5pc05vdEVtcHR5Owp9CgpjbGFzcyBLZXJuZWxDYXB0dXJlZExvb3BTY29wZSBleHRlbmRzIEtlcm5lbENhcHR1cmVkU2NvcGUgewogIGZpbmFsIExpc3Q8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gYm94ZWRMb29wVmFyaWFibGVzOwoKICBLZXJuZWxDYXB0dXJlZExvb3BTY29wZSgKICAgICAgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IGJveGVkVmFyaWFibGVzLAogICAgICBOb2RlQm94IGNhcHR1cmVkVmFyaWFibGVzQWNjZXNzb3IsCiAgICAgIHRoaXMuYm94ZWRMb29wVmFyaWFibGVzLAogICAgICBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gbG9jYWxzVXNlZEluVHJ5T3JTeW5jLAogICAgICBTZXQ8aXIuTm9kZSAvKiBWYXJpYWJsZURlY2xhcmF0aW9uIHwgVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0ICovID4KICAgICAgICAgIGZyZWVWYXJpYWJsZXMsCiAgICAgIE1hcDxUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQsIFNldDxWYXJpYWJsZVVzZT4+IGZyZWVWYXJpYWJsZXNGb3JSdGksCiAgICAgIGJvb2wgdGhpc1VzZWRBc0ZyZWVWYXJpYWJsZSwKICAgICAgU2V0PFZhcmlhYmxlVXNlPiB0aGlzVXNlZEFzRnJlZVZhcmlhYmxlSWZOZWVkc1J0aSwKICAgICAgYm9vbCBoYXNUaGlzTG9jYWwpCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIGJveGVkVmFyaWFibGVzLAogICAgICAgICAgICBjYXB0dXJlZFZhcmlhYmxlc0FjY2Vzc29yLAogICAgICAgICAgICBsb2NhbHNVc2VkSW5UcnlPclN5bmMsCiAgICAgICAgICAgIGZyZWVWYXJpYWJsZXMsCiAgICAgICAgICAgIGZyZWVWYXJpYWJsZXNGb3JSdGksCiAgICAgICAgICAgIHRoaXNVc2VkQXNGcmVlVmFyaWFibGUsCiAgICAgICAgICAgIHRoaXNVc2VkQXNGcmVlVmFyaWFibGVJZk5lZWRzUnRpLAogICAgICAgICAgICBoYXNUaGlzTG9jYWwpOwoKICBib29sIGdldCBoYXNCb3hlZExvb3BWYXJpYWJsZXMgPT4gYm94ZWRMb29wVmFyaWFibGVzLmlzTm90RW1wdHk7Cn0KCi8vLyBBIGxvY2FsIHZhcmlhYmxlIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIGEgdmFyaWFibGUgdGhhdCBoYXMgYmVlbiBjYXB0dXJlZAovLy8gZnJvbSBvbmUgc2NvcGUgdG8gYW5vdGhlci4gVGhpcyBpcyB0aGUgaXIuTm9kZSB2ZXJzaW9uIHRoYXQgY29ycmVzcG9uZHMgdG8KLy8vIFtCb3hMb2NhbF0uCmNsYXNzIE5vZGVCb3ggewogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIGlyLlRyZWVOb2RlIGV4ZWN1dGFibGVDb250ZXh0OwogIE5vZGVCb3godGhpcy5uYW1lLCB0aGlzLmV4ZWN1dGFibGVDb250ZXh0KTsKfQoKZW51bSBWYXJpYWJsZVVzZUtpbmQgewogIC8vLyBBbiBleHBsaWNpdCB2YXJpYWJsZSB1c2UuCiAgLy8vCiAgLy8vIEZvciB0eXBlIHZhcmlhYmxlIHRoaXMgaXMgYW4gZXhwbGljaXQgYXMtY2FzdCwgYW4gaXMtdGVzdCBvciBhIHR5cGUKICAvLy8gbGl0ZXJhbC4KICBleHBsaWNpdCwKCiAgLy8vIEEgdHlwZSB2YXJpYWJsZSB1c2VkIGluIHRoZSB0eXBlIG9mIGEgbG9jYWwgdmFyaWFibGUuCiAgbG9jYWxUeXBlLAoKICAvLy8gQSB0eXBlIHZhcmlhYmxlIHVzZWQgaW4gYW4gaW1wbGljaXQgY2FzdC4KICBpbXBsaWNpdENhc3QsCgogIC8vLyBBIHR5cGUgdmFyaWFibGUgcGFzc2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50IG9mIGEgbGlzdCBsaXRlcmFsLgogIGxpc3RMaXRlcmFsLAoKICAvLy8gQSB0eXBlIHZhcmlhYmxlIHBhc3NlZCBhcyB0aGUgdHlwZSBhcmd1bWVudCBvZiBhIHNldCBsaXRlcmFsLgogIHNldExpdGVyYWwsCgogIC8vLyBBIHR5cGUgdmFyaWFibGUgcGFzc2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50IG9mIGEgbWFwIGxpdGVyYWwuCiAgbWFwTGl0ZXJhbCwKCiAgLy8vIEEgdHlwZSB2YXJpYWJsZSBwYXNzZWQgYXMgYSB0eXBlIGFyZ3VtZW50IHRvIGEgY29uc3RydWN0b3IuCiAgY29uc3RydWN0b3JUeXBlQXJndW1lbnQsCgogIC8vLyBBIHR5cGUgdmFyaWFibGUgcGFzc2VkIGFzIGEgdHlwZSBhcmd1bWVudCB0byBhIHN0YXRpYyBtZXRob2QuCiAgc3RhdGljVHlwZUFyZ3VtZW50LAoKICAvLy8gQSB0eXBlIHZhcmlhYmxlIHBhc3NlZCBhcyBhIHR5cGUgYXJndW1lbnQgdG8gYW4gaW5zdGFuY2UgbWV0aG9kLgogIGluc3RhbmNlVHlwZUFyZ3VtZW50LAoKICAvLy8gQSB0eXBlIHZhcmlhYmxlIHBhc3NlZCBhcyBhIHR5cGUgYXJndW1lbnQgdG8gYSBsb2NhbCBmdW5jdGlvbi4KICBsb2NhbFR5cGVBcmd1bWVudCwKCiAgLy8vIEEgdHlwZSB2YXJpYWJsZSBpbiBhIHBhcmFtZXRlciB0eXBlIG9mIGEgbWVtYmVyLgogIG1lbWJlclBhcmFtZXRlciwKCiAgLy8vIEEgdHlwZSB2YXJpYWJsZSBpbiBhIHBhcmFtZXRlciB0eXBlIG9mIGEgbG9jYWwgZnVuY3Rpb24uCiAgbG9jYWxQYXJhbWV0ZXIsCgogIC8vLyBBIHR5cGUgdmFyaWFibGUgdXNlZCBpbiBhIHJldHVybiB0eXBlIG9mIGEgbWVtYmVyLgogIG1lbWJlclJldHVyblR5cGUsCgogIC8vLyBBIHR5cGUgdmFyaWFibGUgdXNlZCBpbiBhIHJldHVybiB0eXBlIG9mIGEgbG9jYWwgZnVuY3Rpb24uCiAgbG9jYWxSZXR1cm5UeXBlLAoKICAvLy8gQSB0eXBlIHZhcmlhYmxlIGluIGEgZmllbGQgdHlwZS4KICBmaWVsZFR5cGUsCgogIC8vLyBBIHR5cGUgYXJndW1lbnQgb2YgYW4gZ2VuZXJpYyBpbnN0YW50aWF0aW9uLgogIGluc3RhbnRpYXRpb25UeXBlQXJndW1lbnQsCn0KCmNsYXNzIFZhcmlhYmxlVXNlIHsKICBmaW5hbCBWYXJpYWJsZVVzZUtpbmQga2luZDsKICBmaW5hbCBpci5NZW1iZXIgbWVtYmVyOwogIGZpbmFsIGlyLkxvY2FsRnVuY3Rpb24gbG9jYWxGdW5jdGlvbjsKICBmaW5hbCBpci5NZXRob2RJbnZvY2F0aW9uIGludm9jYXRpb247CiAgZmluYWwgaXIuSW5zdGFudGlhdGlvbiBpbnN0YW50aWF0aW9uOwoKICBjb25zdCBWYXJpYWJsZVVzZS5fc2ltcGxlKHRoaXMua2luZCkKICAgICAgOiB0aGlzLm1lbWJlciA9IG51bGwsCiAgICAgICAgdGhpcy5sb2NhbEZ1bmN0aW9uID0gbnVsbCwKICAgICAgICB0aGlzLmludm9jYXRpb24gPSBudWxsLAogICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbiA9IG51bGw7CgogIFZhcmlhYmxlVXNlLm1lbWJlclBhcmFtZXRlcih0aGlzLm1lbWJlcikKICAgICAgOiB0aGlzLmtpbmQgPSBWYXJpYWJsZVVzZUtpbmQubWVtYmVyUGFyYW1ldGVyLAogICAgICAgIHRoaXMubG9jYWxGdW5jdGlvbiA9IG51bGwsCiAgICAgICAgdGhpcy5pbnZvY2F0aW9uID0gbnVsbCwKICAgICAgICB0aGlzLmluc3RhbnRpYXRpb24gPSBudWxsOwoKICBWYXJpYWJsZVVzZS5sb2NhbFBhcmFtZXRlcih0aGlzLmxvY2FsRnVuY3Rpb24pCiAgICAgIDogdGhpcy5raW5kID0gVmFyaWFibGVVc2VLaW5kLmxvY2FsUGFyYW1ldGVyLAogICAgICAgIHRoaXMubWVtYmVyID0gbnVsbCwKICAgICAgICB0aGlzLmludm9jYXRpb24gPSBudWxsLAogICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbiA9IG51bGw7CgogIFZhcmlhYmxlVXNlLm1lbWJlclJldHVyblR5cGUodGhpcy5tZW1iZXIpCiAgICAgIDogdGhpcy5raW5kID0gVmFyaWFibGVVc2VLaW5kLm1lbWJlclJldHVyblR5cGUsCiAgICAgICAgdGhpcy5sb2NhbEZ1bmN0aW9uID0gbnVsbCwKICAgICAgICB0aGlzLmludm9jYXRpb24gPSBudWxsLAogICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbiA9IG51bGw7CgogIFZhcmlhYmxlVXNlLmxvY2FsUmV0dXJuVHlwZSh0aGlzLmxvY2FsRnVuY3Rpb24pCiAgICAgIDogdGhpcy5raW5kID0gVmFyaWFibGVVc2VLaW5kLmxvY2FsUmV0dXJuVHlwZSwKICAgICAgICB0aGlzLm1lbWJlciA9IG51bGwsCiAgICAgICAgdGhpcy5pbnZvY2F0aW9uID0gbnVsbCwKICAgICAgICB0aGlzLmluc3RhbnRpYXRpb24gPSBudWxsOwoKICBWYXJpYWJsZVVzZS5jb25zdHJ1Y3RvclR5cGVBcmd1bWVudCh0aGlzLm1lbWJlcikKICAgICAgOiB0aGlzLmtpbmQgPSBWYXJpYWJsZVVzZUtpbmQuY29uc3RydWN0b3JUeXBlQXJndW1lbnQsCiAgICAgICAgdGhpcy5sb2NhbEZ1bmN0aW9uID0gbnVsbCwKICAgICAgICB0aGlzLmludm9jYXRpb24gPSBudWxsLAogICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbiA9IG51bGw7CgogIFZhcmlhYmxlVXNlLnN0YXRpY1R5cGVBcmd1bWVudCh0aGlzLm1lbWJlcikKICAgICAgOiB0aGlzLmtpbmQgPSBWYXJpYWJsZVVzZUtpbmQuc3RhdGljVHlwZUFyZ3VtZW50LAogICAgICAgIHRoaXMubG9jYWxGdW5jdGlvbiA9IG51bGwsCiAgICAgICAgdGhpcy5pbnZvY2F0aW9uID0gbnVsbCwKICAgICAgICB0aGlzLmluc3RhbnRpYXRpb24gPSBudWxsOwoKICBWYXJpYWJsZVVzZS5pbnN0YW5jZVR5cGVBcmd1bWVudCh0aGlzLmludm9jYXRpb24pCiAgICAgIDogdGhpcy5raW5kID0gVmFyaWFibGVVc2VLaW5kLmluc3RhbmNlVHlwZUFyZ3VtZW50LAogICAgICAgIHRoaXMubWVtYmVyID0gbnVsbCwKICAgICAgICB0aGlzLmxvY2FsRnVuY3Rpb24gPSBudWxsLAogICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbiA9IG51bGw7CgogIFZhcmlhYmxlVXNlLmxvY2FsVHlwZUFyZ3VtZW50KHRoaXMubG9jYWxGdW5jdGlvbiwgdGhpcy5pbnZvY2F0aW9uKQogICAgICA6IHRoaXMua2luZCA9IFZhcmlhYmxlVXNlS2luZC5sb2NhbFR5cGVBcmd1bWVudCwKICAgICAgICB0aGlzLm1lbWJlciA9IG51bGwsCiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uID0gbnVsbDsKCiAgVmFyaWFibGVVc2UuaW5zdGFudGlhdGlvblR5cGVBcmd1bWVudCh0aGlzLmluc3RhbnRpYXRpb24pCiAgICAgIDogdGhpcy5raW5kID0gVmFyaWFibGVVc2VLaW5kLmluc3RhbnRpYXRpb25UeXBlQXJndW1lbnQsCiAgICAgICAgdGhpcy5tZW1iZXIgPSBudWxsLAogICAgICAgIHRoaXMubG9jYWxGdW5jdGlvbiA9IG51bGwsCiAgICAgICAgdGhpcy5pbnZvY2F0aW9uID0gbnVsbDsKCiAgc3RhdGljIGNvbnN0IFZhcmlhYmxlVXNlIGV4cGxpY2l0ID0KICAgICAgY29uc3QgVmFyaWFibGVVc2UuX3NpbXBsZShWYXJpYWJsZVVzZUtpbmQuZXhwbGljaXQpOwoKICBzdGF0aWMgY29uc3QgVmFyaWFibGVVc2UgbG9jYWxUeXBlID0KICAgICAgY29uc3QgVmFyaWFibGVVc2UuX3NpbXBsZShWYXJpYWJsZVVzZUtpbmQubG9jYWxUeXBlKTsKCiAgc3RhdGljIGNvbnN0IFZhcmlhYmxlVXNlIGltcGxpY2l0Q2FzdCA9CiAgICAgIGNvbnN0IFZhcmlhYmxlVXNlLl9zaW1wbGUoVmFyaWFibGVVc2VLaW5kLmltcGxpY2l0Q2FzdCk7CgogIHN0YXRpYyBjb25zdCBWYXJpYWJsZVVzZSBsaXN0TGl0ZXJhbCA9CiAgICAgIGNvbnN0IFZhcmlhYmxlVXNlLl9zaW1wbGUoVmFyaWFibGVVc2VLaW5kLmxpc3RMaXRlcmFsKTsKCiAgc3RhdGljIGNvbnN0IFZhcmlhYmxlVXNlIHNldExpdGVyYWwgPQogICAgICBjb25zdCBWYXJpYWJsZVVzZS5fc2ltcGxlKFZhcmlhYmxlVXNlS2luZC5zZXRMaXRlcmFsKTsKCiAgc3RhdGljIGNvbnN0IFZhcmlhYmxlVXNlIG1hcExpdGVyYWwgPQogICAgICBjb25zdCBWYXJpYWJsZVVzZS5fc2ltcGxlKFZhcmlhYmxlVXNlS2luZC5tYXBMaXRlcmFsKTsKCiAgc3RhdGljIGNvbnN0IFZhcmlhYmxlVXNlIGZpZWxkVHlwZSA9CiAgICAgIGNvbnN0IFZhcmlhYmxlVXNlLl9zaW1wbGUoVmFyaWFibGVVc2VLaW5kLmZpZWxkVHlwZSk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4KICAgICAga2luZC5oYXNoQ29kZSAqIDExICsKICAgICAgbWVtYmVyLmhhc2hDb2RlICogMTMgKwogICAgICBsb2NhbEZ1bmN0aW9uLmhhc2hDb2RlICogMTcgKwogICAgICBpbnZvY2F0aW9uLmhhc2hDb2RlICogMTkgKwogICAgICBpbnN0YW50aWF0aW9uLmhhc2hDb2RlICogMjM7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgVmFyaWFibGVVc2UpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBraW5kID09IG90aGVyLmtpbmQgJiYKICAgICAgICBtZW1iZXIgPT0gb3RoZXIubWVtYmVyICYmCiAgICAgICAgbG9jYWxGdW5jdGlvbiA9PSBvdGhlci5sb2NhbEZ1bmN0aW9uICYmCiAgICAgICAgaW52b2NhdGlvbiA9PSBvdGhlci5pbnZvY2F0aW9uICYmCiAgICAgICAgaW5zdGFudGlhdGlvbiA9PSBvdGhlci5pbnN0YW50aWF0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1ZhcmlhYmxlVXNlKGtpbmQ9JGtpbmQsbWVtYmVyPSRtZW1iZXIsJwogICAgICAnbG9jYWxGdW5jdGlvbj0kbG9jYWxGdW5jdGlvbixpbnZvY2F0aW9uPSRpbnZvY2F0aW9uLCcKICAgICAgJ2luc3RhbnRpYXRpb249JGluc3RhbnRpYXRpb24pJzsKfQoKZW51bSBUeXBlVmFyaWFibGVLaW5kIHsgY2xzLCBtZXRob2QsIGxvY2FsLCBmdW5jdGlvbiB9CgovLy8gQSBmYWtlIGlyLk5vZGUgdGhhdCBob2xkcyB0aGUgVHlwZVBhcmFtZXRlclR5cGUgYXMgd2VsbCBhcyB0aGUgY29udGV4dCBpbgovLy8gd2hpY2ggaXQgb2NjdXJzLgpjbGFzcyBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQgaW1wbGVtZW50cyBpci5Ob2RlIHsKICBmaW5hbCBpci5Ob2RlIGNvbnRleHQ7CiAgZmluYWwgaXIuVHlwZVBhcmFtZXRlclR5cGUgdHlwZTsKICBmaW5hbCBUeXBlVmFyaWFibGVLaW5kIGtpbmQ7CiAgZmluYWwgaXIuVHJlZU5vZGUgdHlwZURlY2xhcmF0aW9uOwoKICAvLy8gW2NvbnRleHRdIGNhbiBiZSBlaXRoZXIgYW4gaXIuTWVtYmVyIG9yIGEgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiBvcgogIC8vLyBpci5GdW5jdGlvbkV4cHJlc3Npb24uCiAgZmFjdG9yeSBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQoCiAgICAgIGlyLlR5cGVQYXJhbWV0ZXJUeXBlIHR5cGUsIGlyLlRyZWVOb2RlIGNvbnRleHQpIHsKICAgIFR5cGVWYXJpYWJsZUtpbmQga2luZDsKICAgIGlyLlRyZWVOb2RlIHR5cGVEZWNsYXJhdGlvbiA9IHR5cGUucGFyYW1ldGVyLnBhcmVudDsKICAgIGlmICh0eXBlRGVjbGFyYXRpb24gPT0gbnVsbCkgewogICAgICAvLyBXZSBoYXZlIGEgZnVuY3Rpb24gdHlwZSB2YXJpYWJsZSwgbGlrZSBgVGAgaW4gYHZvaWQgRnVuY3Rpb248VD4oaW50KWAuCiAgICAgIGtpbmQgPSBUeXBlVmFyaWFibGVLaW5kLmZ1bmN0aW9uOwogICAgfSBlbHNlIGlmICh0eXBlRGVjbGFyYXRpb24gaXMgaXIuQ2xhc3MpIHsKICAgICAgLy8gV2UgaGF2ZSBhIGNsYXNzIHR5cGUgdmFyaWFibGUsIGxpa2UgYFRgIGluIGBjbGFzcyBDbGFzczxUPiB7IC4uLiB9YC4KICAgICAga2luZCA9IFR5cGVWYXJpYWJsZUtpbmQuY2xzOwogICAgfSBlbHNlIGlmICh0eXBlRGVjbGFyYXRpb24ucGFyZW50IGlzIGlyLk1lbWJlcikgewogICAgICBpci5NZW1iZXIgbWVtYmVyID0gdHlwZURlY2xhcmF0aW9uLnBhcmVudDsKICAgICAgaWYgKG1lbWJlciBpcyBpci5Db25zdHJ1Y3RvciB8fAogICAgICAgICAgKG1lbWJlciBpcyBpci5Qcm9jZWR1cmUgJiYgbWVtYmVyLmlzRmFjdG9yeSkpIHsKICAgICAgICAvLyBXZSBoYXZlIGEgc3ludGhlc2l6ZWQgZ2VuZXJpYyBtZXRob2QgdHlwZSB2YXJpYWJsZSBmb3IgYSBjbGFzcyB0eXBlCiAgICAgICAgLy8gdmFyaWFibGUuCiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSGFuZGxlIGNvbnN0cnVjdG9yL2ZhY3RvcnkgdHlwZSB2YXJpYWJsZXMgYXMKICAgICAgICAvLyBtZXRob2QgdHlwZSB2YXJpYWJsZXMuCiAgICAgICAga2luZCA9IFR5cGVWYXJpYWJsZUtpbmQuY2xzOwogICAgICAgIHR5cGVEZWNsYXJhdGlvbiA9IG1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBXZSBoYXZlIGEgZ2VuZXJpYyBtZXRob2QgdHlwZSB2YXJpYWJsZSwgbGlrZSBgVGAgaW4KICAgICAgICAvLyBgbTxUPigpIHsgLi4uIH1gLgogICAgICAgIGtpbmQgPSBUeXBlVmFyaWFibGVLaW5kLm1ldGhvZDsKICAgICAgICB0eXBlRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb24ucGFyZW50OwogICAgICAgIGNvbnRleHQgPSB0eXBlRGVjbGFyYXRpb247CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIFdlIGhhdmUgYSBnZW5lcmljIGxvY2FsIGZ1bmN0aW9uIHR5cGUgdmFyaWFibGUsIGxpa2UgYFRgIGluCiAgICAgIC8vIGBtKCkgeyBsb2NhbDxUPigpIHsgLi4uIH0gLi4uIH1gLgogICAgICBhc3NlcnQodHlwZURlY2xhcmF0aW9uLnBhcmVudCBpcyBpci5Mb2NhbEZ1bmN0aW9uLAogICAgICAgICAgIlVuZXhwZWN0ZWQgdHlwZSBkZWNsYXJhdGlvbjogJHR5cGVEZWNsYXJhdGlvbiIpOwogICAgICBraW5kID0gVHlwZVZhcmlhYmxlS2luZC5sb2NhbDsKICAgICAgdHlwZURlY2xhcmF0aW9uID0gdHlwZURlY2xhcmF0aW9uLnBhcmVudDsKICAgICAgY29udGV4dCA9IHR5cGVEZWNsYXJhdGlvbjsKICAgIH0KICAgIHJldHVybiBuZXcgVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0LmludGVybmFsKAogICAgICAgIHR5cGUsIGNvbnRleHQsIGtpbmQsIHR5cGVEZWNsYXJhdGlvbik7CiAgfQoKICBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQuaW50ZXJuYWwoCiAgICAgIHRoaXMudHlwZSwgdGhpcy5jb250ZXh0LCB0aGlzLmtpbmQsIHRoaXMudHlwZURlY2xhcmF0aW9uKTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KGlyLlZpc2l0b3IgdikgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1R5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dC5hY2NlcHQnKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2hpbGRyZW4oaXIuVmlzaXRvciB2KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0LnZpc2l0Q2hpbGRyZW4nKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gdHlwZS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0eXBlID09IG90aGVyLnR5cGUgJiYgY29udGV4dCA9PSBvdGhlci5jb250ZXh0OwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJ1R5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCh0eXBlPSR0eXBlLGNvbnRleHQ9JGNvbnRleHQsJwogICAgICAna2luZD0ka2luZCx0eXBlRGVjbGFyYXRpb249JHR5cGVEZWNsYXJhdGlvbiknOwp9CoGjAE5OPAEoATwaMh0BMDgoASw+LQEMFkIEAgEYOxs0ThcrAU9PJ0kqAU5PTUZNPUs5AU5BOScBTzNNPk4BJUM8KgFAPC4qASYbJiIaICMtGgEMFio1Lk0XJy8lEwgUGgQCATQXMik5TBlOIzkZIhwnIxshJC4bAU1KPg4UEhQnUCcqNCEBMj8BPAIBPDkBGzIpHzlMGU4jORkPHCcjGyEkLhsBQwIBT08QEBUnLgIBFyAGSg8MATwNATAQAUUPAUQOAUQOAUIbAUQWAUcYAUUVATcTAT8SATkUAUETAScNATMdAgEUHhooKCgBJxwjICMBKzUjICMBMTQcICMBLDYjICMBMjUcICMBMz0jICMBLjgjICMBNDocIyMBRTccIwE8PxwjIAEmOwEnPAEqPwEpPgEoPQEoPQEnPAEMFhsdJCEjAQwcLS0hIjAqLgQBDEA9JwIBNwFOFTcZIx8lAUodJzgbOSNQKC5OIzYxJjpPFU0iJTEPPx0oMiMIDUUrOTwlMCEGNS8EAShBAQwZRgQBDCBNBAEMJQEMHD07BAEMF0E2AgEkcGFja2FnZTpjb21waWxlci9zcmMvaXIvY2xvc3VyZS5kYXJ0LHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lyL2ltcGFjdC5kYXJ0wABgLS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JwogICAgc2hvdyBvcGVyYXRvckZyb21TdHJpbmc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJ2NvbnN0YW50cy5kYXJ0JzsKaW1wb3J0ICdpbXBhY3RfZGF0YS5kYXJ0JzsKaW1wb3J0ICdydW50aW1lX3R5cGVfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnc2NvcGUuZGFydCc7CmltcG9ydCAnc3RhdGljX3R5cGUuZGFydCc7CmltcG9ydCAnc3RhdGljX3R5cGVfY2FjaGUuZGFydCc7CmltcG9ydCAndXRpbC5kYXJ0JzsKCi8vLyBJbnRlcmZhY2UgZm9yIGNvbGxlY3Rpbmcgd29ybGQgaW1wYWN0IGRhdGEuCi8vLwovLy8gVGhpcyBpcyB1c2VkIGJvdGggZm9yIGRpcmVjdCB3b3JsZCBpbXBhY3QgY29tcHV0YXRpb24gdGhyb3VnaCB0aGUKLy8vIFtLZXJuZWxJbXBhY3RCdWlsZGVyXSBhbmQgZm9yIHNlcmlhbGl6YXRpb24gdGhyb3VnaCB0aGUgW0ltcGFjdEJ1aWxkZXJdCi8vLyBhbmQgW0ltcGFjdExvYWRlcl0uCmFic3RyYWN0IGNsYXNzIEltcGFjdFJlZ2lzdHJ5IHsKICB2b2lkIHJlZ2lzdGVySW50TGl0ZXJhbChpbnQgdmFsdWUpOwoKICB2b2lkIHJlZ2lzdGVyRG91YmxlTGl0ZXJhbChkb3VibGUgdmFsdWUpOwoKICB2b2lkIHJlZ2lzdGVyQm9vbExpdGVyYWwoYm9vbCB2YWx1ZSk7CgogIHZvaWQgcmVnaXN0ZXJTdHJpbmdMaXRlcmFsKFN0cmluZyB2YWx1ZSk7CgogIHZvaWQgcmVnaXN0ZXJTeW1ib2xMaXRlcmFsKFN0cmluZyB2YWx1ZSk7CgogIHZvaWQgcmVnaXN0ZXJOdWxsTGl0ZXJhbCgpOwoKICB2b2lkIHJlZ2lzdGVyTGlzdExpdGVyYWwoaXIuRGFydFR5cGUgZWxlbWVudFR5cGUsCiAgICAgIHtib29sIGlzQ29uc3QsIGJvb2wgaXNFbXB0eX0pOwoKICB2b2lkIHJlZ2lzdGVyU2V0TGl0ZXJhbChpci5EYXJ0VHlwZSBlbGVtZW50VHlwZSwKICAgICAge2Jvb2wgaXNDb25zdCwgYm9vbCBpc0VtcHR5fSk7CgogIHZvaWQgcmVnaXN0ZXJNYXBMaXRlcmFsKGlyLkRhcnRUeXBlIGtleVR5cGUsIGlyLkRhcnRUeXBlIHZhbHVlVHlwZSwKICAgICAge2Jvb2wgaXNDb25zdCwgYm9vbCBpc0VtcHR5fSk7CgogIHZvaWQgcmVnaXN0ZXJTdGF0aWNUZWFyT2ZmKAogICAgICBpci5Qcm9jZWR1cmUgcHJvY2VkdXJlLCBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQpOwoKICB2b2lkIHJlZ2lzdGVyU3RhdGljR2V0KGlyLk1lbWJlciBtZW1iZXIsIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCk7CgogIHZvaWQgcmVnaXN0ZXJTdGF0aWNTZXQoaXIuTWVtYmVyIG1lbWJlciwgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0KTsKCiAgdm9pZCByZWdpc3RlckFzc2VydCh7Ym9vbCB3aXRoTWVzc2FnZX0pOwoKICB2b2lkIHJlZ2lzdGVyR2VuZXJpY0luc3RhbnRpYXRpb24oCiAgICAgIGlyLkZ1bmN0aW9uVHlwZSBleHByZXNzaW9uVHlwZSwgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyk7CgogIHZvaWQgcmVnaXN0ZXJTeW5jU3Rhcihpci5EYXJ0VHlwZSBlbGVtZW50VHlwZSk7CgogIHZvaWQgcmVnaXN0ZXJBc3luYyhpci5EYXJ0VHlwZSBlbGVtZW50VHlwZSk7CgogIHZvaWQgcmVnaXN0ZXJBc3luY1N0YXIoaXIuRGFydFR5cGUgZWxlbWVudFR5cGUpOwoKICB2b2lkIHJlZ2lzdGVyU3RyaW5nQ29uY2F0ZW5hdGlvbigpOwoKICB2b2lkIHJlZ2lzdGVyTG9jYWxGdW5jdGlvbihpci5UcmVlTm9kZSBub2RlKTsKCiAgdm9pZCByZWdpc3RlckxvY2FsV2l0aG91dEluaXRpYWxpemVyKCk7CgogIHZvaWQgcmVnaXN0ZXJJc0NoZWNrKGlyLkRhcnRUeXBlIHR5cGUpOwoKICB2b2lkIHJlZ2lzdGVySW1wbGljaXRDYXN0KGlyLkRhcnRUeXBlIHR5cGUpOwoKICB2b2lkIHJlZ2lzdGVyQXNDYXN0KGlyLkRhcnRUeXBlIHR5cGUpOwoKICB2b2lkIHJlZ2lzdGVyVGhyb3coKTsKCiAgdm9pZCByZWdpc3RlclN5bmNGb3JJbihpci5EYXJ0VHlwZSBpdGVyYWJsZVR5cGUsIGlyLkRhcnRUeXBlIGl0ZXJhdG9yVHlwZSwKICAgICAgQ2xhc3NSZWxhdGlvbiBpdGVyYXRvckNsYXNzUmVsYXRpb24pOwoKICB2b2lkIHJlZ2lzdGVyQXN5bmNGb3JJbihpci5EYXJ0VHlwZSBpdGVyYWJsZVR5cGUsIGlyLkRhcnRUeXBlIGl0ZXJhdG9yVHlwZSwKICAgICAgQ2xhc3NSZWxhdGlvbiBpdGVyYXRvckNsYXNzUmVsYXRpb24pOwoKICB2b2lkIHJlZ2lzdGVyQ2F0Y2goKTsKCiAgdm9pZCByZWdpc3RlclN0YWNrVHJhY2UoKTsKCiAgdm9pZCByZWdpc3RlckNhdGNoVHlwZShpci5EYXJ0VHlwZSB0eXBlKTsKCiAgdm9pZCByZWdpc3RlclR5cGVMaXRlcmFsKGlyLkRhcnRUeXBlIHR5cGUsIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCk7CgogIHZvaWQgcmVnaXN0ZXJGaWVsZEluaXRpYWxpemF0aW9uKGlyLkZpZWxkIG5vZGUpOwoKICB2b2lkIHJlZ2lzdGVyRmllbGRDb25zdGFudEluaXRpYWxpemF0aW9uKAogICAgICBpci5GaWVsZCBub2RlLCBDb25zdGFudFJlZmVyZW5jZSBjb25zdGFudCk7CgogIHZvaWQgcmVnaXN0ZXJMb2FkTGlicmFyeSgpOwoKICB2b2lkIHJlZ2lzdGVyUmVkaXJlY3RpbmdJbml0aWFsaXplcigKICAgICAgaXIuQ29uc3RydWN0b3IgY29uc3RydWN0b3IsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpOwoKICB2b2lkIHJlZ2lzdGVyUGFyYW1ldGVyQ2hlY2soaXIuRGFydFR5cGUgdHlwZSk7CgogIHZvaWQgcmVnaXN0ZXJMYXp5RmllbGQoKTsKCiAgdm9pZCByZWdpc3Rlck5ldygKICAgICAgaXIuTWVtYmVyIGNvbnN0cnVjdG9yLAogICAgICBpci5JbnRlcmZhY2VUeXBlIHR5cGUsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCwKICAgICAge2Jvb2wgaXNDb25zdH0pOwoKICB2b2lkIHJlZ2lzdGVyQ29uc3RJbnN0YW50aWF0aW9uKGlyLkNsYXNzIGNscywgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0KTsKCiAgdm9pZCByZWdpc3RlclN0YXRpY0ludm9jYXRpb24oCiAgICAgIGlyLlByb2NlZHVyZSB0YXJnZXQsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCk7CgogIHZvaWQgcmVnaXN0ZXJMb2NhbEZ1bmN0aW9uSW52b2NhdGlvbigKICAgICAgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiBsb2NhbEZ1bmN0aW9uLAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKTsKCiAgdm9pZCByZWdpc3RlckR5bmFtaWNJbnZvY2F0aW9uKAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIENsYXNzUmVsYXRpb24gcmVsYXRpb24sCiAgICAgIGlyLk5hbWUgbmFtZSwKICAgICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywKICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyk7CgogIHZvaWQgcmVnaXN0ZXJJbnN0YW5jZUludm9jYXRpb24oCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwKICAgICAgaXIuTWVtYmVyIHRhcmdldCwKICAgICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywKICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyk7CgogIHZvaWQgcmVnaXN0ZXJGdW5jdGlvbkludm9jYXRpb24oCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywKICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyk7CgogIHZvaWQgcmVnaXN0ZXJEeW5hbWljR2V0KAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIENsYXNzUmVsYXRpb24gcmVsYXRpb24sIGlyLk5hbWUgbmFtZSk7CgogIHZvaWQgcmVnaXN0ZXJJbnN0YW5jZUdldCgKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uLCBpci5NZW1iZXIgdGFyZ2V0KTsKCiAgdm9pZCByZWdpc3RlckR5bmFtaWNTZXQoCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwgaXIuTmFtZSBuYW1lKTsKCiAgdm9pZCByZWdpc3Rlckluc3RhbmNlU2V0KAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIENsYXNzUmVsYXRpb24gcmVsYXRpb24sIGlyLk1lbWJlciB0YXJnZXQpOwoKICB2b2lkIHJlZ2lzdGVyU3VwZXJJbnZvY2F0aW9uKGlyLk5hbWUgbmFtZSwgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyk7CgogIHZvaWQgcmVnaXN0ZXJTdXBlckdldChpci5OYW1lIG5hbWUpOwoKICB2b2lkIHJlZ2lzdGVyU3VwZXJTZXQoaXIuTmFtZSBuYW1lKTsKCiAgdm9pZCByZWdpc3RlclN1cGVySW5pdGlhbGl6ZXIoCiAgICAgIGlyLkNvbnN0cnVjdG9yIHNvdXJjZSwKICAgICAgaXIuQ29uc3RydWN0b3IgdGFyZ2V0LAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKTsKCiAgdm9pZCByZWdpc3RlclJ1bnRpbWVUeXBlVXNlKGlyLlByb3BlcnR5R2V0IG5vZGUsIFJ1bnRpbWVUeXBlVXNlS2luZCBraW5kLAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIGlyLkRhcnRUeXBlIGFyZ3VtZW50VHlwZSk7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGVzZSB3aGVuIENGRSBwcm92aWRlcyBjb25zdGFudHMuCiAgdm9pZCByZWdpc3RlckNvbnN0cnVjdG9yTm9kZShpci5Db25zdHJ1Y3RvciBub2RlKTsKICB2b2lkIHJlZ2lzdGVyRmllbGROb2RlKGlyLkZpZWxkIG5vZGUpOwogIHZvaWQgcmVnaXN0ZXJQcm9jZWR1cmVOb2RlKGlyLlByb2NlZHVyZSBub2RlKTsKICB2b2lkIHJlZ2lzdGVyU3RhdGljSW52b2NhdGlvbk5vZGUoaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKTsKICB2b2lkIHJlZ2lzdGVyU3dpdGNoU3RhdGVtZW50Tm9kZShpci5Td2l0Y2hTdGF0ZW1lbnQgbm9kZSk7CiAgdm9pZCByZWdpc3RlckNvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uTm9kZShpci5Db25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSk7Cn0KCmFic3RyYWN0IGNsYXNzIEltcGFjdEJ1aWxkZXJCYXNlIGV4dGVuZHMgU3RhdGljVHlwZVZpc2l0b3IKICAgIGltcGxlbWVudHMgSW1wYWN0UmVnaXN0cnkgewogIEBvdmVycmlkZQogIGZpbmFsIFZhcmlhYmxlU2NvcGVNb2RlbCB2YXJpYWJsZVNjb3BlTW9kZWw7CgogIEltcGFjdEJ1aWxkZXJCYXNlKGlyLlR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsCiAgICAgIGlyLkNsYXNzSGllcmFyY2h5IGNsYXNzSGllcmFyY2h5LCB0aGlzLnZhcmlhYmxlU2NvcGVNb2RlbCkKICAgICAgOiBzdXBlcih0eXBlRW52aXJvbm1lbnQsIGNsYXNzSGllcmFyY2h5KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnRMaXRlcmFsKGlyLkludExpdGVyYWwgbm9kZSkgewogICAgcmVnaXN0ZXJJbnRMaXRlcmFsKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVEb3VibGVMaXRlcmFsKGlyLkRvdWJsZUxpdGVyYWwgbm9kZSkgewogICAgcmVnaXN0ZXJEb3VibGVMaXRlcmFsKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVCb29sTGl0ZXJhbChpci5Cb29sTGl0ZXJhbCBub2RlKSB7CiAgICByZWdpc3RlckJvb2xMaXRlcmFsKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdHJpbmdMaXRlcmFsKGlyLlN0cmluZ0xpdGVyYWwgbm9kZSkgewogICAgcmVnaXN0ZXJTdHJpbmdMaXRlcmFsKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTeW1ib2xMaXRlcmFsKGlyLlN5bWJvbExpdGVyYWwgbm9kZSkgewogICAgcmVnaXN0ZXJTeW1ib2xMaXRlcmFsKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOdWxsTGl0ZXJhbChpci5OdWxsTGl0ZXJhbCBub2RlKSB7CiAgICByZWdpc3Rlck51bGxMaXRlcmFsKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpc3RMaXRlcmFsKGlyLkxpc3RMaXRlcmFsIG5vZGUpIHsKICAgIHJlZ2lzdGVyTGlzdExpdGVyYWwobm9kZS50eXBlQXJndW1lbnQsCiAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0LCBpc0VtcHR5OiBub2RlLmV4cHJlc3Npb25zLmlzRW1wdHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTZXRMaXRlcmFsKGlyLlNldExpdGVyYWwgbm9kZSkgewogICAgcmVnaXN0ZXJTZXRMaXRlcmFsKG5vZGUudHlwZUFyZ3VtZW50LAogICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCwgaXNFbXB0eTogbm9kZS5leHByZXNzaW9ucy5pc0VtcHR5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTWFwTGl0ZXJhbChpci5NYXBMaXRlcmFsIG5vZGUpIHsKICAgIHJlZ2lzdGVyTWFwTGl0ZXJhbChub2RlLmtleVR5cGUsIG5vZGUudmFsdWVUeXBlLAogICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCwgaXNFbXB0eTogbm9kZS5lbnRyaWVzLmlzRW1wdHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdGF0aWNHZXQoaXIuU3RhdGljR2V0IG5vZGUsIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUpIHsKICAgIGlyLk1lbWJlciB0YXJnZXQgPSBub2RlLnRhcmdldDsKICAgIGlmICh0YXJnZXQgaXMgaXIuUHJvY2VkdXJlICYmIHRhcmdldC5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuTWV0aG9kKSB7CiAgICAgIHJlZ2lzdGVyU3RhdGljVGVhck9mZih0YXJnZXQsIGdldERlZmVycmVkSW1wb3J0KG5vZGUpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlZ2lzdGVyU3RhdGljR2V0KHRhcmdldCwgZ2V0RGVmZXJyZWRJbXBvcnQobm9kZSkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdGF0aWNTZXQoaXIuU3RhdGljU2V0IG5vZGUsIGlyLkRhcnRUeXBlIHZhbHVlVHlwZSkgewogICAgcmVnaXN0ZXJTdGF0aWNTZXQobm9kZS50YXJnZXQsIGdldERlZmVycmVkSW1wb3J0KG5vZGUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQXNzZXJ0U3RhdGVtZW50KGlyLkFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAgICByZWdpc3RlckFzc2VydCh3aXRoTWVzc2FnZTogbm9kZS5tZXNzYWdlICE9IG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnN0YW50aWF0aW9uKGlyLkluc3RhbnRpYXRpb24gbm9kZSwKICAgICAgaXIuRnVuY3Rpb25UeXBlIGV4cHJlc3Npb25UeXBlLCBpci5EYXJ0VHlwZSByZXN1bHRUeXBlKSB7CiAgICByZWdpc3RlckdlbmVyaWNJbnN0YW50aWF0aW9uKGV4cHJlc3Npb25UeXBlLCBub2RlLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgdm9pZCBoYW5kbGVBc3luY01hcmtlcihpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb24pIHsKICAgIGlyLkFzeW5jTWFya2VyIGFzeW5jTWFya2VyID0gZnVuY3Rpb24uYXN5bmNNYXJrZXI7CiAgICBpci5EYXJ0VHlwZSByZXR1cm5UeXBlID0gZnVuY3Rpb24ucmV0dXJuVHlwZTsKCiAgICBzd2l0Y2ggKGFzeW5jTWFya2VyKSB7CiAgICAgIGNhc2UgaXIuQXN5bmNNYXJrZXIuU3luYzoKICAgICAgICBicmVhazsKICAgICAgY2FzZSBpci5Bc3luY01hcmtlci5TeW5jU3RhcjoKICAgICAgICBpci5EYXJ0VHlwZSBlbGVtZW50VHlwZSA9IGNvbnN0IGlyLkR5bmFtaWNUeXBlKCk7CiAgICAgICAgaWYgKHJldHVyblR5cGUgaXMgaXIuSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgaWYgKHJldHVyblR5cGUuY2xhc3NOb2RlID09IHR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMuaXRlcmFibGVDbGFzcykgewogICAgICAgICAgICBlbGVtZW50VHlwZSA9IHJldHVyblR5cGUudHlwZUFyZ3VtZW50cy5maXJzdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVnaXN0ZXJTeW5jU3RhcihlbGVtZW50VHlwZSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIGlyLkFzeW5jTWFya2VyLkFzeW5jOgogICAgICAgIGlyLkRhcnRUeXBlIGVsZW1lbnRUeXBlID0gY29uc3QgaXIuRHluYW1pY1R5cGUoKTsKICAgICAgICBpZiAocmV0dXJuVHlwZSBpcyBpci5JbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICBpZiAocmV0dXJuVHlwZS5jbGFzc05vZGUgPT0gdHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5mdXR1cmVPckNsYXNzKSB7CiAgICAgICAgICAgIGVsZW1lbnRUeXBlID0gcmV0dXJuVHlwZS50eXBlQXJndW1lbnRzLmZpcnN0OwogICAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5UeXBlLmNsYXNzTm9kZSA9PQogICAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMuZnV0dXJlQ2xhc3MpIHsKICAgICAgICAgICAgZWxlbWVudFR5cGUgPSByZXR1cm5UeXBlLnR5cGVBcmd1bWVudHMuZmlyc3Q7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJlZ2lzdGVyQXN5bmMoZWxlbWVudFR5cGUpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBpci5Bc3luY01hcmtlci5Bc3luY1N0YXI6CiAgICAgICAgaXIuRGFydFR5cGUgZWxlbWVudFR5cGUgPSBjb25zdCBpci5EeW5hbWljVHlwZSgpOwogICAgICAgIGlmIChyZXR1cm5UeXBlIGlzIGlyLkludGVyZmFjZVR5cGUpIHsKICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmNsYXNzTm9kZSA9PSB0eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLnN0cmVhbUNsYXNzKSB7CiAgICAgICAgICAgIGVsZW1lbnRUeXBlID0gcmV0dXJuVHlwZS50eXBlQXJndW1lbnRzLmZpcnN0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZWdpc3RlckFzeW5jU3RhcihlbGVtZW50VHlwZSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIGlyLkFzeW5jTWFya2VyLlN5bmNZaWVsZGluZzoKICAgICAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgICAiVW5leHBlY3RlZCBhc3luYyBtYXJrZXI6ICR7YXN5bmNNYXJrZXJ9Iik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN0cmluZ0NvbmNhdGVuYXRpb24oaXIuU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICByZWdpc3RlclN0cmluZ0NvbmNhdGVuYXRpb24oKTsKICB9CgogIEBvdmVycmlkZQogIE51bGwgaGFuZGxlRnVuY3Rpb25EZWNsYXJhdGlvbihpci5GdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHJlZ2lzdGVyTG9jYWxGdW5jdGlvbihub2RlKTsKICAgIGhhbmRsZUFzeW5jTWFya2VyKG5vZGUuZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVGdW5jdGlvbkV4cHJlc3Npb24oaXIuRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIHJlZ2lzdGVyTG9jYWxGdW5jdGlvbihub2RlKTsKICAgIGhhbmRsZUFzeW5jTWFya2VyKG5vZGUuZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVWYXJpYWJsZURlY2xhcmF0aW9uKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgPT0gbnVsbCkgewogICAgICByZWdpc3RlckxvY2FsV2l0aG91dEluaXRpYWxpemVyKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUlzRXhwcmVzc2lvbihpci5Jc0V4cHJlc3Npb24gbm9kZSkgewogICAgcmVnaXN0ZXJJc0NoZWNrKG5vZGUudHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUFzRXhwcmVzc2lvbihpci5Bc0V4cHJlc3Npb24gbm9kZSwgaXIuRGFydFR5cGUgb3BlcmFuZFR5cGUpIHsKICAgIGlmICh0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2Yob3BlcmFuZFR5cGUsIG5vZGUudHlwZSkpIHsKICAgICAgLy8gU2tpcCB1bm5lZWRlZCBjYXN0cy4KICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG5vZGUuaXNUeXBlRXJyb3IpIHsKICAgICAgcmVnaXN0ZXJJbXBsaWNpdENhc3Qobm9kZS50eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlZ2lzdGVyQXNDYXN0KG5vZGUudHlwZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVRocm93KGlyLlRocm93IG5vZGUpIHsKICAgIHJlZ2lzdGVyVGhyb3coKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ySW5TdGF0ZW1lbnQoaXIuRm9ySW5TdGF0ZW1lbnQgbm9kZSwgaXIuRGFydFR5cGUgaXRlcmFibGVUeXBlLAogICAgICBpci5EYXJ0VHlwZSBpdGVyYXRvclR5cGUpIHsKICAgIGlmIChub2RlLmlzQXN5bmMpIHsKICAgICAgcmVnaXN0ZXJBc3luY0ZvckluKGl0ZXJhYmxlVHlwZSwgaXRlcmF0b3JUeXBlLAogICAgICAgICAgY29tcHV0ZUNsYXNzUmVsYXRpb25Gcm9tVHlwZShpdGVyYXRvclR5cGUpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlZ2lzdGVyU3luY0ZvckluKGl0ZXJhYmxlVHlwZSwgaXRlcmF0b3JUeXBlLAogICAgICAgICAgY29tcHV0ZUNsYXNzUmVsYXRpb25Gcm9tVHlwZShpdGVyYXRvclR5cGUpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2F0Y2goaXIuQ2F0Y2ggbm9kZSkgewogICAgcmVnaXN0ZXJDYXRjaCgpOwogICAgaWYgKG5vZGUuc3RhY2tUcmFjZSAhPSBudWxsKSB7CiAgICAgIHJlZ2lzdGVyU3RhY2tUcmFjZSgpOwogICAgfQogICAgaWYgKG5vZGUuZ3VhcmQgaXMhIGlyLkR5bmFtaWNUeXBlKSB7CiAgICAgIHJlZ2lzdGVyQ2F0Y2hUeXBlKG5vZGUuZ3VhcmQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVUeXBlTGl0ZXJhbChpci5UeXBlTGl0ZXJhbCBub2RlKSB7CiAgICByZWdpc3RlclR5cGVMaXRlcmFsKG5vZGUudHlwZSwgZ2V0RGVmZXJyZWRJbXBvcnQobm9kZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVGaWVsZEluaXRpYWxpemVyKGlyLkZpZWxkSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgcmVnaXN0ZXJGaWVsZEluaXRpYWxpemF0aW9uKG5vZGUuZmllbGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMb2FkTGlicmFyeShpci5Mb2FkTGlicmFyeSBub2RlKSB7CiAgICByZWdpc3RlckxvYWRMaWJyYXJ5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoCiAgICAgIGlyLlJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgbm9kZSwgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzKSB7CiAgICByZWdpc3RlclJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoCiAgICAgICAgbm9kZS50YXJnZXQsCiAgICAgICAgbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGgsCiAgICAgICAgX2dldE5hbWVkQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKSwKICAgICAgICBub2RlLmFyZ3VtZW50cy50eXBlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVBhcmFtZXRlcihpci5WYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlcikgewogICAgcmVnaXN0ZXJQYXJhbWV0ZXJDaGVjayhwYXJhbWV0ZXIudHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVNpZ25hdHVyZShpci5GdW5jdGlvbk5vZGUgbm9kZSkgewogICAgZm9yIChpci5UeXBlUGFyYW1ldGVyIHBhcmFtZXRlciBpbiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIHJlZ2lzdGVyUGFyYW1ldGVyQ2hlY2socGFyYW1ldGVyLmJvdW5kKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ29uc3RydWN0b3IoaXIuQ29uc3RydWN0b3Igbm9kZSkgewogICAgcmVnaXN0ZXJDb25zdHJ1Y3Rvck5vZGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZpZWxkKGlyLkZpZWxkIGZpZWxkKSB7CiAgICByZWdpc3RlclBhcmFtZXRlckNoZWNrKGZpZWxkLnR5cGUpOwogICAgaWYgKGZpZWxkLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgaWYgKCFmaWVsZC5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICAgICAhZmllbGQuaXNDb25zdCAmJgogICAgICAgICAgZmllbGQuaW5pdGlhbGl6ZXIgaXMhIGlyLk51bGxMaXRlcmFsKSB7CiAgICAgICAgcmVnaXN0ZXJMYXp5RmllbGQoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVnaXN0ZXJOdWxsTGl0ZXJhbCgpOwogICAgfQogICAgcmVnaXN0ZXJGaWVsZE5vZGUoZmllbGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVQcm9jZWR1cmUoaXIuUHJvY2VkdXJlIHByb2NlZHVyZSkgewogICAgaGFuZGxlQXN5bmNNYXJrZXIocHJvY2VkdXJlLmZ1bmN0aW9uKTsKICAgIHJlZ2lzdGVyUHJvY2VkdXJlTm9kZShwcm9jZWR1cmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDb25zdHJ1Y3Rvckludm9jYXRpb24oaXIuQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUsCiAgICAgIEFyZ3VtZW50VHlwZXMgYXJndW1lbnRUeXBlcywgaXIuRGFydFR5cGUgcmVzdWx0VHlwZSkgewogICAgcmVnaXN0ZXJOZXcoCiAgICAgICAgbm9kZS50YXJnZXQsCiAgICAgICAgbm9kZS5jb25zdHJ1Y3RlZFR5cGUsCiAgICAgICAgbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGgsCiAgICAgICAgX2dldE5hbWVkQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKSwKICAgICAgICBub2RlLmFyZ3VtZW50cy50eXBlcywKICAgICAgICBnZXREZWZlcnJlZEltcG9ydChub2RlKSwKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QpOwogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICByZWdpc3RlckNvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uTm9kZShub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3RhdGljSW52b2NhdGlvbihpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUsCiAgICAgIEFyZ3VtZW50VHlwZXMgYXJndW1lbnRUeXBlcywgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSkgewogICAgaW50IHBvc2l0aW9uQXJndW1lbnRzID0gbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGg7CiAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMgPSBfZ2V0TmFtZWRBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IG5vZGUuYXJndW1lbnRzLnR5cGVzOwogICAgaWYgKG5vZGUudGFyZ2V0LmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5GYWN0b3J5KSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFdlIHNob3VsZCBub3QgbWFyayB0aGUgdHlwZSBhcyBpbnN0YW50aWF0ZWQgYnV0CiAgICAgIC8vIHJhdGhlciBmb2xsb3cgdGhlIHR5cGUgYXJndW1lbnRzIGRpcmVjdGx5LgogICAgICAvLwogICAgICAvLyBDb25zaWRlciB0aGlzOgogICAgICAvLwogICAgICAvLyAgICBhYnN0cmFjdCBjbGFzcyBBPFQ+IHsKICAgICAgLy8gICAgICBmYWN0b3J5IEEucmVndWxhcigpID0+IG5ldyBCPFQ+KCk7CiAgICAgIC8vICAgICAgZmFjdG9yeSBBLnJlZGlyZWN0KCkgPSBCPFQ+OwogICAgICAvLyAgICB9CiAgICAgIC8vCiAgICAgIC8vICAgIGNsYXNzIEI8VD4gaW1wbGVtZW50cyBBPFQ+IHt9CiAgICAgIC8vCiAgICAgIC8vICAgIG1haW4oKSB7CiAgICAgIC8vICAgICAgcHJpbnQobmV3IEE8aW50Pi5yZWd1bGFyKCkgaXMgQjxpbnQ+KTsKICAgICAgLy8gICAgICBwcmludChuZXcgQTxTdHJpbmc+LnJlZGlyZWN0KCkgaXMgQjxTdHJpbmc+KTsKICAgICAgLy8gICAgfQogICAgICAvLwogICAgICAvLyBUbyB0cmFjayB0aGF0IEIgaXMgYWN0dWFsbHkgaW5zdGFudGlhdGVkIGFzIEI8aW50PiBhbmQgQjxTdHJpbmc+IHdlCiAgICAgIC8vIG5lZWQgdG8gZm9sbG93IHRoZSB0eXBlIGFyZ3VtZW50cyBwYXNzZWQgdG8gQS5yZWd1bGFyIGFuZCBBLnJlZGlyZWN0CiAgICAgIC8vIHRvIEIuIEN1cnJlbnRseSwgd2Ugb25seSBkbyB0aGlzIHNvdW5kbHkgaWYgd2UgcmVnaXN0ZXIgQTxpbnQ+IGFuZAogICAgICAvLyBBPFN0cmluZz4gYXMgaW5zdGFudGlhdGVkLiBXZSBzaG91bGQgaW5zdGVhZCByZWdpc3RlciB0aGF0IEEuVCBpcwogICAgICAvLyBpbnN0YW50aWF0ZWQgYXMgaW50IGFuZCBTdHJpbmcuCiAgICAgIHJlZ2lzdGVyTmV3KAogICAgICAgICAgbm9kZS50YXJnZXQsCiAgICAgICAgICBuZXcgaXIuSW50ZXJmYWNlVHlwZShub2RlLnRhcmdldC5lbmNsb3NpbmdDbGFzcywgdHlwZUFyZ3VtZW50cyksCiAgICAgICAgICBwb3NpdGlvbkFyZ3VtZW50cywKICAgICAgICAgIG5hbWVkQXJndW1lbnRzLAogICAgICAgICAgbm9kZS5hcmd1bWVudHMudHlwZXMsCiAgICAgICAgICBnZXREZWZlcnJlZEltcG9ydChub2RlKSwKICAgICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgICB9IGVsc2UgewogICAgICByZWdpc3RlclN0YXRpY0ludm9jYXRpb24obm9kZS50YXJnZXQsIHBvc2l0aW9uQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cywKICAgICAgICAgIHR5cGVBcmd1bWVudHMsIGdldERlZmVycmVkSW1wb3J0KG5vZGUpKTsKICAgIH0KICAgIHJlZ2lzdGVyU3RhdGljSW52b2NhdGlvbk5vZGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU1ldGhvZEludm9jYXRpb24oCiAgICAgIGlyLk1ldGhvZEludm9jYXRpb24gbm9kZSwKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLAogICAgICBBcmd1bWVudFR5cGVzIGFyZ3VtZW50VHlwZXMsCiAgICAgIGlyLkRhcnRUeXBlIHJldHVyblR5cGUpIHsKICAgIGludCBwb3NpdGlvbkFyZ3VtZW50cyA9IG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoOwogICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzID0gX2dldE5hbWVkQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBub2RlLmFyZ3VtZW50cy50eXBlczsKICAgIGlyLkV4cHJlc3Npb24gcmVjZWl2ZXIgPSBub2RlLnJlY2VpdmVyOwogICAgaWYgKHJlY2VpdmVyIGlzIGlyLlZhcmlhYmxlR2V0ICYmCiAgICAgICAgcmVjZWl2ZXIudmFyaWFibGUuaXNGaW5hbCAmJgogICAgICAgIHJlY2VpdmVyLnZhcmlhYmxlLnBhcmVudCBpcyBpci5GdW5jdGlvbkRlY2xhcmF0aW9uKSB7CiAgICAgIHJlZ2lzdGVyTG9jYWxGdW5jdGlvbkludm9jYXRpb24ocmVjZWl2ZXIudmFyaWFibGUucGFyZW50LAogICAgICAgICAgcG9zaXRpb25Bcmd1bWVudHMsIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIENsYXNzUmVsYXRpb24gcmVsYXRpb24gPSBjb21wdXRlQ2xhc3NSZWxhdGlvbkZyb21UeXBlKHJlY2VpdmVyVHlwZSk7CgogICAgICBpci5NZW1iZXIgaW50ZXJmYWNlVGFyZ2V0ID0gbm9kZS5pbnRlcmZhY2VUYXJnZXQ7CiAgICAgIGlmIChpbnRlcmZhY2VUYXJnZXQgPT0gbnVsbCkgewogICAgICAgIHJlZ2lzdGVyRHluYW1pY0ludm9jYXRpb24ocmVjZWl2ZXJUeXBlLCByZWxhdGlvbiwgbm9kZS5uYW1lLAogICAgICAgICAgICBwb3NpdGlvbkFyZ3VtZW50cywgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMpOwogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIHRyZWF0aW5nIGEga25vd24gZnVuY3Rpb24gY2FsbCBhcyBhCiAgICAgICAgLy8gZHluYW1pYyBjYWxsIHdoZW4gQ0ZFIHByb3ZpZGVzIGEgd2F5IHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28uCiAgICAgICAgaWYgKG9wZXJhdG9yRnJvbVN0cmluZyhub2RlLm5hbWUubmFtZSkgPT0gbnVsbCAmJgogICAgICAgICAgICByZWNlaXZlclR5cGUgaXMgaXIuRHluYW1pY1R5cGUpIHsKICAgICAgICAgIC8vIFdlIG1pZ2h0IGltcGxpY2l0bHkgY2FsbCBhIGdldHRlciB0aGF0IHJldHVybnMgYSBmdW5jdGlvbi4KICAgICAgICAgIHJlZ2lzdGVyRnVuY3Rpb25JbnZvY2F0aW9uKGNvbnN0IGlyLkR5bmFtaWNUeXBlKCksIHBvc2l0aW9uQXJndW1lbnRzLAogICAgICAgICAgICAgIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGludGVyZmFjZVRhcmdldCBpcyBpci5GaWVsZCB8fAogICAgICAgICAgICBpbnRlcmZhY2VUYXJnZXQgaXMgaXIuUHJvY2VkdXJlICYmCiAgICAgICAgICAgICAgICBpbnRlcmZhY2VUYXJnZXQua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLkdldHRlcikgewogICAgICAgICAgcmVnaXN0ZXJJbnN0YW5jZUludm9jYXRpb24ocmVjZWl2ZXJUeXBlLCByZWxhdGlvbiwgaW50ZXJmYWNlVGFyZ2V0LAogICAgICAgICAgICAgIHBvc2l0aW9uQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cyk7CiAgICAgICAgICByZWdpc3RlckZ1bmN0aW9uSW52b2NhdGlvbihpbnRlcmZhY2VUYXJnZXQuZ2V0dGVyVHlwZSwKICAgICAgICAgICAgICBwb3NpdGlvbkFyZ3VtZW50cywgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWdpc3Rlckluc3RhbmNlSW52b2NhdGlvbihyZWNlaXZlclR5cGUsIHJlbGF0aW9uLCBpbnRlcmZhY2VUYXJnZXQsCiAgICAgICAgICAgICAgcG9zaXRpb25Bcmd1bWVudHMsIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRGlyZWN0TWV0aG9kSW52b2NhdGlvbigKICAgICAgaXIuRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBub2RlLAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIEFyZ3VtZW50VHlwZXMgYXJndW1lbnRUeXBlcywKICAgICAgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSkgewogICAgcmVnaXN0ZXJJbnN0YW5jZUludm9jYXRpb24oCiAgICAgICAgcmVjZWl2ZXJUeXBlLAogICAgICAgIENsYXNzUmVsYXRpb24uZXhhY3QsCiAgICAgICAgbm9kZS50YXJnZXQsCiAgICAgICAgbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGgsCiAgICAgICAgX2dldE5hbWVkQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKSwKICAgICAgICBub2RlLmFyZ3VtZW50cy50eXBlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVByb3BlcnR5R2V0KAogICAgICBpci5Qcm9wZXJ0eUdldCBub2RlLCBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUpIHsKICAgIENsYXNzUmVsYXRpb24gcmVsYXRpb24gPSBjb21wdXRlQ2xhc3NSZWxhdGlvbkZyb21UeXBlKHJlY2VpdmVyVHlwZSk7CiAgICBpZiAobm9kZS5pbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCkgewogICAgICByZWdpc3Rlckluc3RhbmNlR2V0KHJlY2VpdmVyVHlwZSwgcmVsYXRpb24sIG5vZGUuaW50ZXJmYWNlVGFyZ2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlZ2lzdGVyRHluYW1pY0dldChyZWNlaXZlclR5cGUsIHJlbGF0aW9uLCBub2RlLm5hbWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVEaXJlY3RQcm9wZXJ0eUdldChpci5EaXJlY3RQcm9wZXJ0eUdldCBub2RlLAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIGlyLkRhcnRUeXBlIHJlc3VsdFR5cGUpIHsKICAgIHJlZ2lzdGVySW5zdGFuY2VHZXQocmVjZWl2ZXJUeXBlLCBDbGFzc1JlbGF0aW9uLmV4YWN0LCBub2RlLnRhcmdldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVByb3BlcnR5U2V0KAogICAgICBpci5Qcm9wZXJ0eVNldCBub2RlLCBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIGlyLkRhcnRUeXBlIHZhbHVlVHlwZSkgewogICAgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiA9IGNvbXB1dGVDbGFzc1JlbGF0aW9uRnJvbVR5cGUocmVjZWl2ZXJUeXBlKTsKICAgIGlmIChub2RlLmludGVyZmFjZVRhcmdldCAhPSBudWxsKSB7CiAgICAgIHJlZ2lzdGVySW5zdGFuY2VTZXQocmVjZWl2ZXJUeXBlLCByZWxhdGlvbiwgbm9kZS5pbnRlcmZhY2VUYXJnZXQpOwogICAgfSBlbHNlIHsKICAgICAgcmVnaXN0ZXJEeW5hbWljU2V0KHJlY2VpdmVyVHlwZSwgcmVsYXRpb24sIG5vZGUubmFtZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZURpcmVjdFByb3BlcnR5U2V0KGlyLkRpcmVjdFByb3BlcnR5U2V0IG5vZGUsCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgaXIuRGFydFR5cGUgdmFsdWVUeXBlKSB7CiAgICByZWdpc3Rlckluc3RhbmNlU2V0KHJlY2VpdmVyVHlwZSwgQ2xhc3NSZWxhdGlvbi5leGFjdCwgbm9kZS50YXJnZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdXBlck1ldGhvZEludm9jYXRpb24oaXIuU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUsCiAgICAgIEFyZ3VtZW50VHlwZXMgYXJndW1lbnRUeXBlcywgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSkgewogICAgcmVnaXN0ZXJTdXBlckludm9jYXRpb24obm9kZS5uYW1lLCBub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCwKICAgICAgICBfZ2V0TmFtZWRBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpLCBub2RlLmFyZ3VtZW50cy50eXBlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN1cGVyUHJvcGVydHlHZXQoCiAgICAgIGlyLlN1cGVyUHJvcGVydHlHZXQgbm9kZSwgaXIuRGFydFR5cGUgcmVzdWx0VHlwZSkgewogICAgcmVnaXN0ZXJTdXBlckdldChub2RlLm5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdXBlclByb3BlcnR5U2V0KGlyLlN1cGVyUHJvcGVydHlTZXQgbm9kZSwgaXIuRGFydFR5cGUgdmFsdWVUeXBlKSB7CiAgICByZWdpc3RlclN1cGVyU2V0KG5vZGUubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN1cGVySW5pdGlhbGl6ZXIoCiAgICAgIGlyLlN1cGVySW5pdGlhbGl6ZXIgbm9kZSwgQXJndW1lbnRUeXBlcyBhcmd1bWVudFR5cGVzKSB7CiAgICByZWdpc3RlclN1cGVySW5pdGlhbGl6ZXIoCiAgICAgICAgbm9kZS5wYXJlbnQsCiAgICAgICAgbm9kZS50YXJnZXQsCiAgICAgICAgbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGgsCiAgICAgICAgX2dldE5hbWVkQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKSwKICAgICAgICBub2RlLmFyZ3VtZW50cy50eXBlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBOdWxsIHZpc2l0U3dpdGNoU3RhdGVtZW50KGlyLlN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICByZWdpc3RlclN3aXRjaFN0YXRlbWVudE5vZGUobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRTd2l0Y2hTdGF0ZW1lbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVJ1bnRpbWVUeXBlVXNlKGlyLlByb3BlcnR5R2V0IG5vZGUsIFJ1bnRpbWVUeXBlVXNlS2luZCBraW5kLAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIGlyLkRhcnRUeXBlIGFyZ3VtZW50VHlwZSkgewogICAgcmVnaXN0ZXJSdW50aW1lVHlwZVVzZShub2RlLCBraW5kLCByZWNlaXZlclR5cGUsIGFyZ3VtZW50VHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNvbnN0YW50RXhwcmVzc2lvbihpci5Db25zdGFudEV4cHJlc3Npb24gbm9kZSkgewogICAgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0ID0gZ2V0RGVmZXJyZWRJbXBvcnQobm9kZSk7CiAgICBuZXcgQ29uc3RhbnRJbXBhY3RWaXNpdG9yKHRoaXMsIGltcG9ydCwgbm9kZSkudmlzaXRDb25zdGFudChub2RlLmNvbnN0YW50KTsKICB9Cn0KCi8vLyBWaXNpdG9yIHRoYXQgYnVpbGRzIGFuIFtJbXBhY3REYXRhXSBvYmplY3QgZm9yIHRoZSB3b3JsZCBpbXBhY3QuCmNsYXNzIEltcGFjdEJ1aWxkZXIgZXh0ZW5kcyBJbXBhY3RCdWlsZGVyQmFzZSB3aXRoIEltcGFjdFJlZ2lzdHJ5TWl4aW4gewogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgdXNlQXNzZXJ0czsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaW5mZXJFZmZlY3RpdmVseUZpbmFsVmFyaWFibGVUeXBlczsKCiAgSW1wYWN0QnVpbGRlcihpci5UeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LAogICAgICBpci5DbGFzc0hpZXJhcmNoeSBjbGFzc0hpZXJhcmNoeSwgVmFyaWFibGVTY29wZU1vZGVsIHZhcmlhYmxlU2NvcGVNb2RlbCwKICAgICAge3RoaXMudXNlQXNzZXJ0czogZmFsc2UsIHRoaXMuaW5mZXJFZmZlY3RpdmVseUZpbmFsVmFyaWFibGVUeXBlczogdHJ1ZX0pCiAgICAgIDogc3VwZXIodHlwZUVudmlyb25tZW50LCBjbGFzc0hpZXJhcmNoeSwgdmFyaWFibGVTY29wZU1vZGVsKTsKCiAgSW1wYWN0QnVpbGRlckRhdGEgY29tcHV0ZUltcGFjdChpci5NZW1iZXIgbm9kZSkgewogICAgaWYgKHJldGFpbkRhdGFGb3JUZXN0aW5nKSB7CiAgICAgIHR5cGVNYXBzRm9yVGVzdGluZyA9IHt9OwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgICByZXR1cm4gbmV3IEltcGFjdEJ1aWxkZXJEYXRhKAogICAgICAgIGltcGFjdERhdGEsIHR5cGVNYXBzRm9yVGVzdGluZywgZ2V0U3RhdGljVHlwZUNhY2hlKCkpOwogIH0KfQoKLy8vIFJldHVybiB0aGUgbmFtZWQgYXJndW1lbnRzIG5hbWVzIGFzIGEgbGlzdCBvZiBzdHJpbmdzLgpMaXN0PFN0cmluZz4gX2dldE5hbWVkQXJndW1lbnRzKGlyLkFyZ3VtZW50cyBhcmd1bWVudHMpID0+CiAgICBhcmd1bWVudHMubmFtZWQubWFwKChuKSA9PiBuLm5hbWUpLnRvTGlzdCgpOwoKY2xhc3MgSW1wYWN0QnVpbGRlckRhdGEgewogIGZpbmFsIEltcGFjdERhdGEgaW1wYWN0RGF0YTsKICBmaW5hbCBNYXA8aXIuRXhwcmVzc2lvbiwgVHlwZU1hcD4gdHlwZU1hcHNGb3JUZXN0aW5nOwogIGZpbmFsIFN0YXRpY1R5cGVDYWNoZSBjYWNoZWRTdGF0aWNUeXBlczsKCiAgSW1wYWN0QnVpbGRlckRhdGEoCiAgICAgIHRoaXMuaW1wYWN0RGF0YSwgdGhpcy50eXBlTWFwc0ZvclRlc3RpbmcsIHRoaXMuY2FjaGVkU3RhdGljVHlwZXMpOwp9CgpjbGFzcyBDb25zdGFudEltcGFjdFZpc2l0b3IgZXh0ZW5kcyBpci5WaXNpdE9uY2VDb25zdGFudFZpc2l0b3IgewogIGZpbmFsIEltcGFjdFJlZ2lzdHJ5IHJlZ2lzdHJ5OwogIGZpbmFsIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydDsKICBmaW5hbCBpci5Db25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgQ29uc3RhbnRJbXBhY3RWaXNpdG9yKHRoaXMucmVnaXN0cnksIHRoaXMuaW1wb3J0LCB0aGlzLmV4cHJlc3Npb24pOwoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRDb25zdGFudChpci5Db25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiVW5leHBlY3RlZCBjb25zdGFudCAke25vZGV9ICgke25vZGUucnVudGltZVR5cGV9KS4iKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KGlyLlVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgewogICAgLy8gRG8gbm90aGluZy4gVGhpcyBvY2N1cnMgd2hlbiB0aGUgY29uc3RhbnQgY291bGRuJ3QgYmUgZXZhbHVhdGVkIGJlY2F1c2UKICAgIC8vIG9mIGEgY29tcGlsZS10aW1lIGVycm9yLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVMaXRlcmFsQ29uc3RhbnQoaXIuVHlwZUxpdGVyYWxDb25zdGFudCBub2RlKSB7CiAgICByZWdpc3RyeS5yZWdpc3RlclR5cGVMaXRlcmFsKG5vZGUudHlwZSwgaW1wb3J0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUZWFyT2ZmQ29uc3RhbnQoaXIuVGVhck9mZkNvbnN0YW50IG5vZGUpIHsKICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVGVhck9mZihub2RlLnByb2NlZHVyZSwgaW1wb3J0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KGlyLlBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQgbm9kZSkgewogICAgcmVnaXN0cnkucmVnaXN0ZXJHZW5lcmljSW5zdGFudGlhdGlvbigKICAgICAgICBub2RlLnRlYXJPZmZDb25zdGFudC5wcm9jZWR1cmUuZnVuY3Rpb24uZnVuY3Rpb25UeXBlLCBub2RlLnR5cGVzKTsKICAgIHZpc2l0Q29uc3RhbnQobm9kZS50ZWFyT2ZmQ29uc3RhbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEluc3RhbmNlQ29uc3RhbnQoaXIuSW5zdGFuY2VDb25zdGFudCBub2RlKSB7CiAgICByZWdpc3RyeS5yZWdpc3RlckNvbnN0SW5zdGFudGlhdGlvbigKICAgICAgICBub2RlLmNsYXNzTm9kZSwgbm9kZS50eXBlQXJndW1lbnRzLCBpbXBvcnQpOwogICAgbm9kZS5maWVsZFZhbHVlcy5mb3JFYWNoKChpci5SZWZlcmVuY2UgcmVmZXJlbmNlLCBpci5Db25zdGFudCB2YWx1ZSkgewogICAgICBpci5GaWVsZCBmaWVsZCA9IHJlZmVyZW5jZS5hc0ZpZWxkOwogICAgICByZWdpc3RyeS5yZWdpc3RlckZpZWxkQ29uc3RhbnRJbml0aWFsaXphdGlvbigKICAgICAgICAgIGZpZWxkLCBuZXcgQ29uc3RhbnRSZWZlcmVuY2UoZXhwcmVzc2lvbiwgdmFsdWUpKTsKICAgICAgdmlzaXRDb25zdGFudCh2YWx1ZSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTZXRDb25zdGFudChpci5TZXRDb25zdGFudCBub2RlKSB7CiAgICByZWdpc3RyeS5yZWdpc3RlclNldExpdGVyYWwobm9kZS50eXBlQXJndW1lbnQsCiAgICAgICAgaXNDb25zdDogdHJ1ZSwgaXNFbXB0eTogbm9kZS5lbnRyaWVzLmlzRW1wdHkpOwogICAgZm9yIChpci5Db25zdGFudCBlbGVtZW50IGluIG5vZGUuZW50cmllcykgewogICAgICB2aXNpdENvbnN0YW50KGVsZW1lbnQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpc3RDb25zdGFudChpci5MaXN0Q29uc3RhbnQgbm9kZSkgewogICAgcmVnaXN0cnkucmVnaXN0ZXJMaXN0TGl0ZXJhbChub2RlLnR5cGVBcmd1bWVudCwKICAgICAgICBpc0NvbnN0OiB0cnVlLCBpc0VtcHR5OiBub2RlLmVudHJpZXMuaXNFbXB0eSk7CiAgICBmb3IgKGlyLkNvbnN0YW50IGVsZW1lbnQgaW4gbm9kZS5lbnRyaWVzKSB7CiAgICAgIHZpc2l0Q29uc3RhbnQoZWxlbWVudCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TWFwQ29uc3RhbnQoaXIuTWFwQ29uc3RhbnQgbm9kZSkgewogICAgcmVnaXN0cnkucmVnaXN0ZXJNYXBMaXRlcmFsKG5vZGUua2V5VHlwZSwgbm9kZS52YWx1ZVR5cGUsCiAgICAgICAgaXNDb25zdDogdHJ1ZSwgaXNFbXB0eTogbm9kZS5lbnRyaWVzLmlzRW1wdHkpOwogICAgZm9yIChpci5Db25zdGFudE1hcEVudHJ5IGVudHJ5IGluIG5vZGUuZW50cmllcykgewogICAgICB2aXNpdENvbnN0YW50KGVudHJ5LmtleSk7CiAgICAgIHZpc2l0Q29uc3RhbnQoZW50cnkudmFsdWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN5bWJvbENvbnN0YW50KGlyLlN5bWJvbENvbnN0YW50IG5vZGUpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEhhbmRsZSB0aGUgbGlicmFyeSByZWZlcmVuY2UuCiAgICByZWdpc3RyeS5yZWdpc3RlclN5bWJvbExpdGVyYWwobm9kZS5uYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdDb25zdGFudChpci5TdHJpbmdDb25zdGFudCBub2RlKSB7CiAgICByZWdpc3RyeS5yZWdpc3RlclN0cmluZ0xpdGVyYWwobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RG91YmxlQ29uc3RhbnQoaXIuRG91YmxlQ29uc3RhbnQgbm9kZSkgewogICAgcmVnaXN0cnkucmVnaXN0ZXJEb3VibGVMaXRlcmFsKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludENvbnN0YW50KGlyLkludENvbnN0YW50IG5vZGUpIHsKICAgIHJlZ2lzdHJ5LnJlZ2lzdGVySW50TGl0ZXJhbChub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb29sQ29uc3RhbnQoaXIuQm9vbENvbnN0YW50IG5vZGUpIHsKICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQm9vbExpdGVyYWwobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TnVsbENvbnN0YW50KGlyLk51bGxDb25zdGFudCBub2RlKSB7CiAgICByZWdpc3RyeS5yZWdpc3Rlck51bGxMaXRlcmFsKCk7CiAgfQp9CoMlAE5OPAE5HQEoNDUBGRkbJRUbIRQBMARGTBggJgEsASgBLAEsAR4BNCUBMyUBRiUBHjwBSQFJASsBJUgBMgEvATMBJgEwASoBKgEvASkBGAFNLAFOLAEYAR0BLAFLATMBLDIBHgEnIh8jKAExARwBFB0dHyMnIxcBUSQBIRsfIyckASgsHyMoASIgHhQfIygBIyAeGB8jKAEjIB8jKAEbRwEcSwEbRwEcSwFGRQEnAScBIR0dHyMoAUw7AUQ1KTE/PU4CATsgDC8BOEEwAQwuJAQBDDQnBAEMMCUEAQw0JwQBDDQnBAEMMBsEAQwwK0MEAQwuKkMEAQwuNT8EAQxEJEw+DToGBAEMQz0EAQw4NwQBDDJARgQBNTcyARsgDyQ6LlE6DAonDwEhOi5ROi03OgwKJA8BJTouTzoMCigPASgsOAYEAQxAIwQBDEAhJgQBDD4hJgQBDEAkKQYEAQwyIAQBDEs/Hg4GHCcNIQYEAQwkFQQBDE4iGDU3DTQ3BgQBDCQVIxwGKSUGBAEMMD0EAQw6LQQBDDAbBAEMJUUkFSosHwQBDDssBAEMLz4vBgQBDDAjBAEMJSglJRwyHQgNHQYeBAEMMSsmBAEMQj0RFR4qLB4hIBg0BgQBDDg9PkY8OE40CRgJIjErDgkqCRU1PA4JTU5MSykTF0sdGiAjIg1PMwYoBAEMHyAgIyA+RjwsJiU+QD0NSwE4JUU/Skg6LkhQLgoPKy9DTkFBQRFOQQoIBgQBDCUmICMgIBYdFSosHwQBDBpPSShJDT0GBAEMOjpJBAEMGk5JKEkNPQYEAQw6OUkEAQxCPUlDBAEMHzohBAEMUSEEAQwfPx4VFSosHwQBDDcnLQQBDEo8RAQBDD47UAQCAUVJDBkBDCwBNE9PRAE0IB8GFyI/BAIBOzsxARofOCsBFUkCAUIhJSoBRgEMKyA/BAEMP08gBAEMPzUEAQw3PAQBDFErSykEAQw5KTVLKjQ8HAgEAQwvMzcwHgYEAQwxNDcwHgYEAQwvPjc2ICIGBAEMNTovBAEMNTAEAQw1MAQBDC8tBAEMMS4EAQwxJAQCASNwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9pbXBhY3QuZGFydDFzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pci9pbXBhY3RfZGF0YS5kYXJ0wADMuS8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvZW51bXNldC5kYXJ0JzsKaW1wb3J0ICdjb25zdGFudHMuZGFydCc7CmltcG9ydCAnaW1wYWN0LmRhcnQnOwppbXBvcnQgJ3J1bnRpbWVfdHlwZV9hbmFseXNpcy5kYXJ0JzsKaW1wb3J0ICdzdGF0aWNfdHlwZS5kYXJ0JzsKCi8vLyBbSW1wYWN0UmVnaXN0cnldIHRoYXQgc3RvcmVzIHJlZ2lzdGVyZWQgaW1wYWN0IGluIGFuIFtJbXBhY3REYXRhXSBvYmplY3QuCmFic3RyYWN0IGNsYXNzIEltcGFjdFJlZ2lzdHJ5TWl4aW4gaW1wbGVtZW50cyBJbXBhY3RSZWdpc3RyeSB7CiAgZmluYWwgSW1wYWN0RGF0YUltcGwgX2RhdGEgPSBuZXcgSW1wYWN0RGF0YUltcGwoKTsKCiAgSW1wYWN0RGF0YSBnZXQgaW1wYWN0RGF0YSA9PiBfZGF0YTsKCiAgdm9pZCBfcmVnaXN0ZXJGZWF0dXJlKF9GZWF0dXJlIGZlYXR1cmUpIHsKICAgIF9kYXRhLl9mZWF0dXJlcyA/Pz0gbmV3IEVudW1TZXQ8X0ZlYXR1cmU+KCk7CiAgICBfZGF0YS5fZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwogIH0KCiAgdm9pZCBfcmVnaXN0ZXJUeXBlVXNlKGlyLkRhcnRUeXBlIHR5cGUsIF9UeXBlVXNlS2luZCBraW5kKSB7CiAgICBfZGF0YS5fdHlwZVVzZXMgPz89IFtdOwogICAgX2RhdGEuX3R5cGVVc2VzLmFkZChuZXcgX1R5cGVVc2UodHlwZSwga2luZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN1cGVySW5pdGlhbGl6ZXIoCiAgICAgIGlyLkNvbnN0cnVjdG9yIHNvdXJjZSwKICAgICAgaXIuQ29uc3RydWN0b3IgdGFyZ2V0LAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBfZGF0YS5fc3VwZXJJbml0aWFsaXplcnMgPz89IFtdOwogICAgX2RhdGEuX3N1cGVySW5pdGlhbGl6ZXJzLmFkZChuZXcgX1N1cGVySW5pdGlhbGl6ZXIoCiAgICAgICAgc291cmNlLAogICAgICAgIHRhcmdldCwKICAgICAgICBuZXcgX0NhbGxTdHJ1Y3R1cmUoCiAgICAgICAgICAgIHBvc2l0aW9uYWxBcmd1bWVudHMsIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN1cGVyU2V0KGlyLk5hbWUgbmFtZSkgewogICAgX2RhdGEuX3N1cGVyU2V0cyA/Pz0gW107CiAgICBfZGF0YS5fc3VwZXJTZXRzLmFkZChuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdXBlckdldChpci5OYW1lIG5hbWUpIHsKICAgIF9kYXRhLl9zdXBlckdldHMgPz89IFtdOwogICAgX2RhdGEuX3N1cGVyR2V0cy5hZGQobmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3VwZXJJbnZvY2F0aW9uKGlyLk5hbWUgbmFtZSwgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgX2RhdGEuX3N1cGVySW52b2NhdGlvbnMgPz89IFtdOwogICAgX2RhdGEuX3N1cGVySW52b2NhdGlvbnMuYWRkKG5ldyBfU3VwZXJJbnZvY2F0aW9uKAogICAgICAgIG5hbWUsCiAgICAgICAgbmV3IF9DYWxsU3RydWN0dXJlKAogICAgICAgICAgICBwb3NpdGlvbmFsQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cykpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJJbnN0YW5jZVNldCgKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uLCBpci5NZW1iZXIgdGFyZ2V0KSB7CiAgICBfZGF0YS5faW5zdGFuY2VTZXRzID8/PSBbXTsKICAgIF9kYXRhLl9pbnN0YW5jZVNldHMKICAgICAgICAuYWRkKG5ldyBfSW5zdGFuY2VBY2Nlc3MocmVjZWl2ZXJUeXBlLCByZWxhdGlvbiwgdGFyZ2V0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyRHluYW1pY1NldCgKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uLCBpci5OYW1lIG5hbWUpIHsKICAgIF9kYXRhLl9keW5hbWljU2V0cyA/Pz0gW107CiAgICBfZGF0YS5fZHluYW1pY1NldHMuYWRkKG5ldyBfRHluYW1pY0FjY2VzcyhyZWNlaXZlclR5cGUsIHJlbGF0aW9uLCBuYW1lKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVySW5zdGFuY2VHZXQoCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwgaXIuTWVtYmVyIHRhcmdldCkgewogICAgX2RhdGEuX2luc3RhbmNlR2V0cyA/Pz0gW107CiAgICBfZGF0YS5faW5zdGFuY2VHZXRzCiAgICAgICAgLmFkZChuZXcgX0luc3RhbmNlQWNjZXNzKHJlY2VpdmVyVHlwZSwgcmVsYXRpb24sIHRhcmdldCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckR5bmFtaWNHZXQoCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwgaXIuTmFtZSBuYW1lKSB7CiAgICBfZGF0YS5fZHluYW1pY0dldHMgPz89IFtdOwogICAgX2RhdGEuX2R5bmFtaWNHZXRzLmFkZChuZXcgX0R5bmFtaWNBY2Nlc3MocmVjZWl2ZXJUeXBlLCByZWxhdGlvbiwgbmFtZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckZ1bmN0aW9uSW52b2NhdGlvbigKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBfZGF0YS5fZnVuY3Rpb25JbnZvY2F0aW9ucyA/Pz0gW107CiAgICBfZGF0YS5fZnVuY3Rpb25JbnZvY2F0aW9ucy5hZGQobmV3IF9GdW5jdGlvbkludm9jYXRpb24oCiAgICAgICAgcmVjZWl2ZXJUeXBlLAogICAgICAgIG5ldyBfQ2FsbFN0cnVjdHVyZSgKICAgICAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50cywgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVySW5zdGFuY2VJbnZvY2F0aW9uKAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIENsYXNzUmVsYXRpb24gcmVsYXRpb24sCiAgICAgIGlyLk1lbWJlciB0YXJnZXQsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIF9kYXRhLl9pbnN0YW5jZUludm9jYXRpb25zID8/PSBbXTsKICAgIF9kYXRhLl9pbnN0YW5jZUludm9jYXRpb25zLmFkZChuZXcgX0luc3RhbmNlSW52b2NhdGlvbigKICAgICAgICByZWNlaXZlclR5cGUsCiAgICAgICAgcmVsYXRpb24sCiAgICAgICAgdGFyZ2V0LAogICAgICAgIG5ldyBfQ2FsbFN0cnVjdHVyZSgKICAgICAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50cywgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyRHluYW1pY0ludm9jYXRpb24oCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwKICAgICAgaXIuTmFtZSBuYW1lLAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBfZGF0YS5fZHluYW1pY0ludm9jYXRpb25zID8/PSBbXTsKICAgIF9kYXRhLl9keW5hbWljSW52b2NhdGlvbnMuYWRkKG5ldyBfRHluYW1pY0ludm9jYXRpb24oCiAgICAgICAgcmVjZWl2ZXJUeXBlLAogICAgICAgIHJlbGF0aW9uLAogICAgICAgIG5hbWUsCiAgICAgICAgbmV3IF9DYWxsU3RydWN0dXJlKAogICAgICAgICAgICBwb3NpdGlvbmFsQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cykpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJMb2NhbEZ1bmN0aW9uSW52b2NhdGlvbigKICAgICAgaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiBsb2NhbEZ1bmN0aW9uLAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBfZGF0YS5fbG9jYWxGdW5jdGlvbkludm9jYXRpb25zID8/PSBbXTsKICAgIF9kYXRhLl9sb2NhbEZ1bmN0aW9uSW52b2NhdGlvbnMuYWRkKG5ldyBfTG9jYWxGdW5jdGlvbkludm9jYXRpb24oCiAgICAgICAgbG9jYWxGdW5jdGlvbiwKICAgICAgICBuZXcgX0NhbGxTdHJ1Y3R1cmUoCiAgICAgICAgICAgIHBvc2l0aW9uYWxBcmd1bWVudHMsIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN0YXRpY0ludm9jYXRpb24oCiAgICAgIGlyLlByb2NlZHVyZSB0YXJnZXQsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCkgewogICAgX2RhdGEuX3N0YXRpY0ludm9jYXRpb25zID8/PSBbXTsKICAgIF9kYXRhLl9zdGF0aWNJbnZvY2F0aW9ucy5hZGQobmV3IF9TdGF0aWNJbnZvY2F0aW9uKAogICAgICAgIHRhcmdldCwKICAgICAgICBuZXcgX0NhbGxTdHJ1Y3R1cmUocG9zaXRpb25hbEFyZ3VtZW50cywgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMpLAogICAgICAgIGltcG9ydCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck5ldygKICAgICAgaXIuTWVtYmVyIGNvbnN0cnVjdG9yLAogICAgICBpci5JbnRlcmZhY2VUeXBlIHR5cGUsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCwKICAgICAge2Jvb2wgaXNDb25zdH0pIHsKICAgIF9kYXRhLl9jb25zdHJ1Y3Rvckludm9jYXRpb25zID8/PSBbXTsKICAgIF9kYXRhLl9jb25zdHJ1Y3Rvckludm9jYXRpb25zLmFkZChuZXcgX0NvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICBjb25zdHJ1Y3RvciwKICAgICAgICB0eXBlLAogICAgICAgIG5ldyBfQ2FsbFN0cnVjdHVyZShwb3NpdGlvbmFsQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cyksCiAgICAgICAgaW1wb3J0LAogICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDb25zdEluc3RhbnRpYXRpb24oaXIuQ2xhc3MgY2xzLCBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQpIHsKICAgIF9kYXRhLl9jb25zdEluc3RhbnRpYXRpb25zID8/PSBbXTsKICAgIF9kYXRhLl9jb25zdEluc3RhbnRpYXRpb25zCiAgICAgICAgLmFkZChuZXcgX0NvbnN0SW5zdGFudGlhdGlvbihjbHMsIHR5cGVBcmd1bWVudHMsIGltcG9ydCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckxhenlGaWVsZCgpIHsKICAgIF9yZWdpc3RlckZlYXR1cmUoX0ZlYXR1cmUubGF6eUZpZWxkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJQYXJhbWV0ZXJDaGVjayhpci5EYXJ0VHlwZSB0eXBlKSB7CiAgICBfcmVnaXN0ZXJUeXBlVXNlKHR5cGUsIF9UeXBlVXNlS2luZC5wYXJhbWV0ZXJDaGVjayk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUmVkaXJlY3RpbmdJbml0aWFsaXplcigKICAgICAgaXIuQ29uc3RydWN0b3IgY29uc3RydWN0b3IsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIF9kYXRhLl9yZWRpcmVjdGluZ0luaXRpYWxpemVycyA/Pz0gW107CiAgICBfZGF0YS5fcmVkaXJlY3RpbmdJbml0aWFsaXplcnMuYWRkKG5ldyBfUmVkaXJlY3RpbmdJbml0aWFsaXplcigKICAgICAgICBjb25zdHJ1Y3RvciwKICAgICAgICBuZXcgX0NhbGxTdHJ1Y3R1cmUoCiAgICAgICAgICAgIHBvc2l0aW9uYWxBcmd1bWVudHMsIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckxvYWRMaWJyYXJ5KCkgewogICAgX3JlZ2lzdGVyRmVhdHVyZShfRmVhdHVyZS5sb2FkTGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyRmllbGRJbml0aWFsaXphdGlvbihpci5GaWVsZCBub2RlKSB7CiAgICBfZGF0YS5fZmllbGRJbml0aWFsaXplcnMgPz89IFtdOwogICAgX2RhdGEuX2ZpZWxkSW5pdGlhbGl6ZXJzLmFkZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJGaWVsZENvbnN0YW50SW5pdGlhbGl6YXRpb24oCiAgICAgIGlyLkZpZWxkIG5vZGUsIENvbnN0YW50UmVmZXJlbmNlIGNvbnN0YW50KSB7CiAgICBfZGF0YS5fZmllbGRDb25zdGFudEluaXRpYWxpemVycyA/Pz0ge307CiAgICBfZGF0YS5fZmllbGRDb25zdGFudEluaXRpYWxpemVycy5wdXRJZkFic2VudChub2RlLCAoKSA9PiBbXSkuYWRkKGNvbnN0YW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJUeXBlTGl0ZXJhbChpci5EYXJ0VHlwZSB0eXBlLCBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQpIHsKICAgIF9kYXRhLl90eXBlTGl0ZXJhbHMgPz89IFtdOwogICAgX2RhdGEuX3R5cGVMaXRlcmFscy5hZGQobmV3IF9UeXBlTGl0ZXJhbCh0eXBlLCBpbXBvcnQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDYXRjaFR5cGUoaXIuRGFydFR5cGUgdHlwZSkgewogICAgX3JlZ2lzdGVyVHlwZVVzZSh0eXBlLCBfVHlwZVVzZUtpbmQuY2F0Y2hUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdGFja1RyYWNlKCkgewogICAgX3JlZ2lzdGVyRmVhdHVyZShfRmVhdHVyZS5zdGFja1RyYWNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDYXRjaCgpIHsKICAgIF9yZWdpc3RlckZlYXR1cmUoX0ZlYXR1cmUuY2F0Y2hDbGF1c2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckFzeW5jRm9ySW4oaXIuRGFydFR5cGUgaXRlcmFibGVUeXBlLCBpci5EYXJ0VHlwZSBpdGVyYXRvclR5cGUsCiAgICAgIENsYXNzUmVsYXRpb24gaXRlcmF0b3JDbGFzc1JlbGF0aW9uKSB7CiAgICBfZGF0YS5fZm9ySW5EYXRhID8/PSBbXTsKICAgIF9kYXRhLl9mb3JJbkRhdGEuYWRkKG5ldyBfRm9ySW5EYXRhKAogICAgICAgIGl0ZXJhYmxlVHlwZSwgaXRlcmF0b3JUeXBlLCBpdGVyYXRvckNsYXNzUmVsYXRpb24sCiAgICAgICAgaXNBc3luYzogdHJ1ZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN5bmNGb3JJbihpci5EYXJ0VHlwZSBpdGVyYWJsZVR5cGUsIGlyLkRhcnRUeXBlIGl0ZXJhdG9yVHlwZSwKICAgICAgQ2xhc3NSZWxhdGlvbiBpdGVyYXRvckNsYXNzUmVsYXRpb24pIHsKICAgIF9kYXRhLl9mb3JJbkRhdGEgPz89IFtdOwogICAgX2RhdGEuX2ZvckluRGF0YS5hZGQobmV3IF9Gb3JJbkRhdGEoCiAgICAgICAgaXRlcmFibGVUeXBlLCBpdGVyYXRvclR5cGUsIGl0ZXJhdG9yQ2xhc3NSZWxhdGlvbiwKICAgICAgICBpc0FzeW5jOiBmYWxzZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclRocm93KCkgewogICAgX3JlZ2lzdGVyRmVhdHVyZShfRmVhdHVyZS50aHJvd0V4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckFzQ2FzdChpci5EYXJ0VHlwZSB0eXBlKSB7CiAgICBfcmVnaXN0ZXJUeXBlVXNlKHR5cGUsIF9UeXBlVXNlS2luZC5hc0Nhc3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckltcGxpY2l0Q2FzdChpci5EYXJ0VHlwZSB0eXBlKSB7CiAgICBfcmVnaXN0ZXJUeXBlVXNlKHR5cGUsIF9UeXBlVXNlS2luZC5pbXBsaWNpdENhc3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlcklzQ2hlY2soaXIuRGFydFR5cGUgdHlwZSkgewogICAgX3JlZ2lzdGVyVHlwZVVzZSh0eXBlLCBfVHlwZVVzZUtpbmQuaXNDaGVjayk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTG9jYWxXaXRob3V0SW5pdGlhbGl6ZXIoKSB7CiAgICBfcmVnaXN0ZXJGZWF0dXJlKF9GZWF0dXJlLmxvY2FsV2l0aG91dEluaXRpYWxpemVyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJMb2NhbEZ1bmN0aW9uKGlyLlRyZWVOb2RlIG5vZGUpIHsKICAgIF9kYXRhLl9sb2NhbEZ1bmN0aW9ucyA/Pz0gW107CiAgICBfZGF0YS5fbG9jYWxGdW5jdGlvbnMuYWRkKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN0cmluZ0NvbmNhdGVuYXRpb24oKSB7CiAgICBfcmVnaXN0ZXJGZWF0dXJlKF9GZWF0dXJlLnN0cmluZ0NvbmNhdGVuYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckFzeW5jU3Rhcihpci5EYXJ0VHlwZSBlbGVtZW50VHlwZSkgewogICAgX3JlZ2lzdGVyVHlwZVVzZShlbGVtZW50VHlwZSwgX1R5cGVVc2VLaW5kLmFzeW5jU3Rhck1hcmtlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQXN5bmMoaXIuRGFydFR5cGUgZWxlbWVudFR5cGUpIHsKICAgIF9yZWdpc3RlclR5cGVVc2UoZWxlbWVudFR5cGUsIF9UeXBlVXNlS2luZC5hc3luY01hcmtlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3luY1N0YXIoaXIuRGFydFR5cGUgZWxlbWVudFR5cGUpIHsKICAgIF9yZWdpc3RlclR5cGVVc2UoZWxlbWVudFR5cGUsIF9UeXBlVXNlS2luZC5zeW5jU3Rhck1hcmtlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyR2VuZXJpY0luc3RhbnRpYXRpb24oCiAgICAgIGlyLkZ1bmN0aW9uVHlwZSBleHByZXNzaW9uVHlwZSwgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgX2RhdGEuX2dlbmVyaWNJbnN0YW50aWF0aW9ucyA/Pz0gW107CiAgICBfZGF0YS5fZ2VuZXJpY0luc3RhbnRpYXRpb25zCiAgICAgICAgLmFkZChuZXcgX0dlbmVyaWNJbnN0YW50aWF0aW9uKGV4cHJlc3Npb25UeXBlLCB0eXBlQXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQXNzZXJ0KHtib29sIHdpdGhNZXNzYWdlfSkgewogICAgX3JlZ2lzdGVyRmVhdHVyZSh3aXRoTWVzc2FnZQogICAgICAgID8gX0ZlYXR1cmUuYXNzZXJ0V2l0aE1lc3NhZ2UKICAgICAgICA6IF9GZWF0dXJlLmFzc2VydFdpdGhvdXRNZXNzYWdlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdGF0aWNTZXQoaXIuTWVtYmVyIG1lbWJlciwgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0KSB7CiAgICBfZGF0YS5fc3RhdGljU2V0cyA/Pz0gW107CiAgICBfZGF0YS5fc3RhdGljU2V0cy5hZGQobmV3IF9TdGF0aWNBY2Nlc3MobWVtYmVyLCBpbXBvcnQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdGF0aWNHZXQoaXIuTWVtYmVyIG1lbWJlciwgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0KSB7CiAgICBfZGF0YS5fc3RhdGljR2V0cyA/Pz0gW107CiAgICBfZGF0YS5fc3RhdGljR2V0cy5hZGQobmV3IF9TdGF0aWNBY2Nlc3MobWVtYmVyLCBpbXBvcnQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdGF0aWNUZWFyT2ZmKAogICAgICBpci5Qcm9jZWR1cmUgcHJvY2VkdXJlLCBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQpIHsKICAgIF9kYXRhLl9zdGF0aWNUZWFyT2ZmcyA/Pz0gW107CiAgICBfZGF0YS5fc3RhdGljVGVhck9mZnMuYWRkKG5ldyBfU3RhdGljQWNjZXNzKHByb2NlZHVyZSwgaW1wb3J0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTWFwTGl0ZXJhbChpci5EYXJ0VHlwZSBrZXlUeXBlLCBpci5EYXJ0VHlwZSB2YWx1ZVR5cGUsCiAgICAgIHtib29sIGlzQ29uc3QsIGJvb2wgaXNFbXB0eX0pIHsKICAgIF9kYXRhLl9tYXBMaXRlcmFscyA/Pz0gW107CiAgICBfZGF0YS5fbWFwTGl0ZXJhbHMuYWRkKG5ldyBfTWFwTGl0ZXJhbChrZXlUeXBlLCB2YWx1ZVR5cGUsCiAgICAgICAgaXNDb25zdDogaXNDb25zdCwgaXNFbXB0eTogaXNFbXB0eSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlckxpc3RMaXRlcmFsKGlyLkRhcnRUeXBlIGVsZW1lbnRUeXBlLAogICAgICB7Ym9vbCBpc0NvbnN0LCBib29sIGlzRW1wdHl9KSB7CiAgICBfZGF0YS5fbGlzdExpdGVyYWxzID8/PSBbXTsKICAgIF9kYXRhLl9saXN0TGl0ZXJhbHMuYWRkKAogICAgICAgIG5ldyBfQ29udGFpbmVyTGl0ZXJhbChlbGVtZW50VHlwZSwgaXNDb25zdDogaXNDb25zdCwgaXNFbXB0eTogaXNFbXB0eSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclNldExpdGVyYWwoaXIuRGFydFR5cGUgZWxlbWVudFR5cGUsCiAgICAgIHtib29sIGlzQ29uc3QsIGJvb2wgaXNFbXB0eX0pIHsKICAgIF9kYXRhLl9zZXRMaXRlcmFscyA/Pz0gW107CiAgICBfZGF0YS5fc2V0TGl0ZXJhbHMuYWRkKAogICAgICAgIG5ldyBfQ29udGFpbmVyTGl0ZXJhbChlbGVtZW50VHlwZSwgaXNDb25zdDogaXNDb25zdCwgaXNFbXB0eTogaXNFbXB0eSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck51bGxMaXRlcmFsKCkgewogICAgX3JlZ2lzdGVyRmVhdHVyZShfRmVhdHVyZS5udWxsTGl0ZXJhbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3ltYm9sTGl0ZXJhbChTdHJpbmcgdmFsdWUpIHsKICAgIF9kYXRhLl9zeW1ib2xMaXRlcmFscyA/Pz0gW107CiAgICBfZGF0YS5fc3ltYm9sTGl0ZXJhbHMuYWRkKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdHJpbmdMaXRlcmFsKFN0cmluZyB2YWx1ZSkgewogICAgX2RhdGEuX3N0cmluZ0xpdGVyYWxzID8/PSBbXTsKICAgIF9kYXRhLl9zdHJpbmdMaXRlcmFscy5hZGQodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckJvb2xMaXRlcmFsKGJvb2wgdmFsdWUpIHsKICAgIF9kYXRhLl9ib29sTGl0ZXJhbHMgPz89IFtdOwogICAgX2RhdGEuX2Jvb2xMaXRlcmFscy5hZGQodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckRvdWJsZUxpdGVyYWwoZG91YmxlIHZhbHVlKSB7CiAgICBfZGF0YS5fZG91YmxlTGl0ZXJhbHMgPz89IFtdOwogICAgX2RhdGEuX2RvdWJsZUxpdGVyYWxzLmFkZCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVySW50TGl0ZXJhbChpbnQgdmFsdWUpIHsKICAgIF9kYXRhLl9pbnRMaXRlcmFscyA/Pz0gW107CiAgICBfZGF0YS5faW50TGl0ZXJhbHMuYWRkKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJSdW50aW1lVHlwZVVzZShpci5Qcm9wZXJ0eUdldCBub2RlLCBSdW50aW1lVHlwZVVzZUtpbmQga2luZCwKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBpci5EYXJ0VHlwZSBhcmd1bWVudFR5cGUpIHsKICAgIF9kYXRhLl9ydW50aW1lVHlwZVVzZXMgPz89IFtdOwogICAgX2RhdGEuX3J1bnRpbWVUeXBlVXNlcwogICAgICAgIC5hZGQobmV3IF9SdW50aW1lVHlwZVVzZShub2RlLCBraW5kLCByZWNlaXZlclR5cGUsIGFyZ3VtZW50VHlwZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckNvbnN0cnVjdG9yTm9kZShpci5Db25zdHJ1Y3RvciBub2RlKSB7CiAgICBfZGF0YS5fY29uc3RydWN0b3JOb2RlcyA/Pz0gW107CiAgICBfZGF0YS5fY29uc3RydWN0b3JOb2Rlcy5hZGQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyRmllbGROb2RlKGlyLkZpZWxkIG5vZGUpIHsKICAgIF9kYXRhLl9maWVsZE5vZGVzID8/PSBbXTsKICAgIF9kYXRhLl9maWVsZE5vZGVzLmFkZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJQcm9jZWR1cmVOb2RlKGlyLlByb2NlZHVyZSBub2RlKSB7CiAgICBfZGF0YS5fcHJvY2VkdXJlTm9kZXMgPz89IFtdOwogICAgX2RhdGEuX3Byb2NlZHVyZU5vZGVzLmFkZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdGF0aWNJbnZvY2F0aW9uTm9kZShpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIF9kYXRhLl9zdGF0aWNJbnZvY2F0aW9uTm9kZXMgPz89IFtdOwogICAgX2RhdGEuX3N0YXRpY0ludm9jYXRpb25Ob2Rlcy5hZGQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3dpdGNoU3RhdGVtZW50Tm9kZShpci5Td2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgX2RhdGEuX3N3aXRjaFN0YXRlbWVudE5vZGVzID8/PSBbXTsKICAgIF9kYXRhLl9zd2l0Y2hTdGF0ZW1lbnROb2Rlcy5hZGQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQ29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb25Ob2RlKGlyLkNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICBfZGF0YS5fY29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb25Ob2RlcyA/Pz0gW107CiAgICBfZGF0YS5fY29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb25Ob2Rlcy5hZGQobm9kZSk7CiAgfQp9CgovLy8gRGF0YSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgd29ybGQgaW1wYWN0IGRhdGEgZGVyaXZlZCBwdXJlbHkgZnJvbSBrZXJuZWwuCmFic3RyYWN0IGNsYXNzIEltcGFjdERhdGEgewogIGZhY3RvcnkgSW1wYWN0RGF0YS5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgPQogICAgICBJbXBhY3REYXRhSW1wbC5mcm9tRGF0YVNvdXJjZTsKCiAgdm9pZCB0b0RhdGFTaW5rKERhdGFTaW5rIHNpbmspOwoKICAvLy8gUmVnaXN0ZXJzIHRoZSBpbXBhY3QgZGF0YSB3aXRoIFtyZWdpc3RyeV0uCiAgdm9pZCBhcHBseShJbXBhY3RSZWdpc3RyeSByZWdpc3RyeSk7Cn0KCmNsYXNzIEltcGFjdERhdGFJbXBsIGltcGxlbWVudHMgSW1wYWN0RGF0YSB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnSW1wYWN0RGF0YSc7CgogIExpc3Q8X1N1cGVySW5pdGlhbGl6ZXI+IF9zdXBlckluaXRpYWxpemVyczsKICBMaXN0PGlyLk5hbWU+IF9zdXBlclNldHM7CiAgTGlzdDxpci5OYW1lPiBfc3VwZXJHZXRzOwogIExpc3Q8X1N1cGVySW52b2NhdGlvbj4gX3N1cGVySW52b2NhdGlvbnM7CiAgTGlzdDxfSW5zdGFuY2VBY2Nlc3M+IF9pbnN0YW5jZVNldHM7CiAgTGlzdDxfRHluYW1pY0FjY2Vzcz4gX2R5bmFtaWNTZXRzOwogIExpc3Q8X0luc3RhbmNlQWNjZXNzPiBfaW5zdGFuY2VHZXRzOwogIExpc3Q8X0R5bmFtaWNBY2Nlc3M+IF9keW5hbWljR2V0czsKICBMaXN0PF9GdW5jdGlvbkludm9jYXRpb24+IF9mdW5jdGlvbkludm9jYXRpb25zOwogIExpc3Q8X0luc3RhbmNlSW52b2NhdGlvbj4gX2luc3RhbmNlSW52b2NhdGlvbnM7CiAgTGlzdDxfRHluYW1pY0ludm9jYXRpb24+IF9keW5hbWljSW52b2NhdGlvbnM7CiAgTGlzdDxfTG9jYWxGdW5jdGlvbkludm9jYXRpb24+IF9sb2NhbEZ1bmN0aW9uSW52b2NhdGlvbnM7CiAgTGlzdDxfU3RhdGljSW52b2NhdGlvbj4gX3N0YXRpY0ludm9jYXRpb25zOwogIExpc3Q8X0NvbnN0cnVjdG9ySW52b2NhdGlvbj4gX2NvbnN0cnVjdG9ySW52b2NhdGlvbnM7CiAgTGlzdDxfQ29uc3RJbnN0YW50aWF0aW9uPiBfY29uc3RJbnN0YW50aWF0aW9uczsKICBFbnVtU2V0PF9GZWF0dXJlPiBfZmVhdHVyZXM7CiAgTGlzdDxfVHlwZVVzZT4gX3R5cGVVc2VzOwogIExpc3Q8X1JlZGlyZWN0aW5nSW5pdGlhbGl6ZXI+IF9yZWRpcmVjdGluZ0luaXRpYWxpemVyczsKICBMaXN0PGlyLkZpZWxkPiBfZmllbGRJbml0aWFsaXplcnM7CiAgTWFwPGlyLkZpZWxkLCBMaXN0PENvbnN0YW50UmVmZXJlbmNlPj4gX2ZpZWxkQ29uc3RhbnRJbml0aWFsaXplcnM7CiAgTGlzdDxfVHlwZUxpdGVyYWw+IF90eXBlTGl0ZXJhbHM7CiAgTGlzdDxpci5UcmVlTm9kZT4gX2xvY2FsRnVuY3Rpb25zOwogIExpc3Q8X0dlbmVyaWNJbnN0YW50aWF0aW9uPiBfZ2VuZXJpY0luc3RhbnRpYXRpb25zOwogIExpc3Q8X1N0YXRpY0FjY2Vzcz4gX3N0YXRpY1NldHM7CiAgTGlzdDxfU3RhdGljQWNjZXNzPiBfc3RhdGljR2V0czsKICBMaXN0PF9TdGF0aWNBY2Nlc3M+IF9zdGF0aWNUZWFyT2ZmczsKICBMaXN0PF9NYXBMaXRlcmFsPiBfbWFwTGl0ZXJhbHM7CiAgTGlzdDxfQ29udGFpbmVyTGl0ZXJhbD4gX2xpc3RMaXRlcmFsczsKICBMaXN0PF9Db250YWluZXJMaXRlcmFsPiBfc2V0TGl0ZXJhbHM7CiAgTGlzdDxTdHJpbmc+IF9zeW1ib2xMaXRlcmFsczsKICBMaXN0PFN0cmluZz4gX3N0cmluZ0xpdGVyYWxzOwogIExpc3Q8Ym9vbD4gX2Jvb2xMaXRlcmFsczsKICBMaXN0PGRvdWJsZT4gX2RvdWJsZUxpdGVyYWxzOwogIExpc3Q8aW50PiBfaW50TGl0ZXJhbHM7CiAgTGlzdDxfUnVudGltZVR5cGVVc2U+IF9ydW50aW1lVHlwZVVzZXM7CiAgTGlzdDxfRm9ySW5EYXRhPiBfZm9ySW5EYXRhOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhlc2Ugd2hlbiBDRkUgcHJvdmlkZXMgY29uc3RhbnRzLgogIExpc3Q8aXIuQ29uc3RydWN0b3I+IF9jb25zdHJ1Y3Rvck5vZGVzOwogIExpc3Q8aXIuRmllbGQ+IF9maWVsZE5vZGVzOwogIExpc3Q8aXIuUHJvY2VkdXJlPiBfcHJvY2VkdXJlTm9kZXM7CiAgTGlzdDxpci5Td2l0Y2hTdGF0ZW1lbnQ+IF9zd2l0Y2hTdGF0ZW1lbnROb2RlczsKICBMaXN0PGlyLlN0YXRpY0ludm9jYXRpb24+IF9zdGF0aWNJbnZvY2F0aW9uTm9kZXM7CiAgTGlzdDxpci5Db25zdHJ1Y3Rvckludm9jYXRpb24+IF9jb25zdENvbnN0cnVjdG9ySW52b2NhdGlvbk5vZGVzOwoKICBJbXBhY3REYXRhSW1wbCgpOwoKICBJbXBhY3REYXRhSW1wbC5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBfc3VwZXJJbml0aWFsaXplcnMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9TdXBlckluaXRpYWxpemVyLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX3N1cGVyU2V0cyA9IHNvdXJjZS5yZWFkTGlzdCgoKSA9PiBzb3VyY2UucmVhZE5hbWUoKSwgZW1wdHlBc051bGw6IHRydWUpOwogICAgX3N1cGVyR2V0cyA9IHNvdXJjZS5yZWFkTGlzdCgoKSA9PiBzb3VyY2UucmVhZE5hbWUoKSwgZW1wdHlBc051bGw6IHRydWUpOwogICAgX3N1cGVySW52b2NhdGlvbnMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9TdXBlckludm9jYXRpb24uZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfaW5zdGFuY2VTZXRzID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfSW5zdGFuY2VBY2Nlc3MuZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfZHluYW1pY1NldHMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9EeW5hbWljQWNjZXNzLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX2luc3RhbmNlR2V0cyA9IHNvdXJjZS5yZWFkTGlzdCgKICAgICAgICAoKSA9PiBuZXcgX0luc3RhbmNlQWNjZXNzLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX2R5bmFtaWNHZXRzID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfRHluYW1pY0FjY2Vzcy5mcm9tRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9mdW5jdGlvbkludm9jYXRpb25zID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfRnVuY3Rpb25JbnZvY2F0aW9uLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX2luc3RhbmNlSW52b2NhdGlvbnMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9JbnN0YW5jZUludm9jYXRpb24uZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfZHluYW1pY0ludm9jYXRpb25zID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfRHluYW1pY0ludm9jYXRpb24uZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfbG9jYWxGdW5jdGlvbkludm9jYXRpb25zID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfTG9jYWxGdW5jdGlvbkludm9jYXRpb24uZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfc3RhdGljSW52b2NhdGlvbnMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9TdGF0aWNJbnZvY2F0aW9uLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX2NvbnN0cnVjdG9ySW52b2NhdGlvbnMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9Db25zdHJ1Y3Rvckludm9jYXRpb24uZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfZmVhdHVyZXMgPSBuZXcgRW51bVNldDxfRmVhdHVyZT4uZnJvbVZhbHVlKHNvdXJjZS5yZWFkSW50KCkpOwogICAgX3R5cGVVc2VzID0gc291cmNlLnJlYWRMaXN0KCgpID0+IG5ldyBfVHlwZVVzZS5mcm9tRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9yZWRpcmVjdGluZ0luaXRpYWxpemVycyA9IHNvdXJjZS5yZWFkTGlzdCgKICAgICAgICAoKSA9PiBuZXcgX1JlZGlyZWN0aW5nSW5pdGlhbGl6ZXIuZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfZmllbGRJbml0aWFsaXplcnMgPSBzb3VyY2UucmVhZE1lbWJlck5vZGVzKGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9maWVsZENvbnN0YW50SW5pdGlhbGl6ZXJzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlck5vZGVNYXAoc291cmNlLnJlYWRUcmVlTm9kZXMsIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF90eXBlTGl0ZXJhbHMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9UeXBlTGl0ZXJhbC5mcm9tRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9sb2NhbEZ1bmN0aW9ucyA9IHNvdXJjZS5yZWFkVHJlZU5vZGVzKGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9nZW5lcmljSW5zdGFudGlhdGlvbnMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9HZW5lcmljSW5zdGFudGlhdGlvbi5mcm9tRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9zdGF0aWNTZXRzID0gc291cmNlLnJlYWRMaXN0KAogICAgICAgICgpID0+IG5ldyBfU3RhdGljQWNjZXNzLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX3N0YXRpY0dldHMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9TdGF0aWNBY2Nlc3MuZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfc3RhdGljVGVhck9mZnMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9TdGF0aWNBY2Nlc3MuZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfbWFwTGl0ZXJhbHMgPSBzb3VyY2UucmVhZExpc3QoKCkgPT4gbmV3IF9NYXBMaXRlcmFsLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX2xpc3RMaXRlcmFscyA9IHNvdXJjZS5yZWFkTGlzdCgKICAgICAgICAoKSA9PiBuZXcgX0NvbnRhaW5lckxpdGVyYWwuZnJvbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgICBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfc2V0TGl0ZXJhbHMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9Db250YWluZXJMaXRlcmFsLmZyb21EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICAgZW1wdHlBc051bGw6IHRydWUpOwogICAgX3N5bWJvbExpdGVyYWxzID0gc291cmNlLnJlYWRTdHJpbmdzKGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9zdHJpbmdMaXRlcmFscyA9IHNvdXJjZS5yZWFkU3RyaW5ncyhlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfYm9vbExpdGVyYWxzID0gc291cmNlLnJlYWRMaXN0KCgpID0+IHNvdXJjZS5yZWFkQm9vbCgpLCBlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfZG91YmxlTGl0ZXJhbHMgPQogICAgICAgIHNvdXJjZS5yZWFkTGlzdCgoKSA9PiBzb3VyY2UucmVhZERvdWJsZVZhbHVlKCksIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9pbnRMaXRlcmFscyA9CiAgICAgICAgc291cmNlLnJlYWRMaXN0KCgpID0+IHNvdXJjZS5yZWFkSW50ZWdlclZhbHVlKCksIGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9ydW50aW1lVHlwZVVzZXMgPSBzb3VyY2UucmVhZExpc3QoCiAgICAgICAgKCkgPT4gbmV3IF9SdW50aW1lVHlwZVVzZS5mcm9tRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgIGVtcHR5QXNOdWxsOiB0cnVlKTsKCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhlc2Ugd2hlbiBDRkUgcHJvdmlkZXMgY29uc3RhbnRzLgogICAgX2NvbnN0cnVjdG9yTm9kZXMgPQogICAgICAgIHNvdXJjZS5yZWFkTWVtYmVyTm9kZXM8aXIuQ29uc3RydWN0b3I+KGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9maWVsZE5vZGVzID0gc291cmNlLnJlYWRNZW1iZXJOb2Rlczxpci5GaWVsZD4oZW1wdHlBc051bGw6IHRydWUpOwogICAgX3Byb2NlZHVyZU5vZGVzID0gc291cmNlLnJlYWRNZW1iZXJOb2Rlczxpci5Qcm9jZWR1cmU+KGVtcHR5QXNOdWxsOiB0cnVlKTsKICAgIF9zd2l0Y2hTdGF0ZW1lbnROb2RlcyA9CiAgICAgICAgc291cmNlLnJlYWRUcmVlTm9kZXM8aXIuU3dpdGNoU3RhdGVtZW50PihlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfc3RhdGljSW52b2NhdGlvbk5vZGVzID0KICAgICAgICBzb3VyY2UucmVhZFRyZWVOb2Rlczxpci5TdGF0aWNJbnZvY2F0aW9uPihlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBfY29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb25Ob2RlcyA9CiAgICAgICAgc291cmNlLnJlYWRUcmVlTm9kZXM8aXIuQ29uc3RydWN0b3JJbnZvY2F0aW9uPihlbXB0eUFzTnVsbDogdHJ1ZSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwoKICAgIHNpbmsud3JpdGVMaXN0KAogICAgICAgIF9zdXBlckluaXRpYWxpemVycywgKF9TdXBlckluaXRpYWxpemVyIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX3N1cGVyU2V0cywgc2luay53cml0ZU5hbWUsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChfc3VwZXJHZXRzLCBzaW5rLndyaXRlTmFtZSwgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KAogICAgICAgIF9zdXBlckludm9jYXRpb25zLCAoX1N1cGVySW52b2NhdGlvbiBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KF9pbnN0YW5jZVNldHMsIChfSW5zdGFuY2VBY2Nlc3MgbykgPT4gby50b0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChfZHluYW1pY1NldHMsIChfRHluYW1pY0FjY2VzcyBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KF9pbnN0YW5jZUdldHMsIChfSW5zdGFuY2VBY2Nlc3MgbykgPT4gby50b0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChfZHluYW1pY0dldHMsIChfRHluYW1pY0FjY2VzcyBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KAogICAgICAgIF9mdW5jdGlvbkludm9jYXRpb25zLCAoX0Z1bmN0aW9uSW52b2NhdGlvbiBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KAogICAgICAgIF9pbnN0YW5jZUludm9jYXRpb25zLCAoX0luc3RhbmNlSW52b2NhdGlvbiBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KAogICAgICAgIF9keW5hbWljSW52b2NhdGlvbnMsIChfRHluYW1pY0ludm9jYXRpb24gbykgPT4gby50b0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChfbG9jYWxGdW5jdGlvbkludm9jYXRpb25zLAogICAgICAgIChfTG9jYWxGdW5jdGlvbkludm9jYXRpb24gbykgPT4gby50b0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdCgKICAgICAgICBfc3RhdGljSW52b2NhdGlvbnMsIChfU3RhdGljSW52b2NhdGlvbiBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KF9jb25zdHJ1Y3Rvckludm9jYXRpb25zLAogICAgICAgIChfQ29uc3RydWN0b3JJbnZvY2F0aW9uIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUludChfZmVhdHVyZXM/LnZhbHVlID8/IDApOwogICAgc2luay53cml0ZUxpc3QoX3R5cGVVc2VzLCAoX1R5cGVVc2UgbykgPT4gby50b0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChfcmVkaXJlY3RpbmdJbml0aWFsaXplcnMsCiAgICAgICAgKF9SZWRpcmVjdGluZ0luaXRpYWxpemVyIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZU1lbWJlck5vZGVzKF9maWVsZEluaXRpYWxpemVycywgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlTWFwKF9maWVsZENvbnN0YW50SW5pdGlhbGl6ZXJzLCBzaW5rLndyaXRlVHJlZU5vZGVzLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChfdHlwZUxpdGVyYWxzLCAoX1R5cGVMaXRlcmFsIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZVRyZWVOb2RlcyhfbG9jYWxGdW5jdGlvbnMsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdCgKICAgICAgICBfZ2VuZXJpY0luc3RhbnRpYXRpb25zLCAoX0dlbmVyaWNJbnN0YW50aWF0aW9uIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX3N0YXRpY1NldHMsIChfU3RhdGljQWNjZXNzIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX3N0YXRpY0dldHMsIChfU3RhdGljQWNjZXNzIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX3N0YXRpY1RlYXJPZmZzLCAoX1N0YXRpY0FjY2VzcyBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KF9tYXBMaXRlcmFscywgKF9NYXBMaXRlcmFsIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX2xpc3RMaXRlcmFscywgKF9Db250YWluZXJMaXRlcmFsIG8pID0+IG8udG9EYXRhU2luayhzaW5rKSwKICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX3NldExpdGVyYWxzLCAoX0NvbnRhaW5lckxpdGVyYWwgbykgPT4gby50b0RhdGFTaW5rKHNpbmspLAogICAgICAgIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlU3RyaW5ncyhfc3ltYm9sTGl0ZXJhbHMsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlU3RyaW5ncyhfc3RyaW5nTGl0ZXJhbHMsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBzaW5rLndyaXRlTGlzdChfYm9vbExpdGVyYWxzLCBzaW5rLndyaXRlQm9vbCwgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVMaXN0KF9kb3VibGVMaXRlcmFscywgc2luay53cml0ZURvdWJsZVZhbHVlLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX2ludExpdGVyYWxzLCBzaW5rLndyaXRlSW50ZWdlclZhbHVlLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZUxpc3QoX3J1bnRpbWVUeXBlVXNlcywgKF9SdW50aW1lVHlwZVVzZSBvKSA9PiBvLnRvRGF0YVNpbmsoc2luayksCiAgICAgICAgYWxsb3dOdWxsOiB0cnVlKTsKCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhlc2Ugd2hlbiBDRkUgcHJvdmlkZXMgY29uc3RhbnRzLgogICAgc2luay53cml0ZU1lbWJlck5vZGVzKF9jb25zdHJ1Y3Rvck5vZGVzLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZU1lbWJlck5vZGVzKF9maWVsZE5vZGVzLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZU1lbWJlck5vZGVzKF9wcm9jZWR1cmVOb2RlcywgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHNpbmsud3JpdGVUcmVlTm9kZXMoX3N3aXRjaFN0YXRlbWVudE5vZGVzLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZVRyZWVOb2Rlcyhfc3RhdGljSW52b2NhdGlvbk5vZGVzLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay53cml0ZVRyZWVOb2RlcyhfY29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb25Ob2RlcywgYWxsb3dOdWxsOiB0cnVlKTsKCiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhcHBseShJbXBhY3RSZWdpc3RyeSByZWdpc3RyeSkgewogICAgaWYgKF9zdXBlckluaXRpYWxpemVycyAhPSBudWxsKSB7CiAgICAgIGZvciAoX1N1cGVySW5pdGlhbGl6ZXIgZGF0YSBpbiBfc3VwZXJJbml0aWFsaXplcnMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN1cGVySW5pdGlhbGl6ZXIoCiAgICAgICAgICAgIGRhdGEuc291cmNlLAogICAgICAgICAgICBkYXRhLnRhcmdldCwKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS5uYW1lZEFyZ3VtZW50cywKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudHMpOwogICAgICB9CiAgICB9CiAgICBpZiAoX3N1cGVyU2V0cyAhPSBudWxsKSB7CiAgICAgIGZvciAoaXIuTmFtZSBkYXRhIGluIF9zdXBlclNldHMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN1cGVyU2V0KGRhdGEpOwogICAgICB9CiAgICB9CiAgICBpZiAoX3N1cGVyR2V0cyAhPSBudWxsKSB7CiAgICAgIGZvciAoaXIuTmFtZSBkYXRhIGluIF9zdXBlckdldHMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN1cGVyR2V0KGRhdGEpOwogICAgICB9CiAgICB9CiAgICBpZiAoX3N1cGVySW52b2NhdGlvbnMgIT0gbnVsbCkgewogICAgICBmb3IgKF9TdXBlckludm9jYXRpb24gZGF0YSBpbiBfc3VwZXJJbnZvY2F0aW9ucykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU3VwZXJJbnZvY2F0aW9uKAogICAgICAgICAgICBkYXRhLm5hbWUsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS5wb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRzKTsKICAgICAgfQogICAgfQogICAgaWYgKF9pbnN0YW5jZVNldHMgIT0gbnVsbCkgewogICAgICBmb3IgKF9JbnN0YW5jZUFjY2VzcyBkYXRhIGluIF9pbnN0YW5jZVNldHMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3Rlckluc3RhbmNlU2V0KAogICAgICAgICAgICBkYXRhLnJlY2VpdmVyVHlwZSwgZGF0YS5jbGFzc1JlbGF0aW9uLCBkYXRhLnRhcmdldCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfZHluYW1pY1NldHMgIT0gbnVsbCkgewogICAgICBmb3IgKF9EeW5hbWljQWNjZXNzIGRhdGEgaW4gX2R5bmFtaWNTZXRzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJEeW5hbWljU2V0KAogICAgICAgICAgICBkYXRhLnJlY2VpdmVyVHlwZSwgZGF0YS5jbGFzc1JlbGF0aW9uLCBkYXRhLm5hbWUpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2luc3RhbmNlR2V0cyAhPSBudWxsKSB7CiAgICAgIGZvciAoX0luc3RhbmNlQWNjZXNzIGRhdGEgaW4gX2luc3RhbmNlR2V0cykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVySW5zdGFuY2VHZXQoCiAgICAgICAgICAgIGRhdGEucmVjZWl2ZXJUeXBlLCBkYXRhLmNsYXNzUmVsYXRpb24sIGRhdGEudGFyZ2V0KTsKICAgICAgfQogICAgfQogICAgaWYgKF9keW5hbWljR2V0cyAhPSBudWxsKSB7CiAgICAgIGZvciAoX0R5bmFtaWNBY2Nlc3MgZGF0YSBpbiBfZHluYW1pY0dldHMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlckR5bmFtaWNHZXQoCiAgICAgICAgICAgIGRhdGEucmVjZWl2ZXJUeXBlLCBkYXRhLmNsYXNzUmVsYXRpb24sIGRhdGEubmFtZSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfZnVuY3Rpb25JbnZvY2F0aW9ucyAhPSBudWxsKSB7CiAgICAgIGZvciAoX0Z1bmN0aW9uSW52b2NhdGlvbiBkYXRhIGluIF9mdW5jdGlvbkludm9jYXRpb25zKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJGdW5jdGlvbkludm9jYXRpb24oCiAgICAgICAgICAgIGRhdGEucmVjZWl2ZXJUeXBlLAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUucG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLm5hbWVkQXJndW1lbnRzLAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfaW5zdGFuY2VJbnZvY2F0aW9ucyAhPSBudWxsKSB7CiAgICAgIGZvciAoX0luc3RhbmNlSW52b2NhdGlvbiBkYXRhIGluIF9pbnN0YW5jZUludm9jYXRpb25zKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJJbnN0YW5jZUludm9jYXRpb24oCiAgICAgICAgICAgIGRhdGEucmVjZWl2ZXJUeXBlLAogICAgICAgICAgICBkYXRhLmNsYXNzUmVsYXRpb24sCiAgICAgICAgICAgIGRhdGEudGFyZ2V0LAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUucG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLm5hbWVkQXJndW1lbnRzLAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfZHluYW1pY0ludm9jYXRpb25zICE9IG51bGwpIHsKICAgICAgZm9yIChfRHluYW1pY0ludm9jYXRpb24gZGF0YSBpbiBfZHluYW1pY0ludm9jYXRpb25zKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJEeW5hbWljSW52b2NhdGlvbigKICAgICAgICAgICAgZGF0YS5yZWNlaXZlclR5cGUsCiAgICAgICAgICAgIGRhdGEuY2xhc3NSZWxhdGlvbiwKICAgICAgICAgICAgZGF0YS5uYW1lLAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUucG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLm5hbWVkQXJndW1lbnRzLAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfbG9jYWxGdW5jdGlvbkludm9jYXRpb25zICE9IG51bGwpIHsKICAgICAgZm9yIChfTG9jYWxGdW5jdGlvbkludm9jYXRpb24gZGF0YSBpbiBfbG9jYWxGdW5jdGlvbkludm9jYXRpb25zKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJMb2NhbEZ1bmN0aW9uSW52b2NhdGlvbigKICAgICAgICAgICAgZGF0YS5sb2NhbEZ1bmN0aW9uLAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUucG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLm5hbWVkQXJndW1lbnRzLAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfc3RhdGljSW52b2NhdGlvbnMgIT0gbnVsbCkgewogICAgICBmb3IgKF9TdGF0aWNJbnZvY2F0aW9uIGRhdGEgaW4gX3N0YXRpY0ludm9jYXRpb25zKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgICAgICBkYXRhLnRhcmdldCwKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS5uYW1lZEFyZ3VtZW50cywKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuaW1wb3J0KTsKICAgICAgICA7CiAgICAgIH0KICAgIH0KICAgIGlmIChfY29uc3RydWN0b3JJbnZvY2F0aW9ucyAhPSBudWxsKSB7CiAgICAgIGZvciAoX0NvbnN0cnVjdG9ySW52b2NhdGlvbiBkYXRhIGluIF9jb25zdHJ1Y3Rvckludm9jYXRpb25zKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJOZXcoCiAgICAgICAgICAgIGRhdGEuY29uc3RydWN0b3IsCiAgICAgICAgICAgIGRhdGEudHlwZSwKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS5uYW1lZEFyZ3VtZW50cywKICAgICAgICAgICAgZGF0YS5jYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuaW1wb3J0LAogICAgICAgICAgICBpc0NvbnN0OiBkYXRhLmlzQ29uc3QpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2NvbnN0SW5zdGFudGlhdGlvbnMgIT0gbnVsbCkgewogICAgICBmb3IgKF9Db25zdEluc3RhbnRpYXRpb24gZGF0YSBpbiBfY29uc3RJbnN0YW50aWF0aW9ucykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQ29uc3RJbnN0YW50aWF0aW9uKAogICAgICAgICAgICBkYXRhLmNscywgZGF0YS50eXBlQXJndW1lbnRzLCBkYXRhLmltcG9ydCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfZmVhdHVyZXMgIT0gbnVsbCkgewogICAgICBmb3IgKF9GZWF0dXJlIGRhdGEgaW4gX2ZlYXR1cmVzLml0ZXJhYmxlKF9GZWF0dXJlLnZhbHVlcykpIHsKICAgICAgICBzd2l0Y2ggKGRhdGEpIHsKICAgICAgICAgIGNhc2UgX0ZlYXR1cmUubGF6eUZpZWxkOgogICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlckxhenlGaWVsZCgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX0ZlYXR1cmUubG9hZExpYnJhcnk6CiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyTG9hZExpYnJhcnkoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF9GZWF0dXJlLnN0YWNrVHJhY2U6CiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU3RhY2tUcmFjZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX0ZlYXR1cmUuY2F0Y2hDbGF1c2U6CiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQ2F0Y2goKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF9GZWF0dXJlLnRocm93RXhwcmVzc2lvbjoKICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJUaHJvdygpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX0ZlYXR1cmUubG9jYWxXaXRob3V0SW5pdGlhbGl6ZXI6CiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyTG9jYWxXaXRob3V0SW5pdGlhbGl6ZXIoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF9GZWF0dXJlLnN0cmluZ0NvbmNhdGVuYXRpb246CiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU3RyaW5nQ29uY2F0ZW5hdGlvbigpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX0ZlYXR1cmUuYXNzZXJ0V2l0aE1lc3NhZ2U6CiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQXNzZXJ0KHdpdGhNZXNzYWdlOiB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF9GZWF0dXJlLmFzc2VydFdpdGhvdXRNZXNzYWdlOgogICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlckFzc2VydCh3aXRoTWVzc2FnZTogZmFsc2UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX0ZlYXR1cmUubnVsbExpdGVyYWw6CiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyTnVsbExpdGVyYWwoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoX3R5cGVVc2VzICE9IG51bGwpIHsKICAgICAgZm9yIChfVHlwZVVzZSBkYXRhIGluIF90eXBlVXNlcykgewogICAgICAgIHN3aXRjaCAoZGF0YS5raW5kKSB7CiAgICAgICAgICBjYXNlIF9UeXBlVXNlS2luZC5wYXJhbWV0ZXJDaGVjazoKICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJQYXJhbWV0ZXJDaGVjayhkYXRhLnR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX1R5cGVVc2VLaW5kLmNhdGNoVHlwZToKICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJDYXRjaFR5cGUoZGF0YS50eXBlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF9UeXBlVXNlS2luZC5hc0Nhc3Q6CiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQXNDYXN0KGRhdGEudHlwZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfVHlwZVVzZUtpbmQuaW1wbGljaXRDYXN0OgogICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlckltcGxpY2l0Q2FzdChkYXRhLnR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX1R5cGVVc2VLaW5kLmlzQ2hlY2s6CiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVySXNDaGVjayhkYXRhLnR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX1R5cGVVc2VLaW5kLmFzeW5jU3Rhck1hcmtlcjoKICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJBc3luY1N0YXIoZGF0YS50eXBlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF9UeXBlVXNlS2luZC5hc3luY01hcmtlcjoKICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJBc3luYyhkYXRhLnR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX1R5cGVVc2VLaW5kLnN5bmNTdGFyTWFya2VyOgogICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN5bmNTdGFyKGRhdGEudHlwZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKF9yZWRpcmVjdGluZ0luaXRpYWxpemVycyAhPSBudWxsKSB7CiAgICAgIGZvciAoX1JlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgZGF0YSBpbiBfcmVkaXJlY3RpbmdJbml0aWFsaXplcnMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlclJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoCiAgICAgICAgICAgIGRhdGEuY29uc3RydWN0b3IsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS5wb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICAgICAgICBkYXRhLmNhbGxTdHJ1Y3R1cmUubmFtZWRBcmd1bWVudHMsCiAgICAgICAgICAgIGRhdGEuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRzKTsKICAgICAgfQogICAgfQogICAgaWYgKF9maWVsZEluaXRpYWxpemVycyAhPSBudWxsKSB7CiAgICAgIGZvciAoaXIuRmllbGQgZGF0YSBpbiBfZmllbGRJbml0aWFsaXplcnMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlckZpZWxkSW5pdGlhbGl6YXRpb24oZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfZmllbGRDb25zdGFudEluaXRpYWxpemVycyAhPSBudWxsKSB7CiAgICAgIF9maWVsZENvbnN0YW50SW5pdGlhbGl6ZXJzCiAgICAgICAgICAuZm9yRWFjaCgoaXIuRmllbGQgZmllbGQsIExpc3Q8Q29uc3RhbnRSZWZlcmVuY2U+IGNvbnN0YW50cykgewogICAgICAgIGZvciAoQ29uc3RhbnRSZWZlcmVuY2UgY29uc3RhbnQgaW4gY29uc3RhbnRzKSB7CiAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlckZpZWxkQ29uc3RhbnRJbml0aWFsaXphdGlvbihmaWVsZCwgY29uc3RhbnQpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBpZiAoX3R5cGVMaXRlcmFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoX1R5cGVMaXRlcmFsIGRhdGEgaW4gX3R5cGVMaXRlcmFscykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyVHlwZUxpdGVyYWwoZGF0YS50eXBlLCBkYXRhLmltcG9ydCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfbG9jYWxGdW5jdGlvbnMgIT0gbnVsbCkgewogICAgICBmb3IgKGlyLlRyZWVOb2RlIGRhdGEgaW4gX2xvY2FsRnVuY3Rpb25zKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJMb2NhbEZ1bmN0aW9uKGRhdGEpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2dlbmVyaWNJbnN0YW50aWF0aW9ucyAhPSBudWxsKSB7CiAgICAgIGZvciAoX0dlbmVyaWNJbnN0YW50aWF0aW9uIGRhdGEgaW4gX2dlbmVyaWNJbnN0YW50aWF0aW9ucykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyR2VuZXJpY0luc3RhbnRpYXRpb24oCiAgICAgICAgICAgIGRhdGEuZXhwcmVzc2lvblR5cGUsIGRhdGEudHlwZUFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfc3RhdGljU2V0cyAhPSBudWxsKSB7CiAgICAgIGZvciAoX1N0YXRpY0FjY2VzcyBkYXRhIGluIF9zdGF0aWNTZXRzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNTZXQoZGF0YS50YXJnZXQsIGRhdGEuaW1wb3J0KTsKICAgICAgfQogICAgfQogICAgaWYgKF9zdGF0aWNHZXRzICE9IG51bGwpIHsKICAgICAgZm9yIChfU3RhdGljQWNjZXNzIGRhdGEgaW4gX3N0YXRpY0dldHMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN0YXRpY0dldChkYXRhLnRhcmdldCwgZGF0YS5pbXBvcnQpOwogICAgICB9CiAgICB9CiAgICBpZiAoX3N0YXRpY1RlYXJPZmZzICE9IG51bGwpIHsKICAgICAgZm9yIChfU3RhdGljQWNjZXNzIGRhdGEgaW4gX3N0YXRpY1RlYXJPZmZzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNUZWFyT2ZmKGRhdGEudGFyZ2V0LCBkYXRhLmltcG9ydCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfbWFwTGl0ZXJhbHMgIT0gbnVsbCkgewogICAgICBmb3IgKF9NYXBMaXRlcmFsIGRhdGEgaW4gX21hcExpdGVyYWxzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJNYXBMaXRlcmFsKGRhdGEua2V5VHlwZSwgZGF0YS52YWx1ZVR5cGUsCiAgICAgICAgICAgIGlzQ29uc3Q6IGRhdGEuaXNDb25zdCwgaXNFbXB0eTogZGF0YS5pc0VtcHR5KTsKICAgICAgfQogICAgfQogICAgaWYgKF9saXN0TGl0ZXJhbHMgIT0gbnVsbCkgewogICAgICBmb3IgKF9Db250YWluZXJMaXRlcmFsIGRhdGEgaW4gX2xpc3RMaXRlcmFscykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyTGlzdExpdGVyYWwoZGF0YS5lbGVtZW50VHlwZSwKICAgICAgICAgICAgaXNDb25zdDogZGF0YS5pc0NvbnN0LCBpc0VtcHR5OiBkYXRhLmlzRW1wdHkpOwogICAgICB9CiAgICB9CiAgICBpZiAoX3NldExpdGVyYWxzICE9IG51bGwpIHsKICAgICAgZm9yIChfQ29udGFpbmVyTGl0ZXJhbCBkYXRhIGluIF9zZXRMaXRlcmFscykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU2V0TGl0ZXJhbChkYXRhLmVsZW1lbnRUeXBlLAogICAgICAgICAgICBpc0NvbnN0OiBkYXRhLmlzQ29uc3QsIGlzRW1wdHk6IGRhdGEuaXNFbXB0eSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfc3ltYm9sTGl0ZXJhbHMgIT0gbnVsbCkgewogICAgICBmb3IgKFN0cmluZyBkYXRhIGluIF9zeW1ib2xMaXRlcmFscykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU3ltYm9sTGl0ZXJhbChkYXRhKTsKICAgICAgfQogICAgfQogICAgaWYgKF9zdHJpbmdMaXRlcmFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoU3RyaW5nIGRhdGEgaW4gX3N0cmluZ0xpdGVyYWxzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTdHJpbmdMaXRlcmFsKGRhdGEpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2Jvb2xMaXRlcmFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoYm9vbCBkYXRhIGluIF9ib29sTGl0ZXJhbHMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlckJvb2xMaXRlcmFsKGRhdGEpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2RvdWJsZUxpdGVyYWxzICE9IG51bGwpIHsKICAgICAgZm9yIChkb3VibGUgZGF0YSBpbiBfZG91YmxlTGl0ZXJhbHMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlckRvdWJsZUxpdGVyYWwoZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfaW50TGl0ZXJhbHMgIT0gbnVsbCkgewogICAgICBmb3IgKGludCBkYXRhIGluIF9pbnRMaXRlcmFscykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVySW50TGl0ZXJhbChkYXRhKTsKICAgICAgfQogICAgfQogICAgaWYgKF9ydW50aW1lVHlwZVVzZXMgIT0gbnVsbCkgewogICAgICBmb3IgKF9SdW50aW1lVHlwZVVzZSBkYXRhIGluIF9ydW50aW1lVHlwZVVzZXMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlclJ1bnRpbWVUeXBlVXNlKAogICAgICAgICAgICBkYXRhLm5vZGUsIGRhdGEua2luZCwgZGF0YS5yZWNlaXZlclR5cGUsIGRhdGEuYXJndW1lbnRUeXBlKTsKICAgICAgfQogICAgfQogICAgaWYgKF9mb3JJbkRhdGEgIT0gbnVsbCkgewogICAgICBmb3IgKF9Gb3JJbkRhdGEgZGF0YSBpbiBfZm9ySW5EYXRhKSB7CiAgICAgICAgaWYgKGRhdGEuaXNBc3luYykgewogICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJBc3luY0ZvckluKAogICAgICAgICAgICAgIGRhdGEuaXRlcmFibGVUeXBlLCBkYXRhLml0ZXJhdG9yVHlwZSwgZGF0YS5pdGVyYXRvckNsYXNzUmVsYXRpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlclN5bmNGb3JJbigKICAgICAgICAgICAgICBkYXRhLml0ZXJhYmxlVHlwZSwgZGF0YS5pdGVyYXRvclR5cGUsIGRhdGEuaXRlcmF0b3JDbGFzc1JlbGF0aW9uKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhlc2Ugd2hlbiBDRkUgcHJvdmlkZXMgY29uc3RhbnRzLgogICAgaWYgKF9jb25zdHJ1Y3Rvck5vZGVzICE9IG51bGwpIHsKICAgICAgZm9yIChpci5Db25zdHJ1Y3RvciBkYXRhIGluIF9jb25zdHJ1Y3Rvck5vZGVzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJDb25zdHJ1Y3Rvck5vZGUoZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfZmllbGROb2RlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaXIuRmllbGQgZGF0YSBpbiBfZmllbGROb2RlcykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRmllbGROb2RlKGRhdGEpOwogICAgICB9CiAgICB9CiAgICBpZiAoX3Byb2NlZHVyZU5vZGVzICE9IG51bGwpIHsKICAgICAgZm9yIChpci5Qcm9jZWR1cmUgZGF0YSBpbiBfcHJvY2VkdXJlTm9kZXMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlclByb2NlZHVyZU5vZGUoZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfc3dpdGNoU3RhdGVtZW50Tm9kZXMgIT0gbnVsbCkgewogICAgICBmb3IgKGlyLlN3aXRjaFN0YXRlbWVudCBkYXRhIGluIF9zd2l0Y2hTdGF0ZW1lbnROb2RlcykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU3dpdGNoU3RhdGVtZW50Tm9kZShkYXRhKTsKICAgICAgfQogICAgfQogICAgaWYgKF9zdGF0aWNJbnZvY2F0aW9uTm9kZXMgIT0gbnVsbCkgewogICAgICBmb3IgKGlyLlN0YXRpY0ludm9jYXRpb24gZGF0YSBpbiBfc3RhdGljSW52b2NhdGlvbk5vZGVzKSB7CiAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNJbnZvY2F0aW9uTm9kZShkYXRhKTsKICAgICAgfQogICAgfQogICAgaWYgKF9jb25zdENvbnN0cnVjdG9ySW52b2NhdGlvbk5vZGVzICE9IG51bGwpIHsKICAgICAgZm9yIChpci5Db25zdHJ1Y3Rvckludm9jYXRpb24gZGF0YSBpbiBfY29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb25Ob2RlcykgewogICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQ29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb25Ob2RlKGRhdGEpOwogICAgICB9CiAgICB9CiAgfQp9CgpjbGFzcyBfQ2FsbFN0cnVjdHVyZSB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnX0NhbGxTdHJ1Y3R1cmUnOwoKICBmaW5hbCBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwogIGZpbmFsIGludCBwb3NpdGlvbmFsQXJndW1lbnRzOwogIGZpbmFsIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50czsKCiAgX0NhbGxTdHJ1Y3R1cmUuaW50ZXJuYWwoCiAgICAgIHRoaXMudHlwZUFyZ3VtZW50cywgdGhpcy5wb3NpdGlvbmFsQXJndW1lbnRzLCB0aGlzLm5hbWVkQXJndW1lbnRzKTsKCiAgZmFjdG9yeSBfQ2FsbFN0cnVjdHVyZShpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IF9DYWxsU3RydWN0dXJlLmludGVybmFsKAogICAgICAgIHR5cGVBcmd1bWVudHMsIHBvc2l0aW9uYWxBcmd1bWVudHMsIG5hbWVkQXJndW1lbnRzKTsKICB9CgogIGZhY3RvcnkgX0NhbGxTdHJ1Y3R1cmUuZnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlcygpOwogICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMgPSBzb3VyY2UucmVhZEludCgpOwogICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzID0gc291cmNlLnJlYWRTdHJpbmdzKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9DYWxsU3RydWN0dXJlLmludGVybmFsKAogICAgICAgIHR5cGVBcmd1bWVudHMsIHBvc2l0aW9uYWxBcmd1bWVudHMsIG5hbWVkQXJndW1lbnRzKTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVOb2Rlcyh0eXBlQXJndW1lbnRzKTsKICAgIHNpbmsud3JpdGVJbnQocG9zaXRpb25hbEFyZ3VtZW50cyk7CiAgICBzaW5rLndyaXRlU3RyaW5ncyhuYW1lZEFyZ3VtZW50cyk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgX1N1cGVySW5pdGlhbGl6ZXIgewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19TdXBlckluaXRpYWxpemVyJzsKCiAgZmluYWwgaXIuQ29uc3RydWN0b3Igc291cmNlOwogIGZpbmFsIGlyLkNvbnN0cnVjdG9yIHRhcmdldDsKICBmaW5hbCBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlOwoKICBfU3VwZXJJbml0aWFsaXplcih0aGlzLnNvdXJjZSwgdGhpcy50YXJnZXQsIHRoaXMuY2FsbFN0cnVjdHVyZSk7CgogIGZhY3RvcnkgX1N1cGVySW5pdGlhbGl6ZXIuZnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuQ29uc3RydWN0b3Igc291cmNlQ29uc3RydWN0b3IgPSBzb3VyY2UucmVhZE1lbWJlck5vZGUoKTsKICAgIGlyLkNvbnN0cnVjdG9yIHRhcmdldENvbnN0cnVjdG9yID0gc291cmNlLnJlYWRNZW1iZXJOb2RlKCk7CiAgICBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IF9DYWxsU3RydWN0dXJlLmZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9TdXBlckluaXRpYWxpemVyKAogICAgICAgIHNvdXJjZUNvbnN0cnVjdG9yLCB0YXJnZXRDb25zdHJ1Y3RvciwgY2FsbFN0cnVjdHVyZSk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZU1lbWJlck5vZGUoc291cmNlKTsKICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlKHRhcmdldCk7CiAgICBjYWxsU3RydWN0dXJlLnRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgX1N1cGVySW52b2NhdGlvbiB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnX1N1cGVySW52b2NhdGlvbic7CgogIGZpbmFsIGlyLk5hbWUgbmFtZTsKICBmaW5hbCBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlOwoKICBfU3VwZXJJbnZvY2F0aW9uKHRoaXMubmFtZSwgdGhpcy5jYWxsU3RydWN0dXJlKTsKCiAgZmFjdG9yeSBfU3VwZXJJbnZvY2F0aW9uLmZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLk5hbWUgbmFtZSA9IHNvdXJjZS5yZWFkTmFtZSgpOwogICAgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IG5ldyBfQ2FsbFN0cnVjdHVyZS5mcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBfU3VwZXJJbnZvY2F0aW9uKG5hbWUsIGNhbGxTdHJ1Y3R1cmUpOwogIH0KCiAgdm9pZCB0b0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVOYW1lKG5hbWUpOwogICAgY2FsbFN0cnVjdHVyZS50b0RhdGFTaW5rKHNpbmspOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9JbnN0YW5jZUFjY2VzcyB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnX0luc3RhbmNlQWNjZXNzJzsKCiAgZmluYWwgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlOwogIGZpbmFsIENsYXNzUmVsYXRpb24gY2xhc3NSZWxhdGlvbjsKICBmaW5hbCBpci5NZW1iZXIgdGFyZ2V0OwoKICBfSW5zdGFuY2VBY2Nlc3ModGhpcy5yZWNlaXZlclR5cGUsIHRoaXMuY2xhc3NSZWxhdGlvbiwgdGhpcy50YXJnZXQpOwoKICBmYWN0b3J5IF9JbnN0YW5jZUFjY2Vzcy5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlTm9kZSgpOwogICAgQ2xhc3NSZWxhdGlvbiBjbGFzc1JlbGF0aW9uID0gc291cmNlLnJlYWRFbnVtKENsYXNzUmVsYXRpb24udmFsdWVzKTsKICAgIGlyLk1lbWJlciB0YXJnZXQgPSBzb3VyY2UucmVhZE1lbWJlck5vZGUoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgX0luc3RhbmNlQWNjZXNzKHJlY2VpdmVyVHlwZSwgY2xhc3NSZWxhdGlvbiwgdGFyZ2V0KTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVOb2RlKHJlY2VpdmVyVHlwZSk7CiAgICBzaW5rLndyaXRlRW51bShjbGFzc1JlbGF0aW9uKTsKICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlKHRhcmdldCk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgX0R5bmFtaWNBY2Nlc3MgewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19EeW5hbWljQWNjZXNzJzsKCiAgZmluYWwgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlOwogIGZpbmFsIENsYXNzUmVsYXRpb24gY2xhc3NSZWxhdGlvbjsKICBmaW5hbCBpci5OYW1lIG5hbWU7CgogIF9EeW5hbWljQWNjZXNzKHRoaXMucmVjZWl2ZXJUeXBlLCB0aGlzLmNsYXNzUmVsYXRpb24sIHRoaXMubmFtZSk7CgogIGZhY3RvcnkgX0R5bmFtaWNBY2Nlc3MuZnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZU5vZGUoKTsKICAgIENsYXNzUmVsYXRpb24gY2xhc3NSZWxhdGlvbiA9IHNvdXJjZS5yZWFkRW51bShDbGFzc1JlbGF0aW9uLnZhbHVlcyk7CiAgICBpci5OYW1lIG5hbWUgPSBzb3VyY2UucmVhZE5hbWUoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgX0R5bmFtaWNBY2Nlc3MocmVjZWl2ZXJUeXBlLCBjbGFzc1JlbGF0aW9uLCBuYW1lKTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVOb2RlKHJlY2VpdmVyVHlwZSk7CiAgICBzaW5rLndyaXRlRW51bShjbGFzc1JlbGF0aW9uKTsKICAgIHNpbmsud3JpdGVOYW1lKG5hbWUpOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9GdW5jdGlvbkludm9jYXRpb24gewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19GdW5jdGlvbkludm9jYXRpb24nOwoKICBmaW5hbCBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGU7CiAgZmluYWwgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZTsKCiAgX0Z1bmN0aW9uSW52b2NhdGlvbih0aGlzLnJlY2VpdmVyVHlwZSwgdGhpcy5jYWxsU3RydWN0dXJlKTsKCiAgZmFjdG9yeSBfRnVuY3Rpb25JbnZvY2F0aW9uLmZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlKCk7CiAgICBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IF9DYWxsU3RydWN0dXJlLmZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9GdW5jdGlvbkludm9jYXRpb24ocmVjZWl2ZXJUeXBlLCBjYWxsU3RydWN0dXJlKTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVOb2RlKHJlY2VpdmVyVHlwZSk7CiAgICBjYWxsU3RydWN0dXJlLnRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgX0luc3RhbmNlSW52b2NhdGlvbiB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnX0luc3RhbmNlSW52b2NhdGlvbic7CgogIGZpbmFsIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZTsKICBmaW5hbCBDbGFzc1JlbGF0aW9uIGNsYXNzUmVsYXRpb247CiAgZmluYWwgaXIuTWVtYmVyIHRhcmdldDsKICBmaW5hbCBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlOwoKICBfSW5zdGFuY2VJbnZvY2F0aW9uKAogICAgICB0aGlzLnJlY2VpdmVyVHlwZSwgdGhpcy5jbGFzc1JlbGF0aW9uLCB0aGlzLnRhcmdldCwgdGhpcy5jYWxsU3RydWN0dXJlKTsKCiAgZmFjdG9yeSBfSW5zdGFuY2VJbnZvY2F0aW9uLmZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlKCk7CiAgICBDbGFzc1JlbGF0aW9uIGNsYXNzUmVsYXRpb24gPSBzb3VyY2UucmVhZEVudW0oQ2xhc3NSZWxhdGlvbi52YWx1ZXMpOwogICAgaXIuTWVtYmVyIHRhcmdldCA9IHNvdXJjZS5yZWFkTWVtYmVyTm9kZSgpOwogICAgX0NhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IG5ldyBfQ2FsbFN0cnVjdHVyZS5mcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBfSW5zdGFuY2VJbnZvY2F0aW9uKAogICAgICAgIHJlY2VpdmVyVHlwZSwgY2xhc3NSZWxhdGlvbiwgdGFyZ2V0LCBjYWxsU3RydWN0dXJlKTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVOb2RlKHJlY2VpdmVyVHlwZSk7CiAgICBzaW5rLndyaXRlRW51bShjbGFzc1JlbGF0aW9uKTsKICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlKHRhcmdldCk7CiAgICBjYWxsU3RydWN0dXJlLnRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgX0R5bmFtaWNJbnZvY2F0aW9uIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdfRHluYW1pY0ludm9jYXRpb24nOwoKICBmaW5hbCBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGU7CiAgZmluYWwgQ2xhc3NSZWxhdGlvbiBjbGFzc1JlbGF0aW9uOwogIGZpbmFsIGlyLk5hbWUgbmFtZTsKICBmaW5hbCBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlOwoKICBfRHluYW1pY0ludm9jYXRpb24oCiAgICAgIHRoaXMucmVjZWl2ZXJUeXBlLCB0aGlzLmNsYXNzUmVsYXRpb24sIHRoaXMubmFtZSwgdGhpcy5jYWxsU3RydWN0dXJlKTsKCiAgZmFjdG9yeSBfRHluYW1pY0ludm9jYXRpb24uZnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZU5vZGUoKTsKICAgIENsYXNzUmVsYXRpb24gY2xhc3NSZWxhdGlvbiA9IHNvdXJjZS5yZWFkRW51bShDbGFzc1JlbGF0aW9uLnZhbHVlcyk7CiAgICBpci5OYW1lIG5hbWUgPSBzb3VyY2UucmVhZE5hbWUoKTsKICAgIF9DYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUgPSBuZXcgX0NhbGxTdHJ1Y3R1cmUuZnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgX0R5bmFtaWNJbnZvY2F0aW9uKAogICAgICAgIHJlY2VpdmVyVHlwZSwgY2xhc3NSZWxhdGlvbiwgbmFtZSwgY2FsbFN0cnVjdHVyZSk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZURhcnRUeXBlTm9kZShyZWNlaXZlclR5cGUpOwogICAgc2luay53cml0ZUVudW0oY2xhc3NSZWxhdGlvbik7CiAgICBzaW5rLndyaXRlTmFtZShuYW1lKTsKICAgIGNhbGxTdHJ1Y3R1cmUudG9EYXRhU2luayhzaW5rKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQp9CgpjbGFzcyBfTG9jYWxGdW5jdGlvbkludm9jYXRpb24gewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19Mb2NhbEZ1bmN0aW9uSW52b2NhdGlvbic7CgogIGZpbmFsIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24gbG9jYWxGdW5jdGlvbjsKICBmaW5hbCBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlOwoKICBfTG9jYWxGdW5jdGlvbkludm9jYXRpb24odGhpcy5sb2NhbEZ1bmN0aW9uLCB0aGlzLmNhbGxTdHJ1Y3R1cmUpOwoKICBmYWN0b3J5IF9Mb2NhbEZ1bmN0aW9uSW52b2NhdGlvbi5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5GdW5jdGlvbkRlY2xhcmF0aW9uIGxvY2FsRnVuY3Rpb24gPSBzb3VyY2UucmVhZFRyZWVOb2RlKCk7CiAgICBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IF9DYWxsU3RydWN0dXJlLmZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9Mb2NhbEZ1bmN0aW9uSW52b2NhdGlvbihsb2NhbEZ1bmN0aW9uLCBjYWxsU3RydWN0dXJlKTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlVHJlZU5vZGUobG9jYWxGdW5jdGlvbik7CiAgICBjYWxsU3RydWN0dXJlLnRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgX1N0YXRpY0ludm9jYXRpb24gewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19TdGF0aWNJbnZvY2F0aW9uJzsKCiAgZmluYWwgaXIuUHJvY2VkdXJlIHRhcmdldDsKICBmaW5hbCBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlOwogIGZpbmFsIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydDsKCiAgX1N0YXRpY0ludm9jYXRpb24odGhpcy50YXJnZXQsIHRoaXMuY2FsbFN0cnVjdHVyZSwgdGhpcy5pbXBvcnQpOwoKICBmYWN0b3J5IF9TdGF0aWNJbnZvY2F0aW9uLmZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLlByb2NlZHVyZSB0YXJnZXQgPSBzb3VyY2UucmVhZE1lbWJlck5vZGUoKTsKICAgIF9DYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUgPSBuZXcgX0NhbGxTdHJ1Y3R1cmUuZnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCA9IHNvdXJjZS5yZWFkTGlicmFyeURlcGVuZGVuY3lOb2RlT3JOdWxsKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9TdGF0aWNJbnZvY2F0aW9uKHRhcmdldCwgY2FsbFN0cnVjdHVyZSwgaW1wb3J0KTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVyTm9kZSh0YXJnZXQpOwogICAgY2FsbFN0cnVjdHVyZS50b0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZUxpYnJhcnlEZXBlbmRlbmN5Tm9kZU9yTnVsbChpbXBvcnQpOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9Db25zdHJ1Y3Rvckludm9jYXRpb24gewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19Db25zdHJ1Y3Rvckludm9jYXRpb24nOwoKICBmaW5hbCBpci5NZW1iZXIgY29uc3RydWN0b3I7CiAgZmluYWwgaXIuSW50ZXJmYWNlVHlwZSB0eXBlOwogIGZpbmFsIF9DYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmU7CiAgZmluYWwgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0OwogIGZpbmFsIGJvb2wgaXNDb25zdDsKCiAgX0NvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgdGhpcy5jb25zdHJ1Y3RvciwgdGhpcy50eXBlLCB0aGlzLmNhbGxTdHJ1Y3R1cmUsIHRoaXMuaW1wb3J0LAogICAgICB7dGhpcy5pc0NvbnN0fSk7CgogIGZhY3RvcnkgX0NvbnN0cnVjdG9ySW52b2NhdGlvbi5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5NZW1iZXIgY29uc3RydWN0b3IgPSBzb3VyY2UucmVhZE1lbWJlck5vZGUoKTsKICAgIGlyLkludGVyZmFjZVR5cGUgdHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlKCk7CiAgICBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IF9DYWxsU3RydWN0dXJlLmZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQgPSBzb3VyY2UucmVhZExpYnJhcnlEZXBlbmRlbmN5Tm9kZU9yTnVsbCgpOwogICAgYm9vbCBpc0NvbnN0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9Db25zdHJ1Y3Rvckludm9jYXRpb24oY29uc3RydWN0b3IsIHR5cGUsIGNhbGxTdHJ1Y3R1cmUsIGltcG9ydCwKICAgICAgICBpc0NvbnN0OiBpc0NvbnN0KTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVyTm9kZShjb25zdHJ1Y3Rvcik7CiAgICBzaW5rLndyaXRlRGFydFR5cGVOb2RlKHR5cGUpOwogICAgY2FsbFN0cnVjdHVyZS50b0RhdGFTaW5rKHNpbmspOwogICAgc2luay53cml0ZUxpYnJhcnlEZXBlbmRlbmN5Tm9kZU9yTnVsbChpbXBvcnQpOwogICAgc2luay53cml0ZUJvb2woaXNDb25zdCk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgX0NvbnN0SW5zdGFudGlhdGlvbiB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnX0NvbnN0SW5zdGFudGlhdGlvbic7CgogIGZpbmFsIGlyLkNsYXNzIGNsczsKICBmaW5hbCBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwogIGZpbmFsIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydDsKCiAgX0NvbnN0SW5zdGFudGlhdGlvbih0aGlzLmNscywgdGhpcy50eXBlQXJndW1lbnRzLCB0aGlzLmltcG9ydCk7CgogIGZhY3RvcnkgX0NvbnN0SW5zdGFudGlhdGlvbi5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5DbGFzcyBjbHMgPSBzb3VyY2UucmVhZENsYXNzTm9kZSgpOwogICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlcygpOwogICAgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0ID0gc291cmNlLnJlYWRMaWJyYXJ5RGVwZW5kZW5jeU5vZGVPck51bGwoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgX0NvbnN0SW5zdGFudGlhdGlvbihjbHMsIHR5cGVBcmd1bWVudHMsIGltcG9ydCk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUNsYXNzTm9kZShjbHMpOwogICAgc2luay53cml0ZURhcnRUeXBlTm9kZXModHlwZUFyZ3VtZW50cyk7CiAgICBzaW5rLndyaXRlTGlicmFyeURlcGVuZGVuY3lOb2RlT3JOdWxsKGltcG9ydCk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKZW51bSBfRmVhdHVyZSB7CiAgbGF6eUZpZWxkLAogIGxvYWRMaWJyYXJ5LAogIHN0YWNrVHJhY2UsCiAgY2F0Y2hDbGF1c2UsCiAgdGhyb3dFeHByZXNzaW9uLAogIGxvY2FsV2l0aG91dEluaXRpYWxpemVyLAogIHN0cmluZ0NvbmNhdGVuYXRpb24sCiAgYXNzZXJ0V2l0aE1lc3NhZ2UsCiAgYXNzZXJ0V2l0aG91dE1lc3NhZ2UsCiAgbnVsbExpdGVyYWwsCn0KCmNsYXNzIF9UeXBlVXNlIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdfVHlwZVVzZSc7CgogIGZpbmFsIGlyLkRhcnRUeXBlIHR5cGU7CiAgZmluYWwgX1R5cGVVc2VLaW5kIGtpbmQ7CgogIF9UeXBlVXNlKHRoaXMudHlwZSwgdGhpcy5raW5kKTsKCiAgZmFjdG9yeSBfVHlwZVVzZS5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5EYXJ0VHlwZSB0eXBlID0gc291cmNlLnJlYWREYXJ0VHlwZU5vZGUoKTsKICAgIF9UeXBlVXNlS2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKF9UeXBlVXNlS2luZC52YWx1ZXMpOwogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBfVHlwZVVzZSh0eXBlLCBraW5kKTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVOb2RlKHR5cGUpOwogICAgc2luay53cml0ZUVudW0oa2luZCk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKZW51bSBfVHlwZVVzZUtpbmQgewogIHBhcmFtZXRlckNoZWNrLAogIGNhdGNoVHlwZSwKICBhc0Nhc3QsCiAgaW1wbGljaXRDYXN0LAogIGlzQ2hlY2ssCiAgYXN5bmNTdGFyTWFya2VyLAogIGFzeW5jTWFya2VyLAogIHN5bmNTdGFyTWFya2VyLAp9CgpjbGFzcyBfUmVkaXJlY3RpbmdJbml0aWFsaXplciB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnX1JlZGlyZWN0aW5nSW5pdGlhbGl6ZXInOwoKICBmaW5hbCBpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvcjsKICBmaW5hbCBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlOwoKICBfUmVkaXJlY3RpbmdJbml0aWFsaXplcih0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLmNhbGxTdHJ1Y3R1cmUpOwoKICBmYWN0b3J5IF9SZWRpcmVjdGluZ0luaXRpYWxpemVyLmZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gc291cmNlLnJlYWRNZW1iZXJOb2RlKCk7CiAgICBfQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IF9DYWxsU3RydWN0dXJlLmZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9SZWRpcmVjdGluZ0luaXRpYWxpemVyKGNvbnN0cnVjdG9yLCBjYWxsU3RydWN0dXJlKTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVyTm9kZShjb25zdHJ1Y3Rvcik7CiAgICBjYWxsU3RydWN0dXJlLnRvRGF0YVNpbmsoc2luayk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgX1R5cGVMaXRlcmFsIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdfVHlwZUxpdGVyYWwnOwoKICBmaW5hbCBpci5EYXJ0VHlwZSB0eXBlOwogIGZpbmFsIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydDsKCiAgX1R5cGVMaXRlcmFsKHRoaXMudHlwZSwgdGhpcy5pbXBvcnQpOwoKICBmYWN0b3J5IF9UeXBlTGl0ZXJhbC5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5EYXJ0VHlwZSB0eXBlID0gc291cmNlLnJlYWREYXJ0VHlwZU5vZGUoKTsKICAgIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCA9IHNvdXJjZS5yZWFkTGlicmFyeURlcGVuZGVuY3lOb2RlT3JOdWxsKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9UeXBlTGl0ZXJhbCh0eXBlLCBpbXBvcnQpOwogIH0KCiAgdm9pZCB0b0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVEYXJ0VHlwZU5vZGUodHlwZSk7CiAgICBzaW5rLndyaXRlTGlicmFyeURlcGVuZGVuY3lOb2RlT3JOdWxsKGltcG9ydCk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgX0dlbmVyaWNJbnN0YW50aWF0aW9uIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdfR2VuZXJpY0luc3RhbnRpYXRpb24nOwoKICBmaW5hbCBpci5GdW5jdGlvblR5cGUgZXhwcmVzc2lvblR5cGU7CiAgZmluYWwgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgX0dlbmVyaWNJbnN0YW50aWF0aW9uKHRoaXMuZXhwcmVzc2lvblR5cGUsIHRoaXMudHlwZUFyZ3VtZW50cyk7CgogIGZhY3RvcnkgX0dlbmVyaWNJbnN0YW50aWF0aW9uLmZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLkZ1bmN0aW9uVHlwZSBleHByZXNzaW9uVHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlKCk7CiAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0gc291cmNlLnJlYWREYXJ0VHlwZU5vZGVzKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9HZW5lcmljSW5zdGFudGlhdGlvbihleHByZXNzaW9uVHlwZSwgdHlwZUFyZ3VtZW50cyk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZURhcnRUeXBlTm9kZShleHByZXNzaW9uVHlwZSk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVOb2Rlcyh0eXBlQXJndW1lbnRzKTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQp9CgpjbGFzcyBfU3RhdGljQWNjZXNzIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdfU3RhdGljQWNjZXNzJzsKCiAgZmluYWwgaXIuTWVtYmVyIHRhcmdldDsKICBmaW5hbCBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQ7CgogIF9TdGF0aWNBY2Nlc3ModGhpcy50YXJnZXQsIHRoaXMuaW1wb3J0KTsKCiAgZmFjdG9yeSBfU3RhdGljQWNjZXNzLmZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLk1lbWJlciB0YXJnZXQgPSBzb3VyY2UucmVhZE1lbWJlck5vZGUoKTsKICAgIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCA9IHNvdXJjZS5yZWFkTGlicmFyeURlcGVuZGVuY3lOb2RlT3JOdWxsKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IF9TdGF0aWNBY2Nlc3ModGFyZ2V0LCBpbXBvcnQpOwogIH0KCiAgdm9pZCB0b0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVNZW1iZXJOb2RlKHRhcmdldCk7CiAgICBzaW5rLndyaXRlTGlicmFyeURlcGVuZGVuY3lOb2RlT3JOdWxsKGltcG9ydCk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KfQoKY2xhc3MgX01hcExpdGVyYWwgewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19NYXBMaXRlcmFsJzsKCiAgZmluYWwgaXIuRGFydFR5cGUga2V5VHlwZTsKICBmaW5hbCBpci5EYXJ0VHlwZSB2YWx1ZVR5cGU7CiAgZmluYWwgYm9vbCBpc0NvbnN0OwogIGZpbmFsIGJvb2wgaXNFbXB0eTsKCiAgX01hcExpdGVyYWwodGhpcy5rZXlUeXBlLCB0aGlzLnZhbHVlVHlwZSwge3RoaXMuaXNDb25zdCwgdGhpcy5pc0VtcHR5fSk7CgogIGZhY3RvcnkgX01hcExpdGVyYWwuZnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaXIuRGFydFR5cGUga2V5VHlwZSA9IHNvdXJjZS5yZWFkRGFydFR5cGVOb2RlKCk7CiAgICBpci5EYXJ0VHlwZSB2YWx1ZVR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlTm9kZSgpOwogICAgYm9vbCBpc0NvbnN0ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzRW1wdHkgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBfTWFwTGl0ZXJhbChrZXlUeXBlLCB2YWx1ZVR5cGUsIGlzQ29uc3Q6IGlzQ29uc3QsIGlzRW1wdHk6IGlzRW1wdHkpOwogIH0KCiAgdm9pZCB0b0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVEYXJ0VHlwZU5vZGUoa2V5VHlwZSk7CiAgICBzaW5rLndyaXRlRGFydFR5cGVOb2RlKHZhbHVlVHlwZSk7CiAgICBzaW5rLndyaXRlQm9vbChpc0NvbnN0KTsKICAgIHNpbmsud3JpdGVCb29sKGlzRW1wdHkpOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9Db250YWluZXJMaXRlcmFsIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdfQ29udGFpbmVyTGl0ZXJhbCc7CgogIGZpbmFsIGlyLkRhcnRUeXBlIGVsZW1lbnRUeXBlOwogIGZpbmFsIGJvb2wgaXNDb25zdDsKICBmaW5hbCBib29sIGlzRW1wdHk7CgogIF9Db250YWluZXJMaXRlcmFsKHRoaXMuZWxlbWVudFR5cGUsIHt0aGlzLmlzQ29uc3QsIHRoaXMuaXNFbXB0eX0pOwoKICBmYWN0b3J5IF9Db250YWluZXJMaXRlcmFsLmZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIGlyLkRhcnRUeXBlIGVsZW1lbnRUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZU5vZGUoKTsKICAgIGJvb2wgaXNDb25zdCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc0VtcHR5ID0gc291cmNlLnJlYWRCb29sKCk7CiAgICByZXR1cm4gbmV3IF9Db250YWluZXJMaXRlcmFsKGVsZW1lbnRUeXBlLAogICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QsIGlzRW1wdHk6IGlzRW1wdHkpOwogIH0KCiAgdm9pZCB0b0RhdGFTaW5rKERhdGFTaW5rIHNpbmspIHsKICAgIHNpbmsuYmVnaW4odGFnKTsKICAgIHNpbmsud3JpdGVEYXJ0VHlwZU5vZGUoZWxlbWVudFR5cGUpOwogICAgc2luay53cml0ZUJvb2woaXNDb25zdCk7CiAgICBzaW5rLndyaXRlQm9vbChpc0VtcHR5KTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQp9CgpjbGFzcyBfUnVudGltZVR5cGVVc2UgewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19SdW50aW1lVHlwZVVzZSc7CgogIGZpbmFsIGlyLlByb3BlcnR5R2V0IG5vZGU7CiAgZmluYWwgUnVudGltZVR5cGVVc2VLaW5kIGtpbmQ7CiAgZmluYWwgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlOwogIGZpbmFsIGlyLkRhcnRUeXBlIGFyZ3VtZW50VHlwZTsKCiAgX1J1bnRpbWVUeXBlVXNlKHRoaXMubm9kZSwgdGhpcy5raW5kLCB0aGlzLnJlY2VpdmVyVHlwZSwgdGhpcy5hcmd1bWVudFR5cGUpOwoKICBmYWN0b3J5IF9SdW50aW1lVHlwZVVzZS5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5UcmVlTm9kZSBub2RlID0gc291cmNlLnJlYWRUcmVlTm9kZSgpOwogICAgUnVudGltZVR5cGVVc2VLaW5kIGtpbmQgPSBzb3VyY2UucmVhZEVudW0oUnVudGltZVR5cGVVc2VLaW5kLnZhbHVlcyk7CiAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlTm9kZSgpOwogICAgaXIuRGFydFR5cGUgYXJndW1lbnRUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZU5vZGUoYWxsb3dOdWxsOiB0cnVlKTsKICAgIHJldHVybiBuZXcgX1J1bnRpbWVUeXBlVXNlKG5vZGUsIGtpbmQsIHJlY2VpdmVyVHlwZSwgYXJndW1lbnRUeXBlKTsKICB9CgogIHZvaWQgdG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlVHJlZU5vZGUobm9kZSk7CiAgICBzaW5rLndyaXRlRW51bShraW5kKTsKICAgIHNpbmsud3JpdGVEYXJ0VHlwZU5vZGUocmVjZWl2ZXJUeXBlKTsKICAgIHNpbmsud3JpdGVEYXJ0VHlwZU5vZGUoYXJndW1lbnRUeXBlLCBhbGxvd051bGw6IHRydWUpOwogICAgc2luay5lbmQodGFnKTsKICB9Cn0KCmNsYXNzIF9Gb3JJbkRhdGEgewogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ19Gb3JJbkRhdGEnOwoKICBmaW5hbCBpci5EYXJ0VHlwZSBpdGVyYWJsZVR5cGU7CiAgZmluYWwgaXIuRGFydFR5cGUgaXRlcmF0b3JUeXBlOwogIGZpbmFsIENsYXNzUmVsYXRpb24gaXRlcmF0b3JDbGFzc1JlbGF0aW9uOwogIGZpbmFsIGJvb2wgaXNBc3luYzsKCiAgX0ZvckluRGF0YSh0aGlzLml0ZXJhYmxlVHlwZSwgdGhpcy5pdGVyYXRvclR5cGUsIHRoaXMuaXRlcmF0b3JDbGFzc1JlbGF0aW9uLAogICAgICB7dGhpcy5pc0FzeW5jfSk7CgogIGZhY3RvcnkgX0ZvckluRGF0YS5mcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBpci5EYXJ0VHlwZSBpdGVyYWJsZVR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlTm9kZSgpOwogICAgaXIuRGFydFR5cGUgaXRlcmF0b3JUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZU5vZGUoYWxsb3dOdWxsOiB0cnVlKTsKICAgIENsYXNzUmVsYXRpb24gaXRlcmF0b3JDbGFzc1JlbGF0aW9uID0gc291cmNlLnJlYWRFbnVtKENsYXNzUmVsYXRpb24udmFsdWVzKTsKICAgIGJvb2wgaXNBc3luYyA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgcmV0dXJuIG5ldyBfRm9ySW5EYXRhKGl0ZXJhYmxlVHlwZSwgaXRlcmF0b3JUeXBlLCBpdGVyYXRvckNsYXNzUmVsYXRpb24sCiAgICAgICAgaXNBc3luYzogaXNBc3luYyk7CiAgfQoKICB2b2lkIHRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZURhcnRUeXBlTm9kZShpdGVyYWJsZVR5cGUpOwogICAgc2luay53cml0ZURhcnRUeXBlTm9kZShpdGVyYXRvclR5cGUpOwogICAgc2luay53cml0ZUVudW0oaXRlcmF0b3JDbGFzc1JlbGF0aW9uKTsKICAgIHNpbmsud3JpdGVCb29sKGlzQXN5bmMpOwog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cHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vanNfYmFja2VuZC9hbm5vdGF0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL2VudW1zZXQuZGFydCc7CmltcG9ydCAnYW5ub3RhdGlvbnMuZGFydCc7CmltcG9ydCAnY29uc3RhbnRzLmRhcnQnOwppbXBvcnQgJ2ltcGFjdC5kYXJ0JzsKaW1wb3J0ICdzY29wZS5kYXJ0JzsKCmNsYXNzIE1vZHVsYXJDb3JlIHsKICBmaW5hbCBpci5Db21wb25lbnQgY29tcG9uZW50OwogIGZpbmFsIERhcnQyanNDb25zdGFudEV2YWx1YXRvciBjb25zdGFudEV2YWx1YXRvcjsKCiAgTW9kdWxhckNvcmUodGhpcy5jb21wb25lbnQsIHRoaXMuY29uc3RhbnRFdmFsdWF0b3IpOwp9CgpjbGFzcyBNb2R1bGFyTWVtYmVyRGF0YSB7CiAgZmluYWwgU2NvcGVNb2RlbCBzY29wZU1vZGVsOwogIGZpbmFsIEltcGFjdEJ1aWxkZXJEYXRhIGltcGFjdEJ1aWxkZXJEYXRhOwoKICBNb2R1bGFyTWVtYmVyRGF0YSh0aGlzLnNjb3BlTW9kZWwsIHRoaXMuaW1wYWN0QnVpbGRlckRhdGEpOwp9CgphYnN0cmFjdCBjbGFzcyBNb2R1bGFyU3RyYXRlZ3kgewogIExpc3Q8UHJhZ21hQW5ub3RhdGlvbkRhdGE+IGdldFByYWdtYUFubm90YXRpb25EYXRhKGlyLk1lbWJlciBub2RlKTsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXZvaWQgdGhlIG5lZWQgZm9yIHBhc3NpbmcgW3ByYWdtYUFubm90YXRpb25zXS4KICBNb2R1bGFyTWVtYmVyRGF0YSBnZXRNb2R1bGFyTWVtYmVyRGF0YSgKICAgICAgaXIuTWVtYmVyIG5vZGUsIEVudW1TZXQ8UHJhZ21hQW5ub3RhdGlvbj4gcHJhZ21hQW5ub3RhdGlvbnMpOwp9CigATk48ASg0LzE1ASkfGxkWFQEUIDQBNwIBGh8tAT4CASFGAUoqRAIBJHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL21vZHVsYXIuZGFydCtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pci9zY29wZS5kYXJ0jxgvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAnY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICdzY29wZV92aXNpdG9yLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL2NvbnN0YW50X2V2YWx1YXRvci5kYXJ0JyBhcyBpcjsKCmNsYXNzIFNjb3BlTW9kZWwgewogIGZpbmFsIENsb3N1cmVTY29wZU1vZGVsIGNsb3N1cmVTY29wZU1vZGVsOwogIGZpbmFsIFZhcmlhYmxlU2NvcGVNb2RlbCB2YXJpYWJsZVNjb3BlTW9kZWw7CiAgZmluYWwgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IGluaXRpYWxpemVyQ29tcGxleGl0eTsKCiAgY29uc3QgU2NvcGVNb2RlbCgKICAgICAge3RoaXMuY2xvc3VyZVNjb3BlTW9kZWwsCiAgICAgIHRoaXMudmFyaWFibGVTY29wZU1vZGVsLAogICAgICB0aGlzLmluaXRpYWxpemVyQ29tcGxleGl0eX0pCiAgICAgIDogYXNzZXJ0KGluaXRpYWxpemVyQ29tcGxleGl0eSAhPSBudWxsKTsKCiAgLy8vIEluc3BlY3QgbWVtYmVycyBhbmQgbWFyayBpZiB0aG9zZSBtZW1iZXJzIGNhcHR1cmUgYW55IHN0YXRlIHRoYXQgbmVlZHMgdG8KICAvLy8gYmUgbWFya2VkIGFzIGZyZWUgdmFyaWFibGVzLgogIGZhY3RvcnkgU2NvcGVNb2RlbC5mcm9tKAogICAgICBpci5NZW1iZXIgbm9kZSwgaXIuQ29uc3RhbnRFdmFsdWF0b3IgY29uc3RhbnRFdmFsdWF0b3IpIHsKICAgIFNjb3BlTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU2NvcGVNb2RlbEJ1aWxkZXIoY29uc3RhbnRFdmFsdWF0b3IpOwogICAgcmV0dXJuIGJ1aWxkZXIuY29tcHV0ZU1vZGVsKG5vZGUpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgVmFyaWFibGVTY29wZU1vZGVsIHsKICBWYXJpYWJsZVNjb3BlIGdldFNjb3BlRm9yKGlyLlRyZWVOb2RlIG5vZGUpOwogIEl0ZXJhYmxlPGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IGdldCBhc3NpZ25lZFZhcmlhYmxlczsKICBib29sIGlzRWZmZWN0aXZlbHlGaW5hbChpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpOwp9CgpjbGFzcyBWYXJpYWJsZVNjb3BlTW9kZWxJbXBsIGltcGxlbWVudHMgVmFyaWFibGVTY29wZU1vZGVsIHsKICBNYXA8aXIuVHJlZU5vZGUsIFZhcmlhYmxlU2NvcGU+IF9zY29wZU1hcCA9IHt9OwogIFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBfYXNzaWduZWRWYXJpYWJsZXM7CgogIFZhcmlhYmxlU2NvcGUgY3JlYXRlU2NvcGVGb3IoaXIuVHJlZU5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9zY29wZU1hcFtub2RlXSA/Pz0gbmV3IFZhcmlhYmxlU2NvcGVJbXBsKCk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQXNzaWduZWRWYXJpYWJsZShpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIF9hc3NpZ25lZFZhcmlhYmxlcyA/Pz0gbmV3IFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPigpOwogICAgX2Fzc2lnbmVkVmFyaWFibGVzLmFkZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFZhcmlhYmxlU2NvcGUgZ2V0U2NvcGVGb3IoaXIuVHJlZU5vZGUgbm9kZSkgewogICAgcmV0dXJuIF9zY29wZU1hcFtub2RlXTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IGdldCBhc3NpZ25lZFZhcmlhYmxlcyA9PgogICAgICBfYXNzaWduZWRWYXJpYWJsZXMgPz8gPGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+W107CgogIEBvdmVycmlkZQogIGJvb2wgaXNFZmZlY3RpdmVseUZpbmFsKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgcmV0dXJuIF9hc3NpZ25lZFZhcmlhYmxlcyA9PSBudWxsIHx8ICFfYXNzaWduZWRWYXJpYWJsZXMuY29udGFpbnMobm9kZSk7CiAgfQp9CgovLy8gVmFyaWFibGUgaW5mb3JtYXRpb24gZm9yIGEgc2NvcGUuCmFic3RyYWN0IGNsYXNzIFZhcmlhYmxlU2NvcGUgewogIC8vLyBSZXR1cm5zIHRoZSBzZXQgb2YgW2lyLlZhcmlhYmxlRGVjbGFyYXRpb25dcyB0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZCB0byBpbgogIC8vLyB0aGlzIHNjb3BlLgogIEl0ZXJhYmxlPGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IGdldCBhc3NpZ25lZFZhcmlhYmxlczsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc2NvcGUgaGFzIGEgW2lyLkNvbnRpbnVlU3dpdGNoU3RhdGVtZW50XS4KICBib29sIGdldCBoYXNDb250aW51ZVN3aXRjaDsKfQoKY2xhc3MgVmFyaWFibGVTY29wZUltcGwgaW1wbGVtZW50cyBWYXJpYWJsZVNjb3BlIHsKICBMaXN0PFZhcmlhYmxlU2NvcGU+IF9zdWJTY29wZXM7CiAgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IF9hc3NpZ25lZFZhcmlhYmxlczsKICBAb3ZlcnJpZGUKICBib29sIGhhc0NvbnRpbnVlU3dpdGNoID0gZmFsc2U7CgogIHZvaWQgYWRkU3ViU2NvcGUoVmFyaWFibGVTY29wZSBzY29wZSkgewogICAgX3N1YlNjb3BlcyA/Pz0gPFZhcmlhYmxlU2NvcGU+W107CiAgICBfc3ViU2NvcGVzLmFkZChzY29wZSk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQXNzaWduZWRWYXJpYWJsZShpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICBfYXNzaWduZWRWYXJpYWJsZXMgPz89IG5ldyBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4oKTsKICAgIF9hc3NpZ25lZFZhcmlhYmxlcy5hZGQodmFyaWFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gZ2V0IGFzc2lnbmVkVmFyaWFibGVzIHN5bmMqIHsKICAgIGlmIChfYXNzaWduZWRWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICB5aWVsZCogX2Fzc2lnbmVkVmFyaWFibGVzOwogICAgfQogICAgaWYgKF9zdWJTY29wZXMgIT0gbnVsbCkgewogICAgICBmb3IgKFZhcmlhYmxlU2NvcGUgc3ViU2NvcGUgaW4gX3N1YlNjb3BlcykgewogICAgICAgIHlpZWxkKiBzdWJTY29wZS5hc3NpZ25lZFZhcmlhYmxlczsKICAgICAgfQogICAgfQogIH0KfQoKYWJzdHJhY3QgY2xhc3MgVmFyaWFibGVDb2xsZWN0b3JNaXhpbiB7CiAgVmFyaWFibGVTY29wZUltcGwgY3VycmVudFZhcmlhYmxlU2NvcGU7CiAgVmFyaWFibGVTY29wZU1vZGVsSW1wbCB2YXJpYWJsZVNjb3BlTW9kZWwgPSBuZXcgVmFyaWFibGVTY29wZU1vZGVsSW1wbCgpOwoKICB2b2lkIHZpc2l0SW5WYXJpYWJsZVNjb3BlKGlyLlRyZWVOb2RlIHJvb3QsIHZvaWQgZigpKSB7CiAgICBWYXJpYWJsZVNjb3BlSW1wbCBvbGRTY29wZSA9IGN1cnJlbnRWYXJpYWJsZVNjb3BlOwogICAgY3VycmVudFZhcmlhYmxlU2NvcGUgPSB2YXJpYWJsZVNjb3BlTW9kZWwuY3JlYXRlU2NvcGVGb3Iocm9vdCk7CiAgICBvbGRTY29wZT8uYWRkU3ViU2NvcGUoY3VycmVudFZhcmlhYmxlU2NvcGUpOwogICAgZigpOwogICAgY3VycmVudFZhcmlhYmxlU2NvcGUgPSBvbGRTY29wZTsKICB9CgogIHZvaWQgcmVnaXN0ZXJBc3NpZ25lZFZhcmlhYmxlKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgY3VycmVudFZhcmlhYmxlU2NvcGU/LnJlZ2lzdGVyQXNzaWduZWRWYXJpYWJsZShub2RlKTsKICAgIHZhcmlhYmxlU2NvcGVNb2RlbC5yZWdpc3RlckFzc2lnbmVkVmFyaWFibGUobm9kZSk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQ29udGludWVTd2l0Y2goKSB7CiAgICBjdXJyZW50VmFyaWFibGVTY29wZT8uaGFzQ29udGludWVTd2l0Y2ggPSB0cnVlOwogIH0KfQp9AE5OPAEoFx1MARMtLzUBFB8fIy8BUCMbQEonBAIBJC86OAIBPTIyATM4BAE/PiIEAQwwHAQBDDw4AQw5TQQCASYfURI6AUceAgEzIjIMIgEqJhsEAUM+JgQBDEEmIQYeMysIBgQCASgqTAE6N0QxCSUEAT86NwQBIjQEAgEicGFja2FnZTpjb21waWxlci9zcmMvaXIvc2NvcGUuZGFydDtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2JhY2tlbmRfdXNhZ2UuZGFydLxbLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9mcm9udGVuZF9zdHJhdGVneS5kYXJ0JzsKaW1wb3J0ICcuLi9pci9ydW50aW1lX3R5cGVfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2ZlYXR1cmUuZGFydCc7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgU2V0bGV0OwppbXBvcnQgJ2JhY2tlbmRfaW1wYWN0LmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgQmFja2VuZFVzYWdlIHsKICAvLy8gRGVzZXJpYWxpemVzIGEgW0JhY2tlbmRVc2FnZV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBCYWNrZW5kVXNhZ2UucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSA9CiAgICAgIEJhY2tlbmRVc2FnZUltcGwucmVhZEZyb21EYXRhU291cmNlOwoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtCYWNrZW5kVXNhZ2VdIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKTsKCiAgYm9vbCBuZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnOwogIGJvb2wgbmVlZFRvSW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbZWxlbWVudF0gaXMgYSBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIGJhY2tlbmQuCiAgYm9vbCBpc0Z1bmN0aW9uVXNlZEJ5QmFja2VuZChGdW5jdGlvbkVudGl0eSBlbGVtZW50KTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtlbGVtZW50XSBpcyBhbiBpbnN0YW5jZSBmaWVsZCBvZiBhIGNsYXNzIGluc3RhbnRpYXRlZAogIC8vLyBieSB0aGUgYmFja2VuZC4KICBib29sIGlzRmllbGRVc2VkQnlCYWNrZW5kKEZpZWxkRW50aXR5IGVsZW1lbnQpOwoKICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZ2V0IGdsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzOwoKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGdsb2JhbENsYXNzRGVwZW5kZW5jaWVzOwoKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGhlbHBlckNsYXNzZXNVc2VkOwoKICBJdGVyYWJsZTxSdW50aW1lVHlwZVVzZT4gZ2V0IHJ1bnRpbWVUeXBlVXNlczsKCiAgLy8vIGB0cnVlYCBpZiBhIGNvcmUtbGlicmFyeSBmdW5jdGlvbiByZXF1aXJlcyB0aGUgcHJlYW1ibGUgZmlsZSB0byBmdW5jdGlvbi4KICBib29sIGdldCByZXF1aXJlc1ByZWFtYmxlOwoKICAvLy8gYHRydWVgIG9mIGBPYmplY3QucnVudGltZVR5cGVgIGlzIHVzZWQuCiAgYm9vbCBnZXQgaXNSdW50aW1lVHlwZVVzZWQ7CgogIC8vLyBgdHJ1ZWAgaWYgYEZ1bmN0aW9uLmFwcGx5YCBpcyB1c2VkLgogIGJvb2wgZ2V0IGlzRnVuY3Rpb25BcHBseVVzZWQ7CgogIC8vLyBgdHJ1ZWAgaWYgJ2RhcnQ6bWlycm9ycycgZmVhdHVyZXMgYXJlIHVzZWQuCiAgYm9vbCBnZXQgaXNNaXJyb3JzVXNlZDsKCiAgLy8vIGB0cnVlYCBpZiBgbm9TdWNoTWV0aG9kYCBpcyB1c2VkLgogIGJvb2wgZ2V0IGlzTm9TdWNoTWV0aG9kVXNlZDsKCiAgLy8vIGB0cnVlYCBpZiB0aGUgYGRhcnQ6aHRtbGAgaXMgbG9hZGVkLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoaXMgaXMgYWx3YXlzIGB0cnVlYCB3aXRoIHRoZSBDRkUuCiAgYm9vbCBnZXQgaXNIdG1sTG9hZGVkOwp9CgphYnN0cmFjdCBjbGFzcyBCYWNrZW5kVXNhZ2VCdWlsZGVyIHsKICAvLy8gVGhlIGJhY2tlbmQgbXVzdCAqYWx3YXlzKiBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gZW5xdWV1aW5nIGFuIGZ1bmN0aW9uCiAgLy8vIGVsZW1lbnQuIENhbGxzIGRvbmUgYnkgdGhlIGJhY2tlbmQgYXJlIG5vdCBzZWVuIGJ5IGdsb2JhbAogIC8vLyBvcHRpbWl6YXRpb25zLCBzbyB0aGV5IHdvdWxkIG1ha2UgdGhlc2Ugb3B0aW1pemF0aW9ucyB1bnNvdW5kLgogIC8vLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBjb2xsZWN0IHRoZSBsaXN0IG9mIG1ldGhvZHMgdGhlIGJhY2tlbmQgbWF5CiAgLy8vIGNhbGwuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVwbGFjZSB0aGlzIHdpdGggYSBtb3JlIHByZWNpc2UgbW9kZWxsaW5nOyB0eXBlCiAgLy8gaW5mZXJlbmNlIG9mIHBhcmFtZXRlcnMgb2YgdGhlc2UgZnVuY3Rpb25zIGlzIGRpc2FibGVkLgogIHZvaWQgcmVnaXN0ZXJCYWNrZW5kRnVuY3Rpb25Vc2UoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCk7CgogIC8vLyBUaGUgYmFja2VuZCBtdXN0ICphbHdheXMqIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiBpbnN0YW50aWF0aW5nIGEgY2xhc3MuCiAgLy8vIEluc3RhbnRpYXRpb25zIGRvbmUgYnkgdGhlIGJhY2tlbmQgYXJlIG5vdCBzZWVuIGJ5IGdsb2JhbCBvcHRpbWl6YXRpb25zLAogIC8vLyBzbyB0aGV5IHdvdWxkIG1ha2UgdGhlc2Ugb3B0aW1pemF0aW9ucyB1bnNvdW5kLiBUaGVyZWZvcmUgd2UgbmVlZCB0bwogIC8vLyBjb2xsZWN0IHRoZSBsaXN0IG9mIGNsYXNzZXMgdGhlIGJhY2tlbmQgbWF5IGluc3RhbnRpYXRlLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlcGxhY2UgdGhpcyB3aXRoIGEgbW9yZSBwcmVjaXNlIG1vZGVsbGluZzsgdHlwZQogIC8vIGluZmVyZW5jZSBvZiB0aGUgaW5zdGFuY2UgZmllbGRzIG9mIHRoZXNlIGNsYXNzZXMgaXMgZGlzYWJsZWQuCiAgdm9pZCByZWdpc3RlckJhY2tlbmRDbGFzc1VzZShDbGFzc0VudGl0eSBlbGVtZW50KTsKCiAgdm9pZCByZWdpc3Rlckdsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jeShGdW5jdGlvbkVudGl0eSBlbGVtZW50KTsKICB2b2lkIHJlZ2lzdGVyR2xvYmFsQ2xhc3NEZXBlbmRlbmN5KENsYXNzRW50aXR5IGVsZW1lbnQpOwoKICAvLy8gQ29sbGVjdCBiYWNrZW5kIHVzZSBmcm9tIFtiYWNrZW5kSW1wYWN0XS4KICB2b2lkIHByb2Nlc3NCYWNrZW5kSW1wYWN0KEJhY2tlbmRJbXBhY3QgYmFja2VuZEltcGFjdCk7CgogIHZvaWQgcmVnaXN0ZXJVc2VkTWVtYmVyKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICAvLy8gUmVnaXN0ZXIgdXNlIG9mIGBydW50aW1lVHlwZWAuCiAgdm9pZCByZWdpc3RlclJ1bnRpbWVUeXBlVXNlKFJ1bnRpbWVUeXBlVXNlIHJ1bnRpbWVUeXBlVXNlKTsKCiAgLy8vIGB0cnVlYCBpZiBgRnVuY3Rpb24uYXBwbHlgIGlzIHVzZWQuCiAgYm9vbCBpc0Z1bmN0aW9uQXBwbHlVc2VkOwoKICAvLy8gYHRydWVgIGlmIGBub1N1Y2hNZXRob2RgIGlzIHVzZWQuCiAgYm9vbCBpc05vU3VjaE1ldGhvZFVzZWQ7CgogIC8vLyBSZWdpc3RlciB0aGF0IGBkYXJ0Omh0bWxgIGlzIGxvYWRlZC4KICB2b2lkIHJlZ2lzdGVySHRtbElzTG9hZGVkKCk7CgogIEJhY2tlbmRVc2FnZSBjbG9zZSgpOwp9CgpjbGFzcyBCYWNrZW5kVXNhZ2VCdWlsZGVySW1wbCBpbXBsZW1lbnRzIEJhY2tlbmRVc2FnZUJ1aWxkZXIgewogIEZyb250ZW5kU3RyYXRlZ3kgX2Zyb250ZW5kU3RyYXRlZ3k7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoZSBuZWVkIGZvciB0aGVzZS4KICBTZXRsZXQ8RnVuY3Rpb25FbnRpdHk+IF9nbG9iYWxGdW5jdGlvbkRlcGVuZGVuY2llczsKICBTZXRsZXQ8Q2xhc3NFbnRpdHk+IF9nbG9iYWxDbGFzc0RlcGVuZGVuY2llczsKCiAgLy8vIExpc3Qgb2YgbWV0aG9kcyB0aGF0IHRoZSBiYWNrZW5kIG1heSB1c2UuCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBfaGVscGVyRnVuY3Rpb25zVXNlZCA9IG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CgogIC8vLyBMaXN0IG9mIGNsYXNzZXMgdGhhdCB0aGUgYmFja2VuZCBtYXkgdXNlLgogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gX2hlbHBlckNsYXNzZXNVc2VkID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgZmluYWwgU2V0PFJ1bnRpbWVUeXBlVXNlPiBfcnVudGltZVR5cGVVc2VzID0gbmV3IFNldDxSdW50aW1lVHlwZVVzZT4oKTsKCiAgYm9vbCBfbmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZyA9IGZhbHNlOwogIGJvb2wgX25lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5ID0gZmFsc2U7CgogIC8vLyBgdHJ1ZWAgaWYgYSBjb3JlLWxpYnJhcnkgZnVuY3Rpb24gcmVxdWlyZXMgdGhlIHByZWFtYmxlIGZpbGUgdG8gZnVuY3Rpb24uCiAgYm9vbCByZXF1aXJlc1ByZWFtYmxlID0gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgaXNGdW5jdGlvbkFwcGx5VXNlZCA9IGZhbHNlOwoKICAvLy8gYHRydWVgIGlmICdkYXJ0Om1pcnJvcnMnIGZlYXR1cmVzIGFyZSB1c2VkLgogIGJvb2wgaXNNaXJyb3JzVXNlZCA9IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGlzTm9TdWNoTWV0aG9kVXNlZCA9IGZhbHNlOwoKICBib29sIGlzSHRtbExvYWRlZCA9IGZhbHNlOwoKICBCYWNrZW5kVXNhZ2VCdWlsZGVySW1wbCh0aGlzLl9mcm9udGVuZFN0cmF0ZWd5KTsKCiAgS0NvbW1vbkVsZW1lbnRzIGdldCBfY29tbW9uRWxlbWVudHMgPT4gX2Zyb250ZW5kU3RyYXRlZ3kuY29tbW9uRWxlbWVudHM7CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJCYWNrZW5kRnVuY3Rpb25Vc2UoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KF9pc1ZhbGlkQmFja2VuZFVzZShlbGVtZW50LCBlbGVtZW50LmxpYnJhcnkpLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICJCYWNrZW5kIHVzZSBvZiAkZWxlbWVudCBpcyBub3QgYWxsb3dlZC4iKSk7CiAgICBfaGVscGVyRnVuY3Rpb25zVXNlZC5hZGQoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQmFja2VuZENsYXNzVXNlKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChfaXNWYWxpZEJhY2tlbmRVc2UoZWxlbWVudCwgZWxlbWVudC5saWJyYXJ5KSwKICAgICAgICBmYWlsZWRBdChlbGVtZW50LCAiQmFja2VuZCB1c2Ugb2YgJGVsZW1lbnQgaXMgbm90IGFsbG93ZWQuIikpOwogICAgX2hlbHBlckNsYXNzZXNVc2VkLmFkZChlbGVtZW50KTsKICB9CgogIGJvb2wgX2lzVmFsaWRCYWNrZW5kVXNlKEVudGl0eSBlbGVtZW50LCBMaWJyYXJ5RW50aXR5IGxpYnJhcnkpIHsKICAgIGlmIChfaXNWYWxpZEVudGl0eShlbGVtZW50KSkgcmV0dXJuIHRydWU7CiAgICBTb3VyY2VTcGFuIHNwYW4gPSBfZnJvbnRlbmRTdHJhdGVneS5zcGFuRnJvbVNwYW5uYWJsZShlbGVtZW50LCBlbGVtZW50KTsKICAgIGlmIChsaWJyYXJ5LmNhbm9uaWNhbFVyaS5zY2hlbWUgPT0gJ2RhcnQnICYmCiAgICAgICAgc3Bhbi51cmkucGF0aC5jb250YWlucygnX2ludGVybmFsL2pzX3J1bnRpbWUvbGliLycpKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFdlIHNob3VsZCBiZSBtb3JlIHByZWNpc2UgYWJvdXQgdGhlc2UuCiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgYm9vbCBfaXNWYWxpZEVudGl0eShFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQgaXMgQ29uc3RydWN0b3JFbnRpdHkgJiYKICAgICAgICAoZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuc3RyZWFtSXRlcmF0b3JDb25zdHJ1Y3RvciB8fAogICAgICAgICAgICBfY29tbW9uRWxlbWVudHMuaXNTeW1ib2xDb25zdHJ1Y3RvcihlbGVtZW50KSB8fAogICAgICAgICAgICBfY29tbW9uRWxlbWVudHMuaXNTeW1ib2xWYWxpZGF0ZWRDb25zdHJ1Y3RvcihlbGVtZW50KSkpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVGhlc2UgYXJlIHZhbGlkIGJ1dCB3ZSBjb3VsZCBiZSBtb3JlIHByZWNpc2UuCiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5zeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMub2JqZWN0Tm9TdWNoTWV0aG9kKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoZXNlIGFyZSB2YWxpZCBidXQgd2UgY291bGQgYmUgbW9yZSBwcmVjaXNlLgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMubGlzdENsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMubWFwTGl0ZXJhbENsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuc2V0TGl0ZXJhbENsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMudW5tb2RpZmlhYmxlU2V0Q2xhc3MgfHwKICAgICAgICBlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5mdW5jdGlvbkNsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuc3RyaW5nQ2xhc3MpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXZvaWQgdGhlc2UuCiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBfcHJvY2Vzc0JhY2tlbmRTdGF0aWNVc2UoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwKICAgICAge2Jvb2wgaXNHbG9iYWw6IGZhbHNlfSkgewogICAgcmVnaXN0ZXJCYWNrZW5kRnVuY3Rpb25Vc2UoZWxlbWVudCk7CiAgICBpZiAoaXNHbG9iYWwpIHsKICAgICAgcmVnaXN0ZXJHbG9iYWxGdW5jdGlvbkRlcGVuZGVuY3koZWxlbWVudCk7CiAgICB9CiAgfQoKICB2b2lkIF9wcm9jZXNzQmFja2VuZEluc3RhbnRpYXRpb24oQ2xhc3NFbnRpdHkgY2xzLCB7Ym9vbCBpc0dsb2JhbDogZmFsc2V9KSB7CiAgICByZWdpc3RlckJhY2tlbmRDbGFzc1VzZShjbHMpOwogICAgaWYgKGlzR2xvYmFsKSB7CiAgICAgIHJlZ2lzdGVyR2xvYmFsQ2xhc3NEZXBlbmRlbmN5KGNscyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByb2Nlc3NCYWNrZW5kSW1wYWN0KEJhY2tlbmRJbXBhY3QgYmFja2VuZEltcGFjdCkgewogICAgZm9yIChGdW5jdGlvbkVudGl0eSBzdGF0aWNVc2UgaW4gYmFja2VuZEltcGFjdC5zdGF0aWNVc2VzKSB7CiAgICAgIGFzc2VydChzdGF0aWNVc2UgIT0gbnVsbCk7CiAgICAgIF9wcm9jZXNzQmFja2VuZFN0YXRpY1VzZShzdGF0aWNVc2UpOwogICAgfQogICAgZm9yIChGdW5jdGlvbkVudGl0eSBzdGF0aWNVc2UgaW4gYmFja2VuZEltcGFjdC5nbG9iYWxVc2VzKSB7CiAgICAgIGFzc2VydChzdGF0aWNVc2UgIT0gbnVsbCk7CiAgICAgIF9wcm9jZXNzQmFja2VuZFN0YXRpY1VzZShzdGF0aWNVc2UsIGlzR2xvYmFsOiB0cnVlKTsKICAgIH0KICAgIGZvciAoSW50ZXJmYWNlVHlwZSBpbnN0YW50aWF0ZWRUeXBlIGluIGJhY2tlbmRJbXBhY3QuaW5zdGFudGlhdGVkVHlwZXMpIHsKICAgICAgcmVnaXN0ZXJCYWNrZW5kQ2xhc3NVc2UoaW5zdGFudGlhdGVkVHlwZS5lbGVtZW50KTsKICAgIH0KICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xzIGluIGJhY2tlbmRJbXBhY3QuaW5zdGFudGlhdGVkQ2xhc3NlcykgewogICAgICBfcHJvY2Vzc0JhY2tlbmRJbnN0YW50aWF0aW9uKGNscyk7CiAgICB9CiAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBiYWNrZW5kSW1wYWN0Lmdsb2JhbENsYXNzZXMpIHsKICAgICAgX3Byb2Nlc3NCYWNrZW5kSW5zdGFudGlhdGlvbihjbHMsIGlzR2xvYmFsOiB0cnVlKTsKICAgIH0KICAgIGZvciAoQmFja2VuZEltcGFjdCBvdGhlckltcGFjdCBpbiBiYWNrZW5kSW1wYWN0Lm90aGVySW1wYWN0cykgewogICAgICBwcm9jZXNzQmFja2VuZEltcGFjdChvdGhlckltcGFjdCk7CiAgICB9CiAgICBmb3IgKEJhY2tlbmRGZWF0dXJlIGZlYXR1cmUgaW4gYmFja2VuZEltcGFjdC5mZWF0dXJlcykgewogICAgICBzd2l0Y2ggKGZlYXR1cmUpIHsKICAgICAgICBjYXNlIEJhY2tlbmRGZWF0dXJlLm5lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5OgogICAgICAgICAgX25lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5ID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQmFja2VuZEZlYXR1cmUubmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZzoKICAgICAgICAgIF9uZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyVXNlZE1lbWJlcihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyID09IF9jb21tb25FbGVtZW50cy5nZXRJc29sYXRlQWZmaW5pdHlUYWdNYXJrZXIpIHsKICAgICAgX25lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWcgPSB0cnVlOwogICAgfSBlbHNlIGlmIChtZW1iZXIgPT0gX2NvbW1vbkVsZW1lbnRzLnJlcXVpcmVzUHJlYW1ibGVNYXJrZXIpIHsKICAgICAgcmVxdWlyZXNQcmVhbWJsZSA9IHRydWU7CiAgICB9IGVsc2UgaWYgKF9jb21tb25FbGVtZW50cy5pc0Z1bmN0aW9uQXBwbHlNZXRob2QobWVtYmVyKSkgewogICAgICBpc0Z1bmN0aW9uQXBwbHlVc2VkID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAobWVtYmVyLmxpYnJhcnkgPT0gX2NvbW1vbkVsZW1lbnRzLm1pcnJvcnNMaWJyYXJ5KSB7CiAgICAgIGlzTWlycm9yc1VzZWQgPSB0cnVlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlckdsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jeShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoZWxlbWVudCAhPSBudWxsKTsKICAgIGlmIChfZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXMgPT0gbnVsbCkgewogICAgICBfZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXMgPSBuZXcgU2V0bGV0PEZ1bmN0aW9uRW50aXR5PigpOwogICAgfQogICAgX2dsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzLmFkZChlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJHbG9iYWxDbGFzc0RlcGVuZGVuY3koQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KGVsZW1lbnQgIT0gbnVsbCk7CiAgICBpZiAoX2dsb2JhbENsYXNzRGVwZW5kZW5jaWVzID09IG51bGwpIHsKICAgICAgX2dsb2JhbENsYXNzRGVwZW5kZW5jaWVzID0gbmV3IFNldGxldDxDbGFzc0VudGl0eT4oKTsKICAgIH0KICAgIF9nbG9iYWxDbGFzc0RlcGVuZGVuY2llcy5hZGQoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUnVudGltZVR5cGVVc2UoUnVudGltZVR5cGVVc2UgcnVudGltZVR5cGVVc2UpIHsKICAgIF9ydW50aW1lVHlwZVVzZXMuYWRkKHJ1bnRpbWVUeXBlVXNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJIdG1sSXNMb2FkZWQoKSB7CiAgICBpc0h0bWxMb2FkZWQgPSB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgQmFja2VuZFVzYWdlIGNsb3NlKCkgewogICAgcmV0dXJuIG5ldyBCYWNrZW5kVXNhZ2VJbXBsKAogICAgICAgIGdsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzOiBfZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXMsCiAgICAgICAgZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXM6IF9nbG9iYWxDbGFzc0RlcGVuZGVuY2llcywKICAgICAgICBoZWxwZXJGdW5jdGlvbnNVc2VkOiBfaGVscGVyRnVuY3Rpb25zVXNlZCwKICAgICAgICBoZWxwZXJDbGFzc2VzVXNlZDogX2hlbHBlckNsYXNzZXNVc2VkLAogICAgICAgIG5lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWc6IF9uZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnLAogICAgICAgIG5lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5OiBfbmVlZFRvSW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHksCiAgICAgICAgcmVxdWlyZXNQcmVhbWJsZTogcmVxdWlyZXNQcmVhbWJsZSwKICAgICAgICBydW50aW1lVHlwZVVzZXM6IF9ydW50aW1lVHlwZVVzZXMsCiAgICAgICAgaXNGdW5jdGlvbkFwcGx5VXNlZDogaXNGdW5jdGlvbkFwcGx5VXNlZCwKICAgICAgICBpc01pcnJvcnNVc2VkOiBpc01pcnJvcnNVc2VkLAogICAgICAgIGlzTm9TdWNoTWV0aG9kVXNlZDogaXNOb1N1Y2hNZXRob2RVc2VkLAogICAgICAgIGlzSHRtbExvYWRlZDogaXNIdG1sTG9hZGVkKTsKICB9Cn0KCmNsYXNzIEJhY2tlbmRVc2FnZUltcGwgaW1wbGVtZW50cyBCYWNrZW5kVXNhZ2UgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbQmFja2VuZFVzYWdlXSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ2JhY2tlbmQtdXNhZ2UnOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhlIG5lZWQgZm9yIHRoZXNlLgogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gX2dsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzOwogIGZpbmFsIFNldDxDbGFzc0VudGl0eT4gX2dsb2JhbENsYXNzRGVwZW5kZW5jaWVzOwoKICAvLy8gU2V0IG9mIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlIGJhY2tlbmQuCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBfaGVscGVyRnVuY3Rpb25zVXNlZDsKCiAgLy8vIFNldCBvZiBjbGFzc2VzIGluc3RhbnRpYXRlZCBieSB0aGUgYmFja2VuZC4KICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IF9oZWxwZXJDbGFzc2VzVXNlZDsKCiAgZmluYWwgU2V0PFJ1bnRpbWVUeXBlVXNlPiBfcnVudGltZVR5cGVVc2VzOwoKICBAb3ZlcnJpZGUKICBib29sIG5lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWc7CiAgQG92ZXJyaWRlCiAgYm9vbCBuZWVkVG9Jbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCByZXF1aXJlc1ByZWFtYmxlOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzRnVuY3Rpb25BcHBseVVzZWQ7CgogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgaXNNaXJyb3JzVXNlZDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc05vU3VjaE1ldGhvZFVzZWQ7CgogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgaXNIdG1sTG9hZGVkOwoKICBCYWNrZW5kVXNhZ2VJbXBsKAogICAgICB7U2V0PEZ1bmN0aW9uRW50aXR5PiBnbG9iYWxGdW5jdGlvbkRlcGVuZGVuY2llcywKICAgICAgU2V0PENsYXNzRW50aXR5PiBnbG9iYWxDbGFzc0RlcGVuZGVuY2llcywKICAgICAgU2V0PEZ1bmN0aW9uRW50aXR5PiBoZWxwZXJGdW5jdGlvbnNVc2VkLAogICAgICBTZXQ8Q2xhc3NFbnRpdHk+IGhlbHBlckNsYXNzZXNVc2VkLAogICAgICB0aGlzLm5lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWcsCiAgICAgIHRoaXMubmVlZFRvSW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHksCiAgICAgIHRoaXMucmVxdWlyZXNQcmVhbWJsZSwKICAgICAgU2V0PFJ1bnRpbWVUeXBlVXNlPiBydW50aW1lVHlwZVVzZXMsCiAgICAgIHRoaXMuaXNGdW5jdGlvbkFwcGx5VXNlZCwKICAgICAgdGhpcy5pc01pcnJvcnNVc2VkLAogICAgICB0aGlzLmlzTm9TdWNoTWV0aG9kVXNlZCwKICAgICAgdGhpcy5pc0h0bWxMb2FkZWR9KQogICAgICA6IHRoaXMuX2dsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzID0gZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXMsCiAgICAgICAgdGhpcy5fZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXMgPSBnbG9iYWxDbGFzc0RlcGVuZGVuY2llcywKICAgICAgICB0aGlzLl9oZWxwZXJGdW5jdGlvbnNVc2VkID0gaGVscGVyRnVuY3Rpb25zVXNlZCwKICAgICAgICB0aGlzLl9oZWxwZXJDbGFzc2VzVXNlZCA9IGhlbHBlckNsYXNzZXNVc2VkLAogICAgICAgIHRoaXMuX3J1bnRpbWVUeXBlVXNlcyA9IHJ1bnRpbWVUeXBlVXNlczsKCiAgZmFjdG9yeSBCYWNrZW5kVXNhZ2VJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgc291cmNlLmJlZ2luKHRhZyk7CiAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IGdsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RnVuY3Rpb25FbnRpdHk+KCkudG9TZXQoKTsKICAgIFNldDxDbGFzc0VudGl0eT4gZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXMgPSBzb3VyY2UucmVhZENsYXNzZXMoKS50b1NldCgpOwogICAgU2V0PEZ1bmN0aW9uRW50aXR5PiBoZWxwZXJGdW5jdGlvbnNVc2VkID0KICAgICAgICBzb3VyY2UucmVhZE1lbWJlcnM8RnVuY3Rpb25FbnRpdHk+KCkudG9TZXQoKTsKICAgIFNldDxDbGFzc0VudGl0eT4gaGVscGVyQ2xhc3Nlc1VzZWQgPSBzb3VyY2UucmVhZENsYXNzZXMoKS50b1NldCgpOwogICAgU2V0PFJ1bnRpbWVUeXBlVXNlPiBydW50aW1lVHlwZVVzZXMgPSBzb3VyY2UucmVhZExpc3QoKCkgewogICAgICBSdW50aW1lVHlwZVVzZUtpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShSdW50aW1lVHlwZVVzZUtpbmQudmFsdWVzKTsKICAgICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gc291cmNlLnJlYWREYXJ0VHlwZSgpOwogICAgICBEYXJ0VHlwZSBhcmd1bWVudFR5cGUgPSBzb3VyY2UucmVhZERhcnRUeXBlKGFsbG93TnVsbDogdHJ1ZSk7CiAgICAgIHJldHVybiBuZXcgUnVudGltZVR5cGVVc2Uoa2luZCwgcmVjZWl2ZXJUeXBlLCBhcmd1bWVudFR5cGUpOwogICAgfSkudG9TZXQoKTsKICAgIGJvb2wgbmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZyA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBuZWVkVG9Jbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eSA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCByZXF1aXJlc1ByZWFtYmxlID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBib29sIGlzRnVuY3Rpb25BcHBseVVzZWQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNNaXJyb3JzVXNlZCA9IHNvdXJjZS5yZWFkQm9vbCgpOwogICAgYm9vbCBpc05vU3VjaE1ldGhvZFVzZWQgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGJvb2wgaXNIdG1sTG9hZGVkID0gc291cmNlLnJlYWRCb29sKCk7CiAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICByZXR1cm4gbmV3IEJhY2tlbmRVc2FnZUltcGwoCiAgICAgICAgZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXM6IGdsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzLAogICAgICAgIGdsb2JhbENsYXNzRGVwZW5kZW5jaWVzOiBnbG9iYWxDbGFzc0RlcGVuZGVuY2llcywKICAgICAgICBoZWxwZXJGdW5jdGlvbnNVc2VkOiBoZWxwZXJGdW5jdGlvbnNVc2VkLAogICAgICAgIGhlbHBlckNsYXNzZXNVc2VkOiBoZWxwZXJDbGFzc2VzVXNlZCwKICAgICAgICBydW50aW1lVHlwZVVzZXM6IHJ1bnRpbWVUeXBlVXNlcywKICAgICAgICBuZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnOiBuZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnLAogICAgICAgIG5lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5OiBuZWVkVG9Jbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eSwKICAgICAgICByZXF1aXJlc1ByZWFtYmxlOiByZXF1aXJlc1ByZWFtYmxlLAogICAgICAgIGlzRnVuY3Rpb25BcHBseVVzZWQ6IGlzRnVuY3Rpb25BcHBseVVzZWQsCiAgICAgICAgaXNNaXJyb3JzVXNlZDogaXNNaXJyb3JzVXNlZCwKICAgICAgICBpc05vU3VjaE1ldGhvZFVzZWQ6IGlzTm9TdWNoTWV0aG9kVXNlZCwKICAgICAgICBpc0h0bWxMb2FkZWQ6IGlzSHRtbExvYWRlZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICBzaW5rLmJlZ2luKHRhZyk7CiAgICBzaW5rLndyaXRlTWVtYmVycyhfZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXMpOwogICAgc2luay53cml0ZUNsYXNzZXMoX2dsb2JhbENsYXNzRGVwZW5kZW5jaWVzKTsKICAgIHNpbmsud3JpdGVNZW1iZXJzKF9oZWxwZXJGdW5jdGlvbnNVc2VkKTsKICAgIHNpbmsud3JpdGVDbGFzc2VzKF9oZWxwZXJDbGFzc2VzVXNlZCk7CiAgICBzaW5rLndyaXRlTGlzdChydW50aW1lVHlwZVVzZXMsIChSdW50aW1lVHlwZVVzZSBydW50aW1lVHlwZVVzZSkgewogICAgICBzaW5rLndyaXRlRW51bShydW50aW1lVHlwZVVzZS5raW5kKTsKICAgICAgc2luay53cml0ZURhcnRUeXBlKHJ1bnRpbWVUeXBlVXNlLnJlY2VpdmVyVHlwZSk7CiAgICAgIHNpbmsud3JpdGVEYXJ0VHlwZShydW50aW1lVHlwZVVzZS5hcmd1bWVudFR5cGUsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICB9KTsKICAgIHNpbmsud3JpdGVCb29sKG5lZWRUb0luaXRpYWxpemVJc29sYXRlQWZmaW5pdHlUYWcpOwogICAgc2luay53cml0ZUJvb2wobmVlZFRvSW5pdGlhbGl6ZURpc3BhdGNoUHJvcGVydHkpOwogICAgc2luay53cml0ZUJvb2wocmVxdWlyZXNQcmVhbWJsZSk7CiAgICBzaW5rLndyaXRlQm9vbChpc0Z1bmN0aW9uQXBwbHlVc2VkKTsKICAgIHNpbmsud3JpdGVCb29sKGlzTWlycm9yc1VzZWQpOwogICAgc2luay53cml0ZUJvb2woaXNOb1N1Y2hNZXRob2RVc2VkKTsKICAgIHNpbmsud3JpdGVCb29sKGlzSHRtbExvYWRlZCk7CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Z1bmN0aW9uVXNlZEJ5QmFja2VuZChGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gX2hlbHBlckZ1bmN0aW9uc1VzZWQuY29udGFpbnMoZWxlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRmllbGRVc2VkQnlCYWNrZW5kKEZpZWxkRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBfaGVscGVyQ2xhc3Nlc1VzZWQuY29udGFpbnMoZWxlbWVudC5lbmNsb3NpbmdDbGFzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gZ2V0IGdsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jaWVzID0+CiAgICAgIF9nbG9iYWxGdW5jdGlvbkRlcGVuZGVuY2llcyA/PyBjb25zdCA8RnVuY3Rpb25FbnRpdHk+W107CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXMgPT4KICAgICAgX2dsb2JhbENsYXNzRGVwZW5kZW5jaWVzID8/IGNvbnN0IDxDbGFzc0VudGl0eT5bXTsKCiAgSXRlcmFibGU8RnVuY3Rpb25FbnRpdHk+IGdldCBoZWxwZXJGdW5jdGlvbnNVc2VkID0+IF9oZWxwZXJGdW5jdGlvbnNVc2VkOwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGhlbHBlckNsYXNzZXNVc2VkID0+IF9oZWxwZXJDbGFzc2VzVXNlZDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNSdW50aW1lVHlwZVVzZWQgPT4gX3J1bnRpbWVUeXBlVXNlcy5pc05vdEVtcHR5OwoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxSdW50aW1lVHlwZVVzZT4gZ2V0IHJ1bnRpbWVUeXBlVXNlcyA9PiBfcnVudGltZVR5cGVVc2VzOwp9CoG4AE5OPAEZIiQhJCsuIygeAR46PysBMCcBKykBRzgBTxYyATsBNQEvATABUB0BLh4BKiABMhoBKB8BKz4ZAgElTEBFRwxLPTsBTU9LP0tENQFBOwEwOgEwASU+ASocASgbASsfARgCAT8mNTYwATBOATBGAUoBNDIBUCEBDCQBMh4BDCMBHQEzAUsBDDw5RycEAQw2OUclBAFDLk0xP0UTDRQGBAEoKEE8RkwTRzlMEzc2Njs0MisTBhIEATggKRQxBgQBTyIUKgYEAQw7QSErBkEhOwZOOQZBKQY7OQZEKQY9GT40EUA2EQgGBAEMMUEyQx9AIkMcBgQBDEIdL0IGLgQBDDwdLDwGKwQBDD8qBAEMIBkEAQwZIUE7My9RTSwrMiYwJQQCATFGHS0BNTkzAS4yATItAS4BDCsMKQEMHwEMIgEMHAEMIQEMGwEUNzAvKi8tHSsgGh8aR0E5NTEBQxc1Nk0uNkc/TDVEQxBBPy8yLDErFSFAOjIuKlBMLDImMCUEAQwoFTQxLStGKzdICDg2JikjKCITBAEMOTMEAQwzQAQBDD0/AQw3OQFMAQxFAQw9AQxEAgEycGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9iYWNrZW5kX3VzYWdlLmRhcnRBc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfYmFja2VuZC9yZXNvbHV0aW9uX2xpc3RlbmVyLmRhcnTAAEvwLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkganNfYmFja2VuZC5iYWNrZW5kLnJlc29sdXRpb25fbGlzdGVuZXI7CgppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JyBzaG93IElkZW50aWZpZXJzOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IEtDb21tb25FbGVtZW50cywgS0VsZW1lbnRFbnZpcm9ubWVudDsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2RlZmVycmVkX2xvYWQuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vZW5xdWV1ZS5kYXJ0JyBzaG93IEVucXVldWVyLCBFbnF1ZXVlckxpc3RlbmVyOwppbXBvcnQgJy4uL25hdGl2ZS9lbnF1ZXVlLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCcgc2hvdyBDb21waWxlck9wdGlvbnM7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCcgc2hvdyBDYWxsU3RydWN0dXJlOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JyBzaG93IFN0YXRpY1VzZSwgVHlwZVVzZTsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9pbXBhY3QuZGFydCcKICAgIHNob3cgV29ybGRJbXBhY3QsIFdvcmxkSW1wYWN0QnVpbGRlciwgV29ybGRJbXBhY3RCdWlsZGVySW1wbDsKaW1wb3J0ICdmaWVsZF9hbmFseXNpcy5kYXJ0JzsKaW1wb3J0ICdiYWNrZW5kX2ltcGFjdC5kYXJ0JzsKaW1wb3J0ICdiYWNrZW5kX3VzYWdlLmRhcnQnOwppbXBvcnQgJ2NoZWNrZWRfbW9kZV9oZWxwZXJzLmRhcnQnOwppbXBvcnQgJ2N1c3RvbV9lbGVtZW50c19hbmFseXNpcy5kYXJ0JzsKaW1wb3J0ICdpbnRlcmNlcHRvcl9kYXRhLmRhcnQnOwppbXBvcnQgJ25hdGl2ZV9kYXRhLmRhcnQnIHNob3cgTmF0aXZlQmFzaWNEYXRhOwppbXBvcnQgJ25vX3N1Y2hfbWV0aG9kX3JlZ2lzdHJ5LmRhcnQnOwoKY2xhc3MgUmVzb2x1dGlvbkVucXVldWVyTGlzdGVuZXIgZXh0ZW5kcyBFbnF1ZXVlckxpc3RlbmVyIHsKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB0aGUgbmVlZCBmb3IgdGhpcy4KICBmaW5hbCBEZWZlcnJlZExvYWRUYXNrIF9kZWZlcnJlZExvYWRUYXNrOwoKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgZmluYWwgS0VsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwogIGZpbmFsIEtDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CiAgZmluYWwgQmFja2VuZEltcGFjdHMgX2ltcGFjdHM7CgogIGZpbmFsIE5hdGl2ZUJhc2ljRGF0YSBfbmF0aXZlRGF0YTsKICBmaW5hbCBJbnRlcmNlcHRvckRhdGFCdWlsZGVyIF9pbnRlcmNlcHRvckRhdGE7CiAgZmluYWwgQmFja2VuZFVzYWdlQnVpbGRlciBfYmFja2VuZFVzYWdlOwoKICBmaW5hbCBOb1N1Y2hNZXRob2RSZWdpc3RyeSBfbm9TdWNoTWV0aG9kUmVnaXN0cnk7CiAgZmluYWwgQ3VzdG9tRWxlbWVudHNSZXNvbHV0aW9uQW5hbHlzaXMgX2N1c3RvbUVsZW1lbnRzQW5hbHlzaXM7CgogIGZpbmFsIE5hdGl2ZVJlc29sdXRpb25FbnF1ZXVlciBfbmF0aXZlRW5xdWV1ZXI7CiAgZmluYWwgS0ZpZWxkQW5hbHlzaXMgX2ZpZWxkQW5hbHlzaXM7CgogIC8vLyBUcnVlIHdoZW4gd2UgZW5xdWV1ZSB0aGUgbG9hZExpYnJhcnkgY29kZS4KICBib29sIF9pc0xvYWRMaWJyYXJ5RnVuY3Rpb25SZXNvbHZlZCA9IGZhbHNlOwoKICBSZXNvbHV0aW9uRW5xdWV1ZXJMaXN0ZW5lcigKICAgICAgdGhpcy5fb3B0aW9ucywKICAgICAgdGhpcy5fZWxlbWVudEVudmlyb25tZW50LAogICAgICB0aGlzLl9jb21tb25FbGVtZW50cywKICAgICAgdGhpcy5faW1wYWN0cywKICAgICAgdGhpcy5fbmF0aXZlRGF0YSwKICAgICAgdGhpcy5faW50ZXJjZXB0b3JEYXRhLAogICAgICB0aGlzLl9iYWNrZW5kVXNhZ2UsCiAgICAgIHRoaXMuX25vU3VjaE1ldGhvZFJlZ2lzdHJ5LAogICAgICB0aGlzLl9jdXN0b21FbGVtZW50c0FuYWx5c2lzLAogICAgICB0aGlzLl9uYXRpdmVFbnF1ZXVlciwKICAgICAgdGhpcy5fZmllbGRBbmFseXNpcywKICAgICAgdGhpcy5fZGVmZXJyZWRMb2FkVGFzayk7CgogIHZvaWQgX3JlZ2lzdGVyQmFja2VuZEltcGFjdCgKICAgICAgV29ybGRJbXBhY3RCdWlsZGVyIGJ1aWxkZXIsIEJhY2tlbmRJbXBhY3QgaW1wYWN0KSB7CiAgICBpbXBhY3QucmVnaXN0ZXJJbXBhY3QoYnVpbGRlciwgX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgICBfYmFja2VuZFVzYWdlLnByb2Nlc3NCYWNrZW5kSW1wYWN0KGltcGFjdCk7CiAgfQoKICB2b2lkIF9hZGRJbnRlcmNlcHRvcnMoQ2xhc3NFbnRpdHkgY2xzLCBXb3JsZEltcGFjdEJ1aWxkZXIgaW1wYWN0QnVpbGRlcikgewogICAgX2ludGVyY2VwdG9yRGF0YS5hZGRJbnRlcmNlcHRvcnMoY2xzKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJUeXBlVXNlKAogICAgICAgIG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24oX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRSYXdUeXBlKGNscykpKTsKICAgIF9iYWNrZW5kVXNhZ2UucmVnaXN0ZXJCYWNrZW5kQ2xhc3NVc2UoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIFdvcmxkSW1wYWN0IHJlZ2lzdGVyQ2xvc3VyaXplZE1lbWJlcihGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIGltcGFjdEJ1aWxkZXIgPSBuZXcgV29ybGRJbXBhY3RCdWlsZGVySW1wbCgpOwogICAgX2JhY2tlbmRVc2FnZS5wcm9jZXNzQmFja2VuZEltcGFjdChfaW1wYWN0cy5tZW1iZXJDbG9zdXJlKTsKICAgIGltcGFjdEJ1aWxkZXIKICAgICAgICAuYWRkSW1wYWN0KF9pbXBhY3RzLm1lbWJlckNsb3N1cmUuY3JlYXRlSW1wYWN0KF9lbGVtZW50RW52aXJvbm1lbnQpKTsKICAgIEZ1bmN0aW9uVHlwZSB0eXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUoZWxlbWVudCk7CiAgICBpZiAodHlwZS5jb250YWluc1R5cGVWYXJpYWJsZXMpIHsKICAgICAgaW1wYWN0QnVpbGRlci5hZGRJbXBhY3QoX3JlZ2lzdGVyQ29tcHV0ZVNpZ25hdHVyZSgpKTsKICAgIH0KICAgIHJldHVybiBpbXBhY3RCdWlsZGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgV29ybGRJbXBhY3QgcmVnaXN0ZXJHZXRPZlN0YXRpY0Z1bmN0aW9uKCkgewogICAgX2JhY2tlbmRVc2FnZS5wcm9jZXNzQmFja2VuZEltcGFjdChfaW1wYWN0cy5zdGF0aWNDbG9zdXJlKTsKICAgIHJldHVybiBfaW1wYWN0cy5zdGF0aWNDbG9zdXJlLmNyZWF0ZUltcGFjdChfZWxlbWVudEVudmlyb25tZW50KTsKICB9CgogIFdvcmxkSW1wYWN0IF9yZWdpc3RlckNvbXB1dGVTaWduYXR1cmUoKSB7CiAgICBfYmFja2VuZFVzYWdlLnByb2Nlc3NCYWNrZW5kSW1wYWN0KF9pbXBhY3RzLmNvbXB1dGVTaWduYXR1cmUpOwogICAgcmV0dXJuIF9pbXBhY3RzLmNvbXB1dGVTaWduYXR1cmUuY3JlYXRlSW1wYWN0KF9lbGVtZW50RW52aXJvbm1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlckluc3RhbnRpYXRlZFR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlLAogICAgICB7Ym9vbCBpc0dsb2JhbDogZmFsc2UsIGJvb2wgbmF0aXZlVXNhZ2U6IGZhbHNlfSkgewogICAgaWYgKGlzR2xvYmFsKSB7CiAgICAgIF9iYWNrZW5kVXNhZ2UucmVnaXN0ZXJHbG9iYWxDbGFzc0RlcGVuZGVuY3kodHlwZS5lbGVtZW50KTsKICAgIH0KICAgIGlmIChuYXRpdmVVc2FnZSkgewogICAgICBfbmF0aXZlRW5xdWV1ZXIub25JbnN0YW50aWF0ZWRUeXBlKHR5cGUpOwogICAgfQogIH0KCiAgLy8vIENvbXB1dGVzIHRoZSBbV29ybGRJbXBhY3RdIG9mIGNhbGxpbmcgW21haW5NZXRob2RdIGFzIHRoZSBlbnRyeSBwb2ludC4KICBXb3JsZEltcGFjdCBfY29tcHV0ZU1haW5JbXBhY3QoRnVuY3Rpb25FbnRpdHkgbWFpbk1ldGhvZCkgewogICAgV29ybGRJbXBhY3RCdWlsZGVySW1wbCBtYWluSW1wYWN0ID0gbmV3IFdvcmxkSW1wYWN0QnVpbGRlckltcGwoKTsKICAgIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IG1haW5NZXRob2QucGFyYW1ldGVyU3RydWN0dXJlLmNhbGxTdHJ1Y3R1cmU7CiAgICBpZiAoY2FsbFN0cnVjdHVyZS5hcmd1bWVudENvdW50ID4gMCkgewogICAgICBfaW1wYWN0cy5tYWluV2l0aEFyZ3VtZW50cwogICAgICAgICAgLnJlZ2lzdGVySW1wYWN0KG1haW5JbXBhY3QsIF9lbGVtZW50RW52aXJvbm1lbnQpOwogICAgICBfYmFja2VuZFVzYWdlLnByb2Nlc3NCYWNrZW5kSW1wYWN0KF9pbXBhY3RzLm1haW5XaXRoQXJndW1lbnRzKTsKICAgICAgbWFpbkltcGFjdC5yZWdpc3RlclN0YXRpY1VzZSgKICAgICAgICAgIG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKG1haW5NZXRob2QsIGNhbGxTdHJ1Y3R1cmUpKTsKICAgIH0KICAgIGlmIChtYWluTWV0aG9kLmlzR2V0dGVyKSB7CiAgICAgIG1haW5JbXBhY3QucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNHZXQobWFpbk1ldGhvZCkpOwogICAgfSBlbHNlIHsKICAgICAgbWFpbkltcGFjdC5yZWdpc3RlclN0YXRpY1VzZSgKICAgICAgICAgIG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKG1haW5NZXRob2QsIENhbGxTdHJ1Y3R1cmUuTk9fQVJHUykpOwogICAgfQogICAgcmV0dXJuIG1haW5JbXBhY3Q7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgW1dvcmxkSW1wYWN0XSBvZiBlbmFibGluZyBkZWZlcnJlZCBsb2FkaW5nLgogIFdvcmxkSW1wYWN0IF9jb21wdXRlRGVmZXJyZWRMb2FkaW5nSW1wYWN0KCkgewogICAgX2JhY2tlbmRVc2FnZS5wcm9jZXNzQmFja2VuZEltcGFjdChfaW1wYWN0cy5kZWZlcnJlZExvYWRpbmcpOwogICAgcmV0dXJuIF9pbXBhY3RzLmRlZmVycmVkTG9hZGluZy5jcmVhdGVJbXBhY3QoX2VsZW1lbnRFbnZpcm9ubWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG9uUXVldWVPcGVuKAogICAgICBFbnF1ZXVlciBlbnF1ZXVlciwgRnVuY3Rpb25FbnRpdHkgbWFpbk1ldGhvZCwgSXRlcmFibGU8VXJpPiBsaWJyYXJpZXMpIHsKICAgIGlmIChfZGVmZXJyZWRMb2FkVGFzay5pc1Byb2dyYW1TcGxpdCkgewogICAgICBlbnF1ZXVlci5hcHBseUltcGFjdChfY29tcHV0ZURlZmVycmVkTG9hZGluZ0ltcGFjdCgpLAogICAgICAgICAgaW1wYWN0U291cmNlOiAnZGVmZXJyZWQgbG9hZCcpOwogICAgfQogICAgZW5xdWV1ZXIuYXBwbHlJbXBhY3QoX25hdGl2ZUVucXVldWVyLnByb2Nlc3NOYXRpdmVDbGFzc2VzKGxpYnJhcmllcyksCiAgICAgICAgaW1wYWN0U291cmNlOiAnbmF0aXZlIGNsYXNzZXMnKTsKICAgIGlmIChtYWluTWV0aG9kICE9IG51bGwpIHsKICAgICAgZW5xdWV1ZXIuYXBwbHlJbXBhY3QoX2NvbXB1dGVNYWluSW1wYWN0KG1haW5NZXRob2QpLAogICAgICAgICAgaW1wYWN0U291cmNlOiAnbWFpbiBpbXBhY3QnKTsKICAgIH0KICAgIC8vIEVsZW1lbnRzIHJlcXVpcmVkIGJ5IGVucXVldWVIZWxwZXJzIGFyZSBnbG9iYWwgZGVwZW5kZW5jaWVzCiAgICAvLyB0aGF0IGFyZSBub3QgcHVsbGVkIGluIGJ5IGEgcGFydGljdWxhciBlbGVtZW50LgogICAgZW5xdWV1ZXIuYXBwbHlJbXBhY3QoY29tcHV0ZUhlbHBlcnNJbXBhY3QoKSwgaW1wYWN0U291cmNlOiAnaGVscGVycycpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvblF1ZXVlRW1wdHkoRW5xdWV1ZXIgZW5xdWV1ZXIsIEl0ZXJhYmxlPENsYXNzRW50aXR5PiByZWNlbnRDbGFzc2VzKSB7CiAgICAvLyBBZGQgZWxlbWVudHMgdXNlZCBzeW50aGV0aWNhbGx5LCB0aGF0IGlzLCB0aHJvdWdoIGZlYXR1cmVzIHJhdGhlciB0aGFuCiAgICAvLyBzeW50YXgsIGZvciBpbnN0YW5jZSBjdXN0b20gZWxlbWVudHMuCiAgICAvLwogICAgLy8gUmV0dXJuIGVhcmx5IGlmIGFueSBlbGVtZW50cyBhcmUgYWRkZWQgdG8gYXZvaWQgY291bnRpbmcgdGhlIGVsZW1lbnRzIGFzCiAgICAvLyBkdWUgdG8gbWlycm9ycy4KICAgIGVucXVldWVyLmFwcGx5SW1wYWN0KF9jdXN0b21FbGVtZW50c0FuYWx5c2lzLmZsdXNoKCksCiAgICAgICAgaW1wYWN0U291cmNlOiBfY3VzdG9tRWxlbWVudHNBbmFseXNpcyk7CgogICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gcmVjZW50Q2xhc3NlcykgewogICAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCA9IF9lbGVtZW50RW52aXJvbm1lbnQubG9va3VwTG9jYWxDbGFzc01lbWJlcigKICAgICAgICAgIGNscywgSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXyk7CiAgICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYKICAgICAgICAgIGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlciAmJgogICAgICAgICAgZWxlbWVudC5pc0Z1bmN0aW9uICYmCiAgICAgICAgICAhZWxlbWVudC5pc0Fic3RyYWN0KSB7CiAgICAgICAgX25vU3VjaE1ldGhvZFJlZ2lzdHJ5LnJlZ2lzdGVyTm9TdWNoTWV0aG9kKGVsZW1lbnQpOwogICAgICB9CiAgICB9CiAgICBfbm9TdWNoTWV0aG9kUmVnaXN0cnkub25RdWV1ZUVtcHR5KCk7CiAgICBpZiAoIV9iYWNrZW5kVXNhZ2UuaXNOb1N1Y2hNZXRob2RVc2VkICYmCiAgICAgICAgKF9ub1N1Y2hNZXRob2RSZWdpc3RyeS5oYXNUaHJvd2luZ05vU3VjaE1ldGhvZCB8fAogICAgICAgICAgICBfbm9TdWNoTWV0aG9kUmVnaXN0cnkuaGFzQ29tcGxleE5vU3VjaE1ldGhvZCkpIHsKICAgICAgX2JhY2tlbmRVc2FnZS5wcm9jZXNzQmFja2VuZEltcGFjdChfaW1wYWN0cy5ub1N1Y2hNZXRob2RTdXBwb3J0KTsKICAgICAgZW5xdWV1ZXIuYXBwbHlJbXBhY3QoCiAgICAgICAgICBfaW1wYWN0cy5ub1N1Y2hNZXRob2RTdXBwb3J0LmNyZWF0ZUltcGFjdChfZWxlbWVudEVudmlyb25tZW50KSk7CiAgICAgIF9iYWNrZW5kVXNhZ2UuaXNOb1N1Y2hNZXRob2RVc2VkID0gdHJ1ZTsKICAgIH0KCiAgICBpZiAoIWVucXVldWVyLnF1ZXVlSXNFbXB0eSkgcmV0dXJuIGZhbHNlOwoKICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBvblF1ZXVlQ2xvc2VkKCkge30KCiAgLy8vIEFkZHMgdGhlIGltcGFjdCBvZiBbY29uc3RhbnRdIHRvIFtpbXBhY3RCdWlsZGVyXS4KICB2b2lkIF9jb21wdXRlSW1wYWN0Rm9yQ29tcGlsZVRpbWVDb25zdGFudCgKICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgV29ybGRJbXBhY3RCdWlsZGVyIGltcGFjdEJ1aWxkZXIpIHsKICAgIF9jb21wdXRlSW1wYWN0Rm9yQ29tcGlsZVRpbWVDb25zdGFudEludGVybmFsKGNvbnN0YW50LCBpbXBhY3RCdWlsZGVyKTsKCiAgICBmb3IgKENvbnN0YW50VmFsdWUgZGVwZW5kZW5jeSBpbiBjb25zdGFudC5nZXREZXBlbmRlbmNpZXMoKSkgewogICAgICBfY29tcHV0ZUltcGFjdEZvckNvbXBpbGVUaW1lQ29uc3RhbnQoZGVwZW5kZW5jeSwgaW1wYWN0QnVpbGRlcik7CiAgICB9CiAgfQoKICB2b2lkIF9jb21wdXRlSW1wYWN0Rm9yQ29tcGlsZVRpbWVDb25zdGFudEludGVybmFsKAogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50LCBXb3JsZEltcGFjdEJ1aWxkZXIgaW1wYWN0QnVpbGRlcikgewogICAgRGFydFR5cGUgdHlwZSA9IGNvbnN0YW50LmdldFR5cGUoX2NvbW1vbkVsZW1lbnRzKTsKICAgIF9jb21wdXRlSW1wYWN0Rm9ySW5zdGFudGlhdGVkQ29uc3RhbnRUeXBlKHR5cGUsIGltcGFjdEJ1aWxkZXIpOwoKICAgIGlmIChjb25zdGFudC5pc0Z1bmN0aW9uKSB7CiAgICAgIEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSBmdW5jdGlvbiA9IGNvbnN0YW50OwogICAgICBpbXBhY3RCdWlsZGVyCiAgICAgICAgICAucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNUZWFyT2ZmKGZ1bmN0aW9uLmVsZW1lbnQpKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQuaXNJbnRlcmNlcHRvcikgewogICAgICAvLyBBbiBpbnRlcmNlcHRvciBjb25zdGFudCByZWZlcmVuY2VzIHRoZSBjbGFzcydzIHByb3RvdHlwZSBjaGFpbi4KICAgICAgSW50ZXJjZXB0b3JDb25zdGFudFZhbHVlIGludGVyY2VwdG9yID0gY29uc3RhbnQ7CiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoaW50ZXJjZXB0b3IuY2xzKTsKICAgICAgX2NvbXB1dGVJbXBhY3RGb3JJbnN0YW50aWF0ZWRDb25zdGFudFR5cGUodHlwZSwgaW1wYWN0QnVpbGRlcik7CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50LmlzVHlwZSkgewogICAgICBGdW5jdGlvbkVudGl0eSBoZWxwZXIgPSBfY29tbW9uRWxlbWVudHMuY3JlYXRlUnVudGltZVR5cGU7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoCiAgICAgICAgICBoZWxwZXIsIGhlbHBlci5wYXJhbWV0ZXJTdHJ1Y3R1cmUuY2FsbFN0cnVjdHVyZSkpOwogICAgICBfYmFja2VuZFVzYWdlLnJlZ2lzdGVyQmFja2VuZEZ1bmN0aW9uVXNlKGhlbHBlcik7CiAgICAgIGltcGFjdEJ1aWxkZXIKICAgICAgICAgIC5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaW5zdGFudGlhdGlvbihfY29tbW9uRWxlbWVudHMudHlwZVR5cGUpKTsKICAgIH0KICB9CgogIHZvaWQgX2NvbXB1dGVJbXBhY3RGb3JJbnN0YW50aWF0ZWRDb25zdGFudFR5cGUoCiAgICAgIERhcnRUeXBlIHR5cGUsIFdvcmxkSW1wYWN0QnVpbGRlciBpbXBhY3RCdWlsZGVyKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmluc3RhbnRpYXRpb24odHlwZSkpOwogICAgICBpZiAodHlwZS5lbGVtZW50ID09IF9jb21tb25FbGVtZW50cy50eXBlTGl0ZXJhbENsYXNzKSB7CiAgICAgICAgLy8gSWYgd2UgdXNlIGEgdHlwZSBsaXRlcmFsIGluIGEgY29uc3RhbnQsIHRoZSBjb21waWxlIHRpbWUKICAgICAgICAvLyBjb25zdGFudCBlbWl0dGVyIHdpbGwgZ2VuZXJhdGUgYSBjYWxsIHRvIHRoZSBjcmVhdGVSdW50aW1lVHlwZQogICAgICAgIC8vIGhlbHBlciBzbyB3ZSByZWdpc3RlciBhIHVzZSBvZiB0aGF0LgogICAgICAgIEZ1bmN0aW9uRW50aXR5IGhlbHBlciA9IF9jb21tb25FbGVtZW50cy5jcmVhdGVSdW50aW1lVHlwZTsKICAgICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKAogICAgICAgICAgICBoZWxwZXIsIGhlbHBlci5wYXJhbWV0ZXJTdHJ1Y3R1cmUuY2FsbFN0cnVjdHVyZSkpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBXb3JsZEltcGFjdCByZWdpc3RlclVzZWRDb25zdGFudChDb25zdGFudFZhbHVlIGNvbnN0YW50KSB7CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIGltcGFjdEJ1aWxkZXIgPSBuZXcgV29ybGRJbXBhY3RCdWlsZGVySW1wbCgpOwogICAgX2NvbXB1dGVJbXBhY3RGb3JDb21waWxlVGltZUNvbnN0YW50KGNvbnN0YW50LCBpbXBhY3RCdWlsZGVyKTsKICAgIHJldHVybiBpbXBhY3RCdWlsZGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgV29ybGRJbXBhY3QgcmVnaXN0ZXJVc2VkRWxlbWVudChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIHdvcmxkSW1wYWN0ID0gbmV3IFdvcmxkSW1wYWN0QnVpbGRlckltcGwoKTsKICAgIF9jdXN0b21FbGVtZW50c0FuYWx5c2lzLnJlZ2lzdGVyU3RhdGljVXNlKG1lbWJlcik7CgogICAgaWYgKG1lbWJlci5pc0Z1bmN0aW9uKSB7CiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uID0gbWVtYmVyOwogICAgICBpZiAoZnVuY3Rpb24uaXNFeHRlcm5hbCkgewogICAgICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPQogICAgICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShmdW5jdGlvbik7CgogICAgICAgIHZhciBhbGxQYXJhbWV0ZXJUeXBlcyA9IDxEYXJ0VHlwZT5bXQogICAgICAgICAgLi5hZGRBbGwoZnVuY3Rpb25UeXBlLnBhcmFtZXRlclR5cGVzKQogICAgICAgICAgLi5hZGRBbGwoZnVuY3Rpb25UeXBlLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMpCiAgICAgICAgICAuLmFkZEFsbChmdW5jdGlvblR5cGUubmFtZWRQYXJhbWV0ZXJUeXBlcyk7CiAgICAgICAgZm9yICh2YXIgdHlwZSBpbiBhbGxQYXJhbWV0ZXJUeXBlcykgewogICAgICAgICAgaWYgKHR5cGUuaXNGdW5jdGlvblR5cGUgfHwgdHlwZS5pc1R5cGVkZWYpIHsKICAgICAgICAgICAgdmFyIGNsb3N1cmVDb252ZXJ0ZXIgPSBfY29tbW9uRWxlbWVudHMuY2xvc3VyZUNvbnZlcnRlcjsKICAgICAgICAgICAgd29ybGRJbXBhY3QucmVnaXN0ZXJTdGF0aWNVc2UoCiAgICAgICAgICAgICAgICBuZXcgU3RhdGljVXNlLmltcGxpY2l0SW52b2tlKGNsb3N1cmVDb252ZXJ0ZXIpKTsKICAgICAgICAgICAgX2JhY2tlbmRVc2FnZS5yZWdpc3RlckJhY2tlbmRGdW5jdGlvblVzZShjbG9zdXJlQ29udmVydGVyKTsKICAgICAgICAgICAgX2JhY2tlbmRVc2FnZS5yZWdpc3Rlckdsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jeShjbG9zdXJlQ29udmVydGVyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChmdW5jdGlvbi5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3M7CgogICAgICAgIGlmIChmdW5jdGlvbi5uYW1lID09IElkZW50aWZpZXJzLmNhbGwgJiYKICAgICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5pc0dlbmVyaWNDbGFzcyhjbHMpKSB7CiAgICAgICAgICB3b3JsZEltcGFjdC5hZGRJbXBhY3QoX3JlZ2lzdGVyQ29tcHV0ZVNpZ25hdHVyZSgpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIF9iYWNrZW5kVXNhZ2UucmVnaXN0ZXJVc2VkTWVtYmVyKG1lbWJlcik7CgogICAgaWYgKF9jb21tb25FbGVtZW50cy5pc0NyZWF0ZUludm9jYXRpb25NaXJyb3JIZWxwZXIobWVtYmVyKSkgewogICAgICBfcmVnaXN0ZXJCYWNrZW5kSW1wYWN0KHdvcmxkSW1wYWN0LCBfaW1wYWN0cy5ub1N1Y2hNZXRob2RTdXBwb3J0KTsKICAgIH0KCiAgICBpZiAoX2VsZW1lbnRFbnZpcm9ubWVudC5pc0RlZmVycmVkTG9hZExpYnJhcnlHZXR0ZXIobWVtYmVyKSkgewogICAgICAvLyBUT0RPKHNpZ3VyZG0pOiBDcmVhdGUgYSBmdW5jdGlvbiByZWdpc3RlckxvYWRMaWJyYXJ5QWNjZXNzLgogICAgICBpZiAoIV9pc0xvYWRMaWJyYXJ5RnVuY3Rpb25SZXNvbHZlZCkgewogICAgICAgIF9pc0xvYWRMaWJyYXJ5RnVuY3Rpb25SZXNvbHZlZCA9IHRydWU7CiAgICAgICAgX3JlZ2lzdGVyQmFja2VuZEltcGFjdCh3b3JsZEltcGFjdCwgX2ltcGFjdHMubG9hZExpYnJhcnkpOwogICAgICB9CiAgICB9CgogICAgaWYgKG1lbWJlci5pc0dldHRlciAmJiBtZW1iZXIubmFtZSA9PSBJZGVudGlmaWVycy5ydW50aW1lVHlwZV8pIHsKICAgICAgLy8gRW5hYmxlIHJ1bnRpbWUgdHlwZSBzdXBwb3J0IGlmIHdlIGRpc2NvdmVyIGEgZ2V0dGVyIGNhbGxlZAogICAgICAvLyBydW50aW1lVHlwZS4gV2UgaGF2ZSB0byBlbmFibGUgcnVudGltZSB0eXBlIGJlZm9yZSBoaXR0aW5nIHRoZQogICAgICAvLyBjb2RlZ2VuLCBzbyB0aGF0IGNvbnN0cnVjdG9ycyBrbm93IHdoZXRoZXIgdGhleSBuZWVkIHRvIGdlbmVyYXRlIGNvZGUKICAgICAgLy8gZm9yIHJ1bnRpbWUgdHlwZS4KICAgICAgLy8gVE9ETyhhaGUpOiBSZWNvcmQgcHJlY2lzZSBkZXBlbmRlbmN5IGhlcmUuCiAgICAgIHdvcmxkSW1wYWN0LmFkZEltcGFjdChfcmVnaXN0ZXJSdW50aW1lVHlwZSgpKTsKICAgIH0KCiAgICByZXR1cm4gd29ybGRJbXBhY3Q7CiAgfQoKICAvLy8gQ2FsbGVkIHRvIHJlZ2lzdGVyIHRoYXQgdGhlIGBydW50aW1lVHlwZWAgcHJvcGVydHkgaGFzIGJlZW4gYWNjZXNzZWQuIEFueQogIC8vLyBiYWNrZW5kIHNwZWNpZmljIFtXb3JsZEltcGFjdF0gb2YgdGhpcyBpcyByZXR1cm5lZC4KICBXb3JsZEltcGFjdCBfcmVnaXN0ZXJSdW50aW1lVHlwZSgpIHsKICAgIF9iYWNrZW5kVXNhZ2UucHJvY2Vzc0JhY2tlbmRJbXBhY3QoX2ltcGFjdHMucnVudGltZVR5cGVTdXBwb3J0KTsKICAgIHJldHVybiBfaW1wYWN0cy5ydW50aW1lVHlwZVN1cHBvcnQuY3JlYXRlSW1wYWN0KF9lbGVtZW50RW52aXJvbm1lbnQpOwogIH0KCiAgV29ybGRJbXBhY3QgX3Byb2Nlc3NDbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIFdvcmxkSW1wYWN0QnVpbGRlckltcGwgaW1wYWN0QnVpbGRlciA9IG5ldyBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsKCk7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBFeHRyYWN0IGFuIGBpbXBsZW1lbnRhdGlvbkNsYXNzZXNPZiguLi4pYCBmdW5jdGlvbgogICAgLy8gZm9yIHRoZXNlIGludG8gW0NvbW1vbkVsZW1lbnRzXSBvciBbQmFja2VuZEltcGFjdHNdLgogICAgLy8gUmVnaXN0ZXIgYW55IGhlbHBlciB0aGF0IHdpbGwgYmUgbmVlZGVkIGJ5IHRoZSBiYWNrZW5kLgogICAgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuaW50Q2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmRvdWJsZUNsYXNzIHx8CiAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5udW1DbGFzcykgewogICAgICBfcmVnaXN0ZXJCYWNrZW5kSW1wYWN0KGltcGFjdEJ1aWxkZXIsIF9pbXBhY3RzLm51bUNsYXNzZXMpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmxpc3RDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuc3RyaW5nQ2xhc3MpIHsKICAgICAgX3JlZ2lzdGVyQmFja2VuZEltcGFjdChpbXBhY3RCdWlsZGVyLCBfaW1wYWN0cy5saXN0T3JTdHJpbmdDbGFzc2VzKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5mdW5jdGlvbkNsYXNzKSB7CiAgICAgIF9yZWdpc3RlckJhY2tlbmRJbXBhY3QoaW1wYWN0QnVpbGRlciwgX2ltcGFjdHMuZnVuY3Rpb25DbGFzcyk7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMubWFwQ2xhc3MpIHsKICAgICAgX3JlZ2lzdGVyQmFja2VuZEltcGFjdChpbXBhY3RCdWlsZGVyLCBfaW1wYWN0cy5tYXBDbGFzcyk7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuc2V0Q2xhc3MpIHsKICAgICAgX3JlZ2lzdGVyQmFja2VuZEltcGFjdChpbXBhY3RCdWlsZGVyLCBfaW1wYWN0cy5zZXRDbGFzcyk7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuYm91bmRDbG9zdXJlQ2xhc3MpIHsKICAgICAgX3JlZ2lzdGVyQmFja2VuZEltcGFjdChpbXBhY3RCdWlsZGVyLCBfaW1wYWN0cy5ib3VuZENsb3N1cmVDbGFzcyk7CiAgICB9IGVsc2UgaWYgKF9uYXRpdmVEYXRhLmlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKGNscykpIHsKICAgICAgX3JlZ2lzdGVyQmFja2VuZEltcGFjdChpbXBhY3RCdWlsZGVyLCBfaW1wYWN0cy5uYXRpdmVPckV4dGVuZHNDbGFzcyk7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMubWFwTGl0ZXJhbENsYXNzKSB7CiAgICAgIF9yZWdpc3RlckJhY2tlbmRJbXBhY3QoaW1wYWN0QnVpbGRlciwgX2ltcGFjdHMubWFwTGl0ZXJhbENsYXNzKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5zZXRMaXRlcmFsQ2xhc3MpIHsKICAgICAgX3JlZ2lzdGVyQmFja2VuZEltcGFjdChpbXBhY3RCdWlsZGVyLCBfaW1wYWN0cy5zZXRMaXRlcmFsQ2xhc3MpOwogICAgfQogICAgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuY2xvc3VyZUNsYXNzKSB7CiAgICAgIF9yZWdpc3RlckJhY2tlbmRJbXBhY3QoaW1wYWN0QnVpbGRlciwgX2ltcGFjdHMuY2xvc3VyZUNsYXNzKTsKICAgIH0KICAgIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLnN0cmluZ0NsYXNzIHx8CiAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzKSB7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoX2NvbW1vbkVsZW1lbnRzLmpzU3RyaW5nQ2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmxpc3RDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzIHx8CiAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc0ZpeGVkQXJyYXlDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNFeHRlbmRhYmxlQXJyYXlDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNVbm1vZGlmaWFibGVBcnJheUNsYXNzKSB7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoX2NvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoX2NvbW1vbkVsZW1lbnRzLmpzTXV0YWJsZUFycmF5Q2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc0ZpeGVkQXJyYXlDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoX2NvbW1vbkVsZW1lbnRzLmpzRXh0ZW5kYWJsZUFycmF5Q2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc1VubW9kaWZpYWJsZUFycmF5Q2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgICBfcmVnaXN0ZXJCYWNrZW5kSW1wYWN0KGltcGFjdEJ1aWxkZXIsIF9pbXBhY3RzLmxpc3RDbGFzc2VzKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5pbnRDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcykgewogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc0ludENsYXNzLCBpbXBhY3RCdWlsZGVyKTsKICAgICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNQb3NpdGl2ZUludENsYXNzLCBpbXBhY3RCdWlsZGVyKTsKICAgICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNVSW50MzJDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoX2NvbW1vbkVsZW1lbnRzLmpzVUludDMxQ2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzLCBpbXBhY3RCdWlsZGVyKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5kb3VibGVDbGFzcyB8fAogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzcykgewogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzLCBpbXBhY3RCdWlsZGVyKTsKICAgICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNOdW1iZXJDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuYm9vbENsYXNzIHx8CiAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzcykgewogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMubnVsbENsYXNzIHx8CiAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc051bGxDbGFzcykgewogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc051bGxDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMubnVtQ2xhc3MgfHwKICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzTnVtYmVyQ2xhc3MpIHsKICAgICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoX2NvbW1vbkVsZW1lbnRzLmpzUG9zaXRpdmVJbnRDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoX2NvbW1vbkVsZW1lbnRzLmpzVUludDMyQ2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc1VJbnQzMUNsYXNzLCBpbXBhY3RCdWlsZGVyKTsKICAgICAgX2FkZEludGVyY2VwdG9ycyhfY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoX2NvbW1vbkVsZW1lbnRzLmpzTnVtYmVyQ2xhc3MsIGltcGFjdEJ1aWxkZXIpOwogICAgfSBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdE9iamVjdENsYXNzKSB7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdE9iamVjdENsYXNzLCBpbXBhY3RCdWlsZGVyKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc1BsYWluSmF2YVNjcmlwdE9iamVjdENsYXNzKSB7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuanNQbGFpbkphdmFTY3JpcHRPYmplY3RDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICB9IGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNVbmtub3duSmF2YVNjcmlwdE9iamVjdENsYXNzKSB7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuanNVbmtub3duSmF2YVNjcmlwdE9iamVjdENsYXNzLCBpbXBhY3RCdWlsZGVyKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc0phdmFTY3JpcHRGdW5jdGlvbkNsYXNzKSB7CiAgICAgIF9hZGRJbnRlcmNlcHRvcnMoCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuanNKYXZhU2NyaXB0RnVuY3Rpb25DbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICB9IGVsc2UgaWYgKF9uYXRpdmVEYXRhLmlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKGNscykpIHsKICAgICAgX2ludGVyY2VwdG9yRGF0YS5hZGRJbnRlcmNlcHRvcnNGb3JOYXRpdmVDbGFzc01lbWJlcnMoY2xzKTsKICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc0luZGV4aW5nQmVoYXZpb3JJbnRlcmZhY2UpIHsKICAgICAgX3JlZ2lzdGVyQmFja2VuZEltcGFjdChpbXBhY3RCdWlsZGVyLCBfaW1wYWN0cy5qc0luZGV4aW5nQmVoYXZpb3IpOwogICAgfQoKICAgIF9jdXN0b21FbGVtZW50c0FuYWx5c2lzLnJlZ2lzdGVySW5zdGFudGlhdGVkQ2xhc3MoY2xzKTsKICAgIHJldHVybiBpbXBhY3RCdWlsZGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgV29ybGRJbXBhY3QgcmVnaXN0ZXJJbXBsZW1lbnRlZENsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIF9wcm9jZXNzQ2xhc3MoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIFdvcmxkSW1wYWN0IHJlZ2lzdGVySW5zdGFudGlhdGVkQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBfZmllbGRBbmFseXNpcy5yZWdpc3Rlckluc3RhbnRpYXRlZENsYXNzKGNscyk7CiAgICByZXR1cm4gX3Byb2Nlc3NDbGFzcyhjbHMpOwogIH0KCiAgLy8vIENvbXB1dGUgdGhlIFtXb3JsZEltcGFjdF0gZm9yIGJhY2tlbmQgaGVscGVyIG1ldGhvZHMuCiAgV29ybGRJbXBhY3QgY29tcHV0ZUhlbHBlcnNJbXBhY3QoKSB7CiAgICBhc3NlcnQoX2NvbW1vbkVsZW1lbnRzLmludGVyY2VwdG9yc0xpYnJhcnkgIT0gbnVsbCk7CiAgICBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsIGltcGFjdEJ1aWxkZXIgPSBuZXcgV29ybGRJbXBhY3RCdWlsZGVySW1wbCgpOwogICAgLy8gVE9ETyhuZ2VvZmZyYXkpOiBOb3QgZW5xdWV1aW5nIHRob3NlIHR3byBjbGFzc2VzIGN1cnJlbnRseSBtYWtlCiAgICAvLyB0aGUgY29tcGlsZXIgcG90ZW50aWFsbHkgY3Jhc2guIEhvd2V2ZXIsIGFueSByZWFzb25hYmxlIHByb2dyYW0KICAgIC8vIHdpbGwgaW5zdGFudGlhdGUgdGhvc2UgdHdvIGNsYXNzZXMuCiAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICBfYWRkSW50ZXJjZXB0b3JzKF9jb21tb25FbGVtZW50cy5qc051bGxDbGFzcywgaW1wYWN0QnVpbGRlcik7CiAgICBpZiAoX29wdGlvbnMuZGlzYWJsZVJ0aU9wdGltaXphdGlvbikgewogICAgICAvLyBXaGVuIFJUSSBvcHRpbWl6YXRpb24gaXMgZGlzYWJsZWQgd2UgYWx3YXlzIG5lZWQgYWxsIFJUSSBoZWxwZXJzLCBzbwogICAgICAvLyByZWdpc3RlciB0aGVzZSBoZXJlLgogICAgICBfcmVnaXN0ZXJCYWNrZW5kSW1wYWN0KGltcGFjdEJ1aWxkZXIsIF9pbXBhY3RzLmNvbXB1dGVTaWduYXR1cmUpOwogICAgICBfcmVnaXN0ZXJCYWNrZW5kSW1wYWN0KGltcGFjdEJ1aWxkZXIsIF9pbXBhY3RzLmdldFJ1bnRpbWVUeXBlQXJndW1lbnQpOwogICAgfQoKICAgIGlmIChfb3B0aW9ucy5leHBlcmltZW50Q2FsbEluc3RydW1lbnRhdGlvbikgewogICAgICBfcmVnaXN0ZXJCYWNrZW5kSW1wYWN0KGltcGFjdEJ1aWxkZXIsIF9pbXBhY3RzLnRyYWNlSGVscGVyKTsKICAgIH0KCiAgICBpZiAoX29wdGlvbnMuZXhwZXJpbWVudE5ld1J0aSkgewogICAgICBfcmVnaXN0ZXJCYWNrZW5kSW1wYWN0KGltcGFjdEJ1aWxkZXIsIF9pbXBhY3RzLnJ0aUFkZFJ1bGVzKTsKICAgIH0KCiAgICBfcmVnaXN0ZXJCYWNrZW5kSW1wYWN0KGltcGFjdEJ1aWxkZXIsIF9pbXBhY3RzLmFzc2VydFVucmVhY2hhYmxlKTsKICAgIF9yZWdpc3RlckNoZWNrZWRNb2RlSGVscGVycyhpbXBhY3RCdWlsZGVyKTsKICAgIHJldHVybiBpbXBhY3RCdWlsZGVyOwogIH0KCiAgdm9pZCBfcmVnaXN0ZXJDaGVja2VkTW9kZUhlbHBlcnMoV29ybGRJbXBhY3RCdWlsZGVyIGltcGFjdEJ1aWxkZXIpIHsKICAgIC8vIFdlIHJlZ2lzdGVyIGFsbCB0aGUgX2NvbW1vbkVsZW1lbnRzIGluIHRoZSByZXNvbHV0aW9uIHF1ZXVlLgogICAgLy8gVE9ETygxMzE1NSk6IEZpbmQgYSB3YXkgdG8gcmVnaXN0ZXIgZmV3ZXIgX2NvbW1vbkVsZW1lbnRzLgogICAgTGlzdDxGdW5jdGlvbkVudGl0eT4gc3RhdGljVXNlcyA9IDxGdW5jdGlvbkVudGl0eT5bXTsKICAgIGZvciAoQ2hlY2tlZE1vZGVIZWxwZXIgaGVscGVyIGluIENoZWNrZWRNb2RlSGVscGVycy5oZWxwZXJzKSB7CiAgICAgIHN0YXRpY1VzZXMuYWRkKGhlbHBlci5nZXRTdGF0aWNVc2UoX2NvbW1vbkVsZW1lbnRzKS5lbGVtZW50KTsKICAgIH0KICAgIF9yZWdpc3RlckJhY2tlbmRJbXBhY3QoCiAgICAgICAgaW1wYWN0QnVpbGRlciwgbmV3IEJhY2tlbmRJbXBhY3QoZ2xvYmFsVXNlczogc3RhdGljVXNlcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsb2dTdW1tYXJ5KHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSkgewogICAgX25hdGl2ZUVucXVldWVyLmxvZ1N1bW1hcnkobG9nKTsKICB9Cn0KgdIATk48ATABMEwjICQhOiEvPTcnQh4eHSQoIDAnATwzLAEiMSkhASUxKwE0QgEyJwExLwEeFSAcFRgdGiIkHBsfAR86OTAEAU0rI0kwBAEMQUlAEk5GJjwGGgQBDC5ARQQBLENIBAEMNDkUQQYXMAYEAU0+Rk8rITxGJEIGH0kNJEoGFwQBPjBCRwQBDBRPLDwqBkopHjsoBkM3SwQBDE5OLQdQFzowAS1JKx0mICE9CAYqLTo9SBxLLwYBLgERBAEMGgE4LUJLAUNHBgQBNUI3RAEfMRRNKUk3TUYiQUI9OBRRBgQBMjkhRj5ESjBDRD8IBgQBDD1JQxoEAQw5RzcBHSghJDsBLTA4Ni43RStBSE4TDAoIJzMBMTc+CggGLgFCSQYBQ0UtL0MIBgFGREhPGzQ1BgEYBAFQOidFSgQBL0lPPD8rLitCMy5LN0UyQDJAO0k7TDlHOUcGL0QGLjBGMy80OTtFTEpPUUMyLUNLRkZGNTBGRjMuRDMuRDIwQ0tGRkZGQVBGGEhIGEpDGEU7QkVKBgE8GgQBDDofBAEMOzMfBAE8JzlJR0crQkIrTh5ITgYBMkMGASVDBgFHMBoEAUdEQjpDRAYcQwQBDC4lBAIBOHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvcmVzb2x1dGlvbl9saXN0ZW5lci5kYXJ0RnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvcnVudGltZV90eXBlc19yZXNvbHV0aW9uLmRhcnTAALZbLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkganNfYmFja2VuZC5ydW50aW1lX3R5cGVzX3Jlc29sdXRpb247CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCcgc2hvdyBJZGVudGlmaWVyczsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBDb21tb25FbGVtZW50cywgRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2lyL3J1bnRpbWVfdHlwZV9hbmFseXNpcy5kYXJ0JzsKaW1wb3J0ICcuLi9rZXJuZWwva2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jbGFzc19zZXQuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvZmVhdHVyZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JzsKaW1wb3J0ICdiYWNrZW5kX3VzYWdlLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgUnRpTm9kZSB7CiAgRW50aXR5IGdldCBlbnRpdHk7CiAgU2V0PFJ0aU5vZGU+IF9kZXBlbmRlbmNpZXM7CiAgaW50IF90ZXN0U3RhdGUgPSAwOwogIGludCBfbGl0ZXJhbFN0YXRlID0gMDsKCiAgSXRlcmFibGU8UnRpTm9kZT4gZ2V0IGRlcGVuZGVuY2llcyA9PiBfZGVwZW5kZW5jaWVzID8/IGNvbnN0IDxSdGlOb2RlPltdOwoKICBib29sIGdldCBoYXNEaXJlY3RUZXN0ID0+IF90ZXN0U3RhdGUgJiAxICE9IDA7CiAgYm9vbCBnZXQgaGFzSW5kaXJlY3RUZXN0ID0+IF90ZXN0U3RhdGUgJiAyICE9IDA7CgogIGJvb2wgZ2V0IGhhc1Rlc3QgPT4gX3Rlc3RTdGF0ZSAhPSAwOwoKICBib29sIGdldCBoYXNEaXJlY3RMaXRlcmFsID0+IF9saXRlcmFsU3RhdGUgJiAxICE9IDA7CiAgYm9vbCBnZXQgaGFzSW5kaXJlY3RMaXRlcmFsID0+IF9saXRlcmFsU3RhdGUgJiAyICE9IDA7CgogIGJvb2wgZ2V0IGhhc0xpdGVyYWwgPT4gX2xpdGVyYWxTdGF0ZSAhPSAwOwoKICBib29sIGdldCBoYXNVc2UgPT4gaGFzVGVzdCB8fCBoYXNMaXRlcmFsOwoKICAvLy8gUmVnaXN0ZXIgdGhhdCBpZiBbZW50aXR5XSBuZWVkcyB0eXBlIGFyZ3VtZW50cyB0aGVuIHNvIGRvZXMgYG5vZGUuZW50aXR5YC4KICBib29sIGFkZERlcGVuZGVuY3koUnRpTm9kZSBub2RlKSB7CiAgICBpZiAoZW50aXR5ID09IG5vZGUuZW50aXR5KSB7CiAgICAgIC8vIFNraXAgdHJpdmlhbCBkZXBlbmRlbmNpZXM7IGlmIFtlbnRpdHldIG5lZWRzIHR5cGUgYXJndW1lbnRzIHNvIGRvZXMKICAgICAgLy8gW2VudGl0eV0hCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIF9kZXBlbmRlbmNpZXMgPz89IG5ldyBTZXQ8UnRpTm9kZT4oKTsKICAgIHJldHVybiBfZGVwZW5kZW5jaWVzLmFkZChub2RlKTsKICB9CgogIHZvaWQgbWFya1Rlc3Qoe2Jvb2wgZGlyZWN0fSkgewogICAgc2V0VGVzdFN0YXRlKGRpcmVjdCA/IDEgOiAyKTsKICB9CgogIHZvaWQgbWFya0RpcmVjdFRlc3QoKSB7CiAgICBzZXRUZXN0U3RhdGUoMSk7CiAgfQoKICB2b2lkIG1hcmtJbmRpcmVjdFRlc3QoKSB7CiAgICBzZXRUZXN0U3RhdGUoMik7CiAgfQoKICB2b2lkIHNldFRlc3RTdGF0ZShpbnQgdmFsdWUpIHsKICAgIGlmIChfdGVzdFN0YXRlICE9IHZhbHVlKSB7CiAgICAgIGlmIChfdGVzdFN0YXRlID09IDApIHsKICAgICAgICBfdGVzdFN0YXRlIHw9IHZhbHVlOwogICAgICAgIGlmIChfZGVwZW5kZW5jaWVzICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoUnRpTm9kZSBub2RlIGluIF9kZXBlbmRlbmNpZXMpIHsKICAgICAgICAgICAgbm9kZS5tYXJrSW5kaXJlY3RUZXN0KCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIF90ZXN0U3RhdGUgPSB2YWx1ZTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBtYXJrRGlyZWN0TGl0ZXJhbCgpIHsKICAgIHNldExpdGVyYWxTdGF0ZSgxKTsKICB9CgogIHZvaWQgbWFya0luZGlyZWN0TGl0ZXJhbCgpIHsKICAgIHNldExpdGVyYWxTdGF0ZSgyKTsKICB9CgogIHZvaWQgc2V0TGl0ZXJhbFN0YXRlKGludCB2YWx1ZSkgewogICAgaWYgKF9saXRlcmFsU3RhdGUgIT0gdmFsdWUpIHsKICAgICAgaWYgKF9saXRlcmFsU3RhdGUgPT0gMCkgewogICAgICAgIF9saXRlcmFsU3RhdGUgfD0gdmFsdWU7CiAgICAgICAgaWYgKF9kZXBlbmRlbmNpZXMgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChSdGlOb2RlIG5vZGUgaW4gX2RlcGVuZGVuY2llcykgewogICAgICAgICAgICBub2RlLm1hcmtJbmRpcmVjdExpdGVyYWwoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2xpdGVyYWxTdGF0ZSA9IHZhbHVlOwogICAgICB9CiAgICB9CiAgfQoKICBTdHJpbmcgZ2V0IGtpbmQ7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKGtpbmQpOwogICAgc2Iud3JpdGUoJzonKTsKICAgIHNiLndyaXRlKGVudGl0eSk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCmNsYXNzIENsYXNzTm9kZSBleHRlbmRzIFJ0aU5vZGUgewogIGZpbmFsIENsYXNzRW50aXR5IGNsczsKCiAgQ2xhc3NOb2RlKHRoaXMuY2xzKTsKCiAgQG92ZXJyaWRlCiAgRW50aXR5IGdldCBlbnRpdHkgPT4gY2xzOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGtpbmQgPT4gJ2NsYXNzJzsKfQoKY2xhc3MgTWV0aG9kTm9kZSBleHRlbmRzIFJ0aU5vZGUgewogIGZpbmFsIEVudGl0eSBmdW5jdGlvbjsKICBmaW5hbCBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlOwogIGZpbmFsIGJvb2wgaXNDYWxsVGFyZ2V0OwogIGZpbmFsIE5hbWUgaW5zdGFuY2VOYW1lOwogIGZpbmFsIGJvb2wgaXNOb1N1Y2hNZXRob2Q7CgogIE1ldGhvZE5vZGUodGhpcy5mdW5jdGlvbiwgdGhpcy5wYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgIHt0aGlzLmlzQ2FsbFRhcmdldCwgdGhpcy5pbnN0YW5jZU5hbWUsIHRoaXMuaXNOb1N1Y2hNZXRob2Q6IGZhbHNlfSk7CgogIEBvdmVycmlkZQogIEVudGl0eSBnZXQgZW50aXR5ID0+IGZ1bmN0aW9uOwoKICBib29sIHNlbGVjdG9yQXBwbGllcyhTZWxlY3RvciBzZWxlY3RvcikgewogICAgaWYgKGlzTm9TdWNoTWV0aG9kKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiAoaXNDYWxsVGFyZ2V0ICYmIHNlbGVjdG9yLmlzQ2xvc3VyZUNhbGwgfHwKICAgICAgICAgICAgaW5zdGFuY2VOYW1lID09IHNlbGVjdG9yLm1lbWJlck5hbWUpICYmCiAgICAgICAgc2VsZWN0b3IuY2FsbFN0cnVjdHVyZS5zaWduYXR1cmVBcHBsaWVzKHBhcmFtZXRlclN0cnVjdHVyZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGtpbmQgPT4gJ21ldGhvZCc7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdNZXRob2ROb2RlKCcpOwogICAgc2Iud3JpdGUoJ2Z1bmN0aW9uPSRmdW5jdGlvbicpOwogICAgc2Iud3JpdGUoJyxwYXJhbWV0ZXJTdHJ1Y3R1cmU9JHBhcmFtZXRlclN0cnVjdHVyZScpOwogICAgc2Iud3JpdGUoJyxpc0NhbGxUYXJnZXQ9JGlzQ2FsbFRhcmdldCcpOwogICAgc2Iud3JpdGUoJyxpbnN0YW5jZU5hbWU9JGluc3RhbmNlTmFtZScpOwogICAgc2Iud3JpdGUoJyknKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgVHlwZVZhcmlhYmxlVGVzdHMgewogIExpc3Q8UnRpTm9kZT4gX25vZGVzID0gPFJ0aU5vZGU+W107CiAgTWFwPENsYXNzRW50aXR5LCBDbGFzc05vZGU+IF9jbGFzc2VzID0gPENsYXNzRW50aXR5LCBDbGFzc05vZGU+e307CiAgTWFwPEVudGl0eSwgTWV0aG9kTm9kZT4gX21ldGhvZHMgPSA8RW50aXR5LCBNZXRob2ROb2RlPnt9OwogIE1hcDxTZWxlY3RvciwgU2V0PEVudGl0eT4+IF9hcHBsaWVkU2VsZWN0b3JNYXA7CiAgTWFwPEdlbmVyaWNJbnN0YW50aWF0aW9uLCBTZXQ8RW50aXR5Pj4gX2luc3RhbnRpYXRpb25NYXA7CgogIC8vLyBBbGwgZXhwbGljaXQgaXMtdGVzdHMuCiAgZmluYWwgU2V0PERhcnRUeXBlPiBleHBsaWNpdElzQ2hlY2tzOwoKICAvLy8gQWxsIGltcGxpY2l0IGlzLXRlc3RzLgogIGZpbmFsIFNldDxEYXJ0VHlwZT4gaW1wbGljaXRJc0NoZWNrcyA9IG5ldyBTZXQ8RGFydFR5cGU+KCk7CgogIFR5cGVWYXJpYWJsZVRlc3RzKAogICAgICBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50LAogICAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgRGFydFR5cGVzIHR5cGVzLAogICAgICBCdWlsdFdvcmxkIHdvcmxkLAogICAgICBTZXQ8R2VuZXJpY0luc3RhbnRpYXRpb24+IGdlbmVyaWNJbnN0YW50aWF0aW9ucywKICAgICAge2Jvb2wgZm9yUnRpTmVlZHM6IHRydWV9KQogICAgICA6IGV4cGxpY2l0SXNDaGVja3MgPSBuZXcgU2V0PERhcnRUeXBlPi5mcm9tKHdvcmxkLmlzQ2hlY2tzKSB7CiAgICBfc2V0dXBEZXBlbmRlbmNpZXMoCiAgICAgICAgZWxlbWVudEVudmlyb25tZW50LCBjb21tb25FbGVtZW50cywgd29ybGQsIGdlbmVyaWNJbnN0YW50aWF0aW9ucywKICAgICAgICBmb3JSdGlOZWVkczogZm9yUnRpTmVlZHMpOwogICAgX3Byb3BhZ2F0ZVRlc3RzKGNvbW1vbkVsZW1lbnRzLCBlbGVtZW50RW52aXJvbm1lbnQsIHdvcmxkKTsKICAgIGlmIChmb3JSdGlOZWVkcykgewogICAgICBfcHJvcGFnYXRlTGl0ZXJhbHMoZWxlbWVudEVudmlyb25tZW50LCB3b3JsZCk7CiAgICB9CiAgICBfY29sbGVjdFJlc3VsdHMoY29tbW9uRWxlbWVudHMsIGVsZW1lbnRFbnZpcm9ubWVudCwgdHlwZXMsIHdvcmxkLAogICAgICAgIGZvclJ0aU5lZWRzOiBmb3JSdGlOZWVkcyk7CiAgfQoKICAvLy8gQ2xhc3NlcyB3aG9zZSB0eXBlIHZhcmlhYmxlcyBhcmUgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5IHVzZWQgaW4KICAvLy8gaXMtdGVzdHMuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBgQWAgYW5kIGBCYCBpbjoKICAvLy8KICAvLy8gICAgIGNsYXNzIEE8VD4gewogIC8vLyAgICAgICBtKG8pID0+IG8gaXMgVDsKICAvLy8gICAgIH0KICAvLy8gICAgIGNsYXNzIEI8Uz4gewogIC8vLyAgICAgICBtKG8pID0+IG5ldyBBPFM+KCkubShvKTsKICAvLy8gICAgIH0KICAvLy8gICAgIG1haW4oKSA9PiBuZXcgQjxpbnQ+KCkubSgwKTsKICAvLy8KICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IGNsYXNzVGVzdHNGb3JUZXN0aW5nID0+CiAgICAgIF9jbGFzc2VzLnZhbHVlcy53aGVyZSgobikgPT4gbi5oYXNUZXN0KS5tYXAoKG4pID0+IG4uY2xzKS50b1NldCgpOwoKICAvLy8gQ2xhc3NlcyB0aGF0IGV4cGxpY2l0bHkgdXNlIHRoZWlyIHR5cGUgdmFyaWFibGVzIGluIGlzLXRlc3RzLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgYEFgIGluOgogIC8vLwogIC8vLyAgICAgY2xhc3MgQTxUPiB7CiAgLy8vICAgICAgIG0obykgPT4gbyBpcyBUOwogIC8vLyAgICAgfQogIC8vLyAgICAgbWFpbigpID0+IG5ldyBBPGludD4oKS5tKDApOwogIC8vLwogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBnZXQgZGlyZWN0Q2xhc3NUZXN0c0ZvclRlc3RpbmcgPT4KICAgICAgX2NsYXNzZXMudmFsdWVzLndoZXJlKChuKSA9PiBuLmhhc0RpcmVjdFRlc3QpLm1hcCgobikgPT4gbi5jbHMpLnRvU2V0KCk7CgogIC8vLyBNZXRob2RzIHRoYXQgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5IHVzZSB0aGVpciB0eXBlIHZhcmlhYmxlcyBpbgogIC8vLyBpcy10ZXN0cy4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGBtMWAgYW5kIGBtMmBpbjoKICAvLy8KICAvLy8gICAgIG0xPFQ+KG8pID0+IG8gaXMgVDsKICAvLy8gICAgIG0yPFM+KG8pID0+IG0xPFM+KG8pOwogIC8vLyAgICAgbWFpbigpID0+IG0yPGludD4oMCk7CiAgLy8vCiAgSXRlcmFibGU8RW50aXR5PiBnZXQgbWV0aG9kVGVzdHNGb3JUZXN0aW5nID0+CiAgICAgIF9tZXRob2RzLnZhbHVlcy53aGVyZSgobikgPT4gbi5oYXNUZXN0KS5tYXAoKG4pID0+IG4uZnVuY3Rpb24pLnRvU2V0KCk7CgogIC8vLyBNZXRob2RzIHRoYXQgZXhwbGljaXRseSB1c2UgdGhlaXIgdHlwZSB2YXJpYWJsZXMgaW4gaXMtdGVzdHMuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBgbWAgaW46CiAgLy8vCiAgLy8vICAgICBtPFQ+KG8pID0+IG8gaXMgVDsKICAvLy8gICAgIG1haW4oKSA9PiBtPGludD4oMCk7CiAgLy8vCiAgSXRlcmFibGU8RW50aXR5PiBnZXQgZGlyZWN0TWV0aG9kVGVzdHNGb3JUZXN0aW5nID0+IF9tZXRob2RzLnZhbHVlcwogICAgICAud2hlcmUoKG4pID0+IG4uaGFzRGlyZWN0VGVzdCkKICAgICAgLm1hcCgobikgPT4gbi5mdW5jdGlvbikKICAgICAgLnRvU2V0KCk7CgogIC8vLyBUaGUgZW50aXRpZXMgdGhhdCBuZWVkIHR5cGUgYXJndW1lbnRzIGF0IHJ1bnRpbWUgaWYgdGhlICdrZXkgZW50aXR5JyBuZWVkcwogIC8vLyB0eXBlIGFyZ3VtZW50cy4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlOgogIC8vLwogIC8vLyAgICAgY2xhc3MgQTxUPiB7CiAgLy8vICAgICAgIG0oKSA9PiBuZXcgQjxUPigpOwogIC8vLyAgICAgfQogIC8vLyAgICAgY2xhc3MgQjxUPiB7fQogIC8vLyAgICAgbWFpbigpID0+IG5ldyBBPFN0cmluZz4oKS5tKCkgaXMgQjxpbnQ+OwogIC8vLwogIC8vLyBIZXJlIGBBYCBuZWVkcyB0eXBlIGFyZ3VtZW50cyBhdCBydW50aW1lIGJlY2F1c2UgdGhlIGtleSBlbnRpdHkgYEJgIG5lZWRzCiAgLy8vIGl0IGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjaGVjayBhZ2FpbnN0IGBCPGludD5gLgogIC8vLwogIC8vLyBUaGlzIGNhbiBhbHNvIGludm9sdmUgZ2VuZXJpYyBtZXRob2RzOgogIC8vLwogIC8vLyAgICBjbGFzcyBBPFQ+IHt9CiAgLy8vICAgIG1ldGhvZDxUPigpID0+IG5ldyBBPFQ+KCk7CiAgLy8vICAgIG1haW4oKSA9PiBtZXRob2Q8aW50PigpIGlzIEE8aW50PigpOwogIC8vLwogIC8vLyBIZXJlIGBtZXRob2RgIG5lZWQgdHlwZSBhcmd1bWVudHMgYXQgcnVudGltZSBiZWNhdXNlIHRoZSBrZXkgZW50aXR5IGBBYAogIC8vLyBuZWVkcyBpdCBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY2hlY2sgYWdhaW5zdCBgQTxpbnQ+YC4KICAvLy8KICBJdGVyYWJsZTxFbnRpdHk+IGdldFR5cGVBcmd1bWVudERlcGVuZGVuY2llcyhFbnRpdHkgZW50aXR5KSB7CiAgICBJdGVyYWJsZTxSdGlOb2RlPiBkZXBlbmRlbmNpZXM7CiAgICBpZiAoZW50aXR5IGlzIENsYXNzRW50aXR5KSB7CiAgICAgIGRlcGVuZGVuY2llcyA9IF9jbGFzc2VzW2VudGl0eV0/LmRlcGVuZGVuY2llczsKICAgIH0gZWxzZSB7CiAgICAgIGRlcGVuZGVuY2llcyA9IF9tZXRob2RzW2VudGl0eV0/LmRlcGVuZGVuY2llczsKICAgIH0KICAgIGlmIChkZXBlbmRlbmNpZXMgPT0gbnVsbCkgcmV0dXJuIGNvbnN0IDxFbnRpdHk+W107CiAgICByZXR1cm4gZGVwZW5kZW5jaWVzLm1hcCgobikgPT4gbi5lbnRpdHkpLnRvU2V0KCk7CiAgfQoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIHNlbGVjdG9yIHRoYXQgYXBwbGllcyB0byBnZW5lcmljIFt0YXJnZXRzXS4KICB2b2lkIGZvckVhY2hBcHBsaWVkU2VsZWN0b3Iodm9pZCBmKFNlbGVjdG9yIHNlbGVjdG9yLCBTZXQ8RW50aXR5PiB0YXJnZXRzKSkgewogICAgX2FwcGxpZWRTZWxlY3Rvck1hcC5mb3JFYWNoKGYpOwogIH0KCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBnZW5lcmljIGluc3RhbnRpYXRpb24gdGhhdCBhcHBsaWVzIHRvIGdlbmVyaWMKICAvLy8gY2xvc3VyaXplZCBbdGFyZ2V0c10uCiAgdm9pZCBmb3JFYWNoR2VuZXJpY0luc3RhbnRpYXRpb24oCiAgICAgIHZvaWQgZihHZW5lcmljSW5zdGFudGlhdGlvbiBpbnN0YW50aWF0aW9uLCBTZXQ8RW50aXR5PiB0YXJnZXRzKSkgewogICAgX2luc3RhbnRpYXRpb25NYXA/LmZvckVhY2goZik7CiAgfQoKICBDbGFzc05vZGUgX2dldENsYXNzTm9kZShDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBfY2xhc3Nlcy5wdXRJZkFic2VudChjbHMsICgpIHsKICAgICAgQ2xhc3NOb2RlIG5vZGUgPSBuZXcgQ2xhc3NOb2RlKGNscyk7CiAgICAgIF9ub2Rlcy5hZGQobm9kZSk7CiAgICAgIHJldHVybiBub2RlOwogICAgfSk7CiAgfQoKICBNZXRob2ROb2RlIF9nZXRNZXRob2ROb2RlKEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIEJ1aWx0V29ybGQgd29ybGQsIEVudGl0eSBmdW5jdGlvbikgewogICAgcmV0dXJuIF9tZXRob2RzLnB1dElmQWJzZW50KGZ1bmN0aW9uLCAoKSB7CiAgICAgIE1ldGhvZE5vZGUgbm9kZTsKICAgICAgaWYgKGZ1bmN0aW9uIGlzIEZ1bmN0aW9uRW50aXR5KSB7CiAgICAgICAgTmFtZSBpbnN0YW5jZU5hbWU7CiAgICAgICAgYm9vbCBpc0NhbGxUYXJnZXQ7CiAgICAgICAgYm9vbCBpc05vU3VjaE1ldGhvZDsKICAgICAgICBpZiAoZnVuY3Rpb24uaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAgICAgaXNDYWxsVGFyZ2V0ID0gd29ybGQuY2xvc3VyaXplZE1lbWJlcnMuY29udGFpbnMoZnVuY3Rpb24pOwogICAgICAgICAgaW5zdGFuY2VOYW1lID0gZnVuY3Rpb24ubWVtYmVyTmFtZTsKICAgICAgICAgIGlzTm9TdWNoTWV0aG9kID0gaW5zdGFuY2VOYW1lLnRleHQgPT0gSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaXNDYWxsVGFyZ2V0ID0gd29ybGQuY2xvc3VyaXplZFN0YXRpY3MuY29udGFpbnMoZnVuY3Rpb24pOwogICAgICAgICAgaXNOb1N1Y2hNZXRob2QgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgbm9kZSA9IG5ldyBNZXRob2ROb2RlKGZ1bmN0aW9uLCBmdW5jdGlvbi5wYXJhbWV0ZXJTdHJ1Y3R1cmUsCiAgICAgICAgICAgIGlzQ2FsbFRhcmdldDogaXNDYWxsVGFyZ2V0LAogICAgICAgICAgICBpbnN0YW5jZU5hbWU6IGluc3RhbmNlTmFtZSwKICAgICAgICAgICAgaXNOb1N1Y2hNZXRob2Q6IGlzTm9TdWNoTWV0aG9kKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlID0gbmV3IFBhcmFtZXRlclN0cnVjdHVyZS5mcm9tVHlwZSgKICAgICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LmdldExvY2FsRnVuY3Rpb25UeXBlKGZ1bmN0aW9uKSk7CiAgICAgICAgbm9kZSA9IG5ldyBNZXRob2ROb2RlKGZ1bmN0aW9uLCBwYXJhbWV0ZXJTdHJ1Y3R1cmUsIGlzQ2FsbFRhcmdldDogdHJ1ZSk7CiAgICAgIH0KICAgICAgX25vZGVzLmFkZChub2RlKTsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9KTsKICB9CgogIHZvaWQgX3NldHVwRGVwZW5kZW5jaWVzKAogICAgICBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50LAogICAgICBDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgQnVpbHRXb3JsZCB3b3JsZCwKICAgICAgU2V0PEdlbmVyaWNJbnN0YW50aWF0aW9uPiBnZW5lcmljSW5zdGFudGlhdGlvbnMsCiAgICAgIHtib29sIGZvclJ0aU5lZWRzOiB0cnVlfSkgewogICAgLy8vIFJlZ2lzdGVyIHRoYXQgaWYgYG5vZGUuZW50aXR5YCBuZWVkcyB0eXBlIGFyZ3VtZW50cyB0aGVuIHNvIGRvIGVudGl0aWVzCiAgICAvLy8gd2hvc2UgdHlwZSB2YXJpYWJsZXMgb2NjdXIgaW4gW3R5cGVdLgogICAgLy8vCiAgICAvLy8gRm9yIGluc3RhbmNlIGlmIGBBYCBuZWVkcyB0eXBlIGFyZ3VtZW50cyB0aGVuIHNvIGRvZXMgYEJgIGluOgogICAgLy8vCiAgICAvLy8gICBjbGFzcyBBPFQ+IHt9CiAgICAvLy8gICBjbGFzcyBCPFQ+IHsgbSgpID0+IG5ldyBBPFQ+KCk7IH0KICAgIC8vLwogICAgdm9pZCByZWdpc3RlckRlcGVuZGVuY2llcyhSdGlOb2RlIG5vZGUsIERhcnRUeXBlIHR5cGUpIHsKICAgICAgdHlwZS5mb3JFYWNoVHlwZVZhcmlhYmxlKChUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZSkgewogICAgICAgIEVudGl0eSB0eXBlRGVjbGFyYXRpb24gPSB0eXBlVmFyaWFibGUuZWxlbWVudC50eXBlRGVjbGFyYXRpb247CiAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiBpcyBDbGFzc0VudGl0eSkgewogICAgICAgICAgbm9kZS5hZGREZXBlbmRlbmN5KF9nZXRDbGFzc05vZGUodHlwZURlY2xhcmF0aW9uKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5vZGUuYWRkRGVwZW5kZW5jeSgKICAgICAgICAgICAgICBfZ2V0TWV0aG9kTm9kZShlbGVtZW50RW52aXJvbm1lbnQsIHdvcmxkLCB0eXBlRGVjbGFyYXRpb24pKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIC8vIEFkZCB0aGUgcnRpIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBpbXBsaWNpdCBpbiB0aGUgd2F5IHRoZSBiYWNrZW5kCiAgICAvLyBnZW5lcmF0ZXMgY29kZTogd2hlbiB3ZSBjcmVhdGUgYSBuZXcgW0xpc3RdLCB3ZSBhY3R1YWxseSBjcmVhdGUgYQogICAgLy8gW0pTQXJyYXldIGluIHRoZSBiYWNrZW5kIGFuZCB3ZSBuZWVkIHRvIGFkZCB0eXBlIGFyZ3VtZW50cyB0byB0aGUgY2FsbHMKICAgIC8vIG9mIHRoZSBsaXN0IGNvbnN0cnVjdG9yIHdoZW5ldmVyIHdlIGRldGVybWluZSB0aGF0IFtKU0FycmF5XSBuZWVkcyB0eXBlCiAgICAvLyBhcmd1bWVudHMuCiAgICAvLwogICAgLy8gVGhpcyBpcyBuZWVkIGZvciBpbnN0YW5jZSBmb3I6CiAgICAvLwogICAgLy8gICAgdmFyIGxpc3QgPSA8aW50PltdOwogICAgLy8gICAgdmFyIHNldCA9IGxpc3QudG9TZXQoKTsKICAgIC8vICAgIHNldCBpcyBTZXQ8U3RyaW5nPjsKICAgIC8vCiAgICAvLyBJdCBhbHNvIG9jY3VycyBmb3IgW01hcF0gdnMgW0pzTGlua2VkSGFzaE1hcF0gaW46CiAgICAvLwogICAgLy8gICAgdmFyIG1hcCA9IDxpbnQsIGRvdWJsZT57fTsKICAgIC8vICAgIHZhciBzZXQgPSBtYXAua2V5cy50b1NldCgpOwogICAgLy8gICAgc2V0IGlzIFNldDxTdHJpbmc+OwogICAgLy8KICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1ha2UgdGhpcyBkZXBlbmRlbmN5IHZpc2libGUgZnJvbSBjb2RlLCBwb3NzaWJseQogICAgLy8gdXNpbmcgZ2VuZXJpYyBtZXRob2RzLgogICAgaWYgKGNvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcyAhPSBudWxsKSB7CiAgICAgIF9nZXRDbGFzc05vZGUoY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzKQogICAgICAgICAgLmFkZERlcGVuZGVuY3koX2dldENsYXNzTm9kZShjb21tb25FbGVtZW50cy5saXN0Q2xhc3MpKTsKICAgIH0KICAgIGlmIChjb21tb25FbGVtZW50cy5zZXRMaXRlcmFsQ2xhc3MgIT0gbnVsbCkgewogICAgICBfZ2V0Q2xhc3NOb2RlKGNvbW1vbkVsZW1lbnRzLnNldExpdGVyYWxDbGFzcykKICAgICAgICAgIC5hZGREZXBlbmRlbmN5KF9nZXRDbGFzc05vZGUoY29tbW9uRWxlbWVudHMuc2V0Q2xhc3MpKTsKICAgIH0KICAgIGlmIChjb21tb25FbGVtZW50cy5tYXBMaXRlcmFsQ2xhc3MgIT0gbnVsbCkgewogICAgICBfZ2V0Q2xhc3NOb2RlKGNvbW1vbkVsZW1lbnRzLm1hcExpdGVyYWxDbGFzcykKICAgICAgICAgIC5hZGREZXBlbmRlbmN5KF9nZXRDbGFzc05vZGUoY29tbW9uRWxlbWVudHMubWFwQ2xhc3MpKTsKICAgIH0KCiAgICB2b2lkIHByb2Nlc3NDaGVja2VkVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICAvLyBSZWdpc3RlciB0aGF0IGlmIFtjbHNdIG5lZWRzIHR5cGUgYXJndW1lbnRzIHRoZW4gc28gZG8gdGhlIGVudGl0aWVzCiAgICAgICAgLy8gdGhhdCBkZWNsYXJlIHR5cGUgdmFyaWFibGVzIG9jY3VycmluZyBpbiBbdHlwZV0uCiAgICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gdHlwZS5lbGVtZW50OwogICAgICAgIHJlZ2lzdGVyRGVwZW5kZW5jaWVzKF9nZXRDbGFzc05vZGUoY2xzKSwgdHlwZSk7CiAgICAgIH0KICAgICAgaWYgKHR5cGUgaXMgRnV0dXJlT3JUeXBlKSB7CiAgICAgICAgLy8gW3R5cGVdIGlzIGBGdXR1cmVPcjxYPmAuCgogICAgICAgIC8vIEZvciB0aGUgaW1wbGllZCBgaXMgRnV0dXJlPFg+YCB0ZXN0LCByZWdpc3RlciB0aGF0IGlmIGBGdXR1cmVgIG5lZWRzCiAgICAgICAgLy8gdHlwZSBhcmd1bWVudHMgdGhlbiBzbyBkbyB0aGUgZW50aXRpZXMgdGhhdCBkZWNsYXJlIHR5cGUgdmFyaWFibGVzCiAgICAgICAgLy8gb2NjdXJyaW5nIGluIGB0eXBlLnR5cGVBcmd1bWVudGAuCiAgICAgICAgcmVnaXN0ZXJEZXBlbmRlbmNpZXMoCiAgICAgICAgICAgIF9nZXRDbGFzc05vZGUoY29tbW9uRWxlbWVudHMuZnV0dXJlQ2xhc3MpLCB0eXBlLnR5cGVBcmd1bWVudCk7CiAgICAgICAgLy8gUHJvY2VzcyBgdHlwZS50eXBlQXJndW1lbnRgIGZvciB0aGUgaW1wbGllZCBgaXMgWGAgdGVzdC4KICAgICAgICBwcm9jZXNzQ2hlY2tlZFR5cGUodHlwZS50eXBlQXJndW1lbnQpOwogICAgICB9CiAgICB9CgogICAgd29ybGQuaXNDaGVja3MuZm9yRWFjaChwcm9jZXNzQ2hlY2tlZFR5cGUpOwoKICAgIHdvcmxkLmluc3RhbnRpYXRlZFR5cGVzLmZvckVhY2goKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgICAvLyBSZWdpc3RlciB0aGF0IGlmIFtjbHNdIG5lZWRzIHR5cGUgYXJndW1lbnRzIHRoZW4gc28gZG8gdGhlIGVudGl0aWVzCiAgICAgIC8vIHRoYXQgZGVjbGFyZSB0eXBlIHZhcmlhYmxlcyBvY2N1cnJpbmcgaW4gW3R5cGVdLgogICAgICBDbGFzc0VudGl0eSBjbHMgPSB0eXBlLmVsZW1lbnQ7CiAgICAgIHJlZ2lzdGVyRGVwZW5kZW5jaWVzKF9nZXRDbGFzc05vZGUoY2xzKSwgdHlwZSk7CiAgICB9KTsKCiAgICB3b3JsZC5mb3JFYWNoU3RhdGljVHlwZUFyZ3VtZW50KAogICAgICAgIChFbnRpdHkgZW50aXR5LCBJdGVyYWJsZTxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gdHlwZUFyZ3VtZW50cykgewogICAgICAgIC8vIFJlZ2lzdGVyIHRoYXQgaWYgW2VudGl0eV0gbmVlZHMgdHlwZSBhcmd1bWVudHMgdGhlbiBzbyBkbyB0aGUKICAgICAgICAvLyBlbnRpdGllcyB0aGF0IGRlY2xhcmUgdHlwZSB2YXJpYWJsZXMgb2NjdXJyaW5nIGluIFt0eXBlXS4KICAgICAgICByZWdpc3RlckRlcGVuZGVuY2llcygKICAgICAgICAgICAgX2dldE1ldGhvZE5vZGUoZWxlbWVudEVudmlyb25tZW50LCB3b3JsZCwgZW50aXR5KSwgdHlwZSk7CiAgICAgIH0KICAgIH0pOwoKICAgIHdvcmxkLmZvckVhY2hEeW5hbWljVHlwZUFyZ3VtZW50KAogICAgICAgIChTZWxlY3RvciBzZWxlY3RvciwgSXRlcmFibGU8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgICAgdm9pZCBwcm9jZXNzRW50aXR5KEVudGl0eSBlbnRpdHkpIHsKICAgICAgICBNZXRob2ROb2RlIG5vZGUgPSBfZ2V0TWV0aG9kTm9kZShlbGVtZW50RW52aXJvbm1lbnQsIHdvcmxkLCBlbnRpdHkpOwogICAgICAgIGlmIChub2RlLnNlbGVjdG9yQXBwbGllcyhzZWxlY3RvcikpIHsKICAgICAgICAgIGZvciAoRGFydFR5cGUgdHlwZSBpbiB0eXBlQXJndW1lbnRzKSB7CiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoYXQgaWYgYG5vZGUuZW50aXR5YCBuZWVkcyB0eXBlIGFyZ3VtZW50cyB0aGVuIHNvIGRvCiAgICAgICAgICAgIC8vIHRoZSBlbnRpdGllcyB0aGF0IGRlY2xhcmUgdHlwZSB2YXJpYWJsZXMgb2NjdXJyaW5nIGluIFt0eXBlXS4KICAgICAgICAgICAgcmVnaXN0ZXJEZXBlbmRlbmNpZXMobm9kZSwgdHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB3b3JsZC5mb3JFYWNoR2VuZXJpY0luc3RhbmNlTWV0aG9kKHByb2Nlc3NFbnRpdHkpOwogICAgICB3b3JsZC5nZW5lcmljTG9jYWxGdW5jdGlvbnMuZm9yRWFjaChwcm9jZXNzRW50aXR5KTsKICAgICAgd29ybGQuY2xvc3VyaXplZFN0YXRpY3MuZm9yRWFjaChwcm9jZXNzRW50aXR5KTsKICAgICAgd29ybGQudXNlck5vU3VjaE1ldGhvZHMuZm9yRWFjaChwcm9jZXNzRW50aXR5KTsKICAgIH0pOwoKICAgIGZvciAoR2VuZXJpY0luc3RhbnRpYXRpb24gaW5zdGFudGlhdGlvbiBpbiBnZW5lcmljSW5zdGFudGlhdGlvbnMpIHsKICAgICAgdm9pZCBwcm9jZXNzRW50aXR5KEVudGl0eSBlbnRpdHkpIHsKICAgICAgICBNZXRob2ROb2RlIG5vZGUgPSBfZ2V0TWV0aG9kTm9kZShlbGVtZW50RW52aXJvbm1lbnQsIHdvcmxkLCBlbnRpdHkpOwogICAgICAgIGlmIChub2RlLnBhcmFtZXRlclN0cnVjdHVyZS50eXBlUGFyYW1ldGVycyA9PQogICAgICAgICAgICBpbnN0YW50aWF0aW9uLnR5cGVBcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICBpZiAoZm9yUnRpTmVlZHMpIHsKICAgICAgICAgICAgX2luc3RhbnRpYXRpb25NYXAgPz89IDxHZW5lcmljSW5zdGFudGlhdGlvbiwgU2V0PEVudGl0eT4+e307CiAgICAgICAgICAgIF9pbnN0YW50aWF0aW9uTWFwCiAgICAgICAgICAgICAgICAucHV0SWZBYnNlbnQoaW5zdGFudGlhdGlvbiwgKCkgPT4gbmV3IFNldDxFbnRpdHk+KCkpCiAgICAgICAgICAgICAgICAuYWRkKGVudGl0eSk7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gaW5zdGFudGlhdGlvbi50eXBlQXJndW1lbnRzKSB7CiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoYXQgaWYgYG5vZGUuZW50aXR5YCBuZWVkcyB0eXBlIGFyZ3VtZW50cyB0aGVuIHNvIGRvCiAgICAgICAgICAgIC8vIHRoZSBlbnRpdGllcyB0aGF0IGRlY2xhcmUgdHlwZSB2YXJpYWJsZXMgb2NjdXJyaW5nIGluIFt0eXBlXS4KICAgICAgICAgICAgcmVnaXN0ZXJEZXBlbmRlbmNpZXMobm9kZSwgdHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB3b3JsZC5jbG9zdXJpemVkTWVtYmVycy5mb3JFYWNoKHByb2Nlc3NFbnRpdHkpOwogICAgICB3b3JsZC5jbG9zdXJpemVkU3RhdGljcy5mb3JFYWNoKHByb2Nlc3NFbnRpdHkpOwogICAgICB3b3JsZC5nZW5lcmljTG9jYWxGdW5jdGlvbnMuZm9yRWFjaChwcm9jZXNzRW50aXR5KTsKICAgIH0KICB9CgogIHZvaWQgX3Byb3BhZ2F0ZVRlc3RzKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50LCBCdWlsdFdvcmxkIHdvcmxkQnVpbGRlcikgewogICAgdm9pZCBwcm9jZXNzVHlwZVZhcmlhYmxlVHlwZShUeXBlVmFyaWFibGVUeXBlIHR5cGUsIHtib29sIGRpcmVjdDogdHJ1ZX0pIHsKICAgICAgVHlwZVZhcmlhYmxlRW50aXR5IHZhcmlhYmxlID0gdHlwZS5lbGVtZW50OwogICAgICBpZiAodmFyaWFibGUudHlwZURlY2xhcmF0aW9uIGlzIENsYXNzRW50aXR5KSB7CiAgICAgICAgX2dldENsYXNzTm9kZSh2YXJpYWJsZS50eXBlRGVjbGFyYXRpb24pLm1hcmtUZXN0KGRpcmVjdDogZGlyZWN0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfZ2V0TWV0aG9kTm9kZSgKICAgICAgICAgICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudCwgd29ybGRCdWlsZGVyLCB2YXJpYWJsZS50eXBlRGVjbGFyYXRpb24pCiAgICAgICAgICAgIC5tYXJrVGVzdChkaXJlY3Q6IGRpcmVjdCk7CiAgICAgIH0KICAgIH0KCiAgICB2b2lkIHByb2Nlc3NUeXBlKERhcnRUeXBlIHR5cGUsIHtib29sIGRpcmVjdDogdHJ1ZX0pIHsKICAgICAgaWYgKHR5cGUgaXMgRnV0dXJlT3JUeXBlKSB7CiAgICAgICAgX2dldENsYXNzTm9kZShjb21tb25FbGVtZW50cy5mdXR1cmVDbGFzcykubWFya0luZGlyZWN0VGVzdCgpOwogICAgICAgIHByb2Nlc3NUeXBlKHR5cGUudHlwZUFyZ3VtZW50LCBkaXJlY3Q6IGZhbHNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0eXBlLmZvckVhY2hUeXBlVmFyaWFibGUoKFR5cGVWYXJpYWJsZVR5cGUgdHlwZSkgewogICAgICAgICAgcHJvY2Vzc1R5cGVWYXJpYWJsZVR5cGUodHlwZSwgZGlyZWN0OiBkaXJlY3QpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CgogICAgd29ybGRCdWlsZGVyLmlzQ2hlY2tzLmZvckVhY2gocHJvY2Vzc1R5cGUpOwogIH0KCiAgdm9pZCBfcHJvcGFnYXRlTGl0ZXJhbHMoCiAgICAgIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQsIEJ1aWx0V29ybGQgd29ybGQpIHsKICAgIHdvcmxkLnR5cGVWYXJpYWJsZVR5cGVMaXRlcmFscy5mb3JFYWNoKChUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZVR5cGUpIHsKICAgICAgVHlwZVZhcmlhYmxlRW50aXR5IHZhcmlhYmxlID0gdHlwZVZhcmlhYmxlVHlwZS5lbGVtZW50OwogICAgICBpZiAodmFyaWFibGUudHlwZURlY2xhcmF0aW9uIGlzIENsYXNzRW50aXR5KSB7CiAgICAgICAgX2dldENsYXNzTm9kZSh2YXJpYWJsZS50eXBlRGVjbGFyYXRpb24pLm1hcmtEaXJlY3RMaXRlcmFsKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2dldE1ldGhvZE5vZGUoZWxlbWVudEVudmlyb25tZW50LCB3b3JsZCwgdmFyaWFibGUudHlwZURlY2xhcmF0aW9uKQogICAgICAgICAgICAubWFya0RpcmVjdExpdGVyYWwoKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBTdHJpbmcgZHVtcCh7Ym9vbCB2ZXJib3NlOiBmYWxzZX0pIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKCiAgICB2b2lkIGFkZE5vZGUoUnRpTm9kZSBub2RlKSB7CiAgICAgIGlmIChub2RlLmhhc1VzZSB8fCBub2RlLmRlcGVuZGVuY2llcy5pc05vdEVtcHR5IHx8IHZlcmJvc2UpIHsKICAgICAgICBzYi53cml0ZSgnICRub2RlJyk7CiAgICAgICAgU3RyaW5nIGNvbW1hID0gJyc7CiAgICAgICAgaWYgKG5vZGUuX3Rlc3RTdGF0ZSAmIDEgIT0gMCkgewogICAgICAgICAgc2Iud3JpdGUoJyBkaXJlY3QgdGVzdCcpOwogICAgICAgICAgY29tbWEgPSAnLCc7CiAgICAgICAgfQogICAgICAgIGlmIChub2RlLl90ZXN0U3RhdGUgJiAyICE9IDApIHsKICAgICAgICAgIHNiLndyaXRlKCckY29tbWEgaW5kaXJlY3QgdGVzdCcpOwogICAgICAgICAgY29tbWEgPSAnLCc7CiAgICAgICAgfQogICAgICAgIGlmIChub2RlLl9saXRlcmFsU3RhdGUgJiAxICE9IDApIHsKICAgICAgICAgIHNiLndyaXRlKCckY29tbWEgZGlyZWN0IGxpdGVyYWwnKTsKICAgICAgICAgIGNvbW1hID0gJywnOwogICAgICAgIH0KICAgICAgICBpZiAobm9kZS5fbGl0ZXJhbFN0YXRlICYgMiAhPSAwKSB7CiAgICAgICAgICBzYi53cml0ZSgnJGNvbW1hIGluZGlyZWN0IGxpdGVyYWwnKTsKICAgICAgICAgIGNvbW1hID0gJywnOwogICAgICAgIH0KICAgICAgICBpZiAobm9kZS5kZXBlbmRlbmNpZXMuaXNOb3RFbXB0eSB8fCB2ZXJib3NlKSB7CiAgICAgICAgICBzYi53cml0ZWxuKCc6Jyk7CiAgICAgICAgICBub2RlLmRlcGVuZGVuY2llcy5mb3JFYWNoKChuKSA9PiBzYi53cml0ZWxuKCcgICRuJykpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzYi53cml0ZWxuKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdm9pZCBhZGRUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgICAgc2Iud3JpdGVsbignICR0eXBlJyk7CiAgICB9CgogICAgc2Iud3JpdGVsbignY2xhc3NlczonKTsKICAgIF9jbGFzc2VzLnZhbHVlcy5mb3JFYWNoKGFkZE5vZGUpOwogICAgc2Iud3JpdGVsbignbWV0aG9kczonKTsKICAgIF9tZXRob2RzLnZhbHVlcy5mb3JFYWNoKGFkZE5vZGUpOwogICAgc2Iud3JpdGVsbignZXhwbGljaXQgaXMtdGVzdHM6Jyk7CiAgICBleHBsaWNpdElzQ2hlY2tzLmZvckVhY2goYWRkVHlwZSk7CiAgICBzYi53cml0ZWxuKCdpbXBsaWNpdCBpcy10ZXN0czonKTsKICAgIGltcGxpY2l0SXNDaGVja3MuZm9yRWFjaChhZGRUeXBlKTsKCiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIHZvaWQgX2NvbGxlY3RSZXN1bHRzKENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50LCBEYXJ0VHlwZXMgdHlwZXMsIEJ1aWx0V29ybGQgd29ybGQsCiAgICAgIHtib29sIGZvclJ0aU5lZWRzOiB0cnVlfSkgewogICAgLy8vIFJlZ2lzdGVyIHRoZSBpbXBsaWNpdCBpcy10ZXN0IG9mIFt0eXBlXS4KICAgIC8vLwogICAgLy8vIElmIFt0eXBlXSBpcyBvZiB0aGUgZm9ybSBgRnV0dXJlT3I8WD5gLCBhbHNvIHJlZ2lzdGVyIHRoZSBpbXBsaWNpdAogICAgLy8vIGlzLXRlc3RzIG9mIGBGdXR1cmU8WD5gIGFuZCBgWGAuCiAgICB2b2lkIGFkZEltcGxpY2l0Q2hlY2soRGFydFR5cGUgdHlwZSkgewogICAgICBpZiAoaW1wbGljaXRJc0NoZWNrcy5hZGQodHlwZSkpIHsKICAgICAgICBpZiAodHlwZSBpcyBGdXR1cmVPclR5cGUpIHsKICAgICAgICAgIGFkZEltcGxpY2l0Q2hlY2soY29tbW9uRWxlbWVudHMuZnV0dXJlVHlwZSh0eXBlLnR5cGVBcmd1bWVudCkpOwogICAgICAgICAgYWRkSW1wbGljaXRDaGVjayh0eXBlLnR5cGVBcmd1bWVudCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdm9pZCBhZGRJbXBsaWNpdENoZWNrcyhJdGVyYWJsZTxEYXJ0VHlwZT4gdHlwZXMpIHsKICAgICAgdHlwZXMuZm9yRWFjaChhZGRJbXBsaWNpdENoZWNrKTsKICAgIH0KCiAgICB3b3JsZC5pc0NoZWNrcy5mb3JFYWNoKChEYXJ0VHlwZSB0eXBlKSB7CiAgICAgIGlmICh0eXBlIGlzIEZ1dHVyZU9yVHlwZSkgewogICAgICAgIGFkZEltcGxpY2l0Q2hlY2soY29tbW9uRWxlbWVudHMuZnV0dXJlVHlwZSh0eXBlLnR5cGVBcmd1bWVudCkpOwogICAgICAgIGFkZEltcGxpY2l0Q2hlY2sodHlwZS50eXBlQXJndW1lbnQpOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBDb21wdXRlIHR5cGUgYXJndW1lbnRzIG9mIGNsYXNzZXMgdGhhdCB1c2Ugb25lIG9mIHRoZWlyIHR5cGUgdmFyaWFibGVzIGluCiAgICAvLyBpcy1jaGVja3MgYW5kIGFkZCB0aGUgaXMtY2hlY2tzIHRoYXQgdGhleSBpbXBseS4KICAgIF9jbGFzc2VzLmZvckVhY2goKENsYXNzRW50aXR5IGNscywgQ2xhc3NOb2RlIG5vZGUpIHsKICAgICAgaWYgKCFub2RlLmhhc1Rlc3QpIHJldHVybjsKICAgICAgLy8gRmluZCBhbGwgaW5zdGFudGlhdGVkIHR5cGVzIHRoYXQgYXJlIGEgc3VidHlwZSBvZiBhIGNsYXNzIHRoYXQgdXNlcwogICAgICAvLyBvbmUgb2YgaXRzIHR5cGUgYXJndW1lbnRzIGluIGFuIGlzLWNoZWNrIGFuZCBhZGQgdGhlIGFyZ3VtZW50cyB0byB0aGUKICAgICAgLy8gc2V0IG9mIGlzLWNoZWNrcy4KICAgICAgZm9yIChJbnRlcmZhY2VUeXBlIHR5cGUgaW4gd29ybGQuaW5zdGFudGlhdGVkVHlwZXMpIHsKICAgICAgICAvLyBXZSBuZWVkIHRoZSB0eXBlIGFzIGluc3RhbmNlIG9mIGl0cyBzdXBlcmNsYXNzIGFueXdheSwgc28gd2UganVzdAogICAgICAgIC8vIHRyeSB0byBjb21wdXRlIHRoZSBzdWJzdGl0dXRpb247IGlmIHRoZSByZXN1bHQgaXMgWzpudWxsOl0sIHRoZQogICAgICAgIC8vIGNsYXNzZXMgYXJlIG5vdCByZWxhdGVkLgogICAgICAgIEludGVyZmFjZVR5cGUgaW5zdGFuY2UgPSB0eXBlcy5hc0luc3RhbmNlT2YodHlwZSwgY2xzKTsKICAgICAgICBpZiAoaW5zdGFuY2UgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChEYXJ0VHlwZSBhcmd1bWVudCBpbiBpbnN0YW5jZS50eXBlQXJndW1lbnRzKSB7CiAgICAgICAgICAgIGFkZEltcGxpY2l0Q2hlY2soYXJndW1lbnQudW5hbGlhc2VkKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIHdvcmxkLmZvckVhY2hTdGF0aWNUeXBlQXJndW1lbnQoCiAgICAgICAgKEVudGl0eSBmdW5jdGlvbiwgSXRlcmFibGU8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgICAgaWYgKCFfZ2V0TWV0aG9kTm9kZShlbGVtZW50RW52aXJvbm1lbnQsIHdvcmxkLCBmdW5jdGlvbikuaGFzVGVzdCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBhZGRJbXBsaWNpdENoZWNrcyh0eXBlQXJndW1lbnRzKTsKICAgIH0pOwoKICAgIGlmIChmb3JSdGlOZWVkcykgewogICAgICBfYXBwbGllZFNlbGVjdG9yTWFwID0gPFNlbGVjdG9yLCBTZXQ8RW50aXR5Pj57fTsKICAgIH0KCiAgICB3b3JsZC5mb3JFYWNoRHluYW1pY1R5cGVBcmd1bWVudCgKICAgICAgICAoU2VsZWN0b3Igc2VsZWN0b3IsIEl0ZXJhYmxlPERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICAgIGZvciAoTWV0aG9kTm9kZSBub2RlIGluIF9tZXRob2RzLnZhbHVlcykgewogICAgICAgIGlmIChub2RlLnNlbGVjdG9yQXBwbGllcyhzZWxlY3RvcikpIHsKICAgICAgICAgIGlmIChmb3JSdGlOZWVkcykgewogICAgICAgICAgICBfYXBwbGllZFNlbGVjdG9yTWFwCiAgICAgICAgICAgICAgICAucHV0SWZBYnNlbnQoc2VsZWN0b3IsICgpID0+IG5ldyBTZXQ8RW50aXR5PigpKQogICAgICAgICAgICAgICAgLmFkZChub2RlLmVudGl0eSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobm9kZS5oYXNUZXN0KSB7CiAgICAgICAgICAgIGFkZEltcGxpY2l0Q2hlY2tzKHR5cGVBcmd1bWVudHMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfQp9CgovLy8gSW50ZXJmYWNlIGZvciB0aGUgY2xhc3NlcyBhbmQgbWV0aG9kcyB0aGF0IG5lZWQgcnVudGltZSB0eXBlcy4KYWJzdHJhY3QgY2xhc3MgUnVudGltZVR5cGVzTmVlZCB7CiAgLy8vIERlc2VyaWFsaXplcyBhIFtSdW50aW1lVHlwZXNOZWVkXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IFJ1bnRpbWVUeXBlc05lZWQucmVhZEZyb21EYXRhU291cmNlKAogICAgICBEYXRhU291cmNlIHNvdXJjZSwgRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCkgewogICAgYm9vbCBpc1RyaXZpYWwgPSBzb3VyY2UucmVhZEJvb2woKTsKICAgIGlmIChpc1RyaXZpYWwpIHsKICAgICAgcmV0dXJuIGNvbnN0IFRyaXZpYWxSdW50aW1lVHlwZXNOZWVkKCk7CiAgICB9CiAgICByZXR1cm4gbmV3IFJ1bnRpbWVUeXBlc05lZWRJbXBsLnJlYWRGcm9tRGF0YVNvdXJjZSgKICAgICAgICBzb3VyY2UsIGVsZW1lbnRFbnZpcm9ubWVudCk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtSdW50aW1lVHlwZXNOZWVkXSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luayk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbY2xzXSBuZWVkcyB0eXBlIGFyZ3VtZW50cyBhdCBydW50aW1lIHR5cGUuCiAgLy8vCiAgLy8vIFRoaXMgaXMgZm9yIGluc3RhbmNlIHRoZSBjYXNlIGZvciBnZW5lcmljIGNsYXNzZXMgdXNlZCBpbiBhIHR5cGUgdGVzdDoKICAvLy8KICAvLy8gICBjbGFzcyBDPFQ+IHt9CiAgLy8vICAgbWFpbigpIHsKICAvLy8gICAgIG5ldyBDPGludD4oKSBpcyBDPGludD47CiAgLy8vICAgICBuZXcgQzxTdHJpbmc+KCkgaXMgQzxTdHJpbmc+OwogIC8vLyAgIH0KICAvLy8KICBib29sIGNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbWV0aG9kXSBuZWVkcyB0eXBlIGFyZ3VtZW50cyBhdCBydW50aW1lIHR5cGUuCiAgLy8vCiAgLy8vIFRoaXMgaXMgZm9yIGluc3RhbmNlIHRoZSBjYXNlIGZvciBnZW5lcmljIG1ldGhvZHMgdGhhdCB1c2UgdHlwZSB0ZXN0czoKICAvLy8KICAvLy8gICBtZXRob2Q8VD4oVCB0KSA9PiB0IGlzIFQ7CiAgLy8vICAgbWFpbigpIHsKICAvLy8gICAgIG1ldGhvZDxpbnQ+KDApOwogIC8vLyAgICAgbWV0aG9kPFN0cmluZz4oJycpOwogIC8vLyAgIH0KICAvLy8KICBib29sIG1ldGhvZE5lZWRzVHlwZUFyZ3VtZW50cyhGdW5jdGlvbkVudGl0eSBtZXRob2QpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYSBzaWduYXR1cmUgaXMgbmVlZGVkIGZvciBbbWV0aG9kXS4KICAvLy8KICAvLy8gQSBzaWduYXR1cmUgaXMgYSBydW50aW1lIG1ldGhvZCB0eXBlIGRlc2NyaXB0b3IgZnVuY3Rpb24gdGhhdCBjcmVhdGVzCiAgLy8vIGEgcnVudGltZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBvZiB0aGUgbWV0aG9kLgogIC8vLwogIC8vLyBUaGlzIGlzIGZvciBpbnN0YW5jZSBuZWVkZWQgZm9yIGluc3RhbmNlIG1ldGhvZHMgb2YgZ2VuZXJpYyBjbGFzc2VzIHRoYXQKICAvLy8gYXJlIHRvcm4gb2ZmIGFuZCB3aG9zZSB0eXBlIHRoZXJlZm9yZSBwb3RlbnRpYWxseSBpcyB1c2VkIGluIGEgdHlwZSB0ZXN0OgogIC8vLwogIC8vLyAgICAgY2xhc3MgQzxUPiB7CiAgLy8vICAgICAgIG1ldGhvZChUIHQpIHt9CiAgLy8vICAgICB9CiAgLy8vICAgICBtYWluKCkgewogIC8vLyAgICAgICBuZXcgQzxpbnQ+KCkubWV0aG9kIGlzIHZvaWQgRnVuY3Rpb24oaW50KTsKICAvLy8gICAgICAgbmV3IEM8U3RyaW5nPigpLm1ldGhvZCBpcyB2b2lkIEZ1bmN0aW9uKFN0cmluZyk7CiAgLy8vICAgICB9CiAgLy8vCiAgLy8vIFNpbmNlIHR5cGUgb2YgdGhlIG1ldGhvZCBkZXBlbmRzIG9uIHRoZSB0eXBlIGFyZ3VtZW50IG9mIGl0cyBlbmNsb3NpbmcKICAvLy8gY2xhc3MsIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QgaXMgYSBKYXZhU2NyaXB0IGZ1bmN0aW9uIGxpa2U6CiAgLy8vCiAgLy8vICAgIHNpZ25hdHVyZTogZnVuY3Rpb24gKFQpIHsKICAvLy8gICAgICByZXR1cm4geydmdW5jJzogdHJ1ZSwgcGFyYW1zOiBbVF19OwogIC8vLyAgICB9CiAgLy8vCiAgYm9vbCBtZXRob2ROZWVkc1NpZ25hdHVyZShGdW5jdGlvbkVudGl0eSBtZXRob2QpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYSBkeW5hbWljIGNhbGwgb2YgW3NlbGVjdG9yXSBuZWVkcyB0byBwYXNzIHR5cGUKICAvLy8gYXJndW1lbnRzLgogIGJvb2wgc2VsZWN0b3JOZWVkc1R5cGVBcmd1bWVudHMoU2VsZWN0b3Igc2VsZWN0b3IpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYSBnZW5lcmljIGluc3RhbnRpYXRpb24gb24gYW4gZXhwcmVzc2lvbiBvZiB0eXBlCiAgLy8vIFtmdW5jdGlvblR5cGVdIHdpdGggdGhlIGdpdmVuIFt0eXBlQXJndW1lbnRDb3VudF0gbmVlZHMgdG8gcGFzcyB0eXBlCiAgLy8vIGFyZ3VtZW50cy4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgW2Z1bmN0aW9uVHlwZV0uCiAgYm9vbCBpbnN0YW50aWF0aW9uTmVlZHNUeXBlQXJndW1lbnRzKAogICAgICBEYXJ0VHlwZSBmdW5jdGlvblR5cGUsIGludCB0eXBlQXJndW1lbnRDb3VudCk7Cn0KCmNsYXNzIFRyaXZpYWxSdW50aW1lVHlwZXNOZWVkIGltcGxlbWVudHMgUnVudGltZVR5cGVzTmVlZCB7CiAgY29uc3QgVHJpdmlhbFJ1bnRpbWVUeXBlc05lZWQoKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUJvb2wodHJ1ZSk7IC8vIElzIHRyaXZpYWwuCiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKENsYXNzRW50aXR5IGNscykgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBtZXRob2ROZWVkc1NpZ25hdHVyZShGdW5jdGlvbkVudGl0eSBtZXRob2QpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgbWV0aG9kTmVlZHNUeXBlQXJndW1lbnRzKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkgPT4KICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQWxpZ24gaGFuZGxpbmcgb2YgdHlwZSBhcmd1bWVudHMgcGFzc2VkIHRvIGZhY3RvcnkKICAgICAgLy8gY29uc3RydWN0b3JzIHdpdGggdHlwZSBhcmd1bWVudHMgcGFzc2VkIHRoZSByZWd1bGFyIGdlbmVyaWMgbWV0aG9kcy4KICAgICAgIShtZXRob2QgaXMgQ29uc3RydWN0b3JFbnRpdHkgJiYgbWV0aG9kLmlzRmFjdG9yeUNvbnN0cnVjdG9yKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBzZWxlY3Rvck5lZWRzVHlwZUFyZ3VtZW50cyhTZWxlY3RvciBzZWxlY3RvcikgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpbnN0YW50aWF0aW9uTmVlZHNUeXBlQXJndW1lbnRzKAogICAgICBEYXJ0VHlwZSBmdW5jdGlvblR5cGUsIGludCB0eXBlQXJndW1lbnRDb3VudCkgewogICAgcmV0dXJuIHRydWU7CiAgfQp9CgpjbGFzcyBSdW50aW1lVHlwZXNOZWVkSW1wbCBpbXBsZW1lbnRzIFJ1bnRpbWVUeXBlc05lZWQgewogIC8vLyBUYWcgdXNlZCBmb3IgaWRlbnRpZnlpbmcgc2VyaWFsaXplZCBbUnVudGltZVR5cGVzTmVlZF0gb2JqZWN0cyBpbiBhCiAgLy8vIGRlYnVnZ2luZyBkYXRhIHN0cmVhbS4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHRhZyA9ICdydW50aW1lLXR5cGVzLW5lZWQnOwoKICBmaW5hbCBFbGVtZW50RW52aXJvbm1lbnQgX2VsZW1lbnRFbnZpcm9ubWVudDsKICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXNOZWVkaW5nVHlwZUFyZ3VtZW50czsKICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IG1ldGhvZHNOZWVkaW5nU2lnbmF0dXJlOwogIGZpbmFsIFNldDxGdW5jdGlvbkVudGl0eT4gbWV0aG9kc05lZWRpbmdUeXBlQXJndW1lbnRzOwogIGZpbmFsIFNldDxMb2NhbD4gbG9jYWxGdW5jdGlvbnNOZWVkaW5nU2lnbmF0dXJlOwogIGZpbmFsIFNldDxMb2NhbD4gbG9jYWxGdW5jdGlvbnNOZWVkaW5nVHlwZUFyZ3VtZW50czsKICBmaW5hbCBTZXQ8U2VsZWN0b3I+IHNlbGVjdG9yc05lZWRpbmdUeXBlQXJndW1lbnRzOwogIGZpbmFsIFNldDxpbnQ+IGluc3RhbnRpYXRpb25zTmVlZGluZ1R5cGVBcmd1bWVudHM7CgogIFJ1bnRpbWVUeXBlc05lZWRJbXBsKAogICAgICB0aGlzLl9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIHRoaXMuY2xhc3Nlc05lZWRpbmdUeXBlQXJndW1lbnRzLAogICAgICB0aGlzLm1ldGhvZHNOZWVkaW5nU2lnbmF0dXJlLAogICAgICB0aGlzLm1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgdGhpcy5sb2NhbEZ1bmN0aW9uc05lZWRpbmdTaWduYXR1cmUsCiAgICAgIHRoaXMubG9jYWxGdW5jdGlvbnNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgdGhpcy5zZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgdGhpcy5pbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzKTsKCiAgZmFjdG9yeSBSdW50aW1lVHlwZXNOZWVkSW1wbC5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50KSB7CiAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgIFNldDxDbGFzc0VudGl0eT4gY2xhc3Nlc05lZWRpbmdUeXBlQXJndW1lbnRzID0KICAgICAgICBzb3VyY2UucmVhZENsYXNzZXM8Q2xhc3NFbnRpdHk+KCkudG9TZXQoKTsKICAgIFNldDxGdW5jdGlvbkVudGl0eT4gbWV0aG9kc05lZWRpbmdTaWduYXR1cmUgPQogICAgICAgIHNvdXJjZS5yZWFkTWVtYmVyczxGdW5jdGlvbkVudGl0eT4oKS50b1NldCgpOwogICAgU2V0PEZ1bmN0aW9uRW50aXR5PiBtZXRob2RzTmVlZGluZ1R5cGVBcmd1bWVudHMgPQogICAgICAgIHNvdXJjZS5yZWFkTWVtYmVyczxGdW5jdGlvbkVudGl0eT4oKS50b1NldCgpOwogICAgU2V0PFNlbGVjdG9yPiBzZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50cyA9CiAgICAgICAgc291cmNlLnJlYWRMaXN0KCgpID0+IG5ldyBTZWxlY3Rvci5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKSkudG9TZXQoKTsKICAgIFNldDxpbnQ+IGluc3RhbnRpYXRpb25zTmVlZGluZ1R5cGVBcmd1bWVudHMgPQogICAgICAgIHNvdXJjZS5yZWFkTGlzdChzb3VyY2UucmVhZEludCkudG9TZXQoKTsKICAgIHNvdXJjZS5lbmQodGFnKTsKICAgIHJldHVybiBuZXcgUnVudGltZVR5cGVzTmVlZEltcGwoCiAgICAgICAgZWxlbWVudEVudmlyb25tZW50LAogICAgICAgIGNsYXNzZXNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgICBtZXRob2RzTmVlZGluZ1NpZ25hdHVyZSwKICAgICAgICBtZXRob2RzTmVlZGluZ1R5cGVBcmd1bWVudHMsCiAgICAgICAgbnVsbCwKICAgICAgICBudWxsLAogICAgICAgIHNlbGVjdG9yc05lZWRpbmdUeXBlQXJndW1lbnRzLAogICAgICAgIGluc3RhbnRpYXRpb25zTmVlZGluZ1R5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay53cml0ZUJvb2woZmFsc2UpOyAvLyBJcyBfbm90XyB0cml2aWFsLgogICAgc2luay5iZWdpbih0YWcpOwogICAgc2luay53cml0ZUNsYXNzZXMoY2xhc3Nlc05lZWRpbmdUeXBlQXJndW1lbnRzKTsKICAgIHNpbmsud3JpdGVNZW1iZXJzKG1ldGhvZHNOZWVkaW5nU2lnbmF0dXJlKTsKICAgIHNpbmsud3JpdGVNZW1iZXJzKG1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cyk7CiAgICBhc3NlcnQobG9jYWxGdW5jdGlvbnNOZWVkaW5nU2lnbmF0dXJlID09IG51bGwpOwogICAgYXNzZXJ0KGxvY2FsRnVuY3Rpb25zTmVlZGluZ1R5cGVBcmd1bWVudHMgPT0gbnVsbCk7CiAgICBzaW5rLndyaXRlTGlzdChzZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgICAoU2VsZWN0b3Igc2VsZWN0b3IpID0+IHNlbGVjdG9yLndyaXRlVG9EYXRhU2luayhzaW5rKSk7CiAgICBzaW5rLndyaXRlTGlzdChpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzLCBzaW5rLndyaXRlSW50KTsKICAgIHNpbmsuZW5kKHRhZyk7CiAgfQoKICBib29sIGNoZWNrQ2xhc3MoY292YXJpYW50IENsYXNzRW50aXR5IGNscykgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjbGFzc05lZWRzVHlwZUFyZ3VtZW50cyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIGFzc2VydChjaGVja0NsYXNzKGNscykpOwogICAgaWYgKCFfZWxlbWVudEVudmlyb25tZW50LmlzR2VuZXJpY0NsYXNzKGNscykpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBjbGFzc2VzTmVlZGluZ1R5cGVBcmd1bWVudHMuY29udGFpbnMoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgbWV0aG9kTmVlZHNTaWduYXR1cmUoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24pIHsKICAgIHJldHVybiBtZXRob2RzTmVlZGluZ1NpZ25hdHVyZS5jb250YWlucyhmdW5jdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG1ldGhvZE5lZWRzVHlwZUFyZ3VtZW50cyhGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgcmV0dXJuIG1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cy5jb250YWlucyhmdW5jdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHNlbGVjdG9yTmVlZHNUeXBlQXJndW1lbnRzKFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICBpZiAoc2VsZWN0b3IuY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudCA9PSAwKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHMuY29udGFpbnMoc2VsZWN0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpbnN0YW50aWF0aW9uTmVlZHNUeXBlQXJndW1lbnRzKAogICAgICBEYXJ0VHlwZSBmdW5jdGlvblR5cGUsIGludCB0eXBlQXJndW1lbnRDb3VudCkgewogICAgcmV0dXJuIGluc3RhbnRpYXRpb25zTmVlZGluZ1R5cGVBcmd1bWVudHMuY29udGFpbnModHlwZUFyZ3VtZW50Q291bnQpOwogIH0KfQoKLy8vIEludGVyZmFjZSBmb3IgY29tcHV0aW5nIGNsYXNzZXMgYW5kIG1ldGhvZHMgdGhhdCBuZWVkIHJ1bnRpbWUgdHlwZXMuCmFic3RyYWN0IGNsYXNzIFJ1bnRpbWVUeXBlc05lZWRCdWlsZGVyIHsKICAvLy8gUmVnaXN0ZXJzIHRoYXQgW2Nsc10gdXNlcyBvbmUgb2YgaXRzIHR5cGUgdmFyaWFibGVzIGFzIGEgbGl0ZXJhbC4KICB2b2lkIHJlZ2lzdGVyQ2xhc3NVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWwoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJlZ2lzdGVycyB0aGF0IFttZXRob2RdIHVzZXMgb25lIG9mIGl0cyB0eXBlIHZhcmlhYmxlcyBhcyBhIGxpdGVyYWwuCiAgdm9pZCByZWdpc3Rlck1ldGhvZFVzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbChGdW5jdGlvbkVudGl0eSBtZXRob2QpOwoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgW2xvY2FsRnVuY3Rpb25dIHVzZXMgb25lIG9mIGl0cyB0eXBlIHZhcmlhYmxlcyBhcyBhCiAgLy8vIGxpdGVyYWwuCiAgdm9pZCByZWdpc3RlckxvY2FsRnVuY3Rpb25Vc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWwoTG9jYWwgbG9jYWxGdW5jdGlvbik7CgogIC8vLyBSZWdpc3RlcnMgdGhhdCBhIGdlbmVyaWMgW2luc3RhbnRpYXRpb25dIGlzIHVzZWQuCiAgdm9pZCByZWdpc3RlckdlbmVyaWNJbnN0YW50aWF0aW9uKEdlbmVyaWNJbnN0YW50aWF0aW9uIGluc3RhbnRpYXRpb24pOwoKICAvLy8gQ29tcHV0ZXMgdGhlIFtSdW50aW1lVHlwZXNOZWVkXSBmb3IgdGhlIGRhdGEgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgYnVpbGRlci4KICBSdW50aW1lVHlwZXNOZWVkIGNvbXB1dGVSdW50aW1lVHlwZXNOZWVkKAogICAgICBLQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zKTsKfQoKY2xhc3MgVHJpdmlhbFJ1bnRpbWVUeXBlc05lZWRCdWlsZGVyIGltcGxlbWVudHMgUnVudGltZVR5cGVzTmVlZEJ1aWxkZXIgewogIGNvbnN0IFRyaXZpYWxSdW50aW1lVHlwZXNOZWVkQnVpbGRlcigpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQ2xhc3NVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWwoQ2xhc3NFbnRpdHkgY2xzKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTWV0aG9kVXNpbmdUeXBlVmFyaWFibGVMaXRlcmFsKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckxvY2FsRnVuY3Rpb25Vc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWwoTG9jYWwgbG9jYWxGdW5jdGlvbikge30KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckdlbmVyaWNJbnN0YW50aWF0aW9uKEdlbmVyaWNJbnN0YW50aWF0aW9uIGluc3RhbnRpYXRpb24pIHt9CgogIEBvdmVycmlkZQogIFJ1bnRpbWVUeXBlc05lZWQgY29tcHV0ZVJ1bnRpbWVUeXBlc05lZWQoCiAgICAgIEtDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMpIHsKICAgIHJldHVybiBjb25zdCBUcml2aWFsUnVudGltZVR5cGVzTmVlZCgpOwogIH0KfQoKY2xhc3MgUnVudGltZVR5cGVzTmVlZEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgUnVudGltZVR5cGVzTmVlZEJ1aWxkZXIgewogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBfZWxlbWVudEVudmlyb25tZW50OwoKICBmaW5hbCBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXNVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWxzID0KICAgICAgbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKCiAgZmluYWwgU2V0PEZ1bmN0aW9uRW50aXR5PiBtZXRob2RzVXNpbmdUeXBlVmFyaWFibGVMaXRlcmFscyA9CiAgICAgIG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CgogIGZpbmFsIFNldDxMb2NhbD4gbG9jYWxGdW5jdGlvbnNVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWxzID0gbmV3IFNldDxMb2NhbD4oKTsKCiAgTWFwPFNlbGVjdG9yLCBTZXQ8RW50aXR5Pj4gc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHNGb3JUZXN0aW5nOwoKICBNYXA8R2VuZXJpY0luc3RhbnRpYXRpb24sIFNldDxFbnRpdHk+PgogICAgICBpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzRm9yVGVzdGluZzsKCiAgZmluYWwgU2V0PEdlbmVyaWNJbnN0YW50aWF0aW9uPiBfZ2VuZXJpY0luc3RhbnRpYXRpb25zID0KICAgICAgbmV3IFNldDxHZW5lcmljSW5zdGFudGlhdGlvbj4oKTsKCiAgVHlwZVZhcmlhYmxlVGVzdHMgdHlwZVZhcmlhYmxlVGVzdHNGb3JUZXN0aW5nOwoKICBSdW50aW1lVHlwZXNOZWVkQnVpbGRlckltcGwodGhpcy5fZWxlbWVudEVudmlyb25tZW50KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckNsYXNzVXNpbmdUeXBlVmFyaWFibGVMaXRlcmFsKENsYXNzRW50aXR5IGNscykgewogICAgY2xhc3Nlc1VzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbHMuYWRkKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTWV0aG9kVXNpbmdUeXBlVmFyaWFibGVMaXRlcmFsKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkgewogICAgbWV0aG9kc1VzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbHMuYWRkKG1ldGhvZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTG9jYWxGdW5jdGlvblVzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbChMb2NhbCBsb2NhbEZ1bmN0aW9uKSB7CiAgICBsb2NhbEZ1bmN0aW9uc1VzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbHMuYWRkKGxvY2FsRnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckdlbmVyaWNJbnN0YW50aWF0aW9uKEdlbmVyaWNJbnN0YW50aWF0aW9uIGluc3RhbnRpYXRpb24pIHsKICAgIF9nZW5lcmljSW5zdGFudGlhdGlvbnMuYWRkKGluc3RhbnRpYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgUnVudGltZVR5cGVzTmVlZCBjb21wdXRlUnVudGltZVR5cGVzTmVlZCgKICAgICAgS0Nsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBDb21waWxlck9wdGlvbnMgb3B0aW9ucykgewogICAgVHlwZVZhcmlhYmxlVGVzdHMgdHlwZVZhcmlhYmxlVGVzdHMgPSBuZXcgVHlwZVZhcmlhYmxlVGVzdHMoCiAgICAgICAgY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LAogICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLAogICAgICAgIGNsb3NlZFdvcmxkLmRhcnRUeXBlcywKICAgICAgICBjbG9zZWRXb3JsZCwKICAgICAgICBfZ2VuZXJpY0luc3RhbnRpYXRpb25zKTsKICAgIFNldDxDbGFzc0VudGl0eT4gY2xhc3Nlc05lZWRpbmdUeXBlQXJndW1lbnRzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgIFNldDxGdW5jdGlvbkVudGl0eT4gbWV0aG9kc05lZWRpbmdTaWduYXR1cmUgPSBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwogICAgU2V0PEZ1bmN0aW9uRW50aXR5PiBtZXRob2RzTmVlZGluZ1R5cGVBcmd1bWVudHMgPSBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwogICAgU2V0PExvY2FsPiBsb2NhbEZ1bmN0aW9uc05lZWRpbmdTaWduYXR1cmUgPSBuZXcgU2V0PExvY2FsPigpOwogICAgU2V0PExvY2FsPiBsb2NhbEZ1bmN0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzID0gbmV3IFNldDxMb2NhbD4oKTsKICAgIFNldDxFbnRpdHk+IHByb2Nlc3NlZEVudGl0aWVzID0gbmV3IFNldDxFbnRpdHk+KCk7CgogICAgLy8gRmluZCB0aGUgY2xhc3NlcyB0aGF0IG5lZWQgdHlwZSBhcmd1bWVudHMgYXQgcnVudGltZS4gU3VjaAogICAgLy8gY2xhc3NlcyBhcmU6CiAgICAvLyAoMSkgdXNlZCBpbiBhbiBpcyBjaGVjayB3aXRoIHR5cGUgdmFyaWFibGVzLAogICAgLy8gKDIpIGRlcGVuZGVuY2llcyBvZiBjbGFzc2VzIGluICgxKSwKICAgIC8vICgzKSBzdWJjbGFzc2VzIG9mICgyKSBhbmQgKDMpLgogICAgdm9pZCBwb3RlbnRpYWxseU5lZWRUeXBlQXJndW1lbnRzKEVudGl0eSBlbnRpdHkpIHsKICAgICAgLy8gRnVuY3Rpb25zIHdpdGggdHlwZSBhcmd1bWVudHMgY2FuIGhhdmUgZGVwZW5kZW5jaWVzIG9mIGVhY2ggb3RoZXIgKGlmCiAgICAgIC8vIHRoZSBmdW5jdGlvbnMgY2FsbCBlYWNoIG90aGVyKSBzbyB3ZSBrZWVwIGEgc2V0IHRvIHByZXZlbnQgaW5maW5pdGVseQogICAgICAvLyByZWN1cnNpbmcgb3ZlciB0aGUgc2FtZSBlbnRpdGllcy4KICAgICAgaWYgKHByb2Nlc3NlZEVudGl0aWVzLmNvbnRhaW5zKGVudGl0eSkpIHJldHVybjsKCiAgICAgIHByb2Nlc3NlZEVudGl0aWVzLmFkZChlbnRpdHkpOwogICAgICBpZiAoZW50aXR5IGlzIENsYXNzRW50aXR5KSB7CiAgICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gZW50aXR5OwogICAgICAgIGlmICghX2VsZW1lbnRFbnZpcm9ubWVudC5pc0dlbmVyaWNDbGFzcyhjbHMpKSByZXR1cm47CiAgICAgICAgaWYgKGNsYXNzZXNOZWVkaW5nVHlwZUFyZ3VtZW50cy5jb250YWlucyhjbHMpKSByZXR1cm47CiAgICAgICAgY2xhc3Nlc05lZWRpbmdUeXBlQXJndW1lbnRzLmFkZChjbHMpOwoKICAgICAgICAvLyBUT0RPKG5nZW9mZnJheSk6IFRoaXMgc2hvdWxkIHVzZSBzdWJjbGFzc2VzLCBub3Qgc3VidHlwZXMuCiAgICAgICAgY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuZm9yRWFjaFN0cmljdFN1YnR5cGVPZihjbHMsCiAgICAgICAgICAgIChDbGFzc0VudGl0eSBzdWIpIHsKICAgICAgICAgIHBvdGVudGlhbGx5TmVlZFR5cGVBcmd1bWVudHMoc3ViKTsKICAgICAgICAgIHJldHVybiBJdGVyYXRpb25TdGVwLkNPTlRJTlVFOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGVudGl0eSBpcyBGdW5jdGlvbkVudGl0eSkgewogICAgICAgIG1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cy5hZGQoZW50aXR5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbEZ1bmN0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzLmFkZChlbnRpdHkpOwogICAgICB9CgogICAgICBJdGVyYWJsZTxFbnRpdHk+IGRlcGVuZGVuY2llcyA9CiAgICAgICAgICB0eXBlVmFyaWFibGVUZXN0cy5nZXRUeXBlQXJndW1lbnREZXBlbmRlbmNpZXMoZW50aXR5KTsKICAgICAgZGVwZW5kZW5jaWVzLmZvckVhY2goKEVudGl0eSBvdGhlcikgewogICAgICAgIHBvdGVudGlhbGx5TmVlZFR5cGVBcmd1bWVudHMob3RoZXIpOwogICAgICB9KTsKICAgIH0KCiAgICBTZXQ8TG9jYWw+IGxvY2FsRnVuY3Rpb25zID0gY2xvc2VkV29ybGQubG9jYWxGdW5jdGlvbnMudG9TZXQoKTsKICAgIFNldDxGdW5jdGlvbkVudGl0eT4gY2xvc3VyaXplZE1lbWJlcnMgPQogICAgICAgIGNsb3NlZFdvcmxkLmNsb3N1cml6ZWRNZW1iZXJzV2l0aEZyZWVUeXBlVmFyaWFibGVzLnRvU2V0KCk7CgogICAgLy8gQ2hlY2sgbG9jYWwgZnVuY3Rpb25zIGFuZCBjbG9zdXJpemVkIG1lbWJlcnMuCiAgICB2b2lkIGNoZWNrQ2xvc3VyZXMoe0RhcnRUeXBlIHBvdGVudGlhbFN1YnR5cGVPZn0pIHsKICAgICAgYm9vbCBjaGVja0Z1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlKSB7CiAgICAgICAgQ2xhc3NFbnRpdHkgY29udGV4dENsYXNzID0gRGFydFR5cGVzLmdldENsYXNzQ29udGV4dChmdW5jdGlvblR5cGUpOwogICAgICAgIGlmIChjb250ZXh0Q2xhc3MgIT0gbnVsbCAmJgogICAgICAgICAgICAocG90ZW50aWFsU3VidHlwZU9mID09IG51bGwgfHwKICAgICAgICAgICAgICAgIGNsb3NlZFdvcmxkLmRhcnRUeXBlcwogICAgICAgICAgICAgICAgICAgIC5pc1BvdGVudGlhbFN1YnR5cGUoZnVuY3Rpb25UeXBlLCBwb3RlbnRpYWxTdWJ0eXBlT2YpKSkgewogICAgICAgICAgcG90ZW50aWFsbHlOZWVkVHlwZUFyZ3VtZW50cyhjb250ZXh0Q2xhc3MpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgU2V0PExvY2FsPiBsb2NhbEZ1bmN0aW9uc1RvUmVtb3ZlOwogICAgICBTZXQ8RnVuY3Rpb25FbnRpdHk+IGNsb3N1cml6ZWRNZW1iZXJzVG9SZW1vdmU7CiAgICAgIGZvciAoTG9jYWwgZnVuY3Rpb24gaW4gbG9jYWxGdW5jdGlvbnMpIHsKICAgICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0KICAgICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRMb2NhbEZ1bmN0aW9uVHlwZShmdW5jdGlvbik7CiAgICAgICAgaWYgKHBvdGVudGlhbFN1YnR5cGVPZiA9PSBudWxsIHx8CiAgICAgICAgICAgIGNsb3NlZFdvcmxkLmRhcnRUeXBlcwogICAgICAgICAgICAgICAgLmlzUG90ZW50aWFsU3VidHlwZShmdW5jdGlvblR5cGUsIHBvdGVudGlhbFN1YnR5cGVPZiwKICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgcmVnaXN0ZXIgZ2VuZXJpYyBpbnN0YW50aWF0aW9ucwogICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgYXNzdW1lSW5zdGFudGlhdGlvbnM6IF9nZW5lcmljSW5zdGFudGlhdGlvbnMuaXNOb3RFbXB0eSkpIHsKICAgICAgICAgIGZ1bmN0aW9uVHlwZS5mb3JFYWNoVHlwZVZhcmlhYmxlKChUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZSkgewogICAgICAgICAgICBFbnRpdHkgdHlwZURlY2xhcmF0aW9uID0gdHlwZVZhcmlhYmxlLmVsZW1lbnQudHlwZURlY2xhcmF0aW9uOwogICAgICAgICAgICBpZiAoIXByb2Nlc3NlZEVudGl0aWVzLmNvbnRhaW5zKHR5cGVEZWNsYXJhdGlvbikpIHsKICAgICAgICAgICAgICBwb3RlbnRpYWxseU5lZWRUeXBlQXJndW1lbnRzKHR5cGVEZWNsYXJhdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgbG9jYWxGdW5jdGlvbnNOZWVkaW5nU2lnbmF0dXJlLmFkZChmdW5jdGlvbik7CiAgICAgICAgICBsb2NhbEZ1bmN0aW9uc1RvUmVtb3ZlID8/PSBuZXcgU2V0PExvY2FsPigpOwogICAgICAgICAgbG9jYWxGdW5jdGlvbnNUb1JlbW92ZS5hZGQoZnVuY3Rpb24pOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uIGluIGNsb3N1cml6ZWRNZW1iZXJzKSB7CiAgICAgICAgaWYgKGNoZWNrRnVuY3Rpb25UeXBlKF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKGZ1bmN0aW9uKSkpIHsKICAgICAgICAgIG1ldGhvZHNOZWVkaW5nU2lnbmF0dXJlLmFkZChmdW5jdGlvbik7CiAgICAgICAgICBjbG9zdXJpemVkTWVtYmVyc1RvUmVtb3ZlID8/PSBuZXcgU2V0PEZ1bmN0aW9uRW50aXR5PigpOwogICAgICAgICAgY2xvc3VyaXplZE1lbWJlcnNUb1JlbW92ZS5hZGQoZnVuY3Rpb24pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobG9jYWxGdW5jdGlvbnNUb1JlbW92ZSAhPSBudWxsKSB7CiAgICAgICAgbG9jYWxGdW5jdGlvbnMucmVtb3ZlQWxsKGxvY2FsRnVuY3Rpb25zVG9SZW1vdmUpOwogICAgICB9CiAgICAgIGlmIChjbG9zdXJpemVkTWVtYmVyc1RvUmVtb3ZlICE9IG51bGwpIHsKICAgICAgICBjbG9zdXJpemVkTWVtYmVycy5yZW1vdmVBbGwoY2xvc3VyaXplZE1lbWJlcnNUb1JlbW92ZSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBDb21wdXRlIHRoZSBzZXQgb2YgYWxsIGNsYXNzZXMgYW5kIG1ldGhvZHMgdGhhdCBuZWVkIHJ1bnRpbWUgdHlwZQogICAgLy8gaW5mb3JtYXRpb24uCgogICAgdm9pZCBwcm9jZXNzQ2hlY2tzKFNldDxEYXJ0VHlwZT4gY2hlY2tzKSB7CiAgICAgIGNoZWNrcy5mb3JFYWNoKChEYXJ0VHlwZSB0eXBlKSB7CiAgICAgICAgaWYgKHR5cGUuaXNJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICBJbnRlcmZhY2VUeXBlIGl0ZiA9IHR5cGU7CiAgICAgICAgICBpZiAoIWl0Zi50cmVhdEFzUmF3KSB7CiAgICAgICAgICAgIHBvdGVudGlhbGx5TmVlZFR5cGVBcmd1bWVudHMoaXRmLmVsZW1lbnQpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0eXBlLmZvckVhY2hUeXBlVmFyaWFibGUoKFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlKSB7CiAgICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyBjaGVja3MgYWdhaW5zdCB0eXBlIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb24gdHlwZXMKICAgICAgICAgICAgLy8gY29udGFpbmluZyB0eXBlIHZhcmlhYmxlcy4KICAgICAgICAgICAgRW50aXR5IHR5cGVEZWNsYXJhdGlvbiA9IHR5cGVWYXJpYWJsZS5lbGVtZW50LnR5cGVEZWNsYXJhdGlvbjsKICAgICAgICAgICAgcG90ZW50aWFsbHlOZWVkVHlwZUFyZ3VtZW50cyh0eXBlRGVjbGFyYXRpb24pOwogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAodHlwZS5pc0Z1bmN0aW9uVHlwZSkgewogICAgICAgICAgICBjaGVja0Nsb3N1cmVzKHBvdGVudGlhbFN1YnR5cGVPZjogdHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodHlwZSBpcyBGdXR1cmVPclR5cGUpIHsKICAgICAgICAgICAgcG90ZW50aWFsbHlOZWVkVHlwZUFyZ3VtZW50cygKICAgICAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmZ1dHVyZUNsYXNzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIHByb2Nlc3NDaGVja3ModHlwZVZhcmlhYmxlVGVzdHMuZXhwbGljaXRJc0NoZWNrcyk7CiAgICBwcm9jZXNzQ2hlY2tzKHR5cGVWYXJpYWJsZVRlc3RzLmltcGxpY2l0SXNDaGVja3MpOwoKICAgIC8vIEFkZCB0aGUgY2xhc3NlcywgbWV0aG9kcyBhbmQgbG9jYWwgZnVuY3Rpb25zIHRoYXQgbmVlZCB0eXBlIGFyZ3VtZW50cwogICAgLy8gYmVjYXVzZSB0aGV5IHVzZSBhIHR5cGUgdmFyaWFibGUgYXMgYSBsaXRlcmFsLgogICAgY2xhc3Nlc1VzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbHMuZm9yRWFjaChwb3RlbnRpYWxseU5lZWRUeXBlQXJndW1lbnRzKTsKICAgIG1ldGhvZHNVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWxzLmZvckVhY2gocG90ZW50aWFsbHlOZWVkVHlwZUFyZ3VtZW50cyk7CiAgICBsb2NhbEZ1bmN0aW9uc1VzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbHMKICAgICAgICAuZm9yRWFjaChwb3RlbnRpYWxseU5lZWRUeXBlQXJndW1lbnRzKTsKCiAgICBpZiAoY2xvc2VkV29ybGQuaXNNZW1iZXJVc2VkKAogICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmludm9jYXRpb25UeXBlQXJndW1lbnRHZXR0ZXIpKSB7CiAgICAgIC8vIElmIGBJbnZvY2F0aW9uLnR5cGVBcmd1bWVudHNgIGlzIGxpdmUsIG1hcmsgYWxsIHVzZXItZGVmaW5lZAogICAgICAvLyBpbXBsZW1lbnRhdGlvbnMgb2YgYG5vU3VjaE1ldGhvZGAgYXMgbmVlZGluZyB0eXBlIGFyZ3VtZW50cy4KICAgICAgZm9yIChNZW1iZXJFbnRpdHkgbWVtYmVyIGluIGNsb3NlZFdvcmxkLnVzZXJOb1N1Y2hNZXRob2RzKSB7CiAgICAgICAgcG90ZW50aWFsbHlOZWVkVHlwZUFyZ3VtZW50cyhtZW1iZXIpOwogICAgICB9CiAgICB9CgogICAgdm9pZCBjaGVja0Z1bmN0aW9uKEVudGl0eSBmdW5jdGlvbiwgRnVuY3Rpb25UeXBlIHR5cGUpIHsKICAgICAgZm9yIChGdW5jdGlvblR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUgaW4gdHlwZS50eXBlVmFyaWFibGVzKSB7CiAgICAgICAgRGFydFR5cGUgYm91bmQgPSB0eXBlVmFyaWFibGUuYm91bmQ7CiAgICAgICAgaWYgKCFib3VuZC5pc0R5bmFtaWMgJiYKICAgICAgICAgICAgIWJvdW5kLmlzVm9pZCAmJgogICAgICAgICAgICBib3VuZCAhPSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5vYmplY3RUeXBlKSB7CiAgICAgICAgICBwb3RlbnRpYWxseU5lZWRUeXBlQXJndW1lbnRzKGZ1bmN0aW9uKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGNsb3NlZFdvcmxkLmZvckVhY2hHZW5lcmljTWV0aG9kKChGdW5jdGlvbkVudGl0eSBtZXRob2QpIHsKICAgICAgaWYgKGNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YQogICAgICAgICAgLmdldFBhcmFtZXRlckNoZWNrUG9saWN5KG1ldGhvZCkKICAgICAgICAgIC5pc0VtaXR0ZWQpIHsKICAgICAgICBjaGVja0Z1bmN0aW9uKG1ldGhvZCwgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUobWV0aG9kKSk7CiAgICAgIH0KICAgIH0pOwogICAgZm9yIChLTG9jYWxGdW5jdGlvbiBmdW5jdGlvbiBpbiBjbG9zZWRXb3JsZC5nZW5lcmljTG9jYWxGdW5jdGlvbnMpIHsKICAgICAgaWYgKGNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YQogICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCBAcHJhZ21hIG9uIGxvY2FsIGZ1bmN0aW9ucyBhbmQgdXNlCiAgICAgICAgICAvLyB0aGlzIGhlcmUgaW5zdGVhZCBvZiB0aGUgZW5jbG9zaW5nIG1lbWJlci4KICAgICAgICAgIC5nZXRQYXJhbWV0ZXJDaGVja1BvbGljeShmdW5jdGlvbi5tZW1iZXJDb250ZXh0KQogICAgICAgICAgLmlzRW1pdHRlZCkgewogICAgICAgIGNoZWNrRnVuY3Rpb24oCiAgICAgICAgICAgIGZ1bmN0aW9uLCBfZWxlbWVudEVudmlyb25tZW50LmdldExvY2FsRnVuY3Rpb25UeXBlKGZ1bmN0aW9uKSk7CiAgICAgIH0KICAgIH0KCiAgICBCYWNrZW5kVXNhZ2UgYmFja2VuZFVzYWdlID0gY2xvc2VkV29ybGQuYmFja2VuZFVzYWdlOwogICAgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMgPSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50czsKCiAgICAvLy8gU2V0IHRvIGB0cnVlYCBpZiBzdWJjbGFzc2VzIG9mIGBPYmplY3RgIG5lZWQgcnVudGltZVR5cGUuIFRoaXMgaXMKICAgIC8vLyBvbmx5IHVzZWQgdG8gc3RvcCB0aGUgY29tcHV0YXRpb24gZWFybHkuCiAgICBib29sIG5lZWRlZE9uQWxsID0gZmFsc2U7CgogICAgLy8vIFNldCB0byBgdHJ1ZWAgaWYgc3ViY2xhc3NlcyBvZiBgRnVuY3Rpb25gIG5lZWQgcnVudGltZVR5cGUuCiAgICBib29sIG5lZWRlZE9uRnVuY3Rpb25zID0gZmFsc2U7CgogICAgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzRGlyZWN0bHlOZWVkaW5nUnVudGltZVR5cGUgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwoKICAgIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBpbXBsaWVkQ2xhc3NlcyhEYXJ0VHlwZSB0eXBlKSB7CiAgICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICByZXR1cm4gW3R5cGUuZWxlbWVudF07CiAgICAgIH0gZWxzZSBpZiAodHlwZSBpcyBEeW5hbWljVHlwZSkgewogICAgICAgIHJldHVybiBbY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3NdOwogICAgICB9IGVsc2UgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW5jbHVkZSBvbmx5IHBvdGVudGlhbCBmdW5jdGlvbiB0eXBlIHN1YnR5cGVzLgogICAgICAgIHJldHVybiBbY29tbW9uRWxlbWVudHMuZnVuY3Rpb25DbGFzc107CiAgICAgIH0gZWxzZSBpZiAodHlwZSBpcyBWb2lkVHlwZSkgewogICAgICAgIC8vIE5vIGNsYXNzZXMgaW1wbGllZC4KICAgICAgfSBlbHNlIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZVZhcmlhYmxlKSB7CiAgICAgICAgcmV0dXJuIGltcGxpZWRDbGFzc2VzKHR5cGUuYm91bmQpOwogICAgICB9IGVsc2UgaWYgKHR5cGUgaXMgRnV0dXJlT3JUeXBlKSB7CiAgICAgICAgcmV0dXJuIFtjb21tb25FbGVtZW50cy5mdXR1cmVDbGFzc10KICAgICAgICAgIC4uYWRkQWxsKGltcGxpZWRDbGFzc2VzKHR5cGUudHlwZUFyZ3VtZW50KSk7CiAgICAgIH0gZWxzZSBpZiAodHlwZSBpcyBUeXBlVmFyaWFibGVUeXBlKSB7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2FuIHdlIGRvIGJldHRlcj8KICAgICAgICByZXR1cm4gaW1wbGllZENsYXNzZXMoCiAgICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0VHlwZVZhcmlhYmxlQm91bmQodHlwZS5lbGVtZW50KSk7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1VuZXhwZWN0ZWQgdHlwZSAkdHlwZScpOwogICAgfQoKICAgIHZvaWQgYWRkQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICAgIGlmIChjbHMgIT0gbnVsbCkgewogICAgICAgIGNsYXNzZXNEaXJlY3RseU5lZWRpbmdSdW50aW1lVHlwZS5hZGQoY2xzKTsKICAgICAgfQogICAgICBpZiAoY2xzID09IGNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSB7CiAgICAgICAgbmVlZGVkT25BbGwgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChjbHMgPT0gY29tbW9uRWxlbWVudHMuZnVuY3Rpb25DbGFzcykgewogICAgICAgIG5lZWRlZE9uRnVuY3Rpb25zID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIGZvciAoUnVudGltZVR5cGVVc2UgcnVudGltZVR5cGVVc2UgaW4gYmFja2VuZFVzYWdlLnJ1bnRpbWVUeXBlVXNlcykgewogICAgICBzd2l0Y2ggKHJ1bnRpbWVUeXBlVXNlLmtpbmQpIHsKICAgICAgICBjYXNlIFJ1bnRpbWVUeXBlVXNlS2luZC5zdHJpbmc6CiAgICAgICAgICBpZiAoIW9wdGlvbnMubGF4UnVudGltZVR5cGVUb1N0cmluZykgewogICAgICAgICAgICBpbXBsaWVkQ2xhc3NlcyhydW50aW1lVHlwZVVzZS5yZWNlaXZlclR5cGUpLmZvckVhY2goYWRkQ2xhc3MpOwogICAgICAgICAgfQoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUnVudGltZVR5cGVVc2VLaW5kLmVxdWFsczoKICAgICAgICAgIEl0ZXJhYmxlPENsYXNzRW50aXR5PiByZWNlaXZlckNsYXNzZXMgPQogICAgICAgICAgICAgIGltcGxpZWRDbGFzc2VzKHJ1bnRpbWVUeXBlVXNlLnJlY2VpdmVyVHlwZSk7CiAgICAgICAgICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gYXJndW1lbnRDbGFzc2VzID0KICAgICAgICAgICAgICBpbXBsaWVkQ2xhc3NlcyhydW50aW1lVHlwZVVzZS5hcmd1bWVudFR5cGUpOwoKICAgICAgICAgIGZvciAoQ2xhc3NFbnRpdHkgcmVjZWl2ZXJDbGFzcyBpbiByZWNlaXZlckNsYXNzZXMpIHsKICAgICAgICAgICAgZm9yIChDbGFzc0VudGl0eSBhcmd1bWVudENsYXNzIGluIGFyZ3VtZW50Q2xhc3NlcykgewogICAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNwZWNpYWwgY2FzZSB1c2Ugb2YgYHRoaXMucnVudGltZVR5cGVgLgogICAgICAgICAgICAgIFN1YmNsYXNzUmVzdWx0IHJlc3VsdCA9IGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5CiAgICAgICAgICAgICAgICAgIC5jb21tb25TdWJjbGFzc2VzKHJlY2VpdmVyQ2xhc3MsIENsYXNzUXVlcnkuU1VCVFlQRSwKICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50Q2xhc3MsIENsYXNzUXVlcnkuU1VCVFlQRSk7CiAgICAgICAgICAgICAgc3dpdGNoIChyZXN1bHQua2luZCkgewogICAgICAgICAgICAgICAgY2FzZSBTdWJjbGFzc1Jlc3VsdEtpbmQuRU1QVFk6CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTdWJjbGFzc1Jlc3VsdEtpbmQuRVhBQ1QxOgogICAgICAgICAgICAgICAgY2FzZSBTdWJjbGFzc1Jlc3VsdEtpbmQuU1VCQ0xBU1MxOgogICAgICAgICAgICAgICAgY2FzZSBTdWJjbGFzc1Jlc3VsdEtpbmQuU1VCVFlQRTE6CiAgICAgICAgICAgICAgICAgIGFkZENsYXNzKHJlY2VpdmVyQ2xhc3MpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgU3ViY2xhc3NSZXN1bHRLaW5kLkVYQUNUMjoKICAgICAgICAgICAgICAgIGNhc2UgU3ViY2xhc3NSZXN1bHRLaW5kLlNVQkNMQVNTMjoKICAgICAgICAgICAgICAgIGNhc2UgU3ViY2xhc3NSZXN1bHRLaW5kLlNVQlRZUEUyOgogICAgICAgICAgICAgICAgICBhZGRDbGFzcyhhcmd1bWVudENsYXNzKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFN1YmNsYXNzUmVzdWx0S2luZC5TRVQ6CiAgICAgICAgICAgICAgICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xzIGluIHJlc3VsdC5jbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3MoY2xzKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmVlZGVkT25BbGwpIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBSdW50aW1lVHlwZVVzZUtpbmQudW5rbm93bjoKICAgICAgICAgIGltcGxpZWRDbGFzc2VzKHJ1bnRpbWVUeXBlVXNlLnJlY2VpdmVyVHlwZSkuZm9yRWFjaChhZGRDbGFzcyk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAobmVlZGVkT25BbGwpIGJyZWFrOwogICAgfQogICAgU2V0PENsYXNzRW50aXR5PiBhbGxDbGFzc2VzTmVlZGluZ1J1bnRpbWVUeXBlOwogICAgaWYgKG5lZWRlZE9uQWxsKSB7CiAgICAgIG5lZWRlZE9uRnVuY3Rpb25zID0gdHJ1ZTsKICAgICAgYWxsQ2xhc3Nlc05lZWRpbmdSdW50aW1lVHlwZSA9IGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5CiAgICAgICAgICAuc3ViY2xhc3Nlc09mKGNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKQogICAgICAgICAgLnRvU2V0KCk7CiAgICB9IGVsc2UgewogICAgICBhbGxDbGFzc2VzTmVlZGluZ1J1bnRpbWVUeXBlID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCB0aGlzIG9wZXJhdGlvbiBkaXJlY3RseSBpbgogICAgICAvLyBbQ2xvc2VkV29ybGRdIHVzaW5nIHRoZSBbQ2xhc3NTZXRdcy4KICAgICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gY2xhc3Nlc0RpcmVjdGx5TmVlZGluZ1J1bnRpbWVUeXBlKSB7CiAgICAgICAgaWYgKCFhbGxDbGFzc2VzTmVlZGluZ1J1bnRpbWVUeXBlLmNvbnRhaW5zKGNscykpIHsKICAgICAgICAgIGFsbENsYXNzZXNOZWVkaW5nUnVudGltZVR5cGUKICAgICAgICAgICAgICAuYWRkQWxsKGNsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LnN1YnR5cGVzT2YoY2xzKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBhbGxDbGFzc2VzTmVlZGluZ1J1bnRpbWVUeXBlLmZvckVhY2gocG90ZW50aWFsbHlOZWVkVHlwZUFyZ3VtZW50cyk7CiAgICBpZiAobmVlZGVkT25GdW5jdGlvbnMpIHsKICAgICAgZm9yIChMb2NhbCBmdW5jdGlvbiBpbiBjbG9zZWRXb3JsZC5nZW5lcmljTG9jYWxGdW5jdGlvbnMpIHsKICAgICAgICBwb3RlbnRpYWxseU5lZWRUeXBlQXJndW1lbnRzKGZ1bmN0aW9uKTsKICAgICAgfQogICAgICBmb3IgKExvY2FsIGZ1bmN0aW9uIGluIGxvY2FsRnVuY3Rpb25zKSB7CiAgICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSA9CiAgICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0TG9jYWxGdW5jdGlvblR5cGUoZnVuY3Rpb24pOwogICAgICAgIGZ1bmN0aW9uVHlwZS5mb3JFYWNoVHlwZVZhcmlhYmxlKChUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZSkgewogICAgICAgICAgRW50aXR5IHR5cGVEZWNsYXJhdGlvbiA9IHR5cGVWYXJpYWJsZS5lbGVtZW50LnR5cGVEZWNsYXJhdGlvbjsKICAgICAgICAgIGlmICghcHJvY2Vzc2VkRW50aXRpZXMuY29udGFpbnModHlwZURlY2xhcmF0aW9uKSkgewogICAgICAgICAgICBwb3RlbnRpYWxseU5lZWRUeXBlQXJndW1lbnRzKHR5cGVEZWNsYXJhdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgbG9jYWxGdW5jdGlvbnNOZWVkaW5nU2lnbmF0dXJlLmFkZEFsbChsb2NhbEZ1bmN0aW9ucyk7CiAgICAgIH0KICAgICAgZm9yIChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbgogICAgICAgICAgaW4gY2xvc2VkV29ybGQuY2xvc3VyaXplZE1lbWJlcnNXaXRoRnJlZVR5cGVWYXJpYWJsZXMpIHsKICAgICAgICBtZXRob2RzTmVlZGluZ1NpZ25hdHVyZS5hZGQoZnVuY3Rpb24pOwogICAgICAgIHBvdGVudGlhbGx5TmVlZFR5cGVBcmd1bWVudHMoZnVuY3Rpb24uZW5jbG9zaW5nQ2xhc3MpOwogICAgICB9CiAgICB9CgogICAgU2V0PFNlbGVjdG9yPiBzZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50cyA9IG5ldyBTZXQ8U2VsZWN0b3I+KCk7CiAgICB0eXBlVmFyaWFibGVUZXN0cwogICAgICAgIC5mb3JFYWNoQXBwbGllZFNlbGVjdG9yKChTZWxlY3RvciBzZWxlY3RvciwgU2V0PEVudGl0eT4gdGFyZ2V0cykgewogICAgICBmb3IgKEVudGl0eSB0YXJnZXQgaW4gdGFyZ2V0cykgewogICAgICAgIGlmIChtZXRob2RzTmVlZGluZ1R5cGVBcmd1bWVudHMuY29udGFpbnModGFyZ2V0KSB8fAogICAgICAgICAgICBsb2NhbEZ1bmN0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzLmNvbnRhaW5zKHRhcmdldCkpIHsKICAgICAgICAgIHNlbGVjdG9yc05lZWRpbmdUeXBlQXJndW1lbnRzLmFkZChzZWxlY3Rvcik7CiAgICAgICAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgICAgICAgc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHNGb3JUZXN0aW5nID8/PQogICAgICAgICAgICAgICAgPFNlbGVjdG9yLCBTZXQ8RW50aXR5Pj57fTsKICAgICAgICAgICAgc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHNGb3JUZXN0aW5nCiAgICAgICAgICAgICAgICAucHV0SWZBYnNlbnQoc2VsZWN0b3IsICgpID0+IG5ldyBTZXQ8RW50aXR5PigpKQogICAgICAgICAgICAgICAgLmFkZCh0YXJnZXQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBTZXQ8aW50PiBpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzID0gbmV3IFNldDxpbnQ+KCk7CiAgICB0eXBlVmFyaWFibGVUZXN0cy5mb3JFYWNoR2VuZXJpY0luc3RhbnRpYXRpb24oCiAgICAgICAgKEdlbmVyaWNJbnN0YW50aWF0aW9uIGluc3RhbnRpYXRpb24sIFNldDxFbnRpdHk+IHRhcmdldHMpIHsKICAgICAgZm9yIChFbnRpdHkgdGFyZ2V0IGluIHRhcmdldHMpIHsKICAgICAgICBpZiAobWV0aG9kc05lZWRpbmdUeXBlQXJndW1lbnRzLmNvbnRhaW5zKHRhcmdldCkgfHwKICAgICAgICAgICAgbG9jYWxGdW5jdGlvbnNOZWVkaW5nVHlwZUFyZ3VtZW50cy5jb250YWlucyh0YXJnZXQpKSB7CiAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBpbnN0YW50aWF0ZWQKICAgICAgICAgIC8vIGV4cHJlc3Npb24uCiAgICAgICAgICBpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzCiAgICAgICAgICAgICAgLmFkZChpbnN0YW50aWF0aW9uLnR5cGVBcmd1bWVudHMubGVuZ3RoKTsKICAgICAgICAgIGlmIChyZXRhaW5EYXRhRm9yVGVzdGluZykgewogICAgICAgICAgICBpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzRm9yVGVzdGluZyA/Pz0KICAgICAgICAgICAgICAgIDxHZW5lcmljSW5zdGFudGlhdGlvbiwgU2V0PEVudGl0eT4+e307CiAgICAgICAgICAgIGluc3RhbnRpYXRpb25zTmVlZGluZ1R5cGVBcmd1bWVudHNGb3JUZXN0aW5nCiAgICAgICAgICAgICAgICAucHV0SWZBYnNlbnQoaW5zdGFudGlhdGlvbiwgKCkgPT4gbmV3IFNldDxFbnRpdHk+KCkpCiAgICAgICAgICAgICAgICAuYWRkKHRhcmdldCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgdHlwZVZhcmlhYmxlVGVzdHNGb3JUZXN0aW5nID0gdHlwZVZhcmlhYmxlVGVzdHM7CiAgICB9CgogICAgLypwcmludCh0eXBlVmFyaWFibGVUZXN0cy5kdW1wKCkpOwogICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpOwogICAgcHJpbnQoJ2NsYXNzZXNOZWVkaW5nVHlwZUFyZ3VtZW50czonKTsKICAgIGNsYXNzZXNOZWVkaW5nVHlwZUFyZ3VtZW50cy5mb3JFYWNoKChlKSA9PiBwcmludCgnICAkZScpKTsKICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKICAgIHByaW50KCdtZXRob2RzTmVlZGluZ1NpZ25hdHVyZTonKTsKICAgIG1ldGhvZHNOZWVkaW5nU2lnbmF0dXJlLmZvckVhY2goKGUpID0+IHByaW50KCcgICRlJykpOwogICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpOwogICAgcHJpbnQoJ21ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50czonKTsKICAgIG1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cy5mb3JFYWNoKChlKSA9PiBwcmludCgnICAkZScpKTsKICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKICAgIHByaW50KCdsb2NhbEZ1bmN0aW9uc05lZWRpbmdTaWduYXR1cmU6Jyk7CiAgICBsb2NhbEZ1bmN0aW9uc05lZWRpbmdTaWduYXR1cmUuZm9yRWFjaCgoZSkgPT4gcHJpbnQoJyAgJGUnKSk7CiAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CiAgICBwcmludCgnbG9jYWxGdW5jdGlvbnNOZWVkaW5nVHlwZUFyZ3VtZW50czonKTsKICAgIGxvY2FsRnVuY3Rpb25zTmVlZGluZ1R5cGVBcmd1bWVudHMuZm9yRWFjaCgoZSkgPT4gcHJpbnQoJyAgJGUnKSk7CiAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CiAgICBwcmludCgnc2VsZWN0b3JzTmVlZGluZ1R5cGVBcmd1bWVudHM6Jyk7CiAgICBzZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50cy5mb3JFYWNoKChlKSA9PiBwcmludCgnICAkZScpKTsKICAgIHByaW50KCdpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzOiAnCiAgICAgICAgJyRpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzJyk7Ki8KCiAgICByZXR1cm4gbmV3IFJ1bnRpbWVUeXBlc05lZWRJbXBsKAogICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgY2xhc3Nlc05lZWRpbmdUeXBlQXJndW1lbnRzLAogICAgICAgIG1ldGhvZHNOZWVkaW5nU2lnbmF0dXJlLAogICAgICAgIG1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgICBsb2NhbEZ1bmN0aW9uc05lZWRpbmdTaWduYXR1cmUsCiAgICAgICAgbG9jYWxGdW5jdGlvbnNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgICBzZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50cywKICAgICAgICBpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzKTsKICB9Cn0KhTEATk48AS0BGTBKJCEhKyMaLislIyQYHQEZFR4WGQFMATEz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ZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2lyL2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CgovLy8gSW50ZXJmYWNlIGZvciBjb21wdXRpbmcgbmF0aXZlIG1lbWJlcnMuCmFic3RyYWN0IGNsYXNzIE5hdGl2ZU1lbWJlclJlc29sdmVyIHsKICAvLy8gQ29tcHV0ZXMgd2hldGhlciBbbm9kZV0gaXMgbmF0aXZlIG9yIEpzSW50ZXJvcC4KICB2b2lkIHJlc29sdmVOYXRpdmVNZW1iZXIoaXIuTWVtYmVyIG5vZGUsIElyQW5ub3RhdGlvbkRhdGEgYW5ub3RhdGlvbkRhdGEpOwp9CgovLy8gRGV0ZXJtaW5lcyBhbGwgbmF0aXZlIGNsYXNzZXMgaW4gYSBzZXQgb2YgbGlicmFyaWVzLgphYnN0cmFjdCBjbGFzcyBOYXRpdmVDbGFzc0ZpbmRlciB7CiAgLy8vIFJldHVybnMgdGhlIHNldCBvZiBhbGwgbmF0aXZlIGNsYXNzZXMgZGVjbGFyZWQgaW4gW2xpYnJhcmllc10uCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGNvbXB1dGVOYXRpdmVDbGFzc2VzKEl0ZXJhYmxlPFVyaT4gbGlicmFyaWVzKTsKfQoKY2xhc3MgQmFzZU5hdGl2ZUNsYXNzRmluZGVyIGltcGxlbWVudHMgTmF0aXZlQ2xhc3NGaW5kZXIgewogIGZpbmFsIEtFbGVtZW50RW52aXJvbm1lbnQgX2VsZW1lbnRFbnZpcm9ubWVudDsKICBmaW5hbCBOYXRpdmVCYXNpY0RhdGEgX25hdGl2ZUJhc2ljRGF0YTsKCiAgTWFwPFN0cmluZywgQ2xhc3NFbnRpdHk+IF90YWdPd25lciA9IG5ldyBNYXA8U3RyaW5nLCBDbGFzc0VudGl0eT4oKTsKCiAgQmFzZU5hdGl2ZUNsYXNzRmluZGVyKHRoaXMuX2VsZW1lbnRFbnZpcm9ubWVudCwgdGhpcy5fbmF0aXZlQmFzaWNEYXRhKTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGNvbXB1dGVOYXRpdmVDbGFzc2VzKEl0ZXJhYmxlPFVyaT4gbGlicmFyaWVzKSB7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IG5hdGl2ZUNsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwogICAgbGlicmFyaWVzLmZvckVhY2goKHVyaSkgPT4gX3Byb2Nlc3NOYXRpdmVDbGFzc2VzSW5MaWJyYXJ5KAogICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQubG9va3VwTGlicmFyeSh1cmkpLCBuYXRpdmVDbGFzc2VzKSk7CiAgICBfcHJvY2Vzc1N1YmNsYXNzZXNPZk5hdGl2ZUNsYXNzZXMobGlicmFyaWVzLCBuYXRpdmVDbGFzc2VzKTsKICAgIHJldHVybiBuYXRpdmVDbGFzc2VzOwogIH0KCiAgLy8vIEFkZHMgYWxsIGRpcmVjdGx5IG5hdGl2ZSBjbGFzc2VzIGRlY2xhcmVkIGluIFtsaWJyYXJ5XSB0byBbbmF0aXZlQ2xhc3Nlc10uCiAgdm9pZCBfcHJvY2Vzc05hdGl2ZUNsYXNzZXNJbkxpYnJhcnkoCiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSwgU2V0PENsYXNzRW50aXR5PiBuYXRpdmVDbGFzc2VzKSB7CiAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hDbGFzcyhsaWJyYXJ5LCAoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICAgIGlmIChfbmF0aXZlQmFzaWNEYXRhLmlzTmF0aXZlQ2xhc3MoY2xzKSkgewogICAgICAgIF9wcm9jZXNzTmF0aXZlQ2xhc3MoY2xzLCBuYXRpdmVDbGFzc2VzKTsKICAgICAgfQogICAgfSk7CiAgfQoKICAvLy8gQWRkcyBbY2xzXSB0byBbbmF0aXZlQ2xhc3Nlc10gYW5kIHBlcmZvcm1zIGZ1cnRoZXIgcHJvY2Vzc2luZyBvZiBbY2xzXSwKICAvLy8gaWYgbmVjZXNzYXJ5LgogIHZvaWQgX3Byb2Nlc3NOYXRpdmVDbGFzcygKICAgICAgY292YXJpYW50IENsYXNzRW50aXR5IGNscywgU2V0PENsYXNzRW50aXR5PiBuYXRpdmVDbGFzc2VzKSB7CiAgICBuYXRpdmVDbGFzc2VzLmFkZChjbHMpOwogICAgLy8gSnMgSW50ZXJvcCBpbnRlcmZhY2VzIGRvIG5vdCBoYXZlIHRhZ3MuCiAgICBpZiAoX25hdGl2ZUJhc2ljRGF0YS5pc0pzSW50ZXJvcENsYXNzKGNscykpIHJldHVybjsKICAgIC8vIFNpbmNlIHdlIG1hcCBmcm9tIGRpc3BhdGNoIHRhZ3MgdG8gY2xhc3NlcywgYSBkaXNwYXRjaCB0YWcgbXVzdCBiZSB1c2VkCiAgICAvLyBvbiBvbmx5IG9uZSBuYXRpdmUgY2xhc3MuCiAgICBmb3IgKFN0cmluZyB0YWcgaW4gX25hdGl2ZUJhc2ljRGF0YS5nZXROYXRpdmVUYWdzT2ZDbGFzcyhjbHMpKSB7CiAgICAgIENsYXNzRW50aXR5IG93bmVyID0gX3RhZ093bmVyW3RhZ107CiAgICAgIGlmIChvd25lciAhPSBudWxsKSB7CiAgICAgICAgaWYgKG93bmVyICE9IGNscykgewogICAgICAgICAgZmFpbGVkQXQoY2xzLCAiVGFnICckdGFnJyBhbHJlYWR5IGluIHVzZSBieSAnJHtvd25lci5uYW1lfSciKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3RhZ093bmVyW3RhZ10gPSBjbHM7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzdXBlciBjbGFzcyBvZiBbY2xzXSBvciBgbnVsbGAgb2YgW2Nsc10gaGFzCiAgLy8vIG5vIGV4cGxpY2l0IHN1cGVyY2xhc3MuCiAgU3RyaW5nIF9maW5kRXh0ZW5kc05hbWVPZkNsYXNzKGNvdmFyaWFudCBDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBfZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgLmdldFN1cGVyQ2xhc3MoY2xzLCBza2lwVW5uYW1lZE1peGluQXBwbGljYXRpb25zOiB0cnVlKQogICAgICAgID8ubmFtZTsKICB9CgogIC8vLyBBZGRzIGFsbCBzdWJjbGFzc2VzIG9mIFtuYXRpdmVDbGFzc2VzXSBmb3VuZCBpbiBbbGlicmFyaWVzXSB0bwogIC8vLyBbbmF0aXZlQ2xhc3Nlc10uCiAgdm9pZCBfcHJvY2Vzc1N1YmNsYXNzZXNPZk5hdGl2ZUNsYXNzZXMoCiAgICAgIEl0ZXJhYmxlPFVyaT4gbGlicmFyaWVzLCBTZXQ8Q2xhc3NFbnRpdHk+IG5hdGl2ZUNsYXNzZXMpIHsKICAgIFNldDxDbGFzc0VudGl0eT4gbmF0aXZlQ2xhc3Nlc0FuZFN1YmNsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwogICAgLy8gQ29sbGVjdCBwb3RlbnRpYWwgc3ViY2xhc3NlcywgZS5nLgogICAgLy8KICAgIC8vICAgICBjbGFzcyBCIGV4dGVuZHMgZm9vLkEge30KICAgIC8vCiAgICAvLyBTdHJpbmcgIkEiIGhhcyBhIHBvdGVudGlhbCBzdWJjbGFzcyBCLgoKICAgIE1hcDxTdHJpbmcsIFNldDxDbGFzc0VudGl0eT4+IHBvdGVudGlhbEV4dGVuZHMgPQogICAgICAgIDxTdHJpbmcsIFNldDxDbGFzc0VudGl0eT4+e307CgogICAgbGlicmFyaWVzLmZvckVhY2goKFVyaSB1cmkpIHsKICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5ID0gX2VsZW1lbnRFbnZpcm9ubWVudC5sb29rdXBMaWJyYXJ5KHVyaSk7CiAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaENsYXNzKGxpYnJhcnksIChDbGFzc0VudGl0eSBjbHMpIHsKICAgICAgICBTdHJpbmcgZXh0ZW5kc05hbWUgPSBfZmluZEV4dGVuZHNOYW1lT2ZDbGFzcyhjbHMpOwogICAgICAgIGlmIChleHRlbmRzTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICBTZXQ8Q2xhc3NFbnRpdHk+IHBvdGVudGlhbFN1YmNsYXNzZXMgPSBwb3RlbnRpYWxFeHRlbmRzLnB1dElmQWJzZW50KAogICAgICAgICAgICAgIGV4dGVuZHNOYW1lLCAoKSA9PiBuZXcgU2V0PENsYXNzRW50aXR5PigpKTsKICAgICAgICAgIHBvdGVudGlhbFN1YmNsYXNzZXMuYWRkKGNscyk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIC8vIFJlc29sdmUgYWxsIHRoZSBuYXRpdmUgY2xhc3NlcyBhbmQgYW55IGNsYXNzZXMgdGhhdCBtaWdodCBleHRlbmQgdGhlbSBpbgogICAgLy8gW3BvdGVudGlhbEV4dGVuZHNdLCBhbmQgdGhlbiBjaGVjayB0aGF0IHRoZSBwcm9wZXJseSByZXNvbHZlZCBjbGFzcyBpcyBpbgogICAgLy8gZmFjdCBhIHN1YmNsYXNzIG9mIGEgbmF0aXZlIGNsYXNzLgoKICAgIENsYXNzRW50aXR5IG5hdGl2ZVN1cGVyY2xhc3NPZihDbGFzc0VudGl0eSBjbHMpIHsKICAgICAgaWYgKF9uYXRpdmVCYXNpY0RhdGEuaXNOYXRpdmVDbGFzcyhjbHMpKSByZXR1cm4gY2xzOwogICAgICBDbGFzc0VudGl0eSBzdXBlcmNsYXNzID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRTdXBlckNsYXNzKGNscyk7CiAgICAgIGlmIChzdXBlcmNsYXNzID09IG51bGwpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gbmF0aXZlU3VwZXJjbGFzc09mKHN1cGVyY2xhc3MpOwogICAgfQoKICAgIHZvaWQgd2Fsa1BvdGVudGlhbFN1YmNsYXNzZXMoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAgICBpZiAobmF0aXZlQ2xhc3Nlc0FuZFN1YmNsYXNzZXMuY29udGFpbnMoZWxlbWVudCkpIHJldHVybjsKICAgICAgQ2xhc3NFbnRpdHkgbmF0aXZlU3VwZXJjbGFzcyA9IG5hdGl2ZVN1cGVyY2xhc3NPZihlbGVtZW50KTsKICAgICAgaWYgKG5hdGl2ZVN1cGVyY2xhc3MgIT0gbnVsbCkgewogICAgICAgIG5hdGl2ZUNsYXNzZXNBbmRTdWJjbGFzc2VzLmFkZChlbGVtZW50KTsKICAgICAgICBTZXQ8Q2xhc3NFbnRpdHk+IHBvdGVudGlhbFN1YmNsYXNzZXMgPSBwb3RlbnRpYWxFeHRlbmRzW2VsZW1lbnQubmFtZV07CiAgICAgICAgaWYgKHBvdGVudGlhbFN1YmNsYXNzZXMgIT0gbnVsbCkgewogICAgICAgICAgcG90ZW50aWFsU3ViY2xhc3Nlcy5mb3JFYWNoKHdhbGtQb3RlbnRpYWxTdWJjbGFzc2VzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBuYXRpdmVDbGFzc2VzLmZvckVhY2god2Fsa1BvdGVudGlhbFN1YmNsYXNzZXMpOwogICAgbmF0aXZlQ2xhc3Nlcy5hZGRBbGwobmF0aXZlQ2xhc3Nlc0FuZFN1YmNsYXNzZXMpOwogIH0KfQoKLy8vIFJldHVybnMgYHRydWVgIGlmIFt2YWx1ZV0gaXMgbmFtZWQgYW5ub3RhdGlvbiBiYXNlZCBvbiBbYW5ub3RhdGlvbkNsYXNzXS4KYm9vbCBpc0Fubm90YXRpb24oCiAgICBTcGFubmFibGUgc3Bhbm5hYmxlLCBDb25zdGFudFZhbHVlIHZhbHVlLCBDbGFzc0VudGl0eSBhbm5vdGF0aW9uQ2xhc3MpIHsKICBpZiAoIXZhbHVlLmlzQ29uc3RydWN0ZWRPYmplY3QpIHJldHVybiBudWxsOwogIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSBjb25zdHJ1Y3RlZE9iamVjdCA9IHZhbHVlOwogIHJldHVybiBjb25zdHJ1Y3RlZE9iamVjdC50eXBlLmVsZW1lbnQgPT0gYW5ub3RhdGlvbkNsYXNzOwp9CgovLy8gRXh0cmFjdHMgdGhlIG5hbWUgaWYgW3ZhbHVlXSBpcyBhIG5hbWVkIGFubm90YXRpb24gYmFzZWQgb24KLy8vIFthbm5vdGF0aW9uQ2xhc3NdLCBvdGhlcndpc2UgcmV0dXJucyBgbnVsbGAuClN0cmluZyByZWFkQW5ub3RhdGlvbk5hbWUoCiAgICBTcGFubmFibGUgc3Bhbm5hYmxlLCBDb25zdGFudFZhbHVlIHZhbHVlLCBDbGFzc0VudGl0eSBhbm5vdGF0aW9uQ2xhc3MsCiAgICB7U3RyaW5nIGRlZmF1bHRWYWx1ZX0pIHsKICBpZiAoIXZhbHVlLmlzQ29uc3RydWN0ZWRPYmplY3QpIHJldHVybiBudWxsOwogIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSBjb25zdHJ1Y3RlZE9iamVjdCA9IHZhbHVlOwogIGlmIChjb25zdHJ1Y3RlZE9iamVjdC50eXBlLmVsZW1lbnQgIT0gYW5ub3RhdGlvbkNsYXNzKSByZXR1cm4gbnVsbDsKCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gZmllbGRzID0gY29uc3RydWN0ZWRPYmplY3QuZmllbGRzLnZhbHVlczsKICAvLyBUT0RPKHNyYSk6IEJldHRlciB2YWxpZGF0aW9uIG9mIHRoZSBjb25zdGFudC4KICBpZiAoZmllbGRzLmxlbmd0aCAhPSAxKSB7CiAgICBmYWlsZWRBdCgKICAgICAgICBzcGFubmFibGUsICdBbm5vdGF0aW9ucyBuZWVkcyBvbmUgc3RyaW5nOiAke3ZhbHVlLnRvU3RydWN0dXJlZFRleHQoKX0nKTsKICAgIHJldHVybiBudWxsOwogIH0gZWxzZSBpZiAoZmllbGRzLnNpbmdsZSBpcyBTdHJpbmdDb25zdGFudFZhbHVlKSB7CiAgICBTdHJpbmdDb25zdGFudFZhbHVlIHNwZWNTdHJpbmdDb25zdGFudCA9IGZpZWxkcy5zaW5nbGU7CiAgICByZXR1cm4gc3BlY1N0cmluZ0NvbnN0YW50LnN0cmluZ1ZhbHVlOwogIH0gZWxzZSBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwgJiYgZmllbGRzLnNpbmdsZSBpcyBOdWxsQ29uc3RhbnRWYWx1ZSkgewogICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKICB9IGVsc2UgewogICAgZmFpbGVkQXQoCiAgICAgICAgc3Bhbm5hYmxlLCAnQW5ub3RhdGlvbnMgbmVlZHMgb25lIHN0cmluZzogJHt2YWx1ZS50b1N0cnVjdHVyZWRUZXh0KCl9Jyk7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KgKsATk48ASgBGTsjJCEpASwmNk0CATkjRUcCATsxKgFHAUoBDEg9P0FBGgQBUSc/QjExCAgEAU4UHEMcLzhPIUUqGxxJCg8eCAYEAUoePh9AEAQBRRcqQUoqByQHLgE1JgEiRkQ7I086KAoKCAFQUSoBNjtHKy0GAThAQiYxTytACggGATQ2BAIBThNNLzY8AgFAMRtLHS82RgFEMxwOURE1PCtLGQsOUREEAgEpcGFja2FnZTpjb21waWxlci9zcmMvbmF0aXZlL3Jlc29sdmVyLmRhcnQ3c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMva2VybmVsL2RlZmVycmVkX2xvYWQuZGFydJocLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkga2VybmVsLmRlZmVycmVkX2xvYWRfZGF0YTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vY29tcGlsZXIuZGFydCcgc2hvdyBDb21waWxlcjsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2RlZmVycmVkX2xvYWQuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vaXIvdXRpbC5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50X21hcC5kYXJ0JzsKCmNsYXNzIEtlcm5lbERlZmVycmVkTG9hZFRhc2sgZXh0ZW5kcyBEZWZlcnJlZExvYWRUYXNrIHsKICBLZXJuZWxUb0VsZW1lbnRNYXAgX2VsZW1lbnRNYXA7CiAgTWFwPGlyLkxpYnJhcnksIFNldDxpci5OYW1lZE5vZGU+PiBfYWRkaXRpb25hbEV4cG9ydHNTZXRzID0KICAgICAgPGlyLkxpYnJhcnksIFNldDxpci5OYW1lZE5vZGU+Pnt9OwoKICBLZXJuZWxEZWZlcnJlZExvYWRUYXNrKENvbXBpbGVyIGNvbXBpbGVyLCB0aGlzLl9lbGVtZW50TWFwKSA6IHN1cGVyKGNvbXBpbGVyKTsKCiAgSXRlcmFibGU8SW1wb3J0RW50aXR5PiBfZmluZEltcG9ydHNUbyhpci5OYW1lZE5vZGUgbm9kZSwgU3RyaW5nIG5vZGVOYW1lLAogICAgICBpci5MaWJyYXJ5IGVuY2xvc2luZ0xpYnJhcnksIExpYnJhcnlFbnRpdHkgbGlicmFyeSkgewogICAgcmV0dXJuIG1lYXN1cmVTdWJ0YXNrKCdmaW5kLWltcG9ydHMnLCAoKSB7CiAgICAgIExpc3Q8SW1wb3J0RW50aXR5PiBpbXBvcnRzID0gW107CiAgICAgIGlyLkxpYnJhcnkgc291cmNlID0gX2VsZW1lbnRNYXAuZ2V0TGlicmFyeU5vZGUobGlicmFyeSk7CiAgICAgIGlmICghc291cmNlLmRlcGVuZGVuY2llcy5hbnkoKGQpID0+IGQuaXNEZWZlcnJlZCkpIHJldHVybiBjb25zdCBbXTsKICAgICAgZm9yIChpci5MaWJyYXJ5RGVwZW5kZW5jeSBkZXBlbmRlbmN5IGluIHNvdXJjZS5kZXBlbmRlbmNpZXMpIHsKICAgICAgICBpZiAoZGVwZW5kZW5jeS5pc0V4cG9ydCkgY29udGludWU7CiAgICAgICAgaWYgKCFfaXNWaXNpYmxlKGRlcGVuZGVuY3kuY29tYmluYXRvcnMsIG5vZGVOYW1lKSkgY29udGludWU7CiAgICAgICAgaWYgKGVuY2xvc2luZ0xpYnJhcnkgPT0gZGVwZW5kZW5jeS50YXJnZXRMaWJyYXJ5IHx8CiAgICAgICAgICAgIGFkZGl0aW9uYWxFeHBvcnRzKGRlcGVuZGVuY3kudGFyZ2V0TGlicmFyeSkuY29udGFpbnMobm9kZSkpIHsKICAgICAgICAgIGltcG9ydHMuYWRkKF9lbGVtZW50TWFwLmdldEltcG9ydChkZXBlbmRlbmN5KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBpbXBvcnRzOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxJbXBvcnRFbnRpdHk+IGNsYXNzSW1wb3J0c1RvKAogICAgICBDbGFzc0VudGl0eSBlbGVtZW50LCBMaWJyYXJ5RW50aXR5IGxpYnJhcnkpIHsKICAgIGlyLkNsYXNzIG5vZGUgPSBfZWxlbWVudE1hcC5nZXRDbGFzc05vZGUoZWxlbWVudCk7CiAgICByZXR1cm4gX2ZpbmRJbXBvcnRzVG8obm9kZSwgbm9kZS5uYW1lLCBub2RlLmVuY2xvc2luZ0xpYnJhcnksIGxpYnJhcnkpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8SW1wb3J0RW50aXR5PiB0eXBlZGVmSW1wb3J0c1RvKAogICAgICBUeXBlZGVmRW50aXR5IGVsZW1lbnQsIExpYnJhcnlFbnRpdHkgbGlicmFyeSkgewogICAgaXIuVHlwZWRlZiBub2RlID0gX2VsZW1lbnRNYXAuZ2V0VHlwZWRlZk5vZGUoZWxlbWVudCk7CiAgICByZXR1cm4gX2ZpbmRJbXBvcnRzVG8obm9kZSwgbm9kZS5uYW1lLCBub2RlLmVuY2xvc2luZ0xpYnJhcnksIGxpYnJhcnkpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8SW1wb3J0RW50aXR5PiBtZW1iZXJJbXBvcnRzVG8oCiAgICAgIEVudGl0eSBlbGVtZW50LCBMaWJyYXJ5RW50aXR5IGxpYnJhcnkpIHsKICAgIGlyLk1lbWJlciBub2RlID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyTm9kZShlbGVtZW50KTsKICAgIHJldHVybiBfZmluZEltcG9ydHNUbygKICAgICAgICBub2RlIGlzIGlyLkNvbnN0cnVjdG9yID8gbm9kZS5lbmNsb3NpbmdDbGFzcyA6IG5vZGUsCiAgICAgICAgbm9kZSBpcyBpci5Db25zdHJ1Y3RvciA/IG5vZGUuZW5jbG9zaW5nQ2xhc3MubmFtZSA6IG5vZGUubmFtZS5uYW1lLAogICAgICAgIG5vZGUuZW5jbG9zaW5nTGlicmFyeSwKICAgICAgICBsaWJyYXJ5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2hlY2tGb3JEZWZlcnJlZEVycm9yQ2FzZXMoTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICAvLyBOb3RoaW5nIHRvIGRvLiBUaGUgRkUgY2hlY2tzIGZvciBlcnJvciBjYXNlcyB1cGZyb250LgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjb2xsZWN0Q29uc3RhbnRzRnJvbU1ldGFkYXRhKAogICAgICBFbnRpdHkgZWxlbWVudCwgU2V0PENvbnN0YW50VmFsdWU+IGNvbnN0YW50cykgewogICAgLy8gTm90aGluZyB0byBkby4gS2VybmVsLXBpcGVsaW5lIGRvZXNuJ3Qgc3VwcG9ydCBtaXJyb3JzLCBzbyB3ZSBkb24ndCBuZWVkCiAgICAvLyB0byB0cmFjayBhbnkgY29uc3RhbnRzIGZyb20gbWV0YS1kYXRhLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjb2xsZWN0Q29uc3RhbnRzSW5Cb2R5KE1lbWJlckVudGl0eSBlbGVtZW50LCBEZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzKSB7CiAgICBpci5NZW1iZXIgbm9kZSA9IF9lbGVtZW50TWFwLmdldE1lbWJlck5vZGUoZWxlbWVudCk7CgogICAgLy8gRmV0Y2ggdGhlIGludGVybmFsIG5vZGUgaW4gb3JkZXIgdG8gc2tpcCBhbm5vdGF0aW9ucyBvbiB0aGUgbWVtYmVyLgogICAgLy8gVE9ETyhzaWdtdW5kKTogcmVwbGFjZSB0aGlzIHBhdHRlcm4gd2hlbiB0aGUga2VybmVsLWFzdCBwcm92aWRlcyBhIGJldHRlcgogICAgLy8gd2F5IHRvIHNraXAgYW5ub3RhdGlvbnMgKGlzc3VlIDMxNTY1KS4KICAgIHZhciB2aXNpdG9yID0gbmV3IENvbnN0YW50Q29sbGVjdG9yKF9lbGVtZW50TWFwLCBkZXBlbmRlbmNpZXMpOwogICAgaWYgKG5vZGUgaXMgaXIuRmllbGQpIHsKICAgICAgbm9kZS5pbml0aWFsaXplcj8uYWNjZXB0KHZpc2l0b3IpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKG5vZGUgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgbm9kZS5pbml0aWFsaXplcnMuZm9yRWFjaCgoaSkgPT4gaS5hY2NlcHQodmlzaXRvcikpOwogICAgfQogICAgbm9kZS5mdW5jdGlvbj8uYWNjZXB0KHZpc2l0b3IpOwogIH0KCiAgU2V0PGlyLk5hbWVkTm9kZT4gYWRkaXRpb25hbEV4cG9ydHMoaXIuTGlicmFyeSBsaWJyYXJ5KSB7CiAgICByZXR1cm4gX2FkZGl0aW9uYWxFeHBvcnRzU2V0c1tsaWJyYXJ5XSA/Pz0gbmV3IFNldDxpci5OYW1lZE5vZGU+LmZyb20oCiAgICAgICAgbGlicmFyeS5hZGRpdGlvbmFsRXhwb3J0cy5tYXAoKGlyLlJlZmVyZW5jZSByZWYpID0+IHJlZi5ub2RlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsZWFudXAoKSB7CiAgICBfYWRkaXRpb25hbEV4cG9ydHNTZXRzID0gbnVsbDsKICB9Cn0KCi8vLyBSZXR1cm5zIHdoZXRoZXIgW25hbWVdIHdvdWxkIGJlIHZpc2libGUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBsaXN0IG9mCi8vLyBzaG93L2hpZGUgW2NvbWJpbmF0b3JzXS4KYm9vbCBfaXNWaXNpYmxlKExpc3Q8aXIuQ29tYmluYXRvcj4gY29tYmluYXRvcnMsIFN0cmluZyBuYW1lKSB7CiAgZm9yICh2YXIgYyBpbiBjb21iaW5hdG9ycykgewogICAgaWYgKGMuaXNTaG93ICYmICFjLm5hbWVzLmNvbnRhaW5zKG5hbWUpKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoYy5pc0hpZGUgJiYgYy5uYW1lcy5jb250YWlucyhuYW1lKSkgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfQoKY2xhc3MgQ29uc3RhbnRDb2xsZWN0b3IgZXh0ZW5kcyBpci5SZWN1cnNpdmVWaXNpdG9yIHsKICBmaW5hbCBLZXJuZWxUb0VsZW1lbnRNYXAgZWxlbWVudE1hcDsKICBmaW5hbCBEZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzOwoKICBDb25zdGFudENvbGxlY3Rvcih0aGlzLmVsZW1lbnRNYXAsIHRoaXMuZGVwZW5kZW5jaWVzKTsKCiAgQ29tbW9uRWxlbWVudHMgZ2V0IGNvbW1vbkVsZW1lbnRzID0+IGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHM7CgogIHZvaWQgYWRkKGlyLkV4cHJlc3Npb24gbm9kZSwge2Jvb2wgcmVxdWlyZWQ6IHRydWV9KSB7CiAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0KICAgICAgICBlbGVtZW50TWFwLmdldENvbnN0YW50VmFsdWUobm9kZSwgcmVxdWlyZUNvbnN0YW50OiByZXF1aXJlZCk7CiAgICBpZiAoY29uc3RhbnQgIT0gbnVsbCkgewogICAgICBkZXBlbmRlbmNpZXMuYWRkQ29uc3RhbnQoCiAgICAgICAgICBjb25zdGFudCwgZWxlbWVudE1hcC5nZXRJbXBvcnQoZ2V0RGVmZXJyZWRJbXBvcnQobm9kZSkpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRMaXRlcmFsKGlyLkludExpdGVyYWwgbGl0ZXJhbCkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvdWJsZUxpdGVyYWwoaXIuRG91YmxlTGl0ZXJhbCBsaXRlcmFsKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm9vbExpdGVyYWwoaXIuQm9vbExpdGVyYWwgbGl0ZXJhbCkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0cmluZ0xpdGVyYWwoaXIuU3RyaW5nTGl0ZXJhbCBsaXRlcmFsKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3ltYm9sTGl0ZXJhbChpci5TeW1ib2xMaXRlcmFsIGxpdGVyYWwpID0+IGFkZChsaXRlcmFsKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE51bGxMaXRlcmFsKGlyLk51bGxMaXRlcmFsIGxpdGVyYWwpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXN0TGl0ZXJhbChpci5MaXN0TGl0ZXJhbCBsaXRlcmFsKSB7CiAgICBpZiAobGl0ZXJhbC5pc0NvbnN0KSB7CiAgICAgIGFkZChsaXRlcmFsKTsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLnZpc2l0TGlzdExpdGVyYWwobGl0ZXJhbCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0TGl0ZXJhbChpci5TZXRMaXRlcmFsIGxpdGVyYWwpIHsKICAgIGlmIChsaXRlcmFsLmlzQ29uc3QpIHsKICAgICAgYWRkKGxpdGVyYWwpOwogICAgfSBlbHNlIHsKICAgICAgc3VwZXIudmlzaXRTZXRMaXRlcmFsKGxpdGVyYWwpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1hcExpdGVyYWwoaXIuTWFwTGl0ZXJhbCBsaXRlcmFsKSB7CiAgICBpZiAobGl0ZXJhbC5pc0NvbnN0KSB7CiAgICAgIGFkZChsaXRlcmFsKTsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLnZpc2l0TWFwTGl0ZXJhbChsaXRlcmFsKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oaXIuQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgYWRkKG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgc3VwZXIudmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24obm9kZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZVBhcmFtZXRlcihpci5UeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIC8vIFdlIGF2b2lkIHZpc2l0aW5nIG1ldGFkYXRhIG9uIHRoZSB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbi4gVGhlIGJvdW5kCiAgICAvLyBjYW5ub3QgaG9sZCBjb25zdGFudHMgc28gd2Ugc2tpcCB0aGF0IGFzIHdlbGwuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIC8vIFdlIGF2b2lkIHZpc2l0aW5nIG1ldGFkYXRhIG9uIHRoZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24gYnkgb25seSB2aXNpdGluZwogICAgLy8gdGhlIGluaXRpYWxpemVyLiBUaGUgdHlwZSBjYW5ub3QgaG9sZCBjb25zdGFudHMgc28gY2FuIGthbiBza2lwIHRoYXQKICAgIC8vIGFzIHdlbGwuCiAgICBub2RlLmluaXRpYWxpemVyPy5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUxpdGVyYWwoaXIuVHlwZUxpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUudHlwZSBpcyEgaXIuVHlwZVBhcmFtZXRlclR5cGUpIGFkZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnN0YW50aWF0aW9uKGlyLkluc3RhbnRpYXRpb24gbm9kZSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVGhlIENGRSBzaG91bGQgbWFyayBjb25zdGFudCBpbnN0YW50aWF0aW9ucyBhcwogICAgLy8gY29uc3RhbnQuCiAgICBhZGQobm9kZSwgcmVxdWlyZWQ6IGZhbHNlKTsKICAgIHN1cGVyLnZpc2l0SW5zdGFudGlhdGlvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oaXIuQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIGFkZChub2RlKTsKICB9Cn0KgN8ATk48ASMBKAEiKSMgJBobATgiPikBUQFMPC8nP0pFK0U8SjoKCBYIBAEMKTQ3TAQBDCs2O0wEAQwqLzkbPUwfEgQBDDs9BAEMJTZQLgQBDFE5AUtRLkQcKQ4GASI7BiQEATxLSAQBDBMjBAIBSx1AHzs6BA8CATYnIwE5AUIBOB1GHCBEBgQBDDEBDDcBDDMBDDcBDEUBDDMBDDIbFA0nBgQBDDAbFA0mBgQBDDAbFA0mBgQBDEMYEQ0uBgQBDDNPNgQBDD9QTBAkBAEMLzcEAQwzSxEgJAQBDD0PBAIBLnBhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9kZWZlcnJlZF9sb2FkLmRhcnQ1c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMva2VybmVsL2VsZW1lbnRfbWFwLmRhcnScLi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBLQ29tbW9uRWxlbWVudHMsIEtFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYW1lci5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hdGl2ZV9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9iZWhhdmlvci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JzsKCi8vLyBJbnRlcmZhY2UgdGhhdCB0cmFuc2xhdGVzIGJldHdlZW4gS2VybmVsIElSIG5vZGVzIGFuZCBlbnRpdGllcyB1c2VkIGZvcgovLy8gY29tcHV0aW5nIHRoZSBbV29ybGRJbXBhY3RdIGZvciBtZW1iZXJzLgphYnN0cmFjdCBjbGFzcyBLZXJuZWxUb0VsZW1lbnRNYXAgewogIEtFbGVtZW50RW52aXJvbm1lbnQgZ2V0IGVsZW1lbnRFbnZpcm9ubWVudDsKICBOYXRpdmVCYXNpY0RhdGEgZ2V0IG5hdGl2ZUJhc2ljRGF0YTsKCiAgLy8vIEFjY2VzcyB0byB0aGUgY29tbW9ubHkgdXNlZCBlbGVtZW50cyBhbmQgdHlwZXMuCiAgS0NvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50czsKCiAgLy8vIEFjY2VzcyB0byB0aGUgW0RhcnRUeXBlc10gb2JqZWN0LgogIERhcnRUeXBlcyBnZXQgdHlwZXM7CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIGVudmlyb25tZW50IGZvciB0aGUgdW5kZXJseWluZyBrZXJuZWwgbW9kZWwuCiAgaXIuVHlwZUVudmlyb25tZW50IGdldCB0eXBlRW52aXJvbm1lbnQ7CgogIC8vLyBSZXR1cm5zIHRoZSBjbGFzcyBoaWVyYXJjaHkgZm9yIHRoZSB1bmRlcmx5aW5nIGtlcm5lbCBtb2RlbC4KICBpci5DbGFzc0hpZXJhcmNoeSBnZXQgY2xhc3NIaWVyYXJjaHk7CgogIC8vLyBSZXR1cm5zIHRoZSBbRGFydFR5cGVdIGNvcnJlc3BvbmRpbmcgdG8gW3R5cGVdLgogIERhcnRUeXBlIGdldERhcnRUeXBlKGlyLkRhcnRUeXBlIHR5cGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0ludGVyZmFjZVR5cGVdIGNvcnJlc3BvbmRpbmcgdG8gW3R5cGVdLgogIEludGVyZmFjZVR5cGUgZ2V0SW50ZXJmYWNlVHlwZShpci5JbnRlcmZhY2VUeXBlIHR5cGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW1R5cGVWYXJpYWJsZVR5cGVdIGNvcnJlc3BvbmRpbmcgdG8gW3R5cGVdLgogIFR5cGVWYXJpYWJsZVR5cGUgZ2V0VHlwZVZhcmlhYmxlVHlwZShpci5UeXBlUGFyYW1ldGVyVHlwZSB0eXBlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtGdW5jdGlvblR5cGVdIG9mIHRoZSBbbm9kZV0uCiAgRnVuY3Rpb25UeXBlIGdldEZ1bmN0aW9uVHlwZShpci5GdW5jdGlvbk5vZGUgbm9kZSk7CgogIC8vLyBSZXR1cm4gdGhlIFtJbnRlcmZhY2VUeXBlXSBjb3JyZXNwb25kaW5nIHRvIHRoZSBbY2xzXSB3aXRoIHRoZSBnaXZlbgogIC8vLyBbdHlwZUFyZ3VtZW50c10uCiAgSW50ZXJmYWNlVHlwZSBjcmVhdGVJbnRlcmZhY2VUeXBlKAogICAgICBpci5DbGFzcyBjbHMsIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NhbGxTdHJ1Y3R1cmVdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFthcmd1bWVudHNdLgogIENhbGxTdHJ1Y3R1cmUgZ2V0Q2FsbFN0cnVjdHVyZShpci5Bcmd1bWVudHMgYXJndW1lbnRzKTsKCiAgLy8vIFJldHVybnMgdGhlIFtTZWxlY3Rvcl0gY29ycmVzcG9uZGluZyB0byB0aGUgaW52b2NhdGlvbiBvZiBbbmFtZV0gd2l0aAogIC8vLyBbYXJndW1lbnRzXS4KICBTZWxlY3RvciBnZXRJbnZvY2F0aW9uU2VsZWN0b3IoaXIuTmFtZSBuYW1lLCBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLCBpbnQgdHlwZUFyZ3VtZW50cyk7CgogIC8vLyBSZXR1cm5zIHRoZSBbTWVtYmVyRW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZW1iZXIgW25vZGVdLgogIE1lbWJlckVudGl0eSBnZXRNZW1iZXIoaXIuTWVtYmVyIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0Z1bmN0aW9uRW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9jZWR1cmUgW25vZGVdLgogIEZ1bmN0aW9uRW50aXR5IGdldE1ldGhvZChpci5Qcm9jZWR1cmUgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbQ29uc3RydWN0b3JFbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdlbmVyYXRpdmUgb3IgZmFjdG9yeQogIC8vLyBjb25zdHJ1Y3RvciBbbm9kZV0uCiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0Q29uc3RydWN0b3IoaXIuTWVtYmVyIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0ZpZWxkRW50aXR5XSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWVsZCBbbm9kZV0uCiAgRmllbGRFbnRpdHkgZ2V0RmllbGQoaXIuRmllbGQgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbQ2xhc3NFbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsYXNzIFtub2RlXS4KICBDbGFzc0VudGl0eSBnZXRDbGFzcyhpci5DbGFzcyBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtUeXBlZGVmVHlwZV0gY29ycmVzcG9uZGluZyB0byByYXcgdHlwZSBvZiB0aGUgdHlwZWRlZiBbbm9kZV0uCiAgVHlwZWRlZlR5cGUgZ2V0VHlwZWRlZlR5cGUoaXIuVHlwZWRlZiBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIHN1cGVyIFtNZW1iZXJFbnRpdHldIGZvciBhIHN1cGVyIGludm9jYXRpb24sIGdldCBvciBzZXQgb2YKICAvLy8gW25hbWVdIGZyb20gdGhlIG1lbWJlciBbY29udGV4dF0uCiAgTWVtYmVyRW50aXR5IGdldFN1cGVyTWVtYmVyKE1lbWJlckVudGl0eSBjb250ZXh0LCBpci5OYW1lIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KTsKCiAgLy8vIFJldHVybnMgdGhlIGBub1N1Y2hNZXRob2RgIFtGdW5jdGlvbkVudGl0eV0gY2FsbCBmcm9tIGEKICAvLy8gYHN1cGVyLm5vU3VjaE1ldGhvZGAgaW52b2NhdGlvbiB3aXRoaW4gW2Nsc10uCiAgRnVuY3Rpb25FbnRpdHkgZ2V0U3VwZXJOb1N1Y2hNZXRob2QoQ2xhc3NFbnRpdHkgY2xzKTsKCiAgLy8vIFJldHVybnMgdGhlIFtOYW1lXSBjb3JyZXNwb25kaW5nIHRvIFtuYW1lXS4KICBOYW1lIGdldE5hbWUoaXIuTmFtZSBuYW1lKTsKCiAgLy8vIENvbXB1dGVzIHRoZSBbTmF0aXZlQmVoYXZpb3JdIGZvciBhIGNhbGwgdG8gdGhlIFtKU10gZnVuY3Rpb24uCiAgTmF0aXZlQmVoYXZpb3IgZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0NhbGwoaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKTsKCiAgLy8vIENvbXB1dGVzIHRoZSBbTmF0aXZlQmVoYXZpb3JdIGZvciBhIGNhbGwgdG8gdGhlIFtKU19CVUlMVElOXQogIC8vLyBmdW5jdGlvbi4KICBOYXRpdmVCZWhhdmlvciBnZXROYXRpdmVCZWhhdmlvckZvckpzQnVpbHRpbkNhbGwoaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKTsKCiAgLy8vIENvbXB1dGVzIHRoZSBbTmF0aXZlQmVoYXZpb3JdIGZvciBhIGNhbGwgdG8gdGhlCiAgLy8vIFtKU19FTUJFRERFRF9HTE9CQUxdIGZ1bmN0aW9uLgogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUJlaGF2aW9yRm9ySnNFbWJlZGRlZEdsb2JhbENhbGwoCiAgICAgIGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbanMuTmFtZV0gZm9yIHRoZSBgSnNHZXROYW1lYCBbY29uc3RhbnRdIHZhbHVlLgogIGpzLk5hbWUgZ2V0TmFtZUZvckpzR2V0TmFtZShDb25zdGFudFZhbHVlIGNvbnN0YW50LCBOYW1lciBuYW1lcik7CgogIC8vLyBDb21wdXRlcyB0aGUgW0NvbnN0YW50VmFsdWVdIGZvciB0aGUgY29uc3RhbnQgW2V4cHJlc3Npb25dLgogIENvbnN0YW50VmFsdWUgZ2V0Q29uc3RhbnRWYWx1ZShpci5FeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIHtib29sIHJlcXVpcmVDb25zdGFudDogdHJ1ZSwgYm9vbCBpbXBsaWNpdE51bGw6IGZhbHNlfSk7CgogIC8vLyBSZXR1cm4gdGhlIFtJbXBvcnRFbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gW25vZGVdLgogIEltcG9ydEVudGl0eSBnZXRJbXBvcnQoaXIuTGlicmFyeURlcGVuZGVuY3kgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBkZWZpbmluZyBub2RlIGZvciBbY2xzXS4KICBpci5DbGFzcyBnZXRDbGFzc05vZGUoY292YXJpYW50IENsYXNzRW50aXR5IGNscyk7CgogIC8vLyBBZGRzIGxpYnJhcmllcyBpbiBbY29tcG9uZW50XSB0byB0aGUgc2V0IG9mIGxpYnJhcmllcy4KICAvLy8KICAvLy8gVGhlIG1haW4gbWV0aG9kIG9mIHRoZSBmaXJzdCBjb21wb25lbnQgaXMgdXNlZCBhcyB0aGUgbWFpbiBtZXRob2QgZm9yIHRoZQogIC8vLyBjb21waWxhdGlvbi4KICB2b2lkIGFkZENvbXBvbmVudChpci5Db21wb25lbnQgY29tcG9uZW50KTsKCiAgLy8vIFJldHVybnMgdGhlIFtDb25zdHJ1Y3RvckVudGl0eV0gY29ycmVzcG9uZGluZyB0byBhIHN1cGVyIGluaXRpYWxpemVyIGluCiAgLy8vIFtjb25zdHJ1Y3Rvcl0uCiAgLy8vCiAgLy8vIFRoZSBJUiByZXNvbHZlcyBzdXBlciBpbml0aWFsaXplcnMgdG8gYSBbdGFyZ2V0XSB1cCBpbiB0aGUgdHlwZSBoaWVyYXJjaHkuCiAgLy8vIE1vc3Qgb2YgdGhlIHRpbWUsIHRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHRoZSBlbnRpdHkKICAvLy8gY29ycmVzcG9uZGluZyB0byB0aGF0IHRhcmdldC4gSW4gdGhlIHByZXNlbmNlIG9mIHVubmFtZWQgbWl4aW5zLCB0aGlzCiAgLy8vIGZ1bmN0aW9uIHJldHVybnMgYW4gZW50aXR5IGZvciBhbiBpbnRlcm1lZGlhdGUgc3ludGhldGljIGNvbnN0cnVjdG9yIHRoYXQKICAvLy8ga2VybmVsIGRvZXNuJ3QgZXhwbGljaXRseSByZXByZXNlbnQuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlOgogIC8vLyAgICAgY2xhc3MgTSB7fQogIC8vLyAgICAgY2xhc3MgQyBleHRlbmRzIE9iamVjdCB3aXRoIE0ge30KICAvLy8KICAvLy8gS2VybmVsIHdpbGwgc2F5IHRoYXQgQygpJ3Mgc3VwZXIgaW5pdGlhbGl6ZXIgcmVzb2x2ZXMgdG8gT2JqZWN0KCksIGJ1dAogIC8vLyB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGVudGl0eSByZXByZXNlbnRpbmcgdGhlIHVubmFtZWQgbWl4aW4KICAvLy8gYXBwbGljYXRpb24gIk9iamVjdCtNIidzIGNvbnN0cnVjdG9yLgogIENvbnN0cnVjdG9yRW50aXR5IGdldFN1cGVyQ29uc3RydWN0b3IoCiAgICAgIGlyLkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLCBpci5NZW1iZXIgdGFyZ2V0KTsKCiAgLy8vIENvbXB1dGVzIHRoZSBuYXRpdmUgYmVoYXZpb3IgZm9yIHJlYWRpbmcgdGhlIG5hdGl2ZSBbZmllbGRdLgogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUJlaGF2aW9yRm9yRmllbGRMb2FkKGlyLkZpZWxkIGZpZWxkLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IGNyZWF0ZXNBbm5vdGF0aW9ucywgSXRlcmFibGU8U3RyaW5nPiByZXR1cm5zQW5ub3RhdGlvbnMsCiAgICAgIHtib29sIGlzSnNJbnRlcm9wfSk7CgogIC8vLyBDb21wdXRlcyB0aGUgbmF0aXZlIGJlaGF2aW9yIGZvciB3cml0aW5nIHRvIHRoZSBuYXRpdmUgW2ZpZWxkXS4KICBOYXRpdmVCZWhhdmlvciBnZXROYXRpdmVCZWhhdmlvckZvckZpZWxkU3RvcmUoaXIuRmllbGQgZmllbGQpOwoKICAvLy8gQ29tcHV0ZXMgdGhlIG5hdGl2ZSBiZWhhdmlvciBmb3IgY2FsbGluZyB0aGUgZnVuY3Rpb24gb3IgY29uc3RydWN0b3IKICAvLy8gW21lbWJlcl0uCiAgTmF0aXZlQmVoYXZpb3IgZ2V0TmF0aXZlQmVoYXZpb3JGb3JNZXRob2QoaXIuTWVtYmVyIG1lbWJlciwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMsIEl0ZXJhYmxlPFN0cmluZz4gcmV0dXJuc0Fubm90YXRpb25zLAogICAgICB7Ym9vbCBpc0pzSW50ZXJvcH0pOwoKICAvLy8gQ29tcHV0ZSB0aGUga2luZCBvZiBmb3JlaWduIGhlbHBlciBmdW5jdGlvbiBjYWxsZWQgYnkgW25vZGVdLCBpZiBhbnkuCiAgRm9yZWlnbktpbmQgZ2V0Rm9yZWlnbktpbmQoaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKTsKCiAgLy8vIENvbXB1dGVzIHRoZSBbSW50ZXJmYWNlVHlwZV0gcmVmZXJlbmNlZCBieSBhIGNhbGwgdG8gdGhlCiAgLy8vIFtKU19JTlRFUkNFUFRPUl9DT05TVEFOVF0gZnVuY3Rpb24sIGlmIGFueS4KICBJbnRlcmZhY2VUeXBlIGdldEludGVyZmFjZVR5cGVGb3JKc0ludGVyY2VwdG9yQ2FsbChpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0xvY2FsXSBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhbCBmdW5jdGlvbiBbbm9kZV0uCiAgTG9jYWwgZ2V0TG9jYWxGdW5jdGlvbihpci5Mb2NhbEZ1bmN0aW9uIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW2lyLkxpYnJhcnldIGNvcnJlc3BvbmRpbmcgdG8gW2xpYnJhcnldLgogIGlyLkxpYnJhcnkgZ2V0TGlicmFyeU5vZGUoTGlicmFyeUVudGl0eSBsaWJyYXJ5KTsKCiAgLy8vIFJldHVybnMgdGhlIG5vZGUgdGhhdCBkZWZpbmVzIFt0eXBlZGVmXS4KICBpci5UeXBlZGVmIGdldFR5cGVkZWZOb2RlKGNvdmFyaWFudCBUeXBlZGVmRW50aXR5IHR5cGVkZWYpOwoKICAvLy8gUmV0dXJucyB0aGUgZGVmaW5pbmcgbm9kZSBmb3IgW21lbWJlcl0uCiAgaXIuTWVtYmVyIGdldE1lbWJlck5vZGUoY292YXJpYW50IE1lbWJlckVudGl0eSBtZW1iZXIpOwp9CgovLy8gS2luZHMgb2YgZm9yZWlnbiBmdW5jdGlvbnMuCmVudW0gRm9yZWlnbktpbmQgewogIEpTLAogIEpTX0JVSUxUSU4sCiAgSlNfRU1CRURERURfR0xPQkFMLAogIEpTX0lOVEVSQ0VQVE9SX0NPTlNUQU5ULAogIE5PTkUsCn0KgLwATk48ASg0NQEjTCQhIR4jKSIqJAFMLSQuJwE2JgEoFwFEKgFDKAE2KgE7OQE+QwEwNgFLFyU2AUQ6AUwTSDcBRSoBSi8BURo0AUMnAUMnAVEvAU0oQh0BPjQ4ATIeAUVHAUMQTgE2JTshAUJEAUI7PwE5NQErNAE9BlATLQFOFQZRR0xQKwYTFSsGTUksKTUBQz9QGwFGQQFLED5QGwFMOAE/MlABRjEBOzQBLz4BLjoCASATBg4WGwgCASxwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwvZWxlbWVudF9tYXAuZGFydDpzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9rZXJuZWwvZWxlbWVudF9tYXBfaW1wbC5kYXJ0wAEzoS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMua2VybmVsLmVsZW1lbnRfbWFwOwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTpqc19ydW50aW1lL3NoYXJlZC9lbWJlZGRlZF9uYW1lcy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL3Jlc29sdXRpb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2NvbXBpbGVfdGltZV9jb25zdGFudHMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0cnVjdG9ycy5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvZXZhbHVhdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvZXhwcmVzc2lvbnMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9pbmRleGVkLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2Vudmlyb25tZW50LmRhcnQnOwppbXBvcnQgJy4uL2Zyb250ZW5kX3N0cmF0ZWd5LmRhcnQnOwppbXBvcnQgJy4uL2lyL2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJy4uL2lyL2NvbnN0YW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9kZWJ1Zy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9lbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICcuLi9pci9pbXBhY3QuZGFydCc7CmltcG9ydCAnLi4vaXIvaW1wYWN0X2RhdGEuZGFydCc7CmltcG9ydCAnLi4vaXIvc3RhdGljX3R5cGUuZGFydCc7CmltcG9ydCAnLi4vaXIvc3RhdGljX3R5cGVfY2FjaGUuZGFydCc7CmltcG9ydCAnLi4vaXIvc2NvcGUuZGFydCc7CmltcG9ydCAnLi4vaXIvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaXIvdmlzaXRvcnMuZGFydCc7CmltcG9ydCAnLi4vaXIvdXRpbC5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmFtZXIuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25vX3N1Y2hfbWV0aG9kX3JlZ2lzdHJ5LmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL2xvY2Fscy5kYXJ0JzsKaW1wb3J0ICcuLi9rZXJuZWwvZGFydDJqc190YXJnZXQuZGFydCc7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9yZXNvbHZlci5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL29yZGVyZWRfdHlwZXNldC5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jbGFzc19oaWVyYXJjaHkuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CgppbXBvcnQgJ2VsZW1lbnRfbWFwLmRhcnQnOwppbXBvcnQgJ2Vudi5kYXJ0JzsKaW1wb3J0ICdrZWxlbWVudHMuZGFydCc7CmltcG9ydCAna2VybmVsX2ltcGFjdC5kYXJ0JzsKCnBhcnQgJ25hdGl2ZV9iYXNpY19kYXRhLmRhcnQnOwpwYXJ0ICdub19zdWNoX21ldGhvZF9yZXNvbHZlci5kYXJ0JzsKCi8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbS2VybmVsVG9FbGVtZW50TWFwXSB0aGF0IG9ubHkgc3VwcG9ydHMgd29ybGQKLy8vIGltcGFjdCBjb21wdXRhdGlvbi4KY2xhc3MgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBpbXBsZW1lbnRzIEtlcm5lbFRvRWxlbWVudE1hcCwgSXJUb0VsZW1lbnRNYXAgewogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zOwogIEBvdmVycmlkZQogIGZpbmFsIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlcjsKICBmaW5hbCBFbnZpcm9ubWVudCBfZW52aXJvbm1lbnQ7CiAgQ29tbW9uRWxlbWVudHNJbXBsIF9jb21tb25FbGVtZW50czsKICBLZXJuZWxFbGVtZW50RW52aXJvbm1lbnQgX2VsZW1lbnRFbnZpcm9ubWVudDsKICBEYXJ0VHlwZUNvbnZlcnRlciBfdHlwZUNvbnZlcnRlcjsKICBLZXJuZWxDb25zdGFudEVudmlyb25tZW50IF9jb25zdGFudEVudmlyb25tZW50OwogIEtlcm5lbERhcnRUeXBlcyBfdHlwZXM7CiAgaXIuVHlwZUVudmlyb25tZW50IF90eXBlRW52aXJvbm1lbnQ7CiAgaXIuQ2xhc3NIaWVyYXJjaHkgX2NsYXNzSGllcmFyY2h5OwogIERhcnQyanNDb25zdGFudEV2YWx1YXRvciBfY29uc3RhbnRFdmFsdWF0b3I7CiAgQ29uc3RhbnRWYWx1ZWZpZXIgX2NvbnN0YW50VmFsdWVmaWVyOwoKICAvLy8gTGlicmFyeSBlbnZpcm9ubWVudC4gVXNlZCBmb3IgZmFzdCBsb29rdXAuCiAgS1Byb2dyYW1FbnYgZW52ID0gbmV3IEtQcm9ncmFtRW52KCk7CgogIGZpbmFsIEVudGl0eURhdGFFbnZNYXA8SW5kZXhlZExpYnJhcnksIEtMaWJyYXJ5RGF0YSwgS0xpYnJhcnlFbnY+IGxpYnJhcmllcyA9CiAgICAgIG5ldyBFbnRpdHlEYXRhRW52TWFwPEluZGV4ZWRMaWJyYXJ5LCBLTGlicmFyeURhdGEsIEtMaWJyYXJ5RW52PigpOwogIGZpbmFsIEVudGl0eURhdGFFbnZNYXA8SW5kZXhlZENsYXNzLCBLQ2xhc3NEYXRhLCBLQ2xhc3NFbnY+IGNsYXNzZXMgPQogICAgICBuZXcgRW50aXR5RGF0YUVudk1hcDxJbmRleGVkQ2xhc3MsIEtDbGFzc0RhdGEsIEtDbGFzc0Vudj4oKTsKICBmaW5hbCBFbnRpdHlEYXRhTWFwPEluZGV4ZWRNZW1iZXIsIEtNZW1iZXJEYXRhPiBtZW1iZXJzID0KICAgICAgbmV3IEVudGl0eURhdGFNYXA8SW5kZXhlZE1lbWJlciwgS01lbWJlckRhdGE+KCk7CiAgZmluYWwgRW50aXR5RGF0YU1hcDxJbmRleGVkVHlwZVZhcmlhYmxlLCBLVHlwZVZhcmlhYmxlRGF0YT4gdHlwZVZhcmlhYmxlcyA9CiAgICAgIG5ldyBFbnRpdHlEYXRhTWFwPEluZGV4ZWRUeXBlVmFyaWFibGUsIEtUeXBlVmFyaWFibGVEYXRhPigpOwogIGZpbmFsIEVudGl0eURhdGFNYXA8SW5kZXhlZFR5cGVkZWYsIEtUeXBlZGVmRGF0YT4gdHlwZWRlZnMgPQogICAgICBuZXcgRW50aXR5RGF0YU1hcDxJbmRleGVkVHlwZWRlZiwgS1R5cGVkZWZEYXRhPigpOwoKICAvLy8gU2V0IHRvIGB0cnVlYCBiZWZvcmUgY3JlYXRpbmcgdGhlIEotV29ybGQgZnJvbSB0aGUgSy1Xb3JsZCB0byBhc3NlcnQgdGhhdAogIC8vLyBubyBlbnRpdGllcyBhcmUgY3JlYXRlZCBsYXRlLgogIGJvb2wgZW52SXNDbG9zZWQgPSBmYWxzZTsKCiAgZmluYWwgTWFwPGlyLkxpYnJhcnksIEluZGV4ZWRMaWJyYXJ5PiBsaWJyYXJ5TWFwID0ge307CiAgZmluYWwgTWFwPGlyLkNsYXNzLCBJbmRleGVkQ2xhc3M+IGNsYXNzTWFwID0ge307CiAgZmluYWwgTWFwPGlyLlR5cGVkZWYsIEluZGV4ZWRUeXBlZGVmPiB0eXBlZGVmTWFwID0ge307CgogIC8vLyBNYXAgZnJvbSBbaXIuVHlwZVBhcmFtZXRlcl0gbm9kZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcKICAvLy8gW1R5cGVWYXJpYWJsZUVudGl0eV0uCiAgLy8vCiAgLy8vIE5vcm1hbGx5IHRoZSB0eXBlIHZhcmlhYmxlcyBhcmUgW0luZGV4ZWRUeXBlVmFyaWFibGVdcywgYnV0IGZvciB0eXBlCiAgLy8vIHBhcmFtZXRlcnMgb24gbG9jYWwgZnVuY3Rpb24gKGluIHRoZSBmcm9udGVuZCkgdGhlc2UgYXJlIF9ub3RfIHNpbmNlCiAgLy8vIHRoZWlyIHR5cGUgZGVjbGFyYXRpb24gaXMgbmVpdGhlciBhIGNsYXNzIG5vciBhIG1lbWJlci4gSW4gdGhlIGJhY2tlbmQsCiAgLy8vIHRoZXNlIHR5cGUgcGFyYW1ldGVycyBiZWxvbmcgdG8gdGhlIGNhbGwtbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIGluZGV4ZWQuCiAgZmluYWwgTWFwPGlyLlR5cGVQYXJhbWV0ZXIsIFR5cGVWYXJpYWJsZUVudGl0eT4gdHlwZVZhcmlhYmxlTWFwID0ge307CiAgZmluYWwgTWFwPGlyLk1lbWJlciwgSW5kZXhlZENvbnN0cnVjdG9yPiBjb25zdHJ1Y3Rvck1hcCA9IHt9OwogIGZpbmFsIE1hcDxpci5Qcm9jZWR1cmUsIEluZGV4ZWRGdW5jdGlvbj4gbWV0aG9kTWFwID0ge307CiAgZmluYWwgTWFwPGlyLkZpZWxkLCBJbmRleGVkRmllbGQ+IGZpZWxkTWFwID0ge307CiAgZmluYWwgTWFwPGlyLlRyZWVOb2RlLCBMb2NhbD4gbG9jYWxGdW5jdGlvbk1hcCA9IHt9OwoKICBCZWhhdmlvckJ1aWxkZXIgX25hdGl2ZUJlaGF2aW9yQnVpbGRlcjsKICBGcm9udGVuZFN0cmF0ZWd5IF9mcm9udGVuZFN0cmF0ZWd5OwoKICBNYXA8S01lbWJlciwgTWFwPGlyLkV4cHJlc3Npb24sIFR5cGVNYXA+PiB0eXBlTWFwc0ZvclRlc3Rpbmc7CgogIEtlcm5lbFRvRWxlbWVudE1hcEltcGwoCiAgICAgIHRoaXMucmVwb3J0ZXIsIHRoaXMuX2Vudmlyb25tZW50LCB0aGlzLl9mcm9udGVuZFN0cmF0ZWd5LCB0aGlzLm9wdGlvbnMpIHsKICAgIF9lbGVtZW50RW52aXJvbm1lbnQgPSBuZXcgS2VybmVsRWxlbWVudEVudmlyb25tZW50KHRoaXMpOwogICAgX2NvbW1vbkVsZW1lbnRzID0gbmV3IENvbW1vbkVsZW1lbnRzSW1wbChfZWxlbWVudEVudmlyb25tZW50LCBvcHRpb25zKTsKICAgIF9jb25zdGFudEVudmlyb25tZW50ID0gbmV3IEtlcm5lbENvbnN0YW50RW52aXJvbm1lbnQodGhpcywgX2Vudmlyb25tZW50KTsKICAgIF90eXBlQ29udmVydGVyID0gbmV3IERhcnRUeXBlQ29udmVydGVyKHRoaXMpOwogICAgX3R5cGVzID0gbmV3IEtlcm5lbERhcnRUeXBlcyh0aGlzKTsKICAgIF9jb25zdGFudFZhbHVlZmllciA9IG5ldyBDb25zdGFudFZhbHVlZmllcih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlcyBnZXQgdHlwZXMgPT4gX3R5cGVzOwoKICBAb3ZlcnJpZGUKICBLZXJuZWxFbGVtZW50RW52aXJvbm1lbnQgZ2V0IGVsZW1lbnRFbnZpcm9ubWVudCA9PiBfZWxlbWVudEVudmlyb25tZW50OwoKICBAb3ZlcnJpZGUKICBDb21tb25FbGVtZW50c0ltcGwgZ2V0IGNvbW1vbkVsZW1lbnRzID0+IF9jb21tb25FbGVtZW50czsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IF9tYWluRnVuY3Rpb24gewogICAgcmV0dXJuIGVudi5tYWluTWV0aG9kICE9IG51bGwgPyBnZXRNZXRob2RJbnRlcm5hbChlbnYubWFpbk1ldGhvZCkgOiBudWxsOwogIH0KCiAgTGlicmFyeUVudGl0eSBnZXQgX21haW5MaWJyYXJ5IHsKICAgIHJldHVybiBlbnYubWFpbk1ldGhvZCAhPSBudWxsCiAgICAgICAgPyBnZXRMaWJyYXJ5SW50ZXJuYWwoZW52Lm1haW5NZXRob2QuZW5jbG9zaW5nTGlicmFyeSkKICAgICAgICA6IG51bGw7CiAgfQoKICBTb3VyY2VTcGFuIGdldFNvdXJjZVNwYW4oU3Bhbm5hYmxlIHNwYW5uYWJsZSwgRW50aXR5IGN1cnJlbnRFbGVtZW50KSB7CiAgICBTb3VyY2VTcGFuIGZyb21TcGFubmFibGUoU3Bhbm5hYmxlIHNwYW5uYWJsZSkgewogICAgICBpZiAoc3Bhbm5hYmxlIGlzIEluZGV4ZWRMaWJyYXJ5ICYmCiAgICAgICAgICBzcGFubmFibGUubGlicmFyeUluZGV4IDwgbGlicmFyaWVzLmxlbmd0aCkgewogICAgICAgIEtMaWJyYXJ5RW52IGVudiA9IGxpYnJhcmllcy5nZXRFbnYoc3Bhbm5hYmxlKTsKICAgICAgICByZXR1cm4gY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUoZW52LmxpYnJhcnkpOwogICAgICB9IGVsc2UgaWYgKHNwYW5uYWJsZSBpcyBJbmRleGVkQ2xhc3MgJiYKICAgICAgICAgIHNwYW5uYWJsZS5jbGFzc0luZGV4IDwgY2xhc3Nlcy5sZW5ndGgpIHsKICAgICAgICBLQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoc3Bhbm5hYmxlKTsKICAgICAgICBhc3NlcnQoZGF0YSAhPSBudWxsLCAiTm8gZGF0YSBmb3IgJHNwYW5uYWJsZSBpbiAkdGhpcyIpOwogICAgICAgIHJldHVybiBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShkYXRhLm5vZGUpOwogICAgICB9IGVsc2UgaWYgKHNwYW5uYWJsZSBpcyBJbmRleGVkTWVtYmVyICYmCiAgICAgICAgICBzcGFubmFibGUubWVtYmVySW5kZXggPCBtZW1iZXJzLmxlbmd0aCkgewogICAgICAgIEtNZW1iZXJEYXRhIGRhdGEgPSBtZW1iZXJzLmdldERhdGEoc3Bhbm5hYmxlKTsKICAgICAgICBhc3NlcnQoZGF0YSAhPSBudWxsLCAiTm8gZGF0YSBmb3IgJHNwYW5uYWJsZSBpbiAkdGhpcyIpOwogICAgICAgIHJldHVybiBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShkYXRhLm5vZGUpOwogICAgICB9IGVsc2UgaWYgKHNwYW5uYWJsZSBpcyBLTG9jYWxGdW5jdGlvbikgewogICAgICAgIHJldHVybiBnZXRTb3VyY2VTcGFuKHNwYW5uYWJsZS5tZW1iZXJDb250ZXh0LCBjdXJyZW50RWxlbWVudCk7CiAgICAgIH0gZWxzZSBpZiAoc3Bhbm5hYmxlIGlzIEpMb2NhbCkgewogICAgICAgIHJldHVybiBnZXRTb3VyY2VTcGFuKHNwYW5uYWJsZS5tZW1iZXJDb250ZXh0LCBjdXJyZW50RWxlbWVudCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgU291cmNlU3BhbiBzb3VyY2VTcGFuID0gZnJvbVNwYW5uYWJsZShzcGFubmFibGUpOwogICAgc291cmNlU3BhbiA/Pz0gZnJvbVNwYW5uYWJsZShjdXJyZW50RWxlbWVudCk7CiAgICByZXR1cm4gc291cmNlU3BhbjsKICB9CgogIExpYnJhcnlFbnRpdHkgbG9va3VwTGlicmFyeShVcmkgdXJpKSB7CiAgICBLTGlicmFyeUVudiBsaWJyYXJ5RW52ID0gZW52Lmxvb2t1cExpYnJhcnkodXJpKTsKICAgIGlmIChsaWJyYXJ5RW52ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGdldExpYnJhcnlJbnRlcm5hbChsaWJyYXJ5RW52LmxpYnJhcnksIGxpYnJhcnlFbnYpOwogIH0KCiAgU3RyaW5nIF9nZXRMaWJyYXJ5TmFtZShJbmRleGVkTGlicmFyeSBsaWJyYXJ5KSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkobGlicmFyeSkpOwogICAgS0xpYnJhcnlFbnYgbGlicmFyeUVudiA9IGxpYnJhcmllcy5nZXRFbnYobGlicmFyeSk7CiAgICByZXR1cm4gbGlicmFyeUVudi5saWJyYXJ5Lm5hbWUgPz8gJyc7CiAgfQoKICBNZW1iZXJFbnRpdHkgbG9va3VwTGlicmFyeU1lbWJlcihJbmRleGVkTGlicmFyeSBsaWJyYXJ5LCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZX0pIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShsaWJyYXJ5KSk7CiAgICBLTGlicmFyeUVudiBsaWJyYXJ5RW52ID0gbGlicmFyaWVzLmdldEVudihsaWJyYXJ5KTsKICAgIGlyLk1lbWJlciBtZW1iZXIgPSBsaWJyYXJ5RW52Lmxvb2t1cE1lbWJlcihuYW1lLCBzZXR0ZXI6IHNldHRlcik7CiAgICByZXR1cm4gbWVtYmVyICE9IG51bGwgPyBnZXRNZW1iZXIobWVtYmVyKSA6IG51bGw7CiAgfQoKICB2b2lkIF9mb3JFYWNoTGlicmFyeU1lbWJlcigKICAgICAgSW5kZXhlZExpYnJhcnkgbGlicmFyeSwgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIpKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkobGlicmFyeSkpOwogICAgS0xpYnJhcnlFbnYgbGlicmFyeUVudiA9IGxpYnJhcmllcy5nZXRFbnYobGlicmFyeSk7CiAgICBsaWJyYXJ5RW52LmZvckVhY2hNZW1iZXIoKGlyLk1lbWJlciBub2RlKSB7CiAgICAgIGYoZ2V0TWVtYmVyKG5vZGUpKTsKICAgIH0pOwogIH0KCiAgQ2xhc3NFbnRpdHkgbG9va3VwQ2xhc3MoSW5kZXhlZExpYnJhcnkgbGlicmFyeSwgU3RyaW5nIG5hbWUpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShsaWJyYXJ5KSk7CiAgICBLTGlicmFyeUVudiBsaWJyYXJ5RW52ID0gbGlicmFyaWVzLmdldEVudihsaWJyYXJ5KTsKICAgIEtDbGFzc0VudiBjbGFzc0VudiA9IGxpYnJhcnlFbnYubG9va3VwQ2xhc3MobmFtZSk7CiAgICBpZiAoY2xhc3NFbnYgIT0gbnVsbCkgewogICAgICByZXR1cm4gZ2V0Q2xhc3NJbnRlcm5hbChjbGFzc0Vudi5jbHMsIGNsYXNzRW52KTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBfZm9yRWFjaENsYXNzKEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnksIHZvaWQgZihDbGFzc0VudGl0eSBjbHMpKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkobGlicmFyeSkpOwogICAgS0xpYnJhcnlFbnYgbGlicmFyeUVudiA9IGxpYnJhcmllcy5nZXRFbnYobGlicmFyeSk7CiAgICBsaWJyYXJ5RW52LmZvckVhY2hDbGFzcygoS0NsYXNzRW52IGNsYXNzRW52KSB7CiAgICAgIGlmICghY2xhc3NFbnYuaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbikgewogICAgICAgIGYoZ2V0Q2xhc3NJbnRlcm5hbChjbGFzc0Vudi5jbHMsIGNsYXNzRW52KSk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCBlbnN1cmVDbGFzc01lbWJlcnMoaXIuQ2xhc3Mgbm9kZSkgewogICAgY2xhc3Nlcy5nZXRFbnYoZ2V0Q2xhc3NJbnRlcm5hbChub2RlKSkuZW5zdXJlTWVtYmVycyh0aGlzKTsKICB9CgogIE1lbWJlckVudGl0eSBsb29rdXBDbGFzc01lbWJlcihJbmRleGVkQ2xhc3MgY2xzLCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgc2V0dGVyOiBmYWxzZX0pIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEtDbGFzc0VudiBjbGFzc0VudiA9IGNsYXNzZXMuZ2V0RW52KGNscyk7CiAgICByZXR1cm4gY2xhc3NFbnYubG9va3VwTWVtYmVyKHRoaXMsIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICB9CgogIENvbnN0cnVjdG9yRW50aXR5IGxvb2t1cENvbnN0cnVjdG9yKEluZGV4ZWRDbGFzcyBjbHMsIFN0cmluZyBuYW1lKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBLQ2xhc3NFbnYgY2xhc3NFbnYgPSBjbGFzc2VzLmdldEVudihjbHMpOwogICAgcmV0dXJuIGNsYXNzRW52Lmxvb2t1cENvbnN0cnVjdG9yKHRoaXMsIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBjcmVhdGVJbnRlcmZhY2VUeXBlKAogICAgICBpci5DbGFzcyBjbHMsIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShnZXRDbGFzcyhjbHMpLCBnZXREYXJ0VHlwZXModHlwZUFyZ3VtZW50cykpOwogIH0KCiAgTGlicmFyeUVudGl0eSBnZXRMaWJyYXJ5KGlyLkxpYnJhcnkgbm9kZSkgPT4gZ2V0TGlicmFyeUludGVybmFsKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXRDbGFzcyhpci5DbGFzcyBub2RlKSA9PiBnZXRDbGFzc0ludGVybmFsKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldFN1cGVyVHlwZShJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBLQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoY2xzKTsKICAgIF9lbnN1cmVTdXBlcnR5cGVzKGNscywgZGF0YSk7CiAgICByZXR1cm4gZGF0YS5zdXBlcnR5cGU7CiAgfQoKICB2b2lkIF9lbnN1cmVUaGlzQW5kUmF3VHlwZShDbGFzc0VudGl0eSBjbHMsIEtDbGFzc0RhdGEgZGF0YSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgaWYgKGRhdGEgaXMgS0NsYXNzRGF0YUltcGwgJiYgZGF0YS50aGlzVHlwZSA9PSBudWxsKSB7CiAgICAgIGlyLkNsYXNzIG5vZGUgPSBkYXRhLm5vZGU7CiAgICAgIGlmIChub2RlLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgICBkYXRhLnRoaXNUeXBlID0KICAgICAgICAgICAgZGF0YS5yYXdUeXBlID0gbmV3IEludGVyZmFjZVR5cGUoY2xzLCBjb25zdCA8RGFydFR5cGU+W10pOwogICAgICB9IGVsc2UgewogICAgICAgIGRhdGEudGhpc1R5cGUgPSBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgY2xzLAogICAgICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZ2VuZXJhdGUobm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGgsCiAgICAgICAgICAgICAgICAoaW50IGluZGV4KSB7CiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUeXBlVmFyaWFibGVUeXBlKAogICAgICAgICAgICAgICAgICBnZXRUeXBlVmFyaWFibGVJbnRlcm5hbChub2RlLnR5cGVQYXJhbWV0ZXJzW2luZGV4XSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgZGF0YS5yYXdUeXBlID0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGNscywKICAgICAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoLCBjb25zdCBEeW5hbWljVHlwZSgpKSk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIFR5cGVWYXJpYWJsZUVudGl0eSBnZXRUeXBlVmFyaWFibGUoaXIuVHlwZVBhcmFtZXRlciBub2RlKSA9PgogICAgICBnZXRUeXBlVmFyaWFibGVJbnRlcm5hbChub2RlKTsKCiAgdm9pZCBfZW5zdXJlU3VwZXJ0eXBlcyhDbGFzc0VudGl0eSBjbHMsIEtDbGFzc0RhdGEgZGF0YSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgaWYgKGRhdGEgaXMgS0NsYXNzRGF0YUltcGwgJiYgZGF0YS5vcmRlcmVkVHlwZVNldCA9PSBudWxsKSB7CiAgICAgIF9lbnN1cmVUaGlzQW5kUmF3VHlwZShjbHMsIGRhdGEpOwoKICAgICAgaXIuQ2xhc3Mgbm9kZSA9IGRhdGEubm9kZTsKCiAgICAgIGlmIChub2RlLnN1cGVydHlwZSA9PSBudWxsKSB7CiAgICAgICAgZGF0YS5vcmRlcmVkVHlwZVNldCA9IG5ldyBPcmRlcmVkVHlwZVNldC5zaW5nbGV0b24oZGF0YS50aGlzVHlwZSk7CiAgICAgICAgZGF0YS5pc01peGluQXBwbGljYXRpb24gPSBmYWxzZTsKICAgICAgICBkYXRhLmludGVyZmFjZXMgPSBjb25zdCA8SW50ZXJmYWNlVHlwZT5bXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBJbnRlcmZhY2VUeXBlIHByb2Nlc3NTdXBlcnR5cGUoaXIuU3VwZXJ0eXBlIG5vZGUpIHsKICAgICAgICAgIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlID0gX3R5cGVDb252ZXJ0ZXIudmlzaXRTdXBlcnR5cGUobm9kZSk7CiAgICAgICAgICBJbmRleGVkQ2xhc3Mgc3VwZXJjbGFzcyA9IHN1cGVydHlwZS5lbGVtZW50OwogICAgICAgICAgS0NsYXNzRGF0YSBzdXBlcmRhdGEgPSBjbGFzc2VzLmdldERhdGEoc3VwZXJjbGFzcyk7CiAgICAgICAgICBfZW5zdXJlU3VwZXJ0eXBlcyhzdXBlcmNsYXNzLCBzdXBlcmRhdGEpOwogICAgICAgICAgcmV0dXJuIHN1cGVydHlwZTsKICAgICAgICB9CgogICAgICAgIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlOwogICAgICAgIGlyLkxpbmtCdWlsZGVyPEludGVyZmFjZVR5cGU+IGxpbmtCdWlsZGVyID0KICAgICAgICAgICAgbmV3IGlyLkxpbmtCdWlsZGVyPEludGVyZmFjZVR5cGU+KCk7CiAgICAgICAgaWYgKG5vZGUuaXNNaXhpbkRlY2xhcmF0aW9uKSB7CiAgICAgICAgICAvLyBBIG1peGluIGRlY2xhcmF0aW9uCiAgICAgICAgICAvLwogICAgICAgICAgLy8gICBtaXhpbiBNIG9uIEEsIEIsIEMge30KICAgICAgICAgIC8vCiAgICAgICAgICAvLyBpcyBlbmNvZGVkIGJ5IENGRSBhcwogICAgICAgICAgLy8KICAgICAgICAgIC8vICAgYWJzdHJhY3QgY2xhc3MgTSBleHRlbmRzIEEgaW1wbGVtZW50cyBCLCBDIHt9CiAgICAgICAgICAvLyAgIGFic3RyYWN0IGNsYXNzIE0gZXh0ZW5kcyBBJkImQyB7fQogICAgICAgICAgLy8KICAgICAgICAgIC8vIGJ1dCB3ZSBlbmNvZGUgaXQgYXMKICAgICAgICAgIC8vCiAgICAgICAgICAvLyAgIGFic3RyYWN0IGNsYXNzIE0gZXh0ZW5kcyBPYmplY3QgaW1wbGVtZW50cyBBLCBCLCBDIHt9CiAgICAgICAgICAvLwogICAgICAgICAgLy8gc28gd2UgbmVlZCBnZXQgdGhlIHN1cGVyY2xhc3NlcyBmcm9tIHRoZSBvbi1jbGF1c2UsIEEsIEIsIGFuZCBDLAogICAgICAgICAgLy8gdGhyb3VnaCBbc3VwZXJjbGFzc0NvbnN0cmFpbnRzXS4KICAgICAgICAgIGZvciAoaXIuU3VwZXJ0eXBlIGNvbnN0cmFpbnQgaW4gbm9kZS5zdXBlcmNsYXNzQ29uc3RyYWludHMoKSkgewogICAgICAgICAgICBsaW5rQnVpbGRlci5hZGRMYXN0KHByb2Nlc3NTdXBlcnR5cGUoY29uc3RyYWludCkpOwogICAgICAgICAgfQogICAgICAgICAgLy8gU2V0IHN1cGVyY2xhc3MgdG8gYE9iamVjdGAuCiAgICAgICAgICBzdXBlcnR5cGUgPSBfY29tbW9uRWxlbWVudHMub2JqZWN0VHlwZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3VwZXJ0eXBlID0gcHJvY2Vzc1N1cGVydHlwZShub2RlLnN1cGVydHlwZSk7CiAgICAgICAgfQogICAgICAgIGlmIChzdXBlcnR5cGUgPT0gX2NvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGUpIHsKICAgICAgICAgIENsYXNzRW50aXR5IGRlZmF1bHRTdXBlcmNsYXNzID0KICAgICAgICAgICAgICBfY29tbW9uRWxlbWVudHMuZ2V0RGVmYXVsdFN1cGVyY2xhc3MoY2xzLCBuYXRpdmVCYXNpY0RhdGEpOwogICAgICAgICAgZGF0YS5zdXBlcnR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFJhd1R5cGUoZGVmYXVsdFN1cGVyY2xhc3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkYXRhLnN1cGVydHlwZSA9IHN1cGVydHlwZTsKICAgICAgICB9CiAgICAgICAgaWYgKG5vZGUubWl4ZWRJblR5cGUgIT0gbnVsbCkgewogICAgICAgICAgZGF0YS5pc01peGluQXBwbGljYXRpb24gPSB0cnVlOwogICAgICAgICAgbGlua0J1aWxkZXIKICAgICAgICAgICAgICAuYWRkTGFzdChkYXRhLm1peGVkSW5UeXBlID0gcHJvY2Vzc1N1cGVydHlwZShub2RlLm1peGVkSW5UeXBlKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRhdGEuaXNNaXhpbkFwcGxpY2F0aW9uID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIG5vZGUuaW1wbGVtZW50ZWRUeXBlcy5mb3JFYWNoKChpci5TdXBlcnR5cGUgc3VwZXJ0eXBlKSB7CiAgICAgICAgICBsaW5rQnVpbGRlci5hZGRMYXN0KHByb2Nlc3NTdXBlcnR5cGUoc3VwZXJ0eXBlKSk7CiAgICAgICAgfSk7CiAgICAgICAgaXIuTGluazxJbnRlcmZhY2VUeXBlPiBpbnRlcmZhY2VzID0KICAgICAgICAgICAgbGlua0J1aWxkZXIudG9MaW5rKGNvbnN0IGlyLkxpbms8SW50ZXJmYWNlVHlwZT4oKSk7CiAgICAgICAgT3JkZXJlZFR5cGVTZXRCdWlsZGVyIHNldEJ1aWxkZXIgPQogICAgICAgICAgICBuZXcgS2VybmVsT3JkZXJlZFR5cGVTZXRCdWlsZGVyKHRoaXMsIGNscyk7CiAgICAgICAgZGF0YS5vcmRlcmVkVHlwZVNldCA9IHNldEJ1aWxkZXIuY3JlYXRlT3JkZXJlZFR5cGVTZXQoCiAgICAgICAgICAgIGRhdGEuc3VwZXJ0eXBlLCBpbnRlcmZhY2VzLnJldmVyc2UoY29uc3QgaXIuTGluazxJbnRlcmZhY2VUeXBlPigpKSk7CiAgICAgICAgZGF0YS5pbnRlcmZhY2VzID0gbmV3IExpc3Q8SW50ZXJmYWNlVHlwZT4uZnJvbShpbnRlcmZhY2VzLnRvTGlzdCgpKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZWRlZlR5cGUgZ2V0VHlwZWRlZlR5cGUoaXIuVHlwZWRlZiBub2RlKSB7CiAgICBJbmRleGVkVHlwZWRlZiB0eXBlZGVmID0gZ2V0VHlwZWRlZkludGVybmFsKG5vZGUpOwogICAgcmV0dXJuIHR5cGVkZWZzLmdldERhdGEodHlwZWRlZikucmF3VHlwZTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBnZXRNZW1iZXIoaXIuTWVtYmVyIG5vZGUpIHsKICAgIGlmIChub2RlIGlzIGlyLkZpZWxkKSB7CiAgICAgIHJldHVybiBnZXRGaWVsZEludGVybmFsKG5vZGUpOwogICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgIHJldHVybiBnZXRDb25zdHJ1Y3RvckludGVybmFsKG5vZGUpOwogICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLlByb2NlZHVyZSkgewogICAgICBpZiAobm9kZS5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuRmFjdG9yeSkgewogICAgICAgIHJldHVybiBnZXRDb25zdHJ1Y3RvckludGVybmFsKG5vZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBnZXRNZXRob2RJbnRlcm5hbChub2RlKTsKICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuZXhwZWN0ZWQgbWVtYmVyOiAkbm9kZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyRW50aXR5IGdldFN1cGVyTWVtYmVyKE1lbWJlckVudGl0eSBjb250ZXh0LCBpci5OYW1lIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICAvLyBXZSBjYW4gbm8gbG9uZ2VyIHRydXN0IHRoZSBpbnRlcmZhY2UgdGFyZ2V0IG9mIHRoZSBzdXBlciBhY2Nlc3Mgc2luY2UgaXQKICAgIC8vIG1pZ2h0IGJlIGEgbWVtYmVyIHRoYXQgd2UgaGF2ZSBjbG9uZWQuCiAgICBDbGFzc0VudGl0eSBjbHMgPSBjb250ZXh0LmVuY2xvc2luZ0NsYXNzOwogICAgYXNzZXJ0KAogICAgICAgIGNscyAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KGNvbnRleHQsCiAgICAgICAgICAgICJObyBlbmNsb3NpbmcgY2xhc3MgZm9yIHN1cGVyIG1lbWJlciBhY2Nlc3MgaW4gJGNvbnRleHQuIikpOwogICAgSW5kZXhlZENsYXNzIHN1cGVyY2xhc3MgPSBnZXRTdXBlclR5cGUoY2xzKT8uZWxlbWVudDsKICAgIHdoaWxlIChzdXBlcmNsYXNzICE9IG51bGwpIHsKICAgICAgS0NsYXNzRW52IGVudiA9IGNsYXNzZXMuZ2V0RW52KHN1cGVyY2xhc3MpOwogICAgICBNZW1iZXJFbnRpdHkgc3VwZXJNZW1iZXIgPQogICAgICAgICAgZW52Lmxvb2t1cE1lbWJlcih0aGlzLCBuYW1lLm5hbWUsIHNldHRlcjogc2V0dGVyKTsKICAgICAgaWYgKHN1cGVyTWVtYmVyICE9IG51bGwpIHsKICAgICAgICBpZiAoIXN1cGVyTWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIpIHJldHVybiBudWxsOwogICAgICAgIGlmICghc3VwZXJNZW1iZXIuaXNBYnN0cmFjdCkgewogICAgICAgICAgcmV0dXJuIHN1cGVyTWVtYmVyOwogICAgICAgIH0KICAgICAgfQogICAgICBzdXBlcmNsYXNzID0gZ2V0U3VwZXJUeXBlKHN1cGVyY2xhc3MpPy5lbGVtZW50OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvckVudGl0eSBnZXRDb25zdHJ1Y3Rvcihpci5NZW1iZXIgbm9kZSkgPT4KICAgICAgZ2V0Q29uc3RydWN0b3JJbnRlcm5hbChub2RlKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3JFbnRpdHkgZ2V0U3VwZXJDb25zdHJ1Y3RvcigKICAgICAgaXIuQ29uc3RydWN0b3Igc291cmNlTm9kZSwgaXIuTWVtYmVyIHRhcmdldE5vZGUpIHsKICAgIENvbnN0cnVjdG9yRW50aXR5IHNvdXJjZSA9IGdldENvbnN0cnVjdG9yKHNvdXJjZU5vZGUpOwogICAgQ2xhc3NFbnRpdHkgc291cmNlQ2xhc3MgPSBzb3VyY2UuZW5jbG9zaW5nQ2xhc3M7CiAgICBDb25zdHJ1Y3RvckVudGl0eSB0YXJnZXQgPSBnZXRDb25zdHJ1Y3Rvcih0YXJnZXROb2RlKTsKICAgIENsYXNzRW50aXR5IHRhcmdldENsYXNzID0gdGFyZ2V0LmVuY2xvc2luZ0NsYXNzOwogICAgSW5kZXhlZENsYXNzIHN1cGVyQ2xhc3MgPSBnZXRTdXBlclR5cGUoc291cmNlQ2xhc3MpPy5lbGVtZW50OwogICAgaWYgKHN1cGVyQ2xhc3MgPT0gdGFyZ2V0Q2xhc3MpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KCiAgICAvLy8gVGhpcyBwYXRoIGlzIG5lZWRlZCBmb3Igc3ludGhldGljYWxseSBpbmplY3RlZCBzdXBlcmNsYXNzZXMgbGlrZQogICAgLy8vIGBJbnRlcmNlcHRvcmAgYW5kIGBKYXZhU2NyaXB0T2JqZWN0YC4KICAgIEtDbGFzc0VudiBlbnYgPSBjbGFzc2VzLmdldEVudihzdXBlckNsYXNzKTsKICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yID0gZW52Lmxvb2t1cENvbnN0cnVjdG9yKHRoaXMsIHRhcmdldC5uYW1lKTsKICAgIGlmIChjb25zdHJ1Y3RvciAhPSBudWxsKSB7CiAgICAgIHJldHVybiBjb25zdHJ1Y3RvcjsKICAgIH0KICAgIHRocm93IGZhaWxlZEF0KHNvdXJjZSwgIlN1cGVyIGNvbnN0cnVjdG9yIGZvciAkc291cmNlIG5vdCBmb3VuZC4iKTsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldE1ldGhvZChpci5Qcm9jZWR1cmUgbm9kZSkgPT4gZ2V0TWV0aG9kSW50ZXJuYWwobm9kZSk7CgogIEBvdmVycmlkZQogIEZpZWxkRW50aXR5IGdldEZpZWxkKGlyLkZpZWxkIG5vZGUpID0+IGdldEZpZWxkSW50ZXJuYWwobm9kZSk7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldERhcnRUeXBlKGlyLkRhcnRUeXBlIHR5cGUpID0+IF90eXBlQ29udmVydGVyLmNvbnZlcnQodHlwZSk7CgogIEBvdmVycmlkZQogIFR5cGVWYXJpYWJsZVR5cGUgZ2V0VHlwZVZhcmlhYmxlVHlwZShpci5UeXBlUGFyYW1ldGVyVHlwZSB0eXBlKSA9PgogICAgICBnZXREYXJ0VHlwZSh0eXBlKTsKCiAgTGlzdDxEYXJ0VHlwZT4gZ2V0RGFydFR5cGVzKExpc3Q8aXIuRGFydFR5cGU+IHR5cGVzKSB7CiAgICBMaXN0PERhcnRUeXBlPiBsaXN0ID0gPERhcnRUeXBlPltdOwogICAgdHlwZXMuZm9yRWFjaCgoaXIuRGFydFR5cGUgdHlwZSkgewogICAgICBsaXN0LmFkZChnZXREYXJ0VHlwZSh0eXBlKSk7CiAgICB9KTsKICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRJbnRlcmZhY2VUeXBlKGlyLkludGVyZmFjZVR5cGUgdHlwZSkgPT4KICAgICAgX3R5cGVDb252ZXJ0ZXIuY29udmVydCh0eXBlKTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25UeXBlIGdldEZ1bmN0aW9uVHlwZShpci5GdW5jdGlvbk5vZGUgbm9kZSkgewogICAgRGFydFR5cGUgcmV0dXJuVHlwZTsKICAgIGlmIChub2RlLnBhcmVudCBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICAvLyBUaGUgcmV0dXJuIHR5cGUgb24gZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvcnMgaXMgYHZvaWRgLCBidXQgd2UgbmVlZAogICAgICAvLyBgZHluYW1pY2AgdHlwZSB0byBtYXRjaCB0aGUgZWxlbWVudCBtb2RlbC4KICAgICAgcmV0dXJuVHlwZSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm5UeXBlID0gZ2V0RGFydFR5cGUobm9kZS5yZXR1cm5UeXBlKTsKICAgIH0KICAgIExpc3Q8RGFydFR5cGU+IHBhcmFtZXRlclR5cGVzID0gPERhcnRUeXBlPltdOwogICAgTGlzdDxEYXJ0VHlwZT4gb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcyA9IDxEYXJ0VHlwZT5bXTsKCiAgICBEYXJ0VHlwZSBnZXRQYXJhbWV0ZXJUeXBlKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgICAgaWYgKHZhcmlhYmxlLmlzQ292YXJpYW50IHx8IHZhcmlhYmxlLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICAvLyBBIGNvdmFyaWFudCBwYXJhbWV0ZXIgaGFzIHR5cGUgYE9iamVjdGAgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUuCiAgICAgICAgcmV0dXJuIGNvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGU7CiAgICAgIH0KICAgICAgcmV0dXJuIGdldERhcnRUeXBlKHZhcmlhYmxlLnR5cGUpOwogICAgfQoKICAgIGZvciAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSBpbiBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIGlmIChwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gbm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcy5hZGQoZ2V0UGFyYW1ldGVyVHlwZSh2YXJpYWJsZSkpOwogICAgICB9IGVsc2UgewogICAgICAgIHBhcmFtZXRlclR5cGVzLmFkZChnZXRQYXJhbWV0ZXJUeXBlKHZhcmlhYmxlKSk7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8U3RyaW5nPiBuYW1lZFBhcmFtZXRlcnMgPSA8U3RyaW5nPltdOwogICAgTGlzdDxEYXJ0VHlwZT4gbmFtZWRQYXJhbWV0ZXJUeXBlcyA9IDxEYXJ0VHlwZT5bXTsKICAgIExpc3Q8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4gc29ydGVkTmFtZWRQYXJhbWV0ZXJzID0KICAgICAgICBub2RlLm5hbWVkUGFyYW1ldGVycy50b0xpc3QoKS4uc29ydCgoYSwgYikgPT4gYS5uYW1lLmNvbXBhcmVUbyhiLm5hbWUpKTsKICAgIGZvciAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSBpbiBzb3J0ZWROYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZCh2YXJpYWJsZS5uYW1lKTsKICAgICAgbmFtZWRQYXJhbWV0ZXJUeXBlcy5hZGQoZ2V0UGFyYW1ldGVyVHlwZSh2YXJpYWJsZSkpOwogICAgfQogICAgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gdHlwZVZhcmlhYmxlczsKICAgIGlmIChub2RlLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZVBhcmFtZXRlcnMgPSA8RGFydFR5cGU+W107CiAgICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIG5vZGUudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICB0eXBlUGFyYW1ldGVycwogICAgICAgICAgICAuYWRkKGdldERhcnRUeXBlKG5ldyBpci5UeXBlUGFyYW1ldGVyVHlwZSh0eXBlUGFyYW1ldGVyKSkpOwogICAgICB9CiAgICAgIHR5cGVWYXJpYWJsZXMgPSBuZXcgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4uZ2VuZXJhdGUoCiAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwKICAgICAgICAgIChpbnQgaW5kZXgpID0+IG5ldyBGdW5jdGlvblR5cGVWYXJpYWJsZShpbmRleCkpOwoKICAgICAgRGFydFR5cGUgc3Vic3QoRGFydFR5cGUgdHlwZSkgewogICAgICAgIHJldHVybiB0eXBlLnN1YnN0KHR5cGVWYXJpYWJsZXMsIHR5cGVQYXJhbWV0ZXJzKTsKICAgICAgfQoKICAgICAgcmV0dXJuVHlwZSA9IHN1YnN0KHJldHVyblR5cGUpOwogICAgICBwYXJhbWV0ZXJUeXBlcyA9IHBhcmFtZXRlclR5cGVzLm1hcChzdWJzdCkudG9MaXN0KCk7CiAgICAgIG9wdGlvbmFsUGFyYW1ldGVyVHlwZXMgPSBvcHRpb25hbFBhcmFtZXRlclR5cGVzLm1hcChzdWJzdCkudG9MaXN0KCk7CiAgICAgIG5hbWVkUGFyYW1ldGVyVHlwZXMgPSBuYW1lZFBhcmFtZXRlclR5cGVzLm1hcChzdWJzdCkudG9MaXN0KCk7CiAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCB0eXBlVmFyaWFibGVzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgIHR5cGVWYXJpYWJsZXNbaW5kZXhdLmJvdW5kID0KICAgICAgICAgICAgc3Vic3QoZ2V0RGFydFR5cGUobm9kZS50eXBlUGFyYW1ldGVyc1tpbmRleF0uYm91bmQpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdHlwZVZhcmlhYmxlcyA9IGNvbnN0IDxGdW5jdGlvblR5cGVWYXJpYWJsZT5bXTsKICAgIH0KCiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZShyZXR1cm5UeXBlLCBwYXJhbWV0ZXJUeXBlcywgb3B0aW9uYWxQYXJhbWV0ZXJUeXBlcywKICAgICAgICBuYW1lZFBhcmFtZXRlcnMsIG5hbWVkUGFyYW1ldGVyVHlwZXMsIHR5cGVWYXJpYWJsZXMpOwogIH0KCiAgQ29uc3RhbnRWYWx1ZSBjb21wdXRlQ29uc3RhbnRWYWx1ZSgKICAgICAgU3Bhbm5hYmxlIHNwYW5uYWJsZSwgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50LAogICAgICB7Ym9vbCByZXF1aXJlQ29uc3RhbnQ6IHRydWUsIGJvb2wgY2hlY2tDYXN0czogdHJ1ZX0pIHsKICAgIHJldHVybiBfY29uc3RhbnRFbnZpcm9ubWVudC5fZ2V0Q29uc3RhbnRWYWx1ZShzcGFubmFibGUsIGNvbnN0YW50LAogICAgICAgIGNvbnN0YW50UmVxdWlyZWQ6IHJlcXVpcmVDb25zdGFudCwgY2hlY2tDYXN0czogY2hlY2tDYXN0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBzdWJzdEJ5Q29udGV4dChEYXJ0VHlwZSB0eXBlLCBJbnRlcmZhY2VUeXBlIGNvbnRleHQpIHsKICAgIHJldHVybiB0eXBlLnN1YnN0KAogICAgICAgIGNvbnRleHQudHlwZUFyZ3VtZW50cywgZ2V0VGhpc1R5cGUoY29udGV4dC5lbGVtZW50KS50eXBlQXJndW1lbnRzKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBgY2FsbGAgbWV0aG9kIG9uICd0eXBlJy4KICAvLy8KICAvLy8gSWYgW3R5cGVdIGRvZXNuJ3QgaGF2ZSBhIGBjYWxsYCBtZW1iZXIgYG51bGxgIGlzIHJldHVybmVkLiBJZiBbdHlwZV0gaGFzCiAgLy8vIGFuIGludmFsaWQgYGNhbGxgIG1lbWJlciAobm9uLW1ldGhvZCBvciBhIHN5bnRoZXNpemVkIG1ldGhvZCB3aXRoIGJvdGgKICAvLy8gb3B0aW9uYWwgYW5kIG5hbWVkIHBhcmFtZXRlcnMpIGEgW0R5bmFtaWNUeXBlXSBpcyByZXR1cm5lZC4KICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRDYWxsVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgIEluZGV4ZWRDbGFzcyBjbHMgPSB0eXBlLmVsZW1lbnQ7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBLQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoY2xzKTsKICAgIGlmIChkYXRhLmNhbGxUeXBlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHN1YnN0QnlDb250ZXh0KGRhdGEuY2FsbFR5cGUsIHR5cGUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldFRoaXNUeXBlKEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEtDbGFzc0RhdGEgZGF0YSA9IGNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgX2Vuc3VyZVRoaXNBbmRSYXdUeXBlKGNscywgZGF0YSk7CiAgICByZXR1cm4gZGF0YS50aGlzVHlwZTsKICB9CgogIEludGVyZmFjZVR5cGUgX2dldFJhd1R5cGUoSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlVGhpc0FuZFJhd1R5cGUoY2xzLCBkYXRhKTsKICAgIHJldHVybiBkYXRhLnJhd1R5cGU7CiAgfQoKICBEYXJ0VHlwZSBfZ2V0RmllbGRUeXBlKEluZGV4ZWRGaWVsZCBmaWVsZCkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGZpZWxkKSk7CiAgICBLRmllbGREYXRhIGRhdGEgPSBtZW1iZXJzLmdldERhdGEoZmllbGQpOwogICAgcmV0dXJuIGRhdGEuZ2V0RmllbGRUeXBlKHRoaXMpOwogIH0KCiAgRnVuY3Rpb25UeXBlIF9nZXRGdW5jdGlvblR5cGUoSW5kZXhlZEZ1bmN0aW9uIGZ1bmN0aW9uKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoZnVuY3Rpb24pKTsKICAgIEtGdW5jdGlvbkRhdGEgZGF0YSA9IG1lbWJlcnMuZ2V0RGF0YShmdW5jdGlvbik7CiAgICByZXR1cm4gZGF0YS5nZXRGdW5jdGlvblR5cGUodGhpcyk7CiAgfQoKICBMaXN0PFR5cGVWYXJpYWJsZVR5cGU+IF9nZXRGdW5jdGlvblR5cGVWYXJpYWJsZXMoSW5kZXhlZEZ1bmN0aW9uIGZ1bmN0aW9uKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoZnVuY3Rpb24pKTsKICAgIEtGdW5jdGlvbkRhdGEgZGF0YSA9IG1lbWJlcnMuZ2V0RGF0YShmdW5jdGlvbik7CiAgICByZXR1cm4gZGF0YS5nZXRGdW5jdGlvblR5cGVWYXJpYWJsZXModGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRUeXBlVmFyaWFibGVCb3VuZChJbmRleGVkVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KHR5cGVWYXJpYWJsZSkpOwogICAgS1R5cGVWYXJpYWJsZURhdGEgZGF0YSA9IHR5cGVWYXJpYWJsZXMuZ2V0RGF0YSh0eXBlVmFyaWFibGUpOwogICAgcmV0dXJuIGRhdGEuZ2V0Qm91bmQodGhpcyk7CiAgfQoKICBDbGFzc0VudGl0eSBnZXRBcHBsaWVkTWl4aW4oSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgcmV0dXJuIGRhdGEubWl4ZWRJblR5cGU/LmVsZW1lbnQ7CiAgfQoKICBib29sIF9pc01peGluQXBwbGljYXRpb24oSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgcmV0dXJuIGRhdGEuaXNNaXhpbkFwcGxpY2F0aW9uOwogIH0KCiAgYm9vbCBfaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbihJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBLQ2xhc3NFbnYgZW52ID0gY2xhc3Nlcy5nZXRFbnYoY2xzKTsKICAgIHJldHVybiBlbnYuaXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbjsKICB9CgogIHZvaWQgX2ZvckVhY2hTdXBlcnR5cGUoSW5kZXhlZENsYXNzIGNscywgdm9pZCBmKEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlKSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgZGF0YS5vcmRlcmVkVHlwZVNldC5zdXBlcnR5cGVzLmZvckVhY2goZik7CiAgfQoKICB2b2lkIF9mb3JFYWNoTWl4aW4oSW5kZXhlZENsYXNzIGNscywgdm9pZCBmKENsYXNzRW50aXR5IG1peGluKSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgd2hpbGUgKGNscyAhPSBudWxsKSB7CiAgICAgIEtDbGFzc0RhdGEgZGF0YSA9IGNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgICBpZiAoZGF0YS5taXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgICAgZihkYXRhLm1peGVkSW5UeXBlLmVsZW1lbnQpOwogICAgICB9CiAgICAgIGNscyA9IGRhdGEuc3VwZXJ0eXBlPy5lbGVtZW50OwogICAgfQogIH0KCiAgdm9pZCBfZm9yRWFjaENvbnN0cnVjdG9yKEluZGV4ZWRDbGFzcyBjbHMsIHZvaWQgZihDb25zdHJ1Y3RvckVudGl0eSBtZW1iZXIpKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBLQ2xhc3NFbnYgZW52ID0gY2xhc3Nlcy5nZXRFbnYoY2xzKTsKICAgIGVudi5mb3JFYWNoQ29uc3RydWN0b3IodGhpcywgZik7CiAgfQoKICB2b2lkIF9mb3JFYWNoTG9jYWxDbGFzc01lbWJlcihJbmRleGVkQ2xhc3MgY2xzLCB2b2lkIGYoTWVtYmVyRW50aXR5IG1lbWJlcikpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIEtDbGFzc0VudiBlbnYgPSBjbGFzc2VzLmdldEVudihjbHMpOwogICAgZW52LmZvckVhY2hNZW1iZXIodGhpcywgKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgZihtZW1iZXIpOwogICAgfSk7CiAgfQoKICB2b2lkIGZvckVhY2hJbmplY3RlZENsYXNzTWVtYmVyKAogICAgICBJbmRleGVkQ2xhc3MgY2xzLCB2b2lkIGYoTWVtYmVyRW50aXR5IG1lbWJlcikpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICdLZXJuZWxUb0VsZW1lbnRNYXBCYXNlLl9mb3JFYWNoSW5qZWN0ZWRDbGFzc01lbWJlcicpOwogIH0KCiAgdm9pZCBfZm9yRWFjaENsYXNzTWVtYmVyKAogICAgICBJbmRleGVkQ2xhc3MgY2xzLCB2b2lkIGYoQ2xhc3NFbnRpdHkgY2xzLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRW52IGVudiA9IGNsYXNzZXMuZ2V0RW52KGNscyk7CiAgICBlbnYuZm9yRWFjaE1lbWJlcih0aGlzLCAoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICBmKGNscywgbWVtYmVyKTsKICAgIH0pOwogICAgS0NsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgaWYgKGRhdGEuc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgX2ZvckVhY2hDbGFzc01lbWJlcihkYXRhLnN1cGVydHlwZS5lbGVtZW50LCBmKTsKICAgIH0KICB9CgogIENvbnN0YW50Q29uc3RydWN0b3IgX2dldENvbnN0cnVjdG9yQ29uc3RhbnQoSW5kZXhlZENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY29uc3RydWN0b3IpKTsKICAgIEtDb25zdHJ1Y3RvckRhdGEgZGF0YSA9IG1lbWJlcnMuZ2V0RGF0YShjb25zdHJ1Y3Rvcik7CiAgICByZXR1cm4gZGF0YS5nZXRDb25zdHJ1Y3RvckNvbnN0YW50KHRoaXMsIGNvbnN0cnVjdG9yKTsKICB9CgogIENvbnN0YW50RXhwcmVzc2lvbiBfZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb24oSW5kZXhlZEZpZWxkIGZpZWxkKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoZmllbGQpKTsKICAgIEtGaWVsZERhdGEgZGF0YSA9IG1lbWJlcnMuZ2V0RGF0YShmaWVsZCk7CiAgICByZXR1cm4gZGF0YS5nZXRGaWVsZENvbnN0YW50RXhwcmVzc2lvbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgYXNJbnN0YW5jZU9mKEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBPcmRlcmVkVHlwZVNldCBvcmRlcmVkVHlwZVNldCA9IGdldE9yZGVyZWRUeXBlU2V0KHR5cGUuZWxlbWVudCk7CiAgICBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSA9CiAgICAgICAgb3JkZXJlZFR5cGVTZXQuYXNJbnN0YW5jZU9mKGNscywgZ2V0SGllcmFyY2h5RGVwdGgoY2xzKSk7CiAgICBpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgc3VwZXJ0eXBlID0gc3Vic3RCeUNvbnRleHQoc3VwZXJ0eXBlLCB0eXBlKTsKICAgIH0KICAgIHJldHVybiBzdXBlcnR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBPcmRlcmVkVHlwZVNldCBnZXRPcmRlcmVkVHlwZVNldChJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBLQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoY2xzKTsKICAgIF9lbnN1cmVTdXBlcnR5cGVzKGNscywgZGF0YSk7CiAgICByZXR1cm4gZGF0YS5vcmRlcmVkVHlwZVNldDsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXRIaWVyYXJjaHlEZXB0aChJbmRleGVkQ2xhc3MgY2xzKSB7CiAgICBhc3NlcnQoY2hlY2tGYW1pbHkoY2xzKSk7CiAgICBLQ2xhc3NEYXRhIGRhdGEgPSBjbGFzc2VzLmdldERhdGEoY2xzKTsKICAgIF9lbnN1cmVTdXBlcnR5cGVzKGNscywgZGF0YSk7CiAgICByZXR1cm4gZGF0YS5vcmRlcmVkVHlwZVNldC5tYXhEZXB0aDsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEludGVyZmFjZVR5cGU+IGdldEludGVyZmFjZXMoSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBfZW5zdXJlU3VwZXJ0eXBlcyhjbHMsIGRhdGEpOwogICAgcmV0dXJuIGRhdGEuaW50ZXJmYWNlczsKICB9CgogIEBvdmVycmlkZQogIGlyLk1lbWJlciBnZXRNZW1iZXJOb2RlKGNvdmFyaWFudCBJbmRleGVkTWVtYmVyIG1lbWJlcikgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KG1lbWJlcikpOwogICAgcmV0dXJuIG1lbWJlcnMuZ2V0RGF0YShtZW1iZXIpLm5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5DbGFzcyBnZXRDbGFzc05vZGUoY292YXJpYW50IEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChjaGVja0ZhbWlseShjbHMpKTsKICAgIHJldHVybiBjbGFzc2VzLmdldERhdGEoY2xzKS5ub2RlOwogIH0KCiAgaXIuVHlwZWRlZiBfZ2V0VHlwZWRlZk5vZGUoY292YXJpYW50IEluZGV4ZWRUeXBlZGVmIHR5cGVkZWYpIHsKICAgIHJldHVybiB0eXBlZGVmcy5nZXREYXRhKHR5cGVkZWYpLm5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBJbXBvcnRFbnRpdHkgZ2V0SW1wb3J0KGlyLkxpYnJhcnlEZXBlbmRlbmN5IG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiBudWxsOwogICAgaXIuTGlicmFyeSBsaWJyYXJ5ID0gbm9kZS5wYXJlbnQ7CiAgICBLTGlicmFyeURhdGEgZGF0YSA9IGxpYnJhcmllcy5nZXREYXRhKGdldExpYnJhcnlJbnRlcm5hbChsaWJyYXJ5KSk7CiAgICByZXR1cm4gZGF0YS5pbXBvcnRzW25vZGVdOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuVHlwZUVudmlyb25tZW50IGdldCB0eXBlRW52aXJvbm1lbnQgewogICAgcmV0dXJuIF90eXBlRW52aXJvbm1lbnQgPz89IG5ldyBpci5UeXBlRW52aXJvbm1lbnQoCiAgICAgICAgbmV3IGlyLkNvcmVUeXBlcyhlbnYubWFpbkNvbXBvbmVudCksIGNsYXNzSGllcmFyY2h5KTsKICB9CgogIEBvdmVycmlkZQogIGlyLkNsYXNzSGllcmFyY2h5IGdldCBjbGFzc0hpZXJhcmNoeSB7CiAgICByZXR1cm4gX2NsYXNzSGllcmFyY2h5ID8/PSBuZXcgaXIuQ2xhc3NIaWVyYXJjaHkoZW52Lm1haW5Db21wb25lbnQpOwogIH0KCiAgRGFydDJqc0NvbnN0YW50RXZhbHVhdG9yIGdldCBjb25zdGFudEV2YWx1YXRvciB7CiAgICByZXR1cm4gX2NvbnN0YW50RXZhbHVhdG9yID8/PSBuZXcgRGFydDJqc0NvbnN0YW50RXZhbHVhdG9yKHR5cGVFbnZpcm9ubWVudCwKICAgICAgICAoaXIuTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSwgTGlzdDxpci5Mb2NhdGVkTWVzc2FnZT4gY29udGV4dCkgewogICAgICByZXBvcnRMb2NhdGVkTWVzc2FnZShyZXBvcnRlciwgbWVzc2FnZSwgY29udGV4dCk7CiAgICB9LCBlbnZpcm9ubWVudDogX2Vudmlyb25tZW50LnRvTWFwKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgTmFtZSBnZXROYW1lKGlyLk5hbWUgbmFtZSkgewogICAgcmV0dXJuIG5ldyBOYW1lKAogICAgICAgIG5hbWUubmFtZSwgbmFtZS5pc1ByaXZhdGUgPyBnZXRMaWJyYXJ5KG5hbWUubGlicmFyeSkgOiBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIENhbGxTdHJ1Y3R1cmUgZ2V0Q2FsbFN0cnVjdHVyZShpci5Bcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBpbnQgYXJndW1lbnRDb3VudCA9IGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCArIGFyZ3VtZW50cy5uYW1lZC5sZW5ndGg7CiAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMgPSBhcmd1bWVudHMubmFtZWQubWFwKChlKSA9PiBlLm5hbWUpLnRvTGlzdCgpOwogICAgcmV0dXJuIG5ldyBDYWxsU3RydWN0dXJlKAogICAgICAgIGFyZ3VtZW50Q291bnQsIG5hbWVkQXJndW1lbnRzLCBhcmd1bWVudHMudHlwZXMubGVuZ3RoKTsKICB9CgogIFBhcmFtZXRlclN0cnVjdHVyZSBnZXRQYXJhbWV0ZXJTdHJ1Y3R1cmUoaXIuRnVuY3Rpb25Ob2RlIG5vZGUsCiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHdoZW4gdHlwZSBhcmd1bWVudHMgYXJlIHBhc3NlZCB0bwogICAgICAvLyBjb25zdHJ1Y3RvcnMgbGlrZSBjYWxsaW5nIGEgZ2VuZXJpYyBtZXRob2QuCiAgICAgIHtib29sIGluY2x1ZGVUeXBlUGFyYW1ldGVyczogdHJ1ZX0pIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENhY2hlIHRoZSBjb21wdXRlZCBmdW5jdGlvbiB0eXBlLgogICAgaW50IHJlcXVpcmVkUGFyYW1ldGVycyA9IG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudDsKICAgIGludCBwb3NpdGlvbmFsUGFyYW1ldGVycyA9IG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOwogICAgaW50IHR5cGVQYXJhbWV0ZXJzID0gbm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGg7CiAgICBMaXN0PFN0cmluZz4gbmFtZWRQYXJhbWV0ZXJzID0KICAgICAgICBub2RlLm5hbWVkUGFyYW1ldGVycy5tYXAoKHApID0+IHAubmFtZSkudG9MaXN0KCkuLnNvcnQoKTsKICAgIHJldHVybiBuZXcgUGFyYW1ldGVyU3RydWN0dXJlKHJlcXVpcmVkUGFyYW1ldGVycywgcG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLCBpbmNsdWRlVHlwZVBhcmFtZXRlcnMgPyB0eXBlUGFyYW1ldGVycyA6IDApOwogIH0KCiAgQG92ZXJyaWRlCiAgU2VsZWN0b3IgZ2V0SW52b2NhdGlvblNlbGVjdG9yKGlyLk5hbWUgaXJOYW1lLCBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLCBpbnQgdHlwZUFyZ3VtZW50cykgewogICAgTmFtZSBuYW1lID0gZ2V0TmFtZShpck5hbWUpOwogICAgU2VsZWN0b3JLaW5kIGtpbmQ7CiAgICBpZiAoU2VsZWN0b3IuaXNPcGVyYXRvck5hbWUobmFtZS50ZXh0KSkgewogICAgICBpZiAobmFtZSA9PSBOYW1lcy5JTkRFWF9OQU1FIHx8IG5hbWUgPT0gTmFtZXMuSU5ERVhfU0VUX05BTUUpIHsKICAgICAgICBraW5kID0gU2VsZWN0b3JLaW5kLklOREVYOwogICAgICB9IGVsc2UgewogICAgICAgIGtpbmQgPSBTZWxlY3RvcktpbmQuT1BFUkFUT1I7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGtpbmQgPSBTZWxlY3RvcktpbmQuQ0FMTDsKICAgIH0KCiAgICBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUgPSBuZXcgQ2FsbFN0cnVjdHVyZSgKICAgICAgICBwb3NpdGlvbmFsQXJndW1lbnRzICsgbmFtZWRBcmd1bWVudHMubGVuZ3RoLAogICAgICAgIG5hbWVkQXJndW1lbnRzLAogICAgICAgIHR5cGVBcmd1bWVudHMpOwogICAgcmV0dXJuIG5ldyBTZWxlY3RvcihraW5kLCBuYW1lLCBjYWxsU3RydWN0dXJlKTsKICB9CgogIFNlbGVjdG9yIGdldEdldHRlclNlbGVjdG9yKGlyLk5hbWUgaXJOYW1lKSB7CiAgICBOYW1lIG5hbWUgPSBuZXcgTmFtZSgKICAgICAgICBpck5hbWUubmFtZSwgaXJOYW1lLmlzUHJpdmF0ZSA/IGdldExpYnJhcnkoaXJOYW1lLmxpYnJhcnkpIDogbnVsbCk7CiAgICByZXR1cm4gbmV3IFNlbGVjdG9yLmdldHRlcihuYW1lKTsKICB9CgogIFNlbGVjdG9yIGdldFNldHRlclNlbGVjdG9yKGlyLk5hbWUgaXJOYW1lKSB7CiAgICBOYW1lIG5hbWUgPSBuZXcgTmFtZSgKICAgICAgICBpck5hbWUubmFtZSwgaXJOYW1lLmlzUHJpdmF0ZSA/IGdldExpYnJhcnkoaXJOYW1lLmxpYnJhcnkpIDogbnVsbCk7CiAgICByZXR1cm4gbmV3IFNlbGVjdG9yLnNldHRlcihuYW1lKTsKICB9CgogIC8vLyBMb29rcyB1cCBbdHlwZU5hbWVdIGZvciB1c2UgaW4gdGhlIHNwZWMtc3RyaW5nIG9mIGEgYEpTYCBjYWxsLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSB0aGlzIGluIFtOYXRpdmVCZWhhdmlvcl0gaW5zdGVhZCBvZiBjYWxsaW5nCiAgLy8gdGhlIGBGb3JlaWduUmVzb2x2ZXJgLgogIFR5cGVMb29rdXAgdHlwZUxvb2t1cCh7Ym9vbCByZXNvbHZlQXNSYXc6IHRydWV9KSB7CiAgICByZXR1cm4gcmVzb2x2ZUFzUmF3CiAgICAgICAgPyAoX2NhY2hlZFR5cGVMb29rdXBSYXcgPz89IF90eXBlTG9va3VwKHJlc29sdmVBc1JhdzogdHJ1ZSkpCiAgICAgICAgOiAoX2NhY2hlZFR5cGVMb29rdXBGdWxsID8/PSBfdHlwZUxvb2t1cChyZXNvbHZlQXNSYXc6IGZhbHNlKSk7CiAgfQoKICBUeXBlTG9va3VwIF9jYWNoZWRUeXBlTG9va3VwUmF3OwogIFR5cGVMb29rdXAgX2NhY2hlZFR5cGVMb29rdXBGdWxsOwoKICBUeXBlTG9va3VwIF90eXBlTG9va3VwKHtib29sIHJlc29sdmVBc1JhdzogdHJ1ZX0pIHsKICAgIGJvb2wgY2FjaGVkTWF5TG9va3VwSW5NYWluOwogICAgYm9vbCBtYXlMb29rdXBJbk1haW4oKSB7CiAgICAgIHZhciBtYWluVXJpID0gZWxlbWVudEVudmlyb25tZW50Lm1haW5MaWJyYXJ5LmNhbm9uaWNhbFVyaTsKICAgICAgLy8gVGVzdHMgcGVybWl0IGxvb2t1cCBvdXRzaWRlIG9mIGRhcnQ6IGxpYnJhcmllcy4KICAgICAgcmV0dXJuIG1haW5VcmkucGF0aC5jb250YWlucygndGVzdHMvY29tcGlsZXIvZGFydDJqc19uYXRpdmUnKSB8fAogICAgICAgICAgbWFpblVyaS5wYXRoLmNvbnRhaW5zKCd0ZXN0cy9jb21waWxlci9kYXJ0MmpzX2V4dHJhJyk7CiAgICB9CgogICAgRGFydFR5cGUgbG9va3VwKFN0cmluZyB0eXBlTmFtZSwge2Jvb2wgcmVxdWlyZWR9KSB7CiAgICAgIERhcnRUeXBlIGZpbmRJbkxpYnJhcnkoTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICAgICAgaWYgKGxpYnJhcnkgIT0gbnVsbCkgewogICAgICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gZWxlbWVudEVudmlyb25tZW50Lmxvb2t1cENsYXNzKGxpYnJhcnksIHR5cGVOYW1lKTsKICAgICAgICAgIGlmIChjbHMgIT0gbnVsbCkgewogICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBbGlnbiBzZW1hbnRpY3MuCiAgICAgICAgICAgIHJldHVybiByZXNvbHZlQXNSYXcKICAgICAgICAgICAgICAgID8gZWxlbWVudEVudmlyb25tZW50LmdldFJhd1R5cGUoY2xzKQogICAgICAgICAgICAgICAgOiBlbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoY2xzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIERhcnRUeXBlIGZpbmRJbihVcmkgdXJpKSB7CiAgICAgICAgcmV0dXJuIGZpbmRJbkxpYnJhcnkoZWxlbWVudEVudmlyb25tZW50Lmxvb2t1cExpYnJhcnkodXJpKSk7CiAgICAgIH0KCiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE5hcnJvdyB0aGUgc2V0IG9mIGxvb2t1cHMgYmFzZWQgb24gdGhlIGRlcGVuZGluZwogICAgICAvLyBsaWJyYXJ5LgogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDYWNoZSBtb3JlIHJlc3VsdHMgdG8gYXZvaWQgcmVkdW5kYW50IGxvb2t1cHM/CiAgICAgIERhcnRUeXBlIHR5cGU7CiAgICAgIGlmIChjYWNoZWRNYXlMb29rdXBJbk1haW4gPz89IG1heUxvb2t1cEluTWFpbigpKSB7CiAgICAgICAgdHlwZSA/Pz0gZmluZEluTGlicmFyeShlbGVtZW50RW52aXJvbm1lbnQubWFpbkxpYnJhcnkpOwogICAgICB9CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfY29yZSk7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfX2pzX2hlbHBlcik7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfX2ludGVyY2VwdG9ycyk7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfX25hdGl2ZV90eXBlZF9kYXRhKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9jb2xsZWN0aW9uKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9tYXRoKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9odG1sKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF9odG1sX2NvbW1vbik7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfc3ZnKTsKICAgICAgdHlwZSA/Pz0gZmluZEluKFVyaXMuZGFydF93ZWJfYXVkaW8pOwogICAgICB0eXBlID8/PSBmaW5kSW4oVXJpcy5kYXJ0X3dlYl9nbCk7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfd2ViX3NxbCk7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfaW5kZXhlZF9kYik7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfdHlwZWRfZGF0YSk7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfX3J0aSk7CiAgICAgIHR5cGUgPz89IGZpbmRJbihVcmlzLmRhcnRfbWlycm9ycyk7CiAgICAgIGlmICh0eXBlID09IG51bGwgJiYgcmVxdWlyZWQpIHsKICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICAgTWVzc2FnZUtpbmQuR0VORVJJQywgeyd0ZXh0JzogIlR5cGUgJyR0eXBlTmFtZScgbm90IGZvdW5kLiJ9KTsKICAgICAgfQogICAgICByZXR1cm4gdHlwZTsKICAgIH0KCiAgICByZXR1cm4gbG9va3VwOwogIH0KCiAgU3RyaW5nIF9nZXRTdHJpbmdBcmd1bWVudChpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUsIGludCBpbmRleCkgewogICAgcmV0dXJuIG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWxbaW5kZXhdLmFjY2VwdChuZXcgU3RyaW5naWZpZXIoKSk7CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDYWNoZSB0aGlzIGZvciBsYXRlciB1c2UuCiAgQG92ZXJyaWRlCiAgTmF0aXZlQmVoYXZpb3IgZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0NhbGwoaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPCAyIHx8CiAgICAgICAgbm9kZS5hcmd1bWVudHMubmFtZWQuaXNOb3RFbXB0eSkgewogICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCBNZXNzYWdlS2luZC5XUk9OR19BUkdVTUVOVF9GT1JfSlMpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CiAgICBTdHJpbmcgc3BlY1N0cmluZyA9IF9nZXRTdHJpbmdBcmd1bWVudChub2RlLCAwKTsKICAgIGlmIChzcGVjU3RyaW5nID09IG51bGwpIHsKICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgTWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTX0ZJUlNUKTsKICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgfQoKICAgIFN0cmluZyBjb2RlU3RyaW5nID0gX2dldFN0cmluZ0FyZ3VtZW50KG5vZGUsIDEpOwogICAgaWYgKGNvZGVTdHJpbmcgPT0gbnVsbCkgewogICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCBNZXNzYWdlS2luZC5XUk9OR19BUkdVTUVOVF9GT1JfSlNfU0VDT05EKTsKICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgfQoKICAgIHJldHVybiBOYXRpdmVCZWhhdmlvci5vZkpzQ2FsbCgKICAgICAgICBzcGVjU3RyaW5nLAogICAgICAgIGNvZGVTdHJpbmcsCiAgICAgICAgdHlwZUxvb2t1cChyZXNvbHZlQXNSYXc6IHRydWUpLAogICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgcmVwb3J0ZXIsCiAgICAgICAgY29tbW9uRWxlbWVudHMpOwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2FjaGUgdGhpcyBmb3IgbGF0ZXIgdXNlLgogIEBvdmVycmlkZQogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUJlaGF2aW9yRm9ySnNCdWlsdGluQ2FsbChpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA8IDEpIHsKICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcigKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICJKUyBidWlsdGluIGV4cHJlc3Npb24gaGFzIG5vIHR5cGUuIik7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQmVoYXZpb3IoKTsKICAgIH0KICAgIGlmIChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA8IDIpIHsKICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcigKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICJKUyBidWlsdGluIGlzIG1pc3NpbmcgbmFtZS4iKTsKICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgfQogICAgU3RyaW5nIHNwZWNTdHJpbmcgPSBfZ2V0U3RyaW5nQXJndW1lbnQobm9kZSwgMCk7CiAgICBpZiAoc3BlY1N0cmluZyA9PSBudWxsKSB7CiAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3IoCiAgICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCAiVW5leHBlY3RlZCBmaXJzdCBhcmd1bWVudC4iKTsKICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgfQogICAgcmV0dXJuIE5hdGl2ZUJlaGF2aW9yLm9mSnNCdWlsdGluQ2FsbCgKICAgICAgICBzcGVjU3RyaW5nLAogICAgICAgIHR5cGVMb29rdXAocmVzb2x2ZUFzUmF3OiB0cnVlKSwKICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgIHJlcG9ydGVyLAogICAgICAgIGNvbW1vbkVsZW1lbnRzKTsKICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENhY2hlIHRoaXMgZm9yIGxhdGVyIHVzZS4KICBAb3ZlcnJpZGUKICBOYXRpdmVCZWhhdmlvciBnZXROYXRpdmVCZWhhdmlvckZvckpzRW1iZWRkZWRHbG9iYWxDYWxsKAogICAgICBpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA8IDEpIHsKICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcihDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgIkpTIGVtYmVkZGVkIGdsb2JhbCBleHByZXNzaW9uIGhhcyBubyB0eXBlLiIpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CiAgICBpZiAobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPCAyKSB7CiAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3IoCiAgICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCAiSlMgZW1iZWRkZWQgZ2xvYmFsIGlzIG1pc3NpbmcgbmFtZS4iKTsKICAgICAgcmV0dXJuIG5ldyBOYXRpdmVCZWhhdmlvcigpOwogICAgfQogICAgaWYgKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoID4gMiB8fAogICAgICAgIG5vZGUuYXJndW1lbnRzLm5hbWVkLmlzTm90RW1wdHkpIHsKICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcihDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgIkpTIGVtYmVkZGVkIGdsb2JhbCBoYXMgbW9yZSB0aGFuIDIgYXJndW1lbnRzLiIpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CiAgICBTdHJpbmcgc3BlY1N0cmluZyA9IF9nZXRTdHJpbmdBcmd1bWVudChub2RlLCAwKTsKICAgIGlmIChzcGVjU3RyaW5nID09IG51bGwpIHsKICAgICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcigKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICJVbmV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50LiIpOwogICAgICByZXR1cm4gbmV3IE5hdGl2ZUJlaGF2aW9yKCk7CiAgICB9CiAgICByZXR1cm4gTmF0aXZlQmVoYXZpb3Iub2ZKc0VtYmVkZGVkR2xvYmFsQ2FsbCgKICAgICAgICBzcGVjU3RyaW5nLAogICAgICAgIHR5cGVMb29rdXAocmVzb2x2ZUFzUmF3OiB0cnVlKSwKICAgICAgICBDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgIHJlcG9ydGVyLAogICAgICAgIGNvbW1vbkVsZW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGpzLk5hbWUgZ2V0TmFtZUZvckpzR2V0TmFtZShDb25zdGFudFZhbHVlIGNvbnN0YW50LCBOYW1lciBuYW1lcikgewogICAgaW50IGluZGV4ID0gZXh0cmFjdEVudW1JbmRleEZyb21Db25zdGFudFZhbHVlKAogICAgICAgIGNvbnN0YW50LCBjb21tb25FbGVtZW50cy5qc0dldE5hbWVFbnVtKTsKICAgIGlmIChpbmRleCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBuYW1lci5nZXROYW1lRm9ySnNHZXROYW1lKAogICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsIEpzR2V0TmFtZS52YWx1ZXNbaW5kZXhdKTsKICB9CgogIGludCBleHRyYWN0RW51bUluZGV4RnJvbUNvbnN0YW50VmFsdWUoCiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQsIENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCkgewogICAgaWYgKGNvbnN0YW50IGlzIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSkgewogICAgICBpZiAoY29uc3RhbnQudHlwZS5lbGVtZW50ID09IGNsYXNzRWxlbWVudCkgewogICAgICAgIGFzc2VydChjb25zdGFudC5maWVsZHMubGVuZ3RoID09IDEgfHwgY29uc3RhbnQuZmllbGRzLmxlbmd0aCA9PSAyKTsKICAgICAgICBDb25zdGFudFZhbHVlIGluZGV4Q29uc3RhbnQgPSBjb25zdGFudC5maWVsZHMudmFsdWVzLmZpcnN0OwogICAgICAgIGlmIChpbmRleENvbnN0YW50IGlzIEludENvbnN0YW50VmFsdWUpIHsKICAgICAgICAgIHJldHVybiBpbmRleENvbnN0YW50LmludFZhbHVlLnRvSW50KCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZ2V0Q29uc3RhbnRWYWx1ZShpci5FeHByZXNzaW9uIG5vZGUsCiAgICAgIHtib29sIHJlcXVpcmVDb25zdGFudDogdHJ1ZSwKICAgICAgYm9vbCBpbXBsaWNpdE51bGw6IGZhbHNlLAogICAgICBib29sIGNoZWNrQ2FzdHM6IHRydWV9KSB7CiAgICBpZiAobm9kZSBpcyBpci5Db25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgaXIuQ29uc3RhbnQgY29uc3RhbnQgPQogICAgICAgICAgY29uc3RhbnRFdmFsdWF0b3IuZXZhbHVhdGUobm9kZSwgcmVxdWlyZUNvbnN0YW50OiByZXF1aXJlQ29uc3RhbnQpOwogICAgICBpZiAoY29uc3RhbnQgPT0gbnVsbCkgewogICAgICAgIGlmIChyZXF1aXJlQ29uc3RhbnQpIHsKICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgICAgICdObyBjb25zdGFudCBmb3IgJHtEZWJ1Z1ByaW50ZXIucHJldHR5UHJpbnQobm9kZSl9Jyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBfY29uc3RhbnRWYWx1ZWZpZXIudmlzaXRDb25zdGFudChjb25zdGFudCk7CiAgICAgIH0KICAgIH0KCiAgICBDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnQ7CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIGlmICghaW1wbGljaXROdWxsKSB7CiAgICAgICAgdGhyb3cgZmFpbGVkQXQoCiAgICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICdObyBleHByZXNzaW9uIGZvciBjb25zdGFudC4nKTsKICAgICAgfQogICAgICBjb25zdGFudCA9IG5ldyBOdWxsQ29uc3RhbnRFeHByZXNzaW9uKCk7CiAgICB9IGVsc2UgewogICAgICBjb25zdGFudCA9CiAgICAgICAgICBuZXcgQ29uc3RhbnRpZmllcih0aGlzLCByZXF1aXJlQ29uc3RhbnQ6IHJlcXVpcmVDb25zdGFudCkudmlzaXQobm9kZSk7CiAgICB9CiAgICBpZiAoY29uc3RhbnQgPT0gbnVsbCkgewogICAgICBpZiAocmVxdWlyZUNvbnN0YW50KSB7CiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAgICdObyBjb25zdGFudCBmb3IgJHtEZWJ1Z1ByaW50ZXIucHJldHR5UHJpbnQobm9kZSl9Jyk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gY29tcHV0ZUNvbnN0YW50VmFsdWUoCiAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSksIGNvbnN0YW50LAogICAgICAgIHJlcXVpcmVDb25zdGFudDogcmVxdWlyZUNvbnN0YW50LCBjaGVja0Nhc3RzOiBjaGVja0Nhc3RzKTsKICAgIGlmICghdmFsdWUuaXNDb25zdGFudCAmJiAhcmVxdWlyZUNvbnN0YW50KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgLy8vIENvbnZlcnRzIFthbm5vdGF0aW9uc10gaW50byBhIGxpc3Qgb2YgW0NvbnN0YW50VmFsdWVdcy4KICBMaXN0PENvbnN0YW50VmFsdWU+IGdldE1ldGFkYXRhKExpc3Q8aXIuRXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMpIHsKICAgIGlmIChhbm5vdGF0aW9ucy5pc0VtcHR5KSByZXR1cm4gY29uc3QgPENvbnN0YW50VmFsdWU+W107CiAgICBMaXN0PENvbnN0YW50VmFsdWU+IG1ldGFkYXRhID0gPENvbnN0YW50VmFsdWU+W107CiAgICBhbm5vdGF0aW9ucy5mb3JFYWNoKChpci5FeHByZXNzaW9uIG5vZGUpIHsKICAgICAgLy8gV2Ugc2tpcCB0aGUgaW1wbGljaXQgY2FzdCBjaGVja3MgZm9yIG1ldGFkYXRhIHRvIGF2b2lkIGNpcmN1bGFyCiAgICAgIC8vIGRlcGVuZGVuY2llcyBpbiB0aGUganMtaW50ZXJvcCBjbGFzcyByZWdpc3RyYXRpb24uCiAgICAgIG1ldGFkYXRhLmFkZChnZXRDb25zdGFudFZhbHVlKG5vZGUsIGNoZWNrQ2FzdHM6IGZhbHNlKSk7CiAgICB9KTsKICAgIHJldHVybiBtZXRhZGF0YTsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldFN1cGVyTm9TdWNoTWV0aG9kKENsYXNzRW50aXR5IGNscykgewogICAgd2hpbGUgKGNscyAhPSBudWxsKSB7CiAgICAgIGNscyA9IGVsZW1lbnRFbnZpcm9ubWVudC5nZXRTdXBlckNsYXNzKGNscyk7CiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPSBlbGVtZW50RW52aXJvbm1lbnQubG9va3VwTG9jYWxDbGFzc01lbWJlcigKICAgICAgICAgIGNscywgSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXyk7CiAgICAgIGlmIChtZW1iZXIgIT0gbnVsbCAmJiAhbWVtYmVyLmlzQWJzdHJhY3QpIHsKICAgICAgICBpZiAobWVtYmVyLmlzRnVuY3Rpb24pIHsKICAgICAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uID0gbWVtYmVyOwogICAgICAgICAgaWYgKGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZS5wb3NpdGlvbmFsUGFyYW1ldGVycyA+PSAxKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gSWYgW21lbWJlcl0gaXMgbm90IGEgdmFsaWQgYG5vU3VjaE1ldGhvZGAgdGhlIHRhcmdldCBpcwogICAgICAgIC8vIGBPYmplY3Quc3VwZXJOb1N1Y2hNZXRob2RgLgogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiA9IGVsZW1lbnRFbnZpcm9ubWVudC5sb29rdXBMb2NhbENsYXNzTWVtYmVyKAogICAgICAgIGNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzLCBJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfKTsKICAgIGFzc2VydChmdW5jdGlvbiAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KGNscywgIk5vIHN1cGVyIG5vU3VjaE1ldGhvZCBmb3VuZCBmb3IgY2xhc3MgJGNscy4iKSk7CiAgICByZXR1cm4gZnVuY3Rpb247CiAgfQoKICBJdGVyYWJsZTxMaWJyYXJ5RW50aXR5PiBnZXQgbGlicmFyeUxpc3RJbnRlcm5hbCB7CiAgICBpZiAoZW52Lmxlbmd0aCAhPSBsaWJyYXJ5TWFwLmxlbmd0aCkgewogICAgICAvLyBDcmVhdGUgYSBbS0xpYnJhcnldIGZvciBlYWNoIGxpYnJhcnkuCiAgICAgIGVudi5mb3JFYWNoTGlicmFyeSgoS0xpYnJhcnlFbnYgZW52KSB7CiAgICAgICAgZ2V0TGlicmFyeUludGVybmFsKGVudi5saWJyYXJ5LCBlbnYpOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBsaWJyYXJ5TWFwLnZhbHVlczsKICB9CgogIExpYnJhcnlFbnRpdHkgZ2V0TGlicmFyeUludGVybmFsKGlyLkxpYnJhcnkgbm9kZSwgW0tMaWJyYXJ5RW52IGxpYnJhcnlFbnZdKSB7CiAgICByZXR1cm4gbGlicmFyeU1hcFtub2RlXSA/Pz0gX2dldExpYnJhcnlDcmVhdGUobm9kZSwgbGlicmFyeUVudik7CiAgfQoKICBMaWJyYXJ5RW50aXR5IF9nZXRMaWJyYXJ5Q3JlYXRlKGlyLkxpYnJhcnkgbm9kZSwgS0xpYnJhcnlFbnYgbGlicmFyeUVudikgewogICAgYXNzZXJ0KAogICAgICAgICFlbnZJc0Nsb3NlZCwKICAgICAgICAiRW52aXJvbm1lbnQgb2YgJHRoaXMgaXMgY2xvc2VkLiBUcnlpbmcgdG8gY3JlYXRlICIKICAgICAgICAibGlicmFyeSBmb3IgJG5vZGUuIik7CiAgICBVcmkgY2Fub25pY2FsVXJpID0gbm9kZS5pbXBvcnRVcmk7CiAgICBTdHJpbmcgbmFtZSA9IG5vZGUubmFtZTsKICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgLy8gVXNlIHRoZSBmaWxlIG5hbWUgYXMgc2NyaXB0IG5hbWUuCiAgICAgIFN0cmluZyBwYXRoID0gY2Fub25pY2FsVXJpLnBhdGg7CiAgICAgIG5hbWUgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgIH0KICAgIEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnkgPSBjcmVhdGVMaWJyYXJ5KG5hbWUsIGNhbm9uaWNhbFVyaSk7CiAgICByZXR1cm4gbGlicmFyaWVzLnJlZ2lzdGVyKGxpYnJhcnksIG5ldyBLTGlicmFyeURhdGEobm9kZSksCiAgICAgICAgbGlicmFyeUVudiA/PyBlbnYubG9va3VwTGlicmFyeShjYW5vbmljYWxVcmkpKTsKICB9CgogIENsYXNzRW50aXR5IGdldENsYXNzSW50ZXJuYWwoaXIuQ2xhc3Mgbm9kZSwgW0tDbGFzc0VudiBjbGFzc0Vudl0pIHsKICAgIHJldHVybiBjbGFzc01hcFtub2RlXSA/Pz0gX2dldENsYXNzQ3JlYXRlKG5vZGUsIGNsYXNzRW52KTsKICB9CgogIENsYXNzRW50aXR5IF9nZXRDbGFzc0NyZWF0ZShpci5DbGFzcyBub2RlLCBLQ2xhc3NFbnYgY2xhc3NFbnYpIHsKICAgIGFzc2VydCgKICAgICAgICAhZW52SXNDbG9zZWQsCiAgICAgICAgIkVudmlyb25tZW50IG9mICR0aGlzIGlzIGNsb3NlZC4gVHJ5aW5nIHRvIGNyZWF0ZSAiCiAgICAgICAgImNsYXNzIGZvciAkbm9kZS4iKTsKICAgIEtMaWJyYXJ5IGxpYnJhcnkgPSBnZXRMaWJyYXJ5SW50ZXJuYWwobm9kZS5lbmNsb3NpbmdMaWJyYXJ5KTsKICAgIGlmIChjbGFzc0VudiA9PSBudWxsKSB7CiAgICAgIGNsYXNzRW52ID0gbGlicmFyaWVzLmdldEVudihsaWJyYXJ5KS5sb29rdXBDbGFzcyhub2RlLm5hbWUpOwogICAgfQogICAgSW5kZXhlZENsYXNzIGNscyA9CiAgICAgICAgY3JlYXRlQ2xhc3MobGlicmFyeSwgbm9kZS5uYW1lLCBpc0Fic3RyYWN0OiBub2RlLmlzQWJzdHJhY3QpOwogICAgcmV0dXJuIGNsYXNzZXMucmVnaXN0ZXIoY2xzLCBuZXcgS0NsYXNzRGF0YUltcGwobm9kZSksIGNsYXNzRW52KTsKICB9CgogIFR5cGVkZWZFbnRpdHkgZ2V0VHlwZWRlZkludGVybmFsKGlyLlR5cGVkZWYgbm9kZSkgewogICAgcmV0dXJuIHR5cGVkZWZNYXBbbm9kZV0gPz89IF9nZXRUeXBlZGVmQ3JlYXRlKG5vZGUpOwogIH0KCiAgVHlwZWRlZkVudGl0eSBfZ2V0VHlwZWRlZkNyZWF0ZShpci5UeXBlZGVmIG5vZGUpIHsKICAgIGFzc2VydCgKICAgICAgICAhZW52SXNDbG9zZWQsCiAgICAgICAgIkVudmlyb25tZW50IG9mICR0aGlzIGlzIGNsb3NlZC4gVHJ5aW5nIHRvIGNyZWF0ZSAiCiAgICAgICAgInR5cGVkZWYgZm9yICRub2RlLiIpOwogICAgSW5kZXhlZExpYnJhcnkgbGlicmFyeSA9IGdldExpYnJhcnlJbnRlcm5hbChub2RlLmVuY2xvc2luZ0xpYnJhcnkpOwogICAgSW5kZXhlZFR5cGVkZWYgdHlwZWRlZiA9IGNyZWF0ZVR5cGVkZWYobGlicmFyeSwgbm9kZS5uYW1lKTsKICAgIFR5cGVkZWZUeXBlIHR5cGVkZWZUeXBlID0gbmV3IFR5cGVkZWZUeXBlKAogICAgICAgIHR5cGVkZWYsCiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGgsIGNvbnN0IER5bmFtaWNUeXBlKCkpLAogICAgICAgIGdldERhcnRUeXBlKG5vZGUudHlwZSkpOwogICAgcmV0dXJuIHR5cGVkZWZzLnJlZ2lzdGVyKAogICAgICAgIHR5cGVkZWYsIG5ldyBLVHlwZWRlZkRhdGEobm9kZSwgdHlwZWRlZiwgdHlwZWRlZlR5cGUpKTsKICB9CgogIFR5cGVWYXJpYWJsZUVudGl0eSBnZXRUeXBlVmFyaWFibGVJbnRlcm5hbChpci5UeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIHJldHVybiB0eXBlVmFyaWFibGVNYXBbbm9kZV0gPz89IF9nZXRUeXBlVmFyaWFibGVDcmVhdGUobm9kZSk7CiAgfQoKICBUeXBlVmFyaWFibGVFbnRpdHkgX2dldFR5cGVWYXJpYWJsZUNyZWF0ZShpci5UeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIGFzc2VydCgKICAgICAgICAhZW52SXNDbG9zZWQsCiAgICAgICAgIkVudmlyb25tZW50IG9mICR0aGlzIGlzIGNsb3NlZC4gVHJ5aW5nIHRvIGNyZWF0ZSAiCiAgICAgICAgInR5cGUgdmFyaWFibGUgZm9yICRub2RlLiIpOwogICAgaWYgKG5vZGUucGFyZW50IGlzIGlyLkNsYXNzKSB7CiAgICAgIGlyLkNsYXNzIGNscyA9IG5vZGUucGFyZW50OwogICAgICBpbnQgaW5kZXggPSBjbHMudHlwZVBhcmFtZXRlcnMuaW5kZXhPZihub2RlKTsKICAgICAgcmV0dXJuIHR5cGVWYXJpYWJsZXMucmVnaXN0ZXIoCiAgICAgICAgICBjcmVhdGVUeXBlVmFyaWFibGUoZ2V0Q2xhc3NJbnRlcm5hbChjbHMpLCBub2RlLm5hbWUsIGluZGV4KSwKICAgICAgICAgIG5ldyBLVHlwZVZhcmlhYmxlRGF0YShub2RlKSk7CiAgICB9CiAgICBpZiAobm9kZS5wYXJlbnQgaXMgaXIuRnVuY3Rpb25Ob2RlKSB7CiAgICAgIGlyLkZ1bmN0aW9uTm9kZSBmdW5jID0gbm9kZS5wYXJlbnQ7CiAgICAgIGludCBpbmRleCA9IGZ1bmMudHlwZVBhcmFtZXRlcnMuaW5kZXhPZihub2RlKTsKICAgICAgaWYgKGZ1bmMucGFyZW50IGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgICAgaXIuQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBmdW5jLnBhcmVudDsKICAgICAgICBpci5DbGFzcyBjbHMgPSBjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzczsKICAgICAgICByZXR1cm4gZ2V0VHlwZVZhcmlhYmxlSW50ZXJuYWwoY2xzLnR5cGVQYXJhbWV0ZXJzW2luZGV4XSk7CiAgICAgIH0gZWxzZSBpZiAoZnVuYy5wYXJlbnQgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgICAgaXIuUHJvY2VkdXJlIHByb2NlZHVyZSA9IGZ1bmMucGFyZW50OwogICAgICAgIGlmIChwcm9jZWR1cmUua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLkZhY3RvcnkpIHsKICAgICAgICAgIGlyLkNsYXNzIGNscyA9IHByb2NlZHVyZS5lbmNsb3NpbmdDbGFzczsKICAgICAgICAgIHJldHVybiBnZXRUeXBlVmFyaWFibGVJbnRlcm5hbChjbHMudHlwZVBhcmFtZXRlcnNbaW5kZXhdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHR5cGVWYXJpYWJsZXMucmVnaXN0ZXIoCiAgICAgICAgICAgICAgY3JlYXRlVHlwZVZhcmlhYmxlKAogICAgICAgICAgICAgICAgICBnZXRNZXRob2RJbnRlcm5hbChwcm9jZWR1cmUpLCBub2RlLm5hbWUsIGluZGV4KSwKICAgICAgICAgICAgICBuZXcgS1R5cGVWYXJpYWJsZURhdGEobm9kZSkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmdW5jLnBhcmVudCBpcyBpci5Mb2NhbEZ1bmN0aW9uKSB7CiAgICAgICAgLy8gRW5zdXJlIHRoYXQgbG9jYWwgZnVuY3Rpb24gdHlwZSB2YXJpYWJsZXMgaGF2ZSBiZWVuIGNyZWF0ZWQuCiAgICAgICAgZ2V0TG9jYWxGdW5jdGlvbihmdW5jLnBhcmVudCk7CiAgICAgICAgcmV0dXJuIHR5cGVWYXJpYWJsZU1hcFtub2RlXTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignVW5zdXBwb3J0ZWQgZnVuY3Rpb24gdHlwZSBwYXJhbWV0ZXIgcGFyZW50ICcKICAgICAgICAgICAgJ25vZGUgJHtmdW5jLnBhcmVudH0uJyk7CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVbnN1cHBvcnRlZCB0eXBlIHBhcmFtZXRlciB0eXBlIG5vZGUgJG5vZGUuJyk7CiAgfQoKICBDb25zdHJ1Y3RvckVudGl0eSBnZXRDb25zdHJ1Y3RvckludGVybmFsKGlyLk1lbWJlciBub2RlKSB7CiAgICByZXR1cm4gY29uc3RydWN0b3JNYXBbbm9kZV0gPz89IF9nZXRDb25zdHJ1Y3RvckNyZWF0ZShub2RlKTsKICB9CgogIENvbnN0cnVjdG9yRW50aXR5IF9nZXRDb25zdHJ1Y3RvckNyZWF0ZShpci5NZW1iZXIgbm9kZSkgewogICAgYXNzZXJ0KAogICAgICAgICFlbnZJc0Nsb3NlZCwKICAgICAgICAiRW52aXJvbm1lbnQgb2YgJHRoaXMgaXMgY2xvc2VkLiBUcnlpbmcgdG8gY3JlYXRlICIKICAgICAgICAiY29uc3RydWN0b3IgZm9yICRub2RlLiIpOwogICAgaXIuRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZTsKICAgIENsYXNzRW50aXR5IGVuY2xvc2luZ0NsYXNzID0gZ2V0Q2xhc3NJbnRlcm5hbChub2RlLmVuY2xvc2luZ0NsYXNzKTsKICAgIE5hbWUgbmFtZSA9IGdldE5hbWUobm9kZS5uYW1lKTsKICAgIGJvb2wgaXNFeHRlcm5hbCA9IG5vZGUuaXNFeHRlcm5hbDsKCiAgICBJbmRleGVkQ29uc3RydWN0b3IgY29uc3RydWN0b3I7CiAgICBpZiAobm9kZSBpcyBpci5Db25zdHJ1Y3RvcikgewogICAgICBmdW5jdGlvbk5vZGUgPSBub2RlLmZ1bmN0aW9uOwogICAgICBjb25zdHJ1Y3RvciA9IGNyZWF0ZUdlbmVyYXRpdmVDb25zdHJ1Y3RvcihlbmNsb3NpbmdDbGFzcywgbmFtZSwKICAgICAgICAgIGdldFBhcmFtZXRlclN0cnVjdHVyZShmdW5jdGlvbk5vZGUsIGluY2x1ZGVUeXBlUGFyYW1ldGVyczogZmFsc2UpLAogICAgICAgICAgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCwgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgZnVuY3Rpb25Ob2RlID0gbm9kZS5mdW5jdGlvbjsKICAgICAgYm9vbCBpc0Zyb21FbnZpcm9ubWVudCA9IGlzRXh0ZXJuYWwgJiYKICAgICAgICAgIG5hbWUudGV4dCA9PSAnZnJvbUVudmlyb25tZW50JyAmJgogICAgICAgICAgY29uc3QgWydpbnQnLCAnYm9vbCcsICdTdHJpbmcnXS5jb250YWlucyhlbmNsb3NpbmdDbGFzcy5uYW1lKTsKICAgICAgY29uc3RydWN0b3IgPSBjcmVhdGVGYWN0b3J5Q29uc3RydWN0b3IoZW5jbG9zaW5nQ2xhc3MsIG5hbWUsCiAgICAgICAgICBnZXRQYXJhbWV0ZXJTdHJ1Y3R1cmUoZnVuY3Rpb25Ob2RlLCBpbmNsdWRlVHlwZVBhcmFtZXRlcnM6IGZhbHNlKSwKICAgICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsCiAgICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QsCiAgICAgICAgICBpc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yOiBpc0Zyb21FbnZpcm9ubWVudCk7CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDb252ZXJ0IGBub2RlLmxvY2F0aW9uYCB0byBhIFtTb3VyY2VTcGFuXS4KICAgICAgdGhyb3cgZmFpbGVkQXQoCiAgICAgICAgICBOT19MT0NBVElPTl9TUEFOTkFCTEUsICJVbmV4cGVjdGVkIGNvbnN0cnVjdG9yIG5vZGU6ICR7bm9kZX0uIik7CiAgICB9CiAgICByZXR1cm4gbWVtYmVycy5yZWdpc3RlcjxJbmRleGVkQ29uc3RydWN0b3IsIEtDb25zdHJ1Y3RvckRhdGE+KAogICAgICAgIGNvbnN0cnVjdG9yLCBuZXcgS0NvbnN0cnVjdG9yRGF0YUltcGwobm9kZSwgZnVuY3Rpb25Ob2RlKSk7CiAgfQoKICBGdW5jdGlvbkVudGl0eSBnZXRNZXRob2RJbnRlcm5hbChpci5Qcm9jZWR1cmUgbm9kZSkgewogICAgLy8gW19nZXRNZXRob2RDcmVhdGVdIGluc2VydHMgdGhlIGNyZWF0ZWQgZnVuY3Rpb24gaW4gW21ldGhvZE1hcF0gc28gd2UKICAgIC8vIGRvbid0IG5lZWQgdG8gdXNlID8/PSBoZXJlLgogICAgcmV0dXJuIG1ldGhvZE1hcFtub2RlXSA/PyBfZ2V0TWV0aG9kQ3JlYXRlKG5vZGUpOwogIH0KCiAgRnVuY3Rpb25FbnRpdHkgX2dldE1ldGhvZENyZWF0ZShpci5Qcm9jZWR1cmUgbm9kZSkgewogICAgYXNzZXJ0KAogICAgICAgICFlbnZJc0Nsb3NlZCwKICAgICAgICAiRW52aXJvbm1lbnQgb2YgJHRoaXMgaXMgY2xvc2VkLiBUcnlpbmcgdG8gY3JlYXRlICIKICAgICAgICAiZnVuY3Rpb24gZm9yICRub2RlLiIpOwogICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb247CiAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnk7CiAgICBDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzczsKICAgIGlmIChub2RlLmVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgICAgZW5jbG9zaW5nQ2xhc3MgPSBnZXRDbGFzc0ludGVybmFsKG5vZGUuZW5jbG9zaW5nQ2xhc3MpOwogICAgICBsaWJyYXJ5ID0gZW5jbG9zaW5nQ2xhc3MubGlicmFyeTsKICAgIH0gZWxzZSB7CiAgICAgIGxpYnJhcnkgPSBnZXRMaWJyYXJ5SW50ZXJuYWwobm9kZS5lbmNsb3NpbmdMaWJyYXJ5KTsKICAgIH0KICAgIE5hbWUgbmFtZSA9IGdldE5hbWUobm9kZS5uYW1lKTsKICAgIGJvb2wgaXNTdGF0aWMgPSBub2RlLmlzU3RhdGljOwogICAgYm9vbCBpc0V4dGVybmFsID0gbm9kZS5pc0V4dGVybmFsOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIGAmJiAhbm9kZS5pc0V4dGVybmFsYCB3aGVuICMzMTIzMyBpcyBmaXhlZC4KICAgIGJvb2wgaXNBYnN0cmFjdCA9IG5vZGUuaXNBYnN0cmFjdCAmJiAhbm9kZS5pc0V4dGVybmFsOwogICAgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIgPSBnZXRBc3luY01hcmtlcihub2RlLmZ1bmN0aW9uKTsKICAgIHN3aXRjaCAobm9kZS5raW5kKSB7CiAgICAgIGNhc2UgaXIuUHJvY2VkdXJlS2luZC5GYWN0b3J5OgogICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY3JlYXRlIG1ldGhvZCBmcm9tIGZhY3RvcnkuIik7CiAgICAgIGNhc2UgaXIuUHJvY2VkdXJlS2luZC5HZXR0ZXI6CiAgICAgICAgZnVuY3Rpb24gPSBjcmVhdGVHZXR0ZXIobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsIGFzeW5jTWFya2VyLAogICAgICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQWJzdHJhY3Q6IGlzQWJzdHJhY3QpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIGlyLlByb2NlZHVyZUtpbmQuTWV0aG9kOgogICAgICBjYXNlIGlyLlByb2NlZHVyZUtpbmQuT3BlcmF0b3I6CiAgICAgICAgZnVuY3Rpb24gPSBjcmVhdGVNZXRob2QobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsCiAgICAgICAgICAgIGdldFBhcmFtZXRlclN0cnVjdHVyZShub2RlLmZ1bmN0aW9uKSwgYXN5bmNNYXJrZXIsCiAgICAgICAgICAgIGlzU3RhdGljOiBpc1N0YXRpYywgaXNFeHRlcm5hbDogaXNFeHRlcm5hbCwgaXNBYnN0cmFjdDogaXNBYnN0cmFjdCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgaXIuUHJvY2VkdXJlS2luZC5TZXR0ZXI6CiAgICAgICAgYXNzZXJ0KGFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLlNZTkMpOwogICAgICAgIGZ1bmN0aW9uID0gY3JlYXRlU2V0dGVyKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLnNldHRlciwKICAgICAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0V4dGVybmFsOiBpc0V4dGVybmFsLCBpc0Fic3RyYWN0OiBpc0Fic3RyYWN0KTsKICAgICAgICBicmVhazsKICAgIH0KICAgIG1lbWJlcnMucmVnaXN0ZXI8SW5kZXhlZEZ1bmN0aW9uLCBLRnVuY3Rpb25EYXRhPigKICAgICAgICBmdW5jdGlvbiwgbmV3IEtGdW5jdGlvbkRhdGFJbXBsKG5vZGUsIG5vZGUuZnVuY3Rpb24pKTsKICAgIC8vIFdlIG5lZWQgdG8gcmVnaXN0ZXIgdGhlIGZ1bmN0aW9uIGJlZm9yZSBjcmVhdGluZyB0aGUgdHlwZSB2YXJpYWJsZXMuCiAgICBtZXRob2RNYXBbbm9kZV0gPSBmdW5jdGlvbjsKICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIG5vZGUuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMpIHsKICAgICAgZ2V0VHlwZVZhcmlhYmxlKHR5cGVQYXJhbWV0ZXIpOwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uOwogIH0KCiAgRmllbGRFbnRpdHkgZ2V0RmllbGRJbnRlcm5hbChpci5GaWVsZCBub2RlKSB7CiAgICByZXR1cm4gZmllbGRNYXBbbm9kZV0gPz89IF9nZXRGaWVsZENyZWF0ZShub2RlKTsKICB9CgogIEZpZWxkRW50aXR5IF9nZXRGaWVsZENyZWF0ZShpci5GaWVsZCBub2RlKSB7CiAgICBhc3NlcnQoCiAgICAgICAgIWVudklzQ2xvc2VkLAogICAgICAgICJFbnZpcm9ubWVudCBvZiAkdGhpcyBpcyBjbG9zZWQuIFRyeWluZyB0byBjcmVhdGUgIgogICAgICAgICJmaWVsZCBmb3IgJG5vZGUuIik7CiAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnk7CiAgICBDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzczsKICAgIGlmIChub2RlLmVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgICAgZW5jbG9zaW5nQ2xhc3MgPSBnZXRDbGFzc0ludGVybmFsKG5vZGUuZW5jbG9zaW5nQ2xhc3MpOwogICAgICBsaWJyYXJ5ID0gZW5jbG9zaW5nQ2xhc3MubGlicmFyeTsKICAgIH0gZWxzZSB7CiAgICAgIGxpYnJhcnkgPSBnZXRMaWJyYXJ5SW50ZXJuYWwobm9kZS5lbmNsb3NpbmdMaWJyYXJ5KTsKICAgIH0KICAgIE5hbWUgbmFtZSA9IGdldE5hbWUobm9kZS5uYW1lKTsKICAgIGJvb2wgaXNTdGF0aWMgPSBub2RlLmlzU3RhdGljOwogICAgSW5kZXhlZEZpZWxkIGZpZWxkID0gY3JlYXRlRmllbGQobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsCiAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLAogICAgICAgIGlzQXNzaWduYWJsZTogbm9kZS5pc011dGFibGUsCiAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICAgIHJldHVybiBtZW1iZXJzLnJlZ2lzdGVyPEluZGV4ZWRGaWVsZCwgS0ZpZWxkRGF0YT4oCiAgICAgICAgZmllbGQsIG5ldyBLRmllbGREYXRhSW1wbChub2RlKSk7CiAgfQoKICBib29sIGNoZWNrRmFtaWx5KEVudGl0eSBlbnRpdHkpIHsKICAgIGFzc2VydCgKICAgICAgICAnJGVudGl0eScuc3RhcnRzV2l0aChrRWxlbWVudFByZWZpeCksCiAgICAgICAgZmFpbGVkQXQoZW50aXR5LAogICAgICAgICAgICAiVW5leHBlY3RlZCBlbnRpdHkgJGVudGl0eSwgZXhwZWN0ZWQgZmFtaWx5ICRrRWxlbWVudFByZWZpeC4iKSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBOYXRpdmVCYXNpY0RhdGEgaXMgbmVlZCBmb3IgY29tcHV0YXRpb24gb2YgdGhlIGRlZmF1bHQgc3VwZXIgY2xhc3MuCiAgQG92ZXJyaWRlCiAgTmF0aXZlQmFzaWNEYXRhIGdldCBuYXRpdmVCYXNpY0RhdGEgPT4gX2Zyb250ZW5kU3RyYXRlZ3kubmF0aXZlQmFzaWNEYXRhOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZENvbXBvbmVudChpci5Db21wb25lbnQgY29tcG9uZW50KSB7CiAgICBlbnYuYWRkQ29tcG9uZW50KGNvbXBvbmVudCk7CiAgfQoKICBCZWhhdmlvckJ1aWxkZXIgZ2V0IG5hdGl2ZUJlaGF2aW9yQnVpbGRlciA9PgogICAgICBfbmF0aXZlQmVoYXZpb3JCdWlsZGVyID8/PSBuZXcgS2VybmVsQmVoYXZpb3JCdWlsZGVyKGVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICAgIGNvbW1vbkVsZW1lbnRzLCBuYXRpdmVCYXNpY0RhdGEsIHJlcG9ydGVyLCBvcHRpb25zKTsKCiAgUmVzb2x1dGlvbkltcGFjdCBjb21wdXRlV29ybGRJbXBhY3QoS01lbWJlciBtZW1iZXIsCiAgICAgIFZhcmlhYmxlU2NvcGVNb2RlbCB2YXJpYWJsZVNjb3BlTW9kZWwsIFNldDxQcmFnbWFBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucywKICAgICAge0ltcGFjdEJ1aWxkZXJEYXRhIGltcGFjdEJ1aWxkZXJEYXRhfSkgewogICAgS01lbWJlckRhdGEgbWVtYmVyRGF0YSA9IG1lbWJlcnMuZ2V0RGF0YShtZW1iZXIpOwogICAgaXIuTWVtYmVyIG5vZGUgPSBtZW1iZXJEYXRhLm5vZGU7CgogICAgaWYgKGltcGFjdEJ1aWxkZXJEYXRhICE9IG51bGwpIHsKICAgICAgaWYgKGltcGFjdEJ1aWxkZXJEYXRhLnR5cGVNYXBzRm9yVGVzdGluZyAhPSBudWxsKSB7CiAgICAgICAgdHlwZU1hcHNGb3JUZXN0aW5nID8/PSB7fTsKICAgICAgICB0eXBlTWFwc0ZvclRlc3RpbmdbbWVtYmVyXSA9IGltcGFjdEJ1aWxkZXJEYXRhLnR5cGVNYXBzRm9yVGVzdGluZzsKICAgICAgfQogICAgICBJbXBhY3REYXRhIGltcGFjdERhdGEgPSBpbXBhY3RCdWlsZGVyRGF0YS5pbXBhY3REYXRhOwogICAgICBtZW1iZXJEYXRhLnN0YXRpY1R5cGVzID0gaW1wYWN0QnVpbGRlckRhdGEuY2FjaGVkU3RhdGljVHlwZXM7CiAgICAgIEtlcm5lbEltcGFjdENvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgS2VybmVsSW1wYWN0Q29udmVydGVyKAogICAgICAgICAgdGhpcywgbWVtYmVyLCByZXBvcnRlciwgb3B0aW9ucywgX2NvbnN0YW50VmFsdWVmaWVyKTsKICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0KGltcGFjdERhdGEpOwogICAgfSBlbHNlIHsKICAgICAgS2VybmVsSW1wYWN0QnVpbGRlciBidWlsZGVyID0gbmV3IEtlcm5lbEltcGFjdEJ1aWxkZXIoCiAgICAgICAgICB0aGlzLAogICAgICAgICAgbWVtYmVyLAogICAgICAgICAgcmVwb3J0ZXIsCiAgICAgICAgICBvcHRpb25zLAogICAgICAgICAgdmFyaWFibGVTY29wZU1vZGVsLAogICAgICAgICAgYW5ub3RhdGlvbnMsCiAgICAgICAgICBfY29uc3RhbnRWYWx1ZWZpZXIpOwogICAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgICB0eXBlTWFwc0ZvclRlc3RpbmcgPz89IHt9OwogICAgICAgIHR5cGVNYXBzRm9yVGVzdGluZ1ttZW1iZXJdID0gYnVpbGRlci50eXBlTWFwc0ZvclRlc3RpbmcgPSB7fTsKICAgICAgfQogICAgICBub2RlLmFjY2VwdChidWlsZGVyKTsKICAgICAgbWVtYmVyRGF0YS5zdGF0aWNUeXBlcyA9IGJ1aWxkZXIuZ2V0U3RhdGljVHlwZUNhY2hlKCk7CiAgICAgIHJldHVybiBidWlsZGVyLmltcGFjdEJ1aWxkZXI7CiAgICB9CiAgfQoKICBTdGF0aWNUeXBlQ2FjaGUgZ2V0Q2FjaGVkU3RhdGljVHlwZXMoS01lbWJlciBtZW1iZXIpIHsKICAgIFN0YXRpY1R5cGVDYWNoZSBzdGF0aWNUeXBlcyA9IG1lbWJlcnMuZ2V0RGF0YShtZW1iZXIpLnN0YXRpY1R5cGVzOwogICAgYXNzZXJ0KHN0YXRpY1R5cGVzICE9IG51bGwsICJObyBzdGF0aWMgdHlwZXMgY2FjaGVkIGZvciAkbWVtYmVyLiIpOwogICAgcmV0dXJuIHN0YXRpY1R5cGVzOwogIH0KCiAgTWFwPGlyLkV4cHJlc3Npb24sIFR5cGVNYXA+IGdldFR5cGVNYXBzRm9yVGVzdGluZyhLTWVtYmVyIG1lbWJlcikgewogICAgcmV0dXJuIHR5cGVNYXBzRm9yVGVzdGluZ1ttZW1iZXJdOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGtlcm5lbCBbaXIuUHJvY2VkdXJlXSBub2RlIGZvciB0aGUgW21ldGhvZF0uCiAgaXIuUHJvY2VkdXJlIF9sb29rdXBQcm9jZWR1cmUoS0Z1bmN0aW9uIG1ldGhvZCkgewogICAgcmV0dXJuIG1lbWJlcnMuZ2V0RGF0YShtZXRob2QpLm5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5MaWJyYXJ5IGdldExpYnJhcnlOb2RlKExpYnJhcnlFbnRpdHkgbGlicmFyeSkgewogICAgcmV0dXJuIGxpYnJhcmllcy5nZXREYXRhKGxpYnJhcnkpLmxpYnJhcnk7CiAgfQoKICBAb3ZlcnJpZGUKICBMb2NhbCBnZXRMb2NhbEZ1bmN0aW9uKGlyLkxvY2FsRnVuY3Rpb24gbm9kZSkgewogICAgS0xvY2FsRnVuY3Rpb24gbG9jYWxGdW5jdGlvbiA9IGxvY2FsRnVuY3Rpb25NYXBbbm9kZV07CiAgICBpZiAobG9jYWxGdW5jdGlvbiA9PSBudWxsKSB7CiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXJDb250ZXh0OwogICAgICBFbnRpdHkgZXhlY3V0YWJsZUNvbnRleHQ7CiAgICAgIGlyLlRyZWVOb2RlIHBhcmVudCA9IG5vZGUucGFyZW50OwogICAgICB3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKICAgICAgICBpZiAocGFyZW50IGlzIGlyLk1lbWJlcikgewogICAgICAgICAgZXhlY3V0YWJsZUNvbnRleHQgPSBtZW1iZXJDb250ZXh0ID0gZ2V0TWVtYmVyKHBhcmVudCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcmVudCBpcyBpci5Mb2NhbEZ1bmN0aW9uKSB7CiAgICAgICAgICBLTG9jYWxGdW5jdGlvbiBsb2NhbEZ1bmN0aW9uID0gZ2V0TG9jYWxGdW5jdGlvbihwYXJlbnQpOwogICAgICAgICAgZXhlY3V0YWJsZUNvbnRleHQgPSBsb2NhbEZ1bmN0aW9uOwogICAgICAgICAgbWVtYmVyQ29udGV4dCA9IGxvY2FsRnVuY3Rpb24ubWVtYmVyQ29udGV4dDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50OwogICAgICB9CiAgICAgIFN0cmluZyBuYW1lOwogICAgICBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb247CiAgICAgIGlmIChub2RlIGlzIGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgICBuYW1lID0gbm9kZS52YXJpYWJsZS5uYW1lOwogICAgICAgIGZ1bmN0aW9uID0gbm9kZS5mdW5jdGlvbjsKICAgICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLkZ1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICAgIGZ1bmN0aW9uID0gbm9kZS5mdW5jdGlvbjsKICAgICAgfQogICAgICBsb2NhbEZ1bmN0aW9uID0gbG9jYWxGdW5jdGlvbk1hcFtub2RlXSA9CiAgICAgICAgICBuZXcgS0xvY2FsRnVuY3Rpb24obmFtZSwgbWVtYmVyQ29udGV4dCwgZXhlY3V0YWJsZUNvbnRleHQsIG5vZGUpOwogICAgICBpbnQgaW5kZXggPSAwOwogICAgICBMaXN0PEtMb2NhbFR5cGVWYXJpYWJsZT4gdHlwZVZhcmlhYmxlcyA9IDxLTG9jYWxUeXBlVmFyaWFibGU+W107CiAgICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgdHlwZVZhcmlhYmxlcy5hZGQodHlwZVZhcmlhYmxlTWFwW3R5cGVQYXJhbWV0ZXJdID0KICAgICAgICAgICAgbmV3IEtMb2NhbFR5cGVWYXJpYWJsZShsb2NhbEZ1bmN0aW9uLCB0eXBlUGFyYW1ldGVyLm5hbWUsIGluZGV4KSk7CiAgICAgICAgaW5kZXgrKzsKICAgICAgfQogICAgICBpbmRleCA9IDA7CiAgICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgdHlwZVZhcmlhYmxlc1tpbmRleF0uYm91bmQgPSBnZXREYXJ0VHlwZSh0eXBlUGFyYW1ldGVyLmJvdW5kKTsKICAgICAgICB0eXBlVmFyaWFibGVzW2luZGV4XS5kZWZhdWx0VHlwZSA9CiAgICAgICAgICAgIGdldERhcnRUeXBlKHR5cGVQYXJhbWV0ZXIuZGVmYXVsdFR5cGUpOwogICAgICAgIGluZGV4Kys7CiAgICAgIH0KICAgICAgbG9jYWxGdW5jdGlvbi5mdW5jdGlvblR5cGUgPSBnZXRGdW5jdGlvblR5cGUoZnVuY3Rpb24pOwogICAgfQogICAgcmV0dXJuIGxvY2FsRnVuY3Rpb247CiAgfQoKICBib29sIF9pbXBsZW1lbnRzRnVuY3Rpb24oSW5kZXhlZENsYXNzIGNscykgewogICAgYXNzZXJ0KGNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBkYXRhID0gY2xhc3Nlcy5nZXREYXRhKGNscyk7CiAgICBPcmRlcmVkVHlwZVNldCBvcmRlcmVkVHlwZVNldCA9IGRhdGEub3JkZXJlZFR5cGVTZXQ7CiAgICBJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSA9IG9yZGVyZWRUeXBlU2V0LmFzSW5zdGFuY2VPZigKICAgICAgICBjb21tb25FbGVtZW50cy5mdW5jdGlvbkNsYXNzLAogICAgICAgIGdldEhpZXJhcmNoeURlcHRoKGNvbW1vbkVsZW1lbnRzLmZ1bmN0aW9uQ2xhc3MpKTsKICAgIGlmIChzdXBlcnR5cGUgIT0gbnVsbCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBkYXRhLmNhbGxUeXBlIGlzIEZ1bmN0aW9uVHlwZTsKICB9CgogIEBvdmVycmlkZQogIGlyLlR5cGVkZWYgZ2V0VHlwZWRlZk5vZGUoVHlwZWRlZkVudGl0eSB0eXBlZGVmKSB7CiAgICByZXR1cm4gX2dldFR5cGVkZWZOb2RlKHR5cGVkZWYpOwogIH0KCiAgQG92ZXJyaWRlCiAgRm9yZWlnbktpbmQgZ2V0Rm9yZWlnbktpbmQoaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBpZiAoY29tbW9uRWxlbWVudHMuaXNGb3JlaWduSGVscGVyKGdldE1lbWJlcihub2RlLnRhcmdldCkpKSB7CiAgICAgIHN3aXRjaCAobm9kZS50YXJnZXQubmFtZS5uYW1lKSB7CiAgICAgICAgY2FzZSBJZGVudGlmaWVycy5KUzoKICAgICAgICAgIHJldHVybiBGb3JlaWduS2luZC5KUzsKICAgICAgICBjYXNlIElkZW50aWZpZXJzLkpTX0JVSUxUSU46CiAgICAgICAgICByZXR1cm4gRm9yZWlnbktpbmQuSlNfQlVJTFRJTjsKICAgICAgICBjYXNlIElkZW50aWZpZXJzLkpTX0VNQkVEREVEX0dMT0JBTDoKICAgICAgICAgIHJldHVybiBGb3JlaWduS2luZC5KU19FTUJFRERFRF9HTE9CQUw7CiAgICAgICAgY2FzZSBJZGVudGlmaWVycy5KU19JTlRFUkNFUFRPUl9DT05TVEFOVDoKICAgICAgICAgIHJldHVybiBGb3JlaWduS2luZC5KU19JTlRFUkNFUFRPUl9DT05TVEFOVDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIEZvcmVpZ25LaW5kLk5PTkU7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldEludGVyZmFjZVR5cGVGb3JKc0ludGVyY2VwdG9yQ2FsbChpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCAhPSAxIHx8CiAgICAgICAgbm9kZS5hcmd1bWVudHMubmFtZWQuaXNOb3RFbXB0eSkgewogICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgIE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KU19JTlRFUkNFUFRPUl9DT05TVEFOVCk7CiAgICB9CiAgICBpci5Ob2RlIGFyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5maXJzdDsKICAgIGlmIChhcmd1bWVudCBpcyBpci5UeXBlTGl0ZXJhbCAmJiBhcmd1bWVudC50eXBlIGlzIGlyLkludGVyZmFjZVR5cGUpIHsKICAgICAgcmV0dXJuIGdldEludGVyZmFjZVR5cGUoYXJndW1lbnQudHlwZSk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENhY2hlIHRoaXMgZm9yIGxhdGVyIHVzZS4KICBAb3ZlcnJpZGUKICBOYXRpdmVCZWhhdmlvciBnZXROYXRpdmVCZWhhdmlvckZvckZpZWxkTG9hZChpci5GaWVsZCBmaWVsZCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMsIEl0ZXJhYmxlPFN0cmluZz4gcmV0dXJuc0Fubm90YXRpb25zLAogICAgICB7Ym9vbCBpc0pzSW50ZXJvcH0pIHsKICAgIERhcnRUeXBlIHR5cGUgPSBnZXREYXJ0VHlwZShmaWVsZC50eXBlKTsKICAgIHJldHVybiBuYXRpdmVCZWhhdmlvckJ1aWxkZXIuYnVpbGRGaWVsZExvYWRCZWhhdmlvcih0eXBlLAogICAgICAgIGNyZWF0ZXNBbm5vdGF0aW9ucywgcmV0dXJuc0Fubm90YXRpb25zLCB0eXBlTG9va3VwKHJlc29sdmVBc1JhdzogZmFsc2UpLAogICAgICAgIGlzSnNJbnRlcm9wOiBpc0pzSW50ZXJvcCk7CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDYWNoZSB0aGlzIGZvciBsYXRlciB1c2UuCiAgQG92ZXJyaWRlCiAgTmF0aXZlQmVoYXZpb3IgZ2V0TmF0aXZlQmVoYXZpb3JGb3JGaWVsZFN0b3JlKGlyLkZpZWxkIGZpZWxkKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gZ2V0RGFydFR5cGUoZmllbGQudHlwZSk7CiAgICByZXR1cm4gbmF0aXZlQmVoYXZpb3JCdWlsZGVyLmJ1aWxkRmllbGRTdG9yZUJlaGF2aW9yKHR5cGUpOwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2FjaGUgdGhpcyBmb3IgbGF0ZXIgdXNlLgogIEBvdmVycmlkZQogIE5hdGl2ZUJlaGF2aW9yIGdldE5hdGl2ZUJlaGF2aW9yRm9yTWV0aG9kKGlyLk1lbWJlciBtZW1iZXIsCiAgICAgIEl0ZXJhYmxlPFN0cmluZz4gY3JlYXRlc0Fubm90YXRpb25zLCBJdGVyYWJsZTxTdHJpbmc+IHJldHVybnNBbm5vdGF0aW9ucywKICAgICAge2Jvb2wgaXNKc0ludGVyb3B9KSB7CiAgICBEYXJ0VHlwZSB0eXBlOwogICAgaWYgKG1lbWJlciBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgdHlwZSA9IGdldEZ1bmN0aW9uVHlwZShtZW1iZXIuZnVuY3Rpb24pOwogICAgfSBlbHNlIGlmIChtZW1iZXIgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgdHlwZSA9IGdldEZ1bmN0aW9uVHlwZShtZW1iZXIuZnVuY3Rpb24pOwogICAgfSBlbHNlIHsKICAgICAgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwgIlVuZXhwZWN0ZWQgbWV0aG9kIG5vZGUgJG1lbWJlci4iKTsKICAgIH0KICAgIHJldHVybiBuYXRpdmVCZWhhdmlvckJ1aWxkZXIuYnVpbGRNZXRob2RCZWhhdmlvcih0eXBlLCBjcmVhdGVzQW5ub3RhdGlvbnMsCiAgICAgICAgcmV0dXJuc0Fubm90YXRpb25zLCB0eXBlTG9va3VwKHJlc29sdmVBc1JhdzogZmFsc2UpLAogICAgICAgIGlzSnNJbnRlcm9wOiBpc0pzSW50ZXJvcCk7CiAgfQoKICBJbmRleGVkTGlicmFyeSBjcmVhdGVMaWJyYXJ5KFN0cmluZyBuYW1lLCBVcmkgY2Fub25pY2FsVXJpKSB7CiAgICByZXR1cm4gbmV3IEtMaWJyYXJ5KG5hbWUsIGNhbm9uaWNhbFVyaSk7CiAgfQoKICBJbmRleGVkQ2xhc3MgY3JlYXRlQ2xhc3MoTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgaXNBYnN0cmFjdH0pIHsKICAgIHJldHVybiBuZXcgS0NsYXNzKGxpYnJhcnksIG5hbWUsIGlzQWJzdHJhY3Q6IGlzQWJzdHJhY3QpOwogIH0KCiAgSW5kZXhlZFR5cGVkZWYgY3JlYXRlVHlwZWRlZihMaWJyYXJ5RW50aXR5IGxpYnJhcnksIFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gbmV3IEtUeXBlZGVmKGxpYnJhcnksIG5hbWUpOwogIH0KCiAgVHlwZVZhcmlhYmxlRW50aXR5IGNyZWF0ZVR5cGVWYXJpYWJsZSgKICAgICAgRW50aXR5IHR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIGludCBpbmRleCkgewogICAgcmV0dXJuIG5ldyBLVHlwZVZhcmlhYmxlKHR5cGVEZWNsYXJhdGlvbiwgbmFtZSwgaW5kZXgpOwogIH0KCiAgSW5kZXhlZENvbnN0cnVjdG9yIGNyZWF0ZUdlbmVyYXRpdmVDb25zdHJ1Y3RvcihDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzcywKICAgICAgTmFtZSBuYW1lLCBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlLAogICAgICB7Ym9vbCBpc0V4dGVybmFsLCBib29sIGlzQ29uc3R9KSB7CiAgICByZXR1cm4gbmV3IEtHZW5lcmF0aXZlQ29uc3RydWN0b3IoZW5jbG9zaW5nQ2xhc3MsIG5hbWUsIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICBpc0V4dGVybmFsOiBpc0V4dGVybmFsLCBpc0NvbnN0OiBpc0NvbnN0KTsKICB9CgogIEluZGV4ZWRDb25zdHJ1Y3RvciBjcmVhdGVGYWN0b3J5Q29uc3RydWN0b3IoQ2xhc3NFbnRpdHkgZW5jbG9zaW5nQ2xhc3MsCiAgICAgIE5hbWUgbmFtZSwgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAge2Jvb2wgaXNFeHRlcm5hbCwgYm9vbCBpc0NvbnN0LCBib29sIGlzRnJvbUVudmlyb25tZW50Q29uc3RydWN0b3J9KSB7CiAgICByZXR1cm4gbmV3IEtGYWN0b3J5Q29uc3RydWN0b3IoZW5jbG9zaW5nQ2xhc3MsIG5hbWUsIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgICBpc0V4dGVybmFsOiBpc0V4dGVybmFsLAogICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QsCiAgICAgICAgaXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3RvcjogaXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3Rvcik7CiAgfQoKICBJbmRleGVkRnVuY3Rpb24gY3JlYXRlR2V0dGVyKExpYnJhcnlFbnRpdHkgbGlicmFyeSwKICAgICAgQ2xhc3NFbnRpdHkgZW5jbG9zaW5nQ2xhc3MsIE5hbWUgbmFtZSwgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIsCiAgICAgIHtib29sIGlzU3RhdGljLCBib29sIGlzRXh0ZXJuYWwsIGJvb2wgaXNBYnN0cmFjdH0pIHsKICAgIHJldHVybiBuZXcgS0dldHRlcihsaWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgbmFtZSwgYXN5bmNNYXJrZXIsCiAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0V4dGVybmFsOiBpc0V4dGVybmFsLCBpc0Fic3RyYWN0OiBpc0Fic3RyYWN0KTsKICB9CgogIEluZGV4ZWRGdW5jdGlvbiBjcmVhdGVNZXRob2QoCiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSwKICAgICAgQ2xhc3NFbnRpdHkgZW5jbG9zaW5nQ2xhc3MsCiAgICAgIE5hbWUgbmFtZSwKICAgICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSwKICAgICAgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIsCiAgICAgIHtib29sIGlzU3RhdGljLAogICAgICBib29sIGlzRXh0ZXJuYWwsCiAgICAgIGJvb2wgaXNBYnN0cmFjdH0pIHsKICAgIHJldHVybiBuZXcgS01ldGhvZCgKICAgICAgICBsaWJyYXJ5LCBlbmNsb3NpbmdDbGFzcywgbmFtZSwgcGFyYW1ldGVyU3RydWN0dXJlLCBhc3luY01hcmtlciwKICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsIGlzQWJzdHJhY3Q6IGlzQWJzdHJhY3QpOwogIH0KCiAgSW5kZXhlZEZ1bmN0aW9uIGNyZWF0ZVNldHRlcigKICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzcywgTmFtZSBuYW1lLAogICAgICB7Ym9vbCBpc1N0YXRpYywgYm9vbCBpc0V4dGVybmFsLCBib29sIGlzQWJzdHJhY3R9KSB7CiAgICByZXR1cm4gbmV3IEtTZXR0ZXIobGlicmFyeSwgZW5jbG9zaW5nQ2xhc3MsIG5hbWUsCiAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLCBpc0V4dGVybmFsOiBpc0V4dGVybmFsLCBpc0Fic3RyYWN0OiBpc0Fic3RyYWN0KTsKICB9CgogIEluZGV4ZWRGaWVsZCBjcmVhdGVGaWVsZCgKICAgICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBDbGFzc0VudGl0eSBlbmNsb3NpbmdDbGFzcywgTmFtZSBuYW1lLAogICAgICB7Ym9vbCBpc1N0YXRpYywgYm9vbCBpc0Fzc2lnbmFibGUsIGJvb2wgaXNDb25zdH0pIHsKICAgIHJldHVybiBuZXcgS0ZpZWxkKGxpYnJhcnksIGVuY2xvc2luZ0NsYXNzLCBuYW1lLAogICAgICAgIGlzU3RhdGljOiBpc1N0YXRpYywgaXNBc3NpZ25hYmxlOiBpc0Fzc2lnbmFibGUsIGlzQ29uc3Q6IGlzQ29uc3QpOwogIH0KfQoKY2xhc3MgS2VybmVsRWxlbWVudEVudmlyb25tZW50IGV4dGVuZHMgRWxlbWVudEVudmlyb25tZW50CiAgICBpbXBsZW1lbnRzIEtFbGVtZW50RW52aXJvbm1lbnQgewogIGZpbmFsIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgZWxlbWVudE1hcDsKCiAgS2VybmVsRWxlbWVudEVudmlyb25tZW50KHRoaXMuZWxlbWVudE1hcCk7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldCBkeW5hbWljVHlwZSA9PiBjb25zdCBEeW5hbWljVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RW50aXR5IGdldCBtYWluTGlicmFyeSA9PiBlbGVtZW50TWFwLl9tYWluTGlicmFyeTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IG1haW5GdW5jdGlvbiA9PiBlbGVtZW50TWFwLl9tYWluRnVuY3Rpb247CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPExpYnJhcnlFbnRpdHk+IGdldCBsaWJyYXJpZXMgPT4gZWxlbWVudE1hcC5saWJyYXJ5TGlzdEludGVybmFsOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5fZ2V0TGlicmFyeU5hbWUobGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldFRoaXNUeXBlKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0VGhpc1R5cGUoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0UmF3VHlwZShDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9nZXRSYXdUeXBlKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzR2VuZXJpY0NsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGdldFRoaXNUeXBlKGNscykudHlwZUFyZ3VtZW50cy5pc05vdEVtcHR5OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc01peGluQXBwbGljYXRpb24oQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5faXNNaXhpbkFwcGxpY2F0aW9uKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVW5uYW1lZE1peGluQXBwbGljYXRpb24oQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5faXNVbm5hbWVkTWl4aW5BcHBsaWNhdGlvbihjbHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0VHlwZVZhcmlhYmxlQm91bmQoVHlwZVZhcmlhYmxlRW50aXR5IHR5cGVWYXJpYWJsZSkgewogICAgaWYgKHR5cGVWYXJpYWJsZSBpcyBLTG9jYWxUeXBlVmFyaWFibGUpIHJldHVybiB0eXBlVmFyaWFibGUuYm91bmQ7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRUeXBlVmFyaWFibGVCb3VuZCh0eXBlVmFyaWFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBjcmVhdGVJbnRlcmZhY2VUeXBlKAogICAgICBDbGFzc0VudGl0eSBjbHMsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShjbHMsIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25UeXBlIGdldEZ1bmN0aW9uVHlwZShGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuX2dldEZ1bmN0aW9uVHlwZShmdW5jdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PFR5cGVWYXJpYWJsZVR5cGU+IGdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuX2dldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhmdW5jdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRGaWVsZFR5cGUoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9nZXRGaWVsZFR5cGUoZmllbGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25UeXBlIGdldExvY2FsRnVuY3Rpb25UeXBlKGNvdmFyaWFudCBLTG9jYWxGdW5jdGlvbiBmdW5jdGlvbikgewogICAgcmV0dXJuIGZ1bmN0aW9uLmZ1bmN0aW9uVHlwZTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBnZXRGaWVsZENvbnN0YW50Rm9yVGVzdGluZyhGaWVsZEVudGl0eSBmaWVsZCkgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuX2dldEZpZWxkQ29uc3RhbnRFeHByZXNzaW9uKGZpZWxkKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFVuYWxpYXNlZFR5cGUoRGFydFR5cGUgdHlwZSkgPT4gdHlwZTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3JFbnRpdHkgbG9va3VwQ29uc3RydWN0b3IoQ2xhc3NFbnRpdHkgY2xzLCBTdHJpbmcgbmFtZSwKICAgICAge2Jvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPSBlbGVtZW50TWFwLmxvb2t1cENvbnN0cnVjdG9yKGNscywgbmFtZSk7CiAgICBpZiAoY29uc3RydWN0b3IgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgICB0aHJvdyBmYWlsZWRBdCgKICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAiVGhlIGNvbnN0cnVjdG9yICckbmFtZScgd2FzIG5vdCBmb3VuZCBpbiBjbGFzcyAnJHtjbHMubmFtZX0nICIKICAgICAgICAgICJpbiBsaWJyYXJ5ICR7Y2xzLmxpYnJhcnkuY2Fub25pY2FsVXJpfS4iKTsKICAgIH0KICAgIHJldHVybiBjb25zdHJ1Y3RvcjsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBsb29rdXBMb2NhbENsYXNzTWVtYmVyKENsYXNzRW50aXR5IGNscywgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2UsIGJvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9CiAgICAgICAgZWxlbWVudE1hcC5sb29rdXBDbGFzc01lbWJlcihjbHMsIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICAgIGlmIChtZW1iZXIgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgICB0aHJvdyBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgIlRoZSBtZW1iZXIgJyRuYW1lJyB3YXMgbm90IGZvdW5kIGluICR7Y2xzLm5hbWV9LiIpOwogICAgfQogICAgcmV0dXJuIG1lbWJlcjsKICB9CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldFN1cGVyQ2xhc3MoQ2xhc3NFbnRpdHkgY2xzLAogICAgICB7Ym9vbCBza2lwVW5uYW1lZE1peGluQXBwbGljYXRpb25zOiBmYWxzZX0pIHsKICAgIGFzc2VydChlbGVtZW50TWFwLmNoZWNrRmFtaWx5KGNscykpOwogICAgQ2xhc3NFbnRpdHkgc3VwZXJjbGFzcyA9IGVsZW1lbnRNYXAuZ2V0U3VwZXJUeXBlKGNscyk/LmVsZW1lbnQ7CiAgICBpZiAoc2tpcFVubmFtZWRNaXhpbkFwcGxpY2F0aW9ucykgewogICAgICB3aGlsZSAoc3VwZXJjbGFzcyAhPSBudWxsICYmCiAgICAgICAgICBlbGVtZW50TWFwLl9pc1VubmFtZWRNaXhpbkFwcGxpY2F0aW9uKHN1cGVyY2xhc3MpKSB7CiAgICAgICAgc3VwZXJjbGFzcyA9IGVsZW1lbnRNYXAuZ2V0U3VwZXJUeXBlKHN1cGVyY2xhc3MpPy5lbGVtZW50OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3VwZXJjbGFzczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFN1cGVydHlwZShDbGFzc0VudGl0eSBjbHMsIHZvaWQgZihJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSkpIHsKICAgIGVsZW1lbnRNYXAuX2ZvckVhY2hTdXBlcnR5cGUoY2xzLCBmKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaE1peGluKENsYXNzRW50aXR5IGNscywgdm9pZCBmKENsYXNzRW50aXR5IG1peGluKSkgewogICAgZWxlbWVudE1hcC5fZm9yRWFjaE1peGluKGNscywgZik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hMb2NhbENsYXNzTWVtYmVyKENsYXNzRW50aXR5IGNscywgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIpKSB7CiAgICBlbGVtZW50TWFwLl9mb3JFYWNoTG9jYWxDbGFzc01lbWJlcihjbHMsIGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoQ2xhc3NNZW1iZXIoCiAgICAgIENsYXNzRW50aXR5IGNscywgdm9pZCBmKENsYXNzRW50aXR5IGRlY2xhcmVyLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgZWxlbWVudE1hcC5fZm9yRWFjaENsYXNzTWVtYmVyKGNscywgZik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hDb25zdHJ1Y3RvcigKICAgICAgQ2xhc3NFbnRpdHkgY2xzLCB2b2lkIGYoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpKSB7CiAgICBlbGVtZW50TWFwLl9mb3JFYWNoQ29uc3RydWN0b3IoY2xzLCBmKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaExpYnJhcnlNZW1iZXIoCiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSwgdm9pZCBmKE1lbWJlckVudGl0eSBtZW1iZXIpKSB7CiAgICBlbGVtZW50TWFwLl9mb3JFYWNoTGlicmFyeU1lbWJlcihsaWJyYXJ5LCBmKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBsb29rdXBMaWJyYXJ5TWVtYmVyKExpYnJhcnlFbnRpdHkgbGlicmFyeSwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2UsIGJvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9CiAgICAgICAgZWxlbWVudE1hcC5sb29rdXBMaWJyYXJ5TWVtYmVyKGxpYnJhcnksIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICAgIGlmIChtZW1iZXIgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICAgIlRoZSBtZW1iZXIgJyR7bmFtZX0nIHdhcyBub3QgZm91bmQgaW4gbGlicmFyeSAnJHtsaWJyYXJ5Lm5hbWV9Jy4iKTsKICAgIH0KICAgIHJldHVybiBtZW1iZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBsb29rdXBDbGFzcyhMaWJyYXJ5RW50aXR5IGxpYnJhcnksIFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCByZXF1aXJlZDogZmFsc2V9KSB7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBlbGVtZW50TWFwLmxvb2t1cENsYXNzKGxpYnJhcnksIG5hbWUpOwogICAgaWYgKGNscyA9PSBudWxsICYmIHJlcXVpcmVkKSB7CiAgICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAiVGhlIGNsYXNzICckbmFtZScgIHdhcyBub3QgZm91bmQgaW4gbGlicmFyeSAnJHtsaWJyYXJ5Lm5hbWV9Jy4iKTsKICAgIH0KICAgIHJldHVybiBjbHM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hDbGFzcyhMaWJyYXJ5RW50aXR5IGxpYnJhcnksIHZvaWQgZihDbGFzc0VudGl0eSBjbHMpKSB7CiAgICBlbGVtZW50TWFwLl9mb3JFYWNoQ2xhc3MobGlicmFyeSwgZik7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5RW50aXR5IGxvb2t1cExpYnJhcnkoVXJpIHVyaSwge2Jvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgTGlicmFyeUVudGl0eSBsaWJyYXJ5ID0gZWxlbWVudE1hcC5sb29rdXBMaWJyYXJ5KHVyaSk7CiAgICBpZiAobGlicmFyeSA9PSBudWxsICYmIHJlcXVpcmVkKSB7CiAgICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICJUaGUgbGlicmFyeSAnJHVyaScgd2FzIG5vdCBmb3VuZC4iKTsKICAgIH0KICAgIHJldHVybiBsaWJyYXJ5OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0RlZmVycmVkTG9hZExpYnJhcnlHZXR0ZXIoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgLy8gVGhlIGZyb250LWVuZCBnZW5lcmF0ZXMgdGhlIGdldHRlciBvZiBsb2FkTGlicmFyeSBleHBsaWNpdGx5IGFzIGNvZGUKICAgIC8vIHNvIHRoZXJlIGlzIG5vIGltcGxpY2l0IHJlcHJlc2VudGF0aW9uIGJhc2VkIG9uIGEgImxvYWRMaWJyYXJ5IiBtZW1iZXIuCiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBnZXRMaWJyYXJ5TWV0YWRhdGEoY292YXJpYW50IEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIGFzc2VydChlbGVtZW50TWFwLmNoZWNrRmFtaWx5KGxpYnJhcnkpKTsKICAgIEtMaWJyYXJ5RGF0YSBsaWJyYXJ5RGF0YSA9IGVsZW1lbnRNYXAubGlicmFyaWVzLmdldERhdGEobGlicmFyeSk7CiAgICByZXR1cm4gbGlicmFyeURhdGEuZ2V0TWV0YWRhdGEoZWxlbWVudE1hcCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxJbXBvcnRFbnRpdHk+IGdldEltcG9ydHMoY292YXJpYW50IEluZGV4ZWRMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIGFzc2VydChlbGVtZW50TWFwLmNoZWNrRmFtaWx5KGxpYnJhcnkpKTsKICAgIEtMaWJyYXJ5RGF0YSBsaWJyYXJ5RGF0YSA9IGVsZW1lbnRNYXAubGlicmFyaWVzLmdldERhdGEobGlicmFyeSk7CiAgICByZXR1cm4gbGlicmFyeURhdGEuZ2V0SW1wb3J0cyhlbGVtZW50TWFwKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IGdldENsYXNzTWV0YWRhdGEoY292YXJpYW50IEluZGV4ZWRDbGFzcyBjbHMpIHsKICAgIGFzc2VydChlbGVtZW50TWFwLmNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBjbGFzc0RhdGEgPSBlbGVtZW50TWFwLmNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgcmV0dXJuIGNsYXNzRGF0YS5nZXRNZXRhZGF0YShlbGVtZW50TWFwKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IGdldE1lbWJlck1ldGFkYXRhKGNvdmFyaWFudCBJbmRleGVkTWVtYmVyIG1lbWJlciwKICAgICAge2Jvb2wgaW5jbHVkZVBhcmFtZXRlck1ldGFkYXRhOiBmYWxzZX0pIHsKICAgIC8vIFRPRE8ocmVkZW1wdGlvbik6IFN1cHBvcnQgaW5jbHVkZVBhcmFtZXRlck1ldGFkYXRhLgogICAgYXNzZXJ0KGVsZW1lbnRNYXAuY2hlY2tGYW1pbHkobWVtYmVyKSk7CiAgICBLTWVtYmVyRGF0YSBtZW1iZXJEYXRhID0gZWxlbWVudE1hcC5tZW1iZXJzLmdldERhdGEobWVtYmVyKTsKICAgIHJldHVybiBtZW1iZXJEYXRhLmdldE1ldGFkYXRhKGVsZW1lbnRNYXApOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0VudW1DbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIGFzc2VydChlbGVtZW50TWFwLmNoZWNrRmFtaWx5KGNscykpOwogICAgS0NsYXNzRGF0YSBjbGFzc0RhdGEgPSBlbGVtZW50TWFwLmNsYXNzZXMuZ2V0RGF0YShjbHMpOwogICAgcmV0dXJuIGNsYXNzRGF0YS5pc0VudW1DbGFzczsKICB9Cn0KCi8vLyBbQmVoYXZpb3JCdWlsZGVyXSBmb3Iga2VybmVsIGJhc2VkIGVsZW1lbnRzLgpjbGFzcyBLZXJuZWxCZWhhdmlvckJ1aWxkZXIgZXh0ZW5kcyBCZWhhdmlvckJ1aWxkZXIgewogIEBvdmVycmlkZQogIGZpbmFsIEVsZW1lbnRFbnZpcm9ubWVudCBlbGVtZW50RW52aXJvbm1lbnQ7CiAgQG92ZXJyaWRlCiAgZmluYWwgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHM7CiAgQG92ZXJyaWRlCiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyOwogIEBvdmVycmlkZQogIGZpbmFsIE5hdGl2ZUJhc2ljRGF0YSBuYXRpdmVCYXNpY0RhdGE7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwoKICBLZXJuZWxCZWhhdmlvckJ1aWxkZXIodGhpcy5lbGVtZW50RW52aXJvbm1lbnQsIHRoaXMuY29tbW9uRWxlbWVudHMsCiAgICAgIHRoaXMubmF0aXZlQmFzaWNEYXRhLCB0aGlzLnJlcG9ydGVyLCB0aGlzLl9vcHRpb25zKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgdHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnMgPT4KICAgICAgX29wdGlvbnMudHJ1c3RKU0ludGVyb3BUeXBlQW5ub3RhdGlvbnM7Cn0KCi8vLyBDb25zdGFudCBlbnZpcm9ubWVudCBtYXBwaW5nIFtDb25zdGFudEV4cHJlc3Npb25dcyB0byBbQ29uc3RhbnRWYWx1ZV1zIHVzaW5nCi8vLyBbX0V2YWx1YXRpb25FbnZpcm9ubWVudF0gZm9yIHRoZSBldmFsdWF0aW9uLgpjbGFzcyBLZXJuZWxDb25zdGFudEVudmlyb25tZW50IGltcGxlbWVudHMgQ29uc3RhbnRFbnZpcm9ubWVudCB7CiAgZmluYWwgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBfZWxlbWVudE1hcDsKICBmaW5hbCBFbnZpcm9ubWVudCBfZW52aXJvbm1lbnQ7CgogIE1hcDxDb25zdGFudEV4cHJlc3Npb24sIENvbnN0YW50VmFsdWU+IF92YWx1ZU1hcCA9CiAgICAgIDxDb25zdGFudEV4cHJlc3Npb24sIENvbnN0YW50VmFsdWU+e307CgogIEtlcm5lbENvbnN0YW50RW52aXJvbm1lbnQodGhpcy5fZWxlbWVudE1hcCwgdGhpcy5fZW52aXJvbm1lbnQpOwoKICBDb25zdGFudFZhbHVlIF9nZXRDb25zdGFudFZhbHVlKAogICAgICBTcGFubmFibGUgc3Bhbm5hYmxlLCBDb25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbiwKICAgICAge2Jvb2wgY29uc3RhbnRSZXF1aXJlZCwgYm9vbCBjaGVja0Nhc3RzOiB0cnVlfSkgewogICAgcmV0dXJuIF92YWx1ZU1hcC5wdXRJZkFic2VudChleHByZXNzaW9uLCAoKSB7CiAgICAgIHJldHVybiBleHByZXNzaW9uLmV2YWx1YXRlKG5ldyBLZXJuZWxFdmFsdWF0aW9uRW52aXJvbm1lbnQoCiAgICAgICAgICBfZWxlbWVudE1hcCwgX2Vudmlyb25tZW50LCBzcGFubmFibGUsCiAgICAgICAgICBjb25zdGFudFJlcXVpcmVkOiBjb25zdGFudFJlcXVpcmVkLCBjaGVja0Nhc3RzOiBjaGVja0Nhc3RzKSk7CiAgICB9KTsKICB9Cn0KCi8vLyBFdmFsdWF0aW9uIGVudmlyb25tZW50IHVzZWQgZm9yIGNvbXB1dGluZyBbQ29uc3RhbnRWYWx1ZV1zIGZvcgovLy8ga2VybmVsIGJhc2VkIFtDb25zdGFudEV4cHJlc3Npb25dcy4KY2xhc3MgS2VybmVsRXZhbHVhdGlvbkVudmlyb25tZW50IGV4dGVuZHMgRXZhbHVhdGlvbkVudmlyb25tZW50QmFzZSB7CiAgZmluYWwgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBfZWxlbWVudE1hcDsKICBmaW5hbCBFbnZpcm9ubWVudCBfZW52aXJvbm1lbnQ7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBjaGVja0Nhc3RzOwoKICBLZXJuZWxFdmFsdWF0aW9uRW52aXJvbm1lbnQoCiAgICAgIHRoaXMuX2VsZW1lbnRNYXAsIHRoaXMuX2Vudmlyb25tZW50LCBTcGFubmFibGUgc3Bhbm5hYmxlLAogICAgICB7Ym9vbCBjb25zdGFudFJlcXVpcmVkLCB0aGlzLmNoZWNrQ2FzdHM6IHRydWV9KQogICAgICA6IHN1cGVyKHNwYW5uYWJsZSwgY29uc3RhbnRSZXF1aXJlZDogY29uc3RhbnRSZXF1aXJlZCk7CgogIEBvdmVycmlkZQogIENvbW1vbkVsZW1lbnRzIGdldCBjb21tb25FbGVtZW50cyA9PiBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGVzIGdldCB0eXBlcyA9PiBfZWxlbWVudE1hcC50eXBlczsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgc3Vic3RCeUNvbnRleHQoRGFydFR5cGUgYmFzZSwgSW50ZXJmYWNlVHlwZSB0YXJnZXQpIHsKICAgIHJldHVybiBfZWxlbWVudE1hcC5zdWJzdEJ5Q29udGV4dChiYXNlLCB0YXJnZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRDb25zdHJ1Y3RvciBnZXRDb25zdHJ1Y3RvckNvbnN0YW50KENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yKSB7CiAgICByZXR1cm4gX2VsZW1lbnRNYXAuX2dldENvbnN0cnVjdG9yQ29uc3RhbnQoY29uc3RydWN0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGdldEZpZWxkQ29uc3RhbnQoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgIHJldHVybiBfZWxlbWVudE1hcC5fZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb24oZmllbGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIGdldExvY2FsQ29uc3RhbnQoTG9jYWwgbG9jYWwpIHsKICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoIl9FdmFsdWF0aW9uRW52aXJvbm1lbnQuZ2V0TG9jYWxDb25zdGFudCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHJlYWRGcm9tRW52aXJvbm1lbnQoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBfZW52aXJvbm1lbnQudmFsdWVPZihuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIERpYWdub3N0aWNSZXBvcnRlciBnZXQgcmVwb3J0ZXIgPT4gX2VsZW1lbnRNYXAucmVwb3J0ZXI7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGVuYWJsZUFzc2VydGlvbnMgPT4gX2VsZW1lbnRNYXAub3B0aW9ucy5lbmFibGVVc2VyQXNzZXJ0aW9uczsKfQoKY2xhc3MgS2VybmVsTmF0aXZlTWVtYmVyUmVzb2x2ZXIgaW1wbGVtZW50cyBOYXRpdmVNZW1iZXJSZXNvbHZlciB7CiAgc3RhdGljIGZpbmFsIFJlZ0V4cCBfaWRlbnRpZmllciA9IG5ldyBSZWdFeHAocideW2EtekEtWl8kXVthLXpBLVowLTlfJF0qJCcpOwoKICBmaW5hbCBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIF9lbGVtZW50TWFwOwogIGZpbmFsIE5hdGl2ZUJhc2ljRGF0YSBfbmF0aXZlQmFzaWNEYXRhOwogIGZpbmFsIE5hdGl2ZURhdGFCdWlsZGVyIF9uYXRpdmVEYXRhQnVpbGRlcjsKCiAgS2VybmVsTmF0aXZlTWVtYmVyUmVzb2x2ZXIoCiAgICAgIHRoaXMuX2VsZW1lbnRNYXAsIHRoaXMuX25hdGl2ZUJhc2ljRGF0YSwgdGhpcy5fbmF0aXZlRGF0YUJ1aWxkZXIpOwoKICBLRWxlbWVudEVudmlyb25tZW50IGdldCBfZWxlbWVudEVudmlyb25tZW50ID0+IF9lbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudDsKCiAgQ29tbW9uRWxlbWVudHMgZ2V0IF9jb21tb25FbGVtZW50cyA9PiBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZXNvbHZlTmF0aXZlTWVtYmVyKGlyLk1lbWJlciBub2RlLCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhKSB7CiAgICBib29sIGlzSnNJbnRlcm9wID0gX2lzSnNJbnRlcm9wTWVtYmVyKG5vZGUpOwogICAgaWYgKG5vZGUgaXMgaXIuUHJvY2VkdXJlIHx8IG5vZGUgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyKG5vZGUpOwogICAgICBib29sIGlzTmF0aXZlID0gX3Byb2Nlc3NNZXRob2RBbm5vdGF0aW9ucyhub2RlLCBhbm5vdGF0aW9uRGF0YSk7CiAgICAgIGlmIChpc05hdGl2ZSB8fCBpc0pzSW50ZXJvcCkgewogICAgICAgIE5hdGl2ZUJlaGF2aW9yIGJlaGF2aW9yID0gX2NvbXB1dGVOYXRpdmVNZXRob2RCZWhhdmlvcigKICAgICAgICAgICAgbWV0aG9kLCBhbm5vdGF0aW9uRGF0YSwKICAgICAgICAgICAgaXNKc0ludGVyb3A6IGlzSnNJbnRlcm9wKTsKICAgICAgICBfbmF0aXZlRGF0YUJ1aWxkZXIuc2V0TmF0aXZlTWV0aG9kQmVoYXZpb3IobWV0aG9kLCBiZWhhdmlvcik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobm9kZSBpcyBpci5GaWVsZCkgewogICAgICBGaWVsZEVudGl0eSBmaWVsZCA9IF9lbGVtZW50TWFwLmdldE1lbWJlcihub2RlKTsKICAgICAgYm9vbCBpc05hdGl2ZSA9IF9wcm9jZXNzRmllbGRBbm5vdGF0aW9ucyhub2RlLCBhbm5vdGF0aW9uRGF0YSk7CiAgICAgIGlmIChpc05hdGl2ZSB8fCBpc0pzSW50ZXJvcCkgewogICAgICAgIE5hdGl2ZUJlaGF2aW9yIGZpZWxkTG9hZEJlaGF2aW9yID0gX2NvbXB1dGVOYXRpdmVGaWVsZExvYWRCZWhhdmlvcigKICAgICAgICAgICAgZmllbGQsIGFubm90YXRpb25EYXRhLAogICAgICAgICAgICBpc0pzSW50ZXJvcDogaXNKc0ludGVyb3ApOwogICAgICAgIE5hdGl2ZUJlaGF2aW9yIGZpZWxkU3RvcmVCZWhhdmlvciA9CiAgICAgICAgICAgIF9jb21wdXRlTmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yKGZpZWxkKTsKICAgICAgICBfbmF0aXZlRGF0YUJ1aWxkZXIuc2V0TmF0aXZlRmllbGRMb2FkQmVoYXZpb3IoZmllbGQsIGZpZWxkTG9hZEJlaGF2aW9yKTsKICAgICAgICBfbmF0aXZlRGF0YUJ1aWxkZXIuc2V0TmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yKAogICAgICAgICAgICBmaWVsZCwgZmllbGRTdG9yZUJlaGF2aW9yKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIFByb2Nlc3MgdGhlIHBvdGVudGlhbGx5IG5hdGl2ZSBbZmllbGRdLiBBZGRzIGluZm9ybWF0aW9uIGZyb20gbWV0YWRhdGEKICAvLy8gYXR0cmlidXRlcy4gUmV0dXJucyBgdHJ1ZWAgb2YgW21ldGhvZF0gaXMgbmF0aXZlLgogIGJvb2wgX3Byb2Nlc3NGaWVsZEFubm90YXRpb25zKAogICAgICBpci5GaWVsZCBub2RlLCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhKSB7CiAgICBpZiAobm9kZS5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICAgX25hdGl2ZUJhc2ljRGF0YQogICAgICAgICAgICAuaXNOYXRpdmVDbGFzcyhfZWxlbWVudE1hcC5nZXRDbGFzcyhub2RlLmVuY2xvc2luZ0NsYXNzKSkpIHsKICAgICAgLy8gRXhjbHVkZSBub24taW5zdGFuY2UgKHN0YXRpYykgZmllbGRzIC0gdGhleSBhcmUgbm90IHJlYWxseSBuYXRpdmUgYW5kCiAgICAgIC8vIGFyZSBjb21waWxlZCBhcyBpc29sYXRlIGdsb2JhbHMuICBBY2Nlc3Mgb2YgYSBwcm9wZXJ0eSBvZiBhIGNvbnN0cnVjdG9yCiAgICAgIC8vIGZ1bmN0aW9uIG9yIGEgbm9uLW1ldGhvZCBwcm9wZXJ0eSBpbiB0aGUgcHJvdG90eXBlIGNoYWluLCBtdXN0IGJlIGNvZGVkCiAgICAgIC8vIHVzaW5nIGEgSlMtY2FsbC4KICAgICAgX3NldE5hdGl2ZU5hbWUobm9kZSwgYW5ub3RhdGlvbkRhdGEpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIFN0cmluZyBuYW1lID0gX2ZpbmRKc05hbWVGcm9tQW5ub3RhdGlvbihub2RlLCBhbm5vdGF0aW9uRGF0YSk7CiAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSksCiAgICAgICAgICAgICdASlNOYW1lKC4uLikgYW5ub3RhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBzdGF0aWMgZmllbGRzOiAnCiAgICAgICAgICAgICckbm9kZS4nKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIFByb2Nlc3MgdGhlIHBvdGVudGlhbGx5IG5hdGl2ZSBbbWV0aG9kXS4gQWRkcyBpbmZvcm1hdGlvbiBmcm9tIG1ldGFkYXRhCiAgLy8vIGF0dHJpYnV0ZXMuIFJldHVybnMgYHRydWVgIG9mIFttZXRob2RdIGlzIG5hdGl2ZS4KICBib29sIF9wcm9jZXNzTWV0aG9kQW5ub3RhdGlvbnMoCiAgICAgIGlyLk1lbWJlciBub2RlLCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhKSB7CiAgICBpZiAoX2lzTmF0aXZlTWV0aG9kKG5vZGUsIGFubm90YXRpb25EYXRhKSkgewogICAgICBpZiAobm9kZS5lbmNsb3NpbmdDbGFzcyAhPSBudWxsICYmICFub2RlLmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgICBpZiAoIV9uYXRpdmVCYXNpY0RhdGEKICAgICAgICAgICAgLmlzTmF0aXZlQ2xhc3MoX2VsZW1lbnRNYXAuZ2V0Q2xhc3Mobm9kZS5lbmNsb3NpbmdDbGFzcykpKSB7CiAgICAgICAgICBfZWxlbWVudE1hcC5yZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSksCiAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuTkFUSVZFX05PTl9JTlNUQU5DRV9JTl9OT05fTkFUSVZFX0NMQVNTKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgX3NldE5hdGl2ZU5hbWVGb3JTdGF0aWNNZXRob2Qobm9kZSwgYW5ub3RhdGlvbkRhdGEpOwogICAgICB9IGVsc2UgewogICAgICAgIF9zZXROYXRpdmVOYW1lKG5vZGUsIGFubm90YXRpb25EYXRhKTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vLyBTZXRzIHRoZSBuYXRpdmUgbmFtZSBvZiBbZWxlbWVudF0sIGVpdGhlciBmcm9tIGFuIGFubm90YXRpb24sIG9yCiAgLy8vIGRlZmF1bHRpbmcgdG8gdGhlIERhcnQgbmFtZS4KICB2b2lkIF9zZXROYXRpdmVOYW1lKGlyLk1lbWJlciBub2RlLCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhKSB7CiAgICBTdHJpbmcgbmFtZSA9IF9maW5kSnNOYW1lRnJvbUFubm90YXRpb24obm9kZSwgYW5ub3RhdGlvbkRhdGEpOwogICAgbmFtZSA/Pz0gbm9kZS5uYW1lLm5hbWU7CiAgICBfbmF0aXZlRGF0YUJ1aWxkZXIuc2V0TmF0aXZlTWVtYmVyTmFtZShfZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZSksIG5hbWUpOwogIH0KCiAgLy8vIFNldHMgdGhlIG5hdGl2ZSBuYW1lIG9mIHRoZSBzdGF0aWMgbmF0aXZlIG1ldGhvZCBbZWxlbWVudF0sIHVzaW5nIHRoZQogIC8vLyBmb2xsb3dpbmcgcnVsZXM6CiAgLy8vIDEuIElmIFtlbGVtZW50XSBoYXMgYSBASlNOYW1lIGFubm90YXRpb24gdGhhdCBpcyBhbiBpZGVudGlmaWVyLCBxdWFsaWZ5CiAgLy8vICAgIHRoYXQgaWRlbnRpZmllciB0byB0aGUgQE5hdGl2ZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MKICAvLy8gMi4gSWYgW2VsZW1lbnRdIGhhcyBhIEBKU05hbWUgYW5ub3RhdGlvbiB0aGF0IGlzIG5vdCBhbiBpZGVudGlmaWVyLAogIC8vLyAgICB1c2UgdGhlIGRlY2xhcmVkIEBKU05hbWUgYXMgdGhlIGV4cHJlc3Npb24KICAvLy8gMy4gSWYgW2VsZW1lbnRdIGRvZXMgbm90IGhhdmUgYSBASlNOYW1lIGFubm90YXRpb24sIHF1YWxpZnkgdGhlIG5hbWUgb2YKICAvLy8gICAgdGhlIG1ldGhvZCB3aXRoIHRoZSBATmF0aXZlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcy4KICB2b2lkIF9zZXROYXRpdmVOYW1lRm9yU3RhdGljTWV0aG9kKAogICAgICBpci5NZW1iZXIgbm9kZSwgSXJBbm5vdGF0aW9uRGF0YSBhbm5vdGF0aW9uRGF0YSkgewogICAgU3RyaW5nIG5hbWUgPSBfZmluZEpzTmFtZUZyb21Bbm5vdGF0aW9uKG5vZGUsIGFubm90YXRpb25EYXRhKTsKICAgIG5hbWUgPz89IG5vZGUubmFtZS5uYW1lOwogICAgaWYgKF9pc0lkZW50aWZpZXIobmFtZSkpIHsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gX2VsZW1lbnRNYXAuZ2V0Q2xhc3Mobm9kZS5lbmNsb3NpbmdDbGFzcyk7CiAgICAgIExpc3Q8U3RyaW5nPiBuYXRpdmVOYW1lcyA9IF9uYXRpdmVCYXNpY0RhdGEuZ2V0TmF0aXZlVGFnc09mQ2xhc3MoY2xzKTsKICAgICAgaWYgKG5hdGl2ZU5hbWVzLmxlbmd0aCAhPSAxKSB7CiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG5vZGUpLAogICAgICAgICAgICAnVW5hYmxlIHRvIGRldGVybWluZSBhIG5hdGl2ZSBuYW1lIGZvciB0aGUgZW5jbG9zaW5nIGNsYXNzLCAnCiAgICAgICAgICAgICdvcHRpb25zOiAkbmF0aXZlTmFtZXMnKTsKICAgICAgfQogICAgICBfbmF0aXZlRGF0YUJ1aWxkZXIuc2V0TmF0aXZlTWVtYmVyTmFtZSgKICAgICAgICAgIF9lbGVtZW50TWFwLmdldE1lbWJlcihub2RlKSwgJyR7bmF0aXZlTmFtZXNbMF19LiRuYW1lJyk7CiAgICB9IGVsc2UgewogICAgICBfbmF0aXZlRGF0YUJ1aWxkZXIuc2V0TmF0aXZlTWVtYmVyTmFtZShfZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZSksIG5hbWUpOwogICAgfQogIH0KCiAgYm9vbCBfaXNJZGVudGlmaWVyKFN0cmluZyBzKSA9PiBfaWRlbnRpZmllci5oYXNNYXRjaChzKTsKCiAgLy8vIFJldHVybnMgdGhlIEpTTmFtZSBhbm5vdGF0aW9uIHN0cmluZyBvciBgbnVsbGAgaWYgbm8gSlNOYW1lIGFubm90YXRpb24gaXMKICAvLy8gcHJlc2VudC4KICBTdHJpbmcgX2ZpbmRKc05hbWVGcm9tQW5ub3RhdGlvbigKICAgICAgaXIuTWVtYmVyIG5vZGUsIElyQW5ub3RhdGlvbkRhdGEgYW5ub3RhdGlvbkRhdGEpIHsKICAgIFN0cmluZyBqc05hbWU7CiAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkgewogICAgICBqc05hbWUgPSBhbm5vdGF0aW9uRGF0YS5nZXROYXRpdmVNZW1iZXJOYW1lKG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgU291cmNlU3BhbiBzb3VyY2VTcGFuID0gY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUobm9kZSk7CiAgICAgIGZvciAoQ29uc3RhbnRWYWx1ZSB2YWx1ZSBpbiBfZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgICAuZ2V0TWVtYmVyTWV0YWRhdGEoX2VsZW1lbnRNYXAuZ2V0TWVtYmVyKG5vZGUpKSkgewogICAgICAgIFN0cmluZyBuYW1lID0gcmVhZEFubm90YXRpb25OYW1lKAogICAgICAgICAgICBzb3VyY2VTcGFuLCB2YWx1ZSwgX2NvbW1vbkVsZW1lbnRzLmFubm90YXRpb25KU05hbWVDbGFzcyk7CiAgICAgICAgaWYgKGpzTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICBqc05hbWUgPSBuYW1lOwogICAgICAgIH0gZWxzZSBpZiAobmFtZSAhPSBudWxsKSB7CiAgICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgICBzb3VyY2VTcGFuLCAnVG9vIG1hbnkgSlNOYW1lIGFubm90YXRpb25zOiAke3ZhbHVlLnRvRGFydFRleHQoKX0nKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBqc05hbWU7CiAgfQoKICBOYXRpdmVCZWhhdmlvciBfY29tcHV0ZU5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcihjb3ZhcmlhbnQgS0ZpZWxkIGZpZWxkKSB7CiAgICBpci5GaWVsZCBub2RlID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyTm9kZShmaWVsZCk7CiAgICByZXR1cm4gX2VsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JGaWVsZFN0b3JlKG5vZGUpOwogIH0KCiAgTmF0aXZlQmVoYXZpb3IgX2NvbXB1dGVOYXRpdmVGaWVsZExvYWRCZWhhdmlvcigKICAgICAgS0ZpZWxkIGZpZWxkLCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhLAogICAgICB7Ym9vbCBpc0pzSW50ZXJvcH0pIHsKICAgIGlyLkZpZWxkIG5vZGUgPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJOb2RlKGZpZWxkKTsKICAgIEl0ZXJhYmxlPFN0cmluZz4gY3JlYXRlc0Fubm90YXRpb25zOwogICAgSXRlcmFibGU8U3RyaW5nPiByZXR1cm5zQW5ub3RhdGlvbnM7CiAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkgewogICAgICBjcmVhdGVzQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uRGF0YS5nZXRDcmVhdGVzQW5ub3RhdGlvbnMobm9kZSk7CiAgICAgIHJldHVybnNBbm5vdGF0aW9ucyA9IGFubm90YXRpb25EYXRhLmdldFJldHVybnNBbm5vdGF0aW9ucyhub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gbWV0YWRhdGEgPQogICAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRNZW1iZXJNZXRhZGF0YShmaWVsZCk7CiAgICAgIGNyZWF0ZXNBbm5vdGF0aW9ucyA9IGdldENyZWF0ZXNBbm5vdGF0aW9ucygKICAgICAgICAgIF9lbGVtZW50TWFwLnJlcG9ydGVyLCBfZWxlbWVudE1hcC5jb21tb25FbGVtZW50cywgbWV0YWRhdGEpOwogICAgICByZXR1cm5zQW5ub3RhdGlvbnMgPSBnZXRSZXR1cm5zQW5ub3RhdGlvbnMoCiAgICAgICAgICBfZWxlbWVudE1hcC5yZXBvcnRlciwgX2VsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMsIG1ldGFkYXRhKTsKICAgIH0KICAgIHJldHVybiBfZWxlbWVudE1hcC5nZXROYXRpdmVCZWhhdmlvckZvckZpZWxkTG9hZCgKICAgICAgICBub2RlLCBjcmVhdGVzQW5ub3RhdGlvbnMsIHJldHVybnNBbm5vdGF0aW9ucywKICAgICAgICBpc0pzSW50ZXJvcDogaXNKc0ludGVyb3ApOwogIH0KCiAgTmF0aXZlQmVoYXZpb3IgX2NvbXB1dGVOYXRpdmVNZXRob2RCZWhhdmlvcigKICAgICAgS0Z1bmN0aW9uIGZ1bmN0aW9uLCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhLAogICAgICB7Ym9vbCBpc0pzSW50ZXJvcH0pIHsKICAgIGlyLk1lbWJlciBub2RlID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyTm9kZShmdW5jdGlvbik7CiAgICBJdGVyYWJsZTxTdHJpbmc+IGNyZWF0ZXNBbm5vdGF0aW9uczsKICAgIEl0ZXJhYmxlPFN0cmluZz4gcmV0dXJuc0Fubm90YXRpb25zOwogICAgaWYgKGFubm90YXRpb25EYXRhICE9IG51bGwpIHsKICAgICAgY3JlYXRlc0Fubm90YXRpb25zID0gYW5ub3RhdGlvbkRhdGEuZ2V0Q3JlYXRlc0Fubm90YXRpb25zKG5vZGUpOwogICAgICByZXR1cm5zQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uRGF0YS5nZXRSZXR1cm5zQW5ub3RhdGlvbnMobm9kZSk7CiAgICB9IGVsc2UgewogICAgICBMaXN0PENvbnN0YW50VmFsdWU+IG1ldGFkYXRhID0KICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0TWVtYmVyTWV0YWRhdGEoZnVuY3Rpb24pOwogICAgICBjcmVhdGVzQW5ub3RhdGlvbnMgPSBnZXRDcmVhdGVzQW5ub3RhdGlvbnMoCiAgICAgICAgICBfZWxlbWVudE1hcC5yZXBvcnRlciwgX2VsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMsIG1ldGFkYXRhKTsKICAgICAgcmV0dXJuc0Fubm90YXRpb25zID0gZ2V0UmV0dXJuc0Fubm90YXRpb25zKAogICAgICAgICAgX2VsZW1lbnRNYXAucmVwb3J0ZXIsIF9lbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzLCBtZXRhZGF0YSk7CiAgICB9CiAgICByZXR1cm4gX2VsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JNZXRob2QoCiAgICAgICAgbm9kZSwgY3JlYXRlc0Fubm90YXRpb25zLCByZXR1cm5zQW5ub3RhdGlvbnMsCiAgICAgICAgaXNKc0ludGVyb3A6IGlzSnNJbnRlcm9wKTsKICB9CgogIGJvb2wgX2lzTmF0aXZlTWV0aG9kKGlyLk1lbWJlciBub2RlLCBJckFubm90YXRpb25EYXRhIGFubm90YXRpb25EYXRhKSB7CiAgICBpZiAoIW1heWJlRW5hYmxlTmF0aXZlKG5vZGUuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmkpKSByZXR1cm4gZmFsc2U7CiAgICBib29sIGhhc05hdGl2ZUJvZHk7CiAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkgewogICAgICBoYXNOYXRpdmVCb2R5ID0gYW5ub3RhdGlvbkRhdGEuaGFzTmF0aXZlQm9keShub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIGhhc05hdGl2ZUJvZHkgPSBub2RlLmFubm90YXRpb25zLmFueSgoaXIuRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24gaXMgaXIuQ29uc3RydWN0b3JJbnZvY2F0aW9uICYmCiAgICAgICAgICAgIF9lbGVtZW50TWFwLmdldEludGVyZmFjZVR5cGUoZXhwcmVzc2lvbi5jb25zdHJ1Y3RlZFR5cGUpID09CiAgICAgICAgICAgICAgICBfY29tbW9uRWxlbWVudHMuZXh0ZXJuYWxOYW1lVHlwZTsKICAgICAgfSk7CiAgICB9CiAgICBpZiAoIWhhc05hdGl2ZUJvZHkgJiYKICAgICAgICBub2RlLmlzRXh0ZXJuYWwgJiYKICAgICAgICAhX25hdGl2ZUJhc2ljRGF0YS5pc0pzSW50ZXJvcE1lbWJlcihfZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZSkpKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNob3VsZCB3ZSBjaGFuZ2UgZGFydDpodG1sIGFuZCBmcmllbmRzIHRvIHVzZQogICAgICAvLyAgYGV4dGVybmFsYCBpbnN0ZWFkIG9mIHRoZSBuYXRpdmUgYm9keSBzeW50YXg/CiAgICAgIF9lbGVtZW50TWFwLnJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG5vZGUpLCBNZXNzYWdlS2luZC5OT05fTkFUSVZFX0VYVEVSTkFMKTsKICAgIH0KICAgIHJldHVybiBoYXNOYXRpdmVCb2R5OwogIH0KCiAgYm9vbCBfaXNKc0ludGVyb3BNZW1iZXIoaXIuTWVtYmVyIG5vZGUpIHsKICAgIHJldHVybiBfbmF0aXZlQmFzaWNEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKF9lbGVtZW50TWFwLmdldE1lbWJlcihub2RlKSk7CiAgfQp9CgpjbGFzcyBLZXJuZWxDbGFzc1F1ZXJpZXMgZXh0ZW5kcyBDbGFzc1F1ZXJpZXMgewogIGZpbmFsIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgZWxlbWVudE1hcDsKCiAgS2VybmVsQ2xhc3NRdWVyaWVzKHRoaXMuZWxlbWVudE1hcCk7CgogIEBvdmVycmlkZQogIENsYXNzRW50aXR5IGdldERlY2xhcmF0aW9uKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGNsczsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEludGVyZmFjZVR5cGU+IGdldFN1cGVydHlwZXMoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRPcmRlcmVkVHlwZVNldChjbHMpLnN1cGVydHlwZXM7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXRTdXBlckNsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0U3VwZXJUeXBlKGNscyk/LmVsZW1lbnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGltcGxlbWVudHNGdW5jdGlvbihDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLl9pbXBsZW1lbnRzRnVuY3Rpb24oY2xzKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXRIaWVyYXJjaHlEZXB0aChDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLmdldEhpZXJhcmNoeURlcHRoKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0VudGl0eSBnZXRBcHBsaWVkTWl4aW4oQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRBcHBsaWVkTWl4aW4oY2xzKTsKICB9Cn0KCkRpYWdub3N0aWNNZXNzYWdlIF9jcmVhdGVEaWFnbm9zdGljTWVzc2FnZSgKICAgIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgaXIuTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSkgewogIFNvdXJjZVNwYW4gc291cmNlU3BhbiA9IG5ldyBTb3VyY2VTcGFuKAogICAgICBtZXNzYWdlLnVyaSwgbWVzc2FnZS5jaGFyT2Zmc2V0LCBtZXNzYWdlLmNoYXJPZmZzZXQgKyBtZXNzYWdlLmxlbmd0aCk7CiAgcmV0dXJuIHJlcG9ydGVyLmNyZWF0ZU1lc3NhZ2UoCiAgICAgIHNvdXJjZVNwYW4sIE1lc3NhZ2VLaW5kLkdFTkVSSUMsIHsndGV4dCc6IG1lc3NhZ2UubWVzc2FnZX0pOwp9Cgp2b2lkIHJlcG9ydExvY2F0ZWRNZXNzYWdlKERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwKICAgIGlyLkxvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UsIExpc3Q8aXIuTG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQpIHsKICBEaWFnbm9zdGljTWVzc2FnZSBkaWFnbm9zdGljTWVzc2FnZSA9CiAgICAgIF9jcmVhdGVEaWFnbm9zdGljTWVzc2FnZShyZXBvcnRlciwgbWVzc2FnZSk7CiAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MgPSBbXTsKICBmb3IgKGlyLkxvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UgaW4gY29udGV4dCkgewogICAgaW5mb3MuYWRkKF9jcmVhdGVEaWFnbm9zdGljTWVzc2FnZShyZXBvcnRlciwgbWVzc2FnZSkpOwogIH0KICByZXBvcnRlci5yZXBvcnRFcnJvcihkaWFnbm9zdGljTWVzc2FnZSwgaW5mb3MpOwp9Coi9AE5OPAEkAUA4KDQvMTUBGR8kIikpJygjJCMhIR4kIR8bIRwhIScbGx4aHikjKTUiKCIiGiIqKyQBGxMZHQEfJQFEGE0hDCUiJjAkMhonJS8oATEnAVBJSEM8N05DPzkBUCQcATkzOQE9HAZLS05RSEA7MzcBKiYBQAEaUD5MTjIoNgQBDCEBDEoBDDwBJU4EASMiPhAEAUk0KTc3Oy4zNkE5LzQ3QTkwRyhHCBMGATYyFwQBKTUpPwQBMyI4KgQBSB4iOEY2BAEePSI4MBoIBAFBIjg3HDcGEQQBSCI4MzE1CAgEAStABAFAHh4uPgQBRx4uMwQBDCU3SgQBSQEMQQEMMR4sIhsEAUEeOyEpGEcPKxFEHitI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OwFQDyQ5EyI5DUM2PSpHHhkjFFEKCAYTBAFMNj0EATI1HDYpKSJHRw0lODJHMkcGNjYjBAEvOxw6KSkiR0cNJTsyRzJHBjM2IwQBSksYIjoNSDlIMgoGGhtMTDgvUQYaBAEsTAQCATArAScBDDAQBAEMOzkEAQwvMgQBDC0wBAEMKy4EAQwxLAQCASw+Kk0hQwIBN0IoMyYvPAQyAgExcGFja2FnZTpjb21waWxlci9zcmMva2VybmVsL2VsZW1lbnRfbWFwX2ltcGwuZGFydDtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9rZXJuZWwvbmF0aXZlX2Jhc2ljX2RhdGEuZGFydLTLLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIFRPRE8oam9obm5pd2ludGhlcik6IE1ha2UgdGhpcyBhIHNlcGFyYXRlIGxpYnJhcnkuCnBhcnQgb2YgZGFydDJqcy5rZXJuZWwuZWxlbWVudF9tYXA7CgpjbGFzcyBLZXJuZWxBbm5vdGF0aW9uUHJvY2Vzc29yIGltcGxlbWVudHMgQW5ub3RhdGlvblByb2Nlc3NvciB7CiAgZmluYWwgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBlbGVtZW50TWFwOwogIGZpbmFsIE5hdGl2ZUJhc2ljRGF0YUJ1aWxkZXIgX25hdGl2ZUJhc2ljRGF0YUJ1aWxkZXI7CiAgZmluYWwgSXJBbm5vdGF0aW9uRGF0YSBhbm5vdGF0aW9uRGF0YTsKCiAgS2VybmVsQW5ub3RhdGlvblByb2Nlc3NvcigKICAgICAgdGhpcy5lbGVtZW50TWFwLCB0aGlzLl9uYXRpdmVCYXNpY0RhdGFCdWlsZGVyLCB0aGlzLmFubm90YXRpb25EYXRhKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBleHRyYWN0TmF0aXZlQW5ub3RhdGlvbnMoTGlicmFyeUVudGl0eSBsaWJyYXJ5KSB7CiAgICBLRWxlbWVudEVudmlyb25tZW50IGVsZW1lbnRFbnZpcm9ubWVudCA9IGVsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50OwogICAgS0NvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzID0gZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgICBlbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaENsYXNzKGxpYnJhcnksIChDbGFzc0VudGl0eSBjbHMpIHsKICAgICAgaXIuQ2xhc3Mgbm9kZSA9IGVsZW1lbnRNYXAuZ2V0Q2xhc3NOb2RlKGNscyk7CiAgICAgIFN0cmluZyBhbm5vdGF0aW9uTmFtZTsKICAgICAgaWYgKGFubm90YXRpb25EYXRhICE9IG51bGwpIHsKICAgICAgICBhbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb25EYXRhLmdldE5hdGl2ZUNsYXNzTmFtZShub2RlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyBicmFuY2ggd2hlbiB3ZSB1c2UgY29uc3RhbnRzIGZyb20KICAgICAgICAvLyBDRkUuCiAgICAgICAgZm9yIChDb25zdGFudFZhbHVlIHZhbHVlIGluIGVsZW1lbnRFbnZpcm9ubWVudC5nZXRDbGFzc01ldGFkYXRhKGNscykpIHsKICAgICAgICAgIFN0cmluZyBuYW1lID0gcmVhZEFubm90YXRpb25OYW1lKAogICAgICAgICAgICAgIGNscywgdmFsdWUsIGNvbW1vbkVsZW1lbnRzLm5hdGl2ZUFubm90YXRpb25DbGFzcyk7CiAgICAgICAgICBpZiAoYW5ub3RhdGlvbk5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICBhbm5vdGF0aW9uTmFtZSA9IG5hbWU7CiAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICBmYWlsZWRBdChjbHMsICdUb28gbWFueSBuYW1lIGFubm90YXRpb25zLicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoYW5ub3RhdGlvbk5hbWUgIT0gbnVsbCkgewogICAgICAgIF9uYXRpdmVCYXNpY0RhdGFCdWlsZGVyLnNldE5hdGl2ZUNsYXNzVGFnSW5mbyhjbHMsIGFubm90YXRpb25OYW1lKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBTdHJpbmcgZ2V0SnNJbnRlcm9wTmFtZSgKICAgICAgU3Bhbm5hYmxlIHNwYW5uYWJsZSwgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gbWV0YWRhdGEpIHsKICAgIEtDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cyA9IGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHM7CiAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWU7CiAgICBmb3IgKENvbnN0YW50VmFsdWUgdmFsdWUgaW4gbWV0YWRhdGEpIHsKICAgICAgU3RyaW5nIG5hbWUgPSByZWFkQW5ub3RhdGlvbk5hbWUoCiAgICAgICAgICBzcGFubmFibGUsIHZhbHVlLCBjb21tb25FbGVtZW50cy5qc0Fubm90YXRpb25DbGFzcywKICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycpOwogICAgICBpZiAoYW5ub3RhdGlvbk5hbWUgPT0gbnVsbCkgewogICAgICAgIGFubm90YXRpb25OYW1lID0gbmFtZTsKICAgICAgfSBlbHNlIGlmIChuYW1lICE9IG51bGwpIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIHNob3VsZCBiZSBhbiBlcnJvciwgbm90IGEgY3Jhc2guCiAgICAgICAgZmFpbGVkQXQoc3Bhbm5hYmxlLCAnVG9vIG1hbnkgbmFtZSBhbm5vdGF0aW9ucy4nKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGFubm90YXRpb25OYW1lOwogIH0KCiAgdm9pZCBjaGVja0Z1bmN0aW9uUGFyYW1ldGVycyhGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgaWYgKGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZS5uYW1lZFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBlbGVtZW50TWFwLnJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIGZ1bmN0aW9uLAogICAgICAgICAgTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9NRVRIT0RfV0lUSF9OQU1FRF9BUkdVTUVOVFMsCiAgICAgICAgICB7J21ldGhvZCc6IGZ1bmN0aW9uLm5hbWV9KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZXh0cmFjdEpzSW50ZXJvcEFubm90YXRpb25zKExpYnJhcnlFbnRpdHkgbGlicmFyeSkgewogICAgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyID0gZWxlbWVudE1hcC5yZXBvcnRlcjsKICAgIEtFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50ID0gZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQ7CiAgICBLQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMgPSBlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzOwoKICAgIGlyLkxpYnJhcnkgbGlicmFyeU5vZGUgPSBlbGVtZW50TWFwLmdldExpYnJhcnlOb2RlKGxpYnJhcnkpOwogICAgU3RyaW5nIGxpYnJhcnlOYW1lOwogICAgaWYgKGFubm90YXRpb25EYXRhICE9IG51bGwpIHsKICAgICAgbGlicmFyeU5hbWUgPSBhbm5vdGF0aW9uRGF0YS5nZXRKc0ludGVyb3BMaWJyYXJ5TmFtZShsaWJyYXJ5Tm9kZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyB3aGVuIHdlIHVzZSBjb25zdGFudHMgZnJvbSBDRkUuCiAgICAgIGxpYnJhcnlOYW1lID0gZ2V0SnNJbnRlcm9wTmFtZSgKICAgICAgICAgIGxpYnJhcnksIGVsZW1lbnRFbnZpcm9ubWVudC5nZXRMaWJyYXJ5TWV0YWRhdGEobGlicmFyeSkpOwogICAgfQogICAgZmluYWwgYm9vbCBpc0V4cGxpY2l0bHlseUpzTGlicmFyeSA9IGxpYnJhcnlOYW1lICE9IG51bGw7CiAgICBib29sIGlzSnNMaWJyYXJ5ID0gaXNFeHBsaWNpdGx5bHlKc0xpYnJhcnk7CgogICAgZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hMaWJyYXJ5TWVtYmVyKGxpYnJhcnksIChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgIGlyLk1lbWJlciBtZW1iZXJOb2RlID0gZWxlbWVudE1hcC5nZXRNZW1iZXJOb2RlKG1lbWJlcik7CiAgICAgIFN0cmluZyBtZW1iZXJOYW1lOwogICAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkgewogICAgICAgIG1lbWJlck5hbWUgPSBhbm5vdGF0aW9uRGF0YS5nZXRKc0ludGVyb3BNZW1iZXJOYW1lKG1lbWJlck5vZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHdoZW4gd2UgdXNlIGNvbnN0YW50cyBmcm9tIENGRS4KICAgICAgICBtZW1iZXJOYW1lID0gZ2V0SnNJbnRlcm9wTmFtZSgKICAgICAgICAgICAgbGlicmFyeSwgZWxlbWVudEVudmlyb25tZW50LmdldE1lbWJlck1ldGFkYXRhKG1lbWJlcikpOwogICAgICB9CiAgICAgIGlmIChtZW1iZXIuaXNGaWVsZCkgewogICAgICAgIGlmIChtZW1iZXJOYW1lICE9IG51bGwpIHsKICAgICAgICAgIC8vIFRPRE8oMzQxNzQpOiBEaXNhbGxvdyBqcy1pbnRlcm9wIGZpZWxkcy4KICAgICAgICAgIC8qcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgICAgIG1lbWJlciwgTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9GSUVMRF9OT1RfU1VQUE9SVEVEKTsqLwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiA9IG1lbWJlcjsKICAgICAgICBpZiAoZnVuY3Rpb24uaXNFeHRlcm5hbCAmJiBpc0V4cGxpY2l0bHlseUpzTGlicmFyeSkgewogICAgICAgICAgLy8gRXh0ZXJuYWwgbWVtYmVycyBvZiBleHBsaWNpdCBqcy1pbnRlcm9wIGxpYnJhcnkgYXJlIGltcGxpY2l0bHkKICAgICAgICAgIC8vIGpzLWludGVyb3AgbWVtYmVycy4KICAgICAgICAgIG1lbWJlck5hbWUgPz89IGZ1bmN0aW9uLm5hbWU7CiAgICAgICAgfQogICAgICAgIGlmIChtZW1iZXJOYW1lICE9IG51bGwpIHsKICAgICAgICAgIGlmICghZnVuY3Rpb24uaXNFeHRlcm5hbCkgewogICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBEaXNhbGxvdyBub24tZXh0ZXJuYWwganMtaW50ZXJvcCBtZW1iZXJzLgogICAgICAgICAgICAvKnJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCBNZXNzYWdlS2luZC5KU19JTlRFUk9QX05PTl9FWFRFUk5BTF9NRU1CRVIpOyovCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfbmF0aXZlQmFzaWNEYXRhQnVpbGRlci5tYXJrQXNKc0ludGVyb3BNZW1iZXIoZnVuY3Rpb24sIG1lbWJlck5hbWUpOwogICAgICAgICAgICBjaGVja0Z1bmN0aW9uUGFyYW1ldGVycyhmdW5jdGlvbik7CiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEl0IGlzIHVuY2xlYXIgd2hldGhlciBsaWJyYXJ5IGNhbiBiZQogICAgICAgICAgICAvLyBpbXBsaWNpdGx5IGpzLWludGVyb3AuIEZvciBub3cgd2UgYWxsb3cgaXQuCiAgICAgICAgICAgIGlzSnNMaWJyYXJ5ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGZ1bmN0aW9uLmlzRXh0ZXJuYWwgJiYKICAgICAgICAgICAgIWNvbW1vbkVsZW1lbnRzLmlzRXh0ZXJuYWxBbGxvd2VkKGZ1bmN0aW9uKSkgewogICAgICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKAogICAgICAgICAgICAgIGZ1bmN0aW9uLCBNZXNzYWdlS2luZC5OT05fTkFUSVZFX0VYVEVSTkFMKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIGVsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoQ2xhc3MobGlicmFyeSwgKENsYXNzRW50aXR5IGNscykgewogICAgICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBtZXRhZGF0YTsKICAgICAgaXIuQ2xhc3MgY2xhc3NOb2RlID0gZWxlbWVudE1hcC5nZXRDbGFzc05vZGUoY2xzKTsKICAgICAgU3RyaW5nIGNsYXNzTmFtZTsKICAgICAgaWYgKGFubm90YXRpb25EYXRhICE9IG51bGwpIHsKICAgICAgICBjbGFzc05hbWUgPSBhbm5vdGF0aW9uRGF0YS5nZXRKc0ludGVyb3BDbGFzc05hbWUoY2xhc3NOb2RlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtZXRhZGF0YSA9IGVsZW1lbnRFbnZpcm9ubWVudC5nZXRDbGFzc01ldGFkYXRhKGNscyk7CiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiB3ZSB1c2UgY29uc3RhbnRzIGZyb20gQ0ZFLgogICAgICAgIGNsYXNzTmFtZSA9IGdldEpzSW50ZXJvcE5hbWUoY2xzLCBtZXRhZGF0YSk7CiAgICAgIH0KICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7CiAgICAgICAgYm9vbCBpc0Fub255bW91czsKICAgICAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkgewogICAgICAgICAgaXNBbm9ueW1vdXMgPSBhbm5vdGF0aW9uRGF0YS5pc0Fub255bW91c0pzSW50ZXJvcENsYXNzKGNsYXNzTm9kZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlzQW5vbnltb3VzID0gZmFsc2U7CiAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyBicmFuY2ggd2hlbiB3ZSB1c2UgY29uc3RhbnRzIGZyb20KICAgICAgICAgIC8vIENGRS4KICAgICAgICAgIGZvciAoQ29uc3RhbnRWYWx1ZSB2YWx1ZSBpbiBtZXRhZGF0YSkgewogICAgICAgICAgICBpZiAoaXNBbm5vdGF0aW9uKGNscywgdmFsdWUsIGNvbW1vbkVsZW1lbnRzLmpzQW5vbnltb3VzQ2xhc3MpKSB7CiAgICAgICAgICAgICAgaXNBbm9ueW1vdXMgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlcG9ydCBhbiBlcnJvciBpZiB0aGUgY2xhc3MgaXMgYW5vbnltb3VzIGJ1dAogICAgICAgIC8vIGhhcyBhIG5vbi1lbXB0eSBuYW1lLgogICAgICAgIF9uYXRpdmVCYXNpY0RhdGFCdWlsZGVyLm1hcmtBc0pzSW50ZXJvcENsYXNzKGNscywKICAgICAgICAgICAgbmFtZTogY2xhc3NOYW1lLCBpc0Fub255bW91czogaXNBbm9ueW1vdXMpOwogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEl0IGlzIHVuY2xlYXIgd2hldGhlciBsaWJyYXJ5IGNhbiBiZSBpbXBsaWNpdGx5CiAgICAgICAgLy8ganMtaW50ZXJvcC4gRm9yIG5vdyB3ZSBhbGxvdyBpdC4KICAgICAgICBpc0pzTGlicmFyeSA9IHRydWU7CgogICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoTG9jYWxDbGFzc01lbWJlcihjbHMsIChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgICAgICBpZiAobWVtYmVyLmlzRmllbGQpIHsKICAgICAgICAgICAgLy8gVE9ETygzNDE3NCk6IERpc2FsbG93IGpzLWludGVyb3AgZmllbGRzLgogICAgICAgICAgICAvKnJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICAgIG1lbWJlciwgTWVzc2FnZUtpbmQuSU1QTElDSVRfSlNfSU5URVJPUF9GSUVMRF9OT1RfU1VQUE9SVEVEKTsqLwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24gPSBtZW1iZXI7CiAgICAgICAgICAgIGlyLk1lbWJlciBtZW1iZXJOb2RlID0gZWxlbWVudE1hcC5nZXRNZW1iZXJOb2RlKG1lbWJlcik7CiAgICAgICAgICAgIFN0cmluZyBtZW1iZXJOYW1lOwogICAgICAgICAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkgewogICAgICAgICAgICAgIG1lbWJlck5hbWUgPSBhbm5vdGF0aW9uRGF0YS5nZXRKc0ludGVyb3BNZW1iZXJOYW1lKG1lbWJlck5vZGUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHdoZW4gd2UgdXNlIGNvbnN0YW50cyBmcm9tIENGRS4KICAgICAgICAgICAgICBtZW1iZXJOYW1lID0gZ2V0SnNJbnRlcm9wTmFtZSgKICAgICAgICAgICAgICAgICAgbGlicmFyeSwgZWxlbWVudEVudmlyb25tZW50LmdldE1lbWJlck1ldGFkYXRhKGZ1bmN0aW9uKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZ1bmN0aW9uLmlzRXh0ZXJuYWwpIHsKICAgICAgICAgICAgICBtZW1iZXJOYW1lID8/PSBmdW5jdGlvbi5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtZW1iZXJOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCBleHBsaWNpdAogICAgICAgICAgICAgIC8vIG1lbWJlciBuYW1lIGFubm90YXRpb25zIGFyZSBub3QgYWxsb3dlZCBvbiBpbnN0YW5jZSBtZW1iZXJzLgogICAgICAgICAgICAgIF9uYXRpdmVCYXNpY0RhdGFCdWlsZGVyLm1hcmtBc0pzSW50ZXJvcE1lbWJlcigKICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sIG1lbWJlck5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWZ1bmN0aW9uLmlzRXh0ZXJuYWwgJiYKICAgICAgICAgICAgICAgICFmdW5jdGlvbi5pc0Fic3RyYWN0ICYmCiAgICAgICAgICAgICAgICAhZnVuY3Rpb24uaXNTdGF0aWMpIHsKICAgICAgICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAogICAgICAgICAgICAgICAgICBNZXNzYWdlS2luZC5KU19JTlRFUk9QX0NMQVNTX05PTl9FWFRFUk5BTF9NRU1CRVIsCiAgICAgICAgICAgICAgICAgIHsnY2xzJzogY2xzLm5hbWUsICdtZW1iZXInOiBtZW1iZXIubmFtZX0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGVja0Z1bmN0aW9uUGFyYW1ldGVycyhmdW5jdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hDb25zdHJ1Y3RvcihjbHMsCiAgICAgICAgICAgIChDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvcikgewogICAgICAgICAgU3RyaW5nIG1lbWJlck5hbWUgPSBnZXRKc0ludGVyb3BOYW1lKAogICAgICAgICAgICAgIGxpYnJhcnksIGVsZW1lbnRFbnZpcm9ubWVudC5nZXRNZW1iZXJNZXRhZGF0YShjb25zdHJ1Y3RvcikpOwogICAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmlzRXh0ZXJuYWwpIHsKICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSXQgc2hvdWxkIHByb2JhYmx5IGJlIGFuIGVycm9yIHRvIGhhdmUgYQogICAgICAgICAgICAvLyBuby1uYW1lIGNvbnN0cnVjdG9yIHdpdGhvdXQgYSBASlMoKSBhbm5vdGF0aW9uLgogICAgICAgICAgICBtZW1iZXJOYW1lID8/PSBjb25zdHJ1Y3Rvci5uYW1lOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1lbWJlck5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCBleHBsaWNpdAogICAgICAgICAgICAvLyBtZW1iZXIgbmFtZSBhbm5vdGF0aW9ucyBhcmUgbm90IGFsbG93ZWQgb24gaW5zdGFuY2UgbWVtYmVycy4KICAgICAgICAgICAgX25hdGl2ZUJhc2ljRGF0YUJ1aWxkZXIubWFya0FzSnNJbnRlcm9wTWVtYmVyKAogICAgICAgICAgICAgICAgY29uc3RydWN0b3IsIG1lbWJlck5hbWUpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFRPRE8oMzM4MzQpOiBJdCBpcyBhIGJyZWFraW5nIGNoYW5nZSAoYXQgbGVhc3QgYWdhaW5zdCBpbiBzb21lIG9mCiAgICAgICAgICAvLyBvdXIgb3duIHRlc3RzKSBidXQgSlMtaW50ZXJvcCBjb25zdHJ1Y3RvcnMgc2hvdWxkIGJlIHJlcXVpcmVkIHRvIGJlCiAgICAgICAgICAvLyBleHRlcm5hbCBzaW5jZSB3ZSBvdGhlcndpc2UgYWxsb3cgY3JlYXRpbmcgYSBEYXJ0IG9iamVjdCB0aGF0IHRyaWVzCiAgICAgICAgICAvLyB0byBwYXNzIGFzIGEgSlMtaW50ZXJvcCBjbGFzcy4KICAgICAgICAgIC8qaWYgKCFjb25zdHJ1Y3Rvci5pc0V4dGVybmFsKSB7CiAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZShjb25zdHJ1Y3RvciwKICAgICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfQ0xBU1NfTk9OX0VYVEVSTkFMX0NPTlNUUlVDVE9SLCB7CiAgICAgICAgICAgICAgJ2Nscyc6IGNscy5uYW1lLAogICAgICAgICAgICAgICdjb25zdHJ1Y3Rvcic6CiAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLm5hbWUuaXNFbXB0eSA/ICcke2Nscy5uYW1lfS4nIDogY29uc3RydWN0b3IubmFtZQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0qLwoKICAgICAgICAgIGlmIChjb25zdHJ1Y3Rvci5pc0ZhY3RvcnlDb25zdHJ1Y3RvciAmJiBpc0Fub255bW91cykgewogICAgICAgICAgICBpZiAoY29uc3RydWN0b3IucGFyYW1ldGVyU3RydWN0dXJlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzID4gMCkgewogICAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IsCiAgICAgICAgICAgICAgICAgIE1lc3NhZ2VLaW5kCiAgICAgICAgICAgICAgICAgICAgICAuSlNfT0JKRUNUX0xJVEVSQUxfQ09OU1RSVUNUT1JfV0lUSF9QT1NJVElPTkFMX0FSR1VNRU5UUywKICAgICAgICAgICAgICAgICAgeydjbHMnOiBjbHMubmFtZX0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaGVja0Z1bmN0aW9uUGFyYW1ldGVycyhjb25zdHJ1Y3Rvcik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hMb2NhbENsYXNzTWVtYmVyKGNscywgKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgICAgIFN0cmluZyBtZW1iZXJOYW1lID0gZ2V0SnNJbnRlcm9wTmFtZSgKICAgICAgICAgICAgICBsaWJyYXJ5LCBlbGVtZW50RW52aXJvbm1lbnQuZ2V0TWVtYmVyTWV0YWRhdGEobWVtYmVyKSk7CiAgICAgICAgICBpZiAobWVtYmVyTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICAgIG1lbWJlciwgTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9NRU1CRVJfSU5fTk9OX0pTX0lOVEVST1BfQ0xBU1MpOwogICAgICAgICAgfSBlbHNlIGlmIChtZW1iZXIgaXMgRnVuY3Rpb25FbnRpdHkpIHsKICAgICAgICAgICAgaWYgKG1lbWJlci5pc0V4dGVybmFsICYmCiAgICAgICAgICAgICAgICAhY29tbW9uRWxlbWVudHMuaXNFeHRlcm5hbEFsbG93ZWQobWVtYmVyKSkgewogICAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICAgICAgbWVtYmVyLCBNZXNzYWdlS2luZC5OT05fTkFUSVZFX0VYVEVSTkFMKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGVsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoQ29uc3RydWN0b3IoY2xzLAogICAgICAgICAgICAoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpIHsKICAgICAgICAgIFN0cmluZyBtZW1iZXJOYW1lID0gZ2V0SnNJbnRlcm9wTmFtZSgKICAgICAgICAgICAgICBsaWJyYXJ5LCBlbGVtZW50RW52aXJvbm1lbnQuZ2V0TWVtYmVyTWV0YWRhdGEoY29uc3RydWN0b3IpKTsKICAgICAgICAgIGlmIChtZW1iZXJOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKGNvbnN0cnVjdG9yLAogICAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9NRU1CRVJfSU5fTk9OX0pTX0lOVEVST1BfQ0xBU1MpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmlzRXh0ZXJuYWwgJiYKICAgICAgICAgICAgICAgICFjb21tb25FbGVtZW50cy5pc0V4dGVybmFsQWxsb3dlZChjb25zdHJ1Y3RvcikpIHsKICAgICAgICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLCBNZXNzYWdlS2luZC5OT05fTkFUSVZFX0VYVEVSTkFMKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9KTsKCiAgICBpZiAoaXNKc0xpYnJhcnkpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSXQgaXMgdW5jbGVhciB3aGV0aGVyIGxpYnJhcnkgY2FuIGJlIGltcGxpY2l0bHkKICAgICAgLy8ganMtaW50ZXJvcC4gRm9yIG5vdyB3ZSBhbGxvdyBpdCBhbmQgYXNzdW1lIHRoZSBlbXB0eSBuYW1lLgogICAgICBsaWJyYXJ5TmFtZSA/Pz0gJyc7CiAgICAgIF9uYXRpdmVCYXNpY0RhdGFCdWlsZGVyLm1hcmtBc0pzSW50ZXJvcExpYnJhcnkobGlicmFyeSwKICAgICAgICAgIG5hbWU6IGxpYnJhcnlOYW1lKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJvY2Vzc0pzSW50ZXJvcEFubm90YXRpb25zKAogICAgICBOYXRpdmVCYXNpY0RhdGEgbmF0aXZlQmFzaWNEYXRhLCBOYXRpdmVEYXRhQnVpbGRlciBuYXRpdmVEYXRhQnVpbGRlcikgewogICAgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyID0gZWxlbWVudE1hcC5yZXBvcnRlcjsKICAgIEtFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50ID0gZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQ7CiAgICBLQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMgPSBlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzOwoKICAgIGZvciAoTGlicmFyeUVudGl0eSBsaWJyYXJ5IGluIGVsZW1lbnRFbnZpcm9ubWVudC5saWJyYXJpZXMpIHsKICAgICAgLy8gRXJyb3IgY2hlY2tpbmcgZm9yIGNsYXNzIGluaGVyaXRhbmNlIG11c3QgaGFwcGVuIGFmdGVyIHRoZSBmaXJzdCBwYXNzCiAgICAgIC8vIHRocm91Z2ggYWxsIHRoZSBjbGFzc2VzIGJlY2F1c2UgaXQgaXMgcG9zc2libGUgdG8gZGVjbGFyZSBhIHN1YmNsYXNzCiAgICAgIC8vIGJlZm9yZSBhIHN1cGVyY2xhc3MgdGhhdCBoYXMgbm90IHlldCBoYWQgIm1hcmtKc0ludGVyb3BDbGFzcyIgY2FsbGVkIG9uCiAgICAgIC8vIGl0LgogICAgICBlbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaENsYXNzKGxpYnJhcnksIChDbGFzc0VudGl0eSBjbHMpIHsKICAgICAgICBpci5DbGFzcyBjbGFzc05vZGUgPSBlbGVtZW50TWFwLmdldENsYXNzTm9kZShjbHMpOwogICAgICAgIFN0cmluZyBjbGFzc05hbWU7CiAgICAgICAgaWYgKGFubm90YXRpb25EYXRhICE9IG51bGwpIHsKICAgICAgICAgIGNsYXNzTmFtZSA9IGFubm90YXRpb25EYXRhLmdldEpzSW50ZXJvcENsYXNzTmFtZShjbGFzc05vZGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyB3aGVuIHdlIHVzZSBjb25zdGFudHMgZnJvbSBDRkUuCiAgICAgICAgICBjbGFzc05hbWUgPz89CiAgICAgICAgICAgICAgZ2V0SnNJbnRlcm9wTmFtZShjbHMsIGVsZW1lbnRFbnZpcm9ubWVudC5nZXRDbGFzc01ldGFkYXRhKGNscykpOwogICAgICAgIH0KICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKICAgICAgICAgIGJvb2wgaW1wbGVtZW50c0pzSmF2YVNjcmlwdE9iamVjdENsYXNzID0gZmFsc2U7CiAgICAgICAgICBlbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaFN1cGVydHlwZShjbHMsIChJbnRlcmZhY2VUeXBlIHN1cGVydHlwZSkgewogICAgICAgICAgICBpZiAoc3VwZXJ0eXBlLmVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuanNKYXZhU2NyaXB0T2JqZWN0Q2xhc3MpIHsKICAgICAgICAgICAgICBpbXBsZW1lbnRzSnNKYXZhU2NyaXB0T2JqZWN0Q2xhc3MgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmICghaW1wbGVtZW50c0pzSmF2YVNjcmlwdE9iamVjdENsYXNzKSB7CiAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICAgIGNscywgTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9DTEFTU19DQU5OT1RfRVhURU5EX0RBUlRfQ0xBU1MsIHsKICAgICAgICAgICAgICAnY2xzJzogY2xzLm5hbWUsCiAgICAgICAgICAgICAgJ3N1cGVyY2xhc3MnOiBlbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhjbHMpLm5hbWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9Cn0KgUoATk48ATYkAUErOCkBHUsBDDlMQAFBNB0kQg9OEFAsQSgjJTkMCggkTAgIBAEbP0AbLCg+HSQfIUY7CAYbBAE6Qi4UPiYGBAEMPDdMQAFBGCJJDUomRAY+MAFNPxkkSA9MJ0QIHCI2KUUKDyo+TCEoCiImTitJE1EvSTsgDCo7JzoKCAgBQSg5GCRFDz1MNQgfGiZNER9QEjJNIhUODApOITo4UCwcAVAgOCtQEy5FHypOFVItTA4nLA4mTU49KQ4BKCgmKxxEPQ4BLwwMMy4wSyhNPy0MJEtMOyoMAU9RUSwrNUkfHU8QDgFBSysfHlAmDhMyDAwPUDBGJClQMSU9KzwODAwzLjBLJDVIEypCK0EODAwICAEXTkQaPh4GBAEMJE43TEABQk9OUQ1DOxomRxFOGE8KITpPTzgODjQpTh9HEAwKCgYEAgEycGFja2FnZTpjb21waWxlci9zcmMva2VybmVsL25hdGl2ZV9iYXNpY19kYXRhLmRhcnRBc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMva2VybmVsL25vX3N1Y2hfbWV0aG9kX3Jlc29sdmVyLmRhcnSJUy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQyanMua2VybmVsLmVsZW1lbnRfbWFwOwoKY2xhc3MgS2VybmVsTm9TdWNoTWV0aG9kUmVzb2x2ZXIgaW1wbGVtZW50cyBOb1N1Y2hNZXRob2RSZXNvbHZlciB7CiAgZmluYWwgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBlbGVtZW50TWFwOwoKICBLZXJuZWxOb1N1Y2hNZXRob2RSZXNvbHZlcih0aGlzLmVsZW1lbnRNYXApOwoKICBFbGVtZW50RW52aXJvbm1lbnQgZ2V0IF9lbGVtZW50RW52aXJvbm1lbnQgPT4gZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQ7CgogIENvbW1vbkVsZW1lbnRzIGdldCBfY29tbW9uRWxlbWVudHMgPT4gZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNGb3J3YXJkaW5nU3ludGF4KEtGdW5jdGlvbiBtZXRob2QpIHsKICAgIGlyLlByb2NlZHVyZSBub2RlID0gZWxlbWVudE1hcC5fbG9va3VwUHJvY2VkdXJlKG1ldGhvZCk7CiAgICBpZiAobm9kZS5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5pc0VtcHR5KSByZXR1cm4gZmFsc2U7CiAgICBpci5WYXJpYWJsZURlY2xhcmF0aW9uIGZpcnN0UGFyYW1ldGVyID0KICAgICAgICBub2RlLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmZpcnN0OwogICAgaXIuU3RhdGVtZW50IGJvZHkgPSBub2RlLmZ1bmN0aW9uLmJvZHk7CiAgICBpci5FeHByZXNzaW9uIGV4cHI7CiAgICBpZiAoYm9keSBpcyBpci5CbG9jayAmJiBib2R5LnN0YXRlbWVudHMuaXNOb3RFbXB0eSkgewogICAgICBpci5CbG9jayBibG9jayA9IGJvZHk7CiAgICAgIGJvZHkgPSBibG9jay5zdGF0ZW1lbnRzLmZpcnN0OwogICAgfQogICAgaWYgKGJvZHkgaXMgaXIuUmV0dXJuU3RhdGVtZW50KSB7CiAgICAgIGV4cHIgPSBib2R5LmV4cHJlc3Npb247CiAgICB9CiAgICBpZiAoZXhwciBpcyBpci5Bc0V4cHJlc3Npb24gJiYKICAgICAgICBlbGVtZW50TWFwLmdldERhcnRUeXBlKGV4cHIudHlwZSkgPT0gX2NvbW1vbkVsZW1lbnRzLmR5bmFtaWNUeXBlKSB7CiAgICAgIGlyLkFzRXhwcmVzc2lvbiBhc0V4cHJlc3Npb24gPSBleHByOwogICAgICBleHByID0gYXNFeHByZXNzaW9uLm9wZXJhbmQ7CiAgICB9CiAgICBpZiAoZXhwciBpcyBpci5TdXBlck1ldGhvZEludm9jYXRpb24gJiYKICAgICAgICBleHByLm5hbWUubmFtZSA9PSBJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfKSB7CiAgICAgIGlyLkFyZ3VtZW50cyBhcmd1bWVudHMgPSBleHByLmFyZ3VtZW50czsKICAgICAgaWYgKGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA9PSAxICYmCiAgICAgICAgICBhcmd1bWVudHMubmFtZWQuaXNFbXB0eSAmJgogICAgICAgICAgYXJndW1lbnRzLnBvc2l0aW9uYWwuZmlyc3QgaXMgaXIuVmFyaWFibGVHZXQpIHsKICAgICAgICBpci5WYXJpYWJsZUdldCBnZXQgPSBhcmd1bWVudHMucG9zaXRpb25hbC5maXJzdDsKICAgICAgICByZXR1cm4gZ2V0LnZhcmlhYmxlID09IGZpcnN0UGFyYW1ldGVyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc1Rocm93aW5nU3ludGF4KEtGdW5jdGlvbiBtZXRob2QpIHsKICAgIGlyLlByb2NlZHVyZSBub2RlID0gZWxlbWVudE1hcC5fbG9va3VwUHJvY2VkdXJlKG1ldGhvZCk7CiAgICBpci5TdGF0ZW1lbnQgYm9keSA9IG5vZGUuZnVuY3Rpb24uYm9keTsKICAgIGlmIChib2R5IGlzIGlyLkJsb2NrICYmIGJvZHkuc3RhdGVtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgIGlyLkJsb2NrIGJsb2NrID0gYm9keTsKICAgICAgYm9keSA9IGJsb2NrLnN0YXRlbWVudHMuZmlyc3Q7CiAgICB9CiAgICBpci5FeHByZXNzaW9uIGV4cHI7CiAgICBpZiAoYm9keSBpcyBpci5SZXR1cm5TdGF0ZW1lbnQpIHsKICAgICAgZXhwciA9IGJvZHkuZXhwcmVzc2lvbjsKICAgIH0gZWxzZSBpZiAoYm9keSBpcyBpci5FeHByZXNzaW9uU3RhdGVtZW50KSB7CiAgICAgIGV4cHIgPSBib2R5LmV4cHJlc3Npb247CiAgICB9CiAgICByZXR1cm4gZXhwciBpcyBpci5UaHJvdzsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uRW50aXR5IGdldFN1cGVyTm9TdWNoTWV0aG9kKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0U3VwZXJOb1N1Y2hNZXRob2QobWV0aG9kLmVuY2xvc2luZ0NsYXNzKTsKICB9Cn0KSABOTjwBJAFDKwEvAU8BQwEMLz1CLDIsGDodJQYmHgYjTCsjBiw3Ly4lOjkvCAYSBAEMLT0sOh0lBhgmHjEeBh0EAQw/QwQCAThwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwvbm9fc3VjaF9tZXRob2RfcmVzb2x2ZXIuZGFydDtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9rZXJuZWwvZnJvbnRfZW5kX2FkYXB0ZXIuZGFydI8aLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBIZWxwZXIgY2xhc3NlcyBhbmQgbWV0aG9kcyB0byBhZGFwdCBiZXR3ZWVuIGBwYWNrYWdlOmNvbXBpbGVyYCBhbmQKLy8vIGBwYWNrYWdlOmZyb250X2VuZGAgQVBJcy4KbGlicmFyeSBjb21waWxlci5rZXJuZWwuZnJvbnRfZW5kX2FkYXB0ZXI7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgYXMgZmU7CgppbXBvcnQgJy4uLy4uL2NvbXBpbGVyX25ldy5kYXJ0JyBhcyBhcGk7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9pby9zb3VyY2VfZmlsZS5kYXJ0JzsKCi8vLyBBIGZyb250LWVuZHMncyBbRmlsZVN5c3RlbV0gdGhhdCB1c2VzIGRhcnQyanMncyBbYXBpLkNvbXBpbGVySW5wdXRdLgpjbGFzcyBDb21waWxlckZpbGVTeXN0ZW0gaW1wbGVtZW50cyBmZS5GaWxlU3lzdGVtIHsKICBmaW5hbCBhcGkuQ29tcGlsZXJJbnB1dCBpbnB1dFByb3ZpZGVyOwoKICBDb21waWxlckZpbGVTeXN0ZW0odGhpcy5pbnB1dFByb3ZpZGVyKTsKCiAgQG92ZXJyaWRlCiAgZmUuRmlsZVN5c3RlbUVudGl0eSBlbnRpdHlGb3JVcmkoVXJpIHVyaSkgewogICAgaWYgKHVyaS5zY2hlbWUgPT0gJ2RhdGEnKSB7CiAgICAgIHJldHVybiBuZXcgZmUuRGF0YUZpbGVTeXN0ZW1FbnRpdHkoVXJpLmJhc2UucmVzb2x2ZVVyaSh1cmkpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgX0NvbXBpbGVyRmlsZVN5c3RlbUVudGl0eSh1cmksIHRoaXMpOwogICAgfQogIH0KfQoKY2xhc3MgX0NvbXBpbGVyRmlsZVN5c3RlbUVudGl0eSBpbXBsZW1lbnRzIGZlLkZpbGVTeXN0ZW1FbnRpdHkgewogIEBvdmVycmlkZQogIGZpbmFsIFVyaSB1cmk7CiAgZmluYWwgQ29tcGlsZXJGaWxlU3lzdGVtIGZzOwoKICBfQ29tcGlsZXJGaWxlU3lzdGVtRW50aXR5KHRoaXMudXJpLCB0aGlzLmZzKTsKCiAgQG92ZXJyaWRlCiAgRnV0dXJlPFN0cmluZz4gcmVhZEFzU3RyaW5nKCkgYXN5bmMgewogICAgYXBpLklucHV0IGlucHV0OwogICAgdHJ5IHsKICAgICAgaW5wdXQgPSBhd2FpdCBmcy5pbnB1dFByb3ZpZGVyCiAgICAgICAgICAucmVhZEZyb21VcmkodXJpLCBpbnB1dEtpbmQ6IGFwaS5JbnB1dEtpbmQuVVRGOCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHRocm93IG5ldyBmZS5GaWxlU3lzdGVtRXhjZXB0aW9uKHVyaSwgJyRlJyk7CiAgICB9CiAgICBpZiAoaW5wdXQgPT0gbnVsbCkgdGhyb3cgbmV3IGZlLkZpbGVTeXN0ZW1FeGNlcHRpb24odXJpLCAiRmlsZSBub3QgZm91bmQiKTsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IHRlY2huaWNhbGx5IHNvbWVvbmUgY291bGQgcHJvdmlkZSBkYXJ0MmpzIHdpdGggYW4gaW5wdXQKICAgIC8vIHRoYXQgaXMgbm90IGEgU291cmNlRmlsZS4gTm90ZSB0aGF0IHRoaXMgYXNzdW1wdGlvbiBpcyBhbHNvIGRvbmUgaW4gdGhlCiAgICAvLyAobm9uLWtlcm5lbCkgU2NyaXB0TG9hZGVyLgogICAgU291cmNlRmlsZSBmaWxlID0gaW5wdXQgYXMgU291cmNlRmlsZTsKICAgIHJldHVybiBmaWxlLnNsb3dUZXh0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBGdXR1cmU8TGlzdDxpbnQ+PiByZWFkQXNCeXRlcygpIGFzeW5jIHsKICAgIGFwaS5JbnB1dCBpbnB1dDsKICAgIHRyeSB7CiAgICAgIGlucHV0ID0gYXdhaXQgZnMuaW5wdXRQcm92aWRlcgogICAgICAgICAgLnJlYWRGcm9tVXJpKHVyaSwgaW5wdXRLaW5kOiBhcGkuSW5wdXRLaW5kLmJpbmFyeSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHRocm93IG5ldyBmZS5GaWxlU3lzdGVtRXhjZXB0aW9uKHVyaSwgJyRlJyk7CiAgICB9CiAgICBpZiAoaW5wdXQgPT0gbnVsbCkgdGhyb3cgbmV3IGZlLkZpbGVTeXN0ZW1FeGNlcHRpb24odXJpLCAiRmlsZSBub3QgZm91bmQiKTsKICAgIHJldHVybiBpbnB1dC5kYXRhOwogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPGJvb2w+IGV4aXN0cygpIGFzeW5jIHsKICAgIHRyeSB7CiAgICAgIGFwaS5JbnB1dCBpbnB1dCA9IGF3YWl0IGZzLmlucHV0UHJvdmlkZXIKICAgICAgICAgIC5yZWFkRnJvbVVyaSh1cmksIGlucHV0S2luZDogYXBpLklucHV0S2luZC5iaW5hcnkpOwogICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbDsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KfQoKLy8vIFJlcG9ydCBhIFttZXNzYWdlXSByZWNlaXZlZCBmcm9tIHRoZSBmcm9udC1lbmQsIHVzaW5nIGRhcnQyanMncwovLy8gW0RpYWdub3N0aWNSZXBvcnRlcl0uCnZvaWQgcmVwb3J0RnJvbnRFbmRNZXNzYWdlKAogICAgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyLCBmZS5EaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgU3Bhbm5hYmxlIF9nZXRTcGFubmFibGUoZmUuRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSkgewogICAgVXJpIHVyaSA9IGZlLmdldE1lc3NhZ2VVcmkobWVzc2FnZSk7CiAgICBpbnQgb2Zmc2V0ID0gZmUuZ2V0TWVzc2FnZUNoYXJPZmZzZXQobWVzc2FnZSk7CiAgICBpbnQgbGVuZ3RoID0gZmUuZ2V0TWVzc2FnZUxlbmd0aChtZXNzYWdlKTsKICAgIGlmICh1cmkgIT0gbnVsbCAmJiBvZmZzZXQgIT0gLTEpIHsKICAgICAgcmV0dXJuIG5ldyBTb3VyY2VTcGFuKHVyaSwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRTsKICAgIH0KICB9CgogIERpYWdub3N0aWNNZXNzYWdlIF9jb252ZXJ0TWVzc2FnZShmZS5EaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBTcGFubmFibGUgc3BhbiA9IF9nZXRTcGFubmFibGUobWVzc2FnZSk7CiAgICBTdHJpbmcgdGV4dCA9IGZlLmdldE1lc3NhZ2VIZWFkZXJUZXh0KG1lc3NhZ2UpOwogICAgcmV0dXJuIHJlcG9ydGVyLmNyZWF0ZU1lc3NhZ2Uoc3BhbiwgTWVzc2FnZUtpbmQuR0VORVJJQywgeyd0ZXh0JzogdGV4dH0pOwogIH0KCiAgTGlzdDxmZS5EaWFnbm9zdGljTWVzc2FnZT4gcmVsYXRlZEluZm9ybWF0aW9uID0KICAgICAgZmUuZ2V0TWVzc2FnZVJlbGF0ZWRJbmZvcm1hdGlvbihtZXNzYWdlKTsKICBEaWFnbm9zdGljTWVzc2FnZSBtYWluTWVzc2FnZSA9IF9jb252ZXJ0TWVzc2FnZShtZXNzYWdlKTsKICBMaXN0PERpYWdub3N0aWNNZXNzYWdlPiBpbmZvcyA9IHJlbGF0ZWRJbmZvcm1hdGlvbiAhPSBudWxsCiAgICAgID8gcmVsYXRlZEluZm9ybWF0aW9uLm1hcChfY29udmVydE1lc3NhZ2UpLnRvTGlzdCgpCiAgICAgIDogY29uc3QgW107CiAgc3dpdGNoIChtZXNzYWdlLnNldmVyaXR5KSB7CiAgICBjYXNlIGZlLlNldmVyaXR5LmludGVybmFsUHJvYmxlbToKICAgICAgdGhyb3cgbWFpbk1lc3NhZ2UubWVzc2FnZS5jb21wdXRlTWVzc2FnZSgpOwogICAgY2FzZSBmZS5TZXZlcml0eS5lcnJvcjoKICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3IobWFpbk1lc3NhZ2UsIGluZm9zKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIGZlLlNldmVyaXR5Lndhcm5pbmc6CiAgICAgIHJlcG9ydGVyLnJlcG9ydFdhcm5pbmcobWFpbk1lc3NhZ2UsIGluZm9zKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCd1bmhhbmRsZWQgc2V2ZXJpdHkgJHttZXNzYWdlLnNldmVyaXR5fScpOwogIH0KfQp8AE5OPAFHHisBFQFAASkBGSEBSTQpASoBDC4gRA03BgQCAUEMER8BMAEMKBUKJTwSMwZQTk8iKxwEAQwqFQolPhIzBlAXBAEMIAovPhwSFAYEAgFEGhxBOikzLyc7DSQGBAFELTROBAEyMDw9ORIeJjIcMA0eMg0NTgQCATJwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwvZnJvbnRfZW5kX2FkYXB0ZXIuZGFydCpzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9jbG9zdXJlLmRhcnS4+S8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdjb21tb24uZGFydCc7CmltcG9ydCAnZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnanNfbW9kZWwvY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICdqc19tb2RlbC9lbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICdzZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24uZGFydCc7CgovLy8gQ2xhc3MgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBmb3IgaG93IGNsb3N1cmVzIGFyZSByZXdyaXR0ZW4vcmVwcmVzZW50ZWQKLy8vIHRvIHByZXNlcnZlIERhcnQgc2VtYW50aWNzIHdoZW4gY29tcGlsZWQgdG8gSmF2YVNjcmlwdC4gR2l2ZW4gYSBwYXJ0aWN1bGFyCi8vLyBub2RlIHRvIGxvb2sgdXAsIGl0IHJldHVybnMgYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24KLy8vIG9mIGhvdyBjbG9zdXJlIGNvbnZlcnNpb24gaXMgaW1wbGVtZW50ZWQuIFQgaXMgYW4gaXIuTm9kZSBvciBOb2RlLgphYnN0cmFjdCBjbGFzcyBDbG9zdXJlRGF0YSB7CiAgLy8vIERlc2VyaWFsaXplcyBhIFtDbG9zdXJlRGF0YV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBDbG9zdXJlRGF0YS5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgICAgICBKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLCBEYXRhU291cmNlIHNvdXJjZSkgPQogICAgICBDbG9zdXJlRGF0YUltcGwucmVhZEZyb21EYXRhU291cmNlOwoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtDbG9zdXJlRGF0YV0gdG8gW3NpbmtdLgogIHZvaWQgd3JpdGVUb0RhdGFTaW5rKERhdGFTaW5rIHNpbmspOwoKICAvLy8gTG9vayB1cCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaWFibGVzIHRoYXQgaGF2ZSBiZWVuIG11dGF0ZWQgYW5kIGFyZQogIC8vLyB1c2VkIGluc2lkZSB0aGUgc2NvcGUgb2YgW25vZGVdLgogIFNjb3BlSW5mbyBnZXRTY29wZUluZm8oTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIENsb3N1cmVSZXByZXNlbnRhdGlvbkluZm8gZ2V0Q2xvc3VyZUluZm8oaXIuTG9jYWxGdW5jdGlvbiBsb2NhbEZ1bmN0aW9uKTsKCiAgLy8vIExvb2sgdXAgaW5mb3JtYXRpb24gYWJvdXQgYSBsb29wLCBpbiBjYXNlIGFueSB2YXJpYWJsZXMgaXQgZGVjbGFyZXMgbmVlZAogIC8vLyB0byBiZSBib3hlZC9zbmFwc2hvdHRlZC4KICBDYXB0dXJlZExvb3BTY29wZSBnZXRDYXB0dXJlZExvb3BTY29wZShpci5Ob2RlIGxvb3BOb2RlKTsKCiAgLy8vIEFjY2Vzc29yIHRvIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBzY29wZXMgdGhhdCBjbG9zdXJlcyBjYXB0dXJlLiBVc2VkIGJ5CiAgLy8vIHRoZSBTU0EgYnVpbGRlci4KICBDYXB0dXJlZFNjb3BlIGdldENhcHR1cmVkU2NvcGUoTWVtYmVyRW50aXR5IGVudGl0eSk7Cn0KCi8vLyBFbnVtIHVzZWQgZm9yIGlkZW50aWZ5aW5nIFtTY29wZUluZm9dIHN1YmNsYXNzZXMgaW4gc2VyaWFsaXphdGlvbi4KZW51bSBTY29wZUluZm9LaW5kIHsKICBzY29wZUluZm8sCiAgY2FwdHVyZWRTY29wZSwKICBjYXB0dXJlZExvb3BTY29wZSwKICBjbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvLAp9CgovLy8gQ2xhc3MgdGhhdCByZXByZXNlbnRzIG9uZSBsZXZlbCBvZiBzY29waW5nIGluZm9ybWF0aW9uLCB3aGV0aGVyIHRoaXMgc2NvcGUKLy8vIGlzIGEgY2xvc3VyZSBvciBub3QuIFRoaXMgaXMgc3BlY2lmaWNhbGx5IHVzZWQgdG8gc3RvcmUgaW5mb3JtYXRpb24KLy8vIGFib3V0IHRoZSB1c2FnZSBvZiB2YXJpYWJsZXMgaW4gdHJ5IG9yIHN5bmMgYmxvY2tzLCBiZWNhdXNlIHRoZXkgbmVlZCB0byBiZQovLy8gYm94ZWQuCi8vLwovLy8gVmFyaWFibGVzIHRoYXQgYXJlIHVzZWQgaW4gYSB0cnkgbXVzdCBiZSB0cmVhdGVkIGFzIGJveGVkIGJlY2F1c2UgdGhlCi8vLyBjb250cm9sIGZsb3cgY2FuIGJlIG5vbi1saW5lYXIuIEFsc28gcGFyYW1ldGVycyB0byBhIGBzeW5jKmAgZ2VuZXJhdG9yIG11c3QKLy8vIGJlIGJveGVkLCBiZWNhdXNlIG9mIHRoZSB3YXkgd2UgcmV3cml0ZSBzeW5jKiBmdW5jdGlvbnMuIFNlZSBhbHNvIGNvbW1lbnRzCi8vLyBpbiBbQ2xvc3VyZUNsYXNzTWFwLnVzZUxvY2FsXS4KY2xhc3MgU2NvcGVJbmZvIHsKICBjb25zdCBTY29wZUluZm8oKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtTY29wZUluZm9dIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgU2NvcGVJbmZvLnJlYWRGcm9tRGF0YVNvdXJjZShEYXRhU291cmNlIHNvdXJjZSkgewogICAgU2NvcGVJbmZvS2luZCBraW5kID0gc291cmNlLnJlYWRFbnVtKFNjb3BlSW5mb0tpbmQudmFsdWVzKTsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIFNjb3BlSW5mb0tpbmQuc2NvcGVJbmZvOgogICAgICAgIHJldHVybiBuZXcgSnNTY29wZUluZm8ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICAgIGNhc2UgU2NvcGVJbmZvS2luZC5jYXB0dXJlZFNjb3BlOgogICAgICAgIHJldHVybiBuZXcgSnNDYXB0dXJlZFNjb3BlLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIFNjb3BlSW5mb0tpbmQuY2FwdHVyZWRMb29wU2NvcGU6CiAgICAgICAgcmV0dXJuIG5ldyBKc0NhcHR1cmVkTG9vcFNjb3BlLnJlYWRGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICBjYXNlIFNjb3BlSW5mb0tpbmQuY2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbzoKICAgICAgICByZXR1cm4gbmV3IEtlcm5lbENsb3N1cmVDbGFzc0luZm8ucmVhZEZyb21EYXRhU291cmNlKHNvdXJjZSk7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignVW5leHBlY3RlZCBTY29wZUluZm9LaW5kICRraW5kJyk7CiAgfQoKICAvLy8gU2VyaWFsaXplcyB0aGlzIFtTY29wZUluZm9dIHRvIFtzaW5rXS4KICB2b2lkIHdyaXRlVG9EYXRhU2luayhEYXRhU2luayBzaW5rKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignJHtydW50aW1lVHlwZX0ud3JpdGVUb0RhdGFTaW5rJyk7CiAgfQoKICAvLy8gQ29udmVuaWVuY2UgcmVmZXJlbmNlIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnQgcmVwcmVzZW50aW5nIGB0aGlzYC4KICAvLy8gSWYgdGhpcyBzY29wZSBpcyBub3QgaW4gYW4gaW5zdGFuY2UgbWVtYmVyLCBpdCB3aWxsIGJlIG51bGwuCiAgTG9jYWwgZ2V0IHRoaXNMb2NhbCA9PiBudWxsOwoKICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgW3ZhcmlhYmxlXSBpcyB1c2VkIGluc2lkZSBhIGB0cnlgIGJsb2NrIG9yIGEgYHN5bmMqYAogIC8vLyBnZW5lcmF0b3IgKHRoaXMgaXMgaW1wb3J0YW50IHRvIGtub3cgYmVjYXVzZSBib3hpbmcvcmVkaXJlY3Rpb24gbmVlZHMgdG8KICAvLy8gaGFwcGVuIGZvciB0aG9zZSBsb2NhbCB2YXJpYWJsZXMpLgogIC8vLwogIC8vLyBWYXJpYWJsZXMgdGhhdCBhcmUgdXNlZCBpbiBhIHRyeSBtdXN0IGJlIHRyZWF0ZWQgYXMgYm94ZWQgYmVjYXVzZSB0aGUKICAvLy8gY29udHJvbCBmbG93IGNhbiBiZSBub24tbGluZWFyLgogIC8vLwogIC8vLyBBbHNvIHBhcmFtZXRlcnMgdG8gYSBgc3luYypgIGdlbmVyYXRvciBtdXN0IGJlIGJveGVkLCBiZWNhdXNlIG9mIHRoZSB3YXkKICAvLy8gd2UgcmV3cml0ZSBzeW5jKiBmdW5jdGlvbnMuIFNlZSBhbHNvIGNvbW1lbnRzIGluCiAgLy8vIFtDbG9zdXJlQ2xhc3NNYXAudXNlTG9jYWxdLgogIGJvb2wgbG9jYWxJc1VzZWRJblRyeU9yU3luYyhMb2NhbCB2YXJpYWJsZSkgPT4gZmFsc2U7CgogIC8vLyBMb29wIHRocm91Z2ggZWFjaCB2YXJpYWJsZSB0aGF0IGhhcyBiZWVuIGRlZmluZWQgaW4gdGhpcyBzY29wZSwgbW9kaWZpZWQKICAvLy8gYW55d2hlcmUgKHRoaXMgc2NvcGUgb3IgYW5vdGhlciBzY29wZSkgYW5kIHVzZWQgaW4gYW5vdGhlciBzY29wZS4gQmVjYXVzZQogIC8vLyBpdCBpcyB1c2VkIGluIGFub3RoZXIgc2NvcGUsIHRoZXNlIHZhcmlhYmxlcyBuZWVkIHRvIGJlICJib3hlZCIsIGNyZWF0aW5nCiAgLy8vIGEgdGhpbiB3cmFwcGVyIGFyb3VuZCBhY2Nlc3NlcyB0byB0aGVzZSB2YXJpYWJsZXMgc28gdGhhdCBhY2Nlc3NlcyBnZXQKICAvLy8gdGhlIGNvcnJlY3QgdXBkYXRlZCB2YWx1ZS4gVGhlIHZhcmlhYmxlcyBpbiBsb2NhbHNVc2VkSW5UcnlPclN5bmMgbWF5CiAgLy8vIGJlIGluY2x1ZGVkIGluIHRoaXMgc2V0LgogIC8vLwogIC8vLyBJbiB0aGUgY2FzZSBvZiBsb29wcywgdGhpcyBpcyB0aGUgc2V0IG9mIGl0ZXJhdGlvbiB2YXJpYWJsZXMgKG9yIGFueQogIC8vLyB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhlIGZvciBsb29wIGV4cHJlc3Npb24gKGBmb3IgKC4uLmhlcmUuLi4pYCkgdGhhdAogIC8vLyBuZWVkIHRvIGJlIGJveGVkIHRvIHNuYXBzaG90IHRoZWlyIHZhbHVlLgogIHZvaWQgZm9yRWFjaEJveGVkVmFyaWFibGUoZihMb2NhbCBsb2NhbCwgRmllbGRFbnRpdHkgZmllbGQpKSB7fQoKICAvLy8gVHJ1ZSBpZiBbdmFyaWFibGVdIGhhcyBiZWVuIG11dGF0ZWQgYW5kIGlzIGFsc28gdXNlZCBpbiBhbm90aGVyIHNjb3BlLgogIGJvb2wgaXNCb3hlZFZhcmlhYmxlKExvY2FsIHZhcmlhYmxlKSA9PiBmYWxzZTsKfQoKLy8vIENsYXNzIHJlcHJlc2VudGluZyB0aGUgdXNhZ2Ugb2YgYSBzY29wZSB0aGF0IGhhcyBiZWVuIGNhcHR1cmVkIGluIHRoZQovLy8gY29udGV4dCBvZiBhIGNsb3N1cmUuCmNsYXNzIENhcHR1cmVkU2NvcGUgZXh0ZW5kcyBTY29wZUluZm8gewogIGNvbnN0IENhcHR1cmVkU2NvcGUoKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtDYXB0dXJlZFNjb3BlXSBvYmplY3QgZnJvbSBbc291cmNlXS4KICBmYWN0b3J5IENhcHR1cmVkU2NvcGUucmVhZEZyb21EYXRhU291cmNlKERhdGFTb3VyY2Ugc291cmNlKSB7CiAgICBTY29wZUluZm9LaW5kIGtpbmQgPSBzb3VyY2UucmVhZEVudW0oU2NvcGVJbmZvS2luZC52YWx1ZXMpOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgU2NvcGVJbmZvS2luZC5zY29wZUluZm86CiAgICAgIGNhc2UgU2NvcGVJbmZvS2luZC5jbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvOgogICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVbmV4cGVjdGVkIENhcHR1cmVkU2NvcGUga2luZCAka2luZCcpOwogICAgICBjYXNlIFNjb3BlSW5mb0tpbmQuY2FwdHVyZWRTY29wZToKICAgICAgICByZXR1cm4gbmV3IEpzQ2FwdHVyZWRTY29wZS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgY2FzZSBTY29wZUluZm9LaW5kLmNhcHR1cmVkTG9vcFNjb3BlOgogICAgICAgIHJldHVybiBuZXcgSnNDYXB0dXJlZExvb3BTY29wZS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVbmV4cGVjdGVkIFNjb3BlSW5mb0tpbmQgJGtpbmQnKTsKICB9CgogIC8vLyBJZiB0cnVlLCB0aGlzIGNsb3N1cmUgYWNjZXNzZXMgYSB2YXJpYWJsZSB0aGF0IHdhcyBkZWZpbmVkIGluIGFuIG91dHNpZGUKICAvLy8gc2NvcGUgYW5kIHRoaXMgdmFyaWFibGUgZ2V0cyBtb2RpZmllZCBhdCBzb21lIHBvaW50IChzb21ldGltZXMgd2Ugc2F5IHRoYXQKICAvLy8gdmFyaWFibGUgaGFzIGJlZW4gImNhcHR1cmVkIikuIEluIHRoaXMgc2l0dWF0aW9uLCBhY2Nlc3MgdG8gdGhpcyB2YXJpYWJsZQogIC8vLyBpcyBjb250cm9sbGVkIHZpYSBhIHdyYXBwZXIgKGJveCkgc28gdGhhdCB1cGRhdGVzIHRvIHRoaXMgdmFyaWFibGUKICAvLy8gYXJlIGRvbmUgaW4gYSB3YXkgdGhhdCBpcyBpbiBsaW5lIHdpdGggRGFydCdzIGNsb3N1cmUgcnVsZXMuCiAgYm9vbCBnZXQgcmVxdWlyZXNDb250ZXh0Qm94ID0+IGZhbHNlOwoKICAvLy8gQWNjZXNzb3IgdG8gdGhlIGxvY2FsIGVudmlyb25tZW50IGluIHdoaWNoIGEgcGFydGljdWxhciBjbG9zdXJlIG5vZGUgaXMKICAvLy8gZXhlY3V0ZWQuIFRoaXMgd2lsbCBlbmNhcHN1bGF0ZSB0aGUgdmFsdWUgb2YgYW55IHZhcmlhYmxlcyB0aGF0IGhhdmUgYmVlbgogIC8vLyBzY29wZWQgaW50byB0aGlzIGNvbnRleHQgZnJvbSBvdXRzaWRlLiBUaGlzIGlzIGFuIGFjY2Vzc29yIHRvIHRoZQogIC8vLyBjb250ZXh0Qm94IHRoYXQgW3JlcXVpcmVzQ29udGV4dEJveF0gaXMgdGVzdGluZyBpcyByZXF1aXJlZC4KICBMb2NhbCBnZXQgY29udGV4dCA9PiBudWxsOwp9CgovLy8gQ2xhc3MgdGhhdCBkZXNjcmliZXMgdGhlIGFjdHVhbCBtZWNoYW5pY3Mgb2YgaG93IHZhbHVlcyBvZiB2YXJpYWJsZXMKLy8vIGluc3RhbnRpYXRlZCBpbiBhIGxvb3AgYXJlIGNhcHR1cmVkIGluc2lkZSBjbG9zdXJlcyBpbiB0aGUgbG9vcCBib2R5LgovLy8gVW5saWtlIEpTLCB0aGUgdmFsdWUgb2YgYSBkZWNsYXJlZCBsb29wIGl0ZXJhdGlvbiB2YXJpYWJsZSBpbiBhbnkgY2xvc3VyZQovLy8gaXMgY2FwdHVyZWQvc25hcHNob3R0ZWQgaW5zaWRlIGF0IGVhY2ggaXRlcmF0aW9uIHBvaW50LCBhcyBpZiB3ZSBjcmVhdGVkIGEKLy8vIG5ldyBsb2NhbCB2YXJpYWJsZSBmb3IgdGhhdCB2YWx1ZSBpbnNpZGUgdGhlIGxvb3AuIEZvciBleGFtcGxlLCBmb3IgdGhlCi8vLyBmb2xsb3dpbmcgbG9vcDoKLy8vCi8vLyAgICAgdmFyIGxzdCA9IFtdOwovLy8gICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSBsc3QuYWRkKCgpPT5pKTsKLy8vICAgICB2YXIgcmVzdWx0ID0gbGlzdC5tYXAoKGYpID0+IGYoKSkudG9MaXN0KCk7Ci8vLwovLy8gYHJlc3VsdGAgd2lsbCBiZSBbMCwgMSwgMiwgMywgNF0sIHdoZXJlYXMgd2VyZSB0aGlzIEpTIGNvZGUKLy8vIHRoZSByZXN1bHQgd291bGQgYmUgWzUsIDUsIDUsIDUsIDVdLiBCZWNhdXNlIG9mIHRoaXMgZGlmZmVyZW5jZSB3ZSBuZWVkIHRvCi8vLyBjcmVhdGUgYSBjbG9zdXJlIGZvciB0aGVzZSBzb3J0cyBvZiBsb29wcyB0byBjYXB0dXJlIHRoZSB2YXJpYWJsZSdzIHZhbHVlIGF0Ci8vLyBlYWNoIGl0ZXJhdGlvbiwgYnkgYm94aW5nIHRoZSBpdGVyYXRpb24gdmFyaWFibGVbc10uCmNsYXNzIENhcHR1cmVkTG9vcFNjb3BlIGV4dGVuZHMgQ2FwdHVyZWRTY29wZSB7CiAgY29uc3QgQ2FwdHVyZWRMb29wU2NvcGUoKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtDYXB0dXJlZExvb3BTY29wZV0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBDYXB0dXJlZExvb3BTY29wZS5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIFNjb3BlSW5mb0tpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShTY29wZUluZm9LaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBTY29wZUluZm9LaW5kLnNjb3BlSW5mbzoKICAgICAgY2FzZSBTY29wZUluZm9LaW5kLmNsb3N1cmVSZXByZXNlbnRhdGlvbkluZm86CiAgICAgIGNhc2UgU2NvcGVJbmZvS2luZC5jYXB0dXJlZFNjb3BlOgogICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVbmV4cGVjdGVkIENhcHR1cmVkTG9vcFNjb3BlIGtpbmQgJGtpbmQnKTsKICAgICAgY2FzZSBTY29wZUluZm9LaW5kLmNhcHR1cmVkTG9vcFNjb3BlOgogICAgICAgIHJldHVybiBuZXcgSnNDYXB0dXJlZExvb3BTY29wZS5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVbmV4cGVjdGVkIFNjb3BlSW5mb0tpbmQgJGtpbmQnKTsKICB9CgogIC8vLyBUcnVlIGlmIHRoaXMgbG9vcCBzY29wZSBkZWNsYXJlcyBpbiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgbG9vcAogIC8vLyBgZm9yICg8aGVyZT47Li4uOy4uLilgIGFueSB2YXJpYWJsZXMgdGhhdCBuZWVkIHRvIGJlIGJveGVkLgogIGJvb2wgZ2V0IGhhc0JveGVkTG9vcFZhcmlhYmxlcyA9PiBmYWxzZTsKCiAgLy8vIFRoZSBzZXQgb2YgaXRlcmF0aW9uIHZhcmlhYmxlcyAob3IgdmFyaWFibGVzIGRlY2xhcmVkIGluIHRoZSBmb3IgbG9vcAogIC8vLyBleHByZXNzaW9uIChgZm9yICg8aGVyZT47IC4uLiA7IC4uLilgKSB0aGF0IG5lZWQgdG8gYmUgYm94ZWQgdG8gc25hcHNob3QKICAvLy8gdGhlaXIgdmFsdWUuIFRoZXNlIHZhcmlhYmxlcyBhcmUgYWxzbyBpbmNsdWRlZCBpbiB0aGUgc2V0IG9mCiAgLy8vIGBmb3JFYWNoQm94ZWRWYXJpYWJsZWAgbWV0aG9kLiBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGVzZSB0d28gc2V0cyBpcwogIC8vLyBpbiB0aGlzIGV4YW1wbGU6CiAgLy8vCiAgLy8vICAgICBydW4oZikgPT4gZigpOwogIC8vLyAgICAgdmFyIGE7CiAgLy8vICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewogIC8vLyAgICAgICB2YXIgYiA9IDM7CiAgLy8vICAgICAgIGEgPSAoKSA9PiBiID0gaTsKICAvLy8gICAgIH0KICAvLy8KICAvLy8gYGlgIHdvdWxkIGJlIGEgcGFydCBvZiB0aGUgYm94ZWRMb29wVmFyaWFibGVzIEFORCBib3hlZFZhcmlhYmxlcywgYnV0IGIKICAvLy8gd291bGQgb25seSBiZSBhIHBhcnQgb2YgYm94ZWRWYXJpYWJsZXMuCiAgTGlzdDxMb2NhbD4gZ2V0IGJveGVkTG9vcFZhcmlhYmxlcyA9PiBjb25zdCA8TG9jYWw+W107Cn0KCi8vLyBDbGFzcyB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0dWFsIG1lY2hhbmljcyBvZiBob3cgdGhlIGNvbnZlcnRlZCwgcmV3cml0dGVuCi8vLyBjbG9zdXJlIGlzIGltcGxlbWVudGVkLiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBmb2xsb3dpbmcgY2xvc3VyZSAobmFtZWQgZm9vCi8vLyBmb3IgY29udmVuaWVuY2UpOgovLy8KLy8vICAgdmFyIGZvbyA9ICh4KSA9PiB5ICsgeDsKLy8vCi8vLyBXZSB3b3VsZCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgY2xhc3MgdG8gY29udHJvbCBhY2Nlc3MgdG8gdGhlc2UgdmFyaWFibGVzIGluCi8vLyB0aGUgZm9sbG93aW5nIHdheSAobW9kdWxvIG5hbWluZyBvZiB2YXJpYWJsZXMsIGFzc3VtaW5nIHRoYXQgeSBpcyBtb2RpZmllZAovLy8gZWxzZXdoZXJlIGluIGl0cyBzY29wZSk6Ci8vLwovLy8gICAgY2xhc3MgRm9vQ2xvc3VyZSB7Ci8vLyAgICAgICBpbnQgeTsKLy8vICAgICAgIEZvb0Nsb3N1cmUodGhpcy55KTsKLy8vICAgICAgIGNhbGwoeCkgPT4gdGhpcy55ICsgeDsKLy8vICAgIH0KLy8vCi8vLyAgYW5kIHRoZW4gdG8gZXhlY3V0ZSB0aGlzIGNsb3N1cmUsIGZvciBleGFtcGxlOgovLy8KLy8vICAgICB2YXIgZm9vID0gbmV3IEZvb0Nsb3N1cmUoMSk7Ci8vLyAgICAgZm9vLmNhbGwoMik7Ci8vLwovLy8gaWYgYHlgIGlzIG1vZGlmaWVkIGVsc2V3aGVyZSB3aXRoaW4gaXRzIHNjb3BlLCBhY2Nlc3NlcyB0byB5IGFueXdoZXJlIGluIHRoZQovLy8gY29kZSB3aWxsIGJlIGNvbnRyb2xsZWQgdmlhIGEgYm94IG9iamVjdC4KLy8vCi8vLyBCZWNhdXNlIGluIHRoZXNlIGV4YW1wbGVzIGB5YCB3YXMgZGVjbGFyZWQgaW4gc29tZSBvdGhlciwgb3V0ZXIgc2NvcGUsIGJ1dAovLy8gdXNlZCBpbiB0aGUgaW5uZXIgc2NvcGUgb2YgdGhpcyBjbG9zdXJlLCB3ZSBzYXkgYHlgIGlzIGEgImNhcHR1cmVkIgovLy8gdmFyaWFibGUuCi8vLyBUT0RPKGVmb3J0dW5hKTogTWFrZSBpbnRlcmZhY2Ugc2ltcGxlciBpbiBzdWJzZXF1ZW50IHJlZmFjdG9yaW5ncy4KY2xhc3MgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbyBleHRlbmRzIFNjb3BlSW5mbyB7CiAgY29uc3QgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbygpOwoKICAvLy8gRGVzZXJpYWxpemVzIGEgW0Nsb3N1cmVSZXByZXNlbnRhdGlvbkluZm9dIG9iamVjdCBmcm9tIFtzb3VyY2VdLgogIGZhY3RvcnkgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mby5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIFNjb3BlSW5mb0tpbmQga2luZCA9IHNvdXJjZS5yZWFkRW51bShTY29wZUluZm9LaW5kLnZhbHVlcyk7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBTY29wZUluZm9LaW5kLnNjb3BlSW5mbzoKICAgICAgY2FzZSBTY29wZUluZm9LaW5kLmNhcHR1cmVkU2NvcGU6CiAgICAgIGNhc2UgU2NvcGVJbmZvS2luZC5jYXB0dXJlZExvb3BTY29wZToKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbyBraW5kICRraW5kJyk7CiAgICAgIGNhc2UgU2NvcGVJbmZvS2luZC5jbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvOgogICAgICAgIHJldHVybiBuZXcgS2VybmVsQ2xvc3VyZUNsYXNzSW5mby5yZWFkRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVbmV4cGVjdGVkIFNjb3BlSW5mb0tpbmQgJGtpbmQnKTsKICB9CgogIC8vLyBUaGUgb3JpZ2luYWwgbG9jYWwgZnVuY3Rpb24gYmVmb3JlIGFueSB0cmFuc2xhdGlvbi4KICAvLy8KICAvLy8gV2lsbCBiZSBudWxsIGZvciBtZXRob2RzLgogIExvY2FsIGdldCBjbG9zdXJlRW50aXR5ID0+IG51bGw7CgogIC8vLyBUaGUgZW50aXR5IGZvciB0aGUgY2xhc3MgdXNlZCB0byByZXByZXNlbnQgdGhlIHJld3JpdHRlbiBjbG9zdXJlIGluIHRoZQogIC8vLyBlbWl0dGVkIEphdmFTY3JpcHQuCiAgLy8vCiAgLy8vIENsb3N1cmVzIGFyZSByZXdyaXR0ZW4gaW4gdGhlIGZvcm0gb2YgY2xhc3NlcyB0aGF0IGhhdmUgZmllbGRzIHRvIGNvbnRyb2wKICAvLy8gdGhlIHJlZGlyZWN0aW9uIGFuZCBlZGl0aW5nIG9mIGNhcHR1cmVkIHZhcmlhYmxlcy4KICBDbGFzc0VudGl0eSBnZXQgY2xvc3VyZUNsYXNzRW50aXR5ID0+IG51bGw7CgogIC8vLyBUaGUgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSBbbG9jYWxdIGZ1bmN0aW9uIGFzIGEgYGNhbGxgIG1ldGhvZCBvbgogIC8vLyB0aGUgY2xvc3VyZSBjbGFzcy4KICBGdW5jdGlvbkVudGl0eSBnZXQgY2FsbE1ldGhvZCA9PiBudWxsOwoKICAvLy8gVGhlIHNpZ25hdHVyZSBtZXRob2QgZm9yIFtjYWxsTWV0aG9kXSBpZiBuZWVkZWQuCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IHNpZ25hdHVyZU1ldGhvZCA9PiBudWxsOwoKICAvLy8gTGlzdCBvZiBsb2NhbHMgdGhhdCB0aGlzIGNsb3N1cmUgY2xhc3MgaGFzIGNyZWF0ZWQgY29ycmVzcG9uZGluZyBmaWVsZAogIC8vLyBlbnRpdGllcyBmb3IuCiAgQGRlcHJlY2F0ZWQKICBMaXN0PExvY2FsPiBnZXQgY3JlYXRlZEZpZWxkRW50aXRpZXMgPT4gY29uc3QgPExvY2FsPltdOwoKICAvLy8gQXMgc2hvd24gaW4gdGhlIGV4YW1wbGUgaW4gdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgdGhpcyBjbGFzcywgd2UKICAvLy8gY3JlYXRlIGZpZWxkcyBpbiB0aGUgY2xvc3VyZSBjbGFzcyBmb3IgZWFjaCBjYXB0dXJlZCB2YXJpYWJsZS4gVGhpcyBpcyBhbgogIC8vLyBhY2Nlc3NvciB0aGUgW2xvY2FsXSBmb3Igd2hpY2ggW2ZpZWxkXSB3YXMgY3JlYXRlZC4KICAvLy8gUmV0dXJucyB0aGUgW2xvY2FsXSBmb3Igd2hpY2ggW2ZpZWxkXSB3YXMgY3JlYXRlZC4KICBMb2NhbCBnZXRMb2NhbEZvckZpZWxkKEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICBmYWlsZWRBdChmaWVsZCwgIk5vIGxvY2FsIGZvciAkZmllbGQuIik7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBDb252ZW5pZW5jZSBwb2ludGVyIHRvIHRoZSBmaWVsZCBlbnRpdHkgcmVwcmVzZW50YXRpb24gaW4gdGhlIGNsb3N1cmUKICAvLy8gY2xhc3Mgb2YgdGhlIGVsZW1lbnQgcmVwcmVzZW50aW5nIGB0aGlzYC4KICBGaWVsZEVudGl0eSBnZXQgdGhpc0ZpZWxkRW50aXR5ID0+IG51bGw7CgogIC8vLyBMb29wIHRocm91Z2ggZWFjaCB2YXJpYWJsZSB0aGF0IGhhcyBiZWVuIGJveGVkIGluIHRoaXMgY2xvc3VyZSBjbGFzcy4gT25seQogIC8vLyBjYXB0dXJlZCB2YXJpYWJsZXMgdGhhdCBhcmUgbXV0YXRlZCBuZWVkIHRvIGJlICJib3hlZCIgKHdoaWNoIGJhc2ljYWxseQogIC8vLyBwdXRzIGEgdGhpbiBsYXllciBiZXR3ZWVuIHVwZGF0ZXMgYW5kIHJlYWRzIHRvIHRoaXMgdmFyaWFibGUgdG8gZW5zdXJlCiAgLy8vIHRoYXQgZXZlcnkgcGxhY2UgdGhhdCBhY2Nlc3NlcyBpdCBnZXRzIHRoZSBjb3JyZWN0IHVwZGF0ZWQgdmFsdWUpLiBUaGlzCiAgLy8vIGluY2x1ZGVzIGxvb3Bpbmcgb3ZlciB2YXJpYWJsZXMgdGhhdCB3ZXJlIGJveGVkIGZyb20gb3RoZXIgc2NvcGVzLCBub3QKICAvLy8gc3RyaWN0bHkgdmFyaWFibGVzIGRlZmluZWQgaW4gdGhpcyBjbG9zdXJlLCB1bmxpa2UgdGhlIGJlaGF2aW9yIGluCiAgLy8vIHRoZSBzdXBlcmNsYXNzIFNjb3BlSW5mby4KICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hCb3hlZFZhcmlhYmxlKGYoTG9jYWwgbG9jYWwsIEZpZWxkRW50aXR5IGZpZWxkKSkge30KCiAgLy8vIExvb3AgdGhyb3VnaCBlYWNoIGZyZWUgdmFyaWFibGUgaW4gdGhpcyBjbG9zdXJlLiBGcmVlIHZhcmlhYmxlcyBhcmUgdGhlCiAgLy8vIHZhcmlhYmxlcyB0aGF0IGhhdmUgYmVlbiBjYXB0dXJlZCAqanVzdCogaW4gdGhpcyBjbG9zdXJlLCBub3QgaW4gbmVzdGVkCiAgLy8vIHNjb3Blcy4KICB2b2lkIGZvckVhY2hGcmVlVmFyaWFibGUoZihMb2NhbCB2YXJpYWJsZSwgRmllbGRFbnRpdHkgZmllbGQpKSB7fQoKICAvLyBUT0RPKGVmb3J0dW5hKTogUmVtb3ZlIHRoaXMgbWV0aG9kLiBUaGUgb2xkIHN5c3RlbSB3YXMgdXNpbmcKICAvLyBDbG9zdXJlQ2xhc3NNYXBzIGZvciBzaXR1YXRpb25zIG90aGVyIHRoYW4gY2xvc3VyZSBjbGFzcyBtYXBzLCBhbmQgdGhhdCdzCiAgLy8ganVzdCBjb25mdXNpbmcuCiAgYm9vbCBnZXQgaXNDbG9zdXJlID0+IGZhbHNlOwp9CgovLy8gQSBsb2NhbCB2YXJpYWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBib3ggb2JqZWN0IGhvbGRpbmcgdGhlIFtCb3hGaWVsZEVsZW1lbnRdCi8vLyBmaWVsZHMuCmNsYXNzIEJveExvY2FsIGV4dGVuZHMgTG9jYWwgewogIGZpbmFsIENsYXNzRW50aXR5IGNvbnRhaW5lcjsKCiAgQm94TG9jYWwodGhpcy5jb250YWluZXIpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gY29udGFpbmVyLm5hbWU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIHJldHVybiBvdGhlciBpcyBCb3hMb2NhbCAmJiBvdGhlci5jb250YWluZXIgPT0gY29udGFpbmVyOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBjb250YWluZXIuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdCb3hMb2NhbCgkbmFtZSknOwp9CgovLy8gQSBsb2NhbCB2YXJpYWJsZSB1c2VkIGVuY29kZSB0aGUgZGlyZWN0ICh1bmNhcHR1cmVkKSByZWZlcmVuY2VzIHRvIFt0aGlzXS4KY2xhc3MgVGhpc0xvY2FsIGV4dGVuZHMgTG9jYWwgewogIGZpbmFsIENsYXNzRW50aXR5IGVuY2xvc2luZ0NsYXNzOwoKICBUaGlzTG9jYWwodGhpcy5lbmNsb3NpbmdDbGFzcyk7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiAndGhpcyc7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIHJldHVybiBvdGhlciBpcyBUaGlzTG9jYWwgJiYgb3RoZXIuZW5jbG9zaW5nQ2xhc3MgPT0gZW5jbG9zaW5nQ2xhc3M7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGVuY2xvc2luZ0NsYXNzLmhhc2hDb2RlOwp9CgovLy8gQSB0eXBlIHZhcmlhYmxlIGFzIGEgbG9jYWwgdmFyaWFibGUuCmNsYXNzIFR5cGVWYXJpYWJsZUxvY2FsIGltcGxlbWVudHMgTG9jYWwgewogIGZpbmFsIFR5cGVWYXJpYWJsZVR5cGUgdHlwZVZhcmlhYmxlOwoKICBUeXBlVmFyaWFibGVMb2NhbCh0aGlzLnR5cGVWYXJpYWJsZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiB0eXBlVmFyaWFibGUuZWxlbWVudC5uYW1lOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHR5cGVWYXJpYWJsZS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBUeXBlVmFyaWFibGVMb2NhbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHR5cGVWYXJpYWJsZSA9PSBvdGhlci50eXBlVmFyaWFibGU7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgndHlwZV92YXJpYWJsZV9sb2NhbCgnKTsKICAgIHNiLndyaXRlKHR5cGVWYXJpYWJsZSk7CiAgICBzYi53cml0ZSgnKScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgovLy8KLy8vIE1vdmUgdGhlIGJlbG93IGNsYXNzZXMgdG8gYSBKUyBtb2RlbCBldmVudHVhbGx5LgovLy8KYWJzdHJhY3QgY2xhc3MgSlNFbnRpdHkgaW1wbGVtZW50cyBNZW1iZXJFbnRpdHkgewogIFN0cmluZyBnZXQgZGVjbGFyZWROYW1lOwp9CgphYnN0cmFjdCBjbGFzcyBQcml2YXRlbHlOYW1lZEpTRW50aXR5IGltcGxlbWVudHMgSlNFbnRpdHkgewogIEVudGl0eSBnZXQgcm9vdE9mU2NvcGU7Cn0KgYEATk48ASgWIR4gJCsBT09QRx05KjoqAS8nAU0nLwFMAU8fPAFOFzcCAUcVDREVHQIBT0hQCwRKUE8jEhUBNzxAFCQ7KD8sQzRGBkIEAS0oQgQBSEMfAVBPKQZMJgZPNyI4AU9QUE1MHwZLTjBCAU0xAgFKGigZATtAQBQkNEsoPyxDBkIEAU9RUElDKAFOUEhDHQIBSUpOT0wUBBY0NARAT1E5MB0BP0RAFCQ0KE8sQwZCBAFFQisBTE9DTxcGGREoFx0MBk4uOQIBTk4WBB4EUU8dBBoRHiEJBDQEJRUEUS4ET0gORzQlAUdMQBQkKCwkQDRGBkIEAToGICMBThoGUDkuAU4ZKQE3LgFNFA47AUtQOjkuLREEAUwwKwFRTk1OTUkgDEIBTk4ORAFCTxUfAgFQDB8fARwBDCUBDBw+BAEMKgEMKgIBTyAkASIBDB0BDBxJBAEMLwIBKSsnASgBDDABDC0BDBwzLwQBDBYqJhwTGgQCAQQ1BDIbAgE8GgIBIXBhY2thZ2U6Y29tcGlsZXIvc3JjL2Nsb3N1cmUuZGFydDFzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9lbGVtZW50cy9qdW1wcy5kYXJ0hEkvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBlbGVtZW50cy5qdW1wczsKCmltcG9ydCAnZW50aXRpZXMuZGFydCc7CgovLy8gVGhlIGxhYmVsIGVudGl0eSBkZWZpbmVkIGJ5IGEgbGFiZWxlZCBzdGF0ZW1lbnQuCmFic3RyYWN0IGNsYXNzIExhYmVsRGVmaW5pdGlvbiBleHRlbmRzIEVudGl0eSB7CiAgU3RyaW5nIGdldCBsYWJlbE5hbWU7CiAgSnVtcFRhcmdldCBnZXQgdGFyZ2V0OwoKICBib29sIGdldCBpc1RhcmdldCA9PiBpc0JyZWFrVGFyZ2V0IHx8IGlzQ29udGludWVUYXJnZXQ7CgogIGJvb2wgZ2V0IGlzQnJlYWtUYXJnZXQ7CiAgYm9vbCBnZXQgaXNDb250aW51ZVRhcmdldDsKfQoKLy8vIEEganVtcCB0YXJnZXQgaXMgdGhlIHJlZmVyZW5jZSBwb2ludCBvZiBhIHN0YXRlbWVudCBvciBzd2l0Y2gtY2FzZSwKLy8vIGVpdGhlciBieSBsYWJlbCBvciBhcyB0aGUgZGVmYXVsdCB0YXJnZXQgb2YgYSBicmVhayBvciBjb250aW51ZS4KYWJzdHJhY3QgY2xhc3MgSnVtcFRhcmdldCBleHRlbmRzIExvY2FsIHsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJ3RhcmdldCc7CgogIGJvb2wgZ2V0IGlzVGFyZ2V0ID0+IGlzQnJlYWtUYXJnZXQgfHwgaXNDb250aW51ZVRhcmdldDsKCiAgaW50IGdldCBuZXN0aW5nTGV2ZWw7CiAgTGlzdDxMYWJlbERlZmluaXRpb24+IGdldCBsYWJlbHM7CgogIGJvb2wgZ2V0IGlzQnJlYWtUYXJnZXQ7CiAgYm9vbCBnZXQgaXNDb250aW51ZVRhcmdldDsKICBib29sIGdldCBpc1N3aXRjaDsKICBib29sIGdldCBpc1N3aXRjaENhc2U7CgogIExhYmVsRGVmaW5pdGlvbiBhZGRMYWJlbChTdHJpbmcgbGFiZWxOYW1lLAogICAgICB7Ym9vbCBpc0JyZWFrVGFyZ2V0OiBmYWxzZSwgYm9vbCBpc0NvbnRpbnVlVGFyZ2V0OiBmYWxzZX0pOwp9CigATk48ARgBGAE1MBgZAToBGh0CAUhFKgwfAToBGCQBGh0VGQEtQgIBKHBhY2thZ2U6Y29tcGlsZXIvc3JjL2VsZW1lbnRzL2p1bXBzLmRhcnQ3c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfbW9kZWwvdHlwZV9yZWNpcGUuZGFydJWzLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19tb2RlbC50eXBlX3JlY2lwZTsKCmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CgovLy8gQSBUeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBzaGFwZSBvciBsYXlvdXQgb2YgYSByZWlmaWVkIHR5cGUKLy8vIGVudmlyb25tZW50LgovLy8KLy8vIEEgdHlwZSBlbnZpcm9ubWVudCBtYXBzIHR5cGUgcGFyYW1ldGVyIHZhcmlhYmxlcyB0byB0eXBlIHZhbHVlcy4gVGhlIHR5cGUKLy8vIHZhcmlhYmxlcyBhcmUgbW9zdGx5IGVsaWRlZCBpbiB0aGUgcnVudGltZSByZXByZXNlbnRhdGlvbiwgcmVwbGFjZWQgYnkKLy8vIGluZGV4ZXMgaW50byB0aGUgcmVpZmllZCBlbnZpcm9ubWVudC4KYWJzdHJhY3QgY2xhc3MgVHlwZUVudmlyb25tZW50U3RydWN0dXJlIHsKICAvLy8gU3RydWN0dXJhbCBlcXVhbGl0eSBvbiBbVHlwZUVudmlyb25tZW50U3RydWN0dXJlXS4KICBzdGF0aWMgYm9vbCBzYW1lKFR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZSBhLCBUeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUgYikgewogICAgaWYgKGEgaXMgU2luZ2xldG9uVHlwZUVudmlyb25tZW50U3RydWN0dXJlKSB7CiAgICAgIGlmIChiIGlzIFNpbmdsZXRvblR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZSkgewogICAgICAgIHJldHVybiBhLnZhcmlhYmxlID09IGIudmFyaWFibGU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIF9zYW1lRnVsbFN0cnVjdHVyZShhLCBiKTsKICB9CgogIHN0YXRpYyBib29sIF9zYW1lRnVsbFN0cnVjdHVyZSgKICAgICAgRnVsbFR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZSBhLCBGdWxsVHlwZUVudmlyb25tZW50U3RydWN0dXJlIGIpIHsKICAgIGlmIChhLmNsYXNzVHlwZSAhPSBiLmNsYXNzVHlwZSkgcmV0dXJuIGZhbHNlOwogICAgTGlzdDxUeXBlVmFyaWFibGVUeXBlPiBhQmluZGluZ3MgPSBhLmJpbmRpbmdzOwogICAgTGlzdDxUeXBlVmFyaWFibGVUeXBlPiBiQmluZGluZ3MgPSBiLmJpbmRpbmdzOwogICAgaWYgKGFCaW5kaW5ncy5sZW5ndGggIT0gYkJpbmRpbmdzLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhQmluZGluZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGFCaW5kaW5nc1tpXSAhPSBiQmluZGluZ3NbaV0pIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfQoKLy8vIEEgc2luZ2xldG9uIHR5cGUgZW52aXJvbm1lbnQgbWFwcyBhIGJpbmRzIGEgc2luZ2xlIHZhbHVlLgpjbGFzcyBTaW5nbGV0b25UeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUgZXh0ZW5kcyBUeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUgewogIGZpbmFsIFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGU7CgogIFNpbmdsZXRvblR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZSh0aGlzLnZhcmlhYmxlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1NpbmdsZXRvblR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZSgkdmFyaWFibGUpJzsKfQoKLy8vIEEgdHlwZSBlbnZpcm9ubWVudCBjb250YWluaW5nIGFuIGludGVyZmFjZSB0eXBlIGFuZC9vciBhIHR1cGxlIG9mIGZ1bmN0aW9uCi8vLyB0eXBlIHBhcmFtZXRlcnMuCmNsYXNzIEZ1bGxUeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUgZXh0ZW5kcyBUeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUgewogIGZpbmFsIEludGVyZmFjZVR5cGUgY2xhc3NUeXBlOwogIGZpbmFsIExpc3Q8VHlwZVZhcmlhYmxlVHlwZT4gYmluZGluZ3M7CgogIEZ1bGxUeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUoe3RoaXMuY2xhc3NUeXBlLCB0aGlzLmJpbmRpbmdzID0gY29uc3QgW119KTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0Z1bGxUeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUoJGNsYXNzVHlwZSwgJGJpbmRpbmdzKSc7Cn0KCi8vLyBBIFR5cGVSZWNpcGUgaXMgZXZhbHVhdGVkIGFnYWluc3QgYSB0eXBlIGVudmlyb25tZW50IHRvIHByb2R1Y2UgZWl0aGVyIGEKLy8vIHR5cGUsIG9yIGFub3RoZXIgdHlwZSBlbnZpcm9ubWVudC4KYWJzdHJhY3QgY2xhc3MgVHlwZVJlY2lwZSB7CiAgLy8vIFJldHVybnMgYHRydWVgIGlzIFtyZWNpcGVCXSBldmFsdWF0ZWQgaW4gYW4gZW52aXJvbm1lbnQgZGVzY3JpYmVkIGJ5CiAgLy8vIFtzdHJ1Y3R1cmVCXSBnaXZlcyB0aGUgc2FtZSB0eXBlIGFzIFtyZWNpcGVBXSBldmFsdWF0ZWQgaW4gZW52aXJvbm1lbnQKICAvLy8gZGVzY3JpYmVkIGJ5IFtzdHJ1Y3R1cmVBXS4KICBzdGF0aWMgYm9vbCB5aWVsZHNTYW1lVHlwZSgKICAgICAgVHlwZVJlY2lwZSByZWNpcGVBLAogICAgICBUeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUgc3RydWN0dXJlQSwKICAgICAgVHlwZVJlY2lwZSByZWNpcGVCLAogICAgICBUeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUgc3RydWN0dXJlQikgewogICAgaWYgKHJlY2lwZUEgPT0gcmVjaXBlQiAmJgogICAgICAgIFR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZS5zYW1lKHN0cnVjdHVyZUEsIHN0cnVjdHVyZUIpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIFRPRE8oc3JhKTogVHlwZSByZWNpcGVzIHRoYXQgYXJlIGRpZmZlcmVudCBidXQgZXF1YWwgbW9kdWxvIG5hbWluZyBhbHNvCiAgICAvLyB5aWVsZCB0aGUgc2FtZSB0eXBlLCBlLmcuIGBMaXN0PFg+IEBYYCBhbmQgYExpc3Q8WT4gQFlgLgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtyZWNpcGVdIGV2YWx1YXRlcyBpbiBhbiBlbnZpcm9ubWVudCB3aXRoIFtzdHJ1Y3R1cmVdIHRvCiAgLy8vIHRoZSBlbnZpcm9ubWVudC4KICBzdGF0aWMgYm9vbCBpc0lkZW50aXR5KAogICAgICBUeXBlUmVjaXBlIHJlY2lwZSwgVHlwZUVudmlyb25tZW50U3RydWN0dXJlIHN0cnVjdHVyZSkgewogICAgaWYgKHN0cnVjdHVyZSBpcyBTaW5nbGV0b25UeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUgJiYKICAgICAgICByZWNpcGUgaXMgVHlwZUV4cHJlc3Npb25SZWNpcGUpIHsKICAgICAgaWYgKHN0cnVjdHVyZS52YXJpYWJsZSA9PSByZWNpcGUudHlwZSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgovLy8gQSByZWNpcGUgdGhhdCB5aWVsZHMgYSByZWlmaWVkIHR5cGUuCmNsYXNzIFR5cGVFeHByZXNzaW9uUmVjaXBlIGV4dGVuZHMgVHlwZVJlY2lwZSB7CiAgZmluYWwgRGFydFR5cGUgdHlwZTsKCiAgVHlwZUV4cHJlc3Npb25SZWNpcGUodGhpcy50eXBlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIFR5cGVFeHByZXNzaW9uUmVjaXBlICYmIHR5cGUgPT0gb3RoZXIudHlwZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdUeXBlRXhwcmVzc2lvblJlY2lwZSgkdHlwZSknOwp9CgovLy8gQSByZWNpcGUgdGhhdCB5aWVsZHMgYSByZWlmaWVkIHR5cGUgZW52aXJvbm1lbnQuCmFic3RyYWN0IGNsYXNzIFR5cGVFbnZpcm9ubWVudFJlY2lwZSBleHRlbmRzIFR5cGVSZWNpcGUge30KCi8vLyBBIHJlY2lwZSB0aGF0IHlpZWxkcyBhIHJlaWZpZWQgdHlwZSBlbnZpcm9ubWVudCB0aGF0IGJpbmRzIGEgc2luZ2xlIGdlbmVyaWMKLy8vIGZ1bmN0aW9uIHR5cGUgcGFyYW1ldGVyLgpjbGFzcyBTaW5nbGV0b25UeXBlRW52aXJvbm1lbnRSZWNpcGUgZXh0ZW5kcyBUeXBlRW52aXJvbm1lbnRSZWNpcGUgewogIGZpbmFsIERhcnRUeXBlIHR5cGU7CgogIFNpbmdsZXRvblR5cGVFbnZpcm9ubWVudFJlY2lwZSh0aGlzLnR5cGUpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIgaXMgU2luZ2xldG9uVHlwZUVudmlyb25tZW50UmVjaXBlICYmIHR5cGUgPT0gb3RoZXIudHlwZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdTaW5nbGV0b25UeXBlRW52aXJvbm1lbnRSZWNpcGUoJHR5cGUpJzsKfQoKLy8vIEEgcmVjaXBlIHRoYXQgeWllbGRzIGEgcmVpZmllZCB0eXBlIGVudmlyb25tZW50IHRoYXQgYmluZHMgYSBjbGFzcyBpbnN0YW5jZQovLy8gdHlwZSBhbmQvb3IgYSB0dXBsZSBvZiB0eXBlcywgdXN1YWxseSBnZW5lcmljIGZ1bmN0aW9uIHR5cGUgYXJndW1lbnRzLgovLy8KLy8vIFdpdGggbm8gY2xhc3MgaXMgYWxzbyB1c2VkIGFzIGEgdHVwbGUgb2YgdHlwZXMuCmNsYXNzIEZ1bGxUeXBlRW52aXJvbm1lbnRSZWNpcGUgZXh0ZW5kcyBUeXBlRW52aXJvbm1lbnRSZWNpcGUgewogIC8vLyBUeXBlIGV4cHJlc3Npb24gZm9yIHRoZSBpbnRlcmZhY2UgdHlwZSBvZiBhIGNsYXNzIHNjb3BlLiAgYG51bGxgIGZvcgogIC8vLyBlbnZpcm9ubWVudHMgb3V0c2lkZSBhIGNsYXNzIHNjb3BlIG9yIGEgY2xhc3Mgc2NvcGUgd2hlcmUgbm8gc3VwZXJ0eXBlIGlzCiAgLy8vIGdlbmVyaWMsIG9yIHdoZXJlIG9wdGltaXphdGlvbiBoYXMgZGV0ZXJtaW5lZCB0aGF0IG5vIHVzZSBvZiB0aGUKICAvLy8gZW52aXJvbm1lbnQgcmVxdWlyZXMgYW55IG9mIHRoZSBjbGFzcyB0eXBlIHZhcmlhYmxlcy4KICBmaW5hbCBJbnRlcmZhY2VUeXBlIGNsYXNzVHlwZTsKCiAgLy8gVHlwZSBleHByZXNzaW9ucyBmb3IgdGhlIHR1cGxlIG9mIGZ1bmN0aW9uIHR5cGUgYXJndW1lbnRzLgogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVzOwoKICBGdWxsVHlwZUVudmlyb25tZW50UmVjaXBlKHt0aGlzLmNsYXNzVHlwZSwgdGhpcy50eXBlcyA9IGNvbnN0IFtdfSk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIHJldHVybiBvdGhlciBpcyBGdWxsVHlwZUVudmlyb25tZW50UmVjaXBlICYmIF9lcXVhbCh0aGlzLCBvdGhlcik7CiAgfQoKICBzdGF0aWMgYm9vbCBfZXF1YWwoRnVsbFR5cGVFbnZpcm9ubWVudFJlY2lwZSBhLCBGdWxsVHlwZUVudmlyb25tZW50UmVjaXBlIGIpIHsKICAgIGlmIChhLmNsYXNzVHlwZSAhPSBiLmNsYXNzVHlwZSkgcmV0dXJuIGZhbHNlOwogICAgTGlzdDxEYXJ0VHlwZT4gYVR5cGVzID0gYS50eXBlczsKICAgIExpc3Q8RGFydFR5cGU+IGJUeXBlcyA9IGIudHlwZXM7CiAgICBpZiAoYVR5cGVzLmxlbmd0aCAhPSBiVHlwZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGFUeXBlcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoYVR5cGVzW2ldICE9IGJUeXBlc1tpXSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRnVsbFR5cGVFbnZpcm9ubWVudFJlY2lwZSgkY2xhc3NUeXBlLCAkdHlwZXMpJzsKfQqApQBOTjwBJgEhAU8RBE5LKio5TTI0KQgUBiUEASJIMjMzPDE2BhEEAgE+SyMBNAEMRwIBTxVGISkBTAEMTgIBTSccS00hHhorGi0eQRMGAU9AEgQBURcaPzoqOgYSBAIBKTAXASMBDBxABAEMNgIBNTsBUB1FFwEtAQwcSgQBDEACAVBLBDRAS1BHPCEBQB4BRgEMHEYEAVEyJSU2LjAGEQQBDEgCAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19tb2RlbC90eXBlX3JlY2lwZS5kYXJ0QnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NzYS9pbnZva2VfZHluYW1pY19zcGVjaWFsaXplcnMuZGFydMAAyt8vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBKQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0YW50X3N5c3RlbS5kYXJ0JyBhcyBjb25zdGFudF9zeXN0ZW07CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CmltcG9ydCAnbG9nZ2luZy5kYXJ0JzsKaW1wb3J0ICdub2Rlcy5kYXJ0JzsKaW1wb3J0ICd0eXBlcy5kYXJ0JzsKCi8vLyBbSW52b2tlRHluYW1pY1NwZWNpYWxpemVyXSBhbmQgaXRzIHN1YmNsYXNzZXMgYXJlIGhlbHBlcnMgdG8KLy8vIG9wdGltaXplIGludGVyY2VwdGVkIGR5bmFtaWMgY2FsbHMuIEl0IGtub3dzIHdoYXQgaW5wdXQgdHlwZXMKLy8vIHdvdWxkIGJlIGJlbmVmaWNpYWwgZm9yIHBlcmZvcm1hbmNlLCBhbmQgaG93IHRvIGNoYW5nZSBhIGludm9rZQovLy8gZHluYW1pYyB0byBhIGJ1aWx0aW4gaW5zdHJ1Y3Rpb24gKGUuZy4gSEluZGV4LCBIQml0Tm90KS4KY2xhc3MgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyIHsKICBjb25zdCBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIoKTsKCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBBYnN0cmFjdFZhbHVlRmFjdG9yeS5pbmZlcnJlZFJlc3VsdFR5cGVGb3JTZWxlY3RvcigKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwgaW5zdHJ1Y3Rpb24ucmVjZWl2ZXJUeXBlLCByZXN1bHRzKTsKICB9CgogIEhJbnN0cnVjdGlvbiB0cnlDb252ZXJ0VG9CdWlsdGluKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2cpIHsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBjbGVhckFsbFNpZGVFZmZlY3RzKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgaW5zdHJ1Y3Rpb24uc2lkZUVmZmVjdHMuY2xlYXJBbGxTaWRlRWZmZWN0cygpOwogICAgaW5zdHJ1Y3Rpb24uc2lkZUVmZmVjdHMuY2xlYXJBbGxEZXBlbmRlbmNpZXMoKTsKICAgIGluc3RydWN0aW9uLnNldFVzZUd2bigpOwogIH0KCiAgU2VsZWN0b3IgcmVuYW1lVG9PcHRpbWl6ZWRTZWxlY3RvcigKICAgICAgU3RyaW5nIG5hbWUsIFNlbGVjdG9yIHNlbGVjdG9yLCBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpIHsKICAgIGlmIChzZWxlY3Rvci5uYW1lID09IG5hbWUpIHJldHVybiBzZWxlY3RvcjsKICAgIHJldHVybiBuZXcgU2VsZWN0b3IuY2FsbChuZXcgTmFtZShuYW1lLCBjb21tb25FbGVtZW50cy5pbnRlcmNlcHRvcnNMaWJyYXJ5KSwKICAgICAgICBuZXcgQ2FsbFN0cnVjdHVyZShzZWxlY3Rvci5hcmd1bWVudENvdW50KSk7CiAgfQoKICBjb25zdGFudF9zeXN0ZW0uT3BlcmF0aW9uIG9wZXJhdGlvbigpID0+IG51bGw7CgogIHN0YXRpYyBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIgbG9va3VwU3BlY2lhbGl6ZXIoU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgIGlmIChzZWxlY3Rvci5pc0luZGV4KSByZXR1cm4gY29uc3QgSW5kZXhTcGVjaWFsaXplcigpOwogICAgaWYgKHNlbGVjdG9yLmlzSW5kZXhTZXQpIHJldHVybiBjb25zdCBJbmRleEFzc2lnblNwZWNpYWxpemVyKCk7CiAgICBTdHJpbmcgbmFtZSA9IHNlbGVjdG9yLm5hbWU7CiAgICBpZiAoc2VsZWN0b3IuaXNPcGVyYXRvcikgewogICAgICBpZiAobmFtZSA9PSAndW5hcnktJykgcmV0dXJuIGNvbnN0IFVuYXJ5TmVnYXRlU3BlY2lhbGl6ZXIoKTsKICAgICAgaWYgKG5hbWUgPT0gJ34nKSByZXR1cm4gY29uc3QgQml0Tm90U3BlY2lhbGl6ZXIoKTsKICAgICAgaWYgKG5hbWUgPT0gJysnKSByZXR1cm4gY29uc3QgQWRkU3BlY2lhbGl6ZXIoKTsKICAgICAgaWYgKG5hbWUgPT0gJy0nKSByZXR1cm4gY29uc3QgU3VidHJhY3RTcGVjaWFsaXplcigpOwogICAgICBpZiAobmFtZSA9PSAnKicpIHJldHVybiBjb25zdCBNdWx0aXBseVNwZWNpYWxpemVyKCk7CiAgICAgIGlmIChuYW1lID09ICcvJykgcmV0dXJuIGNvbnN0IERpdmlkZVNwZWNpYWxpemVyKCk7CiAgICAgIGlmIChuYW1lID09ICd+LycpIHJldHVybiBjb25zdCBUcnVuY2F0aW5nRGl2aWRlU3BlY2lhbGl6ZXIoKTsKICAgICAgaWYgKG5hbWUgPT0gJyUnKSByZXR1cm4gY29uc3QgTW9kdWxvU3BlY2lhbGl6ZXIoKTsKICAgICAgaWYgKG5hbWUgPT0gJz4+JykgcmV0dXJuIGNvbnN0IFNoaWZ0UmlnaHRTcGVjaWFsaXplcigpOwogICAgICBpZiAobmFtZSA9PSAnPDwnKSByZXR1cm4gY29uc3QgU2hpZnRMZWZ0U3BlY2lhbGl6ZXIoKTsKICAgICAgaWYgKG5hbWUgPT0gJyYnKSByZXR1cm4gY29uc3QgQml0QW5kU3BlY2lhbGl6ZXIoKTsKICAgICAgaWYgKG5hbWUgPT0gJ3wnKSByZXR1cm4gY29uc3QgQml0T3JTcGVjaWFsaXplcigpOwogICAgICBpZiAobmFtZSA9PSAnXicpIHJldHVybiBjb25zdCBCaXRYb3JTcGVjaWFsaXplcigpOwogICAgICBpZiAobmFtZSA9PSAnPT0nKSByZXR1cm4gY29uc3QgRXF1YWxzU3BlY2lhbGl6ZXIoKTsKICAgICAgaWYgKG5hbWUgPT0gJzwnKSByZXR1cm4gY29uc3QgTGVzc1NwZWNpYWxpemVyKCk7CiAgICAgIGlmIChuYW1lID09ICc8PScpIHJldHVybiBjb25zdCBMZXNzRXF1YWxTcGVjaWFsaXplcigpOwogICAgICBpZiAobmFtZSA9PSAnPicpIHJldHVybiBjb25zdCBHcmVhdGVyU3BlY2lhbGl6ZXIoKTsKICAgICAgaWYgKG5hbWUgPT0gJz49JykgcmV0dXJuIGNvbnN0IEdyZWF0ZXJFcXVhbFNwZWNpYWxpemVyKCk7CiAgICAgIHJldHVybiBjb25zdCBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIoKTsKICAgIH0KICAgIGlmIChzZWxlY3Rvci5pc0NhbGwpIHsKICAgICAgaWYgKHNlbGVjdG9yLm5hbWVkQXJndW1lbnRzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgaW50IGFyZ3VtZW50Q291bnQgPSBzZWxlY3Rvci5hcmd1bWVudENvdW50OwogICAgICAgIGlmIChhcmd1bWVudENvdW50ID09IDApIHsKICAgICAgICAgIGlmIChuYW1lID09ICdhYnMnKSByZXR1cm4gY29uc3QgQWJzU3BlY2lhbGl6ZXIoKTsKICAgICAgICAgIGlmIChuYW1lID09ICdyb3VuZCcpIHJldHVybiBjb25zdCBSb3VuZFNwZWNpYWxpemVyKCk7CiAgICAgICAgICBpZiAobmFtZSA9PSAndHJpbScpIHJldHVybiBjb25zdCBUcmltU3BlY2lhbGl6ZXIoKTsKICAgICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50Q291bnQgPT0gMSkgewogICAgICAgICAgaWYgKG5hbWUgPT0gJ2NvZGVVbml0QXQnKSByZXR1cm4gY29uc3QgQ29kZVVuaXRBdFNwZWNpYWxpemVyKCk7CiAgICAgICAgICBpZiAobmFtZSA9PSAnY29tcGFyZVRvJykgcmV0dXJuIGNvbnN0IENvbXBhcmVUb1NwZWNpYWxpemVyKCk7CiAgICAgICAgICBpZiAobmFtZSA9PSAncmVtYWluZGVyJykgcmV0dXJuIGNvbnN0IFJlbWFpbmRlclNwZWNpYWxpemVyKCk7CiAgICAgICAgICBpZiAobmFtZSA9PSAnc3Vic3RyaW5nJykgcmV0dXJuIGNvbnN0IFN1YnN0cmluZ1NwZWNpYWxpemVyKCk7CiAgICAgICAgICBpZiAobmFtZSA9PSAnY29udGFpbnMnKSByZXR1cm4gY29uc3QgUGF0dGVybk1hdGNoU3BlY2lhbGl6ZXIoKTsKICAgICAgICAgIGlmIChuYW1lID09ICdpbmRleE9mJykgcmV0dXJuIGNvbnN0IFBhdHRlcm5NYXRjaFNwZWNpYWxpemVyKCk7CiAgICAgICAgICBpZiAobmFtZSA9PSAnc3RhcnRzV2l0aCcpIHJldHVybiBjb25zdCBQYXR0ZXJuTWF0Y2hTcGVjaWFsaXplcigpOwogICAgICAgICAgaWYgKG5hbWUgPT0gJ2VuZHNXaXRoJykgcmV0dXJuIGNvbnN0IFBhdHRlcm5NYXRjaFNwZWNpYWxpemVyKCk7CiAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudENvdW50ID09IDIpIHsKICAgICAgICAgIGlmIChuYW1lID09ICdzdWJzdHJpbmcnKSByZXR1cm4gY29uc3QgU3Vic3RyaW5nU3BlY2lhbGl6ZXIoKTsKICAgICAgICAgIGlmIChuYW1lID09ICdjb250YWlucycpIHJldHVybiBjb25zdCBQYXR0ZXJuTWF0Y2hTcGVjaWFsaXplcigpOwogICAgICAgICAgaWYgKG5hbWUgPT0gJ2luZGV4T2YnKSByZXR1cm4gY29uc3QgUGF0dGVybk1hdGNoU3BlY2lhbGl6ZXIoKTsKICAgICAgICAgIGlmIChuYW1lID09ICdzdGFydHNXaXRoJykgcmV0dXJuIGNvbnN0IFBhdHRlcm5NYXRjaFNwZWNpYWxpemVyKCk7CiAgICAgICAgICBpZiAobmFtZSA9PSAnZW5kc1dpdGgnKSByZXR1cm4gY29uc3QgUGF0dGVybk1hdGNoU3BlY2lhbGl6ZXIoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb25zdCBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIoKTsKICB9Cn0KCmNsYXNzIEluZGV4QXNzaWduU3BlY2lhbGl6ZXIgZXh0ZW5kcyBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIgewogIGNvbnN0IEluZGV4QXNzaWduU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHRyeUNvbnZlcnRUb0J1aWx0aW4oCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBIR3JhcGggZ3JhcGgsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIEpDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZykgewogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgSEluc3RydWN0aW9uIGluZGV4ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdOwogICAgaWYgKHJlY2VpdmVyCiAgICAgICAgLmlzTXV0YWJsZUluZGV4YWJsZShjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNZXJnZSB0aGlzIGFuZCB0aGUgZm9sbG93aW5nIGlmIHN0YXRlbWVudC4KICAgIGlmIChpbmRleC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNQb3RlbnRpYWxseUZhbHNlICYmCiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCBhbm5vdGF0aW9ucyBvbiB0aGUgcG9zc2libGUgdGFyZ2V0cwogICAgICAgIC8vIGFuZCB1c2VkIHRoZWlyIHBhcmFtZXRlciBjaGVjayBwb2xpY3kgaGVyZS4KICAgICAgICBjbG9zZWRXb3JsZC5hbm5vdGF0aW9uc0RhdGEuZ2V0UGFyYW1ldGVyQ2hlY2tQb2xpY3kobnVsbCkuaXNFbWl0dGVkKSB7CiAgICAgIC8vIFdlIHdhbnQgdGhlIHJpZ2h0IGNoZWNrZWQgbW9kZSBlcnJvci4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgSEluc3RydWN0aW9uIHZhbHVlID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzNdOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCBhbm5vdGF0aW9ucyBvbiB0aGUgcG9zc2libGUgdGFyZ2V0cwogICAgLy8gYW5kIHVzZWQgdGhlaXIgcGFyYW1ldGVyIGNoZWNrIHBvbGljeSBoZXJlLgogICAgaWYgKGNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YS5nZXRQYXJhbWV0ZXJDaGVja1BvbGljeShudWxsKS5pc0VtaXR0ZWQpIHsKICAgICAgaWYgKCFfdmFsdWVQYXJhbWV0ZXJDaGVja0Fsd2F5c1N1Y2NlZWRzKAogICAgICAgICAgaW5zdHJ1Y3Rpb24sIHJlY2VpdmVyLCB2YWx1ZSwgY29tbW9uRWxlbWVudHMsIGNsb3NlZFdvcmxkKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBISW5kZXhBc3NpZ24gY29udmVydGVkID0gbmV3IEhJbmRleEFzc2lnbihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICAgIHJlY2VpdmVyLCBpbmRleCwgdmFsdWUsIGluc3RydWN0aW9uLnNlbGVjdG9yKTsKICAgIGxvZz8ucmVnaXN0ZXJJbmRleEFzc2lnbihpbnN0cnVjdGlvbiwgY29udmVydGVkKTsKICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgfQoKICAvLy8gUmV0dXJucyBbdHJ1ZV0gaWYgW3ZhbHVlXSBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzIGZvciBiZWluZyBzdG9yZWQgaW50bwogIC8vLyBpbmRleGFibGUgW3JlY2VpdmVyXS4KICBib29sIF92YWx1ZVBhcmFtZXRlckNoZWNrQWx3YXlzU3VjY2VlZHMoCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsCiAgICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSwKICAgICAgSkNvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIC8vIEhhbmRsZSB0eXBlZCBhcnJheXMgYnkgcmVjb2duaXppbmcgdGhlIGV4YWN0IGltcGxlbWVudGF0aW9uIG9mIGBbXT1gIGFuZAogICAgLy8gY2hlY2tpbmcgaWYgW3ZhbHVlXSBoYXMgdGhlIGFwcHJvcHJpYXRlIHR5cGUuCiAgICBpZiAoaW5zdHJ1Y3Rpb24uZWxlbWVudCAhPSBudWxsKSB7CiAgICAgIENsYXNzRW50aXR5IGNscyA9IGluc3RydWN0aW9uLmVsZW1lbnQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIGlmIChjbHMgPT0gY29tbW9uRWxlbWVudHMudHlwZWRBcnJheU9mSW50Q2xhc3MpIHsKICAgICAgICByZXR1cm4gdmFsdWUKICAgICAgICAgICAgLmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZTsKICAgICAgfSBlbHNlIGlmIChjbHMgPT0gY29tbW9uRWxlbWVudHMudHlwZWRBcnJheU9mRG91YmxlQ2xhc3MpIHsKICAgICAgICByZXR1cm4gdmFsdWUuaXNOdW1iZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZTsKICAgICAgfQogICAgfQoKICAgIC8vIFRoZSB0eXBlIGNoZWNrIHdpbGwgcGFzcyBpZiBpdCBwYXNzZWQgYmVmb3JlLiBXZSBrbm93IGl0IHBhc3NlZCBiZWZvcmUgaWYKICAgIC8vIHRoZSB2YWx1ZSB3YXMgbG9hZGVkIGZyb20gdGhlIHNhbWUgaW5kZXhhYmxlLgogICAgaWYgKHZhbHVlIGlzIEhJbmRleCkgewogICAgICBpZiAodmFsdWUucmVjZWl2ZXIubm9uQ2hlY2soKSA9PSByZWNlaXZlci5ub25DaGVjaygpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgpjbGFzcyBJbmRleFNwZWNpYWxpemVyIGV4dGVuZHMgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyIHsKICBjb25zdCBJbmRleFNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB0cnlDb252ZXJ0VG9CdWlsdGluKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2cpIHsKICAgIHZhciBhYnN0cmFjdFZhbHVlRG9tYWluID0gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbjsKICAgIGlmIChpbnN0cnVjdGlvbi5pbnB1dHNbMV0KICAgICAgICAuaXNJbmRleGFibGVQcmltaXRpdmUoYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNQb3RlbnRpYWxseUZhbHNlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGluc3RydWN0aW9uLmlucHV0c1syXQogICAgICAgICAgICAuaXNJbnRlZ2VyKGFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc1BvdGVudGlhbGx5RmFsc2UgJiYKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IGFubm90YXRpb25zIG9uIHRoZSBwb3NzaWJsZSB0YXJnZXRzCiAgICAgICAgLy8gYW5kIHVzZWQgdGhlaXIgcGFyYW1ldGVyIGNoZWNrIHBvbGljeSBoZXJlLgogICAgICAgIGNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YS5nZXRQYXJhbWV0ZXJDaGVja1BvbGljeShudWxsKS5pc0VtaXR0ZWQpIHsKICAgICAgLy8gV2Ugd2FudCB0aGUgcmlnaHQgY2hlY2tlZCBtb2RlIGVycm9yLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXJUeXBlID0KICAgICAgICBpbnN0cnVjdGlvbi5nZXREYXJ0UmVjZWl2ZXIoY2xvc2VkV29ybGQpLmluc3RydWN0aW9uVHlwZTsKICAgIEFic3RyYWN0VmFsdWUgZWxlbWVudFR5cGUgPQogICAgICAgIEFic3RyYWN0VmFsdWVGYWN0b3J5LmluZmVycmVkUmVzdWx0VHlwZUZvclNlbGVjdG9yKAogICAgICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwgcmVjZWl2ZXJUeXBlLCByZXN1bHRzKTsKICAgIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmlzVHlwZWRBcnJheShyZWNlaXZlclR5cGUpLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgZWxlbWVudFR5cGUgPSBhYnN0cmFjdFZhbHVlRG9tYWluLmV4Y2x1ZGVOdWxsKGVsZW1lbnRUeXBlKTsKICAgIH0KICAgIEhJbmRleCBjb252ZXJ0ZWQgPSBuZXcgSEluZGV4KGluc3RydWN0aW9uLmlucHV0c1sxXSwgaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdLAogICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yLCBlbGVtZW50VHlwZSk7CiAgICBsb2c/LnJlZ2lzdGVySW5kZXgoaW5zdHJ1Y3Rpb24sIGNvbnZlcnRlZCk7CiAgICByZXR1cm4gY29udmVydGVkOwogIH0KfQoKY2xhc3MgQml0Tm90U3BlY2lhbGl6ZXIgZXh0ZW5kcyBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIgewogIGNvbnN0IEJpdE5vdFNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5VbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmJpdE5vdDsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICAvLyBBbGwgYml0d2lzZSBvcGVyYXRpb25zIG9uIHByaW1pdGl2ZSB0eXBlcyBlaXRoZXIgcHJvZHVjZSBhbgogICAgLy8gaW50ZWdlciBvciB0aHJvdyBhbiBlcnJvci4KICAgIGlmIChpbnN0cnVjdGlvbi5pbnB1dHNbMV0KICAgICAgICAuaXNQcmltaXRpdmVPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi51aW50MzJUeXBlOwogICAgfQogICAgcmV0dXJuIHN1cGVyLmNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB0cnlDb252ZXJ0VG9CdWlsdGluKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2cpIHsKICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IGluc3RydWN0aW9uLmlucHV0c1sxXTsKICAgIGlmIChpbnB1dC5pc051bWJlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIEhCaXROb3QgY29udmVydGVkID0gbmV3IEhCaXROb3QoaW5wdXQsIGluc3RydWN0aW9uLnNlbGVjdG9yLAogICAgICAgICAgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpKTsKICAgICAgbG9nPy5yZWdpc3RlckJpdE5vdChpbnN0cnVjdGlvbiwgY29udmVydGVkKTsKICAgICAgcmV0dXJuIGNvbnZlcnRlZDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQoKY2xhc3MgVW5hcnlOZWdhdGVTcGVjaWFsaXplciBleHRlbmRzIEludm9rZUR5bmFtaWNTcGVjaWFsaXplciB7CiAgY29uc3QgVW5hcnlOZWdhdGVTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uVW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5uZWdhdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgSEluc3RydWN0aW9uIG9wZXJhbmQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBpZiAob3BlcmFuZAogICAgICAgIC5pc051bWJlck9yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIC8vIFdlIGhhdmUgaW50ZWdlciBzdWJjbGFzc2VzIHRoYXQgcmVwcmVzZW50IHJhbmdlcywgc28gd2lkZW4gYW55IGludAogICAgICAvLyBzdWJjbGFzcyB0byBmdWxsIGludGVnZXIuCiAgICAgIGlmIChvcGVyYW5kCiAgICAgICAgICAuaXNJbnRlZ2VyT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmludFR5cGU7CiAgICAgIH0KICAgICAgaWYgKG9wZXJhbmQKICAgICAgICAgIC5pc0RvdWJsZU9yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5kb3VibGVUeXBlOwogICAgICB9CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLm51bVR5cGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHRyeUNvbnZlcnRUb0J1aWx0aW4oCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBIR3JhcGggZ3JhcGgsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIEpDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZykgewogICAgSEluc3RydWN0aW9uIGlucHV0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgaWYgKGlucHV0LmlzTnVtYmVyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgSE5lZ2F0ZSBjb252ZXJ0ZWQgPSBuZXcgSE5lZ2F0ZShpbnB1dCwgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsCiAgICAgICAgICBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBjbG9zZWRXb3JsZCkpOwogICAgICBsb2c/LnJlZ2lzdGVyVW5hcnlOZWdhdGUoaW5zdHJ1Y3Rpb24sIGNvbnZlcnRlZCk7CiAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmNsYXNzIEFic1NwZWNpYWxpemVyIGV4dGVuZHMgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyIHsKICBjb25zdCBBYnNTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uVW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5hYnM7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgSEluc3RydWN0aW9uIGlucHV0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgaWYgKGlucHV0CiAgICAgICAgLmlzTnVtYmVyT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uZXhjbHVkZU51bGwoaW5wdXQuaW5zdHJ1Y3Rpb25UeXBlKTsKICAgIH0KICAgIHJldHVybiBzdXBlci5jb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdHJ5Q29udmVydFRvQnVpbHRpbigKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEhHcmFwaCBncmFwaCwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgSkNvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nKSB7CiAgICBISW5zdHJ1Y3Rpb24gaW5wdXQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBpZiAoaW5wdXQuaXNOdW1iZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBIQWJzIGNvbnZlcnRlZCA9IG5ldyBIQWJzKGlucHV0LCBpbnN0cnVjdGlvbi5zZWxlY3RvciwKICAgICAgICAgIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIGNsb3NlZFdvcmxkKSk7CiAgICAgIGxvZz8ucmVnaXN0ZXJBYnMoaW5zdHJ1Y3Rpb24sIGNvbnZlcnRlZCk7CiAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHt9Cn0KCmFic3RyYWN0IGNsYXNzIEJpbmFyeUFyaXRobWV0aWNTcGVjaWFsaXplciBleHRlbmRzIEludm9rZUR5bmFtaWNTcGVjaWFsaXplciB7CiAgY29uc3QgQmluYXJ5QXJpdGhtZXRpY1NwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBISW5zdHJ1Y3Rpb24gbGVmdCA9IGluc3RydWN0aW9uLmlucHV0c1sxXTsKICAgIEhJbnN0cnVjdGlvbiByaWdodCA9IGluc3RydWN0aW9uLmlucHV0c1syXTsKICAgIGlmIChsZWZ0CiAgICAgICAgICAgIC5pc0ludGVnZXJPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICByaWdodAogICAgICAgICAgICAuaXNJbnRlZ2VyT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmludFR5cGU7CiAgICB9CiAgICBpZiAobGVmdC5pc051bWJlck9yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIGlmIChsZWZ0CiAgICAgICAgICAgICAgLmlzRG91YmxlT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgfHwKICAgICAgICAgIHJpZ2h0CiAgICAgICAgICAgICAgLmlzRG91YmxlT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5kb3VibGVUeXBlOwogICAgICB9CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLm51bVR5cGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpOwogIH0KCiAgYm9vbCBpc0J1aWx0aW4oSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIGluc3RydWN0aW9uLmlucHV0c1sxXQogICAgICAgICAgICAuaXNOdW1iZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMl0KICAgICAgICAgICAgLmlzTnVtYmVyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHRyeUNvbnZlcnRUb0J1aWx0aW4oCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBIR3JhcGggZ3JhcGgsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIEpDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZykgewogICAgaWYgKGlzQnVpbHRpbihpbnN0cnVjdGlvbiwgY2xvc2VkV29ybGQpKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBidWlsdGluID0KICAgICAgICAgIG5ld0J1aWx0aW5WYXJpYW50KGluc3RydWN0aW9uLCByZXN1bHRzLCBjbG9zZWRXb3JsZCk7CiAgICAgIGlmIChsb2cgIT0gbnVsbCkgewogICAgICAgIHJlZ2lzdGVyT3B0aW1pemF0aW9uKGxvZywgaW5zdHJ1Y3Rpb24sIGJ1aWx0aW4pOwogICAgICB9CiAgICAgIGlmIChidWlsdGluICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gYnVpbHRpbjsKICAgICAgfQogICAgICAvLyBFdmVuIGlmIHRoZXJlIGlzIG5vIGJ1aWx0aW4gZXF1aXZhbGVudCBpbnN0cnVjdGlvbiwgd2Uga25vdwogICAgICAvLyB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3QsIGFuZCB0aGF0IGl0CiAgICAgIC8vIGNhbiBiZSBHVk4nZWQuCiAgICAgIGNsZWFyQWxsU2lkZUVmZmVjdHMoaW5zdHJ1Y3Rpb24pOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBib29sIGlucHV0c0FyZU51bShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMl07CiAgICByZXR1cm4gbGVmdAogICAgICAgICAgICAuaXNOdW1iZXJPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICByaWdodC5pc051bWJlck9yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlOwogIH0KCiAgYm9vbCBpbnB1dHNBcmVQb3NpdGl2ZUludGVnZXJzKAogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMl07CiAgICByZXR1cm4gbGVmdAogICAgICAgICAgICAuaXNQb3NpdGl2ZUludGVnZXJPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICByaWdodAogICAgICAgICAgICAuaXNQb3NpdGl2ZUludGVnZXJPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWU7CiAgfQoKICBib29sIGlucHV0c0FyZVVJbnQzMShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMl07CiAgICByZXR1cm4gbGVmdC5pc1VJbnQzMShjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgcmlnaHQuaXNVSW50MzEoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZTsKICB9CgogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudChISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKTsKCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCk7Cn0KCmNsYXNzIEFkZFNwZWNpYWxpemVyIGV4dGVuZHMgQmluYXJ5QXJpdGhtZXRpY1NwZWNpYWxpemVyIHsKICBjb25zdCBBZGRTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKGlucHV0c0FyZVVJbnQzMShpbnN0cnVjdGlvbiwgY2xvc2VkV29ybGQpKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLnVpbnQzMlR5cGU7CiAgICB9CiAgICBpZiAoaW5wdXRzQXJlUG9zaXRpdmVJbnRlZ2VycyhpbnN0cnVjdGlvbiwgY2xvc2VkV29ybGQpKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLnBvc2l0aXZlSW50VHlwZTsKICAgIH0KICAgIHJldHVybiBzdXBlci5jb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uYWRkOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIG5ld0J1aWx0aW5WYXJpYW50KEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBuZXcgSEFkZCgKICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMV0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdLAogICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yLAogICAgICAgIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIGNsb3NlZFdvcmxkKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyT3B0aW1pemF0aW9uKAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZywgSEluc3RydWN0aW9uIG9yaWdpbmFsLCBISW5zdHJ1Y3Rpb24gY29udmVydGVkKSB7CiAgICBsb2cucmVnaXN0ZXJBZGQob3JpZ2luYWwsIGNvbnZlcnRlZCk7CiAgfQp9CgpjbGFzcyBEaXZpZGVTcGVjaWFsaXplciBleHRlbmRzIEJpbmFyeUFyaXRobWV0aWNTcGVjaWFsaXplciB7CiAgY29uc3QgRGl2aWRlU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmRpdmlkZTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBpZiAobGVmdC5pc051bWJlck9yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmRvdWJsZVR5cGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIG5ld0J1aWx0aW5WYXJpYW50KEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBuZXcgSERpdmlkZShpbnN0cnVjdGlvbi5pbnB1dHNbMV0sIGluc3RydWN0aW9uLmlucHV0c1syXSwKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5kb3VibGVUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3RlckRpdmlkZShvcmlnaW5hbCwgY29udmVydGVkKTsKICB9Cn0KCmNsYXNzIE1vZHVsb1NwZWNpYWxpemVyIGV4dGVuZHMgQmluYXJ5QXJpdGhtZXRpY1NwZWNpYWxpemVyIHsKICBjb25zdCBNb2R1bG9TcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKGlucHV0c0FyZVBvc2l0aXZlSW50ZWdlcnMoaW5zdHJ1Y3Rpb24sIGNsb3NlZFdvcmxkKSkgewogICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5wb3NpdGl2ZUludFR5cGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLm1vZHVsbzsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudChISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICAvLyBNb2R1bG8gY2Fubm90IGJlIG1hcHBlZCB0byB0aGUgbmF0aXZlIG9wZXJhdG9yIChkaWZmZXJlbnQgc2VtYW50aWNzKS4KCiAgICAvLyBXZSBjYW4gdXNlIEhSZW1haW5kZXIgaWYgYm90aCBpbnB1dHMgYXJlIG5vbi1uZWdhdGl2ZSBhbmQgdGhlIHJlY2VpdmVyCiAgICAvLyBjYW5ub3QgYmUgLTAuMC4gIE5vdGUgdGhhdCAtMC4wIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gaW50LCBzbyB1bnRpbCB3ZQogICAgLy8gdHJhY2sgLTAuMCBwcmVjaXNlbHksIHdlIGhhdmUgdG8gc3ludGF0aWNhbGx5IGZpbHRlciBpbnB1dHMgdGhhdCBjYW5ub3QKICAgIC8vIGdlbmVyYXRlIC0wLjAuCiAgICBib29sIGNhbkJlUG9zaXRpdmVaZXJvKEhJbnN0cnVjdGlvbiBpbnB1dCkgewogICAgICBpZiAoaW5wdXQgaXMgSENvbnN0YW50KSB7CiAgICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IGlucHV0LmNvbnN0YW50OwogICAgICAgIGlmICh2YWx1ZSBpcyBEb3VibGVDb25zdGFudFZhbHVlICYmIHZhbHVlLmlzWmVybykgcmV0dXJuIHRydWU7CiAgICAgICAgaWYgKHZhbHVlIGlzIEludENvbnN0YW50VmFsdWUgJiYgdmFsdWUuaXNaZXJvKSByZXR1cm4gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgYm9vbCBpblBoaSA9IGZhbHNlOwogICAgYm9vbCBjYW5CZU5lZ2F0aXZlWmVybyhISW5zdHJ1Y3Rpb24gaW5wdXQpIHsKICAgICAgaWYgKGlucHV0IGlzIEhDb25zdGFudCkgewogICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBpbnB1dC5jb25zdGFudDsKICAgICAgICBpZiAodmFsdWUgaXMgRG91YmxlQ29uc3RhbnRWYWx1ZSAmJiB2YWx1ZS5pc01pbnVzWmVybykgcmV0dXJuIHRydWU7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmIChpbnB1dCBpcyBIQWRkKSB7CiAgICAgICAgLy8gJysnIGNhbiBvbmx5IGdlbmVyYXRlIC0wLjAgd2hlbiBib3RoIGlucHV0cyBhcmUgLTAuMC4KICAgICAgICByZXR1cm4gY2FuQmVOZWdhdGl2ZVplcm8oaW5wdXQubGVmdCkgJiYgY2FuQmVOZWdhdGl2ZVplcm8oaW5wdXQucmlnaHQpOwogICAgICB9CiAgICAgIGlmIChpbnB1dCBpcyBIU3VidHJhY3QpIHsKICAgICAgICByZXR1cm4gY2FuQmVOZWdhdGl2ZVplcm8oaW5wdXQubGVmdCkgJiYgY2FuQmVQb3NpdGl2ZVplcm8oaW5wdXQucmlnaHQpOwogICAgICB9CiAgICAgIGlmIChpbnB1dCBpcyBIUGhpKSB7CiAgICAgICAgaWYgKGluUGhpKSByZXR1cm4gdHJ1ZTsKICAgICAgICBpblBoaSA9IHRydWU7CiAgICAgICAgYm9vbCByZXN1bHQgPSBpbnB1dC5pbnB1dHMuYW55KGNhbkJlTmVnYXRpdmVaZXJvKTsKICAgICAgICBpblBoaSA9IGZhbHNlOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgaWYgKGlucHV0c0FyZVBvc2l0aXZlSW50ZWdlcnMoaW5zdHJ1Y3Rpb24sIGNsb3NlZFdvcmxkKSAmJgogICAgICAgICFjYW5CZU5lZ2F0aXZlWmVybyhpbnN0cnVjdGlvbi5nZXREYXJ0UmVjZWl2ZXIoY2xvc2VkV29ybGQpKSkgewogICAgICByZXR1cm4gbmV3IEhSZW1haW5kZXIoCiAgICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMV0sCiAgICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwKICAgICAgICAgIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIGNsb3NlZFdvcmxkKSk7CiAgICB9CiAgICAvLyBUT0RPKHNyYSk6CiAgICAvLyAgIGEgJSBOIC0tPiAgYSAmIChOLTEpLCBOPTJeaywgd2hlcmUgYT49MCwgZG9lcyBub3QgaGF2ZSAtMC4wIHByb2JsZW0uCgogICAgLy8gVE9ETyhzcmEpOiBXZSBjb3VsZCBhdm9pZCBwcm9ibGVtcyB3aXRoIC0wLjAgaWYgd2UgZ2VuZXJhdGUgeCAlIHkgYXMgKHggKwogICAgLy8gMCkgJSB5LCBidXQgd2Ugd291bGQgaGF2ZSB0byBmaXggSEFkZCBvcHRpbWl6YXRpb25zLgoKICAgIC8vIFRPRE8oc3JhKTogV2UgY291bGQgcmVwbGFjZSAkbW9kIHdpdGggSFJlbWFpbmRlciB3aGVuIHdlIGRvbid0IGNhcmUgYWJvdXQKICAgIC8vIGEgLTAuMCByZXN1bHQgKGUuZy4gYSAlIDEwID09IDAsIGFbaSAlIDNdKS4gVGhpcyBpcyB0cmlja3ksIHNpbmNlIHdlCiAgICAvLyBkb24ndCB3YW50IHRvIHJ1aW4gR1ZOIG9wcG9ydHVuaXRpZXMuCiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3Rlck1vZHVsbyhvcmlnaW5hbCwgY29udmVydGVkKTsKICB9Cn0KCmNsYXNzIFJlbWFpbmRlclNwZWNpYWxpemVyIGV4dGVuZHMgQmluYXJ5QXJpdGhtZXRpY1NwZWNpYWxpemVyIHsKICBjb25zdCBSZW1haW5kZXJTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKGlucHV0c0FyZVBvc2l0aXZlSW50ZWdlcnMoaW5zdHJ1Y3Rpb24sIGNsb3NlZFdvcmxkKSkgewogICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5wb3NpdGl2ZUludFR5cGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLnJlbWFpbmRlcjsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudChISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbmV3IEhSZW1haW5kZXIoCiAgICAgICAgaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1syXSwKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwKICAgICAgICBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyUmVtYWluZGVyKG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgTXVsdGlwbHlTcGVjaWFsaXplciBleHRlbmRzIEJpbmFyeUFyaXRobWV0aWNTcGVjaWFsaXplciB7CiAgY29uc3QgTXVsdGlwbHlTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0ubXVsdGlwbHk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgaWYgKGlucHV0c0FyZVBvc2l0aXZlSW50ZWdlcnMoaW5zdHJ1Y3Rpb24sIGNsb3NlZFdvcmxkKSkgewogICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5wb3NpdGl2ZUludFR5cGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIG5ld0J1aWx0aW5WYXJpYW50KEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBuZXcgSE11bHRpcGx5KAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1sxXSwKICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsCiAgICAgICAgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3Rlck11bHRpcGx5KG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgU3VidHJhY3RTcGVjaWFsaXplciBleHRlbmRzIEJpbmFyeUFyaXRobWV0aWNTcGVjaWFsaXplciB7CiAgY29uc3QgU3VidHJhY3RTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uc3VidHJhY3Q7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gbmV3QnVpbHRpblZhcmlhbnQoSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIG5ldyBIU3VidHJhY3QoCiAgICAgICAgaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1syXSwKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwKICAgICAgICBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyU3VidHJhY3Qob3JpZ2luYWwsIGNvbnZlcnRlZCk7CiAgfQp9CgpjbGFzcyBUcnVuY2F0aW5nRGl2aWRlU3BlY2lhbGl6ZXIgZXh0ZW5kcyBCaW5hcnlBcml0aG1ldGljU3BlY2lhbGl6ZXIgewogIGNvbnN0IFRydW5jYXRpbmdEaXZpZGVTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0udHJ1bmNhdGluZ0RpdmlkZTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoaGFzVWludDMxUmVzdWx0KGluc3RydWN0aW9uLCBjbG9zZWRXb3JsZCkpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4udWludDMxVHlwZTsKICAgIH0KICAgIGlmIChpbnB1dHNBcmVQb3NpdGl2ZUludGVnZXJzKGluc3RydWN0aW9uLCBjbG9zZWRXb3JsZCkpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4ucG9zaXRpdmVJbnRUeXBlOwogICAgfQogICAgaWYgKGlucHV0c0FyZU51bShpbnN0cnVjdGlvbiwgY2xvc2VkV29ybGQpKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmludFR5cGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpOwogIH0KCiAgYm9vbCBpc05vdFplcm8oSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBpZiAoIWluc3RydWN0aW9uLmlzQ29uc3RhbnRJbnRlZ2VyKCkpIHJldHVybiBmYWxzZTsKICAgIEhDb25zdGFudCByaWdodENvbnN0YW50ID0gaW5zdHJ1Y3Rpb247CiAgICBJbnRDb25zdGFudFZhbHVlIGludENvbnN0YW50ID0gcmlnaHRDb25zdGFudC5jb25zdGFudDsKICAgIEJpZ0ludCBjb3VudCA9IGludENvbnN0YW50LmludFZhbHVlOwogICAgcmV0dXJuIGNvdW50ICE9IEJpZ0ludC56ZXJvOwogIH0KCiAgYm9vbCBpc1R3b09yR3JlYXRlcihISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGlmICghaW5zdHJ1Y3Rpb24uaXNDb25zdGFudEludGVnZXIoKSkgcmV0dXJuIGZhbHNlOwogICAgSENvbnN0YW50IHJpZ2h0Q29uc3RhbnQgPSBpbnN0cnVjdGlvbjsKICAgIEludENvbnN0YW50VmFsdWUgaW50Q29uc3RhbnQgPSByaWdodENvbnN0YW50LmNvbnN0YW50OwogICAgQmlnSW50IGNvdW50ID0gaW50Q29uc3RhbnQuaW50VmFsdWU7CiAgICByZXR1cm4gY291bnQgPj0gQmlnSW50LnR3bzsKICB9CgogIGJvb2wgaGFzVWludDMxUmVzdWx0KEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBISW5zdHJ1Y3Rpb24gbGVmdCA9IGluc3RydWN0aW9uLmlucHV0c1sxXTsKICAgIEhJbnN0cnVjdGlvbiByaWdodCA9IGluc3RydWN0aW9uLmlucHV0c1syXTsKICAgIGlmIChyaWdodAogICAgICAgIC5pc1Bvc2l0aXZlSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIGlmIChsZWZ0LmlzVUludDMxKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICAgIGlzTm90WmVybyhyaWdodCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAobGVmdC5pc1VJbnQzMihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgICBpc1R3b09yR3JlYXRlcihyaWdodCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHRyeUNvbnZlcnRUb0J1aWx0aW4oCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBIR3JhcGggZ3JhcGgsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIEpDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZykgewogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdOwogICAgaWYgKGlzQnVpbHRpbihpbnN0cnVjdGlvbiwgY2xvc2VkV29ybGQpKSB7CiAgICAgIGlmIChyaWdodAogICAgICAgICAgICAgIC5pc1Bvc2l0aXZlSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgICBpc05vdFplcm8ocmlnaHQpKSB7CiAgICAgICAgaWYgKGhhc1VpbnQzMVJlc3VsdChpbnN0cnVjdGlvbiwgY2xvc2VkV29ybGQpKSB7CiAgICAgICAgICBISW5zdHJ1Y3Rpb24gY29udmVydGVkID0KICAgICAgICAgICAgICBuZXdCdWlsdGluVmFyaWFudChpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpOwogICAgICAgICAgaWYgKGxvZyAhPSBudWxsKSB7CiAgICAgICAgICAgIHJlZ2lzdGVyT3B0aW1pemF0aW9uKGxvZywgaW5zdHJ1Y3Rpb24sIGNvbnZlcnRlZCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gY29udmVydGVkOwogICAgICAgIH0KICAgICAgICAvLyBXZSBjYW4gY2FsbCBfdGRpdkZhc3QgYmVjYXVzZSB0aGUgcmhzIGlzIGEgMzJiaXQgaW50ZWdlcgogICAgICAgIC8vIGFuZCBub3QgMCwgbm9yIC0xLgogICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yID0gcmVuYW1lVG9PcHRpbWl6ZWRTZWxlY3RvcigKICAgICAgICAgICAgJ190ZGl2RmFzdCcsIGluc3RydWN0aW9uLnNlbGVjdG9yLCBjb21tb25FbGVtZW50cyk7CiAgICAgICAgaWYgKGxvZyAhPSBudWxsKSB7CiAgICAgICAgICByZWdpc3Rlck9wdGltaXphdGlvbihsb2csIGluc3RydWN0aW9uLCBudWxsKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2xlYXJBbGxTaWRlRWZmZWN0cyhpbnN0cnVjdGlvbik7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudChISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbmV3IEhUcnVuY2F0aW5nRGl2aWRlKAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1sxXSwKICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsCiAgICAgICAgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3RlclRydW5jYXRpbmdEaXZpZGUob3JpZ2luYWwsIGNvbnZlcnRlZCk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBCaW5hcnlCaXRPcFNwZWNpYWxpemVyIGV4dGVuZHMgQmluYXJ5QXJpdGhtZXRpY1NwZWNpYWxpemVyIHsKICBjb25zdCBCaW5hcnlCaXRPcFNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICAvLyBBbGwgYml0d2lzZSBvcGVyYXRpb25zIG9uIG51bWJlciB0eXBlcyBlaXRoZXIgcHJvZHVjZSBhbiB1bnNpZ25lZCAzMi1iaXQKICAgIC8vIGludGVnZXIgb3IgdGhyb3cgYW4gZXJyb3IuCiAgICBISW5zdHJ1Y3Rpb24gbGVmdCA9IGluc3RydWN0aW9uLmlucHV0c1sxXTsKICAgIGlmIChsZWZ0LmlzTnVtYmVyT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4udWludDMyVHlwZTsKICAgIH0KICAgIHJldHVybiBzdXBlci5jb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBjbG9zZWRXb3JsZCk7CiAgfQoKICBib29sIGFyZ3VtZW50TGVzc1RoYW4zMihISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIHJldHVybiBhcmd1bWVudEluUmFuZ2UoaW5zdHJ1Y3Rpb24sIDAsIDMxKTsKICB9CgogIGJvb2wgYXJndW1lbnRJblJhbmdlKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwgaW50IGxvdywgaW50IGhpZ2gpIHsKICAgIGlmIChpbnN0cnVjdGlvbi5pc0NvbnN0YW50SW50ZWdlcigpKSB7CiAgICAgIEhDb25zdGFudCByaWdodENvbnN0YW50ID0gaW5zdHJ1Y3Rpb247CiAgICAgIEludENvbnN0YW50VmFsdWUgaW50Q29uc3RhbnQgPSByaWdodENvbnN0YW50LmNvbnN0YW50OwogICAgICBpbnQgdmFsdWUgPSBpbnRDb25zdGFudC5pbnRWYWx1ZS50b0ludCgpOwogICAgICBhc3NlcnQoaW50Q29uc3RhbnQuaW50VmFsdWUgPT0KICAgICAgICAgIG5ldyBCaWdJbnQuZnJvbShpbnRDb25zdGFudC5pbnRWYWx1ZS50b0ludCgpKSk7CiAgICAgIHJldHVybiB2YWx1ZSA+PSBsb3cgJiYgdmFsdWUgPD0gaGlnaDsKICAgIH0KICAgIC8vIFRPRE8oc3JhKTogSW50ZWdyYXRlIHdpdGggdGhlIGJpdC13aWR0aCBhbmFseXNpcyBpbiBjb2RlZ2VuLmRhcnQuCiAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSEJpdEFuZCkgewogICAgICByZXR1cm4gbG93ID09IDAgJiYKICAgICAgICAgIChhcmd1bWVudEluUmFuZ2UoaW5zdHJ1Y3Rpb24uaW5wdXRzWzBdLCBsb3csIGhpZ2gpIHx8CiAgICAgICAgICAgICAgYXJndW1lbnRJblJhbmdlKGluc3RydWN0aW9uLmlucHV0c1sxXSwgbG93LCBoaWdoKSk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIGlzUG9zaXRpdmUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIC8vIFRPRE86IFdlIHNob3VsZCB1c2UgdGhlIHZhbHVlIHJhbmdlIGFuYWx5c2lzLiBDdXJyZW50bHksIHJhbmdlcwogICAgLy8gYXJlIGRpc2NhcmRlZCBqdXN0IGFmdGVyIHRoZSBhbmFseXNpcy4KICAgIHJldHVybiBpbnN0cnVjdGlvbgogICAgICAgIC5pc1Bvc2l0aXZlSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlOwogIH0KfQoKY2xhc3MgU2hpZnRMZWZ0U3BlY2lhbGl6ZXIgZXh0ZW5kcyBCaW5hcnlCaXRPcFNwZWNpYWxpemVyIHsKICBjb25zdCBTaGlmdExlZnRTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uc2hpZnRMZWZ0OwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHRyeUNvbnZlcnRUb0J1aWx0aW4oCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBIR3JhcGggZ3JhcGgsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIEpDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZykgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMl07CiAgICBpZiAobGVmdC5pc051bWJlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIGlmIChhcmd1bWVudExlc3NUaGFuMzIocmlnaHQpKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGNvbnZlcnRlZCA9CiAgICAgICAgICAgIG5ld0J1aWx0aW5WYXJpYW50KGluc3RydWN0aW9uLCByZXN1bHRzLCBjbG9zZWRXb3JsZCk7CiAgICAgICAgaWYgKGxvZyAhPSBudWxsKSB7CiAgICAgICAgICByZWdpc3Rlck9wdGltaXphdGlvbihsb2csIGluc3RydWN0aW9uLCBjb252ZXJ0ZWQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29udmVydGVkOwogICAgICB9CiAgICAgIC8vIEV2ZW4gaWYgdGhlcmUgaXMgbm8gYnVpbHRpbiBlcXVpdmFsZW50IGluc3RydWN0aW9uLCB3ZSBrbm93CiAgICAgIC8vIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdCwgYW5kIHRoYXQgaXQKICAgICAgLy8gY2FuIGJlIEdWTidlZC4KICAgICAgY2xlYXJBbGxTaWRlRWZmZWN0cyhpbnN0cnVjdGlvbik7CiAgICAgIGlmIChpc1Bvc2l0aXZlKHJpZ2h0LCBjbG9zZWRXb3JsZCkpIHsKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciA9IHJlbmFtZVRvT3B0aW1pemVkU2VsZWN0b3IoCiAgICAgICAgICAgICdfc2hsUG9zaXRpdmUnLCBpbnN0cnVjdGlvbi5zZWxlY3RvciwgY29tbW9uRWxlbWVudHMpOwogICAgICB9CiAgICAgIGlmIChsb2cgIT0gbnVsbCkgewogICAgICAgIHJlZ2lzdGVyT3B0aW1pemF0aW9uKGxvZywgaW5zdHJ1Y3Rpb24sIG51bGwpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudChISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbmV3IEhTaGlmdExlZnQoCiAgICAgICAgaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1syXSwKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwKICAgICAgICBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyU2hpZnRMZWZ0KG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgU2hpZnRSaWdodFNwZWNpYWxpemVyIGV4dGVuZHMgQmluYXJ5Qml0T3BTcGVjaWFsaXplciB7CiAgY29uc3QgU2hpZnRSaWdodFNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBISW5zdHJ1Y3Rpb24gbGVmdCA9IGluc3RydWN0aW9uLmlucHV0c1sxXTsKICAgIGlmIChsZWZ0LmlzVUludDMyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIGxlZnQuaW5zdHJ1Y3Rpb25UeXBlOwogICAgfQogICAgcmV0dXJuIHN1cGVyLmNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB0cnlDb252ZXJ0VG9CdWlsdGluKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2cpIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdOwogICAgaWYgKGxlZnQuaXNOdW1iZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBpZiAoYXJndW1lbnRMZXNzVGhhbjMyKHJpZ2h0KSAmJiBpc1Bvc2l0aXZlKGxlZnQsIGNsb3NlZFdvcmxkKSkgewogICAgICAgIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQgPQogICAgICAgICAgICBuZXdCdWlsdGluVmFyaWFudChpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpOwogICAgICAgIGlmIChsb2cgIT0gbnVsbCkgewogICAgICAgICAgcmVnaXN0ZXJPcHRpbWl6YXRpb24obG9nLCBpbnN0cnVjdGlvbiwgY29udmVydGVkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZDsKICAgICAgfQogICAgICAvLyBFdmVuIGlmIHRoZXJlIGlzIG5vIGJ1aWx0aW4gZXF1aXZhbGVudCBpbnN0cnVjdGlvbiwgd2Uga25vdwogICAgICAvLyB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3QsIGFuZCB0aGF0IGl0CiAgICAgIC8vIGNhbiBiZSBHVk4nZWQuCiAgICAgIGNsZWFyQWxsU2lkZUVmZmVjdHMoaW5zdHJ1Y3Rpb24pOwogICAgICBpZiAoaXNQb3NpdGl2ZShyaWdodCwgY2xvc2VkV29ybGQpICYmIGlzUG9zaXRpdmUobGVmdCwgY2xvc2VkV29ybGQpKSB7CiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IgPSByZW5hbWVUb09wdGltaXplZFNlbGVjdG9yKAogICAgICAgICAgICAnX3NockJvdGhQb3NpdGl2ZScsIGluc3RydWN0aW9uLnNlbGVjdG9yLCBjb21tb25FbGVtZW50cyk7CiAgICAgICAgaWYgKGxvZyAhPSBudWxsKSB7CiAgICAgICAgICByZWdpc3Rlck9wdGltaXphdGlvbihsb2csIGluc3RydWN0aW9uLCBudWxsKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaXNQb3NpdGl2ZShsZWZ0LCBjbG9zZWRXb3JsZCkgJiYKICAgICAgICAgIHJpZ2h0LmlzTnVtYmVyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciA9IHJlbmFtZVRvT3B0aW1pemVkU2VsZWN0b3IoCiAgICAgICAgICAgICdfc2hyUmVjZWl2ZXJQb3NpdGl2ZScsIGluc3RydWN0aW9uLnNlbGVjdG9yLCBjb21tb25FbGVtZW50cyk7CiAgICAgICAgaWYgKGxvZyAhPSBudWxsKSB7CiAgICAgICAgICByZWdpc3Rlck9wdGltaXphdGlvbihsb2csIGluc3RydWN0aW9uLCBudWxsKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaXNQb3NpdGl2ZShyaWdodCwgY2xvc2VkV29ybGQpKSB7CiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IgPSByZW5hbWVUb09wdGltaXplZFNlbGVjdG9yKAogICAgICAgICAgICAnX3Nock90aGVyUG9zaXRpdmUnLCBpbnN0cnVjdGlvbi5zZWxlY3RvciwgY29tbW9uRWxlbWVudHMpOwogICAgICAgIGlmIChsb2cgIT0gbnVsbCkgewogICAgICAgICAgcmVnaXN0ZXJPcHRpbWl6YXRpb24obG9nLCBpbnN0cnVjdGlvbiwgbnVsbCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudChISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbmV3IEhTaGlmdFJpZ2h0KAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1sxXSwKICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsCiAgICAgICAgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5zaGlmdFJpZ2h0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyU2hpZnRSaWdodChvcmlnaW5hbCwgY29udmVydGVkKTsKICB9Cn0KCmNsYXNzIEJpdE9yU3BlY2lhbGl6ZXIgZXh0ZW5kcyBCaW5hcnlCaXRPcFNwZWNpYWxpemVyIHsKICBjb25zdCBCaXRPclNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5iaXRPcjsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBISW5zdHJ1Y3Rpb24gbGVmdCA9IGluc3RydWN0aW9uLmlucHV0c1sxXTsKICAgIEhJbnN0cnVjdGlvbiByaWdodCA9IGluc3RydWN0aW9uLmlucHV0c1syXTsKICAgIGlmIChsZWZ0LmlzVUludDMxKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICByaWdodC5pc1VJbnQzMShjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLnVpbnQzMVR5cGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIG5ld0J1aWx0aW5WYXJpYW50KEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBuZXcgSEJpdE9yKAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1sxXSwKICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsCiAgICAgICAgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3RlckJpdE9yKG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgQml0QW5kU3BlY2lhbGl6ZXIgZXh0ZW5kcyBCaW5hcnlCaXRPcFNwZWNpYWxpemVyIHsKICBjb25zdCBCaXRBbmRTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uYml0QW5kOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdOwogICAgaWYgKGxlZnQKICAgICAgICAgICAgLmlzUHJpbWl0aXZlT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgKGxlZnQuaXNVSW50MzEoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSB8fAogICAgICAgICAgICByaWdodC5pc1VJbnQzMShjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSkgewogICAgICByZXR1cm4gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi51aW50MzFUeXBlOwogICAgfQogICAgcmV0dXJuIHN1cGVyLmNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXMoaW5zdHJ1Y3Rpb24sIHJlc3VsdHMsIGNsb3NlZFdvcmxkKTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudChISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbmV3IEhCaXRBbmQoCiAgICAgICAgaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1syXSwKICAgICAgICBpbnN0cnVjdGlvbi5zZWxlY3RvciwKICAgICAgICBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBjbG9zZWRXb3JsZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyQml0QW5kKG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgQml0WG9yU3BlY2lhbGl6ZXIgZXh0ZW5kcyBCaW5hcnlCaXRPcFNwZWNpYWxpemVyIHsKICBjb25zdCBCaXRYb3JTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uYml0WG9yOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdOwogICAgaWYgKGxlZnQuaXNVSW50MzEoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgIHJpZ2h0LmlzVUludDMxKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4udWludDMxVHlwZTsKICAgIH0KICAgIHJldHVybiBzdXBlci5jb21wdXRlVHlwZUZyb21JbnB1dFR5cGVzKGluc3RydWN0aW9uLCByZXN1bHRzLCBjbG9zZWRXb3JsZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gbmV3QnVpbHRpblZhcmlhbnQoSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIG5ldyBIQml0WG9yKAogICAgICAgIGluc3RydWN0aW9uLmlucHV0c1sxXSwKICAgICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsCiAgICAgICAgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3RlckJpdFhvcihvcmlnaW5hbCwgY29udmVydGVkKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIFJlbGF0aW9uYWxTcGVjaWFsaXplciBleHRlbmRzIEludm9rZUR5bmFtaWNTcGVjaWFsaXplciB7CiAgY29uc3QgUmVsYXRpb25hbFNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICBpZiAoaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdCiAgICAgICAgLmlzUHJpbWl0aXZlT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHRyeUNvbnZlcnRUb0J1aWx0aW4oCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBIR3JhcGggZ3JhcGgsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIEpDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZykgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMl07CiAgICBpZiAobGVmdC5pc051bWJlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgcmlnaHQuaXNOdW1iZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBISW5zdHJ1Y3Rpb24gY29udmVydGVkID0gbmV3QnVpbHRpblZhcmlhbnQoaW5zdHJ1Y3Rpb24sIGNsb3NlZFdvcmxkKTsKICAgICAgaWYgKGxvZyAhPSBudWxsKSB7CiAgICAgICAgcmVnaXN0ZXJPcHRpbWl6YXRpb24obG9nLCBpbnN0cnVjdGlvbiwgY29udmVydGVkKTsKICAgICAgfQogICAgICByZXR1cm4gY29udmVydGVkOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBISW5zdHJ1Y3Rpb24gbmV3QnVpbHRpblZhcmlhbnQoCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpOwoKICB2b2lkIHJlZ2lzdGVyT3B0aW1pemF0aW9uKAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZywgSEluc3RydWN0aW9uIG9yaWdpbmFsLCBISW5zdHJ1Y3Rpb24gY29udmVydGVkKTsKfQoKY2xhc3MgRXF1YWxzU3BlY2lhbGl6ZXIgZXh0ZW5kcyBSZWxhdGlvbmFsU3BlY2lhbGl6ZXIgewogIGNvbnN0IEVxdWFsc1NwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB0cnlDb252ZXJ0VG9CdWlsdGluKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2cpIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdOwogICAgQWJzdHJhY3RWYWx1ZSBpbnN0cnVjdGlvblR5cGUgPSBsZWZ0Lmluc3RydWN0aW9uVHlwZTsKICAgIGlmIChyaWdodC5pc0NvbnN0YW50TnVsbCgpIHx8CiAgICAgICAgbGVmdAogICAgICAgICAgICAuaXNQcmltaXRpdmVPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgSEluc3RydWN0aW9uIGNvbnZlcnRlZCA9IG5ld0J1aWx0aW5WYXJpYW50KGluc3RydWN0aW9uLCBjbG9zZWRXb3JsZCk7CiAgICAgIGlmIChsb2cgIT0gbnVsbCkgewogICAgICAgIHJlZ2lzdGVyT3B0aW1pemF0aW9uKGxvZywgaW5zdHJ1Y3Rpb24sIGNvbnZlcnRlZCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnZlcnRlZDsKICAgIH0KICAgIGlmIChjbG9zZWRXb3JsZC5pbmNsdWRlc0Nsb3N1cmVDYWxsKAogICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yLCBpbnN0cnVjdGlvblR5cGUpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBtYXRjaGVzID0KICAgICAgICBjbG9zZWRXb3JsZC5sb2NhdGVNZW1iZXJzKGluc3RydWN0aW9uLnNlbGVjdG9yLCBpbnN0cnVjdGlvblR5cGUpOwogICAgLy8gVGhpcyB0ZXN0IHJlbGllcyBvbiBgT2JqZWN0Lj09YCBhbmQgYEludGVyY2VwdG9yLj09YCBhbHdheXMgYmVpbmcKICAgIC8vIGltcGxlbWVudGVkIGJlY2F1c2UgaWYgdGhlIHNlbGVjdG9yIG1hdGNoZXMgYnkgc3VidHlwZSwgaXQgc3RpbGwgd2lsbCBiZQogICAgLy8gYSByZWd1bGFyIG9iamVjdCBvciBhbiBpbnRlcmNlcHRvci4KICAgIGlmIChtYXRjaGVzCiAgICAgICAgLmV2ZXJ5KGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmlzRGVmYXVsdEVxdWFsaXR5SW1wbGVtZW50YXRpb24pKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQgPSBuZXdCdWlsdGluVmFyaWFudChpbnN0cnVjdGlvbiwgY2xvc2VkV29ybGQpOwogICAgICBpZiAobG9nICE9IG51bGwpIHsKICAgICAgICByZWdpc3Rlck9wdGltaXphdGlvbihsb2csIGluc3RydWN0aW9uLCBjb252ZXJ0ZWQpOwogICAgICB9CiAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5lcXVhbDsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudCgKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIG5ldyBISWRlbnRpdHkoaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLCBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyRXF1YWxzKG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgTGVzc1NwZWNpYWxpemVyIGV4dGVuZHMgUmVsYXRpb25hbFNwZWNpYWxpemVyIHsKICBjb25zdCBMZXNzU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmxlc3M7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gbmV3QnVpbHRpblZhcmlhbnQoCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQpIHsKICAgIHJldHVybiBuZXcgSExlc3MoaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLCBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyTGVzcyhvcmlnaW5hbCwgY29udmVydGVkKTsKICB9Cn0KCmNsYXNzIEdyZWF0ZXJTcGVjaWFsaXplciBleHRlbmRzIFJlbGF0aW9uYWxTcGVjaWFsaXplciB7CiAgY29uc3QgR3JlYXRlclNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5ncmVhdGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIG5ld0J1aWx0aW5WYXJpYW50KAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbmV3IEhHcmVhdGVyKGluc3RydWN0aW9uLmlucHV0c1sxXSwgaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdLAogICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yLCBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3RlckdyZWF0ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCk7CiAgfQp9CgpjbGFzcyBHcmVhdGVyRXF1YWxTcGVjaWFsaXplciBleHRlbmRzIFJlbGF0aW9uYWxTcGVjaWFsaXplciB7CiAgY29uc3QgR3JlYXRlckVxdWFsU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmdyZWF0ZXJFcXVhbDsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiBuZXdCdWlsdGluVmFyaWFudCgKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogICAgcmV0dXJuIG5ldyBIR3JlYXRlckVxdWFsKGluc3RydWN0aW9uLmlucHV0c1sxXSwgaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdLAogICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yLCBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQpIHsKICAgIGxvZy5yZWdpc3RlckdyZWF0ZXJFcXVhbChvcmlnaW5hbCwgY29udmVydGVkKTsKICB9Cn0KCmNsYXNzIExlc3NFcXVhbFNwZWNpYWxpemVyIGV4dGVuZHMgUmVsYXRpb25hbFNwZWNpYWxpemVyIHsKICBjb25zdCBMZXNzRXF1YWxTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbigpIHsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0ubGVzc0VxdWFsOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIG5ld0J1aWx0aW5WYXJpYW50KAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkKSB7CiAgICByZXR1cm4gbmV3IEhMZXNzRXF1YWwoaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdLCBpbnN0cnVjdGlvbi5pbnB1dHNbMl0sCiAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck9wdGltaXphdGlvbigKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSEluc3RydWN0aW9uIGNvbnZlcnRlZCkgewogICAgbG9nLnJlZ2lzdGVyTGVzc0VxdWFsKG9yaWdpbmFsLCBjb252ZXJ0ZWQpOwogIH0KfQoKY2xhc3MgQ29kZVVuaXRBdFNwZWNpYWxpemVyIGV4dGVuZHMgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyIHsKICBjb25zdCBDb2RlVW5pdEF0U3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24oKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNvZGVVbml0QXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdHJ5Q29udmVydFRvQnVpbHRpbigKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEhHcmFwaCBncmFwaCwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgSkNvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nKSB7CiAgICAvLyBUT0RPKHNyYSk6IEltcGxlbWVudCBhIGJ1aWx0aW4gSENvZGVVbml0QXQgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBzYW1lIGluZGV4CiAgICAvLyBib3VuZHMgY2hlY2tpbmcgb3B0aW1pemF0aW9ucyBhcyBmb3IgSEluZGV4LgogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gaW5zdHJ1Y3Rpb24uZ2V0RGFydFJlY2VpdmVyKGNsb3NlZFdvcmxkKTsKICAgIGlmIChyZWNlaXZlcgogICAgICAgIC5pc1N0cmluZ09yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIC8vIEV2ZW4gaWYgdGhlcmUgaXMgbm8gYnVpbHRpbiBlcXVpdmFsZW50IGluc3RydWN0aW9uLCB3ZSBrbm93CiAgICAgIC8vIFN0cmluZy5jb2RlVW5pdEF0IGRvZXMgbm90IGhhdmUgYW55IHNpZGUgZWZmZWN0IChvdGhlciB0aGFuIHRocm93aW5nKSwKICAgICAgLy8gYW5kIHRoYXQgaXQgY2FuIGJlIEdWTidlZC4KICAgICAgY2xlYXJBbGxTaWRlRWZmZWN0cyhpbnN0cnVjdGlvbik7CiAgICAgIGlmIChpbnN0cnVjdGlvbi5pbnB1dHMubGFzdAogICAgICAgICAgLmlzUG9zaXRpdmVJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yID0gcmVuYW1lVG9PcHRpbWl6ZWRTZWxlY3RvcigKICAgICAgICAgICAgJ19jb2RlVW5pdEF0JywgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsIGNvbW1vbkVsZW1lbnRzKTsKICAgICAgfQogICAgICBsb2c/LnJlZ2lzdGVyQ29kZVVuaXRBdChpbnN0cnVjdGlvbik7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmNsYXNzIENvbXBhcmVUb1NwZWNpYWxpemVyIGV4dGVuZHMgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyIHsKICBjb25zdCBDb21wYXJlVG9TcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdHJ5Q29udmVydFRvQnVpbHRpbigKICAgICAgSEludm9rZUR5bmFtaWMgaW5zdHJ1Y3Rpb24sCiAgICAgIEhHcmFwaCBncmFwaCwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgcmVzdWx0cywKICAgICAgSkNvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIE9wdGltaXphdGlvblRlc3RMb2cgbG9nKSB7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBpbnN0cnVjdGlvbi5nZXREYXJ0UmVjZWl2ZXIoY2xvc2VkV29ybGQpOwogICAgLy8gYGNvbXBhcmVUb2AgaGFzIG5vIHNpZGUtZWZmZWN0IChvdGhlciB0aGFuIHRocm93aW5nKSBhbmQgY2FuIGJlIEdWTidlZAogICAgLy8gZm9yIHNvbWUga25vd24gdHlwZXMuCiAgICBpZiAocmVjZWl2ZXIKICAgICAgICAgICAgLmlzU3RyaW5nT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlIHx8CiAgICAgICAgcmVjZWl2ZXIKICAgICAgICAgICAgLmlzTnVtYmVyT3JOdWxsKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIC8vIFJlcGxhY2UgYGEuY29tcGFyZVRvKGEpYCB3aXRoIGAwYCwgYnV0IG9ubHkgaWYgcmVjZWl2ZXIgYW5kIGFyZ3VtZW50CiAgICAgIC8vIGFyZSBzdWNoIHRoYXQgbm8gZXhjZXB0aW9ucyBjYW4gYmUgdGhyb3duLgogICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQgPSBpbnN0cnVjdGlvbi5pbnB1dHMubGFzdDsKICAgICAgaWYgKChyZWNlaXZlcgogICAgICAgICAgICAgICAgICAuaXNOdW1iZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICAgICAgICBhcmd1bWVudAogICAgICAgICAgICAgICAgICAuaXNOdW1iZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHx8CiAgICAgICAgICAocmVjZWl2ZXIKICAgICAgICAgICAgICAgICAgLmlzU3RyaW5nKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgICAgICAgYXJndW1lbnQKICAgICAgICAgICAgICAgICAgLmlzU3RyaW5nKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSkgewogICAgICAgIGlmIChpZGVudGljYWwocmVjZWl2ZXIubm9uQ2hlY2soKSwgYXJndW1lbnQubm9uQ2hlY2soKSkpIHsKICAgICAgICAgIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQgPSBncmFwaC5hZGRDb25zdGFudEludCgwLCBjbG9zZWRXb3JsZCk7CiAgICAgICAgICBsb2c/LnJlZ2lzdGVyQ29tcGFyZVRvKGluc3RydWN0aW9uLCBjb252ZXJ0ZWQpOwogICAgICAgICAgcmV0dXJuIGNvbnZlcnRlZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2xlYXJBbGxTaWRlRWZmZWN0cyhpbnN0cnVjdGlvbik7CiAgICAgIGxvZz8ucmVnaXN0ZXJDb21wYXJlVG8oaW5zdHJ1Y3Rpb24pOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBJZGVtcG90ZW50U3RyaW5nT3BlcmF0aW9uU3BlY2lhbGl6ZXIKICAgIGV4dGVuZHMgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyIHsKICBjb25zdCBJZGVtcG90ZW50U3RyaW5nT3BlcmF0aW9uU3BlY2lhbGl6ZXIoKTsKCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHRyeUNvbnZlcnRUb0J1aWx0aW4oCiAgICAgIEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uLAogICAgICBIR3JhcGggZ3JhcGgsCiAgICAgIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHMsCiAgICAgIEpDb21tb25FbGVtZW50cyBjb21tb25FbGVtZW50cywKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZykgewogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gaW5zdHJ1Y3Rpb24uZ2V0RGFydFJlY2VpdmVyKGNsb3NlZFdvcmxkKTsKICAgIGlmIChyZWNlaXZlcgogICAgICAgIC5pc1N0cmluZ09yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIC8vIFN0cmluZy54eHggZG9lcyBub3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3QgKG90aGVyIHRoYW4gdGhyb3dpbmcpLCBhbmQgaXQKICAgICAgLy8gY2FuIGJlIEdWTidlZC4KICAgICAgY2xlYXJBbGxTaWRlRWZmZWN0cyhpbnN0cnVjdGlvbik7CiAgICAgIGlmIChsb2cgIT0gbnVsbCkgewogICAgICAgIHJlZ2lzdGVyT3B0aW1pemF0aW9uKGxvZywgaW5zdHJ1Y3Rpb24pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgcmVnaXN0ZXJPcHRpbWl6YXRpb24oT3B0aW1pemF0aW9uVGVzdExvZyBsb2csIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCk7Cn0KCmNsYXNzIFN1YnN0cmluZ1NwZWNpYWxpemVyIGV4dGVuZHMgSWRlbXBvdGVudFN0cmluZ09wZXJhdGlvblNwZWNpYWxpemVyIHsKICBjb25zdCBTdWJzdHJpbmdTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyT3B0aW1pemF0aW9uKE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwpIHsKICAgIGxvZy5yZWdpc3RlclN1YnN0cmluZyhvcmlnaW5hbCk7CiAgfQp9CgpjbGFzcyBUcmltU3BlY2lhbGl6ZXIgZXh0ZW5kcyBJZGVtcG90ZW50U3RyaW5nT3BlcmF0aW9uU3BlY2lhbGl6ZXIgewogIGNvbnN0IFRyaW1TcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyT3B0aW1pemF0aW9uKE9wdGltaXphdGlvblRlc3RMb2cgbG9nLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwpIHsKICAgIGxvZy5yZWdpc3RlclRyaW0ob3JpZ2luYWwpOwogIH0KfQoKY2xhc3MgUGF0dGVybk1hdGNoU3BlY2lhbGl6ZXIgZXh0ZW5kcyBJbnZva2VEeW5hbWljU3BlY2lhbGl6ZXIgewogIGNvbnN0IFBhdHRlcm5NYXRjaFNwZWNpYWxpemVyKCk7CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB0cnlDb252ZXJ0VG9CdWlsdGluKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgT3B0aW1pemF0aW9uVGVzdExvZyBsb2cpIHsKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IGluc3RydWN0aW9uLmdldERhcnRSZWNlaXZlcihjbG9zZWRXb3JsZCk7CiAgICBISW5zdHJ1Y3Rpb24gcGF0dGVybiA9IGluc3RydWN0aW9uLmlucHV0c1syXTsKICAgIGlmIChyZWNlaXZlcgogICAgICAgICAgICAuaXNTdHJpbmdPck51bGwoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICBwYXR0ZXJuCiAgICAgICAgICAgIC5pc1N0cmluZ09yTnVsbChjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAvLyBTdHJpbmcuY29udGFpbnMoU3RyaW5nIHMpIGRvZXMgbm90IGhhdmUgYW55IHNpZGUgZWZmZWN0IChvdGhlciB0aGFuCiAgICAgIC8vIHRocm93aW5nKSwgYW5kIGl0IGNhbiBiZSBHVk4nZWQuCiAgICAgIGNsZWFyQWxsU2lkZUVmZmVjdHMoaW5zdHJ1Y3Rpb24pOwogICAgICBsb2c/LnJlZ2lzdGVyUGF0dGVybk1hdGNoKGluc3RydWN0aW9uKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQoKY2xhc3MgUm91bmRTcGVjaWFsaXplciBleHRlbmRzIEludm9rZUR5bmFtaWNTcGVjaWFsaXplciB7CiAgY29uc3QgUm91bmRTcGVjaWFsaXplcigpOwoKICBAb3ZlcnJpZGUKICBjb25zdGFudF9zeXN0ZW0uVW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uKCkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5yb3VuZDsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB0cnlDb252ZXJ0VG9CdWlsdGluKAogICAgICBISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0cyByZXN1bHRzLAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRX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IVE0RhE5HUVQJCgiPh86QggsBhEEAgE+IAEMJCIUKiYgIUZOHRE9IRE9IU40NxQ9Jxc9KBQ9Jxc9KENJOhwKCCgrBhEEAgE0JzABDCQiFComICFGETkdUBgoGTAIBhEEAU0CAUogAQxOJQQCAUUbAQxOIAQCAUEjAQwkIhQqJiAhRjIRPSEQPSFNKiguBhEEAgE6HAEMLyIEAQwkIhQqJiAhRhE5HUlPKCcGEQQCATlwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvaW52b2tlX2R5bmFtaWNfc3BlY2lhbGl6ZXJzLmRhcnQvc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL3ZhbGlkYXRlLmRhcnSb/y8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ25vZGVzLmRhcnQnOwoKY2xhc3MgSFZhbGlkYXRvciBleHRlbmRzIEhJbnN0cnVjdGlvblZpc2l0b3IgewogIGJvb2wgaXNWYWxpZCA9IHRydWU7CiAgSEdyYXBoIGdyYXBoOwoKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIHZpc2l0ZWUpIHsKICAgIGdyYXBoID0gdmlzaXRlZTsKICAgIHZpc2l0RG9taW5hdG9yVHJlZSh2aXNpdGVlKTsKICB9CgogIHZvaWQgbWFya0ludmFsaWQoU3RyaW5nIHJlYXNvbikgewogICAgcHJpbnQocmVhc29uKTsKICAgIGlzVmFsaWQgPSBmYWxzZTsKICB9CgogIC8vIE5vdGUgdGhhdCBkdXJpbmcgY29uc3RydWN0aW9uIG9mIHRoZSBTc2EgZ3JhcGggdGhlIGJhc2ljIGJsb2NrcyBhcmUKICAvLyBub3QgcmVxdWlyZWQgdG8gYmUgdmFsaWQgeWV0LgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCYXNpY0Jsb2NrKEhCYXNpY0Jsb2NrIGJsb2NrKSB7CiAgICBjdXJyZW50QmxvY2sgPSBibG9jazsKICAgIGlmICghaXNWYWxpZCkgcmV0dXJuOyAvLyBEb24ndCBuZWVkIHRvIGNvbnRpbnVlIGlmIHdlIGFyZSBhbHJlYWR5IGludmFsaWQuCgogICAgLy8gVGVzdCB0aGF0IHRoZSBsYXN0IGluc3RydWN0aW9uIGlzIGEgYnJhbmNoaW5nIGluc3RydWN0aW9uIGFuZCB0aGF0IHRoZQogICAgLy8gYmFzaWMgYmxvY2sgY29udGFpbnMgdGhlIGJyYW5jaC10YXJnZXQuCiAgICBpZiAoYmxvY2suZmlyc3QgPT0gbnVsbCB8fCBibG9jay5sYXN0ID09IG51bGwpIHsKICAgICAgbWFya0ludmFsaWQoImVtcHR5IGJsb2NrIik7CiAgICB9CiAgICBpZiAoYmxvY2subGFzdCBpcyEgSENvbnRyb2xGbG93KSB7CiAgICAgIG1hcmtJbnZhbGlkKCJibG9jayBlbmRzIHdpdGggbm9uLXRhaWwgbm9kZS4iKTsKICAgIH0KICAgIGlmIChibG9jay5sYXN0IGlzIEhJZiAmJiBibG9jay5zdWNjZXNzb3JzLmxlbmd0aCAhPSAyKSB7CiAgICAgIG1hcmtJbnZhbGlkKCJJZiBub2RlIHdpdGhvdXQgdHdvIHN1Y2Nlc3NvcnMiKTsKICAgIH0KICAgIGlmIChibG9jay5sYXN0IGlzIEhDb25kaXRpb25hbEJyYW5jaCAmJiBibG9jay5zdWNjZXNzb3JzLmxlbmd0aCAhPSAyKSB7CiAgICAgIG1hcmtJbnZhbGlkKCJDb25kaXRpb25hbCBub2RlIHdpdGhvdXQgdHdvIHN1Y2Nlc3NvcnMiKTsKICAgIH0KICAgIGlmIChibG9jay5sYXN0IGlzIEhMb29wQnJhbmNoKSB7CiAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBibG9jayB3ZSBpbnNlcnRlZCB0byBhdm9pZCBjcml0aWNhbCBlZGdlcyBzYXRpc2ZpZXMKICAgICAgLy8gb3VyIGFzc3VtcHRpb25zLiBUaGF0IGlzLCBpdCBtdXN0IG5vdCBjb250YWluIGFueSBpbnN0cnVjdGlvbnMKICAgICAgLy8gKGFsdGhvdWdoIGl0IG1heSBjb250YWluIHBoaS11cGRhdGVzKS4KICAgICAgSEJhc2ljQmxvY2sgYXZvaWRDcml0aWNhbEVkZ2VCbG9jayA9IGJsb2NrLnN1Y2Nlc3NvcnMubGFzdDsKICAgICAgaWYgKGF2b2lkQ3JpdGljYWxFZGdlQmxvY2suZmlyc3QgaXMhIEhHb3RvKSB7CiAgICAgICAgbWFya0ludmFsaWQoIkNyaXRpY2FsIGVkZ2UgYmxvY2sgY29udGFpbnMgaW5zdHJ1Y3Rpb25zIik7CiAgICAgIH0KICAgIH0KICAgIGlmIChibG9jay5sYXN0IGlzIEhHb3RvICYmIGJsb2NrLnN1Y2Nlc3NvcnMubGVuZ3RoICE9IDEpIHsKICAgICAgbWFya0ludmFsaWQoIkdvdG8gbm9kZSB3aXRoIG5vdCBleGFjdGx5IG9uZSBzdWNjZXNzb3IiKTsKICAgIH0KICAgIGlmIChibG9jay5sYXN0IGlzIEhKdW1wICYmIGJsb2NrLnN1Y2Nlc3NvcnMubGVuZ3RoICE9IDEpIHsKICAgICAgbWFya0ludmFsaWQoIkJyZWFrIG9yIGNvbnRpbnVlIG5vZGUgd2l0aG91dCBvbmUgc3VjY2Vzc29yIik7CiAgICB9CiAgICBpZiAoKGJsb2NrLmxhc3QgaXMgSFJldHVybiB8fCBibG9jay5sYXN0IGlzIEhUaHJvdykgJiYKICAgICAgICAoYmxvY2suc3VjY2Vzc29ycy5sZW5ndGggIT0gMSB8fCAhYmxvY2suc3VjY2Vzc29yc1swXS5pc0V4aXRCbG9jaygpKSkgewogICAgICBtYXJrSW52YWxpZCgiUmV0dXJuIG9yIHRocm93IG5vZGUgd2l0aCA+IDEgc3VjY2Vzc29yICIKICAgICAgICAgICJvciBub3QgZ29pbmcgdG8gZXhpdC1ibG9jayIpOwogICAgfQogICAgaWYgKGJsb2NrLmxhc3QgaXMgSEV4aXQgJiYgIWJsb2NrLnN1Y2Nlc3NvcnMuaXNFbXB0eSkgewogICAgICBtYXJrSW52YWxpZCgiRXhpdCBibG9jayB3aXRoIHN1Y2Nlc3NvciIpOwogICAgfQoKICAgIGlmIChibG9jay5zdWNjZXNzb3JzLmlzRW1wdHkgJiYgIWJsb2NrLmlzRXhpdEJsb2NrKCkpIHsKICAgICAgbWFya0ludmFsaWQoIk5vbi1leGl0IGJsb2NrIHdpdGhvdXQgc3VjY2Vzc29yIik7CiAgICB9CgogICAgLy8gQ2hlY2sgdGhhdCBzdWNjZXNzb3JzIGlkcyBhcmUgYWx3YXlzIGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50IG9uZS4KICAgIC8vIFRPRE8oZmxvaXRzY2gpOiB0aGlzIGlzLCBvZiBjb3Vyc2UsIG5vdCB0cnVlIGZvciBiYWNrLWJyYW5jaGVzLgogICAgaWYgKGJsb2NrLmlkID09IG51bGwpIG1hcmtJbnZhbGlkKCJibG9jayB3aXRob3V0IGlkIik7CiAgICBmb3IgKEhCYXNpY0Jsb2NrIHN1Y2Nlc3NvciBpbiBibG9jay5zdWNjZXNzb3JzKSB7CiAgICAgIGlmICghaXNWYWxpZCkgYnJlYWs7CiAgICAgIGlmIChzdWNjZXNzb3IuaWQgPT0gbnVsbCkgbWFya0ludmFsaWQoInN1Y2Nlc3NvciB3aXRob3V0IGlkIik7CiAgICAgIGlmIChzdWNjZXNzb3IuaWQgPD0gYmxvY2suaWQgJiYgIXN1Y2Nlc3Nvci5pc0xvb3BIZWFkZXIoKSkgewogICAgICAgIG1hcmtJbnZhbGlkKCJzdWNjZXNzb3Igd2l0aCBsb3dlciBpZCwgYnV0IG5vdCBhIGxvb3AtaGVhZGVyIik7CiAgICAgIH0KICAgIH0KICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGEgY3JpdGljYWwgZWRnZS4KICAgIGlmIChpc1ZhbGlkICYmCiAgICAgICAgYmxvY2suc3VjY2Vzc29ycy5sZW5ndGggPiAxICYmCiAgICAgICAgYmxvY2subGFzdCBpcyEgSFRyeSAmJgogICAgICAgIGJsb2NrLmxhc3QgaXMhIEhFeGl0VHJ5ICYmCiAgICAgICAgYmxvY2subGFzdCBpcyEgSFN3aXRjaCkgewogICAgICBmb3IgKEhCYXNpY0Jsb2NrIHN1Y2Nlc3NvciBpbiBibG9jay5zdWNjZXNzb3JzKSB7CiAgICAgICAgaWYgKCFpc1ZhbGlkKSBicmVhazsKICAgICAgICBpZiAoc3VjY2Vzc29yLnByZWRlY2Vzc29ycy5sZW5ndGggPj0gMikgewogICAgICAgICAgbWFya0ludmFsaWQoIlNTQSBncmFwaCBjb250YWlucyBjcml0aWNhbCBlZGdlLiIpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIENoZWNrIHRoYXQgdGhlIGVudHJpZXMgaW4gdGhlIGRvbWluYXRlZC1saXN0IGFyZSBzb3J0ZWQuCiAgICBpbnQgbGFzdElkID0gMDsKICAgIGZvciAoSEJhc2ljQmxvY2sgZG9taW5hdGVkIGluIGJsb2NrLmRvbWluYXRlZEJsb2NrcykgewogICAgICBpZiAoIWlzVmFsaWQpIGJyZWFrOwogICAgICBpZiAoIWlkZW50aWNhbChkb21pbmF0ZWQuZG9taW5hdG9yLCBibG9jaykpIHsKICAgICAgICBtYXJrSW52YWxpZCgiZG9taW5hdGVkIGJsb2NrIG5vdCBwb2ludGluZyBiYWNrIik7CiAgICAgIH0KICAgICAgaWYgKGRvbWluYXRlZC5pZCA9PSBudWxsIHx8IGRvbWluYXRlZC5pZCA8PSBsYXN0SWQpIHsKICAgICAgICBtYXJrSW52YWxpZCgiZG9taW5hdGVkLmlkID09IG51bGwgb3IgZG9taW5hdGVkIGhhcyA8PSBpZCIpOwogICAgICB9CiAgICAgIGxhc3RJZCA9IGRvbWluYXRlZC5pZDsKICAgIH0KCiAgICBpZiAoIWlzVmFsaWQpIHJldHVybjsKICAgIGJsb2NrLmZvckVhY2hQaGkodmlzaXRJbnN0cnVjdGlvbik7CgogICAgLy8gQ2hlY2sgdGhhdCB0aGUgYmxvY2tzIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIGEgcGhpIGFyZSBkb21pbmF0aW5nIHRoZQogICAgLy8gY29ycmVzcG9uZGluZyBwcmVkZWNlc3NvciBibG9jay4gTm90ZSB0aGF0IGEgYmxvY2sgZG9taW5hdGVzCiAgICAvLyBpdHNlbGYuCiAgICBibG9jay5mb3JFYWNoUGhpKChIUGhpIHBoaSkgewogICAgICBhc3NlcnQocGhpLmlucHV0cy5sZW5ndGggPD0gYmxvY2sucHJlZGVjZXNzb3JzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhpLmlucHV0cy5sZW5ndGg7IGkrKykgewogICAgICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IHBoaS5pbnB1dHNbaV07CiAgICAgICAgaWYgKCFpbnB1dC5ibG9jay5kb21pbmF0ZXMoYmxvY2sucHJlZGVjZXNzb3JzW2ldKSkgewogICAgICAgICAgbWFya0ludmFsaWQoIkRlZmluaXRpb24gZG9lcyBub3QgZG9taW5hdGUgdXNlIik7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICAvLyBDaGVjayB0aGF0IHRoZSBibG9ja3Mgb2YgdGhlIGlucHV0cyBvZiBhbiBpbnN0cnVjdGlvbiBkb21pbmF0ZSB0aGUKICAgIC8vIGluc3RydWN0aW9uJ3MgYmxvY2suCiAgICBibG9jay5mb3JFYWNoSW5zdHJ1Y3Rpb24oKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgICBmb3IgKEhJbnN0cnVjdGlvbiBpbnB1dCBpbiBpbnN0cnVjdGlvbi5pbnB1dHMpIHsKICAgICAgICBpZiAoIWlucHV0LmJsb2NrLmRvbWluYXRlcyhibG9jaykpIHsKICAgICAgICAgIG1hcmtJbnZhbGlkKCJEZWZpbml0aW9uIGRvZXMgbm90IGRvbWluYXRlIHVzZSIpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgc3VwZXIudmlzaXRCYXNpY0Jsb2NrKGJsb2NrKTsKICB9CgogIC8vLyBSZXR1cm5zIGhvdyBvZnRlbiBbaW5zdHJ1Y3Rpb25dIGlzIGNvbnRhaW5lZCBpbiBbaW5zdHJ1Y3Rpb25zXS4KICBzdGF0aWMgaW50IGNvdW50SW5zdHJ1Y3Rpb24oCiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnN0cnVjdGlvbnMsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgaW50IHJlc3VsdCA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RydWN0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaWRlbnRpY2FsKGluc3RydWN0aW9uc1tpXSwgaW5zdHJ1Y3Rpb24pKSByZXN1bHQrKzsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIGZvciBldmVyeSBpbnN0cnVjdGlvbiBpbiB0aGUKICAvLy8gbGlzdC4gVGhlIGFyZ3VtZW50IHRvIFtmXSBpcyBhbiBpbnN0cnVjdGlvbiB3aXRoIHRoZSBjb3VudCBvZiBob3cgb2Z0ZW4KICAvLy8gaXQgYXBwZWFyZWQgaW4gdGhlIGxpc3QgW2luc3RydWN0aW9uc10uCiAgc3RhdGljIGJvb2wgZXZlcnlJbnN0cnVjdGlvbihMaXN0PEhJbnN0cnVjdGlvbj4gaW5zdHJ1Y3Rpb25zLCBGdW5jdGlvbiBmKSB7CiAgICB2YXIgY29weSA9IG5ldyBMaXN0PEhJbnN0cnVjdGlvbj4uZnJvbShpbnN0cnVjdGlvbnMpOwogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkgdG8gc29ydCBISW5zdHJ1Y3Rpb25zIGJlZm9yZQogICAgLy8gd2UgaGF2ZSBhc3NpZ25lZCBhbiBJRC4gVGhlIGxvb3AgaXMgdGhlcmVmb3JlIE8obl4yKSBmb3Igbm93LgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3B5Lmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjdXJyZW50ID0gY29weVtpXTsKICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgY29udGludWU7CiAgICAgIGludCBjb3VudCA9IDE7CiAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGNvcHkubGVuZ3RoOyBqKyspIHsKICAgICAgICBpZiAoaWRlbnRpY2FsKGNvcHlbal0sIGN1cnJlbnQpKSB7CiAgICAgICAgICBjb3B5W2pdID0gbnVsbDsKICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghZihjdXJyZW50LCBjb3VudCkpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEluc3RydWN0aW9uKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgLy8gVmVyaWZpZXMgdGhhdCB3ZSBhcmUgaW4gdGhlIHVzZSBsaXN0IG9mIG91ciBpbnB1dHMuCiAgICBib29sIGhhc0NvcnJlY3RJbnB1dHMoKSB7CiAgICAgIGJvb2wgaW5CYXNpY0Jsb2NrID0gaW5zdHJ1Y3Rpb24uaXNJbkJhc2ljQmxvY2soKTsKICAgICAgcmV0dXJuIGV2ZXJ5SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24uaW5wdXRzLCAoaW5wdXQsIGNvdW50KSB7CiAgICAgICAgaWYgKGluQmFzaWNCbG9jaykgewogICAgICAgICAgcmV0dXJuIGlucHV0LmlzSW5CYXNpY0Jsb2NrKCkgJiYKICAgICAgICAgICAgICBjb3VudEluc3RydWN0aW9uKGlucHV0LnVzZWRCeSwgaW5zdHJ1Y3Rpb24pID09IGNvdW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gY291bnRJbnN0cnVjdGlvbihpbnB1dC51c2VkQnksIGluc3RydWN0aW9uKSA9PSAwOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgLy8gVmVyaWZpZXMgdGhhdCBhbGwgb3VyIHVzZXMgaGF2ZSB1cyBpbiB0aGVpciBpbnB1dHMuCiAgICBib29sIGhhc0NvcnJlY3RVc2VzKCkgewogICAgICBpZiAoIWluc3RydWN0aW9uLmlzSW5CYXNpY0Jsb2NrKCkpIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZXZlcnlJbnN0cnVjdGlvbihpbnN0cnVjdGlvbi51c2VkQnksICh1c2UsIGNvdW50KSB7CiAgICAgICAgcmV0dXJuIHVzZS5pc0luQmFzaWNCbG9jaygpICYmCiAgICAgICAgICAgIGNvdW50SW5zdHJ1Y3Rpb24odXNlLmlucHV0cywgaW5zdHJ1Y3Rpb24pID09IGNvdW50OwogICAgICB9KTsKICAgIH0KCiAgICBpZiAoIWlkZW50aWNhbChpbnN0cnVjdGlvbi5ibG9jaywgY3VycmVudEJsb2NrKSkgewogICAgICBtYXJrSW52YWxpZCgiSW5zdHJ1Y3Rpb24gaW4gd3JvbmcgYmxvY2siKTsKICAgIH0KICAgIGlmICghaGFzQ29ycmVjdElucHV0cygpKSB7CiAgICAgIG1hcmtJbnZhbGlkKCJJbmNvcnJlY3QgaW5wdXRzIik7CiAgICB9CiAgICBpZiAoIWhhc0NvcnJlY3RVc2VzKCkpIHsKICAgICAgbWFya0ludmFsaWQoIkluY29ycmVjdCB1c2VzIik7CiAgICB9CiAgfQp9CoDMAE5OPAEVAS8XEAEkFSEEASQTFQQBSSMMLBpPAU4vNSIGJzUGPTUGTD4GJU1IMEI0QggGPz8GP0MGO1A9KQY8MAYBPDcGAUlHOzYbRUNHCAYwEycfIyI4HTI8CggGAUAUOxs0Ogg8RAgdBgEaKAFLRA8iPjQsPTsKCAgBShw6Ny07CggIASIEAUYfQxQ0PQYTBAFOTi5OOk5FLB0lFTIrGhMKCCwGEQQBDDQ7HjhDHCtEEUMKCgYBOxw2QSdACgYBNzEGHycGHSUGBAIBJnBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS92YWxpZGF0ZS5kYXJ0OHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2VsZW1lbnRzL2VudGl0eV91dGlscy5kYXJ0lAYvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBlbnRpdHlfdXRpbHM7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JwogICAgc2hvdyBpc1VzZXJEZWZpbmFibGVPcGVyYXRvciwgaXNNaW51c09wZXJhdG9yOwoKaW1wb3J0ICdlbnRpdGllcy5kYXJ0JzsKCi8vIFNvbWV3aGF0IHN0YWJsZSBvcmRlcmluZyBmb3IgbGlicmFyaWVzIHVzaW5nIFtVcmldcwppbnQgY29tcGFyZUxpYnJhcmllc1VyaXMoVXJpIGEsIFVyaSBiKSB7CiAgaWYgKGEgPT0gYikgcmV0dXJuIDA7CgogIGludCBieUNhbm9uaWNhbFVyaVBhdGgoKSB7CiAgICByZXR1cm4gYS5wYXRoLmNvbXBhcmVUbyhiLnBhdGgpOwogIH0KCiAgLy8gT3JkZXI6IHBsYXRmb3JtIDwgcGFja2FnZSA8IG90aGVyLgogIGlmIChhLnNjaGVtZSA9PSAnZGFydCcpIHsKICAgIGlmIChiLnNjaGVtZSA9PSAnZGFydCcpIHJldHVybiBieUNhbm9uaWNhbFVyaVBhdGgoKTsKICAgIHJldHVybiAtMTsKICB9CiAgaWYgKGIuc2NoZW1lID09ICdkYXJ0JykgcmV0dXJuIDE7CgogIGlmIChhLnNjaGVtZSA9PSAncGFja2FnZScpIHsKICAgIGlmIChiLnNjaGVtZSA9PSAncGFja2FnZScpIHJldHVybiBieUNhbm9uaWNhbFVyaVBhdGgoKTsKICAgIHJldHVybiAtMTsKICB9CiAgaWYgKGIuc2NoZW1lID09ICdwYWNrYWdlJykgcmV0dXJuIDE7CgogIHJldHVybiBfY29tcGFyZUNhbm9uaWNhbFVyaShhLCBiKTsKfQoKaW50IF9jb21wYXJlQ2Fub25pY2FsVXJpKFVyaSBhLCBVcmkgYikgewogIGludCByID0gYS5zY2hlbWUuY29tcGFyZVRvKGIuc2NoZW1lKTsKICBpZiAociAhPSAwKSByZXR1cm4gcjsKCiAgLy8gV2Ugd291bGQgbGlrZSB0aGUgb3JkZXIgb2YgJ2ZpbGU6JyBVcmlzIHRvIGJlIHN0YWJsZSBhY3Jvc3MgZGlmZmVyZW50CiAgLy8gdXNlcnMgb3IgZGlmZmVyZW50IGJ1aWxkcyBmcm9tIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4gIFdlIHNvcnQgYnkKICAvLyBwYXRoU2VnbWVudHMgZWxlbWVudHMgZnJvbSB0aGUgbGFzdCB0byB0aGUgZmlyc3Qgc2luY2UgdGhhdCB0ZW5kcyB0byBmaW5kCiAgLy8gYSBzdGFibGUgZGlzdGluY3Rpb24gcmVnYXJkbGVzcyBvZiBkaXJlY3Rvcnkgcm9vdC4KICBMaXN0PFN0cmluZz4gYVNlZ21lbnRzID0gYS5wYXRoU2VnbWVudHM7CiAgTGlzdDxTdHJpbmc+IGJTZWdtZW50cyA9IGIucGF0aFNlZ21lbnRzOwogIGludCBhSSA9IGFTZWdtZW50cy5sZW5ndGg7CiAgaW50IGJJID0gYlNlZ21lbnRzLmxlbmd0aDsKICB3aGlsZSAoYUkgPiAwICYmIGJJID4gMCkgewogICAgU3RyaW5nIGFTZWdtZW50ID0gYVNlZ21lbnRzWy0tYUldOwogICAgU3RyaW5nIGJTZWdtZW50ID0gYlNlZ21lbnRzWy0tYkldOwogICAgciA9IGFTZWdtZW50LmNvbXBhcmVUbyhiU2VnbWVudCk7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICB9CiAgcmV0dXJuIGFJLmNvbXBhcmVUbyhiSSk7IC8vIFNob3J0ZXN0IGZpcnN0Lgp9CgovLy8gQ29tcGFyZSBVUklzIG9mIGNvbXBpbGF0aW9uIHVuaXRzLgppbnQgY29tcGFyZVNvdXJjZVVyaXMoVXJpIHVyaTEsIFVyaSB1cmkyKSB7CiAgaWYgKHVyaTEgPT0gdXJpMikgcmV0dXJuIDA7CiAgLy8gQ29tcGlsYXRpb24gdW5pdHMgYXJlIGNvbXBhcmVkIG9ubHkgd2l0aGluIHRoZSBzYW1lIGxpYnJhcnkgc28gd2UgZXhwZWN0CiAgLy8gdGhlIFVyaXMgdG8gdXN1YWxseSBiZSBjbHVzdGVyZWQgdG9nZXRoZXIgd2l0aCBhIGNvbW1vbiBzY2hlbWUgYW5kIHBhdGgKICAvLyBwcmVmaXguCiAgcmV0dXJuICcke3VyaTF9Jy5jb21wYXJlVG8oJyR7dXJpMn0nKTsKfQoKLy8vIENvbXBhcmUgZW50aXRpZXMgd2l0aGluIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQuCmludCBjb21wYXJlRW50aXRpZXMoRW50aXR5IGVsZW1lbnQxLCBpbnQgbGluZTEsIGludCBjb2x1bW4xLCBFbnRpdHkgZWxlbWVudDIsCiAgICBpbnQgbGluZTIsIGludCBjb2x1bW4yKSB7CiAgbGluZTEgPz89IC0xOwogIGxpbmUyID8/PSAtMTsKICBpbnQgciA9IGxpbmUxLmNvbXBhcmVUbyhsaW5lMik7CiAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CgogIGNvbHVtbjEgPz89IC0xOwogIGNvbHVtbjIgPz89IC0xOwogIHIgPSBjb2x1bW4xLmNvbXBhcmVUbyhjb2x1bW4yKTsKICBpZiAociAhPSAwKSByZXR1cm4gcjsKCiAgciA9IGVsZW1lbnQxLm5hbWUuY29tcGFyZVRvKGVsZW1lbnQyLm5hbWUpOwogIGlmIChyICE9IDApIHJldHVybiByOwoKICAvLyBTYW1lIGZpbGUsIHBvc2l0aW9uIGFuZCBuYW1lLiAgSWYgdGhpcyBoYXBwZW5zLCB3ZSBzaG91bGQgZmluZCBvdXQgd2h5CiAgLy8gYW5kIG1ha2UgdGhlIG9yZGVyIHRvdGFsIGFuZCBpbmRlcGVuZGVudCBvZiBoYXNoQ29kZS4KICByZXR1cm4gZWxlbWVudDEuaGFzaENvZGUuY29tcGFyZVRvKGVsZW1lbnQyLmhhc2hDb2RlKTsKfQoKU3RyaW5nIHJlY29uc3RydWN0Q29uc3RydWN0b3JOYW1lKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpIHsKICBTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5lbmNsb3NpbmdDbGFzcy5uYW1lOwogIGlmIChlbGVtZW50Lm5hbWUgPT0gJycpIHsKICAgIHJldHVybiBjbGFzc05hbWU7CiAgfSBlbHNlIHsKICAgIHJldHVybiAnJGNsYXNzTmFtZVwkJHtlbGVtZW50Lm5hbWV9JzsKICB9Cn0KClN0cmluZyByZWNvbnN0cnVjdENvbnN0cnVjdG9yTmFtZVNvdXJjZVN0cmluZyhGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgaWYgKGVsZW1lbnQubmFtZSA9PSAnJykgewogICAgcmV0dXJuIGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MubmFtZTsKICB9IGVsc2UgewogICAgcmV0dXJuIHJlY29uc3RydWN0Q29uc3RydWN0b3JOYW1lKGVsZW1lbnQpOwogIH0KfQoKLy8vIE1hcCBhbiBvcGVyYXRvci1uYW1lIHRvIGEgdmFsaWQgSmF2YVNjcmlwdCBpZGVudGlmaWVyLgovLy8KLy8vIEZvciBub24tb3BlcmF0b3IgbmFtZXMsIHRoaXMgbWV0aG9kIGp1c3QgcmV0dXJucyBpdHMgaW5wdXQuCi8vLwovLy8gVGhlIHJlc3VsdHMgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCBhcmUgZ3VhcmFudGVlZCB0byBiZSB2YWxpZAovLy8gSmF2YVNjcmlwdCBpZGVudGlmaWVycywgZXhjZXB0IGl0IG1heSBpbmNsdWRlIHJlc2VydmVkIHdvcmRzIGZvcgovLy8gbm9uLW9wZXJhdG9yIG5hbWVzLgpTdHJpbmcgb3BlcmF0b3JOYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgcmV0dXJuIG5hbWU7CiAgfSBlbHNlIGlmIChuYW1lID09ICc9PScpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJGVxJzsKICB9IGVsc2UgaWYgKG5hbWUgPT0gJ34nKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciRub3QnOwogIH0gZWxzZSBpZiAobmFtZSA9PSAnW10nKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciRpbmRleCc7CiAgfSBlbHNlIGlmIChuYW1lID09ICdbXT0nKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciRpbmRleFNldCc7CiAgfSBlbHNlIGlmIChuYW1lID09ICcqJykgewogICAgcmV0dXJuIHInb3BlcmF0b3IkbXVsJzsKICB9IGVsc2UgaWYgKG5hbWUgPT0gJy8nKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciRkaXYnOwogIH0gZWxzZSBpZiAobmFtZSA9PSAnJScpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJG1vZCc7CiAgfSBlbHNlIGlmIChuYW1lID09ICd+LycpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJHRkaXYnOwogIH0gZWxzZSBpZiAobmFtZSA9PSAnKycpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJGFkZCc7CiAgfSBlbHNlIGlmIChuYW1lID09ICc8PCcpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJHNobCc7CiAgfSBlbHNlIGlmIChuYW1lID09ICc+PicpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJHNocic7CiAgfSBlbHNlIGlmIChuYW1lID09ICc+Pj4nKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciRzaHJ1JzsKICB9IGVsc2UgaWYgKG5hbWUgPT0gJz49JykgewogICAgcmV0dXJuIHInb3BlcmF0b3IkZ2UnOwogIH0gZWxzZSBpZiAobmFtZSA9PSAnPicpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJGd0JzsKICB9IGVsc2UgaWYgKG5hbWUgPT0gJzw9JykgewogICAgcmV0dXJuIHInb3BlcmF0b3IkbGUnOwogIH0gZWxzZSBpZiAobmFtZSA9PSAnPCcpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJGx0JzsKICB9IGVsc2UgaWYgKG5hbWUgPT0gJyYnKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciRhbmQnOwogIH0gZWxzZSBpZiAobmFtZSA9PSAnXicpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJHhvcic7CiAgfSBlbHNlIGlmIChuYW1lID09ICd8JykgewogICAgcmV0dXJuIHInb3BlcmF0b3Ikb3InOwogIH0gZWxzZSBpZiAobmFtZSA9PSAnLScpIHsKICAgIHJldHVybiByJ29wZXJhdG9yJHN1Yic7CiAgfSBlbHNlIGlmIChuYW1lID09ICd1bmFyeS0nKSB7CiAgICByZXR1cm4gcidvcGVyYXRvciRuZWdhdGUnOwogIH0gZWxzZSB7CiAgICByZXR1cm4gbmFtZTsKICB9Cn0KClN0cmluZyBjb25zdHJ1Y3RPcGVyYXRvck5hbWVPck51bGwoU3RyaW5nIG9wLCBib29sIGlzVW5hcnkpIHsKICBpZiAoaXNNaW51c09wZXJhdG9yKG9wKSkgewogICAgcmV0dXJuIGlzVW5hcnkgPyAndW5hcnktJyA6IG9wOwogIH0gZWxzZSBpZiAoaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3Iob3ApIHx8IG9wID09ICc/PycpIHsKICAgIHJldHVybiBvcDsKICB9IGVsc2UgewogICAgcmV0dXJuIG51bGw7CiAgfQp9CgpTdHJpbmcgY29uc3RydWN0T3BlcmF0b3JOYW1lKFN0cmluZyBvcCwgYm9vbCBpc1VuYXJ5KSB7CiAgU3RyaW5nIG9wZXJhdG9yTmFtZSA9IGNvbnN0cnVjdE9wZXJhdG9yTmFtZU9yTnVsbChvcCwgaXNVbmFyeSk7CiAgaWYgKG9wZXJhdG9yTmFtZSA9PSBudWxsKQogICAgdGhyb3cgJ1VuaGFuZGxlZCBvcGVyYXRvcjogJG9wJzsKICBlbHNlCiAgICByZXR1cm4gb3BlcmF0b3JOYW1lOwp9CoCzAE5OPAEWATkzARgBNykYAR0lBAEoHDkPBCQBHzwPBCcBJQIBKSgYAUtHTzgrKx0dHScnJhoELgIBJyweTk0NKQIBN04eEBAiGAESEiIYAS4YAUw7OQIBPDIcFgsqBAIBSBwoCzAEAgE7BEAERUUYLxYRHRscHB0eHiEcHBwcHBwdHRwcHRwdHB4dHRscGx0bHBscHBwcHBscHCEfCxEEAgE+HSQ6DwsRBAIBOEIcJQcZAgEvcGFja2FnZTpjb21waWxlci9zcmMvZWxlbWVudHMvZW50aXR5X3V0aWxzLmRhcnQ1c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvZWxlbWVudHMvb3BlcmF0b3JzLmRhcnShXy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMub3BlcmF0b3JzOwoKaW1wb3J0ICduYW1lcy5kYXJ0JyBzaG93IFB1YmxpY05hbWU7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCcgc2hvdyBDYWxsU3RydWN0dXJlOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3IsIFNlbGVjdG9yS2luZDsKCmVudW0gVW5hcnlPcGVyYXRvcktpbmQgewogIE5PVCwKICBORUdBVEUsCiAgQ09NUExFTUVOVCwKfQoKY2xhc3MgVW5hcnlPcGVyYXRvciB7CiAgZmluYWwgVW5hcnlPcGVyYXRvcktpbmQga2luZDsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBTdHJpbmcgc2VsZWN0b3JOYW1lOwoKICBjb25zdCBVbmFyeU9wZXJhdG9yKHRoaXMua2luZCwgdGhpcy5uYW1lLCB0aGlzLnNlbGVjdG9yTmFtZSk7CgogIGJvb2wgZ2V0IGlzVXNlckRlZmluYWJsZSA9PiBzZWxlY3Rvck5hbWUgIT0gbnVsbDsKCiAgU2VsZWN0b3IgZ2V0IHNlbGVjdG9yID0+IG5ldyBTZWxlY3RvcihTZWxlY3RvcktpbmQuT1BFUkFUT1IsCiAgICAgIG5ldyBQdWJsaWNOYW1lKHNlbGVjdG9yTmFtZSksIENhbGxTdHJ1Y3R1cmUuTk9fQVJHUyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7CgogIC8vLyBUaGUgdW5hcnkgISBvcGVyYXRvci4KICBzdGF0aWMgY29uc3QgVW5hcnlPcGVyYXRvciBOT1QgPQogICAgICBjb25zdCBVbmFyeU9wZXJhdG9yKFVuYXJ5T3BlcmF0b3JLaW5kLk5PVCwgJyEnLCBudWxsKTsKCiAgLy8vIFRoZSB1bmFyeSAtIG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBVbmFyeU9wZXJhdG9yIE5FR0FURSA9CiAgICAgIGNvbnN0IFVuYXJ5T3BlcmF0b3IoVW5hcnlPcGVyYXRvcktpbmQuTkVHQVRFLCAnLScsICd1bmFyeS0nKTsKCiAgLy8vIFRoZSB1bmFyeSB+IG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBVbmFyeU9wZXJhdG9yIENPTVBMRU1FTlQgPQogICAgICBjb25zdCBVbmFyeU9wZXJhdG9yKFVuYXJ5T3BlcmF0b3JLaW5kLkNPTVBMRU1FTlQsICd+JywgJ34nKTsKCiAgc3RhdGljIFVuYXJ5T3BlcmF0b3IgcGFyc2UoU3RyaW5nIHZhbHVlKSB7CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICAgIGNhc2UgJyEnOgogICAgICAgIHJldHVybiBOT1Q7CiAgICAgIGNhc2UgJy0nOgogICAgICAgIHJldHVybiBORUdBVEU7CiAgICAgIGNhc2UgJ34nOgogICAgICAgIHJldHVybiBDT01QTEVNRU5UOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgLy8gaWdub3JlOiBNSVNTSU5HX1JFVFVSTgogIHN0YXRpYyBVbmFyeU9wZXJhdG9yIGZyb21LaW5kKFVuYXJ5T3BlcmF0b3JLaW5kIGtpbmQpIHsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIFVuYXJ5T3BlcmF0b3JLaW5kLk5PVDoKICAgICAgICByZXR1cm4gTk9UOwogICAgICBjYXNlIFVuYXJ5T3BlcmF0b3JLaW5kLk5FR0FURToKICAgICAgICByZXR1cm4gTkVHQVRFOwogICAgICBjYXNlIFVuYXJ5T3BlcmF0b3JLaW5kLkNPTVBMRU1FTlQ6CiAgICAgICAgcmV0dXJuIENPTVBMRU1FTlQ7CiAgICB9CiAgfQp9CgplbnVtIEJpbmFyeU9wZXJhdG9yS2luZCB7CiAgRVEsCiAgTk9UX0VRLAogIElOREVYLAogIEFERCwKICBTVUIsCiAgTVVMLAogIERJViwKICBJRElWLAogIE1PRCwKICBTSEwsCiAgU0hSLAogIFNIUlUsCiAgR1RFUSwKICBHVCwKICBMVEVRLAogIExULAogIEFORCwKICBPUiwKICBYT1IsCiAgTE9HSUNBTF9BTkQsCiAgTE9HSUNBTF9PUiwKICBJRl9OVUxMLAp9CgpjbGFzcyBCaW5hcnlPcGVyYXRvciB7CiAgZmluYWwgQmluYXJ5T3BlcmF0b3JLaW5kIGtpbmQ7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8odGhpcy5raW5kLCB0aGlzLm5hbWUpOwoKICAvLy8gYHRydWVgIGlmIHRoaXMgb3BlcmF0b3IgY2FuIGJlIGltcGxlbWVudGVkIHRocm91Z2ggYW4gYG9wZXJhdG9yIFtuYW1lXWAKICAvLy8gbWV0aG9kLgogIGJvb2wgZ2V0IGlzVXNlckRlZmluYWJsZSA9PiB0cnVlOwoKICBTdHJpbmcgZ2V0IHNlbGVjdG9yTmFtZSA9PiBuYW1lOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBuYW1lOwoKICAvLy8gVGhlID09IG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBFUSA9CiAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8oQmluYXJ5T3BlcmF0b3JLaW5kLkVRLCAnPT0nKTsKCiAgLy8vIFRoZSAhPSBvcGVyYXRvci4KICBzdGF0aWMgY29uc3QgQmluYXJ5T3BlcmF0b3IgTk9UX0VRID0gY29uc3QgX05vdEVxdWFsc09wZXJhdG9yKCk7CgogIC8vLyBUaGUgW10gb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIElOREVYID0KICAgICAgY29uc3QgQmluYXJ5T3BlcmF0b3IuXyhCaW5hcnlPcGVyYXRvcktpbmQuSU5ERVgsICdbXScpOwoKICAvLy8gVGhlIGJpbmFyeSArIG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBBREQgPQogICAgICBjb25zdCBCaW5hcnlPcGVyYXRvci5fKEJpbmFyeU9wZXJhdG9yS2luZC5BREQsICcrJyk7CgogIC8vLyBUaGUgYmluYXJ5IC0gb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIFNVQiA9CiAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8oQmluYXJ5T3BlcmF0b3JLaW5kLlNVQiwgJy0nKTsKCiAgLy8vIFRoZSBiaW5hcnkgKiBvcGVyYXRvci4KICBzdGF0aWMgY29uc3QgQmluYXJ5T3BlcmF0b3IgTVVMID0KICAgICAgY29uc3QgQmluYXJ5T3BlcmF0b3IuXyhCaW5hcnlPcGVyYXRvcktpbmQuTVVMLCAnKicpOwoKICAvLy8gVGhlIGJpbmFyeSAvIG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBESVYgPQogICAgICBjb25zdCBCaW5hcnlPcGVyYXRvci5fKEJpbmFyeU9wZXJhdG9yS2luZC5ESVYsICcvJyk7CgogIC8vLyBUaGUgYmluYXJ5IH4vIG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBJRElWID0KICAgICAgY29uc3QgQmluYXJ5T3BlcmF0b3IuXyhCaW5hcnlPcGVyYXRvcktpbmQuSURJViwgJ34vJyk7CgogIC8vLyBUaGUgYmluYXJ5ICUgb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIE1PRCA9CiAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8oQmluYXJ5T3BlcmF0b3JLaW5kLk1PRCwgJyUnKTsKCiAgLy8vIFRoZSBiaW5hcnkgPDwgb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIFNITCA9CiAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8oQmluYXJ5T3BlcmF0b3JLaW5kLlNITCwgJzw8Jyk7CgogIC8vLyBUaGUgYmluYXJ5ID4+IG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBTSFIgPQogICAgICBjb25zdCBCaW5hcnlPcGVyYXRvci5fKEJpbmFyeU9wZXJhdG9yS2luZC5TSFIsICc+PicpOwoKICAvLy8gVGhlIGJpbmFyeSA+Pj4gb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIFNIUlUgPQogICAgICBjb25zdCBCaW5hcnlPcGVyYXRvci5fKEJpbmFyeU9wZXJhdG9yS2luZC5TSFJVLCAnPj4nKTsKCiAgLy8vIFRoZSBiaW5hcnkgPj0gb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIEdURVEgPQogICAgICBjb25zdCBCaW5hcnlPcGVyYXRvci5fKEJpbmFyeU9wZXJhdG9yS2luZC5HVEVRLCAnPj0nKTsKCiAgLy8vIFRoZSBiaW5hcnkgPiBvcGVyYXRvci4KICBzdGF0aWMgY29uc3QgQmluYXJ5T3BlcmF0b3IgR1QgPQogICAgICBjb25zdCBCaW5hcnlPcGVyYXRvci5fKEJpbmFyeU9wZXJhdG9yS2luZC5HVCwgJz4nKTsKCiAgLy8vIFRoZSBiaW5hcnkgPD0gb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIExURVEgPQogICAgICBjb25zdCBCaW5hcnlPcGVyYXRvci5fKEJpbmFyeU9wZXJhdG9yS2luZC5MVEVRLCAnPD0nKTsKCiAgLy8vIFRoZSBiaW5hcnkgPCBvcGVyYXRvci4KICBzdGF0aWMgY29uc3QgQmluYXJ5T3BlcmF0b3IgTFQgPQogICAgICBjb25zdCBCaW5hcnlPcGVyYXRvci5fKEJpbmFyeU9wZXJhdG9yS2luZC5MVCwgJzwnKTsKCiAgLy8vIFRoZSBiaW5hcnkgJiBvcGVyYXRvci4KICBzdGF0aWMgY29uc3QgQmluYXJ5T3BlcmF0b3IgQU5EID0KICAgICAgY29uc3QgQmluYXJ5T3BlcmF0b3IuXyhCaW5hcnlPcGVyYXRvcktpbmQuQU5ELCAnJicpOwoKICAvLy8gVGhlIGJpbmFyeSB8IG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBPUiA9CiAgICAgIGNvbnN0IEJpbmFyeU9wZXJhdG9yLl8oQmluYXJ5T3BlcmF0b3JLaW5kLk9SLCAnfCcpOwoKICAvLy8gVGhlIGJpbmFyeSBeIG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBYT1IgPQogICAgICBjb25zdCBCaW5hcnlPcGVyYXRvci5fKEJpbmFyeU9wZXJhdG9yS2luZC5YT1IsICdeJyk7CgogIC8vLyBUaGUgbG9naWNhbCAmJiBvcGVyYXRvci4KICBzdGF0aWMgY29uc3QgQmluYXJ5T3BlcmF0b3IgTE9HSUNBTF9BTkQgPQogICAgICBjb25zdCBfTG9naWNhbE9wZXJhdG9yKEJpbmFyeU9wZXJhdG9yS2luZC5MT0dJQ0FMX0FORCwgJyYmJyk7CgogIC8vLyBUaGUgYmluYXJ5IHwgb3BlcmF0b3IuCiAgc3RhdGljIGNvbnN0IEJpbmFyeU9wZXJhdG9yIExPR0lDQUxfT1IgPQogICAgICBjb25zdCBfTG9naWNhbE9wZXJhdG9yKEJpbmFyeU9wZXJhdG9yS2luZC5MT0dJQ0FMX09SLCAnfHwnKTsKCiAgLy8vIFRoZSBpZi1udWxsID8/IG9wZXJhdG9yLgogIHN0YXRpYyBjb25zdCBCaW5hcnlPcGVyYXRvciBJRl9OVUxMID0KICAgICAgY29uc3QgX0lmTnVsbE9wZXJhdG9yKEJpbmFyeU9wZXJhdG9yS2luZC5JRl9OVUxMLCAnPz8nKTsKCiAgc3RhdGljIEJpbmFyeU9wZXJhdG9yIHBhcnNlKFN0cmluZyB2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgICBjYXNlICcmJic6CiAgICAgICAgcmV0dXJuIExPR0lDQUxfQU5EOwogICAgICBjYXNlICd8fCc6CiAgICAgICAgcmV0dXJuIExPR0lDQUxfT1I7CiAgICAgIGNhc2UgJz8/JzoKICAgICAgICByZXR1cm4gSUZfTlVMTDsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gcGFyc2VVc2VyRGVmaW5hYmxlKHZhbHVlKTsKICAgIH0KICB9CgogIHN0YXRpYyBCaW5hcnlPcGVyYXRvciBwYXJzZVVzZXJEZWZpbmFibGUoU3RyaW5nIHZhbHVlKSB7CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICAgIGNhc2UgJz09JzoKICAgICAgICByZXR1cm4gRVE7CiAgICAgIGNhc2UgJyE9JzoKICAgICAgICByZXR1cm4gTk9UX0VROwogICAgICBjYXNlICdbXSc6CiAgICAgICAgcmV0dXJuIElOREVYOwogICAgICBjYXNlICcqJzoKICAgICAgICByZXR1cm4gTVVMOwogICAgICBjYXNlICcvJzoKICAgICAgICByZXR1cm4gRElWOwogICAgICBjYXNlICclJzoKICAgICAgICByZXR1cm4gTU9EOwogICAgICBjYXNlICd+Lyc6CiAgICAgICAgcmV0dXJuIElESVY7CiAgICAgIGNhc2UgJysnOgogICAgICAgIHJldHVybiBBREQ7CiAgICAgIGNhc2UgJy0nOgogICAgICAgIHJldHVybiBTVUI7CiAgICAgIGNhc2UgJzw8JzoKICAgICAgICByZXR1cm4gU0hMOwogICAgICBjYXNlICc+Pic6CiAgICAgICAgcmV0dXJuIFNIUjsKICAgICAgY2FzZSAnPj4+JzoKICAgICAgICByZXR1cm4gU0hSVTsKICAgICAgY2FzZSAnPj0nOgogICAgICAgIHJldHVybiBHVEVROwogICAgICBjYXNlICc+JzoKICAgICAgICByZXR1cm4gR1Q7CiAgICAgIGNhc2UgJzw9JzoKICAgICAgICByZXR1cm4gTFRFUTsKICAgICAgY2FzZSAnPCc6CiAgICAgICAgcmV0dXJuIExUOwogICAgICBjYXNlICcmJzoKICAgICAgICByZXR1cm4gQU5EOwogICAgICBjYXNlICdeJzoKICAgICAgICByZXR1cm4gWE9SOwogICAgICBjYXNlICd8JzoKICAgICAgICByZXR1cm4gT1I7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICAvLyBpZ25vcmU6IE1JU1NJTkdfUkVUVVJOCiAgc3RhdGljIEJpbmFyeU9wZXJhdG9yIGZyb21LaW5kKEJpbmFyeU9wZXJhdG9yS2luZCBraW5kKSB7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuRVE6CiAgICAgICAgcmV0dXJuIEVROwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5OT1RfRVE6CiAgICAgICAgcmV0dXJuIE5PVF9FUTsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuSU5ERVg6CiAgICAgICAgcmV0dXJuIElOREVYOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5NVUw6CiAgICAgICAgcmV0dXJuIE1VTDsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuRElWOgogICAgICAgIHJldHVybiBESVY7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLk1PRDoKICAgICAgICByZXR1cm4gTU9EOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5JRElWOgogICAgICAgIHJldHVybiBJRElWOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5BREQ6CiAgICAgICAgcmV0dXJuIEFERDsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuU1VCOgogICAgICAgIHJldHVybiBTVUI7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLlNITDoKICAgICAgICByZXR1cm4gU0hMOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5TSFI6CiAgICAgICAgcmV0dXJuIFNIUjsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuU0hSVToKICAgICAgICByZXR1cm4gU0hSVTsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuR1RFUToKICAgICAgICByZXR1cm4gR1RFUTsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuR1Q6CiAgICAgICAgcmV0dXJuIEdUOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5MVEVROgogICAgICAgIHJldHVybiBMVEVROwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5MVDoKICAgICAgICByZXR1cm4gTFQ7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkFORDoKICAgICAgICByZXR1cm4gQU5EOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5YT1I6CiAgICAgICAgcmV0dXJuIFhPUjsKICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvcktpbmQuT1I6CiAgICAgICAgcmV0dXJuIE9SOwogICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yS2luZC5MT0dJQ0FMX0FORDoKICAgICAgICByZXR1cm4gTE9HSUNBTF9BTkQ7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLkxPR0lDQUxfT1I6CiAgICAgICAgcmV0dXJuIExPR0lDQUxfT1I7CiAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3JLaW5kLklGX05VTEw6CiAgICAgICAgcmV0dXJuIElGX05VTEw7CiAgICB9CiAgfQp9CgovLy8gVGhlIG9wZXJhdG9yICE9LCB3aGljaCBpcyBub3QgdXNlciBkZWZpbmFibGUgb3BlcmF0b3IgYnV0IGluc3RlYWQgaXMgYQovLy8gbmVnYXRpb24gb2YgYSBjYWxsIHRvIHVzZXIgZGVmaW5hYmxlIG9wZXJhdG9yLCBuYW1lbHkgPT0uCmNsYXNzIF9Ob3RFcXVhbHNPcGVyYXRvciBleHRlbmRzIEJpbmFyeU9wZXJhdG9yIHsKICBjb25zdCBfTm90RXF1YWxzT3BlcmF0b3IoKSA6IHN1cGVyLl8oQmluYXJ5T3BlcmF0b3JLaW5kLk5PVF9FUSwgJyE9Jyk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVXNlckRlZmluYWJsZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBzZWxlY3Rvck5hbWUgPT4gJz09JzsKfQoKLy8vIFRoZSBvcGVyYXRvcnMgJiYgYW5kIHx8IHdoaWNoIGFyZSBub3QgdXNlciBkZWZpbmFibGUgb3BlcmF0b3JzIGJ1dCBjb250cm9sCi8vLyBzdHJ1Y3R1cmVzLgpjbGFzcyBfTG9naWNhbE9wZXJhdG9yIGV4dGVuZHMgQmluYXJ5T3BlcmF0b3IgewogIGNvbnN0IF9Mb2dpY2FsT3BlcmF0b3IoQmluYXJ5T3BlcmF0b3JLaW5kIGtpbmQsIFN0cmluZyBuYW1lKQogICAgICA6IHN1cGVyLl8oa2luZCwgbmFtZSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVXNlckRlZmluYWJsZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBzZWxlY3Rvck5hbWUgPT4gbnVsbDsKfQoKLy8vIFRoZSBvcGVyYXRvcnMgPz8gaXMgbm90IHVzZXIgZGVmaW5hYmxlLgpjbGFzcyBfSWZOdWxsT3BlcmF0b3IgZXh0ZW5kcyBCaW5hcnlPcGVyYXRvciB7CiAgY29uc3QgX0lmTnVsbE9wZXJhdG9yKEJpbmFyeU9wZXJhdG9yS2luZCBraW5kLCBTdHJpbmcgbmFtZSkKICAgICAgOiBzdXBlci5fKGtpbmQsIG5hbWUpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1VzZXJEZWZpbmFibGUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgc2VsZWN0b3JOYW1lID0+ICc/Pyc7Cn0KgVcATk48ARsBJT1AARkHCg4CARYgFR0BQAE0AT88AQwdARwjPQEcJkQBHCpDAS0VEBQQFxAbDxUGBAEcOhQiFCUXKRsGBAIBGgYKCQcHBwcIBwcHCAgGCAYHBgcPDgsCARchFQEwAU4OJAEjAQwdARcjOwEXQwEXJj4BHSQ7AR0kOwEdJDsBHSQ7AR4lPQEdJDsBHiQ8AR4kPAEfJT0BHiU9AR0jOgEeJT0BHSM6AR0kOwEdIzoBHSQ7AR8sRAEdK0MBHyg/AS4VERwRGxEYDyoGBAE7FRETERcRFhAUEBQQFBEVEBQQFBEUERQSFREVEBMRFRATEBQQFBATDxUGBAEcPBQiEyYXJRYjFCMUIxQkFSMUIxQjFCMUJBUkFSITJBUiEyMUIxQiEyscKhsnGAYEAgFLPjJJAQwlAQwjAgFPEDA/HQEMJQEMIwIBLC8+HQEMJQEMIwIBLHBhY2thZ2U6Y29tcGlsZXIvc3JjL2VsZW1lbnRzL29wZXJhdG9ycy5kYXJ0RXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2tlcm5lbC9pbnZvY2F0aW9uX21pcnJvcl9jb25zdGFudHMuZGFydIFXLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmNvbnN0IGludCBpbnZvY2F0aW9uTWlycm9yTWV0aG9kS2luZCA9IDA7CmNvbnN0IGludCBpbnZvY2F0aW9uTWlycm9yR2V0dGVyS2luZCA9IDE7CmNvbnN0IGludCBpbnZvY2F0aW9uTWlycm9yU2V0dGVyS2luZCA9IDI7CgkATk48ASoqKgE8cGFja2FnZTpjb21waWxlci9zcmMva2VybmVsL2ludm9jYXRpb25fbWlycm9yX2NvbnN0YW50cy5kYXJ0NnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2tlcm5lbC9rZXJuZWxfd29ybGQuZGFydJlLLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCcgc2hvdyBLRmllbGRBbmFseXNpczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2JhY2tlbmRfdXNhZ2UuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ub19zdWNoX21ldGhvZF9yZWdpc3RyeS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXNfcmVzb2x1dGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9tZW1iZXJfdXNhZ2UuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCc7CgppbXBvcnQgJ2VsZW1lbnRfbWFwX2ltcGwuZGFydCc7CgpjbGFzcyBLQ2xvc2VkV29ybGRJbXBsIGltcGxlbWVudHMgS0Nsb3NlZFdvcmxkIHsKICBmaW5hbCBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXA7CgogIEBvdmVycmlkZQogIGZpbmFsIEtFbGVtZW50RW52aXJvbm1lbnQgZWxlbWVudEVudmlyb25tZW50OwoKICBAb3ZlcnJpZGUKICBmaW5hbCBEYXJ0VHlwZXMgZGFydFR5cGVzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBLQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHM7CgogIEBvdmVycmlkZQogIGZpbmFsIE5hdGl2ZURhdGEgbmF0aXZlRGF0YTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgSW50ZXJjZXB0b3JEYXRhIGludGVyY2VwdG9yRGF0YTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgQmFja2VuZFVzYWdlIGJhY2tlbmRVc2FnZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTm9TdWNoTWV0aG9kRGF0YSBub1N1Y2hNZXRob2REYXRhOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBNYXA8Q2xhc3NFbnRpdHksIFNldDxDbGFzc0VudGl0eT4+IG1peGluVXNlczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBTZXQ8Q2xhc3NFbnRpdHk+PiB0eXBlc0ltcGxlbWVudGVkQnlTdWJjbGFzc2VzOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDYW4gdGhpcyBiZSBkZXJpdmVkIGZyb20gW0NsYXNzU2V0XXM/CiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBfaW1wbGVtZW50ZWRDbGFzc2VzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGxpdmVJbnN0YW5jZU1lbWJlcnM7CgogIEBvdmVycmlkZQogIGZpbmFsIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gYXNzaWduZWRJbnN0YW5jZU1lbWJlcnM7CiAgQG92ZXJyaWRlCiAgZmluYWwgS0ZpZWxkQW5hbHlzaXMgZmllbGRBbmFseXNpczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGxpdmVOYXRpdmVDbGFzc2VzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBNYXA8TWVtYmVyRW50aXR5LCBNZW1iZXJVc2FnZT4gbGl2ZU1lbWJlclVzYWdlOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBDbGFzc0hpZXJhcmNoeSBjbGFzc0hpZXJhcmNoeTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgQW5ub3RhdGlvbnNEYXRhIGFubm90YXRpb25zRGF0YTsKCiAgUnVudGltZVR5cGVzTmVlZCBfcnRpTmVlZDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU2V0PERhcnRUeXBlPiBpc0NoZWNrczsKCiAgZmluYWwgTWFwPEVudGl0eSwgU2V0PERhcnRUeXBlPj4gc3RhdGljVHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzOwoKICBmaW5hbCBNYXA8U2VsZWN0b3IsIFNldDxEYXJ0VHlwZT4+IGR5bmFtaWNUeXBlQXJndW1lbnREZXBlbmRlbmNpZXM7CgogIEBvdmVycmlkZQogIGZpbmFsIFNldDxUeXBlVmFyaWFibGVUeXBlPiB0eXBlVmFyaWFibGVUeXBlTGl0ZXJhbHM7CgogIEBvdmVycmlkZQogIGZpbmFsIFNldDxMb2NhbD4gZ2VuZXJpY0xvY2FsRnVuY3Rpb25zOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTZXQ8RnVuY3Rpb25FbnRpdHk+IGNsb3N1cml6ZWRNZW1iZXJzV2l0aEZyZWVUeXBlVmFyaWFibGVzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBJdGVyYWJsZTxMb2NhbD4gbG9jYWxGdW5jdGlvbnM7CgogIEBvdmVycmlkZQogIGZpbmFsIEl0ZXJhYmxlPEludGVyZmFjZVR5cGU+IGluc3RhbnRpYXRlZFR5cGVzOwoKICBAb3ZlcnJpZGUKICBSdW50aW1lVHlwZXNOZWVkIGdldCBydGlOZWVkID0+IF9ydGlOZWVkOwoKICBLQ2xvc2VkV29ybGRJbXBsKHRoaXMuZWxlbWVudE1hcCwKICAgICAge0NvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICB0aGlzLmVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgdGhpcy5kYXJ0VHlwZXMsCiAgICAgIHRoaXMuY29tbW9uRWxlbWVudHMsCiAgICAgIHRoaXMubmF0aXZlRGF0YSwKICAgICAgdGhpcy5pbnRlcmNlcHRvckRhdGEsCiAgICAgIHRoaXMuYmFja2VuZFVzYWdlLAogICAgICB0aGlzLm5vU3VjaE1ldGhvZERhdGEsCiAgICAgIFJ1bnRpbWVUeXBlc05lZWRCdWlsZGVyIHJ0aU5lZWRCdWlsZGVyLAogICAgICB0aGlzLmZpZWxkQW5hbHlzaXMsCiAgICAgIFNldDxDbGFzc0VudGl0eT4gaW1wbGVtZW50ZWRDbGFzc2VzLAogICAgICB0aGlzLmxpdmVOYXRpdmVDbGFzc2VzLAogICAgICB0aGlzLmxpdmVJbnN0YW5jZU1lbWJlcnMsCiAgICAgIHRoaXMuYXNzaWduZWRJbnN0YW5jZU1lbWJlcnMsCiAgICAgIHRoaXMubGl2ZU1lbWJlclVzYWdlLAogICAgICB0aGlzLm1peGluVXNlcywKICAgICAgdGhpcy50eXBlc0ltcGxlbWVudGVkQnlTdWJjbGFzc2VzLAogICAgICB0aGlzLmNsYXNzSGllcmFyY2h5LAogICAgICB0aGlzLmFubm90YXRpb25zRGF0YSwKICAgICAgdGhpcy5pc0NoZWNrcywKICAgICAgdGhpcy5zdGF0aWNUeXBlQXJndW1lbnREZXBlbmRlbmNpZXMsCiAgICAgIHRoaXMuZHluYW1pY1R5cGVBcmd1bWVudERlcGVuZGVuY2llcywKICAgICAgdGhpcy50eXBlVmFyaWFibGVUeXBlTGl0ZXJhbHMsCiAgICAgIHRoaXMuZ2VuZXJpY0xvY2FsRnVuY3Rpb25zLAogICAgICB0aGlzLmNsb3N1cml6ZWRNZW1iZXJzV2l0aEZyZWVUeXBlVmFyaWFibGVzLAogICAgICB0aGlzLmxvY2FsRnVuY3Rpb25zLAogICAgICB0aGlzLmluc3RhbnRpYXRlZFR5cGVzfSkKICAgICAgOiBfaW1wbGVtZW50ZWRDbGFzc2VzID0gaW1wbGVtZW50ZWRDbGFzc2VzIHsKICAgIF9ydGlOZWVkID0gcnRpTmVlZEJ1aWxkZXIuY29tcHV0ZVJ1bnRpbWVUeXBlc05lZWQodGhpcywgb3B0aW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW1wbGVtZW50ZWQoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gX2ltcGxlbWVudGVkQ2xhc3Nlcy5jb250YWlucyhjbHMpOwogIH0KCiAgLy8vIE5lZWRlZCBmb3IgdGVzdGluZy4KICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGdldCBwcm9jZXNzZWRNZW1iZXJzID0+IGxpdmVNZW1iZXJVc2FnZS5rZXlzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hTdGF0aWNUeXBlQXJndW1lbnQoCiAgICAgIHZvaWQgZihFbnRpdHkgZnVuY3Rpb24sIFNldDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykpIHsKICAgIHN0YXRpY1R5cGVBcmd1bWVudERlcGVuZGVuY2llcy5mb3JFYWNoKGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoRHluYW1pY1R5cGVBcmd1bWVudCgKICAgICAgdm9pZCBmKFNlbGVjdG9yIHNlbGVjdG9yLCBTZXQ8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpKSB7CiAgICBkeW5hbWljVHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzLmZvckVhY2goZik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzTWVtYmVyVXNlZChNZW1iZXJFbnRpdHkgbWVtYmVyKSA9PiBsaXZlTWVtYmVyVXNhZ2UuY29udGFpbnNLZXkobWVtYmVyKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoR2VuZXJpY01ldGhvZChGdW5jdGlvbiBmKSB7CiAgICBsaXZlTWVtYmVyVXNhZ2UuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVXNhZ2UgdXNhZ2UpIHsKICAgICAgaWYgKG1lbWJlciBpcyBGdW5jdGlvbkVudGl0eSAmJgogICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhtZW1iZXIpLmlzTm90RW1wdHkpIHsKICAgICAgICBmKG1lbWJlcik7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoR2VuZXJpY0luc3RhbmNlTWV0aG9kKEZ1bmN0aW9uIGYpIHsKICAgIGxpdmVNZW1iZXJVc2FnZS5mb3JFYWNoKChNZW1iZXJFbnRpdHkgbWVtYmVyLCBNZW1iZXJVc2FnZSB1c2FnZSkgewogICAgICBpZiAobWVtYmVyIGlzIEZ1bmN0aW9uRW50aXR5ICYmCiAgICAgICAgICBtZW1iZXIuaXNJbnN0YW5jZU1lbWJlciAmJgogICAgICAgICAgZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhtZW1iZXIpLmlzTm90RW1wdHkpIHsKICAgICAgICBmKG1lbWJlcik7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgTGlzdDxGdW5jdGlvbkVudGl0eT4gX3VzZXJOb1N1Y2hNZXRob2RzQ2FjaGU7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEZ1bmN0aW9uRW50aXR5PiBnZXQgdXNlck5vU3VjaE1ldGhvZHMgewogICAgaWYgKF91c2VyTm9TdWNoTWV0aG9kc0NhY2hlID09IG51bGwpIHsKICAgICAgX3VzZXJOb1N1Y2hNZXRob2RzQ2FjaGUgPSA8RnVuY3Rpb25FbnRpdHk+W107CgogICAgICBsaXZlTWVtYmVyVXNhZ2UuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVXNhZ2UgbWVtYmVyVXNhZ2UpIHsKICAgICAgICBpZiAobWVtYmVyIGlzIEZ1bmN0aW9uRW50aXR5ICYmIG1lbWJlclVzYWdlLmhhc1VzZSkgewogICAgICAgICAgaWYgKG1lbWJlci5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICAgICAgICAgbWVtYmVyLm5hbWUgPT0gSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXyAmJgogICAgICAgICAgICAgICFjb21tb25FbGVtZW50cy5pc0RlZmF1bHROb1N1Y2hNZXRob2RJbXBsZW1lbnRhdGlvbihtZW1iZXIpKSB7CiAgICAgICAgICAgIF91c2VyTm9TdWNoTWV0aG9kc0NhY2hlLmFkZChtZW1iZXIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgcmV0dXJuIF91c2VyTm9TdWNoTWV0aG9kc0NhY2hlOwogIH0KCiAgU2V0PEZ1bmN0aW9uRW50aXR5PiBfY2xvc3VyaXplZE1lbWJlcnNDYWNoZTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8RnVuY3Rpb25FbnRpdHk+IGdldCBjbG9zdXJpemVkTWVtYmVycyB7CiAgICBpZiAoX2Nsb3N1cml6ZWRNZW1iZXJzQ2FjaGUgPT0gbnVsbCkgewogICAgICBfY2xvc3VyaXplZE1lbWJlcnNDYWNoZSA9IHt9OwogICAgICBsaXZlTWVtYmVyVXNhZ2UuZm9yRWFjaCgoTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVXNhZ2UgdXNhZ2UpIHsKICAgICAgICBpZiAobWVtYmVyLmlzRnVuY3Rpb24gJiYgbWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIgJiYgdXNhZ2UuaGFzUmVhZCkgewogICAgICAgICAgX2Nsb3N1cml6ZWRNZW1iZXJzQ2FjaGUuYWRkKG1lbWJlcik7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBfY2xvc3VyaXplZE1lbWJlcnNDYWNoZTsKICB9CgogIFNldDxGdW5jdGlvbkVudGl0eT4gX2Nsb3N1cml6ZWRTdGF0aWNzQ2FjaGU7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPEZ1bmN0aW9uRW50aXR5PiBnZXQgY2xvc3VyaXplZFN0YXRpY3MgewogICAgaWYgKF9jbG9zdXJpemVkU3RhdGljc0NhY2hlID09IG51bGwpIHsKICAgICAgX2Nsb3N1cml6ZWRTdGF0aWNzQ2FjaGUgPSB7fTsKICAgICAgbGl2ZU1lbWJlclVzYWdlLmZvckVhY2goKE1lbWJlckVudGl0eSBtZW1iZXIsIE1lbWJlclVzYWdlIHVzYWdlKSB7CiAgICAgICAgaWYgKG1lbWJlci5pc0Z1bmN0aW9uICYmCiAgICAgICAgICAgIChtZW1iZXIuaXNTdGF0aWMgfHwgbWVtYmVyLmlzVG9wTGV2ZWwpICYmCiAgICAgICAgICAgIHVzYWdlLmhhc1JlYWQpIHsKICAgICAgICAgIF9jbG9zdXJpemVkU3RhdGljc0NhY2hlLmFkZChtZW1iZXIpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gX2Nsb3N1cml6ZWRTdGF0aWNzQ2FjaGU7CiAgfQp9CoDqAE5OPAEfIiQhKUArLik1NhorKCQYASABMSsBDDABDB0BDCgBDB8BDCkBDCMBDCsBDDYBDEkBQC4BDDQBDDgMJgEMMQEMOAEMJwEMKQEdAQwgAUMBRgEMOAEMKgEMRAEMKAEMMwEMLAEkIB8WGxccGR0uGiseICQcFikbHBUrLCUiMxsfM0YEAQwoLgQBGkcBDCI+LwQBDCNAMAQBDFEBDCpHJkwTCAgEAQwyRyYlTBMICAQBMAEMMys0AU8+KTpNMQwKCgYBJAQBLwEMMyskSU0vCgoGJAQBLwEMMyskSSE2HS8KCgYkBAIBLXBhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9rZXJuZWxfd29ybGQuZGFydDRzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19lbWl0dGVyL3NvcnRlci5kYXJ0hEsvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX2VtaXR0ZXIuc29ydGVyOwoKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKCi8vLyBTb3J0aW5nIHN0cmF0ZWd5IGZvciBsaWJyYXJpZXMsIGNsYXNzZXMgYW5kIG1lbWJlcnMuCmFic3RyYWN0IGNsYXNzIFNvcnRlciB7CiAgLy8vIFJldHVybnMgYSBzb3J0ZWQgbGlzdCBvZiBbbGlicmFyaWVzXS4KICBJdGVyYWJsZTxMaWJyYXJ5RW50aXR5PiBzb3J0TGlicmFyaWVzKEl0ZXJhYmxlPExpYnJhcnlFbnRpdHk+IGxpYnJhcmllcyk7CgogIC8vLyBSZXR1cm5zIGEgc29ydGVkIGxpc3Qgb2YgW2NsYXNzZXNdLgogIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBzb3J0Q2xhc3NlcyhJdGVyYWJsZTxDbGFzc0VudGl0eT4gY2xhc3Nlcyk7CgogIC8vLyBSZXR1cm5zIGEgc29ydGVkIGxpc3Qgb2YgW3R5cGVkZWZzXS4KICBJdGVyYWJsZTxUeXBlZGVmRW50aXR5PiBzb3J0VHlwZWRlZnMoSXRlcmFibGU8VHlwZWRlZkVudGl0eT4gdHlwZWRlZnMpOwoKICAvLy8gUmV0dXJucyBhIHNvcnRlZCBsaXN0IG9mIFttZW1iZXJzXS4KICBJdGVyYWJsZTxUPiBzb3J0TWVtYmVyczxUIGV4dGVuZHMgTWVtYmVyRW50aXR5PihJdGVyYWJsZTxUPiBtZW1iZXJzKTsKCiAgaW50IGNvbXBhcmVMaWJyYXJpZXNCeUxvY2F0aW9uKExpYnJhcnlFbnRpdHkgYSwgTGlicmFyeUVudGl0eSBiKTsKICBpbnQgY29tcGFyZUNsYXNzZXNCeUxvY2F0aW9uKENsYXNzRW50aXR5IGEsIENsYXNzRW50aXR5IGIpOwogIGludCBjb21wYXJlVHlwZWRlZnNCeUxvY2F0aW9uKFR5cGVkZWZFbnRpdHkgYSwgVHlwZWRlZkVudGl0eSBiKTsKICBpbnQgY29tcGFyZU1lbWJlcnNCeUxvY2F0aW9uKE1lbWJlckVudGl0eSBhLCBNZW1iZXJFbnRpdHkgYik7Cn0KHQBOTjwBIwEkATkYLEwBKkQBK0oBKkgBRD5DQAIBK3BhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvc29ydGVyLmRhcnQ5c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvY29uc3RhbnRzL2NvbnN0cnVjdG9ycy5kYXJ0qwMvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmNvbnN0YW50cy5jb25zdHJ1Y3RvcnM7CgppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnIHNob3cgRmllbGRFbnRpdHk7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCcgc2hvdyBDYWxsU3RydWN0dXJlOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICdldmFsdWF0aW9uLmRhcnQnOwppbXBvcnQgJ2V4cHJlc3Npb25zLmRhcnQnOwoKZW51bSBDb25zdGFudENvbnN0cnVjdG9yS2luZCB7CiAgR0VORVJBVElWRSwKICBSRURJUkVDVElOR19HRU5FUkFUSVZFLAogIFJFRElSRUNUSU5HX0ZBQ1RPUlksCiAgRVJST05FT1VTLAp9CgpjbGFzcyBJbnN0YW5jZURhdGEgewogIGZpbmFsIE1hcDxGaWVsZEVudGl0eSwgQ29uc3RhbnRFeHByZXNzaW9uPiBmaWVsZE1hcDsKICBmaW5hbCBMaXN0PEFzc2VydENvbnN0YW50RXhwcmVzc2lvbj4gYXNzZXJ0aW9uczsKCiAgSW5zdGFuY2VEYXRhKHRoaXMuZmllbGRNYXAsIHRoaXMuYXNzZXJ0aW9ucyk7Cn0KCi8vLyBEZWZpbml0aW9uIG9mIGEgY29uc3RhbnQgY29uc3RydWN0b3IuCmFic3RyYWN0IGNsYXNzIENvbnN0YW50Q29uc3RydWN0b3IgewogIENvbnN0YW50Q29uc3RydWN0b3JLaW5kIGdldCBraW5kOwoKICAvLy8gQ29tcHV0ZXMgdGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIGNyZWF0ZWQgaW4gYSBjb25zdCBjb25zdHJ1Y3RvcgogIC8vLyBpbnZvY2F0aW9uIHdpdGggdHlwZSBbbmV3VHlwZV0uCiAgSW50ZXJmYWNlVHlwZSBjb21wdXRlSW5zdGFuY2VUeXBlKAogICAgICBFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIEludGVyZmFjZVR5cGUgbmV3VHlwZSk7CgogIC8vLyBDb21wdXRlcyB0aGUgY29uc3RhbnQgZXhwcmVzc2lvbnMgb2YgdGhlIGZpZWxkcyBhbmQgaW5pdGlhbGl6ZXIgYXNzZXJ0aW9ucwogIC8vLyBvZiB0aGUgY3JlYXRlZCBpbnN0YW5jZSBpbiBhIGNvbnN0IGNvbnN0cnVjdG9yIGludm9jYXRpb24gd2l0aAogIC8vLyBbYXJndW1lbnRzXS4KICBJbnN0YW5jZURhdGEgY29tcHV0ZUluc3RhbmNlRGF0YShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCiAgICAgIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiBhcmd1bWVudHMsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSk7CgogIGFjY2VwdChDb25zdGFudENvbnN0cnVjdG9yVmlzaXRvciB2aXNpdG9yLCBhcmcpOwp9CgphYnN0cmFjdCBjbGFzcyBDb25zdGFudENvbnN0cnVjdG9yVmlzaXRvcjxSLCBBPiB7CiAgY29uc3QgQ29uc3RhbnRDb25zdHJ1Y3RvclZpc2l0b3IoKTsKCiAgUiB2aXNpdCgKICAgICAgY292YXJpYW50IENvbnN0YW50Q29uc3RydWN0b3IgY29uc3RhbnRDb25zdHJ1Y3RvciwgY292YXJpYW50IEEgY29udGV4dCkgewogICAgcmV0dXJuIGNvbnN0YW50Q29uc3RydWN0b3IuYWNjZXB0KHRoaXMsIGNvbnRleHQpOwogIH0KCiAgUiB2aXNpdEdlbmVyYXRpdmUoCiAgICAgIGNvdmFyaWFudCBHZW5lcmF0aXZlQ29uc3RhbnRDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0UmVkaXJlY3RpbmdHZW5lcmF0aXZlKAogICAgICBjb3ZhcmlhbnQgUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RhbnRDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwKICAgICAgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5KAogICAgICBjb3ZhcmlhbnQgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RhbnRDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwKICAgICAgY292YXJpYW50IEEgYXJnKTsKICBSIHZpc2l0RXJyb25lb3VzKAogICAgICBjb3ZhcmlhbnQgRXJyb25lb3VzQ29uc3RhbnRDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgY292YXJpYW50IEEgYXJnKTsKfQoKLy8vIEEgZ2VuZXJhdGl2ZSBjb25zdGFudCBjb25zdHJ1Y3Rvci4KY2xhc3MgR2VuZXJhdGl2ZUNvbnN0YW50Q29uc3RydWN0b3IgaW1wbGVtZW50cyBDb25zdGFudENvbnN0cnVjdG9yIHsKICBmaW5hbCBJbnRlcmZhY2VUeXBlIHR5cGU7CiAgZmluYWwgTWFwPGR5bmFtaWMgLyppbnR8U3RyaW5nKi8sIENvbnN0YW50RXhwcmVzc2lvbj4gZGVmYXVsdFZhbHVlczsKICBmaW5hbCBNYXA8RmllbGRFbnRpdHksIENvbnN0YW50RXhwcmVzc2lvbj4gZmllbGRNYXA7CiAgZmluYWwgTGlzdDxBc3NlcnRDb25zdGFudEV4cHJlc3Npb24+IGFzc2VydGlvbnM7CiAgZmluYWwgQ29uc3RydWN0ZWRDb25zdGFudEV4cHJlc3Npb24gc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb247CgogIEdlbmVyYXRpdmVDb25zdGFudENvbnN0cnVjdG9yKHRoaXMudHlwZSwgdGhpcy5kZWZhdWx0VmFsdWVzLCB0aGlzLmZpZWxkTWFwLAogICAgICB0aGlzLmFzc2VydGlvbnMsIHRoaXMuc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24pOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudENvbnN0cnVjdG9yS2luZCBnZXQga2luZCA9PiBDb25zdGFudENvbnN0cnVjdG9yS2luZC5HRU5FUkFUSVZFOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGNvbXB1dGVJbnN0YW5jZVR5cGUoCiAgICAgIEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgSW50ZXJmYWNlVHlwZSBuZXdUeXBlKSB7CiAgICByZXR1cm4gZW52aXJvbm1lbnQuc3Vic3RCeUNvbnRleHQodHlwZSwgbmV3VHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnN0YW5jZURhdGEgY29tcHV0ZUluc3RhbmNlRGF0YShFdmFsdWF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCiAgICAgIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiBhcmd1bWVudHMsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgewogICAgTm9ybWFsaXplZEFyZ3VtZW50cyBhcmdzID0KICAgICAgICBuZXcgTm9ybWFsaXplZEFyZ3VtZW50cyhkZWZhdWx0VmFsdWVzLCBjYWxsU3RydWN0dXJlLCBhcmd1bWVudHMpOwogICAgSW5zdGFuY2VEYXRhIGFwcGxpZWRJbnN0YW5jZURhdGEgPQogICAgICAgIGFwcGx5SW5zdGFuY2VEYXRhKGVudmlyb25tZW50LCBhcmdzLCBzdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbik7CiAgICBmaWVsZE1hcC5mb3JFYWNoKChGaWVsZEVudGl0eSBmaWVsZCwgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50KSB7CiAgICAgIGFwcGxpZWRJbnN0YW5jZURhdGEuZmllbGRNYXBbZmllbGRdID0gY29uc3RhbnQuYXBwbHkoYXJncyk7CiAgICB9KTsKICAgIGZvciAoQXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uIGFzc2VydGlvbiBpbiBhc3NlcnRpb25zKSB7CiAgICAgIGFwcGxpZWRJbnN0YW5jZURhdGEuYXNzZXJ0aW9ucy5hZGQoYXNzZXJ0aW9uLmFwcGx5KGFyZ3MpKTsKICAgIH0KICAgIHJldHVybiBhcHBsaWVkSW5zdGFuY2VEYXRhOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50Q29uc3RydWN0b3JWaXNpdG9yIHZpc2l0b3IsIGFyZykgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRHZW5lcmF0aXZlKHRoaXMsIGFyZyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIGludCBoYXNoID0gSGFzaGluZy5vYmplY3RIYXNoKHR5cGUpOwogICAgaGFzaCA9IEhhc2hpbmcubWFwSGFzaChkZWZhdWx0VmFsdWVzLCBoYXNoKTsKICAgIGhhc2ggPSBIYXNoaW5nLm1hcEhhc2goZmllbGRNYXAsIGhhc2gpOwogICAgcmV0dXJuIEhhc2hpbmcub2JqZWN0SGFzaChzdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiwgaGFzaCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIEdlbmVyYXRpdmVDb25zdGFudENvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHlwZSA9PSBvdGhlci50eXBlICYmCiAgICAgICAgc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gPT0gb3RoZXIuc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gJiYKICAgICAgICBtYXBFcXVhbHMoZGVmYXVsdFZhbHVlcywgb3RoZXIuZGVmYXVsdFZhbHVlcykgJiYKICAgICAgICBtYXBFcXVhbHMoZmllbGRNYXAsIG90aGVyLmZpZWxkTWFwKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCJ7J3R5cGUnOiAkdHlwZSIpOwogICAgZGVmYXVsdFZhbHVlcy5mb3JFYWNoKChrZXksIENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICAgIHNiLndyaXRlKCIsXG4gJ2RlZmF1bHQ6JHtrZXl9JzogJHtleHByZXNzaW9uLnRvRGFydFRleHQoKX0iKTsKICAgIH0pOwogICAgZmllbGRNYXAuZm9yRWFjaCgoRmllbGRFbnRpdHkgZmllbGQsIENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICAgIHNiLndyaXRlKCIsXG4gJ2ZpZWxkOiR7ZmllbGR9JzogJHtleHByZXNzaW9uLnRvRGFydFRleHQoKX0iKTsKICAgIH0pOwogICAgaWYgKHN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoIixcbiAnY29uc3RydWN0b3I6ICR7c3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24udG9EYXJ0VGV4dCgpfSIpOwogICAgfQogICAgc2Iud3JpdGUoIn0iKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgc3RhdGljIGJvb2wgbWFwRXF1YWxzKE1hcCBtYXAxLCBNYXAgbWFwMikgewogICAgaWYgKG1hcDEubGVuZ3RoICE9IG1hcDEubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKHZhciBrZXkgaW4gbWFwMS5rZXlzKSB7CiAgICAgIGlmIChtYXAxW2tleV0gIT0gbWFwMltrZXldKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBDcmVhdGVzIHRoZSBmaWVsZC10by1jb25zdGFudCBtYXAgZnJvbSBhcHBseWluZyBbYXJnc10gdG8KICAvLy8gW2NvbnN0cnVjdG9ySW52b2NhdGlvbl0uIElmIFtjb25zdHJ1Y3Rvckludm9jYXRpb25dIGlzIGBudWxsYCwgYW4gZW1wdHkKICAvLy8gbWFwIGlzIGNyZWF0ZWQuIFJldHVybnMgYG51bGxgIGlmIGFuIGVycm9uZW91cyBjb25zdGFudCBjb25zdHJ1Y3RvciB3YXMKICAvLy8gZW5jb3VudGVyZWQgaW4gdGhlIHN1cGVyLWNoYWluLgogIHN0YXRpYyBJbnN0YW5jZURhdGEgYXBwbHlJbnN0YW5jZURhdGEoCiAgICAgIEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKICAgICAgTm9ybWFsaXplZEFyZ3VtZW50cyBhcmdzLAogICAgICBDb25zdHJ1Y3RlZENvbnN0YW50RXhwcmVzc2lvbiBjb25zdHJ1Y3Rvckludm9jYXRpb24pIHsKICAgIE1hcDxGaWVsZEVudGl0eSwgQ29uc3RhbnRFeHByZXNzaW9uPiBhcHBsaWVkRmllbGRNYXAgPQogICAgICAgIDxGaWVsZEVudGl0eSwgQ29uc3RhbnRFeHByZXNzaW9uPnt9OwogICAgTGlzdDxBc3NlcnRDb25zdGFudEV4cHJlc3Npb24+IGFwcGxpZWRBc3NlcnRpb25zID0KICAgICAgICA8QXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uPltdOwogICAgaWYgKGNvbnN0cnVjdG9ySW52b2NhdGlvbiAhPSBudWxsKSB7CiAgICAgIEluc3RhbmNlRGF0YSBpbnN0YW5jZURhdGEgPQogICAgICAgICAgY29uc3RydWN0b3JJbnZvY2F0aW9uLmNvbXB1dGVJbnN0YW5jZURhdGEoZW52aXJvbm1lbnQpOwogICAgICBpZiAoaW5zdGFuY2VEYXRhID09IG51bGwpIHsKICAgICAgICAvLyBBbiBlcnJvbmVvdXMgY29uc3RhbnQgY29uc3RydWN0b3Igd2FzIGVuY291bnRlcmVkIGluIHRoZSBzdXBlci1jaGFpbi4KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpbnN0YW5jZURhdGEuZmllbGRNYXAKICAgICAgICAgIC5mb3JFYWNoKChGaWVsZEVudGl0eSBmaWVsZCwgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50KSB7CiAgICAgICAgYXBwbGllZEZpZWxkTWFwW2ZpZWxkXSA9IGNvbnN0YW50LmFwcGx5KGFyZ3MpOwogICAgICB9KTsKICAgICAgZm9yIChBc3NlcnRDb25zdGFudEV4cHJlc3Npb24gYXNzZXJ0aW9uIGluIGluc3RhbmNlRGF0YS5hc3NlcnRpb25zKSB7CiAgICAgICAgYXBwbGllZEFzc2VydGlvbnMuYWRkKGFzc2VydGlvbi5hcHBseShhcmdzKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgSW5zdGFuY2VEYXRhKGFwcGxpZWRGaWVsZE1hcCwgYXBwbGllZEFzc2VydGlvbnMpOwogIH0KfQoKLy8vIEEgcmVkaXJlY3RpbmcgZ2VuZXJhdGl2ZSBjb25zdGFudCBjb25zdHJ1Y3Rvci4KY2xhc3MgUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RhbnRDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIENvbnN0YW50Q29uc3RydWN0b3IgewogIGZpbmFsIE1hcDxkeW5hbWljIC8qaW50fFN0cmluZyovLCBDb25zdGFudEV4cHJlc3Npb24+IGRlZmF1bHRWYWx1ZXM7CiAgZmluYWwgQ29uc3RydWN0ZWRDb25zdGFudEV4cHJlc3Npb24gdGhpc0NvbnN0cnVjdG9ySW52b2NhdGlvbjsKCiAgUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RhbnRDb25zdHJ1Y3RvcigKICAgICAgdGhpcy5kZWZhdWx0VmFsdWVzLCB0aGlzLnRoaXNDb25zdHJ1Y3Rvckludm9jYXRpb24pOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudENvbnN0cnVjdG9yS2luZCBnZXQga2luZCB7CiAgICByZXR1cm4gQ29uc3RhbnRDb25zdHJ1Y3RvcktpbmQuUkVESVJFQ1RJTkdfR0VORVJBVElWRTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgY29tcHV0ZUluc3RhbmNlVHlwZSgKICAgICAgRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50LCBJbnRlcmZhY2VUeXBlIG5ld1R5cGUpIHsKICAgIHJldHVybiBlbnZpcm9ubWVudC5zdWJzdEJ5Q29udGV4dCgKICAgICAgICB0aGlzQ29uc3RydWN0b3JJbnZvY2F0aW9uLmNvbXB1dGVJbnN0YW5jZVR5cGUoZW52aXJvbm1lbnQpLCBuZXdUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIEluc3RhbmNlRGF0YSBjb21wdXRlSW5zdGFuY2VEYXRhKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKICAgICAgTGlzdDxDb25zdGFudEV4cHJlc3Npb24+IGFyZ3VtZW50cywgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICBOb3JtYWxpemVkQXJndW1lbnRzIGFyZ3MgPQogICAgICAgIG5ldyBOb3JtYWxpemVkQXJndW1lbnRzKGRlZmF1bHRWYWx1ZXMsIGNhbGxTdHJ1Y3R1cmUsIGFyZ3VtZW50cyk7CiAgICBJbnN0YW5jZURhdGEgYXBwbGllZEluc3RhbmNlRGF0YSA9CiAgICAgICAgR2VuZXJhdGl2ZUNvbnN0YW50Q29uc3RydWN0b3IuYXBwbHlJbnN0YW5jZURhdGEoCiAgICAgICAgICAgIGVudmlyb25tZW50LCBhcmdzLCB0aGlzQ29uc3RydWN0b3JJbnZvY2F0aW9uKTsKICAgIHJldHVybiBhcHBsaWVkSW5zdGFuY2VEYXRhOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50Q29uc3RydWN0b3JWaXNpdG9yIHZpc2l0b3IsIGFyZykgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRSZWRpcmVjdGluZ0dlbmVyYXRpdmUodGhpcywgYXJnKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgaW50IGhhc2ggPSBIYXNoaW5nLm9iamVjdEhhc2godGhpc0NvbnN0cnVjdG9ySW52b2NhdGlvbik7CiAgICByZXR1cm4gSGFzaGluZy5tYXBIYXNoKGRlZmF1bHRWYWx1ZXMsIGhhc2gpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBSZWRpcmVjdGluZ0dlbmVyYXRpdmVDb25zdGFudENvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdGhpc0NvbnN0cnVjdG9ySW52b2NhdGlvbiA9PSBvdGhlci50aGlzQ29uc3RydWN0b3JJbnZvY2F0aW9uICYmCiAgICAgICAgR2VuZXJhdGl2ZUNvbnN0YW50Q29uc3RydWN0b3IubWFwRXF1YWxzKAogICAgICAgICAgICBkZWZhdWx0VmFsdWVzLCBvdGhlci5kZWZhdWx0VmFsdWVzKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCJ7J3R5cGUnOiAke3RoaXNDb25zdHJ1Y3Rvckludm9jYXRpb24udHlwZX0iKTsKICAgIGRlZmF1bHRWYWx1ZXMuZm9yRWFjaCgoa2V5LCBDb25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgICBzYi53cml0ZSgiLFxuICdkZWZhdWx0OiR7a2V5fSc6ICR7ZXhwcmVzc2lvbi50b0RhcnRUZXh0KCl9Iik7CiAgICB9KTsKICAgIHNiLndyaXRlKCIsXG4gJ2NvbnN0cnVjdG9yJzogJHt0aGlzQ29uc3RydWN0b3JJbnZvY2F0aW9uLnRvRGFydFRleHQoKX0iKTsKICAgIHNiLndyaXRlKCJ9Iik7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBBIHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RhbnQgY29uc3RydWN0b3IuCmNsYXNzIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0YW50Q29uc3RydWN0b3IgaW1wbGVtZW50cyBDb25zdGFudENvbnN0cnVjdG9yIHsKICBmaW5hbCBDb25zdHJ1Y3RlZENvbnN0YW50RXhwcmVzc2lvbiB0YXJnZXRDb25zdHJ1Y3Rvckludm9jYXRpb247CgogIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0YW50Q29uc3RydWN0b3IodGhpcy50YXJnZXRDb25zdHJ1Y3Rvckludm9jYXRpb24pOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudENvbnN0cnVjdG9yS2luZCBnZXQga2luZCB7CiAgICByZXR1cm4gQ29uc3RhbnRDb25zdHJ1Y3RvcktpbmQuUkVESVJFQ1RJTkdfRkFDVE9SWTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgY29tcHV0ZUluc3RhbmNlVHlwZSgKICAgICAgRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50LCBJbnRlcmZhY2VUeXBlIG5ld1R5cGUpIHsKICAgIHJldHVybiBlbnZpcm9ubWVudC5zdWJzdEJ5Q29udGV4dCgKICAgICAgICB0YXJnZXRDb25zdHJ1Y3Rvckludm9jYXRpb24uY29tcHV0ZUluc3RhbmNlVHlwZShlbnZpcm9ubWVudCksIG5ld1R5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5zdGFuY2VEYXRhIGNvbXB1dGVJbnN0YW5jZURhdGEoRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50LAogICAgICBMaXN0PENvbnN0YW50RXhwcmVzc2lvbj4gYXJndW1lbnRzLCBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUpIHsKICAgIENvbnN0YW50Q29uc3RydWN0b3IgY29uc3RhbnRDb25zdHJ1Y3RvciA9CiAgICAgICAgZW52aXJvbm1lbnQuZ2V0Q29uc3RydWN0b3JDb25zdGFudCh0YXJnZXRDb25zdHJ1Y3Rvckludm9jYXRpb24udGFyZ2V0KTsKICAgIHJldHVybiBjb25zdGFudENvbnN0cnVjdG9yLmNvbXB1dGVJbnN0YW5jZURhdGEoCiAgICAgICAgZW52aXJvbm1lbnQsIGFyZ3VtZW50cywgY2FsbFN0cnVjdHVyZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBhY2NlcHQoQ29uc3RhbnRDb25zdHJ1Y3RvclZpc2l0b3IgdmlzaXRvciwgYXJnKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFJlZGlyZWN0aW5nRmFjdG9yeSh0aGlzLCBhcmcpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gSGFzaGluZy5vYmplY3RIYXNoKHRhcmdldENvbnN0cnVjdG9ySW52b2NhdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0YW50Q29uc3RydWN0b3IpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0YXJnZXRDb25zdHJ1Y3Rvckludm9jYXRpb24gPT0gb3RoZXIudGFyZ2V0Q29uc3RydWN0b3JJbnZvY2F0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoInsiKTsKICAgIHNiLndyaXRlKCInY29uc3RydWN0b3InOiAke3RhcmdldENvbnN0cnVjdG9ySW52b2NhdGlvbi50b0RhcnRUZXh0KCl9Iik7CiAgICBzYi53cml0ZSgifSIpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgovLy8gQSBjb25zdGFudCBjb25zdHJ1Y3RvciB3aXRoIGVycm9ycy4KY2xhc3MgRXJyb25lb3VzQ29uc3RhbnRDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIENvbnN0YW50Q29uc3RydWN0b3IgewogIEBvdmVycmlkZQogIENvbnN0YW50Q29uc3RydWN0b3JLaW5kIGdldCBraW5kID0+IENvbnN0YW50Q29uc3RydWN0b3JLaW5kLkVSUk9ORU9VUzsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KENvbnN0YW50Q29uc3RydWN0b3JWaXNpdG9yIHZpc2l0b3IsIGFyZykgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFcnJvbmVvdXModGhpcywgYXJnKTsKICB9CgogIEBvdmVycmlkZQogIEluc3RhbmNlRGF0YSBjb21wdXRlSW5zdGFuY2VEYXRhKEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKICAgICAgTGlzdDxDb25zdGFudEV4cHJlc3Npb24+IGFyZ3VtZW50cywgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgY29tcHV0ZUluc3RhbmNlVHlwZSgKICAgICAgRXZhbHVhdGlvbkVudmlyb25tZW50IGVudmlyb25tZW50LCBJbnRlcmZhY2VUeXBlIG5ld1R5cGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICdFcnJvbmVvdXNDb25zdGFudENvbnN0cnVjdG9yLmNvbXB1dGVJbnN0YW5jZVR5cGUnKTsKICB9Cn0KgUUATk48ASgBNSE9HBobAR8OGhcNAgEVNzMBMAIBKiUkAUcmJUEBUUUTRkgBMwIBMiYBC1A2BAEVTSBGGB1DGBRMAgEnRRxHNzNCAU45AQxKAQwlQjYEAQxGSR9KJ0pIQgg9QQYgBAEMNC8EAQwVKTEsQQQBDBwtPyFKOS0EAQwWKiBBRAhKRAguUAYTGgQBLjIhJBYIBhEEAUBOTiYpKSA9Oy03JikiQiJRFQgcRjcKTDYIBkEEAgEzUEdBASw7AQwlOwQBDCVCJ04EAQxGSR9KJzk7IAQBDDQ6BAEMFT4xBAEMHC1KSzExBAEMFio8QUQIThMaBAIBME1DAUsBDCU4BAEMJUInUAQBDEZJLlA0MAQBDDQ3BAEMFTwEAQwcLUdNBAEMFioTTBMaBAIBKEQMSQEMNC4EAQxGSREEAQwlQiA9BAIBMHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbnN0YW50cy9jb25zdHJ1Y3RvcnMuZGFydDdzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9jb25zdGFudHMvZXZhbHVhdGlvbi5kYXJ0pMUvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmNvbnN0YW50cy5ldmFsdWF0aW9uOwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgc2hvdyBMaW5rOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCcgc2hvdyBDYWxsU3RydWN0dXJlOwppbXBvcnQgJ2NvbnN0cnVjdG9ycy5kYXJ0JzsKaW1wb3J0ICdleHByZXNzaW9ucy5kYXJ0JzsKaW1wb3J0ICd2YWx1ZXMuZGFydCc7CgovLy8gRW52aXJvbm1lbnQgdXNlZCBmb3IgZXZhbHVhdGluZyBjb25zdGFudCBleHByZXNzaW9ucy4KYWJzdHJhY3QgY2xhc3MgRXZhbHVhdGlvbkVudmlyb25tZW50IHsKICBDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHM7CgogIERhcnRUeXBlcyBnZXQgdHlwZXM7CgogIC8vLyBUeXBlIGluIHRoZSBlbmNsb3NpbmcgY29uc3RydWN0ZWQKICBJbnRlcmZhY2VUeXBlIGdldCBlbmNsb3NpbmdDb25zdHJ1Y3RlZFR5cGU7CgogIC8vLyBSZWFkIGVudmlyb25tZW50cyBzdHJpbmcgcGFzc2VkIGluIHVzaW5nIHRoZSAnLURuYW1lPXZhbHVlJyBvcHRpb24uCiAgU3RyaW5nIHJlYWRGcm9tRW52aXJvbm1lbnQoU3RyaW5nIG5hbWUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NvbnN0YW50RXhwcmVzc2lvbl0gZm9yIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgW2xvY2FsXS4KICBDb25zdGFudEV4cHJlc3Npb24gZ2V0TG9jYWxDb25zdGFudChjb3ZhcmlhbnQgTG9jYWwgbG9jYWwpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NvbnN0YW50RXhwcmVzc2lvbl0gZm9yIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgW2ZpZWxkXS4KICBDb25zdGFudEV4cHJlc3Npb24gZ2V0RmllbGRDb25zdGFudChjb3ZhcmlhbnQgRmllbGRFbnRpdHkgZmllbGQpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NvbnN0YW50Q29uc3RydWN0b3JdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnN0YW50CiAgLy8vIFtjb25zdHJ1Y3Rvcl0uCiAgQ29uc3RhbnRDb25zdHJ1Y3RvciBnZXRDb25zdHJ1Y3RvckNvbnN0YW50KAogICAgICBjb3ZhcmlhbnQgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpOwoKICAvLy8gUGVyZm9ybXMgdGhlIHN1YnN0aXR1dGlvbiBvZiB0aGUgdHlwZSBhcmd1bWVudHMgb2YgW3RhcmdldF0gZm9yIHRoZWlyCiAgLy8vIGNvcnJlc3BvbmRpbmcgdHlwZSB2YXJpYWJsZXMgaW4gW3R5cGVdLgogIERhcnRUeXBlIHN1YnN0QnlDb250ZXh0KAogICAgICBjb3ZhcmlhbnQgRGFydFR5cGUgYmFzZSwgY292YXJpYW50IEludGVyZmFjZVR5cGUgdGFyZ2V0KTsKCiAgLy8vIFJldHVybnMgW3R5cGVdIGluIHRoZSBjb250ZXh0IG9mIHRoZSBbZW5jbG9zaW5nQ29uc3RydWN0ZWRUeXBlXS4KICBEYXJ0VHlwZSBnZXRUeXBlSW5Db250ZXh0KERhcnRUeXBlIHR5cGUpOwoKICB2b2lkIHJlcG9ydFdhcm5pbmcoCiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uLCBNZXNzYWdlS2luZCBraW5kLCBNYXAgYXJndW1lbnRzKTsKCiAgdm9pZCByZXBvcnRFcnJvcigKICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb24sIE1lc3NhZ2VLaW5kIGtpbmQsIE1hcCBhcmd1bWVudHMpOwoKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlQ29uc3RydWN0b3IoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IsCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZSgpKTsKCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZU1hcEJvZHkoQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZSgpKTsKCiAgQ29uc3RhbnRWYWx1ZSBldmFsdWF0ZUZpZWxkKEZpZWxkRW50aXR5IGZpZWxkLCBDb25zdGFudFZhbHVlIGV2YWx1YXRlKCkpOwoKICAvLy8gYHRydWVgIGlmIGFzc2VydGlvbnMgYXJlIGVuYWJsZWQuCiAgYm9vbCBnZXQgZW5hYmxlQXNzZXJ0aW9uczsKCiAgLy8vIElmIGB0cnVlYCwgaW1wbGljaXQgY2FzdHMgc2hvdWxkIGJlIGNoZWNrZWQuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYmV0d2VlbiBqcy1pbnRlcm9wIGNsYXNzZXMKICAvLy8gYW5kIHRoZWlyIG1ldGFkYXRhLiBGb3Igbm9uLW1ldGFkYXRhIGNvbnN0YW50cyB3ZSBhbHdheXMgY2hlY2sgdGhlIGNhc3RzLgogIGJvb2wgZ2V0IGNoZWNrQ2FzdHM7Cn0KCmFic3RyYWN0IGNsYXNzIEV2YWx1YXRpb25FbnZpcm9ubWVudEJhc2UgaW1wbGVtZW50cyBFdmFsdWF0aW9uRW52aXJvbm1lbnQgewogIExpbms8U3Bhbm5hYmxlPiBfc3Bhbm5hYmxlU3RhY2sgPSBjb25zdCBMaW5rPFNwYW5uYWJsZT4oKTsKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGVuY2xvc2luZ0NvbnN0cnVjdGVkVHlwZTsKICBmaW5hbCBTZXQ8RmllbGRFbnRpdHk+IF9jdXJyZW50bHlFdmFsdWF0ZWRGaWVsZHMgPSBuZXcgU2V0PEZpZWxkRW50aXR5PigpOwogIGZpbmFsIGJvb2wgY29uc3RhbnRSZXF1aXJlZDsKCiAgRXZhbHVhdGlvbkVudmlyb25tZW50QmFzZShTcGFubmFibGUgc3Bhbm5hYmxlLCB7dGhpcy5jb25zdGFudFJlcXVpcmVkfSkgewogICAgX3NwYW5uYWJsZVN0YWNrID0gX3NwYW5uYWJsZVN0YWNrLnByZXBlbmQoc3Bhbm5hYmxlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGNoZWNrQ2FzdHMgPT4gdHJ1ZTsKCiAgRGlhZ25vc3RpY1JlcG9ydGVyIGdldCByZXBvcnRlcjsKCiAgLy8vIFJldHVybnMgdGhlIFtTcGFubmFibGVdIHVzZWQgZm9yIHJlcG9ydGluZyBlcnJvcnMgYW5kIHdhcm5pbmdzLgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSBzZWNvbmQtdG8tbGFzdCBpbiB0aGUgc3Bhbm5hYmxlIHN0YWNrLCBpZiBhdmFpbGFibGUsIHRvIHBvaW50CiAgLy8vIHRvIHRoZSB1c2UsIHJhdGhlciB0aGFuIHRoZSBkZWNsYXJhdGlvbiwgb2YgYSBjb25zdHJ1Y3RvciBvciBmaWVsZC4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlCiAgLy8vCiAgLy8vICAgIGNvbnN0IGZvbyA9IGNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCJmb28iLCBkZWZhdWx0OiAwKTsKICAvLy8KICAvLy8gd2lsbCBwb2ludCB0byBgZm9vYCBpbnN0ZWFkIG9mIHRoZSBkZWNsYXJhdGlvbiBvZiBgYm9vbC5mcm9tRW52aXJvbm1lbnRgLgogIFNwYW5uYWJsZSBnZXQgX3NwYW5uYWJsZSA9PiBfc3Bhbm5hYmxlU3RhY2sudGFpbC5pc0VtcHR5CiAgICAgID8gX3NwYW5uYWJsZVN0YWNrLmhlYWQKICAgICAgOiBfc3Bhbm5hYmxlU3RhY2sudGFpbC5oZWFkOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlRmllbGQoRmllbGRFbnRpdHkgZmllbGQsIENvbnN0YW50VmFsdWUgZXZhbHVhdGUoKSkgewogICAgaWYgKF9jdXJyZW50bHlFdmFsdWF0ZWRGaWVsZHMuYWRkKGZpZWxkKSkgewogICAgICBfc3Bhbm5hYmxlU3RhY2sgPSBfc3Bhbm5hYmxlU3RhY2sucHJlcGVuZChmaWVsZCk7CiAgICAgIENvbnN0YW50VmFsdWUgcmVzdWx0ID0gZXZhbHVhdGUoKTsKICAgICAgX2N1cnJlbnRseUV2YWx1YXRlZEZpZWxkcy5yZW1vdmUoZmllbGQpOwogICAgICBfc3Bhbm5hYmxlU3RhY2sgPSBfc3Bhbm5hYmxlU3RhY2sudGFpbDsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGlmIChjb25zdGFudFJlcXVpcmVkKSB7CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgIGZpZWxkLCBNZXNzYWdlS2luZC5DWUNMSUNfQ09NUElMRV9USU1FX0NPTlNUQU5UUyk7CiAgICB9CiAgICByZXR1cm4gbmV3IE5vbkNvbnN0YW50VmFsdWUoKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgZXZhbHVhdGVDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciwKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlLCBDb25zdGFudFZhbHVlIGV2YWx1YXRlKCkpIHsKICAgIF9zcGFubmFibGVTdGFjayA9IF9zcGFubmFibGVTdGFjay5wcmVwZW5kKGNvbnN0cnVjdG9yKTsKICAgIHZhciBvbGQgPSBlbmNsb3NpbmdDb25zdHJ1Y3RlZFR5cGU7CiAgICBlbmNsb3NpbmdDb25zdHJ1Y3RlZFR5cGUgPSB0eXBlOwogICAgQ29uc3RhbnRWYWx1ZSByZXN1bHQgPSBldmFsdWF0ZSgpOwogICAgLy8gQWxsIGNvbnN0IHNldCBsaXRlcmFscyBoYXZlIGFzIGFuIGltbWVkaWF0ZSBjaGlsZCBhIGNvbnN0IG1hcC4gVGhlIG1hcAogICAgLy8gZXZhbHVhdGUgbWV0aG9kIGNhbGxzIGV2YWx1YXRlTWFwQm9keSBhbmQgcmVzZXQgdGhpcyBmbGFnIGltbWVkaWF0ZWx5LgogICAgLy8gQmVjYXVzZSB0aGVyZSBhcmUgbm8gb3RoZXIgY2hpbGRyZW4sIHRoZSBmbGFnIGlzIGtlcHQgZmFsc2UuCiAgICBlbmNsb3NpbmdDb25zdHJ1Y3RlZFR5cGUgPSBvbGQ7CiAgICBfc3Bhbm5hYmxlU3RhY2sgPSBfc3Bhbm5hYmxlU3RhY2sudGFpbDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIGV2YWx1YXRlTWFwQm9keShDb25zdGFudFZhbHVlIGV2YWx1YXRlKCkpIHsKICAgIHJldHVybiBldmFsdWF0ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnRFcnJvcigKICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb24sIE1lc3NhZ2VLaW5kIGtpbmQsIE1hcCBhcmd1bWVudHMpIHsKICAgIGlmIChjb25zdGFudFJlcXVpcmVkKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNob3VsZCBbQ29uc3RhbnRFeHByZXNzaW9uXSBoYXZlIGEgbG9jYXRpb24/CiAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZShfc3Bhbm5hYmxlLCBraW5kLCBhcmd1bWVudHMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnRXYXJuaW5nKAogICAgICBDb25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgTWVzc2FnZUtpbmQga2luZCwgTWFwIGFyZ3VtZW50cykgewogICAgaWYgKGNvbnN0YW50UmVxdWlyZWQpIHsKICAgICAgcmVwb3J0ZXIucmVwb3J0V2FybmluZ01lc3NhZ2UoX3NwYW5uYWJsZSwga2luZCwgYXJndW1lbnRzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGVJbkNvbnRleHQoRGFydFR5cGUgdHlwZSkgewogICAgLy8gUnVubmluZyBleGFtcGxlIGZvciBjb21tZW50czoKICAgIC8vCiAgICAvLyAgICAgY2xhc3MgQTxUPiB7CiAgICAvLyAgICAgICBmaW5hbCBUIHQ7CiAgICAvLyAgICAgICBjb25zdCBBKGR5bmFtaWMgdCkgOiB0aGlzLnQgPSB0OyAvLyBpbXBsaWNpdGx5IGB0IGFzIEEuVGAKICAgIC8vICAgICB9CiAgICAvLyAgICAgY2xhc3MgQjxTPiBleHRlbmRzIEE8Uz4gewogICAgLy8gICAgICAgY29uc3QgQihkeW5hbWljIHMpIDogc3VwZXIocyk7CiAgICAvLyAgICAgfQogICAgLy8gICAgIG1haW4oKSA9PiBjb25zdCBCPG51bT4oMCk7CiAgICAvLwogICAgLy8gV2UgdmlzaXQgYHQgYXMgQS5UYCB3aGlsZSBldmFsdWF0aW5nIGBjb25zdCBCPG51bT4oMClgLgoKICAgIC8vIFRoZSBgYXNgIHR5cGUgaXMgYEEuVGAuCiAgICBEYXJ0VHlwZSB0eXBlSW5Db250ZXh0ID0gdHlwZTsKCiAgICAvLyBUaGUgZW5jbG9zaW5nIHR5cGUgaXMgYEI8bnVtPmAuCiAgICBEYXJ0VHlwZSBlbmNsb3NpbmdUeXBlID0gZW5jbG9zaW5nQ29uc3RydWN0ZWRUeXBlOwogICAgaWYgKGVuY2xvc2luZ1R5cGUgIT0gbnVsbCkgewogICAgICBDbGFzc0VudGl0eSBjb250ZXh0Q2xhc3M7CiAgICAgIHR5cGUuZm9yRWFjaFR5cGVWYXJpYWJsZSgoVHlwZVZhcmlhYmxlVHlwZSB0eXBlKSB7CiAgICAgICAgaWYgKHR5cGUuZWxlbWVudC50eXBlRGVjbGFyYXRpb24gaXMgQ2xhc3NFbnRpdHkpIHsKICAgICAgICAgIC8vIFdlIGZpbmQgYEFgIGZyb20gYEEuVGAuIFNpbmNlIHdlIGRvbid0IGhhdmUgbmVzdGVkIGNsYXNzZXMsIGNsYXNzCiAgICAgICAgICAvLyBiYXNlZCB0eXBlIHZhcmlhYmxlcyBjYW4gb25seSBjb21lIGZyb20gdGhlIHNhbWUgY2xhc3MuCiAgICAgICAgICBjb250ZXh0Q2xhc3MgPSB0eXBlLmVsZW1lbnQudHlwZURlY2xhcmF0aW9uOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmIChjb250ZXh0Q2xhc3MgIT0gbnVsbCkgewogICAgICAgIC8vIFRoZSBlbmNsb3NpbmcgdHlwZSBgQjxudW0+YCBhcyBhbiBpbnN0YW5jZSBvZiBgQWAgaXMgYEE8bnVtPmAuCiAgICAgICAgZW5jbG9zaW5nVHlwZSA9IHR5cGVzLmFzSW5zdGFuY2VPZihlbmNsb3NpbmdUeXBlLCBjb250ZXh0Q2xhc3MpOwogICAgICB9CiAgICAgIC8vIGBBLlRgIGluIHRoZSBjb250ZXh0IG9mIHRoZSBlbmNsb3NpbmcgdHlwZSBgQTxudW0+YCBpcyBgbnVtYC4KICAgICAgdHlwZUluQ29udGV4dCA9IGVuY2xvc2luZ1R5cGUgIT0gbnVsbAogICAgICAgICAgPyBzdWJzdEJ5Q29udGV4dCh0eXBlSW5Db250ZXh0LCBlbmNsb3NpbmdUeXBlKQogICAgICAgICAgOiB0eXBlSW5Db250ZXh0OwogICAgfQogICAgcmV0dXJuIHR5cGVJbkNvbnRleHQ7CiAgfQp9CgovLy8gVGhlIG5vcm1hbGl6ZWQgYXJndW1lbnRzIHBhc3NlZCB0byBhIGNvbnN0IGNvbnN0cnVjdG9yIGNvbXB1dGVkIGZyb20gdGhlCi8vLyBhY3R1YWwgW2FyZ3VtZW50c10gYW5kIHRoZSBbZGVmYXVsdFZhbHVlc10gb2YgdGhlIGNhbGxlZCBjb25zdHJ1cmN0b3IuCmNsYXNzIE5vcm1hbGl6ZWRBcmd1bWVudHMgewogIGZpbmFsIE1hcDxkeW5hbWljIC8qaW50fFN0cmluZyovLCBDb25zdGFudEV4cHJlc3Npb24+IGRlZmF1bHRWYWx1ZXM7CiAgZmluYWwgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlOwogIGZpbmFsIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiBhcmd1bWVudHM7CgogIE5vcm1hbGl6ZWRBcmd1bWVudHModGhpcy5kZWZhdWx0VmFsdWVzLCB0aGlzLmNhbGxTdHJ1Y3R1cmUsIHRoaXMuYXJndW1lbnRzKTsKCiAgLy8vIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgbmFtZWQgYXJndW1lbnQgW25hbWVdLgogIENvbnN0YW50RXhwcmVzc2lvbiBnZXROYW1lZEFyZ3VtZW50KFN0cmluZyBuYW1lKSB7CiAgICBpbnQgaW5kZXggPSBjYWxsU3RydWN0dXJlLm5hbWVkQXJndW1lbnRzLmluZGV4T2YobmFtZSk7CiAgICBpZiAoaW5kZXggPT0gLTEpIHsKICAgICAgLy8gVGhlIG5hbWVkIGFyZ3VtZW50IGlzIG5vdCBwcm92aWRlZC4KICAgICAgYXNzZXJ0KAogICAgICAgICAgZGVmYXVsdFZhbHVlc1tuYW1lXSAhPSBudWxsLAogICAgICAgICAgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICAgICAiTm8gZGVmYXVsdCB2YWx1ZSBmb3IgbmFtZWQgYXJndW1lbnQgJyRuYW1lJyBpbiAkdGhpcy4iKSk7CiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzW25hbWVdOwogICAgfQogICAgQ29uc3RhbnRFeHByZXNzaW9uIHZhbHVlID0KICAgICAgICBhcmd1bWVudHNbaW5kZXggKyBjYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudENvdW50XTsKICAgIGFzc2VydCgKICAgICAgICB2YWx1ZSAhPSBudWxsLAogICAgICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAgICJObyB2YWx1ZSBmb3IgbmFtZWQgYXJndW1lbnQgJyRuYW1lJyBpbiAkdGhpcy4iKSk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbm9ybWFsaXplZCBbaW5kZXhddGggcG9zaXRpb25hbCBhcmd1bWVudC4KICBDb25zdGFudEV4cHJlc3Npb24gZ2V0UG9zaXRpb25hbEFyZ3VtZW50KGludCBpbmRleCkgewogICAgaWYgKGluZGV4ID49IGNhbGxTdHJ1Y3R1cmUucG9zaXRpb25hbEFyZ3VtZW50Q291bnQpIHsKICAgICAgLy8gVGhlIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgbm90IHByb3ZpZGVkLgogICAgICBhc3NlcnQoCiAgICAgICAgICBkZWZhdWx0VmFsdWVzW2luZGV4XSAhPSBudWxsLAogICAgICAgICAgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICAgICAiTm8gZGVmYXVsdCB2YWx1ZSBmb3IgcG9zaXRpb25hbCBhcmd1bWVudCAkaW5kZXggaW4gJHRoaXMuIikpOwogICAgICByZXR1cm4gZGVmYXVsdFZhbHVlc1tpbmRleF07CiAgICB9CiAgICBDb25zdGFudEV4cHJlc3Npb24gdmFsdWUgPSBhcmd1bWVudHNbaW5kZXhdOwogICAgYXNzZXJ0KAogICAgICAgIHZhbHVlICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICAgIk5vIHZhbHVlIGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50ICRpbmRleCBpbiAkdGhpcy4iKSk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnTm9ybWFsaXplZEFyZ3VtZW50c1snKTsKICAgIHNiLndyaXRlKCdkZWZhdWx0VmFsdWVzPXsnKTsKICAgIGJvb2wgbmVlZHNDb21tYSA9IGZhbHNlOwogICAgZGVmYXVsdFZhbHVlcy5mb3JFYWNoKCh2YXIga2V5LCBDb25zdGFudEV4cHJlc3Npb24gdmFsdWUpIHsKICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICBzYi53cml0ZSgnLCcpOwogICAgICB9CiAgICAgIGlmIChrZXkgaXMgU3RyaW5nKSB7CiAgICAgICAgc2Iud3JpdGUoJyInKTsKICAgICAgICBzYi53cml0ZShrZXkpOwogICAgICAgIHNiLndyaXRlKCciJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2Iud3JpdGUoa2V5KTsKICAgICAgfQogICAgICBzYi53cml0ZSgnOicpOwogICAgICBzYi53cml0ZSh2YWx1ZS50b1N0cnVjdHVyZWRUZXh0KCkpOwogICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKICAgIH0pOwogICAgc2Iud3JpdGUoJ30sY2FsbFN0cnVjdHVyZT0nKTsKICAgIHNiLndyaXRlKGNhbGxTdHJ1Y3R1cmUpOwogICAgc2Iud3JpdGUoJyxhcmd1bWVudHM9WycpOwogICAgYXJndW1lbnRzLmZvckVhY2goKENvbnN0YW50RXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICBpZiAobmVlZHNDb21tYSkgewogICAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgIH0KICAgICAgc2Iud3JpdGUodmFsdWUudG9TdHJ1Y3R1cmVkVGV4dCgpKTsKICAgICAgbmVlZHNDb21tYSA9IHRydWU7CiAgICB9KTsKICAgIHNiLndyaXRlKCddXScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CoEYAE5OPAEmAUQBGTYkIT0cGxYBOiclARcBKC4BSisBTj4BTkQBRhUuMAFMLhtAAUcsARZHARRHAUM1ATsBTAEoHQEzBk1QFwIBTD0MKk0fAUw6BAEMHwEjAUYGUEoGEwZEBlA7HSMBDE0wOCkvLhUGHCM9BiMEAQxDNjwoJSdOTkQkLBMEAQw8FwQBDBRIHEtABgQBDBZIHEIGBAEMLSUHGBhHDSUsDSYHPwEfIwEnNyEgOTtPRTcKCiJKSQhHLDkbBhoEAgFNSxxHJSwBTwE0NTwXLQ4nLkkiBh9CDBcsPxIEATw4OjIOKC5NIwYxDBcsQxIEAQwWKiYhHUAYFwgbFxcXDxcIFSoZCCIdHjMYFwgqGQgUGgQCAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9jb25zdGFudHMvZXZhbHVhdGlvbi5kYXJ0QHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvZm9yd2FyZGluZ19ub2RlLmRhcnS//i8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgInBhY2thZ2U6a2VybmVsL2FzdC5kYXJ0IgogICAgc2hvdwogICAgICAgIEFyZ3VtZW50cywKICAgICAgICBDbGFzcywKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZpZWxkLAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBNZW1iZXIsCiAgICAgICAgTmFtZSwKICAgICAgICBOYW1lZEV4cHJlc3Npb24sCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFByb2NlZHVyZUtpbmQsCiAgICAgICAgUmV0dXJuU3RhdGVtZW50LAogICAgICAgIFN1cGVyTWV0aG9kSW52b2NhdGlvbiwKICAgICAgICBTdXBlclByb3BlcnR5R2V0LAogICAgICAgIFN1cGVyUHJvcGVydHlTZXQsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uLAogICAgICAgIFZhcmlhYmxlR2V0LAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90cmFuc2Zvcm1hdGlvbnMvZmxhZ3MuZGFydCcgc2hvdyBUcmFuc2Zvcm1lckZsYWc7CgppbXBvcnQgInBhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0IiBzaG93IFN1YnN0aXR1dGlvbjsKCmltcG9ydCAiLi4vcHJvYmxlbXMuZGFydCIgc2hvdyB1bmhhbmRsZWQ7CgppbXBvcnQgIi4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0IgogICAgc2hvdyBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzTm9uQ292YXJpYW50bHksIFZhcmlhbmNlOwoKaW1wb3J0ICIuLi90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnQiIHNob3cgZ2V0TmFtZWRGb3JtYWw7CgppbXBvcnQgImtlcm5lbF9idWlsZGVyLmRhcnQiCiAgICBzaG93IENsYXNzSGllcmFyY2h5QnVpbGRlciwgRGVjbGFyYXRpb24sIERlbGF5ZWRNZW1iZXIsIENsYXNzQnVpbGRlcjsKCmNsYXNzIEZvcndhcmRpbmdOb2RlIHsKICBmaW5hbCBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgaGllcmFyY2h5OwoKICBmaW5hbCBDbGFzc0J1aWxkZXIgcGFyZW50OwoKICBmaW5hbCBEZWNsYXJhdGlvbiBjb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdDsKCiAgZmluYWwgUHJvY2VkdXJlS2luZCBraW5kOwoKICAvLy8gQSBsaXN0IGNvbnRhaW5pbmcgdGhlIGRpcmVjdGx5IGltcGxlbWVudGVkIGFuZCBkaXJlY3RseSBpbmhlcml0ZWQKICAvLy8gcHJvY2VkdXJlcyBvZiB0aGUgY2xhc3MgaW4gcXVlc3Rpb24uCiAgZmluYWwgTGlzdDxEZWNsYXJhdGlvbj4gX2NhbmRpZGF0ZXM7CgogIEZvcndhcmRpbmdOb2RlKHRoaXMuaGllcmFyY2h5LCB0aGlzLnBhcmVudCwKICAgICAgdGhpcy5jb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdCwgdGhpcy5fY2FuZGlkYXRlcywgdGhpcy5raW5kKTsKCiAgTmFtZSBnZXQgbmFtZSA9PiBjb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdC50YXJnZXQubmFtZTsKCiAgQ2xhc3MgZ2V0IGVuY2xvc2luZ0NsYXNzID0+IHBhcmVudC5jbHM7CgogIC8vLyBGaW5pc2hlcyBoYW5kbGluZyBvZiB0aGlzIG5vZGUgYnkgcHJvcGFnYXRpbmcgY292YXJpYW5jZSBhbmQgY3JlYXRpbmcKICAvLy8gZm9yd2FyZGluZyBzdHVicyBpZiBuZWNlc3NhcnkuCiAgTWVtYmVyIGZpbmFsaXplKCkgPT4gX2NvbXB1dGVDb3ZhcmlhbmNlRml4ZXMoKTsKCiAgLy8vIFRhZyB0aGUgcGFyYW1ldGVycyBvZiBbaW50ZXJmYWNlTWVtYmVyXSB0aGF0IG5lZWQgdHlwZSBjaGVja3MKICAvLy8KICAvLy8gUGFyYW1ldGVycyBjYW4gbmVlZCB0eXBlIGNoZWNrcyBmb3IgY2FsbHMgY29taW5nIGZyb20gc3RhdGljYWxseSB0eXBlZAogIC8vLyBjYWxsIHNpdGVzLCBkdWUgdG8gY292YXJpYW50IGdlbmVyaWNzIGFuZCBvdmVycmlkZXMgd2l0aCBleHBsaWNpdAogIC8vLyBgY292YXJpYW50YCBwYXJhbWV0ZXJzLgogIC8vLwogIC8vLyBUYWcgcGFyYW1ldGVycyBvZiBbaW50ZXJmYWNlTWVtYmVyXSB0aGF0IG5lZWQgc3VjaCBjaGVja3Mgd2hlbiB0aGUgbWVtYmVyCiAgLy8vIG9jY3VycyBpbiBbZW5jbG9zaW5nQ2xhc3NdJ3MgaW50ZXJmYWNlLiAgSWYgcGFyYW1ldGVycyBuZWVkIGNoZWNrcyBidXQKICAvLy8gdGhleSB3b3VsZCBub3QgYmUgY2hlY2tlZCBpbiBhbiBpbmhlcml0ZWQgaW1wbGVtZW50YXRpb24sIGEgZm9yd2FyZGluZwogIC8vLyBzdHViIGlzIGludHJvZHVjZWQgYXMgYSBwbGFjZSB0byBwdXQgdGhlIGNoZWNrcy4KICBNZW1iZXIgX2NvbXB1dGVDb3ZhcmlhbmNlRml4ZXMoKSB7CiAgICBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyID0gY29tYmluZWRNZW1iZXJTaWduYXR1cmVSZXN1bHQudGFyZ2V0OwogICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9CiAgICAgICAgX3N1YnN0aXR1dGlvbkZvcihpbnRlcmZhY2VNZW1iZXIsIGVuY2xvc2luZ0NsYXNzKTsKICAgIC8vIFdlIGFsd2F5cyBjcmVhdGUgYSBmb3J3YXJkaW5nIHN0dWIgd2hlbiB3ZSd2ZSBpbmhlcml0ZWQgYSBtZW1iZXIgZnJvbSBhbgogICAgLy8gaW50ZXJmYWNlIG90aGVyIHRoYW4gdGhlIGZpcnN0IG92ZXJyaWRlIGNhbmRpZGF0ZS4gIFRoaXMgaXMgdG8gd29yawogICAgLy8gYXJvdW5kIGEgYnVnIGluIHRoZSBLZXJuZWwgdHlwZSBjaGVja2VyIHdoZXJlIGl0IGNob29zZXMgdGhlIGZpcnN0CiAgICAvLyBvdmVycmlkZSBjYW5kaWRhdGUuCiAgICAvLwogICAgLy8gVE9ETyhrbWlsbGlraW4pOiBGaXggdGhlIEtlcm5lbCB0eXBlIGNoZWNrZXIgYW5kIHN0b3AgY3JlYXRpbmcgdGhlc2UKICAgIC8vIGV4dHJhIHN0dWJzLgogICAgTWVtYmVyIHN0dWIgPSBpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3MgPT0gZW5jbG9zaW5nQ2xhc3MgfHwKICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyID09IGdldENhbmRpZGF0ZUF0KDApCiAgICAgICAgPyBpbnRlcmZhY2VNZW1iZXIKICAgICAgICA6IF9jcmVhdGVGb3J3YXJkaW5nU3R1YihzdWJzdGl0dXRpb24sIGludGVyZmFjZU1lbWJlcik7CgogICAgRnVuY3Rpb25Ob2RlIGludGVyZmFjZUZ1bmN0aW9uID0gaW50ZXJmYWNlTWVtYmVyLmZ1bmN0aW9uOwogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBpbnRlcmZhY2VQb3NpdGlvbmFsUGFyYW1ldGVycyA9CiAgICAgICAgZ2V0UG9zaXRpb25hbFBhcmFtZXRlcnMoaW50ZXJmYWNlTWVtYmVyKTsKICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gaW50ZXJmYWNlTmFtZWRQYXJhbWV0ZXJzID0KICAgICAgICBpbnRlcmZhY2VGdW5jdGlvbj8ubmFtZWRQYXJhbWV0ZXJzID8/IFtdOwogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBpbnRlcmZhY2VUeXBlUGFyYW1ldGVycyA9CiAgICAgICAgaW50ZXJmYWNlRnVuY3Rpb24/LnR5cGVQYXJhbWV0ZXJzID8/IFtdOwoKICAgIHZvaWQgY3JlYXRlU3R1YklmTmVlZGVkKCkgewogICAgICBpZiAoc3R1YiAhPSBpbnRlcmZhY2VNZW1iZXIpIHJldHVybjsKICAgICAgaWYgKGludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzcyA9PSBlbmNsb3NpbmdDbGFzcykgcmV0dXJuOwogICAgICBzdHViID0gX2NyZWF0ZUZvcndhcmRpbmdTdHViKHN1YnN0aXR1dGlvbiwgaW50ZXJmYWNlTWVtYmVyKTsKICAgIH0KCiAgICBib29sIGlzSW1wbENyZWF0ZWQgPSBmYWxzZTsKICAgIHZvaWQgY3JlYXRlSW1wbElmTmVlZGVkKCkgewogICAgICBpZiAoaXNJbXBsQ3JlYXRlZCkgcmV0dXJuOwogICAgICBjcmVhdGVTdHViSWZOZWVkZWQoKTsKICAgICAgX2NyZWF0ZUZvcndhcmRpbmdJbXBsSWZOZWVkZWQoc3R1Yi5mdW5jdGlvbik7CiAgICAgIGlzSW1wbENyZWF0ZWQgPSB0cnVlOwogICAgfQoKICAgIEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNOb25Db3ZhcmlhbnRseSBuZWVkc0NoZWNrVmlzaXRvciA9CiAgICAgICAgZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMuaXNFbXB0eQogICAgICAgICAgICA/IG51bGwKICAgICAgICAgICAgLy8gVE9ETyhhaGUpOiBJdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGNhY2hlIHRoaXMgb2JqZWN0LgogICAgICAgICAgICA6IG5ldyBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzTm9uQ292YXJpYW50bHkoCiAgICAgICAgICAgICAgICBlbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBjaGVja2luZyB0aGUgcGFyYW1ldGVyIHR5cGVzIGFuZCB0aGVzZSBhcmUgaW4gYQogICAgICAgICAgICAgICAgLy8gY29udHJhdmFyaWFudCBwb3NpdGlvbi4KICAgICAgICAgICAgICAgIGluaXRpYWxWYXJpYW5jZTogVmFyaWFuY2UuY29udHJhdmFyaWFudCk7CiAgICBib29sIG5lZWRzQ2hlY2soRGFydFR5cGUgdHlwZSkgPT4gbmVlZHNDaGVja1Zpc2l0b3IgPT0gbnVsbAogICAgICAgID8gZmFsc2UKICAgICAgICA6IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZSh0eXBlKS5hY2NlcHQobmVlZHNDaGVja1Zpc2l0b3IpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VQb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9IGludGVyZmFjZVBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICBib29sIGlzR2VuZXJpY0NvdmFyaWFudEltcGwgPQogICAgICAgICAgcGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwgfHwgbmVlZHNDaGVjayhwYXJhbWV0ZXIudHlwZSk7CiAgICAgIGJvb2wgaXNDb3ZhcmlhbnQgPSBwYXJhbWV0ZXIuaXNDb3ZhcmlhbnQ7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gc3VwZXJQYXJhbWV0ZXIgPSBwYXJhbWV0ZXI7CiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgX2NhbmRpZGF0ZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICBNZW1iZXIgb3RoZXJNZW1iZXIgPSBnZXRDYW5kaWRhdGVBdChqKTsKICAgICAgICBpZiAob3RoZXJNZW1iZXIgaXMgRm9yd2FyZGluZ05vZGUpIGNvbnRpbnVlOwogICAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gb3RoZXJQb3NpdGlvbmFsUGFyYW1ldGVycyA9CiAgICAgICAgICAgIGdldFBvc2l0aW9uYWxQYXJhbWV0ZXJzKG90aGVyTWVtYmVyKTsKICAgICAgICBpZiAob3RoZXJQb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggPD0gaSkgY29udGludWU7CiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBvdGhlclBhcmFtZXRlciA9IG90aGVyUG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgICAgaWYgKGogPT0gMCkgc3VwZXJQYXJhbWV0ZXIgPSBvdGhlclBhcmFtZXRlcjsKICAgICAgICBpZiAoaWRlbnRpY2FsKG90aGVyTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIpKSBjb250aW51ZTsKICAgICAgICBpZiAob3RoZXJQYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgICAgaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChvdGhlclBhcmFtZXRlci5pc0NvdmFyaWFudCkgewogICAgICAgICAgaXNDb3ZhcmlhbnQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgIGlmICghc3VwZXJQYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgICAgY3JlYXRlSW1wbElmTmVlZGVkKCk7CiAgICAgICAgfQogICAgICAgIGlmICghcGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICAgIGNyZWF0ZVN0dWJJZk5lZWRlZCgpOwogICAgICAgICAgc3R1Yi5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzQ292YXJpYW50KSB7CiAgICAgICAgaWYgKCFzdXBlclBhcmFtZXRlci5pc0NvdmFyaWFudCkgewogICAgICAgICAgY3JlYXRlSW1wbElmTmVlZGVkKCk7CiAgICAgICAgfQogICAgICAgIGlmICghcGFyYW1ldGVyLmlzQ292YXJpYW50KSB7CiAgICAgICAgICBjcmVhdGVTdHViSWZOZWVkZWQoKTsKICAgICAgICAgIHN0dWIuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0uaXNDb3ZhcmlhbnQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VOYW1lZFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgPSBpbnRlcmZhY2VOYW1lZFBhcmFtZXRlcnNbaV07CiAgICAgIGJvb2wgaXNHZW5lcmljQ292YXJpYW50SW1wbCA9CiAgICAgICAgICBwYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCB8fCBuZWVkc0NoZWNrKHBhcmFtZXRlci50eXBlKTsKICAgICAgYm9vbCBpc0NvdmFyaWFudCA9IHBhcmFtZXRlci5pc0NvdmFyaWFudDsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBzdXBlclBhcmFtZXRlciA9IHBhcmFtZXRlcjsKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBfY2FuZGlkYXRlcy5sZW5ndGg7IGorKykgewogICAgICAgIE1lbWJlciBvdGhlck1lbWJlciA9IGdldENhbmRpZGF0ZUF0KGopOwogICAgICAgIGlmIChvdGhlck1lbWJlciBpcyBGb3J3YXJkaW5nTm9kZSkgY29udGludWU7CiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBvdGhlclBhcmFtZXRlciA9CiAgICAgICAgICAgIGdldE5hbWVkRm9ybWFsKG90aGVyTWVtYmVyLmZ1bmN0aW9uLCBwYXJhbWV0ZXIubmFtZSk7CiAgICAgICAgaWYgKG90aGVyUGFyYW1ldGVyID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgIGlmIChqID09IDApIHN1cGVyUGFyYW1ldGVyID0gb3RoZXJQYXJhbWV0ZXI7CiAgICAgICAgaWYgKGlkZW50aWNhbChvdGhlck1lbWJlciwgaW50ZXJmYWNlTWVtYmVyKSkgY29udGludWU7CiAgICAgICAgaWYgKG90aGVyUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICAgIGlzR2VuZXJpY0NvdmFyaWFudEltcGwgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAob3RoZXJQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQpIHsKICAgICAgICAgIGlzQ292YXJpYW50ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICBpZiAoIXN1cGVyUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICAgIGNyZWF0ZUltcGxJZk5lZWRlZCgpOwogICAgICAgIH0KICAgICAgICBpZiAoIXBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKSB7CiAgICAgICAgICBjcmVhdGVTdHViSWZOZWVkZWQoKTsKICAgICAgICAgIHN0dWIuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzW2ldLmlzR2VuZXJpY0NvdmFyaWFudEltcGwgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNDb3ZhcmlhbnQpIHsKICAgICAgICBpZiAoIXN1cGVyUGFyYW1ldGVyLmlzQ292YXJpYW50KSB7CiAgICAgICAgICBjcmVhdGVJbXBsSWZOZWVkZWQoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFwYXJhbWV0ZXIuaXNDb3ZhcmlhbnQpIHsKICAgICAgICAgIGNyZWF0ZVN0dWJJZk5lZWRlZCgpOwogICAgICAgICAgc3R1Yi5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnNbaV0uaXNDb3ZhcmlhbnQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VUeXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBpbnRlcmZhY2VUeXBlUGFyYW1ldGVyc1tpXTsKICAgICAgYm9vbCBpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHlwZVBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsIHx8CiAgICAgICAgICBuZWVkc0NoZWNrKHR5cGVQYXJhbWV0ZXIuYm91bmQpOwogICAgICBUeXBlUGFyYW1ldGVyIHN1cGVyVHlwZVBhcmFtZXRlciA9IHR5cGVQYXJhbWV0ZXI7CiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgX2NhbmRpZGF0ZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICBNZW1iZXIgb3RoZXJNZW1iZXIgPSBnZXRDYW5kaWRhdGVBdChqKTsKICAgICAgICBpZiAob3RoZXJNZW1iZXIgaXMgRm9yd2FyZGluZ05vZGUpIGNvbnRpbnVlOwogICAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gb3RoZXJUeXBlUGFyYW1ldGVycyA9CiAgICAgICAgICAgIG90aGVyTWVtYmVyLmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwogICAgICAgIGlmIChvdGhlclR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA8PSBpKSBjb250aW51ZTsKICAgICAgICBUeXBlUGFyYW1ldGVyIG90aGVyVHlwZVBhcmFtZXRlciA9IG90aGVyVHlwZVBhcmFtZXRlcnNbaV07CiAgICAgICAgaWYgKGogPT0gMCkgc3VwZXJUeXBlUGFyYW1ldGVyID0gb3RoZXJUeXBlUGFyYW1ldGVyOwogICAgICAgIGlmIChpZGVudGljYWwob3RoZXJNZW1iZXIsIGludGVyZmFjZU1lbWJlcikpIGNvbnRpbnVlOwogICAgICAgIGlmIChvdGhlclR5cGVQYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgICAgaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKSB7CiAgICAgICAgaWYgKCFzdXBlclR5cGVQYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgICAgY3JlYXRlSW1wbElmTmVlZGVkKCk7CiAgICAgICAgfQogICAgICAgIGlmICghdHlwZVBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKSB7CiAgICAgICAgICBjcmVhdGVTdHViSWZOZWVkZWQoKTsKICAgICAgICAgIHN0dWIuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnNbaV0uaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3R1YjsKICB9CgogIHZvaWQgX2NyZWF0ZUZvcndhcmRpbmdJbXBsSWZOZWVkZWQoRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uKSB7CiAgICBpZiAoZnVuY3Rpb24uYm9keSAhPSBudWxsKSB7CiAgICAgIC8vIFRoZXJlIGlzIGFscmVhZHkgYW4gaW1wbGVtZW50YXRpb247IG5vdGhpbmcgZnVydGhlciBuZWVkcyB0byBiZSBkb25lLgogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBGaW5kIHRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgc3VwZXJjbGFzczsgdGhpcyBpcyB3aGF0IHdlIG5lZWQKICAgIC8vIHRvIGZvcndhcmQgdG8uICBJZiB3ZSBjYW4ndCBmaW5kIG9uZSwgdGhlbiB0aGUgbWV0aG9kIGlzIGZ1bGx5IGFic3RyYWN0CiAgICAvLyBhbmQgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4KICAgIENsYXNzIHN1cGVyY2xhc3MgPSBlbmNsb3NpbmdDbGFzcy5zdXBlcmNsYXNzOwogICAgaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgcmV0dXJuOwogICAgUHJvY2VkdXJlIHByb2NlZHVyZSA9IGZ1bmN0aW9uLnBhcmVudDsKICAgIE1lbWJlciBzdXBlclRhcmdldCA9IGhpZXJhcmNoeS5nZXREaXNwYXRjaFRhcmdldEtlcm5lbCgKICAgICAgICBzdXBlcmNsYXNzLCBwcm9jZWR1cmUubmFtZSwga2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcik7CiAgICBpZiAoc3VwZXJUYXJnZXQgPT0gbnVsbCkgcmV0dXJuOwogICAgaWYgKHN1cGVyVGFyZ2V0IGlzIFByb2NlZHVyZSAmJiBzdXBlclRhcmdldC5pc0ZvcndhcmRpbmdTdHViKSB7CiAgICAgIHN1cGVyVGFyZ2V0ID0gX2dldEZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXQoc3VwZXJUYXJnZXQpOwogICAgfQogICAgcHJvY2VkdXJlLmlzQWJzdHJhY3QgPSBmYWxzZTsKICAgIGlmICghcHJvY2VkdXJlLmlzRm9yd2FyZGluZ1N0dWIpIHsKICAgICAgLy8gVGhpcyBwcm9jZWR1cmUgZXhpc3RzIGFic3RyYWN0bHkgaW4gdGhlIHNvdXJjZSBjb2RlOyB3ZSBuZWVkIHRvIG1ha2UgaXQKICAgICAgLy8gY29uY3JldGUgYW5kIGdpdmUgaXQgYSBib2R5IHRoYXQgaXMgYSBmb3J3YXJkaW5nIHN0dWIuICBUaGlzIHNpdHVhdGlvbgogICAgICAvLyBpcyBjYWxsZWQgYSAiZm9yd2FyZGluZyBzZW1pLXN0dWIiLgogICAgICBwcm9jZWR1cmUuaXNGb3J3YXJkaW5nU3R1YiA9IHRydWU7CiAgICAgIHByb2NlZHVyZS5pc0ZvcndhcmRpbmdTZW1pU3R1YiA9IHRydWU7CiAgICB9CiAgICBMaXN0PEV4cHJlc3Npb24+IHBvc2l0aW9uYWxBcmd1bWVudHMgPSBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycwogICAgICAgIC5tYXA8RXhwcmVzc2lvbj4oKHBhcmFtZXRlcikgPT4gbmV3IFZhcmlhYmxlR2V0KHBhcmFtZXRlcikpCiAgICAgICAgLnRvTGlzdCgpOwogICAgTGlzdDxOYW1lZEV4cHJlc3Npb24+IG5hbWVkQXJndW1lbnRzID0gZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzCiAgICAgICAgLm1hcCgocGFyYW1ldGVyKSA9PgogICAgICAgICAgICBuZXcgTmFtZWRFeHByZXNzaW9uKHBhcmFtZXRlci5uYW1lLCBuZXcgVmFyaWFibGVHZXQocGFyYW1ldGVyKSkpCiAgICAgICAgLnRvTGlzdCgpOwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzCiAgICAgICAgLm1hcDxEYXJ0VHlwZT4oKHR5cGVQYXJhbWV0ZXIpID0+IG5ldyBUeXBlUGFyYW1ldGVyVHlwZSh0eXBlUGFyYW1ldGVyKSkKICAgICAgICAudG9MaXN0KCk7CiAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gbmV3IEFyZ3VtZW50cyhwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICAgIHR5cGVzOiB0eXBlQXJndW1lbnRzLCBuYW1lZDogbmFtZWRBcmd1bWVudHMpOwogICAgRXhwcmVzc2lvbiBzdXBlckNhbGw7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk1ldGhvZDoKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yOgogICAgICAgIHN1cGVyQ2FsbCA9IG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24obmFtZSwgYXJndW1lbnRzLCBzdXBlclRhcmdldCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5HZXR0ZXI6CiAgICAgICAgc3VwZXJDYWxsID0gbmV3IFN1cGVyUHJvcGVydHlHZXQobmFtZSwgc3VwZXJUYXJnZXQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuU2V0dGVyOgogICAgICAgIHN1cGVyQ2FsbCA9CiAgICAgICAgICAgIG5ldyBTdXBlclByb3BlcnR5U2V0KG5hbWUsIHBvc2l0aW9uYWxBcmd1bWVudHNbMF0sIHN1cGVyVGFyZ2V0KTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB1bmhhbmRsZWQoJyRraW5kJywgJ19jcmVhdGVGb3J3YXJkaW5nSW1wbElmTmVlZGVkJywgLTEsIG51bGwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgZnVuY3Rpb24uYm9keSA9IG5ldyBSZXR1cm5TdGF0ZW1lbnQoc3VwZXJDYWxsKS4ucGFyZW50ID0gZnVuY3Rpb247CiAgICBwcm9jZWR1cmUudHJhbnNmb3JtZXJGbGFncyB8PSBUcmFuc2Zvcm1lckZsYWcuc3VwZXJDYWxsczsKICAgIHByb2NlZHVyZS5mb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0ID0gc3VwZXJUYXJnZXQ7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIGZvcndhcmRpbmcgc3R1YiBiYXNlZCBvbiB0aGUgZ2l2ZW4gW3RhcmdldF0uCiAgUHJvY2VkdXJlIF9jcmVhdGVGb3J3YXJkaW5nU3R1YihTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uLCBNZW1iZXIgdGFyZ2V0KSB7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGNvcHlQYXJhbWV0ZXIoVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIpIHsKICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKHBhcmFtZXRlci5uYW1lLAogICAgICAgICAgdHlwZTogc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHBhcmFtZXRlci50eXBlKSwKICAgICAgICAgIGlzQ292YXJpYW50OiBwYXJhbWV0ZXIuaXNDb3ZhcmlhbnQpCiAgICAgICAgLi5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gcGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGw7CiAgICB9CgogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0YXJnZXRUeXBlUGFyYW1ldGVycyA9CiAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uPy50eXBlUGFyYW1ldGVycyA/PyBbXTsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CiAgICBpZiAodGFyZ2V0VHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICB0eXBlUGFyYW1ldGVycyA9CiAgICAgICAgICBuZXcgTGlzdDxUeXBlUGFyYW1ldGVyPi5maWxsZWQodGFyZ2V0VHlwZVBhcmFtZXRlcnMubGVuZ3RoLCBudWxsKTsKICAgICAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBhZGRpdGlvbmFsU3Vic3RpdHV0aW9uID0KICAgICAgICAgIDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRUeXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICAgIFR5cGVQYXJhbWV0ZXIgdGFyZ2V0VHlwZVBhcmFtZXRlciA9IHRhcmdldFR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IG5ldyBUeXBlUGFyYW1ldGVyKAogICAgICAgICAgICB0YXJnZXRUeXBlUGFyYW1ldGVyLm5hbWUsIG51bGwpCiAgICAgICAgICAuLmlzR2VuZXJpY0NvdmFyaWFudEltcGwgPSB0YXJnZXRUeXBlUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGw7CiAgICAgICAgdHlwZVBhcmFtZXRlcnNbaV0gPSB0eXBlUGFyYW1ldGVyOwogICAgICAgIGFkZGl0aW9uYWxTdWJzdGl0dXRpb25bdGFyZ2V0VHlwZVBhcmFtZXRlcl0gPQogICAgICAgICAgICBuZXcgVHlwZVBhcmFtZXRlclR5cGUodHlwZVBhcmFtZXRlcik7CiAgICAgIH0KICAgICAgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmNvbWJpbmUoCiAgICAgICAgICBzdWJzdGl0dXRpb24sIFN1YnN0aXR1dGlvbi5mcm9tTWFwKGFkZGl0aW9uYWxTdWJzdGl0dXRpb24pKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHR5cGVQYXJhbWV0ZXJzW2ldLmJvdW5kID0KICAgICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHRhcmdldFR5cGVQYXJhbWV0ZXJzW2ldLmJvdW5kKTsKICAgICAgfQogICAgfQogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsUGFyYW1ldGVycyA9CiAgICAgICAgZ2V0UG9zaXRpb25hbFBhcmFtZXRlcnModGFyZ2V0KS5tYXAoY29weVBhcmFtZXRlcikudG9MaXN0KCk7CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycyA9CiAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uPy5uYW1lZFBhcmFtZXRlcnM/Lm1hcChjb3B5UGFyYW1ldGVyKT8udG9MaXN0KCkgPz8gW107CiAgICBGdW5jdGlvbk5vZGUgZnVuY3Rpb24gPSBuZXcgRnVuY3Rpb25Ob2RlKG51bGwsCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0eXBlUGFyYW1ldGVycywKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiBnZXRSZXF1aXJlZFBhcmFtZXRlckNvdW50KHRhcmdldCksCiAgICAgICAgcmV0dXJuVHlwZTogc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGdldFJldHVyblR5cGUodGFyZ2V0KSkpOwogICAgTWVtYmVyIGZpbmFsVGFyZ2V0OwogICAgaWYgKHRhcmdldCBpcyBQcm9jZWR1cmUgJiYgdGFyZ2V0LmlzRm9yd2FyZGluZ1N0dWIpIHsKICAgICAgZmluYWxUYXJnZXQgPSB0YXJnZXQuZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXQ7CiAgICB9IGVsc2UgewogICAgICBmaW5hbFRhcmdldCA9IHRhcmdldDsKICAgIH0KICAgIHJldHVybiBuZXcgUHJvY2VkdXJlKG5hbWUsIGtpbmQsIGZ1bmN0aW9uLAogICAgICAgIGlzQWJzdHJhY3Q6IHRydWUsCiAgICAgICAgaXNGb3J3YXJkaW5nU3R1YjogdHJ1ZSwKICAgICAgICBmaWxlVXJpOiBlbmNsb3NpbmdDbGFzcy5maWxlVXJpLAogICAgICAgIGZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0OiBmaW5hbFRhcmdldCkKICAgICAgLi5zdGFydEZpbGVPZmZzZXQgPSBlbmNsb3NpbmdDbGFzcy5maWxlT2Zmc2V0CiAgICAgIC4uZmlsZU9mZnNldCA9IGVuY2xvc2luZ0NsYXNzLmZpbGVPZmZzZXQKICAgICAgLi5wYXJlbnQgPSBlbmNsb3NpbmdDbGFzczsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbaV10aCBlbGVtZW50IG9mIFtfY2FuZGlkYXRlc10sIGZpbmFsaXppbmcgaXQgaWYgbmVjZXNzYXJ5LgogIE1lbWJlciBnZXRDYW5kaWRhdGVBdChpbnQgaSkgewogICAgRGVjbGFyYXRpb24gY2FuZGlkYXRlID0gX2NhbmRpZGF0ZXNbaV07CiAgICBhc3NlcnQoY2FuZGlkYXRlIGlzISBEZWxheWVkTWVtYmVyKTsKICAgIHJldHVybiBjYW5kaWRhdGUudGFyZ2V0OwogIH0KCiAgc3RhdGljIE1lbWJlciBfZ2V0Rm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldChQcm9jZWR1cmUgZm9yd2FyZGluZ1N0dWIpIHsKICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogd2hlbiBkYXJ0YnVnLmNvbS8zMTU2MiBpcyBmaXhlZCwgdGhpcyBzaG91bGQgYmVjb21lCiAgICAvLyBlYXNpZXIuCiAgICBSZXR1cm5TdGF0ZW1lbnQgYm9keSA9IGZvcndhcmRpbmdTdHViLmZ1bmN0aW9uLmJvZHk7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBib2R5LmV4cHJlc3Npb247CiAgICBpZiAoZXhwcmVzc2lvbiBpcyBTdXBlck1ldGhvZEludm9jYXRpb24pIHsKICAgICAgcmV0dXJuIGV4cHJlc3Npb24uaW50ZXJmYWNlVGFyZ2V0OwogICAgfSBlbHNlIGlmIChleHByZXNzaW9uIGlzIFN1cGVyUHJvcGVydHlTZXQpIHsKICAgICAgcmV0dXJuIGV4cHJlc3Npb24uaW50ZXJmYWNlVGFyZ2V0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHVuaGFuZGxlZCgnJHtleHByZXNzaW9uLnJ1bnRpbWVUeXBlfScsCiAgICAgICAgICAnX2dldEZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXQnLCAtMSwgbnVsbCk7CiAgICB9CiAgfQoKICBTdWJzdGl0dXRpb24gX3N1YnN0aXR1dGlvbkZvcihNZW1iZXIgY2FuZGlkYXRlLCBDbGFzcyBjbGFzc18pIHsKICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUoaGllcmFyY2h5LmdldEtlcm5lbFR5cGVBc0luc3RhbmNlT2YoCiAgICAgICAgY2xhc3NfLnRoaXNUeXBlLCBjYW5kaWRhdGUuZW5jbG9zaW5nQ2xhc3MpKTsKICB9CgogIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gZ2V0UG9zaXRpb25hbFBhcmFtZXRlcnMoTWVtYmVyIG1lbWJlcikgewogICAgaWYgKG1lbWJlciBpcyBGaWVsZCkgewogICAgICBpZiAoa2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcikgewogICAgICAgIHJldHVybiA8VmFyaWFibGVEZWNsYXJhdGlvbj5bCiAgICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbigiXyIsCiAgICAgICAgICAgICAgdHlwZTogbWVtYmVyLnR5cGUsIGlzQ292YXJpYW50OiBtZW1iZXIuaXNDb3ZhcmlhbnQpCiAgICAgICAgICAgIC4uaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IG1lbWJlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsCiAgICAgICAgXTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gPFZhcmlhYmxlRGVjbGFyYXRpb24+W107CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBtZW1iZXIuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnM7CiAgICB9CiAgfQoKICBpbnQgZ2V0UmVxdWlyZWRQYXJhbWV0ZXJDb3VudChNZW1iZXIgbWVtYmVyKSB7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLkdldHRlcjoKICAgICAgICByZXR1cm4gMDsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLlNldHRlcjoKICAgICAgICByZXR1cm4gMTsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbWVtYmVyLmZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQ7CiAgICB9CiAgfQoKICBEYXJ0VHlwZSBnZXRSZXR1cm5UeXBlKE1lbWJlciBtZW1iZXIpIHsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuR2V0dGVyOgogICAgICAgIHJldHVybiBtZW1iZXIgaXMgRmllbGQgPyBtZW1iZXIudHlwZSA6IG1lbWJlci5mdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuU2V0dGVyOgogICAgICAgIHJldHVybiBjb25zdCBWb2lkVHlwZSgpOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBtZW1iZXIuZnVuY3Rpb24ucmV0dXJuVHlwZTsKICAgIH0KICB9Cn0KgaYATk48ASEJEw8SFA8WEA4ZExcZHxoaFxsdFRIBSQE9ASoBNjkBQwEdSgEXKQEdATMBHAFIKycBLkgBPgEqAUwlMgFEBk1IHgZQTU03JUMgO1BLShsHTBRGMRpAAT8+MjkyMjEBICtEQwYBICAhHDQcBgE9LhNEOC9KKzpAEEdFSCRKMDY1MDU+Mj1LNT81KQoqHgoIJDYgCjEgTwoIGSsgCiYgRAoIBkBDJEowNjUwNS1CLjU/NSkKKh4KCCQ2IAoxIEoKCBkrIAomID8KCAY/QEwrODUwNTIxN0M9PzkpCggkOiAKNSBJCggGEQQBPiFPDgZQTykyJCs8QyVEQAYiJ1FQLSktBklEE0QcTRM7UBM9NhoUISNNDyE9DyEUTQ8PRw8GRz43BAE9Tkc1PS5FBgEvLygrF008Jz5FOSxRKzYyCCtHOCJICAY1RTBOMzQqKENJGDo6DRwGLxogKTQ0LyEEAU4hLCkdBAFKTA85LS8pMSkNNDYGBAFCTzUEAUUbKiYnQkULDygIDTMGBAExFCESIRIPNwYEASoUIUshIQ8rBgQCATdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2ZvcndhcmRpbmdfbm9kZS5kYXJ0NnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvdHlwZXMuZGFydMAAahEvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS50eXBlczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQm90dG9tVHlwZSwKICAgICAgICBDbGFzcywKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBOYW1lZFR5cGUsCiAgICAgICAgTnVsbGFiaWxpdHksCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBUeXBlZGVmVHlwZSwKICAgICAgICBWb2lkVHlwZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIHNob3cgU3Vic3RpdHV0aW9uOwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5QnVpbGRlcjsKCmNsYXNzIFR5cGVzIHsKICBmaW5hbCBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgaGllcmFyY2h5OwoKICBUeXBlcyh0aGlzLmhpZXJhcmNoeSk7CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgW3NdIGlzIGEgc3VidHlwZSBvZiBbdF0uCiAgYm9vbCBpc1N1YnR5cGVPZktlcm5lbChEYXJ0VHlwZSBzLCBEYXJ0VHlwZSB0KSB7CiAgICBpZiAocyBpcyBJbnZhbGlkVHlwZSkgewogICAgICAvLyBJbnZhbGlkVHlwZSBpcyBhIGJvdHRvbSB0eXBlLgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICh0IGlzIEludmFsaWRUeXBlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiBpc1N1YnR5cGVPZktlcm5lbE51bGxhYmlsaXR5KHMsIHMubnVsbGFiaWxpdHksIHQsIHQubnVsbGFiaWxpdHkpOwogIH0KCiAgYm9vbCBpc1N1YnR5cGVPZktlcm5lbE51bGxhYmlsaXR5KAogICAgICBEYXJ0VHlwZSBzLCBOdWxsYWJpbGl0eSBzTnVsbGFiaWxpdHksIERhcnRUeXBlIHQsIHROdWxsYWJpbGl0eSkgewogICAgaWYgKHMgaXMgQm90dG9tVHlwZSkgewogICAgICByZXR1cm4gdHJ1ZTsgLy8gUnVsZSAzLgogICAgfQogICAgaWYgKHQgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgcmV0dXJuIHRydWU7IC8vIFJ1bGUgMi4KICAgIH0KICAgIGlmICh0IGlzIFZvaWRUeXBlKSB7CiAgICAgIHJldHVybiB0cnVlOyAvLyBSdWxlIDIuCiAgICB9CiAgICBpZiAodCBpcyBCb3R0b21UeXBlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0IGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgQ2xhc3MgY2xzID0gdC5jbGFzc05vZGU7CiAgICAgIGlmIChjbHMgPT0gaGllcmFyY2h5Lm9iamVjdEtlcm5lbENsYXNzKSB7CiAgICAgICAgcmV0dXJuIHRydWU7IC8vIFJ1bGUgMi4KICAgICAgfQogICAgICBpZiAoY2xzID09IGhpZXJhcmNoeS5mdXR1cmVPcktlcm5lbENsYXNzKSB7CiAgICAgICAgY29uc3QgSXNGdXR1cmVPclN1YnR5cGVPZiByZWxhdGlvbiA9IGNvbnN0IElzRnV0dXJlT3JTdWJ0eXBlT2YoKTsKICAgICAgICBpZiAocyBpcyBEeW5hbWljVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzRHluYW1pY1JlbGF0ZWQoCiAgICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBWb2lkVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVm9pZFJlbGF0ZWQocywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcy5jbGFzc05vZGUgPT0gaGllcmFyY2h5LmZ1dHVyZU9yS2VybmVsQ2xhc3MKICAgICAgICAgICAgICA/IHJlbGF0aW9uLmlzRnV0dXJlT3JSZWxhdGVkKAogICAgICAgICAgICAgICAgICBzLCBzTnVsbGFiaWxpdHksIHQsIHROdWxsYWJpbGl0eSwgdGhpcykKICAgICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJmYWNlUmVsYXRlZCgKICAgICAgICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc0Z1bmN0aW9uUmVsYXRlZCgKICAgICAgICAgICAgICBzLCBzTnVsbGFiaWxpdHksIHQsIHROdWxsYWJpbGl0eSwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcy5wcm9tb3RlZEJvdW5kID09IG51bGwKICAgICAgICAgICAgICA/IHJlbGF0aW9uLmlzVHlwZVBhcmFtZXRlclJlbGF0ZWQoCiAgICAgICAgICAgICAgICAgIHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKQogICAgICAgICAgICAgIDogcmVsYXRpb24uaXNJbnRlcnNlY3Rpb25SZWxhdGVkKAogICAgICAgICAgICAgICAgICBzLCBzTnVsbGFiaWxpdHksIHQsIHROdWxsYWJpbGl0eSwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVkZWZUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNUeXBlZGVmUmVsYXRlZCgKICAgICAgICAgICAgICBzLCBzTnVsbGFiaWxpdHksIHQsIHROdWxsYWJpbGl0eSwgdGhpcyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IElzSW50ZXJmYWNlU3VidHlwZU9mIHJlbGF0aW9uID0gY29uc3QgSXNJbnRlcmZhY2VTdWJ0eXBlT2YoKTsKICAgICAgICBpZiAocyBpcyBEeW5hbWljVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzRHluYW1pY1JlbGF0ZWQoCiAgICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBWb2lkVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVm9pZFJlbGF0ZWQocywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcy5jbGFzc05vZGUgPT0gaGllcmFyY2h5LmZ1dHVyZU9yS2VybmVsQ2xhc3MKICAgICAgICAgICAgICA/IHJlbGF0aW9uLmlzRnV0dXJlT3JSZWxhdGVkKAogICAgICAgICAgICAgICAgICBzLCBzTnVsbGFiaWxpdHksIHQsIHROdWxsYWJpbGl0eSwgdGhpcykKICAgICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJmYWNlUmVsYXRlZCgKICAgICAgICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc0Z1bmN0aW9uUmVsYXRlZCgKICAgICAgICAgICAgICBzLCBzTnVsbGFiaWxpdHksIHQsIHROdWxsYWJpbGl0eSwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcy5wcm9tb3RlZEJvdW5kID09IG51bGwKICAgICAgICAgICAgICA/IHJlbGF0aW9uLmlzVHlwZVBhcmFtZXRlclJlbGF0ZWQoCiAgICAgICAgICAgICAgICAgIHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKQogICAgICAgICAgICAgIDogcmVsYXRpb24uaXNJbnRlcnNlY3Rpb25SZWxhdGVkKAogICAgICAgICAgICAgICAgICBzLCBzTnVsbGFiaWxpdHksIHQsIHROdWxsYWJpbGl0eSwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVkZWZUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNUeXBlZGVmUmVsYXRlZCgKICAgICAgICAgICAgICBzLCBzTnVsbGFiaWxpdHksIHQsIHROdWxsYWJpbGl0eSwgdGhpcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKHQgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIGNvbnN0IElzRnVuY3Rpb25TdWJ0eXBlT2YgcmVsYXRpb24gPSBjb25zdCBJc0Z1bmN0aW9uU3VidHlwZU9mKCk7CiAgICAgIGlmIChzIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzRHluYW1pY1JlbGF0ZWQoCiAgICAgICAgICAgIHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIFZvaWRUeXBlKSB7CiAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVm9pZFJlbGF0ZWQocywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICB9IGVsc2UgaWYgKHMgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgIHJldHVybiBzLmNsYXNzTm9kZSA9PSBoaWVyYXJjaHkuZnV0dXJlT3JLZXJuZWxDbGFzcwogICAgICAgICAgICA/IHJlbGF0aW9uLmlzRnV0dXJlT3JSZWxhdGVkKHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKQogICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJmYWNlUmVsYXRlZCgKICAgICAgICAgICAgICAgIHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICAgIHJldHVybiByZWxhdGlvbi5pc0Z1bmN0aW9uUmVsYXRlZCgKICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICB9IGVsc2UgaWYgKHMgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgICByZXR1cm4gcy5wcm9tb3RlZEJvdW5kID09IG51bGwKICAgICAgICAgICAgPyByZWxhdGlvbi5pc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKAogICAgICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpCiAgICAgICAgICAgIDogcmVsYXRpb24uaXNJbnRlcnNlY3Rpb25SZWxhdGVkKAogICAgICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICB9IGVsc2UgaWYgKHMgaXMgVHlwZWRlZlR5cGUpIHsKICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNUeXBlZGVmUmVsYXRlZCgKICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHQgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgaWYgKHQucHJvbW90ZWRCb3VuZCA9PSBudWxsKSB7CiAgICAgICAgY29uc3QgSXNUeXBlUGFyYW1ldGVyU3VidHlwZU9mIHJlbGF0aW9uID0KICAgICAgICAgICAgY29uc3QgSXNUeXBlUGFyYW1ldGVyU3VidHlwZU9mKCk7CiAgICAgICAgaWYgKHMgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc0R5bmFtaWNSZWxhdGVkKAogICAgICAgICAgICAgIHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgVm9pZFR5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc1ZvaWRSZWxhdGVkKHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgcmV0dXJuIHMuY2xhc3NOb2RlID09IGhpZXJhcmNoeS5mdXR1cmVPcktlcm5lbENsYXNzCiAgICAgICAgICAgICAgPyByZWxhdGlvbi5pc0Z1dHVyZU9yUmVsYXRlZCgKICAgICAgICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpCiAgICAgICAgICAgICAgOiByZWxhdGlvbi5pc0ludGVyZmFjZVJlbGF0ZWQoCiAgICAgICAgICAgICAgICAgIHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNGdW5jdGlvblJlbGF0ZWQoCiAgICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICAgICAgcmV0dXJuIHMucHJvbW90ZWRCb3VuZCA9PSBudWxsCiAgICAgICAgICAgICAgPyByZWxhdGlvbi5pc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKAogICAgICAgICAgICAgICAgICBzLCBzTnVsbGFiaWxpdHksIHQsIHROdWxsYWJpbGl0eSwgdGhpcykKICAgICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJzZWN0aW9uUmVsYXRlZCgKICAgICAgICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBUeXBlZGVmVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVHlwZWRlZlJlbGF0ZWQoCiAgICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBJc0ludGVyc2VjdGlvblN1YnR5cGVPZiByZWxhdGlvbiA9CiAgICAgICAgICAgIGNvbnN0IElzSW50ZXJzZWN0aW9uU3VidHlwZU9mKCk7CiAgICAgICAgaWYgKHMgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc0R5bmFtaWNSZWxhdGVkKAogICAgICAgICAgICAgIHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgVm9pZFR5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc1ZvaWRSZWxhdGVkKHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgICAgcmV0dXJuIHMuY2xhc3NOb2RlID09IGhpZXJhcmNoeS5mdXR1cmVPcktlcm5lbENsYXNzCiAgICAgICAgICAgICAgPyByZWxhdGlvbi5pc0Z1dHVyZU9yUmVsYXRlZCgKICAgICAgICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpCiAgICAgICAgICAgICAgOiByZWxhdGlvbi5pc0ludGVyZmFjZVJlbGF0ZWQoCiAgICAgICAgICAgICAgICAgIHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNGdW5jdGlvblJlbGF0ZWQoCiAgICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICAgICAgcmV0dXJuIHMucHJvbW90ZWRCb3VuZCA9PSBudWxsCiAgICAgICAgICAgICAgPyByZWxhdGlvbi5pc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKAogICAgICAgICAgICAgICAgICBzLCBzTnVsbGFiaWxpdHksIHQsIHROdWxsYWJpbGl0eSwgdGhpcykKICAgICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJzZWN0aW9uUmVsYXRlZCgKICAgICAgICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBUeXBlZGVmVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVHlwZWRlZlJlbGF0ZWQoCiAgICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCB0LCB0TnVsbGFiaWxpdHksIHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0IGlzIFR5cGVkZWZUeXBlKSB7CiAgICAgIGNvbnN0IElzVHlwZWRlZlN1YnR5cGVPZiByZWxhdGlvbiA9IGNvbnN0IElzVHlwZWRlZlN1YnR5cGVPZigpOwogICAgICBpZiAocyBpcyBEeW5hbWljVHlwZSkgewogICAgICAgIHJldHVybiByZWxhdGlvbi5pc0R5bmFtaWNSZWxhdGVkKAogICAgICAgICAgICBzLCBzTnVsbGFiaWxpdHksIHQsIHROdWxsYWJpbGl0eSwgdGhpcyk7CiAgICAgIH0gZWxzZSBpZiAocyBpcyBWb2lkVHlwZSkgewogICAgICAgIHJldHVybiByZWxhdGlvbi5pc1ZvaWRSZWxhdGVkKHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICByZXR1cm4gcy5jbGFzc05vZGUgPT0gaGllcmFyY2h5LmZ1dHVyZU9yS2VybmVsQ2xhc3MKICAgICAgICAgICAgPyByZWxhdGlvbi5pc0Z1dHVyZU9yUmVsYXRlZChzLCBzTnVsbGFiaWxpdHksIHQsIHROdWxsYWJpbGl0eSwgdGhpcykKICAgICAgICAgICAgOiByZWxhdGlvbi5pc0ludGVyZmFjZVJlbGF0ZWQoCiAgICAgICAgICAgICAgICBzLCBzTnVsbGFiaWxpdHksIHQsIHROdWxsYWJpbGl0eSwgdGhpcyk7CiAgICAgIH0gZWxzZSBpZiAocyBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNGdW5jdGlvblJlbGF0ZWQoCiAgICAgICAgICAgIHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgcmV0dXJuIHMucHJvbW90ZWRCb3VuZCA9PSBudWxsCiAgICAgICAgICAgID8gcmVsYXRpb24uaXNUeXBlUGFyYW1ldGVyUmVsYXRlZCgKICAgICAgICAgICAgICAgIHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKQogICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJzZWN0aW9uUmVsYXRlZCgKICAgICAgICAgICAgICAgIHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVkZWZUeXBlKSB7CiAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVHlwZWRlZlJlbGF0ZWQoCiAgICAgICAgICAgIHMsIHNOdWxsYWJpbGl0eSwgdCwgdE51bGxhYmlsaXR5LCB0aGlzKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0eXBlOiAke3QucnVudGltZVR5cGV9IjsKICAgIH0KICAgIHRocm93ICJVbmhhbmRsZWQgdHlwZSBjb21iaW5hdGlvbjogJHt0LnJ1bnRpbWVUeXBlfSAke3MucnVudGltZVR5cGV9IjsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgYWxsIHR5cGVzIGluIFtzXSBhbmQgW3RdIHBhaXJ3aXNlIGFyZSBzdWJ0eXBlcy4KICBib29sIGFyZVN1YnR5cGVzT2ZLZXJuZWwoTGlzdDxEYXJ0VHlwZT4gcywgTGlzdDxEYXJ0VHlwZT4gdCkgewogICAgaWYgKHMubGVuZ3RoICE9IHQubGVuZ3RoKSB7CiAgICAgIHRocm93ICJOdW1iZXJzIG9mIHR5cGUgYXJndW1lbnRzIGRvbid0IG1hdGNoICRzICR0LiI7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFpc1N1YnR5cGVPZktlcm5lbChzW2ldLCB0W2ldKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIGlzU2FtZVR5cGVLZXJuZWwoRGFydFR5cGUgcywgRGFydFR5cGUgdCkgewogICAgcmV0dXJuIGlzU3VidHlwZU9mS2VybmVsKHMsIHQpICYmIGlzU3VidHlwZU9mS2VybmVsKHQsIHMpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgVHlwZVJlbGF0aW9uPFQgZXh0ZW5kcyBEYXJ0VHlwZT4gewogIGNvbnN0IFR5cGVSZWxhdGlvbigpOwoKICBib29sIGlzRHluYW1pY1JlbGF0ZWQoRHluYW1pY1R5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LCBUIHQsCiAgICAgIE51bGxhYmlsaXR5IHROdWxsYWJpbGl0eSwgVHlwZXMgdHlwZXMpOwoKICBib29sIGlzVm9pZFJlbGF0ZWQoVm9pZFR5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LCBUIHQsCiAgICAgIE51bGxhYmlsaXR5IHROdWxsYWJpbGl0eSwgVHlwZXMgdHlwZXMpOwoKICBib29sIGlzSW50ZXJmYWNlUmVsYXRlZChJbnRlcmZhY2VUeXBlIHMsIE51bGxhYmlsaXR5IHNOdWxsYWJpbGl0eSwgVCB0LAogICAgICBOdWxsYWJpbGl0eSB0TnVsbGFiaWxpdHksIFR5cGVzIHR5cGVzKTsKCiAgYm9vbCBpc0ludGVyc2VjdGlvblJlbGF0ZWQoCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIGludGVyc2VjdGlvbiwKICAgICAgTnVsbGFiaWxpdHkgaW50ZXJzZWN0aW9uTnVsbGFiaWxpdHksCiAgICAgIFQgdCwKICAgICAgTnVsbGFiaWxpdHkgdE51bGxhYmlsaXR5LAogICAgICBUeXBlcyB0eXBlcyk7CgogIGJvb2wgaXNGdW5jdGlvblJlbGF0ZWQoRnVuY3Rpb25UeXBlIHMsIE51bGxhYmlsaXR5IHNOdWxsYWJpbGl0eSwgVCB0LAogICAgICBOdWxsYWJpbGl0eSB0TnVsbGFiaWxpdHksIFR5cGVzIHR5cGVzKTsKCiAgYm9vbCBpc0Z1dHVyZU9yUmVsYXRlZCgKICAgICAgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwKICAgICAgTnVsbGFiaWxpdHkgZnV0dXJlT3JOdWxsYWJpbGl0eSwKICAgICAgVCB0LAogICAgICBOdWxsYWJpbGl0eSB0TnVsbGFiaWxpdHksCiAgICAgIFR5cGVzIHR5cGVzKTsKCiAgYm9vbCBpc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKFR5cGVQYXJhbWV0ZXJUeXBlIHMsIE51bGxhYmlsaXR5IHNOdWxsYWJpbGl0eSwKICAgICAgVCB0LCBOdWxsYWJpbGl0eSB0TnVsbGFiaWxpdHksIFR5cGVzIHR5cGVzKTsKCiAgYm9vbCBpc1R5cGVkZWZSZWxhdGVkKFR5cGVkZWZUeXBlIHMsIE51bGxhYmlsaXR5IHNOdWxsYWJpbGl0eSwgVCB0LAogICAgICBOdWxsYWJpbGl0eSB0TnVsbGFiaWxpdHksIFR5cGVzIHR5cGVzKTsKfQoKY2xhc3MgSXNJbnRlcmZhY2VTdWJ0eXBlT2YgZXh0ZW5kcyBUeXBlUmVsYXRpb248SW50ZXJmYWNlVHlwZT4gewogIGNvbnN0IElzSW50ZXJmYWNlU3VidHlwZU9mKCk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbnRlcmZhY2VSZWxhdGVkKEludGVyZmFjZVR5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LAogICAgICBJbnRlcmZhY2VUeXBlIHQsIE51bGxhYmlsaXR5IHROdWxsYWJpbGl0eSwgVHlwZXMgdHlwZXMpIHsKICAgIGlmIChzLmNsYXNzTm9kZSA9PSB0eXBlcy5oaWVyYXJjaHkubnVsbEtlcm5lbENsYXNzKSB7CiAgICAgIC8vIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uLCB0byBhdm9pZCBpbnN0YW50YXRpbmcgdW5uZWNlc3NhcnkgdHlwZQogICAgICAvLyBhcmd1bWVudHMgaW4gZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZi4KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBJbnRlcmZhY2VUeXBlIGFzU3VwZXJ0eXBlID0KICAgICAgICB0eXBlcy5oaWVyYXJjaHkuZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZihzLCB0LmNsYXNzTm9kZSk7CiAgICBpZiAoYXNTdXBlcnR5cGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdHlwZXMuYXJlU3VidHlwZXNPZktlcm5lbCgKICAgICAgICAgIGFzU3VwZXJ0eXBlLnR5cGVBcmd1bWVudHMsIHQudHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVHlwZVBhcmFtZXRlclJlbGF0ZWQoVHlwZVBhcmFtZXRlclR5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LAogICAgICBJbnRlcmZhY2VUeXBlIHQsIE51bGxhYmlsaXR5IHROdWxsYWJpbGl0eSwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzLnBhcmFtZXRlci5ib3VuZCwgdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRnV0dXJlT3JSZWxhdGVkKAogICAgICBJbnRlcmZhY2VUeXBlIGZ1dHVyZU9yLAogICAgICBOdWxsYWJpbGl0eSBmdXR1cmVPck51bGxhYmlsaXR5LAogICAgICBJbnRlcmZhY2VUeXBlIHQsCiAgICAgIE51bGxhYmlsaXR5IHROdWxsYWJpbGl0eSwKICAgICAgVHlwZXMgdHlwZXMpIHsKICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cyA9IGZ1dHVyZU9yLnR5cGVBcmd1bWVudHM7CiAgICBpZiAoIXR5cGVzLmlzU3VidHlwZU9mS2VybmVsKGFyZ3VtZW50cy5zaW5nbGUsIHQpKSB7CiAgICAgIHJldHVybiBmYWxzZTsgLy8gUnVsZSA3LjEKICAgIH0KICAgIGlmICghdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwoCiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUodHlwZXMuaGllcmFyY2h5LmZ1dHVyZUtlcm5lbENsYXNzLCBhcmd1bWVudHMpLCB0KSkgewogICAgICByZXR1cm4gZmFsc2U7IC8vIFJ1bGUgNy4yCiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbnRlcnNlY3Rpb25SZWxhdGVkKAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSBpbnRlcnNlY3Rpb24sCiAgICAgIE51bGxhYmlsaXR5IGludGVyc2VjdGlvbk51bGxhYmlsaXR5LAogICAgICBJbnRlcmZhY2VUeXBlIHQsCiAgICAgIE51bGxhYmlsaXR5IHROdWxsYWJpbGl0eSwKICAgICAgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChpbnRlcnNlY3Rpb24ucHJvbW90ZWRCb3VuZCwgdCk7IC8vIFJ1bGUgMTIuCiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRHluYW1pY1JlbGF0ZWQoRHluYW1pY1R5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LAogICAgICBJbnRlcmZhY2VUeXBlIHQsIE51bGxhYmlsaXR5IHROdWxsYWJpbGl0eSwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNGdW5jdGlvblJlbGF0ZWQoRnVuY3Rpb25UeXBlIHMsIE51bGxhYmlsaXR5IHNOdWxsYWJpbGl0eSwKICAgICAgSW50ZXJmYWNlVHlwZSB0LCBOdWxsYWJpbGl0eSB0TnVsbGFiaWxpdHksIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdC5jbGFzc05vZGUgPT0gdHlwZXMuaGllcmFyY2h5LmZ1bmN0aW9uS2VybmVsQ2xhc3M7IC8vIFJ1bGUgMTQuCiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVHlwZWRlZlJlbGF0ZWQoVHlwZWRlZlR5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LAogICAgICBJbnRlcmZhY2VUeXBlIHQsIE51bGxhYmlsaXR5IHROdWxsYWJpbGl0eSwgVHlwZXMgdHlwZXMpIHsKICAgIC8vIFJ1bGUgNS4KICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzLnVuYWxpYXMsIHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1ZvaWRSZWxhdGVkKFZvaWRUeXBlIHMsIE51bGxhYmlsaXR5IHNOdWxsYWJpbGl0eSwgSW50ZXJmYWNlVHlwZSB0LAogICAgICBOdWxsYWJpbGl0eSB0TnVsbGFiaWxpdHksIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgpjbGFzcyBJc0Z1bmN0aW9uU3VidHlwZU9mIGV4dGVuZHMgVHlwZVJlbGF0aW9uPEZ1bmN0aW9uVHlwZT4gewogIGNvbnN0IElzRnVuY3Rpb25TdWJ0eXBlT2YoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Z1bmN0aW9uUmVsYXRlZChGdW5jdGlvblR5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LAogICAgICBGdW5jdGlvblR5cGUgdCwgTnVsbGFiaWxpdHkgdE51bGxhYmlsaXR5LCBUeXBlcyB0eXBlcykgewogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBzVHlwZVZhcmlhYmxlcyA9IHMudHlwZVBhcmFtZXRlcnM7CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHRUeXBlVmFyaWFibGVzID0gdC50eXBlUGFyYW1ldGVyczsKICAgIGlmIChzVHlwZVZhcmlhYmxlcy5sZW5ndGggIT0gdFR5cGVWYXJpYWJsZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoc1R5cGVWYXJpYWJsZXMuaXNOb3RFbXB0eSkgewogICAgICAvLyBJZiB0aGUgZnVuY3Rpb24gdHlwZXMgaGF2ZSB0eXBlIHZhcmlhYmxlcywgd2UgYWxwaGEtcmVuYW1lIHRoZSB0eXBlCiAgICAgIC8vIHZhcmlhYmxlcyBvZiBbc10gdG8gdXNlIHRob3NlIG9mIFt0XS4KICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZVZhcmlhYmxlU3Vic3RpdHV0aW9uID0gPERhcnRUeXBlPltdOwogICAgICBib29sIHNlY29uZEJvdW5kc0NoZWNrTmVlZGVkID0gZmFsc2U7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc1R5cGVWYXJpYWJsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBUeXBlUGFyYW1ldGVyIHNUeXBlVmFyaWFibGUgPSBzVHlwZVZhcmlhYmxlc1tpXTsKICAgICAgICBUeXBlUGFyYW1ldGVyIHRUeXBlVmFyaWFibGUgPSB0VHlwZVZhcmlhYmxlc1tpXTsKICAgICAgICBpZiAoIXR5cGVzLmlzU2FtZVR5cGVLZXJuZWwoc1R5cGVWYXJpYWJsZS5ib3VuZCwgdFR5cGVWYXJpYWJsZS5ib3VuZCkpIHsKICAgICAgICAgIC8vIElmIHRoZSBib3VuZHMgYXJlbid0IHRoZSBzYW1lLCB3ZSBuZWVkIHRvIHRyeSBhZ2FpbiBhZnRlcgogICAgICAgICAgLy8gY29tcHV0aW5nIHRoZSBzdWJzdGl0dXRpb24gb2YgdHlwZSB2YXJpYWJsZXMuCiAgICAgICAgICBzZWNvbmRCb3VuZHNDaGVja05lZWRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHR5cGVWYXJpYWJsZVN1YnN0aXR1dGlvbi5hZGQobmV3IFR5cGVQYXJhbWV0ZXJUeXBlKHRUeXBlVmFyaWFibGUpKTsKICAgICAgfQogICAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0KICAgICAgICAgIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoc1R5cGVWYXJpYWJsZXMsIHR5cGVWYXJpYWJsZVN1YnN0aXR1dGlvbik7CiAgICAgIGlmIChzZWNvbmRCb3VuZHNDaGVja05lZWRlZCkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc1R5cGVWYXJpYWJsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIFR5cGVQYXJhbWV0ZXIgc1R5cGVWYXJpYWJsZSA9IHNUeXBlVmFyaWFibGVzW2ldOwogICAgICAgICAgVHlwZVBhcmFtZXRlciB0VHlwZVZhcmlhYmxlID0gdFR5cGVWYXJpYWJsZXNbaV07CiAgICAgICAgICBpZiAoIXR5cGVzLmlzU2FtZVR5cGVLZXJuZWwoCiAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHNUeXBlVmFyaWFibGUuYm91bmQpLAogICAgICAgICAgICAgIHRUeXBlVmFyaWFibGUuYm91bmQpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcyA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShzLndpdGhvdXRUeXBlUGFyYW1ldGVycyk7CiAgICB9CiAgICBpZiAoIXR5cGVzLmlzU3VidHlwZU9mS2VybmVsKHMucmV0dXJuVHlwZSwgdC5yZXR1cm5UeXBlKSkgcmV0dXJuIGZhbHNlOwogICAgTGlzdDxEYXJ0VHlwZT4gc1Bvc2l0aW9uYWwgPSBzLnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgTGlzdDxEYXJ0VHlwZT4gdFBvc2l0aW9uYWwgPSB0LnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgaWYgKHMucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA+IHQucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgICAvLyBSdWxlIDE1LCBuMSA8PSBuMi4KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHNQb3NpdGlvbmFsLmxlbmd0aCA8IHRQb3NpdGlvbmFsLmxlbmd0aCkgewogICAgICAvLyBSdWxlIDE1LCBuMSArIGsxID49IG4yICsgazIuCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdFBvc2l0aW9uYWwubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCF0eXBlcy5pc1N1YnR5cGVPZktlcm5lbCh0UG9zaXRpb25hbFtpXSwgc1Bvc2l0aW9uYWxbaV0pKSB7CiAgICAgICAgLy8gUnVsZSAxNSwgVGogPDogU2ouCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICBMaXN0PE5hbWVkVHlwZT4gc05hbWVkID0gcy5uYW1lZFBhcmFtZXRlcnM7CiAgICBMaXN0PE5hbWVkVHlwZT4gdE5hbWVkID0gdC5uYW1lZFBhcmFtZXRlcnM7CiAgICBpZiAoc05hbWVkLmlzTm90RW1wdHkgfHwgdE5hbWVkLmlzTm90RW1wdHkpIHsKICAgICAgLy8gUnVsZSAxNiwgdGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgbXVzdCBiZSB0aGUgc2FtZS4KICAgICAgaWYgKHNQb3NpdGlvbmFsLmxlbmd0aCAhPSB0UG9zaXRpb25hbC5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKHMucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCAhPSB0LnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIFJ1bGUgMTYsIHRoZSBwYXJhbWV0ZXIgbmFtZXMgb2YgW3RdIG11c3QgYmUgYSBzdWJzZXQgb2YgdGhvc2Ugb2YKICAgICAgLy8gW3NdLiBBbHNvLCBmb3IgdGhlIGludGVyc2VjdGlvbiwgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBvZiBbdF0gbXVzdAogICAgICAvLyBiZSBhIHN1YnR5cGUgb2YgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBvZiBbc10uCiAgICAgIGludCBzQ291bnQgPSAwOwogICAgICBmb3IgKGludCB0Q291bnQgPSAwOyB0Q291bnQgPCB0TmFtZWQubGVuZ3RoOyB0Q291bnQrKykgewogICAgICAgIFN0cmluZyBuYW1lID0gdE5hbWVkW3RDb3VudF0ubmFtZTsKICAgICAgICBmb3IgKDsgc0NvdW50IDwgc05hbWVkLmxlbmd0aDsgc0NvdW50KyspIHsKICAgICAgICAgIGlmIChzTmFtZWRbc0NvdW50XS5uYW1lID09IG5hbWUpIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoc0NvdW50ID09IHNOYW1lZC5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoIXR5cGVzLmlzU3VidHlwZU9mS2VybmVsKAogICAgICAgICAgICB0TmFtZWRbdENvdW50XS50eXBlLCBzTmFtZWRbc0NvdW50XS50eXBlKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJmYWNlUmVsYXRlZChJbnRlcmZhY2VUeXBlIHMsIE51bGxhYmlsaXR5IHNOdWxsYWJpbGl0eSwKICAgICAgRnVuY3Rpb25UeXBlIHQsIE51bGxhYmlsaXR5IHROdWxsYWJpbGl0eSwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBzLmNsYXNzTm9kZSA9PSB0eXBlcy5oaWVyYXJjaHkubnVsbEtlcm5lbENsYXNzOyAvLyBSdWxlIDQuCiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRHluYW1pY1JlbGF0ZWQoRHluYW1pY1R5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LCBGdW5jdGlvblR5cGUgdCwKICAgICAgTnVsbGFiaWxpdHkgdE51bGxhYmlsaXR5LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Z1dHVyZU9yUmVsYXRlZCgKICAgICAgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwKICAgICAgTnVsbGFiaWxpdHkgZnV0dXJlT3JOdWxsYWJpbGl0eSwKICAgICAgRnVuY3Rpb25UeXBlIHQsCiAgICAgIE51bGxhYmlsaXR5IHROdWxsYWJpbGl0eSwKICAgICAgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbnRlcnNlY3Rpb25SZWxhdGVkKAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSBpbnRlcnNlY3Rpb24sCiAgICAgIE51bGxhYmlsaXR5IGludGVyc2VjdGlvbk51bGxhYmlsaXR5LAogICAgICBGdW5jdGlvblR5cGUgdCwKICAgICAgTnVsbGFiaWxpdHkgdE51bGxhYmlsaXR5LAogICAgICBUeXBlcyB0eXBlcykgewogICAgLy8gUnVsZSAxMi4KICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChpbnRlcnNlY3Rpb24ucHJvbW90ZWRCb3VuZCwgdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVHlwZVBhcmFtZXRlclJlbGF0ZWQoVHlwZVBhcmFtZXRlclR5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LAogICAgICBGdW5jdGlvblR5cGUgdCwgTnVsbGFiaWxpdHkgdE51bGxhYmlsaXR5LCBUeXBlcyB0eXBlcykgewogICAgLy8gUnVsZSAxMy4KICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzLnBhcmFtZXRlci5ib3VuZCwgdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVHlwZWRlZlJlbGF0ZWQoVHlwZWRlZlR5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LCBGdW5jdGlvblR5cGUgdCwKICAgICAgTnVsbGFiaWxpdHkgdE51bGxhYmlsaXR5LCBUeXBlcyB0eXBlcykgewogICAgLy8gUnVsZSA1LgogICAgcmV0dXJuIHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKHMudW5hbGlhcywgdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVm9pZFJlbGF0ZWQoVm9pZFR5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LCBGdW5jdGlvblR5cGUgdCwKICAgICAgTnVsbGFiaWxpdHkgdE51bGxhYmlsaXR5LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKY2xhc3MgSXNUeXBlUGFyYW1ldGVyU3VidHlwZU9mIGV4dGVuZHMgVHlwZVJlbGF0aW9uPFR5cGVQYXJhbWV0ZXJUeXBlPiB7CiAgY29uc3QgSXNUeXBlUGFyYW1ldGVyU3VidHlwZU9mKCk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNUeXBlUGFyYW1ldGVyUmVsYXRlZChUeXBlUGFyYW1ldGVyVHlwZSBzLCBOdWxsYWJpbGl0eSBzTnVsbGFiaWxpdHksCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIHQsIE51bGxhYmlsaXR5IHROdWxsYWJpbGl0eSwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBzLnBhcmFtZXRlciA9PSB0LnBhcmFtZXRlciB8fAogICAgICAgIC8vIFJ1bGUgMTMuCiAgICAgICAgdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocy5ib3VuZCwgdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJzZWN0aW9uUmVsYXRlZCgKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgaW50ZXJzZWN0aW9uLAogICAgICBOdWxsYWJpbGl0eSBpbnRlcnNlY3Rpb25OdWxsYWJpbGl0eSwKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgdCwKICAgICAgTnVsbGFiaWxpdHkgdE51bGxhYmlsaXR5LAogICAgICBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIGludGVyc2VjdGlvbi5wYXJhbWV0ZXIgPT0gdC5wYXJhbWV0ZXI7IC8vIFJ1bGUgOC4KICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbnRlcmZhY2VSZWxhdGVkKEludGVyZmFjZVR5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSB0LCBOdWxsYWJpbGl0eSB0TnVsbGFiaWxpdHksIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gcy5jbGFzc05vZGUgPT0gdHlwZXMuaGllcmFyY2h5Lm51bGxLZXJuZWxDbGFzczsgLy8gUnVsZSA0LgogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0R5bmFtaWNSZWxhdGVkKER5bmFtaWNUeXBlIHMsIE51bGxhYmlsaXR5IHNOdWxsYWJpbGl0eSwKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgdCwgTnVsbGFiaWxpdHkgdE51bGxhYmlsaXR5LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Z1bmN0aW9uUmVsYXRlZChGdW5jdGlvblR5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSB0LCBOdWxsYWJpbGl0eSB0TnVsbGFiaWxpdHksIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRnV0dXJlT3JSZWxhdGVkKAogICAgICBJbnRlcmZhY2VUeXBlIGZ1dHVyZU9yLAogICAgICBOdWxsYWJpbGl0eSBmdXR1cmVPck51bGxhYmlsaXR5LAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSB0LAogICAgICBOdWxsYWJpbGl0eSB0TnVsbGFiaWxpdHksCiAgICAgIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVHlwZWRlZlJlbGF0ZWQoVHlwZWRlZlR5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSB0LCBOdWxsYWJpbGl0eSB0TnVsbGFiaWxpdHksIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocy51bmFsaWFzLCB0KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNWb2lkUmVsYXRlZChWb2lkVHlwZSBzLCBOdWxsYWJpbGl0eSBzTnVsbGFiaWxpdHksIFR5cGVQYXJhbWV0ZXJUeXBlIHQsCiAgICAgIE51bGxhYmlsaXR5IHROdWxsYWJpbGl0eSwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KCmNsYXNzIElzVHlwZWRlZlN1YnR5cGVPZiBleHRlbmRzIFR5cGVSZWxhdGlvbjxUeXBlZGVmVHlwZT4gewogIGNvbnN0IElzVHlwZWRlZlN1YnR5cGVPZigpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJmYWNlUmVsYXRlZChJbnRlcmZhY2VUeXBlIHMsIE51bGxhYmlsaXR5IHNOdWxsYWJpbGl0eSwKICAgICAgVHlwZWRlZlR5cGUgdCwgTnVsbGFiaWxpdHkgdE51bGxhYmlsaXR5LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKHMsIHQudW5hbGlhcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRHluYW1pY1JlbGF0ZWQoRHluYW1pY1R5cGUgcywgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LCBUeXBlZGVmVHlwZSB0LAogICAgICBOdWxsYWJpbGl0eSB0TnVsbGFiaWxpdHksIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocywgdC51bmFsaWFzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNGdW5jdGlvblJlbGF0ZWQoRnVuY3Rpb25UeXBlIHMsIE51bGxhYmlsaXR5IHNOdWxsYWJpbGl0eSwKICAgICAgVHlwZWRlZlR5cGUgdCwgTnVsbGFiaWxpdHkgdE51bGxhYmlsaXR5LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKHMsIHQudW5hbGlhcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRnV0dXJlT3JSZWxhdGVkKAogICAgICBJbnRlcmZhY2VUeXBlIGZ1dHVyZU9yLAogICAgICBOdWxsYWJpbGl0eSBmdXR1cmVPck51bGxhYmlsaXR5LAogICAgICBUeXBlZGVmVHlwZSB0LAogICAgICBOdWxsYWJpbGl0eSB0TnVsbGFiaWxpdHksCiAgICAgIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwoZnV0dXJlT3IsIHQudW5hbGlhcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJzZWN0aW9uUmVsYXRlZCgKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgaW50ZXJzZWN0aW9uLAogICAgICBOdWxsYWJpbGl0eSBpbnRlcnNlY3Rpb25OdWxsYWJpbGl0eSwKICAgICAgVHlwZWRlZlR5cGUgdCwKICAgICAgTnVsbGFiaWxpdHkgdE51bGxhYmlsaXR5LAogICAgICBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKGludGVyc2VjdGlvbiwgdC51bmFsaWFzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNUeXBlUGFyYW1ldGVyUmVsYXRlZChUeXBlUGFyYW1ldGVyVHlwZSBzLCBOdWxsYWJpbGl0eSBzTnVsbGFiaWxpdHksCiAgICAgIFR5cGVkZWZUeXBlIHQsIE51bGxhYmlsaXR5IHROdWxsYWJpbGl0eSwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzLCB0LnVuYWxpYXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1R5cGVkZWZSZWxhdGVkKFR5cGVkZWZUeXBlIHMsIE51bGxhYmlsaXR5IHNOdWxsYWJpbGl0eSwgVHlwZWRlZlR5cGUgdCwKICAgICAgTnVsbGFiaWxpdHkgdE51bGxhYmlsaXR5LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKHMudW5hbGlhcywgdC51bmFsaWFzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNWb2lkUmVsYXRlZChWb2lkVHlwZSBzLCBOdWxsYWJpbGl0eSBzTnVsbGFiaWxpdHksIFR5cGVkZWZUeXBlIHQsCiAgICAgIE51bGxhYmlsaXR5IHROdWxsYWJpbGl0eSwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzLCB0LnVuYWxpYXMpOwogIH0KfQoKY2xhc3MgSXNGdXR1cmVPclN1YnR5cGVPZiBleHRlbmRzIFR5cGVSZWxhdGlvbjxJbnRlcmZhY2VUeXBlPiB7CiAgY29uc3QgSXNGdXR1cmVPclN1YnR5cGVPZigpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJmYWNlUmVsYXRlZChJbnRlcmZhY2VUeXBlIHMsIE51bGxhYmlsaXR5IHNOdWxsYWJpbGl0eSwKICAgICAgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgTnVsbGFiaWxpdHkgZnV0dXJlT3JOdWxsYWJpbGl0eSwgVHlwZXMgdHlwZXMpIHsKICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cyA9IGZ1dHVyZU9yLnR5cGVBcmd1bWVudHM7CiAgICBpZiAodHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocywgYXJndW1lbnRzLnNpbmdsZSkpIHsKICAgICAgcmV0dXJuIHRydWU7IC8vIFJ1bGUgMTEuCiAgICB9CiAgICAvLyBSdWxlIDEwLgogICAgcmV0dXJuIHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKAogICAgICAgIHMsIG5ldyBJbnRlcmZhY2VUeXBlKHR5cGVzLmhpZXJhcmNoeS5mdXR1cmVLZXJuZWxDbGFzcywgYXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRnV0dXJlT3JSZWxhdGVkKAogICAgICBJbnRlcmZhY2VUeXBlIHNGdXR1cmVPciwKICAgICAgTnVsbGFiaWxpdHkgc0Z1dHVyZU9yTnVsbGFiaWxpdHksCiAgICAgIEludGVyZmFjZVR5cGUgdEZ1dHVyZU9yLAogICAgICBOdWxsYWJpbGl0eSB0RnV0dXJlT3JOdWxsYWJpbGl0eSwKICAgICAgVHlwZXMgdHlwZXMpIHsKICAgIC8vIFRoaXMgZm9sbG93cyBmcm9tIGNvbWJpbmluZyBydWxlcyA3LCAxMCwgYW5kIDExLgogICAgcmV0dXJuIHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKAogICAgICAgIHNGdXR1cmVPci50eXBlQXJndW1lbnRzLnNpbmdsZSwgdEZ1dHVyZU9yLnR5cGVBcmd1bWVudHMuc2luZ2xlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNEeW5hbWljUmVsYXRlZChEeW5hbWljVHlwZSBzLCBOdWxsYWJpbGl0eSBzTnVsbGFiaWxpdHksCiAgICAgIEludGVyZmFjZVR5cGUgZnV0dXJlT3IsIE51bGxhYmlsaXR5IGZ1dHVyZU9yTnVsbGFiaWxpdHksIFR5cGVzIHR5cGVzKSB7CiAgICAvLyBSdWxlIDExLgogICAgcmV0dXJuIHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKHMsIGZ1dHVyZU9yLnR5cGVBcmd1bWVudHMuc2luZ2xlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNWb2lkUmVsYXRlZChWb2lkVHlwZSBzLCBOdWxsYWJpbGl0eSBzTnVsbGFiaWxpdHksCiAgICAgIEludGVyZmFjZVR5cGUgZnV0dXJlT3IsIE51bGxhYmlsaXR5IGZ1dHVyZU9yTnVsbGFiaWxpdHksIFR5cGVzIHR5cGVzKSB7CiAgICAvLyBSdWxlIDExLgogICAgcmV0dXJuIHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKHMsIGZ1dHVyZU9yLnR5cGVBcmd1bWVudHMuc2luZ2xlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNUeXBlUGFyYW1ldGVyUmVsYXRlZChUeXBlUGFyYW1ldGVyVHlwZSBzLCBOdWxsYWJpbGl0eSBzTnVsbGFiaWxpdHksCiAgICAgIEludGVyZmFjZVR5cGUgZnV0dXJlT3IsIE51bGxhYmlsaXR5IGZ1dHVyZU9yTnVsbGFiaWxpdHksIFR5cGVzIHR5cGVzKSB7CiAgICBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMgPSBmdXR1cmVPci50eXBlQXJndW1lbnRzOwogICAgaWYgKHR5cGVzLmlzU3VidHlwZU9mS2VybmVsKHMsIGFyZ3VtZW50cy5zaW5nbGUpKSB7CiAgICAgIC8vIFJ1bGUgMTEuCiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGlmICh0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzLnBhcmFtZXRlci5ib3VuZCwgZnV0dXJlT3IpKSB7CiAgICAgIC8vIFJ1bGUgMTMuCiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIFJ1bGUgMTAuCiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwoCiAgICAgICAgcywgbmV3IEludGVyZmFjZVR5cGUodHlwZXMuaGllcmFyY2h5LmZ1dHVyZUtlcm5lbENsYXNzLCBhcmd1bWVudHMpKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNGdW5jdGlvblJlbGF0ZWQoRnVuY3Rpb25UeXBlIHMsIE51bGxhYmlsaXR5IHNOdWxsYWJpbGl0eSwKICAgICAgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgTnVsbGFiaWxpdHkgZnV0dXJlT3JOdWxsYWJpbGl0eSwgVHlwZXMgdHlwZXMpIHsKICAgIC8vIFJ1bGUgMTEuCiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocywgZnV0dXJlT3IudHlwZUFyZ3VtZW50cy5zaW5nbGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludGVyc2VjdGlvblJlbGF0ZWQoCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIGludGVyc2VjdGlvbiwKICAgICAgTnVsbGFiaWxpdHkgaW50ZXJzZWN0aW9uTnVsbGFiaWxpdHksCiAgICAgIEludGVyZmFjZVR5cGUgZnV0dXJlT3IsCiAgICAgIE51bGxhYmlsaXR5IGZ1dHVyZU9yTnVsbGFiaWxpdHksCiAgICAgIFR5cGVzIHR5cGVzKSB7CiAgICBpZiAoaXNUeXBlUGFyYW1ldGVyUmVsYXRlZChpbnRlcnNlY3Rpb24sIGludGVyc2VjdGlvbk51bGxhYmlsaXR5LCBmdXR1cmVPciwKICAgICAgICBmdXR1cmVPck51bGxhYmlsaXR5LCB0eXBlcykpIHsKICAgICAgLy8gUnVsZSA4LgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8vIFJ1bGUgMTIuCiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwoaW50ZXJzZWN0aW9uLnByb21vdGVkQm91bmQsIGZ1dHVyZU9yKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNUeXBlZGVmUmVsYXRlZChUeXBlZGVmVHlwZSBzLCBOdWxsYWJpbGl0eSBzTnVsbGFiaWxpdHksCiAgICAgIEludGVyZmFjZVR5cGUgZnV0dXJlT3IsIE51bGxhYmlsaXR5IGZ1dHVyZU9yTnVsbGFiaWxpdHksIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwocy51bmFsaWFzLCBmdXR1cmVPcik7CiAgfQp9CgpjbGFzcyBJc0ludGVyc2VjdGlvblN1YnR5cGVPZiBleHRlbmRzIFR5cGVSZWxhdGlvbjxUeXBlUGFyYW1ldGVyVHlwZT4gewogIGNvbnN0IElzSW50ZXJzZWN0aW9uU3VidHlwZU9mKCk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNJbnRlcnNlY3Rpb25SZWxhdGVkKAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSBzSW50ZXJzZWN0aW9uLAogICAgICBOdWxsYWJpbGl0eSBzSW50ZXJzZWN0aW9uTnVsbGFiaWxpdHksCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIHRJbnRlcnNlY3Rpb24sCiAgICAgIE51bGxhYmlsaXR5IHRJbnRlcnNlY3Rpb25OdWxsYWJpbGl0eSwKICAgICAgVHlwZXMgdHlwZXMpIHsKICAgIC8vIFJ1bGUgOS4KICAgIHJldHVybiBjb25zdCBJc1R5cGVQYXJhbWV0ZXJTdWJ0eXBlT2YoKS5pc0ludGVyc2VjdGlvblJlbGF0ZWQoCiAgICAgICAgICAgIHNJbnRlcnNlY3Rpb24sCiAgICAgICAgICAgIHNJbnRlcnNlY3Rpb25OdWxsYWJpbGl0eSwKICAgICAgICAgICAgdEludGVyc2VjdGlvbiwKICAgICAgICAgICAgdEludGVyc2VjdGlvbk51bGxhYmlsaXR5LAogICAgICAgICAgICB0eXBlcykgJiYKICAgICAgICB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzSW50ZXJzZWN0aW9uLCB0SW50ZXJzZWN0aW9uLnByb21vdGVkQm91bmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSBzLAogICAgICBOdWxsYWJpbGl0eSBzTnVsbGFiaWxpdHksCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIGludGVyc2VjdGlvbiwKICAgICAgTnVsbGFiaWxpdHkgaW50ZXJzZWN0aW9uTnVsbGFiaWxpdHksCiAgICAgIFR5cGVzIHR5cGVzKSB7CiAgICAvLyBSdWxlIDkuCiAgICByZXR1cm4gY29uc3QgSXNUeXBlUGFyYW1ldGVyU3VidHlwZU9mKCkuaXNUeXBlUGFyYW1ldGVyUmVsYXRlZCgKICAgICAgICAgICAgcywgc051bGxhYmlsaXR5LCBpbnRlcnNlY3Rpb24sIGludGVyc2VjdGlvbk51bGxhYmlsaXR5LCB0eXBlcykgJiYKICAgICAgICB0eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzLCBpbnRlcnNlY3Rpb24ucHJvbW90ZWRCb3VuZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSW50ZXJmYWNlUmVsYXRlZCgKICAgICAgSW50ZXJmYWNlVHlwZSBzLAogICAgICBOdWxsYWJpbGl0eSBzTnVsbGFiaWxpdHksCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIGludGVyc2VjdGlvbiwKICAgICAgTnVsbGFiaWxpdHkgaW50ZXJzZWN0aW9uTnVsbGFiaWxpdHksCiAgICAgIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gcy5jbGFzc05vZGUgPT0gdHlwZXMuaGllcmFyY2h5Lm51bGxLZXJuZWxDbGFzczsgLy8gUnVsZSA0LgogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0R5bmFtaWNSZWxhdGVkKAogICAgICBEeW5hbWljVHlwZSBzLAogICAgICBOdWxsYWJpbGl0eSBzTnVsbGFiaWxpdHksCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIGludGVyc2VjdGlvbiwKICAgICAgTnVsbGFiaWxpdHkgaW50ZXJzZWN0aW9uTnVsbGFiaWxpdHksCiAgICAgIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRnVuY3Rpb25SZWxhdGVkKAogICAgICBGdW5jdGlvblR5cGUgcywKICAgICAgTnVsbGFiaWxpdHkgc051bGxhYmlsaXR5LAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSBpbnRlcnNlY3Rpb24sCiAgICAgIE51bGxhYmlsaXR5IGludGVyc2VjdGlvbk51bGxhYmlsaXR5LAogICAgICBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Z1dHVyZU9yUmVsYXRlZCgKICAgICAgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwKICAgICAgTnVsbGFiaWxpdHkgZnV0dXJlT3JOdWxsYWJp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b2tlbjsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyBNZXNzYWdlOwoKaW1wb3J0ICdsaXN0ZW5lci5kYXJ0JyBzaG93IExpc3RlbmVyOwoKLy8vIEEgbGlzdGVuZXIgd2hpY2ggZm9yd2FyZHMgZXJyb3IgcmVwb3J0cyB0byBhbm90aGVyIGxpc3RlbmVyIGJ1dCBpZ25vcmVzCi8vLyBhbGwgb3RoZXIgZXZlbnRzLgpjbGFzcyBFcnJvckRlbGVnYXRpb25MaXN0ZW5lciBleHRlbmRzIExpc3RlbmVyIHsKICBMaXN0ZW5lciBkZWxlZ2F0ZTsKCiAgRXJyb3JEZWxlZ2F0aW9uTGlzdGVuZXIodGhpcy5kZWxlZ2F0ZSk7CgogIHZvaWQgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBUb2tlbiBzdGFydFRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgcmV0dXJuIGRlbGVnYXRlLmhhbmRsZVJlY292ZXJhYmxlRXJyb3IobWVzc2FnZSwgc3RhcnRUb2tlbiwgZW5kVG9rZW4pOwogIH0KfQoYAE5OPAEuASsBJgFMFjEVASoBHztLBAIBQXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvZXJyb3JfZGVsZWdhdGlvbl9saXN0ZW5lci5kYXJ0P3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9pZ25vcmVkX3BhcnNlcl9lcnJvcnMuZGFydIKKLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuaWdub3JlZF9wYXJzZXJfZXJyb3JzOwoKaW1wb3J0ICdmYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IENvZGUsIGNvZGVOb25QYXJ0T2ZEaXJlY3RpdmVJblBhcnQ7CgppbXBvcnQgJ3BhcnNlci5kYXJ0JyBzaG93IG9wdGlvbmFsOwoKaW1wb3J0ICdzY2FubmVyLmRhcnQnIHNob3cgVG9rZW47Cgpib29sIGlzSWdub3JlZFBhcnNlckVycm9yKENvZGU8T2JqZWN0PiBjb2RlLCBUb2tlbiB0b2tlbikgewogIGlmIChjb2RlID09IGNvZGVOb25QYXJ0T2ZEaXJlY3RpdmVJblBhcnQpIHsKICAgIC8vIElnbm9yZWQuIFRoaXMgZXJyb3IgaXMgaGFuZGxlZCBpbiB0aGUgb3V0bGluZSBwaGFzZSAocGFydCByZXNvbHV0aW9uKS4KICAgIHJldHVybiBvcHRpb25hbCgicGFydCIsIHRva2VuKTsKICB9IGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoWAE5OPAElAUMBJAEiATwuTiQLEgQCATZwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaWdub3JlZF9wYXJzZXJfZXJyb3JzLmRhcnRCc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci9kaXJlY3RpdmVfY29udGV4dC5kYXJ0jMQvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JzsKaW1wb3J0ICdwYXJzZXIuZGFydCc7CmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JzsKCmNsYXNzIERpcmVjdGl2ZUNvbnRleHQgewogIERpcmVjdGl2ZVN0YXRlIHN0YXRlID0gRGlyZWN0aXZlU3RhdGUuVW5rbm93bjsKCiAgdm9pZCBjaGVja1NjcmlwdFRhZyhQYXJzZXIgcGFyc2VyLCBUb2tlbiB0b2tlbikgewogICAgaWYgKHN0YXRlID09IERpcmVjdGl2ZVN0YXRlLlVua25vd24pIHsKICAgICAgc3RhdGUgPSBEaXJlY3RpdmVTdGF0ZS5TY3JpcHQ7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIFRoZSBzY2FubmVyIG9ubHkgcHJvZHVjZXMgdGhlIFNDUklQVF9UQUcKICAgIC8vIHdoZW4gaXQgaXMgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBmaWxlLgogICAgdGhyb3cgIkludGVybmFsIGVycm9yOiBVbmV4cGVjdGVkIHNjcmlwdCB0YWcuIjsKICB9CgogIHZvaWQgY2hlY2tEZWNsYXJhdGlvbigpIHsKICAgIGlmIChzdGF0ZSAhPSBEaXJlY3RpdmVTdGF0ZS5QYXJ0T2YpIHsKICAgICAgc3RhdGUgPSBEaXJlY3RpdmVTdGF0ZS5EZWNsYXJhdGlvbnM7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrRXhwb3J0KFBhcnNlciBwYXJzZXIsIFRva2VuIHRva2VuKSB7CiAgICBpZiAoc3RhdGUuaW5kZXggPD0gRGlyZWN0aXZlU3RhdGUuSW1wb3J0QW5kRXhwb3J0LmluZGV4KSB7CiAgICAgIHN0YXRlID0gRGlyZWN0aXZlU3RhdGUuSW1wb3J0QW5kRXhwb3J0OwogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBSZWNvdmVyeQogICAgaWYgKHN0YXRlID09IERpcmVjdGl2ZVN0YXRlLlBhcnQpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIG1lc3NhZ2VFeHBvcnRBZnRlclBhcnQpOwogICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBEaXJlY3RpdmVTdGF0ZS5QYXJ0T2YpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIG1lc3NhZ2VOb25QYXJ0T2ZEaXJlY3RpdmVJblBhcnQpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIG1lc3NhZ2VEaXJlY3RpdmVBZnRlckRlY2xhcmF0aW9uKTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tJbXBvcnQoUGFyc2VyIHBhcnNlciwgVG9rZW4gdG9rZW4pIHsKICAgIGlmIChzdGF0ZS5pbmRleCA8PSBEaXJlY3RpdmVTdGF0ZS5JbXBvcnRBbmRFeHBvcnQuaW5kZXgpIHsKICAgICAgc3RhdGUgPSBEaXJlY3RpdmVTdGF0ZS5JbXBvcnRBbmRFeHBvcnQ7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoc3RhdGUgPT0gRGlyZWN0aXZlU3RhdGUuUGFydCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgbWVzc2FnZUltcG9ydEFmdGVyUGFydCk7CiAgICB9IGVsc2UgaWYgKHN0YXRlID09IERpcmVjdGl2ZVN0YXRlLlBhcnRPZikgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgbWVzc2FnZU5vblBhcnRPZkRpcmVjdGl2ZUluUGFydCk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgbWVzc2FnZURpcmVjdGl2ZUFmdGVyRGVjbGFyYXRpb24pOwogICAgfQogIH0KCiAgdm9pZCBjaGVja0xpYnJhcnkoUGFyc2VyIHBhcnNlciwgVG9rZW4gdG9rZW4pIHsKICAgIGlmIChzdGF0ZS5pbmRleCA8IERpcmVjdGl2ZVN0YXRlLkxpYnJhcnkuaW5kZXgpIHsKICAgICAgc3RhdGUgPSBEaXJlY3RpdmVTdGF0ZS5MaWJyYXJ5OwogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBSZWNvdmVyeQogICAgaWYgKHN0YXRlID09IERpcmVjdGl2ZVN0YXRlLkxpYnJhcnkpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIG1lc3NhZ2VNdWx0aXBsZUxpYnJhcnlEaXJlY3RpdmVzKTsKICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gRGlyZWN0aXZlU3RhdGUuUGFydE9mKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBtZXNzYWdlTm9uUGFydE9mRGlyZWN0aXZlSW5QYXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBtZXNzYWdlTGlicmFyeURpcmVjdGl2ZU5vdEZpcnN0KTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tQYXJ0KFBhcnNlciBwYXJzZXIsIFRva2VuIHRva2VuKSB7CiAgICBpZiAoc3RhdGUuaW5kZXggPD0gRGlyZWN0aXZlU3RhdGUuUGFydC5pbmRleCkgewogICAgICBzdGF0ZSA9IERpcmVjdGl2ZVN0YXRlLlBhcnQ7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoc3RhdGUgPT0gRGlyZWN0aXZlU3RhdGUuUGFydE9mKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBtZXNzYWdlTm9uUGFydE9mRGlyZWN0aXZlSW5QYXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBtZXNzYWdlRGlyZWN0aXZlQWZ0ZXJEZWNsYXJhdGlvbik7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrUGFydE9mKFBhcnNlciBwYXJzZXIsIFRva2VuIHRva2VuKSB7CiAgICBpZiAoc3RhdGUgPT0gRGlyZWN0aXZlU3RhdGUuVW5rbm93bikgewogICAgICBzdGF0ZSA9IERpcmVjdGl2ZVN0YXRlLlBhcnRPZjsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChzdGF0ZSA9PSBEaXJlY3RpdmVTdGF0ZS5QYXJ0T2YpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIG1lc3NhZ2VQYXJ0T2ZUd2ljZSk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgbWVzc2FnZU5vblBhcnRPZkRpcmVjdGl2ZUluUGFydCk7CiAgICB9CiAgfQp9CgplbnVtIERpcmVjdGl2ZVN0YXRlIHsKICBVbmtub3duLAogIFNjcmlwdCwKICBMaWJyYXJ5LAogIEltcG9ydEFuZEV4cG9ydCwKICBQYXJ0LAogIFBhcnRPZiwKICBEZWNsYXJhdGlvbnMsCn0KbgBOTjwBHhYjARkxATQrJQ4GMC80BAEcKisGBAExPy4OBhAoRDFNDU4GBAExPy4OBhAoRDFNDU4GBAEyNiYOBhArTjFNDU0GBAEvNCMOBhAqTQ1OBgQBMSslDgYQKkANTQYEAgEWCwoLEwgKEAIBOXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvZGlyZWN0aXZlX2NvbnRleHQuZGFydERzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL2ZvcndhcmRpbmdfbGlzdGVuZXIuZGFydMAAkJsvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9tZXNzYWdlcy5kYXJ0JzsKaW1wb3J0ICcuLi9wYXJzZXIuZGFydCc7CmltcG9ydCAnLi4vc2Nhbm5lci5kYXJ0JzsKCmNsYXNzIEZvcndhcmRpbmdMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyIHsKICBMaXN0ZW5lciBsaXN0ZW5lcjsKICBib29sIGZvcndhcmRFcnJvcnMgPSB0cnVlOwoKICBGb3J3YXJkaW5nTGlzdGVuZXIoW3RoaXMubGlzdGVuZXJdKTsKCiAgQG92ZXJyaWRlCiAgc2V0IHN1cHByZXNzUGFyc2VFcnJvcnMoYm9vbCB2YWx1ZSkgewogICAgbGlzdGVuZXI/LnN1cHByZXNzUGFyc2VFcnJvcnMgPSB2YWx1ZTsKICB9CgogIEBvdmVycmlkZQogIFVyaSBnZXQgdXJpID0+IGxpc3RlbmVyPy51cmk7CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Bcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkFyZ3VtZW50cyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQXNzZXJ0KFRva2VuIGFzc2VydEtleXdvcmQsIEFzc2VydCBraW5kKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Bc3NlcnQoYXNzZXJ0S2V5d29yZCwga2luZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQXdhaXRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Bd2FpdEV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkJpbmFyeUV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkJpbmFyeUV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkJsb2NrKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5CbG9jayh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQmxvY2tGdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkJsb2NrRnVuY3Rpb25Cb2R5KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DYXNjYWRlKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5DYXNjYWRlKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DYXNlRXhwcmVzc2lvbihUb2tlbiBjYXNlS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmJlZ2luQ2FzZUV4cHJlc3Npb24oY2FzZUtleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNhdGNoQ2xhdXNlKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5DYXRjaENsYXVzZSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2xhc3NEZWNsYXJhdGlvbihUb2tlbiBiZWdpbiwgVG9rZW4gYWJzdHJhY3RUb2tlbiwgVG9rZW4gbmFtZSkgewogICAgbGlzdGVuZXI/LmJlZ2luQ2xhc3NEZWNsYXJhdGlvbihiZWdpbiwgYWJzdHJhY3RUb2tlbiwgbmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2xhc3NPck1peGluQm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luQ2xhc3NPck1peGluQm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luQ2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ29tYmluYXRvcnMoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkNvbWJpbmF0b3JzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Db21waWxhdGlvblVuaXQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkNvbXBpbGF0aW9uVW5pdCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ29uZGl0aW9uYWxFeHByZXNzaW9uKFRva2VuIHF1ZXN0aW9uKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Db25kaXRpb25hbEV4cHJlc3Npb24ocXVlc3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNvbmRpdGlvbmFsVXJpKFRva2VuIGlmS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmJlZ2luQ29uZGl0aW9uYWxVcmkoaWZLZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Db25kaXRpb25hbFVyaXMoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkNvbmRpdGlvbmFsVXJpcyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ29uc3RFeHByZXNzaW9uKFRva2VuIGNvbnN0S2V5d29yZCkgewogICAgbGlzdGVuZXI/LmJlZ2luQ29uc3RFeHByZXNzaW9uKGNvbnN0S2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ29uc3RMaXRlcmFsKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Db25zdExpdGVyYWwodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNvbnN0cnVjdG9yUmVmZXJlbmNlKFRva2VuIHN0YXJ0KSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Db25zdHJ1Y3RvclJlZmVyZW5jZShzdGFydCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRG9XaGlsZVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRG9XaGlsZVN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRG9XaGlsZVN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkRvV2hpbGVTdGF0ZW1lbnRCb2R5KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5FbHNlU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5FbHNlU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5FbnVtKFRva2VuIGVudW1LZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5FbnVtKGVudW1LZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5FeHBvcnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkV4cG9ydCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRXh0ZW5zaW9uRGVjbGFyYXRpb24oVG9rZW4gZXh0ZW5zaW9uS2V5d29yZCwgVG9rZW4gbmFtZSkgewogICAgbGlzdGVuZXI/LmJlZ2luRXh0ZW5zaW9uRGVjbGFyYXRpb24oZXh0ZW5zaW9uS2V5d29yZCwgbmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRmFjdG9yeU1ldGhvZCgKICAgICAgVG9rZW4gbGFzdENvbnN1bWVkLCBUb2tlbiBleHRlcm5hbFRva2VuLCBUb2tlbiBjb25zdFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5GYWN0b3J5TWV0aG9kKGxhc3RDb25zdW1lZCwgZXh0ZXJuYWxUb2tlbiwgY29uc3RUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRmllbGRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRmllbGRJbml0aWFsaXplcih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9yQ29udHJvbEZsb3coVG9rZW4gYXdhaXRUb2tlbiwgVG9rZW4gZm9yVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkZvckNvbnRyb2xGbG93KGF3YWl0VG9rZW4sIGZvclRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JJbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkZvckluQm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9ySW5FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Gb3JJbkV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvcm1hbFBhcmFtZXRlcihUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kLCBUb2tlbiByZXF1aXJlZFRva2VuLAogICAgICBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwgVG9rZW4gdmFyRmluYWxPckNvbnN0KSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Gb3JtYWxQYXJhbWV0ZXIoCiAgICAgICAgdG9rZW4sIGtpbmQsIHJlcXVpcmVkVG9rZW4sIGNvdmFyaWFudFRva2VuLCB2YXJGaW5hbE9yQ29uc3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvcm1hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZUV4cHJlc3Npb24oKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Gb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Gb3JtYWxQYXJhbWV0ZXJzKHRva2VuLCBraW5kKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkZvclN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9yU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRm9yU3RhdGVtZW50Qm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRnVuY3Rpb25FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5GdW5jdGlvbkV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZ1bmN0aW9uTmFtZShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRnVuY3Rpb25OYW1lKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5GdW5jdGlvblR5cGUoVG9rZW4gYmVnaW5Ub2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRnVuY3Rpb25UeXBlKGJlZ2luVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZ1bmN0aW9uVHlwZUFsaWFzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5GdW5jdGlvblR5cGVBbGlhcyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSGlkZShUb2tlbiBoaWRlS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmJlZ2luSGlkZShoaWRlS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSWZDb250cm9sRmxvdyhUb2tlbiBpZlRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5JZkNvbnRyb2xGbG93KGlmVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbklmU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5JZlN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5JbXBvcnQoVG9rZW4gaW1wb3J0S2V5d29yZCkgewogICAgbGlzdGVuZXI/LmJlZ2luSW1wb3J0KGltcG9ydEtleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkluaXRpYWxpemVkSWRlbnRpZmllcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luSW5pdGlhbGl6ZWRJZGVudGlmaWVyKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Jbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luSW5pdGlhbGl6ZXIodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkluaXRpYWxpemVycyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luSW5pdGlhbGl6ZXJzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5MYWJlbGVkU3RhdGVtZW50KFRva2VuIHRva2VuLCBpbnQgbGFiZWxDb3VudCkgewogICAgbGlzdGVuZXI/LmJlZ2luTGFiZWxlZFN0YXRlbWVudCh0b2tlbiwgbGFiZWxDb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTGlicmFyeU5hbWUoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkxpYnJhcnlOYW1lKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5MaXRlcmFsU3RyaW5nKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5MaXRlcmFsU3RyaW5nKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5MaXRlcmFsU3ltYm9sKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5MaXRlcmFsU3ltYm9sKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Mb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTWVtYmVyKCkgewogICAgbGlzdGVuZXI/LmJlZ2luTWVtYmVyKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTWV0YWRhdGEoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbk1ldGFkYXRhKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5NZXRhZGF0YVN0YXIoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbk1ldGFkYXRhU3Rhcih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTWV0aG9kKFRva2VuIGV4dGVybmFsVG9rZW4sIFRva2VuIHN0YXRpY1Rva2VuLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBUb2tlbiBnZXRPclNldCwgVG9rZW4gbmFtZSkgewogICAgbGlzdGVuZXI/LmJlZ2luTWV0aG9kKGV4dGVybmFsVG9rZW4sIHN0YXRpY1Rva2VuLCBjb3ZhcmlhbnRUb2tlbiwKICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGdldE9yU2V0LCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5NaXhpbkRlY2xhcmF0aW9uKFRva2VuIG1peGluS2V5d29yZCwgVG9rZW4gbmFtZSkgewogICAgbGlzdGVuZXI/LmJlZ2luTWl4aW5EZWNsYXJhdGlvbihtaXhpbktleXdvcmQsIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbk5hbWVkRnVuY3Rpb25FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5OYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTmFtZWRNaXhpbkFwcGxpY2F0aW9uKAogICAgICBUb2tlbiBiZWdpbiwgVG9rZW4gYWJzdHJhY3RUb2tlbiwgVG9rZW4gbmFtZSkgewogICAgbGlzdGVuZXI/LmJlZ2luTmFtZWRNaXhpbkFwcGxpY2F0aW9uKGJlZ2luLCBhYnN0cmFjdFRva2VuLCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5OZXdFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5OZXdFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5PcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbk9wdGlvbmFsRm9ybWFsUGFyYW1ldGVycyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luUGFydChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luUGFydCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luUGFydE9mKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5QYXJ0T2YodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblJlZGlyZWN0aW5nRmFjdG9yeUJvZHkodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblJldGhyb3dTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblJldGhyb3dTdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblJldHVyblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luUmV0dXJuU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5TaG93KFRva2VuIHNob3dLZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5TaG93KHNob3dLZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Td2l0Y2hCbG9jayhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luU3dpdGNoQmxvY2sodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblN3aXRjaENhc2UoaW50IGxhYmVsQ291bnQsIGludCBleHByZXNzaW9uQ291bnQsIFRva2VuIGZpcnN0VG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblN3aXRjaENhc2UobGFiZWxDb3VudCwgZXhwcmVzc2lvbkNvdW50LCBmaXJzdFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Td2l0Y2hTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblN3aXRjaFN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVGhlbkNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5UaGVuQ29udHJvbEZsb3codG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblRoZW5TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblRoZW5TdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblRvcExldmVsTWVtYmVyKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Ub3BMZXZlbE1lbWJlcih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVG9wTGV2ZWxNZXRob2QoVG9rZW4gbGFzdENvbnN1bWVkLCBUb2tlbiBleHRlcm5hbFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Ub3BMZXZlbE1ldGhvZChsYXN0Q29uc3VtZWQsIGV4dGVybmFsVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblRyeVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luVHJ5U3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5UeXBlQXJndW1lbnRzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UeXBlTGlzdChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luVHlwZUxpc3QodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblR5cGVWYXJpYWJsZShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luVHlwZVZhcmlhYmxlKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UeXBlVmFyaWFibGVzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5UeXBlVmFyaWFibGVzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5WYXJpYWJsZUluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5WYXJpYWJsZUluaXRpYWxpemVyKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5WYXJpYWJsZXNEZWNsYXJhdGlvbigKICAgICAgVG9rZW4gdG9rZW4sIFRva2VuIGxhdGVUb2tlbiwgVG9rZW4gdmFyRmluYWxPckNvbnN0KSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5WYXJpYWJsZXNEZWNsYXJhdGlvbih0b2tlbiwgbGF0ZVRva2VuLCB2YXJGaW5hbE9yQ29uc3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbldoaWxlU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5XaGlsZVN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luV2hpbGVTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5XaGlsZVN0YXRlbWVudEJvZHkodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbllpZWxkU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5ZaWVsZFN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRpc2NhcmRUeXBlUmVwbGFjZWRXaXRoQ29tbWVudFR5cGVBc3NpZ24oKSB7CiAgICBsaXN0ZW5lcj8uZGlzY2FyZFR5cGVSZXBsYWNlZFdpdGhDb21tZW50VHlwZUFzc2lnbigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZEFyZ3VtZW50cyhjb3VudCwgYmVnaW5Ub2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRBc3NlcnQoVG9rZW4gYXNzZXJ0S2V5d29yZCwgQXNzZXJ0IGtpbmQsIFRva2VuIGxlZnRQYXJlbnRoZXNpcywKICAgICAgVG9rZW4gY29tbWFUb2tlbiwgVG9rZW4gc2VtaWNvbG9uVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRBc3NlcnQoCiAgICAgICAgYXNzZXJ0S2V5d29yZCwga2luZCwgbGVmdFBhcmVudGhlc2lzLCBjb21tYVRva2VuLCBzZW1pY29sb25Ub2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEF3YWl0RXhwcmVzc2lvbihUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZEF3YWl0RXhwcmVzc2lvbihiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEludmFsaWRBd2FpdEV4cHJlc3Npb24oCiAgICAgIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuLCBNZXNzYWdlQ29kZSBlcnJvckNvZGUpIHsKICAgIGxpc3RlbmVyPy5lbmRJbnZhbGlkQXdhaXRFeHByZXNzaW9uKGJlZ2luVG9rZW4sIGVuZFRva2VuLCBlcnJvckNvZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRCaW5hcnlFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kQmluYXJ5RXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEJsb2NrKGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRCbG9jayhjb3VudCwgYmVnaW5Ub2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRCbG9ja0Z1bmN0aW9uQm9keShpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kQmxvY2tGdW5jdGlvbkJvZHkoY291bnQsIGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2FzY2FkZSgpIHsKICAgIGxpc3RlbmVyPy5lbmRDYXNjYWRlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENhc2VFeHByZXNzaW9uKFRva2VuIGNvbG9uKSB7CiAgICBsaXN0ZW5lcj8uZW5kQ2FzZUV4cHJlc3Npb24oY29sb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDYXRjaENsYXVzZShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZENhdGNoQ2xhdXNlKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2xhc3NEZWNsYXJhdGlvbihUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZENsYXNzRGVjbGFyYXRpb24oYmVnaW5Ub2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDbGFzc09yTWl4aW5Cb2R5KGludCBtZW1iZXJDb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRDbGFzc09yTWl4aW5Cb2R5KG1lbWJlckNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbWJpbmF0b3JzKGludCBjb3VudCkgewogICAgbGlzdGVuZXI/LmVuZENvbWJpbmF0b3JzKGNvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29tcGlsYXRpb25Vbml0KGludCBjb3VudCwgVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRDb21waWxhdGlvblVuaXQoY291bnQsIHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uKFRva2VuIHF1ZXN0aW9uLCBUb2tlbiBjb2xvbikgewogICAgbGlzdGVuZXI/LmVuZENvbmRpdGlvbmFsRXhwcmVzc2lvbihxdWVzdGlvbiwgY29sb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25kaXRpb25hbFVyaShUb2tlbiBpZktleXdvcmQsIFRva2VuIGxlZnRQYXJlbiwgVG9rZW4gZXF1YWxTaWduKSB7CiAgICBsaXN0ZW5lcj8uZW5kQ29uZGl0aW9uYWxVcmkoaWZLZXl3b3JkLCBsZWZ0UGFyZW4sIGVxdWFsU2lnbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbmRpdGlvbmFsVXJpcyhpbnQgY291bnQpIHsKICAgIGxpc3RlbmVyPy5lbmRDb25kaXRpb25hbFVyaXMoY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25zdEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRDb25zdEV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25zdExpdGVyYWwoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRDb25zdExpdGVyYWwodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25zdHJ1Y3RvclJlZmVyZW5jZSgKICAgICAgVG9rZW4gc3RhcnQsIFRva2VuIHBlcmlvZEJlZm9yZU5hbWUsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kQ29uc3RydWN0b3JSZWZlcmVuY2Uoc3RhcnQsIHBlcmlvZEJlZm9yZU5hbWUsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRG9XaGlsZVN0YXRlbWVudCgKICAgICAgVG9rZW4gZG9LZXl3b3JkLCBUb2tlbiB3aGlsZUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRG9XaGlsZVN0YXRlbWVudChkb0tleXdvcmQsIHdoaWxlS2V5d29yZCwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmREb1doaWxlU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZERvV2hpbGVTdGF0ZW1lbnRCb2R5KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRWxzZVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEVsc2VTdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFbnVtKFRva2VuIGVudW1LZXl3b3JkLCBUb2tlbiBsZWZ0QnJhY2UsIGludCBjb3VudCkgewogICAgbGlzdGVuZXI/LmVuZEVudW0oZW51bUtleXdvcmQsIGxlZnRCcmFjZSwgY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFeHBvcnQoVG9rZW4gZXhwb3J0S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsaXN0ZW5lcj8uZW5kRXhwb3J0KGV4cG9ydEtleXdvcmQsIHNlbWljb2xvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEV4dGVuc2lvbkRlY2xhcmF0aW9uKAogICAgICBUb2tlbiBleHRlbnNpb25LZXl3b3JkLCBUb2tlbiBvbktleXdvcmQsIFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRXh0ZW5zaW9uRGVjbGFyYXRpb24oZXh0ZW5zaW9uS2V5d29yZCwgb25LZXl3b3JkLCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZhY3RvcnlNZXRob2QoCiAgICAgIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGZhY3RvcnlLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZhY3RvcnlNZXRob2QoYmVnaW5Ub2tlbiwgZmFjdG9yeUtleXdvcmQsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRmllbGRJbml0aWFsaXplcihUb2tlbiBhc3NpZ25tZW50LCBUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZpZWxkSW5pdGlhbGl6ZXIoYXNzaWdubWVudCwgdG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGaWVsZHMoVG9rZW4gc3RhdGljVG9rZW4sIFRva2VuIGNvdmFyaWFudFRva2VuLCBUb2tlbiBsYXRlVG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZpZWxkcyhzdGF0aWNUb2tlbiwgY292YXJpYW50VG9rZW4sIGxhdGVUb2tlbiwgdmFyRmluYWxPckNvbnN0LAogICAgICAgIGNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvckNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRm9yQ29udHJvbEZsb3codG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JJbihUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZvckluKGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ySW5Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRm9ySW5Cb2R5KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ySW5Db250cm9sRmxvdyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZvckluQ29udHJvbEZsb3codG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JJbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRGb3JJbkV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXIoCiAgICAgIFRva2VuIHRoaXNLZXl3b3JkLAogICAgICBUb2tlbiBwZXJpb2RBZnRlclRoaXMsCiAgICAgIFRva2VuIG5hbWVUb2tlbiwKICAgICAgVG9rZW4gaW5pdGlhbGl6ZXJTdGFydCwKICAgICAgVG9rZW4gaW5pdGlhbGl6ZXJFbmQsCiAgICAgIEZvcm1hbFBhcmFtZXRlcktpbmQga2luZCwKICAgICAgTWVtYmVyS2luZCBtZW1iZXJLaW5kKSB7CiAgICBsaXN0ZW5lcj8uZW5kRm9ybWFsUGFyYW1ldGVyKHRoaXNLZXl3b3JkLCBwZXJpb2RBZnRlclRoaXMsIG5hbWVUb2tlbiwKICAgICAgICBpbml0aWFsaXplclN0YXJ0LCBpbml0aWFsaXplckVuZCwga2luZCwgbWVtYmVyS2luZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvcm1hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZUV4cHJlc3Npb24oKSB7CiAgICBsaXN0ZW5lcj8uZW5kRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXJzKAogICAgICBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIGxpc3RlbmVyPy5lbmRGb3JtYWxQYXJhbWV0ZXJzKGNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbiwga2luZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvclN0YXRlbWVudChUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZvclN0YXRlbWVudChlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvclN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRGb3JTdGF0ZW1lbnRCb2R5KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRnVuY3Rpb25FeHByZXNzaW9uKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRnVuY3Rpb25FeHByZXNzaW9uKGJlZ2luVG9rZW4sIHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRnVuY3Rpb25OYW1lKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRnVuY3Rpb25OYW1lKGJlZ2luVG9rZW4sIHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRnVuY3Rpb25UeXBlKFRva2VuIGZ1bmN0aW9uVG9rZW4sIFRva2VuIHF1ZXN0aW9uTWFyaykgewogICAgbGlzdGVuZXI/LmVuZEZ1bmN0aW9uVHlwZShmdW5jdGlvblRva2VuLCBxdWVzdGlvbk1hcmspOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGdW5jdGlvblR5cGVBbGlhcygKICAgICAgVG9rZW4gdHlwZWRlZktleXdvcmQsIFRva2VuIGVxdWFscywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRGdW5jdGlvblR5cGVBbGlhcyh0eXBlZGVmS2V5d29yZCwgZXF1YWxzLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gbmFtZVRva2VuLCBUb2tlbiBxdWVzdGlvbikgewogICAgbGlzdGVuZXI/LmVuZEZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIobmFtZVRva2VuLCBxdWVzdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEhpZGUoVG9rZW4gaGlkZUtleXdvcmQpIHsKICAgIGxpc3RlbmVyPy5lbmRIaWRlKGhpZGVLZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSWZDb250cm9sRmxvdyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZElmQ29udHJvbEZsb3codG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJZkVsc2VDb250cm9sRmxvdyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZElmRWxzZUNvbnRyb2xGbG93KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSWZTdGF0ZW1lbnQoVG9rZW4gaWZUb2tlbiwgVG9rZW4gZWxzZVRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kSWZTdGF0ZW1lbnQoaWZUb2tlbiwgZWxzZVRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRJbXBsaWNpdENyZWF0aW9uRXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEltcG9ydChUb2tlbiBpbXBvcnRLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxpc3RlbmVyPy5lbmRJbXBvcnQoaW1wb3J0S2V5d29yZCwgc2VtaWNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSW5pdGlhbGl6ZWRJZGVudGlmaWVyKFRva2VuIG5hbWVUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZEluaXRpYWxpemVkSWRlbnRpZmllcihuYW1lVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEluaXRpYWxpemVyKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSW5pdGlhbGl6ZXJzKGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRJbml0aWFsaXplcnMoY291bnQsIGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTGFiZWxlZFN0YXRlbWVudChpbnQgbGFiZWxDb3VudCkgewogICAgbGlzdGVuZXI/LmVuZExhYmVsZWRTdGF0ZW1lbnQobGFiZWxDb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExpYnJhcnlOYW1lKFRva2VuIGxpYnJhcnlLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxpc3RlbmVyPy5lbmRMaWJyYXJ5TmFtZShsaWJyYXJ5S2V5d29yZCwgc2VtaWNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTGl0ZXJhbFN0cmluZyhpbnQgaW50ZXJwb2xhdGlvbkNvdW50LCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZExpdGVyYWxTdHJpbmcoaW50ZXJwb2xhdGlvbkNvdW50LCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExpdGVyYWxTeW1ib2woVG9rZW4gaGFzaFRva2VuLCBpbnQgaWRlbnRpZmllckNvdW50KSB7CiAgICBsaXN0ZW5lcj8uZW5kTGl0ZXJhbFN5bWJvbChoYXNoVG9rZW4sIGlkZW50aWZpZXJDb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbihUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZExvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbihlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1lbWJlcigpIHsKICAgIGxpc3RlbmVyPy5lbmRNZW1iZXIoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWV0YWRhdGEoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gcGVyaW9kQmVmb3JlTmFtZSwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRNZXRhZGF0YShiZWdpblRva2VuLCBwZXJpb2RCZWZvcmVOYW1lLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1ldGFkYXRhU3RhcihpbnQgY291bnQpIHsKICAgIGxpc3RlbmVyPy5lbmRNZXRhZGF0YVN0YXIoY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNZXRob2QoVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGJlZ2luUGFyYW0sCiAgICAgIFRva2VuIGJlZ2luSW5pdGlhbGl6ZXJzLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZE1ldGhvZCgKICAgICAgICBnZXRPclNldCwgYmVnaW5Ub2tlbiwgYmVnaW5QYXJhbSwgYmVnaW5Jbml0aWFsaXplcnMsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWl4aW5EZWNsYXJhdGlvbihUb2tlbiBtaXhpbktleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kTWl4aW5EZWNsYXJhdGlvbihtaXhpbktleXdvcmQsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTmFtZWRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmROYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbihlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE5hbWVkTWl4aW5BcHBsaWNhdGlvbihUb2tlbiBiZWdpbiwgVG9rZW4gY2xhc3NLZXl3b3JkLCBUb2tlbiBlcXVhbHMsCiAgICAgIFRva2VuIGltcGxlbWVudHNLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZE5hbWVkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgICBiZWdpbiwgY2xhc3NLZXl3b3JkLCBlcXVhbHMsIGltcGxlbWVudHNLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE5ld0V4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmROZXdFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzKAogICAgICBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzKGNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFBhcnQoVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgbGlzdGVuZXI/LmVuZFBhcnQocGFydEtleXdvcmQsIHNlbWljb2xvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFBhcnRPZigKICAgICAgVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIG9mS2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uLCBib29sIGhhc05hbWUpIHsKICAgIGxpc3RlbmVyPy5lbmRQYXJ0T2YocGFydEtleXdvcmQsIG9mS2V5d29yZCwgc2VtaWNvbG9uLCBoYXNOYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kUmVkaXJlY3RpbmdGYWN0b3J5Qm9keShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoYmVnaW5Ub2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRSZXRocm93U3RhdGVtZW50KFRva2VuIHJldGhyb3dUb2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRSZXRocm93U3RhdGVtZW50KHJldGhyb3dUb2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRSZXR1cm5TdGF0ZW1lbnQoCiAgICAgIGJvb2wgaGFzRXhwcmVzc2lvbiwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRSZXR1cm5TdGF0ZW1lbnQoaGFzRXhwcmVzc2lvbiwgYmVnaW5Ub2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRTaG93KFRva2VuIHNob3dLZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uZW5kU2hvdyhzaG93S2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFN3aXRjaEJsb2NrKGludCBjYXNlQ291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kU3dpdGNoQmxvY2soY2FzZUNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFN3aXRjaENhc2UoCiAgICAgIGludCBsYWJlbENvdW50LAogICAgICBpbnQgZXhwcmVzc2lvbkNvdW50LAogICAgICBUb2tlbiBkZWZhdWx0S2V5d29yZCwKICAgICAgVG9rZW4gY29sb25BZnRlckRlZmF1bHQsCiAgICAgIGludCBzdGF0ZW1lbnRDb3VudCwKICAgICAgVG9rZW4gZmlyc3RUb2tlbiwKICAgICAgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRTd2l0Y2hDYXNlKGxhYmVsQ291bnQsIGV4cHJlc3Npb25Db3VudCwgZGVmYXVsdEtleXdvcmQsCiAgICAgICAgY29sb25BZnRlckRlZmF1bHQsIHN0YXRlbWVudENvdW50LCBmaXJzdFRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFN3aXRjaFN0YXRlbWVudChUb2tlbiBzd2l0Y2hLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZFN3aXRjaFN0YXRlbWVudChzd2l0Y2hLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFRoZW5TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRUaGVuU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVG9wTGV2ZWxEZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZFRvcExldmVsRGVjbGFyYXRpb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUb3BMZXZlbEZpZWxkcygKICAgICAgVG9rZW4gc3RhdGljVG9rZW4sCiAgICAgIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiBsYXRlVG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwKICAgICAgaW50IGNvdW50LAogICAgICBUb2tlbiBiZWdpblRva2VuLAogICAgICBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZFRvcExldmVsRmllbGRzKHN0YXRpY1Rva2VuLCBjb3ZhcmlhbnRUb2tlbiwgbGF0ZVRva2VuLAogICAgICAgIHZhckZpbmFsT3JDb25zdCwgY291bnQsIGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVG9wTGV2ZWxNZXRob2QoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kVG9wTGV2ZWxNZXRob2QoYmVnaW5Ub2tlbiwgZ2V0T3JTZXQsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHJ5U3RhdGVtZW50KGludCBjYXRjaENvdW50LCBUb2tlbiB0cnlLZXl3b3JkLCBUb2tlbiBmaW5hbGx5S2V5d29yZCkgewogICAgbGlzdGVuZXI/LmVuZFRyeVN0YXRlbWVudChjYXRjaENvdW50LCB0cnlLZXl3b3JkLCBmaW5hbGx5S2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZFR5cGVBcmd1bWVudHMoY291bnQsIGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHlwZUxpc3QoaW50IGNvdW50KSB7CiAgICBsaXN0ZW5lcj8uZW5kVHlwZUxpc3QoY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUeXBlVmFyaWFibGUoVG9rZW4gdG9rZW4sIGludCBpbmRleCwgVG9rZW4gZXh0ZW5kc09yU3VwZXIpIHsKICAgIGxpc3RlbmVyPy5lbmRUeXBlVmFyaWFibGUodG9rZW4sIGluZGV4LCBleHRlbmRzT3JTdXBlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVWYXJpYWJsZXMoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRUeXBlVmFyaWFibGVzKGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVmFyaWFibGVJbml0aWFsaXplcihUb2tlbiBhc3NpZ25tZW50T3BlcmF0b3IpIHsKICAgIGxpc3RlbmVyPy5lbmRWYXJpYWJsZUluaXRpYWxpemVyKGFzc2lnbm1lbnRPcGVyYXRvcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFZhcmlhYmxlc0RlY2xhcmF0aW9uKGludCBjb3VudCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRWYXJpYWJsZXNEZWNsYXJhdGlvbihjb3VudCwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRXaGlsZVN0YXRlbWVudChUb2tlbiB3aGlsZUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kV2hpbGVTdGF0ZW1lbnQod2hpbGVLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFdoaWxlU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZFdoaWxlU3RhdGVtZW50Qm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFlpZWxkU3RhdGVtZW50KFRva2VuIHlpZWxkVG9rZW4sIFRva2VuIHN0YXJUb2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRZaWVsZFN0YXRlbWVudCh5aWVsZFRva2VuLCBzdGFyVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQXNPcGVyYXRvcihUb2tlbiBvcGVyYXRvcikgewogICAgbGlzdGVuZXI/LmhhbmRsZUFzT3BlcmF0b3Iob3BlcmF0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVBc3NpZ25tZW50RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUFzc2lnbm1lbnRFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQXN5bmNNb2RpZmllcihUb2tlbiBhc3luY1Rva2VuLCBUb2tlbiBzdGFyVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVBc3luY01vZGlmaWVyKGFzeW5jVG9rZW4sIHN0YXJUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUJyZWFrU3RhdGVtZW50KAogICAgICBib29sIGhhc1RhcmdldCwgVG9rZW4gYnJlYWtLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUJyZWFrU3RhdGVtZW50KGhhc1RhcmdldCwgYnJlYWtLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNhc2VNYXRjaChUb2tlbiBjYXNlS2V5d29yZCwgVG9rZW4gY29sb24pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVDYXNlTWF0Y2goY2FzZUtleXdvcmQsIGNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2F0Y2hCbG9jayhUb2tlbiBvbktleXdvcmQsIFRva2VuIGNhdGNoS2V5d29yZCwgVG9rZW4gY29tbWEpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVDYXRjaEJsb2NrKG9uS2V5d29yZCwgY2F0Y2hLZXl3b3JkLCBjb21tYSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzRXh0ZW5kcyhUb2tlbiBleHRlbmRzS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUNsYXNzRXh0ZW5kcyhleHRlbmRzS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzSGVhZGVyKFRva2VuIGJlZ2luLCBUb2tlbiBjbGFzc0tleXdvcmQsIFRva2VuIG5hdGl2ZVRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlQ2xhc3NIZWFkZXIoYmVnaW4sIGNsYXNzS2V5d29yZCwgbmF0aXZlVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc05vV2l0aENsYXVzZSgpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVDbGFzc05vV2l0aENsYXVzZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc09yTWl4aW5JbXBsZW1lbnRzKAogICAgICBUb2tlbiBpbXBsZW1lbnRzS2V5d29yZCwgaW50IGludGVyZmFjZXNDb3VudCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUNsYXNzT3JNaXhpbkltcGxlbWVudHMoaW1wbGVtZW50c0tleXdvcmQsIGludGVyZmFjZXNDb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzV2l0aENsYXVzZShUb2tlbiB3aXRoS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUNsYXNzV2l0aENsYXVzZSh3aXRoS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNvbW1lbnRSZWZlcmVuY2UoCiAgICAgIFRva2VuIG5ld0tleXdvcmQsIFRva2VuIHByZWZpeCwgVG9rZW4gcGVyaW9kLCBUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUNvbW1lbnRSZWZlcmVuY2UobmV3S2V5d29yZCwgcHJlZml4LCBwZXJpb2QsIHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ29tbWVudFJlZmVyZW5jZVRleHQoU3RyaW5nIHJlZmVyZW5jZVNvdXJjZSwgaW50IHJlZmVyZW5jZU9mZnNldCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUNvbW1lbnRSZWZlcmVuY2VUZXh0KHJlZmVyZW5jZVNvdXJjZSwgcmVmZXJlbmNlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ29uZGl0aW9uYWxFeHByZXNzaW9uQ29sb24oKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlQ29uZGl0aW9uYWxFeHByZXNzaW9uQ29sb24oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ29udGludWVTdGF0ZW1lbnQoCiAgICAgIGJvb2wgaGFzVGFyZ2V0LCBUb2tlbiBjb250aW51ZUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlQ29udGludWVTdGF0ZW1lbnQoaGFzVGFyZ2V0LCBjb250aW51ZUtleXdvcmQsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRGlyZWN0aXZlc09ubHkoKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRGlyZWN0aXZlc09ubHkoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRG90dGVkTmFtZShpbnQgY291bnQsIFRva2VuIGZpcnN0SWRlbnRpZmllcikgewogICAgbGlzdGVuZXI/LmhhbmRsZURvdHRlZE5hbWUoY291bnQsIGZpcnN0SWRlbnRpZmllcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUVsc2VDb250cm9sRmxvdyhUb2tlbiBlbHNlVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVFbHNlQ29udHJvbEZsb3coZWxzZVRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHkoVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHkoc2VtaWNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRW1wdHlTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVFbXB0eVN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUVycm9yVG9rZW4oRXJyb3JUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUVycm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KFRva2VuIGFycm93VG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShhcnJvd1Rva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUV4cHJlc3Npb25TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVFeHByZXNzaW9uU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRXh0cmFuZW91c0V4cHJlc3Npb24oVG9rZW4gdG9rZW4sIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgbGlzdGVuZXI/LmhhbmRsZUV4dHJhbmVvdXNFeHByZXNzaW9uKHRva2VuLCBtZXNzYWdlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRmluYWxseUJsb2NrKFRva2VuIGZpbmFsbHlLZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRmluYWxseUJsb2NrKGZpbmFsbHlLZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ySW5pdGlhbGl6ZXJFbXB0eVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUZvckluaXRpYWxpemVyRW1wdHlTdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVGb3JJbml0aWFsaXplckV4cHJlc3Npb25TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVGb3JJbml0aWFsaXplckV4cHJlc3Npb25TdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVGb3JJbml0aWFsaXplckxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUZvckluaXRpYWxpemVyTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ySW5Mb29wUGFydHMoVG9rZW4gYXdhaXRUb2tlbiwgVG9rZW4gZm9yVG9rZW4sCiAgICAgIFRva2VuIGxlZnRQYXJlbnRoZXNpcywgVG9rZW4gaW5LZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRm9ySW5Mb29wUGFydHMoCiAgICAgICAgYXdhaXRUb2tlbiwgZm9yVG9rZW4sIGxlZnRQYXJlbnRoZXNpcywgaW5LZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9yTG9vcFBhcnRzKFRva2VuIGZvcktleXdvcmQsIFRva2VuIGxlZnRQYXJlbiwKICAgICAgVG9rZW4gbGVmdFNlcGFyYXRvciwgaW50IHVwZGF0ZUV4cHJlc3Npb25Db3VudCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUZvckxvb3BQYXJ0cygKICAgICAgICBmb3JLZXl3b3JkLCBsZWZ0UGFyZW4sIGxlZnRTZXBhcmF0b3IsIHVwZGF0ZUV4cHJlc3Npb25Db3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZ1bmN0aW9uQm9keVNraXBwZWQoVG9rZW4gdG9rZW4sIGJvb2wgaXNFeHByZXNzaW9uQm9keSkgewogICAgbGlzdGVuZXI/LmhhbmRsZUZ1bmN0aW9uQm9keVNraXBwZWQodG9rZW4sIGlzRXhwcmVzc2lvbkJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSWRlbnRpZmllcih0b2tlbiwgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUlkZW50aWZpZXJMaXN0KGludCBjb3VudCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUlkZW50aWZpZXJMaXN0KGNvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW1wb3J0UHJlZml4KFRva2VuIGRlZmVycmVkS2V5d29yZCwgVG9rZW4gYXNLZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSW1wb3J0UHJlZml4KGRlZmVycmVkS2V5d29yZCwgYXNLZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW5kZXhlZEV4cHJlc3Npb24oCiAgICAgIFRva2VuIG9wZW5TcXVhcmVCcmFja2V0LCBUb2tlbiBjbG9zZVNxdWFyZUJyYWNrZXQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVJbmRleGVkRXhwcmVzc2lvbihvcGVuU3F1YXJlQnJhY2tldCwgY2xvc2VTcXVhcmVCcmFja2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW50ZXJwb2xhdGlvbkV4cHJlc3Npb24oVG9rZW4gbGVmdEJyYWNrZXQsIFRva2VuIHJpZ2h0QnJhY2tldCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUludGVycG9sYXRpb25FeHByZXNzaW9uKGxlZnRCcmFja2V0LCByaWdodEJyYWNrZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUludmFsaWRFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZEZ1bmN0aW9uQm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUludmFsaWRGdW5jdGlvbkJvZHkodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkTWVtYmVyKFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSW52YWxpZE1lbWJlcihlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRPcGVyYXRvck5hbWUoVG9rZW4gb3BlcmF0b3JLZXl3b3JkLCBUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUludmFsaWRPcGVyYXRvck5hbWUob3BlcmF0b3JLZXl3b3JkLCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRTdGF0ZW1lbnQoVG9rZW4gdG9rZW4sIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgbGlzdGVuZXI/LmhhbmRsZUludmFsaWRTdGF0ZW1lbnQodG9rZW4sIG1lc3NhZ2UpOwogIH0KCiAgdm9pZCBoYW5kbGVJbnZhbGlkVG9wTGV2ZWxCbG9jayhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUludmFsaWRUb3BMZXZlbEJsb2NrKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb24oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbihlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRUeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSW52YWxpZFR5cGVBcmd1bWVudHModG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkVHlwZVJlZmVyZW5jZShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUludmFsaWRUeXBlUmVmZXJlbmNlKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSXNPcGVyYXRvcihUb2tlbiBpc09wZXJhdG9yLCBUb2tlbiBub3QpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVJc09wZXJhdG9yKGlzT3BlcmF0b3IsIG5vdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxhYmVsKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTGFiZWwodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMaXRlcmFsQm9vbChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUxpdGVyYWxCb29sKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGl0ZXJhbERvdWJsZShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUxpdGVyYWxEb3VibGUodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMaXRlcmFsSW50KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTGl0ZXJhbEludCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxMaXN0KAogICAgICBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGNvbnN0S2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVMaXRlcmFsTGlzdChjb3VudCwgYmVnaW5Ub2tlbiwgY29uc3RLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxNYXBFbnRyeShUb2tlbiBjb2xvbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVMaXRlcmFsTWFwRW50cnkoY29sb24sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGl0ZXJhbE51bGwoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVMaXRlcmFsTnVsbCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxTZXRPck1hcCgKICAgIGludCBjb3VudCwKICAgIFRva2VuIGxlZnRCcmFjZSwKICAgIFRva2VuIGNvbnN0S2V5d29yZCwKICAgIFRva2VuIHJpZ2h0QnJhY2UsCiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogaGFzU2V0RW50cnkgcGFyYW1ldGVyIGV4aXN0cyBmb3IgcmVwbGljYXRpbmcgZXhpc3RpbmcKICAgIC8vIGJlaGF2aW9yIGFuZCB3aWxsIGJlIHJlbW92ZWQgb25jZSB1bmlmaWVkIGNvbGxlY3Rpb24gaGFzIGJlZW4gZW5hYmxlZAogICAgYm9vbCBoYXNTZXRFbnRyeSwKICApIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVMaXRlcmFsU2V0T3JNYXAoCiAgICAgICAgY291bnQsIGxlZnRCcmFjZSwgY29uc3RLZXl3b3JkLCByaWdodEJyYWNlLCBoYXNTZXRFbnRyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU1peGluSGVhZGVyKFRva2VuIG1peGluS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmhhbmRsZU1peGluSGVhZGVyKG1peGluS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU1peGluT24oVG9rZW4gb25LZXl3b3JkLCBpbnQgdHlwZUNvdW50KSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTWl4aW5PbihvbktleXdvcmQsIHR5cGVDb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hbWVkQXJndW1lbnQoVG9rZW4gY29sb24pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOYW1lZEFyZ3VtZW50KGNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmFtZWRNaXhpbkFwcGxpY2F0aW9uV2l0aENsYXVzZShUb2tlbiB3aXRoS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmhhbmRsZU5hbWVkTWl4aW5BcHBsaWNhdGlvbldpdGhDbGF1c2Uod2l0aEtleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVDbGF1c2UoVG9rZW4gbmF0aXZlVG9rZW4sIGJvb2wgaGFzTmFtZSkgewogICAgbGlzdGVuZXI/LmhhbmRsZU5hdGl2ZUNsYXVzZShuYXRpdmVUb2tlbiwgaGFzTmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keShUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5KG5hdGl2ZVRva2VuLCBzZW1pY29sb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkKG5hdGl2ZVRva2VuLCBzZW1pY29sb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkKG5hdGl2ZVRva2VuLCBzZW1pY29sb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0FyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vQXJndW1lbnRzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Db21tZW50UmVmZXJlbmNlKCkgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vQ29tbWVudFJlZmVyZW5jZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTm9Db25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRmllbGRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vRmllbGRJbml0aWFsaXplcih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTm9Gb3JtYWxQYXJhbWV0ZXJzKHRva2VuLCBraW5kKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9GdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOb0Z1bmN0aW9uQm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vSW5pdGlhbGl6ZXJzKCkgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vSW5pdGlhbGl6ZXJzKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vTmFtZShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vTmFtZSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vbk51bGxBc3NlcnRFeHByZXNzaW9uKFRva2VuIGJhbmcpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOb25OdWxsQXNzZXJ0RXhwcmVzc2lvbihiYW5nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9UeXBlKFRva2VuIGxhc3RDb25zdW1lZCkgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vVHlwZShsYXN0Q29uc3VtZWQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb1R5cGVBcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOb1R5cGVBcmd1bWVudHModG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb1R5cGVWYXJpYWJsZXMoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOb1R5cGVWYXJpYWJsZXModG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb1ZhcmlhYmxlSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOb1ZhcmlhYmxlSW5pdGlhbGl6ZXIodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVPcGVyYXRvcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZU9wZXJhdG9yKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlT3BlcmF0b3JOYW1lKFRva2VuIG9wZXJhdG9yS2V5d29yZCwgVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVPcGVyYXRvck5hbWUob3BlcmF0b3JLZXl3b3JkLCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVBhcmVudGhlc2l6ZWRDb25kaXRpb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVQYXJlbnRoZXNpemVkQ29uZGl0aW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUGFyZW50aGVzaXplZEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVF1YWxpZmllZChUb2tlbiBwZXJpb2QpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVRdWFsaWZpZWQocGVyaW9kKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBUb2tlbiBzdGFydFRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgaWYgKGZvcndhcmRFcnJvcnMpIHsKICAgICAgbGlzdGVuZXI/LmhhbmRsZVJlY292ZXJhYmxlRXJyb3IobWVzc2FnZSwgc3RhcnRUb2tlbiwgZW5kVG9rZW4pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVSZWNvdmVyQ2xhc3NIZWFkZXIoKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlUmVjb3ZlckNsYXNzSGVhZGVyKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVJlY292ZXJJbXBvcnQoVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlUmVjb3ZlckltcG9ydChzZW1pY29sb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVSZWNvdmVyTWl4aW5IZWFkZXIoKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlUmVjb3Zlck1peGluSGVhZGVyKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVNjcmlwdChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZVNjcmlwdCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVNlbmQoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVTZW5kKGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3ByZWFkRXhwcmVzc2lvbihUb2tlbiBzcHJlYWRUb2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZVNwcmVhZEV4cHJlc3Npb24oc3ByZWFkVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdHJpbmdKdXh0YXBvc2l0aW9uKGludCBsaXRlcmFsQ291bnQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVTdHJpbmdKdXh0YXBvc2l0aW9uKGxpdGVyYWxDb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN0cmluZ1BhcnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVTdHJpbmdQYXJ0KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3VwZXJFeHByZXNzaW9uKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlU3VwZXJFeHByZXNzaW9uKHRva2VuLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3ltYm9sVm9pZChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZVN5bWJvbFZvaWQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVUaGlzRXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgbGlzdGVuZXI/LmhhbmRsZVRoaXNFeHByZXNzaW9uKHRva2VuLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVGhyb3dFeHByZXNzaW9uKFRva2VuIHRocm93VG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlVGhyb3dFeHByZXNzaW9uKHRocm93VG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVHlwZShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBxdWVzdGlvbk1hcmspIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVUeXBlKGJlZ2luVG9rZW4sIHF1ZXN0aW9uTWFyayk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVR5cGVWYXJpYWJsZXNEZWZpbmVkKFRva2VuIHRva2VuLCBpbnQgY291bnQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVUeXBlVmFyaWFibGVzRGVmaW5lZCh0b2tlbiwgY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVVbmFyeVBvc3RmaXhBc3NpZ25tZW50RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZVVuYXJ5UG9zdGZpeEFzc2lnbm1lbnRFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVW5hcnlQcmVmaXhBc3NpZ25tZW50RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZVVuYXJ5UHJlZml4QXNzaWdubWVudEV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVVbmFyeVByZWZpeEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVVbmFyeVByZWZpeEV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVVbmVzY2FwZUVycm9yKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIFRva2VuIGxvY2F0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlVW5lc2NhcGVFcnJvcihtZXNzYWdlLCBsb2NhdGlvbiwgb2Zmc2V0LCBsZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVWYWx1ZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gZXF1YWxzLCBUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZVZhbHVlZEZvcm1hbFBhcmFtZXRlcihlcXVhbHMsIHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxl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TU0WBiVCBAEMLy8EAQw3MwQBDCoqBAEMQkIEAQw9OAQBDEZABAEMTUcEAQxNRwQBDCgoBAEMJCoEAQxRUQQBDC8vBAEMQDUEAQwrKwQBDCAmBAEMIyMEAQwzMwQBDCoqBAEMLCwEAQwsLAQBDDIyBAEMJSUEAQxAOgQBDDMzBAEMNDQEAQwnJwQBDB87GUcGBAEMJCoEAQwuLgQBDCQqBAEMIyMEAQw2MAQBDDMzBAEMNTcEAQwnJwQBDEc1BAEMJycEAQxGNAQBDEE7BAEMOjQEAQw8OAQBDD09BAEMPDwEAQwyMgQBDBxBRgQBDEA6BAEMKCgEAQwfHgQBDDc3BAEMPT0EAQw9PQQCATtwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2ZvcndhcmRpbmdfbGlzdGVuZXIuZGFydENzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL2xpdGVyYWxfZW50cnlfaW5mby5kYXJ0ixwvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL3NjYW5uZXIuZGFydCc7CmltcG9ydCAnaWRlbnRpZmllcl9jb250ZXh0LmRhcnQnOwppbXBvcnQgJ2xpdGVyYWxfZW50cnlfaW5mb19pbXBsLmRhcnQnOwppbXBvcnQgJ3BhcnNlci5kYXJ0JzsKaW1wb3J0ICd1dGlsLmRhcnQnOwoKLy8vIFtzaW1wbGVFbnRyeV0gaXMgdGhlIGZpcnN0IHN0ZXAgZm9yIHBhcnNpbmcgYSBsaXRlcmFsIGVudHJ5Ci8vLyB3aXRob3V0IGFueSBjb250cm9sIGZsb3cgb3Igc3ByZWFkIGNvbGxlY3Rpb24gb3BlcmF0b3IuCmNvbnN0IExpdGVyYWxFbnRyeUluZm8gc2ltcGxlRW50cnkgPSBjb25zdCBMaXRlcmFsRW50cnlJbmZvKHRydWUsIDApOwoKLy8vIFtMaXRlcmFsRW50cnlJbmZvXSByZXByZXNlbnRzIHN0ZXBzIGZvciBwcm9jZXNzaW5nIGFuIGVudHJ5Ci8vLyBpbiBhIGxpdGVyYWwgbGlzdCwgbWFwLCBvciBzZXQuIFRoZXNlIHN0ZXBzIHdpbGwgaGFuZGxlIHBhcnNpbmcKLy8vIGJvdGggY29udHJvbCBmbG93IGFuZCBzcHJlYWRhYmxlIG9wZXJhdG9ycywgYW5kIGluZGljYXRlCi8vLyB3aGVuIHRoZSBjbGllbnQgc2hvdWxkIHBhcnNlIHRoZSBsaXRlcmFsIGVudHJ5LgovLy8KLy8vIENsaWVudHMgc2hvdWxkIHBhcnNlIGEgc2luZ2xlIGVudHJ5IGluIGEgbGlzdCwgc2V0LCBvciBtYXAgbGlrZSB0aGlzOgovLy8gYGBgCi8vLyAgICBMaXRlcmFsRW50cnlJbmZvIGluZm8gPSBjb21wdXRlTGl0ZXJhbEVudHJ5KHRva2VuKTsKLy8vICAgIHdoaWxlIChpbmZvICE9IG51bGwpIHsKLy8vICAgICAgaWYgKGluZm8uaGFzRW50cnkpIHsKLy8vICAgICAgICAuLi4gcGFyc2UgZXhwcmVzc2lvbiAoYDpgIGV4cHJlc3Npb24pPyAuLi4KLy8vICAgICAgICB0b2tlbiA9IGxhc3RDb25zdW1lZFRva2VuOwovLy8gICAgICB9IGVsc2UgewovLy8gICAgICAgIHRva2VuID0gaW5mby5wYXJzZSh0b2tlbiwgcGFyc2VyKTsKLy8vICAgICAgfQovLy8gICAgICBpbmZvID0gaW5mby5jb21wdXRlTmV4dCh0b2tlbik7Ci8vLyAgICB9Ci8vLyBgYGAKY2xhc3MgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgLy8vIGB0cnVlYCBpZiBhbiBlbnRyeSBzaG91bGQgYmUgcGFyc2VkIGJ5IHRoZSBjYWxsZXIKICAvLy8gb3IgYGZhbHNlYCBpZiB0aGlzIG9iamVjdCdzIFtwYXJzZV0gbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQuCiAgZmluYWwgYm9vbCBoYXNFbnRyeTsKCiAgLy8vIFVzZWQgZm9yIHJlY292ZXJ5LCB0aGlzIGluZGljYXRlcwogIC8vLyArMSBmb3IgYW4gYGlmYCBjb25kaXRpb24gYW5kIC0xIGZvciBgZWxzZWAuCiAgZmluYWwgaW50IGlmQ29uZGl0aW9uRGVsdGE7CgogIGNvbnN0IExpdGVyYWxFbnRyeUluZm8odGhpcy5oYXNFbnRyeSwgdGhpcy5pZkNvbmRpdGlvbkRlbHRhKTsKCiAgLy8vIFBhcnNlIHRoZSBjb250cm9sIGZsb3cgYW5kIHNwcmVhZCBjb2xsZWN0aW9uIGFzcGVjdHMgb2YgdGhpcyBlbnRyeS4KICBUb2tlbiBwYXJzZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgdGhyb3cgaGFzRW50cnkKICAgICAgICA/ICdJbnRlcm5hbCBFcnJvcjogc2hvdWxkIG5vdCBjYWxsIHBhcnNlJwogICAgICAgIDogJ0ludGVybmFsIEVycm9yOiAkcnVudGltZVR5cGUgc2hvdWxkIGltcGxlbWVudCBwYXJzZSc7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbmV4dCBzdGVwIHdoZW4gcGFyc2luZyBhbiBlbnRyeSBvciBgbnVsbGAgaWYgbm9uZS4KICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSA9PiBudWxsOwp9CgovLy8gQ29tcHV0ZSB0aGUgW0xpdGVyYWxFbnRyeUluZm9dIGZvciB0aGUgbGl0ZXJhbCBsaXN0LCBtYXAsIG9yIHNldCBlbnRyeS4KTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTGl0ZXJhbEVudHJ5KFRva2VuIHRva2VuKSB7CiAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgaWYgKG9wdGlvbmFsKCdpZicsIG5leHQpKSB7CiAgICByZXR1cm4gaWZDb25kaXRpb247CiAgfSBlbHNlIGlmIChvcHRpb25hbCgnZm9yJywgbmV4dCkgfHwKICAgICAgKG9wdGlvbmFsKCdhd2FpdCcsIG5leHQpICYmIG9wdGlvbmFsKCdmb3InLCBuZXh0Lm5leHQpKSkgewogICAgcmV0dXJuIG5ldyBGb3JDb25kaXRpb24oKTsKICB9IGVsc2UgaWYgKG9wdGlvbmFsKCcuLi4nLCBuZXh0KSB8fCBvcHRpb25hbCgnLi4uPycsIG5leHQpKSB7CiAgICByZXR1cm4gc3ByZWFkT3BlcmF0b3I7CiAgfQogIHJldHVybiBzaW1wbGVFbnRyeTsKfQoKLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFt0b2tlbl0gc2hvdWxkIGJlIHRyZWF0ZWQgbGlrZSB0aGUgc3RhcnQgb2YKLy8vIGEgbGl0ZXJhbCBlbnRyeSBpbiBhIGxpc3QsIHNldCwgb3IgbWFwIGZvciB0aGUgcHVycG9zZXMgb2YgcmVjb3ZlcnkuCmJvb2wgbG9va3NMaWtlTGl0ZXJhbEVudHJ5KFRva2VuIHRva2VuKSA9PgogICAgbG9va3NMaWtlRXhwcmVzc2lvblN0YXJ0KHRva2VuKSB8fAogICAgb3B0aW9uYWwoJy4uLicsIHRva2VuKSB8fAogICAgb3B0aW9uYWwoJy4uLj8nLCB0b2tlbikgfHwKICAgIG9wdGlvbmFsKCdpZicsIHRva2VuKSB8fAogICAgb3B0aW9uYWwoJ2ZvcicsIHRva2VuKSB8fAogICAgKG9wdGlvbmFsKCdhd2FpdCcsIHRva2VuKSAmJiBvcHRpb25hbCgnZm9yJywgdG9rZW4ubmV4dCkpOwpPAE1OPAEaIicWFAFAPEYBQEQ9NARKCDseHjYmEi4LKQkIGThDFwEoMh4BQAFKLBMyQQQBRTUCAUw0Gx4YJkEfQBsEFgIBS0krJx4fHR4/ATpwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2xpdGVyYWxfZW50cnlfaW5mby5kYXJ0O3Nka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9wYXJzZXIvbG9vcF9zdGF0ZS5kYXJ0gYUvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5wYXJzZXIubG9vcF9zdGF0ZTsKCmVudW0gTG9vcFN0YXRlIHsKICBPdXRzaWRlTG9vcCwKICBJbnNpZGVTd2l0Y2gsIC8vIGBicmVha2Agc3RhdGVtZW50IGFsbG93ZWQKICBJbnNpZGVMb29wLCAvLyBgYnJlYWtgIGFuZCBgY29udGludWVgIHN0YXRlbWVudHMgYWxsb3dlZAp9Cg0ATk48ASEBEQ8tOwIBMnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvbG9vcF9zdGF0ZS5kYXJ0QXNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9wYXJzZXIvbW9kaWZpZXJfY29udGV4dC5kYXJ0u7UvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgS2V5d29yZCwgVG9rZW47CmltcG9ydCAnLi4vbWVzc2FnZXMuZGFydCcgYXMgZmFzdGE7CmltcG9ydCAnZm9ybWFsX3BhcmFtZXRlcl9raW5kLmRhcnQnOwppbXBvcnQgJ21lbWJlcl9raW5kLmRhcnQnIHNob3cgTWVtYmVyS2luZDsKaW1wb3J0ICdwYXJzZXIuZGFydCcgc2hvdyBQYXJzZXI7CmltcG9ydCAndXRpbC5kYXJ0JyBzaG93IG9wdGlvbmFsOwoKYm9vbCBpc01vZGlmaWVyKFRva2VuIHRva2VuKSB7CiAgaWYgKCF0b2tlbi5pc01vZGlmaWVyKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfSBlbHNlIGlmICh0b2tlbi50eXBlLmlzQnVpbHRJbikgewogICAgLy8gQSBidWlsdC1pbiBrZXl3b3JkIGNhbiBvbmx5IGJlIGEgbW9kaWZpZXIgYXMgbG9uZyBhcyBpdCBpcwogICAgLy8gZm9sbG93ZWQgYnkgYW5vdGhlciBrZXl3b3JkIG9yIGFuIGlkZW50aWZpZXIuIE90aGVyd2lzZSwgaXQgaXMgdGhlCiAgICAvLyBpZGVudGlmaWVyLgogICAgLy8KICAgIC8vIEZvciBleGFtcGxlLCBgZXh0ZXJuYWxgIGlzIGEgbW9kaWZpZXIgaW4gdGhpcyBkZWNsYXJhdGlvbjoKICAgIC8vICAgZXh0ZXJuYWwgRm9vIGZvbygpOwogICAgLy8gYnV0IGlzIHRoZSBpZGVudGlmaWVyIGluIHRoaXMgZGVjbGFyYXRpb24KICAgIC8vICAgZXh0ZXJuYWwoKSA9PiB0cnVlOwogICAgLy8gYW5kIGluCiAgICAvLyAgIGZvciAoZmluYWwgZXh0ZXJuYWwgaW4gbGlzdCkgeyB9CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIEtleXdvcmQga2V5d29yZCA9IG5leHQua2V5d29yZDsKICAgIGlmIChrZXl3b3JkID09IG51bGwgJiYgIW5leHQuaXNJZGVudGlmaWVyIHx8IGtleXdvcmQgPT0gS2V5d29yZC5JTikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9CgovLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHBhcnNlIG1vZGlmaWVycyBpbiBtb3N0IGxvY2F0aW9ucyB3aGVyZSBtb2RpZmllcnMKLy8vIGNhbiBvY2N1ciwgYnV0IGRvZXMgbm90IGNhbGwgaGFuZGxlTW9kaWZpZXIgb3IgaGFuZGxlTW9kaWZpZXJzLgpjbGFzcyBNb2RpZmllclJlY292ZXJ5Q29udGV4dCB7CiAgZmluYWwgUGFyc2VyIHBhcnNlcjsKICBUb2tlbiBhYnN0cmFjdFRva2VuOwogIFRva2VuIGNvbnN0VG9rZW47CiAgVG9rZW4gY292YXJpYW50VG9rZW47CiAgVG9rZW4gZXh0ZXJuYWxUb2tlbjsKICBUb2tlbiBmaW5hbFRva2VuOwogIFRva2VuIGxhdGVUb2tlbjsKICBUb2tlbiByZXF1aXJlZFRva2VuOwogIFRva2VuIHN0YXRpY1Rva2VuOwogIFRva2VuIHZhclRva2VuOwoKICAvLyBTZXQgYHRydWVgIHdoZW4gcGFyc2luZyBtb2RpZmllcnMgYWZ0ZXIgdGhlIGBmYWN0b3J5YCB0b2tlbi4KICBib29sIGFmdGVyRmFjdG9yeSA9IGZhbHNlOwoKICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVwbGFjZSBbTW9kaWZpZXJSZWNvdmVyeUNvbnRleHRdIGFuZCBbTW9kaWZpZXJDb250ZXh0XQogIC8vIHdpdGggdGhpcyBjbGFzcy4KCiAgTW9kaWZpZXJSZWNvdmVyeUNvbnRleHQodGhpcy5wYXJzZXIpOwoKICBzZXQgc3RhdGljT3JDb3ZhcmlhbnQoVG9rZW4gc3RhdGljT3JDb3ZhcmlhbnQpIHsKICAgIGlmIChzdGF0aWNPckNvdmFyaWFudCA9PSBudWxsKSB7CiAgICAgIGNvdmFyaWFudFRva2VuID0gbnVsbDsKICAgICAgc3RhdGljVG9rZW4gPSBudWxsOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnY292YXJpYW50Jywgc3RhdGljT3JDb3ZhcmlhbnQpKSB7CiAgICAgIGNvdmFyaWFudFRva2VuID0gc3RhdGljT3JDb3ZhcmlhbnQ7CiAgICAgIHN0YXRpY1Rva2VuID0gbnVsbDsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3N0YXRpYycsIHN0YXRpY09yQ292YXJpYW50KSkgewogICAgICBjb3ZhcmlhbnRUb2tlbiA9IG51bGw7CiAgICAgIHN0YXRpY1Rva2VuID0gc3RhdGljT3JDb3ZhcmlhbnQ7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAiSW50ZXJuYWwgZXJyb3I6ICIKICAgICAgICAgICJVbmV4cGVjdGVkIHN0YXRpY09yQ292YXJpYW50ICckc3RhdGljT3JDb3ZhcmlhbnQnLiI7CiAgICB9CiAgfQoKICBUb2tlbiBnZXQgdmFyRmluYWxPckNvbnN0ID0+IHZhclRva2VuID8/IGZpbmFsVG9rZW4gPz8gY29uc3RUb2tlbjsKCiAgc2V0IHZhckZpbmFsT3JDb25zdChUb2tlbiB2YXJGaW5hbE9yQ29uc3QpIHsKICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgPT0gbnVsbCkgewogICAgICB2YXJUb2tlbiA9IG51bGw7CiAgICAgIGZpbmFsVG9rZW4gPSBudWxsOwogICAgICBjb25zdFRva2VuID0gbnVsbDsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3ZhcicsIHZhckZpbmFsT3JDb25zdCkpIHsKICAgICAgdmFyVG9rZW4gPSB2YXJGaW5hbE9yQ29uc3Q7CiAgICAgIGZpbmFsVG9rZW4gPSBudWxsOwogICAgICBjb25zdFRva2VuID0gbnVsbDsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2ZpbmFsJywgdmFyRmluYWxPckNvbnN0KSkgewogICAgICB2YXJUb2tlbiA9IG51bGw7CiAgICAgIGZpbmFsVG9rZW4gPSB2YXJGaW5hbE9yQ29uc3Q7CiAgICAgIGNvbnN0VG9rZW4gPSBudWxsOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnY29uc3QnLCB2YXJGaW5hbE9yQ29uc3QpKSB7CiAgICAgIHZhclRva2VuID0gbnVsbDsKICAgICAgZmluYWxUb2tlbiA9IG51bGw7CiAgICAgIGNvbnN0VG9rZW4gPSB2YXJGaW5hbE9yQ29uc3Q7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAiSW50ZXJuYWwgZXJyb3I6IFVuZXhwZWN0ZWQgdmFyRmluYWxPckNvbnN0ICckdmFyRmluYWxPckNvbnN0Jy4iOwogICAgfQogIH0KCiAgLy8vIFBhcnNlIG1vZGlmaWVycyBmb3IgY2xhc3MgbWV0aG9kcyBhbmQgZmllbGRzLgogIFRva2VuIHBhcnNlQ2xhc3NNZW1iZXJNb2RpZmllcnMoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gcGFyc2VNb2RpZmllcnModG9rZW4pOwogICAgaWYgKGFic3RyYWN0VG9rZW4gIT0gbnVsbCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIGFic3RyYWN0VG9rZW4sIGZhc3RhLm1lc3NhZ2VBYnN0cmFjdENsYXNzTWVtYmVyKTsKICAgIH0KICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihyZXF1aXJlZFRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQYXJzZSBtb2RpZmllcnMgZm9yIGZvcm1hbCBwYXJhbWV0ZXJzLgogIFRva2VuIHBhcnNlRm9ybWFsUGFyYW1ldGVyTW9kaWZpZXJzKAogICAgICBUb2tlbiB0b2tlbiwgRm9ybWFsUGFyYW1ldGVyS2luZCBwYXJhbWV0ZXJLaW5kLCBNZW1iZXJLaW5kIG1lbWJlcktpbmQpIHsKICAgIHRva2VuID0gcGFyc2VNb2RpZmllcnModG9rZW4pOwoKICAgIGlmIChwYXJhbWV0ZXJLaW5kICE9IEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxOYW1lZCkgewogICAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIocmVxdWlyZWRUb2tlbik7CiAgICB9CiAgICBpZiAobWVtYmVyS2luZCA9PSBNZW1iZXJLaW5kLlN0YXRpY01ldGhvZCB8fAogICAgICAgIG1lbWJlcktpbmQgPT0gTWVtYmVyS2luZC5Ub3BMZXZlbE1ldGhvZCkgewogICAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIodGhpcy5jb3ZhcmlhbnRUb2tlbik7CiAgICAgIHRoaXMuY292YXJpYW50VG9rZW4gPSBudWxsOwogICAgfQogICAgaWYgKGNvbnN0VG9rZW4gIT0gbnVsbCkgewogICAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIoY29uc3RUb2tlbik7CiAgICB9IGVsc2UgaWYgKG1lbWJlcktpbmQgPT0gTWVtYmVyS2luZC5HZW5lcmFsaXplZEZ1bmN0aW9uVHlwZSkgewogICAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwpIHsKICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0LCBmYXN0YS5tZXNzYWdlRnVuY3Rpb25UeXBlZFBhcmFtZXRlclZhcik7CiAgICAgIH0KICAgIH0KICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihhYnN0cmFjdFRva2VuKTsKICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihleHRlcm5hbFRva2VuKTsKICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihsYXRlVG9rZW4pOwogICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKHN0YXRpY1Rva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQYXJzZSBtb2RpZmllcnMgYWZ0ZXIgdGhlIGBmYWN0b3J5YCB0b2tlbi4KICBUb2tlbiBwYXJzZU1vZGlmaWVyc0FmdGVyRmFjdG9yeShUb2tlbiB0b2tlbikgewogICAgYWZ0ZXJGYWN0b3J5ID0gdHJ1ZTsKICAgIHRva2VuID0gcGFyc2VNb2RpZmllcnModG9rZW4pOwogICAgaWYgKGFic3RyYWN0VG9rZW4gIT0gbnVsbCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIGFic3RyYWN0VG9rZW4sIGZhc3RhLm1lc3NhZ2VBYnN0cmFjdENsYXNzTWVtYmVyKTsKICAgIH0KICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihsYXRlVG9rZW4pOwogICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKHJlcXVpcmVkVG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlIG1vZGlmaWVycyBmb3IgdG9wIGxldmVsIGZ1bmN0aW9ucyBhbmQgZmllbGRzLgogIFRva2VuIHBhcnNlVG9wTGV2ZWxNb2RpZmllcnMoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gcGFyc2VNb2RpZmllcnModG9rZW4pOwogICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKGFic3RyYWN0VG9rZW4pOwogICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKGNvdmFyaWFudFRva2VuKTsKICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihyZXF1aXJlZFRva2VuKTsKICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihzdGF0aWNUb2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUGFyc2UgbW9kaWZpZXJzIGZvciB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuCiAgVG9rZW4gcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uTW9kaWZpZXJzKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHBhcnNlTW9kaWZpZXJzKHRva2VuKTsKICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihhYnN0cmFjdFRva2VuKTsKICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihjb3ZhcmlhbnRUb2tlbik7CiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIoZXh0ZXJuYWxUb2tlbik7CiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIocmVxdWlyZWRUb2tlbik7CiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIoc3RhdGljVG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlIG1vZGlmaWVycyBkdXJpbmcgcmVjb3Zlcnkgd2hlbiBtb2RpZmllcnMgYXJlIG91dCBvZiBvcmRlcgogIC8vLyBvciBpbnZhbGlkLiBUeXBpY2FsbHkgY2xpZW50cyBjYWxsIG1ldGhvZHMgbGlrZQogIC8vLyBbcGFyc2VDbGFzc01lbWJlck1vZGlmaWVyc10gd2hpY2ggaW4gdHVybiBjYWxscyB0aGlzIG1ldGhvZCwKICAvLy8gcmF0aGVyIHRoYW4gY2FsbGluZyB0aGlzIG1ldGhvZCBkaXJlY3RseS4KICAvLy8KICAvLy8gVGhlIHZhcmlvdXMgbW9kaWZpZXIgdG9rZW4gcGFyYW1ldGVycyByZXByZXNlbnQgdG9rZW5zIG9mIG1vZGlmaWVycwogIC8vLyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHBhcnNlZCBwcmlvciB0byByZWNvdmVyeS4gVGhlIFtzdGF0aWNPckNvdmFyaWFudF0KICAvLy8gcGFyYW1ldGVyIGlzIGZvciBjb252ZW5pZW5jZSBpZiBjYWxsZXIgaGFzIGEgdG9rZW4gdGhhdCBtYXkgYmUgZWl0aGVyCiAgLy8vIGBzdGF0aWNgIG9yIGBjb3ZhcmlhbnRgLiBUaGUgZmlyc3Qgbm9uLW51bGwgcGFyYW1ldGVyIG9mCiAgLy8vIFtzdGF0aWNPckNvdmFyaWFudF0sIFtzdGF0aWNUb2tlbl0sIG9yIFtjb3ZhcmlhbnRUb2tlbl0gd2lsbCBiZSB1c2VkLAogIC8vLyBpbiB0aGF0IG9yZGVyLCBhbmQgdGhlIG90aGVycyBpZ25vcmVkLgogIFRva2VuIHBhcnNlTW9kaWZpZXJzKFRva2VuIHRva2VuKSB7CiAgICAvLyBQcm9jZXNzIGludmFsaWQgYW5kIG91dC1vZi1vcmRlciBtb2RpZmllcnMKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgZmluYWwgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICAgIGlmIChpZGVudGljYWwoJ2Fic3RyYWN0JywgdmFsdWUpKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlQWJzdHJhY3QodG9rZW4pOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCdjb25zdCcsIHZhbHVlKSkgewogICAgICAgICAgdG9rZW4gPSBwYXJzZUNvbnN0KHRva2VuKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgnY292YXJpYW50JywgdmFsdWUpKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlQ292YXJpYW50KHRva2VuKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgnZXh0ZXJuYWwnLCB2YWx1ZSkpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VFeHRlcm5hbCh0b2tlbik7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoJ2ZpbmFsJywgdmFsdWUpKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlRmluYWwodG9rZW4pOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCdsYXRlJywgdmFsdWUpKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlTGF0ZSh0b2tlbik7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoJ3JlcXVpcmVkJywgdmFsdWUpKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlUmVxdWlyZWQodG9rZW4pOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCdzdGF0aWMnLCB2YWx1ZSkpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VTdGF0aWModG9rZW4pOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCd2YXInLCB2YWx1ZSkpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VWYXIodG9rZW4pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyAnSW50ZXJuYWwgRXJyb3I6IFVuaGFuZGxlZCBtb2RpZmllcjogJHZhbHVlJzsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYWZ0ZXJGYWN0b3J5ICYmIGlkZW50aWNhbCgnZmFjdG9yeScsIHZhbHVlKSkgewogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICBuZXh0LCBmYXN0YS50ZW1wbGF0ZUR1cGxpY2F0ZWRNb2RpZmllcik7CiAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VBYnN0cmFjdChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2Fic3RyYWN0JywgbmV4dCkpOwogICAgaWYgKGFic3RyYWN0VG9rZW4gPT0gbnVsbCkgewogICAgICBhYnN0cmFjdFRva2VuID0gbmV4dDsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRHVwbGljYXRlZE1vZGlmaWVyKTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgVG9rZW4gcGFyc2VDb25zdChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2NvbnN0JywgbmV4dCkpOwogICAgaWYgKHZhckZpbmFsT3JDb25zdCA9PSBudWxsICYmIGNvdmFyaWFudFRva2VuID09IG51bGwpIHsKICAgICAgY29uc3RUb2tlbiA9IG5leHQ7CgogICAgICBpZiAoYWZ0ZXJGYWN0b3J5KSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKG5leHQsICdmYWN0b3J5Jyk7CiAgICAgIH0gZWxzZSBpZiAobGF0ZVRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRDb25mbGljdGluZ01vZGlmaWVycyhuZXh0LCBsYXRlVG9rZW4pOwogICAgICB9CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoY29uc3RUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkTW9kaWZpZXIpOwogICAgfSBlbHNlIGlmIChjb3ZhcmlhbnRUb2tlbiAhPSBudWxsKSB7CiAgICAgIHJlcG9ydENvbmZsaWN0aW5nTW9kaWZpZXJzKG5leHQsIGNvdmFyaWFudFRva2VuKTsKICAgIH0gZWxzZSBpZiAoZmluYWxUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VDb25zdEFuZEZpbmFsKTsKICAgIH0gZWxzZSBpZiAodmFyVG9rZW4gIT0gbnVsbCkgewogICAgICByZXBvcnRDb25mbGljdGluZ01vZGlmaWVycyhuZXh0LCB2YXJUb2tlbik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAnSW50ZXJuYWwgRXJyb3I6IFVuZXhwZWN0ZWQgdmFyRmluYWxPckNvbnN0OiAkdmFyRmluYWxPckNvbnN0JzsKICAgIH0KICAgIHJldHVybiBuZXh0OwogIH0KCiAgVG9rZW4gcGFyc2VDb3ZhcmlhbnQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdjb3ZhcmlhbnQnLCBuZXh0KSk7CiAgICBpZiAoY29uc3RUb2tlbiA9PSBudWxsICYmCiAgICAgICAgY292YXJpYW50VG9rZW4gPT0gbnVsbCAmJgogICAgICAgIHN0YXRpY1Rva2VuID09IG51bGwgJiYKICAgICAgICAhYWZ0ZXJGYWN0b3J5KSB7CiAgICAgIGNvdmFyaWFudFRva2VuID0gbmV4dDsKCiAgICAgIGlmICh2YXJUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKG5leHQsIHZhclRva2VuLmxleGVtZSk7CiAgICAgIH0gZWxzZSBpZiAoZmluYWxUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKG5leHQsIGZpbmFsVG9rZW4ubGV4ZW1lKTsKICAgICAgfSBlbHNlIGlmIChsYXRlVG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJlcG9ydE1vZGlmaWVyT3V0T2ZPcmRlcihuZXh0LCBsYXRlVG9rZW4ubGV4ZW1lKTsKICAgICAgfQogICAgICByZXR1cm4gbmV4dDsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGNvdmFyaWFudFRva2VuICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBuZXh0LCBmYXN0YS50ZW1wbGF0ZUR1cGxpY2F0ZWRNb2RpZmllcik7CiAgICB9IGVsc2UgaWYgKGFmdGVyRmFjdG9yeSkgewogICAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIobmV4dCk7CiAgICB9IGVsc2UgaWYgKGNvbnN0VG9rZW4gIT0gbnVsbCkgewogICAgICByZXBvcnRDb25mbGljdGluZ01vZGlmaWVycyhuZXh0LCBjb25zdFRva2VuKTsKICAgIH0gZWxzZSBpZiAoc3RhdGljVG9rZW4gIT0gbnVsbCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBmYXN0YS5tZXNzYWdlQ292YXJpYW50QW5kU3RhdGljKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICdJbnRlcm5hbCBFcnJvcjogVW5oYW5kbGVkIHJlY292ZXJ5OiAkbmV4dCc7CiAgICB9CiAgICByZXR1cm4gbmV4dDsKICB9CgogIFRva2VuIHBhcnNlRXh0ZXJuYWwoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdleHRlcm5hbCcsIG5leHQpKTsKICAgIGlmIChleHRlcm5hbFRva2VuID09IG51bGwpIHsKICAgICAgZXh0ZXJuYWxUb2tlbiA9IG5leHQ7CgogICAgICBpZiAoYWZ0ZXJGYWN0b3J5KSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKG5leHQsICdmYWN0b3J5Jyk7CiAgICAgIH0gZWxzZSBpZiAoY29uc3RUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKG5leHQsIGNvbnN0VG9rZW4ubGV4ZW1lKTsKICAgICAgfSBlbHNlIGlmIChzdGF0aWNUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKG5leHQsIHN0YXRpY1Rva2VuLmxleGVtZSk7CiAgICAgIH0gZWxzZSBpZiAobGF0ZVRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRNb2RpZmllck91dE9mT3JkZXIobmV4dCwgbGF0ZVRva2VuLmxleGVtZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRHVwbGljYXRlZE1vZGlmaWVyKTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgVG9rZW4gcGFyc2VGaW5hbChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2ZpbmFsJywgbmV4dCkpOwogICAgaWYgKHZhckZpbmFsT3JDb25zdCA9PSBudWxsICYmICFhZnRlckZhY3RvcnkpIHsKICAgICAgZmluYWxUb2tlbiA9IG5leHQ7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoZmluYWxUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkTW9kaWZpZXIpOwogICAgfSBlbHNlIGlmIChhZnRlckZhY3RvcnkpIHsKICAgICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKG5leHQpOwogICAgfSBlbHNlIGlmIChjb25zdFRva2VuICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZUNvbnN0QW5kRmluYWwpOwogICAgfSBlbHNlIGlmICh2YXJUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VGaW5hbEFuZFZhcik7CiAgICB9IGVsc2UgaWYgKGxhdGVUb2tlbiAhPSBudWxsKSB7CiAgICAgIHJlcG9ydE1vZGlmaWVyT3V0T2ZPcmRlcihuZXh0LCBsYXRlVG9rZW4ubGV4ZW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICdJbnRlcm5hbCBFcnJvcjogVW5leHBlY3RlZCB2YXJGaW5hbE9yQ29uc3Q6ICR2YXJGaW5hbE9yQ29uc3QnOwogICAgfQogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBUb2tlbiBwYXJzZUxhdGUoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdsYXRlJywgbmV4dCkpOwogICAgaWYgKGxhdGVUb2tlbiA9PSBudWxsKSB7CiAgICAgIGxhdGVUb2tlbiA9IG5leHQ7CgogICAgICBpZiAoY29uc3RUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0Q29uZmxpY3RpbmdNb2RpZmllcnMobmV4dCwgY29uc3RUb2tlbik7CiAgICAgIH0gZWxzZSBpZiAodmFyVG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJlcG9ydENvbmZsaWN0aW5nTW9kaWZpZXJzKG5leHQsIHZhclRva2VuKTsKICAgICAgfSBlbHNlIGlmIChmaW5hbFRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRNb2RpZmllck91dE9mT3JkZXIobmV4dCwgZmluYWxUb2tlbi5sZXhlbWUpOwogICAgICB9CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICBuZXh0LCBmYXN0YS50ZW1wbGF0ZUR1cGxpY2F0ZWRNb2RpZmllcik7CiAgICByZXR1cm4gbmV4dDsKICB9CgogIFRva2VuIHBhcnNlUmVxdWlyZWQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdyZXF1aXJlZCcsIG5leHQpKTsKICAgIGlmIChyZXF1aXJlZFRva2VuID09IG51bGwpIHsKICAgICAgcmVxdWlyZWRUb2tlbiA9IG5leHQ7CgogICAgICBpZiAoY29uc3RUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKHJlcXVpcmVkVG9rZW4sIGNvbnN0VG9rZW4ubGV4ZW1lKTsKICAgICAgfSBlbHNlIGlmIChjb3ZhcmlhbnRUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKHJlcXVpcmVkVG9rZW4sIGNvdmFyaWFudFRva2VuLmxleGVtZSk7CiAgICAgIH0gZWxzZSBpZiAoZmluYWxUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKHJlcXVpcmVkVG9rZW4sIGZpbmFsVG9rZW4ubGV4ZW1lKTsKICAgICAgfSBlbHNlIGlmICh2YXJUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKHJlcXVpcmVkVG9rZW4sIHZhclRva2VuLmxleGVtZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRHVwbGljYXRlZE1vZGlmaWVyKTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgVG9rZW4gcGFyc2VTdGF0aWMoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdzdGF0aWMnLCBuZXh0KSk7CiAgICBpZiAoY292YXJpYW50VG9rZW4gPT0gbnVsbCAmJiBzdGF0aWNUb2tlbiA9PSBudWxsICYmICFhZnRlckZhY3RvcnkpIHsKICAgICAgc3RhdGljVG9rZW4gPSBuZXh0OwoKICAgICAgaWYgKGNvbnN0VG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJlcG9ydE1vZGlmaWVyT3V0T2ZPcmRlcihuZXh0LCBjb25zdFRva2VuLmxleGVtZSk7CiAgICAgIH0gZWxzZSBpZiAoZmluYWxUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKG5leHQsIGZpbmFsVG9rZW4ubGV4ZW1lKTsKICAgICAgfSBlbHNlIGlmICh2YXJUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKG5leHQsIHZhclRva2VuLmxleGVtZSk7CiAgICAgIH0gZWxzZSBpZiAobGF0ZVRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRNb2RpZmllck91dE9mT3JkZXIobmV4dCwgbGF0ZVRva2VuLmxleGVtZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChjb3ZhcmlhbnRUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VDb3ZhcmlhbnRBbmRTdGF0aWMpOwogICAgfSBlbHNlIGlmIChzdGF0aWNUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkTW9kaWZpZXIpOwogICAgfSBlbHNlIGlmIChhZnRlckZhY3RvcnkpIHsKICAgICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKG5leHQpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ0ludGVybmFsIEVycm9yOiBVbmhhbmRsZWQgcmVjb3Zlcnk6ICRuZXh0JzsKICAgIH0KICAgIHJldHVybiBuZXh0OwogIH0KCiAgVG9rZW4gcGFyc2VWYXIoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCd2YXInLCBuZXh0KSk7CiAgICBpZiAodmFyRmluYWxPckNvbnN0ID09IG51bGwgJiYgIWFmdGVyRmFjdG9yeSkgewogICAgICB2YXJUb2tlbiA9IG5leHQ7CgogICAgICBpZiAobGF0ZVRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRDb25mbGljdGluZ01vZGlmaWVycyhuZXh0LCBsYXRlVG9rZW4pOwogICAgICB9CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAodmFyVG9rZW4gIT0gbnVsbCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIG5leHQsIGZhc3RhLnRlbXBsYXRlRHVwbGljYXRlZE1vZGlmaWVyKTsKICAgIH0gZWxzZSBpZiAoYWZ0ZXJGYWN0b3J5KSB7CiAgICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihuZXh0KTsKICAgIH0gZWxzZSBpZiAoY29uc3RUb2tlbiAhPSBudWxsKSB7CiAgICAgIHJlcG9ydENvbmZsaWN0aW5nTW9kaWZpZXJzKG5leHQsIGNvbnN0VG9rZW4pOwogICAgfSBlbHNlIGlmIChmaW5hbFRva2VuICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZUZpbmFsQW5kVmFyKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICdJbnRlcm5hbCBFcnJvcjogVW5leHBlY3RlZCB2YXJGaW5hbE9yQ29uc3Q6ICR2YXJGaW5hbE9yQ29uc3QnOwogICAgfQogICAgcmV0dXJuIG5leHQ7CiAgfQoKICB2b2lkIHJlcG9ydENvbmZsaWN0aW5nTW9kaWZpZXJzKFRva2VuIG1vZGlmaWVyLCBUb2tlbiBlYXJsaWVyTW9kaWZpZXIpIHsKICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgIG1vZGlmaWVyLAogICAgICAgIGZhc3RhLnRlbXBsYXRlQ29uZmxpY3RpbmdNb2RpZmllcnMKICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobW9kaWZpZXIubGV4ZW1lLCBlYXJsaWVyTW9kaWZpZXIubGV4ZW1lKSk7CiAgfQoKICB2b2lkIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihUb2tlbiBtb2RpZmllcikgewogICAgaWYgKG1vZGlmaWVyICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBtb2RpZmllciwgZmFzdGEudGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXIpOwogICAgfQogIH0KCiAgdm9pZCByZXBvcnRNb2RpZmllck91dE9mT3JkZXIoVG9rZW4gbW9kaWZpZXIsIFN0cmluZyBiZWZvcmVNb2RpZmllcikgewogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgbW9kaWZpZXIsCiAgICAgICAgZmFzdGEudGVtcGxhdGVNb2RpZmllck91dE9mT3JkZXIKICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobW9kaWZpZXIubGV4ZW1lLCBiZWZvcmVNb2RpZmllcikpOwogIH0KfQqB3QBOTjwBNyQlKyIiAR8bEiVCShMHQh0xHQ4qHSRKFAYEDwIBTEQgFxcUGBcUExcVEgFCHQFNFgEoATMlHRo7Kho4HScNH0AGBAFFAS8jFxkZMyIZGTUXJBk1FxkkDU4GBAE0MSMhJTwGLRIEAS0nTyMBPi8GMTM1IgYeLEMlJ0YIBi0tKSsSBAExMhkjISU8BiktEgQBOi4jLS4tKxIEATE5Iy0uLS0rEgQBRjZDMAZKT0w/TC0mMh0TJh4sKDAlNCkzKDAlLyQzKDEmLiMRPgpAMDUWDw8IGQYSBAElHSghHBMGARAsMREEASIdJT0ZARozJjUIEwYBEB4uMyk4JUcjMg1MBhEEASYdKR4iHxkdAR45JzsmOggTBgEQIi4zHyYlNCZMDTkGEQQBJR0oIRwBGjMnOyg8JjoIEwYBECwxEQQBIh0lNBkTBgEQHi4zHyYlRyNFJDgNTAYRBAEhHSQdGAEgNiU0JzsIEwYBECwxEQQBJR0oIRwBIEQrSCdEJUIIEwYBECwxEQQBIx0mShoBIDsnOyU5JjoIEwYBECJMJi4zHyYNOQYRBAEgHSM0FwEfNQgTBgEQHC4zHyYlNCVFDUwGEQQBSyMSK0YEATIcLjcGBAFJIxIpPgQCAThwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL21vZGlmaWVyX2NvbnRleHQuZGFydENzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL3JlY292ZXJ5X2xpc3RlbmVycy5kYXJ0iegvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ2ZvcndhcmRpbmdfbGlzdGVuZXIuZGFydCcgc2hvdyBGb3J3YXJkaW5nTGlzdGVuZXI7CgpjbGFzcyBDbGFzc0hlYWRlclJlY292ZXJ5TGlzdGVuZXIgZXh0ZW5kcyBGb3J3YXJkaW5nTGlzdGVuZXIgewogIFRva2VuIGV4dGVuZHNLZXl3b3JkOwogIFRva2VuIGltcGxlbWVudHNLZXl3b3JkOwogIFRva2VuIHdpdGhLZXl3b3JkOwoKICB2b2lkIGNsZWFyKCkgewogICAgZXh0ZW5kc0tleXdvcmQgPSBudWxsOwogICAgaW1wbGVtZW50c0tleXdvcmQgPSBudWxsOwogICAgd2l0aEtleXdvcmQgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc0V4dGVuZHMoVG9rZW4gZXh0ZW5kc0tleXdvcmQpIHsKICAgIHRoaXMuZXh0ZW5kc0tleXdvcmQgPSBleHRlbmRzS2V5d29yZDsKICAgIHN1cGVyLmhhbmRsZUNsYXNzRXh0ZW5kcyhleHRlbmRzS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzT3JNaXhpbkltcGxlbWVudHMoCiAgICAgIFRva2VuIGltcGxlbWVudHNLZXl3b3JkLCBpbnQgaW50ZXJmYWNlc0NvdW50KSB7CiAgICB0aGlzLmltcGxlbWVudHNLZXl3b3JkID0gaW1wbGVtZW50c0tleXdvcmQ7CiAgICBzdXBlci5oYW5kbGVDbGFzc09yTWl4aW5JbXBsZW1lbnRzKGltcGxlbWVudHNLZXl3b3JkLCBpbnRlcmZhY2VzQ291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc1dpdGhDbGF1c2UoVG9rZW4gd2l0aEtleXdvcmQpIHsKICAgIHRoaXMud2l0aEtleXdvcmQgPSB3aXRoS2V5d29yZDsKICAgIHN1cGVyLmhhbmRsZUNsYXNzV2l0aENsYXVzZSh3aXRoS2V5d29yZCk7CiAgfQp9CgpjbGFzcyBJbXBvcnRSZWNvdmVyeUxpc3RlbmVyIGV4dGVuZHMgRm9yd2FyZGluZ0xpc3RlbmVyIHsKICBUb2tlbiBhc0tleXdvcmQ7CiAgVG9rZW4gZGVmZXJyZWRLZXl3b3JkOwogIFRva2VuIGlmS2V5d29yZDsKICBib29sIGhhc0NvbWJpbmF0b3IgPSBmYWxzZTsKCiAgdm9pZCBjbGVhcigpIHsKICAgIGFzS2V5d29yZCA9IG51bGw7CiAgICBkZWZlcnJlZEtleXdvcmQgPSBudWxsOwogICAgaWZLZXl3b3JkID0gbnVsbDsKICAgIGhhc0NvbWJpbmF0b3IgPSBmYWxzZTsKICB9CgogIHZvaWQgZW5kQ29uZGl0aW9uYWxVcmkoVG9rZW4gaWZLZXl3b3JkLCBUb2tlbiBsZWZ0UGFyZW4sIFRva2VuIGVxdWFsU2lnbikgewogICAgdGhpcy5pZktleXdvcmQgPSBpZktleXdvcmQ7CiAgICBzdXBlci5lbmRDb25kaXRpb25hbFVyaShpZktleXdvcmQsIGxlZnRQYXJlbiwgZXF1YWxTaWduKTsKICB9CgogIHZvaWQgZW5kSGlkZShUb2tlbiBoaWRlS2V5d29yZCkgewogICAgdGhpcy5oYXNDb21iaW5hdG9yID0gdHJ1ZTsKICAgIHN1cGVyLmVuZEhpZGUoaGlkZUtleXdvcmQpOwogIH0KCiAgdm9pZCBlbmRTaG93KFRva2VuIHNob3dLZXl3b3JkKSB7CiAgICB0aGlzLmhhc0NvbWJpbmF0b3IgPSB0cnVlOwogICAgc3VwZXIuZW5kU2hvdyhzaG93S2V5d29yZCk7CiAgfQoKICB2b2lkIGhhbmRsZUltcG9ydFByZWZpeChUb2tlbiBkZWZlcnJlZEtleXdvcmQsIFRva2VuIGFzS2V5d29yZCkgewogICAgdGhpcy5kZWZlcnJlZEtleXdvcmQgPSBkZWZlcnJlZEtleXdvcmQ7CiAgICB0aGlzLmFzS2V5d29yZCA9IGFzS2V5d29yZDsKICAgIHN1cGVyLmhhbmRsZUltcG9ydFByZWZpeChkZWZlcnJlZEtleXdvcmQsIGFzS2V5d29yZCk7CiAgfQp9CgpjbGFzcyBNaXhpbkhlYWRlclJlY292ZXJ5TGlzdGVuZXIgZXh0ZW5kcyBGb3J3YXJkaW5nTGlzdGVuZXIgewogIFRva2VuIG9uS2V5d29yZDsKICBUb2tlbiBpbXBsZW1lbnRzS2V5d29yZDsKCiAgdm9pZCBjbGVhcigpIHsKICAgIG9uS2V5d29yZCA9IG51bGw7CiAgICBpbXBsZW1lbnRzS2V5d29yZCA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzT3JNaXhpbkltcGxlbWVudHMoCiAgICAgIFRva2VuIGltcGxlbWVudHNLZXl3b3JkLCBpbnQgaW50ZXJmYWNlc0NvdW50KSB7CiAgICB0aGlzLmltcGxlbWVudHNLZXl3b3JkID0gaW1wbGVtZW50c0tleXdvcmQ7CiAgICBzdXBlci5oYW5kbGVDbGFzc09yTWl4aW5JbXBsZW1lbnRzKGltcGxlbWVudHNLZXl3b3JkLCBpbnRlcmZhY2VzQ291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVNaXhpbk9uKFRva2VuIG9uS2V5d29yZCwgaW50IHR5cGVDb3VudCkgewogICAgdGhpcy5vbktleXdvcmQgPSBvbktleXdvcmQ7CiAgICBzdXBlci5oYW5kbGVNaXhpbk9uKG9uS2V5d29yZCwgdHlwZUNvdW50KTsKICB9Cn0KYgBOTjwBLgE7AT8YGxUBERseGAQBDDIqLgQBDCU2MEwEAQwyJC4EAgE6ExkTHgERFhwWGwQBTiA+BAEkHyAEASQfIAQBRCwgOgQCAT8TGwERFh4EAQwlNjBMBAEMNyAvBAIBOnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvcmVjb3ZlcnlfbGlzdGVuZXJzLmRhcnRGc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci90b2tlbl9zdHJlYW1fcmV3cml0ZXIuZGFydJzFLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vc2Nhbm5lci9lcnJvcl90b2tlbi5kYXJ0JyBzaG93IFVubWF0Y2hlZFRva2VuOwoKaW1wb3J0ICcuLi8uLi9zY2FubmVyL3Rva2VuLmRhcnQnCiAgICBzaG93CiAgICAgICAgQmVnaW5Ub2tlbiwKICAgICAgICBLZXl3b3JkLAogICAgICAgIFNpbXBsZVRva2VuLAogICAgICAgIFN5bnRoZXRpY0JlZ2luVG9rZW4sCiAgICAgICAgU3ludGhldGljS2V5d29yZFRva2VuLAogICAgICAgIFN5bnRoZXRpY1N0cmluZ1Rva2VuLAogICAgICAgIFN5bnRoZXRpY1Rva2VuLAogICAgICAgIFRva2VuLAogICAgICAgIFRva2VuVHlwZTsKCi8vLyBQcm92aWRlcyB0aGUgY2FwYWJpbGl0eSBvZiBpbnNlcnRpbmcgdG9rZW5zIGludG8gYSB0b2tlbiBzdHJlYW0uIFRoaXMKLy8vIGltcGxlbWVudGF0aW9uIGRvZXMgdGhpcyBieSByZXdyaXRpbmcgdGhlIHByZXZpb3VzIHRva2VuIHRvIHBvaW50IHRvIHRoZQovLy8gaW5zZXJ0ZWQgdG9rZW4uCmNsYXNzIFRva2VuU3RyZWFtUmV3cml0ZXIgd2l0aCBfVG9rZW5TdHJlYW1NaXhpbiB7CiAgLy8gVE9ETyhicmlhbndpbGtlcnNvbik6CiAgLy8KICAvLyBXaGVuIHdlIGdldCB0byB0aGUgcG9pbnQgb2YgcmVtb3ZpbmcgYHRva2VuLnByZXZpb3VzYCwgdGhlIHBsYW4gaXMgdG8KICAvLyBjb252ZXJ0IHRoaXMgaW50byBhbiBpbnRlcmZhY2UgYW5kIHByb3ZpZGUgdHdvIGltcGxlbWVudGF0aW9ucy4KICAvLwogIC8vIE9uZSwgdXNlZCBieSBGYXN0YSwgd2lsbCBjb25uZWN0IHRoZSBpbnNlcnRlZCB0b2tlbnMgdG8gdGhlIGZvbGxvd2luZyB0b2tlbgogIC8vIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBwcmV2aW91cyB0b2tlbi4KICAvLwogIC8vIFRoZSBvdGhlciwgdXNlZCBieSAnYW5hbHl6ZXInLCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlCiAgLy8gc3RyZWFtIChhY3R1YWxseSB3aXRoIHRoZSBCT0YgbWFya2VyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSkuIEl0CiAgLy8gd2lsbCBiZSBjcmVhdGVkIG9ubHkgd2hlbiBpbnZva2luZyAnYW5hbHl6ZXInIHNwZWNpZmljIHBhcnNlIG1ldGhvZHMgKGluCiAgLy8gYFBhcnNlcmApLCBzdWNoIGFzCiAgLy8KICAvLyBUb2tlbiBwYXJzZVVuaXRXaXRoUmV3cml0ZShUb2tlbiBib2YpIHsKICAvLyAgIHJld3JpdGVyID0gQW5hbHl6ZXJUb2tlblN0cmVhbVJld3JpdGVyKGJvZik7CiAgLy8gICByZXR1cm4gcGFyc2VVbml0KGJvZi5uZXh0KTsKICAvLyB9CiAgLy8KCiAgLy8vIEluc2VydCBhIHN5bnRoZXRpYyBvcGVuIGFuZCBjbG9zZSBwYXJlbnRoZXNpcyBhbmQgcmV0dXJuIHRoZSBuZXcgc3ludGhldGljCiAgLy8vIG9wZW4gcGFyZW50aGVzaXMuIElmIFtpbnNlcnRJZGVudGlmaWVyXSBpcyB0cnVlLCB0aGVuIGEgc3ludGhldGljCiAgLy8vIGlkZW50aWZpZXIgaXMgaW5jbHVkZWQgYmV0d2VlbiB0aGUgb3BlbiBhbmQgY2xvc2UgcGFyZW50aGVzaXMuCiAgVG9rZW4gaW5zZXJ0UGFyZW5zKFRva2VuIHRva2VuLCBib29sIGluY2x1ZGVJZGVudGlmaWVyKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGludCBvZmZzZXQgPSBuZXh0LmNoYXJPZmZzZXQ7CiAgICBCZWdpblRva2VuIGxlZnRQYXJlbiA9CiAgICAgICAgbmV4dCA9IG5ldyBTeW50aGV0aWNCZWdpblRva2VuKFRva2VuVHlwZS5PUEVOX1BBUkVOLCBvZmZzZXQpOwogICAgaWYgKGluY2x1ZGVJZGVudGlmaWVyKSB7CiAgICAgIG5leHQgPSBuZXh0LnNldE5leHQoCiAgICAgICAgICBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4oVG9rZW5UeXBlLklERU5USUZJRVIsICcnLCBvZmZzZXQsIDApKTsKICAgIH0KICAgIG5leHQgPSBuZXh0LnNldE5leHQobmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DTE9TRV9QQVJFTiwgb2Zmc2V0KSk7CiAgICBsZWZ0UGFyZW4uZW5kR3JvdXAgPSBuZXh0OwogICAgbmV4dC5zZXROZXh0KHRva2VuLm5leHQpOwoKICAgIC8vIEEgbm8tb3AgcmV3cml0ZXIgY291bGQgc2tpcCB0aGlzIHN0ZXAuCiAgICB0b2tlbi5zZXROZXh0KGxlZnRQYXJlbik7CgogICAgcmV0dXJuIGxlZnRQYXJlbjsKICB9CgogIC8vLyBJbnNlcnQgW25ld1Rva2VuXSBhZnRlciBbdG9rZW5dIGFuZCByZXR1cm4gW25ld1Rva2VuXS4KICBUb2tlbiBpbnNlcnRUb2tlbihUb2tlbiB0b2tlbiwgVG9rZW4gbmV3VG9rZW4pIHsKICAgIG5ld1Rva2VuLnNldE5leHQodG9rZW4ubmV4dCk7CgogICAgLy8gQSBuby1vcCByZXdyaXRlciBjb3VsZCBza2lwIHRoaXMgc3RlcC4KICAgIHRva2VuLnNldE5leHQobmV3VG9rZW4pOwoKICAgIHJldHVybiBuZXdUb2tlbjsKICB9CgogIC8vLyBNb3ZlIFtlbmRHcm91cF0gKGEgc3ludGhldGljIGApYCwgYF1gLCBvciBgfWAgdG9rZW4pIGFuZCBhc3NvY2lhdGVkCiAgLy8vIGVycm9yIHRva2VuIGFmdGVyIFt0b2tlbl0gaW4gdGhlIHRva2VuIHN0cmVhbSBhbmQgcmV0dXJuIFtlbmRHcm91cF0uCiAgVG9rZW4gbW92ZVN5bnRoZXRpYyhUb2tlbiB0b2tlbiwgVG9rZW4gZW5kR3JvdXApIHsKICAgIGFzc2VydChlbmRHcm91cC5iZWZvcmVTeW50aGV0aWMgIT0gbnVsbCk7CiAgICBUb2tlbiBlcnJvclRva2VuOwogICAgaWYgKGVuZEdyb3VwLm5leHQgaXMgVW5tYXRjaGVkVG9rZW4pIHsKICAgICAgZXJyb3JUb2tlbiA9IGVuZEdyb3VwLm5leHQ7CiAgICB9CgogICAgLy8gUmVtb3ZlIGVuZEdyb3VwIGZyb20gaXRzIGN1cnJlbnQgbG9jYXRpb24KICAgIGVuZEdyb3VwLmJlZm9yZVN5bnRoZXRpYy5zZXROZXh0KChlcnJvclRva2VuID8/IGVuZEdyb3VwKS5uZXh0KTsKCiAgICAvLyBJbnNlcnQgZW5kR3JvdXAgaW50byBpdHMgbmV3IGxvY2F0aW9uCiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIHRva2VuLnNldE5leHQoZW5kR3JvdXApOwogICAgKGVycm9yVG9rZW4gPz8gZW5kR3JvdXApLnNldE5leHQobmV4dCk7CiAgICBlbmRHcm91cC5vZmZzZXQgPSBuZXh0Lm9mZnNldDsKICAgIGlmIChlcnJvclRva2VuICE9IG51bGwpIHsKICAgICAgZXJyb3JUb2tlbi5vZmZzZXQgPSBuZXh0Lm9mZnNldDsKICAgIH0KCiAgICByZXR1cm4gZW5kR3JvdXA7CiAgfQoKICAvLy8gUmVwbGFjZSB0aGUgc2luZ2xlIHRva2VuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgW3ByZXZpb3VzVG9rZW5dIHdpdGgKICAvLy8gdGhlIGNoYWluIG9mIHRva2VucyBzdGFydGluZyBhdCB0aGUgW3JlcGxhY2VtZW50VG9rZW5dLiBSZXR1cm4gdGhlCiAgLy8vIFtyZXBsYWNlbWVudFRva2VuXS4KICBUb2tlbiByZXBsYWNlVG9rZW5Gb2xsb3dpbmcoVG9rZW4gcHJldmlvdXNUb2tlbiwgVG9rZW4gcmVwbGFjZW1lbnRUb2tlbikgewogICAgVG9rZW4gcmVwbGFjZWRUb2tlbiA9IHByZXZpb3VzVG9rZW4ubmV4dDsKICAgIHByZXZpb3VzVG9rZW4uc2V0TmV4dChyZXBsYWNlbWVudFRva2VuKTsKCiAgICAocmVwbGFjZW1lbnRUb2tlbiBhcyBTaW1wbGVUb2tlbikucHJlY2VkaW5nQ29tbWVudHMgPQogICAgICAgIHJlcGxhY2VkVG9rZW4ucHJlY2VkaW5nQ29tbWVudHM7CgogICAgX2xhc3RUb2tlbkluQ2hhaW4ocmVwbGFjZW1lbnRUb2tlbikuc2V0TmV4dChyZXBsYWNlZFRva2VuLm5leHQpOwoKICAgIHJldHVybiByZXBsYWNlbWVudFRva2VuOwogIH0KCiAgLy8vIEdpdmVuIHRoZSBbZmlyc3RUb2tlbl0gaW4gYSBjaGFpbiBvZiB0b2tlbnMgdG8gYmUgaW5zZXJ0ZWQsIHJldHVybiB0aGUKICAvLy8gbGFzdCB0b2tlbiBpbiB0aGUgY2hhaW4uCiAgLy8vCiAgLy8vIEFzIGEgc2lkZS1lZmZlY3QsIHRoaXMgbWV0aG9kIGFsc28gZW5zdXJlcyB0aGF0IHRoZSB0b2tlbnMgaW4gdGhlIGNoYWluCiAgLy8vIGhhdmUgdGhlaXIgYHByZXZpb3VzYCBwb2ludGVycyBzZXQgY29ycmVjdGx5LgogIFRva2VuIF9sYXN0VG9rZW5JbkNoYWluKFRva2VuIGZpcnN0VG9rZW4pIHsKICAgIFRva2VuIHByZXZpb3VzOwogICAgVG9rZW4gY3VycmVudCA9IGZpcnN0VG9rZW47CiAgICB3aGlsZSAoY3VycmVudC5uZXh0ICE9IG51bGwgJiYgY3VycmVudC5uZXh0LnR5cGUgIT0gVG9rZW5UeXBlLkVPRikgewogICAgICBpZiAocHJldmlvdXMgIT0gbnVsbCkgewogICAgICAgIGN1cnJlbnQucHJldmlvdXMgPSBwcmV2aW91czsKICAgICAgfQogICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICB9CiAgICBpZiAocHJldmlvdXMgIT0gbnVsbCkgewogICAgICBjdXJyZW50LnByZXZpb3VzID0gcHJldmlvdXM7CiAgICB9CiAgICByZXR1cm4gY3VycmVudDsKICB9Cn0KCi8vLyBQcm92aWRlcyB0aGUgY2FwYWJpbGl0eSBvZiBhZGRpbmcgdG9rZW5zIHRoYXQgbGVhZCBpbnRvIGEgdG9rZW4gc3RyZWFtCi8vLyB3aXRob3V0IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgdG9rZW4gc3RyZWFtIGFuZCBub3Qgc2V0dGluZyB0aGUgYW55IHRva2VuJ3MKLy8vIGBwcmV2aW91c2AgZmllbGQuCmNsYXNzIFRva2VuU3RyZWFtR2hvc3RXcml0ZXIKICAgIHdpdGggX1Rva2VuU3RyZWFtTWl4aW4KICAgIGltcGxlbWVudHMgVG9rZW5TdHJlYW1SZXdyaXRlciB7CiAgQG92ZXJyaWRlCiAgVG9rZW4gaW5zZXJ0UGFyZW5zKFRva2VuIHRva2VuLCBib29sIGluY2x1ZGVJZGVudGlmaWVyKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGludCBvZmZzZXQgPSBuZXh0LmNoYXJPZmZzZXQ7CiAgICBCZWdpblRva2VuIGxlZnRQYXJlbiA9CiAgICAgICAgbmV4dCA9IG5ldyBTeW50aGV0aWNCZWdpblRva2VuKFRva2VuVHlwZS5PUEVOX1BBUkVOLCBvZmZzZXQpOwogICAgaWYgKGluY2x1ZGVJZGVudGlmaWVyKSB7CiAgICAgIFRva2VuIGlkZW50aWZpZXIgPQogICAgICAgICAgbmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKFRva2VuVHlwZS5JREVOVElGSUVSLCAnJywgb2Zmc2V0LCAwKTsKICAgICAgbmV4dC5uZXh0ID0gaWRlbnRpZmllcjsKICAgICAgbmV4dCA9IGlkZW50aWZpZXI7CiAgICB9CiAgICBUb2tlbiByaWdodFBhcmVuID0gbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DTE9TRV9QQVJFTiwgb2Zmc2V0KTsKICAgIG5leHQubmV4dCA9IHJpZ2h0UGFyZW47CiAgICByaWdodFBhcmVuLm5leHQgPSB0b2tlbi5uZXh0OwoKICAgIHJldHVybiBsZWZ0UGFyZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBpbnNlcnRUb2tlbihUb2tlbiB0b2tlbiwgVG9rZW4gbmV3VG9rZW4pIHsKICAgIG5ld1Rva2VuLm5leHQgPSB0b2tlbi5uZXh0OwogICAgcmV0dXJuIG5ld1Rva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gbW92ZVN5bnRoZXRpYyhUb2tlbiB0b2tlbiwgVG9rZW4gZW5kR3JvdXApIHsKICAgIFRva2VuIG5ld0VuZEdyb3VwID0KICAgICAgICBuZXcgU3ludGhldGljVG9rZW4oZW5kR3JvdXAudHlwZSwgdG9rZW4ubmV4dC5jaGFyT2Zmc2V0KTsKICAgIG5ld0VuZEdyb3VwLm5leHQgPSB0b2tlbi5uZXh0OwogICAgcmV0dXJuIG5ld0VuZEdyb3VwOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gcmVwbGFjZVRva2VuRm9sbG93aW5nKFRva2VuIHByZXZpb3VzVG9rZW4sIFRva2VuIHJlcGxhY2VtZW50VG9rZW4pIHsKICAgIFRva2VuIHJlcGxhY2VkVG9rZW4gPSBwcmV2aW91c1Rva2VuLm5leHQ7CgogICAgKHJlcGxhY2VtZW50VG9rZW4gYXMgU2ltcGxlVG9rZW4pLnByZWNlZGluZ0NvbW1lbnRzID0KICAgICAgICByZXBsYWNlZFRva2VuLnByZWNlZGluZ0NvbW1lbnRzOwoKICAgIF9sYXN0VG9rZW5JbkNoYWluKHJlcGxhY2VtZW50VG9rZW4pLm5leHQgPSByZXBsYWNlZFRva2VuLm5leHQ7CiAgICByZXR1cm4gcmVwbGFjZW1lbnRUb2tlbjsKICB9CgogIC8vLyBHaXZlbiB0aGUgW2ZpcnN0VG9rZW5dIGluIGEgY2hhaW4gb2YgdG9rZW5zIHRvIGJlIGluc2VydGVkLCByZXR1cm4gdGhlCiAgLy8vIGxhc3QgdG9rZW4gaW4gdGhlIGNoYWluLgogIFRva2VuIF9sYXN0VG9rZW5JbkNoYWluKFRva2VuIGZpcnN0VG9rZW4pIHsKICAgIFRva2VuIGN1cnJlbnQgPSBmaXJzdFRva2VuOwogICAgd2hpbGUgKGN1cnJlbnQubmV4dCAhPSBudWxsICYmIGN1cnJlbnQubmV4dC50eXBlICE9IFRva2VuVHlwZS5FT0YpIHsKICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDsKICAgIH0KICAgIHJldHVybiBjdXJyZW50OwogIH0KfQoKbWl4aW4gX1Rva2VuU3RyZWFtTWl4aW4gewogIC8vLyBJbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciBhZnRlciBbdG9rZW5dIGFuZCByZXR1cm4gdGhlIG5ldyBpZGVudGlmaWVyLgogIFRva2VuIGluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFtTdHJpbmcgdmFsdWVdKSB7CiAgICByZXR1cm4gaW5zZXJ0VG9rZW4oCiAgICAgICAgdG9rZW4sCiAgICAgICAgbmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKAogICAgICAgICAgICBUb2tlblR5cGUuSURFTlRJRklFUiwgdmFsdWUgPz8gJycsIHRva2VuLm5leHQuY2hhck9mZnNldCwgMCkpOwogIH0KCiAgLy8vIEluc2VydCBhIG5ldyBzeW50aGV0aWMgW2tleXdvcmRdIGFmdGVyIFt0b2tlbl0gYW5kIHJldHVybiB0aGUgbmV3IHRva2VuLgogIFRva2VuIGluc2VydFN5bnRoZXRpY0tleXdvcmQoVG9rZW4gdG9rZW4sIEtleXdvcmQga2V5d29yZCkgPT4gaW5zZXJ0VG9rZW4oCiAgICAgIHRva2VuLCBuZXcgU3ludGhldGljS2V5d29yZFRva2VuKGtleXdvcmQsIHRva2VuLm5leHQuY2hhck9mZnNldCkpOwoKICAvLy8gSW5zZXJ0IGEgbmV3IHNpbXBsZSBzeW50aGV0aWMgdG9rZW4gb2YgW25ld1Rva2VuVHlwZV0gYWZ0ZXIgW3Rva2VuXQogIC8vLyBhbmQgcmV0dXJuIHRoZSBuZXcgdG9rZW4uCiAgVG9rZW4gaW5zZXJ0U3ludGhldGljVG9rZW4oVG9rZW4gdG9rZW4sIFRva2VuVHlwZSBuZXdUb2tlblR5cGUpIHsKICAgIGFzc2VydChuZXdUb2tlblR5cGUgaXMhIEtleXdvcmQsICd1c2UgaW5zZXJ0U3ludGhldGljS2V5d29yZCBpbnN0ZWFkJyk7CiAgICByZXR1cm4gaW5zZXJ0VG9rZW4oCiAgICAgICAgdG9rZW4sIG5ldyBTeW50aGV0aWNUb2tlbihuZXdUb2tlblR5cGUsIHRva2VuLm5leHQuY2hhck9mZnNldCkpOwogIH0KCiAgLy8vIEluc2VydCBbbmV3VG9rZW5dIGFmdGVyIFt0b2tlbl0gYW5kIHJldHVybiBbbmV3VG9rZW5dLgogIFRva2VuIGluc2VydFRva2VuKFRva2VuIHRva2VuLCBUb2tlbiBuZXdUb2tlbik7Cn0KgN0ATk48AToBIgkUERUdHx4YDxMBSk0UMxsFS0UFUSsFUE5OGAUtNCMHBQFRSEU8HSIbRh0bSgZMHx4BLh4BFgQBPTMiAS4dARUEAUpLNS4WKyIGATFFAS0dHSwjHicGARUEAU5JGk0uLQE6KQFFAR0EAU0fBk40LhQgSR4lCBoeBhwjBhQEAgFLUBYdGyUMPB0iG0YdGUkeGQZKHCIBFgQBDDMgFQQBDDUYQiMYBAEMTS4BOikBQx0EAU0fLiBJHgYUBAIBGlFBGA8iSwQBT01JAUogREwYSQQBPTICAT1wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL3Rva2VuX3N0cmVhbV9yZXdyaXRlci5kYXJ0OnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9wYXJzZXIvdHlwZV9pbmZvLmRhcnS01S8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnBhcnNlci50eXBlX2luZm87CgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbiwgVG9rZW5UeXBlOwoKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuX2NvbnN0YW50cy5kYXJ0JyBzaG93IElERU5USUZJRVJfVE9LRU4sIEtFWVdPUkRfVE9LRU47CgppbXBvcnQgJ3BhcnNlci5kYXJ0JyBzaG93IFBhcnNlcjsKCmltcG9ydCAndHlwZV9pbmZvX2ltcGwuZGFydCc7CgppbXBvcnQgJ3V0aWwuZGFydCcgc2hvdyBpc09uZU9mLCBvcHRpb25hbDsKCi8vLyBbVHlwZUluZm9dIHByb3ZpZGVzIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBieSBbY29tcHV0ZVR5cGVdCi8vLyBhYm91dCBhIHBhcnRpY3VsYXIgdHlwZSByZWZlcmVuY2UuCmFic3RyYWN0IGNsYXNzIFR5cGVJbmZvIHsKICAvLy8gUmV0dXJuIHR5cGUgaW5mbyByZXByZXNlbnRpbmcgdGhlIHJlY2VpdmVyIHdpdGhvdXQgdGhlIHRyYWlsaW5nIGA/YAogIC8vLyBvciB0aGUgcmVjZWl2ZXIgaWYgdGhlIHJlY2VpdmVyIGRvZXMgbm90IHJlcHJlc2VudCBhIG51bGxhYmxlIHR5cGUuCiAgVHlwZUluZm8gZ2V0IGFzTm9uTnVsbGFibGU7CgogIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdHlwZSByZXByZXNlbnRlZCBieSB0aGUKICAvLy8gcmVjZWl2ZXIgY291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSB2YWxpZCBzdGFuZGFsb25lIGV4cHJlc3Npb24uCiAgLy8vIEZvciBleGFtcGxlLCBgQWAgb3IgYEEuYmAgY291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgdHlwZSByZWZlcmVuY2VzCiAgLy8vIG9yIGV4cHJlc3Npb25zLCB3aGlsZSBgQTxUPmAgb25seSBsb29rcyBsaWtlIGEgdHlwZSByZWZlcmVuY2UuCiAgYm9vbCBnZXQgY291bGRCZUV4cHJlc3Npb247CgogIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGEgdHJhaWxpbmcgYD9gLgogIGJvb2wgZ2V0IGlzTnVsbGFibGU7CgogIC8vLyBDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgdG9rZW4gYWZ0ZXIgW3Rva2VuXSBtdXN0IGJlIGEgdHlwZSAobm90IHZvaWQpLgogIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgbWV0aG9kcyBvbiB0aGUgW1BhcnNlcl0ncwogIC8vLyBsaXN0ZW5lciB0byBoYW5kbGUgdGhlIHR5cGUsIGluc2VydGluZyBhIHN5bnRoZXRpYyB0eXBlIHJlZmVyZW5jZSBpZgogIC8vLyBuZWNlc3NhcnkuIFRoaXMgbWF5IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtIHdoZW4gcGFyc2luZyBgPj5gIG9yIGA+Pj5gCiAgLy8vIG9yIGA+Pj49YCBpbiB2YWxpZCBjb2RlIG9yIGR1cmluZyByZWNvdmVyeS4KICBUb2tlbiBlbnN1cmVUeXBlTm90Vm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcik7CgogIC8vLyBDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgdG9rZW4gYWZ0ZXIgW3Rva2VuXSBtdXN0IGJlIGEgdHlwZSBvciB2b2lkLgogIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgbWV0aG9kcyBvbiB0aGUgW1BhcnNlcl0ncwogIC8vLyBsaXN0ZW5lciB0byBoYW5kbGUgdGhlIHR5cGUsIGluc2VydGluZyBhIHN5bnRoZXRpYyB0eXBlIHJlZmVyZW5jZSBpZgogIC8vLyBuZWNlc3NhcnkuIFRoaXMgbWF5IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtIHdoZW4gcGFyc2luZyBgPj5gIG9yIGA+Pj5gCiAgLy8vIG9yIGA+Pj49YCBpbiB2YWxpZCBjb2RlIG9yIGR1cmluZyByZWNvdmVyeS4KICBUb2tlbiBlbnN1cmVUeXBlT3JWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKTsKCiAgLy8vIENhbGwgdGhpcyBmdW5jdGlvbiB0byBwYXJzZSBhbiBvcHRpb25hbCB0eXBlIChub3Qgdm9pZCkgYWZ0ZXIgW3Rva2VuXS4KICAvLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGwgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IG1ldGhvZHMgb24gdGhlIFtQYXJzZXJdJ3MKICAvLy8gbGlzdGVuZXIgdG8gaGFuZGxlIHRoZSB0eXBlLiBUaGlzIG1heSBtb2RpZnkgdGhlIHRva2VuIHN0cmVhbQogIC8vLyB3aGVuIHBhcnNpbmcgYD4+YCBvciBgPj4+YCBvciBgPj4+PWAgIGluIHZhbGlkIGNvZGUgb3IgZHVyaW5nIHJlY292ZXJ5LgogIFRva2VuIHBhcnNlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpOwoKICAvLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHBhcnNlIGFuIG9wdGlvbmFsIHR5cGUgb3Igdm9pZCBhZnRlciBbdG9rZW5dLgogIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgbWV0aG9kcyBvbiB0aGUgW1BhcnNlcl0ncwogIC8vLyBsaXN0ZW5lciB0byBoYW5kbGUgdGhlIHR5cGUuIFRoaXMgbWF5IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtCiAgLy8vIHdoZW4gcGFyc2luZyBgPj5gIG9yIGA+Pj5gIG9yIGA+Pj49YCBpbiB2YWxpZCBjb2RlIG9yIGR1cmluZyByZWNvdmVyeS4KICBUb2tlbiBwYXJzZVR5cGUoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpOwoKICAvLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIFt0b2tlbl0gYmVmb3JlIHRoZSB0eXBlIHRvIG9idGFpbgogIC8vLyB0aGUgbGFzdCB0b2tlbiBpbiB0aGUgdHlwZS4gSWYgdGhlcmUgaXMgbm8gdHlwZSwgdGhlbiB0aGlzIG1ldGhvZAogIC8vLyB3aWxsIHJldHVybiBbdG9rZW5dLiBUaGlzIGRvZXMgbm90IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtLgogIFRva2VuIHNraXBUeXBlKFRva2VuIHRva2VuKTsKfQoKLy8vIFtUeXBlUGFyYW1PckFyZ0luZm9dIHByb3ZpZGVzIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBieQovLy8gW2NvbXB1dGVUeXBlUGFyYW1PckFyZ10gYWJvdXQgYSBwYXJ0aWN1bGFyIGdyb3VwIG9mIHR5cGUgYXJndW1lbnRzCi8vLyBvciB0eXBlIHBhcmFtZXRlcnMuCmFic3RyYWN0IGNsYXNzIFR5cGVQYXJhbU9yQXJnSW5mbyB7CiAgY29uc3QgVHlwZVBhcmFtT3JBcmdJbmZvKCk7CgogIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSByZWNlaXZlciByZXByZXNlbnRzIGEgc2luZ2xlIHR5cGUgYXJndW1lbnQKICBib29sIGdldCBpc1NpbXBsZVR5cGVBcmd1bWVudCA9PiBmYWxzZTsKCiAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzCiAgaW50IGdldCB0eXBlQXJndW1lbnRDb3VudDsKCiAgLy8vIFJldHVybiB0aGUgc2ltcGxlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2ltcGxlIHR5cGUgYXJndW1lbnQKICAvLy8gb3IgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGEgc2ltcGxlIHR5cGUgYXJndW1lbnQuCiAgVHlwZUluZm8gZ2V0IHR5cGVJbmZvIHsKICAgIHRocm93ICJJbnRlcm5hbCBlcnJvcjogJHJ1bnRpbWVUeXBlIGlzIG5vdCBhIFNpbXBsZVR5cGVBcmd1bWVudC4iOwogIH0KCiAgLy8vIENhbGwgdGhpcyBmdW5jdGlvbiB0byBwYXJzZSBvcHRpb25hbCB0eXBlIGFyZ3VtZW50cyBhZnRlciBbdG9rZW5dLgogIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgbWV0aG9kcyBvbiB0aGUgW1BhcnNlcl0ncwogIC8vLyBsaXN0ZW5lciB0byBoYW5kbGUgdGhlIGFyZ3VtZW50cy4gVGhpcyBtYXkgbW9kaWZ5IHRoZSB0b2tlbiBzdHJlYW0KICAvLy8gd2hlbiBwYXJzaW5nIGA+PmAgb3IgYD4+PmAgb3IgYD4+Pj1gIGluIHZhbGlkIGNvZGUgb3IgZHVyaW5nIHJlY292ZXJ5LgogIFRva2VuIHBhcnNlQXJndW1lbnRzKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKTsKCiAgLy8vIENhbGwgdGhpcyBmdW5jdGlvbiB0byBwYXJzZSBvcHRpb25hbCB0eXBlIHBhcmFtZXRlcnMKICAvLy8gKGFsc28ga25vd24gYXMgdHlwZSB2YXJpYWJsZXMpIGFmdGVyIFt0b2tlbl0uCiAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBldmVudCBtZXRob2RzIG9uIHRoZSBbUGFyc2VyXSdzCiAgLy8vIGxpc3RlbmVyIHRvIGhhbmRsZSB0aGUgcGFyYW1ldGVycy4gVGhpcyBtYXkgbW9kaWZ5IHRoZSB0b2tlbiBzdHJlYW0KICAvLy8gd2hlbiBwYXJzaW5nIGA+PmAgb3IgYD4+PmAgb3IgYD4+Pj1gIGluIHZhbGlkIGNvZGUgb3IgZHVyaW5nIHJlY292ZXJ5LgogIFRva2VuIHBhcnNlVmFyaWFibGVzKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKTsKCiAgLy8vIENhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBbdG9rZW5dIGJlZm9yZSB0aGUgdHlwZSB2YXIgdG8gb2J0YWluCiAgLy8vIHRoZSBsYXN0IHRva2VuIGluIHRoZSB0eXBlIHZhci4gSWYgdGhlcmUgaXMgbm8gdHlwZSB2YXIsIHRoZW4gdGhpcyBtZXRob2QKICAvLy8gd2lsbCByZXR1cm4gW3Rva2VuXS4gVGhpcyBkb2VzIG5vdCBtb2RpZnkgdGhlIHRva2VuIHN0cmVhbS4KICBUb2tlbiBza2lwKFRva2VuIHRva2VuKTsKfQoKLy8vIFtOb1R5cGVdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVJbmZvXSByZXR1cm5lZCBieSBbY29tcHV0ZVR5cGVdIHdoZW4KLy8vIHRoZXJlIGlzIG5vIHR5cGUgaW5mb3JtYXRpb24gaW4gdGhlIHNvdXJjZS4KY29uc3QgVHlwZUluZm8gbm9UeXBlID0gY29uc3QgTm9UeXBlKCk7CgovLy8gW05vVHlwZVBhcmFtT3JBcmddIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVQYXJhbU9yQXJnSW5mb10gcmV0dXJuZWQgYnkKLy8vIFtjb21wdXRlVHlwZVBhcmFtT3JBcmddIHdoZW4gbm8gdHlwZSBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cyBhcmUgZm91bmQuCmNvbnN0IFR5cGVQYXJhbU9yQXJnSW5mbyBub1R5cGVQYXJhbU9yQXJnID0gY29uc3QgTm9UeXBlUGFyYW1PckFyZygpOwoKLy8vIFtWb2lkVHlwZV0gaXMgYSBzcGVjaWFsaXplZCBbVHlwZUluZm9dIHJldHVybmVkIGJ5IFtjb21wdXRlVHlwZV0gd2hlbgovLy8gYHZvaWRgIGFwcGVhcnMgaW4gdGhlIHNvdXJjZS4KY29uc3QgVHlwZUluZm8gdm9pZFR5cGUgPSBjb25zdCBWb2lkVHlwZSgpOwoKYm9vbCBpc0dlbmVyYWxpemVkRnVuY3Rpb25UeXBlKFRva2VuIHRva2VuKSB7CiAgcmV0dXJuIG9wdGlvbmFsKCdGdW5jdGlvbicsIHRva2VuKSAmJgogICAgICAob3B0aW9uYWwoJzwnLCB0b2tlbi5uZXh0KSB8fCBvcHRpb25hbCgnKCcsIHRva2VuLm5leHQpKTsKfQoKYm9vbCBpc1ZhbGlkVHlwZVJlZmVyZW5jZShUb2tlbiB0b2tlbikgewogIGludCBraW5kID0gdG9rZW4ua2luZDsKICBpZiAoSURFTlRJRklFUl9UT0tFTiA9PSBraW5kKSByZXR1cm4gdHJ1ZTsKICBpZiAoS0VZV09SRF9UT0tFTiA9PSBraW5kKSB7CiAgICBUb2tlblR5cGUgdHlwZSA9IHRva2VuLnR5cGU7CiAgICBTdHJpbmcgdmFsdWUgPSB0eXBlLmxleGVtZTsKICAgIHJldHVybiB0eXBlLmlzUHNldWRvIHx8CiAgICAgICAgKHR5cGUuaXNCdWlsdEluICYmIG9wdGlvbmFsKCcuJywgdG9rZW4ubmV4dCkpIHx8CiAgICAgICAgKGlkZW50aWNhbCh2YWx1ZSwgJ2R5bmFtaWMnKSkgfHwKICAgICAgICAoaWRlbnRpY2FsKHZhbHVlLCAndm9pZCcpKTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLy8gQ2FsbGVkIGJ5IHRoZSBwYXJzZXIgdG8gb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IGEgcG9zc2libGUgdHlwZSByZWZlcmVuY2UKLy8vIHRoYXQgZm9sbG93cyBbdG9rZW5dLiBUaGlzIGRvZXMgbm90IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtLgovLy8KLy8vIElmIFtpbkRlY2xhcmF0aW9uXSBpcyBgdHJ1ZWAsIHRoZW4gdGhpcyB3aWxsIG1vcmUgYWdncmVzc2l2ZWx5IHJlY292ZXIKLy8vIGdpdmVuIHVuYmFsYW5jZWQgYDxgIGA+YCBhbmQgaW52YWxpZCBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cy4KVHlwZUluZm8gY29tcHV0ZVR5cGUoZmluYWwgVG9rZW4gdG9rZW4sIGJvb2wgcmVxdWlyZWQsCiAgICBbYm9vbCBpbkRlY2xhcmF0aW9uID0gZmFsc2VdKSB7CiAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgaWYgKCFpc1ZhbGlkVHlwZVJlZmVyZW5jZShuZXh0KSkgewogICAgaWYgKG5leHQudHlwZS5pc0J1aWx0SW4pIHsKICAgICAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVQYXJhbU9yQXJnID0KICAgICAgICAgIGNvbXB1dGVUeXBlUGFyYW1PckFyZyhuZXh0LCBpbkRlY2xhcmF0aW9uKTsKICAgICAgaWYgKHR5cGVQYXJhbU9yQXJnICE9IG5vVHlwZVBhcmFtT3JBcmcpIHsKICAgICAgICAvLyBSZWNvdmVyeTogYnVpbHQtaW4gYDxgIC4uLiBgPmAKICAgICAgICBpZiAocmVxdWlyZWQgfHwgbG9va3NMaWtlTmFtZSh0eXBlUGFyYW1PckFyZy5za2lwKG5leHQpLm5leHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlSW5mbyh0b2tlbiwgdHlwZVBhcmFtT3JBcmcpCiAgICAgICAgICAgICAgLmNvbXB1dGVCdWlsdGluT3JWYXJBc1R5cGUocmVxdWlyZWQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZCB8fCBpc0dlbmVyYWxpemVkRnVuY3Rpb25UeXBlKG5leHQubmV4dCkpIHsKICAgICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgICAgIGlmICgoIWlkZW50aWNhbCgnZ2V0JywgdmFsdWUpICYmCiAgICAgICAgICAgICFpZGVudGljYWwoJ3NldCcsIHZhbHVlKSAmJgogICAgICAgICAgICAhaWRlbnRpY2FsKCdmYWN0b3J5JywgdmFsdWUpICYmCiAgICAgICAgICAgICFpZGVudGljYWwoJ29wZXJhdG9yJywgdmFsdWUpICYmCiAgICAgICAgICAgICEoaWRlbnRpY2FsKCd0eXBlZGVmJywgdmFsdWUpICYmIG5leHQubmV4dC5pc0lkZW50aWZpZXIpKSkgewogICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4VHlwZUluZm8odG9rZW4sIHR5cGVQYXJhbU9yQXJnKQogICAgICAgICAgICAgIC5jb21wdXRlQnVpbHRpbk9yVmFyQXNUeXBlKHJlcXVpcmVkKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocmVxdWlyZWQpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgaWYgKG9wdGlvbmFsKCcuJywgbmV4dCkpIHsKICAgICAgICAvLyBMb29rcyBsaWtlIHByZWZpeGVkIHR5cGUgbWlzc2luZyB0aGUgcHJlZml4CiAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4VHlwZUluZm8oCiAgICAgICAgICAgICAgICB0b2tlbiwgY29tcHV0ZVR5cGVQYXJhbU9yQXJnKG5leHQsIGluRGVjbGFyYXRpb24pKQogICAgICAgICAgICAuY29tcHV0ZVByZWZpeGVkVHlwZShyZXF1aXJlZCk7CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3ZhcicsIG5leHQpICYmCiAgICAgICAgICBpc09uZU9mKG5leHQubmV4dCwgY29uc3QgWyc8JywgJywnLCAnPiddKSkgewogICAgICAgIHJldHVybiBuZXcgQ29tcGxleFR5cGVJbmZvKAogICAgICAgICAgICAgICAgdG9rZW4sIGNvbXB1dGVUeXBlUGFyYW1PckFyZyhuZXh0LCBpbkRlY2xhcmF0aW9uKSkKICAgICAgICAgICAgLmNvbXB1dGVCdWlsdGluT3JWYXJBc1R5cGUocmVxdWlyZWQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9UeXBlOwogIH0KCiAgaWYgKG9wdGlvbmFsKCd2b2lkJywgbmV4dCkpIHsKICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICBpZiAoaXNHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZShuZXh0KSkgewogICAgICAvLyBgdm9pZGAgYEZ1bmN0aW9uYCAuLi4KICAgICAgcmV0dXJuIG5ldyBDb21wbGV4VHlwZUluZm8odG9rZW4sIG5vVHlwZVBhcmFtT3JBcmcpCiAgICAgICAgICAuY29tcHV0ZVZvaWRHRlQocmVxdWlyZWQpOwogICAgfQogICAgLy8gYHZvaWRgCiAgICByZXR1cm4gdm9pZFR5cGU7CiAgfQoKICBpZiAoaXNHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZShuZXh0KSkgewogICAgLy8gYEZ1bmN0aW9uYCAuLi4KICAgIHJldHVybiBuZXcgQ29tcGxleFR5cGVJbmZvKHRva2VuLCBub1R5cGVQYXJhbU9yQXJnKQogICAgICAgIC5jb21wdXRlTm9UeXBlR0ZUKHRva2VuLCByZXF1aXJlZCk7CiAgfQoKICAvLyBXZSd2ZSBzZWVuIGFuIGlkZW50aWZpZXIuCgogIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlUGFyYW1PckFyZyA9CiAgICAgIGNvbXB1dGVUeXBlUGFyYW1PckFyZyhuZXh0LCBpbkRlY2xhcmF0aW9uKTsKICBpZiAodHlwZVBhcmFtT3JBcmcgIT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgaWYgKHR5cGVQYXJhbU9yQXJnLmlzU2ltcGxlVHlwZUFyZ3VtZW50KSB7CiAgICAgIC8vIFdlJ3ZlIHNlZW4gaWRlbnRpZmllciBgPGAgaWRlbnRpZmllciBgPmAKICAgICAgbmV4dCA9IHR5cGVQYXJhbU9yQXJnLnNraXAobmV4dCkubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCc/JywgbmV4dCkpIHsKICAgICAgICBuZXh0ID0gbmV4dC5uZXh0OwogICAgICAgIGlmICghaXNHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZShuZXh0KSkgewogICAgICAgICAgaWYgKChyZXF1aXJlZCB8fCBsb29rc0xpa2VOYW1lKG5leHQpKSAmJgogICAgICAgICAgICAgIHR5cGVQYXJhbU9yQXJnID09IHNpbXBsZVR5cGVBcmd1bWVudDEpIHsKICAgICAgICAgICAgLy8gaWRlbnRpZmllciBgPGAgaWRlbnRpZmllciBgPmAgYD9gIGlkZW50aWZpZXIKICAgICAgICAgICAgcmV0dXJuIHNpbXBsZU51bGxhYmxlVHlwZVdpdGgxQXJndW1lbnQ7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBpZGVudGlmaWVyIGA8YCBpZGVudGlmaWVyIGA+YCBgP2Agbm9uLWlkZW50aWZpZXIKICAgICAgICAgIHJldHVybiBub1R5cGU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFpc0dlbmVyYWxpemVkRnVuY3Rpb25UeXBlKG5leHQpKSB7CiAgICAgICAgaWYgKHJlcXVpcmVkIHx8IGxvb2tzTGlrZU5hbWUobmV4dCkpIHsKICAgICAgICAgIC8vIGlkZW50aWZpZXIgYDxgIGlkZW50aWZpZXIgYD5gIGlkZW50aWZpZXIKICAgICAgICAgIHJldHVybiB0eXBlUGFyYW1PckFyZy50eXBlSW5mbzsKICAgICAgICB9CiAgICAgICAgLy8gaWRlbnRpZmllciBgPGAgaWRlbnRpZmllciBgPmAgbm9uLWlkZW50aWZpZXIKICAgICAgICByZXR1cm4gbm9UeXBlOwogICAgICB9CiAgICB9CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgYWRkaW5nIGEgY29uc3QgZm9yCiAgICAvLyBpZGVudGlmaWVyIGA8YCBpZGVudGlmaWVyIGAsYCBpZGVudGlmaWVyIGA+YAogICAgLy8gaWYgdGhhdCBwcm92ZXMgdG8gYmUgYSBjb21tb24gY2FzZS4KCiAgICAvLyBpZGVudGlmaWVyIGA8YCAuLi4gYD5gCiAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlSW5mbyh0b2tlbiwgdHlwZVBhcmFtT3JBcmcpCiAgICAgICAgLmNvbXB1dGVTaW1wbGVXaXRoVHlwZUFyZ3VtZW50cyhyZXF1aXJlZCk7CiAgfQoKICBhc3NlcnQodHlwZVBhcmFtT3JBcmcgPT0gbm9UeXBlUGFyYW1PckFyZyk7CiAgbmV4dCA9IG5leHQubmV4dDsKICBpZiAob3B0aW9uYWwoJy4nLCBuZXh0KSkgewogICAgbmV4dCA9IG5leHQubmV4dDsKICAgIGlmIChpc1ZhbGlkVHlwZVJlZmVyZW5jZShuZXh0KSkgewogICAgICAvLyBXZSd2ZSBzZWVuIGlkZW50aWZpZXIgYC5gIGlkZW50aWZpZXIKICAgICAgdHlwZVBhcmFtT3JBcmcgPSBjb21wdXRlVHlwZVBhcmFtT3JBcmcobmV4dCwgaW5EZWNsYXJhdGlvbik7CiAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgIGlmICh0eXBlUGFyYW1PckFyZyA9PSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgaWYgKG9wdGlvbmFsKCc/JywgbmV4dCkpIHsKICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgICAgICBpZiAoIWlzR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGUobmV4dCkpIHsKICAgICAgICAgICAgaWYgKHJlcXVpcmVkIHx8IGxvb2tzTGlrZU5hbWUobmV4dCkpIHsKICAgICAgICAgICAgICAvLyBpZGVudGlmaWVyIGAuYCBpZGVudGlmaWVyIGA/YCBpZGVudGlmaWVyCiAgICAgICAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IGNvbnNpZGVyIGFkZGluZyBQcmVmaXhlZE51bGxhYmxlVHlwZQogICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBidWlsZCBjb21wbGV4IHR5cGUKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBpZGVudGlmaWVyIGAuYCBpZGVudGlmaWVyIGA/YCBub24taWRlbnRpZmllcgogICAgICAgICAgICAgIHJldHVybiBub1R5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKCFpc0dlbmVyYWxpemVkRnVuY3Rpb25UeXBlKG5leHQpKSB7CiAgICAgICAgICAgIGlmIChyZXF1aXJlZCB8fCBsb29rc0xpa2VOYW1lKG5leHQpKSB7CiAgICAgICAgICAgICAgLy8gaWRlbnRpZmllciBgLmAgaWRlbnRpZmllciBpZGVudGlmaWVyCiAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeGVkVHlwZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBpZGVudGlmaWVyIGAuYCBpZGVudGlmaWVyIG5vbi1pZGVudGlmaWVyCiAgICAgICAgICAgICAgcmV0dXJuIG5vVHlwZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvLyBpZGVudGlmaWVyIGAuYCBpZGVudGlmaWVyCiAgICAgIHJldHVybiBuZXcgQ29tcGxleFR5cGVJbmZvKHRva2VuLCB0eXBlUGFyYW1PckFyZykKICAgICAgICAgIC5jb21wdXRlUHJlZml4ZWRUeXBlKHJlcXVpcmVkKTsKICAgIH0KICAgIC8vIGlkZW50aWZpZXIgYC5gIG5vbi1pZGVudGlmaWVyCiAgICBpZiAocmVxdWlyZWQpIHsKICAgICAgdHlwZVBhcmFtT3JBcmcgPSBjb21wdXRlVHlwZVBhcmFtT3JBcmcodG9rZW4ubmV4dC5uZXh0LCBpbkRlY2xhcmF0aW9uKTsKICAgICAgcmV0dXJuIG5ldyBDb21wbGV4VHlwZUluZm8odG9rZW4sIHR5cGVQYXJhbU9yQXJnKQogICAgICAgICAgLmNvbXB1dGVQcmVmaXhlZFR5cGUocmVxdWlyZWQpOwogICAgfQogICAgcmV0dXJuIG5vVHlwZTsKICB9CgogIGFzc2VydCh0eXBlUGFyYW1PckFyZyA9PSBub1R5cGVQYXJhbU9yQXJnKTsKICBpZiAoaXNHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZShuZXh0KSkgewogICAgLy8gaWRlbnRpZmllciBgRnVuY3Rpb25gCiAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlSW5mbyh0b2tlbiwgbm9UeXBlUGFyYW1PckFyZykKICAgICAgICAuY29tcHV0ZUlkZW50aWZpZXJHRlQocmVxdWlyZWQpOwogIH0KCiAgaWYgKG9wdGlvbmFsKCc/JywgbmV4dCkpIHsKICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICBpZiAoaXNHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZShuZXh0KSkgewogICAgICAvLyBpZGVudGlmaWVyIGA/YCBGdW5jdGlvbiBgKGAKICAgICAgcmV0dXJuIG5ldyBDb21wbGV4VHlwZUluZm8odG9rZW4sIG5vVHlwZVBhcmFtT3JBcmcpCiAgICAgICAgICAuY29tcHV0ZUlkZW50aWZpZXJRdWVzdGlvbkdGVChyZXF1aXJlZCk7CiAgICB9IGVsc2UgaWYgKHJlcXVpcmVkIHx8IGxvb2tzTGlrZU5hbWUobmV4dCkpIHsKICAgICAgLy8gaWRlbnRpZmllciBgP2AKICAgICAgcmV0dXJuIHNpbXBsZU51bGxhYmxlVHlwZTsKICAgIH0KICB9IGVsc2UgaWYgKHJlcXVpcmVkIHx8IGxvb2tzTGlrZU5hbWUobmV4dCkpIHsKICAgIC8vIGlkZW50aWZpZXIgaWRlbnRpZmllcgogICAgcmV0dXJuIHNpbXBsZVR5cGU7CiAgfQogIHJldHVybiBub1R5cGU7Cn0KCi8vLyBDYWxsZWQgYnkgdGhlIHBhcnNlciB0byBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgYSBwb3NzaWJsZSBncm91cCBvZiB0eXBlCi8vLyBwYXJhbWV0ZXJzIG9yIHR5cGUgYXJndW1lbnRzIHRoYXQgZm9sbG93IFt0b2tlbl0uCi8vLyBUaGlzIGRvZXMgbm90IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtLgovLy8KLy8vIElmIFtpbkRlY2xhcmF0aW9uXSBpcyBgdHJ1ZWAsIHRoZW4gdGhpcyB3aWxsIG1vcmUgYWdncmVzc2l2ZWx5IHJlY292ZXIKLy8vIGdpdmVuIHVuYmFsYW5jZWQgYDxgIGA+YCBhbmQgaW52YWxpZCBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cy4KVHlwZVBhcmFtT3JBcmdJbmZvIGNvbXB1dGVUeXBlUGFyYW1PckFyZyhUb2tlbiB0b2tlbiwKICAgIFtib29sIGluRGVjbGFyYXRpb24gPSBmYWxzZV0pIHsKICBUb2tlbiBiZWdpbkdyb3VwID0gdG9rZW4ubmV4dDsKICBpZiAoIW9wdGlvbmFsKCc8JywgYmVnaW5Hcm91cCkpIHsKICAgIHJldHVybiBub1R5cGVQYXJhbU9yQXJnOwogIH0KCiAgLy8gaWRlbnRpZmllciBgPGAgYHZvaWRgIGA+YCBhbmQgYDxgIGBkeW5hbWljYCBgPmAKICAvLyBhcmUgaGFuZGxlZCBieSBDb21wbGV4VHlwZUluZm8uCiAgVG9rZW4gbmV4dCA9IGJlZ2luR3JvdXAubmV4dDsKICBpZiAoKG5leHQua2luZCA9PSBJREVOVElGSUVSX1RPS0VOIHx8IG5leHQudHlwZS5pc1BzZXVkbykpIHsKICAgIGlmIChvcHRpb25hbCgnPicsIG5leHQubmV4dCkpIHsKICAgICAgcmV0dXJuIHNpbXBsZVR5cGVBcmd1bWVudDE7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCc+PicsIG5leHQubmV4dCkpIHsKICAgICAgcmV0dXJuIHNpbXBsZVR5cGVBcmd1bWVudDFHdEd0OwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnPj0nLCBuZXh0Lm5leHQpKSB7CiAgICAgIHJldHVybiBzaW1wbGVUeXBlQXJndW1lbnQxR3RFcTsKICAgIH0KICB9IGVsc2UgaWYgKG9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgIHJldHVybiBub1R5cGVQYXJhbU9yQXJnOwogIH0KCiAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIGFkZGluZyBhZGRpdGlvbmFsIGNvbnN0IGZvciBjb21tb24gc2l0dWF0aW9ucy4KICByZXR1cm4gbmV3IENvbXBsZXhUeXBlUGFyYW1PckFyZ0luZm8odG9rZW4sIGluRGVjbGFyYXRpb24pLmNvbXB1dGUoKTsKfQoKLy8vIENhbGxlZCBieSB0aGUgcGFyc2VyIHRvIG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCBhIHBvc3NpYmxlIGdyb3VwIG9mIHR5cGUKLy8vIHR5cGUgYXJndW1lbnRzIHRoYXQgZm9sbG93IFt0b2tlbl0gYW5kIHRoYXQgYXJlIGZvbGxvd2VkIGJ5ICcoJy4KLy8vIFJldHVybnMgdGhlIHR5cGUgYXJndW1lbnRzIGlmIFt0b2tlbl0gbWF0Y2hlcyAnPCcgdHlwZSAoJywnIHR5cGUpKiAnPicgJygnLAovLy8gYW5kIG90aGVyd2lzZSByZXR1cm5zIFtub1R5cGVQYXJhbU9yQXJnXS4gVGhlIGZpbmFsICcoJyBpcyBub3QgcGFydCBvZiB0aGUKLy8vIGdyYW1tYXIgY29uc3RydWN0IGB0eXBlQXJndW1lbnRzYCwgYnV0IGl0IGlzIHJlcXVpcmVkIGhlcmUgc3VjaCB0aGF0IHR5cGUKLy8vIGFyZ3VtZW50cyBpbiBnZW5lcmljIG1ldGhvZCBpbnZvY2F0aW9ucyBjYW4gYmUgcmVjb2duaXplZCwgYW5kIGFzIGZldyBhcwovLy8gcG9zc2libGUgb3RoZXIgY29uc3RydWN0cyB3aWxsIHBhc3MgKGUuZy4sICdhIDwgQywgRCA+IDMnKS4KVHlwZVBhcmFtT3JBcmdJbmZvIGNvbXB1dGVNZXRob2RUeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVBcmcgPSBjb21wdXRlVHlwZVBhcmFtT3JBcmcodG9rZW4pOwogIHJldHVybiBvcHRpb25hbCgnKCcsIHR5cGVBcmcuc2tpcCh0b2tlbikubmV4dCkgPyB0eXBlQXJnIDogbm9UeXBlUGFyYW1PckFyZzsKfQqBWwBOTjwBIAE5AU8BIgEeASsBPycaSkoeAUlGSEUeATYXAVFOS00yNwFOTktNMjYBTU5ETjYBSk5ETS8BREhCHwIBO0cYJB4BRioBKh0BR0MaRwQBSU5JTTQBOzROSk00AUhQQhsCAUgwKAFJTEYBSiIsAS4oQAIBKRktHyEgHDkpJAQQAgFPQQRLQjckGyUfKjYwKkk8NApFKSkoLC1JPDQKCBsSITckQywqNyRDMggGEwQBIBYrHzolBg4VBAEpFjgsBAEfASYyLC8yLSEaMDM3PDQMPhkKNS82Kgo4FwgGMzQrAR42MwQBLhQdFiYuQxgwIxwyMzpGNBU+HQ4METIzNiMVOh0ODAoIIzgqBiUUTjgqBhMEAS4pHTgpBAEdFislOjMyGCEGMB0XBBECAU42KwRLQjYkISQdBAE1JSA/JCIsJiwmBiQdBAFNSAIBTkVQT05NQD09TwIBMXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvdHlwZV9pbmZvLmRhcnRIc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci9pZGVudGlmaWVyX2NvbnRleHRfaW1wbC5kYXJ0wACO1i8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uLy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgYXMgZmFzdGE7CgppbXBvcnQgJy4uL3NjYW5uZXIvdG9rZW5fY29uc3RhbnRzLmRhcnQnIHNob3cgSURFTlRJRklFUl9UT0tFTiwgU1RSSU5HX1RPS0VOOwoKaW1wb3J0ICdpZGVudGlmaWVyX2NvbnRleHQuZGFydCc7CgppbXBvcnQgJ3BhcnNlci5kYXJ0JyBzaG93IFBhcnNlcjsKCmltcG9ydCAndHlwZV9pbmZvLmRhcnQnIHNob3cgaXNWYWxpZFR5cGVSZWZlcmVuY2U7CgppbXBvcnQgJ3V0aWwuZGFydCcgc2hvdyBpc09uZU9mT3JFb2YsIG9wdGlvbmFsOwoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQuY2F0Y2hQYXJhbWV0ZXJdLgpjbGFzcyBDYXRjaFBhcmFtZXRlcklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IENhdGNoUGFyYW1ldGVySWRlbnRpZmllckNvbnRleHQoKSA6IHN1cGVyKCdjYXRjaFBhcmFtZXRlcicpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgY2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXIoaWRlbnRpZmllciwgcGFyc2VyKTsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKGlkZW50aWZpZXIsIGZhc3RhLm1lc3NhZ2VDYXRjaFN5bnRheCk7CiAgICBpZiAobG9va3NMaWtlU3RhdGVtZW50U3RhcnQoaWRlbnRpZmllcikgfHwKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgY29uc3QgWycsJywgJyknXSkpIHsKICAgICAgcmV0dXJuIHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuKTsKICAgIH0gZWxzZSBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgcmV0dXJuIHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5jbGFzc09yTWl4aW5PckV4dGVuc2lvbkRlY2xhcmF0aW9uXS4KY2xhc3MgQ2xhc3NPck1peGluT3JFeHRlbnNpb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBDbGFzc09yTWl4aW5PckV4dGVuc2lvbklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignY2xhc3NPck1peGluRGVjbGFyYXRpb24nLAogICAgICAgICAgICBpbkRlY2xhcmF0aW9uOiB0cnVlLCBpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDogZmFsc2UpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci50eXBlLmlzUHNldWRvKSB7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAobG9va3NMaWtlU3RhcnRPZk5leHRUb3BMZXZlbERlY2xhcmF0aW9uKGlkZW50aWZpZXIpIHx8CiAgICAgICAgaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsCiAgICAgICAgICAgIGNvbnN0IFsnPCcsICd7JywgJ2V4dGVuZHMnLCAnd2l0aCcsICdpbXBsZW1lbnRzJywgJ29uJ10pKSB7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICAgIG1lc3NhZ2U6IGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogICAgfSBlbHNlIGlmIChpZGVudGlmaWVyLnR5cGUuaXNCdWlsdEluKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQuY29tYmluYXRvcl0uCmNsYXNzIENvbWJpbmF0b3JJZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBDb21iaW5hdG9ySWRlbnRpZmllckNvbnRleHQoKSA6IHN1cGVyKCdjb21iaW5hdG9yJyk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGNvbnN0IGZvbGxvd2luZ1ZhbHVlcyA9IGNvbnN0IFsnOycsICcsJywgJ2lmJywgJ2FzJywgJ3Nob3cnLCAnaGlkZSddOwoKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICBpZiAoIWxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihpZGVudGlmaWVyKSB8fAogICAgICAgICAgaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIubmV4dCwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgICB9CiAgICAgIC8vIEFsdGhvdWdoIHRoaXMgaXMgYSB2YWxpZCBpZGVudGlmaWVyIG5hbWUsIHRoZSBpbXBvcnQgZGVjbGFyYXRpb24KICAgICAgLy8gaXMgaW52YWxpZCBhbmQgdGhpcyBsb29rcyBsaWtlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBkZWNsYXJhdGlvbi4KICAgICAgLy8gSW4gdGhpcyBzaXR1YXRpb24sIGZhbGwgdGhyb3VnaCB0byBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllci4KICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBmb2xsb3dpbmdWYWx1ZXMpIHx8CiAgICAgICAgbG9va3NMaWtlU3RhcnRPZk5leHRUb3BMZXZlbERlY2xhcmF0aW9uKGlkZW50aWZpZXIpKSB7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICAgIG1lc3NhZ2U6IGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQuY29uc3RydWN0b3JSZWZlcmVuY2VdCi8vLyBhbmQgW0lkZW50aWZpZXJDb250ZXh0LmNvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uXQovLy8gYW5kIFtJZGVudGlmaWVyQ29udGV4dC5jb25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50c10uCmNsYXNzIENvbnN0cnVjdG9yUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgQ29uc3RydWN0b3JSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dCgpCiAgICAgIDogc3VwZXIoJ2NvbnN0cnVjdG9yUmVmZXJlbmNlJywgaXNTY29wZVJlZmVyZW5jZTogdHJ1ZSk7CgogIGNvbnN0IENvbnN0cnVjdG9yUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCkKICAgICAgOiBzdXBlcignY29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb24nLCBpc0NvbnRpbnVhdGlvbjogdHJ1ZSk7CgogIGNvbnN0IENvbnN0cnVjdG9yUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzKCkKICAgICAgOiBzdXBlcignY29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHMnLAogICAgICAgICAgICBpc0NvbnRpbnVhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICBjaGVja0FzeW5jQXdhaXRZaWVsZEFzSWRlbnRpZmllcihpZGVudGlmaWVyLCBwYXJzZXIpOwogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5kb3R0ZWROYW1lXS4KY2xhc3MgRG90dGVkTmFtZUlkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IERvdHRlZE5hbWVJZGVudGlmaWVyQ29udGV4dCgpIDogc3VwZXIoJ2RvdHRlZE5hbWUnKTsKCiAgY29uc3QgRG90dGVkTmFtZUlkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpCiAgICAgIDogc3VwZXIoJ2RvdHRlZE5hbWVDb250aW51YXRpb24nLCBpc0NvbnRpbnVhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGNvbnN0IGZvbGxvd2luZ1ZhbHVlcyA9IGNvbnN0IFsnLicsICc9PScsICcpJ107CgogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIC8vIERvdHRlZE5hbWVJZGVudGlmaWVyQ29udGV4dCBhcmUgb25seSB1c2VkIGluIGNvbmRpdGlvbmFsIGltcG9ydAogICAgICAvLyBleHByZXNzaW9ucy4gQWx0aG91Z2ggc29tZSB0b3AgbGV2ZWwga2V5d29yZHMgc3VjaCBhcyBgaW1wb3J0YCBjYW4gYmUKICAgICAgLy8gdXNlZCBhcyBpZGVudGlmaWVycywgdGhleSBhcmUgbW9yZSBsaWtlbHkgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0CiAgICAgIC8vIGRpcmVjdGl2ZSBvciBkZWNsYXJhdGlvbi4KICAgICAgaWYgKCFpZGVudGlmaWVyLmlzVG9wTGV2ZWxLZXl3b3JkIHx8CiAgICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllci5uZXh0LCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICAgIH0KICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihpZGVudGlmaWVyKSB8fAogICAgICAgIGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICAgIG1lc3NhZ2U6IGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQuZW51bURlY2xhcmF0aW9uXS4KY2xhc3MgRW51bURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgRW51bURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdlbnVtRGVjbGFyYXRpb24nLAogICAgICAgICAgICBpbkRlY2xhcmF0aW9uOiB0cnVlLCBpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDogZmFsc2UpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci50eXBlLmlzUHNldWRvKSB7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAobG9va3NMaWtlU3RhcnRPZk5leHRUb3BMZXZlbERlY2xhcmF0aW9uKGlkZW50aWZpZXIpIHx8CiAgICAgICAgaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGNvbnN0IFsneyddKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpZmllci50eXBlLmlzQnVpbHRJbikgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGZhc3RhLnRlbXBsYXRlQnVpbHRJbklkZW50aWZpZXJJbkRlY2xhcmF0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmVudW1WYWx1ZURlY2xhcmF0aW9uXS4KY2xhc3MgRW51bVZhbHVlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBFbnVtVmFsdWVEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignZW51bVZhbHVlRGVjbGFyYXRpb24nLCBpbkRlY2xhcmF0aW9uOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICBpZiAobG9va3NMaWtlU3RhcnRPZk5leHRUb3BMZXZlbERlY2xhcmF0aW9uKGlkZW50aWZpZXIpIHx8CiAgICAgICAgaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGNvbnN0IFsnLCcsICd9J10pKSB7CiAgICAgIHJldHVybiBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbik7CiAgICB9IGVsc2UgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgIHJldHVybiBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQuZXhwcmVzc2lvbl0uCmNsYXNzIEV4cHJlc3Npb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBFeHByZXNzaW9uSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdleHByZXNzaW9uJywgaXNTY29wZVJlZmVyZW5jZTogdHJ1ZSk7CgogIGNvbnN0IEV4cHJlc3Npb25JZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKQogICAgICA6IHN1cGVyKCdleHByZXNzaW9uQ29udGludWF0aW9uJywgaXNDb250aW51YXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgaWYgKG9wdGlvbmFsKCdhd2FpdCcsIGlkZW50aWZpZXIpICYmIGlkZW50aWZpZXIubmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgICAvLyBBbHRob3VnaCB0aGUgYGF3YWl0YCBjYW4gYmUgdXNlZCBpbiBhbiBleHByZXNzaW9uLAogICAgICAgIC8vIGl0IGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgaWRlbnRpZmllciB3aGljaCBkb2VzIG5vdCBmb3JtCiAgICAgICAgLy8gYSB2YWxpZCBleHByZXNzaW9uLiBSZXBvcnQgYW4gZXJyb3Igb24gdGhlIGBhd2FpdGAgdG9rZW4KICAgICAgICAvLyByYXRoZXIgdGhhbiB0aGUgdG9rZW4gZm9sbG93aW5nIGl0LgogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CgogICAgICAgIC8vIFRPRE8oZGFucnViZWwpIENvbnNpZGVyIGEgbmV3IGxpc3RlbmVyIGV2ZW50IHNvIHRoYXQgYW5hbHl6ZXIKICAgICAgICAvLyBjYW4gcmVwcmVzZW50IHRoaXMgYXMgYW4gYXdhaXQgZXhwcmVzc2lvbiBpbiBhIGNvbnRleHQgdGhhdCBkb2VzCiAgICAgICAgLy8gbm90IGFsbG93IGF3YWl0LgogICAgICAgIHJldHVybiBpZGVudGlmaWVyLm5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXIoaWRlbnRpZmllciwgcGFyc2VyKTsKICAgICAgfQogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgaWYgKCFsb29rc0xpa2VTdGF0ZW1lbnRTdGFydChpZGVudGlmaWVyKSkgewogICAgICBpZiAoaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICBpZiAoaXNDb250aW51YXRpb24gfHwgIWlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBjb25zdCBbJ2FzJywgJ2lzJ10pKSB7CiAgICAgICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIWlkZW50aWZpZXIuaXNPcGVyYXRvciAmJgogICAgICAgICAgIWlzT25lT2ZPckVvZihpZGVudGlmaWVyLAogICAgICAgICAgICAgIGNvbnN0IFsnLicsICcsJywgJygnLCAnKScsICdbJywgJ10nLCAnfScsICc/JywgJzonLCAnOyddKSkgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgdG9rZW4gPSBpZGVudGlmaWVyOwogICAgICAgIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICB9CiAgICAvLyBJbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgIHJldHVybiBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbik7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5maWVsZERlY2xhcmF0aW9uXS4KY2xhc3MgRmllbGREZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IEZpZWxkRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpCiAgICAgIDogc3VwZXIoJ2ZpZWxkRGVjbGFyYXRpb24nLCBpbkRlY2xhcmF0aW9uOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGNvbnN0IFsnOycsICc9JywgJywnLCAnfSddKSB8fAogICAgICAgIGxvb2tzTGlrZVN0YXJ0T2ZOZXh0Q2xhc3NNZW1iZXIoaWRlbnRpZmllcikpIHsKICAgICAgcmV0dXJuIHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzKTsKICAgIH0gZWxzZSBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgcmV0dXJuIHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIsIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpLAogICAgICAgICAgbWVzc2FnZU9uVG9rZW46IGlkZW50aWZpZXIpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQuZmllbGRJbml0aWFsaXplcl0uCmNsYXNzIEZpZWxkSW5pdGlhbGl6ZXJJZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBGaWVsZEluaXRpYWxpemVySWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdmaWVsZEluaXRpYWxpemVyJywgaXNDb250aW51YXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJy4nLCB0b2tlbikpOwogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAvLyBJbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgIHJldHVybiBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbik7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5mb3JtYWxQYXJhbWV0ZXJEZWNsYXJhdGlvbl0uCmNsYXNzIEZvcm1hbFBhcmFtZXRlckRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgRm9ybWFsUGFyYW1ldGVyRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpCiAgICAgIDogc3VwZXIoJ2Zvcm1hbFBhcmFtZXRlckRlY2xhcmF0aW9uJywgaW5EZWNsYXJhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICBjaGVja0FzeW5jQXdhaXRZaWVsZEFzSWRlbnRpZmllcihpZGVudGlmaWVyLCBwYXJzZXIpOwogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgY29uc3QgZm9sbG93aW5nVmFsdWVzID0gY29uc3QgWyc6JywgJz0nLCAnLCcsICcoJywgJyknLCAnWycsICddJywgJ3snLCAnfSddOwogICAgaWYgKGxvb2tzTGlrZVN0YXJ0T2ZOZXh0Q2xhc3NNZW1iZXIoaWRlbnRpZmllcikgfHwKICAgICAgICBsb29rc0xpa2VTdGF0ZW1lbnRTdGFydChpZGVudGlmaWVyKSB8fAogICAgICAgIGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICAgIG1lc3NhZ2U6IGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQuaW1wb3J0UHJlZml4RGVjbGFyYXRpb25dLgpjbGFzcyBJbXBvcnRQcmVmaXhJZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBJbXBvcnRQcmVmaXhJZGVudGlmaWVyQ29udGV4dCgpCiAgICAgIDogc3VwZXIoJ2ltcG9ydFByZWZpeERlY2xhcmF0aW9uJywKICAgICAgICAgICAgaW5EZWNsYXJhdGlvbjogdHJ1ZSwgaXNCdWlsdEluSWRlbnRpZmllckFsbG93ZWQ6IGZhbHNlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIudHlwZS5pc1BzZXVkbykgewogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgY29uc3QgZm9sbG93aW5nVmFsdWVzID0gY29uc3QgWyc7JywgJ2lmJywgJ3Nob3cnLCAnaGlkZScsICdkZWZlcnJlZCcsICdhcyddOwogICAgaWYgKGlkZW50aWZpZXIudHlwZS5pc0J1aWx0SW4gJiYKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllci5uZXh0LCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24pOwogICAgfSBlbHNlIGlmIChsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCmNsYXNzIExpdGVyYWxTeW1ib2xJZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBMaXRlcmFsU3ltYm9sSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdsaXRlcmFsU3ltYm9sJywgaW5TeW1ib2w6IHRydWUpOwoKICBjb25zdCBMaXRlcmFsU3ltYm9sSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCkKICAgICAgOiBzdXBlcignbGl0ZXJhbFN5bWJvbENvbnRpbnVhdGlvbicsCiAgICAgICAgICAgIGluU3ltYm9sOiB0cnVlLCBpc0NvbnRpbnVhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgcmV0dXJuIHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgIG1lc3NhZ2U6IGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQubG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uXQovLy8gYW5kIFtJZGVudGlmaWVyQ29udGV4dC5sb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25Db250aW51YXRpb25dLgpjbGFzcyBMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpCiAgICAgIDogc3VwZXIoJ2xvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbicsIGluRGVjbGFyYXRpb246IHRydWUpOwoKICBjb25zdCBMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKQogICAgICA6IHN1cGVyKCdsb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25Db250aW51YXRpb24nLAogICAgICAgICAgICBpbkRlY2xhcmF0aW9uOiB0cnVlLCBpc0NvbnRpbnVhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICBjaGVja0FzeW5jQXdhaXRZaWVsZEFzSWRlbnRpZmllcihpZGVudGlmaWVyLCBwYXJzZXIpOwogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBjb25zdCBbJy4nLCAnKCcsICd7JywgJz0+J10pIHx8CiAgICAgICAgbG9va3NMaWtlU3RhdGVtZW50U3RhcnQoaWRlbnRpZmllcikpIHsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5sYWJlbERlY2xhcmF0aW9uXS4KY2xhc3MgTGFiZWxEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IExhYmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpCiAgICAgIDogc3VwZXIoJ2xhYmVsRGVjbGFyYXRpb24nLCBpbkRlY2xhcmF0aW9uOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIGNoZWNrQXN5bmNBd2FpdFlpZWxkQXNJZGVudGlmaWVyKGlkZW50aWZpZXIsIHBhcnNlcik7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGNvbnN0IFsnOiddKSB8fAogICAgICAgIGxvb2tzTGlrZVN0YXRlbWVudFN0YXJ0KGlkZW50aWZpZXIpKSB7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICAgIG1lc3NhZ2U6IGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQubGFiZWxSZWZlcmVuY2VdLgpjbGFzcyBMYWJlbFJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IExhYmVsUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKSA6IHN1cGVyKCdsYWJlbFJlZmVyZW5jZScpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgY2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXIoaWRlbnRpZmllciwgcGFyc2VyKTsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgY29uc3QgWyc7J10pKSB7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICAgIG1lc3NhZ2U6IGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQubGlicmFyeU5hbWVdLAovLy8gYW5kIFtJZGVudGlmaWVyQ29udGV4dC5saWJyYXJ5TmFtZUNvbnRpbnVhdGlvbl0KLy8vIGFuZCBbSWRlbnRpZmllckNvbnRleHQucGFydE5hbWVdLAovLy8gYW5kIFtJZGVudGlmaWVyQ29udGV4dC5wYXJ0TmFtZUNvbnRpbnVhdGlvbl0uCmNsYXNzIExpYnJhcnlJZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBMaWJyYXJ5SWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdsaWJyYXJ5TmFtZScsIGluTGlicmFyeU9yUGFydE9mRGVjbGFyYXRpb246IHRydWUpOwoKICBjb25zdCBMaWJyYXJ5SWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCkKICAgICAgOiBzdXBlcignbGlicmFyeU5hbWVDb250aW51YXRpb24nLAogICAgICAgICAgICBpbkxpYnJhcnlPclBhcnRPZkRlY2xhcmF0aW9uOiB0cnVlLCBpc0NvbnRpbnVhdGlvbjogdHJ1ZSk7CgogIGNvbnN0IExpYnJhcnlJZGVudGlmaWVyQ29udGV4dC5wYXJ0TmFtZSgpCiAgICAgIDogc3VwZXIoJ3BhcnROYW1lJywgaW5MaWJyYXJ5T3JQYXJ0T2ZEZWNsYXJhdGlvbjogdHJ1ZSk7CgogIGNvbnN0IExpYnJhcnlJZGVudGlmaWVyQ29udGV4dC5wYXJ0TmFtZUNvbnRpbnVhdGlvbigpCiAgICAgIDogc3VwZXIoJ3BhcnROYW1lQ29udGludWF0aW9uJywKICAgICAgICAgICAgaW5MaWJyYXJ5T3JQYXJ0T2ZEZWNsYXJhdGlvbjogdHJ1ZSwgaXNDb250aW51YXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBjb25zdCBmb2xsb3dpbmdWYWx1ZXMgPSBjb25zdCBbJy4nLCAnOyddOwoKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICBUb2tlbiBuZXh0ID0gaWRlbnRpZmllci5uZXh0OwogICAgICBpZiAoIWxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihpZGVudGlmaWVyKSB8fAogICAgICAgICAgaXNPbmVPZk9yRW9mKG5leHQsIGZvbGxvd2luZ1ZhbHVlcykpIHsKICAgICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgICAgfQogICAgICAvLyBBbHRob3VnaCB0aGlzIGlzIGEgdmFsaWQgbGlicmFyeSBuYW1lLCB0aGUgbGlicmFyeSBkZWNsYXJhdGlvbgogICAgICAvLyBpcyBpbnZhbGlkIGFuZCB0aGlzIGxvb2tzIGxpa2UgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGRlY2xhcmF0aW9uLgogICAgICAvLyBJbiB0aGlzIHNpdHVhdGlvbiwgZmFsbCB0aHJvdWdoIHRvIGluc2VydCBhIHN5bnRoZXRpYyBsaWJyYXJ5IG5hbWUuCiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgZm9sbG93aW5nVmFsdWVzKSB8fAogICAgICAgIGxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihpZGVudGlmaWVyKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbl0uCmNsYXNzIExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignbG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uJywgaW5EZWNsYXJhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICBjaGVja0FzeW5jQXdhaXRZaWVsZEFzSWRlbnRpZmllcihpZGVudGlmaWVyLCBwYXJzZXIpOwogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBjb25zdCBbJzsnLCAnPScsICcsJywgJ3snLCAnfSddKSB8fAogICAgICAgIGxvb2tzTGlrZVN0YXRlbWVudFN0YXJ0KGlkZW50aWZpZXIpIHx8CiAgICAgICAgaWRlbnRpZmllci5raW5kID09IFNUUklOR19UT0tFTikgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0Lm1ldGFkYXRhUmVmZXJlbmNlXQovLy8gYW5kIFtJZGVudGlmaWVyQ29udGV4dC5tZXRhZGF0YUNvbnRpbnVhdGlvbl0KLy8vIGFuZCBbSWRlbnRpZmllckNvbnRleHQubWV0YWRhdGFDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNdLgpjbGFzcyBNZXRhZGF0YVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IE1ldGFkYXRhUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdtZXRhZGF0YVJlZmVyZW5jZScsIGlzU2NvcGVSZWZlcmVuY2U6IHRydWUpOwoKICBjb25zdCBNZXRhZGF0YVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpCiAgICAgIDogc3VwZXIoJ21ldGFkYXRhQ29udGludWF0aW9uJywgaXNDb250aW51YXRpb246IHRydWUpOwoKICBjb25zdCBNZXRhZGF0YVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cygpCiAgICAgIDogc3VwZXIoJ21ldGFkYXRhQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzJywgaXNDb250aW51YXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgY2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXIoaWRlbnRpZmllciwgcGFyc2VyKTsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgY29uc3QgWyd7JywgJ30nLCAnKCcsICcpJywgJ10nXSkgfHwKICAgICAgICBsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICBsb29rc0xpa2VTdGFydE9mTmV4dENsYXNzTWVtYmVyKGlkZW50aWZpZXIpIHx8CiAgICAgICAgbG9va3NMaWtlU3RhdGVtZW50U3RhcnQoaWRlbnRpZmllcikpIHsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5tZXRob2REZWNsYXJhdGlvbl0sCi8vLyBhbmQgW0lkZW50aWZpZXJDb250ZXh0Lm1ldGhvZERlY2xhcmF0aW9uQ29udGludWF0aW9uXSwKLy8vIGFuZCBbSWRlbnRpZmllckNvbnRleHQub3BlcmF0b3JOYW1lXS4KY2xhc3MgTWV0aG9kRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBNZXRob2REZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignbWV0aG9kRGVjbGFyYXRpb24nLCBpbkRlY2xhcmF0aW9uOiB0cnVlKTsKCiAgY29uc3QgTWV0aG9kRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKQogICAgICA6IHN1cGVyKCdtZXRob2REZWNsYXJhdGlvbkNvbnRpbnVhdGlvbicsCiAgICAgICAgICAgIGluRGVjbGFyYXRpb246IHRydWUsIGlzQ29udGludWF0aW9uOiB0cnVlKTsKCiAgY29uc3QgTWV0aG9kRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dC5vcGVyYXRvck5hbWUoKQogICAgICA6IHN1cGVyKCdvcGVyYXRvck5hbWUnLCBpbkRlY2xhcmF0aW9uOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoaWRlbnRpZmllci5pc1VzZXJEZWZpbmFibGVPcGVyYXRvciAmJiAhaXNDb250aW51YXRpb24pIHsKICAgICAgcmV0dXJuIHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIsIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS5tZXNzYWdlTWlzc2luZ09wZXJhdG9yS2V5d29yZCwKICAgICAgICAgIG1lc3NhZ2VPblRva2VuOiBpZGVudGlmaWVyKTsKICAgIH0gZWxzZSBpZiAoaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGNvbnN0IFsnLicsICcoJywgJ3snLCAnPT4nLCAnfSddKSB8fAogICAgICAgIGxvb2tzTGlrZVN0YXJ0T2ZOZXh0Q2xhc3NNZW1iZXIoaWRlbnRpZmllcikpIHsKICAgICAgcmV0dXJuIHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzKTsKICAgIH0gZWxzZSBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgcmV0dXJuIHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIsIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpLAogICAgICAgICAgbWVzc2FnZU9uVG9rZW46IGlkZW50aWZpZXIpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQubmFtZWRBcmd1bWVudFJlZmVyZW5jZV0uCmNsYXNzIE5hbWVkQXJndW1lbnRSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBOYW1lZEFyZ3VtZW50UmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCduYW1lZEFyZ3VtZW50UmVmZXJlbmNlJywgYWxsb3dlZEluQ29uc3RhbnRFeHByZXNzaW9uOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIGNoZWNrQXN5bmNBd2FpdFlpZWxkQXNJZGVudGlmaWVyKGlkZW50aWZpZXIsIHBhcnNlcik7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGNvbnN0IFsnOiddKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LnRvcExldmVsRnVuY3Rpb25EZWNsYXJhdGlvbl0KLy8vIGFuZCBbSWRlbnRpZmllckNvbnRleHQudG9wTGV2ZWxWYXJpYWJsZURlY2xhcmF0aW9uXS4KY2xhc3MgVG9wTGV2ZWxEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGZpbmFsIExpc3Q8U3RyaW5nPiBmb2xsb3dpbmdWYWx1ZXM7CgogIGNvbnN0IFRvcExldmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dChTdHJpbmcgbmFtZSwgdGhpcy5mb2xsb3dpbmdWYWx1ZXMpCiAgICAgIDogc3VwZXIobmFtZSwgaW5EZWNsYXJhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKCiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgVG9rZW4gbmV4dCA9IGlkZW50aWZpZXIubmV4dDsKICAgICAgaWYgKCFsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICAgIGlzT25lT2ZPckVvZihuZXh0LCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICAgIH0KICAgICAgLy8gQWx0aG91Z2ggdGhpcyBpcyBhIHZhbGlkIHRvcCBsZXZlbCBuYW1lLCB0aGUgZGVjbGFyYXRpb24KICAgICAgLy8gaXMgaW52YWxpZCBhbmQgdGhpcyBsb29rcyBsaWtlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBkZWNsYXJhdGlvbi4KICAgICAgLy8gSW4gdGhpcyBzaXR1YXRpb24sIGZhbGwgdGhyb3VnaCB0byBpbnNlcnQgYSBzeW50aGV0aWMgbmFtZS4KICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihpZGVudGlmaWVyKSB8fAogICAgICAgIGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICAgIG1lc3NhZ2U6IGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogICAgfSBlbHNlIGlmIChpZGVudGlmaWVyLnR5cGUuaXNCdWlsdEluKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQudHlwZWRlZkRlY2xhcmF0aW9uXS4KY2xhc3MgVHlwZWRlZkRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgVHlwZWRlZkRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCd0eXBlZGVmRGVjbGFyYXRpb24nLAogICAgICAgICAgICBpbkRlY2xhcmF0aW9uOiB0cnVlLCBpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDogZmFsc2UpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci50eXBlLmlzUHNldWRvKSB7CiAgICAgIGlmIChvcHRpb25hbCgnRnVuY3Rpb24nLCBpZGVudGlmaWVyKSkgewogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIH0KICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGNvbnN0IGZvbGxvd2luZ1ZhbHVlcyA9IGNvbnN0IFsnKCcsICc8JywgJz0nLCAnOyddOwogICAgaWYgKGlkZW50aWZpZXIudHlwZS5pc0J1aWx0SW4gJiYKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllci5uZXh0LCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24pOwogICAgfSBlbHNlIGlmIChsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LnR5cGVSZWZlcmVuY2VdLgpjbGFzcyBUeXBlUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgVHlwZVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcigndHlwZVJlZmVyZW5jZScsCiAgICAgICAgICAgIGlzU2NvcGVSZWZlcmVuY2U6IHRydWUsCiAgICAgICAgICAgIGlzQnVpbHRJbklkZW50aWZpZXJBbGxvd2VkOiBmYWxzZSwKICAgICAgICAgICAgcmVjb3ZlcnlUZW1wbGF0ZTogZmFzdGEudGVtcGxhdGVFeHBlY3RlZFR5cGUpOwoKICBjb25zdCBUeXBlUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCkKICAgICAgOiBzdXBlcigndHlwZVJlZmVyZW5jZUNvbnRpbnVhdGlvbicsCiAgICAgICAgICAgIGlzQ29udGludWF0aW9uOiB0cnVlLCBpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDogZmFsc2UpOwoKICBjb25zdCBUeXBlUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQucHJlZml4ZWQoKQogICAgICA6IHN1cGVyKCdwcmVmaXhlZFR5cGVSZWZlcmVuY2UnLAogICAgICAgICAgICBpc1Njb3BlUmVmZXJlbmNlOiB0cnVlLAogICAgICAgICAgICBpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDogdHJ1ZSwKICAgICAgICAgICAgcmVjb3ZlcnlUZW1wbGF0ZTogZmFzdGEudGVtcGxhdGVFeHBlY3RlZFR5cGUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChuZXh0LmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaXNWYWxpZFR5cGVSZWZlcmVuY2UobmV4dCkpIHsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9IGVsc2UgaWYgKG5leHQuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgIGlmIChvcHRpb25hbCgidm9pZCIsIG5leHQpKSB7CiAgICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgZmFzdGEubWVzc2FnZUludmFsaWRWb2lkKTsKICAgICAgfSBlbHNlIGlmIChuZXh0LnR5cGUuaXNCdWlsdEluKSB7CiAgICAgICAgaWYgKCFpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZCkgewogICAgICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckFzVHlwZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCd2YXInLCBuZXh0KSkgewogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGZhc3RhLm1lc3NhZ2VWYXJBc1R5cGVOYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgbmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZFR5cGUpOwogICAgICB9CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4obmV4dCwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZFR5cGUpOwogICAgaWYgKCFpc09uZU9mT3JFb2YoCiAgICAgICAgbmV4dCwgY29uc3QgWyc+JywgJyknLCAnWycsICddJywgJ1tdJywgJ3snLCAnfScsICcsJywgJzsnXSkpIHsKICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgdG9rZW4gPSBuZXh0OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIC8vIEluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgcmV0dXJuIHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuKTsKICB9Cn0KCi8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQudHlwZVZhcmlhYmxlRGVjbGFyYXRpb25dLgpjbGFzcyBUeXBlVmFyaWFibGVEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IFR5cGVWYXJpYWJsZURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCd0eXBlVmFyaWFibGVEZWNsYXJhdGlvbicsCiAgICAgICAgICAgIGluRGVjbGFyYXRpb246IHRydWUsIGlzQnVpbHRJbklkZW50aWZpZXJBbGxvd2VkOiBmYWxzZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLnR5cGUuaXNQc2V1ZG8pIHsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGNvbnN0IGZvbGxvd2luZ1ZhbHVlcyA9IGNvbnN0IFsnPCcsICc+JywgJzsnLCAnfScsICdleHRlbmRzJywgJ3N1cGVyJ107CiAgICBpZiAobG9va3NMaWtlU3RhcnRPZk5leHRUb3BMZXZlbERlY2xhcmF0aW9uKGlkZW50aWZpZXIpIHx8CiAgICAgICAgbG9va3NMaWtlU3RhcnRPZk5leHRDbGFzc01lbWJlcihpZGVudGlmaWVyKSB8fAogICAgICAgIGxvb2tzTGlrZVN0YXRlbWVudFN0YXJ0KGlkZW50aWZpZXIpIHx8CiAgICAgICAgaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGZvbGxvd2luZ1ZhbHVlcykpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWZpZXIudHlwZS5pc0J1aWx0SW4pIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBmYXN0YS50ZW1wbGF0ZUJ1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbik7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9Cgp2b2lkIGNoZWNrQXN5bmNBd2FpdFlpZWxkQXNJZGVudGlmaWVyKFRva2VuIGlkZW50aWZpZXIsIFBhcnNlciBwYXJzZXIpIHsKICBpZiAoIXBhcnNlci5pblBsYWluU3luYyAmJiBpZGVudGlmaWVyLnR5cGUuaXNQc2V1ZG8pIHsKICAgIGlmIChvcHRpb25hbCgnYXdhaXQnLCBpZGVudGlmaWVyKSkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcihpZGVudGlmaWVyLCBmYXN0YS5tZXNzYWdlQXdhaXRBc0lkZW50aWZpZXIpOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgneWllbGQnLCBpZGVudGlmaWVyKSkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcihpZGVudGlmaWVyLCBmYXN0YS5tZXNzYWdlWWllbGRBc0lkZW50aWZpZXIpOwogICAgfQogIH0KfQoKYm9vbCBsb29rc0xpa2VTdGFydE9mTmV4dENsYXNzTWVtYmVyKFRva2VuIHRva2VuKSA9PgogICAgdG9rZW4uaXNNb2RpZmllciB8fCBpc09uZU9mT3JFb2YodG9rZW4sIGNvbnN0IFsnQCcsICdnZXQnLCAnc2V0JywgJ3ZvaWQnXSk7Cgpib29sIGxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgPT4KICAgIHRva2VuLmlzVG9wTGV2ZWxLZXl3b3JkIHx8CiAgICBpc09uZU9mT3JFb2YodG9rZW4sIGNvbnN0IFsnY29uc3QnLCAnZ2V0JywgJ2ZpbmFsJywgJ3NldCcsICd2YXInLCAndm9pZCddKTsKg7sATk48AS4BJwFOASIBIgEzATABLEJFAQw3IzEjPBkGARBJLzY/NEVBRAYXBAIBQEszKUUBDDcjMSQZBgEQPyFIQVAsLkUNLjkvR0NMCAYXBAIBKD49AQw3IzFKASNCPBsISktLBgEQNT9BUA0uOS9HQ0wIBhcEAgExPVBIMD8BPUkBT0QjAQw3IzEjPBkGARAtQVANLjkGFwQCASg+PQEzPwEMNyMxNAEjSU9JIys8GwgGARA/NUFQDS45L0dDTAgGFwQCAS1DKyFFAQw3IzEkGQYBED8xQVAsLkUNLjkvR0NMCAYXBAIBMkgwPAEMNyMxIxkGARAsNz82PzRFQUQGFwQCASg+JjUBMz8BDDcjMSNLPkRELzA4AUlMHCAPPggZBgEQLDcwLk8dCiskS0ccIQgGOz0EAgEuRCw4AQw3IzEjGQYBEEA3PDRFQUBPJw0uORkGBAIBLkQsOQEMNyIjMSMZBgEQLDc7PQQCAThONkIBDDcjMSM8GQYBEFE3LzVBUA0uOS9HQ0wIBhcEAgE1QCgpRQEMNyMxJBkGARBRJTouRUY1QVANLjkvR0NMCAYXBAIBQSkwATYrMwEMNyMxIxkGARA5TgQCATVCTDRAAUE2OAEMNyMxIzwZBgEQQS9BUA0uOS9HQ0wIBhcEAgEuRCw4AQw3IzEjPBkGARAxL0FQDS45L0dDTAgGFwQCASxCRQEMNyMxIzwZBgEQMUFQDS45L0dDTAgGFwQCASk0JjI7I0IBMClHASw/ATgmRwEMNyMxLgEjJEIxGwhIS00GARA1P0FQDS45L0dDTAgGFwQCATZMNEABDDcjMSM8GQYBEEUvK0FQDS45L0dDTAgGFwQCAS4xREUtPAE6PQFMTwEMNyMxIzwZBgEQRT83L0FQDS45L0dDTAgGFwQCAS87KkUtOQE6LzgBOjQBDDcjMSMZBgEQQUA4J003PDRFQUBPJw0uORkGBAIBNEoyTAEMNyMxIzwZBgEQMUFQDS45L0dDTAgGFwQCATg5RyYBUCoBDDcjMQEjJEIxGwhCS0UGARA/NUFQLC5FDS45L0dDTAgGFwQCATBGLiRFAQw3IzEkLjA7CBkGARA4JTouRUY1QVANLjkvR0NMCAYXBAIBK0EpHyQvOwE2K0YBMickLjsBDDcdKyYTLSRHKCsyPAoqSQ8wLwgTBk4XR0UUGQY7PQQCATRLMylFAQw3IzEkGQYBEEw/Ny81LjlFLC5FDS45L0dDTAgGFwQCAUk5KVEwUQYEAgE1UAE9H1ABP3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvaWRlbnRpZmllcl9jb250ZXh0X2ltcGwuZGFydE1zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19lbWl0dGVyL3Byb2dyYW1fYnVpbGRlci9wcm9ncmFtX2J1aWxkZXIuZGFydMAAulEvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX2VtaXR0ZXIucHJvZ3JhbV9idWlsZGVyOwoKaW1wb3J0ICdkYXJ0OmlvJzsKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cganNvbkRlY29kZTsKCmltcG9ydCAnLi4vLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uLy4uL2NvbW1vbi9uYW1lcy5kYXJ0JyBzaG93IE5hbWVzLCBTZWxlY3RvcnM7CmltcG9ydCAnLi4vLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JwogICAgc2hvdyBDb25zdGFudFZhbHVlLCBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWU7CmltcG9ydCAnLi4vLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgSkNvbW1vbkVsZW1lbnRzLCBKRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uLy4uL2RlZmVycmVkX2xvYWQuZGFydCcKICAgIHNob3cgZGVmZXJyZWRQYXJ0RmlsZU5hbWUsIE91dHB1dFVuaXQsIE91dHB1dFVuaXREYXRhOwppbXBvcnQgJy4uLy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uLy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uLy4uL2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9qcy9qcy5kYXJ0JyBhcyBqczsKaW1wb3J0ICcuLi8uLi9qc19iYWNrZW5kL2ZpZWxkX2FuYWx5c2lzLmRhcnQnCiAgICBzaG93IEZpZWxkQW5hbHlzaXNEYXRhLCBKRmllbGRBbmFseXNpczsKaW1wb3J0ICcuLi8uLi9qc19iYWNrZW5kL2JhY2tlbmRfdXNhZ2UuZGFydCc7CmltcG9ydCAnLi4vLi4vanNfYmFja2VuZC9jdXN0b21fZWxlbWVudHNfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnLi4vLi4vanNfYmFja2VuZC9pbmZlcnJlZF9kYXRhLmRhcnQnOwppbXBvcnQgJy4uLy4uL2pzX2JhY2tlbmQvaW50ZXJjZXB0b3JfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9qc19iYWNrZW5kL25hbWVyLmRhcnQnIHNob3cgTmFtZXIsIFN0cmluZ0JhY2tlZE5hbWU7CmltcG9ydCAnLi4vLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydCcKICAgIHNob3cgUnVudGltZVR5cGVzQ2hlY2tzLCBSdW50aW1lVHlwZXNFbmNvZGVyOwppbXBvcnQgJy4uLy4uL2pzX2JhY2tlbmQvcnVudGltZV90eXBlc19uZXcuZGFydCcgc2hvdyBSZWNpcGVFbmNvZGVyOwppbXBvcnQgJy4uLy4uL2pzX2JhY2tlbmQvcnVudGltZV90eXBlc19yZXNvbHV0aW9uLmRhcnQnIHNob3cgUnVudGltZVR5cGVzTmVlZDsKaW1wb3J0ICcuLi8uLi9qc19tb2RlbC9lbGVtZW50cy5kYXJ0JyBzaG93IEpHZW5lcmF0b3JCb2R5LCBKU2lnbmF0dXJlTWV0aG9kOwppbXBvcnQgJy4uLy4uL25hdGl2ZS9lbnF1ZXVlLmRhcnQnIHNob3cgTmF0aXZlQ29kZWdlbkVucXVldWVyOwppbXBvcnQgJy4uLy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vLi4vdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uLy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vLi4vdW5pdmVyc2Uvd29ybGRfYnVpbGRlci5kYXJ0JyBzaG93IFNlbGVjdG9yQ29uc3RyYWludHM7CmltcG9ydCAnLi4vLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CmltcG9ydCAnLi4vanNfZW1pdHRlci5kYXJ0JwogICAgc2hvdwogICAgICAgIENsYXNzU3R1YkdlbmVyYXRvciwKICAgICAgICBDb2RlRW1pdHRlclRhc2ssCiAgICAgICAgRW1pdHRlciwKICAgICAgICBJbnN0YW50aWF0aW9uU3R1YkdlbmVyYXRvciwKICAgICAgICBJbnRlcmNlcHRvclN0dWJHZW5lcmF0b3IsCiAgICAgICAgTWFpbkNhbGxTdHViR2VuZXJhdG9yLAogICAgICAgIFBhcmFtZXRlclN0dWJHZW5lcmF0b3IsCiAgICAgICAgUnVudGltZVR5cGVHZW5lcmF0b3IsCiAgICAgICAgVHlwZVRlc3RQcm9wZXJ0aWVzOwppbXBvcnQgJy4uL21vZGVsLmRhcnQnOwppbXBvcnQgJy4uL3NvcnRlci5kYXJ0JzsKCnBhcnQgJ2NvbGxlY3Rvci5kYXJ0JzsKcGFydCAnZmllbGRfdmlzaXRvci5kYXJ0JzsKcGFydCAncmVnaXN0cnkuZGFydCc7CgovLy8gQnVpbGRzIGEgc2VsZi1jb250YWluZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb2dyYW0gdGhhdCBjYW4gdGhlbiBiZQovLy8gZW1pdHRlZCBtb3JlIGVhc2lseSBieSB0aGUgaW5kaXZpZHVhbCBlbWl0dGVycy4KY2xhc3MgUHJvZ3JhbUJ1aWxkZXIgewogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBfb3B0aW9uczsKICBmaW5hbCBEaWFnbm9zdGljUmVwb3J0ZXIgX3JlcG9ydGVyOwogIGZpbmFsIEpFbGVtZW50RW52aXJvbm1lbnQgX2VsZW1lbnRFbnZpcm9ubWVudDsKICBmaW5hbCBKQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwogIGZpbmFsIE91dHB1dFVuaXREYXRhIF9vdXRwdXRVbml0RGF0YTsKICBmaW5hbCBDb2RlZ2VuV29ybGQgX2NvZGVnZW5Xb3JsZDsKICBmaW5hbCBOYXRpdmVDb2RlZ2VuRW5xdWV1ZXIgX25hdGl2ZUNvZGVnZW5FbnF1ZXVlcjsKICBmaW5hbCBCYWNrZW5kVXNhZ2UgX2JhY2tlbmRVc2FnZTsKICBmaW5hbCBOYXRpdmVEYXRhIF9uYXRpdmVEYXRhOwogIGZpbmFsIFJ1bnRpbWVUeXBlc05lZWQgX3J0aU5lZWQ7CiAgZmluYWwgSW50ZXJjZXB0b3JEYXRhIF9pbnRlcmNlcHRvckRhdGE7CiAgZmluYWwgUnVudGltZVR5cGVzQ2hlY2tzIF9ydGlDaGVja3M7CiAgZmluYWwgUnVudGltZVR5cGVzRW5jb2RlciBfcnRpRW5jb2RlcjsKICBmaW5hbCBSZWNpcGVFbmNvZGVyIF9ydGlSZWNpcGVFbmNvZGVyOwogIGZpbmFsIE9uZVNob3RJbnRlcmNlcHRvckRhdGEgX29uZVNob3RJbnRlcmNlcHRvckRhdGE7CiAgZmluYWwgQ3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXMgX2N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzOwogIGZpbmFsIE1hcDxNZW1iZXJFbnRpdHksIGpzLkV4cHJlc3Npb24+IF9nZW5lcmF0ZWRDb2RlOwogIGZpbmFsIE5hbWVyIF9uYW1lcjsKICBmaW5hbCBDb2RlRW1pdHRlclRhc2sgX3Rhc2s7CiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKICBmaW5hbCBKRmllbGRBbmFseXNpcyBfZmllbGRBbmFseXNpczsKICBmaW5hbCBJbmZlcnJlZERhdGEgX2luZmVycmVkRGF0YTsKICBmaW5hbCBTb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5IF9zb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5OwoKICAvLy8gVGhlIFtTb3J0ZXJdIHVzZWQgZm9yIG9yZGVyaW5nIGVsZW1lbnRzIGluIHRoZSBnZW5lcmF0ZWQgSmF2YVNjcmlwdC4KICBmaW5hbCBTb3J0ZXIgX3NvcnRlcjsKCiAgLy8vIENvbnRhaW5zIHRoZSBjb2xsZWN0ZWQgaW5mb3JtYXRpb24gdGhlIHByb2dyYW0gYnVpbGRlciB1c2VkIHRvIGJ1aWxkCiAgLy8vIHRoZSBtb2RlbC4KICAvLyBUaGUgY29sbGVjdG9yIHdpbGwgYmUgZmlsbGVkIG9uIHRoZSBmaXJzdCBjYWxsIHRvIGBidWlsZFByb2dyYW1gLgogIC8vIEl0IGlzIHB1YmxpY2x5IGV4cG9zZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBOZXcgY29kZQogIC8vIChhbmQgaW4gcGFydGljdWxhciBuZXcgZW1pdHRlcnMpIHNob3VsZCBub3QgYWNjZXNzIGl0IG91dHNpZGUgdGhpcyBjbGFzcy4KICBmaW5hbCBDb2xsZWN0b3IgY29sbGVjdG9yOwoKICBmaW5hbCBSZWdpc3RyeSBfcmVnaXN0cnk7CgogIGZpbmFsIEZ1bmN0aW9uRW50aXR5IF9tYWluRnVuY3Rpb247CiAgZmluYWwgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IF9ydGlOZWVkZWRDbGFzc2VzOwoKICAvLy8gVHJ1ZSBpZiB0aGUgcHJvZ3JhbSBzaG91bGQgc3RvcmUgZnVuY3Rpb24gdHlwZXMgaW4gdGhlIG1ldGFkYXRhLgogIGJvb2wgX3N0b3JlRnVuY3Rpb25UeXBlc0luTWV0YWRhdGEgPSBmYWxzZTsKCiAgUHJvZ3JhbUJ1aWxkZXIoCiAgICAgIHRoaXMuX29wdGlvbnMsCiAgICAgIHRoaXMuX3JlcG9ydGVyLAogICAgICB0aGlzLl9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIHRoaXMuX2NvbW1vbkVsZW1lbnRzLAogICAgICB0aGlzLl9vdXRwdXRVbml0RGF0YSwKICAgICAgdGhpcy5fY29kZWdlbldvcmxkLAogICAgICB0aGlzLl9uYXRpdmVDb2RlZ2VuRW5xdWV1ZXIsCiAgICAgIHRoaXMuX2JhY2tlbmRVc2FnZSwKICAgICAgdGhpcy5fbmF0aXZlRGF0YSwKICAgICAgdGhpcy5fcnRpTmVlZCwKICAgICAgdGhpcy5faW50ZXJjZXB0b3JEYXRhLAogICAgICB0aGlzLl9ydGlDaGVja3MsCiAgICAgIHRoaXMuX3J0aUVuY29kZXIsCiAgICAgIHRoaXMuX3J0aVJlY2lwZUVuY29kZXIsCiAgICAgIHRoaXMuX29uZVNob3RJbnRlcmNlcHRvckRhdGEsCiAgICAgIHRoaXMuX2N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzLAogICAgICB0aGlzLl9nZW5lcmF0ZWRDb2RlLAogICAgICB0aGlzLl9uYW1lciwKICAgICAgdGhpcy5fdGFzaywKICAgICAgdGhpcy5fY2xvc2VkV29ybGQsCiAgICAgIHRoaXMuX2ZpZWxkQW5hbHlzaXMsCiAgICAgIHRoaXMuX2luZmVycmVkRGF0YSwKICAgICAgdGhpcy5fc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSwKICAgICAgdGhpcy5fc29ydGVyLAogICAgICB0aGlzLl9ydGlOZWVkZWRDbGFzc2VzLAogICAgICB0aGlzLl9tYWluRnVuY3Rpb24pCiAgICAgIDogdGhpcy5jb2xsZWN0b3IgPSBuZXcgQ29sbGVjdG9yKAogICAgICAgICAgICBfb3B0aW9ucywKICAgICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLAogICAgICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LAogICAgICAgICAgICBfb3V0cHV0VW5pdERhdGEsCiAgICAgICAgICAgIF9jb2RlZ2VuV29ybGQsCiAgICAgICAgICAgIF9uYW1lciwKICAgICAgICAgICAgX3Rhc2suZW1pdHRlciwKICAgICAgICAgICAgX25hdGl2ZURhdGEsCiAgICAgICAgICAgIF9pbnRlcmNlcHRvckRhdGEsCiAgICAgICAgICAgIF9vbmVTaG90SW50ZXJjZXB0b3JEYXRhLAogICAgICAgICAgICBfY2xvc2VkV29ybGQsCiAgICAgICAgICAgIF9ydGlOZWVkZWRDbGFzc2VzLAogICAgICAgICAgICBfZ2VuZXJhdGVkQ29kZSwKICAgICAgICAgICAgX3NvcnRlciksCiAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoX291dHB1dFVuaXREYXRhLm1haW5PdXRwdXRVbml0LCBfc29ydGVyKTsKCiAgLy8vIE1hcHBpbmcgZnJvbSBbQ2xhc3NFbnRpdHldIHRvIGNvbnN0cnVjdGVkIFtDbGFzc10uIFdlIG5lZWQgdGhpcyB0bwogIC8vLyB1cGRhdGUgdGhlIHN1cGVyY2xhc3MgaW4gdGhlIFtDbGFzc10uCiAgZmluYWwgTWFwPENsYXNzRW50aXR5LCBDbGFzcz4gX2NsYXNzZXMgPSA8Q2xhc3NFbnRpdHksIENsYXNzPnt9OwoKICAvLy8gTWFwcGluZyBmcm9tIFtPdXRwdXRVbml0XSB0byBjb25zdHJ1Y3RlZCBbRnJhZ21lbnRdLiBXZSBuZWVkIHRoaXMgdG8KICAvLy8gZ2VuZXJhdGUgdGhlIGRlZmVycmVkTG9hZGluZ01hcCAodG8ga25vdyB3aGljaCBodW5rcyB0byBsb2FkKS4KICBmaW5hbCBNYXA8T3V0cHV0VW5pdCwgRnJhZ21lbnQ+IF9vdXRwdXRzID0gPE91dHB1dFVuaXQsIEZyYWdtZW50Pnt9OwoKICAvLy8gTWFwcGluZyBmcm9tIFtDb25zdGFudFZhbHVlXSB0byBjb25zdHJ1Y3RlZCBbQ29uc3RhbnRdLiBXZSBuZWVkIHRoaXMgdG8KICAvLy8gdXBkYXRlIGZpZWxkLWluaXRpYWxpemVycyB0byBwb2ludCB0byB0aGUgQ29uc3RhbnRNb2RlbC4KICBmaW5hbCBNYXA8Q29uc3RhbnRWYWx1ZSwgQ29uc3RhbnQ+IF9jb25zdGFudHMgPSA8Q29uc3RhbnRWYWx1ZSwgQ29uc3RhbnQ+e307CgogIFNldDxDbGFzcz4gX3VubmVlZGVkTmF0aXZlQ2xhc3NlczsKCiAgLy8vIENsYXNzZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGR1cmluZyBhIHByb2ZpbGUgcnVuLgogIC8vLwogIC8vLyBUaGVzZSBjbGFzc2VzIHNob3VsZCBub3QgYmUgc29mdC1kZWZlcnJlZC4KICAvLy8KICAvLy8gQWxzbyBjb250YWlucyBjbGFzc2VzIHRoYXQgYXJlIG5vdCB0cmFja2VkIGJ5IHRoZSBwcm9maWxlIHJ1biAobGlrZQogIC8vLyBpbnRlcmNlcHRvcnMsIC4uLikuCiAgU2V0PENsYXNzRW50aXR5PiBfbm90U29mdERlZmVycmVkOwoKICBQcm9ncmFtIGJ1aWxkUHJvZ3JhbSh7Ym9vbCBzdG9yZUZ1bmN0aW9uVHlwZXNJbk1ldGFkYXRhOiBmYWxzZX0pIHsKICAgIGNvbGxlY3Rvci5jb2xsZWN0KCk7CiAgICBfaW5pdGlhbGl6ZVNvZnREZWZlcnJlZE1hcCgpOwoKICAgIHRoaXMuX3N0b3JlRnVuY3Rpb25UeXBlc0luTWV0YWRhdGEgPSBzdG9yZUZ1bmN0aW9uVHlwZXNJbk1ldGFkYXRhOwogICAgLy8gTm90ZTogSW4gcmFyZSBjYXNlcyAobW9zdGx5IHRlc3RzKSBvdXRwdXQgdW5pdHMgY2FuIGJlIGVtcHR5LiBUaGlzCiAgICAvLyBoYXBwZW5zIHdoZW4gdGhlIGRlZmVycmVkIGNvZGUgaXMgZGVhZC1jb2RlIGVsaW1pbmF0ZWQgYnV0IHdlIHN0aWxsIG5lZWQKICAgIC8vIHRvIGNoZWNrIHRoYXQgdGhlIGxpYnJhcnkgaGFzIGJlZW4gbG9hZGVkLgogICAgX2Nsb3NlZFdvcmxkLm91dHB1dFVuaXREYXRhLm91dHB1dFVuaXRzCiAgICAgICAgLmZvckVhY2goX3JlZ2lzdHJ5LnJlZ2lzdGVyT3V0cHV0VW5pdCk7CiAgICBjb2xsZWN0b3Iub3V0cHV0Q2xhc3NMaXN0cy5mb3JFYWNoKF9yZWdpc3RyeS5yZWdpc3RlckNsYXNzZXMpOwogICAgY29sbGVjdG9yLm91dHB1dFN0YXRpY0xpc3RzLmZvckVhY2goX3JlZ2lzdHJ5LnJlZ2lzdGVyTWVtYmVycyk7CiAgICBjb2xsZWN0b3Iub3V0cHV0Q29uc3RhbnRMaXN0cy5mb3JFYWNoKF9yZWdpc3RlckNvbnN0YW50cyk7CiAgICBjb2xsZWN0b3Iub3V0cHV0U3RhdGljTm9uRmluYWxGaWVsZExpc3RzLmZvckVhY2goX3JlZ2lzdHJ5LnJlZ2lzdGVyTWVtYmVycyk7CgogICAgLy8gV2UgYWx3YXlzIGFkZCB0aGUgY3VycmVudCBpc29sYXRlIGhvbGRlci4KICAgIF9yZWdpc3RlclN0YXRpY1N0YXRlSG9sZGVyKCk7CgogICAgLy8gV2UgbmVlZCB0byBydW4gdGhlIG5hdGl2ZS1wcmVwYXJhdGlvbiBiZWZvcmUgd2UgYnVpbGQgdGhlIG91dHB1dC4gVGhlCiAgICAvLyBwcmVwYXJhdGlvbiBjb2RlLCBpbiB0dXJuIG5lZWRzIHRoZSBjbGFzc2VzIHRvIGJlIHNldCB1cC4KICAgIC8vIFdlIHRodXMgYnVpbGQgdGhlIGNsYXNzZXMgYmVmb3JlIGJ1aWxkaW5nIHRoZWlyIGNvbnRhaW5lcnMuCiAgICBjb2xsZWN0b3Iub3V0cHV0Q2xhc3NMaXN0cwogICAgICAgIC5mb3JFYWNoKChPdXRwdXRVbml0IF8sIExpc3Q8Q2xhc3NFbnRpdHk+IGNsYXNzZXMpIHsKICAgICAgY2xhc3Nlcy5mb3JFYWNoKF9idWlsZENsYXNzKTsKICAgIH0pOwoKICAgIC8vIFJlc29sdmUgdGhlIHN1cGVyY2xhc3MgcmVmZXJlbmNlcyBhZnRlciB3ZSd2ZSBwcm9jZXNzZWQgYWxsIHRoZSBjbGFzc2VzLgogICAgX2NsYXNzZXMuZm9yRWFjaCgoQ2xhc3NFbnRpdHkgY2xzLCBDbGFzcyBjKSB7CiAgICAgIENsYXNzRW50aXR5IHN1cGVyY2xhc3MgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY2xzKTsKICAgICAgaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgewogICAgICAgIGMuc2V0U3VwZXJjbGFzcyhfY2xhc3Nlc1tzdXBlcmNsYXNzXSk7CiAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICBjLnN1cGVyY2xhc3MgIT0gbnVsbCwKICAgICAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgICAgICBjbHMsCiAgICAgICAgICAgICAgICAiTm8gQ2xhc3MgZm9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHN1cGVyY2xhc3MgIgogICAgICAgICAgICAgICAgIiR7c3VwZXJjbGFzc30gb2YgJGMuIikpOwogICAgICB9CiAgICAgIGlmIChjLmlzU2ltcGxlTWl4aW5BcHBsaWNhdGlvbiB8fCBjLmlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgQ2xhc3NFbnRpdHkgZWZmZWN0aXZlTWl4aW5DbGFzcyA9CiAgICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RWZmZWN0aXZlTWl4aW5DbGFzcyhjbHMpOwogICAgICAgIGMuc2V0TWl4aW5DbGFzcyhfY2xhc3Nlc1tlZmZlY3RpdmVNaXhpbkNsYXNzXSk7CiAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICBjLm1peGluQ2xhc3MgIT0gbnVsbCwKICAgICAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgICAgICBjbHMsCiAgICAgICAgICAgICAgICAiTm8gY2xhc3MgZm9yIGVmZmVjdGl2ZSBtaXhpbiAke2VmZmVjdGl2ZU1peGluQ2xhc3N9IG9uICIKICAgICAgICAgICAgICAgICIkY2xzLiIpKTsKICAgICAgfQogICAgfSk7CgogICAgTGlzdDxDbGFzcz4gbmF0aXZlQ2xhc3NlcyA9IGNvbGxlY3Rvci5uYXRpdmVDbGFzc2VzQW5kU3ViY2xhc3NlcwogICAgICAgIC5tYXAoKENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCkgPT4gX2NsYXNzZXNbY2xhc3NFbGVtZW50XSkKICAgICAgICAudG9MaXN0KCk7CgogICAgU2V0PENsYXNzRW50aXR5PiBpbnRlcmNlcHRvckNsYXNzZXNOZWVkZWRCeUNvbnN0YW50cyA9CiAgICAgICAgY29sbGVjdG9yLmNvbXB1dGVJbnRlcmNlcHRvcnNSZWZlcmVuY2VkRnJvbUNvbnN0YW50cygpOwoKICAgIF91bm5lZWRlZE5hdGl2ZUNsYXNzZXMgPSBfdGFzay5uYXRpdmVFbWl0dGVyLnByZXBhcmVOYXRpdmVDbGFzc2VzKAogICAgICAgIG5hdGl2ZUNsYXNzZXMsIGludGVyY2VwdG9yQ2xhc3Nlc05lZWRlZEJ5Q29uc3RhbnRzLCBfcnRpTmVlZGVkQ2xhc3Nlcyk7CgogICAgX2FkZEpzSW50ZXJvcFN0dWJzKF9yZWdpc3RyeS5tYWluTGlicmFyaWVzTWFwKTsKCiAgICBNYWluRnJhZ21lbnQgbWFpbkZyYWdtZW50ID0gX2J1aWxkTWFpbkZyYWdtZW50KF9yZWdpc3RyeS5tYWluTGlicmFyaWVzTWFwKTsKICAgIEl0ZXJhYmxlPEZyYWdtZW50PiBkZWZlcnJlZEZyYWdtZW50cyA9CiAgICAgICAgX3JlZ2lzdHJ5LmRlZmVycmVkTGlicmFyaWVzTWFwLm1hcChfYnVpbGREZWZlcnJlZEZyYWdtZW50KTsKCiAgICBMaXN0PEZyYWdtZW50PiBmcmFnbWVudHMgPSBuZXcgTGlzdDxGcmFnbWVudD4oX3JlZ2lzdHJ5LmxpYnJhcmllc01hcENvdW50KTsKICAgIGZyYWdtZW50c1swXSA9IG1haW5GcmFnbWVudDsKICAgIGZyYWdtZW50cy5zZXRBbGwoMSwgZGVmZXJyZWRGcmFnbWVudHMpOwoKICAgIF9tYXJrRWFnZXJDbGFzc2VzKCk7CgogICAgTGlzdDxIb2xkZXI+IGhvbGRlcnMgPSBfcmVnaXN0cnkuaG9sZGVycy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKCiAgICBib29sIG5lZWRzTmF0aXZlU3VwcG9ydCA9CiAgICAgICAgX25hdGl2ZUNvZGVnZW5FbnF1ZXVlci5oYXNJbnN0YW50aWF0ZWROYXRpdmVDbGFzc2VzOwoKICAgIGFzc2VydCghbmVlZHNOYXRpdmVTdXBwb3J0IHx8IG5hdGl2ZUNsYXNzZXMuaXNOb3RFbXB0eSk7CgogICAgTGlzdDxqcy5Ub2tlbkZpbmFsaXplcj4gZmluYWxpemVycyA9IFtfdGFzay5tZXRhZGF0YUNvbGxlY3Rvcl07CiAgICBpZiAoX25hbWVyIGlzIGpzLlRva2VuRmluYWxpemVyKSB7CiAgICAgIHZhciBuYW1pbmdGaW5hbGl6ZXIgPSBfbmFtZXI7CiAgICAgIGZpbmFsaXplcnMuYWRkKG5hbWluZ0ZpbmFsaXplciBhcyBqcy5Ub2tlbkZpbmFsaXplcik7CiAgICB9CgogICAgcmV0dXJuIG5ldyBQcm9ncmFtKGZyYWdtZW50cywgaG9sZGVycywgX2J1aWxkTG9hZE1hcCgpLAogICAgICAgIF9idWlsZFR5cGVUb0ludGVyY2VwdG9yTWFwKCksIF90YXNrLm1ldGFkYXRhQ29sbGVjdG9yLCBmaW5hbGl6ZXJzLAogICAgICAgIG5lZWRzTmF0aXZlU3VwcG9ydDogbmVlZHNOYXRpdmVTdXBwb3J0LAogICAgICAgIG91dHB1dENvbnRhaW5zQ29uc3RhbnRMaXN0OiBjb2xsZWN0b3Iub3V0cHV0Q29udGFpbnNDb25zdGFudExpc3QsCiAgICAgICAgaGFzU29mdERlZmVycmVkQ2xhc3NlczogX25vdFNvZnREZWZlcnJlZCAhPSBudWxsKTsKICB9CgogIHZvaWQgX21hcmtFYWdlckNsYXNzZXMoKSB7CiAgICBfbWFya0VhZ2VySW50ZXJjZXB0b3JDbGFzc2VzKCk7CiAgfQoKICB2b2lkIF9pbml0aWFsaXplU29mdERlZmVycmVkTWFwKCkgewogICAgdmFyIGFsbG9jYXRlZENsYXNzZXNQYXRoID0gX29wdGlvbnMuZXhwZXJpbWVudGFsQWxsb2NhdGlvbnNQYXRoOwogICAgaWYgKGFsbG9jYXRlZENsYXNzZXNQYXRoICE9IG51bGwpIHsKICAgICAgLy8gVE9ETygyOTU3NCk6IHRoZSBmb2xsb3dpbmcgYmxhY2tsaXN0IGlzIGFkLWhvYyBhbmQgcG90ZW50aWFsbHkKICAgICAgLy8gaW5jb21wbGV0ZS4gV2UgbmVlZCB0byBtYXJrIGFsbCBjbGFzc2VzIGFzIGJsYWNrIGxpc3RlZCwgdGhhdCBhcmUKICAgICAgLy8gdXNlZCB3aXRob3V0IGNvZGUgZ29pbmcgdGhyb3VnaCB0aGUgY2xhc3MnIGNvbnN0cnVjdG9yLgogICAgICB2YXIgYmxhY2tMaXN0ID0gWwogICAgICAgICdkYXJ0Ol9pbnRlcmNlcHRvcnMnLAogICAgICAgICdkYXJ0Omh0bWwnLAogICAgICAgICdkYXJ0OnR5cGVkX2RhdGFfaW1wbGVtZW50YXRpb24nLAogICAgICAgICdkYXJ0Ol9uYXRpdmVfdHlwZWRfZGF0YScKICAgICAgXS50b1NldCgpOwoKICAgICAgLy8gVE9ETygyOTU3NCk6IHRoZSBjb21waWxlciBzaG91bGQgbm90IGp1c3QgdXNlIGRhcnQ6aW8gdG8gZ2V0IHRoZQogICAgICAvLyBjb250ZW50cyBvZiBhIGZpbGUuCiAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGFsbG9jYXRlZENsYXNzZXNQYXRoKTsKCiAgICAgIC8vIFRPRE8oMjk1NzQpOiBhcmUgdGhlIGZvbGxvd2luZyBjaGVja3MgbmVjZXNzYXJ5PwogICAgICAvLyBUbyBtYWtlIGNvbXBpbGF0aW9uIGluIGJ1aWxkLXN5c3RlbXMgZWFzaWVyLCB3ZSBpZ25vcmUgbm9uLWV4aXN0aW5nCiAgICAgIC8vIG9yIGVtcHR5IHByb2ZpbGVzLgogICAgICBpZiAoIWZpbGUuZXhpc3RzU3luYygpKSB7CiAgICAgICAgX3JlcG9ydGVyLmxvZygiUHJvZmlsZSBmaWxlIGRvZXMgbm90IGV4aXN0OiAkYWxsb2NhdGVkQ2xhc3Nlc1BhdGgiKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGZpbGUubGVuZ3RoU3luYygpID09IDApIHsKICAgICAgICBfcmVwb3J0ZXIubG9nKCJQcm9maWxlIGluZm9ybWF0aW9uIChhbGxvY2F0ZWQgY2xhc3NlcykgaXMgZW1wdHkuIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBTdHJpbmcgZGF0YSA9IG5ldyBGaWxlKGFsbG9jYXRlZENsYXNzZXNQYXRoKS5yZWFkQXNTdHJpbmdTeW5jKCk7CiAgICAgIFNldDxTdHJpbmc+IGFsbG9jYXRlZENsYXNzZXNLZXlzID0ganNvbkRlY29kZShkYXRhKS5rZXlzLnRvU2V0KCk7CiAgICAgIFNldDxDbGFzc0VudGl0eT4gYWxsb2NhdGVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogICAgICAvLyBDb2xsZWN0cyBhbGwgc3VwZXIgYW5kIG1peGluIGNsYXNzZXMgb2YgYSBjbGFzcy4KICAgICAgdm9pZCBjb2xsZWN0KENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgICAgICBhbGxvY2F0ZWRDbGFzc2VzLmFkZChlbGVtZW50KTsKICAgICAgICBpZiAoX2VsZW1lbnRFbnZpcm9ubWVudC5pc01peGluQXBwbGljYXRpb24oZWxlbWVudCkpIHsKICAgICAgICAgIGNvbGxlY3QoX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRFZmZlY3RpdmVNaXhpbkNsYXNzKGVsZW1lbnQpKTsKICAgICAgICB9CiAgICAgICAgQ2xhc3NFbnRpdHkgc3VwZXJjbGFzcyA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhlbGVtZW50KTsKICAgICAgICBpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7CiAgICAgICAgICBjb2xsZWN0KHN1cGVyY2xhc3MpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gRm9yIGV2ZXJ5IGtub3duIGNsYXNzLCBzZWUgaWYgaXQgd2FzIGFsbG9jYXRlZCBpbiB0aGUgcHJvZmlsZS4gSWYgeWVzLAogICAgICAvLyBjb2xsZWN0IGl0cyBkZXBlbmRlbmNpZXMgKHN1cGVycyBhbmQgbWl4aW5zKSBhbmQgbWFyayB0aGVtIGFzCiAgICAgIC8vIG5vdC1zb2Z0LWRlZmVycmFibGUuCiAgICAgIGNvbGxlY3Rvci5vdXRwdXRDbGFzc0xpc3RzLmZvckVhY2goKF8sIExpc3Q8Q2xhc3NFbnRpdHk+IGVsZW1lbnRzKSB7CiAgICAgICAgZm9yIChDbGFzc0VudGl0eSBlbGVtZW50IGluIGVsZW1lbnRzKSB7CiAgICAgICAgICAvLyBUT0RPKDI5NTc0KTogc2hhcmUgdGhlIGVuY29kaW5nIG9mIHRoZSBlbGVtZW50IHdpdGggdGhlIGNvZGUKICAgICAgICAgIC8vIHRoYXQgZW1pdHMgdGhlIHByb2ZpbGUtcnVuLgogICAgICAgICAgdmFyIGtleSA9ICIke2VsZW1lbnQubGlicmFyeS5jYW5vbmljYWxVcml9OiR7ZWxlbWVudC5uYW1lfSI7CiAgICAgICAgICBpZiAoYWxsb2NhdGVkQ2xhc3Nlc0tleXMuY29udGFpbnMoa2V5KSB8fAogICAgICAgICAgICAgIF9uYXRpdmVEYXRhLmlzSnNJbnRlcm9wQ2xhc3MoZWxlbWVudCkgfHwKICAgICAgICAgICAgICBibGFja0xpc3QuY29udGFpbnMoZWxlbWVudC5saWJyYXJ5LmNhbm9uaWNhbFVyaS50b1N0cmluZygpKSkgewogICAgICAgICAgICBjb2xsZWN0KGVsZW1lbnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIF9ub3RTb2Z0RGVmZXJyZWQgPSBhbGxvY2F0ZWRDbGFzc2VzOwogICAgfQogIH0KCiAgLy8vIEJ1aWxkcyBhIG1hcCBmcm9tIGxvYWRJZCB0byBvdXRwdXRzLXRvLWxvYWQuCiAgTWFwPFN0cmluZywgTGlzdDxGcmFnbWVudD4+IF9idWlsZExvYWRNYXAoKSB7CiAgICBNYXA8U3RyaW5nLCBMaXN0PEZyYWdtZW50Pj4gbG9hZE1hcCA9IDxTdHJpbmcsIExpc3Q8RnJhZ21lbnQ+Pnt9OwogICAgX2Nsb3NlZFdvcmxkLm91dHB1dFVuaXREYXRhLmh1bmtzVG9Mb2FkCiAgICAgICAgLmZvckVhY2goKFN0cmluZyBsb2FkSWQsIExpc3Q8T3V0cHV0VW5pdD4gb3V0cHV0VW5pdHMpIHsKICAgICAgbG9hZE1hcFtsb2FkSWRdID0gb3V0cHV0VW5pdHMKICAgICAgICAgIC5tYXAoKE91dHB1dFVuaXQgdW5pdCkgPT4gX291dHB1dHNbdW5pdF0pCiAgICAgICAgICAudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICB9KTsKICAgIHJldHVybiBsb2FkTWFwOwogIH0KCiAganMuRXhwcmVzc2lvbiBfYnVpbGRUeXBlVG9JbnRlcmNlcHRvck1hcCgpIHsKICAgIEludGVyY2VwdG9yU3R1YkdlbmVyYXRvciBzdHViR2VuZXJhdG9yID0gbmV3IEludGVyY2VwdG9yU3R1YkdlbmVyYXRvcigKICAgICAgICBfY29tbW9uRWxlbWVudHMsCiAgICAgICAgX3Rhc2suZW1pdHRlciwKICAgICAgICBfbmF0aXZlQ29kZWdlbkVucXVldWVyLAogICAgICAgIF9uYW1lciwKICAgICAgICBfY3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXMsCiAgICAgICAgX2NvZGVnZW5Xb3JsZCwKICAgICAgICBfY2xvc2VkV29ybGQpOwogICAgcmV0dXJuIHN0dWJHZW5lcmF0b3IuZ2VuZXJhdGVUeXBlVG9JbnRlcmNlcHRvck1hcCgpOwogIH0KCiAgTWFpbkZyYWdtZW50IF9idWlsZE1haW5GcmFnbWVudChMaWJyYXJpZXNNYXAgbGlicmFyaWVzTWFwKSB7CiAgICAvLyBDb25zdHJ1Y3QgdGhlIG1haW4gb3V0cHV0IGZyb20gdGhlIGxpYnJhcmllcyBhbmQgdGhlIHJlZ2lzdGVyZWQgaG9sZGVycy4KICAgIE1haW5GcmFnbWVudCByZXN1bHQgPSBuZXcgTWFpbkZyYWdtZW50KAogICAgICAgIGxpYnJhcmllc01hcC5vdXRwdXRVbml0LAogICAgICAgICIiLCAvLyBUaGUgZW1wdHkgc3RyaW5nIGlzIHRoZSBuYW1lIGZvciB0aGUgbWFpbiBvdXRwdXQgZmlsZS4KICAgICAgICBfYnVpbGRJbnZva2VNYWluKCksCiAgICAgICAgX2J1aWxkTGlicmFyaWVzKGxpYnJhcmllc01hcCksCiAgICAgICAgX2J1aWxkU3RhdGljTm9uRmluYWxGaWVsZHMobGlicmFyaWVzTWFwKSwKICAgICAgICBfYnVpbGRTdGF0aWNMYXppbHlJbml0aWFsaXplZEZpZWxkcyhsaWJyYXJpZXNNYXApLAogICAgICAgIF9idWlsZENvbnN0YW50cyhsaWJyYXJpZXNNYXApKTsKICAgIF9vdXRwdXRzW2xpYnJhcmllc01hcC5vdXRwdXRVbml0XSA9IHJlc3VsdDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBqcy5TdGF0ZW1lbnQgX2J1aWxkSW52b2tlTWFpbigpIHsKICAgIHJldHVybiBNYWluQ2FsbFN0dWJHZW5lcmF0b3IuZ2VuZXJhdGVJbnZva2VNYWluKAogICAgICAgIF90YXNrLmVtaXR0ZXIsIF9tYWluRnVuY3Rpb24pOwogIH0KCiAgRGVmZXJyZWRGcmFnbWVudCBfYnVpbGREZWZlcnJlZEZyYWdtZW50KExpYnJhcmllc01hcCBsaWJyYXJpZXNNYXApIHsKICAgIERlZmVycmVkRnJhZ21lbnQgcmVzdWx0ID0gbmV3IERlZmVycmVkRnJhZ21lbnQoCiAgICAgICAgbGlicmFyaWVzTWFwLm91dHB1dFVuaXQsCiAgICAgICAgZGVmZXJyZWRQYXJ0RmlsZU5hbWUoX29wdGlvbnMsIGxpYnJhcmllc01hcC5uYW1lLCBhZGRFeHRlbnNpb246IGZhbHNlKSwKICAgICAgICBsaWJyYXJpZXNNYXAubmFtZSwKICAgICAgICBfYnVpbGRMaWJyYXJpZXMobGlicmFyaWVzTWFwKSwKICAgICAgICBfYnVpbGRTdGF0aWNOb25GaW5hbEZpZWxkcyhsaWJyYXJpZXNNYXApLAogICAgICAgIF9idWlsZFN0YXRpY0xhemlseUluaXRpYWxpemVkRmllbGRzKGxpYnJhcmllc01hcCksCiAgICAgICAgX2J1aWxkQ29uc3RhbnRzKGxpYnJhcmllc01hcCkpOwogICAgX291dHB1dHNbbGlicmFyaWVzTWFwLm91dHB1dFVuaXRdID0gcmVzdWx0OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIExpc3Q8Q29uc3RhbnQ+IF9idWlsZENvbnN0YW50cyhMaWJyYXJpZXNNYXAgbGlicmFyaWVzTWFwKSB7CiAgICBMaXN0PENvbnN0YW50VmFsdWU+IGNvbnN0YW50VmFsdWVzID0KICAgICAgICBjb2xsZWN0b3Iub3V0cHV0Q29uc3RhbnRMaXN0c1tsaWJyYXJpZXNNYXAub3V0cHV0VW5pdF07CiAgICBpZiAoY29uc3RhbnRWYWx1ZXMgPT0gbnVsbCkgcmV0dXJuIGNvbnN0IDxDb25zdGFudD5bXTsKICAgIHJldHVybiBjb25zdGFudFZhbHVlcwogICAgICAgIC5tYXAoKENvbnN0YW50VmFsdWUgdmFsdWUpID0+IF9jb25zdGFudHNbdmFsdWVdKQogICAgICAgIC50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICB9CgogIExpc3Q8U3RhdGljRmllbGQ+IF9idWlsZFN0YXRpY05vbkZpbmFsRmllbGRzKExpYnJhcmllc01hcCBsaWJyYXJpZXNNYXApIHsKICAgIExpc3Q8RmllbGRFbnRpdHk+IHN0YXRpY05vbkZpbmFsRmllbGRzID0KICAgICAgICBjb2xsZWN0b3Iub3V0cHV0U3RhdGljTm9uRmluYWxGaWVsZExpc3RzW2xpYnJhcmllc01hcC5vdXRwdXRVbml0XTsKICAgIGlmIChzdGF0aWNOb25GaW5hbEZpZWxkcyA9PSBudWxsKSByZXR1cm4gY29uc3QgPFN0YXRpY0ZpZWxkPltdOwoKICAgIHJldHVybiBzdGF0aWNOb25GaW5hbEZpZWxkcy5tYXAoX2J1aWxkU3RhdGljRmllbGQpLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogIH0KCiAgU3RhdGljRmllbGQgX2J1aWxkU3RhdGljRmllbGQoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAgRmllbGRBbmFseXNpc0RhdGEgZmllbGREYXRhID0gX2ZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKGVsZW1lbnQpOwogICAgQ29uc3RhbnRWYWx1ZSBpbml0aWFsVmFsdWUgPSBmaWVsZERhdGEuaW5pdGlhbFZhbHVlOwogICAganMuRXhwcmVzc2lvbiBjb2RlOwogICAgaWYgKGluaXRpYWxWYWx1ZSAhPSBudWxsKSB7CiAgICAgIC8vIFRPRE8oemFyYWgpOiBUaGUgaG9sZGVyIHNob3VsZCBub3QgYmUgcmVnaXN0ZXJlZCBkdXJpbmcgYnVpbGRpbmcgb2YKICAgICAgLy8gYSBzdGF0aWMgZmllbGQuCiAgICAgIF9yZWdpc3RyeS5yZWdpc3RlckhvbGRlcihfbmFtZXIuZ2xvYmFsT2JqZWN0Rm9yQ29uc3RhbnQoaW5pdGlhbFZhbHVlKSwKICAgICAgICAgIGlzQ29uc3RhbnRzSG9sZGVyOiB0cnVlKTsKICAgICAgY29kZSA9IF90YXNrLmVtaXR0ZXIuY29uc3RhbnRSZWZlcmVuY2UoaW5pdGlhbFZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChmaWVsZERhdGEuaXNFYWdlcik7CiAgICAgIGNvZGUgPSBfZ2VuZXJhdGVkQ29kZVtlbGVtZW50XTsKICAgIH0KICAgIGpzLk5hbWUgbmFtZSA9IF9uYW1lci5nbG9iYWxQcm9wZXJ0eU5hbWVGb3JNZW1iZXIoZWxlbWVudCk7CgogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHdlIHNob3VsZG4ndCB1cGRhdGUgdGhlIHJlZ2lzdHJ5IGluIHRoZSBtaWRkbGUgb2YKICAgIC8vIGJ1aWxkaW5nIGEgc3RhdGljIGZpZWxkLiAoTm90ZSB0aGF0IHRoZSBzdGF0aWMtc3RhdGUgaG9sZGVyIHdhcwogICAgLy8gYWxyZWFkeSByZWdpc3RlcmVkIGVhcmxpZXIsIGFuZCB0aGF0IHdlIGp1c3QgY2FsbCB0aGUgcmVnaXN0ZXIgdG8gZ2V0CiAgICAvLyB0aGUgaG9sZGVyLWluc3RhbmNlLgogICAgcmV0dXJuIG5ldyBTdGF0aWNGaWVsZCgKICAgICAgICBlbGVtZW50LCBuYW1lLCBudWxsLCBfcmVnaXN0ZXJTdGF0aWNTdGF0ZUhvbGRlcigpLCBjb2RlLAogICAgICAgIGlzRmluYWw6IGZhbHNlLAogICAgICAgIGlzTGF6eTogZmFsc2UsCiAgICAgICAgaXNJbml0aWFsaXplZEJ5Q29uc3RhbnQ6IGluaXRpYWxWYWx1ZSAhPSBudWxsKTsKICB9CgogIExpc3Q8U3RhdGljRmllbGQ+IF9idWlsZFN0YXRpY0xhemlseUluaXRpYWxpemVkRmllbGRzKAogICAgICBMaWJyYXJpZXNNYXAgbGlicmFyaWVzTWFwKSB7CiAgICBMaXN0PEZpZWxkRW50aXR5PiBsYXp5RmllbGRzID0gW107CiAgICBfY29kZWdlbldvcmxkLmZvckVhY2hTdGF0aWNGaWVsZCgoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgICAgaWYgKF9jbG9zZWRXb3JsZC5maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShmaWVsZCkuaXNMYXp5ICYmCiAgICAgICAgICBfb3V0cHV0VW5pdERhdGEub3V0cHV0VW5pdEZvck1lbWJlcihmaWVsZCkgPT0KICAgICAgICAgICAgICBsaWJyYXJpZXNNYXAub3V0cHV0VW5pdCkgewogICAgICAgIGxhenlGaWVsZHMuYWRkKGZpZWxkKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gX3NvcnRlcgogICAgICAgIC5zb3J0TWVtYmVycyhsYXp5RmllbGRzKQogICAgICAgIC5tYXAoX2J1aWxkTGF6eUZpZWxkKQogICAgICAgIC53aGVyZSgoZmllbGQpID0+IGZpZWxkICE9IG51bGwpIC8vIEhhcHBlbnMgd2hlbiB0aGUgZmllbGQgd2FzIHVudXNlZC4KICAgICAgICAudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgfQoKICBTdGF0aWNGaWVsZCBfYnVpbGRMYXp5RmllbGQoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAganMuRXhwcmVzc2lvbiBjb2RlID0gX2dlbmVyYXRlZENvZGVbZWxlbWVudF07CiAgICAvLyBUaGUgY29kZSBpcyBudWxsIGlmIHdlIGVuZGVkIHVwIG5vdCBuZWVkaW5nIHRoZSBsYXppbHkKICAgIC8vIGluaXRpYWxpemVkIGZpZWxkIGFmdGVyIGFsbCBiZWNhdXNlIG9mIGNvbnN0YW50IGZvbGRpbmcKICAgIC8vIGJlZm9yZSBjb2RlIGdlbmVyYXRpb24uCiAgICBpZiAoY29kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgICBqcy5OYW1lIG5hbWUgPSBfbmFtZXIuZ2xvYmFsUHJvcGVydHlOYW1lRm9yTWVtYmVyKGVsZW1lbnQpOwogICAganMuTmFtZSBnZXR0ZXJOYW1lID0gX25hbWVyLmxhenlJbml0aWFsaXplck5hbWUoZWxlbWVudCk7CiAgICAvLyBUT0RPKGZsb2l0c2NoKTogd2Ugc2hvdWxkbid0IHVwZGF0ZSB0aGUgcmVnaXN0cnkgaW4gdGhlIG1pZGRsZSBvZgogICAgLy8gYnVpbGRpbmcgYSBzdGF0aWMgZmllbGQuIChOb3RlIHRoYXQgdGhlIHN0YXRpYy1zdGF0ZSBob2xkZXIgd2FzCiAgICAvLyBhbHJlYWR5IHJlZ2lzdGVyZWQgZWFybGllciwgYW5kIHRoYXQgd2UganVzdCBjYWxsIHRoZSByZWdpc3RlciB0byBnZXQKICAgIC8vIHRoZSBob2xkZXItaW5zdGFuY2UuCiAgICByZXR1cm4gbmV3IFN0YXRpY0ZpZWxkKAogICAgICAgIGVsZW1lbnQsIG5hbWUsIGdldHRlck5hbWUsIF9yZWdpc3RlclN0YXRpY1N0YXRlSG9sZGVyKCksIGNvZGUsCiAgICAgICAgaXNGaW5hbDogIWVsZW1lbnQuaXNBc3NpZ25hYmxlLCBpc0xhenk6IHRydWUpOwogIH0KCiAgTGlzdDxMaWJyYXJ5PiBfYnVpbGRMaWJyYXJpZXMoTGlicmFyaWVzTWFwIGxpYnJhcmllc01hcCkgewogICAgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMgPSBuZXcgTGlzdDxMaWJyYXJ5PihsaWJyYXJpZXNNYXAubGVuZ3RoKTsKICAgIGludCBjb3VudCA9IDA7CiAgICBsaWJyYXJpZXNNYXAuZm9yRWFjaCgoTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBMaXN0PENsYXNzRW50aXR5PiBjbGFzc2VzLAogICAgICAgIExpc3Q8TWVtYmVyRW50aXR5PiBtZW1iZXJzKSB7CiAgICAgIGxpYnJhcmllc1tjb3VudCsrXSA9IF9idWlsZExpYnJhcnkobGlicmFyeSwgY2xhc3NlcywgbWVtYmVycyk7CiAgICB9KTsKICAgIHJldHVybiBsaWJyYXJpZXM7CiAgfQoKICB2b2lkIF9hZGRKc0ludGVyb3BTdHVicyhMaWJyYXJpZXNNYXAgbGlicmFyaWVzTWFwKSB7CiAgICBpZiAoX2NsYXNzZXMuY29udGFpbnNLZXkoX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSkgewogICAgICBqcy5OYW1lIHRvU3RyaW5nSW52b2NhdGlvbiA9IF9uYW1lci5pbnZvY2F0aW9uTmFtZShTZWxlY3RvcnMudG9TdHJpbmdfKTsKICAgICAgLy8gVE9ETyhqYWNvYnIpOiByZWdpc3RlciB0b1N0cmluZyBhcyB1c2VkIHNvIHRoYXQgaXQgaXMgYWx3YXlzIGFjY2Vzc2libGUKICAgICAgLy8gZnJvbSBKYXZhU2NyaXB0LgogICAgICBfY2xhc3Nlc1tfY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3NdLmNhbGxTdHVicy5hZGQoX2J1aWxkU3R1Yk1ldGhvZCgKICAgICAgICAgIG5ldyBTdHJpbmdCYWNrZWROYW1lKCJ0b1N0cmluZyIpLAogICAgICAgICAganMuanMoJ2Z1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy4jKHRoaXMpIH0nLCB0b1N0cmluZ0ludm9jYXRpb24pKSk7CiAgICB9CgogICAgLy8gV2UgYWRkIGFsbCBtZW1iZXJzIGZyb20gY2xhc3NlcyBtYXJrZWQgd2l0aCBpc0pzSW50ZXJvcCB0byB0aGUgYmFzZQogICAgLy8gSW50ZXJjZXB0b3IgY2xhc3Mgd2l0aCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkaXJlY3RseSBjYWxsIHRoZQogICAgLy8gY29ycmVzcG9uZGluZyBKYXZhU2NyaXB0IG1lbWJlci4gV2UgZG8gbm90IGF0dGVtcHQgdG8gYmluZCB0aGlzIHdoZW4KICAgIC8vIHRlYXJpbmcgb2ZmIEphdmFTY3JpcHQgbWV0aG9kcyBhcyB3ZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBjYWxsaW5nCiAgICAvLyBhIHJlZ3VsYXIgZ2V0dGVyIHRoYXQgcmV0dXJucyBhIEphdmFTY3JpcHQgZnVuY3Rpb24gYW5kIHRlYXJpbmcgb2ZmCiAgICAvLyBhIG1ldGhvZCBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBleGlzdCBtdWx0aXBsZSBKYXZhU2NyaXB0IGNsYXNzZXMKICAgIC8vIHRoYXQgY29uZmxpY3Qgb24gd2hldGhlciB0aGUgbWVtYmVyIGlzIGEgZ2V0dGVyIG9yIGEgbWV0aG9kLgogICAgQ2xhc3MgaW50ZXJjZXB0b3JDbGFzcyA9IF9jbGFzc2VzW19jb21tb25FbGVtZW50cy5qc0phdmFTY3JpcHRPYmplY3RDbGFzc107CiAgICBTZXQ8U3RyaW5nPiBzdHViTmFtZXMgPSB7fTsKICAgIGxpYnJhcmllc01hcAogICAgICAgIC5mb3JFYWNoKChMaWJyYXJ5RW50aXR5IGxpYnJhcnksIExpc3Q8Q2xhc3NFbnRpdHk+IGNsYXNzRWxlbWVudHMsIF8pIHsKICAgICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gY2xhc3NFbGVtZW50cykgewogICAgICAgIGlmIChfbmF0aXZlRGF0YS5pc0pzSW50ZXJvcENsYXNzKGNscykpIHsKICAgICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaExvY2FsQ2xhc3NNZW1iZXIoY2xzLAogICAgICAgICAgICAgIChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgICAgICAgIFN0cmluZyBqc05hbWUgPQogICAgICAgICAgICAgICAgX25hdGl2ZURhdGEuY29tcHV0ZVVuZXNjYXBlZEpTSW50ZXJvcE5hbWUobWVtYmVyLm5hbWUpOwogICAgICAgICAgICBpZiAoIW1lbWJlci5pc0luc3RhbmNlTWVtYmVyKSByZXR1cm47CiAgICAgICAgICAgIGlmIChtZW1iZXIuaXNHZXR0ZXIgfHwgbWVtYmVyLmlzRmllbGQgfHwgbWVtYmVyLmlzRnVuY3Rpb24pIHsKICAgICAgICAgICAgICBJdGVyYWJsZTxTZWxlY3Rvcj4gc2VsZWN0b3JzID0KICAgICAgICAgICAgICAgICAgX2NvZGVnZW5Xb3JsZC5nZXR0ZXJJbnZvY2F0aW9uc0J5TmFtZShtZW1iZXIubmFtZSk7CiAgICAgICAgICAgICAgaWYgKHNlbGVjdG9ycyAhPSBudWxsICYmICFzZWxlY3RvcnMuaXNFbXB0eSkgewogICAgICAgICAgICAgICAgZm9yIChTZWxlY3RvciBzZWxlY3RvciBpbiBzZWxlY3RvcnMpIHsKICAgICAgICAgICAgICAgICAganMuTmFtZSBzdHViTmFtZSA9IF9uYW1lci5pbnZvY2F0aW9uTmFtZShzZWxlY3Rvcik7CiAgICAgICAgICAgICAgICAgIGlmIChzdHViTmFtZXMuYWRkKHN0dWJOYW1lLmtleSkpIHsKICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHRvckNsYXNzLmNhbGxTdHVicy5hZGQoX2J1aWxkU3R1Yk1ldGhvZChzdHViTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAganMuanMoJ2Z1bmN0aW9uKG9iaikgeyByZXR1cm4gb2JqLiMgfScsIFtqc05hbWVdKSwKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogbWVtYmVyKSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtZW1iZXIuaXNTZXR0ZXIgfHwgKG1lbWJlci5pc0ZpZWxkICYmICFtZW1iZXIuaXNDb25zdCkpIHsKICAgICAgICAgICAgICBJdGVyYWJsZTxTZWxlY3Rvcj4gc2VsZWN0b3JzID0KICAgICAgICAgICAgICAgICAgX2NvZGVnZW5Xb3JsZC5zZXR0ZXJJbnZvY2F0aW9uc0J5TmFtZShtZW1iZXIubmFtZSk7CiAgICAgICAgICAgICAgaWYgKHNlbGVjdG9ycyAhPSBudWxsICYmICFzZWxlY3RvcnMuaXNFbXB0eSkgewogICAgICAgICAgICAgICAgdmFyIHN0dWJOYW1lID0gX25hbWVyLnNldHRlckZvck1lbWJlcihtZW1iZXIpOwogICAgICAgICAgICAgICAgaWYgKHN0dWJOYW1lcy5hZGQoc3R1Yk5hbWUua2V5KSkgewogICAgICAgICAgICAgICAgICBpbnRlcmNlcHRvckNsYXNzLmNhbGxTdHVicy5hZGQoX2J1aWxkU3R1Yk1ldGhvZChzdHViTmFtZSwKICAgICAgICAgICAgICAgICAgICAgIGpzLmpzKCdmdW5jdGlvbihvYmosIHYpIHsgcmV0dXJuIG9iai4jID0gdiB9JywgW2pzTmFtZV0pLAogICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogbWVtYmVyKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBHZW5lcmF0aW5nIHN0dWJzIGZvciBkaXJlY3QgY2FsbHMgYW5kIHN0dWJzIGZvciBjYWxsLXRocm91Z2gKICAgICAgICAgICAgLy8gb2YgZ2V0dGVycyB0aGF0IGhhcHBlbiB0byBiZSBmdW5jdGlvbnMuCiAgICAgICAgICAgIGJvb2wgaXNGdW5jdGlvbkxpa2UgPSBmYWxzZTsKICAgICAgICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSA9IG51bGw7CgogICAgICAgICAgICBpZiAobWVtYmVyLmlzRnVuY3Rpb24pIHsKICAgICAgICAgICAgICBGdW5jdGlvbkVudGl0eSBmbiA9IG1lbWJlcjsKICAgICAgICAgICAgICBmdW5jdGlvblR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShmbik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzR2V0dGVyKSB7CiAgICAgICAgICAgICAgaXNGdW5jdGlvbkxpa2UgPSB0cnVlOwogICAgICAgICAgICB9IC8vIFRPRE8oamFjb2JyKTogaGFuZGxlIGZpZWxkIGVsZW1lbnRzLgoKICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb25MaWtlIHx8IGZ1bmN0aW9uVHlwZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgaW50IG1pbkFyZ3M7CiAgICAgICAgICAgICAgaW50IG1heEFyZ3M7CiAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBtaW5BcmdzID0gZnVuY3Rpb25UeXBlLnBhcmFtZXRlclR5cGVzLmxlbmd0aDsKICAgICAgICAgICAgICAgIG1heEFyZ3MgPSBtaW5BcmdzICsgZnVuY3Rpb25UeXBlLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMubGVuZ3RoOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBtaW5BcmdzID0gMDsKICAgICAgICAgICAgICAgIG1heEFyZ3MgPSAzMjc2NzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IF9jb2RlZ2VuV29ybGQuaW52b2NhdGlvbnNCeU5hbWUobWVtYmVyLm5hbWUpOwogICAgICAgICAgICAgIC8vIE5hbWVkIGFyZ3VtZW50cyBhcmUgbm90IHlldCBzdXBwb3J0ZWQuIEluIHRoZSBmdXR1cmUgd2UKICAgICAgICAgICAgICAvLyBtYXkgd2FudCB0byBtYXAgbmFtZWQgYXJndW1lbnRzIHRvIGFuIG9iamVjdCBsaXRlcmFsIGNvbnRhaW5pbmcKICAgICAgICAgICAgICAvLyBhbGwgbmFtZWQgYXJndW1lbnRzLgogICAgICAgICAgICAgIGlmIChzZWxlY3RvcnMgIT0gbnVsbCAmJiAhc2VsZWN0b3JzLmlzRW1wdHkpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHNlbGVjdG9yIGluIHNlbGVjdG9ycy5rZXlzKSB7CiAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGFyaXR5IG1hdGNoZXMgdGhpcyBtZW1iZXIuCiAgICAgICAgICAgICAgICAgIHZhciBhcmd1bWVudENvdW50ID0gc2VsZWN0b3IuYXJndW1lbnRDb3VudDsKICAgICAgICAgICAgICAgICAgLy8gSlMgaW50ZXJvcCBkb2VzIG5vdCBzdXBwb3J0IG5hbWVkIGFyZ3VtZW50cy4KICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLm5hbWVkQXJndW1lbnRDb3VudCA+IDApIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRDb3VudCA8IG1pbkFyZ3MpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRDb3VudCA+IG1heEFyZ3MpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICB2YXIgc3R1Yk5hbWUgPSBfbmFtZXIuaW52b2NhdGlvbk5hbWUoc2VsZWN0b3IpOwogICAgICAgICAgICAgICAgICBpZiAoIXN0dWJOYW1lcy5hZGQoc3R1Yk5hbWUua2V5KSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJzID0KICAgICAgICAgICAgICAgICAgICAgIG5ldyBMaXN0PFN0cmluZz4uZ2VuZXJhdGUoYXJndW1lbnRDb3VudCwgKGkpID0+ICdwJGknKTsKCiAgICAgICAgICAgICAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgZ2VuZXJhdGUgdGhlIHNhbWUgc3R1YiBtZXRob2QgZm9yIGRpcmVjdAogICAgICAgICAgICAgICAgICAvLyBjYWxscyBhbmQgY2FsbC10aHJvdWdocyBvZiBnZXR0ZXJzIHNvIHRoYXQgY2FsbGluZyBhCiAgICAgICAgICAgICAgICAgIC8vIGdldHRlciB0aGF0IHJldHVybnMgYSBmdW5jdGlvbiBiZWhhdmVzIHRoZSBzYW1lIGFzIGNhbGxpbmcKICAgICAgICAgICAgICAgICAgLy8gYSBtZXRob2QuIFRoaXMgaXMgaGVscGZ1bCBhcyBtYW55IHR5cGVkIEphdmFTY3JpcHQgQVBJcwogICAgICAgICAgICAgICAgICAvLyBzcGVjaWZ5IG1lbWJlciBmdW5jdGlvbnMgd2l0aCBnZXR0ZXJzIHRoYXQgcmV0dXJuCiAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucy4gVGhlIGJlaGF2aW9yIG9mIHRoaXMgc29sdXRpb24gbWF0Y2hlcyBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICAgIC8vIGJlaGF2aW9yIGltcGxpY2l0bHkgYmluZGluZyB0aGlzIG9ubHkgd2hlbiBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICAgIC8vIHdvdWxkLgogICAgICAgICAgICAgICAgICBpbnRlcmNlcHRvckNsYXNzLmNhbGxTdHVicy5hZGQoX2J1aWxkU3R1Yk1ldGhvZCgKICAgICAgICAgICAgICAgICAgICAgIHN0dWJOYW1lLAogICAgICAgICAgICAgICAgICAgICAganMuanMoJ2Z1bmN0aW9uKHJlY2VpdmVyLCAjKSB7IHJldHVybiByZWNlaXZlci4jKCMpIH0nLAogICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJhbWV0ZXJzLCBqc05hbWUsIHBhcmFtZXRlcnNdKSwKICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IG1lbWJlcikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIC8vIE5vdGUgdGhhdCBhIGxpYnJhcnktZWxlbWVudCBtYXkgaGF2ZSBtdWx0aXBsZSBbTGlicmFyeV1zLCBpZiBpdCBpcyBzcGxpdAogIC8vIGludG8gbXVsdGlwbGUgb3V0cHV0IHVuaXRzLgogIExpYnJhcnkgX2J1aWxkTGlicmFyeShMaWJyYXJ5RW50aXR5IGxpYnJhcnksIExpc3Q8Q2xhc3NFbnRpdHk+IGNsYXNzRWxlbWVudHMsCiAgICAgIExpc3Q8TWVtYmVyRW50aXR5PiBtZW1iZXJFbGVtZW50cykgewogICAgU3RyaW5nIHVyaSA9IGxpYnJhcnkuY2Fub25pY2FsVXJpLnRvU3RyaW5nKCk7CgogICAgTGlzdDxTdGF0aWNNZXRob2Q+IHN0YXRpY3MgPSBtZW1iZXJFbGVtZW50cwogICAgICAgIC53aGVyZSgoZSkgPT4gIWUuaXNGaWVsZCkKICAgICAgICAuY2FzdDxGdW5jdGlvbkVudGl0eT4oKQogICAgICAgIC5tYXA8U3RhdGljTWV0aG9kPihfYnVpbGRTdGF0aWNNZXRob2QpCiAgICAgICAgLnRvTGlzdCgpOwoKICAgIGlmIChsaWJyYXJ5ID09IF9jb21tb25FbGVtZW50cy5pbnRlcmNlcHRvcnNMaWJyYXJ5KSB7CiAgICAgIHN0YXRpY3MuYWRkQWxsKF9nZW5lcmF0ZUdldEludGVyY2VwdG9yTWV0aG9kcygpKTsKICAgICAgc3RhdGljcy5hZGRBbGwoX2dlbmVyYXRlT25lU2hvdEludGVyY2VwdG9ycygpKTsKICAgIH0KCiAgICBMaXN0PENsYXNzPiBjbGFzc2VzID0gY2xhc3NFbGVtZW50cwogICAgICAgIC5tYXAoKENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCkgPT4gX2NsYXNzZXNbY2xhc3NFbGVtZW50XSkKICAgICAgICAud2hlcmUoKENsYXNzIGNscykgPT4KICAgICAgICAgICAgIWNscy5pc05hdGl2ZSB8fCAhX3VubmVlZGVkTmF0aXZlQ2xhc3Nlcy5jb250YWlucyhjbHMpKQogICAgICAgIC50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKCiAgICBib29sIHZpc2l0U3RhdGljcyA9IHRydWU7CiAgICBMaXN0PEZpZWxkPiBzdGF0aWNGaWVsZHNGb3JSZWZsZWN0aW9uID0KICAgICAgICBfYnVpbGRGaWVsZHMobGlicmFyeTogbGlicmFyeSwgdmlzaXRTdGF0aWNzOiB2aXNpdFN0YXRpY3MpOwoKICAgIHJldHVybiBuZXcgTGlicmFyeSgKICAgICAgICBsaWJyYXJ5LCB1cmksIHN0YXRpY3MsIGNsYXNzZXMsIHN0YXRpY0ZpZWxkc0ZvclJlZmxlY3Rpb24pOwogIH0KCiAgYm9vbCBfaXNTb2Z0RGVmZXJyZWQoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIF9ub3RTb2Z0RGVmZXJyZWQgIT0gbnVsbCAmJiAhX25vdFNvZnREZWZlcnJlZC5jb250YWlucyhlbGVtZW50KTsKICB9CgogIENsYXNzIF9idWlsZENsYXNzKENsYXNzRW50aXR5IGNscykgewogICAgYm9vbCBvbmx5Rm9yUnRpID0gY29sbGVjdG9yLmNsYXNzZXNPbmx5TmVlZGVkRm9yUnRpLmNvbnRhaW5zKGNscyk7CiAgICBib29sIGhhc1J0aUZpZWxkID0gX3J0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoY2xzKTsKICAgIGlmIChfbmF0aXZlRGF0YS5pc0pzSW50ZXJvcENsYXNzKGNscykpIHsKICAgICAgLy8gVE9ETyhqYWNvYnIpOiBjaGVjayB3aGV0aGVyIHRoZSBjbGFzcyBoYXMgYW55IGFjdGl2ZSBzdGF0aWMgZmllbGRzCiAgICAgIC8vIGlmIGl0IGRvZXMgbm90IHdlIGNhbiBzdXBwcmVzcyBpdCBjb21wbGV0ZWx5LgogICAgICBvbmx5Rm9yUnRpID0gdHJ1ZTsKICAgIH0KICAgIGJvb2wgaXNDbG9zdXJlQmFzZUNsYXNzID0gY2xzID09IF9jb21tb25FbGVtZW50cy5jbG9zdXJlQ2xhc3M7CgogICAgTGlzdDxNZXRob2Q+IG1ldGhvZHMgPSBbXTsKICAgIExpc3Q8U3R1Yk1ldGhvZD4gY2FsbFN0dWJzID0gPFN0dWJNZXRob2Q+W107CgogICAgQ2xhc3NTdHViR2VuZXJhdG9yIGNsYXNzU3R1YkdlbmVyYXRvciA9IG5ldyBDbGFzc1N0dWJHZW5lcmF0b3IoCiAgICAgICAgX3Rhc2suZW1pdHRlciwgX2NvbW1vbkVsZW1lbnRzLCBfbmFtZXIsIF9jb2RlZ2VuV29ybGQsIF9jbG9zZWRXb3JsZCwKICAgICAgICBlbmFibGVNaW5pZmljYXRpb246IF9vcHRpb25zLmVuYWJsZU1pbmlmaWNhdGlvbik7CiAgICBSdW50aW1lVHlwZUdlbmVyYXRvciBydW50aW1lVHlwZUdlbmVyYXRvciA9IG5ldyBSdW50aW1lVHlwZUdlbmVyYXRvcigKICAgICAgICBfY29tbW9uRWxlbWVudHMsCiAgICAgICAgX291dHB1dFVuaXREYXRhLAogICAgICAgIF90YXNrLAogICAgICAgIF9uYW1lciwKICAgICAgICBfcnRpQ2hlY2tzLAogICAgICAgIF9ydGlFbmNvZGVyKTsKCiAgICB2b2lkIHZpc2l0SW5zdGFuY2VNZW1iZXIoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgICBpZiAoIW1lbWJlci5pc0Fic3RyYWN0ICYmICFtZW1iZXIuaXNGaWVsZCkgewogICAgICAgIGlmIChtZW1iZXIgaXMhIEpTaWduYXR1cmVNZXRob2QpIHsKICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBfYnVpbGRNZXRob2QobWVtYmVyKTsKICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgbWV0aG9kcy5hZGQobWV0aG9kKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG1lbWJlci5pc0dldHRlciB8fCBtZW1iZXIuaXNGaWVsZCkgewogICAgICAgIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4gc2VsZWN0b3JzID0KICAgICAgICAgICAgX2NvZGVnZW5Xb3JsZC5pbnZvY2F0aW9uc0J5TmFtZShtZW1iZXIubmFtZSk7CiAgICAgICAgaWYgKHNlbGVjdG9ycyAhPSBudWxsICYmICFzZWxlY3RvcnMuaXNFbXB0eSkgewogICAgICAgICAgTWFwPGpzLk5hbWUsIGpzLkV4cHJlc3Npb24+IGNhbGxTdHVic0Zvck1lbWJlciA9CiAgICAgICAgICAgICAgY2xhc3NTdHViR2VuZXJhdG9yLmdlbmVyYXRlQ2FsbFN0dWJzRm9yR2V0dGVyKG1lbWJlciwgc2VsZWN0b3JzKTsKICAgICAgICAgIGNhbGxTdHVic0Zvck1lbWJlci5mb3JFYWNoKChqcy5OYW1lIG5hbWUsIGpzLkV4cHJlc3Npb24gY29kZSkgewogICAgICAgICAgICBjYWxsU3R1YnMuYWRkKF9idWlsZFN0dWJNZXRob2QobmFtZSwgY29kZSwgZWxlbWVudDogbWVtYmVyKSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB2b2lkIHZpc2l0TWVtYmVyKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgaWYgKG1lbWJlci5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgICAgdmlzaXRJbnN0YW5jZU1lbWJlcihtZW1iZXIpOwogICAgICB9CiAgICB9CgogICAgTGlzdDxTdHViTWV0aG9kPiBub1N1Y2hNZXRob2RTdHVicyA9IDxTdHViTWV0aG9kPltdOwoKICAgIGlmIChfYmFja2VuZFVzYWdlLmlzTm9TdWNoTWV0aG9kVXNlZCAmJgogICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpIHsKICAgICAgTWFwPGpzLk5hbWUsIFNlbGVjdG9yPiBzZWxlY3RvcnMgPQogICAgICAgICAgY2xhc3NTdHViR2VuZXJhdG9yLmNvbXB1dGVTZWxlY3RvcnNGb3JOc21IYW5kbGVycygpOwogICAgICBzZWxlY3RvcnMuZm9yRWFjaCgoanMuTmFtZSBuYW1lLCBTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgIC8vIElmIHRoZSBwcm9ncmFtIGNvbnRhaW5zIGBjb25zdCBTeW1ib2xgIG5hbWVzIHdlIGhhdmUgdG8gcmV0YWluIHRoZW0uCiAgICAgICAgU3RyaW5nIHNlbGVjdG9yTmFtZSA9IHNlbGVjdG9yLm5hbWU7CiAgICAgICAgaWYgKHNlbGVjdG9yLmlzU2V0dGVyKSBzZWxlY3Rvck5hbWUgPSAiJHNlbGVjdG9yTmFtZT0iOwogICAgICAgIG5vU3VjaE1ldGhvZFN0dWJzLmFkZCgKICAgICAgICAgICAgY2xhc3NTdHViR2VuZXJhdG9yLmdlbmVyYXRlU3R1YkZvck5vU3VjaE1ldGhvZChuYW1lLCBzZWxlY3RvcikpOwogICAgICB9KTsKICAgIH0KCiAgICBpZiAoaXNDbG9zdXJlQmFzZUNsYXNzKSB7CiAgICAgIC8vIFdlIGFkZCBhIHNwZWNpYWwgZ2V0dGVyIHRvIGFsbG93IGZvciB0ZWFyaW5nIG9mZiBhIGNsb3N1cmUgZnJvbSBpdHNlbGYuCiAgICAgIGpzLk5hbWUgbmFtZSA9IF9uYW1lci5nZXR0ZXJGb3JNZW1iZXIoTmFtZXMuY2FsbCk7CiAgICAgIGpzLkZ1biBmdW5jdGlvbiA9IGpzLmpzKCdmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0nKTsKICAgICAgY2FsbFN0dWJzLmFkZChfYnVpbGRTdHViTWV0aG9kKG5hbWUsIGZ1bmN0aW9uKSk7CiAgICB9CgogICAgaWYgKF9jb21tb25FbGVtZW50cy5pc0luc3RhbnRpYXRpb25DbGFzcyhjbHMpICYmICFvbmx5Rm9yUnRpKSB7CiAgICAgIGNhbGxTdHVicy5hZGRBbGwoX2dlbmVyYXRlSW5zdGFudGlhdGlvblN0dWJzKGNscykpOwogICAgfQoKICAgIC8vIE1peGluQXBwbGljYXRpb25zIHJ1biB0aHJvdWdoIHRoZSBtZW1iZXJzIG9mIHRoZWlyIG1peGluLiBIZXJlLCB3ZSBhcmUKICAgIC8vIG9ubHkgaW50ZXJlc3RlZCBpbiBkaXJlY3QgbWVtYmVycy4KICAgIGJvb2wgaXNTdXBlck1peGluQXBwbGljYXRpb24gPSBmYWxzZTsKICAgIGlmICghb25seUZvclJ0aSkgewogICAgICBpZiAoX2VsZW1lbnRFbnZpcm9ubWVudC5pc1N1cGVyTWl4aW5BcHBsaWNhdGlvbihjbHMpKSB7CiAgICAgICAgTGlzdDxNZW1iZXJFbnRpdHk+IG1lbWJlcnMgPSA8TWVtYmVyRW50aXR5PltdOwogICAgICAgIHZvaWQgYWRkKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgICAgIGlmIChtZW1iZXIuZW5jbG9zaW5nQ2xhc3MgPT0gY2xzKSB7CiAgICAgICAgICAgIG1lbWJlcnMuYWRkKG1lbWJlcik7CiAgICAgICAgICAgIGlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaExvY2FsQ2xhc3NNZW1iZXIoY2xzLCBhZGQpOwogICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaEluamVjdGVkQ2xhc3NNZW1iZXIoY2xzLCBhZGQpOwoKICAgICAgICBpZiAobWVtYmVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgICBfc29ydGVyLnNvcnRNZW1iZXJzKG1lbWJlcnMpLmZvckVhY2godmlzaXRNZW1iZXIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghX2VsZW1lbnRFbnZpcm9ubWVudC5pc01peGluQXBwbGljYXRpb24oY2xzKSkgewogICAgICAgIExpc3Q8TWVtYmVyRW50aXR5PiBtZW1iZXJzID0gPE1lbWJlckVudGl0eT5bXTsKICAgICAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hMb2NhbENsYXNzTWVtYmVyKGNscywgbWVtYmVycy5hZGQpOwogICAgICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaEluamVjdGVkQ2xhc3NNZW1iZXIoY2xzLCBtZW1iZXJzLmFkZCk7CiAgICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoQ29uc3RydWN0b3JCb2R5KGNscywgbWVtYmVycy5hZGQpOwogICAgICAgIF9zb3J0ZXIuc29ydE1lbWJlcnMobWVtYmVycykuZm9yRWFjaCh2aXNpdE1lbWJlcik7CiAgICAgIH0KICAgIH0KICAgIGJvb2wgaXNJbnRlcmNlcHRlZENsYXNzID0gX2ludGVyY2VwdG9yRGF0YS5pc0ludGVyY2VwdGVkQ2xhc3MoY2xzKTsKICAgIExpc3Q8RmllbGQ+IGluc3RhbmNlRmllbGRzID0gb25seUZvclJ0aQogICAgICAgID8gY29uc3QgPEZpZWxkPltdCiAgICAgICAgOiBfYnVpbGRGaWVsZHMoCiAgICAgICAgICAgIGNsczogY2xzLAogICAgICAgICAgICB2aXNpdFN0YXRpY3M6IGZhbHNlLAogICAgICAgICAgICBpc0hvbGRlckludGVyY2VwdGVkQ2xhc3M6IGlzSW50ZXJjZXB0ZWRDbGFzcyk7CiAgICBMaXN0PEZpZWxkPiBzdGF0aWNGaWVsZHNGb3JSZWZsZWN0aW9uID0gb25seUZvclJ0aQogICAgICAgID8gY29uc3QgPEZpZWxkPltdCiAgICAgICAgOiBfYnVpbGRGaWVsZHMoCiAgICAgICAgICAgIGNsczogY2xzLAogICAgICAgICAgICB2aXNpdFN0YXRpY3M6IHRydWUsCiAgICAgICAgICAgIGlzSG9sZGVySW50ZXJjZXB0ZWRDbGFzczogaXNJbnRlcmNlcHRlZENsYXNzKTsKCiAgICBUeXBlVGVzdFByb3BlcnRpZXMgdHlwZVRlc3RzID0gcnVudGltZVR5cGVHZW5lcmF0b3IuZ2VuZXJhdGVJc1Rlc3RzKAogICAgICAgIGNscywgX2dlbmVyYXRlZENvZGUsCiAgICAgICAgc3RvcmVGdW5jdGlvblR5cGVJbk1ldGFkYXRhOiBfc3RvcmVGdW5jdGlvblR5cGVzSW5NZXRhZGF0YSk7CgogICAgTGlzdDxTdHViTWV0aG9kPiBjaGVja2VkU2V0dGVycyA9IDxTdHViTWV0aG9kPltdOwogICAgTGlzdDxTdHViTWV0aG9kPiBpc0NoZWNrcyA9IDxTdHViTWV0aG9kPltdOwogICAgaWYgKF9uYXRpdmVEYXRhLmlzSnNJbnRlcm9wQ2xhc3MoY2xzKSkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJbnN0ZWFkIG9mIGdlbmVyYXRpbmcgYWxsIHN0dWJzIGZvciBlYWNoCiAgICAgIC8vIGpzLWludGVyb3AgY2xhc3Mgd2Ugc2hvdWxkIGdlbmVyYXRlIGEgc3R1YiBmb3IgZWFjaCBpbXBsZW1lbnRlZCBjbGFzcy4KICAgICAgLy8gQ3VycmVudGx5IHdlIGdlbmVyYXRlIGR1cGxpY2F0ZXMgaWYgYSBjbGFzcyBpcyBpbXBsZW1lbnRlZCBieSBtdWx0aXBsZQogICAgICAvLyBqcy1pbnRlcm9wIGNsYXNzZXMuCiAgICAgIHR5cGVUZXN0cy5mb3JFYWNoUHJvcGVydHkoX3NvcnRlciwgKGpzLk5hbWUgbmFtZSwganMuTm9kZSBjb2RlKSB7CiAgICAgICAgX2NsYXNzZXNbX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdE9iamVjdENsYXNzXQogICAgICAgICAgICAuaXNDaGVja3MKICAgICAgICAgICAgLmFkZChfYnVpbGRTdHViTWV0aG9kKG5hbWUsIGNvZGUpKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKEZpZWxkIGZpZWxkIGluIGluc3RhbmNlRmllbGRzKSB7CiAgICAgICAgaWYgKGZpZWxkLm5lZWRzQ2hlY2tlZFNldHRlcikgewogICAgICAgICAgYXNzZXJ0KCFmaWVsZC5uZWVkc1VuY2hlY2tlZFNldHRlcik7CiAgICAgICAgICBGaWVsZEVudGl0eSBlbGVtZW50ID0gZmllbGQuZWxlbWVudDsKICAgICAgICAgIGpzLkV4cHJlc3Npb24gY29kZSA9IF9nZW5lcmF0ZWRDb2RlW2VsZW1lbnRdOwogICAgICAgICAgYXNzZXJ0KGNvZGUgIT0gbnVsbCwgIk5vIHNldHRlciBjb2RlIGZvciBmaWVsZDogJGZpZWxkIik7CiAgICAgICAgICBpZiAoY29kZSA9PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyIGJlY2F1c2UgY29kZWdlbiBtZW1iZXIgdXNhZ2UgaXMgbm93CiAgICAgICAgICAgIC8vIGxpbWl0ZWQgYnkgY2xvc2VkIHdvcmxkIG1lbWJlciB1c2FnZS4gSW4gdGhlIGNhc2Ugd2UndmUgbWlzc2VkIGEKICAgICAgICAgICAgLy8gc3BvdCB3ZSBjYXV0aW91c2x5IGdlbmVyYXRlIGFuIGVtcHR5IGZ1bmN0aW9uLgogICAgICAgICAgICBjb2RlID0ganMuanMoImZ1bmN0aW9uKCkge30iKTsKICAgICAgICAgIH0KICAgICAgICAgIGpzLk5hbWUgbmFtZSA9IF9uYW1lci5kZXJpdmVTZXR0ZXJOYW1lKGZpZWxkLmFjY2Vzc29yTmFtZSk7CiAgICAgICAgICBjaGVja2VkU2V0dGVycy5hZGQoX2J1aWxkU3R1Yk1ldGhvZChuYW1lLCBjb2RlLCBlbGVtZW50OiBlbGVtZW50KSk7CiAgICAgICAgfQogICAgICB9CgogICAgICB0eXBlVGVzdHMuZm9yRWFjaFByb3BlcnR5KF9zb3J0ZXIsIChqcy5OYW1lIG5hbWUsIGpzLk5vZGUgY29kZSkgewogICAgICAgIGlzQ2hlY2tzLmFkZChfYnVpbGRTdHViTWV0aG9kKG5hbWUsIGNvZGUpKTsKICAgICAgfSk7CiAgICB9CgogICAganMuTmFtZSBuYW1lID0gX25hbWVyLmNsYXNzTmFtZShjbHMpOwogICAgU3RyaW5nIGhvbGRlck5hbWUgPSBfbmFtZXIuZ2xvYmFsT2JqZWN0Rm9yQ2xhc3MoY2xzKTsKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiB3ZSBzaG91bGRuJ3QgdXBkYXRlIHRoZSByZWdpc3RyeSBpbiB0aGUgbWlkZGxlIG9mCiAgICAvLyBidWlsZGluZyBhIGNsYXNzLgogICAgSG9sZGVyIGhvbGRlciA9IF9yZWdpc3RyeS5yZWdpc3RlckhvbGRlcihob2xkZXJOYW1lKTsKICAgIGJvb2wgaXNJbnN0YW50aWF0ZWQgPSAhX25hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyhjbHMpICYmCiAgICAgICAgX2NvZGVnZW5Xb3JsZC5kaXJlY3RseUluc3RhbnRpYXRlZENsYXNzZXMuY29udGFpbnMoY2xzKTsKCiAgICBDbGFzcyByZXN1bHQ7CiAgICBpZiAoX2VsZW1lbnRFbnZpcm9ubWVudC5pc01peGluQXBwbGljYXRpb24oY2xzKSAmJgogICAgICAgICFvbmx5Rm9yUnRpICYmCiAgICAgICAgIWlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgIGFzc2VydCghX25hdGl2ZURhdGEuaXNOYXRpdmVDbGFzcyhjbHMpKTsKICAgICAgYXNzZXJ0KG1ldGhvZHMuaXNFbXB0eSk7CiAgICAgIGFzc2VydCghaXNDbG9zdXJlQmFzZUNsYXNzKTsKCiAgICAgIHJlc3VsdCA9IG5ldyBNaXhpbkFwcGxpY2F0aW9uKAogICAgICAgICAgY2xzLAogICAgICAgICAgbmFtZSwKICAgICAgICAgIGhvbGRlciwKICAgICAgICAgIGluc3RhbmNlRmllbGRzLAogICAgICAgICAgc3RhdGljRmllbGRzRm9yUmVmbGVjdGlvbiwKICAgICAgICAgIGNhbGxTdHVicywKICAgICAgICAgIGNoZWNrZWRTZXR0ZXJzLAogICAgICAgICAgaXNDaGVja3MsCiAgICAgICAgICBfcnRpQ2hlY2tzLnJlcXVpcmVkQ2hlY2tzW2Nsc10sCiAgICAgICAgICB0eXBlVGVzdHMuZnVuY3Rpb25UeXBlSW5kZXgsCiAgICAgICAgICBpc0RpcmVjdGx5SW5zdGFudGlhdGVkOiBpc0luc3RhbnRpYXRlZCwKICAgICAgICAgIGhhc1J0aUZpZWxkOiBoYXNSdGlGaWVsZCwKICAgICAgICAgIG9ubHlGb3JSdGk6IG9ubHlGb3JSdGkpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gbmV3IENsYXNzKAogICAgICAgICAgY2xzLAogICAgICAgICAgbmFtZSwKICAgICAgICAgIGhvbGRlciwKICAgICAgICAgIG1ldGhvZHMsCiAgICAgICAgICBpbnN0YW5jZUZpZWxkcywKICAgICAgICAgIHN0YXRpY0ZpZWxkc0ZvclJlZmxlY3Rpb24sCiAgICAgICAgICBjYWxsU3R1YnMsCiAgICAgICAgICBub1N1Y2hNZXRob2RTdHVicywKICAgICAgICAgIGNoZWNrZWRTZXR0ZXJzLAogICAgICAgICAgaXNDaGVja3MsCiAgICAgICAgICBfcnRpQ2hlY2tzLnJlcXVpcmVkQ2hlY2tzW2Nsc10sCiAgICAgICAgICB0eXBlVGVzdHMuZnVuY3Rpb25UeXBlSW5kZXgsCiAgICAgICAgICBpc0RpcmVjdGx5SW5zdGFudGlhdGVkOiBpc0luc3RhbnRpYXRlZCwKICAgICAgICAgIGhhc1J0aUZpZWxkOiBoYXNSdGlGaWVsZCwKICAgICAgICAgIG9ubHlGb3JSdGk6IG9ubHlGb3JSdGksCiAgICAgICAgICBpc05hdGl2ZTogX25hdGl2ZURhdGEuaXNOYXRpdmVDbGFzcyhjbHMpLAogICAgICAgICAgaXNDbG9zdXJlQmFzZUNsYXNzOiBpc0Nsb3N1cmVCYXNlQ2xhc3MsCiAgICAgICAgICBpc1NvZnREZWZlcnJlZDogX2lzU29mdERlZmVycmVkKGNscyksCiAgICAgICAgICBpc1N1cGVyTWl4aW5BcHBsaWNhdGlvbjogaXNTdXBlck1peGluQXBwbGljYXRpb24pOwogICAgfQogICAgX2NsYXNzZXNbY2xzXSA9IHJlc3VsdDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBib29sIF9tZXRob2ROZWVkc1N0dWJzKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkgewogICAgaWYgKG1ldGhvZCBpcyBKR2VuZXJhdG9yQm9keSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG1ldGhvZCBpcyBDb25zdHJ1Y3RvckJvZHlFbnRpdHkpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBtZXRob2QucGFyYW1ldGVyU3RydWN0dXJlLm9wdGlvbmFsUGFyYW1ldGVycyAhPSAwIHx8CiAgICAgICAgbWV0aG9kLnBhcmFtZXRlclN0cnVjdHVyZS50eXBlUGFyYW1ldGVycyAhPSAwOwogIH0KCiAgYm9vbCBfbWV0aG9kQ2FuQmVBcHBsaWVkKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkgewogICAgcmV0dXJuIF9iYWNrZW5kVXNhZ2UuaXNGdW5jdGlvbkFwcGx5VXNlZCAmJgogICAgICAgIF9pbmZlcnJlZERhdGEuZ2V0TWlnaHRCZVBhc3NlZFRvQXBwbHkobWV0aG9kKTsKICB9CgogIC8qIE1hcCB8IExpc3QgKi8gX2NvbXB1dGVQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzKEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkgewogICAgdmFyIC8qIE1hcCB8IExpc3QgKi8gb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzOwogICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSA9IG1ldGhvZC5wYXJhbWV0ZXJTdHJ1Y3R1cmU7CiAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcyA9IG5ldyBNYXA8U3RyaW5nLCBDb25zdGFudFZhbHVlPigpOwogICAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hQYXJhbWV0ZXIobWV0aG9kLAogICAgICAgICAgKERhcnRUeXBlIHR5cGUsIFN0cmluZyBuYW1lLCBDb25zdGFudFZhbHVlIGRlZmF1bHRWYWx1ZSkgewogICAgICAgIGlmIChwYXJhbWV0ZXJTdHJ1Y3R1cmUubmFtZWRQYXJhbWV0ZXJzLmNvbnRhaW5zKG5hbWUpKSB7CiAgICAgICAgICBhc3NlcnQoZGVmYXVsdFZhbHVlICE9IG51bGwpOwogICAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzW25hbWVdID0gZGVmYXVsdFZhbHVlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMgPSA8Q29uc3RhbnRWYWx1ZT5bXTsKICAgICAgaW50IGluZGV4ID0gMDsKICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoUGFyYW1ldGVyKG1ldGhvZCwKICAgICAgICAgIChEYXJ0VHlwZSB0eXBlLCBTdHJpbmcgbmFtZSwgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0VmFsdWUpIHsKICAgICAgICBpZiAoaW5kZXggPj0gcGFyYW1ldGVyU3RydWN0dXJlLnJlcXVpcmVkUGFyYW1ldGVycykgewogICAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLmFkZChkZWZhdWx0VmFsdWUpOwogICAgICAgIH0KICAgICAgICBpbmRleCsrOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXM7CiAgfQoKICBEYXJ0TWV0aG9kIF9idWlsZE1ldGhvZChGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBqcy5OYW1lIG5hbWUgPSBfbmFtZXIubWV0aG9kUHJvcGVydHlOYW1lKGVsZW1lbnQpOwogICAganMuRXhwcmVzc2lvbiBjb2RlID0gX2dlbmVyYXRlZENvZGVbZWxlbWVudF07CgogICAgLy8gVE9ETyhrYXNwZXJsKTogRmlndXJlIG91dCB1bmRlciB3aGljaCBjb25kaXRpb25zIGNvZGUgaXMgbnVsbC4KICAgIGlmIChjb2RlID09IG51bGwpIHJldHVybiBudWxsOwoKICAgIGJvb2wgY2FuVGVhck9mZiA9IGZhbHNlOwogICAganMuTmFtZSB0ZWFyT2ZmTmFtZTsKICAgIGJvb2wgaXNDbG9zdXJlQ2FsbE1ldGhvZCA9IGZhbHNlOwogICAgYm9vbCBpc05vdEFwcGx5VGFyZ2V0ID0KICAgICAgICAhZWxlbWVudC5pc0Z1bmN0aW9uIHx8IGVsZW1lbnQuaXNHZXR0ZXIgfHwgZWxlbWVudC5pc1NldHRlcjsKCiAgICBib29sIGNhbkJlQXBwbGllZCA9IF9tZXRob2RDYW5CZUFwcGxpZWQoZWxlbWVudCk7CgogICAganMuTmFtZSBhbGlhc05hbWUgPSBfY29kZWdlbldvcmxkLmlzQWxpYXNlZFN1cGVyTWVtYmVyKGVsZW1lbnQpCiAgICAgICAgPyBfbmFtZXIuYWxpYXNlZFN1cGVyTWVtYmVyUHJvcGVydHlOYW1lKGVsZW1lbnQpCiAgICAgICAgOiBudWxsOwoKICAgIGlmIChpc05vdEFwcGx5VGFyZ2V0KSB7CiAgICAgIGNhblRlYXJPZmYgPSBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChlbGVtZW50LmVuY2xvc2luZ0NsYXNzLmlzQ2xvc3VyZSkgewogICAgICAgIGNhblRlYXJPZmYgPSBmYWxzZTsKICAgICAgICBpc0Nsb3N1cmVDYWxsTWV0aG9kID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBDYXJlZnVsIHdpdGggb3BlcmF0b3JzLgogICAgICAgIGNhblRlYXJPZmYgPSBfY29kZWdlbldvcmxkLmhhc0ludm9rZWRHZXR0ZXIoZWxlbWVudCkgfHwKICAgICAgICAgICAgX2NvZGVnZW5Xb3JsZC5tZXRob2RzTmVlZHNTdXBlckdldHRlcihlbGVtZW50KTsKICAgICAgICB0ZWFyT2ZmTmFtZSA9IF9uYW1lci5nZXR0ZXJGb3JFbGVtZW50KGVsZW1lbnQpOwogICAgICB9CiAgICB9CgogICAgaWYgKGNhblRlYXJPZmYpIHsKICAgICAgYXNzZXJ0KGVsZW1lbnQgaXMhIENvbnN0cnVjdG9yRW50aXR5LCBmYWlsZWRBdChlbGVtZW50KSk7CiAgICAgIGFzc2VydChlbGVtZW50IGlzISBDb25zdHJ1Y3RvckJvZHlFbnRpdHksIGZhaWxlZEF0KGVsZW1lbnQpKTsKICAgIH0KCiAgICBib29sIGlzSW50ZXJjZXB0ZWQgPQogICAgICAgIF9jbG9zZWRXb3JsZC5pbnRlcmNlcHRvckRhdGEuaXNJbnRlcmNlcHRlZE1ldGhvZChlbGVtZW50KTsKCiAgICBqcy5OYW1lIGNhbGxOYW1lID0gbnVsbDsKICAgIGlmIChjYW5UZWFyT2ZmKSB7CiAgICAgIFNlbGVjdG9yIGNhbGxTZWxlY3RvciA9CiAgICAgICAgICBuZXcgU2VsZWN0b3IuZnJvbUVsZW1lbnQoZWxlbWVudCkudG9DYWxsU2VsZWN0b3IoKTsKICAgICAgY2FsbE5hbWUgPSBfbmFtZXIuaW52b2NhdGlvbk5hbWUoY2FsbFNlbGVjdG9yKTsKICAgIH0KCiAgICBEYXJ0VHlwZSBtZW1iZXJUeXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUoZWxlbWVudCk7CiAgICBqcy5FeHByZXNzaW9uIGZ1bmN0aW9uVHlwZTsKICAgIGlmIChjYW5UZWFyT2ZmKSB7CiAgICAgIE91dHB1dFVuaXQgb3V0cHV0VW5pdCA9IF9vdXRwdXRVbml0RGF0YS5vdXRwdXRVbml0Rm9yTWVtYmVyKGVsZW1lbnQpOwogICAgICBmdW5jdGlvblR5cGUgPSBfZ2VuZXJhdGVGdW5jdGlvblR5cGUobWVtYmVyVHlwZSwgb3V0cHV0VW5pdCk7CiAgICB9CgogICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0gZWxlbWVudDsKICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUgPSBtZXRob2QucGFyYW1ldGVyU3RydWN0dXJlOwogICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPSBwYXJhbWV0ZXJTdHJ1Y3R1cmUucmVxdWlyZWRQYXJhbWV0ZXJzOwogICAgdmFyIC8qIExpc3QgfCBNYXAgKi8gb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzOwogICAgaW50IGFwcGx5SW5kZXggPSAwOwogICAgaWYgKGNhbkJlQXBwbGllZCkgewogICAgICBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMgPSBfY29tcHV0ZVBhcmFtZXRlckRlZmF1bHRWYWx1ZXMobWV0aG9kKTsKICAgICAgaWYgKHBhcmFtZXRlclN0cnVjdHVyZS50eXBlUGFyYW1ldGVycyA+IDApIHsKICAgICAgICBhcHBseUluZGV4ID0gMTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBuZXcgSW5zdGFuY2VNZXRob2QoZWxlbWVudCwgbmFtZSwgY29kZSwKICAgICAgICBfZ2VuZXJhdGVQYXJhbWV0ZXJTdHVicyhlbGVtZW50LCBjYW5UZWFyT2ZmLCBjYW5CZUFwcGxpZWQpLCBjYWxsTmFtZSwKICAgICAgICBuZWVkc1RlYXJPZmY6IGNhblRlYXJPZmYsCiAgICAgICAgdGVhck9mZk5hbWU6IHRlYXJPZmZOYW1lLAogICAgICAgIGlzQ2xvc3VyZUNhbGxNZXRob2Q6IGlzQ2xvc3VyZUNhbGxNZXRob2QsCiAgICAgICAgaXNJbnRlcmNlcHRlZDogaXNJbnRlcmNlcHRlZCwKICAgICAgICBhbGlhc05hbWU6IGFsaWFzTmFtZSwKICAgICAgICBjYW5CZUFwcGxpZWQ6IGNhbkJlQXBwbGllZCwKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlczogb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICAgIGZ1bmN0aW9uVHlwZTogZnVuY3Rpb25UeXBlLAogICAgICAgIGFwcGx5SW5kZXg6IGFwcGx5SW5kZXgpOwogIH0KCiAganMuRXhwcmVzc2lvbiBfZ2VuZXJhdGVGdW5jdGlvblR5cGUoCiAgICAgIEZ1bmN0aW9uVHlwZSB0eXBlLCBPdXRwdXRVbml0IG91dHB1dFVuaXQpIHsKICAgIGlmICh0eXBlLmNvbnRhaW5zVHlwZVZhcmlhYmxlcykgewogICAgICBqcy5FeHByZXNzaW9uIHRoaXNBY2Nlc3MgPSBqcy5qcyhyJ3RoaXMuJHJlY2VpdmVyJyk7CiAgICAgIHJldHVybiBfcnRpRW5jb2Rlci5nZXRTaWduYXR1cmVFbmNvZGluZygKICAgICAgICAgIF9uYW1lciwgX3Rhc2suZW1pdHRlciwgdHlwZSwgdGhpc0FjY2Vzcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gX3Rhc2subWV0YWRhdGFDb2xsZWN0b3IucmVpZnlUeXBlKHR5cGUsIG91dHB1dFVuaXQpOwogICAgfQogIH0KCiAgTGlzdDxQYXJhbWV0ZXJTdHViTWV0aG9kPiBfZ2VuZXJhdGVQYXJhbWV0ZXJTdHVicygKICAgICAgRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwgYm9vbCBjYW5UZWFyT2ZmLCBib29sIGNhbkJlQXBwbGllZCkgewogICAgaWYgKCFfbWV0aG9kTmVlZHNTdHVicyhlbGVtZW50KSkgcmV0dXJuIGNvbnN0IDxQYXJhbWV0ZXJTdHViTWV0aG9kPltdOwoKICAgIFBhcmFtZXRlclN0dWJHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IFBhcmFtZXRlclN0dWJHZW5lcmF0b3IoCiAgICAgICAgX3Rhc2suZW1pdHRlciwKICAgICAgICBfdGFzay5uYXRpdmVFbWl0dGVyLAogICAgICAgIF9uYW1lciwKICAgICAgICBfcnRpRW5jb2RlciwKICAgICAgICBfb3B0aW9ucy5leHBlcmltZW50TmV3UnRpID8gX3J0aVJlY2lwZUVuY29kZXIgOiBudWxsLAogICAgICAgIF9uYXRpdmVEYXRhLAogICAgICAgIF9pbnRlcmNlcHRvckRhdGEsCiAgICAgICAgX2NvZGVnZW5Xb3JsZCwKICAgICAgICBfY2xvc2VkV29ybGQsCiAgICAgICAgX3NvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kpOwogICAgcmV0dXJuIGdlbmVyYXRvci5nZW5lcmF0ZVBhcmFtZXRlclN0dWJzKGVsZW1lbnQsCiAgICAgICAgY2FuVGVhck9mZjogY2FuVGVhck9mZiwgY2FuQmVBcHBsaWVkOiBjYW5CZUFwcGxpZWQpOwogIH0KCiAgTGlzdDxTdHViTWV0aG9kPiBfZ2VuZXJhdGVJbnN0YW50aWF0aW9uU3R1YnMoQ2xhc3NFbnRpdHkgaW5zdGFudGlhdGlvbkNsYXNzKSB7CiAgICBJbnN0YW50aWF0aW9uU3R1YkdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgSW5zdGFudGlhdGlvblN0dWJHZW5lcmF0b3IoCiAgICAgICAgX3Rhc2ssIF9uYW1lciwgX2Nsb3NlZFdvcmxkLCBfY29kZWdlbldvcmxkLCBfc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSk7CiAgICByZXR1cm4gZ2VuZXJhdG9yLmdlbmVyYXRlU3R1YnMoaW5zdGFudGlhdGlvbkNsYXNzLCBudWxsKTsKICB9CgogIC8vLyBCdWlsZHMgYSBzdHViIG1ldGhvZC4KICAvLy8KICAvLy8gU3R1YiBtZXRob2RzIG1heSBoYXZlIGFuIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCBmb3IgY29kZS1zaXplCiAgLy8vIGF0dHJpYnV0aW9uLgogIE1ldGhvZCBfYnVpbGRTdHViTWV0aG9kKGpzLk5hbWUgbmFtZSwganMuRXhwcmVzc2lvbiBjb2RlLAogICAgICB7TWVtYmVyRW50aXR5IGVsZW1lbnR9KSB7CiAgICByZXR1cm4gbmV3IFN0dWJNZXRob2QobmFtZSwgY29kZSwgZWxlbWVudDogZWxlbWVudCk7CiAgfQoKICAvLyBUaGUgZ2V0SW50ZXJjZXB0b3IgbWV0aG9kcyBkaXJlY3RseSBhY2Nlc3MgdGhlIHByb3RvdHlwZSBvZiBjbGFzc2VzLgogIC8vIFdlIG11c3QgZXZhbHVhdGUgdGhlc2UgY2xhc3NlcyBlYWdlcmx5IHNvIHRoYXQgdGhlIHByb3RvdHlwZSBpcwogIC8vIGFjY2Vzc2libGUuCiAgdm9pZCBfbWFya0VhZ2VySW50ZXJjZXB0b3JDbGFzc2VzKCkgewogICAgSXRlcmFibGU8U3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcj4gaW50ZXJjZXB0b3JzID0KICAgICAgICBfb25lU2hvdEludGVyY2VwdG9yRGF0YS5zcGVjaWFsaXplZEdldEludGVyY2VwdG9yczsKICAgIGZvciAoU3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvciBpbnRlcmNlcHRvciBpbiBpbnRlcmNlcHRvcnMpIHsKICAgICAgZm9yIChDbGFzc0VudGl0eSBlbGVtZW50IGluIGludGVyY2VwdG9yLmNsYXNzZXMpIHsKICAgICAgICBDbGFzcyBjbHMgPSBfY2xhc3Nlc1tlbGVtZW50XTsKICAgICAgICBpZiAoY2xzICE9IG51bGwpIGNscy5pc0VhZ2VyID0gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KCiAgSXRlcmFibGU8U3RhdGljU3R1Yk1ldGhvZD4gX2dlbmVyYXRlR2V0SW50ZXJjZXB0b3JNZXRob2RzKCkgewogICAgSW50ZXJjZXB0b3JTdHViR2VuZXJhdG9yIHN0dWJHZW5lcmF0b3IgPSBuZXcgSW50ZXJjZXB0b3JTdHViR2VuZXJhdG9yKAogICAgICAgIF9jb21tb25FbGVtZW50cywKICAgICAgICBfdGFzay5lbWl0dGVyLAogICAgICAgIF9uYXRpdmVDb2RlZ2VuRW5xdWV1ZXIsCiAgICAgICAgX25hbWVyLAogICAgICAgIF9jdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpcywKICAgICAgICBfY29kZWdlbldvcmxkLAogICAgICAgIF9jbG9zZWRXb3JsZCk7CgogICAgU3RyaW5nIGhvbGRlck5hbWUgPQogICAgICAgIF9uYW1lci5nbG9iYWxPYmplY3RGb3JMaWJyYXJ5KF9jb21tb25FbGVtZW50cy5pbnRlcmNlcHRvcnNMaWJyYXJ5KTsKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiB3ZSBzaG91bGRuJ3QgdXBkYXRlIHRoZSByZWdpc3RyeSBpbiB0aGUgbWlkZGxlIG9mCiAgICAvLyBnZW5lcmF0aW5nIHRoZSBpbnRlcmNlcHRvciBtZXRob2RzLgogICAgSG9sZGVyIGhvbGRlciA9IF9yZWdpc3RyeS5yZWdpc3RlckhvbGRlcihob2xkZXJOYW1lKTsKICAgIExpc3Q8anMuTmFtZT4gbmFtZXMgPSBbXTsKICAgIE1hcDxqcy5OYW1lLCBTcGVjaWFsaXplZEdldEludGVyY2VwdG9yPiBpbnRlcmNlcHRvck1hcCA9IHt9OwogICAgZm9yIChTcGVjaWFsaXplZEdldEludGVyY2VwdG9yIGludGVyY2VwdG9yCiAgICAgICAgaW4gX29uZVNob3RJbnRlcmNlcHRvckRhdGEuc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnMpIHsKICAgICAganMuTmFtZSBuYW1lID0gX25hbWVyLm5hbWVGb3JHZXRJbnRlcmNlcHRvcihpbnRlcmNlcHRvci5jbGFzc2VzKTsKICAgICAgbmFtZXMuYWRkKG5hbWUpOwogICAgICBhc3NlcnQoCiAgICAgICAgICAhaW50ZXJjZXB0b3JNYXAuY29udGFpbnNLZXkobmFtZSksCiAgICAgICAgICAiRHVwbGljYXRlIHNwZWNpYWxpemVkIGdldCBpbnRlcmNlcHRvciBmb3IgJG5hbWU6IEV4aXN0aW5nOiAiCiAgICAgICAgICAiJHtpbnRlcmNlcHRvck1hcFtuYW1lXX0sIG5ldyAke2ludGVyY2VwdG9yfS4iKTsKICAgICAgaW50ZXJjZXB0b3JNYXBbbmFtZV0gPSBpbnRlcmNlcHRvcjsKICAgIH0KICAgIG5hbWVzLnNvcnQoKTsKICAgIHJldHVybiBuYW1lcy5tYXAoKGpzLk5hbWUgbmFtZSkgewogICAgICBTcGVjaWFsaXplZEdldEludGVyY2VwdG9yIGludGVyY2VwdG9yID0gaW50ZXJjZXB0b3JNYXBbbmFtZV07CiAgICAgIGpzLkV4cHJlc3Npb24gY29kZSA9CiAgICAgICAgICBzdHViR2VuZXJhdG9yLmdlbmVyYXRlR2V0SW50ZXJjZXB0b3JNZXRob2QoaW50ZXJjZXB0b3IpOwogICAgICByZXR1cm4gbmV3IFN0YXRpY1N0dWJNZXRob2QobmFtZSwgaG9sZGVyLCBjb2RlKTsKICAgIH0pOwogIH0KCiAgTGlzdDxGaWVsZD4gX2J1aWxkRmllbGRzKAogICAgICB7Ym9vbCB2aXNpdFN0YXRpY3M6IGZhbHNlLAogICAgICBib29sIGlzSG9sZGVySW50ZXJjZXB0ZWRDbGFzczogZmFsc2UsCiAgICAgIExpYnJhcnlFbnRpdHkgbGlicmFyeSwKICAgICAgQ2xhc3NFbnRpdHkgY2xzfSkgewogICAgTGlzdDxGaWVsZD4gZmllbGRzID0gPEZpZWxkPltdOwoKICAgIHZvaWQgdmlzaXRGaWVsZChGaWVsZEVudGl0eSBmaWVsZCwganMuTmFtZSBuYW1lLCBqcy5OYW1lIGFjY2Vzc29yTmFtZSwKICAgICAgICBib29sIG5lZWRzR2V0dGVyLCBib29sIG5lZWRzU2V0dGVyLCBib29sIG5lZWRzQ2hlY2tlZFNldHRlcikgewogICAgICBpbnQgZ2V0dGVyRmxhZ3MgPSAwOwogICAgICBpZiAobmVlZHNHZXR0ZXIpIHsKICAgICAgICBpZiAodmlzaXRTdGF0aWNzIHx8CiAgICAgICAgICAgICFfaW50ZXJjZXB0b3JEYXRhLmZpZWxkSGFzSW50ZXJjZXB0ZWRHZXR0ZXIoZmllbGQpKSB7CiAgICAgICAgICBnZXR0ZXJGbGFncyA9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGdldHRlckZsYWdzICs9IDI7CiAgICAgICAgICAvLyBUT0RPKHNyYSk6ICdpc0ludGVyY2VwdGVkQ2xhc3MnIG1pZ2h0IG5vdCBiZSB0aGUgY29ycmVjdCB0ZXN0CiAgICAgICAgICAvLyBmb3IgbWV0aG9kcyBmb3JjZWQgdG8gdXNlIHRoZSBpbnRlcmNlcHRvciBjb252ZW50aW9uIGJlY2F1c2UKICAgICAgICAgIC8vIHRoZSBtZXRob2QncyBjbGFzcyB3YXMgZWxzZXdoZXJlIG1peGVkLWluIHRvIGFuIGludGVyY2VwdG9yLgogICAgICAgICAgaWYgKCFpc0hvbGRlckludGVyY2VwdGVkQ2xhc3MpIHsKICAgICAgICAgICAgZ2V0dGVyRmxhZ3MgKz0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGludCBzZXR0ZXJGbGFncyA9IDA7CiAgICAgIGlmIChuZWVkc1NldHRlcikgewogICAgICAgIGlmICh2aXNpdFN0YXRpY3MgfHwKICAgICAgICAgICAgIV9pbnRlcmNlcHRvckRhdGEuZmllbGRIYXNJbnRlcmNlcHRlZFNldHRlcihmaWVsZCkpIHsKICAgICAgICAgIHNldHRlckZsYWdzID0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2V0dGVyRmxhZ3MgKz0gMjsKICAgICAgICAgIGlmICghaXNIb2xkZXJJbnRlcmNlcHRlZENsYXNzKSB7CiAgICAgICAgICAgIHNldHRlckZsYWdzICs9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBGaWVsZEFuYWx5c2lzRGF0YSBmaWVsZERhdGEgPSBfZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEoZmllbGQpOwogICAgICBDb25zdGFudFZhbHVlIGluaXRpYWxpemVySW5BbGxvY2F0b3I7CiAgICAgIGlmIChmaWVsZERhdGEuaXNJbml0aWFsaXplZEluQWxsb2NhdG9yKSB7CiAgICAgICAgaW5pdGlhbGl6ZXJJbkFsbG9jYXRvciA9IGZpZWxkRGF0YS5pbml0aWFsVmFsdWU7CiAgICAgIH0KICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudFZhbHVlOwogICAgICBpZiAoZmllbGREYXRhLmlzRWZmZWN0aXZlbHlDb25zdGFudCkgewogICAgICAgIGNvbnN0YW50VmFsdWUgPSBmaWVsZERhdGEuY29uc3RhbnRWYWx1ZTsKICAgICAgfQoKICAgICAgZmllbGRzLmFkZChuZXcgRmllbGQoCiAgICAgICAgICBmaWVsZCwKICAgICAgICAgIG5hbWUsCiAgICAgICAgICBhY2Nlc3Nvck5hbWUsCiAgICAgICAgICBnZXR0ZXJGbGFncywKICAgICAgICAgIHNldHRlckZsYWdzLAogICAgICAgICAgbmVlZHNDaGVja2VkU2V0dGVyLAogICAgICAgICAgaW5pdGlhbGl6ZXJJbkFsbG9jYXRvciwKICAgICAgICAgIGNvbnN0YW50VmFsdWUsCiAgICAgICAgICBmaWVsZERhdGEuaXNFbGlkZWQpKTsKICAgIH0KCiAgICBGaWVsZFZpc2l0b3IgdmlzaXRvciA9IG5ldyBGaWVsZFZpc2l0b3IoX29wdGlvbnMsIF9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLCBfY29kZWdlbldvcmxkLCBfbmF0aXZlRGF0YSwgX25hbWVyLCBfY2xvc2VkV29ybGQpOwogICAgdmlzaXRvci52aXNpdEZpZWxkcyh2aXNpdEZpZWxkLAogICAgICAgIHZpc2l0U3RhdGljczogdmlzaXRTdGF0aWNzLCBsaWJyYXJ5OiBsaWJyYXJ5LCBjbHM6IGNscyk7CgogICAgcmV0dXJuIGZpZWxkczsKICB9CgogIEl0ZXJhYmxlPFN0YXRpY1N0dWJNZXRob2Q+IF9nZW5lcmF0ZU9uZVNob3RJbnRlcmNlcHRvcnMoKSB7CiAgICBJbnRlcmNlcHRvclN0dWJHZW5lcmF0b3Igc3R1YkdlbmVyYXRvciA9IG5ldyBJbnRlcmNlcHRvclN0dWJHZW5lcmF0b3IoCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLAogICAgICAgIF90YXNrLmVtaXR0ZXIsCiAgICAgICAgX25hdGl2ZUNvZGVnZW5FbnF1ZXVlciwKICAgICAgICBfbmFtZXIsCiAgICAgICAgX2N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzLAogICAgICAgIF9jb2RlZ2VuV29ybGQsCiAgICAgICAgX2Nsb3NlZFdvcmxkKTsKCiAgICBTdHJpbmcgaG9sZGVyTmFtZSA9CiAgICAgICAgX25hbWVyLmdsb2JhbE9iamVjdEZvckxpYnJhcnkoX2NvbW1vbkVsZW1lbnRzLmludGVyY2VwdG9yc0xpYnJhcnkpOwogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHdlIHNob3VsZG4ndCB1cGRhdGUgdGhlIHJlZ2lzdHJ5IGluIHRoZSBtaWRkbGUgb2YKICAgIC8vIGdlbmVyYXRpbmcgdGhlIGludGVyY2VwdG9yIG1ldGhvZHMuCiAgICBIb2xkZXIgaG9sZGVyID0gX3JlZ2lzdHJ5LnJlZ2lzdGVySG9sZGVyKGhvbGRlck5hbWUpOwogICAgTGlzdDxqcy5OYW1lPiBuYW1lcyA9IFtdOwogICAgTWFwPGpzLk5hbWUsIE9uZVNob3RJbnRlcmNlcHRvcj4gaW50ZXJjZXB0b3JNYXAgPSB7fTsKICAgIGZvciAoT25lU2hvdEludGVyY2VwdG9yIGludGVyY2VwdG9yCiAgICAgICAgaW4gX29uZVNob3RJbnRlcmNlcHRvckRhdGEub25lU2hvdEludGVyY2VwdG9ycykgewogICAgICBqcy5OYW1lIG5hbWUgPSBfbmFtZXIubmFtZUZvck9uZVNob3RJbnRlcmNlcHRvcigKICAgICAgICAgIGludGVyY2VwdG9yLnNlbGVjdG9yLCBpbnRlcmNlcHRvci5jbGFzc2VzKTsKICAgICAgbmFtZXMuYWRkKG5hbWUpOwogICAgICBhc3NlcnQoCiAgICAgICAgICAhaW50ZXJjZXB0b3JNYXAuY29udGFpbnNLZXkobmFtZSksCiAgICAgICAgICAiRHVwbGljYXRlIHNwZWNpYWxpemVkIGdldCBpbnRlcmNlcHRvciBmb3IgJG5hbWU6IEV4aXN0aW5nOiAiCiAgICAgICAgICAiJHtpbnRlcmNlcHRvck1hcFtuYW1lXX0sIG5ldyAke2ludGVyY2VwdG9yfS4iKTsKICAgICAgaW50ZXJjZXB0b3JNYXBbbmFtZV0gPSBpbnRlcmNlcHRvcjsKICAgIH0KICAgIG5hbWVzLnNvcnQoKTsKICAgIHJldHVybiBuYW1lcy5tYXAoKGpzLk5hbWUgbmFtZSkgewogICAgICBPbmVTaG90SW50ZXJjZXB0b3IgaW50ZXJjZXB0b3IgPSBpbnRlcmNlcHRvck1hcFtuYW1lXTsKICAgICAganMuRXhwcmVzc2lvbiBjb2RlID0KICAgICAgICAgIHN0dWJHZW5lcmF0b3IuZ2VuZXJhdGVPbmVTaG90SW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpOwogICAgICByZXR1cm4gbmV3IFN0YXRpY1N0dWJNZXRob2QobmFtZSwgaG9sZGVyLCBjb2RlKTsKICAgIH0pOwogIH0KCiAgU3RhdGljRGFydE1ldGhvZCBfYnVpbGRTdGF0aWNNZXRob2QoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAganMuTmFtZSBuYW1lID0gX25hbWVyLm1ldGhvZFByb3BlcnR5TmFtZShlbGVtZW50KTsKICAgIFN0cmluZyBob2xkZXIgPSBfbmFtZXIuZ2xvYmFsT2JqZWN0Rm9yTWVtYmVyKGVsZW1lbnQpOwogICAganMuRXhwcmVzc2lvbiBjb2RlID0gX2dlbmVyYXRlZENvZGVbZWxlbWVudF07CgogICAgYm9vbCBpc0FwcGx5VGFyZ2V0ID0KICAgICAgICAhZWxlbWVudC5pc0NvbnN0cnVjdG9yICYmICFlbGVtZW50LmlzR2V0dGVyICYmICFlbGVtZW50LmlzU2V0dGVyOwogICAgYm9vbCBjYW5CZUFwcGxpZWQgPSBfbWV0aG9kQ2FuQmVBcHBsaWVkKGVsZW1lbnQpOwoKICAgIGJvb2wgbmVlZHNUZWFyT2ZmID0KICAgICAgICBpc0FwcGx5VGFyZ2V0ICYmIF9jb2RlZ2VuV29ybGQuY2xvc3VyaXplZFN0YXRpY3MuY29udGFpbnMoZWxlbWVudCk7CgogICAganMuTmFtZSB0ZWFyT2ZmTmFtZSA9CiAgICAgICAgbmVlZHNUZWFyT2ZmID8gX25hbWVyLnN0YXRpY0Nsb3N1cmVOYW1lKGVsZW1lbnQpIDogbnVsbDsKCiAgICBqcy5OYW1lIGNhbGxOYW1lID0gbnVsbDsKICAgIGlmIChuZWVkc1RlYXJPZmYpIHsKICAgICAgU2VsZWN0b3IgY2FsbFNlbGVjdG9yID0KICAgICAgICAgIG5ldyBTZWxlY3Rvci5mcm9tRWxlbWVudChlbGVtZW50KS50b0NhbGxTZWxlY3RvcigpOwogICAgICBjYWxsTmFtZSA9IF9uYW1lci5pbnZvY2F0aW9uTmFtZShjYWxsU2VsZWN0b3IpOwogICAgfQogICAganMuRXhwcmVzc2lvbiBmdW5jdGlvblR5cGU7CiAgICBEYXJ0VHlwZSB0eXBlID0gX2VsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUoZWxlbWVudCk7CiAgICBpZiAobmVlZHNUZWFyT2ZmKSB7CiAgICAgIE91dHB1dFVuaXQgb3V0cHV0VW5pdCA9IF9vdXRwdXRVbml0RGF0YS5vdXRwdXRVbml0Rm9yTWVtYmVyKGVsZW1lbnQpOwogICAgICBmdW5jdGlvblR5cGUgPSBfZ2VuZXJhdGVGdW5jdGlvblR5cGUodHlwZSwgb3V0cHV0VW5pdCk7CiAgICB9CgogICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0gZWxlbWVudDsKICAgIFBhcmFtZXRlclN0cnVjdHVyZSBwYXJhbWV0ZXJTdHJ1Y3R1cmUgPSBtZXRob2QucGFyYW1ldGVyU3RydWN0dXJlOwogICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPSBwYXJhbWV0ZXJTdHJ1Y3R1cmUucmVxdWlyZWRQYXJhbWV0ZXJzOwogICAgdmFyIC8qIExpc3QgfCBNYXAgKi8gb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzOwogICAgaW50IGFwcGx5SW5kZXggPSAwOwogICAgaWYgKGNhbkJlQXBwbGllZCkgewogICAgICBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMgPSBfY29tcHV0ZVBhcmFtZXRlckRlZmF1bHRWYWx1ZXMobWV0aG9kKTsKICAgICAgaWYgKHBhcmFtZXRlclN0cnVjdHVyZS50eXBlUGFyYW1ldGVycyA+IDApIHsKICAgICAgICBhcHBseUluZGV4ID0gMTsKICAgICAgfQogICAgfQoKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiB3ZSBzaG91bGRuJ3QgdXBkYXRlIHRoZSByZWdpc3RyeSBpbiB0aGUgbWlkZGxlIG9mCiAgICAvLyBidWlsZGluZyBhIHN0YXRpYyBtZXRob2QuCiAgICByZXR1cm4gbmV3IFN0YXRpY0RhcnRNZXRob2QoCiAgICAgICAgZWxlbWVudCwKICAgICAgICBuYW1lLAogICAgICAgIF9yZWdpc3RyeS5yZWdpc3RlckhvbGRlcihob2xkZXIpLAogICAgICAgIGNvZGUsCiAgICAgICAgX2dlbmVyYXRlUGFyYW1ldGVyU3R1YnMoZWxlbWVudCwgbmVlZHNUZWFyT2ZmLCBjYW5CZUFwcGxpZWQpLAogICAgICAgIGNhbGxOYW1lLAogICAgICAgIG5lZWRzVGVhck9mZjogbmVlZHNUZWFyT2ZmLAogICAgICAgIHRlYXJPZmZOYW1lOiB0ZWFyT2ZmTmFtZSwKICAgICAgICBjYW5CZUFwcGxpZWQ6IGNhbkJlQXBwbGllZCwKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlczogb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICAgIGZ1bmN0aW9uVHlwZTogZnVuY3Rpb25UeXBlLAogICAgICAgIGFwcGx5SW5kZXg6IGFwcGx5SW5kZXgpOwogIH0KCiAgdm9pZCBfcmVnaXN0ZXJDb25zdGFudHMoCiAgICAgIE91dHB1dFVuaXQgb3V0cHV0VW5pdCwgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gY29uc3RhbnRWYWx1ZXMpIHsKICAgIC8vIGBjb25zdGFudFZhbHVlc2AgaXMgbnVsbCBpZiBhbiBvdXRwdXRVbml0IGRvZXNuJ3QgY29udGFpbiBhbnkgY29uc3RhbnRzLgogICAgaWYgKGNvbnN0YW50VmFsdWVzID09IG51bGwpIHJldHVybjsKICAgIGZvciAoQ29uc3RhbnRWYWx1ZSBjb25zdGFudFZhbHVlIGluIGNvbnN0YW50VmFsdWVzKSB7CiAgICAgIF9yZWdpc3RyeS5yZWdpc3RlckNvbnN0YW50KG91dHB1dFVuaXQsIGNvbnN0YW50VmFsdWUpOwogICAgICBhc3NlcnQoIV9jb25zdGFudHMuY29udGFpbnNLZXkoY29uc3RhbnRWYWx1ZSkpOwogICAgICBqcy5OYW1lIG5hbWUgPSBfbmFtZXIuY29uc3RhbnROYW1lKGNvbnN0YW50VmFsdWUpOwogICAgICBTdHJpbmcgY29uc3RhbnRPYmplY3QgPSBfbmFtZXIuZ2xvYmFsT2JqZWN0Rm9yQ29uc3RhbnQoY29uc3RhbnRWYWx1ZSk7CiAgICAgIEhvbGRlciBob2xkZXIgPQogICAgICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVySG9sZGVyKGNvbnN0YW50T2JqZWN0LCBpc0NvbnN0YW50c0hvbGRlcjogdHJ1ZSk7CiAgICAgIENvbnN0YW50IGNvbnN0YW50ID0gbmV3IENvbnN0YW50KG5hbWUsIGhvbGRlciwgY29uc3RhbnRWYWx1ZSk7CiAgICAgIF9jb25zdGFudHNbY29uc3RhbnRWYWx1ZV0gPSBjb25zdGFudDsKICAgIH0KICB9CgogIEhvbGRlciBfcmVnaXN0ZXJTdGF0aWNTdGF0ZUhvbGRlcigpIHsKICAg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bGV2ZWwpLgovLy8KLy8vIFtuYW1lXSBpcyB0aGUgZmllbGQgbmFtZSB0aGF0IHRoZSBbTmFtZXJdIGhhcyBwaWNrZWQgZm9yIHRoaXMgZmllbGQncwovLy8gc3RvcmFnZSwgdGhhdCBpcywgdGhlIEphdmFTY3JpcHQgcHJvcGVydHkgbmFtZS4KLy8vCi8vLyBbYWNjZXNzb3JOYW1lXSBpcyB0aGUgbmFtZSBvZiB0aGUgYWNjZXNzb3IuIEZvciBpbnN0YW5jZSBmaWVsZHMgdGhpcyBpcwovLy8gbW9zdGx5IHRoZSBzYW1lIGFzIFtuYW1lXSBleGNlcHQgd2hlbiBbbWVtYmVyXSBpcyBzaGFkb3dpbmcgYSBmaWVsZCBpbiBpdHMKLy8vIHN1cGVyY2xhc3MuICBGb3Igb3RoZXIgZmllbGRzLCB0aGV5IGFyZSByYXJlbHkgdGhlIHNhbWUuCi8vLwovLy8gW25lZWRzR2V0dGVyXSBhbmQgW25lZWRzU2V0dGVyXSByZXByZXNlbnQgaWYgYSBnZXR0ZXIgb3IgYSBzZXR0ZXIKLy8vIHJlc3BlY3RpdmVseSBpcyBuZWVkZWQuICBUaGVyZSBhcmUgbWFueSBmYWN0b3JzIGluIHRoaXMsIGZvciBleGFtcGxlLCBpZiB0aGUKLy8vIGFjY2Vzc29yIGNhbiBiZSBpbmxpbmVkLgovLy8KLy8vIFtuZWVkc0NoZWNrZWRTZXR0ZXJdIGluZGljYXRlcyB0aGF0IGEgY2hlY2tlZCBnZXR0ZXIgaXMgbmVlZGVkLCBhbmQgaW4gdGhpcwovLy8gY2FzZSwgW25lZWRzU2V0dGVyXSBpcyBhbHdheXMgZmFsc2UuIFtuZWVkc0NoZWNrZWRTZXR0ZXJdIGlzIG9ubHkgdHJ1ZSB3aGVuCi8vLyB0eXBlIGFzc2VydGlvbnMgYXJlIGVuYWJsZWQgKGNoZWNrZWQgbW9kZSkuCnR5cGVkZWYgdm9pZCBBY2NlcHRGaWVsZChGaWVsZEVudGl0eSBtZW1iZXIsIGpzLk5hbWUgbmFtZSwganMuTmFtZSBhY2Nlc3Nvck5hbWUsCiAgICBib29sIG5lZWRzR2V0dGVyLCBib29sIG5lZWRzU2V0dGVyLCBib29sIG5lZWRzQ2hlY2tlZFNldHRlcik7CgpjbGFzcyBGaWVsZFZpc2l0b3IgewogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBfb3B0aW9uczsKICBmaW5hbCBKRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CiAgZmluYWwgSkNvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKICBmaW5hbCBDb2RlZ2VuV29ybGQgX2NvZGVnZW5Xb3JsZDsKICBmaW5hbCBOYXRpdmVEYXRhIF9uYXRpdmVEYXRhOwogIGZpbmFsIE5hbWVyIF9uYW1lcjsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwoKICBGaWVsZFZpc2l0b3IodGhpcy5fb3B0aW9ucywgdGhpcy5fZWxlbWVudEVudmlyb25tZW50LCB0aGlzLl9jb21tb25FbGVtZW50cywKICAgICAgdGhpcy5fY29kZWdlbldvcmxkLCB0aGlzLl9uYXRpdmVEYXRhLCB0aGlzLl9uYW1lciwgdGhpcy5fY2xvc2VkV29ybGQpOwoKICAvLy8gSW52b2tlcyBbZl0gZm9yIGVhY2ggb2YgdGhlIGZpZWxkcyBvZiBbZWxlbWVudF0uCiAgLy8vCiAgLy8vIFtlbGVtZW50XSBtdXN0IGJlIGEgW0NsYXNzRW50aXR5XSBvciBhIFtMaWJyYXJ5RW50aXR5XS4KICAvLy8KICAvLy8gSWYgW2VsZW1lbnRdIGlzIGEgW0NsYXNzRW50aXR5XSwgdGhlIHN0YXRpYyBmaWVsZHMgb2YgdGhlIGNsYXNzIGFyZQogIC8vLyB2aXNpdGVkIGlmIFt2aXNpdFN0YXRpY3NdIGlzIHRydWUgYW5kIHRoZSBpbnN0YW5jZSBmaWVsZHMgYXJlIHZpc2l0ZWQgaWYKICAvLy8gW3Zpc2l0U3RhdGljc10gaXMgZmFsc2UuCiAgLy8vCiAgLy8vIElmIFtlbGVtZW50XSBpcyBhIFtMaWJyYXJ5RW50aXR5XSwgW3Zpc2l0U3RhdGljc10gbXVzdCBiZSB0cnVlLgogIC8vLwogIC8vLyBXaGVuIHZpc2l0aW5nIHRoZSBpbnN0YW5jZSBmaWVsZHMgb2YgYSBjbGFzcywgdGhlIGZpZWxkcyBvZiBpdHMgc3VwZXJjbGFzcwogIC8vLyBhcmUgYWxzbyB2aXNpdGVkIGlmIHRoZSBjbGFzcyBpcyBpbnN0YW50aWF0ZWQuCiAgLy8vCiAgLy8vIEludmFyaWFudDogW2VsZW1lbnRdIG11c3QgYmUgYSBkZWNsYXJhdGlvbiBlbGVtZW50LgogIHZvaWQgdmlzaXRGaWVsZHMoQWNjZXB0RmllbGQgZiwKICAgICAge2Jvb2wgdmlzaXRTdGF0aWNzOiBmYWxzZSwgTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBDbGFzc0VudGl0eSBjbHN9KSB7CiAgICBib29sIGlzTmF0aXZlQ2xhc3MgPSBmYWxzZTsKICAgIGJvb2wgaXNMaWJyYXJ5ID0gZmFsc2U7CiAgICBib29sIGlzSW5zdGFudGlhdGVkID0gZmFsc2U7CiAgICBpZiAoY2xzICE9IG51bGwpIHsKICAgICAgaXNOYXRpdmVDbGFzcyA9IF9uYXRpdmVEYXRhLmlzTmF0aXZlQ2xhc3MoY2xzKTsKCiAgICAgIC8vIElmIHRoZSBjbGFzcyBpcyBuZXZlciBpbnN0YW50aWF0ZWQgd2Ugc3RpbGwgbmVlZCB0byBzZXQgaXQgdXAgZm9yCiAgICAgIC8vIGluaGVyaXRhbmNlIHB1cnBvc2VzLCBidXQgd2UgY2FuIHNpbXBsaWZ5IGl0cyBKYXZhU2NyaXB0IGNvbnN0cnVjdG9yLgogICAgICBpc0luc3RhbnRpYXRlZCA9IF9jb2RlZ2VuV29ybGQuZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzLmNvbnRhaW5zKGNscyk7CiAgICB9IGVsc2UgaWYgKGxpYnJhcnkgIT0gbnVsbCkgewogICAgICBpc0xpYnJhcnkgPSB0cnVlOwogICAgICBhc3NlcnQodmlzaXRTdGF0aWNzLCBmYWlsZWRBdChsaWJyYXJ5KSk7CiAgICB9IGVsc2UgewogICAgICBmYWlsZWRBdCgKICAgICAgICAgIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwgJ0V4cGVjdGVkIGEgQ2xhc3NFbnRpdHkgb3IgYSBMaWJyYXJ5RW50aXR5LicpOwogICAgfQoKICAgIHZvaWQgdmlzaXRGaWVsZChGaWVsZEVudGl0eSBmaWVsZCwge0NsYXNzRW50aXR5IGhvbGRlcn0pIHsKICAgICAgYm9vbCBpc01peGluTmF0aXZlRmllbGQgPQogICAgICAgICAgaXNOYXRpdmVDbGFzcyAmJiBfZWxlbWVudEVudmlyb25tZW50LmlzTWl4aW5BcHBsaWNhdGlvbihob2xkZXIpOwoKICAgICAgLy8gU2VlIGlmIHdlIGNhbiBkeW5hbWljYWxseSBjcmVhdGUgZ2V0dGVycyBhbmQgc2V0dGVycy4KICAgICAgLy8gV2UgY2FuIG9ubHkgZ2VuZXJhdGUgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgW2VsZW1lbnRdIHNpbmNlCiAgICAgIC8vIHRoZSBmaWVsZHMgb2Ygc3VwZXIgY2xhc3NlcyBjb3VsZCBiZSBvdmVyd3JpdHRlbiB3aXRoIGdldHRlcnMgb3IKICAgICAgLy8gc2V0dGVycy4KICAgICAgYm9vbCBuZWVkc0dldHRlciA9IGZhbHNlOwogICAgICBib29sIG5lZWRzU2V0dGVyID0gZmFsc2U7CiAgICAgIGlmIChpc0xpYnJhcnkgfHwgaXNNaXhpbk5hdGl2ZUZpZWxkIHx8IGhvbGRlciA9PSBjbHMpIHsKICAgICAgICBuZWVkc0dldHRlciA9IGZpZWxkTmVlZHNHZXR0ZXIoZmllbGQpOwogICAgICAgIG5lZWRzU2V0dGVyID0gZmllbGROZWVkc1NldHRlcihmaWVsZCk7CiAgICAgIH0KCiAgICAgIGlmICgoaXNJbnN0YW50aWF0ZWQgJiYgIV9uYXRpdmVEYXRhLmlzTmF0aXZlQ2xhc3MoY2xzKSkgfHwKICAgICAgICAgIG5lZWRzR2V0dGVyIHx8CiAgICAgICAgICBuZWVkc1NldHRlcikgewogICAgICAgIGpzLk5hbWUgYWNjZXNzb3JOYW1lID0gX25hbWVyLmZpZWxkQWNjZXNzb3JOYW1lKGZpZWxkKTsKICAgICAgICBqcy5OYW1lIGZpZWxkTmFtZSA9IF9uYW1lci5maWVsZFByb3BlcnR5TmFtZShmaWVsZCk7CiAgICAgICAgYm9vbCBuZWVkc0NoZWNrZWRTZXR0ZXIgPSBmYWxzZTsKICAgICAgICBpZiAoX2Nsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YQogICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlckNoZWNrUG9saWN5KGZpZWxkKQogICAgICAgICAgICAgICAgLmlzRW1pdHRlZCAmJgogICAgICAgICAgICBuZWVkc1NldHRlciAmJgogICAgICAgICAgICAhY2FuQXZvaWRHZW5lcmF0ZWRDaGVja2VkU2V0dGVyKGZpZWxkKSkgewogICAgICAgICAgbmVlZHNDaGVja2VkU2V0dGVyID0gdHJ1ZTsKICAgICAgICAgIG5lZWRzU2V0dGVyID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIEdldHRlcnMgYW5kIHNldHRlcnMgd2l0aCBzdWZmaXhlcyB3aWxsIGJlIGdlbmVyYXRlZCBkeW5hbWljYWxseS4KICAgICAgICBmKGZpZWxkLCBmaWVsZE5hbWUsIGFjY2Vzc29yTmFtZSwgbmVlZHNHZXR0ZXIsIG5lZWRzU2V0dGVyLAogICAgICAgICAgICBuZWVkc0NoZWNrZWRTZXR0ZXIpOwogICAgICB9CiAgICB9CgogICAgaWYgKGlzTGlicmFyeSkgewogICAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hMaWJyYXJ5TWVtYmVyKGxpYnJhcnksIChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgICAgaWYgKG1lbWJlci5pc0ZpZWxkKSB2aXNpdEZpZWxkKG1lbWJlcik7CiAgICAgIH0pOwogICAgfSBlbHNlIGlmICh2aXNpdFN0YXRpY3MpIHsKICAgICAgX2VsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoTG9jYWxDbGFzc01lbWJlcihjbHMsIChNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgICAgaWYgKG1lbWJlci5pc0ZpZWxkICYmIG1lbWJlci5pc1N0YXRpYykgewogICAgICAgICAgdmlzaXRGaWVsZChtZW1iZXIsIGhvbGRlcjogY2xzKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgLy8gVE9ETyhrYXNwZXJsKTogV2Ugc2hvdWxkIG1ha2Ugc3VyZSB0byBvbmx5IGVtaXQgb25lIHZlcnNpb24gb2YKICAgICAgLy8gb3ZlcnJpZGRlbiBmaWVsZHMuIFJpZ2h0IG5vdywgd2UgcmVseSBvbiB0aGUgb3JkZXJpbmcgc28gdGhlCiAgICAgIC8vIGZpZWxkcyBwdWxsZWQgaW4gZnJvbSBtaXhpbnMgYXJlIHJlcGxhY2VkIHdpdGggdGhlIGZpZWxkcyBmcm9tCiAgICAgIC8vIHRoZSBjbGFzcyBkZWZpbml0aW9uLgoKICAgICAgLy8gSWYgYSBjbGFzcyBpcyBub3QgaW5zdGFudGlhdGVkIHRoZW4gd2UgYWRkIHRoZSBmaWVsZCBqdXN0IHNvIHdlIGNhbgogICAgICAvLyBnZW5lcmF0ZSB0aGUgZmllbGQgZ2V0dGVyL3NldHRlciBkeW5hbWljYWxseS4gU2luY2UgdGhpcyBpcyBvbmx5CiAgICAgIC8vIGFsbG93ZWQgb24gZmllbGRzIHRoYXQgYXJlIGluIFtlbGVtZW50XSB3ZSBkb24ndCBuZWVkIHRvIHZpc2l0CiAgICAgIC8vIHN1cGVyY2xhc3NlcyBmb3Igbm9uLWluc3RhbnRpYXRlZCBjbGFzc2VzLgogICAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hDbGFzc01lbWJlcihjbHMsCiAgICAgICAgICAoQ2xhc3NFbnRpdHkgaG9sZGVyLCBNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICAgICAgaWYgKGNscyAhPSBob2xkZXIgJiYgIWlzSW5zdGFudGlhdGVkKSByZXR1cm47CiAgICAgICAgaWYgKG1lbWJlci5pc0ZpZWxkICYmICFtZW1iZXIuaXNTdGF0aWMpIHsKICAgICAgICAgIHZpc2l0RmllbGQobWVtYmVyLCBob2xkZXI6IGhvbGRlcik7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CgogIGJvb2wgZmllbGROZWVkc0dldHRlcihGaWVsZEVudGl0eSBmaWVsZCkgewogICAgYXNzZXJ0KGZpZWxkLmlzRmllbGQpOwogICAgaWYgKGZpZWxkQWNjZXNzTmV2ZXJUaHJvd3MoZmllbGQpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gZmllbGQuaXNJbnN0YW5jZU1lbWJlciAmJiBfY29kZWdlbldvcmxkLmhhc0ludm9rZWRHZXR0ZXIoZmllbGQpOwogIH0KCiAgYm9vbCBmaWVsZE5lZWRzU2V0dGVyKEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICBhc3NlcnQoZmllbGQuaXNGaWVsZCk7CiAgICBpZiAoZmllbGRBY2Nlc3NOZXZlclRocm93cyhmaWVsZCkpIHJldHVybiBmYWxzZTsKICAgIGlmICghZmllbGQuaXNBc3NpZ25hYmxlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gZmllbGQuaXNJbnN0YW5jZU1lbWJlciAmJiBfY29kZWdlbldvcmxkLmhhc0ludm9rZWRTZXR0ZXIoZmllbGQpOwogIH0KCiAgc3RhdGljIGJvb2wgZmllbGRBY2Nlc3NOZXZlclRocm93cyhGaWVsZEVudGl0eSBmaWVsZCkgewogICAgcmV0dXJuCiAgICAgICAgLy8gV2UgbmV2ZXIgYWNjZXNzIGEgZmllbGQgaW4gYSBjbG9zdXJlIChhIGNhcHR1cmVkIHZhcmlhYmxlKSB3aXRob3V0CiAgICAgICAgLy8ga25vd2luZyB0aGF0IGl0IGlzIHRoZXJlLiAgVGhlcmVmb3JlIHdlIGRvbid0IG5lZWQgdG8gdXNlIGEgZ2V0dGVyCiAgICAgICAgLy8gKHRoYXQgd2lsbCB0aHJvdyBpZiB0aGUgZ2V0dGVyIG1ldGhvZCBpcyBtaXNzaW5nKSwgYnV0IGNhbiBhbHdheXMKICAgICAgICAvLyBhY2Nlc3MgdGhlIGZpZWxkIGRpcmVjdGx5LgogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJldHVybiBgdHJ1ZWAgSkNsb3N1cmVGaWVsZC4KICAgICAgICBmYWxzZTsKICB9CgogIGJvb2wgY2FuQXZvaWRHZW5lcmF0ZWRDaGVja2VkU2V0dGVyKEZpZWxkRW50aXR5IG1lbWJlcikgewogICAgLy8gV2UgbmV2ZXIgZ2VuZXJhdGUgYWNjZXNzb3JzIGZvciB0b3AtbGV2ZWwvc3RhdGljIGZpZWxkcy4KICAgIGlmICghbWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIpIHJldHVybiB0cnVlOwogICAgRGFydFR5cGUgdHlwZSA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RmllbGRUeXBlKG1lbWJlcik7CiAgICByZXR1cm4gdHlwZS50cmVhdEFzRHluYW1pYyB8fCB0eXBlID09IF9jb21tb25FbGVtZW50cy5vYmplY3RUeXBlOwogIH0KfQqApwBOTjwBLAE6BEo0BExPPQRGUR0EUFAwUUIBFSIxKSQgFiMBTk0BNwY+BkpPHwZGBlE1BjoiTCAcIRc2AUtPUCIYLw0QUAYBPyBLAT9GShIgID4vLwgBQRkZQD0pKTAeGzYlHwpMRCEIBgEVUDAKH08xKwoKDUhGSB8BTUpINDI2NjIuCgoGBAEtGzVMBAEtGzUrTAQBOgtOTk0mPQ8EATxALz5GBAIBQnBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvcHJvZ3JhbV9idWlsZGVyL2ZpZWxkX3Zpc2l0b3IuZGFydEdzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19lbWl0dGVyL3Byb2dyYW1fYnVpbGRlci9jb2xsZWN0b3IuZGFydK8cLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydDJqcy5qc19lbWl0dGVyLnByb2dyYW1fYnVpbGRlcjsKCi8vLyBHZW5lcmF0ZXMgdGhlIGNvZGUgZm9yIGFsbCB1c2VkIGNsYXNzZXMgaW4gdGhlIHByb2dyYW0uIFN0YXRpYyBmaWVsZHMgKGV2ZW4KLy8vIGluIGNsYXNzZXMpIGFyZSBpZ25vcmVkLCBzaW5jZSB0aGV5IGNhbiBiZSB0cmVhdGVkIGFzIG5vbi1jbGFzcyBlbGVtZW50cy4KLy8vCi8vLyBUaGUgY29kZSBmb3IgdGhlIGNvbnRhaW5pbmcgKHVzZWQpIG1ldGhvZHMgbXVzdCBleGlzdCBpbiB0aGUgYHVuaXZlcnNlYC4KY2xhc3MgQ29sbGVjdG9yIHsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgZmluYWwgSkNvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKICBmaW5hbCBKRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CiAgZmluYWwgT3V0cHV0VW5pdERhdGEgX291dHB1dFVuaXREYXRhOwogIGZpbmFsIENvZGVnZW5Xb3JsZCBfY29kZWdlbldvcmxkOwogIC8vIFRPRE8oZmxvaXRzY2gpOiB0aGUgY29kZS1lbWl0dGVyIHRhc2sgc2hvdWxkIG5vdCBuZWVkIGEgbmFtZXIuCiAgZmluYWwgTmFtZXIgX25hbWVyOwogIGZpbmFsIEVtaXR0ZXIgX2VtaXR0ZXI7CiAgZmluYWwgTmF0aXZlRGF0YSBfbmF0aXZlRGF0YTsKICBmaW5hbCBJbnRlcmNlcHRvckRhdGEgX2ludGVyY2VwdG9yRGF0YTsKICBmaW5hbCBPbmVTaG90SW50ZXJjZXB0b3JEYXRhIF9vbmVTaG90SW50ZXJjZXB0b3JEYXRhOwogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBfcnRpTmVlZGVkQ2xhc3NlczsKICBmaW5hbCBNYXA8TWVtYmVyRW50aXR5LCBqcy5FeHByZXNzaW9uPiBfZ2VuZXJhdGVkQ29kZTsKICBmaW5hbCBTb3J0ZXIgX3NvcnRlcjsKCiAgZmluYWwgU2V0PENsYXNzRW50aXR5PiBuZWVkZWRDbGFzc2VzID0gbmV3IFNldDxDbGFzc0VudGl0eT4oKTsKICAvLyBUaGlzIGZpZWxkIGlzIHNldCBpbiBbY29tcHV0ZU5lZWRlZERlY2xhcmF0aW9uc10uCiAgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzT25seU5lZWRlZEZvclJ0aTsKICBmaW5hbCBNYXA8T3V0cHV0VW5pdCwgTGlzdDxDbGFzc0VudGl0eT4+IG91dHB1dENsYXNzTGlzdHMgPQogICAgICBuZXcgTWFwPE91dHB1dFVuaXQsIExpc3Q8Q2xhc3NFbnRpdHk+PigpOwogIGZpbmFsIE1hcDxPdXRwdXRVbml0LCBMaXN0PENvbnN0YW50VmFsdWU+PiBvdXRwdXRDb25zdGFudExpc3RzID0KICAgICAgbmV3IE1hcDxPdXRwdXRVbml0LCBMaXN0PENvbnN0YW50VmFsdWU+PigpOwogIGZpbmFsIE1hcDxPdXRwdXRVbml0LCBMaXN0PE1lbWJlckVudGl0eT4+IG91dHB1dFN0YXRpY0xpc3RzID0KICAgICAgbmV3IE1hcDxPdXRwdXRVbml0LCBMaXN0PE1lbWJlckVudGl0eT4+KCk7CiAgZmluYWwgTWFwPE91dHB1dFVuaXQsIExpc3Q8RmllbGRFbnRpdHk+PiBvdXRwdXRTdGF0aWNOb25GaW5hbEZpZWxkTGlzdHMgPQogICAgICBuZXcgTWFwPE91dHB1dFVuaXQsIExpc3Q8RmllbGRFbnRpdHk+PigpOwogIGZpbmFsIE1hcDxPdXRwdXRVbml0LCBTZXQ8TGlicmFyeUVudGl0eT4+IG91dHB1dExpYnJhcnlMaXN0cyA9CiAgICAgIG5ldyBNYXA8T3V0cHV0VW5pdCwgU2V0PExpYnJhcnlFbnRpdHk+PigpOwoKICAvLy8gVHJ1ZSwgaWYgdGhlIG91dHB1dCBjb250YWlucyBhIGNvbnN0YW50IGxpc3QuCiAgLy8vCiAgLy8vIFRoaXMgZmxhZyBpcyB1cGRhdGVkIGluIFtjb21wdXRlTmVlZGVkQ29uc3RhbnRzXS4KICBib29sIG91dHB1dENvbnRhaW5zQ29uc3RhbnRMaXN0ID0gZmFsc2U7CgogIGZpbmFsIExpc3Q8Q2xhc3NFbnRpdHk+IG5hdGl2ZUNsYXNzZXNBbmRTdWJjbGFzc2VzID0gPENsYXNzRW50aXR5PltdOwoKICBDb2xsZWN0b3IoCiAgICAgIHRoaXMuX29wdGlvbnMsCiAgICAgIHRoaXMuX2NvbW1vbkVsZW1lbnRzLAogICAgICB0aGlzLl9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIHRoaXMuX291dHB1dFVuaXREYXRhLAogICAgICB0aGlzLl9jb2RlZ2VuV29ybGQsCiAgICAgIHRoaXMuX25hbWVyLAogICAgICB0aGlzLl9lbWl0dGVyLAogICAgICB0aGlzLl9uYXRpdmVEYXRhLAogICAgICB0aGlzLl9pbnRlcmNlcHRvckRhdGEsCiAgICAgIHRoaXMuX29uZVNob3RJbnRlcmNlcHRvckRhdGEsCiAgICAgIHRoaXMuX2Nsb3NlZFdvcmxkLAogICAgICB0aGlzLl9ydGlOZWVkZWRDbGFzc2VzLAogICAgICB0aGlzLl9nZW5lcmF0ZWRDb2RlLAogICAgICB0aGlzLl9zb3J0ZXIpOwoKICBTZXQ8Q2xhc3NFbnRpdHk+IGNvbXB1dGVJbnRlcmNlcHRvcnNSZWZlcmVuY2VkRnJvbUNvbnN0YW50cygpIHsKICAgIFNldDxDbGFzc0VudGl0eT4gY2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBjb25zdGFudHMgPSBfY29kZWdlbldvcmxkLmdldENvbnN0YW50c0ZvckVtaXNzaW9uKCk7CiAgICBmb3IgKENvbnN0YW50VmFsdWUgY29uc3RhbnQgaW4gY29uc3RhbnRzKSB7CiAgICAgIGlmIChjb25zdGFudCBpcyBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUpIHsKICAgICAgICBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgaW50ZXJjZXB0b3JDb25zdGFudCA9IGNvbnN0YW50OwogICAgICAgIGNsYXNzZXMuYWRkKGludGVyY2VwdG9yQ29uc3RhbnQuY2xzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNsYXNzZXM7CiAgfQoKICAvLy8gUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgaXRzIGFyZ3VtZW50IGlzIGEgY2xhc3MKICAvLy8gdGhhdCBuZWVkcyB0byBiZSBlbWl0dGVkLgogIEZ1bmN0aW9uIGNvbXB1dGVDbGFzc0ZpbHRlcihJdGVyYWJsZTxDbGFzc0VudGl0eT4gYmFja2VuZFR5cGVIZWxwZXJzKSB7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IHVubmVlZGVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICAvLyBUaGUgW0Jvb2xdIGNsYXNzIGlzIG5vdCBtYXJrZWQgYXMgYWJzdHJhY3QsIGJ1dCBoYXMgYSBmYWN0b3J5CiAgICAvLyBjb25zdHJ1Y3RvciB0aGF0IGFsd2F5cyB0aHJvd3MuIFdlIG5ldmVyIG5lZWQgdG8gZW1pdCBpdC4KICAgIHVubmVlZGVkQ2xhc3Nlcy5hZGQoX2NvbW1vbkVsZW1lbnRzLmJvb2xDbGFzcyk7CgogICAgLy8gR28gb3ZlciBzcGVjaWFsaXplZCBpbnRlcmNlcHRvcnMgYW5kIHRoZW4gY29uc3RhbnRzIHRvIGtub3cgd2hpY2gKICAgIC8vIGludGVyY2VwdG9ycyBhcmUgbmVlZGVkLgogICAgU2V0PENsYXNzRW50aXR5PiBuZWVkZWQgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwogICAgZm9yIChTcGVjaWFsaXplZEdldEludGVyY2VwdG9yIGludGVyY2VwdG9yCiAgICAgICAgaW4gX29uZVNob3RJbnRlcmNlcHRvckRhdGEuc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnMpIHsKICAgICAgbmVlZGVkLmFkZEFsbChpbnRlcmNlcHRvci5jbGFzc2VzKTsKICAgIH0KCiAgICAvLyBBZGQgaW50ZXJjZXB0b3JzIHJlZmVyZW5jZWQgYnkgY29uc3RhbnRzLgogICAgbmVlZGVkLmFkZEFsbChjb21wdXRlSW50ZXJjZXB0b3JzUmVmZXJlbmNlZEZyb21Db25zdGFudHMoKSk7CgogICAgLy8gQWRkIHVubmVlZGVkIGludGVyY2VwdG9ycyB0byB0aGUgW3VubmVlZGVkQ2xhc3Nlc10gc2V0LgogICAgZm9yIChDbGFzc0VudGl0eSBpbnRlcmNlcHRvciBpbiBfaW50ZXJjZXB0b3JEYXRhLmludGVyY2VwdGVkQ2xhc3NlcykgewogICAgICBpZiAoIW5lZWRlZC5jb250YWlucyhpbnRlcmNlcHRvcikgJiYKICAgICAgICAgIGludGVyY2VwdG9yICE9IF9jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcykgewogICAgICAgIHVubmVlZGVkQ2xhc3Nlcy5hZGQoaW50ZXJjZXB0b3IpOwogICAgICB9CiAgICB9CgogICAgLy8gVGhlc2UgY2xhc3NlcyBhcmUganVzdCBoZWxwZXJzIGZvciB0aGUgYmFja2VuZCdzIHR5cGUgc3lzdGVtLgogICAgdW5uZWVkZWRDbGFzc2VzLmFkZEFsbChiYWNrZW5kVHlwZUhlbHBlcnMpOwoKICAgIHJldHVybiAoQ2xhc3NFbnRpdHkgY2xzKSA9PiAhdW5uZWVkZWRDbGFzc2VzLmNvbnRhaW5zKGNscyk7CiAgfQoKICAvLyBSZXR1cm4gdGhlIGNsYXNzZXMgdGhhdCBhcmUganVzdCBoZWxwZXJzIGZvciB0aGUgYmFja2VuZCdzIHR5cGUgc3lzdGVtLgogIHN0YXRpYyBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0QmFja2VuZFR5cGVIZWxwZXJzKAogICAgICBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMpIHsKICAgIHJldHVybiA8Q2xhc3NFbnRpdHk+WwogICAgICBjb21tb25FbGVtZW50cy5qc011dGFibGVBcnJheUNsYXNzLAogICAgICBjb21tb25FbGVtZW50cy5qc0ZpeGVkQXJyYXlDbGFzcywKICAgICAgY29tbW9uRWxlbWVudHMuanNFeHRlbmRhYmxlQXJyYXlDbGFzcywKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTWFyayB0aGlzIGFzIGEgYmFja2VuZCB0eXBlIGhlbHBlcjoKICAgICAgLy9jb21tb25FbGVtZW50cy5qc1VubW9kaWZpYWJsZUFycmF5Q2xhc3MsCiAgICAgIGNvbW1vbkVsZW1lbnRzLmpzVUludDMyQ2xhc3MsCiAgICAgIGNvbW1vbkVsZW1lbnRzLmpzVUludDMxQ2xhc3MsCiAgICAgIGNvbW1vbkVsZW1lbnRzLmpzUG9zaXRpdmVJbnRDbGFzcwogICAgXTsKICB9CgogIC8vLyBDb21wdXRlIGFsbCB0aGUgY29uc3RhbnRzIHRoYXQgbXVzdCBiZSBlbWl0dGVkLgogIHZvaWQgY29tcHV0ZU5lZWRlZENvbnN0YW50cygpIHsKICAgIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IGNvbnN0YW50cyA9CiAgICAgICAgX2NvZGVnZW5Xb3JsZC5nZXRDb25zdGFudHNGb3JFbWlzc2lvbihfZW1pdHRlci5jb21wYXJlQ29uc3RhbnRzKTsKICAgIGZvciAoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCBpbiBjb25zdGFudHMpIHsKICAgICAgaWYgKF9lbWl0dGVyLmlzQ29uc3RhbnRJbmxpbmVkT3JBbHJlYWR5RW1pdHRlZChjb25zdGFudCkpIGNvbnRpbnVlOwoKICAgICAgaWYgKGNvbnN0YW50LmlzTGlzdCkgb3V0cHV0Q29udGFpbnNDb25zdGFudExpc3QgPSB0cnVlOwoKICAgICAgT3V0cHV0VW5pdCBjb25zdGFudFVuaXQgPSBfb3V0cHV0VW5pdERhdGEub3V0cHV0VW5pdEZvckNvbnN0YW50KGNvbnN0YW50KTsKICAgICAgaWYgKGNvbnN0YW50VW5pdCA9PSBudWxsKSB7CiAgICAgICAgLy8gVGhlIGJhY2stZW5kIGludHJvZHVjZXMgc29tZSBjb25zdGFudHMsIGxpa2UgIkludGVyY2VwdG9yQ29uc3RhbnQiIG9yCiAgICAgICAgLy8gc29tZSBsaXN0IGNvbnN0YW50cy4gVGhleSBhcmUgZW1pdHRlZCBpbiB0aGUgbWFpbiBvdXRwdXQtdW5pdC4KICAgICAgICAvLyBUT0RPKHNpZ3VyZG0pOiBXZSBzaG91bGQgdHJhY2sgdGhvc2UgY29uc3RhbnRzLgogICAgICAgIGNvbnN0YW50VW5pdCA9IF9vdXRwdXRVbml0RGF0YS5tYWluT3V0cHV0VW5pdDsKICAgICAgfQogICAgICBvdXRwdXRDb25zdGFudExpc3RzCiAgICAgICAgICAucHV0SWZBYnNlbnQoY29uc3RhbnRVbml0LCAoKSA9PiBuZXcgTGlzdDxDb25zdGFudFZhbHVlPigpKQogICAgICAgICAgLmFkZChjb25zdGFudCk7CiAgICB9CiAgfQoKICAvLy8gQ29tcHV0ZSBhbGwgdGhlIGNsYXNzZXMgYW5kIHR5cGVkZWZzIHRoYXQgbXVzdCBiZSBlbWl0dGVkLgogIHZvaWQgY29tcHV0ZU5lZWRlZERlY2xhcmF0aW9ucygpIHsKICAgIFNldDxDbGFzc0VudGl0eT4gYmFja2VuZFR5cGVIZWxwZXJzID0KICAgICAgICBnZXRCYWNrZW5kVHlwZUhlbHBlcnMoX2NvbW1vbkVsZW1lbnRzKS50b1NldCgpOwoKICAgIC8vIENvbXB1dGUgbmVlZGVkIGNsYXNzZXMuCiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGluc3RhbnRpYXRlZENsYXNzZXMgPQogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoaXMgc2hvdWxkIGJlIGFjY2Vzc2VkIGZyb20gYSBjb2RlZ2VuIGNsb3NlZAogICAgICAgIC8vIHdvcmxkLgogICAgICAgIF9jb2RlZ2VuV29ybGQuZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzCiAgICAgICAgICAgIC53aGVyZShjb21wdXRlQ2xhc3NGaWx0ZXIoYmFja2VuZFR5cGVIZWxwZXJzKSkKICAgICAgICAgICAgLnRvU2V0KCk7CgogICAgdm9pZCBhZGRDbGFzc1dpdGhTdXBlcmNsYXNzZXMoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICAgIG5lZWRlZENsYXNzZXMuYWRkKGNscyk7CiAgICAgIGZvciAoQ2xhc3NFbnRpdHkgc3VwZXJjbGFzcyA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhjbHMpOwogICAgICAgICAgc3VwZXJjbGFzcyAhPSBudWxsOwogICAgICAgICAgc3VwZXJjbGFzcyA9IF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0U3VwZXJDbGFzcyhzdXBlcmNsYXNzKSkgewogICAgICAgIG5lZWRlZENsYXNzZXMuYWRkKHN1cGVyY2xhc3MpOwogICAgICB9CiAgICB9CgogICAgdm9pZCBhZGRDbGFzc2VzV2l0aFN1cGVyY2xhc3NlcyhJdGVyYWJsZTxDbGFzc0VudGl0eT4gY2xhc3NlcykgewogICAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBjbGFzc2VzKSB7CiAgICAgICAgYWRkQ2xhc3NXaXRoU3VwZXJjbGFzc2VzKGNscyk7CiAgICAgIH0KICAgIH0KCiAgICAvLyAxLiBXZSBuZWVkIHRvIGdlbmVyYXRlIGFsbCBjbGFzc2VzIHRoYXQgYXJlIGluc3RhbnRpYXRlZC4KICAgIGFkZENsYXNzZXNXaXRoU3VwZXJjbGFzc2VzKGluc3RhbnRpYXRlZENsYXNzZXMpOwoKICAgIC8vIDIuIEFkZCBhbGwgY2xhc3NlcyB1c2VkIGFzIG1peGlucy4KICAgIFNldDxDbGFzc0VudGl0eT4gbWl4aW5DbGFzc2VzID0gbmVlZGVkQ2xhc3NlcwogICAgICAgIC53aGVyZShfZWxlbWVudEVudmlyb25tZW50LmlzTWl4aW5BcHBsaWNhdGlvbikKICAgICAgICAubWFwKF9lbGVtZW50RW52aXJvbm1lbnQuZ2V0RWZmZWN0aXZlTWl4aW5DbGFzcykKICAgICAgICAudG9TZXQoKTsKICAgIG5lZWRlZENsYXNzZXMuYWRkQWxsKG1peGluQ2xhc3Nlcyk7CgogICAgLy8gMy4gRmluZCBhbGwgY2xhc3NlcyBuZWVkZWQgZm9yIHJ0aS4KICAgIC8vIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgaXMgdGhlIHBlbnVsdGltYXRlIHN0ZXAsIGF0IHRoaXMgcG9pbnQsCiAgICAvLyBuZWVkZWRDbGFzc2VzIG11c3Qgb25seSBjb250YWluIGNsYXNzZXMgdGhhdCBoYXZlIGJlZW4gcmVzb2x2ZWQgYW5kCiAgICAvLyBjb2RlZ2VuJ2QuIFRoZSBydGlOZWVkZWRDbGFzc2VzIG1heSBjb250YWluIGFkZGl0aW9uYWwgY2xhc3NlcywgYnV0CiAgICAvLyB0aGVzZSBhcmUgdGhvdWdodCB0byBub3QgaGF2ZSBiZWVuIGluc3RhbnRpYXRlZCwgc28gd2UgbmVlZCB0byBiZSBhYmxlCiAgICAvLyB0byBpZGVudGlmeSB0aGVtIGxhdGVyIGFuZCBtYWtlIHN1cmUgd2Ugb25seSBlbWl0ICJlbXB0eSBzaGVsbHMiIHdpdGhvdXQKICAgIC8vIGZpZWxkcywgZXRjLgogICAgY2xhc3Nlc09ubHlOZWVkZWRGb3JSdGkgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwogICAgZm9yIChDbGFzc0VudGl0eSBjbHMgaW4gX3J0aU5lZWRlZENsYXNzZXMpIHsKICAgICAgaWYgKGJhY2tlbmRUeXBlSGVscGVycy5jb250YWlucyhjbHMpKSBjb250aW51ZTsKICAgICAgd2hpbGUgKGNscyAhPSBudWxsICYmICFuZWVkZWRDbGFzc2VzLmNvbnRhaW5zKGNscykpIHsKICAgICAgICBpZiAoIWNsYXNzZXNPbmx5TmVlZGVkRm9yUnRpLmFkZChjbHMpKSBicmVhazsKICAgICAgICBjbHMgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY2xzKTsKICAgICAgfQogICAgfQoKICAgIG5lZWRlZENsYXNzZXMuYWRkQWxsKGNsYXNzZXNPbmx5TmVlZGVkRm9yUnRpKTsKCiAgICAvLyBUT0RPKDE4MTc1LCBmbG9pdHNjaCk6IHJlbW92ZSBvbmNlIGlzc3VlIDE4MTc1IGlzIGZpeGVkLgogICAgaWYgKG5lZWRlZENsYXNzZXMuY29udGFpbnMoX2NvbW1vbkVsZW1lbnRzLmpzSW50Q2xhc3MpKSB7CiAgICAgIG5lZWRlZENsYXNzZXMuYWRkKF9jb21tb25FbGVtZW50cy5pbnRDbGFzcyk7CiAgICB9CiAgICBpZiAobmVlZGVkQ2xhc3Nlcy5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzcykpIHsKICAgICAgbmVlZGVkQ2xhc3Nlcy5hZGQoX2NvbW1vbkVsZW1lbnRzLmRvdWJsZUNsYXNzKTsKICAgIH0KICAgIGlmIChuZWVkZWRDbGFzc2VzLmNvbnRhaW5zKF9jb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzKSkgewogICAgICBuZWVkZWRDbGFzc2VzLmFkZChfY29tbW9uRWxlbWVudHMubnVtQ2xhc3MpOwogICAgfQogICAgaWYgKG5lZWRlZENsYXNzZXMuY29udGFpbnMoX2NvbW1vbkVsZW1lbnRzLmpzU3RyaW5nQ2xhc3MpKSB7CiAgICAgIG5lZWRlZENsYXNzZXMuYWRkKF9jb21tb25FbGVtZW50cy5zdHJpbmdDbGFzcyk7CiAgICB9CiAgICBpZiAobmVlZGVkQ2xhc3Nlcy5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNCb29sQ2xhc3MpKSB7CiAgICAgIG5lZWRlZENsYXNzZXMuYWRkKF9jb21tb25FbGVtZW50cy5ib29sQ2xhc3MpOwogICAgfQogICAgaWYgKG5lZWRlZENsYXNzZXMuY29udGFpbnMoX2NvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcykpIHsKICAgICAgbmVlZGVkQ2xhc3Nlcy5hZGQoX2NvbW1vbkVsZW1lbnRzLmxpc3RDbGFzcyk7CiAgICB9CgogICAgLy8gNC4gRmluYWxseSwgc29ydCB0aGUgY2xhc3Nlcy4KICAgIExpc3Q8Q2xhc3NFbnRpdHk+IHNvcnRlZENsYXNzZXMgPSBfc29ydGVyLnNvcnRDbGFzc2VzKG5lZWRlZENsYXNzZXMpOwoKICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xzIGluIHNvcnRlZENsYXNzZXMpIHsKICAgICAgaWYgKF9uYXRpdmVEYXRhLmlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlKGNscykgJiYKICAgICAgICAgICFjbGFzc2VzT25seU5lZWRlZEZvclJ0aS5jb250YWlucyhjbHMpKSB7CiAgICAgICAgLy8gRm9yIG5vdywgbmF0aXZlIGNsYXNzZXMgYW5kIHJlbGF0ZWQgY2xhc3NlcyBjYW5ub3QgYmUgZGVmZXJyZWQuCiAgICAgICAgbmF0aXZlQ2xhc3Nlc0FuZFN1YmNsYXNzZXMuYWRkKGNscyk7CiAgICAgICAgYXNzZXJ0KCFfb3V0cHV0VW5pdERhdGEuaXNEZWZlcnJlZENsYXNzKGNscyksIGZhaWxlZEF0KGNscykpOwogICAgICAgIG91dHB1dENsYXNzTGlzdHMKICAgICAgICAgICAgLnB1dElmQWJzZW50KAogICAgICAgICAgICAgICAgX291dHB1dFVuaXREYXRhLm1haW5PdXRwdXRVbml0LCAoKSA9PiBuZXcgTGlzdDxDbGFzc0VudGl0eT4oKSkKICAgICAgICAgICAgLmFkZChjbHMpOwogICAgICB9IGVsc2UgewogICAgICAgIG91dHB1dENsYXNzTGlzdHMKICAgICAgICAgICAgLnB1dElmQWJzZW50KF9vdXRwdXRVbml0RGF0YS5vdXRwdXRVbml0Rm9yQ2xhc3MoY2xzKSwKICAgICAgICAgICAgICAgICgpID0+IG5ldyBMaXN0PENsYXNzRW50aXR5PigpKQogICAgICAgICAgICAuYWRkKGNscyk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgY29tcHV0ZU5lZWRlZFN0YXRpY3MoKSB7CiAgICBib29sIGlzU3RhdGljRnVuY3Rpb24oTWVtYmVyRW50aXR5IGVsZW1lbnQpID0+CiAgICAgICAgIWVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlciAmJiAhZWxlbWVudC5pc0ZpZWxkOwoKICAgIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZWxlbWVudHMgPQogICAgICAgIF9nZW5lcmF0ZWRDb2RlLmtleXMud2hlcmUoaXNTdGF0aWNGdW5jdGlvbik7CgogICAgZm9yIChNZW1iZXJFbnRpdHkgbWVtYmVyIGluIF9zb3J0ZXIuc29ydE1lbWJlcnMoZWxlbWVudHMpKSB7CiAgICAgIExpc3Q8TWVtYmVyRW50aXR5PiBsaXN0ID0gb3V0cHV0U3RhdGljTGlzdHMucHV0SWZBYnNlbnQoCiAgICAgICAgICBfb3V0cHV0VW5pdERhdGEub3V0cHV0VW5pdEZvck1lbWJlcihtZW1iZXIpLAogICAgICAgICAgKCkgPT4gbmV3IExpc3Q8TWVtYmVyRW50aXR5PigpKTsKICAgICAgbGlzdC5hZGQobWVtYmVyKTsKICAgIH0KICB9CgogIHZvaWQgY29tcHV0ZU5lZWRlZFN0YXRpY05vbkZpbmFsRmllbGRzKCkgewogICAgYWRkVG9PdXRwdXRVbml0KEZpZWxkRW50aXR5IGVsZW1lbnQpIHsKICAgICAgTGlzdDxGaWVsZEVudGl0eT4gbGlzdCA9IG91dHB1dFN0YXRpY05vbkZpbmFsRmllbGRMaXN0cy5wdXRJZkFic2VudCgKICAgICAgICAgIF9vdXRwdXRVbml0RGF0YS5vdXRwdXRVbml0Rm9yTWVtYmVyKGVsZW1lbnQpLAogICAgICAgICAgKCkgPT4gbmV3IExpc3Q8RmllbGRFbnRpdHk+KCkpOwogICAgICBsaXN0LmFkZChlbGVtZW50KTsKICAgIH0KCiAgICBMaXN0PEZpZWxkRW50aXR5PiBlYWdlckZpZWxkcyA9IFtdOwogICAgX2NvZGVnZW5Xb3JsZC5mb3JFYWNoU3RhdGljRmllbGQoKEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICAgIGlmIChfY2xvc2VkV29ybGQuZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEoZmllbGQpLmlzRWFnZXIpIHsKICAgICAgICBlYWdlckZpZWxkcy5hZGQoZmllbGQpOwogICAgICB9CiAgICB9KTsKCiAgICBlYWdlckZpZWxkcy5zb3J0KChGaWVsZEVudGl0eSBhLCBGaWVsZEVudGl0eSBiKSB7CiAgICAgIEZpZWxkQW5hbHlzaXNEYXRhIGFGaWVsZERhdGEgPSBfY2xvc2VkV29ybGQuZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEoYSk7CiAgICAgIEZpZWxkQW5hbHlzaXNEYXRhIGJGaWVsZERhdGEgPSBfY2xvc2VkV29ybGQuZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEoYik7CiAgICAgIGludCBhSW5kZXggPSBhRmllbGREYXRhLmVhZ2VyQ3JlYXRpb25JbmRleDsKICAgICAgaW50IGJJbmRleCA9IGJGaWVsZERhdGEuZWFnZXJDcmVhdGlvbkluZGV4OwogICAgICBpZiAoYUluZGV4ICE9IG51bGwgJiYgYkluZGV4ICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gYUluZGV4LmNvbXBhcmVUbyhiSW5kZXgpOwogICAgICB9IGVsc2UgaWYgKGFJbmRleCAhPSBudWxsKSB7CiAgICAgICAgLy8gU29ydCBbYl0gYmVmb3JlIFthXS4KICAgICAgICByZXR1cm4gMTsKICAgICAgfSBlbHNlIGlmIChiSW5kZXggIT0gbnVsbCkgewogICAgICAgIC8vIFNvcnQgW2FdIGJlZm9yZSBbYl0uCiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBfc29ydGVyLmNvbXBhcmVNZW1iZXJzQnlMb2NhdGlvbihhLCBiKTsKICAgICAgfQogICAgfSk7CiAgICBlYWdlckZpZWxkcy5mb3JFYWNoKGFkZFRvT3V0cHV0VW5pdCk7CiAgfQoKICB2b2lkIGNvbXB1dGVOZWVkZWRMaWJyYXJpZXMoKSB7CiAgICBfZ2VuZXJhdGVkQ29kZS5rZXlzLmZvckVhY2goKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICAgIE91dHB1dFVuaXQgdW5pdCA9IF9vdXRwdXRVbml0RGF0YS5vdXRwdXRVbml0Rm9yTWVtYmVyKGVsZW1lbnQpOwogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnkgPSBlbGVtZW50LmxpYnJhcnk7CiAgICAgIG91dHB1dExpYnJhcnlMaXN0cwogICAgICAgICAgLnB1dElmQWJzZW50KHVuaXQsICgpID0+IG5ldyBTZXQ8TGlicmFyeUVudGl0eT4oKSkKICAgICAgICAgIC5hZGQobGlicmFyeSk7CiAgICB9KTsKICAgIG5lZWRlZENsYXNzZXMuZm9yRWFjaCgoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAgICBPdXRwdXRVbml0IHVuaXQgPSBfb3V0cHV0VW5pdERhdGEub3V0cHV0VW5pdEZvckNsYXNzKGVsZW1lbnQpOwogICAgICBMaWJyYXJ5RW50aXR5IGxpYnJhcnkgPSBlbGVtZW50LmxpYnJhcnk7CiAgICAgIG91dHB1dExpYnJhcnlMaXN0cwogICAgICAgICAgLnB1dElmQWJzZW50KHVuaXQsICgpID0+IG5ldyBTZXQ8TGlicmFyeUVudGl0eT4oKSkKICAgICAgICAgIC5hZGQobGlicmFyeSk7CiAgICB9KTsKICB9CgogIHZvaWQgY29sbGVjdCgpIHsKICAgIGNvbXB1dGVOZWVkZWREZWNsYXJhdGlvbnMoKTsKICAgIGNvbXB1dGVOZWVkZWRDb25zdGFudHMoKTsKICAgIGNvbXB1dGVOZWVkZWRTdGF0aWNzKCk7CiAgICBjb21wdXRlTmVlZGVkU3RhdGljTm9uRmluYWxGaWVsZHMoKTsKICAgIGNvbXB1dGVOZWVkZWRMaWJyYXJpZXMoKTsKICB9Cn0KgUEATk48ASwBUE4ETRIiKTEoJEQWGiAqOCMsORgBQTcsPjBDMkAxTDBBMQE0BjgrAUgBDRUcIBwaExUYHSQZHhsVAUI3UTAyQS4IBhQEAUUgSj9FQTQBSSA2L0EqBgExQQE/Sys4KggGAUUwAUAEAU02KBoqKC1CMSQkKAcEATYiKEowSgE+AVEiUUo7NwgaRhoGBAFBJSo4AR8rThIyOxYBNR5MHkgnCAYBRSknCAYBQTUBKjI3ORIoAStJS0tOUBQ2MTY8NjYIBgEzAUA+MwZBNgZBMwZBNgY/NAZANAYBJUoBLTY0Sy1GGRpPFw8ZQi8XCAYEASAzNwEmNQFBPzcrGAYEAS0rSzgqGQYBKDtEIAgIATZRUTIyLikjIBIjIBMPNwgIKgQBIjlGLxk9GQgyRS8ZPRkIBAETIR4cKR4EAgE+cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9wcm9ncmFtX2J1aWxkZXIvY29sbGVjdG9yLmRhcnRGc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfZW1pdHRlci9wcm9ncmFtX2J1aWxkZXIvcmVnaXN0cnkuZGFydJOWLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydDJqcy5qc19lbWl0dGVyLnByb2dyYW1fYnVpbGRlcjsKCmNsYXNzIExpYnJhcnlDb250ZW50cyB7CiAgZmluYWwgTGlzdDxDbGFzc0VudGl0eT4gY2xhc3NlcyA9IDxDbGFzc0VudGl0eT5bXTsKICBmaW5hbCBMaXN0PE1lbWJlckVudGl0eT4gbWVtYmVycyA9IDxNZW1iZXJFbnRpdHk+W107Cn0KCi8vLyBNYXBzIFtMaWJyYXJ5RW50aXR5XXMgdG8gdGhlaXIgW0NsYXNzRW50aXR5XXMgYW5kIFtNZW1iZXJFbnRpdHldcy4KLy8vCi8vLyBGdW5kYW1lbnRhbGx5LCB0aGlzIGNsYXNzIG5pY2VseSBlbmNhcHN1bGF0ZXMgYQovLy8gYE1hcDxMaWJyYXJ5RW50aXR5LCBQYWlyPExpc3Q8Q2xhc3NFbnRpdHk+LCBMaXN0PE1lbWJlckVudGl0eT4+PmAuCi8vLwovLy8gVGhlcmUgZXhpc3RzIGV4YWN0bHkgb25lIGluc3RhbmNlIHBlciBbT3V0cHV0VW5pdF0uCmNsYXNzIExpYnJhcmllc01hcCB7CiAgZmluYWwgTWFwPExpYnJhcnlFbnRpdHksIExpYnJhcnlDb250ZW50cz4gX21hcHBpbmcgPQogICAgICA8TGlicmFyeUVudGl0eSwgTGlicmFyeUNvbnRlbnRzPnt9OwoKICAvLyBJdCBpcyB2ZXJ5IGNvbW1vbiB0byBhY2Nlc3MgdGhlIHNhbWUgbGlicmFyeSBtdWx0aXBsZSB0aW1lcyBpbiBhIHJvdywgc28KICAvLyB3ZSBjYWNoZSB0aGUgbGFzdCBhY2Nlc3MuCiAgTGlicmFyeUVudGl0eSBfbGFzdExpYnJhcnk7CiAgTGlicmFyeUNvbnRlbnRzIF9sYXN0TWFwcGluZzsKCiAgLy8vIEEgdW5pcXVlIG5hbWUgcmVwcmVzZW50aW5nIHRoaXMgaW5zdGFuY2UuCiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgT3V0cHV0VW5pdCBvdXRwdXRVbml0OwoKICBMaWJyYXJpZXNNYXAubWFpbih0aGlzLm91dHB1dFVuaXQpIDogbmFtZSA9ICIiOwoKICBMaWJyYXJpZXNNYXAuZGVmZXJyZWQodGhpcy5vdXRwdXRVbml0LCB0aGlzLm5hbWUpIHsKICAgIGFzc2VydChuYW1lICE9ICIiKTsKICB9CgogIExpYnJhcnlDb250ZW50cyBfZ2V0TWFwcGluZyhMaWJyYXJ5RW50aXR5IGxpYnJhcnkpIHsKICAgIGlmIChfbGFzdExpYnJhcnkgIT0gbGlicmFyeSkgewogICAgICBfbGFzdExpYnJhcnkgPSBsaWJyYXJ5OwogICAgICBfbGFzdE1hcHBpbmcgPSBfbWFwcGluZy5wdXRJZkFic2VudChsaWJyYXJ5LCAoKSA9PiBuZXcgTGlicmFyeUNvbnRlbnRzKCkpOwogICAgfQogICAgcmV0dXJuIF9sYXN0TWFwcGluZzsKICB9CgogIHZvaWQgYWRkQ2xhc3MoTGlicmFyeUVudGl0eSBsaWJyYXJ5LCBDbGFzc0VudGl0eSBlbGVtZW50KSB7CiAgICBfZ2V0TWFwcGluZyhsaWJyYXJ5KS5jbGFzc2VzLmFkZChlbGVtZW50KTsKICB9CgogIHZvaWQgYWRkTWVtYmVyKExpYnJhcnlFbnRpdHkgbGlicmFyeSwgTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIF9nZXRNYXBwaW5nKGxpYnJhcnkpLm1lbWJlcnMuYWRkKGVsZW1lbnQpOwogIH0KCiAgaW50IGdldCBsZW5ndGggPT4gX21hcHBpbmcubGVuZ3RoOwoKICB2b2lkIGZvckVhY2goCiAgICAgIHZvaWQgZihMaWJyYXJ5RW50aXR5IGxpYnJhcnksIExpc3Q8Q2xhc3NFbnRpdHk+IGNsYXNzZXMsCiAgICAgICAgICBMaXN0PE1lbWJlckVudGl0eT4gbWVtYmVycykpIHsKICAgIF9tYXBwaW5nLmZvckVhY2goKExpYnJhcnlFbnRpdHkgbGlicmFyeSwgTGlicmFyeUNvbnRlbnRzIG1hcHBpbmcpIHsKICAgICAgZihsaWJyYXJ5LCBtYXBwaW5nLmNsYXNzZXMsIG1hcHBpbmcubWVtYmVycyk7CiAgICB9KTsKICB9Cn0KCi8vLyBLZWVwcyB0cmFjayBvZiBhbGwgZWxlbWVudHMgYW5kIGhvbGRlcnMuCi8vLwovLy8gVGhpcyBjbGFzcyBhc3NpZ25zIGVhY2ggcmVnaXN0ZXJlZCBlbGVtZW50IHRvIGl0cyBbTGlicmFyaWVzTWFwXSAod2hpY2ggYXJlCi8vLyBpbiBiaWplY3Rpb24gd2l0aCBbT3V0cHV0VW5pdF1zKS4KLy8vCi8vLyBSZWdpc3RlcmVkIGhvbGRlcnMgYXJlIGFzc2lnbmVkIGEgbmFtZS4KY2xhc3MgUmVnaXN0cnkgewogIGZpbmFsIE91dHB1dFVuaXQgX21haW5PdXRwdXRVbml0OwogIGZpbmFsIFNvcnRlciBfc29ydGVyOwogIGZpbmFsIE1hcDxTdHJpbmcsIEhvbGRlcj4gX2hvbGRlcnNNYXAgPSA8U3RyaW5nLCBIb2xkZXI+e307CiAgZmluYWwgTWFwPE91dHB1dFVuaXQsIExpYnJhcmllc01hcD4gX2RlZmVycmVkTGlicmFyaWVzTWFwID0KICAgICAgPE91dHB1dFVuaXQsIExpYnJhcmllc01hcD57fTsKCiAgLy8vIENhY2hlIGZvciB0aGUgbGFzdCBzZWVuIG91dHB1dCB1bml0LgogIE91dHB1dFVuaXQgX2xhc3RPdXRwdXRVbml0OwogIExpYnJhcmllc01hcCBfbGFzdExpYnJhcmllc01hcDsKCiAgSXRlcmFibGU8SG9sZGVyPiBnZXQgaG9sZGVycyA9PiBfaG9sZGVyc01hcC52YWx1ZXM7CiAgSXRlcmFibGU8TGlicmFyaWVzTWFwPiBnZXQgZGVmZXJyZWRMaWJyYXJpZXNNYXAgPT4KICAgICAgX2RlZmVycmVkTGlicmFyaWVzTWFwLnZhbHVlczsKCiAgLy8gQWRkIG9uZSBmb3IgdGhlIG1haW4gbGlicmFyaWVzIG1hcC4KICBpbnQgZ2V0IGxpYnJhcmllc01hcENvdW50ID0+IF9kZWZlcnJlZExpYnJhcmllc01hcC5sZW5ndGggKyAxOwoKICBMaWJyYXJpZXNNYXAgbWFpbkxpYnJhcmllc01hcDsKCiAgUmVnaXN0cnkodGhpcy5fbWFpbk91dHB1dFVuaXQsIHRoaXMuX3NvcnRlcik7CgogIExpYnJhcmllc01hcCBfbWFwVW5pdFRvTGlicmFyaWVzTWFwKE91dHB1dFVuaXQgdGFyZ2V0VW5pdCkgewogICAgaWYgKHRhcmdldFVuaXQgPT0gX2xhc3RPdXRwdXRVbml0KSByZXR1cm4gX2xhc3RMaWJyYXJpZXNNYXA7CgogICAgTGlicmFyaWVzTWFwIHJlc3VsdCA9ICh0YXJnZXRVbml0ID09IF9tYWluT3V0cHV0VW5pdCkKICAgICAgICA/IG1haW5MaWJyYXJpZXNNYXAKICAgICAgICA6IF9kZWZlcnJlZExpYnJhcmllc01hcFt0YXJnZXRVbml0XTsKCiAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpOwogICAgX2xhc3RPdXRwdXRVbml0ID0gdGFyZ2V0VW5pdDsKICAgIF9sYXN0TGlicmFyaWVzTWFwID0gcmVzdWx0OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgcmVnaXN0ZXJPdXRwdXRVbml0KE91dHB1dFVuaXQgb3V0cHV0VW5pdCkgewogICAgaWYgKG91dHB1dFVuaXQgPT0gX21haW5PdXRwdXRVbml0KSB7CiAgICAgIGFzc2VydChtYWluTGlicmFyaWVzTWFwID09IG51bGwpOwogICAgICBtYWluTGlicmFyaWVzTWFwID0gbmV3IExpYnJhcmllc01hcC5tYWluKF9tYWluT3V0cHV0VW5pdCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoIV9kZWZlcnJlZExpYnJhcmllc01hcC5jb250YWluc0tleShvdXRwdXRVbml0KSk7CiAgICAgIFN0cmluZyBuYW1lID0gb3V0cHV0VW5pdC5uYW1lOwogICAgICBfZGVmZXJyZWRMaWJyYXJpZXNNYXBbb3V0cHV0VW5pdF0gPQogICAgICAgICAgbmV3IExpYnJhcmllc01hcC5kZWZlcnJlZChvdXRwdXRVbml0LCBuYW1lKTsKICAgIH0KICB9CgogIC8vLyBBZGRzIGFsbCBlbGVtZW50cyB0byB0aGVpciByZXNwZWN0aXZlIGxpYnJhcmllcyBpbiB0aGUgY29ycmVjdAogIC8vLyBsaWJyYXJpZXMgbWFwLgogIHZvaWQgcmVnaXN0ZXJDbGFzc2VzKE91dHB1dFVuaXQgb3V0cHV0VW5pdCwgSXRlcmFibGU8Q2xhc3NFbnRpdHk+IGVsZW1lbnRzKSB7CiAgICBMaWJyYXJpZXNNYXAgdGFyZ2V0TGlicmFyaWVzTWFwID0gX21hcFVuaXRUb0xpYnJhcmllc01hcChvdXRwdXRVbml0KTsKICAgIGZvciAoQ2xhc3NFbnRpdHkgZWxlbWVudCBpbiBfc29ydGVyLnNvcnRDbGFzc2VzKGVsZW1lbnRzKSkgewogICAgICB0YXJnZXRMaWJyYXJpZXNNYXAuYWRkQ2xhc3MoZWxlbWVudC5saWJyYXJ5LCBlbGVtZW50KTsKICAgIH0KICB9CgogIC8vLyBBZGRzIGFsbCBlbGVtZW50cyB0byB0aGVpciByZXNwZWN0aXZlIGxpYnJhcmllcyBpbiB0aGUgY29ycmVjdAogIC8vLyBsaWJyYXJpZXMgbWFwLgogIHZvaWQgcmVnaXN0ZXJNZW1iZXJzKE91dHB1dFVuaXQgb3V0cHV0VW5pdCwgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBlbGVtZW50cykgewogICAgTGlicmFyaWVzTWFwIHRhcmdldExpYnJhcmllc01hcCA9IF9tYXBVbml0VG9MaWJyYXJpZXNNYXAob3V0cHV0VW5pdCk7CiAgICBmb3IgKE1lbWJlckVudGl0eSBlbGVtZW50IGluIF9zb3J0ZXIuc29ydE1lbWJlcnMoZWxlbWVudHMpKSB7CiAgICAgIHRhcmdldExpYnJhcmllc01hcC5hZGRNZW1iZXIoZWxlbWVudC5saWJyYXJ5LCBlbGVtZW50KTsKICAgIH0KICB9CgogIHZvaWQgcmVnaXN0ZXJDb25zdGFudChPdXRwdXRVbml0IG91dHB1dFVuaXQsIENvbnN0YW50VmFsdWUgY29uc3RhbnRWYWx1ZSkgewogICAgLy8gSWdub3JlIGZvciBub3cuCiAgfQoKICBIb2xkZXIgcmVnaXN0ZXJIb2xkZXIoU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIGlzU3RhdGljU3RhdGVIb2xkZXI6IGZhbHNlLCBib29sIGlzQ29uc3RhbnRzSG9sZGVyOiBmYWxzZX0pIHsKICAgIGFzc2VydChfaG9sZGVyc01hcFtuYW1lXSA9PSBudWxsIHx8CiAgICAgICAgKF9ob2xkZXJzTWFwW25hbWVdLmlzU3RhdGljU3RhdGVIb2xkZXIgPT0gaXNTdGF0aWNTdGF0ZUhvbGRlciAmJgogICAgICAgICAgICBfaG9sZGVyc01hcFtuYW1lXS5pc0NvbnN0YW50c0hvbGRlciA9PSBpc0NvbnN0YW50c0hvbGRlcikpOwoKICAgIHJldHVybiBfaG9sZGVyc01hcC5wdXRJZkFic2VudChuYW1lLCAoKSB7CiAgICAgIHJldHVybiBuZXcgSG9sZGVyKG5hbWUsIF9ob2xkZXJzTWFwLmxlbmd0aCwKICAgICAgICAgIGlzU3RhdGljU3RhdGVIb2xkZXI6IGlzU3RhdGljU3RhdGVIb2xkZXIsCiAgICAgICAgICBpc0NvbnN0YW50c0hvbGRlcjogaXNDb25zdGFudHNIb2xkZXIpOwogICAgfSk7CiAgfQp9CoCZAE5OPAEsARg1NwIBRwQ0RwQ4FTcqAU4fHiABMBUfATIBNhgEATcjHlEGGQQBPi8EAUAvBAElARA/KUg0CAQCAS0EUCYELBEkGD4+JAErHiIBNjUkASlBASEBMAE/QQE6Gy0BHCIgEwQBMykoQQ0+JSo3BgQBRRVQSkE9BgQBRRVRSkI+BgQBThcEASVKKElIAS4yNDEIBAIBPXBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvcHJvZ3JhbV9idWlsZGVyL3JlZ2lzdHJ5LmRhcnRFc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfZW1pdHRlci9zdGFydHVwX2VtaXR0ZXIvZW1pdHRlci5kYXJ0nXMvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX2VtaXR0ZXIuc3RhcnR1cF9lbWl0dGVyOwoKaW1wb3J0ICcuLi8uLi8uLi9jb21waWxlcl9uZXcuZGFydCc7CmltcG9ydCAnLi4vLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uLy4uL2NvbW1vbi9jb2RlZ2VuLmRhcnQnOwppbXBvcnQgJy4uLy4uL2NvbW1vbi90YXNrcy5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uLy4uL2RlZmVycmVkX2xvYWQuZGFydCcgc2hvdyBPdXRwdXRVbml0OwppbXBvcnQgJy4uLy4uL2R1bXBfaW5mby5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCc7CmltcG9ydCAnLi4vLi4vanMvanMuZGFydCcgYXMganM7CmltcG9ydCAnLi4vLi4vanNfYmFja2VuZC9jb25zdGFudF9lbWl0dGVyLmRhcnQnOwppbXBvcnQgJy4uLy4uL2pzX2JhY2tlbmQvbmFtZXIuZGFydCc7CmltcG9ydCAnLi4vLi4vanNfYmFja2VuZC9ydW50aW1lX3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uLy4uL2pzX2JhY2tlbmQvcnVudGltZV90eXBlc19uZXcuZGFydCcgc2hvdyBSZWNpcGVFbmNvZGVyOwppbXBvcnQgJy4uLy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vLi4vdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnIHNob3cgQ29kZWdlbldvcmxkOwppbXBvcnQgJy4uLy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwppbXBvcnQgJy4uL2pzX2VtaXR0ZXIuZGFydCcgc2hvdyBFbWl0dGVyLCBNb2R1bGFyRW1pdHRlcjsKaW1wb3J0ICcuLi9tb2RlbC5kYXJ0JzsKaW1wb3J0ICcuLi9wcm9ncmFtX2J1aWxkZXIvcHJvZ3JhbV9idWlsZGVyLmRhcnQnIHNob3cgUHJvZ3JhbUJ1aWxkZXI7CmltcG9ydCAnbW9kZWxfZW1pdHRlci5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIE1vZHVsYXJFbWl0dGVyQmFzZSBpbXBsZW1lbnRzIE1vZHVsYXJFbWl0dGVyIHsKICBmaW5hbCBNb2R1bGFyTmFtZXIgX25hbWVyOwoKICBNb2R1bGFyRW1pdHRlckJhc2UodGhpcy5fbmFtZXIpOwoKICBqcy5Qcm9wZXJ0eUFjY2VzcyBnbG9iYWxQcm9wZXJ0eUFjY2Vzc0ZvckNsYXNzKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIGpzLk5hbWUgbmFtZSA9IF9uYW1lci5nbG9iYWxQcm9wZXJ0eU5hbWVGb3JDbGFzcyhlbGVtZW50KTsKICAgIGpzLlByb3BlcnR5QWNjZXNzIHBhID0KICAgICAgICBuZXcganMuUHJvcGVydHlBY2Nlc3MoX25hbWVyLnJlYWRHbG9iYWxPYmplY3RGb3JDbGFzcyhlbGVtZW50KSwgbmFtZSk7CiAgICByZXR1cm4gcGE7CiAgfQoKICBqcy5Qcm9wZXJ0eUFjY2VzcyBnbG9iYWxQcm9wZXJ0eUFjY2Vzc0ZvclR5cGUoRW50aXR5IGVsZW1lbnQpIHsKICAgIGpzLk5hbWUgbmFtZSA9IF9uYW1lci5nbG9iYWxQcm9wZXJ0eU5hbWVGb3JUeXBlKGVsZW1lbnQpOwogICAganMuUHJvcGVydHlBY2Nlc3MgcGEgPQogICAgICAgIG5ldyBqcy5Qcm9wZXJ0eUFjY2VzcyhfbmFtZXIucmVhZEdsb2JhbE9iamVjdEZvclR5cGUoZWxlbWVudCksIG5hbWUpOwogICAgcmV0dXJuIHBhOwogIH0KCiAganMuUHJvcGVydHlBY2Nlc3MgZ2xvYmFsUHJvcGVydHlBY2Nlc3NGb3JNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIGpzLk5hbWUgbmFtZSA9IF9uYW1lci5nbG9iYWxQcm9wZXJ0eU5hbWVGb3JNZW1iZXIoZWxlbWVudCk7CiAgICBqcy5Qcm9wZXJ0eUFjY2VzcyBwYSA9CiAgICAgICAgbmV3IGpzLlByb3BlcnR5QWNjZXNzKF9uYW1lci5yZWFkR2xvYmFsT2JqZWN0Rm9yTWVtYmVyKGVsZW1lbnQpLCBuYW1lKTsKICAgIHJldHVybiBwYTsKICB9CgogIEBvdmVycmlkZQogIGpzLlByb3BlcnR5QWNjZXNzIGNvbnN0cnVjdG9yQWNjZXNzKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBnbG9iYWxQcm9wZXJ0eUFjY2Vzc0ZvckNsYXNzKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiBpc29sYXRlTGF6eUluaXRpYWxpemVyQWNjZXNzKEZpZWxkRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBuZXcganMuUHJvcGVydHlBY2Nlc3MoX25hbWVyLnJlYWRHbG9iYWxPYmplY3RGb3JNZW1iZXIoZWxlbWVudCksCiAgICAgICAgX25hbWVyLmxhenlJbml0aWFsaXplck5hbWUoZWxlbWVudCkpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuUHJvcGVydHlBY2Nlc3Mgc3RhdGljRnVuY3Rpb25BY2Nlc3MoRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGdsb2JhbFByb3BlcnR5QWNjZXNzRm9yTWVtYmVyKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuUHJvcGVydHlBY2Nlc3Mgc3RhdGljRmllbGRBY2Nlc3MoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGdsb2JhbFByb3BlcnR5QWNjZXNzRm9yTWVtYmVyKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuUHJvcGVydHlBY2Nlc3MgcHJvdG90eXBlQWNjZXNzKENsYXNzRW50aXR5IGVsZW1lbnQsCiAgICAgIHtib29sIGhhc0JlZW5JbnN0YW50aWF0ZWR9KSB7CiAgICBqcy5FeHByZXNzaW9uIGNvbnN0cnVjdG9yID0KICAgICAgICBoYXNCZWVuSW5zdGFudGlhdGVkID8gY29uc3RydWN0b3JBY2Nlc3MoZWxlbWVudCkgOiB0eXBlQWNjZXNzKGVsZW1lbnQpOwogICAgcmV0dXJuIGpzLmpzKCcjLnByb3RvdHlwZScsIGNvbnN0cnVjdG9yKTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdHlwZUFjY2VzcyhFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGdsb2JhbFByb3BlcnR5QWNjZXNzRm9yVHlwZShlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGpzLk5hbWUgdHlwZUFjY2Vzc05ld1J0aShFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIF9uYW1lci5nbG9iYWxQcm9wZXJ0eU5hbWVGb3JUeXBlKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuTmFtZSB0eXBlVmFyaWFibGVBY2Nlc3NOZXdSdGkoVHlwZVZhcmlhYmxlRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBfbmFtZXIuZ2xvYmFsTmFtZUZvckludGVyZmFjZVR5cGVWYXJpYWJsZShlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gc3RhdGljQ2xvc3VyZUFjY2VzcyhGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gbmV3IGpzLkNhbGwoCiAgICAgICAgbmV3IGpzLlByb3BlcnR5QWNjZXNzKF9uYW1lci5yZWFkR2xvYmFsT2JqZWN0Rm9yTWVtYmVyKGVsZW1lbnQpLAogICAgICAgICAgICBfbmFtZXIuc3RhdGljQ2xvc3VyZU5hbWUoZWxlbWVudCkpLAogICAgICAgIGNvbnN0IFtdKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzU3RyaW5nKFN0cmluZyBnbG9iYWwpIHsKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBkb24ndCB1c2UgJ2luaXQnIGFzIGdsb2JhbCBlbWJlZGRlciBzdG9yYWdlLgogICAgcmV0dXJuICdpbml0LiRnbG9iYWwnOwogIH0KfQoKY2xhc3MgTW9kdWxhckVtaXR0ZXJJbXBsIGV4dGVuZHMgTW9kdWxhckVtaXR0ZXJCYXNlIHsKICBmaW5hbCBDb2RlZ2VuUmVnaXN0cnkgX3JlZ2lzdHJ5OwogIGZpbmFsIE1vZHVsYXJDb25zdGFudEVtaXR0ZXIgX2NvbnN0YW50RW1pdHRlcjsKCiAgTW9kdWxhckVtaXR0ZXJJbXBsKAogICAgICBNb2R1bGFyTmFtZXIgbmFtZXIsIHRoaXMuX3JlZ2lzdHJ5LCBDb21waWxlck9wdGlvbnMgb3B0aW9ucykKICAgICAgOiBfY29uc3RhbnRFbWl0dGVyID0gbmV3IE1vZHVsYXJDb25zdGFudEVtaXR0ZXIob3B0aW9ucyksCiAgICAgICAgc3VwZXIobmFtZXIpOwoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIGNvbnN0YW50UmVmZXJlbmNlKENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgIGlmIChjb25zdGFudC5pc0Z1bmN0aW9uKSB7CiAgICAgIEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSBmdW5jdGlvbiA9IGNvbnN0YW50OwogICAgICByZXR1cm4gc3RhdGljQ2xvc3VyZUFjY2VzcyhmdW5jdGlvbi5lbGVtZW50KTsKICAgIH0KICAgIGpzLkV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IF9jb25zdGFudEVtaXR0ZXIuZ2VuZXJhdGUoY29uc3RhbnQpOwogICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgewogICAgICByZXR1cm4gZXhwcmVzc2lvbjsKICAgIH0KICAgIGV4cHJlc3Npb24gPQogICAgICAgIG5ldyBNb2R1bGFyRXhwcmVzc2lvbihNb2R1bGFyRXhwcmVzc2lvbktpbmQuY29uc3RhbnQsIGNvbnN0YW50KTsKICAgIF9yZWdpc3RyeS5yZWdpc3Rlck1vZHVsYXJFeHByZXNzaW9uKGV4cHJlc3Npb24pOwogICAgcmV0dXJuIGV4cHJlc3Npb247CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIGdlbmVyYXRlRW1iZWRkZWRHbG9iYWxBY2Nlc3MoU3RyaW5nIGdsb2JhbCkgewogICAganMuRXhwcmVzc2lvbiBleHByZXNzaW9uID0gbmV3IE1vZHVsYXJFeHByZXNzaW9uKAogICAgICAgIE1vZHVsYXJFeHByZXNzaW9uS2luZC5lbWJlZGRlZEdsb2JhbEFjY2VzcywgZ2xvYmFsKTsKICAgIF9yZWdpc3RyeS5yZWdpc3Rlck1vZHVsYXJFeHByZXNzaW9uKGV4cHJlc3Npb24pOwogICAgcmV0dXJuIGV4cHJlc3Npb247CiAgfQp9CgpjbGFzcyBFbWl0dGVySW1wbCBleHRlbmRzIE1vZHVsYXJFbWl0dGVyQmFzZSBpbXBsZW1lbnRzIEVtaXR0ZXIgewogIGZpbmFsIERpYWdub3N0aWNSZXBvcnRlciBfcmVwb3J0ZXI7CiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKICBmaW5hbCBSdW50aW1lVHlwZXNFbmNvZGVyIF9ydGlFbmNvZGVyOwogIGZpbmFsIFJlY2lwZUVuY29kZXIgX3J0aVJlY2lwZUVuY29kZXI7CiAgZmluYWwgQ29tcGlsZXJUYXNrIF90YXNrOwogIE1vZGVsRW1pdHRlciBfZW1pdHRlcjsKCiAgQG92ZXJyaWRlCiAgUHJvZ3JhbSBwcm9ncmFtRm9yVGVzdGluZzsKCiAgRW1pdHRlckltcGwoCiAgICAgIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAgICB0aGlzLl9yZXBvcnRlciwKICAgICAgQ29tcGlsZXJPdXRwdXQgb3V0cHV0UHJvdmlkZXIsCiAgICAgIER1bXBJbmZvVGFzayBkdW1wSW5mb1Rhc2ssCiAgICAgIE5hbWVyIG5hbWVyLAogICAgICB0aGlzLl9jbG9zZWRXb3JsZCwKICAgICAgdGhpcy5fcnRpRW5jb2RlciwKICAgICAgdGhpcy5fcnRpUmVjaXBlRW5jb2RlciwKICAgICAgU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSBzb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5LAogICAgICB0aGlzLl90YXNrLAogICAgICBib29sIHNob3VsZEdlbmVyYXRlU291cmNlTWFwKQogICAgICA6IHN1cGVyKG5hbWVyKSB7CiAgICBfZW1pdHRlciA9IG5ldyBNb2RlbEVtaXR0ZXIoCiAgICAgICAgb3B0aW9ucywKICAgICAgICBfcmVwb3J0ZXIsCiAgICAgICAgb3V0cHV0UHJvdmlkZXIsCiAgICAgICAgZHVtcEluZm9UYXNrLAogICAgICAgIG5hbWVyLAogICAgICAgIF9jbG9zZWRXb3JsZCwKICAgICAgICBfdGFzaywKICAgICAgICB0aGlzLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3ksCiAgICAgICAgX3J0aUVuY29kZXIsCiAgICAgICAgX3J0aVJlY2lwZUVuY29kZXIsCiAgICAgICAgc2hvdWxkR2VuZXJhdGVTb3VyY2VNYXApOwogIH0KCiAgQG92ZXJyaWRlCiAgTmFtZXIgZ2V0IF9uYW1lciA9PiBzdXBlci5fbmFtZXI7CgogIEBvdmVycmlkZQogIGludCBlbWl0UHJvZ3JhbShQcm9ncmFtQnVpbGRlciBwcm9ncmFtQnVpbGRlciwgQ29kZWdlbldvcmxkIGNvZGVnZW5Xb3JsZCkgewogICAgUHJvZ3JhbSBwcm9ncmFtID0gX3Rhc2subWVhc3VyZVN1YnRhc2soJ2J1aWxkIHByb2dyYW0nLCAoKSB7CiAgICAgIHJldHVybiBwcm9ncmFtQnVpbGRlci5idWlsZFByb2dyYW0oKTsKICAgIH0pOwogICAgaWYgKHJldGFpbkRhdGFGb3JUZXN0aW5nKSB7CiAgICAgIHByb2dyYW1Gb3JUZXN0aW5nID0gcHJvZ3JhbTsKICAgIH0KICAgIHJldHVybiBfdGFzay5tZWFzdXJlU3VidGFzaygnZW1pdCBwcm9ncmFtJywgKCkgewogICAgICByZXR1cm4gX2VtaXR0ZXIuZW1pdFByb2dyYW0ocHJvZ3JhbSwgY29kZWdlbldvcmxkKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiBpbnRlcmNlcHRvckNsYXNzQWNjZXNzKENsYXNzRW50aXR5IGVsZW1lbnQpIHsKICAgIHJldHVybiBnbG9iYWxQcm9wZXJ0eUFjY2Vzc0ZvckNsYXNzKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0NvbnN0YW50SW5saW5lZE9yQWxyZWFkeUVtaXR0ZWQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgcmV0dXJuIF9lbWl0dGVyLmlzQ29uc3RhbnRJbmxpbmVkT3JBbHJlYWR5RW1pdHRlZChjb25zdGFudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgY29tcGFyZUNvbnN0YW50cyhDb25zdGFudFZhbHVlIGEsIENvbnN0YW50VmFsdWUgYikgewogICAgcmV0dXJuIF9lbWl0dGVyLmNvbXBhcmVDb25zdGFudHMoYSwgYik7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIGNvbnN0YW50UmVmZXJlbmNlKENvbnN0YW50VmFsdWUgdmFsdWUpIHsKICAgIHJldHVybiBfZW1pdHRlci5nZW5lcmF0ZUNvbnN0YW50UmVmZXJlbmNlKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhTdHJpbmcgZ2xvYmFsKSB7CiAgICByZXR1cm4ganMuanMoZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2Vzc1N0cmluZyhnbG9iYWwpKTsKICB9CgogIEBvdmVycmlkZQogIC8vIFRPRE8oaGVyaHV0KTogVXNlIGEgc2luZ2xlIHNoYXJlZCBmdW5jdGlvbi4KICBqcy5FeHByZXNzaW9uIGdlbmVyYXRlRnVuY3Rpb25UaGF0UmV0dXJuc051bGwoKSB7CiAgICByZXR1cm4ganMuanMoJ2Z1bmN0aW9uKCkge30nKTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gaW50ZXJjZXB0b3JQcm90b3R5cGVBY2Nlc3MoQ2xhc3NFbnRpdHkgZSkgewogICAgcmV0dXJuIGpzLmpzKCcjLnByb3RvdHlwZScsIGludGVyY2VwdG9yQ2xhc3NBY2Nlc3MoZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdlbmVyYXRlZFNpemUoT3V0cHV0VW5pdCB1bml0KSB7CiAgICBpZiAoX2VtaXR0ZXIub21pdHRlZEZyYWdtZW50cy5hbnkoKGYpID0+IGYub3V0cHV0VW5pdCA9PSB1bml0KSkgewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIEZyYWdtZW50IGtleSA9IF9lbWl0dGVyLm91dHB1dEJ1ZmZlcnMua2V5cwogICAgICAgIC5maXJzdFdoZXJlKChGcmFnbWVudCBmcmFnbWVudCkgPT4gZnJhZ21lbnQub3V0cHV0VW5pdCA9PSB1bml0KTsKICAgIHJldHVybiBfZW1pdHRlci5vdXRwdXRCdWZmZXJzW2tleV0ubGVuZ3RoOwogIH0KfQqA+gBOTjwBLAElHCQiJjMfJyshMSYuRR1GLToYRh0BPh0BIwFIPxtPDwQBQj4bTg8EAUpAG1APBAEMPTIEAQxETC4EAQxDMwQBDD0zBAEMOSQgUC4EAQwtMQQBDC02BAEMQT8EAQw+GEkwEwQBDD1EGwQCATYjMQEWQ0AWAQw8HzE0BkQeGQYRSTUXBAEMPjY9NRcEAgFCJiMpKRwZAQwdAQ8fFiUhExkYHjsSJBchERMYFg8WDw4jFRsiBAEMJAEMTkEsCCAjBjU6CAQBDD4yBAEMQ0EEAQw7LAQBDDk2BAEMPj4EAQwxNCMEAQw8PAQBDCdGEAYvSS8EAgE8cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9zdGFydHVwX2VtaXR0ZXIvZW1pdHRlci5kYXJ0QHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvbWV0YWRhdGFfY29sbGVjdG9yLmRhcnSiTi8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuanNfZW1pdHRlci5tZXRhZGF0YV9jb2xsZWN0b3I7CgppbXBvcnQgJ3BhY2thZ2U6anNfYXN0L3NyYy9wcmVjZWRlbmNlLmRhcnQnIGFzIGpzX3ByZWNlZGVuY2U7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBKRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZGVmZXJyZWRfbG9hZC5kYXJ0JyBzaG93IE91dHB1dFVuaXQ7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCcgc2hvdyBGdW5jdGlvbkVudGl0eTsKCmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganNBc3Q7CmltcG9ydCAnLi4vanMvanMuZGFydCcgc2hvdyBqczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydCcgc2hvdyBSdW50aW1lVHlwZXNFbmNvZGVyOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvcnVudGltZV90eXBlc19uZXcuZGFydCcgc2hvdyBSZWNpcGVFbmNvZGVyOwppbXBvcnQgJy4uL2pzX21vZGVsL3R5cGVfcmVjaXBlLmRhcnQnIHNob3cgVHlwZUV4cHJlc3Npb25SZWNpcGU7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKCmltcG9ydCAnY29kZV9lbWl0dGVyX3Rhc2suZGFydCcgc2hvdyBFbWl0dGVyOwoKLy8vIFJlcHJlc2VudHMgYW4gZW50cnkncyBwb3NpdGlvbiBpbiBvbmUgb2YgdGhlIGdsb2JhbCBtZXRhZGF0YSBhcnJheXMuCi8vLwovLy8gW19yY10gaXMgdXNlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZXMgb2YgdGhlIHRva2VuIGluIHRoZQovLy8gYXN0IGZvciBhIHByb2dyYW0uCi8vLyBbdmFsdWVdIGlzIHRoZSBhY3R1YWwgcG9zaXRpb24sIG9uY2UgdGhleSBoYXZlIGJlZW4gZmluYWxpemVkLgphYnN0cmFjdCBjbGFzcyBfTWV0YWRhdGFFbnRyeSBleHRlbmRzIGpzQXN0LkRlZmVycmVkTnVtYmVyCiAgICBpbXBsZW1lbnRzIENvbXBhcmFibGUsIGpzQXN0LlJlZmVyZW5jZUNvdW50ZWRBc3ROb2RlIHsKICBqc0FzdC5FeHByZXNzaW9uIGdldCBlbnRyeTsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IHZhbHVlOwogIGludCBnZXQgX3JjOwoKICAvLyBNYXJrIHRoaXMgZW50cnkgYXMgc2Vlbi4gT24gdGhlIGZpcnN0IHRpbWUgdGhpcyBpcyBzZWVuLCB0aGUgdmlzaXRvcgogIC8vIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgW2VudHJ5XSB0byBhbHNvIG1hcmsgcG90ZW50aWFsIFtfTWV0YWRhdGFFbnRyeV0KICAvLyBpbnN0YW5jZXMgaW4gdGhlIFtlbnRyeV0gYXMgc2Vlbi4KICBAb3ZlcnJpZGUKICB2b2lkIG1hcmtTZWVuKGpzQXN0LlRva2VuQ291bnRlciB2aXNpdG9yKTsKfQoKY2xhc3MgX0JvdW5kTWV0YWRhdGFFbnRyeSBleHRlbmRzIF9NZXRhZGF0YUVudHJ5IHsKICBpbnQgX3ZhbHVlID0gLTE7CiAgQG92ZXJyaWRlCiAgaW50IF9yYyA9IDA7CiAgQG92ZXJyaWRlCiAgZmluYWwganNBc3QuRXhwcmVzc2lvbiBlbnRyeTsKCiAgX0JvdW5kTWV0YWRhdGFFbnRyeSh0aGlzLmVudHJ5KTsKCiAgYm9vbCBnZXQgaXNGaW5hbGl6ZWQgPT4gX3ZhbHVlICE9IC0xOwoKICBmaW5hbGl6ZShpbnQgdmFsdWUpIHsKICAgIGFzc2VydCghaXNGaW5hbGl6ZWQpOwogICAgX3ZhbHVlID0gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IHZhbHVlIHsKICAgIGFzc2VydChpc0ZpbmFsaXplZCk7CiAgICByZXR1cm4gX3ZhbHVlOwogIH0KCiAgYm9vbCBnZXQgaXNVc2VkID0+IF9yYyA+IDA7CgogIEBvdmVycmlkZQogIHZvaWQgbWFya1NlZW4oanNBc3QuQmFzZVZpc2l0b3IgdmlzaXRvcikgewogICAgX3JjKys7CiAgICBpZiAoX3JjID09IDEpIGVudHJ5LmFjY2VwdCh2aXNpdG9yKTsKICB9CgogIEBvdmVycmlkZQogIGludCBjb21wYXJlVG8oY292YXJpYW50IF9NZXRhZGF0YUVudHJ5IG90aGVyKSA9PiBvdGhlci5fcmMgLSB0aGlzLl9yYzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ19Cb3VuZE1ldGFkYXRhRW50cnkoJGhhc2hDb2RlLHJjPSRfcmMsX3ZhbHVlPSRfdmFsdWUpJzsKfQoKY2xhc3MgX01ldGFkYXRhTGlzdCBleHRlbmRzIGpzQXN0LkRlZmVycmVkRXhwcmVzc2lvbiB7CiAganNBc3QuRXhwcmVzc2lvbiBfdmFsdWU7CgogIHZvaWQgc2V0RXhwcmVzc2lvbihqc0FzdC5FeHByZXNzaW9uIHZhbHVlKSB7CiAgICBhc3NlcnQoX3ZhbHVlID09IG51bGwpOwogICAgYXNzZXJ0KHZhbHVlLnByZWNlZGVuY2VMZXZlbCA9PSB0aGlzLnByZWNlZGVuY2VMZXZlbCk7CiAgICBfdmFsdWUgPSB2YWx1ZTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gZ2V0IHZhbHVlIHsKICAgIGFzc2VydChfdmFsdWUgIT0gbnVsbCk7CiAgICByZXR1cm4gX3ZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBwcmVjZWRlbmNlTGV2ZWwgPT4ganNfcHJlY2VkZW5jZS5QUklNQVJZOwp9CgpjbGFzcyBNZXRhZGF0YUNvbGxlY3RvciBpbXBsZW1lbnRzIGpzQXN0LlRva2VuRmluYWxpemVyIHsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyOwogIGZpbmFsIEVtaXR0ZXIgX2VtaXR0ZXI7CiAgZmluYWwgUnVudGltZVR5cGVzRW5jb2RlciBfcnRpRW5jb2RlcjsKICBmaW5hbCBSZWNpcGVFbmNvZGVyIF9ydGlSZWNpcGVFbmNvZGVyOwogIGZpbmFsIEpFbGVtZW50RW52aXJvbm1lbnQgX2VsZW1lbnRFbnZpcm9ubWVudDsKCiAgLy8vIEEgbWFwIHdpdGggYSB0b2tlbiBwZXIgb3V0cHV0IHVuaXQgZm9yIGEgbGlzdCBvZiBleHByZXNzaW9ucyB0aGF0CiAgLy8vIHJlcHJlc2VudCBtZXRhZGF0YSwgcGFyYW1ldGVyIG5hbWVzIGFuZCB0eXBlIHZhcmlhYmxlIHR5cGVzLgogIE1hcDxPdXRwdXRVbml0LCBfTWV0YWRhdGFMaXN0PiBfbWV0YWRhdGFUb2tlbnMgPQogICAgICBuZXcgTWFwPE91dHB1dFVuaXQsIF9NZXRhZGF0YUxpc3Q+KCk7CgogIGpzQXN0LkV4cHJlc3Npb24gZ2V0TWV0YWRhdGFGb3JPdXRwdXRVbml0KE91dHB1dFVuaXQgb3V0cHV0VW5pdCkgewogICAgcmV0dXJuIF9tZXRhZGF0YVRva2Vucy5wdXRJZkFic2VudChvdXRwdXRVbml0LCAoKSA9PiBuZXcgX01ldGFkYXRhTGlzdCgpKTsKICB9CgogIC8vLyBBIG1hcCB1c2VkIHRvIGNhbm9uaWNhbGl6ZSB0aGUgZW50cmllcyBvZiBtZXRhZGF0YS4KICBNYXA8T3V0cHV0VW5pdCwgTWFwPFN0cmluZywgX0JvdW5kTWV0YWRhdGFFbnRyeT4+IF9tZXRhZGF0YU1hcCA9CiAgICAgIDxPdXRwdXRVbml0LCBNYXA8U3RyaW5nLCBfQm91bmRNZXRhZGF0YUVudHJ5Pj57fTsKCiAgLy8vIEEgbWFwIHdpdGggYSB0b2tlbiBmb3IgYSBsaXN0cyBvZiBKUyBleHByZXNzaW9ucywgb25lIHRva2VuIGZvciBlYWNoCiAgLy8vIG91dHB1dCB1bml0LiBPbmNlIGZpbmFsaXplZCwgdGhlIGVudHJpZXMgcmVwcmVzZW50IHR5cGVzIGluY2x1ZGluZwogIC8vLyBmdW5jdGlvbiB0eXBlcyBhbmQgdHlwZWRlZnMuCiAgTWFwPE91dHB1dFVuaXQsIF9NZXRhZGF0YUxpc3Q+IF90eXBlc1Rva2VucyA9CiAgICAgIG5ldyBNYXA8T3V0cHV0VW5pdCwgX01ldGFkYXRhTGlzdD4oKTsKCiAganNBc3QuRXhwcmVzc2lvbiBnZXRUeXBlc0Zvck91dHB1dFVuaXQoT3V0cHV0VW5pdCBvdXRwdXRVbml0KSB7CiAgICByZXR1cm4gX3R5cGVzVG9rZW5zLnB1dElmQWJzZW50KG91dHB1dFVuaXQsICgpID0+IG5ldyBfTWV0YWRhdGFMaXN0KCkpOwogIH0KCiAgLy8vIEEgbWFwIHVzZWQgdG8gY2Fub25pY2FsaXplIHRoZSBlbnRyaWVzIG9mIHR5cGVzLgogIE1hcDxPdXRwdXRVbml0LCBNYXA8RGFydFR5cGUsIF9Cb3VuZE1ldGFkYXRhRW50cnk+PiBfdHlwZXNNYXAgPQogICAgICA8T3V0cHV0VW5pdCwgTWFwPERhcnRUeXBlLCBfQm91bmRNZXRhZGF0YUVudHJ5Pj57fTsKCiAgTWV0YWRhdGFDb2xsZWN0b3IodGhpcy5fb3B0aW9ucywgdGhpcy5yZXBvcnRlciwgdGhpcy5fZW1pdHRlciwKICAgICAgdGhpcy5fcnRpRW5jb2RlciwgdGhpcy5fcnRpUmVjaXBlRW5jb2RlciwgdGhpcy5fZWxlbWVudEVudmlyb25tZW50KTsKCiAgTGlzdDxqc0FzdC5EZWZlcnJlZE51bWJlcj4gcmVpZnlEZWZhdWx0QXJndW1lbnRzKAogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgT3V0cHV0VW5pdCBvdXRwdXRVbml0KSB7CiAgICAvLyBUT0RPKHNyYSk6IFRoZXNlIGFyZSBzdG9yZWQgb24gdGhlIEluc3RhbmNlTWV0aG9kIG9yIFN0YXRpY0RhcnRNZXRob2QuCiAgICBMaXN0PGpzQXN0LkRlZmVycmVkTnVtYmVyPiBkZWZhdWx0VmFsdWVzID0gPGpzQXN0LkRlZmVycmVkTnVtYmVyPltdOwogICAgX2VsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoUGFyYW1ldGVyKGZ1bmN0aW9uLAogICAgICAgIChfLCBTdHJpbmcgbmFtZSwgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgICBpZiAoY29uc3RhbnQgPT0gbnVsbCkgcmV0dXJuOwogICAgICBqc0FzdC5FeHByZXNzaW9uIGV4cHJlc3Npb24gPSBfZW1pdHRlci5jb25zdGFudFJlZmVyZW5jZShjb25zdGFudCk7CiAgICAgIGRlZmF1bHRWYWx1ZXMuYWRkKF9hZGRHbG9iYWxNZXRhZGF0YShleHByZXNzaW9uLCBvdXRwdXRVbml0KSk7CiAgICB9KTsKICAgIHJldHVybiBkZWZhdWx0VmFsdWVzOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiByZWlmeVR5cGUoRGFydFR5cGUgdHlwZSwgT3V0cHV0VW5pdCBvdXRwdXRVbml0KSB7CiAgICByZXR1cm4gYWRkVHlwZUluT3V0cHV0VW5pdCh0eXBlLCBvdXRwdXRVbml0KTsKICB9CgogIGpzQXN0LkV4cHJlc3Npb24gcmVpZnlOYW1lKFN0cmluZyBuYW1lLCBPdXRwdXRVbml0IG91dHB1dFVuaXQpIHsKICAgIHJldHVybiBfYWRkR2xvYmFsTWV0YWRhdGEoanMuc3RyaW5nKG5hbWUpLCBvdXRwdXRVbml0KTsKICB9CgogIGpzQXN0LkV4cHJlc3Npb24gcmVpZnlFeHByZXNzaW9uKAogICAgICBqc0FzdC5FeHByZXNzaW9uIGV4cHJlc3Npb24sIE91dHB1dFVuaXQgb3V0cHV0VW5pdCkgewogICAgcmV0dXJuIF9hZGRHbG9iYWxNZXRhZGF0YShleHByZXNzaW9uLCBvdXRwdXRVbml0KTsKICB9CgogIF9NZXRhZGF0YUVudHJ5IF9hZGRHbG9iYWxNZXRhZGF0YShqc0FzdC5Ob2RlIG5vZGUsIE91dHB1dFVuaXQgb3V0cHV0VW5pdCkgewogICAgU3RyaW5nIG5hbWVUb0tleShqc0FzdC5OYW1lIG5hbWUpID0+ICIke25hbWUua2V5fSI7CiAgICBTdHJpbmcgcHJpbnRlZCA9IGpzQXN0LnByZXR0eVByaW50KG5vZGUsCiAgICAgICAgZW5hYmxlTWluaWZpY2F0aW9uOiBfb3B0aW9ucy5lbmFibGVNaW5pZmljYXRpb24sCiAgICAgICAgcmVuYW1lckZvck5hbWVzOiBuYW1lVG9LZXkpOwogICAgX21ldGFkYXRhTWFwW291dHB1dFVuaXRdID8/PSBuZXcgTWFwPFN0cmluZywgX0JvdW5kTWV0YWRhdGFFbnRyeT4oKTsKICAgIHJldHVybiBfbWV0YWRhdGFNYXBbb3V0cHV0VW5pdF0ucHV0SWZBYnNlbnQocHJpbnRlZCwgKCkgewogICAgICByZXR1cm4gbmV3IF9Cb3VuZE1ldGFkYXRhRW50cnkobm9kZSk7CiAgICB9KTsKICB9CgogIGpzQXN0LkV4cHJlc3Npb24gX2NvbXB1dGVUeXBlUmVwcmVzZW50YXRpb24oRGFydFR5cGUgdHlwZSkgewogICAganNBc3QuRXhwcmVzc2lvbiByZXByZXNlbnRhdGlvbiA9CiAgICAgICAgX3J0aUVuY29kZXIuZ2V0VHlwZVJlcHJlc2VudGF0aW9uKF9lbWl0dGVyLCB0eXBlLCAodmFyaWFibGUpIHsKICAgICAgZmFpbGVkQXQoCiAgICAgICAgICBOT19MT0NBVElPTl9TUEFOTkFCTEUsCiAgICAgICAgICAiVHlwZSByZXByZXNlbnRhdGlvbiBmb3IgdHlwZSB2YXJpYWJsZSAkdmFyaWFibGUgaW4gIgogICAgICAgICAgIiR0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuIik7CiAgICAgIHJldHVybiBqc0FzdC5MaXRlcmFsTnVsbCgpOwogICAgfSwgKFR5cGVkZWZUeXBlIHR5cGVkZWYpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgaWYgKHJlcHJlc2VudGF0aW9uIGlzIGpzQXN0LkxpdGVyYWxTdHJpbmcpIHsKICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0aGUgcmVwcmVzZW50YXRpb24gdG8gYmUgYSBzdHJpbmcsIHNpbmNlIHdlIHVzZQogICAgICAvLyBzdHJpbmdzIGFzIGluZGljYXRvciBmb3Igbm9uLWluaXRpYWxpemVkIHR5cGVzIGluIHRoZSBsYXp5IGVtaXR0ZXIuCiAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3IoCiAgICAgICAgICBOT19MT0NBVElPTl9TUEFOTkFCTEUsICdyZWlmaWVkIHR5cGVzIHNob3VsZCBub3QgYmUgc3RyaW5ncy4nKTsKICAgIH0KCiAgICByZXR1cm4gcmVwcmVzZW50YXRpb247CiAgfQoKICBqc0FzdC5FeHByZXNzaW9uIF9jb21wdXRlVHlwZVJlcHJlc2VudGF0aW9uTmV3UnRpKERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBfcnRpUmVjaXBlRW5jb2Rlci5lbmNvZGVHcm91bmRSZWNpcGUoCiAgICAgICAgX2VtaXR0ZXIsIFR5cGVFeHByZXNzaW9uUmVjaXBlKHR5cGUpKTsKICB9CgogIGpzQXN0LkV4cHJlc3Npb24gYWRkVHlwZUluT3V0cHV0VW5pdChEYXJ0VHlwZSB0eXBlLCBPdXRwdXRVbml0IG91dHB1dFVuaXQpIHsKICAgIF90eXBlc01hcFtvdXRwdXRVbml0XSA/Pz0gbmV3IE1hcDxEYXJ0VHlwZSwgX0JvdW5kTWV0YWRhdGFFbnRyeT4oKTsKICAgIHJldHVybiBfdHlwZXNNYXBbb3V0cHV0VW5pdF0ucHV0SWZBYnNlbnQodHlwZSwgKCkgewogICAgICBpZiAoX29wdGlvbnMuZXhwZXJpbWVudE5ld1J0aSkgewogICAgICAgIHJldHVybiBuZXcgX0JvdW5kTWV0YWRhdGFFbnRyeShfY29tcHV0ZVR5cGVSZXByZXNlbnRhdGlvbk5ld1J0aSh0eXBlKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG5ldyBfQm91bmRNZXRhZGF0YUVudHJ5KF9jb21wdXRlVHlwZVJlcHJlc2VudGF0aW9uKHR5cGUpKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZpbmFsaXplVG9rZW5zKCkgewogICAgdm9pZCBjb3VudFRva2Vuc0luVHlwZXMoSXRlcmFibGU8X0JvdW5kTWV0YWRhdGFFbnRyeT4gZW50cmllcykgewogICAgICBqc0FzdC5Ub2tlbkNvdW50ZXIgY291bnRlciA9IG5ldyBqc0FzdC5Ub2tlbkNvdW50ZXIoKTsKICAgICAgZW50cmllcwogICAgICAgICAgLndoZXJlKChfQm91bmRNZXRhZGF0YUVudHJ5IGUpID0+IGUuX3JjID4gMCkKICAgICAgICAgIC5tYXAoKF9Cb3VuZE1ldGFkYXRhRW50cnkgZSkgPT4gZS5lbnRyeSkKICAgICAgICAgIC5mb3JFYWNoKGNvdW50ZXIuY291bnRUb2tlbnMpOwogICAgfQoKICAgIGpzQXN0LkFycmF5SW5pdGlhbGl6ZXIgZmluYWxpemVNYXAoTWFwPGR5bmFtaWMsIF9Cb3VuZE1ldGFkYXRhRW50cnk+IG1hcCkgewogICAgICBib29sIGlzVXNlZChfQm91bmRNZXRhZGF0YUVudHJ5IGVudHJ5KSA9PiBlbnRyeS5pc1VzZWQ7CiAgICAgIExpc3Q8X0JvdW5kTWV0YWRhdGFFbnRyeT4gZW50cmllcyA9IG1hcC52YWx1ZXMud2hlcmUoaXNVc2VkKS50b0xpc3QoKTsKICAgICAgZW50cmllcy5zb3J0KCk7CgogICAgICAvLyBUT0RPKGhlcmh1dCk6IEJ1Y2tldCBlbnRyaWVzIGJ5IGluZGV4IGxlbmd0aCBhbmQgdXNlIGEgc3RhYmxlCiAgICAgIC8vICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uIHdpdGhpbiBidWNrZXRzLgogICAgICBpbnQgY291bnQgPSAwOwogICAgICBmb3IgKF9Cb3VuZE1ldGFkYXRhRW50cnkgZW50cnkgaW4gZW50cmllcykgewogICAgICAgIGVudHJ5LmZpbmFsaXplKGNvdW50KyspOwogICAgICB9CgogICAgICBMaXN0PGpzQXN0Lk5vZGU+IHZhbHVlcyA9CiAgICAgICAgICBlbnRyaWVzLm1hcCgoX0JvdW5kTWV0YWRhdGFFbnRyeSBlKSA9PiBlLmVudHJ5KS50b0xpc3QoKTsKCiAgICAgIHJldHVybiBuZXcganNBc3QuQXJyYXlJbml0aWFsaXplcih2YWx1ZXMpOwogICAgfQoKICAgIF9tZXRhZGF0YVRva2Vucy5mb3JFYWNoKChPdXRwdXRVbml0IG91dHB1dFVuaXQsIF9NZXRhZGF0YUxpc3QgdG9rZW4pIHsKICAgICAgTWFwIG1ldGFkYXRhTWFwID0gX21ldGFkYXRhTWFwW291dHB1dFVuaXRdOwogICAgICBpZiAobWV0YWRhdGFNYXAgIT0gbnVsbCkgewogICAgICAgIHRva2VuLnNldEV4cHJlc3Npb24oZmluYWxpemVNYXAobWV0YWRhdGFNYXApKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbi5zZXRFeHByZXNzaW9uKG5ldyBqc0FzdC5BcnJheUluaXRpYWxpemVyKFtdKSk7CiAgICAgIH0KICAgIH0pOwoKICAgIF90eXBlc1Rva2Vucy5mb3JFYWNoKChPdXRwdXRVbml0IG91dHB1dFVuaXQsIF9NZXRhZGF0YUxpc3QgdG9rZW4pIHsKICAgICAgTWFwIHR5cGVzTWFwID0gX3R5cGVzTWFwW291dHB1dFVuaXRdOwogICAgICBpZiAodHlwZXNNYXAgIT0gbnVsbCkgewogICAgICAgIGNvdW50VG9rZW5zSW5UeXBlcyh0eXBlc01hcC52YWx1ZXMpOwogICAgICAgIHRva2VuLnNldEV4cHJlc3Npb24oZmluYWxpemVNYXAodHlwZXNNYXApKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbi5zZXRFeHByZXNzaW9uKG5ldyBqc0FzdC5BcnJheUluaXRpYWxpemVyKFtdKSk7CiAgICAgIH0KICAgIH0pOwogIH0KfQqBBwBOTjwBLwE+ARk7IzA4ASQhISBEQkEaAS4BSQRIF0M7Ox4MEQ8BSkwnDC0CATMTDA8MIAEjASgBGBoUBAEMEhkTBAEeAQwtCykEAQxJAQxQAgE3GwEvHDsUBAEMHxwTBAEMNAIBOiIlGikpMQFIQzMsAUVPBAE6QzgBS0kjMCwBQkwEATdCOgFBSwE0OE5JMzMkSkUIGgQBRTIEAUM8BAEkPDcEAU44LTklST4sCAQBPyZHECFAJiIfFAgBMUdNHkoGARsEAUUxLwQBT0g4J1APSggIBAEMGkU9DjczKQYBUD5NFgFHNBUzIQgBIEQBMQYBSzIhNw89CAgBSCweLTQPPQgIBAIBN3BhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvbWV0YWRhdGFfY29sbGVjdG9yLmRhcnQzc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfZW1pdHRlci9tb2RlbC5kYXJ0wABQVi8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMubmV3X2pzX2VtaXR0ZXIubW9kZWw7CgppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCcgc2hvdyBDb25zdGFudFZhbHVlOwppbXBvcnQgJy4uL2RlZmVycmVkX2xvYWQuZGFydCcgc2hvdyBPdXRwdXRVbml0OwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzIHNob3cgRXhwcmVzc2lvbiwgTmFtZSwgU3RhdGVtZW50LCBUb2tlbkZpbmFsaXplcjsKaW1wb3J0ICcuLi9qcy9qc19kZWJ1Zy5kYXJ0JyBhcyBqcyBzaG93IG5vZGVUb1N0cmluZzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXNfY29kZWdlbi5kYXJ0JzsKaW1wb3J0ICdqc19lbWl0dGVyLmRhcnQnIHNob3cgTWV0YWRhdGFDb2xsZWN0b3I7CgpjbGFzcyBQcm9ncmFtIHsKICBmaW5hbCBMaXN0PEZyYWdtZW50PiBmcmFnbWVudHM7CiAgZmluYWwgTGlzdDxIb2xkZXI+IGhvbGRlcnM7CiAgZmluYWwgYm9vbCBvdXRwdXRDb250YWluc0NvbnN0YW50TGlzdDsKICBmaW5hbCBib29sIG5lZWRzTmF0aXZlU3VwcG9ydDsKICBmaW5hbCBib29sIGhhc1NvZnREZWZlcnJlZENsYXNzZXM7CgogIC8vLyBBIG1hcCBmcm9tIGxvYWQgaWQgdG8gdGhlIGxpc3Qgb2YgZnJhZ21lbnRzIHRoYXQgbmVlZCB0byBiZSBsb2FkZWQuCiAgZmluYWwgTWFwPFN0cmluZywgTGlzdDxGcmFnbWVudD4+IGxvYWRNYXA7CgogIC8vIElmIHRoaXMgZmllbGQgaXMgbm90IGBudWxsYCB0aGVuIGl0cyB2YWx1ZSBtdXN0IGJlIGVtaXR0ZWQgaW4gdGhlIGVtYmVkZGVkCiAgLy8gZ2xvYmFsIGBUWVBFX1RPX0lOVEVSQ0VQVE9SX01BUGAuIFRoZSBtYXAgcmVmZXJlbmNlcyBjb25zdGFudHMgYW5kIGNsYXNzZXMuCiAgZmluYWwganMuRXhwcmVzc2lvbiB0eXBlVG9JbnRlcmNlcHRvck1hcDsKCiAgLy8gVE9ETyhmbG9pdHNjaCk6IHdlIHNob3VsZCBzdG9yZSB0aGUgbWV0YWRhdGEgZGlyZWN0bHkgaW5zdGVhZCBvZiBzdG9yaW5nCiAgLy8gdGhlIGNvbGxlY3Rvci4gSG93ZXZlciwgdGhlIG9sZCBlbWl0dGVyIHN0aWxsIHVwZGF0ZXMgdGhlIGRhdGEuCiAgZmluYWwgTWV0YWRhdGFDb2xsZWN0b3IgX21ldGFkYXRhQ29sbGVjdG9yOwogIGZpbmFsIEl0ZXJhYmxlPGpzLlRva2VuRmluYWxpemVyPiBmaW5hbGl6ZXJzOwoKICBQcm9ncmFtKHRoaXMuZnJhZ21lbnRzLCB0aGlzLmhvbGRlcnMsIHRoaXMubG9hZE1hcCwgdGhpcy50eXBlVG9JbnRlcmNlcHRvck1hcCwKICAgICAgdGhpcy5fbWV0YWRhdGFDb2xsZWN0b3IsIHRoaXMuZmluYWxpemVycywKICAgICAge3RoaXMubmVlZHNOYXRpdmVTdXBwb3J0LAogICAgICB0aGlzLm91dHB1dENvbnRhaW5zQ29uc3RhbnRMaXN0LAogICAgICB0aGlzLmhhc1NvZnREZWZlcnJlZENsYXNzZXN9KSB7CiAgICBhc3NlcnQobmVlZHNOYXRpdmVTdXBwb3J0ICE9IG51bGwpOwogICAgYXNzZXJ0KG91dHB1dENvbnRhaW5zQ29uc3RhbnRMaXN0ICE9IG51bGwpOwogIH0KCiAgLy8vIEFjY2Vzc29yIGZvciB0aGUgbGlzdCBvZiBtZXRhZGF0YSBlbnRyaWVzIGZvciBhIGdpdmVuIFtPdXRwdXRVbml0XS4KICAvLy8KICAvLy8gVGhlcmUgaXMgb25lIGxpc3QgZm9yIGVhY2ggb3V0cHV0IHVuaXQuIFRoZSBsaXN0IGJlbG9uZ2luZyB0byB0aGUgbWFpbgogIC8vLyB1bml0IG11c3QgYmUgZW1pdHRlZCBpbiB0aGUgYE1FVEFEQVRBYCBlbWJlZGRlZCBnbG9iYWwuCiAgLy8vIFRoZSBsaXN0IHJlZmVyZW5jZXMgY29uc3RhbnRzIGFuZCBtdXN0IGhlbmNlIGJlIGVtaXR0ZWQgYWZ0ZXIgY29uc3RhbnRzCiAgLy8vIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KICAvLy8KICAvLy8gTm90ZTogdGhlIG1ldGFkYXRhIGlzIGRlcml2ZWQgZnJvbSB0aGUgdGFzaydzIGBtZXRhZGF0YUNvbGxlY3RvcmAuIFRoZQogIC8vLyBsaXN0IG11c3Qgbm90IGJlIGVtaXR0ZWQgYmVmb3JlIGFsbCBvcGVyYXRpb25zIG9uIGl0IGFyZSBkb25lLiBGb3IKICAvLy8gZXhhbXBsZSwgdGhlIG9sZCBlbWl0dGVyIGdlbmVyYXRlcyBtZXRhZGF0YSB3aGVuIGVtaXR0aW5nIHJlZmxlY3Rpb24KICAvLy8gZGF0YS4KICBqcy5FeHByZXNzaW9uIG1ldGFkYXRhRm9yT3V0cHV0VW5pdChPdXRwdXRVbml0IHVuaXQpIHsKICAgIHJldHVybiBfbWV0YWRhdGFDb2xsZWN0b3IuZ2V0TWV0YWRhdGFGb3JPdXRwdXRVbml0KHVuaXQpOwogIH0KCiAgLy8vIEFjY2Vzc29yIGZvciB0aGUgbGlzdCBvZiB0eXBlIGVudHJpZXMgZm9yIGEgZ2l2ZW4gW091dHB1dFVuaXRdLgogIC8vLwogIC8vLyBUaGVyZSBpcyBvbmUgbGlzdCBmb3IgZWFjaCBvdXRwdXQgdW5pdC4gVGhlIGxpc3QgYmVsb25naW5nIHRvIHRoZSBtYWluCiAgLy8vIHVuaXQgbXVzdCBiZSBlbWl0dGVkIGluIHRoZSBgVFlQRVNgIGVtYmVkZGVkIGdsb2JhbC4gVGhlIGxpc3QgcmVmZXJlbmNlcwogIC8vLyBjb25zdGFudHMgYW5kIG11c3QgaGVuY2UgYmUgZW1pdHRlZCBhZnRlciBjb25zdGFudHMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgogIC8vLwogIC8vLyBOb3RlOiB0aGUgbWV0YWRhdGEgaXMgZGVyaXZlZCBmcm9tIHRoZSB0YXNrJ3MgYG1ldGFkYXRhQ29sbGVjdG9yYC4gVGhlCiAgLy8vIGxpc3QgaXMgb25seSBhIHBsYWNlaG9sZGVyIGFuZCB3aWxsIGJlIGZpbGxlZCBpbiBvbmNlIG1ldGFkYXRhIGNvbGxlY3Rpb24KICAvLy8gaXMgZmluYWxpemVkLgogIGpzLkV4cHJlc3Npb24gbWV0YWRhdGFUeXBlc0Zvck91dHB1dFVuaXQoT3V0cHV0VW5pdCB1bml0KSB7CiAgICByZXR1cm4gX21ldGFkYXRhQ29sbGVjdG9yLmdldFR5cGVzRm9yT3V0cHV0VW5pdCh1bml0KTsKICB9CgogIGJvb2wgZ2V0IGlzU3BsaXQgPT4gZnJhZ21lbnRzLmxlbmd0aCA+IDE7CiAgSXRlcmFibGU8RnJhZ21lbnQ+IGdldCBkZWZlcnJlZEZyYWdtZW50cyA9PiBmcmFnbWVudHMuc2tpcCgxKTsKICBGcmFnbWVudCBnZXQgbWFpbkZyYWdtZW50ID0+IGZyYWdtZW50cy5maXJzdDsKfQoKLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIEphdmFTY3JpcHQgb2JqZWN0IHRoYXQgY29udGFpbnMgc3RhdGljIHN0YXRlLCBsaWtlCi8vLyBjbGFzc2VzIG9yIGZ1bmN0aW9ucy4KY2xhc3MgSG9sZGVyIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBpbnQgaW5kZXg7CiAgZmluYWwgYm9vbCBpc1N0YXRpY1N0YXRlSG9sZGVyOwogIGZpbmFsIGJvb2wgaXNDb25zdGFudHNIb2xkZXI7CgogIEhvbGRlcih0aGlzLm5hbWUsIHRoaXMuaW5kZXgsCiAgICAgIHt0aGlzLmlzU3RhdGljU3RhdGVIb2xkZXI6IGZhbHNlLCB0aGlzLmlzQ29uc3RhbnRzSG9sZGVyOiBmYWxzZX0pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ0hvbGRlcihuYW1lPSR7bmFtZX0pJzsKICB9Cn0KCi8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgb25lIG91dHB1dCBmaWxlLgovLy8KLy8vIElmIG5vIGxpYnJhcnkgaXMgZGVmZXJyZWQsIHRoZXJlIGlzIG9ubHkgb25lIFtGcmFnbWVudF0gb2YgdHlwZQovLy8gW01haW5GcmFnbWVudF0uCmFic3RyYWN0IGNsYXNzIEZyYWdtZW50IHsKICAvLy8gVGhlIG91dHB1dFVuaXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcgdGhlIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtb2RlbC4KICAvLy8gVXNlcyBpbmRpY2F0ZSBtaXNzaW5nIGluZm9ybWF0aW9uIGluIHRoZSBtb2RlbC4KICBmaW5hbCBPdXRwdXRVbml0IG91dHB1dFVuaXQ7CgogIGZpbmFsIExpc3Q8TGlicmFyeT4gbGlicmFyaWVzOwogIGZpbmFsIExpc3Q8Q29uc3RhbnQ+IGNvbnN0YW50czsKICAvLyBUT0RPKGZsb2l0c2NoKTogc2hvdWxkIHdlIG1vdmUgc3RhdGljIGZpZWxkcyBpbnRvIGxpYnJhcmllcyBvciBjbGFzc2VzPwogIGZpbmFsIExpc3Q8U3RhdGljRmllbGQ+IHN0YXRpY05vbkZpbmFsRmllbGRzOwogIC8vIFRPRE8oZmxvaXRzY2gpOiBsYXp5IGZpZWxkcyBzaG91bGQgYmUgaW4gdGhlaXIgbGlicmFyeSBvciBldmVuIGNsYXNzLgogIGZpbmFsIExpc3Q8U3RhdGljRmllbGQ+IHN0YXRpY0xhemlseUluaXRpYWxpemVkRmllbGRzOwoKICAvLy8gT3V0cHV0IGZpbGUgbmFtZSB3aXRob3V0IGV4dGVuc2lvbi4KICBmaW5hbCBTdHJpbmcgb3V0cHV0RmlsZU5hbWU7CgogIEZyYWdtZW50KAogICAgICB0aGlzLm91dHB1dFVuaXQsCiAgICAgIHRoaXMub3V0cHV0RmlsZU5hbWUsCiAgICAgIHRoaXMubGlicmFyaWVzLAogICAgICB0aGlzLnN0YXRpY05vbkZpbmFsRmllbGRzLAogICAgICB0aGlzLnN0YXRpY0xhemlseUluaXRpYWxpemVkRmllbGRzLAogICAgICB0aGlzLmNvbnN0YW50cyk7CgogIGJvb2wgZ2V0IGlzTWFpbkZyYWdtZW50Owp9CgovLy8gVGhlIG1haW4gb3V0cHV0IGZpbGUuCi8vLwovLy8gVGhpcyBjb2RlIGVtaXR0ZWQgZnJvbSB0aGlzIFtGcmFnbWVudF0gbXVzdCBiZSBsb2FkZWQgZmlyc3QuIEl0IGNhbiB0aGVuIGxvYWQKLy8vIG90aGVyIFtEZWZlcnJlZEZyYWdtZW50XXMuCmNsYXNzIE1haW5GcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKICBmaW5hbCBqcy5TdGF0ZW1lbnQgaW52b2tlTWFpbjsKCiAgTWFpbkZyYWdtZW50KAogICAgICBPdXRwdXRVbml0IG91dHB1dFVuaXQsCiAgICAgIFN0cmluZyBvdXRwdXRGaWxlTmFtZSwKICAgICAgdGhpcy5pbnZva2VNYWluLAogICAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgICAgTGlzdDxTdGF0aWNGaWVsZD4gc3RhdGljTm9uRmluYWxGaWVsZHMsCiAgICAgIExpc3Q8U3RhdGljRmllbGQ+IHN0YXRpY0xhemlseUluaXRpYWxpemVkRmllbGRzLAogICAgICBMaXN0PENvbnN0YW50PiBjb25zdGFudHMpCiAgICAgIDogc3VwZXIob3V0cHV0VW5pdCwgb3V0cHV0RmlsZU5hbWUsIGxpYnJhcmllcywgc3RhdGljTm9uRmluYWxGaWVsZHMsCiAgICAgICAgICAgIHN0YXRpY0xhemlseUluaXRpYWxpemVkRmllbGRzLCBjb25zdGFudHMpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc01haW5GcmFnbWVudCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ01haW5GcmFnbWVudCgpJzsKICB9Cn0KCi8vLyBBbiBvdXRwdXQgKGZpbGUpIGZvciBkZWZlcnJlZCBjb2RlLgpjbGFzcyBEZWZlcnJlZEZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgewogIGZpbmFsIFN0cmluZyBuYW1lOwoKICBEZWZlcnJlZEZyYWdtZW50KAogICAgICBPdXRwdXRVbml0IG91dHB1dFVuaXQsCiAgICAgIFN0cmluZyBvdXRwdXRGaWxlTmFtZSwKICAgICAgdGhpcy5uYW1lLAogICAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgICAgTGlzdDxTdGF0aWNGaWVsZD4gc3RhdGljTm9uRmluYWxGaWVsZHMsCiAgICAgIExpc3Q8U3RhdGljRmllbGQ+IHN0YXRpY0xhemlseUluaXRpYWxpemVkRmllbGRzLAogICAgICBMaXN0PENvbnN0YW50PiBjb25zdGFudHMpCiAgICAgIDogc3VwZXIob3V0cHV0VW5pdCwgb3V0cHV0RmlsZU5hbWUsIGxpYnJhcmllcywgc3RhdGljTm9uRmluYWxGaWVsZHMsCiAgICAgICAgICAgIHN0YXRpY0xhemlseUluaXRpYWxpemVkRmllbGRzLCBjb25zdGFudHMpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc01haW5GcmFnbWVudCA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdEZWZlcnJlZEZyYWdtZW50KG5hbWU9JHtuYW1lfSknOwogIH0KfQoKY2xhc3MgQ29uc3RhbnQgewogIGZpbmFsIGpzLk5hbWUgbmFtZTsKICBmaW5hbCBIb2xkZXIgaG9sZGVyOwogIGZpbmFsIENvbnN0YW50VmFsdWUgdmFsdWU7CgogIENvbnN0YW50KHRoaXMubmFtZSwgdGhpcy5ob2xkZXIsIHRoaXMudmFsdWUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ0NvbnN0YW50KG5hbWU9JHtuYW1lLmtleX0sdmFsdWU9JHt2YWx1ZS50b1N0cnVjdHVyZWRUZXh0KCl9KSc7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBGaWVsZENvbnRhaW5lciB7CiAgTGlzdDxGaWVsZD4gZ2V0IHN0YXRpY0ZpZWxkc0ZvclJlZmxlY3Rpb247Cn0KCmNsYXNzIExpYnJhcnkgaW1wbGVtZW50cyBGaWVsZENvbnRhaW5lciB7CiAgLy8vIFRoZSBlbGVtZW50IHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbW9kZWwuCiAgLy8vIFVzZXMgaW5kaWNhdGUgbWlzc2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgbW9kZWwuCiAgZmluYWwgTGlicmFyeUVudGl0eSBlbGVtZW50OwoKICBmaW5hbCBTdHJpbmcgdXJpOwogIGZpbmFsIExpc3Q8U3RhdGljTWV0aG9kPiBzdGF0aWNzOwogIGZpbmFsIExpc3Q8Q2xhc3M+IGNsYXNzZXM7CgogIEBvdmVycmlkZQogIGZpbmFsIExpc3Q8RmllbGQ+IHN0YXRpY0ZpZWxkc0ZvclJlZmxlY3Rpb247CgogIExpYnJhcnkodGhpcy5lbGVtZW50LCB0aGlzLnVyaSwgdGhpcy5zdGF0aWNzLCB0aGlzLmNsYXNzZXMsCiAgICAgIHRoaXMuc3RhdGljRmllbGRzRm9yUmVmbGVjdGlvbik7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnTGlicmFyeSh1cmk9JHt1cml9LGVsZW1lbnQ9JHtlbGVtZW50fSknOwogIH0KfQoKY2xhc3MgU3RhdGljRmllbGQgewogIC8vLyBUaGUgZWxlbWVudCBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyB0aGUgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1vZGVsLgogIC8vLyBVc2VzIGluZGljYXRlIG1pc3NpbmcgaW5mb3JtYXRpb24gaW4gdGhlIG1vZGVsLgogIGZpbmFsIEZpZWxkRW50aXR5IGVsZW1lbnQ7CgogIGZpbmFsIGpzLk5hbWUgbmFtZTsKICBmaW5hbCBqcy5OYW1lIGdldHRlck5hbWU7CiAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoZSBob2xkZXIgZm9yIHN0YXRpYyBmaWVsZHMgaXMgdGhlIGlzb2xhdGUgb2JqZWN0LiBXZQogIC8vIGNvdWxkIHJlbW92ZSB0aGlzIGZpZWxkIGFuZCB1c2UgdGhlIGlzb2xhdGUgb2JqZWN0IGRpcmVjdGx5LgogIGZpbmFsIEhvbGRlciBob2xkZXI7CiAgZmluYWwganMuRXhwcmVzc2lvbiBjb2RlOwogIGZpbmFsIGJvb2wgaXNGaW5hbDsKICBmaW5hbCBib29sIGlzTGF6eTsKICBmaW5hbCBib29sIGlzSW5pdGlhbGl6ZWRCeUNvbnN0YW50OwoKICBTdGF0aWNGaWVsZCh0aGlzLmVsZW1lbnQsIHRoaXMubmFtZSwgdGhpcy5nZXR0ZXJOYW1lLCB0aGlzLmhvbGRlciwgdGhpcy5jb2RlLAogICAgICB7dGhpcy5pc0ZpbmFsLCB0aGlzLmlzTGF6eSwgdGhpcy5pc0luaXRpYWxpemVkQnlDb25zdGFudDogZmFsc2V9KTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdTdGF0aWNGaWVsZChuYW1lPSR7bmFtZS5rZXl9LGVsZW1lbnQ9JHtlbGVtZW50fSknOwogIH0KfQoKY2xhc3MgQ2xhc3MgaW1wbGVtZW50cyBGaWVsZENvbnRhaW5lciB7CiAgLy8vIFRoZSBlbGVtZW50IHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbW9kZWwuCiAgLy8vIFVzZXMgaW5kaWNhdGUgbWlzc2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgbW9kZWwuCiAgZmluYWwgQ2xhc3NFbnRpdHkgZWxlbWVudDsKCiAgZmluYWwganMuTmFtZSBuYW1lOwogIGZpbmFsIEhvbGRlciBob2xkZXI7CiAgQ2xhc3MgX3N1cGVyY2xhc3M7CiAgQ2xhc3MgX21peGluQ2xhc3M7CiAgZmluYWwgTGlzdDxNZXRob2Q+IG1ldGhvZHM7CiAgZmluYWwgTGlzdDxGaWVsZD4gZmllbGRzOwogIGZpbmFsIExpc3Q8U3R1Yk1ldGhvZD4gaXNDaGVja3M7CiAgZmluYWwgQ2xhc3NDaGVja3MgY2xhc3NDaGVja3NOZXdSdGk7CiAgZmluYWwgTGlzdDxTdHViTWV0aG9kPiBjaGVja2VkU2V0dGVyczsKCiAgLy8vIFN0dWIgbWV0aG9kcyBmb3IgdGhpcyBjbGFzcyB0aGF0IGFyZSBjYWxsIHN0dWJzIGZvciBnZXR0ZXJzLgogIGZpbmFsIExpc3Q8U3R1Yk1ldGhvZD4gY2FsbFN0dWJzOwoKICAvLy8gbm9TdWNoTWV0aG9kIHN0dWJzIGluIHRoZSBzcGVjaWFsIGNhc2UgdGhhdCB0aGUgY2xhc3MgaXMgT2JqZWN0LgogIGZpbmFsIExpc3Q8U3R1Yk1ldGhvZD4gbm9TdWNoTWV0aG9kU3R1YnM7CiAgQG92ZXJyaWRlCiAgZmluYWwgTGlzdDxGaWVsZD4gc3RhdGljRmllbGRzRm9yUmVmbGVjdGlvbjsKICBmaW5hbCBib29sIGhhc1J0aUZpZWxkOyAvLyBQZXItaW5zdGFuY2UgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIHBzZXVkby1maWVsZC4KICBmaW5hbCBib29sIG9ubHlGb3JSdGk7CiAgZmluYWwgYm9vbCBpc0RpcmVjdGx5SW5zdGFudGlhdGVkOwogIGZpbmFsIGJvb2wgaXNOYXRpdmU7CiAgZmluYWwgYm9vbCBpc0Nsb3N1cmVCYXNlQ2xhc3M7IC8vIENvbW1vbiBiYXNlIGNsYXNzIGZvciBjbG9zdXJlcy4KCiAgLy8vIFdoZXRoZXIgdGhpcyBjbGFzcyBzaG91bGQgYmUgc29mdCBkZWZlcnJlZC4KICAvLy8KICAvLy8gQSBzb2Z0LWRlZmVycmVkIGNsYXNzIGlzIG9ubHkgZnVsbHkgaW5pdGlhbGl6ZWQgYXQgZmlyc3QgaW5zdGFudGlhdGlvbi4KICBmaW5hbCBib29sIGlzU29mdERlZmVycmVkOwoKICBmaW5hbCBib29sIGlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uOwoKICAvLyBJZiB0aGUgY2xhc3MgaW1wbGVtZW50cyBhIGZ1bmN0aW9uIHR5cGUsIGFuZCB0aGUgdHlwZSBpcyBlbmNvZGVkIGluIHRoZQogIC8vIG1ldGF0YWRhIHRhYmxlLCB0aGVuIHRoaXMgZmllbGQgY29udGFpbnMgdGhlIGluZGV4IGludG8gdGhhdCBmaWVsZC4KICBmaW5hbCBqcy5FeHByZXNzaW9uIGZ1bmN0aW9uVHlwZUluZGV4OwoKICAvLy8gV2hldGhlciB0aGUgY2xhc3MgbXVzdCBiZSBldmFsdWF0ZWQgZWFnZXJseS4KICBib29sIGlzRWFnZXIgPSBmYWxzZTsKCiAgLy8vIExlYWYgdGFncy4gU2VlIFtOYXRpdmVFbWl0dGVyLnByZXBhcmVOYXRpdmVDbGFzc2VzXS4KICBMaXN0PFN0cmluZz4gbmF0aXZlTGVhZlRhZ3M7CgogIC8vLyBOb24tbGVhZiB0YWdzLiBTZWUgW05hdGl2ZUVtaXR0ZXIucHJlcGFyZU5hdGl2ZUNsYXNzZXNdLgogIExpc3Q8U3RyaW5nPiBuYXRpdmVOb25MZWFmVGFnczsKCiAgLy8vIE5hdGl2ZSBleHRlbnNpb25zLiBTZWUgW05hdGl2ZUVtaXR0ZXIucHJlcGFyZU5hdGl2ZUNsYXNzZXNdLgogIExpc3Q8Q2xhc3M+IG5hdGl2ZUV4dGVuc2lvbnM7CgogIENsYXNzKAogICAgICB0aGlzLmVsZW1lbnQsCiAgICAgIHRoaXMubmFtZSwKICAgICAgdGhpcy5ob2xkZXIsCiAgICAgIHRoaXMubWV0aG9kcywKICAgICAgdGhpcy5maWVsZHMsCiAgICAgIHRoaXMuc3RhdGljRmllbGRzRm9yUmVmbGVjdGlvbiwKICAgICAgdGhpcy5jYWxsU3R1YnMsCiAgICAgIHRoaXMubm9TdWNoTWV0aG9kU3R1YnMsCiAgICAgIHRoaXMuY2hlY2tlZFNldHRlcnMsCiAgICAgIHRoaXMuaXNDaGVja3MsCiAgICAgIHRoaXMuY2xhc3NDaGVja3NOZXdSdGksCiAgICAgIHRoaXMuZnVuY3Rpb25UeXBlSW5kZXgsCiAgICAgIHt0aGlzLmhhc1J0aUZpZWxkLAogICAgICB0aGlzLm9ubHlGb3JSdGksCiAgICAgIHRoaXMuaXNEaXJlY3RseUluc3RhbnRpYXRlZCwKICAgICAgdGhpcy5pc05hdGl2ZSwKICAgICAgdGhpcy5pc0Nsb3N1cmVCYXNlQ2xhc3MsCiAgICAgIHRoaXMuaXNTb2Z0RGVmZXJyZWQgPSBmYWxzZSwKICAgICAgdGhpcy5pc1N1cGVyTWl4aW5BcHBsaWNhdGlvbn0pIHsKICAgIGFzc2VydChvbmx5Rm9yUnRpICE9IG51bGwpOwogICAgYXNzZXJ0KGlzRGlyZWN0bHlJbnN0YW50aWF0ZWQgIT0gbnVsbCk7CiAgICBhc3NlcnQoaXNOYXRpdmUgIT0gbnVsbCk7CiAgICBhc3NlcnQoaXNDbG9zdXJlQmFzZUNsYXNzICE9IG51bGwpOwogIH0KCiAgYm9vbCBnZXQgaXNTaW1wbGVNaXhpbkFwcGxpY2F0aW9uID0+IGZhbHNlOwoKICBDbGFzcyBnZXQgc3VwZXJjbGFzcyA9PiBfc3VwZXJjbGFzczsKCiAgdm9pZCBzZXRTdXBlcmNsYXNzKENsYXNzIHN1cGVyY2xhc3MpIHsKICAgIF9zdXBlcmNsYXNzID0gc3VwZXJjbGFzczsKICB9CgogIENsYXNzIGdldCBtaXhpbkNsYXNzID0+IF9taXhpbkNsYXNzOwoKICB2b2lkIHNldE1peGluQ2xhc3MoQ2xhc3MgbWl4aW5DbGFzcykgewogICAgX21peGluQ2xhc3MgPSBtaXhpbkNsYXNzOwogIH0KCiAganMuTmFtZSBnZXQgc3VwZXJjbGFzc05hbWUgPT4gc3VwZXJjbGFzcyA9PSBudWxsID8gbnVsbCA6IHN1cGVyY2xhc3MubmFtZTsKCiAgaW50IGdldCBzdXBlcmNsYXNzSG9sZGVySW5kZXggPT4KICAgICAgKHN1cGVyY2xhc3MgPT0gbnVsbCkgPyAwIDogc3VwZXJjbGFzcy5ob2xkZXIuaW5kZXg7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdDbGFzcyhuYW1lPSR7bmFtZS5rZXl9LGVsZW1lbnQ9JGVsZW1lbnQpJzsKfQoKY2xhc3MgTWl4aW5BcHBsaWNhdGlvbiBleHRlbmRzIENsYXNzIHsKICBNaXhpbkFwcGxpY2F0aW9uKAogICAgICBDbGFzc0VudGl0eSBlbGVtZW50LAogICAgICBqcy5OYW1lIG5hbWUsCiAgICAgIEhvbGRlciBob2xkZXIsCiAgICAgIExpc3Q8RmllbGQ+IGluc3RhbmNlRmllbGRzLAogICAgICBMaXN0PEZpZWxkPiBzdGF0aWNGaWVsZHNGb3JSZWZsZWN0aW9uLAogICAgICBMaXN0PFN0dWJNZXRob2Q+IGNhbGxTdHVicywKICAgICAgTGlzdDxTdHViTWV0aG9kPiBjaGVja2VkU2V0dGVycywKICAgICAgTGlzdDxTdHViTWV0aG9kPiBpc0NoZWNrcywKICAgICAgQ2xhc3NDaGVja3MgY2xhc3NDaGVja3NOZXdSdGksCiAgICAgIGpzLkV4cHJlc3Npb24gZnVuY3Rpb25UeXBlSW5kZXgsCiAgICAgIHtib29sIGhhc1J0aUZpZWxkLAogICAgICBib29sIG9ubHlGb3JSdGksCiAgICAgIGJvb2wgaXNEaXJlY3RseUluc3RhbnRpYXRlZH0pCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgIGhvbGRlciwKICAgICAgICAgICAgY29uc3QgPE1ldGhvZD5bXSwKICAgICAgICAgICAgaW5zdGFuY2VGaWVsZHMsCiAgICAgICAgICAgIHN0YXRpY0ZpZWxkc0ZvclJlZmxlY3Rpb24sCiAgICAgICAgICAgIGNhbGxTdHVicywKICAgICAgICAgICAgY29uc3QgPFN0dWJNZXRob2Q+W10sCiAgICAgICAgICAgIGNoZWNrZWRTZXR0ZXJzLAogICAgICAgICAgICBpc0NoZWNrcywKICAgICAgICAgICAgY2xhc3NDaGVja3NOZXdSdGksCiAgICAgICAgICAgIGZ1bmN0aW9uVHlwZUluZGV4LAogICAgICAgICAgICBoYXNSdGlGaWVsZDogaGFzUnRpRmllbGQsCiAgICAgICAgICAgIG9ubHlGb3JSdGk6IG9ubHlGb3JSdGksCiAgICAgICAgICAgIGlzRGlyZWN0bHlJbnN0YW50aWF0ZWQ6IGlzRGlyZWN0bHlJbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGlzTmF0aXZlOiBmYWxzZSwKICAgICAgICAgICAgaXNDbG9zdXJlQmFzZUNsYXNzOiBmYWxzZSwKICAgICAgICAgICAgaXNTdXBlck1peGluQXBwbGljYXRpb246IGZhbHNlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTaW1wbGVNaXhpbkFwcGxpY2F0aW9uID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdNaXhpbihuYW1lPSR7bmFtZS5rZXl9LGVsZW1lbnQ9JGVsZW1lbnQpJzsKfQoKLy8vIEEgZmllbGQuCi8vLwovLy8gSW4gZ2VuZXJhbCByZXByZXNlbnRzIGFuIGluc3RhbmNlIGZpZWxkLCBidXQgZm9yIHJlZmxlY3Rpb24gbWF5IGFsc28KLy8vIHJlcHJlc2VudCBzdGF0aWMgZmllbGRzLgpjbGFzcyBGaWVsZCB7CiAgLy8vIFRoZSBlbGVtZW50IHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbW9kZWwuCiAgLy8vIFVzZXMgaW5kaWNhdGUgbWlzc2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgbW9kZWwuCiAgZmluYWwgRmllbGRFbnRpdHkgZWxlbWVudDsKCiAgZmluYWwganMuTmFtZSBuYW1lOwogIGZpbmFsIGpzLk5hbWUgYWNjZXNzb3JOYW1lOwoKICAvLy8gMDA6IERvZXMgbm90IG5lZWQgYW55IGdldHRlci4KICAvLy8gMDE6ICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuZmllbGQ7IH0KICAvLy8gMTA6ICBmdW5jdGlvbihyZWNlaXZlcikgeyByZXR1cm4gcmVjZWl2ZXIuZmllbGQ7IH0KICAvLy8gMTE6ICBmdW5jdGlvbihyZWNlaXZlcikgeyByZXR1cm4gdGhpcy5maWVsZDsgfQogIGZpbmFsIGludCBnZXR0ZXJGbGFnczsKCiAgLy8vIDAwOiBEb2VzIG5vdCBuZWVkIGFueSBzZXR0ZXIuCiAgLy8vIDAxOiAgZnVuY3Rpb24odmFsdWUpIHsgdGhpcy5maWVsZCA9IHZhbHVlOyB9CiAgLy8vIDEwOiAgZnVuY3Rpb24ocmVjZWl2ZXIsIHZhbHVlKSB7IHJlY2VpdmVyLmZpZWxkID0gdmFsdWU7IH0KICAvLy8gMTE6ICBmdW5jdGlvbihyZWNlaXZlciwgdmFsdWUpIHsgdGhpcy5maWVsZCA9IHZhbHVlOyB9CiAgZmluYWwgaW50IHNldHRlckZsYWdzOwoKICBmaW5hbCBib29sIG5lZWRzQ2hlY2tlZFNldHRlcjsKCiAgZmluYWwgQ29uc3RhbnRWYWx1ZSBpbml0aWFsaXplckluQWxsb2NhdG9yOwoKICBmaW5hbCBDb25zdGFudFZhbHVlIGNvbnN0YW50VmFsdWU7CgogIGZpbmFsIGJvb2wgaXNFbGlkZWQ7CgogIC8vIFRPRE8oZmxvaXRzY2gpOiBzdXBwb3J0IHJlbmFtZWQgZmllbGRzLgogIEZpZWxkKAogICAgICB0aGlzLmVsZW1lbnQsCiAgICAgIHRoaXMubmFtZSwKICAgICAgdGhpcy5hY2Nlc3Nvck5hbWUsCiAgICAgIHRoaXMuZ2V0dGVyRmxhZ3MsCiAgICAgIHRoaXMuc2V0dGVyRmxhZ3MsCiAgICAgIHRoaXMubmVlZHNDaGVja2VkU2V0dGVyLAogICAgICB0aGlzLmluaXRpYWxpemVySW5BbGxvY2F0b3IsCiAgICAgIHRoaXMuY29uc3RhbnRWYWx1ZSwKICAgICAgdGhpcy5pc0VsaWRlZCk7CgogIGJvb2wgZ2V0IG5lZWRzR2V0dGVyID0+IGdldHRlckZsYWdzICE9IDA7CiAgYm9vbCBnZXQgbmVlZHNVbmNoZWNrZWRTZXR0ZXIgPT4gc2V0dGVyRmxhZ3MgIT0gMDsKCiAgYm9vbCBnZXQgbmVlZHNJbnRlcmNlcHRlZEdldHRlciA9PiBnZXR0ZXJGbGFncyA+IDE7CiAgYm9vbCBnZXQgbmVlZHNJbnRlcmNlcHRlZFNldHRlciA9PiBzZXR0ZXJGbGFncyA+IDE7CgogIGJvb2wgZ2V0IG5lZWRzSW50ZXJjZXB0ZWRHZXR0ZXJPblJlY2VpdmVyID0+IGdldHRlckZsYWdzID09IDI7CiAgYm9vbCBnZXQgbmVlZHNJbnRlcmNlcHRlZFNldHRlck9uUmVjZWl2ZXIgPT4gc2V0dGVyRmxhZ3MgPT0gMjsKCiAgYm9vbCBnZXQgbmVlZHNJbnRlcmNlcHRlZEdldHRlck9uVGhpcyA9PiBnZXR0ZXJGbGFncyA9PSAzOwogIGJvb2wgZ2V0IG5lZWRzSW50ZXJjZXB0ZWRTZXR0ZXJPblRoaXMgPT4gc2V0dGVyRmxhZ3MgPT0gMzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdGaWVsZChuYW1lPSR7bmFtZS5rZXl9LGVsZW1lbnQ9JHtlbGVtZW50fSknOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgTWV0aG9kIHsKICAvLy8gVGhlIGVsZW1lbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcgdGhlIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtb2RlbC4KICAvLy8gVXNlcyBpbmRpY2F0ZSBtaXNzaW5nIGluZm9ybWF0aW9uIGluIHRoZSBtb2RlbC4KICBmaW5hbCBNZW1iZXJFbnRpdHkgZWxlbWVudDsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QuIElmIHRoZSBtZXRob2QgaXMgYSBbUGFyYW1ldGVyU3R1Yk1ldGhvZF0gZm9yIGEKICAvLy8gc3RhdGljIGZ1bmN0aW9uLCB0aGVuIHRoZSBuYW1lIGNhbiBiZSBgbnVsbGAuIEluIHRoYXQgY2FzZSwgb25seSB0aGUKICAvLy8gW1BhcmFtZXRlclN0dWJNZXRob2QuY2FsbE5hbWVdIHNob3VsZCBiZSB1c2VkLgogIGZpbmFsIGpzLk5hbWUgbmFtZTsKICBmaW5hbCBqcy5FeHByZXNzaW9uIGNvZGU7CgogIE1ldGhvZCh0aGlzLmVsZW1lbnQsIHRoaXMubmFtZSwgdGhpcy5jb2RlKTsKfQoKLy8vIEEgbWV0aG9kIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBtZXRob2QgaW4gdGhlIG9yaWdpbmFsIERhcnQgcHJvZ3JhbS4KYWJzdHJhY3QgY2xhc3MgRGFydE1ldGhvZCBleHRlbmRzIE1ldGhvZCB7CiAgZmluYWwgYm9vbCBuZWVkc1RlYXJPZmY7CiAgZmluYWwganMuTmFtZSB0ZWFyT2ZmTmFtZTsKICBmaW5hbCBMaXN0PFBhcmFtZXRlclN0dWJNZXRob2Q+IHBhcmFtZXRlclN0dWJzOwogIGZpbmFsIGJvb2wgY2FuQmVBcHBsaWVkOwogIGZpbmFsIGludCBhcHBseUluZGV4OwoKICAvLyBJcyBub24tbnVsbCBpZiBbbmVlZHNUZWFyT2ZmXS4KICAvLwogIC8vIElmIHRoZSB0eXBlIGlzIGVuY29kZWQgaW4gdGhlIG1ldGFkYXRhIHRhYmxlIHRoaXMgZmllbGQgY29udGFpbnMgYW4gaW5kZXgKICAvLyBpbnRvIHRoZSB0YWJsZS4gT3RoZXJ3aXNlIHRoZSB0eXBlIGNvbnRhaW5zIHR5cGUgdmFyaWFibGVzIGluIHdoaWNoIGNhc2UKICAvLyB0aGlzIGZpZWxkIGhvbGRzIGEgZnVuY3Rpb24gY29tcHV0aW5nIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUuCiAgZmluYWwganMuRXhwcmVzc2lvbiBmdW5jdGlvblR5cGU7CgogIC8vIFNpZ25hdHVyZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBtZXRob2QuIFtvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXNdIGlzCiAgLy8gb25seSByZXF1aXJlZCBhbmQgc3RvcmVkIGhlcmUgaWYgdGhlIG1ldGhvZCBbY2FuQmVBcHBsaWVkXS4gVGhlIGNvdW50IGlzCiAgLy8gYWx3YXlzIHN0b3JlZCB0byBoZWxwIHNlbGVjdCBzcGVjaWFsaXplZCB0ZWFyLW9mZiBwYXRocy4KICBmaW5hbCBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDsKICBmaW5hbCAvKiBNYXAgfCBMaXN0ICovIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlczsKCiAgLy8gSWYgdGhpcyBtZXRob2QgY2FuIGJlIHRvcm4gb2ZmLCBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZwogIC8vIGNhbGwgbWV0aG9kLiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBtZW1iZXIgYGZvbyQxJG5hbWVgIGl0IHdvdWxkIGJlCiAgLy8gYGNhbGwkMSRuYW1lYCAoaW4gdW5taW5pZmllZCBtb2RlKS4KICBmaW5hbCBqcy5OYW1lIGNhbGxOYW1lOwoKICBEYXJ0TWV0aG9kKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsIGpzLk5hbWUgbmFtZSwganMuRXhwcmVzc2lvbiBjb2RlLAogICAgICB0aGlzLnBhcmFtZXRlclN0dWJzLCB0aGlzLmNhbGxOYW1lLAogICAgICB7dGhpcy5uZWVkc1RlYXJPZmYsCiAgICAgIHRoaXMudGVhck9mZk5hbWUsCiAgICAgIHRoaXMuY2FuQmVBcHBsaWVkLAogICAgICB0aGlzLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgIHRoaXMub3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICB0aGlzLmZ1bmN0aW9uVHlwZSwKICAgICAgdGhpcy5hcHBseUluZGV4fSkKICAgICAgOiBzdXBlcihlbGVtZW50LCBuYW1lLCBjb2RlKSB7CiAgICBhc3NlcnQobmVlZHNUZWFyT2ZmICE9IG51bGwpOwogICAgYXNzZXJ0KCFuZWVkc1RlYXJPZmYgfHwgdGVhck9mZk5hbWUgIT0gbnVsbCk7CiAgICBhc3NlcnQoY2FuQmVBcHBsaWVkICE9IG51bGwpOwogICAgYXNzZXJ0KCFjYW5CZUFwcGxpZWQgfHwKICAgICAgICAocmVxdWlyZWRQYXJhbWV0ZXJDb3VudCAhPSBudWxsICYmCiAgICAgICAgICAgIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcyAhPSBudWxsKSk7CiAgfQoKICBib29sIGdldCBpc1N0YXRpYzsKfQoKY2xhc3MgSW5zdGFuY2VNZXRob2QgZXh0ZW5kcyBEYXJ0TWV0aG9kIHsKICAvLy8gQW4gYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhpcyBtZXRob2QuIFRoaXMgaXMgdXNlZCB0byBtb2RlbCBjYWxscyB0bwogIC8vLyBhIG1ldGhvZCB2aWEgYHN1cGVyYC4gSWYgW2FsaWFzTmFtZV0gaXMgbm9uLW51bGwsIHRoZSBlbWl0dGVyIGhhcyB0bwogIC8vLyBlbnN1cmUgdGhhdCB0aGlzIG1ldGhvZCBpcyByZWdpc3RlcmVkIG9uIHRoZSBwcm90b3R5cGUgdW5kZXIgYm90aCBbbmFtZV0KICAvLy8gYW5kIFthbGlhc05hbWVdLgogIGZpbmFsIGpzLk5hbWUgYWxpYXNOYW1lOwoKICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIHRoZSBpbXBsaWNpdCBgY2FsbGAgaW5zdGFuY2UgbWV0aG9kIG9mIGFuIGFub255bW91cwogIC8vLyBjbG9zdXJlLiBUaGlzIHByZWRpY2F0ZSBpcyBmYWxzZSBmb3IgZXhwbGljaXQgYGNhbGxgIG1ldGhvZHMgYW5kIGZvcgogIC8vLyBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdG9ybiBvZmYuCiAgZmluYWwgYm9vbCBpc0Nsb3N1cmVDYWxsTWV0aG9kOwoKICAvLy8gVHJ1ZSBpZiB0aGUgaW50ZXJjZXB0b3IgY2FsbGluZyBjb252ZW50aW9uIGlzIHVzZWQgZm9yIHRoaXMgbWV0aG9kLgogIGZpbmFsIGJvb2wgaXNJbnRlcmNlcHRlZDsKCiAgLy8vIE5hbWUgY2FsbGVkIHZpYSB0aGUgZ2VuZXJhbCAnY2F0Y2ggYWxsJyBwYXRoIG9mIEZ1bmN0aW9uLmFwcGx5LgogIC8vL2ZpbmFsIGpzLk5hbWUgYXBwbHlOYW1lOwoKICBJbnN0YW5jZU1ldGhvZChGdW5jdGlvbkVudGl0eSBlbGVtZW50LCBqcy5OYW1lIG5hbWUsIGpzLkV4cHJlc3Npb24gY29kZSwKICAgICAgTGlzdDxQYXJhbWV0ZXJTdHViTWV0aG9kPiBwYXJhbWV0ZXJTdHVicywganMuTmFtZSBjYWxsTmFtZSwKICAgICAge2Jvb2wgbmVlZHNUZWFyT2ZmLAogICAgICBqcy5OYW1lIHRlYXJPZmZOYW1lLAogICAgICB0aGlzLmFsaWFzTmFtZSwKICAgICAgYm9vbCBjYW5CZUFwcGxpZWQsCiAgICAgIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAvKiBMaXN0IHwgTWFwICovIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgdGhpcy5pc0Nsb3N1cmVDYWxsTWV0aG9kLAogICAgICB0aGlzLmlzSW50ZXJjZXB0ZWQsCiAgICAgIGpzLkV4cHJlc3Npb24gZnVuY3Rpb25UeXBlLAogICAgICBpbnQgYXBwbHlJbmRleH0pCiAgICAgIDogc3VwZXIoZWxlbWVudCwgbmFtZSwgY29kZSwgcGFyYW1ldGVyU3R1YnMsIGNhbGxOYW1lLAogICAgICAgICAgICBuZWVkc1RlYXJPZmY6IG5lZWRzVGVhck9mZiwKICAgICAgICAgICAgdGVhck9mZk5hbWU6IHRlYXJPZmZOYW1lLAogICAgICAgICAgICBjYW5CZUFwcGxpZWQ6IGNhbkJlQXBwbGllZCwKICAgICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzOiBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgICAgICAgIGZ1bmN0aW9uVHlwZTogZnVuY3Rpb25UeXBlLAogICAgICAgICAgICBhcHBseUluZGV4OiBhcHBseUluZGV4KSB7CiAgICBhc3NlcnQoaXNDbG9zdXJlQ2FsbE1ldGhvZCAhPSBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3RhdGljID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ0luc3RhbmNlTWV0aG9kKG5hbWU9JHtuYW1lLmtleX0sZWxlbWVudD0ke2VsZW1lbnR9JwogICAgICAgICcsY29kZT0ke2pzLm5vZGVUb1N0cmluZyhjb2RlKX0pJzsKICB9Cn0KCi8vLyBBIG1ldGhvZCB0aGF0IGlzIGdlbmVyYXRlZCBieSB0aGUgYmFja2VuZCBhbmQgaGFzIG5vdCBkaXJlY3QgY29ycmVzcG9uZGVuY2UKLy8vIHRvIGEgbWV0aG9kIGluIHRoZSBvcmlnaW5hbCBEYXJ0IHByb2dyYW0uIEV4YW1wbGVzIGFyZSBnZXR0ZXIgYW5kIHNldHRlcgovLy8gc3R1YnMgYW5kIHN0dWJzIHRvIGRpc3BhdGNoIGNhbGxzIHRvIG1ldGhvZHMgd2l0aCBvcHRpb25hbCBwYXJhbWV0ZXJzLgpjbGFzcyBTdHViTWV0aG9kIGV4dGVuZHMgTWV0aG9kIHsKICBTdHViTWV0aG9kKGpzLk5hbWUgbmFtZSwganMuRXhwcmVzc2lvbiBjb2RlLCB7TWVtYmVyRW50aXR5IGVsZW1lbnR9KQogICAgICA6IHN1cGVyKGVsZW1lbnQsIG5hbWUsIGNvZGUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ1N0dWJNZXRob2QobmFtZT0ke25hbWUua2V5fSxlbGVtZW50PSR7ZWxlbWVudH0nCiAgICAgICAgJyxjb2RlPSR7anMubm9kZVRvU3RyaW5nKGNvZGUpfSknOwogIH0KfQoKLy8vIEEgc3R1YiB0aGF0IGFkYXB0cyBhbmQgcmVkaXJlY3RzIHRvIHRoZSBtYWluIG1ldGhvZCAodGhlIG9uZSBjb250YWluaW5nKQovLy8gdGhlIGFjdHVhbCBjb2RlLgovLy8KLy8vIEZvciBleGFtcGxlLCBnaXZlbiBhIG1ldGhvZCBgZm9vJDIoeCwgW3k6IDQ5OV0pYCBhIHBvc3NpYmxlIHBhcmFtZXRlcgovLy8gc3R1Yi1tZXRob2QgY291bGQgYmUgYGZvbyQxKHgpID0+IGZvbyQyKHgsIDQ5OSlgLgovLy8KLy8vIFBhcmFtZXRlclN0dWJNZXRob2RzIGFyZSBhbHdheXMgYXR0YWNoZWQgdG8gKHN0YXRpYyBvciBpbnN0YW5jZSkgbWV0aG9kcy4KY2xhc3MgUGFyYW1ldGVyU3R1Yk1ldGhvZCBleHRlbmRzIFN0dWJNZXRob2QgewogIC8vLyBUaGUgYGNhbGxgIG5hbWUgb2YgdGhpcyBzdHViLgogIC8vLwogIC8vLyBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBpcyB0b3JuIG9mZiwgaXQgaXMgaW52b2tlZCBhcyBhIGBjYWxsYCBtZW1iZXIgYW5kCiAgLy8vIG5vdCBpdCdzIG9yaWdpbmFsIG5hbWUgYW55bW9yZS4gVGhlIFtjYWxsTmFtZV0gcHJvdmlkZXMgdGhlIHN0dWIncwogIC8vLyBuYW1lIHdoZW4gaXQgaXMgdXNlZCB0aGlzIHdheS4KICAvLy8KICAvLy8gSWYgYSBzdHViJ3MgbWVtYmVyIGNhbiBub3QgYmUgdG9ybiBvZmYsIHRoZSBbY2FsbE5hbWVdIGlzIGBudWxsYC4KICBqcy5OYW1lIGNhbGxOYW1lOwoKICBQYXJhbWV0ZXJTdHViTWV0aG9kKGpzLk5hbWUgbmFtZSwgdGhpcy5jYWxsTmFtZSwganMuRXhwcmVzc2lvbiBjb2RlLAogICAgICB7TWVtYmVyRW50aXR5IGVsZW1lbnR9KQogICAgICA6IHN1cGVyKG5hbWUsIGNvZGUsIGVsZW1lbnQ6IGVsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ1BhcmFtZXRlclN0dWJNZXRob2QobmFtZT0ke25hbWUua2V5fSwgY2FsbE5hbWU9JHtjYWxsTmFtZT8ua2V5fScKICAgICAgICAnLCBlbGVtZW50PSR7ZWxlbWVudH0nCiAgICAgICAgJywgY29kZT0ke2pzLm5vZGVUb1N0cmluZyhjb2RlKX0pJzsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIFN0YXRpY01ldGhvZCBpbXBsZW1lbnRzIE1ldGhvZCB7CiAgSG9sZGVyIGdldCBob2xkZXI7Cn0KCmNsYXNzIFN0YXRpY0RhcnRNZXRob2QgZXh0ZW5kcyBEYXJ0TWV0aG9kIGltcGxlbWVudHMgU3RhdGljTWV0aG9kIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBIb2xkZXIgaG9sZGVyOwoKICBTdGF0aWNEYXJ0TWV0aG9kKAogICAgICBGdW5jdGlvbkVudGl0eSBlbGVtZW50LAogICAgICBqcy5OYW1lIG5hbWUsCiAgICAgIHRoaXMuaG9sZGVyLAogICAgICBqcy5FeHByZXNzaW9uIGNvZGUsCiAgICAgIExpc3Q8UGFyYW1ldGVyU3R1Yk1ldGhvZD4gcGFyYW1ldGVyU3R1YnMsCiAgICAgIGpzLk5hbWUgY2FsbE5hbWUsCiAgICAgIHtib29sIG5lZWRzVGVhck9mZiwKICAgICAganMuTmFtZSB0ZWFyT2ZmTmFtZSwKICAgICAgYm9vbCBjYW5CZUFwcGxpZWQsCiAgICAgIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAvKiBMaXN0IHwgTWFwICovIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAganMuRXhwcmVzc2lvbiBmdW5jdGlvblR5cGUsCiAgICAgIGludCBhcHBseUluZGV4fSkKICAgICAgOiBzdXBlcihlbGVtZW50LCBuYW1lLCBjb2RlLCBwYXJhbWV0ZXJTdHVicywgY2FsbE5hbWUsCiAgICAgICAgICAgIG5lZWRzVGVhck9mZjogbmVlZHNUZWFyT2ZmLAogICAgICAgICAgICB0ZWFyT2ZmTmFtZTogdGVhck9mZk5hbWUsCiAgICAgICAgICAgIGNhbkJlQXBwbGllZDogY2FuQmVBcHBsaWVkLAogICAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgICAgICBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXM6IG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgICAgICAgZnVuY3Rpb25UeXBlOiBmdW5jdGlvblR5cGUsCiAgICAgICAgICAgIGFwcGx5SW5kZXg6IGFwcGx5SW5kZXgpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1N0YXRpYyA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ1N0YXRpY0RhcnRNZXRob2QobmFtZT0ke25hbWUua2V5fSxlbGVtZW50PSR7ZWxlbWVudH0nCiAgICAgICAgJyxjb2RlPSR7anMubm9kZVRvU3RyaW5nKGNvZGUpfSknOwogIH0KfQoKY2xhc3MgU3RhdGljU3R1Yk1ldGhvZCBleHRlbmRzIFN0dWJNZXRob2QgaW1wbGVtZW50cyBTdGF0aWNNZXRob2QgewogIEBvdmVycmlkZQogIEhvbGRlciBob2xkZXI7CiAgU3RhdGljU3R1Yk1ldGhvZChqcy5OYW1lIG5hbWUsIHRoaXMuaG9sZGVyLCBqcy5FeHByZXNzaW9uIGNvZGUpCiAgICAgIDogc3VwZXIobmFtZSwgY29kZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnU3RhdGljU3R1Yk1ldGhvZChuYW1lPSR7bmFtZS5rZXl9LGVsZW1lbnQ9JHtlbGVtZW50fX0nCiAgICAgICAgJyxjb2RlPSR7anMubm9kZVRvU3RyaW5nKGNvZGUpfSknOwogIH0KfQqCiQBOTjwBJgE2MCRPNjMxARAiHikhJQFKLQFQUSwBTkUuMAFRMCAnJigwBAFKBk0+Th0GTUlLDDk+BAFGBk1PUQZNUBQ+OwQBLEEwAgFPGg8VEyIgASBJAQwWIwQCASsERBQaUTYfASEiTTBLOQEqHwEMFxsWISoXARsCARoEUh8mIQEQHR0XHy43IEs3AQwjAQwWHQQCASgqFQEUHR0RHy43IEs3AQwkAQwWLQQCAREWFx0BMAEMFksEAgEgLQIBKk42HwEUJB0BDC8BPicBDBY1BAIBFE42HQEWHExCFxwWFSYBUEkBDBY/BAIBKE42HQEWFxUVHhwjJykBQyQBRywML1EZJRdEATIGTh0BJgFNSSkBMxgBOx8BPyIBQyABCRQRExQTJhYeGxUeHhkXIxUfIycgLB4oBAEuAScBKR4EAScBKR4EAU0BIzoBDEMCAScUGxQVIi0iJyElJxkXJA8VEhQeHCcXIhwWHx8mJDwdJy0BDC0BDEMCAQ0ESR0OTjYdARYeASQtOTUZASQzQT0ZASEBLgElARcBLQkUERkYGB8jGhYBLDUBNjYBQUEBPT0BDBY5BAIBGE42HgFNSzUWHAEuAgFIKxsdMhsYASQFT05DJAFQTj4kOQFMRykaAUcqGhgZIysZGCUiMiIcKzYEARUCASpKS08XGwFKSyYiAUocAUYeAUtCGhsWGSI3IBoiFz0oJig8TCgmKQQBDB4BDBZAKwQCAVBNSyJHJAEMFjwrBAIBTRUESjYETi8kBlBJJQZIFAFHHi0BDBZNHywEAgEwFQIBRAwXARQeFBMaMBgaGxkiNyIXPSgmKDxMKCUBDB0BDBZCKwQCAUQMEUIbAQwWQysEAgEqcGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9tb2RlbC5kYXJ0PHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvbmF0aXZlX2VtaXR0ZXIuZGFydLXzLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19lbWl0dGVyLm5hdGl2ZV9lbWl0dGVyOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgSkNvbW1vbkVsZW1lbnRzLCBKRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnIHNob3cgRGFydFR5cGUsIEZ1bmN0aW9uVHlwZTsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqc0FzdDsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBzaG93IGpzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvaW50ZXJjZXB0b3JfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hdGl2ZV9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9lbnF1ZXVlLmRhcnQnIHNob3cgTmF0aXZlQ29kZWdlbkVucXVldWVyOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwoKaW1wb3J0ICdjb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JyBzaG93IENvZGVFbWl0dGVyVGFzazsKaW1wb3J0ICdtb2RlbC5kYXJ0JzsKCmNsYXNzIE5hdGl2ZUVtaXR0ZXIgewogIGZpbmFsIENvZGVFbWl0dGVyVGFzayBfZW1pdHRlclRhc2s7CiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKICBmaW5hbCBOYXRpdmVDb2RlZ2VuRW5xdWV1ZXIgX25hdGl2ZUNvZGVnZW5FbnF1ZXVlcjsKCiAgLy8gV2hldGhlciB0aGUgYXBwbGljYXRpb24gY29udGFpbnMgbmF0aXZlIGNsYXNzZXMuCiAgYm9vbCBoYXNOYXRpdmVDbGFzc2VzID0gZmFsc2U7CgogIC8vIENhY2hlcyB0aGUgbmF0aXZlIHN1YnR5cGVzIG9mIGEgbmF0aXZlIGNsYXNzLgogIE1hcDxDbGFzc0VudGl0eSwgTGlzdDxDbGFzc0VudGl0eT4+IHN1YnR5cGVzID0KICAgICAgPENsYXNzRW50aXR5LCBMaXN0PENsYXNzRW50aXR5Pj57fTsKCiAgLy8gQ2FjaGVzIHRoZSBkaXJlY3QgbmF0aXZlIHN1YnR5cGVzIG9mIGEgbmF0aXZlIGNsYXNzLgogIE1hcDxDbGFzc0VudGl0eSwgTGlzdDxDbGFzc0VudGl0eT4+IGRpcmVjdFN1YnR5cGVzID0KICAgICAgPENsYXNzRW50aXR5LCBMaXN0PENsYXNzRW50aXR5Pj57fTsKCiAgLy8gQ2FjaGVzIHRoZSBtZXRob2RzIHRoYXQgaGF2ZSBhIG5hdGl2ZSBib2R5LgogIFNldDxGdW5jdGlvbkVudGl0eT4gbmF0aXZlTWV0aG9kcyA9IG5ldyBTZXQ8RnVuY3Rpb25FbnRpdHk+KCk7CgogIE5hdGl2ZUVtaXR0ZXIoCiAgICAgIHRoaXMuX2VtaXR0ZXJUYXNrLCB0aGlzLl9jbG9zZWRXb3JsZCwgdGhpcy5fbmF0aXZlQ29kZWdlbkVucXVldWVyKTsKCiAgSkNvbW1vbkVsZW1lbnRzIGdldCBfY29tbW9uRWxlbWVudHMgPT4gX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzOwogIEpFbGVtZW50RW52aXJvbm1lbnQgZ2V0IF9lbGVtZW50RW52aXJvbm1lbnQgPT4KICAgICAgX2Nsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudDsKICBOYXRpdmVEYXRhIGdldCBfbmF0aXZlRGF0YSA9PiBfY2xvc2VkV29ybGQubmF0aXZlRGF0YTsKICBJbnRlcmNlcHRvckRhdGEgZ2V0IF9pbnRlcmNlcHRvckRhdGEgPT4gX2Nsb3NlZFdvcmxkLmludGVyY2VwdG9yRGF0YTsKCiAgLy8vIFByZXBhcmVzIG5hdGl2ZSBjbGFzc2VzIGZvciBlbWlzc2lvbi4gUmV0dXJucyB0aGUgdW5uZWVkZWQgY2xhc3Nlcy4KICAvLy8KICAvLy8gUmVtb3ZlcyB0cml2aWFsIGNsYXNzZXMgKHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IGEgc3VwZXIgdHlwZSkgYW5kCiAgLy8vIGdlbmVyYXRlcyBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSB0byBiZSBhZGRlZCB0byBjbGFzc2VzIChuYXRpdmUgb3Igbm90KS4KICAvLy8KICAvLy8gVXBkYXRlcyB0aGUgYG5hdGl2ZUxlYWZUYWdzYCwgYG5hdGl2ZU5vbkxlYWZUYWdzYCBhbmQgYG5hdGl2ZUV4dGVuc2lvbnNgCiAgLy8vIGZpZWxkcyBvZiB0aGUgZ2l2ZW4gY2xhc3Nlcy4gVGhpcyBkYXRhIG11c3QgYmUgZW1pdHRlZCB3aXRoIHRoZQogIC8vLyBjb3JyZXNwb25kaW5nIGNsYXNzZXMuCiAgLy8vCiAgLy8vIFRoZSBpbnRlcmNlcHRvcnMgYXJlIGZpbHRlcmVkIHRvIGF2b2lkIGVtaXR0aW5nIHRyaXZpYWwgaW50ZXJjZXB0b3JzLiAgRm9yCiAgLy8vIGV4YW1wbGUsIGlmIHRoZSBwcm9ncmFtIGNvbnRhaW5zIG5vIGNvZGUgdGhhdCBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUKICAvLy8gbnVtZXJvdXMgc3ViY2xhc3NlcyBvZiBgRWxlbWVudGAgdGhlbiB3ZSBjYW4gcHJldGVuZCB0aGF0IGBFbGVtZW50YCBpcyBhCiAgLy8vIGxlYWYgY2xhc3MsIGFuZCBhbGwgaW5zdGFuY2VzIG9mIHN1YmNsYXNzZXMgb2YgYEVsZW1lbnRgIGFyZSBpbnN0YW5jZXMgb2YKICAvLy8gYEVsZW1lbnRgLgogIC8vLwogIC8vLyBUaGVyZSBpcyBhbHNvIGEgcGVyZm9ybWFuY2UgYmVuZWZpdCAoaW4gYWRkaXRpb24gdG8gdGhlIG9idmlvdXMgY29kZSBzaXplCiAgLy8vIGJlbmVmaXQpLCBkdWUgdG8gaG93IFtnZXROYXRpdmVJbnRlcmNlcHRvcl0gd29ya3MuICBGaW5kaW5nIHRoZQogIC8vLyBpbnRlcmNlcHRvciBvZiBhIGxlYWYgY2xhc3MgaW4gdGhlIGhpZXJhcmNoeSBpcyBtb3JlIGVmZmljaWVudCB0aGF0IGEKICAvLy8gbm9uLWxlYWYsIHNvIGl0IGltcHJvdmVzIHBlcmZvcm1hbmNlIHdoZW4gbW9yZSBjbGFzc2VzIGNhbiBiZSB0cmVhdGVkIGFzCiAgLy8vIGxlYXZlcy4KICAvLy8KICAvLy8gW2NsYXNzZXNdIGNvbnRhaW5zIG5hdGl2ZSBjbGFzc2VzLCBtaXhpbiBhcHBsaWNhdGlvbnMsIGFuZCB1c2VyIHN1YmNsYXNzZXMKICAvLy8gb2YgbmF0aXZlIGNsYXNzZXMuCiAgLy8vCiAgLy8vIFtpbnRlcmNlcHRvckNsYXNzZXNOZWVkZWRCeUNvbnN0YW50c10gY29udGFpbnMgdGhlIGludGVyY2VwdG9ycyB0aGF0IGFyZQogIC8vLyByZWZlcmVuY2VkIGJ5IGNvbnN0YW50cy4KICAvLy8KICAvLy8gW2NsYXNzZXNNb2RpZmllZEJ5RW1pdFJUSVN1cHBvcnRdIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGNsYXNzZXMgdGhhdCBtdXN0CiAgLy8vIGV4aXN0LCBiZWNhdXNlIHJ1bnRpbWUtdHlwZSBzdXBwb3J0IGFkZHMgaW5mb3JtYXRpb24gdG8gdGhlIGNsYXNzLgogIFNldDxDbGFzcz4gcHJlcGFyZU5hdGl2ZUNsYXNzZXMoCiAgICAgIExpc3Q8Q2xhc3M+IGNsYXNzZXMsCiAgICAgIFNldDxDbGFzc0VudGl0eT4gaW50ZXJjZXB0b3JDbGFzc2VzTmVlZGVkQnlDb25zdGFudHMsCiAgICAgIEl0ZXJhYmxlPENsYXNzRW50aXR5PiBjbGFzc2VzTmVlZGVkRm9yUnRpKSB7CiAgICBhc3NlcnQoY2xhc3Nlcy5ldmVyeSgoQ2xhc3MgY2xzKSA9PiBjbHMgIT0gbnVsbCkpOwoKICAgIGhhc05hdGl2ZUNsYXNzZXMgPSBjbGFzc2VzLmlzTm90RW1wdHk7CgogICAgLy8gQ29tcHV0ZSBhIHByZS1vcmRlciB0cmF2ZXJzYWwgb2YgdGhlIHN1YmNsYXNzIGZvcmVzdC4gIFdlIGFjdHVhbGx5IHdhbnQgYQogICAgLy8gcG9zdC1vcmRlciB0cmF2ZXJzYWwgYnV0IGl0IGlzIGVhc2llciB0byBjb21wdXRlIHRoZSBwcmUtb3JkZXIgYW5kIHVzZSBpdAogICAgLy8gaW4gcmV2ZXJzZS4KICAgIExpc3Q8Q2xhc3M+IHByZU9yZGVyID0gPENsYXNzPltdOwogICAgU2V0PENsYXNzPiBzZWVuID0gbmV3IFNldDxDbGFzcz4oKTsKCiAgICBDbGFzcyBvYmplY3RDbGFzcyA9IG51bGw7CiAgICBDbGFzcyBqc0ludGVyY2VwdG9yQ2xhc3MgPSBudWxsOwoKICAgIHZvaWQgd2FsayhDbGFzcyBjbHMpIHsKICAgICAgaWYgKGNscy5lbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcykgewogICAgICAgIG9iamVjdENsYXNzID0gY2xzOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoY2xzLmVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLmpzSW50ZXJjZXB0b3JDbGFzcykgewogICAgICAgIGpzSW50ZXJjZXB0b3JDbGFzcyA9IGNsczsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHNlZW4uY29udGFpbnMoY2xzKSkgcmV0dXJuOwogICAgICBzZWVuLmFkZChjbHMpOwogICAgICB3YWxrKGNscy5zdXBlcmNsYXNzKTsKICAgICAgcHJlT3JkZXIuYWRkKGNscyk7CiAgICB9CgogICAgY2xhc3Nlcy5mb3JFYWNoKHdhbGspOwoKICAgIC8vIEZpbmQgd2hpY2ggY2xhc3NlcyBhcmUgbmVlZGVkIGFuZCB3aGljaCBhcmUgbm9uLWxlYWYgY2xhc3Nlcy4gIEFueSBjbGFzcwogICAgLy8gdGhhdCBpcyBub3QgbmVlZGVkIGNhbiBiZSB0cmVhdGVkIGFzIGEgbGVhZiBjbGFzcyBlcXVpdmFsZW50IHRvIHNvbWUKICAgIC8vIG5lZWRlZCBjbGFzcy4KCiAgICBTZXQ8Q2xhc3M+IG5lZWRlZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzPigpOwogICAgU2V0PENsYXNzPiBub25MZWFmQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3M+KCk7CgogICAgTWFwPENsYXNzLCBMaXN0PENsYXNzPj4gZXh0ZW5zaW9uUG9pbnRzID0gY29tcHV0ZUV4dGVuc2lvblBvaW50cyhwcmVPcmRlcik7CgogICAgbmVlZGVkQ2xhc3Nlcy5hZGQob2JqZWN0Q2xhc3MpOwoKICAgIGZvciAoQ2xhc3MgY2xzIGluIHByZU9yZGVyLnJldmVyc2VkKSB7CiAgICAgIENsYXNzRW50aXR5IGNsYXNzRWxlbWVudCA9IGNscy5lbGVtZW50OwogICAgICAvLyBQb3N0LW9yZGVyIHRyYXZlcnNhbCBlbnN1cmVzIHdlIHZpc2l0IHRoZSBzdWJjbGFzc2VzIGJlZm9yZSB0aGVpcgogICAgICAvLyBzdXBlcmNsYXNzLiAgVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlbGwgaWYgYSBjbGFzcyBpcyBuZWVkZWQgYmVjYXVzZSBhCiAgICAgIC8vIHN1YmNsYXNzIGlzIG5lZWRlZC4KICAgICAgYm9vbCBuZWVkZWQgPSBmYWxzZTsKICAgICAgaWYgKCFjbHMuaXNOYXRpdmUpIHsKICAgICAgICAvLyBNaXhpbiBhcHBsaWNhdGlvbnMgKG5hdGl2ZSttaXhpbikgYXJlIG5vbi1uYXRpdmUsIHNvIFtjbGFzc0VsZW1lbnRdCiAgICAgICAgLy8gaGFzIGFscmVhZHkgYmVlbiBlbWl0dGVkIGFzIGEgcmVndWxhciBjbGFzcy4gIE1hcmsgW2NsYXNzRWxlbWVudF0gYXMKICAgICAgICAvLyAnbmVlZGVkJyB0byBlbnN1cmUgdGhlIG5hdGl2ZSBzdXBlcmNsYXNzIGlzIG5lZWRlZC4KICAgICAgICBuZWVkZWQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKCFpc1RyaXZpYWxDbGFzcyhjbHMpKSB7CiAgICAgICAgbmVlZGVkID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChpbnRlcmNlcHRvckNsYXNzZXNOZWVkZWRCeUNvbnN0YW50cy5jb250YWlucyhjbGFzc0VsZW1lbnQpKSB7CiAgICAgICAgbmVlZGVkID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChjbGFzc2VzTmVlZGVkRm9yUnRpLmNvbnRhaW5zKGNsYXNzRWxlbWVudCkpIHsKICAgICAgICBuZWVkZWQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvblBvaW50cy5jb250YWluc0tleShjbHMpKSB7CiAgICAgICAgbmVlZGVkID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoX25hdGl2ZURhdGEuaXNKc0ludGVyb3BDbGFzcyhjbGFzc0VsZW1lbnQpKSB7CiAgICAgICAgbmVlZGVkID0gdHJ1ZTsgLy8gVE9ETyhqYWNvYnIpOiB3ZSBkb24ndCBuZWVkIGFsbCBpbnRlcm9wIGNsYXNzZXMuCiAgICAgIH0gZWxzZSBpZiAoY2xzLmlzTmF0aXZlICYmCiAgICAgICAgICBfbmF0aXZlRGF0YS5oYXNOYXRpdmVUYWdzRm9yY2VkTm9uTGVhZihjbGFzc0VsZW1lbnQpKSB7CiAgICAgICAgbmVlZGVkID0gdHJ1ZTsKICAgICAgICBub25MZWFmQ2xhc3Nlcy5hZGQoY2xzKTsKICAgICAgfQoKICAgICAgaWYgKG5lZWRlZCB8fCBuZWVkZWRDbGFzc2VzLmNvbnRhaW5zKGNscykpIHsKICAgICAgICBuZWVkZWRDbGFzc2VzLmFkZChjbHMpOwogICAgICAgIG5lZWRlZENsYXNzZXMuYWRkKGNscy5zdXBlcmNsYXNzKTsKICAgICAgICBub25MZWFmQ2xhc3Nlcy5hZGQoY2xzLnN1cGVyY2xhc3MpOwogICAgICB9CiAgICB9CgogICAgLy8gQ29sbGVjdCBhbGwgdGhlIHRhZ3MgdGhhdCBtYXAgdG8gZWFjaCBuYXRpdmUgY2xhc3MuCgogICAgTWFwPENsYXNzLCBTZXQ8U3RyaW5nPj4gbGVhZlRhZ3MgPSBuZXcgTWFwPENsYXNzLCBTZXQ8U3RyaW5nPj4oKTsKICAgIE1hcDxDbGFzcywgU2V0PFN0cmluZz4+IG5vbmxlYWZUYWdzID0gbmV3IE1hcDxDbGFzcywgU2V0PFN0cmluZz4+KCk7CgogICAgZm9yIChDbGFzcyBjbHMgaW4gY2xhc3NlcykgewogICAgICBpZiAoIWNscy5pc05hdGl2ZSkgY29udGludWU7CiAgICAgIENsYXNzRW50aXR5IGVsZW1lbnQgPSBjbHMuZWxlbWVudDsKICAgICAgaWYgKF9uYXRpdmVEYXRhLmlzSnNJbnRlcm9wQ2xhc3MoZWxlbWVudCkpIGNvbnRpbnVlOwogICAgICBMaXN0PFN0cmluZz4gbmF0aXZlVGFncyA9IF9uYXRpdmVEYXRhLmdldE5hdGl2ZVRhZ3NPZkNsYXNzKGNscy5lbGVtZW50KTsKCiAgICAgIGlmIChub25MZWFmQ2xhc3Nlcy5jb250YWlucyhjbHMpIHx8IGV4dGVuc2lvblBvaW50cy5jb250YWluc0tleShjbHMpKSB7CiAgICAgICAgbm9ubGVhZlRhZ3MKICAgICAgICAgICAgLnB1dElmQWJzZW50KGNscywgKCkgPT4gbmV3IFNldDxTdHJpbmc+KCkpCiAgICAgICAgICAgIC5hZGRBbGwobmF0aXZlVGFncyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgQ2xhc3Mgc3VmZmljaW5nSW50ZXJjZXB0b3IgPSBjbHM7CiAgICAgICAgd2hpbGUgKCFuZWVkZWRDbGFzc2VzLmNvbnRhaW5zKHN1ZmZpY2luZ0ludGVyY2VwdG9yKSkgewogICAgICAgICAgc3VmZmljaW5nSW50ZXJjZXB0b3IgPSBzdWZmaWNpbmdJbnRlcmNlcHRvci5zdXBlcmNsYXNzOwogICAgICAgIH0KICAgICAgICBpZiAoc3VmZmljaW5nSW50ZXJjZXB0b3IgPT0gb2JqZWN0Q2xhc3MpIHsKICAgICAgICAgIHN1ZmZpY2luZ0ludGVyY2VwdG9yID0ganNJbnRlcmNlcHRvckNsYXNzOwogICAgICAgIH0KICAgICAgICBsZWFmVGFncwogICAgICAgICAgICAucHV0SWZBYnNlbnQoc3VmZmljaW5nSW50ZXJjZXB0b3IsICgpID0+IG5ldyBTZXQ8U3RyaW5nPigpKQogICAgICAgICAgICAuYWRkQWxsKG5hdGl2ZVRhZ3MpOwogICAgICB9CiAgICB9CgogICAgdm9pZCBmaWxsTmF0aXZlSW5mbyhDbGFzcyBjbHMpIHsKICAgICAgYXNzZXJ0KGNscy5uYXRpdmVMZWFmVGFncyA9PSBudWxsICYmCiAgICAgICAgICBjbHMubmF0aXZlTm9uTGVhZlRhZ3MgPT0gbnVsbCAmJgogICAgICAgICAgY2xzLm5hdGl2ZUV4dGVuc2lvbnMgPT0gbnVsbCk7CiAgICAgIGlmIChsZWFmVGFnc1tjbHNdICE9IG51bGwpIHsKICAgICAgICBjbHMubmF0aXZlTGVhZlRhZ3MgPSBsZWFmVGFnc1tjbHNdLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgICB9CiAgICAgIGlmIChub25sZWFmVGFnc1tjbHNdICE9IG51bGwpIHsKICAgICAgICBjbHMubmF0aXZlTm9uTGVhZlRhZ3MgPSBub25sZWFmVGFnc1tjbHNdLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgICB9CiAgICAgIGNscy5uYXRpdmVFeHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnRzW2Nsc107CiAgICB9CgogICAgLy8gQWRkIHByb3BlcnRpZXMgY29udGFpbmluZyB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGNvbnN0cnVjdCBtYXBzIHVzZWQKICAgIC8vIGJ5IGdldE5hdGl2ZUludGVyY2VwdG9yIGFuZCBjdXN0b20gZWxlbWVudHMuCiAgICBpZiAoX25hdGl2ZUNvZGVnZW5FbnF1ZXVlci5oYXNJbnN0YW50aWF0ZWROYXRpdmVDbGFzc2VzKSB7CiAgICAgIGZpbGxOYXRpdmVJbmZvKGpzSW50ZXJjZXB0b3JDbGFzcyk7CiAgICAgIGZvciAoQ2xhc3MgY2xzIGluIGNsYXNzZXMpIHsKICAgICAgICBpZiAoIWNscy5pc05hdGl2ZSB8fCBuZWVkZWRDbGFzc2VzLmNvbnRhaW5zKGNscykpIHsKICAgICAgICAgIGZpbGxOYXRpdmVJbmZvKGNscyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gVE9ETyhzcmEpOiBJc3N1ZSAjMTM3MzEtIHRoaXMgaXMgY29tbWVudGVkIG91dCBhcyBwYXJ0IG9mIGN1c3RvbQogICAgLy8gZWxlbWVudCBjb25zdHJ1Y3RvciB3b3JrLgogICAgLy8gKGZsb2l0c2NoOiB3YXMgcnVuIG9uIGV2ZXJ5IG5hdGl2ZSBjbGFzcy4pCiAgICAvL2Fzc2VydCghY2xhc3NFbGVtZW50Lmhhc0JhY2tlbmRNZW1iZXJzKTsKCiAgICByZXR1cm4gY2xhc3NlcwogICAgICAgIC53aGVyZSgoQ2xhc3MgY2xzKSA9PiBjbHMuaXNOYXRpdmUgJiYgIW5lZWRlZENsYXNzZXMuY29udGFpbnMoY2xzKSkKICAgICAgICAudG9TZXQoKTsKICB9CgogIC8vLyBDb21wdXRlcyB0aGUgbmF0aXZlIGNsYXNzZXMgdGhhdCBhcmUgZXh0ZW5kZWQgKHN1YmNsYXNzZWQpIGJ5IG5vbi1uYXRpdmUKICAvLy8gY2xhc3NlcyBhbmQgdGhlIHNldCBub24tbWF0aXZlIGNsYXNzZXMgdGhhdCBleHRlbmQgdGhlbS4gIChBIExpc3QgaXMgdXNlZAogIC8vLyBpbnN0ZWFkIG9mIGEgU2V0IGZvciBvdXQgc3RhYmlsaXR5KS4KICBNYXA8Q2xhc3MsIExpc3Q8Q2xhc3M+PiBjb21wdXRlRXh0ZW5zaW9uUG9pbnRzKExpc3Q8Q2xhc3M+IGNsYXNzZXMpIHsKICAgIENsYXNzIG5hdGl2ZVN1cGVyY2xhc3NPZihDbGFzcyBjbHMpIHsKICAgICAgaWYgKGNscyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgaWYgKGNscy5pc05hdGl2ZSkgcmV0dXJuIGNsczsKICAgICAgcmV0dXJuIG5hdGl2ZVN1cGVyY2xhc3NPZihjbHMuc3VwZXJjbGFzcyk7CiAgICB9CgogICAgQ2xhc3MgbmF0aXZlQW5jZXN0b3JPZihDbGFzcyBjbHMpIHsKICAgICAgcmV0dXJuIG5hdGl2ZVN1cGVyY2xhc3NPZihjbHMuc3VwZXJjbGFzcyk7CiAgICB9CgogICAgTWFwPENsYXNzLCBMaXN0PENsYXNzPj4gbWFwID0gbmV3IE1hcDxDbGFzcywgTGlzdDxDbGFzcz4+KCk7CgogICAgZm9yIChDbGFzcyBjbHMgaW4gY2xhc3NlcykgewogICAgICBpZiAoY2xzLmlzTmF0aXZlKSBjb250aW51ZTsKICAgICAgQ2xhc3MgbmF0aXZlQW5jZXN0b3IgPSBuYXRpdmVBbmNlc3Rvck9mKGNscyk7CiAgICAgIGlmIChuYXRpdmVBbmNlc3RvciAhPSBudWxsKSB7CiAgICAgICAgbWFwLnB1dElmQWJzZW50KG5hdGl2ZUFuY2VzdG9yLCAoKSA9PiA8Q2xhc3M+W10pLmFkZChjbHMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KCiAgYm9vbCBpc1RyaXZpYWxDbGFzcyhDbGFzcyBjbHMpIHsKICAgIGJvb2wgbmVlZHNBY2Nlc3NvcihGaWVsZCBmaWVsZCkgewogICAgICByZXR1cm4gZmllbGQubmVlZHNHZXR0ZXIgfHwKICAgICAgICAgIGZpZWxkLm5lZWRzVW5jaGVja2VkU2V0dGVyIHx8CiAgICAgICAgICBmaWVsZC5uZWVkc0NoZWNrZWRTZXR0ZXI7CiAgICB9CgogICAgcmV0dXJuIGNscy5tZXRob2RzLmlzRW1wdHkgJiYKICAgICAgICBjbHMuaXNDaGVja3MuaXNFbXB0eSAmJgogICAgICAgIGNscy5jYWxsU3R1YnMuaXNFbXB0eSAmJgogICAgICAgICFjbHMuc3VwZXJjbGFzcy5pc1NpbXBsZU1peGluQXBwbGljYXRpb24gJiYKICAgICAgICAhY2xzLmZpZWxkcy5hbnkobmVlZHNBY2Nlc3Nvcik7CiAgfQoKICB2b2lkIHBvdGVudGlhbGx5Q29udmVydERhcnRDbG9zdXJlc1RvSnMoTGlzdDxqc0FzdC5TdGF0ZW1lbnQ+IHN0YXRlbWVudHMsCiAgICAgIEZ1bmN0aW9uRW50aXR5IG1lbWJlciwgTGlzdDxqc0FzdC5QYXJhbWV0ZXI+IHN0dWJQYXJhbWV0ZXJzKSB7CiAgICBqc0FzdC5FeHByZXNzaW9uIGNsb3N1cmVDb252ZXJ0ZXI7CiAgICBfZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hQYXJhbWV0ZXIobWVtYmVyLAogICAgICAgIChEYXJ0VHlwZSB0eXBlLCBTdHJpbmcgbmFtZSwgXykgewogICAgICAvLyBJZiBbbmFtZV0gaXMgbm90IGluIFtzdHViUGFyYW1ldGVyc10sIHRoZW4gdGhlIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbAogICAgICAvLyBwYXJhbWV0ZXIgdGhhdCB3YXMgbm90IHByb3ZpZGVkIGZvciB0aGlzIHN0dWIuCiAgICAgIGZvciAoanNBc3QuUGFyYW1ldGVyIHN0dWJQYXJhbWV0ZXIgaW4gc3R1YlBhcmFtZXRlcnMpIHsKICAgICAgICBpZiAoc3R1YlBhcmFtZXRlci5uYW1lID09IG5hbWUpIHsKICAgICAgICAgIHR5cGUgPSB0eXBlLnVuYWxpYXNlZDsKICAgICAgICAgIGlmICh0eXBlLmlzRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICAgIGNsb3N1cmVDb252ZXJ0ZXIgPz89IF9lbWl0dGVyVGFzay5lbWl0dGVyCiAgICAgICAgICAgICAgICAuc3RhdGljRnVuY3Rpb25BY2Nlc3MoX2NvbW1vbkVsZW1lbnRzLmNsb3N1cmVDb252ZXJ0ZXIpOwoKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciB0eXBlIGlzIGEgZnVuY3Rpb24gdHlwZSBlaXRoZXIgZGlyZWN0bHkgb3IgdGhyb3VnaAogICAgICAgICAgICAvLyB0eXBlZGVmKHMpLgogICAgICAgICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0gdHlwZTsKICAgICAgICAgICAgaW50IGFyaXR5ID0gZnVuY3Rpb25UeXBlLnBhcmFtZXRlclR5cGVzLmxlbmd0aDsKICAgICAgICAgICAgc3RhdGVtZW50cy5hZGQoanMKICAgICAgICAgICAgICAgIC5zdGF0ZW1lbnQoJyMgPSAjKCMsICRhcml0eSknLCBbbmFtZSwgY2xvc3VyZUNvbnZlcnRlciwgbmFtZV0pKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIExpc3Q8anNBc3QuU3RhdGVtZW50PiBnZW5lcmF0ZVBhcmFtZXRlclN0dWJTdGF0ZW1lbnRzKAogICAgICBGdW5jdGlvbkVudGl0eSBtZW1iZXIsCiAgICAgIGJvb2wgaXNJbnRlcmNlcHRlZE1ldGhvZCwKICAgICAganNBc3QuTmFtZSBpbnZvY2F0aW9uTmFtZSwKICAgICAgTGlzdDxqc0FzdC5QYXJhbWV0ZXI+IHN0dWJQYXJhbWV0ZXJzLAogICAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGFyZ3VtZW50c0J1ZmZlciwKICAgICAgaW50IGluZGV4T2ZMYXN0T3B0aW9uYWxBcmd1bWVudEluUGFyYW1ldGVycykgewogICAgLy8gVGhlIHRhcmdldCBKUyBmdW5jdGlvbiBtYXkgY2hlY2sgYXJndW1lbnRzLmxlbmd0aCBzbyB3ZSBuZWVkIHRvCiAgICAvLyBtYWtlIHN1cmUgbm90IHRvIHBhc3MgYW55IHVuc3BlY2lmaWVkIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBpdC4KICAgIC8vIEZvciBleGFtcGxlLCBmb3IgdGhlIGZvbGxvd2luZyBEYXJ0IG1ldGhvZDoKICAgIC8vICAgZm9vKHt4LCB5LCB6fSk7CiAgICAvLyBUaGUgY2FsbDoKICAgIC8vICAgZm9vKHk6IDEpCiAgICAvLyBtdXN0IGJlIHR1cm5lZCBpbnRvIGEgSlMgY2FsbCB0bzoKICAgIC8vICAgZm9vKG51bGwsIHkpLgoKICAgIExpc3Q8anNBc3QuU3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gPGpzQXN0LlN0YXRlbWVudD5bXTsKICAgIHBvdGVudGlhbGx5Q29udmVydERhcnRDbG9zdXJlc1RvSnMoc3RhdGVtZW50cywgbWVtYmVyLCBzdHViUGFyYW1ldGVycyk7CgogICAgU3RyaW5nIHRhcmdldDsKICAgIGpzQXN0LkV4cHJlc3Npb24gcmVjZWl2ZXI7CiAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGFyZ3VtZW50czsKCiAgICBhc3NlcnQobmF0aXZlTWV0aG9kcy5jb250YWlucyhtZW1iZXIpLCBmYWlsZWRBdChtZW1iZXIpKTsKICAgIC8vIFdoZW4gY2FsbGluZyBhIEpTIG1ldGhvZCwgd2UgY2FsbCBpdCB3aXRoIHRoZSBuYXRpdmUgbmFtZSwgYW5kIG9ubHkgdGhlCiAgICAvLyBhcmd1bWVudHMgdXAgdW50aWwgdGhlIGxhc3Qgb25lIHByb3ZpZGVkLgogICAgdGFyZ2V0ID0gX25hdGl2ZURhdGEuZ2V0Rml4ZWRCYWNrZW5kTmFtZShtZW1iZXIpOwoKICAgIGlmIChpc0ludGVyY2VwdGVkTWV0aG9kKSB7CiAgICAgIHJlY2VpdmVyID0gYXJndW1lbnRzQnVmZmVyWzBdOwogICAgICBhcmd1bWVudHMgPSBhcmd1bWVudHNCdWZmZXIuc3VibGlzdCgKICAgICAgICAgIDEsIGluZGV4T2ZMYXN0T3B0aW9uYWxBcmd1bWVudEluUGFyYW1ldGVycyArIDEpOwogICAgfSBlbHNlIHsKICAgICAgLy8gTmF0aXZlIG1ldGhvZHMgdGhhdCBhcmUgbm90IGludGVyY2VwdGVkIG11c3QgYmUgc3RhdGljLgogICAgICBhc3NlcnQobWVtYmVyLmlzU3RhdGljLCBmYWlsZWRBdChtZW1iZXIpKTsKICAgICAgYXJndW1lbnRzID0gYXJndW1lbnRzQnVmZmVyLnN1Ymxpc3QoCiAgICAgICAgICAwLCBpbmRleE9mTGFzdE9wdGlvbmFsQXJndW1lbnRJblBhcmFtZXRlcnMgKyAxKTsKICAgICAgaWYgKF9uYXRpdmVEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKG1lbWJlcikpIHsKICAgICAgICAvLyBmaXhlZEJhY2tlbmRQYXRoIGlzIGFsbG93ZWQgdG8gaGF2ZSB0aGUgZm9ybSBmb28uYmFyLmJheiBmb3IKICAgICAgICAvLyBpbnRlcm9wLiBUaGlzIHRlbXBsYXRlIGlzIHVuY2FjaGVkIHRvIGF2b2lkIHBvc3NpYmx5IHJ1bm5pbmcgb3V0IG9mCiAgICAgICAgLy8gbWVtb3J5IHdoZW4gRGFydDJKcyBpcyBydW4gaW4gc2VydmVyIG1vZGUuIEluIHJlYWxpdHkgdGhlIHJpc2sgb2YKICAgICAgICAvLyBjYWNoaW5nIHRoZXNlIHRlbXBsYXRlcyBjYXVzaW5nIGFuIGlzc3VlICBpcyB2ZXJ5IGxvdyBhcyBlYWNoIGNsYXNzCiAgICAgICAgLy8gYW5kIGxpYnJhcnkgdGhhdCB1c2VzIHR5cGVkIEphdmFTY3JpcHQgaW50ZXJvcCB3aWxsIGNyZWF0ZSBvbmx5IDEKICAgICAgICAvLyB1bmlxdWUgdGVtcGxhdGUuCiAgICAgICAgcmVjZWl2ZXIgPSBqcwogICAgICAgICAgICAudW5jYWNoZWRFeHByZXNzaW9uVGVtcGxhdGUoCiAgICAgICAgICAgICAgICBfbmF0aXZlRGF0YS5nZXRGaXhlZEJhY2tlbmRNZXRob2RQYXRoKG1lbWJlcikpCiAgICAgICAgICAgIC5pbnN0YW50aWF0ZShbXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVjZWl2ZXIgPSBqcygndGhpcycpOwogICAgICB9CiAgICB9CiAgICBzdGF0ZW1lbnRzCiAgICAgICAgLmFkZChqcy5zdGF0ZW1lbnQoJ3JldHVybiAjLiMoIyknLCBbcmVjZWl2ZXIsIHRhcmdldCwgYXJndW1lbnRzXSkpOwoKICAgIHJldHVybiBzdGF0ZW1lbnRzOwogIH0KCiAgYm9vbCBpc1N1cGVydHlwZU9mTmF0aXZlQ2xhc3MoQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKF9pbnRlcmNlcHRvckRhdGEuaXNNaXhlZEludG9JbnRlcmNlcHRlZENsYXNzKGVsZW1lbnQpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHJldHVybiBzdWJ0eXBlc1tlbGVtZW50XSAhPSBudWxsOwogIH0KCiAgYm9vbCByZXF1aXJlc05hdGl2ZUlzQ2hlY2soQ2xhc3NFbnRpdHkgZWxlbWVudCkgewogICAgLy8gVE9ETyhzcmEpOiBSZW1vdmUgdGhpcyBmdW5jdGlvbi4gIEl0IGRldGVybWluZXMgaWYgYSBuYXRpdmUgdHlwZSBtYXkKICAgIC8vIHNhdGlzZnkgYSBjaGVjayBhZ2FpbnN0IFtlbGVtZW50XSwgaW4gd2hpY2ggY2FzZSBhbiBpbnRlcmNlcHRvciBtdXN0IGJlCiAgICAvLyB1c2VkLiAgV2Ugc2hvdWxkIGFsc28gdXNlIGFuIGludGVyY2VwdG9yIGlmIHRoZSBjaGVjayBjYW4ndCBiZSBzYXRpc2ZpZWQKICAgIC8vIGJ5IGEgbmF0aXZlIGNsYXNzIGluIGNhc2Ugd2UgZ2V0IGEgbmF0aXZlIGluc3RhbmNlIHRoYXQgdHJpZXMgdG8gc3Bvb2YKICAgIC8vIHRoZSB0eXBlIGluZm8uICBpLmUgdGhlIGNyaXRlcmlhIGZvciB3aGV0aGVyIG9yIG5vdCB0byB1c2UgYW4gaW50ZXJjZXB0b3IKICAgIC8vIGlzIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGNhbiBiZSBuYXRpdmUsIG5vdCB0aGUgdHlwZSBvZiB0aGUgdGVzdC4KICAgIENsYXNzRW50aXR5IGNscyA9IGVsZW1lbnQ7CiAgICBpZiAoX25hdGl2ZURhdGEuaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoY2xzKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gaXNTdXBlcnR5cGVPZk5hdGl2ZUNsYXNzKGVsZW1lbnQpOwogIH0KfQqBbwBOTjwBKwEZTD0kISAuKTwqATYVARYmIzYBNiEBMzEqATo3KgExQQERSgFGMSc5SAFKBkxNBk9GHQZRUE9QEQZQRkxPDgZRGQZPHwZPSSMbPDM3ASsBUVETJigBHiUBGzgbEAg/IhAIJhUcGQYBGwFQTBUBMTIBUAEkASsuS1AdGxtPUD8XKRdPFz8XNRcIOEshQhchCAEzICssCAYBOwFGSQEhIyk7TwFOFDchDypAQgozNQoRSCEIBgElKyspI0QIJkoIMwYBTzQ/KiM8HwoIBgFIITIvARNMEgQBT1ArSCokJDEGASgxBgFBASEiNCRDCAYQBAEjJiIoJAYBIiAhNCgEAUxFJzEqUTg+KiElNkkBUBsuPB5REwwKCAgEATkdICEsLjVHRzMZERMpFwE8TAETHyYBPk8xNgEfJSs7DUExKzszSE9NT00cFik/Hg8fCAYPTAEXBAE3QRMGASYEATRMT1BOUUgfPy4EAgEzcGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9uYXRpdmVfZW1pdHRlci5kYXJ0QHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvdHlwZV90ZXN0X3JlZ2lzdHJ5LmRhcnSJdi8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuanNfZW1pdHRlci50eXBlX3Rlc3RfcmVnaXN0cnk7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ydW50aW1lX3R5cGVzLmRhcnQnCiAgICBzaG93IFJ1bnRpbWVUeXBlc0NoZWNrcywgUnVudGltZVR5cGVzQ2hlY2tzQnVpbGRlcjsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXNfY29kZWdlbi5kYXJ0JwogICAgc2hvdyBSdW50aW1lVHlwZXNTdWJzdGl0dXRpb25zOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnOwoKY2xhc3MgVHlwZVRlc3RSZWdpc3RyeSB7CiAgZmluYWwgRWxlbWVudEVudmlyb25tZW50IF9lbGVtZW50RW52aXJvbm1lbnQ7CgogIC8vLyBBZnRlciBbY29tcHV0ZU5lZWRlZENsYXNzZXNdIHRoaXMgc2V0IG9ubHkgY29udGFpbnMgY2xhc3NlcyB0aGF0IGFyZSBvbmx5CiAgLy8vIHVzZWQgZm9yIFJUSS4KICBTZXQ8Q2xhc3NFbnRpdHk+IF9ydGlOZWVkZWRDbGFzc2VzOwoKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CgogIFJ1bnRpbWVUeXBlc0NoZWNrcyBfcnRpQ2hlY2tzOwoKICBUeXBlVGVzdFJlZ2lzdHJ5KHRoaXMuX29wdGlvbnMsIHRoaXMuX2VsZW1lbnRFbnZpcm9ubWVudCk7CgogIFJ1bnRpbWVUeXBlc0NoZWNrcyBnZXQgcnRpQ2hlY2tzIHsKICAgIGFzc2VydCgKICAgICAgICBfcnRpQ2hlY2tzICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAiUnVudGltZVR5cGVzQ2hlY2tzIGhhcyBub3QgYmVlbiBjb21wdXRlZCB5ZXQuIikpOwogICAgcmV0dXJuIF9ydGlDaGVja3M7CiAgfQoKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IHJ0aU5lZWRlZENsYXNzZXMgewogICAgYXNzZXJ0KAogICAgICAgIF9ydGlOZWVkZWRDbGFzc2VzICE9IG51bGwsCiAgICAgICAgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAicnRpTmVlZGVkQ2xhc3NlcyBoYXMgbm90IGJlZW4gY29tcHV0ZWQgeWV0LiIpKTsKICAgIHJldHVybiBfcnRpTmVlZGVkQ2xhc3NlczsKICB9CgogIHZvaWQgY29tcHV0ZVJ0aU5lZWRlZENsYXNzZXMoUnVudGltZVR5cGVzU3Vic3RpdHV0aW9ucyBydGlTdWJzdGl0dXRpb25zLAogICAgICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGxpdmVNZW1iZXJzKSB7CiAgICBfcnRpTmVlZGVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CgogICAgdm9pZCBhZGRDbGFzc1dpdGhTdXBlcmNsYXNzZXMoQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICAgIF9ydGlOZWVkZWRDbGFzc2VzLmFkZChjbHMpOwogICAgICBmb3IgKENsYXNzRW50aXR5IHN1cGVyY2xhc3MgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY2xzKTsKICAgICAgICAgIHN1cGVyY2xhc3MgIT0gbnVsbDsKICAgICAgICAgIHN1cGVyY2xhc3MgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3Moc3VwZXJjbGFzcykpIHsKICAgICAgICBfcnRpTmVlZGVkQ2xhc3Nlcy5hZGQoc3VwZXJjbGFzcyk7CiAgICAgIH0KICAgIH0KCiAgICB2b2lkIGFkZENsYXNzZXNXaXRoU3VwZXJjbGFzc2VzKEl0ZXJhYmxlPENsYXNzRW50aXR5PiBjbGFzc2VzKSB7CiAgICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xzIGluIGNsYXNzZXMpIHsKICAgICAgICBhZGRDbGFzc1dpdGhTdXBlcmNsYXNzZXMoY2xzKTsKICAgICAgfQogICAgfQoKICAgIC8vIEFkZCBjbGFzc2VzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgdHlwZSBhcmd1bWVudHMgb3Igc3Vic3RpdHV0aW9ucyBpbgogICAgLy8gYXJndW1lbnQgY2hlY2tzLgogICAgYWRkQ2xhc3Nlc1dpdGhTdXBlcmNsYXNzZXMocnRpQ2hlY2tzLnJlcXVpcmVkQ2xhc3Nlcyk7CiAgfQoKICB2b2lkIGNvbXB1dGVSZXF1aXJlZFR5cGVDaGVja3MoCiAgICAgIFJ1bnRpbWVUeXBlc0NoZWNrc0J1aWxkZXIgcnRpQ2hlY2tzQnVpbGRlciwgQ29kZWdlbldvcmxkIGNvZGVnZW5Xb3JsZCkgewogICAgX3J0aUNoZWNrcyA9IHJ0aUNoZWNrc0J1aWxkZXIuY29tcHV0ZVJlcXVpcmVkQ2hlY2tzKGNvZGVnZW5Xb3JsZCwgX29wdGlvbnMpOwogIH0KfQpMAE5OPAEvARkiJCo4MiQaMQEZMAFQFCYBIgEhAT0BJQwcKD8XBAEvDCMoPR4EAUssMAE1IkweSCsIBgFFKScIBgFNGDsEASJPUQQCATdwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL3R5cGVfdGVzdF9yZWdpc3RyeS5kYXJ0M3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2VsZW1lbnRzL2luZGV4ZWQuZGFydKFALy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBJbmRleGVkIGVudGl0eSBpbnRlcmZhY2VzIGZvciBtb2RlbGluZyBlbGVtZW50cyBkZXJpdmVkIGZyb20gS2VybmVsIElSLgoKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIF9JbmRleGVkIHsKICBpbnQgX2luZGV4Owp9CgphYnN0cmFjdCBjbGFzcyBJbmRleGVkTGlicmFyeSBleHRlbmRzIF9JbmRleGVkIGltcGxlbWVudHMgTGlicmFyeUVudGl0eSB7CiAgLy8vIExpYnJhcnkgaW5kZXggdXNlZCBmb3IgZmFzdCBsb29rdXAgaW4gW0tlcm5lbFRvRWxlbWVudE1hcEJhc2VdLgogIGludCBnZXQgbGlicmFyeUluZGV4ID0+IF9pbmRleDsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IDcgKiBfaW5kZXggKyAyOwp9CgphYnN0cmFjdCBjbGFzcyBJbmRleGVkQ2xhc3MgZXh0ZW5kcyBfSW5kZXhlZCBpbXBsZW1lbnRzIENsYXNzRW50aXR5IHsKICAvLy8gQ2xhc3MgaW5kZXggdXNlZCBmb3IgZmFzdCBsb29rdXAgaW4gW0tlcm5lbFRvRWxlbWVudE1hcEJhc2VdLgogIGludCBnZXQgY2xhc3NJbmRleCA9PiBfaW5kZXg7CiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiA3ICogX2luZGV4ICsgMTsKfQoKYWJzdHJhY3QgY2xhc3MgSW5kZXhlZE1lbWJlciBleHRlbmRzIF9JbmRleGVkIGltcGxlbWVudHMgTWVtYmVyRW50aXR5IHsKICAvLy8gTWVtYmVyIGluZGV4IHVzZWQgZm9yIGZhc3QgbG9va3VwIGluIFtLZXJuZWxUb0VsZW1lbnRNYXBCYXNlXS4KICBpbnQgZ2V0IG1lbWJlckluZGV4ID0+IF9pbmRleDsKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IDcgKiBfaW5kZXg7Cn0KCmFic3RyYWN0IGNsYXNzIEluZGV4ZWRGdW5jdGlvbiBleHRlbmRzIF9JbmRleGVkCiAgICBpbXBsZW1lbnRzIEluZGV4ZWRNZW1iZXIsIEZ1bmN0aW9uRW50aXR5IHt9CgphYnN0cmFjdCBjbGFzcyBJbmRleGVkQ29uc3RydWN0b3IKICAgIGltcGxlbWVudHMgSW5kZXhlZEZ1bmN0aW9uLCBDb25zdHJ1Y3RvckVudGl0eSB7fQoKYWJzdHJhY3QgY2xhc3MgSW5kZXhlZEZpZWxkIGltcGxlbWVudHMgSW5kZXhlZE1lbWJlciwgRmllbGRFbnRpdHkge30KCmFic3RyYWN0IGNsYXNzIEluZGV4ZWRUeXBlVmFyaWFibGUgZXh0ZW5kcyBfSW5kZXhlZAogICAgaW1wbGVtZW50cyBUeXBlVmFyaWFibGVFbnRpdHkgewogIC8vLyBUeXBlIHZhcmlhYmxlIGluZGV4IHVzZWQgZm9yIGZhc3QgbG9va3VwIGluIFtLZXJuZWxUb0VsZW1lbnRNYXBCYXNlXS4KICBpbnQgZ2V0IHR5cGVWYXJpYWJsZUluZGV4ID0+IF9pbmRleDsKfQoKYWJzdHJhY3QgY2xhc3MgSW5kZXhlZFR5cGVkZWYgZXh0ZW5kcyBfSW5kZXhlZCBpbXBsZW1lbnRzIFR5cGVkZWZFbnRpdHkgewogIC8vLyBUeXBlZGVmIGluZGV4IHVzZWQgZm9yIGZhc3QgbG9va3VwIGluIFtLZXJuZWxUb0VsZW1lbnRNYXBCYXNlXS4KICBpbnQgZ2V0IHR5cGVkZWZJbmRleCA9PiBfaW5kZXg7Cn0KCmFic3RyYWN0IGNsYXNzIEluZGV4ZWRMb2NhbCBleHRlbmRzIF9JbmRleGVkIGltcGxlbWVudHMgTG9jYWwgewogIGludCBnZXQgbG9jYWxJbmRleCA9PiBfaW5kZXg7Cn0KCi8vLyBCYXNlIGltcGxlbWVudGF0aW9uIGZvciBhbiBpbmRleCBiYXNlZCBtYXAgb2YgZW50aXRpZXMgb2YgdHlwZSBbRV0uCmFic3RyYWN0IGNsYXNzIEVudGl0eU1hcEJhc2U8RSBleHRlbmRzIF9JbmRleGVkPiB7CiAgYm9vbCBfY2xvc2VkID0gZmFsc2U7CgogIGludCBfc2l6ZSA9IDA7CiAgTGlzdDxFPiBfbGlzdCA9IDxFPltdOwoKICAvLy8gUmV0dXJucyB0aGUgW2luZGV4XXRoIGVudGl0eSBpbiB0aGUgbWFwLgogIEUgZ2V0RW50aXR5KGludCBpbmRleCkgPT4gX2xpc3RbaW5kZXhdOwoKICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbi1udWxsIGVudGl0aWVzIGluIHRoZSBtYXAuCiAgaW50IGdldCBzaXplID0+IF9zaXplOwoKICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIChudWxsIGFuZCBub24tbnVsbCkgZW50aXRpZXMgaW4gdGhlIG1hcC4KICBpbnQgZ2V0IGxlbmd0aCA9PiBfbGlzdC5sZW5ndGg7CgogIC8vLyBDbG9zZXMgdGhlIGVudGl0eSBtYXAsIHByb2hpYml0aW5nIGZ1cnRoZXIgcmVnaXN0cmF0aW9uLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgbm8gbmV3IGVudGl0aWVzIGFyZSBhZGRlZCB3aGlsZSBzZXJpYWxpemluZwogIC8vLyBtb2R1bGFyIGNvZGUgZ2VuZXJhdGlvbiBkYXRhLgogIHZvaWQgY2xvc2UoKSB7CiAgICBfY2xvc2VkID0gdHJ1ZTsKICB9Cn0KCi8vLyBJbmRleCBiYXNlZCBtYXAgb2YgZW50aXRpZXMgb2YgdHlwZSBbRV0uCmNsYXNzIEVudGl0eU1hcDxFIGV4dGVuZHMgX0luZGV4ZWQ+IGV4dGVuZHMgRW50aXR5TWFwQmFzZTxFPiB7CiAgLy8vIFJlZ2lzdGVycyBhIG5ldyBbZW50aXR5XS4KICAvLy8KICAvLy8gVGhlIGluZGV4IG9mIFtlbnRpdHldIGlzIHNldCB0byBtYXRjaCBpdHMgaW5kZXggaW4gdGhlIGVudGl0eSBsaXN0IGluIHRoaXMKICAvLy8gbWFwLgogIEUwIHJlZ2lzdGVyPEUwIGV4dGVuZHMgRT4oRTAgZW50aXR5KSB7CiAgICBhc3NlcnQoCiAgICAgICAgIV9jbG9zZWQsICJUcnlpbmcgdG8gcmVnaXN0ZXIgJGVudGl0eSBAICR7X2xpc3QubGVuZ3RofSB3aGVuIGNsb3NlZC4iKTsKICAgIGFzc2VydChlbnRpdHkgIT0gbnVsbCk7CiAgICBhc3NlcnQoZW50aXR5Ll9pbmRleCA9PSBudWxsKTsKICAgIGVudGl0eS5faW5kZXggPSBfbGlzdC5sZW5ndGg7CiAgICBfbGlzdC5hZGQoZW50aXR5KTsKICAgIF9zaXplKys7CiAgICByZXR1cm4gZW50aXR5OwogIH0KCiAgLy8vIFJlZ2lzdGVycyBhIG5ldyBbZW50aXR5XSBieSB0aGUgZ2l2ZW4gW2luZGV4XS4KICBFMCByZWdpc3RlckJ5SW5kZXg8RTAgZXh0ZW5kcyBFPihpbnQgaW5kZXgsIEUwIGVudGl0eSkgewogICAgYXNzZXJ0KGluZGV4ID49IF9saXN0Lmxlbmd0aCk7CiAgICBfbGlzdC5sZW5ndGggPSBpbmRleDsKICAgIHJldHVybiByZWdpc3RlcihlbnRpdHkpOwogIH0KCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBub24tbnVsbCBlbnRpdHkuCiAgdm9pZCBmb3JFYWNoPEUwIGV4dGVuZHMgRT4odm9pZCBmKEUwIGVudGl0eSkpIHsKICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBfbGlzdC5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgRSBlbnRpdHkgPSBfbGlzdFtpbmRleF07CiAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgewogICAgICAgIGYoZW50aXR5KTsKICAgICAgfQogICAgfQogIH0KfQoKLy8vIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgYW4gaW5kZXggYmFzZWQgbWFwIG9mIGVudGl0aWVzIG9mIHR5cGUgW0VdIHdpdGggYQovLy8gY29ycmVzcG9uZGluZyBkYXRhIG9iamVjdCBvZiB0eXBlIFtEXS4KYWJzdHJhY3QgY2xhc3MgRW50aXR5RGF0YU1hcEJhc2U8RSBleHRlbmRzIF9JbmRleGVkLCBEPgogICAgZXh0ZW5kcyBFbnRpdHlNYXBCYXNlPEU+IHsKICBMaXN0PEQ+IF9kYXRhID0gPEQ+W107CgogIC8vLyBSZXR1cm5zIHRoZSBkYXRhIG9iamVjdCBzdG9yZWQgZm9yIHRoZSBbaW5kZXhddGggZW50aXR5LgogIEQgZ2V0RGF0YShFIGVudGl0eSkgewogICAgaW50IGluZGV4ID0gZW50aXR5Ll9pbmRleDsKICAgIGlmIChpbmRleCA8IF9saXN0Lmxlbmd0aCAmJiBpbmRleCA+PSBfZGF0YS5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoCiAgICAgICAgICAnRGF0YSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBjcmVhdGVkIGZvciAke19saXN0W2luZGV4XX0uJyk7CiAgICB9CiAgICByZXR1cm4gX2RhdGFbaW5kZXhdOwogIH0KfQoKLy8vIEluZGV4IGJhc2VkIG1hcCBvZiBlbnRpdGllcyBvZiB0eXBlIFtFXSB3aXRoIGEgY29ycmVzcG9uZGluZyBkYXRhIG9iamVjdAovLy8gb2YgdHlwZSBbRF0uCmNsYXNzIEVudGl0eURhdGFNYXA8RSBleHRlbmRzIF9JbmRleGVkLCBEPiBleHRlbmRzIEVudGl0eURhdGFNYXBCYXNlPEUsIEQ+IHsKICAvLy8gTWFyayBlbnRpdHkgW2luZGV4XSBhcyBtaXNzaW5nCiAgdm9pZCBza2lwSW5kZXgoaW50IGluZGV4KSB7CiAgICBhc3NlcnQoaW5kZXggPT0gX2xpc3QubGVuZ3RoKTsKICAgIF9saXN0LmFkZChudWxsKTsKICAgIF9kYXRhLmFkZChudWxsKTsKICB9CgogIC8vLyBSZWdpc3RlcnMgYSBuZXcgW2VudGl0eV0gd2l0aCBhbiBhc3NvY2lhdGVkIFtkYXRhXSBvYmplY3QuCiAgLy8vCiAgLy8vIFRoZSBpbmRleCBvZiBbZW50aXR5XSBpcyBzZXQgdG8gbWF0Y2ggaXRzIGluZGV4IGluIHRoZSBlbnRpdHkgYW5kIGRhdGEKICAvLy8gbGlzdHMgaW4gdGhpcyBtYXAuCiAgRTAgcmVnaXN0ZXI8RTAgZXh0ZW5kcyBFLCBEMCBleHRlbmRzIEQ+KEUwIGVudGl0eSwgRDAgZGF0YSkgewogICAgYXNzZXJ0KAogICAgICAgICFfY2xvc2VkLCAiVHJ5aW5nIHRvIHJlZ2lzdGVyICRlbnRpdHkgQCAke19saXN0Lmxlbmd0aH0gd2hlbiBjbG9zZWQuIik7CiAgICBhc3NlcnQoZW50aXR5ICE9IG51bGwpOwogICAgYXNzZXJ0KGVudGl0eS5faW5kZXggPT0gbnVsbCk7CiAgICBhc3NlcnQoCiAgICAgICAgX2xpc3QubGVuZ3RoID09IF9kYXRhLmxlbmd0aCwKICAgICAgICAnRGF0YSBsaXN0IGxlbmd0aCAke19kYXRhLmxlbmd0aH0gaW5jb25zaXN0ZW50ICcKICAgICAgICAnd2l0aCBlbnRpdHkgbGlzdCBsZW5ndGggJHtfbGlzdC5sZW5ndGh9LicpOwogICAgZW50aXR5Ll9pbmRleCA9IF9saXN0Lmxlbmd0aDsKICAgIF9saXN0LmFkZChlbnRpdHkpOwogICAgX3NpemUrKzsKICAgIGFzc2VydChkYXRhICE9IG51bGwpOwogICAgX2RhdGEuYWRkKGRhdGEpOwogICAgcmV0dXJuIGVudGl0eTsKICB9CgogIC8vLyBSZWdpc3RlcnMgYSBuZXcgW2VudGl0eV0gd2l0aCBhbiBhc3NvY2lhdGVkIFtkYXRhXSBvYmplY3QgYnkgdGhlIGdpdmVuCiAgLy8vIFtpbmRleF0uCiAgRTAgcmVnaXN0ZXJCeUluZGV4PEUwIGV4dGVuZHMgRSwgRDAgZXh0ZW5kcyBEPigKICAgICAgaW50IGluZGV4LCBFMCBlbnRpdHksIEQwIGRhdGEpIHsKICAgIGFzc2VydChpbmRleCA+PSBfbGlzdC5sZW5ndGgpOwogICAgX2xpc3QubGVuZ3RoID0gX2RhdGEubGVuZ3RoID0gaW5kZXg7CiAgICByZXR1cm4gcmVnaXN0ZXIoZW50aXR5LCBkYXRhKTsKICB9CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggbm9uLW51bGwgZW50aXR5IHdpdGggaXRzIGNvcnJlc3BvbmRpbmcgZGF0YSBvYmplY3QuCiAgdm9pZCBmb3JFYWNoPEUwIGV4dGVuZHMgRSwgRDAgZXh0ZW5kcyBEPih2b2lkIGYoRTAgZW50aXR5LCBEMCBkYXRhKSkgewogICAgaWYgKF9saXN0Lmxlbmd0aCAhPSBfZGF0YS5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ0RhdGEgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY3JlYXRlZC4nKTsKICAgIH0KICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBfbGlzdC5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgRSBlbnRpdHkgPSBfbGlzdFtpbmRleF07CiAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgewogICAgICAgIGYoZW50aXR5LCBfZGF0YVtpbmRleF0pOwogICAgICB9CiAgICB9CiAgfQp9CgovLy8gQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgYW4gaW5kZXggYmFzZWQgb2YgZW50aXRpZXMgb2YgdHlwZSBbRV0gd2l0aCBhCi8vLyBjb3JyZXNwb25kaW5nIGRhdGEgb2JqZWN0IG9mIHR5cGUgW0RdIGFuZCBhbiBlbnZpcm9ubWVudCBvZiB0eXBlIFtWXS4KYWJzdHJhY3QgY2xhc3MgRW50aXR5RGF0YUVudk1hcEJhc2U8RSBleHRlbmRzIF9JbmRleGVkLCBELCBWPgogICAgZXh0ZW5kcyBFbnRpdHlEYXRhTWFwQmFzZTxFLCBEPiB7CiAgTGlzdDxWPiBfZW52ID0gPFY+W107CgogIC8vLyBSZXR1cm5zIHRoZSBlbnZpcm9ubWVudCBvYmplY3Qgc3RvcmVkIGZvciB0aGUgW2luZGV4XXRoIGVudGl0eS4KICBWIGdldEVudihFIGVudGl0eSkgewogICAgaW50IGluZGV4ID0gZW50aXR5Ll9pbmRleDsKICAgIGlmIChpbmRleCA8IF9saXN0Lmxlbmd0aCAmJiBpbmRleCA+PSBfZW52Lmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICdFbnYgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY3JlYXRlZCBmb3IgJHtfbGlzdFtpbmRleF19LicpOwogICAgfQogICAgcmV0dXJuIF9lbnZbaW5kZXhdOwogIH0KfQoKLy8vIEluZGV4IGJhc2VkIG9mIGVudGl0aWVzIG9mIHR5cGUgW0VdIHdpdGggYSBjb3JyZXNwb25kaW5nIGRhdGEgb2JqZWN0IG9mCi8vLyB0eXBlIFtEXSBhbmQgYW4gZW52aXJvbm1lbnQgb2YgdHlwZSBbVl0uCmNsYXNzIEVudGl0eURhdGFFbnZNYXA8RSBleHRlbmRzIF9JbmRleGVkLCBELCBWPgogICAgZXh0ZW5kcyBFbnRpdHlEYXRhRW52TWFwQmFzZTxFLCBELCBWPiB7CiAgLy8vIFJlZ2lzdGVycyBhIG5ldyBbZW50aXR5XSB3aXRoIGFuIGFzc29jaWF0ZWQgW2RhdGFdIG9iamVjdCBhbmQgZW52aXJvbm1lbnQKICAvLy8gW2Vudl0uCiAgLy8vCiAgLy8vIFRoZSBpbmRleCBvZiBbZW50aXR5XSBpcyBzZXQgdG8gbWF0Y2ggaXRzIGluZGV4IGluIHRoZSBlbnRpdHksIGRhdGEgYW5kCiAgLy8vIGVudmlyb25tZW50IGxpc3RzIGluIHRoaXMgbWFwLgogIEUwIHJlZ2lzdGVyPEUwIGV4dGVuZHMgRSwgRDAgZXh0ZW5kcyBELCBWMCBleHRlbmRzIFY+KAogICAgICBFMCBlbnRpdHksIEQwIGRhdGEsIFYwIGVudikgewogICAgYXNzZXJ0KAogICAgICAgICFfY2xvc2VkLCAiVHJ5aW5nIHRvIHJlZ2lzdGVyICRlbnRpdHkgQCAke19saXN0Lmxlbmd0aH0gd2hlbiBjbG9zZWQuIik7CiAgICBhc3NlcnQoZW50aXR5ICE9IG51bGwpOwogICAgYXNzZXJ0KGVudGl0eS5faW5kZXggPT0gbnVsbCk7CiAgICBhc3NlcnQoCiAgICAgICAgX2xpc3QubGVuZ3RoID09IF9kYXRhLmxlbmd0aCwKICAgICAgICAnRGF0YSBsaXN0IGxlbmd0aCAke19kYXRhLmxlbmd0aH0gaW5jb25zaXN0ZW50ICcKICAgICAgICAnd2l0aCBlbnRpdHkgbGlzdCBsZW5ndGggJHtfbGlzdC5sZW5ndGh9LicpOwogICAgYXNzZXJ0KAogICAgICAgIF9saXN0Lmxlbmd0aCA9PSBfZW52Lmxlbmd0aCwKICAgICAgICAnRW52IGxpc3QgbGVuZ3RoICR7X2Vudi5sZW5ndGh9IGluY29uc2lzdGVudCAnCiAgICAgICAgJ3dpdGggZW50aXR5IGxpc3QgbGVuZ3RoICR7X2xpc3QubGVuZ3RofS4nKTsKICAgIGVudGl0eS5faW5kZXggPSBfbGlzdC5sZW5ndGg7CiAgICBfbGlzdC5hZGQoZW50aXR5KTsKICAgIF9zaXplKys7CiAgICBhc3NlcnQoZGF0YSAhPSBudWxsKTsKICAgIF9kYXRhLmFkZChkYXRhKTsKICAgIGFzc2VydChlbnYgIT0gbnVsbCk7CiAgICBfZW52LmFkZChlbnYpOwogICAgcmV0dXJuIGVudGl0eTsKICB9CgogIC8vLyBSZWdpc3RlcnMgYSBuZXcgW2VudGl0eV0gd2l0aCBhbiBhc3NvY2lhdGVkIFtkYXRhXSBvYmplY3QgYW5kIGVudmlyb25tZW50CiAgLy8vIFtlbnZdIGJ5IHRoZSBnaXZlbiBbaW5kZXhdLgogIEUwIHJlZ2lzdGVyQnlJbmRleDxFMCBleHRlbmRzIEUsIEQwIGV4dGVuZHMgRCwgVjAgZXh0ZW5kcyBWPigKICAgICAgaW50IGluZGV4LCBFMCBlbnRpdHksIEQwIGRhdGEsIFYwIGVudikgewogICAgYXNzZXJ0KGluZGV4ID49IF9saXN0Lmxlbmd0aCk7CiAgICBfbGlzdC5sZW5ndGggPSBfZGF0YS5sZW5ndGggPSBfZW52Lmxlbmd0aCA9IGluZGV4OwogICAgcmV0dXJuIHJlZ2lzdGVyKGVudGl0eSwgZGF0YSwgZW52KTsKICB9CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggbm9uLW51bGwgZW50aXR5IHdpdGggaXRzIGNvcnJlc3BvbmRpbmcgZGF0YSBvYmplY3QgYW5kCiAgLy8vIGVudmlyb25tZW50LgogIHZvaWQgZm9yRWFjaDxFMCBleHRlbmRzIEUsIEQwIGV4dGVuZHMgRCwgVjAgZXh0ZW5kcyBWPigKICAgICAgdm9pZCBmKEUwIGVudGl0eSwgRDAgZGF0YSwgVjAgZW52KSkgewogICAgaWYgKF9saXN0Lmxlbmd0aCAhPSBfZGF0YS5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ0RhdGEgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY3JlYXRlZC4nKTsKICAgIH0KICAgIGlmIChfbGlzdC5sZW5ndGggIT0gX2Vudi5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ0VudiBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBjcmVhdGVkLicpOwogICAgfQogICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IF9saXN0Lmxlbmd0aDsgaW5kZXgrKykgewogICAgICBFIGVudGl0eSA9IF9saXN0W2luZGV4XTsKICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7CiAgICAgICAgZihlbnRpdHksIF9kYXRhW2luZGV4XSwgX2VudltpbmRleF0pOwogICAgICB9CiAgICB9CiAgfQp9CoEKAE5OPAFMASQBGg4CAUpGIgwmAgFGRCAMJgIBSEUhDCICATAwASI1AUUBNCRMJwIBSkYiAgFAIAIBSDMYAREZAS8qAToZAUIiAT8GTiQRFAQCAS0/IAZRCykMUBwjIhcNEwQBNTsjGh0EASoyOR8cEwgGBAIBTSs4HxkBPxgfORxLBhkEAgFNEU0lHiMVFQQBQQZNGUAMUBwjDCY5NSIXDRoVEwQBTQ8yJyMpIwQBTUkoSAY5HxwhCAYEAgFKSj4mGAFGFx84HEoGGAQCAUwtMSxQDQZOJTkkDFAcIwwmOTUMJTc1IhcNGhUZExMEAVAiQC8jNygEAVATOiwoSAYnRwY5HxwuCAYEAgEqcGFja2FnZTpjb21waWxlci9zcmMvZWxlbWVudHMvaW5kZXhlZC5kYXJ0L3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2lyL2NvbnN0YW50cy5kYXJ0ljQvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9jb25zdGFudF9ldmFsdWF0b3IuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9kYXJ0MmpzLmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi9rZXJuZWwvZGFydDJqc190YXJnZXQuZGFydCc7Cgp0eXBlZGVmIFJlcG9ydEVycm9yRnVuY3Rpb24gPSB2b2lkIEZ1bmN0aW9uKAogICAgaXIuTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSwgTGlzdDxpci5Mb2NhdGVkTWVzc2FnZT4gY29udGV4dCk7CgpjbGFzcyBEYXJ0MmpzQ29uc3RhbnRFdmFsdWF0b3IgZXh0ZW5kcyBpci5Db25zdGFudEV2YWx1YXRvciB7CiAgZmluYWwgYm9vbCBfc3VwcG9ydFJlZXZhbHVhdGlvbkZvclRlc3Rpbmc7CgogIGJvb2wgcmVxdWlyZXNDb25zdGFudDsKCiAgRGFydDJqc0NvbnN0YW50RXZhbHVhdG9yKAogICAgICBpci5UeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBSZXBvcnRFcnJvckZ1bmN0aW9uIHJlcG9ydEVycm9yLAogICAgICB7TWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudDogY29uc3Qge30sCiAgICAgIGJvb2wgc3VwcG9ydFJlZXZhbHVhdGlvbkZvclRlc3Rpbmc6IGZhbHNlfSkKICAgICAgOiBfc3VwcG9ydFJlZXZhbHVhdGlvbkZvclRlc3RpbmcgPSBzdXBwb3J0UmVldmFsdWF0aW9uRm9yVGVzdGluZywKICAgICAgICBzdXBlcigKICAgICAgICAgICAgY29uc3QgRGFydDJqc0NvbnN0YW50c0JhY2tlbmQoc3VwcG9ydHNVbmV2YWx1YXRlZENvbnN0YW50czogZmFsc2UpLAogICAgICAgICAgICBlbnZpcm9ubWVudCwKICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LAogICAgICAgICAgICBuZXcgRXJyb3JSZXBvcnRlcihyZXBvcnRFcnJvcikpOwoKICBAb3ZlcnJpZGUKICBFcnJvclJlcG9ydGVyIGdldCBlcnJvclJlcG9ydGVyID0+IHN1cGVyLmVycm9yUmVwb3J0ZXI7CgogIEBvdmVycmlkZQogIGlyLkNvbnN0YW50IGV2YWx1YXRlKGlyLkV4cHJlc3Npb24gbm9kZSwge2Jvb2wgcmVxdWlyZUNvbnN0YW50OiB0cnVlfSkgewogICAgZXJyb3JSZXBvcnRlci5yZXF1aXJlc0NvbnN0YW50ID0gcmVxdWlyZUNvbnN0YW50OwogICAgaWYgKG5vZGUgaXMgaXIuQ29uc3RhbnRFeHByZXNzaW9uKSB7CiAgICAgIGlyLkNvbnN0YW50IGNvbnN0YW50ID0gbm9kZS5jb25zdGFudDsKICAgICAgaWYgKGNvbnN0YW50IGlzIGlyLlVuZXZhbHVhdGVkQ29uc3RhbnQpIHsKICAgICAgICBpci5Db25zdGFudCByZXN1bHQgPSBzdXBlci5ldmFsdWF0ZShjb25zdGFudC5leHByZXNzaW9uKTsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgIHJlc3VsdCBpcyBpci5VbmV2YWx1YXRlZENvbnN0YW50IHx8CiAgICAgICAgICAgICAgICAhcmVzdWx0LmFjY2VwdChjb25zdCBVbmV2YWx1YXRlZENvbnN0YW50RmluZGVyKCkpLAogICAgICAgICAgICAiSW52YWxpZCBjb25zdGFudCByZXN1bHQgJHJlc3VsdCBmcm9tICR7Y29uc3RhbnQuZXhwcmVzc2lvbn0uIik7CiAgICAgICAgaWYgKCFfc3VwcG9ydFJlZXZhbHVhdGlvbkZvclRlc3RpbmcpIHsKICAgICAgICAgIG5vZGUuY29uc3RhbnQgPSByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0YW50OwogICAgfQogICAgaWYgKHJlcXVpcmVDb25zdGFudCkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBIYW5kbGUgcmVwb3J0aW5nIG9mIGNvbXBpbGUtdGltZSBjb25zdGFudAogICAgICAvLyBldmFsdWF0aW9uIGVycm9ycy4KICAgICAgcmV0dXJuIHN1cGVyLmV2YWx1YXRlKG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gc3VwZXIuZXZhbHVhdGUobm9kZSk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogIH0KfQoKY2xhc3MgRXJyb3JSZXBvcnRlciBpbXBsZW1lbnRzIGlyLkVycm9yUmVwb3J0ZXIgewogIGZpbmFsIFJlcG9ydEVycm9yRnVuY3Rpb24gX3JlcG9ydEVycm9yOwogIGJvb2wgcmVxdWlyZXNDb25zdGFudDsKCiAgRXJyb3JSZXBvcnRlcih0aGlzLl9yZXBvcnRFcnJvcik7CgogIEBvdmVycmlkZQogIHZvaWQgcmVwb3J0SW52YWxpZEV4cHJlc3Npb24oaXIuSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgewogICAgLy8gSWdub3JlLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZXBvcnQoaXIuTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSwgTGlzdDxpci5Mb2NhdGVkTWVzc2FnZT4gY29udGV4dCkgewogICAgaWYgKHJlcXVpcmVzQ29uc3RhbnQpIHsKICAgICAgX3JlcG9ydEVycm9yKG1lc3NhZ2UsIGNvbnRleHQpOwogICAgfQogIH0KfQoKLy8vIFtpci5Db25zdGFudF0gdmlzaXRvciB0aGF0IHJldHVybnMgYHRydWVgIGlmIHRoZSB2aXNpdG9yIGNvbnN0YW50IGNvbnRhaW5zCi8vLyBhbiBbaXIuVW5ldmFsdWF0ZWRDb25zdGFudF0uCmNsYXNzIFVuZXZhbHVhdGVkQ29uc3RhbnRGaW5kZXIgZXh0ZW5kcyBpci5Db25zdGFudFZpc2l0b3I8Ym9vbD4gewogIGNvbnN0IFVuZXZhbHVhdGVkQ29uc3RhbnRGaW5kZXIoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBkZWZhdWx0Q29uc3RhbnQoaXIuQ29uc3RhbnQgbm9kZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KGlyLlVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoaXIuUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSB7CiAgICByZXR1cm4gbm9kZS50ZWFyT2ZmQ29uc3RhbnQuYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEluc3RhbmNlQ29uc3RhbnQoaXIuSW5zdGFuY2VDb25zdGFudCBub2RlKSB7CiAgICBmb3IgKGlyLkNvbnN0YW50IHZhbHVlIGluIG5vZGUuZmllbGRWYWx1ZXMudmFsdWVzKSB7CiAgICAgIGlmICh2YWx1ZS5hY2NlcHQodGhpcykpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFNldENvbnN0YW50KGlyLlNldENvbnN0YW50IG5vZGUpIHsKICAgIGZvciAoaXIuQ29uc3RhbnQgdmFsdWUgaW4gbm9kZS5lbnRyaWVzKSB7CiAgICAgIGlmICh2YWx1ZS5hY2NlcHQodGhpcykpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExpc3RDb25zdGFudChpci5MaXN0Q29uc3RhbnQgbm9kZSkgewogICAgZm9yIChpci5Db25zdGFudCB2YWx1ZSBpbiBub2RlLmVudHJpZXMpIHsKICAgICAgaWYgKHZhbHVlLmFjY2VwdCh0aGlzKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TWFwQ29uc3RhbnQoaXIuTWFwQ29uc3RhbnQgbm9kZSkgewogICAgZm9yIChpci5Db25zdGFudE1hcEVudHJ5IGVudHJ5IGluIG5vZGUuZW50cmllcykgewogICAgICBpZiAoZW50cnkua2V5LmFjY2VwdCh0aGlzKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChlbnRyeS52YWx1ZS5hY2NlcHQodGhpcykpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKLy8vIENsYXNzIHRvIHJlcHJlc2VudCBhIHJlZmVyZW5jZSB0byBhIGNvbnN0YW50IGluIGFsbG9jYXRpb24gbm9kZXMuCi8vLwovLy8gVGhpcyBjbGFzcyBpcyBuZWVkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCBzZXJpYWxpemF0aW9uIG9mIHJlZmVyZW5jZXMgdG8KLy8vIGNvbnN0YW50IG5vZGVzLiBTaW5jZSB0aGUgY29uc3RhbnQgbm9kZXMgYXJlIG5vdCBbaXIuVHJlZU5vZGVdcyB3ZSBjYW4gb25seQovLy8gc2VyaWFsaXplIHRoZSBjb25zdGFudHMgYXMgdmFsdWVzIHdoaWNoIHdvdWxkIGJ5cGFzcyBieSB0aGUgY2Fub25pY2FsaXphdGlvbgovLy8gcGVyZm9ybWVkIGJ5IHRoZSBDRkUuIFRoaXMgY2xhc3MgZXh0ZW5kcyBvbmx5IGFzIGEgdHJpY2sgdG8gZWFzaWx5IHBhc3MKLy8vIGl0IHRocm91Z2ggc2VyaWFsaXphdGlvbi4KLy8vCi8vLyBCeSBhZGRpbmcgYSByZWZlcmVuY2UgdG8gdGhlIGNvbnN0YW50IGV4cHJlc3Npb24gaW4gd2hpY2ggdGhlIGNvbnN0YW50Ci8vLyBvY2N1cnJlZCwgd2UgY2FuIHNlcmlhbGl6ZSByZWZlcmVuY2VzIHRvIGNvbnN0YW50cyBpbiB0d28gc3RlcHM6IGEgcmVmZXJlbmNlCi8vLyB0byB0aGUgY29uc3RhbnQgZXhwcmVzc2lvbiBmb2xsb3dlZCBieSBhbiBpbmRleCBvZiB0aGUgcmVmZXJyZWQgY29uc3RhbnQKLy8vIGluIHRoZSB0cmF2ZXJzYWwgb3JkZXIgb2YgdGhlIGNvbnN0YW50IGhlbGQgYnkgdGhlIGNvbnN0YW50IGV4cHJlc3Npb24uCi8vLwovLy8gVGhpcyBpcyB1c2VkIGZvciBsaXN0LCBtYXAsIGFuZCBzZXQgbGl0ZXJhbHMuCmNsYXNzIENvbnN0YW50UmVmZXJlbmNlIGV4dGVuZHMgaXIuVHJlZU5vZGUgewogIGZpbmFsIGlyLkNvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uOwogIGZpbmFsIGlyLkNvbnN0YW50IGNvbnN0YW50OwoKICBDb25zdGFudFJlZmVyZW5jZSh0aGlzLmV4cHJlc3Npb24sIHRoaXMuY29uc3RhbnQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oaXIuVmlzaXRvciB2KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ29uc3RhbnRSZWZlcmVuY2UudmlzaXRDaGlsZHJlbiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KGlyLlRyZWVWaXNpdG9yIHYpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDb25zdGFudFJlZmVyZW5jZS5hY2NlcHQiKTsKICB9CgogIEBvdmVycmlkZQogIHRyYW5zZm9ybUNoaWxkcmVuKGlyLlRyYW5zZm9ybWVyIHYpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDb25zdGFudFJlZmVyZW5jZS50cmFuc2Zvcm1DaGlsZHJlbiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiAxMyAqIGNvbnN0YW50Lmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIG90aGVyIGlzIENvbnN0YW50UmVmZXJlbmNlICYmIGNvbnN0YW50ID09IG90aGVyLmNvbnN0YW50OwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0NvbnN0YW50UmVmZXJlbmNlKGNvbnN0YW50PSRjb25zdGFudCknOwp9CoDBAE5OPAEoNUxAASgBLUEBPi0BGQEcSzIySA9QGR0tAQw6AQxLNiksMEIQMENNLyIKFwgXBhtIHCMNDCUUFQgGBAIBMioZASQBDDwPBAEMTBwmBgQCAU8hQyUBDDMBDEYBDFEuBAEMOTkgFQgGEgQBDC8uIBUIBhIEAQwxLiAVCAYSBAEMLzYkFQgmFQgGEgQCAUYETFBRTB4ES1FNTAQyLioeATUBDCVDBAEMHTwEAQwoRwQBDC4BDCMtRQQBDEACASZwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9jb25zdGFudHMuZGFydDZzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pci9zdGF0aWNfdHlwZV9iYXNlLmRhcnSaRy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKCi8vLyBTcGVjaWFsIGJvdHRvbSB0eXBlIHVzZWQgdG8gc2lnbmFsIHRoYXQgYW4gZXhwcmVzc2lvbiBvciBzdGF0ZW1lbnQgZG9lcwovLy8gbm90IGNvbXBsZXRlIG5vcm1hbGx5LiBUaGlzIGlzIHRoZSBjYXNlIGZvciBpbnN0YW5jZSBvZiB0aHJvdyBleHByZXNzaW9ucwovLy8gYW5kIHJldHVybiBzdGF0ZW1lbnRzLgpjbGFzcyBEb2VzTm90Q29tcGxldGVUeXBlIGV4dGVuZHMgaXIuQm90dG9tVHlwZSB7CiAgY29uc3QgRG9lc05vdENvbXBsZXRlVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRG9lc05vdENvbXBsZXRlVHlwZSgpJzsKfQoKLy8vIFNwZWNpYWwgaW50ZXJmYWNlIHR5cGUgdXNlZCB0byBzaWduYWwgdGhhdCB0aGUgc3RhdGljIHR5cGUgb2YgYW4gZXhwcmVzc2lvbgovLy8gaGFzIHByZWNpc2lvbiBvZiBhIHRoaXMtZXhwcmVzc2lvbi4KY2xhc3MgVGhpc0ludGVyZmFjZVR5cGUgZXh0ZW5kcyBpci5JbnRlcmZhY2VUeXBlIHsKICBUaGlzSW50ZXJmYWNlVHlwZShpci5DbGFzcyBjbGFzc05vZGUsIFtMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzXSkKICAgICAgOiBzdXBlcihjbGFzc05vZGUsIHR5cGVBcmd1bWVudHMpOwoKICBmYWN0b3J5IFRoaXNJbnRlcmZhY2VUeXBlLmZyb20oaXIuSW50ZXJmYWNlVHlwZSB0eXBlKSA9PiB0eXBlICE9IG51bGwKICAgICAgPyBuZXcgVGhpc0ludGVyZmFjZVR5cGUodHlwZS5jbGFzc05vZGUsIHR5cGUudHlwZUFyZ3VtZW50cykKICAgICAgOiBudWxsOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAndGhpczoke3N1cGVyLnRvU3RyaW5nKCl9JzsKfQoKLy8vIFNwZWNpYWwgaW50ZXJmYWNlIHR5cGUgdXNlZCB0byBzaWduYWwgdGhhdCB0aGUgc3RhdGljIHR5cGUgb2YgYW4gZXhwcmVzc2lvbgovLy8gaXMgZXhhY3QsIGkuZS4gdGhlIHJ1bnRpbWUgdHlwZSBpcyBub3QgYSBzdWJ0eXBlIG9yIHN1YmNsYXNzIG9mIHRoZSB0eXBlLgpjbGFzcyBFeGFjdEludGVyZmFjZVR5cGUgZXh0ZW5kcyBpci5JbnRlcmZhY2VUeXBlIHsKICBFeGFjdEludGVyZmFjZVR5cGUoaXIuQ2xhc3MgY2xhc3NOb2RlLCBbTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50c10pCiAgICAgIDogc3VwZXIoY2xhc3NOb2RlLCB0eXBlQXJndW1lbnRzKTsKCiAgZmFjdG9yeSBFeGFjdEludGVyZmFjZVR5cGUuZnJvbShpci5JbnRlcmZhY2VUeXBlIHR5cGUpID0+IHR5cGUgIT0gbnVsbAogICAgICA/IG5ldyBFeGFjdEludGVyZmFjZVR5cGUodHlwZS5jbGFzc05vZGUsIHR5cGUudHlwZUFyZ3VtZW50cykKICAgICAgOiBudWxsOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnZXhhY3Q6JHtzdXBlci50b1N0cmluZygpfSc7Cn0KCi8vLyBCYXNlIGNsYXNzIGZvciBjb21wdXRpbmcgc3RhdGljIHR5cGVzLgovLy8KLy8vIFRoaXMgY2xhc3MgdXNlcyB0aGUgdmlzaXRvciBwYXR0ZXJuIHRvIGNvbXB1dGUgdGhlIHN0YXRpYyB0eXBlIHRoYXQgYXJlCi8vLyBkaXJlY3RseSBkZWZpbmVkIGJ5IHRoZSBleHByZXNzaW9uIGtpbmQuCi8vLwovLy8gU3ViY2xhc3NlcyB3aWxsIGNvbXB1dGUgdGhlIHN0YXRpYyB0eXBlIG9yIHVzZSBhIGNhY2hlIHRvIGxvb2sgdXAgdGhlIHN0YXRpYwovLy8gdHlwZSBvZiBleHByZXNzaW9uIHdob3NlIHN0YXRpYyB0eXBlIGlzIG5vdCBkaXJlY3RseSBkZWZpbmVkIGJ5IHRoZQovLy8gZXhwcmVzc2lvbiBraW5kLiBGb3IgaW5zdGFuY2UgbWV0aG9kIGludm9jYXRpb25zIHdob3NlIHN0YXRpYyB0eXBlIGRlcGVuZAovLy8gb24gdGhlIHN0YXRpYyB0eXBlcyBvZiB0aGUgcmVjZWl2ZXIgYW5kIHR5cGUgYXJndW1lbnRzIGFuZCB0aGUgc2lnbmF0dXJlCi8vLyBvZiB0aGUgdGFyZ2V0ZWQgcHJvY2VkdXJlLgphYnN0cmFjdCBjbGFzcyBTdGF0aWNUeXBlQmFzZSBleHRlbmRzIGlyLlZpc2l0b3I8aXIuRGFydFR5cGU+IHsKICBmaW5hbCBpci5UeXBlRW52aXJvbm1lbnQgX3R5cGVFbnZpcm9ubWVudDsKCiAgU3RhdGljVHlwZUJhc2UodGhpcy5fdHlwZUVudmlyb25tZW50KTsKCiAgZmFpbChTdHJpbmcgbWVzc2FnZSkgPT4gbWVzc2FnZTsKCiAgaXIuVHlwZUVudmlyb25tZW50IGdldCB0eXBlRW52aXJvbm1lbnQgPT4gX3R5cGVFbnZpcm9ubWVudDsKCiAgVGhpc0ludGVyZmFjZVR5cGUgZ2V0IHRoaXNUeXBlOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSBkZWZhdWx0Tm9kZShpci5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBudWxsOwogIH0KCiAgaXIuRGFydFR5cGUgdmlzaXROb2RlKGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGU/LmFjY2VwdCh0aGlzKTsKICB9CgogIE51bGwgdmlzaXROb2RlcyhMaXN0PGlyLk5vZGU+IG5vZGVzKSB7CiAgICBmb3IgKGlyLk5vZGUgbm9kZSBpbiBub2RlcykgewogICAgICB2aXNpdE5vZGUobm9kZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSBkZWZhdWx0RXhwcmVzc2lvbihpci5FeHByZXNzaW9uIG5vZGUpIHsKICAgIHRocm93IGZhaWwoJ1VuaGFuZGxlZCBub2RlICRub2RlICgke25vZGUucnVudGltZVR5cGV9KScpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRBc0V4cHJlc3Npb24oaXIuQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBub2RlLnR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdEF3YWl0RXhwcmVzc2lvbihpci5Bd2FpdEV4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIHR5cGVFbnZpcm9ubWVudC51bmZ1dHVyZVR5cGUodmlzaXROb2RlKG5vZGUub3BlcmFuZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRCb29sTGl0ZXJhbChpci5Cb29sTGl0ZXJhbCBub2RlKSA9PiB0eXBlRW52aXJvbm1lbnQuYm9vbFR5cGU7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0Q2hlY2tMaWJyYXJ5SXNMb2FkZWQoaXIuQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgbm9kZSkgPT4KICAgICAgdHlwZUVudmlyb25tZW50Lm9iamVjdFR5cGU7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0U3RyaW5nTGl0ZXJhbChpci5TdHJpbmdMaXRlcmFsIG5vZGUpID0+CiAgICAgIHR5cGVFbnZpcm9ubWVudC5zdHJpbmdUeXBlOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oaXIuU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICByZXR1cm4gdHlwZUVudmlyb25tZW50LnN0cmluZ1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdE51bGxMaXRlcmFsKGlyLk51bGxMaXRlcmFsIG5vZGUpID0+IHR5cGVFbnZpcm9ubWVudC5udWxsVHlwZTsKCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRJbnRMaXRlcmFsKGlyLkludExpdGVyYWwgbm9kZSkgPT4gdHlwZUVudmlyb25tZW50LmludFR5cGU7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0RG91YmxlTGl0ZXJhbChpci5Eb3VibGVMaXRlcmFsIG5vZGUpID0+CiAgICAgIHR5cGVFbnZpcm9ubWVudC5kb3VibGVUeXBlOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN5bWJvbExpdGVyYWwoaXIuU3ltYm9sTGl0ZXJhbCBub2RlKSA9PgogICAgICB0eXBlRW52aXJvbm1lbnQuc3ltYm9sVHlwZTsKCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRMaXN0TGl0ZXJhbChpci5MaXN0TGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gdHlwZUVudmlyb25tZW50LmxpdGVyYWxMaXN0VHlwZShub2RlLnR5cGVBcmd1bWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFNldExpdGVyYWwoaXIuU2V0TGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gdHlwZUVudmlyb25tZW50LmxpdGVyYWxTZXRUeXBlKG5vZGUudHlwZUFyZ3VtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0TWFwTGl0ZXJhbChpci5NYXBMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiB0eXBlRW52aXJvbm1lbnQubGl0ZXJhbE1hcFR5cGUobm9kZS5rZXlUeXBlLCBub2RlLnZhbHVlVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFZhcmlhYmxlU2V0KGlyLlZhcmlhYmxlU2V0IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFByb3BlcnR5U2V0KGlyLlByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdERpcmVjdFByb3BlcnR5U2V0KGlyLkRpcmVjdFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUaGlzSW50ZXJmYWNlVHlwZSB2aXNpdFRoaXNFeHByZXNzaW9uKGlyLlRoaXNFeHByZXNzaW9uIG5vZGUpID0+IHRoaXNUeXBlOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN0YXRpY0dldChpci5TdGF0aWNHZXQgbm9kZSkgPT4gbm9kZS50YXJnZXQuZ2V0dGVyVHlwZTsKCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRTdGF0aWNTZXQoaXIuU3RhdGljU2V0IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN1cGVyUHJvcGVydHlTZXQoaXIuU3VwZXJQcm9wZXJ0eVNldCBub2RlKSB7CiAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRUaHJvdyhpci5UaHJvdyBub2RlKSA9PiBjb25zdCBEb2VzTm90Q29tcGxldGVUeXBlKCk7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0UmV0aHJvdyhpci5SZXRocm93IG5vZGUpID0+IGNvbnN0IERvZXNOb3RDb21wbGV0ZVR5cGUoKTsKCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihpci5Mb2dpY2FsRXhwcmVzc2lvbiBub2RlKSA9PgogICAgICB0eXBlRW52aXJvbm1lbnQuYm9vbFR5cGU7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0Tm90KGlyLk5vdCBub2RlKSB7CiAgICByZXR1cm4gdHlwZUVudmlyb25tZW50LmJvb2xUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oaXIuQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBub2RlLnN0YXRpY1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdElzRXhwcmVzc2lvbihpci5Jc0V4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIHR5cGVFbnZpcm9ubWVudC5ib29sVHlwZTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0VHlwZUxpdGVyYWwoaXIuVHlwZUxpdGVyYWwgbm9kZSkgPT4gdHlwZUVudmlyb25tZW50LnR5cGVUeXBlOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihpci5GdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIG5vZGUuZnVuY3Rpb24uZnVuY3Rpb25UeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRMZXQoaXIuTGV0IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0QmxvY2tFeHByZXNzaW9uKGlyLkJsb2NrRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihpci5JbnZhbGlkRXhwcmVzc2lvbiBub2RlKSA9PgogICAgICBjb25zdCBEb2VzTm90Q29tcGxldGVUeXBlKCk7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0TG9hZExpYnJhcnkoaXIuTG9hZExpYnJhcnkgbm9kZSkgewogICAgcmV0dXJuIHR5cGVFbnZpcm9ubWVudC5mdXR1cmVUeXBlKGNvbnN0IGlyLkR5bmFtaWNUeXBlKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oaXIuQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEluY2x1ZGUgaW50ZXJmYWNlIGV4YWN0bmVzcyB3aGVyZSBhcHBsaWNhYmxlLgogICAgcmV0dXJuIG5vZGUuZ2V0U3RhdGljVHlwZSh0eXBlRW52aXJvbm1lbnQpOwogIH0KfQqA6wBOTjwBKDQvMTUBTE4bMh8BDDACAVAoM0spAUhCDgEMMwIBUE40TCkBSUMOAQw0AgErBEwtBFFITk0fQC0BKQEjAT4BIgEMKhEEASgfBAEpIhcGBAEMNj4EAQw4FgQBDD5CBAEMUQEMSSIBDDsiAQxGJwQBDFEBDE4BDDsiAQw7IgEMNj8EAQw0PgQBDDRJBAEMNiIEAQw2IgQBDEIiBAEMTQEMSwEMMiIEAQxAIgQBDEgBDEwBDEMgAQwmJQQBDEocBAEMOCUEAQxRAQxEJwQBDCYhBAEMPiIEAQxDIwEMNj8EAQxESjAEAgEtcGFja2FnZTpjb21waWxlci9zcmMvaXIvc3RhdGljX3R5cGVfYmFzZS5kYXJ0M3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzL3Jld3JpdGVfYXN5bmMuZGFydMABd6YvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSByZXdyaXRlX2FzeW5jOwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwppbXBvcnQgJ2RhcnQ6bWF0aCcgc2hvdyBtYXg7CgppbXBvcnQgJ3BhY2thZ2U6anNfcnVudGltZS9zaGFyZWQvYXN5bmNfYXdhaXRfZXJyb3JfY29kZXMuZGFydCcgYXMgZXJyb3JfY29kZXM7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCcgc2hvdyBTb3VyY2VJbmZvcm1hdGlvbjsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCcgc2hvdyBQYWlyOwppbXBvcnQgJ2pzLmRhcnQnIGFzIGpzOwoKLy8vIFJld3JpdGVzIGEgW2pzLkZ1bl0gd2l0aCBhc3luYy9zeW5jKi9hc3luYyogZnVuY3Rpb25zIGFuZCBhd2FpdCBhbmQgeWllbGQKLy8vICh3aXRoIGRhcnQtbGlrZSBzZW1hbnRpY3MpIHRvIGFuIGVxdWl2YWxlbnQgZnVuY3Rpb24gd2l0aG91dCB0aGVzZS4KLy8vIGF3YWl0LWZvciBpcyBub3QgaGFuZGxlZCBhbmQgbXVzdCBiZSByZXdyaXR0ZW4gYmVmb3JlLiAoQ3VycmVudGx5IGhhbmRsZWQKLy8vIGluIHNzYS9idWlsZGVyLmRhcnQpLgovLy8KLy8vIFdoZW4gZ2VuZXJhdGluZyB0aGUgaW5wdXQgdG8gdGhpcywgc3BlY2lhbCBjYXJlIG11c3QgYmUgdGFrZW4gdGhhdAovLy8gcGFyYW1ldGVycyB0byBzeW5jKiBmdW5jdGlvbnMgdGhhdCBhcmUgbXV0YXRlZCBpbiB0aGUgYm9keSBtdXN0IGJlIGJveGVkLgovLy8gKEN1cnJlbnRseSBoYW5kbGVkIGluIGNsb3N1cmUuZGFydCkuCi8vLwovLy8gTG9vayBhdCBbcmV3cml0ZUZ1bmN0aW9uXSwgW3Zpc2l0RGFydFlpZWxkXSBhbmQgW3Zpc2l0QXdhaXRdIGZvciBtb3JlCi8vLyBleHBsYW5hdGlvbi4KYWJzdHJhY3QgY2xhc3MgQXN5bmNSZXdyaXRlckJhc2UgZXh0ZW5kcyBqcy5Ob2RlVmlzaXRvciB7CiAgLy8gTG9jYWwgdmFyaWFibGVzIGFyZSBob2lzdGVkIHRvIHRoZSB0b3Agb2YgdGhlIGZ1bmN0aW9uLCBzbyB0aGV5IGFyZQogIC8vIGNvbGxlY3RlZCBoZXJlLgogIExpc3Q8anMuVmFyaWFibGVEZWNsYXJhdGlvbj4gbG9jYWxWYXJpYWJsZXMgPSA8anMuVmFyaWFibGVEZWNsYXJhdGlvbj5bXTsKCiAgTWFwPGpzLk5vZGUsIGludD4gY29udGludWVMYWJlbHMgPSBuZXcgTWFwPGpzLk5vZGUsIGludD4oKTsKICBNYXA8anMuTm9kZSwgaW50PiBicmVha0xhYmVscyA9IG5ldyBNYXA8anMuTm9kZSwgaW50PigpOwoKICAvLy8gVGhlIGxhYmVsIG9mIGEgZmluYWxseSBwYXJ0LgogIE1hcDxqcy5CbG9jaywgaW50PiBmaW5hbGx5TGFiZWxzID0gbmV3IE1hcDxqcy5CbG9jaywgaW50PigpOwoKICAvLy8gVGhlIGxhYmVsIG9mIHRoZSBjYXRjaCBoYW5kbGVyIG9mIGEgW2pzLlRyeV0gb3IgYSBbanMuRnVuXSBvciBbanMuQ2F0Y2hdLgogIC8vLwogIC8vLyBUaGVzZSBtYXJrIHRoZSBwb2ludHMgYW4gZXJyb3IgY2FuIGJlIGNvbnN1bWVkLgogIC8vLwogIC8vLyAtIFRoZSBoYW5kbGVyIG9mIGEgW2pzLkZ1bl0gaXMgdGhlIG91dGVybW9zdCBhbmQgd2lsbCByZXRocm93IHRoZSBlcnJvci4KICAvLy8gLSBUaGUgaGFuZGxlciBvZiBhIFtqcy5UcnldIHdpbGwgcnVuIHRoZSBjYXRjaCBoYW5kbGVyLgogIC8vLyAtIFRoZSBoYW5kbGVyIG9mIGEgW2pzLkNhdGNoXSBpcyBhIHN5bnRoZXRpYyBoYW5kbGVyIHRoYXQgZW5zdXJlcyB0aGUKICAvLy8gICByaWdodCBmaW5hbGx5IGJsb2NrcyBhcmUgcnVuIGlmIGFuIGVycm9yIGlzIHRocm93biBpbnNpZGUgYQogIC8vLyAgIGNhdGNoLWhhbmRsZXIuCiAgTWFwPGpzLk5vZGUsIGludD4gaGFuZGxlckxhYmVscyA9IG5ldyBNYXA8anMuTm9kZSwgaW50PigpOwoKICBpbnQgZXhpdExhYmVsOwogIGludCByZXRocm93TGFiZWw7CgogIC8vLyBBIHN0YWNrIG9mIGFsbCAoc3Vycm91bmRpbmcpIGp1bXAgdGFyZ2V0cy4KICAvLy8KICAvLy8gSnVtcCB0YXJnZXRzIGFyZToKICAvLy8KICAvLy8gKiBUaGUgZnVuY3Rpb24sIHNpZ25hbGxpbmcgYSByZXR1cm4gb3IgdW5jYXVnaHQgdGhyb3cuCiAgLy8vICogTG9vcHMuCiAgLy8vICogTGFiZWxlZFN0YXRlbWVudHMgKGFsc28gdXNlZCBmb3IgJ2NvbnRpbnVlJyB3aGVuIGF0dGFjaGVkIHRvIGxvb3BzKS4KICAvLy8gKiBUcnkgc3RhdGVtZW50cywgZm9yIGNhdGNoIGFuZCBmaW5hbGx5IGhhbmRsZXJzLgogIC8vLyAqIENhdGNoIGhhbmRsZXJzLCB3aGVuIGluc2lkZSBhIGNhdGNoLXBhcnQgb2YgYSB0cnksIHRoZSBjYXRjaC1oYW5kbGVyIGlzCiAgLy8vICAgdXNlZCB0byBhc3NvY2lhdGUgd2l0aCBhIHN5bnRoZXRpYyBoYW5kbGVyIHRoYXQgd2lsbCBlbnN1cmUgdGhlIHJpZ2h0CiAgLy8vICAgZmluYWxseSBibG9ja3MgYXJlIHZpc2l0ZWQuCiAgLy8vCiAgLy8vIFdoZW4ganVtcGluZyB0byBhIHRhcmdldCBpdCBpcyBuZWNlc3NhcnkgdG8gdmlzaXQgYWxsIGZpbmFsbGllcyB0aGF0CiAgLy8vIGFyZSBvbiB0aGUgd2F5IHRvIHRhcmdldCAoaS5lLiBtb3JlIG5lc3RlZCB0aGFuIHRoZSBqdW1wIHRhcmdldCkuCiAgTGlzdDxqcy5Ob2RlPiBqdW1wVGFyZ2V0cyA9IDxqcy5Ob2RlPltdOwoKICBMaXN0PGludD4gY29udGludWVTdGFjayA9IDxpbnQ+W107CiAgTGlzdDxpbnQ+IGJyZWFrU3RhY2sgPSA8aW50PltdOwogIExpc3Q8aW50PiByZXR1cm5TdGFjayA9IDxpbnQ+W107CgogIExpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IHZhcmlhYmxlUmVuYW1pbmdzID0gPFBhaXI8U3RyaW5nLCBTdHJpbmc+PltdOwoKICBQcmVUcmFuc2xhdGlvbkFuYWx5c2lzIGFuYWx5c2lzOwoKICBmaW5hbCBGdW5jdGlvbiBzYWZlVmFyaWFibGVOYW1lOwoKICAvLyBBbGwgdGhlIDx4Pk5hbWUgdmFyaWFibGVzIGFyZSBuYW1lcyBvZiBKYXZhc2NyaXB0IHZhcmlhYmxlcyB1c2VkIGluIHRoZQogIC8vIHRyYW5zZm9ybWVkIGNvZGUuCgogIC8vLyBDb250YWlucyB0aGUgcmVzdWx0IG9mIGFuIGF3YWl0ZWQgZXhwcmVzc2lvbiwgb3IgYSBjb25kaXRpb25hbCBvcgogIC8vLyBsYXp5IGJvb2xlYW4gb3BlcmF0b3IuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyByb3VnaGx5IHRyYW5zbGF0ZWQgbGlrZToKICAvLy8gW1tjb25kID8gYSA6IGJdXQogIC8vLwogIC8vLyBCZWNvbWVzOgogIC8vLwogIC8vLyB3aGlsZSB0cnVlIHsgLy8gb3V0ZXIgd2hpbGUgbG9vcAogIC8vLyAgIHN3aXRjaCAoZ290bykgeyAvLyBTaW11bGF0ZXMgZ290bwogIC8vLyAgICAgLi4uCiAgLy8vICAgICAgIGdvdG8gPSBbW2NvbmRdXSA/IHRoZW5MYWJlbCA6IGVsc2VMYWJlbAogIC8vLyAgICAgICBicmVhazsKICAvLy8gICAgIGNhc2UgdGhlbkxhYmVsOgogIC8vLyAgICAgICByZXN1bHQgPSBbW2FdXTsKICAvLy8gICAgICAgZ290byA9IGpvaW5MYWJlbDsKICAvLy8gICAgIGNhc2UgZWxzZUxhYmVsOgogIC8vLyAgICAgICByZXN1bHQgPSBbW2JdXTsKICAvLy8gICAgIGNhc2Ugam9pbkxhYmVsOgogIC8vLyAgICAgICAvLyBOb3cgdGhlIHJlc3VsdCBvZiBjb21wdXRpbmcgdGhlIGNvbmRpdGlvbiBpcyBpbiByZXN1bHQuCiAgLy8vICAgICAuLi4uCiAgLy8vICAgfQogIC8vLyB9CiAgLy8vCiAgLy8vIEl0IGlzIGEgcGFyYW1ldGVyIHRvIHRoZSBbYm9keV0gZnVuY3Rpb24sIHNvIHRoYXQgW2F3YWl0U3RhdGVtZW50XSBjYW4KICAvLy8gY2FsbCBbYm9keV0gd2l0aCB0aGUgcmVzdWx0IG9mIGFuIGF3YWl0ZWQgRnV0dXJlLgogIGpzLlZhcmlhYmxlVXNlIGdldCByZXN1bHQgPT4gbmV3IGpzLlZhcmlhYmxlVXNlKHJlc3VsdE5hbWUpOwogIFN0cmluZyByZXN1bHROYW1lOwoKICAvLy8gQSBwYXJhbWV0ZXIgdG8gdGhlIFtib2R5TmFtZV0gZnVuY3Rpb24uIEluZGljYXRpbmcgaWYgd2UgYXJlIGluIHN1Y2Nlc3MKICAvLy8gb3IgZXJyb3IgY2FzZS4KICBTdHJpbmcgZXJyb3JDb2RlTmFtZTsKCiAgLy8vIFRoZSBpbm5lciBmdW5jdGlvbiB0aGF0IGlzIHNjaGVkdWxlZCB0byBkbyBlYWNoIGF3YWl0L3lpZWxkLAogIC8vLyBhbmQgY2FsbGVkIHRvIGRvIGEgbmV3IGl0ZXJhdGlvbiBmb3Igc3luYyouCiAganMuTmFtZSBib2R5TmFtZTsKCiAgLy8vIFVzZWQgdG8gc2ltdWxhdGUgYSBnb3RvLgogIC8vLwogIC8vLyBUbyAiZ290byIgYSBsYWJlbCwgdGhlIGxhYmVsIGlzIGFzc2lnbmVkIHRvIHRoaXMgdmFyaWFibGUsIGFuZCBicmVhayBvdXQKICAvLy8gb2YgdGhlIHN3aXRjaCB0byB0YWtlIGFub3RoZXIgaXRlcmF0aW9uIGluIHRoZSB3aGlsZSBsb29wLiBTZWUgW2FkZEdvdG9dCiAganMuVmFyaWFibGVVc2UgZ2V0IGdvdG8gPT4gbmV3IGpzLlZhcmlhYmxlVXNlKGdvdG9OYW1lKTsKICBTdHJpbmcgZ290b05hbWU7CgogIC8vLyBWYXJpYWJsZSBjb250YWluaW5nIHRoZSBsYWJlbCBvZiB0aGUgY3VycmVudCBlcnJvciBoYW5kbGVyLgogIGpzLlZhcmlhYmxlVXNlIGdldCBoYW5kbGVyID0+IG5ldyBqcy5WYXJpYWJsZVVzZShoYW5kbGVyTmFtZSk7CiAgU3RyaW5nIGhhbmRsZXJOYW1lOwoKICAvLy8gU2V0IHRvIGB0cnVlYCBpZiBhbnkgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgbGFiZWxzIGlzIGEgaGFuZGxlci4gQXQgdGhlCiAgLy8vIGVuZCBvZiByZXdyaXRpbmcgdGhpcyBpcyB1c2VkIHRvIHNlZSBpZiBhIHNob3J0ZXIgZm9ybSBvZiBlcnJvciBoYW5kbGluZwogIC8vLyBjYW4gYmUgdXNlZC4gVGhlIHNob3J0ZXIgZm9ybSBjb3VsZCBiZSBhIGNoYW5nZSBpbiB0aGUgbWV0aG9kIGJvaWxlcnBsYXRlLAogIC8vLyBpbiB0aGUgc3RhdGUgbWFjaGluZSB3cmFwcGVyLCBvciBub3QgaW1wbGVtZW50ZWQuIFthZGRFcnJvckV4aXRdIGNhbiB0ZXN0CiAgLy8vIHRoaXMgdG8gZWxpZGUgdGhlIGVycm9yIGV4aXQgaGFuZGxlciB3aGVuIHRoZXJlIGFyZSBubyBvdGhlciBoYW5kbGVycywgb3IKICAvLy8gc2V0IGl0IHRvIGB0cnVlYCBpZiB0aGVyZSBpcyBubyBzaG9ydGVyIGZvcm0uCiAgYm9vbCBoYXNIYW5kbGVyTGFiZWxzID0gZmFsc2U7CgogIC8vLyBBIHN0YWNrIG9mIGxhYmVscyBvZiBmaW5hbGx5IGJsb2NrcyB0byB2aXNpdCwgYW5kIHRoZSBsYWJlbCB0byBnbyB0byBhZnRlcgogIC8vLyB0aGUgbGFzdC4KICBqcy5WYXJpYWJsZVVzZSBnZXQgbmV4dCA9PiBuZXcganMuVmFyaWFibGVVc2UobmV4dE5hbWUpOwogIFN0cmluZyBuZXh0TmFtZTsKCiAgLy8vIFRoZSBjdXJyZW50IHJldHVybmVkIHZhbHVlIChhIGZpbmFsbHkgYmxvY2sgbWF5IG92ZXJ3cml0ZSBpdCkuCiAganMuVmFyaWFibGVVc2UgZ2V0IHJldHVyblZhbHVlID0+IG5ldyBqcy5WYXJpYWJsZVVzZShyZXR1cm5WYWx1ZU5hbWUpOwogIFN0cmluZyByZXR1cm5WYWx1ZU5hbWU7CgogIC8vLyBTdG9yZXMgdGhlIGN1cnJlbnQgZXJyb3Igd2hlbiB3ZSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgaGFuZGxpbmcgYW4gZXJyb3IuCiAganMuVmFyaWFibGVVc2UgZ2V0IGN1cnJlbnRFcnJvciA9PiBuZXcganMuVmFyaWFibGVVc2UoY3VycmVudEVycm9yTmFtZSk7CiAgU3RyaW5nIGN1cnJlbnRFcnJvck5hbWU7CgogIC8vLyBUaGUgbGFiZWwgb2YgdGhlIG91dGVyIGxvb3AuCiAgLy8vCiAgLy8vIFVzZWQgaWYgdGhlcmUgYXJlIHVudHJhbnNmb3JtZWQgbG9vcHMgY29udGFpbmluZyBicmVhayBvciBjb250aW51ZXMgdG8KICAvLy8gdGFyZ2V0cyBvdXRzaWRlIHRoZSBsb29wLgogIFN0cmluZyBvdXRlckxhYmVsTmFtZTsKCiAgLy8vIElmIGphdmFzY3JpcHQgYHRoaXNgIGlzIHVzZWQsIGl0IGlzIGFjY2Vzc2VkIHZpYSB0aGlzIHZhcmlhYmxlLCBpbiB0aGUKICAvLy8gW2JvZHlOYW1lXSBmdW5jdGlvbi4KICBqcy5WYXJpYWJsZVVzZSBnZXQgc2VsZiA9PiBuZXcganMuVmFyaWFibGVVc2Uoc2VsZk5hbWUpOwogIFN0cmluZyBzZWxmTmFtZTsKCiAgLy8vIFRoZSByZXdyaXR0ZW4gY29kZSBjYW4gdGFrZSB0eXBlIGFyZ3VtZW50cy4gVGhlc2UgYXJlIGFkZGVkIGlmIG5lZWRlZC4KICBMaXN0PFN0cmluZz4gdHlwZUFyZ3VtZW50TmFtZXMgPSA8U3RyaW5nPltdOwoKICBmaW5hbCBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXI7CiAgLy8gRm9yIGVycm9yIHJlcG9ydGluZyBvbmx5LgogIFNwYW5uYWJsZSBnZXQgc3Bhbm5hYmxlIHsKICAgIHJldHVybiAoX3NwYW5uYWJsZSA9PSBudWxsKSA/IE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSA6IF9zcGFubmFibGU7CiAgfQoKICBTcGFubmFibGUgX3NwYW5uYWJsZTsKCiAgaW50IF9jdXJyZW50TGFiZWwgPSAwOwoKICAvLyBUaGUgaGlnaGVzdCB0ZW1wb3JhcnkgdmFyaWFibGUgaW5kZXggY3VycmVudGx5IGluIHVzZS4KICBpbnQgY3VycmVudFRlbXBWYXJJbmRleCA9IDA7CiAgLy8gVGhlIGhpZ2hlc3QgdGVtcG9yYXJ5IHZhcmlhYmxlIGluZGV4IGV2ZXIgaW4gdXNlIGluIHRoaXMgZnVuY3Rpb24uCiAgaW50IHRlbXBWYXJIaWdoV2F0ZXJNYXJrID0gMDsKICBNYXA8aW50LCBqcy5FeHByZXNzaW9uPiB0ZW1wVmFyTmFtZXMgPSBuZXcgTWFwPGludCwganMuRXhwcmVzc2lvbj4oKTsKCiAgYm9vbCBnZXQgaXNBc3luYyA9PiBmYWxzZTsKICBib29sIGdldCBpc1N5bmNTdGFyID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzQXN5bmNTdGFyID0+IGZhbHNlOwoKICBBc3luY1Jld3JpdGVyQmFzZSgKICAgICAgdGhpcy5yZXBvcnRlciwgdGhpcy5fc3Bhbm5hYmxlLCB0aGlzLnNhZmVWYXJpYWJsZU5hbWUsIHRoaXMuYm9keU5hbWUpOwoKICAvLy8gSW5pdGlhbGl6ZSBuYW1lcyB1c2VkIGJ5IHRoZSBzdWJDbGFzcy4KICB2b2lkIGluaXRpYWxpemVOYW1lcygpOwoKICAvLy8gTWFpbiBlbnRyeSBwb2ludC4KICAvLy8gUmV3cml0ZXMgYSBzeW5jKi9hc3luYy9hc3luYyogZnVuY3Rpb24gdG8gYW4gZXF1aXZhbGVudCBub3JtYWwgZnVuY3Rpb24uCiAgLy8vCiAgLy8vIFtzcGFubmFibGVdIGNhbiBiZSBwYXNzZWQgdG8gaGF2ZSBhIGxvY2F0aW9uIGZvciBlcnJvciBtZXNzYWdlcy4KICBqcy5GdW4gcmV3cml0ZShqcy5GdW4gbm9kZSwgU291cmNlSW5mb3JtYXRpb24gYm9keVNvdXJjZUluZm9ybWF0aW9uLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBleGl0U291cmNlSW5mb3JtYXRpb24sCiAgICAgIFtTcGFubmFibGUgc3Bhbm5hYmxlXSkgewogICAgX3NwYW5uYWJsZSA9IHNwYW5uYWJsZTsKCiAgICBhbmFseXNpcyA9IG5ldyBQcmVUcmFuc2xhdGlvbkFuYWx5c2lzKHVuc3VwcG9ydGVkKTsKICAgIGFuYWx5c2lzLmFuYWx5emUobm9kZSk7CgogICAgLy8gVG8gYXZvaWQgbmFtZSBjb2xsaXNpb25zIHdpdGggZXhpc3RpbmcgbmFtZXMsIHRoZSBmcmVzaCBuYW1lcyBhcmUKICAgIC8vIGdlbmVyYXRlZCBhZnRlciB0aGUgYW5hbHlzaXMuCiAgICByZXN1bHROYW1lID0gZnJlc2hOYW1lKCJyZXN1bHQiKTsKICAgIGVycm9yQ29kZU5hbWUgPSBmcmVzaE5hbWUoImVycm9yQ29kZSIpOwogICAgZ290b05hbWUgPSBmcmVzaE5hbWUoImdvdG8iKTsKICAgIGhhbmRsZXJOYW1lID0gZnJlc2hOYW1lKCJoYW5kbGVyIik7CiAgICBuZXh0TmFtZSA9IGZyZXNoTmFtZSgibmV4dCIpOwogICAgcmV0dXJuVmFsdWVOYW1lID0gZnJlc2hOYW1lKCJyZXR1cm5WYWx1ZSIpOwogICAgY3VycmVudEVycm9yTmFtZSA9IGZyZXNoTmFtZSgiY3VycmVudEVycm9yIik7CiAgICBvdXRlckxhYmVsTmFtZSA9IGZyZXNoTmFtZSgib3V0ZXIiKTsKICAgIHNlbGZOYW1lID0gZnJlc2hOYW1lKCJzZWxmIik7CiAgICAvLyBJbml0aWFsaXplIG5hbWVzIHNwZWNpZmljIHRvIHRoZSBzdWJjbGFzcy4KICAgIGluaXRpYWxpemVOYW1lcygpOwoKICAgIHJldHVybiByZXdyaXRlRnVuY3Rpb24obm9kZSwgYm9keVNvdXJjZUluZm9ybWF0aW9uLCBleGl0U291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAganMuRXhwcmVzc2lvbiBnZXQgY3VycmVudEVycm9ySGFuZGxlciB7CiAgICByZXR1cm4ganMubnVtYmVyKGhhbmRsZXJMYWJlbHNbCiAgICAgICAganVtcFRhcmdldHMubGFzdFdoZXJlKChub2RlKSA9PiBoYW5kbGVyTGFiZWxzW25vZGVdICE9IG51bGwpXSk7CiAgfQoKICBpbnQgYWxsb2NhdGVUZW1wVmFyKCkgewogICAgYXNzZXJ0KHRlbXBWYXJIaWdoV2F0ZXJNYXJrID49IGN1cnJlbnRUZW1wVmFySW5kZXgpOwogICAgY3VycmVudFRlbXBWYXJJbmRleCsrOwogICAgdGVtcFZhckhpZ2hXYXRlck1hcmsgPSBtYXgoY3VycmVudFRlbXBWYXJJbmRleCwgdGVtcFZhckhpZ2hXYXRlck1hcmspOwogICAgcmV0dXJuIGN1cnJlbnRUZW1wVmFySW5kZXg7CiAgfQoKICBqcy5WYXJpYWJsZVVzZSB1c2VUZW1wVmFyKGludCBpKSB7CiAgICByZXR1cm4gdGVtcFZhck5hbWVzLnB1dElmQWJzZW50KAogICAgICAgIGksICgpID0+IG5ldyBqcy5WYXJpYWJsZVVzZShmcmVzaE5hbWUoInRlbXAkaSIpKSk7CiAgfQoKICAvLy8gR2VuZXJhdGVzIGEgdmFyaWFibGUgbmFtZSB3aXRoIFtzYWZlVmFyaWFibGVOYW1lXSBiYXNlZCBvbiBbb3JpZ2luYWxOYW1lXQogIC8vLyB3aXRoIGEgc3VmZml4IHRvIGd1YXJhbnRlZSBpdCBkb2VzIG5vdCBjb2xsaWRlIHdpdGggYWxyZWFkeSB1c2VkIG5hbWVzLgogIFN0cmluZyBmcmVzaE5hbWUoU3RyaW5nIG9yaWdpbmFsTmFtZSkgewogICAgU3RyaW5nIHNhZmVOYW1lID0gc2FmZVZhcmlhYmxlTmFtZShvcmlnaW5hbE5hbWUpOwogICAgU3RyaW5nIHJlc3VsdCA9IHNhZmVOYW1lOwogICAgaW50IGNvdW50ZXIgPSAxOwogICAgd2hpbGUgKGFuYWx5c2lzLnVzZWROYW1lcy5jb250YWlucyhyZXN1bHQpKSB7CiAgICAgIHJlc3VsdCA9ICIkc2FmZU5hbWUkY291bnRlciI7CiAgICAgICsrY291bnRlcjsKICAgIH0KICAgIGFuYWx5c2lzLnVzZWROYW1lcy5hZGQocmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaXN0PGpzLkV4cHJlc3Npb24+IHByb2Nlc3NUeXBlQXJndW1lbnRzKExpc3Q8anMuRXhwcmVzc2lvbj4gdHlwZXMpIHsKICAgIGlmICh0eXBlcyA9PSBudWxsKSB7CiAgICAgIFN0cmluZyBuYW1lID0gZnJlc2hOYW1lKCd0eXBlJyk7CiAgICAgIHR5cGVBcmd1bWVudE5hbWVzLmFkZChuYW1lKTsKICAgICAgcmV0dXJuIDxqcy5FeHByZXNzaW9uPltuZXcganMuVmFyaWFibGVVc2UobmFtZSldOwogICAgfQogICAgcmV0dXJuIHR5cGVzOwogIH0KCiAgLy8vIEFsbCB0aGUgcGllY2VzIGFyZSBjb2xsZWN0ZWQgaW4gdGhpcyBtYXAsIHRvIGNyZWF0ZSBhIHN3aXRjaCB3aXRoIGEgY2FzZQogIC8vLyBmb3IgZWFjaCBsYWJlbC4KICAvLy8KICAvLy8gVGhlIG9yZGVyIGlzIGltcG9ydGFudCwgdGhlcmVmb3JlIHRoZSB0eXBlIGlzIGV4cGxpY2l0bHkgTGlua2VkSGFzaE1hcC4KICBMaW5rZWRIYXNoTWFwPGludCwgTGlzdDxqcy5TdGF0ZW1lbnQ+PiBsYWJlbGxlZFBhcnRzID0KICAgICAgbmV3IExpbmtlZEhhc2hNYXA8aW50LCBMaXN0PGpzLlN0YXRlbWVudD4+KCk7CgogIC8vLyBEZXNjcmlwdGlvbiBvZiBlYWNoIGxhYmVsIGZvciByZWFkYWJpbGl0eSBvZiB0aGUgbm9uLW1pbmlmaWVkIG91dHB1dC4KICBNYXA8aW50LCBTdHJpbmc+IGxhYmVsQ29tbWVudHMgPSBuZXcgTWFwPGludCwgU3RyaW5nPigpOwoKICAvLy8gVHJ1ZSBpZiB0aGUgZnVuY3Rpb24gaGFzIGFueSB0cnkgYmxvY2tzIGNvbnRhaW5pbmcgYXdhaXQuCiAgYm9vbCBoYXNUcnlCbG9ja3MgPSBmYWxzZTsKCiAgLy8vIFRydWUgaWYgdGhlIHRyYXZlcnNpb24gY3VycmVudGx5IGlzIGluc2lkZSBhIGxvb3Agb3Igc3dpdGNoIGZvciB3aGljaAogIC8vLyBbc2hvdWxkVHJhbnNmb3JtXSBpcyBmYWxzZS4KICBib29sIGluc2lkZVVudHJhbnNsYXRlZEJyZWFrYWJsZSA9IGZhbHNlOwoKICAvLy8gVHJ1ZSBpZiBhIGxhYmVsIGlzIHVzZWQgdG8gYnJlYWsgdG8gYW4gb3V0ZXIgc3dpdGNoLXN0YXRlbWVudC4KICBib29sIGhhc0p1bXBUaG91Z2hPdXRlckxhYmVsID0gZmFsc2U7CgogIC8vLyBUcnVlIGlmIHRoZXJlIGlzIGEgY2F0Y2gtaGFuZGxlciBwcm90ZWN0ZWQgYnkgYSBmaW5hbGx5IHdpdGggbm8gZW5jbG9zaW5nCiAgLy8vIGNhdGNoLWhhbmRsZXJzLgogIGJvb2wgbmVlZHNSZXRocm93ID0gZmFsc2U7CgogIC8vLyBCdWZmZXIgZm9yIGNvbGxlY3RpbmcgdHJhbnNsYXRlZCBzdGF0ZW1lbnRzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBzd2l0Y2gKICAvLy8gY2FzZS4KICBMaXN0PGpzLlN0YXRlbWVudD4gY3VycmVudFN0YXRlbWVudEJ1ZmZlcjsKCiAgLy8gTGFiZWxzIHdpbGwgYmVjb21lIGNhc2VzIGluIHRoZSBiaWcgc3dpdGNoIGV4cHJlc3Npb24sIGFuZCBgZ290byBsYWJlbGAKICAvLyBpcyBleHByZXNzZWQgYnkgYXNzaWduaW5nIHRvIHRoZSBzd2l0Y2gga2V5IFtnb3RvTmFtZV0gYW5kIGJyZWFraW5nIG91dCBvZgogIC8vIHRoZSBzd2l0Y2guCgogIGludCBuZXdMYWJlbChbU3RyaW5nIGNvbW1lbnRdKSB7CiAgICBpbnQgcmVzdWx0ID0gX2N1cnJlbnRMYWJlbDsKICAgIF9jdXJyZW50TGFiZWwrKzsKICAgIGlmIChjb21tZW50ICE9IG51bGwpIHsKICAgICAgbGFiZWxDb21tZW50c1tyZXN1bHRdID0gY29tbWVudDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gQmVnaW5zIG91dHB1dHRpbmcgc3RhdGVtZW50cyB0byBhIG5ldyBidWZmZXIgd2l0aCBsYWJlbCBbbGFiZWxdLgogIC8vLwogIC8vLyBFYWNoIGJ1ZmZlciBlbmRzIHVwIGFzIGl0cyBvd24gY2FzZSBwYXJ0IGluIHRoZSBiaWcgc3RhdGUtc3dpdGNoLgogIHZvaWQgYmVnaW5MYWJlbChpbnQgbGFiZWwpIHsKICAgIGFzc2VydCghbGFiZWxsZWRQYXJ0cy5jb250YWluc0tleShsYWJlbCkpOwogICAgY3VycmVudFN0YXRlbWVudEJ1ZmZlciA9IDxqcy5TdGF0ZW1lbnQ+W107CiAgICBsYWJlbGxlZFBhcnRzW2xhYmVsXSA9IGN1cnJlbnRTdGF0ZW1lbnRCdWZmZXI7CiAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLkNvbW1lbnQobGFiZWxDb21tZW50c1tsYWJlbF0pKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgc3RhdGVtZW50IGFzc2lnbmluZyB0byB0aGUgdmFyaWFibGUgbmFtZWQgW2dvdG9OYW1lXS4KICAvLy8gVGhpcyBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBicmVhayBmb3IgdGhlIGdvdG8gdG8gYmUgZXhlY3V0ZWQuIFVzZQogIC8vLyBbZ290b1dpdGhCcmVha10gb3IgW2FkZEdvdG9dIGZvciB0aGlzLgogIGpzLlN0YXRlbWVudCBzZXRHb3RvVmFyaWFibGUoaW50IGxhYmVsLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgcmV0dXJuIG5ldyBqcy5FeHByZXNzaW9uU3RhdGVtZW50KGpzLmpzKCcjID0gIycsCiAgICAgICAgW2dvdG8sIGpzLm51bWJlcihsYWJlbCldKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgYmxvY2sgdGhhdCBoYXMgYSBnb3RvIHRvIFtsYWJlbF0gaW5jbHVkaW5nIHRoZSBicmVhay4KICAvLy8KICAvLy8gQWxzbyBpbnNlcnRzIGEgY29tbWVudCBkZXNjcmliaW5nIHRoZSBsYWJlbCBpZiBhdmFpbGFibGUuCiAganMuQmxvY2sgZ290b0FuZEJyZWFrKGludCBsYWJlbCwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIExpc3Q8anMuU3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gPGpzLlN0YXRlbWVudD5bXTsKICAgIGlmIChsYWJlbENvbW1lbnRzLmNvbnRhaW5zS2V5KGxhYmVsKSkgewogICAgICBzdGF0ZW1lbnRzLmFkZChuZXcganMuQ29tbWVudCgiZ290byAke2xhYmVsQ29tbWVudHNbbGFiZWxdfSIpKTsKICAgIH0KICAgIHN0YXRlbWVudHMuYWRkKHNldEdvdG9WYXJpYWJsZShsYWJlbCwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIGlmIChpbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGUpIHsKICAgICAgaGFzSnVtcFRob3VnaE91dGVyTGFiZWwgPSB0cnVlOwogICAgICBzdGF0ZW1lbnRzLmFkZChuZXcganMuQnJlYWsob3V0ZXJMYWJlbE5hbWUpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9IGVsc2UgewogICAgICBzdGF0ZW1lbnRzCiAgICAgICAgICAuYWRkKG5ldyBqcy5CcmVhayhudWxsKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICAgIHJldHVybiBuZXcganMuQmxvY2soc3RhdGVtZW50cyk7CiAgfQoKICAvLy8gQWRkcyBhIGdvdG8gdG8gW2xhYmVsXSBpbmNsdWRpbmcgdGhlIGJyZWFrLgogIC8vLwogIC8vLyBBbHNvIGluc2VydHMgYSBjb21tZW50IGRlc2NyaWJpbmcgdGhlIGxhYmVsIGlmIGF2YWlsYWJsZS4KICB2b2lkIGFkZEdvdG8oaW50IGxhYmVsLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaWYgKGxhYmVsQ29tbWVudHMuY29udGFpbnNLZXkobGFiZWwpKSB7CiAgICAgIGFkZFN0YXRlbWVudChuZXcganMuQ29tbWVudCgiZ290byAke2xhYmVsQ29tbWVudHNbbGFiZWxdfSIpKTsKICAgIH0KICAgIGFkZFN0YXRlbWVudChzZXRHb3RvVmFyaWFibGUobGFiZWwsIHNvdXJjZUluZm9ybWF0aW9uKSk7CgogICAgYWRkQnJlYWsoc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgdm9pZCBhZGRTdGF0ZW1lbnQoanMuU3RhdGVtZW50IG5vZGUpIHsKICAgIGN1cnJlbnRTdGF0ZW1lbnRCdWZmZXIuYWRkKG5vZGUpOwogIH0KCiAgdm9pZCBhZGRFeHByZXNzaW9uU3RhdGVtZW50KGpzLkV4cHJlc3Npb24gbm9kZSkgewogICAgYWRkU3RhdGVtZW50KG5ldyBqcy5FeHByZXNzaW9uU3RhdGVtZW50KG5vZGUpKTsKICB9CgogIC8vLyBUcnVlIGlmIHRoZXJlIGlzIGFuIGF3YWl0IG9yIHlpZWxkIGluIFtub2RlXSBvciBzb21lIHN1YmV4cHJlc3Npb24uCiAgYm9vbCBzaG91bGRUcmFuc2Zvcm0oanMuTm9kZSBub2RlKSB7CiAgICByZXR1cm4gYW5hbHlzaXMuaGFzQXdhaXRPcllpZWxkLmNvbnRhaW5zKG5vZGUpOwogIH0KCiAgdm9pZCB1bnN1cHBvcnRlZChqcy5Ob2RlIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJOb2RlICRub2RlIGNhbm5vdCBiZSB0cmFuc2Zvcm1lZCBieSB0aGUgYXdhaXQtc3luYyB0cmFuc2Zvcm1lciIpOwogIH0KCiAgdm9pZCB1bnJlYWNoYWJsZShqcy5Ob2RlIG5vZGUpIHsKICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3Ioc3Bhbm5hYmxlLCAiSW50ZXJuYWwgZXJyb3IsIHRyeWluZyB0byB2aXNpdCAkbm9kZSIpOwogIH0KCiAgdmlzaXRTdGF0ZW1lbnQoanMuU3RhdGVtZW50IG5vZGUpIHsKICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgLy8vIFZpc2l0cyBbbm9kZV0gdG8gZW5zdXJlIGl0cyBzaWRlZWZmZWN0cyBhcmUgcGVyZm9ybWVkLCBidXQgdGhyb3dpbmcgYXdheQogIC8vLyB0aGUgcmVzdWx0LgogIC8vLwogIC8vLyBJZiB0aGUgcmV0dXJuIHZhbHVlIG9mIHZpc2l0aW5nIFtub2RlXSBpcyBhbiBleHByZXNzaW9uIGd1YXJhbnRlZWQgdG8gaGF2ZQogIC8vLyBubyBzaWRlIGVmZmVjdCwgaXQgaXMgZHJvcHBlZC4KICB2b2lkIHZpc2l0RXhwcmVzc2lvbklnbm9yZVJlc3VsdChqcy5FeHByZXNzaW9uIG5vZGUpIHsKICAgIC8vIFRPRE8oMjg3NjMpOiBSZW1vdmUgYDxkeW5hbWljPmAgd2hlbiBpc3N1ZSAyODc2MyBpcyBmaXhlZC4KICAgIGpzLkV4cHJlc3Npb24gcmVzdWx0ID0gbm9kZS5hY2NlcHQ8ZHluYW1pYz4odGhpcyk7CiAgICBpZiAoIShyZXN1bHQgaXMganMuTGl0ZXJhbCB8fCByZXN1bHQgaXMganMuVmFyaWFibGVVc2UpKSB7CiAgICAgIGFkZEV4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKICAgIH0KICB9CgogIGpzLkV4cHJlc3Npb24gdmlzaXRFeHByZXNzaW9uKGpzLkV4cHJlc3Npb24gbm9kZSkgewogICAgLy8gVE9ETygyODc2Myk6IFJlbW92ZSBgPGR5bmFtaWM+YCB3aGVuIGlzc3VlIDI4NzYzIGlzIGZpeGVkLgogICAgcmV0dXJuIG5vZGUuYWNjZXB0PGR5bmFtaWM+KHRoaXMpOwogIH0KCiAgLy8vIENhbGxzIFtmbl0gd2l0aCB0aGUgdmFsdWUgb2YgZXZhbHVhdGluZyBbbm9kZTFdIGFuZCBbbm9kZTJdLgogIC8vLwogIC8vLyBCb3RoIG5vZGVzIGFyZSBldmFsdWF0ZWQgaW4gb3JkZXIuCiAgLy8vCiAgLy8vIElmIG5vZGUyIG11c3QgYmUgdHJhbnNmb3JtZWQgKHNlZSBbc2hvdWxkVHJhbnNmb3JtXSksIHRoZW4gdGhlIGV2YWx1YXRpb24KICAvLy8gb2Ygbm9kZTEgaXMgYWRkZWQgdG8gdGhlIGN1cnJlbnQgc3RhdGVtZW50LWxpc3QgYW5kIHRoZSByZXN1bHQgaXMgc3RvcmVkCiAgLy8vIGluIGEgdGVtcG9yYXJ5IHZhcmlhYmxlLiBUaGUgZXZhbHVhdGlvbiBvZiBub2RlMiBpcyB0aGVuIGZyZWUgdG8gZW1pdAogIC8vLyBzdGF0ZW1lbnRzIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSByZXN1bHQgb2Ygbm9kZTEuCiAgLy8vCiAgLy8vIFRoaXMgaXMgbmVjZXNzYXJ5LCBiZWNhdXNlIGF3YWl0IG9yIHlpZWxkIGV4cHJlc3Npb25zIGhhdmUgdG8gZW1pdAogIC8vLyBzdGF0ZW1lbnRzLCBhbmQgdGhlc2Ugc3RhdGVtZW50cyBjb3VsZCBhZmZlY3QgdGhlIHZhbHVlIG9mIG5vZGUxLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZToKICAvLy8KICAvLy8gLSBfc3RvcmVJZk5lY2Vzc2FyeShzb21lTGl0ZXJhbCkgcmV0dXJucyBzb21lTGl0ZXJhbC4KICAvLy8gLSBfc3RvcmVJZk5lY2Vzc2FyeShzb21lVmFyaWFibGUpCiAgLy8vICAgaW5zZXJ0czogdmFyIHRlbXBYID0gc29tZVZhcmlhYmxlCiAgLy8vICAgcmV0dXJuczogdGVtcFgKICAvLy8gICB3aGVyZSB0ZW1wWCBpcyBhIGZyZXNoIHRlbXBvcmFyeSB2YXJpYWJsZS4KICBqcy5FeHByZXNzaW9uIF9zdG9yZUlmTmVjZXNzYXJ5KGpzLkV4cHJlc3Npb24gcmVzdWx0KSB7CiAgICAvLyBOb3RlIHRoYXQgUmVnRXhlcywganMuQXJyYXlJbml0aWFsaXplciBhbmQganMuT2JqZWN0SW5pdGlhbGl6ZXIgYXJlIG5vdAogICAgLy8gW2pzLkxpdGVyYWxdcy4KICAgIGlmIChyZXN1bHQgaXMganMuTGl0ZXJhbCkgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChyZXN1bHQgaXMganMuVmFyaWFibGVVc2UpIHsKICAgICAgaWYgKHJlc3VsdC5uYW1lID09IHNlbGZOYW1lKSByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIGpzLkV4cHJlc3Npb24gdGVtcFZhciA9IHVzZVRlbXBWYXIoYWxsb2NhdGVUZW1wVmFyKCkpOwogICAgYWRkU3RhdGVtZW50KGpzLmpzLnN0YXRlbWVudCgnIyA9ICM7JywgW3RlbXBWYXIsIHJlc3VsdF0pKTsKICAgIHJldHVybiB0ZW1wVmFyOwogIH0KCiAgLy8gVE9ETyhzaWd1cmRtKTogVGhpcyBpcyBvYnNvbGV0ZSAtIGFsbCBjYWxscyB1c2Ugc3RvcmU6IGZhbHNlLiBSZXBsYWNlIHdpdGgKICAvLyB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgd2l0aEV4cHJlc3Npb24oanMuRXhwcmVzc2lvbiBub2RlLCBmbihqcy5FeHByZXNzaW9uIHJlc3VsdCksIHtib29sIHN0b3JlfSkgewogICAgaW50IG9sZFRlbXBWYXJJbmRleCA9IGN1cnJlbnRUZW1wVmFySW5kZXg7CiAgICBqcy5FeHByZXNzaW9uIHZpc2l0ZWQgPSB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgICBpZiAoc3RvcmUpIHsKICAgICAgdmlzaXRlZCA9IF9zdG9yZUlmTmVjZXNzYXJ5KHZpc2l0ZWQpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IGZuKHZpc2l0ZWQpOwogICAgY3VycmVudFRlbXBWYXJJbmRleCA9IG9sZFRlbXBWYXJJbmRleDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gQ2FsbHMgW2ZuXSB3aXRoIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyBbbm9kZV0uIFRha2luZyBzcGVjaWFsIGNhcmUgb2YKICAvLy8gcHJvcGVydHkgYWNjZXNzZXMuCiAgLy8vCiAgLy8vIElmIFtzdG9yZV0gaXMgdHJ1ZSB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgW25vZGVdIGlzIHN0b3JlZCBpbiBhCiAgLy8vIHRlbXBvcmFyeS4KICAvLy8KICAvLy8gV2UgY2Fubm90IHJld3JpdGUgYDxyZWNlaXZlcj4ubSgpYCB0bzoKICAvLy8gICAgIHRlbXAgPSA8cmVjZWl2ZXI+Lm07CiAgLy8vICAgICB0ZW1wKCk7CiAgLy8vIEJlY2F1c2UgdGhpcyBsZWF2ZXMgYHRoaXNgIHVuYm91bmQgaW4gdGhlIGNhbGwuIEJ1dCBiZWNhdXNlIG9mIGRhcnQKICAvLy8gZXZhbHVhdGlvbiBvcmRlciB3ZSBjYW4gd3JpdGU6CiAgLy8vICAgICB0ZW1wID0gPHJlY2VpdmVyPjsKICAvLy8gICAgIHRlbXAubSgpOwogIHdpdGhDYWxsVGFyZ2V0RXhwcmVzc2lvbihqcy5FeHByZXNzaW9uIG5vZGUsIGZuKGpzLkV4cHJlc3Npb24gcmVzdWx0KSwKICAgICAge2Jvb2wgc3RvcmV9KSB7CiAgICBpbnQgb2xkVGVtcFZhckluZGV4ID0gY3VycmVudFRlbXBWYXJJbmRleDsKICAgIGpzLkV4cHJlc3Npb24gdmlzaXRlZCA9IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICAgIGpzLkV4cHJlc3Npb24gc2VsZWN0b3I7CiAgICBqcy5FeHByZXNzaW9uIHN0b3JlZElmTmVlZGVkOwogICAgaWYgKHN0b3JlKSB7CiAgICAgIGlmICh2aXNpdGVkIGlzIGpzLlByb3BlcnR5QWNjZXNzKSB7CiAgICAgICAganMuUHJvcGVydHlBY2Nlc3MgcHJvcGVydHlBY2Nlc3MgPSB2aXNpdGVkOwogICAgICAgIHNlbGVjdG9yID0gcHJvcGVydHlBY2Nlc3Muc2VsZWN0b3I7CiAgICAgICAgdmlzaXRlZCA9IHByb3BlcnR5QWNjZXNzLnJlY2VpdmVyOwogICAgICB9CiAgICAgIHN0b3JlZElmTmVlZGVkID0gX3N0b3JlSWZOZWNlc3NhcnkodmlzaXRlZCk7CiAgICB9IGVsc2UgewogICAgICBzdG9yZWRJZk5lZWRlZCA9IHZpc2l0ZWQ7CiAgICB9CiAgICBqcy5FeHByZXNzaW9uIHJlc3VsdDsKICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7CiAgICAgIHJlc3VsdCA9IGZuKHN0b3JlZElmTmVlZGVkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IGZuKG5ldyBqcy5Qcm9wZXJ0eUFjY2VzcyhzdG9yZWRJZk5lZWRlZCwgc2VsZWN0b3IpKTsKICAgIH0KICAgIGN1cnJlbnRUZW1wVmFySW5kZXggPSBvbGRUZW1wVmFySW5kZXg7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENhbGxzIFtmbl0gd2l0aCB0aGUgdmFsdWUgb2YgZXZhbHVhdGluZyBbbm9kZTFdIGFuZCBbbm9kZTJdLgogIC8vLwogIC8vLyBJZiBgc2hvdWxkVHJhbnNmb3JtKG5vZGUyKWAgdGhlIGZpcnN0IGV4cHJlc3Npb24gaXMgc3RvcmVkIGluIGEgdGVtcG9yYXJ5CiAgLy8vIHZhcmlhYmxlLgogIC8vLwogIC8vLyBUaGlzIGlzIGJlY2F1c2Ugbm9kZTEgbXVzdCBiZSBldmFsdWF0ZWQgYmVmb3JlIHZpc2l0aW5nIG5vZGUyLAogIC8vLyBiZWNhdXNlIHRoZSBldmFsdWF0aW9uIG9mIGFuIGF3YWl0IG9yIHlpZWxkIGNhbm5vdCBiZSBleHByZXNzZWQgYXMKICAvLy8gYW4gZXhwcmVzc2lvbiwgdmlzaXRpbmcgbm9kZTIgaXQgd2lsbCBvdXRwdXQgc3RhdGVtZW50cyB0aGF0CiAgLy8vIG1pZ2h0IGhhdmUgYW4gaW5mbHVlbmNlIG9uIHRoZSB2YWx1ZSBvZiBub2RlMS4KICB3aXRoRXhwcmVzc2lvbjIoanMuRXhwcmVzc2lvbiBub2RlMSwganMuRXhwcmVzc2lvbiBub2RlMiwKICAgICAgZm4oanMuRXhwcmVzc2lvbiByZXN1bHQxLCBqcy5FeHByZXNzaW9uIHJlc3VsdDIpKSB7CiAgICBpbnQgb2xkVGVtcFZhckluZGV4ID0gY3VycmVudFRlbXBWYXJJbmRleDsKICAgIGpzLkV4cHJlc3Npb24gcjEgPSB2aXNpdEV4cHJlc3Npb24obm9kZTEpOwogICAgaWYgKHNob3VsZFRyYW5zZm9ybShub2RlMikpIHsKICAgICAgcjEgPSBfc3RvcmVJZk5lY2Vzc2FyeShyMSk7CiAgICB9CiAgICBqcy5FeHByZXNzaW9uIHIyID0gdmlzaXRFeHByZXNzaW9uKG5vZGUyKTsKICAgIHZhciByZXN1bHQgPSBmbihyMSwgcjIpOwogICAgY3VycmVudFRlbXBWYXJJbmRleCA9IG9sZFRlbXBWYXJJbmRleDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gQ2FsbHMgW2ZuXSB3aXRoIHRoZSB2YWx1ZSBvZiBldmFsdWF0aW5nIGFsbCBbbm9kZXNdLgogIC8vLwogIC8vLyBBbGwgcmVzdWx0cyBiZWZvcmUgdGhlIGxhc3Qgbm9kZSB3aGVyZSBgc2hvdWxkVHJhbnNmb3JtKG5vZGUpYCBhcmUgc3RvcmVkCiAgLy8vIGluIHRlbXBvcmFyeSB2YXJpYWJsZXMuCiAgLy8vCiAgLy8vIFNlZSBtb3JlIGV4cGxhbmF0aW9uIG9uIFt3aXRoRXhwcmVzc2lvbjJdLgogIC8vLwogIC8vLyBJZiBhbnkgb2YgdGhlIG5vZGVzIGFyZSBudWxsLCB0aGV5IGFyZSBpZ25vcmVkLCBhbmQgYSBudWxsIGlzIHBhc3NlZCB0bwogIC8vLyBbZm5dIGluIHRoYXQgcGxhY2UuCiAgd2l0aEV4cHJlc3Npb25zKExpc3Q8anMuRXhwcmVzc2lvbj4gbm9kZXMsIGZuKExpc3Q8anMuRXhwcmVzc2lvbj4gcmVzdWx0cykpIHsKICAgIGludCBvbGRUZW1wVmFySW5kZXggPSBjdXJyZW50VGVtcFZhckluZGV4OwogICAgLy8gRmluZCBsYXN0IG9jY3VyZW5jZSBvZiBhICd0cmFuc2Zvcm0nIGV4cHJlc3Npb24gaW4gW25vZGVzXS4KICAgIC8vIEFsbCBleHByZXNzaW9ucyBiZWZvcmUgdGhhdCBtdXN0IGJlIHN0b3JlZCBpbiB0ZW1wLXZhcnMuCiAgICBpbnQgbGFzdFRyYW5zZm9ybUluZGV4ID0gMDsKICAgIGZvciAoaW50IGkgPSBub2Rlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICBpZiAobm9kZXNbaV0gPT0gbnVsbCkgY29udGludWU7CiAgICAgIGlmIChzaG91bGRUcmFuc2Zvcm0obm9kZXNbaV0pKSB7CiAgICAgICAgbGFzdFRyYW5zZm9ybUluZGV4ID0gaTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgTGlzdDxqcy5Ob2RlPiB2aXNpdGVkID0gbm9kZXMudGFrZShsYXN0VHJhbnNmb3JtSW5kZXgpLm1hcCgoanMuTm9kZSBub2RlKSB7CiAgICAgIHJldHVybiAobm9kZSA9PSBudWxsKSA/IG51bGwgOiBfc3RvcmVJZk5lY2Vzc2FyeSh2aXNpdEV4cHJlc3Npb24obm9kZSkpOwogICAgfSkudG9MaXN0KCk7CiAgICB2aXNpdGVkLmFkZEFsbCgKICAgICAgICBub2Rlcy5za2lwKGxhc3RUcmFuc2Zvcm1JbmRleCkubWFwPGpzLkV4cHJlc3Npb24+KChqcy5Ob2RlIG5vZGUpIHsKICAgICAgcmV0dXJuIChub2RlID09IG51bGwpID8gbnVsbCA6IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICAgIH0pKTsKICAgIHZhciByZXN1bHQgPSBmbih2aXNpdGVkKTsKICAgIGN1cnJlbnRUZW1wVmFySW5kZXggPSBvbGRUZW1wVmFySW5kZXg7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIEVtaXRzIHRoZSByZXR1cm4gYmxvY2sgdGhhdCBhbGwgcmV0dXJucyBqdW1wIHRvIChhZnRlciBnb2luZwogIC8vLyB0aHJvdWdoIGFsbCB0aGUgZW5jbG9zaW5nIGZpbmFsbHkgYmxvY2tzKS4gVGhlIGp1bXAgdG8gaGVyZSBpcyBtYWRlIGluCiAgLy8vIFt2aXNpdFJldHVybl0uCiAgdm9pZCBhZGRTdWNjZXNzRXhpdChTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbik7CgogIC8vLyBFbWl0cyB0aGUgYmxvY2sgdGhhdCBjb250cm9sIGZsb3dzIHRvIGlmIGFuIGVycm9yIGhhcyBiZWVuIHRocm93bgogIC8vLyBidXQgbm90IGNhdWdodC4gKGFmdGVyIGdvaW5nIHRocm91Z2ggYWxsIHRoZSBlbmNsb3NpbmcgZmluYWxseSBibG9ja3MpLgogIHZvaWQgYWRkRXJyb3JFeGl0KFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgdm9pZCBhZGRGdW5jdGlvbkV4aXRzKFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBhZGRTdWNjZXNzRXhpdChzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBhZGRFcnJvckV4aXQoc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHJld3JpdHRlbiBmdW5jdGlvbi4KICBqcy5GdW4gZmluaXNoRnVuY3Rpb24oCiAgICAgIExpc3Q8anMuUGFyYW1ldGVyPiBwYXJhbWV0ZXJzLAogICAgICBMaXN0PGpzLlBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsCiAgICAgIGpzLlN0YXRlbWVudCByZXdyaXR0ZW5Cb2R5LAogICAgICBqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdCB2YXJpYWJsZURlY2xhcmF0aW9ucywKICAgICAgU291cmNlSW5mb3JtYXRpb24gZnVuY3Rpb25Tb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgU291cmNlSW5mb3JtYXRpb24gYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKCiAgSXRlcmFibGU8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj4gdmFyaWFibGVJbml0aWFsaXphdGlvbnMoCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgLy8vIFJld3JpdGVzIGFuIGFzeW5jL3N5bmMqL2FzeW5jKiBmdW5jdGlvbiB0byBhIG5vcm1hbCBKYXZhc2NyaXB0IGZ1bmN0aW9uLgogIC8vLwogIC8vLyBUaGUgY29udHJvbCBmbG93IGlzIGZsYXR0ZW5lZCBieSBzaW11bGF0aW5nICdnb3RvJyB1c2luZyBhIHN3aXRjaCBpbiBhCiAgLy8vIGxvb3AgYW5kIGEgc3RhdGUgdmFyaWFibGUgW2dvdG9dIGluc2lkZSBhIG5lc3RlZCBmdW5jdGlvbiBbYm9keV0KICAvLy8gdGhhdCBjYW4gYmUgY2FsbGVkIGJhY2sgYnkgW2FzeW5jU3RhckhlbHBlcl0vW2FzeW5jU3RhckhlbHBlcl0vdGhlCiAgLy8vIFtJdGVyYXRvcl0uCiAgLy8vCiAgLy8vIExvY2FsIHZhcmlhYmxlcyBhcmUgaG9pc3RlZCBvdXRzaWRlIHRoZSBoZWxwZXIuCiAgLy8vCiAgLy8vIEF3YWl0cyBpbiBhc3luYy9hc3luYyogYXJlIHRyYW5zbGF0ZWQgdG8gY29kZSB0aGF0IHJlbWVtYmVycyB0aGUgY3VycmVudAogIC8vLyBsb2NhdGlvbiAoc28gdGhlIGZ1bmN0aW9uIGNhbiByZXN1bWUgZnJvbSB3aGVyZSBpdCB3YXMpIGZvbGxvd2VkIGJ5IGEKICAvLy8gW2F3YWl0U3RhdGVtZW50XS4gVGhlIGhlbHBlciBzZXRzIHVwIHRoZSB3YWl0aW5nIGZvciB0aGUgYXdhaXRlZAogIC8vLyB2YWx1ZSBhbmQgcmV0dXJucyBhIGZ1dHVyZSB3aGljaCBpcyBpbW1lZGlhdGVseSByZXR1cm5lZCBieSB0aGUKICAvLy8gW2F3YWl0U3RhdGVtZW50XS4KICAvLy8KICAvLy8gWWllbGRzIGluIHN5bmMqL2FzeW5jKiBhcmUgdHJhbnNsYXRlZCB0byBhIGNhbGxzIHRvIGhlbHBlciBmdW5jdGlvbnMuCiAgLy8vIChzZWUgW3Zpc2l0WWllbGRdKQogIC8vLwogIC8vLyBTaW1wbGlmaWVkIGV4YW1wbGVzIChub3QgdGhlIGV4YWN0IHRyYW5zbGF0aW9uLCBidXQgaW50ZW5kZWQgdG8gc2hvdyB0aGUKICAvLy8gaWRlYXMpOgogIC8vLwogIC8vLyBmdW5jdGlvbiAoeCwgeSwgeikgYXN5bmMgewogIC8vLyAgIHZhciBwID0gYXdhaXQgZm9vKCk7CiAgLy8vICAgcmV0dXJuIGJhcihwKTsKICAvLy8gfQogIC8vLwogIC8vLyBCZWNvbWVzICh3aXRob3V0IGVycm9yIGhhbmRsaW5nKToKICAvLy8KICAvLy8gZnVuY3Rpb24oeCwgeSwgeikgewogIC8vLyAgIHZhciBnb3RvID0gMCwgcmV0dXJuVmFsdWUsIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKSwgcDsKICAvLy8gICBmdW5jdGlvbiBib2R5KHJlc3VsdCkgewogIC8vLyAgICAgd2hpbGUgKHRydWUpIHsKICAvLy8gICAgICAgc3dpdGNoIChnb3RvKSB7CiAgLy8vICAgICAgICAgY2FzZSAwOgogIC8vLyAgICAgICAgICAgZ290byA9IDEgLy8gUmVtZW1iZXIgd2hlcmUgdG8gY29udGludWUgd2hlbiB0aGUgZnV0dXJlIHN1Y2NlZWRzLgogIC8vLyAgICAgICAgICAgcmV0dXJuIHRoZW5IZWxwZXIoZm9vKCksIGhlbHBlciwgY29tcGxldGVyKTsKICAvLy8gICAgICAgICBjYXNlIDE6CiAgLy8vICAgICAgICAgICBwID0gcmVzdWx0OwogIC8vLyAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBiYXIocCk7CiAgLy8vICAgICAgICAgICBnb3RvID0gMjsKICAvLy8gICAgICAgICAgIGJyZWFrOwogIC8vLyAgICAgICAgIGNhc2UgMjoKICAvLy8gICAgICAgICAgIHJldHVybiB0aGVuSGVscGVyKHJldHVyblZhbHVlLCBudWxsLCBjb21wbGV0ZXIpCiAgLy8vICAgICAgIH0KICAvLy8gICAgIH0KICAvLy8gICAgIHJldHVybiB0aGVuSGVscGVyKG51bGwsIGhlbHBlciwgY29tcGxldGVyKTsKICAvLy8gICB9CiAgLy8vIH0KICAvLy8KICAvLy8gVHJ5L2NhdGNoIGlzIGltcGxlbWVudGVkIGJ5IG1haW50YWluaW5nIFtoYW5kbGVyXSB0byBjb250YWluIHRoZSBsYWJlbAogIC8vLyBvZiB0aGUgY3VycmVudCBoYW5kbGVyLiBJZiBbYm9keV0gdGhyb3dzLCB0aGUgY2FsbGVyIHNob3VsZCBjYXRjaCB0aGUKICAvLy8gZXJyb3IgYW5kIHJlY2FsbCBbYm9keV0gd2l0aCBmaXJzdCBhcmd1bWVudCBbZXJyb3JfY29kZXMuRVJST1JdIGFuZAogIC8vLyBzZWNvbmQgYXJndW1lbnQgdGhlIGVycm9yLgogIC8vLwogIC8vLyBBIGBmaW5hbGx5YCBjbGF1c2UgaXMgY29tcGlsZWQgc2ltaWxhciB0byBub3JtYWwgY29kZSwgd2l0aCB0aGUgYWRkaXRpb25hbAogIC8vLyBjb21wbGV4aXR5IHRoYXQgYGZpbmFsbHlgIGNsYXVzZXMgbmVlZCB0byBrbm93IHdoZXJlIHRvIGp1bXAgdG8gYWZ0ZXIgdGhlCiAgLy8vIGNsYXVzZSBpcyBkb25lLiBJbiB0aGUgdHJhbnNsYXRpb24sIGVhY2ggZmxvdy1wYXRoIHRoYXQgZW50ZXJzIGEgYGZpbmFsbHlgCiAgLy8vIHNldHMgdXAgdGhlIHZhcmlhYmxlIFtuZXh0XSB3aXRoIGEgc3RhY2sgb2YgZmluYWxseS1ibG9ja3MgYW5kIGEgZmluYWwKICAvLy8ganVtcC10YXJnZXQgKGV4aXQsIGNhdGNoLCAuLi4pLgogIC8vLwogIC8vLyBmdW5jdGlvbih4LCB5LCB6KSBhc3luYyB7CiAgLy8vICAgdHJ5IHsKICAvLy8gICAgIHRyeSB7CiAgLy8vICAgICAgIHRocm93ICJlcnJvciI7CiAgLy8vICAgICB9IGZpbmFsbHkgewogIC8vLyAgICAgICBmaW5hbGl6ZTEoKTsKICAvLy8gICAgIH0KICAvLy8gICB9IGNhdGNoIChlKSB7CiAgLy8vICAgICBoYW5kbGUoZSk7CiAgLy8vICAgfSBmaW5hbGx5IHsKICAvLy8gICAgIGZpbmFsaXplMigpOwogIC8vLyAgIH0KICAvLy8gfQogIC8vLwogIC8vLyBUcmFuc2xhdGVzIGludG8gKGJlc2lkZXMgdGhlIGZhY3QgdGhhdCBzdHJ1Y3R1cmVzIG5vdCBjb250YWluaW5nCiAgLy8vIGF3YWl0L3lpZWxkL3lpZWxkKiBhcmUgbGVmdCBpbnRhY3QpOgogIC8vLwogIC8vLyBmdW5jdGlvbih4LCB5LCB6KSB7CiAgLy8vICAgdmFyIGdvdG8gPSAwOwogIC8vLyAgIHZhciByZXR1cm5WYWx1ZTsKICAvLy8gICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcigpOwogIC8vLyAgIHZhciBoYW5kbGVyID0gODsgLy8gT3V0c2lkZSB0cnktYmxvY2tzIGdvIHRvIHRoZSByZXRocm93IGxhYmVsLgogIC8vLyAgIHZhciBwOwogIC8vLyAgIHZhciBjdXJyZW50RXJyb3I7CiAgLy8vICAgLy8gVGhlIHJlc3VsdCBjYW4gYmUgZWl0aGVyIHRoZSByZXN1bHQgb2YgYW4gYXdhaXRlZCBmdXR1cmUsIG9yIGFuCiAgLy8vICAgLy8gZXJyb3IgaWYgdGhlIGZ1dHVyZSBjb21wbGV0ZWQgd2l0aCBhbiBlcnJvci4KICAvLy8gICBmdW5jdGlvbiBib2R5KGVycm9yQ29kZSwgcmVzdWx0KSB7CiAgLy8vICAgICBpZiAoZXJyb3JDb2RlID09IDEpIHsKICAvLy8gICAgICAgY3VycmVudEVycm9yID0gcmVzdWx0OwogIC8vLyAgICAgICBnb3RvID0gaGFuZGxlcjsKICAvLy8gICAgIH0KICAvLy8gICAgIHdoaWxlICh0cnVlKSB7CiAgLy8vICAgICAgIHN3aXRjaCAoZ290bykgewogIC8vLyAgICAgICAgIGNhc2UgMDoKICAvLy8gICAgICAgICAgIGhhbmRsZXIgPSA0OyAvLyBUaGUgb3V0ZXIgY2F0Y2gtaGFuZGxlcgogIC8vLyAgICAgICAgICAgaGFuZGxlciA9IDE7IC8vIFRoZSBpbm5lciAoaW1wbGljaXQpIGNhdGNoLWhhbmRsZXIKICAvLy8gICAgICAgICAgIHRocm93ICJlcnJvciI7CiAgLy8vICAgICAgICAgICBuZXh0ID0gWzNdOwogIC8vLyAgICAgICAgICAgLy8gQWZ0ZXIgdGhlIGZpbmFsbHkgKDIpIGNvbnRpbnVlIG5vcm1hbGx5IGFmdGVyIHRoZSB0cnkuCiAgLy8vICAgICAgICAgICBnb3RvID0gMjsKICAvLy8gICAgICAgICAgIGJyZWFrOwogIC8vLyAgICAgICAgIGNhc2UgMTogLy8gKGltcGxpY2l0KSBjYXRjaCBoYW5kbGVyIGZvciBpbm5lciB0cnkuCiAgLy8vICAgICAgICAgICBuZXh0ID0gWzNdOyAvLyBkZXN0aW5hdGlvbiBhZnRlciB0aGUgZmluYWxseS4KICAvLy8gICAgICAgICAgIC8vIGZhbGwtdGhvdWdoIHRvIHRoZSBmaW5hbGx5IGhhbmRsZXIuCiAgLy8vICAgICAgICAgY2FzZSAyOiAvLyBmaW5hbGx5IGZvciBpbm5lciB0cnkKICAvLy8gICAgICAgICAgIGhhbmRsZXIgPSA0OyAvLyBjYXRjaC1oYW5kbGVyIGZvciBvdXRlciB0cnkuCiAgLy8vICAgICAgICAgICBmaW5hbGl6ZTEoKTsKICAvLy8gICAgICAgICAgIGdvdG8gPSBuZXh0LnBvcCgpOwogIC8vLyAgICAgICAgICAgYnJlYWs7CiAgLy8vICAgICAgICAgY2FzZSAzOiAvLyBleGl0aW5nIGlubmVyIHRyeS4KICAvLy8gICAgICAgICAgIG5leHQgPSBbNl07CiAgLy8vICAgICAgICAgICBnb3RvID0gNTsgLy8gZmluYWxseSBoYW5kbGVyIGZvciBvdXRlciB0cnkuCiAgLy8vICAgICAgICAgICBicmVhazsKICAvLy8gICAgICAgICBjYXNlIDQ6IC8vIGNhdGNoIGhhbmRsZXIgZm9yIG91dGVyIHRyeS4KICAvLy8gICAgICAgICAgIGhhbmRsZXIgPSA1OyAvLyBJZiB0aGUgaGFuZGxlciB0aHJvd3MsIGRvIHRoZSBmaW5hbGx5IC4uCiAgLy8vICAgICAgICAgICBuZXh0ID0gWzhdIC8vIC4uLiBhbmQgcmV0aHJvdy4KICAvLy8gICAgICAgICAgIGUgPSBzdG9yZWRFcnJvcjsKICAvLy8gICAgICAgICAgIGhhbmRsZShlKTsKICAvLy8gICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBmaW5hbGx5LgogIC8vLyAgICAgICAgIGNhc2UgNTogLy8gZmluYWxseSBoYW5kbGVyIGZvciBvdXRlciB0cnkuCiAgLy8vICAgICAgICAgICBoYW5kbGVyID0gbnVsbDsKICAvLy8gICAgICAgICAgIGZpbmFsaXplMigpOwogIC8vLyAgICAgICAgICAgZ290byA9IG5leHQucG9wKCk7CiAgLy8vICAgICAgICAgICBicmVhazsKICAvLy8gICAgICAgICBjYXNlIDY6IC8vIEV4aXRpbmcgb3V0ZXIgdHJ5LgogIC8vLyAgICAgICAgIGNhc2UgNzogLy8gcmV0dXJuCiAgLy8vICAgICAgICAgICByZXR1cm4gdGhlbkhlbHBlcihyZXR1cm5WYWx1ZSwgMCwgY29tcGxldGVyKTsKICAvLy8gICAgICAgICBjYXNlIDg6IC8vIFJldGhyb3cKICAvLy8gICAgICAgICAgIHJldHVybiB0aGVuSGVscGVyKGN1cnJlbnRFcnJvciwgMSwgY29tcGxldGVyKTsKICAvLy8gICAgICAgfQogIC8vLyAgICAgfQogIC8vLyAgICAgcmV0dXJuIHRoZW5IZWxwZXIobnVsbCwgaGVscGVyLCBjb21wbGV0ZXIpOwogIC8vLyAgIH0KICAvLy8gfQogIC8vLwogIC8vLyBbYm9keVNvdXJjZUluZm9ybWF0aW9uXSBpcyB1c2VkIG9uIGNvZGUgZ2VuZXJhdGVkIHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uCiAgLy8vIGJvZHkgYW5kIFtleGl0U291cmNlSW5mb3JtYXRpb25dIGlzIHVzZWQgb24gY29kZSBnZW5lcmF0ZWQgdG8gZXhpdCB0aGUKICAvLy8gZnVuY3Rpb24uCiAganMuRXhwcmVzc2lvbiByZXdyaXRlRnVuY3Rpb24oCiAgICAgIGpzLkZ1biBub2RlLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBib2R5U291cmNlSW5mb3JtYXRpb24sCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIGV4aXRTb3VyY2VJbmZvcm1hdGlvbikgewogICAgYmVnaW5MYWJlbChuZXdMYWJlbCgiRnVuY3Rpb24gc3RhcnQiKSk7CiAgICAvLyBBc3luY1N0YXIgbmVlZHMgYSByZXR1cm4gbGFiZWwgZm9yIGl0cyBoYW5kbGluZyBvZiBjYW5jZWxsYXRpb24uIFNlZQogICAgLy8gW3Zpc2l0RGFydFlpZWxkXS4KICAgIGV4aXRMYWJlbCA9IChhbmFseXNpcy5oYXNFeHBsaWNpdFJldHVybnMgfHwgaXNBc3luY1N0YXIpCiAgICAgICAgPyBuZXdMYWJlbCgicmV0dXJuIikKICAgICAgICA6IG51bGw7CiAgICByZXRocm93TGFiZWwgPSBuZXdMYWJlbCgicmV0aHJvdyIpOwogICAgaGFuZGxlckxhYmVsc1tub2RlXSA9IHJldGhyb3dMYWJlbDsKICAgIGpzLlN0YXRlbWVudCBib2R5ID0gbm9kZS5ib2R5OwogICAganVtcFRhcmdldHMuYWRkKG5vZGUpOwogICAgdmlzaXRTdGF0ZW1lbnQoYm9keSk7CiAgICBqdW1wVGFyZ2V0cy5yZW1vdmVMYXN0KCk7CiAgICBhZGRGdW5jdGlvbkV4aXRzKGV4aXRTb3VyY2VJbmZvcm1hdGlvbik7CgogICAgTGlzdDxqcy5Td2l0Y2hDbGF1c2U+IGNsYXVzZXMgPSBsYWJlbGxlZFBhcnRzLmtleXMubWFwKChsYWJlbCkgewogICAgICByZXR1cm4gbmV3IGpzLkNhc2UoanMubnVtYmVyKGxhYmVsKSwgbmV3IGpzLkJsb2NrKGxhYmVsbGVkUGFydHNbbGFiZWxdKSk7CiAgICB9KS50b0xpc3QoKTsKICAgIGpzLlN0YXRlbWVudCByZXdyaXR0ZW5Cb2R5ID0gbmV3IGpzLlN3aXRjaChnb3RvLCBjbGF1c2VzKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGlmIChoYXNKdW1wVGhvdWdoT3V0ZXJMYWJlbCkgewogICAgICByZXdyaXR0ZW5Cb2R5ID0gbmV3IGpzLkxhYmVsZWRTdGF0ZW1lbnQob3V0ZXJMYWJlbE5hbWUsIHJld3JpdHRlbkJvZHkpOwogICAgfQogICAgcmV3cml0dGVuQm9keSA9IGpzLmpzCiAgICAgICAgLnN0YXRlbWVudCgnd2hpbGUgKHRydWUpIHsjfScsIHJld3JpdHRlbkJvZHkpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAgTGlzdDxqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uPiB2YXJpYWJsZXMgPSA8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj5bXTsKCiAgICB2YXJpYWJsZXMuYWRkKAogICAgICAgIF9tYWtlVmFyaWFibGVJbml0aWFsaXplcihnb3RvLCBqcy5udW1iZXIoMCksIGJvZHlTb3VyY2VJbmZvcm1hdGlvbikpOwogICAgdmFyaWFibGVzLmFkZEFsbCh2YXJpYWJsZUluaXRpYWxpemF0aW9ucyhib2R5U291cmNlSW5mb3JtYXRpb24pKTsKICAgIGlmIChoYXNIYW5kbGVyTGFiZWxzKSB7CiAgICAgIHZhcmlhYmxlcy5hZGQoX21ha2VWYXJpYWJsZUluaXRpYWxpemVyKAogICAgICAgICAgaGFuZGxlciwganMubnVtYmVyKHJldGhyb3dMYWJlbCksIGJvZHlTb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB2YXJpYWJsZXMuYWRkKAogICAgICAgICAgX21ha2VWYXJpYWJsZUluaXRpYWxpemVyKGN1cnJlbnRFcnJvciwgbnVsbCwgYm9keVNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgICBpZiAoYW5hbHlzaXMuaGFzRmluYWxseSB8fCAoaXNBc3luY1N0YXIgJiYgYW5hbHlzaXMuaGFzWWllbGQpKSB7CiAgICAgIHZhcmlhYmxlcy5hZGQoX21ha2VWYXJpYWJsZUluaXRpYWxpemVyKG5leHQsCiAgICAgICAgICBuZXcganMuQXJyYXlJbml0aWFsaXplcig8anMuRXhwcmVzc2lvbj5bXSksIGJvZHlTb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogICAgaWYgKGFuYWx5c2lzLmhhc1RoaXMgJiYgIWlzU3luY1N0YXIpIHsKICAgICAgLy8gU3luYyogZnVuY3Rpb25zIG11c3QgcmVtZW1iZXIgYHRoaXNgIG9uIHRoZSBsZXZlbCBvZiB0aGUgb3V0ZXIKICAgICAgLy8gZnVuY3Rpb24uCiAgICAgIHZhcmlhYmxlcy5hZGQoCiAgICAgICAgICBfbWFrZVZhcmlhYmxlSW5pdGlhbGl6ZXIoc2VsZiwganMuanMoJ3RoaXMnKSwgYm9keVNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgICB2YXJpYWJsZXMuYWRkQWxsKGxvY2FsVmFyaWFibGVzLm1hcCgoanMuVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewogICAgICByZXR1cm4gbmV3IGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24oZGVjbGFyYXRpb24sIG51bGwpOwogICAgfSkpOwogICAgdmFyaWFibGVzLmFkZEFsbChuZXcgSXRlcmFibGUuZ2VuZXJhdGUoCiAgICAgICAgdGVtcFZhckhpZ2hXYXRlck1hcmssCiAgICAgICAgKGludCBpKSA9PiBfbWFrZVZhcmlhYmxlSW5pdGlhbGl6ZXIoCiAgICAgICAgICAgIHVzZVRlbXBWYXIoaSArIDEpLm5hbWUsIG51bGwsIGJvZHlTb3VyY2VJbmZvcm1hdGlvbikpKTsKICAgIGpzLlZhcmlhYmxlRGVjbGFyYXRpb25MaXN0IHZhcmlhYmxlRGVjbGFyYXRpb25zID0KICAgICAgICBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QodmFyaWFibGVzKTsKCiAgICAvLyBOYW1lcyBhcmUgYWxyZWFkeSBzYWZlIHdoZW4gYWRkZWQuCiAgICBMaXN0PGpzLlBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPQogICAgICAgIHR5cGVBcmd1bWVudE5hbWVzLm1hcCgobmFtZSkgPT4gbmV3IGpzLlBhcmFtZXRlcihuYW1lKSkudG9MaXN0KCk7CiAgICByZXR1cm4gZmluaXNoRnVuY3Rpb24obm9kZS5wYXJhbXMsIHR5cGVQYXJhbWV0ZXJzLCByZXdyaXR0ZW5Cb2R5LAogICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb25zLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uLCBib2R5U291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdEZ1bihqcy5GdW4gbm9kZSkgewogICAgaWYgKG5vZGUuYXN5bmNNb2RpZmllci5pc0FzeW5jIHx8IG5vZGUuYXN5bmNNb2RpZmllci5pc1lpZWxkaW5nKSB7CiAgICAgIC8vIFRoZSB0cmFuc2xhdGlvbiBkb2VzIG5vdCBoYW5kbGUgbmVzdGVkIGZ1bmN0aW9ucyB0aGF0IGFyZSBnZW5lcmF0b3JzCiAgICAgIC8vIG9yIGFzeW5jaHJvbm91cy4gIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgb25seSBiZSBvbmVzIHRoYXQgYXJlCiAgICAgIC8vIGludHJvZHVjZWQgYnkgSlMgZm9yZWlnbiBjb2RlIGZyb20gb3VyIG93biBsaWJyYXJpZXMuCiAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3IoCiAgICAgICAgICBzcGFubmFibGUsICdOZXN0ZWQgZnVuY3Rpb24gaXMgYSBnZW5lcmF0b3Igb3IgYXN5bmNocm9ub3VzLicpOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIHZpc2l0QWNjZXNzKGpzLlByb3BlcnR5QWNjZXNzIG5vZGUpIHsKICAgIHJldHVybiB3aXRoRXhwcmVzc2lvbjIobm9kZS5yZWNlaXZlciwgbm9kZS5zZWxlY3RvciwKICAgICAgICAocmVjZWl2ZXIsIHNlbGVjdG9yKSA9PiBqcy5qcygnI1sjXScsIFtyZWNlaXZlciwgc2VsZWN0b3JdKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIHZpc2l0QXJyYXlIb2xlKGpzLkFycmF5SG9sZSBub2RlKSB7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRBcnJheUluaXRpYWxpemVyKGpzLkFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewogICAgcmV0dXJuIHdpdGhFeHByZXNzaW9ucyhub2RlLmVsZW1lbnRzLCAoZWxlbWVudHMpIHsKICAgICAgcmV0dXJuIG5ldyBqcy5BcnJheUluaXRpYWxpemVyKGVsZW1lbnRzKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdEFzc2lnbm1lbnQoanMuQXNzaWdubWVudCBub2RlKSB7CiAgICBpZiAoIXNob3VsZFRyYW5zZm9ybShub2RlKSkgewogICAgICByZXR1cm4gbmV3IGpzLkFzc2lnbm1lbnQuY29tcG91bmQodmlzaXRFeHByZXNzaW9uKG5vZGUubGVmdEhhbmRTaWRlKSwKICAgICAgICAgIG5vZGUub3AsIHZpc2l0RXhwcmVzc2lvbihub2RlLnZhbHVlKSk7CiAgICB9CiAgICBqcy5FeHByZXNzaW9uIGxlZnRIYW5kU2lkZSA9IG5vZGUubGVmdEhhbmRTaWRlOwogICAgaWYgKGxlZnRIYW5kU2lkZSBpcyBqcy5WYXJpYWJsZVVzZSkgewogICAgICByZXR1cm4gd2l0aEV4cHJlc3Npb24obm9kZS52YWx1ZSwgKGpzLkV4cHJlc3Npb24gdmFsdWUpIHsKICAgICAgICAvLyBBIG5vbi1jb21wb3VuZCBbanMuQXNzaWdubWVudF0gaGFzIGBvcD09bnVsbGAuIFNvIGl0IHdvcmtzIG91dCB0bwogICAgICAgIC8vIHVzZSBbanMuQXNzaWdubWVudC5jb21wb3VuZF0gZm9yIGFsbCBjYXNlcy4KICAgICAgICAvLyBWaXNpdCB0aGUgW2pzLlZhcmlhYmxlVXNlXSB0byBlbnN1cmUgcmVuYW1pbmcgaXMgZG9uZSBjb3JyZWN0bHkuCiAgICAgICAgcmV0dXJuIG5ldyBqcy5Bc3NpZ25tZW50LmNvbXBvdW5kKAogICAgICAgICAgICB2aXNpdEV4cHJlc3Npb24obGVmdEhhbmRTaWRlKSwgbm9kZS5vcCwgdmFsdWUpOwogICAgICB9LCBzdG9yZTogZmFsc2UpOwogICAgfSBlbHNlIGlmIChsZWZ0SGFuZFNpZGUgaXMganMuUHJvcGVydHlBY2Nlc3MpIHsKICAgICAgcmV0dXJuIHdpdGhFeHByZXNzaW9ucygKICAgICAgICAgIFtsZWZ0SGFuZFNpZGUucmVjZWl2ZXIsIGxlZnRIYW5kU2lkZS5zZWxlY3Rvciwgbm9kZS52YWx1ZV0sCiAgICAgICAgICAoZXZhbHVhdGVkKSB7CiAgICAgICAgcmV0dXJuIG5ldyBqcy5Bc3NpZ25tZW50LmNvbXBvdW5kKAogICAgICAgICAgICBuZXcganMuUHJvcGVydHlBY2Nlc3MoZXZhbHVhdGVkWzBdLCBldmFsdWF0ZWRbMV0pLAogICAgICAgICAgICBub2RlLm9wLAogICAgICAgICAgICBldmFsdWF0ZWRbMl0pOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICJVbmV4cGVjdGVkIGFzc2lnbm1lbnQgbGVmdCBoYW5kIHNpZGUgJGxlZnRIYW5kU2lkZSI7CiAgICB9CiAgfQoKICBqcy5TdGF0ZW1lbnQgYXdhaXRTdGF0ZW1lbnQoCiAgICAgIGpzLkV4cHJlc3Npb24gdmFsdWUsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgLy8vIEFuIGF3YWl0IGlzIHRyYW5zbGF0ZWQgdG8gYW4gW2F3YWl0U3RhdGVtZW50XS4KICAvLy8KICAvLy8gU2VlIHRoZSBjb21tZW50cyBvZiBbcmV3cml0ZUZ1bmN0aW9uXSBmb3IgYW4gZXhhbXBsZS4KICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIHZpc2l0QXdhaXQoanMuQXdhaXQgbm9kZSkgewogICAgYXNzZXJ0KGlzQXN5bmMgfHwgaXNBc3luY1N0YXIpOwogICAgaW50IGFmdGVyQXdhaXQgPSBuZXdMYWJlbCgicmV0dXJuaW5nIGZyb20gYXdhaXQuIik7CiAgICB3aXRoRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24sIChqcy5FeHByZXNzaW9uIHZhbHVlKSB7CiAgICAgIGFkZFN0YXRlbWVudChzZXRHb3RvVmFyaWFibGUoYWZ0ZXJBd2FpdCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICBhZGRTdGF0ZW1lbnQoYXdhaXRTdGF0ZW1lbnQodmFsdWUsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0sIHN0b3JlOiBmYWxzZSk7CiAgICBiZWdpbkxhYmVsKGFmdGVyQXdhaXQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBDaGVja3MgaWYgW25vZGVdIGlzIHRoZSB2YXJpYWJsZSBuYW1lZCBbcmVzdWx0TmFtZV0uCiAgLy8vCiAgLy8vIFtyZXN1bHRdIGlzIHVzZWQgdG8gaG9sZCB0aGUgcmVzdWx0IG9mIGEgdHJhbnNmb3JtZWQgY29tcHV0YXRpb24KICAvLy8gZm9yIGV4YW1wbGUgdGhlIHJlc3VsdCBvZiBhd2FpdGluZywgb3IgdGhlIHJlc3VsdCBvZiBhIGNvbmRpdGlvbmFsIG9yCiAgLy8vIHNob3J0LWNpcmN1aXRpbmcgZXhwcmVzc2lvbi4KICAvLy8gSWYgdGhlIHN1YmV4cHJlc3Npb24gb2Ygc29tZSB0cmFuc2Zvcm1lZCBub2RlIGFscmVhZHkgaXMgdHJhbnNmb3JtZWQgYW5kCiAgLy8vIHZpc2l0aW5nIGl0IHJldHVybnMgW3Jlc3VsdF0sIGl0IGlzIG5vdCByZWR1bmRhbnRseSBhc3NpZ25lZCB0byBpdHNlbGYKICAvLy8gYWdhaW4uCiAgYm9vbCBpc1Jlc3VsdChqcy5FeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBub2RlIGlzIGpzLlZhcmlhYmxlVXNlICYmIG5vZGUubmFtZSA9PSByZXN1bHROYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdEJpbmFyeShqcy5CaW5hcnkgbm9kZSkgewogICAgaWYgKHNob3VsZFRyYW5zZm9ybShub2RlLnJpZ2h0KSAmJiAobm9kZS5vcCA9PSAifHwiIHx8IG5vZGUub3AgPT0gIiYmIikpIHsKICAgICAgaW50IHRoZW5MYWJlbCA9IG5ld0xhYmVsKCJ0aGVuIik7CiAgICAgIGludCBqb2luTGFiZWwgPSBuZXdMYWJlbCgiam9pbiIpOwogICAgICB3aXRoRXhwcmVzc2lvbihub2RlLmxlZnQsIChqcy5FeHByZXNzaW9uIGxlZnQpIHsKICAgICAgICBqcy5TdGF0ZW1lbnQgYXNzaWduTGVmdCA9IGlzUmVzdWx0KGxlZnQpCiAgICAgICAgICAgID8gbmV3IGpzLkJsb2NrLmVtcHR5KCkKICAgICAgICAgICAgOiBqcy5qcy5zdGF0ZW1lbnQoJyMgPSAjOycsIFtyZXN1bHQsIGxlZnRdKTsKICAgICAgICBpZiAobm9kZS5vcCA9PSAiJiYiKSB7CiAgICAgICAgICBhZGRTdGF0ZW1lbnQoanMuanMuc3RhdGVtZW50KCdpZiAoIykgeyN9IGVsc2UgIycsIFsKICAgICAgICAgICAgbGVmdCwKICAgICAgICAgICAgZ290b0FuZEJyZWFrKHRoZW5MYWJlbCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbiksCiAgICAgICAgICAgIGFzc2lnbkxlZnQKICAgICAgICAgIF0pKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXNzZXJ0KG5vZGUub3AgPT0gInx8Iik7CiAgICAgICAgICBhZGRTdGF0ZW1lbnQoanMuanMuc3RhdGVtZW50KCdpZiAoIykgeyN9IGVsc2UgIycsIFsKICAgICAgICAgICAgbGVmdCwKICAgICAgICAgICAgYXNzaWduTGVmdCwKICAgICAgICAgICAgZ290b0FuZEJyZWFrKHRoZW5MYWJlbCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbikKICAgICAgICAgIF0pKTsKICAgICAgICB9CiAgICAgIH0sIHN0b3JlOiB0cnVlKTsKICAgICAgYWRkR290byhqb2luTGFiZWwsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgICBiZWdpbkxhYmVsKHRoZW5MYWJlbCk7CiAgICAgIHdpdGhFeHByZXNzaW9uKG5vZGUucmlnaHQsIChqcy5FeHByZXNzaW9uIHZhbHVlKSB7CiAgICAgICAgaWYgKCFpc1Jlc3VsdCh2YWx1ZSkpIHsKICAgICAgICAgIGFkZFN0YXRlbWVudChqcy5qcy5zdGF0ZW1lbnQoJyMgPSAjOycsIFtyZXN1bHQsIHZhbHVlXSkpOwogICAgICAgIH0KICAgICAgfSwgc3RvcmU6IGZhbHNlKTsKICAgICAgYmVnaW5MYWJlbChqb2luTGFiZWwpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHJldHVybiB3aXRoRXhwcmVzc2lvbjIobm9kZS5sZWZ0LCBub2RlLnJpZ2h0LAogICAgICAgIChsZWZ0LCByaWdodCkgPT4gbmV3IGpzLkJpbmFyeShub2RlLm9wLCBsZWZ0LCByaWdodCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJsb2NrKGpzLkJsb2NrIG5vZGUpIHsKICAgIGZvciAoanMuU3RhdGVtZW50IHN0YXRlbWVudCBpbiBub2RlLnN0YXRlbWVudHMpIHsKICAgICAgdmlzaXRTdGF0ZW1lbnQoc3RhdGVtZW50KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCcmVhayhqcy5CcmVhayBub2RlKSB7CiAgICBqcy5Ob2RlIHRhcmdldCA9IGFuYWx5c2lzLnRhcmdldHNbbm9kZV07CiAgICBpZiAoIXNob3VsZFRyYW5zZm9ybSh0YXJnZXQpKSB7CiAgICAgIGFkZFN0YXRlbWVudChub2RlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdHJhbnNsYXRlSnVtcCh0YXJnZXQsIGJyZWFrTGFiZWxzW3RhcmdldF0sIG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdENhbGwoanMuQ2FsbCBub2RlKSB7CiAgICBib29sIHN0b3JlVGFyZ2V0ID0gbm9kZS5hcmd1bWVudHMuYW55KHNob3VsZFRyYW5zZm9ybSk7CiAgICByZXR1cm4gd2l0aENhbGxUYXJnZXRFeHByZXNzaW9uKG5vZGUudGFyZ2V0LCAodGFyZ2V0KSB7CiAgICAgIHJldHVybiB3aXRoRXhwcmVzc2lvbnMobm9kZS5hcmd1bWVudHMsIChMaXN0PGpzLkV4cHJlc3Npb24+IGFyZ3VtZW50cykgewogICAgICAgIHJldHVybiBuZXcganMuQ2FsbCh0YXJnZXQsIGFyZ3VtZW50cykKICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgfSk7CiAgICB9LCBzdG9yZTogc3RvcmVUYXJnZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENhc2UoanMuQ2FzZSBub2RlKSB7CiAgICByZXR1cm4gdW5yZWFjaGFibGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2F0Y2goanMuQ2F0Y2ggbm9kZSkgewogICAgcmV0dXJuIHVucmVhY2hhYmxlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbW1lbnQoanMuQ29tbWVudCBub2RlKSB7CiAgICBhZGRTdGF0ZW1lbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIHZpc2l0Q29uZGl0aW9uYWwoanMuQ29uZGl0aW9uYWwgbm9kZSkgewogICAgaWYgKCFzaG91bGRUcmFuc2Zvcm0obm9kZS50aGVuKSAmJiAhc2hvdWxkVHJhbnNmb3JtKG5vZGUub3RoZXJ3aXNlKSkgewogICAgICByZXR1cm4ganMuanMoJyMgPyAjIDogIycsIFsKICAgICAgICB2aXNpdEV4cHJlc3Npb24obm9kZS5jb25kaXRpb24pLAogICAgICAgIHZpc2l0RXhwcmVzc2lvbihub2RlLnRoZW4pLAogICAgICAgIHZpc2l0RXhwcmVzc2lvbihub2RlLm90aGVyd2lzZSkKICAgICAgXSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogICAgaW50IHRoZW5MYWJlbCA9IG5ld0xhYmVsKCJ0aGVuIik7CiAgICBpbnQgam9pbkxhYmVsID0gbmV3TGFiZWwoImpvaW4iKTsKICAgIGludCBlbHNlTGFiZWwgPSBuZXdMYWJlbCgiZWxzZSIpOwogICAgd2l0aEV4cHJlc3Npb24obm9kZS5jb25kaXRpb24sIChqcy5FeHByZXNzaW9uIGNvbmRpdGlvbikgewogICAgICBhZGRTdGF0ZW1lbnQoanMuanMuc3RhdGVtZW50KCcjID0gIyA/ICMgOiAjOycsCiAgICAgICAgICBbZ290bywgY29uZGl0aW9uLCBqcy5udW1iZXIodGhlbkxhYmVsKSwganMubnVtYmVyKGVsc2VMYWJlbCldKSk7CiAgICB9LCBzdG9yZTogZmFsc2UpOwogICAgYWRkQnJlYWsobm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICBiZWdpbkxhYmVsKHRoZW5MYWJlbCk7CiAgICB3aXRoRXhwcmVzc2lvbihub2RlLnRoZW4sIChqcy5FeHByZXNzaW9uIHZhbHVlKSB7CiAgICAgIGlmICghaXNSZXN1bHQodmFsdWUpKSB7CiAgICAgICAgYWRkU3RhdGVtZW50KGpzLmpzLnN0YXRlbWVudCgnIyA9ICM7JywgW3Jlc3VsdCwgdmFsdWVdKSk7CiAgICAgIH0KICAgIH0sIHN0b3JlOiBmYWxzZSk7CiAgICBhZGRHb3RvKGpvaW5MYWJlbCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICBiZWdpbkxhYmVsKGVsc2VMYWJlbCk7CiAgICB3aXRoRXhwcmVzc2lvbihub2RlLm90aGVyd2lzZSwgKGpzLkV4cHJlc3Npb24gdmFsdWUpIHsKICAgICAgaWYgKCFpc1Jlc3VsdCh2YWx1ZSkpIHsKICAgICAgICBhZGRTdGF0ZW1lbnQoanMuanMuc3RhdGVtZW50KCcjID0gIzsnLCBbcmVzdWx0LCB2YWx1ZV0pKTsKICAgICAgfQogICAgfSwgc3RvcmU6IGZhbHNlKTsKICAgIGJlZ2luTGFiZWwoam9pbkxhYmVsKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29udGludWUoanMuQ29udGludWUgbm9kZSkgewogICAganMuTm9kZSB0YXJnZXQgPSBhbmFseXNpcy50YXJnZXRzW25vZGVdOwogICAgaWYgKCFzaG91bGRUcmFuc2Zvcm0odGFyZ2V0KSkgewogICAgICBhZGRTdGF0ZW1lbnQobm9kZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRyYW5zbGF0ZUp1bXAodGFyZ2V0LCBjb250aW51ZUxhYmVsc1t0YXJnZXRdLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIC8vLyBFbWl0cyBhIGJyZWFrIHN0YXRlbWVudCB0aGF0IGV4aXRzIHRoZSBiaWcgc3dpdGNoIHN0YXRlbWVudC4KICB2b2lkIGFkZEJyZWFrKFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBpZiAoaW5zaWRlVW50cmFuc2xhdGVkQnJlYWthYmxlKSB7CiAgICAgIGhhc0p1bXBUaG91Z2hPdXRlckxhYmVsID0gdHJ1ZTsKICAgICAgYWRkU3RhdGVtZW50KG5ldyBqcy5CcmVhayhvdXRlckxhYmVsTmFtZSkKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZFN0YXRlbWVudChuZXcganMuQnJlYWsobnVsbCkud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgfQoKICAvLy8gQ29tbW9uIGNvZGUgZm9yIGhhbmRsaW5nIGJyZWFrLCBjb250aW51ZSwgcmV0dXJuLgogIC8vLwogIC8vLyBJdCBpcyBuZWNlc3NhcnkgdG8gcnVuIGFsbCBuZXN0aW5nIGZpbmFsbHktaGFuZGxlcnMgYmV0d2VlbiB0aGUganVtcCBhbmQKICAvLy8gdGhlIHRhcmdldC4gRm9yIHRoYXQgW25leHRdIGlzIHVzZWQgYXMgYSBzdGFjayBvZiBwbGFjZXMgdG8gZ28uCiAgLy8vCiAgLy8vIFNlZSBhbHNvIFtyZXdyaXRlRnVuY3Rpb25dLgogIHZvaWQgdHJhbnNsYXRlSnVtcCgKICAgICAganMuTm9kZSB0YXJnZXQsIGludCB0YXJnZXRMYWJlbCwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIC8vIENvbXB1dGUgYSBzdGFjayBvZiBhbGwgdGhlICdmaW5hbGx5JyBub2RlcyB0aGF0IG11c3QgYmUgdmlzaXRlZCBiZWZvcmUKICAgIC8vIHRoZSBqdW1wLgogICAgLy8gVGhlIGJvdHRvbSBvZiB0aGUgc3RhY2sgaXMgdGhlIGxhYmVsIHdoZXJlIHRoZSBqdW1wIGdvZXMgdG8uCiAgICBMaXN0PGludD4ganVtcFN0YWNrID0gPGludD5bXTsKICAgIGZvciAoanMuTm9kZSBub2RlIGluIGp1bXBUYXJnZXRzLnJldmVyc2VkKSB7CiAgICAgIGlmIChmaW5hbGx5TGFiZWxzW25vZGVdICE9IG51bGwpIHsKICAgICAgICBqdW1wU3RhY2suYWRkKGZpbmFsbHlMYWJlbHNbbm9kZV0pOwogICAgICB9IGVsc2UgaWYgKG5vZGUgPT0gdGFyZ2V0KSB7CiAgICAgICAganVtcFN0YWNrLmFkZCh0YXJnZXRMYWJlbCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgLy8gSWdub3JlIG90aGVyIG5vZGVzLgogICAgfQogICAganVtcFN0YWNrID0ganVtcFN0YWNrLnJldmVyc2VkLnRvTGlzdCgpOwogICAgLy8gQXMgdGhlIHByb2dyYW0ganVtcHMgZGlyZWN0bHkgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2ssIGl0IGlzIHRha2VuIG9mZgogICAgLy8gbm93LgogICAgaW50IGZpcnN0VGFyZ2V0ID0ganVtcFN0YWNrLnJlbW92ZUxhc3QoKTsKICAgIGlmIChqdW1wU3RhY2suaXNOb3RFbXB0eSkgewogICAgICBqcy5FeHByZXNzaW9uIGpzSnVtcFN0YWNrID0gbmV3IGpzLkFycmF5SW5pdGlhbGl6ZXIoCiAgICAgICAgICBqdW1wU3RhY2subWFwKChpbnQgbGFiZWwpID0+IGpzLm51bWJlcihsYWJlbCkpLnRvTGlzdCgpKTsKICAgICAgYWRkU3RhdGVtZW50KG5ldyBqcy5FeHByZXNzaW9uU3RhdGVtZW50KGpzLmpzKCIjID0gIyIsCiAgICAgICAgICBbbmV4dCwganNKdW1wU3RhY2tdKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKSk7CiAgICB9CiAgICBhZGRHb3RvKGZpcnN0VGFyZ2V0LCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RGVmYXVsdChqcy5EZWZhdWx0IG5vZGUpID0+IHVucmVhY2hhYmxlKG5vZGUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RG8oanMuRG8gbm9kZSkgewogICAgaWYgKCFzaG91bGRUcmFuc2Zvcm0obm9kZSkpIHsKICAgICAgYm9vbCBvbGRJbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGUgPSBpbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGU7CiAgICAgIGluc2lkZVVudHJhbnNsYXRlZEJyZWFrYWJsZSA9IHRydWU7CiAgICAgIGFkZFN0YXRlbWVudChqcy5qcy5zdGF0ZW1lbnQoJ2RvIHsjfSB3aGlsZSAoIyknLAogICAgICAgICAgW3RyYW5zbGF0ZVRvU3RhdGVtZW50KG5vZGUuYm9keSksIHZpc2l0RXhwcmVzc2lvbihub2RlLmNvbmRpdGlvbildKSk7CiAgICAgIGluc2lkZVVudHJhbnNsYXRlZEJyZWFrYWJsZSA9IG9sZEluc2lkZVVudHJhbnNsYXRlZEJyZWFrYWJsZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IHN0YXJ0TGFiZWwgPSBuZXdMYWJlbCgiZG8gYm9keSIpOwoKICAgIGludCBjb250aW51ZUxhYmVsID0gbmV3TGFiZWwoImRvIGNvbmRpdGlvbiIpOwogICAgY29udGludWVMYWJlbHNbbm9kZV0gPSBjb250aW51ZUxhYmVsOwoKICAgIGludCBhZnRlckxhYmVsID0gbmV3TGFiZWwoImFmdGVyIGRvIik7CiAgICBicmVha0xhYmVsc1tub2RlXSA9IGFmdGVyTGFiZWw7CgogICAgYmVnaW5MYWJlbChzdGFydExhYmVsKTsKCiAgICBqdW1wVGFyZ2V0cy5hZGQobm9kZSk7CiAgICB2aXNpdFN0YXRlbWVudChub2RlLmJvZHkpOwogICAganVtcFRhcmdldHMucmVtb3ZlTGFzdCgpOwoKICAgIGJlZ2luTGFiZWwoY29udGludWVMYWJlbCk7CiAgICB3aXRoRXhwcmVzc2lvbihub2RlLmNvbmRpdGlvbiwgKGpzLkV4cHJlc3Npb24gY29uZGl0aW9uKSB7CiAgICAgIGFkZFN0YXRlbWVudChqcy5qcy5zdGF0ZW1lbnQoJ2lmICgjKSAjJywKICAgICAgICAgIFtjb25kaXRpb24sIGdvdG9BbmRCcmVhayhzdGFydExhYmVsLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKV0pKTsKICAgIH0sIHN0b3JlOiBmYWxzZSk7CiAgICBiZWdpbkxhYmVsKGFmdGVyTGFiZWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEVtcHR5U3RhdGVtZW50KGpzLkVtcHR5U3RhdGVtZW50IG5vZGUpIHsKICAgIGFkZFN0YXRlbWVudChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KGpzLkV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgdmlzaXRFeHByZXNzaW9uSWdub3JlUmVzdWx0KG5vZGUuZXhwcmVzc2lvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Rm9yKGpzLkZvciBub2RlKSB7CiAgICBpZiAoIXNob3VsZFRyYW5zZm9ybShub2RlKSkgewogICAgICBib29sIG9sZEluc2lkZVVudHJhbnNsYXRlZCA9IGluc2lkZVVudHJhbnNsYXRlZEJyZWFrYWJsZTsKICAgICAgaW5zaWRlVW50cmFuc2xhdGVkQnJlYWthYmxlID0gdHJ1ZTsKICAgICAgLy8gTm90ZSB0aGF0IG5vZGUuaW5pdCwgbm9kZS5jb25kaXRpb24sIG5vZGUudXBkYXRlIGFsbCBjYW4gYmUgbnVsbCwgYnV0CiAgICAgIC8vIHdpdGhFeHByZXNzaW9ucyBoYW5kbGVzIHRoYXQuCiAgICAgIHdpdGhFeHByZXNzaW9ucyhbbm9kZS5pbml0LCBub2RlLmNvbmRpdGlvbiwgbm9kZS51cGRhdGVdLAogICAgICAgICAgKExpc3Q8anMuRXhwcmVzc2lvbj4gdHJhbnNmb3JtZWQpIHsKICAgICAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLkZvcih0cmFuc2Zvcm1lZFswXSwgdHJhbnNmb3JtZWRbMV0sIHRyYW5zZm9ybWVkWzJdLAogICAgICAgICAgICB0cmFuc2xhdGVUb1N0YXRlbWVudChub2RlLmJvZHkpKSk7CiAgICAgIH0pOwogICAgICBpbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGUgPSBvbGRJbnNpZGVVbnRyYW5zbGF0ZWQ7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAobm9kZS5pbml0ICE9IG51bGwpIHsKICAgICAgdmlzaXRFeHByZXNzaW9uSWdub3JlUmVzdWx0KG5vZGUuaW5pdCk7CiAgICB9CiAgICBpbnQgc3RhcnRMYWJlbCA9IG5ld0xhYmVsKCJmb3IgY29uZGl0aW9uIik7CiAgICAvLyBJZiB0aGVyZSBpcyBubyB1cGRhdGUsIGNvbnRpbnVpbmcgdGhlIGxvb3AgaXMgdGhlIHNhbWUgYXMgZ29pbmcgdG8gdGhlCiAgICAvLyBzdGFydC4KICAgIGludCBjb250aW51ZUxhYmVsID0KICAgICAgICAobm9kZS51cGRhdGUgPT0gbnVsbCkgPyBzdGFydExhYmVsIDogbmV3TGFiZWwoImZvciB1cGRhdGUiKTsKICAgIGNvbnRpbnVlTGFiZWxzW25vZGVdID0gY29udGludWVMYWJlbDsKICAgIGludCBhZnRlckxhYmVsID0gbmV3TGFiZWwoImFmdGVyIGZvciIpOwogICAgYnJlYWtMYWJlbHNbbm9kZV0gPSBhZnRlckxhYmVsOwogICAgYmVnaW5MYWJlbChzdGFydExhYmVsKTsKICAgIGpzLkV4cHJlc3Npb24gY29uZGl0aW9uID0gbm9kZS5jb25kaXRpb247CiAgICBpZiAoY29uZGl0aW9uID09IG51bGwgfHwKICAgICAgICAoY29uZGl0aW9uIGlzIGpzLkxpdGVyYWxCb29sICYmIGNvbmRpdGlvbi52YWx1ZSA9PSB0cnVlKSkgewogICAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLkNvbW1lbnQoInRyaXZpYWwgY29uZGl0aW9uIikpOwogICAgfSBlbHNlIHsKICAgICAgd2l0aEV4cHJlc3Npb24oY29uZGl0aW9uLCAoanMuRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKICAgICAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLklmLm5vRWxzZShuZXcganMuUHJlZml4KCIhIiwgY29uZGl0aW9uKSwKICAgICAgICAgICAgZ290b0FuZEJyZWFrKGFmdGVyTGFiZWwsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pKSk7CiAgICAgIH0sIHN0b3JlOiBmYWxzZSk7CiAgICB9CiAgICBqdW1wVGFyZ2V0cy5hZGQobm9kZSk7CiAgICB2aXNpdFN0YXRlbWVudChub2RlLmJvZHkpOwogICAganVtcFRhcmdldHMucmVtb3ZlTGFzdCgpOwogICAgaWYgKG5vZGUudXBkYXRlICE9IG51bGwpIHsKICAgICAgYmVnaW5MYWJlbChjb250aW51ZUxhYmVsKTsKICAgICAgdmlzaXRFeHByZXNzaW9uSWdub3JlUmVzdWx0KG5vZGUudXBkYXRlKTsKICAgIH0KICAgIGFkZEdvdG8oc3RhcnRMYWJlbCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICBiZWdpbkxhYmVsKGFmdGVyTGFiZWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZvckluKGpzLkZvckluIG5vZGUpIHsKICAgIC8vIFRoZSBkYXJ0IG91dHB1dCBjdXJyZW50bHkgbmV2ZXIgdXNlcyBmb3ItaW4gbG9vcHMuCiAgICB0aHJvdyAiSmF2YXNjcmlwdCBmb3ItaW4gbm90IGltcGxlbWVudGVkIHlldCBpbiB0aGUgYXdhaXQgdHJhbnNmb3JtYXRpb24iOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24oanMuRnVuY3Rpb25EZWNsYXJhdGlvbiBub2RlKSB7CiAgICB1bnN1cHBvcnRlZChub2RlKTsKICB9CgogIExpc3Q8anMuU3RhdGVtZW50PiB0cmFuc2xhdGVUb1N0YXRlbWVudFNlcXVlbmNlKGpzLlN0YXRlbWVudCBub2RlKSB7CiAgICBhc3NlcnQoIXNob3VsZFRyYW5zZm9ybShub2RlKSk7CiAgICBMaXN0PGpzLlN0YXRlbWVudD4gb2xkQnVmZmVyID0gY3VycmVudFN0YXRlbWVudEJ1ZmZlcjsKICAgIGN1cnJlbnRTdGF0ZW1lbnRCdWZmZXIgPSA8anMuU3RhdGVtZW50PltdOwogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IHJlc3VsdEJ1ZmZlciA9IGN1cnJlbnRTdGF0ZW1lbnRCdWZmZXI7CiAgICB2aXNpdFN0YXRlbWVudChub2RlKTsKICAgIGN1cnJlbnRTdGF0ZW1lbnRCdWZmZXIgPSBvbGRCdWZmZXI7CiAgICByZXR1cm4gcmVzdWx0QnVmZmVyOwogIH0KCiAganMuU3RhdGVtZW50IHRyYW5zbGF0ZVRvU3RhdGVtZW50KGpzLlN0YXRlbWVudCBub2RlKSB7CiAgICBMaXN0PGpzLlN0YXRlbWVudD4gc3RhdGVtZW50cyA9IHRyYW5zbGF0ZVRvU3RhdGVtZW50U2VxdWVuY2Uobm9kZSk7CiAgICBpZiAoc3RhdGVtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuIHN0YXRlbWVudHMuc2luZ2xlOwogICAgcmV0dXJuIG5ldyBqcy5CbG9jayhzdGF0ZW1lbnRzKTsKICB9CgogIGpzLkJsb2NrIHRyYW5zbGF0ZVRvQmxvY2soanMuU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBuZXcganMuQmxvY2sodHJhbnNsYXRlVG9TdGF0ZW1lbnRTZXF1ZW5jZShub2RlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SWYoanMuSWYgbm9kZSkgewogICAgaWYgKCFzaG91bGRUcmFuc2Zvcm0obm9kZS50aGVuKSAmJiAhc2hvdWxkVHJhbnNmb3JtKG5vZGUub3RoZXJ3aXNlKSkgewogICAgICB3aXRoRXhwcmVzc2lvbihub2RlLmNvbmRpdGlvbiwgKGpzLkV4cHJlc3Npb24gY29uZGl0aW9uKSB7CiAgICAgICAganMuU3RhdGVtZW50IHRyYW5zbGF0ZWRUaGVuID0gdHJhbnNsYXRlVG9TdGF0ZW1lbnQobm9kZS50aGVuKTsKICAgICAgICBqcy5TdGF0ZW1lbnQgdHJhbnNsYXRlZEVsc2UgPSB0cmFuc2xhdGVUb1N0YXRlbWVudChub2RlLm90aGVyd2lzZSk7CiAgICAgICAgYWRkU3RhdGVtZW50KG5ldyBqcy5JZihjb25kaXRpb24sIHRyYW5zbGF0ZWRUaGVuLCB0cmFuc2xhdGVkRWxzZSkpOwogICAgICB9LCBzdG9yZTogZmFsc2UpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgdGhlbkxhYmVsID0gbmV3TGFiZWwoInRoZW4iKTsKICAgIGludCBqb2luTGFiZWwgPSBuZXdMYWJlbCgiam9pbiIpOwogICAgaW50IGVsc2VMYWJlbCA9CiAgICAgICAgKG5vZGUub3RoZXJ3aXNlIGlzIGpzLkVtcHR5U3RhdGVtZW50KSA/IGpvaW5MYWJlbCA6IG5ld0xhYmVsKCJlbHNlIik7CgogICAgd2l0aEV4cHJlc3Npb24obm9kZS5jb25kaXRpb24sIChqcy5FeHByZXNzaW9uIGNvbmRpdGlvbikgewogICAgICBhZGRFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBqcy5Bc3NpZ25tZW50KAogICAgICAgICAgZ290bywKICAgICAgICAgIG5ldyBqcy5Db25kaXRpb25hbCgKICAgICAgICAgICAgICBjb25kaXRpb24sIGpzLm51bWJlcih0aGVuTGFiZWwpLCBqcy5udW1iZXIoZWxzZUxhYmVsKSkpKTsKICAgIH0sIHN0b3JlOiBmYWxzZSk7CiAgICBhZGRCcmVhayhub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGJlZ2luTGFiZWwodGhlbkxhYmVsKTsKICAgIHZpc2l0U3RhdGVtZW50KG5vZGUudGhlbik7CiAgICBpZiAobm9kZS5vdGhlcndpc2UgaXMhIGpzLkVtcHR5U3RhdGVtZW50KSB7CiAgICAgIGFkZEdvdG8oam9pbkxhYmVsLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgYmVnaW5MYWJlbChlbHNlTGFiZWwpOwogICAgICB2aXNpdFN0YXRlbWVudChub2RlLm90aGVyd2lzZSk7CiAgICB9CiAgICBiZWdpbkxhYmVsKGpvaW5MYWJlbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEludGVycG9sYXRlZEV4cHJlc3Npb24oanMuSW50ZXJwb2xhdGVkRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEludGVycG9sYXRlZERlY2xhcmF0aW9uKGpzLkludGVycG9sYXRlZERlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0SW50ZXJwb2xhdGVkTGl0ZXJhbChqcy5JbnRlcnBvbGF0ZWRMaXRlcmFsIG5vZGUpID0+IHVuc3VwcG9ydGVkKG5vZGUpOwoKICBAb3ZlcnJpZGUKICB2aXNpdEludGVycG9sYXRlZFBhcmFtZXRlcihqcy5JbnRlcnBvbGF0ZWRQYXJhbWV0ZXIgbm9kZSkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnRlcnBvbGF0ZWRTZWxlY3Rvcihqcy5JbnRlcnBvbGF0ZWRTZWxlY3RvciBub2RlKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEludGVycG9sYXRlZFN0YXRlbWVudChqcy5JbnRlcnBvbGF0ZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoanMuTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoIXNob3VsZFRyYW5zZm9ybShub2RlKSkgewogICAgICBhZGRTdGF0ZW1lbnQoCiAgICAgICAgICBuZXcganMuTGFiZWxlZFN0YXRlbWVudChub2RlLmxhYmVsLCB0cmFuc2xhdGVUb1N0YXRlbWVudChub2RlLmJvZHkpKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIGBjb250aW51ZSBsYWJlbGAgaXMgcmVhbGx5IGNvbnRpbnVpbmcgdGhlIG5lc3RlZCBsb29wLgogICAgLy8gVGhpcyBpcyBzZXQgdXAgaW4gW1ByZVRyYW5zbGF0aW9uQW5hbHlzaXMudmlzaXRDb250aW51ZV0uCiAgICAvLyBIZXJlIHdlIG9ubHkgbmVlZCBhIGJyZWFrTGFiZWw6CiAgICBpbnQgYnJlYWtMYWJlbCA9IG5ld0xhYmVsKCJicmVhayAke25vZGUubGFiZWx9Iik7CiAgICBicmVha0xhYmVsc1tub2RlXSA9IGJyZWFrTGFiZWw7CgogICAganVtcFRhcmdldHMuYWRkKG5vZGUpOwogICAgdmlzaXRTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICAgIGp1bXBUYXJnZXRzLnJlbW92ZUxhc3QoKTsKICAgIGJlZ2luTGFiZWwoYnJlYWtMYWJlbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIHZpc2l0TGl0ZXJhbEJvb2woanMuTGl0ZXJhbEJvb2wgbm9kZSkgPT4gbm9kZTsKCiAgQG92ZXJyaWRlCiAgdmlzaXRMaXRlcmFsRXhwcmVzc2lvbihqcy5MaXRlcmFsRXhwcmVzc2lvbiBub2RlKSA9PiB1bnN1cHBvcnRlZChub2RlKTsKCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdExpdGVyYWxOdWxsKGpzLkxpdGVyYWxOdWxsIG5vZGUpID0+IG5vZGU7CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRMaXRlcmFsTnVtYmVyKGpzLkxpdGVyYWxOdW1iZXIgbm9kZSkgPT4gbm9kZTsKCiAgQG92ZXJyaWRlCiAgdmlzaXRMaXRlcmFsU3RhdGVtZW50KGpzLkxpdGVyYWxTdGF0ZW1lbnQgbm9kZSkgPT4gdW5zdXBwb3J0ZWQobm9kZSk7CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRMaXRlcmFsU3RyaW5nKGpzLkxpdGVyYWxTdHJpbmcgbm9kZSkgPT4gbm9kZTsKCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oanMuU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSA9PiBub2RlOwoKICBAb3ZlcnJpZGUKICBqcy5OYW1lIHZpc2l0TmFtZShqcy5OYW1lIG5vZGUpID0+IG5vZGU7CgogIEBvdmVycmlkZQogIGpzLlBhcmVudGhlc2VzIHZpc2l0UGFyZW50aGVzZXMoanMuUGFyZW50aGVzZXMgbm9kZSkgewogICAgdW5zdXBwb3J0ZWQobm9kZSk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0TmFtZWRGdW5jdGlvbihqcy5OYW1lZEZ1bmN0aW9uIG5vZGUpIHsKICAgIHVuc3VwcG9ydGVkKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdERlZmVycmVkRXhwcmVzc2lvbihqcy5EZWZlcnJlZEV4cHJlc3Npb24gbm9kZSkgPT4gbm9kZTsKCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdERlZmVycmVkTnVtYmVyKGpzLkRlZmVycmVkTnVtYmVyIG5vZGUpID0+IG5vZGU7CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXREZWZlcnJlZFN0cmluZyhqcy5EZWZlcnJlZFN0cmluZyBub2RlKSA9PiBub2RlOwoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIHZpc2l0TmV3KGpzLk5ldyBub2RlKSB7CiAgICBib29sIHN0b3JlVGFyZ2V0ID0gbm9kZS5hcmd1bWVudHMuYW55KHNob3VsZFRyYW5zZm9ybSk7CiAgICByZXR1cm4gd2l0aENhbGxUYXJnZXRFeHByZXNzaW9uKG5vZGUudGFyZ2V0LCAodGFyZ2V0KSB7CiAgICAgIHJldHVybiB3aXRoRXhwcmVzc2lvbnMobm9kZS5hcmd1bWVudHMsIChMaXN0PGpzLkV4cHJlc3Npb24+IGFyZ3VtZW50cykgewogICAgICAgIHJldHVybiBuZXcganMuTmV3KHRhcmdldCwgYXJndW1lbnRzKTsKICAgICAgfSk7CiAgICB9LCBzdG9yZTogc3RvcmVUYXJnZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdE9iamVjdEluaXRpYWxpemVyKGpzLk9iamVjdEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHJldHVybiB3aXRoRXhwcmVzc2lvbnMoCiAgICAgICAgbm9kZS5wcm9wZXJ0aWVzLm1hcCgoanMuUHJvcGVydHkgcHJvcGVydHkpID0+IHByb3BlcnR5LnZhbHVlKS50b0xpc3QoKSwKICAgICAgICAoTGlzdDxqcy5Ob2RlPiB2YWx1ZXMpIHsKICAgICAgTGlzdDxqcy5Qcm9wZXJ0eT4gcHJvcGVydGllcyA9IG5ldyBMaXN0LmdlbmVyYXRlKHZhbHVlcy5sZW5ndGgsIChpbnQgaSkgewogICAgICAgIHJldHVybiBuZXcganMuUHJvcGVydHkobm9kZS5wcm9wZXJ0aWVzW2ldLm5hbWUsIHZhbHVlc1tpXSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3IGpzLk9iamVjdEluaXRpYWxpemVyKHByb3BlcnRpZXMpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFBhcmFtZXRlcihqcy5QYXJhbWV0ZXIgbm9kZSkgPT4gdW5yZWFjaGFibGUobm9kZSk7CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRQb3N0Zml4KGpzLlBvc3RmaXggbm9kZSkgewogICAgaWYgKG5vZGUub3AgPT0gIisrIiB8fCBub2RlLm9wID09ICItLSIpIHsKICAgICAganMuRXhwcmVzc2lvbiBhcmd1bWVudCA9IG5vZGUuYXJndW1lbnQ7CiAgICAgIGlmIChhcmd1bWVudCBpcyBqcy5WYXJpYWJsZVVzZSkgewogICAgICAgIHJldHVybiBuZXcganMuUG9zdGZpeChub2RlLm9wLCB2aXNpdEV4cHJlc3Npb24oYXJndW1lbnQpKTsKICAgICAgfSBlbHNlIGlmIChhcmd1bWVudCBpcyBqcy5Qcm9wZXJ0eUFjY2VzcykgewogICAgICAgIHJldHVybiB3aXRoRXhwcmVzc2lvbjIoYXJndW1lbnQucmVjZWl2ZXIsIGFyZ3VtZW50LnNlbGVjdG9yLAogICAgICAgICAgICAocmVjZWl2ZXIsIHNlbGVjdG9yKSB7CiAgICAgICAgICByZXR1cm4gbmV3IGpzLlBvc3RmaXgoCiAgICAgICAgICAgICAgbm9kZS5vcCwgbmV3IGpzLlByb3BlcnR5QWNjZXNzKHJlY2VpdmVyLCBzZWxlY3RvcikpOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93ICJVbmV4cGVjdGVkIHBvc3RmaXggJHtub2RlLm9wfSAiCiAgICAgICAgICAgICJvcGVyYXRvciBhcmd1bWVudCAke25vZGUuYXJndW1lbnR9IjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHdpdGhFeHByZXNzaW9uKG5vZGUuYXJndW1lbnQsCiAgICAgICAgKGpzLkV4cHJlc3Npb24gYXJndW1lbnQpID0+IG5ldyBqcy5Qb3N0Zml4KG5vZGUub3AsIGFyZ3VtZW50KSwKICAgICAgICBzdG9yZTogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdFByZWZpeChqcy5QcmVmaXggbm9kZSkgewogICAgaWYgKG5vZGUub3AgPT0gIisrIiB8fCBub2RlLm9wID09ICItLSIpIHsKICAgICAganMuRXhwcmVzc2lvbiBhcmd1bWVudCA9IG5vZGUuYXJndW1lbnQ7CiAgICAgIGlmIChhcmd1bWVudCBpcyBqcy5WYXJpYWJsZVVzZSkgewogICAgICAgIHJldHVybiBuZXcganMuUHJlZml4KG5vZGUub3AsIHZpc2l0RXhwcmVzc2lvbihhcmd1bWVudCkpOwogICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50IGlzIGpzLlByb3BlcnR5QWNjZXNzKSB7CiAgICAgICAgcmV0dXJuIHdpdGhFeHByZXNzaW9uMihhcmd1bWVudC5yZWNlaXZlciwgYXJndW1lbnQuc2VsZWN0b3IsCiAgICAgICAgICAgIChyZWNlaXZlciwgc2VsZWN0b3IpIHsKICAgICAgICAgIHJldHVybiBuZXcganMuUHJlZml4KAogICAgICAgICAgICAgIG5vZGUub3AsIG5ldyBqcy5Qcm9wZXJ0eUFjY2VzcyhyZWNlaXZlciwgc2VsZWN0b3IpKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyAiVW5leHBlY3RlZCBwcmVmaXggJHtub2RlLm9wfSBvcGVyYXRvciAiCiAgICAgICAgICAgICJhcmd1bWVudCAke25vZGUuYXJndW1lbnR9IjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHdpdGhFeHByZXNzaW9uKG5vZGUuYXJndW1lbnQsCiAgICAgICAgKGpzLkV4cHJlc3Npb24gYXJndW1lbnQpID0+IG5ldyBqcy5QcmVmaXgobm9kZS5vcCwgYXJndW1lbnQpLAogICAgICAgIHN0b3JlOiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb2dyYW0oanMuUHJvZ3JhbSBub2RlKSA9PiB1bnN1cHBvcnRlZChub2RlKTsKCiAgQG92ZXJyaWRlCiAganMuUHJvcGVydHkgdmlzaXRQcm9wZXJ0eShqcy5Qcm9wZXJ0eSBub2RlKSB7CiAgICByZXR1cm4gd2l0aEV4cHJlc3Npb24oCiAgICAgICAgbm9kZS52YWx1ZSwgKGpzLkV4cHJlc3Npb24gdmFsdWUpID0+IG5ldyBqcy5Qcm9wZXJ0eShub2RlLm5hbWUsIHZhbHVlKSwKICAgICAgICBzdG9yZTogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdFJlZ0V4cExpdGVyYWwoanMuUmVnRXhwTGl0ZXJhbCBub2RlKSA9PiBub2RlOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UmV0dXJuKGpzLlJldHVybiBub2RlKSB7CiAgICBqcy5Ob2RlIHRhcmdldCA9IGFuYWx5c2lzLnRhcmdldHNbbm9kZV07CiAgICBpZiAobm9kZS52YWx1ZSAhPSBudWxsKSB7CiAgICAgIGlmIChpc1N5bmNTdGFyIHx8IGlzQXN5bmNTdGFyKSB7CiAgICAgICAgLy8gRXZlbiB0aG91Z2ggYHJldHVybiBleHByO2AgaXMgbm90IGFsbG93ZWQgaW4gdGhlIGRhcnQgc3luYyogYW5kCiAgICAgICAgLy8gYXN5bmMqICBjb2RlLCB0aGUgYmFja2VuZCBzb21ldGltZXMgZ2VuZXJhdGVzIGNvZGUgbGlrZSB0aGlzLCBidXQKICAgICAgICAvLyBvbmx5IHdoZW4gaXQgaXMga25vd24gdGhhdCB0aGUgJ2V4cHInIHRocm93cywgYW5kIHRoZSByZXR1cm4gaXMganVzdAogICAgICAgIC8vIHRvIHRlbGwgdGhlIEphdmFTY3JpcHQgVk0gdGhhdCB0aGUgY29kZSB3b24ndCBjb250aW51ZSBoZXJlLgogICAgICAgIC8vIEl0IGlzIHRoZXJlZm9yZSBpbnRlcnByZXRlZCBhcyBgZXhwcjsgcmV0dXJuO2AKICAgICAgICB2aXNpdEV4cHJlc3Npb25JZ25vcmVSZXN1bHQobm9kZS52YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2l0aEV4cHJlc3Npb24obm9kZS52YWx1ZSwgKGpzLkV4cHJlc3Npb24gdmFsdWUpIHsKICAgICAgICAgIGFkZFN0YXRlbWVudChqcy5qcwogICAgICAgICAgICAgIC5zdGF0ZW1lbnQoIiMgPSAjOyIsIFtyZXR1cm5WYWx1ZSwgdmFsdWVdKS53aXRoU291cmNlSW5mb3JtYXRpb24oCiAgICAgICAgICAgICAgICAgIG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgICB9LCBzdG9yZTogZmFsc2UpOwogICAgICB9CiAgICB9CiAgICB0cmFuc2xhdGVKdW1wKHRhcmdldCwgZXhpdExhYmVsLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTd2l0Y2goanMuU3dpdGNoIG5vZGUpIHsKICAgIGlmICghbm9kZS5jYXNlcy5hbnkoc2hvdWxkVHJhbnNmb3JtKSkgewogICAgICAvLyBJZiBvbmx5IHRoZSBrZXkgaGFzIGFuIGF3YWl0LCB0cmFuc2xhdGlvbiBjYW4gYmUgc2ltcGxpZmllZC4KICAgICAgYm9vbCBvbGRJbnNpZGVVbnRyYW5zbGF0ZWQgPSBpbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGU7CiAgICAgIGluc2lkZVVudHJhbnNsYXRlZEJyZWFrYWJsZSA9IHRydWU7CiAgICAgIHdpdGhFeHByZXNzaW9uKG5vZGUua2V5LCAoanMuRXhwcmVzc2lvbiBrZXkpIHsKICAgICAgICBMaXN0PGpzLlN3aXRjaENsYXVzZT4gY2FzZXMgPSBub2RlLmNhc2VzLm1hcCgoanMuU3dpdGNoQ2xhdXNlIGNsYXVzZSkgewogICAgICAgICAgaWYgKGNsYXVzZSBpcyBqcy5DYXNlKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcganMuQ2FzZSgKICAgICAgICAgICAgICAgIGNsYXVzZS5leHByZXNzaW9uLCB0cmFuc2xhdGVUb0Jsb2NrKGNsYXVzZS5ib2R5KSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbmV3IGpzLkRlZmF1bHQoCiAgICAgICAgICAgICAgICB0cmFuc2xhdGVUb0Jsb2NrKChjbGF1c2UgYXMganMuRGVmYXVsdCkuYm9keSkpOwogICAgICAgICAgfQogICAgICAgIH0pLnRvTGlzdCgpOwogICAgICAgIGFkZFN0YXRlbWVudChuZXcganMuU3dpdGNoKGtleSwgY2FzZXMpKTsKICAgICAgfSwgc3RvcmU6IGZhbHNlKTsKICAgICAgaW5zaWRlVW50cmFuc2xhdGVkQnJlYWthYmxlID0gb2xkSW5zaWRlVW50cmFuc2xhdGVkOwogICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgYmVmb3JlID0gbmV3TGFiZWwoInN3aXRjaCIpOwogICAgaW50IGFmdGVyID0gbmV3TGFiZWwoImFmdGVyIHN3aXRjaCIpOwogICAgYnJlYWtMYWJlbHNbbm9kZV0gPSBhZnRlcjsKCiAgICBiZWdpbkxhYmVsKGJlZm9yZSk7CiAgICBMaXN0PGludD4gbGFiZWxzID0gbmV3IExpc3Q8aW50Pihub2RlLmNhc2VzLmxlbmd0aCk7CgogICAgYm9vbCBhbnlDYXNlRXhwcmVzc2lvblRyYW5zZm9ybWVkID0gbm9kZS5jYXNlcy5hbnkoCiAgICAgICAgKGpzLlN3aXRjaENsYXVzZSB4KSA9PiB4IGlzIGpzLkNhc2UgJiYgc2hvdWxkVHJhbnNmb3JtKHguZXhwcmVzc2lvbikpOwogICAgaWYgKGFueUNhc2VFeHByZXNzaW9uVHJhbnNmb3JtZWQpIHsKICAgICAgaW50IGRlZmF1bHRJbmRleCA9IG51bGw7IC8vIE51bGwgbWVhbnMgbm8gZGVmYXVsdCB3YXMgZm91bmQuCiAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGF3YWl0IGluIG9uZSBvZiB0aGUga2V5cywgYSBjaGFpbiBvZiBpZnMgaGFzIHRvIGJlIHVzZWQuCgogICAgICB3aXRoRXhwcmVzc2lvbihub2RlLmtleSwgKGpzLkV4cHJlc3Npb24ga2V5KSB7CiAgICAgICAgaW50IGkgPSAwOwogICAgICAgIGZvciAoanMuU3dpdGNoQ2xhdXNlIGNsYXVzZSBpbiBub2RlLmNhc2VzKSB7CiAgICAgICAgICBpZiAoY2xhdXNlIGlzIGpzLkRlZmF1bHQpIHsKICAgICAgICAgICAgLy8gVGhlIGdvdG8gZm9yIHRoZSBkZWZhdWx0IGNhc2UgaXMgYWRkZWQgYWZ0ZXIgYWxsIG5vbi1kZWZhdWx0CiAgICAgICAgICAgIC8vIGNsYXVzZXMgaGF2ZSBiZWVuIGhhbmRsZWQuCiAgICAgICAgICAgIGRlZmF1bHRJbmRleCA9IGk7CiAgICAgICAgICAgIGxhYmVsc1tpXSA9IG5ld0xhYmVsKCJkZWZhdWx0Iik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfSBlbHNlIGlmIChjbGF1c2UgaXMganMuQ2FzZSkgewogICAgICAgICAgICBsYWJlbHNbaV0gPSBuZXdMYWJlbCgiY2FzZSIpOwogICAgICAgICAgICB3aXRoRXhwcmVzc2lvbihjbGF1c2UuZXhwcmVzc2lvbiwgKGV4cHJlc3Npb24pIHsKICAgICAgICAgICAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLklmLm5vRWxzZSgKICAgICAgICAgICAgICAgICAgbmV3IGpzLkJpbmFyeSgiPT09Iiwga2V5LCBleHByZXNzaW9uKSwKICAgICAgICAgICAgICAgICAgZ290b0FuZEJyZWFrKGxhYmVsc1tpXSwgY2xhdXNlLnNvdXJjZUluZm9ybWF0aW9uKSkpOwogICAgICAgICAgICB9LCBzdG9yZTogZmFsc2UpOwogICAgICAgICAgfQogICAgICAgICAgaSsrOwogICAgICAgIH0KICAgICAgfSwgc3RvcmU6IHRydWUpOwoKICAgICAgaWYgKGRlZmF1bHRJbmRleCA9PSBudWxsKSB7CiAgICAgICAgYWRkR290byhhZnRlciwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWRkR290byhsYWJlbHNbZGVmYXVsdEluZGV4XSwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGJvb2wgaGFzRGVmYXVsdCA9IGZhbHNlOwogICAgICBpbnQgaSA9IDA7CiAgICAgIExpc3Q8anMuU3dpdGNoQ2xhdXNlPiBjbGF1c2VzID0gPGpzLlN3aXRjaENsYXVzZT5bXTsKICAgICAgZm9yIChqcy5Td2l0Y2hDbGF1c2UgY2xhdXNlIGluIG5vZGUuY2FzZXMpIHsKICAgICAgICBpZiAoY2xhdXNlIGlzIGpzLkNhc2UpIHsKICAgICAgICAgIGxhYmVsc1tpXSA9IG5ld0xhYmVsKCJjYXNlIik7CiAgICAgICAgICBjbGF1c2VzLmFkZChuZXcganMuQ2FzZSh2aXNpdEV4cHJlc3Npb24oY2xhdXNlLmV4cHJlc3Npb24pLAogICAgICAgICAgICAgIGdvdG9BbmRCcmVhayhsYWJlbHNbaV0sIGNsYXVzZS5zb3VyY2VJbmZvcm1hdGlvbikpKTsKICAgICAgICB9IGVsc2UgaWYgKGNsYXVzZSBpcyBqcy5EZWZhdWx0KSB7CiAgICAgICAgICBsYWJlbHNbaV0gPSBuZXdMYWJlbCgiZGVmYXVsdCIpOwogICAgICAgICAgY2xhdXNlcy5hZGQobmV3IGpzLkRlZmF1bHQoCiAgICAgICAgICAgICAgZ290b0FuZEJyZWFrKGxhYmVsc1tpXSwgY2xhdXNlLnNvdXJjZUluZm9ybWF0aW9uKSkpOwogICAgICAgICAgaGFzRGVmYXVsdCA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlcG9ydGVyLmludGVybmFsRXJyb3Ioc3Bhbm5hYmxlLCAiVW5rbm93biBjbGF1c2UgdHlwZSAkY2xhdXNlIik7CiAgICAgICAgfQogICAgICAgIGkrKzsKICAgICAgfQogICAgICBpZiAoIWhhc0RlZmF1bHQpIHsKICAgICAgICBjbGF1c2VzCiAgICAgICAgICAgIC5hZGQobmV3IGpzLkRlZmF1bHQoZ290b0FuZEJyZWFrKGFmdGVyLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKSkpOwogICAgICB9CiAgICAgIHdpdGhFeHByZXNzaW9uKG5vZGUua2V5LCAoanMuRXhwcmVzc2lvbiBrZXkpIHsKICAgICAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLlN3aXRjaChrZXksIGNsYXVzZXMpKTsKICAgICAgfSwgc3RvcmU6IGZhbHNlKTsKCiAgICAgIGFkZEJyZWFrKG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgfQoKICAgIGp1bXBUYXJnZXRzLmFkZChub2RlKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGJlZ2luTGFiZWwobGFiZWxzW2ldKTsKICAgICAgdmlzaXRTdGF0ZW1lbnQobm9kZS5jYXNlc1tpXS5ib2R5KTsKICAgIH0KICAgIGJlZ2luTGFiZWwoYWZ0ZXIpOwogICAganVtcFRhcmdldHMucmVtb3ZlTGFzdCgpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuRXhwcmVzc2lvbiB2aXNpdFRoaXMoanMuVGhpcyBub2RlKSB7CiAgICByZXR1cm4gc2VsZjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUaHJvdyhqcy5UaHJvdyBub2RlKSB7CiAgICB3aXRoRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24sIChqcy5FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgICAgYWRkU3RhdGVtZW50KG5ldyBqcy5UaHJvdyhleHByZXNzaW9uKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9LCBzdG9yZTogZmFsc2UpOwogIH0KCiAgc2V0RXJyb3JIYW5kbGVyKFtpbnQgZXJyb3JIYW5kbGVyXSkgewogICAgaGFzSGFuZGxlckxhYmVscyA9IHRydWU7IC8vIFRPRE8oc3JhKTogQWRkIHNob3J0IGZvcm0gZXJyb3IgaGFuZGxlci4KICAgIGpzLkV4cHJlc3Npb24gbGFiZWwgPQogICAgICAgIChlcnJvckhhbmRsZXIgPT0gbnVsbCkgPyBjdXJyZW50RXJyb3JIYW5kbGVyIDoganMubnVtYmVyKGVycm9ySGFuZGxlcik7CiAgICBhZGRTdGF0ZW1lbnQoanMuanMuc3RhdGVtZW50KCcjID0gIzsnLCBbaGFuZGxlciwgbGFiZWxdKSk7CiAgfQoKICBMaXN0PGludD4gX2ZpbmFsbGllc1VwVG9BbmRFbmNsb3NpbmdIYW5kbGVyKCkgewogICAgTGlzdDxpbnQ+IHJlc3VsdCA9IDxpbnQ+W107CiAgICBmb3IgKGludCBpID0ganVtcFRhcmdldHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAganMuTm9kZSBub2RlID0ganVtcFRhcmdldHNbaV07CiAgICAgIGludCBoYW5kbGVyTGFiZWwgPSBoYW5kbGVyTGFiZWxzW25vZGVdOwogICAgICBpZiAoaGFuZGxlckxhYmVsICE9IG51bGwpIHsKICAgICAgICByZXN1bHQuYWRkKGhhbmRsZXJMYWJlbCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaW50IGZpbmFsbHlMYWJlbCA9IGZpbmFsbHlMYWJlbHNbbm9kZV07CiAgICAgIGlmIChmaW5hbGx5TGFiZWwgIT0gbnVsbCkgewogICAgICAgIHJlc3VsdC5hZGQoZmluYWxseUxhYmVsKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdC5yZXZlcnNlZC50b0xpc3QoKTsKICB9CgogIC8vLyBTZWUgdGhlIGNvbW1lbnRzIG9mIFtyZXdyaXRlRnVuY3Rpb25dIGZvciBtb3JlIGV4cGxhbmF0aW9uLgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUcnkoanMuVHJ5IG5vZGUpIHsKICAgIGlmICghc2hvdWxkVHJhbnNmb3JtKG5vZGUpKSB7CiAgICAgIGpzLkJsb2NrIGJvZHkgPSB0cmFuc2xhdGVUb0Jsb2NrKG5vZGUuYm9keSk7CiAgICAgIGpzLkNhdGNoIGNhdGNoUGFydCA9IChub2RlLmNhdGNoUGFydCA9PSBudWxsKQogICAgICAgICAgPyBudWxsCiAgICAgICAgICA6IG5ldyBqcy5DYXRjaChub2RlLmNhdGNoUGFydC5kZWNsYXJhdGlvbiwKICAgICAgICAgICAgICB0cmFuc2xhdGVUb0Jsb2NrKG5vZGUuY2F0Y2hQYXJ0LmJvZHkpKTsKICAgICAganMuQmxvY2sgZmluYWxseVBhcnQgPSAobm9kZS5maW5hbGx5UGFydCA9PSBudWxsKQogICAgICAgICAgPyBudWxsCiAgICAgICAgICA6IHRyYW5zbGF0ZVRvQmxvY2sobm9kZS5maW5hbGx5UGFydCk7CiAgICAgIGFkZFN0YXRlbWVudChuZXcganMuVHJ5KGJvZHksIGNhdGNoUGFydCwgZmluYWxseVBhcnQpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGhhc1RyeUJsb2NrcyA9IHRydWU7CiAgICBpbnQgdW5jYXVnaHRMYWJlbCA9IG5ld0xhYmVsKCJ1bmNhdWdodCIpOwogICAgaW50IGhhbmRsZXJMYWJlbCA9CiAgICAgICAgKG5vZGUuY2F0Y2hQYXJ0ID09IG51bGwpID8gdW5jYXVnaHRMYWJlbCA6IG5ld0xhYmVsKCJjYXRjaCIpOwoKICAgIGludCBmaW5hbGx5TGFiZWwgPSBuZXdMYWJlbCgiZmluYWxseSIpOwogICAgaW50IGFmdGVyRmluYWxseUxhYmVsID0gbmV3TGFiZWwoImFmdGVyIGZpbmFsbHkiKTsKICAgIGlmIChub2RlLmZpbmFsbHlQYXJ0ICE9IG51bGwpIHsKICAgICAgZmluYWxseUxhYmVsc1tub2RlLmZpbmFsbHlQYXJ0XSA9IGZpbmFsbHlMYWJlbDsKICAgICAganVtcFRhcmdldHMuYWRkKG5vZGUuZmluYWxseVBhcnQpOwogICAgfQoKICAgIGhhbmRsZXJMYWJlbHNbbm9kZV0gPSBoYW5kbGVyTGFiZWw7CiAgICBqdW1wVGFyZ2V0cy5hZGQobm9kZSk7CgogICAgLy8gU2V0IHRoZSBlcnJvciBoYW5kbGVyIGhlcmUuIEl0IG11c3QgYmUgY2xlYXJlZCBvbiBldmVyeSBwYXRoIG91dDsKICAgIC8vIG5vcm1hbCBhbmQgZXJyb3IgZXhpdC4KICAgIHNldEVycm9ySGFuZGxlcigpOwoKICAgIHZpc2l0U3RhdGVtZW50KG5vZGUuYm9keSk7CgogICAganMuTm9kZSBsYXN0ID0ganVtcFRhcmdldHMucmVtb3ZlTGFzdCgpOwogICAgYXNzZXJ0KGxhc3QgPT0gbm9kZSk7CgogICAgaWYgKG5vZGUuZmluYWxseVBhcnQgPT0gbnVsbCkgewogICAgICBzZXRFcnJvckhhbmRsZXIoKTsKICAgICAgYWRkR290byhhZnRlckZpbmFsbHlMYWJlbCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9IGVsc2UgewogICAgICAvLyBUaGUgaGFuZGxlciBpcyByZXNldCBhcyB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGZpbmFsbHkgYmxvY2suCiAgICAgIGFkZFN0YXRlbWVudCgKICAgICAgICAgIGpzLmpzLnN0YXRlbWVudCgiIy5wdXNoKCMpOyIsIFtuZXh0LCBqcy5udW1iZXIoYWZ0ZXJGaW5hbGx5TGFiZWwpXSkpOwogICAgICBhZGRHb3RvKGZpbmFsbHlMYWJlbCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CgogICAgaWYgKG5vZGUuY2F0Y2hQYXJ0ICE9IG51bGwpIHsKICAgICAgYmVnaW5MYWJlbChoYW5kbGVyTGFiZWwpOwogICAgICAvLyBbdW5jYXVnaHRMYWJlbF0gaXMgdGhlIGhhbmRsZXIgZm9yIHRoZSBjb2RlIGluIHRoZSBjYXRjaC1wYXJ0LgogICAgICAvLyBJdCBlbnN1cmVzIHRoYXQgW25leHROYW1lXSBpcyBzZXQgdXAgdG8gcnVuIHRoZSByaWdodCBmaW5hbGx5IGJsb2Nrcy4KICAgICAgaGFuZGxlckxhYmVsc1tub2RlLmNhdGNoUGFydF0gPSB1bmNhdWdodExhYmVsOwogICAgICBqdW1wVGFyZ2V0cy5hZGQobm9kZS5jYXRjaFBhcnQpOwogICAgICBzZXRFcnJvckhhbmRsZXIoKTsKICAgICAgLy8gVGhlIGNhdGNoIGRlY2xhcmF0aW9uIG5hbWUgY2FuIHNoYWRvdyBvdXRlciB2YXJpYWJsZXMsIHNvIGEgZnJlc2ggbmFtZQogICAgICAvLyBpcyBuZWVkZWQgdG8gYXZvaWQgY29sbGlzaW9ucy4gIFNlZSBFY21hIDI2MiwgM3JkIGVkaXRpb24sCiAgICAgIC8vIHNlY3Rpb24gMTIuMTQuCiAgICAgIFN0cmluZyBlcnJvclJlbmFtZSA9IGZyZXNoTmFtZShub2RlLmNhdGNoUGFydC5kZWNsYXJhdGlvbi5uYW1lKTsKICAgICAgbG9jYWxWYXJpYWJsZXMuYWRkKG5ldyBqcy5WYXJpYWJsZURlY2xhcmF0aW9uKGVycm9yUmVuYW1lKSk7CiAgICAgIHZhcmlhYmxlUmVuYW1pbmdzCiAgICAgICAgICAuYWRkKG5ldyBQYWlyKG5vZGUuY2F0Y2hQYXJ0LmRlY2xhcmF0aW9uLm5hbWUsIGVycm9yUmVuYW1lKSk7CiAgICAgIGFkZFN0YXRlbWVudChqcy5qcy5zdGF0ZW1lbnQoIiMgPSAjOyIsIFtlcnJvclJlbmFtZSwgY3VycmVudEVycm9yXSkpOwogICAgICB2aXNpdFN0YXRlbWVudChub2RlLmNhdGNoUGFydC5ib2R5KTsKICAgICAgdmFyaWFibGVSZW5hbWluZ3MucmVtb3ZlTGFzdCgpOwogICAgICBpZiAobm9kZS5maW5hbGx5UGFydCAhPSBudWxsKSB7CiAgICAgICAgLy8gVGhlIGVycm9yIGhhcyBiZWVuIGNhdWdodCwgc28gYWZ0ZXIgdGhlIGZpbmFsbHksIGNvbnRpbnVlIGFmdGVyIHRoZQogICAgICAgIC8vIHRyeS4KICAgICAgICBhZGRTdGF0ZW1lbnQoanMuanMKICAgICAgICAgICAgLnN0YXRlbWVudCgiIy5wdXNoKCMpOyIsIFtuZXh0LCBqcy5udW1iZXIoYWZ0ZXJGaW5hbGx5TGFiZWwpXSkpOwogICAgICAgIGFkZEdvdG8oZmluYWxseUxhYmVsLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhZGRHb3RvKGFmdGVyRmluYWxseUxhYmVsLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgfQogICAgICBqcy5Ob2RlIGxhc3QgPSBqdW1wVGFyZ2V0cy5yZW1vdmVMYXN0KCk7CiAgICAgIGFzc2VydChsYXN0ID09IG5vZGUuY2F0Y2hQYXJ0KTsKICAgIH0KCiAgICAvLyBUaGUgInVuY2F1Z2h0Ii1oYW5kbGVyIHRlbGxzIHRoZSBmaW5hbGx5LWJsb2NrIHRvIGNvbnRpbnVlIHdpdGgKICAgIC8vIHRoZSBlbmNsb3NpbmcgZmluYWxseS1ibG9ja3MgdW50aWwgdGhlIGN1cnJlbnQgY2F0Y2gtaGFuZGxlci4KICAgIGJlZ2luTGFiZWwodW5jYXVnaHRMYWJlbCk7CgogICAgTGlzdDxpbnQ+IGVuY2xvc2luZ0ZpbmFsbGllcyA9IF9maW5hbGxpZXNVcFRvQW5kRW5jbG9zaW5nSGFuZGxlcigpOwoKICAgIGludCBuZXh0TGFiZWwgPSBlbmNsb3NpbmdGaW5hbGxpZXMucmVtb3ZlTGFzdCgpOwogICAgaWYgKGVuY2xvc2luZ0ZpbmFsbGllcy5pc05vdEVtcHR5KSB7CiAgICAgIC8vIFtlbmNsb3NpbmdGaW5hbGxpZXNdIGNhbiBiZSBlbXB0eSBpZiB0aGVyZSBpcyBubyBzdXJyb3VuZGluZyBmaW5hbGx5CiAgICAgIC8vIGJsb2Nrcy4gVGhlbiBbbmV4dExhYmVsXSB3aWxsIGJlIFtyZXRocm93TGFiZWxdLgogICAgICBhZGRTdGF0ZW1lbnQoanMuanMuc3RhdGVtZW50KCIjID0gIzsiLCBbCiAgICAgICAgbmV4dCwKICAgICAgICBuZXcganMuQXJyYXlJbml0aWFsaXplcihlbmNsb3NpbmdGaW5hbGxpZXMubWFwKGpzLm51bWJlcikudG9MaXN0KCkpCiAgICAgIF0pKTsKICAgIH0KICAgIGlmIChub2RlLmZpbmFsbHlQYXJ0ID09IG51bGwpIHsKICAgICAgLy8gVGhlIGZpbmFsbHktYmxvY2sgYmVsb25naW5nIHRvIFtub2RlXSB3aWxsIGJlIHZpc2l0ZWQgYmVjYXVzZSBvZgogICAgICAvLyBmYWxsdGhyb3VnaC4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIGFkZCBhbiBleHBsaWNpdCBnb3RvLgogICAgICBhZGRHb3RvKG5leHRMYWJlbCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgICBpZiAobm9kZS5maW5hbGx5UGFydCAhPSBudWxsKSB7CiAgICAgIGpzLk5vZGUgbGFzdCA9IGp1bXBUYXJnZXRzLnJlbW92ZUxhc3QoKTsKICAgICAgYXNzZXJ0KGxhc3QgPT0gbm9kZS5maW5hbGx5UGFydCk7CgogICAgICBiZWdpbkxhYmVsKGZpbmFsbHlMYWJlbCk7CiAgICAgIHNldEVycm9ySGFuZGxlcigpOwogICAgICB2aXNpdFN0YXRlbWVudChub2RlLmZpbmFsbHlQYXJ0KTsKICAgICAgYWRkU3RhdGVtZW50KG5ldyBqcy5Db21tZW50KCIvLyBnb3RvIHRoZSBuZXh0IGZpbmFsbHkgaGFuZGxlciIpKTsKICAgICAgYWRkU3RhdGVtZW50KGpzLmpzLnN0YXRlbWVudCgiIyA9ICMucG9wKCk7IiwgW2dvdG8sIG5leHRdKSk7CiAgICAgIGFkZEJyZWFrKG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogICAgYmVnaW5MYWJlbChhZnRlckZpbmFsbHlMYWJlbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oanMuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICB1bnJlYWNoYWJsZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGpzLkV4cHJlc3Npb24gdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBub2RlKSB7CiAgICBmb3IgKGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24gaW5pdGlhbGl6YXRpb24gaW4gbm9kZS5kZWNsYXJhdGlvbnMpIHsKICAgICAganMuVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IGluaXRpYWxpemF0aW9uLmRlY2xhcmF0aW9uOwogICAgICBsb2NhbFZhcmlhYmxlcy5hZGQoZGVjbGFyYXRpb24pOwogICAgICBpZiAoaW5pdGlhbGl6YXRpb24udmFsdWUgIT0gbnVsbCkgewogICAgICAgIHdpdGhFeHByZXNzaW9uKGluaXRpYWxpemF0aW9uLnZhbHVlLCAoanMuRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICAgICAgYWRkRXhwcmVzc2lvblN0YXRlbWVudCgKICAgICAgICAgICAgICBuZXcganMuQXNzaWdubWVudChuZXcganMuVmFyaWFibGVVc2UoZGVjbGFyYXRpb24ubmFtZSksIHZhbHVlKSk7CiAgICAgICAgfSwgc3RvcmU6IGZhbHNlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGpzLm51bWJlcigwKTsgLy8gRHVtbXkgZXhwcmVzc2lvbi4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24gbm9kZSkgewogICAgdW5yZWFjaGFibGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5FeHByZXNzaW9uIHZpc2l0VmFyaWFibGVVc2UoanMuVmFyaWFibGVVc2Ugbm9kZSkgewogICAgUGFpcjxTdHJpbmcsIFN0cmluZz4gcmVuYW1pbmcgPSB2YXJpYWJsZVJlbmFtaW5ncy5sYXN0V2hlcmUoCiAgICAgICAgKFBhaXIgcmVuYW1pbmcpID0+IHJlbmFtaW5nLmEgPT0gbm9kZS5uYW1lLAogICAgICAgIG9yRWxzZTogKCkgPT4gbnVsbCk7CiAgICBpZiAocmVuYW1pbmcgPT0gbnVsbCkgcmV0dXJuIG5vZGU7CiAgICByZXR1cm4gbmV3IGpzLlZhcmlhYmxlVXNlKHJlbmFtaW5nLmIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFdoaWxlKGpzLldoaWxlIG5vZGUpIHsKICAgIGlmICghc2hvdWxkVHJhbnNmb3JtKG5vZGUpKSB7CiAgICAgIGJvb2wgb2xkSW5zaWRlVW50cmFuc2xhdGVkID0gaW5zaWRlVW50cmFuc2xhdGVkQnJlYWthYmxlOwogICAgICBpbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGUgPSB0cnVlOwogICAgICB3aXRoRXhwcmVzc2lvbihub2RlLmNvbmRpdGlvbiwgKGpzLkV4cHJlc3Npb24gY29uZGl0aW9uKSB7CiAgICAgICAgYWRkU3RhdGVtZW50KG5ldyBqcy5XaGlsZShjb25kaXRpb24sIHRyYW5zbGF0ZVRvU3RhdGVtZW50KG5vZGUuYm9keSkpKTsKICAgICAgfSwgc3RvcmU6IGZhbHNlKTsKICAgICAgaW5zaWRlVW50cmFuc2xhdGVkQnJlYWthYmxlID0gb2xkSW5zaWRlVW50cmFuc2xhdGVkOwogICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgY29udGludWVMYWJlbCA9IG5ld0xhYmVsKCJ3aGlsZSBjb25kaXRpb24iKTsKICAgIGNvbnRpbnVlTGFiZWxzW25vZGVdID0gY29udGludWVMYWJlbDsKICAgIGJlZ2luTGFiZWwoY29udGludWVMYWJlbCk7CgogICAgaW50IGFmdGVyTGFiZWwgPSBuZXdMYWJlbCgiYWZ0ZXIgd2hpbGUiKTsKICAgIGJyZWFrTGFiZWxzW25vZGVdID0gYWZ0ZXJMYWJlbDsKICAgIGpzLkV4cHJlc3Npb24gY29uZGl0aW9uID0gbm9kZS5jb25kaXRpb247CiAgICAvLyBJZiB0aGUgY29uZGl0aW9uIGlzIGB0cnVlYCwgYSB0ZXN0IGlzIG5vdCBuZWVkZWQuCiAgICBpZiAoIShjb25kaXRpb24gaXMganMuTGl0ZXJhbEJvb2wgJiYgY29uZGl0aW9uLnZhbHVlID09IHRydWUpKSB7CiAgICAgIHdpdGhFeHByZXNzaW9uKG5vZGUuY29uZGl0aW9uLCAoanMuRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKICAgICAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLklmLm5vRWxzZShuZXcganMuUHJlZml4KCIhIiwgY29uZGl0aW9uKSwKICAgICAgICAgICAgZ290b0FuZEJyZWFrKGFmdGVyTGFiZWwsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pKSk7CiAgICAgIH0sIHN0b3JlOiBmYWxzZSk7CiAgICB9CiAgICBqdW1wVGFyZ2V0cy5hZGQobm9kZSk7CiAgICB2aXNpdFN0YXRlbWVudChub2RlLmJvZHkpOwogICAganVtcFRhcmdldHMucmVtb3ZlTGFzdCgpOwogICAgYWRkR290byhjb250aW51ZUxhYmVsLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGJlZ2luTGFiZWwoYWZ0ZXJMYWJlbCk7CiAgfQoKICBhZGRZaWVsZChqcy5EYXJ0WWllbGQgbm9kZSwganMuRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbik7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREYXJ0WWllbGQoanMuRGFydFlpZWxkIG5vZGUpIHsKICAgIGFzc2VydChpc1N5bmNTdGFyIHx8IGlzQXN5bmNTdGFyKTsKICAgIGludCBsYWJlbCA9IG5ld0xhYmVsKCJhZnRlciB5aWVsZCIpOwogICAgLy8gRG9uJ3QgZG8gYSBicmVhayBoZXJlIGZvciB0aGUgZ290bywgYnV0IGluc3RlYWQgYSByZXR1cm4gaW4gZWl0aGVyCiAgICAvLyBhZGRTeW5ZaWVsZCBvciBhZGRBc3luY1lpZWxkLgogICAgd2l0aEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCAoanMuRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICAgIGFkZFN0YXRlbWVudChzZXRHb3RvVmFyaWFibGUobGFiZWwsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgYWRkWWllbGQobm9kZSwgZXhwcmVzc2lvbiwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9LCBzdG9yZTogZmFsc2UpOwogICAgYmVnaW5MYWJlbChsYWJlbCk7CiAgfQp9Cgpqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uIF9tYWtlVmFyaWFibGVJbml0aWFsaXplcihkeW5hbWljIHZhcmlhYmxlLAogICAganMuRXhwcmVzc2lvbiBpbml0VmFsdWUsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAganMuVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKICBpZiAodmFyaWFibGUgaXMganMuVmFyaWFibGVVc2UpIHsKICAgIGRlY2xhcmF0aW9uID0gbmV3IGpzLlZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGUubmFtZSk7CiAgfSBlbHNlIGlmICh2YXJpYWJsZSBpcyBTdHJpbmcpIHsKICAgIGRlY2xhcmF0aW9uID0gbmV3IGpzLlZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGUpOwogIH0gZWxzZSB7CiAgICBhc3NlcnQodmFyaWFibGUgaXMganMuVmFyaWFibGVEZWNsYXJhdGlvbik7CiAgICBkZWNsYXJhdGlvbiA9IHZhcmlhYmxlOwogIH0KICByZXR1cm4gbmV3IGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24oZGVjbGFyYXRpb24sIGluaXRWYWx1ZSkKICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7Cn0KCmNsYXNzIEFzeW5jUmV3cml0ZXIgZXh0ZW5kcyBBc3luY1Jld3JpdGVyQmFzZSB7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNBc3luYyA9PiB0cnVlOwoKICAvLy8gVGhlIENvbXBsZXRlciB0aGF0IHdpbGwgZmluaXNoIGFuIGFzeW5jIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBOb3QgdXNlZCBmb3Igc3luYyogb3IgYXN5bmMqIGZ1bmN0aW9ucy4KICBTdHJpbmcgY29tcGxldGVyTmFtZTsKICBqcy5WYXJpYWJsZVVzZSBnZXQgY29tcGxldGVyID0+IG5ldyBqcy5WYXJpYWJsZVVzZShjb21wbGV0ZXJOYW1lKTsKCiAgLy8vIFRoZSBmdW5jdGlvbiBjYWxsZWQgYnkgYW4gYXN5bmMgZnVuY3Rpb24gdG8gaW5pdGlhdGUgYXN5bmNocm9ub3VzCiAgLy8vIGV4ZWN1dGlvbiBvZiB0aGUgYm9keS4gIFRoaXMgaXMgY2FsbGVkIHdpdGg6CiAgLy8vCiAgLy8vIC0gVGhlIGJvZHkgZnVuY3Rpb24gW2JvZHlOYW1lXS4KICAvLy8gLSB0aGUgY29tcGxldGVyIG9iamVjdCBbY29tcGxldGVyXS4KICAvLy8KICAvLy8gSXQgcmV0dXJucyB0aGUgY29tcGxldGVyJ3MgZnV0dXJlLiBQYXNzaW5nIHRoZSBjb21wbGV0ZXIgYW5kIHJldHVybmluZyBpdHMKICAvLy8gZnV0dXJlIGlzIGEgY29udmVuaWVuY2UgdG8gYWxsb3cgYm90aCB0aGUgaW5pdGlhdGlvbiBhbmQgZmV0Y2hpbmcgdGhlCiAgLy8vIGZ1dHVyZSB0byBiZSBjb21wYWN0bHkgZW5jb2RlZCBpbiBhIHJldHVybiBzdGF0ZW1lbnQncyBleHByZXNzaW9uLgogIGZpbmFsIGpzLkV4cHJlc3Npb24gYXN5bmNTdGFydDsKCiAgLy8vIEZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgYXN5bmMgZnVuY3Rpb24gdG8gc2ltdWxhdGUgYW4gYGF3YWl0YAogIC8vLyBleHByZXNzaW9uLiBJdCBpcyBjYWxsZWQgd2l0aDoKICAvLy8KICAvLy8gLSBUaGUgdmFsdWUgdG8gYXdhaXQKICAvLy8gLSBUaGUgYm9keSBmdW5jdGlvbiBbYm9keU5hbWVdCiAgZmluYWwganMuRXhwcmVzc2lvbiBhc3luY0F3YWl0OwoKICAvLy8gRnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBhc3luYyBmdW5jdGlvbiB0byBzaW11bGF0ZSBhIHJldHVybi4KICAvLy8gSXQgaXMgY2FsbGVkIHdpdGg6CiAgLy8vCiAgLy8vIC0gVGhlIHZhbHVlIHRvIHJldHVybgogIC8vLyAtIFRoZSBjb21wbGV0ZXIgb2JqZWN0IFtjb21wbGV0ZXJdCiAgZmluYWwganMuRXhwcmVzc2lvbiBhc3luY1JldHVybjsKCiAgLy8vIEZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgYXN5bmMgZnVuY3Rpb24gdG8gc2ltdWxhdGUgYSByZXRocm93LgogIC8vLyBJdCBpcyBjYWxsZWQgd2l0aDoKICAvLy8KICAvLy8gLSBUaGUgdmFsdWUgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIGFuZCBzdGFjawogIC8vLyAtIFRoZSBjb21wbGV0ZXIgb2JqZWN0IFtjb21wbGV0ZXJdCiAgZmluYWwganMuRXhwcmVzc2lvbiBhc3luY1JldGhyb3c7CgogIC8vLyBDb25zdHJ1Y3RvciB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFtjb21wbGV0ZXJdIHZhcmlhYmxlLgogIC8vLwogIC8vLyBTcGVjaWZpYyB0byBhc3luYyBtZXRob2RzLgogIGZpbmFsIGpzLkV4cHJlc3Npb24gY29tcGxldGVyRmFjdG9yeTsKICBMaXN0PGpzLkV4cHJlc3Npb24+IGNvbXBsZXRlckZhY3RvcnlUeXBlQXJndW1lbnRzOwoKICBmaW5hbCBqcy5FeHByZXNzaW9uIHdyYXBCb2R5OwoKICBBc3luY1Jld3JpdGVyKERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgU3Bhbm5hYmxlIHNwYW5uYWJsZSwKICAgICAge3RoaXMuYXN5bmNTdGFydCwKICAgICAgdGhpcy5hc3luY0F3YWl0LAogICAgICB0aGlzLmFzeW5jUmV0dXJuLAogICAgICB0aGlzLmFzeW5jUmV0aHJvdywKICAgICAgdGhpcy5jb21wbGV0ZXJGYWN0b3J5LAogICAgICB0aGlzLmNvbXBsZXRlckZhY3RvcnlUeXBlQXJndW1lbnRzLAogICAgICB0aGlzLndyYXBCb2R5LAogICAgICBTdHJpbmcgc2FmZVZhcmlhYmxlTmFtZShTdHJpbmcgcHJvcG9zZWROYW1lKSwKICAgICAganMuTmFtZSBib2R5TmFtZX0pCiAgICAgIDogc3VwZXIocmVwb3J0ZXIsIHNwYW5uYWJsZSwgc2FmZVZhcmlhYmxlTmFtZSwgYm9keU5hbWUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFlpZWxkKGpzLkRhcnRZaWVsZCBub2RlLCBqcy5FeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKHNwYW5uYWJsZSwgIllpZWxkIGluIG5vbi1nZW5lcmF0aW5nIGFzeW5jIGZ1bmN0aW9uIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEVycm9yRXhpdChTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaWYgKCFoYXNIYW5kbGVyTGFiZWxzKSByZXR1cm47IC8vIHJldGhyb3cgaGFuZGxlZCBpbiBtZXRob2QgYm9pbGVycGxhdGUuCiAgICBiZWdpbkxhYmVsKHJldGhyb3dMYWJlbCk7CiAgICBqcy5FeHByZXNzaW9uIHRoZW5IZWxwZXJDYWxsID0ganMuanMoCiAgICAgICAgIiN0aGVuSGVscGVyKCNjdXJyZW50RXJyb3IsICNjb21wbGV0ZXIpIiwgewogICAgICAidGhlbkhlbHBlciI6IGFzeW5jUmV0aHJvdywKICAgICAgImN1cnJlbnRFcnJvciI6IGN1cnJlbnRFcnJvciwKICAgICAgImNvbXBsZXRlciI6IGNvbXBsZXRlcgogICAgfSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGFkZFN0YXRlbWVudCgKICAgICAgICBuZXcganMuUmV0dXJuKHRoZW5IZWxwZXJDYWxsKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIC8vLyBSZXR1cm5pbmcgZnJvbSBhbiBhc3luYyBtZXRob2QgY2FsbHMgW2FzeW5jU3RhckhlbHBlcl0gd2l0aCB0aGUgcmVzdWx0LgogIC8vLyAodGhlIHJlc3VsdCBtaWdodCBoYXZlIGJlZW4gc3RvcmVkIGluIFtyZXR1cm5WYWx1ZV0gYnkgc29tZSBmaW5hbGx5CiAgLy8vIGJsb2NrKS4KICBAb3ZlcnJpZGUKICB2b2lkIGFkZFN1Y2Nlc3NFeGl0KFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBpZiAoYW5hbHlzaXMuaGFzRXhwbGljaXRSZXR1cm5zKSB7CiAgICAgIGJlZ2luTGFiZWwoZXhpdExhYmVsKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZFN0YXRlbWVudChuZXcganMuQ29tbWVudCgiaW1wbGljaXQgcmV0dXJuIikpOwogICAgfQoKICAgIGpzLkV4cHJlc3Npb24gcnVudGltZUhlbHBlckNhbGwgPQogICAgICAgIGpzLmpzKCIjcnVudGltZUhlbHBlcigjcmV0dXJuVmFsdWUsICNjb21wbGV0ZXIpIiwgewogICAgICAicnVudGltZUhlbHBlciI6IGFzeW5jUmV0dXJuLAogICAgICAicmV0dXJuVmFsdWUiOgogICAgICAgICAgYW5hbHlzaXMuaGFzRXhwbGljaXRSZXR1cm5zID8gcmV0dXJuVmFsdWUgOiBuZXcganMuTGl0ZXJhbE51bGwoKSwKICAgICAgImNvbXBsZXRlciI6IGNvbXBsZXRlcgogICAgfSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGFkZFN0YXRlbWVudChuZXcganMuUmV0dXJuKHJ1bnRpbWVIZWxwZXJDYWxsKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24+IHZhcmlhYmxlSW5pdGlhbGl6YXRpb25zKAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgTGlzdDxqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uPiB2YXJpYWJsZXMgPSA8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj5bXTsKICAgIHZhcmlhYmxlcy5hZGQoX21ha2VWYXJpYWJsZUluaXRpYWxpemVyKAogICAgICAgIGNvbXBsZXRlciwKICAgICAgICBqcy5qcygnIygjKScsIFsKICAgICAgICAgIGNvbXBsZXRlckZhY3RvcnksCiAgICAgICAgICBjb21wbGV0ZXJGYWN0b3J5VHlwZUFyZ3VtZW50cwogICAgICAgIF0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbiksCiAgICAgICAgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIGlmIChhbmFseXNpcy5oYXNFeHBsaWNpdFJldHVybnMpIHsKICAgICAgdmFyaWFibGVzCiAgICAgICAgICAuYWRkKF9tYWtlVmFyaWFibGVJbml0aWFsaXplcihyZXR1cm5WYWx1ZSwgbnVsbCwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICAgIHJldHVybiB2YXJpYWJsZXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGluaXRpYWxpemVOYW1lcygpIHsKICAgIGNvbXBsZXRlck5hbWUgPSBmcmVzaE5hbWUoImNvbXBsZXRlciIpOwogICAgY29tcGxldGVyRmFjdG9yeVR5cGVBcmd1bWVudHMgPQogICAgICAgIHByb2Nlc3NUeXBlQXJndW1lbnRzKGNvbXBsZXRlckZhY3RvcnlUeXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGpzLlN0YXRlbWVudCBhd2FpdFN0YXRlbWVudCgKICAgICAganMuRXhwcmVzc2lvbiB2YWx1ZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIGpzLkV4cHJlc3Npb24gYXN5bmNIZWxwZXJDYWxsID0ganMuanMoIiNhc3luY0hlbHBlcigjdmFsdWUsICNib2R5TmFtZSkiLCB7CiAgICAgICJhc3luY0hlbHBlciI6IGFzeW5jQXdhaXQsCiAgICAgICJ2YWx1ZSI6IHZhbHVlLAogICAgICAiYm9keU5hbWUiOiBib2R5TmFtZSwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICByZXR1cm4gbmV3IGpzLlJldHVybihhc3luY0hlbHBlckNhbGwpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5GdW4gZmluaXNoRnVuY3Rpb24oCiAgICAgIExpc3Q8anMuUGFyYW1ldGVyPiBwYXJhbWV0ZXJzLAogICAgICBMaXN0PGpzLlBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsCiAgICAgIGpzLlN0YXRlbWVudCByZXdyaXR0ZW5Cb2R5LAogICAgICBqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdCB2YXJpYWJsZURlY2xhcmF0aW9ucywKICAgICAgU291cmNlSW5mb3JtYXRpb24gZnVuY3Rpb25Tb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgU291cmNlSW5mb3JtYXRpb24gYm9keVNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBqcy5FeHByZXNzaW9uIGFzeW5jUmV0aHJvd0NhbGwgPQogICAgICAgIGpzLmpzKCIjYXN5bmNSZXRocm93KCNyZXN1bHQsICNjb21wbGV0ZXIpIiwgewogICAgICAicmVzdWx0IjogcmVzdWx0TmFtZSwKICAgICAgImFzeW5jUmV0aHJvdyI6IGFzeW5jUmV0aHJvdywKICAgICAgImNvbXBsZXRlciI6IGNvbXBsZXRlciwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAganMuUmV0dXJuIHJldHVybkFzeW5jUmV0aHJvdyA9IG5ldyBqcy5SZXR1cm4oYXN5bmNSZXRocm93Q2FsbCkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5TdGF0ZW1lbnQgZXJyb3JDaGVjayA9IGpzLmpzLnN0YXRlbWVudCgiIiIKICAgICAgaWYgKCNlcnJvckNvZGUgPT09ICNFUlJPUikgewogICAgICAgIGlmICgjaGFzSGFuZGxlckxhYmVscykgewogICAgICAgICAgICAjY3VycmVudEVycm9yID0gI3Jlc3VsdDsKICAgICAgICAgICAgI2dvdG8gPSAjaGFuZGxlcjsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgI3JldHVybkFzeW5jUmV0aHJvdzsKICAgICAgfSIiIiwgewogICAgICAiZXJyb3JDb2RlIjogZXJyb3JDb2RlTmFtZSwKICAgICAgIkVSUk9SIjoganMubnVtYmVyKGVycm9yX2NvZGVzLkVSUk9SKSwKICAgICAgImhhc0hhbmRsZXJMYWJlbHMiOiBoYXNIYW5kbGVyTGFiZWxzLAogICAgICAiY3VycmVudEVycm9yIjogY3VycmVudEVycm9yLAogICAgICAicmVzdWx0IjogcmVzdWx0TmFtZSwKICAgICAgImdvdG8iOiBnb3RvLAogICAgICAiaGFuZGxlciI6IGhhbmRsZXIsCiAgICAgICJyZXR1cm5Bc3luY1JldGhyb3ciOiByZXR1cm5Bc3luY1JldGhyb3csCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkZ1biBpbm5lckZ1bmN0aW9uID0ganMuanMoIiIiCiAgICAgIGZ1bmN0aW9uICgjZXJyb3JDb2RlLCAjcmVzdWx0KSB7CiAgICAgICAgI2Vycm9yQ2hlY2s7CiAgICAgICAgI3Jld3JpdHRlbkJvZHk7CiAgICAgIH0iIiIsIHsKICAgICAgImVycm9yQ29kZSI6IGVycm9yQ29kZU5hbWUsCiAgICAgICJyZXN1bHQiOiByZXN1bHROYW1lLAogICAgICAiZXJyb3JDaGVjayI6IGVycm9yQ2hlY2ssCiAgICAgICJyZXdyaXR0ZW5Cb2R5IjogcmV3cml0dGVuQm9keSwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihmdW5jdGlvblNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gYXN5bmNTdGFydENhbGwgPSBqcy5qcygiI2FzeW5jU3RhcnQoI2JvZHlOYW1lLCAjY29tcGxldGVyKSIsIHsKICAgICAgImFzeW5jU3RhcnQiOiBhc3luY1N0YXJ0LAogICAgICAiYm9keU5hbWUiOiBib2R5TmFtZSwKICAgICAgImNvbXBsZXRlciI6IGNvbXBsZXRlciwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAganMuUmV0dXJuIHJldHVybkFzeW5jU3RhcnQgPSBuZXcganMuUmV0dXJuKGFzeW5jU3RhcnRDYWxsKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gd3JhcEJvZHlDYWxsID0ganMuanMoIiN3cmFwQm9keSgjaW5uZXJGdW5jdGlvbikiLCB7CiAgICAgICJ3cmFwQm9keSI6IHdyYXBCb2R5LAogICAgICAiaW5uZXJGdW5jdGlvbiI6IGlubmVyRnVuY3Rpb24sCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIHJldHVybiBqcy5qcygiIiIKICAgICAgICBmdW5jdGlvbiAoI3BhcmFtZXRlcnMsICN0eXBlUGFyYW1ldGVycykgewogICAgICAgICAgI3ZhcmlhYmxlRGVjbGFyYXRpb25zOwogICAgICAgICAgdmFyICNib2R5TmFtZSA9ICN3cmFwQm9keUNhbGw7CiAgICAgICAgICAjcmV0dXJuQXN5bmNTdGFydDsKICAgICAgICB9IiIiLCB7CiAgICAgICJwYXJhbWV0ZXJzIjogcGFyYW1ldGVycywKICAgICAgInR5cGVQYXJhbWV0ZXJzIjogdHlwZVBhcmFtZXRlcnMsCiAgICAgICJ2YXJpYWJsZURlY2xhcmF0aW9ucyI6IHZhcmlhYmxlRGVjbGFyYXRpb25zLAogICAgICAiYm9keU5hbWUiOiBib2R5TmFtZSwKICAgICAgIndyYXBCb2R5Q2FsbCI6IHdyYXBCb2R5Q2FsbCwKICAgICAgInJldHVybkFzeW5jU3RhcnQiOiByZXR1cm5Bc3luY1N0YXJ0LAogICAgfSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKGZ1bmN0aW9uU291cmNlSW5mb3JtYXRpb24pOwogIH0KfQoKY2xhc3MgU3luY1N0YXJSZXdyaXRlciBleHRlbmRzIEFzeW5jUmV3cml0ZXJCYXNlIHsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1N5bmNTdGFyID0+IHRydWU7CgogIC8vLyBDb25zdHJ1Y3RvciBjcmVhdGluZyB0aGUgSXRlcmFibGUgZm9yIGEgc3luYyogbWV0aG9kLiBDYWxsZWQgd2l0aAogIC8vLyBbYm9keU5hbWVdLgogIGZpbmFsIGpzLkV4cHJlc3Npb24gaXRlcmFibGVGYWN0b3J5OwogIExpc3Q8anMuRXhwcmVzc2lvbj4gaXRlcmFibGVGYWN0b3J5VHlwZUFyZ3VtZW50czsKCiAgLy8vIEEgSlMgRXhwcmVzc2lvbiB0aGF0IGNyZWF0ZXMgYSBtYXJrZXIgc2hvd2luZyB0aGF0IGl0ZXJhdGlvbiBpcyBvdmVyLgogIC8vLwogIC8vLyBDYWxsZWQgd2l0aG91dCBhcmd1bWVudHMuCiAgZmluYWwganMuRXhwcmVzc2lvbiBlbmRPZkl0ZXJhdGlvbjsKCiAgLy8vIEEgSlMgRXhwcmVzc2lvbiB0aGF0IGNyZWF0ZXMgYSBtYXJrZXIgaW5kaWNhdGlvbiBhICd5aWVsZConIHN0YXRlbWVudC4KICAvLy8KICAvLy8gQ2FsbGVkIHdpdGggdGhlIHN0cmVhbSB0byB5aWVsZCBmcm9tLgogIGZpbmFsIGpzLkV4cHJlc3Npb24geWllbGRTdGFyRXhwcmVzc2lvbjsKCiAgLy8vIFVzZWQgYnkgc3luYyogZnVuY3Rpb25zIHRvIHRocm93IGV4ZXB0aW9ucy4KICBmaW5hbCBqcy5FeHByZXNzaW9uIHVuY2F1Z2h0RXJyb3JFeHByZXNzaW9uOwoKICBTeW5jU3RhclJld3JpdGVyKERpYWdub3N0aWNSZXBvcnRlciBkaWFnbm9zdGljTGlzdGVuZXIsIHNwYW5uYWJsZSwKICAgICAge3RoaXMuZW5kT2ZJdGVyYXRpb24sCiAgICAgIHRoaXMuaXRlcmFibGVGYWN0b3J5LAogICAgICB0aGlzLml0ZXJhYmxlRmFjdG9yeVR5cGVBcmd1bWVudHMsCiAgICAgIHRoaXMueWllbGRTdGFyRXhwcmVzc2lvbiwKICAgICAgdGhpcy51bmNhdWdodEVycm9yRXhwcmVzc2lvbiwKICAgICAgU3RyaW5nIHNhZmVWYXJpYWJsZU5hbWUoU3RyaW5nIHByb3Bvc2VkTmFtZSksCiAgICAgIGpzLk5hbWUgYm9keU5hbWV9KQogICAgICA6IHN1cGVyKGRpYWdub3N0aWNMaXN0ZW5lciwgc3Bhbm5hYmxlLCBzYWZlVmFyaWFibGVOYW1lLCBib2R5TmFtZSk7CgogIC8vLyBUcmFuc2xhdGVzIGEgeWllbGQveWllbGQqIGluIGFuIHN5bmMqLgogIC8vLwogIC8vLyBgeWllbGRgIGluIGEgc3luYyogZnVuY3Rpb24ganVzdCByZXR1cm5zIFt2YWx1ZV0uCiAgLy8vIGB5aWVsZCpgIHdyYXBzIFt2YWx1ZV0gaW4gYSBbeWllbGRTdGFyRXhwcmVzc2lvbl0gYW5kIHJldHVybnMgaXQuCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRZaWVsZChqcy5EYXJ0WWllbGQgbm9kZSwganMuRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaWYgKG5vZGUuaGFzU3RhcikgewogICAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLlJldHVybihuZXcganMuQ2FsbCh5aWVsZFN0YXJFeHByZXNzaW9uLCBbZXhwcmVzc2lvbl0pCiAgICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9IGVsc2UgewogICAgICBhZGRTdGF0ZW1lbnQoCiAgICAgICAgICBuZXcganMuUmV0dXJuKGV4cHJlc3Npb24pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAganMuRnVuIGZpbmlzaEZ1bmN0aW9uKAogICAgICBMaXN0PGpzLlBhcmFtZXRlcj4gcGFyYW1ldGVycywKICAgICAgTGlzdDxqcy5QYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBqcy5TdGF0ZW1lbnQgcmV3cml0dGVuQm9keSwKICAgICAganMuVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QgdmFyaWFibGVEZWNsYXJhdGlvbnMsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIGZ1bmN0aW9uU291cmNlSW5mb3JtYXRpb24sCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIGJvZHlTb3VyY2VJbmZvcm1hdGlvbikgewogICAgLy8gRWFjaCBpdGVyYXRvciBpbnZvY2F0aW9uIG9uIHRoZSBpdGVyYWJsZSBzaG91bGQgd29yayBvbiBpdHMgb3duIGNvcHkgb2YKICAgIC8vIHRoZSBwYXJhbWV0ZXJzLgogICAgLy8gVE9ETyhzaWd1cmRtKTogV2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgY29weWluZyBmb3IgcGFyYW1ldGVycyB0aGF0IGFyZQogICAgLy8gbXV0YXRlZC4KICAgIExpc3Q8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj4gZGVjbGFyYXRpb25zID0KICAgICAgICA8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj5bXTsKICAgIExpc3Q8anMuUGFyYW1ldGVyPiByZW5hbWVkUGFyYW1ldGVycyA9IDxqcy5QYXJhbWV0ZXI+W107CiAgICBmb3IgKGpzLlBhcmFtZXRlciBwYXJhbWV0ZXIgaW4gcGFyYW1ldGVycykgewogICAgICBTdHJpbmcgbmFtZSA9IHBhcmFtZXRlci5uYW1lOwogICAgICBTdHJpbmcgcmVuYW1lZE5hbWUgPSBmcmVzaE5hbWUobmFtZSk7CiAgICAgIHJlbmFtZWRQYXJhbWV0ZXJzLmFkZChuZXcganMuUGFyYW1ldGVyKHJlbmFtZWROYW1lKSk7CiAgICAgIGRlY2xhcmF0aW9ucy5hZGQobmV3IGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24oCiAgICAgICAgICBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbihuYW1lKSwgbmV3IGpzLlZhcmlhYmxlVXNlKHJlbmFtZWROYW1lKSkpOwogICAgfQogICAganMuVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QgY29weVBhcmFtZXRlcnMgPQogICAgICAgIG5ldyBqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdChkZWNsYXJhdGlvbnMpOwoKICAgIGpzLkV4cHJlc3Npb24gc2V0Q3VycmVudEVycm9yID0ganMuanMoIiNjdXJyZW50RXJyb3IgPSAjcmVzdWx0IiwgewogICAgICAicmVzdWx0IjogcmVzdWx0TmFtZSwKICAgICAgImN1cnJlbnRFcnJvciI6IGN1cnJlbnRFcnJvck5hbWUsCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gc2V0R290byA9IGpzLmpzKCIjZ290byA9ICNoYW5kbGVyIiwgewogICAgICAiZ290byI6IGdvdG8sCiAgICAgICJoYW5kbGVyIjogaGFuZGxlciwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAganMuU3RhdGVtZW50IGNoZWNrRXJyb3JDb2RlID0ganMuanMuc3RhdGVtZW50KCIiIgogICAgICAgICAgaWYgKCNlcnJvckNvZGUgPT09ICNFUlJPUikgewogICAgICAgICAgICAgICNzZXRDdXJyZW50RXJyb3I7CiAgICAgICAgICAgICAgI3NldEdvdG87CiAgICAgICAgICB9IiIiLCB7CiAgICAgICJlcnJvckNvZGUiOiBlcnJvckNvZGVOYW1lLAogICAgICAiRVJST1IiOiBqcy5udW1iZXIoZXJyb3JfY29kZXMuRVJST1IpLAogICAgICAic2V0Q3VycmVudEVycm9yIjogc2V0Q3VycmVudEVycm9yLAogICAgICAic2V0R290byI6IHNldEdvdG8sCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLk5hbWVkRnVuY3Rpb24gaW5uZXJJbm5lckZ1bmN0aW9uID0ganMuanMoIiIiCiAgICAgICAgICBmdW5jdGlvbiAjYm9keSgjZXJyb3JDb2RlLCAjcmVzdWx0KSB7CiAgICAgICAgICAgICNjaGVja0Vycm9yQ29kZTsKICAgICAgICAgICAgI2hlbHBlckJvZHk7CiAgICAgICAgICB9IiIiLCB7CiAgICAgICJoZWxwZXJCb2R5IjogcmV3cml0dGVuQm9keSwKICAgICAgImVycm9yQ29kZSI6IGVycm9yQ29kZU5hbWUsCiAgICAgICJib2R5IjogYm9keU5hbWUsCiAgICAgICJyZXN1bHQiOiByZXN1bHROYW1lLAogICAgICAiY2hlY2tFcnJvckNvZGUiOiBjaGVja0Vycm9yQ29kZSwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihmdW5jdGlvblNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLlJldHVybiByZXR1cm5Jbm5lcklubmVyRnVuY3Rpb24gPSBuZXcganMuUmV0dXJuKGlubmVySW5uZXJGdW5jdGlvbikKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5GdW4gaW5uZXJGdW5jdGlvbiA9IGpzLmpzKCIiIgogICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoI2hhc1BhcmFtZXRlcnMpIHsKICAgICAgICAgICAgICAjY29weVBhcmFtZXRlcnM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgI3ZhckRlY2w7CiAgICAgICAgICAgICNyZXR1cm5Jbm5lcklubmVyRnVuY3Rpb247CiAgICAgICAgICB9IiIiLCB7CiAgICAgICJoYXNQYXJhbWV0ZXJzIjogcGFyYW1ldGVycy5pc05vdEVtcHR5LAogICAgICAiY29weVBhcmFtZXRlcnMiOiBjb3B5UGFyYW1ldGVycywKICAgICAgInZhckRlY2wiOiB2YXJpYWJsZURlY2xhcmF0aW9ucywKICAgICAgInJldHVybklubmVySW5uZXJGdW5jdGlvbiI6IHJldHVybklubmVySW5uZXJGdW5jdGlvbiwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihmdW5jdGlvblNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gY2FsbEl0ZXJhYmxlRmFjdG9yeSA9CiAgICAgICAganMuanMoIiNpdGVyYWJsZUZhY3RvcnkoI2lubmVyRnVuY3Rpb24sICN0eXBlKSIsIHsKICAgICAgIml0ZXJhYmxlRmFjdG9yeSI6IGl0ZXJhYmxlRmFjdG9yeSwKICAgICAgInR5cGUiOiBpdGVyYWJsZUZhY3RvcnlUeXBlQXJndW1lbnRzLAogICAgICAiaW5uZXJGdW5jdGlvbiI6IGlubmVyRnVuY3Rpb24sCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLlN0YXRlbWVudCByZXR1cm5DYWxsSXRlcmFibGVGYWN0b3J5ID0gbmV3IGpzLlJldHVybihjYWxsSXRlcmFibGVGYWN0b3J5KQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIHJldHVybiBqcy5qcygiIiIKICAgICAgICAgIGZ1bmN0aW9uICgjcmVuYW1lZFBhcmFtZXRlcnMsICN0eXBlUGFyYW1ldGVycykgewogICAgICAgICAgICBpZiAoI25lZWRzVGhpcykKICAgICAgICAgICAgICB2YXIgI3NlbGYgPSB0aGlzOwogICAgICAgICAgICAjcmV0dXJuQ2FsbEl0ZXJhYmxlRmFjdG9yeTsKICAgICAgICAgIH0KICAgICAgICAgICIiIiwgewogICAgICAicmVuYW1lZFBhcmFtZXRlcnMiOiByZW5hbWVkUGFyYW1ldGVycywKICAgICAgInR5cGVQYXJhbWV0ZXJzIjogdHlwZVBhcmFtZXRlcnMsCiAgICAgICJuZWVkc1RoaXMiOiBhbmFseXNpcy5oYXNUaGlzLAogICAgICAic2VsZiI6IHNlbGZOYW1lLAogICAgICAicmV0dXJuQ2FsbEl0ZXJhYmxlRmFjdG9yeSI6IHJldHVybkNhbGxJdGVyYWJsZUZhY3RvcnksCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oZnVuY3Rpb25Tb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEVycm9yRXhpdChTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaGFzSGFuZGxlckxhYmVscyA9IHRydWU7IC8vIFRPRE8oc3JhKTogQWRkIHNob3J0IGZvcm0gZXJyb3IgaGFuZGxlci4KICAgIGJlZ2luTGFiZWwocmV0aHJvd0xhYmVsKTsKICAgIGpzLkV4cHJlc3Npb24gdW5jYXVnaHRFcnJvckV4cHJlc3Npb25DYWxsID0ganMuanMoJyMoIyknLCBbCiAgICAgIHVuY2F1Z2h0RXJyb3JFeHByZXNzaW9uLAogICAgICBjdXJyZW50RXJyb3IKICAgIF0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLlJldHVybih1bmNhdWdodEVycm9yRXhwcmVzc2lvbkNhbGwpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgLy8vIFJldHVybmluZyBmcm9tIGEgc3luYyogZnVuY3Rpb24gcmV0dXJucyBhbiBbZW5kT2ZJdGVyYXRpb25dIG1hcmtlci4KICBAb3ZlcnJpZGUKICB2b2lkIGFkZFN1Y2Nlc3NFeGl0KFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBpZiAoYW5hbHlzaXMuaGFzRXhwbGljaXRSZXR1cm5zKSB7CiAgICAgIGJlZ2luTGFiZWwoZXhpdExhYmVsKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZFN0YXRlbWVudChuZXcganMuQ29tbWVudCgiaW1wbGljaXQgcmV0dXJuIikpOwogICAgfQogICAganMuRXhwcmVzc2lvbiBlbmRPZkl0ZXJhdGlvbkNhbGwgPQogICAgICAgIGpzLmpzKCcjKCknLCBbZW5kT2ZJdGVyYXRpb25dKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pOwogICAgYWRkU3RhdGVtZW50KG5ldyBqcy5SZXR1cm4oZW5kT2ZJdGVyYXRpb25DYWxsKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24+IHZhcmlhYmxlSW5pdGlhbGl6YXRpb25zKAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgTGlzdDxqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uPiB2YXJpYWJsZXMgPSA8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj5bXTsKICAgIHJldHVybiB2YXJpYWJsZXM7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5TdGF0ZW1lbnQgYXdhaXRTdGF0ZW1lbnQoCiAgICAgIGpzLkV4cHJlc3Npb24gdmFsdWUsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICB0aHJvdyByZXBvcnRlci5pbnRlcm5hbEVycm9yKAogICAgICAgIHNwYW5uYWJsZSwgIlN5bmMqIGZ1bmN0aW9ucyBjYW5ub3QgY29udGFpbiBhd2FpdCBzdGF0ZW1lbnRzLiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBpbml0aWFsaXplTmFtZXMoKSB7CiAgICBpdGVyYWJsZUZhY3RvcnlUeXBlQXJndW1lbnRzID0KICAgICAgICBwcm9jZXNzVHlwZUFyZ3VtZW50cyhpdGVyYWJsZUZhY3RvcnlUeXBlQXJndW1lbnRzKTsKICB9Cn0KCmNsYXNzIEFzeW5jU3RhclJld3JpdGVyIGV4dGVuZHMgQXN5bmNSZXdyaXRlckJhc2UgewogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQXN5bmNTdGFyID0+IHRydWU7CgogIC8vLyBUaGUgc3RhY2sgb2YgbGFiZWxzIG9mIGZpbmFsbHkgYmxvY2tzIHRvIGFzc2lnbiB0byBbbmV4dF0gaWYgdGhlCiAgLy8vIGFzeW5jKiBbU3RyZWFtU3Vic2NyaXB0aW9uXSB3YXMgY2FuY2VsZWQgZHVyaW5nIGEgeWllbGQuCiAganMuVmFyaWFibGVVc2UgZ2V0IG5leHRXaGVuQ2FuY2VsZWQgewogICAgcmV0dXJuIG5ldyBqcy5WYXJpYWJsZVVzZShuZXh0V2hlbkNhbmNlbGVkTmFtZSk7CiAgfQoKICBTdHJpbmcgbmV4dFdoZW5DYW5jZWxlZE5hbWU7CgogIC8vLyBUaGUgU3RyZWFtQ29udHJvbGxlciB0aGF0IGNvbnRyb2xzIGFuIGFzeW5jKiBmdW5jdGlvbi4KICBTdHJpbmcgY29udHJvbGxlck5hbWU7CiAganMuVmFyaWFibGVVc2UgZ2V0IGNvbnRyb2xsZXIgPT4gbmV3IGpzLlZhcmlhYmxlVXNlKGNvbnRyb2xsZXJOYW1lKTsKCiAgLy8vIFRoZSBmdW5jdGlvbiBjYWxsZWQgYnkgYW4gYXN5bmMqIGZ1bmN0aW9uIHRvIHNpbXVsYXRlIGFuIGF3YWl0LCB5aWVsZCBvcgogIC8vLyB5aWVsZCouCiAgLy8vCiAgLy8vIEZvciBhbiBhd2FpdC95aWVsZC95aWVsZCogaXQgaXMgY2FsbGVkIHdpdGg6CiAgLy8vCiAgLy8vIC0gVGhlIHZhbHVlIHRvIGF3YWl0L3lpZWxkRXhwcmVzc2lvbih2YWx1ZSB0byB5aWVsZCkvCiAgLy8vIHlpZWxkU3RhckV4cHJlc3Npb24oc3RyZWFtIHRvIHlpZWxkKQogIC8vLyAtIFRoZSBib2R5IGZ1bmN0aW9uIFtib2R5TmFtZV0KICAvLy8gLSBUaGUgY29udHJvbGxlciBvYmplY3QgW2NvbnRyb2xsZXJOYW1lXQogIC8vLwogIC8vLyBGb3IgYSByZXR1cm4gaXQgaXMgY2FsbGVkIHdpdGg6CiAgLy8vCiAgLy8vIC0gbnVsbAogIC8vLyAtIG51bGwKICAvLy8gLSBUaGUgW2NvbnRyb2xsZXJOYW1lXQogIC8vLyAtIG51bGwuCiAgZmluYWwganMuRXhwcmVzc2lvbiBhc3luY1N0YXJIZWxwZXI7CgogIC8vLyBDb25zdHJ1Y3RvciB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFtjb250cm9sbGVyTmFtZV0gdmFyaWFibGUuCiAgLy8vCiAgLy8vIFNwZWNpZmljIHRvIGFzeW5jKiBtZXRob2RzLgogIGZpbmFsIGpzLkV4cHJlc3Npb24gbmV3Q29udHJvbGxlcjsKICBMaXN0PGpzLkV4cHJlc3Npb24+IG5ld0NvbnRyb2xsZXJUeXBlQXJndW1lbnRzOwoKICAvLy8gVXNlZCB0byBnZXQgdGhlIGBTdHJlYW1gIG91dCBvZiB0aGUgW2NvbnRyb2xsZXJOYW1lXSB2YXJpYWJsZS4KICBmaW5hbCBqcy5FeHByZXNzaW9uIHN0cmVhbU9mQ29udHJvbGxlcjsKCiAgLy8vIEEgSlMgRXhwcmVzc2lvbiB0aGF0IGNyZWF0ZXMgYSBtYXJrZXIgaW5kaWNhdGluZyBhICd5aWVsZCcgc3RhdGVtZW50LgogIC8vLwogIC8vLyBDYWxsZWQgd2l0aCB0aGUgdmFsdWUgdG8geWllbGQuCiAgZmluYWwganMuRXhwcmVzc2lvbiB5aWVsZEV4cHJlc3Npb247CgogIC8vLyBBIEpTIEV4cHJlc3Npb24gdGhhdCBjcmVhdGVzIGEgbWFya2VyIGluZGljYXRpb24gYSAneWllbGQqJyBzdGF0ZW1lbnQuCiAgLy8vCiAgLy8vIENhbGxlZCB3aXRoIHRoZSBzdHJlYW0gdG8geWllbGQgZnJvbS4KICBmaW5hbCBqcy5FeHByZXNzaW9uIHlpZWxkU3RhckV4cHJlc3Npb247CgogIGZpbmFsIGpzLkV4cHJlc3Npb24gd3JhcEJvZHk7CgogIEFzeW5jU3RhclJld3JpdGVyKERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlciwgU3Bhbm5hYmxlIHNwYW5uYWJsZSwKICAgICAge3RoaXMuYXN5bmNTdGFySGVscGVyLAogICAgICB0aGlzLnN0cmVhbU9mQ29udHJvbGxlciwKICAgICAgdGhpcy5uZXdDb250cm9sbGVyLAogICAgICB0aGlzLm5ld0NvbnRyb2xsZXJUeXBlQXJndW1lbnRzLAogICAgICB0aGlzLnlpZWxkRXhwcmVzc2lvbiwKICAgICAgdGhpcy55aWVsZFN0YXJFeHByZXNzaW9uLAogICAgICB0aGlzLndyYXBCb2R5LAogICAgICBTdHJpbmcgc2FmZVZhcmlhYmxlTmFtZShTdHJpbmcgcHJvcG9zZWROYW1lKSwKICAgICAganMuTmFtZSBib2R5TmFtZX0pCiAgICAgIDogc3VwZXIocmVwb3J0ZXIsIHNwYW5uYWJsZSwgc2FmZVZhcmlhYmxlTmFtZSwgYm9keU5hbWUpOwoKICAvLy8gVHJhbnNsYXRlcyBhIHlpZWxkL3lpZWxkKiBpbiBhbiBhc3luYyogZnVuY3Rpb24uCiAgLy8vCiAgLy8vIHlpZWxkL3lpZWxkKiBpbiBhbiBhc3luYyogZnVuY3Rpb24gaXMgdHJhbnNsYXRlZCBtdWNoIGxpa2UgdGhlIGBhd2FpdGAgaXMKICAvLy8gdHJhbnNsYXRlZCBpbiBbdmlzaXRBd2FpdF0sIG9ubHkgdGhlIG9iamVjdCBpcyB3cmFwcGVkIGluIGEKICAvLy8gW3lpZWxkRXhwcmVzc2lvbl0vW3lpZWxkU3RhckV4cHJlc3Npb25dIHRvIGxldCBbYXN5bmNTdGFySGVscGVyXQogIC8vLyBkaXN0aW5ndWlzaCB0aGVtLgogIC8vLyBBbHNvIFtuZXh0V2hlbkNhbmNlbGVkXSBpcyBzZXQgdXAgdG8gY29udGFpbiB0aGUgZmluYWxseSBibG9ja3MgdGhhdAogIC8vLyBtdXN0IGJlIHJ1biBpbiBjYXNlIHRoZSBzdHJlYW0gd2FzIGNhbmNlbGVkLgogIEBvdmVycmlkZQogIHZvaWQgYWRkWWllbGQoanMuRGFydFlpZWxkIG5vZGUsIGpzLkV4cHJlc3Npb24gZXhwcmVzc2lvbiwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIC8vIEZpbmQgYWxsIHRoZSBmaW5hbGx5IGJsb2NrcyB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgaWYgdGhlIHN0cmVhbSBpcwogICAgLy8gY2FuY2VsZWQgZHVyaW5nIHRoZSB5aWVsZC4KICAgIC8vIEF0IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrIGlzIHRoZSByZXR1cm4gbGFiZWwuCiAgICBMaXN0PGludD4gZW5jbG9zaW5nRmluYWxseUxhYmVscyA9IDxpbnQ+W2V4aXRMYWJlbF07CiAgICBlbmNsb3NpbmdGaW5hbGx5TGFiZWxzLmFkZEFsbChqdW1wVGFyZ2V0cwogICAgICAgIC53aGVyZSgoanMuTm9kZSBub2RlKSA9PiBmaW5hbGx5TGFiZWxzW25vZGVdICE9IG51bGwpCiAgICAgICAgLm1hcCgoanMuTm9kZSBub2RlKSA9PiBmaW5hbGx5TGFiZWxzW25vZGVdKSk7CiAgICBhZGRTdGF0ZW1lbnQoanMuanMuc3RhdGVtZW50KCIjID0gIzsiLCBbCiAgICAgIG5leHRXaGVuQ2FuY2VsZWQsCiAgICAgIG5ldyBqcy5BcnJheUluaXRpYWxpemVyKGVuY2xvc2luZ0ZpbmFsbHlMYWJlbHMubWFwKGpzLm51bWJlcikudG9MaXN0KCkpCiAgICBdKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIGpzLkV4cHJlc3Npb24geWllbGRFeHByZXNzaW9uQ2FsbCA9IGpzLmpzKCIjeWllbGRFeHByZXNzaW9uKCNleHByZXNzaW9uKSIsIHsKICAgICAgInlpZWxkRXhwcmVzc2lvbiI6IG5vZGUuaGFzU3RhciA/IHlpZWxkU3RhckV4cHJlc3Npb24gOiB5aWVsZEV4cHJlc3Npb24sCiAgICAgICJleHByZXNzaW9uIjogZXhwcmVzc2lvbiwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5FeHByZXNzaW9uIGFzeW5jU3RhckhlbHBlckNhbGwgPSBqcwogICAgICAgIC5qcygiI2FzeW5jU3RhckhlbHBlcigjeWllbGRFeHByZXNzaW9uQ2FsbCwgI2JvZHlOYW1lLCAjY29udHJvbGxlcikiLCB7CiAgICAgICJhc3luY1N0YXJIZWxwZXIiOiBhc3luY1N0YXJIZWxwZXIsCiAgICAgICJ5aWVsZEV4cHJlc3Npb25DYWxsIjogeWllbGRFeHByZXNzaW9uQ2FsbCwKICAgICAgImJvZHlOYW1lIjogYm9keU5hbWUsCiAgICAgICJjb250cm9sbGVyIjogY29udHJvbGxlck5hbWUsCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pOwogICAgYWRkU3RhdGVtZW50KG5ldyBqcy5SZXR1cm4oYXN5bmNTdGFySGVscGVyQ2FsbCkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBqcy5GdW4gZmluaXNoRnVuY3Rpb24oCiAgICAgIExpc3Q8anMuUGFyYW1ldGVyPiBwYXJhbWV0ZXJzLAogICAgICBMaXN0PGpzLlBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsCiAgICAgIGpzLlN0YXRlbWVudCByZXdyaXR0ZW5Cb2R5LAogICAgICBqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdCB2YXJpYWJsZURlY2xhcmF0aW9ucywKICAgICAgU291cmNlSW5mb3JtYXRpb24gZnVuY3Rpb25Tb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgU291cmNlSW5mb3JtYXRpb24gYm9keVNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBqcy5FeHByZXNzaW9uIHVwZGF0ZU5leHQgPSBqcy5qcygiI25leHQgPSAjbmV4dFdoZW5DYW5jZWxlZCIsIHsKICAgICAgIm5leHQiOiBuZXh0LAogICAgICAibmV4dFdoZW5DYW5jZWxlZCI6IG5leHRXaGVuQ2FuY2VsZWQsCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gY2FsbFBvcCA9IGpzLmpzKCIjbmV4dC5wb3AoKSIsIHsKICAgICAgIm5leHQiOiBuZXh0LAogICAgfSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5FeHByZXNzaW9uIGdvdG9DYW5jZWxsZWQgPSBqcy5qcygiI2dvdG8gPSAjY2FsbFBvcCIsIHsKICAgICAgImdvdG8iOiBnb3RvLAogICAgICAiY2FsbFBvcCI6IGNhbGxQb3AsCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gdXBkYXRlRXJyb3IgPSBqcy5qcygiI2N1cnJlbnRFcnJvciA9ICNyZXN1bHQiLCB7CiAgICAgICJjdXJyZW50RXJyb3IiOiBjdXJyZW50RXJyb3IsCiAgICAgICJyZXN1bHQiOiByZXN1bHROYW1lLAogICAgfSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5FeHByZXNzaW9uIGdvdG9FcnJvciA9IGpzLmpzKCIjZ290byA9ICNoYW5kbGVyIiwgewogICAgICAiZ290byI6IGdvdG8sCiAgICAgICJoYW5kbGVyIjogaGFuZGxlciwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAganMuU3RhdGVtZW50IGJyZWFrU3RhdGVtZW50ID0KICAgICAgICBuZXcganMuQnJlYWsobnVsbCkud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5TdGF0ZW1lbnQgc3dpdGNoQ2FzZSA9IGpzLmpzLnN0YXRlbWVudCgiIiIKICAgICAgICBzd2l0Y2ggKCNlcnJvckNvZGUpIHsKICAgICAgICAgIGNhc2UgI1NUUkVBTV9XQVNfQ0FOQ0VMRUQ6CiAgICAgICAgICAgICN1cGRhdGVOZXh0OwogICAgICAgICAgICAjZ290b0NhbmNlbGxlZDsKICAgICAgICAgICAgI2JyZWFrOwogICAgICAgICAgY2FzZSAjRVJST1I6CiAgICAgICAgICAgICN1cGRhdGVFcnJvcjsKICAgICAgICAgICAgI2dvdG9FcnJvcjsKICAgICAgICB9IiIiLCB7CiAgICAgICJlcnJvckNvZGUiOiBlcnJvckNvZGVOYW1lLAogICAgICAiU1RSRUFNX1dBU19DQU5DRUxFRCI6IGpzLm51bWJlcihlcnJvcl9jb2Rlcy5TVFJFQU1fV0FTX0NBTkNFTEVEKSwKICAgICAgInVwZGF0ZU5leHQiOiB1cGRhdGVOZXh0LAogICAgICAiZ290b0NhbmNlbGxlZCI6IGdvdG9DYW5jZWxsZWQsCiAgICAgICJicmVhayI6IGJyZWFrU3RhdGVtZW50LAogICAgICAiRVJST1IiOiBqcy5udW1iZXIoZXJyb3JfY29kZXMuRVJST1IpLAogICAgICAidXBkYXRlRXJyb3IiOiB1cGRhdGVFcnJvciwKICAgICAgImdvdG9FcnJvciI6IGdvdG9FcnJvciwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAganMuU3RhdGVtZW50IGlmRXJyb3IgPSBqcy5qcy5zdGF0ZW1lbnQoIiIiCiAgICAgICAgaWYgKCNlcnJvckNvZGUgPT09ICNFUlJPUikgewogICAgICAgICAgI3VwZGF0ZUVycm9yOwogICAgICAgICAgI2dvdG9FcnJvcjsKICAgICAgICB9IiIiLCB7CiAgICAgICJlcnJvckNvZGUiOiBlcnJvckNvZGVOYW1lLAogICAgICAiRVJST1IiOiBqcy5udW1iZXIoZXJyb3JfY29kZXMuRVJST1IpLAogICAgICAidXBkYXRlRXJyb3IiOiB1cGRhdGVFcnJvciwKICAgICAgImdvdG9FcnJvciI6IGdvdG9FcnJvciwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAganMuU3RhdGVtZW50IGlmSGFzWWllbGQgPSBqcy5qcy5zdGF0ZW1lbnQoIiIiCiAgICAgICAgaWYgKCNoYXNZaWVsZCkgewogICAgICAgICAgI3N3aXRjaENhc2UKICAgICAgICB9IGVsc2UgewogICAgICAgICAgI2lmRXJyb3I7CiAgICAgICAgfQogICAgIiIiLCB7CiAgICAgICJoYXNZaWVsZCI6IGFuYWx5c2lzLmhhc1lpZWxkLAogICAgICAic3dpdGNoQ2FzZSI6IHN3aXRjaENhc2UsCiAgICAgICJpZkVycm9yIjogaWZFcnJvciwKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihib2R5U291cmNlSW5mb3JtYXRpb24pOwogICAganMuRnVuIGlubmVyRnVuY3Rpb24gPSBqcy5qcygiIiIKICAgICAgICBmdW5jdGlvbiAoI2Vycm9yQ29kZSwgI3Jlc3VsdCkgewogICAgICAgICAgI2lmSGFzWWllbGQ7CiAgICAgICAgICAjcmV3cml0dGVuQm9keTsKICAgICAgICB9IiIiLCB7CiAgICAgICJlcnJvckNvZGUiOiBlcnJvckNvZGVOYW1lLAogICAgICAicmVzdWx0IjogcmVzdWx0TmFtZSwKICAgICAgImlmSGFzWWllbGQiOiBpZkhhc1lpZWxkLAogICAgICAicmV3cml0dGVuQm9keSI6IHJld3JpdHRlbkJvZHksCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oZnVuY3Rpb25Tb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5FeHByZXNzaW9uIHdyYXBCb2R5Q2FsbCA9IGpzLmpzKCIjd3JhcEJvZHkoI2lubmVyRnVuY3Rpb24pIiwgewogICAgICAid3JhcEJvZHkiOiB3cmFwQm9keSwKICAgICAgImlubmVyRnVuY3Rpb24iOiBpbm5lckZ1bmN0aW9uLAogICAgfSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5TdGF0ZW1lbnQgZGVjbGFyZUJvZHlOYW1lID0KICAgICAgICBqcy5qcy5zdGF0ZW1lbnQoInZhciAjYm9keU5hbWUgPSAjd3JhcEJvZHlDYWxsOyIsIHsKICAgICAgImJvZHlOYW1lIjogYm9keU5hbWUsCiAgICAgICJ3cmFwQm9keUNhbGwiOiB3cmFwQm9keUNhbGwsCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oYm9keVNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gc3RyZWFtT2ZDb250cm9sbGVyQ2FsbCA9CiAgICAgICAganMuanMoIiNzdHJlYW1PZkNvbnRyb2xsZXIoI2NvbnRyb2xsZXIpIiwgewogICAgICAic3RyZWFtT2ZDb250cm9sbGVyIjogc3RyZWFtT2ZDb250cm9sbGVyLAogICAgICAiY29udHJvbGxlciI6IGNvbnRyb2xsZXJOYW1lLAogICAgfSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5SZXR1cm4gcmV0dXJuU3RyZWFtT2ZDb250cm9sbGVyQ2FsbCA9CiAgICAgICAgbmV3IGpzLlJldHVybihzdHJlYW1PZkNvbnRyb2xsZXJDYWxsKQogICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKGJvZHlTb3VyY2VJbmZvcm1hdGlvbik7CiAgICByZXR1cm4ganMuanMoIiIiCiAgICAgICAgZnVuY3Rpb24gKCNwYXJhbWV0ZXJzLCAjdHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICAgICNkZWNsYXJlQm9keU5hbWU7CiAgICAgICAgICAjdmFyaWFibGVEZWNsYXJhdGlvbnM7CiAgICAgICAgICAjcmV0dXJuU3RyZWFtT2ZDb250cm9sbGVyQ2FsbDsKICAgICAgICB9IiIiLCB7CiAgICAgICJwYXJhbWV0ZXJzIjogcGFyYW1ldGVycywKICAgICAgInR5cGVQYXJhbWV0ZXJzIjogdHlwZVBhcmFtZXRlcnMsCiAgICAgICJkZWNsYXJlQm9keU5hbWUiOiBkZWNsYXJlQm9keU5hbWUsCiAgICAgICJ2YXJpYWJsZURlY2xhcmF0aW9ucyI6IHZhcmlhYmxlRGVjbGFyYXRpb25zLAogICAgICAicmV0dXJuU3RyZWFtT2ZDb250cm9sbGVyQ2FsbCI6IHJldHVyblN0cmVhbU9mQ29udHJvbGxlckNhbGwsCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oZnVuY3Rpb25Tb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZEVycm9yRXhpdChTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaGFzSGFuZGxlckxhYmVscyA9IHRydWU7CiAgICBiZWdpbkxhYmVsKHJldGhyb3dMYWJlbCk7CiAgICBqcy5FeHByZXNzaW9uIGFzeW5jSGVscGVyQ2FsbCA9CiAgICAgICAganMuanMoIiNhc3luY0hlbHBlcigjY3VycmVudEVycm9yLCAjZXJyb3JDb2RlLCAjY29udHJvbGxlcikiLCB7CiAgICAgICJhc3luY0hlbHBlciI6IGFzeW5jU3RhckhlbHBlciwKICAgICAgImVycm9yQ29kZSI6IGpzLm51bWJlcihlcnJvcl9jb2Rlcy5FUlJPUiksCiAgICAgICJjdXJyZW50RXJyb3IiOiBjdXJyZW50RXJyb3IsCiAgICAgICJjb250cm9sbGVyIjogY29udHJvbGxlck5hbWUKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBhZGRTdGF0ZW1lbnQobmV3IGpzLlJldHVybihhc3luY0hlbHBlckNhbGwpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgLy8vIFJldHVybmluZyBmcm9tIGFuIGFzeW5jKiBmdW5jdGlvbiBjYWxscyB0aGUgW3N0cmVhbUhlbHBlcl0gd2l0aCBhbgogIC8vLyBbZW5kT2ZJdGVyYXRpb25dIG1hcmtlci4KICBAb3ZlcnJpZGUKICB2b2lkIGFkZFN1Y2Nlc3NFeGl0KFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBiZWdpbkxhYmVsKGV4aXRMYWJlbCk7CgogICAganMuRXhwcmVzc2lvbiBzdHJlYW1IZWxwZXJDYWxsID0KICAgICAgICBqcy5qcygiI3N0cmVhbUhlbHBlcihudWxsLCAjc3VjY2Vzc0NvZGUsICNjb250cm9sbGVyKSIsIHsKICAgICAgInN0cmVhbUhlbHBlciI6IGFzeW5jU3RhckhlbHBlciwKICAgICAgInN1Y2Nlc3NDb2RlIjoganMubnVtYmVyKGVycm9yX2NvZGVzLlNVQ0NFU1MpLAogICAgICAiY29udHJvbGxlciI6IGNvbnRyb2xsZXJOYW1lCiAgICB9KS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pOwogICAgYWRkU3RhdGVtZW50KG5ldyBqcy5SZXR1cm4oc3RyZWFtSGVscGVyQ2FsbCkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uPiB2YXJpYWJsZUluaXRpYWxpemF0aW9ucygKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIExpc3Q8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj4gdmFyaWFibGVzID0gPGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24+W107CiAgICB2YXJpYWJsZXMuYWRkKF9tYWtlVmFyaWFibGVJbml0aWFsaXplcigKICAgICAgICBjb250cm9sbGVyLAogICAgICAgIGpzLmpzKCcjKCMsICMpJywgWwogICAgICAgICAgbmV3Q29udHJvbGxlciwKICAgICAgICAgIGJvZHlOYW1lLAogICAgICAgICAgbmV3Q29udHJvbGxlclR5cGVBcmd1bWVudHMKICAgICAgICBdKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICBpZiAoYW5hbHlzaXMuaGFzWWllbGQpIHsKICAgICAgdmFyaWFibGVzLmFkZCgKICAgICAgICAgIF9tYWtlVmFyaWFibGVJbml0aWFsaXplcihuZXh0V2hlbkNhbmNlbGVkLCBudWxsLCBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogICAgcmV0dXJuIHZhcmlhYmxlczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaW5pdGlhbGl6ZU5hbWVzKCkgewogICAgY29udHJvbGxlck5hbWUgPSBmcmVzaE5hbWUoImNvbnRyb2xsZXIiKTsKICAgIG5leHRXaGVuQ2FuY2VsZWROYW1lID0gZnJlc2hOYW1lKCJuZXh0V2hlbkNhbmNlbGVkIik7CiAgICBuZXdDb250cm9sbGVyVHlwZUFyZ3VtZW50cyA9CiAgICAgICAgcHJvY2Vzc1R5cGVBcmd1bWVudHMobmV3Q29udHJvbGxlclR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAganMuU3RhdGVtZW50IGF3YWl0U3RhdGVtZW50KAogICAgICBqcy5FeHByZXNzaW9uIHZhbHVlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAganMuRXhwcmVzc2lvbiBhc3luY0hlbHBlckNhbGwgPQogICAgICAgIGpzLmpzKCIjYXN5bmNIZWxwZXIoI3ZhbHVlLCAjYm9keU5hbWUsICNjb250cm9sbGVyKSIsIHsKICAgICAgImFzeW5jSGVscGVyIjogYXN5bmNTdGFySGVscGVyLAogICAgICAidmFsdWUiOiB2YWx1ZSwKICAgICAgImJvZHlOYW1lIjogYm9keU5hbWUsCiAgICAgICJjb250cm9sbGVyIjogY29udHJvbGxlck5hbWUKICAgIH0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICByZXR1cm4gbmV3IGpzLlJldHVybihhc3luY0hlbHBlckNhbGwpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQp9CgovLy8gRmluZHMgb3V0Ci8vLwovLy8gLSB3aGljaCBleHByZXNzaW9ucyBoYXZlIHlpZWxkIG9yIGF3YWl0IG5lc3RlZCBpbiB0aGVtLgovLy8gLSB0YXJnZXRzIG9mIGp1bXBzCi8vLyAtIGEgc2V0IG9mIHVzZWQgbmFtZXMuCi8vLyAtIGlmIGFueSBbVGhpc10tZXhwcmVzc2lvbnMgYXJlIHVzZWQuCmNsYXNzIFByZVRyYW5zbGF0aW9uQW5hbHlzaXMgZXh0ZW5kcyBqcy5Ob2RlVmlzaXRvcjxib29sPiB7CiAgU2V0PGpzLk5vZGU+IGhhc0F3YWl0T3JZaWVsZCA9IG5ldyBTZXQ8anMuTm9kZT4oKTsKCiAgTWFwPGpzLk5vZGUsIGpzLk5vZGU+IHRhcmdldHMgPSBuZXcgTWFwPGpzLk5vZGUsIGpzLk5vZGU+KCk7CiAgTGlzdDxqcy5Ob2RlPiBsb29wc0FuZFN3aXRjaGVzID0gPGpzLk5vZGU+W107CiAgTGlzdDxqcy5MYWJlbGVkU3RhdGVtZW50PiBsYWJlbGxlZFN0YXRlbWVudHMgPSA8anMuTGFiZWxlZFN0YXRlbWVudD5bXTsKICBTZXQ8U3RyaW5nPiB1c2VkTmFtZXMgPSBuZXcgU2V0PFN0cmluZz4oKTsKCiAgYm9vbCBoYXNFeHBsaWNpdFJldHVybnMgPSBmYWxzZTsKCiAgYm9vbCBoYXNUaGlzID0gZmFsc2U7CgogIGJvb2wgaGFzWWllbGQgPSBmYWxzZTsKCiAgYm9vbCBoYXNGaW5hbGx5ID0gZmFsc2U7CgogIC8vIFRoZSBmdW5jdGlvbiBjdXJyZW50bHkgYmVpbmcgYW5hbHl6ZWQuCiAganMuRnVuIGN1cnJlbnRGdW5jdGlvbjsKCiAgLy8gRm9yIGVycm9yIG1lc3NhZ2VzLgogIGZpbmFsIEZ1bmN0aW9uIHVuc3VwcG9ydGVkOwoKICBQcmVUcmFuc2xhdGlvbkFuYWx5c2lzKHZvaWQgdGhpcy51bnN1cHBvcnRlZChqcy5Ob2RlIG5vZGUpKTsKCiAgYm9vbCB2aXNpdChqcy5Ob2RlIG5vZGUpIHsKICAgIGJvb2wgY29udGFpbnNBd2FpdCA9IG5vZGUuYWNjZXB0KHRoaXMpOwogICAgaWYgKGNvbnRhaW5zQXdhaXQpIHsKICAgICAgaGFzQXdhaXRPcllpZWxkLmFkZChub2RlKTsKICAgIH0KICAgIHJldHVybiBjb250YWluc0F3YWl0OwogIH0KCiAgYW5hbHl6ZShqcy5GdW4gbm9kZSkgewogICAgY3VycmVudEZ1bmN0aW9uID0gbm9kZTsKICAgIG5vZGUucGFyYW1zLmZvckVhY2godmlzaXQpOwogICAgdmlzaXQobm9kZS5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRBY2Nlc3MoanMuUHJvcGVydHlBY2Nlc3Mgbm9kZSkgewogICAgYm9vbCByZWNlaXZlciA9IHZpc2l0KG5vZGUucmVjZWl2ZXIpOwogICAgYm9vbCBzZWxlY3RvciA9IHZpc2l0KG5vZGUuc2VsZWN0b3IpOwogICAgcmV0dXJuIHJlY2VpdmVyIHx8IHNlbGVjdG9yOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEFycmF5SG9sZShqcy5BcnJheUhvbGUgbm9kZSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEFycmF5SW5pdGlhbGl6ZXIoanMuQXJyYXlJbml0aWFsaXplciBub2RlKSB7CiAgICBib29sIGNvbnRhaW5zQXdhaXQgPSBmYWxzZTsKICAgIGZvciAoanMuRXhwcmVzc2lvbiBlbGVtZW50IGluIG5vZGUuZWxlbWVudHMpIHsKICAgICAgaWYgKHZpc2l0KGVsZW1lbnQpKSBjb250YWluc0F3YWl0ID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBjb250YWluc0F3YWl0OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEFzc2lnbm1lbnQoanMuQXNzaWdubWVudCBub2RlKSB7CiAgICBib29sIGxlZnRIYW5kU2lkZSA9IHZpc2l0KG5vZGUubGVmdEhhbmRTaWRlKTsKICAgIGJvb2wgdmFsdWUgPSAobm9kZS52YWx1ZSA9PSBudWxsKSA/IGZhbHNlIDogdmlzaXQobm9kZS52YWx1ZSk7CiAgICByZXR1cm4gbGVmdEhhbmRTaWRlIHx8IHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEF3YWl0KGpzLkF3YWl0IG5vZGUpIHsKICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRCaW5hcnkoanMuQmluYXJ5IG5vZGUpIHsKICAgIGJvb2wgbGVmdCA9IHZpc2l0KG5vZGUubGVmdCk7CiAgICBib29sIHJpZ2h0ID0gdmlzaXQobm9kZS5yaWdodCk7CiAgICByZXR1cm4gbGVmdCB8fCByaWdodDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRCbG9jayhqcy5CbG9jayBub2RlKSB7CiAgICBib29sIGNvbnRhaW5zQXdhaXQgPSBmYWxzZTsKICAgIGZvciAoanMuU3RhdGVtZW50IHN0YXRlbWVudCBpbiBub2RlLnN0YXRlbWVudHMpIHsKICAgICAgaWYgKHZpc2l0KHN0YXRlbWVudCkpIGNvbnRhaW5zQXdhaXQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIGNvbnRhaW5zQXdhaXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0QnJlYWsoanMuQnJlYWsgbm9kZSkgewogICAgaWYgKG5vZGUudGFyZ2V0TGFiZWwgIT0gbnVsbCkgewogICAgICB0YXJnZXRzW25vZGVdID0KICAgICAgICAgIGxhYmVsbGVkU3RhdGVtZW50cy5sYXN0V2hlcmUoKGpzLkxhYmVsZWRTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICAgICAgcmV0dXJuIHN0YXRlbWVudC5sYWJlbCA9PSBub2RlLnRhcmdldExhYmVsOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHRhcmdldHNbbm9kZV0gPSBsb29wc0FuZFN3aXRjaGVzLmxhc3Q7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Q2FsbChqcy5DYWxsIG5vZGUpIHsKICAgIGJvb2wgY29udGFpbnNBd2FpdCA9IHZpc2l0KG5vZGUudGFyZ2V0KTsKICAgIGZvciAoanMuRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBub2RlLmFyZ3VtZW50cykgewogICAgICBpZiAodmlzaXQoYXJndW1lbnQpKSBjb250YWluc0F3YWl0ID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBjb250YWluc0F3YWl0OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdENhc2UoanMuQ2FzZSBub2RlKSB7CiAgICBib29sIGV4cHJlc3Npb24gPSB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogICAgYm9vbCBib2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIHJldHVybiBleHByZXNzaW9uIHx8IGJvZHk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Q2F0Y2goanMuQ2F0Y2ggbm9kZSkgewogICAgYm9vbCBkZWNsYXJhdGlvbiA9IHZpc2l0KG5vZGUuZGVjbGFyYXRpb24pOwogICAgYm9vbCBib2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIHJldHVybiBkZWNsYXJhdGlvbiB8fCBib2R5OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdENvbW1lbnQoanMuQ29tbWVudCBub2RlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Q29uZGl0aW9uYWwoanMuQ29uZGl0aW9uYWwgbm9kZSkgewogICAgYm9vbCBjb25kaXRpb24gPSB2aXNpdChub2RlLmNvbmRpdGlvbik7CiAgICBib29sIHRoZW4gPSB2aXNpdChub2RlLnRoZW4pOwogICAgYm9vbCBvdGhlcndpc2UgPSB2aXNpdChub2RlLm90aGVyd2lzZSk7CiAgICByZXR1cm4gY29uZGl0aW9uIHx8IHRoZW4gfHwgb3RoZXJ3aXNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdENvbnRpbnVlKGpzLkNvbnRpbnVlIG5vZGUpIHsKICAgIGlmIChub2RlLnRhcmdldExhYmVsICE9IG51bGwpIHsKICAgICAganMuTGFiZWxlZFN0YXRlbWVudCB0YXJnZXRMYWJlbCA9IGxhYmVsbGVkU3RhdGVtZW50cy5sYXN0V2hlcmUoCiAgICAgICAgICAoanMuTGFiZWxlZFN0YXRlbWVudCBzdG0pID0+IHN0bS5sYWJlbCA9PSBub2RlLnRhcmdldExhYmVsKTsKICAgICAganMuTG9vcCB0YXJnZXRTdGF0ZW1lbnQgPSB0YXJnZXRMYWJlbC5ib2R5OwogICAgICB0YXJnZXRzW25vZGVdID0gdGFyZ2V0U3RhdGVtZW50OwogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0c1tub2RlXSA9CiAgICAgICAgICBsb29wc0FuZFN3aXRjaGVzLmxhc3RXaGVyZSgoanMuTm9kZSBub2RlKSA9PiBub2RlIGlzISBqcy5Td2l0Y2gpOwogICAgfQogICAgYXNzZXJ0KCgpIHsKICAgICAganMuTm9kZSB0YXJnZXQgPSB0YXJnZXRzW25vZGVdOwogICAgICByZXR1cm4gdGFyZ2V0IGlzIGpzLkxvb3AgfHwKICAgICAgICAgICh0YXJnZXQgaXMganMuTGFiZWxlZFN0YXRlbWVudCAmJiB0YXJnZXQuYm9keSBpcyBqcy5Mb29wKTsKICAgIH0oKSk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RGVmYXVsdChqcy5EZWZhdWx0IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdChub2RlLmJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdERvKGpzLkRvIG5vZGUpIHsKICAgIGxvb3BzQW5kU3dpdGNoZXMuYWRkKG5vZGUpOwogICAgYm9vbCBib2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIGJvb2wgY29uZGl0aW9uID0gdmlzaXQobm9kZS5jb25kaXRpb24pOwogICAgbG9vcHNBbmRTd2l0Y2hlcy5yZW1vdmVMYXN0KCk7CiAgICByZXR1cm4gYm9keSB8fCBjb25kaXRpb247CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RW1wdHlTdGF0ZW1lbnQoanMuRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoanMuRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gdmlzaXQobm9kZS5leHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGb3IoanMuRm9yIG5vZGUpIHsKICAgIGJvb2wgaW5pdCA9IChub2RlLmluaXQgPT0gbnVsbCkgPyBmYWxzZSA6IHZpc2l0KG5vZGUuaW5pdCk7CiAgICBib29sIGNvbmRpdGlvbiA9IChub2RlLmNvbmRpdGlvbiA9PSBudWxsKSA/IGZhbHNlIDogdmlzaXQobm9kZS5jb25kaXRpb24pOwogICAgYm9vbCB1cGRhdGUgPSAobm9kZS51cGRhdGUgPT0gbnVsbCkgPyBmYWxzZSA6IHZpc2l0KG5vZGUudXBkYXRlKTsKICAgIGxvb3BzQW5kU3dpdGNoZXMuYWRkKG5vZGUpOwogICAgYm9vbCBib2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIGxvb3BzQW5kU3dpdGNoZXMucmVtb3ZlTGFzdCgpOwogICAgcmV0dXJuIGluaXQgfHwgY29uZGl0aW9uIHx8IHVwZGF0ZSB8fCBib2R5OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEZvckluKGpzLkZvckluIG5vZGUpIHsKICAgIGJvb2wgb2JqZWN0ID0gdmlzaXQobm9kZS5vYmplY3QpOwogICAgbG9vcHNBbmRTd2l0Y2hlcy5hZGQobm9kZSk7CiAgICBib29sIGJvZHkgPSB2aXNpdChub2RlLmJvZHkpOwogICAgbG9vcHNBbmRTd2l0Y2hlcy5yZW1vdmVMYXN0KCk7CiAgICByZXR1cm4gb2JqZWN0IHx8IGJvZHk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuKGpzLkZ1biBub2RlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihqcy5GdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJZihqcy5JZiBub2RlKSB7CiAgICBib29sIGNvbmRpdGlvbiA9IHZpc2l0KG5vZGUuY29uZGl0aW9uKTsKICAgIGJvb2wgdGhlbiA9IHZpc2l0KG5vZGUudGhlbik7CiAgICBib29sIG90aGVyd2lzZSA9IHZpc2l0KG5vZGUub3RoZXJ3aXNlKTsKICAgIHJldHVybiBjb25kaXRpb24gfHwgdGhlbiB8fCBvdGhlcndpc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbihqcy5JbnRlcnBvbGF0ZWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbihqcy5JbnRlcnBvbGF0ZWREZWNsYXJhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW50ZXJwb2xhdGVkTGl0ZXJhbChqcy5JbnRlcnBvbGF0ZWRMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIoanMuSW50ZXJwb2xhdGVkUGFyYW1ldGVyIG5vZGUpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcnBvbGF0ZWRTZWxlY3Rvcihqcy5JbnRlcnBvbGF0ZWRTZWxlY3RvciBub2RlKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW50ZXJwb2xhdGVkU3RhdGVtZW50KGpzLkludGVycG9sYXRlZFN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TGFiZWxlZFN0YXRlbWVudChqcy5MYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKICAgIHVzZWROYW1lcy5hZGQobm9kZS5sYWJlbCk7CiAgICBsYWJlbGxlZFN0YXRlbWVudHMuYWRkKG5vZGUpOwogICAgYm9vbCBjb250YWluc0F3YWl0ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIGxhYmVsbGVkU3RhdGVtZW50cy5yZW1vdmVMYXN0KCk7CiAgICByZXR1cm4gY29udGFpbnNBd2FpdDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXREZWZlcnJlZEV4cHJlc3Npb24oanMuRGVmZXJyZWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXREZWZlcnJlZE51bWJlcihqcy5EZWZlcnJlZE51bWJlciBub2RlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RGVmZXJyZWRTdHJpbmcoanMuRGVmZXJyZWRTdHJpbmcgbm9kZSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExpdGVyYWxCb29sKGpzLkxpdGVyYWxCb29sIG5vZGUpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRMaXRlcmFsRXhwcmVzc2lvbihqcy5MaXRlcmFsRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TGl0ZXJhbE51bGwoanMuTGl0ZXJhbE51bGwgbm9kZSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExpdGVyYWxOdW1iZXIoanMuTGl0ZXJhbE51bWJlciBub2RlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TGl0ZXJhbFN0YXRlbWVudChqcy5MaXRlcmFsU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRMaXRlcmFsU3RyaW5nKGpzLkxpdGVyYWxTdHJpbmcgbm9kZSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oanMuU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TmFtZShqcy5OYW1lIG5vZGUpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRQYXJlbnRoZXNlcyhqcy5QYXJlbnRoZXNlcyBub2RlKSB7CiAgICByZXR1cm4gdmlzaXQobm9kZS5lbmNsb3NlZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TmFtZWRGdW5jdGlvbihqcy5OYW1lZEZ1bmN0aW9uIG5vZGUpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXROZXcoanMuTmV3IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdENhbGwobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0T2JqZWN0SW5pdGlhbGl6ZXIoanMuT2JqZWN0SW5pdGlhbGl6ZXIgbm9kZSkgewogICAgYm9vbCBjb250YWluc0F3YWl0ID0gZmFsc2U7CiAgICBmb3IgKGpzLlByb3BlcnR5IHByb3BlcnR5IGluIG5vZGUucHJvcGVydGllcykgewogICAgICBpZiAodmlzaXQocHJvcGVydHkpKSBjb250YWluc0F3YWl0ID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBjb250YWluc0F3YWl0OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFBhcmFtZXRlcihqcy5QYXJhbWV0ZXIgbm9kZSkgewogICAgdXNlZE5hbWVzLmFkZChub2RlLm5hbWUpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFBvc3RmaXgoanMuUG9zdGZpeCBub2RlKSB7CiAgICByZXR1cm4gdmlzaXQobm9kZS5hcmd1bWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UHJlZml4KGpzLlByZWZpeCBub2RlKSB7CiAgICByZXR1cm4gdmlzaXQobm9kZS5hcmd1bWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UHJvZ3JhbShqcy5Qcm9ncmFtIG5vZGUpIHsKICAgIHRocm93ICJVbmV4cGVjdGVkIjsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRQcm9wZXJ0eShqcy5Qcm9wZXJ0eSBub2RlKSB7CiAgICByZXR1cm4gdmlzaXQobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UmVnRXhwTGl0ZXJhbChqcy5SZWdFeHBMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRSZXR1cm4oanMuUmV0dXJuIG5vZGUpIHsKICAgIGhhc0V4cGxpY2l0UmV0dXJucyA9IHRydWU7CiAgICB0YXJnZXRzW25vZGVdID0gY3VycmVudEZ1bmN0aW9uOwogICAgaWYgKG5vZGUudmFsdWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHZpc2l0KG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFN3aXRjaChqcy5Td2l0Y2ggbm9kZSkgewogICAgbG9vcHNBbmRTd2l0Y2hlcy5hZGQobm9kZSk7CiAgICAvLyBJZiB0aGUga2V5IGhhcyBhbiBgYXdhaXRgIGV4cHJlc3Npb24sIGRvIG5vdCB0cmFuc2Zvcm0gdGhlCiAgICAvLyBib2R5IG9mIHRoZSBzd2l0Y2guCiAgICB2aXNpdChub2RlLmtleSk7CiAgICBib29sIHJlc3VsdCA9IGZhbHNlOwogICAgZm9yIChqcy5Td2l0Y2hDbGF1c2UgY2xhdXNlIGluIG5vZGUuY2FzZXMpIHsKICAgICAgaWYgKHZpc2l0KGNsYXVzZSkpIHJlc3VsdCA9IHRydWU7CiAgICB9CiAgICBsb29wc0FuZFN3aXRjaGVzLnJlbW92ZUxhc3QoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VGhpcyhqcy5UaGlzIG5vZGUpIHsKICAgIGhhc1RoaXMgPSB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFRocm93KGpzLlRocm93IG5vZGUpIHsKICAgIHJldHVybiB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFRyeShqcy5Ucnkgbm9kZSkgewogICAgYm9vbCBib2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIGJvb2wgY2F0Y2hQYXJ0ID0gKG5vZGUuY2F0Y2hQYXJ0ID09IG51bGwpID8gZmFsc2UgOiB2aXNpdChub2RlLmNhdGNoUGFydCk7CiAgICBib29sIGZpbmFsbHlQYXJ0ID0KICAgICAgICAobm9kZS5maW5hbGx5UGFydCA9PSBudWxsKSA/IGZhbHNlIDogdmlzaXQobm9kZS5maW5hbGx5UGFydCk7CiAgICBpZiAoZmluYWxseVBhcnQgIT0gbnVsbCkgaGFzRmluYWxseSA9IHRydWU7CiAgICByZXR1cm4gYm9keSB8fCBjYXRjaFBhcnQgfHwgZmluYWxseVBhcnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihqcy5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHVzZWROYW1lcy5hZGQobm9kZS5uYW1lKTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBub2RlKSB7CiAgICBib29sIHJlc3VsdCA9IGZhbHNlOwogICAgZm9yIChqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uIGluaXQgaW4gbm9kZS5kZWNsYXJhdGlvbnMpIHsKICAgICAgaWYgKHZpc2l0KGluaXQpKSByZXN1bHQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24gbm9kZSkgewogICAgcmV0dXJuIHZpc2l0QXNzaWdubWVudChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRWYXJpYWJsZVVzZShqcy5WYXJpYWJsZVVzZSBub2RlKSB7CiAgICB1c2VkTmFtZXMuYWRkKG5vZGUubmFtZSk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0V2hpbGUoanMuV2hpbGUgbm9kZSkgewogICAgbG9vcHNBbmRTd2l0Y2hlcy5hZGQobm9kZSk7CiAgICBib29sIGNvbmRpdGlvbiA9IHZpc2l0KG5vZGUuY29uZGl0aW9uKTsKICAgIGJvb2wgYm9keSA9IHZpc2l0KG5vZGUuYm9keSk7CiAgICBsb29wc0FuZFN3aXRjaGVzLnJlbW92ZUxhc3QoKTsKICAgIHJldHVybiBjb25kaXRpb24gfHwgYm9keTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXREYXJ0WWllbGQoanMuRGFydFlpZWxkIG5vZGUpIHsKICAgIGhhc1lpZWxkID0gdHJ1ZTsKICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KizYATk48ARcBGh0BUAEZPyYYAU5IThoER04pBEoROkkVTAE+OwEjPwFQBjYGTz5MRBc9AREUATEGGAY9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AQwnIQQBDCUhBAEMJxgEAQwpHgQBDDMSBAEMJR8lKh4EAQwlIEIbFRkxKAYjEwQBDCEUEgQBDCMjBAEMHyJPF0YwLQQBDD8eEgQBDEcZQCYGEwQBDEUiBAEMLx4SBAEMIyAsIiMeBAEMKxUcEQQCASpwYWNrYWdlOmNvbXBpbGVyL3NyYy9qcy9yZXdyaXRlX2FzeW5jLmRhcnQuc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL2NvZGVnZW4uZGFydMAB86gvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0Om1hdGgnIGFzIG1hdGg7CmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJyBzaG93IFF1ZXVlOwoKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2RhcnQyanMuZGFydCcgc2hvdyBMaW5rOwoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi9jb2RlZ2VuLmRhcnQnIHNob3cgQ29kZWdlblJlZ2lzdHJ5OwppbXBvcnQgJy4uL2NvbW1vbi90YXNrcy5kYXJ0JyBzaG93IE1lYXN1cmVyLCBDb21waWxlclRhc2s7CmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0YW50X3N5c3RlbS5kYXJ0JyBhcyBjb25zdGFudF9zeXN0ZW07CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBKQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvanVtcHMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ludGVyY2VwdG9yX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9iYWNrZW5kLmRhcnQnIHNob3cgQ29kZWdlbklucHV0czsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2NoZWNrZWRfbW9kZV9oZWxwZXJzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYW1lci5kYXJ0JyBzaG93IE1vZHVsYXJOYW1lcjsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ydW50aW1lX3R5cGVzX2NvZGVnZW4uZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ydW50aW1lX3R5cGVzX25ldy5kYXJ0JyBzaG93IFJlY2lwZUVuY29kZXI7CmltcG9ydCAnLi4vanNfZW1pdHRlci9jb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JyBzaG93IE1vZHVsYXJFbWl0dGVyOwppbXBvcnQgJy4uL2pzX21vZGVsL2VsZW1lbnRzLmRhcnQnIHNob3cgSkdlbmVyYXRvckJvZHk7CmltcG9ydCAnLi4vanNfbW9kZWwvdHlwZV9yZWNpcGUuZGFydCcgc2hvdyBUeXBlRXhwcmVzc2lvblJlY2lwZTsKaW1wb3J0ICcuLi9uYXRpdmUvYmVoYXZpb3IuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi90cmFjZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCcgc2hvdyBDYWxsU3RydWN0dXJlOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vdW5pdmVyc2UvdXNlLmRhcnQnIHNob3cgQ29uc3RhbnRVc2UsIER5bmFtaWNVc2UsIFN0YXRpY1VzZSwgVHlwZVVzZTsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICdjb2RlZ2VuX2hlbHBlcnMuZGFydCc7CmltcG9ydCAnbm9kZXMuZGFydCc7CmltcG9ydCAndmFyaWFibGVfYWxsb2NhdG9yLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgQ29kZWdlblBoYXNlIHsKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJyRydW50aW1lVHlwZSc7CiAgdm9pZCB2aXNpdEdyYXBoKEhHcmFwaCBncmFwaCk7Cn0KCmNsYXNzIFNzYUNvZGVHZW5lcmF0b3JUYXNrIGV4dGVuZHMgQ29tcGlsZXJUYXNrIHsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSBzb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5OwoKICBTc2FDb2RlR2VuZXJhdG9yVGFzaygKICAgICAgTWVhc3VyZXIgbWVhc3VyZXIsIHRoaXMuX29wdGlvbnMsIHRoaXMuc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSkKICAgICAgOiBzdXBlcihtZWFzdXJlcik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiAnU1NBIGNvZGUgZ2VuZXJhdG9yJzsKCiAganMuRnVuIGJ1aWxkSmF2YVNjcmlwdEZ1bmN0aW9uKGJvb2wgbmVlZHNBc3luY1Jld3JpdGUsIEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsCiAgICAgIExpc3Q8anMuUGFyYW1ldGVyPiBwYXJhbWV0ZXJzLCBqcy5CbG9jayBib2R5KSB7CiAgICBqcy5GdW4gZmluaXNoKGpzLkFzeW5jTW9kaWZpZXIgYXN5bmNNb2RpZmllcikgewogICAgICByZXR1cm4gbmV3IGpzLkZ1bihwYXJhbWV0ZXJzLCBib2R5LCBhc3luY01vZGlmaWVyOiBhc3luY01vZGlmaWVyKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5CiAgICAgICAgICAgICAgLmNyZWF0ZUJ1aWxkZXJGb3JDb250ZXh0KGVsZW1lbnQpCiAgICAgICAgICAgICAgLmJ1aWxkRGVjbGFyYXRpb24oZWxlbWVudCkpOwogICAgfQoKICAgIGlmIChuZWVkc0FzeW5jUmV3cml0ZSkgewogICAgICByZXR1cm4gZmluaXNoKGVsZW1lbnQuYXN5bmNNYXJrZXIuaXNBc3luYwogICAgICAgICAgPyAoZWxlbWVudC5hc3luY01hcmtlci5pc1lpZWxkaW5nCiAgICAgICAgICAgICAgPyBqcy5Bc3luY01vZGlmaWVyLmFzeW5jU3RhcgogICAgICAgICAgICAgIDoganMuQXN5bmNNb2RpZmllci5hc3luYykKICAgICAgICAgIDogKGVsZW1lbnQuYXN5bmNNYXJrZXIuaXNZaWVsZGluZwogICAgICAgICAgICAgID8ganMuQXN5bmNNb2RpZmllci5zeW5jU3RhcgogICAgICAgICAgICAgIDoganMuQXN5bmNNb2RpZmllci5zeW5jKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmluaXNoKGpzLkFzeW5jTW9kaWZpZXIuc3luYyk7CiAgICB9CiAgfQoKICBqcy5FeHByZXNzaW9uIGdlbmVyYXRlQ29kZSgKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBDb2RlZ2VuSW5wdXRzIGNvZGVnZW4sCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgQ29kZWdlblJlZ2lzdHJ5IHJlZ2lzdHJ5LAogICAgICBNb2R1bGFyTmFtZXIgbmFtZXIsCiAgICAgIE1vZHVsYXJFbWl0dGVyIGVtaXR0ZXIpIHsKICAgIGlmIChtZW1iZXIuaXNGaWVsZCkgewogICAgICByZXR1cm4gZ2VuZXJhdGVMYXp5SW5pdGlhbGl6ZXIoCiAgICAgICAgICBtZW1iZXIsIGdyYXBoLCBjb2RlZ2VuLCBjbG9zZWRXb3JsZCwgcmVnaXN0cnksIG5hbWVyLCBlbWl0dGVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBnZW5lcmF0ZU1ldGhvZCgKICAgICAgICAgIG1lbWJlciwgZ3JhcGgsIGNvZGVnZW4sIGNsb3NlZFdvcmxkLCByZWdpc3RyeSwgbmFtZXIsIGVtaXR0ZXIpOwogICAgfQogIH0KCiAganMuRXhwcmVzc2lvbiBnZW5lcmF0ZUxhenlJbml0aWFsaXplcigKICAgICAgRmllbGRFbnRpdHkgZmllbGQsCiAgICAgIEhHcmFwaCBncmFwaCwKICAgICAgQ29kZWdlbklucHV0cyBjb2RlZ2VuLAogICAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQsCiAgICAgIENvZGVnZW5SZWdpc3RyeSByZWdpc3RyeSwKICAgICAgTW9kdWxhck5hbWVyIG5hbWVyLAogICAgICBNb2R1bGFyRW1pdHRlciBlbWl0dGVyKSB7CiAgICByZXR1cm4gbWVhc3VyZSgoKSB7CiAgICAgIGNvZGVnZW4udHJhY2VyLnRyYWNlR3JhcGgoImNvZGVnZW4iLCBncmFwaCk7CiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb25TdHJhdGVneQogICAgICAgICAgLmNyZWF0ZUJ1aWxkZXJGb3JDb250ZXh0KGZpZWxkKQogICAgICAgICAgLmJ1aWxkRGVjbGFyYXRpb24oZmllbGQpOwogICAgICBTc2FDb2RlR2VuZXJhdG9yIGNvZGVHZW5lcmF0b3IgPSBuZXcgU3NhQ29kZUdlbmVyYXRvcigKICAgICAgICAgIHRoaXMsCiAgICAgICAgICBfb3B0aW9ucywKICAgICAgICAgIGVtaXR0ZXIsCiAgICAgICAgICBjb2RlZ2VuLmNoZWNrZWRNb2RlSGVscGVycywKICAgICAgICAgIGNvZGVnZW4ucnRpU3Vic3RpdHV0aW9ucywKICAgICAgICAgIGNvZGVnZW4ucnRpRW5jb2RlciwKICAgICAgICAgIGNvZGVnZW4ucnRpUmVjaXBlRW5jb2RlciwKICAgICAgICAgIG5hbWVyLAogICAgICAgICAgY29kZWdlbi50cmFjZXIsCiAgICAgICAgICBjbG9zZWRXb3JsZCwKICAgICAgICAgIHJlZ2lzdHJ5KTsKICAgICAgY29kZUdlbmVyYXRvci52aXNpdEdyYXBoKGdyYXBoKTsKICAgICAgcmV0dXJuIG5ldyBqcy5GdW4oY29kZUdlbmVyYXRvci5wYXJhbWV0ZXJzLCBjb2RlR2VuZXJhdG9yLmJvZHkpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0pOwogIH0KCiAganMuRXhwcmVzc2lvbiBnZW5lcmF0ZU1ldGhvZCgKICAgICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kLAogICAgICBIR3JhcGggZ3JhcGgsCiAgICAgIENvZGVnZW5JbnB1dHMgY29kZWdlbiwKICAgICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLAogICAgICBDb2RlZ2VuUmVnaXN0cnkgcmVnaXN0cnksCiAgICAgIE1vZHVsYXJOYW1lciBuYW1lciwKICAgICAgTW9kdWxhckVtaXR0ZXIgZW1pdHRlcikgewogICAgcmV0dXJuIG1lYXN1cmUoKCkgewogICAgICBpZiAobWV0aG9kLmFzeW5jTWFya2VyICE9IEFzeW5jTWFya2VyLlNZTkMpIHsKICAgICAgICByZWdpc3RyeS5yZWdpc3RlckFzeW5jTWFya2VyKG1ldGhvZC5hc3luY01hcmtlcik7CiAgICAgIH0KICAgICAgU3NhQ29kZUdlbmVyYXRvciBjb2RlR2VuZXJhdG9yID0gbmV3IFNzYUNvZGVHZW5lcmF0b3IoCiAgICAgICAgICB0aGlzLAogICAgICAgICAgX29wdGlvbnMsCiAgICAgICAgICBlbWl0dGVyLAogICAgICAgICAgY29kZWdlbi5jaGVja2VkTW9kZUhlbHBlcnMsCiAgICAgICAgICBjb2RlZ2VuLnJ0aVN1YnN0aXR1dGlvbnMsCiAgICAgICAgICBjb2RlZ2VuLnJ0aUVuY29kZXIsCiAgICAgICAgICBjb2RlZ2VuLnJ0aVJlY2lwZUVuY29kZXIsCiAgICAgICAgICBuYW1lciwKICAgICAgICAgIGNvZGVnZW4udHJhY2VyLAogICAgICAgICAgY2xvc2VkV29ybGQsCiAgICAgICAgICByZWdpc3RyeSk7CiAgICAgIGNvZGVHZW5lcmF0b3IudmlzaXRHcmFwaChncmFwaCk7CiAgICAgIGNvZGVnZW4udHJhY2VyLnRyYWNlR3JhcGgoImNvZGVnZW4iLCBncmFwaCk7CiAgICAgIHJldHVybiBidWlsZEphdmFTY3JpcHRGdW5jdGlvbihncmFwaC5uZWVkc0FzeW5jUmV3cml0ZSwgbWV0aG9kLAogICAgICAgICAgY29kZUdlbmVyYXRvci5wYXJhbWV0ZXJzLCBjb2RlR2VuZXJhdG9yLmJvZHkpOwogICAgfSk7CiAgfQp9CgpjbGFzcyBTc2FDb2RlR2VuZXJhdG9yIGltcGxlbWVudHMgSFZpc2l0b3IsIEhCbG9ja0luZm9ybWF0aW9uVmlzaXRvciB7CiAgLy8vIFJldHVybmVkIGJ5IFtleHByZXNzaW9uVHlwZV0gdG8gdGVsbCBob3cgY29kZSBjYW4gYmUgZ2VuZXJhdGVkIGZvcgogIC8vLyBhIHN1YmdyYXBoLgogIC8vLyAtIFtUWVBFX1NUQVRFTUVOVF0gbWVhbnMgdGhhdCB0aGUgZ3JhcGggbXVzdCBiZSBnZW5lcmF0ZWQgYXMgYSBzdGF0ZW1lbnQsCiAgLy8vIHdoaWNoIGlzIGFsd2F5cyBwb3NzaWJsZS4KICAvLy8gLSBbVFlQRV9FWFBSRVNTSU9OXSBtZWFucyB0aGF0IHRoZSBncmFwaCBjYW4gYmUgZ2VuZXJhdGVkIGFzIGFuIGV4cHJlc3Npb24sCiAgLy8vIG9yIHBvc3NpYmx5IHNldmVyYWwgY29tbWEtc2VwYXJhdGVkIGV4cHJlc3Npb25zLgogIC8vLyAtIFtUWVBFX0RFQ0xBUkFUSU9OXSBtZWFucyB0aGF0IHRoZSBncmFwaCBjYW4gYmUgZ2VuZXJhdGVkIGFzIGFuCiAgLy8vIGV4cHJlc3Npb24sIGFuZCB0aGF0IGl0IG9ubHkgZ2VuZXJhdGVzIGV4cHJlc3Npb25zIG9mIHRoZSBmb3JtCiAgLy8vICAgdmFyaWFibGUgPSBleHByZXNzaW9uCiAgLy8vIHdoaWNoIGFyZSBhbHNvIHZhbGlkIGFzIHBhcnRzIG9mIGEgInZhciIgZGVjbGFyYXRpb24uCiAgc3RhdGljIGNvbnN0IGludCBUWVBFX1NUQVRFTUVOVCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBUWVBFX0VYUFJFU1NJT04gPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9ERUNMQVJBVElPTiA9IDI7CgogIC8vLyBXaGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgZ2VuZXJhdGluZyBleHByZXNzaW9ucyBpbnN0ZWFkIG9mIHN0YXRlbWVudHMuCiAgLy8vIFRoaXMgaW5jbHVkZXMgZGVjbGFyYXRpb25zLCB3aGljaCBhcmUgZ2VuZXJhdGVkIGFzIGV4cHJlc3Npb25zLgogIGJvb2wgaXNHZW5lcmF0aW5nRXhwcmVzc2lvbiA9IGZhbHNlOwoKICBmaW5hbCBDb21waWxlclRhc2sgX2NvZGVnZW5UYXNrOwogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBfb3B0aW9uczsKICBmaW5hbCBNb2R1bGFyRW1pdHRlciBfZW1pdHRlcjsKICBmaW5hbCBDaGVja2VkTW9kZUhlbHBlcnMgX2NoZWNrZWRNb2RlSGVscGVyczsKICBmaW5hbCBSdW50aW1lVHlwZXNTdWJzdGl0dXRpb25zIF9ydGlTdWJzdGl0dXRpb25zOwogIGZpbmFsIFJ1bnRpbWVUeXBlc0VuY29kZXIgX3J0aUVuY29kZXI7CiAgZmluYWwgUmVjaXBlRW5jb2RlciBfcnRpUmVjaXBlRW5jb2RlcjsKICBmaW5hbCBNb2R1bGFyTmFtZXIgX25hbWVyOwogIGZpbmFsIFRyYWNlciBfdHJhY2VyOwogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CiAgZmluYWwgQ29kZWdlblJlZ2lzdHJ5IF9yZWdpc3RyeTsKCiAgZmluYWwgU2V0PEhJbnN0cnVjdGlvbj4gZ2VuZXJhdGVBdFVzZVNpdGU7CiAgZmluYWwgU2V0PEhJbnN0cnVjdGlvbj4gY29udHJvbEZsb3dPcGVyYXRvcnM7CiAgZmluYWwgU2V0PEp1bXBUYXJnZXQ+IGJyZWFrQWN0aW9uOwogIGZpbmFsIFNldDxMYWJlbERlZmluaXRpb24+IGNvbnRpbnVlQWN0aW9uOwogIGZpbmFsIFNldDxKdW1wVGFyZ2V0PiBpbXBsaWNpdENvbnRpbnVlQWN0aW9uOwogIGZpbmFsIExpc3Q8anMuUGFyYW1ldGVyPiBwYXJhbWV0ZXJzOwoKICBqcy5CbG9jayBjdXJyZW50Q29udGFpbmVyOwogIGpzLkJsb2NrIGdldCBib2R5ID0+IGN1cnJlbnRDb250YWluZXI7CiAgTGlzdDxqcy5FeHByZXNzaW9uPiBleHByZXNzaW9uU3RhY2s7CiAgTGlzdDxqcy5CbG9jaz4gb2xkQ29udGFpbmVyU3RhY2s7CgogIC8vLyBDb250YWlucyB0aGUgbmFtZXMgb2YgdGhlIGluc3RydWN0aW9ucywgYXMgd2VsbCBhcyB0aGUgcGFyYWxsZWwKICAvLy8gY29waWVzIHRvIHBlcmZvcm0gb24gYmxvY2sgdHJhbnNpdGlvbmluZy4KICBWYXJpYWJsZU5hbWVzIHZhcmlhYmxlTmFtZXM7CgogIC8vLyBgdHJ1ZWAgd2hlbiB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgYHZhcmAgZGVjbGFyYXRpb24gYXQgZnVuY3Rpb24gZW50cnksCiAgLy8vIGBmYWxzZWAgaWYgd2UgY2FuIGdlbmVyYXRlIGEgYHZhcmAgZGVjbGFyYXRpb24gYXQgZmlyc3QgYXNzaWdubWVudCBpbiB0aGUKICAvLy8gbWlkZGxlIG9mIHRoZSBmdW5jdGlvbi4KICBib29sIHNob3VsZEdyb3VwVmFyRGVjbGFyYXRpb25zID0gZmFsc2U7CgogIC8vLyBXaGlsZSBnZW5lcmF0aW5nIGV4cHJlc3Npb25zLCB3ZSBjYW4ndCBpbnNlcnQgdmFyaWFibGUgZGVjbGFyYXRpb25zLgogIC8vLyBJbnN0ZWFkIHdlIGRlY2xhcmUgdGhlbSBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLiAgV2hlbiBtaW5pZnlpbmcKICAvLy8gd2UgZG8gdGhpcyBtb3N0IG9mIHRoZSB0aW1lLCBiZWNhdXNlIGl0IHJlZHVjZXMgdGhlIHNpemUgdW5sZXNzIHRoZXJlCiAgLy8vIGlzIG9ubHkgb25lIHZhcmlhYmxlLgogIGZpbmFsIFNldDxTdHJpbmc+IGNvbGxlY3RlZFZhcmlhYmxlRGVjbGFyYXRpb25zOwoKICAvLy8gU2V0IG9mIHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRlY2xhcmVkLgogIGZpbmFsIFNldDxTdHJpbmc+IGRlY2xhcmVkTG9jYWxzOwoKICBIR3JhcGggY3VycmVudEdyYXBoOwoKICAvLyBSZWNvcmRzIGEgYmxvY2staW5mb3JtYXRpb24gdGhhdCBpcyBiZWluZyBoYW5kbGVkIHNwZWNpYWxseS4KICAvLyBVc2VkIHRvIGJyZWFrIGJhZCByZWN1cnNpb24uCiAgSEJsb2NrSW5mb3JtYXRpb24gY3VycmVudEJsb2NrSW5mb3JtYXRpb247CiAgLy8gVGhlIHN1YmdyYXBoIGlzIHVzZWQgdG8gZGVsaW1pdCB0cmF2ZXJzYWwgZm9yIHNvbWUgY29uc3RydWN0aW9ucywgZS5nLiwKICAvLyBpZiBicmFuY2hlcy4KICBTdWJHcmFwaCBzdWJHcmFwaDsKCiAgLy8gUGVuZGluZyBibG9ja3MgdGhhbiBuZWVkIHRvIGJlIHZpc2l0ZWQgYXMgcGFydCBvZiBjdXJyZW50IHN1YmdyYXBoLgogIFF1ZXVlPEhCYXNpY0Jsb2NrPiBibG9ja1F1ZXVlOwoKICBTc2FDb2RlR2VuZXJhdG9yKAogICAgICB0aGlzLl9jb2RlZ2VuVGFzaywKICAgICAgdGhpcy5fb3B0aW9ucywKICAgICAgdGhpcy5fZW1pdHRlciwKICAgICAgdGhpcy5fY2hlY2tlZE1vZGVIZWxwZXJzLAogICAgICB0aGlzLl9ydGlTdWJzdGl0dXRpb25zLAogICAgICB0aGlzLl9ydGlFbmNvZGVyLAogICAgICB0aGlzLl9ydGlSZWNpcGVFbmNvZGVyLAogICAgICB0aGlzLl9uYW1lciwKICAgICAgdGhpcy5fdHJhY2VyLAogICAgICB0aGlzLl9jbG9zZWRXb3JsZCwKICAgICAgdGhpcy5fcmVnaXN0cnksCiAgICAgIHtTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbn0pCiAgICAgIDogZGVjbGFyZWRMb2NhbHMgPSBuZXcgU2V0PFN0cmluZz4oKSwKICAgICAgICBjb2xsZWN0ZWRWYXJpYWJsZURlY2xhcmF0aW9ucyA9IG5ldyBTZXQ8U3RyaW5nPigpLAogICAgICAgIGN1cnJlbnRDb250YWluZXIgPSBuZXcganMuQmxvY2suZW1wdHkoKSwKICAgICAgICBwYXJhbWV0ZXJzID0gPGpzLlBhcmFtZXRlcj5bXSwKICAgICAgICBleHByZXNzaW9uU3RhY2sgPSA8anMuRXhwcmVzc2lvbj5bXSwKICAgICAgICBvbGRDb250YWluZXJTdGFjayA9IDxqcy5CbG9jaz5bXSwKICAgICAgICBnZW5lcmF0ZUF0VXNlU2l0ZSA9IG5ldyBTZXQ8SEluc3RydWN0aW9uPigpLAogICAgICAgIGNvbnRyb2xGbG93T3BlcmF0b3JzID0gbmV3IFNldDxISW5zdHJ1Y3Rpb24+KCksCiAgICAgICAgYnJlYWtBY3Rpb24gPSBuZXcgU2V0PEp1bXBUYXJnZXQ+KCksCiAgICAgICAgY29udGludWVBY3Rpb24gPSBuZXcgU2V0PExhYmVsRGVmaW5pdGlvbj4oKSwKICAgICAgICBpbXBsaWNpdENvbnRpbnVlQWN0aW9uID0gbmV3IFNldDxKdW1wVGFyZ2V0PigpOwoKICBKQ29tbW9uRWxlbWVudHMgZ2V0IF9jb21tb25FbGVtZW50cyA9PiBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHM7CgogIE5hdGl2ZURhdGEgZ2V0IF9uYXRpdmVEYXRhID0+IF9jbG9zZWRXb3JsZC5uYXRpdmVEYXRhOwoKICBJbnRlcmNlcHRvckRhdGEgZ2V0IF9pbnRlcmNlcHRvckRhdGEgPT4gX2Nsb3NlZFdvcmxkLmludGVyY2VwdG9yRGF0YTsKCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgX2Fic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgX2Nsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIGJvb2wgaXNHZW5lcmF0ZUF0VXNlU2l0ZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIHJldHVybiBnZW5lcmF0ZUF0VXNlU2l0ZS5jb250YWlucyhpbnN0cnVjdGlvbik7CiAgfQoKICBib29sIGhhc05vbkJpdE9wVXNlcihISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIFNldDxIUGhpPiBwaGlTZXQpIHsKICAgIGZvciAoSEluc3RydWN0aW9uIHVzZXIgaW4gaW5zdHJ1Y3Rpb24udXNlZEJ5KSB7CiAgICAgIGlmICh1c2VyIGlzIEhQaGkpIHsKICAgICAgICBpZiAoIXBoaVNldC5jb250YWlucyh1c2VyKSkgewogICAgICAgICAgcGhpU2V0LmFkZCh1c2VyKTsKICAgICAgICAgIGlmIChoYXNOb25CaXRPcFVzZXIodXNlciwgcGhpU2V0KSkgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHVzZXIgaXMhIEhCaXROb3QgJiYgdXNlciBpcyEgSEJpbmFyeUJpdE9wKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIG9jY3VwaWVkIGJ5IHRoZSB2YWx1ZSBjb21wdXRlZCBieSBbaW5zdHJ1Y3Rpb25dLgogIC8vIFJldHVybnMgYDMyYCBpZiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUgb3IgZG9lcyBub3QgZml0IGluIGEgc21hbGxlciBudW1iZXIKICAvLyBvZiBiaXRzLgogIGludCBiaXRXaWR0aChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGNvbnN0IGludCBNQVggPSAzMjsKICAgIGludCBjb25zdGFudChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgICAgaWYgKGluc3RydWN0aW9uIGlzIEhDb25zdGFudCAmJiBpbnN0cnVjdGlvbi5pc0NvbnN0YW50SW50ZWdlcigpKSB7CiAgICAgICAgSW50Q29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IGluc3RydWN0aW9uLmNvbnN0YW50OwogICAgICAgIHJldHVybiBjb25zdGFudC5pbnRWYWx1ZS50b0ludCgpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmIChpbnN0cnVjdGlvbi5pc0NvbnN0YW50SW50ZWdlcigpKSB7CiAgICAgIGludCB2YWx1ZSA9IGNvbnN0YW50KGluc3RydWN0aW9uKTsKICAgICAgaWYgKHZhbHVlIDwgMCkgcmV0dXJuIE1BWDsKICAgICAgaWYgKHZhbHVlID4gKCgxIDw8IDMxKSAtIDEpKSByZXR1cm4gTUFYOwogICAgICByZXR1cm4gdmFsdWUuYml0TGVuZ3RoOwogICAgfQogICAgaWYgKGluc3RydWN0aW9uIGlzIEhCaXRBbmQpIHsKICAgICAgcmV0dXJuIG1hdGgubWluKGJpdFdpZHRoKGluc3RydWN0aW9uLmxlZnQpLCBiaXRXaWR0aChpbnN0cnVjdGlvbi5yaWdodCkpOwogICAgfQogICAgaWYgKGluc3RydWN0aW9uIGlzIEhCaXRPciB8fCBpbnN0cnVjdGlvbiBpcyBIQml0WG9yKSB7CiAgICAgIEhCaW5hcnlCaXRPcCBiaXRPcCA9IGluc3RydWN0aW9uOwogICAgICBpbnQgbGVmdFdpZHRoID0gYml0V2lkdGgoYml0T3AubGVmdCk7CiAgICAgIGlmIChsZWZ0V2lkdGggPT0gTUFYKSByZXR1cm4gTUFYOwogICAgICByZXR1cm4gbWF0aC5tYXgobGVmdFdpZHRoLCBiaXRXaWR0aChiaXRPcC5yaWdodCkpOwogICAgfQogICAgaWYgKGluc3RydWN0aW9uIGlzIEhTaGlmdExlZnQpIHsKICAgICAgaW50IHNoaWZ0Q291bnQgPSBjb25zdGFudChpbnN0cnVjdGlvbi5yaWdodCk7CiAgICAgIGlmIChzaGlmdENvdW50ID09IG51bGwgfHwgc2hpZnRDb3VudCA8IDAgfHwgc2hpZnRDb3VudCA+IDMxKSByZXR1cm4gTUFYOwogICAgICBpbnQgbGVmdFdpZHRoID0gYml0V2lkdGgoaW5zdHJ1Y3Rpb24ubGVmdCk7CiAgICAgIGludCB3aWR0aCA9IGxlZnRXaWR0aCArIHNoaWZ0Q291bnQ7CiAgICAgIHJldHVybiBtYXRoLm1pbih3aWR0aCwgTUFYKTsKICAgIH0KICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIU2hpZnRSaWdodCkgewogICAgICBpbnQgc2hpZnRDb3VudCA9IGNvbnN0YW50KGluc3RydWN0aW9uLnJpZ2h0KTsKICAgICAgaWYgKHNoaWZ0Q291bnQgPT0gbnVsbCB8fCBzaGlmdENvdW50IDwgMCB8fCBzaGlmdENvdW50ID4gMzEpIHJldHVybiBNQVg7CiAgICAgIGludCBsZWZ0V2lkdGggPSBiaXRXaWR0aChpbnN0cnVjdGlvbi5sZWZ0KTsKICAgICAgaWYgKGxlZnRXaWR0aCA+PSBNQVgpIHJldHVybiBNQVg7CiAgICAgIHJldHVybiBtYXRoLm1heChsZWZ0V2lkdGggLSBzaGlmdENvdW50LCAwKTsKICAgIH0KICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIQWRkKSB7CiAgICAgIHJldHVybiBtYXRoLm1pbigKICAgICAgICAgIDEgKyBtYXRoLm1heChiaXRXaWR0aChpbnN0cnVjdGlvbi5sZWZ0KSwgYml0V2lkdGgoaW5zdHJ1Y3Rpb24ucmlnaHQpKSwKICAgICAgICAgIE1BWCk7CiAgICB9CiAgICByZXR1cm4gTUFYOwogIH0KCiAgYm9vbCByZXF1aXJlc1VpbnRDb252ZXJzaW9uKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgaWYgKGluc3RydWN0aW9uLmlzVUludDMxKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChiaXRXaWR0aChpbnN0cnVjdGlvbikgPD0gMzEpIHJldHVybiBmYWxzZTsKICAgIC8vIElmIHRoZSByZXN1bHQgb2YgYSBiaXQtb3BlcmF0aW9uIGlzIG9ubHkgdXNlZCBieSBvdGhlciBiaXQKICAgIC8vIG9wZXJhdGlvbnMsIHdlIGRvIG5vdCBoYXZlIHRvIGNvbnZlcnQgdG8gYW4gdW5zaWduZWQgaW50ZWdlci4KICAgIHJldHVybiBoYXNOb25CaXRPcFVzZXIoaW5zdHJ1Y3Rpb24sIG5ldyBTZXQ8SFBoaT4oKSk7CiAgfQoKICAvLy8gSWYgdGhlIFtpbnN0cnVjdGlvbl0gaXMgbm90IGBudWxsYCBpdCB3aWxsIGJlIHVzZWQgdG8gYXR0YWNoIHRoZSBwb3NpdGlvbgogIC8vLyB0byB0aGUgW3N0YXRlbWVudF0uCiAgdm9pZCBwdXNoU3RhdGVtZW50KGpzLlN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIGFzc2VydChleHByZXNzaW9uU3RhY2suaXNFbXB0eSk7CiAgICBjdXJyZW50Q29udGFpbmVyLnN0YXRlbWVudHMuYWRkKHN0YXRlbWVudCk7CiAgfQoKICB2b2lkIGluc2VydFN0YXRlbWVudEF0U3RhcnQoanMuU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgY3VycmVudENvbnRhaW5lci5zdGF0ZW1lbnRzLmluc2VydCgwLCBzdGF0ZW1lbnQpOwogIH0KCiAgLy8vIElmIHRoZSBbaW5zdHJ1Y3Rpb25dIGlzIG5vdCBgbnVsbGAgaXQgd2lsbCBiZSB1c2VkIHRvIGF0dGFjaCB0aGUgcG9zaXRpb24KICAvLy8gdG8gdGhlIFtleHByZXNzaW9uXS4KICBwdXNoRXhwcmVzc2lvbkFzU3RhdGVtZW50KAogICAgICBqcy5FeHByZXNzaW9uIGV4cHJlc3Npb24sIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBwdXNoU3RhdGVtZW50KG5ldyBqcy5FeHByZXNzaW9uU3RhdGVtZW50KGV4cHJlc3Npb24pCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgLy8vIElmIHRoZSBbaW5zdHJ1Y3Rpb25dIGlzIG5vdCBgbnVsbGAgaXQgd2lsbCBiZSB1c2VkIHRvIGF0dGFjaCB0aGUgcG9zaXRpb24KICAvLy8gdG8gdGhlIFtleHByZXNzaW9uXS4KICBwdXNoKGpzLkV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgZXhwcmVzc2lvblN0YWNrLmFkZChleHByZXNzaW9uKTsKICB9CgogIGpzLkV4cHJlc3Npb24gcG9wKCkgewogICAgcmV0dXJuIGV4cHJlc3Npb25TdGFjay5yZW1vdmVMYXN0KCk7CiAgfQoKICB2b2lkIHByZUdlbmVyYXRlTWV0aG9kKEhHcmFwaCBncmFwaCkgewogICAgdm9pZCBydW5QaGFzZShDb2RlZ2VuUGhhc2UgcGhhc2UsIHtib29sIHRyYWNlR3JhcGggPSB0cnVlfSkgewogICAgICBfY29kZWdlblRhc2subWVhc3VyZVN1YnRhc2socGhhc2UubmFtZSwgKCkgPT4gcGhhc2UudmlzaXRHcmFwaChncmFwaCkpOwogICAgICBpZiAodHJhY2VHcmFwaCkgewogICAgICAgIF90cmFjZXIudHJhY2VHcmFwaChwaGFzZS5uYW1lLCBncmFwaCk7CiAgICAgIH0KICAgICAgYXNzZXJ0KGdyYXBoLmlzVmFsaWQoKSwgJ0dyYXBoIG5vdCB2YWxpZCBhZnRlciAke3BoYXNlLm5hbWV9Jyk7CiAgICB9CgogICAgcnVuUGhhc2UoCiAgICAgICAgbmV3IFNzYUluc3RydWN0aW9uU2VsZWN0aW9uKF9vcHRpb25zLCBfY2xvc2VkV29ybGQsIF9pbnRlcmNlcHRvckRhdGEpKTsKICAgIHJ1blBoYXNlKG5ldyBTc2FUeXBlS25vd25SZW1vdmVyKCkpOwogICAgcnVuUGhhc2UobmV3IFNzYVRydXN0ZWRDaGVja1JlbW92ZXIoX29wdGlvbnMpKTsKICAgIHJ1blBoYXNlKG5ldyBTc2FBc3NpZ25tZW50Q2hhaW5pbmcoX29wdGlvbnMsIF9jbG9zZWRXb3JsZCkpOwogICAgcnVuUGhhc2UobmV3IFNzYUluc3RydWN0aW9uTWVyZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluLCBnZW5lcmF0ZUF0VXNlU2l0ZSkpOwogICAgcnVuUGhhc2UobmV3IFNzYUNvbmRpdGlvbk1lcmdlcihnZW5lcmF0ZUF0VXNlU2l0ZSwgY29udHJvbEZsb3dPcGVyYXRvcnMpKTsKICAgIHJ1blBoYXNlKG5ldyBTc2FTaGFyZVJlZ2lvbkNvbnN0YW50cyhfb3B0aW9ucykpOwoKICAgIFNzYUxpdmVJbnRlcnZhbEJ1aWxkZXIgaW50ZXJ2YWxCdWlsZGVyID0KICAgICAgICBuZXcgU3NhTGl2ZUludGVydmFsQnVpbGRlcihnZW5lcmF0ZUF0VXNlU2l0ZSwgY29udHJvbEZsb3dPcGVyYXRvcnMpOwogICAgcnVuUGhhc2UoaW50ZXJ2YWxCdWlsZGVyLCB0cmFjZUdyYXBoOiBmYWxzZSk7CiAgICBTc2FWYXJpYWJsZUFsbG9jYXRvciBhbGxvY2F0b3IgPSBuZXcgU3NhVmFyaWFibGVBbGxvY2F0b3IoCiAgICAgICAgX25hbWVyLAogICAgICAgIGludGVydmFsQnVpbGRlci5saXZlSW5zdHJ1Y3Rpb25zLAogICAgICAgIGludGVydmFsQnVpbGRlci5saXZlSW50ZXJ2YWxzLAogICAgICAgIGdlbmVyYXRlQXRVc2VTaXRlKTsKICAgIHJ1blBoYXNlKGFsbG9jYXRvciwgdHJhY2VHcmFwaDogZmFsc2UpOwogICAgdmFyaWFibGVOYW1lcyA9IGFsbG9jYXRvci5uYW1lczsKICAgIHNob3VsZEdyb3VwVmFyRGVjbGFyYXRpb25zID0gYWxsb2NhdG9yLm5hbWVzLm51bWJlck9mVmFyaWFibGVzID4gMTsKICB9CgogIHZvaWQgaGFuZGxlRGVsYXllZFZhcmlhYmxlRGVjbGFyYXRpb25zKFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAvLyBDcmVhdGUgJ3ZhcicgbGlzdCBhdCB0aGUgc3RhcnQgb2YgZnVuY3Rpb24uICBNb3ZlIGFzc2lnbm1lbnQgc3RhdGVtZW50cwogICAgLy8gZnJvbSB0aGUgdG9wIG9mIHRoZSBib2R5IGludG8gdGhlIHZhcmlhYmxlIGluaXRpYWxpemVycy4KICAgIGlmIChjb2xsZWN0ZWRWYXJpYWJsZURlY2xhcmF0aW9ucy5pc0VtcHR5KSByZXR1cm47CgogICAgTGlzdDxqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uPiBkZWNsYXJhdGlvbnMgPSBbXTsKICAgIExpc3Q8anMuU3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gY3VycmVudENvbnRhaW5lci5zdGF0ZW1lbnRzOwogICAgaW50IG5leHRTdGF0ZW1lbnQgPSAwOwoKICAgIHdoaWxlIChuZXh0U3RhdGVtZW50IDwgc3RhdGVtZW50cy5sZW5ndGgpIHsKICAgICAgaWYgKGNvbGxlY3RlZFZhcmlhYmxlRGVjbGFyYXRpb25zLmlzRW1wdHkpIGJyZWFrOwogICAgICBqcy5TdGF0ZW1lbnQgc3RhdGVtZW50ID0gc3RhdGVtZW50c1tuZXh0U3RhdGVtZW50XTsKICAgICAgaWYgKHN0YXRlbWVudCBpcyBqcy5FeHByZXNzaW9uU3RhdGVtZW50KSB7CiAgICAgICAganMuRXhwcmVzc2lvbiBleHByZXNzaW9uID0gc3RhdGVtZW50LmV4cHJlc3Npb247CiAgICAgICAgaWYgKGV4cHJlc3Npb24gaXMganMuQXNzaWdubWVudCAmJiAhZXhwcmVzc2lvbi5pc0NvbXBvdW5kKSB7CiAgICAgICAgICBqcy5FeHByZXNzaW9uIGxlZnQgPSBleHByZXNzaW9uLmxlZnRIYW5kU2lkZTsKICAgICAgICAgIGlmIChsZWZ0IGlzIGpzLlZhcmlhYmxlUmVmZXJlbmNlKSB7CiAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbGVmdC5uYW1lOwogICAgICAgICAgICBqcy5FeHByZXNzaW9uIHZhbHVlID0gZXhwcmVzc2lvbi52YWx1ZTsKICAgICAgICAgICAgaWYgKF9zYWZlSW5Jbml0aWFsaXplcih2YWx1ZSkgJiYKICAgICAgICAgICAgICAgIGNvbGxlY3RlZFZhcmlhYmxlRGVjbGFyYXRpb25zLnJlbW92ZShuYW1lKSkgewogICAgICAgICAgICAgIHZhciBpbml0aWFsaXphdGlvbiA9IG5ldyBqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uKAogICAgICAgICAgICAgICAgICAgICAgbmV3IGpzLlZhcmlhYmxlRGVjbGFyYXRpb24obmFtZSksIHZhbHVlKQogICAgICAgICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKGV4cHJlc3Npb24uc291cmNlSW5mb3JtYXRpb24pOwogICAgICAgICAgICAgIGRlY2xhcmF0aW9ucy5hZGQoaW5pdGlhbGl6YXRpb24pOwogICAgICAgICAgICAgICsrbmV4dFN0YXRlbWVudDsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBicmVhazsKICAgIH0KCiAgICBMaXN0PGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24+IHVuaW5pdGlhbGl6ZWQgPSBbXTsKICAgIGZvciAoU3RyaW5nIG5hbWUgaW4gY29sbGVjdGVkVmFyaWFibGVEZWNsYXJhdGlvbnMpIHsKICAgICAgdW5pbml0aWFsaXplZC5hZGQobmV3IGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24oCiAgICAgICAgICBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbihuYW1lKSwgbnVsbCkpOwogICAgfQogICAgdmFyIGRlY2xhcmF0aW9uTGlzdCA9CiAgICAgICAgbmV3IGpzLlZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KHVuaW5pdGlhbGl6ZWQgKyBkZWNsYXJhdGlvbnMpCiAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pOwogICAgc3RhdGVtZW50cy5yZXBsYWNlUmFuZ2UoCiAgICAgICAgMCwgbmV4dFN0YXRlbWVudCwgW25ldyBqcy5FeHByZXNzaW9uU3RhdGVtZW50KGRlY2xhcmF0aW9uTGlzdCldKTsKICB9CgogIC8vIEFuIGV4cHJlc3Npb24gaXMgc2FmZSB0byBiZSBwdWxsZWQgaW50byBhICd2YXInIGluaXRpYWxpemVyIGlmIGl0IGRvZXMgbm90CiAgLy8gY29udGFpbiBhc3NpZ25tZW50cyB0byBsb2NhbHMuIFdlIGRvbid0IGdlbmVyYXRlIGFzc2lnbm1lbnRzIHRvIGxvY2FscwogIC8vIGluc2lkZSBleHByZXNzaW9ucy4KICBib29sIF9zYWZlSW5Jbml0aWFsaXplcihqcy5FeHByZXNzaW9uIG5vZGUpID0+IHRydWU7CgogIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICBwcmVHZW5lcmF0ZU1ldGhvZChncmFwaCk7CiAgICBjdXJyZW50R3JhcGggPSBncmFwaDsKICAgIHZpc2l0U3ViR3JhcGgobmV3IFN1YkdyYXBoKGdyYXBoLmVudHJ5LCBncmFwaC5leGl0KSk7CiAgICBoYW5kbGVEZWxheWVkVmFyaWFibGVEZWNsYXJhdGlvbnMoZ3JhcGguc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgdm9pZCB2aXNpdFN1YkdyYXBoKFN1YkdyYXBoIG5ld1N1YkdyYXBoKSB7CiAgICBTdWJHcmFwaCBvbGRTdWJHcmFwaCA9IHN1YkdyYXBoOwogICAgUXVldWU8SEJhc2ljQmxvY2s+IG9sZEJsb2NrUXVldWUgPSBibG9ja1F1ZXVlOwogICAgc3ViR3JhcGggPSBuZXdTdWJHcmFwaDsKICAgIGJsb2NrUXVldWUgPSBuZXcgUXVldWU8SEJhc2ljQmxvY2s+KCk7CiAgICBlbnRlclN1YkdyYXBoKHN1YkdyYXBoLnN0YXJ0KTsKICAgIGJsb2NrUXVldWUgPSBvbGRCbG9ja1F1ZXVlOwogICAgc3ViR3JhcGggPSBvbGRTdWJHcmFwaDsKICB9CgogIC8vLyBDaGVjayB3aGV0aGVyIGEgc3ViLWdyYXBoIGNhbiBiZSBnZW5lcmF0ZWQgYXMgYW4gZXhwcmVzc2lvbiwgb3IgZXZlbgogIC8vLyBhcyBhIGRlY2xhcmF0aW9uLCBvciBpZiBpdCBoYXMgdG8gZmFsbCBiYWNrIHRvIGJlaW5nIGdlbmVyYXRlZCBhcwogIC8vLyBhIHN0YXRlbWVudC4KICAvLy8gRXhwcmVzc2lvbnMgYXJlIGFueXRoaW5nIHRoYXQgZG9lc24ndCBnZW5lcmF0ZSBjb250cm9sIGZsb3cgY29uc3RydWN0cy4KICAvLy8gRGVjbGFyYXRpb25zIG11c3Qgb25seSBnZW5lcmF0ZSBhc3NpZ25tZW50cyBvbiB0aGUgZm9ybSAiaWQgPSBleHByZXNzaW9uIiwKICAvLy8gYW5kIG5vdCwgZS5nLiwgZXhwcmVzc2lvbnMgd2hlcmUgdGhlIHZhbHVlIGlzbid0IGFzc2lnbmVkLCBvciB3aGVyZSBpdCdzCiAgLy8vIGFzc2lnbmVkIHRvIHNvbWV0aGluZyB0aGF0J3Mgbm90IGEgc2ltcGxlIHZhcmlhYmxlLgogIGludCBleHByZXNzaW9uVHlwZShIRXhwcmVzc2lvbkluZm9ybWF0aW9uIGluZm8pIHsKICAgIC8vIFRoZSBvbmx5IEhFeHByZXNzaW9uSW5mb3JtYXRpb24gdXNlZCBhcyBwYXJ0IG9mIGEgSEJsb2NrSW5mb3JtYXRpb24gaXMKICAgIC8vIGN1cnJlbnQgSFN1YkV4cHJlc3Npb25CbG9ja0luZm9ybWF0aW9uLCBzbyBpdCdzIHRoZSBvbmx5IG9uZSByZWFjaGluZwogICAgLy8gaGVyZS4gSWYgd2Ugc3RhcnQgdXNpbmcgdGhlIG90aGVyIEhFeHByZXNzaW9uSW5mb3JtYXRpb24gdHlwZXMgdG9vLAogICAgLy8gdGhpcyBjb2RlIHNob3VsZCBiZSBnZW5lcmFsaXplZC4KICAgIGFzc2VydChpbmZvIGlzIEhTdWJFeHByZXNzaW9uQmxvY2tJbmZvcm1hdGlvbik7CiAgICBIU3ViRXhwcmVzc2lvbkJsb2NrSW5mb3JtYXRpb24gZXhwcmVzc2lvbkluZm8gPSBpbmZvOwogICAgU3ViR3JhcGggbGltaXRzID0gZXhwcmVzc2lvbkluZm8uc3ViRXhwcmVzc2lvbjsKCiAgICAvLyBTdGFydCBhc3N1bWluZyB0aGF0IHdlIGNhbiBnZW5lcmF0ZSBkZWNsYXJhdGlvbnMuIElmIHdlIGZpbmQgYQogICAgLy8gY291bnRlci1leGFtcGxlLCB3ZSBkZWdyYWRlIG91ciBhc3N1bXB0aW9uIHRvIGVpdGhlciBleHByZXNzaW9uIG9yCiAgICAvLyBzdGF0ZW1lbnQsIGFuZCBpbiB0aGUgbGF0dGVyIGNhc2UsIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkgc2luY2UKICAgIC8vIGl0IGNhbid0IGdldCBhbnkgd29yc2UuIEUuZy4sIGEgZnVuY3Rpb24gY2FsbCB3aGVyZSB0aGUgcmV0dXJuIHZhbHVlCiAgICAvLyBpc24ndCB1c2VkIGNhbid0IGJlIGluIGEgZGVjbGFyYXRpb24uCiAgICBpbnQgcmVzdWx0ID0gVFlQRV9ERUNMQVJBVElPTjsKICAgIEhCYXNpY0Jsb2NrIGJhc2ljQmxvY2sgPSBsaW1pdHMuc3RhcnQ7CiAgICBkbyB7CiAgICAgIEhJbnN0cnVjdGlvbiBjdXJyZW50ID0gYmFzaWNCbG9jay5maXJzdDsKICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gYmFzaWNCbG9jay5sYXN0KSB7CiAgICAgICAgLy8gRS5nLCBib3VuZHMgY2hlY2suCiAgICAgICAgaWYgKGN1cnJlbnQuaXNDb250cm9sRmxvdygpKSB7CiAgICAgICAgICByZXR1cm4gVFlQRV9TVEFURU1FTlQ7CiAgICAgICAgfQogICAgICAgIC8vIEhGaWVsZFNldCBnZW5lcmF0ZXMgY29kZSBvbiB0aGUgZm9ybSAieC55ID0gLi4uIiwgd2hpY2ggaXNuJ3QgdmFsaWQKICAgICAgICAvLyBpbiBhIGRlY2xhcmF0aW9uLgogICAgICAgIGlmIChjdXJyZW50LnVzZWRCeS5pc0VtcHR5IHx8IGN1cnJlbnQgaXMgSEZpZWxkU2V0KSB7CiAgICAgICAgICByZXN1bHQgPSBUWVBFX0VYUFJFU1NJT047CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnQgaXMgSEdvdG8pIHsKICAgICAgICBiYXNpY0Jsb2NrID0gYmFzaWNCbG9jay5zdWNjZXNzb3JzWzBdOwogICAgICB9IGVsc2UgaWYgKGN1cnJlbnQgaXMgSENvbmRpdGlvbmFsQnJhbmNoKSB7CiAgICAgICAgaWYgKGdlbmVyYXRlQXRVc2VTaXRlLmNvbnRhaW5zKGN1cnJlbnQpKSB7CiAgICAgICAgICAvLyBTaG9ydC1jaXJjdWl0IGNvbnRyb2wgZmxvdyBvcGVyYXRvciB0cmlja2VyeS4KICAgICAgICAgIC8vIENoZWNrIHRoZSBzZWNvbmQgaGFsZiwgd2hpY2ggd2lsbCBjb250aW51ZSBpbnRvIHRoZSBqb2luLgogICAgICAgICAgLy8gKFRoZSBmaXJzdCBoYWxmIGlzIFtpbnB1dHNbMF1dLCB0aGUgc2Vjb25kIGhhbGYgaXMgW3N1Y2Nlc3NvcnNbMF1dLAogICAgICAgICAgLy8gYW5kIFtzdWNjZXNzb3JzWzFdXSBpcyB0aGUgam9pbi1ibG9jaykuCiAgICAgICAgICBiYXNpY0Jsb2NrID0gYmFzaWNCbG9jay5zdWNjZXNzb3JzWzBdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBXZSBhbGxvdyBhbiBleHByZXNzaW9uIHRvIGVuZCBvbiBhbiBISWYgKGEgY29uZGl0aW9uIGV4cHJlc3Npb24pLgogICAgICAgICAgcmV0dXJuIGlkZW50aWNhbChiYXNpY0Jsb2NrLCBsaW1pdHMuZW5kKSA/IHJlc3VsdCA6IFRZUEVfU1RBVEVNRU5UOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBFeHByZXNzaW9uLWluY29tcGF0aWJsZSBjb250cm9sIGZsb3cuCiAgICAgICAgcmV0dXJuIFRZUEVfU1RBVEVNRU5UOwogICAgICB9CiAgICB9IHdoaWxlIChsaW1pdHMuY29udGFpbnMoYmFzaWNCbG9jaykpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGJvb2wgaXNKU0V4cHJlc3Npb24oSEV4cHJlc3Npb25JbmZvcm1hdGlvbiBpbmZvKSB7CiAgICByZXR1cm4gIWlkZW50aWNhbChleHByZXNzaW9uVHlwZShpbmZvKSwgVFlQRV9TVEFURU1FTlQpOwogIH0KCiAgYm9vbCBpc0pTQ29uZGl0aW9uKEhFeHByZXNzaW9uSW5mb3JtYXRpb24gaW5mbykgewogICAgSFN1YkV4cHJlc3Npb25CbG9ja0luZm9ybWF0aW9uIGdyYXBoID0gaW5mbzsKICAgIFN1YkV4cHJlc3Npb24gbGltaXRzID0gZ3JhcGguc3ViRXhwcmVzc2lvbjsKICAgIHJldHVybiAhaWRlbnRpY2FsKGV4cHJlc3Npb25UeXBlKGluZm8pLCBUWVBFX1NUQVRFTUVOVCkgJiYKICAgICAgICAobGltaXRzLmVuZC5sYXN0IGlzIEhDb25kaXRpb25hbEJyYW5jaCk7CiAgfQoKICAvLy8gR2VuZXJhdGUgc3RhdGVtZW50cyBmcm9tIGJsb2NrIGluZm9ybWF0aW9uLgogIC8vLyBJZiB0aGUgYmxvY2sgaW5mb3JtYXRpb24gY29udGFpbnMgZXhwcmVzc2lvbnMsIGdlbmVyYXRlIG9ubHkKICAvLy8gYXNzaWdubWVudHMsIGFuZCBpZiBpdCBlbmRzIGluIGEgY29uZGl0aW9uYWwgYnJhbmNoLCBkb24ndCBnZW5lcmF0ZQogIC8vLyB0aGUgY29uZGl0aW9uLgogIHZvaWQgZ2VuZXJhdGVTdGF0ZW1lbnRzKEhCbG9ja0luZm9ybWF0aW9uIGJsb2NrKSB7CiAgICBpZiAoYmxvY2sgaXMgSFN0YXRlbWVudEluZm9ybWF0aW9uKSB7CiAgICAgIGJsb2NrLmFjY2VwdCh0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIEhTdWJFeHByZXNzaW9uQmxvY2tJbmZvcm1hdGlvbiBleHByZXNzaW9uID0gYmxvY2s7CiAgICAgIHZpc2l0U3ViR3JhcGgoZXhwcmVzc2lvbi5zdWJFeHByZXNzaW9uKTsKICAgIH0KICB9CgogIGpzLkJsb2NrIGdlbmVyYXRlU3RhdGVtZW50c0luTmV3QmxvY2soSEJsb2NrSW5mb3JtYXRpb24gYmxvY2spIHsKICAgIGpzLkJsb2NrIHJlc3VsdCA9IG5ldyBqcy5CbG9jay5lbXB0eSgpOwogICAganMuQmxvY2sgb2xkQ29udGFpbmVyID0gY3VycmVudENvbnRhaW5lcjsKICAgIGN1cnJlbnRDb250YWluZXIgPSByZXN1bHQ7CiAgICBnZW5lcmF0ZVN0YXRlbWVudHMoYmxvY2spOwogICAgY3VycmVudENvbnRhaW5lciA9IG9sZENvbnRhaW5lcjsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gSWYgdGhlIFtibG9ja10gb25seSBjb250YWlucyBvbmUgc3RhdGVtZW50IHJldHVybnMgdGhhdCBzdGF0ZW1lbnQuIElmIHRoZQogIC8vLyB0aGF0IHN0YXRlbWVudCBpdHNlbGYgaXMgYSBibG9jaywgcmVjdXJzaXZlbHkgY2FsbHMgdGhpcyBtZXRob2QuCiAgLy8vCiAgLy8vIElmIHRoZSBibG9jayBpcyBlbXB0eSwgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBbanMuTk9QXS4KICBqcy5TdGF0ZW1lbnQgdW53cmFwU3RhdGVtZW50KGpzLkJsb2NrIGJsb2NrKSB7CiAgICBpbnQgbGVuID0gYmxvY2suc3RhdGVtZW50cy5sZW5ndGg7CiAgICBpZiAobGVuID09IDApIHJldHVybiBuZXcganMuRW1wdHlTdGF0ZW1lbnQoKTsKICAgIGlmIChsZW4gPT0gMSkgewogICAgICBqcy5TdGF0ZW1lbnQgcmVzdWx0ID0gYmxvY2suc3RhdGVtZW50c1swXTsKICAgICAgaWYgKHJlc3VsdCBpcyBqcy5CbG9jaykgcmV0dXJuIHVud3JhcFN0YXRlbWVudChyZXN1bHQpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIGJsb2NrOwogIH0KCiAgLy8vIEdlbmVyYXRlIGV4cHJlc3Npb25zIGZyb20gYmxvY2sgaW5mb3JtYXRpb24uCiAganMuRXhwcmVzc2lvbiBnZW5lcmF0ZUV4cHJlc3Npb24oSEV4cHJlc3Npb25JbmZvcm1hdGlvbiBleHByZXNzaW9uKSB7CiAgICAvLyBDdXJyZW50bHkgd2Ugb25seSBoYW5kbGUgc3ViLWV4cHJlc3Npb24gZ3JhcGhzLgogICAgYXNzZXJ0KGV4cHJlc3Npb24gaXMgSFN1YkV4cHJlc3Npb25CbG9ja0luZm9ybWF0aW9uKTsKCiAgICBib29sIG9sZElzR2VuZXJhdGluZ0V4cHJlc3Npb24gPSBpc0dlbmVyYXRpbmdFeHByZXNzaW9uOwogICAgaXNHZW5lcmF0aW5nRXhwcmVzc2lvbiA9IHRydWU7CiAgICBMaXN0PGpzLkV4cHJlc3Npb24+IG9sZEV4cHJlc3Npb25TdGFjayA9IGV4cHJlc3Npb25TdGFjazsKICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gc2VxdWVuY2VFbGVtZW50cyA9IDxqcy5FeHByZXNzaW9uPltdOwogICAgZXhwcmVzc2lvblN0YWNrID0gc2VxdWVuY2VFbGVtZW50czsKICAgIEhTdWJFeHByZXNzaW9uQmxvY2tJbmZvcm1hdGlvbiBleHByZXNzaW9uU3ViR3JhcGggPSBleHByZXNzaW9uOwogICAgdmlzaXRTdWJHcmFwaChleHByZXNzaW9uU3ViR3JhcGguc3ViRXhwcmVzc2lvbik7CiAgICBleHByZXNzaW9uU3RhY2sgPSBvbGRFeHByZXNzaW9uU3RhY2s7CiAgICBpc0dlbmVyYXRpbmdFeHByZXNzaW9uID0gb2xkSXNHZW5lcmF0aW5nRXhwcmVzc2lvbjsKICAgIGlmIChzZXF1ZW5jZUVsZW1lbnRzLmlzRW1wdHkpIHsKICAgICAgLy8gSGFwcGVucyB3aGVuIHRoZSBpbml0aWFsaXplciwgY29uZGl0aW9uIG9yIHVwZGF0ZSBvZiBhIGxvb3AgaXMgZW1wdHkuCiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmIChzZXF1ZW5jZUVsZW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHJldHVybiBzZXF1ZW5jZUVsZW1lbnRzWzBdOwogICAgfSBlbHNlIHsKICAgICAganMuRXhwcmVzc2lvbiByZXN1bHQgPSBzZXF1ZW5jZUVsZW1lbnRzLnJlbW92ZUxhc3QoKTsKICAgICAgd2hpbGUgKHNlcXVlbmNlRWxlbWVudHMuaXNOb3RFbXB0eSkgewogICAgICAgIHJlc3VsdCA9IG5ldyBqcy5CaW5hcnkoJywnLCBzZXF1ZW5jZUVsZW1lbnRzLnJlbW92ZUxhc3QoKSwgcmVzdWx0KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogIH0KCiAgLy8vIE9ubHkgdmlzaXRzIHRoZSBhcmd1bWVudHMgc3RhcnRpbmcgYXQgaW5wdXRzW0hJbnZva2UuQVJHVU1FTlRTX09GRlNFVF0uCiAgTGlzdDxqcy5FeHByZXNzaW9uPiB2aXNpdEFyZ3VtZW50cyhMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzLAogICAgICB7aW50IHN0YXJ0OiBISW52b2tlLkFSR1VNRU5UU19PRkZTRVR9KSB7CiAgICBhc3NlcnQoaW5wdXRzLmxlbmd0aCA+PSBzdGFydCk7CiAgICBMaXN0PGpzLkV4cHJlc3Npb24+IHJlc3VsdCA9IG5ldyBMaXN0PGpzLkV4cHJlc3Npb24+KGlucHV0cy5sZW5ndGggLSBzdGFydCk7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHsKICAgICAgdXNlKGlucHV0c1tpXSk7CiAgICAgIHJlc3VsdFtpIC0gc3RhcnRdID0gcG9wKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgYm9vbCBpc1ZhcmlhYmxlRGVjbGFyZWQoU3RyaW5nIHZhcmlhYmxlTmFtZSkgewogICAgcmV0dXJuIGRlY2xhcmVkTG9jYWxzLmNvbnRhaW5zKHZhcmlhYmxlTmFtZSkgfHwKICAgICAgICBjb2xsZWN0ZWRWYXJpYWJsZURlY2xhcmF0aW9ucy5jb250YWlucyh2YXJpYWJsZU5hbWUpOwogIH0KCiAganMuRXhwcmVzc2lvbiBnZW5lcmF0ZUV4cHJlc3Npb25Bc3NpZ25tZW50KFN0cmluZyB2YXJpYWJsZU5hbWUsCiAgICAgIGpzLkV4cHJlc3Npb24gdmFsdWUsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJbnRyb2R1Y2UgYSBEZWZlcnJlZFZhcmlhYmxlVXNlIHRvIGhhbmRsZSB0aGlzCiAgICAvLyBpbiB0aGUgU1NBIGNvZGVnZW4gb3IgbGV0IHRoZSBKUyBwcmludGVyIGhhbmRsZSBpdCBmdWxseSBhbmQgcmVtb3ZlIGl0CiAgICAvLyBoZXJlLgogICAgaWYgKHZhbHVlIGlzIGpzLkJpbmFyeSkgewogICAgICBqcy5CaW5hcnkgYmluYXJ5ID0gdmFsdWU7CiAgICAgIFN0cmluZyBvcCA9IGJpbmFyeS5vcDsKICAgICAgaWYgKG9wID09ICcrJyB8fAogICAgICAgICAgb3AgPT0gJy0nIHx8CiAgICAgICAgICBvcCA9PSAnLycgfHwKICAgICAgICAgIG9wID09ICcqJyB8fAogICAgICAgICAgb3AgPT0gJyUnIHx8CiAgICAgICAgICBvcCA9PSAnXicgfHwKICAgICAgICAgIG9wID09ICcmJyB8fAogICAgICAgICAgb3AgPT0gJ3wnKSB7CiAgICAgICAganMuRXhwcmVzc2lvbiBsZWZ0ID0gYmluYXJ5LmxlZnQ7CiAgICAgICAgaWYgKGxlZnQgaXMganMuVmFyaWFibGVVc2UgJiYgbGVmdC5uYW1lID09IHZhcmlhYmxlTmFtZSkgewogICAgICAgICAgLy8gV2Uga25vdyBub3csIHRoYXQgd2UgY2FuIHNob3J0ZW4geCA9IHggKyB5IGludG8geCArPSB5LgogICAgICAgICAgLy8gQWxzbyBjaGVjayBmb3IgdGhlIHNob3J0Y3V0IHdoZXJlIHkgZXF1YWxzIDE6IHgrKyBhbmQgeC0tLgogICAgICAgICAganMuRXhwcmVzc2lvbiByaWdodCA9IGJpbmFyeS5yaWdodDsKICAgICAgICAgIGlmICgob3AgPT0gJysnIHx8IG9wID09ICctJykgJiYKICAgICAgICAgICAgICByaWdodCBpcyBqcy5MaXRlcmFsTnVtYmVyICYmCiAgICAgICAgICAgICAgcmlnaHQudmFsdWUgPT0gIjEiKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcganMuUHJlZml4KG9wID09ICcrJyA/ICcrKycgOiAnLS0nLCBsZWZ0KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBuZXcganMuQXNzaWdubWVudC5jb21wb3VuZChiaW5hcnkubGVmdCwgb3AsIGJpbmFyeS5yaWdodCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IGpzLkFzc2lnbm1lbnQobmV3IGpzLlZhcmlhYmxlVXNlKHZhcmlhYmxlTmFtZSksIHZhbHVlKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24odmFsdWUuc291cmNlSW5mb3JtYXRpb24gPz8gc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgdm9pZCBhc3NpZ25WYXJpYWJsZShTdHJpbmcgdmFyaWFibGVOYW1lLCBqcy5FeHByZXNzaW9uIHZhbHVlLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgaWYgKGlzR2VuZXJhdGluZ0V4cHJlc3Npb24pIHsKICAgICAgLy8gSWYgd2UgYXJlIGluIGFuIGV4cHJlc3Npb24gdGhlbiB3ZSBjYW4ndCBkZWNsYXJlIHRoZSB2YXJpYWJsZSBoZXJlLgogICAgICAvLyBXZSBoYXZlIG5vIGNob2ljZSwgYnV0IHRvIHVzZSBpdCBhbmQgdGhlbiBkZWNsYXJlIGl0IHNlcGFyYXRlbHkuCiAgICAgIGlmICghaXNWYXJpYWJsZURlY2xhcmVkKHZhcmlhYmxlTmFtZSkpIHsKICAgICAgICBjb2xsZWN0ZWRWYXJpYWJsZURlY2xhcmF0aW9ucy5hZGQodmFyaWFibGVOYW1lKTsKICAgICAgfQogICAgICBwdXNoKAogICAgICAgICAgZ2VuZXJhdGVFeHByZXNzaW9uQXNzaWdubWVudCh2YXJpYWJsZU5hbWUsIHZhbHVlLCBzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICAvLyBPdGhlcndpc2UgaWYgd2UgYXJlIHRyeWluZyB0byBkZWNsYXJlIGlubGluZSBhbmQgd2UgYXJlIGluIGEgc3RhdGVtZW50CiAgICAgIC8vIHRoZW4gd2UgZGVjbGFyZSAodW5sZXNzIGl0IHdhcyBhbHJlYWR5IGRlY2xhcmVkKS4KICAgIH0gZWxzZSBpZiAoIXNob3VsZEdyb3VwVmFyRGVjbGFyYXRpb25zICYmCiAgICAgICAgIWRlY2xhcmVkTG9jYWxzLmNvbnRhaW5zKHZhcmlhYmxlTmFtZSkpIHsKICAgICAgLy8gSXQgbWF5IGJlIG5lY2Vzc2FyeSB0byByZW1vdmUgaXQgZnJvbSB0aGUgb25lcyB0byBiZSBkZWNsYXJlZCBsYXRlci4KICAgICAgY29sbGVjdGVkVmFyaWFibGVEZWNsYXJhdGlvbnMucmVtb3ZlKHZhcmlhYmxlTmFtZSk7CiAgICAgIGRlY2xhcmVkTG9jYWxzLmFkZCh2YXJpYWJsZU5hbWUpOwogICAgICBqcy5WYXJpYWJsZURlY2xhcmF0aW9uIGRlY2wgPSBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbih2YXJpYWJsZU5hbWUpOwogICAgICBqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uIGluaXRpYWxpemF0aW9uID0KICAgICAgICAgIG5ldyBqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uKGRlY2wsIHZhbHVlKTsKCiAgICAgIHB1c2hFeHByZXNzaW9uQXNTdGF0ZW1lbnQoCiAgICAgICAgICBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoCiAgICAgICAgICAgICAgPGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24+W2luaXRpYWxpemF0aW9uXSksCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9IGVsc2UgewogICAgICAvLyBPdGhlcndpc2Ugd2UgYXJlIGp1c3QgZ29pbmcgdG8gdXNlIGl0LiAgSWYgd2UgaGF2ZSBub3QgYWxyZWFkeSBkZWNsYXJlZAogICAgICAvLyBpdCB0aGVuIHdlIG1ha2Ugc3VyZSB3ZSB3aWxsIGRlY2xhcmUgaXQgbGF0ZXIuCiAgICAgIGlmICghZGVjbGFyZWRMb2NhbHMuY29udGFpbnModmFyaWFibGVOYW1lKSkgewogICAgICAgIGNvbGxlY3RlZFZhcmlhYmxlRGVjbGFyYXRpb25zLmFkZCh2YXJpYWJsZU5hbWUpOwogICAgICB9CiAgICAgIHB1c2hFeHByZXNzaW9uQXNTdGF0ZW1lbnQoCiAgICAgICAgICBnZW5lcmF0ZUV4cHJlc3Npb25Bc3NpZ25tZW50KHZhcmlhYmxlTmFtZSwgdmFsdWUsIHNvdXJjZUluZm9ybWF0aW9uKSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICB9CgogIHZvaWQgZGVmaW5lKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgLy8gRm9yIHNpbXBsZSB0eXBlIGNoZWNrcyBsaWtlIGkgPSBpbnRUeXBlQ2hlY2soaSksIHdlIGRvbid0IGhhdmUgdG8KICAgIC8vIGVtaXQgYW4gYXNzaWdubWVudCwgYmVjYXVzZSB0aGUgaW50VHlwZUNoZWNrIGp1c3QgcmV0dXJucyBpdHMKICAgIC8vIGFyZ3VtZW50LgogICAgYm9vbCBuZWVkc0Fzc2lnbm1lbnQgPSB0cnVlOwogICAgaWYgKGluc3RydWN0aW9uIGlzIEhDaGVjaykgewogICAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSFR5cGVDb252ZXJzaW9uIHx8CiAgICAgICAgICBpbnN0cnVjdGlvbiBpcyBIUHJpbWl0aXZlQ2hlY2sgfHwKICAgICAgICAgIGluc3RydWN0aW9uIGlzIEhBc0NoZWNrIHx8CiAgICAgICAgICBpbnN0cnVjdGlvbiBpcyBIQXNDaGVja1NpbXBsZSB8fAogICAgICAgICAgaW5zdHJ1Y3Rpb24gaXMgSEJvb2xDb252ZXJzaW9uKSB7CiAgICAgICAgU3RyaW5nIGlucHV0TmFtZSA9IHZhcmlhYmxlTmFtZXMuZ2V0TmFtZShpbnN0cnVjdGlvbi5jaGVja2VkSW5wdXQpOwogICAgICAgIGlmICh2YXJpYWJsZU5hbWVzLmdldE5hbWUoaW5zdHJ1Y3Rpb24pID09IGlucHV0TmFtZSkgewogICAgICAgICAgbmVlZHNBc3NpZ25tZW50ID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSExvY2FsVmFsdWUpIHsKICAgICAgbmVlZHNBc3NpZ25tZW50ID0gZmFsc2U7CiAgICB9CgogICAgaWYgKG5lZWRzQXNzaWdubWVudCAmJgogICAgICAgICFpbnN0cnVjdGlvbi5pc0NvbnRyb2xGbG93KCkgJiYKICAgICAgICB2YXJpYWJsZU5hbWVzLmhhc05hbWUoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgIHZpc2l0RXhwcmVzc2lvbihpbnN0cnVjdGlvbik7CiAgICAgIGFzc2lnblZhcmlhYmxlKHZhcmlhYmxlTmFtZXMuZ2V0TmFtZShpbnN0cnVjdGlvbiksIHBvcCgpLAogICAgICAgICAgaW5zdHJ1Y3Rpb24uc291cmNlSW5mb3JtYXRpb24pOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGlzR2VuZXJhdGluZ0V4cHJlc3Npb24pIHsKICAgICAgdmlzaXRFeHByZXNzaW9uKGluc3RydWN0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIHZpc2l0U3RhdGVtZW50KGluc3RydWN0aW9uKTsKICAgIH0KICB9CgogIHZvaWQgdXNlKEhJbnN0cnVjdGlvbiBhcmd1bWVudCkgewogICAgaWYgKGlzR2VuZXJhdGVBdFVzZVNpdGUoYXJndW1lbnQpKSB7CiAgICAgIHZpc2l0RXhwcmVzc2lvbihhcmd1bWVudCk7CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50IGlzIEhDaGVjayAmJiAhdmFyaWFibGVOYW1lcy5oYXNOYW1lKGFyZ3VtZW50KSkgewogICAgICBIQ2hlY2sgY2hlY2sgPSBhcmd1bWVudDsKICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIGNoZWNrZWQgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbmFtZS4KICAgICAgYXNzZXJ0KCF2YXJpYWJsZU5hbWVzLmhhc05hbWUoY2hlY2suY2hlY2tlZElucHV0KSk7CiAgICAgIHVzZShjaGVjay5jaGVja2VkSW5wdXQpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KHZhcmlhYmxlTmFtZXMuaGFzTmFtZShhcmd1bWVudCkpOwogICAgICBwdXNoKG5ldyBqcy5WYXJpYWJsZVVzZSh2YXJpYWJsZU5hbWVzLmdldE5hbWUoYXJndW1lbnQpKSk7CiAgICB9CiAgfQoKICB2aXNpdChISW5zdHJ1Y3Rpb24gbm9kZSkgewogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2aXNpdEV4cHJlc3Npb24oSEluc3RydWN0aW9uIG5vZGUpIHsKICAgIGJvb2wgb2xkSXNHZW5lcmF0aW5nRXhwcmVzc2lvbiA9IGlzR2VuZXJhdGluZ0V4cHJlc3Npb247CiAgICBpc0dlbmVyYXRpbmdFeHByZXNzaW9uID0gdHJ1ZTsKICAgIHZpc2l0KG5vZGUpOwogICAgaXNHZW5lcmF0aW5nRXhwcmVzc2lvbiA9IG9sZElzR2VuZXJhdGluZ0V4cHJlc3Npb247CiAgfQoKICB2aXNpdFN0YXRlbWVudChISW5zdHJ1Y3Rpb24gbm9kZSkgewogICAgYXNzZXJ0KCFpc0dlbmVyYXRpbmdFeHByZXNzaW9uKTsKICAgIHZpc2l0KG5vZGUpOwogICAgaWYgKCFleHByZXNzaW9uU3RhY2suaXNFbXB0eSkgewogICAgICBhc3NlcnQoZXhwcmVzc2lvblN0YWNrLmxlbmd0aCA9PSAxKTsKICAgICAganMuRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcG9wKCk7CiAgICAgIHB1c2hFeHByZXNzaW9uQXNTdGF0ZW1lbnQoZXhwcmVzc2lvbiwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgfQoKICB2b2lkIGNvbnRpbnVlQXNCcmVhayhMYWJlbERlZmluaXRpb24gdGFyZ2V0KSB7CiAgICBwdXNoU3RhdGVtZW50KG5ldyBqcy5CcmVhayhfbmFtZXIuY29udGludWVMYWJlbE5hbWUodGFyZ2V0KSkpOwogIH0KCiAgdm9pZCBpbXBsaWNpdENvbnRpbnVlQXNCcmVhayhKdW1wVGFyZ2V0IHRhcmdldCkgewogICAgcHVzaFN0YXRlbWVudChuZXcganMuQnJlYWsoX25hbWVyLmltcGxpY2l0Q29udGludWVMYWJlbE5hbWUodGFyZ2V0KSkpOwogIH0KCiAgdm9pZCBpbXBsaWNpdEJyZWFrV2l0aExhYmVsKEp1bXBUYXJnZXQgdGFyZ2V0KSB7CiAgICBwdXNoU3RhdGVtZW50KG5ldyBqcy5CcmVhayhfbmFtZXIuaW1wbGljaXRCcmVha0xhYmVsTmFtZSh0YXJnZXQpKSk7CiAgfQoKICBqcy5TdGF0ZW1lbnQgd3JhcEludG9MYWJlbHMoCiAgICAgIGpzLlN0YXRlbWVudCByZXN1bHQsIExpc3Q8TGFiZWxEZWZpbml0aW9uPiBsYWJlbHMpIHsKICAgIGZvciAoTGFiZWxEZWZpbml0aW9uIGxhYmVsIGluIGxhYmVscykgewogICAgICBpZiAobGFiZWwuaXNUYXJnZXQpIHsKICAgICAgICBTdHJpbmcgYnJlYWtMYWJlbFN0cmluZyA9IF9uYW1lci5icmVha0xhYmVsTmFtZShsYWJlbCk7CiAgICAgICAgcmVzdWx0ID0gbmV3IGpzLkxhYmVsZWRTdGF0ZW1lbnQoYnJlYWtMYWJlbFN0cmluZywgcmVzdWx0KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIFRoZSByZWd1bGFyIFt2aXNpdElmXSBtZXRob2QgaW1wbGVtZW50cyB0aGUgbmVlZGVkIGxvZ2ljLgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJZkluZm8oSElmQmxvY2tJbmZvcm1hdGlvbiBpbmZvKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFN3aXRjaEluZm8oSFN3aXRjaEJsb2NrSW5mb3JtYXRpb24gaW5mbykgewogICAgYm9vbCBpc0V4cHJlc3Npb24gPSBpc0pTRXhwcmVzc2lvbihpbmZvLmV4cHJlc3Npb24pOwogICAgaWYgKCFpc0V4cHJlc3Npb24pIHsKICAgICAgZ2VuZXJhdGVTdGF0ZW1lbnRzKGluZm8uZXhwcmVzc2lvbik7CiAgICB9CgogICAgaWYgKGlzRXhwcmVzc2lvbikgewogICAgICBwdXNoKGdlbmVyYXRlRXhwcmVzc2lvbihpbmZvLmV4cHJlc3Npb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIHVzZShpbmZvLmV4cHJlc3Npb24uY29uZGl0aW9uRXhwcmVzc2lvbik7CiAgICB9CiAgICBqcy5FeHByZXNzaW9uIGtleSA9IHBvcCgpOwogICAgYm9vbCBoYW5kbGVkRGVmYXVsdCA9IGZhbHNlOwogICAgTGlzdDxqcy5Td2l0Y2hDbGF1c2U+IGNhc2VzID0gPGpzLlN3aXRjaENsYXVzZT5bXTsKICAgIEhTd2l0Y2ggc3dpdGNoSW5zdHJ1Y3Rpb24gPSBpbmZvLmV4cHJlc3Npb24uZW5kLmxhc3Q7CiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gc3dpdGNoSW5zdHJ1Y3Rpb24uaW5wdXRzOwogICAgTGlzdDxIQmFzaWNCbG9jaz4gc3VjY2Vzc29ycyA9IHN3aXRjaEluc3RydWN0aW9uLmJsb2NrLnN1Y2Nlc3NvcnM7CgogICAganMuQmxvY2sgb2xkQ29udGFpbmVyID0gY3VycmVudENvbnRhaW5lcjsKICAgIGZvciAoaW50IGlucHV0SW5kZXggPSAxLCBzdGF0ZW1lbnRJbmRleCA9IDA7CiAgICAgICAgaW5wdXRJbmRleCA8IGlucHV0cy5sZW5ndGg7CiAgICAgICAgc3RhdGVtZW50SW5kZXgrKykgewogICAgICBIQmFzaWNCbG9jayBzdWNjZXNzb3IgPSBzdWNjZXNzb3JzW2lucHV0SW5kZXggLSAxXTsKICAgICAgLy8gSWYgbGl2ZW5lc3MgYW5hbHlzaXMgaGFzIGZpZ3VyZWQgb3V0IHRoYXQgdGhpcyBjYXNlIGlzIGRlYWQsCiAgICAgIC8vIG9taXQgdGhlIGNvZGUgZm9yIGl0LgogICAgICBpZiAoc3VjY2Vzc29yLmlzTGl2ZSkgewogICAgICAgIGRvIHsKICAgICAgICAgIHZpc2l0KGlucHV0c1tpbnB1dEluZGV4XSk7CiAgICAgICAgICBjdXJyZW50Q29udGFpbmVyID0gbmV3IGpzLkJsb2NrLmVtcHR5KCk7CiAgICAgICAgICBjYXNlcy5hZGQobmV3IGpzLkNhc2UocG9wKCksIGN1cnJlbnRDb250YWluZXIpKTsKICAgICAgICAgIGlucHV0SW5kZXgrKzsKICAgICAgICB9IHdoaWxlICgoc3VjY2Vzc29yc1tpbnB1dEluZGV4IC0gMV0gPT0gc3VjY2Vzc29yKSAmJgogICAgICAgICAgICAoaW5wdXRJbmRleCA8IGlucHV0cy5sZW5ndGgpKTsKCiAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgbGFzdCBzdGF0ZW1lbnQsIHRoZW4gdGhlc2UgY2FzZXMgYWxzbyBiZWxvbmcgdG8gdGhlCiAgICAgICAgLy8gZGVmYXVsdCBibG9jay4KICAgICAgICBpZiAoc3RhdGVtZW50SW5kZXggPT0gaW5mby5zdGF0ZW1lbnRzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgIGN1cnJlbnRDb250YWluZXIgPSBuZXcganMuQmxvY2suZW1wdHkoKTsKICAgICAgICAgIGNhc2VzLmFkZChuZXcganMuRGVmYXVsdChjdXJyZW50Q29udGFpbmVyKSk7CiAgICAgICAgICBoYW5kbGVkRGVmYXVsdCA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICBnZW5lcmF0ZVN0YXRlbWVudHMoaW5mby5zdGF0ZW1lbnRzW3N0YXRlbWVudEluZGV4XSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gU2tpcCBhbGwgdGhlIGNhc2Ugc3RhdGVtZW50cyB0aGF0IGJlbG9uZyB0byB0aGlzCiAgICAgICAgLy8gYmxvY2suCiAgICAgICAgd2hpbGUgKChzdWNjZXNzb3JzW2lucHV0SW5kZXggLSAxXSA9PSBzdWNjZXNzb3IpICYmCiAgICAgICAgICAgIChpbnB1dEluZGV4IDwgaW5wdXRzLmxlbmd0aCkpIHsKICAgICAgICAgICsraW5wdXRJbmRleDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBJZiB0aGUgZGVmYXVsdCBjYXNlIGlzIGRlYWQsIHdlIG9taXQgaXQuIExpa2V3aXNlLCBpZiBpdCBpcyBhbgogICAgLy8gZW1wdHkgYmxvY2ssIHdlIG9taXQgaXQsIHRvby4KICAgIGlmIChpbmZvLnN0YXRlbWVudHMubGFzdC5zdGFydC5pc0xpdmUgJiYgIWhhbmRsZWREZWZhdWx0KSB7CiAgICAgIGN1cnJlbnRDb250YWluZXIgPSBuZXcganMuQmxvY2suZW1wdHkoKTsKICAgICAgZ2VuZXJhdGVTdGF0ZW1lbnRzKGluZm8uc3RhdGVtZW50cy5sYXN0KTsKICAgICAgaWYgKGN1cnJlbnRDb250YWluZXIuc3RhdGVtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgICAgY2FzZXMuYWRkKG5ldyBqcy5EZWZhdWx0KGN1cnJlbnRDb250YWluZXIpKTsKICAgICAgfQogICAgfQoKICAgIGN1cnJlbnRDb250YWluZXIgPSBvbGRDb250YWluZXI7CgogICAganMuU3RhdGVtZW50IHJlc3VsdCA9CiAgICAgICAgbmV3IGpzLlN3aXRjaChrZXksIGNhc2VzKS53aXRoU291cmNlSW5mb3JtYXRpb24oaW5mby5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICBwdXNoU3RhdGVtZW50KHdyYXBJbnRvTGFiZWxzKHJlc3VsdCwgaW5mby5sYWJlbHMpKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFNlcXVlbmNlSW5mbyhIU3RhdGVtZW50U2VxdWVuY2VJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0U3ViR3JhcGhJbmZvKEhTdWJHcmFwaEJsb2NrSW5mb3JtYXRpb24gaW5mbykgewogICAgdmlzaXRTdWJHcmFwaChpbmZvLnN1YkdyYXBoKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFN1YkV4cHJlc3Npb25JbmZvKEhTdWJFeHByZXNzaW9uQmxvY2tJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0QW5kT3JJbmZvKEhBbmRPckJsb2NrSW5mb3JtYXRpb24gaW5mbykgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFRyeUluZm8oSFRyeUJsb2NrSW5mb3JtYXRpb24gaW5mbykgewogICAganMuQmxvY2sgYm9keSA9IGdlbmVyYXRlU3RhdGVtZW50c0luTmV3QmxvY2soaW5mby5ib2R5KTsKICAgIGpzLkNhdGNoIGNhdGNoUGFydCA9IG51bGw7CiAgICBqcy5CbG9jayBmaW5hbGx5UGFydCA9IG51bGw7CiAgICBpZiAoaW5mby5jYXRjaEJsb2NrICE9IG51bGwpIHsKICAgICAgdm9pZCByZWdpc3RlcihDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQpIHsKICAgICAgICBpZiAoY2xhc3NFbGVtZW50ICE9IG51bGwpIHsKICAgICAgICAgIF9yZWdpc3RyeQogICAgICAgICAgICAgIC8vIGlnbm9yZTpkZXByZWNhdGVkX21lbWJlcl91c2VfZnJvbV9zYW1lX3BhY2thZ2UKICAgICAgICAgICAgICAucmVnaXN0ZXJJbnN0YW50aWF0ZWRDbGFzcyhjbGFzc0VsZW1lbnQpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmVnaXN0ZXIoX2NvbW1vbkVsZW1lbnRzLmpzUGxhaW5KYXZhU2NyaXB0T2JqZWN0Q2xhc3MpOwogICAgICByZWdpc3RlcihfY29tbW9uRWxlbWVudHMuanNVbmtub3duSmF2YVNjcmlwdE9iamVjdENsYXNzKTsKCiAgICAgIEhMb2NhbFZhbHVlIGV4Y2VwdGlvbiA9IGluZm8uY2F0Y2hWYXJpYWJsZTsKICAgICAgU3RyaW5nIG5hbWUgPSB2YXJpYWJsZU5hbWVzLmdldE5hbWUoZXhjZXB0aW9uKTsKICAgICAganMuVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsID0gbmV3IGpzLlZhcmlhYmxlRGVjbGFyYXRpb24obmFtZSk7CiAgICAgIGpzLkJsb2NrIGNhdGNoQmxvY2sgPSBnZW5lcmF0ZVN0YXRlbWVudHNJbk5ld0Jsb2NrKGluZm8uY2F0Y2hCbG9jayk7CiAgICAgIGNhdGNoUGFydCA9IG5ldyBqcy5DYXRjaChkZWNsLCBjYXRjaEJsb2NrKTsKICAgIH0KICAgIGlmIChpbmZvLmZpbmFsbHlCbG9jayAhPSBudWxsKSB7CiAgICAgIGZpbmFsbHlQYXJ0ID0gZ2VuZXJhdGVTdGF0ZW1lbnRzSW5OZXdCbG9jayhpbmZvLmZpbmFsbHlCbG9jayk7CiAgICB9CiAgICBwdXNoU3RhdGVtZW50KG5ldyBqcy5UcnkoYm9keSwgY2F0Y2hQYXJ0LCBmaW5hbGx5UGFydCkpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICB2b2lkIHZpc2l0Qm9keUlnbm9yZUxhYmVscyhITG9vcEJsb2NrSW5mb3JtYXRpb24gaW5mbykgewogICAgaWYgKGluZm8uYm9keS5zdGFydC5pc0xhYmVsZWRCbG9jaygpKSB7CiAgICAgIEhCbG9ja0luZm9ybWF0aW9uIG9sZEluZm8gPSBjdXJyZW50QmxvY2tJbmZvcm1hdGlvbjsKICAgICAgY3VycmVudEJsb2NrSW5mb3JtYXRpb24gPSBpbmZvLmJvZHkuc3RhcnQuYmxvY2tGbG93LmJvZHk7CiAgICAgIGdlbmVyYXRlU3RhdGVtZW50cyhpbmZvLmJvZHkpOwogICAgICBjdXJyZW50QmxvY2tJbmZvcm1hdGlvbiA9IG9sZEluZm87CiAgICB9IGVsc2UgewogICAgICBnZW5lcmF0ZVN0YXRlbWVudHMoaW5mby5ib2R5KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRMb29wSW5mbyhITG9vcEJsb2NrSW5mb3JtYXRpb24gaW5mbykgewogICAgSEV4cHJlc3Npb25JbmZvcm1hdGlvbiBjb25kaXRpb24gPSBpbmZvLmNvbmRpdGlvbjsKICAgIGJvb2wgaXNDb25kaXRpb25FeHByZXNzaW9uID0gaXNKU0NvbmRpdGlvbihjb25kaXRpb24pOwoKICAgIGpzLkxvb3AgbG9vcDsKCiAgICBzd2l0Y2ggKGluZm8ua2luZCkgewogICAgICAvLyBUcmVhdCBhbGwgdGhyZWUgInRlc3QtZmlyc3QiIGxvb3BzIHRoZSBzYW1lIHdheS4KICAgICAgY2FzZSBITG9vcEJsb2NrSW5mb3JtYXRpb24uRk9SX0xPT1A6CiAgICAgIGNhc2UgSExvb3BCbG9ja0luZm9ybWF0aW9uLldISUxFX0xPT1A6CiAgICAgIGNhc2UgSExvb3BCbG9ja0luZm9ybWF0aW9uLkZPUl9JTl9MT09QOgogICAgICBjYXNlIEhMb29wQmxvY2tJbmZvcm1hdGlvbi5TV0lUQ0hfQ09OVElOVUVfTE9PUDoKICAgICAgICBIQmxvY2tJbmZvcm1hdGlvbiBpbml0aWFsaXphdGlvbiA9IGluZm8uaW5pdGlhbGl6ZXI7CiAgICAgICAgaW50IGluaXRpYWxpemF0aW9uVHlwZSA9IFRZUEVfU1RBVEVNRU5UOwogICAgICAgIGlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICBpbml0aWFsaXphdGlvblR5cGUgPSBleHByZXNzaW9uVHlwZShpbml0aWFsaXphdGlvbik7CiAgICAgICAgICBpZiAoaW5pdGlhbGl6YXRpb25UeXBlID09IFRZUEVfU1RBVEVNRU5UKSB7CiAgICAgICAgICAgIGdlbmVyYXRlU3RhdGVtZW50cyhpbml0aWFsaXphdGlvbik7CiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFdlIGluc2VydGVkIGEgYmFzaWMgYmxvY2sgdG8gYXZvaWQgY3JpdGljYWwgZWRnZXMuIFRoaXMgYmxvY2sgaXMKICAgICAgICAvLyBwYXJ0IG9mIHRoZSBMb29wQmxvY2tJbmZvcm1hdGlvbiBhbmQgbXVzdCB0aGVyZWZvcmUgYmUgaGFuZGxlZCBoZXJlLgogICAgICAgIGpzLkJsb2NrIG9sZENvbnRhaW5lciA9IGN1cnJlbnRDb250YWluZXI7CiAgICAgICAganMuQmxvY2sgYXZvaWRDb250YWluZXIgPSBuZXcganMuQmxvY2suZW1wdHkoKTsKICAgICAgICBjdXJyZW50Q29udGFpbmVyID0gYXZvaWRDb250YWluZXI7CiAgICAgICAgYXNzaWduUGhpc09mU3VjY2Vzc29ycyhjb25kaXRpb24uZW5kLnN1Y2Nlc3NvcnMubGFzdCk7CiAgICAgICAgYm9vbCBoYXNQaGlVcGRhdGVzID0gIWF2b2lkQ29udGFpbmVyLnN0YXRlbWVudHMuaXNFbXB0eTsKICAgICAgICBjdXJyZW50Q29udGFpbmVyID0gb2xkQ29udGFpbmVyOwoKICAgICAgICBpZiAoaXNDb25kaXRpb25FeHByZXNzaW9uICYmCiAgICAgICAgICAgICFoYXNQaGlVcGRhdGVzICYmCiAgICAgICAgICAgIGluZm8udXBkYXRlcyAhPSBudWxsICYmCiAgICAgICAgICAgIGlzSlNFeHByZXNzaW9uKGluZm8udXBkYXRlcykpIHsKICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gdXBkYXRlcyBncmFwaCwgYW5kIGl0J3MgZXhwcmVzc2libGUgYXMgYW4KICAgICAgICAgIC8vIGV4cHJlc3Npb24sIGdlbmVyYXRlIGEgZm9yLWxvb3AuCiAgICAgICAgICBqcy5FeHByZXNzaW9uIGpzSW5pdGlhbGl6YXRpb24gPSBudWxsOwogICAgICAgICAgaWYgKGluaXRpYWxpemF0aW9uICE9IG51bGwpIHsKICAgICAgICAgICAgaW50IGRlbGF5ZWRWYXJpYWJsZXNDb3VudCA9IGNvbGxlY3RlZFZhcmlhYmxlRGVjbGFyYXRpb25zLmxlbmd0aDsKICAgICAgICAgICAganNJbml0aWFsaXphdGlvbiA9IGdlbmVyYXRlRXhwcmVzc2lvbihpbml0aWFsaXphdGlvbik7CiAgICAgICAgICAgIGlmICghc2hvdWxkR3JvdXBWYXJEZWNsYXJhdGlvbnMgJiYKICAgICAgICAgICAgICAgIGRlbGF5ZWRWYXJpYWJsZXNDb3VudCA8IGNvbGxlY3RlZFZhcmlhYmxlRGVjbGFyYXRpb25zLmxlbmd0aCkgewogICAgICAgICAgICAgIC8vIFdlIGp1c3QgYWRkZWQgYSBuZXcgZGVsYXllZCB2YXJpYWJsZS1kZWNsYXJhdGlvbi4gU2VlIGlmIHdlIGNhbgogICAgICAgICAgICAgIC8vIHB1dCBpbiBhICd2YXInIGluIGZyb250IG9mIHRoZSBpbml0aWFsaXphdGlvbiB0byBtYWtlIGl0IGdvCiAgICAgICAgICAgICAgLy8gYXdheS4gV2Ugd2FsayB0aGUgJ3RyZWUnIG9mIGNvbW1hLW9wZXJhdG9ycyB0byBmaW5kIHRoZQogICAgICAgICAgICAgIC8vIGV4cHJlc3Npb25zIGFuZCBzZWUgaWYgdGhleSBhcmUgYWxsIGFzc2lnbm1lbnRzIHRoYXQgY2FuIGJlCiAgICAgICAgICAgICAgLy8gY29udmVydGVkIGludG8gZGVjbGFyYXRpb25zLgoKICAgICAgICAgICAgICBMaXN0PGpzLkFzc2lnbm1lbnQ+IGFzc2lnbm1lbnRzOwoKICAgICAgICAgICAgICBib29sIGFsbFNpbXBsZUFzc2lnbm1lbnRzKGpzLkV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gaXMganMuQXNzaWdubWVudCkgewogICAgICAgICAgICAgICAgICBqcy5Bc3NpZ25tZW50IGFzc2lnbm1lbnQgPSBleHByZXNzaW9uOwogICAgICAgICAgICAgICAgICBpZiAoYXNzaWdubWVudC5sZWZ0SGFuZFNpZGUgaXMganMuVmFyaWFibGVVc2UgJiYKICAgICAgICAgICAgICAgICAgICAgICFhc3NpZ25tZW50LmlzQ29tcG91bmQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaWdubWVudHMgPT0gbnVsbCkgYXNzaWdubWVudHMgPSA8anMuQXNzaWdubWVudD5bXTsKICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50cy5hZGQoZXhwcmVzc2lvbik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5pc0NvbW1hT3BlcmF0b3IpIHsKICAgICAgICAgICAgICAgICAganMuQmluYXJ5IGJpbmFyeSA9IGV4cHJlc3Npb247CiAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxTaW1wbGVBc3NpZ25tZW50cyhiaW5hcnkubGVmdCkgJiYKICAgICAgICAgICAgICAgICAgICAgIGFsbFNpbXBsZUFzc2lnbm1lbnRzKGJpbmFyeS5yaWdodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpZiAoYWxsU2ltcGxlQXNzaWdubWVudHMoanNJbml0aWFsaXphdGlvbikpIHsKICAgICAgICAgICAgICAgIExpc3Q8anMuVmFyaWFibGVJbml0aWFsaXphdGlvbj4gaW5pdHMgPQogICAgICAgICAgICAgICAgICAgIDxqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uPltdOwogICAgICAgICAgICAgICAgZm9yIChqcy5Bc3NpZ25tZW50IGFzc2lnbm1lbnQgaW4gYXNzaWdubWVudHMpIHsKICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gKGFzc2lnbm1lbnQubGVmdEhhbmRTaWRlIGFzIGpzLlZhcmlhYmxlVXNlKS5uYW1lOwogICAgICAgICAgICAgICAgICBqcy5Ob2RlIGRlY2xhcmF0aW9uID0gbmV3IGpzLlZhcmlhYmxlRGVjbGFyYXRpb24oaWQpOwogICAgICAgICAgICAgICAgICBpbml0cy5hZGQobmV3IGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24oCiAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbiwgYXNzaWdubWVudC52YWx1ZSkpOwogICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRWYXJpYWJsZURlY2xhcmF0aW9ucy5yZW1vdmUoaWQpOwogICAgICAgICAgICAgICAgICBkZWNsYXJlZExvY2Fscy5hZGQoaWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAganNJbml0aWFsaXphdGlvbiA9IG5ldyBqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdChpbml0cyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBqcy5FeHByZXNzaW9uIGpzQ29uZGl0aW9uID0gZ2VuZXJhdGVFeHByZXNzaW9uKGNvbmRpdGlvbik7CiAgICAgICAgICBqcy5FeHByZXNzaW9uIGpzVXBkYXRlcyA9IGdlbmVyYXRlRXhwcmVzc2lvbihpbmZvLnVwZGF0ZXMpOwogICAgICAgICAgLy8gVGhlIGJvZHkgbWlnaHQgYmUgbGFiZWxlZC4gSWdub3JlIHRoaXMgd2hlbiByZWN1cnNpbmcgb24gdGhlCiAgICAgICAgICAvLyBzdWJncmFwaC4KICAgICAgICAgIC8vIFRPRE8obHJuKTogUmVtb3ZlIHRoaXMgZXh0cmEgbGFiZWxpbmcgd2hlbiBoYW5kbGluZyBhbGwgbG9vcHMKICAgICAgICAgIC8vIHVzaW5nIHN1YmdyYXBocy4KICAgICAgICAgIG9sZENvbnRhaW5lciA9IGN1cnJlbnRDb250YWluZXI7CiAgICAgICAgICBqcy5TdGF0ZW1lbnQgYm9keSA9IG5ldyBqcy5CbG9jay5lbXB0eSgpOwogICAgICAgICAgY3VycmVudENvbnRhaW5lciA9IGJvZHk7CiAgICAgICAgICB2aXNpdEJvZHlJZ25vcmVMYWJlbHMoaW5mbyk7CiAgICAgICAgICBjdXJyZW50Q29udGFpbmVyID0gb2xkQ29udGFpbmVyOwogICAgICAgICAgYm9keSA9IHVud3JhcFN0YXRlbWVudChib2R5KTsKICAgICAgICAgIGxvb3AgPSBuZXcganMuRm9yKGpzSW5pdGlhbGl6YXRpb24sIGpzQ29uZGl0aW9uLCBqc1VwZGF0ZXMsIGJvZHkpCiAgICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihpbmZvLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gV2UgaGF2ZSBlaXRoZXIgbm8gdXBkYXRlIGdyYXBoLCBvciBpdCdzIHRvbyBjb21wbGV4IHRvCiAgICAgICAgICAvLyBwdXQgaW4gYW4gZXhwcmVzc2lvbi4KICAgICAgICAgIGlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgIGdlbmVyYXRlU3RhdGVtZW50cyhpbml0aWFsaXphdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgICBqcy5FeHByZXNzaW9uIGpzQ29uZGl0aW9uOwogICAgICAgICAganMuQmxvY2sgb2xkQ29udGFpbmVyID0gY3VycmVudENvbnRhaW5lcjsKICAgICAgICAgIGpzLlN0YXRlbWVudCBib2R5ID0gbmV3IGpzLkJsb2NrLmVtcHR5KCk7CiAgICAgICAgICBpZiAoaXNDb25kaXRpb25FeHByZXNzaW9uICYmICFoYXNQaGlVcGRhdGVzKSB7CiAgICAgICAgICAgIGpzQ29uZGl0aW9uID0gZ2VuZXJhdGVFeHByZXNzaW9uKGNvbmRpdGlvbik7CiAgICAgICAgICAgIGN1cnJlbnRDb250YWluZXIgPSBib2R5OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAganNDb25kaXRpb24gPSBuZXdMaXRlcmFsQm9vbCh0cnVlLCBpbmZvLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgICAgICAgY3VycmVudENvbnRhaW5lciA9IGJvZHk7CiAgICAgICAgICAgIGdlbmVyYXRlU3RhdGVtZW50cyhjb25kaXRpb24pOwogICAgICAgICAgICB1c2UoY29uZGl0aW9uLmNvbmRpdGlvbkV4cHJlc3Npb24pOwogICAgICAgICAgICBqcy5FeHByZXNzaW9uIGlmVGVzdCA9IG5ldyBqcy5QcmVmaXgoIiEiLCBwb3AoKSk7CiAgICAgICAgICAgIGpzLlN0YXRlbWVudCBqc0JyZWFrID0gbmV3IGpzLkJyZWFrKG51bGwpOwogICAgICAgICAgICBqcy5TdGF0ZW1lbnQgZXhpdExvb3A7CiAgICAgICAgICAgIGlmIChhdm9pZENvbnRhaW5lci5zdGF0ZW1lbnRzLmlzRW1wdHkpIHsKICAgICAgICAgICAgICBleGl0TG9vcCA9IGpzQnJlYWs7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYXZvaWRDb250YWluZXIuc3RhdGVtZW50cy5hZGQoanNCcmVhayk7CiAgICAgICAgICAgICAgZXhpdExvb3AgPSBhdm9pZENvbnRhaW5lcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXNoU3RhdGVtZW50KG5ldyBqcy5JZi5ub0Vsc2UoaWZUZXN0LCBleGl0TG9vcCkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGluZm8udXBkYXRlcyAhPSBudWxsKSB7CiAgICAgICAgICAgIHdyYXBMb29wQm9keUZvckNvbnRpbnVlKGluZm8pOwogICAgICAgICAgICBnZW5lcmF0ZVN0YXRlbWVudHMoaW5mby51cGRhdGVzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZpc2l0Qm9keUlnbm9yZUxhYmVscyhpbmZvKTsKICAgICAgICAgIH0KICAgICAgICAgIGN1cnJlbnRDb250YWluZXIgPSBvbGRDb250YWluZXI7CiAgICAgICAgICBib2R5ID0gdW53cmFwU3RhdGVtZW50KGJvZHkpOwogICAgICAgICAgbG9vcCA9IG5ldyBqcy5XaGlsZShqc0NvbmRpdGlvbiwgYm9keSkKICAgICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKGluZm8uc291cmNlSW5mb3JtYXRpb24pOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBITG9vcEJsb2NrSW5mb3JtYXRpb24uRE9fV0hJTEVfTE9PUDoKICAgICAgICBpZiAoaW5mby5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgICBnZW5lcmF0ZVN0YXRlbWVudHMoaW5mby5pbml0aWFsaXplcik7CiAgICAgICAgfQogICAgICAgIC8vIFdlIGluc2VydGVkIGEgYmFzaWMgYmxvY2sgdG8gYXZvaWQgY3JpdGljYWwgZWRnZXMuIFRoaXMgYmxvY2sgaXMKICAgICAgICAvLyBwYXJ0IG9mIHRoZSBMb29wQmxvY2tJbmZvcm1hdGlvbiBhbmQgbXVzdCB0aGVyZWZvcmUgYmUgaGFuZGxlZCBoZXJlLgogICAgICAgIGpzLkJsb2NrIG9sZENvbnRhaW5lciA9IGN1cnJlbnRDb250YWluZXI7CiAgICAgICAganMuQmxvY2sgZXhpdEF2b2lkQ29udGFpbmVyID0gbmV3IGpzLkJsb2NrLmVtcHR5KCk7CiAgICAgICAgY3VycmVudENvbnRhaW5lciA9IGV4aXRBdm9pZENvbnRhaW5lcjsKICAgICAgICBhc3NpZ25QaGlzT2ZTdWNjZXNzb3JzKGNvbmRpdGlvbi5lbmQuc3VjY2Vzc29ycy5sYXN0KTsKICAgICAgICBib29sIGhhc0V4aXRQaGlVcGRhdGVzID0gIWV4aXRBdm9pZENvbnRhaW5lci5zdGF0ZW1lbnRzLmlzRW1wdHk7CiAgICAgICAgY3VycmVudENvbnRhaW5lciA9IG9sZENvbnRhaW5lcjsKCiAgICAgICAgb2xkQ29udGFpbmVyID0gY3VycmVudENvbnRhaW5lcjsKICAgICAgICBqcy5CbG9jayBib2R5ID0gbmV3IGpzLkJsb2NrLmVtcHR5KCk7CiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIHBoaSBjb3BpZXMgaW4gdGhlIGJsb2NrIHRoYXQganVtcHMgdG8gdGhlCiAgICAgICAgLy8gbG9vcCBlbnRyeSwgd2UgbXVzdCBlbWl0IHRoZSBjb25kaXRpb24gbGlrZSB0aGlzOgogICAgICAgIC8vIGRvIHsKICAgICAgICAvLyAgIGJvZHk7CiAgICAgICAgLy8gICBpZiAoY29uZGl0aW9uKSB7CiAgICAgICAgLy8gICAgIHBoaSB1cGRhdGVzOwogICAgICAgIC8vICAgICBjb250aW51ZTsKICAgICAgICAvLyAgIH0gZWxzZSB7CiAgICAgICAgLy8gICAgIGJyZWFrOwogICAgICAgIC8vICAgfQogICAgICAgIC8vIH0gd2hpbGUgKHRydWUpOwogICAgICAgIEhCYXNpY0Jsb2NrIGF2b2lkRWRnZSA9IGluZm8uZW5kLnN1Y2Nlc3NvcnNbMF07CiAgICAgICAganMuQmxvY2sgdXBkYXRlQm9keSA9IG5ldyBqcy5CbG9jay5lbXB0eSgpOwogICAgICAgIGN1cnJlbnRDb250YWluZXIgPSB1cGRhdGVCb2R5OwogICAgICAgIGFzc2lnblBoaXNPZlN1Y2Nlc3NvcnMoYXZvaWRFZGdlKTsKICAgICAgICBib29sIGhhc1BoaVVwZGF0ZXMgPSAhdXBkYXRlQm9keS5zdGF0ZW1lbnRzLmlzRW1wdHk7CiAgICAgICAgY3VycmVudENvbnRhaW5lciA9IGJvZHk7CiAgICAgICAgdmlzaXRCb2R5SWdub3JlTGFiZWxzKGluZm8pOwogICAgICAgIGlmIChpbmZvLnVwZGF0ZXMgIT0gbnVsbCkgewogICAgICAgICAgZ2VuZXJhdGVTdGF0ZW1lbnRzKGluZm8udXBkYXRlcyk7CiAgICAgICAgfQogICAgICAgIGlmIChpc0NvbmRpdGlvbkV4cHJlc3Npb24pIHsKICAgICAgICAgIHB1c2goZ2VuZXJhdGVFeHByZXNzaW9uKGNvbmRpdGlvbikpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBnZW5lcmF0ZVN0YXRlbWVudHMoY29uZGl0aW9uKTsKICAgICAgICAgIHVzZShjb25kaXRpb24uY29uZGl0aW9uRXhwcmVzc2lvbik7CiAgICAgICAgfQogICAgICAgIGpzLkV4cHJlc3Npb24ganNDb25kaXRpb24gPSBwb3AoKTsKICAgICAgICBpZiAoanNDb25kaXRpb24gPT0gbnVsbCkgewogICAgICAgICAgLy8gSWYgdGhlIGNvbmRpdGlvbiBpcyBkZWFkIGNvZGUsIHdlIHR1cm4gdGhlIGRvLXdoaWxlIGludG8KICAgICAgICAgIC8vIGEgc2ltcGxlciB3aGlsZSBiZWNhdXNlIHdlIHdpbGwgbmV2ZXIgcmVhY2ggdGhlIGNvbmRpdGlvbgogICAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCBhbnl3YXkuCiAgICAgICAgICBsb29wID0gbmV3IGpzLldoaWxlKG5ld0xpdGVyYWxCb29sKHRydWUsIGluZm8uc291cmNlSW5mb3JtYXRpb24pLAogICAgICAgICAgICAgICAgICB1bndyYXBTdGF0ZW1lbnQoYm9keSkpCiAgICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihpbmZvLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGhhc1BoaVVwZGF0ZXMgfHwgaGFzRXhpdFBoaVVwZGF0ZXMpIHsKICAgICAgICAgICAgdXBkYXRlQm9keS5zdGF0ZW1lbnRzLmFkZChuZXcganMuQ29udGludWUobnVsbCkpOwogICAgICAgICAgICBqcy5TdGF0ZW1lbnQganNCcmVhayA9IG5ldyBqcy5CcmVhayhudWxsKTsKICAgICAgICAgICAganMuU3RhdGVtZW50IGV4aXRMb29wOwogICAgICAgICAgICBpZiAoZXhpdEF2b2lkQ29udGFpbmVyLnN0YXRlbWVudHMuaXNFbXB0eSkgewogICAgICAgICAgICAgIGV4aXRMb29wID0ganNCcmVhazsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBleGl0QXZvaWRDb250YWluZXIuc3RhdGVtZW50cy5hZGQoanNCcmVhayk7CiAgICAgICAgICAgICAgZXhpdExvb3AgPSBleGl0QXZvaWRDb250YWluZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYm9keS5zdGF0ZW1lbnRzLmFkZChuZXcganMuSWYoanNDb25kaXRpb24sIHVwZGF0ZUJvZHksIGV4aXRMb29wKSk7CiAgICAgICAgICAgIGpzQ29uZGl0aW9uID0gbmV3TGl0ZXJhbEJvb2wodHJ1ZSwgaW5mby5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgICBsb29wID0gbmV3IGpzLkRvKHVud3JhcFN0YXRlbWVudChib2R5KSwganNDb25kaXRpb24pCiAgICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihpbmZvLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgICB9CiAgICAgICAgY3VycmVudENvbnRhaW5lciA9IG9sZENvbnRhaW5lcjsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBmYWlsZWRBdChjb25kaXRpb24uY29uZGl0aW9uRXhwcmVzc2lvbiwKICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgbG9vcCBraW5kOiAke2luZm8ua2luZH0uJyk7CiAgICB9CiAgICBqcy5TdGF0ZW1lbnQgcmVzdWx0ID0gbG9vcDsKICAgIGlmIChpbmZvLmtpbmQgPT0gSExvb3BCbG9ja0luZm9ybWF0aW9uLlNXSVRDSF9DT05USU5VRV9MT09QKSB7CiAgICAgIFN0cmluZyBjb250aW51ZUxhYmVsU3RyaW5nID0KICAgICAgICAgIF9uYW1lci5pbXBsaWNpdENvbnRpbnVlTGFiZWxOYW1lKGluZm8udGFyZ2V0KTsKICAgICAgcmVzdWx0ID0gbmV3IGpzLkxhYmVsZWRTdGF0ZW1lbnQoY29udGludWVMYWJlbFN0cmluZywgcmVzdWx0KTsKICAgIH0KICAgIHB1c2hTdGF0ZW1lbnQod3JhcEludG9MYWJlbHMocmVzdWx0LCBpbmZvLmxhYmVscykpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TGFiZWxlZEJsb2NrSW5mbyhITGFiZWxlZEJsb2NrSW5mb3JtYXRpb24gbGFiZWxlZEJsb2NrSW5mbykgewogICAgTGluazxFbnRpdHk+IGNvbnRpbnVlT3ZlcnJpZGVzID0gY29uc3QgTGluazxFbnRpdHk+KCk7CgogICAganMuQmxvY2sgb2xkQ29udGFpbmVyID0gY3VycmVudENvbnRhaW5lcjsKICAgIGpzLkJsb2NrIGJvZHkgPSBuZXcganMuQmxvY2suZW1wdHkoKTsKICAgIGpzLlN0YXRlbWVudCByZXN1bHQgPSBib2R5OwoKICAgIGN1cnJlbnRDb250YWluZXIgPSBib2R5OwoKICAgIC8vIElmIFtsYWJlbGVkQmxvY2tJbmZvLmlzQ29udGludWVdLCB0aGUgYmxvY2sgaXMgYW4gYXJ0aWZpY2lhbAogICAgLy8gYmxvY2sgYXJvdW5kIHRoZSBib2R5IG9mIGEgbG9vcCB3aXRoIGFuIHVwZGF0ZSBibG9jaywgc28gdGhhdAogICAgLy8gY29udGludWVzIG9mIHRoZSBsb29wIGNhbiBiZSB3cml0dGVuIGFzIGJyZWFrcyBvZiB0aGUgYm9keQogICAgLy8gYmxvY2suCiAgICBpZiAobGFiZWxlZEJsb2NrSW5mby5pc0NvbnRpbnVlKSB7CiAgICAgIGZvciAoTGFiZWxEZWZpbml0aW9uIGxhYmVsIGluIGxhYmVsZWRCbG9ja0luZm8ubGFiZWxzKSB7CiAgICAgICAgaWYgKGxhYmVsLmlzQ29udGludWVUYXJnZXQpIHsKICAgICAgICAgIFN0cmluZyBsYWJlbE5hbWUgPSBfbmFtZXIuY29udGludWVMYWJlbE5hbWUobGFiZWwpOwogICAgICAgICAgcmVzdWx0ID0gbmV3IGpzLkxhYmVsZWRTdGF0ZW1lbnQobGFiZWxOYW1lLCByZXN1bHQpOwogICAgICAgICAgY29udGludWVBY3Rpb24uYWRkKGxhYmVsKTsKICAgICAgICAgIGNvbnRpbnVlT3ZlcnJpZGVzID0gY29udGludWVPdmVycmlkZXMucHJlcGVuZChsYWJlbCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIEZvciBoYW5kbGluZyB1bmxhYmVsZWQgY29udGludWVzIGZyb20gdGhlIGJvZHkgb2YgYSBsb29wLgogICAgICAvLyBUT0RPKGxybik6IENvbnNpZGVyIHJlY29yZGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgaXMgaW4gZmFjdAogICAgICAvLyBhIHRhcmdldCBvZiBhbiB1bmxhYmVsZWQgY29udGludWUsIGFuZCBub3QgZ2VuZXJhdGUgdGhpcyBpZiBpdCBpc24ndC4KICAgICAgSnVtcFRhcmdldCB0YXJnZXQgPSBsYWJlbGVkQmxvY2tJbmZvLnRhcmdldDsKICAgICAgU3RyaW5nIGxhYmVsTmFtZSA9IF9uYW1lci5pbXBsaWNpdENvbnRpbnVlTGFiZWxOYW1lKHRhcmdldCk7CiAgICAgIHJlc3VsdCA9IG5ldyBqcy5MYWJlbGVkU3RhdGVtZW50KGxhYmVsTmFtZSwgcmVzdWx0KTsKICAgICAgaW1wbGljaXRDb250aW51ZUFjdGlvbi5hZGQodGFyZ2V0KTsKICAgICAgY29udGludWVPdmVycmlkZXMgPSBjb250aW51ZU92ZXJyaWRlcy5wcmVwZW5kKHRhcmdldCk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKExhYmVsRGVmaW5pdGlvbiBsYWJlbCBpbiBsYWJlbGVkQmxvY2tJbmZvLmxhYmVscykgewogICAgICAgIGlmIChsYWJlbC5pc0JyZWFrVGFyZ2V0KSB7CiAgICAgICAgICBTdHJpbmcgbGFiZWxOYW1lID0gX25hbWVyLmJyZWFrTGFiZWxOYW1lKGxhYmVsKTsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBqcy5MYWJlbGVkU3RhdGVtZW50KGxhYmVsTmFtZSwgcmVzdWx0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gbGFiZWxlZEJsb2NrSW5mby50YXJnZXQ7CiAgICBpZiAodGFyZ2V0LmlzU3dpdGNoKSB7CiAgICAgIC8vIFRoaXMgaXMgYW4gZXh0cmEgYmxvY2sgYXJvdW5kIGEgc3dpdGNoIHRoYXQgaXMgZ2VuZXJhdGVkCiAgICAgIC8vIGFzIGEgbmVzdGVkIGlmL2Vsc2UgY2hhaW4uIFdlIGFkZCBhbiBleHRyYSBicmVhayB0YXJnZXQKICAgICAgLy8gc28gdGhhdCBjYXNlIGNvZGUgY2FuIGJyZWFrLgogICAgICBTdHJpbmcgbGFiZWxOYW1lID0gX25hbWVyLmltcGxpY2l0QnJlYWtMYWJlbE5hbWUodGFyZ2V0KTsKICAgICAgcmVzdWx0ID0gbmV3IGpzLkxhYmVsZWRTdGF0ZW1lbnQobGFiZWxOYW1lLCByZXN1bHQpOwogICAgICBicmVha0FjdGlvbi5hZGQodGFyZ2V0KTsKICAgIH0KCiAgICBjdXJyZW50Q29udGFpbmVyID0gYm9keTsKICAgIGdlbmVyYXRlU3RhdGVtZW50cyhsYWJlbGVkQmxvY2tJbmZvLmJvZHkpOwoKICAgIGlmIChsYWJlbGVkQmxvY2tJbmZvLmlzQ29udGludWUpIHsKICAgICAgd2hpbGUgKCFjb250aW51ZU92ZXJyaWRlcy5pc0VtcHR5KSB7CiAgICAgICAgY29udGludWVBY3Rpb24ucmVtb3ZlKGNvbnRpbnVlT3ZlcnJpZGVzLmhlYWQpOwogICAgICAgIGltcGxpY2l0Q29udGludWVBY3Rpb24ucmVtb3ZlKGNvbnRpbnVlT3ZlcnJpZGVzLmhlYWQpOwogICAgICAgIGNvbnRpbnVlT3ZlcnJpZGVzID0gY29udGludWVPdmVycmlkZXMudGFpbDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYnJlYWtBY3Rpb24ucmVtb3ZlKGxhYmVsZWRCbG9ja0luZm8udGFyZ2V0KTsKICAgIH0KCiAgICBjdXJyZW50Q29udGFpbmVyID0gb2xkQ29udGFpbmVyOwogICAgcHVzaFN0YXRlbWVudChyZXN1bHQpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLyBXcmFwcyBhIGxvb3AgYm9keSBpbiBhIGJsb2NrIHRvIG1ha2UgY29udGludWVzIGhhdmUgYSB0YXJnZXQgdG8gYnJlYWsKICAvLyB0byAoaWYgbmVjZXNzYXJ5KS4KICB2b2lkIHdyYXBMb29wQm9keUZvckNvbnRpbnVlKEhMb29wQmxvY2tJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IGluZm8udGFyZ2V0OwogICAgaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5pc0NvbnRpbnVlVGFyZ2V0KSB7CiAgICAgIGpzLkJsb2NrIG9sZENvbnRhaW5lciA9IGN1cnJlbnRDb250YWluZXI7CiAgICAgIGpzLkJsb2NrIGJvZHkgPSBuZXcganMuQmxvY2suZW1wdHkoKTsKICAgICAgY3VycmVudENvbnRhaW5lciA9IGJvZHk7CiAgICAgIGpzLlN0YXRlbWVudCByZXN1bHQgPSBib2R5OwogICAgICBmb3IgKExhYmVsRGVmaW5pdGlvbiBsYWJlbCBpbiBpbmZvLmxhYmVscykgewogICAgICAgIGlmIChsYWJlbC5pc0NvbnRpbnVlVGFyZ2V0KSB7CiAgICAgICAgICBTdHJpbmcgbGFiZWxOYW1lID0gX25hbWVyLmNvbnRpbnVlTGFiZWxOYW1lKGxhYmVsKTsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBqcy5MYWJlbGVkU3RhdGVtZW50KGxhYmVsTmFtZSwgcmVzdWx0KTsKICAgICAgICAgIGNvbnRpbnVlQWN0aW9uLmFkZChsYWJlbCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIFN0cmluZyBsYWJlbE5hbWUgPSBfbmFtZXIuaW1wbGljaXRDb250aW51ZUxhYmVsTmFtZSh0YXJnZXQpOwogICAgICByZXN1bHQgPSBuZXcganMuTGFiZWxlZFN0YXRlbWVudChsYWJlbE5hbWUsIHJlc3VsdCk7CiAgICAgIGltcGxpY2l0Q29udGludWVBY3Rpb24uYWRkKGluZm8udGFyZ2V0KTsKICAgICAgdmlzaXRCb2R5SWdub3JlTGFiZWxzKGluZm8pOwogICAgICBpbXBsaWNpdENvbnRpbnVlQWN0aW9uLnJlbW92ZShpbmZvLnRhcmdldCk7CiAgICAgIGZvciAoTGFiZWxEZWZpbml0aW9uIGxhYmVsIGluIGluZm8ubGFiZWxzKSB7CiAgICAgICAgaWYgKGxhYmVsLmlzQ29udGludWVUYXJnZXQpIHsKICAgICAgICAgIGNvbnRpbnVlQWN0aW9uLnJlbW92ZShsYWJlbCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGN1cnJlbnRDb250YWluZXIgPSBvbGRDb250YWluZXI7CiAgICAgIHB1c2hTdGF0ZW1lbnQocmVzdWx0KTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIExvb3AgYm9keSBjb250YWlucyBubyBjb250aW51ZXMsIHNvIHdlIGRvbid0IG5lZWQgYSBicmVhayB0YXJnZXQuCiAgICAgIGdlbmVyYXRlU3RhdGVtZW50cyhpbmZvLmJvZHkpOwogICAgfQogIH0KCiAgYm9vbCBoYW5kbGVCbG9ja0Zsb3coSEJsb2NrRmxvdyBibG9jaykgewogICAgSEJsb2NrSW5mb3JtYXRpb24gaW5mbyA9IGJsb2NrLmJvZHk7CiAgICAvLyBJZiB3ZSByZWFjaCBoZXJlIGFnYWluIHdoaWxlIGhhbmRsaW5nIHRoZSBhdHRhY2hlZCBpbmZvcm1hdGlvbiwKICAgIC8vIGUuZy4sIGJlY2F1c2Ugd2UgY2FsbCB2aXNpdFN1YkdyYXBoIG9uIGEgc3ViZ3JhcGggc3RhcnRpbmcgb24KICAgIC8vIHRoZSBzYW1lIGJsb2NrLCBkb24ndCBoYW5kbGUgaXQgYWdhaW4uCiAgICAvLyBXaGVuIHRoZSBzdHJ1Y3R1cmUgZ3JhcGggaXMgY29tcGxldGUsIHdlIHdpbGwgYmUgYWJsZSB0byBoYXZlCiAgICAvLyBkaWZmZXJlbnQgc3RydWN0dXJlcyBzdGFydGluZyBvbiB0aGUgc2FtZSBiYXNpYyBibG9jayAoZS5nLiwgYW4KICAgIC8vICJpZiIgYW5kIGl0cyBjb25kaXRpb24pLgogICAgaWYgKGlkZW50aWNhbChpbmZvLCBjdXJyZW50QmxvY2tJbmZvcm1hdGlvbikpIHJldHVybiBmYWxzZTsKCiAgICBIQmxvY2tJbmZvcm1hdGlvbiBvbGRCbG9ja0luZm9ybWF0aW9uID0gY3VycmVudEJsb2NrSW5mb3JtYXRpb247CiAgICBjdXJyZW50QmxvY2tJbmZvcm1hdGlvbiA9IGluZm87CiAgICBib29sIHN1Y2Nlc3MgPSBpbmZvLmFjY2VwdCh0aGlzKTsKICAgIGN1cnJlbnRCbG9ja0luZm9ybWF0aW9uID0gb2xkQmxvY2tJbmZvcm1hdGlvbjsKCiAgICBpZiAoc3VjY2VzcykgewogICAgICBIQmFzaWNCbG9jayBjb250aW51YXRpb24gPSBibG9jay5jb250aW51YXRpb247CiAgICAgIGlmIChjb250aW51YXRpb24gIT0gbnVsbCkgewogICAgICAgIGNvbnRpbnVlU3ViR3JhcGgoY29udGludWF0aW9uKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1Y2Nlc3M7CiAgfQoKICB2b2lkIGVudGVyU3ViR3JhcGgoSEJhc2ljQmxvY2sgbm9kZSkgewogICAgYXNzZXJ0KGJsb2NrUXVldWUuaXNFbXB0eSk7CiAgICBhc3NlcnQobm9kZSAhPSBudWxsKTsKICAgIGNvbnRpbnVlU3ViR3JhcGgobm9kZSk7CiAgICB3aGlsZSAoYmxvY2tRdWV1ZS5pc05vdEVtcHR5KSB7CiAgICAgIG5vZGUgPSBibG9ja1F1ZXVlLnJlbW92ZUZpcnN0KCk7CiAgICAgIGFzc2VydChub2RlLmlzTGl2ZSk7CiAgICAgIGFzc2VydChzdWJHcmFwaC5jb250YWlucyhub2RlKSk7CgogICAgICAvLyBJZiB0aGlzIG5vZGUgaGFzIGJsb2NrLXN0cnVjdHVyZSBiYXNlZCBpbmZvcm1hdGlvbiBhdHRhY2hlZCwKICAgICAgLy8gdHJ5IHVzaW5nIHRoYXQgdG8gdHJhdmVyc2UgZnJvbSBoZXJlLgogICAgICBpZiAobm9kZS5ibG9ja0Zsb3cgIT0gbnVsbCAmJiBoYW5kbGVCbG9ja0Zsb3cobm9kZS5ibG9ja0Zsb3cpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIGl0ZXJhdGVCYXNpY0Jsb2NrKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCBjb250aW51ZVN1YkdyYXBoKEhCYXNpY0Jsb2NrIG5vZGUpIHsKICAgIGlmICghbm9kZS5pc0xpdmUpIHJldHVybjsKICAgIC8vIERvbid0IGZvbGxvdyBlZGdlcyBvdXQgb2YgdGhlIGN1cnJlbnQgc3ViLWdyYXBoLgogICAgaWYgKCFzdWJHcmFwaC5jb250YWlucyhub2RlKSkgcmV0dXJuOwogICAgYmxvY2tRdWV1ZS5hZGQobm9kZSk7CiAgfQoKICB2b2lkIGVtaXRBc3NpZ25tZW50KAogICAgICBTdHJpbmcgZGVzdGluYXRpb24sIFN0cmluZyBzb3VyY2UsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBhc3NpZ25WYXJpYWJsZShkZXN0aW5hdGlvbiwgbmV3IGpzLlZhcmlhYmxlVXNlKHNvdXJjZSksIHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIC8vLyBTZXF1ZW50aWFsaXplIGEgbGlzdCBvZiBjb25jZXB0dWFsbHkgcGFyYWxsZWwgY29waWVzLiBQYXJhbGxlbAogIC8vLyBjb3BpZXMgbWF5IGNvbnRhaW4gY3ljbGVzLCB0aGF0IHRoaXMgbWV0aG9kIGJyZWFrcy4KICB2b2lkIHNlcXVlbnRpYWxpemVDb3BpZXMoCiAgICAgIEl0ZXJhYmxlPENvcHk8SEluc3RydWN0aW9uPj4gaW5zdHJ1Y3Rpb25Db3BpZXMsCiAgICAgIFN0cmluZyB0ZW1wTmFtZSwKICAgICAgdm9pZCBkb0Fzc2lnbm1lbnQoCiAgICAgICAgICBTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgc291cmNlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikpIHsKICAgIE1hcDxTdHJpbmcsIFNvdXJjZUluZm9ybWF0aW9uPiBzb3VyY2VJbmZvcm1hdGlvbk1hcCA9CiAgICAgICAgPFN0cmluZywgU291cmNlSW5mb3JtYXRpb24+e307CgogICAgLy8gTWFwIHRoZSBpbnN0cnVjdGlvbnMgdG8gc3RyaW5ncy4KICAgIEl0ZXJhYmxlPENvcHk8U3RyaW5nPj4gY29waWVzID0KICAgICAgICBpbnN0cnVjdGlvbkNvcGllcy5tYXAoKENvcHk8SEluc3RydWN0aW9uPiBjb3B5KSB7CiAgICAgIFN0cmluZyBzb3VyY2VOYW1lID0gdmFyaWFibGVOYW1lcy5nZXROYW1lKGNvcHkuc291cmNlKTsKICAgICAgc291cmNlSW5mb3JtYXRpb25NYXBbc291cmNlTmFtZV0gPSBjb3B5LnNvdXJjZS5zb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgU3RyaW5nIGRlc3RpbmF0aW9uTmFtZSA9IHZhcmlhYmxlTmFtZXMuZ2V0TmFtZShjb3B5LmRlc3RpbmF0aW9uKTsKICAgICAgc291cmNlSW5mb3JtYXRpb25NYXBbc291cmNlTmFtZV0gPSBjb3B5LmRlc3RpbmF0aW9uLnNvdXJjZUluZm9ybWF0aW9uOwogICAgICByZXR1cm4gbmV3IENvcHk8U3RyaW5nPihzb3VyY2VOYW1lLCBkZXN0aW5hdGlvbk5hbWUpOwogICAgfSk7CgogICAgLy8gTWFwIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gKGllIHRoZSB2YXJpYWJsZSB0aGF0CiAgICAvLyBob2xkcyB0aGUgaW5pdGlhbCB2YWx1ZSkgb2YgYSB2YXJpYWJsZS4KICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gY3VycmVudExvY2F0aW9uID0gbmV3IE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKCiAgICAvLyBNYXAgdG8ga2VlcCB0cmFjayBvZiB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBhIHZhcmlhYmxlLgogICAgTWFwPFN0cmluZywgU3RyaW5nPiBpbml0aWFsVmFsdWUgPSBuZXcgTWFwPFN0cmluZywgU3RyaW5nPigpOwoKICAgIC8vIExpc3Qgb2YgdmFyaWFibGVzIHRvIGFzc2lnbiBhIHZhbHVlLgogICAgTGlzdDxTdHJpbmc+IHdvcmtsaXN0ID0gPFN0cmluZz5bXTsKCiAgICAvLyBMaXN0IG9mIHZhcmlhYmxlcyB0aGF0IHdlIGNhbiBhc3NpZ24gYSB2YWx1ZSB0byAoaWUgYXJlIG5vdAogICAgLy8gYmVpbmcgdXNlZCBhbnltb3JlKS4KICAgIExpc3Q8U3RyaW5nPiByZWFkeSA9IDxTdHJpbmc+W107CgogICAgLy8gUHJ1bmUgW2NvcGllc10gYnkgcmVtb3Zpbmcgc2VsZi1jb3BpZXMuCiAgICBMaXN0PENvcHk8U3RyaW5nPj4gcHJ1bmVkQ29waWVzID0gPENvcHk8U3RyaW5nPj5bXTsKICAgIGZvciAoQ29weTxTdHJpbmc+IGNvcHkgaW4gY29waWVzKSB7CiAgICAgIGlmIChjb3B5LnNvdXJjZSAhPSBjb3B5LmRlc3RpbmF0aW9uKSB7CiAgICAgICAgcHJ1bmVkQ29waWVzLmFkZChjb3B5KTsKICAgICAgfQogICAgfQogICAgY29waWVzID0gcHJ1bmVkQ29waWVzOwoKICAgIC8vIEZvciBlYWNoIGNvcHksIHNldCB0aGUgY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgc291cmNlIHRvCiAgICAvLyBpdHNlbGYsIGFuZCB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgZGVzdGluYXRpb24gdG8gdGhlIHNvdXJjZS4KICAgIC8vIEFkZCB0aGUgZGVzdGluYXRpb24gdG8gdGhlIGxpc3Qgb2YgY29waWVzIHRvIG1ha2UuCiAgICBmb3IgKENvcHk8U3RyaW5nPiBjb3B5IGluIGNvcGllcykgewogICAgICBjdXJyZW50TG9jYXRpb25bY29weS5zb3VyY2VdID0gY29weS5zb3VyY2U7CiAgICAgIGluaXRpYWxWYWx1ZVtjb3B5LmRlc3RpbmF0aW9uXSA9IGNvcHkuc291cmNlOwogICAgICB3b3JrbGlzdC5hZGQoY29weS5kZXN0aW5hdGlvbik7CiAgICB9CgogICAgLy8gRm9yIGVhY2ggY29weSwgaWYgdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90IGhhdmUgYSBjdXJyZW50CiAgICAvLyBsb2NhdGlvbiwgdGhlbiB3ZSBjYW4gc2FmZWx5IGFzc2lnbiB0byBpdC4KICAgIGZvciAoQ29weTxTdHJpbmc+IGNvcHkgaW4gY29waWVzKSB7CiAgICAgIGlmIChjdXJyZW50TG9jYXRpb25bY29weS5kZXN0aW5hdGlvbl0gPT0gbnVsbCkgewogICAgICAgIHJlYWR5LmFkZChjb3B5LmRlc3RpbmF0aW9uKTsKICAgICAgfQogICAgfQoKICAgIHdoaWxlICghd29ya2xpc3QuaXNFbXB0eSkgewogICAgICB3aGlsZSAoIXJlYWR5LmlzRW1wdHkpIHsKICAgICAgICBTdHJpbmcgZGVzdGluYXRpb24gPSByZWFkeS5yZW1vdmVMYXN0KCk7CiAgICAgICAgU3RyaW5nIHNvdXJjZSA9IGluaXRpYWxWYWx1ZVtkZXN0aW5hdGlvbl07CiAgICAgICAgLy8gU2luY2UgW3NvdXJjZV0gbWlnaHQgaGF2ZSBiZWVuIHVwZGF0ZWQsIHVzZSB0aGUgY3VycmVudAogICAgICAgIC8vIGxvY2F0aW9uIG9mIFtzb3VyY2VdCiAgICAgICAgU3RyaW5nIGNvcHkgPSBjdXJyZW50TG9jYXRpb25bc291cmNlXTsKICAgICAgICBkb0Fzc2lnbm1lbnQoZGVzdGluYXRpb24sIGNvcHksCiAgICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uTWFwW2NvcHldID8/IHNvdXJjZUluZm9ybWF0aW9uTWFwW2Rlc3RpbmF0aW9uXSk7CiAgICAgICAgLy8gTm93IFtkZXN0aW5hdGlvbl0gaXMgdGhlIGN1cnJlbnQgbG9jYXRpb24gb2YgW3NvdXJjZV0uCiAgICAgICAgY3VycmVudExvY2F0aW9uW3NvdXJjZV0gPSBkZXN0aW5hdGlvbjsKICAgICAgICAvLyBJZiBbc291cmNlXSBoYXNuJ3QgYmVlbiB1cGRhdGVkIGFuZCBuZWVkcyB0byBoYXZlIGEgdmFsdWUsCiAgICAgICAgLy8gYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHZhcmlhYmxlcyB0aGF0IGNhbiBiZSB1cGRhdGVkLiBDb3BpZXMKICAgICAgICAvLyBvZiBbc291cmNlXSB3aWxsIG5vdyB1c2UgW2Rlc3RpbmF0aW9uXS4KICAgICAgICBpZiAoc291cmNlID09IGNvcHkgJiYgaW5pdGlhbFZhbHVlW3NvdXJjZV0gIT0gbnVsbCkgewogICAgICAgICAgcmVhZHkuYWRkKHNvdXJjZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgY3ljbGUuCiAgICAgIFN0cmluZyBjdXJyZW50ID0gd29ya2xpc3QucmVtb3ZlTGFzdCgpOwogICAgICAvLyBJZiBbY3VycmVudF0gaXMgdXNlZCBhcyBhIHNvdXJjZSwgYW5kIHRoZSBhc3NpZ25tZW50IGhhcyBiZWVuCiAgICAgIC8vIGRvbmUsIHdlIGFyZSBkb25lIHdpdGggdGhpcyB2YXJpYWJsZS4gT3RoZXJ3aXNlIHRoZXJlIGlzIGEKICAgICAgLy8gY3ljbGUgdGhhdCB3ZSBicmVhayBieSB1c2luZyBhIHRlbXBvcmFyeSBuYW1lLgogICAgICBpZiAoY3VycmVudExvY2F0aW9uW2N1cnJlbnRdICE9IG51bGwgJiYKICAgICAgICAgIGN1cnJlbnQgIT0gY3VycmVudExvY2F0aW9uW2luaXRpYWxWYWx1ZVtjdXJyZW50XV0pIHsKICAgICAgICBkb0Fzc2lnbm1lbnQodGVtcE5hbWUsIGN1cnJlbnQsIHNvdXJjZUluZm9ybWF0aW9uTWFwW2N1cnJlbnRdKTsKICAgICAgICBjdXJyZW50TG9jYXRpb25bY3VycmVudF0gPSB0ZW1wTmFtZTsKICAgICAgICAvLyBbY3VycmVudF0gY2FuIG5vdyBiZSBzYWZlbHkgdXBkYXRlZC4gQ29waWVzIG9mIFtjdXJyZW50XQogICAgICAgIC8vIHdpbGwgbm93IHVzZSBbdGVtcE5hbWVdLgogICAgICAgIHJlYWR5LmFkZChjdXJyZW50KTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBhc3NpZ25QaGlzT2ZTdWNjZXNzb3JzKEhCYXNpY0Jsb2NrIG5vZGUpIHsKICAgIENvcHlIYW5kbGVyIGhhbmRsZXIgPSB2YXJpYWJsZU5hbWVzLmdldENvcHlIYW5kbGVyKG5vZGUpOwogICAgaWYgKGhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuOwoKICAgIHNlcXVlbnRpYWxpemVDb3BpZXMoCiAgICAgICAgaGFuZGxlci5jb3BpZXMsIHZhcmlhYmxlTmFtZXMuZ2V0U3dhcFRlbXAoKSwgZW1pdEFzc2lnbm1lbnQpOwoKICAgIGZvciAoQ29weTxISW5zdHJ1Y3Rpb24+IGNvcHkgaW4gaGFuZGxlci5hc3NpZ25tZW50cykgewogICAgICBTdHJpbmcgbmFtZSA9IHZhcmlhYmxlTmFtZXMuZ2V0TmFtZShjb3B5LmRlc3RpbmF0aW9uKTsKICAgICAgdXNlKGNvcHkuc291cmNlKTsKICAgICAgYXNzaWduVmFyaWFibGUobmFtZSwgcG9wKCksCiAgICAgICAgICBjb3B5LnNvdXJjZS5zb3VyY2VJbmZvcm1hdGlvbiA/PyBjb3B5LmRlc3RpbmF0aW9uLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICB9CgogIHZvaWQgaXRlcmF0ZUJhc2ljQmxvY2soSEJhc2ljQmxvY2sgbm9kZSkgewogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gbm9kZS5maXJzdDsKICAgIHdoaWxlICghaWRlbnRpY2FsKGluc3RydWN0aW9uLCBub2RlLmxhc3QpKSB7CiAgICAgIGlmICghaXNHZW5lcmF0ZUF0VXNlU2l0ZShpbnN0cnVjdGlvbikpIHsKICAgICAgICBkZWZpbmUoaW5zdHJ1Y3Rpb24pOwogICAgICB9CiAgICAgIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24ubmV4dDsKICAgIH0KICAgIGFzc2lnblBoaXNPZlN1Y2Nlc3NvcnMobm9kZSk7CiAgICB2aXNpdChpbnN0cnVjdGlvbik7CiAgfQoKICB2b2lkIGhhbmRsZUludm9rZUJpbmFyeSgKICAgICAgSEludm9rZUJpbmFyeSBub2RlLCBTdHJpbmcgb3AsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICB1c2Uobm9kZS5sZWZ0KTsKICAgIGpzLkV4cHJlc3Npb24ganNMZWZ0ID0gcG9wKCk7CiAgICB1c2Uobm9kZS5yaWdodCk7CiAgICBwdXNoKG5ldyBqcy5CaW5hcnkob3AsIGpzTGVmdCwgcG9wKCkpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMYXRlVmFsdWUoSExhdGVWYWx1ZSBub2RlKSB7CiAgICB1c2Uobm9kZS50YXJnZXQpOwogIH0KCiAgdmlzaXRJbnZva2VCaW5hcnkoSEludm9rZUJpbmFyeSBub2RlLCBTdHJpbmcgb3ApIHsKICAgIGhhbmRsZUludm9rZUJpbmFyeShub2RlLCBvcCwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICB2aXNpdFJlbGF0aW9uYWwoSFJlbGF0aW9uYWwgbm9kZSwgU3RyaW5nIG9wKSB7CiAgICBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgb3AsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgLy8gV2Ugd2FudCB0aGUgb3V0Y29tZSBvZiBiaXQtb3BlcmF0aW9ucyB0byBiZSBwb3NpdGl2ZS4gV2UgdXNlIHRoZSB1bnNpZ25lZAogIC8vIHNoaWZ0IG9wZXJhdG9yIHRvIGFjaGlldmUgdGhpcy4KICB2aXNpdEJpdEludm9rZUJpbmFyeShIQmluYXJ5Qml0T3Agbm9kZSwgU3RyaW5nIG9wKSB7CiAgICB2aXNpdEludm9rZUJpbmFyeShub2RlLCBvcCk7CiAgICBpZiAob3AgIT0gJz4+PicgJiYgcmVxdWlyZXNVaW50Q29udmVyc2lvbihub2RlKSkgewogICAgICBwdXNoKG5ldyBqcy5CaW5hcnkoIj4+PiIsIHBvcCgpLCBuZXcganMuTGl0ZXJhbE51bWJlcigiMCIpKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgfQoKICB2aXNpdEludm9rZVVuYXJ5KEhJbnZva2VVbmFyeSBub2RlLCBTdHJpbmcgb3ApIHsKICAgIHVzZShub2RlLm9wZXJhbmQpOwogICAgcHVzaCgKICAgICAgICBuZXcganMuUHJlZml4KG9wLCBwb3AoKSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIC8vIFdlIHdhbnQgdGhlIG91dGNvbWUgb2YgYml0LW9wZXJhdGlvbnMgdG8gYmUgcG9zaXRpdmUuIFdlIHVzZSB0aGUgdW5zaWduZWQKICAvLyBzaGlmdCBvcGVyYXRvciB0byBhY2hpZXZlIHRoaXMuCiAgdmlzaXRCaXRJbnZva2VVbmFyeShISW52b2tlVW5hcnkgbm9kZSwgU3RyaW5nIG9wKSB7CiAgICB2aXNpdEludm9rZVVuYXJ5KG5vZGUsIG9wKTsKICAgIGlmIChyZXF1aXJlc1VpbnRDb252ZXJzaW9uKG5vZGUpKSB7CiAgICAgIHB1c2gobmV3IGpzLkJpbmFyeSgiPj4+IiwgcG9wKCksIG5ldyBqcy5MaXRlcmFsTnVtYmVyKCIwIikpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIHZvaWQgZW1pdElkZW50aXR5Q29tcGFyaXNvbigKICAgICAgSElkZW50aXR5IGluc3RydWN0aW9uLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAge2Jvb2wgaW52ZXJzZTogZmFsc2V9KSB7CiAgICBTdHJpbmcgb3AgPSBpbnN0cnVjdGlvbi5zaW5nbGVDb21wYXJpc29uT3A7CiAgICBISW5zdHJ1Y3Rpb24gbGVmdCA9IGluc3RydWN0aW9uLmxlZnQ7CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBpbnN0cnVjdGlvbi5yaWdodDsKICAgIGlmIChvcCAhPSBudWxsKSB7CiAgICAgIHVzZShsZWZ0KTsKICAgICAganMuRXhwcmVzc2lvbiBqc0xlZnQgPSBwb3AoKTsKICAgICAgdXNlKHJpZ2h0KTsKICAgICAgcHVzaChuZXcganMuQmluYXJ5KG1hcFJlbGF0aW9uYWxPcGVyYXRvcihvcCwgaW52ZXJzZSksIGpzTGVmdCwgcG9wKCkpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoTnVsbENvbnN0YW50VmFsdWUuSnNOdWxsID09ICdudWxsJyk7CiAgICAgIHVzZShsZWZ0KTsKICAgICAganMuQmluYXJ5IGxlZnRFcXVhbHNOdWxsID0KICAgICAgICAgIG5ldyBqcy5CaW5hcnkoIj09IiwgcG9wKCksIG5ldyBqcy5MaXRlcmFsTnVsbCgpKTsKICAgICAgdXNlKHJpZ2h0KTsKICAgICAganMuQmluYXJ5IHJpZ2h0RXF1YWxzTnVsbCA9IG5ldyBqcy5CaW5hcnkoCiAgICAgICAgICBtYXBSZWxhdGlvbmFsT3BlcmF0b3IoIj09IiwgaW52ZXJzZSksIHBvcCgpLCBuZXcganMuTGl0ZXJhbE51bGwoKSk7CiAgICAgIHVzZShyaWdodCk7CiAgICAgIHVzZShsZWZ0KTsKICAgICAganMuQmluYXJ5IHRyaXBsZUVxID0KICAgICAgICAgIG5ldyBqcy5CaW5hcnkobWFwUmVsYXRpb25hbE9wZXJhdG9yKCI9PT0iLCBpbnZlcnNlKSwgcG9wKCksIHBvcCgpKTsKCiAgICAgIHB1c2gobmV3IGpzLkNvbmRpdGlvbmFsKGxlZnRFcXVhbHNOdWxsLCByaWdodEVxdWFsc051bGwsIHRyaXBsZUVxKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJZGVudGl0eShISWRlbnRpdHkgbm9kZSkgewogICAgZW1pdElkZW50aXR5Q29tcGFyaXNvbihub2RlLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uLCBpbnZlcnNlOiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEFkZChIQWRkIG5vZGUpID0+IHZpc2l0SW52b2tlQmluYXJ5KG5vZGUsICcrJyk7CiAgQG92ZXJyaWRlCiAgdmlzaXREaXZpZGUoSERpdmlkZSBub2RlKSA9PiB2aXNpdEludm9rZUJpbmFyeShub2RlLCAnLycpOwogIEBvdmVycmlkZQogIHZpc2l0TXVsdGlwbHkoSE11bHRpcGx5IG5vZGUpID0+IHZpc2l0SW52b2tlQmluYXJ5KG5vZGUsICcqJyk7CiAgQG92ZXJyaWRlCiAgdmlzaXRTdWJ0cmFjdChIU3VidHJhY3Qgbm9kZSkgPT4gdmlzaXRJbnZva2VCaW5hcnkobm9kZSwgJy0nKTsKICBAb3ZlcnJpZGUKICB2aXNpdEJpdEFuZChIQml0QW5kIG5vZGUpID0+IHZpc2l0Qml0SW52b2tlQmluYXJ5KG5vZGUsICcmJyk7CiAgQG92ZXJyaWRlCiAgdmlzaXRCaXROb3QoSEJpdE5vdCBub2RlKSA9PiB2aXNpdEJpdEludm9rZVVuYXJ5KG5vZGUsICd+Jyk7CiAgQG92ZXJyaWRlCiAgdmlzaXRCaXRPcihIQml0T3Igbm9kZSkgPT4gdmlzaXRCaXRJbnZva2VCaW5hcnkobm9kZSwgJ3wnKTsKICBAb3ZlcnJpZGUKICB2aXNpdEJpdFhvcihIQml0WG9yIG5vZGUpID0+IHZpc2l0Qml0SW52b2tlQmluYXJ5KG5vZGUsICdeJyk7CiAgQG92ZXJyaWRlCiAgdmlzaXRTaGlmdExlZnQoSFNoaWZ0TGVmdCBub2RlKSA9PiB2aXNpdEJpdEludm9rZUJpbmFyeShub2RlLCAnPDwnKTsKICBAb3ZlcnJpZGUKICB2aXNpdFNoaWZ0UmlnaHQoSFNoaWZ0UmlnaHQgbm9kZSkgPT4gdmlzaXRCaXRJbnZva2VCaW5hcnkobm9kZSwgJz4+PicpOwoKICBAb3ZlcnJpZGUKICB2aXNpdFRydW5jYXRpbmdEaXZpZGUoSFRydW5jYXRpbmdEaXZpZGUgbm9kZSkgewogICAgYXNzZXJ0KG5vZGUuaXNVSW50MzEoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpOwogICAgLy8gVE9ETyhrYXJsa2xvc2UpOiBFbmFibGUgdGhpcyBhc3NlcnRpb24gYWdhaW4gd2hlbiB0eXBlIHByb3BhZ2F0aW9uIGlzCiAgICAvLyBmaXhlZC4gSXNzdWUgMjM1NTUuCi8vICAgIGFzc2VydChub2RlLmxlZnQuaXNVSW50MzIoY29tcGlsZXIpKTsKICAgIGFzc2VydChub2RlLnJpZ2h0LmlzUG9zaXRpdmVJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKTsKICAgIHVzZShub2RlLmxlZnQpOwogICAganMuRXhwcmVzc2lvbiBqc0xlZnQgPSBwb3AoKTsKICAgIHVzZShub2RlLnJpZ2h0KTsKICAgIHB1c2gobmV3IGpzLkJpbmFyeSgnLycsIGpzTGVmdCwgcG9wKCkpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICBwdXNoKG5ldyBqcy5CaW5hcnkoJ3wnLCBwb3AoKSwgbmV3IGpzLkxpdGVyYWxOdW1iZXIoIjAiKSkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0UmVtYWluZGVyKEhSZW1haW5kZXIgbm9kZSkgewogICAgcmV0dXJuIHZpc2l0SW52b2tlQmluYXJ5KG5vZGUsICclJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdE5lZ2F0ZShITmVnYXRlIG5vZGUpID0+IHZpc2l0SW52b2tlVW5hcnkobm9kZSwgJy0nKTsKCiAgQG92ZXJyaWRlCiAgdmlzaXRBYnMoSEFicyBub2RlKSB7CiAgICB1c2Uobm9kZS5vcGVyYW5kKTsKICAgIHB1c2goanMKICAgICAgICAuanMoJ01hdGguYWJzKCMpJywgcG9wKCkpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExlc3MoSExlc3Mgbm9kZSkgPT4gdmlzaXRSZWxhdGlvbmFsKG5vZGUsICc8Jyk7CiAgQG92ZXJyaWRlCiAgdmlzaXRMZXNzRXF1YWwoSExlc3NFcXVhbCBub2RlKSA9PiB2aXNpdFJlbGF0aW9uYWwobm9kZSwgJzw9Jyk7CiAgQG92ZXJyaWRlCiAgdmlzaXRHcmVhdGVyKEhHcmVhdGVyIG5vZGUpID0+IHZpc2l0UmVsYXRpb25hbChub2RlLCAnPicpOwogIEBvdmVycmlkZQogIHZpc2l0R3JlYXRlckVxdWFsKEhHcmVhdGVyRXF1YWwgbm9kZSkgPT4gdmlzaXRSZWxhdGlvbmFsKG5vZGUsICc+PScpOwoKICBAb3ZlcnJpZGUKICB2aXNpdEV4aXQoSEV4aXQgbm9kZSkgewogICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcuCiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEdvdG8oSEdvdG8gbm9kZSkgewogICAgSEJhc2ljQmxvY2sgYmxvY2sgPSBub2RlLmJsb2NrOwogICAgYXNzZXJ0KGJsb2NrLnN1Y2Nlc3NvcnMubGVuZ3RoID09IDEpOwogICAgTGlzdDxIQmFzaWNCbG9jaz4gZG9taW5hdGVkID0gYmxvY2suZG9taW5hdGVkQmxvY2tzOwogICAgLy8gV2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBlbnRyeS1ub2RlIHdoaWNoIGRvbWluYXRlcyBpdHMgc3VjY2Vzc29yCiAgICAvLyBhbmQgdGhlIGV4aXQgbm9kZSwgbm8gYmxvY2sgZmluaXNoaW5nIHdpdGggYSAnZ290bycgY2FuIGhhdmUgbW9yZSB0aGFuCiAgICAvLyBvbmUgZG9taW5hdGVkIGJsb2NrIChzaW5jZSBpdCBoYXMgb25seSBvbmUgc3VjY2Vzc29yKS4KICAgIC8vIElmIHRoZSBzdWNjZXNzb3IgaXMgZG9taW5hdGVkIGJ5IGFub3RoZXIgYmxvY2ssIHRoZW4gdGhlIG90aGVyIGJsb2NrCiAgICAvLyBpcyByZXNwb25zaWJsZSBmb3IgdmlzaXRpbmcgdGhlIHN1Y2Nlc3Nvci4KICAgIGlmIChkb21pbmF0ZWQuaXNFbXB0eSkgcmV0dXJuOwogICAgaWYgKGRvbWluYXRlZC5sZW5ndGggPiAyKSB7CiAgICAgIGZhaWxlZEF0KG5vZGUsICdkb21pbmF0ZWQubGVuZ3RoID0gJHtkb21pbmF0ZWQubGVuZ3RofScpOwogICAgfQogICAgaWYgKGRvbWluYXRlZC5sZW5ndGggPT0gMiAmJiBibG9jayAhPSBjdXJyZW50R3JhcGguZW50cnkpIHsKICAgICAgZmFpbGVkQXQobm9kZSwgJ25vZGUuYmxvY2sgIT0gY3VycmVudEdyYXBoLmVudHJ5Jyk7CiAgICB9CiAgICBhc3NlcnQoZG9taW5hdGVkWzBdID09IGJsb2NrLnN1Y2Nlc3NvcnNbMF0pOwogICAgY29udGludWVTdWJHcmFwaChkb21pbmF0ZWQuZmlyc3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMb29wQnJhbmNoKEhMb29wQnJhbmNoIG5vZGUpIHsKICAgIGFzc2VydChub2RlLmJsb2NrID09IHN1YkdyYXBoLmVuZCk7CiAgICAvLyBXZSBhcmUgZ2VuZXJhdGluZyBjb2RlIGZvciBhIGxvb3AgY29uZGl0aW9uLgogICAgLy8gSWYgd2UgYXJlIGdlbmVyYXRpbmcgdGhlIHN1YmdyYXBoIGFzIGFuIGV4cHJlc3Npb24sIHRoZQogICAgLy8gY29uZGl0aW9uIHdpbGwgYmUgZ2VuZXJhdGVkIGFzIHRoZSBleHByZXNzaW9uLgogICAgLy8gT3RoZXJ3aXNlLCB3ZSBkb24ndCBnZW5lcmF0ZSB0aGUgZXhwcmVzc2lvbiwgYW5kIGxlYXZlIHRoYXQKICAgIC8vIHRvIHRoZSBjb2RlIHRoYXQgY2FsbGVkIFt2aXNpdFN1YkdyYXBoXS4KICAgIGlmIChpc0dlbmVyYXRpbmdFeHByZXNzaW9uKSB7CiAgICAgIHVzZShub2RlLmlucHV0c1swXSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJyZWFrKEhCcmVhayBub2RlKSB7CiAgICBhc3NlcnQobm9kZS5ibG9jay5zdWNjZXNzb3JzLmxlbmd0aCA9PSAxKTsKICAgIGlmIChub2RlLmxhYmVsICE9IG51bGwpIHsKICAgICAgTGFiZWxEZWZpbml0aW9uIGxhYmVsID0gbm9kZS5sYWJlbDsKICAgICAgaWYgKGJyZWFrQWN0aW9uLmNvbnRhaW5zKGxhYmVsLnRhcmdldCkpIHsKICAgICAgICBpbXBsaWNpdEJyZWFrV2l0aExhYmVsKGxhYmVsLnRhcmdldCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaFN0YXRlbWVudChuZXcganMuQnJlYWsoX25hbWVyLmJyZWFrTGFiZWxOYW1lKGxhYmVsKSkKICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICAgIGlmIChicmVha0FjdGlvbi5jb250YWlucyh0YXJnZXQpKSB7CiAgICAgICAgaW1wbGljaXRCcmVha1dpdGhMYWJlbCh0YXJnZXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChub2RlLmJyZWFrU3dpdGNoQ29udGludWVMb29wKSB7CiAgICAgICAgICBwdXNoU3RhdGVtZW50KG5ldyBqcy5CcmVhayhfbmFtZXIuaW1wbGljaXRDb250aW51ZUxhYmVsTmFtZSh0YXJnZXQpKQogICAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwdXNoU3RhdGVtZW50KAogICAgICAgICAgICAgIG5ldyBqcy5CcmVhayhudWxsKS53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDb250aW51ZShIQ29udGludWUgbm9kZSkgewogICAgYXNzZXJ0KG5vZGUuYmxvY2suc3VjY2Vzc29ycy5sZW5ndGggPT0gMSk7CiAgICBpZiAobm9kZS5sYWJlbCAhPSBudWxsKSB7CiAgICAgIExhYmVsRGVmaW5pdGlvbiBsYWJlbCA9IG5vZGUubGFiZWw7CiAgICAgIGlmIChjb250aW51ZUFjdGlvbi5jb250YWlucyhsYWJlbCkpIHsKICAgICAgICBjb250aW51ZUFzQnJlYWsobGFiZWwpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBzaG91bGQgdGhpcyByZWFsbHkgYmUgdGhlIGJyZWFrTGFiZWxOYW1lPwogICAgICAgIHB1c2hTdGF0ZW1lbnQobmV3IGpzLkNvbnRpbnVlKF9uYW1lci5icmVha0xhYmVsTmFtZShsYWJlbCkpCiAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgICBpZiAoaW1wbGljaXRDb250aW51ZUFjdGlvbi5jb250YWlucyh0YXJnZXQpKSB7CiAgICAgICAgaW1wbGljaXRDb250aW51ZUFzQnJlYWsodGFyZ2V0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAodGFyZ2V0LmlzU3dpdGNoKSB7CiAgICAgICAgICBwdXNoU3RhdGVtZW50KAogICAgICAgICAgICAgIG5ldyBqcy5Db250aW51ZShfbmFtZXIuaW1wbGljaXRDb250aW51ZUxhYmVsTmFtZSh0YXJnZXQpKQogICAgICAgICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHVzaFN0YXRlbWVudChuZXcganMuQ29udGludWUobnVsbCkKICAgICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0RXhpdFRyeShIRXhpdFRyeSBub2RlKSB7CiAgICAvLyBBbiBbSEV4aXRUcnldIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb250cm9sIGZsb3cgZ3JhcGggb2YgYQogICAgLy8gdHJ5L2NhdGNoIGJsb2NrLCBpZSB0aGUgdHJ5IGJvZHkgaXMgYWx3YXlzIGEgcHJlZGVjZXNzb3IKICAgIC8vIG9mIHRoZSBjYXRjaCBhbmQgZmluYWxseS4gSGVyZSwgd2UgY29udGludWUgdmlzaXRpbmcgdGhlIHRyeQogICAgLy8gYm9keSBieSB2aXNpdGluZyB0aGUgYmxvY2sgdGhhdCBjb250YWlucyB0aGUgdXNlci1sZXZlbCBjb250cm9sCiAgICAvLyBmbG93IGluc3RydWN0aW9uLgogICAgY29udGludWVTdWJHcmFwaChub2RlLmJvZHlUcnlTdWNjZXNzb3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUcnkoSFRyeSBub2RlKSB7CiAgICAvLyBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuIFRyeS9jYXRjaC9maW5hbGx5IGlzIGFsd2F5cyBoYW5kbGVkIHVzaW5nIGJsb2NrCiAgICAvLyBpbmZvcm1hdGlvbiBpbiBbdmlzaXRUcnlJbmZvXS4KICAgIGZhaWxlZEF0KG5vZGUsICd2aXNpdFRyeSBzaG91bGQgbm90IGJlIGNhbGxlZC4nKTsKICB9CgogIGJvb2wgdHJ5Q29udHJvbEZsb3dPcGVyYXRpb24oSElmIG5vZGUpIHsKICAgIGlmICghY29udHJvbEZsb3dPcGVyYXRvcnMuY29udGFpbnMobm9kZSkpIHJldHVybiBmYWxzZTsKICAgIEhQaGkgcGhpID0gbm9kZS5qb2luQmxvY2sucGhpcy5maXJzdDsKICAgIGJvb2wgYXRVc2VTaXRlID0gaXNHZW5lcmF0ZUF0VXNlU2l0ZShwaGkpOwogICAgLy8gRG9uJ3QgZ2VuZXJhdGUgYSBjb25kaXRpb25hbCBvcGVyYXRvciBpbiB0aGlzIHNpdHVhdGlvbjoKICAgIC8vIGkgPSBjb25kaXRpb24gPyBiYXIoKSA6IGk7CiAgICAvLyBCdXQgZ2VuZXJhdGUgdGhpcyBpbnN0ZWFkOgogICAgLy8gaWYgKGNvbmRpdGlvbikgaSA9IGJhcigpOwogICAgLy8gVXN1YWxseSwgdGhlIHZhcmlhYmxlIG5hbWUgaXMgbG9uZ2VyIHRoYW4gJ2lmJyBhbmQgaXQgdGFrZXMgdXAKICAgIC8vIG1vcmUgc3BhY2UgdG8gZHVwbGljYXRlIHRoZSBuYW1lLgogICAgaWYgKCFhdFVzZVNpdGUgJiYKICAgICAgICB2YXJpYWJsZU5hbWVzLmdldE5hbWUocGhpKSA9PSB2YXJpYWJsZU5hbWVzLmdldE5hbWUocGhpLmlucHV0c1sxXSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKCFhdFVzZVNpdGUpIGRlZmluZShwaGkpOwogICAgY29udGludWVTdWJHcmFwaChub2RlLmpvaW5CbG9jayk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgZ2VuZXJhdGVJZihISWYgbm9kZSwgSElmQmxvY2tJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBIU3RhdGVtZW50SW5mb3JtYXRpb24gdGhlbkdyYXBoID0gaW5mby50aGVuR3JhcGg7CiAgICBIU3RhdGVtZW50SW5mb3JtYXRpb24gZWxzZUdyYXBoID0gaW5mby5lbHNlR3JhcGg7CiAgICBISW5zdHJ1Y3Rpb24gY29uZGl0aW9uID0gbm9kZS5pbnB1dHMuc2luZ2xlOwoKICAgIGpzLkV4cHJlc3Npb24gdGVzdDsKICAgIGpzLlN0YXRlbWVudCB0aGVuUGFydDsKICAgIGpzLlN0YXRlbWVudCBlbHNlUGFydDsKCiAgICBIQmFzaWNCbG9jayB0aGVuQmxvY2sgPSBub2RlLmJsb2NrLnN1Y2Nlc3NvcnNbMF07CiAgICAvLyBJZiB3ZSBiZWxpZXZlIHdlIHdpbGwgZ2VuZXJhdGUgUzEgYXMgZW1wdHksIGluc3RlYWQgb2YKICAgIC8vCiAgICAvLyAgICAgaWYgKGUpIFMxOyBlbHNlIFMyOwogICAgLy8KICAgIC8vIHRyeSB0byBnZW5lcmF0ZQogICAgLy8KICAgIC8vICAgICBpZiAoIWUpIFMyOyBlbHNlIFMxOwogICAgLy8KICAgIC8vIEl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBgIWVgIHJhdGhlciB0aGFuIHRyeSBhbmQgbmVnYXRlIGl0IGxhdGVyLgogICAgLy8gUmVjb2duaXplIGEgc2luZ2xlIHRoZW4tYmxvY2sgd2l0aCBubyBjb2RlIGFuZCBubyBjb250cm9sbGVkIHBoaXMuCiAgICBpZiAoaXNHZW5lcmF0ZUF0VXNlU2l0ZShjb25kaXRpb24pICYmCiAgICAgICAgdGhlbkJsb2NrLnN1Y2Nlc3NvcnMubGVuZ3RoID09IDEgJiYKICAgICAgICB0aGVuQmxvY2suc3VjY2Vzc29ycy5zaW5nbGUgPT0gbm9kZS5qb2luQmxvY2sgJiYKICAgICAgICBub2RlLmpvaW5CbG9jay5waGlzLmlzRW1wdHkgJiYKICAgICAgICB0aGVuQmxvY2suZmlyc3QgaXMgSEdvdG8pIHsKICAgICAgZ2VuZXJhdGVOb3QoY29uZGl0aW9uLCBjb25kaXRpb24uc291cmNlSW5mb3JtYXRpb24pOwogICAgICB0ZXN0ID0gcG9wKCk7CiAgICAgIC8vIFN3YXAgYnJhbmNoZXMgYnV0IHZpc2l0IGluIHNhbWUgb3JkZXIgYXMgcmVnaXN0ZXIgYWxsb2NhdG9yLgogICAgICBlbHNlUGFydCA9IHVud3JhcFN0YXRlbWVudChnZW5lcmF0ZVN0YXRlbWVudHNJbk5ld0Jsb2NrKHRoZW5HcmFwaCkpOwogICAgICB0aGVuUGFydCA9IHVud3JhcFN0YXRlbWVudChnZW5lcmF0ZVN0YXRlbWVudHNJbk5ld0Jsb2NrKGVsc2VHcmFwaCkpOwogICAgICBhc3NlcnQoZWxzZVBhcnQgaXMganMuRW1wdHlTdGF0ZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgdXNlKGNvbmRpdGlvbik7CiAgICAgIHRlc3QgPSBwb3AoKTsKICAgICAgdGhlblBhcnQgPSB1bndyYXBTdGF0ZW1lbnQoZ2VuZXJhdGVTdGF0ZW1lbnRzSW5OZXdCbG9jayh0aGVuR3JhcGgpKTsKICAgICAgZWxzZVBhcnQgPSB1bndyYXBTdGF0ZW1lbnQoZ2VuZXJhdGVTdGF0ZW1lbnRzSW5OZXdCbG9jayhlbHNlR3JhcGgpKTsKICAgIH0KCiAgICBqcy5TdGF0ZW1lbnQgY29kZSA9IF9hc3NlbWJsZUlmVGhlbkVsc2UodGVzdCwgdGhlblBhcnQsIGVsc2VQYXJ0KTsKICAgIHB1c2hTdGF0ZW1lbnQoY29kZS53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAganMuU3RhdGVtZW50IF9hc3NlbWJsZUlmVGhlbkVsc2UoCiAgICAgIGpzLkV4cHJlc3Npb24gdGVzdCwganMuU3RhdGVtZW50IHRoZW5QYXJ0LCBqcy5TdGF0ZW1lbnQgZWxzZVBhcnQpIHsKICAgIC8vIFBlZXBob2xlIHJld3JpdGVzOgogICAgLy8KICAgIC8vICAgICBpZiAoZSk7IGVsc2UgUzsgICAtLT4gICBpZiAoIWUpIFM7CiAgICAvLwogICAgLy8gICAgIGlmIChlKTsgICAtLT4gICBlOwogICAgLy8KICAgIC8vIFRPRE8oc3JhKTogV2UgbWlnaHQgYmUgYWJsZSB0byBkbyBiZXR0ZXIgd2l0aCByZXNoYXBpbmcgdGhlIENGRy4KICAgIGlmICh0aGVuUGFydCBpcyBqcy5FbXB0eVN0YXRlbWVudCkgewogICAgICBpZiAoZWxzZVBhcnQgaXMganMuRW1wdHlTdGF0ZW1lbnQpIHsKICAgICAgICByZXR1cm4ganMuRXhwcmVzc2lvblN0YXRlbWVudCh0ZXN0KTsKICAgICAgfQogICAgICB0ZXN0ID0ganMuUHJlZml4KCchJywgdGVzdCk7CiAgICAgIHZhciB0ZW1wID0gdGhlblBhcnQ7CiAgICAgIHRoZW5QYXJ0ID0gZWxzZVBhcnQ7CiAgICAgIGVsc2VQYXJ0ID0gdGVtcDsKICAgIH0KCiAgICBpZiAoX29wdGlvbnMuZXhwZXJpbWVudFRvQm9vbGVhbikgewogICAgICBpZiAoZWxzZVBhcnQgaXMganMuRW1wdHlTdGF0ZW1lbnQgJiYKICAgICAgICAgIHRoZW5QYXJ0IGlzIGpzLkV4cHJlc3Npb25TdGF0ZW1lbnQgJiYKICAgICAgICAgIHRoZW5QYXJ0LmV4cHJlc3Npb24gaXMganMuQ2FsbCkgewogICAgICAgIHJldHVybiBqcy5FeHByZXNzaW9uU3RhdGVtZW50KAogICAgICAgICAgICBqcy5CaW5hcnkoJyYmJywgdGVzdCwgdGhlblBhcnQuZXhwcmVzc2lvbikpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGpzLklmKHRlc3QsIHRoZW5QYXJ0LCBlbHNlUGFydCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdElmKEhJZiBub2RlKSB7CiAgICBpZiAodHJ5Q29udHJvbEZsb3dPcGVyYXRpb24obm9kZSkpIHJldHVybjsKCiAgICBISW5zdHJ1Y3Rpb24gY29uZGl0aW9uID0gbm9kZS5pbnB1dHNbMF07CiAgICBISWZCbG9ja0luZm9ybWF0aW9uIGluZm8gPSBub2RlLmJsb2NrSW5mb3JtYXRpb24uYm9keTsKCiAgICBpZiAoY29uZGl0aW9uLmlzQ29uc3RhbnQoKSkgewogICAgICBIQ29uc3RhbnQgY29uc3RhbnQgPSBjb25kaXRpb247CiAgICAgIGlmIChjb25zdGFudC5jb25zdGFudC5pc1RydWUpIHsKICAgICAgICBnZW5lcmF0ZVN0YXRlbWVudHMoaW5mby50aGVuR3JhcGgpOwogICAgICB9IGVsc2UgewogICAgICAgIGdlbmVyYXRlU3RhdGVtZW50cyhpbmZvLmVsc2VHcmFwaCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGdlbmVyYXRlSWYobm9kZSwgaW5mbyk7CiAgICB9CgogICAgSEJhc2ljQmxvY2sgam9pbkJsb2NrID0gbm9kZS5qb2luQmxvY2s7CiAgICBpZiAoam9pbkJsb2NrICE9IG51bGwgJiYgIWlkZW50aWNhbChqb2luQmxvY2suZG9taW5hdG9yLCBub2RlLmJsb2NrKSkgewogICAgICAvLyBUaGUgam9pbiBibG9jayBpcyBkb21pbmF0ZWQgYnkgYSBibG9jayBpbiBvbmUgb2YgdGhlIGJyYW5jaGVzLgogICAgICAvLyBUaGUgc3ViZ3JhcGggdHJhdmVyc2FsIG5ldmVyIHJlYWNoZWQgaXQsIHNvIHdlIHZpc2l0IGl0IGhlcmUKICAgICAgLy8gaW5zdGVhZC4KICAgICAgY29udGludWVTdWJHcmFwaChqb2luQmxvY2spOwogICAgfQoKICAgIC8vIFZpc2l0IGFsbCB0aGUgZG9taW5hdGVkIGJsb2NrcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgdGhlbiBvciBlbHNlCiAgICAvLyBicmFuY2hlcywgYW5kIGlzIG5vdCB0aGUgam9pbiBibG9jay4KICAgIC8vIERlcGVuZGluZyBvbiBob3cgdGhlIHRoZW4vZWxzZSBicmFuY2hlcyB0ZXJtaW5hdGUKICAgIC8vIChlLmcuLCByZXR1cm4vdGhyb3cvYnJlYWspIHRoZXJlIGNhbiBiZSBhbnkgbnVtYmVyIG9mIHRoZXNlLgogICAgTGlzdDxIQmFzaWNCbG9jaz4gZG9taW5hdGVkID0gbm9kZS5ibG9jay5kb21pbmF0ZWRCbG9ja3M7CiAgICBmb3IgKGludCBpID0gMjsgaSA8IGRvbWluYXRlZC5sZW5ndGg7IGkrKykgewogICAgICBjb250aW51ZVN1YkdyYXBoKGRvbWluYXRlZFtpXSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50ZXJjZXB0b3IoSEludGVyY2VwdG9yIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uZGl0aW9uYWxDb25zdGFudEludGVyY2VwdG9yKSB7CiAgICAgIGFzc2VydChub2RlLmlucHV0cy5sZW5ndGggPT0gMik7CiAgICAgIHVzZShub2RlLnJlY2VpdmVyKTsKICAgICAganMuRXhwcmVzc2lvbiByZWNlaXZlckV4cHJlc3Npb24gPSBwb3AoKTsKICAgICAgdXNlKG5vZGUuY29uZGl0aW9uYWxDb25zdGFudEludGVyY2VwdG9yKTsKICAgICAganMuRXhwcmVzc2lvbiBjb25zdGFudCA9IHBvcCgpOwogICAgICBwdXNoKGpzLmpzKCcjICYmICMnLCBbcmVjZWl2ZXJFeHByZXNzaW9uLCBjb25zdGFudF0pKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChub2RlLmlucHV0cy5sZW5ndGggPT0gMSk7CiAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclNwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3Iobm9kZS5pbnRlcmNlcHRlZENsYXNzZXMpOwogICAgICBqcy5OYW1lIG5hbWUgPSBfbmFtZXIubmFtZUZvckdldEludGVyY2VwdG9yKG5vZGUuaW50ZXJjZXB0ZWRDbGFzc2VzKTsKICAgICAganMuRXhwcmVzc2lvbiBpc29sYXRlID0gX25hbWVyCiAgICAgICAgICAucmVhZEdsb2JhbE9iamVjdEZvckxpYnJhcnkoX2NvbW1vbkVsZW1lbnRzLmludGVyY2VwdG9yc0xpYnJhcnkpOwogICAgICB1c2Uobm9kZS5yZWNlaXZlcik7CiAgICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gYXJndW1lbnRzID0gPGpzLkV4cHJlc3Npb24+W3BvcCgpXTsKICAgICAgcHVzaChqcwogICAgICAgICAgLnByb3BlcnR5Q2FsbChpc29sYXRlLCBuYW1lLCBhcmd1bWVudHMpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyVXNlSW50ZXJjZXB0b3IoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0SW52b2tlRHluYW1pY01ldGhvZChISW52b2tlRHluYW1pY01ldGhvZCBub2RlKSB7CiAgICB1c2Uobm9kZS5yZWNlaXZlcik7CiAgICBqcy5FeHByZXNzaW9uIG9iamVjdCA9IHBvcCgpOwogICAgU3RyaW5nIG1ldGhvZE5hbWU7CiAgICBMaXN0PGpzLkV4cHJlc3Npb24+IGFyZ3VtZW50cyA9IHZpc2l0QXJndW1lbnRzKG5vZGUuaW5wdXRzKTsKICAgIE1lbWJlckVudGl0eSB0YXJnZXQgPSBub2RlLmVsZW1lbnQ7CgogICAgLy8gVE9ETyhoZXJodXQpOiBUaGUgbmFtZXIgc2hvdWxkIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgYmFja2VuZG5hbWUgaGVyZS4KICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiAhbm9kZS5pc0ludGVyY2VwdGVkQ2FsbCkgewogICAgICBpZiAodGFyZ2V0ID09IF9jb21tb25FbGVtZW50cy5qc0FycmF5QWRkKSB7CiAgICAgICAgbWV0aG9kTmFtZSA9ICdwdXNoJzsKICAgICAgfSBlbHNlIGlmICh0YXJnZXQgPT0gX2NvbW1vbkVsZW1lbnRzLmpzQXJyYXlSZW1vdmVMYXN0KSB7CiAgICAgICAgbWV0aG9kTmFtZSA9ICdwb3AnOwogICAgICB9IGVsc2UgaWYgKF9jb21tb25FbGVtZW50cy5pc0pzU3RyaW5nU3BsaXQodGFyZ2V0KSkgewogICAgICAgIG1ldGhvZE5hbWUgPSAnc3BsaXQnOwogICAgICAgIC8vIFNwbGl0IHJldHVybnMgYSBMaXN0LCBzbyB3ZSBtYWtlIHN1cmUgdGhlIGJhY2tlbmQga25vd3MgdGhlCiAgICAgICAgLy8gbGlzdCBjbGFzcyBpcyBpbnN0YW50aWF0ZWQuCiAgICAgICAgX3JlZ2lzdHJ5CiAgICAgICAgICAgIC8vIGlnbm9yZTpkZXByZWNhdGVkX21lbWJlcl91c2VfZnJvbV9zYW1lX3BhY2thZ2UKICAgICAgICAgICAgLnJlZ2lzdGVySW5zdGFudGlhdGVkQ2xhc3MoX2NvbW1vbkVsZW1lbnRzLmxpc3RDbGFzcyk7CiAgICAgIH0gZWxzZSBpZiAoX25hdGl2ZURhdGEuaXNOYXRpdmVNZW1iZXIodGFyZ2V0KSAmJgogICAgICAgICAgdGFyZ2V0LmlzRnVuY3Rpb24gJiYKICAgICAgICAgICFub2RlLmlzSW50ZXJjZXB0ZWRDYWxsKSB7CiAgICAgICAgLy8gQSBkaXJlY3QgKGkuZS4gbm9uLWludGVyY2VwdG9yKSBuYXRpdmUgY2FsbCBpcyB0aGUgcmVzdWx0IG9mCiAgICAgICAgLy8gb3B0aW1pemF0aW9uLiAgVGhlIG9wdGltaXphdGlvbiBlbnN1cmVzIGFueSB0eXBlIGNoZWNrcyBvcgogICAgICAgIC8vIGNvbnZlcnNpb25zIGhhdmUgYmVlbiBzYXRpc2ZpZWQuCiAgICAgICAgbWV0aG9kTmFtZSA9IF9uYXRpdmVEYXRhLmdldEZpeGVkQmFja2VuZE5hbWUodGFyZ2V0KTsKICAgICAgfQogICAgfQoKICAgIGpzLk5hbWUgbWV0aG9kTGl0ZXJhbDsKICAgIGlmIChtZXRob2ROYW1lID09IG51bGwpIHsKICAgICAgbWV0aG9kTGl0ZXJhbCA9IF9uYW1lci5pbnZvY2F0aW9uTmFtZShub2RlLnNlbGVjdG9yKTsKICAgICAgcmVnaXN0ZXJNZXRob2RJbnZva2Uobm9kZSk7CiAgICB9IGVsc2UgewogICAgICBtZXRob2RMaXRlcmFsID0gX25hbWVyLmFzTmFtZShtZXRob2ROYW1lKTsKICAgIH0KICAgIHB1c2goanMKICAgICAgICAucHJvcGVydHlDYWxsKG9iamVjdCwgbWV0aG9kTGl0ZXJhbCwgYXJndW1lbnRzKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludm9rZUNvbnN0cnVjdG9yQm9keShISW52b2tlQ29uc3RydWN0b3JCb2R5IG5vZGUpIHsKICAgIHVzZShub2RlLmlucHV0c1swXSk7CiAgICBqcy5FeHByZXNzaW9uIG9iamVjdCA9IHBvcCgpOwogICAganMuTmFtZSBtZXRob2ROYW1lID0gX25hbWVyLmluc3RhbmNlTWV0aG9kTmFtZShub2RlLmVsZW1lbnQpOwogICAgTGlzdDxqcy5FeHByZXNzaW9uPiBhcmd1bWVudHMgPSB2aXNpdEFyZ3VtZW50cyhub2RlLmlucHV0cyk7CiAgICBwdXNoKGpzCiAgICAgICAgLnByb3BlcnR5Q2FsbChvYmplY3QsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cykKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLmNvbnN0cnVjdG9yQm9keUludm9rZSgKICAgICAgICBub2RlLmVsZW1lbnQsIG5ldyBDYWxsU3RydWN0dXJlLnVubmFtZWQoYXJndW1lbnRzLmxlbmd0aCkpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnZva2VHZW5lcmF0b3JCb2R5KEhJbnZva2VHZW5lcmF0b3JCb2R5IG5vZGUpIHsKICAgIEpHZW5lcmF0b3JCb2R5IGVsZW1lbnQgPSBub2RlLmVsZW1lbnQ7CiAgICBpZiAoZWxlbWVudC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIHVzZShub2RlLmlucHV0c1swXSk7CiAgICAgIGpzLkV4cHJlc3Npb24gb2JqZWN0ID0gcG9wKCk7CiAgICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gYXJndW1lbnRzID0gdmlzaXRBcmd1bWVudHMobm9kZS5pbnB1dHMpOwogICAgICBqcy5OYW1lIG1ldGhvZE5hbWUgPSBfbmFtZXIuaW5zdGFuY2VNZXRob2ROYW1lKGVsZW1lbnQpOwogICAgICBwdXNoKGpzCiAgICAgICAgICAucHJvcGVydHlDYWxsKG9iamVjdCwgbWV0aG9kTmFtZSwgYXJndW1lbnRzKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGVsZW1lbnQpKTsKICAgICAgTGlzdDxqcy5FeHByZXNzaW9uPiBhcmd1bWVudHMgPSB2aXNpdEFyZ3VtZW50cyhub2RlLmlucHV0cywgc3RhcnQ6IDApOwogICAgICBwdXNoKG5ldyBqcy5DYWxsKHBvcCgpLCBhcmd1bWVudHMsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogbm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQoKICAgIF9yZWdpc3RyeQogICAgICAgIC5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLmdlbmVyYXRvckJvZHlJbnZva2Uobm9kZS5lbGVtZW50KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0T25lU2hvdEludGVyY2VwdG9yKEhPbmVTaG90SW50ZXJjZXB0b3Igbm9kZSkgewogICAgTGlzdDxqcy5FeHByZXNzaW9uPiBhcmd1bWVudHMgPSB2aXNpdEFyZ3VtZW50cyhub2RlLmlucHV0cyk7CiAgICBqcy5FeHByZXNzaW9uIGlzb2xhdGUgPQogICAgICAgIF9uYW1lci5yZWFkR2xvYmFsT2JqZWN0Rm9yTGlicmFyeShfY29tbW9uRWxlbWVudHMuaW50ZXJjZXB0b3JzTGlicmFyeSk7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IG5vZGUuc2VsZWN0b3I7CiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXMgPQogICAgICAgIF9pbnRlcmNlcHRvckRhdGEuZ2V0SW50ZXJjZXB0ZWRDbGFzc2VzT24oc2VsZWN0b3IubmFtZSwgX2Nsb3NlZFdvcmxkKTsKICAgIF9yZWdpc3RyeS5yZWdpc3Rlck9uZVNob3RJbnRlcmNlcHRvcihzZWxlY3Rvcik7CiAgICBqcy5OYW1lIG1ldGhvZE5hbWUgPSBfbmFtZXIubmFtZUZvck9uZVNob3RJbnRlcmNlcHRvcihzZWxlY3RvciwgY2xhc3Nlcyk7CiAgICBwdXNoKGpzCiAgICAgICAgLnByb3BlcnR5Q2FsbChpc29sYXRlLCBtZXRob2ROYW1lLCBhcmd1bWVudHMpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICBpZiAoc2VsZWN0b3IuaXNHZXR0ZXIpIHsKICAgICAgcmVnaXN0ZXJHZXR0ZXIobm9kZSk7CiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmlzU2V0dGVyKSB7CiAgICAgIHJlZ2lzdGVyU2V0dGVyKG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgcmVnaXN0ZXJNZXRob2RJbnZva2Uobm9kZSk7CiAgICB9CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJVc2VJbnRlcmNlcHRvcigpOwogIH0KCiAgQWJzdHJhY3RWYWx1ZSBnZXRPcHRpbWl6ZWRTZWxlY3RvckZvcigKICAgICAgSEludm9rZUR5bmFtaWMgbm9kZSwgU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgaWYgKG5vZGUuZWxlbWVudCAhPSBudWxsKSB7CiAgICAgIC8vIENyZWF0ZSBhbiBhcnRpZmljaWFsIHR5cGUgbWFzayB0byBtYWtlIHN1cmUgb25seQogICAgICAvLyBbbm9kZS5lbGVtZW50XSB3aWxsIGJlIGVucXVldWVkLiBXZSdyZSBub3QgdXNpbmcgdGhlIHJlY2VpdmVyCiAgICAgIC8vIHR5cGUgYmVjYXVzZSBvdXIgb3B0aW1pemF0aW9ucyBtaWdodCBlbmQgdXAgaW4gYSBzdGF0ZSB3aGVyZSB0aGUKICAgICAgLy8gaW52b2tlIGR5bmFtaWMga25vd3MgbW9yZSB0aGFuIHRoZSByZWNlaXZlci4KICAgICAgQ2xhc3NFbnRpdHkgZW5jbG9zaW5nID0gbm9kZS5lbGVtZW50LmVuY2xvc2luZ0NsYXNzOwogICAgICBpZiAoX2Nsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzSW5zdGFudGlhdGVkKGVuY2xvc2luZykpIHsKICAgICAgICByZXR1cm4gX2Fic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlTm9uTnVsbEV4YWN0KGVuY2xvc2luZyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgbWl4ZWQgaW4gc28gYSBub24tbnVsbCBzdWJ0eXBlIG1hc2sgaXMgdGhlIG1vc3QKICAgICAgICAvLyBwcmVjaXNlIHdlIGhhdmUuCiAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICBfY2xvc2VkV29ybGQuaXNVc2VkQXNNaXhpbihlbmNsb3NpbmcpLAogICAgICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgICAgICAiRWxlbWVudCAke25vZGUuZWxlbWVudH0gZnJvbSAkZW5jbG9zaW5nIGV4cGVjdGVkICIKICAgICAgICAgICAgICAgICJ0byBiZSBtaXhlZCBpbi4iKSk7CiAgICAgICAgcmV0dXJuIF9hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxTdWJ0eXBlKGVuY2xvc2luZyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXNrID8/IF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlOwogIH0KCiAgdm9pZCByZWdpc3Rlck1ldGhvZEludm9rZShISW52b2tlRHluYW1pYyBub2RlKSB7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IG5vZGUuc2VsZWN0b3I7CgogICAgLy8gSWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIGNhbGxpbmcgb3IgaWYgd2UgYXJlIGNhbGxpbmcgYSBnZXR0ZXIsCiAgICAvLyB3ZSBuZWVkIHRvIHJlZ2lzdGVyIHRoYXQgZmFjdCB0aGF0IHdlIG1heSBiZSBjYWxsaW5nIGEgY2xvc3VyZQogICAgLy8gd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMuCiAgICBNZW1iZXJFbnRpdHkgdGFyZ2V0ID0gbm9kZS5lbGVtZW50OwogICAgaWYgKCh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQuaXNHZXR0ZXIpICYmCiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiBrZXJuZWwgYWRkcyBhbiBgaXNGdW5jdGlvbkNhbGxgCiAgICAgICAgLy8gZmxhZyB0byBbaXIuTWV0aG9kSW52b2NhdGlvbl0uIEN1cnJlbnRseSB3ZSBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlCiAgICAgICAgLy8gYmV0d2VlbiBhIGR5bmFtaWMgY2FsbCBhbmQgYSBmdW5jdGlvbiBjYWxsLCBidXQgd2UgYXQgbGVhc3Qga25vdyB0aGF0CiAgICAgICAgLy8gdG9TdHJpbmcgaXMgbm90IGEgZ2V0dGVyIChhIHBvdGVudGlhbCBmdW5jdGlvbiBjYWxsIHNob3VsZCBvdGhlcndpc2UKICAgICAgICAvLyBoYXZlIGJlZW4gcmVnaXN0ZXIgZm9yIHN0cmluZyBjb25jYXRlbmF0aW9uKS4KICAgICAgICBzZWxlY3RvciAhPSBTZWxlY3RvcnMudG9TdHJpbmdfKSB7CiAgICAgIC8vIFRPRE8oa2FzcGVybCk6IElmIHdlIGhhdmUgYSB0eXBlZCBzZWxlY3RvciBmb3IgdGhlIGNhbGwsIHdlCiAgICAgIC8vIG1heSBrbm93IHNvbWV0aGluZyBhYm91dCB0aGUgdHlwZXMgb2YgY2xvc3VyZXMgdGhhdCBuZWVkCiAgICAgIC8vIHRoZSBzcGVjaWZpYyBjbG9zdXJlIGNhbGwgbWV0aG9kLgogICAgICBTZWxlY3RvciBjYWxsID0gbmV3IFNlbGVjdG9yLmNhbGxDbG9zdXJlRnJvbShzZWxlY3Rvcik7CiAgICAgIF9yZWdpc3RyeQogICAgICAgICAgLnJlZ2lzdGVyRHluYW1pY1VzZShuZXcgRHluYW1pY1VzZShjYWxsLCBudWxsLCBub2RlLnR5cGVBcmd1bWVudHMpKTsKICAgIH0KICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewogICAgICAvLyBUaGlzIGlzIGEgZHluYW1pYyBpbnZvY2F0aW9uIHdoaWNoIHdlIGhhdmUgZm91bmQgdG8gaGF2ZSBhIHNpbmdsZQogICAgICAvLyB0YXJnZXQgYnV0IGZvciBzb21lIHJlYXNvbiBoYXZlbid0IGlubGluZWQuIFdlIGFyZSBfc3RpbGxfIGFjY2Vzc2luZwogICAgICAvLyB0aGUgdGFyZ2V0IGR5bmFtaWNhbGx5IGJ1dCB3ZSBkb24ndCBuZWVkIHRvIGVucXVldWUgbW9yZSB0aGFuIHRhcmdldAogICAgICAvLyBmb3IgdGhpcyB0byB3b3JrLgogICAgICBhc3NlcnQoc2VsZWN0b3IuYXBwbGllcyh0YXJnZXQpLAogICAgICAgICAgZmFpbGVkQXQobm9kZSwgJyRzZWxlY3RvciBkb2VzIG5vdCBhcHBseSB0byAkdGFyZ2V0JykpOwogICAgICBhc3NlcnQoIXNlbGVjdG9yLmlzR2V0dGVyICYmICFzZWxlY3Rvci5pc1NldHRlciwKICAgICAgICAgICJVbmV4cGVjdGVkIGRpcmVjdCBpbnZvY2F0aW9uIHNlbGVjdG9yOiAkc2VsZWN0b3IuIik7CiAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLmRpcmVjdEludm9rZSgKICAgICAgICAgIHRhcmdldCwgc2VsZWN0b3IuY2FsbFN0cnVjdHVyZSwgbm9kZS50eXBlQXJndW1lbnRzKSk7CiAgICB9IGVsc2UgewogICAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPQogICAgICAgICAgZ2V0T3B0aW1pemVkU2VsZWN0b3JGb3Iobm9kZSwgc2VsZWN0b3IsIG5vZGUucmVjZWl2ZXJUeXBlKTsKICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyRHluYW1pY1VzZSgKICAgICAgICAgIG5ldyBEeW5hbWljVXNlKHNlbGVjdG9yLCBtYXNrLCBub2RlLnR5cGVBcmd1bWVudHMpKTsKICAgIH0KICB9CgogIHZvaWQgcmVnaXN0ZXJTZXR0ZXIoSEludm9rZUR5bmFtaWMgbm9kZSwge2Jvb2wgbmVlZHNDaGVjazogZmFsc2V9KSB7CiAgICBpZiAobm9kZS5lbGVtZW50IGlzIEZpZWxkRW50aXR5ICYmICFuZWVkc0NoZWNrKSB7CiAgICAgIC8vIFRoaXMgaXMgYSBkeW5hbWljIHVwZGF0ZSB3aGljaCB3ZSBoYXZlIGZvdW5kIHRvIGhhdmUgYSBzaW5nbGUKICAgICAgLy8gdGFyZ2V0IGJ1dCBmb3Igc29tZSByZWFzb24gaGF2ZW4ndCBpbmxpbmVkLiBXZSBhcmUgX3N0aWxsXyBhY2Nlc3NpbmcKICAgICAgLy8gdGhlIHRhcmdldCBkeW5hbWljYWxseSBidXQgd2UgZG9uJ3QgbmVlZCB0byBlbnF1ZXVlIG1vcmUgdGhhbiB0YXJnZXQKICAgICAgLy8gZm9yIHRoaXMgdG8gd29yay4KICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2UuZGlyZWN0U2V0KG5vZGUuZWxlbWVudCkpOwogICAgfSBlbHNlIHsKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBub2RlLnNlbGVjdG9yOwogICAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPQogICAgICAgICAgZ2V0T3B0aW1pemVkU2VsZWN0b3JGb3Iobm9kZSwgc2VsZWN0b3IsIG5vZGUucmVjZWl2ZXJUeXBlKTsKICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyRHluYW1pY1VzZSgKICAgICAgICAgIG5ldyBEeW5hbWljVXNlKHNlbGVjdG9yLCBtYXNrLCBub2RlLnR5cGVBcmd1bWVudHMpKTsKICAgIH0KICB9CgogIHZvaWQgcmVnaXN0ZXJHZXR0ZXIoSEludm9rZUR5bmFtaWMgbm9kZSkgewogICAgaWYgKG5vZGUuZWxlbWVudCAhPSBudWxsICYmCiAgICAgICAgKG5vZGUuZWxlbWVudC5pc0dldHRlciB8fCBub2RlLmVsZW1lbnQuaXNGaWVsZCkpIHsKICAgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcmVhZCB3aGljaCB3ZSBoYXZlIGZvdW5kIHRvIGhhdmUgYSBzaW5nbGUgdGFyZ2V0IGJ1dAogICAgICAvLyBmb3Igc29tZSByZWFzb24gaGF2ZW4ndCBpbmxpbmVkLiBXZSBhcmUgX3N0aWxsXyBhY2Nlc3NpbmcgdGhlIHRhcmdldAogICAgICAvLyBkeW5hbWljYWxseSBidXQgd2UgZG9uJ3QgbmVlZCB0byBlbnF1ZXVlIG1vcmUgdGhhbiB0YXJnZXQgZm9yIHRoaXMgdG8KICAgICAgLy8gd29yay4gVGhlIHRlc3QgYWJvdmUgZXhjbHVkZXMgbm9uLWdldHRlciBmdW5jdGlvbnMgc2luY2UgdGhlIGVsZW1lbnQKICAgICAgLy8gcmVwcmVzZW50cyB0d28gdGFyZ2V0cyAtIGEgdGVhcm9mZiBnZXR0ZXIgYW5kIHRoZSB0b3JuLW9mZiBtZXRob2QuCiAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLmRpcmVjdEdldChub2RlLmVsZW1lbnQpKTsKICAgIH0gZWxzZSB7CiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gbm9kZS5zZWxlY3RvcjsKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0KICAgICAgICAgIGdldE9wdGltaXplZFNlbGVjdG9yRm9yKG5vZGUsIHNlbGVjdG9yLCBub2RlLnJlY2VpdmVyVHlwZSk7CiAgICAgIF9yZWdpc3RyeS5yZWdpc3RlckR5bmFtaWNVc2UoCiAgICAgICAgICBuZXcgRHluYW1pY1VzZShzZWxlY3RvciwgbWFzaywgbm9kZS50eXBlQXJndW1lbnRzKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEludm9rZUR5bmFtaWNTZXR0ZXIoSEludm9rZUR5bmFtaWNTZXR0ZXIgbm9kZSkgewogICAgdXNlKG5vZGUucmVjZWl2ZXIpOwogICAganMuTmFtZSBuYW1lID0gX25hbWVyLmludm9jYXRpb25OYW1lKG5vZGUuc2VsZWN0b3IpOwogICAgcHVzaChqcwogICAgICAgIC5wcm9wZXJ0eUNhbGwocG9wKCksIG5hbWUsIHZpc2l0QXJndW1lbnRzKG5vZGUuaW5wdXRzKSkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIHJlZ2lzdGVyU2V0dGVyKG5vZGUsIG5lZWRzQ2hlY2s6IG5vZGUubmVlZHNDaGVjayk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEludm9rZUR5bmFtaWNHZXR0ZXIoSEludm9rZUR5bmFtaWNHZXR0ZXIgbm9kZSkgewogICAgdXNlKG5vZGUucmVjZWl2ZXIpOwogICAganMuTmFtZSBuYW1lID0gX25hbWVyLmludm9jYXRpb25OYW1lKG5vZGUuc2VsZWN0b3IpOwogICAgcHVzaChqcwogICAgICAgIC5wcm9wZXJ0eUNhbGwocG9wKCksIG5hbWUsIHZpc2l0QXJndW1lbnRzKG5vZGUuaW5wdXRzKSkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIHJlZ2lzdGVyR2V0dGVyKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnZva2VDbG9zdXJlKEhJbnZva2VDbG9zdXJlIG5vZGUpIHsKICAgIFNlbGVjdG9yIGNhbGwgPSBuZXcgU2VsZWN0b3IuY2FsbENsb3N1cmVGcm9tKG5vZGUuc2VsZWN0b3IpOwogICAgdXNlKG5vZGUucmVjZWl2ZXIpOwogICAgcHVzaChqcwogICAgICAgIC5wcm9wZXJ0eUNhbGwoCiAgICAgICAgICAgIHBvcCgpLCBfbmFtZXIuaW52b2NhdGlvbk5hbWUoY2FsbCksIHZpc2l0QXJndW1lbnRzKG5vZGUuaW5wdXRzKSkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIC8vIFRPRE8oa2FzcGVybCk6IElmIHdlIGhhdmUgYSB0eXBlZCBzZWxlY3RvciBmb3IgdGhlIGNhbGwsIHdlCiAgICAvLyBtYXkga25vdyBzb21ldGhpbmcgYWJvdXQgdGhlIHR5cGVzIG9mIGNsb3N1cmVzIHRoYXQgbmVlZAogICAgLy8gdGhlIHNwZWNpZmljIGNsb3N1cmUgY2FsbCBtZXRob2QuCiAgICBfcmVnaXN0cnkKICAgICAgICAucmVnaXN0ZXJEeW5hbWljVXNlKG5ldyBEeW5hbWljVXNlKGNhbGwsIG51bGwsIG5vZGUudHlwZUFyZ3VtZW50cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnZva2VTdGF0aWMoSEludm9rZVN0YXRpYyBub2RlKSB7CiAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCA9IG5vZGUuZWxlbWVudDsKICAgIG5vZGUuaW5zdGFudGlhdGVkVHlwZXM/LmZvckVhY2goX3JlZ2lzdHJ5LnJlZ2lzdGVySW5zdGFudGlhdGlvbik7CgogICAgTGlzdDxqcy5FeHByZXNzaW9uPiBhcmd1bWVudHMgPSB2aXNpdEFyZ3VtZW50cyhub2RlLmlucHV0cywgc3RhcnQ6IDApOwoKICAgIGlmIChlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5jaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcikgewogICAgICAvLyBNYW51YWxseSBpbmxpbmUgdGhlIFtjaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcl0gZnVuY3Rpb24uICBUaGlzCiAgICAgIC8vIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGZyb20gYSBmb3ItbG9vcCB1cGRhdGUuICBJZGVhbGx5IHdlIHdvdWxkIGp1c3QKICAgICAgLy8gZ2VuZXJhdGUgdGhlIGNvbmRpdGlvbmFsY29udHJvbCBmbG93IGluIHRoZSBidWlsZGVyIGJ1dCBpdCBhZGRzIGJhc2ljCiAgICAgIC8vIGJsb2NrcyBpbiB0aGUgbG9vcCB1cGRhdGUgdGhhdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBvcHRpbWl6YXRpb25zIGFuZAogICAgICAvLyBjb25mdXNlcyBsb29wIHJlY29nbml0aW9uLgoKICAgICAgYXNzZXJ0KGFyZ3VtZW50cy5sZW5ndGggPT0gMik7CiAgICAgIEZ1bmN0aW9uRW50aXR5IHRocm93RnVuY3Rpb24gPQogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnRocm93Q29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yOwogICAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UoCiAgICAgICAgICBuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSh0aHJvd0Z1bmN0aW9uLCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpKTsKCiAgICAgIC8vIENhbGxpbmcgdXNpbmcgYCgwLCAjKSgjKWAgaW5zdGVhZCBvZiBgIygjKWAgc2VwYXJhdGVzIHRoZSBwcm9wZXJ0eSBsb2FkCiAgICAgIC8vIG9mIHRoZSBzdGF0aWMgZnVuY3Rpb24gYWNjZXNzIGZyb20gdGhlIGNhbGwuICBGb3Igc29tZSByZWFzb24gdGhpcwogICAgICAvLyBoZWxwcyBWOCBzZWUgdGhhdCB0aGUgY2FsbCBuZXZlciBoYXBwZW5zIHNvIFY4IG1ha2VzIHRoZSBjYWxsIGEKICAgICAgLy8gZGVvcHRpbWl6YXRpb24uIFRoaXMgcmVtb3ZlcyB0aGUgY2FsbCBmcm9tIHRoZSBvcHRpbWl6ZWQgbG9vcCwgbWFraW5nCiAgICAgIC8vIG1vcmUgb3B0aW1pemF0aW9ucyBhdmFpbGFibGUgdG8gdGhlIGxvb3AuICBUaGlzIGZvcm0gaXMgNTAlIGZhc3RlciBvbgogICAgICAvLyBzb21lIHNtYWxsIGxvb3AsIGFsbW9zdCBhcyBmYXN0IGFzIGxvb3BzIHdpdGggbm8gY29uY3VycmVudAogICAgICAvLyBtb2RpZmljYXRpb24gY2hlY2suCgogICAgICAvLyBDcmVhdGUgW3JpZ2h0XSBhcyBhIHNlcGFyYXRlIEpTIG5vZGUgdG8gZ2l2ZSB0aGUgY2FsbCBhIHNvdXJjZQogICAgICAvLyBsb2NhdGlvbi4KICAgICAganMuRXhwcmVzc2lvbiByaWdodCA9IGpzLmpzKCcoMCwgIykoIyknLCBbCiAgICAgICAgX2VtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3ModGhyb3dGdW5jdGlvbiksCiAgICAgICAgYXJndW1lbnRzWzFdCiAgICAgIF0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgcHVzaChqcy5qcygnIyB8fCAjJywgW2FyZ3VtZW50c1swXSwgcmlnaHRdKS53aXRoU291cmNlSW5mb3JtYXRpb24oCiAgICAgICAgICBub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9IGVsc2UgewogICAgICBTdGF0aWNVc2Ugc3RhdGljVXNlOwogICAgICBpZiAoZWxlbWVudC5pc0NvbnN0cnVjdG9yKSB7CiAgICAgICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IENhbGxTdHJ1Y3R1cmUudW5uYW1lZCgKICAgICAgICAgICAgYXJndW1lbnRzLmxlbmd0aCwgbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICAgICAgc3RhdGljVXNlID0gbmV3IFN0YXRpY1VzZS5jb25zdHJ1Y3Rvckludm9rZShlbGVtZW50LCBjYWxsU3RydWN0dXJlKTsKICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmlzR2V0dGVyKSB7CiAgICAgICAgc3RhdGljVXNlID0gbmV3IFN0YXRpY1VzZS5zdGF0aWNHZXQoZWxlbWVudCk7CiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc1NldHRlcikgewogICAgICAgIHN0YXRpY1VzZSA9IG5ldyBTdGF0aWNVc2Uuc3RhdGljU2V0KGVsZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChlbGVtZW50LmlzRnVuY3Rpb24pOwogICAgICAgIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IG5ldyBDYWxsU3RydWN0dXJlLnVubmFtZWQoCiAgICAgICAgICAgIGFyZ3VtZW50cy5sZW5ndGgsIG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgICAgIHN0YXRpY1VzZSA9IG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKAogICAgICAgICAgICBlbGVtZW50LCBjYWxsU3RydWN0dXJlLCBub2RlLnR5cGVBcmd1bWVudHMpOwogICAgICB9CiAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShzdGF0aWNVc2UpOwogICAgICBwdXNoKF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGVsZW1lbnQpKTsKICAgICAgcHVzaChuZXcganMuQ2FsbChwb3AoKSwgYXJndW1lbnRzLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0SW52b2tlU3VwZXIoSEludm9rZVN1cGVyIG5vZGUpIHsKICAgIE1lbWJlckVudGl0eSBzdXBlckVsZW1lbnQgPSBub2RlLmVsZW1lbnQ7CiAgICBDbGFzc0VudGl0eSBzdXBlckNsYXNzID0gc3VwZXJFbGVtZW50LmVuY2xvc2luZ0NsYXNzOwogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBub2RlLnNlbGVjdG9yOwogICAgYm9vbCB1c2VBbGlhc2VkU3VwZXIgPSBjYW5Vc2VBbGlhc2VkU3VwZXJNZW1iZXIoc3VwZXJFbGVtZW50LCBzZWxlY3Rvcik7CiAgICBpZiAoc2VsZWN0b3IuaXNHZXR0ZXIpIHsKICAgICAgaWYgKHN1cGVyRWxlbWVudC5pc0ZpZWxkIHx8IHN1cGVyRWxlbWVudC5pc0dldHRlcikgewogICAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN1cGVyR2V0KHN1cGVyRWxlbWVudCkpOwogICAgICB9IGVsc2UgewogICAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN1cGVyVGVhck9mZihub2RlLmVsZW1lbnQpKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pc1NldHRlcikgewogICAgICBpZiAoc3VwZXJFbGVtZW50LmlzRmllbGQpIHsKICAgICAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdXBlckZpZWxkU2V0KHN1cGVyRWxlbWVudCkpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChzdXBlckVsZW1lbnQuaXNTZXR0ZXIpOwogICAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN1cGVyU2V0dGVyU2V0KHN1cGVyRWxlbWVudCkpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAodXNlQWxpYXNlZFN1cGVyKSB7CiAgICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3VwZXJJbnZva2UoCiAgICAgICAgICAgIHN1cGVyRWxlbWVudCwgbmV3IENhbGxTdHJ1Y3R1cmUudW5uYW1lZChub2RlLmlucHV0cy5sZW5ndGgpKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3VwZXJJbnZva2UoCiAgICAgICAgICAgIHN1cGVyRWxlbWVudCwgbmV3IENhbGxTdHJ1Y3R1cmUudW5uYW1lZChub2RlLmlucHV0cy5sZW5ndGggLSAxKSkpOwogICAgICB9CiAgICB9CgogICAgaWYgKHN1cGVyRWxlbWVudC5pc0ZpZWxkKSB7CiAgICAgIGpzLk5hbWUgZmllbGROYW1lID0gX25hbWVyLmluc3RhbmNlRmllbGRQcm9wZXJ0eU5hbWUoc3VwZXJFbGVtZW50KTsKICAgICAgdXNlKG5vZGUuaW5wdXRzWzBdKTsKICAgICAganMuUHJvcGVydHlBY2Nlc3MgYWNjZXNzID0gbmV3IGpzLlByb3BlcnR5QWNjZXNzKHBvcCgpLCBmaWVsZE5hbWUpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgICBpZiAobm9kZS5pc1NldHRlcikgewogICAgICAgIHVzZShub2RlLnZhbHVlKTsKICAgICAgICBwdXNoKG5ldyBqcy5Bc3NpZ25tZW50KGFjY2VzcywgcG9wKCkpCiAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB9IGVsc2UgewogICAgICAgIHB1c2goYWNjZXNzKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKCF1c2VBbGlhc2VkU3VwZXIpIHsKICAgICAgICBqcy5OYW1lIG1ldGhvZE5hbWU7CiAgICAgICAgaWYgKHNlbGVjdG9yLmlzR2V0dGVyICYmICFzdXBlckVsZW1lbnQuaXNHZXR0ZXIpIHsKICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSB0ZWFyLW9mZiwgcmVnaXN0ZXIgdGhlIGZhY3QgdGhhdCBhIHRlYXItb2ZmIGNsb3N1cmUKICAgICAgICAgIC8vIHdpbGwgYmUgY3JlYXRlZCwgYW5kIHRoYXQgdGhpcyB0ZWFyLW9mZiBtdXN0IGJ5cGFzcyBvcmRpbmFyeQogICAgICAgICAgLy8gZGlzcGF0Y2ggdG8gZW5zdXJlIHRoZSBzdXBlciBtZXRob2QgaXMgaW52b2tlZC4KICAgICAgICAgIEZ1bmN0aW9uRW50aXR5IGhlbHBlciA9IF9jb21tb25FbGVtZW50cy5jbG9zdXJlRnJvbVRlYXJPZmY7CiAgICAgICAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoCiAgICAgICAgICAgICAgaGVscGVyLAogICAgICAgICAgICAgIG5ldyBDYWxsU3RydWN0dXJlLnVubmFtZWQoCiAgICAgICAgICAgICAgICAgIG5vZGUuaW5wdXRzLmxlbmd0aCwgbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCksCiAgICAgICAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzKSk7CiAgICAgICAgICBtZXRob2ROYW1lID0gX25hbWVyLmludm9jYXRpb25OYW1lKHNlbGVjdG9yKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWV0aG9kTmFtZSA9IF9uYW1lci5pbnN0YW5jZU1ldGhvZE5hbWUoc3VwZXJFbGVtZW50KTsKICAgICAgICB9CgogICAgICAgIHB1c2goanMuanMoJyMuIy5jYWxsKCMpJywgWwogICAgICAgICAgX2VtaXR0ZXIucHJvdG90eXBlQWNjZXNzKHN1cGVyQ2xhc3MsIGhhc0JlZW5JbnN0YW50aWF0ZWQ6IHRydWUpLAogICAgICAgICAgbWV0aG9kTmFtZSwKICAgICAgICAgIHZpc2l0QXJndW1lbnRzKG5vZGUuaW5wdXRzLCBzdGFydDogMCkKICAgICAgICBdKS53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB9IGVsc2UgewogICAgICAgIHVzZShub2RlLnJlY2VpdmVyKTsKICAgICAgICBwdXNoKGpzLmpzKCcjLiMoIyknLCBbCiAgICAgICAgICBwb3AoKSwKICAgICAgICAgIF9uYW1lci5hbGlhc2VkU3VwZXJNZW1iZXJQcm9wZXJ0eU5hbWUoc3VwZXJFbGVtZW50KSwKICAgICAgICAgIHZpc2l0QXJndW1lbnRzKG5vZGUuaW5wdXRzLCBzdGFydDogMSkKICAgICAgICBdKSAvLyBTa2lwIHJlY2VpdmVyIGFyZ3VtZW50LgogICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGaWVsZEdldChIRmllbGRHZXQgbm9kZSkgewogICAgdXNlKG5vZGUucmVjZWl2ZXIpOwogICAgaWYgKG5vZGUuaXNOdWxsQ2hlY2spIHsKICAgICAgLy8gV2UgYWNjZXNzIGEgSmF2YVNjcmlwdCBtZW1iZXIgd2Uga25vdyBhbGwgb2JqZWN0cyBiZXNpZGVzCiAgICAgIC8vIG51bGwgYW5kIHVuZGVmaW5lZCBoYXZlOiBWOCBkb2VzIG5vdCBsaWtlIGFjY2Vzc2luZyBhIG1lbWJlcgogICAgICAvLyB0aGF0IGRvZXMgbm90IGV4aXN0LgogICAgICBwdXNoKG5ldyBqcy5Qcm9wZXJ0eUFjY2Vzcy5maWVsZChwb3AoKSwgJ3RvU3RyaW5nJykKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfSBlbHNlIHsKICAgICAgRmllbGRFbnRpdHkgZmllbGQgPSBub2RlLmVsZW1lbnQ7CiAgICAgIGpzLk5hbWUgbmFtZSA9IF9uYW1lci5pbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lKGZpZWxkKTsKICAgICAgcHVzaChuZXcganMuUHJvcGVydHlBY2Nlc3MocG9wKCksIG5hbWUpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2UuZmllbGRHZXQoZmllbGQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0RmllbGRTZXQoSEZpZWxkU2V0IG5vZGUpIHsKICAgIEZpZWxkRW50aXR5IGVsZW1lbnQgPSBub2RlLmVsZW1lbnQ7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5maWVsZFNldChlbGVtZW50KSk7CiAgICBqcy5OYW1lIG5hbWUgPSBfbmFtZXIuaW5zdGFuY2VGaWVsZFByb3BlcnR5TmFtZShlbGVtZW50KTsKICAgIHVzZShub2RlLnJlY2VpdmVyKTsKICAgIGpzLkV4cHJlc3Npb24gcmVjZWl2ZXIgPSBwb3AoKTsKICAgIHVzZShub2RlLnZhbHVlKTsKICAgIHB1c2gobmV3IGpzLkFzc2lnbm1lbnQoCiAgICAgICAgICAgIG5ldyBqcy5Qcm9wZXJ0eUFjY2VzcyhyZWNlaXZlciwgbmFtZSkKICAgICAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbiksCiAgICAgICAgICAgIHBvcCgpKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRHZXRMZW5ndGgoSEdldExlbmd0aCBub2RlKSB7CiAgICB1c2Uobm9kZS5yZWNlaXZlcik7CiAgICBwdXNoKG5ldyBqcy5Qcm9wZXJ0eUFjY2Vzcy5maWVsZChwb3AoKSwgJ2xlbmd0aCcpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFJlYWRNb2RpZnlXcml0ZShIUmVhZE1vZGlmeVdyaXRlIG5vZGUpIHsKICAgIEZpZWxkRW50aXR5IGVsZW1lbnQgPSBub2RlLmVsZW1lbnQ7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5maWVsZEdldChlbGVtZW50KSk7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5maWVsZFNldChlbGVtZW50KSk7CiAgICBqcy5OYW1lIG5hbWUgPSBfbmFtZXIuaW5zdGFuY2VGaWVsZFByb3BlcnR5TmFtZShlbGVtZW50KTsKICAgIHVzZShub2RlLnJlY2VpdmVyKTsKICAgIGpzLkV4cHJlc3Npb24gZmllbGRSZWZlcmVuY2UgPSBuZXcganMuUHJvcGVydHlBY2Nlc3MocG9wKCksIG5hbWUpOwogICAgaWYgKG5vZGUuaXNQcmVPcCkgewogICAgICBwdXNoKG5ldyBqcy5QcmVmaXgobm9kZS5qc09wLCBmaWVsZFJlZmVyZW5jZSkKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfSBlbHNlIGlmIChub2RlLmlzUG9zdE9wKSB7CiAgICAgIHB1c2gobmV3IGpzLlBvc3RmaXgobm9kZS5qc09wLCBmaWVsZFJlZmVyZW5jZSkKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfSBlbHNlIHsKICAgICAgdXNlKG5vZGUudmFsdWUpOwogICAgICBwdXNoKG5ldyBqcy5Bc3NpZ25tZW50LmNvbXBvdW5kKGZpZWxkUmVmZXJlbmNlLCBub2RlLmpzT3AsIHBvcCgpKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExvY2FsR2V0KEhMb2NhbEdldCBub2RlKSB7CiAgICB1c2Uobm9kZS5yZWNlaXZlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExvY2FsU2V0KEhMb2NhbFNldCBub2RlKSB7CiAgICB1c2Uobm9kZS52YWx1ZSk7CiAgICBhc3NpZ25WYXJpYWJsZSgKICAgICAgICB2YXJpYWJsZU5hbWVzLmdldE5hbWUobm9kZS5yZWNlaXZlciksIHBvcCgpLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJGb3JlaWduVHlwZXMoSEZvcmVpZ24gbm9kZSkgewogICAgTmF0aXZlQmVoYXZpb3IgbmF0aXZlQmVoYXZpb3IgPSBub2RlLm5hdGl2ZUJlaGF2aW9yOwogICAgaWYgKG5hdGl2ZUJlaGF2aW9yID09IG51bGwpIHJldHVybjsKICAgIF9yZWdpc3RyeS5yZWdpc3Rlck5hdGl2ZUJlaGF2aW9yKG5hdGl2ZUJlaGF2aW9yKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Rm9yZWlnbkNvZGUoSEZvcmVpZ25Db2RlIG5vZGUpIHsKICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSBub2RlLmlucHV0czsKICAgIGlmIChub2RlLmlzSnNTdGF0ZW1lbnQoKSkgewogICAgICBMaXN0PGpzLkV4cHJlc3Npb24+IGludGVycG9sYXRlZEV4cHJlc3Npb25zID0gPGpzLkV4cHJlc3Npb24+W107CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdXNlKGlucHV0c1tpXSk7CiAgICAgICAgaW50ZXJwb2xhdGVkRXhwcmVzc2lvbnMuYWRkKHBvcCgpKTsKICAgICAgfQogICAgICBwdXNoU3RhdGVtZW50KG5vZGUuY29kZVRlbXBsYXRlCiAgICAgICAgICAuaW5zdGFudGlhdGUoaW50ZXJwb2xhdGVkRXhwcmVzc2lvbnMpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gaW50ZXJwb2xhdGVkRXhwcmVzc2lvbnMgPSA8anMuRXhwcmVzc2lvbj5bXTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB1c2UoaW5wdXRzW2ldKTsKICAgICAgICBpbnRlcnBvbGF0ZWRFeHByZXNzaW9ucy5hZGQocG9wKCkpOwogICAgICB9CiAgICAgIHB1c2gobm9kZS5jb2RlVGVtcGxhdGUKICAgICAgICAgIC5pbnN0YW50aWF0ZShpbnRlcnBvbGF0ZWRFeHByZXNzaW9ucykKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQoKICAgIC8vIFRPRE8oc3JhKTogVGVsbCB3b3JsZC5uYXRpdmVFbnF1ZXVlciBhYm91dCB0aGUgdHlwZXMgY3JlYXRlZCBoZXJlLgogICAgcmVnaXN0ZXJGb3JlaWduVHlwZXMobm9kZSk7CgogICAgaWYgKG5vZGUuZm9yZWlnbkZ1bmN0aW9uICE9IG51bGwpIHsKICAgICAgX3JlZ2lzdHJ5Py5yZWdpc3RlclN0YXRpY1VzZSgKICAgICAgICAgIG5ldyBTdGF0aWNVc2UuaW1wbGljaXRJbnZva2Uobm9kZS5mb3JlaWduRnVuY3Rpb24pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q3JlYXRlKEhDcmVhdGUgbm9kZSkgewogICAganMuRXhwcmVzc2lvbiBqc0NsYXNzUmVmZXJlbmNlID0gX2VtaXR0ZXIuY29uc3RydWN0b3JBY2Nlc3Mobm9kZS5lbGVtZW50KTsKICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gYXJndW1lbnRzID0gdmlzaXRBcmd1bWVudHMobm9kZS5pbnB1dHMsIHN0YXJ0OiAwKTsKICAgIHB1c2gobmV3IGpzLk5ldyhqc0NsYXNzUmVmZXJlbmNlLCBhcmd1bWVudHMpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAvLyBXZSBhbHNvIHVzZSBIQ3JlYXRlIHRvIGluc3RhbnRpYXRlIGNsb3N1cmUgY2xhc3NlcyB0aGF0IGJlbG9uZyB0bwogICAgLy8gZnVuY3Rpb24gZXhwcmVzc2lvbnMuIFdlIGhhdmUgdG8gcmVnaXN0ZXIgdGhlaXIgdXNlIGhlcmUsIGFzIG90aGVyd2lzZQogICAgLy8gY29kZSBmb3IgdGhlbSBtaWdodCBub3QgYmUgZW1pdHRlZC4KICAgIGlmIChub2RlLmVsZW1lbnQuaXNDbG9zdXJlKSB7CiAgICAgIF9yZWdpc3RyeQogICAgICAgICAgLy8gaWdub3JlOmRlcHJlY2F0ZWRfbWVtYmVyX3VzZV9mcm9tX3NhbWVfcGFja2FnZQogICAgICAgICAgLnJlZ2lzdGVySW5zdGFudGlhdGVkQ2xhc3Mobm9kZS5lbGVtZW50KTsKICAgIH0KICAgIG5vZGUuaW5zdGFudGlhdGVkVHlwZXM/LmZvckVhY2goX3JlZ2lzdHJ5LnJlZ2lzdGVySW5zdGFudGlhdGlvbik7CiAgICBpZiAobm9kZS5jYWxsTWV0aG9kICE9IG51bGwpIHsKICAgICAgX3JlZ2lzdHJ5CiAgICAgICAgICA/LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2UuaW1wbGljaXRJbnZva2Uobm9kZS5jYWxsTWV0aG9kKSk7CiAgICAgIF9yZWdpc3RyeT8ucmVnaXN0ZXJJbnN0YW50aWF0ZWRDbG9zdXJlKG5vZGUuY2FsbE1ldGhvZCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENyZWF0ZUJveChIQ3JlYXRlQm94IG5vZGUpIHsKICAgIHB1c2gobmV3IGpzLk9iamVjdEluaXRpYWxpemVyKDxqcy5Qcm9wZXJ0eT5bXSkpOwogIH0KCiAganMuRXhwcmVzc2lvbiBuZXdMaXRlcmFsQm9vbCgKICAgICAgYm9vbCB2YWx1ZSwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIGlmIChfb3B0aW9ucy5lbmFibGVNaW5pZmljYXRpb24pIHsKICAgICAgLy8gVXNlICEwIGZvciB0cnVlLCAhMSBmb3IgZmFsc2UuCiAgICAgIHJldHVybiBuZXcganMuUHJlZml4KCIhIiwgbmV3IGpzLkxpdGVyYWxOdW1iZXIodmFsdWUgPyAiMCIgOiAiMSIpKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IGpzLkxpdGVyYWxCb29sKHZhbHVlKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogIH0KCiAgdm9pZCBnZW5lcmF0ZUNvbnN0YW50KAogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50LCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAganMuRXhwcmVzc2lvbiBleHByZXNzaW9uID0gX2VtaXR0ZXIuY29uc3RhbnRSZWZlcmVuY2UoY29uc3RhbnQpOwogICAgaWYgKCFjb25zdGFudC5pc0R1bW15KSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFN1cHBvcnQgc291cmNlIGluZm9ybWF0aW9uIG9uIHN5bnRoZXRpYyBjb25zdGFudHMuCiAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgICBwdXNoKGV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDb25zdGFudChIQ29uc3RhbnQgbm9kZSkgewogICAgYXNzZXJ0KGlzR2VuZXJhdGVBdFVzZVNpdGUobm9kZSkpOwogICAgZ2VuZXJhdGVDb25zdGFudChub2RlLmNvbnN0YW50LCBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKCiAgICBfcmVnaXN0cnkucmVnaXN0ZXJDb25zdGFudFVzZShuZXcgQ29uc3RhbnRVc2UubGl0ZXJhbChub2RlLmNvbnN0YW50KSk7CiAgICBpZiAobm9kZS5jb25zdGFudC5pc1R5cGUpIHsKICAgICAgVHlwZUNvbnN0YW50VmFsdWUgdHlwZUNvbnN0YW50ID0gbm9kZS5jb25zdGFudDsKICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyVHlwZVVzZSgKICAgICAgICAgIG5ldyBUeXBlVXNlLmNvbnN0VHlwZUxpdGVyYWwodHlwZUNvbnN0YW50LnJlcHJlc2VudGVkVHlwZSkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXROb3QoSE5vdCBub2RlKSB7CiAgICBhc3NlcnQobm9kZS5pbnB1dHMubGVuZ3RoID09IDEpOwogICAgZ2VuZXJhdGVOb3Qobm9kZS5pbnB1dHNbMF0sIG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgc3RhdGljIFN0cmluZyBtYXBSZWxhdGlvbmFsT3BlcmF0b3IoU3RyaW5nIG9wLCBib29sIGludmVyc2UpIHsKICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gaW52ZXJzZU9wZXJhdG9yID0gY29uc3QgPFN0cmluZywgU3RyaW5nPnsKICAgICAgIj09IjogIiE9IiwKICAgICAgIiE9IjogIj09IiwKICAgICAgIj09PSI6ICIhPT0iLAogICAgICAiIT09IjogIj09PSIsCiAgICAgICI8IjogIj49IiwKICAgICAgIjw9IjogIj4iLAogICAgICAiPiI6ICI8PSIsCiAgICAgICI+PSI6ICI8IgogICAgfTsKICAgIHJldHVybiBpbnZlcnNlID8gaW52ZXJzZU9wZXJhdG9yW29wXSA6IG9wOwogIH0KCiAgdm9pZCBnZW5lcmF0ZU5vdChISW5zdHJ1Y3Rpb24gaW5wdXQsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBib29sIGNhbkdlbmVyYXRlT3B0aW1pemVkQ29tcGFyaXNvbihISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgICAgaWYgKGluc3RydWN0aW9uIGlzISBIUmVsYXRpb25hbCkgcmV0dXJuIGZhbHNlOwoKICAgICAgSFJlbGF0aW9uYWwgcmVsYXRpb25hbCA9IGluc3RydWN0aW9uOwoKICAgICAgSEluc3RydWN0aW9uIGxlZnQgPSByZWxhdGlvbmFsLmxlZnQ7CiAgICAgIEhJbnN0cnVjdGlvbiByaWdodCA9IHJlbGF0aW9uYWwucmlnaHQ7CiAgICAgIGlmIChsZWZ0LmlzU3RyaW5nT3JOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgICByaWdodC5pc1N0cmluZ09yTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvLyBUaGlzIG9wdGltaXphdGlvbiBkb2Vzbid0IHdvcmsgZm9yIE5hTiwgc28gd2Ugb25seSBkbyBpdCBpZiB0aGUKICAgICAgLy8gdHlwZSBpcyBrbm93biB0byBiZSBhbiBpbnRlZ2VyLgogICAgICByZXR1cm4gbGVmdC5pc0ludGVnZXIoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICAgIHJpZ2h0LmlzSW50ZWdlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZTsKICAgIH0KCiAgICBib29sIGhhbmRsZWRCeVNwZWNpYWxDYXNlID0gZmFsc2U7CiAgICBpZiAoaXNHZW5lcmF0ZUF0VXNlU2l0ZShpbnB1dCkpIHsKICAgICAgaGFuZGxlZEJ5U3BlY2lhbENhc2UgPSB0cnVlOwogICAgICBpZiAoaW5wdXQgaXMgSElzKSB7CiAgICAgICAgZW1pdElzKGlucHV0LCAnIT09Jywgc291cmNlSW5mb3JtYXRpb24pOwogICAgICB9IGVsc2UgaWYgKGlucHV0IGlzIEhJc1ZpYUludGVyY2VwdG9yKSB7CiAgICAgICAgZW1pdElzVmlhSW50ZXJjZXB0b3IoaW5wdXQsIHNvdXJjZUluZm9ybWF0aW9uLCBuZWdhdGl2ZTogdHJ1ZSk7CiAgICAgIH0gZWxzZSBpZiAoaW5wdXQgaXMgSE5vdCkgewogICAgICAgIHVzZShpbnB1dC5pbnB1dHNbMF0pOwogICAgICB9IGVsc2UgaWYgKGlucHV0IGlzIEhJZGVudGl0eSkgewogICAgICAgIGVtaXRJZGVudGl0eUNvbXBhcmlzb24oaW5wdXQsIHNvdXJjZUluZm9ybWF0aW9uLCBpbnZlcnNlOiB0cnVlKTsKICAgICAgfSBlbHNlIGlmIChjYW5HZW5lcmF0ZU9wdGltaXplZENvbXBhcmlzb24oaW5wdXQpKSB7CiAgICAgICAgSFJlbGF0aW9uYWwgcmVsYXRpb25hbCA9IGlucHV0OwogICAgICAgIGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uID0gcmVsYXRpb25hbC5vcGVyYXRpb24oKTsKICAgICAgICBTdHJpbmcgb3AgPSBtYXBSZWxhdGlvbmFsT3BlcmF0b3Iob3BlcmF0aW9uLm5hbWUsIHRydWUpOwogICAgICAgIGhhbmRsZUludm9rZUJpbmFyeShpbnB1dCwgb3AsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBoYW5kbGVkQnlTcGVjaWFsQ2FzZSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpZiAoIWhhbmRsZWRCeVNwZWNpYWxDYXNlKSB7CiAgICAgIHVzZShpbnB1dCk7CiAgICAgIHB1c2gobmV3IGpzLlByZWZpeCgiISIsIHBvcCgpKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0UGFyYW1ldGVyVmFsdWUoSFBhcmFtZXRlclZhbHVlIG5vZGUpIHsKICAgIGFzc2VydCghaXNHZW5lcmF0ZUF0VXNlU2l0ZShub2RlKSk7CiAgICBTdHJpbmcgbmFtZSA9IHZhcmlhYmxlTmFtZXMuZ2V0TmFtZShub2RlKTsKICAgIHBhcmFtZXRlcnMuYWRkKG5ldyBqcy5QYXJhbWV0ZXIobmFtZSkpOwogICAgZGVjbGFyZWRMb2NhbHMuYWRkKG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMb2NhbFZhbHVlKEhMb2NhbFZhbHVlIG5vZGUpIHsKICAgIGFzc2VydCghaXNHZW5lcmF0ZUF0VXNlU2l0ZShub2RlKSk7CiAgICBTdHJpbmcgbmFtZSA9IHZhcmlhYmxlTmFtZXMuZ2V0TmFtZShub2RlKTsKICAgIGNvbGxlY3RlZFZhcmlhYmxlRGVjbGFyYXRpb25zLmFkZChuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0UGhpKEhQaGkgbm9kZSkgewogICAgLy8gVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgZm9yIHBoaXMgdGhhdCBhcmUgZ2VuZXJhdGVkIGF0IHVzZQogICAgLy8gc2l0ZS4gQSBwaGkgY2FuIGJlIGdlbmVyYXRlZCBhdCB1c2Ugc2l0ZSBvbmx5IGlmIGl0IGlzIHRoZQogICAgLy8gcmVzdWx0IG9mIGEgY29udHJvbCBmbG93IG9wZXJhdGlvbi4KICAgIEhCYXNpY0Jsb2NrIGlmQmxvY2sgPSBub2RlLmJsb2NrLmRvbWluYXRvcjsKICAgIGFzc2VydChjb250cm9sRmxvd09wZXJhdG9ycy5jb250YWlucyhpZkJsb2NrLmxhc3QpKTsKICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IGlmQmxvY2subGFzdC5pbnB1dHNbMF07CiAgICBpZiAoaW5wdXQuaXNDb25zdGFudEZhbHNlKCkpIHsKICAgICAgdXNlKG5vZGUuaW5wdXRzWzFdKTsKICAgIH0gZWxzZSBpZiAoaW5wdXQuaXNDb25zdGFudFRydWUoKSkgewogICAgICB1c2Uobm9kZS5pbnB1dHNbMF0pOwogICAgfSBlbHNlIGlmIChub2RlLmlucHV0c1sxXS5pc0NvbnN0YW50Qm9vbGVhbigpKSB7CiAgICAgIFN0cmluZyBvcGVyYXRpb24gPSBub2RlLmlucHV0c1sxXS5pc0NvbnN0YW50RmFsc2UoKSA/ICcmJicgOiAnfHwnOwogICAgICBpZiAob3BlcmF0aW9uID09ICd8fCcpIHsKICAgICAgICBnZW5lcmF0ZU5vdChpbnB1dCwgaW5wdXQuc291cmNlSW5mb3JtYXRpb24pOwogICAgICB9IGVsc2UgewogICAgICAgIHVzZShpbnB1dCk7CiAgICAgIH0KICAgICAganMuRXhwcmVzc2lvbiBsZWZ0ID0gcG9wKCk7CiAgICAgIHVzZShub2RlLmlucHV0c1swXSk7CiAgICAgIHB1c2gobmV3IGpzLkJpbmFyeShvcGVyYXRpb24sIGxlZnQsIHBvcCgpKSk7CiAgICB9IGVsc2UgewogICAgICB1c2UoaW5wdXQpOwogICAgICBqcy5FeHByZXNzaW9uIHRlc3QgPSBwb3AoKTsKICAgICAgdXNlKG5vZGUuaW5wdXRzWzBdKTsKICAgICAganMuRXhwcmVzc2lvbiB0aGVuID0gcG9wKCk7CiAgICAgIHVzZShub2RlLmlucHV0c1sxXSk7CiAgICAgIHB1c2gobmV3IGpzLkNvbmRpdGlvbmFsKHRlc3QsIHRoZW4sIHBvcCgpKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFJldHVybihIUmV0dXJuIG5vZGUpIHsKICAgIGFzc2VydChub2RlLmlucHV0cy5sZW5ndGggPT0gMSk7CiAgICBISW5zdHJ1Y3Rpb24gaW5wdXQgPSBub2RlLmlucHV0c1swXTsKICAgIGlmIChpbnB1dC5pc0NvbnN0YW50TnVsbCgpKSB7CiAgICAgIHB1c2hTdGF0ZW1lbnQoCiAgICAgICAgICBuZXcganMuUmV0dXJuKCkud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIHVzZShub2RlLmlucHV0c1swXSk7CiAgICAgIHB1c2hTdGF0ZW1lbnQoCiAgICAgICAgICBuZXcganMuUmV0dXJuKHBvcCgpKS53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUaGlzKEhUaGlzIG5vZGUpIHsKICAgIHB1c2gobmV3IGpzLlRoaXMoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFRocm93KEhUaHJvdyBub2RlKSB7CiAgICBpZiAobm9kZS5pc1JldGhyb3cpIHsKICAgICAgdXNlKG5vZGUuaW5wdXRzWzBdKTsKICAgICAgcHVzaFN0YXRlbWVudCgKICAgICAgICAgIG5ldyBqcy5UaHJvdyhwb3AoKSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIGdlbmVyYXRlVGhyb3dXaXRoSGVscGVyKAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLndyYXBFeGNlcHRpb25IZWxwZXIsIG5vZGUuaW5wdXRzWzBdLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRBd2FpdChIQXdhaXQgbm9kZSkgewogICAgdXNlKG5vZGUuaW5wdXRzWzBdKTsKICAgIHB1c2gobmV3IGpzLkF3YWl0KHBvcCgpKS53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRZaWVsZChIWWllbGQgbm9kZSkgewogICAgdXNlKG5vZGUuaW5wdXRzWzBdKTsKICAgIHB1c2hTdGF0ZW1lbnQobmV3IGpzLkRhcnRZaWVsZChwb3AoKSwgbm9kZS5oYXNTdGFyKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRSYW5nZUNvbnZlcnNpb24oSFJhbmdlQ29udmVyc2lvbiBub2RlKSB7CiAgICAvLyBSYW5nZSBjb252ZXJzaW9uIGluc3RydWN0aW9ucyBhcmUgcmVtb3ZlZCBieSB0aGUgdmFsdWUgcmFuZ2UKICAgIC8vIGFuYWx5emVyLgogICAgYXNzZXJ0KGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Qm91bmRzQ2hlY2soSEJvdW5kc0NoZWNrIG5vZGUpIHsKICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogU2VwYXJhdGUgdGhlIHR3byBjaGVja3Mgb2YgdGhlIGJvdW5kcyBjaGVjaywgc28sCiAgICAvLyBlLmcuLCB0aGUgemVybyBjaGVja3MgY2FuIGJlIHNoYXJlZCBpZiBwb3NzaWJsZS4KCiAgICAvLyBJZiB0aGUgY2hlY2tzIGFsd2F5cyBzdWNjZWVkcywgd2Ugd291bGQgaGF2ZSByZW1vdmVkIHRoZSBib3VuZHMgY2hlY2sKICAgIC8vIGNvbXBsZXRlbHkuCiAgICBhc3NlcnQobm9kZS5zdGF0aWNDaGVja3MgIT0gSEJvdW5kc0NoZWNrLkFMV0FZU19UUlVFKTsKICAgIGlmIChub2RlLnN0YXRpY0NoZWNrcyAhPSBIQm91bmRzQ2hlY2suQUxXQVlTX0ZBTFNFKSB7CiAgICAgIGpzLkV4cHJlc3Npb24gdW5kZXI7CiAgICAgIGpzLkV4cHJlc3Npb24gb3ZlcjsKICAgICAgaWYgKG5vZGUuc3RhdGljQ2hlY2tzICE9IEhCb3VuZHNDaGVjay5BTFdBWVNfQUJPVkVfWkVSTykgewogICAgICAgIHVzZShub2RlLmluZGV4KTsKICAgICAgICBpZiAobm9kZS5pbmRleC5pc0ludGVnZXIoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICAgIHVuZGVyID0ganMuanMoIiMgPCAwIiwgcG9wKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBqcy5FeHByZXNzaW9uIGpzSW5kZXggPSBwb3AoKTsKICAgICAgICAgIHVuZGVyID0ganMuanMoIiMgPj4+IDAgIT09ICMiLCBbanNJbmRleCwganNJbmRleF0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChub2RlLmluZGV4CiAgICAgICAgICAuaXNJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgLmlzUG90ZW50aWFsbHlGYWxzZSkgewogICAgICAgIGNoZWNrSW50KG5vZGUuaW5kZXgsICchPT0nKTsKICAgICAgICB1bmRlciA9IHBvcCgpOwogICAgICB9CiAgICAgIGlmIChub2RlLnN0YXRpY0NoZWNrcyAhPSBIQm91bmRzQ2hlY2suQUxXQVlTX0JFTE9XX0xFTkdUSCkgewogICAgICAgIHZhciBpbmRleCA9IG5vZGUuaW5kZXg7CiAgICAgICAgdXNlKGluZGV4KTsKICAgICAgICBqcy5FeHByZXNzaW9uIGpzSW5kZXggPSBwb3AoKTsKICAgICAgICB1c2Uobm9kZS5sZW5ndGgpOwogICAgICAgIG92ZXIgPSBuZXcganMuQmluYXJ5KCI+PSIsIGpzSW5kZXgsIHBvcCgpKTsKICAgICAgfQogICAgICBhc3NlcnQob3ZlciAhPSBudWxsIHx8IHVuZGVyICE9IG51bGwpOwogICAgICBqcy5FeHByZXNzaW9uIHVuZGVyT3ZlciA9IHVuZGVyID09IG51bGwKICAgICAgICAgID8gb3ZlcgogICAgICAgICAgOiBvdmVyID09IG51bGwgPyB1bmRlciA6IG5ldyBqcy5CaW5hcnkoInx8IiwgdW5kZXIsIG92ZXIpOwogICAgICBqcy5TdGF0ZW1lbnQgdGhlbkJvZHkgPSBuZXcganMuQmxvY2suZW1wdHkoKTsKICAgICAganMuQmxvY2sgb2xkQ29udGFpbmVyID0gY3VycmVudENvbnRhaW5lcjsKICAgICAgY3VycmVudENvbnRhaW5lciA9IHRoZW5Cb2R5OwogICAgICBnZW5lcmF0ZVRocm93V2l0aEhlbHBlcihfY29tbW9uRWxlbWVudHMudGhyb3dJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24sCiAgICAgICAgICBbbm9kZS5hcnJheSwgbm9kZS5yZXBvcnRlZEluZGV4XSwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgY3VycmVudENvbnRhaW5lciA9IG9sZENvbnRhaW5lcjsKICAgICAgdGhlbkJvZHkgPSB1bndyYXBTdGF0ZW1lbnQodGhlbkJvZHkpOwogICAgICBwdXNoU3RhdGVtZW50KG5ldyBqcy5JZi5ub0Vsc2UodW5kZXJPdmVyLCB0aGVuQm9keSkKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfSBlbHNlIHsKICAgICAgZ2VuZXJhdGVUaHJvd1dpdGhIZWxwZXIoX2NvbW1vbkVsZW1lbnRzLnRocm93SW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLAogICAgICAgICAgW25vZGUuYXJyYXksIG5vZGUuaW5kZXhdKTsKICAgIH0KICB9CgogIHZvaWQgZ2VuZXJhdGVUaHJvd1dpdGhIZWxwZXIoRnVuY3Rpb25FbnRpdHkgaGVscGVyLCBhcmd1bWVudCwKICAgICAge1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAganMuRXhwcmVzc2lvbiBqc0hlbHBlciA9IF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGhlbHBlcik7CiAgICBMaXN0IGFyZ3VtZW50cyA9IDxqcy5FeHByZXNzaW9uPltdOwogICAgaWYgKGFyZ3VtZW50IGlzIExpc3QpIHsKICAgICAgYXJndW1lbnQuZm9yRWFjaCgoaW5zdHJ1Y3Rpb24pIHsKICAgICAgICB1c2UoaW5zdHJ1Y3Rpb24pOwogICAgICAgIGFyZ3VtZW50cy5hZGQocG9wKCkpOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHVzZShhcmd1bWVudCk7CiAgICAgIGFyZ3VtZW50cy5hZGQocG9wKCkpOwogICAgfQogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKAogICAgICAgIGhlbHBlciwgbmV3IENhbGxTdHJ1Y3R1cmUudW5uYW1lZChhcmd1bWVudHMubGVuZ3RoKSkpOwogICAganMuQ2FsbCB2YWx1ZSA9IG5ldyBqcy5DYWxsKGpzSGVscGVyLCBhcmd1bWVudHMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSksCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIC8vIEJVRyg0OTA2KTogVXNpbmcgdGhyb3cvcmV0dXJuIGhlcmUgYWRkcyB0byB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUKICAgIC8vIGJ1dCBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZiBleHBsaWNpdGx5IHRlbGxpbmcgdGhlIEpTIGVuZ2luZSB0aGF0CiAgICAvLyB0aGlzIGNvZGUgcGF0aCB3aWxsIHRlcm1pbmF0ZSBhYnJ1cHRseS4gTmVlZHMgbW9yZSB3b3JrLgogICAgaWYgKGhlbHBlciA9PSBfY29tbW9uRWxlbWVudHMud3JhcEV4Y2VwdGlvbkhlbHBlcikgewogICAgICBwdXNoU3RhdGVtZW50KAogICAgICAgICAgbmV3IGpzLlRocm93KHZhbHVlKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2hTdGF0ZW1lbnQoCiAgICAgICAgICBuZXcganMuUmV0dXJuKHZhbHVlKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0VGhyb3dFeHByZXNzaW9uKEhUaHJvd0V4cHJlc3Npb24gbm9kZSkgewogICAgSEluc3RydWN0aW9uIGFyZ3VtZW50ID0gbm9kZS5pbnB1dHNbMF07CiAgICB1c2UoYXJndW1lbnQpOwoKICAgIEZ1bmN0aW9uRW50aXR5IGhlbHBlciA9IF9jb21tb25FbGVtZW50cy50aHJvd0V4cHJlc3Npb25IZWxwZXI7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UoCiAgICAgICAgbmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoaGVscGVyLCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpKTsKCiAgICBqcy5FeHByZXNzaW9uIGpzSGVscGVyID0gX2VtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoaGVscGVyKTsKICAgIGpzLkNhbGwgdmFsdWUgPSBuZXcganMuQ2FsbChqc0hlbHBlciwgW3BvcCgpXSkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgcHVzaCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3dpdGNoKEhTd2l0Y2ggbm9kZSkgewogICAgLy8gU3dpdGNoZXMgYXJlIGhhbmRsZWQgdXNpbmcgW3Zpc2l0U3dpdGNoSW5mb10uCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljKEhTdGF0aWMgbm9kZSkgewogICAgTWVtYmVyRW50aXR5IGVsZW1lbnQgPSBub2RlLmVsZW1lbnQ7CiAgICBhc3NlcnQoZWxlbWVudC5pc0Z1bmN0aW9uIHx8IGVsZW1lbnQuaXNGaWVsZCk7CiAgICBpZiAoZWxlbWVudC5pc0Z1bmN0aW9uKSB7CiAgICAgIHB1c2goX2VtaXR0ZXIKICAgICAgICAgIC5zdGF0aWNDbG9zdXJlQWNjZXNzKGVsZW1lbnQpCiAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljVGVhck9mZihlbGVtZW50KSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKF9lbWl0dGVyCiAgICAgICAgICAuc3RhdGljRmllbGRBY2Nlc3MoZWxlbWVudCkKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNHZXQoZWxlbWVudCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExhenlTdGF0aWMoSExhenlTdGF0aWMgbm9kZSkgewogICAgRmllbGRFbnRpdHkgZWxlbWVudCA9IG5vZGUuZWxlbWVudDsKICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0luaXQoZWxlbWVudCkpOwogICAganMuRXhwcmVzc2lvbiBsYXp5R2V0dGVyID0gX2VtaXR0ZXIuaXNvbGF0ZUxhenlJbml0aWFsaXplckFjY2VzcyhlbGVtZW50KTsKICAgIGpzLkNhbGwgY2FsbCA9IG5ldyBqcy5DYWxsKGxhenlHZXR0ZXIsIDxqcy5FeHByZXNzaW9uPltdLAogICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgIHB1c2goY2FsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljU3RvcmUoSFN0YXRpY1N0b3JlIG5vZGUpIHsKICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY1NldChub2RlLmVsZW1lbnQpKTsKICAgIGpzLk5vZGUgdmFyaWFibGUgPSBfZW1pdHRlci5zdGF0aWNGaWVsZEFjY2Vzcyhub2RlLmVsZW1lbnQpOwogICAgdXNlKG5vZGUuaW5wdXRzWzBdKTsKICAgIHB1c2gobmV3IGpzLkFzc2lnbm1lbnQodmFyaWFibGUsIHBvcCgpKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0cmluZ0NvbmNhdChIU3RyaW5nQ29uY2F0IG5vZGUpIHsKICAgIHVzZShub2RlLmxlZnQpOwogICAganMuRXhwcmVzc2lvbiBqc0xlZnQgPSBwb3AoKTsKICAgIHVzZShub2RlLnJpZ2h0KTsKICAgIHB1c2gobmV3IGpzLkJpbmFyeSgnKycsIGpzTGVmdCwgcG9wKCkpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5naWZ5KEhTdHJpbmdpZnkgbm9kZSkgewogICAgSEluc3RydWN0aW9uIGlucHV0ID0gbm9kZS5pbnB1dHMuZmlyc3Q7CiAgICBpZiAoaW5wdXQuaXNTdHJpbmcoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgdXNlKGlucHV0KTsKICAgIH0gZWxzZSBpZiAoaW5wdXQuaXNJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlIHx8CiAgICAgICAgaW5wdXQuaXNCb29sZWFuKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIC8vIEphdmFTY3JpcHQncyArIG9wZXJhdG9yIHdpdGggYSBzdHJpbmcgZm9yIHRoZSBsZWZ0IG9wZXJhbmQgd2lsbCBjb252ZXJ0CiAgICAgIC8vIHRoZSByaWdodCBvcGVyYW5kIHRvIGEgc3RyaW5nLCBhbmQgdGhlIGNvbnZlcnNpb24gcmVzdWx0IGlzIGNvcnJlY3QuCiAgICAgIHVzZShpbnB1dCk7CiAgICAgIGlmIChub2RlLnVzZWRCeS5sZW5ndGggPT0gMSAmJgogICAgICAgICAgbm9kZS51c2VkQnlbMF0gaXMgSFN0cmluZ0NvbmNhdCAmJgogICAgICAgICAgbm9kZS51c2VkQnlbMF0uaW5wdXRzWzFdID09IG5vZGUpIHsKICAgICAgICAvLyBUaGUgY29udGV4dCBpcyBhbHJlYWR5IDxzdHJpbmc+ICsgdmFsdWUuCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gRm9yY2UgYW4gZW1wdHkgc3RyaW5nIGZvciB0aGUgZmlyc3Qgb3BlcmFuZC4KICAgICAgICBwdXNoKG5ldyBqcy5CaW5hcnkoJysnLCBqcy5zdHJpbmcoIiIpLCBwb3AoKSkKICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIEZ1bmN0aW9uRW50aXR5IGNvbnZlcnRUb1N0cmluZyA9CiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuc3RyaW5nSW50ZXJwb2xhdGlvbkhlbHBlcjsKICAgICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKAogICAgICAgICAgbmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoY29udmVydFRvU3RyaW5nLCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpKTsKICAgICAganMuRXhwcmVzc2lvbiBqc0hlbHBlciA9IF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGNvbnZlcnRUb1N0cmluZyk7CiAgICAgIHVzZShpbnB1dCk7CiAgICAgIHB1c2gobmV3IGpzLkNhbGwoanNIZWxwZXIsIDxqcy5FeHByZXNzaW9uPltwb3AoKV0sCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogbm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpdGVyYWxMaXN0KEhMaXRlcmFsTGlzdCBub2RlKSB7CiAgICBfcmVnaXN0cnkKICAgICAgICAvLyBpZ25vcmU6ZGVwcmVjYXRlZF9tZW1iZXJfdXNlX2Zyb21fc2FtZV9wYWNrYWdlCiAgICAgICAgLnJlZ2lzdGVySW5zdGFudGlhdGVkQ2xhc3MoX2NvbW1vbkVsZW1lbnRzLmxpc3RDbGFzcyk7CiAgICBnZW5lcmF0ZUFycmF5TGl0ZXJhbChub2RlKTsKICB9CgogIHZvaWQgZ2VuZXJhdGVBcnJheUxpdGVyYWwoSExpdGVyYWxMaXN0IG5vZGUpIHsKICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gZWxlbWVudHMgPSBub2RlLmlucHV0cy5tYXAoKEhJbnN0cnVjdGlvbiBpbnB1dCkgewogICAgICB1c2UoaW5wdXQpOwogICAgICByZXR1cm4gcG9wKCk7CiAgICB9KS50b0xpc3QoKTsKICAgIHB1c2gobmV3IGpzLkFycmF5SW5pdGlhbGl6ZXIoZWxlbWVudHMpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5kZXgoSEluZGV4IG5vZGUpIHsKICAgIHVzZShub2RlLnJlY2VpdmVyKTsKICAgIGpzLkV4cHJlc3Npb24gcmVjZWl2ZXIgPSBwb3AoKTsKICAgIHVzZShub2RlLmluZGV4KTsKICAgIHB1c2gobmV3IGpzLlByb3BlcnR5QWNjZXNzKHJlY2VpdmVyLCBwb3AoKSkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbmRleEFzc2lnbihISW5kZXhBc3NpZ24gbm9kZSkgewogICAgdXNlKG5vZGUucmVjZWl2ZXIpOwogICAganMuRXhwcmVzc2lvbiByZWNlaXZlciA9IHBvcCgpOwogICAgdXNlKG5vZGUuaW5kZXgpOwogICAganMuRXhwcmVzc2lvbiBpbmRleCA9IHBvcCgpOwogICAgdXNlKG5vZGUudmFsdWUpOwogICAgcHVzaChuZXcganMuQXNzaWdubWVudChuZXcganMuUHJvcGVydHlBY2Nlc3MocmVjZWl2ZXIsIGluZGV4KSwgcG9wKCkpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICB2b2lkIGNoZWNrSW50KEhJbnN0cnVjdGlvbiBpbnB1dCwgU3RyaW5nIGNtcCkgewogICAgdXNlKGlucHV0KTsKICAgIGpzLkV4cHJlc3Npb24gbGVmdCA9IHBvcCgpOwogICAgdXNlKGlucHV0KTsKICAgIGpzLkV4cHJlc3Npb24gb3IwID0gbmV3IGpzLkJpbmFyeSgifCIsIHBvcCgpLCBuZXcganMuTGl0ZXJhbE51bWJlcigiMCIpKTsKICAgIHB1c2gobmV3IGpzLkJpbmFyeShjbXAsIGxlZnQsIG9yMCkpOwogIH0KCiAgdm9pZCBjaGVja0JpZ0ludCgKICAgICAgSEluc3RydWN0aW9uIGlucHV0LCBTdHJpbmcgY21wLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgdXNlKGlucHV0KTsKICAgIGpzLkV4cHJlc3Npb24gbGVmdCA9IHBvcCgpOwogICAgdXNlKGlucHV0KTsKICAgIGpzLkV4cHJlc3Npb24gcmlnaHQgPSBwb3AoKTsKICAgIC8vIFRPRE8oNDk4NCk6IERlYWwgd2l0aCBpbmZpbml0eSBhbmQgLTAuMC4KICAgIGpzLkV4cHJlc3Npb24gbWF0aEZsb29yQ2FsbCA9IGpzLmpzKCdNYXRoLmZsb29yKCMpJywKICAgICAgICA8anMuRXhwcmVzc2lvbj5bbGVmdF0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBwdXNoKGpzLmpzKCcjICRjbXAgIycsIDxqcy5FeHByZXNzaW9uPlsKICAgICAgbWF0aEZsb29yQ2FsbCwKICAgICAgcmlnaHQKICAgIF0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgdm9pZCBjaGVja1R5cGVPZihISW5zdHJ1Y3Rpb24gaW5wdXQsIFN0cmluZyBjbXAsIFN0cmluZyB0eXBlTmFtZSwKICAgICAgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIHVzZShpbnB1dCk7CiAgICBqcy5FeHByZXNzaW9uIHR5cGVPZiA9IG5ldyBqcy5QcmVmaXgoInR5cGVvZiIsIHBvcCgpKTsKICAgIHB1c2gobmV3IGpzLkJpbmFyeShjbXAsIHR5cGVPZiwganMuc3RyaW5nKHR5cGVOYW1lKSkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICB2b2lkIGNoZWNrTnVtKAogICAgICBISW5zdHJ1Y3Rpb24gaW5wdXQsIFN0cmluZyBjbXAsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICByZXR1cm4gY2hlY2tUeXBlT2YoaW5wdXQsIGNtcCwgJ251bWJlcicsIHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIHZvaWQgY2hlY2tEb3VibGUoCiAgICAgIEhJbnN0cnVjdGlvbiBpbnB1dCwgU3RyaW5nIGNtcCwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24pIHsKICAgIHJldHVybiBjaGVja051bShpbnB1dCwgY21wLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICB2b2lkIGNoZWNrU3RyaW5nKAogICAgICBISW5zdHJ1Y3Rpb24gaW5wdXQsIFN0cmluZyBjbXAsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICByZXR1cm4gY2hlY2tUeXBlT2YoaW5wdXQsIGNtcCwgJ3N0cmluZycsIHNvdXJjZUluZm9ybWF0aW9uKTsKICB9CgogIHZvaWQgY2hlY2tCb29sKAogICAgICBISW5zdHJ1Y3Rpb24gaW5wdXQsIFN0cmluZyBjbXAsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICByZXR1cm4gY2hlY2tUeXBlT2YoaW5wdXQsIGNtcCwgJ2Jvb2xlYW4nLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgfQoKICB2b2lkIGNoZWNrT2JqZWN0KAogICAgICBISW5zdHJ1Y3Rpb24gaW5wdXQsIFN0cmluZyBjbXAsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBhc3NlcnQoTnVsbENvbnN0YW50VmFsdWUuSnNOdWxsID09ICdudWxsJyk7CiAgICBpZiAoY21wID09ICI9PT0iKSB7CiAgICAgIGNoZWNrVHlwZU9mKGlucHV0LCAnPT09JywgJ29iamVjdCcsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAganMuRXhwcmVzc2lvbiBsZWZ0ID0gcG9wKCk7CiAgICAgIHVzZShpbnB1dCk7CiAgICAgIGpzLkV4cHJlc3Npb24gbm90TnVsbCA9IG5ldyBqcy5CaW5hcnkoIiE9PSIsIHBvcCgpLCBuZXcganMuTGl0ZXJhbE51bGwoKSk7CiAgICAgIHB1c2gobmV3IGpzLkJpbmFyeSgiJiYiLCBsZWZ0LCBub3ROdWxsKQogICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGNtcCA9PSAiIT09Iik7CiAgICAgIGNoZWNrVHlwZU9mKGlucHV0LCAnIT09JywgJ29iamVjdCcsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAganMuRXhwcmVzc2lvbiBsZWZ0ID0gcG9wKCk7CiAgICAgIHVzZShpbnB1dCk7CiAgICAgIGpzLkV4cHJlc3Npb24gZXFOdWxsID0gbmV3IGpzLkJpbmFyeSgiPT09IiwgcG9wKCksIG5ldyBqcy5MaXRlcmFsTnVsbCgpKTsKICAgICAgcHVzaChuZXcganMuQmluYXJ5KCJ8fCIsIGxlZnQsIGVxTnVsbCkKICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tBcnJheShISW5zdHJ1Y3Rpb24gaW5wdXQsIFN0cmluZyBjbXApIHsKICAgIHVzZShpbnB1dCk7CiAgICBqcy5Qcm9wZXJ0eUFjY2VzcyBjb25zdHJ1Y3RvciA9CiAgICAgICAgbmV3IGpzLlByb3BlcnR5QWNjZXNzLmZpZWxkKHBvcCgpLCAnY29uc3RydWN0b3InKTsKICAgIHB1c2gobmV3IGpzLkJpbmFyeShjbXAsIGNvbnN0cnVjdG9yLCBuZXcganMuVmFyaWFibGVVc2UoJ0FycmF5JykpKTsKICB9CgogIHZvaWQgY2hlY2tGaWVsZEV4aXN0cyhISW5zdHJ1Y3Rpb24gaW5wdXQsIFN0cmluZyBmaWVsZE5hbWUpIHsKICAgIHVzZShpbnB1dCk7CiAgICBqcy5Qcm9wZXJ0eUFjY2VzcyBmaWVsZCA9IG5ldyBqcy5Qcm9wZXJ0eUFjY2Vzcy5maWVsZChwb3AoKSwgZmllbGROYW1lKTsKICAgIC8vIERvdWJsZSBuZWdhdGUgdG8gYm9vbGlmeSB0aGUgcmVzdWx0LgogICAgcHVzaChuZXcganMuUHJlZml4KCchJywgbmV3IGpzLlByZWZpeCgnIScsIGZpZWxkKSkpOwogIH0KCiAgdm9pZCBjaGVja0ZpZWxkRG9lc05vdEV4aXN0KEhJbnN0cnVjdGlvbiBpbnB1dCwgU3RyaW5nIGZpZWxkTmFtZSkgewogICAgdXNlKGlucHV0KTsKICAgIGpzLlByb3BlcnR5QWNjZXNzIGZpZWxkID0gbmV3IGpzLlByb3BlcnR5QWNjZXNzLmZpZWxkKHBvcCgpLCBmaWVsZE5hbWUpOwogICAgcHVzaChuZXcganMuUHJlZml4KCchJywgZmllbGQpKTsKICB9CgogIHZvaWQgY2hlY2tJbW11dGFibGVBcnJheShISW5zdHJ1Y3Rpb24gaW5wdXQpIHsKICAgIGNoZWNrRmllbGRFeGlzdHMoaW5wdXQsICdpbW11dGFibGVcJGxpc3QnKTsKICB9CgogIHZvaWQgY2hlY2tNdXRhYmxlQXJyYXkoSEluc3RydWN0aW9uIGlucHV0KSB7CiAgICBjaGVja0ZpZWxkRG9lc05vdEV4aXN0KGlucHV0LCAnaW1tdXRhYmxlXCRsaXN0Jyk7CiAgfQoKICB2b2lkIGNoZWNrRXh0ZW5kYWJsZUFycmF5KEhJbnN0cnVjdGlvbiBpbnB1dCkgewogICAgY2hlY2tGaWVsZERvZXNOb3RFeGlzdChpbnB1dCwgJ2ZpeGVkXCRsZW5ndGgnKTsKICB9CgogIHZvaWQgY2hlY2tGaXhlZEFycmF5KEhJbnN0cnVjdGlvbiBpbnB1dCkgewogICAgY2hlY2tGaWVsZEV4aXN0cyhpbnB1dCwgJ2ZpeGVkXCRsZW5ndGgnKTsKICB9CgogIHZvaWQgY2hlY2tOdWxsKEhJbnN0cnVjdGlvbiBpbnB1dCkgewogICAgdXNlKGlucHV0KTsKICAgIHB1c2gobmV3IGpzLkJpbmFyeSgnPT0nLCBwb3AoKSwgbmV3IGpzLkxpdGVyYWxOdWxsKCkpKTsKICB9CgogIHZvaWQgY2hlY2tOb25OdWxsKEhJbnN0cnVjdGlvbiBpbnB1dCkgewogICAgdXNlKGlucHV0KTsKICAgIHB1c2gobmV3IGpzLkJpbmFyeSgnIT0nLCBwb3AoKSwgbmV3IGpzLkxpdGVyYWxOdWxsKCkpKTsKICB9CgogIHZvaWQgY2hlY2tUeXBlKEhJbnN0cnVjdGlvbiBpbnB1dCwgSEluc3RydWN0aW9uIGludGVyY2VwdG9yLCBEYXJ0VHlwZSB0eXBlLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAge2Jvb2wgbmVnYXRpdmU6IGZhbHNlfSkgewogICAgaWYgKHR5cGUuaXNJbnRlcmZhY2VUeXBlKSB7CiAgICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IHR5cGU7CiAgICAgIENsYXNzRW50aXR5IGVsZW1lbnQgPSBpbnRlcmZhY2VUeXBlLmVsZW1lbnQ7CiAgICAgIGlmIChlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MpIHsKICAgICAgICBjaGVja0FycmF5KGlucHV0LCBuZWdhdGl2ZSA/ICchPT0nIDogJz09PScpOwogICAgICAgIHJldHVybjsKICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5qc011dGFibGVBcnJheUNsYXNzKSB7CiAgICAgICAgaWYgKG5lZ2F0aXZlKSB7CiAgICAgICAgICBjaGVja0ltbXV0YWJsZUFycmF5KGlucHV0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2hlY2tNdXRhYmxlQXJyYXkoaW5wdXQpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuanNFeHRlbmRhYmxlQXJyYXlDbGFzcykgewogICAgICAgIGlmIChuZWdhdGl2ZSkgewogICAgICAgICAgY2hlY2tGaXhlZEFycmF5KGlucHV0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2hlY2tFeHRlbmRhYmxlQXJyYXkoaW5wdXQpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuanNGaXhlZEFycmF5Q2xhc3MpIHsKICAgICAgICBpZiAobmVnYXRpdmUpIHsKICAgICAgICAgIGNoZWNrRXh0ZW5kYWJsZUFycmF5KGlucHV0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2hlY2tGaXhlZEFycmF5KGlucHV0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLmpzVW5tb2RpZmlhYmxlQXJyYXlDbGFzcykgewogICAgICAgIGlmIChuZWdhdGl2ZSkgewogICAgICAgICAgY2hlY2tNdXRhYmxlQXJyYXkoaW5wdXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjaGVja0ltbXV0YWJsZUFycmF5KGlucHV0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBpZiAoaW50ZXJjZXB0b3IgIT0gbnVsbCkgewogICAgICBjaGVja1R5cGVWaWFQcm9wZXJ0eShpbnRlcmNlcHRvciwgdHlwZSwgc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgICBuZWdhdGl2ZTogbmVnYXRpdmUpOwogICAgfSBlbHNlIHsKICAgICAgY2hlY2tUeXBlVmlhUHJvcGVydHkoaW5wdXQsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uLCBuZWdhdGl2ZTogbmVnYXRpdmUpOwogICAgfQogIH0KCiAgdm9pZCBjaGVja1R5cGVWaWFQcm9wZXJ0eSgKICAgICAgSEluc3RydWN0aW9uIGlucHV0LCBEYXJ0VHlwZSB0eXBlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAge2Jvb2wgbmVnYXRpdmU6IGZhbHNlfSkgewogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyVHlwZVVzZShuZXcgVHlwZVVzZS5pc0NoZWNrKHR5cGUpKTsKCiAgICB1c2UoaW5wdXQpOwoKICAgIGpzLlByb3BlcnR5QWNjZXNzIGZpZWxkID0KICAgICAgICBuZXcganMuUHJvcGVydHlBY2Nlc3MocG9wKCksIF9uYW1lci5vcGVyYXRvcklzVHlwZSh0eXBlKSkKICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAvLyBXZSBhbHdheXMgbmVnYXRlIGF0IGxlYXN0IG9uY2Ugc28gdGhhdCB0aGUgcmVzdWx0IGlzIGJvb2xpZmllZC4KICAgIHB1c2gobmV3IGpzLlByZWZpeCgnIScsIGZpZWxkKS53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgIC8vIElmIHRoZSByZXN1bHQgaXMgbm90IG5lZ2F0ZWQsIHB1dCBhbm90aGVyICchJyBpbiBmcm9udC4KICAgIGlmICghbmVnYXRpdmUpIHsKICAgICAgcHVzaChuZXcganMuUHJlZml4KCchJywgcG9wKCkpLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogIH0KCiAgdm9pZCBjaGVja1R5cGVWaWFJbnN0YW5jZW9mKEhJbnN0cnVjdGlvbiBpbnB1dCwgSW50ZXJmYWNlVHlwZSB0eXBlLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAge2Jvb2wgbmVnYXRpdmU6IGZhbHNlfSkgewogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyVHlwZVVzZShuZXcgVHlwZVVzZS5pbnN0YW5jZUNvbnN0cnVjdG9yKHR5cGUpKTsKCiAgICB1c2UoaW5wdXQpOwoKICAgIGpzLkV4cHJlc3Npb24ganNDbGFzc1JlZmVyZW5jZSA9IF9lbWl0dGVyLmNvbnN0cnVjdG9yQWNjZXNzKHR5cGUuZWxlbWVudCk7CiAgICBwdXNoKGpzLmpzKCcjIGluc3RhbmNlb2YgIycsCiAgICAgICAgW3BvcCgpLCBqc0NsYXNzUmVmZXJlbmNlXSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICBpZiAobmVnYXRpdmUpIHsKICAgICAgcHVzaChuZXcganMuUHJlZml4KCchJywgcG9wKCkpLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogIH0KCiAgdm9pZCBoYW5kbGVOdW1iZXJPclN0cmluZ1N1cGVydHlwZUNoZWNrKAogICAgICBISW5zdHJ1Y3Rpb24gaW5wdXQsCiAgICAgIEhJbnN0cnVjdGlvbiBpbnRlcmNlcHRvciwKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAge2Jvb2wgbmVnYXRpdmU6IGZhbHNlfSkgewogICAgYXNzZXJ0KCFpZGVudGljYWwodHlwZS5lbGVtZW50LCBfY29tbW9uRWxlbWVudHMubGlzdENsYXNzKSAmJgogICAgICAgICFfY29tbW9uRWxlbWVudHMuaXNMaXN0U3VwZXJ0eXBlKHR5cGUuZWxlbWVudCkgJiYKICAgICAgICAhX2NvbW1vbkVsZW1lbnRzLmlzU3RyaW5nT25seVN1cGVydHlwZSh0eXBlLmVsZW1lbnQpKTsKICAgIFN0cmluZyByZWxhdGlvbiA9IG5lZ2F0aXZlID8gJyE9PScgOiAnPT09JzsKICAgIGNoZWNrTnVtKGlucHV0LCByZWxhdGlvbiwgc291cmNlSW5mb3JtYXRpb24pOwogICAganMuRXhwcmVzc2lvbiBudW1iZXJUZXN0ID0gcG9wKCk7CiAgICBjaGVja1N0cmluZyhpbnB1dCwgcmVsYXRpb24sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gc3RyaW5nVGVzdCA9IHBvcCgpOwogICAgY2hlY2tPYmplY3QoaW5wdXQsIHJlbGF0aW9uLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5FeHByZXNzaW9uIG9iamVjdFRlc3QgPSBwb3AoKTsKICAgIGNoZWNrVHlwZShpbnB1dCwgaW50ZXJjZXB0b3IsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uLCBuZWdhdGl2ZTogbmVnYXRpdmUpOwogICAgU3RyaW5nIGNvbWJpbmVyID0gbmVnYXRpdmUgPyAnJiYnIDogJ3x8JzsKICAgIFN0cmluZyBjb21iaW5lcjIgPSBuZWdhdGl2ZSA/ICd8fCcgOiAnJiYnOwogICAgcHVzaChuZXcganMuQmluYXJ5KAogICAgICAgICAgICBjb21iaW5lciwKICAgICAgICAgICAgbmV3IGpzLkJpbmFyeShjb21iaW5lciwgbnVtYmVyVGVzdCwgc3RyaW5nVGVzdCkKICAgICAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pLAogICAgICAgICAgICBuZXcganMuQmluYXJ5KGNvbWJpbmVyMiwgb2JqZWN0VGVzdCwgcG9wKCkpCiAgICAgICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICB2b2lkIGhhbmRsZVN0cmluZ1N1cGVydHlwZUNoZWNrKEhJbnN0cnVjdGlvbiBpbnB1dCwgSEluc3RydWN0aW9uIGludGVyY2VwdG9yLAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICB7Ym9vbCBuZWdhdGl2ZTogZmFsc2V9KSB7CiAgICBhc3NlcnQoIWlkZW50aWNhbCh0eXBlLmVsZW1lbnQsIF9jb21tb25FbGVtZW50cy5saXN0Q2xhc3MpICYmCiAgICAgICAgIV9jb21tb25FbGVtZW50cy5pc0xpc3RTdXBlcnR5cGUodHlwZS5lbGVtZW50KSAmJgogICAgICAgICFfY29tbW9uRWxlbWVudHMuaXNOdW1iZXJPclN0cmluZ1N1cGVydHlwZSh0eXBlLmVsZW1lbnQpKTsKICAgIFN0cmluZyByZWxhdGlvbiA9IG5lZ2F0aXZlID8gJyE9PScgOiAnPT09JzsKICAgIGNoZWNrU3RyaW5nKGlucHV0LCByZWxhdGlvbiwgc291cmNlSW5mb3JtYXRpb24pOwogICAganMuRXhwcmVzc2lvbiBzdHJpbmdUZXN0ID0gcG9wKCk7CiAgICBjaGVja09iamVjdChpbnB1dCwgcmVsYXRpb24sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gb2JqZWN0VGVzdCA9IHBvcCgpOwogICAgY2hlY2tUeXBlKGlucHV0LCBpbnRlcmNlcHRvciwgdHlwZSwgc291cmNlSW5mb3JtYXRpb24sIG5lZ2F0aXZlOiBuZWdhdGl2ZSk7CiAgICBTdHJpbmcgY29tYmluZXIgPSBuZWdhdGl2ZSA/ICd8fCcgOiAnJiYnOwogICAgcHVzaChuZXcganMuQmluYXJ5KG5lZ2F0aXZlID8gJyYmJyA6ICd8fCcsIHN0cmluZ1Rlc3QsCiAgICAgICAgbmV3IGpzLkJpbmFyeShjb21iaW5lciwgb2JqZWN0VGVzdCwgcG9wKCkpKSk7CiAgfQoKICB2b2lkIGhhbmRsZUxpc3RPclN1cGVydHlwZUNoZWNrKEhJbnN0cnVjdGlvbiBpbnB1dCwgSEluc3RydWN0aW9uIGludGVyY2VwdG9yLAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUsIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICB7Ym9vbCBuZWdhdGl2ZTogZmFsc2V9KSB7CiAgICBhc3NlcnQoIWlkZW50aWNhbCh0eXBlLmVsZW1lbnQsIF9jb21tb25FbGVtZW50cy5zdHJpbmdDbGFzcykgJiYKICAgICAgICAhX2NvbW1vbkVsZW1lbnRzLmlzU3RyaW5nT25seVN1cGVydHlwZSh0eXBlLmVsZW1lbnQpICYmCiAgICAgICAgIV9jb21tb25FbGVtZW50cy5pc051bWJlck9yU3RyaW5nU3VwZXJ0eXBlKHR5cGUuZWxlbWVudCkpOwogICAgU3RyaW5nIHJlbGF0aW9uID0gbmVnYXRpdmUgPyAnIT09JyA6ICc9PT0nOwogICAgY2hlY2tPYmplY3QoaW5wdXQsIHJlbGF0aW9uLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBqcy5FeHByZXNzaW9uIG9iamVjdFRlc3QgPSBwb3AoKTsKICAgIGNoZWNrQXJyYXkoaW5wdXQsIHJlbGF0aW9uKTsKICAgIGpzLkV4cHJlc3Npb24gYXJyYXlUZXN0ID0gcG9wKCk7CiAgICBjaGVja1R5cGUoaW5wdXQsIGludGVyY2VwdG9yLCB0eXBlLCBzb3VyY2VJbmZvcm1hdGlvbiwgbmVnYXRpdmU6IG5lZ2F0aXZlKTsKICAgIFN0cmluZyBjb21iaW5lciA9IG5lZ2F0aXZlID8gJyYmJyA6ICd8fCc7CiAgICBwdXNoKG5ldyBqcy5CaW5hcnkobmVnYXRpdmUgPyAnfHwnIDogJyYmJywgb2JqZWN0VGVzdCwKICAgICAgICAgICAgbmV3IGpzLkJpbmFyeShjb21iaW5lciwgYXJyYXlUZXN0LCBwb3AoKSkpCiAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdElzKEhJcyBub2RlKSB7CiAgICBlbWl0SXMobm9kZSwgIj09PSIsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdElzVmlhSW50ZXJjZXB0b3IoSElzVmlhSW50ZXJjZXB0b3Igbm9kZSkgewogICAgZW1pdElzVmlhSW50ZXJjZXB0b3Iobm9kZSwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbiwgbmVnYXRpdmU6IGZhbHNlKTsKICB9CgogIHZvaWQgZW1pdElzKEhJcyBub2RlLCBTdHJpbmcgcmVsYXRpb24sIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gbm9kZS50eXBlRXhwcmVzc2lvbjsKICAgIF9yZWdpc3RyeS5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaXNDaGVjayh0eXBlKSk7CiAgICBISW5zdHJ1Y3Rpb24gaW5wdXQgPSBub2RlLmV4cHJlc3Npb247CgogICAgLy8gSWYgdGhpcyBpcyBjaGFuZ2VkIHRvIHNpbmdsZSA9PSB0aGVyZSBhcmUgc2V2ZXJhbCBwbGFjZXMgYmVsb3cgdGhhdCBtdXN0CiAgICAvLyBiZSBjaGFuZ2VkIHRvIG1hdGNoLgogICAgYXNzZXJ0KHJlbGF0aW9uID09ICc9PT0nIHx8IHJlbGF0aW9uID09ICchPT0nKTsKICAgIGJvb2wgbmVnYXRpdmUgPSByZWxhdGlvbiA9PSAnIT09JzsKCiAgICBpZiAobm9kZS5pc1ZhcmlhYmxlQ2hlY2sgfHwgbm9kZS5pc0NvbXBvdW5kQ2hlY2spIHsKICAgICAgdXNlKG5vZGUuY2hlY2tDYWxsKTsKICAgICAgaWYgKG5lZ2F0aXZlKSBwdXNoKG5ldyBqcy5QcmVmaXgoJyEnLCBwb3AoKSkpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KG5vZGUuaXNSYXdDaGVjayk7CiAgICAgIEhJbnN0cnVjdGlvbiBpbnRlcmNlcHRvciA9IG5vZGUuaW50ZXJjZXB0b3I7CiAgICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IHR5cGU7CiAgICAgIENsYXNzRW50aXR5IGVsZW1lbnQgPSBpbnRlcmZhY2VUeXBlLmVsZW1lbnQ7CiAgICAgIGlmIChlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5udWxsQ2xhc3MpIHsKICAgICAgICBpZiAobmVnYXRpdmUpIHsKICAgICAgICAgIGNoZWNrTm9uTnVsbChpbnB1dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNoZWNrTnVsbChpbnB1dCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0KICAgICAgICAgIF9jb21tb25FbGVtZW50cy5vYmplY3RDbGFzcyAvKiB8fCB0eXBlLnRyZWF0QXNEeW5hbWljKi8pIHsKICAgICAgICAvLyBUaGUgY29uc3RhbnQgZm9sZGVyIGFsc28gZG9lcyB0aGlzIG9wdGltaXphdGlvbiwgYnV0IHdlIG1ha2UKICAgICAgICAvLyBpdCBzYWZlIGJ5IGFzc3VtaW5nIGl0IG1heSBoYXZlIG5vdCBydW4uCiAgICAgICAgcHVzaChuZXdMaXRlcmFsQm9vbCghbmVnYXRpdmUsIHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuc3RyaW5nQ2xhc3MpIHsKICAgICAgICBjaGVja1N0cmluZyhpbnB1dCwgcmVsYXRpb24sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5kb3VibGVDbGFzcykgewogICAgICAgIGNoZWNrRG91YmxlKGlucHV0LCByZWxhdGlvbiwgc291cmNlSW5mb3JtYXRpb24pOwogICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLm51bUNsYXNzKSB7CiAgICAgICAgY2hlY2tOdW0oaW5wdXQsIHJlbGF0aW9uLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PSBfY29tbW9uRWxlbWVudHMuYm9vbENsYXNzKSB7CiAgICAgICAgY2hlY2tCb29sKGlucHV0LCByZWxhdGlvbiwgc291cmNlSW5mb3JtYXRpb24pOwogICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLmludENsYXNzKSB7CiAgICAgICAgLy8gVGhlIGlzIGNoZWNrIGluIHRoZSBjb2RlIHRlbGxzIHVzIHRoYXQgaXQgbWlnaHQgbm90IGJlIGFuCiAgICAgICAgLy8gaW50LiBTbyB3ZSBkbyBhIHR5cGVvZiBmaXJzdCB0byBhdm9pZCBwb3NzaWJsZQogICAgICAgIC8vIGRlb3B0aW1pemF0aW9ucyBvbiB0aGUgSlMgZW5naW5lIGR1ZSB0byB0aGUgTWF0aC5mbG9vciBjaGVjay4KICAgICAgICBjaGVja051bShpbnB1dCwgcmVsYXRpb24sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgICBqcy5FeHByZXNzaW9uIG51bVRlc3QgPSBwb3AoKTsKICAgICAgICBjaGVja0JpZ0ludChpbnB1dCwgcmVsYXRpb24sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgICBwdXNoKG5ldyBqcy5CaW5hcnkobmVnYXRpdmUgPyAnfHwnIDogJyYmJywgbnVtVGVzdCwgcG9wKCkpCiAgICAgICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgfSBlbHNlIGlmIChub2RlLnVzZUluc3RhbmNlT2YpIHsKICAgICAgICBhc3NlcnQoaW50ZXJjZXB0b3IgPT0gbnVsbCk7CiAgICAgICAgY2hlY2tUeXBlVmlhSW5zdGFuY2VvZihpbnB1dCwgdHlwZSwgc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgICAgIG5lZ2F0aXZlOiBuZWdhdGl2ZSk7CiAgICAgIH0gZWxzZSBpZiAoX2NvbW1vbkVsZW1lbnRzLmlzTnVtYmVyT3JTdHJpbmdTdXBlcnR5cGUoZWxlbWVudCkpIHsKICAgICAgICBoYW5kbGVOdW1iZXJPclN0cmluZ1N1cGVydHlwZUNoZWNrKAogICAgICAgICAgICBpbnB1dCwgaW50ZXJjZXB0b3IsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgICAgICBuZWdhdGl2ZTogbmVnYXRpdmUpOwogICAgICB9IGVsc2UgaWYgKF9jb21tb25FbGVtZW50cy5pc1N0cmluZ09ubHlTdXBlcnR5cGUoZWxlbWVudCkpIHsKICAgICAgICBoYW5kbGVTdHJpbmdTdXBlcnR5cGVDaGVjayhpbnB1dCwgaW50ZXJjZXB0b3IsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgICAgICBuZWdhdGl2ZTogbmVnYXRpdmUpOwogICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLmxpc3RDbGFzcyB8fAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmlzTGlzdFN1cGVydHlwZShlbGVtZW50KSkgewogICAgICAgIGhhbmRsZUxpc3RPclN1cGVydHlwZUNoZWNrKGlucHV0LCBpbnRlcmNlcHRvciwgdHlwZSwgc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgICAgIG5lZ2F0aXZlOiBuZWdhdGl2ZSk7CiAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0Z1bmN0aW9uVHlwZSkgewogICAgICAgIGNoZWNrVHlwZShpbnB1dCwgaW50ZXJjZXB0b3IsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgICAgICBuZWdhdGl2ZTogbmVnYXRpdmUpOwogICAgICB9IGVsc2UgaWYgKChpbnB1dC5pc1ByaW1pdGl2ZShfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNQb3RlbnRpYWxseVRydWUgJiYKICAgICAgICAgICAgICBpbnB1dC5pc1ByaW1pdGl2ZUFycmF5KF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlGYWxzZSkgfHwKICAgICAgICAgIGlucHV0LmlzTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgICBjaGVja09iamVjdChpbnB1dCwgcmVsYXRpb24sIG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgICAgIGpzLkV4cHJlc3Npb24gb2JqZWN0VGVzdCA9IHBvcCgpOwogICAgICAgIGNoZWNrVHlwZShpbnB1dCwgaW50ZXJjZXB0b3IsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgICAgICBuZWdhdGl2ZTogbmVnYXRpdmUpOwogICAgICAgIHB1c2gobmV3IGpzLkJpbmFyeShuZWdhdGl2ZSA/ICd8fCcgOiAnJiYnLCBvYmplY3RUZXN0LCBwb3AoKSkKICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbikpOwogICAgICB9IGVsc2UgewogICAgICAgIGNoZWNrVHlwZShpbnB1dCwgaW50ZXJjZXB0b3IsIHR5cGUsIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgICAgICBuZWdhdGl2ZTogbmVnYXRpdmUpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGVtaXRJc1ZpYUludGVyY2VwdG9yKAogICAgICBISXNWaWFJbnRlcmNlcHRvciBub2RlLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAge2Jvb2wgbmVnYXRpdmU6IGZhbHNlfSkgewogICAgY2hlY2tUeXBlVmlhUHJvcGVydHkoCiAgICAgICAgbm9kZS5pbnRlcmNlcHRvciwgbm9kZS50eXBlRXhwcmVzc2lvbiwgc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgbmVnYXRpdmU6IG5lZ2F0aXZlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlQ29udmVyc2lvbihIVHlwZUNvbnZlcnNpb24gbm9kZSkgewogICAgYXNzZXJ0KG5vZGUuaXNUeXBlQ2hlY2sgfHwgbm9kZS5pc0Nhc3RDaGVjayk7CiAgICBEYXJ0VHlwZSB0eXBlID0gbm9kZS50eXBlRXhwcmVzc2lvbjsKICAgIGFzc2VydCghdHlwZS5pc1R5cGVkZWYpOwogICAgYXNzZXJ0KCF0eXBlLmlzRHluYW1pYyk7CiAgICBhc3NlcnQoIXR5cGUuaXNWb2lkKTsKICAgIGlmICh0eXBlLmlzRnVuY3Rpb25UeXBlKSB7CiAgICAgIC8vIFRPRE8oNTAyMik6IFdlIGN1cnJlbnRseSBnZW5lcmF0ZSAkaXNGdW5jdGlvbiBjaGVja3MgZm9yCiAgICAgIC8vIGZ1bmN0aW9uIHR5cGVzLgogICAgICBfcmVnaXN0cnkKICAgICAgICAgIC5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaXNDaGVjayhfY29tbW9uRWxlbWVudHMuZnVuY3Rpb25UeXBlKSk7CiAgICB9CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmlzQ2hlY2sodHlwZSkpOwoKICAgIENoZWNrZWRNb2RlSGVscGVyIGhlbHBlciA9IF9jaGVja2VkTW9kZUhlbHBlcnMuZ2V0Q2hlY2tlZE1vZGVIZWxwZXIoCiAgICAgICAgdHlwZSwgX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLAogICAgICAgIHR5cGVDYXN0OiBub2RlLmlzQ2FzdENoZWNrKTsKCiAgICBTdGF0aWNVc2Ugc3RhdGljVXNlID0gaGVscGVyLmdldFN0YXRpY1VzZShfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMpOwogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKHN0YXRpY1VzZSk7CiAgICBMaXN0PGpzLkV4cHJlc3Npb24+IGFyZ3VtZW50cyA9IDxqcy5FeHByZXNzaW9uPltdOwogICAgdXNlKG5vZGUuY2hlY2tlZElucHV0KTsKICAgIGFyZ3VtZW50cy5hZGQocG9wKCkpOwogICAgaGVscGVyLmdlbmVyYXRlQWRkaXRpb25hbEFyZ3VtZW50cyh0aGlzLCBfbmFtZXIsIG5vZGUsIGFyZ3VtZW50cyk7CiAgICBwdXNoKAogICAgICAgIG5ldyBqcy5DYWxsKF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKHN0YXRpY1VzZS5lbGVtZW50KSwgYXJndW1lbnRzKQogICAgICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQcmltaXRpdmVDaGVjayhIUHJpbWl0aXZlQ2hlY2sgbm9kZSkgewogICAganMuRXhwcmVzc2lvbiB0ZXN0ID0gX2dlbmVyYXRlUmVjZWl2ZXJPckFyZ3VtZW50VHlwZVRlc3Qobm9kZSk7CiAgICBqcy5CbG9jayBvbGRDb250YWluZXIgPSBjdXJyZW50Q29udGFpbmVyOwogICAganMuU3RhdGVtZW50IGJvZHkgPSBuZXcganMuQmxvY2suZW1wdHkoKTsKICAgIGN1cnJlbnRDb250YWluZXIgPSBib2R5OwogICAgaWYgKG5vZGUuaXNBcmd1bWVudFR5cGVDaGVjaykgewogICAgICBnZW5lcmF0ZVRocm93V2l0aEhlbHBlcigKICAgICAgICAgIF9jb21tb25FbGVtZW50cy50aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgbm9kZS5jaGVja2VkSW5wdXQsCiAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9IGVsc2UgaWYgKG5vZGUuaXNSZWNlaXZlclR5cGVDaGVjaykgewogICAgICB1c2Uobm9kZS5jaGVja2VkSW5wdXQpOwogICAgICBqcy5OYW1lIG1ldGhvZE5hbWUgPQogICAgICAgICAgX25hbWVyLmludm9jYXRpb25OYW1lKG5vZGUucmVjZWl2ZXJUeXBlQ2hlY2tTZWxlY3Rvcik7CiAgICAgIGpzLkV4cHJlc3Npb24gY2FsbCA9IGpzLnByb3BlcnR5Q2FsbCgKICAgICAgICAgIHBvcCgpLCBtZXRob2ROYW1lLCBbXSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgICBwdXNoU3RhdGVtZW50KAogICAgICAgICAgbmV3IGpzLlJldHVybihjYWxsKS53aXRoU291cmNlSW5mb3JtYXRpb24obm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogICAgfQogICAgY3VycmVudENvbnRhaW5lciA9IG9sZENvbnRhaW5lcjsKICAgIGJvZHkgPSB1bndyYXBTdGF0ZW1lbnQoYm9keSk7CiAgICBwdXNoU3RhdGVtZW50KG5ldyBqcy5JZi5ub0Vsc2UodGVzdCwgYm9keSkKICAgICAgICAud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIGpzLkV4cHJlc3Npb24gX2dlbmVyYXRlUmVjZWl2ZXJPckFyZ3VtZW50VHlwZVRlc3QoSFByaW1pdGl2ZUNoZWNrIG5vZGUpIHsKICAgIERhcnRUeXBlIHR5cGUgPSBub2RlLnR5cGVFeHByZXNzaW9uOwogICAgSEluc3RydWN0aW9uIGlucHV0ID0gbm9kZS5jaGVja2VkSW5wdXQ7CiAgICBBYnN0cmFjdFZhbHVlIGNoZWNrZWRUeXBlID0gbm9kZS5jaGVja2VkVHlwZTsKICAgIC8vIFRoaXMgcGF0aCBpcyBubyBsb25nZXIgdXNlZCBmb3IgaW5kZXhhYmxlIHByaW1pdGl2ZSB0eXBlcy4KICAgIGFzc2VydChfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0pzSW5kZXhhYmxlKGNoZWNrZWRUeXBlKS5pc1BvdGVudGlhbGx5RmFsc2UpOwogICAgLy8gRmlndXJlIG91dCBpZiBpdCBpcyBiZW5lZmljaWFsIHRvIHVzZSBhIG51bGwgY2hlY2suICBWOCBnZW5lcmFsbHkgcHJlZmVycwogICAgLy8gJ3R5cGVvZicgY2hlY2tzLCBidXQgZm9yIGludGVnZXJzIHdlIGNhbm5vdCBjb21waWxlIHRoaXMgdGVzdCBpbnRvIGEKICAgIC8vIHNpbmdsZSB0eXBlb2YgY2hlY2sgc28gdGhlIG51bGwgY2hlY2sgaXMgY2hlYXBlci4KICAgIGlmICh0eXBlID09IF9jb21tb25FbGVtZW50cy5udW1UeXBlKSB7CiAgICAgIC8vIGlucHV0IGlzICFudW0KICAgICAgY2hlY2tOdW0oaW5wdXQsICchPT0nLCBpbnB1dC5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIHJldHVybiBwb3AoKTsKICAgIH0KICAgIGlmICh0eXBlID09IF9jb21tb25FbGVtZW50cy5ib29sVHlwZSkgewogICAgICAvLyBpbnB1dCBpcyAhYm9vbAogICAgICBjaGVja0Jvb2woaW5wdXQsICchPT0nLCBpbnB1dC5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIHJldHVybiBwb3AoKTsKICAgIH0KICAgIHRocm93IGZhaWxlZEF0KGlucHV0LCAnVW5leHBlY3RlZCBjaGVjazogJHR5cGUuJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm9vbENvbnZlcnNpb24oSEJvb2xDb252ZXJzaW9uIG5vZGUpIHsKICAgIF9yZWdpc3RyeS5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaXNDaGVjayhfY29tbW9uRWxlbWVudHMuYm9vbFR5cGUpKTsKICAgIENoZWNrZWRNb2RlSGVscGVyIGhlbHBlciA9IGNvbnN0IENoZWNrZWRNb2RlSGVscGVyKCdib29sQ29udmVyc2lvbkNoZWNrJyk7CiAgICBTdGF0aWNVc2Ugc3RhdGljVXNlID0gaGVscGVyLmdldFN0YXRpY1VzZShfY29tbW9uRWxlbWVudHMpOwogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKHN0YXRpY1VzZSk7CiAgICB1c2Uobm9kZS5jaGVja2VkSW5wdXQpOwogICAgTGlzdDxqcy5FeHByZXNzaW9uPiBhcmd1bWVudHMgPSBbcG9wKCldOwogICAgcHVzaCgKICAgICAgICBuZXcganMuQ2FsbChfZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcyhzdGF0aWNVc2UuZWxlbWVudCksIGFyZ3VtZW50cykKICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUtub3duKEhUeXBlS25vd24gbm9kZSkgewogICAgLy8gW0hUeXBlS25vd25dIGluc3RydWN0aW9ucyBhcmUgcmVtb3ZlZCBiZWZvcmUgZ2VuZXJhdGluZyBjb2RlLgogICAgYXNzZXJ0KGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlSW5mb1JlYWRSYXcoSFR5cGVJbmZvUmVhZFJhdyBub2RlKSB7CiAgICB1c2Uobm9kZS5pbnB1dHNbMF0pOwogICAganMuRXhwcmVzc2lvbiByZWNlaXZlciA9IHBvcCgpOwogICAgcHVzaChqcy5qcyhyJyMuIycsIFtyZWNlaXZlciwgX25hbWVyLnJ0aUZpZWxkSnNOYW1lXSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVJbmZvUmVhZFZhcmlhYmxlKEhUeXBlSW5mb1JlYWRWYXJpYWJsZSBub2RlKSB7CiAgICBUeXBlVmFyaWFibGVFbnRpdHkgZWxlbWVudCA9IG5vZGUudmFyaWFibGUuZWxlbWVudDsKICAgIGludCBpbmRleCA9IGVsZW1lbnQuaW5kZXg7CgogICAganMuRXhwcmVzc2lvbiBpbnRlcmNlcHRvcjsKICAgIGlmIChub2RlLmlzSW50ZXJjZXB0ZWQpIHsKICAgICAgdXNlKG5vZGUuaW50ZXJjZXB0b3IpOwogICAgICBpbnRlcmNlcHRvciA9IHBvcCgpOwogICAgfQogICAgSEluc3RydWN0aW9uIG9iamVjdCA9IG5vZGUub2JqZWN0OwogICAgdXNlKG9iamVjdCk7CiAgICBqcy5FeHByZXNzaW9uIHJlY2VpdmVyID0gcG9wKCk7CgogICAgaWYgKHR5cGVWYXJpYWJsZUFjY2Vzc05lZWRzU3Vic3RpdHV0aW9uKGVsZW1lbnQsIG9iamVjdC5pbnN0cnVjdGlvblR5cGUpKSB7CiAgICAgIGpzLkV4cHJlc3Npb24gdHlwZU5hbWUgPQogICAgICAgICAganMucXVvdGVOYW1lKF9uYW1lci5ydW50aW1lVHlwZU5hbWUoZWxlbWVudC50eXBlRGVjbGFyYXRpb24pKTsKICAgICAgaWYgKG5vZGUuaXNJbnRlcmNlcHRlZCkgewogICAgICAgIEZ1bmN0aW9uRW50aXR5IGhlbHBlckVsZW1lbnQgPQogICAgICAgICAgICBfY29tbW9uRWxlbWVudHMuZ2V0UnVudGltZVR5cGVBcmd1bWVudEludGVyY2VwdGVkOwogICAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZSgKICAgICAgICAgICAgbmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoaGVscGVyRWxlbWVudCwgQ2FsbFN0cnVjdHVyZS5GT1VSX0FSR1MpKTsKICAgICAgICBqcy5FeHByZXNzaW9uIGhlbHBlciA9IF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGhlbHBlckVsZW1lbnQpOwogICAgICAgIHB1c2goanMuanMocicjKCMsICMsICMsICMpJywgWwogICAgICAgICAgaGVscGVyLAogICAgICAgICAgaW50ZXJjZXB0b3IsCiAgICAgICAgICByZWNlaXZlciwKICAgICAgICAgIHR5cGVOYW1lLAogICAgICAgICAganMuanMubnVtYmVyKGluZGV4KQogICAgICAgIF0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgRnVuY3Rpb25FbnRpdHkgaGVscGVyRWxlbWVudCA9IF9jb21tb25FbGVtZW50cy5nZXRSdW50aW1lVHlwZUFyZ3VtZW50OwogICAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICAgICAgaGVscGVyRWxlbWVudCwgQ2FsbFN0cnVjdHVyZS5USFJFRV9BUkdTKSk7CiAgICAgICAganMuRXhwcmVzc2lvbiBoZWxwZXIgPSBfZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcyhoZWxwZXJFbGVtZW50KTsKICAgICAgICBwdXNoKGpzLmpzKHInIygjLCAjLCAjKScsIFsKICAgICAgICAgIGhlbHBlciwKICAgICAgICAgIHJlY2VpdmVyLAogICAgICAgICAgdHlwZU5hbWUsCiAgICAgICAgICBqcy5qcy5udW1iZXIoaW5kZXgpCiAgICAgICAgXSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgaGVscGVyRWxlbWVudCA9IF9jb21tb25FbGVtZW50cy5nZXRUeXBlQXJndW1lbnRCeUluZGV4OwogICAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UoCiAgICAgICAgICBuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZShoZWxwZXJFbGVtZW50LCBDYWxsU3RydWN0dXJlLlRXT19BUkdTKSk7CiAgICAgIGpzLkV4cHJlc3Npb24gaGVscGVyID0gX2VtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoaGVscGVyRWxlbWVudCk7CiAgICAgIHB1c2goanMuanMocicjKCMsICMpJywgWwogICAgICAgIGhlbHBlciwKICAgICAgICByZWNlaXZlciwKICAgICAgICBqcy5qcy5udW1iZXIoaW5kZXgpCiAgICAgIF0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUluZm9FeHByZXNzaW9uKEhUeXBlSW5mb0V4cHJlc3Npb24gbm9kZSkgewogICAgRGFydFR5cGUgdHlwZSA9IG5vZGUuZGFydFR5cGU7CiAgICBpZiAobm9kZS5pc1R5cGVWYXJpYWJsZVJlcGxhY2VtZW50KSB7CiAgICAgIF9yZWdpc3RyeS5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UudHlwZUFyZ3VtZW50KHR5cGUpKTsKICAgIH0KCiAgICBMaXN0PGpzLkV4cHJlc3Npb24+IGFyZ3VtZW50cyA9IDxqcy5FeHByZXNzaW9uPltdOwogICAgZm9yIChISW5zdHJ1Y3Rpb24gaW5wdXQgaW4gbm9kZS5pbnB1dHMpIHsKICAgICAgdXNlKGlucHV0KTsKICAgICAgYXJndW1lbnRzLmFkZChwb3AoKSk7CiAgICB9CgogICAgc3dpdGNoIChub2RlLmtpbmQpIHsKICAgICAgY2FzZSBUeXBlSW5mb0V4cHJlc3Npb25LaW5kLkNPTVBMRVRFOgogICAgICAgIGludCBpbmRleCA9IDA7CiAgICAgICAganMuRXhwcmVzc2lvbiByZXN1bHQgPSBfcnRpRW5jb2Rlci5nZXRUeXBlUmVwcmVzZW50YXRpb24oCiAgICAgICAgICAgIF9lbWl0dGVyLCB0eXBlLCAoVHlwZVZhcmlhYmxlVHlwZSB2YXJpYWJsZSkgPT4gYXJndW1lbnRzW2luZGV4KytdKTsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgIGluZGV4ID09IG5vZGUuaW5wdXRzLmxlbmd0aCwKICAgICAgICAgICAgIk5vdCBhbGwgaW5wdXQgaXMgcmVhZCBmb3IgdHlwZSAke3R5cGV9OiAiCiAgICAgICAgICAgICIkaW5kZXggb2YgJHtub2RlLmlucHV0c30uIik7CiAgICAgICAgcHVzaChyZXN1bHQpOwogICAgICAgIHJldHVybjsKCiAgICAgIGNhc2UgVHlwZUluZm9FeHByZXNzaW9uS2luZC5JTlNUQU5DRToKICAgICAgICAvLyBXZSBleHBlY3Qgb25seSBmbGF0IHR5cGVzIGZvciB0aGUgSU5TVEFOQ0UgcmVwcmVzZW50YXRpb24uCiAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICAodHlwZSBhcyBJbnRlcmZhY2VUeXBlKS50eXBlQXJndW1lbnRzLmxlbmd0aCA9PSBhcmd1bWVudHMubGVuZ3RoKTsKICAgICAgICBfcmVnaXN0cnkKICAgICAgICAgICAgLy8gaWdub3JlOmRlcHJlY2F0ZWRfbWVtYmVyX3VzZV9mcm9tX3NhbWVfcGFja2FnZQogICAgICAgICAgICAucmVnaXN0ZXJJbnN0YW50aWF0ZWRDbGFzcyhfY29tbW9uRWxlbWVudHMubGlzdENsYXNzKTsKICAgICAgICBwdXNoKG5ldyBqcy5BcnJheUluaXRpYWxpemVyKGFyZ3VtZW50cykKICAgICAgICAgICAgLndpdGhTb3VyY2VJbmZvcm1hdGlvbihub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgfQoKICBib29sIHR5cGVWYXJpYWJsZUFjY2Vzc05lZWRzU3Vic3RpdHV0aW9uKAogICAgICBUeXBlVmFyaWFibGVFbnRpdHkgZWxlbWVudCwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlck1hc2spIHsKICAgIENsYXNzRW50aXR5IGNscyA9IGVsZW1lbnQudHlwZURlY2xhcmF0aW9uOwoKICAgIC8vIFNlZSBpZiB0aGUgcmVjZWl2ZXIgdHlwZSBuYXJyb3dzIHRoZSBzZXQgb2YgY2xhc3NlcyB0byBvbmVzIHRoYXQgY2FuIGJlCiAgICAvLyBpbmRleGVkLgogICAgLy8gVE9ETyhzcmEpOiBDdXJyZW50bHkgdGhlIG9ubHkgY29udmVuaWVudCBxdWVyeSBpcyBbc2luZ2xlQ2xhc3NdLiBXZQogICAgLy8gc2hvdWxkIGl0ZXJhdGUgb3ZlciBhbGwgdGhlIGNvbmNyZXRlIGNsYXNzZXMgaW4gW3JlY2VpdmVyTWFza10uCiAgICBDbGFzc0VudGl0eSByZWNlaXZlckNsYXNzID0KICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRFeGFjdENsYXNzKHJlY2VpdmVyTWFzayk7CiAgICBpZiAocmVjZWl2ZXJDbGFzcyAhPSBudWxsKSB7CiAgICAgIGlmIChfcnRpU3Vic3RpdHV0aW9ucy5pc1RyaXZpYWxTdWJzdGl0dXRpb24ocmVjZWl2ZXJDbGFzcywgY2xzKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGlmIChfY2xvc2VkV29ybGQuaXNVc2VkQXNNaXhpbihjbHMpKSByZXR1cm4gdHJ1ZTsKCiAgICByZXR1cm4gX2Nsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmFueVN0cmljdFN1YmNsYXNzT2YoY2xzLAogICAgICAgIChDbGFzc0VudGl0eSBzdWJjbGFzcykgewogICAgICByZXR1cm4gIV9ydGlTdWJzdGl0dXRpb25zLmlzVHJpdmlhbFN1YnN0aXR1dGlvbihzdWJjbGFzcywgY2xzKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJlZihIUmVmIG5vZGUpIHsKICAgIHZpc2l0KG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJc1Rlc3QoSElzVGVzdCBub2RlKSB7CiAgICBfcmVnaXN0cnkucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmlzQ2hlY2sobm9kZS5kYXJ0VHlwZSkpOwoKICAgIHVzZShub2RlLnR5cGVJbnB1dCk7CiAgICBqcy5FeHByZXNzaW9uIGZpcnN0ID0gcG9wKCk7CiAgICB1c2Uobm9kZS5jaGVja2VkSW5wdXQpOwogICAganMuRXhwcmVzc2lvbiBzZWNvbmQgPSBwb3AoKTsKCiAgICBGaWVsZEVudGl0eSBmaWVsZCA9IF9jb21tb25FbGVtZW50cy5ydGlJc0ZpZWxkOwogICAganMuTmFtZSBuYW1lID0gX25hbWVyLmluc3RhbmNlRmllbGRQcm9wZXJ0eU5hbWUoZmllbGQpOwoKICAgIHB1c2goanMuanMoJyMuIygjKScsIFtmaXJzdCwgbmFtZSwgc2Vjb25kXSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKAogICAgICAgIG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QXNDaGVjayhIQXNDaGVjayBub2RlKSB7CiAgICB1c2Uobm9kZS50eXBlSW5wdXQpOwogICAganMuRXhwcmVzc2lvbiBmaXJzdCA9IHBvcCgpOwogICAgdXNlKG5vZGUuY2hlY2tlZElucHV0KTsKICAgIGpzLkV4cHJlc3Npb24gc2Vjb25kID0gcG9wKCk7CgogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyVHlwZVVzZShUeXBlVXNlLmlzQ2hlY2sobm9kZS5jaGVja2VkVHlwZUV4cHJlc3Npb24pKTsKCiAgICBGaWVsZEVudGl0eSBmaWVsZCA9IG5vZGUuaXNUeXBlRXJyb3IKICAgICAgICA/IF9jb21tb25FbGVtZW50cy5ydGlDaGVja0ZpZWxkCiAgICAgICAgOiBfY29tbW9uRWxlbWVudHMucnRpQXNGaWVsZDsKICAgIGpzLk5hbWUgbmFtZSA9IF9uYW1lci5pbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lKGZpZWxkKTsKCiAgICBwdXNoKGpzLmpzKCcjLiMoIyknLCBbZmlyc3QsIG5hbWUsIHNlY29uZF0pLndpdGhTb3VyY2VJbmZvcm1hdGlvbigKICAgICAgICBub2RlLnNvdXJjZUluZm9ybWF0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEFzQ2hlY2tTaW1wbGUoSEFzQ2hlY2tTaW1wbGUgbm9kZSkgewogICAgdXNlKG5vZGUuY2hlY2tlZElucHV0KTsKICAgIE1lbWJlckVudGl0eSBtZXRob2QgPSBub2RlLm1ldGhvZDsKICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZSgKICAgICAgICBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKG1ldGhvZCwgQ2FsbFN0cnVjdHVyZS5PTkVfQVJHKSk7CiAgICBqcy5FeHByZXNzaW9uIG1ldGhvZEFjY2VzcyA9IF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKG1ldGhvZCk7CiAgICBwdXNoKGpzLmpzKHInIygjKScsIFttZXRob2RBY2Nlc3MsIHBvcCgpXSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKAogICAgICAgIG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3VidHlwZUNoZWNrKEhTdWJ0eXBlQ2hlY2sgbm9kZSkgewogICAgdGhyb3cgVW5pbXBsZW1lbnRlZEVycm9yKCdTc2FDb2RlR2VuZXJhdG9yLnZpc2l0U3VidHlwZUNoZWNrICAkbm9kZScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMb2FkVHlwZShITG9hZFR5cGUgbm9kZSkgewogICAgRnVuY3Rpb25FbnRpdHkgaGVscGVyRWxlbWVudCA9IF9jb21tb25FbGVtZW50cy5maW5kVHlwZTsKICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZSgKICAgICAgICBuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZShoZWxwZXJFbGVtZW50LCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpKTsKICAgIGpzLkV4cHJlc3Npb24gcmVjaXBlID0gX3J0aVJlY2lwZUVuY29kZXIuZW5jb2RlR3JvdW5kUmVjaXBlKAogICAgICAgIF9lbWl0dGVyLCBUeXBlRXhwcmVzc2lvblJlY2lwZShub2RlLnR5cGVFeHByZXNzaW9uKSk7CiAgICBqcy5FeHByZXNzaW9uIGhlbHBlciA9IF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGhlbHBlckVsZW1lbnQpOwogICAgcHVzaChqcy5qcyhyJyMoIyknLCBbaGVscGVyLCByZWNpcGVdKS53aXRoU291cmNlSW5mb3JtYXRpb24oCiAgICAgICAgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnN0YW5jZUVudmlyb25tZW50KEhJbnN0YW5jZUVudmlyb25tZW50IG5vZGUpIHsKICAgIHVzZShub2RlLmlucHV0cy5zaW5nbGUpOwogICAganMuRXhwcmVzc2lvbiByZWNlaXZlciA9IHBvcCgpOwogICAgLy8gVE9ETyhzcmEpOiBPcHRpbWl6ZSB0byBkaXJlY3QgZmllbGQgYWNjZXNzIHdoZXJlIHBvc3NpYmxlLgogICAgLy8KICAgIC8vICAgIHB1c2goanMuanMocicjLiMnLCBbcmVjZWl2ZXIsIF9uYW1lci5ydGlGaWVsZEpzTmFtZV0pKTsKCiAgICBGdW5jdGlvbkVudGl0eSBoZWxwZXJFbGVtZW50ID0gX2NvbW1vbkVsZW1lbnRzLmluc3RhbmNlVHlwZTsKICAgIF9yZWdpc3RyeS5yZWdpc3RlclN0YXRpY1VzZSgKICAgICAgICBuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZShoZWxwZXJFbGVtZW50LCBDYWxsU3RydWN0dXJlLk9ORV9BUkcpKTsKICAgIGpzLkV4cHJlc3Npb24gaGVscGVyID0gX2VtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoaGVscGVyRWxlbWVudCk7CiAgICBwdXNoKGpzLmpzKHInIygjKScsIFtoZWxwZXIsIHJlY2VpdmVyXSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKAogICAgICAgIG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHlwZUV2YWwoSFR5cGVFdmFsIG5vZGUpIHsKICAgIC8vIENhbGwgYGVudi5fZXZhbCgicmVjaXBlIilgLgogICAgdXNlKG5vZGUuaW5wdXRzWzBdKTsKICAgIGpzLkV4cHJlc3Npb24gZW52aXJvbm1lbnQgPSBwb3AoKTsKICAgIGpzLkV4cHJlc3Npb24gcmVjaXBlID0gX3J0aVJlY2lwZUVuY29kZXIuZW5jb2RlUmVjaXBlKAogICAgICAgIF9lbWl0dGVyLCBub2RlLmVudlN0cnVjdHVyZSwgbm9kZS50eXBlRXhwcmVzc2lvbik7CgogICAgTWVtYmVyRW50aXR5IG1ldGhvZCA9IF9jb21tb25FbGVtZW50cy5ydGlFdmFsTWV0aG9kOwogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBTZWxlY3Rvci5mcm9tRWxlbWVudChtZXRob2QpOwogICAganMuTmFtZSBtZXRob2RMaXRlcmFsID0gX25hbWVyLmludm9jYXRpb25OYW1lKHNlbGVjdG9yKTsKICAgIHB1c2goanMuanMoJyMuIygjKScsIFsKICAgICAgZW52aXJvbm1lbnQsCiAgICAgIG1ldGhvZExpdGVyYWwsCiAgICAgIHJlY2lwZQogICAgXSkud2l0aFNvdXJjZUluZm9ybWF0aW9uKG5vZGUuc291cmNlSW5mb3JtYXRpb24pKTsKCiAgICBfcmVnaXN0cnkucmVnaXN0ZXJTdGF0aWNVc2UoCiAgICAgICAgbmV3IFN0YXRpY1VzZS5kaXJlY3RJbnZva2UobWV0aG9kLCBzZWxlY3Rvci5jYWxsU3RydWN0dXJlLCBudWxsKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVCaW5kKEhUeXBlQmluZCBub2RlKSB7CiAgICAvLyBDYWxsIGBlbnYxLl9iaW5kKGVudjIpYC4KICAgIGFzc2VydChub2RlLmlucHV0cy5sZW5ndGggPT0gMik7CiAgICB1c2Uobm9kZS5pbnB1dHNbMF0pOwogICAganMuRXhwcmVzc2lvbiBlbnZpcm9ubWVudCA9IHBvcCgpOwogICAgdXNlKG5vZGUuaW5wdXRzWzFdKTsKICAgIGpzLkV4cHJlc3Npb24gZXh0ZW5zaW9ucyA9IHBvcCgpOwoKICAgIE1lbWJlckVudGl0eSBtZXRob2QgPSBfY29tbW9uRWxlbWVudHMucnRpQmluZE1ldGhvZDsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gU2VsZWN0b3IuZnJvbUVsZW1lbnQobWV0aG9k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KkEGATcuEhwGARksF0JQECk3KhYQASxGEE8SPkMwPQYEASxALwFPEEtHIDohSRYIBgE2AUAhRggEAQwdFwQBDB5DARkhHCIBNDwBRyIEAQwgGSEcIgFMASkoJjwBRyIEAQwsHCchQEhGIgQBDCpLBAEMIj0hS0E+SUEiBAEMOB0kQgdCAUEhS0lDIgQBDCIjGSc7OwE5Nj0bExUNNwEhSwQBDCIgJRknGSYBOTY9GxMVETcBIUsEAgElcGFja2FnZTpjb21waWxlci9zcmMvc3NhL2NvZGVnZW4uZGFydC9zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zc2Evb3B0aW1pemUuZGFydMACF3svLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL2NvZGVnZW4uZGFydCcgc2hvdyBDb2RlZ2VuUmVnaXN0cnk7CmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnIHNob3cgU2VsZWN0b3JzOwppbXBvcnQgJy4uL2NvbW1vbi90YXNrcy5kYXJ0JyBzaG93IE1lYXN1cmVyLCBDb21waWxlclRhc2s7CmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0YW50X3N5c3RlbS5kYXJ0JyBhcyBjb25zdGFudF9zeXN0ZW07CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBKQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCcKICAgIHNob3cgRmllbGRBbmFseXNpc0RhdGEsIEpGaWVsZEFuYWx5c2lzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvYmFja2VuZC5kYXJ0JyBzaG93IENvZGVnZW5JbnB1dHM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JyBzaG93IE5hdGl2ZURhdGE7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ydW50aW1lX3R5cGVzX2NvZGVnZW4uZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvdHlwZV9yZWNpcGUuZGFydCcgc2hvdyBUeXBlUmVjaXBlOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvc3BlY2lhbGl6ZWRfY2hlY2tzLmRhcnQnOwppbXBvcnQgJy4uL25hdGl2ZS9iZWhhdmlvci5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2lkZV9lZmZlY3RzLmRhcnQnIHNob3cgU2lkZUVmZmVjdHM7CmltcG9ydCAnLi4vdW5pdmVyc2UvdXNlLmRhcnQnIHNob3cgU3RhdGljVXNlOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICdpbnRlcmNlcHRvcl9zaW1wbGlmaWVyLmRhcnQnOwppbXBvcnQgJ2xvZ2dpbmcuZGFydCc7CmltcG9ydCAnbm9kZXMuZGFydCc7CmltcG9ydCAndHlwZXMuZGFydCc7CmltcG9ydCAndHlwZXNfcHJvcGFnYXRpb24uZGFydCc7CmltcG9ydCAndmFsdWVfcmFuZ2VfYW5hbHl6ZXIuZGFydCc7CmltcG9ydCAndmFsdWVfc2V0LmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgT3B0aW1pemF0aW9uUGhhc2UgewogIFN0cmluZyBnZXQgbmFtZTsKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKTsKfQoKY2xhc3MgU3NhT3B0aW1pemVyVGFzayBleHRlbmRzIENvbXBpbGVyVGFzayB7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwoKICBNYXA8SEluc3RydWN0aW9uLCBSYW5nZT4gcmFuZ2VzID0gPEhJbnN0cnVjdGlvbiwgUmFuZ2U+e307CgogIE1hcDxNZW1iZXJFbnRpdHksIE9wdGltaXphdGlvblRlc3RMb2c+IGxvZ2dlcnNGb3JUZXN0aW5nOwoKICBTc2FPcHRpbWl6ZXJUYXNrKE1lYXN1cmVyIG1lYXN1cmVyLCB0aGlzLl9vcHRpb25zKSA6IHN1cGVyKG1lYXN1cmVyKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICdTU0Egb3B0aW1pemVyJzsKCiAgdm9pZCBvcHRpbWl6ZSgKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciwKICAgICAgSEdyYXBoIGdyYXBoLAogICAgICBDb2RlZ2VuSW5wdXRzIGNvZGVnZW4sCiAgICAgIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCwKICAgICAgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywKICAgICAgQ29kZWdlblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7CiAgICB2b2lkIHJ1blBoYXNlKE9wdGltaXphdGlvblBoYXNlIHBoYXNlKSB7CiAgICAgIG1lYXN1cmVTdWJ0YXNrKHBoYXNlLm5hbWUsICgpID0+IHBoYXNlLnZpc2l0R3JhcGgoZ3JhcGgpKTsKICAgICAgY29kZWdlbi50cmFjZXIudHJhY2VHcmFwaChwaGFzZS5uYW1lLCBncmFwaCk7CiAgICAgIGFzc2VydChncmFwaC5pc1ZhbGlkKCksICdHcmFwaCBub3QgdmFsaWQgYWZ0ZXIgJHtwaGFzZS5uYW1lfScpOwogICAgfQoKICAgIGJvb2wgdHJ1c3RQcmltaXRpdmVzID0gX29wdGlvbnMudHJ1c3RQcmltaXRpdmVzOwogICAgU2V0PEhJbnN0cnVjdGlvbj4gYm91bmRzQ2hlY2tlZCA9IG5ldyBTZXQ8SEluc3RydWN0aW9uPigpOwogICAgU3NhQ29kZU1vdGlvbiBjb2RlTW90aW9uOwogICAgU3NhTG9hZEVsaW1pbmF0aW9uIGxvYWRFbGltaW5hdGlvbjsKCiAgICBPcHRpbWl6YXRpb25UZXN0TG9nIGxvZzsKICAgIGlmIChyZXRhaW5EYXRhRm9yVGVzdGluZykgewogICAgICBsb2dnZXJzRm9yVGVzdGluZyA/Pz0ge307CiAgICAgIGxvZ2dlcnNGb3JUZXN0aW5nW21lbWJlcl0gPSBsb2cgPSBuZXcgT3B0aW1pemF0aW9uVGVzdExvZygpOwogICAgfQoKICAgIG1lYXN1cmUoKCkgewogICAgICBMaXN0PE9wdGltaXphdGlvblBoYXNlPiBwaGFzZXMgPSA8T3B0aW1pemF0aW9uUGhhc2U+WwogICAgICAgIC8vIFJ1biB0cml2aWFsIGluc3RydWN0aW9uIHNpbXBsaWZpY2F0aW9uIGZpcnN0IHRvIG9wdGltaXplCiAgICAgICAgLy8gc29tZSBwYXR0ZXJucyB1c2VmdWwgZm9yIHR5cGUgY29udmVyc2lvbi4KICAgICAgICBuZXcgU3NhSW5zdHJ1Y3Rpb25TaW1wbGlmaWVyKGdsb2JhbEluZmVyZW5jZVJlc3VsdHMsIF9vcHRpb25zLAogICAgICAgICAgICBjb2RlZ2VuLnJ0aVN1YnN0aXR1dGlvbnMsIGNsb3NlZFdvcmxkLCByZWdpc3RyeSwgbG9nKSwKICAgICAgICBuZXcgU3NhVHlwZUNvbnZlcnNpb25JbnNlcnRlcihjbG9zZWRXb3JsZCksCiAgICAgICAgbmV3IFNzYVJlZHVuZGFudFBoaUVsaW1pbmF0b3IoKSwKICAgICAgICBuZXcgU3NhRGVhZFBoaUVsaW1pbmF0b3IoKSwKICAgICAgICBuZXcgU3NhVHlwZVByb3BhZ2F0b3IoZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywKICAgICAgICAgICAgY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMsIGNsb3NlZFdvcmxkLCBsb2cpLAogICAgICAgIC8vIEFmdGVyIHR5cGUgcHJvcGFnYXRpb24sIG1vcmUgaW5zdHJ1Y3Rpb25zIGNhbiBiZQogICAgICAgIC8vIHNpbXBsaWZpZWQuCiAgICAgICAgbmV3IFNzYUluc3RydWN0aW9uU2ltcGxpZmllcihnbG9iYWxJbmZlcmVuY2VSZXN1bHRzLCBfb3B0aW9ucywKICAgICAgICAgICAgY29kZWdlbi5ydGlTdWJzdGl0dXRpb25zLCBjbG9zZWRXb3JsZCwgcmVnaXN0cnksIGxvZyksCiAgICAgICAgbmV3IFNzYUNoZWNrSW5zZXJ0ZXIodHJ1c3RQcmltaXRpdmVzLCBjbG9zZWRXb3JsZCwgYm91bmRzQ2hlY2tlZCksCiAgICAgICAgbmV3IFNzYUluc3RydWN0aW9uU2ltcGxpZmllcihnbG9iYWxJbmZlcmVuY2VSZXN1bHRzLCBfb3B0aW9ucywKICAgICAgICAgICAgY29kZWdlbi5ydGlTdWJzdGl0dXRpb25zLCBjbG9zZWRXb3JsZCwgcmVnaXN0cnksIGxvZyksCiAgICAgICAgbmV3IFNzYUNoZWNrSW5zZXJ0ZXIodHJ1c3RQcmltaXRpdmVzLCBjbG9zZWRXb3JsZCwgYm91bmRzQ2hlY2tlZCksCiAgICAgICAgbmV3IFNzYVR5cGVQcm9wYWdhdG9yKGdsb2JhbEluZmVyZW5jZVJlc3VsdHMsCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLCBjbG9zZWRXb3JsZCwgbG9nKSwKICAgICAgICAvLyBSdW4gYSBkZWFkIGNvZGUgZWxpbWluYXRvciBiZWZvcmUgTElDTSBiZWNhdXNlIGRlYWQKICAgICAgICAvLyBpbnRlcmNlcHRvcnMgYXJlIG9mdGVuIGluIHRoZSB3YXkgb2YgTElDTSdhYmxlIGluc3RydWN0aW9ucy4KICAgICAgICBuZXcgU3NhRGVhZENvZGVFbGltaW5hdG9yKGNsb3NlZFdvcmxkLCB0aGlzKSwKICAgICAgICBuZXcgU3NhR2xvYmFsVmFsdWVOdW1iZXJlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKSwKICAgICAgICAvLyBBZnRlciBHVk4sIHNvbWUgaW5zdHJ1Y3Rpb25zIG1pZ2h0IG5lZWQgdGhlaXIgdHlwZSB0byBiZQogICAgICAgIC8vIHVwZGF0ZWQgYmVjYXVzZSB0aGV5IG5vdyBoYXZlIGRpZmZlcmVudCBpbnB1dHMuCiAgICAgICAgbmV3IFNzYVR5cGVQcm9wYWdhdG9yKGdsb2JhbEluZmVyZW5jZVJlc3VsdHMsCiAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLCBjbG9zZWRXb3JsZCwgbG9nKSwKICAgICAgICBjb2RlTW90aW9uID0gbmV3IFNzYUNvZGVNb3Rpb24oY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbiksCiAgICAgICAgbG9hZEVsaW1pbmF0aW9uID0gbmV3IFNzYUxvYWRFbGltaW5hdGlvbihjbG9zZWRXb3JsZCksCiAgICAgICAgbmV3IFNzYVJlZHVuZGFudFBoaUVsaW1pbmF0b3IoKSwKICAgICAgICBuZXcgU3NhRGVhZFBoaUVsaW1pbmF0b3IoKSwKICAgICAgICAvLyBBZnRlciBHVk4gYW5kIGxvYWQgZWxpbWluYXRpb24gdGhlIHNhbWUgdmFsdWUgbWF5IGJlIHVzZWQgaW4gY29kZQogICAgICAgIC8vIGNvbnRyb2xsZWQgYnkgYSB0ZXN0IG9uIHRoZSB2YWx1ZSwgc28gcmVkbyAnY29udmVyc2lvbiBpbnNlcnRpb24nIHRvCiAgICAgICAgLy8gbGVhcm4gZnJvbSB0aGUgcmVmaW5lZCB0eXBlLgogICAgICAgIG5ldyBTc2FUeXBlQ29udmVyc2lvbkluc2VydGVyKGNsb3NlZFdvcmxkKSwKICAgICAgICBuZXcgU3NhVHlwZVByb3BhZ2F0b3IoZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywKICAgICAgICAgICAgY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMsIGNsb3NlZFdvcmxkLCBsb2cpLAogICAgICAgIG5ldyBTc2FWYWx1ZVJhbmdlQW5hbHl6ZXIoY2xvc2VkV29ybGQsIHRoaXMpLAogICAgICAgIC8vIFByZXZpb3VzIG9wdGltaXphdGlvbnMgbWF5IGhhdmUgZ2VuZXJhdGVkIG5ldwogICAgICAgIC8vIG9wcG9ydHVuaXRpZXMgZm9yIGluc3RydWN0aW9uIHNpbXBsaWZpY2F0aW9uLgogICAgICAgIG5ldyBTc2FJbnN0cnVjdGlvblNpbXBsaWZpZXIoZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywgX29wdGlvbnMsCiAgICAgICAgICAgIGNvZGVnZW4ucnRpU3Vic3RpdHV0aW9ucywgY2xvc2VkV29ybGQsIHJlZ2lzdHJ5LCBsb2cpLAogICAgICAgIG5ldyBTc2FDaGVja0luc2VydGVyKHRydXN0UHJpbWl0aXZlcywgY2xvc2VkV29ybGQsIGJvdW5kc0NoZWNrZWQpLAogICAgICBdOwogICAgICBwaGFzZXMuZm9yRWFjaChydW5QaGFzZSk7CgogICAgICAvLyBTaW1wbGlmeWluZyBpbnRlcmNlcHRvcnMgaXMgbm90IHN0cmljdGx5IGp1c3QgYW4gb3B0aW1pemF0aW9uLCBpdCBpcwogICAgICAvLyByZXF1aXJlZCBmb3IgaW1wbGVtZW50YXRpb24gY29ycmVjdG5lc3MgYmVjYXVzZSB0aGUgY29kZSBnZW5lcmF0b3IKICAgICAgLy8gYXNzdW1lcyBpdCBpcyBhbHdheXMgcGVyZm9ybWVkLgogICAgICBydW5QaGFzZShuZXcgU3NhU2ltcGxpZnlJbnRlcmNlcHRvcnMoY2xvc2VkV29ybGQsIG1lbWJlci5lbmNsb3NpbmdDbGFzcykpOwoKICAgICAgU3NhRGVhZENvZGVFbGltaW5hdG9yIGRjZSA9IG5ldyBTc2FEZWFkQ29kZUVsaW1pbmF0b3IoY2xvc2VkV29ybGQsIHRoaXMpOwogICAgICBydW5QaGFzZShkY2UpOwogICAgICBpZiAoY29kZU1vdGlvbi5tb3ZlZENvZGUgfHwKICAgICAgICAgIGRjZS5lbGltaW5hdGVkU2lkZUVmZmVjdHMgfHwKICAgICAgICAgIGxvYWRFbGltaW5hdGlvbi5uZXdHdm5DYW5kaWRhdGVzKSB7CiAgICAgICAgcGhhc2VzID0gPE9wdGltaXphdGlvblBoYXNlPlsKICAgICAgICAgIG5ldyBTc2FUeXBlUHJvcGFnYXRvcihnbG9iYWxJbmZlcmVuY2VSZXN1bHRzLAogICAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLCBjbG9zZWRXb3JsZCwgbG9nKSwKICAgICAgICAgIG5ldyBTc2FHbG9iYWxWYWx1ZU51bWJlcmVyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLAogICAgICAgICAgbmV3IFNzYUNvZGVNb3Rpb24oY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbiksCiAgICAgICAgICBuZXcgU3NhVmFsdWVSYW5nZUFuYWx5emVyKGNsb3NlZFdvcmxkLCB0aGlzKSwKICAgICAgICAgIG5ldyBTc2FJbnN0cnVjdGlvblNpbXBsaWZpZXIoZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywgX29wdGlvbnMsCiAgICAgICAgICAgICAgY29kZWdlbi5ydGlTdWJzdGl0dXRpb25zLCBjbG9zZWRXb3JsZCwgcmVnaXN0cnksIGxvZyksCiAgICAgICAgICBuZXcgU3NhQ2hlY2tJbnNlcnRlcih0cnVzdFByaW1pdGl2ZXMsIGNsb3NlZFdvcmxkLCBib3VuZHNDaGVja2VkKSwKICAgICAgICAgIG5ldyBTc2FTaW1wbGlmeUludGVyY2VwdG9ycyhjbG9zZWRXb3JsZCwgbWVtYmVyLmVuY2xvc2luZ0NsYXNzKSwKICAgICAgICAgIG5ldyBTc2FEZWFkQ29kZUVsaW1pbmF0b3IoY2xvc2VkV29ybGQsIHRoaXMpLAogICAgICAgIF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGhhc2VzID0gPE9wdGltaXphdGlvblBoYXNlPlsKICAgICAgICAgIG5ldyBTc2FUeXBlUHJvcGFnYXRvcihnbG9iYWxJbmZlcmVuY2VSZXN1bHRzLAogICAgICAgICAgICAgIGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLCBjbG9zZWRXb3JsZCwgbG9nKSwKICAgICAgICAgIC8vIFJ1biB0aGUgc2ltcGxpZmllciB0byByZW1vdmUgdW5uZWVkZWQgdHlwZSBjaGVja3MgaW5zZXJ0ZWQgYnkKICAgICAgICAgIC8vIHR5cGUgcHJvcGFnYXRpb24uCiAgICAgICAgICBuZXcgU3NhSW5zdHJ1Y3Rpb25TaW1wbGlmaWVyKGdsb2JhbEluZmVyZW5jZVJlc3VsdHMsIF9vcHRpb25zLAogICAgICAgICAgICAgIGNvZGVnZW4ucnRpU3Vic3RpdHV0aW9ucywgY2xvc2VkV29ybGQsIHJlZ2lzdHJ5LCBsb2cpLAogICAgICAgIF07CiAgICAgIH0KICAgICAgcGhhc2VzLmZvckVhY2gocnVuUGhhc2UpOwogICAgfSk7CiAgfQp9CgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW21hc2tdIHJlcHJlc2VudHMgb25seSB0eXBlcyB0aGF0IGhhdmUgYSBsZW5ndGggdGhhdAovLy8gY2Fubm90IGNoYW5nZS4gIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIGNvbnNlcnZhdGl2ZSBmb3IgdGhlIHB1cnBvc2UKLy8vIG9mIGlkZW50aWZ5aW5nIGd2bi1hYmxlIGxlbmd0aHMgYW5kIG1pcy1pZGVudGlmaWVzIHNvbWUgdW5pb25zIG9mIGZpeGVkCi8vLyBsZW5ndGggaW5kZXhhYmxlcyAoc2VlIFRPRE8pIGFzIG5vdCBmaXhlZCBsZW5ndGguCmJvb2wgaXNGaXhlZExlbmd0aChBYnN0cmFjdFZhbHVlIG1hc2ssIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZCkgewogIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiA9IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CiAgaWYgKGFic3RyYWN0VmFsdWVEb21haW4uaXNDb250YWluZXIobWFzaykgJiYKICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRDb250YWluZXJMZW5ndGgobWFzaykgIT0gbnVsbCkgewogICAgLy8gQSBjb250YWluZXIgb24gd2hpY2ggd2UgaGF2ZSBpbmZlcnJlZCB0aGUgbGVuZ3RoLgogICAgcmV0dXJuIHRydWU7CiAgfQogIC8vIFRPRE8oc3JhKTogUmVjb2duaXplIGFueSBjb21iaW5hdGlvbiBvZiBmaXhlZCBsZW5ndGggaW5kZXhhYmxlcy4KICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0ZpeGVkQXJyYXkobWFzaykuaXNEZWZpbml0ZWx5VHJ1ZSB8fAogICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmlzU3RyaW5nT3JOdWxsKG1hc2spLmlzRGVmaW5pdGVseVRydWUgfHwKICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5pc1R5cGVkQXJyYXkobWFzaykuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBmYWxzZTsKfQoKLy8vIElmIGJvdGggaW5wdXRzIHRvIGtub3duIG9wZXJhdGlvbnMgYXJlIGF2YWlsYWJsZSBleGVjdXRlIHRoZSBvcGVyYXRpb24gYXQKLy8vIGNvbXBpbGUtdGltZS4KY2xhc3MgU3NhSW5zdHJ1Y3Rpb25TaW1wbGlmaWVyIGV4dGVuZHMgSEJhc2VWaXNpdG9yCiAgICBpbXBsZW1lbnRzIE9wdGltaXphdGlvblBoYXNlIHsKICAvLyBXZSBkb24ndCBwcm9kdWNlIGNvbnN0YW50LWZvbGRlZCBzdHJpbmdzIGxvbmdlciB0aGFuIHRoaXMgdW5sZXNzIHRoZXkgaGF2ZQogIC8vIGEgc2luZ2xlIHVzZS4gIFRoaXMgcHJvdGVjdHMgYWdhaW5zdCBleHBvbmVudGlhbGx5IGxhcmdlIGNvbnN0YW50IGZvbGRlZAogIC8vIHN0cmluZ3MuCiAgc3RhdGljIGNvbnN0IE1BWF9TSEFSRURfQ09OU1RBTlRfRk9MREVEX1NUUklOR19MRU5HVEggPSA1MTI7CgogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gIlNzYUluc3RydWN0aW9uU2ltcGxpZmllciI7CiAgZmluYWwgR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHMgX2dsb2JhbEluZmVyZW5jZVJlc3VsdHM7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIGZpbmFsIFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnMgX3J0aVN1YnN0aXR1dGlvbnM7CiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKICBmaW5hbCBDb2RlZ2VuUmVnaXN0cnkgX3JlZ2lzdHJ5OwogIGZpbmFsIE9wdGltaXphdGlvblRlc3RMb2cgX2xvZzsKICBIR3JhcGggX2dyYXBoOwoKICBTc2FJbnN0cnVjdGlvblNpbXBsaWZpZXIodGhpcy5fZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywgdGhpcy5fb3B0aW9ucywKICAgICAgdGhpcy5fcnRpU3Vic3RpdHV0aW9ucywgdGhpcy5fY2xvc2VkV29ybGQsIHRoaXMuX3JlZ2lzdHJ5LCB0aGlzLl9sb2cpOwoKICBKQ29tbW9uRWxlbWVudHMgZ2V0IGNvbW1vbkVsZW1lbnRzID0+IF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50czsKCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgX2Fic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgX2Nsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIE5hdGl2ZURhdGEgZ2V0IF9uYXRpdmVEYXRhID0+IF9jbG9zZWRXb3JsZC5uYXRpdmVEYXRhOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIHZpc2l0ZWUpIHsKICAgIF9ncmFwaCA9IHZpc2l0ZWU7CiAgICB2aXNpdERvbWluYXRvclRyZWUodmlzaXRlZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIHNpbXBsaWZ5UGhpcyhibG9jayk7CiAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBibG9jay5maXJzdDsKICAgIHdoaWxlIChpbnN0cnVjdGlvbiAhPSBudWxsKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBuZXh0ID0gaW5zdHJ1Y3Rpb24ubmV4dDsKICAgICAgSEluc3RydWN0aW9uIHJlcGxhY2VtZW50ID0gaW5zdHJ1Y3Rpb24uYWNjZXB0KHRoaXMpOwogICAgICBpZiAocmVwbGFjZW1lbnQgIT0gaW5zdHJ1Y3Rpb24pIHsKICAgICAgICBibG9jay5yZXdyaXRlKGluc3RydWN0aW9uLCByZXBsYWNlbWVudCk7CgogICAgICAgIC8vIFRoZSBpbnRlcnNlY3Rpb24gb2YgZG91YmxlIGFuZCBpbnQgcmV0dXJuIGNvbmZsaWN0aW5nLCBhbmQKICAgICAgICAvLyBiZWNhdXNlIG9mIG91ciBudW1iZXIgaW1wbGVtZW50YXRpb24gZm9yIEphdmFTY3JpcHQsIGl0CiAgICAgICAgLy8gbWlnaHQgYmUgdGhhdCBhbiBvcGVyYXRpb24gdGhvdWdodCB0byByZXR1cm4gZG91YmxlLCBjYW4gYmUKICAgICAgICAvLyBzaW1wbGlmaWVkIHRvIGFuIGludC4gRm9yIGV4YW1wbGU6CiAgICAgICAgLy8gYDIuNSAqIDEwYC4KICAgICAgICBpZiAoIShyZXBsYWNlbWVudAogICAgICAgICAgICAgICAgLmlzTnVtYmVyT3JOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICAgICAgaW5zdHJ1Y3Rpb24KICAgICAgICAgICAgICAgIC5pc051bWJlck9yTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSkgewogICAgICAgICAgLy8gSWYgd2UgY2FuIHJlcGxhY2UgW2luc3RydWN0aW9uXSB3aXRoIFtyZXBsYWNlbWVudF0sIHRoZW4KICAgICAgICAgIC8vIFtyZXBsYWNlbWVudF0ncyB0eXBlIGNhbiBiZSBuYXJyb3dlZC4KICAgICAgICAgIEFic3RyYWN0VmFsdWUgbmV3VHlwZSA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLmludGVyc2VjdGlvbigKICAgICAgICAgICAgICByZXBsYWNlbWVudC5pbnN0cnVjdGlvblR5cGUsIGluc3RydWN0aW9uLmluc3RydWN0aW9uVHlwZSk7CiAgICAgICAgICByZXBsYWNlbWVudC5pbnN0cnVjdGlvblR5cGUgPSBuZXdUeXBlOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgdGhlIHJlcGxhY2VtZW50IGluc3RydWN0aW9uIGRvZXMgbm90IGtub3cgaXRzCiAgICAgICAgLy8gc291cmNlIGVsZW1lbnQsIHVzZSB0aGUgc291cmNlIGVsZW1lbnQgb2YgdGhlCiAgICAgICAgLy8gaW5zdHJ1Y3Rpb24uCiAgICAgICAgcmVwbGFjZW1lbnQuc291cmNlRWxlbWVudCA/Pz0gaW5zdHJ1Y3Rpb24uc291cmNlRWxlbWVudDsKICAgICAgICByZXBsYWNlbWVudC5zb3VyY2VJbmZvcm1hdGlvbiA/Pz0gaW5zdHJ1Y3Rpb24uc291cmNlSW5mb3JtYXRpb247CiAgICAgICAgaWYgKCFyZXBsYWNlbWVudC5pc0luQmFzaWNCbG9jaygpKSB7CiAgICAgICAgICAvLyBUaGUgY29uc3RhbnQgZm9sZGluZyBjYW4gcmV0dXJuIGFuIGluc3RydWN0aW9uIHRoYXQgaXMgYWxyZWFkeQogICAgICAgICAgLy8gcGFydCBvZiB0aGUgZ3JhcGggKGxpa2UgYW4gaW5wdXQpLCBzbyB3ZSBvbmx5IGFkZCB0aGUgcmVwbGFjZW1lbnQKICAgICAgICAgIC8vIGlmIG5lY2Vzc2FyeS4KICAgICAgICAgIGJsb2NrLmFkZEFmdGVyKGluc3RydWN0aW9uLCByZXBsYWNlbWVudCk7CiAgICAgICAgICAvLyBWaXNpdCB0aGUgcmVwbGFjZW1lbnQgYXMgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaW4gY2FzZSBpdAogICAgICAgICAgLy8gY2FuIGFsc28gYmUgY29uc3RhbnQgZm9sZGVkIGF3YXkuCiAgICAgICAgICBuZXh0ID0gcmVwbGFjZW1lbnQ7CiAgICAgICAgfQogICAgICAgIGJsb2NrLnJlbW92ZShpbnN0cnVjdGlvbik7CiAgICAgIH0KICAgICAgaW5zdHJ1Y3Rpb24gPSBuZXh0OwogICAgfQogIH0KCiAgLy8gU2ltcGxpZnkgc29tZSBDRkcgZGlhbW9uZHMgdG8gZXF1aXZhbGVudCBleHByZXNzaW9ucy4KICBzaW1wbGlmeVBoaXMoSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIC8vIElzIFtibG9ja10gdGhlIGpvaW4gcG9pbnQgZm9yIGEgc2ltcGxlIGRpYW1vbmQgdGhhdCBnZW5lcmF0ZXMgYSBzaW5nbGUKICAgIC8vIHBoaSBub2RlPwogICAgaWYgKGJsb2NrLnBoaXMuaXNFbXB0eSkgcmV0dXJuOwogICAgSFBoaSBwaGkgPSBibG9jay5waGlzLmZpcnN0OwogICAgaWYgKHBoaS5uZXh0ICE9IG51bGwpIHJldHVybjsKICAgIGlmIChibG9jay5wcmVkZWNlc3NvcnMubGVuZ3RoICE9IDIpIHJldHVybjsKICAgIGFzc2VydChwaGkuaW5wdXRzLmxlbmd0aCA9PSAyKTsKICAgIEhCYXNpY0Jsb2NrIGIxID0gYmxvY2sucHJlZGVjZXNzb3JzWzBdOwogICAgSEJhc2ljQmxvY2sgYjIgPSBibG9jay5wcmVkZWNlc3NvcnNbMV07CiAgICBIQmFzaWNCbG9jayBkb21pbmF0b3IgPSBibG9jay5kb21pbmF0b3I7CiAgICBpZiAoIShiMS5kb21pbmF0b3IgPT0gZG9taW5hdG9yICYmIGIyLmRvbWluYXRvciA9PSBkb21pbmF0b3IpKSByZXR1cm47CgogICAgLy8gRXh0cmFjdCB0aGUgY29udHJvbGxpbmcgY29uZGl0aW9uLgogICAgSEluc3RydWN0aW9uIGNvbnRyb2xGbG93ID0gZG9taW5hdG9yLmxhc3Q7CiAgICBpZiAoY29udHJvbEZsb3cgaXMhIEhJZikgcmV0dXJuOwogICAgSEluc3RydWN0aW9uIHRlc3QgPSBjb250cm9sRmxvdy5pbnB1dHMuc2luZ2xlOwogICAgaWYgKHRlc3QudXNlZEJ5Lmxlbmd0aCA+IDEpIHJldHVybjsKCiAgICBib29sIG5lZ2F0ZWQgPSBmYWxzZTsKICAgIHdoaWxlICh0ZXN0IGlzIEhOb3QpIHsKICAgICAgdGVzdCA9IHRlc3QuaW5wdXRzLnNpbmdsZTsKICAgICAgaWYgKHRlc3QudXNlZEJ5Lmxlbmd0aCA+IDEpIHJldHVybjsKICAgICAgbmVnYXRlZCA9ICFuZWdhdGVkOwogICAgfQoKICAgIGlmICh0ZXN0IGlzISBISWRlbnRpdHkpIHJldHVybjsKICAgIEhJbnN0cnVjdGlvbiB0ZXN0ZWQ7CiAgICBpZiAodGVzdC5pbnB1dHNbMF0uaXNOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHRlc3RlZCA9IHRlc3QuaW5wdXRzWzFdOwogICAgfSBlbHNlIGlmICh0ZXN0LmlucHV0c1sxXS5pc051bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgdGVzdGVkID0gdGVzdC5pbnB1dHNbMF07CiAgICB9IGVsc2UgewogICAgICByZXR1cm47CiAgICB9CgogICAgSEluc3RydWN0aW9uIHdoZW5OdWxsVmFsdWUgPSBwaGkuaW5wdXRzW25lZ2F0ZWQgPyAxIDogMF07CiAgICBISW5zdHJ1Y3Rpb24gd2hlbk5vdE51bGxWYWx1ZSA9IHBoaS5pbnB1dHNbbmVnYXRlZCA/IDAgOiAxXTsKICAgIEhCYXNpY0Jsb2NrIHdoZW5OdWxsQmxvY2sgPSBibG9jay5wcmVkZWNlc3NvcnNbbmVnYXRlZCA/IDEgOiAwXTsKICAgIEhCYXNpY0Jsb2NrIHdoZW5Ob3ROdWxsQmxvY2sgPSBibG9jay5wcmVkZWNlc3NvcnNbbmVnYXRlZCA/IDAgOiAxXTsKCiAgICAvLyBJZiAneCcgaXMgbnVsbGFibGUgYm9vbGVhbiwKICAgIC8vCiAgICAvLyAgICAgeCA9PSBudWxsID8gZmFsc2UgOiB4ICAtLS0+ICB4ID09IHRydWUKICAgIC8vCiAgICAvLyBUaGlzIG9mZW4gY29tZXMgZnJvbSB0aGUgZGFydCBjb2RlIGB4ID8/IGZhbHNlYC4KICAgIGlmIChfc2FtZU9yUmVmaW5lbWVudE9mKHRlc3RlZCwgd2hlbk5vdE51bGxWYWx1ZSkgJiYKICAgICAgICBfaXNCb29sQ29uc3RhbnQod2hlbk51bGxWYWx1ZSwgZmFsc2UpICYmCiAgICAgICAgd2hlbk5vdE51bGxWYWx1ZQogICAgICAgICAgICAuaXNCb29sZWFuT3JOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgIF9tb3N0bHlFbXB0eSh3aGVuTnVsbEJsb2NrKSAmJgogICAgICAgIF9tb3N0bHlFbXB0eSh3aGVuTm90TnVsbEJsb2NrKSkgewogICAgICBISW5zdHJ1Y3Rpb24gdHJ1ZUNvbnN0YW50ID0gX2dyYXBoLmFkZENvbnN0YW50Qm9vbCh0cnVlLCBfY2xvc2VkV29ybGQpOwogICAgICBISW5zdHJ1Y3Rpb24gcmVwbGFjZW1lbnQgPSBuZXcgSElkZW50aXR5KAogICAgICAgICAgdGVzdGVkLCB0cnVlQ29uc3RhbnQsIG51bGwsIF9hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlKQogICAgICAgIC4uc291cmNlRWxlbWVudCA9IHBoaS5zb3VyY2VFbGVtZW50CiAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHBoaS5zb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgYmxvY2sucmV3cml0ZShwaGksIHJlcGxhY2VtZW50KTsKICAgICAgYmxvY2suYWRkQXRFbnRyeShyZXBsYWNlbWVudCk7CiAgICAgIGJsb2NrLnJlbW92ZVBoaShwaGkpOwogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBJZiAneCdpcyBudWxsYWJsZSBib29sZWFuLAogICAgLy8KICAgIC8vICAgICB4ID09IG51bGwgPyB0cnVlIDogeCAgLS0tPiAgISh4ID09IGZhbHNlKQogICAgLy8KICAgIC8vIFRoaXMgb2ZlbiBjb21lcyBmcm9tIHRoZSBkYXJ0IGNvZGUgYHggPz8gdHJ1ZWAuCiAgICBpZiAoX3NhbWVPclJlZmluZW1lbnRPZih0ZXN0ZWQsIHdoZW5Ob3ROdWxsVmFsdWUpICYmCiAgICAgICAgX2lzQm9vbENvbnN0YW50KHdoZW5OdWxsVmFsdWUsIHRydWUpICYmCiAgICAgICAgd2hlbk5vdE51bGxWYWx1ZQogICAgICAgICAgICAuaXNCb29sZWFuT3JOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgIF9tb3N0bHlFbXB0eSh3aGVuTnVsbEJsb2NrKSAmJgogICAgICAgIF9tb3N0bHlFbXB0eSh3aGVuTm90TnVsbEJsb2NrKSkgewogICAgICBISW5zdHJ1Y3Rpb24gZmFsc2VDb25zdGFudCA9IF9ncmFwaC5hZGRDb25zdGFudEJvb2woZmFsc2UsIF9jbG9zZWRXb3JsZCk7CiAgICAgIEhJbnN0cnVjdGlvbiBjb21wYXJlID0gbmV3IEhJZGVudGl0eSgKICAgICAgICAgIHRlc3RlZCwgZmFsc2VDb25zdGFudCwgbnVsbCwgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpOwogICAgICBibG9jay5hZGRBdEVudHJ5KGNvbXBhcmUpOwogICAgICBISW5zdHJ1Y3Rpb24gcmVwbGFjZW1lbnQgPQogICAgICAgICAgbmV3IEhOb3QoY29tcGFyZSwgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpCiAgICAgICAgICAgIC4uc291cmNlRWxlbWVudCA9IHBoaS5zb3VyY2VFbGVtZW50CiAgICAgICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBwaGkuc291cmNlSW5mb3JtYXRpb247CiAgICAgIGJsb2NrLnJld3JpdGUocGhpLCByZXBsYWNlbWVudCk7CiAgICAgIGJsb2NrLmFkZEFmdGVyKGNvbXBhcmUsIHJlcGxhY2VtZW50KTsKICAgICAgYmxvY2sucmVtb3ZlUGhpKHBoaSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBUT0RPKHNyYSk6IENvbnNpZGVyIG90aGVyIHNpbXBsZSBkaWFtb25kcywgZS5nLiB3aXRoIHRoZSBhZGRpdGlvbiBvZiBhIHNwZWNpYWwgaW5zdHJ1Y3Rpb24sCiAgICAvLwogICAgLy8gICAgIHMgPT0gbnVsbCA/ICIiIDogcyAgLS0tPiAgcyB8fCAiIi4KICAgIHJldHVybjsKICB9CgogIGJvb2wgX2lzQm9vbENvbnN0YW50KEhJbnN0cnVjdGlvbiBub2RlLCBib29sIHZhbHVlKSB7CiAgICBpZiAobm9kZSBpcyBIQ29uc3RhbnQpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSBjID0gbm9kZS5jb25zdGFudDsKICAgICAgaWYgKGMgaXMgQm9vbENvbnN0YW50VmFsdWUpIHsKICAgICAgICByZXR1cm4gYy5ib29sVmFsdWUgPT0gdmFsdWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGJvb2wgX3NhbWVPclJlZmluZW1lbnRPZihISW5zdHJ1Y3Rpb24gYmFzZSwgSEluc3RydWN0aW9uIGluc24pIHsKICAgIGlmIChiYXNlID09IGluc24pIHJldHVybiB0cnVlOwogICAgaWYgKGluc24gaXMgSFR5cGVLbm93bikgcmV0dXJuIF9zYW1lT3JSZWZpbmVtZW50T2YoYmFzZSwgaW5zbi5jaGVja2VkSW5wdXQpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBfbW9zdGx5RW1wdHkoSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGZvciAoSEluc3RydWN0aW9uIGluc24gPSBibG9jay5maXJzdDsgaW5zbiAhPSBudWxsOyBpbnNuID0gaW5zbi5uZXh0KSB7CiAgICAgIGlmIChpbnNuIGlzIEhUeXBlS25vd24pIGNvbnRpbnVlOwogICAgICBpZiAoaW5zbiBpcyBIR290bykgcmV0dXJuIHRydWU7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0SW5zdHJ1Y3Rpb24oSEluc3RydWN0aW9uIG5vZGUpIHsKICAgIHJldHVybiBub2RlOwogIH0KCiAgQ29uc3RhbnRWYWx1ZSBnZXRDb25zdGFudEZyb21UeXBlKEhJbnN0cnVjdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZS5pc1ZhbHVlKF9hYnN0cmFjdFZhbHVlRG9tYWluKSAmJgogICAgICAgIG5vZGUuaXNOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlGYWxzZSkgewogICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0KICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmdldFByaW1pdGl2ZVZhbHVlKG5vZGUuaW5zdHJ1Y3Rpb25UeXBlKTsKICAgICAgaWYgKHZhbHVlLmlzQm9vbCkgewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgICAvLyBUT0RPKGhldCk6IGNvbnNpZGVyIHN1cHBvcnRpbmcgb3RoZXIgdmFsdWVzIChzaG9ydCBzdHJpbmdzPykKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBwcm9wYWdhdGVDb25zdGFudFZhbHVlVG9Vc2VzKEhJbnN0cnVjdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZS51c2VkQnkuaXNFbXB0eSkgcmV0dXJuOwogICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IGdldENvbnN0YW50RnJvbVR5cGUobm9kZSk7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICBIQ29uc3RhbnQgY29uc3RhbnQgPSBfZ3JhcGguYWRkQ29uc3RhbnQodmFsdWUsIF9jbG9zZWRXb3JsZCk7CiAgICAgIGZvciAoSEluc3RydWN0aW9uIHVzZXIgaW4gbm9kZS51c2VkQnkudG9MaXN0KCkpIHsKICAgICAgICB1c2VyLmNoYW5nZVVzZShub2RlLCBjb25zdGFudCk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdFBhcmFtZXRlclZhbHVlKEhQYXJhbWV0ZXJWYWx1ZSBub2RlKSB7CiAgICAvLyBbSFBhcmFtZXRlclZhbHVlXXMgYXJlIGVpdGhlciB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciAoaW4gZnVsbHkgU1NBCiAgICAvLyBjb252ZXJ0ZWQgY29kZSksIG9yIHRoZSBtdXRhYmxlIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIHZhbHVlIChpbgogICAgLy8gaW5jb21wbGV0ZWx5IFNTQSBjb252ZXJ0ZWQgY29kZSwgZS5nLiBtZXRob2RzIGNvbnRhaW5pbmcgZXhjZXB0aW9ucykuCiAgICAvLwogICAgLy8gSWYgdGhlIHBhcmFtZXRlciBpcyB1c2VkIGFzIGEgbXV0YWJsZSB2YXJpYWJsZSB3ZSBjYW5ub3QgcmVwbGFjZSB0aGUKICAgIC8vIHZhcmlhYmxlIHdpdGggYSB2YWx1ZS4KICAgIC8vCiAgICAvLyBJZiB0aGUgcGFyYW1ldGVyIGlzIHVzZWQgYXMgYSBtdXRhYmxlIHZhcmlhYmxlIGJ1dCBuZXZlciB3cml0dGVuLCBmaXJzdAogICAgLy8gY29udmVydCB0byBhIHZhbHVlIHBhcmFtZXRlci4KCiAgICBpZiAobm9kZS51c2VkQXNWYXJpYWJsZSgpKSB7CiAgICAgIGlmICghbm9kZS51c2VkQnkuZXZlcnkoKHVzZXIpID0+IHVzZXIgaXMgSExvY2FsR2V0KSkgcmV0dXJuIG5vZGU7CiAgICAgIC8vIFRyaXZpYWwgU1NBLWNvbnZlcnNpb24uIFJlcGxhY2UgYWxsIEhMb2NhbEdldCBpbnN0cnVjdGlvbnMgd2l0aCB0aGUKICAgICAgLy8gcGFyYW1ldGVyLgogICAgICBmb3IgKEhMb2NhbEdldCB1c2VyIGluIG5vZGUudXNlZEJ5LnRvTGlzdCgpKSB7CiAgICAgICAgdXNlci5ibG9jay5yZXdyaXRlKHVzZXIsIG5vZGUpOwogICAgICAgIHVzZXIuYmxvY2sucmVtb3ZlKHVzZXIpOwogICAgICB9CiAgICB9CgogICAgcHJvcGFnYXRlQ29uc3RhbnRWYWx1ZVRvVXNlcyhub2RlKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0Tm90KEhOb3Qgbm9kZSkgewogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IG5vZGUuaW5wdXRzOwogICAgYXNzZXJ0KGlucHV0cy5sZW5ndGggPT0gMSk7CiAgICBISW5zdHJ1Y3Rpb24gaW5wdXQgPSBpbnB1dHNbMF07CiAgICBpZiAoaW5wdXQgaXMgSENvbnN0YW50KSB7CiAgICAgIEhDb25zdGFudCBjb25zdGFudCA9IGlucHV0OwogICAgICBib29sIGlzVHJ1ZSA9IGNvbnN0YW50LmNvbnN0YW50LmlzVHJ1ZTsKICAgICAgcmV0dXJuIF9ncmFwaC5hZGRDb25zdGFudEJvb2woIWlzVHJ1ZSwgX2Nsb3NlZFdvcmxkKTsKICAgIH0gZWxzZSBpZiAoaW5wdXQgaXMgSE5vdCkgewogICAgICByZXR1cm4gaW5wdXQuaW5wdXRzWzBdOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRJbnZva2VVbmFyeShISW52b2tlVW5hcnkgbm9kZSkgewogICAgSEluc3RydWN0aW9uIGZvbGRlZCA9IGZvbGRVbmFyeShub2RlLm9wZXJhdGlvbigpLCBub2RlLm9wZXJhbmQpOwogICAgcmV0dXJuIGZvbGRlZCAhPSBudWxsID8gZm9sZGVkIDogbm9kZTsKICB9CgogIEhJbnN0cnVjdGlvbiBmb2xkVW5hcnkoCiAgICAgIGNvbnN0YW50X3N5c3RlbS5VbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24sIEhJbnN0cnVjdGlvbiBvcGVyYW5kKSB7CiAgICBpZiAob3BlcmFuZCBpcyBIQ29uc3RhbnQpIHsKICAgICAgSENvbnN0YW50IHJlY2VpdmVyID0gb3BlcmFuZDsKICAgICAgQ29uc3RhbnRWYWx1ZSBmb2xkZWQgPSBvcGVyYXRpb24uZm9sZChyZWNlaXZlci5jb25zdGFudCk7CiAgICAgIGlmIChmb2xkZWQgIT0gbnVsbCkgcmV0dXJuIF9ncmFwaC5hZGRDb25zdGFudChmb2xkZWQsIF9jbG9zZWRXb3JsZCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEhJbnN0cnVjdGlvbiB0cnlPcHRpbWl6ZUxlbmd0aEludGVyY2VwdGVkR2V0dGVyKEhJbnZva2VEeW5hbWljIG5vZGUpIHsKICAgIEhJbnN0cnVjdGlvbiBhY3R1YWxSZWNlaXZlciA9IG5vZGUuaW5wdXRzWzFdOwogICAgaWYgKGFjdHVhbFJlY2VpdmVyCiAgICAgICAgLmlzSW5kZXhhYmxlUHJpbWl0aXZlKF9hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIGlmIChhY3R1YWxSZWNlaXZlci5pc0NvbnN0YW50U3RyaW5nKCkpIHsKICAgICAgICBIQ29uc3RhbnQgY29uc3RhbnRJbnB1dCA9IGFjdHVhbFJlY2VpdmVyOwogICAgICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgY29uc3RhbnQgPSBjb25zdGFudElucHV0LmNvbnN0YW50OwogICAgICAgIHJldHVybiBfZ3JhcGguYWRkQ29uc3RhbnRJbnQoY29uc3RhbnQubGVuZ3RoLCBfY2xvc2VkV29ybGQpOwogICAgICB9IGVsc2UgaWYgKGFjdHVhbFJlY2VpdmVyLmlzQ29uc3RhbnRMaXN0KCkpIHsKICAgICAgICBIQ29uc3RhbnQgY29uc3RhbnRJbnB1dCA9IGFjdHVhbFJlY2VpdmVyOwogICAgICAgIExpc3RDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gY29uc3RhbnRJbnB1dC5jb25zdGFudDsKICAgICAgICByZXR1cm4gX2dyYXBoLmFkZENvbnN0YW50SW50KGNvbnN0YW50Lmxlbmd0aCwgX2Nsb3NlZFdvcmxkKTsKICAgICAgfQogICAgICBib29sIGlzRml4ZWQgPQogICAgICAgICAgaXNGaXhlZExlbmd0aChhY3R1YWxSZWNlaXZlci5pbnN0cnVjdGlvblR5cGUsIF9jbG9zZWRXb3JsZCk7CiAgICAgIEFic3RyYWN0VmFsdWUgYWN0dWFsVHlwZSA9IG5vZGUuaW5zdHJ1Y3Rpb25UeXBlOwogICAgICBBYnN0cmFjdFZhbHVlIHJlc3VsdFR5cGUgPSBfYWJzdHJhY3RWYWx1ZURvbWFpbi5wb3NpdGl2ZUludFR5cGU7CiAgICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBjb21wdXRlZCBhIG1vcmUgc3BlY2lmaWMgdHlwZSwga2VlcCB0aGF0IHR5cGUuCiAgICAgIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgLmlzSW5zdGFuY2VPZk9yTnVsbChhY3R1YWxUeXBlLCBjb21tb25FbGVtZW50cy5qc1VJbnQzMUNsYXNzKQogICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICByZXN1bHRUeXBlID0gX2Fic3RyYWN0VmFsdWVEb21haW4udWludDMxVHlwZTsKICAgICAgfSBlbHNlIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgLmlzSW5zdGFuY2VPZk9yTnVsbChhY3R1YWxUeXBlLCBjb21tb25FbGVtZW50cy5qc1VJbnQzMkNsYXNzKQogICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICByZXN1bHRUeXBlID0gX2Fic3RyYWN0VmFsdWVEb21haW4udWludDMyVHlwZTsKICAgICAgfQogICAgICBIR2V0TGVuZ3RoIHJlc3VsdCA9CiAgICAgICAgICBuZXcgSEdldExlbmd0aChhY3R1YWxSZWNlaXZlciwgcmVzdWx0VHlwZSwgaXNBc3NpZ25hYmxlOiAhaXNGaXhlZCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9IGVsc2UgaWYgKGFjdHVhbFJlY2VpdmVyLmlzQ29uc3RhbnRNYXAoKSkgewogICAgICBIQ29uc3RhbnQgY29uc3RhbnRJbnB1dCA9IGFjdHVhbFJlY2VpdmVyOwogICAgICBNYXBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gY29uc3RhbnRJbnB1dC5jb25zdGFudDsKICAgICAgcmV0dXJuIF9ncmFwaC5hZGRDb25zdGFudEludChjb25zdGFudC5sZW5ndGgsIF9jbG9zZWRXb3JsZCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEhJbnN0cnVjdGlvbiBoYW5kbGVJbnRlcmNlcHRlZENhbGwoSEludm9rZUR5bmFtaWMgbm9kZSkgewogICAgLy8gVHJ5IGNvbnN0YW50IGZvbGRpbmcgdGhlIGluc3RydWN0aW9uLgogICAgY29uc3RhbnRfc3lzdGVtLk9wZXJhdGlvbiBvcGVyYXRpb24gPSBub2RlLnNwZWNpYWxpemVyLm9wZXJhdGlvbigpOwogICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IG5vZGUuaW5wdXRzLmxlbmd0aCA9PSAyCiAgICAgICAgICA/IGZvbGRVbmFyeShvcGVyYXRpb24sIG5vZGUuaW5wdXRzWzFdKQogICAgICAgICAgOiBmb2xkQmluYXJ5KG9wZXJhdGlvbiwgbm9kZS5pbnB1dHNbMV0sIG5vZGUuaW5wdXRzWzJdKTsKICAgICAgaWYgKGluc3RydWN0aW9uICE9IG51bGwpIHJldHVybiBpbnN0cnVjdGlvbjsKICAgIH0KCiAgICAvLyBUcnkgY29udmVydGluZyB0aGUgaW5zdHJ1Y3Rpb24gdG8gYSBidWlsdGluIGluc3RydWN0aW9uLgogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gbm9kZS5zcGVjaWFsaXplci50cnlDb252ZXJ0VG9CdWlsdGluKG5vZGUsCiAgICAgICAgX2dyYXBoLCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cywgY29tbW9uRWxlbWVudHMsIF9jbG9zZWRXb3JsZCwgX2xvZyk7CiAgICBpZiAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICByZXR1cm4gaW5zdHJ1Y3Rpb247CiAgICB9CgogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBub2RlLnNlbGVjdG9yOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gbm9kZS5yZWNlaXZlclR5cGU7CiAgICBISW5zdHJ1Y3Rpb24gaW5wdXQgPSBub2RlLmlucHV0c1sxXTsKCiAgICBib29sIGFwcGxpZXMoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgICAgcmV0dXJuIHNlbGVjdG9yLmFwcGxpZXMoZWxlbWVudCkgJiYKICAgICAgICAgIChtYXNrID09IG51bGwgfHwKICAgICAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgICAgICAgICAuaXNUYXJnZXRpbmdNZW1iZXIobWFzaywgZWxlbWVudCwgc2VsZWN0b3IubWVtYmVyTmFtZSkKICAgICAgICAgICAgICAgICAgLmlzUG90ZW50aWFsbHlUcnVlKTsKICAgIH0KCiAgICBpZiAoc2VsZWN0b3IuaXNDYWxsIHx8IHNlbGVjdG9yLmlzT3BlcmF0b3IpIHsKICAgICAgRnVuY3Rpb25FbnRpdHkgdGFyZ2V0OwogICAgICBpZiAoaW5wdXQuaXNFeHRlbmRhYmxlQXJyYXkoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICBpZiAoYXBwbGllcyhjb21tb25FbGVtZW50cy5qc0FycmF5UmVtb3ZlTGFzdCkpIHsKICAgICAgICAgIHRhcmdldCA9IGNvbW1vbkVsZW1lbnRzLmpzQXJyYXlSZW1vdmVMYXN0OwogICAgICAgIH0gZWxzZSBpZiAoYXBwbGllcyhjb21tb25FbGVtZW50cy5qc0FycmF5QWRkKSkgewogICAgICAgICAgLy8gVGhlIGNvZGVnZW4gc3BlY2lhbCBjYXNlcyBhcnJheSBjYWxscywgYnV0IGRvZXMgbm90CiAgICAgICAgICAvLyBpbmxpbmUgYXJndW1lbnQgdHlwZSBjaGVja3MuCiAgICAgICAgICBpZiAoIV9jbG9zZWRXb3JsZC5hbm5vdGF0aW9uc0RhdGEKICAgICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlckNoZWNrUG9saWN5KGNvbW1vbkVsZW1lbnRzLmpzQXJyYXlBZGQpCiAgICAgICAgICAgICAgICAgIC5pc0VtaXR0ZWQgfHwKICAgICAgICAgICAgICBpbnB1dCBpcyBITGl0ZXJhbExpc3QpIHsKICAgICAgICAgICAgdGFyZ2V0ID0gY29tbW9uRWxlbWVudHMuanNBcnJheUFkZDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaW5wdXQuaXNTdHJpbmdPck51bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICBpZiAoY29tbW9uRWxlbWVudHMuYXBwbGllc1RvSnNTdHJpbmdTcGxpdCgKICAgICAgICAgICAgc2VsZWN0b3IsIG1hc2ssIF9hYnN0cmFjdFZhbHVlRG9tYWluKSkgewogICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmluZ1NwbGl0KG5vZGUpOwogICAgICAgIH0gZWxzZSBpZiAoYXBwbGllcyhjb21tb25FbGVtZW50cy5qc1N0cmluZ09wZXJhdG9yQWRkKSkgewogICAgICAgICAgLy8gYG9wZXJhdG9yK2AgaXMgdHVybmVkIGludG8gYSBKYXZhU2NyaXB0ICcrJyBzbyB3ZSBuZWVkIHRvCiAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHJlY2VpdmVyIGFuZCB0aGUgYXJndW1lbnQgYXJlIG5vdCBudWxsLgogICAgICAgICAgLy8gVE9ETyhzcmEpOiBEbyB0aGlzIHZpYSBbbm9kZS5zcGVjaWFsaXplcl0uCiAgICAgICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQgPSBub2RlLmlucHV0c1syXTsKICAgICAgICAgIGlmIChhcmd1bWVudC5pc1N0cmluZyhfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgICAgICAgIGlucHV0LmlzTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5RmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBIU3RyaW5nQ29uY2F0KGlucHV0LCBhcmd1bWVudCwgbm9kZS5pbnN0cnVjdGlvblR5cGUpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoYXBwbGllcyhjb21tb25FbGVtZW50cy5qc1N0cmluZ1RvU3RyaW5nKSAmJgogICAgICAgICAgICBpbnB1dC5pc051bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseUZhbHNlKSB7CiAgICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewogICAgICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogVGhlcmUgaXMgYSBzdHJvbmcgZGVwZW5kZW5jeSBiZXR3ZWVuIGNvZGVnZW4KICAgICAgICAvLyBhbmQgdGhpcyBvcHRpbWl6YXRpb24gdGhhdCB0aGUgZHluYW1pYyBpbnZva2UgZG9lcyBub3QgbmVlZCBhbgogICAgICAgIC8vIGludGVyY2VwdG9yLiBXZSBjdXJyZW50bHkgbmVlZCB0byBrZWVwIGEKICAgICAgICAvLyBISW52b2tlRHluYW1pY01ldGhvZCBhbmQgbm90IGNyZWF0ZSBhIEhGb3JlaWduIGJlY2F1c2UKICAgICAgICAvLyBIRm9yZWlnbiBpcyB0b28gb3BhcXVlIGZvciB0aGUgU3NhQ2hlY2tJbnNlcnRlciAodGhhdCBhZGRzIGEKICAgICAgICAvLyBib3VuZHMgY2hlY2sgb24gcmVtb3ZlTGFzdCkuIE9uY2Ugd2Ugc3RhcnQgaW5saW5pbmcsIHRoZQogICAgICAgIC8vIGJvdW5kcyBjaGVjayB3aWxsIGJlY29tZSBleHBsaWNpdCwgc28gd2Ugd29uJ3QgbmVlZCB0aGlzCiAgICAgICAgLy8gb3B0aW1pemF0aW9uLgogICAgICAgIEhJbnZva2VEeW5hbWljTWV0aG9kIHJlc3VsdCA9IG5ldyBISW52b2tlRHluYW1pY01ldGhvZCgKICAgICAgICAgICAgbm9kZS5zZWxlY3RvciwKICAgICAgICAgICAgbm9kZS5yZWNlaXZlclR5cGUsCiAgICAgICAgICAgIG5vZGUuaW5wdXRzLnN1Ymxpc3QoMSksIC8vIERyb3AgaW50ZXJjZXB0b3IuCiAgICAgICAgICAgIG5vZGUuaW5zdHJ1Y3Rpb25UeXBlLAogICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVudHMsCiAgICAgICAgICAgIG5vZGUuc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgICAgIGlzSW50ZXJjZXB0ZWQ6IGZhbHNlKTsKICAgICAgICByZXN1bHQuZWxlbWVudCA9IHRhcmdldDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmlzR2V0dGVyKSB7CiAgICAgIGlmIChjb21tb25FbGVtZW50cy5hcHBsaWVzVG9Kc0luZGV4YWJsZUxlbmd0aChzZWxlY3RvcikpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gb3B0aW1pemVkID0gdHJ5T3B0aW1pemVMZW5ndGhJbnRlcmNlcHRlZEdldHRlcihub2RlKTsKICAgICAgICBpZiAob3B0aW1pemVkICE9IG51bGwpIHJldHVybiBvcHRpbWl6ZWQ7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbm9kZTsKICB9CgogIEhJbnN0cnVjdGlvbiBoYW5kbGVTdHJpbmdTcGxpdChISW52b2tlRHluYW1pYyBub2RlKSB7CiAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQgPSBub2RlLmlucHV0c1syXTsKICAgIGlmICghYXJndW1lbnQuaXNTdHJpbmcoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgLy8gUmVwbGFjZSBgcy5zcGxpdCQxKHBhdHRlcm4pYCB3aXRoCiAgICAvLwogICAgLy8gICAgIHQxID0gcy5zcGxpdChwYXR0ZXJuKTsKICAgIC8vICAgICB0MiA9IFN0cmluZzsKICAgIC8vICAgICB0MyA9IEpTQXJyYXk8dDI+OwogICAgLy8gICAgIHQ0ID0gc2V0UnVudGltZVR5cGVJbmZvKHQxLCB0Myk7CiAgICAvLwoKICAgIEFic3RyYWN0VmFsdWUgcmVzdWx0TWFzayA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLmdyb3dhYmxlTGlzdFR5cGU7CgogICAgSEludm9rZUR5bmFtaWNNZXRob2Qgc3BsaXRJbnN0cnVjdGlvbiA9IG5ldyBISW52b2tlRHluYW1pY01ldGhvZCgKICAgICAgICBub2RlLnNlbGVjdG9yLAogICAgICAgIG5vZGUucmVjZWl2ZXJUeXBlLAogICAgICAgIG5vZGUuaW5wdXRzLnN1Ymxpc3QoMSksIC8vIERyb3AgaW50ZXJjZXB0b3IuCiAgICAgICAgcmVzdWx0TWFzaywKICAgICAgICBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgICAgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICBpc0ludGVyY2VwdGVkOiBmYWxzZSkKICAgICAgLi5lbGVtZW50ID0gY29tbW9uRWxlbWVudHMuanNTdHJpbmdTcGxpdAogICAgICAuLnNldEFsbG9jYXRpb24odHJ1ZSk7CgogICAgaWYgKCFfY2xvc2VkV29ybGQucnRpTmVlZAogICAgICAgIC5jbGFzc05lZWRzVHlwZUFyZ3VtZW50cyhjb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MpKSB7CiAgICAgIHJldHVybiBzcGxpdEluc3RydWN0aW9uOwogICAgfQoKICAgIC8vIFRPRE8oc3JhKTogSW1wbGVtZW50IHRhZ2dpbmcgd2l0aCBgSlNBcnJheTxTdHJpbmc+YCBmb3IgbmV3IHJ0aS4KCiAgICBub2RlLmJsb2NrLmFkZEJlZm9yZShub2RlLCBzcGxpdEluc3RydWN0aW9uKTsKCiAgICBISW5zdHJ1Y3Rpb24gc3RyaW5nVHlwZUluZm8gPSBuZXcgSFR5cGVJbmZvRXhwcmVzc2lvbigKICAgICAgICBUeXBlSW5mb0V4cHJlc3Npb25LaW5kLkNPTVBMRVRFLAogICAgICAgIF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoY29tbW9uRWxlbWVudHMuc3RyaW5nQ2xhc3MpLAogICAgICAgIDxISW5zdHJ1Y3Rpb24+W10sCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpOwogICAgbm9kZS5ibG9jay5hZGRCZWZvcmUobm9kZSwgc3RyaW5nVHlwZUluZm8pOwoKICAgIEhJbnN0cnVjdGlvbiB0eXBlSW5mbyA9IG5ldyBIVHlwZUluZm9FeHByZXNzaW9uKAogICAgICAgIFR5cGVJbmZvRXhwcmVzc2lvbktpbmQuSU5TVEFOQ0UsCiAgICAgICAgX2Nsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudAogICAgICAgICAgICAuZ2V0VGhpc1R5cGUoY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzKSwKICAgICAgICA8SEluc3RydWN0aW9uPltzdHJpbmdUeXBlSW5mb10sCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpOwogICAgbm9kZS5ibG9jay5hZGRCZWZvcmUobm9kZSwgdHlwZUluZm8pOwoKICAgIEhJbnZva2VTdGF0aWMgdGFnSW5zdHJ1Y3Rpb24gPSBuZXcgSEludm9rZVN0YXRpYygKICAgICAgICBjb21tb25FbGVtZW50cy5zZXRSdW50aW1lVHlwZUluZm8sCiAgICAgICAgPEhJbnN0cnVjdGlvbj5bc3BsaXRJbnN0cnVjdGlvbiwgdHlwZUluZm9dLAogICAgICAgIHJlc3VsdE1hc2ssCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdKTsKICAgIC8vICdMaW5lYXIgdHlwaW5nJyB0cmljazogW3RhZ0luc3RydWN0aW9uXSBpcyB0aGUgb25seSB1c2Ugb2YgdGhlCiAgICAvLyBbc3BsaXRJbnN0cnVjdGlvbl0sIHNvIGl0IGJlY29tZXMgdGhlIHNvbGUgYWxpYXMuCiAgICAvLyBUT0RPKHNyYSk6IEJ1aWxkIHRoaXMga25vd2xlZGdlIGludG8gYWxpYXMgYW5hbHlzaXMuCiAgICB0YWdJbnN0cnVjdGlvbi5zZXRBbGxvY2F0aW9uKHRydWUpOwoKICAgIHJldHVybiB0YWdJbnN0cnVjdGlvbjsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdEludm9rZUR5bmFtaWNNZXRob2QoSEludm9rZUR5bmFtaWNNZXRob2Qgbm9kZSkgewogICAgcHJvcGFnYXRlQ29uc3RhbnRWYWx1ZVRvVXNlcyhub2RlKTsKICAgIGlmIChub2RlLmlzSW50ZXJjZXB0ZWRDYWxsKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBmb2xkZWQgPSBoYW5kbGVJbnRlcmNlcHRlZENhbGwobm9kZSk7CiAgICAgIGlmIChmb2xkZWQgIT0gbm9kZSkgcmV0dXJuIGZvbGRlZDsKICAgIH0KCiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBub2RlLmdldERhcnRSZWNlaXZlcihfY2xvc2VkV29ybGQpOwogICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGUgPSByZWNlaXZlci5pbnN0cnVjdGlvblR5cGU7CiAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCA9CiAgICAgICAgX2Nsb3NlZFdvcmxkLmxvY2F0ZVNpbmdsZU1lbWJlcihub2RlLnNlbGVjdG9yLCByZWNlaXZlclR5cGUpOwogICAgLy8gVE9ETyhuZ2VvZmZyYXkpOiBBbHNvIGZvbGQgaWYgaXQncyBhIGdldHRlciBvciB2YXJpYWJsZS4KICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYKICAgICAgICBlbGVtZW50LmlzRnVuY3Rpb24gJiYKICAgICAgICAvLyBJZiB3ZSBmb3VuZCBvdXQgdGhhdCB0aGUgb25seSB0YXJnZXQgaXMgYW4gaW1wbGljaXRseSBjYWxsZWQKICAgICAgICAvLyBbOm5vU3VjaE1ldGhvZDpdIHdlIGp1c3QgaWdub3JlIGl0LgogICAgICAgIG5vZGUuc2VsZWN0b3IuYXBwbGllcyhlbGVtZW50KSkgewogICAgICBGdW5jdGlvbkVudGl0eSBtZXRob2QgPSBlbGVtZW50OwoKICAgICAgaWYgKF9uYXRpdmVEYXRhLmlzTmF0aXZlTWVtYmVyKG1ldGhvZCkpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gZm9sZGVkID0gdHJ5SW5saW5lTmF0aXZlTWV0aG9kKG5vZGUsIG1ldGhvZCk7CiAgICAgICAgaWYgKGZvbGRlZCAhPSBudWxsKSByZXR1cm4gZm9sZGVkOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogSWYgdGhlIG1ldGhvZCBoYXMgb3B0aW9uYWwgcGFyYW1ldGVycywKICAgICAgICAvLyB3ZSBzaG91bGQgcGFzcyB0aGUgZGVmYXVsdCB2YWx1ZXMuCiAgICAgICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlcnMgPSBtZXRob2QucGFyYW1ldGVyU3RydWN0dXJlOwogICAgICAgIGlmIChwYXJhbWV0ZXJzLnRvdGFsUGFyYW1ldGVycyA9PSBub2RlLnNlbGVjdG9yLmFyZ3VtZW50Q291bnQgJiYKICAgICAgICAgICAgcGFyYW1ldGVycy50eXBlUGFyYW1ldGVycyA9PQogICAgICAgICAgICAgICAgbm9kZS5zZWxlY3Rvci5jYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudENvdW50KSB7CiAgICAgICAgICBub2RlLmVsZW1lbnQgPSBtZXRob2Q7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBub2RlOwogICAgfQoKICAgIC8vIFJlcGxhY2UgbWV0aG9kIGNhbGxzIHRocm91Z2ggZmllbGRzIHdpdGggYSBjbG9zdXJlIGNhbGwgb24gdGhlIHZhbHVlIG9mCiAgICAvLyB0aGUgZmllbGQuIFRoaXMgdXN1YWxseSByZW1vdmVzIHRoZSBkZW1hbmQgZm9yIHRoZSBjYWxsLXRocm91Z2ggc3R1YiBhbmQKICAgIC8vIG1ha2VzIHRoZSBmaWVsZCBsb2FkIGF2YWlsYWJsZSB0byBmdXJ0aGVyIG9wdGltaXphdGlvbiwgZS5nLiBMSUNNLgoKICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYKICAgICAgICBlbGVtZW50LmlzRmllbGQgJiYKICAgICAgICBlbGVtZW50Lm5hbWUgPT0gbm9kZS5zZWxlY3Rvci5uYW1lKSB7CiAgICAgIEZpZWxkRW50aXR5IGZpZWxkID0gZWxlbWVudDsKICAgICAgaWYgKCFfbmF0aXZlRGF0YS5pc05hdGl2ZU1lbWJlcihmaWVsZCkgJiYKICAgICAgICAgICFub2RlLmlzQ2FsbE9uSW50ZXJjZXB0b3IoX2Nsb3NlZFdvcmxkKSkgewogICAgICAgIC8vIEluc2VydGlvbiBwb2ludCBmb3IgdGhlIGNsb3N1cmUgY2FsbC4KICAgICAgICBISW5zdHJ1Y3Rpb24gaW5zZXJ0aW9uUG9pbnQgPSBub2RlOwogICAgICAgIEhJbnN0cnVjdGlvbiBsb2FkOwogICAgICAgIEZpZWxkQW5hbHlzaXNEYXRhIGZpZWxkRGF0YSA9CiAgICAgICAgICAgIF9jbG9zZWRXb3JsZC5maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShmaWVsZCk7CiAgICAgICAgaWYgKGZpZWxkRGF0YS5pc0VmZmVjdGl2ZWx5Q29uc3RhbnQpIHsKICAgICAgICAgIC8vIFRoZSBmaWVsZCBpcyBlbGlkZWQgYW5kIHJlcGxhY2UgaXQgd2l0aCBpdHMgY29uc3RhbnQgdmFsdWUuCiAgICAgICAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4uaXNOdWxsKHJlY2VpdmVyVHlwZSkuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgICAgICAgLy8gVGhlIHJlY2VpdmVyIGlzIHBvdGVudGlhbGx5IGBudWxsYCBzbyB3ZSBpbnNlcnQgYSBudWxsIHJlY2VpdmVyCiAgICAgICAgICAgIC8vIGd1YXJkIHRvIHRyaWdnZXIgYSBudWxsIHBvaW50ZXIgZXhjZXB0aW9uLgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBUaGlzIGNvdWxkIGJlIGluc2VydGVkIHVuY29uZGl0aW9uYWxseSBhbmQgcmVtb3ZlZCBieSBsYXRlcgogICAgICAgICAgICAvLyBvcHRpbWl6YXRpb25zIGlmIHVubmVjZXNzYXJ5LCBidXQgcGVyZm9ybWFuY2Ugd2UgZG8gaXQKICAgICAgICAgICAgLy8gY29uZGl0aW9uYWxseSBoZXJlLgogICAgICAgICAgICAvLyBUT0RPKDM1OTk2KTogUmVwbGFjZSB3aXRoIG51bGwgcmVjZWl2ZXIgZ3VhcmQgaW5zdHJ1Y3Rpb24uCiAgICAgICAgICAgIEhJbnN0cnVjdGlvbiBkdW1teUdldCA9IG5ldyBIRmllbGRHZXQobnVsbCwgcmVjZWl2ZXIsCiAgICAgICAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICAgICAgICAgIGlzQXNzaWduYWJsZTogZmFsc2UpOwogICAgICAgICAgICBfbG9nPy5yZWdpc3RlckZpZWxkQ2FsbChub2RlLCBkdW1teUdldCk7CiAgICAgICAgICAgIG5vZGUuYmxvY2suYWRkQmVmb3JlKG5vZGUsIGR1bW15R2V0KTsKICAgICAgICAgICAgaW5zZXJ0aW9uUG9pbnQgPSBkdW1teUdldDsKICAgICAgICAgIH0KICAgICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBmaWVsZERhdGEuY29uc3RhbnRWYWx1ZTsKICAgICAgICAgIGxvYWQgPSBfZ3JhcGguYWRkQ29uc3RhbnQodmFsdWUsIF9jbG9zZWRXb3JsZCwKICAgICAgICAgICAgICBzb3VyY2VJbmZvcm1hdGlvbjogbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgICBfbG9nPy5yZWdpc3RlckNvbnN0YW50RmllbGRDYWxsKG5vZGUsIGZpZWxkLCBsb2FkKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlID0gQWJzdHJhY3RWYWx1ZUZhY3RvcnkuaW5mZXJyZWRUeXBlRm9yTWVtYmVyKAogICAgICAgICAgICAgIGZpZWxkLCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgICAgICAgICBsb2FkID0gbmV3IEhGaWVsZEdldChmaWVsZCwgcmVjZWl2ZXIsIHR5cGUsIG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgICAgICAgX2xvZz8ucmVnaXN0ZXJGaWVsZENhbGwobm9kZSwgbG9hZCk7CiAgICAgICAgICBub2RlLmJsb2NrLmFkZEJlZm9yZShub2RlLCBsb2FkKTsKICAgICAgICAgIGluc2VydGlvblBvaW50ID0gbG9hZDsKICAgICAgICB9CiAgICAgICAgU2VsZWN0b3IgY2FsbFNlbGVjdG9yID0gbmV3IFNlbGVjdG9yLmNhbGxDbG9zdXJlRnJvbShub2RlLnNlbGVjdG9yKTsKICAgICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bbG9hZF0KICAgICAgICAgIC4uYWRkQWxsKG5vZGUuaW5wdXRzLnNraXAobm9kZS5pc0ludGVyY2VwdGVkQ2FsbCA/IDIgOiAxKSk7CiAgICAgICAgRGFydFR5cGUgZmllbGRUeXBlID0KICAgICAgICAgICAgX2Nsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudC5nZXRGaWVsZFR5cGUoZmllbGQpOwogICAgICAgIEhJbnN0cnVjdGlvbiBjbG9zdXJlQ2FsbCA9IG5ldyBISW52b2tlQ2xvc3VyZSgKICAgICAgICAgICAgY2FsbFNlbGVjdG9yLAogICAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVGcm9tU3RhdGljVHlwZShmaWVsZFR5cGUpLmFic3RyYWN0VmFsdWUsCiAgICAgICAgICAgIGlucHV0cywKICAgICAgICAgICAgbm9kZS5pbnN0cnVjdGlvblR5cGUsCiAgICAgICAgICAgIG5vZGUudHlwZUFyZ3VtZW50cykKICAgICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBub2RlLnNvdXJjZUluZm9ybWF0aW9uOwogICAgICAgIG5vZGUuYmxvY2suYWRkQWZ0ZXIoaW5zZXJ0aW9uUG9pbnQsIGNsb3N1cmVDYWxsKTsKICAgICAgICByZXR1cm4gY2xvc3VyZUNhbGw7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbm9kZTsKICB9CgogIEhJbnN0cnVjdGlvbiB0cnlJbmxpbmVOYXRpdmVNZXRob2QoCiAgICAgIEhJbnZva2VEeW5hbWljTWV0aG9kIG5vZGUsIEZ1bmN0aW9uRW50aXR5IG1ldGhvZCkgewogICAgLy8gV2UgY2FuIHJlcGxhY2UgdGhlIGNhbGwgdG8gdGhlIG5hdGl2ZSBjbGFzcyBpbnRlcmNlcHRvciBtZXRob2QgKHRhcmdldCkKICAgIC8vIGlmIHRoZSB0YXJnZXQgZG9lcyBubyBjb252ZXJzaW9ucyBvciB1c2VmdWwgdHlwZSBjaGVja3MuCiAgICBpZiAoX29wdGlvbnMuZGlzYWJsZUlubGluaW5nKSByZXR1cm4gbnVsbDsKICAgIGlmIChfY2xvc2VkV29ybGQuYW5ub3RhdGlvbnNEYXRhLmhhc05vSW5saW5lKG1ldGhvZCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIW5vZGUuaXNJbnRlcmNlcHRlZENhbGwpIHJldHVybiBudWxsOwoKICAgIEZ1bmN0aW9uVHlwZSB0eXBlID0gX2Nsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUobWV0aG9kKTsKICAgIGlmICh0eXBlLm5hbWVkUGFyYW1ldGVycy5pc05vdEVtcHR5KSByZXR1cm4gbnVsbDsKCiAgICAvLyBUaGUgY2FsbCBzaXRlIG1pZ2h0IG9taXQgb3B0aW9uYWwgYXJndW1lbnRzLiBUaGUgaW5saW5lZCBjb2RlIG11c3QKICAgIC8vIHByZXNlcnZlIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLCBzbyBjaGVjayBvbmx5IHRoZSBhY3R1YWwgYXJndW1lbnRzLgoKICAgIGJvb2wgY2FuSW5saW5lID0gdHJ1ZTsKICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSBub2RlLmlucHV0czsKICAgIGludCBpbnB1dFBvc2l0aW9uID0gMjsgLy8gU2tpcCBpbnRlcmNlcHRvciBhbmQgcmVjZWl2ZXIuCgogICAgdm9pZCBjaGVja1BhcmFtZXRlclR5cGUoRGFydFR5cGUgcGFyYW1ldGVyVHlwZSkgewogICAgICBpZiAoIWNhbklubGluZSkgcmV0dXJuOwogICAgICBpZiAoaW5wdXRQb3NpdGlvbiA+PSBpbnB1dHMubGVuZ3RoKSByZXR1cm47CiAgICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IGlucHV0c1tpbnB1dFBvc2l0aW9uKytdOwogICAgICBpZiAocGFyYW1ldGVyVHlwZS51bmFsaWFzZWQuaXNGdW5jdGlvblR5cGUpIHsKICAgICAgICAvLyBNdXN0IGNhbGwgdGhlIHRhcmdldCBzaW5jZSBpdCBjb250YWlucyBhIGZ1bmN0aW9uIGNvbnZlcnNpb24uCiAgICAgICAgY2FuSW5saW5lID0gZmFsc2U7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICAvLyBJZiB0aGUgdGFyZ2V0IGhhcyBubyBjaGVja3MgZG9uJ3QgbGV0IGEgYmFkIHR5cGUgc3RvcCB1cyBpbmxpbmluZy4KICAgICAgaWYgKCFfY2xvc2VkV29ybGQuYW5ub3RhdGlvbnNEYXRhCiAgICAgICAgICAuZ2V0UGFyYW1ldGVyQ2hlY2tQb2xpY3kobWV0aG9kKQogICAgICAgICAgLmlzRW1pdHRlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgQWJzdHJhY3RWYWx1ZSBwYXJhbWV0ZXJBYnN0cmFjdFZhbHVlID0gX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgIC5nZXRBYnN0cmFjdFZhbHVlRm9yTmF0aXZlTWV0aG9kUGFyYW1ldGVyVHlwZShwYXJhbWV0ZXJUeXBlKTsKCiAgICAgIGlmIChwYXJhbWV0ZXJBYnN0cmFjdFZhbHVlID09IG51bGwgfHwKICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAgICAgLmlzSW4oaW5wdXQuaW5zdHJ1Y3Rpb25UeXBlLCBwYXJhbWV0ZXJBYnN0cmFjdFZhbHVlKQogICAgICAgICAgICAgIC5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgICBjYW5JbmxpbmUgPSBmYWxzZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICB0eXBlLnBhcmFtZXRlclR5cGVzLmZvckVhY2goY2hlY2tQYXJhbWV0ZXJUeXBlKTsKICAgIHR5cGUub3B0aW9uYWxQYXJhbWV0ZXJUeXBlcy5mb3JFYWNoKGNoZWNrUGFyYW1ldGVyVHlwZSk7CiAgICBhc3NlcnQodHlwZS5uYW1lZFBhcmFtZXRlclR5cGVzLmlzRW1wdHkpOwoKICAgIGlmICghY2FuSW5saW5lKSByZXR1cm4gbnVsbDsKCiAgICAvLyBTdHJlbmd0aGVuIGluc3RydWN0aW9uIHR5cGUgZnJvbSBhbm5vdGF0aW9ucyB0byBoZWxwIG9wdGltaXplCiAgICAvLyBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb25zLgogICAgTmF0aXZlQmVoYXZpb3IgbmF0aXZlQmVoYXZpb3IgPSBfbmF0aXZlRGF0YS5nZXROYXRpdmVNZXRob2RCZWhhdmlvcihtZXRob2QpOwogICAgQWJzdHJhY3RWYWx1ZSByZXR1cm5UeXBlID0KICAgICAgICBBYnN0cmFjdFZhbHVlRmFjdG9yeS5mcm9tTmF0aXZlQmVoYXZpb3IobmF0aXZlQmVoYXZpb3IsIF9jbG9zZWRXb3JsZCk7CiAgICBISW52b2tlRHluYW1pY01ldGhvZCByZXN1bHQgPSBuZXcgSEludm9rZUR5bmFtaWNNZXRob2QoCiAgICAgICAgbm9kZS5zZWxlY3RvciwKICAgICAgICBub2RlLnJlY2VpdmVyVHlwZSwKICAgICAgICBpbnB1dHMuc3VibGlzdCgxKSwgLy8gRHJvcCBpbnRlcmNlcHRvci4KICAgICAgICByZXR1cm5UeXBlLAogICAgICAgIG5vZGUudHlwZUFyZ3VtZW50cywKICAgICAgICBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgIHJlc3VsdC5lbGVtZW50ID0gbWV0aG9kOwogICAgX3JlZ2lzdHJ5LnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2UubWV0aG9kSW5saW5pbmcobWV0aG9kLCBudWxsKSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0Qm91bmRzQ2hlY2soSEJvdW5kc0NoZWNrIG5vZGUpIHsKICAgIEhJbnN0cnVjdGlvbiBpbmRleCA9IG5vZGUuaW5kZXg7CiAgICBpZiAoaW5kZXguaXNJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBub2RlOwogICAgfQogICAgaWYgKGluZGV4LmlzQ29uc3RhbnQoKSkgewogICAgICBIQ29uc3RhbnQgY29uc3RhbnRJbnN0cnVjdGlvbiA9IGluZGV4OwogICAgICBhc3NlcnQoIWNvbnN0YW50SW5zdHJ1Y3Rpb24uY29uc3RhbnQuaXNJbnQpOwogICAgICBpZiAoIWNvbnN0YW50X3N5c3RlbS5pc0ludChjb25zdGFudEluc3RydWN0aW9uLmNvbnN0YW50KSkgewogICAgICAgIC8vIC0wLjAgaXMgYSBkb3VibGUgYnV0IHdpbGwgcGFzcyB0aGUgcnVudGltZSBpbnRlZ2VyIGNoZWNrLgogICAgICAgIG5vZGUuc3RhdGljQ2hlY2tzID0gSEJvdW5kc0NoZWNrLkFMV0FZU19GQUxTRTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBISW5zdHJ1Y3Rpb24gZm9sZEJpbmFyeShjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbiwKICAgICAgSEluc3RydWN0aW9uIGxlZnQsIEhJbnN0cnVjdGlvbiByaWdodCkgewogICAgaWYgKGxlZnQgaXMgSENvbnN0YW50ICYmIHJpZ2h0IGlzIEhDb25zdGFudCkgewogICAgICBIQ29uc3RhbnQgb3AxID0gbGVmdDsKICAgICAgSENvbnN0YW50IG9wMiA9IHJpZ2h0OwogICAgICBDb25zdGFudFZhbHVlIGZvbGRlZCA9IG9wZXJhdGlvbi5mb2xkKG9wMS5jb25zdGFudCwgb3AyLmNvbnN0YW50KTsKICAgICAgaWYgKGZvbGRlZCAhPSBudWxsKSByZXR1cm4gX2dyYXBoLmFkZENvbnN0YW50KGZvbGRlZCwgX2Nsb3NlZFdvcmxkKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0QWRkKEhBZGQgbm9kZSkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBub2RlLmxlZnQ7CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBub2RlLnJpZ2h0OwogICAgLy8gV2UgY2FuIG9ubHkgcGVyZm9ybSB0aGlzIHJld3JpdGluZyBvbiBJbnRlZ2VyLCBhcyBpdCBpcyBub3QKICAgIC8vIHZhbGlkIGZvciAtMC4wLgogICAgaWYgKGxlZnQuaXNJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgcmlnaHQuaXNJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIGlmIChsZWZ0IGlzIEhDb25zdGFudCAmJiBsZWZ0LmNvbnN0YW50LmlzWmVybykgcmV0dXJuIHJpZ2h0OwogICAgICBpZiAocmlnaHQgaXMgSENvbnN0YW50ICYmIHJpZ2h0LmNvbnN0YW50LmlzWmVybykgcmV0dXJuIGxlZnQ7CiAgICB9CiAgICByZXR1cm4gc3VwZXIudmlzaXRBZGQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRNdWx0aXBseShITXVsdGlwbHkgbm9kZSkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBub2RlLmxlZnQ7CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBub2RlLnJpZ2h0OwogICAgaWYgKGxlZnQuaXNOdW1iZXIoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICByaWdodC5pc051bWJlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBpZiAobGVmdCBpcyBIQ29uc3RhbnQgJiYgbGVmdC5jb25zdGFudC5pc09uZSkgcmV0dXJuIHJpZ2h0OwogICAgICBpZiAocmlnaHQgaXMgSENvbnN0YW50ICYmIHJpZ2h0LmNvbnN0YW50LmlzT25lKSByZXR1cm4gbGVmdDsKICAgIH0KICAgIHJldHVybiBzdXBlci52aXNpdE11bHRpcGx5KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0SW52b2tlQmluYXJ5KEhJbnZva2VCaW5hcnkgbm9kZSkgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBub2RlLmxlZnQ7CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBub2RlLnJpZ2h0OwogICAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBub2RlLm9wZXJhdGlvbigpOwogICAgSENvbnN0YW50IGZvbGRlZCA9IGZvbGRCaW5hcnkob3BlcmF0aW9uLCBsZWZ0LCByaWdodCk7CiAgICBpZiAoZm9sZGVkICE9IG51bGwpIHJldHVybiBmb2xkZWQ7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdFJlbGF0aW9uYWwoSFJlbGF0aW9uYWwgbm9kZSkgewogICAgcmV0dXJuIHN1cGVyLnZpc2l0UmVsYXRpb25hbChub2RlKTsKICB9CgogIEhJbnN0cnVjdGlvbiBoYW5kbGVJZGVudGl0eUNoZWNrKEhSZWxhdGlvbmFsIG5vZGUpIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gbm9kZS5sZWZ0OwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gbm9kZS5yaWdodDsKICAgIEFic3RyYWN0VmFsdWUgbGVmdFR5cGUgPSBsZWZ0Lmluc3RydWN0aW9uVHlwZTsKICAgIEFic3RyYWN0VmFsdWUgcmlnaHRUeXBlID0gcmlnaHQuaW5zdHJ1Y3Rpb25UeXBlOwoKICAgIEhJbnN0cnVjdGlvbiBtYWtlVHJ1ZSgpID0+IF9ncmFwaC5hZGRDb25zdGFudEJvb2wodHJ1ZSwgX2Nsb3NlZFdvcmxkKTsKICAgIEhJbnN0cnVjdGlvbiBtYWtlRmFsc2UoKSA9PiBfZ3JhcGguYWRkQ29uc3RhbnRCb29sKGZhbHNlLCBfY2xvc2VkV29ybGQpOwoKICAgIC8vIEludGVyc2VjdGlvbiBvZiBpbnQgYW5kIGRvdWJsZSByZXR1cm4gY29uZmxpY3RpbmcsIHNvCiAgICAvLyB3ZSBkb24ndCBvcHRpbWl6ZSBvbiBudW1iZXJzIHRvIHByZXNlcnZlIHRoZSBydW50aW1lIHNlbWFudGljcy4KICAgIGlmICghKGxlZnQuaXNOdW1iZXJPck51bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICByaWdodC5pc051bWJlck9yTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkpIHsKICAgICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgICAuYXJlRGlzam9pbnQobGVmdFR5cGUsIHJpZ2h0VHlwZSkKICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgcmV0dXJuIG1ha2VGYWxzZSgpOwogICAgICB9CiAgICB9CgogICAgaWYgKGxlZnQuaXNOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgcmlnaHQuaXNOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBtYWtlVHJ1ZSgpOwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiBjb21wYXJlQ29uc3RhbnQoSENvbnN0YW50IGNvbnN0YW50LCBISW5zdHJ1Y3Rpb24gaW5wdXQpIHsKICAgICAgaWYgKGNvbnN0YW50LmNvbnN0YW50LmlzVHJ1ZSkgewogICAgICAgIHJldHVybiBpbnB1dDsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IEhOb3QoaW5wdXQsIF9hYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlKTsKICAgICAgfQogICAgfQoKICAgIGlmIChsZWZ0LmlzQ29uc3RhbnRCb29sZWFuKCkgJiYKICAgICAgICByaWdodC5pc0Jvb2xlYW4oX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIGNvbXBhcmVDb25zdGFudChsZWZ0LCByaWdodCk7CiAgICB9CgogICAgaWYgKHJpZ2h0LmlzQ29uc3RhbnRCb29sZWFuKCkgJiYKICAgICAgICBsZWZ0LmlzQm9vbGVhbihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gY29tcGFyZUNvbnN0YW50KHJpZ2h0LCBsZWZ0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKGxlZnQubm9uQ2hlY2soKSwgcmlnaHQubm9uQ2hlY2soKSkpIHsKICAgICAgLy8gQXZvaWQgY29uc3RhbnQtZm9sZGluZyBgaWRlbnRpY2FsKHgsIHgpYCB3aGVuIGB4YCBtaWdodCBiZSBkb3VibGUuICBUaGUKICAgICAgLy8gZGFydDJqcyBydW50aW1lIGhhcyBub3QgYWx3YXlzIGJlZW4gY29uc2lzdGVudCB3aXRoIHRoZSBEYXJ0CiAgICAgIC8vIHNwZWNpZmljYXRpb24gKHNlY3Rpb24gMTYuMC4xKSwgd2hpY2ggbWFrZXMgZGlzdGluY3Rpb25zIG9uIE5hTnMgYW5kCiAgICAgIC8vIC0wLjAgdGhhdCBhcmUgaGFyZCB0byBpbXBsZW1lbnQgZWZmaWNpZW50bHkuCiAgICAgIGlmIChsZWZ0LmlzSW50ZWdlck9yTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAgIHJldHVybiBtYWtlVHJ1ZSgpOwogICAgICB9CiAgICAgIGlmIChsZWZ0LmlzUHJpbWl0aXZlTnVtYmVyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlGYWxzZSkgewogICAgICAgIHJldHVybiBtYWtlVHJ1ZSgpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRJZGVudGl0eShISWRlbnRpdHkgbm9kZSkgewogICAgSEluc3RydWN0aW9uIG5ld0luc3RydWN0aW9uID0gaGFuZGxlSWRlbnRpdHlDaGVjayhub2RlKTsKICAgIHJldHVybiBuZXdJbnN0cnVjdGlvbiA9PSBudWxsID8gc3VwZXIudmlzaXRJZGVudGl0eShub2RlKSA6IG5ld0luc3RydWN0aW9uOwogIH0KCiAgdm9pZCBzaW1wbGlmeUNvbmRpdGlvbigKICAgICAgSEJhc2ljQmxvY2sgYmxvY2ssIEhJbnN0cnVjdGlvbiBjb25kaXRpb24sIGJvb2wgdmFsdWUpIHsKICAgIC8vIGBleGNsdWRlUGhpT3V0RWRnZXM6IHRydWVgIHByZXZlbnRzIHJlcGxhY2luZyBhIHBhcnRpYWxseSBkb21pbmF0ZWQgcGhpCiAgICAvLyBub2RlIGlucHV0IHdpdGggYSBjb25zdGFudC4gVGhpcyB0ZW5kcyB0byBhZGQgdW5uZWNlc3NhcnkgYXNzaWdubWVudHMsIGJ5CiAgICAvLyB0cmFuc2Zvcm1pbmcgdGhlIGZvbGxvd2luZywgd2hpY2ggaGFzIHBoaShmYWxzZSwgeCksCiAgICAvLwogICAgLy8gICAgaWYgKHgpIHsgaW5pdCgpOyB4ID0gZmFsc2U7IH0KICAgIC8vCiAgICAvLyBpbnRvIHRoaXMsIHdoaWNoIGhhcyBwaGkoZmFsc2UsIGZhbHNlKQogICAgLy8KICAgIC8vICAgIGlmICh4KSB7IGluaXQoKTsgeCA9IGZhbHNlOyB9IGVsc2UgeyB4ID0gZmFsc2U7IH0KICAgIC8vCiAgICAvLyB3aGljaCBpcyBmdXJ0aGVyIHNpbXBsaWZpZWQgdG86CiAgICAvLwogICAgLy8gICAgaWYgKHgpIHsgaW5pdCgpOyB9CiAgICAvLyAgICAuLi4KICAgIC8vICAgIHggPSBmYWxzZTsKICAgIC8vCiAgICAvLyBUaGlzIGlzIG1vc3RseSBoYXJtbGVzcyAoaWYgYSBsaXR0bGUgY29uZnVzaW5nKSBidXQgZG9lcyBjYXVzZSBhIGxvdCBvZgogICAgLy8gYHggPSBmYWxzZTtgIGNvcGllcyB0byBiZSBpbnNlcnRlZCB3aGVuIGEgbG9vcCBib2R5IGhhcyBtYW55IGNvbnRpbnVlCiAgICAvLyBzdGF0ZW1lbnRzIG9yIGVuZHMgd2l0aCBhIHN3aXRjaC4KICAgIERvbWluYXRlZFVzZXMgdXNlcyA9CiAgICAgICAgRG9taW5hdGVkVXNlcy5vZihjb25kaXRpb24sIGJsb2NrLmZpcnN0LCBleGNsdWRlUGhpT3V0RWRnZXM6IHRydWUpOwogICAgaWYgKHVzZXMuaXNFbXB0eSkgcmV0dXJuOwogICAgdXNlcy5yZXBsYWNlV2l0aChfZ3JhcGguYWRkQ29uc3RhbnRCb29sKHZhbHVlLCBfY2xvc2VkV29ybGQpKTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdElmKEhJZiBub2RlKSB7CiAgICBISW5zdHJ1Y3Rpb24gY29uZGl0aW9uID0gbm9kZS5jb25kaXRpb247CiAgICBpZiAoY29uZGl0aW9uLmlzQ29uc3RhbnQoKSkgcmV0dXJuIG5vZGU7CiAgICBib29sIGlzTmVnYXRlZCA9IGNvbmRpdGlvbiBpcyBITm90OwoKICAgIGlmIChpc05lZ2F0ZWQpIHsKICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmlucHV0c1swXTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIGZvciBMSUNNIHRvIG1vdmUgYSBuZWdhdGVkIHZlcnNpb24gb2YgdGhlCiAgICAgIC8vIGNvbmRpdGlvbiBvdXQgb2YgdGhlIGxvb3Agd2hlcmUgaXQgdXNlZC4gV2Ugc3RpbGwgd2FudCB0bwogICAgICAvLyBzaW1wbGlmeSB0aGUgbmVzdGVkIHVzZSBvZiB0aGUgY29uZGl0aW9uIGluIHRoYXQgY2FzZSwgc28KICAgICAgLy8gd2UgbG9vayBmb3IgYWxsIGRvbWluYXRpbmcgbmVnYXRlZCBjb25kaXRpb25zIGFuZCByZXBsYWNlCiAgICAgIC8vIG5lc3RlZCB1c2VzIG9mIHRoZW0gd2l0aCB0cnVlIG9yIGZhbHNlLgogICAgICBJdGVyYWJsZTxISW5zdHJ1Y3Rpb24+IGRvbWluYXRpbmcgPSBjb25kaXRpb24udXNlZEJ5CiAgICAgICAgICAud2hlcmUoKHVzZXIpID0+IHVzZXIgaXMgSE5vdCAmJiB1c2VyLmRvbWluYXRlcyhub2RlKSk7CiAgICAgIGRvbWluYXRpbmcuZm9yRWFjaCgoaG9pc3RlZCkgewogICAgICAgIHNpbXBsaWZ5Q29uZGl0aW9uKG5vZGUudGhlbkJsb2NrLCBob2lzdGVkLCBmYWxzZSk7CiAgICAgICAgc2ltcGxpZnlDb25kaXRpb24obm9kZS5lbHNlQmxvY2ssIGhvaXN0ZWQsIHRydWUpOwogICAgICB9KTsKICAgIH0KICAgIHNpbXBsaWZ5Q29uZGl0aW9uKG5vZGUudGhlbkJsb2NrLCBjb25kaXRpb24sICFpc05lZ2F0ZWQpOwogICAgc2ltcGxpZnlDb25kaXRpb24obm9kZS5lbHNlQmxvY2ssIGNvbmRpdGlvbiwgaXNOZWdhdGVkKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0SXMoSElzIG5vZGUpIHsKICAgIERhcnRUeXBlIHR5cGUgPSBub2RlLnR5cGVFeHByZXNzaW9uOwoKICAgIGlmICghbm9kZS5pc1Jhd0NoZWNrKSB7CiAgICAgIHJldHVybiBub2RlOwogICAgfSBlbHNlIGlmICh0eXBlLmlzVHlwZWRlZikgewogICAgICByZXR1cm4gbm9kZTsKICAgIH0gZWxzZSBpZiAodHlwZS5pc0Z1bmN0aW9uVHlwZSkgewogICAgICByZXR1cm4gbm9kZTsKICAgIH0gZWxzZSBpZiAodHlwZS5pc0Z1dHVyZU9yKSB7CiAgICAgIHJldHVybiBub2RlOwogICAgfQoKICAgIGlmICh0eXBlID09IGNvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGUgfHwgdHlwZS50cmVhdEFzRHluYW1pYykgewogICAgICByZXR1cm4gX2dyYXBoLmFkZENvbnN0YW50Qm9vbCh0cnVlLCBfY2xvc2VkV29ybGQpOwogICAgfQogICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlID0gdHlwZTsKICAgIENsYXNzRW50aXR5IGVsZW1lbnQgPSBpbnRlcmZhY2VUeXBlLmVsZW1lbnQ7CiAgICBISW5zdHJ1Y3Rpb24gZXhwcmVzc2lvbiA9IG5vZGUuZXhwcmVzc2lvbjsKICAgIGlmIChleHByZXNzaW9uLmlzSW50ZWdlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5pbnRDbGFzcyB8fAogICAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5udW1DbGFzcyB8fAogICAgICAgICAgY29tbW9uRWxlbWVudHMuaXNOdW1iZXJPclN0cmluZ1N1cGVydHlwZShlbGVtZW50KSkgewogICAgICAgIHJldHVybiBfZ3JhcGguYWRkQ29uc3RhbnRCb29sKHRydWUsIF9jbG9zZWRXb3JsZCk7CiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5kb3VibGVDbGFzcykgewogICAgICAgIC8vIFdlIGxldCB0aGUgSlMgc2VtYW50aWNzIGRlY2lkZSBmb3IgdGhhdCBjaGVjay4gQ3VycmVudGx5CiAgICAgICAgLy8gdGhlIGNvZGUgd2UgZW1pdCB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZS4KICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gX2dyYXBoLmFkZENvbnN0YW50Qm9vbChmYWxzZSwgX2Nsb3NlZFdvcmxkKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmlzRG91YmxlKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIGlmIChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmRvdWJsZUNsYXNzIHx8CiAgICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLm51bUNsYXNzIHx8CiAgICAgICAgICBjb21tb25FbGVtZW50cy5pc051bWJlck9yU3RyaW5nU3VwZXJ0eXBlKGVsZW1lbnQpKSB7CiAgICAgICAgcmV0dXJuIF9ncmFwaC5hZGRDb25zdGFudEJvb2wodHJ1ZSwgX2Nsb3NlZFdvcmxkKTsKICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmludENsYXNzKSB7CiAgICAgICAgLy8gV2UgbGV0IHRoZSBKUyBzZW1hbnRpY3MgZGVjaWRlIGZvciB0aGF0IGNoZWNrLiBDdXJyZW50bHkKICAgICAgICAvLyB0aGUgY29kZSB3ZSBlbWl0IHdpbGwgcmV0dXJuIHRydWUgZm9yIGEgZG91YmxlIHRoYXQgY2FuIGJlCiAgICAgICAgLy8gcmVwcmVzZW50ZWQgYXMgYSAzMS1iaXQgaW50ZWdlciBhbmQgZm9yIC0wLjAuCiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIF9ncmFwaC5hZGRDb25zdGFudEJvb2woZmFsc2UsIF9jbG9zZWRXb3JsZCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5pc051bWJlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5udW1DbGFzcykgewogICAgICAgIHJldHVybiBfZ3JhcGguYWRkQ29uc3RhbnRCb29sKHRydWUsIF9jbG9zZWRXb3JsZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gV2UgY2Fubm90IGp1c3QgcmV0dXJuIGZhbHNlLCBiZWNhdXNlIHRoZSBleHByZXNzaW9uIG1heSBiZSBvZgogICAgICAgIC8vIHR5cGUgaW50IG9yIGRvdWJsZS4KICAgICAgfQogICAgfSBlbHNlIGlmIChleHByZXNzaW9uCiAgICAgICAgICAgIC5pc1ByaW1pdGl2ZU51bWJlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgLmlzUG90ZW50aWFsbHlUcnVlICYmCiAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5pbnRDbGFzcykgewogICAgICAvLyBXZSBsZXQgdGhlIEpTIHNlbWFudGljcyBkZWNpZGUgZm9yIHRoYXQgY2hlY2suCiAgICAgIHJldHVybiBub2RlOwogICAgICAvLyBXZSBuZWVkIHRoZSBbOmhhc1R5cGVBcmd1bWVudHM6XSBjaGVjayBiZWNhdXNlIHdlIGRvbid0IGhhdmUKICAgICAgLy8gdGhlIG5vdGlvbiBvZiBnZW5lcmljcyBpbiB0aGUgYmFja2VuZC4gRm9yIGV4YW1wbGUsIFs6dGhpczpdIGluCiAgICAgIC8vIGEgY2xhc3MgWzpBPFQ+Ol0sIGlzIGN1cnJlbnRseSBhbHdheXMgY29uc2lkZXJlZCB0byBoYXZlIHRoZQogICAgICAvLyByYXcgdHlwZS4KICAgIH0gZWxzZSBpZiAoIVJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnMuaGFzVHlwZUFyZ3VtZW50cyh0eXBlKSkgewogICAgICBBYnN0cmFjdFZhbHVlIGV4cHJlc3Npb25NYXNrID0gZXhwcmVzc2lvbi5pbnN0cnVjdGlvblR5cGU7CiAgICAgIEFic3RyYWN0Qm9vbCBpc0luc3RhbmNlT2YgPQogICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uaXNJbnN0YW5jZU9mKGV4cHJlc3Npb25NYXNrLCBlbGVtZW50KTsKICAgICAgaWYgKGlzSW5zdGFuY2VPZi5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgcmV0dXJuIF9ncmFwaC5hZGRDb25zdGFudEJvb2wodHJ1ZSwgX2Nsb3NlZFdvcmxkKTsKICAgICAgfSBlbHNlIGlmIChpc0luc3RhbmNlT2YuaXNEZWZpbml0ZWx5RmFsc2UpIHsKICAgICAgICByZXR1cm4gX2dyYXBoLmFkZENvbnN0YW50Qm9vbChmYWxzZSwgX2Nsb3NlZFdvcmxkKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRUeXBlQ29udmVyc2lvbihIVHlwZUNvbnZlcnNpb24gbm9kZSkgewogICAgaWYgKG5vZGUuaXNSZWR1bmRhbnQoX2Nsb3NlZFdvcmxkKSkgcmV0dXJuIG5vZGUuY2hlY2tlZElucHV0OwoKICAgIC8vIFNpbXBsaWZ5ICdhcyBUJyB3aGVyZSBUIGlzIGEgc2ltcGxlIHR5cGUuCiAgICBEYXJ0VHlwZSBjaGVja2VkVHlwZSA9IG5vZGUudHlwZUV4cHJlc3Npb247CiAgICBpZiAoY2hlY2tlZFR5cGUgaXMgVHlwZVZhcmlhYmxlVHlwZSAmJiBub2RlLmlucHV0cy5sZW5ndGggPT0gMikgewogICAgICBISW5zdHJ1Y3Rpb24gcmVwID0gbm9kZS50eXBlUmVwcmVzZW50YXRpb247CiAgICAgIGlmIChyZXAgaXMgSFR5cGVJbmZvRXhwcmVzc2lvbiAmJgogICAgICAgICAgcmVwLmtpbmQgPT0gVHlwZUluZm9FeHByZXNzaW9uS2luZC5DT01QTEVURSAmJgogICAgICAgICAgcmVwLmlucHV0cy5pc0VtcHR5KSB7CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IHJlcC5kYXJ0VHlwZTsKICAgICAgICBpZiAodHlwZS5pc0ludGVyZmFjZVR5cGUgJiYgdHlwZS50cmVhdEFzUmF3KSB7CiAgICAgICAgICByZXR1cm4gbm9kZS5jaGVja2VkSW5wdXQuY29udmVydFR5cGUoX2Nsb3NlZFdvcmxkLCB0eXBlLCBub2RlLmtpbmQpCiAgICAgICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBub2RlLnNvdXJjZUluZm9ybWF0aW9uOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0UHJpbWl0aXZlQ2hlY2soSFByaW1pdGl2ZUNoZWNrIG5vZGUpIHsKICAgIGlmIChub2RlLmlzUmVkdW5kYW50KF9jbG9zZWRXb3JsZCkpIHJldHVybiBub2RlLmNoZWNrZWRJbnB1dDsKICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0Qm9vbENvbnZlcnNpb24oSEJvb2xDb252ZXJzaW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmlzUmVkdW5kYW50KF9jbG9zZWRXb3JsZCkpIHJldHVybiBub2RlLmNoZWNrZWRJbnB1dDsKICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0VHlwZUtub3duKEhUeXBlS25vd24gbm9kZSkgewogICAgcmV0dXJuIG5vZGUuaXNSZWR1bmRhbnQoX2Nsb3NlZFdvcmxkKSA/IG5vZGUuY2hlY2tlZElucHV0IDogbm9kZTsKICB9CgogIEZpZWxkRW50aXR5IGZpbmRDb25jcmV0ZUZpZWxkRm9yRHluYW1pY0FjY2VzcygKICAgICAgSEludm9rZUR5bmFtaWNGaWVsZCBub2RlLCBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIpIHsKICAgIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXIuaW5zdHJ1Y3Rpb25UeXBlOwogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IG5vZGUuZWxlbWVudCBpcyBGaWVsZEVudGl0eQogICAgICAgID8gbm9kZS5lbGVtZW50CiAgICAgICAgOiBfY2xvc2VkV29ybGQubG9jYXRlU2luZ2xlTWVtYmVyKG5vZGUuc2VsZWN0b3IsIHJlY2VpdmVyVHlwZSk7CiAgICByZXR1cm4gbWVtYmVyIGlzIEZpZWxkRW50aXR5ID8gbWVtYmVyIDogbnVsbDsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdEZpZWxkR2V0KEhGaWVsZEdldCBub2RlKSB7CiAgICBpZiAobm9kZS5pc051bGxDaGVjaykgcmV0dXJuIG5vZGU7CiAgICB2YXIgcmVjZWl2ZXIgPSBub2RlLnJlY2VpdmVyOwoKICAgIC8vIEhGaWVsZEdldCBvZiBhIGNvbnN0cnVjdGVkIGNvbnN0YW50IGNhbiBiZSByZXBsYWNlZCB3aXRoIHRoZSBjb25zdGFudCdzCiAgICAvLyBmaWVsZC4KICAgIGlmIChyZWNlaXZlciBpcyBIQ29uc3RhbnQpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IHJlY2VpdmVyLmNvbnN0YW50OwogICAgICBpZiAoY29uc3RhbnQuaXNDb25zdHJ1Y3RlZE9iamVjdCkgewogICAgICAgIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSBjb25zdHJ1Y3RlZENvbnN0YW50ID0gY29uc3RhbnQ7CiAgICAgICAgTWFwPEZpZWxkRW50aXR5LCBDb25zdGFudFZhbHVlPiBmaWVsZHMgPSBjb25zdHJ1Y3RlZENvbnN0YW50LmZpZWxkczsKICAgICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gZmllbGRzW25vZGUuZWxlbWVudF07CiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgIHJldHVybiBfZ3JhcGguYWRkQ29uc3RhbnQodmFsdWUsIF9jbG9zZWRXb3JsZCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRHZXRMZW5ndGgoSEdldExlbmd0aCBub2RlKSB7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBub2RlLnJlY2VpdmVyOwogICAgaWYgKF9ncmFwaC5hbGxvY2F0ZWRGaXhlZExpc3RzLmNvbnRhaW5zKHJlY2VpdmVyKSkgewogICAgICAvLyBUT0RPKG5nZW9mZnJheSk6IGNoZWNraW5nIGlmIHRoZSBzZWNvbmQgaW5wdXQgaXMgYW4gaW50ZWdlcgogICAgICAvLyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSBidXQgaXQgY3VycmVudGx5IG1ha2VzIGl0IGVhc2llciBmb3IKICAgICAgLy8gb3RoZXIgb3B0aW1pemF0aW9ucyB0byByZWFzb24gYWJvdXQgYSBmaXhlZCBsZW5ndGggY29uc3RydWN0b3IKICAgICAgLy8gdGhhdCB3ZSBrbm93IHRha2VzIGFuIGludC4KICAgICAgaWYgKHJlY2VpdmVyLmlucHV0c1swXS5pc0ludGVnZXIoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICByZXR1cm4gcmVjZWl2ZXIuaW5wdXRzWzBdOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHJlY2VpdmVyLmlzQ29uc3RhbnRMaXN0KCkpIHsKICAgICAgSENvbnN0YW50IGNvbnN0YW50UmVjZWl2ZXIgPSByZWNlaXZlcjsKICAgICAgTGlzdENvbnN0YW50VmFsdWUgY29uc3RhbnQgPSBjb25zdGFudFJlY2VpdmVyLmNvbnN0YW50OwogICAgICByZXR1cm4gX2dyYXBoLmFkZENvbnN0YW50SW50KGNvbnN0YW50Lmxlbmd0aCwgX2Nsb3NlZFdvcmxkKTsKICAgIH0gZWxzZSBpZiAocmVjZWl2ZXIuaXNDb25zdGFudFN0cmluZygpKSB7CiAgICAgIEhDb25zdGFudCBjb25zdGFudFJlY2VpdmVyID0gcmVjZWl2ZXI7CiAgICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgY29uc3RhbnQgPSBjb25zdGFudFJlY2VpdmVyLmNvbnN0YW50OwogICAgICByZXR1cm4gX2dyYXBoLmFkZENvbnN0YW50SW50KGNvbnN0YW50Lmxlbmd0aCwgX2Nsb3NlZFdvcmxkKTsKICAgIH0gZWxzZSB7CiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSA9IHJlY2VpdmVyLmluc3RydWN0aW9uVHlwZTsKICAgICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzQ29udGFpbmVyKHR5cGUpICYmCiAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRDb250YWluZXJMZW5ndGgodHlwZSkgIT0gbnVsbCkgewogICAgICAgIEhJbnN0cnVjdGlvbiBjb25zdGFudCA9IF9ncmFwaC5hZGRDb25zdGFudEludCgKICAgICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZ2V0Q29udGFpbmVyTGVuZ3RoKHR5cGUpLCBfY2xvc2VkV29ybGQpOwogICAgICAgIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc051bGwodHlwZSkuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgICAgIC8vIElmIHRoZSBjb250YWluZXIgY2FuIGJlIG51bGwsIHdlIHVwZGF0ZSBhbGwgdXNlcyBvZiB0aGUgbGVuZ3RoCiAgICAgICAgICAvLyBhY2Nlc3MgdG8gdXNlIHRoZSBjb25zdGFudCBpbnN0ZWFkLCBidXQga2VlcCB0aGUgbGVuZ3RoIGFjY2VzcyBpbgogICAgICAgICAgLy8gdGhlIGdyYXBoLCB0byBlbnN1cmUgd2Ugc3RpbGwgaGF2ZSBhIG51bGwgY2hlY2suCiAgICAgICAgICBub2RlLmJsb2NrLnJld3JpdGUobm9kZSwgY29uc3RhbnQpOwogICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBjb25zdGFudDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAobm9kZS5pc0Fzc2lnbmFibGUgJiYKICAgICAgICBpc0ZpeGVkTGVuZ3RoKHJlY2VpdmVyLmluc3RydWN0aW9uVHlwZSwgX2Nsb3NlZFdvcmxkKSkgewogICAgICAvLyBUaGUgaW5wdXQgdHlwZSBoYXMgY2hhbmdlZCB0byBmaXhlZC1sZW5ndGggc28gY2hhbmdlIHRvIGFuIHVuYXNzaWduYWJsZQogICAgICAvLyBIR2V0TGVuZ3RoIHRvIGFsbG93IG1vcmUgR1ZOIG9wdGltaXphdGlvbnMuCiAgICAgIHJldHVybiBuZXcgSEdldExlbmd0aChyZWNlaXZlciwgbm9kZS5pbnN0cnVjdGlvblR5cGUsCiAgICAgICAgICBpc0Fzc2lnbmFibGU6IGZhbHNlKTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0SW5kZXgoSEluZGV4IG5vZGUpIHsKICAgIGlmIChub2RlLnJlY2VpdmVyLmlzQ29uc3RhbnRMaXN0KCkgJiYgbm9kZS5pbmRleC5pc0NvbnN0YW50SW50ZWdlcigpKSB7CiAgICAgIEhDb25zdGFudCBpbnN0cnVjdGlvbiA9IG5vZGUucmVjZWl2ZXI7CiAgICAgIExpc3RDb25zdGFudFZhbHVlIGxpc3QgPSBpbnN0cnVjdGlvbi5jb25zdGFudDsKICAgICAgTGlzdDxDb25zdGFudFZhbHVlPiBlbnRyaWVzID0gbGlzdC5lbnRyaWVzOwogICAgICBIQ29uc3RhbnQgaW5kZXhJbnN0cnVjdGlvbiA9IG5vZGUuaW5kZXg7CiAgICAgIEludENvbnN0YW50VmFsdWUgaW5kZXhDb25zdGFudCA9IGluZGV4SW5zdHJ1Y3Rpb24uY29uc3RhbnQ7CiAgICAgIGludCBpbmRleCA9IGluZGV4Q29uc3RhbnQuaW50VmFsdWUudG9JbnQoKTsKICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkgewogICAgICAgIHJldHVybiBfZ3JhcGguYWRkQ29uc3RhbnQoZW50cmllc1tpbmRleF0sIF9jbG9zZWRXb3JsZCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0SW52b2tlRHluYW1pY0dldHRlcihISW52b2tlRHluYW1pY0dldHRlciBub2RlKSB7CiAgICBwcm9wYWdhdGVDb25zdGFudFZhbHVlVG9Vc2VzKG5vZGUpOwogICAgaWYgKG5vZGUuaXNJbnRlcmNlcHRlZENhbGwpIHsKICAgICAgSEluc3RydWN0aW9uIGZvbGRlZCA9IGhhbmRsZUludGVyY2VwdGVkQ2FsbChub2RlKTsKICAgICAgaWYgKGZvbGRlZCAhPSBub2RlKSByZXR1cm4gZm9sZGVkOwogICAgfQogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gbm9kZS5nZXREYXJ0UmVjZWl2ZXIoX2Nsb3NlZFdvcmxkKTsKICAgIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXIuaW5zdHJ1Y3Rpb25UeXBlOwogICAgRmllbGRFbnRpdHkgZmllbGQgPSBub2RlLmVsZW1lbnQgaXMgRmllbGRFbnRpdHkKICAgICAgICA/IG5vZGUuZWxlbWVudAogICAgICAgIDogZmluZENvbmNyZXRlRmllbGRGb3JEeW5hbWljQWNjZXNzKG5vZGUsIHJlY2VpdmVyKTsKICAgIGlmIChmaWVsZCAhPSBudWxsKSB7CiAgICAgIEZpZWxkQW5hbHlzaXNEYXRhIGZpZWxkRGF0YSA9CiAgICAgICAgICBfY2xvc2VkV29ybGQuZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEoZmllbGQpOwogICAgICBpZiAoZmllbGREYXRhLmlzRWZmZWN0aXZlbHlDb25zdGFudCkgewogICAgICAgIC8vIFRoZSBmaWVsZCBpcyBlbGlkZWQgYW5kIHJlcGxhY2UgaXQgd2l0aCBpdHMgY29uc3RhbnQgdmFsdWUuCiAgICAgICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbChyZWNlaXZlclR5cGUpLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgICAgICAvLyBUaGUgcmVjZWl2ZXIgaXMgcG90ZW50aWFsbHkgYG51bGxgIHNvIHdlIGluc2VydCBhIG51bGwgcmVjZWl2ZXIKICAgICAgICAgIC8vIGd1YXJkIHRvIHRyaWdnZXIgYSBudWxsIHBvaW50ZXIgZXhjZXB0aW9uLgogICAgICAgICAgLy8KICAgICAgICAgIC8vIFRoaXMgY291bGQgYmUgaW5zZXJ0ZWQgdW5jb25kaXRpb25hbGx5IGFuZCByZW1vdmVkIGJ5IGxhdGVyCiAgICAgICAgICAvLyBvcHRpbWl6YXRpb25zIGlmIHVubmVjZXNzYXJ5LCBidXQgcGVyZm9ybWFuY2Ugd2UgZG8gaXQKICAgICAgICAgIC8vIGNvbmRpdGlvbmFsbHkgaGVyZS4KICAgICAgICAgIC8vIFRPRE8oMzU5OTYpOiBSZXBsYWNlIHdpdGggbnVsbCByZWNlaXZlciBndWFyZCBpbnN0cnVjdGlvbi4KICAgICAgICAgIEhJbnN0cnVjdGlvbiBkdW1teUdldCA9IG5ldyBIRmllbGRHZXQobnVsbCwgcmVjZWl2ZXIsCiAgICAgICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUsIG5vZGUuc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgICAgICAgaXNBc3NpZ25hYmxlOiBmYWxzZSk7CiAgICAgICAgICBfbG9nPy5yZWdpc3RlckZpZWxkR2V0KG5vZGUsIGR1bW15R2V0KTsKICAgICAgICAgIG5vZGUuYmxvY2suYWRkQmVmb3JlKG5vZGUsIGR1bW15R2V0KTsKICAgICAgICB9CiAgICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IGZpZWxkRGF0YS5jb25zdGFudFZhbHVlOwogICAgICAgIEhDb25zdGFudCByZXN1bHQgPSBfZ3JhcGguYWRkQ29uc3RhbnQoY29uc3RhbnQsIF9jbG9zZWRXb3JsZCwKICAgICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IG5vZGUuc291cmNlSW5mb3JtYXRpb24pOwogICAgICAgIF9sb2c/LnJlZ2lzdGVyQ29uc3RhbnRGaWVsZEdldChub2RlLCBmaWVsZCwgcmVzdWx0KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9IGVsc2UgewogICAgICAgIEhGaWVsZEdldCByZXN1bHQgPSBfZGlyZWN0RmllbGRHZXQocmVjZWl2ZXIsIGZpZWxkLCBub2RlKTsKICAgICAgICBfbG9nPy5yZWdpc3RlckZpZWxkR2V0KG5vZGUsIHJlc3VsdCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfQoKICAgIG5vZGUuZWxlbWVudCA/Pz0KICAgICAgICBfY2xvc2VkV29ybGQubG9jYXRlU2luZ2xlTWVtYmVyKG5vZGUuc2VsZWN0b3IsIHJlY2VpdmVyVHlwZSk7CiAgICBpZiAobm9kZS5lbGVtZW50ICE9IG51bGwgJiYKICAgICAgICBub2RlLmVsZW1lbnQubmFtZSA9PSBub2RlLnNlbGVjdG9yLm5hbWUgJiYKICAgICAgICBub2RlLmVsZW1lbnQuaXNGdW5jdGlvbikgewogICAgICAvLyBBIHByb3BlcnR5IGV4dHJhY3Rpb24gZ2V0dGVyLCBha2EgYSB0ZWFyLW9mZi4KICAgICAgbm9kZS5zaWRlRWZmZWN0cy5jbGVhckFsbERlcGVuZGVuY2llcygpOwogICAgICBub2RlLnNpZGVFZmZlY3RzLmNsZWFyQWxsU2lkZUVmZmVjdHMoKTsKICAgICAgbm9kZS5zZXRVc2VHdm4oKTsgLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCBpZGVudGl0eSBvZiB0ZWFyLW9mZnMuCiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEhJbnN0cnVjdGlvbiBfZGlyZWN0RmllbGRHZXQoCiAgICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciwgRmllbGRFbnRpdHkgZmllbGQsIEhJbnN0cnVjdGlvbiBub2RlKSB7CiAgICBib29sIGlzQXNzaWduYWJsZSA9ICFfY2xvc2VkV29ybGQuZmllbGROZXZlckNoYW5nZXMoZmllbGQpOwoKICAgIEFic3RyYWN0VmFsdWUgdHlwZTsKICAgIGlmIChfbmF0aXZlRGF0YS5pc05hdGl2ZUNsYXNzKGZpZWxkLmVuY2xvc2luZ0NsYXNzKSkgewogICAgICB0eXBlID0gQWJzdHJhY3RWYWx1ZUZhY3RvcnkuZnJvbU5hdGl2ZUJlaGF2aW9yKAogICAgICAgICAgX25hdGl2ZURhdGEuZ2V0TmF0aXZlRmllbGRMb2FkQmVoYXZpb3IoZmllbGQpLCBfY2xvc2VkV29ybGQpOwogICAgfSBlbHNlIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIHRoZSBwb3RlbnRpYWxseSBtb3JlIHByZWNpc2UgdHlwZSBvZiB0aGUKICAgICAgLy8gbm9kZSArIGZpbmQgYSB0ZXN0IHRoYXQgc2hvd3MgaXRzIHVzZWZ1bG5lc3MuCiAgICAgIC8vIHR5cGUgPSBfYWJzdHJhY3RWYWx1ZURvbWFpbi5pbnRlcnNlY3Rpb24oCiAgICAgIC8vICAgICBub2RlLmluc3RydWN0aW9uVHlwZSwKICAgICAgLy8gICAgIEFic3RyYWN0VmFsdWVGYWN0b3J5LmluZmVycmVkVHlwZUZvck1lbWJlcigKICAgICAgLy8gICAgICAgICBmaWVsZCwgX2dsb2JhbEluZmVyZW5jZVJlc3VsdHMpKTsKICAgICAgdHlwZSA9IEFic3RyYWN0VmFsdWVGYWN0b3J5LmluZmVycmVkVHlwZUZvck1lbWJlcigKICAgICAgICAgIGZpZWxkLCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgICB9CgogICAgcmV0dXJuIG5ldyBIRmllbGRHZXQoZmllbGQsIHJlY2VpdmVyLCB0eXBlLCBub2RlLnNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgIGlzQXNzaWduYWJsZTogaXNBc3NpZ25hYmxlKTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdEludm9rZUR5bmFtaWNTZXR0ZXIoSEludm9rZUR5bmFtaWNTZXR0ZXIgbm9kZSkgewogICAgaWYgKG5vZGUuaXNJbnRlcmNlcHRlZENhbGwpIHsKICAgICAgSEluc3RydWN0aW9uIGZvbGRlZCA9IGhhbmRsZUludGVyY2VwdGVkQ2FsbChub2RlKTsKICAgICAgaWYgKGZvbGRlZCAhPSBub2RlKSByZXR1cm4gZm9sZGVkOwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IG5vZGUuZ2V0RGFydFJlY2VpdmVyKF9jbG9zZWRXb3JsZCk7CiAgICBGaWVsZEVudGl0eSBmaWVsZCA9IGZpbmRDb25jcmV0ZUZpZWxkRm9yRHluYW1pY0FjY2Vzcyhub2RlLCByZWNlaXZlcik7CiAgICBpZiAoZmllbGQgPT0gbnVsbCB8fCAhZmllbGQuaXNBc3NpZ25hYmxlKSByZXR1cm4gbm9kZTsKICAgIC8vIFVzZSBgbm9kZS5pbnB1dHMubGFzdGAgaW4gY2FzZSB0aGUgY2FsbCBmb2xsb3dzIHRoZSBpbnRlcmNlcHRvciBjYWxsaW5nCiAgICAvLyBjb252ZW50aW9uLCBidXQgaXMgbm90IGEgY2FsbCBvbiBhbiBpbnRlcmNlcHRvci4KICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IG5vZGUuaW5wdXRzLmxhc3Q7CiAgICBpZiAoX2Nsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YS5nZXRQYXJhbWV0ZXJDaGVja1BvbGljeShmaWVsZCkuaXNFbWl0dGVkKSB7CiAgICAgIGlmIChfb3B0aW9ucy5leHBlcmltZW50TmV3UnRpKSB7CiAgICAgICAgLy8gVE9ETyhzcmEpOiBJbXBsZW1lbnQgaW5saW5pbmcgb2Ygc2V0dGVycyB3aXRoIGNoZWNrcyBmb3IgbmV3IHJ0aS4KICAgICAgICBub2RlLm5lZWRzQ2hlY2sgPSB0cnVlOwogICAgICAgIHJldHVybiBub2RlOwogICAgICB9CiAgICAgIERhcnRUeXBlIHR5cGUgPSBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LmdldEZpZWxkVHlwZShmaWVsZCk7CiAgICAgIGlmICghdHlwZS50cmVhdEFzUmF3IHx8CiAgICAgICAgICB0eXBlLmlzVHlwZVZhcmlhYmxlIHx8CiAgICAgICAgICB0eXBlLnVuYWxpYXNlZC5pc0Z1bmN0aW9uVHlwZSB8fAogICAgICAgICAgdHlwZS51bmFsaWFzZWQuaXNGdXR1cmVPcikgewogICAgICAgIC8vIFdlIGNhbm5vdCBnZW5lcmF0ZSB0aGUgY29ycmVjdCB0eXBlIHJlcHJlc2VudGF0aW9uIGhlcmUsIHNvIGRvbid0CiAgICAgICAgLy8gaW5saW5lIHRoaXMgYWNjZXNzLgogICAgICAgIC8vIFRPRE8oc3JhKTogSWYgdGhlIGlucHV0IGlzIHN1Y2ggdGhhdCB3ZSBkb24ndCBuZWVkIGEgdHlwZSBjaGVjaywgd2UKICAgICAgICAvLyBjYW4gc2tpcCB0aGUgdGVzdCBhbiBnZW5lcmF0ZSB0aGUgSEZpZWxkU2V0LgogICAgICAgIG5vZGUubmVlZHNDaGVjayA9IHRydWU7CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgICAgSEluc3RydWN0aW9uIG90aGVyID0KICAgICAgICAgIHZhbHVlLmNvbnZlcnRUeXBlKF9jbG9zZWRXb3JsZCwgdHlwZSwgSFR5cGVDb252ZXJzaW9uLlRZUEVfQ0hFQ0spOwogICAgICBpZiAob3RoZXIgIT0gdmFsdWUpIHsKICAgICAgICBub2RlLmJsb2NrLmFkZEJlZm9yZShub2RlLCBvdGhlcik7CiAgICAgICAgdmFsdWUgPSBvdGhlcjsKICAgICAgfQogICAgfQogICAgaWYgKF9jbG9zZWRXb3JsZC5maWVsZEFuYWx5c2lzLmdldEZpZWxkRGF0YShmaWVsZCkuaXNFbGlkZWQpIHsKICAgICAgX2xvZz8ucmVnaXN0ZXJGaWVsZFNldChub2RlKTsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgSEZpZWxkU2V0IHJlc3VsdCA9CiAgICAgICAgICBuZXcgSEZpZWxkU2V0KF9hYnN0cmFjdFZhbHVlRG9tYWluLCBmaWVsZCwgcmVjZWl2ZXIsIHZhbHVlKQogICAgICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gbm9kZS5zb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgX2xvZz8ucmVnaXN0ZXJGaWVsZFNldChub2RlLCByZXN1bHQpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0SW52b2tlQ2xvc3VyZShISW52b2tlQ2xvc3VyZSBub2RlKSB7CiAgICBISW5zdHJ1Y3Rpb24gY2xvc3VyZSA9IG5vZGUuZ2V0RGFydFJlY2VpdmVyKF9jbG9zZWRXb3JsZCk7CgogICAgLy8gUmVwbGFjZSBpbmRpcmVjdCBjYWxsIHRvIHN0YXRpYyBtZXRob2QgdGVhci1vZmYgY2xvc3VyZSB3aXRoIGRpcmVjdCBjYWxsCiAgICAvLyB0byBzdGF0aWMgbWV0aG9kLgogICAgaWYgKGNsb3N1cmUgaXMgSENvbnN0YW50KSB7CiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQgPSBjbG9zdXJlLmNvbnN0YW50OwogICAgICBpZiAoY29uc3RhbnQgaXMgRnVuY3Rpb25Db25zdGFudFZhbHVlKSB7CiAgICAgICAgRnVuY3Rpb25FbnRpdHkgdGFyZ2V0ID0gY29uc3RhbnQuZWxlbWVudDsKICAgICAgICBQYXJhbWV0ZXJTdHJ1Y3R1cmUgcGFyYW1ldGVyU3RydWN0dXJlID0gdGFyZ2V0LnBhcmFtZXRlclN0cnVjdHVyZTsKICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlLmNhbGxTdHJ1Y3R1cmUgPT0gbm9kZS5zZWxlY3Rvci5jYWxsU3RydWN0dXJlKSB7CiAgICAgICAgICAvLyBUT0RPKHNyYSk6IEhhbmRsZSBhZGRpbmcgb3B0aW9uYWwgYXJndW1lbnRzIGRlZmF1bHQgdmFsdWVzLgogICAgICAgICAgYXNzZXJ0KCFub2RlLmlzSW50ZXJjZXB0ZWRDYWxsKTsKICAgICAgICAgIHJldHVybiBuZXcgSEludm9rZVN0YXRpYyh0YXJnZXQsIG5vZGUuaW5wdXRzLnNraXAoMSkudG9MaXN0KCksCiAgICAgICAgICAgICAgbm9kZS5pbnN0cnVjdGlvblR5cGUsIG5vZGUudHlwZUFyZ3VtZW50cykKICAgICAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IG5vZGUuc291cmNlSW5mb3JtYXRpb247CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdEludm9rZVN0YXRpYyhISW52b2tlU3RhdGljIG5vZGUpIHsKICAgIHByb3BhZ2F0ZUNvbnN0YW50VmFsdWVUb1VzZXMobm9kZSk7CiAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCA9IG5vZGUuZWxlbWVudDsKCiAgICBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5pZGVudGljYWxGdW5jdGlvbikgewogICAgICBpZiAobm9kZS5pbnB1dHMubGVuZ3RoID09IDIpIHsKICAgICAgICByZXR1cm4gbmV3IEhJZGVudGl0eSgKICAgICAgICAgICAgbm9kZS5pbnB1dHNbMF0sIG5vZGUuaW5wdXRzWzFdLCBudWxsLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSkKICAgICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBub2RlLnNvdXJjZUluZm9ybWF0aW9uOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuc2V0UnVudGltZVR5cGVJbmZvKSB7CiAgICAgIGlmIChub2RlLmlucHV0cy5sZW5ndGggPT0gMikgewogICAgICAgIHJldHVybiBoYW5kbGVBcnJheVR5cGVJbmZvKG5vZGUpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuY2hlY2tDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IpIHsKICAgICAgaWYgKG5vZGUuaW5wdXRzLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGZpcnN0QXJndW1lbnQgPSBub2RlLmlucHV0c1swXTsKICAgICAgICBpZiAoZmlyc3RBcmd1bWVudCBpcyBIQ29uc3RhbnQpIHsKICAgICAgICAgIEhDb25zdGFudCBjb25zdGFudCA9IGZpcnN0QXJndW1lbnQ7CiAgICAgICAgICBpZiAoY29uc3RhbnQuY29uc3RhbnQuaXNUcnVlKSByZXR1cm4gY29uc3RhbnQ7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGNvbW1vbkVsZW1lbnRzLmlzQ2hlY2tJbnQoZWxlbWVudCkpIHsKICAgICAgaWYgKG5vZGUuaW5wdXRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGFyZ3VtZW50ID0gbm9kZS5pbnB1dHNbMF07CiAgICAgICAgaWYgKGFyZ3VtZW50LmlzSW50ZWdlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAgICAgcmV0dXJuIGFyZ3VtZW50OwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChjb21tb25FbGVtZW50cy5pc0NoZWNrTnVtKGVsZW1lbnQpKSB7CiAgICAgIGlmIChub2RlLmlucHV0cy5sZW5ndGggPT0gMSkgewogICAgICAgIEhJbnN0cnVjdGlvbiBhcmd1bWVudCA9IG5vZGUuaW5wdXRzWzBdOwogICAgICAgIGlmIChhcmd1bWVudC5pc051bWJlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAgICAgcmV0dXJuIGFyZ3VtZW50OwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChjb21tb25FbGVtZW50cy5pc0NoZWNrU3RyaW5nKGVsZW1lbnQpKSB7CiAgICAgIGlmIChub2RlLmlucHV0cy5sZW5ndGggPT0gMSkgewogICAgICAgIEhJbnN0cnVjdGlvbiBhcmd1bWVudCA9IG5vZGUuaW5wdXRzWzBdOwogICAgICAgIGlmIChhcmd1bWVudC5pc1N0cmluZyhfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICAgICAgcmV0dXJuIGFyZ3VtZW50OwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmFzc2VydEhlbHBlciB8fAogICAgICAgIGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuYXNzZXJ0VGVzdCkgewogICAgICBpZiAobm9kZS5pbnB1dHMubGVuZ3RoID09IDEpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gYXJndW1lbnQgPSBub2RlLmlucHV0c1swXTsKICAgICAgICBpZiAoYXJndW1lbnQgaXMgSENvbnN0YW50KSB7CiAgICAgICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gYXJndW1lbnQuY29uc3RhbnQ7CiAgICAgICAgICBpZiAoY29uc3RhbnQuaXNCb29sKSB7CiAgICAgICAgICAgIGJvb2wgdmFsdWUgPSBjb25zdGFudC5pc1RydWU7CiAgICAgICAgICAgIGlmIChlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmFzc2VydFRlc3QpIHsKICAgICAgICAgICAgICAvLyBgYXNzZXJ0VGVzdChhcmd1bWVudClgIGVmZmVjdGl2ZWx5IG5lZ2F0ZXMgdGhlIGFyZ3VtZW50LgogICAgICAgICAgICAgIHJldHVybiBfZ3JhcGguYWRkQ29uc3RhbnRCb29sKCF2YWx1ZSwgX2Nsb3NlZFdvcmxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBgYXNzZXJ0SGVscGVyKHRydWUpYCBpcyBhIG5vLW9wLCBvdGhlciB2YWx1ZXMgdGhyb3cuCiAgICAgICAgICAgIGlmICh2YWx1ZSkgcmV0dXJuIGFyZ3VtZW50OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiBub2RlOwogIH0KCiAgSEluc3RydWN0aW9uIGhhbmRsZUFycmF5VHlwZUluZm8oSEludm9rZVN0YXRpYyBub2RlKSB7CiAgICAvLyBJZiB0eXBlIGluZm9ybWF0aW9uIGlzIG5vdCBuZWVkZWQsIHVzZSB0aGUgcmF3IEFycmF5LgogICAgSEluc3RydWN0aW9uIHNvdXJjZSA9IG5vZGUuaW5wdXRzWzBdOwogICAgaWYgKHNvdXJjZS51c2VkQnkubGVuZ3RoICE9IDEpIHJldHVybiBub2RlOwogICAgaWYgKHNvdXJjZS5pc0FycmF5KF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgICBmb3IgKEhJbnN0cnVjdGlvbiB1c2VyIGluIG5vZGUudXNlZEJ5KSB7CiAgICAgIGlmICh1c2VyIGlzIEhHZXRMZW5ndGgpIGNvbnRpbnVlOwogICAgICBpZiAodXNlciBpcyBISW5kZXgpIGNvbnRpbnVlOwogICAgICAvLyBCb3VuZHMgY2hlY2sgZXNjYXBlcyB0aGUgYXJyYXksIGJ1dCB3ZSBkb24ndCBjYXJlLgogICAgICBpZiAodXNlciBpcyBIQm91bmRzQ2hlY2spIGNvbnRpbnVlOwogICAgICAvLyBJbnRlcmNlcHRvciBvbmx5IGVzY2FwZXMgdGhlIEFycmF5IGlmIGFycmF5IHBhc3NlZCB0byBhbiBpbnRlcmNlcHRlZAogICAgICAvLyBtZXRob2QuCiAgICAgIGlmICh1c2VyIGlzIEhJbnRlcmNlcHRvcikgY29udGludWU7CiAgICAgIGlmICh1c2VyIGlzIEhJbnZva2VTdGF0aWMpIHsKICAgICAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCA9IHVzZXIuZWxlbWVudDsKICAgICAgICBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5jaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcikgewogICAgICAgICAgLy8gQ01FIGNoZWNrIGVzY2FwZXMgdGhlIGFycmF5LCBidXQgd2UgZG9uJ3QgY2FyZS4KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodXNlciBpcyBISW52b2tlRHluYW1pY0dldHRlcikgewogICAgICAgIFN0cmluZyBuYW1lID0gdXNlci5zZWxlY3Rvci5uYW1lOwogICAgICAgIC8vIFRoZXNlIGdldHRlcnMgZG9uJ3QgdXNlIHRoZSBBcnJheSB0eXBlLgogICAgICAgIGlmIChuYW1lID09ICdsYXN0JykgY29udGludWU7CiAgICAgICAgaWYgKG5hbWUgPT0gJ2ZpcnN0JykgY29udGludWU7CiAgICAgIH0KICAgICAgLy8gVE9ETyhzcmEpOiBJbXBsZW1lbnQgYSBtb3JlIGdlbmVyYWwgYWxnb3JpdGhtIC0gbWFueSBtZXRob2RzIGRvbid0IHVzZQogICAgICAvLyB0aGUgZWxlbWVudCB0eXBlLgogICAgICByZXR1cm4gbm9kZTsKICAgIH0KICAgIHJldHVybiBzb3VyY2U7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRTdHJpbmdDb25jYXQoSFN0cmluZ0NvbmNhdCBub2RlKSB7CiAgICAvLyBTaW1wbGlmeSBzdHJpbmcgY29uY2F0OgogICAgLy8KICAgIC8vICAgICAiIiArIFIgICAgICAgICAgICAgICAgLT4gIFIKICAgIC8vICAgICBMICsgIiIgICAgICAgICAgICAgICAgLT4gIEwKICAgIC8vICAgICAiTCIgKyAiUiIgICAgICAgICAgICAgLT4gICJMUiIKICAgIC8vICAgICAocHJlZml4ICsgIkwiKSArICJSIiAgLT4gIHByZWZpeCArICJMUiIKICAgIC8vCiAgICBTdHJpbmdDb25zdGFudFZhbHVlIGdldFN0cmluZyhISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgICAgaWYgKCFpbnN0cnVjdGlvbi5pc0NvbnN0YW50U3RyaW5nKCkpIHJldHVybiBudWxsOwogICAgICBIQ29uc3RhbnQgY29uc3RhbnQgPSBpbnN0cnVjdGlvbjsKICAgICAgcmV0dXJuIGNvbnN0YW50LmNvbnN0YW50OwogICAgfQoKICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgbGVmdFN0cmluZyA9IGdldFN0cmluZyhub2RlLmxlZnQpOwogICAgaWYgKGxlZnRTdHJpbmcgIT0gbnVsbCAmJiBsZWZ0U3RyaW5nLnN0cmluZ1ZhbHVlLmxlbmd0aCA9PSAwKSB7CiAgICAgIHJldHVybiBub2RlLnJpZ2h0OwogICAgfQoKICAgIFN0cmluZ0NvbnN0YW50VmFsdWUgcmlnaHRTdHJpbmcgPSBnZXRTdHJpbmcobm9kZS5yaWdodCk7CiAgICBpZiAocmlnaHRTdHJpbmcgPT0gbnVsbCkgcmV0dXJuIG5vZGU7CiAgICBpZiAocmlnaHRTdHJpbmcuc3RyaW5nVmFsdWUubGVuZ3RoID09IDApIHJldHVybiBub2RlLmxlZnQ7CgogICAgSEluc3RydWN0aW9uIHByZWZpeCA9IG51bGw7CiAgICBpZiAobGVmdFN0cmluZyA9PSBudWxsKSB7CiAgICAgIGlmIChub2RlLmxlZnQgaXMhIEhTdHJpbmdDb25jYXQpIHJldHVybiBub2RlOwogICAgICBIU3RyaW5nQ29uY2F0IGxlZnRDb25jYXQgPSBub2RlLmxlZnQ7CiAgICAgIC8vIERvbid0IHVuZG8gQ1NFLgogICAgICBpZiAobGVmdENvbmNhdC51c2VkQnkubGVuZ3RoICE9IDEpIHJldHVybiBub2RlOwogICAgICBwcmVmaXggPSBsZWZ0Q29uY2F0LmxlZnQ7CiAgICAgIGxlZnRTdHJpbmcgPSBnZXRTdHJpbmcobGVmdENvbmNhdC5yaWdodCk7CiAgICAgIGlmIChsZWZ0U3RyaW5nID09IG51bGwpIHJldHVybiBub2RlOwogICAgfQoKICAgIGlmIChsZWZ0U3RyaW5nLnN0cmluZ1ZhbHVlLmxlbmd0aCArIHJpZ2h0U3RyaW5nLnN0cmluZ1ZhbHVlLmxlbmd0aCA+CiAgICAgICAgTUFYX1NIQVJFRF9DT05TVEFOVF9GT0xERURfU1RSSU5HX0xFTkdUSCkgewogICAgICBpZiAobm9kZS51c2VkQnkubGVuZ3RoID4gMSkgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgSEluc3RydWN0aW9uIGZvbGRlZCA9IF9ncmFwaC5hZGRDb25zdGFudCgKICAgICAgICBjb25zdGFudF9zeXN0ZW0KICAgICAgICAgICAgLmNyZWF0ZVN0cmluZyhsZWZ0U3RyaW5nLnN0cmluZ1ZhbHVlICsgcmlnaHRTdHJpbmcuc3RyaW5nVmFsdWUpLAogICAgICAgIF9jbG9zZWRXb3JsZCk7CiAgICBpZiAocHJlZml4ID09IG51bGwpIHJldHVybiBmb2xkZWQ7CiAgICByZXR1cm4gbmV3IEhTdHJpbmdDb25jYXQocHJlZml4LCBmb2xkZWQsIF9hYnN0cmFjdFZhbHVlRG9tYWluLnN0cmluZ1R5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0U3RyaW5naWZ5KEhTdHJpbmdpZnkgbm9kZSkgewogICAgSEluc3RydWN0aW9uIGlucHV0ID0gbm9kZS5pbnB1dHNbMF07CiAgICBpZiAoaW5wdXQuaXNTdHJpbmcoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIGlucHV0OwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiBhc1N0cmluZyhTdHJpbmcgc3RyaW5nKSA9PgogICAgICAgIF9ncmFwaC5hZGRDb25zdGFudChjb25zdGFudF9zeXN0ZW0uY3JlYXRlU3RyaW5nKHN0cmluZyksIF9jbG9zZWRXb3JsZCk7CgogICAgSEluc3RydWN0aW9uIHRyeUNvbnN0YW50KCkgewogICAgICBpZiAoIWlucHV0LmlzQ29uc3RhbnQoKSkgcmV0dXJuIG51bGw7CiAgICAgIEhDb25zdGFudCBjb25zdGFudCA9IGlucHV0OwogICAgICBpZiAoIWNvbnN0YW50LmNvbnN0YW50LmlzUHJpbWl0aXZlKSByZXR1cm4gbnVsbDsKICAgICAgUHJpbWl0aXZlQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IGNvbnN0YW50LmNvbnN0YW50OwogICAgICBpZiAodmFsdWUgaXMgSW50Q29uc3RhbnRWYWx1ZSkgewogICAgICAgIC8vIE9ubHkgY29uc3RhbnQtZm9sZCBpbnQudG9TdHJpbmcoKSB3aGVuIERhcnQgYW5kIEpTIHJlc3VsdHMgdGhlIHNhbWUuCiAgICAgICAgLy8gVE9ETygxODEwMyk6IFdlIHNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZSB0aGlzIHdvcmstYXJvdW5kIHdoZW4gaXNzdWUKICAgICAgICAvLyAxODEwMyBpcyByZXNvbHZlZCBieSBwcm92aWRpbmcgdGhlIGNvcnJlY3Qgc3RyaW5nLgogICAgICAgIGlmICghdmFsdWUuaXNVSW50MzIoKSkgcmV0dXJuIG51bGw7CiAgICAgICAgcmV0dXJuIGFzU3RyaW5nKCcke3ZhbHVlLmludFZhbHVlfScpOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSBpcyBCb29sQ29uc3RhbnRWYWx1ZSkgewogICAgICAgIHJldHVybiBhc1N0cmluZyh2YWx1ZS5ib29sVmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgICAgfQogICAgICBpZiAodmFsdWUgaXMgTnVsbENvbnN0YW50VmFsdWUpIHsKICAgICAgICByZXR1cm4gYXNTdHJpbmcoJ251bGwnKTsKICAgICAgfQogICAgICBpZiAodmFsdWUgaXMgRG91YmxlQ29uc3RhbnRWYWx1ZSkgewogICAgICAgIC8vIFRPRE8oc3JhKTogSXQgc2VlbXMgdW5saWtlbHkgdGhhdCBhbGwgZGFydDJqcyBob3N0IGltcGxlbWVudGF0aW9ucwogICAgICAgIC8vIHByb2R1Y2UgZXhhY3RseSB0aGUgc2FtZSBjaGFyYWN0ZXJzIGFzIGFsbCBKYXZhU2NyaXB0IHRhcmdldHMuCiAgICAgICAgcmV0dXJuIGFzU3RyaW5nKCcke3ZhbHVlLmRvdWJsZVZhbHVlfScpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiB0cnlUb1N0cmluZygpIHsKICAgICAgLy8gSWYgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgc3RyaW5nIHdlIGNhbiBjYWxsCiAgICAgIC8vIGl0IGRpcmVjdGx5LiBLZWVwIHRoZSBzdHJpbmdpZmllciBmb3IgcHJpbWl0aXZlcyAoc2luY2UgdGhleSBoYXZlIGZhc3QKICAgICAgLy8gcGF0aCBjb2RlIGluIHRoZSBzdHJpbmdpZmllcikgYW5kIGZvciBjbGFzc2VzIHJlcXVpcmluZyBpbnRlcmNlcHRvcnMKICAgICAgLy8gKHNpbmNlIFNzYUluc3RydWN0aW9uU2ltcGxpZmllciBydW5zIGFmdGVyIFNzYVNpbXBsaWZ5SW50ZXJjZXB0b3JzKS4KICAgICAgaWYgKGlucHV0LmlzUHJpbWl0aXZlKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmIChpbnB1dC5pc051bGwoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBTZWxlY3RvcnMudG9TdHJpbmdfOwogICAgICBBYnN0cmFjdFZhbHVlIHRvU3RyaW5nVHlwZSA9CiAgICAgICAgICBBYnN0cmFjdFZhbHVlRmFjdG9yeS5pbmZlcnJlZFJlc3VsdFR5cGVGb3JTZWxlY3RvcigKICAgICAgICAgICAgICBzZWxlY3RvciwgaW5wdXQuaW5zdHJ1Y3Rpb25UeXBlLCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgICAgIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgLmNvbnRhaW5zT25seVR5cGUoCiAgICAgICAgICAgICAgdG9TdHJpbmdUeXBlLCBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuanNTdHJpbmdDbGFzcykKICAgICAgICAgIC5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICAvLyBBbGwgaW50ZXJjZXB0ZWQgY2xhc3NlcyBleHRlbmQgYEludGVyY2VwdG9yYCwgc28gaWYgdGhlIHJlY2VpdmVyIGNhbid0CiAgICAgIC8vIGJlIGEgY2xhc3MgZXh0ZW5kaW5nIGBJbnRlcmNlcHRvcmAgdGhlbiBpdCBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5LgogICAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgIC5pc0ludGVyY2VwdG9yKGlucHV0Lmluc3RydWN0aW9uVHlwZSkKICAgICAgICAgIC5pc0RlZmluaXRlbHlGYWxzZSkgewogICAgICAgIHZhciBpbnB1dHMgPSA8SEluc3RydWN0aW9uPltpbnB1dCwgaW5wdXRdOyAvLyBbaW50ZXJjZXB0b3IsIHJlY2VpdmVyXS4KICAgICAgICBISW5zdHJ1Y3Rpb24gcmVzdWx0ID0gbmV3IEhJbnZva2VEeW5hbWljTWV0aG9kKAogICAgICAgICAgICBzZWxlY3RvciwKICAgICAgICAgICAgaW5wdXQuaW5zdHJ1Y3Rpb25UeXBlLCAvLyByZWNlaXZlciB0eXBlLgogICAgICAgICAgICBpbnB1dHMsCiAgICAgICAgICAgIHRvU3RyaW5nVHlwZSwKICAgICAgICAgICAgY29uc3QgPERhcnRUeXBlPltdLAogICAgICAgICAgICBub2RlLnNvdXJjZUluZm9ybWF0aW9uLAogICAgICAgICAgICBpc0ludGVyY2VwdGVkOiB0cnVlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHJldHVybiB0cnlDb25zdGFudCgpID8/IHRyeVRvU3RyaW5nKCkgPz8gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdE9uZVNob3RJbnRlcmNlcHRvcihIT25lU2hvdEludGVyY2VwdG9yIG5vZGUpIHsKICAgIHJldHVybiBoYW5kbGVJbnRlcmNlcHRlZENhbGwobm9kZSk7CiAgfQoKICBib29sIG5lZWRzU3Vic3RpdHV0aW9uRm9yVHlwZVZhcmlhYmxlQWNjZXNzKENsYXNzRW50aXR5IGNscykgewogICAgaWYgKF9jbG9zZWRXb3JsZC5pc1VzZWRBc01peGluKGNscykpIHJldHVybiB0cnVlOwoKICAgIHJldHVybiBfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuYW55U3RyaWN0U3ViY2xhc3NPZihjbHMsCiAgICAgICAgKENsYXNzRW50aXR5IHN1YmNsYXNzKSB7CiAgICAgIHJldHVybiAhX3J0aVN1YnN0aXR1dGlvbnMuaXNUcml2aWFsU3Vic3RpdHV0aW9uKHN1YmNsYXNzLCBjbHMpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRUeXBlSW5mb0V4cHJlc3Npb24oSFR5cGVJbmZvRXhwcmVzc2lvbiBub2RlKSB7CiAgICAvLyBJZGVudGlmeSB0aGUgY2FzZSB3aGVyZSB0aGUgdHlwZSBpbmZvIGV4cHJlc3Npb24gd291bGQgYmUgb2YgdGhlIGZvcm06CiAgICAvLwogICAgLy8gIFtnZXRUeXBlQXJndW1lbnRCeUluZGV4KHRoaXMsIDApLCAuLiwgZ2V0VHlwZUFyZ3VtZW50QnlJbmRleCh0aGlzLCBrKV0KICAgIC8vCiAgICAvLyBhbmQgayBpcyB0aGUgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIG9mICd0aGlzJy4gIFdlIGNhbiBzaW1wbHkgY29weSB0aGUKICAgIC8vIGxpc3QgZnJvbSAndGhpcycuCiAgICBISW5zdHJ1Y3Rpb24gdHJ5Q29weUluZm8oKSB7CiAgICAgIGlmIChub2RlLmtpbmQgIT0gVHlwZUluZm9FeHByZXNzaW9uS2luZC5JTlNUQU5DRSkgcmV0dXJuIG51bGw7CgogICAgICBISW5zdHJ1Y3Rpb24gc291cmNlOwogICAgICBpbnQgZXhwZWN0ZWRJbmRleCA9IDA7CgogICAgICBmb3IgKEhJbnN0cnVjdGlvbiBhcmd1bWVudCBpbiBub2RlLmlucHV0cykgewogICAgICAgIGlmIChhcmd1bWVudCBpcyBIVHlwZUluZm9SZWFkVmFyaWFibGUpIHsKICAgICAgICAgIENsYXNzRW50aXR5IGNvbnRleHQgPSBEYXJ0VHlwZXMuZ2V0Q2xhc3NDb250ZXh0KGFyZ3VtZW50LnZhcmlhYmxlKTsKICAgICAgICAgIEhJbnN0cnVjdGlvbiBuZXh0U291cmNlID0gYXJndW1lbnQub2JqZWN0OwogICAgICAgICAgaWYgKG5leHRTb3VyY2UgaXMgSFJlZikgewogICAgICAgICAgICBIUmVmIHJlZiA9IG5leHRTb3VyY2U7CiAgICAgICAgICAgIG5leHRTb3VyY2UgPSByZWYudmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobmV4dFNvdXJjZSBpcyBIVGhpcykgewogICAgICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKICAgICAgICAgICAgICBzb3VyY2UgPSBuZXh0U291cmNlOwogICAgICAgICAgICAgIENsYXNzRW50aXR5IHRoaXNDbGFzcyA9IG5leHRTb3VyY2Uuc291cmNlRWxlbWVudC5lbmNsb3NpbmdDbGFzczsKICAgICAgICAgICAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0KICAgICAgICAgICAgICAgICAgX2Nsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudC5nZXRUaGlzVHlwZSh0aGlzQ2xhc3MpOwogICAgICAgICAgICAgIGlmIChub2RlLmlucHV0cy5sZW5ndGggIT0gdGhpc1R5cGUudHlwZUFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobmVlZHNTdWJzdGl0dXRpb25Gb3JUeXBlVmFyaWFibGVBY2Nlc3ModGhpc0NsYXNzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwgJiYKICAgICAgICAgICAgICAgICAgIV9ydGlTdWJzdGl0dXRpb25zLmlzVHJpdmlhbFN1YnN0aXR1dGlvbigKICAgICAgICAgICAgICAgICAgICAgIHRoaXNDbGFzcywgY29udGV4dCkpIHsKICAgICAgICAgICAgICAgIC8vIElmIGlubGluaW5nLCB0aGUgW2NvbnRleHRdIGlzIG5vdCB0aGUgc2FtZSBhcyBbdGhpc0NsYXNzXS4KICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZW4gdGhlIHN1YnN0aXR1dGlvbiBtdXN0IGJlIHRyaXZpYWwuCiAgICAgICAgICAgICAgICAvLyBDb25zaWRlciB0aGlzOgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgLy8gICAgICBmaW5hbCBPYmplY3QgdmFsdWU7CiAgICAgICAgICAgICAgICAvLyAgICAgIEEodGhpcy52YWx1ZSk7CiAgICAgICAgICAgICAgICAvLyAgICB9CiAgICAgICAgICAgICAgICAvLyAgICBjbGFzcyBCPFQ+IGV4dGVuZHMgQSB7CiAgICAgICAgICAgICAgICAvLyAgICAgIEIoVCB2YWx1ZSkgOiBzdXBlcih2YWx1ZSk7CiAgICAgICAgICAgICAgICAvLyAgICAgIFQgZ2V0IHZhbHVlID0+IHN1cGVyLnZhbHVlIGFzIFQ7CiAgICAgICAgICAgICAgICAvLyAgICB9CiAgICAgICAgICAgICAgICAvLyAgICBjbGFzcyBDPFM+IGV4dGVuZHMgQjxMaXN0PFM+PiB7CiAgICAgICAgICAgICAgICAvLyAgICAgIEMoTGlzdDxTPiB2YWx1ZSkgOiBzdXBlcih2YWx1ZSk7CiAgICAgICAgICAgICAgICAvLyAgICAgIFMgZ2V0IGZpcnN0ID0+IHZhbHVlLmZpcnN0OwogICAgICAgICAgICAgICAgLy8gICAgfQogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIElmIGBCLnZhbHVlYCBpcyBpbmxpbmVkIGludG8gYEMuZmlyc3RgIHRoZSB0eXBlIGluZm8KICAgICAgICAgICAgICAgIC8vIGV4cHJlc3Npb24gaXMgdGhlIGxpc3QgYFtCLlRdYCBvbiBhIGB0aGlzYCBvZiB0eXBlIGBDPFM+YC4KICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBzdWJzdGl0dXRpb24gZnJvbSBDIHRvIEIgaXMgbm90IHRyaXZpYWwKICAgICAgICAgICAgICAgIC8vIChTIC0+IExpc3Q8Uz4pIHRoaXMgdHlwZSBpbmZvIGV4cHJlc3Npb24gY2Fubm90IGJlIHJlcGxhY2VkCiAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSB0eXBlIGFyZ3VtZW50cyBgQzxTPmAgKGl0IHdvdWxkIHlpZWxkIFtTXSBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICAvLyBbTGlzdDxTPl0pLgogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXh0U291cmNlICE9IHNvdXJjZSkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGluZGV4IGlzIHRoZSBvbmUgd2UgZXhwZWN0LgogICAgICAgICAgICBpbnQgaW5kZXggPSBhcmd1bWVudC52YXJpYWJsZS5lbGVtZW50LmluZGV4OwogICAgICAgICAgICBpZiAoaW5kZXggIT0gZXhwZWN0ZWRJbmRleCsrKSByZXR1cm4gbnVsbDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFRPRE8oc3JhKTogSGFuZGxlIG5vbi10aGlzIGNhc2VzIChpLmUuIGlubGluZWQgY29kZSkuIFNvbWUKICAgICAgICAgICAgLy8gbm9uLXRoaXMgY2FzZXMgd2lsbCBoYXZlIGEgVHlwZU1hc2sgdGhhdCBkb2VzIG5vdCBuZWVkCiAgICAgICAgICAgIC8vIHN1YnN0aXR1dGlvbiwgZXZlbiB0aG91Z2ggdGhlIGdlbmVyYWwgY2FzZSBkb2VzLCBlLmcuIGlubGluaW5nIGEKICAgICAgICAgICAgLy8gbWV0aG9kIG9uIGFuIGV4YWN0IGNsYXNzLgogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gbmV3IEhUeXBlSW5mb1JlYWRSYXcoc291cmNlLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSk7CiAgICB9CgogICAgLy8gVE9ETyhzcmEpOiBDb25zaWRlciBmdXNpbmcgdHlwZSBleHByZXNzaW9uIHRyZWVzIHdpdGggbm8gdHlwZSB2YXJpYWJsZXMsCiAgICAvLyBhcyB0aGVzZSBjb3VsZCBiZSByZXByZXNlbnRlZCBsaWtlIGNvbnN0YW50cy4KCiAgICByZXR1cm4gdHJ5Q29weUluZm8oKSA/PyBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0VHlwZUluZm9SZWFkVmFyaWFibGUoSFR5cGVJbmZvUmVhZFZhcmlhYmxlIG5vZGUpIHsKICAgIFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGUgPSBub2RlLnZhcmlhYmxlOwogICAgQ2xhc3NFbnRpdHkgY29udGV4dENsYXNzID0gdmFyaWFibGUuZWxlbWVudC50eXBlRGVjbGFyYXRpb247CiAgICBISW5zdHJ1Y3Rpb24gb2JqZWN0ID0gbm9kZS5vYmplY3Q7CgogICAgSEluc3RydWN0aW9uIGZpbmlzaEdyb3VuZFR5cGUoSW50ZXJmYWNlVHlwZSBncm91bmRUeXBlKSB7CiAgICAgIEludGVyZmFjZVR5cGUgdHlwZUF0VmFyaWFibGUgPQogICAgICAgICAgX2Nsb3NlZFdvcmxkLmRhcnRUeXBlcy5hc0luc3RhbmNlT2YoZ3JvdW5kVHlwZSwgY29udGV4dENsYXNzKTsKICAgICAgaWYgKHR5cGVBdFZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgICBpbnQgaW5kZXggPSB2YXJpYWJsZS5lbGVtZW50LmluZGV4OwogICAgICAgIERhcnRUeXBlIHR5cGVBcmd1bWVudCA9IHR5cGVBdFZhcmlhYmxlLnR5cGVBcmd1bWVudHNbaW5kZXhdOwogICAgICAgIEhJbnN0cnVjdGlvbiByZXBsYWNlbWVudCA9IG5ldyBIVHlwZUluZm9FeHByZXNzaW9uKAogICAgICAgICAgICBUeXBlSW5mb0V4cHJlc3Npb25LaW5kLkNPTVBMRVRFLAogICAgICAgICAgICB0eXBlQXJndW1lbnQsCiAgICAgICAgICAgIGNvbnN0IDxISW5zdHJ1Y3Rpb24+W10sCiAgICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlLAogICAgICAgICAgICBpc1R5cGVWYXJpYWJsZVJlcGxhY2VtZW50OiB0cnVlKTsKICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgLy8vIFJlYWQgdGhlIHR5cGUgdmFyaWFibGUgZnJvbSBhbiBhbGxvY2F0aW9uIG9mIHR5cGUgW2NyZWF0ZWRDbGFzc10sIHdoZXJlCiAgICAvLy8gW3NlbGVjdFR5cGVBcmd1bWVudEZyb21PYmplY3RDcmVhdGlvbl0gZXh0cmFjdHMgdGhlIHR5cGUgYXJndW1lbnQgZnJvbQogICAgLy8vIHRoZSBhbGxvY2F0aW9uIGZvciBmYWN0b3J5IGNvbnN0cnVjdG9yIGNhbGwuCiAgICBISW5zdHJ1Y3Rpb24gZmluaXNoU3Vic3RpdHV0ZWQoQ2xhc3NFbnRpdHkgY3JlYXRlZENsYXNzLAogICAgICAgIEhJbnN0cnVjdGlvbiBzZWxlY3RUeXBlQXJndW1lbnRGcm9tT2JqZWN0Q3JlYXRpb24oaW50IGluZGV4KSkgewogICAgICBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlID0gX2Nsb3NlZFdvcmxkLmRhcnRUeXBlcy5nZXRUaGlzVHlwZShjcmVhdGVkQ2xhc3MpOwoKICAgICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uRm9yVHlwZVZhcmlhYmxlKFR5cGVWYXJpYWJsZVR5cGUgdHYpIHsKICAgICAgICByZXR1cm4gc2VsZWN0VHlwZUFyZ3VtZW50RnJvbU9iamVjdENyZWF0aW9uKAogICAgICAgICAgICB0aGlzVHlwZS50eXBlQXJndW1lbnRzLmluZGV4T2YodHYpKTsKICAgICAgfQoKICAgICAgRGFydFR5cGUgdHlwZSA9IF9jbG9zZWRXb3JsZC5kYXJ0VHlwZXMKICAgICAgICAgIC5hc0luc3RhbmNlT2YodGhpc1R5cGUsIGNvbnRleHRDbGFzcykKICAgICAgICAgIC50eXBlQXJndW1lbnRzW3ZhcmlhYmxlLmVsZW1lbnQuaW5kZXhdOwogICAgICBpZiAodHlwZSBpcyBUeXBlVmFyaWFibGVUeXBlKSB7CiAgICAgICAgcmV0dXJuIGluc3RydWN0aW9uRm9yVHlwZVZhcmlhYmxlKHR5cGUpOwogICAgICB9CiAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBhcmd1bWVudHMgPSA8SEluc3RydWN0aW9uPltdOwogICAgICB0eXBlLmZvckVhY2hUeXBlVmFyaWFibGUoKHYpIHsKICAgICAgICBhcmd1bWVudHMuYWRkKGluc3RydWN0aW9uRm9yVHlwZVZhcmlhYmxlKHYpKTsKICAgICAgfSk7CiAgICAgIEhJbnN0cnVjdGlvbiByZXBsYWNlbWVudCA9IG5ldyBIVHlwZUluZm9FeHByZXNzaW9uKAogICAgICAgICAgVHlwZUluZm9FeHByZXNzaW9uS2luZC5DT01QTEVURSwKICAgICAgICAgIHR5cGUsCiAgICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwKICAgICAgICAgIGlzVHlwZVZhcmlhYmxlUmVwbGFjZW1lbnQ6IHRydWUpOwogICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICB9CgogICAgLy8gVHlwZSB2YXJpYWJsZSBldmFsdWF0ZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBjb25zdGFudCBjYW4gYmUgcmVwbGFjZWQgd2l0aAogICAgLy8gYSBncm91bmQgdGVybSB0eXBlLgogICAgaWYgKG9iamVjdCBpcyBIQ29uc3RhbnQpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IG9iamVjdC5jb25zdGFudDsKICAgICAgaWYgKHZhbHVlIGlzIENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSkgewogICAgICAgIHJldHVybiBmaW5pc2hHcm91bmRUeXBlKHZhbHVlLnR5cGUpOwogICAgICB9CiAgICAgIHJldHVybiBub2RlOwogICAgfQoKICAgIC8vIExvb2sgZm9yIGFuIGFsbG9jYXRpb24gd2l0aCB0eXBlIGluZm9ybWF0aW9uIGFuZCByZS13cml0ZSB0eXBlIHZhcmlhYmxlCiAgICAvLyBhcyBhIGZ1bmN0aW9uIG9mIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIGFsbG9jYXRpb24uICBUaGlzIGVmZmVjdGl2ZWx5CiAgICAvLyBzdG9yZS1mb3J3YXJkcyBhIHR5cGUgdmFyaWFibGUgcmVhZCB0aHJvdWdoIGFuIGFsbG9jYXRpb24uCgogICAgLy8gTWF0Y2g6CiAgICAvLwogICAgLy8gICAgIEhDcmVhdGUoQ2xhc3NFbGVtZW50LAogICAgLy8gICAgICAgW2FyZ19pLAogICAgLy8gICAgICAgIC4uLiwKICAgIC8vICAgICAgICBIVHlwZUluZm9FeHByZXNzaW9uKHRfMCwgdF8xLCB0XzIsIC4uLildKTsKICAgIC8vCiAgICAvLyBUaGUgYHRfaWAgYXJlIHRoZSB2YWx1ZXMgb2YgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiBDbGFzc0VsZW1lbnQuCgogICAgaWYgKG9iamVjdCBpcyBIQ3JlYXRlKSB7CiAgICAgIHZvaWQgcmVnaXN0ZXJJbnN0YW50aWF0aW9ucygpIHsKICAgICAgICAvLyBGb3J3YXJkaW5nIHRoZSB0eXBlIHZhcmlhYmxlIHJlZmVyZW5jZXMgbWlnaHQgY2F1c2UgdGhlIEhDcmVhdGUgdG8KICAgICAgICAvLyBiZWNvbWUgZGVhZC4gVGhpcyBicmVha3MgdGhlIGFsZ29yaXRobSBmb3IgZ2VuZXJhdGluZyB0aGUgcGVyLXR5cGUKICAgICAgICAvLyBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24sIHNvIHdlIGluc3RhbnRpYXRlIHRoZW0gaGVyZSBpbiBjYXNlIHRoZQogICAgICAgIC8vIEhDcmVhdGUgYmVjb21lcyBkZWFkLgogICAgICAgIG9iamVjdC5pbnN0YW50aWF0ZWRUeXBlcz8uZm9yRWFjaChfcmVnaXN0cnkucmVnaXN0ZXJJbnN0YW50aWF0aW9uKTsKICAgICAgfQoKICAgICAgaWYgKG9iamVjdC5oYXNSdGlJbnB1dCkgewogICAgICAgIEhJbnN0cnVjdGlvbiB0eXBlSW5mbyA9IG9iamVjdC5ydGlJbnB1dDsKICAgICAgICBpZiAodHlwZUluZm8gaXMgSFR5cGVJbmZvRXhwcmVzc2lvbikgewogICAgICAgICAgcmVnaXN0ZXJJbnN0YW50aWF0aW9ucygpOwogICAgICAgICAgcmV0dXJuIGZpbmlzaFN1YnN0aXR1dGVkKAogICAgICAgICAgICAgIG9iamVjdC5lbGVtZW50LCAoaW50IGluZGV4KSA9PiB0eXBlSW5mby5pbnB1dHNbaW5kZXhdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTm9uLWdlbmVyaWMgdHlwZSAod2hpY2ggZXh0ZW5kcyBvciBtaXhlcyBpbiBhIGdlbmVyaWMgdHlwZSwgZm9yCiAgICAgICAgLy8gZXhhbXBsZSBDb2RlVW5pdHMgZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxpbnQ+KS4gIEFsc28gdXNlZCBmb3IKICAgICAgICAvLyByYXctdHlwZSB3aGVuIHRoZSB0eXBlIHBhcmFtZXRlcnMgYXJlIGVsaWRlZC4KICAgICAgICByZWdpc3Rlckluc3RhbnRpYXRpb25zKCk7CiAgICAgICAgcmV0dXJuIGZpbmlzaFN1YnN0aXR1dGVkKAogICAgICAgICAgICBvYmplY3QuZWxlbWVudCwKICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIHR5cGUgYXJndW1lbnRzLCBhbGwgdHlwZSBhcmd1bWVudHMgYXJlICdkeW5hbWljJy4KICAgICAgICAgICAgKGludCBpKSA9PiBfZ3JhcGguYWRkQ29uc3RhbnROdWxsKF9jbG9zZWRXb3JsZCkpOwogICAgICB9CiAgICB9CgogICAgLy8gVE9ETyhzcmEpOiBGYWN0b3J5IGNvbnN0cnVjdG9ycyBwYXNzIHR5cGUgYXJndW1lbnRzIGFmdGVyIHRoZSB2YWx1ZQogICAgLy8gYXJndW1lbnRzLiBUaGUgW3NlbGVjdFR5cGVBcmd1bWVudEZyb21PYmplY3RDcmVhdGlvbl0gYXJndW1lbnQgb2YKICAgIC8vIFtmaW5pc2hTdWJzdGl0dXRlZF0gaW5kZXhlcyBpbnRvIHRoZXNlIHR5cGUgYXJndW1lbnRzLgoKICAgIC8vIFRyeSB0byByZW1vdmUgdGhlIGludGVyY2VwdG9yLiBUaGUgaW50ZXJjZXB0b3IgaXMgdXNlZCBmb3IgYWNjZXNzaW5nIHRoZQogICAgLy8gc3Vic3RpdHV0aW9uIG1ldGhvZHMuCiAgICBpZiAobm9kZS5pc0ludGVyY2VwdGVkKSB7CiAgICAgIC8vIElmIHdlIGRvbid0IG5lZWQgdGhlIHN1YnN0aXR1dGlvbiBtZXRob2RzIHRoZW4gd2UgZG9uJ3QgbmVlZCB0aGUKICAgICAgLy8gaW50ZXJjZXB0b3IgdG8gYWNjZXNzIHRoZW0uCiAgICAgIGlmICghbmVlZHNTdWJzdGl0dXRpb25Gb3JUeXBlVmFyaWFibGVBY2Nlc3MoY29udGV4dENsYXNzKSkgewogICAgICAgIHJldHVybiBuZXcgSFR5cGVJbmZvUmVhZFZhcmlhYmxlLm5vSW50ZXJjZXB0b3IoCiAgICAgICAgICAgIHZhcmlhYmxlLCBvYmplY3QsIG5vZGUuaW5zdHJ1Y3Rpb25UeXBlKTsKICAgICAgfQogICAgICAvLyBBbGwgaW50ZXJjZXB0ZWQgY2xhc3NlcyBleHRlbmQgYEludGVyY2VwdG9yYCwgc28gaWYgdGhlIHJlY2VpdmVyIGNhbid0CiAgICAgIC8vIGJlIGEgY2xhc3MgZXh0ZW5kaW5nIGBJbnRlcmNlcHRvcmAgdGhlbiB0aGUgc3Vic3RpdHV0aW9uIG1ldGhvZHMgY2FuIGJlCiAgICAgIC8vIGNhbGxlZCBkaXJlY3RseS4gKFdlIGRvbid0IGNhcmUgYWJvdXQgTnVsbCBzaW5jZSBjb250ZXh0cyByZWFkaW5nIGNsYXNzCiAgICAgIC8vIHR5cGUgdmFyaWFibGVzIG9yaWdpbmF0ZSBmcm9tIGluc3RhbmNlIG1ldGhvZHMuKQogICAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgIC5pc0ludGVyY2VwdG9yKG9iamVjdC5pbnN0cnVjdGlvblR5cGUpCiAgICAgICAgICAuaXNEZWZpbml0ZWx5RmFsc2UpIHsKICAgICAgICByZXR1cm4gbmV3IEhUeXBlSW5mb1JlYWRWYXJpYWJsZS5ub0ludGVyY2VwdG9yKAogICAgICAgICAgICB2YXJpYWJsZSwgb2JqZWN0LCBub2RlLmluc3RydWN0aW9uVHlwZSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdFR5cGVFdmFsKEhUeXBlRXZhbCBub2RlKSB7CiAgICBpZiAoVHlwZVJlY2lwZS5pc0lkZW50aXR5KG5vZGUudHlwZUV4cHJlc3Npb24sIG5vZGUuZW52U3RydWN0dXJlKSkgewogICAgICByZXR1cm4gbm9kZS5pbnB1dHMuc2luZ2xlOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRBc0NoZWNrKEhBc0NoZWNrIG5vZGUpIHsKICAgIGlmIChub2RlLmlzUmVkdW5kYW50KF9jbG9zZWRXb3JsZCkpIHJldHVybiBub2RlLmNoZWNrZWRJbnB1dDsKCiAgICAvLyBTZWUgaWYgdGhpcyBjaGVjayBjYW4gYmUgbG93ZXJlZCB0byBhIHNpbXBsZSBvbmUuCiAgICBISW5zdHJ1Y3Rpb24gdHlwZUlucHV0ID0gbm9kZS50eXBlSW5wdXQ7CiAgICBpZiAodHlwZUlucHV0IGlzIEhMb2FkVHlwZSkgewogICAgICBEYXJ0VHlwZSBkYXJ0VHlwZSA9IHR5cGVJbnB1dC50eXBlRXhwcmVzc2lvbjsKICAgICAgTWVtYmVyRW50aXR5IHNwZWNpYWxpemVkQ2hlY2sgPSBTcGVjaWFsaXplZENoZWNrcy5maW5kQXNDaGVjaygKICAgICAgICAgIGRhcnRUeXBlLCBub2RlLmlzVHlwZUVycm9yLCBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMpOwogICAgICBpZiAoc3BlY2lhbGl6ZWRDaGVjayAhPSBudWxsKSB7CiAgICAgICAgQWJzdHJhY3RWYWx1ZVdpdGhQcmVjaXNpb24gY2hlY2tlZFR5cGUgPQogICAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVGcm9tU3RhdGljVHlwZShkYXJ0VHlwZSk7CiAgICAgICAgcmV0dXJuIEhBc0NoZWNrU2ltcGxlKG5vZGUuY2hlY2tlZElucHV0LCBkYXJ0VHlwZSwgY2hlY2tlZFR5cGUsCiAgICAgICAgICAgIG5vZGUuaXNUeXBlRXJyb3IsIHNwZWNpYWxpemVkQ2hlY2ssIG5vZGUuaW5zdHJ1Y3Rpb25UeXBlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRBc0NoZWNrU2ltcGxlKEhBc0NoZWNrU2ltcGxlIG5vZGUpIHsKICAgIGlmIChub2RlLmlzUmVkdW5kYW50KF9jbG9zZWRXb3JsZCkpIHJldHVybiBub2RlLmNoZWNrZWRJbnB1dDsKICAgIHJldHVybiBub2RlOwogIH0KfQoKY2xhc3MgU3NhQ2hlY2tJbnNlcnRlciBleHRlbmRzIEhCYXNlVmlzaXRvciBpbXBsZW1lbnRzIE9wdGltaXphdGlvblBoYXNlIHsKICBmaW5hbCBTZXQ8SEluc3RydWN0aW9uPiBib3VuZHNDaGVja2VkOwogIGZpbmFsIGJvb2wgdHJ1c3RQcmltaXRpdmVzOwogIGZpbmFsIEpDbG9zZWRXb3JsZCBjbG9zZWRXb3JsZDsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICJTc2FDaGVja0luc2VydGVyIjsKICBIR3JhcGggZ3JhcGg7CgogIFNzYUNoZWNrSW5zZXJ0ZXIodGhpcy50cnVzdFByaW1pdGl2ZXMsIHRoaXMuY2xvc2VkV29ybGQsIHRoaXMuYm91bmRzQ2hlY2tlZCk7CgogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IF9hYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRHcmFwaChIR3JhcGggZ3JhcGgpIHsKICAgIHRoaXMuZ3JhcGggPSBncmFwaDsKCiAgICAvLyBJbiAtLXRydXN0LXByaW1pdGl2ZXMgbW9kZSB3ZSBkb24ndCBhZGQgYm91bmRzIGNoZWNrcy4gIFRoaXMgaXMgYmV0dGVyCiAgICAvLyB0aGFuIHRyeWluZyB0byByZW1vdmUgdGhlbSBsYXRlciBhcyB0aGUgbGltaXQgZXhwcmVzc2lvbiB3b3VsZCBiZWNvbWUKICAgIC8vIGRlYWQgYW5kIHJlcXVpcmUgRENFLgogICAgaWYgKHRydXN0UHJpbWl0aXZlcykgcmV0dXJuOwoKICAgIHZpc2l0RG9taW5hdG9yVHJlZShncmFwaCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gYmxvY2suZmlyc3Q7CiAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICBISW5zdHJ1Y3Rpb24gbmV4dCA9IGluc3RydWN0aW9uLm5leHQ7CiAgICAgIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24uYWNjZXB0KHRoaXMpOwogICAgICBpbnN0cnVjdGlvbiA9IG5leHQ7CiAgICB9CiAgfQoKICBIQm91bmRzQ2hlY2sgaW5zZXJ0Qm91bmRzQ2hlY2soCiAgICAgIEhJbnN0cnVjdGlvbiBpbmRleE5vZGUsIEhJbnN0cnVjdGlvbiBhcnJheSwgSEluc3RydWN0aW9uIGluZGV4QXJndW1lbnQpIHsKICAgIEhHZXRMZW5ndGggbGVuZ3RoID0gbmV3IEhHZXRMZW5ndGgoCiAgICAgICAgYXJyYXksIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4ucG9zaXRpdmVJbnRUeXBlLAogICAgICAgIGlzQXNzaWduYWJsZTogIWlzRml4ZWRMZW5ndGgoYXJyYXkuaW5zdHJ1Y3Rpb25UeXBlLCBjbG9zZWRXb3JsZCkpOwogICAgaW5kZXhOb2RlLmJsb2NrLmFkZEJlZm9yZShpbmRleE5vZGUsIGxlbmd0aCk7CgogICAgQWJzdHJhY3RWYWx1ZSB0eXBlID0KICAgICAgICBpbmRleEFyZ3VtZW50LmlzUG9zaXRpdmVJbnRlZ2VyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlCiAgICAgICAgICAgID8gaW5kZXhBcmd1bWVudC5pbnN0cnVjdGlvblR5cGUKICAgICAgICAgICAgOiBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLnBvc2l0aXZlSW50VHlwZTsKICAgIEhCb3VuZHNDaGVjayBjaGVjayA9IG5ldyBIQm91bmRzQ2hlY2soaW5kZXhBcmd1bWVudCwgbGVuZ3RoLCBhcnJheSwgdHlwZSkKICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IGluZGV4Tm9kZS5zb3VyY2VJbmZvcm1hdGlvbjsKICAgIGluZGV4Tm9kZS5ibG9jay5hZGRCZWZvcmUoaW5kZXhOb2RlLCBjaGVjayk7CiAgICAvLyBJZiB0aGUgaW5kZXggaW5wdXQgdG8gdGhlIGJvdW5kcyBjaGVjayB3YXMgbm90IGtub3duIHRvIGJlIGFuIGludGVnZXIKICAgIC8vIHRoZW4gd2UgcmVwbGFjZSBpdHMgdXNlcyB3aXRoIHRoZSBib3VuZHMgY2hlY2ssIHdoaWNoIGlzIGtub3duIHRvIGJlIGFuCiAgICAvLyBpbnRlZ2VyLiAgSG93ZXZlciwgaWYgdGhlIGlucHV0IHdhcyBhbHJlYWR5IGFuIGludGVnZXIgd2UgZG9uJ3QgZG8gdGhpcwogICAgLy8gYmVjYXVzZSBwdXR0aW5nIGluIGEgY2hlY2sgaW5zdHJ1Y3Rpb24gbWlnaHQgb2JzY3VyZSB0aGUgcmVhbCBuYXR1cmUgb2YKICAgIC8vIHRoZSBpbmRleCBlZy4gaWYgaXQgaXMgYSBjb25zdGFudC4gIFRoZSByYW5nZSBpbmZvcm1hdGlvbiBmcm9tIHRoZQogICAgLy8gQm91bmRzQ2hlY2sgaW5zdHJ1Y3Rpb24gaXMgYXR0YWNoZWQgdG8gdGhlIGlucHV0IGRpcmVjdGx5IGJ5CiAgICAvLyB2aXNpdEJvdW5kc0NoZWNrIGluIHRoZSBTc2FWYWx1ZVJhbmdlQW5hbHl6ZXIuCiAgICBpZiAoaW5kZXhBcmd1bWVudC5pc0ludGVnZXIoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlGYWxzZSkgewogICAgICBpbmRleEFyZ3VtZW50LnJlcGxhY2VBbGxVc2Vyc0RvbWluYXRlZEJ5KGluZGV4Tm9kZSwgY2hlY2spOwogICAgfQogICAgYm91bmRzQ2hlY2tlZC5hZGQoaW5kZXhOb2RlKTsKICAgIHJldHVybiBjaGVjazsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbmRleChISW5kZXggbm9kZSkgewogICAgaWYgKGJvdW5kc0NoZWNrZWQuY29udGFpbnMobm9kZSkpIHJldHVybjsKICAgIEhJbnN0cnVjdGlvbiBpbmRleCA9IG5vZGUuaW5kZXg7CiAgICBpbmRleCA9IGluc2VydEJvdW5kc0NoZWNrKG5vZGUsIG5vZGUucmVjZWl2ZXIsIGluZGV4KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbmRleEFzc2lnbihISW5kZXhBc3NpZ24gbm9kZSkgewogICAgaWYgKGJvdW5kc0NoZWNrZWQuY29udGFpbnMobm9kZSkpIHJldHVybjsKICAgIEhJbnN0cnVjdGlvbiBpbmRleCA9IG5vZGUuaW5kZXg7CiAgICBpbmRleCA9IGluc2VydEJvdW5kc0NoZWNrKG5vZGUsIG5vZGUucmVjZWl2ZXIsIGluZGV4KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnZva2VEeW5hbWljTWV0aG9kKEhJbnZva2VEeW5hbWljTWV0aG9kIG5vZGUpIHsKICAgIE1lbWJlckVudGl0eSBlbGVtZW50ID0gbm9kZS5lbGVtZW50OwogICAgaWYgKG5vZGUuaXNJbnRlcmNlcHRlZENhbGwpIHJldHVybjsKICAgIGlmIChlbGVtZW50ICE9IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzQXJyYXlSZW1vdmVMYXN0KSByZXR1cm47CiAgICBpZiAoYm91bmRzQ2hlY2tlZC5jb250YWlucyhub2RlKSkgcmV0dXJuOwogICAgLy8gYDBgIGlzIHRoZSBpbmRleCB3ZSB3YW50IHRvIGNoZWNrLCBidXQgd2Ugd2FudCB0byByZXBvcnQgYC0xYCwgYXMgaWYgd2UKICAgIC8vIGV4ZWN1dGVkIGBhW2EubGVuZ3RoLTFdYAogICAgSEJvdW5kc0NoZWNrIGNoZWNrID0gaW5zZXJ0Qm91bmRzQ2hlY2soCiAgICAgICAgbm9kZSwgbm9kZS5yZWNlaXZlciwgZ3JhcGguYWRkQ29uc3RhbnRJbnQoMCwgY2xvc2VkV29ybGQpKTsKICAgIEhJbnN0cnVjdGlvbiBtaW51c09uZSA9IGdyYXBoLmFkZENvbnN0YW50SW50KC0xLCBjbG9zZWRXb3JsZCk7CiAgICBjaGVjay5pbnB1dHMuYWRkKG1pbnVzT25lKTsKICAgIG1pbnVzT25lLnVzZWRCeS5hZGQoY2hlY2spOwogIH0KfQoKY2xhc3MgU3NhRGVhZENvZGVFbGltaW5hdG9yIGV4dGVuZHMgSEdyYXBoVmlzaXRvciBpbXBsZW1lbnRzIE9wdGltaXphdGlvblBoYXNlIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICJTc2FEZWFkQ29kZUVsaW1pbmF0b3IiOwoKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CiAgZmluYWwgU3NhT3B0aW1pemVyVGFzayBvcHRpbWl6ZXI7CiAgSEdyYXBoIF9ncmFwaDsKICBTc2FMaXZlQmxvY2tBbmFseXplciBhbmFseXplcjsKICBNYXA8SEluc3RydWN0aW9uLCBib29sPiB0cml2aWFsRGVhZFN0b3JlUmVjZWl2ZXJzID0KICAgICAgbmV3IE1hcGxldDxISW5zdHJ1Y3Rpb24sIGJvb2w+KCk7CiAgYm9vbCBlbGltaW5hdGVkU2lkZUVmZmVjdHMgPSBmYWxzZTsKCiAgU3NhRGVhZENvZGVFbGltaW5hdG9yKHRoaXMuY2xvc2VkV29ybGQsIHRoaXMub3B0aW1pemVyKTsKCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgX2Fic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbjsKCiAgSEluc3RydWN0aW9uIHphcEluc3RydWN0aW9uQ2FjaGU7CiAgSEluc3RydWN0aW9uIGdldCB6YXBJbnN0cnVjdGlvbiB7CiAgICBpZiAoemFwSW5zdHJ1Y3Rpb25DYWNoZSA9PSBudWxsKSB7CiAgICAgIC8vIEEgY29uc3RhbnQgd2l0aCBubyB0eXBlIGRvZXMgbm90IHBvbGx1dGUgdHlwZXMgYXQgcGhpIG5vZGVzLgogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gY29uc3QgVW5yZWFjaGFibGVDb25zdGFudFZhbHVlKCk7CiAgICAgIHphcEluc3RydWN0aW9uQ2FjaGUgPSBhbmFseXplci5ncmFwaC5hZGRDb25zdGFudChjb25zdGFudCwgY2xvc2VkV29ybGQpOwogICAgfQogICAgcmV0dXJuIHphcEluc3RydWN0aW9uQ2FjaGU7CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIG9mIFtmb3JlaWduXSB3aWxsIHRocm93IGFuIG5vU3VjaE1ldGhvZCBlcnJvciBpZgogIC8vLyByZWNlaXZlciBpcyBgbnVsbGAgYmVmb3JlIGhhdmluZyBhbnkgb3RoZXIgc2lkZS1lZmZlY3RzLgogIGJvb2wgdGVtcGxhdGVUaHJvd3NOU01vbk51bGwoSEZvcmVpZ25Db2RlIGZvcmVpZ24sIEhJbnN0cnVjdGlvbiByZWNlaXZlcikgewogICAgaWYgKGZvcmVpZ24uaW5wdXRzLmxlbmd0aCA8IDEpIHJldHVybiBmYWxzZTsKICAgIGlmIChmb3JlaWduLmlucHV0cy5maXJzdCAhPSByZWNlaXZlcikgcmV0dXJuIGZhbHNlOwogICAgaWYgKGZvcmVpZ24udGhyb3dCZWhhdmlvci5pc051bGxOU01HdWFyZCkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBuZXh0IHRocm93aW5nIGluc3RydWN0aW9uIHRoYXQgbWF5IGhhdmUgc2lkZQogIC8vLyBlZmZlY3RzIGFmdGVyIFtpbnN0cnVjdGlvbl0sIHRocm93cyBbTm9TdWNoTWV0aG9kRXJyb3JdIG9uIHRoZQogIC8vLyBzYW1lIHJlY2VpdmVyIG9mIFtpbnN0cnVjdGlvbl0uCiAgYm9vbCBoYXNGb2xsb3dpbmdUaHJvd2luZ05TTShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IGluc3RydWN0aW9uLmdldERhcnRSZWNlaXZlcihjbG9zZWRXb3JsZCk7CiAgICBISW5zdHJ1Y3Rpb24gY3VycmVudCA9IGluc3RydWN0aW9uLm5leHQ7CiAgICBkbyB7CiAgICAgIGlmICgoY3VycmVudC5nZXREYXJ0UmVjZWl2ZXIoY2xvc2VkV29ybGQpID09IHJlY2VpdmVyKSAmJgogICAgICAgICAgY3VycmVudC5jYW5UaHJvdyhfYWJzdHJhY3RWYWx1ZURvbWFpbikpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoY3VycmVudCBpcyBIRm9yZWlnbkNvZGUgJiYKICAgICAgICAgIHRlbXBsYXRlVGhyb3dzTlNNb25OdWxsKGN1cnJlbnQsIHJlY2VpdmVyKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChjdXJyZW50LmNhblRocm93KF9hYnN0cmFjdFZhbHVlRG9tYWluKSB8fAogICAgICAgICAgY3VycmVudC5zaWRlRWZmZWN0cy5oYXNTaWRlRWZmZWN0cygpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIEhJbnN0cnVjdGlvbiBuZXh0ID0gY3VycmVudC5uZXh0OwogICAgICBpZiAobmV4dCA9PSBudWxsKSB7CiAgICAgICAgLy8gV2UgZG8gbm90IG1lcmdlIGJsb2NrcyBpbiBvdXIgU1NBIGdyYXBoLCBzbyBpZiB0aGlzIGJsb2NrIGp1c3QganVtcHMKICAgICAgICAvLyB0byBhIHNpbmdsZSBzdWNjZXNzb3IsIHZpc2l0IHRoZSBzdWNjZXNzb3IsIGF2b2lkaW5nIGJhY2stZWRnZXMuCiAgICAgICAgSEJhc2ljQmxvY2sgc3VjY2Vzc29yOwogICAgICAgIGlmIChjdXJyZW50IGlzIEhHb3RvKSB7CiAgICAgICAgICBzdWNjZXNzb3IgPSBjdXJyZW50LmJsb2NrLnN1Y2Nlc3NvcnMuc2luZ2xlOwogICAgICAgIH0gZWxzZSBpZiAoY3VycmVudCBpcyBISWYpIHsKICAgICAgICAgIC8vIFdlIGFsc28gbGVhdmUgSElmIG5vZGVzIGluIHBsYWNlIHdoZW4gb25lIGJyYW5jaCBpcyBkZWFkLgogICAgICAgICAgSEluc3RydWN0aW9uIGNvbmRpdGlvbiA9IGN1cnJlbnQuaW5wdXRzLmZpcnN0OwogICAgICAgICAgaWYgKGNvbmRpdGlvbiBpcyBIQ29uc3RhbnQpIHsKICAgICAgICAgICAgYm9vbCBpc1RydWUgPSBjb25kaXRpb24uY29uc3RhbnQuaXNUcnVlOwogICAgICAgICAgICBzdWNjZXNzb3IgPSBpc1RydWUgPyBjdXJyZW50LnRoZW5CbG9jayA6IGN1cnJlbnQuZWxzZUJsb2NrOwogICAgICAgICAgICBhc3NlcnQoIWFuYWx5emVyLmlzRGVhZEJsb2NrKHN1Y2Nlc3NvcikpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc3VjY2Vzc29yICE9IG51bGwgJiYgc3VjY2Vzc29yLmlkID4gY3VycmVudC5ibG9jay5pZCkgewogICAgICAgICAgbmV4dCA9IHN1Y2Nlc3Nvci5maXJzdDsKICAgICAgICB9CiAgICAgIH0KICAgICAgY3VycmVudCA9IG5leHQ7CiAgICB9IHdoaWxlIChjdXJyZW50ICE9IG51bGwpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBpc1RyaXZpYWxEZWFkU3RvcmVSZWNlaXZlcihISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIC8vIEZvciBhbiBhbGxvY2F0aW9uLCBpZiBhbGwgdGhlIGxvYWRzIGFyZSBkZWFkIChhd2FpdGluZyByZW1vdmFsIGFmdGVyCiAgICAvLyBTc2FMb2FkRWxpbWluYXRpb24pIGFuZCB0aGUgb25seSBvdGhlciB1c2VzIGFyZSBzdG9yZXMsIHRoZW4gdGhlCiAgICAvLyBhbGxvY2F0aW9uIGRvZXMgbm90IGVzY2FwZSB3aGljaCBtYWtlcyBhbGwgdGhlIHN0b3JlcyBkZWFkIHRvby4KICAgIGJvb2wgaXNEZWFkVXNlKEhJbnN0cnVjdGlvbiB1c2UpIHsKICAgICAgaWYgKHVzZSBpcyBIRmllbGRTZXQpIHsKICAgICAgICAvLyBUaGUgdXNlIG11c3QgYmUgdGhlIHJlY2VpdmVyLiAgRXZlbiBpZiB0aGUgdXNlIGlzIGFsc28gdGhlIGFyZ3VtZW50LAogICAgICAgIC8vIGkuZS4gIGEueCA9IGEsIHRoZSBzdG9yZSBpcyBzdGlsbCBkZWFkIGlmIGFsbCBvdGhlciB1c2VzIGFyZSBkZWFkLgogICAgICAgIGlmICh1c2UuZ2V0RGFydFJlY2VpdmVyKGNsb3NlZFdvcmxkKSA9PSBpbnN0cnVjdGlvbikgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSBpZiAodXNlIGlzIEhGaWVsZEdldCkgewogICAgICAgIGFzc2VydCh1c2UuZ2V0RGFydFJlY2VpdmVyKGNsb3NlZFdvcmxkKSA9PSBpbnN0cnVjdGlvbik7CiAgICAgICAgaWYgKGlzRGVhZENvZGUodXNlKSkgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHJldHVybiBpbnN0cnVjdGlvbi5pc0FsbG9jYXRpb24oX2Fic3RyYWN0VmFsdWVEb21haW4pICYmCiAgICAgICAgaW5zdHJ1Y3Rpb24uaXNQdXJlKF9hYnN0cmFjdFZhbHVlRG9tYWluKSAmJgogICAgICAgIHRyaXZpYWxEZWFkU3RvcmVSZWNlaXZlcnMucHV0SWZBYnNlbnQoCiAgICAgICAgICAgIGluc3RydWN0aW9uLCAoKSA9PiBpbnN0cnVjdGlvbi51c2VkQnkuZXZlcnkoaXNEZWFkVXNlKSk7CiAgfQoKICBib29sIGlzVHJpdmlhbERlYWRTdG9yZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIHJldHVybiBpbnN0cnVjdGlvbiBpcyBIRmllbGRTZXQgJiYKICAgICAgICBpc1RyaXZpYWxEZWFkU3RvcmVSZWNlaXZlcihpbnN0cnVjdGlvbi5nZXREYXJ0UmVjZWl2ZXIoY2xvc2VkV29ybGQpKTsKICB9CgogIGJvb2wgaXNEZWFkQ29kZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGlmICghaW5zdHJ1Y3Rpb24udXNlZEJ5LmlzRW1wdHkpIHJldHVybiBmYWxzZTsKICAgIGlmIChpc1RyaXZpYWxEZWFkU3RvcmUoaW5zdHJ1Y3Rpb24pKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChpbnN0cnVjdGlvbi5zaWRlRWZmZWN0cy5oYXNTaWRlRWZmZWN0cygpKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoaW5zdHJ1Y3Rpb24uY2FuVGhyb3coX2Fic3RyYWN0VmFsdWVEb21haW4pKSB7CiAgICAgIGlmIChpbnN0cnVjdGlvbi5vbmx5VGhyb3dzTlNNKCkgJiYgaGFzRm9sbG93aW5nVGhyb3dpbmdOU00oaW5zdHJ1Y3Rpb24pKSB7CiAgICAgICAgLy8gW2luc3RydWN0aW9uXSBpcyBhIG51bGwgcmVjaWV2ZXIgZ3VhcmQgdGhhdCBpcyBmb2xsb3dlZCBieSBhbgogICAgICAgIC8vIGluc3RydWN0aW9uIHRoYXQgZmFpbHMgdGhlIHNhbWUgd2F5IChieSBhY2Nlc3NpbmcgYSBwcm9wZXJ0eSBvZgogICAgICAgIC8vIGBudWxsYCBvciBgdW5kZWZpbmVkYCkuCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGluc3RydWN0aW9uIGlzIEhQYXJhbWV0ZXJWYWx1ZSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGluc3RydWN0aW9uIGlzIEhMb2NhbFNldCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICBfZ3JhcGggPSBncmFwaDsKICAgIGFuYWx5emVyID0gbmV3IFNzYUxpdmVCbG9ja0FuYWx5emVyKGdyYXBoLCBjbG9zZWRXb3JsZCwgb3B0aW1pemVyKTsKICAgIGFuYWx5emVyLmFuYWx5emUoKTsKICAgIHZpc2l0UG9zdERvbWluYXRvclRyZWUoZ3JhcGgpOwogICAgY2xlYW5QaGlzKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgYm9vbCBpc0RlYWRCbG9jayA9IGFuYWx5emVyLmlzRGVhZEJsb2NrKGJsb2NrKTsKICAgIGJsb2NrLmlzTGl2ZSA9ICFpc0RlYWRCbG9jazsKICAgIHNpbXBsaWZ5Q29udHJvbEZsb3coYmxvY2spOwogICAgLy8gU3RhcnQgZnJvbSB0aGUgbGFzdCBub24tY29udHJvbCBmbG93IGluc3RydWN0aW9uIGluIHRoZSBibG9jay4KICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IGJsb2NrLmxhc3QucHJldmlvdXM7CiAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICB2YXIgcHJldmlvdXMgPSBpbnN0cnVjdGlvbi5wcmV2aW91czsKICAgICAgaWYgKGlzRGVhZEJsb2NrKSB7CiAgICAgICAgZWxpbWluYXRlZFNpZGVFZmZlY3RzID0KICAgICAgICAgICAgZWxpbWluYXRlZFNpZGVFZmZlY3RzIHx8IGluc3RydWN0aW9uLnNpZGVFZmZlY3RzLmhhc1NpZGVFZmZlY3RzKCk7CiAgICAgICAgcmVtb3ZlVXNlcnMoaW5zdHJ1Y3Rpb24pOwogICAgICAgIGJsb2NrLnJlbW92ZShpbnN0cnVjdGlvbik7CiAgICAgIH0gZWxzZSBpZiAoaXNEZWFkQ29kZShpbnN0cnVjdGlvbikpIHsKICAgICAgICBibG9jay5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogICAgICB9CiAgICAgIGluc3RydWN0aW9uID0gcHJldmlvdXM7CiAgICB9CiAgICBibG9jay5mb3JFYWNoUGhpKHNpbXBsaWZ5UGhpKTsKICAgIGV2YWN1YXRlVGFrZW5CcmFuY2goYmxvY2spOwogIH0KCiAgdm9pZCBzaW1wbGlmeVBoaShIUGhpIHBoaSkgewogICAgLy8gSWYgdGhlIHBoaSBpcyBvZiB0aGUgZm9ybSBgcGhpKHgsIEhUeXBlS25vd24oeCkpYCwgaXQgZG9lcyBub3Qgc3RyZW5ndGhlbgogICAgLy8gYHhgLiAgV2UgY2FuIHJlcGxhY2UgdGhlIHBoaSB3aXRoIGB4YCB0byBwb3RlbnRpYWxseSBtYWtlIHRoZSBIVHlwZUtub3duCiAgICAvLyByZWZpbmVtZW50IG5vZGUgZGVhZCBhbmQgcG90ZW50aWFsbHkgbWFrZSBhIEhJZiBjb250cm9sIG5vIEhQaGlzLgoKICAgIC8vIFRPRE8oc3JhKTogSW1wbGVtZW50IHZlcnNpb24gb2YgdGhpcyB0ZXN0IHRoYXQgd29ya3MgZm9yIGEgc3ViZ3JhcGggb2YKICAgIC8vIEhQaGkgbm9kZXMuCiAgICBISW5zdHJ1Y3Rpb24gYmFzZSA9IG51bGw7CiAgICBib29sIHNlZW5VbnJlZmluZWRCYXNlID0gZmFsc2U7CiAgICBmb3IgKEhJbnN0cnVjdGlvbiBpbnB1dCBpbiBwaGkuaW5wdXRzKSB7CiAgICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IGlucHV0OwogICAgICB3aGlsZSAodmFsdWUgaXMgSFR5cGVLbm93bikgewogICAgICAgIEhUeXBlS25vd24gcmVmaW5lbWVudCA9IHZhbHVlOwogICAgICAgIHZhbHVlID0gcmVmaW5lbWVudC5jaGVja2VkSW5wdXQ7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlID09IGlucHV0KSBzZWVuVW5yZWZpbmVkQmFzZSA9IHRydWU7CiAgICAgIGJhc2UgPz89IHZhbHVlOwogICAgICBpZiAoYmFzZSAhPSB2YWx1ZSkgcmV0dXJuOwogICAgfQoKICAgIGlmIChzZWVuVW5yZWZpbmVkQmFzZSkgewogICAgICBIQmFzaWNCbG9jayBibG9jayA9IHBoaS5ibG9jazsKICAgICAgYmxvY2sucmV3cml0ZShwaGksIGJhc2UpOwogICAgICBibG9jay5yZW1vdmVQaGkocGhpKTsKICAgIH0KICB9CgogIHZvaWQgc2ltcGxpZnlDb250cm9sRmxvdyhIQmFzaWNCbG9jayBibG9jaykgewogICAgSENvbnRyb2xGbG93IGluc3RydWN0aW9uID0gYmxvY2subGFzdDsKICAgIGlmIChpbnN0cnVjdGlvbiBpcyBISWYpIHsKICAgICAgSEluc3RydWN0aW9uIGNvbmRpdGlvbiA9IGluc3RydWN0aW9uLmNvbmRpdGlvbjsKICAgICAgaWYgKGNvbmRpdGlvbi5pc0NvbnN0YW50KCkpIHJldHVybjsKCiAgICAgIC8vIFdlIHdhbnQgdG8gcmVtb3ZlIGFuIGlmLXRoZW4tZWxzZSBkaWFtb25kIHdoZW4gdGhlIHRoZW4tIGFuZCBlbHNlLQogICAgICAvLyBicmFuY2hlcyBhcmUgZW1wdHkgYW5kIHRoZSBjb25kaXRpb24gZG9lcyBub3QgY29udHJvbCBhIEhQaGkuIFdlIGNhbm5vdAogICAgICAvLyBjaGFuZ2UgdGhlIENGRyBzdHJ1Y3R1cmUgc28gd2UgcmVwbGFjZSB0aGUgSElmIGNvbmRpdGlvbiB3aXRoIGEKICAgICAgLy8gY29uc3RhbnQuIFRoaXMgbWF5IGxlYXZlIHRoZSBvcmlnaW5hbCBjb25kaXRpb24gdW51c2VkLiBpLmUuIGEKICAgICAgLy8gY2FuZGlkYXRlIGZvciBiZWluZyBkZWFkIGNvZGUuCgogICAgICBMaXN0PEhCYXNpY0Jsb2NrPiBkb21pbmF0ZWQgPSBibG9jay5kb21pbmF0ZWRCbG9ja3M7CiAgICAgIC8vIERpYW1vbmQtbGlrZSBjb250cm9sIGZsb3cgZG9taW5hdGVzIHRoZSB0aGVuLSwgZWxzZS0gYW5kIGpvaW4tIGJsb2Nrcy4KICAgICAgaWYgKGRvbWluYXRlZC5sZW5ndGggIT0gMykgcmV0dXJuOwogICAgICBIQmFzaWNCbG9jayBqb2luID0gZG9taW5hdGVkLmxhc3Q7CiAgICAgIGlmICgham9pbi5waGlzLmlzRW1wdHkpIHJldHVybjsgLy8gY29uZGl0aW9uIGNvbnRyb2xzIGEgcGhpLgogICAgICAvLyBJZ25vcmUgZXhpdCBibG9jayAtIHVzdWFsbHkgdGhlIGpvaW4gaW4gYGlmICguLi4pIHJldHVybiAuLi5gCiAgICAgIGlmIChqb2luLmlzRXhpdEJsb2NrKCkpIHJldHVybjsKCiAgICAgIGludCB0aGVuU2l6ZSA9IG1lYXN1cmVFbXB0eUludGVydmFsKGluc3RydWN0aW9uLnRoZW5CbG9jaywgam9pbik7CiAgICAgIGlmICh0aGVuU2l6ZSA9PSBudWxsKSByZXR1cm47CiAgICAgIGludCBlbHNlU2l6ZSA9IG1lYXN1cmVFbXB0eUludGVydmFsKGluc3RydWN0aW9uLmVsc2VCbG9jaywgam9pbik7CiAgICAgIGlmIChlbHNlU2l6ZSA9PSBudWxsKSByZXR1cm47CgogICAgICAvLyBQaWNrIHRoZSAnbGl2ZScgYnJhbmNoIHRvIGJlIHRoZSBzbWFsbGVzdCBzdWJncmFwaC4KICAgICAgYm9vbCB2YWx1ZSA9IHRoZW5TaXplIDw9IGVsc2VTaXplOwogICAgICBISW5zdHJ1Y3Rpb24gbmV3Q29uZGl0aW9uID0gX2dyYXBoLmFkZENvbnN0YW50Qm9vbCh2YWx1ZSwgY2xvc2VkV29ybGQpOwogICAgICBpbnN0cnVjdGlvbi5pbnB1dHNbMF0gPSBuZXdDb25kaXRpb247CiAgICAgIGNvbmRpdGlvbi51c2VkQnkucmVtb3ZlKGluc3RydWN0aW9uKTsKICAgICAgbmV3Q29uZGl0aW9uLnVzZWRCeS5hZGQoaW5zdHJ1Y3Rpb24pOwogICAgfQogIH0KCiAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBibG9ja3MgZnJvbSBbc3RhcnRdIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIFtlbmRdLgogIC8vLyBSZXR1cm5zIGBudWxsYCBpZiBhbnkgb2YgdGhlIGJsb2NrcyBpcyBub24tZW1wdHkgKG90aGVyIHRoYW4gY29udHJvbAogIC8vLyBmbG93KS4gIFJldHVybnMgYG51bGxgIGlmIHRoZXJlIGlzIGFuIGV4aXQgZnJvbSB0aGUgcmVnaW9uIG90aGVyIHRoYW4KICAvLy8gW2VuZF0gb3IgdmlhIGNvbnRyb2wgZmxvdyBvdGhlciB0aGFuIEhHb3RvIGFuZCBISWYuCiAgaW50IG1lYXN1cmVFbXB0eUludGVydmFsKEhCYXNpY0Jsb2NrIHN0YXJ0LCBIQmFzaWNCbG9jayBlbmQpIHsKICAgIGlmIChzdGFydC5maXJzdCAhPSBzdGFydC5sYXN0KSByZXR1cm4gbnVsbDsgLy8gc3RhcnQgaXMgbm90IGVtcHR5LgogICAgLy8gRG8gYSBzaW1wbGUgc2luZ2xlLWJsb2NrIHJlZ2lvbiB0ZXN0IGZpcnN0LgogICAgaWYgKHN0YXJ0Lmxhc3QgaXMgSEdvdG8gJiYKICAgICAgICBzdGFydC5zdWNjZXNzb3JzLmxlbmd0aCA9PSAxICYmCiAgICAgICAgc3RhcnQuc3VjY2Vzc29ycy5zaW5nbGUgPT0gZW5kKSB7CiAgICAgIHJldHVybiAxOwogICAgfQogICAgLy8gVE9ETyhzcmEpOiBJbXBsZW1lbnQgZnVsbGVyIHRlc3QuCiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBJZiBbYmxvY2tdIGlzIGFuIGFsd2F5cy10YWtlbiBicmFuY2gsIG1vdmUgdGhlIGNvZGUgZnJvbSB0aGUgdGFrZW4gYnJhbmNoCiAgLy8vIGludG8gW2Jsb2NrXS4gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBtYWtpbmcgdGhlIGluc3RydWN0aW9ucyBhdmFpbGFibGUgZm9yCiAgLy8vIGZ1cnRoZXIgb3B0aW1pemF0aW9ucyBieSBtb3ZpbmcgdGhlbSB0byBhIHBvc2l0aW9uIHRoYXQgZG9taW5hdGVzIHRoZSBqb2luCiAgLy8vIHBvaW50IG9mIHRoZSBpZi10aGVuLWVsc2UuCiAgLy8gVE9ETygyOTQ3NSk6IERlbGV0ZSBkZWFkIGJsb2NrcyBpbnN0ZWFkLgogIHZvaWQgZXZhY3VhdGVUYWtlbkJyYW5jaChIQmFzaWNCbG9jayBibG9jaykgewogICAgaWYgKCFibG9jay5pc0xpdmUpIHJldHVybjsKICAgIEhDb250cm9sRmxvdyBicmFuY2ggPSBibG9jay5sYXN0OwogICAgaWYgKGJyYW5jaCBpcyBISWYpIHsKICAgICAgaWYgKGJyYW5jaC50aGVuQmxvY2suaXNMaXZlID09IGJyYW5jaC5lbHNlQmxvY2suaXNMaXZlKSByZXR1cm47CiAgICAgIGFzc2VydChicmFuY2guY29uZGl0aW9uLmlzQ29uc3RhbnQoKSk7CiAgICAgIEhCYXNpY0Jsb2NrIHRhcmdldCA9CiAgICAgICAgICBicmFuY2gudGhlbkJsb2NrLmlzTGl2ZSA/IGJyYW5jaC50aGVuQmxvY2sgOiBicmFuY2guZWxzZUJsb2NrOwogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSB0YXJnZXQuZmlyc3Q7CiAgICAgIHdoaWxlICghaW5zdHJ1Y3Rpb24uaXNDb250cm9sRmxvdygpKSB7CiAgICAgICAgSEluc3RydWN0aW9uIG5leHQgPSBpbnN0cnVjdGlvbi5uZXh0OwogICAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIVHlwZUtub3duICYmIGluc3RydWN0aW9uLmlzUGlubmVkKSBicmVhazsKICAgICAgICBpbnN0cnVjdGlvbi5ibG9jay5kZXRhY2goaW5zdHJ1Y3Rpb24pOwogICAgICAgIGJsb2NrLm1vdmVBdEV4aXQoaW5zdHJ1Y3Rpb24pOwogICAgICAgIGluc3RydWN0aW9uID0gbmV4dDsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBjbGVhblBoaXMoKSB7CiAgICBMOgogICAgZm9yIChIQmFzaWNCbG9jayBibG9jayBpbiBfZ3JhcGguYmxvY2tzKSB7CiAgICAgIExpc3Q8SEJhc2ljQmxvY2s+IHByZWRlY2Vzc29ycyA9IGJsb2NrLnByZWRlY2Vzc29yczsKICAgICAgLy8gWmFwIGFsbCBpbnB1dHMgdG8gcGhpcyB0aGF0IGNvcnJlc3BvbmQgdG8gZGVhZCBibG9ja3MuCiAgICAgIGJsb2NrLmZvckVhY2hQaGkoKEhQaGkgcGhpKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGkuaW5wdXRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBpZiAoIXByZWRlY2Vzc29yc1tpXS5pc0xpdmUgJiYgcGhpLmlucHV0c1tpXSAhPSB6YXBJbnN0cnVjdGlvbikgewogICAgICAgICAgICByZXBsYWNlSW5wdXQoaSwgcGhpLCB6YXBJbnN0cnVjdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgaWYgKHByZWRlY2Vzc29ycy5sZW5ndGggPCAyKSBjb250aW51ZSBMOwogICAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgc2luZ2xlIGxpdmUgcHJlZGVjZXNzb3IgaWYgaXQgZXhpc3RzLgogICAgICBpbnQgaW5kZXhPZkxpdmUgPSAtMTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVkZWNlc3NvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAocHJlZGVjZXNzb3JzW2ldLmlzTGl2ZSkgewogICAgICAgICAgaWYgKGluZGV4T2ZMaXZlID49IDApIGNvbnRpbnVlIEw7CiAgICAgICAgICBpbmRleE9mTGl2ZSA9IGk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFJ1biB0aHJvdWdoIHRoZSBwaGlzIG9mIHRoZSBibG9jayBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlaXIgaW5wdXQKICAgICAgLy8gdGhhdCBjb21lcyBmcm9tIHRoZSBvbmx5IGxpdmUgcHJlZGVjZXNzb3IgaWYgdGhhdCBkb21pbmF0ZXMgdGhlIHBoaS4KICAgICAgLy8KICAgICAgLy8gVE9ETyhzcmEpOiBJZiB0aGUgaW5wdXQgaXMgZGlyZWN0bHkgaW4gdGhlIG9ubHkgbGl2ZSBwcmVkZWNlc3NvciwgaXQKICAgICAgLy8gbWlnaHQgYmUgcG9zc2libGUgdG8gbW92ZSBpdCBpbnRvIFtibG9ja10gKGUuZy4gYWxsIGl0cyBpbnB1dHMgYXJlCiAgICAgIC8vIGRvbWluYXRpbmcuKQogICAgICBibG9jay5mb3JFYWNoUGhpKChIUGhpIHBoaSkgewogICAgICAgIEhJbnN0cnVjdGlvbiByZXBsYWNlbWVudCA9CiAgICAgICAgICAgIChpbmRleE9mTGl2ZSA+PSAwKSA/IHBoaS5pbnB1dHNbaW5kZXhPZkxpdmVdIDogemFwSW5zdHJ1Y3Rpb247CiAgICAgICAgaWYgKHJlcGxhY2VtZW50LmRvbWluYXRlcyhwaGkpKSB7CiAgICAgICAgICBibG9jay5yZXdyaXRlKHBoaSwgcmVwbGFjZW1lbnQpOwogICAgICAgICAgYmxvY2sucmVtb3ZlUGhpKHBoaSk7CiAgICAgICAgICBpZiAocmVwbGFjZW1lbnQuc291cmNlRWxlbWVudCA9PSBudWxsICYmCiAgICAgICAgICAgICAgcGhpLnNvdXJjZUVsZW1lbnQgIT0gbnVsbCAmJgogICAgICAgICAgICAgIHJlcGxhY2VtZW50IGlzISBIVGhpcykgewogICAgICAgICAgICByZXBsYWNlbWVudC5zb3VyY2VFbGVtZW50ID0gcGhpLnNvdXJjZUVsZW1lbnQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CgogIHZvaWQgcmVwbGFjZUlucHV0KGludCBpLCBISW5zdHJ1Y3Rpb24gZnJvbSwgSEluc3RydWN0aW9uIGJ5KSB7CiAgICBmcm9tLmlucHV0c1tpXS51c2VkQnkucmVtb3ZlKGZyb20pOwogICAgZnJvbS5pbnB1dHNbaV0gPSBieTsKICAgIGJ5LnVzZWRCeS5hZGQoZnJvbSk7CiAgfQoKICB2b2lkIHJlbW92ZVVzZXJzKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgaW5zdHJ1Y3Rpb24udXNlZEJ5LmZvckVhY2goKHVzZXIpIHsKICAgICAgcmVtb3ZlSW5wdXQodXNlciwgaW5zdHJ1Y3Rpb24pOwogICAgfSk7CiAgICBpbnN0cnVjdGlvbi51c2VkQnkuY2xlYXIoKTsKICB9CgogIHZvaWQgcmVtb3ZlSW5wdXQoSEluc3RydWN0aW9uIHVzZXIsIEhJbnN0cnVjdGlvbiBpbnB1dCkgewogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IHVzZXIuaW5wdXRzOwogICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGlucHV0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAoaW5wdXQgPT0gaW5wdXRzW2ldKSB7CiAgICAgICAgdXNlci5pbnB1dHNbaV0gPSB6YXBJbnN0cnVjdGlvbjsKICAgICAgICB6YXBJbnN0cnVjdGlvbi51c2VkQnkuYWRkKHVzZXIpOwogICAgICB9CiAgICB9CiAgfQp9CgpjbGFzcyBTc2FMaXZlQmxvY2tBbmFseXplciBleHRlbmRzIEhCYXNlVmlzaXRvciB7CiAgZmluYWwgSEdyYXBoIGdyYXBoOwogIGZpbmFsIFNldDxIQmFzaWNCbG9jaz4gbGl2ZSA9IG5ldyBTZXQ8SEJhc2ljQmxvY2s+KCk7CiAgZmluYWwgTGlzdDxIQmFzaWNCbG9jaz4gd29ya2xpc3QgPSA8SEJhc2ljQmxvY2s+W107CiAgZmluYWwgU3NhT3B0aW1pemVyVGFzayBvcHRpbWl6ZXI7CiAgZmluYWwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkOwoKICBTc2FMaXZlQmxvY2tBbmFseXplcih0aGlzLmdyYXBoLCB0aGlzLmNsb3NlZFdvcmxkLCB0aGlzLm9wdGltaXplcik7CgogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IF9hYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIE1hcDxISW5zdHJ1Y3Rpb24sIFJhbmdlPiBnZXQgcmFuZ2VzID0+IG9wdGltaXplci5yYW5nZXM7CgogIGJvb2wgaXNEZWFkQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spID0+ICFsaXZlLmNvbnRhaW5zKGJsb2NrKTsKCiAgdm9pZCBhbmFseXplKCkgewogICAgbWFya0Jsb2NrTGl2ZShncmFwaC5lbnRyeSk7CiAgICB3aGlsZSAoIXdvcmtsaXN0LmlzRW1wdHkpIHsKICAgICAgSEJhc2ljQmxvY2sgbGl2ZSA9IHdvcmtsaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgbGl2ZS5sYXN0LmFjY2VwdCh0aGlzKTsKICAgIH0KICB9CgogIHZvaWQgbWFya0Jsb2NrTGl2ZShIQmFzaWNCbG9jayBibG9jaykgewogICAgaWYgKCFsaXZlLmNvbnRhaW5zKGJsb2NrKSkgewogICAgICB3b3JrbGlzdC5hZGQoYmxvY2spOwogICAgICBsaXZlLmFkZChibG9jayk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29udHJvbEZsb3coSENvbnRyb2xGbG93IGluc3RydWN0aW9uKSB7CiAgICBpbnN0cnVjdGlvbi5ibG9jay5zdWNjZXNzb3JzLmZvckVhY2gobWFya0Jsb2NrTGl2ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SWYoSElmIGluc3RydWN0aW9uKSB7CiAgICBISW5zdHJ1Y3Rpb24gY29uZGl0aW9uID0gaW5zdHJ1Y3Rpb24uY29uZGl0aW9uOwogICAgaWYgKGNvbmRpdGlvbi5pc0NvbnN0YW50KCkpIHsKICAgICAgaWYgKGNvbmRpdGlvbi5pc0NvbnN0YW50VHJ1ZSgpKSB7CiAgICAgICAgbWFya0Jsb2NrTGl2ZShpbnN0cnVjdGlvbi50aGVuQmxvY2spOwogICAgICB9IGVsc2UgewogICAgICAgIG1hcmtCbG9ja0xpdmUoaW5zdHJ1Y3Rpb24uZWxzZUJsb2NrKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmlzaXRDb250cm9sRmxvdyhpbnN0cnVjdGlvbik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3dpdGNoKEhTd2l0Y2ggbm9kZSkgewogICAgaWYgKG5vZGUuZXhwcmVzc2lvbi5pc0ludGVnZXIoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgUmFuZ2Ugc3dpdGNoUmFuZ2UgPSByYW5nZXNbbm9kZS5leHByZXNzaW9uXTsKICAgICAgaWYgKHN3aXRjaFJhbmdlICE9IG51bGwgJiYKICAgICAgICAgIHN3aXRjaFJhbmdlLmxvd2VyIGlzIEludFZhbHVlICYmCiAgICAgICAgICBzd2l0Y2hSYW5nZS51cHBlciBpcyBJbnRWYWx1ZSkgewogICAgICAgIEludFZhbHVlIGxvd2VyVmFsdWUgPSBzd2l0Y2hSYW5nZS5sb3dlcjsKICAgICAgICBJbnRWYWx1ZSB1cHBlclZhbHVlID0gc3dpdGNoUmFuZ2UudXBwZXI7CiAgICAgICAgQmlnSW50IGxvd2VyID0gbG93ZXJWYWx1ZS52YWx1ZTsKICAgICAgICBCaWdJbnQgdXBwZXIgPSB1cHBlclZhbHVlLnZhbHVlOwogICAgICAgIFNldDxCaWdJbnQ+IGxpdmVMYWJlbHMgPSBuZXcgU2V0PEJpZ0ludD4oKTsKICAgICAgICBmb3IgKGludCBwb3MgPSAxOyBwb3MgPCBub2RlLmlucHV0cy5sZW5ndGg7IHBvcysrKSB7CiAgICAgICAgICBIQ29uc3RhbnQgaW5wdXQgPSBub2RlLmlucHV0c1twb3NdOwogICAgICAgICAgaWYgKCFpbnB1dC5pc0NvbnN0YW50SW50ZWdlcigpKSBjb250aW51ZTsKICAgICAgICAgIEludENvbnN0YW50VmFsdWUgY29uc3RhbnQgPSBpbnB1dC5jb25zdGFudDsKICAgICAgICAgIEJpZ0ludCBsYWJlbCA9IGNvbnN0YW50LmludFZhbHVlOwogICAgICAgICAgaWYgKCFsaXZlTGFiZWxzLmNvbnRhaW5zKGxhYmVsKSAmJiBsYWJlbCA8PSB1cHBlciAmJiBsYWJlbCA+PSBsb3dlcikgewogICAgICAgICAgICBtYXJrQmxvY2tMaXZlKG5vZGUuYmxvY2suc3VjY2Vzc29yc1twb3MgLSAxXSk7CiAgICAgICAgICAgIGxpdmVMYWJlbHMuYWRkKGxhYmVsKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG5ldyBCaWdJbnQuZnJvbShsaXZlTGFiZWxzLmxlbmd0aCkgIT0gdXBwZXIgLSBsb3dlciArIEJpZ0ludC5vbmUpIHsKICAgICAgICAgIG1hcmtCbG9ja0xpdmUobm9kZS5kZWZhdWx0VGFyZ2V0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICB2aXNpdENvbnRyb2xGbG93KG5vZGUpOwogIH0KfQoKY2xhc3MgU3NhRGVhZFBoaUVsaW1pbmF0b3IgaW1wbGVtZW50cyBPcHRpbWl6YXRpb25QaGFzZSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAiU3NhRGVhZFBoaUVsaW1pbmF0b3IiOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICBmaW5hbCBMaXN0PEhQaGk+IHdvcmtsaXN0ID0gPEhQaGk+W107CiAgICAvLyBBIHNldCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsaXZlIHBoaXMgdGhhdCB3ZSBmb3VuZC4KICAgIGZpbmFsIFNldDxIUGhpPiBsaXZlUGhpcyA9IG5ldyBTZXQ8SFBoaT4oKTsKCiAgICAvLyBBZGQgdG8gdGhlIHdvcmtsaXN0IGFsbCBsaXZlIHBoaXM6IHBoaXMgcmVmZXJlbmNlZCBieSBub24tcGhpCiAgICAvLyBpbnN0cnVjdGlvbnMuCiAgICBmb3IgKGZpbmFsIGJsb2NrIGluIGdyYXBoLmJsb2NrcykgewogICAgICBibG9jay5mb3JFYWNoUGhpKChIUGhpIHBoaSkgewogICAgICAgIGZvciAoZmluYWwgdXNlciBpbiBwaGkudXNlZEJ5KSB7CiAgICAgICAgICBpZiAodXNlciBpcyEgSFBoaSkgewogICAgICAgICAgICB3b3JrbGlzdC5hZGQocGhpKTsKICAgICAgICAgICAgbGl2ZVBoaXMuYWRkKHBoaSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgLy8gUHJvY2VzcyB0aGUgd29ya2xpc3QgYnkgcHJvcGFnYXRpbmcgbGl2ZW5lc3MgdG8gcGhpIGlucHV0cy4KICAgIHdoaWxlICghd29ya2xpc3QuaXNFbXB0eSkgewogICAgICBIUGhpIHBoaSA9IHdvcmtsaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgZm9yIChmaW5hbCBpbnB1dCBpbiBwaGkuaW5wdXRzKSB7CiAgICAgICAgaWYgKGlucHV0IGlzIEhQaGkgJiYgIWxpdmVQaGlzLmNvbnRhaW5zKGlucHV0KSkgewogICAgICAgICAgd29ya2xpc3QuYWRkKGlucHV0KTsKICAgICAgICAgIGxpdmVQaGlzLmFkZChpbnB1dCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gUmVtb3ZlIHBoaXMgdGhhdCBhcmUgbm90IGxpdmUuCiAgICAvLyBUcmF2ZXJzZSBpbiByZXZlcnNlIG9yZGVyIHRvIHJlbW92ZSBwaGlzIHdpdGggbm8gdXNlcyBiZWZvcmUgdGhlCiAgICAvLyBwaGlzIHRoYXQgdGhleSBtaWdodCB1c2UuCiAgICAvLyBOT1RJQ0U6IERvZXNuJ3QgaGFuZGxlIGNpcmN1bGFyIHJlZmVyZW5jZXMsIGJ1dCB3ZSBkb24ndCBjdXJyZW50bHkKICAgIC8vIGNyZWF0ZSBhbnkuCiAgICBMaXN0PEhCYXNpY0Jsb2NrPiBibG9ja3MgPSBncmFwaC5ibG9ja3M7CiAgICBmb3IgKGludCBpID0gYmxvY2tzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gYmxvY2tzW2ldOwogICAgICBIUGhpIGN1cnJlbnQgPSBibG9jay5waGlzLmZpcnN0OwogICAgICBIUGhpIG5leHQgPSBudWxsOwogICAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CiAgICAgICAgbmV4dCA9IGN1cnJlbnQubmV4dDsKICAgICAgICBpZiAoIWxpdmVQaGlzLmNvbnRhaW5zKGN1cnJlbnQpCiAgICAgICAgICAgIC8vIFRPRE8oYWhlKTogTm90IHN1cmUgdGhlIGZvbGxvd2luZyBpcyBjb3JyZWN0LgogICAgICAgICAgICAmJgogICAgICAgICAgICBjdXJyZW50LnVzZWRCeS5pc0VtcHR5KSB7CiAgICAgICAgICBibG9jay5yZW1vdmVQaGkoY3VycmVudCk7CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgICB9CiAgICB9CiAgfQp9CgpjbGFzcyBTc2FSZWR1bmRhbnRQaGlFbGltaW5hdG9yIGltcGxlbWVudHMgT3B0aW1pemF0aW9uUGhhc2UgewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gIlNzYVJlZHVuZGFudFBoaUVsaW1pbmF0b3IiOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICBmaW5hbCBMaXN0PEhQaGk+IHdvcmtsaXN0ID0gPEhQaGk+W107CgogICAgLy8gQWRkIGFsbCBwaGlzIGluIHRoZSB3b3JrbGlzdC4KICAgIGZvciAoZmluYWwgYmxvY2sgaW4gZ3JhcGguYmxvY2tzKSB7CiAgICAgIGJsb2NrLmZvckVhY2hQaGkoKEhQaGkgcGhpKSA9PiB3b3JrbGlzdC5hZGQocGhpKSk7CiAgICB9CgogICAgd2hpbGUgKCF3b3JrbGlzdC5pc0VtcHR5KSB7CiAgICAgIEhQaGkgcGhpID0gd29ya2xpc3QucmVtb3ZlTGFzdCgpOwoKICAgICAgLy8gSWYgdGhlIHBoaSBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCwgY29udGludWUuCiAgICAgIGlmICghcGhpLmlzSW5CYXNpY0Jsb2NrKCkpIGNvbnRpbnVlOwoKICAgICAgLy8gRmluZCBpZiB0aGUgaW5wdXRzIG9mIHRoZSBwaGkgYXJlIHRoZSBzYW1lIGluc3RydWN0aW9uLgogICAgICAvLyBUaGUgYnVpbGRlciBlbnN1cmVzIHRoYXQgcGhpLmlucHV0c1swXSBjYW5ub3QgYmUgdGhlIHBoaQogICAgICAvLyBpdHNlbGYuCiAgICAgIGFzc2VydCghaWRlbnRpY2FsKHBoaS5pbnB1dHNbMF0sIHBoaSkpOwogICAgICBISW5zdHJ1Y3Rpb24gY2FuZGlkYXRlID0gcGhpLmlucHV0c1swXTsKICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwaGkuaW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGlucHV0ID0gcGhpLmlucHV0c1tpXTsKICAgICAgICAvLyBJZiB0aGUgaW5wdXQgaXMgdGhlIHBoaSwgdGhlIHBoaSBpcyBzdGlsbCBjYW5kaWRhdGUgZm9yCiAgICAgICAgLy8gZWxpbWluYXRpb24uCiAgICAgICAgaWYgKCFpZGVudGljYWwoaW5wdXQsIGNhbmRpZGF0ZSkgJiYgIWlkZW50aWNhbChpbnB1dCwgcGhpKSkgewogICAgICAgICAgY2FuZGlkYXRlID0gbnVsbDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gSWYgdGhlIGlucHV0cyBhcmUgbm90IHRoZSBzYW1lLCBjb250aW51ZS4KICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgIC8vIEJlY2F1c2Ugd2UncmUgdXBkYXRpbmcgdGhlIHVzZXJzIG9mIHRoaXMgcGhpLCB3ZSBtYXkgaGF2ZSBuZXcKICAgICAgLy8gcGhpcyBjYW5kaWRhdGUgZm9yIGVsaW1pbmF0aW9uLiBBZGQgcGhpcyB0aGF0IHVzZWQgdGhpcyBwaGkKICAgICAgLy8gdG8gdGhlIHdvcmtsaXN0LgogICAgICBmb3IgKGZpbmFsIHVzZXIgaW4gcGhpLnVzZWRCeSkgewogICAgICAgIGlmICh1c2VyIGlzIEhQaGkpIHdvcmtsaXN0LmFkZCh1c2VyKTsKICAgICAgfQogICAgICBwaGkuYmxvY2sucmV3cml0ZShwaGksIGNhbmRpZGF0ZSk7CiAgICAgIHBoaS5ibG9jay5yZW1vdmVQaGkocGhpKTsKICAgICAgaWYgKGNhbmRpZGF0ZS5zb3VyY2VFbGVtZW50ID09IG51bGwgJiYKICAgICAgICAgIHBoaS5zb3VyY2VFbGVtZW50ICE9IG51bGwgJiYKICAgICAgICAgIGNhbmRpZGF0ZSBpcyEgSFRoaXMpIHsKICAgICAgICBjYW5kaWRhdGUuc291cmNlRWxlbWVudCA9IHBoaS5zb3VyY2VFbGVtZW50OwogICAgICB9CiAgICB9CiAgfQp9CgpjbGFzcyBHdm5Xb3JrSXRlbSB7CiAgZmluYWwgSEJhc2ljQmxvY2sgYmxvY2s7CiAgZmluYWwgVmFsdWVTZXQgdmFsdWVTZXQ7CiAgR3ZuV29ya0l0ZW0odGhpcy5ibG9jaywgdGhpcy52YWx1ZVNldCk7Cn0KCmNsYXNzIFNzYUdsb2JhbFZhbHVlTnVtYmVyZXIgaW1wbGVtZW50cyBPcHRpbWl6YXRpb25QaGFzZSB7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZURvbWFpbiBfYWJzdHJhY3RWYWx1ZURvbWFpbjsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICJTc2FHbG9iYWxWYWx1ZU51bWJlcmVyIjsKICBmaW5hbCBTZXQ8aW50PiB2aXNpdGVkOwoKICBMaXN0PGludD4gYmxvY2tDaGFuZ2VzRmxhZ3M7CiAgTGlzdDxpbnQ+IGxvb3BDaGFuZ2VzRmxhZ3M7CgogIFNzYUdsb2JhbFZhbHVlTnVtYmVyZXIodGhpcy5fYWJzdHJhY3RWYWx1ZURvbWFpbikgOiB2aXNpdGVkID0gbmV3IFNldDxpbnQ+KCk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRHcmFwaChIR3JhcGggZ3JhcGgpIHsKICAgIGNvbXB1dGVDaGFuZ2VzRmxhZ3MoZ3JhcGgpOwogICAgbW92ZUxvb3BJbnZhcmlhbnRDb2RlKGdyYXBoKTsKICAgIExpc3Q8R3ZuV29ya0l0ZW0+IHdvcmtRdWV1ZSA9IDxHdm5Xb3JrSXRlbT5bCiAgICAgIG5ldyBHdm5Xb3JrSXRlbShncmFwaC5lbnRyeSwgbmV3IFZhbHVlU2V0KCkpCiAgICBdOwogICAgZG8gewogICAgICBHdm5Xb3JrSXRlbSBpdGVtID0gd29ya1F1ZXVlLnJlbW92ZUxhc3QoKTsKICAgICAgdmlzaXRCYXNpY0Jsb2NrKGl0ZW0uYmxvY2ssIGl0ZW0udmFsdWVTZXQsIHdvcmtRdWV1ZSk7CiAgICB9IHdoaWxlICghd29ya1F1ZXVlLmlzRW1wdHkpOwogIH0KCiAgdm9pZCBtb3ZlTG9vcEludmFyaWFudENvZGUoSEdyYXBoIGdyYXBoKSB7CiAgICBmb3IgKGludCBpID0gZ3JhcGguYmxvY2tzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIEhCYXNpY0Jsb2NrIGJsb2NrID0gZ3JhcGguYmxvY2tzW2ldOwogICAgICBpZiAoYmxvY2suaXNMb29wSGVhZGVyKCkpIHsKICAgICAgICBpbnQgY2hhbmdlc0ZsYWdzID0gbG9vcENoYW5nZXNGbGFnc1tibG9jay5pZF07CiAgICAgICAgSExvb3BJbmZvcm1hdGlvbiBpbmZvID0gYmxvY2subG9vcEluZm9ybWF0aW9uOwogICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgYmxvY2tzIG9mIHRoaXMgbG9vcC4gTm90ZSB0aGF0IGJsb2NrcyBpbgogICAgICAgIC8vIGlubmVyIGxvb3BzIGFyZSBub3QgdmlzaXRlZCBoZXJlLCBidXQgd2Uga25vdyB0aGV5CiAgICAgICAgLy8gd2VyZSB2aXNpdGVkIGJlZm9yZSBiZWNhdXNlIHdlIGFyZSBpdGVyYXRpbmcgaW4gcG9zdC1vcmRlci4KICAgICAgICAvLyBTbyBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgR1ZOJ2VkIGluIGFuIGlubmVyIGxvb3AgYXJlIGluIHRoZWlyCiAgICAgICAgLy8gbG9vcCBlbnRyeSwgYW5kIFtpbmZvLmJsb2Nrc10gY29udGFpbnMgdGhpcyBsb29wIGVudHJ5LgogICAgICAgIG1vdmVMb29wSW52YXJpYW50Q29kZUZyb21CbG9jayhibG9jaywgYmxvY2ssIGNoYW5nZXNGbGFncyk7CiAgICAgICAgZm9yIChIQmFzaWNCbG9jayBvdGhlciBpbiBpbmZvLmJsb2NrcykgewogICAgICAgICAgbW92ZUxvb3BJbnZhcmlhbnRDb2RlRnJvbUJsb2NrKG90aGVyLCBibG9jaywgY2hhbmdlc0ZsYWdzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgbW92ZUxvb3BJbnZhcmlhbnRDb2RlRnJvbUJsb2NrKAogICAgICBIQmFzaWNCbG9jayBibG9jaywgSEJhc2ljQmxvY2sgbG9vcEhlYWRlciwgaW50IGNoYW5nZXNGbGFncykgewogICAgYXNzZXJ0KGJsb2NrLnBhcmVudExvb3BIZWFkZXIgPT0gbG9vcEhlYWRlciB8fCBibG9jayA9PSBsb29wSGVhZGVyKTsKICAgIEhCYXNpY0Jsb2NrIHByZWhlYWRlciA9IGxvb3BIZWFkZXIucHJlZGVjZXNzb3JzWzBdOwogICAgaW50IGRlcGVuZHNGbGFncyA9IFNpZGVFZmZlY3RzLmNvbXB1dGVEZXBlbmRzT25GbGFncyhjaGFuZ2VzRmxhZ3MpOwogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gYmxvY2suZmlyc3Q7CiAgICBib29sIGlzTG9vcEFsd2F5c1Rha2VuKCkgewogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBsb29wSGVhZGVyLmxhc3Q7CiAgICAgIGFzc2VydChpbnN0cnVjdGlvbiBpcyBIR290byB8fCBpbnN0cnVjdGlvbiBpcyBITG9vcEJyYW5jaCk7CiAgICAgIHJldHVybiBpbnN0cnVjdGlvbiBpcyBIR290byB8fCBpbnN0cnVjdGlvbi5pbnB1dHNbMF0uaXNDb25zdGFudFRydWUoKTsKICAgIH0KCiAgICBib29sIGZpcnN0SW5zdHJ1Y3Rpb25Jbkxvb3AgPSBibG9jayA9PSBsb29wSGVhZGVyCiAgICAgICAgLy8gQ29tcGVuc2F0ZSBmb3IgbGFjayBvZiBjb2RlIG1vdGlvbi4KICAgICAgICB8fAogICAgICAgIChibG9ja0NoYW5nZXNGbGFnc1tsb29wSGVhZGVyLmlkXSA9PSAwICYmCiAgICAgICAgICAgIGlzTG9vcEFsd2F5c1Rha2VuKCkgJiYKICAgICAgICAgICAgbG9vcEhlYWRlci5zdWNjZXNzb3JzWzBdID09IGJsb2NrKTsKICAgIHdoaWxlIChpbnN0cnVjdGlvbiAhPSBudWxsKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBuZXh0ID0gaW5zdHJ1Y3Rpb24ubmV4dDsKICAgICAgaWYgKGluc3RydWN0aW9uLnVzZUd2bigpICYmCiAgICAgICAgICBpbnN0cnVjdGlvbi5pc01vdmFibGUgJiYKICAgICAgICAgICghaW5zdHJ1Y3Rpb24uY2FuVGhyb3coX2Fic3RyYWN0VmFsdWVEb21haW4pIHx8CiAgICAgICAgICAgICAgZmlyc3RJbnN0cnVjdGlvbkluTG9vcCkgJiYKICAgICAgICAgICFpbnN0cnVjdGlvbi5zaWRlRWZmZWN0cy5kZXBlbmRzT24oZGVwZW5kc0ZsYWdzKSkgewogICAgICAgIGJvb2wgbG9vcEludmFyaWFudElucHV0cyA9IHRydWU7CiAgICAgICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IGluc3RydWN0aW9uLmlucHV0czsKICAgICAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gaW5wdXRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoaXNJbnB1dERlZmluZWRBZnRlckRvbWluYXRvcihpbnB1dHNbaV0sIHByZWhlYWRlcikpIHsKICAgICAgICAgICAgbG9vcEludmFyaWFudElucHV0cyA9IGZhbHNlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIElmIHRoZSBpbnB1dHMgYXJlIGxvb3AgaW52YXJpYW50LCB3ZSBjYW4gbW92ZSB0aGUKICAgICAgICAvLyBpbnN0cnVjdGlvbiBmcm9tIHRoZSBjdXJyZW50IGJsb2NrIHRvIHRoZSBwcmUtaGVhZGVyIGJsb2NrLgogICAgICAgIGlmIChsb29wSW52YXJpYW50SW5wdXRzKSB7CiAgICAgICAgICBibG9jay5kZXRhY2goaW5zdHJ1Y3Rpb24pOwogICAgICAgICAgcHJlaGVhZGVyLm1vdmVBdEV4aXQoaW5zdHJ1Y3Rpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmaXJzdEluc3RydWN0aW9uSW5Mb29wID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIGludCBvbGRDaGFuZ2VzRmxhZ3MgPSBjaGFuZ2VzRmxhZ3M7CiAgICAgIGNoYW5nZXNGbGFncyB8PSBpbnN0cnVjdGlvbi5zaWRlRWZmZWN0cy5nZXRDaGFuZ2VzRmxhZ3MoKTsKICAgICAgaWYgKG9sZENoYW5nZXNGbGFncyAhPSBjaGFuZ2VzRmxhZ3MpIHsKICAgICAgICBkZXBlbmRzRmxhZ3MgPSBTaWRlRWZmZWN0cy5jb21wdXRlRGVwZW5kc09uRmxhZ3MoY2hhbmdlc0ZsYWdzKTsKICAgICAgfQogICAgICBpbnN0cnVjdGlvbiA9IG5leHQ7CiAgICB9CiAgfQoKICBib29sIGlzSW5wdXREZWZpbmVkQWZ0ZXJEb21pbmF0b3IoSEluc3RydWN0aW9uIGlucHV0LCBIQmFzaWNCbG9jayBkb21pbmF0b3IpIHsKICAgIHJldHVybiBpbnB1dC5ibG9jay5pZCA+IGRvbWluYXRvci5pZDsKICB9CgogIHZvaWQgdmlzaXRCYXNpY0Jsb2NrKAogICAgICBIQmFzaWNCbG9jayBibG9jaywgVmFsdWVTZXQgdmFsdWVzLCBMaXN0PEd2bldvcmtJdGVtPiB3b3JrUXVldWUpIHsKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IGJsb2NrLmZpcnN0OwogICAgaWYgKGJsb2NrLmlzTG9vcEhlYWRlcigpKSB7CiAgICAgIGludCBmbGFncyA9IGxvb3BDaGFuZ2VzRmxhZ3NbYmxvY2suaWRdOwogICAgICB2YWx1ZXMua2lsbChmbGFncyk7CiAgICB9CiAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICBISW5zdHJ1Y3Rpb24gbmV4dCA9IGluc3RydWN0aW9uLm5leHQ7CiAgICAgIGludCBmbGFncyA9IGluc3RydWN0aW9uLnNpZGVFZmZlY3RzLmdldENoYW5nZXNGbGFncygpOwogICAgICBhc3NlcnQoZmxhZ3MgPT0gMCB8fCAhaW5zdHJ1Y3Rpb24udXNlR3ZuKCkpOwogICAgICB2YWx1ZXMua2lsbChmbGFncyk7CiAgICAgIGlmIChpbnN0cnVjdGlvbi51c2VHdm4oKSkgewogICAgICAgIEhJbnN0cnVjdGlvbiBvdGhlciA9IHZhbHVlcy5sb29rdXAoaW5zdHJ1Y3Rpb24pOwogICAgICAgIGlmIChvdGhlciAhPSBudWxsKSB7CiAgICAgICAgICBhc3NlcnQob3RoZXIuZ3ZuRXF1YWxzKGluc3RydWN0aW9uKSAmJiBpbnN0cnVjdGlvbi5ndm5FcXVhbHMob3RoZXIpKTsKICAgICAgICAgIGJsb2NrLnJld3JpdGVXaXRoQmV0dGVyVXNlcihpbnN0cnVjdGlvbiwgb3RoZXIpOwogICAgICAgICAgYmxvY2sucmVtb3ZlKGluc3RydWN0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFsdWVzLmFkZChpbnN0cnVjdGlvbik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGluc3RydWN0aW9uID0gbmV4dDsKICAgIH0KCiAgICBMaXN0PEhCYXNpY0Jsb2NrPiBkb21pbmF0ZWRCbG9ja3MgPSBibG9jay5kb21pbmF0ZWRCbG9ja3M7CiAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZG9taW5hdGVkQmxvY2tzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIEhCYXNpY0Jsb2NrIGRvbWluYXRlZCA9IGRvbWluYXRlZEJsb2Nrc1tpXTsKICAgICAgLy8gTm8gbmVlZCB0byBjb3B5IHRoZSB2YWx1ZSBzZXQgZm9yIHRoZSBsYXN0IGNoaWxkLgogICAgICBWYWx1ZVNldCBzdWNjZXNzb3JWYWx1ZXMgPSAoaSA9PSBsZW5ndGggLSAxKSA/IHZhbHVlcyA6IHZhbHVlcy5jb3B5KCk7CiAgICAgIC8vIElmIHdlIGhhdmUgbm8gdmFsdWVzIGluIG91ciBzZXQsIHdlIGRvIG5vdCBoYXZlIHRvIGtpbGwKICAgICAgLy8gYW55dGhpbmcuIEFsc28sIGlmIHRoZSByYW5nZSBvZiBibG9jayBpZHMgZnJvbSB0aGUgY3VycmVudAogICAgICAvLyBibG9jayB0byB0aGUgZG9taW5hdGVkIGJsb2NrIGlzIGVtcHR5LCB0aGVyZSBpcyBubyBibG9ja3Mgb24KICAgICAgLy8gYW55IHBhdGggZnJvbSB0aGUgY3VycmVudCBibG9jayB0byB0aGUgZG9taW5hdGVkIGJsb2NrIHNvIHdlCiAgICAgIC8vIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgZWl0aGVyLgogICAgICBhc3NlcnQoYmxvY2suaWQgPCBkb21pbmF0ZWQuaWQpOwogICAgICBpZiAoIXN1Y2Nlc3NvclZhbHVlcy5pc0VtcHR5ICYmIGJsb2NrLmlkICsgMSA8IGRvbWluYXRlZC5pZCkgewogICAgICAgIHZpc2l0ZWQuY2xlYXIoKTsKICAgICAgICBMaXN0PEhCYXNpY0Jsb2NrPiB3b3JrUXVldWUgPSA8SEJhc2ljQmxvY2s+W2RvbWluYXRlZF07CiAgICAgICAgaW50IGNoYW5nZXNGbGFncyA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgSEJhc2ljQmxvY2sgY3VycmVudCA9IHdvcmtRdWV1ZS5yZW1vdmVMYXN0KCk7CiAgICAgICAgICBjaGFuZ2VzRmxhZ3MgfD0KICAgICAgICAgICAgICBnZXRDaGFuZ2VzRmxhZ3NGb3JEb21pbmF0ZWRCbG9jayhibG9jaywgY3VycmVudCwgd29ya1F1ZXVlKTsKICAgICAgICB9IHdoaWxlICghd29ya1F1ZXVlLmlzRW1wdHkpOwogICAgICAgIHN1Y2Nlc3NvclZhbHVlcy5raWxsKGNoYW5nZXNGbGFncyk7CiAgICAgIH0KICAgICAgd29ya1F1ZXVlLmFkZChuZXcgR3ZuV29ya0l0ZW0oZG9taW5hdGVkLCBzdWNjZXNzb3JWYWx1ZXMpKTsKICAgIH0KICB9CgogIHZvaWQgY29tcHV0ZUNoYW5nZXNGbGFncyhIR3JhcGggZ3JhcGgpIHsKICAgIC8vIENyZWF0ZSB0aGUgY2hhbmdlcyBmbGFncyBsaXN0cy4gTWFrZSBzdXJlIHRvIGluaXRpYWxpemUgdGhlCiAgICAvLyBsb29wIGNoYW5nZXMgZmxhZ3MgbGlzdCB0byB6ZXJvIHNvIHdlIGNhbiB1c2UgYml0d2lzZSBvciB3aGVuCiAgICAvLyBwcm9wYWdhdGluZyBsb29wIGNoYW5nZXMgdXB3YXJkcy4KICAgIGZpbmFsIGludCBsZW5ndGggPSBncmFwaC5ibG9ja3MubGVuZ3RoOwogICAgYmxvY2tDaGFuZ2VzRmxhZ3MgPSBuZXcgTGlzdDxpbnQ+KGxlbmd0aCk7CiAgICBsb29wQ2hhbmdlc0ZsYWdzID0gbmV3IExpc3Q8aW50PihsZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgbG9vcENoYW5nZXNGbGFnc1tpXSA9IDA7CgogICAgLy8gUnVuIHRocm91Z2ggYWxsIHRoZSBiYXNpYyBibG9ja3MgaW4gdGhlIGdyYXBoIGFuZCBmaWxsIGluIHRoZQogICAgLy8gY2hhbmdlcyBmbGFncyBsaXN0cy4KICAgIGZvciAoaW50IGkgPSBsZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICBmaW5hbCBIQmFzaWNCbG9jayBibG9jayA9IGdyYXBoLmJsb2Nrc1tpXTsKICAgICAgZmluYWwgaW50IGlkID0gYmxvY2suaWQ7CgogICAgICAvLyBDb21wdXRlIGJsb2NrIGNoYW5nZXMgZmxhZ3MgZm9yIHRoZSBibG9jay4KICAgICAgaW50IGNoYW5nZXNGbGFncyA9IDA7CiAgICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IGJsb2NrLmZpcnN0OwogICAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICAgIGNoYW5nZXNGbGFncyB8PSBpbnN0cnVjdGlvbi5zaWRlRWZmZWN0cy5nZXRDaGFuZ2VzRmxhZ3MoKTsKICAgICAgICBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLm5leHQ7CiAgICAgIH0KICAgICAgYXNzZXJ0KGJsb2NrQ2hhbmdlc0ZsYWdzW2lkXSA9PSBudWxsKTsKICAgICAgYmxvY2tDaGFuZ2VzRmxhZ3NbaWRdID0gY2hhbmdlc0ZsYWdzOwoKICAgICAgLy8gTG9vcCBoZWFkZXJzIGFyZSBwYXJ0IG9mIHRoZWlyIGxvb3AsIHNvIHVwZGF0ZSB0aGUgbG9vcAogICAgICAvLyBjaGFuZ2VzIGZsYWdzIGFjY29yZGluZ2x5LgogICAgICBpZiAoYmxvY2suaXNMb29wSGVhZGVyKCkpIHsKICAgICAgICBsb29wQ2hhbmdlc0ZsYWdzW2lkXSB8PSBjaGFuZ2VzRmxhZ3M7CiAgICAgIH0KCiAgICAgIC8vIFByb3BhZ2F0ZSBsb29wIGNoYW5nZXMgZmxhZ3MgdXB3YXJkcy4KICAgICAgSEJhc2ljQmxvY2sgcGFyZW50TG9vcEhlYWRlciA9IGJsb2NrLnBhcmVudExvb3BIZWFkZXI7CiAgICAgIGlmIChwYXJlbnRMb29wSGVhZGVyICE9IG51bGwpIHsKICAgICAgICBsb29wQ2hhbmdlc0ZsYWdzW3BhcmVudExvb3BIZWFkZXIuaWRdIHw9CiAgICAgICAgICAgIChibG9jay5pc0xvb3BIZWFkZXIoKSkgPyBsb29wQ2hhbmdlc0ZsYWdzW2lkXSA6IGNoYW5nZXNGbGFnczsKICAgICAgfQogICAgfQogIH0KCiAgaW50IGdldENoYW5nZXNGbGFnc0ZvckRvbWluYXRlZEJsb2NrKEhCYXNpY0Jsb2NrIGRvbWluYXRvciwKICAgICAgSEJhc2ljQmxvY2sgZG9taW5hdGVkLCBMaXN0PEhCYXNpY0Jsb2NrPiB3b3JrUXVldWUpIHsKICAgIGludCBjaGFuZ2VzRmxhZ3MgPSAwOwogICAgTGlzdDxIQmFzaWNCbG9jaz4gcHJlZGVjZXNzb3JzID0gZG9taW5hdGVkLnByZWRlY2Vzc29yczsKICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcmVkZWNlc3NvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgSEJhc2ljQmxvY2sgYmxvY2sgPSBwcmVkZWNlc3NvcnNbaV07CiAgICAgIGludCBpZCA9IGJsb2NrLmlkOwogICAgICAvLyBJZiB0aGUgY3VycmVudCBwcmVkZWNlc3NvciBibG9jayBpcyBvbiB0aGUgcGF0aCBmcm9tIHRoZQogICAgICAvLyBkb21pbmF0b3IgdG8gdGhlIGRvbWluYXRlZCwgaXQgbXVzdCBoYXZlIGFuIGlkIHRoYXQgaXMgaW4gdGhlCiAgICAgIC8vIHJhbmdlIGZyb20gdGhlIGRvbWluYXRvciB0byB0aGUgZG9taW5hdGVkLgogICAgICBpZiAoZG9taW5hdG9yLmlkIDwgaWQgJiYgaWQgPCBkb21pbmF0ZWQuaWQgJiYgIXZpc2l0ZWQuY29udGFpbnMoaWQpKSB7CiAgICAgICAgdmlzaXRlZC5hZGQoaWQpOwogICAgICAgIGNoYW5nZXNGbGFncyB8PSBibG9ja0NoYW5nZXNGbGFnc1tpZF07CiAgICAgICAgLy8gTG9vcCBib2RpZXMgbWlnaHQgbm90IGJlIG9uIHRoZSBwYXRoIGZyb20gZG9taW5hdG9yIHRvIGRvbWluYXRlZCwKICAgICAgICAvLyBidXQgdGhleSBjYW4gaW52YWxpZGF0ZSB2YWx1ZXMuCiAgICAgICAgY2hhbmdlc0ZsYWdzIHw9IGxvb3BDaGFuZ2VzRmxhZ3NbaWRdOwogICAgICAgIHdvcmtRdWV1ZS5hZGQoYmxvY2spOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY2hhbmdlc0ZsYWdzOwogIH0KfQoKLy8gVGhpcyBwaGFzZSBtZXJnZXMgZXF1aXZhbGVudCBpbnN0cnVjdGlvbnMgb24gZGlmZmVyZW50IHBhdGhzIGludG8KLy8gb25lIGluc3RydWN0aW9uIGluIGEgZG9taW5hdG9yIGJsb2NrLiBJdCBydW5zIHRocm91Z2ggdGhlIGdyYXBoCi8vIHBvc3QgZG9taW5hdG9yIG9yZGVyIGFuZCBjb21wdXRlcyBhIFZhbHVlU2V0IGZvciBlYWNoIGJsb2NrIG9mCi8vIGluc3RydWN0aW9ucyB0aGF0IGNhbiBiZSBtb3ZlZCB0byBhIGRvbWluYXRvciBibG9jay4gVGhlc2UKLy8gaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgb25lcyB0aGF0OgovLyAxKSBjYW4gYmUgdXNlZCBmb3IgR1ZOLCBhbmQKLy8gMikgZG8gbm90IHVzZSBkZWZpbml0aW9ucyBvZiB0aGVpciBvd24gYmxvY2suCi8vCi8vIEEgYmFzaWMgYmxvY2sgbG9va3MgYXQgaXRzIHN1Y2Vzc29ycyBhbmQgZmluZHMgdGhlIGludGVyc2VjdGlvbiBvZgovLyB0aGVzZSBjb21wdXRlZCBWYWx1ZVNldC4gSXQgbW92ZXMgYWxsIGluc3RydWN0aW9ucyBvZiB0aGUKLy8gaW50ZXJzZWN0aW9uIGludG8gaXRzIG93biBsaXN0IG9mIGluc3RydWN0aW9ucy4KY2xhc3MgU3NhQ29kZU1vdGlvbiBleHRlbmRzIEhCYXNlVmlzaXRvciBpbXBsZW1lbnRzIE9wdGltaXphdGlvblBoYXNlIHsKICBmaW5hbCBBYnN0cmFjdFZhbHVlRG9tYWluIF9hYnN0cmFjdFZhbHVlRG9tYWluOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICJTc2FDb2RlTW90aW9uIjsKCiAgYm9vbCBtb3ZlZENvZGUgPSBmYWxzZTsKICBMaXN0PFZhbHVlU2V0PiB2YWx1ZXM7CgogIFNzYUNvZGVNb3Rpb24odGhpcy5fYWJzdHJhY3RWYWx1ZURvbWFpbik7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRHcmFwaChIR3JhcGggZ3JhcGgpIHsKICAgIHZhbHVlcyA9IG5ldyBMaXN0PFZhbHVlU2V0PihncmFwaC5ibG9ja3MubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JhcGguYmxvY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhbHVlc1tncmFwaC5ibG9ja3NbaV0uaWRdID0gbmV3IFZhbHVlU2V0KCk7CiAgICB9CiAgICB2aXNpdFBvc3REb21pbmF0b3JUcmVlKGdyYXBoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCYXNpY0Jsb2NrKEhCYXNpY0Jsb2NrIGJsb2NrKSB7CiAgICBMaXN0PEhCYXNpY0Jsb2NrPiBzdWNjZXNzb3JzID0gYmxvY2suc3VjY2Vzc29yczsKCiAgICAvLyBQaGFzZSAxOiBnZXQgdGhlIFZhbHVlU2V0IG9mIGFsbCBzdWNjZXNzb3JzIChpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSksCiAgICAvLyBjb21wdXRlIHRoZSBpbnRlcnNlY3Rpb24gYW5kIG1vdmUgdGhlIGluc3RydWN0aW9ucyBvZiB0aGUgaW50ZXJzZWN0aW9uCiAgICAvLyBpbnRvIHRoaXMgYmxvY2suCiAgICBpZiAoc3VjY2Vzc29ycy5sZW5ndGggPiAxKSB7CiAgICAgIFZhbHVlU2V0IGluc3RydWN0aW9ucyA9IHZhbHVlc1tzdWNjZXNzb3JzWzBdLmlkXTsKICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzdWNjZXNzb3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgVmFsdWVTZXQgb3RoZXIgPSB2YWx1ZXNbc3VjY2Vzc29yc1tpXS5pZF07CiAgICAgICAgaW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zLmludGVyc2VjdGlvbihvdGhlcik7CiAgICAgIH0KCiAgICAgIGlmICghaW5zdHJ1Y3Rpb25zLmlzRW1wdHkpIHsKICAgICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gbGlzdCA9IGluc3RydWN0aW9ucy50b0xpc3QoKTsKICAgICAgICAvLyBTb3J0IGJ5IGluc3RydWN0aW9uICdpZCcgZm9yIG1vcmUgc3RhYmxlIG9yZGVyaW5nIHVuZGVyIGNoYW5nZXMgdG8KICAgICAgICAvLyB1bnJlbGF0ZWQgc291cmNlIGNvZGUuICdpZCcgaXMgYSBmdW5jdGlvbiBvZiB0aGUgb3BlcmF0aW9ucyBvZgogICAgICAgIC8vIGNvbXBpbGluZyB0aGUgY3VycmVudCBtZXRob2QsIHdoZXJlYXMgdGhlIFZhbHVlU2V0IG9yZGVyIGlzIGRlcGVuZGVudAogICAgICAgIC8vIGhhc2hDb2RlcyB0aGF0IGFyZSBhIGZ1bmN0aW9uIG9mIHRoZSB3aG9sZSBwcm9ncmFtLgogICAgICAgIGxpc3Quc29ydCgoaW5zbjEsIGluc24yKSA9PiBpbnNuMS5pZC5jb21wYXJlVG8oaW5zbjIuaWQpKTsKICAgICAgICBmb3IgKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiBpbiBsaXN0KSB7CiAgICAgICAgICAvLyBNb3ZlIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUgY3VycmVudCBibG9jay4KICAgICAgICAgIGluc3RydWN0aW9uLmJsb2NrLmRldGFjaChpbnN0cnVjdGlvbik7CiAgICAgICAgICBibG9jay5tb3ZlQXRFeGl0KGluc3RydWN0aW9uKTsKICAgICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIHN1Y2Nlc3NvcnMgYW5kIHJld3JpdGUgdGhlaXIgaW5zdHJ1Y3Rpb24KICAgICAgICAgIC8vIHRvIHRoZSBzaGFyZWQgb25lLgogICAgICAgICAgZm9yIChmaW5hbCBzdWNjZXNzb3IgaW4gc3VjY2Vzc29ycykgewogICAgICAgICAgICBISW5zdHJ1Y3Rpb24gdG9SZXdyaXRlID0gdmFsdWVzW3N1Y2Nlc3Nvci5pZF0ubG9va3VwKGluc3RydWN0aW9uKTsKICAgICAgICAgICAgaWYgKHRvUmV3cml0ZSAhPSBpbnN0cnVjdGlvbikgewogICAgICAgICAgICAgIHN1Y2Nlc3Nvci5yZXdyaXRlV2l0aEJldHRlclVzZXIodG9SZXdyaXRlLCBpbnN0cnVjdGlvbik7CiAgICAgICAgICAgICAgc3VjY2Vzc29yLnJlbW92ZSh0b1Jld3JpdGUpOwogICAgICAgICAgICAgIG1vdmVkQ29kZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gVE9ETyhzcmEpOiBUaGVyZSBhcmUgc29tZSBub24tZ3ZuLWFibGUgaW5zdHJ1Y3Rpb25zIHRoYXQgd2UgY291bGQgbW92ZSwKICAgICAgLy8gZS5nLiBhbGxvY2F0aW9ucy4gV2Ugc2hvdWxkIHByb2JhYmx5IG5vdCBtb3ZlIGluc3RydWN0aW9ucyB0aGF0IGNhbgogICAgICAvLyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm93IHNpbmNlIHRoZSByZXBvcnRlZCBsb2NhdGlvbiBtaWdodCBiZSBpbgogICAgICAvLyB0aGUgJ3dyb25nJyBicmFuY2guCiAgICB9CgogICAgLy8gRG9uJ3QgdHJ5IHRvIG1lcmdlIGluc3RydWN0aW9ucyB0byBhIGRvbWluYXRvciBpZiB3ZSBoYXZlCiAgICAvLyBtdWx0aXBsZSBwcmVkZWNlc3NvcnMuCiAgICBpZiAoYmxvY2sucHJlZGVjZXNzb3JzLmxlbmd0aCAhPSAxKSByZXR1cm47CgogICAgLy8gUGhhc2UgMjogR28gdGhyb3VnaCBhbGwgaW5zdHJ1Y3Rpb25zIG9mIHRoaXMgYmxvY2sgYW5kIGZpbmQKICAgIC8vIHdoaWNoIGluc3RydWN0aW9ucyBjYW4gYmUgbW92ZWQgdG8gYSBkb21pbmF0b3IgYmxvY2suCiAgICBWYWx1ZVNldCBzZXRfID0gdmFsdWVzW2Jsb2NrLmlkXTsKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IGJsb2NrLmZpcnN0OwogICAgaW50IGZsYWdzID0gMDsKICAgIHdoaWxlIChpbnN0cnVjdGlvbiAhPSBudWxsKSB7CiAgICAgIGludCBkZXBlbmRzRmxhZ3MgPSBTaWRlRWZmZWN0cy5jb21wdXRlRGVwZW5kc09uRmxhZ3MoZmxhZ3MpOwogICAgICBmbGFncyB8PSBpbnN0cnVjdGlvbi5zaWRlRWZmZWN0cy5nZXRDaGFuZ2VzRmxhZ3MoKTsKCiAgICAgIEhJbnN0cnVjdGlvbiBjdXJyZW50ID0gaW5zdHJ1Y3Rpb247CiAgICAgIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24ubmV4dDsKICAgICAgaWYgKCFjdXJyZW50LnVzZUd2bigpIHx8ICFjdXJyZW50LmlzTW92YWJsZSkgY29udGludWU7CiAgICAgIC8vIFRPRE8oc3JhKTogV2UgY291bGQgbW92ZSB0aHJvd2luZyBpbnN0cnVjdGlvbnMgcHJvdmlkZWQgd2Uga2VlcCB0aGUKICAgICAgLy8gZXhjZXB0aW9ucyBpbiB0aGUgc2FtZSBvcmRlci4gIFRoaXMgcmVxdWlyZXMgdGhleSBhcmUgaW4gdGhlIHNhbWUgb3JkZXIKICAgICAgLy8gaW4gYWxsIHN1Y2Nlc3NvcnMsIHdoaWNoIGlzIG5vdCB0cmFja2VkIGJ5IHRoZSBWYWx1ZVNldC4KICAgICAgaWYgKGN1cnJlbnQuY2FuVGhyb3coX2Fic3RyYWN0VmFsdWVEb21haW4pKSBjb250aW51ZTsKICAgICAgaWYgKGN1cnJlbnQuc2lkZUVmZmVjdHMuZGVwZW5kc09uKGRlcGVuZHNGbGFncykpIGNvbnRpbnVlOwoKICAgICAgYm9vbCBjYW5CZU1vdmVkID0gdHJ1ZTsKICAgICAgZm9yIChmaW5hbCBISW5zdHJ1Y3Rpb24gaW5wdXQgaW4gY3VycmVudC5pbnB1dHMpIHsKICAgICAgICBpZiAoaW5wdXQuYmxvY2sgPT0gYmxvY2spIHsKICAgICAgICAgIGNhbkJlTW92ZWQgPSBmYWxzZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgICAgLy8gVE9ETyhzcmEpOiBXZSBjb3VsZCBtb3ZlIHRyZWVzIG9mIGluc3RydWN0aW9ucyBwcm92aWRlZCB3ZSBtb3ZlIHRoZQogICAgICAgICAgLy8gcm9vdHMgYmVmb3JlIHRoZSBsZWF2ZXMuCiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghY2FuQmVNb3ZlZCkgY29udGludWU7CgogICAgICBISW5zdHJ1Y3Rpb24gZXhpc3RpbmcgPSBzZXRfLmxvb2t1cChjdXJyZW50KTsKICAgICAgaWYgKGV4aXN0aW5nID09IG51bGwpIHsKICAgICAgICBzZXRfLmFkZChjdXJyZW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBibG9jay5yZXdyaXRlV2l0aEJldHRlclVzZXIoY3VycmVudCwgZXhpc3RpbmcpOwogICAgICAgIGJsb2NrLnJlbW92ZShjdXJyZW50KTsKICAgICAgICBtb3ZlZENvZGUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQp9CgpjbGFzcyBTc2FUeXBlQ29udmVyc2lvbkluc2VydGVyIGV4dGVuZHMgSEJhc2VWaXNpdG9yCiAgICBpbXBsZW1lbnRzIE9wdGltaXphdGlvblBoYXNlIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZSA9ICJTc2FUeXBlY29udmVyc2lvbkluc2VydGVyIjsKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CgogIFNzYVR5cGVDb252ZXJzaW9uSW5zZXJ0ZXIodGhpcy5jbG9zZWRXb3JsZCk7CgogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IF9hYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRHcmFwaChIR3JhcGggZ3JhcGgpIHsKICAgIHZpc2l0RG9taW5hdG9yVHJlZShncmFwaCk7CiAgfQoKICAvLyBVcGRhdGUgdXNlcnMgb2YgW2lucHV0XSB0aGF0IGFyZSBkb21pbmF0ZWQgYnkgWzpkb21pbmF0b3IuZmlyc3Q6XQogIC8vIHRvIHVzZSBbVHlwZUtub3duXSBvZiBbaW5wdXRdIGluc3RlYWQuIEFzIHRoZSB0eXBlIGluZm9ybWF0aW9uIGRlcGVuZHMKICAvLyBvbiB0aGUgY29udHJvbCBmbG93LCB3ZSBtYXJrIHRoZSBpbnNlcnRlZCBbSFR5cGVLbm93bl0gbm9kZXMgYXMKICAvLyBub24tbW92YWJsZS4KICB2b2lkIGluc2VydFR5cGVQcm9wYWdhdGlvbkZvckRvbWluYXRlZFVzZXJzKAogICAgICBIQmFzaWNCbG9jayBkb21pbmF0b3IsIEhJbnN0cnVjdGlvbiBpbnB1dCwgQWJzdHJhY3RWYWx1ZSBjb252ZXJ0ZWRUeXBlKSB7CiAgICBEb21pbmF0ZWRVc2VzIGRvbWluYXRlZFVzZXMgPSBEb21pbmF0ZWRVc2VzLm9mKGlucHV0LCBkb21pbmF0b3IuZmlyc3QpOwogICAgaWYgKGRvbWluYXRlZFVzZXMuaXNFbXB0eSkgcmV0dXJuOwoKICAgIC8vIENoZWNrIHRvIGF2b2lkIGFkZGluZyBhIGR1cGxpY2F0ZSBIVHlwZUtub3duIG5vZGUuCiAgICBpZiAoZG9taW5hdGVkVXNlcy5pc1NpbmdsZXRvbikgewogICAgICBISW5zdHJ1Y3Rpb24gdXNlciA9IGRvbWluYXRlZFVzZXMuc2luZ2xlOwogICAgICBpZiAodXNlciBpcyBIVHlwZUtub3duICYmCiAgICAgICAgICB1c2VyLmlzUGlubmVkICYmCiAgICAgICAgICB1c2VyLmtub3duVHlwZSA9PSBjb252ZXJ0ZWRUeXBlICYmCiAgICAgICAgICB1c2VyLmNoZWNrZWRJbnB1dCA9PSBpbnB1dCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIEhUeXBlS25vd24gbmV3SW5wdXQgPSBuZXcgSFR5cGVLbm93bi5waW5uZWQoY29udmVydGVkVHlwZSwgaW5wdXQpOwogICAgZG9taW5hdG9yLmFkZEJlZm9yZShkb21pbmF0b3IuZmlyc3QsIG5ld0lucHV0KTsKICAgIGRvbWluYXRlZFVzZXMucmVwbGFjZVdpdGgobmV3SW5wdXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdElzKEhJcyBpbnN0cnVjdGlvbikgewogICAgRGFydFR5cGUgdHlwZSA9IGluc3RydWN0aW9uLnR5cGVFeHByZXNzaW9uOwogICAgaWYgKCFpbnN0cnVjdGlvbi5pc1Jhd0NoZWNrKSB7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAodHlwZS5pc1R5cGVkZWYpIHsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmICh0eXBlLmlzRnV0dXJlT3IpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlID0gdHlwZTsKICAgIENsYXNzRW50aXR5IGNscyA9IGludGVyZmFjZVR5cGUuZWxlbWVudDsKCiAgICBMaXN0PEhCYXNpY0Jsb2NrPiB0cnVlVGFyZ2V0cyA9IDxIQmFzaWNCbG9jaz5bXTsKICAgIExpc3Q8SEJhc2ljQmxvY2s+IGZhbHNlVGFyZ2V0cyA9IDxIQmFzaWNCbG9jaz5bXTsKCiAgICBjb2xsZWN0VGFyZ2V0cyhpbnN0cnVjdGlvbiwgdHJ1ZVRhcmdldHMsIGZhbHNlVGFyZ2V0cyk7CgogICAgaWYgKHRydWVUYXJnZXRzLmlzRW1wdHkgJiYgZmFsc2VUYXJnZXRzLmlzRW1wdHkpIHJldHVybjsKCiAgICBBYnN0cmFjdFZhbHVlIGNvbnZlcnRlZFR5cGUgPQogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxTdWJ0eXBlKGNscyk7CiAgICBISW5zdHJ1Y3Rpb24gaW5wdXQgPSBpbnN0cnVjdGlvbi5leHByZXNzaW9uOwoKICAgIGZvciAoSEJhc2ljQmxvY2sgYmxvY2sgaW4gdHJ1ZVRhcmdldHMpIHsKICAgICAgaW5zZXJ0VHlwZVByb3BhZ2F0aW9uRm9yRG9taW5hdGVkVXNlcnMoYmxvY2ssIGlucHV0LCBjb252ZXJ0ZWRUeXBlKTsKICAgIH0KICAgIC8vIFRPRE8oc3JhKTogQWxzbyBzdHJlbmd0aGVuIHVzZXMgZm9yIHdoZW4gdGhlIGNvbmRpdGlvbiBpcyBrbm93bgogICAgLy8gZmFsc2UuIEF2b2lkIHN0cmVuZ3RoZW5pbmcgdG8gYG51bGxgLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdElkZW50aXR5KEhJZGVudGl0eSBpbnN0cnVjdGlvbikgewogICAgLy8gQXQgSElmKEhJZGVudGl0eSh4LCBudWxsKSkgc3RyZW5ndGhlbnMgeCB0byBub24tbnVsbCBvbiBlbHNlIGJyYW5jaC4KICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24ubGVmdDsKICAgIEhJbnN0cnVjdGlvbiByaWdodCA9IGluc3RydWN0aW9uLnJpZ2h0OwogICAgSEluc3RydWN0aW9uIGlucHV0OwoKICAgIGlmIChsZWZ0LmlzQ29uc3RhbnROdWxsKCkpIHsKICAgICAgaW5wdXQgPSByaWdodDsKICAgIH0gZWxzZSBpZiAocmlnaHQuaXNDb25zdGFudE51bGwoKSkgewogICAgICBpbnB1dCA9IGxlZnQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbChpbnB1dC5pbnN0cnVjdGlvblR5cGUpLmlzRGVmaW5pdGVseUZhbHNlKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBMaXN0PEhCYXNpY0Jsb2NrPiB0cnVlVGFyZ2V0cyA9IDxIQmFzaWNCbG9jaz5bXTsKICAgIExpc3Q8SEJhc2ljQmxvY2s+IGZhbHNlVGFyZ2V0cyA9IDxIQmFzaWNCbG9jaz5bXTsKCiAgICBjb2xsZWN0VGFyZ2V0cyhpbnN0cnVjdGlvbiwgdHJ1ZVRhcmdldHMsIGZhbHNlVGFyZ2V0cyk7CgogICAgaWYgKHRydWVUYXJnZXRzLmlzRW1wdHkgJiYgZmFsc2VUYXJnZXRzLmlzRW1wdHkpIHJldHVybjsKCiAgICBBYnN0cmFjdFZhbHVlIG5vbk51bGxUeXBlID0KICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5leGNsdWRlTnVsbChpbnB1dC5pbnN0cnVjdGlvblR5cGUpOwoKICAgIGZvciAoSEJhc2ljQmxvY2sgYmxvY2sgaW4gZmFsc2VUYXJnZXRzKSB7CiAgICAgIGluc2VydFR5cGVQcm9wYWdhdGlvbkZvckRvbWluYXRlZFVzZXJzKGJsb2NrLCBpbnB1dCwgbm9uTnVsbFR5cGUpOwogICAgfQogICAgLy8gV2UgZG9uJ3Qgc3RyZW5ndGhlbiB0aGUga25vd24tdHJ1ZSByZWZlcmVuY2VzLiBJdCBkb2Vzbid0IGhhcHBlbiBvZnRlbgogICAgLy8gYW5kIHdlIGRvbid0IHdhbnQgImlmICh4PT1udWxsKSByZXR1cm4geDsiIHRvIGNvbnZlcnQgYmV0d2VlbiBKYXZhU2NyaXB0CiAgICAvLyAnbnVsbCcgYW5kICd1bmRlZmluZWQnLgogIH0KCiAgY29sbGVjdFRhcmdldHMoSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBMaXN0PEhCYXNpY0Jsb2NrPiB0cnVlVGFyZ2V0cywKICAgICAgTGlzdDxIQmFzaWNCbG9jaz4gZmFsc2VUYXJnZXRzKSB7CiAgICBmb3IgKEhJbnN0cnVjdGlvbiB1c2VyIGluIGluc3RydWN0aW9uLnVzZWRCeSkgewogICAgICBpZiAodXNlciBpcyBISWYpIHsKICAgICAgICB0cnVlVGFyZ2V0cz8uYWRkKHVzZXIudGhlbkJsb2NrKTsKICAgICAgICBmYWxzZVRhcmdldHM/LmFkZCh1c2VyLmVsc2VCbG9jayk7CiAgICAgIH0gZWxzZSBpZiAodXNlciBpcyBITG9vcEJyYW5jaCkgewogICAgICAgIHRydWVUYXJnZXRzPy5hZGQodXNlci5ibG9jay5zdWNjZXNzb3JzLmZpcnN0KTsKICAgICAgICAvLyBEb24ndCBpbnNlcnQgcmVmaW5lbWVudHMgb24gZWxzZS1icmFuY2ggLSBtYXkgYmUgYSBjcml0aWNhbCBlZGdlCiAgICAgICAgLy8gYmxvY2sgd2hpY2ggd2UgY3VycmVudGx5IG5lZWQgdG8ga2VlcCBlbXB0eSAoZXhjZXB0IGZvciBwaGlzKS4KICAgICAgfSBlbHNlIGlmICh1c2VyIGlzIEhOb3QpIHsKICAgICAgICBjb2xsZWN0VGFyZ2V0cyh1c2VyLCBmYWxzZVRhcmdldHMsIHRydWVUYXJnZXRzKTsKICAgICAgfSBlbHNlIGlmICh1c2VyIGlzIEhQaGkpIHsKICAgICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gdXNlci5pbnB1dHM7CiAgICAgICAgaWYgKGlucHV0cy5sZW5ndGggPT0gMikgewogICAgICAgICAgYXNzZXJ0KGlucHV0cy5jb250YWlucyhpbnN0cnVjdGlvbikpOwogICAgICAgICAgSEluc3RydWN0aW9uIG90aGVyID0gaW5wdXRzWyhpbnB1dHNbMF0gPT0gaW5zdHJ1Y3Rpb24pID8gMSA6IDBdOwogICAgICAgICAgaWYgKG90aGVyLmlzQ29uc3RhbnRUcnVlKCkpIHsKICAgICAgICAgICAgLy8gVGhlIGNvbmRpdGlvbiBmbG93cyB0byBhIEhQaGkodHJ1ZSwgdXNlciksIHdoaWNoIG1lYW5zIHRoYXQgYQogICAgICAgICAgICAvLyBkb3duc3RyZWFtIEhJZiBoYXMgdHJ1ZS1icmFuY2ggY29udHJvbCBmbG93IHRoYXQgZG9lcyBub3QgZGVwZW5kCiAgICAgICAgICAgIC8vIG9uIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbiwgc28gc3RvcCBjb2xsZWN0aW5nIFt0cnVlVGFyZ2V0c10uCiAgICAgICAgICAgIGNvbGxlY3RUYXJnZXRzKHVzZXIsIG51bGwsIGZhbHNlVGFyZ2V0cyk7CiAgICAgICAgICB9IGVsc2UgaWYgKG90aGVyLmlzQ29uc3RhbnRGYWxzZSgpKSB7CiAgICAgICAgICAgIC8vIERpdHRvIGZvciBmYWxzZS4KICAgICAgICAgICAgY29sbGVjdFRhcmdldHModXNlciwgdHJ1ZVRhcmdldHMsIG51bGwpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKLy8vIE9wdGltaXphdGlvbiBwaGFzZSB0aGF0IHRyaWVzIHRvIGVsaW1pbmF0ZSBtZW1vcnkgbG9hZHMgKGZvciBleGFtcGxlCi8vLyBbSEZpZWxkR2V0XSksIHdoZW4gaXQga25vd3MgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGF0IG1lbW9yeSBsb2NhdGlvbiwgYW5kCi8vLyBzdG9yZXMgdGhhdCBvdmVyd3JpdGUgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KY2xhc3MgU3NhTG9hZEVsaW1pbmF0aW9uIGV4dGVuZHMgSEJhc2VWaXNpdG9yIGltcGxlbWVudHMgT3B0aW1pemF0aW9uUGhhc2UgewogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CiAgZmluYWwgSkZpZWxkQW5hbHlzaXMgX2ZpZWxkQW5hbHlzaXM7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIG5hbWUgPSAiU3NhTG9hZEVsaW1pbmF0aW9uIjsKICBNZW1vcnlTZXQgbWVtb3J5U2V0OwogIExpc3Q8TWVtb3J5U2V0PiBtZW1vcmllczsKICBib29sIG5ld0d2bkNhbmRpZGF0ZXMgPSBmYWxzZTsKICBIR3JhcGggX2dyYXBoOwoKICBTc2FMb2FkRWxpbWluYXRpb24odGhpcy5fY2xvc2VkV29ybGQpCiAgICAgIDogX2ZpZWxkQW5hbHlzaXMgPSBfY2xvc2VkV29ybGQuZmllbGRBbmFseXNpczsKCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgX2Fic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgX2Nsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRHcmFwaChIR3JhcGggZ3JhcGgpIHsKICAgIF9ncmFwaCA9IGdyYXBoOwogICAgbWVtb3JpZXMgPSBuZXcgTGlzdDxNZW1vcnlTZXQ+KGdyYXBoLmJsb2Nrcy5sZW5ndGgpOwogICAgTGlzdDxIQmFzaWNCbG9jaz4gYmxvY2tzID0gZ3JhcGguYmxvY2tzOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHsKICAgICAgSEJhc2ljQmxvY2sgYmxvY2sgPSBibG9ja3NbaV07CiAgICAgIHZpc2l0QmFzaWNCbG9jayhibG9jayk7CiAgICAgIGlmIChibG9jay5zdWNjZXNzb3JzLmlzTm90RW1wdHkgJiYgYmxvY2suc3VjY2Vzc29yc1swXS5pc0xvb3BIZWFkZXIoKSkgewogICAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZGluZyBibG9jayBvZiBhIGxvb3AuIEl0ZXJhdGUgb3ZlciB0aGUKICAgICAgICAvLyBibG9ja3Mgb2YgdGhlIGxvb3AgYWdhaW4gdG8gdGFrZSB2YWx1ZXMgdGhhdCBmbG93IGZyb20gdGhhdAogICAgICAgIC8vIGVuZGluZyBibG9jayBpbnRvIGFjY291bnQuCiAgICAgICAgZm9yIChpbnQgaiA9IGJsb2NrLnN1Y2Nlc3NvcnNbMF0uaWQ7IGogPD0gYmxvY2suaWQ7IGorKykgewogICAgICAgICAgdmlzaXRCYXNpY0Jsb2NrKGJsb2Nrc1tqXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgaWYgKGJsb2NrLnByZWRlY2Vzc29ycy5sZW5ndGggPT0gMCkgewogICAgICAvLyBFbnRyeSBibG9jay4KICAgICAgbWVtb3J5U2V0ID0gbmV3IE1lbW9yeVNldChfY2xvc2VkV29ybGQpOwogICAgfSBlbHNlIGlmIChibG9jay5wcmVkZWNlc3NvcnMubGVuZ3RoID09IDEgJiYKICAgICAgICBibG9jay5wcmVkZWNlc3NvcnNbMF0uc3VjY2Vzc29ycy5sZW5ndGggPT0gMSkgewogICAgICAvLyBObyBuZWVkIHRvIGNsb25lLCB0aGVyZSBpcyBubyBvdGhlciBzdWNjZXNzb3IgZm9yCiAgICAgIC8vIGBibG9jay5wcmVkZWNlc3NvcnNbMF1gLCBhbmQgdGhpcyBibG9jayBoYXMgb25seSBvbmUKICAgICAgLy8gcHJlZGVjZXNzb3IuIFNpbmNlIHdlIGFyZSBub3QgZ29pbmcgdG8gdmlzaXQKICAgICAgLy8gYGJsb2NrLnByZWRlY2Vzc29yc1swXWAgYWdhaW4sIHdlIGNhbiBqdXN0IHJlLXVzZSBpdHMKICAgICAgLy8gW21lbW9yeVNldF0uCiAgICAgIG1lbW9yeVNldCA9IG1lbW9yaWVzW2Jsb2NrLnByZWRlY2Vzc29yc1swXS5pZF07CiAgICB9IGVsc2UgaWYgKGJsb2NrLnByZWRlY2Vzc29ycy5sZW5ndGggPT0gMSkgewogICAgICAvLyBDbG9uZSB0aGUgbWVtb3J5U2V0IG9mIHRoZSBwcmVkZWNlc3NvciwgYmVjYXVzZSBpdCBpcyBhbHNvIHVzZWQKICAgICAgLy8gYnkgb3RoZXIgc3VjY2Vzc29ycyBvZiBpdC4KICAgICAgbWVtb3J5U2V0ID0gbWVtb3JpZXNbYmxvY2sucHJlZGVjZXNzb3JzWzBdLmlkXS5jbG9uZSgpOwogICAgfSBlbHNlIHsKICAgICAgLy8gQ29tcHV0ZSB0aGUgaW50ZXJzZWN0aW9uIG9mIGFsbCBwcmVkZWNlc3NvcnMuCiAgICAgIG1lbW9yeVNldCA9IG1lbW9yaWVzW2Jsb2NrLnByZWRlY2Vzc29yc1swXS5pZF07CiAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYmxvY2sucHJlZGVjZXNzb3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbWVtb3J5U2V0ID0gbWVtb3J5U2V0LmludGVyc2VjdGlvbkZvcigKICAgICAgICAgICAgbWVtb3JpZXNbYmxvY2sucHJlZGVjZXNzb3JzW2ldLmlkXSwgYmxvY2ssIGkpOwogICAgICB9CiAgICB9CgogICAgbWVtb3JpZXNbYmxvY2suaWRdID0gbWVtb3J5U2V0OwogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gYmxvY2suZmlyc3Q7CiAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICBISW5zdHJ1Y3Rpb24gbmV4dCA9IGluc3RydWN0aW9uLm5leHQ7CiAgICAgIGluc3RydWN0aW9uLmFjY2VwdCh0aGlzKTsKICAgICAgaW5zdHJ1Y3Rpb24gPSBuZXh0OwogICAgfQogIH0KCiAgdm9pZCBjaGVja05ld0d2bkNhbmRpZGF0ZXMoSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBISW5zdHJ1Y3Rpb24gZXhpc3RpbmcpIHsKICAgIGlmIChuZXdHdm5DYW5kaWRhdGVzKSByZXR1cm47CiAgICBib29sIGhhc1VzZUd2bihISW5zdHJ1Y3Rpb24gaW5zbikgPT4gaW5zbi5ub25DaGVjaygpLnVzZUd2bigpOwogICAgaWYgKGluc3RydWN0aW9uLnVzZWRCeS5hbnkoaGFzVXNlR3ZuKSAmJiBleGlzdGluZy51c2VkQnkuYW55KGhhc1VzZUd2bikpIHsKICAgICAgbmV3R3ZuQ2FuZGlkYXRlcyA9IHRydWU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RmllbGRHZXQoSEZpZWxkR2V0IGluc3RydWN0aW9uKSB7CiAgICBpZiAoaW5zdHJ1Y3Rpb24uaXNOdWxsQ2hlY2spIHJldHVybjsKICAgIEZpZWxkRW50aXR5IGVsZW1lbnQgPSBpbnN0cnVjdGlvbi5lbGVtZW50OwogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0KICAgICAgICBpbnN0cnVjdGlvbi5nZXREYXJ0UmVjZWl2ZXIoX2Nsb3NlZFdvcmxkKS5ub25DaGVjaygpOwogICAgX3Zpc2l0RmllbGRHZXQoZWxlbWVudCwgcmVjZWl2ZXIsIGluc3RydWN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRHZXRMZW5ndGgoSEdldExlbmd0aCBpbnN0cnVjdGlvbikgewogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyID0gaW5zdHJ1Y3Rpb24ucmVjZWl2ZXIubm9uQ2hlY2soKTsKICAgIEhJbnN0cnVjdGlvbiBleGlzdGluZyA9CiAgICAgICAgbWVtb3J5U2V0Lmxvb2t1cEZpZWxkVmFsdWUoTWVtb3J5RmVhdHVyZS5sZW5ndGgsIHJlY2VpdmVyKTsKICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgIGNoZWNrTmV3R3ZuQ2FuZGlkYXRlcyhpbnN0cnVjdGlvbiwgZXhpc3RpbmcpOwogICAgICBpbnN0cnVjdGlvbi5ibG9jay5yZXdyaXRlV2l0aEJldHRlclVzZXIoaW5zdHJ1Y3Rpb24sIGV4aXN0aW5nKTsKICAgICAgaW5zdHJ1Y3Rpb24uYmxvY2sucmVtb3ZlKGluc3RydWN0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIG1lbW9yeVNldC5yZWdpc3RlckZpZWxkVmFsdWUoTWVtb3J5RmVhdHVyZS5sZW5ndGgsIHJlY2VpdmVyLCBpbnN0cnVjdGlvbik7CiAgICB9CiAgfQoKICB2b2lkIF92aXNpdEZpZWxkR2V0KAogICAgICBGaWVsZEVudGl0eSBlbGVtZW50LCBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgSEluc3RydWN0aW9uIGV4aXN0aW5nID0gbWVtb3J5U2V0Lmxvb2t1cEZpZWxkVmFsdWUoZWxlbWVudCwgcmVjZWl2ZXIpOwogICAgaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKICAgICAgY2hlY2tOZXdHdm5DYW5kaWRhdGVzKGluc3RydWN0aW9uLCBleGlzdGluZyk7CiAgICAgIGluc3RydWN0aW9uLmJsb2NrLnJld3JpdGVXaXRoQmV0dGVyVXNlcihpbnN0cnVjdGlvbiwgZXhpc3RpbmcpOwogICAgICBpbnN0cnVjdGlvbi5ibG9jay5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogICAgfSBlbHNlIHsKICAgICAgbWVtb3J5U2V0LnJlZ2lzdGVyRmllbGRWYWx1ZShlbGVtZW50LCByZWNlaXZlciwgaW5zdHJ1Y3Rpb24pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZpZWxkU2V0KEhGaWVsZFNldCBpbnN0cnVjdGlvbikgewogICAgRmllbGRFbnRpdHkgZWxlbWVudCA9IGluc3RydWN0aW9uLmVsZW1lbnQ7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPQogICAgICAgIGluc3RydWN0aW9uLmdldERhcnRSZWNlaXZlcihfY2xvc2VkV29ybGQpLm5vbkNoZWNrKCk7CiAgICBpZiAobWVtb3J5U2V0LnJlZ2lzdGVyRmllbGRWYWx1ZVVwZGF0ZSgKICAgICAgICBlbGVtZW50LCByZWNlaXZlciwgaW5zdHJ1Y3Rpb24udmFsdWUpKSB7CiAgICAgIGluc3RydWN0aW9uLmJsb2NrLnJlbW92ZShpbnN0cnVjdGlvbik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q3JlYXRlKEhDcmVhdGUgaW5zdHJ1Y3Rpb24pIHsKICAgIG1lbW9yeVNldC5yZWdpc3RlckFsbG9jYXRpb24oaW5zdHJ1Y3Rpb24pOwogICAgaWYgKHNob3VsZFRyYWNrSW5pdGlhbFZhbHVlcyhpbnN0cnVjdGlvbikpIHsKICAgICAgaW50IGFyZ3VtZW50SW5kZXggPSAwOwogICAgICBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50LmZvckVhY2hJbnN0YW5jZUZpZWxkKGluc3RydWN0aW9uLmVsZW1lbnQsCiAgICAgICAgICAoXywgRmllbGRFbnRpdHkgbWVtYmVyKSB7CiAgICAgICAgRmllbGRBbmFseXNpc0RhdGEgZmllbGREYXRhID0gX2ZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKG1lbWJlcik7CiAgICAgICAgaWYgKGZpZWxkRGF0YS5pc0VsaWRlZCkgcmV0dXJuOwogICAgICAgIGlmIChmaWVsZERhdGEuaXNJbml0aWFsaXplZEluQWxsb2NhdG9yKSB7CiAgICAgICAgICAvLyBUT0RPKHNyYSk6IENhbiB3ZSBhdm9pZCBjYWxsaW5nIEhHcmFwaC5hZGRDb25zdGFudD8KICAgICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBmaWVsZERhdGEuaW5pdGlhbFZhbHVlOwogICAgICAgICAgSENvbnN0YW50IGNvbnN0YW50ID0gX2dyYXBoLmFkZENvbnN0YW50KHZhbHVlLCBfY2xvc2VkV29ybGQpOwogICAgICAgICAgbWVtb3J5U2V0LnJlZ2lzdGVyRmllbGRWYWx1ZShtZW1iZXIsIGluc3RydWN0aW9uLCBjb25zdGFudCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1lbW9yeVNldC5yZWdpc3RlckZpZWxkVmFsdWUoCiAgICAgICAgICAgICAgbWVtYmVyLCBpbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb24uaW5wdXRzW2FyZ3VtZW50SW5kZXgrK10pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICAvLyBJbiBjYXNlIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGFzIGlucHV0IG5vbi1lc2NhcGluZyBvYmplY3RzLCB3ZQogICAgLy8gbmVlZCB0byBtYXJrIHRoZXNlIG9iamVjdHMgYXMgZXNjYXBpbmcuCiAgICBtZW1vcnlTZXQua2lsbEFmZmVjdGVkQnkoaW5zdHJ1Y3Rpb24pOwogIH0KCiAgYm9vbCBzaG91bGRUcmFja0luaXRpYWxWYWx1ZXMoSENyZWF0ZSBpbnN0cnVjdGlvbikgewogICAgLy8gRG9uJ3QgdHJhY2sgaW5pdGlhbCBmaWVsZCB2YWx1ZXMgb2YgYW4gYWxsb2NhdGlvbiB0aGF0IGFyZQogICAgLy8gdW5wcm9maXRhYmxlLiBXZSBzZWFyY2ggdGhlIGNoYWluIG9mIHNpbmdsZSB1c2VzIGluIGFsbG9jYXRpb25zIGZvciBhCiAgICAvLyBsaW1pdGVkIGRlcHRoLgoKICAgIGNvbnN0IE1BWF9IRUFQX0RFUFRIID0gNTsKCiAgICBib29sIGludGVyZXN0aW5nVXNlKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwgaW50IGhlYXBEZXB0aCkgewogICAgICAvLyBIZXVyaXN0aWM6IGlmIHRoZSBhbGxvY2F0aW9uIGlzIHRvbyBkZWVwIGluIGhlYXAgaXQgaXMgdW5saWtlbHkgd2Ugd2lsbAogICAgICAvLyByZWNvdmVyIGEgZmllbGQgYnkgbG9hZC1lbGltaW5hdGlvbi4KICAgICAgLy8gVE9ETyhzcmEpOiBXZSBjYW4gbWVhc3VyZSB0aGlzIGRlcHRoIGJ5IGxvb2tpbmcgYXQgbG9hZCBjaGFpbnMuCiAgICAgIGlmIChoZWFwRGVwdGggPT0gTUFYX0hFQVBfREVQVEgpIHJldHVybiBmYWxzZTsKICAgICAgLy8gVGhlcmUgYXJlIG11bHRpcGxlIHVzZXMgc28gZG8gdGhlIGZ1bGwgc3RvcmUgYW5hbHlzaXMuCiAgICAgIGlmIChpbnN0cnVjdGlvbi51c2VkQnkubGVuZ3RoICE9IDEpIHJldHVybiB0cnVlOwogICAgICBISW5zdHJ1Y3Rpb24gdXNlID0gaW5zdHJ1Y3Rpb24udXNlZEJ5LnNpbmdsZTsKICAgICAgLy8gV2hlbiB0aGUgb25seSB1c2UgaXMgYW4gYWxsb2NhdGlvbiwgdGhlIGFsbG9jYXRpb24gYmVjb21lcyB0aGUgb25seQogICAgICAvLyBoZWFwIGFsaWFzIGZvciB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KICAgICAgaWYgKHVzZSBpcyBIQ3JlYXRlKSByZXR1cm4gaW50ZXJlc3RpbmdVc2UodXNlLCBoZWFwRGVwdGggKyAxKTsKICAgICAgaWYgKHVzZSBpcyBITGl0ZXJhbExpc3QpIHJldHVybiBpbnRlcmVzdGluZ1VzZSh1c2UsIGhlYXBEZXB0aCArIDEpOwogICAgICBpZiAodXNlIGlzIEhJbnZva2VTdGF0aWMpIHsKICAgICAgICAvLyBBc3N1bWUgdGhlIGFyZ3VtZW50IGVzY2FwZXMuIEFsbCB3ZSBkbyB3aXRoIG91ciBpbml0aWFsIGFsbG9jYXRpb24gaXMKICAgICAgICAvLyBoYXZlIGl0IGVzY2FwZSBvciBzdG9yZSBpdCBpbnRvIGFuIG9iamVjdCB0aGF0IGVzY2FwZXMuCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIC8vIFRPRE8oc3JhKTogSGFuZGxlIGxpYnJhcnkgZnVuY3Rpb25zIHRoYXQgd2Uga25vdyBkbyBub3QgbW9kaWZ5IG9yCiAgICAgICAgLy8gbGVhayB0aGUgaW5wdXRzLiBGb3IgZXhhbXBsZSBgc2V0UnVudGltZVR5cGVJbmZvYCBpcyB1c2VkIHRvIG1hcmsKICAgICAgICAvLyBsaXN0IGxpdGVyYWxzIHdpdGggdHlwZSBpbmZvcm1hdGlvbi4KICAgICAgfQogICAgICBpZiAodXNlIGlzIEhQaGkpIHsKICAgICAgICAvLyBUaGUgaW5pdGlhbCBhbGxvY2F0aW9uIChpdCdzIG9ubHkgYWxpYXMpIGdldHMgbWVyZ2VkIG91dCBvZiB0aGUgbW9kZWwKICAgICAgICAvLyBvZiB0aGUgaGVhcCBiZWZvcmUgbG9hZC4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGludGVyZXN0aW5nVXNlKGluc3RydWN0aW9uLCAwKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnN0cnVjdGlvbihISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGlmIChpbnN0cnVjdGlvbi5pc0FsbG9jYXRpb24oX2Fic3RyYWN0VmFsdWVEb21haW4pKSB7CiAgICAgIG1lbW9yeVNldC5yZWdpc3RlckFsbG9jYXRpb24oaW5zdHJ1Y3Rpb24pOwogICAgfQogICAgbWVtb3J5U2V0LmtpbGxBZmZlY3RlZEJ5KGluc3RydWN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMYXp5U3RhdGljKEhMYXp5U3RhdGljIGluc3RydWN0aW9uKSB7CiAgICBGaWVsZEVudGl0eSBmaWVsZCA9IGluc3RydWN0aW9uLmVsZW1lbnQ7CiAgICBoYW5kbGVTdGF0aWNMb2FkKGZpZWxkLCBpbnN0cnVjdGlvbik7CiAgfQoKICB2b2lkIGhhbmRsZVN0YXRpY0xvYWQoTWVtYmVyRW50aXR5IGVsZW1lbnQsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgSEluc3RydWN0aW9uIGV4aXN0aW5nID0gbWVtb3J5U2V0Lmxvb2t1cEZpZWxkVmFsdWUoZWxlbWVudCwgbnVsbCk7CiAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewogICAgICBjaGVja05ld0d2bkNhbmRpZGF0ZXMoaW5zdHJ1Y3Rpb24sIGV4aXN0aW5nKTsKICAgICAgaW5zdHJ1Y3Rpb24uYmxvY2sucmV3cml0ZVdpdGhCZXR0ZXJVc2VyKGluc3RydWN0aW9uLCBleGlzdGluZyk7CiAgICAgIGluc3RydWN0aW9uLmJsb2NrLnJlbW92ZShpbnN0cnVjdGlvbik7CiAgICB9IGVsc2UgewogICAgICBtZW1vcnlTZXQucmVnaXN0ZXJGaWVsZFZhbHVlKGVsZW1lbnQsIG51bGwsIGluc3RydWN0aW9uKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdGF0aWMoSFN0YXRpYyBpbnN0cnVjdGlvbikgewogICAgaGFuZGxlU3RhdGljTG9hZChpbnN0cnVjdGlvbi5lbGVtZW50LCBpbnN0cnVjdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljU3RvcmUoSFN0YXRpY1N0b3JlIGluc3RydWN0aW9uKSB7CiAgICBpZiAobWVtb3J5U2V0LnJlZ2lzdGVyRmllbGRWYWx1ZVVwZGF0ZSgKICAgICAgICBpbnN0cnVjdGlvbi5lbGVtZW50LCBudWxsLCBpbnN0cnVjdGlvbi5pbnB1dHMubGFzdCkpIHsKICAgICAgaW5zdHJ1Y3Rpb24uYmxvY2sucmVtb3ZlKGluc3RydWN0aW9uKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXRlcmFsTGlzdChITGl0ZXJhbExpc3QgaW5zdHJ1Y3Rpb24pIHsKICAgIG1lbW9yeVNldC5yZWdpc3RlckFsbG9jYXRpb24oaW5zdHJ1Y3Rpb24pOwogICAgbWVtb3J5U2V0LmtpbGxBZmZlY3RlZEJ5KGluc3RydWN0aW9uKTsKICAgIC8vIFRPRE8oc3JhKTogU2V0IGluaXRpYWwga2V5ZWQgdmFsdWVzLgogICAgLy8gVE9ETyhzcmEpOiBTZXQgaW5pdGlhbCBsZW5ndGguCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5kZXgoSEluZGV4IGluc3RydWN0aW9uKSB7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBpbnN0cnVjdGlvbi5yZWNlaXZlci5ub25DaGVjaygpOwogICAgSEluc3RydWN0aW9uIGV4aXN0aW5nID0KICAgICAgICBtZW1vcnlTZXQubG9va3VwS2V5ZWRWYWx1ZShyZWNlaXZlciwgaW5zdHJ1Y3Rpb24uaW5kZXgpOwogICAgaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKICAgICAgY2hlY2tOZXdHdm5DYW5kaWRhdGVzKGluc3RydWN0aW9uLCBleGlzdGluZyk7CiAgICAgIGluc3RydWN0aW9uLmJsb2NrLnJld3JpdGVXaXRoQmV0dGVyVXNlcihpbnN0cnVjdGlvbiwgZXhpc3RpbmcpOwogICAgICBpbnN0cnVjdGlvbi5ibG9jay5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogICAgfSBlbHNlIHsKICAgICAgbWVtb3J5U2V0LnJlZ2lzdGVyS2V5ZWRWYWx1ZShyZWNlaXZlciwgaW5zdHJ1Y3Rpb24uaW5kZXgsIGluc3RydWN0aW9uKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbmRleEFzc2lnbihISW5kZXhBc3NpZ24gaW5zdHJ1Y3Rpb24pIHsKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IGluc3RydWN0aW9uLnJlY2VpdmVyLm5vbkNoZWNrKCk7CiAgICBtZW1vcnlTZXQucmVnaXN0ZXJLZXllZFZhbHVlVXBkYXRlKAogICAgICAgIHJlY2VpdmVyLCBpbnN0cnVjdGlvbi5pbmRleCwgaW5zdHJ1Y3Rpb24udmFsdWUpOwogIH0KCiAgLy8gUHVyZSBvcGVyYXRpb25zIHRoYXQgZG8gbm90IGVzY2FwZSB0aGVpciBpbnB1dHMuCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJpbmFyeUFyaXRobWV0aWMoSEJpbmFyeUFyaXRobWV0aWMgaW5zdHJ1Y3Rpb24pIHt9CiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJvdW5kc0NoZWNrKEhCb3VuZHNDaGVjayBpbnN0cnVjdGlvbikge30KICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uc3RhbnQoSENvbnN0YW50IGluc3RydWN0aW9uKSB7fQogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJZihISWYgaW5zdHJ1Y3Rpb24pIHt9CiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVyY2VwdG9yKEhJbnRlcmNlcHRvciBpbnN0cnVjdGlvbikge30KICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SXMoSElzIGluc3RydWN0aW9uKSB7fQogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJc1ZpYUludGVyY2VwdG9yKEhJc1ZpYUludGVyY2VwdG9yIGluc3RydWN0aW9uKSB7fQogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROb3QoSE5vdCBpbnN0cnVjdGlvbikge30KICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UGFyYW1ldGVyVmFsdWUoSFBhcmFtZXRlclZhbHVlIGluc3RydWN0aW9uKSB7fQogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRSZWxhdGlvbmFsKEhSZWxhdGlvbmFsIGluc3RydWN0aW9uKSB7fQogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdDb25jYXQoSFN0cmluZ0NvbmNhdCBpbnN0cnVjdGlvbikge30KICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUtub3duKEhUeXBlS25vd24gaW5zdHJ1Y3Rpb24pIHt9CiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVJbmZvUmVhZFJhdyhIVHlwZUluZm9SZWFkUmF3IGluc3RydWN0aW9uKSB7fQogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlSW5mb1JlYWRWYXJpYWJsZShIVHlwZUluZm9SZWFkVmFyaWFibGUgaW5zdHJ1Y3Rpb24pIHt9CiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVJbmZvRXhwcmVzc2lvbihIVHlwZUluZm9FeHByZXNzaW9uIGluc3RydWN0aW9uKSB7fQp9CgovLy8gQSBub24tZmllbGQgYmFzZWQgZmVhdHVyZSBvZiBhbiBvYmplY3QuCmVudW0gTWVtb3J5RmVhdHVyZSB7CiAgLy8gQWNjZXNzIHRvIHRoZSBgbGVuZ3RoYCBwcm9wZXJ0eSBvZiBhIGBKU0luZGV4YWJsZWAuCiAgbGVuZ3RoLAp9CgovLy8gSG9sZHMgdmFsdWVzIG9mIG1lbW9yeSBwbGFjZXMuCi8vLwovLy8gR2VuZXJhbGx5LCB2YWx1ZXMgdGhhdCBuYW1lIGEgcGxhY2UgKGEgcmVjZWl2ZXIpIGhhdmUgdHlwZSByZWZpbmVtZW50cyBhbmQKLy8vIG90aGVyIGNoZWNrcyByZW1vdmVkIHRvIGVuc3VyZSB0aGF0IGNoZWNrcyBhbmQgdHlwZSByZWZpbmVtZW50cyBkbyBub3QKLy8vIGNvbmZ1c2UgYWxpYXNpbmcuICBWYWx1ZXMgc3RvcmVkIGludG8gYSBtZW1vcnkgcGxhY2Uga2VlcCB0aGUgdHlwZQovLy8gcmVmaW5lbWVudHMgdG8gaGVscCBmdXJ0aGVyIG9wdGltaXphdGlvbnMuCmNsYXNzIE1lbW9yeVNldCB7CiAgZmluYWwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkOwoKICAvLy8gTWFwcyBhIGZpZWxkIHRvIGEgbWFwIG9mIHJlY2VpdmVycyB0byB0aGVpciBjdXJyZW50IGZpZWxkIHZhbHVlcy4KICAvLy8KICAvLy8gVGhlIGZpZWxkIGlzIGVpdGhlciBhIFtGaWVsZEVudGl0eV0sIGEgW0Z1bmN0aW9uRW50aXR5XSBpbiBjYXNlIG9mCiAgLy8vIGluc3RhbmNlIG1ldGhvZHMsIG9yIGEgW01lbW9yeUZlYXR1cmVdIGZvciBgbGVuZ3RoYCBhY2Nlc3Mgb24KICAvLy8gYEpTSW5kZXhhYmxlYC4KICAvLy8KICAvLyBUT0RPKDI1NTQ0KTogU3BsaXQgbGVuZ3RoIGVmZmVjdHMgZnJvbSBvdGhlciBlZmZlY3RzIGFuZCBtb2RlbCBsZW5ndGhzCiAgLy8gc2VwYXJhdGVseS4KICBmaW5hbCBNYXA8T2JqZWN0IC8qTWVtYmVyRW50aXR5fE1lbW9yeUZlYXR1cmUqLywKICAgICAgICAgIE1hcDxISW5zdHJ1Y3Rpb24sIEhJbnN0cnVjdGlvbj4+CiAgICAgIGZpZWxkVmFsdWVzID0gPE9iamVjdCwgTWFwPEhJbnN0cnVjdGlvbiwgSEluc3RydWN0aW9uPj57fTsKCiAgLy8vIE1hcHMgYSByZWNlaXZlciB0byBhIG1hcCBvZiBrZXlzIHRvIHZhbHVlLgogIGZpbmFsIE1hcDxISW5zdHJ1Y3Rpb24sIE1hcDxISW5zdHJ1Y3Rpb24sIEhJbnN0cnVjdGlvbj4+IGtleWVkVmFsdWVzID0KICAgICAgPEhJbnN0cnVjdGlvbiwgTWFwPEhJbnN0cnVjdGlvbiwgSEluc3RydWN0aW9uPj57fTsKCiAgLy8vIFNldCBvZiBvYmplY3RzIHRoYXQgd2Uga25vdyBkb24ndCBlc2NhcGUgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCiAgZmluYWwgU2V0bGV0PEhJbnN0cnVjdGlvbj4gbm9uRXNjYXBpbmdSZWNlaXZlcnMgPSBuZXcgU2V0bGV0PEhJbnN0cnVjdGlvbj4oKTsKCiAgTWVtb3J5U2V0KHRoaXMuY2xvc2VkV29ybGQpOwoKICBBYnN0cmFjdFZhbHVlRG9tYWluIGdldCBfYWJzdHJhY3RWYWx1ZURvbWFpbiA9PgogICAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIFtmaXJzdF0gYW5kIFtzZWNvbmRdIGFsd2F5cyBhbGlhcyB0byB0aGUgc2FtZSBvYmplY3QuCiAgYm9vbCBtdXN0QWxpYXMoSEluc3RydWN0aW9uIGZpcnN0LCBISW5zdHJ1Y3Rpb24gc2Vjb25kKSB7CiAgICByZXR1cm4gZmlyc3QgPT0gc2Vjb25kOwogIH0KCiAgLy8vIFJldHVybnMgd2hldGhlciBbZmlyc3RdIGFuZCBbc2Vjb25kXSBtYXkgYWxpYXMgdG8gdGhlIHNhbWUgb2JqZWN0LgogIGJvb2wgbWF5QWxpYXMoSEluc3RydWN0aW9uIGZpcnN0LCBISW5zdHJ1Y3Rpb24gc2Vjb25kKSB7CiAgICBpZiAobXVzdEFsaWFzKGZpcnN0LCBzZWNvbmQpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChpc0NvbmNyZXRlKGZpcnN0KSAmJiBpc0NvbmNyZXRlKHNlY29uZCkpIHJldHVybiBmYWxzZTsKICAgIGlmIChub25Fc2NhcGluZ1JlY2VpdmVycy5jb250YWlucyhmaXJzdCkpIHJldHVybiBmYWxzZTsKICAgIGlmIChub25Fc2NhcGluZ1JlY2VpdmVycy5jb250YWlucyhzZWNvbmQpKSByZXR1cm4gZmFsc2U7CiAgICAvLyBUeXBlZCBhcnJheXMgb2YgZGlmZmVyZW50IHR5cGVzIG1pZ2h0IGhhdmUgYSBzaGFyZWQgYnVmZmVyLgogICAgaWYgKGNvdWxkQmVUeXBlZEFycmF5KGZpcnN0KSAmJiBjb3VsZEJlVHlwZWRBcnJheShzZWNvbmQpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBfYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgIC5hcmVEaXNqb2ludChmaXJzdC5pbnN0cnVjdGlvblR5cGUsIHNlY29uZC5pbnN0cnVjdGlvblR5cGUpCiAgICAgICAgLmlzUG90ZW50aWFsbHlGYWxzZTsKICB9CgogIGJvb2wgaXNGaW5hbChPYmplY3QgZWxlbWVudCkgewogICAgcmV0dXJuIGVsZW1lbnQgaXMgTWVtYmVyRW50aXR5ICYmIGNsb3NlZFdvcmxkLmZpZWxkTmV2ZXJDaGFuZ2VzKGVsZW1lbnQpOwogIH0KCiAgYm9vbCBpc0NvbmNyZXRlKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgcmV0dXJuIGluc3RydWN0aW9uIGlzIEhDcmVhdGUgfHwKICAgICAgICBpbnN0cnVjdGlvbiBpcyBIQ29uc3RhbnQgfHwKICAgICAgICBpbnN0cnVjdGlvbiBpcyBITGl0ZXJhbExpc3Q7CiAgfQoKICBib29sIGNvdWxkQmVUeXBlZEFycmF5KEhJbnN0cnVjdGlvbiByZWNlaXZlcikgewogICAgcmV0dXJuIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAuY291bGRCZVR5cGVkQXJyYXkocmVjZWl2ZXIuaW5zdHJ1Y3Rpb25UeXBlKQogICAgICAgIC5pc1BvdGVudGlhbGx5VHJ1ZTsKICB9CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgW3JlY2VpdmVyXSBlc2NhcGVzIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgogIGJvb2wgZXNjYXBlcyhISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIpIHsKICAgIGFzc2VydChyZWNlaXZlciA9PSBudWxsIHx8IHJlY2VpdmVyID09IHJlY2VpdmVyLm5vbkNoZWNrKCkpOwogICAgcmV0dXJuICFub25Fc2NhcGluZ1JlY2VpdmVycy5jb250YWlucyhyZWNlaXZlcik7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQWxsb2NhdGlvbihISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGFzc2VydChpbnN0cnVjdGlvbiA9PSBpbnN0cnVjdGlvbi5ub25DaGVjaygpKTsKICAgIG5vbkVzY2FwaW5nUmVjZWl2ZXJzLmFkZChpbnN0cnVjdGlvbik7CiAgfQoKICAvLy8gU2V0cyB0aGUgW2ZpZWxkXSBvbiBbcmVjZWl2ZXJdIHRvIGNvbnRhaW4gW3ZhbHVlXS4gS2lsbHMgYWxsIHBvdGVudGlhbAogIC8vLyBwbGFjZXMgdGhhdCBtYXkgYmUgYWZmZWN0ZWQgYnkgdGhpcyB1cGRhdGUuIFJldHVybnMgYHRydWVgIGlmIHRoZSB1cGRhdGUKICAvLy8gaXMgcmVkdW5kYW50LgogIGJvb2wgcmVnaXN0ZXJGaWVsZFZhbHVlVXBkYXRlKAogICAgICBPYmplY3QgZmllbGQsIEhJbnN0cnVjdGlvbiByZWNlaXZlciwgSEluc3RydWN0aW9uIHZhbHVlKSB7CiAgICBhc3NlcnQoZmllbGQgaXMgTWVtYmVyRW50aXR5IHx8IGZpZWxkIGlzIE1lbW9yeUZlYXR1cmUsCiAgICAgICAgIlVuZXhwZWN0ZWQgbWVtYmVyL2ZlYXR1cmU6ICRmaWVsZCIpOwogICAgYXNzZXJ0KHJlY2VpdmVyID09IG51bGwgfHwgcmVjZWl2ZXIgPT0gcmVjZWl2ZXIubm9uQ2hlY2soKSk7CiAgICBpZiAoY2xvc2VkV29ybGQubmF0aXZlRGF0YS5pc05hdGl2ZU1lbWJlcihmaWVsZCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOyAvLyBUT0RPKDE0OTU1KTogUmVtb3ZlIHRoaXMgcmVzdHJpY3Rpb24/CiAgICB9CiAgICAvLyBbdmFsdWVdIGlzIGJlaW5nIHNldCBpbiBzb21lIHBsYWNlIGluIG1lbW9yeSwgd2UgcmVtb3ZlIGl0IGZyb20gdGhlCiAgICAvLyBub24tZXNjYXBpbmcgc2V0LgogICAgbm9uRXNjYXBpbmdSZWNlaXZlcnMucmVtb3ZlKHZhbHVlLm5vbkNoZWNrKCkpOwogICAgTWFwPEhJbnN0cnVjdGlvbiwgSEluc3RydWN0aW9uPiBtYXAgPQogICAgICAgIGZpZWxkVmFsdWVzLnB1dElmQWJzZW50KGZpZWxkLCAoKSA9PiA8SEluc3RydWN0aW9uLCBISW5zdHJ1Y3Rpb24+e30pOwogICAgYm9vbCBpc1JlZHVuZGFudCA9IG1hcFtyZWNlaXZlcl0gPT0gdmFsdWU7CiAgICBtYXAuZm9yRWFjaCgoa2V5LCB2YWx1ZSkgewogICAgICBpZiAobWF5QWxpYXMocmVjZWl2ZXIsIGtleSkpIG1hcFtrZXldID0gbnVsbDsKICAgIH0pOwogICAgbWFwW3JlY2VpdmVyXSA9IHZhbHVlOwogICAgcmV0dXJuIGlzUmVkdW5kYW50OwogIH0KCiAgLy8vIFJlZ2lzdGVycyB0aGF0IHRoZSBbZmllbGRdIG9uIFtyZWNlaXZlcl0gaXMgbm93IFt2YWx1ZV0uCiAgdm9pZCByZWdpc3RlckZpZWxkVmFsdWUoCiAgICAgIE9iamVjdCBmaWVsZCwgSEluc3RydWN0aW9uIHJlY2VpdmVyLCBISW5zdHJ1Y3Rpb24gdmFsdWUpIHsKICAgIGFzc2VydChmaWVsZCBpcyBNZW1iZXJFbnRpdHkgfHwgZmllbGQgaXMgTWVtb3J5RmVhdHVyZSwKICAgICAgICAiVW5leHBlY3RlZCBtZW1iZXIvZmVhdHVyZTogJGZpZWxkIik7CiAgICBhc3NlcnQocmVjZWl2ZXIgPT0gbnVsbCB8fCByZWNlaXZlciA9PSByZWNlaXZlci5ub25DaGVjaygpKTsKICAgIGlmIChmaWVsZCBpcyBNZW1iZXJFbnRpdHkgJiYgY2xvc2VkV29ybGQubmF0aXZlRGF0YS5pc05hdGl2ZU1lbWJlcihmaWVsZCkpIHsKICAgICAgcmV0dXJuOyAvLyBUT0RPKDE0OTU1KTogUmVtb3ZlIHRoaXMgcmVzdHJpY3Rpb24/CiAgICB9CiAgICBNYXA8SEluc3RydWN0aW9uLCBISW5zdHJ1Y3Rpb24+IG1hcCA9CiAgICAgICAgZmllbGRWYWx1ZXMucHV0SWZBYnNlbnQoZmllbGQsICgpID0+IDxISW5zdHJ1Y3Rpb24sIEhJbnN0cnVjdGlvbj57fSk7CiAgICBtYXBbcmVjZWl2ZXJdID0gdmFsdWU7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkIGZvciBbZmllbGRdIG9uIFtyZWNlaXZlcl0uIFJldHVybnMgYG51bGxgIGlmIHdlCiAgLy8vIGRvbid0IGtub3cuCiAgSEluc3RydWN0aW9uIGxvb2t1cEZpZWxkVmFsdWUoT2JqZWN0IGZpZWxkLCBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIpIHsKICAgIGFzc2VydChmaWVsZCBpcyBNZW1iZXJFbnRpdHkgfHwgZmllbGQgaXMgTWVtb3J5RmVhdHVyZSwKICAgICAgICAiVW5leHBlY3RlZCBtZW1iZXIvZmVhdHVyZTogJGZpZWxkIik7CiAgICBhc3NlcnQocmVjZWl2ZXIgPT0gbnVsbCB8fCByZWNlaXZlciA9PSByZWNlaXZlci5ub25DaGVjaygpKTsKICAgIE1hcDxISW5zdHJ1Y3Rpb24sIEhJbnN0cnVjdGlvbj4gbWFwID0gZmllbGRWYWx1ZXNbZmllbGRdOwogICAgcmV0dXJuIChtYXAgPT0gbnVsbCkgPyBudWxsIDogbWFwW3JlY2VpdmVyXTsKICB9CgogIC8vLyBLaWxsIGFsbCBwbGFjZXMgdGhhdCBtYXkgYmUgYWZmZWN0ZWQgYnkgdGhpcyBbaW5zdHJ1Y3Rpb25dLiBBbHNvIHVwZGF0ZQogIC8vLyB0aGUgc2V0IG9mIG5vbi1lc2NhcGluZyBvYmplY3RzIGluIGNhc2UgW2luc3RydWN0aW9uXSBoYXMgbm9uLWVzY2FwaW5nCiAgLy8vIG9iamVjdHMgaW4gaXRzIGlucHV0cy4KICB2b2lkIGtpbGxBZmZlY3RlZEJ5KEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgLy8gRXZlbiBpZiBbaW5zdHJ1Y3Rpb25dIGRvZXMgbm90IGhhdmUgc2lkZSBlZmZlY3RzLCBpdCBtYXkgdXNlIG5vbi1lc2NhcGluZwogICAgLy8gb2JqZWN0cyBhbmQgc3RvcmUgdGhlbSBpbiBhIG5ldyBvYmplY3QsIHdoaWNoIG1ha2UgdGhlc2Ugb2JqZWN0cwogICAgLy8gZXNjYXBpbmcuCiAgICBpbnN0cnVjdGlvbi5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpIHsKICAgICAgbm9uRXNjYXBpbmdSZWNlaXZlcnMucmVtb3ZlKGlucHV0Lm5vbkNoZWNrKCkpOwogICAgfSk7CgogICAgaWYgKGluc3RydWN0aW9uLnNpZGVFZmZlY3RzLmNoYW5nZXNJbnN0YW5jZVByb3BlcnR5KCkgfHwKICAgICAgICBpbnN0cnVjdGlvbi5zaWRlRWZmZWN0cy5jaGFuZ2VzU3RhdGljUHJvcGVydHkoKSkgewogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gcmVjZWl2ZXJzVG9SZW1vdmUgPSA8SEluc3RydWN0aW9uPltdOwoKICAgICAgTGlzdDxPYmplY3Q+IGZpZWxkc1RvUmVtb3ZlOwogICAgICBmaWVsZFZhbHVlcy5mb3JFYWNoKChPYmplY3QgZWxlbWVudCwgbWFwKSB7CiAgICAgICAgaWYgKGlzRmluYWwoZWxlbWVudCkpIHJldHVybjsKICAgICAgICBtYXAuZm9yRWFjaCgocmVjZWl2ZXIsIHZhbHVlKSB7CiAgICAgICAgICBpZiAoZXNjYXBlcyhyZWNlaXZlcikpIHsKICAgICAgICAgICAgcmVjZWl2ZXJzVG9SZW1vdmUuYWRkKHJlY2VpdmVyKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpZiAocmVjZWl2ZXJzVG9SZW1vdmUubGVuZ3RoID09IG1hcC5sZW5ndGgpIHsKICAgICAgICAgIC8vIFJlbW92ZSB0aGVtIGFsbCBieSByZW1vdmluZyB0aGUgZW50aXJlIG1hcC4KICAgICAgICAgIChmaWVsZHNUb1JlbW92ZSA/Pz0gPE9iamVjdD5bXSkuYWRkKGVsZW1lbnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWNlaXZlcnNUb1JlbW92ZS5mb3JFYWNoKG1hcC5yZW1vdmUpOwogICAgICAgIH0KICAgICAgICByZWNlaXZlcnNUb1JlbW92ZS5jbGVhcigpOwogICAgICB9KTsKICAgICAgZmllbGRzVG9SZW1vdmU/LmZvckVhY2goZmllbGRWYWx1ZXMucmVtb3ZlKTsKICAgIH0KCiAgICBpZiAoaW5zdHJ1Y3Rpb24uc2lkZUVmZmVjdHMuY2hhbmdlc0luZGV4KCkpIHsKICAgICAga2V5ZWRWYWx1ZXMuZm9yRWFjaCgocmVjZWl2ZXIsIG1hcCkgewogICAgICAgIGlmIChlc2NhcGVzKHJlY2VpdmVyKSkgewogICAgICAgICAgbWFwLmZvckVhY2goKGluZGV4LCB2YWx1ZSkgewogICAgICAgICAgICBtYXBbaW5kZXhdID0gbnVsbDsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkIGluIGByZWNlaXZlcltpbmRleF1gLiBSZXR1cm5zIG51bGwgaWYgd2UgZG9uJ3QKICAvLy8ga25vdy4KICBISW5zdHJ1Y3Rpb24gbG9va3VwS2V5ZWRWYWx1ZShISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEhJbnN0cnVjdGlvbiBpbmRleCkgewogICAgTWFwPEhJbnN0cnVjdGlvbiwgSEluc3RydWN0aW9uPiBtYXAgPSBrZXllZFZhbHVlc1tyZWNlaXZlcl07CiAgICByZXR1cm4gKG1hcCA9PSBudWxsKSA/IG51bGwgOiBtYXBbaW5kZXhdOwogIH0KCiAgLy8vIFJlZ2lzdGVycyB0aGF0IGByZWNlaXZlcltpbmRleF1gIGlzIG5vdyBbdmFsdWVdLgogIHZvaWQgcmVnaXN0ZXJLZXllZFZhbHVlKAogICAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEhJbnN0cnVjdGlvbiBpbmRleCwgSEluc3RydWN0aW9uIHZhbHVlKSB7CiAgICBNYXA8SEluc3RydWN0aW9uLCBISW5zdHJ1Y3Rpb24+IG1hcCA9CiAgICAgICAga2V5ZWRWYWx1ZXMucHV0SWZBYnNlbnQocmVjZWl2ZXIsICgpID0+IDxISW5zdHJ1Y3Rpb24sIEhJbnN0cnVjdGlvbj57fSk7CiAgICBtYXBbaW5kZXhdID0gdmFsdWU7CiAgfQoKICAvLy8gU2V0cyBgcmVjZWl2ZXJbaW5kZXhdYCB0byBjb250YWluIFt2YWx1ZV0uIEtpbGxzIGFsbCBwb3RlbnRpYWwgcGxhY2VzIHRoYXQKICAvLy8gbWF5IGJlIGFmZmVjdGVkIGJ5IHRoaXMgdXBkYXRlLgogIHZvaWQgcmVnaXN0ZXJLZXllZFZhbHVlVXBkYXRlKAogICAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIsIEhJbnN0cnVjdGlvbiBpbmRleCwgSEluc3RydWN0aW9uIHZhbHVlKSB7CiAgICBub25Fc2NhcGluZ1JlY2VpdmVycy5yZW1vdmUodmFsdWUubm9uQ2hlY2soKSk7CiAgICBrZXllZFZhbHVlcy5mb3JFYWNoKChrZXksIHZhbHVlcykgewogICAgICBpZiAobWF5QWxpYXMocmVjZWl2ZXIsIGtleSkpIHsKICAgICAgICAvLyBUeXBlZCBhcnJheXMgdGhhdCBhcmUgdmlld3Mgb2YgdGhlIHNhbWUgYnVmZmVyIG1heSBoYXZlIGRpZmZlcmVudAogICAgICAgIC8vIG9mZnNldHMgb3IgZWxlbWVudCBzaXplcywgdW5sZXNzIHRoZXkgYXJlIHRoZSBzYW1lIHR5cGVkIGFycmF5LgogICAgICAgIGJvb2wgd2Vha0luZGV4ID0gY291bGRCZVR5cGVkQXJyYXkoa2V5KSAmJiAhbXVzdEFsaWFzKHJlY2VpdmVyLCBrZXkpOwogICAgICAgIHZhbHVlcy5mb3JFYWNoKChvdGhlckluZGV4LCBvdGhlclZhbHVlKSB7CiAgICAgICAgICBpZiAod2Vha0luZGV4IHx8IG1heUFsaWFzKGluZGV4LCBvdGhlckluZGV4KSkgewogICAgICAgICAgICB2YWx1ZXNbb3RoZXJJbmRleF0gPSBudWxsOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBUeXBlZCBhcnJheXMgbWF5IG5hcnJvdyBpbmNvbWluZyB2YWx1ZXMuCiAgICBpZiAoY291bGRCZVR5cGVkQXJyYXkocmVjZWl2ZXIpKSByZXR1cm47CgogICAgTWFwPEhJbnN0cnVjdGlvbiwgSEluc3RydWN0aW9uPiBtYXAgPQogICAgICAgIGtleWVkVmFsdWVzLnB1dElmQWJzZW50KHJlY2VpdmVyLCAoKSA9PiA8SEluc3RydWN0aW9uLCBISW5zdHJ1Y3Rpb24+e30pOwogICAgbWFwW2luZGV4XSA9IHZhbHVlOwogIH0KCiAgLy8vIFJldHVybnMgYSBjb21tb24gaW5zdHJ1Y3Rpb24gZm9yIFtmaXJzdF0gYW5kIFtzZWNvbmRdLgogIC8vLwogIC8vLyBSZXR1cm5zIGBudWxsYCBpZiBlaXRoZXIgW2ZpcnN0XSBvciBbc2Vjb25kXSBpcyBudWxsLiBSZXR1cm5zIFtmaXJzdF0gaWYKICAvLy8gW2ZpcnN0XSBhbmQgW3NlY29uZF0gYXJlIGVxdWFsLiBPdGhlcndpc2UgY3JlYXRlcyBvciByZS11c2VzIGEgcGhpIGluCiAgLy8vIFtibG9ja10gdGhhdCBob2xkcyBbZmlyc3RdIGFuZCBbc2Vjb25kXS4KICBISW5zdHJ1Y3Rpb24gZmluZENvbW1vbkluc3RydWN0aW9uKEhJbnN0cnVjdGlvbiBmaXJzdCwgSEluc3RydWN0aW9uIHNlY29uZCwKICAgICAgSEJhc2ljQmxvY2sgYmxvY2ssIGludCBwcmVkZWNlc3NvckluZGV4KSB7CiAgICBpZiAoZmlyc3QgPT0gbnVsbCB8fCBzZWNvbmQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAoZmlyc3QgPT0gc2Vjb25kKSByZXR1cm4gZmlyc3Q7CiAgICBpZiAoc2Vjb25kIGlzIEhHZXRMZW5ndGgpIHsKICAgICAgLy8gRG9uJ3QgYWx3YXlzIGNyZWF0ZSBwaGlzIGZvciBIR2V0TGVuZ3RoLiBUaGUgcGhpIGNvbmZ1c2VzIGFycmF5IGJvdW5kcwogICAgICAvLyBjaGVjayBlbGltaW5hdGlvbiBhbmQgdGhlIHJlc3VsdGluZyB2YXJpYWJsZS1oZWF2eSBjb2RlIHByb2JhYmx5IGlzCiAgICAgIC8vIGNvbmZ1c2luZyBmb3IgSmF2YVNjcmlwdCBWTXMuIEluIHByYWN0aWNlLCB0aGlzIG1vc3RseSBhZmZlY3RzIHRoZQogICAgICAvLyBleHBhbnNpb24gb2YgZm9yLWluIGxvb3BzIG9uIEFycmF5cywgc28gd2UgbWF0Y2ggdGhlIGV4cHJlc3Npb24KICAgICAgLy8KICAgICAgLy8gICAgIGNoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKGFycmF5Lmxlbmd0aCA9PSBfZW5kLCBhcnJheSkKICAgICAgLy8KICAgICAgLy8gc3RhcnRpbmcgd2l0aCB0aGUgSEdldExlbmd0aCBvZiB0aGUgYGFycmF5Lmxlbmd0aGAsIGluIHRoZSBjYXNlIHdoZXJlCiAgICAgIC8vIGBhcnJheS5sZW5ndGhgIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSAoaS5lLiBub3QgYWxyZWFkeSBvcHRpbWl6ZWQgdG8gdXNlCiAgICAgIC8vIGEgcHJldmlvdXMgdXNlLCBpbiB0aGUgbG9vcCBjb25kaXRpb24pLgogICAgICAvLwogICAgICAvLyBUT0RPKHNyYSk6IEZpZ3VyZSBvdXQgYSBiZXR0ZXIgd2F5IGVuc3VyZSAnbmljZScgbG9vcCBjb2RlLgogICAgICAvLyBUT0RPKDIyNDA3KTogVGhlIHBoaSB3b3VsZCBub3QgYmUgc28gYmFkIGlmIGl0IGRpZCBub3QgY29uZnVzZSBib3VuZHMKICAgICAgLy8gY2hlY2sgZWxpbWluYXRpb24uCiAgICAgIC8vIFRPRE8oMjU0MzcpOiBXZSBjb3VsZCBhZGQgYSBwaGkgaWYgd2UgdW5kaWQgdGhlIGhhcm1mdWwgY2FzZXMuCiAgICAgIGlmIChzZWNvbmQudXNlZEJ5Lmxlbmd0aCA9PSAxKSB7CiAgICAgICAgdmFyIHVzZXIgPSBzZWNvbmQudXNlZEJ5LnNpbmdsZTsKICAgICAgICBpZiAodXNlciBpcyBISWRlbnRpdHkgJiYgdXNlci51c2VkQnkubGVuZ3RoID09IDEpIHsKICAgICAgICAgIEhJbnN0cnVjdGlvbiB1c2VyMiA9IHVzZXIudXNlZEJ5LnNpbmdsZTsKICAgICAgICAgIGlmICh1c2VyMiBpcyBISW52b2tlU3RhdGljICYmCiAgICAgICAgICAgICAgdXNlcjIuZWxlbWVudCA9PQogICAgICAgICAgICAgICAgICBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5jaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIEFic3RyYWN0VmFsdWUgcGhpVHlwZSA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLnVuaW9uKAogICAgICAgIHNlY29uZC5pbnN0cnVjdGlvblR5cGUsIGZpcnN0Lmluc3RydWN0aW9uVHlwZSk7CiAgICBpZiAoZmlyc3QgaXMgSFBoaSAmJiBmaXJzdC5ibG9jayA9PSBibG9jaykgewogICAgICBIUGhpIHBoaSA9IGZpcnN0OwogICAgICBwaGkuYWRkSW5wdXQoc2Vjb25kKTsKICAgICAgcGhpLmluc3RydWN0aW9uVHlwZSA9IHBoaVR5cGU7CiAgICAgIHJldHVybiBwaGk7CiAgICB9IGVsc2UgewogICAgICBIUGhpIHBoaSA9IG5ldyBIUGhpLm5vSW5wdXRzKG51bGwsIHBoaVR5cGUpOwogICAgICBibG9jay5hZGRQaGkocGhpKTsKICAgICAgLy8gUHJldmlvdXMgcHJlZGVjZXNzb3JzIGhhZCB0aGUgc2FtZSBpbnB1dC4gQSBwaGkgbXVzdCBoYXZlCiAgICAgIC8vIHRoZSBzYW1lIG51bWJlciBvZiBpbnB1dHMgYXMgaXRzIGJsb2NrIGhhcyBwcmVkZWNlc3NvcnMuCiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJlZGVjZXNzb3JJbmRleDsgaSsrKSB7CiAgICAgICAgcGhpLmFkZElucHV0KGZpcnN0KTsKICAgICAgfQogICAgICBwaGkuYWRkSW5wdXQoc2Vjb25kKTsKICAgICAgcmV0dXJuIHBoaTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiBbdGhpc10gYW5kIHRoZSBbb3RoZXJdIG1lbW9yeSBzZXQuCiAgTWVtb3J5U2V0IGludGVyc2VjdGlvbkZvcigKICAgICAgTWVtb3J5U2V0IG90aGVyLCBIQmFzaWNCbG9jayBibG9jaywgaW50IHByZWRlY2Vzc29ySW5kZXgpIHsKICAgIE1lbW9yeVNldCByZXN1bHQgPSBuZXcgTWVtb3J5U2V0KGNsb3NlZFdvcmxkKTsKICAgIGlmIChvdGhlciA9PSBudWxsKSB7CiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHZpc2l0IHRvIGEgbG9vcCBoZWFkZXIgKFtvdGhlcl0gaXMgYG51bGxgIGJlY2F1c2Ugd2UKICAgICAgLy8gaGF2ZSBub3QgdmlzaXRlZCB0aGUgYmFjayBlZGdlKS4gQ29weSB0aGUgbm9uRXNjYXBpbmdSZWNlaXZlcnMgdGhhdCBhcmUKICAgICAgLy8gZ3VhcmFudGVlZCB0byBzdXJ2aXZlIHRoZSBsb29wIGJlY2F1c2UgdGhleSBhcmUgbm90IGVzY2FwZWQgYmVmb3JlCiAgICAgIC8vIG1ldGhvZCBleGl0LgogICAgICAvLyBUT0RPKHNyYSk6IFdlIHNob3VsZCBkbyBhIHByb3BlciBkYXRhZmxvdyB0byBmaW5kIHRoZSBtYXhpbWFsCiAgICAgIC8vIG5vbkVzY2FwaW5nUmVjZWl2ZXJzIChhIHZhcmlhbnQgb2YgQXZhaWxhYmxlLUV4cHJlc3Npb25zKSwgd2hpY2ggbXVzdAogICAgICAvLyBjb252ZXJnZSBiZWZvcmUgd2UgZWRpdCB0aGUgcHJvZ3JhbSBpbiBbZmluZENvbW1vbkluc3RydWN0aW9uXS4KICAgICAgZm9yIChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gaW4gbm9uRXNjYXBpbmdSZWNlaXZlcnMpIHsKICAgICAgICBib29sIGlzTm9uRXNjYXBpbmdVc2UoSEluc3RydWN0aW9uIHVzZSkgewogICAgICAgICAgaWYgKHVzZSBpcyBIUmV0dXJuKSByZXR1cm4gdHJ1ZTsgLy8gRXNjYXBlcywgYnV0IHNvIGRvZXMgY29udHJvbC4KICAgICAgICAgIGlmICh1c2UgaXMgSEZpZWxkR2V0KSByZXR1cm4gdHJ1ZTsKICAgICAgICAgIGlmICh1c2UgaXMgSEZpZWxkU2V0KSB7CiAgICAgICAgICAgIHJldHVybiB1c2UudmFsdWUubm9uQ2hlY2soKSAhPSBpbnN0cnVjdGlvbjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh1c2UgaXMgSFR5cGVJbmZvUmVhZFZhcmlhYmxlKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgIGlmICh1c2UgaXMgSEdldExlbmd0aCkgcmV0dXJuIHRydWU7CiAgICAgICAgICBpZiAodXNlIGlzIEhCb3VuZHNDaGVjaykgcmV0dXJuIHRydWU7CiAgICAgICAgICBpZiAodXNlIGlzIEhJbmRleCkgcmV0dXJuIHRydWU7CiAgICAgICAgICBpZiAodXNlIGlzIEhJbmRleEFzc2lnbikgewogICAgICAgICAgICByZXR1cm4gdXNlLnZhbHVlLm5vbkNoZWNrKCkgIT0gaW5zdHJ1Y3Rpb247CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodXNlIGlzIEhJbnRlcmNlcHRvcikgcmV0dXJuIHRydWU7CiAgICAgICAgICBpZiAodXNlIGlzIEhJbnZva2VEeW5hbWljTWV0aG9kKSB7CiAgICAgICAgICAgIE1lbWJlckVudGl0eSBlbGVtZW50ID0gdXNlLmVsZW1lbnQ7CiAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5qc0FycmF5QWRkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdXNlLmlucHV0cy5sYXN0ICE9IGluc3RydWN0aW9uOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHVzZSBpcyBISW52b2tlU3RhdGljKSB7CiAgICAgICAgICAgIGlmICh1c2UuZWxlbWVudCA9PQogICAgICAgICAgICAgICAgY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuY2hlY2tDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IpCiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGluc3RydWN0aW9uLnVzZWRCeS5ldmVyeShpc05vbkVzY2FwaW5nVXNlKSkgewogICAgICAgICAgcmVzdWx0Lm5vbkVzY2FwaW5nUmVjZWl2ZXJzLmFkZChpbnN0cnVjdGlvbik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgZmllbGRWYWx1ZXMuZm9yRWFjaCgoZWxlbWVudCwgdmFsdWVzKSB7CiAgICAgIHZhciBvdGhlclZhbHVlcyA9IG90aGVyLmZpZWxkVmFsdWVzW2VsZW1lbnRdOwogICAgICBpZiAob3RoZXJWYWx1ZXMgPT0gbnVsbCkgcmV0dXJuOwogICAgICB2YWx1ZXMuZm9yRWFjaCgocmVjZWl2ZXIsIHZhbHVlKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gZmluZENvbW1vbkluc3RydWN0aW9uKAogICAgICAgICAgICB2YWx1ZSwgb3RoZXJWYWx1ZXNbcmVjZWl2ZXJdLCBibG9jaywgcHJlZGVjZXNzb3JJbmRleCk7CiAgICAgICAgaWYgKGluc3RydWN0aW9uICE9IG51bGwpIHsKICAgICAgICAgIHJlc3VsdC5yZWdpc3RlckZpZWxkVmFsdWUoZWxlbWVudCwgcmVjZWl2ZXIsIGluc3RydWN0aW9uKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CgogICAga2V5ZWRWYWx1ZXMuZm9yRWFjaCgocmVjZWl2ZXIsIHZhbHVlcykgewogICAgICB2YXIgb3RoZXJWYWx1ZXMgPSBvdGhlci5rZXllZFZhbHVlc1tyZWNlaXZlcl07CiAgICAgIGlmIChvdGhlclZhbHVlcyA9PSBudWxsKSByZXR1cm47CiAgICAgIHZhbHVlcy5mb3JFYWNoKChpbmRleCwgdmFsdWUpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBmaW5kQ29tbW9uSW5zdHJ1Y3Rpb24oCiAgICAgICAgICAgIHZhbHVlLCBvdGhlclZhbHVlc1tpbmRleF0sIGJsb2NrLCBwcmVkZWNlc3NvckluZGV4KTsKICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICAgICAgcmVzdWx0LnJlZ2lzdGVyS2V5ZWRWYWx1ZShyZWNlaXZlciwgaW5kZXgsIGluc3RydWN0aW9uKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CgogICAgbm9uRXNjYXBpbmdSZWNlaXZlcnMuZm9yRWFjaCgocmVjZWl2ZXIpIHsKICAgICAgaWYgKG90aGVyLm5vbkVzY2FwaW5nUmVjZWl2ZXJzLmNvbnRhaW5zKHJlY2VpdmVyKSkgewogICAgICAgIHJlc3VsdC5ub25Fc2NhcGluZ1JlY2VpdmVycy5h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bGlicmFyeSBqc19hc3Q7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgc2hvdyBJdGVyYWJsZUJhc2U7CmltcG9ydCAnc3JjL3ByZWNlZGVuY2UuZGFydCc7CmltcG9ydCAnc3JjL2NoYXJhY3RlcnMuZGFydCcgYXMgY2hhckNvZGVzOwoKcGFydCAnc3JjL25vZGVzLmRhcnQnOwpwYXJ0ICdzcmMvYnVpbGRlci5kYXJ0JzsKcGFydCAnc3JjL3ByaW50ZXIuZGFydCc7CnBhcnQgJ3NyYy90ZW1wbGF0ZS5kYXJ0JzsKcGFydCAnc3JjL2VxdWl2YWxlbmNlX3Zpc2l0b3IuZGFydCc7ChEATk48ARABLB4rARcZGRolARpwYWNrYWdlOmpzX2FzdC9qc19hc3QuZGFydChzZGtyb290Oi9wa2cvanNfYXN0L2xpYi9zcmMvcHJpbnRlci5kYXJ0wAC6IS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGpzX2FzdDsKCnR5cGVkZWYgU3RyaW5nIFJlbmFtZXIoTmFtZSBuYW1lKTsKCmNsYXNzIEphdmFTY3JpcHRQcmludGluZ09wdGlvbnMgewogIGZpbmFsIGJvb2wgc2hvdWxkQ29tcHJlc3NPdXRwdXQ7CiAgZmluYWwgYm9vbCBtaW5pZnlMb2NhbFZhcmlhYmxlczsKICBmaW5hbCBib29sIHByZWZlclNlbWljb2xvblRvTmV3bGluZUluTWluaWZpZWRPdXRwdXQ7CiAgZmluYWwgUmVuYW1lciByZW5hbWVyRm9yTmFtZXM7CgogIGNvbnN0IEphdmFTY3JpcHRQcmludGluZ09wdGlvbnMoCiAgICAgIHt0aGlzLnNob3VsZENvbXByZXNzT3V0cHV0OiBmYWxzZSwKICAgICAgdGhpcy5taW5pZnlMb2NhbFZhcmlhYmxlczogZmFsc2UsCiAgICAgIHRoaXMucHJlZmVyU2VtaWNvbG9uVG9OZXdsaW5lSW5NaW5pZmllZE91dHB1dDogZmFsc2UsCiAgICAgIHRoaXMucmVuYW1lckZvck5hbWVzOiBpZGVudGl0eVJlbmFtZXJ9KTsKCiAgc3RhdGljIFN0cmluZyBpZGVudGl0eVJlbmFtZXIoTmFtZSBuYW1lKSA9PiBuYW1lLm5hbWU7Cn0KCi8vLyBBbiBlbnZpcm9ubWVudCBpbiB3aGljaCBKYXZhU2NyaXB0IHByaW50aW5nIGlzIGRvbmUuICBQcm92aWRlcyBlbWl0dGluZyBvZgovLy8gdGV4dCBhbmQgcHJlLSBhbmQgcG9zdC12aXNpdCBjYWxsYmFja3MuCmFic3RyYWN0IGNsYXNzIEphdmFTY3JpcHRQcmludGluZ0NvbnRleHQgewogIC8vLyBTaWduYWxzIGFuIGVycm9yLiAgVGhpcyBzaG91bGQgaGFwcGVuIG9ubHkgZm9yIHNlcmlvdXMgaW50ZXJuYWwgZXJyb3JzLgogIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKICAgIHRocm93IG1lc3NhZ2U7CiAgfQoKICAvLy8gQWRkcyBbc3RyaW5nXSB0byB0aGUgb3V0cHV0LgogIHZvaWQgZW1pdChTdHJpbmcgc3RyaW5nKTsKCiAgLy8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgcHJpbnRpbmcgb2YgW25vZGVdLiBbc3RhcnRQb3NpdGlvbl0gaXMgdGhlCiAgLy8vIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgb2YgW25vZGVdLgogIC8vLwogIC8vLyBbZW50ZXJOb2RlXSBpcyBjYWxsZWQgaW4gcHJlLXRyYXZlcnNhbCBvcmRlci4KICB2b2lkIGVudGVyTm9kZShOb2RlIG5vZGUsIGludCBzdGFydFBvc2l0aW9uKSB7fQoKICAvLy8gQ2FsbGJhY2sgZm9yIHRoZSBlbmQgb2YgcHJpbnRpbmcgb2YgW25vZGVdLiBbc3RhcnRQb3NpdGlvbl0gaXMgdGhlCiAgLy8vIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgb2YgW25vZGVdIChhbHNvIHByb3ZpZGVkCiAgLy8vIGluIHRoZSBbZW50ZXJOb2RlXSBjYWxsYmFjayksIFtlbmRQb3NpdGlvbl0gaXMgdGhlIHBvc2l0aW9uIGltbWVkaWF0ZWx5CiAgLy8vIGZvbGxvd2luZyB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgW25vZGVdLiBbY2xvc2luZ1Bvc2l0aW9uXSBpcyB0aGUKICAvLy8gcG9zaXRpb24gb2YgdGhlIGVuZGluZyBkZWxpbWl0ZXIgb2YgW25vZGVdLiBUaGlzIGlzIG9ubHkgcHJvdmlkZWQgZm9yCiAgLy8vIFtGdW5dIG5vZGVzIGFuZCBpcyBgbnVsbGAgb3RoZXJ3aXNlLgogIC8vLwogIC8vLyBbZW50ZXJOb2RlXSBpcyBjYWxsZWQgaW4gcG9zdC10cmF2ZXJzYWwgb3JkZXIuCiAgdm9pZCBleGl0Tm9kZSgKICAgICAgTm9kZSBub2RlLCBpbnQgc3RhcnRQb3NpdGlvbiwgaW50IGVuZFBvc2l0aW9uLCBpbnQgY2xvc2luZ1Bvc2l0aW9uKSB7fQp9CgovLy8gQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgW0phdmFTY3JpcHRQcmludGluZ0NvbnRleHRdIHN1aXRhYmxlIGZvciB0ZXN0cy4KY2xhc3MgU2ltcGxlSmF2YVNjcmlwdFByaW50aW5nQ29udGV4dCBleHRlbmRzIEphdmFTY3JpcHRQcmludGluZ0NvbnRleHQgewogIGZpbmFsIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgogIHZvaWQgZW1pdChTdHJpbmcgc3RyaW5nKSB7CiAgICBidWZmZXIud3JpdGUoc3RyaW5nKTsKICB9CgogIFN0cmluZyBnZXRUZXh0KCkgPT4gYnVmZmVyLnRvU3RyaW5nKCk7Cn0KClN0cmluZyBEZWJ1Z1ByaW50KE5vZGUgbm9kZSkgewogIEphdmFTY3JpcHRQcmludGluZ09wdGlvbnMgb3B0aW9ucyA9IG5ldyBKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zKCk7CiAgU2ltcGxlSmF2YVNjcmlwdFByaW50aW5nQ29udGV4dCBjb250ZXh0ID0KICAgICAgbmV3IFNpbXBsZUphdmFTY3JpcHRQcmludGluZ0NvbnRleHQoKTsKICBQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihvcHRpb25zLCBjb250ZXh0KTsKICBwcmludGVyLnZpc2l0KG5vZGUpOwogIHJldHVybiBjb250ZXh0LmdldFRleHQoKTsKfQoKY2xhc3MgUHJpbnRlciBpbXBsZW1lbnRzIE5vZGVWaXNpdG9yIHsKICBmaW5hbCBKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zIG9wdGlvbnM7CiAgZmluYWwgSmF2YVNjcmlwdFByaW50aW5nQ29udGV4dCBjb250ZXh0OwogIGZpbmFsIGJvb2wgc2hvdWxkQ29tcHJlc3NPdXRwdXQ7CiAgZmluYWwgRGFuZ2xpbmdFbHNlVmlzaXRvciBkYW5nbGluZ0Vsc2VWaXNpdG9yOwogIGZpbmFsIExvY2FsTmFtZXIgbG9jYWxOYW1lcjsKCiAgaW50IF9jaGFyQ291bnQgPSAwOwogIGJvb2wgaW5Gb3JJbml0ID0gZmFsc2U7CiAgYm9vbCBhdFN0YXRlbWVudEJlZ2luID0gZmFsc2U7CiAgYm9vbCBwZW5kaW5nU2VtaWNvbG9uID0gZmFsc2U7CiAgYm9vbCBwZW5kaW5nU3BhY2UgPSBmYWxzZTsKCiAgLy8gVGhlIGN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWwuCiAgaW50IF9pbmRlbnRMZXZlbCA9IDA7CiAgLy8gQSBjYWNoZSBvZiBhbGwgaW5kZW50YXRpb24gc3RyaW5ncyB1c2VkIHNvIGZhci4KICBMaXN0PFN0cmluZz4gX2luZGVudExpc3QgPSA8U3RyaW5nPlsiIl07CgogIHN0YXRpYyBmaW5hbCBpZGVudGlmaWVyQ2hhcmFjdGVyUmVnRXhwID0gbmV3IFJlZ0V4cChyJ15bYS16QS1aXzAtOSRdJyk7CiAgc3RhdGljIGZpbmFsIGV4cHJlc3Npb25Db250aW51YXRpb25SZWdFeHAgPSBuZXcgUmVnRXhwKHInXlstKyhbXScpOwoKICBQcmludGVyKEphdmFTY3JpcHRQcmludGluZ09wdGlvbnMgb3B0aW9ucywgSmF2YVNjcmlwdFByaW50aW5nQ29udGV4dCBjb250ZXh0KQogICAgICA6IG9wdGlvbnMgPSBvcHRpb25zLAogICAgICAgIGNvbnRleHQgPSBjb250ZXh0LAogICAgICAgIHNob3VsZENvbXByZXNzT3V0cHV0ID0gb3B0aW9ucy5zaG91bGRDb21wcmVzc091dHB1dCwKICAgICAgICBkYW5nbGluZ0Vsc2VWaXNpdG9yID0gbmV3IERhbmdsaW5nRWxzZVZpc2l0b3IoY29udGV4dCksCiAgICAgICAgbG9jYWxOYW1lciA9IGRldGVybWluZVJlbmFtZXIoCiAgICAgICAgICAgIG9wdGlvbnMuc2hvdWxkQ29tcHJlc3NPdXRwdXQsIG9wdGlvbnMubWluaWZ5TG9jYWxWYXJpYWJsZXMpOwoKICBzdGF0aWMgTG9jYWxOYW1lciBkZXRlcm1pbmVSZW5hbWVyKAogICAgICBib29sIHNob3VsZENvbXByZXNzT3V0cHV0LCBib29sIGFsbG93VmFyaWFibGVNaW5pZmljYXRpb24pIHsKICAgIHJldHVybiAoc2hvdWxkQ29tcHJlc3NPdXRwdXQgJiYgYWxsb3dWYXJpYWJsZU1pbmlmaWNhdGlvbikKICAgICAgICA/IG5ldyBNaW5pZnlSZW5hbWVyKCkKICAgICAgICA6IG5ldyBJZGVudGl0eU5hbWVyKCk7CiAgfQoKICAvLyBUaGUgY3VycmVudCBpbmRlbnRhdGlvbiBzdHJpbmcuCiAgU3RyaW5nIGdldCBpbmRlbnRhdGlvbiB7CiAgICAvLyBMYXppbHkgYWRkIG5ldyBpbmRlbnRhdGlvbiBzdHJpbmdzIGFzIHJlcXVpcmVkLgogICAgd2hpbGUgKF9pbmRlbnRMaXN0Lmxlbmd0aCA8PSBfaW5kZW50TGV2ZWwpIHsKICAgICAgX2luZGVudExpc3QuYWRkKF9pbmRlbnRMaXN0Lmxhc3QgKyAiICAiKTsKICAgIH0KICAgIHJldHVybiBfaW5kZW50TGlzdFtfaW5kZW50TGV2ZWxdOwogIH0KCiAgdm9pZCBpbmRlbnRNb3JlKCkgewogICAgX2luZGVudExldmVsKys7CiAgfQoKICB2b2lkIGluZGVudExlc3MoKSB7CiAgICBfaW5kZW50TGV2ZWwtLTsKICB9CgogIC8vLyBBbHdheXMgZW1pdCBhIG5ld2xpbmUsIGV2ZW4gdW5kZXIgYGVuYWJsZU1pbmlmaWNhdGlvbmAuCiAgdm9pZCBmb3JjZUxpbmUoKSB7CiAgICBvdXQoIlxuIiwgaXNXaGl0ZXNwYWNlOiB0cnVlKTsKICB9CgogIC8vLyBFbWl0cyBhIG5ld2xpbmUgZm9yIHJlYWRhYmlsaXR5LgogIHZvaWQgbGluZU91dCgpIHsKICAgIGlmICghc2hvdWxkQ29tcHJlc3NPdXRwdXQpIGZvcmNlTGluZSgpOwogIH0KCiAgdm9pZCBzcGFjZU91dCgpIHsKICAgIGlmICghc2hvdWxkQ29tcHJlc3NPdXRwdXQpIG91dCgiICIsIGlzV2hpdGVzcGFjZTogdHJ1ZSk7CiAgfQoKICBTdHJpbmcgbGFzdEFkZGVkU3RyaW5nID0gbnVsbDsKCiAgaW50IGdldCBsYXN0Q2hhckNvZGUgewogICAgaWYgKGxhc3RBZGRlZFN0cmluZyA9PSBudWxsKSByZXR1cm4gMDsKICAgIGFzc2VydChsYXN0QWRkZWRTdHJpbmcubGVuZ3RoICE9IDApOwogICAgcmV0dXJuIGxhc3RBZGRlZFN0cmluZy5jb2RlVW5pdEF0KGxhc3RBZGRlZFN0cmluZy5sZW5ndGggLSAxKTsKICB9CgogIHZvaWQgb3V0KFN0cmluZyBzdHIsIHtib29sIGlzV2hpdGVzcGFjZTogZmFsc2V9KSB7CiAgICBpZiAoc3RyICE9ICIiKSB7CiAgICAgIGlmIChwZW5kaW5nU2VtaWNvbG9uKSB7CiAgICAgICAgaWYgKCFzaG91bGRDb21wcmVzc091dHB1dCkgewogICAgICAgICAgX2VtaXQoIjsiKTsKICAgICAgICB9IGVsc2UgaWYgKHN0ciAhPSAifSIpIHsKICAgICAgICAgIC8vIFdlIHdhbnQgdG8gb3V0cHV0IG5ld2xpbmUgaW5zdGVhZCBvZiBzZW1pY29sb24gYmVjYXVzZSBpdCBtYWtlcwogICAgICAgICAgLy8gdGhlIHJhdyBzdGFjayB0cmFjZXMgbXVjaCBlYXNpZXIgdG8gcmVhZCBhbmQgaXQgYWxzbyBtYWtlcyBsaW5lLQogICAgICAgICAgLy8gYmFzZWQgdG9vbHMgbGlrZSBkaWZmIHdvcmsgbXVjaCBiZXR0ZXIuICBKYXZhU2NyaXB0IHdpbGwKICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgaW5zZXJ0IHRoZSBzZW1pY29sb24gYXQgdGhlIG5ld2xpbmUgaWYgaXQgbWVhbnMgYQogICAgICAgICAgLy8gcGFyc2luZyBlcnJvciBpcyBhdm9pZGVkLCBzbyB3ZSBjYW4gb25seSBkbyB0aGlzIHRyaWNrIGlmIHRoZQogICAgICAgICAgLy8gbmV4dCBsaW5lIGlzIG5vdCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgZ2x1ZWQgb250byBhIHZhbGlkCiAgICAgICAgICAvLyBleHByZXNzaW9uIHRvIG1ha2UgYSBuZXcgdmFsaWQgZXhwcmVzc2lvbi4KCiAgICAgICAgICAvLyBJZiB3ZSdyZSB1c2luZyB0aGUgbmV3IGVtaXR0ZXIgd2hlcmUgbW9zdCBwcmV0dHkgcHJpbnRlZCBjb2RlCiAgICAgICAgICAvLyBpcyBlc2NhcGVkIGluIHN0cmluZ3MsIGl0IGlzIGEgbG90IGVhc2llciB0byBkZWFsIHdpdGggc2VtaWNvbG9ucwogICAgICAgICAgLy8gdGhhbiBuZXdsaW5lcyBiZWNhdXNlIHRoZSBmb3JtZXIgZG9lc24ndCBuZWVkIGVzY2FwaW5nLgogICAgICAgICAgaWYgKG9wdGlvbnMucHJlZmVyU2VtaWNvbG9uVG9OZXdsaW5lSW5NaW5pZmllZE91dHB1dCB8fAogICAgICAgICAgICAgIGV4cHJlc3Npb25Db250aW51YXRpb25SZWdFeHAuaGFzTWF0Y2goc3RyKSkgewogICAgICAgICAgICBfZW1pdCgiOyIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX2VtaXQoIlxuIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwZW5kaW5nU3BhY2UgJiYKICAgICAgICAgICghc2hvdWxkQ29tcHJlc3NPdXRwdXQgfHwgaWRlbnRpZmllckNoYXJhY3RlclJlZ0V4cC5oYXNNYXRjaChzdHIpKSkgewogICAgICAgIF9lbWl0KCIgIik7CiAgICAgIH0KICAgICAgcGVuZGluZ1NwYWNlID0gZmFsc2U7CiAgICAgIHBlbmRpbmdTZW1pY29sb24gPSBmYWxzZTsKICAgICAgaWYgKCFpc1doaXRlc3BhY2UpIHsKICAgICAgICBlbnRlck5vZGUoKTsKICAgICAgfQogICAgICBfZW1pdChzdHIpOwogICAgICBsYXN0QWRkZWRTdHJpbmcgPSBzdHI7CiAgICB9CiAgfQoKICB2b2lkIG91dExuKFN0cmluZyBzdHIpIHsKICAgIG91dChzdHIpOwogICAgbGluZU91dCgpOwogIH0KCiAgdm9pZCBvdXRTZW1pY29sb25MbigpIHsKICAgIGlmIChzaG91bGRDb21wcmVzc091dHB1dCkgewogICAgICBwZW5kaW5nU2VtaWNvbG9uID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIG91dCgiOyIpOwogICAgICBmb3JjZUxpbmUoKTsKICAgIH0KICB9CgogIHZvaWQgb3V0SW5kZW50KFN0cmluZyBzdHIpIHsKICAgIGluZGVudCgpOwogICAgb3V0KHN0cik7CiAgfQoKICB2b2lkIG91dEluZGVudExuKFN0cmluZyBzdHIpIHsKICAgIGluZGVudCgpOwogICAgb3V0TG4oc3RyKTsKICB9CgogIHZvaWQgaW5kZW50KCkgewogICAgaWYgKCFzaG91bGRDb21wcmVzc091dHB1dCkgewogICAgICBvdXQoaW5kZW50YXRpb24sIGlzV2hpdGVzcGFjZTogdHJ1ZSk7CiAgICB9CiAgfQoKICBFbnRlckV4aXROb2RlIGN1cnJlbnROb2RlOwoKICB2b2lkIF9lbWl0KFN0cmluZyB0ZXh0KSB7CiAgICBjb250ZXh0LmVtaXQodGV4dCk7CiAgICBfY2hhckNvdW50ICs9IHRleHQubGVuZ3RoOwogIH0KCiAgdm9pZCBzdGFydE5vZGUoTm9kZSBub2RlKSB7CiAgICBjdXJyZW50Tm9kZSA9IG5ldyBFbnRlckV4aXROb2RlKGN1cnJlbnROb2RlLCBub2RlKTsKICAgIGlmIChub2RlIGlzIERlZmVycmVkRXhwcmVzc2lvbikgewogICAgICBzdGFydE5vZGUobm9kZS52YWx1ZSk7CiAgICB9CiAgfQoKICB2b2lkIGVudGVyTm9kZSgpIHsKICAgIGN1cnJlbnROb2RlLmFkZFRvTm9kZShjb250ZXh0LCBfY2hhckNvdW50KTsKICB9CgogIHZvaWQgZW5kTm9kZShOb2RlIG5vZGUpIHsKICAgIGlmIChub2RlIGlzIERlZmVycmVkRXhwcmVzc2lvbikgewogICAgICBlbmROb2RlKG5vZGUudmFsdWUpOwogICAgfQogICAgYXNzZXJ0KGN1cnJlbnROb2RlLm5vZGUgPT0gbm9kZSk7CiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmV4aXROb2RlKGNvbnRleHQsIF9jaGFyQ291bnQpOwogIH0KCiAgdm9pZCB2aXNpdChOb2RlIG5vZGUpIHsKICAgIHN0YXJ0Tm9kZShub2RlKTsKICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogICAgZW5kTm9kZShub2RlKTsKICB9CgogIHZvaWQgdmlzaXRDb21tYVNlcGFyYXRlZChMaXN0PE5vZGU+IG5vZGVzLCBpbnQgaGFzUmVxdWlyZWRUeXBlLAogICAgICB7Ym9vbCBuZXdJbkZvckluaXQsIGJvb2wgbmV3QXRTdGF0ZW1lbnRCZWdpbn0pIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGkgIT0gMCkgewogICAgICAgIGF0U3RhdGVtZW50QmVnaW4gPSBmYWxzZTsKICAgICAgICBvdXQoIiwiKTsKICAgICAgICBzcGFjZU91dCgpOwogICAgICB9CiAgICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihub2Rlc1tpXSwgaGFzUmVxdWlyZWRUeXBlLAogICAgICAgICAgbmV3SW5Gb3JJbml0OiBuZXdJbkZvckluaXQsIG5ld0F0U3RhdGVtZW50QmVnaW46IG5ld0F0U3RhdGVtZW50QmVnaW4pOwogICAgfQogIH0KCiAgdm9pZCB2aXNpdEFsbChMaXN0PE5vZGU+IG5vZGVzKSB7CiAgICBub2Rlcy5mb3JFYWNoKHZpc2l0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQcm9ncmFtKFByb2dyYW0gcHJvZ3JhbSkgewogICAgaWYgKHByb2dyYW0uYm9keS5pc05vdEVtcHR5KSB7CiAgICAgIHZpc2l0QWxsKHByb2dyYW0uYm9keSk7CiAgICB9CiAgfQoKICBTdGF0ZW1lbnQgdW53cmFwQmxvY2tJZlNpbmdsZVN0YXRlbWVudChTdGF0ZW1lbnQgYm9keSkgewogICAgU3RhdGVtZW50IHJlc3VsdCA9IGJvZHk7CiAgICB3aGlsZSAocmVzdWx0IGlzIEJsb2NrKSB7CiAgICAgIEJsb2NrIGJsb2NrID0gcmVzdWx0OwogICAgICBpZiAoYmxvY2suc3RhdGVtZW50cy5sZW5ndGggIT0gMSkgYnJlYWs7CiAgICAgIHJlc3VsdCA9IGJsb2NrLnN0YXRlbWVudHMuc2luZ2xlOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGJvb2wgYmxvY2tCb2R5KFN0YXRlbWVudCBib2R5LCB7Ym9vbCBuZWVkc1NlcGFyYXRpb24sIGJvb2wgbmVlZHNOZXdsaW5lfSkgewogICAgaWYgKGJvZHkgaXMgQmxvY2spIHsKICAgICAgc3BhY2VPdXQoKTsKICAgICAgYmxvY2tPdXQoYm9keSwgc2hvdWxkSW5kZW50OiBmYWxzZSwgbmVlZHNOZXdsaW5lOiBuZWVkc05ld2xpbmUpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChzaG91bGRDb21wcmVzc091dHB1dCAmJiBuZWVkc1NlcGFyYXRpb24pIHsKICAgICAgLy8gSWYgW3Nob3VsZENvbXByZXNzT3V0cHV0XSBpcyBmYWxzZSwgdGhlbiB0aGUgJ2xpbmVPdXQnIHdpbGwgaW5zZXJ0CiAgICAgIC8vIHRoZSBzZXBhcmF0aW9uLgogICAgICBvdXQoIiAiLCBpc1doaXRlc3BhY2U6IHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgbGluZU91dCgpOwogICAgfQogICAgaW5kZW50TW9yZSgpOwogICAgdmlzaXQoYm9keSk7CiAgICBpbmRlbnRMZXNzKCk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIGJsb2NrT3V0V2l0aG91dEJyYWNlcyhOb2RlIG5vZGUpIHsKICAgIGlmIChub2RlIGlzIEJsb2NrKSB7CiAgICAgIHN0YXJ0Tm9kZShub2RlKTsKICAgICAgQmxvY2sgYmxvY2sgPSBub2RlOwogICAgICBibG9jay5zdGF0ZW1lbnRzLmZvckVhY2goYmxvY2tPdXRXaXRob3V0QnJhY2VzKTsKICAgICAgZW5kTm9kZShub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIHZpc2l0KG5vZGUpOwogICAgfQogIH0KCiAgaW50IGJsb2NrT3V0KEJsb2NrIG5vZGUsIHtib29sIHNob3VsZEluZGVudCwgYm9vbCBuZWVkc05ld2xpbmV9KSB7CiAgICBpZiAoc2hvdWxkSW5kZW50KSBpbmRlbnQoKTsKICAgIHN0YXJ0Tm9kZShub2RlKTsKICAgIG91dCgieyIpOwogICAgbGluZU91dCgpOwogICAgaW5kZW50TW9yZSgpOwogICAgbm9kZS5zdGF0ZW1lbnRzLmZvckVhY2goYmxvY2tPdXRXaXRob3V0QnJhY2VzKTsKICAgIGluZGVudExlc3MoKTsKICAgIGluZGVudCgpOwogICAgb3V0KCJ9Iik7CiAgICBpbnQgY2xvc2luZ1Bvc2l0aW9uID0gX2NoYXJDb3VudCAtIDE7CiAgICBlbmROb2RlKG5vZGUpOwogICAgaWYgKG5lZWRzTmV3bGluZSkgbGluZU91dCgpOwogICAgcmV0dXJuIGNsb3NpbmdQb3NpdGlvbjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCbG9jayhCbG9jayBibG9jaykgewogICAgYmxvY2tPdXQoYmxvY2ssIHNob3VsZEluZGVudDogdHJ1ZSwgbmVlZHNOZXdsaW5lOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgaW5kZW50KCk7CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCBFWFBSRVNTSU9OLAogICAgICAgIG5ld0luRm9ySW5pdDogZmFsc2UsIG5ld0F0U3RhdGVtZW50QmVnaW46IHRydWUpOwogICAgb3V0U2VtaWNvbG9uTG4oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlKSB7CiAgICBvdXRJbmRlbnRMbigiOyIpOwogIH0KCiAgdm9pZCBpZk91dChJZiBub2RlLCBib29sIHNob3VsZEluZGVudCkgewogICAgU3RhdGVtZW50IHRoZW4gPSB1bndyYXBCbG9ja0lmU2luZ2xlU3RhdGVtZW50KG5vZGUudGhlbik7CiAgICBTdGF0ZW1lbnQgZWxzZVBhcnQgPSBub2RlLm90aGVyd2lzZTsKICAgIGJvb2wgaGFzRWxzZSA9IG5vZGUuaGFzRWxzZTsKCiAgICAvLyBIYW5kbGUgZGFuZ2xpbmcgZWxzZXMgYW5kIGEgd29yay1hcm91bmQgZm9yIEFuZHJvaWQgNC4wIHN0b2NrIGJyb3dzZXIuCiAgICAvLyBBbmRyb2lkIDQuMCByZXF1aXJlcyBicmFjZXMgZm9yIGEgc2luZ2xlIGRvLXdoaWxlIGluIHRoZSBgdGhlbmAgYnJhbmNoLgogICAgLy8gU2VlIGlzc3VlIDEwOTIzLgogICAgaWYgKGhhc0Vsc2UpIHsKICAgICAgYm9vbCBuZWVkc0JyYWNlcyA9IHRoZW4uYWNjZXB0KGRhbmdsaW5nRWxzZVZpc2l0b3IpIHx8IHRoZW4gaXMgRG87CiAgICAgIGlmIChuZWVkc0JyYWNlcykgewogICAgICAgIHRoZW4gPSBuZXcgQmxvY2soPFN0YXRlbWVudD5bdGhlbl0pOwogICAgICB9CiAgICB9CiAgICBpZiAoc2hvdWxkSW5kZW50KSBpbmRlbnQoKTsKICAgIG91dCgiaWYiKTsKICAgIHNwYWNlT3V0KCk7CiAgICBvdXQoIigiKTsKICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihub2RlLmNvbmRpdGlvbiwgRVhQUkVTU0lPTiwKICAgICAgICBuZXdJbkZvckluaXQ6IGZhbHNlLCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgICBvdXQoIikiKTsKICAgIGJvb2wgdGhlbldhc0Jsb2NrID0KICAgICAgICBibG9ja0JvZHkodGhlbiwgbmVlZHNTZXBhcmF0aW9uOiBmYWxzZSwgbmVlZHNOZXdsaW5lOiAhaGFzRWxzZSk7CiAgICBpZiAoaGFzRWxzZSkgewogICAgICBpZiAodGhlbldhc0Jsb2NrKSB7CiAgICAgICAgc3BhY2VPdXQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbmRlbnQoKTsKICAgICAgfQogICAgICBvdXQoImVsc2UiKTsKICAgICAgaWYgKGVsc2VQYXJ0IGlzIElmKSB7CiAgICAgICAgcGVuZGluZ1NwYWNlID0gdHJ1ZTsKICAgICAgICBzdGFydE5vZGUoZWxzZVBhcnQpOwogICAgICAgIGlmT3V0KGVsc2VQYXJ0LCBmYWxzZSk7CiAgICAgICAgZW5kTm9kZShlbHNlUGFydCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmxvY2tCb2R5KHVud3JhcEJsb2NrSWZTaW5nbGVTdGF0ZW1lbnQoZWxzZVBhcnQpLAogICAgICAgICAgICBuZWVkc1NlcGFyYXRpb246IHRydWUsIG5lZWRzTmV3bGluZTogdHJ1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJZihJZiBub2RlKSB7CiAgICBpZk91dChub2RlLCB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGb3IoRm9yIGxvb3ApIHsKICAgIG91dEluZGVudCgiZm9yIik7CiAgICBzcGFjZU91dCgpOwogICAgb3V0KCIoIik7CiAgICBpZiAobG9vcC5pbml0ICE9IG51bGwpIHsKICAgICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKGxvb3AuaW5pdCwgRVhQUkVTU0lPTiwKICAgICAgICAgIG5ld0luRm9ySW5pdDogdHJ1ZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgfQogICAgb3V0KCI7Iik7CiAgICBpZiAobG9vcC5jb25kaXRpb24gIT0gbnVsbCkgewogICAgICBzcGFjZU91dCgpOwogICAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obG9vcC5jb25kaXRpb24sIEVYUFJFU1NJT04sCiAgICAgICAgICBuZXdJbkZvckluaXQ6IGZhbHNlLCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgICB9CiAgICBvdXQoIjsiKTsKICAgIGlmIChsb29wLnVwZGF0ZSAhPSBudWxsKSB7CiAgICAgIHNwYWNlT3V0KCk7CiAgICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihsb29wLnVwZGF0ZSwgRVhQUkVTU0lPTiwKICAgICAgICAgIG5ld0luRm9ySW5pdDogZmFsc2UsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgIH0KICAgIG91dCgiKSIpOwogICAgYmxvY2tCb2R5KHVud3JhcEJsb2NrSWZTaW5nbGVTdGF0ZW1lbnQobG9vcC5ib2R5KSwKICAgICAgICBuZWVkc1NlcGFyYXRpb246IGZhbHNlLCBuZWVkc05ld2xpbmU6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZvckluKEZvckluIGxvb3ApIHsKICAgIG91dEluZGVudCgiZm9yIik7CiAgICBzcGFjZU91dCgpOwogICAgb3V0KCIoIik7CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obG9vcC5sZWZ0SGFuZFNpZGUsIEVYUFJFU1NJT04sCiAgICAgICAgbmV3SW5Gb3JJbml0OiB0cnVlLCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgICBvdXQoIiBpbiIpOwogICAgcGVuZGluZ1NwYWNlID0gdHJ1ZTsKICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihsb29wLm9iamVjdCwgRVhQUkVTU0lPTiwKICAgICAgICBuZXdJbkZvckluaXQ6IGZhbHNlLCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgICBvdXQoIikiKTsKICAgIGJsb2NrQm9keSh1bndyYXBCbG9ja0lmU2luZ2xlU3RhdGVtZW50KGxvb3AuYm9keSksCiAgICAgICAgbmVlZHNTZXBhcmF0aW9uOiBmYWxzZSwgbmVlZHNOZXdsaW5lOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRXaGlsZShXaGlsZSBsb29wKSB7CiAgICBvdXRJbmRlbnQoIndoaWxlIik7CiAgICBzcGFjZU91dCgpOwogICAgb3V0KCIoIik7CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obG9vcC5jb25kaXRpb24sIEVYUFJFU1NJT04sCiAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgb3V0KCIpIik7CiAgICBibG9ja0JvZHkodW53cmFwQmxvY2tJZlNpbmdsZVN0YXRlbWVudChsb29wLmJvZHkpLAogICAgICAgIG5lZWRzU2VwYXJhdGlvbjogZmFsc2UsIG5lZWRzTmV3bGluZTogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RG8oRG8gbG9vcCkgewogICAgb3V0SW5kZW50KCJkbyIpOwogICAgaWYgKGJsb2NrQm9keSh1bndyYXBCbG9ja0lmU2luZ2xlU3RhdGVtZW50KGxvb3AuYm9keSksCiAgICAgICAgbmVlZHNTZXBhcmF0aW9uOiB0cnVlLCBuZWVkc05ld2xpbmU6IGZhbHNlKSkgewogICAgICBzcGFjZU91dCgpOwogICAgfSBlbHNlIHsKICAgICAgaW5kZW50KCk7CiAgICB9CiAgICBvdXQoIndoaWxlIik7CiAgICBzcGFjZU91dCgpOwogICAgb3V0KCIoIik7CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obG9vcC5jb25kaXRpb24sIEVYUFJFU1NJT04sCiAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgb3V0KCIpIik7CiAgICBvdXRTZW1pY29sb25MbigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnRpbnVlKENvbnRpbnVlIG5vZGUpIHsKICAgIGlmIChub2RlLnRhcmdldExhYmVsID09IG51bGwpIHsKICAgICAgb3V0SW5kZW50KCJjb250aW51ZSIpOwogICAgfSBlbHNlIHsKICAgICAgb3V0SW5kZW50KCJjb250aW51ZSAke25vZGUudGFyZ2V0TGFiZWx9Iik7CiAgICB9CiAgICBvdXRTZW1pY29sb25MbigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJyZWFrKEJyZWFrIG5vZGUpIHsKICAgIGlmIChub2RlLnRhcmdldExhYmVsID09IG51bGwpIHsKICAgICAgb3V0SW5kZW50KCJicmVhayIpOwogICAgfSBlbHNlIHsKICAgICAgb3V0SW5kZW50KCJicmVhayAke25vZGUudGFyZ2V0TGFiZWx9Iik7CiAgICB9CiAgICBvdXRTZW1pY29sb25MbigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJldHVybihSZXR1cm4gbm9kZSkgewogICAgaWYgKG5vZGUudmFsdWUgPT0gbnVsbCkgewogICAgICBvdXRJbmRlbnQoInJldHVybiIpOwogICAgfSBlbHNlIHsKICAgICAgb3V0SW5kZW50KCJyZXR1cm4iKTsKICAgICAgcGVuZGluZ1NwYWNlID0gdHJ1ZTsKICAgICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKG5vZGUudmFsdWUsIEVYUFJFU1NJT04sCiAgICAgICAgICBuZXdJbkZvckluaXQ6IGZhbHNlLCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgICB9CiAgICAvLyBTZXQgdGhlIGNsb3NpbmcgcG9zaXRpb24gdG8gYmUgYmVmb3JlIHRoZSBvcHRpb25hbCBzZW1pY29sb24uCiAgICBjdXJyZW50Tm9kZS5jbG9zaW5nUG9zaXRpb24gPSBfY2hhckNvdW50OwogICAgb3V0U2VtaWNvbG9uTG4oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREYXJ0WWllbGQoRGFydFlpZWxkIG5vZGUpIHsKICAgIGlmIChub2RlLmhhc1N0YXIpIHsKICAgICAgb3V0SW5kZW50KCJ5aWVsZCoiKTsKICAgIH0gZWxzZSB7CiAgICAgIG91dEluZGVudCgieWllbGQiKTsKICAgIH0KICAgIHBlbmRpbmdTcGFjZSA9IHRydWU7CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCBFWFBSRVNTSU9OLAogICAgICAgIG5ld0luRm9ySW5pdDogZmFsc2UsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgIG91dFNlbWljb2xvbkxuKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGhyb3coVGhyb3cgbm9kZSkgewogICAgb3V0SW5kZW50KCJ0aHJvdyIpOwogICAgcGVuZGluZ1NwYWNlID0gdHJ1ZTsKICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24sIEVYUFJFU1NJT04sCiAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgb3V0U2VtaWNvbG9uTG4oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUcnkoVHJ5IG5vZGUpIHsKICAgIG91dEluZGVudCgidHJ5Iik7CiAgICBibG9ja0JvZHkobm9kZS5ib2R5LCBuZWVkc1NlcGFyYXRpb246IHRydWUsIG5lZWRzTmV3bGluZTogZmFsc2UpOwogICAgaWYgKG5vZGUuY2F0Y2hQYXJ0ICE9IG51bGwpIHsKICAgICAgdmlzaXQobm9kZS5jYXRjaFBhcnQpOwogICAgfQogICAgaWYgKG5vZGUuZmluYWxseVBhcnQgIT0gbnVsbCkgewogICAgICBzcGFjZU91dCgpOwogICAgICBvdXQoImZpbmFsbHkiKTsKICAgICAgYmxvY2tCb2R5KG5vZGUuZmluYWxseVBhcnQsIG5lZWRzU2VwYXJhdGlvbjogdHJ1ZSwgbmVlZHNOZXdsaW5lOiB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpbmVPdXQoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDYXRjaChDYXRjaCBub2RlKSB7CiAgICBzcGFjZU91dCgpOwogICAgb3V0KCJjYXRjaCIpOwogICAgc3BhY2VPdXQoKTsKICAgIG91dCgiKCIpOwogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKG5vZGUuZGVjbGFyYXRpb24sIEVYUFJFU1NJT04sCiAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgb3V0KCIpIik7CiAgICBibG9ja0JvZHkobm9kZS5ib2R5LCBuZWVkc1NlcGFyYXRpb246IGZhbHNlLCBuZWVkc05ld2xpbmU6IGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTd2l0Y2goU3dpdGNoIG5vZGUpIHsKICAgIG91dEluZGVudCgic3dpdGNoIik7CiAgICBzcGFjZU91dCgpOwogICAgb3V0KCIoIik7CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obm9kZS5rZXksIEVYUFJFU1NJT04sCiAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgb3V0KCIpIik7CiAgICBzcGFjZU91dCgpOwogICAgb3V0TG4oInsiKTsKICAgIGluZGVudE1vcmUoKTsKICAgIHZpc2l0QWxsKG5vZGUuY2FzZXMpOwogICAgaW5kZW50TGVzcygpOwogICAgb3V0SW5kZW50TG4oIn0iKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDYXNlKENhc2Ugbm9kZSkgewogICAgb3V0SW5kZW50KCJjYXNlIik7CiAgICBwZW5kaW5nU3BhY2UgPSB0cnVlOwogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbiwgRVhQUkVTU0lPTiwKICAgICAgICBuZXdJbkZvckluaXQ6IGZhbHNlLCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgICBvdXRMbigiOiIpOwogICAgaWYgKCFub2RlLmJvZHkuc3RhdGVtZW50cy5pc0VtcHR5KSB7CiAgICAgIGluZGVudE1vcmUoKTsKICAgICAgYmxvY2tPdXRXaXRob3V0QnJhY2VzKG5vZGUuYm9keSk7CiAgICAgIGluZGVudExlc3MoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREZWZhdWx0KERlZmF1bHQgbm9kZSkgewogICAgb3V0SW5kZW50TG4oImRlZmF1bHQ6Iik7CiAgICBpZiAoIW5vZGUuYm9keS5zdGF0ZW1lbnRzLmlzRW1wdHkpIHsKICAgICAgaW5kZW50TW9yZSgpOwogICAgICBibG9ja091dFdpdGhvdXRCcmFjZXMobm9kZS5ib2R5KTsKICAgICAgaW5kZW50TGVzcygpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAgICBTdGF0ZW1lbnQgYm9keSA9IHVud3JhcEJsb2NrSWZTaW5nbGVTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICAgIC8vIGBsYWJlbDogYnJlYWsgbGFiZWw7YAogICAgLy8gRG9lcyBub3Qgd29yayBvbiBJRS4gVGhlIHN0YXRlbWVudCBpcyBhIG5vcCwgc28gcmVwbGFjZSBpdCBieSBhbiBlbXB0eQogICAgLy8gc3RhdGVtZW50LgogICAgLy8gU2VlOgogICAgLy8gaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy84OTE4ODkvcGFyc2VyLWJ1Z3MKICAgIGlmIChib2R5IGlzIEJyZWFrICYmIGJvZHkudGFyZ2V0TGFiZWwgPT0gbm9kZS5sYWJlbCkgewogICAgICB2aXNpdChuZXcgRW1wdHlTdGF0ZW1lbnQoKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIG91dEluZGVudCgiJHtub2RlLmxhYmVsfToiKTsKICAgIGJsb2NrQm9keShib2R5LCBuZWVkc1NlcGFyYXRpb246IGZhbHNlLCBuZWVkc05ld2xpbmU6IHRydWUpOwogIH0KCiAgaW50IGZ1bmN0aW9uT3V0KEZ1biBmdW4sIE5vZGUgbmFtZSwgVmFyQ29sbGVjdG9yIHZhcnMpIHsKICAgIG91dCgiZnVuY3Rpb24iKTsKICAgIGlmIChuYW1lICE9IG51bGwpIHsKICAgICAgb3V0KCIgIik7CiAgICAgIC8vIE5hbWUgbXVzdCBiZSBhIFtEZWNsXS4gVGhlcmVmb3JlIG9ubHkgdGVzdCBmb3IgcHJpbWFyeSBleHByZXNzaW9ucy4KICAgICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKG5hbWUsIFBSSU1BUlksCiAgICAgICAgICBuZXdJbkZvckluaXQ6IGZhbHNlLCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgICB9CiAgICBsb2NhbE5hbWVyLmVudGVyU2NvcGUodmFycyk7CiAgICBvdXQoIigiKTsKICAgIGlmIChmdW4ucGFyYW1zICE9IG51bGwpIHsKICAgICAgdmlzaXRDb21tYVNlcGFyYXRlZChmdW4ucGFyYW1zLCBQUklNQVJZLAogICAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgfQogICAgb3V0KCIpIik7CiAgICBzd2l0Y2ggKGZ1bi5hc3luY01vZGlmaWVyKSB7CiAgICAgIGNhc2UgQXN5bmNNb2RpZmllci5zeW5jOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEFzeW5jTW9kaWZpZXIuYXN5bmM6CiAgICAgICAgb3V0KCcgJywgaXNXaGl0ZXNwYWNlOiB0cnVlKTsKICAgICAgICBvdXQoJ2FzeW5jJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQXN5bmNNb2RpZmllci5zeW5jU3RhcjoKICAgICAgICBvdXQoJyAnLCBpc1doaXRlc3BhY2U6IHRydWUpOwogICAgICAgIG91dCgnc3luYyonKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBBc3luY01vZGlmaWVyLmFzeW5jU3RhcjoKICAgICAgICBvdXQoJyAnLCBpc1doaXRlc3BhY2U6IHRydWUpOwogICAgICAgIG91dCgnYXN5bmMqJyk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBzcGFjZU91dCgpOwogICAgaW50IGNsb3NpbmdQb3NpdGlvbiA9CiAgICAgICAgYmxvY2tPdXQoZnVuLmJvZHksIHNob3VsZEluZGVudDogZmFsc2UsIG5lZWRzTmV3bGluZTogZmFsc2UpOwogICAgbG9jYWxOYW1lci5sZWF2ZVNjb3BlKCk7CiAgICByZXR1cm4gY2xvc2luZ1Bvc2l0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICAgIFZhckNvbGxlY3RvciB2YXJzID0gbmV3IFZhckNvbGxlY3RvcigpOwogICAgdmFycy52aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pOwogICAgaW5kZW50KCk7CiAgICBzdGFydE5vZGUoZGVjbGFyYXRpb24uZnVuY3Rpb24pOwogICAgY3VycmVudE5vZGUuY2xvc2luZ1Bvc2l0aW9uID0KICAgICAgICBmdW5jdGlvbk91dChkZWNsYXJhdGlvbi5mdW5jdGlvbiwgZGVjbGFyYXRpb24ubmFtZSwgdmFycyk7CiAgICBlbmROb2RlKGRlY2xhcmF0aW9uLmZ1bmN0aW9uKTsKICAgIGxpbmVPdXQoKTsKICB9CgogIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUsIGludCByZXF1aXJlZFByZWNlZGVuY2UsCiAgICAgIHtib29sIG5ld0luRm9ySW5pdCwgYm9vbCBuZXdBdFN0YXRlbWVudEJlZ2lufSkgewogICAgYm9vbCBuZWVkc1BhcmVudGhlc2VzID0KICAgICAgICAvLyBhIC0gKGIgKyBjKS4KICAgICAgICAocmVxdWlyZWRQcmVjZWRlbmNlICE9IEVYUFJFU1NJT04gJiYKICAgICAgICAgICAgICAgIG5vZGUucHJlY2VkZW5jZUxldmVsIDwgcmVxdWlyZWRQcmVjZWRlbmNlKSB8fAogICAgICAgICAgICAvLyBmb3IgKGEgPSAoeCBpbiBvKTsgLi4uIDsgLi4uICkgeyAuLi4gfQogICAgICAgICAgICAobmV3SW5Gb3JJbml0ICYmIG5vZGUgaXMgQmluYXJ5ICYmIG5vZGUub3AgPT0gImluIikgfHwKICAgICAgICAgICAgLy8gKGZ1bmN0aW9uKCkgeyAuLi4gfSkoKS4KICAgICAgICAgICAgLy8gKHthOiAyLCBiOiAzfS50b1N0cmluZygpKS4KICAgICAgICAgICAgKG5ld0F0U3RhdGVtZW50QmVnaW4gJiYKICAgICAgICAgICAgICAgIChub2RlIGlzIE5hbWVkRnVuY3Rpb24gfHwKICAgICAgICAgICAgICAgICAgICBub2RlIGlzIEZ1biB8fAogICAgICAgICAgICAgICAgICAgIG5vZGUgaXMgT2JqZWN0SW5pdGlhbGl6ZXIpKTsKICAgIGlmIChuZWVkc1BhcmVudGhlc2VzKSB7CiAgICAgIGluRm9ySW5pdCA9IGZhbHNlOwogICAgICBhdFN0YXRlbWVudEJlZ2luID0gZmFsc2U7CiAgICAgIG91dCgiKCIpOwogICAgICB2aXNpdChub2RlKTsKICAgICAgb3V0KCIpIik7CiAgICB9IGVsc2UgewogICAgICBpbkZvckluaXQgPSBuZXdJbkZvckluaXQ7CiAgICAgIGF0U3RhdGVtZW50QmVnaW4gPSBuZXdBdFN0YXRlbWVudEJlZ2luOwogICAgICB2aXNpdChub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QgbGlzdCkgewogICAgb3V0KCJ2YXIgIik7CiAgICBMaXN0PE5vZGU+IG5vZGVzID0gbGlzdC5kZWNsYXJhdGlvbnM7CiAgICBpZiAoaW5Gb3JJbml0KSB7CiAgICAgIHZpc2l0Q29tbWFTZXBhcmF0ZWQobm9kZXMsIEFTU0lHTk1FTlQsCiAgICAgICAgICBuZXdJbkZvckluaXQ6IGluRm9ySW5pdCwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgfSBlbHNlIHsKICAgICAgLy8gUHJpbnQgJ2JpZycgZGVjbGFyYXRpb25zIG9uIHRoZWlyIG93biBsaW5lLCB3aGlsZSBrZWVwaW5nIGFkamFjZW50CiAgICAgIC8vIHNtYWxsIGFuZCB1bmluaXRpYWxpemVkIGRlY2xhcmF0aW9ucyBvbiB0aGUgc2FtZSBsaW5lLgogICAgICBib29sIHVzZUluZGVudCA9IG5vZGVzLmxlbmd0aCA+IDEgJiYgbGlzdC5pbmRlbnRTcGxpdHM7CiAgICAgIGlmICh1c2VJbmRlbnQpIHsKICAgICAgICBpbmRlbnRNb3JlKCk7CiAgICAgIH0KICAgICAgYm9vbCBsYXN0V2FzQmlnID0gZmFsc2U7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBOb2RlIG5vZGUgPSBub2Rlc1tpXTsKICAgICAgICBib29sIHRoaXNJc0JpZyA9ICFfaXNTbWFsbEluaXRpYWxpemF0aW9uKG5vZGUpOwogICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgYXRTdGF0ZW1lbnRCZWdpbiA9IGZhbHNlOwogICAgICAgICAgb3V0KCIsIik7CiAgICAgICAgICBpZiAobGFzdFdhc0JpZyB8fCB0aGlzSXNCaWcpIHsKICAgICAgICAgICAgbGluZU91dCgpOwogICAgICAgICAgICBpbmRlbnQoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNwYWNlT3V0KCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihub2RlLCBBU1NJR05NRU5ULAogICAgICAgICAgICBuZXdJbkZvckluaXQ6IGluRm9ySW5pdCwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgICAgIGxhc3RXYXNCaWcgPSB0aGlzSXNCaWc7CiAgICAgIH0KICAgICAgaWYgKHVzZUluZGVudCkgewogICAgICAgIGluZGVudExlc3MoKTsKICAgICAgfQogICAgfQogIH0KCiAgc3RhdGljIGJvb2wgX2lzU21hbGxJbml0aWFsaXphdGlvbihOb2RlIG5vZGUpIHsKICAgIGlmIChub2RlIGlzIFZhcmlhYmxlSW5pdGlhbGl6YXRpb24pIHsKICAgICAgTm9kZSB2YWx1ZSA9IHVuZGVmZXIobm9kZS52YWx1ZSk7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKHZhbHVlIGlzIFRoaXMpIHJldHVybiB0cnVlOwogICAgICBpZiAodmFsdWUgaXMgTGl0ZXJhbE51bGwpIHJldHVybiB0cnVlOwogICAgICBpZiAodmFsdWUgaXMgTGl0ZXJhbE51bWJlcikgcmV0dXJuIHRydWU7CiAgICAgIGlmICh2YWx1ZSBpcyBMaXRlcmFsU3RyaW5nICYmIHZhbHVlLnZhbHVlLmxlbmd0aCA8PSA4KSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKHZhbHVlIGlzIE9iamVjdEluaXRpYWxpemVyICYmIHZhbHVlLnByb3BlcnRpZXMuaXNFbXB0eSkgcmV0dXJuIHRydWU7CiAgICAgIGlmICh2YWx1ZSBpcyBBcnJheUluaXRpYWxpemVyICYmIHZhbHVlLmVsZW1lbnRzLmlzRW1wdHkpIHJldHVybiB0cnVlOwogICAgICBpZiAodmFsdWUgaXMgTmFtZSAmJiB2YWx1ZS5uYW1lLmxlbmd0aCA8PSA4KSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgX291dHB1dEluY0RlYyhTdHJpbmcgb3AsIEV4cHJlc3Npb24gdmFyaWFibGUsIFtFeHByZXNzaW9uIGFsaWFzXSkgewogICAgaWYgKG9wID09ICcrJykgewogICAgICBpZiAobGFzdENoYXJDb2RlID09IGNoYXJDb2Rlcy4kUExVUykgb3V0KCIgIiwgaXNXaGl0ZXNwYWNlOiB0cnVlKTsKICAgICAgb3V0KCcrKycpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGxhc3RDaGFyQ29kZSA9PSBjaGFyQ29kZXMuJE1JTlVTKSBvdXQoIiAiLCBpc1doaXRlc3BhY2U6IHRydWUpOwogICAgICBvdXQoJy0tJyk7CiAgICB9CiAgICBpZiAoYWxpYXMgIT0gbnVsbCkgc3RhcnROb2RlKGFsaWFzKTsKICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbih2YXJpYWJsZSwgVU5BUlksCiAgICAgICAgbmV3SW5Gb3JJbml0OiBpbkZvckluaXQsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgIGlmIChhbGlhcyAhPSBudWxsKSBlbmROb2RlKGFsaWFzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QXNzaWdubWVudChBc3NpZ25tZW50IGFzc2lnbm1lbnQpIHsKICAgIC8vLyBUbyBwcmludCBhc3NpZ25tZW50cyBsaWtlIGBhID0gYSArIDFgIGFuZCBgYSA9IGEgKyBiYCBjb21wYWN0bHkgYXMKICAgIC8vLyBgKythYCBhbmQgYGEgKz0gYmAgaW4gdGhlIGZhY2Ugb2YgW0RlZmVycmVkRXhwcmVzc2lvbl1zIHdlIGRldGVjdCB0aGUKICAgIC8vLyBwYXR0ZXJuIG9mIHRoZSB1bmRlZmVycmVkIGFzc2lnbm1lbnQuCiAgICBTdHJpbmcgb3AgPSBhc3NpZ25tZW50Lm9wOwogICAgTm9kZSBsZWZ0SGFuZFNpZGUgPSB1bmRlZmVyKGFzc2lnbm1lbnQubGVmdEhhbmRTaWRlKTsKICAgIE5vZGUgcmlnaHRIYW5kU2lkZSA9IHVuZGVmZXIoYXNzaWdubWVudC52YWx1ZSk7CiAgICBpZiAoKG9wID09ICcrJyB8fCBvcCA9PSAnLScpICYmCiAgICAgICAgbGVmdEhhbmRTaWRlIGlzIFZhcmlhYmxlVXNlICYmCiAgICAgICAgcmlnaHRIYW5kU2lkZSBpcyBMaXRlcmFsTnVtYmVyICYmCiAgICAgICAgcmlnaHRIYW5kU2lkZS52YWx1ZSA9PSAiMSIpIHsKICAgICAgLy8gT3V0cHV0ICdhICs9IDEnIGFzICcrK2EnIGFuZCAnYSAtPSAxJyBhcyAnLS1hJy4KICAgICAgX291dHB1dEluY0RlYyhvcCwgYXNzaWdubWVudC5sZWZ0SGFuZFNpZGUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIWFzc2lnbm1lbnQuaXNDb21wb3VuZCAmJgogICAgICAgIGxlZnRIYW5kU2lkZSBpcyBWYXJpYWJsZVVzZSAmJgogICAgICAgIHJpZ2h0SGFuZFNpZGUgaXMgQmluYXJ5KSB7CiAgICAgIE5vZGUgckxlZnQgPSB1bmRlZmVyKHJpZ2h0SGFuZFNpZGUubGVmdCk7CiAgICAgIE5vZGUgclJpZ2h0ID0gdW5kZWZlcihyaWdodEhhbmRTaWRlLnJpZ2h0KTsKICAgICAgU3RyaW5nIG9wID0gcmlnaHRIYW5kU2lkZS5vcDsKICAgICAgaWYgKG9wID09ICcrJyB8fAogICAgICAgICAgb3AgPT0gJy0nIHx8CiAgICAgICAgICBvcCA9PSAnLycgfHwKICAgICAgICAgIG9wID09ICcqJyB8fAogICAgICAgICAgb3AgPT0gJyUnIHx8CiAgICAgICAgICBvcCA9PSAnXicgfHwKICAgICAgICAgIG9wID09ICcmJyB8fAogICAgICAgICAgb3AgPT0gJ3wnKSB7CiAgICAgICAgaWYgKHJMZWZ0IGlzIFZhcmlhYmxlVXNlICYmIHJMZWZ0Lm5hbWUgPT0gbGVmdEhhbmRTaWRlLm5hbWUpIHsKICAgICAgICAgIC8vIE91dHB1dCAnYSA9IGEgKyAxJyBhcyAnKythJyBhbmQgJ2EgPSBhIC0gMScgYXMgJy0tYScuCiAgICAgICAgICBpZiAoKG9wID09ICcrJyB8fCBvcCA9PSAnLScpICYmCiAgICAgICAgICAgICAgclJpZ2h0IGlzIExpdGVyYWxOdW1iZXIgJiYKICAgICAgICAgICAgICByUmlnaHQudmFsdWUgPT0gIjEiKSB7CiAgICAgICAgICAgIF9vdXRwdXRJbmNEZWMob3AsIGFzc2lnbm1lbnQubGVmdEhhbmRTaWRlLCByaWdodEhhbmRTaWRlLmxlZnQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICAvLyBPdXRwdXQgJ2EgPSBhICsgYicgYXMgJ2EgKz0gYicuCiAgICAgICAgICBzdGFydE5vZGUocmlnaHRIYW5kU2lkZS5sZWZ0KTsKICAgICAgICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihhc3NpZ25tZW50LmxlZnRIYW5kU2lkZSwgQ0FMTCwKICAgICAgICAgICAgICBuZXdJbkZvckluaXQ6IGluRm9ySW5pdCwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogYXRTdGF0ZW1lbnRCZWdpbik7CiAgICAgICAgICBlbmROb2RlKHJpZ2h0SGFuZFNpZGUubGVmdCk7CiAgICAgICAgICBzcGFjZU91dCgpOwogICAgICAgICAgb3V0KG9wKTsKICAgICAgICAgIG91dCgiPSIpOwogICAgICAgICAgc3BhY2VPdXQoKTsKICAgICAgICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihyUmlnaHQsIEFTU0lHTk1FTlQsCiAgICAgICAgICAgICAgbmV3SW5Gb3JJbml0OiBpbkZvckluaXQsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihhc3NpZ25tZW50LmxlZnRIYW5kU2lkZSwgQ0FMTCwKICAgICAgICBuZXdJbkZvckluaXQ6IGluRm9ySW5pdCwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogYXRTdGF0ZW1lbnRCZWdpbik7CiAgICBpZiAoYXNzaWdubWVudC52YWx1ZSAhPSBudWxsKSB7CiAgICAgIHNwYWNlT3V0KCk7CiAgICAgIGlmIChvcCAhPSBudWxsKSBvdXQob3ApOwogICAgICBvdXQoIj0iKTsKICAgICAgc3BhY2VPdXQoKTsKICAgICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKGFzc2lnbm1lbnQudmFsdWUsIEFTU0lHTk1FTlQsCiAgICAgICAgICBuZXdJbkZvckluaXQ6IGluRm9ySW5pdCwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRWYXJpYWJsZUluaXRpYWxpemF0aW9uKFZhcmlhYmxlSW5pdGlhbGl6YXRpb24gaW5pdGlhbGl6YXRpb24pIHsKICAgIHZpc2l0QXNzaWdubWVudChpbml0aWFsaXphdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbmRpdGlvbmFsKENvbmRpdGlvbmFsIGNvbmQpIHsKICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihjb25kLmNvbmRpdGlvbiwgTE9HSUNBTF9PUiwKICAgICAgICBuZXdJbkZvckluaXQ6IGluRm9ySW5pdCwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogYXRTdGF0ZW1lbnRCZWdpbik7CiAgICBzcGFjZU91dCgpOwogICAgb3V0KCI/Iik7CiAgICBzcGFjZU91dCgpOwogICAgLy8gVGhlIHRoZW4gcGFydCBpcyBhbGxvd2VkIHRvIGhhdmUgYW4gJ2luJy4KICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihjb25kLnRoZW4sIEFTU0lHTk1FTlQsCiAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgc3BhY2VPdXQoKTsKICAgIG91dCgiOiIpOwogICAgc3BhY2VPdXQoKTsKICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihjb25kLm90aGVyd2lzZSwgQVNTSUdOTUVOVCwKICAgICAgICBuZXdJbkZvckluaXQ6IGluRm9ySW5pdCwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXROZXcoTmV3IG5vZGUpIHsKICAgIG91dCgibmV3ICIpOwogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKG5vZGUudGFyZ2V0LCBMRUZUX0hBTkRfU0lERSwKICAgICAgICBuZXdJbkZvckluaXQ6IGluRm9ySW5pdCwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgb3V0KCIoIik7CiAgICB2aXNpdENvbW1hU2VwYXJhdGVkKG5vZGUuYXJndW1lbnRzLCBBU1NJR05NRU5ULAogICAgICAgIG5ld0luRm9ySW5pdDogZmFsc2UsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICAgIG91dCgiKSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDYWxsKENhbGwgY2FsbCkgewogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKGNhbGwudGFyZ2V0LCBDQUxMLAogICAgICAgIG5ld0luRm9ySW5pdDogaW5Gb3JJbml0LCBuZXdBdFN0YXRlbWVudEJlZ2luOiBhdFN0YXRlbWVudEJlZ2luKTsKICAgIG91dCgiKCIpOwogICAgdmlzaXRDb21tYVNlcGFyYXRlZChjYWxsLmFyZ3VtZW50cywgQVNTSUdOTUVOVCwKICAgICAgICBuZXdJbkZvckluaXQ6IGZhbHNlLCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgICBvdXQoIikiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCaW5hcnkoQmluYXJ5IGJpbmFyeSkgewogICAgRXhwcmVzc2lvbiBsZWZ0ID0gYmluYXJ5LmxlZnQ7CiAgICBFeHByZXNzaW9uIHJpZ2h0ID0gYmluYXJ5LnJpZ2h0OwogICAgU3RyaW5nIG9wID0gYmluYXJ5Lm9wOwogICAgaW50IGxlZnRQcmVjZWRlbmNlUmVxdWlyZW1lbnQ7CiAgICBpbnQgcmlnaHRQcmVjZWRlbmNlUmVxdWlyZW1lbnQ7CiAgICBib29sIGxlZnRTcGFjZSA9IHRydWU7IC8vIGxlZnQ8SEVSRT5vcCByaWdodAogICAgc3dpdGNoIChvcCkgewogICAgICBjYXNlICcsJzoKICAgICAgICAvLyAgeCwgKHksIHopIDw9PiAoeCwgeSksIHouCiAgICAgICAgbGVmdFByZWNlZGVuY2VSZXF1aXJlbWVudCA9IEVYUFJFU1NJT047CiAgICAgICAgcmlnaHRQcmVjZWRlbmNlUmVxdWlyZW1lbnQgPSBFWFBSRVNTSU9OOwogICAgICAgIGxlZnRTcGFjZSA9IGZhbHNlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ8fCI6CiAgICAgICAgbGVmdFByZWNlZGVuY2VSZXF1aXJlbWVudCA9IExPR0lDQUxfT1I7CiAgICAgICAgLy8geCB8fCAoeSB8fCB6KSA8PT4gKHggfHwgeSkgfHwgei4KICAgICAgICByaWdodFByZWNlZGVuY2VSZXF1aXJlbWVudCA9IExPR0lDQUxfT1I7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIiYmIjoKICAgICAgICBsZWZ0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gTE9HSUNBTF9BTkQ7CiAgICAgICAgLy8geCAmJiAoeSAmJiB6KSA8PT4gKHggJiYgeSkgJiYgei4KICAgICAgICByaWdodFByZWNlZGVuY2VSZXF1aXJlbWVudCA9IExPR0lDQUxfQU5EOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ8IjoKICAgICAgICBsZWZ0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gQklUX09SOwogICAgICAgIC8vIHggfCAoeSB8IHopIDw9PiAoeCB8IHkpIHwgei4KICAgICAgICByaWdodFByZWNlZGVuY2VSZXF1aXJlbWVudCA9IEJJVF9PUjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiXiI6CiAgICAgICAgbGVmdFByZWNlZGVuY2VSZXF1aXJlbWVudCA9IEJJVF9YT1I7CiAgICAgICAgLy8geCBeICh5IF4geikgPD0+ICh4IF4geSkgXiB6LgogICAgICAgIHJpZ2h0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gQklUX1hPUjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiJiI6CiAgICAgICAgbGVmdFByZWNlZGVuY2VSZXF1aXJlbWVudCA9IEJJVF9BTkQ7CiAgICAgICAgLy8geCAmICh5ICYgeikgPD0+ICh4ICYgeSkgJiB6LgogICAgICAgIHJpZ2h0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gQklUX0FORDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiPT0iOgogICAgICBjYXNlICIhPSI6CiAgICAgIGNhc2UgIj09PSI6CiAgICAgIGNhc2UgIiE9PSI6CiAgICAgICAgbGVmdFByZWNlZGVuY2VSZXF1aXJlbWVudCA9IEVRVUFMSVRZOwogICAgICAgIHJpZ2h0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gUkVMQVRJT05BTDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiPCI6CiAgICAgIGNhc2UgIj4iOgogICAgICBjYXNlICI8PSI6CiAgICAgIGNhc2UgIj49IjoKICAgICAgY2FzZSAiaW5zdGFuY2VvZiI6CiAgICAgIGNhc2UgImluIjoKICAgICAgICBsZWZ0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gUkVMQVRJT05BTDsKICAgICAgICByaWdodFByZWNlZGVuY2VSZXF1aXJlbWVudCA9IFNISUZUOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICI+PiI6CiAgICAgIGNhc2UgIjw8IjoKICAgICAgY2FzZSAiPj4+IjoKICAgICAgICBsZWZ0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gU0hJRlQ7CiAgICAgICAgcmlnaHRQcmVjZWRlbmNlUmVxdWlyZW1lbnQgPSBBRERJVElWRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiKyI6CiAgICAgIGNhc2UgIi0iOgogICAgICAgIGxlZnRQcmVjZWRlbmNlUmVxdWlyZW1lbnQgPSBBRERJVElWRTsKICAgICAgICAvLyBXZSBjYW5ub3QgcmVtb3ZlIHBhcmVudGhlc2lzIGZvciAiKyIgYmVjYXVzZQogICAgICAgIC8vICAgeCArICh5ICsgeikgPCE9PiAoeCArIHkpICsgejoKICAgICAgICAvLyBFeGFtcGxlOgogICAgICAgIC8vICAgImEiICsgKDEgKyAyKSA9PiAiYTMiOwogICAgICAgIC8vICAgKCJhIiArIDEpICsgMiA9PiAiYTEyIjsKICAgICAgICByaWdodFByZWNlZGVuY2VSZXF1aXJlbWVudCA9IE1VTFRJUExJQ0FUSVZFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICIqIjoKICAgICAgY2FzZSAiLyI6CiAgICAgIGNhc2UgIiUiOgogICAgICAgIGxlZnRQcmVjZWRlbmNlUmVxdWlyZW1lbnQgPSBNVUxUSVBMSUNBVElWRTsKICAgICAgICAvLyBXZSBjYW5ub3QgcmVtb3ZlIHBhcmVudGhlc2lzIGZvciAiKiIgYmVjYXVzZSBvZiBwcmVjaXNpb24gaXNzdWVzLgogICAgICAgIHJpZ2h0UHJlY2VkZW5jZVJlcXVpcmVtZW50ID0gVU5BUlk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgY29udGV4dC5lcnJvcigiRm9yZ290IG9wZXJhdG9yOiAkb3AiKTsKICAgIH0KCiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obGVmdCwgbGVmdFByZWNlZGVuY2VSZXF1aXJlbWVudCwKICAgICAgICBuZXdJbkZvckluaXQ6IGluRm9ySW5pdCwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogYXRTdGF0ZW1lbnRCZWdpbik7CgogICAgaWYgKG9wID09ICJpbiIgfHwgb3AgPT0gImluc3RhbmNlb2YiKSB7CiAgICAgIC8vIFRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGUgc3BhY2UgaXMgbm90IHJlcXVpcmVkIGJ1dCB3aXRob3V0IGZ1cnRoZXIKICAgICAgLy8gYW5hbHlzaXMgd2UgY2Fubm90IGtub3cuCiAgICAgIG91dCgiICIsIGlzV2hpdGVzcGFjZTogdHJ1ZSk7CiAgICAgIG91dChvcCk7CiAgICAgIG91dCgiICIsIGlzV2hpdGVzcGFjZTogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBpZiAobGVmdFNwYWNlKSBzcGFjZU91dCgpOwogICAgICBvdXQob3ApOwogICAgICBzcGFjZU91dCgpOwogICAgfQogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKHJpZ2h0LCByaWdodFByZWNlZGVuY2VSZXF1aXJlbWVudCwKICAgICAgICBuZXdJbkZvckluaXQ6IGluRm9ySW5pdCwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFByZWZpeChQcmVmaXggdW5hcnkpIHsKICAgIFN0cmluZyBvcCA9IHVuYXJ5Lm9wOwogICAgc3dpdGNoIChvcCkgewogICAgICBjYXNlICJkZWxldGUiOgogICAgICBjYXNlICJ2b2lkIjoKICAgICAgY2FzZSAidHlwZW9mIjoKICAgICAgICAvLyBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIHNwYWNlIGlzIG5vdCByZXF1aXJlZCBidXQgd2l0aG91dCBmdXJ0aGVyCiAgICAgICAgLy8gYW5hbHlzaXMgd2UgY2Fubm90IGtub3cuCiAgICAgICAgb3V0KG9wKTsKICAgICAgICBvdXQoIiAiLCBpc1doaXRlc3BhY2U6IHRydWUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICIrIjoKICAgICAgY2FzZSAiKysiOgogICAgICAgIGlmIChsYXN0Q2hhckNvZGUgPT0gY2hhckNvZGVzLiRQTFVTKSBvdXQoIiAiLCBpc1doaXRlc3BhY2U6IHRydWUpOwogICAgICAgIG91dChvcCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIi0iOgogICAgICBjYXNlICItLSI6CiAgICAgICAgaWYgKGxhc3RDaGFyQ29kZSA9PSBjaGFyQ29kZXMuJE1JTlVTKSBvdXQoIiAiLCBpc1doaXRlc3BhY2U6IHRydWUpOwogICAgICAgIG91dChvcCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgb3V0KG9wKTsKICAgIH0KICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbih1bmFyeS5hcmd1bWVudCwgVU5BUlksCiAgICAgICAgbmV3SW5Gb3JJbml0OiBpbkZvckluaXQsIG5ld0F0U3RhdGVtZW50QmVnaW46IGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQb3N0Zml4KFBvc3RmaXggcG9zdGZpeCkgewogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKHBvc3RmaXguYXJndW1lbnQsIENBTEwsCiAgICAgICAgbmV3SW5Gb3JJbml0OiBpbkZvckluaXQsIG5ld0F0U3RhdGVtZW50QmVnaW46IGF0U3RhdGVtZW50QmVnaW4pOwogICAgb3V0KHBvc3RmaXgub3ApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlVXNlKFZhcmlhYmxlVXNlIHJlZikgewogICAgb3V0KGxvY2FsTmFtZXIuZ2V0TmFtZShyZWYubmFtZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRoaXMoVGhpcyBub2RlKSB7CiAgICBvdXQoInRoaXMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbCkgewogICAgb3V0KGxvY2FsTmFtZXIuZ2V0TmFtZShkZWNsLm5hbWUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB7CiAgICBvdXQobG9jYWxOYW1lci5nZXROYW1lKHBhcmFtLm5hbWUpKTsKICB9CgogIGJvb2wgaXNEaWdpdChpbnQgY2hhckNvZGUpIHsKICAgIHJldHVybiBjaGFyQ29kZXMuJDAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gY2hhckNvZGVzLiQ5OwogIH0KCiAgYm9vbCBpc1ZhbGlkSmF2YVNjcmlwdElkKFN0cmluZyBmaWVsZCkgewogICAgaWYgKGZpZWxkLmxlbmd0aCA8IDMpIHJldHVybiBmYWxzZTsKICAgIC8vIElnbm9yZSB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3RyaW5nLWRlbGltaXRlci4KICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZmllbGQubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBhbGxvdyBtb3JlIGNoYXJhY3RlcnMuCiAgICAgIGludCBjaGFyQ29kZSA9IGZpZWxkLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmICghKGNoYXJDb2Rlcy4kYSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBjaGFyQ29kZXMuJHogfHwKICAgICAgICAgIGNoYXJDb2Rlcy4kQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBjaGFyQ29kZXMuJFogfHwKICAgICAgICAgIGNoYXJDb2RlID09IGNoYXJDb2Rlcy4kJCB8fAogICAgICAgICAgY2hhckNvZGUgPT0gY2hhckNvZGVzLiRfIHx8CiAgICAgICAgICBpICE9IDEgJiYgaXNEaWdpdChjaGFyQ29kZSkpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICAvLyBUT0RPKGZsb2l0c2NoKTogbm9ybWFsbHkgd2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhhdCB0aGUgZmllbGQgaXMgbm90IGEKICAgIC8vIHJlc2VydmVkIHdvcmQuICBXZSBkb24ndCBnZW5lcmF0ZSBmaWVsZHMgd2l0aCByZXNlcnZlZCB3b3JkIG5hbWVzIGV4Y2VwdAogICAgLy8gZm9yICdzdXBlcicuCiAgICBpZiAoZmllbGQgPT0gJyJzdXBlciInKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZmllbGQgPT0gJyJjYXRjaCInKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBY2Nlc3MoUHJvcGVydHlBY2Nlc3MgYWNjZXNzKSB7CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24oYWNjZXNzLnJlY2VpdmVyLCBDQUxMLAogICAgICAgIG5ld0luRm9ySW5pdDogaW5Gb3JJbml0LCBuZXdBdFN0YXRlbWVudEJlZ2luOiBhdFN0YXRlbWVudEJlZ2luKTsKICAgIE5vZGUgc2VsZWN0b3IgPSB1bmRlZmVyKGFjY2Vzcy5zZWxlY3Rvcik7CiAgICBpZiAoc2VsZWN0b3IgaXMgTGl0ZXJhbFN0cmluZykgewogICAgICBTdHJpbmcgZmllbGRXaXRoUXVvdGVzID0gc2VsZWN0b3IudmFsdWU7CiAgICAgIGlmIChpc1ZhbGlkSmF2YVNjcmlwdElkKGZpZWxkV2l0aFF1b3RlcykpIHsKICAgICAgICBpZiAoYWNjZXNzLnJlY2VpdmVyIGlzIExpdGVyYWxOdW1iZXIgJiYKICAgICAgICAgICAgbGFzdENoYXJDb2RlICE9IGNoYXJDb2Rlcy4kQ0xPU0VfUEFSRU4pIHsKICAgICAgICAgIG91dCgiICIsIGlzV2hpdGVzcGFjZTogdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIG91dCgiLiIpOwogICAgICAgIHN0YXJ0Tm9kZShhY2Nlc3Muc2VsZWN0b3IpOwogICAgICAgIG91dChmaWVsZFdpdGhRdW90ZXMuc3Vic3RyaW5nKDEsIGZpZWxkV2l0aFF1b3Rlcy5sZW5ndGggLSAxKSk7CiAgICAgICAgZW5kTm9kZShhY2Nlc3Muc2VsZWN0b3IpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSBlbHNlIGlmIChzZWxlY3RvciBpcyBOYW1lKSB7CiAgICAgIE5vZGUgcmVjZWl2ZXIgPSB1bmRlZmVyKGFjY2Vzcy5yZWNlaXZlcik7CiAgICAgIGlmIChyZWNlaXZlciBpcyBMaXRlcmFsTnVtYmVyICYmIGxhc3RDaGFyQ29kZSAhPSBjaGFyQ29kZXMuJENMT1NFX1BBUkVOKSB7CiAgICAgICAgb3V0KCIgIiwgaXNXaGl0ZXNwYWNlOiB0cnVlKTsKICAgICAgfQogICAgICBvdXQoIi4iKTsKICAgICAgc3RhcnROb2RlKGFjY2Vzcy5zZWxlY3Rvcik7CiAgICAgIHNlbGVjdG9yLmFjY2VwdCh0aGlzKTsKICAgICAgZW5kTm9kZShhY2Nlc3Muc2VsZWN0b3IpOwogICAgICByZXR1cm47CiAgICB9CiAgICBvdXQoIlsiKTsKICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihhY2Nlc3Muc2VsZWN0b3IsIEVYUFJFU1NJT04sCiAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgb3V0KCJdIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmFtZWRGdW5jdGlvbihOYW1lZEZ1bmN0aW9uIG5hbWVkRnVuY3Rpb24pIHsKICAgIFZhckNvbGxlY3RvciB2YXJzID0gbmV3IFZhckNvbGxlY3RvcigpOwogICAgdmFycy52aXNpdE5hbWVkRnVuY3Rpb24obmFtZWRGdW5jdGlvbik7CiAgICBzdGFydE5vZGUobmFtZWRGdW5jdGlvbi5mdW5jdGlvbik7CiAgICBpbnQgY2xvc2luZ1Bvc2l0aW9uID0gY3VycmVudE5vZGUuY2xvc2luZ1Bvc2l0aW9uID0KICAgICAgICBmdW5jdGlvbk91dChuYW1lZEZ1bmN0aW9uLmZ1bmN0aW9uLCBuYW1lZEZ1bmN0aW9uLm5hbWUsIHZhcnMpOwogICAgZW5kTm9kZShuYW1lZEZ1bmN0aW9uLmZ1bmN0aW9uKTsKICAgIC8vIFVzZSBjbG9zaW5nIHBvc2l0aW9uIG9mIGBuYW1lZEZ1bmN0aW9uLmZ1bmN0aW9uYCBhcyB0aGUgY2xvc2luZyBwb3NpdGlvbgogICAgLy8gb2YgdGhlIG5hbWVkIGZ1bmN0aW9uIGl0c2VsZi4KICAgIGN1cnJlbnROb2RlLmNsb3NpbmdQb3NpdGlvbiA9IGNsb3NpbmdQb3NpdGlvbjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW4oRnVuIGZ1bikgewogICAgVmFyQ29sbGVjdG9yIHZhcnMgPSBuZXcgVmFyQ29sbGVjdG9yKCk7CiAgICB2YXJzLnZpc2l0RnVuKGZ1bik7CiAgICBjdXJyZW50Tm9kZS5jbG9zaW5nUG9zaXRpb24gPSBmdW5jdGlvbk91dChmdW4sIG51bGwsIHZhcnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREZWZlcnJlZEV4cHJlc3Npb24oRGVmZXJyZWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIC8vIENvbnRpbnVlIHByaW50aW5nIHdpdGggdGhlIGV4cHJlc3Npb24gdmFsdWUuCiAgICBhc3NlcnQobm9kZS5wcmVjZWRlbmNlTGV2ZWwgPT0gbm9kZS52YWx1ZS5wcmVjZWRlbmNlTGV2ZWwpOwogICAgbm9kZS52YWx1ZS5hY2NlcHQodGhpcyk7CiAgfQoKICBvdXRwdXROdW1iZXJXaXRoUmVxdWlyZWRXaGl0ZXNwYWNlKFN0cmluZyBudW1iZXIpIHsKICAgIGludCBjaGFyQ29kZSA9IG51bWJlci5jb2RlVW5pdEF0KDApOwogICAgaWYgKGNoYXJDb2RlID09IGNoYXJDb2Rlcy4kTUlOVVMgJiYgbGFzdENoYXJDb2RlID09IGNoYXJDb2Rlcy4kTUlOVVMpIHsKICAgICAgb3V0KCIgIiwgaXNXaGl0ZXNwYWNlOiB0cnVlKTsKICAgIH0KICAgIG91dChudW1iZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREZWZlcnJlZE51bWJlcihEZWZlcnJlZE51bWJlciBub2RlKSB7CiAgICBvdXRwdXROdW1iZXJXaXRoUmVxdWlyZWRXaGl0ZXNwYWNlKCIke25vZGUudmFsdWV9Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdERlZmVycmVkU3RyaW5nKERlZmVycmVkU3RyaW5nIG5vZGUpIHsKICAgIG91dChub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0TGl0ZXJhbEJvb2woTGl0ZXJhbEJvb2wgbm9kZSkgewogICAgb3V0KG5vZGUudmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXRlcmFsU3RyaW5nKExpdGVyYWxTdHJpbmcgbm9kZSkgewogICAgb3V0KG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgewogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXROYW1lKE5hbWUgbm9kZSkgewogICAgb3V0KG9wdGlvbnMucmVuYW1lckZvck5hbWVzKG5vZGUpKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0UGFyZW50aGVzZXMoUGFyZW50aGVzZXMgbm9kZSkgewogICAgb3V0KCIoIik7CiAgICB2aXNpdE5lc3RlZEV4cHJlc3Npb24obm9kZS5lbmNsb3NlZCwgRVhQUkVTU0lPTiwKICAgICAgICBuZXdJbkZvckluaXQ6IGZhbHNlLCBuZXdBdFN0YXRlbWVudEJlZ2luOiBmYWxzZSk7CiAgICBvdXQoIikiKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0TGl0ZXJhbE51bWJlcihMaXRlcmFsTnVtYmVyIG5vZGUpIHsKICAgIG91dHB1dE51bWJlcldpdGhSZXF1aXJlZFdoaXRlc3BhY2Uobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGl0ZXJhbE51bGwoTGl0ZXJhbE51bGwgbm9kZSkgewogICAgb3V0KCJudWxsIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXJyYXlJbml0aWFsaXplcihBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKICAgIG91dCgiWyIpOwogICAgTGlzdDxFeHByZXNzaW9uPiBlbGVtZW50cyA9IG5vZGUuZWxlbWVudHM7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIEV4cHJlc3Npb24gZWxlbWVudCA9IGVsZW1lbnRzW2ldOwogICAgICBpZiAoZWxlbWVudCBpcyBBcnJheUhvbGUpIHsKICAgICAgICAvLyBOb3RlIHRoYXQgYXJyYXkgaG9sZXMgbXVzdCBoYXZlIGEgdHJhaWxpbmcgIiwiIGV2ZW4gaWYgdGhleSBhcmUKICAgICAgICAvLyBpbiBsYXN0IHBvc2l0aW9uLiBPdGhlcndpc2UgYFssXWAgKGhhdmluZyBsZW5ndGggMSkgd291bGQgYmVjb21lCiAgICAgICAgLy8gZXF1YWwgdG8gYFtdYCAodGhlIGVtcHR5IGFycmF5KQogICAgICAgIC8vIGFuZCBbMSwsXSAoYXJyYXkgd2l0aCAxIGFuZCBhIGhvbGUpIHdvdWxkIGJlY29tZSBbMSxdID0gWzFdLgogICAgICAgIHN0YXJ0Tm9kZShlbGVtZW50KTsKICAgICAgICBvdXQoIiwiKTsKICAgICAgICBlbmROb2RlKGVsZW1lbnQpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChpICE9IDApIHNwYWNlT3V0KCk7CiAgICAgIHZpc2l0TmVzdGVkRXhwcmVzc2lvbihlbGVtZW50LCBBU1NJR05NRU5ULAogICAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogICAgICAvLyBXZSBjYW4gc2tpcCB0aGUgdHJhaWxpbmcgIiwiIGZvciB0aGUgbGFzdCBlbGVtZW50IChzaW5jZSBpdCdzIG5vdAogICAgICAvLyBhbiBhcnJheSBob2xlKS4KICAgICAgaWYgKGkgIT0gZWxlbWVudHMubGVuZ3RoIC0gMSkgb3V0KCIsIik7CiAgICB9CiAgICBvdXQoIl0iKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBcnJheUhvbGUoQXJyYXlIb2xlIG5vZGUpIHsKICAgIGNvbnRleHQuZXJyb3IoIlVucmVhY2hhYmxlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0T2JqZWN0SW5pdGlhbGl6ZXIoT2JqZWN0SW5pdGlhbGl6ZXIgbm9kZSkgewogICAgLy8gUHJpbnQgYWxsIHRoZSBwcm9wZXJ0aWVzIG9uIG9uZSBsaW5lIHVudGlsIHdlIHNlZSBhIGZ1bmN0aW9uLXZhbHVlZAogICAgLy8gcHJvcGVydHkuICBJZGVhbGx5LCB3ZSB3b3VsZCB1c2UgYSBwcm9wZXIgcHJldHR5LXByaW50ZXIgdG8gbWFrZSB0aGUKICAgIC8vIGRlY2lzaW9uIGJhc2VkIG9uIGxheW91dC4KICAgIGJvb2wgZXhpdE9uZUxpbmVyTW9kZShFeHByZXNzaW9uIHZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZSBpcyBGdW4gfHwKICAgICAgICAgIHZhbHVlIGlzIEFycmF5SW5pdGlhbGl6ZXIgJiYgdmFsdWUuZWxlbWVudHMuYW55KChlKSA9PiBlIGlzIEZ1bik7CiAgICB9CgogICAgYm9vbCBpc09uZUxpbmVyID0gbm9kZS5pc09uZUxpbmVyIHx8IHNob3VsZENvbXByZXNzT3V0cHV0OwogICAgTGlzdDxQcm9wZXJ0eT4gcHJvcGVydGllcyA9IG5vZGUucHJvcGVydGllczsKICAgIG91dCgieyIpOwogICAgaW5kZW50TW9yZSgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIE5vZGUgdmFsdWUgPSBwcm9wZXJ0aWVzW2ldLnZhbHVlOwogICAgICBpZiAoaXNPbmVMaW5lciAmJiBleGl0T25lTGluZXJNb2RlKHZhbHVlKSkgaXNPbmVMaW5lciA9IGZhbHNlOwogICAgICBpZiAoaSAhPSAwKSB7CiAgICAgICAgb3V0KCIsIik7CiAgICAgICAgaWYgKGlzT25lTGluZXIpIHNwYWNlT3V0KCk7CiAgICAgIH0KICAgICAgaWYgKCFpc09uZUxpbmVyKSB7CiAgICAgICAgZm9yY2VMaW5lKCk7CiAgICAgICAgaW5kZW50KCk7CiAgICAgIH0KICAgICAgdmlzaXQocHJvcGVydGllc1tpXSk7CiAgICB9CiAgICBpbmRlbnRMZXNzKCk7CiAgICBpZiAoIWlzT25lTGluZXIgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSkgewogICAgICBsaW5lT3V0KCk7CiAgICAgIGluZGVudCgpOwogICAgfQogICAgb3V0KCJ9Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJvcGVydHkoUHJvcGVydHkgbm9kZSkgewogICAgc3RhcnROb2RlKG5vZGUubmFtZSk7CiAgICBOb2RlIG5hbWUgPSB1bmRlZmVyKG5vZGUubmFtZSk7CiAgICBpZiAobmFtZSBpcyBMaXRlcmFsU3RyaW5nKSB7CiAgICAgIFN0cmluZyB0ZXh0ID0gbmFtZS52YWx1ZTsKICAgICAgaWYgKGlzVmFsaWRKYXZhU2NyaXB0SWQodGV4dCkpIHsKICAgICAgICBvdXQodGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGggLSAxKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3V0KHRleHQpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG5hbWUgaXMgTmFtZSkgewogICAgICBub2RlLm5hbWUuYWNjZXB0KHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KG5hbWUgaXMgTGl0ZXJhbE51bWJlcik7CiAgICAgIExpdGVyYWxOdW1iZXIgbmFtZU51bWJlciA9IG5vZGUubmFtZTsKICAgICAgb3V0KG5hbWVOdW1iZXIudmFsdWUpOwogICAgfQogICAgZW5kTm9kZShub2RlLm5hbWUpOwogICAgb3V0KCI6Iik7CiAgICBzcGFjZU91dCgpOwogICAgdmlzaXROZXN0ZWRFeHByZXNzaW9uKG5vZGUudmFsdWUsIEFTU0lHTk1FTlQsCiAgICAgICAgbmV3SW5Gb3JJbml0OiBmYWxzZSwgbmV3QXRTdGF0ZW1lbnRCZWdpbjogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJlZ0V4cExpdGVyYWwoUmVnRXhwTGl0ZXJhbCBub2RlKSB7CiAgICBvdXQobm9kZS5wYXR0ZXJuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXRlcmFsRXhwcmVzc2lvbihMaXRlcmFsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBTdHJpbmcgdGVtcGxhdGUgPSBub2RlLnRlbXBsYXRlOwogICAgTGlzdDxFeHByZXNzaW9uPiBpbnB1dHMgPSBub2RlLmlucHV0czsKCiAgICBMaXN0PFN0cmluZz4gcGFydHMgPSB0ZW1wbGF0ZS5zcGxpdCgnIycpOwogICAgaW50IGlucHV0c0xlbmd0aCA9IGlucHV0cyA9PSBudWxsID8gMCA6IGlucHV0cy5sZW5ndGg7CiAgICBpZiAocGFydHMubGVuZ3RoICE9IGlucHV0c0xlbmd0aCArIDEpIHsKICAgICAgY29udGV4dC5lcnJvcignV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgSlM6ICR0ZW1wbGF0ZScpOwogICAgfQogICAgLy8gQ29kZSB0aGF0IHVzZXMgSlMgbXVzdCB0YWtlIGNhcmUgb2Ygb3BlcmF0b3IgcHJlY2VkZW5jZXMsIGFuZAogICAgLy8gcHV0IHBhcmVudGhlc2lzIGlmIG5lZWRlZC4KICAgIG91dChwYXJ0c1swXSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0c0xlbmd0aDsgaSsrKSB7CiAgICAgIHZpc2l0KGlucHV0c1tpXSk7CiAgICAgIG91dChwYXJ0c1tpICsgMV0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpdGVyYWxTdGF0ZW1lbnQoTGl0ZXJhbFN0YXRlbWVudCBub2RlKSB7CiAgICBvdXRMbihub2RlLmNvZGUpOwogIH0KCiAgdm9pZCB2aXNpdEludGVycG9sYXRlZE5vZGUoSW50ZXJwb2xhdGVkTm9kZSBub2RlKSB7CiAgICBvdXQoJyMke25vZGUubmFtZU9yUG9zaXRpb259Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbihJbnRlcnBvbGF0ZWRFeHByZXNzaW9uIG5vZGUpID0+CiAgICAgIHZpc2l0SW50ZXJwb2xhdGVkTm9kZShub2RlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVycG9sYXRlZExpdGVyYWwoSW50ZXJwb2xhdGVkTGl0ZXJhbCBub2RlKSA9PgogICAgICB2aXNpdEludGVycG9sYXRlZE5vZGUobm9kZSk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIoSW50ZXJwb2xhdGVkUGFyYW1ldGVyIG5vZGUpID0+CiAgICAgIHZpc2l0SW50ZXJwb2xhdGVkTm9kZShub2RlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVycG9sYXRlZFNlbGVjdG9yKEludGVycG9sYXRlZFNlbGVjdG9yIG5vZGUpID0+CiAgICAgIHZpc2l0SW50ZXJwb2xhdGVkTm9kZShub2RlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVycG9sYXRlZFN0YXRlbWVudChJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgb3V0TG4oJyMke25vZGUubmFtZU9yUG9zaXRpb259Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50ZXJwb2xhdGVkRGVjbGFyYXRpb24oSW50ZXJwb2xhdGVkRGVjbGFyYXRpb24gbm9kZSkgewogICAgdmlzaXRJbnRlcnBvbGF0ZWROb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbW1lbnQoQ29tbWVudCBub2RlKSB7CiAgICBpZiAoc2hvdWxkQ29tcHJlc3NPdXRwdXQpIHJldHVybjsKICAgIFN0cmluZyBjb21tZW50ID0gbm9kZS5jb21tZW50LnRyaW0oKTsKICAgIGlmIChjb21tZW50LmlzRW1wdHkpIHJldHVybjsKICAgIGZvciAodmFyIGxpbmUgaW4gY29tbWVudC5zcGxpdCgnXG4nKSkgewogICAgICBpZiAoY29tbWVudC5zdGFydHNXaXRoKCcvLycpKSB7CiAgICAgICAgb3V0SW5kZW50TG4obGluZS50cmltKCkpOwogICAgICB9IGVsc2UgewogICAgICAgIG91dEluZGVudExuKCcvLyAke2xpbmUudHJpbSgpfScpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXdhaXQoQXdhaXQgbm9kZSkgewogICAgb3V0KCJhd2FpdCAiKTsKICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgfQp9CgpjbGFzcyBPcmRlcmVkU2V0PFQ+IHsKICBmaW5hbCBTZXQ8VD4gc2V0OwogIGZpbmFsIExpc3Q8VD4gbGlzdDsKCiAgT3JkZXJlZFNldCgpCiAgICAgIDogc2V0ID0gbmV3IFNldDxUPigpLAogICAgICAgIGxpc3QgPSA8VD5bXTsKCiAgdm9pZCBhZGQoVCB4KSB7CiAgICBpZiAoc2V0LmFkZCh4KSkgewogICAgICAvLyBbU2V0LmFkZF0gcmV0dXJucyBgdHJ1ZWAgaWYgJ3gnIHdhcyBhZGRlZC4KICAgICAgbGlzdC5hZGQoeCk7CiAgICB9CiAgfQoKICB2b2lkIGZvckVhY2godm9pZCBmdW4oVCB4KSkgewogICAgbGlzdC5mb3JFYWNoKGZ1bik7CiAgfQp9CgovLyBDb2xsZWN0cyBhbGwgdGhlIHZhciBkZWNsYXJhdGlvbnMgaW4gdGhlIGZ1bmN0aW9uLiAgV2UgbmVlZCB0byBkbyB0aGlzIGluIGEKLy8gc2VwYXJhdGUgcGFzcyBiZWNhdXNlIEpTIHZhcnMgYXJlIGxpZnRlZCB0byB0aGUgdG9wIG9mIHRoZSBmdW5jdGlvbi4KY2xhc3MgVmFyQ29sbGVjdG9yIGV4dGVuZHMgQmFzZVZpc2l0b3IgewogIGJvb2wgbmVzdGVkOwogIGJvb2wgZW5hYmxlUmVuYW1pbmcgPSB0cnVlOwogIGZpbmFsIE9yZGVyZWRTZXQ8U3RyaW5nPiB2YXJzOwogIGZpbmFsIE9yZGVyZWRTZXQ8U3RyaW5nPiBwYXJhbXM7CgogIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGlzYWJsZVZhcmlhYmxlTWluaWZpY2F0aW9uUGF0dGVybiA9ICI6Om5vcmVuYW1pbmc6OiI7CiAgc3RhdGljIGZpbmFsIFN0cmluZyBlbmFibGVWYXJpYWJsZU1pbmlmaWNhdGlvblBhdHRlcm4gPSAiOjpkb3JlbmFtaW5nOjoiOwoKICBWYXJDb2xsZWN0b3IoKQogICAgICA6IG5lc3RlZCA9IGZhbHNlLAogICAgICAgIHZhcnMgPSBuZXcgT3JkZXJlZFNldDxTdHJpbmc+KCksCiAgICAgICAgcGFyYW1zID0gbmV3IE9yZGVyZWRTZXQ8U3RyaW5nPigpOwoKICB2b2lkIGZvckVhY2hWYXIodm9pZCBmbihTdHJpbmcgdikpID0+IHZhcnMuZm9yRWFjaChmbik7CiAgdm9pZCBmb3JFYWNoUGFyYW0odm9pZCBmbihTdHJpbmcgcCkpID0+IHBhcmFtcy5mb3JFYWNoKGZuKTsKCiAgdm9pZCBjb2xsZWN0VmFyc0luRnVuY3Rpb24oRnVuIGZ1bikgewogICAgaWYgKCFuZXN0ZWQpIHsKICAgICAgbmVzdGVkID0gdHJ1ZTsKICAgICAgaWYgKGZ1bi5wYXJhbXMgIT0gbnVsbCkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnVuLnBhcmFtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcGFyYW1zLmFkZChmdW4ucGFyYW1zW2ldLm5hbWUpOwogICAgICAgIH0KICAgICAgfQogICAgICB2aXNpdEJsb2NrKGZ1bi5ib2R5KTsKICAgICAgbmVzdGVkID0gZmFsc2U7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgYm90aGVyIGNvbGxlY3RpbmcgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLgogICAgY29sbGVjdFZhcnNJbkZ1bmN0aW9uKGRlY2xhcmF0aW9uLmZ1bmN0aW9uKTsKICB9CgogIHZvaWQgdmlzaXROYW1lZEZ1bmN0aW9uKE5hbWVkRnVuY3Rpb24gbmFtZWRGdW5jdGlvbikgewogICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IGJvdGhlciBjb2xsZWN0aW5nIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4KICAgIGNvbGxlY3RWYXJzSW5GdW5jdGlvbihuYW1lZEZ1bmN0aW9uLmZ1bmN0aW9uKTsKICB9CgogIHZvaWQgdmlzaXRGdW4oRnVuIGZ1bikgewogICAgY29sbGVjdFZhcnNJbkZ1bmN0aW9uKGZ1bik7CiAgfQoKICB2b2lkIHZpc2l0VGhpcyhUaGlzIG5vZGUpIHt9CgogIHZvaWQgdmlzaXRDb21tZW50KENvbW1lbnQgbm9kZSkgewogICAgaWYgKG5vZGUuY29tbWVudC5jb250YWlucyhkaXNhYmxlVmFyaWFibGVNaW5pZmljYXRpb25QYXR0ZXJuKSkgewogICAgICBlbmFibGVSZW5hbWluZyA9IGZhbHNlOwogICAgfSBlbHNlIGlmIChub2RlLmNvbW1lbnQuY29udGFpbnMoZW5hYmxlVmFyaWFibGVNaW5pZmljYXRpb25QYXR0ZXJuKSkgewogICAgICBlbmFibGVSZW5hbWluZyA9IHRydWU7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIGRlY2wpIHsKICAgIGlmIChlbmFibGVSZW5hbWluZyAmJiBkZWNsLmFsbG93UmVuYW1lKSB2YXJzLmFkZChkZWNsLm5hbWUpOwogIH0KfQoKLyoqCiAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIGdpdmVuIG5vZGUgbXVzdCBiZSB3cmFwcGVkIGludG8gYnJhY2VzIHdoZW4gdXNlZAogKiBhcyB0aGVuLXN0YXRlbWVudCBpbiBhbiBbSWZdIHRoYXQgaGFzIGFuIGVsc2UgYnJhbmNoLgogKi8KY2xhc3MgRGFuZ2xpbmdFbHNlVmlzaXRvciBleHRlbmRzIEJhc2VWaXNpdG9yPGJvb2w+IHsKICBKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0IGNvbnRleHQ7CgogIERhbmdsaW5nRWxzZVZpc2l0b3IodGhpcy5jb250ZXh0KTsKCiAgYm9vbCB2aXNpdFByb2dyYW0oUHJvZ3JhbSBub2RlKSA9PiBmYWxzZTsKCiAgYm9vbCB2aXNpdE5vZGUoTm9kZSBub2RlKSB7CiAgICBjb250ZXh0LmVycm9yKCJGb3Jnb3Qgbm9kZTogJG5vZGUiKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgYm9vbCB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpID0+IGZhbHNlOwogIGJvb2wgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdEVtcHR5U3RhdGVtZW50KEVtcHR5U3RhdGVtZW50IG5vZGUpID0+IGZhbHNlOwogIGJvb2wgdmlzaXRJZihJZiBub2RlKSB7CiAgICBpZiAoIW5vZGUuaGFzRWxzZSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gbm9kZS5vdGhlcndpc2UuYWNjZXB0KHRoaXMpOwogIH0KCiAgYm9vbCB2aXNpdEZvcihGb3Igbm9kZSkgPT4gbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICBib29sIHZpc2l0Rm9ySW4oRm9ySW4gbm9kZSkgPT4gbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICBib29sIHZpc2l0V2hpbGUoV2hpbGUgbm9kZSkgPT4gbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICBib29sIHZpc2l0RG8oRG8gbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdENvbnRpbnVlKENvbnRpbnVlIG5vZGUpID0+IGZhbHNlOwogIGJvb2wgdmlzaXRCcmVhayhCcmVhayBub2RlKSA9PiBmYWxzZTsKICBib29sIHZpc2l0UmV0dXJuKFJldHVybiBub2RlKSA9PiBmYWxzZTsKICBib29sIHZpc2l0VGhyb3coVGhyb3cgbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdFRyeShUcnkgbm9kZSkgewogICAgaWYgKG5vZGUuZmluYWxseVBhcnQgIT0gbnVsbCkgewogICAgICByZXR1cm4gbm9kZS5maW5hbGx5UGFydC5hY2NlcHQodGhpcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbm9kZS5jYXRjaFBhcnQuYWNjZXB0KHRoaXMpOwogICAgfQogIH0KCiAgYm9vbCB2aXNpdENhdGNoKENhdGNoIG5vZGUpID0+IG5vZGUuYm9keS5hY2NlcHQodGhpcyk7CiAgYm9vbCB2aXNpdFN3aXRjaChTd2l0Y2ggbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdENhc2UoQ2FzZSBub2RlKSA9PiBmYWxzZTsKICBib29sIHZpc2l0RGVmYXVsdChEZWZhdWx0IG5vZGUpID0+IGZhbHNlOwogIGJvb2wgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSA9PiBub2RlLmJvZHkuYWNjZXB0KHRoaXMpOwogIGJvb2wgdmlzaXRMaXRlcmFsU3RhdGVtZW50KExpdGVyYWxTdGF0ZW1lbnQgbm9kZSkgPT4gdHJ1ZTsKCiAgYm9vbCB2aXNpdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSA9PiBmYWxzZTsKfQoKYWJzdHJhY3QgY2xhc3MgTG9jYWxOYW1lciB7CiAgU3RyaW5nIGdldE5hbWUoU3RyaW5nIG9sZE5hbWUpOwogIFN0cmluZyBkZWNsYXJlVmFyaWFibGUoU3RyaW5nIG9sZE5hbWUpOwogIFN0cmluZyBkZWNsYXJlUGFyYW1ldGVyKFN0cmluZyBvbGROYW1lKTsKICB2b2lkIGVudGVyU2NvcGUoVmFyQ29sbGVjdG9yIHZhcnMpOwogIHZvaWQgbGVhdmVTY29wZSgpOwp9CgpjbGFzcyBJZGVudGl0eU5hbWVyIGltcGxlbWVudHMgTG9jYWxOYW1lciB7CiAgU3RyaW5nIGdldE5hbWUoU3RyaW5nIG9sZE5hbWUpID0+IG9sZE5hbWU7CiAgU3RyaW5nIGRlY2xhcmVWYXJpYWJsZShTdHJpbmcgb2xkTmFtZSkgPT4gb2xkTmFtZTsKICBTdHJpbmcgZGVjbGFyZVBhcmFtZXRlcihTdHJpbmcgb2xkTmFtZSkgPT4gb2xkTmFtZTsKICB2b2lkIGVudGVyU2NvcGUoVmFyQ29sbGVjdG9yIHZhcnMpIHt9CiAgdm9pZCBsZWF2ZVNjb3BlKCkge30KfQoKY2xhc3MgTWluaWZ5UmVuYW1lciBpbXBsZW1lbnRzIExvY2FsTmFtZXIgewogIGZpbmFsIExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gbWFwcyA9IFtdOwogIGZpbmFsIExpc3Q8aW50PiBwYXJhbWV0ZXJOdW1iZXJTdGFjayA9IFtdOwogIGZpbmFsIExpc3Q8aW50PiB2YXJpYWJsZU51bWJlclN0YWNrID0gW107CiAgaW50IHBhcmFtZXRlck51bWJlciA9IDA7CiAgaW50IHZhcmlhYmxlTnVtYmVyID0gMDsKCiAgTWluaWZ5UmVuYW1lcigpOwoKICB2b2lkIGVudGVyU2NvcGUoVmFyQ29sbGVjdG9yIHZhcnMpIHsKICAgIG1hcHMuYWRkKG5ldyBNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwogICAgdmFyaWFibGVOdW1iZXJTdGFjay5hZGQodmFyaWFibGVOdW1iZXIpOwogICAgcGFyYW1ldGVyTnVtYmVyU3RhY2suYWRkKHBhcmFtZXRlck51bWJlcik7CiAgICB2YXJzLmZvckVhY2hWYXIoZGVjbGFyZVZhcmlhYmxlKTsKICAgIHZhcnMuZm9yRWFjaFBhcmFtKGRlY2xhcmVQYXJhbWV0ZXIpOwogIH0KCiAgdm9pZCBsZWF2ZVNjb3BlKCkgewogICAgbWFwcy5yZW1vdmVMYXN0KCk7CiAgICB2YXJpYWJsZU51bWJlciA9IHZhcmlhYmxlTnVtYmVyU3RhY2sucmVtb3ZlTGFzdCgpOwogICAgcGFyYW1ldGVyTnVtYmVyID0gcGFyYW1ldGVyTnVtYmVyU3RhY2sucmVtb3ZlTGFzdCgpOwogIH0KCiAgU3RyaW5nIGdldE5hbWUoU3RyaW5nIG9sZE5hbWUpIHsKICAgIC8vIEdvIGZyb20gaW5uZXIgc2NvcGUgdG8gb3V0ZXIgbG9va2luZyBmb3IgbWFwcGluZyBvZiBuYW1lLgogICAgZm9yIChpbnQgaSA9IG1hcHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgdmFyIG1hcCA9IG1hcHNbaV07CiAgICAgIHZhciByZXBsYWNlbWVudCA9IG1hcFtvbGROYW1lXTsKICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHJldHVybiByZXBsYWNlbWVudDsKICAgIH0KICAgIHJldHVybiBvbGROYW1lOwogIH0KCiAgc3RhdGljIGNvbnN0IExPV0VSX0NBU0VfTEVUVEVSUyA9IDI2OwogIHN0YXRpYyBjb25zdCBMRVRURVJTID0gTE9XRVJfQ0FTRV9MRVRURVJTOwogIHN0YXRpYyBjb25zdCBESUdJVFMgPSAxMDsKCiAgc3RhdGljIGludCBudGhMZXR0ZXIoaW50IG4pIHsKICAgIHJldHVybiAobiA8IExPV0VSX0NBU0VfTEVUVEVSUykKICAgICAgICA/IGNoYXJDb2Rlcy4kYSArIG4KICAgICAgICA6IGNoYXJDb2Rlcy4kQSArIG4gLSBMT1dFUl9DQVNFX0xFVFRFUlM7CiAgfQoKICAvLyBQYXJhbWV0ZXJzIGdvIGZyb20gYSB0byB6IGFuZCB2YXJpYWJsZXMgZ28gZnJvbSB6IHRvIGEuICBUaGlzIG1ha2VzIGVhY2gKICAvLyBhcmd1bWVudCBsaXN0IGFuZCBlYWNoIHRvcC1vZi1mdW5jdGlvbiB2YXIgZGVjbGFyYXRpb24gbG9vayBzaW1pbGFyIGFuZAogIC8vIGhlbHBzIGd6aXAgY29tcHJlc3MgdGhlIGZpbGUuICBJZiB3ZSBoYXZlIG1vcmUgdGhhbiAyNiBhcmd1bWVudHMgYW5kCiAgLy8gdmFyaWFibGVzIHRoZW4gd2UgbWVldCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgYWxwaGFiZXQuICBBZnRlcgogIC8vIHRoYXQgd2UgZ2l2ZSB1cCB0cnlpbmcgdG8gYmUgbmljZSB0byB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGFuZCBqdXN0CiAgLy8gdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSBmb3IgYXJndW1lbnRzIGFuZCB2YXJpYWJsZXMsIHN0YXJ0aW5nIHdpdGggQSwgYW5kCiAgLy8gbW92aW5nIG9uIHRvIGEwLCBhMSwgZXRjLgogIFN0cmluZyBkZWNsYXJlVmFyaWFibGUoU3RyaW5nIG9sZE5hbWUpIHsKICAgIGlmIChhdm9pZFJlbmFtaW5nKG9sZE5hbWUpKSByZXR1cm4gb2xkTmFtZTsKICAgIHZhciBuZXdOYW1lOwogICAgaWYgKHZhcmlhYmxlTnVtYmVyICsgcGFyYW1ldGVyTnVtYmVyIDwgTE9XRVJfQ0FTRV9MRVRURVJTKSB7CiAgICAgIC8vIFZhcmlhYmxlcyBzdGFydCBmcm9tIHogYW5kIGdvIGJhY2t3YXJkcywgZm9yIGJldHRlciBnemlwYWJpbGl0eS4KICAgICAgbmV3TmFtZSA9IGdldE5hbWVOdW1iZXIob2xkTmFtZSwgTE9XRVJfQ0FTRV9MRVRURVJTIC0gMSAtIHZhcmlhYmxlTnVtYmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEFmdGVyIDI2IHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycyB3ZSBhbGxvY2F0ZSB0aGVtIGluIHRoZSBzYW1lIG9yZGVyLgogICAgICBuZXdOYW1lID0gZ2V0TmFtZU51bWJlcihvbGROYW1lLCB2YXJpYWJsZU51bWJlciArIHBhcmFtZXRlck51bWJlcik7CiAgICB9CiAgICB2YXJpYWJsZU51bWJlcisrOwogICAgcmV0dXJuIG5ld05hbWU7CiAgfQoKICBTdHJpbmcgZGVjbGFyZVBhcmFtZXRlcihTdHJpbmcgb2xkTmFtZSkgewogICAgaWYgKGF2b2lkUmVuYW1pbmcob2xkTmFtZSkpIHJldHVybiBvbGROYW1lOwogICAgdmFyIG5ld05hbWU7CiAgICBpZiAodmFyaWFibGVOdW1iZXIgKyBwYXJhbWV0ZXJOdW1iZXIgPCBMT1dFUl9DQVNFX0xFVFRFUlMpIHsKICAgICAgbmV3TmFtZSA9IGdldE5hbWVOdW1iZXIob2xkTmFtZSwgcGFyYW1ldGVyTnVtYmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIG5ld05hbWUgPSBnZXROYW1lTnVtYmVyKG9sZE5hbWUsIHZhcmlhYmxlTnVtYmVyICsgcGFyYW1ldGVyTnVtYmVyKTsKICAgIH0KICAgIHBhcmFtZXRlck51bWJlcisrOwogICAgcmV0dXJuIG5ld05hbWU7CiAgfQoKICBib29sIGF2b2lkUmVuYW1pbmcoU3RyaW5nIG9sZE5hbWUpIHsKICAgIC8vIFZhcmlhYmxlcyBvZiB0aGlzICRmb3JtJCBhcmUgdXNlZCBpbiBwYXR0ZXJuIG1hdGNoaW5nIHRoZSBtZXNzYWdlIG9mIEpTCiAgICAvLyBleGNlcHRpb25zLCBzbyBzaG91bGQgbm90IGJlIHJlbmFtZWQuCiAgICAvLyBUT0RPKHNyYSk6IEludHJvZHVjZSBhIHdheSBmb3IgaW5kaWNhdGluZyBpbiB0aGUgSlMgdGV4dCB3aGljaCB2YXJpYWJsZXMKICAgIC8vIHNob3VsZCBub3QgYmUgcmVuYW1lZC4KICAgIHJldHVybiBvbGROYW1lLnN0YXJ0c1dpdGgocickJykgJiYgb2xkTmFtZS5lbmRzV2l0aChyJyQnKTsKICB9CgogIFN0cmluZyBnZXROYW1lTnVtYmVyKFN0cmluZyBvbGROYW1lLCBpbnQgbikgewogICAgaWYgKG1hcHMuaXNFbXB0eSkgcmV0dXJuIG9sZE5hbWU7CgogICAgU3RyaW5nIG5ld05hbWU7CiAgICBpZiAobiA8IExFVFRFUlMpIHsKICAgICAgLy8gU3RhcnQgbmFtaW5nIHZhcmlhYmxlcyBhLCBiLCBjLCAuLi4sIHosIEEsIEIsIEMsIC4uLiwgWi4KICAgICAgbmV3TmFtZSA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhbbnRoTGV0dGVyKG4pXSk7CiAgICB9IGVsc2UgewogICAgICAvLyBUaGVuIG5hbWUgdmFyaWFibGVzIGEwLCBhMSwgYTIsIC4uLiwgYTksIGIwLCBiMSwgLi4uLCBaOSwgYWEwLCBhYTEsIC4uLgogICAgICAvLyBGb3IgYWxsIGZ1bmN0aW9ucyB3aXRoIGZld2VyIHRoYW4gNTAwIGxvY2FscyB0aGlzIGlzIGp1c3QgYXMgY29tcGFjdAogICAgICAvLyBhcyB1c2luZyBhYSwgYWIsIGV0Yy4gYnV0IGF2b2lkcyBjbGFzaGVzIHdpdGgga2V5d29yZHMuCiAgICAgIG4gLT0gTEVUVEVSUzsKICAgICAgaW50IGRpZ2l0ID0gbiAlIERJR0lUUzsKICAgICAgbiB+Lz0gRElHSVRTOwogICAgICBpbnQgYWxwaGFDaGFycyA9IDE7CiAgICAgIGludCBuYW1lU3BhY2VTaXplID0gTEVUVEVSUzsKICAgICAgLy8gRmluZCBvdXQgd2hldGhlciB3ZSBzaG91bGQgdXNlIHRoZSAxLWNoYXJhY3RlciBuYW1lc3BhY2UgKHNpemUgNTIpLCB0aGUKICAgICAgLy8gMi1jaGFyYWN0ZXIgbmFtZXNwYWNlIChzaXplIDUyKjUyKSwgZXRjLgogICAgICB3aGlsZSAobiA+PSBuYW1lU3BhY2VTaXplKSB7CiAgICAgICAgbiAtPSBuYW1lU3BhY2VTaXplOwogICAgICAgIGFscGhhQ2hhcnMrKzsKICAgICAgICBuYW1lU3BhY2VTaXplICo9IExFVFRFUlM7CiAgICAgIH0KICAgICAgdmFyIGNvZGVzID0gPGludD5bXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbHBoYUNoYXJzOyBpKyspIHsKICAgICAgICBuYW1lU3BhY2VTaXplIH4vPSBMRVRURVJTOwogICAgICAgIGNvZGVzLmFkZChudGhMZXR0ZXIoKG4gfi8gbmFtZVNwYWNlU2l6ZSkgJSBMRVRURVJTKSk7CiAgICAgIH0KICAgICAgY29kZXMuYWRkKGNoYXJDb2Rlcy4kMCArIGRpZ2l0KTsKICAgICAgbmV3TmFtZSA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2Rlcyk7CiAgICB9CiAgICBhc3NlcnQobmV3IFJlZ0V4cChyJ1thLXpBLVpdW2EtekEtWjAtOV0qJykuaGFzTWF0Y2gobmV3TmFtZSkpOwogICAgbWFwcy5sYXN0W29sZE5hbWVdID0gbmV3TmFtZTsKICAgIHJldHVybiBuZXdOYW1lOwogIH0KfQoKLy8vIEluZm9ybWF0aW9uIHBlcnRhaW5pbmcgdGhlIGVudGVyIGFuZCBleGl0IGNhbGxiYWNrcyBmb3IgW25vZGVdLgpjbGFzcyBFbnRlckV4aXROb2RlIHsKICBmaW5hbCBFbnRlckV4aXROb2RlIHBhcmVudDsKICBmaW5hbCBOb2RlIG5vZGU7CgogIGludCBzdGFydFBvc2l0aW9uOwogIGludCBjbG9zaW5nUG9zaXRpb247CgogIEVudGVyRXhpdE5vZGUodGhpcy5wYXJlbnQsIHRoaXMubm9kZSk7CgogIHZvaWQgYWRkVG9Ob2RlKEphdmFTY3JpcHRQcmludGluZ0NvbnRleHQgY29udGV4dCwgaW50IHBvc2l0aW9uKSB7CiAgICBpZiAoc3RhcnRQb3NpdGlvbiA9PSBudWxsKSB7CiAgICAgIC8vIFtwb3NpdGlvbl0gaXMgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIFtub2RlXS4KICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CiAgICAgICAgLy8gVGhpcyBtaWdodCBiZSB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHBhcmVudCBhcyB3ZWxsLgogICAgICAgIHBhcmVudC5hZGRUb05vZGUoY29udGV4dCwgcG9zaXRpb24pOwogICAgICB9CiAgICAgIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvbjsKICAgICAgY29udGV4dC5lbnRlck5vZGUobm9kZSwgcG9zaXRpb24pOwogICAgfQogIH0KCiAgRW50ZXJFeGl0Tm9kZSBleGl0Tm9kZShKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0IGNvbnRleHQsIGludCBwb3NpdGlvbikgewogICAgLy8gRW50ZXIgbXVzdCBoYXBwZW4gYmVmb3JlIGV4aXQuCiAgICBhZGRUb05vZGUoY29udGV4dCwgcG9zaXRpb24pOwogICAgY29udGV4dC5leGl0Tm9kZShub2RlLCBzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiwgY2xvc2luZ1Bvc2l0aW9uKTsKICAgIHJldHVybiBwYXJlbnQ7CiAgfQp9CoZeAE5OPAEQASMBIiMjNyEBIykoPC8BOQIBTywrTh8TBAEjHAFLQAY0MgFJTk5HTCsGNRFNAgFPSjIBHRoEASkCAR9HLC0zFxwCAScrKyMxHwEWGiEhHQEkGDUrAUpGAVAbGz1AJ0kBJkM/Hh8EASUbNzEwBiYEARYUBAEWFAQBPhUjBAEnEywEARQ9BAEhARkrKUMEATUVHiUWIU1ORk1LRzgBS09FQjwYExkMCggaUBQIHCAbFQgSHQYEARsODwQBGiAfDRATBgQBHw4OBAEhDhAEARIhLAYEAR0BHBgfBAEeOCYdBgQBFTAEARwmGwYmPQQBGhUXEwQBQjctFCISFAg3UQYEASQaBAEMJyMeBgQBOx0eHC8oBhMEAU4ZEkcTBjNMGSQNEQYSERISBAEqGRcaNxUNEwYEAUUgFQ4PEjQSDg4qEyEcBAEMIT0EAQw8Djc5FgQBDDIWBAErPikhAU5PGBNJGS0IBiAPEA42Og4YSRMaFA8SCBMcHR0gGw86OAgGBAEMGhcEAQwcFhAOHTM7Bg4iEjg8Bg4fEjU8Bg43NQQBDCAWEA45ORAZMzoONzUEAQwgGBAONjoONzUEAQwaFTs3Eg0QBhIQDjY6DhYEAQwmJB0NMQYWBAEMICQaDS4GFgQBDCIeGw0bGzQ8BkUuFgQBDCgYGw0aBhk3OhYEAQwgGBk3OhYEAQwcFkYiHQYkEhZODREGBAEMIBASEA44Og5HBAEMIhkQDjA6DhAQEhoSFgQBDB4XGTc6ECkUKBQGBAEMJB0pFCgUBgQBDDY+HU4SDEw7Iw4GIUEEATsVGBBNKzwGIQ4eLzwGDiEfDyAmFg8jJhYPJCYXDwYQGkYdHAQBDD4sMA4lIkMjDwQBQTccGC0+NkMnKiQqIzEcGSAQExANIC4TBgQBDD8RKhUtQA1MQD4XFggfLx44FSQUKRcWExgMCjBCIAgXFggGBAEyKigmJi0vSk9MQAYSBAFLFUkRDUoRBikrPicEAQwrS04uHzo0JCcqJjkyDgYiJyMwMiQXFxcXFxcXF0dDKiklTBQMLSk/TycWExQWNEQSCggGOUkkEh8QEjpABgQBDEclBAEMJzZJEA4QMTE6EA4QNj4EAQwXETc+DjQ6DgQBDBktSQ40Og4EAQwkIyUbIyQxEhAlMDEbDxEwLDEPETEsMg8QLCgtDxAtKC4PEC0oLg8RERISLjEPEBARERkRMCwPERESKy8PEBAuOCsUJCU1DxAQEDRNLA8PLwYBO0kBLE0iJA8kDSEPEgY9PgQBDCMaEhUTFU8kESYPEBFLEQ8QEUwRDw8RBjE+BAEMJzJJFQQBDCsnBAEMHhEEAQw8KAQBDCkpBAEfQQQBKyg5MTAqREImJioWCAZNUBQqKhEEAQwsMUkuJS8yMDYoChIkRyIQCCMwUSYIECIdIA4GDjc6DgQBDDksLCc4RyVQJTMEAQwbLBhABAEMNTRAHQQBNilMJAYRBAEMLTkEAQwtFQQBDCcoBAEMMBUEAQw3HgQBDBkoBAEMJw41Og4EAQwrNAQBDCwRBAEMNg4vMCgiS0wrSBwSGhIIHjE8SxkuBg4EAQwoIgQBDDhLTCEuHUwGAT8xDhIyKEUUEiQIGRUSCBwGEi4REAYOBAEMJhokISAnMQ8TCB8eDSUsHQYYDhAyOgQBDDAXBAEMOCUrAS47LEQGRSITLRgZBgQBDDYWBAE2JAQBDEMjAQw9IwEMQSMBDD8jAQxAJgQBDEQhBAEMJCYqISwmIg8qCAYEAQwgExwEAgEWFBYBDxwWARIWNBMGBAEgFwQCAU9IKQ8eISMBTUwBERgpKwE6PgEoExUgNioKCBwWBgQBQ0YxBAE5RjMEARsgBAEfASRFHksdBgQBPEEEAgEESTkENiUBJQEsAR4pEQQBKEQ6GiQoBAE1OTkiLigqKBwkLA0qBgQBOSomLERPPQEyAgEcIiorJhUCASwtNTYoFwIBLC0tLBsaARMBJyktLyYpBAEWFzc5BAEjQTEZJjMGFAQBKC0cASAkGzEEAU5NSkxNTh8rMBFBSlENT0oGFhQEASwwEUE5DUoGFxQEASdPLVAePwQBMCYBFBdCOg1RTkEUHhQaI1EyIxwWIggbLSM+CCcxBkMiFAQCAUQWHhMBFRcBKQFEITUcQy0IICkGBAFMJiJGEwQCAR9wYWNrYWdlOmpzX2FzdC9zcmMvcHJpbnRlci5kYXJ0KXNka3Jvb3Q6L3BrZy9qc19hc3QvbGliL3NyYy90ZW1wbGF0ZS5kYXJ0wABlWi8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGpzX2FzdDsKCmNsYXNzIFRlbXBsYXRlTWFuYWdlciB7CiAgTWFwPFN0cmluZywgVGVtcGxhdGU+IGV4cHJlc3Npb25UZW1wbGF0ZXMgPSBuZXcgTWFwPFN0cmluZywgVGVtcGxhdGU+KCk7CiAgTWFwPFN0cmluZywgVGVtcGxhdGU+IHN0YXRlbWVudFRlbXBsYXRlcyA9IG5ldyBNYXA8U3RyaW5nLCBUZW1wbGF0ZT4oKTsKCiAgVGVtcGxhdGVNYW5hZ2VyKCk7CgogIFRlbXBsYXRlIGxvb2t1cEV4cHJlc3Npb25UZW1wbGF0ZShTdHJpbmcgc291cmNlKSB7CiAgICByZXR1cm4gZXhwcmVzc2lvblRlbXBsYXRlc1tzb3VyY2VdOwogIH0KCiAgVGVtcGxhdGUgZGVmaW5lRXhwcmVzc2lvblRlbXBsYXRlKFN0cmluZyBzb3VyY2UsIE5vZGUgYXN0KSB7CiAgICBUZW1wbGF0ZSB0ZW1wbGF0ZSA9CiAgICAgICAgbmV3IFRlbXBsYXRlKHNvdXJjZSwgYXN0LCBpc0V4cHJlc3Npb246IHRydWUsIGZvcmNlQ29weTogZmFsc2UpOwogICAgZXhwcmVzc2lvblRlbXBsYXRlc1tzb3VyY2VdID0gdGVtcGxhdGU7CiAgICByZXR1cm4gdGVtcGxhdGU7CiAgfQoKICBUZW1wbGF0ZSBsb29rdXBTdGF0ZW1lbnRUZW1wbGF0ZShTdHJpbmcgc291cmNlKSB7CiAgICByZXR1cm4gc3RhdGVtZW50VGVtcGxhdGVzW3NvdXJjZV07CiAgfQoKICBUZW1wbGF0ZSBkZWZpbmVTdGF0ZW1lbnRUZW1wbGF0ZShTdHJpbmcgc291cmNlLCBOb2RlIGFzdCkgewogICAgVGVtcGxhdGUgdGVtcGxhdGUgPQogICAgICAgIG5ldyBUZW1wbGF0ZShzb3VyY2UsIGFzdCwgaXNFeHByZXNzaW9uOiBmYWxzZSwgZm9yY2VDb3B5OiBmYWxzZSk7CiAgICBzdGF0ZW1lbnRUZW1wbGF0ZXNbc291cmNlXSA9IHRlbXBsYXRlOwogICAgcmV0dXJuIHRlbXBsYXRlOwogIH0KfQoKLyoqCiAqIEEgVGVtcGxhdGUgaXMgY3JlYXRlZCB3aXRoIEphdmFTY3JpcHQgQVNUIGNvbnRhaW5pbmcgcGxhY2Vob2xkZXJzIChpbnRlcmZhY2UKICogSW50ZXJwb2xhdGVkTm9kZSkuICBUaGUgW2luc3RhbnRpYXRlXSBtZXRob2QgY3JlYXRlcyBhbiBBU1QgdGhhdCBsb29rcyBsaWtlCiAqIHRoZSBvcmlnaW5hbCB3aXRoIHRoZSBwbGFjZWhvbGRlcnMgcmVwbGFjZWQgYnkgdGhlIGFyZ3VtZW50cyB0bwogKiBbaW5zdGFudGlhdGVdLgogKi8KY2xhc3MgVGVtcGxhdGUgewogIGZpbmFsIFN0cmluZyBzb3VyY2U7CiAgZmluYWwgYm9vbCBpc0V4cHJlc3Npb247CiAgZmluYWwgYm9vbCBmb3JjZUNvcHk7CiAgZmluYWwgTm9kZSBhc3Q7CgogIEluc3RhbnRpYXRvciBpbnN0YW50aWF0b3I7CgogIGludCBwb3NpdGlvbmFsQXJndW1lbnRDb3VudCA9IC0xOwoKICAvLyBOdWxsLCB1bmxlc3MgdGhlcmUgYXJlIG5hbWVkIGhvbGVzLgogIExpc3Q8U3RyaW5nPiBob2xlTmFtZXM7CiAgYm9vbCBnZXQgaXNQb3NpdGlvbmFsID0+IGhvbGVOYW1lcyA9PSBudWxsOwoKICBUZW1wbGF0ZSh0aGlzLnNvdXJjZSwgdGhpcy5hc3QsCiAgICAgIHt0aGlzLmlzRXhwcmVzc2lvbjogdHJ1ZSwgdGhpcy5mb3JjZUNvcHk6IGZhbHNlfSkgewogICAgYXNzZXJ0KHRoaXMuaXNFeHByZXNzaW9uID8gYXN0IGlzIEV4cHJlc3Npb24gOiBhc3QgaXMgU3RhdGVtZW50KTsKICAgIF9jb21waWxlKCk7CiAgfQoKICBUZW1wbGF0ZS53aXRoRXhwcmVzc2lvblJlc3VsdCh0aGlzLmFzdCkKICAgICAgOiBzb3VyY2UgPSBudWxsLAogICAgICAgIGlzRXhwcmVzc2lvbiA9IHRydWUsCiAgICAgICAgZm9yY2VDb3B5ID0gZmFsc2UgewogICAgYXNzZXJ0KGFzdCBpcyBFeHByZXNzaW9uKTsKICAgIGFzc2VydChfY2hlY2tOb1BsYWNlaG9sZGVycygpKTsKICAgIHBvc2l0aW9uYWxBcmd1bWVudENvdW50ID0gMDsKICAgIGluc3RhbnRpYXRvciA9IChhcmd1bWVudHMpID0+IGFzdDsKICB9CgogIFRlbXBsYXRlLndpdGhTdGF0ZW1lbnRSZXN1bHQodGhpcy5hc3QpCiAgICAgIDogc291cmNlID0gbnVsbCwKICAgICAgICBpc0V4cHJlc3Npb24gPSBmYWxzZSwKICAgICAgICBmb3JjZUNvcHkgPSBmYWxzZSB7CiAgICBhc3NlcnQoYXN0IGlzIFN0YXRlbWVudCk7CiAgICBhc3NlcnQoX2NoZWNrTm9QbGFjZWhvbGRlcnMoKSk7CiAgICBwb3NpdGlvbmFsQXJndW1lbnRDb3VudCA9IDA7CiAgICBpbnN0YW50aWF0b3IgPSAoYXJndW1lbnRzKSA9PiBhc3Q7CiAgfQoKICBib29sIF9jaGVja05vUGxhY2Vob2xkZXJzKCkgewogICAgSW5zdGFudGlhdG9yR2VuZXJhdG9yVmlzaXRvciBnZW5lcmF0b3IgPQogICAgICAgIG5ldyBJbnN0YW50aWF0b3JHZW5lcmF0b3JWaXNpdG9yKGZhbHNlKTsKICAgIGdlbmVyYXRvci5jb21waWxlKGFzdCk7CiAgICByZXR1cm4gZ2VuZXJhdG9yLmFuYWx5c2lzLmNvdW50ID09IDA7CiAgfQoKICB2b2lkIF9jb21waWxlKCkgewogICAgSW5zdGFudGlhdG9yR2VuZXJhdG9yVmlzaXRvciBnZW5lcmF0b3IgPQogICAgICAgIG5ldyBJbnN0YW50aWF0b3JHZW5lcmF0b3JWaXNpdG9yKGZvcmNlQ29weSk7CiAgICBpbnN0YW50aWF0b3IgPSBnZW5lcmF0b3IuY29tcGlsZShhc3QpOwogICAgcG9zaXRpb25hbEFyZ3VtZW50Q291bnQgPSBnZW5lcmF0b3IuYW5hbHlzaXMuY291bnQ7CiAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IGdlbmVyYXRvci5hbmFseXNpcy5ob2xlTmFtZXM7CiAgICBob2xlTmFtZXMgPSBuYW1lcy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICB9CgogIC8vLyBJbnN0YW50aWF0ZXMgdGhlIHRlbXBsYXRlIHdpdGggdGhlIGdpdmVuIFthcmd1bWVudHNdLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBmaWxscyBpbiB0aGUgaG9sZXMgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBUaGUgW2FyZ3VtZW50c10KICAvLy8gbXVzdCBiZSBlaXRoZXIgYSBbTGlzdF0gb3IgYSBbTWFwXS4KICBOb2RlIGluc3RhbnRpYXRlKHZhciBhcmd1bWVudHMpIHsKICAgIGlmIChhcmd1bWVudHMgaXMgTGlzdCkgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPSBwb3NpdGlvbmFsQXJndW1lbnRDb3VudCkgewogICAgICAgIHRocm93ICdXcm9uZyBudW1iZXIgb2YgdGVtcGxhdGUgYXJndW1lbnRzLCBnaXZlbiAke2FyZ3VtZW50cy5sZW5ndGh9LCAnCiAgICAgICAgICAgICdleHBlY3RlZCAkcG9zaXRpb25hbEFyZ3VtZW50Q291bnQnCiAgICAgICAgICAgICcsIHNvdXJjZTogIiRzb3VyY2UiJzsKICAgICAgfQogICAgICByZXR1cm4gaW5zdGFudGlhdG9yKGFyZ3VtZW50cyk7CiAgICB9CiAgICBhc3NlcnQoYXJndW1lbnRzIGlzIE1hcCk7CiAgICBpZiAoaG9sZU5hbWVzLmxlbmd0aCA8IGFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgLy8gVGhpcyBzZWFyY2ggaXMgaW4gTyhuKSwgYnV0IHdlIG9ubHkgZG8gaXQgaW4gY2FzZSBvZiBhbiBlcnJvciwgYW5kIHRoZQogICAgICAvLyBudW1iZXIgb2YgaG9sZXMgc2hvdWxkIGJlIHF1aXRlIGxpbWl0ZWQuCiAgICAgIFN0cmluZyB1bnVzZWROYW1lcyA9CiAgICAgICAgICBhcmd1bWVudHMua2V5cy53aGVyZSgobmFtZSkgPT4gIWhvbGVOYW1lcy5jb250YWlucyhuYW1lKSkuam9pbigiLCAiKTsKICAgICAgdGhyb3cgIlRlbXBsYXRlIGFyZ3VtZW50cyBoYXMgdW51c2VkIG1hcHBpbmdzOiAkdW51c2VkTmFtZXMiOwogICAgfQogICAgaWYgKCFob2xlTmFtZXMuZXZlcnkoKFN0cmluZyBuYW1lKSA9PiBhcmd1bWVudHMuY29udGFpbnNLZXkobmFtZSkpKSB7CiAgICAgIFN0cmluZyBub3RGb3VuZCA9CiAgICAgICAgICBob2xlTmFtZXMud2hlcmUoKG5hbWUpID0+ICFhcmd1bWVudHMuY29udGFpbnNLZXkobmFtZSkpLmpvaW4oIiwgIik7CiAgICAgIHRocm93ICJUZW1wbGF0ZSBhcmd1bWVudHMgaXMgbWlzc2luZyBtYXBwaW5ncyBmb3I6ICRub3RGb3VuZCI7CiAgICB9CiAgICByZXR1cm4gaW5zdGFudGlhdG9yKGFyZ3VtZW50cyk7CiAgfQp9CgovKioKICogQW4gSW5zdGFudGlhdG9yIGlzIGEgRnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgYSBKUyBBU1QgdHJlZSBvciBMaXN0IG9mCiAqIHRyZWVzLiBbYXJndW1lbnRzXSBpcyBhIExpc3QgZm9yIHBvc2l0aW9uYWwgdGVtcGxhdGVzLCBvciBNYXAgZm9yCiAqIG5hbWVkIHRlbXBsYXRlcy4KICovCnR5cGVkZWYgLypOb2RlfEl0ZXJhYmxlPE5vZGU+Ki8gSW5zdGFudGlhdG9yKHZhciBhcmd1bWVudHMpOwoKLyoqCiAqIEluc3RhbnRpYXRvckdlbmVyYXRvclZpc2l0b3IgY29tcGlsZXMgYSB0ZW1wbGF0ZS4gIFRoaXMgY2xhc3MgY29tcGlsZXMgYSB0cmVlCiAqIGNvbnRhaW5pbmcgW0ludGVycG9sYXRlZE5vZGVdcyBpbnRvIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGNyZWF0ZSBhIGNvcHkgb2YgdGhlCiAqIHRyZWUgd2l0aCB0aGUgaW50ZXJwb2xhdGVkIG5vZGVzIHN1YnN0aXR1dGVkIHdpdGggcHJvdmlkZWQgdmFsdWVzLgogKi8KY2xhc3MgSW5zdGFudGlhdG9yR2VuZXJhdG9yVmlzaXRvciBpbXBsZW1lbnRzIE5vZGVWaXNpdG9yPEluc3RhbnRpYXRvcj4gewogIGZpbmFsIGJvb2wgZm9yY2VDb3B5OwoKICBJbnRlcnBvbGF0ZWROb2RlQW5hbHlzaXMgYW5hbHlzaXMgPSBuZXcgSW50ZXJwb2xhdGVkTm9kZUFuYWx5c2lzKCk7CgogIC8qKgogICAqIFRoZSBlbnRpcmUgdHJlZSBpcyBjbG9uZWQgaWYgW2ZvcmNlQ29weV0gaXMgdHJ1ZS4KICAgKi8KICBJbnN0YW50aWF0b3JHZW5lcmF0b3JWaXNpdG9yKHRoaXMuZm9yY2VDb3B5KTsKCiAgSW5zdGFudGlhdG9yIGNvbXBpbGUoTm9kZSBub2RlKSB7CiAgICBhbmFseXNpcy52aXNpdChub2RlKTsKICAgIEluc3RhbnRpYXRvciByZXN1bHQgPSB2aXNpdChub2RlKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgZXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKICAgIHRocm93IG1lc3NhZ2U7CiAgfQoKICBzdGF0aWMgSW5zdGFudGlhdG9yIHNhbWUoTm9kZSBub2RlKSA9PiAoYXJndW1lbnRzKSA9PiBub2RlOwogIHN0YXRpYyBOb2RlIG1ha2VOdWxsKGFyZ3VtZW50cykgPT4gbnVsbDsKCiAgSW5zdGFudGlhdG9yIHZpc2l0KE5vZGUgbm9kZSkgewogICAgaWYgKGZvcmNlQ29weSB8fCBhbmFseXNpcy5jb250YWluc0ludGVycG9sYXRlZE5vZGVzKG5vZGUpKSB7CiAgICAgIHJldHVybiBub2RlLmFjY2VwdCh0aGlzKTsKICAgIH0KICAgIHJldHVybiBzYW1lKG5vZGUpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0TnVsbGFibGUoTm9kZSBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gbWFrZU51bGw7CiAgICByZXR1cm4gdmlzaXQobm9kZSk7CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRTcGxheWFibGUoTm9kZSBub2RlKSB7CiAgICAvLyBUT0RPKHNyYSk6IFByb2Nlc3MgaW1tZWRpYXRlIFtJbnRlcnBvbGF0ZWROb2RlXXMsIHBlcm1pdHRpbmcgc3BsYXlpbmcuCiAgICByZXR1cm4gdmlzaXQobm9kZSk7CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXROb2RlKE5vZGUgbm9kZSkgewogICAgdGhyb3cgJ1VuaW1wbGVtZW50ZWQgSW5zdGFudGlhdG9yR2VuZXJhdG9yVmlzaXRvciBmb3IgJG5vZGUnOwogIH0KCiAgc3RhdGljIFJlZ0V4cCBpZGVudGlmaWVyUkUgPSBuZXcgUmVnRXhwKHInXltBLVphLXpfJF1bQS1aYS16XyQwLTldKiQnKTsKCiAgc3RhdGljIEV4cHJlc3Npb24gY29udmVydFN0cmluZ1RvVmFyaWFibGVVc2UoU3RyaW5nIHZhbHVlKSB7CiAgICBhc3NlcnQoaWRlbnRpZmllclJFLmhhc01hdGNoKHZhbHVlKSk7CiAgICByZXR1cm4gbmV3IFZhcmlhYmxlVXNlKHZhbHVlKTsKICB9CgogIHN0YXRpYyBFeHByZXNzaW9uIGNvbnZlcnRTdHJpbmdUb1ZhcmlhYmxlRGVjbGFyYXRpb24oU3RyaW5nIHZhbHVlKSB7CiAgICBhc3NlcnQoaWRlbnRpZmllclJFLmhhc01hdGNoKHZhbHVlKSk7CiAgICByZXR1cm4gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24odmFsdWUpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbihJbnRlcnBvbGF0ZWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHZhciBuYW1lT3JQb3NpdGlvbiA9IG5vZGUubmFtZU9yUG9zaXRpb247CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbbmFtZU9yUG9zaXRpb25dOwogICAgICBpZiAodmFsdWUgaXMgRXhwcmVzc2lvbikgcmV0dXJuIHZhbHVlOwogICAgICBpZiAodmFsdWUgaXMgU3RyaW5nKSByZXR1cm4gY29udmVydFN0cmluZ1RvVmFyaWFibGVVc2UodmFsdWUpOwogICAgICB0aHJvdyBlcnJvcigKICAgICAgICAgICdJbnRlcnBvbGF0ZWQgdmFsdWUgIyRuYW1lT3JQb3NpdGlvbiBpcyBub3QgYW4gRXhwcmVzc2lvbjogJHZhbHVlJyk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0SW50ZXJwb2xhdGVkRGVjbGFyYXRpb24oSW50ZXJwb2xhdGVkRGVjbGFyYXRpb24gbm9kZSkgewogICAgdmFyIG5hbWVPclBvc2l0aW9uID0gbm9kZS5uYW1lT3JQb3NpdGlvbjsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1tuYW1lT3JQb3NpdGlvbl07CiAgICAgIGlmICh2YWx1ZSBpcyBEZWNsYXJhdGlvbikgcmV0dXJuIHZhbHVlOwogICAgICBpZiAodmFsdWUgaXMgU3RyaW5nKSByZXR1cm4gY29udmVydFN0cmluZ1RvVmFyaWFibGVEZWNsYXJhdGlvbih2YWx1ZSk7CiAgICAgIHRocm93IGVycm9yKAogICAgICAgICAgJ0ludGVycG9sYXRlZCB2YWx1ZSAjJG5hbWVPclBvc2l0aW9uIGlzIG5vdCBhIGRlY2xhcmF0aW9uOiAkdmFsdWUnKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRTcGxheWFibGVFeHByZXNzaW9uKE5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgaXMgSW50ZXJwb2xhdGVkRXhwcmVzc2lvbikgewogICAgICB2YXIgbmFtZU9yUG9zaXRpb24gPSBub2RlLm5hbWVPclBvc2l0aW9uOwogICAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1tuYW1lT3JQb3NpdGlvbl07CiAgICAgICAgRXhwcmVzc2lvbiB0b0V4cHJlc3Npb24oaXRlbSkgewogICAgICAgICAgaWYgKGl0ZW0gaXMgRXhwcmVzc2lvbikgcmV0dXJuIGl0ZW07CiAgICAgICAgICBpZiAoaXRlbSBpcyBTdHJpbmcpIHJldHVybiBjb252ZXJ0U3RyaW5nVG9WYXJpYWJsZVVzZShpdGVtKTsKICAgICAgICAgIHRocm93IGVycm9yKCdJbnRlcnBvbGF0ZWQgdmFsdWUgIyRuYW1lT3JQb3NpdGlvbiBpcyBub3QgJwogICAgICAgICAgICAgICdhbiBFeHByZXNzaW9uIG9yIExpc3Qgb2YgRXhwcmVzc2lvbnM6ICR2YWx1ZScpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHZhbHVlIGlzIEl0ZXJhYmxlKSByZXR1cm4gdmFsdWUubWFwKHRvRXhwcmVzc2lvbik7CiAgICAgICAgcmV0dXJuIHRvRXhwcmVzc2lvbih2YWx1ZSk7CiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gdmlzaXQobm9kZSk7CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRJbnRlcnBvbGF0ZWRMaXRlcmFsKEludGVycG9sYXRlZExpdGVyYWwgbm9kZSkgewogICAgdmFyIG5hbWVPclBvc2l0aW9uID0gbm9kZS5uYW1lT3JQb3NpdGlvbjsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1tuYW1lT3JQb3NpdGlvbl07CiAgICAgIGlmICh2YWx1ZSBpcyBMaXRlcmFsIHx8IHZhbHVlIGlzIERlZmVycmVkRXhwcmVzc2lvbikgcmV0dXJuIHZhbHVlOwogICAgICBlcnJvcignSW50ZXJwb2xhdGVkIHZhbHVlICMkbmFtZU9yUG9zaXRpb24gaXMgbm90IGEgTGl0ZXJhbDogJHZhbHVlJyk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0SW50ZXJwb2xhdGVkUGFyYW1ldGVyKEludGVycG9sYXRlZFBhcmFtZXRlciBub2RlKSB7CiAgICB2YXIgbmFtZU9yUG9zaXRpb24gPSBub2RlLm5hbWVPclBvc2l0aW9uOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzW25hbWVPclBvc2l0aW9uXTsKCiAgICAgIFBhcmFtZXRlciB0b1BhcmFtZXRlcihpdGVtKSB7CiAgICAgICAgaWYgKGl0ZW0gaXMgUGFyYW1ldGVyKSByZXR1cm4gaXRlbTsKICAgICAgICBpZiAoaXRlbSBpcyBTdHJpbmcpIHJldHVybiBuZXcgUGFyYW1ldGVyKGl0ZW0pOwogICAgICAgIHRocm93IGVycm9yKCdJbnRlcnBvbGF0ZWQgdmFsdWUgIyRuYW1lT3JQb3NpdGlvbiBpcyBub3QgYSBQYXJhbWV0ZXIgb3InCiAgICAgICAgICAgICcgTGlzdCBvZiBQYXJhbWV0ZXJzOiAkdmFsdWUnKTsKICAgICAgfQoKICAgICAgaWYgKHZhbHVlIGlzIEl0ZXJhYmxlKSByZXR1cm4gdmFsdWUubWFwKHRvUGFyYW1ldGVyKTsKICAgICAgcmV0dXJuIHRvUGFyYW1ldGVyKHZhbHVlKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRJbnRlcnBvbGF0ZWRTZWxlY3RvcihJbnRlcnBvbGF0ZWRTZWxlY3RvciBub2RlKSB7CiAgICAvLyBBIHNlbGVjdG9yIGlzIGFuIGV4cHJlc3Npb24sIGFzIGluIGBhW3NlbGVjdG9yXWAuCiAgICAvLyBBIFN0cmluZyBhcmd1bWVudCBjb252ZXJ0ZWQgaW50byBhIExpdGVyYWxTdHJpbmcsIHNvIGBhLiNgIHdpdGggYXJndW1lbnQKICAgIC8vICdmb28nIGdlbmVyYXRlcyBgYVsiZm9vIl1gIHdoaWNoIHByaW50cyBhcyBgYS5mb29gLgogICAgdmFyIG5hbWVPclBvc2l0aW9uID0gbm9kZS5uYW1lT3JQb3NpdGlvbjsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1tuYW1lT3JQb3NpdGlvbl07CiAgICAgIGlmICh2YWx1ZSBpcyBFeHByZXNzaW9uKSByZXR1cm4gdmFsdWU7CiAgICAgIGlmICh2YWx1ZSBpcyBTdHJpbmcpIHJldHVybiBuZXcgTGl0ZXJhbFN0cmluZygnIiR2YWx1ZSInKTsKICAgICAgdGhyb3cgZXJyb3IoCiAgICAgICAgICAnSW50ZXJwb2xhdGVkIHZhbHVlICMkbmFtZU9yUG9zaXRpb24gaXMgbm90IGEgc2VsZWN0b3I6ICR2YWx1ZScpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdEludGVycG9sYXRlZFN0YXRlbWVudChJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgdmFyIG5hbWVPclBvc2l0aW9uID0gbm9kZS5uYW1lT3JQb3NpdGlvbjsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1tuYW1lT3JQb3NpdGlvbl07CiAgICAgIGlmICh2YWx1ZSBpcyBOb2RlKSByZXR1cm4gdmFsdWUudG9TdGF0ZW1lbnQoKTsKICAgICAgdGhyb3cgZXJyb3IoCiAgICAgICAgICAnSW50ZXJwb2xhdGVkIHZhbHVlICMkbmFtZU9yUG9zaXRpb24gaXMgbm90IGEgU3RhdGVtZW50OiAkdmFsdWUnKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRTcGxheWFibGVTdGF0ZW1lbnQoTm9kZSBub2RlKSB7CiAgICBpZiAobm9kZSBpcyBJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQpIHsKICAgICAgdmFyIG5hbWVPclBvc2l0aW9uID0gbm9kZS5uYW1lT3JQb3NpdGlvbjsKICAgICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbbmFtZU9yUG9zaXRpb25dOwogICAgICAgIFN0YXRlbWVudCB0b1N0YXRlbWVudChpdGVtKSB7CiAgICAgICAgICBpZiAoaXRlbSBpcyBTdGF0ZW1lbnQpIHJldHVybiBpdGVtOwogICAgICAgICAgaWYgKGl0ZW0gaXMgRXhwcmVzc2lvbikgcmV0dXJuIGl0ZW0udG9TdGF0ZW1lbnQoKTsKICAgICAgICAgIHRocm93IGVycm9yKCdJbnRlcnBvbGF0ZWQgdmFsdWUgIyRuYW1lT3JQb3NpdGlvbiBpcyBub3QgJwogICAgICAgICAgICAgICdhIFN0YXRlbWVudCBvciBMaXN0IG9mIFN0YXRlbWVudHM6ICR2YWx1ZScpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHZhbHVlIGlzIEl0ZXJhYmxlKSByZXR1cm4gdmFsdWUubWFwKHRvU3RhdGVtZW50KTsKICAgICAgICByZXR1cm4gdG9TdGF0ZW1lbnQodmFsdWUpOwogICAgICB9OwogICAgfQogICAgcmV0dXJuIHZpc2l0KG5vZGUpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0UHJvZ3JhbShQcm9ncmFtIG5vZGUpIHsKICAgIExpc3Q8SW5zdGFudGlhdG9yPiBpbnN0YW50aWF0b3JzID0KICAgICAgICBub2RlLmJvZHkubWFwKHZpc2l0U3BsYXlhYmxlU3RhdGVtZW50KS50b0xpc3QoKTsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gPFN0YXRlbWVudD5bXTsKICAgICAgdm9pZCBhZGQobm9kZSkgewogICAgICAgIGlmIChub2RlIGlzIEVtcHR5U3RhdGVtZW50KSByZXR1cm47CiAgICAgICAgaWYgKG5vZGUgaXMgSXRlcmFibGUpIHsKICAgICAgICAgIHN0YXRlbWVudHMuYWRkQWxsKG5vZGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZW1lbnRzLmFkZChub2RlLnRvU3RhdGVtZW50KCkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9yIChJbnN0YW50aWF0b3IgaW5zdGFudGlhdG9yIGluIGluc3RhbnRpYXRvcnMpIHsKICAgICAgICBhZGQoaW5zdGFudGlhdG9yKGFyZ3VtZW50cykpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgUHJvZ3JhbShzdGF0ZW1lbnRzKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRCbG9jayhCbG9jayBub2RlKSB7CiAgICBMaXN0PEluc3RhbnRpYXRvcj4gaW5zdGFudGlhdG9ycyA9CiAgICAgICAgbm9kZS5zdGF0ZW1lbnRzLm1hcCh2aXNpdFNwbGF5YWJsZVN0YXRlbWVudCkudG9MaXN0KCk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICBMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W107CiAgICAgIHZvaWQgYWRkKG5vZGUpIHsKICAgICAgICBpZiAobm9kZSBpcyBFbXB0eVN0YXRlbWVudCkgcmV0dXJuOwogICAgICAgIGlmIChub2RlIGlzIEl0ZXJhYmxlKSB7CiAgICAgICAgICBzdGF0ZW1lbnRzLmFkZEFsbChub2RlKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgQmxvY2spIHsKICAgICAgICAgIHN0YXRlbWVudHMuYWRkQWxsKG5vZGUuc3RhdGVtZW50cyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YXRlbWVudHMuYWRkKG5vZGUudG9TdGF0ZW1lbnQoKSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3IgKEluc3RhbnRpYXRvciBpbnN0YW50aWF0b3IgaW4gaW5zdGFudGlhdG9ycykgewogICAgICAgIGFkZChpbnN0YW50aWF0b3IoYXJndW1lbnRzKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBCbG9jayhzdGF0ZW1lbnRzKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgSW5zdGFudGlhdG9yIGJ1aWxkRXhwcmVzc2lvbiA9IHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICByZXR1cm4gYnVpbGRFeHByZXNzaW9uKGFyZ3VtZW50cykudG9TdGF0ZW1lbnQoKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlKSA9PgogICAgICAoYXJndW1lbnRzKSA9PiBuZXcgRW1wdHlTdGF0ZW1lbnQoKTsKCiAgSW5zdGFudGlhdG9yIHZpc2l0SWYoSWYgbm9kZSkgewogICAgaWYgKG5vZGUuY29uZGl0aW9uIGlzIEludGVycG9sYXRlZEV4cHJlc3Npb24pIHsKICAgICAgcmV0dXJuIHZpc2l0SWZDb25kaXRpb25hbENvbXBpbGF0aW9uKG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHZpc2l0SWZOb3JtYWwobm9kZSk7CiAgICB9CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRJZkNvbmRpdGlvbmFsQ29tcGlsYXRpb24oSWYgbm9kZSkgewogICAgLy8gU3BlY2lhbCB2ZXJzaW9uIG9mIHZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbiB0aGF0IHBlcm1pdHMgYm9vbHMuCiAgICBjb21waWxlQ29uZGl0aW9uKEludGVycG9sYXRlZEV4cHJlc3Npb24gbm9kZSkgewogICAgICB2YXIgbmFtZU9yUG9zaXRpb24gPSBub2RlLm5hbWVPclBvc2l0aW9uOwogICAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1tuYW1lT3JQb3NpdGlvbl07CiAgICAgICAgaWYgKHZhbHVlIGlzIGJvb2wpIHJldHVybiB2YWx1ZTsKICAgICAgICBpZiAodmFsdWUgaXMgRXhwcmVzc2lvbikgcmV0dXJuIHZhbHVlOwogICAgICAgIGlmICh2YWx1ZSBpcyBTdHJpbmcpIHJldHVybiBjb252ZXJ0U3RyaW5nVG9WYXJpYWJsZVVzZSh2YWx1ZSk7CiAgICAgICAgdGhyb3cgZXJyb3IoJ0ludGVycG9sYXRlZCB2YWx1ZSAjJG5hbWVPclBvc2l0aW9uICcKICAgICAgICAgICAgJ2lzIG5vdCBhbiBFeHByZXNzaW9uOiAkdmFsdWUnKTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgbWFrZUNvbmRpdGlvbiA9IGNvbXBpbGVDb25kaXRpb24obm9kZS5jb25kaXRpb24pOwogICAgSW5zdGFudGlhdG9yIG1ha2VUaGVuID0gdmlzaXQobm9kZS50aGVuKTsKICAgIEluc3RhbnRpYXRvciBtYWtlT3RoZXJ3aXNlID0gdmlzaXQobm9kZS5vdGhlcndpc2UpOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgdmFyIGNvbmRpdGlvbiA9IG1ha2VDb25kaXRpb24oYXJndW1lbnRzKTsKICAgICAgaWYgKGNvbmRpdGlvbiBpcyBib29sKSB7CiAgICAgICAgaWYgKGNvbmRpdGlvbiA9PSB0cnVlKSB7CiAgICAgICAgICByZXR1cm4gbWFrZVRoZW4oYXJndW1lbnRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIG1ha2VPdGhlcndpc2UoYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBJZihjb25kaXRpb24sIG1ha2VUaGVuKGFyZ3VtZW50cyksIG1ha2VPdGhlcndpc2UoYXJndW1lbnRzKSk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0SWZOb3JtYWwoSWYgbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VDb25kaXRpb24gPSB2aXNpdChub2RlLmNvbmRpdGlvbik7CiAgICBJbnN0YW50aWF0b3IgbWFrZVRoZW4gPSB2aXNpdChub2RlLnRoZW4pOwogICAgSW5zdGFudGlhdG9yIG1ha2VPdGhlcndpc2UgPSB2aXNpdChub2RlLm90aGVyd2lzZSk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICByZXR1cm4gbmV3IElmKG1ha2VDb25kaXRpb24oYXJndW1lbnRzKSwgbWFrZVRoZW4oYXJndW1lbnRzKSwKICAgICAgICAgIG1ha2VPdGhlcndpc2UoYXJndW1lbnRzKSk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0Rm9yKEZvciBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZUluaXQgPSB2aXNpdE51bGxhYmxlKG5vZGUuaW5pdCk7CiAgICBJbnN0YW50aWF0b3IgbWFrZUNvbmRpdGlvbiA9IHZpc2l0TnVsbGFibGUobm9kZS5jb25kaXRpb24pOwogICAgSW5zdGFudGlhdG9yIG1ha2VVcGRhdGUgPSB2aXNpdE51bGxhYmxlKG5vZGUudXBkYXRlKTsKICAgIEluc3RhbnRpYXRvciBtYWtlQm9keSA9IHZpc2l0KG5vZGUuYm9keSk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICByZXR1cm4gbmV3IEZvcihtYWtlSW5pdChhcmd1bWVudHMpLCBtYWtlQ29uZGl0aW9uKGFyZ3VtZW50cyksCiAgICAgICAgICBtYWtlVXBkYXRlKGFyZ3VtZW50cyksIG1ha2VCb2R5KGFyZ3VtZW50cykpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdEZvckluKEZvckluIG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlTGVmdEhhbmRTaWRlID0gdmlzaXQobm9kZS5sZWZ0SGFuZFNpZGUpOwogICAgSW5zdGFudGlhdG9yIG1ha2VPYmplY3QgPSB2aXNpdChub2RlLm9iamVjdCk7CiAgICBJbnN0YW50aWF0b3IgbWFrZUJvZHkgPSB2aXNpdChub2RlLmJvZHkpOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgcmV0dXJuIG5ldyBGb3JJbihtYWtlTGVmdEhhbmRTaWRlKGFyZ3VtZW50cyksIG1ha2VPYmplY3QoYXJndW1lbnRzKSwKICAgICAgICAgIG1ha2VCb2R5KGFyZ3VtZW50cykpOwogICAgfTsKICB9CgogIFRPRE8oU3RyaW5nIG5hbWUpIHsKICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoJyR0aGlzLiRuYW1lJyk7CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRXaGlsZShXaGlsZSBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZUNvbmRpdGlvbiA9IHZpc2l0KG5vZGUuY29uZGl0aW9uKTsKICAgIEluc3RhbnRpYXRvciBtYWtlQm9keSA9IHZpc2l0KG5vZGUuYm9keSk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICByZXR1cm4gbmV3IFdoaWxlKG1ha2VDb25kaXRpb24oYXJndW1lbnRzKSwgbWFrZUJvZHkoYXJndW1lbnRzKSk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0RG8oRG8gbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VCb2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIEluc3RhbnRpYXRvciBtYWtlQ29uZGl0aW9uID0gdmlzaXQobm9kZS5jb25kaXRpb24pOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgcmV0dXJuIG5ldyBEbyhtYWtlQm9keShhcmd1bWVudHMpLCBtYWtlQ29uZGl0aW9uKGFyZ3VtZW50cykpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdENvbnRpbnVlKENvbnRpbnVlIG5vZGUpID0+CiAgICAgIChhcmd1bWVudHMpID0+IG5ldyBDb250aW51ZShub2RlLnRhcmdldExhYmVsKTsKCiAgSW5zdGFudGlhdG9yIHZpc2l0QnJlYWsoQnJlYWsgbm9kZSkgPT4KICAgICAgKGFyZ3VtZW50cykgPT4gbmV3IEJyZWFrKG5vZGUudGFyZ2V0TGFiZWwpOwoKICBJbnN0YW50aWF0b3IgdmlzaXRSZXR1cm4oUmV0dXJuIG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlRXhwcmVzc2lvbiA9IHZpc2l0TnVsbGFibGUobm9kZS52YWx1ZSk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgPT4gbmV3IFJldHVybihtYWtlRXhwcmVzc2lvbihhcmd1bWVudHMpKTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdERhcnRZaWVsZChEYXJ0WWllbGQgbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VFeHByZXNzaW9uID0gdmlzaXQobm9kZS5leHByZXNzaW9uKTsKICAgIHJldHVybiAoYXJndW1lbnRzKSA9PgogICAgICAgIG5ldyBEYXJ0WWllbGQobWFrZUV4cHJlc3Npb24oYXJndW1lbnRzKSwgbm9kZS5oYXNTdGFyKTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdFRocm93KFRocm93IG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlRXhwcmVzc2lvbiA9IHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgPT4gbmV3IFRocm93KG1ha2VFeHByZXNzaW9uKGFyZ3VtZW50cykpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0VHJ5KFRyeSBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZUJvZHkgPSB2aXNpdChub2RlLmJvZHkpOwogICAgSW5zdGFudGlhdG9yIG1ha2VDYXRjaCA9IHZpc2l0TnVsbGFibGUobm9kZS5jYXRjaFBhcnQpOwogICAgSW5zdGFudGlhdG9yIG1ha2VGaW5hbGx5ID0gdmlzaXROdWxsYWJsZShub2RlLmZpbmFsbHlQYXJ0KTsKICAgIHJldHVybiAoYXJndW1lbnRzKSA9PiBuZXcgVHJ5KAogICAgICAgIG1ha2VCb2R5KGFyZ3VtZW50cyksIG1ha2VDYXRjaChhcmd1bWVudHMpLCBtYWtlRmluYWxseShhcmd1bWVudHMpKTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdENhdGNoKENhdGNoIG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlRGVjbGFyYXRpb24gPSB2aXNpdChub2RlLmRlY2xhcmF0aW9uKTsKICAgIEluc3RhbnRpYXRvciBtYWtlQm9keSA9IHZpc2l0KG5vZGUuYm9keSk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgPT4KICAgICAgICBuZXcgQ2F0Y2gobWFrZURlY2xhcmF0aW9uKGFyZ3VtZW50cyksIG1ha2VCb2R5KGFyZ3VtZW50cykpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0U3dpdGNoKFN3aXRjaCBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZUtleSA9IHZpc2l0KG5vZGUua2V5KTsKICAgIEl0ZXJhYmxlPEluc3RhbnRpYXRvcj4gbWFrZUNhc2VzID0gbm9kZS5jYXNlcy5tYXAodmlzaXQpOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgcmV0dXJuIG5ldyBTd2l0Y2goCiAgICAgICAgICBtYWtlS2V5KGFyZ3VtZW50cyksCiAgICAgICAgICBtYWtlQ2FzZXMKICAgICAgICAgICAgICAubWFwPFN3aXRjaENsYXVzZT4oKEluc3RhbnRpYXRvciBtYWtlQ2FzZSkgPT4gbWFrZUNhc2UoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAudG9MaXN0KCkpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdENhc2UoQ2FzZSBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZUV4cHJlc3Npb24gPSB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogICAgSW5zdGFudGlhdG9yIG1ha2VCb2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHJldHVybiBuZXcgQ2FzZShtYWtlRXhwcmVzc2lvbihhcmd1bWVudHMpLCBtYWtlQm9keShhcmd1bWVudHMpKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXREZWZhdWx0KERlZmF1bHQgbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VCb2R5ID0gdmlzaXQobm9kZS5ib2R5KTsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHJldHVybiBuZXcgRGVmYXVsdChtYWtlQm9keShhcmd1bWVudHMpKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VOYW1lID0gdmlzaXQobm9kZS5uYW1lKTsKICAgIEluc3RhbnRpYXRvciBtYWtlRnVuY3Rpb24gPSB2aXNpdChub2RlLmZ1bmN0aW9uKTsKICAgIHJldHVybiAoYXJndW1lbnRzKSA9PgogICAgICAgIG5ldyBGdW5jdGlvbkRlY2xhcmF0aW9uKG1ha2VOYW1lKGFyZ3VtZW50cyksIG1ha2VGdW5jdGlvbihhcmd1bWVudHMpKTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZUJvZHkgPSB2aXNpdChub2RlLmJvZHkpOwogICAgcmV0dXJuIChhcmd1bWVudHMpID0+IG5ldyBMYWJlbGVkU3RhdGVtZW50KG5vZGUubGFiZWwsIG1ha2VCb2R5KGFyZ3VtZW50cykpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0TGl0ZXJhbFN0YXRlbWVudChMaXRlcmFsU3RhdGVtZW50IG5vZGUpID0+CiAgICAgIFRPRE8oJ3Zpc2l0TGl0ZXJhbFN0YXRlbWVudCcpOwogIEluc3RhbnRpYXRvciB2aXNpdExpdGVyYWxFeHByZXNzaW9uKExpdGVyYWxFeHByZXNzaW9uIG5vZGUpID0+CiAgICAgIFRPRE8oJ3Zpc2l0TGl0ZXJhbEV4cHJlc3Npb24nKTsKCiAgSW5zdGFudGlhdG9yIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qgbm9kZSkgewogICAgTGlzdDxJbnN0YW50aWF0b3I+IGRlY2xhcmF0aW9uTWFrZXJzID0KICAgICAgICBub2RlLmRlY2xhcmF0aW9ucy5tYXAodmlzaXQpLnRvTGlzdCgpOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgTGlzdDxWYXJpYWJsZUluaXRpYWxpemF0aW9uPiBkZWNsYXJhdGlvbnMgPSA8VmFyaWFibGVJbml0aWFsaXphdGlvbj5bXTsKICAgICAgZm9yIChJbnN0YW50aWF0b3IgaW5zdGFudGlhdG9yIGluIGRlY2xhcmF0aW9uTWFrZXJzKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IGluc3RhbnRpYXRvcihhcmd1bWVudHMpOwogICAgICAgIGRlY2xhcmF0aW9ucy5hZGQocmVzdWx0KTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KGRlY2xhcmF0aW9ucyk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0QXNzaWdubWVudChBc3NpZ25tZW50IG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlTGVmdEhhbmRTaWRlID0gdmlzaXQobm9kZS5sZWZ0SGFuZFNpZGUpOwogICAgU3RyaW5nIG9wID0gbm9kZS5vcDsKICAgIEluc3RhbnRpYXRvciBtYWtlVmFsdWUgPSB2aXNpdE51bGxhYmxlKG5vZGUudmFsdWUpOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgcmV0dXJuIG5ldyBBc3NpZ25tZW50LmNvbXBvdW5kKAogICAgICAgICAgbWFrZUxlZnRIYW5kU2lkZShhcmd1bWVudHMpLCBvcCwgbWFrZVZhbHVlKGFyZ3VtZW50cykpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdFZhcmlhYmxlSW5pdGlhbGl6YXRpb24oVmFyaWFibGVJbml0aWFsaXphdGlvbiBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZURlY2xhcmF0aW9uID0gdmlzaXQobm9kZS5kZWNsYXJhdGlvbik7CiAgICBJbnN0YW50aWF0b3IgbWFrZVZhbHVlID0gdmlzaXROdWxsYWJsZShub2RlLnZhbHVlKTsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHJldHVybiBuZXcgVmFyaWFibGVJbml0aWFsaXphdGlvbigKICAgICAgICAgIG1ha2VEZWNsYXJhdGlvbihhcmd1bWVudHMpLCBtYWtlVmFsdWUoYXJndW1lbnRzKSk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0Q29uZGl0aW9uYWwoQ29uZGl0aW9uYWwgY29uZCkgewogICAgSW5zdGFudGlhdG9yIG1ha2VDb25kaXRpb24gPSB2aXNpdChjb25kLmNvbmRpdGlvbik7CiAgICBJbnN0YW50aWF0b3IgbWFrZVRoZW4gPSB2aXNpdChjb25kLnRoZW4pOwogICAgSW5zdGFudGlhdG9yIG1ha2VPdGhlcndpc2UgPSB2aXNpdChjb25kLm90aGVyd2lzZSk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgPT4gbmV3IENvbmRpdGlvbmFsKG1ha2VDb25kaXRpb24oYXJndW1lbnRzKSwKICAgICAgICBtYWtlVGhlbihhcmd1bWVudHMpLCBtYWtlT3RoZXJ3aXNlKGFyZ3VtZW50cykpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0TmV3KE5ldyBub2RlKSA9PgogICAgICBoYW5kbGVDYWxsT3JOZXcobm9kZSwgKHRhcmdldCwgYXJndW1lbnRzKSA9PiBuZXcgTmV3KHRhcmdldCwgYXJndW1lbnRzKSk7CgogIEluc3RhbnRpYXRvciB2aXNpdENhbGwoQ2FsbCBub2RlKSA9PgogICAgICBoYW5kbGVDYWxsT3JOZXcobm9kZSwgKHRhcmdldCwgYXJndW1lbnRzKSA9PiBuZXcgQ2FsbCh0YXJnZXQsIGFyZ3VtZW50cykpOwoKICBJbnN0YW50aWF0b3IgaGFuZGxlQ2FsbE9yTmV3KENhbGwgbm9kZSwgZmluaXNoKHRhcmdldCwgYXJndW1lbnRzKSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VUYXJnZXQgPSB2aXNpdChub2RlLnRhcmdldCk7CiAgICBJdGVyYWJsZTxJbnN0YW50aWF0b3I+IGFyZ3VtZW50TWFrZXJzID0KICAgICAgICBub2RlLmFyZ3VtZW50cy5tYXAodmlzaXRTcGxheWFibGVFeHByZXNzaW9uKS50b0xpc3QoKTsKCiAgICAvLyBUT0RPKHNyYSk6IEF2b2lkIGNvcHlpbmcgY2FsbCBhcmd1bWVudHMgaWYgbm8gaW50ZXJwb2xhdGlvbiBvciBmb3JjZWQKICAgIC8vIGNvcHlpbmcuCiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICBOb2RlIHRhcmdldCA9IG1ha2VUYXJnZXQoYXJndW1lbnRzKTsKICAgICAgTGlzdDxFeHByZXNzaW9uPiBjYWxsQXJndW1lbnRzID0gPEV4cHJlc3Npb24+W107CiAgICAgIGZvciAoSW5zdGFudGlhdG9yIGluc3RhbnRpYXRvciBpbiBhcmd1bWVudE1ha2VycykgewogICAgICAgIHZhciByZXN1bHQgPSBpbnN0YW50aWF0b3IoYXJndW1lbnRzKTsKICAgICAgICBpZiAocmVzdWx0IGlzIEl0ZXJhYmxlKSB7CiAgICAgICAgICBjYWxsQXJndW1lbnRzLmFkZEFsbChyZXN1bHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjYWxsQXJndW1lbnRzLmFkZChyZXN1bHQpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmluaXNoKHRhcmdldCwgY2FsbEFyZ3VtZW50cy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKSk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0QmluYXJ5KEJpbmFyeSBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZUxlZnQgPSB2aXNpdChub2RlLmxlZnQpOwogICAgSW5zdGFudGlhdG9yIG1ha2VSaWdodCA9IHZpc2l0KG5vZGUucmlnaHQpOwogICAgU3RyaW5nIG9wID0gbm9kZS5vcDsKICAgIHJldHVybiAoYXJndW1lbnRzKSA9PgogICAgICAgIG5ldyBCaW5hcnkob3AsIG1ha2VMZWZ0KGFyZ3VtZW50cyksIG1ha2VSaWdodChhcmd1bWVudHMpKTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdFByZWZpeChQcmVmaXggbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VPcGVyYW5kID0gdmlzaXQobm9kZS5hcmd1bWVudCk7CiAgICBTdHJpbmcgb3AgPSBub2RlLm9wOwogICAgcmV0dXJuIChhcmd1bWVudHMpID0+IG5ldyBQcmVmaXgob3AsIG1ha2VPcGVyYW5kKGFyZ3VtZW50cykpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0UG9zdGZpeChQb3N0Zml4IG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlT3BlcmFuZCA9IHZpc2l0KG5vZGUuYXJndW1lbnQpOwogICAgU3RyaW5nIG9wID0gbm9kZS5vcDsKICAgIHJldHVybiAoYXJndW1lbnRzKSA9PiBuZXcgUG9zdGZpeChvcCwgbWFrZU9wZXJhbmQoYXJndW1lbnRzKSk7CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRWYXJpYWJsZVVzZShWYXJpYWJsZVVzZSBub2RlKSA9PgogICAgICAoYXJndW1lbnRzKSA9PiBuZXcgVmFyaWFibGVVc2Uobm9kZS5uYW1lKTsKCiAgSW5zdGFudGlhdG9yIHZpc2l0VGhpcyhUaGlzIG5vZGUpID0+IChhcmd1bWVudHMpID0+IG5ldyBUaGlzKCk7CgogIEluc3RhbnRpYXRvciB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSA9PgogICAgICAoYXJndW1lbnRzKSA9PiBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLm5hbWUpOwoKICBJbnN0YW50aWF0b3IgdmlzaXRQYXJhbWV0ZXIoUGFyYW1ldGVyIG5vZGUpID0+CiAgICAgIChhcmd1bWVudHMpID0+IG5ldyBQYXJhbWV0ZXIobm9kZS5uYW1lKTsKCiAgSW5zdGFudGlhdG9yIHZpc2l0QWNjZXNzKFByb3BlcnR5QWNjZXNzIG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlUmVjZWl2ZXIgPSB2aXNpdChub2RlLnJlY2VpdmVyKTsKICAgIEluc3RhbnRpYXRvciBtYWtlU2VsZWN0b3IgPSB2aXNpdChub2RlLnNlbGVjdG9yKTsKICAgIHJldHVybiAoYXJndW1lbnRzKSA9PgogICAgICAgIG5ldyBQcm9wZXJ0eUFjY2VzcyhtYWtlUmVjZWl2ZXIoYXJndW1lbnRzKSwgbWFrZVNlbGVjdG9yKGFyZ3VtZW50cykpOwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0TmFtZWRGdW5jdGlvbihOYW1lZEZ1bmN0aW9uIG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlRGVjbGFyYXRpb24gPSB2aXNpdChub2RlLm5hbWUpOwogICAgSW5zdGFudGlhdG9yIG1ha2VGdW5jdGlvbiA9IHZpc2l0KG5vZGUuZnVuY3Rpb24pOwogICAgcmV0dXJuIChhcmd1bWVudHMpID0+CiAgICAgICAgbmV3IE5hbWVkRnVuY3Rpb24obWFrZURlY2xhcmF0aW9uKGFyZ3VtZW50cyksIG1ha2VGdW5jdGlvbihhcmd1bWVudHMpKTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdEZ1bihGdW4gbm9kZSkgewogICAgTGlzdDxJbnN0YW50aWF0b3I+IHBhcmFtTWFrZXJzID0gbm9kZS5wYXJhbXMubWFwKHZpc2l0U3BsYXlhYmxlKS50b0xpc3QoKTsKICAgIEluc3RhbnRpYXRvciBtYWtlQm9keSA9IHZpc2l0KG5vZGUuYm9keSk7CiAgICAvLyBUT0RPKHNyYSk6IEF2b2lkIGNvcHlpbmcgcGFyYW1zIGlmIG5vIGludGVycG9sYXRpb24gb3IgZm9yY2VkIGNvcHlpbmcuCiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICBMaXN0PFBhcmFtZXRlcj4gcGFyYW1zID0gPFBhcmFtZXRlcj5bXTsKICAgICAgZm9yIChJbnN0YW50aWF0b3IgaW5zdGFudGlhdG9yIGluIHBhcmFtTWFrZXJzKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IGluc3RhbnRpYXRvcihhcmd1bWVudHMpOwogICAgICAgIGlmIChyZXN1bHQgaXMgSXRlcmFibGUpIHsKICAgICAgICAgIHBhcmFtcy5hZGRBbGwocmVzdWx0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcGFyYW1zLmFkZChyZXN1bHQpOwogICAgICAgIH0KICAgICAgfQogICAgICBTdGF0ZW1lbnQgYm9keSA9IG1ha2VCb2R5KGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiBuZXcgRnVuKHBhcmFtcywgYm9keSk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0RGVmZXJyZWRFeHByZXNzaW9uKERlZmVycmVkRXhwcmVzc2lvbiBub2RlKSA9PiBzYW1lKG5vZGUpOwoKICBJbnN0YW50aWF0b3IgdmlzaXREZWZlcnJlZE51bWJlcihEZWZlcnJlZE51bWJlciBub2RlKSA9PiBzYW1lKG5vZGUpOwoKICBJbnN0YW50aWF0b3IgdmlzaXREZWZlcnJlZFN0cmluZyhEZWZlcnJlZFN0cmluZyBub2RlKSA9PiAoYXJndW1lbnRzKSA9PiBub2RlOwoKICBJbnN0YW50aWF0b3IgdmlzaXRMaXRlcmFsQm9vbChMaXRlcmFsQm9vbCBub2RlKSA9PgogICAgICAoYXJndW1lbnRzKSA9PiBuZXcgTGl0ZXJhbEJvb2wobm9kZS52YWx1ZSk7CgogIEluc3RhbnRpYXRvciB2aXNpdExpdGVyYWxTdHJpbmcoTGl0ZXJhbFN0cmluZyBub2RlKSA9PgogICAgICAoYXJndW1lbnRzKSA9PiBuZXcgTGl0ZXJhbFN0cmluZyhub2RlLnZhbHVlKTsKCiAgSW5zdGFudGlhdG9yIHZpc2l0TGl0ZXJhbE51bWJlcihMaXRlcmFsTnVtYmVyIG5vZGUpID0+CiAgICAgIChhcmd1bWVudHMpID0+IG5ldyBMaXRlcmFsTnVtYmVyKG5vZGUudmFsdWUpOwoKICBJbnN0YW50aWF0b3IgdmlzaXRMaXRlcmFsTnVsbChMaXRlcmFsTnVsbCBub2RlKSA9PgogICAgICAoYXJndW1lbnRzKSA9PiBuZXcgTGl0ZXJhbE51bGwoKTsKCiAgSW5zdGFudGlhdG9yIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIExpc3Q8SW5zdGFudGlhdG9yPiBwYXJ0TWFrZXJzID0KICAgICAgICBub2RlLnBhcnRzLm1hcCh2aXNpdCkudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICBMaXN0PExpdGVyYWw+IHBhcnRzID0gcGFydE1ha2VycwogICAgICAgICAgLm1hcCgoSW5zdGFudGlhdG9yIGluc3RhbnRpYXRvcikgPT4gaW5zdGFudGlhdG9yKGFyZ3VtZW50cykpCiAgICAgICAgICAudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIHJldHVybiBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbihwYXJ0cyk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0TmFtZShOYW1lIG5vZGUpID0+IHNhbWUobm9kZSk7CgogIEluc3RhbnRpYXRvciB2aXNpdFBhcmVudGhlc2VzKFBhcmVudGhlc2VzIG5vZGUpIHsKICAgIEluc3RhbnRpYXRvciBtYWtlRW5jbG9zZWQgPSB2aXNpdChub2RlLmVuY2xvc2VkKTsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIEV4cHJlc3Npb24gZW5jbG9zZWQgPSBtYWtlRW5jbG9zZWQoYXJndW1lbnRzKTsKICAgICAgcmV0dXJuIFBhcmVudGhlc2VzKGVuY2xvc2VkKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRBcnJheUluaXRpYWxpemVyKEFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewogICAgLy8gVE9ETyhzcmEpOiBJbXBsZW1lbnQgc3BsaWNpbmc/CiAgICBMaXN0PEluc3RhbnRpYXRvcj4gZWxlbWVudE1ha2VycyA9CiAgICAgICAgbm9kZS5lbGVtZW50cy5tYXAodmlzaXQpLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgTGlzdDxFeHByZXNzaW9uPiBlbGVtZW50cyA9IGVsZW1lbnRNYWtlcnMKICAgICAgICAgIC5tYXA8RXhwcmVzc2lvbj4oCiAgICAgICAgICAgICAgKEluc3RhbnRpYXRvciBpbnN0YW50aWF0b3IpID0+IGluc3RhbnRpYXRvcihhcmd1bWVudHMpKQogICAgICAgICAgLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgICByZXR1cm4gbmV3IEFycmF5SW5pdGlhbGl6ZXIoZWxlbWVudHMpOwogICAgfTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdEFycmF5SG9sZShBcnJheUhvbGUgbm9kZSkgewogICAgcmV0dXJuIChhcmd1bWVudHMpID0+IG5ldyBBcnJheUhvbGUoKTsKICB9CgogIEluc3RhbnRpYXRvciB2aXNpdE9iamVjdEluaXRpYWxpemVyKE9iamVjdEluaXRpYWxpemVyIG5vZGUpIHsKICAgIExpc3Q8SW5zdGFudGlhdG9yPiBwcm9wZXJ0eU1ha2VycyA9CiAgICAgICAgbm9kZS5wcm9wZXJ0aWVzLm1hcCh2aXNpdFNwbGF5YWJsZSkudG9MaXN0KCk7CiAgICBib29sIGlzT25lTGluZXIgPSBub2RlLmlzT25lTGluZXI7CiAgICByZXR1cm4gKGFyZ3VtZW50cykgewogICAgICBMaXN0PFByb3BlcnR5PiBwcm9wZXJ0aWVzID0gPFByb3BlcnR5PltdOwogICAgICBmb3IgKEluc3RhbnRpYXRvciBpbnN0YW50aWF0b3IgaW4gcHJvcGVydHlNYWtlcnMpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaW5zdGFudGlhdG9yKGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKHJlc3VsdCBpcyBJdGVyYWJsZSkgewogICAgICAgICAgcHJvcGVydGllcy5hZGRBbGwocmVzdWx0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHJvcGVydGllcy5hZGQocmVzdWx0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBPYmplY3RJbml0aWFsaXplcihwcm9wZXJ0aWVzLCBpc09uZUxpbmVyOiBpc09uZUxpbmVyKTsKICAgIH07CiAgfQoKICBJbnN0YW50aWF0b3IgdmlzaXRQcm9wZXJ0eShQcm9wZXJ0eSBub2RlKSB7CiAgICBJbnN0YW50aWF0b3IgbWFrZU5hbWUgPSB2aXNpdChub2RlLm5hbWUpOwogICAgSW5zdGFudGlhdG9yIG1ha2VWYWx1ZSA9IHZpc2l0KG5vZGUudmFsdWUpOwogICAgcmV0dXJuIChhcmd1bWVudHMpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eShtYWtlTmFtZShhcmd1bWVudHMpLCBtYWtlVmFsdWUoYXJndW1lbnRzKSk7CiAgICB9OwogIH0KCiAgSW5zdGFudGlhdG9yIHZpc2l0UmVnRXhwTGl0ZXJhbChSZWdFeHBMaXRlcmFsIG5vZGUpID0+CiAgICAgIChhcmd1bWVudHMpID0+IG5ldyBSZWdFeHBMaXRlcmFsKG5vZGUucGF0dGVybik7CgogIEluc3RhbnRpYXRvciB2aXNpdENvbW1lbnQoQ29tbWVudCBub2RlKSA9PiBUT0RPKCd2aXNpdENvbW1lbnQnKTsKCiAgSW5zdGFudGlhdG9yIHZpc2l0QXdhaXQoQXdhaXQgbm9kZSkgewogICAgSW5zdGFudGlhdG9yIG1ha2VFeHByZXNzaW9uID0gdmlzaXQobm9kZS5leHByZXNzaW9uKTsKICAgIHJldHVybiAoYXJndW1lbnRzKSB7CiAgICAgIHJldHVybiBuZXcgQXdhaXQobWFrZUV4cHJlc3Npb24oYXJndW1lbnRzKSk7CiAgICB9OwogIH0KfQoKLyoqCiAqIEludGVycG9sYXRlZE5vZGVBbmFseXNpcyBkZXRlcm1pbmVzIHdoaWNoIEFTVCB0cmVlcyBjb250YWluCiAqIFtJbnRlcnBvbGF0ZWROb2RlXXMsIGFuZCB0aGUgbmFtZXMgb2YgdGhlIG5hbWVkIGludGVycG9sYXRlZCBub2Rlcy4KICovCmNsYXNzIEludGVycG9sYXRlZE5vZGVBbmFseXNpcyBleHRlbmRzIEJhc2VWaXNpdG9yIHsKICBmaW5hbCBTZXQ8Tm9kZT4gY29udGFpbnNJbnRlcnBvbGF0ZWROb2RlID0gbmV3IFNldDxOb2RlPigpOwogIGZpbmFsIFNldDxTdHJpbmc+IGhvbGVOYW1lcyA9IG5ldyBTZXQ8U3RyaW5nPigpOwogIGludCBjb3VudCA9IDA7CgogIEludGVycG9sYXRlZE5vZGVBbmFseXNpcygpOwoKICBib29sIGNvbnRhaW5zSW50ZXJwb2xhdGVkTm9kZXMoTm9kZSBub2RlKSA9PgogICAgICBjb250YWluc0ludGVycG9sYXRlZE5vZGUuY29udGFpbnMobm9kZSk7CgogIHZvaWQgdmlzaXQoTm9kZSBub2RlKSB7CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIHZvaWQgdmlzaXROb2RlKE5vZGUgbm9kZSkgewogICAgaW50IGJlZm9yZSA9IGNvdW50OwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgaWYgKGNvdW50ICE9IGJlZm9yZSkgY29udGFpbnNJbnRlcnBvbGF0ZWROb2RlLmFkZChub2RlKTsKICB9CgogIHZpc2l0SW50ZXJwb2xhdGVkTm9kZShJbnRlcnBvbGF0ZWROb2RlIG5vZGUpIHsKICAgIGNvbnRhaW5zSW50ZXJwb2xhdGVkTm9kZS5hZGQobm9kZSk7CiAgICBpZiAobm9kZS5pc05hbWVkKSBob2xlTmFtZXMuYWRkKG5vZGUubmFtZU9yUG9zaXRpb24pOwogICAgKytjb3VudDsKICB9Cn0KgxQATk48ARABGEtKARUBNSgEAT8YSSwVBAE0JwQBPhhKKxUEAgEEUE9DEgQRFxsYEgEdASQBKRouASI6RhAEASoXHRwfJCEnBAEpFx4cHiQhJwQBIC0xHCoEARQtNSs4Ni8EATwGTyokHTlQMCMIJgYeL1AyG1BEBkoYTkUGJAQCAQRJRRQEPQEEUVFGBEoYAUYBBjcGMAEkGicTBAEhEwQBPisBIkEgBhcEASonGAQBK04YBAEmQgQBSgE/KiMEAUcqKwQBSi4ZLS1FE08HBAFMLhktLk0TTwcEATUqMBsvKC9HRD8KAT8kCQYYBAFELhktSU0HBAFILhktASQsOFAsCAE8IQcEAUY5UDsuGS0tQRNMBwQBSC4ZLTUTTQcEATQpMBsvJi49RDwKAT4jCQYYBAEsJzkZMhcsICMRLgoIATkmCCYHBAEoJz8ZMhcsICMkLhEuCggBOSYIJAcEAUQ7GTcHBAE7KwEiNDINIgYEAThKNDAbLykvRzstCQYBOi44GTAfISYRKwoITwcEASg4LjgZQyUHBAEkNkA6LhlENwcEASg+Mi4ZSyAHBAEWMQQBKDguGUcHBAEiLjgZRAcEAS81ASkyASo9QQQBMDoaQAQBKDpABAEkLjxAI0wEASg8LhpEBAEqLD4ZGR4UURoHBAEmOi4ZRwcEASwuGS8HBAFELjYaTwQBPi5RBAE/JUEmAUwrLxlOPS4iCDgHBAEyPhk4GSZCBwQBSjw4GSk9BwQBNDguOEQ4BAElUAEnUQFHMiw/AU0QGSs3Oi4iKBElCghEBwQBKi4wGRpDBAEqNRlCBAEsNRlDBAE1MQFCAUU5ATEvATI2NhpOBAE4NTYaUAQBJE8uThkuNy4iIREeCggsJAcEAU8BRwFQATUyATk0ATk0ATUoAUQkNxknRyQtBwQBMwE0Nhk1JAcEAT4mJzoZMBxGJC0HBAEwKwQBQCg2JxkwOi4iJREiCghIBwQBLi4wGUYHBAE5NgFDASg6GTMHBAIBBD9HBDU+MxEBHgEvLwEaFwQBHhgePQQBMSg6DQQCASBwYWNrYWdlOmpzX2FzdC9zcmMvdGVtcGxhdGUuZGFydChzZGtyb290Oi9wa2cvanNfYXN0L2xpYi9zcmMvYnVpbGRlci5kYXJ0wADJ2i8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBVdGlsaXRpZXMgZm9yIGJ1aWxkaW5nIEpTIEFTVHMgYXQgcnVudGltZS4gIENvbnRhaW5zIGEgYnVpbGRlciBjbGFzcwovLyBhbmQgYSBwYXJzZXIgdGhhdCBwYXJzZXMgcGFydCBvZiB0aGUgbGFuZ3VhZ2UuCgpwYXJ0IG9mIGpzX2FzdDsKCi8qKgogKiBHbG9iYWwgdGVtcGxhdGUgbWFuYWdlci4gIFdlIHNob3VsZCBhaW0gdG8gaGF2ZSBhIGZpeGVkIG51bWJlciBvZgogKiB0ZW1wbGF0ZXMuIFRoaXMgaW1wbGllcyB0aGF0IHdlIGRvIG5vdCB1c2UganMoJ3h4eCcpIHRvIHBhcnNlIHRleHQgdGhhdCBpcwogKiBjb25zdHJ1Y3RlZCBmcm9tIHZhbHVlcyB0aGF0IGRlcGVuZCBvbiBuYW1lcyBpbiB0aGUgRGFydCBwcm9ncmFtLgogKgogKiBUT0RPKHNyYSk6IEZpbmQgdGhlIHJlbWFpbmluZyBwbGFjZXMgd2hlcmUganMoJ3h4eCcpIHVzZWQgdG8gcGFyc2UgYW4KICogdW5ib3VuZGVkIG51bWJlciBvZiBleHByZXNzaW9uLCBvciBpbnN0aXR1dGUgYSBjYWNoZSBwb2xpY3kuCiAqLwpUZW1wbGF0ZU1hbmFnZXIgdGVtcGxhdGVNYW5hZ2VyID0gbmV3IFRlbXBsYXRlTWFuYWdlcigpOwoKLyoqCgpbanNdIGlzIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIEpzQnVpbGRlci4gIEpzQnVpbGRlciBpcyBhIHNldCBvZiBjb252ZW5pZW5jZXMKZm9yIGNvbnN0cnVjdGluZyBKYXZhU2NyaXB0IEFTVHMuCgpbc3RyaW5nXSBhbmQgW251bWJlcl0gYXJlIHVzZWQgdG8gY3JlYXRlIGxlYWYgQVNUIG5vZGVzOgoKICAgIHZhciBzID0ganMuc3RyaW5nKCdoZWxsbycpOyAgICAvLyAgcyA9IG5ldyBMaXRlcmFsU3RyaW5nKCciaGVsbG8iJykKICAgIHZhciBuID0ganMubnVtYmVyKDEyMyk7ICAgICAgICAvLyAgbiA9IG5ldyBMaXRlcmFsTnVtYmVyKDEyMykKCkluIHRoZSBsaW5lIGFib3ZlIGBhIC0tPiBiYCBtZWFucyBEYXJ0IGV4cHJlc3Npb24gYGFgIGV2YWx1YXRlcyB0byBhIEphdmFTY3JpcHQKQVNUIHRoYXQgd291bGQgcHJldHR5LXByaW50IGFzIGBiYC4KClRoZSBbY2FsbF0gbWV0aG9kIGNvbnN0cnVjdHMgYW4gRXhwcmVzc2lvbiBBU1QuCgpObyBhcmd1bWVudAoKICAgIGpzKCd3aW5kb3cuYWxlcnQoImhlbGxvIiknKSAgLS0+ICB3aW5kb3cuYWxlcnQoImhlbGxvIikKClRoZSBpbnB1dCB0ZXh0IGNhbiBjb250YWluIHBsYWNlaG9sZGVycyBgI2AgdGhhdCBhcmUgcmVwbGFjZWQgd2l0aCBwcm92aWRlZAphcmd1bWVudHMuICBBIHNpbmdsZSBhcmd1bWVudCBjYW4gYmUgcGFzc2VkIGRpcmVjdGx5OgoKICAgIGpzKCd3aW5kb3cuYWxlcnQoIyknLCBzKSAgIC0tPiAgd2luZG93LmFsZXJ0KCJoZWxsbyIpCgpNdWx0aXBsZSBhcmd1bWVudHMgYXJlIHBhc3NlZCBhcyBhIGxpc3Q6CgogICAganMoJyMgKyAjJywgW3MsIHNdKSAgLS0+ICAiaGVsbG8iICsgImhlbGxvIgoKVGhlIFtzdGF0ZW1lbnRdIG1ldGhvZCBjb25zdHJ1Y3RzIGEgU3RhdGVtZW50IEFTVCwgYnV0IGlzIG90aGVyd2lzZSBsaWtlIHRoZQpbY2FsbF0gbWV0aG9kLiAgVGhpcyBjb25zdHJ1Y3RzIGEgUmV0dXJuIEFTVDoKCiAgICB2YXIgcmV0ID0ganMuc3RhdGVtZW50KCdyZXR1cm4gIzsnLCBuKTsgIC0tPiAgcmV0dXJuIDEyMzsKCkEgcGxhY2Vob2xkZXIgaW4gYSBTdGF0ZW1lbnQgY29udGV4dCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc2VtaWNvbG9uICc7Jy4gIFlvdQpjYW4gdGhpbmsgb2YgYSBzdGF0ZW1lbnQgcGxhY2Vob2xkZXIgYXMgYmVpbmcgYCM7YCB0byBleHBsYWluIHdoeSB0aGUgb3V0cHV0CnN0aWxsIGhhcyBvbmUgc2VtaWNvbG9uOgoKICAgIGpzLnN0YXRlbWVudCgnaWYgKGhhcHB5KSAjOycsIHJldCkKICAgIC0tPgogICAgaWYgKGhhcHB5KQogICAgICByZXR1cm4gMTIzOwoKSWYgdGhlIHBsYWNlaG9sZGVyIGlzIG5vdCBmb2xsb3dlZCBieSBhIHNlbWljb2xvbiwgaXQgaXMgcGFydCBvZiBhbiBleHByZXNzaW9uLgpIZXJlIHRoZSBwbGFjZWhvbGRlciBpcyBpbiB0aGUgcG9zaXRpb24gb2YgdGhlIGZ1bmN0aW9uIGluIGEgZnVuY3Rpb24gY2FsbDoKCiAgICB2YXIgdkZvbyA9IG5ldyBWYXJpYWJsZVVzZSgnZm9vJyk7CiAgICBqcy5zdGF0ZW1lbnQoJ2lmIChoYXBweSkgIygiSGFwcHkhIiknLCB2Rm9vKQogICAgLS0+CiAgICBpZiAoaGFwcHkpCiAgICAgIGZvbygiSGFwcHkhIik7CgpHZW5lcmFsbHksIGEgcGxhY2Vob2xkZXIgaW4gYW4gZXhwcmVzc2lvbiBwb3NpdGlvbiByZXF1aXJlcyBhbiBFeHByZXNzaW9uIEFTVCBhcwphbiBhcmd1bWVudCBhbmQgYSBwbGFjZWhvbGRlciBpbiBhIHN0YXRlbWVudCBwb3NpdGlvbiByZXF1aXJlcyBhIFN0YXRlbWVudCBBU1QuCkFuIGV4cHJlc3Npb24gd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBTdGF0ZW1lbnQgaWYgbmVlZGVkIGJ5IGNyZWF0aW5nIGFuCkV4cHJlc3Npb25TdGF0ZW1lbnQuICBBIFN0cmluZyBhcmd1bWVudCB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIGEgVmFyaWFibGVVc2UgYW5kCnJlcXVpcmVzIHRoYXQgdGhlIHN0cmluZyBpcyBhIEphdmFTY3JpcHQgaWRlbnRpZmllci4KCiAgICBqcygnIyArIDEnLCB2Rm9vKSAgICAgICAtLT4gIGZvbyArIDEKICAgIGpzKCcjICsgMScsICdmb28nKSAgICAgIC0tPiAgZm9vICsgMQogICAganMoJyMgKyAxJywgJ2Zvby5iYXInKSAgLS0+ICBhc3NlcnRpb24gZmFpbHVyZQoKU29tZSBwbGFjZWhvbGRlciBwb3NpdGlvbnMgYXJlIF9zcGxpY2luZyBjb250ZXh0c18uICBBIGZ1bmN0aW9uIGFyZ3VtZW50IGxpc3QgaXMKYSBzcGxpY2luZyBleHByZXNzaW9uIGNvbnRleHQuICBBIHBsYWNlaG9sZGVyIGluIGEgc3BsaWNpbmcgZXhwcmVzc2lvbiBjb250ZXh0CmNhbiB0YWtlIGEgc2luZ2xlIEV4cHJlc3Npb24gKG9yIFN0cmluZywgY29udmVydGVkIHRvIFZhcmlhYmxlVXNlKSBvciBhbgpJdGVyYWJsZSBvZiBFeHByZXNzaW9ucyAoYW5kL29yIFN0cmluZ3MpLgoKICAgIC8vIG5vbi1zcGxpY2luZyBhcmd1bWVudDoKICAgIGpzKCcjKCMpJywgWydzYXknLCBzXSkgICAgICAgIC0tPiAgc2F5KCJoZWxsbyIpCiAgICAvLyBzcGxpY2luZyBhcmd1bWVudHM6CiAgICBqcygnIygjKScsIFsnc2F5JywgW11dKSAgICAgICAtLT4gIHNheSgpCiAgICBqcygnIygjKScsIFsnc2F5JywgW3NdXSkgICAgICAtLT4gIHNheSgiaGVsbG8iKQogICAganMoJyMoIyknLCBbJ3NheScsIFtzLCBuXV0pICAgLS0+ICBzYXkoImhlbGxvIiwgMTIzKQoKQSBzcGxpY2luZyBjb250ZXh0IGNhbiBiZSB1c2VkIHRvIGFwcGVuZCAnbGlzdHMnIGFuZCBhZGQgZXh0cmEgZWxlbWVudHM6CgogICAganMoJ2ZvbygjLCAjLCAxKScsIFsgWydhJywgbl0sIHNdKSAgICAgICAtLT4gIGZvbyhhLCAxMjMsICJoZWxsbyIsIDEpCiAgICBqcygnZm9vKCMsICMsIDEpJywgWyBbJ2EnLCBuXSwgW3MsIG5dXSkgIC0tPiAgZm9vKGEsIDEyMywgImhlbGxvIiwgMTIzLCAxKQogICAganMoJ2ZvbygjLCAjLCAxKScsIFsgW10sIFtzLCBuXV0pICAgICAgICAtLT4gIGZvbygiaGVsbG8iLCAxMjMsIDEpCiAgICBqcygnZm9vKCMsICMsIDEpJywgWyBbXSwgW10gXSkgICAgICAgICAgIC0tPiAgZm9vKDEpCgpUaGUgZ2VuZXJhdGlvbiBvZiBhIGNvbXBpbGUtdGltZSBvcHRpb25hbCBhcmd1bWVudCBleHByZXNzaW9uIGNhbiBiZSBjaG9zZW4gYnkKcHJvdmlkaW5nIGFuIGVtcHR5IG9yIHNpbmdsZXRvbiBsaXN0LgoKSW4gYWRkaXRpb24gdG8gRXhwcmVzc2lvbnMgYW5kIFN0YXRlbWVudHMsIHRoZXJlIGFyZSBQYXJhbWV0ZXJzLCB3aGljaCBvY2N1cgpvbmx5IGluIHRoZSBwYXJhbWV0ZXIgbGlzdCBvZiBhIGZ1bmN0aW9uIGV4cHJlc3Npb24gb3IgZGVjbGFyYXRpb24uClBsYWNlaG9sZGVycyBpbiBwYXJhbWV0ZXIgcG9zaXRpb25zIGJlaGF2ZSBsaWtlIHBsYWNlaG9sZGVycyBpbiBFeHByZXNzaW9uCnBvc2l0aW9ucywgZXhjZXB0IG9ubHkgUGFyYW1ldGVyIEFTVCBub2RlcyBhcmUgcGVybWl0dGVkLiAgU3RyaW5nIGFyZ3VtZW50cyBmb3IKcGFyYW1ldGVyIHBsYWNlaG9sZGVycyBhcmUgY29udmVydGVkIHRvIFBhcmFtZXRlciBBU1Qgbm9kZXMuCgogICAgdmFyIHBGb28gPSBuZXcgUGFyYW1ldGVyKCdmb28nKQogICAganMoJ2Z1bmN0aW9uKCMpIHsgcmV0dXJuICM7IH0nLCBbcEZvbywgdkZvb10pCiAgICAtLT4KICAgIGZ1bmN0aW9uKGZvbykgeyByZXR1cm4gZm9vOyB9CgpFeHByZXNzaW9ucyBhbmQgUGFyYW1ldGVycyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyJ3MgY29udGV4dDoKCiAgICBqcygnZnVuY3Rpb24oIykgeyByZXR1cm4gIzsgfScsIFt2Rm9vLCB2Rm9vXSkgLS0+IGVycm9yCiAgICBqcygnZnVuY3Rpb24oIykgeyByZXR1cm4gIzsgfScsIFtwRm9vLCBwRm9vXSkgLS0+IGVycm9yCgpUaGUgcGFyYW1ldGVyIGNvbnRleHQgaXMgYSBzcGxpY2luZyBjb250ZXh0LiAgV2hlbiBjb21iaW5lZCB3aXRoIHRoZQpjb250ZXh0LXNlbnNpdGl2ZSBjb252ZXJzaW9uIG9mIFN0cmluZ3MsIHRoaXMgc2ltcGxpZmllcyB0aGUgY29uc3RydWN0aW9uIG9mCnRyYW1wb2xpbmUtbGlrZSBmdW5jdGlvbnM6CgogICAgdmFyIGFyZ3MgPSBbJ2EnLCAnYiddOwogICAganMoJ2Z1bmN0aW9uKCMpIHsgcmV0dXJuIGYodGhpcywgIyk7IH0nLCBbYXJncywgYXJnc10pCiAgICAtLT4KICAgIGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGYodGhpcywgYSwgYik7IH0KCkEgc3RhdGVtZW50IHBsYWNlaG9sZGVyIGluIGEgQmxvY2sgaXMgYWxzbyBpbiBhIHNwbGljaW5nIGNvbnRleHQuICBJbiBhZGRpdGlvbgp0byBzcGxpY2luZyBJdGVyYWJsZXMsIHN0YXRlbWVudCBwbGFjZWhvbGRlcnMgaW4gYSBCbG9jayB3aWxsIGFsc28gc3BsaWNlIGEKQmxvY2sgb3IgYW4gRW1wdHlTdGF0ZW1lbnQuICBUaGlzIGZsYXR0ZW5zIG5lc3RlZCBibG9ja3MgYW5kIGFsbG93cyBibG9ja3MgdG8gYmUKYXBwZW5kZWQuCgogICAgdmFyIGIxID0ganMuc3RhdGVtZW50KCd7IDE7IDI7IH0nKTsKICAgIHZhciBzRW1wdHkgPSBuZXcgRW1wdHlzdGF0ZW1lbnQoKTsKICAgIGpzLnN0YXRlbWVudCgneyAjOyAjOyAjOyAjOyB9JywgW3NFbXB0eSwgYjEsIGIxLCBzRW1wdHldKQogICAgLS0+CiAgICB7IDE7IDI7IDE7IDI7IH0KCkEgcGxhY2Vob2xkZXIgaW4gdGhlIGNvbnRleHQgb2YgYW4gaWYtc3RhdGVtZW50IGNvbmRpdGlvbiBhbHNvIGFjY2VwdHMgYSBEYXJ0CmJvb2wgYXJndW1lbnQsIHdoaWNoIHNlbGVjdHMgdGhlIHRoZW4tcGFydCBvciBlbHNlLXBhcnQgb2YgdGhlIGlmLXN0YXRlbWVudDoKCiAgICBqcy5zdGF0ZW1lbnQoJ2lmICgjKSByZXR1cm47JywgdkZvbykgICAtLT4gIGlmIChmb28pIHJldHVybjsKICAgIGpzLnN0YXRlbWVudCgnaWYgKCMpIHJldHVybjsnLCB0cnVlKSAgIC0tPiAgcmV0dXJuOwogICAganMuc3RhdGVtZW50KCdpZiAoIykgcmV0dXJuOycsIGZhbHNlKSAgLS0+ICA7ICAgLy8gZW1wdHkgc3RhdGVtZW50CiAgICB2YXIgZVRydWUgPSBuZXcgTGl0ZXJhbEJvb2wodHJ1ZSk7CiAgICBqcy5zdGF0ZW1lbnQoJ2lmICgjKSByZXR1cm47JywgZVRydWUpICAtLT4gIGlmICh0cnVlKSByZXR1cm47CgpDb21iaW5lZCB3aXRoIGJsb2NrIHNwbGljaW5nLCBpZi1zdGF0ZW1lbnQgY29uZGl0aW9uIGNvbnRleHQgcGxhY2Vob2xkZXJzIGFsbG93cwp0aGUgY3JlYXRpb24gb2YgdGVtcGxhdGVzIHRoYXQgc2VsZWN0IGNvZGUgZGVwZW5kaW5nIG9uIHZhcmlhYmxlcy4KCiAgICBqcy5zdGF0ZW1lbnQoJ3sgMTsgaWYgKCMpIDI7IGVsc2UgeyAzOyA0OyB9IDU7fScsIHRydWUpCiAgICAtLT4geyAxOyAyOyA1OyB9CgogICAganMuc3RhdGVtZW50KCd7IDE7IGlmICgjKSAyOyBlbHNlIHsgMzsgNDsgfSA1O30nLCBmYWxzZSkKICAgIC0tPiB7IDE7IDM7IDQ7IDU7IH0KCkEgcGxhY2Vob2xkZXIgZm9sbG93aW5nIGEgcGVyaW9kIGluIGEgcHJvcGVydHkgYWNjZXNzIGlzIGluIGEgcHJvcGVydHkgYWNjZXNzCmNvbnRleHQuICBUaGlzIGlzIGp1c3QgbGlrZSBhbiBleHByZXNzaW9uIGNvbnRleHQsIGV4Y2VwdCBTdHJpbmcgYXJndW1lbnRzIGFyZQpjb252ZXJ0ZWQgdG8gSmF2YVNjcmlwdCBwcm9wZXJ0eSBhY2Nlc3Nlcy4gIEluIEphdmFTY3JpcHQsIGBhLmJgIGlzIHNob3J0LWhhbmQKZm9yIGBhWyJiIl1gOgoKICAgIGpzKCdhWyNdJywgdkZvbykgIC0tPiAgYVtmb29dCiAgICBqcygnYVsjXScsIHMpICAgICAtLT4gIGEuaGVsbG8gICAgKGkuZS4gYVsiaGVsbG8iXSkuCiAgICBqcygnYVsjXScsICd4JykgICAtLT4gIGFbeF0KCiAgICBqcygnYS4jJywgdkZvbykgICAtLT4gIGFbZm9vXQogICAganMoJ2EuIycsIHMpICAgICAgLS0+ICBhLmhlbGxvICAgIChpLmUuIGFbImhlbGxvIl0pCiAgICBqcygnYS4jJywgJ3gnKSAgICAtLT4gIGEueCAgICAgICAgKGkuZS4gYVsieCJdKQoKKFF1ZXN0aW9uIC0gc2hvdWxkIGAuI2AgYmUgcmVzdHJpY3RlZCB0byBwZXJtaXQgb25seSBTdHJpbmcgYXJndW1lbnRzPyBUaGUKdGVtcGxhdGUgc2hvdWxkIHByb2JhYmx5IGJlIHdyaXR0ZW4gd2l0aCBgW11gIGlmIG5vbi1zdHJpbmdzIGFyZSBhY2NlcHRlZC4pCgoKT2JqZWN0IGluaXRpYWxpemVycyBhbGxvdyBwbGFjZWhvbGRlcnMgaW4gdGhlIGtleSBwcm9wZXJ0eSBuYW1lIHBvc2l0aW9uOgoKICAgIGpzKCd7IzoxLCAjOjJ9JywgIFtzLCAnYnllJ10pICAgIC0tPiAge2hlbGxvOiAxLCBieWU6IDJ9CgoKV2hhdCBpcyBub3QgaW1wbGVtZW50ZWQ6CgogLSAgQXJyYXkgaW5pdGlhbGl6ZXJzIGFuZCBvYmplY3QgaW5pdGlhbGl6ZXJzIGNvdWxkIHN1cHBvcnQgc3BsaWNpbmcuICBJbiB0aGUKICAgIGFycmF5IGNhc2UsIHdlIHdvdWxkIG5lZWQgc29tZSB3YXkgdG8ga25vdyBpZiBhbiBBcnJheUluaXRpYWxpemVyIGFyZ3VtZW50CiAgICBzaG91bGQgYmUgc3BsaWNlIG9yIGlzIGludGVuZGVkIGFzIGEgc2luZ2xlIHZhbHVlLgoKKi8KY29uc3QgSnNCdWlsZGVyIGpzID0gY29uc3QgSnNCdWlsZGVyKCk7CgpjbGFzcyBKc0J1aWxkZXIgewogIGNvbnN0IEpzQnVpbGRlcigpOwoKICAvKioKICAgKiBQYXJzZXMgYSBiaXQgb2YgSmF2YVNjcmlwdCwgYW5kIHJldHVybnMgYW4gZXhwcmVzc2lvbi4KICAgKgogICAqIFNlZSB0aGUgTWluaUpzUGFyc2VyIGNsYXNzLgogICAqCiAgICogW2FyZ3VtZW50c10gY2FuIGJlIGEgc2luZ2xlIFtOb2RlXSAoZS5nLiBhbiBbRXhwcmVzc2lvbl0gb3IgW1N0YXRlbWVudF0pIG9yCiAgICogYSBsaXN0IG9mIFtOb2RlXXMsIHdoaWNoIHdpbGwgYmUgaW50ZXJwb2xhdGVkIGludG8gdGhlIHNvdXJjZSBhdCB0aGUgJyMnCiAgICogc2lnbnMuCiAgICovCiAgRXhwcmVzc2lvbiBjYWxsKFN0cmluZyBzb3VyY2UsIFt2YXIgYXJndW1lbnRzXSkgewogICAgVGVtcGxhdGUgdGVtcGxhdGUgPSBfZmluZEV4cHJlc3Npb25UZW1wbGF0ZShzb3VyY2UpOwogICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm4gdGVtcGxhdGUuaW5zdGFudGlhdGUoW10pOwogICAgLy8gV2UgYWxsb3cgYSBzaW5nbGUgYXJndW1lbnQgdG8gYmUgZ2l2ZW4gZGlyZWN0bHkuCiAgICBpZiAoYXJndW1lbnRzIGlzISBMaXN0ICYmIGFyZ3VtZW50cyBpcyEgTWFwKSBhcmd1bWVudHMgPSBbYXJndW1lbnRzXTsKICAgIHJldHVybiB0ZW1wbGF0ZS5pbnN0YW50aWF0ZShhcmd1bWVudHMpOwogIH0KCiAgLyoqCiAgICogUGFyc2VzIGEgSmF2YVNjcmlwdCBTdGF0ZW1lbnQsIG90aGVyd2lzZSBqdXN0IGxpa2UgW2NhbGxdLgogICAqLwogIFN0YXRlbWVudCBzdGF0ZW1lbnQoU3RyaW5nIHNvdXJjZSwgW3ZhciBhcmd1bWVudHNdKSB7CiAgICBUZW1wbGF0ZSB0ZW1wbGF0ZSA9IF9maW5kU3RhdGVtZW50VGVtcGxhdGUoc291cmNlKTsKICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCkgcmV0dXJuIHRlbXBsYXRlLmluc3RhbnRpYXRlKFtdKTsKICAgIC8vIFdlIGFsbG93IGEgc2luZ2xlIGFyZ3VtZW50IHRvIGJlIGdpdmVuIGRpcmVjdGx5LgogICAgaWYgKGFyZ3VtZW50cyBpcyEgTGlzdCAmJiBhcmd1bWVudHMgaXMhIE1hcCkgYXJndW1lbnRzID0gW2FyZ3VtZW50c107CiAgICByZXR1cm4gdGVtcGxhdGUuaW5zdGFudGlhdGUoYXJndW1lbnRzKTsKICB9CgogIC8qKgogICAqIFBhcnNlcyBKYXZhU2NyaXB0IHdyaXR0ZW4gaW4gdGhlIGBKU2AgZm9yZWlnbiBpbnN0cnVjdGlvbi4KICAgKgogICAqIFRoZSBbc291cmNlXSBtdXN0IGJlIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIG9yIGEgSmF2YVNjcmlwdCB0aHJvdwogICAqIHN0YXRlbWVudC4KICAgKi8KICBUZW1wbGF0ZSBwYXJzZUZvcmVpZ25KUyhTdHJpbmcgc291cmNlKSB7CiAgICAvLyBUT0RPKHNyYSk6IFBhcnNlIHdpdGggZXh0cmEgdmFsaWRhdGlvbiB0byBmb3JiaWQgYCNgIGludGVycG9sYXRpb24gaW4KICAgIC8vIGZ1bmN0aW9ucywgYXMgdGhpcyBsZWFkcyB0byB1bmFudGljaXBhdGVkIGNhcHR1cmUgb2YgdGVtcG9yYXJpZXMgdGhhdCBhcmUKICAgIC8vIHJldXNlZCBhZnRlciBjYXB0dXJlLgogICAgaWYgKHNvdXJjZS5zdGFydHNXaXRoKCJ0aHJvdyAiKSkgewogICAgICByZXR1cm4gX2ZpbmRTdGF0ZW1lbnRUZW1wbGF0ZShzb3VyY2UpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9maW5kRXhwcmVzc2lvblRlbXBsYXRlKHNvdXJjZSk7CiAgICB9CiAgfQoKICBUZW1wbGF0ZSBfZmluZEV4cHJlc3Npb25UZW1wbGF0ZShTdHJpbmcgc291cmNlKSB7CiAgICBUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHRlbXBsYXRlTWFuYWdlci5sb29rdXBFeHByZXNzaW9uVGVtcGxhdGUoc291cmNlKTsKICAgIGlmICh0ZW1wbGF0ZSA9PSBudWxsKSB7CiAgICAgIE1pbmlKc1BhcnNlciBwYXJzZXIgPSBuZXcgTWluaUpzUGFyc2VyKHNvdXJjZSk7CiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBhcnNlci5leHByZXNzaW9uKCk7CiAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGVNYW5hZ2VyLmRlZmluZUV4cHJlc3Npb25UZW1wbGF0ZShzb3VyY2UsIGV4cHJlc3Npb24pOwogICAgfQogICAgcmV0dXJuIHRlbXBsYXRlOwogIH0KCiAgVGVtcGxhdGUgX2ZpbmRTdGF0ZW1lbnRUZW1wbGF0ZShTdHJpbmcgc291cmNlKSB7CiAgICBUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHRlbXBsYXRlTWFuYWdlci5sb29rdXBTdGF0ZW1lbnRUZW1wbGF0ZShzb3VyY2UpOwogICAgaWYgKHRlbXBsYXRlID09IG51bGwpIHsKICAgICAgTWluaUpzUGFyc2VyIHBhcnNlciA9IG5ldyBNaW5pSnNQYXJzZXIoc291cmNlKTsKICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IHBhcnNlci5zdGF0ZW1lbnQoKTsKICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZU1hbmFnZXIuZGVmaW5lU3RhdGVtZW50VGVtcGxhdGUoc291cmNlLCBzdGF0ZW1lbnQpOwogICAgfQogICAgcmV0dXJuIHRlbXBsYXRlOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBFeHByZXNzaW9uIHRlbXBsYXRlIGZvciB0aGUgZ2l2ZW4gW3NvdXJjZV0uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgdGVtcGxhdGUgaXMgY2FjaGVkLgogICAqLwogIFRlbXBsYXRlIGV4cHJlc3Npb25UZW1wbGF0ZUZvcihTdHJpbmcgc291cmNlKSB7CiAgICByZXR1cm4gX2ZpbmRFeHByZXNzaW9uVGVtcGxhdGUoc291cmNlKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYW4gRXhwcmVzc2lvbiB0ZW1wbGF0ZSB3aXRob3V0IGNhY2hpbmcgdGhlIHJlc3VsdC4KICAgKi8KICBUZW1wbGF0ZSB1bmNhY2hlZEV4cHJlc3Npb25UZW1wbGF0ZShTdHJpbmcgc291cmNlKSB7CiAgICBNaW5pSnNQYXJzZXIgcGFyc2VyID0gbmV3IE1pbmlKc1BhcnNlcihzb3VyY2UpOwogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcGFyc2VyLmV4cHJlc3Npb24oKTsKICAgIHJldHVybiBuZXcgVGVtcGxhdGUoc291cmNlLCBleHByZXNzaW9uLAogICAgICAgIGlzRXhwcmVzc2lvbjogdHJ1ZSwgZm9yY2VDb3B5OiBmYWxzZSk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgU3RhdGVtZW50IHRlbXBsYXRlIHdpdGhvdXQgY2FjaGluZyB0aGUgcmVzdWx0LgogICAqLwogIFRlbXBsYXRlIHVuY2FjaGVkU3RhdGVtZW50VGVtcGxhdGUoU3RyaW5nIHNvdXJjZSkgewogICAgTWluaUpzUGFyc2VyIHBhcnNlciA9IG5ldyBNaW5pSnNQYXJzZXIoc291cmNlKTsKICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBwYXJzZXIuc3RhdGVtZW50KCk7CiAgICByZXR1cm4gbmV3IFRlbXBsYXRlKHNvdXJjZSwgc3RhdGVtZW50LAogICAgICAgIGlzRXhwcmVzc2lvbjogZmFsc2UsIGZvcmNlQ29weTogZmFsc2UpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIGFuIEV4cHJlc3Npb24gdGVtcGxhdGUgd2hpY2ggaGFzIFthc3RdIGFzIHRoZSByZXN1bHQuICBUaGlzIGlzIHVzZWQKICAgKiB0byB3cmFwIGEgZ2VuZXJhdGVkIEFTVCBpbiBhIHplcm8tYXJndW1lbnQgVGVtcGxhdGUgc28gaXQgY2FuIGJlIHBhc3NlZCB0bwogICAqIGNvbnRleHQgdGhhdCBleHBlY3RzIGEgdGVtcGxhdGUuCiAgICovCiAgVGVtcGxhdGUgZXhwcmVzc2lvblRlbXBsYXRlWWllbGRpbmcoTm9kZSBhc3QpIHsKICAgIHJldHVybiBuZXcgVGVtcGxhdGUud2l0aEV4cHJlc3Npb25SZXN1bHQoYXN0KTsKICB9CgogIFRlbXBsYXRlIHN0YXRlbWVudFRlbXBsYXRlWWllbGRpbmcoTm9kZSBhc3QpIHsKICAgIHJldHVybiBuZXcgVGVtcGxhdGUud2l0aFN0YXRlbWVudFJlc3VsdChhc3QpOwogIH0KCiAgLy8vIENyZWF0ZXMgYSBsaXRlcmFsIGpzIHN0cmluZyBmcm9tIFt2YWx1ZV0uCiAgTGl0ZXJhbFN0cmluZyBfbGVnYWN5RXNjYXBlZFN0cmluZyhTdHJpbmcgdmFsdWUpIHsKICAgIC8vIFN0YXJ0IGJ5IGVzY2FwaW5nIHRoZSBiYWNrc2xhc2hlcy4KICAgIFN0cmluZyBlc2NhcGVkID0gdmFsdWUucmVwbGFjZUFsbCgnXFwnLCAnXFxcXCcpOwogICAgLy8gRG8gbm90IGVzY2FwZSB1bmljb2RlIGNoYXJhY3RlcnMgYW5kICcgYmVjYXVzZSB0aGV5IGFyZSBhbGxvd2VkIGluIHRoZQogICAgLy8gc3RyaW5nIGxpdGVyYWwgYW55d2F5LgogICAgZXNjYXBlZCA9IGVzY2FwZWQucmVwbGFjZUFsbE1hcHBlZChuZXcgUmVnRXhwKCdcbnwifFxifFx0fFx2fFxyJyksIChtYXRjaCkgewogICAgICBzd2l0Y2ggKG1hdGNoLmdyb3VwKDApKSB7CiAgICAgICAgY2FzZSAiXG4iOgogICAgICAgICAgcmV0dXJuIHIiXG4iOwogICAgICAgIGNhc2UgIlwiIjoKICAgICAgICAgIHJldHVybiByJ1wiJzsKICAgICAgICBjYXNlICJcYiI6CiAgICAgICAgICByZXR1cm4gciJcYiI7CiAgICAgICAgY2FzZSAiXHQiOgogICAgICAgICAgcmV0dXJuIHIiXHQiOwogICAgICAgIGNhc2UgIlxmIjoKICAgICAgICAgIHJldHVybiByIlxmIjsKICAgICAgICBjYXNlICJcciI6CiAgICAgICAgICByZXR1cm4gciJcciI7CiAgICAgICAgY2FzZSAiXHYiOgogICAgICAgICAgcmV0dXJuIHIiXHYiOwogICAgICB9CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIG1hdGNoOiAke21hdGNoLmdyb3VwKDApfSIpOwogICAgfSk7CiAgICBMaXRlcmFsU3RyaW5nIHJlc3VsdCA9IHN0cmluZyhlc2NhcGVkKTsKICAgIC8vIFdlIGRvbid0IGVzY2FwZSAnIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHN0cmluZyBpcyB3cmFwcGVkCiAgICAvLyBpbnRvICIuIFZlcmlmeSB0aGF0IGFzc3VtcHRpb24uCiAgICBhc3NlcnQocmVzdWx0LnZhbHVlLmNvZGVVbml0QXQoMCkgPT0gJyInLmNvZGVVbml0QXQoMCkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBDcmVhdGVzIGEgbGl0ZXJhbCBqcyBzdHJpbmcgZnJvbSBbdmFsdWVdLgogIExpdGVyYWxTdHJpbmcgZXNjYXBlZFN0cmluZyhTdHJpbmcgdmFsdWUsCiAgICAgIHtib29sIHV0Zjg6IGZhbHNlLCBib29sIGFzY2lpOiBmYWxzZX0pIHsKICAgIGlmICh1dGY4ID09IGZhbHNlICYmIGFzY2lpID09IGZhbHNlKSByZXR1cm4gX2xlZ2FjeUVzY2FwZWRTdHJpbmcodmFsdWUpOwogICAgaWYgKHV0ZjggJiYgYXNjaWkpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdDYW5ub3QgYmUgYm90aCBVVEY4IGFuZCBBU0NJSScpOwoKICAgIGludCBzaW5nbGVRdW90ZXMgPSAwOwogICAgaW50IGRvdWJsZVF1b3RlcyA9IDA7CiAgICBpbnQgb3RoZXJFc2NhcGVzID0gMDsKICAgIGludCB1bnBhaXJlZFN1cnJvZ2F0ZXMgPSAwOwoKICAgIGZvciAoaW50IHJ1bmUgaW4gdmFsdWUucnVuZXMpIHsKICAgICAgaWYgKHJ1bmUgPT0gY2hhckNvZGVzLiRCQUNLU0xBU0gpIHsKICAgICAgICArK290aGVyRXNjYXBlczsKICAgICAgfSBlbHNlIGlmIChydW5lID09IGNoYXJDb2Rlcy4kU1EpIHsKICAgICAgICArK3NpbmdsZVF1b3RlczsKICAgICAgfSBlbHNlIGlmIChydW5lID09IGNoYXJDb2Rlcy4kRFEpIHsKICAgICAgICArK2RvdWJsZVF1b3RlczsKICAgICAgfSBlbHNlIGlmIChydW5lID09IGNoYXJDb2Rlcy4kTEYgfHwKICAgICAgICAgIHJ1bmUgPT0gY2hhckNvZGVzLiRDUiB8fAogICAgICAgICAgcnVuZSA9PSBjaGFyQ29kZXMuJExTIHx8CiAgICAgICAgICBydW5lID09IGNoYXJDb2Rlcy4kUFMpIHsKICAgICAgICAvLyBMaW5lIHRlcm1pbmF0b3JzLgogICAgICAgICsrb3RoZXJFc2NhcGVzOwogICAgICB9IGVsc2UgaWYgKHJ1bmUgPT0gY2hhckNvZGVzLiRCUyB8fAogICAgICAgICAgcnVuZSA9PSBjaGFyQ29kZXMuJFRBQiB8fAogICAgICAgICAgcnVuZSA9PSBjaGFyQ29kZXMuJFZUQUIgfHwKICAgICAgICAgIHJ1bmUgPT0gY2hhckNvZGVzLiRGRikgewogICAgICAgICsrb3RoZXJFc2NhcGVzOwogICAgICB9IGVsc2UgaWYgKF9pc1VucGFpcmVkU3Vycm9nYXRlKHJ1bmUpKSB7CiAgICAgICAgKyt1bnBhaXJlZFN1cnJvZ2F0ZXM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGFzY2lpICYmIChydW5lIDwgY2hhckNvZGVzLiRTUEFDRSB8fCBydW5lID49IGNoYXJDb2Rlcy4kREVMKSkgewogICAgICAgICAgKytvdGhlckVzY2FwZXM7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgTGl0ZXJhbFN0cmluZyBmaW5pc2goU3RyaW5nIHF1b3RlLCBTdHJpbmcgY29udGVudHMpIHsKICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsU3RyaW5nKCckcXVvdGUkY29udGVudHMkcXVvdGUnKTsKICAgIH0KCiAgICBpZiAob3RoZXJFc2NhcGVzID09IDAgJiYgdW5wYWlyZWRTdXJyb2dhdGVzID09IDApIHsKICAgICAgaWYgKGRvdWJsZVF1b3RlcyA9PSAwKSByZXR1cm4gZmluaXNoKCciJywgdmFsdWUpOwogICAgICBpZiAoc2luZ2xlUXVvdGVzID09IDApIHJldHVybiBmaW5pc2goIiciLCB2YWx1ZSk7CiAgICB9CgogICAgYm9vbCB1c2VTaW5nbGVRdW90ZXMgPSBzaW5nbGVRdW90ZXMgPCBkb3VibGVRdW90ZXM7CgogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoKICAgIGZvciAoaW50IHJ1bmUgaW4gdmFsdWUucnVuZXMpIHsKICAgICAgU3RyaW5nIGVzY2FwZSA9IF9pcnJlZ3VsYXJFc2NhcGUocnVuZSwgdXNlU2luZ2xlUXVvdGVzKTsKICAgICAgaWYgKGVzY2FwZSAhPSBudWxsKSB7CiAgICAgICAgc2Iud3JpdGUoZXNjYXBlKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAocnVuZSA9PSBjaGFyQ29kZXMuJExTIHx8CiAgICAgICAgICBydW5lID09IGNoYXJDb2Rlcy4kUFMgfHwKICAgICAgICAgIF9pc1VucGFpcmVkU3Vycm9nYXRlKHJ1bmUpIHx8CiAgICAgICAgICBhc2NpaSAmJiAocnVuZSA8IGNoYXJDb2Rlcy4kU1BBQ0UgfHwgcnVuZSA+PSBjaGFyQ29kZXMuJERFTCkpIHsKICAgICAgICBpZiAocnVuZSA8IDB4MTAwKSB7CiAgICAgICAgICBzYi53cml0ZShyJ1x4Jyk7CiAgICAgICAgICBzYi53cml0ZShydW5lLnRvUmFkaXhTdHJpbmcoMTYpLnBhZExlZnQoMiwgJzAnKSk7CiAgICAgICAgfSBlbHNlIGlmIChydW5lIDwgMHgxMDAwMCkgewogICAgICAgICAgc2Iud3JpdGUocidcdScpOwogICAgICAgICAgc2Iud3JpdGUocnVuZS50b1JhZGl4U3RyaW5nKDE2KS5wYWRMZWZ0KDQsICcwJykpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBOb3QgYWxsIGJyb3dzZXJzIGFjY2VwdCB0aGUgRVM2IFx1e3p6enp6en0gZW5jb2RpbmcsIHNvIGVtaXQgdHdvCiAgICAgICAgICAvLyBzdXJyb2dhdGUgcGFpcnMuCiAgICAgICAgICB2YXIgYml0cyA9IHJ1bmUgLSAweDEwMDAwOwogICAgICAgICAgdmFyIGxlYWRpbmcgPSAweEQ4MDAgfCAoYml0cyA+PiAxMCk7CiAgICAgICAgICB2YXIgdHJhaWxpbmcgPSAweERDMDAgfCAoYml0cyAmIDB4M2ZmKTsKICAgICAgICAgIHNiLndyaXRlKHInXHUnKTsKICAgICAgICAgIHNiLndyaXRlKGxlYWRpbmcudG9SYWRpeFN0cmluZygxNikpOwogICAgICAgICAgc2Iud3JpdGUocidcdScpOwogICAgICAgICAgc2Iud3JpdGUodHJhaWxpbmcudG9SYWRpeFN0cmluZygxNikpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBzYi53cml0ZUNoYXJDb2RlKHJ1bmUpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZpbmlzaCh1c2VTaW5nbGVRdW90ZXMgPyAiJyIgOiAnIicsIHNiLnRvU3RyaW5nKCkpOwogIH0KCiAgc3RhdGljIGJvb2wgX2lzVW5wYWlyZWRTdXJyb2dhdGUoaW50IGNvZGUpID0+IChjb2RlICYgMHhGRkZGRjgwMCkgPT0gMHhEODAwOwoKICBzdGF0aWMgU3RyaW5nIF9pcnJlZ3VsYXJFc2NhcGUoaW50IGNvZGUsIGJvb2wgdXNlU2luZ2xlUXVvdGVzKSB7CiAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgY2FzZSBjaGFyQ29kZXMuJFNROgogICAgICAgIHJldHVybiB1c2VTaW5nbGVRdW90ZXMgPyByIlwnIiA6IHIiJyI7CiAgICAgIGNhc2UgY2hhckNvZGVzLiREUToKICAgICAgICByZXR1cm4gdXNlU2luZ2xlUXVvdGVzID8gciciJyA6IHInXCInOwogICAgICBjYXNlIGNoYXJDb2Rlcy4kQkFDS1NMQVNIOgogICAgICAgIHJldHVybiByJ1xcJzsKICAgICAgY2FzZSBjaGFyQ29kZXMuJEJTOgogICAgICAgIHJldHVybiByJ1xiJzsKICAgICAgY2FzZSBjaGFyQ29kZXMuJFRBQjoKICAgICAgICByZXR1cm4gcidcdCc7CiAgICAgIGNhc2UgY2hhckNvZGVzLiRMRjoKICAgICAgICByZXR1cm4gcidcbic7CiAgICAgIGNhc2UgY2hhckNvZGVzLiRWVEFCOgogICAgICAgIHJldHVybiByJ1x2JzsKICAgICAgY2FzZSBjaGFyQ29kZXMuJEZGOgogICAgICAgIHJldHVybiByJ1xmJzsKICAgICAgY2FzZSBjaGFyQ29kZXMuJENSOgogICAgICAgIHJldHVybiByJ1xyJzsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIENyZWF0ZXMgYSBsaXRlcmFsIGpzIHN0cmluZyBmcm9tIFt2YWx1ZV0uCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgcHV0cyBxdW90ZXMgYXJvdW5kIFt2YWx1ZV0uIEl0IGRvZXMgbm90IGRvCiAgLy8vIGFueSBlc2NhcGluZywgc28gdXNlIG9ubHkgd2hlbiB5b3UgY2FuIGd1YXJhbnRlZSB0aGF0IFt2YWx1ZV0gZG9lcyBub3QKICAvLy8gY29udGFpbiBuZXdsaW5lcyBvciBiYWNrc2xhc2hlcy4gRm9yIGVzY2FwaW5nIHRoZSBzdHJpbmcgdXNlCiAgLy8vIFtlc2NhcGVkU3RyaW5nXS4KICBMaXRlcmFsU3RyaW5nIHN0cmluZyhTdHJpbmcgdmFsdWUpID0+IG5ldyBMaXRlcmFsU3RyaW5nKCciJHZhbHVlIicpOwoKICAvLy8gQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBbTGl0ZXJhbFN0cmluZ10gZnJvbSBbdmFsdWVdLgogIC8vLwogIC8vLyBEb2VzIG5vdCBhZGQgcXVvdGVzIG9yIGRvIGFueSBlc2NhcGluZy4KICBMaXRlcmFsU3RyaW5nIHN0cmluZ1BhcnQoU3RyaW5nIHZhbHVlKSA9PiBuZXcgTGl0ZXJhbFN0cmluZyh2YWx1ZSk7CgogIFN0cmluZ0NvbmNhdGVuYXRpb24gY29uY2F0ZW5hdGVTdHJpbmdzKEl0ZXJhYmxlPExpdGVyYWw+IHBhcnRzLAogICAgICB7YWRkUXVvdGVzOiBmYWxzZX0pIHsKICAgIExpc3Q8TGl0ZXJhbD4gX3BhcnRzOwogICAgaWYgKGFkZFF1b3RlcykgewogICAgICBMaXRlcmFsIHF1b3RlID0gc3RyaW5nUGFydCgnIicpOwogICAgICBfcGFydHMgPSA8TGl0ZXJhbD5bcXVvdGVdCiAgICAgICAgLi5hZGRBbGwocGFydHMpCiAgICAgICAgLi5hZGQocXVvdGUpOwogICAgfSBlbHNlIHsKICAgICAgX3BhcnRzID0gbmV3IExpc3QuZnJvbShwYXJ0cywgZ3Jvd2FibGU6IGZhbHNlKTsKICAgIH0KICAgIHJldHVybiBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbihfcGFydHMpOwogIH0KCiAgSXRlcmFibGU8TGl0ZXJhbD4gam9pbkxpdGVyYWxzKEl0ZXJhYmxlPExpdGVyYWw+IGxpc3QsIExpdGVyYWwgc2VwYXJhdG9yKSB7CiAgICByZXR1cm4gbmV3IF9JbnRlcmxlYXZlSXRlcmFibGU8TGl0ZXJhbD4obGlzdCwgc2VwYXJhdG9yKTsKICB9CgogIExpdGVyYWxTdHJpbmcgcXVvdGVOYW1lKE5hbWUgbmFtZSwge2FsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICByZXR1cm4gbmV3IExpdGVyYWxTdHJpbmcoJyIiJyk7CiAgICB9CiAgICByZXR1cm4gbmV3IExpdGVyYWxTdHJpbmdGcm9tTmFtZShuYW1lKTsKICB9CgogIExpdGVyYWxOdW1iZXIgbnVtYmVyKG51bSB2YWx1ZSkgPT4gbmV3IExpdGVyYWxOdW1iZXIoJyR2YWx1ZScpOwoKICBMaXRlcmFsQm9vbCBib29sZWFuKGJvb2wgdmFsdWUpID0+IG5ldyBMaXRlcmFsQm9vbCh2YWx1ZSk7CgogIEFycmF5SW5pdGlhbGl6ZXIgbnVtQXJyYXkoSXRlcmFibGU8aW50PiBsaXN0KSA9PgogICAgICBuZXcgQXJyYXlJbml0aWFsaXplcihsaXN0Lm1hcChudW1iZXIpLnRvTGlzdCgpKTsKCiAgQXJyYXlJbml0aWFsaXplciBzdHJpbmdBcnJheShJdGVyYWJsZTxTdHJpbmc+IGxpc3QpID0+CiAgICAgIG5ldyBBcnJheUluaXRpYWxpemVyKGxpc3QubWFwKHN0cmluZykudG9MaXN0KCkpOwoKICBDb21tZW50IGNvbW1lbnQoU3RyaW5nIHRleHQpID0+IG5ldyBDb21tZW50KHRleHQpOwoKICBDYWxsIHByb3BlcnR5Q2FsbCgKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwgRXhwcmVzc2lvbiBmaWVsZE5hbWUsIExpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IENhbGwobmV3IFByb3BlcnR5QWNjZXNzKHJlY2VpdmVyLCBmaWVsZE5hbWUpLCBhcmd1bWVudHMpOwogIH0KCiAgT2JqZWN0SW5pdGlhbGl6ZXIgb2JqZWN0TGl0ZXJhbChNYXA8U3RyaW5nLCBFeHByZXNzaW9uPiBtYXApIHsKICAgIExpc3Q8UHJvcGVydHk+IHByb3BlcnRpZXMgPSA8UHJvcGVydHk+W107CiAgICBtYXAuZm9yRWFjaCgobmFtZSwgdmFsdWUpIHsKICAgICAgcHJvcGVydGllcy5hZGQobmV3IFByb3BlcnR5KHN0cmluZyhuYW1lKSwgdmFsdWUpKTsKICAgIH0pOwogICAgcmV0dXJuIG5ldyBPYmplY3RJbml0aWFsaXplcihwcm9wZXJ0aWVzKTsKICB9Cn0KCkxpdGVyYWxTdHJpbmcgc3RyaW5nKFN0cmluZyB2YWx1ZSkgPT4ganMuc3RyaW5nKHZhbHVlKTsKTGl0ZXJhbFN0cmluZyBxdW90ZU5hbWUoTmFtZSBuYW1lLCB7YWxsb3dOdWxsOiBmYWxzZX0pIHsKICByZXR1cm4ganMucXVvdGVOYW1lKG5hbWUsIGFsbG93TnVsbDogYWxsb3dOdWxsKTsKfQoKTGl0ZXJhbFN0cmluZyBzdHJpbmdQYXJ0KFN0cmluZyB2YWx1ZSkgPT4ganMuc3RyaW5nUGFydCh2YWx1ZSk7Ckl0ZXJhYmxlPExpdGVyYWw+IGpvaW5MaXRlcmFscyhJdGVyYWJsZTxMaXRlcmFsPiBsaXN0LCBMaXRlcmFsIHNlcGFyYXRvcikgewogIHJldHVybiBqcy5qb2luTGl0ZXJhbHMobGlzdCwgc2VwYXJhdG9yKTsKfQoKU3RyaW5nQ29uY2F0ZW5hdGlvbiBjb25jYXRlbmF0ZVN0cmluZ3MoSXRlcmFibGU8TGl0ZXJhbD4gcGFydHMsCiAgICB7YWRkUXVvdGVzOiBmYWxzZX0pIHsKICByZXR1cm4ganMuY29uY2F0ZW5hdGVTdHJpbmdzKHBhcnRzLCBhZGRRdW90ZXM6IGFkZFF1b3Rlcyk7Cn0KCkxpdGVyYWxOdW1iZXIgbnVtYmVyKG51bSB2YWx1ZSkgPT4ganMubnVtYmVyKHZhbHVlKTsKQXJyYXlJbml0aWFsaXplciBudW1BcnJheShJdGVyYWJsZTxpbnQ+IGxpc3QpID0+IGpzLm51bUFycmF5KGxpc3QpOwpBcnJheUluaXRpYWxpemVyIHN0cmluZ0FycmF5KEl0ZXJhYmxlPFN0cmluZz4gbGlzdCkgPT4ganMuc3RyaW5nQXJyYXkobGlzdCk7CkNhbGwgcHJvcGVydHlDYWxsKAogICAgRXhwcmVzc2lvbiByZWNlaXZlciwgRXhwcmVzc2lvbiBmaWVsZE5hbWUsIExpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzKSB7CiAgcmV0dXJuIGpzLnByb3BlcnR5Q2FsbChyZWNlaXZlciwgZmllbGROYW1lLCBhcmd1bWVudHMpOwp9CgpPYmplY3RJbml0aWFsaXplciBvYmplY3RMaXRlcmFsKE1hcDxTdHJpbmcsIEV4cHJlc3Npb24+IG1hcCkgewogIHJldHVybiBqcy5vYmplY3RMaXRlcmFsKG1hcCk7Cn0KCmNsYXNzIE1pbmlKc1BhcnNlckVycm9yIHsKICBNaW5pSnNQYXJzZXJFcnJvcih0aGlzLnBhcnNlciwgdGhpcy5tZXNzYWdlKSB7fQoKICBmaW5hbCBNaW5pSnNQYXJzZXIgcGFyc2VyOwogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBpbnQgcG9zID0gcGFyc2VyLmxhc3RQb3NpdGlvbjsKCiAgICAvLyBEaXNjYXJkIGxpbmVzIGZvbGxvd2luZyB0aGUgbGluZSBjb250YWluaW5nIGxhc3RQb3NpdGlvbi4KICAgIFN0cmluZyBzcmMgPSBwYXJzZXIuc3JjOwogICAgaW50IG5ld2xpbmVQb3MgPSBzcmMuaW5kZXhPZignXG4nLCBwb3MpOwogICAgaWYgKG5ld2xpbmVQb3MgPj0gcG9zKSBzcmMgPSBzcmMuc3Vic3RyaW5nKDAsIG5ld2xpbmVQb3MpOwoKICAgIC8vIEV4dHJhY3QgdGhlIHByZWZpeCBvZiB0aGUgZXJyb3IgbGluZSBiZWZvcmUgbGFzdFBvc2l0aW9uLgogICAgU3RyaW5nIGxpbmUgPSBzcmM7CiAgICBpbnQgbGFzdExpbmVTdGFydCA9IGxpbmUubGFzdEluZGV4T2YoJ1xuJyk7CiAgICBpZiAobGFzdExpbmVTdGFydCA+PSAwKSBsaW5lID0gbGluZS5zdWJzdHJpbmcobGFzdExpbmVTdGFydCArIDEpOwogICAgU3RyaW5nIHByZWZpeCA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvcyAtIChzcmMubGVuZ3RoIC0gbGluZS5sZW5ndGgpKTsKCiAgICAvLyBSZXBsYWNlIG5vbi10YWJzIHdpdGggc3BhY2VzLCBnaXZpbmcgYSBwcmludCBpbmRlbnQgdGhhdCBtYXRjaGVzIHRoZSB0ZXh0CiAgICAvLyBmb3IgdGFiYmluZy4KICAgIFN0cmluZyBzcGFjZXMgPSBwcmVmaXgucmVwbGFjZUFsbChuZXcgUmVnRXhwKHInW15cdF0nKSwgJyAnKTsKICAgIHJldHVybiAnRXJyb3IgaW4gTWluaUpzUGFyc2VyOlxuJHtzcmN9XG4kc3BhY2VzXlxuJHNwYWNlcyRtZXNzYWdlXG4nOwogIH0KfQoKLy8vIE1pbmkgSmF2YVNjcmlwdCBwYXJzZXIgZm9yIHRpbnkgc25pcHBldHMgb2YgY29kZSB0aGF0IHdlIHdhbnQgdG8gbWFrZSBpbnRvCi8vLyBBU1Qgbm9kZXMuICBIYW5kbGVzOgovLy8gKiBpZGVudGlmaWVycy4KLy8vICogZG90IGFjY2Vzcy4KLy8vICogbWV0aG9kIGNhbGxzLgovLy8gKiBbXSBhY2Nlc3MuCi8vLyAqIGFycmF5LCBzdHJpbmcsIHJlZ2V4cCwgYm9vbGVhbiwgbnVsbCBhbmQgbnVtZXJpYyBsaXRlcmFscy4KLy8vICogbW9zdCBvcGVyYXRvcnMuCi8vLyAqIGJyYWNrZXRzLgovLy8gKiB2YXIgZGVjbGFyYXRpb25zLgovLy8gKiBvcGVyYXRvciBwcmVjZWRlbmNlLgovLy8gKiBhbm9ueW1vdXMgZnVuY3Rpb25zIGFuZCBuYW1lZCBmdW5jdGlvbiBleHByZXNzaW9ucyBhbmQgZGVjbGFyYXRpb25zLgovLy8gTm90YWJsZSB0aGluZ3MgaXQgY2FuJ3QgZG8geWV0IGluY2x1ZGU6Ci8vLyAqIHNvbWUgc3RhdGVtZW50cyBhcmUgc3RpbGwgbWlzc2luZyAoZG8td2hpbGUsIHdoaWxlLCBzd2l0Y2gpLgovLy8KLy8vIEl0J3MgYSBmYWlybHkgc3RhbmRhcmQgcmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VyLgovLy8KLy8vIExpdGVyYWwgc3RyaW5ncyBhcmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGZpbmFsIEpTIHNvdXJjZSBjb2RlIHVuY2hhbmdlZCwKLy8vIGluY2x1ZGluZyB0aGUgY2hvaWNlIG9mIHN1cnJvdW5kaW5nIHF1b3Rlcywgc28gaWYgeW91IHBhcnNlCi8vLyByJ3ZhciB4ID0gImZvb1xuXCJiYXJcIiInIHlvdSB3aWxsIGVuZCB1cCB3aXRoCi8vLyAgIHZhciB4ID0gImZvb1xuXCJiYXJcIiIgaW4gdGhlIGZpbmFsIHByb2dyYW0uICBceCBhbmQgXHUgZXNjYXBlcyBhcmUgbm90Ci8vLyBhbGxvd2VkIGluIHN0cmluZyBhbmQgcmVnZXhwIGxpdGVyYWxzIGJlY2F1c2UgdGhlIG1hY2hpbmVyeSBmb3IgY2hlY2tpbmcKLy8vIHRoZWlyIGNvcnJlY3RuZXNzIGlzIHJhdGhlciBpbnZvbHZlZC4KY2xhc3MgTWluaUpzUGFyc2VyIHsKICBNaW5pSnNQYXJzZXIodGhpcy5zcmMpCiAgICAgIDogbGFzdENhdGVnb3J5ID0gTk9ORSwKICAgICAgICBsYXN0VG9rZW4gPSBudWxsLAogICAgICAgIGxhc3RQb3NpdGlvbiA9IDAsCiAgICAgICAgcG9zaXRpb24gPSAwIHsKICAgIGdldFRva2VuKCk7CiAgfQoKICBpbnQgbGFzdENhdGVnb3J5ID0gTk9ORTsKICBTdHJpbmcgbGFzdFRva2VuID0gbnVsbDsKICBpbnQgbGFzdFBvc2l0aW9uID0gMDsKICBpbnQgcG9zaXRpb24gPSAwOwogIGJvb2wgc2tpcHBlZE5ld2xpbmUgPSBmYWxzZTsgLy8gc2tpcHBlZCBuZXdsaW5lIGluIGxhc3QgZ2V0VG9rZW4/CiAgZmluYWwgU3RyaW5nIHNyYzsKCiAgZmluYWwgTGlzdDxJbnRlcnBvbGF0ZWROb2RlPiBpbnRlcnBvbGF0ZWRWYWx1ZXMgPSA8SW50ZXJwb2xhdGVkTm9kZT5bXTsKICBib29sIGdldCBoYXNOYW1lZEhvbGVzID0+CiAgICAgIGludGVycG9sYXRlZFZhbHVlcy5pc05vdEVtcHR5ICYmIGludGVycG9sYXRlZFZhbHVlcy5maXJzdC5pc05hbWVkOwogIGJvb2wgZ2V0IGhhc1Bvc2l0aW9uYWxIb2xlcyA9PgogICAgICBpbnRlcnBvbGF0ZWRWYWx1ZXMuaXNOb3RFbXB0eSAmJiBpbnRlcnBvbGF0ZWRWYWx1ZXMuZmlyc3QuaXNQb3NpdGlvbmFsOwoKICBzdGF0aWMgY29uc3QgTk9ORSA9IC0xOwogIHN0YXRpYyBjb25zdCBBTFBIQSA9IDA7CiAgc3RhdGljIGNvbnN0IE5VTUVSSUMgPSAxOwogIHN0YXRpYyBjb25zdCBTVFJJTkcgPSAyOwogIHN0YXRpYyBjb25zdCBTWU1CT0wgPSAzOwogIHN0YXRpYyBjb25zdCBBU1NJR05NRU5UID0gNDsKICBzdGF0aWMgY29uc3QgRE9UID0gNTsKICBzdGF0aWMgY29uc3QgTFBBUkVOID0gNjsKICBzdGF0aWMgY29uc3QgUlBBUkVOID0gNzsKICBzdGF0aWMgY29uc3QgTEJSQUNFID0gODsKICBzdGF0aWMgY29uc3QgUkJSQUNFID0gOTsKICBzdGF0aWMgY29uc3QgTFNRVUFSRSA9IDEwOwogIHN0YXRpYyBjb25zdCBSU1FVQVJFID0gMTE7CiAgc3RhdGljIGNvbnN0IENPTU1BID0gMTI7CiAgc3RhdGljIGNvbnN0IFFVRVJZID0gMTM7CiAgc3RhdGljIGNvbnN0IENPTE9OID0gMTQ7CiAgc3RhdGljIGNvbnN0IFNFTUlDT0xPTiA9IDE1OwogIHN0YXRpYyBjb25zdCBIQVNIID0gMTY7CiAgc3RhdGljIGNvbnN0IFdISVRFU1BBQ0UgPSAxNzsKICBzdGF0aWMgY29uc3QgT1RIRVIgPSAxODsKCiAgLy8gTWFrZSBzdXJlIHRoYXQgXV0gaXMgdHdvIHN5bWJvbHMuCiAgYm9vbCBzaW5nbGVDaGFyQ2F0ZWdvcnkoaW50IGNhdGVnb3J5KSA9PiBjYXRlZ29yeSA+PSBET1Q7CgogIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcnlUb1N0cmluZyhpbnQgY2F0KSB7CiAgICBzd2l0Y2ggKGNhdCkgewogICAgICBjYXNlIE5PTkU6CiAgICAgICAgcmV0dXJuICJOT05FIjsKICAgICAgY2FzZSBBTFBIQToKICAgICAgICByZXR1cm4gIkFMUEhBIjsKICAgICAgY2FzZSBOVU1FUklDOgogICAgICAgIHJldHVybiAiTlVNRVJJQyI7CiAgICAgIGNhc2UgU1lNQk9MOgogICAgICAgIHJldHVybiAiU1lNQk9MIjsKICAgICAgY2FzZSBBU1NJR05NRU5UOgogICAgICAgIHJldHVybiAiQVNTSUdOTUVOVCI7CiAgICAgIGNhc2UgRE9UOgogICAgICAgIHJldHVybiAiRE9UIjsKICAgICAgY2FzZSBMUEFSRU46CiAgICAgICAgcmV0dXJuICJMUEFSRU4iOwogICAgICBjYXNlIFJQQVJFTjoKICAgICAgICByZXR1cm4gIlJQQVJFTiI7CiAgICAgIGNhc2UgTEJSQUNFOgogICAgICAgIHJldHVybiAiTEJSQUNFIjsKICAgICAgY2FzZSBSQlJBQ0U6CiAgICAgICAgcmV0dXJuICJSQlJBQ0UiOwogICAgICBjYXNlIExTUVVBUkU6CiAgICAgICAgcmV0dXJuICJMU1FVQVJFIjsKICAgICAgY2FzZSBSU1FVQVJFOgogICAgICAgIHJldHVybiAiUlNRVUFSRSI7CiAgICAgIGNhc2UgU1RSSU5HOgogICAgICAgIHJldHVybiAiU1RSSU5HIjsKICAgICAgY2FzZSBDT01NQToKICAgICAgICByZXR1cm4gIkNPTU1BIjsKICAgICAgY2FzZSBRVUVSWToKICAgICAgICByZXR1cm4gIlFVRVJZIjsKICAgICAgY2FzZSBDT0xPTjoKICAgICAgICByZXR1cm4gIkNPTE9OIjsKICAgICAgY2FzZSBTRU1JQ09MT046CiAgICAgICAgcmV0dXJuICJTRU1JQ09MT04iOwogICAgICBjYXNlIEhBU0g6CiAgICAgICAgcmV0dXJuICJIQVNIIjsKICAgICAgY2FzZSBXSElURVNQQUNFOgogICAgICAgIHJldHVybiAiV0hJVEVTUEFDRSI7CiAgICAgIGNhc2UgT1RIRVI6CiAgICAgICAgcmV0dXJuICJPVEhFUiI7CiAgICB9CiAgICByZXR1cm4gIlVua25vd246ICRjYXQiOwogIH0KCiAgc3RhdGljIGNvbnN0IENBVEVHT1JJRVMgPSBjb25zdCA8aW50PlsKICAgIE9USEVSLCBPVEhFUiwgT1RIRVIsIE9USEVSLCBPVEhFUiwgT1RIRVIsIE9USEVSLCBPVEhFUiwgLy8gMC03CiAgICBPVEhFUiwgV0hJVEVTUEFDRSwgV0hJVEVTUEFDRSwgT1RIRVIsIE9USEVSLCBXSElURVNQQUNFLCAvLyA4LTEzCiAgICBPVEhFUiwgT1RIRVIsIE9USEVSLCBPVEhFUiwgT1RIRVIsIE9USEVSLCBPVEhFUiwgT1RIRVIsIC8vIDE0LTIxCiAgICBPVEhFUiwgT1RIRVIsIE9USEVSLCBPVEhFUiwgT1RIRVIsIE9USEVSLCBPVEhFUiwgT1RIRVIsIC8vIDIyLTI5CiAgICBPVEhFUiwgT1RIRVIsIFdISVRFU1BBQ0UsIC8vIDMwLTMyCiAgICBTWU1CT0wsIE9USEVSLCBIQVNILCBBTFBIQSwgU1lNQk9MLCBTWU1CT0wsIE9USEVSLCAvLyAhIiMkJSbCtAogICAgTFBBUkVOLCBSUEFSRU4sIFNZTUJPTCwgU1lNQk9MLCBDT01NQSwgU1lNQk9MLCBET1QsIFNZTUJPTCwgLy8gKCkqKywtLi8KICAgIE5VTUVSSUMsIE5VTUVSSUMsIE5VTUVSSUMsIE5VTUVSSUMsIE5VTUVSSUMsIC8vIDAxMjM0CiAgICBOVU1FUklDLCBOVU1FUklDLCBOVU1FUklDLCBOVU1FUklDLCBOVU1FUklDLCAvLyA1Njc4OQogICAgQ09MT04sIFNFTUlDT0xPTiwgU1lNQk9MLCBTWU1CT0wsIFNZTUJPTCwgUVVFUlksIE9USEVSLCAvLyA6Ozw9Pj9ACiAgICBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIC8vIEFCQ0RFRkdICiAgICBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIC8vIElKS0xNTk9QCiAgICBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIC8vIFFSU1RVVldYCiAgICBBTFBIQSwgQUxQSEEsIExTUVVBUkUsIE9USEVSLCBSU1FVQVJFLCBTWU1CT0wsIEFMUEhBLCBPVEhFUiwgLy8gWVpbXF1eXycKICAgIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgLy8gYWJjZGVmZ2gKICAgIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgLy8gaWprbG1ub3AKICAgIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgQUxQSEEsIEFMUEhBLCBBTFBIQSwgLy8gcXJzdHV2d3gKICAgIEFMUEhBLCBBTFBIQSwgTEJSQUNFLCBTWU1CT0wsIFJCUkFDRSwgU1lNQk9MCiAgXTsgLy8geXp7fH1+CgogIC8vIFRoaXMgbXVzdCBiZSBhID49IHRoZSBoaWdoZXN0IHByZWNlZGVuY2UgbnVtYmVyIGhhbmRsZWQgYnkgcGFyc2VCaW5hcnkuCiAgc3RhdGljIHZhciBISUdIRVNUX1BBUlNFX0JJTkFSWV9QUkVDRURFTkNFID0gMTY7CiAgc3RhdGljIGJvb2wgaXNBc3NpZ25tZW50KFN0cmluZyBzeW1ib2wpID0+IEJJTkFSWV9QUkVDRURFTkNFW3N5bWJvbF0gPT0gMTc7CgogIC8vIEZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvT3BlcmF0b3JfUHJlY2VkZW5jZQogIHN0YXRpYyBmaW5hbCBCSU5BUllfUFJFQ0VERU5DRSA9IHsKICAgICcrPSc6IDE3LAogICAgJy09JzogMTcsCiAgICAnKj0nOiAxNywKICAgICcvPSc6IDE3LAogICAgJyU9JzogMTcsCiAgICAnXj0nOiAxNywKICAgICd8PSc6IDE3LAogICAgJyY9JzogMTcsCiAgICAnPDw9JzogMTcsCiAgICAnPj49JzogMTcsCiAgICAnPj4+PSc6IDE3LAogICAgJz0nOiAxNywKICAgICd8fCc6IDE0LAogICAgJyYmJzogMTMsCiAgICAnfCc6IDEyLAogICAgJ14nOiAxMSwKICAgICcmJzogMTAsCiAgICAnIT0nOiA5LAogICAgJz09JzogOSwKICAgICchPT0nOiA5LAogICAgJz09PSc6IDksCiAgICAnPCc6IDgsCiAgICAnPD0nOiA4LAogICAgJz49JzogOCwKICAgICc+JzogOCwKICAgICdpbic6IDgsCiAgICAnaW5zdGFuY2VvZic6IDgsCiAgICAnPDwnOiA3LAogICAgJz4+JzogNywKICAgICc+Pj4nOiA3LAogICAgJysnOiA2LAogICAgJy0nOiA2LAogICAgJyonOiA1LAogICAgJy8nOiA1LAogICAgJyUnOiA1CiAgfTsKICBzdGF0aWMgZmluYWwgVU5BUllfT1BFUkFUT1JTID0gWwogICAgJysrJywKICAgICctLScsCiAgICAnKycsCiAgICAnLScsCiAgICAnficsCiAgICAnIScsCiAgICAndHlwZW9mJywKICAgICd2b2lkJywKICAgICdkZWxldGUnLAogICAgJ2F3YWl0JwogIF0udG9TZXQoKTsKCiAgc3RhdGljIGZpbmFsIE9QRVJBVE9SU19USEFUX0xPT0tfTElLRV9JREVOVElGSUVSUyA9CiAgICAgIFsndHlwZW9mJywgJ3ZvaWQnLCAnZGVsZXRlJywgJ2luJywgJ2luc3RhbmNlb2YnLCAnYXdhaXQnXS50b1NldCgpOwoKICBzdGF0aWMgaW50IGNhdGVnb3J5KGludCBjb2RlKSB7CiAgICBpZiAoY29kZSA+PSBDQVRFR09SSUVTLmxlbmd0aCkgcmV0dXJuIE9USEVSOwogICAgcmV0dXJuIENBVEVHT1JJRVNbY29kZV07CiAgfQoKICBTdHJpbmcgZ2V0RGVsaW1pdGVkKGludCBzdGFydFBvc2l0aW9uKSB7CiAgICBwb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb247CiAgICBpbnQgZGVsaW1pdGVyID0gc3JjLmNvZGVVbml0QXQoc3RhcnRQb3NpdGlvbik7CiAgICBpbnQgY3VycmVudENvZGU7CiAgICBkbyB7CiAgICAgIHBvc2l0aW9uKys7CiAgICAgIGlmIChwb3NpdGlvbiA+PSBzcmMubGVuZ3RoKSBlcnJvcigiVW50ZXJtaW5hdGVkIGxpdGVyYWwiKTsKICAgICAgY3VycmVudENvZGUgPSBzcmMuY29kZVVuaXRBdChwb3NpdGlvbik7CiAgICAgIGlmIChjdXJyZW50Q29kZSA9PSBjaGFyQ29kZXMuJExGKSBlcnJvcigiVW50ZXJtaW5hdGVkIGxpdGVyYWwiKTsKICAgICAgaWYgKGN1cnJlbnRDb2RlID09IGNoYXJDb2Rlcy4kQkFDS1NMQVNIKSB7CiAgICAgICAgaWYgKCsrcG9zaXRpb24gPj0gc3JjLmxlbmd0aCkgZXJyb3IoIlVudGVybWluYXRlZCBsaXRlcmFsIik7CiAgICAgICAgaW50IGVzY2FwZWQgPSBzcmMuY29kZVVuaXRBdChwb3NpdGlvbik7CiAgICAgICAgaWYgKGVzY2FwZWQgPT0gY2hhckNvZGVzLiR4IHx8CiAgICAgICAgICAgIGVzY2FwZWQgPT0gY2hhckNvZGVzLiRYIHx8CiAgICAgICAgICAgIGVzY2FwZWQgPT0gY2hhckNvZGVzLiR1IHx8CiAgICAgICAgICAgIGVzY2FwZWQgPT0gY2hhckNvZGVzLiRVIHx8CiAgICAgICAgICAgIGNhdGVnb3J5KGVzY2FwZWQpID09IE5VTUVSSUMpIHsKICAgICAgICAgIGVycm9yKCdOdW1lcmljIGFuZCBoZXggZXNjYXBlcyBhcmUgbm90IGFsbG93ZWQgaW4gbGl0ZXJhbHMnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gd2hpbGUgKGN1cnJlbnRDb2RlICE9IGRlbGltaXRlcik7CiAgICBwb3NpdGlvbisrOwogICAgcmV0dXJuIHNyYy5zdWJzdHJpbmcobGFzdFBvc2l0aW9uLCBwb3NpdGlvbik7CiAgfQoKICB2b2lkIGdldFRva2VuKCkgewogICAgc2tpcHBlZE5ld2xpbmUgPSBmYWxzZTsKICAgIGZvciAoOzspIHsKICAgICAgaWYgKHBvc2l0aW9uID49IHNyYy5sZW5ndGgpIGJyZWFrOwogICAgICBpbnQgY29kZSA9IHNyYy5jb2RlVW5pdEF0KHBvc2l0aW9uKTsKICAgICAgLy8gIFNraXAgJy8vJyBhbmQgJy8qJyBzdHlsZSBjb21tZW50cy4KICAgICAgaWYgKGNvZGUgPT0gY2hhckNvZGVzLiRTTEFTSCAmJiBwb3NpdGlvbiArIDEgPCBzcmMubGVuZ3RoKSB7CiAgICAgICAgaWYgKHNyYy5jb2RlVW5pdEF0KHBvc2l0aW9uICsgMSkgPT0gY2hhckNvZGVzLiRTTEFTSCkgewogICAgICAgICAgaW50IG5leHRQb3NpdGlvbiA9IHNyYy5pbmRleE9mKCdcbicsIHBvc2l0aW9uKTsKICAgICAgICAgIGlmIChuZXh0UG9zaXRpb24gPT0gLTEpIG5leHRQb3NpdGlvbiA9IHNyYy5sZW5ndGg7CiAgICAgICAgICBwb3NpdGlvbiA9IG5leHRQb3NpdGlvbjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSBpZiAoc3JjLmNvZGVVbml0QXQocG9zaXRpb24gKyAxKSA9PSBjaGFyQ29kZXMuJFNUQVIpIHsKICAgICAgICAgIGludCBuZXh0UG9zaXRpb24gPSBzcmMuaW5kZXhPZignKi8nLCBwb3NpdGlvbiArIDIpOwogICAgICAgICAgaWYgKG5leHRQb3NpdGlvbiA9PSAtMSkgZXJyb3IoJ1VudGVybWluYXRlZCBjb21tZW50Jyk7CiAgICAgICAgICBwb3NpdGlvbiA9IG5leHRQb3NpdGlvbiArIDI7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNhdGVnb3J5KGNvZGUpICE9IFdISVRFU1BBQ0UpIGJyZWFrOwogICAgICBpZiAoY29kZSA9PSBjaGFyQ29kZXMuJExGKSBza2lwcGVkTmV3bGluZSA9IHRydWU7CiAgICAgICsrcG9zaXRpb247CiAgICB9CgogICAgaWYgKHBvc2l0aW9uID09IHNyYy5sZW5ndGgpIHsKICAgICAgbGFzdENhdGVnb3J5ID0gTk9ORTsKICAgICAgbGFzdFRva2VuID0gbnVsbDsKICAgICAgbGFzdFBvc2l0aW9uID0gcG9zaXRpb247CiAgICAgIHJldHVybjsKICAgIH0KICAgIGludCBjb2RlID0gc3JjLmNvZGVVbml0QXQocG9zaXRpb24pOwogICAgbGFzdFBvc2l0aW9uID0gcG9zaXRpb247CiAgICBpZiAoY29kZSA9PSBjaGFyQ29kZXMuJFNRIHx8IGNvZGUgPT0gY2hhckNvZGVzLiREUSkgewogICAgICAvLyBTdHJpbmcgbGl0ZXJhbC4KICAgICAgbGFzdENhdGVnb3J5ID0gU1RSSU5HOwogICAgICBsYXN0VG9rZW4gPSBnZXREZWxpbWl0ZWQocG9zaXRpb24pOwogICAgfSBlbHNlIGlmIChjb2RlID09IGNoYXJDb2Rlcy4kMCAmJgogICAgICAgIHBvc2l0aW9uICsgMiA8IHNyYy5sZW5ndGggJiYKICAgICAgICBzcmMuY29kZVVuaXRBdChwb3NpdGlvbiArIDEpID09IGNoYXJDb2Rlcy4keCkgewogICAgICAvLyBIZXggbGl0ZXJhbC4KICAgICAgZm9yIChwb3NpdGlvbiArPSAyOyBwb3NpdGlvbiA8IHNyYy5sZW5ndGg7IHBvc2l0aW9uKyspIHsKICAgICAgICBpbnQgY2F0ID0gY2F0ZWdvcnkoc3JjLmNvZGVVbml0QXQocG9zaXRpb24pKTsKICAgICAgICBpZiAoY2F0ICE9IE5VTUVSSUMgJiYgY2F0ICE9IEFMUEhBKSBicmVhazsKICAgICAgfQogICAgICBsYXN0Q2F0ZWdvcnkgPSBOVU1FUklDOwogICAgICBsYXN0VG9rZW4gPSBzcmMuc3Vic3RyaW5nKGxhc3RQb3NpdGlvbiwgcG9zaXRpb24pOwogICAgICBpZiAoaW50LnRyeVBhcnNlKGxhc3RUb2tlbikgPT0gbnVsbCkgewogICAgICAgIGVycm9yKCJVbnBhcnNlYWJsZSBudW1iZXIiKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjb2RlID09IGNoYXJDb2Rlcy4kU0xBU0gpIHsKICAgICAgLy8gVG9rZW5zIHRoYXQgc3RhcnQgd2l0aCAvIGFyZSBzcGVjaWFsIGR1ZSB0byByZWdleHAgbGl0ZXJhbHMuCiAgICAgIGxhc3RDYXRlZ29yeSA9IFNZTUJPTDsKICAgICAgcG9zaXRpb24rKzsKICAgICAgaWYgKHBvc2l0aW9uIDwgc3JjLmxlbmd0aCAmJiBzcmMuY29kZVVuaXRBdChwb3NpdGlvbikgPT0gY2hhckNvZGVzLiRFUSkgewogICAgICAgIHBvc2l0aW9uKys7CiAgICAgIH0KICAgICAgbGFzdFRva2VuID0gc3JjLnN1YnN0cmluZyhsYXN0UG9zaXRpb24sIHBvc2l0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEFsbCBvdGhlciB0b2tlbnMgaGFuZGxlZCBoZXJlLgogICAgICBpbnQgY2F0ID0gY2F0ZWdvcnkoc3JjLmNvZGVVbml0QXQocG9zaXRpb24pKTsKICAgICAgaW50IG5ld0NhdDsKICAgICAgZG8gewogICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgaWYgKHBvc2l0aW9uID09IHNyYy5sZW5ndGgpIGJyZWFrOwogICAgICAgIGludCBjb2RlID0gc3JjLmNvZGVVbml0QXQocG9zaXRpb24pOwogICAgICAgIC8vIFNwZWNpYWwgY29kZSB0byBkaXNhbGxvdyAhLCB+IGFuZCAvIGluIG5vbi1maXJzdCBwb3NpdGlvbiBpbiB0b2tlbiwKICAgICAgICAvLyBzbyB0aGF0ICEhIGFuZCB+fiBwYXJzZSBhcyB0d28gdG9rZW5zIGFuZCAhPSBwYXJzZXMgYXMgb25lLCB3aGlsZSA9LwogICAgICAgIC8vIHBhcnNlcyBhcyBhIGFuIGVxdWFscyB0b2tlbiBmb2xsb3dlZCBieSBhIHJlZ2V4cCBsaXRlcmFsIHN0YXJ0LgogICAgICAgIG5ld0NhdCA9IChjb2RlID09IGNoYXJDb2Rlcy4kQkFORyB8fAogICAgICAgICAgICAgICAgY29kZSA9PSBjaGFyQ29kZXMuJFNMQVNIIHx8CiAgICAgICAgICAgICAgICBjb2RlID09IGNoYXJDb2Rlcy4kVElMREUpCiAgICAgICAgICAgID8gTk9ORQogICAgICAgICAgICA6IGNhdGVnb3J5KGNvZGUpOwogICAgICB9IHdoaWxlICghc2luZ2xlQ2hhckNhdGVnb3J5KGNhdCkgJiYKICAgICAgICAgIChjYXQgPT0gbmV3Q2F0IHx8CiAgICAgICAgICAgICAgKGNhdCA9PSBBTFBIQSAmJiBuZXdDYXQgPT0gTlVNRVJJQykgfHwgLy8gZWcuIGxldmVsNDIuCiAgICAgICAgICAgICAgKGNhdCA9PSBOVU1FUklDICYmIG5ld0NhdCA9PSBET1QpKSk7IC8vIGVnLiAzLjE0MTUKICAgICAgbGFzdENhdGVnb3J5ID0gY2F0OwogICAgICBsYXN0VG9rZW4gPSBzcmMuc3Vic3RyaW5nKGxhc3RQb3NpdGlvbiwgcG9zaXRpb24pOwogICAgICBpZiAoY2F0ID09IE5VTUVSSUMpIHsKICAgICAgICBpZiAoZG91YmxlLnRyeVBhcnNlKGxhc3RUb2tlbikgPT0gbnVsbCkgewogICAgICAgICAgZXJyb3IoIlVucGFyc2VhYmxlIG51bWJlciIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjYXQgPT0gU1lNQk9MKSB7CiAgICAgICAgaW50IGJpbmFyeVByZWNlbmRlbmNlID0gQklOQVJZX1BSRUNFREVOQ0VbbGFzdFRva2VuXTsKICAgICAgICBpZiAoYmluYXJ5UHJlY2VuZGVuY2UgPT0gbnVsbCAmJiAhVU5BUllfT1BFUkFUT1JTLmNvbnRhaW5zKGxhc3RUb2tlbikpIHsKICAgICAgICAgIGVycm9yKCJVbmtub3duIG9wZXJhdG9yIik7CiAgICAgICAgfQogICAgICAgIGlmIChpc0Fzc2lnbm1lbnQobGFzdFRva2VuKSkgbGFzdENhdGVnb3J5ID0gQVNTSUdOTUVOVDsKICAgICAgfSBlbHNlIGlmIChjYXQgPT0gQUxQSEEpIHsKICAgICAgICBpZiAoT1BFUkFUT1JTX1RIQVRfTE9PS19MSUtFX0lERU5USUZJRVJTLmNvbnRhaW5zKGxhc3RUb2tlbikpIHsKICAgICAgICAgIGxhc3RDYXRlZ29yeSA9IFNZTUJPTDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgZXhwZWN0Q2F0ZWdvcnkoaW50IGNhdCkgewogICAgaWYgKGNhdCAhPSBsYXN0Q2F0ZWdvcnkpIGVycm9yKCJFeHBlY3RlZCAke2NhdGVnb3J5VG9TdHJpbmcoY2F0KX0iKTsKICAgIGdldFRva2VuKCk7CiAgfQoKICBib29sIGFjY2VwdENhdGVnb3J5KGludCBjYXQpIHsKICAgIGlmIChjYXQgPT0gbGFzdENhdGVnb3J5KSB7CiAgICAgIGdldFRva2VuKCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBleHBlY3RTZW1pY29sb24oKSB7CiAgICBpZiAoYWNjZXB0U2VtaWNvbG9uKCkpIHJldHVybjsKICAgIGVycm9yKCdFeHBlY3RlZCBTRU1JQ09MT04nKTsKICB9CgogIGJvb2wgYWNjZXB0U2VtaWNvbG9uKCkgewogICAgLy8gQWNjZXB0IHNlbWljb2xvbiBvciBhdXRvbWF0aWNhbGx5IGluc2VydGVkIHNlbWljb2xvbiBiZWZvcmUgY2xvc2UgYnJhY2UuCiAgICAvLyBNaW5pcGFyc2VyIGZvcmJpZHMgb3RoZXIga2luZHMgb2Ygc2VtaWNvbG9uIGluc2VydGlvbi4KICAgIGlmIChSQlJBQ0UgPT0gbGFzdENhdGVnb3J5KSByZXR1cm4gdHJ1ZTsKICAgIGlmIChOT05FID09IGxhc3RDYXRlZ29yeSkgcmV0dXJuIHRydWU7IC8vIGVuZCBvZiBpbnB1dAogICAgaWYgKHNraXBwZWROZXdsaW5lKSB7CiAgICAgIGVycm9yKCdObyBhdXRvbWF0aWMgc2VtaWNvbG9uIGluc2VydGlvbiBhdCBwcmVjZWRpbmcgbmV3bGluZScpOwogICAgfQogICAgcmV0dXJuIGFjY2VwdENhdGVnb3J5KFNFTUlDT0xPTik7CiAgfQoKICBib29sIGFjY2VwdFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CiAgICBpZiAobGFzdFRva2VuID09IHN0cmluZykgewogICAgICBnZXRUb2tlbigpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgZXJyb3IobWVzc2FnZSkgewogICAgdGhyb3cgbmV3IE1pbmlKc1BhcnNlckVycm9yKHRoaXMsIG1lc3NhZ2UpOwogIH0KCiAgLy8vIFJldHVybnMgZWl0aGVyIHRoZSBuYW1lIGZvciB0aGUgaG9sZSwgb3IgaXRzIGludGVnZXIgcG9zaXRpb24uCiAgcGFyc2VIYXNoKCkgewogICAgU3RyaW5nIGhvbGVOYW1lID0gbGFzdFRva2VuOwogICAgaWYgKGFjY2VwdENhdGVnb3J5KEFMUEhBKSkgewogICAgICAvLyBOYW1lZCBob2xlLiBFeGFtcGxlOiAnZnVuY3Rpb24gI2Z1bk5hbWUoKSB7IC4uLiB9JwogICAgICBpZiAoaGFzUG9zaXRpb25hbEhvbGVzKSB7CiAgICAgICAgZXJyb3IoJ0hvbGVzIG11c3QgYWxsIGJlIHBvc2l0aW9uYWwgb3IgbmFtZWQuICRob2xlTmFtZScpOwogICAgICB9CiAgICAgIHJldHVybiBob2xlTmFtZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChoYXNOYW1lZEhvbGVzKSB7CiAgICAgICAgZXJyb3IoJ0hvbGVzIG11c3QgYWxsIGJlIHBvc2l0aW9uYWwgb3IgbmFtZWQuICRob2xlTmFtZScpOwogICAgICB9CiAgICAgIGludCBwb3NpdGlvbiA9IGludGVycG9sYXRlZFZhbHVlcy5sZW5ndGg7CiAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgIH0KICB9CgogIEV4cHJlc3Npb24gcGFyc2VQcmltYXJ5KCkgewogICAgU3RyaW5nIGxhc3QgPSBsYXN0VG9rZW47CiAgICBpZiAoYWNjZXB0Q2F0ZWdvcnkoQUxQSEEpKSB7CiAgICAgIGlmIChsYXN0ID09ICJ0cnVlIikgewogICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbEJvb2wodHJ1ZSk7CiAgICAgIH0gZWxzZSBpZiAobGFzdCA9PSAiZmFsc2UiKSB7CiAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsQm9vbChmYWxzZSk7CiAgICAgIH0gZWxzZSBpZiAobGFzdCA9PSAibnVsbCIpIHsKICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxOdWxsKCk7CiAgICAgIH0gZWxzZSBpZiAobGFzdCA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlRnVuY3Rpb25FeHByZXNzaW9uKCk7CiAgICAgIH0gZWxzZSBpZiAobGFzdCA9PSAidGhpcyIpIHsKICAgICAgICByZXR1cm4gbmV3IFRoaXMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IFZhcmlhYmxlVXNlKGxhc3QpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGFjY2VwdENhdGVnb3J5KExQQVJFTikpIHsKICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcGFyc2VFeHByZXNzaW9uKCk7CiAgICAgIGV4cGVjdENhdGVnb3J5KFJQQVJFTik7CiAgICAgIHJldHVybiBleHByZXNzaW9uOwogICAgfSBlbHNlIGlmIChhY2NlcHRDYXRlZ29yeShTVFJJTkcpKSB7CiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFN0cmluZyhsYXN0KTsKICAgIH0gZWxzZSBpZiAoYWNjZXB0Q2F0ZWdvcnkoTlVNRVJJQykpIHsKICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsTnVtYmVyKGxhc3QpOwogICAgfSBlbHNlIGlmIChhY2NlcHRDYXRlZ29yeShMQlJBQ0UpKSB7CiAgICAgIHJldHVybiBwYXJzZU9iamVjdEluaXRpYWxpemVyKCk7CiAgICB9IGVsc2UgaWYgKGFjY2VwdENhdGVnb3J5KExTUVVBUkUpKSB7CiAgICAgIHZhciB2YWx1ZXMgPSA8RXhwcmVzc2lvbj5bXTsKCiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKGFjY2VwdENhdGVnb3J5KENPTU1BKSkgewogICAgICAgICAgdmFsdWVzLmFkZChuZXcgQXJyYXlIb2xlKCkpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChhY2NlcHRDYXRlZ29yeShSU1FVQVJFKSkgYnJlYWs7CiAgICAgICAgdmFsdWVzLmFkZChwYXJzZUFzc2lnbm1lbnQoKSk7CiAgICAgICAgaWYgKGFjY2VwdENhdGVnb3J5KFJTUVVBUkUpKSBicmVhazsKICAgICAgICBleHBlY3RDYXRlZ29yeShDT01NQSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBBcnJheUluaXRpYWxpemVyKHZhbHVlcyk7CiAgICB9IGVsc2UgaWYgKGxhc3QgIT0gbnVsbCAmJiBsYXN0LnN0YXJ0c1dpdGgoIi8iKSkgewogICAgICBTdHJpbmcgcmVnZXhwID0gZ2V0RGVsaW1pdGVkKGxhc3RQb3NpdGlvbik7CiAgICAgIGdldFRva2VuKCk7CiAgICAgIFN0cmluZyBmbGFncyA9IGxhc3RUb2tlbjsKICAgICAgaWYgKCFhY2NlcHRDYXRlZ29yeShBTFBIQSkpIGZsYWdzID0gIiI7CiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG5ldyBSZWdFeHBMaXRlcmFsKHJlZ2V4cCArIGZsYWdzKTsKICAgICAgcmV0dXJuIGV4cHJlc3Npb247CiAgICB9IGVsc2UgaWYgKGFjY2VwdENhdGVnb3J5KEhBU0gpKSB7CiAgICAgIHZhciBuYW1lT3JQb3NpdGlvbiA9IHBhcnNlSGFzaCgpOwogICAgICBJbnRlcnBvbGF0ZWRFeHByZXNzaW9uIGV4cHJlc3Npb24gPQogICAgICAgICAgbmV3IEludGVycG9sYXRlZEV4cHJlc3Npb24obmFtZU9yUG9zaXRpb24pOwogICAgICBpbnRlcnBvbGF0ZWRWYWx1ZXMuYWRkKGV4cHJlc3Npb24pOwogICAgICByZXR1cm4gZXhwcmVzc2lvbjsKICAgIH0gZWxzZSB7CiAgICAgIGVycm9yKCJFeHBlY3RlZCBwcmltYXJ5IGV4cHJlc3Npb24iKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBFeHByZXNzaW9uIHBhcnNlRnVuY3Rpb25FeHByZXNzaW9uKCkgewogICAgaWYgKGxhc3RDYXRlZ29yeSA9PSBBTFBIQSB8fCBsYXN0Q2F0ZWdvcnkgPT0gSEFTSCkgewogICAgICBEZWNsYXJhdGlvbiBuYW1lID0gcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uKCk7CiAgICAgIHJldHVybiBuZXcgTmFtZWRGdW5jdGlvbihuYW1lLCBwYXJzZUZ1bigpKTsKICAgIH0KICAgIHJldHVybiBwYXJzZUZ1bigpOwogIH0KCiAgRXhwcmVzc2lvbiBwYXJzZUZ1bigpIHsKICAgIExpc3Q8UGFyYW1ldGVyPiBwYXJhbXMgPSA8UGFyYW1ldGVyPltdOwoKICAgIGV4cGVjdENhdGVnb3J5KExQQVJFTik7CiAgICBpZiAoIWFjY2VwdENhdGVnb3J5KFJQQVJFTikpIHsKICAgICAgZm9yICg7OykgewogICAgICAgIGlmIChhY2NlcHRDYXRlZ29yeShIQVNIKSkgewogICAgICAgICAgdmFyIG5hbWVPclBvc2l0aW9uID0gcGFyc2VIYXNoKCk7CiAgICAgICAgICBJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIgcGFyYW1ldGVyID0KICAgICAgICAgICAgICBuZXcgSW50ZXJwb2xhdGVkUGFyYW1ldGVyKG5hbWVPclBvc2l0aW9uKTsKICAgICAgICAgIGludGVycG9sYXRlZFZhbHVlcy5hZGQocGFyYW1ldGVyKTsKICAgICAgICAgIHBhcmFtcy5hZGQocGFyYW1ldGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgU3RyaW5nIGFyZ3VtZW50TmFtZSA9IGxhc3RUb2tlbjsKICAgICAgICAgIGV4cGVjdENhdGVnb3J5KEFMUEhBKTsKICAgICAgICAgIHBhcmFtcy5hZGQobmV3IFBhcmFtZXRlcihhcmd1bWVudE5hbWUpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGFjY2VwdENhdGVnb3J5KENPTU1BKSkgY29udGludWU7CiAgICAgICAgZXhwZWN0Q2F0ZWdvcnkoUlBBUkVOKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgQXN5bmNNb2RpZmllciBhc3luY01vZGlmaWVyOwogICAgaWYgKGFjY2VwdFN0cmluZygnYXN5bmMnKSkgewogICAgICBpZiAoYWNjZXB0U3RyaW5nKCcqJykpIHsKICAgICAgICBhc3luY01vZGlmaWVyID0gQXN5bmNNb2RpZmllci5hc3luY1N0YXI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXN5bmNNb2RpZmllciA9IEFzeW5jTW9kaWZpZXIuYXN5bmM7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYWNjZXB0U3RyaW5nKCdzeW5jJykpIHsKICAgICAgaWYgKCFhY2NlcHRTdHJpbmcoJyonKSkgZXJyb3IoIk9ubHkgc3luYyogaXMgdmFsaWQgLSBzeW5jIGlzIGltcGxpZWQiKTsKICAgICAgYXN5bmNNb2RpZmllciA9IEFzeW5jTW9kaWZpZXIuc3luY1N0YXI7CiAgICB9IGVsc2UgewogICAgICBhc3luY01vZGlmaWVyID0gQXN5bmNNb2RpZmllci5zeW5jOwogICAgfQogICAgZXhwZWN0Q2F0ZWdvcnkoTEJSQUNFKTsKICAgIEJsb2NrIGJsb2NrID0gcGFyc2VCbG9jaygpOwogICAgcmV0dXJuIG5ldyBGdW4ocGFyYW1zLCBibG9jaywgYXN5bmNNb2RpZmllcjogYXN5bmNNb2RpZmllcik7CiAgfQoKICBFeHByZXNzaW9uIHBhcnNlT2JqZWN0SW5pdGlhbGl6ZXIoKSB7CiAgICBMaXN0PFByb3BlcnR5PiBwcm9wZXJ0aWVzID0gPFByb3BlcnR5PltdOwogICAgZm9yICg7OykgewogICAgICBpZiAoYWNjZXB0Q2F0ZWdvcnkoUkJSQUNFKSkgYnJlYWs7CiAgICAgIC8vIExpbWl0ZWQgc3Vic2V0OiBrZXlzIGFyZSBpZGVudGlmaWVycywgbm8gJ2dldCcgb3IgJ3NldCcgcHJvcGVydGllcy4KICAgICAgTGl0ZXJhbCBwcm9wZXJ0eU5hbWU7CiAgICAgIFN0cmluZyBpZGVudGlmaWVyID0gbGFzdFRva2VuOwogICAgICBpZiAoYWNjZXB0Q2F0ZWdvcnkoQUxQSEEpKSB7CiAgICAgICAgcHJvcGVydHlOYW1lID0gbmV3IExpdGVyYWxTdHJpbmcoJyIkaWRlbnRpZmllciInKTsKICAgICAgfSBlbHNlIGlmIChhY2NlcHRDYXRlZ29yeShTVFJJTkcpKSB7CiAgICAgICAgcHJvcGVydHlOYW1lID0gbmV3IExpdGVyYWxTdHJpbmcoaWRlbnRpZmllcik7CiAgICAgIH0gZWxzZSBpZiAoYWNjZXB0Q2F0ZWdvcnkoU1lNQk9MKSkgewogICAgICAgIC8vIGUuZy4gdm9pZAogICAgICAgIHByb3BlcnR5TmFtZSA9IG5ldyBMaXRlcmFsU3RyaW5nKCciJGlkZW50aWZpZXIiJyk7CiAgICAgIH0gZWxzZSBpZiAoYWNjZXB0Q2F0ZWdvcnkoSEFTSCkpIHsKICAgICAgICB2YXIgbmFtZU9yUG9zaXRpb24gPSBwYXJzZUhhc2goKTsKICAgICAgICBJbnRlcnBvbGF0ZWRMaXRlcmFsIGludGVycG9sYXRlZExpdGVyYWwgPQogICAgICAgICAgICBuZXcgSW50ZXJwb2xhdGVkTGl0ZXJhbChuYW1lT3JQb3NpdGlvbik7CiAgICAgICAgaW50ZXJwb2xhdGVkVmFsdWVzLmFkZChpbnRlcnBvbGF0ZWRMaXRlcmFsKTsKICAgICAgICBwcm9wZXJ0eU5hbWUgPSBpbnRlcnBvbGF0ZWRMaXRlcmFsOwogICAgICB9IGVsc2UgewogICAgICAgIGVycm9yKCdFeHBlY3RlZCBwcm9wZXJ0eSBuYW1lJyk7CiAgICAgIH0KICAgICAgZXhwZWN0Q2F0ZWdvcnkoQ09MT04pOwogICAgICBFeHByZXNzaW9uIHZhbHVlID0gcGFyc2VBc3NpZ25tZW50KCk7CiAgICAgIHByb3BlcnRpZXMuYWRkKG5ldyBQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKSk7CiAgICAgIGlmIChhY2NlcHRDYXRlZ29yeShSQlJBQ0UpKSBicmVhazsKICAgICAgZXhwZWN0Q2F0ZWdvcnkoQ09NTUEpOwogICAgfQogICAgcmV0dXJuIG5ldyBPYmplY3RJbml0aWFsaXplcihwcm9wZXJ0aWVzKTsKICB9CgogIEV4cHJlc3Npb24gcGFyc2VNZW1iZXIoKSB7CiAgICBFeHByZXNzaW9uIHJlY2VpdmVyID0gcGFyc2VQcmltYXJ5KCk7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoYWNjZXB0Q2F0ZWdvcnkoRE9UKSkgewogICAgICAgIHJlY2VpdmVyID0gZ2V0RG90UmhzKHJlY2VpdmVyKTsKICAgICAgfSBlbHNlIGlmIChhY2NlcHRDYXRlZ29yeShMU1FVQVJFKSkgewogICAgICAgIEV4cHJlc3Npb24gaW5CcmFjZXMgPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgICAgICBleHBlY3RDYXRlZ29yeShSU1FVQVJFKTsKICAgICAgICByZWNlaXZlciA9IG5ldyBQcm9wZXJ0eUFjY2VzcyhyZWNlaXZlciwgaW5CcmFjZXMpOwogICAgICB9IGVsc2UgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVjZWl2ZXI7CiAgfQoKICBFeHByZXNzaW9uIHBhcnNlQ2FsbCgpIHsKICAgIGJvb2wgY29uc3RydWN0b3IgPSBhY2NlcHRTdHJpbmcoIm5ldyIpOwogICAgRXhwcmVzc2lvbiByZWNlaXZlciA9IHBhcnNlTWVtYmVyKCk7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoYWNjZXB0Q2F0ZWdvcnkoTFBBUkVOKSkgewogICAgICAgIGZpbmFsIGFyZ3VtZW50cyA9IDxFeHByZXNzaW9uPltdOwogICAgICAgIGlmICghYWNjZXB0Q2F0ZWdvcnkoUlBBUkVOKSkgewogICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgRXhwcmVzc2lvbiBhcmd1bWVudCA9IHBhcnNlQXNzaWdubWVudCgpOwogICAgICAgICAgICBhcmd1bWVudHMuYWRkKGFyZ3VtZW50KTsKICAgICAgICAgICAgaWYgKGFjY2VwdENhdGVnb3J5KFJQQVJFTikpIGJyZWFrOwogICAgICAgICAgICBleHBlY3RDYXRlZ29yeShDT01NQSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJlY2VpdmVyID0gY29uc3RydWN0b3IKICAgICAgICAgICAgPyBuZXcgTmV3KHJlY2VpdmVyLCBhcmd1bWVudHMpCiAgICAgICAgICAgIDogbmV3IENhbGwocmVjZWl2ZXIsIGFyZ3VtZW50cyk7CiAgICAgICAgY29uc3RydWN0b3IgPSBmYWxzZTsKICAgICAgfSBlbHNlIGlmICghY29uc3RydWN0b3IgJiYgYWNjZXB0Q2F0ZWdvcnkoTFNRVUFSRSkpIHsKICAgICAgICBFeHByZXNzaW9uIGluQnJhY2VzID0gcGFyc2VFeHByZXNzaW9uKCk7CiAgICAgICAgZXhwZWN0Q2F0ZWdvcnkoUlNRVUFSRSk7CiAgICAgICAgcmVjZWl2ZXIgPSBuZXcgUHJvcGVydHlBY2Nlc3MocmVjZWl2ZXIsIGluQnJhY2VzKTsKICAgICAgfSBlbHNlIGlmICghY29uc3RydWN0b3IgJiYgYWNjZXB0Q2F0ZWdvcnkoRE9UKSkgewogICAgICAgIHJlY2VpdmVyID0gZ2V0RG90UmhzKHJlY2VpdmVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBKUyBhbGxvd3MgbmV3IHdpdGhvdXQgKCksIGJ1dCB3ZSBkb24ndC4KICAgICAgICBpZiAoY29uc3RydWN0b3IpIGVycm9yKCJQYXJlbnRoZXNlcyBhcmUgcmVxdWlyZWQgZm9yIG5ldyIpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVjZWl2ZXI7CiAgfQoKICBFeHByZXNzaW9uIGdldERvdFJocyhFeHByZXNzaW9uIHJlY2VpdmVyKSB7CiAgICBpZiAoYWNjZXB0Q2F0ZWdvcnkoSEFTSCkpIHsKICAgICAgdmFyIG5hbWVPclBvc2l0aW9uID0gcGFyc2VIYXNoKCk7CiAgICAgIEludGVycG9sYXRlZFNlbGVjdG9yIHByb3BlcnR5ID0gbmV3IEludGVycG9sYXRlZFNlbGVjdG9yKG5hbWVPclBvc2l0aW9uKTsKICAgICAgaW50ZXJwb2xhdGVkVmFsdWVzLmFkZChwcm9wZXJ0eSk7CiAgICAgIHJldHVybiBuZXcgUHJvcGVydHlBY2Nlc3MocmVjZWl2ZXIsIHByb3BlcnR5KTsKICAgIH0KICAgIFN0cmluZyBpZGVudGlmaWVyID0gbGFzdFRva2VuOwogICAgLy8gSW4gRVM1IGtleXdvcmRzIGxpa2UgZGVsZXRlIGFuZCBjb250aW51ZSBhcmUgYWxsb3dlZCBhcyBwcm9wZXJ0eQogICAgLy8gbmFtZXMsIGFuZCB0aGUgSW5kZXhlZERCIEFQSSB1c2VzIHRoYXQsIHNvIHdlIG5lZWQgdG8gYWxsb3cgaXQgaGVyZS4KICAgIGlmIChhY2NlcHRDYXRlZ29yeShTWU1CT0wpKSB7CiAgICAgIGlmICghT1BFUkFUT1JTX1RIQVRfTE9PS19MSUtFX0lERU5USUZJRVJTLmNvbnRhaW5zKGlkZW50aWZpZXIpKSB7CiAgICAgICAgZXJyb3IoIkV4cGVjdGVkIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGV4cGVjdENhdGVnb3J5KEFMUEhBKTsKICAgIH0KICAgIHJldHVybiBuZXcgUHJvcGVydHlBY2Nlc3MuZmllbGQocmVjZWl2ZXIsIGlkZW50aWZpZXIpOwogIH0KCiAgRXhwcmVzc2lvbiBwYXJzZVBvc3RmaXgoKSB7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwYXJzZUNhbGwoKTsKICAgIFN0cmluZyBvcGVyYXRvciA9IGxhc3RUb2tlbjsKICAgIC8vIEphdmFTY3JpcHQgZ3JhbW1hciBpczoKICAgIC8vICAgICBMZWZ0SGFuZFNpZGVFeHByZXNzaW9uIFtubyBMaW5lVGVybWluYXRvciBoZXJlXSArKwogICAgaWYgKGxhc3RDYXRlZ29yeSA9PSBTWU1CT0wgJiYKICAgICAgICAhc2tpcHBlZE5ld2xpbmUgJiYKICAgICAgICAoYWNjZXB0U3RyaW5nKCIrKyIpIHx8IGFjY2VwdFN0cmluZygiLS0iKSkpIHsKICAgICAgcmV0dXJuIG5ldyBQb3N0Zml4KG9wZXJhdG9yLCBleHByZXNzaW9uKTsKICAgIH0KICAgIC8vIElmIHdlIGRvbid0IGFjY2VwdCAnKysnIG9yICctLScgZHVlIHRvIHNraXBwZWROZXdsaW5lIGEgbmV3bGluZSwgbm8gb3RoZXIKICAgIC8vIHBhcnQgb2YgdGhlIHBhcnNlciB3aWxsIGFjY2VwdCB0aGUgdG9rZW4gYW5kIHdlIHdpbGwgZ2V0IGFuIGVycm9yIGF0IHRoZQogICAgLy8gd2hvbGUgZXhwcmVzc2lvbiBsZXZlbC4KICAgIHJldHVybiBleHByZXNzaW9uOwogIH0KCiAgRXhwcmVzc2lvbiBwYXJzZVVuYXJ5SGlnaCgpIHsKICAgIFN0cmluZyBvcGVyYXRvciA9IGxhc3RUb2tlbjsKICAgIGlmIChsYXN0Q2F0ZWdvcnkgPT0gU1lNQk9MICYmCiAgICAgICAgVU5BUllfT1BFUkFUT1JTLmNvbnRhaW5zKG9wZXJhdG9yKSAmJgogICAgICAgIChhY2NlcHRTdHJpbmcoIisrIikgfHwgYWNjZXB0U3RyaW5nKCItLSIpIHx8IGFjY2VwdFN0cmluZygnYXdhaXQnKSkpIHsKICAgICAgaWYgKG9wZXJhdG9yID09ICJhd2FpdCIpIHJldHVybiBuZXcgQXdhaXQocGFyc2VQb3N0Zml4KCkpOwogICAgICByZXR1cm4gbmV3IFByZWZpeChvcGVyYXRvciwgcGFyc2VQb3N0Zml4KCkpOwogICAgfQogICAgcmV0dXJuIHBhcnNlUG9zdGZpeCgpOwogIH0KCiAgRXhwcmVzc2lvbiBwYXJzZVVuYXJ5TG93KCkgewogICAgU3RyaW5nIG9wZXJhdG9yID0gbGFzdFRva2VuOwogICAgaWYgKGxhc3RDYXRlZ29yeSA9PSBTWU1CT0wgJiYKICAgICAgICBVTkFSWV9PUEVSQVRPUlMuY29udGFpbnMob3BlcmF0b3IpICYmCiAgICAgICAgb3BlcmF0b3IgIT0gIisrIiAmJgogICAgICAgIG9wZXJhdG9yICE9ICItLSIpIHsKICAgICAgZXhwZWN0Q2F0ZWdvcnkoU1lNQk9MKTsKICAgICAgaWYgKG9wZXJhdG9yID09ICJhd2FpdCIpIHJldHVybiBuZXcgQXdhaXQocGFyc2VQb3N0Zml4KCkpOwogICAgICByZXR1cm4gbmV3IFByZWZpeChvcGVyYXRvciwgcGFyc2VVbmFyeUxvdygpKTsKICAgIH0KICAgIHJldHVybiBwYXJzZVVuYXJ5SGlnaCgpOwogIH0KCiAgRXhwcmVzc2lvbiBwYXJzZUJpbmFyeShpbnQgbWF4UHJlY2VkZW5jZSkgewogICAgRXhwcmVzc2lvbiBsaHMgPSBwYXJzZVVuYXJ5TG93KCk7CiAgICBpbnQgbWluUHJlY2VkZW5jZTsKICAgIFN0cmluZyBsYXN0U3ltYm9sOwogICAgRXhwcmVzc2lvbiByaHM7IC8vIFRoaXMgaXMgbnVsbCBmaXJzdCB0aW1lIGFyb3VuZC4KICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFN0cmluZyBzeW1ib2wgPSBsYXN0VG9rZW47CiAgICAgIGlmIChsYXN0Q2F0ZWdvcnkgIT0gU1lNQk9MIHx8CiAgICAgICAgICAhQklOQVJZX1BSRUNFREVOQ0UuY29udGFpbnNLZXkoc3ltYm9sKSB8fAogICAgICAgICAgQklOQVJZX1BSRUNFREVOQ0Vbc3ltYm9sXSA+IG1heFByZWNlZGVuY2UpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBleHBlY3RDYXRlZ29yeShTWU1CT0wpOwogICAgICBpZiAocmhzID09IG51bGwgfHwgQklOQVJZX1BSRUNFREVOQ0Vbc3ltYm9sXSA+PSBtaW5QcmVjZWRlbmNlKSB7CiAgICAgICAgaWYgKHJocyAhPSBudWxsKSBsaHMgPSBuZXcgQmluYXJ5KGxhc3RTeW1ib2wsIGxocywgcmhzKTsKICAgICAgICBtaW5QcmVjZWRlbmNlID0gQklOQVJZX1BSRUNFREVOQ0Vbc3ltYm9sXTsKICAgICAgICByaHMgPSBwYXJzZVVuYXJ5TG93KCk7CiAgICAgICAgbGFzdFN5bWJvbCA9IHN5bWJvbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBFeHByZXNzaW9uIGhpZ2hlciA9IHBhcnNlQmluYXJ5KEJJTkFSWV9QUkVDRURFTkNFW3N5bWJvbF0pOwogICAgICAgIHJocyA9IG5ldyBCaW5hcnkoc3ltYm9sLCByaHMsIGhpZ2hlcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChyaHMgPT0gbnVsbCkgcmV0dXJuIGxoczsKICAgIHJldHVybiBuZXcgQmluYXJ5KGxhc3RTeW1ib2wsIGxocywgcmhzKTsKICB9CgogIEV4cHJlc3Npb24gcGFyc2VDb25kaXRpb25hbCgpIHsKICAgIEV4cHJlc3Npb24gbGhzID0gcGFyc2VCaW5hcnkoSElHSEVTVF9QQVJTRV9CSU5BUllfUFJFQ0VERU5DRSk7CiAgICBpZiAoIWFjY2VwdENhdGVnb3J5KFFVRVJZKSkgcmV0dXJuIGxoczsKICAgIEV4cHJlc3Npb24gaWZUcnVlID0gcGFyc2VBc3NpZ25tZW50KCk7CiAgICBleHBlY3RDYXRlZ29yeShDT0xPTik7CiAgICBFeHByZXNzaW9uIGlmRmFsc2UgPSBwYXJzZUFzc2lnbm1lbnQoKTsKICAgIHJldHVybiBuZXcgQ29uZGl0aW9uYWwobGhzLCBpZlRydWUsIGlmRmFsc2UpOwogIH0KCiAgRXhwcmVzc2lvbiBwYXJzZUFzc2lnbm1lbnQoKSB7CiAgICBFeHByZXNzaW9uIGxocyA9IHBhcnNlQ29uZGl0aW9uYWwoKTsKICAgIFN0cmluZyBhc3NpZ25tZW50T3BlcmF0b3IgPSBsYXN0VG9rZW47CiAgICBpZiAoYWNjZXB0Q2F0ZWdvcnkoQVNTSUdOTUVOVCkpIHsKICAgICAgRXhwcmVzc2lvbiByaHMgPSBwYXJzZUFzc2lnbm1lbnQoKTsKICAgICAgaWYgKGFzc2lnbm1lbnRPcGVyYXRvciA9PSAiPSIpIHsKICAgICAgICByZXR1cm4gbmV3IEFzc2lnbm1lbnQobGhzLCByaHMpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEhhbmRsZSArPSwgLT0sIGV0Yy4KICAgICAgICBTdHJpbmcgb3BlcmF0b3IgPQogICAgICAgICAgICBhc3NpZ25tZW50T3BlcmF0b3Iuc3Vic3RyaW5nKDAsIGFzc2lnbm1lbnRPcGVyYXRvci5sZW5ndGggLSAxKTsKICAgICAgICByZXR1cm4gbmV3IEFzc2lnbm1lbnQuY29tcG91bmQobGhzLCBvcGVyYXRvciwgcmhzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGxoczsKICB9CgogIEV4cHJlc3Npb24gcGFyc2VFeHByZXNzaW9uKCkgewogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcGFyc2VBc3NpZ25tZW50KCk7CiAgICB3aGlsZSAoYWNjZXB0Q2F0ZWdvcnkoQ09NTUEpKSB7CiAgICAgIEV4cHJlc3Npb24gcmlnaHQgPSBwYXJzZUFzc2lnbm1lbnQoKTsKICAgICAgZXhwcmVzc2lvbiA9IG5ldyBCaW5hcnkoJywnLCBleHByZXNzaW9uLCByaWdodCk7CiAgICB9CiAgICByZXR1cm4gZXhwcmVzc2lvbjsKICB9CgogIFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0IHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoKSB7CiAgICBEZWNsYXJhdGlvbiBmaXJzdFZhcmlhYmxlID0gcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uKCk7CiAgICByZXR1cm4gZmluaXNoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoZmlyc3RWYXJpYWJsZSk7CiAgfQoKICBWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBmaW5pc2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgKICAgICAgRGVjbGFyYXRpb24gZmlyc3RWYXJpYWJsZSkgewogICAgdmFyIGluaXRpYWxpemF0aW9uID0gPFZhcmlhYmxlSW5pdGlhbGl6YXRpb24+W107CgogICAgdm9pZCBkZWNsYXJlKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgICAgIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIgPSBudWxsOwogICAgICBpZiAoYWNjZXB0U3RyaW5nKCI9IikpIHsKICAgICAgICBpbml0aWFsaXplciA9IHBhcnNlQXNzaWdubWVudCgpOwogICAgICB9CiAgICAgIGluaXRpYWxpemF0aW9uLmFkZChuZXcgVmFyaWFibGVJbml0aWFsaXphdGlvbihkZWNsYXJhdGlvbiwgaW5pdGlhbGl6ZXIpKTsKICAgIH0KCiAgICBkZWNsYXJlKGZpcnN0VmFyaWFibGUpOwogICAgd2hpbGUgKGFjY2VwdENhdGVnb3J5KENPTU1BKSkgewogICAgICBEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbigpOwogICAgICBkZWNsYXJlKHZhcmlhYmxlKTsKICAgIH0KICAgIHJldHVybiBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoaW5pdGlhbGl6YXRpb24pOwogIH0KCiAgRXhwcmVzc2lvbiBwYXJzZVZhckRlY2xhcmF0aW9uT3JFeHByZXNzaW9uKCkgewogICAgaWYgKGFjY2VwdFN0cmluZygidmFyIikpIHsKICAgICAgcmV0dXJuIHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb24oKTsKICAgIH0KICB9CgogIEV4cHJlc3Npb24gZXhwcmVzc2lvbigpIHsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBhcnNlVmFyRGVjbGFyYXRpb25PckV4cHJlc3Npb24oKTsKICAgIGlmIChsYXN0Q2F0ZWdvcnkgIT0gTk9ORSB8fCBwb3NpdGlvbiAhPSBzcmMubGVuZ3RoKSB7CiAgICAgIGVycm9yKCJVbnBhcnNlZCBqdW5rOiAke2NhdGVnb3J5VG9TdHJpbmcobGFzdENhdGVnb3J5KX0iKTsKICAgIH0KICAgIHJldHVybiBleHByZXNzaW9uOwogIH0KCiAgU3RhdGVtZW50IHN0YXRlbWVudCgpIHsKICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBwYXJzZVN0YXRlbWVudCgpOwogICAgaWYgKGxhc3RDYXRlZ29yeSAhPSBOT05FIHx8IHBvc2l0aW9uICE9IHNyYy5sZW5ndGgpIHsKICAgICAgZXJyb3IoIlVucGFyc2VkIGp1bms6ICR7Y2F0ZWdvcnlUb1N0cmluZyhsYXN0Q2F0ZWdvcnkpfSIpOwogICAgfQogICAgLy8gVE9ETyhzcmEpOiBpbnRlcnBvbGF0ZWQgY2FwdHVyZSBoZXJlPwogICAgcmV0dXJuIHN0YXRlbWVudDsKICB9CgogIEJsb2NrIHBhcnNlQmxvY2soKSB7CiAgICBMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W107CgogICAgd2hpbGUgKCFhY2NlcHRDYXRlZ29yeShSQlJBQ0UpKSB7CiAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBwYXJzZVN0YXRlbWVudCgpOwogICAgICBzdGF0ZW1lbnRzLmFkZChzdGF0ZW1lbnQpOwogICAgfQogICAgcmV0dXJuIG5ldyBCbG9jayhzdGF0ZW1lbnRzKTsKICB9CgogIFN0YXRlbWVudCBwYXJzZVN0YXRlbWVudCgpIHsKICAgIGlmIChhY2NlcHRDYXRlZ29yeShMQlJBQ0UpKSByZXR1cm4gcGFyc2VCbG9jaygpOwoKICAgIGlmIChhY2NlcHRDYXRlZ29yeShTRU1JQ09MT04pKSByZXR1cm4gbmV3IEVtcHR5U3RhdGVtZW50KCk7CgogICAgaWYgKGxhc3RDYXRlZ29yeSA9PSBBTFBIQSkgewogICAgICBpZiAoYWNjZXB0U3RyaW5nKCdyZXR1cm4nKSkgcmV0dXJuIHBhcnNlUmV0dXJuKCk7CgogICAgICBpZiAoYWNjZXB0U3RyaW5nKCd0aHJvdycpKSByZXR1cm4gcGFyc2VUaHJvdygpOwoKICAgICAgaWYgKGFjY2VwdFN0cmluZygnYnJlYWsnKSkgewogICAgICAgIHJldHVybiBwYXJzZUJyZWFrT3JDb250aW51ZSgobGFiZWwpID0+IG5ldyBCcmVhayhsYWJlbCkpOwogICAgICB9CgogICAgICBpZiAoYWNjZXB0U3RyaW5nKCdjb250aW51ZScpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlQnJlYWtPckNvbnRpbnVlKChsYWJlbCkgPT4gbmV3IENvbnRpbnVlKGxhYmVsKSk7CiAgICAgIH0KCiAgICAgIGlmIChhY2NlcHRTdHJpbmcoJ2lmJykpIHJldHVybiBwYXJzZUlmVGhlbkVsc2UoKTsKCiAgICAgIGlmIChhY2NlcHRTdHJpbmcoJ2ZvcicpKSByZXR1cm4gcGFyc2VGb3IoKTsKCiAgICAgIGlmIChhY2NlcHRTdHJpbmcoJ2Z1bmN0aW9uJykpIHJldHVybiBwYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24oKTsKCiAgICAgIGlmIChhY2NlcHRTdHJpbmcoJ3RyeScpKSByZXR1cm4gcGFyc2VUcnkoKTsKCiAgICAgIGlmIChhY2NlcHRTdHJpbmcoJ3ZhcicpKSB7CiAgICAgICAgRXhwcmVzc2lvbiBkZWNsYXJhdGlvbnMgPSBwYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KCk7CiAgICAgICAgZXhwZWN0U2VtaWNvbG9uKCk7CiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KGRlY2xhcmF0aW9ucyk7CiAgICAgIH0KCiAgICAgIGlmIChhY2NlcHRTdHJpbmcoJ3doaWxlJykpIHJldHVybiBwYXJzZVdoaWxlKCk7CgogICAgICBpZiAoYWNjZXB0U3RyaW5nKCdkbycpKSByZXR1cm4gcGFyc2VEbygpOwoKICAgICAgaWYgKGFjY2VwdFN0cmluZygnc3dpdGNoJykpIHJldHVybiBwYXJzZVN3aXRjaCgpOwoKICAgICAgaWYgKGxhc3RUb2tlbiA9PSAnY2FzZScpIGVycm9yKCJDYXNlIG91dHNpZGUgc3dpdGNoLiIpOwoKICAgICAgaWYgKGxhc3RUb2tlbiA9PSAnZGVmYXVsdCcpIGVycm9yKCJEZWZhdWx0IG91dHNpZGUgc3dpdGNoLiIpOwoKICAgICAgaWYgKGxhc3RUb2tlbiA9PSAneWllbGQnKSByZXR1cm4gcGFyc2VZaWVsZCgpOwoKICAgICAgaWYgKGxhc3RUb2tlbiA9PSAnd2l0aCcpIHsKICAgICAgICBlcnJvcignTm90IGltcGxlbWVudGVkIGluIG1pbmkgcGFyc2VyJyk7CiAgICAgIH0KICAgIH0KCiAgICBib29sIGNoZWNrRm9ySW50ZXJwb2xhdGVkU3RhdGVtZW50ID0gbGFzdENhdGVnb3J5ID09IEhBU0g7CgogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcGFyc2VFeHByZXNzaW9uKCk7CgogICAgaWYgKGV4cHJlc3Npb24gaXMgVmFyaWFibGVVc2UgJiYgYWNjZXB0Q2F0ZWdvcnkoQ09MT04pKSB7CiAgICAgIHJldHVybiBuZXcgTGFiZWxlZFN0YXRlbWVudChleHByZXNzaW9uLm5hbWUsIHBhcnNlU3RhdGVtZW50KCkpOwogICAgfQoKICAgIGV4cGVjdFNlbWljb2xvbigpOwoKICAgIGlmIChjaGVja0ZvckludGVycG9sYXRlZFN0YXRlbWVudCkgewogICAgICAvLyAnUHJvbW90ZScgdGhlIGludGVycG9sYXRlZCBleHByZXNzaW9uIGAjO2AgdG8gYW4gaW50ZXJwb2xhdGVkCiAgICAgIC8vIHN0YXRlbWVudC4KICAgICAgaWYgKGV4cHJlc3Npb24gaXMgSW50ZXJwb2xhdGVkRXhwcmVzc2lvbikgewogICAgICAgIGFzc2VydChpZGVudGljYWwoaW50ZXJwb2xhdGVkVmFsdWVzLmxhc3QsIGV4cHJlc3Npb24pKTsKICAgICAgICBJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQgc3RhdGVtZW50ID0KICAgICAgICAgICAgbmV3IEludGVycG9sYXRlZFN0YXRlbWVudChleHByZXNzaW9uLm5hbWVPclBvc2l0aW9uKTsKICAgICAgICBpbnRlcnBvbGF0ZWRWYWx1ZXNbaW50ZXJwb2xhdGVkVmFsdWVzLmxlbmd0aCAtIDFdID0gc3RhdGVtZW50OwogICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoZXhwcmVzc2lvbik7CiAgfQoKICBTdGF0ZW1lbnQgcGFyc2VSZXR1cm4oKSB7CiAgICBpZiAoYWNjZXB0U2VtaWNvbG9uKCkpIHJldHVybiBuZXcgUmV0dXJuKCk7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgIGV4cGVjdFNlbWljb2xvbigpOwogICAgcmV0dXJuIG5ldyBSZXR1cm4oZXhwcmVzc2lvbik7CiAgfQoKICBTdGF0ZW1lbnQgcGFyc2VZaWVsZCgpIHsKICAgIGJvb2wgaGFzU3RhciA9IGFjY2VwdFN0cmluZygnKicpOwogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcGFyc2VFeHByZXNzaW9uKCk7CiAgICBleHBlY3RTZW1pY29sb24oKTsKICAgIHJldHVybiBuZXcgRGFydFlpZWxkKGV4cHJlc3Npb24sIGhhc1N0YXIpOwogIH0KCiAgU3RhdGVtZW50IHBhcnNlVGhyb3coKSB7CiAgICBpZiAoc2tpcHBlZE5ld2xpbmUpIGVycm9yKCd0aHJvdyBleHByZXNzaW9uIG11c3QgYmUgb24gc2FtZSBsaW5lJyk7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgIGV4cGVjdFNlbWljb2xvbigpOwogICAgcmV0dXJuIG5ldyBUaHJvdyhleHByZXNzaW9uKTsKICB9CgogIFN0YXRlbWVudCBwYXJzZUJyZWFrT3JDb250aW51ZShjb25zdHJ1Y3RvcikgewogICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0VG9rZW47CiAgICBpZiAoIXNraXBwZWROZXdsaW5lICYmIGFjY2VwdENhdGVnb3J5KEFMUEhBKSkgewogICAgICBleHBlY3RTZW1pY29sb24oKTsKICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yKGlkZW50aWZpZXIpOwogICAgfQogICAgZXhwZWN0U2VtaWNvbG9uKCk7CiAgICByZXR1cm4gY29uc3RydWN0b3IobnVsbCk7CiAgfQoKICBTdGF0ZW1lbnQgcGFyc2VJZlRoZW5FbHNlKCkgewogICAgZXhwZWN0Q2F0ZWdvcnkoTFBBUkVOKTsKICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0gcGFyc2VFeHByZXNzaW9uKCk7CiAgICBleHBlY3RDYXRlZ29yeShSUEFSRU4pOwogICAgU3RhdGVtZW50IHRoZW5TdGF0ZW1lbnQgPSBwYXJzZVN0YXRlbWVudCgpOwogICAgaWYgKGFjY2VwdFN0cmluZygnZWxzZScpKSB7CiAgICAgIC8vIFJlc29sdmVzIGRhbmdsaW5nIGVsc2UgYnkgYmluZGluZyAnZWxzZScgdG8gY2xvc2VzdCAnaWYnLgogICAgICBTdGF0ZW1lbnQgZWxzZVN0YXRlbWVudCA9IHBhcnNlU3RhdGVtZW50KCk7CiAgICAgIHJldHVybiBuZXcgSWYoY29uZGl0aW9uLCB0aGVuU3RhdGVtZW50LCBlbHNlU3RhdGVtZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgSWYubm9FbHNlKGNvbmRpdGlvbiwgdGhlblN0YXRlbWVudCk7CiAgICB9CiAgfQoKICBTdGF0ZW1lbnQgcGFyc2VGb3IoKSB7CiAgICAvLyBGb3ItaW5pdC1jb25kaXRpb24taW5jcmVtZW50IHN0eWxlIGxvb3BzIGFyZSBmdWxseSBzdXBwb3J0ZWQuCiAgICAvLwogICAgLy8gT25seSBvbmUgZm9yLWluIHZhcmlhbnQgaXMgY3VycmVudGx5IGltcGxlbWVudGVkOgogICAgLy8KICAgIC8vICAgICBmb3IgKHZhciB2YXJpYWJsZSBpbiBFeHByZXNzaW9uKSBTdGF0ZW1lbnQKICAgIC8vCiAgICBTdGF0ZW1lbnQgZmluaXNoRm9yKEV4cHJlc3Npb24gaW5pdCkgewogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IG51bGw7CiAgICAgIGlmICghYWNjZXB0Q2F0ZWdvcnkoU0VNSUNPTE9OKSkgewogICAgICAgIGNvbmRpdGlvbiA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgICAgIGV4cGVjdENhdGVnb3J5KFNFTUlDT0xPTik7CiAgICAgIH0KICAgICAgRXhwcmVzc2lvbiB1cGRhdGUgPSBudWxsOwogICAgICBpZiAoIWFjY2VwdENhdGVnb3J5KFJQQVJFTikpIHsKICAgICAgICB1cGRhdGUgPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgICAgICBleHBlY3RDYXRlZ29yeShSUEFSRU4pOwogICAgICB9CiAgICAgIFN0YXRlbWVudCBib2R5ID0gcGFyc2VTdGF0ZW1lbnQoKTsKICAgICAgcmV0dXJuIG5ldyBGb3IoaW5pdCwgY29uZGl0aW9uLCB1cGRhdGUsIGJvZHkpOwogICAgfQoKICAgIGV4cGVjdENhdGVnb3J5KExQQVJFTik7CiAgICBpZiAoYWNjZXB0Q2F0ZWdvcnkoU0VNSUNPTE9OKSkgewogICAgICByZXR1cm4gZmluaXNoRm9yKG51bGwpOwogICAgfQoKICAgIGlmIChhY2NlcHRTdHJpbmcoJ3ZhcicpKSB7CiAgICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uKCk7CiAgICAgIGlmIChhY2NlcHRTdHJpbmcoJ2luJykpIHsKICAgICAgICBFeHByZXNzaW9uIG9iamVjdEV4cHJlc3Npb24gPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgICAgICBleHBlY3RDYXRlZ29yeShSUEFSRU4pOwogICAgICAgIFN0YXRlbWVudCBib2R5ID0gcGFyc2VTdGF0ZW1lbnQoKTsKICAgICAgICByZXR1cm4gbmV3IEZvckluKAogICAgICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoCiAgICAgICAgICAgICAgICBbbmV3IFZhcmlhYmxlSW5pdGlhbGl6YXRpb24oZGVjbGFyYXRpb24sIG51bGwpXSksCiAgICAgICAgICAgIG9iamVjdEV4cHJlc3Npb24sCiAgICAgICAgICAgIGJvZHkpOwogICAgICB9CiAgICAgIEV4cHJlc3Npb24gZGVjbGFyYXRpb25zID0gZmluaXNoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoZGVjbGFyYXRpb24pOwogICAgICBleHBlY3RDYXRlZ29yeShTRU1JQ09MT04pOwogICAgICByZXR1cm4gZmluaXNoRm9yKGRlY2xhcmF0aW9ucyk7CiAgICB9CgogICAgRXhwcmVzc2lvbiBpbml0ID0gcGFyc2VFeHByZXNzaW9uKCk7CiAgICBleHBlY3RDYXRlZ29yeShTRU1JQ09MT04pOwogICAgcmV0dXJuIGZpbmlzaEZvcihpbml0KTsKICB9CgogIERlY2xhcmF0aW9uIHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbigpIHsKICAgIGlmIChhY2NlcHRDYXRlZ29yeShIQVNIKSkgewogICAgICB2YXIgbmFtZU9yUG9zaXRpb24gPSBwYXJzZUhhc2goKTsKICAgICAgSW50ZXJwb2xhdGVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPQogICAgICAgICAgbmV3IEludGVycG9sYXRlZERlY2xhcmF0aW9uKG5hbWVPclBvc2l0aW9uKTsKICAgICAgaW50ZXJwb2xhdGVkVmFsdWVzLmFkZChkZWNsYXJhdGlvbik7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICAgIH0gZWxzZSB7CiAgICAgIFN0cmluZyB0b2tlbiA9IGxhc3RUb2tlbjsKICAgICAgZXhwZWN0Q2F0ZWdvcnkoQUxQSEEpOwogICAgICByZXR1cm4gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24odG9rZW4pOwogICAgfQogIH0KCiAgU3RhdGVtZW50IHBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbigpIHsKICAgIERlY2xhcmF0aW9uIG5hbWUgPSBwYXJzZVZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgIEV4cHJlc3Npb24gZnVuID0gcGFyc2VGdW4oKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25EZWNsYXJhdGlvbihuYW1lLCBmdW4pOwogIH0KCiAgU3RhdGVtZW50IHBhcnNlVHJ5KCkgewogICAgZXhwZWN0Q2F0ZWdvcnkoTEJSQUNFKTsKICAgIEJsb2NrIGJvZHkgPSBwYXJzZUJsb2NrKCk7CiAgICBDYXRjaCBjYXRjaFBhcnQgPSBudWxsOwogICAgaWYgKGFjY2VwdFN0cmluZygnY2F0Y2gnKSkgY2F0Y2hQYXJ0ID0gcGFyc2VDYXRjaCgpOwogICAgQmxvY2sgZmluYWxseVBhcnQgPSBudWxsOwogICAgaWYgKGFjY2VwdFN0cmluZygnZmluYWxseScpKSB7CiAgICAgIGV4cGVjdENhdGVnb3J5KExCUkFDRSk7CiAgICAgIGZpbmFsbHlQYXJ0ID0gcGFyc2VCbG9jaygpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGNhdGNoUGFydCA9PSBudWxsKSBlcnJvcigiZXhwZWN0ZWQgJ2ZpbmFsbHknIik7CiAgICB9CiAgICByZXR1cm4gbmV3IFRyeShib2R5LCBjYXRjaFBhcnQsIGZpbmFsbHlQYXJ0KTsKICB9CgogIFN3aXRjaENsYXVzZSBwYXJzZVN3aXRjaENsYXVzZSgpIHsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7CiAgICBpZiAoYWNjZXB0U3RyaW5nKCdjYXNlJykpIHsKICAgICAgZXhwcmVzc2lvbiA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgICBleHBlY3RDYXRlZ29yeShDT0xPTik7CiAgICB9IGVsc2UgewogICAgICBpZiAoIWFjY2VwdFN0cmluZygnZGVmYXVsdCcpKSB7CiAgICAgICAgZXJyb3IoJ2V4cGVjdGVkIGNhc2Ugb3IgZGVmYXVsdCcpOwogICAgICB9CiAgICAgIGV4cGVjdENhdGVnb3J5KENPTE9OKTsKICAgIH0KICAgIExpc3Qgc3RhdGVtZW50cyA9IG5ldyBMaXN0PFN0YXRlbWVudD4oKTsKICAgIHdoaWxlIChsYXN0Q2F0ZWdvcnkgIT0gUkJSQUNFICYmCiAgICAgICAgbGFzdFRva2VuICE9ICdjYXNlJyAmJgogICAgICAgIGxhc3RUb2tlbiAhPSAnZGVmYXVsdCcpIHsKICAgICAgc3RhdGVtZW50cy5hZGQocGFyc2VTdGF0ZW1lbnQoKSk7CiAgICB9CiAgICByZXR1cm4gZXhwcmVzc2lvbiA9PSBudWxsCiAgICAgICAgPyBuZXcgRGVmYXVsdChuZXcgQmxvY2soc3RhdGVtZW50cykpCiAgICAgICAgOiBuZXcgQ2FzZShleHByZXNzaW9uLCBuZXcgQmxvY2soc3RhdGVtZW50cykpOwogIH0KCiAgU3RhdGVtZW50IHBhcnNlV2hpbGUoKSB7CiAgICBleHBlY3RDYXRlZ29yeShMUEFSRU4pOwogICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgIGV4cGVjdENhdGVnb3J5KFJQQVJFTik7CiAgICBTdGF0ZW1lbnQgYm9keSA9IHBhcnNlU3RhdGVtZW50KCk7CiAgICByZXR1cm4gbmV3IFdoaWxlKGNvbmRpdGlvbiwgYm9keSk7CiAgfQoKICBTdGF0ZW1lbnQgcGFyc2VEbygpIHsKICAgIFN0YXRlbWVudCBib2R5ID0gcGFyc2VTdGF0ZW1lbnQoKTsKICAgIGlmIChsYXN0VG9rZW4gIT0gIndoaWxlIikgZXJyb3IoIk1pc3Npbmcgd2hpbGUgYWZ0ZXIgZG8gYm9keS4iKTsKICAgIGdldFRva2VuKCk7CiAgICBleHBlY3RDYXRlZ29yeShMUEFSRU4pOwogICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgIGV4cGVjdENhdGVnb3J5KFJQQVJFTik7CiAgICBleHBlY3RTZW1pY29sb24oKTsKICAgIHJldHVybiBuZXcgRG8oYm9keSwgY29uZGl0aW9uKTsKICB9CgogIFN0YXRlbWVudCBwYXJzZVN3aXRjaCgpIHsKICAgIGV4cGVjdENhdGVnb3J5KExQQVJFTik7CiAgICBFeHByZXNzaW9uIGtleSA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgZXhwZWN0Q2F0ZWdvcnkoUlBBUkVOKTsKICAgIGV4cGVjdENhdGVnb3J5KExCUkFDRSk7CiAgICBMaXN0PFN3aXRjaENsYXVzZT4gY2xhdXNlcyA9IG5ldyBMaXN0PFN3aXRjaENsYXVzZT4oKTsKICAgIHdoaWxlIChsYXN0Q2F0ZWdvcnkgIT0gUkJSQUNFKSB7CiAgICAgIGNsYXVzZXMuYWRkKHBhcnNlU3dpdGNoQ2xhdXNlKCkpOwogICAgfQogICAgZXhwZWN0Q2F0ZWdvcnkoUkJSQUNFKTsKICAgIHJldHVybiBuZXcgU3dpdGNoKGtleSwgY2xhdXNlcyk7CiAgfQoKICBDYXRjaCBwYXJzZUNhdGNoKCkgewogICAgZXhwZWN0Q2F0ZWdvcnkoTFBBUkVOKTsKICAgIERlY2xhcmF0aW9uIGVycm9yTmFtZSA9IHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbigpOwogICAgZXhwZWN0Q2F0ZWdvcnkoUlBBUkVOKTsKICAgIGV4cGVjdENhdGVnb3J5KExCUkFDRSk7CiAgICBCbG9jayBib2R5ID0gcGFyc2VCbG9jaygpOwogICAgcmV0dXJuIG5ldyBDYXRjaChlcnJvck5hbWUsIGJvZHkpOwogIH0KfQoKY2xhc3MgX0ludGVybGVhdmVJdGVyYXRvcjxUIGV4dGVuZHMgTm9kZT4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7CiAgSXRlcmF0b3I8VD4gc291cmNlOwogIFQgc2VwYXJhdG9yOwogIGJvb2wgaXNOZXh0U2VwYXJhdG9yID0gZmFsc2U7CiAgYm9vbCBpc0luaXRpYWxpemVkID0gZmFsc2U7CgogIF9JbnRlcmxlYXZlSXRlcmF0b3IodGhpcy5zb3VyY2UsIHRoaXMuc2VwYXJhdG9yKTsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmICghaXNJbml0aWFsaXplZCkgewogICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgcmV0dXJuIHNvdXJjZS5tb3ZlTmV4dCgpOwogICAgfSBlbHNlIGlmIChpc05leHRTZXBhcmF0b3IpIHsKICAgICAgaXNOZXh0U2VwYXJhdG9yID0gZmFsc2U7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGlzTmV4dFNlcGFyYXRvciA9IHNvdXJjZS5tb3ZlTmV4dCgpOwogICAgfQogIH0KCiAgVCBnZXQgY3VycmVudCB7CiAgICBpZiAoaXNOZXh0U2VwYXJhdG9yKSByZXR1cm4gc2VwYXJhdG9yOwogICAgcmV0dXJuIHNvdXJjZS5jdXJyZW50OwogIH0KfQoKY2xhc3MgX0ludGVybGVhdmVJdGVyYWJsZTxUIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBJdGVyYWJsZUJhc2U8VD4gewogIEl0ZXJhYmxlPFQ+IHNvdXJjZTsKICBUIHNlcGFyYXRvcjsKCiAgX0ludGVybGVhdmVJdGVyYWJsZSh0aGlzLnNvdXJjZSwgdGhpcy5zZXBhcmF0b3IpOwoKICBJdGVyYXRvcjxUPiBnZXQgaXRlcmF0b3IgewogICAgcmV0dXJuIG5ldyBfSW50ZXJsZWF2ZUl0ZXJhdG9yPFQ+KHNvdXJjZS5pdGVyYXRvciwgc2VwYXJhdG9yKTsKICB9Cn0Khk8ATk48AUgyARABBEVORQNJQAQ5AQQBTyIBOQFIQgFQJAEwAQwBPAFMNgE6ASkBMAFNLgE+AU9NGQEnCA8SAVBMAScxCA8VAVFQSFE1ASkpMwFRT0kqAR40Gy00OQFJAUpPRzkBTyYBTURLUD0BJDIIIgFJATw8AUVNGwEbOwgtAU9MUQoBKCc+CBQBTk0BQThHJ0IBUUMBPBUBPRgBTk9PDgEiOSABIjg0AUtMAQFKAT0BARkBT083AQMoARIVAQY8BSEFUU4MBjQ5PDhKLAQBBkAGODg8OEosBAEGQAVIEAYrTVEdJy0NLgYEATRKHDYzTwYVBAEzSRw2ME0GFQQBBjwFJgYyLAQBBkAGNzQxLC8EAQY+BjY0LiswBAEGUFAmBjIzBAExMgQBMDUqNU4eUSATGBMYExgTGBMYExgTGAhJCCxJJz0TBAEwLC9NUQEaGhogASQqGCoYKhgqIyMjHRgqJCUjGC8eD0waCggGATo5BgE4ODgGATgBKgEkPxwaEggjIyhKHBs8JRs8EU4eJS8yGy8bMAoPIAgGAT8EAU8BQxQaLxovIRYaFhsWGhYcFhoWGhYGEQQBMAZOTUMXRwE7Bi5GAUIcGhUnIBgWDTYGLAQBTj4EATsYGSYGLAQBQgE9ATM3ATk3ATUBFU9JBAFBLiA5CC4EAgE4OTMCAUBMKwIBQBo9AgE1RE0TTToCAT8gAgEaMgEdGAEWIwFBHS0/AUEXMEZJAVEUQkoEAgFPGRMSFBFBFhAYG0ssQwQ1BE5AM05NKhUZHRoaFxAEARsbGBREFAFKHEkhTgEaGhwbGx8YGxsbGx0dGxsbHxogGwEnPAEsExEXEhgUGhMZFx0QFhMZExkTGRMZFBoUGhMZEhgSGBIYFhwRFxcdEhgGHAQBKUNFRUUnQkw6OkdISEhNSEhIMQ8BTTNOAWYlDg4ODg4ODg4PDxANDg4NDQ0NDQ4ODA0NDA0VDQ0ODAwMDAsFIwoKCQkJCQ4MDgwNATZJASIxHQQBKx4zFQkSQS5HMUUwJycnJyxICggoEDIEARQcDykrLUNAOj0jFEY+QScUCggvOBIGASIbGB8OBikdOhkdKiclOBY/NjMIHjktJQgrRh0SUBQIOQ0oNBILFCstT1BLLSwqEx4rHEVBGjkcMicKIj5RJQpAIUghCggGBAEhSRAEASEfEhMGEgQBGyMhBAEbUD4tOxpGBiYEASUfEhMGEgQBGDAEAUUQISE8IEMIFw0bQwgwFwYEAR4dIRwmJCcjIicqIxsPJggpMR4ZKSYqJiknKiMBFSUnFAosJywfCCs3MhIgLkEZJygqNioZDSwTBgQBKTk1MgYXBAEaLAEcIxEkLCw5LSERKyEzCi0gDwgGISEfMQ8tCCdOLg0qBhwgQQQBKC4PKU0cJSM7KzYrFTspKjI1NSwPKQgdLDkpHQYuBAEdKhMhKCwxITsPDwgGFQQBGywpEyQqJxk1JS8jDAofKy0dPDEhOzgoDzNEDwgGFQQBLiAoUCg1BiNITCJIMwgNHQY7BAEeKSEePiIbNjAGUVAfFwQBICEiLk9BMwYbBAEfISIuHBweQTQGHQQBLiYXFzcTISQ0Nw8IHkdBMx8dD0QvCAYhLQQBIkMsKxssMgQBISkrJionKQ8fGkw8CAYQBAEhLyQsNwYXBAE7PDkEATkjNQEsJR8pCFAGARwkORkGOAQBMR8tDSAGBAEcPzpBBhcEARosOkEGLRYEARcwASYuIQYiBAEfNQFAASE4ATYBI0IIASZFCAE4ATIBRwEyASFCGzYIATYBMAE4AT4BRAE1ASExCAYBPwEvAT5GBgEXASlHFDJAKkJHGggGATAEARwwLxcjBAEbJi8XLwQBG0gvFyIEATAgNBkmBhceBAEgHC4cMCBDMj4NNgYEARlFBzkHNgcrIygnIwggJSQgCCk1BgEcJR4GAR88IDkgKxopQh4TCEwhJgYBKR8cBAErICgsNysaDSAdLQYEASkzIS8EARkcHxw5HiMeIg06BjIEASUiICYdDSYrCB0GLSUfIigGHi03BAEbHC4cJycEARgnRRAcLhwXJAQBHBwoHBw7JSgGHCUEARccOBwcHycEAgFDFg8gHgE0ARQaHCAiHxMNMgYEARIrGwQCAUQWDwE0AR1DBAIBH3BhY2thZ2U6anNfYXN0L3NyYy9idWlsZGVyLmRhcnQ0c2Rrcm9vdDovcGtnL2pzX2FzdC9saWIvc3JjL2VxdWl2YWxlbmNlX3Zpc2l0b3IuZGFydMAAQCEvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBqc19hc3Q7CgovLy8gVmlzaXRvciB0aGF0IGNvbXB1dGVzIHdoZXRoZXIgdHdvIFtOb2RlXXMgYXJlIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50LgpjbGFzcyBFcXVpdmFsZW5jZVZpc2l0b3IgaW1wbGVtZW50cyBOb2RlVmlzaXRvcjE8Ym9vbCwgTm9kZT4gewogIGNvbnN0IEVxdWl2YWxlbmNlVmlzaXRvcigpOwoKICAvLy8gQ2FsbGVkIHdoZW4gW25vZGUxXSBhbmQgW25vZGUyXSBhcmUgbm90IGVxdWl2YWxlbnQuCiAgLy8vCiAgLy8vIE92ZXJyaWRlIHRoaXMgdG8gY29sbGVjdCBvciByZXBvcnQgaW5mb3JtYXRpb24gb24gdGhlIGluZXF1aXZhbGVudCBub2Rlcy4KICBib29sIGZhaWxBdChOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSA9PiBmYWxzZTsKCiAgLy8vIFJldHVybnMgd2hldGhlciB0aGUgbm9uLW5vZGUgdmFsdWVzIFt2YWx1ZTFdIGFuZCBbdmFsdWUyXSBhcmUgZXF1aXZhbGVudC4KICBib29sIHRlc3RWYWx1ZXMoTm9kZSBub2RlMSwgT2JqZWN0IHZhbHVlMSwgTm9kZSBub2RlMiwgT2JqZWN0IHZhbHVlMikgPT4KICAgICAgdmFsdWUxID09IHZhbHVlMjsKCiAgLy8vIFJldHVybnMgd2hldGhlciB0aGUgbGFiZWxzIFtsYWJlbDFdIGFuZCBbbGFiZWwyXSBhcmUgZXF1aXZhbGVudC4KICBib29sIHRlc3RMYWJlbHMoTm9kZSBub2RlMSwgU3RyaW5nIGxhYmVsMSwgTm9kZSBub2RlMiwgU3RyaW5nIGxhYmVsMikgPT4KICAgICAgbGFiZWwxID09IGxhYmVsMjsKCiAgYm9vbCB0ZXN0Tm9kZXMoTm9kZSBub2RlMSwgTm9kZSBub2RlMikgewogICAgaWYgKGlkZW50aWNhbChub2RlMSwgbm9kZTIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChub2RlMSA9PSBudWxsIHx8IG5vZGUyID09IG51bGwpIHJldHVybiBmYWlsQXQobm9kZTEsIG5vZGUyKTsKICAgIHJldHVybiBub2RlMS5hY2NlcHQxKHRoaXMsIG5vZGUyKTsKICB9CgogIGJvb2wgdGVzdE5vZGVMaXN0cyhMaXN0PE5vZGU+IGxpc3QxLCBMaXN0PE5vZGU+IGxpc3QyKSB7CiAgICBpbnQgaW5kZXggPSAwOwogICAgd2hpbGUgKGluZGV4IDwgbGlzdDEubGVuZ3RoICYmIGluZGV4IDwgbGlzdDIubGVuZ3RoKSB7CiAgICAgIGlmICghdGVzdE5vZGVzKGxpc3QxW2luZGV4XSwgbGlzdDJbaW5kZXhdKSkgcmV0dXJuIGZhbHNlOwogICAgICBpbmRleCsrOwogICAgfQogICAgaWYgKGluZGV4IDwgbGlzdDEubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWlsQXQobGlzdDFbaW5kZXhdLCBudWxsKTsKICAgIH0gZWxzZSBpZiAoaW5kZXggPCBsaXN0Mi5sZW5ndGgpIHsKICAgICAgcmV0dXJuIGZhaWxBdChsaXN0MltpbmRleF0sIG51bGwpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UHJvZ3JhbShQcm9ncmFtIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBQcm9ncmFtKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBQcm9ncmFtIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2RlTGlzdHMobm9kZS5ib2R5LCBvdGhlci5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbihJbnRlcnBvbGF0ZWREZWNsYXJhdGlvbiBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgSW50ZXJwb2xhdGVkRGVjbGFyYXRpb24pIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIEludGVycG9sYXRlZERlY2xhcmF0aW9uIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3RWYWx1ZXMobm9kZSwgbm9kZS5uYW1lT3JQb3NpdGlvbiwgb3RoZXIsIG90aGVyLm5hbWVPclBvc2l0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQoSW50ZXJwb2xhdGVkU3RhdGVtZW50IG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBJbnRlcnBvbGF0ZWRTdGF0ZW1lbnQpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIEludGVycG9sYXRlZFN0YXRlbWVudCBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUubmFtZU9yUG9zaXRpb24sIG90aGVyLCBvdGhlci5uYW1lT3JQb3NpdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW50ZXJwb2xhdGVkU2VsZWN0b3IoSW50ZXJwb2xhdGVkU2VsZWN0b3Igbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIEludGVycG9sYXRlZFNlbGVjdG9yKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBJbnRlcnBvbGF0ZWRTZWxlY3RvciBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUubmFtZU9yUG9zaXRpb24sIG90aGVyLCBvdGhlci5uYW1lT3JQb3NpdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW50ZXJwb2xhdGVkUGFyYW1ldGVyKEludGVycG9sYXRlZFBhcmFtZXRlciBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgSW50ZXJwb2xhdGVkUGFyYW1ldGVyKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBJbnRlcnBvbGF0ZWRQYXJhbWV0ZXIgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLm5hbWVPclBvc2l0aW9uLCBvdGhlciwgb3RoZXIubmFtZU9yUG9zaXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludGVycG9sYXRlZExpdGVyYWwoSW50ZXJwb2xhdGVkTGl0ZXJhbCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgSW50ZXJwb2xhdGVkTGl0ZXJhbCkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgSW50ZXJwb2xhdGVkTGl0ZXJhbCBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUubmFtZU9yUG9zaXRpb24sIG90aGVyLCBvdGhlci5uYW1lT3JQb3NpdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbihJbnRlcnBvbGF0ZWRFeHByZXNzaW9uIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBJbnRlcnBvbGF0ZWRFeHByZXNzaW9uKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBJbnRlcnBvbGF0ZWRFeHByZXNzaW9uIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3RWYWx1ZXMobm9kZSwgbm9kZS5uYW1lT3JQb3NpdGlvbiwgb3RoZXIsIG90aGVyLm5hbWVPclBvc2l0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRDb21tZW50KENvbW1lbnQgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIENvbW1lbnQpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIENvbW1lbnQgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLmNvbW1lbnQsIG90aGVyLCBvdGhlci5jb21tZW50KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRBd2FpdChBd2FpdCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgQXdhaXQpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIEF3YWl0IG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLmV4cHJlc3Npb24sIG90aGVyLmV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFJlZ0V4cExpdGVyYWwoUmVnRXhwTGl0ZXJhbCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgUmVnRXhwTGl0ZXJhbCkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgUmVnRXhwTGl0ZXJhbCBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUucGF0dGVybiwgb3RoZXIsIG90aGVyLnBhdHRlcm4pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFByb3BlcnR5KFByb3BlcnR5IG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBQcm9wZXJ0eSkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgUHJvcGVydHkgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUubmFtZSwgb3RoZXIubmFtZSkgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS52YWx1ZSwgb3RoZXIudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdE9iamVjdEluaXRpYWxpemVyKE9iamVjdEluaXRpYWxpemVyIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBPYmplY3RJbml0aWFsaXplcikgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgT2JqZWN0SW5pdGlhbGl6ZXIgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVMaXN0cyhub2RlLnByb3BlcnRpZXMsIG90aGVyLnByb3BlcnRpZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEFycmF5SG9sZShBcnJheUhvbGUgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIEFycmF5SG9sZSkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0QXJyYXlJbml0aWFsaXplcihBcnJheUluaXRpYWxpemVyIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBBcnJheUluaXRpYWxpemVyKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBBcnJheUluaXRpYWxpemVyIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2RlTGlzdHMobm9kZS5lbGVtZW50cywgb3RoZXIuZWxlbWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdE5hbWUoTmFtZSBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgTmFtZSkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgTmFtZSBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUua2V5LCBvdGhlciwgb3RoZXIua2V5KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRQYXJlbnRoZXNlcyhQYXJlbnRoZXNlcyBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgUGFyZW50aGVzZXMpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIFBhcmVudGhlc2VzIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3RWYWx1ZXMobm9kZSwgbm9kZS5lbmNsb3NlZCwgb3RoZXIsIG90aGVyLmVuY2xvc2VkKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIFN0cmluZ0NvbmNhdGVuYXRpb24pIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVMaXN0cyhub2RlLnBhcnRzLCBvdGhlci5wYXJ0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TGl0ZXJhbE51bGwoTGl0ZXJhbE51bGwgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIExpdGVyYWxOdWxsKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRMaXRlcmFsTnVtYmVyKExpdGVyYWxOdW1iZXIgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIExpdGVyYWxOdW1iZXIpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIExpdGVyYWxOdW1iZXIgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLnZhbHVlLCBvdGhlciwgb3RoZXIudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExpdGVyYWxTdHJpbmcoTGl0ZXJhbFN0cmluZyBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgTGl0ZXJhbFN0cmluZykgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgTGl0ZXJhbFN0cmluZyBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUudmFsdWUsIG90aGVyLCBvdGhlci52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TGl0ZXJhbEJvb2woTGl0ZXJhbEJvb2wgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIExpdGVyYWxCb29sKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBMaXRlcmFsQm9vbCBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUudmFsdWUsIG90aGVyLCBvdGhlci52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RGVmZXJyZWRTdHJpbmcoRGVmZXJyZWRTdHJpbmcgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIERlZmVycmVkU3RyaW5nKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBEZWZlcnJlZFN0cmluZyBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUudmFsdWUsIG90aGVyLCBvdGhlci52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RGVmZXJyZWROdW1iZXIoRGVmZXJyZWROdW1iZXIgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIERlZmVycmVkTnVtYmVyKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBEZWZlcnJlZE51bWJlciBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUudmFsdWUsIG90aGVyLCBvdGhlci52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RGVmZXJyZWRFeHByZXNzaW9uKERlZmVycmVkRXhwcmVzc2lvbiBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgRGVmZXJyZWRFeHByZXNzaW9uKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBEZWZlcnJlZEV4cHJlc3Npb24gb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUudmFsdWUsIG90aGVyLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGdW4oRnVuIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBGdW4pIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIEZ1biBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZUxpc3RzKG5vZGUucGFyYW1zLCBvdGhlci5wYXJhbXMpICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUuYm9keSwgb3RoZXIuYm9keSkgJiYKICAgICAgICB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUuYXN5bmNNb2RpZmllciwgb3RoZXIsIG90aGVyLmFzeW5jTW9kaWZpZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdE5hbWVkRnVuY3Rpb24oTmFtZWRGdW5jdGlvbiBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgTmFtZWRGdW5jdGlvbikgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgTmFtZWRGdW5jdGlvbiBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5uYW1lLCBvdGhlci5uYW1lKSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLmZ1bmN0aW9uLCBvdGhlci5mdW5jdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0QWNjZXNzKFByb3BlcnR5QWNjZXNzIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBQcm9wZXJ0eUFjY2VzcykgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgUHJvcGVydHlBY2Nlc3Mgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUucmVjZWl2ZXIsIG90aGVyLnJlY2VpdmVyKSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLnNlbGVjdG9yLCBvdGhlci5zZWxlY3Rvcik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UGFyYW1ldGVyKFBhcmFtZXRlciBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgUGFyYW1ldGVyKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBQYXJhbWV0ZXIgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLm5hbWUsIG90aGVyLCBvdGhlci5uYW1lKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIFZhcmlhYmxlRGVjbGFyYXRpb24pIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLm5hbWUsIG90aGVyLCBvdGhlci5uYW1lKSAmJgogICAgICAgIHRlc3RWYWx1ZXMobm9kZSwgbm9kZS5hbGxvd1JlbmFtZSwgb3RoZXIsIG90aGVyLmFsbG93UmVuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRUaGlzKFRoaXMgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIFRoaXMpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFZhcmlhYmxlVXNlKFZhcmlhYmxlVXNlIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBWYXJpYWJsZVVzZSkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgVmFyaWFibGVVc2Ugb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLm5hbWUsIG90aGVyLCBvdGhlci5uYW1lKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRQb3N0Zml4KFBvc3RmaXggbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIFBvc3RmaXgpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIFBvc3RmaXggb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdFZhbHVlcyhub2RlLCBub2RlLm9wLCBvdGhlciwgb3RoZXIub3ApICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUuYXJndW1lbnQsIG90aGVyLmFyZ3VtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRQcmVmaXgoUHJlZml4IG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBQcmVmaXgpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIFByZWZpeCBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUub3AsIG90aGVyLCBvdGhlci5vcCkgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5hcmd1bWVudCwgb3RoZXIuYXJndW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEJpbmFyeShCaW5hcnkgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIEJpbmFyeSkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgQmluYXJ5IG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLmxlZnQsIG90aGVyLmxlZnQpICYmCiAgICAgICAgdGVzdFZhbHVlcyhub2RlLCBub2RlLm9wLCBvdGhlciwgb3RoZXIub3ApICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUucmlnaHQsIG90aGVyLnJpZ2h0KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRDYWxsKENhbGwgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIENhbGwpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIENhbGwgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUudGFyZ2V0LCBvdGhlci50YXJnZXQpICYmCiAgICAgICAgdGVzdE5vZGVMaXN0cyhub2RlLmFyZ3VtZW50cywgb3RoZXIuYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXROZXcoTmV3IG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBOZXcpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIE5ldyBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS50YXJnZXQsIG90aGVyLnRhcmdldCkgJiYKICAgICAgICB0ZXN0Tm9kZUxpc3RzKG5vZGUuYXJndW1lbnRzLCBvdGhlci5hcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdENvbmRpdGlvbmFsKENvbmRpdGlvbmFsIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBDb25kaXRpb25hbCkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgQ29uZGl0aW9uYWwgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUuY29uZGl0aW9uLCBvdGhlci5jb25kaXRpb24pICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUudGhlbiwgb3RoZXIudGhlbikgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5vdGhlcndpc2UsIG90aGVyLm90aGVyd2lzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VmFyaWFibGVJbml0aWFsaXphdGlvbihWYXJpYWJsZUluaXRpYWxpemF0aW9uIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBWYXJpYWJsZUluaXRpYWxpemF0aW9uKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBWYXJpYWJsZUluaXRpYWxpemF0aW9uIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLmRlY2xhcmF0aW9uLCBvdGhlci5kZWNsYXJhdGlvbikgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5sZWZ0SGFuZFNpZGUsIG90aGVyLmxlZnRIYW5kU2lkZSkgJiYKICAgICAgICB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUub3AsIG90aGVyLCBvdGhlci5vcCkgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS52YWx1ZSwgb3RoZXIudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEFzc2lnbm1lbnQoQXNzaWdubWVudCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgQXNzaWdubWVudCkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgQXNzaWdubWVudCBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5sZWZ0SGFuZFNpZGUsIG90aGVyLmxlZnRIYW5kU2lkZSkgJiYKICAgICAgICB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUub3AsIG90aGVyLCBvdGhlci5vcCkgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS52YWx1ZSwgb3RoZXIudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0IG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVMaXN0cyhub2RlLmRlY2xhcmF0aW9ucywgb3RoZXIuZGVjbGFyYXRpb25zKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRMaXRlcmFsRXhwcmVzc2lvbihMaXRlcmFsRXhwcmVzc2lvbiBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgTGl0ZXJhbEV4cHJlc3Npb24pIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIExpdGVyYWxFeHByZXNzaW9uIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3RWYWx1ZXMobm9kZSwgbm9kZS50ZW1wbGF0ZSwgb3RoZXIsIG90aGVyLnRlbXBsYXRlKSAmJgogICAgICAgIHRlc3ROb2RlTGlzdHMobm9kZS5pbnB1dHMsIG90aGVyLmlucHV0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RGFydFlpZWxkKERhcnRZaWVsZCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgRGFydFlpZWxkKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBEYXJ0WWllbGQgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUuZXhwcmVzc2lvbiwgb3RoZXIuZXhwcmVzc2lvbikgJiYKICAgICAgICB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUuaGFzU3Rhciwgb3RoZXIsIG90aGVyLmhhc1N0YXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExpdGVyYWxTdGF0ZW1lbnQoTGl0ZXJhbFN0YXRlbWVudCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgTGl0ZXJhbFN0YXRlbWVudCkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgTGl0ZXJhbFN0YXRlbWVudCBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0VmFsdWVzKG5vZGUsIG5vZGUuY29kZSwgb3RoZXIsIG90aGVyLmNvZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgTGFiZWxlZFN0YXRlbWVudCkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgTGFiZWxlZFN0YXRlbWVudCBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0TGFiZWxzKG5vZGUsIG5vZGUubGFiZWwsIG90aGVyLCBvdGhlci5sYWJlbCkgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5ib2R5LCBvdGhlci5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIEZ1bmN0aW9uRGVjbGFyYXRpb24pIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIEZ1bmN0aW9uRGVjbGFyYXRpb24gb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUubmFtZSwgb3RoZXIubmFtZSkgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5mdW5jdGlvbiwgb3RoZXIuZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdERlZmF1bHQoRGVmYXVsdCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgRGVmYXVsdCkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgRGVmYXVsdCBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5ib2R5LCBvdGhlci5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRDYXNlKENhc2Ugbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIENhc2UpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIENhc2Ugb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUuZXhwcmVzc2lvbiwgb3RoZXIuZXhwcmVzc2lvbikgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5ib2R5LCBvdGhlci5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRTd2l0Y2goU3dpdGNoIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBTd2l0Y2gpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIFN3aXRjaCBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5rZXksIG90aGVyLmtleSkgJiYKICAgICAgICB0ZXN0Tm9kZUxpc3RzKG5vZGUuY2FzZXMsIG90aGVyLmNhc2VzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRDYXRjaChDYXRjaCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgQ2F0Y2gpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIENhdGNoIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLmRlY2xhcmF0aW9uLCBvdGhlci5kZWNsYXJhdGlvbikgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5ib2R5LCBvdGhlci5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRUcnkoVHJ5IG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBUcnkpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIFRyeSBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5ib2R5LCBvdGhlci5ib2R5KSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLmNhdGNoUGFydCwgb3RoZXIuY2F0Y2hQYXJ0KSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLmZpbmFsbHlQYXJ0LCBvdGhlci5maW5hbGx5UGFydCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VGhyb3coVGhyb3cgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIFRocm93KSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBUaHJvdyBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5leHByZXNzaW9uLCBvdGhlci5leHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRSZXR1cm4oUmV0dXJuIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBSZXR1cm4pIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIFJldHVybiBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS52YWx1ZSwgb3RoZXIudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEJyZWFrKEJyZWFrIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBCcmVhaykgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgQnJlYWsgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdExhYmVscyhub2RlLCBub2RlLnRhcmdldExhYmVsLCBvdGhlciwgb3RoZXIudGFyZ2V0TGFiZWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdENvbnRpbnVlKENvbnRpbnVlIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBDb250aW51ZSkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgQ29udGludWUgb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdExhYmVscyhub2RlLCBub2RlLnRhcmdldExhYmVsLCBvdGhlciwgb3RoZXIudGFyZ2V0TGFiZWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdERvKERvIG5vZGUsIE5vZGUgYXJnKSB7CiAgICBpZiAoYXJnIGlzISBEbykgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgRG8gb3RoZXIgPSBhcmc7CiAgICByZXR1cm4gdGVzdE5vZGVzKG5vZGUuY29uZGl0aW9uLCBvdGhlci5jb25kaXRpb24pICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUuYm9keSwgb3RoZXIuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0V2hpbGUoV2hpbGUgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIFdoaWxlKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBXaGlsZSBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5jb25kaXRpb24sIG90aGVyLmNvbmRpdGlvbikgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS5ib2R5LCBvdGhlci5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGb3JJbihGb3JJbiBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgRm9ySW4pIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIEZvckluIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLmxlZnRIYW5kU2lkZSwgb3RoZXIubGVmdEhhbmRTaWRlKSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLm9iamVjdCwgb3RoZXIub2JqZWN0KSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLmJvZHksIG90aGVyLmJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEZvcihGb3Igbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIEZvcikgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgRm9yIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2Rlcyhub2RlLmluaXQsIG90aGVyLmluaXQpICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUuY29uZGl0aW9uLCBvdGhlci5jb25kaXRpb24pICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUudXBkYXRlLCBvdGhlci51cGRhdGUpICYmCiAgICAgICAgdGVzdE5vZGVzKG5vZGUuYm9keSwgb3RoZXIuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SWYoSWYgbm9kZSwgTm9kZSBhcmcpIHsKICAgIGlmIChhcmcgaXMhIElmKSByZXR1cm4gZmFpbEF0KG5vZGUsIGFyZyk7CiAgICBJZiBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5jb25kaXRpb24sIG90aGVyLmNvbmRpdGlvbikgJiYKICAgICAgICB0ZXN0Tm9kZXMobm9kZS50aGVuLCBvdGhlci50aGVuKSAmJgogICAgICAgIHRlc3ROb2Rlcyhub2RlLm90aGVyd2lzZSwgb3RoZXIub3RoZXJ3aXNlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgRW1wdHlTdGF0ZW1lbnQpIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgRXhwcmVzc2lvblN0YXRlbWVudCkgcmV0dXJuIGZhaWxBdChub2RlLCBhcmcpOwogICAgRXhwcmVzc2lvblN0YXRlbWVudCBvdGhlciA9IGFyZzsKICAgIHJldHVybiB0ZXN0Tm9kZXMobm9kZS5leHByZXNzaW9uLCBvdGhlci5leHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRCbG9jayhCbG9jayBub2RlLCBOb2RlIGFyZykgewogICAgaWYgKGFyZyBpcyEgQmxvY2spIHJldHVybiBmYWlsQXQobm9kZSwgYXJnKTsKICAgIEJsb2NrIG90aGVyID0gYXJnOwogICAgcmV0dXJuIHRlc3ROb2RlTGlzdHMobm9kZS5zdGF0ZW1lbnRzLCBvdGhlci5zdGF0ZW1lbnRzKTsKICB9Cn0KggAATk48ARABSz8eAToGUDABUEsYAUdLGAErLkUnBAE7EztADwYgKScpBhEEAQwuMxkxBAEMTkMpTwQBDEpBJ08EAQxIQCZPBAEMSkEnTwQBDEY/JU8EAQxMQihPBAEMLjMZQQQBDCoxFzkEAQw6OR9BBAEMMDQaLywEAQxCPSM9BAEMMjURBAEMQDwiOQQBDCgwFjkEAQw2Nx1DBAEMRj8lMwQBDDY3EQQBDDo5Hz0EAQw6OR89BAEMNjcdPQQBDDw6ID0EAQw8OiA9BAEMRD4kLwQBDCYvFTcsSgQBDDo5Hy8yBAEMNDogNzIEAQwyNRs7BAEMRj8lPUYEAQwoMBEEAQw2Nx07BAEMLjMZOTIEAQwsMhg5MgQBDCwyGC82LAQBDCgwFjM4BAEMJi8VMzgEAQw2Nx05LDQEAQxMQig9PDYsBAEMNDYcPzYsBAEMTkMpQQQBDEI9I0UyBAEMMjUbOz4EAQxAPCI7BAEMQDwiPyoEAQxGPyUvMgQBDC4zGS0EAQwoMBY7KgQBDCwyGC0wBAEMKjEXPSoEAQwmLxUvNjgEAQwqMRc5BAEMLDIYLwQBDCoxF0kEAQwwNBpJBAEMJC4UOSoEAQwqMRc5KgQBDCoxFz8wKgQBDCYvFS82MCoEAQwkLhQ5LDQEAQw8OhEEAQxGPyU5BAEMKjEXPQQCAStwYWNrYWdlOmpzX2FzdC9zcmMvZXF1aXZhbGVuY2VfdmlzaXRvci5kYXJ0LnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzL2pzX2RlYnVnLmRhcnSISy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gSGVscGVyIGZvciBkZWJ1ZyBKUyBub2Rlcy4KCmxpYnJhcnkganMuZGVidWc7CgppbXBvcnQgJ3BhY2thZ2U6anNfYXN0L2pzX2FzdC5kYXJ0JzsKCmltcG9ydCAnLi4vaW8vY29kZV9vdXRwdXQuZGFydCcgc2hvdyBCdWZmZXJlZENvZGVPdXRwdXQ7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgSW5kZW50YXRpb24sIFRhZ2dpbmc7CgovLy8gVW5wYXJzZSB0aGUgSmF2YVNjcmlwdCBbbm9kZV0uClN0cmluZyBub2RlVG9TdHJpbmcoTm9kZSBub2RlLCB7Ym9vbCBwcmV0dHk6IGZhbHNlfSkgewogIEphdmFTY3JpcHRQcmludGluZ09wdGlvbnMgb3B0aW9ucyA9IG5ldyBKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zKAogICAgICBzaG91bGRDb21wcmVzc091dHB1dDogIXByZXR0eSwKICAgICAgcHJlZmVyU2VtaWNvbG9uVG9OZXdsaW5lSW5NaW5pZmllZE91dHB1dDogIXByZXR0eSk7CiAgTGVuaWVudFByaW50aW5nQ29udGV4dCBwcmludGluZ0NvbnRleHQgPSBuZXcgTGVuaWVudFByaW50aW5nQ29udGV4dCgpOwogIG5ldyBQcmludGVyKG9wdGlvbnMsIHByaW50aW5nQ29udGV4dCkudmlzaXQobm9kZSk7CiAgcmV0dXJuIHByaW50aW5nQ29udGV4dC5nZXRUZXh0KCk7Cn0KCi8vLyBWaXNpdG9yIHRoYXQgY3JlYXRlcyBhbiBYTUwtbGlrZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RydWN0dXJlIG9mIGEKLy8vIEphdmFTY3JpcHQgW05vZGVdLgpjbGFzcyBEZWJ1Z1ByaW50ZXIgZXh0ZW5kcyBCYXNlVmlzaXRvciB3aXRoIEluZGVudGF0aW9uLCBUYWdnaW5nPE5vZGU+IHsKICBAb3ZlcnJpZGUKICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgogIHZvaWQgdmlzaXROb2RlV2l0aENoaWxkcmVuKE5vZGUgbm9kZSwgU3RyaW5nIHR5cGUsIFtNYXAgcGFyYW1zXSkgewogICAgb3Blbk5vZGUobm9kZSwgdHlwZSwgcGFyYW1zKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIGNsb3NlTm9kZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE5vZGUoTm9kZSBub2RlKSB7CiAgICB2aXNpdE5vZGVXaXRoQ2hpbGRyZW4obm9kZSwgJyR7bm9kZS5ydW50aW1lVHlwZX0nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROYW1lKE5hbWUgbm9kZSkgewogICAgb3BlbkFuZENsb3NlTm9kZShub2RlLCAnJHtub2RlLnJ1bnRpbWVUeXBlfScsIHsnbmFtZSc6IG5vZGUubmFtZX0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJpbmFyeShCaW5hcnkgbm9kZSkgewogICAgdmlzaXROb2RlV2l0aENoaWxkcmVuKG5vZGUsICcke25vZGUucnVudGltZVR5cGV9JywgeydvcCc6IG5vZGUub3B9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXRlcmFsU3RyaW5nKExpdGVyYWxTdHJpbmcgbm9kZSkgewogICAgb3BlbkFuZENsb3NlTm9kZShub2RlLCAnJHtub2RlLnJ1bnRpbWVUeXBlfScsIHsndmFsdWUnOiBub2RlLnZhbHVlfSk7CiAgfQoKICAvLy8gUHJldHR5LXByaW50cyBnaXZlbiBub2RlIHRyZWUgaW50byBzdHJpbmcuCiAgc3RhdGljIFN0cmluZyBwcmV0dHlQcmludChOb2RlIG5vZGUpIHsKICAgIHZhciBwID0gbmV3IERlYnVnUHJpbnRlcigpOwogICAgbm9kZS5hY2NlcHQocCk7CiAgICByZXR1cm4gcC5zYi50b1N0cmluZygpOwogIH0KfQoKLy8vIFNpbXBsZSBwcmludGluZyBjb250ZXh0IHRoYXQgZG9lc24ndCB0aHJvdyBvbiBlcnJvcnMuCmNsYXNzIExlbmllbnRQcmludGluZ0NvbnRleHQgZXh0ZW5kcyBTaW1wbGVKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0CiAgICBpbXBsZW1lbnRzIEJ1ZmZlcmVkQ29kZU91dHB1dCB7CiAgQG92ZXJyaWRlCiAgdm9pZCBlcnJvcihTdHJpbmcgbWVzc2FnZSkgewogICAgYnVmZmVyLndyaXRlKCc+PiRtZXNzYWdlPDwnKTsKICB9Cn0KSQBOTjwBHwESASUBOTYBIzdFJTpJNSQCAUoXSQwoAUUiHhEEAQweOAQBDB5IBAEMIkkEAQwwSgQBMSkgFBwEAgE6RSQMHyIEAgElcGFja2FnZTpjb21waWxlci9zcmMvanMvanNfZGVidWcuZGFydERzZGtyb290Oi9zZGsvbGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9zaGFyZWQvZW1iZWRkZWRfbmFtZXMuZGFydLzzLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBDb250YWlucyB0aGUgbmFtZXMgb2YgZ2xvYmFscyB0aGF0IGFyZSBlbWJlZGRlZCBpbnRvIHRoZSBvdXRwdXQgYnkgdGhlCi8vLyBjb21waWxlci4KLy8vCi8vLyBWYXJpYWJsZXMgZW1iZWRkZWQgdGhpcyB3YXkgc2hvdWxkIGJlIGFjY2VzcyB3aXRoIGBKU19FTUJFRERFRF9HTE9CQUxgIGZyb20KLy8vIHRoZSBgX2ZvcmVpZ25faGVscGVyYCBsaWJyYXJ5LgovLy8KLy8vIFRoaXMgbGlicmFyeSBpcyBzaGFyZWQgYmV0d2VlbiB0aGUgY29tcGlsZXIgYW5kIHRoZSBydW50aW1lIHN5c3RlbS4KbGlicmFyeSBkYXJ0MmpzLl9lbWJlZGRlZF9uYW1lczsKCi8vLyBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBpcyB1c2VkIHRvIG1hcmsgYSB0eXBlIGFzIHR5cGVkZWYuCi8vLwovLy8gV2l0aG91dCByZWZsZWN0aW9uIHR5cGVkZWZzIGFyZSByZW1vdmVkIChleHBhbmRlZCB0byB0aGVpciBmdW5jdGlvbiB0eXBlKQovLy8gYnV0IHdpdGggcmVmbGVjdGlvbiBhbiBvYmplY3QgaXMgbmVlZGVkIHRvIGhhdmUgdGhlIHR5cGVkZWYncyBuYW1lLiBUaGUKLy8vIG9iamVjdCBpcyBtYXJrZWQgd2l0aCB0aGlzIHByb3BlcnR5LgovLy8KLy8vIFRoaXMgcHJvcGVydHkgbmFtZSBvbmx5IGxpdmVzIG9uIGludGVybmFsIHR5cGUtb2JqZWN0cyBhbmQgaXMgb25seSB1c2VkCi8vLyB3aGVuIHJlZmxlY3Rpb24gaXMgZW5hYmxlZC4KY29uc3QgVFlQRURFRl9QUkVESUNBVEVfUFJPUEVSVFlfTkFNRSA9IHIiJCRpc1R5cGVkZWYiOwoKLy8vIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGlzIHVzZWQgdG8gZmluZCB0aGUgZnVuY3Rpb24gdHlwZSBvZiBhCi8vLyB0eXBlZGVmLgovLy8KLy8vIFdpdGhvdXQgcmVmbGVjdGlvbiB0eXBlZGVmcyBhcmUgcmVtb3ZlZCAoZXhwYW5kZWQgdG8gdGhlaXIgZnVuY3Rpb24gdHlwZSkKLy8vIGJ1dCB3aXRoIHJlZmxlY3Rpb24gYW4gb2JqZWN0IGlzIG5lZWRlZCB0byBoYXZlIHRoZSB0eXBlZGVmJ3MgbmFtZS4KLy8vCi8vLyBUaGUgdHlwZWRlZidzIG9iamVjdCBjb250YWlucyBhIHBvaW50ZXIgdG8gaXRzIGZ1bmN0aW9uIHR5cGUgKGFzIGFuIGluZGV4Ci8vLyBpbnRvIHRoZSBlbWJlZGRlZCBnbG9iYWwgW1RZUEVTXSkgaW4gdGhpcyBwcm9wZXJ0eS4KLy8vCi8vLyBUaGlzIHByb3BlcnR5IG5hbWUgb25seSBsaXZlcyBvbiBpbnRlcm5hbCB0eXBlLW9iamVjdHMgYW5kIGlzIG9ubHkgdXNlZAovLy8gd2hlbiByZWZsZWN0aW9uIGlzIGVuYWJsZWQuCmNvbnN0IFRZUEVERUZfVFlQRV9QUk9QRVJUWV9OQU1FID0gciIkdHlwZWRlZlR5cGUiOwoKLy8vIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGlzIHVzZWQgdG8gZmluZCB0aGUgbmF0aXZlIHN1cGVyY2xhc3Mgb2YKLy8vIGFuIGV4dGVuZGVkIGNsYXNzLgovLy8KLy8vIEV2ZXJ5IGNsYXNzIHRoYXQgZXh0ZW5kcyBhIG5hdGl2ZSBjbGFzcyBoYXMgdGhpcyBwcm9wZXJ0eSBzZXQgb24gaXRzCi8vLyBuYXRpdmUgY2xhc3MuCmNvbnN0IE5BVElWRV9TVVBFUkNMQVNTX1RBR19OQU1FID0gciIkbmF0aXZlU3VwZXJjbGFzc1RhZyI7CgovLy8gVGhlIG5hbWUgb2YgdGhlIHN0YXRpYy1mdW5jdGlvbiBwcm9wZXJ0eSBuYW1lLgovLy8KLy8vIFRoaXMgcHJvcGVydHkgaXMgc2V0IGZvciBhbGwgdGVhci1vZmZzIG9mIHN0YXRpYyBmdW5jdGlvbnMsIGFuZCBwcm92aWRlcwovLy8gdGhlIHN0YXRpYyBmdW5jdGlvbidzIHVuaXF1ZSAocG90ZW50aWFsbHkgbWluaWZpZWQpIG5hbWUuCmNvbnN0IFNUQVRJQ19GVU5DVElPTl9OQU1FX1BST1BFUlRZX05BTUUgPSByJyRzdGF0aWNfbmFtZSc7CgovLy8gVGhlIG5hbWUgb2YgdGhlIGVtYmVkZGVkIGdsb2JhbCBmb3IgbWV0YWRhdGEuCi8vLwovLy8gVXNlIFtKc0J1aWx0aW4uZ2V0TWV0YWRhdGFdIGluc3RlYWQgb2YgZGlyZWN0bHkgYWNjZXNzaW5nIHRoaXMgZW1iZWRkZWQKLy8vIGdsb2JhbC4KY29uc3QgTUVUQURBVEEgPSAnbWV0YWRhdGEnOwoKLy8vIEEgbGlzdCBvZiB0eXBlcyB1c2VkIGluIHRoZSBwcm9ncmFtIGUuZy4gZm9yIHJlZmxlY3Rpb24gb3IgZW5jb2Rpbmcgb2YKLy8vIGZ1bmN0aW9uIHR5cGVzLgovLy8KLy8vIFVzZSBbSnNCdWlsdGluLmdldFR5cGVdIGluc3RlYWQgb2YgZGlyZWN0bHkgYWNjZXNzaW5nIHRoaXMgZW1iZWRkZWQgZ2xvYmFsLgpjb25zdCBUWVBFUyA9ICd0eXBlcyc7CgovLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgbWFwcyBhIG5hbWUgb2YgYSBjbGFzcyB0byBpdHMgdHlwZS4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyB1c2VkIGJ5IHRoZSBydW50aW1lIHdoZW4gY29tcHV0aW5nIHRoZSBpbnRlcm5hbAovLy8gcnVudGltZS10eXBlLWluZm9ybWF0aW9uIChydGkpIG9iamVjdC4KY29uc3QgR0VUX1RZUEVfRlJPTV9OQU1FID0gJ2dldFR5cGVGcm9tTmFtZSc7CgovLy8gQSBKUyBtYXAgZnJvbSBtYW5nbGVkIGdsb2JhbCBuYW1lcyB0byB0aGVpciB1bm1hbmdsZWQgbmFtZXMuCi8vLwovLy8gSWYgdGhlIHByb2dyYW0gZG9lcyBub3QgdXNlIHJlZmxlY3Rpb24sIHRoaXMgZW1iZWRkZWQgZ2xvYmFsIG1heSBiZSBlbXB0eQovLy8gKGJ1dCBub3QgbnVsbCBvciB1bmRlZmluZWQpLgpjb25zdCBNQU5HTEVEX0dMT0JBTF9OQU1FUyA9ICdtYW5nbGVkR2xvYmFsTmFtZXMnOwoKLy8vIEEgSlMgbWFwIGZyb20gbWFuZ2xlZCBpbnN0YW5jZSBuYW1lcyB0byB0aGVpciB1bm1hbmdsZWQgbmFtZXMuCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgbWFpbmx5IHVzZWQgZm9yIHJlZmxlY3Rpb24sIGJ1dCBpcyBhbHNvIHVzZWQgdG8KLy8vIG1hcCBjb25zdC1zeW1ib2xzIChgY29uc3QgU3ltYm9sKCd4JylgKSB0byB0aGUgbWFuZ2xlZCBpbnN0YW5jZSBuYW1lcy4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBtYXkgYmUgZW1wdHkgKGJ1dCBub3QgbnVsbCBvciB1bmRlZmluZWQpLgpjb25zdCBNQU5HTEVEX05BTUVTID0gJ21hbmdsZWROYW1lcyc7CgovLy8gQSBKUyBtYXAgZnJvbSBkaXNwYXRjaCB0YWdzICh1c3VhbGx5IGNvbnN0cnVjdG9yIG5hbWVzIG9mIERPTSBjbGFzc2VzKSB0bwovLy8gaW50ZXJjZXB0b3IgY2xhc3MuIFRoaXMgbWFwIGlzIHVzZWQgdG8gZmluZCB0aGUgY29ycmVjdCBpbnRlcmNlcHRvciBmb3IKLy8vIG5hdGl2ZSBjbGFzc2VzLgovLy8KLy8vIFRoaXMgZW1iZWRkZWQgZ2xvYmFsIGlzIHVzZWQgZm9yIG5hdGl2ZXMuCmNvbnN0IElOVEVSQ0VQVE9SU19CWV9UQUcgPSAnaW50ZXJjZXB0b3JzQnlUYWcnOwoKLy8vIEEgSlMgbWFwIGZyb20gZGlzcGF0Y2ggdGFncyAodXN1YWxseSBjb25zdHJ1Y3RvciBuYW1lcyBvZiBET00gY2xhc3NlcykgdG8KLy8vIGJvb2xlYW5zLiBFdmVyeSB0YWcgZW50cnkgb2YgW0lOVEVSQ0VQVE9SU19CWV9UQUddIGhhcyBhIGNvcnJlc3BvbmRpbmcKLy8vIGVudHJ5IGluIHRoZSBsZWFmLXRhZ3MgbWFwLgovLy8KLy8vIEEgdGFnLWVudHJ5IGlzIHRydWUsIHdoZW4gYSBjbGFzcyBjYW4gYmUgdHJlYXRlZCBhcyBsZWFmIGNsYXNzIGluIHRoZQovLy8gaGllcmFyY2h5LiBUaGF0IGlzLCBldmVuIHRob3VnaCBpdCBtaWdodCBoYXZlIHN1YmNsYXNzZXMsIGFsbCBzdWJjbGFzc2VzCi8vLyBoYXZlIHRoZSBzYW1lIGNvZGUgZm9yIHRoZSB1c2VkIG1ldGhvZHMuCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgdXNlZCBmb3IgbmF0aXZlcy4KY29uc3QgTEVBRl9UQUdTID0gJ2xlYWZUYWdzJzsKCi8vLyBBIEpTIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgaXNvbGF0ZSB0YWcgZm9yIGEgZ2l2ZW4gbmFtZS4KLy8vCi8vLyBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIFtJU09MQVRFX1RBR10gKGJlbG93KSB0byBjb25zdHJ1Y3QgYSBuYW1lIHRoYXQgaXMKLy8vIHVuaXF1ZSBwZXIgaXNvbGF0ZS4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyB1c2VkIGZvciBuYXRpdmVzLgovLyBUT0RPKGZsb2l0c2NoKTogc2hvdWxkIHdlIHJlbmFtZSB0aGlzIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoCi8vICAgIFtJTlRFUkNFUFRPUlNfQllfVEFHXSBhbmQgW0xFQUZfVEFHU10uCmNvbnN0IEdFVF9JU09MQVRFX1RBRyA9ICdnZXRJc29sYXRlVGFnJzsKCi8vLyBBIHN0cmluZyB0aGF0IGlzIGRpZmZlcmVudCBmb3IgZWFjaCBydW5uaW5nIGlzb2xhdGUuCi8vLwovLy8gV2hlbiB0aGlzIGVtYmVkZGVkIGdsb2JhbCBpcyBpbml0aWFsaXplZCBhIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIHRvCi8vLyBlbnN1cmUgdGhhdCBubyBvdGhlciBydW5uaW5nIGlzb2xhdGUgdXNlcyB0aGUgc2FtZSBpc29sYXRlLXRhZyBzdHJpbmcuCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgdXNlZCBmb3IgbmF0aXZlcy4KLy8gVE9ETyhmbG9pdHNjaCk6IHNob3VsZCB3ZSByZW5hbWUgdGhpcyB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpb24gd2l0aAovLyAgICBbSU5URVJDRVBUT1JTX0JZX1RBR10gYW5kIFtMRUFGX1RBR1NdLgpjb25zdCBJU09MQVRFX1RBRyA9ICdpc29sYXRlVGFnJzsKCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCAoYSBmdW5jdGlvbikgcmV0dXJucyB0aGUgaXNvbGF0ZS1zcGVjaWZpYyBkaXNwYXRjaC10YWcKLy8vIHRoYXQgaXMgdXNlZCB0byBhY2NlbGVyYXRlIGludGVyY2VwdG9yIGNhbGxzLgpjb25zdCBESVNQQVRDSF9QUk9QRVJUWV9OQU1FID0gImRpc3BhdGNoUHJvcGVydHlOYW1lIjsKCi8vLyBBbiBlbWJlZGRlZCBnbG9iYWwgdGhhdCBtYXBzIGEgW1R5cGVdIHRvIHRoZSBbSW50ZXJjZXB0b3JdIGFuZCBjb25zdHJ1Y3RvcnMKLy8vIGZvciB0aGF0IHR5cGUuCi8vLwovLy8gTW9yZSBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUgaW50ZXJjZXB0b3JzIGxpYnJhcnkgKGNsb3NlIHRvIGl0cwovLy8gdXNlKS4KY29uc3QgVFlQRV9UT19JTlRFUkNFUFRPUl9NQVAgPSAidHlwZVRvSW50ZXJjZXB0b3JNYXAiOwoKLy8vIFRoZSBjdXJyZW50IHNjcmlwdCdzIFVSSSB3aGVuIHRoZSBwcm9ncmFtIHdhcyBsb2FkZWQuCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgc2V0IGF0IHN0YXJ0dXAsIGp1c3QgYmVmb3JlIGludm9raW5nIGBtYWluYC4KY29uc3QgQ1VSUkVOVF9TQ1JJUFQgPSAnY3VycmVudFNjcmlwdCc7CgovLy8gQ29udGFpbnMgYSBtYXAgZnJvbSBsb2FkLWlkcyB0byBsaXN0cyBvZiBwYXJ0IGluZGV4ZXMuCi8vLwovLy8gVG8gbG9hZCB0aGUgZGVmZXJyZWQgbGlicmFyeSB0aGF0IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBsb2FkLWlkLCB0aGUgcnVudGltZQovLy8gbXVzdCBsb2FkIGFsbCBhc3NvY2lhdGVkIFVSSXMgKG5hbWVkIGluIERFRkVSUkVEX1BBUlRfVVJJUykgYW5kIGluaXRpYWxpemUKLy8vIGFsbCB0aGUgbG9hZGVkIGh1bmtzIChERUZFUlJFRF9QQVJUX0hBU0hFUykuCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgb25seSB1c2VkIGZvciBkZWZlcnJlZCBsb2FkaW5nLgpjb25zdCBERUZFUlJFRF9MSUJSQVJZX1BBUlRTID0gJ2RlZmVycmVkTGlicmFyeVBhcnRzJzsKCi8vLyBDb250YWlucyBhIGxpc3Qgb2YgVVJJcyAoU3RyaW5ncyksIGluZGV4ZWQgYnkgcGFydC4KLy8vCi8vLyBUaGUgbGlzdHMgaW4gdGhlIERFRkVSUkVEX0xJQlJBUllfUEFSVFMgbWFwIGNvbnRhaW4gaW5kZXhlcyBpbnRvIHRoaXMgbGlzdC4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyBvbmx5IHVzZWQgZm9yIGRlZmVycmVkIGxvYWRpbmcuCmNvbnN0IERFRkVSUkVEX1BBUlRfVVJJUyA9ICdkZWZlcnJlZFBhcnRVcmlzJzsKCi8vLyBDb250YWlucyBhIGxpc3Qgb2YgaGFzaGVzLCBpbmRleGVkIGJ5IHBhcnQuCi8vLwovLy8gVGhlIGxpc3RzIGluIHRoZSBERUZFUlJFRF9MSUJSQVJZX1BBUlRTIG1hcCBjb250YWluIGluZGV4ZXMgaW50byB0aGlzIGxpc3QuCi8vLwovLy8gVGhlIGhhc2hlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBVUklzIG9mIHRoZSBsb2FkLWlkcyAoc2VlCi8vLyBbREVGRVJSRURfUEFSVF9VUklTXSkuIFRoZXkgYXJlIFNIQTEgKG9yIHNpbWlsYXIpIGhhc2hlcyBvZiB0aGUgY29kZSB0aGF0Ci8vLyBtdXN0IGJlIGxvYWRlZC4gQnkgdXNpbmcgY3J5cHRvZ3JhcGhpYyBoYXNoZXMgd2UgY2FuICgxKSBoYW5kbGUgbG9hZGluZyBpbgovLy8gdGhlIHNhbWUgd2ViIHBhZ2UgdGhlIHBhcnRzIGZyb20gbXVsdGlwbGUgRGFydCBhcHBsaWNhdGlvbnMgKDIpIGF2b2lkCi8vLyBsb2FkaW5nIHNpbWlsYXIgY29kZSBtdWx0aXBsZSB0aW1lcy4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyBvbmx5IHVzZWQgZm9yIGRlZmVycmVkIGxvYWRpbmcuCmNvbnN0IERFRkVSUkVEX1BBUlRfSEFTSEVTID0gJ2RlZmVycmVkUGFydEhhc2hlcyc7CgovLy8gSW5pdGlhbGl6ZSBhIGxvYWRlZCBodW5rLgovLy8KLy8vIE9uY2UgYSBodW5rICh0aGUgY29kZSBmcm9tIGEgZGVmZXJyZWQgVVJJKSBoYXMgYmVlbiBsb2FkZWQgaXQgbXVzdCBiZQovLy8gaW5pdGlhbGl6ZWQuIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGhhc2ggKHNlZQovLy8gW0RFRkVSUkVEX0xJQlJBUllfSEFTSEVTXSkgaW5pdGlhbGl6ZXMgdGhlIGNvZGUuCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgb25seSB1c2VkIGZvciBkZWZlcnJlZCBsb2FkaW5nLgpjb25zdCBJTklUSUFMSVpFX0xPQURFRF9IVU5LID0gJ2luaXRpYWxpemVMb2FkZWRIdW5rJzsKCi8vLyBSZXR1cm5zLCB3aGV0aGVyIGEgaHVuayAoaWRlbnRpZmllZCBieSBpdHMgaGFzaCkgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQuCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgb25seSB1c2VkIGZvciBkZWZlcnJlZCBsb2FkaW5nLgpjb25zdCBJU19IVU5LX0xPQURFRCA9ICdpc0h1bmtMb2FkZWQnOwoKLy8vIFJldHVybnMsIHdoZXRoZXIgYSBodW5rIChpZGVudGlmaWVkIGJ5IGl0cyBoYXNoKSBoYXMgYWxyZWFkeSBiZWVuCi8vLyBpbml0aWFsaXplZC4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyBvbmx5IHVzZWQgZm9yIGRlZmVycmVkIGxvYWRpbmcuCmNvbnN0IElTX0hVTktfSU5JVElBTElaRUQgPSAnaXNIdW5rSW5pdGlhbGl6ZWQnOwoKLy8vIEEgc2V0IChpbXBsZW1lbnRlZCBhcyBtYXAgdG8gYm9vbGVhbnMpIG9mIGh1bmtzIChpZGVudGlmaWVkIGJ5IGhhc2hlcykgdGhhdAovLy8gaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgb25seSB1c2VkIGZvciBkZWZlcnJlZCBsb2FkaW5nLgovLy8KLy8vIFRoaXMgZ2xvYmFsIGlzIGFuIGVtaXR0ZXItaW50ZXJuYWwgZW1iZWRkZWQgZ2xvYmFsLCBhbmQgbm90IHVzZWQgYnkgdGhlCi8vLyBydW50aW1lLiBUaGUgY29uc3RhbnQgcmVtYWlucyBpbiB0aGlzIGZpbGUgdG8gbWFrZSBzdXJlIHRoYXQgb3RoZXIgZW1iZWRkZWQKLy8vIGdsb2JhbHMgZG9uJ3QgY2xhc2ggd2l0aCBpdC4KY29uc3QgREVGRVJSRURfSU5JVElBTElaRUQgPSAnZGVmZXJyZWRJbml0aWFsaXplZCc7CgovLy8gQSAnVW5pdmVyc2UnIG9iamVjdCB1c2VkIGJ5ICdkYXJ0Ol9ydGknLgovLy8KLy8vIFRoaXMgZW1iZWRkZWQgZ2xvYmFsIGlzIHVzZWQgZm9yIC0tZXhwZXJpbWVudC1uZXctcnRpLgpjb25zdCBSVElfVU5JVkVSU0UgPSAndHlwZVVuaXZlcnNlJzsKCi8vLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFsbCBwcmVjb21waWxlZCBmdW5jdGlvbnMgKGluIHBhcnRpY3VsYXIKLy8vIGNvbnN0cnVjdG9ycykuCi8vLwovLy8gVGhhdCBpcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFycmF5IHRoYXQgdGhlIGZ1bGwgZW1pdHRlciB3b3VsZAovLy8gb3RoZXJ3aXNlIGJ1aWxkIGR5bmFtaWNhbGx5IHdoZW4gaXQgZmluaXNoZXMgYWxsIGNsYXNzZXMuCi8vLwovLy8gVGhpcyBjb25zdGFudCBpcyBvbmx5IHVzZWQgaW4gQ1NQIG1vZGUuCi8vLwovLy8gVGhpcyBnbG9iYWwgaXMgYW4gZW1pdHRlci1pbnRlcm5hbCBlbWJlZGRlZCBnbG9iYWwsIGFuZCBub3QgdXNlZCBieSB0aGUKLy8vIHJ1bnRpbWUuIFRoZSBjb25zdGFudCByZW1haW5zIGluIHRoaXMgZmlsZSB0byBtYWtlIHN1cmUgdGhhdCBvdGhlciBlbWJlZGRlZAovLy8gZ2xvYmFscyBkb24ndCBjbGFzaCB3aXRoIGl0Lgpjb25zdCBQUkVDT01QSUxFRCA9ICdwcmVjb21waWxlZCc7CgovLy8gQW4gZW1pdHRlci1pbnRlcm5hbCBlbWJlZGRlZCBnbG9iYWwuIFRoaXMgZ2xvYmFsIGlzIG5vdCB1c2VkIGJ5IHRoZSBydW50aW1lLgpjb25zdCBGSU5JU0hFRF9DTEFTU0VTID0gJ2ZpbmlzaGVkQ2xhc3Nlcyc7CgovLy8gQSBKYXZhU2NyaXB0IG9iamVjdCBsaXRlcmFsIHRoYXQgbWFwcyB0aGUgKG1pbmlmaWVkKSBKYXZhU2NyaXB0IGNvbnN0cnVjdG9yCi8vLyBuYW1lIChhcyBnaXZlbiBieSBbSnNCdWlsdGluLnJhd1J0aVRvSnNDb25zdHJ1Y3Rvck5hbWVdIHRvIHRoZQovLy8gSmF2YVNjcmlwdCBjb25zdHJ1Y3Rvci4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyBvbmx5IHVzZWQgYnkgcmVmbGVjdGlvbi4KY29uc3QgQUxMX0NMQVNTRVMgPSAnYWxsQ2xhc3Nlcyc7CgovLy8gQSBtYXAgZnJvbSBlbGVtZW50IHRvIHR5cGUgaW5mb3JtYXRpb24uCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgb25seSB1c2VkIGJ5IHJlZmxlY3Rpb24uCmNvbnN0IFRZUEVfSU5GT1JNQVRJT04gPSAndHlwZUluZm9ybWF0aW9uJzsKCi8vLyBBIG1hcCBmcm9tIHN0YXRpY3MgdG8gdGhlaXIgZGVzY3JpcHRvcnMuCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgb25seSB1c2VkIGJ5IHJlZmxlY3Rpb24uCmNvbnN0IFNUQVRJQ1MgPSAnc3RhdGljcyc7CgovLy8gQW4gYXJyYXkgb2YgbGlicmFyeSBkZXNjcmlwdG9ycy4KLy8vCi8vLyBUaGUgZGVzY3JpcHRvciBjb250YWlucyBpbmZvcm1hdGlvbiBzdWNoIGFzIG5hbWUsIHVyaSwgY2xhc3NlcywgLi4uCi8vLwovLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgaXMgb25seSB1c2VkIGJ5IHJlZmxlY3Rpb24uCmNvbnN0IExJQlJBUklFUyA9ICdsaWJyYXJpZXMnOwoKLy8vIEEgbWFwIGZyb20gbGF6eSBzdGF0aWNzIHRvIHRoZWlyIGluaXRpYWxpemVycy4KLy8vCi8vLyBUaGlzIGVtYmVkZGVkIGdsb2JhbCBpcyBvbmx5IHVzZWQgYnkgcmVmbGVjdGlvbi4KY29uc3QgTEFaSUVTID0gJ2xhemllcyc7CgovLy8gTmFtZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IFtKU19HRVRfTkFNRV0uCi8vIFRPRE8oaGVyaHV0KTogTWFrZSBlbnRyaWVzIGxvd2VyIGNhc2UgKGFzIGluIGZpZWxkcykgYW5kIGZpbmQgYSBiZXR0ZXIgbmFtZS4KZW51bSBKc0dldE5hbWUgewogIEdFVFRFUl9QUkVGSVgsCiAgU0VUVEVSX1BSRUZJWCwKICBDQUxMX1BSRUZJWCwKICBDQUxMX1BSRUZJWDAsCiAgQ0FMTF9QUkVGSVgxLAogIENBTExfUFJFRklYMiwKICBDQUxMX1BSRUZJWDMsCiAgQ0FMTF9QUkVGSVg0LAogIENBTExfUFJFRklYNSwKICBDQUxMX0NBVENIX0FMTCwKICBSRUZMRUNUQUJMRSwKICBDTEFTU19ERVNDUklQVE9SX1BST1BFUlRZLAogIFJFUVVJUkVEX1BBUkFNRVRFUl9QUk9QRVJUWSwKICBERUZBVUxUX1ZBTFVFU19QUk9QRVJUWSwKICBDQUxMX05BTUVfUFJPUEVSVFksCiAgREVGRVJSRURfQUNUSU9OX1BST1BFUlRZLAoKICAvLy8gUHJlZml4IHVzZWQgZm9yIGdlbmVyYXRlZCB0eXBlIGFyZ3VtZW50IHN1YnN0aXR1dGlvbnMgb24gY2xhc3Nlcy4KICBPUEVSQVRPUl9BU19QUkVGSVgsCgogIC8vLyBOYW1lIHVzZWQgZm9yIGdlbmVyYXRlZCBmdW5jdGlvbiB0eXBlcyBvbiBjbGFzc2VzIGFuZCBtZXRob2RzLgogIFNJR05BVFVSRV9OQU1FLAoKICAvLy8gTmFtZSBvZiBKYXZhU2NyaXB0IHByb3BlcnR5IHVzZWQgdG8gc3RvcmUgcnVudGltZS10eXBlIGluZm9ybWF0aW9uIG9uCiAgLy8vIGluc3RhbmNlcyBvZiBwYXJhbWV0ZXJpemVkIGNsYXNzZXMuCiAgUlRJX05BTUUsCgogIC8vLyBOYW1lIHVzZWQgdG8gdGFnIHR5cGVkZWZzLgogIFRZUEVERUZfVEFHLAoKICAvLy8gTmFtZSB1c2VkIHRvIHRhZyBhIGZ1bmN0aW9uIHR5cGUuCiAgRlVOQ1RJT05fVFlQRV9UQUcsCgogIC8vLyBOYW1lIHVzZWQgdG8gdGFnIGJvdW5kcyBvZiBhIGdlbmVyaWMgZnVuY3Rpb24gdHlwZS4gSWYgYm91bmRzIGFyZSBwcmVzZW50LAogIC8vLyB0aGUgcHJvcGVydHkgdmFsdWUgaXMgYW4gQXJyYXkgb2YgYm91bmRzICh0aGUgbGVuZ3RoIGdpdmVzIHRoZSBudW1iZXIgb2YKICAvLy8gdHlwZSBwYXJhbWV0ZXJzKS4gSWYgYWJzZW50LCB0aGUgdHlwZSBpcyBub3QgYSBnZW5lcmljIGZ1bmN0aW9uIHR5cGUuCiAgRlVOQ1RJT05fVFlQRV9HRU5FUklDX0JPVU5EU19UQUcsCgogIC8vLyBOYW1lIHVzZWQgdG8gdGFnIHZvaWQgcmV0dXJuIGluIGZ1bmN0aW9uIHR5cGUgcmVwcmVzZW50YXRpb25zIGluCiAgLy8vIEphdmFTY3JpcHQuCiAgRlVOQ1RJT05fVFlQRV9WT0lEX1JFVFVSTl9UQUcsCgogIC8vLyBOYW1lIHVzZWQgdG8gdGFnIHJldHVybiB0eXBlcyBpbiBmdW5jdGlvbiB0eXBlIHJlcHJlc2VudGF0aW9ucyBpbgogIC8vLyBKYXZhU2NyaXB0LgogIEZVTkNUSU9OX1RZUEVfUkVUVVJOX1RZUEVfVEFHLAoKICAvLy8gTmFtZSB1c2VkIHRvIHRhZyByZXF1aXJlZCBwYXJhbWV0ZXJzIGluIGZ1bmN0aW9uIHR5cGUgcmVwcmVzZW50YXRpb25zCiAgLy8vIGluIEphdmFTY3JpcHQuCiAgRlVOQ1RJT05fVFlQRV9SRVFVSVJFRF9QQVJBTUVURVJTX1RBRywKCiAgLy8vIE5hbWUgdXNlZCB0byB0YWcgb3B0aW9uYWwgcGFyYW1ldGVycyBpbiBmdW5jdGlvbiB0eXBlIHJlcHJlc2VudGF0aW9ucwogIC8vLyBpbiBKYXZhU2NyaXB0LgogIEZVTkNUSU9OX1RZUEVfT1BUSU9OQUxfUEFSQU1FVEVSU19UQUcsCgogIC8vLyBOYW1lIHVzZWQgdG8gdGFnIG5hbWVkIHBhcmFtZXRlcnMgaW4gZnVuY3Rpb24gdHlwZSByZXByZXNlbnRhdGlvbnMgaW4KICAvLy8gSmF2YVNjcmlwdC4KICBGVU5DVElPTl9UWVBFX05BTUVEX1BBUkFNRVRFUlNfVEFHLAoKICAvLy8gTmFtZSB1c2VkIHRvIHRhZyBhIEZ1dHVyZU9yIHR5cGUuCiAgRlVUVVJFX09SX1RBRywKCiAgLy8vIE5hbWUgdXNlZCB0byB0YWcgdHlwZSBhcmd1bWVudHMgdHlwZXMgaW4gRnV0dXJlT3IgdHlwZSByZXByZXNlbnRhdGlvbnMgaW4KICAvLy8gSmF2YVNjcmlwdC4KICBGVVRVUkVfT1JfVFlQRV9BUkdVTUVOVF9UQUcsCgogIC8vLyBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGUgb2YgdGhlIEZ1dHVyZSBjbGFzcy4KICBGVVRVUkVfQ0xBU1NfVFlQRV9OQU1FLAoKICAvLy8gRmllbGQgbmFtZSB1c2VkIGZvciBkZXRlcm1pbmluZyBpZiBhbiBvYmplY3Qgb3IgaXRzIGludGVyY2VwdG9yIGhhcwogIC8vLyBKYXZhU2NyaXB0IGluZGV4aW5nIGJlaGF2aW9yLgogIElTX0lOREVYQUJMRV9GSUVMRF9OQU1FLAoKICAvLy8gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIG9mIHRoZSBudWxsIGNsYXNzLgogIE5VTExfQ0xBU1NfVFlQRV9OQU1FLAoKICAvLy8gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgY2xhc3MuCiAgT0JKRUNUX0NMQVNTX1RZUEVfTkFNRSwKCiAgLy8vIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gY2xhc3MuCiAgRlVOQ1RJT05fQ0xBU1NfVFlQRV9OQU1FLAp9CgplbnVtIEpzQnVpbHRpbiB7CiAgLy8vIFJldHVybnMgdGhlIEphdmFTY3JpcHQgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIERhcnQncyBPYmplY3QgY2xhc3MuCiAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdHMsIGFzIGluCiAgLy8vCiAgLy8vICAgICB2YXIgY29uc3RydWN0b3IgPSBKU19CVUlMVElOKCcnLCBKc0J1aWx0aW4uZGFydE9iamVjdENvbnN0cnVjdG9yKTsKICAvLy8gICAgIGlmIChKUygnYm9vbCcsICcjIGluc3RhbmNlb2YgIycsIG9iaiwgY29uc3RydWN0b3IpKQogIC8vLyAgICAgICAuLi4KICBkYXJ0T2JqZWN0Q29uc3RydWN0b3IsCgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciB0aGUgcnVudGltZSdzIENsb3N1cmUKICAvLy8gY2xhc3MsIHRoZSBiYXNlIGNsYXNzIG9mIGFsbCBjbG9zdXJlIG9iamVjdHMuICBUaGlzIGNhbiBiZSB1c2VkIGZvciB0eXBlCiAgLy8vIHRlc3RzLCBhcyBpbgogIC8vLwogIC8vLyAgICAgdmFyIGNvbnN0cnVjdG9yID0gSlNfQlVJTFRJTignJywgSnNCdWlsdGluLmRhcnRDbG9zdXJlQ29uc3RydWN0b3IpOwogIC8vLyAgICAgaWYgKEpTKCdib29sJywgJyMgaW5zdGFuY2VvZiAjJywgb2JqLCBjb25zdHJ1Y3RvcikpCiAgLy8vICAgICAgIC4uLgogIGRhcnRDbG9zdXJlQ29uc3RydWN0b3IsCgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0LWNvbnN0cnVjdG9yIG5hbWUgZ2l2ZW4gYW4gW2lzQ2hlY2tQcm9wZXJ0eV0uCiAgLy8vCiAgLy8vIFRoaXMgcmVsaWVzIG9uIGEgZGV0ZXJtaW5pc3RpYyBlbmNvZGluZyBvZiBpcy1jaGVjayBwcm9wZXJ0aWVzIChmb3IKICAvLy8gZXhhbXBsZSBgJGlzRm9vYCBmb3IgYSBjbGFzcyBgRm9vYCkuIEluIG1pbmlmaWVkIGNvZGUgdGhlIHJldHVybmVkCiAgLy8vIGNsYXNzbmFtZSBpcyB0aGUgbWluaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MuCiAgLy8vCiAgLy8vICAgICBKU19CVUlMVElOKCdyZXR1cm5zOlN0cmluZztkZXBlbmRzOm5vbmU7ZWZmZWN0czpub25lJywKICAvLy8gICAgICAgICAgICAgICAgSnNCdWlsdGluLmlzQ2hlY2tQcm9wZXJ0eVRvSnNDb25zdHJ1Y3Rvck5hbWUsCiAgLy8vICAgICAgICAgICAgICAgIGlzQ2hlY2tQcm9wZXJ0eSk7CiAgaXNDaGVja1Byb3BlcnR5VG9Kc0NvbnN0cnVjdG9yTmFtZSwKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhIGZ1bmN0aW9uIHR5cGUuIFJldHVybnMgZmFsc2UgZm9yCiAgLy8vIHRoZSBvbmUgYEZ1bmN0aW9uYCB0eXBlIHNpbmdsZXRvbi4gKFNlZSBbaXNGdW5jdGlvblR5cGVTaW5nbGV0b25dKS4KICAvLy8KICAvLy8gICAgIEpTX0JVSUxUSU4oJ2Jvb2wnLCBKc0J1aWx0aW4uaXNGdW5jdGlvblR5cGUsIG8pCiAgaXNGdW5jdGlvblR5cGUsCgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgaXMgYSBGdXR1cmVPciB0eXBlLgogIC8vLwogIC8vLyAgICAgSlNfQlVJTFRJTignYm9vbCcsIEpzQnVpbHRpbi5pc0Z1dHVyZU9yVHlwZSwgbykKICBpc0Z1dHVyZU9yVHlwZSwKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyB0aGUgYHZvaWRgIHR5cGUuCiAgLy8vCiAgLy8vICAgICBKU19CVUlMVElOKCdib29sJywgSnNCdWlsdGluLmlzVm9pZFR5cGUsIG8pCiAgaXNWb2lkVHlwZSwKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyB0aGUgYGR5bmFtaWNgIHR5cGUuCiAgLy8vCiAgLy8vICAgICBKU19CVUlMVElOKCdib29sJywgSnNCdWlsdGluLmlzRHluYW1pY1R5cGUsIG8pCiAgaXNEeW5hbWljVHlwZSwKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhIHR5cGUgYXJndW1lbnQgb2YgYSBqcy1pbnRlcm9wIGNsYXNzCiAgLy8vIG9yIGEgc3VwZXJ0eXBlIG9mIGEganMtaW50ZXJvcCBjbGFzcy4KICAvLy8KICAvLy8gICAgIEpTX0JVSUxUSU4oJ2Jvb2wnLCBKc0J1aWx0aW4uaXNKc0ludGVyb3BUeXBlQXJndW1lbnQsIG8pCiAgaXNKc0ludGVyb3BUeXBlQXJndW1lbnQsCgogIC8vLyBSZXR1cm5zIHRoZSBKYXZhU2NyaXB0LWNvbnN0cnVjdG9yIG5hbWUgZ2l2ZW4gYW4gcnRpIGVuY29kaW5nLgogIC8vLwogIC8vLyAgICAgSlNfQlVJTFRJTignU3RyaW5nJywgSnNCdWlsdGluLnJhd1J0aVRvSnNDb25zdHJ1Y3Rvck5hbWUsIHJ0aSkKICByYXdSdGlUb0pzQ29uc3RydWN0b3JOYW1lLAoKICAvLy8gUmV0dXJucyB0aGUgcmF3IHJ1bnRpbWUgdHlwZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LiBUaGUgZ2l2ZW4gYXJndW1lbnQKICAvLy8gW29dIHNob3VsZCBiZSB0aGUgaW50ZXJjZXB0b3IgKGZvciBub24tRGFydCBvYmplY3RzKS4KICAvLy8KICAvLy8gICAgIEpTX0JVSUxUSU4oJycsIEpzQnVpbHRpbi5yYXdSdW50aW1lVHlwZSwgbykKICByYXdSdW50aW1lVHlwZSwKCiAgLy8vIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBpcyBhIHN1YnR5cGUgb2Ygb3RoZXIuCiAgLy8vCiAgLy8vIFRoZSBhcmd1bWVudCBgb3RoZXJgIGlzIHRoZSBuYW1lIG9mIHRoZSBwb3RlbnRpYWwgc3VwZXJ0eXBlLiBJdCBpcwogIC8vLyBjb21wdXRlZCBieSBgcnVudGltZVR5cGVUb1N0cmluZ2A7CiAgLy8vCiAgLy8vICpUaGUgYG90aGVyYCBuYW1lIG11c3QgYmUgcGFzc2VkIGluIGJlZm9yZSB0aGUgYHR5cGVgLioKICAvLy8KICAvLy8gICAgIEpTX0JVSUxUSU4oJ3JldHVybnM6Ym9vbDtlZmZlY3RzOm5vbmU7ZGVwZW5kczpub25lJywKICAvLy8gICAgICAgICAgICAgICAgSnNCdWlsdGluLmlzU3VidHlwZSwgb3RoZXIsIHR5cGUpOwogIGlzU3VidHlwZSwKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBlcXVhbHMgdGhlIHR5cGUgZ2l2ZW4gYXMgc2Vjb25kCiAgLy8vIGFyZ3VtZW50LiBVc2UgdGhlIEpTX0dFVF9OQU1FIGhlbHBlcnMgdG8gZ2V0IHRoZSB0eXBlIHJlcHJlc2VudGF0aW9uCiAgLy8vIGZvciB2YXJpb3VzIERhcnQgY2xhc3Nlcy4KICAvLy8KICAvLy8gICAgIEpTX0JVSUxUSU4oJ3JldHVybnM6Ym9vbDtlZmZlY3RzOm5vbmU7ZGVwZW5kczpub25lJywKICAvLy8gICAgICAgICAgICAgICAgSnNCdWlsdGluLmlzRnVuY3Rpb25UeXBlTGl0ZXJhbCwgdHlwZSwgbmFtZSk7CiAgaXNHaXZlblR5cGVSdGksCgogIC8vLyBSZXR1cm5zIHRoZSBtZXRhZGF0YSBvZiB0aGUgZ2l2ZW4gW2luZGV4XS4KICAvLy8KICAvLy8gICAgIEpTX0JVSUxUSU4oJ3JldHVybnM6dmFyO2VmZmVjdHM6bm9uZTtkZXBlbmRzOm5vbmUnLAogIC8vLyAgICAgICAgICAgICAgICBKc0J1aWx0aW4uZ2V0TWV0YWRhdGEsIGluZGV4KTsKICBnZXRNZXRhZGF0YSwKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIFtpbmRleF0uCiAgLy8vCiAgLy8vICAgICBKU19CVUlMVElOKCdyZXR1cm5zOnZhcjtlZmZlY3RzOm5vbmU7ZGVwZW5kczpub25lJywKICAvLy8gICAgICAgICAgICAgICAgSnNCdWlsdGluLmdldFR5cGUsIGluZGV4KTsKICBnZXRUeXBlLAp9CgovLy8gTmFtZXMgb2YgZmllbGRzIG9mIHRoZSBSdGkgVW5pdmVyc2Ugb2JqZWN0LgpjbGFzcyBSdGlVbml2ZXJzZUZpZWxkTmFtZXMgewogIHN0YXRpYyBTdHJpbmcgZXZhbENhY2hlID0gJ2VDJzsKICBzdGF0aWMgU3RyaW5nIHR5cGVSdWxlcyA9ICd0Uic7CiAgc3RhdGljIFN0cmluZyBzaGFyZWRFbXB0eUFycmF5ID0gJ3NFQSc7Cn0KgbQATk48AUsOBFAjBEghAUUETkwpBEwgOAFJDQROSAROOARMIDQBSxcESRI8ATMETT48ATIETAwdAUsUBFAXAUAETCsuAUEETiEzAUMETEsEQyYBTkwUBC4xAU5LIARKTS0ELh4BQQRNGAQuSi0pATkESksELkotIgFQMjcBUBMETgo4AToESSgBOwRRTzEEPDcBOARQBDwvATAEUARBTk9KKQQ8MwEeBEpINQQ8NwFOBDwnAUYRBDwxAVAjBDwETFAhNAEtBDslAU0TBEg+BCwETFAhIwFRLAFQQxwENSIBLAQ1LAEtBDUbASUESAQ1HwEzBDUZAS9QERERDxAQEBAQEBIPHR8bFhwBSBYBRRIBTCoMASEPASgVAVFPTCQBRxIhAUgSIQFMFSkBTBUpAUwSJgEoEQFQEh8BPRoBSiQbATsYAT0aAT8cAgERSy0GTT4QGQFMTxMGTj4QGgFKBkpJMwZBQycmAUtKBjoSATkGOhIBOQY2DgE8BjkRAU4sBkMbAUUGSR0BSzwGNhIBPAZJKQY+Bj84DQFFSyAGP0MSATEGPjQPAS0GPjALAgEwHiIiKgIBLXBhY2thZ2U6anNfcnVudGltZS9zaGFyZWQvZW1iZWRkZWRfbmFtZXMuZGFydCxzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9uYXRpdmUvanMuZGFydKRtLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganM7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2lkZV9lZmZlY3RzLmRhcnQnIHNob3cgU2lkZUVmZmVjdHM7CmltcG9ydCAnYmVoYXZpb3IuZGFydCc7CgpjbGFzcyBIYXNDYXB0dXJlZFBsYWNlaG9sZGVycyBleHRlbmRzIGpzLkJhc2VWaXNpdG9yIHsKICBIYXNDYXB0dXJlZFBsYWNlaG9sZGVycy5fKCk7CgogIHN0YXRpYyBib29sIGNoZWNrKGpzLk5vZGUgbm9kZSkgewogICAgSGFzQ2FwdHVyZWRQbGFjZWhvbGRlcnMgdmlzaXRvciA9IG5ldyBIYXNDYXB0dXJlZFBsYWNlaG9sZGVycy5fKCk7CiAgICBub2RlLmFjY2VwdCh2aXNpdG9yKTsKICAgIHJldHVybiB2aXNpdG9yLmZvdW5kOwogIH0KCiAgaW50IGVuY2xvc2luZ0Z1bmN0aW9ucyA9IDA7CiAgYm9vbCBmb3VuZCA9IGZhbHNlOwoKICBAb3ZlcnJpZGUKICB2aXNpdEZ1bihqcy5GdW4gbm9kZSkgewogICAgKytlbmNsb3NpbmdGdW5jdGlvbnM7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICAtLWVuY2xvc2luZ0Z1bmN0aW9uczsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0SW50ZXJwb2xhdGVkTm9kZShqcy5JbnRlcnBvbGF0ZWROb2RlIG5vZGUpIHsKICAgIGlmIChlbmNsb3NpbmdGdW5jdGlvbnMgPiAwKSB7CiAgICAgIGZvdW5kID0gdHJ1ZTsKICAgIH0KICB9Cn0KCmNsYXNzIFNpZGVFZmZlY3RzVmlzaXRvciBleHRlbmRzIGpzLkJhc2VWaXNpdG9yIHsKICBmaW5hbCBTaWRlRWZmZWN0cyBzaWRlRWZmZWN0czsKICBTaWRlRWZmZWN0c1Zpc2l0b3IodGhpcy5zaWRlRWZmZWN0cyk7CgogIHZvaWQgdmlzaXQoanMuTm9kZSBub2RlKSB7CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXRlcmFsRXhwcmVzc2lvbihqcy5MaXRlcmFsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBzaWRlRWZmZWN0cy5zZXRBbGxTaWRlRWZmZWN0cygpOwogICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uU29tZXRoaW5nKCk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGl0ZXJhbFN0YXRlbWVudChqcy5MaXRlcmFsU3RhdGVtZW50IG5vZGUpIHsKICAgIHNpZGVFZmZlY3RzLnNldEFsbFNpZGVFZmZlY3RzKCk7CiAgICBzaWRlRWZmZWN0cy5zZXREZXBlbmRzT25Tb21ldGhpbmcoKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBc3NpZ25tZW50KGpzLkFzc2lnbm1lbnQgbm9kZSkgewogICAgc2lkZUVmZmVjdHMuc2V0Q2hhbmdlc1N0YXRpY1Byb3BlcnR5KCk7CiAgICBzaWRlRWZmZWN0cy5zZXRDaGFuZ2VzSW5zdGFuY2VQcm9wZXJ0eSgpOwogICAgc2lkZUVmZmVjdHMuc2V0Q2hhbmdlc0luZGV4KCk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VmFyaWFibGVJbml0aWFsaXphdGlvbihqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uIG5vZGUpIHsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDYWxsKGpzLkNhbGwgbm9kZSkgewogICAgc2lkZUVmZmVjdHMuc2V0QWxsU2lkZUVmZmVjdHMoKTsKICAgIHNpZGVFZmZlY3RzLnNldERlcGVuZHNPblNvbWV0aGluZygpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJpbmFyeShqcy5CaW5hcnkgbm9kZSkgewogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRocm93KGpzLlRocm93IG5vZGUpIHsKICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogSW5jb3Jwb3JhdGUgYSBtYXlUaHJvdyBmbGFnIGluIHRoZQogICAgLy8gW1NpZGVFZmZlY3RzXSBjbGFzcy4KICAgIHNpZGVFZmZlY3RzLnNldEFsbFNpZGVFZmZlY3RzKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmV3KGpzLk5ldyBub2RlKSB7CiAgICBzaWRlRWZmZWN0cy5zZXRBbGxTaWRlRWZmZWN0cygpOwogICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uU29tZXRoaW5nKCk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJlZml4KGpzLlByZWZpeCBub2RlKSB7CiAgICBpZiAobm9kZS5vcCA9PSAnZGVsZXRlJykgewogICAgICBzaWRlRWZmZWN0cy5zZXRDaGFuZ2VzU3RhdGljUHJvcGVydHkoKTsKICAgICAgc2lkZUVmZmVjdHMuc2V0Q2hhbmdlc0luc3RhbmNlUHJvcGVydHkoKTsKICAgICAgc2lkZUVmZmVjdHMuc2V0Q2hhbmdlc0luZGV4KCk7CiAgICB9CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VmFyaWFibGVVc2UoanMuVmFyaWFibGVVc2Ugbm9kZSkgewogICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uU3RhdGljUHJvcGVydHlTdG9yZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFBvc3RmaXgoanMuUG9zdGZpeCBub2RlKSB7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QWNjZXNzKGpzLlByb3BlcnR5QWNjZXNzIG5vZGUpIHsKICAgIHNpZGVFZmZlY3RzLnNldERlcGVuZHNPbkluZGV4U3RvcmUoKTsKICAgIHNpZGVFZmZlY3RzLnNldERlcGVuZHNPbkluc3RhbmNlUHJvcGVydHlTdG9yZSgpOwogICAgc2lkZUVmZmVjdHMuc2V0RGVwZW5kc09uU3RhdGljUHJvcGVydHlTdG9yZSgpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KfQoKLy8vIFRocm93QmVoYXZpb3JWaXNpdG9yIGdlbmVyYXRlcyBhIE5hdGl2ZVRocm93QmVoYXZpb3IgZGVzY3JpYmluZyB0aGUKLy8vIGV4Y2VwdGlvbiBiZWhhdmlvciBvZiBhIEphdmFTY3JpcHQgZXhwcmVzc2lvbi4KLy8vCi8vLyBUaGUgcmVzdWx0IGlzIHNlbWktY29uc2VydmF0aXZlLCBnaXZpbmcgcmVhc29uYWJsZSByZXN1bHRzIGZvciBtYW55IHNpbXBsZQovLy8gSlMgZnJhZ21lbnRzLiBUaGUgbm9uLWNvbnNlcnZhdGl2ZSBwYXJ0IGlzIHRoZSBhc3N1bXB0aW9uIHRoYXQgYmluYXJ5Ci8vLyBvcGVyYXRvcnMgYXJlIHVzZWQgb24gJ2dvb2QnIG9wZXJhbmRzIHRoYXQgZG8gbm90IGZvcmNlIGFyYml0cmFyeSBjb2RlIHRvIGJlCi8vLyBleGVjdXRlZCB2aWEgY29udmVyc2lvbnMgKHZhbHVlT2YoKSBhbmQgdG9TdHJpbmcoKSBtZXRob2RzKS4KLy8vCi8vLyBJbiBtYW55IGNhc2VzIGEgSlMgZnJhZ21lbnQgaGFzIG1vcmUgcHJlY2lzZSBiZWhhdmlvci4gSW4gdGhlc2UgY2FzZXMgdGhlCi8vLyBiZWhhdmlvciBzaG91bGQgYmUgZGVzY3JpYmVkIGFzIGEgcHJvcGVydHkgb2YgdGhlIEpTIGZyYWdtZW50LiBGb3IgZXhhbXBsZSwKLy8vIE9iamVjdC5rZXlzKCMpIGhhcyBhIFR5cGVFcnJvciBvbiBudWxsIC8gdW5kZWZpbmVkLCB3aGljaCBjYW4gb25seSBiZSBrbm93bgovLy8gaW4gdGhlIGNhbGxpbmcgY29udGV4dC4KLy8vCmNsYXNzIFRocm93QmVoYXZpb3JWaXNpdG9yIGV4dGVuZHMganMuQmFzZVZpc2l0b3I8TmF0aXZlVGhyb3dCZWhhdmlvcj4gewogIFRocm93QmVoYXZpb3JWaXNpdG9yKCk7CgogIE5hdGl2ZVRocm93QmVoYXZpb3IgYW5hbHl6ZShqcy5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiB2aXNpdChub2RlKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBjb21iaW5lZCBiZWhhdmlvciBvZiBzZXF1ZW50aWFsIGV4ZWN1dGlvbiBvZiBjb2RlIGhhdmluZwogIC8vLyBiZWhhdmlvciBbZmlyc3RdIGZvbGxvd2VkIGJ5IGNvZGUgaGF2aW5nIGJlaGF2aW9yIFtzZWNvbmRdLgogIHN0YXRpYyBOYXRpdmVUaHJvd0JlaGF2aW9yIHNlcXVlbmNlKAogICAgICBOYXRpdmVUaHJvd0JlaGF2aW9yIGZpcnN0LCBOYXRpdmVUaHJvd0JlaGF2aW9yIHNlY29uZCkgewogICAgcmV0dXJuIGZpcnN0LnRoZW4oc2Vjb25kKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBjb21iaW5lZCBiZWhhdmlvciBvZiBhIGNob2ljZSBiZXR3ZWVuIHR3byBwYXRocyB3aXRoIGJlaGF2aW9ycwogIC8vLyBbZmlyc3RdIGFuZCBbc2Vjb25kXS4KICBzdGF0aWMgTmF0aXZlVGhyb3dCZWhhdmlvciBjaG9pY2UoCiAgICAgIE5hdGl2ZVRocm93QmVoYXZpb3IgZmlyc3QsIE5hdGl2ZVRocm93QmVoYXZpb3Igc2Vjb25kKSB7CiAgICByZXR1cm4gZmlyc3Qub3Ioc2Vjb25kKTsKICB9CgogIE5hdGl2ZVRocm93QmVoYXZpb3IgdmlzaXQoanMuTm9kZSBub2RlKSB7CiAgICByZXR1cm4gbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVUaHJvd0JlaGF2aW9yIHZpc2l0Tm9kZShqcy5Ob2RlIG5vZGUpIHsKICAgIHJldHVybiBOYXRpdmVUaHJvd0JlaGF2aW9yLk1BWTsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZVRocm93QmVoYXZpb3IgdmlzaXRMaXRlcmFsKGpzLkxpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIE5hdGl2ZVRocm93QmVoYXZpb3IuTkVWRVI7CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVUaHJvd0JlaGF2aW9yIHZpc2l0SW50ZXJwb2xhdGVkRXhwcmVzc2lvbihqcy5JbnRlcnBvbGF0ZWROb2RlIG5vZGUpIHsKICAgIHJldHVybiBOYXRpdmVUaHJvd0JlaGF2aW9yLk5FVkVSOwogIH0KCiAgQG92ZXJyaWRlCiAgTmF0aXZlVGhyb3dCZWhhdmlvciB2aXNpdEludGVycG9sYXRlZFNlbGVjdG9yKGpzLkludGVycG9sYXRlZE5vZGUgbm9kZSkgewogICAgcmV0dXJuIE5hdGl2ZVRocm93QmVoYXZpb3IuTkVWRVI7CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVUaHJvd0JlaGF2aW9yIHZpc2l0QXJyYXlJbml0aWFsaXplcihqcy5BcnJheUluaXRpYWxpemVyIG5vZGUpIHsKICAgIHJldHVybiBub2RlLmVsZW1lbnRzLm1hcCh2aXNpdCkuZm9sZChOYXRpdmVUaHJvd0JlaGF2aW9yLk5FVkVSLCBzZXF1ZW5jZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVUaHJvd0JlaGF2aW9yIHZpc2l0QXJyYXlIb2xlKGpzLkFycmF5SG9sZSBub2RlKSB7CiAgICByZXR1cm4gTmF0aXZlVGhyb3dCZWhhdmlvci5ORVZFUjsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZVRocm93QmVoYXZpb3IgdmlzaXRPYmplY3RJbml0aWFsaXplcihqcy5PYmplY3RJbml0aWFsaXplciBub2RlKSB7CiAgICByZXR1cm4gbm9kZS5wcm9wZXJ0aWVzLm1hcCh2aXNpdCkuZm9sZChOYXRpdmVUaHJvd0JlaGF2aW9yLk5FVkVSLCBzZXF1ZW5jZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVUaHJvd0JlaGF2aW9yIHZpc2l0UHJvcGVydHkoanMuUHJvcGVydHkgbm9kZSkgewogICAgcmV0dXJuIHNlcXVlbmNlKHZpc2l0KG5vZGUubmFtZSksIHZpc2l0KG5vZGUudmFsdWUpKTsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZVRocm93QmVoYXZpb3IgdmlzaXRBc3NpZ25tZW50KGpzLkFzc2lnbm1lbnQgbm9kZSkgewogICAgLy8gVE9ETyhzcmEpOiBDYW4gd2UgbWFrZSAiIy5wID0gIyIgYmUgbnVsbCgxKT8KICAgIHJldHVybiBOYXRpdmVUaHJvd0JlaGF2aW9yLk1BWTsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZVRocm93QmVoYXZpb3IgdmlzaXRDYWxsKGpzLkNhbGwgbm9kZSkgewogICAganMuRXhwcmVzc2lvbiB0YXJnZXQgPSBub2RlLnRhcmdldDsKICAgIGlmICh0YXJnZXQgaXMganMuUHJvcGVydHlBY2Nlc3MgJiYgX2lzRmlyc3RJbnRlcnBvbGF0ZWRQcm9wZXJ0eSh0YXJnZXQpKSB7CiAgICAgIC8vICMuZiguLi4pOiBFdmFsdWF0ZSBzZWxlY3RvciAnZicsIGRlcmVmZXJlbmNlLCBldmFsdWF0ZSBhcmd1bWVudHMsIGFuZAogICAgICAvLyBmaW5hbGx5IGNhbGwgdGFyZ2V0LgogICAgICBOYXRpdmVUaHJvd0JlaGF2aW9yIHJlc3VsdCA9CiAgICAgICAgICBzZXF1ZW5jZSh2aXNpdCh0YXJnZXQuc2VsZWN0b3IpLCBOYXRpdmVUaHJvd0JlaGF2aW9yLk5VTExfTlNNKTsKICAgICAgZm9yIChqcy5FeHByZXNzaW9uIGFyZ3VtZW50IGluIG5vZGUuYXJndW1lbnRzKSB7CiAgICAgICAgcmVzdWx0ID0gc2VxdWVuY2UocmVzdWx0LCB2aXNpdChhcmd1bWVudCkpOwogICAgICB9CiAgICAgIHJldHVybiBzZXF1ZW5jZShyZXN1bHQsIE5hdGl2ZVRocm93QmVoYXZpb3IuTUFZKTsgLy8gVGFyZ2V0IG1heSB0aHJvdy4KICAgIH0KICAgIHJldHVybiBOYXRpdmVUaHJvd0JlaGF2aW9yLk1BWTsKICB9CgogIEBvdmVycmlkZQogIE5hdGl2ZVRocm93QmVoYXZpb3IgdmlzaXROZXcoanMuTmV3IG5vZGUpIHsKICAgIC8vIFRPRE8oc3JhKTogYG5ldyBBcnJheSh4KWAgd2hlcmUgYHhgIGlzIGEgc21hbGwgbnVtYmVyLgogICAgcmV0dXJuIE5hdGl2ZVRocm93QmVoYXZpb3IuTUFZOwogIH0KCiAgQG92ZXJyaWRlCiAgTmF0aXZlVGhyb3dCZWhhdmlvciB2aXNpdEJpbmFyeShqcy5CaW5hcnkgbm9kZSkgewogICAgTmF0aXZlVGhyb3dCZWhhdmlvciBsZWZ0ID0gdmlzaXQobm9kZS5sZWZ0KTsKICAgIE5hdGl2ZVRocm93QmVoYXZpb3IgcmlnaHQgPSB2aXNpdChub2RlLnJpZ2h0KTsKICAgIHN3aXRjaCAobm9kZS5vcCkgewogICAgICAvLyBXZSBtYWtlIHRoZSBub24tY29uc2VydmF0aXZlIGFzc3VtcHRpb24gdGhhdCB0aGVzZSBvcGVyYXRpb25zIGFyZSBub3QKICAgICAgLy8gdXNlZCBpbiB3YXlzIHRoYXQgZm9yY2UgY2FsbGluZyBhcmJpdHJhcnkgY29kZSB2aWEgdmFsdWVPZiBvcgogICAgICAvLyB0b1N0cmluZygpLgogICAgICBjYXNlICIqIjoKICAgICAgY2FzZSAiLyI6CiAgICAgIGNhc2UgIiUiOgogICAgICBjYXNlICIrIjoKICAgICAgY2FzZSAiLSI6CiAgICAgIGNhc2UgIjw8IjoKICAgICAgY2FzZSAiPj4iOgogICAgICBjYXNlICI+Pj4iOgogICAgICBjYXNlICI8IjoKICAgICAgY2FzZSAiPiI6CiAgICAgIGNhc2UgIjw9IjoKICAgICAgY2FzZSAiPj0iOgogICAgICBjYXNlICI9PSI6CiAgICAgIGNhc2UgIj09PSI6CiAgICAgIGNhc2UgIiE9IjoKICAgICAgY2FzZSAiIT09IjoKICAgICAgY2FzZSAiJiI6CiAgICAgIGNhc2UgIl4iOgogICAgICBjYXNlICJ8IjoKICAgICAgICByZXR1cm4gc2VxdWVuY2UobGVmdCwgcmlnaHQpOwoKICAgICAgY2FzZSAnLCc6CiAgICAgICAgcmV0dXJuIHNlcXVlbmNlKGxlZnQsIHJpZ2h0KTsKCiAgICAgIGNhc2UgIiYmIjoKICAgICAgY2FzZSAifHwiOgogICAgICAgIHJldHVybiBjaG9pY2UobGVmdCwgc2VxdWVuY2UobGVmdCwgcmlnaHQpKTsKCiAgICAgIGNhc2UgImluc3RhbmNlb2YiOgogICAgICBjYXNlICJpbiI6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIE5hdGl2ZVRocm93QmVoYXZpb3IuTUFZOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgTmF0aXZlVGhyb3dCZWhhdmlvciB2aXNpdFRocm93KGpzLlRocm93IG5vZGUpIHsKICAgIHJldHVybiBzZXF1ZW5jZSh2aXNpdChub2RlLmV4cHJlc3Npb24pLCBOYXRpdmVUaHJvd0JlaGF2aW9yLk1BWSk7CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVUaHJvd0JlaGF2aW9yIHZpc2l0UHJlZml4KGpzLlByZWZpeCBub2RlKSB7CiAgICBpZiAobm9kZS5vcCA9PSAndHlwZW9mJyAmJiBub2RlLmFyZ3VtZW50IGlzIGpzLlZhcmlhYmxlVXNlKQogICAgICByZXR1cm4gTmF0aXZlVGhyb3dCZWhhdmlvci5ORVZFUjsKICAgIE5hdGl2ZVRocm93QmVoYXZpb3IgcmVzdWx0ID0gdmlzaXQobm9kZS5hcmd1bWVudCk7CiAgICBzd2l0Y2ggKG5vZGUub3ApIHsKICAgICAgY2FzZSAnKyc6CiAgICAgIGNhc2UgJy0nOgogICAgICBjYXNlICchJzoKICAgICAgY2FzZSAnfic6CiAgICAgIGNhc2UgJ3ZvaWQnOgogICAgICBjYXNlICd0eXBlb2YnOgogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIE5hdGl2ZVRocm93QmVoYXZpb3IuTUFZOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgTmF0aXZlVGhyb3dCZWhhdmlvciB2aXNpdFZhcmlhYmxlVXNlKGpzLlZhcmlhYmxlVXNlIG5vZGUpIHsKICAgIC8vIFdlIGNvdWxkIGdldCBhIFJlZmVyZW5jZUVycm9yIHVubGVzcyB0aGUgdmFyaWFibGUgaXMgaW4gc2NvcGUuIFRoZSBBU1QKICAgIC8vIGNvdWxkIGRpc3Rpbmd1aXNoIGluLXNjb3BlIGFuZCBvdXQtb2Ygc2NvcGUgcmVmZXJlbmNlcy4gRm9yIEpTIGZyYWdtZW50cywKICAgIC8vIHRoZSBvbmx5IHVzZSBvZiBWYXJpYWJsZVVzZSBzaG91bGQgYmUgZm9yIGdsb2JhbCByZWZlcmVuY2VzLiBDZXJ0YWluCiAgICAvLyBnbG9iYWwgbmFtZXMgYXJlIGFsbW9zdCBjZXJ0YWlubHkgbm90IHJlZmVyZW5jZSBlcnJvcnMsIGUuZyAnQXJyYXknLgogICAgc3dpdGNoIChub2RlLm5hbWUpIHsKICAgICAgY2FzZSAnQXJyYXknOgogICAgICBjYXNlICdNYXRoJzoKICAgICAgY2FzZSAnT2JqZWN0JzoKICAgICAgICByZXR1cm4gTmF0aXZlVGhyb3dCZWhhdmlvci5ORVZFUjsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gTmF0aXZlVGhyb3dCZWhhdmlvci5NQVk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBOYXRpdmVUaHJvd0JlaGF2aW9yIHZpc2l0QWNjZXNzKGpzLlByb3BlcnR5QWNjZXNzIG5vZGUpIHsKICAgIGpzLk5vZGUgcmVjZWl2ZXIgPSBub2RlLnJlY2VpdmVyOwogICAgTmF0aXZlVGhyb3dCZWhhdmlvciBmaXJzdCA9IHZpc2l0KHJlY2VpdmVyKTsKICAgIE5hdGl2ZVRocm93QmVoYXZpb3Igc2Vjb25kID0gdmlzaXQobm9kZS5zZWxlY3Rvcik7CgogICAgaWYgKF9pc0ZpcnN0SW50ZXJwb2xhdGVkUHJvcGVydHkobm9kZSkpIHsKICAgICAgZmlyc3QgPSBOYXRpdmVUaHJvd0JlaGF2aW9yLk5VTExfTlNNOwogICAgfSBlbHNlIHsKICAgICAgZmlyc3QgPSBOYXRpdmVUaHJvd0JlaGF2aW9yLk1BWTsKICAgIH0KCiAgICByZXR1cm4gc2VxdWVuY2UoZmlyc3QsIHNlY29uZCk7CiAgfQoKICBib29sIF9pc0ZpcnN0SW50ZXJwb2xhdGVkUHJvcGVydHkoanMuUHJvcGVydHlBY2Nlc3Mgbm9kZSkgewogICAganMuTm9kZSByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CiAgICBpZiAocmVjZWl2ZXIgaXMganMuSW50ZXJwb2xhdGVkRXhwcmVzc2lvbiAmJgogICAgICAgIHJlY2VpdmVyLmlzUG9zaXRpb25hbCAmJgogICAgICAgIHJlY2VpdmVyLm5hbWVPclBvc2l0aW9uID09IDApIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CoFUAE5OPAEeORgBNx8BJEcaGgQBHhYBDBoaHhoEAQw0IhQGBAIBMiEoAR0XBAEMOyUpHgQBDDklKR4EAQwtLC4jHgQBDEUeBAEMISUpHgQBDCUeBAEMIzscJQQBDB8lKR4EAQwlHy4wJQYeBAEMLzMEAQwnHgQBDC0qNTMeBAIBSDMET0pRQQROUFAcBEkaAS4YBAFLQic/HwQBURwlPx0EASweBAEMMCQEAQw2JgQBDE4mBAEMTCYEAQxITwQBDDomBAEMSlEEAQw4OgQBDDw0JAQBDDAoT08eI0o3NAhNBiQEAQwuPiQEAQw0MTMXT0cVEBAQEBARERIQEBERERIREhAQECYBECYBERE0ARkRDygGBAEMMkYEAQw0QCg3FxAQEBATFRcPKAYEAQw+TlFMTBkUExUqDygGBAEMPCYxNwEuLA0nBgEkBAE+JjEhKBMGEgQCASNwYWNrYWdlOmNvbXBpbGVyL3NyYy9uYXRpdmUvanMuZGFydDtzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pci9ydW50aW1lX3R5cGVfYW5hbHlzaXMuZGFydLnOLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwoKaW1wb3J0ICcuLi9jb21tb24vbmFtZXMuZGFydCc7CmltcG9ydCAndXRpbC5kYXJ0JzsKCi8vLyBFbnVtIGZvciByZWNvZ25pemVkIHVzZSBraW5kcyBvZiBgT2JqZWN0LnJ1bnRpbWVUeXBlYC4KZW51bSBSdW50aW1lVHlwZVVzZUtpbmQgewogIC8vLyBVbmtub3duIHVzZSBvZiBgT2JqZWN0LnJ1bnRpbWVUeXBlYC4gVGhpcyBpcyB0aGUgZmFsbGJhY2sgdmFsdWUgaWYgdGhlCiAgLy8vIHVzYWdlIGRpZG4ndCBtYXRjaCBhbnkgb2YgdGhlIHJlY29nbml6ZWQgcGF0dGVybnMuCiAgdW5rbm93biwKCiAgLy8vIGBPYmplY3QucnVudGltZVR5cGVgIHVzZWQgaW4gYSBwYXR0ZXJuIGxpa2UKICAvLy8gYGEucnVudGltZVR5cGUgPT0gYi5ydW50aW1lVHlwZWAuCiAgZXF1YWxzLAoKICAvLy8gYE9iamVjdC5ydW50aW1lVHlwZWAgdXNlZCBpbiBhIHBhdHRlcm4gbGlrZSBgJyR7ZS5ydW50aW1lVHlwZX0nYCBvcgogIC8vLyBgZS5ydW50aW1lVHlwZS50b1N0cmluZygpYC4KICBzdHJpbmcsCn0KCi8vLyBEYXRhIG9iamVjdCB1c2UgZm9yIGNvbXB1dGluZyBzdGF0aWMgdHlwZSBpbmZvcm1hdGlvbiBvbiB1c2VzIG9mCi8vLyBgT2JqZWN0LnJ1bnRpbWVUeXBlYC4KY2xhc3MgUnVudGltZVR5cGVVc2VEYXRhIHsKICAvLy8gVGhlIHVzZSBraW5kIG9mIGBPYmplY3QucnVudGltZVR5cGVgLgogIGZpbmFsIFJ1bnRpbWVUeXBlVXNlS2luZCBraW5kOwoKICAvLy8gVGhlIHByb3BlcnR5IGdldCBmb3IgdGhlIGxlZnQgKG9yIHNpbmdsZSkgb2NjdXJyZW5jZSBvZiBgLnJ1bnRpbWVUeXBlYC4KICBmaW5hbCBpci5Qcm9wZXJ0eUdldCBsZWZ0UnVudGltZVR5cGVFeHByZXNzaW9uOwoKICAvLy8gVGhlIHJlY2VpdmVyIGV4cHJlc3Npb24uCiAgZmluYWwgaXIuRXhwcmVzc2lvbiByZWNlaXZlcjsKCiAgLy8vIFRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZXhwcmVzc2lvbi4gVGhpcyBpcyBzZXQgaW4gdGhlIHN0YXRpYyB0eXBlCiAgLy8vIHZpc2l0b3IuCiAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlOwoKICAvLy8gVGhlIHByb3BlcnR5IGdldCBmb3IgdGhlIHJpZ2h0IG9jY3VycmVuY2Ugb2YgYC5ydW50aW1lVHlwZWAgd2hlbiBba2luZF0KICAvLy8gaXMgYFJ1bnRpbWVUeXBlVXNlS2luZC5lcXVhbHNgLgogIGZpbmFsIGlyLlByb3BlcnR5R2V0IHJpZ2h0UnVudGltZVR5cGVFeHByZXNzaW9uOwoKICAvLy8gVGhlIGFyZ3VtZW50IGV4cHJlc3Npb24gaWYgW2tpbmRdIGlzIGBSdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzYC4KICBmaW5hbCBpci5FeHByZXNzaW9uIGFyZ3VtZW50OwoKICAvLy8gVGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBhcmd1bWVudCBleHByZXNzaW9uLiBUaGlzIGlzIHNldCBpbiB0aGUgc3RhdGljIHR5cGUKICAvLy8gdmlzaXRvci4KICBpci5EYXJ0VHlwZSBhcmd1bWVudFR5cGU7CgogIFJ1bnRpbWVUeXBlVXNlRGF0YSh0aGlzLmtpbmQsIHRoaXMubGVmdFJ1bnRpbWVUeXBlRXhwcmVzc2lvbiwgdGhpcy5yZWNlaXZlciwKICAgICAgdGhpcy5yaWdodFJ1bnRpbWVUeXBlRXhwcmVzc2lvbiwgdGhpcy5hcmd1bWVudCk7CgogIGJvb2wgZ2V0IGlzQ29tcGxldGUgewogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgUnVudGltZVR5cGVVc2VLaW5kLnVua25vd246CiAgICAgIGNhc2UgUnVudGltZVR5cGVVc2VLaW5kLnN0cmluZzoKICAgICAgICByZXR1cm4gcmVjZWl2ZXJUeXBlICE9IG51bGw7CiAgICAgIGNhc2UgUnVudGltZVR5cGVVc2VLaW5kLmVxdWFsczoKICAgICAgICByZXR1cm4gcmVjZWl2ZXJUeXBlICE9IG51bGwgJiYgYXJndW1lbnRUeXBlICE9IG51bGw7CiAgICB9CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBSdW50aW1lVHlwZVVzZUtpbmQgJGtpbmQuIik7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIlJ1bnRpbWVUeXBlVXNlRGF0YShraW5kPSRraW5kLCIKICAgICAgICAicmVjZWl2ZXJHZXQ9JGxlZnRSdW50aW1lVHlwZUV4cHJlc3Npb24scmVjZWl2ZXI9JHJlY2VpdmVyLCIKICAgICAgICAicmVjZWl2ZXJUeXBlPSRyZWNlaXZlclR5cGUsYXJndW1lbnRHZXQ9JHJpZ2h0UnVudGltZVR5cGVFeHByZXNzaW9uLCIKICAgICAgICAiYXJndW1lbnQ9JGFyZ3VtZW50LGFyZ3VtZW50VHlwZT0kYXJndW1lbnRUeXBlKSI7CiAgfQp9CgovLy8gQ29tcHV0ZXMgdGhlIFtSdW50aW1lVHlwZVVzZURhdGFdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGBlLnJ1bnRpbWVUeXBlYAovLy8gW25vZGVdLgovLy8KLy8vIFtjYWNoZV0gaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBvbmx5IG9uZSBbUnVudGltZVR5cGVVc2VEYXRhXSBvYmplY3QgaXMKLy8vIGNyZWF0ZWQgcGVyIGNhc2UsIGV2ZW4gZm9yIHRoZSBgPT1gIGNhc2UuClJ1bnRpbWVUeXBlVXNlRGF0YSBjb21wdXRlUnVudGltZVR5cGVVc2UoCiAgICBNYXA8aXIuUHJvcGVydHlHZXQsIFJ1bnRpbWVUeXBlVXNlRGF0YT4gY2FjaGUsIGlyLlByb3BlcnR5R2V0IG5vZGUpIHsKICBSdW50aW1lVHlwZVVzZURhdGEgcmVjZWl2ZXJEYXRhID0gY2FjaGVbbm9kZV07CiAgaWYgKHJlY2VpdmVyRGF0YSAhPSBudWxsKSByZXR1cm4gcmVjZWl2ZXJEYXRhOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW25vZGVdIGlzIG9mIHRoZSBmb3JtIGBlLnJ1bnRpbWVUeXBlYC4KICBib29sIGlzR2V0UnVudGltZVR5cGUoaXIuVHJlZU5vZGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGUgaXMgaXIuUHJvcGVydHlHZXQgJiYgbm9kZS5uYW1lLm5hbWUgPT0gSWRlbnRpZmllcnMucnVudGltZVR5cGVfOwogIH0KCiAgLy8vIFJldHVybnMgW25vZGVdIGlmIFtub2RlXSBpcyBvZiB0aGUgZm9ybSBgZS5ydW50aW1lVHlwZWAgYW5kIGBudWxsYAogIC8vLyBvdGhlcndpc2UuCiAgaXIuUHJvcGVydHlHZXQgYXNHZXRSdW50aW1lVHlwZShpci5UcmVlTm9kZSBub2RlKSB7CiAgICByZXR1cm4gaXNHZXRSdW50aW1lVHlwZShub2RlKSA/IG5vZGUgOiBudWxsOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtub2RlXSBpcyBvZiB0aGUgZm9ybSBgZS50b1N0cmluZygpYC4KICBib29sIGlzSW52b2tlVG9TdHJpbmcoaXIuVHJlZU5vZGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGUgaXMgaXIuTWV0aG9kSW52b2NhdGlvbiAmJiBub2RlLm5hbWUubmFtZSA9PSAndG9TdHJpbmcnOwogIH0KCiAgYXNzZXJ0KGlzR2V0UnVudGltZVR5cGUobm9kZSkpOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTcGVjaWFsLWNhc2UgYHRoaXMucnVudGltZVR5cGVgLgogIGlyLlByb3BlcnR5R2V0IHJlY2VpdmVyR2V0OwogIGlyLkV4cHJlc3Npb24gcmVjZWl2ZXI7CiAgaXIuUHJvcGVydHlHZXQgYXJndW1lbnRHZXQ7CiAgaXIuRXhwcmVzc2lvbiBhcmd1bWVudDsKICBSdW50aW1lVHlwZVVzZUtpbmQga2luZDsKCiAgaWYgKG5vZGUucmVjZWl2ZXIgaXMgaXIuVmFyaWFibGVHZXQgJiYKICAgICAgbm9kZS5wYXJlbnQgaXMgaXIuQ29uZGl0aW9uYWxFeHByZXNzaW9uICYmCiAgICAgIG5vZGUucGFyZW50LnBhcmVudCBpcyBpci5MZXQpIHsKICAgIE51bGxBd2FyZUV4cHJlc3Npb24gbnVsbEF3YXJlID0gZ2V0TnVsbEF3YXJlRXhwcmVzc2lvbihub2RlLnBhcmVudC5wYXJlbnQpOwogICAgaWYgKG51bGxBd2FyZSAhPSBudWxsKSB7CiAgICAgIC8vIFRoZSBub2RlIGlzIG9mIHRoZSBmb3JtOgogICAgICAvLwogICAgICAvLyAgICAgbGV0ICN0MSA9IGUgaW4gI3QxID09IG51bGwgPyBudWxsIDogI3QxLnJ1bnRpbWVUeXBlCiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgoKICAgICAgaWYgKG51bGxBd2FyZS5wYXJlbnQgaXMgaXIuVmFyaWFibGVEZWNsYXJhdGlvbiAmJgogICAgICAgICAgbnVsbEF3YXJlLnBhcmVudC5wYXJlbnQgaXMgaXIuTGV0KSB7CiAgICAgICAgTnVsbEF3YXJlRXhwcmVzc2lvbiBvdXRlciA9CiAgICAgICAgICAgIGdldE51bGxBd2FyZUV4cHJlc3Npb24obnVsbEF3YXJlLnBhcmVudC5wYXJlbnQpOwogICAgICAgIGlmIChvdXRlciAhPSBudWxsICYmCiAgICAgICAgICAgIG91dGVyLnJlY2VpdmVyID09IG51bGxBd2FyZS5sZXQgJiYKICAgICAgICAgICAgaXNJbnZva2VUb1N0cmluZyhvdXRlci5leHByZXNzaW9uKSkgewogICAgICAgICAgLy8gRGV0ZWN0ZWQKICAgICAgICAgIC8vCiAgICAgICAgICAvLyAgICAgZT8ucnVudGltZVR5cGU/LnRvU3RyaW5nKCkKICAgICAgICAgIC8vICAgICAgICBeCiAgICAgICAgICAvLyBlbmNvZGVkIGFzCiAgICAgICAgICAvLwogICAgICAgICAgLy8gICAgIGxldCAjdDIgPSAobGV0ICN0MSA9IGUgaW4gI3QxID09IG51bGwgPyBudWxsIDogI3QxLnJ1bnRpbWVUeXBlKQogICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KICAgICAgICAgIC8vICAgICAgICBpbiAjdDIgPT0gbnVsbCA/IG51bGwgOiAjdDIudG9TdHJpbmcoKQogICAgICAgICAgLy8KICAgICAgICAgIGtpbmQgPSBSdW50aW1lVHlwZVVzZUtpbmQuc3RyaW5nOwogICAgICAgICAgcmVjZWl2ZXIgPSBudWxsQXdhcmUucmVjZWl2ZXI7CiAgICAgICAgICByZWNlaXZlckdldCA9IG5vZGU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG51bGxBd2FyZS5wYXJlbnQgaXMgaXIuTWV0aG9kSW52b2NhdGlvbikgewogICAgICAgIGlyLk1ldGhvZEludm9jYXRpb24gbWV0aG9kSW52b2NhdGlvbiA9IG51bGxBd2FyZS5wYXJlbnQ7CiAgICAgICAgaWYgKG1ldGhvZEludm9jYXRpb24ucmVjZWl2ZXIgPT0gbnVsbEF3YXJlLmxldCAmJgogICAgICAgICAgICBtZXRob2RJbnZvY2F0aW9uLm5hbWUubmFtZSA9PSAnPT0nKSB7CiAgICAgICAgICAvLyBEZXRlY3RlZAogICAgICAgICAgLy8KICAgICAgICAgIC8vICBlMD8ucnVudGltZVR5cGUgPT0gb3RoZXIKICAgICAgICAgIGlyLlByb3BlcnR5R2V0IG90aGVyR2V0UnVudGltZVR5cGUgPQogICAgICAgICAgICAgIGFzR2V0UnVudGltZVR5cGUobWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbC5maXJzdCk7CiAgICAgICAgICBpZiAob3RoZXJHZXRSdW50aW1lVHlwZSAhPSBudWxsKSB7CiAgICAgICAgICAgIC8vIERldGVjdGVkCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vICAgICBlMD8ucnVudGltZVR5cGUgPT0gZTEucnVudGltZVR5cGUKICAgICAgICAgICAgLy8gICAgICAgICBeCiAgICAgICAgICAgIC8vIGVuY29kZWQgYXMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gICAgIChsZXQgI3QxID0gZTAgaW4gI3QxID09IG51bGwgPyBudWxsIDogI3QxLnJ1bnRpbWVUeXBlKQogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgICAgICAgICAvLyAgICAgICAgLj09KGUxLnJ1bnRpbWVUeXBlKQogICAgICAgICAgICBraW5kID0gUnVudGltZVR5cGVVc2VLaW5kLmVxdWFsczsKICAgICAgICAgICAgcmVjZWl2ZXIgPSBudWxsQXdhcmUucmVjZWl2ZXI7CiAgICAgICAgICAgIHJlY2VpdmVyR2V0ID0gbm9kZTsKICAgICAgICAgICAgYXJndW1lbnQgPSBvdGhlckdldFJ1bnRpbWVUeXBlLnJlY2VpdmVyOwogICAgICAgICAgICBhcmd1bWVudEdldCA9IG1ldGhvZEludm9jYXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWwuZmlyc3Q7CiAgICAgICAgICB9CgogICAgICAgICAgTnVsbEF3YXJlRXhwcmVzc2lvbiBvdGhlck51bGxBd2FyZSA9IGdldE51bGxBd2FyZUV4cHJlc3Npb24oCiAgICAgICAgICAgICAgbWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbC5maXJzdCk7CiAgICAgICAgICBpZiAob3RoZXJOdWxsQXdhcmUgIT0gbnVsbCAmJgogICAgICAgICAgICAgIGlzR2V0UnVudGltZVR5cGUob3RoZXJOdWxsQXdhcmUuZXhwcmVzc2lvbikpIHsKICAgICAgICAgICAgLy8gRGV0ZWN0ZWQKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gICAgIGUwPy5ydW50aW1lVHlwZSA9PSBlMT8ucnVudGltZVR5cGUKICAgICAgICAgICAgLy8gICAgICAgICBeCiAgICAgICAgICAgIC8vIGVuY29kZWQgYXMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gICAgIChsZXQgI3QxID0gZTAgaW4gI3QxID09IG51bGwgPyBudWxsIDogI3QxLnJ1bnRpbWVUeXBlKQogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgICAgICAgICAvLyAgICAgICAgIC49PShsZXQgI3QyID0gZTEgaW4gI3QyID09IG51bGwgPyBudWxsIDogI3QyLnJ1bnRpbWVUeXBlKQogICAgICAgICAgICAvLwogICAgICAgICAgICBraW5kID0gUnVudGltZVR5cGVVc2VLaW5kLmVxdWFsczsKICAgICAgICAgICAgcmVjZWl2ZXIgPSBudWxsQXdhcmUucmVjZWl2ZXI7CiAgICAgICAgICAgIHJlY2VpdmVyR2V0ID0gbm9kZTsKICAgICAgICAgICAgYXJndW1lbnQgPSBvdGhlck51bGxBd2FyZS5yZWNlaXZlcjsKICAgICAgICAgICAgYXJndW1lbnRHZXQgPSBvdGhlck51bGxBd2FyZS5leHByZXNzaW9uOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoaXNJbnZva2VUb1N0cmluZyhudWxsQXdhcmUucGFyZW50KSkgewogICAgICAgICAgLy8gRGV0ZWN0ZWQKICAgICAgICAgIC8vCiAgICAgICAgICAvLyAgICAgZT8ucnVudGltZVR5cGUudG9TdHJpbmcoKQogICAgICAgICAgLy8gICAgICAgIF4KICAgICAgICAgIC8vIGVuY29kZWQgYXMKICAgICAgICAgIC8vCiAgICAgICAgICAvLyAgICAgKGxldCAjdDEgPSBlIGluICN0MSA9PSBudWxsID8gbnVsbCA6ICN0MS5ydW50aW1lVHlwZSkKICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgICAgICAgLy8gICAgICAgICAudG9TdHJpbmcoKQogICAgICAgICAgLy8KICAgICAgICAgIGtpbmQgPSBSdW50aW1lVHlwZVVzZUtpbmQuc3RyaW5nOwogICAgICAgICAgcmVjZWl2ZXIgPSBudWxsQXdhcmUucmVjZWl2ZXI7CiAgICAgICAgICByZWNlaXZlckdldCA9IG5vZGU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG51bGxBd2FyZS5wYXJlbnQgaXMgaXIuQXJndW1lbnRzICYmCiAgICAgICAgICBudWxsQXdhcmUucGFyZW50LnBhcmVudCBpcyBpci5NZXRob2RJbnZvY2F0aW9uKSB7CiAgICAgICAgaXIuTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gbnVsbEF3YXJlLnBhcmVudC5wYXJlbnQ7CiAgICAgICAgaWYgKG1ldGhvZEludm9jYXRpb24ubmFtZS5uYW1lID09ICc9PScgJiYKICAgICAgICAgICAgbWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbC5maXJzdCA9PSBudWxsQXdhcmUubGV0KSB7CiAgICAgICAgICAvLyBbbnVsbEF3YXJlXSBpcyB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mID09LgoKICAgICAgICAgIGlyLlByb3BlcnR5R2V0IG90aGVyR2V0UnVudGltZVR5cGUgPQogICAgICAgICAgICAgIGFzR2V0UnVudGltZVR5cGUobWV0aG9kSW52b2NhdGlvbi5yZWNlaXZlcik7CiAgICAgICAgICBOdWxsQXdhcmVFeHByZXNzaW9uIG90aGVyTnVsbEF3YXJlID0KICAgICAgICAgICAgICBnZXROdWxsQXdhcmVFeHByZXNzaW9uKG1ldGhvZEludm9jYXRpb24ucmVjZWl2ZXIpOwoKICAgICAgICAgIGlmIChvdGhlckdldFJ1bnRpbWVUeXBlICE9IG51bGwpIHsKICAgICAgICAgICAgLy8gRGV0ZWN0ZWQKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gICAgIGUwLnJ1bnRpbWVUeXBlID09IGUxPy5ydW50aW1lVHlwZQogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KICAgICAgICAgICAgLy8gZW5jb2RlZCBhcwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyAgICAgZTAucnVudGltZVR5cGUuPT0oCiAgICAgICAgICAgIC8vICAgICAgICAgbGV0ICN0MSA9IGUxIGluICN0MSA9PSBudWxsID8gbnVsbCA6ICN0MS5ydW50aW1lVHlwZSkKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KICAgICAgICAgICAga2luZCA9IFJ1bnRpbWVUeXBlVXNlS2luZC5lcXVhbHM7CiAgICAgICAgICAgIHJlY2VpdmVyID0gb3RoZXJHZXRSdW50aW1lVHlwZS5yZWNlaXZlcjsKICAgICAgICAgICAgcmVjZWl2ZXJHZXQgPSBvdGhlckdldFJ1bnRpbWVUeXBlOwogICAgICAgICAgICBhcmd1bWVudCA9IG51bGxBd2FyZS5yZWNlaXZlcjsKICAgICAgICAgICAgYXJndW1lbnRHZXQgPSBub2RlOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChvdGhlck51bGxBd2FyZSAhPSBudWxsICYmCiAgICAgICAgICAgICAgaXNHZXRSdW50aW1lVHlwZShvdGhlck51bGxBd2FyZS5leHByZXNzaW9uKSkgewogICAgICAgICAgICAvLyBEZXRlY3RlZAogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyAgICAgZTA/LnJ1bnRpbWVUeXBlID09IGUxPy5ydW50aW1lVHlwZQogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgICAgICAgICAgIC8vIGVuY29kZWQgYXMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gICAgIChsZXQgI3QxID0gZTAgaW4gI3QxID09IG51bGwgPyBudWxsIDogI3QxLnJ1bnRpbWVUeXBlKQogICAgICAgICAgICAvLyAgICAgICAgIC49PShsZXQgI3QyID0gZTEgaW4gI3QyID09IG51bGwgPyBudWxsIDogI3QyLnJ1bnRpbWVUeXBlKQogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KICAgICAgICAgICAga2luZCA9IFJ1bnRpbWVUeXBlVXNlS2luZC5lcXVhbHM7CiAgICAgICAgICAgIHJlY2VpdmVyID0gb3RoZXJOdWxsQXdhcmUucmVjZWl2ZXI7CiAgICAgICAgICAgIHJlY2VpdmVyR2V0ID0gb3RoZXJOdWxsQXdhcmUuZXhwcmVzc2lvbjsKICAgICAgICAgICAgYXJndW1lbnQgPSBudWxsQXdhcmUucmVjZWl2ZXI7CiAgICAgICAgICAgIGFyZ3VtZW50R2V0ID0gbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobnVsbEF3YXJlLnBhcmVudCBpcyBpci5TdHJpbmdDb25jYXRlbmF0aW9uKSB7CiAgICAgICAgLy8gRGV0ZWN0ZWQKICAgICAgICAvLwogICAgICAgIC8vICAgICAnJHtlPy5ydW50aW1lVHlwZX0nCiAgICAgICAgLy8gICAgICAgICAgIF4KICAgICAgICAvLyBlbmNvZGVkIGFzCiAgICAgICAgLy8KICAgICAgICAvLyAgICAgJyR7bGV0ICN0MSA9IGUgaW4gI3QxID09IG51bGwgPyBudWxsIDogI3QxLnJ1bnRpbWVUeXBlfScKICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KICAgICAgICBraW5kID0gUnVudGltZVR5cGVVc2VLaW5kLnN0cmluZzsKICAgICAgICByZWNlaXZlciA9IG51bGxBd2FyZS5yZWNlaXZlcjsKICAgICAgICByZWNlaXZlckdldCA9IG5vZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gRGVmYXVsdCB0byB1bmtub3duCiAgICAgICAgLy8KICAgICAgICAvLyAgICAgZT8ucnVudGltZVR5cGUKICAgICAgICAvLyAgICAgICAgXgogICAgICAgIC8vIGVuY29kZWQgYXMKICAgICAgICAvLwogICAgICAgIC8vICAgICBsZXQgI3QxID0gZSBpbiAjdDEgPT0gbnVsbCA/IG51bGwgOiAjdDEucnVudGltZVR5cGUKICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgICAgIGtpbmQgPSBSdW50aW1lVHlwZVVzZUtpbmQudW5rbm93bjsKICAgICAgICByZWNlaXZlciA9IG51bGxBd2FyZS5yZWNlaXZlcjsKICAgICAgICByZWNlaXZlckdldCA9IG5vZGU7CiAgICAgIH0KICAgIH0KICB9IGVsc2UgaWYgKG5vZGUucGFyZW50IGlzIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gJiYKICAgICAgbm9kZS5wYXJlbnQucGFyZW50IGlzIGlyLkxldCkgewogICAgTnVsbEF3YXJlRXhwcmVzc2lvbiBudWxsQXdhcmUgPSBnZXROdWxsQXdhcmVFeHByZXNzaW9uKG5vZGUucGFyZW50LnBhcmVudCk7CiAgICBpZiAobnVsbEF3YXJlICE9IG51bGwgJiYgaXNJbnZva2VUb1N0cmluZyhudWxsQXdhcmUuZXhwcmVzc2lvbikpIHsKICAgICAgLy8gRGV0ZWN0ZWQKICAgICAgLy8KICAgICAgLy8gICAgIGUucnVudGltZVR5cGU/LnRvU3RyaW5nKCkKICAgICAgLy8gICAgICAgXgogICAgICAvLyBlbmNvZGVkIGFzCiAgICAgIC8vCiAgICAgIC8vICAgICBsZXQgI3QxID0gZS5ydW50aW1lVHlwZSBpbiAjdDEgPT0gbnVsbCA/IG51bGwgOiAjdDEudG9TdHJpbmcoKQogICAgICAvLyAgICAgICAgICAgICAgICAgXgogICAgICBraW5kID0gUnVudGltZVR5cGVVc2VLaW5kLnN0cmluZzsKICAgICAgcmVjZWl2ZXIgPSBub2RlLnJlY2VpdmVyOwogICAgICByZWNlaXZlckdldCA9IG5vZGU7CiAgICB9CiAgfSBlbHNlIGlmIChub2RlLnBhcmVudCBpcyBpci5NZXRob2RJbnZvY2F0aW9uKSB7CiAgICBpci5NZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSBub2RlLnBhcmVudDsKICAgIGlmIChtZXRob2RJbnZvY2F0aW9uLm5hbWUubmFtZSA9PSAnPT0nICYmCiAgICAgICAgbWV0aG9kSW52b2NhdGlvbi5yZWNlaXZlciA9PSBub2RlKSB7CiAgICAgIC8vIFtub2RlXSBpcyB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgPT0uCgogICAgICBpci5Qcm9wZXJ0eUdldCBvdGhlckdldFJ1bnRpbWVUeXBlID0KICAgICAgICAgIGFzR2V0UnVudGltZVR5cGUobWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbC5maXJzdCk7CiAgICAgIE51bGxBd2FyZUV4cHJlc3Npb24gbnVsbEF3YXJlID0KICAgICAgICAgIGdldE51bGxBd2FyZUV4cHJlc3Npb24obWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbC5maXJzdCk7CiAgICAgIGlmIChvdGhlckdldFJ1bnRpbWVUeXBlICE9IG51bGwpIHsKICAgICAgICAvLyBEZXRlY3RlZAogICAgICAgIC8vCiAgICAgICAgLy8gICAgIGUwLnJ1bnRpbWVUeXBlID09IGUxLnJ1bnRpbWVUeXBlCiAgICAgICAgLy8gICAgICAgIF4KICAgICAgICAvLyBlbmNvZGVkIGFzCiAgICAgICAgLy8KICAgICAgICAvLyAgICAgZTAucnVudGltZVR5cGUuPT0oZTEucnVudGltZVR5cGUpCiAgICAgICAgLy8gICAgICAgIF4KICAgICAgICBraW5kID0gUnVudGltZVR5cGVVc2VLaW5kLmVxdWFsczsKICAgICAgICByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CiAgICAgICAgcmVjZWl2ZXJHZXQgPSBub2RlOwogICAgICAgIGFyZ3VtZW50ID0gb3RoZXJHZXRSdW50aW1lVHlwZS5yZWNlaXZlcjsKICAgICAgICBhcmd1bWVudEdldCA9IG90aGVyR2V0UnVudGltZVR5cGU7CiAgICAgIH0gZWxzZSBpZiAobnVsbEF3YXJlICE9IG51bGwgJiYgaXNHZXRSdW50aW1lVHlwZShudWxsQXdhcmUuZXhwcmVzc2lvbikpIHsKICAgICAgICAvLyBEZXRlY3RlZAogICAgICAgIC8vCiAgICAgICAgLy8gICAgIGUwLnJ1bnRpbWVUeXBlID09IGUxPy5ydW50aW1lVHlwZQogICAgICAgIC8vICAgICAgICBeCiAgICAgICAgLy8gZW5jb2RlZCBhcwogICAgICAgIC8vCiAgICAgICAgLy8gICAgIGUwLnJ1bnRpbWVUeXBlLj09KAogICAgICAgIC8vICAgICAgICBeCiAgICAgICAgLy8gICAgICAgICBsZXQgI3QxID0gZTEgaW4gI3QxID09IG51bGwgPyBudWxsIDogI3QxLnJ1bnRpbWVUeXBlKQogICAgICAgIGtpbmQgPSBSdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzOwogICAgICAgIHJlY2VpdmVyID0gbm9kZS5yZWNlaXZlcjsKICAgICAgICByZWNlaXZlckdldCA9IG5vZGU7CiAgICAgICAgYXJndW1lbnQgPSBudWxsQXdhcmUucmVjZWl2ZXI7CiAgICAgICAgYXJndW1lbnRHZXQgPSBudWxsQXdhcmUuZXhwcmVzc2lvbjsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc0ludm9rZVRvU3RyaW5nKG5vZGUucGFyZW50KSkgewogICAgICAvLyBEZXRlY3RlZAogICAgICAvLwogICAgICAvLyAgICAgZS5ydW50aW1lVHlwZS50b1N0cmluZygpCiAgICAgIC8vICAgICAgIF4KICAgICAga2luZCA9IFJ1bnRpbWVUeXBlVXNlS2luZC5zdHJpbmc7CiAgICAgIHJlY2VpdmVyID0gbm9kZS5yZWNlaXZlcjsKICAgICAgcmVjZWl2ZXJHZXQgPSBub2RlOwogICAgfQogIH0gZWxzZSBpZiAobm9kZS5wYXJlbnQgaXMgaXIuQXJndW1lbnRzICYmCiAgICAgIG5vZGUucGFyZW50LnBhcmVudCBpcyBpci5NZXRob2RJbnZvY2F0aW9uKSB7CiAgICBpci5NZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSBub2RlLnBhcmVudC5wYXJlbnQ7CiAgICBpZiAobWV0aG9kSW52b2NhdGlvbi5uYW1lLm5hbWUgPT0gJz09JyAmJgogICAgICAgIG1ldGhvZEludm9jYXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWwuZmlyc3QgPT0gbm9kZSkgewogICAgICAvLyBbbm9kZV0gaXMgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiA9PS4KICAgICAgaXIuUHJvcGVydHlHZXQgb3RoZXJHZXRSdW50aW1lVHlwZSA9CiAgICAgICAgICBhc0dldFJ1bnRpbWVUeXBlKG1ldGhvZEludm9jYXRpb24ucmVjZWl2ZXIpOwogICAgICBOdWxsQXdhcmVFeHByZXNzaW9uIG51bGxBd2FyZSA9CiAgICAgICAgICBnZXROdWxsQXdhcmVFeHByZXNzaW9uKG1ldGhvZEludm9jYXRpb24ucmVjZWl2ZXIpOwoKICAgICAgaWYgKG90aGVyR2V0UnVudGltZVR5cGUgIT0gbnVsbCkgewogICAgICAgIC8vIERldGVjdGVkCiAgICAgICAgLy8KICAgICAgICAvLyAgICAgZTAucnVudGltZVR5cGUgPT0gZTEucnVudGltZVR5cGUKICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgICAgIC8vIGVuY29kZWQgYXMKICAgICAgICAvLwogICAgICAgIC8vICAgICBlMC5ydW50aW1lVHlwZS49PShlMS5ydW50aW1lVHlwZSkKICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgICAgIGtpbmQgPSBSdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzOwogICAgICAgIHJlY2VpdmVyID0gb3RoZXJHZXRSdW50aW1lVHlwZS5yZWNlaXZlcjsKICAgICAgICByZWNlaXZlckdldCA9IG90aGVyR2V0UnVudGltZVR5cGU7CiAgICAgICAgYXJndW1lbnQgPSBub2RlLnJlY2VpdmVyOwogICAgICAgIGFyZ3VtZW50R2V0ID0gbm9kZTsKICAgICAgfSBlbHNlIGlmIChudWxsQXdhcmUgIT0gbnVsbCAmJiBpc0dldFJ1bnRpbWVUeXBlKG51bGxBd2FyZS5leHByZXNzaW9uKSkgewogICAgICAgIC8vIERldGVjdGVkCiAgICAgICAgLy8KICAgICAgICAvLyAgICAgZTA/LnJ1bnRpbWVUeXBlID09IGUxLnJ1bnRpbWVUeXBlCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgICAgICAgLy8gZW5jb2RlZCBhcwogICAgICAgIC8vCiAgICAgICAgLy8gICAgIChsZXQgI3QxID0gZTAgaW4gI3QxID09IG51bGwgPyBudWxsIDogI3QxLnJ1bnRpbWVUeXBlKQogICAgICAgIC8vICAgICAgICAgLj09KGUxLnJ1bnRpbWVUeXBlKQogICAgICAgIC8vICAgICAgICAgICAgICAgIF4KICAgICAgICBraW5kID0gUnVudGltZVR5cGVVc2VLaW5kLmVxdWFsczsKICAgICAgICByZWNlaXZlciA9IG51bGxBd2FyZS5yZWNlaXZlcjsKICAgICAgICByZWNlaXZlckdldCA9IG51bGxBd2FyZS5leHByZXNzaW9uOwogICAgICAgIGFyZ3VtZW50ID0gbm9kZS5yZWNlaXZlcjsKICAgICAgICBhcmd1bWVudEdldCA9IG5vZGU7CiAgICAgIH0KICAgIH0KICB9IGVsc2UgaWYgKG5vZGUucGFyZW50IGlzIGlyLlN0cmluZ0NvbmNhdGVuYXRpb24pIHsKICAgIC8vIERldGVjdGVkCiAgICAvLwogICAgLy8gICAgICcke2UucnVudGltZVR5cGV9JwogICAgLy8gICAgICAgICAgXgogICAga2luZCA9IFJ1bnRpbWVUeXBlVXNlS2luZC5zdHJpbmc7CiAgICByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CiAgICByZWNlaXZlckdldCA9IG5vZGU7CiAgfQoKICBpZiAoa2luZCA9PSBudWxsKSB7CiAgICAvLyBEZWZhdWx0IHRvIHVua25vd24KICAgIC8vCiAgICAvLyAgICAgZS5ydW50aW1lVHlwZQogICAgLy8gICAgICAgXgogICAga2luZCA9IFJ1bnRpbWVUeXBlVXNlS2luZC51bmtub3duOwogICAgcmVjZWl2ZXIgPSBub2RlLnJlY2VpdmVyOwogICAgcmVjZWl2ZXJHZXQgPSBub2RlOwogIH0KCiAgUnVudGltZVR5cGVVc2VEYXRhIGRhdGEgPSBuZXcgUnVudGltZVR5cGVVc2VEYXRhKAogICAgICBraW5kLCByZWNlaXZlckdldCwgcmVjZWl2ZXIsIGFyZ3VtZW50R2V0LCBhcmd1bWVudCk7CiAgY2FjaGVbcmVjZWl2ZXJHZXRdID0gZGF0YTsKICBpZiAoYXJndW1lbnRHZXQgIT0gbnVsbCkgewogICAgY2FjaGVbYXJndW1lbnRHZXRdID0gZGF0YTsKICB9CgogIGFzc2VydChyZWNlaXZlckdldCAhPSBudWxsLCAiTWlzc2luZyByZWNlaXZlckdldCBpbiAkZGF0YSBmb3IgJG5vZGUuIik7CiAgYXNzZXJ0KCEoYXJndW1lbnQgIT0gbnVsbCAmJiBhcmd1bWVudEdldCA9PSBudWxsKSwKICAgICAgIk1pc3NpbmcgYXJndW1lbnRHZXQgaW4gJGRhdGEgZm9yICRub2RlLiIpOwogIGFzc2VydCgKICAgICAgcmVjZWl2ZXJHZXQgIT0gYXJndW1lbnRHZXQsICJEdXBsaWNhdGUgcHJvcGVydHkgZ2V0IGluICRkYXRhIGZvciAkbm9kZS4iKTsKICByZXR1cm4gZGF0YTsKfQqBoQBOTjwBKAEfFAE7Gk05CwEyKAoBSiIKAgFFGhssIQFOMgEfIAFRDxwBTiYzAUggAVEPHAFPNwEYFCcmJSY9BkgEAQwWLEVOOgQCAUsMBEsuKkoxMQE/LFEEAUkRNjEEAT4sSAQBIgE7HhoeGhsBKTEmUB0iCUE3ATgvJD0dLzIWDSwWGA1RRjsNLCkeCjxBOjIWDScvTS0YDzUZGg9KPyouKyA1RwwBRzwoPRgPNhkaD0o/UQ8uKyAwNQw5Fg0rFhgNRzghDSwpHgo1PEgyTDcBLzsvQQEtGA81KxoPJk1CLjUvKyAMASg9GA82LBoPSlFGLjA1KyAMCj8UCyMXFgtIPConHA8eCx4UFgtDNSsnHAgGNiZQRxIJJxEUCUwbKCAaBjM4Li0tAStJJk8pFAswFBYLMRQqIhwxK1AUCzEUFgsiFEkqIhwnLAgwEgkmESggGgYsMz8uPy4rNyY9ASkUCzAmFgsxJioxKyIcUBQLMScWC0YnHConLCIcCAY2EAceEiYeGAQBFhoHGQ8nHhgEATQ7HR0fBAFKNTIKUQ8CATJwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9ydW50aW1lX3R5cGVfYW5hbHlzaXMuZGFydDdzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29sbGVjdGlvbi9saWIvY29sbGVjdGlvbi5kYXJ0gzovLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKZXhwb3J0ICJzcmMvYWxnb3JpdGhtcy5kYXJ0IjsKZXhwb3J0ICJzcmMvY2Fub25pY2FsaXplZF9tYXAuZGFydCI7CmV4cG9ydCAic3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX2l0ZXJhYmxlLmRhcnQiOwpleHBvcnQgInNyYy9jb21iaW5lZF93cmFwcGVycy9jb21iaW5lZF9saXN0LmRhcnQiOwpleHBvcnQgInNyYy9jb21iaW5lZF93cmFwcGVycy9jb21iaW5lZF9tYXAuZGFydCI7CmV4cG9ydCAic3JjL2NvbXBhcmF0b3JzLmRhcnQiOwpleHBvcnQgInNyYy9lcXVhbGl0eS5kYXJ0IjsKZXhwb3J0ICJzcmMvZXF1YWxpdHlfbWFwLmRhcnQiOwpleHBvcnQgInNyYy9lcXVhbGl0eV9zZXQuZGFydCI7CmV4cG9ydCAic3JjL2Z1bmN0aW9ucy5kYXJ0IjsKZXhwb3J0ICJzcmMvaXRlcmFibGVfemlwLmRhcnQiOwpleHBvcnQgInNyYy9wcmlvcml0eV9xdWV1ZS5kYXJ0IjsKZXhwb3J0ICJzcmMvcXVldWVfbGlzdC5kYXJ0IjsKZXhwb3J0ICJzcmMvdW5pb25fc2V0LmRhcnQiOwpleHBvcnQgInNyYy91bmlvbl9zZXRfY29udHJvbGxlci5kYXJ0IjsKZXhwb3J0ICJzcmMvdW5tb2RpZmlhYmxlX3dyYXBwZXJzLmRhcnQiOwpleHBvcnQgInNyYy93cmFwcGVycy5kYXJ0IjsKFwBOTjwBHiU3MzIfHCAgHSAiHh0oKRwBInBhY2thZ2U6Y29sbGVjdGlvbi9jb2xsZWN0aW9uLmRhcnQ3c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2RhcnQyanNfaW5mby9saWIvc3JjL3V0aWwuZGFydIytLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqc19pbmZvLnNyYy51dGlsOwoKaW1wb3J0ICdwYWNrYWdlOmRhcnQyanNfaW5mby9pbmZvLmRhcnQnOwoKaW1wb3J0ICdncmFwaC5kYXJ0JzsKCi8vLyBDb21wdXRlcyBhIGdyYXBoIG9mIGRlcGVuZGVuY2llcyBmcm9tIFtpbmZvXS4KR3JhcGg8SW5mbz4gZ3JhcGhGcm9tSW5mbyhBbGxJbmZvIGluZm8pIHsKICBwcmludCgnICBpbmZvOiBkZXBlbmRlbmN5IGdyYXBoIGluZm9ybWF0aW9uIGlzIHdvcmsgaW4gcHJvZ3Jlc3MgYW5kJwogICAgICAnIG1pZ2h0IGJlIGluY29tcGxldGUnKTsKICAvLyBOb3RlOiB3ZSBhcmUgY29tYmluaW5nIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gdGhhdCBpcyBjb21wdXRlZCBpbiB0d28gd2F5cwogIC8vIChmdW5jdGlvbkluZm8udXNlcyB2cyBhbGxJbmZvLmRlcGVuZGVuY2llcykuCiAgLy8gVE9ETyhzaWdtdW5kKTogZml4IGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIHRoZXNlIHR3byB3YXlzLCBzdGljayB3aXRoIG9uZQogIC8vIG9mIHRoZW0uCiAgLy8gVE9ETyhzaWdtdW5kKTogY3JlYXRlIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgSW5mb0dyYXBoLCBpbnN0ZWFkIG9mCiAgLy8gdXNpbmcgdGhlIEVkZ2VMaXN0R3JhcGguCiAgdmFyIGdyYXBoID0gbmV3IEVkZ2VMaXN0R3JhcGg8SW5mbz4oKTsKICBmb3IgKHZhciBmIGluIGluZm8uZnVuY3Rpb25zKSB7CiAgICBncmFwaC5hZGROb2RlKGYpOwogICAgZm9yICh2YXIgZyBpbiBmLnVzZXMpIHsKICAgICAgZ3JhcGguYWRkRWRnZShmLCBnLnRhcmdldCk7CiAgICB9CiAgICBpZiAoaW5mby5kZXBlbmRlbmNpZXNbZl0gIT0gbnVsbCkgewogICAgICBmb3IgKHZhciBnIGluIGluZm8uZGVwZW5kZW5jaWVzW2ZdKSB7CiAgICAgICAgZ3JhcGguYWRkRWRnZShmLCBnKTsKICAgICAgfQogICAgfQogIH0KCiAgZm9yICh2YXIgZiBpbiBpbmZvLmZpZWxkcykgewogICAgZ3JhcGguYWRkTm9kZShmKTsKICAgIGZvciAodmFyIGcgaW4gZi51c2VzKSB7CiAgICAgIGdyYXBoLmFkZEVkZ2UoZiwgZy50YXJnZXQpOwogICAgfQogICAgaWYgKGluZm8uZGVwZW5kZW5jaWVzW2ZdICE9IG51bGwpIHsKICAgICAgZm9yICh2YXIgZyBpbiBpbmZvLmRlcGVuZGVuY2llc1tmXSkgewogICAgICAgIGdyYXBoLmFkZEVkZ2UoZiwgZyk7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBncmFwaDsKfQoKLy8vIFByb3ZpZGUgYSB1bmlxdWUgbG9uZyBuYW1lIGFzc29jaWF0ZWQgd2l0aCBbaW5mb10uCi8vIFRPRE8oc2lnbXVuZCk6IGd1YXJhbnRlZSB0aGF0IHRoZSBuYW1lIGlzIGFjdHVhbGx5IHVuaXF1ZS4KU3RyaW5nIGxvbmdOYW1lKEluZm8gaW5mbywge2Jvb2wgdXNlTGlicmFyeVVyaTogZmFsc2UsIGJvb2wgZm9ySWQ6IGZhbHNlfSkgewogIHZhciBpbmZvUGF0aCA9IFtdOwogIHdoaWxlIChpbmZvICE9IG51bGwpIHsKICAgIGluZm9QYXRoLmFkZChpbmZvKTsKICAgIGluZm8gPSBpbmZvLnBhcmVudDsKICB9CiAgdmFyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogIHZhciBmaXJzdCA9IHRydWU7CiAgZm9yICh2YXIgc2VnbWVudCBpbiBpbmZvUGF0aC5yZXZlcnNlZCkgewogICAgaWYgKCFmaXJzdCkgc2Iud3JpdGUoJy4nKTsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IGVuc3VyZSB0aGF0IHRoZSBmaXJzdCBzZWdtZW50IGlzIGEgTGlicmFyeUluZm8uCiAgICAvLyBhc3NlcnQoIWZpcnN0IHx8IHNlZ21lbnQgaXMgTGlicmFyeUluZm8pOwogICAgLy8gKHRvZGF5IG1pZ2h0IG5vdCBiZSB0cnVlIGZvciBmb3IgY2xvc3VyZSBjbGFzc2VzKS4KICAgIGlmIChzZWdtZW50IGlzIExpYnJhcnlJbmZvKSB7CiAgICAgIC8vIFRPRE8oa2V2bW9vKTogUmVtb3ZlIHRoaXMgd2hlbiBkYXJ0MmpzIGNhbiBiZSBpbnZva2VkIHdpdGggYW4gYXBwLXJvb3QKICAgICAgLy8gY3VzdG9tIFVSSQogICAgICBpZiAodXNlTGlicmFyeVVyaSAmJiBmb3JJZCAmJiBzZWdtZW50LnVyaS5pc1NjaGVtZSgnZmlsZScpKSB7CiAgICAgICAgYXNzZXJ0KFVyaS5iYXNlLmlzU2NoZW1lKCdmaWxlJykpOwogICAgICAgIHZhciBjdXJyZW50QmFzZSA9IFVyaS5iYXNlLnBhdGg7CiAgICAgICAgdmFyIHNlZ21lbnRTdHJpbmcgPSBzZWdtZW50LnVyaS5wYXRoOwoKICAgICAgICAvLyBJZiBsb25nTmFtZSBpcyBiZWluZyBjYWxsZWQgdG8gY2FsY3VsYXRlIGFuIGVsZW1lbnQgSUQgKGZvcklkID0gdHJ1ZSkKICAgICAgICAvLyB0aGVuIHVzZSBhIHJlbGF0aXZlIHBhdGggZm9yIHRoZSBsb25nTmFtZSBjYWxjdWxhdGlvbgogICAgICAgIC8vIFRoaXMgYWxsb3dzIGEgbW9yZSBzdGFibGUgSUQgZm9yIGNhc2VzIHdoZW4gZmlsZXMgYXJlIGdlbmVyYXRlZCBpbnRvCiAgICAgICAgLy8gdGVtcCBkaXJlY3RvcmllcyDigJMgZS5nLiB3aXRoIHBrZzpidWlsZF93ZWJfY29tcGlsZXJzCiAgICAgICAgaWYgKHNlZ21lbnRTdHJpbmcuc3RhcnRzV2l0aChjdXJyZW50QmFzZSkpIHsKICAgICAgICAgIHNlZ21lbnRTdHJpbmcgPSBzZWdtZW50U3RyaW5nLnN1YnN0cmluZyhjdXJyZW50QmFzZS5sZW5ndGgpOwogICAgICAgIH0KCiAgICAgICAgc2Iud3JpdGUoc2VnbWVudFN0cmluZyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2Iud3JpdGUodXNlTGlicmFyeVVyaSA/IHNlZ21lbnQudXJpIDogc2VnbWVudC5uYW1lKTsKICAgICAgfQogICAgICBzYi53cml0ZSgnOjonKTsKICAgIH0gZWxzZSB7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIHNiLndyaXRlKHNlZ21lbnQubmFtZSk7CiAgICB9CiAgfQogIHJldHVybiBzYi50b1N0cmluZygpOwp9CgovLy8gUHJvZHVjZSBhIHN0cmluZyBjb250YWluaW5nIFt2YWx1ZV0gcGFkZGVkIHdpdGggd2hpdGUgc3BhY2UgdXAgdG8gW25dIGNoYXJzLgpwYWQodmFsdWUsIG4sIHtib29sIHJpZ2h0OiBmYWxzZX0pIHsKICB2YXIgcyA9ICckdmFsdWUnOwogIGlmIChzLmxlbmd0aCA+PSBuKSByZXR1cm4gczsKICB2YXIgcGFkID0gJyAnICogKG4gLSBzLmxlbmd0aCk7CiAgcmV0dXJuIHJpZ2h0ID8gJyRzJHBhZCcgOiAnJHBhZCRzJzsKfQplAE5OPAEfASkBFQEyKkcfUDJPDk4eKSIWHCIGKCwdCAYEAR8WHCIGKCwdCAYEARACATc+TRUZGBgEHxQrH0YxOiJQFEQrKS4BUUFQQDVHCgEhDz4IFg0VHgYEGAIBUSUUHyImAgEicGFja2FnZTpkYXJ0MmpzX2luZm8vc3JjL3V0aWwuZGFydD5zZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvZGFydDJqc19pbmZvL2xpYi9zcmMvYmluYXJ5L3NpbmsuZGFydKwpLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwoKLy8vIEludGVyZmFjZSBmb3Igc2VyaWFsaXphdGlvbi4KLy8gVE9ETyhzaWdtdW5kKTogc2hhcmUgdGhpcyB3aXRoIHBrZzpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi8qCmFic3RyYWN0IGNsYXNzIERhdGFTaW5rIHsKICAvLy8gVGhlIGFtb3VudCBvZiBkYXRhIHdyaXR0ZW4gdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIFRoZSB1bml0cyBpcyBiYXNlZCBvbiB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZSBmb3IgdGhpcyBkYXRhIHNpbmsuCiAgaW50IGdldCBsZW5ndGg7CgogIC8vLyBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgYW5kIGNsb3NlcyB0aGlzIGRhdGEgc2luay4KICAvLy8KICAvLy8gVGhlIGRhdGEgc2luayBjYW4gbm8gbG9uZ2VyIGJlIHdyaXR0ZW4gdG8gYWZ0ZXIgY2xvc2luZy4KICB2b2lkIGNsb3NlKCk7CgogIC8vLyBXcml0ZXMgYSByZWZlcmVuY2UgdG8gW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4gSWYgW3ZhbHVlXSBoYXMgbm90IHlldAogIC8vLyBiZWVuIHNlcmlhbGl6ZWQsIFtmXSBpcyBjYWxsZWQgdG8gc2VyaWFsaXplIHRoZSB2YWx1ZSBpdHNlbGYuCiAgdm9pZCB3cml0ZUNhY2hlZDxFPihFIHZhbHVlLCB2b2lkIGYoRSB2YWx1ZSkpOwoKICAvLy8gV3JpdGVzIHRoZSBwb3RlbnRpYWxseSBgbnVsbGAgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4gSWYgW3ZhbHVlXSBpcwogIC8vLyBub24tbnVsbCBbZl0gaXMgY2FsbGVkIHRvIHdyaXRlIHRoZSBub24tbnVsbCB2YWx1ZSB0byB0aGUgZGF0YSBzaW5rLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkVmFsdWVPck51bGxdLgogIHZvaWQgd3JpdGVWYWx1ZU9yTnVsbDxFPihFIHZhbHVlLCB2b2lkIGYoRSB2YWx1ZSkpOwoKICAvLy8gV3JpdGVzIHRoZSBbdmFsdWVzXSB0byB0aGlzIGRhdGEgc2luayBjYWxsaW5nIFtmXSB0byB3cml0ZSBlYWNoIHZhbHVlIHRvCiAgLy8vIHRoZSBkYXRhIHNpbmsuIElmIFthbGxvd051bGxdIGlzIGB0cnVlYCwgW3ZhbHVlc10gaXMgYWxsb3dlZCB0byBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRMaXN0XS4KICB2b2lkIHdyaXRlTGlzdDxFPihJdGVyYWJsZTxFPiB2YWx1ZXMsIHZvaWQgZihFIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pOwoKICAvLy8gV3JpdGVzIHRoZSBib29sZWFuIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZUJvb2woYm9vbCB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgdGhlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZUludChpbnQgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHRoZSBwb3RlbnRpYWxseSBgbnVsbGAgbm9uLW5lZ2F0aXZlIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRJbnRPck51bGxdLgogIHZvaWQgd3JpdGVJbnRPck51bGwoaW50IHZhbHVlKTsKCiAgLy8vIFdyaXRlcyB0aGUgc3RyaW5nIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgdmFsdWUpOwoKICAvLy8gV3JpdGVzIHRoZSBwb3RlbnRpYWxseSBgbnVsbGAgc3RyaW5nIFt2YWx1ZV0gdG8gdGhpcyBkYXRhIHNpbmsuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU291cmNlLnJlYWRTdHJpbmdPck51bGxdLgogIHZvaWQgd3JpdGVTdHJpbmdPck51bGwoU3RyaW5nIHZhbHVlKTsKCiAgLy8vIFdyaXRlcyB0aGUgc3RyaW5nIFt2YWx1ZXNdIHRvIHRoaXMgZGF0YSBzaW5rLiBJZiBbYWxsb3dOdWxsXSBpcyBgdHJ1ZWAsCiAgLy8vIFt2YWx1ZXNdIGlzIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkU3RyaW5nc10uCiAgdm9pZCB3cml0ZVN0cmluZ3MoSXRlcmFibGU8U3RyaW5nPiB2YWx1ZXMsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKCiAgLy8vIFdyaXRlcyB0aGUgW21hcF0gZnJvbSBzdHJpbmcgdG8gW1ZdIHZhbHVlcyB0byB0aGlzIGRhdGEgc2luaywgY2FsbGluZyBbZl0KICAvLy8gdG8gd3JpdGUgZWFjaCB2YWx1ZSB0byB0aGUgZGF0YSBzaW5rLiBJZiBbYWxsb3dOdWxsXSBpcyBgdHJ1ZWAsIFttYXBdIGlzCiAgLy8vIGFsbG93ZWQgdG8gYmUgYG51bGxgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNvdXJjZS5yZWFkU3RyaW5nTWFwXS4KICB2b2lkIHdyaXRlU3RyaW5nTWFwPFY+KE1hcDxTdHJpbmcsIFY+IG1hcCwgdm9pZCBmKFYgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSk7CgogIC8vLyBXcml0ZXMgdGhlIGVudW0gdmFsdWUgW3ZhbHVlXSB0byB0aGlzIGRhdGEgc2luay4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDaGFuZ2UgdGhlIHNpZ25hdHVyZSB0bwogIC8vIGB2b2lkIHdyaXRlRW51bTxFIGV4dGVuZHMgRW51bTxFPj4oRSB2YWx1ZSk7YCB3aGVuIGFuIGludGVyZmFjZSBmb3IgZW51bXMKICAvLyBpcyBhZGRlZCB0byB0aGUgbGFuZ3VhZ2UuCiAgdm9pZCB3cml0ZUVudW0oZHluYW1pYyB2YWx1ZSk7CgogIC8vLyBXcml0ZXMgdGhlIFVSSSBbdmFsdWVdIHRvIHRoaXMgZGF0YSBzaW5rLgogIHZvaWQgd3JpdGVVcmkoVXJpIHZhbHVlKTsKfQoKLy8vIE1peGluIHRoYXQgaW1wbGVtZW50cyBhbGwgY29udmVuaWVuY2UgbWV0aG9kcyBvZiBbRGF0YVNpbmtdLgphYnN0cmFjdCBjbGFzcyBEYXRhU2lua01peGluIGltcGxlbWVudHMgRGF0YVNpbmsgewogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVJbnRPck51bGwoaW50IHZhbHVlKSB7CiAgICB3cml0ZUJvb2wodmFsdWUgIT0gbnVsbCk7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB3cml0ZUludCh2YWx1ZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlU3RyaW5nT3JOdWxsKFN0cmluZyB2YWx1ZSkgewogICAgd3JpdGVCb29sKHZhbHVlICE9IG51bGwpOwogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgd3JpdGVTdHJpbmcodmFsdWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVN0cmluZ3MoSXRlcmFibGU8U3RyaW5nPiB2YWx1ZXMsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGFsbG93TnVsbCk7CiAgICAgIHdyaXRlSW50KDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVJbnQodmFsdWVzLmxlbmd0aCk7CiAgICAgIGZvciAoU3RyaW5nIHZhbHVlIGluIHZhbHVlcykgewogICAgICAgIHdyaXRlU3RyaW5nKHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVN0cmluZ01hcDxWPihNYXA8U3RyaW5nLCBWPiBtYXAsIHZvaWQgZihWIHZhbHVlKSwKICAgICAge2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIGlmIChtYXAgPT0gbnVsbCkgewogICAgICBhc3NlcnQoYWxsb3dOdWxsKTsKICAgICAgd3JpdGVJbnQoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUludChtYXAubGVuZ3RoKTsKICAgICAgbWFwLmZvckVhY2goKFN0cmluZyBrZXksIFYgdmFsdWUpIHsKICAgICAgICB3cml0ZVN0cmluZyhrZXkpOwogICAgICAgIGYodmFsdWUpOwogICAgICB9KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVMaXN0PEU+KEl0ZXJhYmxlPEU+IHZhbHVlcywgdm9pZCBmKEUgdmFsdWUpLAogICAgICB7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CiAgICAgIGFzc2VydChhbGxvd051bGwpOwogICAgICB3cml0ZUludCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlSW50KHZhbHVlcy5sZW5ndGgpOwogICAgICB2YWx1ZXMuZm9yRWFjaChmKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVWYWx1ZU9yTnVsbDxFPihFIHZhbHVlLCB2b2lkIGYoRSB2YWx1ZSkpIHsKICAgIHdyaXRlQm9vbCh2YWx1ZSAhPSBudWxsKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIGYodmFsdWUpOwogICAgfQogIH0KfQoKLy8vIERhdGEgc2luayBoZWxwZXIgdGhhdCBjYW5vbmljYWxpemVzIFtFXSB2YWx1ZXMgdXNpbmcgaW5kaWNlcy4KY2xhc3MgSW5kZXhlZFNpbms8RT4gewogIGZpbmFsIHZvaWQgRnVuY3Rpb24oaW50KSBfd3JpdGVJbnQ7CiAgZmluYWwgTWFwPEUsIGludD4gX2NhY2hlID0ge307CgogIEluZGV4ZWRTaW5rKHRoaXMuX3dyaXRlSW50KTsKCiAgLy8vIFdyaXRlIGEgcmVmZXJlbmNlIHRvIFt2YWx1ZV0gdG8gdGhlIGRhdGEgc2luay4KICAvLy8KICAvLy8gSWYgW3ZhbHVlXSBoYXMgbm90IGJlZW4gY2Fub25pY2FsaXplZCB5ZXQsIFt3cml0ZVZhbHVlXSBpcyBjYWxsZWQgdG8KICAvLy8gc2VyaWFsaXplIHRoZSBbdmFsdWVdIGl0c2VsZi4KICB2b2lkIHdyaXRlKEUgdmFsdWUsIHZvaWQgd3JpdGVWYWx1ZShFIHZhbHVlKSkgewogICAgaW50IGluZGV4ID0gX2NhY2hlW3ZhbHVlXTsKICAgIGlmIChpbmRleCA9PSBudWxsKSB7CiAgICAgIGluZGV4ID0gX2NhY2hlLmxlbmd0aDsKICAgICAgX2NhY2hlW3ZhbHVlXSA9IGluZGV4OwogICAgICBfd3JpdGVJbnQoaW5kZXgpOwogICAgICB3cml0ZVZhbHVlKHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIF93cml0ZUludChpbmRleCk7CiAgICB9CiAgfQp9CgovLy8gQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBbRGF0YVNpbmtdIHVzaW5nIFtEYXRhU2lua01peGluXSB0byBpbXBsZW1lbnQKLy8vIGNvbnZlbmllbmNlIG1ldGhvZHMuCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGF0YVNpbmsgZXh0ZW5kcyBEYXRhU2lua01peGluIGltcGxlbWVudHMgRGF0YVNpbmsgewogIEluZGV4ZWRTaW5rPFN0cmluZz4gX3N0cmluZ0luZGV4OwogIEluZGV4ZWRTaW5rPFVyaT4gX3VyaUluZGV4OwogIE1hcDxUeXBlLCBJbmRleGVkU2luaz4gX2dlbmVyYWxDYWNoZXMgPSB7fTsKCiAgQWJzdHJhY3REYXRhU2luaygpIHsKICAgIF9zdHJpbmdJbmRleCA9IG5ldyBJbmRleGVkU2luazxTdHJpbmc+KF93cml0ZUludEludGVybmFsKTsKICAgIF91cmlJbmRleCA9IG5ldyBJbmRleGVkU2luazxVcmk+KF93cml0ZUludEludGVybmFsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDYWNoZWQ8RT4oRSB2YWx1ZSwgdm9pZCBmKEUgdmFsdWUpKSB7CiAgICBJbmRleGVkU2luayBzaW5rID0KICAgICAgICBfZ2VuZXJhbENhY2hlc1tFXSA/Pz0gbmV3IEluZGV4ZWRTaW5rPEU+KF93cml0ZUludEludGVybmFsKTsKICAgIHNpbmsud3JpdGUodmFsdWUsICh2KSA9PiBmKHYpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVFbnVtKGR5bmFtaWMgdmFsdWUpIHsKICAgIF93cml0ZUVudW1JbnRlcm5hbCh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQm9vbChib29sIHZhbHVlKSB7CiAgICBhc3NlcnQodmFsdWUgIT0gbnVsbCk7CiAgICBfd3JpdGVJbnRJbnRlcm5hbCh2YWx1ZSA/IDEgOiAwKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVVcmkoVXJpIHZhbHVlKSB7CiAgICBhc3NlcnQodmFsdWUgIT0gbnVsbCk7CiAgICBfd3JpdGVVcmkodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgdmFsdWUpIHsKICAgIGFzc2VydCh2YWx1ZSAhPSBudWxsKTsKICAgIF93cml0ZVN0cmluZyh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlSW50KGludCB2YWx1ZSkgewogICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwogICAgYXNzZXJ0KHZhbHVlID49IDAgJiYgdmFsdWUgPj4gMzAgPT0gMCk7CiAgICBfd3JpdGVJbnRJbnRlcm5hbCh2YWx1ZSk7CiAgfQoKICB2b2lkIF93cml0ZVN0cmluZyhTdHJpbmcgdmFsdWUpIHsKICAgIF9zdHJpbmdJbmRleC53cml0ZSh2YWx1ZSwgX3dyaXRlU3RyaW5nSW50ZXJuYWwpOwogIH0KCiAgdm9pZCBfd3JpdGVVcmkoVXJpIHZhbHVlKSB7CiAgICBfdXJpSW5kZXgud3JpdGUodmFsdWUsIF93cml0ZVVyaUludGVybmFsKTsKICB9CgogIC8vLyBBY3R1YWwgc2VyaWFsaXphdGlvbiBvZiBhIFVSSSB2YWx1ZSwgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KICB2b2lkIF93cml0ZVVyaUludGVybmFsKFVyaSB2YWx1ZSk7CgogIC8vLyBBY3R1YWwgc2VyaWFsaXphdGlvbiBvZiBhIFN0cmluZyB2YWx1ZSwgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KICB2b2lkIF93cml0ZVN0cmluZ0ludGVybmFsKFN0cmluZyB2YWx1ZSk7CgogIC8vLyBBY3R1YWwgc2VyaWFsaXphdGlvbiBvZiBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlLCBpbXBsZW1lbnRlZCBieQogIC8vLyBzdWJjbGFzc2VzLgogIHZvaWQgX3dyaXRlSW50SW50ZXJuYWwoaW50IHZhbHVlKTsKCiAgLy8vIEFjdHVhbCBzZXJpYWxpemF0aW9uIG9mIGFuIGVudW0gdmFsdWUsIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuCiAgdm9pZCBfd3JpdGVFbnVtSW50ZXJuYWwoZHluYW1pYyB2YWx1ZSk7Cn0KCi8vLyBbRGF0YVNpbmtdIHRoYXQgd3JpdGVzIGRhdGEgYXMgYSBzZXF1ZW5jZSBvZiBieXRlcy4KLy8vCi8vLyBUaGlzIGRhdGEgc2luayB3b3JrcyB0b2dldGhlciB3aXRoIFtCaW5hcnlTb3VyY2VdLgpjbGFzcyBCaW5hcnlTaW5rIGV4dGVuZHMgQWJzdHJhY3REYXRhU2luayB7CiAgZmluYWwgU2luazxMaXN0PGludD4+IHNpbms7CiAgQnVmZmVyZWRTaW5rIF9idWZmZXJlZFNpbms7CiAgaW50IF9sZW5ndGggPSAwOwoKICBCaW5hcnlTaW5rKHRoaXMuc2luaykgOiBfYnVmZmVyZWRTaW5rID0gbmV3IEJ1ZmZlcmVkU2luayhzaW5rKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBfd3JpdGVVcmlJbnRlcm5hbChVcmkgdmFsdWUpIHsKICAgIF93cml0ZVN0cmluZyh2YWx1ZS50b1N0cmluZygpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX3dyaXRlU3RyaW5nSW50ZXJuYWwoU3RyaW5nIHZhbHVlKSB7CiAgICBMaXN0PGludD4gYnl0ZXMgPSB1dGY4LmVuY29kZSh2YWx1ZSk7CiAgICBfd3JpdGVJbnRJbnRlcm5hbChieXRlcy5sZW5ndGgpOwogICAgX2J1ZmZlcmVkU2luay5hZGRCeXRlcyhieXRlcyk7CiAgICBfbGVuZ3RoICs9IGJ5dGVzLmxlbmd0aDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgX3dyaXRlSW50SW50ZXJuYWwoaW50IHZhbHVlKSB7CiAgICBhc3NlcnQodmFsdWUgPj0gMCAmJiB2YWx1ZSA+PiAzMCA9PSAwKTsKICAgIGlmICh2YWx1ZSA8IDB4ODApIHsKICAgICAgX2J1ZmZlcmVkU2luay5hZGRCeXRlKHZhbHVlKTsKICAgICAgX2xlbmd0aCArPSAxOwogICAgfSBlbHNlIGlmICh2YWx1ZSA8IDB4NDAwMCkgewogICAgICBfYnVmZmVyZWRTaW5rLmFkZEJ5dGUyKCh2YWx1ZSA+PiA4KSB8IDB4ODAsIHZhbHVlICYgMHhGRik7CiAgICAgIF9sZW5ndGggKz0gMjsKICAgIH0gZWxzZSB7CiAgICAgIF9idWZmZXJlZFNpbmsuYWRkQnl0ZTQoKHZhbHVlID4+IDI0KSB8IDB4QzAsICh2YWx1ZSA+PiAxNikgJiAweEZGLAogICAgICAgICAgKHZhbHVlID4+IDgpICYgMHhGRiwgdmFsdWUgJiAweEZGKTsKICAgICAgX2xlbmd0aCArPSA0OwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBfd3JpdGVFbnVtSW50ZXJuYWwoZHluYW1pYyB2YWx1ZSkgewogICAgX3dyaXRlSW50SW50ZXJuYWwodmFsdWUuaW5kZXgpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9idWZmZXJlZFNpbmsuZmx1c2hBbmREZXN0cm95KCk7CiAgICBfYnVmZmVyZWRTaW5rID0gbnVsbDsKICAgIHNpbmsuY2xvc2UoKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGlzIGRhdGEgc2luay4KICBpbnQgZ2V0IGxlbmd0aCA9PiBfbGVuZ3RoOwp9CgovLy8gUHV0cyBhIGJ1ZmZlciBpbiBmcm9udCBvZiBhIFtTaW5rPExpc3Q8aW50Pj5dLgovLyBUT0RPKHNpZ211bmQpOiBzaGFyZSB3aXRoIHRoZSBpbXBsZW1lbnRhdGlvbiBpbgovLyBwYWNrYWdlOmtlcm5lbC9iaW5hcnkvYXN0X3RvX2JpbmFyeS5kYXJ0CmNsYXNzIEJ1ZmZlcmVkU2luayB7CiAgc3RhdGljIGNvbnN0IGludCBTSVpFID0gMTAwMDAwOwogIHN0YXRpYyBjb25zdCBpbnQgU0FGRV9TSVpFID0gU0laRSAtIDU7CiAgc3RhdGljIGNvbnN0IGludCBTTUFMTCA9IDEwMDAwOwogIGZpbmFsIFNpbms8TGlzdDxpbnQ+PiBfc2luazsKICBVaW50OExpc3QgX2J1ZmZlciA9IG5ldyBVaW50OExpc3QoU0laRSk7CiAgaW50IGxlbmd0aCA9IDA7CiAgaW50IGZsdXNoZWRMZW5ndGggPSAwOwoKICBGbG9hdDY0TGlzdCBfZG91YmxlQnVmZmVyID0gbmV3IEZsb2F0NjRMaXN0KDEpOwogIFVpbnQ4TGlzdCBfZG91YmxlQnVmZmVyVWludDg7CgogIGludCBnZXQgb2Zmc2V0ID0+IGxlbmd0aCArIGZsdXNoZWRMZW5ndGg7CgogIEJ1ZmZlcmVkU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBhZGREb3VibGUoZG91YmxlIGQpIHsKICAgIF9kb3VibGVCdWZmZXJVaW50OCA/Pz0gX2RvdWJsZUJ1ZmZlci5idWZmZXIuYXNVaW50OExpc3QoKTsKICAgIF9kb3VibGVCdWZmZXJbMF0gPSBkOwogICAgYWRkQnl0ZTQoX2RvdWJsZUJ1ZmZlclVpbnQ4WzBdLCBfZG91YmxlQnVmZmVyVWludDhbMV0sCiAgICAgICAgX2RvdWJsZUJ1ZmZlclVpbnQ4WzJdLCBfZG91YmxlQnVmZmVyVWludDhbM10pOwogICAgYWRkQnl0ZTQoX2RvdWJsZUJ1ZmZlclVpbnQ4WzRdLCBfZG91YmxlQnVmZmVyVWludDhbNV0sCiAgICAgICAgX2RvdWJsZUJ1ZmZlclVpbnQ4WzZdLCBfZG91YmxlQnVmZmVyVWludDhbN10pOwogIH0KCiAgdm9pZCBhZGRCeXRlKGludCBieXRlKSB7CiAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGU7CiAgICBpZiAobGVuZ3RoID09IFNJWkUpIHsKICAgICAgX3NpbmsuYWRkKF9idWZmZXIpOwogICAgICBfYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChTSVpFKTsKICAgICAgbGVuZ3RoID0gMDsKICAgICAgZmx1c2hlZExlbmd0aCArPSBTSVpFOwogICAgfQogIH0KCiAgdm9pZCBhZGRCeXRlMihpbnQgYnl0ZTEsIGludCBieXRlMikgewogICAgaWYgKGxlbmd0aCA8IFNBRkVfU0laRSkgewogICAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGUxOwogICAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGUyOwogICAgfSBlbHNlIHsKICAgICAgYWRkQnl0ZShieXRlMSk7CiAgICAgIGFkZEJ5dGUoYnl0ZTIpOwogICAgfQogIH0KCiAgdm9pZCBhZGRCeXRlNChpbnQgYnl0ZTEsIGludCBieXRlMiwgaW50IGJ5dGUzLCBpbnQgYnl0ZTQpIHsKICAgIGlmIChsZW5ndGggPCBTQUZFX1NJWkUpIHsKICAgICAgX2J1ZmZlcltsZW5ndGgrK10gPSBieXRlMTsKICAgICAgX2J1ZmZlcltsZW5ndGgrK10gPSBieXRlMjsKICAgICAgX2J1ZmZlcltsZW5ndGgrK10gPSBieXRlMzsKICAgICAgX2J1ZmZlcltsZW5ndGgrK10gPSBieXRlNDsKICAgIH0gZWxzZSB7CiAgICAgIGFkZEJ5dGUoYnl0ZTEpOwogICAgICBhZGRCeXRlKGJ5dGUyKTsKICAgICAgYWRkQnl0ZShieXRlMyk7CiAgICAgIGFkZEJ5dGUoYnl0ZTQpOwogICAgfQogIH0KCiAgdm9pZCBhZGRCeXRlcyhMaXN0PGludD4gYnl0ZXMpIHsKICAgIC8vIEF2b2lkIGNvcHlpbmcgYSBsYXJnZSBidWZmZXIgaW50byB0aGUgYW5vdGhlciBsYXJnZSBidWZmZXIuIEFsc28sIGlmCiAgICAvLyB0aGUgYnl0ZXMgYnVmZmVyIGlzIHRvbyBsYXJnZSB0byBmaXQgaW4gb3VyIG93biBidWZmZXIsIGp1c3QgZW1pdCBib3RoLgogICAgaWYgKGxlbmd0aCArIGJ5dGVzLmxlbmd0aCA8IFNJWkUgJiYKICAgICAgICAoYnl0ZXMubGVuZ3RoIDwgU01BTEwgfHwgbGVuZ3RoIDwgU01BTEwpKSB7CiAgICAgIF9idWZmZXIuc2V0UmFuZ2UobGVuZ3RoLCBsZW5ndGggKyBieXRlcy5sZW5ndGgsIGJ5dGVzKTsKICAgICAgbGVuZ3RoICs9IGJ5dGVzLmxlbmd0aDsKICAgIH0gZWxzZSBpZiAoYnl0ZXMubGVuZ3RoIDwgU01BTEwpIHsKICAgICAgLy8gRmx1c2ggYXMgbXVjaCBhcyB3ZSBjYW4gaW4gdGhlIGN1cnJlbnQgYnVmZmVyLgogICAgICBfYnVmZmVyLnNldFJhbmdlKGxlbmd0aCwgU0laRSwgYnl0ZXMpOwogICAgICBfc2luay5hZGQoX2J1ZmZlcik7CiAgICAgIC8vIENvcHkgb3ZlciB0aGUgcmVtYWluZGVyIGludG8gYSBuZXcgYnVmZmVyLiBJdCBpcyBndWFyYW50ZWVkIHRvIGZpdAogICAgICAvLyBiZWNhdXNlIHRoZSBpbnB1dCBieXRlIGFycmF5IGlzIHNtYWxsLgogICAgICBpbnQgYWxyZWFkeUVtaXR0ZWQgPSBTSVpFIC0gbGVuZ3RoOwogICAgICBpbnQgcmVtYWluZGVyID0gYnl0ZXMubGVuZ3RoIC0gYWxyZWFkeUVtaXR0ZWQ7CiAgICAgIF9idWZmZXIgPSBuZXcgVWludDhMaXN0KFNJWkUpOwogICAgICBfYnVmZmVyLnNldFJhbmdlKDAsIHJlbWFpbmRlciwgYnl0ZXMsIGFscmVhZHlFbWl0dGVkKTsKICAgICAgbGVuZ3RoID0gcmVtYWluZGVyOwogICAgICBmbHVzaGVkTGVuZ3RoICs9IFNJWkU7CiAgICB9IGVsc2UgewogICAgICBmbHVzaCgpOwogICAgICBfc2luay5hZGQoYnl0ZXMpOwogICAgICBmbHVzaGVkTGVuZ3RoICs9IGJ5dGVzLmxlbmd0aDsKICAgIH0KICB9CgogIHZvaWQgZmx1c2goKSB7CiAgICBfc2luay5hZGQoX2J1ZmZlci5zdWJsaXN0KDAsIGxlbmd0aCkpOwogICAgX2J1ZmZlciA9IG5ldyBVaW50OExpc3QoU0laRSk7CiAgICBmbHVzaGVkTGVuZ3RoICs9IGxlbmd0aDsKICAgIGxlbmd0aCA9IDA7CiAgfQoKICB2b2lkIGZsdXNoQW5kRGVzdHJveSgpIHsKICAgIF9zaW5rLmFkZChfYnVmZmVyLnN1Ymxpc3QoMCwgbGVuZ3RoKSk7CiAgfQp9CoGTAE5OPAEXGgEhQxo0Bk4SAToGPxABTkQxAU1LBjwkNgFPUQY8HTkgATQeAUEcAUwGPCIiATMiAUYGPCUoAU4oBjwgRwFQTxwGPCI+IAE3Mk8fIQEwHAIBQTMMIx4ZFwYEAQwpHhkaBgQBDEgaGRMNHyUcCAYEAQw+IRcZEw0cKhoSCgYEAQw5IRoZEw0fGQYEAQw3HhkQBgQCAUIXJiEBHwE1BkskMh8ZHR0YGQ0YBgQCAUkZTCQeLgEXPzkEAQwyF0UkBAEMIh8EAQwfGyYEAQwdGxYEAQwjGxkEAQwdGyweBAEkNQQBHi8EAUYlAUkrAUsSJQFIKgIBOAQ3LB4eEwFCAQwmJAQBDCwqJSMdBAEMJiwYJBQhQRQNSS4UBgQBDCskBAERJRoSBAE9HQIBMzMsFSIpIh8rEhkBMiABLAEcAR0/Gjs3OzcEARseGholEh0GBAEoHiEhDRYWBgQBPh4hISEhDRYWFhYGBAEjTE8oND4eJzgtGkwwKjUlPRodDQ8YJQYEARErIx0QBAEbKwQCASlwYWNrYWdlOmRhcnQyanNfaW5mby9zcmMvYmluYXJ5L3NpbmsuZGFydEBzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvZGFydDJqc19pbmZvL2xpYi9zcmMvYmluYXJ5L3NvdXJjZS5kYXJ0n3IvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CgovLy8gSW50ZXJmYWNlIGZvciBkZXNlcmlhbGl6YXRpb24uCi8vIFRPRE8oc2lnbXVuZCk6IHNoYXJlIHRoaXMgd2l0aCBwa2c6Y29tcGlsZXIvc3JjL3NlcmlhbGl6YXRpb24vKgphYnN0cmFjdCBjbGFzcyBEYXRhU291cmNlIHsKICAvLy8gUmVhZHMgYSByZWZlcmVuY2UgdG8gYW4gW0VdIHZhbHVlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4gSWYgdGhlIHZhbHVlIGhhcwogIC8vLyBub3QgeWV0IGJlZW4gZGVzZXJpYWxpemVkLCBbZl0gaXMgY2FsbGVkIHRvIGRlc2VyaWFsaXplIHRoZSB2YWx1ZSBpdHNlbGYuCiAgRSByZWFkQ2FjaGVkPEU+KEUgZigpKTsKCiAgLy8vIFJlYWRzIGEgcG90ZW50aWFsbHkgYG51bGxgIFtFXSB2YWx1ZSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UsIGNhbGxpbmcgW2ZdIHRvCiAgLy8vIHJlYWQgdGhlIG5vbi1udWxsIHZhbHVlIGZyb20gdGhlIGRhdGEgc291cmNlLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aAogIC8vLyBbRGF0YVNpbmsud3JpdGVWYWx1ZU9yTnVsbF0uCiAgRSByZWFkVmFsdWVPck51bGw8RT4oRSBmKCkpOwoKICAvLy8gUmVhZHMgYSBsaXN0IG9mIFtFXSB2YWx1ZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLiBJZiBbZW1wdHlBc051bGxdIGlzCiAgLy8vIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlTGlzdF0uCiAgTGlzdDxFPiByZWFkTGlzdDxFPihFIGYoKSwge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhIGJvb2xlYW4gdmFsdWUgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIGJvb2wgcmVhZEJvb2woKTsKCiAgLy8vIFJlYWRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdmFsdWUgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIGludCByZWFkSW50KCk7CgogIC8vLyBSZWFkcyBhIHBvdGVudGlhbGx5IGBudWxsYCBub24tbmVnYXRpdmUgaW50ZWdlciB2YWx1ZSBmcm9tIHRoaXMgZGF0YQogIC8vLyBzb3VyY2UuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZUludE9yTnVsbF0uCiAgaW50IHJlYWRJbnRPck51bGwoKTsKCiAgLy8vIFJlYWRzIGEgc3RyaW5nIHZhbHVlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICBTdHJpbmcgcmVhZFN0cmluZygpOwoKICAvLy8gUmVhZHMgYSBwb3RlbnRpYWxseSBgbnVsbGAgc3RyaW5nIHZhbHVlIGZyb20gdGhpcyBkYXRhIHNvdXJjZS4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlU3RyaW5nT3JOdWxsXS4KICBTdHJpbmcgcmVhZFN0cmluZ09yTnVsbCgpOwoKICAvLy8gUmVhZHMgYSBsaXN0IG9mIHN0cmluZyB2YWx1ZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLiBJZiBbZW1wdHlBc051bGxdIGlzCiAgLy8vIGB0cnVlYCwgYG51bGxgIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKICAvLy8gW0RhdGFTaW5rLndyaXRlU3RyaW5nc10uCiAgTGlzdDxTdHJpbmc+IHJlYWRTdHJpbmdzKHtib29sIGVtcHR5QXNOdWxsOiBmYWxzZX0pOwoKICAvLy8gUmVhZHMgYSBtYXAgZnJvbSBzdHJpbmcgdmFsdWVzIHRvIFtWXSB2YWx1ZXMgZnJvbSB0aGlzIGRhdGEgc291cmNlLAogIC8vLyBjYWxsaW5nIFtmXSB0byByZWFkIGVhY2ggdmFsdWUgZnJvbSB0aGUgZGF0YSBzb3VyY2UuIElmIFtlbXB0eUFzTnVsbF0gaXMKICAvLy8gYHRydWVgLCBgbnVsbGAgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBtYXAuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoCiAgLy8vIFtEYXRhU2luay53cml0ZVN0cmluZ01hcF0uCiAgTWFwPFN0cmluZywgVj4gcmVhZFN0cmluZ01hcDxWPihWIGYoKSwge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSk7CgogIC8vLyBSZWFkcyBhbiBlbnVtIHZhbHVlIGZyb20gdGhlIGxpc3Qgb2YgZW51bSBbdmFsdWVzXSBmcm9tIHRoaXMgZGF0YSBzb3VyY2UuCiAgLy8vCiAgLy8vIFRoZSBbdmFsdWVzXSBhcmd1bWVudCBpcyBpbnRlbmRlZCB0byBiZSB0aGUgc3RhdGljIGAudmFsdWVzYCBmaWVsZCBvbgogIC8vLyBlbnVtIGNsYXNzZXMsIGZvciBpbnN0YW5jZToKICAvLy8KICAvLy8gICAgZW51bSBGb28geyBiYXIsIGJheiB9CiAgLy8vICAgIC4uLgogIC8vLyAgICBGb28gZm9vID0gc291cmNlLnJlYWRFbnVtKEZvby52YWx1ZXMpOwogIC8vLwogIEUgcmVhZEVudW08RT4oTGlzdDxFPiB2YWx1ZXMpOwoKICAvLy8gUmVhZHMgYSBVUkkgdmFsdWUgZnJvbSB0aGlzIGRhdGEgc291cmNlLgogIFVyaSByZWFkVXJpKCk7Cn0KCi8vLyBNaXhpbiB0aGF0IGltcGxlbWVudHMgYWxsIGNvbnZlbmllbmNlIG1ldGhvZHMgb2YgW0RhdGFTb3VyY2VdLgphYnN0cmFjdCBjbGFzcyBEYXRhU291cmNlTWl4aW4gaW1wbGVtZW50cyBEYXRhU291cmNlIHsKICBAb3ZlcnJpZGUKICBFIHJlYWRWYWx1ZU9yTnVsbDxFPihFIGYoKSkgewogICAgYm9vbCBoYXNWYWx1ZSA9IHJlYWRCb29sKCk7CiAgICBpZiAoaGFzVmFsdWUpIHsKICAgICAgcmV0dXJuIGYoKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxFPiByZWFkTGlzdDxFPihFIGYoKSwge2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTGlzdDxFPiBsaXN0ID0gbmV3IExpc3Q8RT4oY291bnQpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGxpc3RbaV0gPSBmKCk7CiAgICB9CiAgICByZXR1cm4gbGlzdDsKICB9CgogIEBvdmVycmlkZQogIGludCByZWFkSW50T3JOdWxsKCkgewogICAgYm9vbCBoYXNWYWx1ZSA9IHJlYWRCb29sKCk7CiAgICBpZiAoaGFzVmFsdWUpIHsKICAgICAgcmV0dXJuIHJlYWRJbnQoKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHJlYWRTdHJpbmdPck51bGwoKSB7CiAgICBib29sIGhhc1ZhbHVlID0gcmVhZEJvb2woKTsKICAgIGlmIChoYXNWYWx1ZSkgewogICAgICByZXR1cm4gcmVhZFN0cmluZygpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PFN0cmluZz4gcmVhZFN0cmluZ3Moe2Jvb2wgZW1wdHlBc051bGw6IGZhbHNlfSkgewogICAgaW50IGNvdW50ID0gcmVhZEludCgpOwogICAgaWYgKGNvdW50ID09IDAgJiYgZW1wdHlBc051bGwpIHJldHVybiBudWxsOwogICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlzdDxTdHJpbmc+KGNvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBsaXN0W2ldID0gcmVhZFN0cmluZygpOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBAb3ZlcnJpZGUKICBNYXA8U3RyaW5nLCBWPiByZWFkU3RyaW5nTWFwPFY+KFYgZigpLCB7Ym9vbCBlbXB0eUFzTnVsbDogZmFsc2V9KSB7CiAgICBpbnQgY291bnQgPSByZWFkSW50KCk7CiAgICBpZiAoY291bnQgPT0gMCAmJiBlbXB0eUFzTnVsbCkgcmV0dXJuIG51bGw7CiAgICBNYXA8U3RyaW5nLCBWPiBtYXAgPSB7fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBTdHJpbmcga2V5ID0gcmVhZFN0cmluZygpOwogICAgICBWIHZhbHVlID0gZigpOwogICAgICBtYXBba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9Cn0KCi8vLyBEYXRhIHNvdXJjZSBoZWxwZXIgcmVhZHMgY2Fub25pY2FsaXplZCBbRV0gdmFsdWVzIHRocm91Z2ggaW5kaWNlcy4KY2xhc3MgSW5kZXhlZFNvdXJjZTxFPiB7CiAgZmluYWwgaW50IEZ1bmN0aW9uKCkgX3JlYWRJbnQ7CiAgZmluYWwgTGlzdDxFPiBfY2FjaGUgPSBbXTsKICBmaW5hbCBTZXQ8aW50PiBfcGVuZGluZyA9IG5ldyBTZXQoKTsKCiAgSW5kZXhlZFNvdXJjZSh0aGlzLl9yZWFkSW50KTsKCiAgLy8vIFJlYWRzIGEgcmVmZXJlbmNlIHRvIGFuIFtFXSB2YWx1ZSBmcm9tIHRoZSBkYXRhIHNvdXJjZS4KICAvLy8KICAvLy8gSWYgdGhlIHZhbHVlIGhhc24ndCB5ZXQgYmVlbiByZWFkLCBbcmVhZFZhbHVlXSBpcyBjYWxsZWQgdG8gZGVzZXJpYWxpemUKICAvLy8gdGhlIHZhbHVlIGl0c2VsZi4KICBFIHJlYWQoRSByZWFkVmFsdWUoKSkgewogICAgaW50IGluZGV4ID0gX3JlYWRJbnQoKTsKICAgIGlmIChfcGVuZGluZy5jb250YWlucyhpbmRleCkpIHRocm93ICJzZXJpYWxpemF0aW9uIGN5Y2xlcyBub3Qgc3VwcG9ydGVkIjsKICAgIGlmIChpbmRleCA+PSBfY2FjaGUubGVuZ3RoKSB7CiAgICAgIF9wZW5kaW5nLmFkZChpbmRleCk7CiAgICAgIF9jYWNoZS5hZGQobnVsbCk7CiAgICAgIEUgdmFsdWUgPSByZWFkVmFsdWUoKTsKICAgICAgX3BlbmRpbmcucmVtb3ZlKGluZGV4KTsKICAgICAgX2NhY2hlW2luZGV4XSA9IHZhbHVlOwogICAgICByZXR1cm4gdmFsdWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gX2NhY2hlW2luZGV4XTsKICAgIH0KICB9Cn0KCi8vLyBCYXNlIGltcGxlbWVudGF0aW9uIG9mIFtEYXRhU291cmNlXSB1c2luZyBbRGF0YVNvdXJjZU1peGluXSB0byBpbXBsZW1lbnQKLy8vIGNvbnZlbmllbmNlIG1ldGhvZHMuCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGF0YVNvdXJjZSBleHRlbmRzIERhdGFTb3VyY2VNaXhpbgogICAgaW1wbGVtZW50cyBEYXRhU291cmNlIHsKICBJbmRleGVkU291cmNlPFN0cmluZz4gX3N0cmluZ0luZGV4OwogIEluZGV4ZWRTb3VyY2U8VXJpPiBfdXJpSW5kZXg7CiAgTWFwPFR5cGUsIEluZGV4ZWRTb3VyY2U+IF9nZW5lcmFsQ2FjaGVzID0ge307CgogIEFic3RyYWN0RGF0YVNvdXJjZSgpIHsKICAgIF9zdHJpbmdJbmRleCA9IG5ldyBJbmRleGVkU291cmNlPFN0cmluZz4oX3JlYWRJbnRJbnRlcm5hbCk7CiAgICBfdXJpSW5kZXggPSBuZXcgSW5kZXhlZFNvdXJjZTxVcmk+KF9yZWFkSW50SW50ZXJuYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgRSByZWFkQ2FjaGVkPEU+KEUgZigpKSB7CiAgICBJbmRleGVkU291cmNlIHNvdXJjZSA9CiAgICAgICAgX2dlbmVyYWxDYWNoZXNbRV0gPz89IG5ldyBJbmRleGVkU291cmNlPEU+KF9yZWFkSW50SW50ZXJuYWwpOwogICAgcmV0dXJuIHNvdXJjZS5yZWFkKGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgRSByZWFkRW51bTxFPihMaXN0PEU+IHZhbHVlcykgewogICAgcmV0dXJuIF9yZWFkRW51bUludGVybmFsKHZhbHVlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBVcmkgcmVhZFVyaSgpIHsKICAgIHJldHVybiBfcmVhZFVyaSgpOwogIH0KCiAgVXJpIF9yZWFkVXJpKCkgewogICAgcmV0dXJuIF91cmlJbmRleC5yZWFkKF9yZWFkVXJpSW50ZXJuYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCByZWFkQm9vbCgpIHsKICAgIGludCB2YWx1ZSA9IF9yZWFkSW50SW50ZXJuYWwoKTsKICAgIGFzc2VydCh2YWx1ZSA9PSAwIHx8IHZhbHVlID09IDEpOwogICAgcmV0dXJuIHZhbHVlID09IDE7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgcmVhZFN0cmluZygpIHsKICAgIHJldHVybiBfcmVhZFN0cmluZygpOwogIH0KCiAgU3RyaW5nIF9yZWFkU3RyaW5nKCkgewogICAgcmV0dXJuIF9zdHJpbmdJbmRleC5yZWFkKF9yZWFkU3RyaW5nSW50ZXJuYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHJlYWRJbnQoKSB7CiAgICByZXR1cm4gX3JlYWRJbnRJbnRlcm5hbCgpOwogIH0KCiAgLy8vIEFjdHVhbCBkZXNlcmlhbGl6YXRpb24gb2YgYSBzdHJpbmcgdmFsdWUsIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuCiAgU3RyaW5nIF9yZWFkU3RyaW5nSW50ZXJuYWwoKTsKCiAgLy8vIEFjdHVhbCBkZXNlcmlhbGl6YXRpb24gb2YgYSBub24tbmVnYXRpdmUgaW50ZWdlciB2YWx1ZSwgaW1wbGVtZW50ZWQgYnkKICAvLy8gc3ViY2xhc3Nlcy4KICBpbnQgX3JlYWRJbnRJbnRlcm5hbCgpOwoKICAvLy8gQWN0dWFsIGRlc2VyaWFsaXphdGlvbiBvZiBhIFVSSSB2YWx1ZSwgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KICBVcmkgX3JlYWRVcmlJbnRlcm5hbCgpOwoKICAvLy8gQWN0dWFsIGRlc2VyaWFsaXphdGlvbiBvZiBhbiBlbnVtIHZhbHVlIGluIFt2YWx1ZXNdLCBpbXBsZW1lbnRlZCBieQogIC8vLyBzdWJjbGFzc2VzLgogIEUgX3JlYWRFbnVtSW50ZXJuYWw8RT4oTGlzdDxFPiB2YWx1ZXMpOwp9CgovLy8gW0RhdGFTb3VyY2VdIHRoYXQgcmVhZHMgZGF0YSBmcm9tIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuCi8vLwovLy8gVGhpcyBkYXRhIHNvdXJjZSB3b3JrcyB0b2dldGhlciB3aXRoIFtCaW5hcnlTaW5rXS4KY2xhc3MgQmluYXJ5U291cmNlIGV4dGVuZHMgQWJzdHJhY3REYXRhU291cmNlIHsKICBpbnQgX2J5dGVPZmZzZXQgPSAwOwogIGZpbmFsIExpc3Q8aW50PiBfYnl0ZXM7CgogIEJpbmFyeVNvdXJjZSh0aGlzLl9ieXRlcyk7CiAgaW50IF9yZWFkQnl0ZSgpID0+IF9ieXRlc1tfYnl0ZU9mZnNldCsrXTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIF9yZWFkU3RyaW5nSW50ZXJuYWwoKSB7CiAgICBpbnQgbGVuZ3RoID0gX3JlYWRJbnRJbnRlcm5hbCgpOwogICAgTGlzdDxpbnQ+IGJ5dGVzID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOwogICAgYnl0ZXMuc2V0UmFuZ2UoMCwgYnl0ZXMubGVuZ3RoLCBfYnl0ZXMsIF9ieXRlT2Zmc2V0KTsKICAgIF9ieXRlT2Zmc2V0ICs9IGJ5dGVzLmxlbmd0aDsKICAgIHJldHVybiB1dGY4LmRlY29kZShieXRlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgX3JlYWRJbnRJbnRlcm5hbCgpIHsKICAgIHZhciBieXRlID0gX3JlYWRCeXRlKCk7CiAgICBpZiAoYnl0ZSAmIDB4ODAgPT0gMCkgewogICAgICAvLyAweHh4eHh4eAogICAgICByZXR1cm4gYnl0ZTsKICAgIH0gZWxzZSBpZiAoYnl0ZSAmIDB4NDAgPT0gMCkgewogICAgICAvLyAxMHh4eHh4eAogICAgICByZXR1cm4gKChieXRlICYgMHgzRikgPDwgOCkgfCBfcmVhZEJ5dGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIDExeHh4eHh4CiAgICAgIHJldHVybiAoKGJ5dGUgJiAweDNGKSA8PCAyNCkgfAogICAgICAgICAgKF9yZWFkQnl0ZSgpIDw8IDE2KSB8CiAgICAgICAgICAoX3JlYWRCeXRlKCkgPDwgOCkgfAogICAgICAgICAgX3JlYWRCeXRlKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBVcmkgX3JlYWRVcmlJbnRlcm5hbCgpIHsKICAgIFN0cmluZyB0ZXh0ID0gX3JlYWRTdHJpbmcoKTsKICAgIHJldHVybiBVcmkucGFyc2UodGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFIF9yZWFkRW51bUludGVybmFsPEU+KExpc3Q8RT4gdmFsdWVzKSB7CiAgICBpbnQgaW5kZXggPSBfcmVhZEludEludGVybmFsKCk7CiAgICBhc3NlcnQoCiAgICAgICAgMCA8PSBpbmRleCAmJiBpbmRleCA8IHZhbHVlcy5sZW5ndGgsCiAgICAgICAgIkludmFsaWQgZGF0YSBraW5kIGluZGV4LiAiCiAgICAgICAgIkV4cGVjdGVkIG9uZSBvZiAkdmFsdWVzLCBmb3VuZCBpbmRleCAkaW5kZXguIik7CiAgICByZXR1cm4gdmFsdWVzW2luZGV4XTsKICB9Cn0KgSoATk48ARoXASNDHFBQGgFRNAY8Ix8BTDsGPBw5ATMTAUARAUsOBjwhFwEyFwFFBjwkHQFPOwY8HzcBSk86BjwhRQFQBkwiBh8NMAYhAS8RAgFDNwwgIBQSBhEEAQw6GzAnJhUGEQQBDBggFBgGEQQBDB4gFBsGEQQBDDgbMDEmHgYRBAEMRhswHSYhFRgGEAQCAUcZIR0nASABPgZOGBocTiIbGB0eHRQNHAYEAgFNGTocJiAwARlAOgQBDBsbRhsEAQwiJgQBDBIXBAETLQQBDBQkJhcEAQwYGgQBGTMEAQwSHwQBSyABTRIaAUgaAUoSKgIBOwQ3MBcaAR0sAQwhJS06IR8EAQwbHBwSEyMSMQ0SJSAfFwYEAQwbIRwEAQwrJAwtJDkaBAIBK3BhY2thZ2U6ZGFydDJqc19pbmZvL3NyYy9iaW5hcnkvc291cmNlLmRhcnQzc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaXIvc2NvcGVfdmlzaXRvci5kYXJ0wACeWS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9jb25zdGFudF9ldmFsdWF0b3IuZGFydCcgYXMgaXI7CgppbXBvcnQgJ2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnc2NvcGUuZGFydCc7CgovLy8gVGhpcyBidWlsZGVyIHdhbGtzIHRoZSBjb2RlIHRvIGRldGVybWluZSB3aGF0IHZhcmlhYmxlcyBhcmUKLy8vIGFzc2lnbmVkL2NhcHR1cmVkL2ZyZWUgYXQgdmFyaW91cyBwb2ludHMgdG8gYnVpbGQgYSBbQ2xvc3VyZVNjb3BlTW9kZWxdIGFuZAovLy8gYSBbVmFyaWFibGVTY29wZU1vZGVsXSB0aGF0IGNhbiByZXNwb25kIHRvIHF1ZXJpZXMgYWJvdXQgaG93IGEgcGFydGljdWxhcgovLy8gdmFyaWFibGUgaXMgYmVpbmcgdXNlZCBhdCBhbnkgcG9pbnQgaW4gdGhlIGNvZGUuCmNsYXNzIFNjb3BlTW9kZWxCdWlsZGVyIGV4dGVuZHMgaXIuVmlzaXRvcjxJbml0aWFsaXplckNvbXBsZXhpdHk+CiAgICB3aXRoIFZhcmlhYmxlQ29sbGVjdG9yTWl4aW4gewogIGZpbmFsIGlyLkNvbnN0YW50RXZhbHVhdG9yIF9jb25zdGFudEV2YWx1YXRvcjsKCiAgZmluYWwgQ2xvc3VyZVNjb3BlTW9kZWwgX21vZGVsID0gbmV3IENsb3N1cmVTY29wZU1vZGVsKCk7CgogIC8vLyBBIG1hcCBvZiBlYWNoIHZpc2l0ZWQgY2FsbCBub2RlIHdpdGggdGhlIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYWJvdXQgd2hhdAogIC8vLyB2YXJpYWJsZXMgYXJlIGNhcHR1cmVkL3VzZWQuIEVhY2ggaXIuTm9kZSBrZXkgY29ycmVzcG9uZHMgdG8gYSBzY29wZSB0aGF0CiAgLy8vIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSB2aXNpdGluZyBhIGNsb3N1cmUgKGluaXRpYWxseSBjYWxsZWQgdGhyb3VnaAogIC8vLyBbdHJhbnNsYXRlTGF6eUluaXRpYWxpemVyXSBvciBbdHJhbnNsYXRlQ29uc3RydWN0b3JPclByb2NlZHVyZV0pLgogIE1hcDxpci5Ob2RlLCBLZXJuZWxDYXB0dXJlZFNjb3BlPiBnZXQgX3Njb3Blc0NhcHR1cmVkSW5DbG9zdXJlTWFwID0+CiAgICAgIF9tb2RlbC5jYXB0dXJlZFNjb3Blc01hcDsKCiAgLy8vIEEgbWFwIG9mIHRoZSBub2RlcyB0aGF0IHdlIGhhdmUgZmxhZ2dlZCBhcyBuZWNlc3NhcnkgdG8gZ2VuZXJhdGUgY2xvc3VyZQogIC8vLyBjbGFzc2VzIGZvciBpbiBhIGxhdGVyIHN0YWdlLiBXZSBtYXAgdGhhdCBub2RlIHRvIGluZm9ybWF0aW9uIGFzY2VydGFpbmVkCiAgLy8vIGFib3V0IHZhcmlhYmxlIHVzYWdlIGluIHRoZSBzdXJyb3VuZGluZyBzY29wZS4KICBNYXA8aXIuVHJlZU5vZGUsIEtlcm5lbFNjb3BlSW5mbz4gZ2V0IF9jbG9zdXJlc1RvR2VuZXJhdGUgPT4KICAgICAgX21vZGVsLmNsb3N1cmVzVG9HZW5lcmF0ZTsKCiAgLy8vIFRoZSBsb2NhbCB2YXJpYWJsZXMgdGhhdCBoYXZlIGJlZW4gZGVjbGFyZWQgaW4gdGhlIGN1cnJlbnQgc2NvcGUuCiAgTGlzdDxpci5Ob2RlIC8qIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gfCBUeXBlUGFyYW1ldGVyVHlwZVdpdGhDb250ZXh0ICovID4KICAgICAgX3Njb3BlVmFyaWFibGVzOwoKICAvLy8gUG9pbnRlciB0byB0aGUgY29udGV4dCBpbiB3aGljaCB0aGlzIGNsb3N1cmUgaXMgZXhlY3V0ZWQuCiAgLy8vIEZvciBleGFtcGxlLCBpbiB0aGUgZXhwcmVzc2lvbiBgdmFyIGZvbyA9ICgpID0+IDMgKyBpO2AsIHRoZSBleGVjdXRhYmxlCiAgLy8vIGNvbnRleHQgYXMgd2Ugd2FsayB0aGUgbm9kZXMgaW4gdGhhdCBleHByZXNzaW9uIGlzIHRoZSBpci5GaWVsZCBgZm9vYC4KICBpci5UcmVlTm9kZSBfZXhlY3V0YWJsZUNvbnRleHQ7CgogIC8vLyBBIGZsYWcgdG8gaW5kaWNhdGUgaWYgd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUgYSBjbG9zdXJlLgogIGJvb2wgX2lzSW5zaWRlQ2xvc3VyZSA9IGZhbHNlOwoKICAvLy8gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgbm9kZSB3aGVyZSB0aGlzIGNsb3N1cmUgYnVpbGRlciBzdGFydGVkLgogIGlyLk5vZGUgX291dGVybW9zdE5vZGU7CgogIC8vLyBLZWVwIHRyYWNrIG9mIHRoZSBtdXRhdGVkIGxvY2FsIHZhcmlhYmxlcyBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gYm94CiAgLy8vIG5vbi1tdXRhdGVkIHZhcmlhYmxlcy4gV2Uga25vdyB0aGVzZSBhcmUgb25seSBWYXJpYWJsZURlY2xhcmF0aW9ucyBiZWNhdXNlCiAgLy8vIHR5cGUgdmFyaWFibGUgdHlwZXMgYW5kIGB0aGlzYCB0eXBlcyBjYW4ndCBiZSBtdXRhdGVkIQogIFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBfbXV0YXRlZFZhcmlhYmxlcyA9CiAgICAgIG5ldyBTZXQ8aXIuVmFyaWFibGVEZWNsYXJhdGlvbj4oKTsKCiAgLy8vIFRoZSBzZXQgb2YgdmFyaWFibGVzIHRoYXQgYXJlIGFjY2Vzc2VkIGluIHNvbWUgZm9ybSwgd2hldGhlciB0aGV5IGFyZQogIC8vLyBtdXRhdGVkIG9yIG5vdC4KICBTZXQ8aXIuTm9kZSAvKiBpci5WYXJpYWJsZURlY2xhcmF0aW9uIHwgVHlwZVBhcmFtZXRlclR5cGVXaXRoQ29udGV4dCAqLyA+CiAgICAgIF9jYXB0dXJlZFZhcmlhYmxlcyA9IG5ldyBTZXQ8aXIuTm9kZT4oKTsKCiAgLy8vIElmIHRydWUsIHRoZSB2aXNpdG9yIGlzIGN1cnJlbnRseSB0cmF2ZXJzaW5nIHNvbWUgbm9kZXMgdGhhdCBhcmUgaW5zaWRlIGEKICAvLy8gdHJ5IGJsb2NrLgogIGJvb2wgX2luVHJ5ID0gZmFsc2U7CgogIC8vLyBUaGUgY3VycmVudCBzY29wZSB3ZSBhcmUgaW4uCiAgS2VybmVsU2NvcGVJbmZvIF9jdXJyZW50U2NvcGVJbmZvOwoKICBib29sIF9oYXNUaGlzTG9jYWw7CgogIC8vLyBLZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGJveGVzIHRoYXQgd2UndmUgY3JlYXRlZCBzbyB0aGF0IHRoZXkgZWFjaAogIC8vLyBoYXZlIHVuaXF1ZSBuYW1lcy4KICBpbnQgX2JveENvdW50ZXIgPSAwOwoKICAvLy8gVGhlIGN1cnJlbnQgdXNhZ2Ugb2YgYSB0eXBlIGFubm90YXRpb24uCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXBkYXRlZCBpbiB0aGUgdmlzaXRvciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVuY29uZGl0aW9uYWwKICAvLy8gdHlwZSB2YXJpYWJsZSB1c2FnZSwgc3VjaCBhcyB0eXBlIGxpdGVyYWxzIGFuZCBpcyB0ZXN0cywgYW5kIGNvbmRpdGlvbmFsCiAgLy8vIHR5cGUgdmFyaWFibGUgdXNhZ2UsIHN1Y2ggYXMgdHlwZSBhcmd1bWVudCBpbiBtZXRob2QgaW52b2NhdGlvbnMuCiAgVmFyaWFibGVVc2UgX2N1cnJlbnRUeXBlVXNhZ2U7CgogIFNjb3BlTW9kZWxCdWlsZGVyKHRoaXMuX2NvbnN0YW50RXZhbHVhdG9yKTsKCiAgU2NvcGVNb2RlbCBjb21wdXRlTW9kZWwoaXIuTWVtYmVyIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQWJzdHJhY3QgJiYgIW5vZGUuaXNFeHRlcm5hbCkgewogICAgICByZXR1cm4gY29uc3QgU2NvcGVNb2RlbCgKICAgICAgICAgIGluaXRpYWxpemVyQ29tcGxleGl0eTogY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKSk7CiAgICB9CgogICAgaWYgKG5vZGUgaXMgaXIuQ29uc3RydWN0b3IpIHsKICAgICAgX2hhc1RoaXNMb2NhbCA9IHRydWU7CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuUHJvY2VkdXJlICYmIG5vZGUua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLkZhY3RvcnkpIHsKICAgICAgX2hhc1RoaXNMb2NhbCA9IGZhbHNlOwogICAgfSBlbHNlIGlmIChub2RlLmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgX2hhc1RoaXNMb2NhbCA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICBfaGFzVGhpc0xvY2FsID0gZmFsc2U7CiAgICB9CgogICAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IGluaXRpYWxpemVyQ29tcGxleGl0eSA9CiAgICAgICAgY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICAgIGlmIChub2RlIGlzIGlyLkZpZWxkKSB7CiAgICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICBpbml0aWFsaXplckNvbXBsZXhpdHkgPSBub2RlLmFjY2VwdCh0aGlzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbml0aWFsaXplckNvbXBsZXhpdHkgPSBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkuY29uc3RhbnQoKTsKICAgICAgICBfbW9kZWwuc2NvcGVJbmZvID0gbmV3IEtlcm5lbFNjb3BlSW5mbyhfaGFzVGhpc0xvY2FsKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KG5vZGUgaXMgaXIuUHJvY2VkdXJlIHx8IG5vZGUgaXMgaXIuQ29uc3RydWN0b3IpOwogICAgICBub2RlLmFjY2VwdCh0aGlzKTsKICAgIH0KICAgIHJldHVybiBuZXcgU2NvcGVNb2RlbCgKICAgICAgICBjbG9zdXJlU2NvcGVNb2RlbDogX21vZGVsLAogICAgICAgIHZhcmlhYmxlU2NvcGVNb2RlbDogdmFyaWFibGVTY29wZU1vZGVsLAogICAgICAgIGluaXRpYWxpemVyQ29tcGxleGl0eTogaW5pdGlhbGl6ZXJDb21wbGV4aXR5KTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSBkZWZhdWx0Tm9kZShpci5Ob2RlIG5vZGUpID0+CiAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoJ1VuaGFuZGxlZCBub2RlICRub2RlICgke25vZGUucnVudGltZVR5cGV9KScpOwoKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXROb2RlKGlyLk5vZGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGU/LmFjY2VwdCh0aGlzKTsKICB9CgogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdE5vZGVzKExpc3Q8aXIuTm9kZT4gbm9kZXMpIHsKICAgIEluaXRpYWxpemVyQ29tcGxleGl0eSBjb21wbGV4aXR5ID0gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmNvbnN0YW50KCk7CiAgICBmb3IgKGlyLk5vZGUgbm9kZSBpbiBub2RlcykgewogICAgICBjb21wbGV4aXR5ID0gY29tcGxleGl0eS5jb21iaW5lKHZpc2l0Tm9kZShub2RlKSk7CiAgICB9CiAgICByZXR1cm4gY29tcGxleGl0eTsKICB9CgogIC8vLyBVcGRhdGUgdGhlIFtDYXB0dXJlZFNjb3BlXSBvYmplY3QgY29ycmVzcG9uZGluZyB0bwogIC8vLyB0aGlzIG5vZGUgaWYgYW55IHZhcmlhYmxlcyBhcmUgY2FwdHVyZWQuCiAgdm9pZCBhdHRhY2hDYXB0dXJlZFNjb3BlVmFyaWFibGVzKGlyLlRyZWVOb2RlIG5vZGUpIHsKICAgIFNldDxpci5WYXJpYWJsZURlY2xhcmF0aW9uPiBjYXB0dXJlZFZhcmlhYmxlc0ZvclNjb3BlID0KICAgICAgICBuZXcgU2V0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+KCk7CgogICAgZm9yIChpci5Ob2RlIHZhcmlhYmxlIGluIF9zY29wZVZhcmlhYmxlcykgewogICAgICAvLyBObyBuZWVkIHRvIGJveCBub24tYXNzaWduYWJsZSBlbGVtZW50cy4KICAgICAgaWYgKHZhcmlhYmxlIGlzIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgICBpZiAodmFyaWFibGUuaXNGaW5hbCB8fCB2YXJpYWJsZS5pc0NvbnN0KSBjb250aW51ZTsKICAgICAgICBpZiAoIV9tdXRhdGVkVmFyaWFibGVzLmNvbnRhaW5zKHZhcmlhYmxlKSkgY29udGludWU7CiAgICAgICAgaWYgKF9jYXB0dXJlZFZhcmlhYmxlcy5jb250YWlucyh2YXJpYWJsZSkpIHsKICAgICAgICAgIGNhcHR1cmVkVmFyaWFibGVzRm9yU2NvcGUuYWRkKHZhcmlhYmxlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICghY2FwdHVyZWRWYXJpYWJsZXNGb3JTY29wZS5pc0VtcHR5KSB7CiAgICAgIGFzc2VydChfbW9kZWwuc2NvcGVJbmZvICE9IG51bGwpOwogICAgICBLZXJuZWxTY29wZUluZm8gZnJvbSA9IF9tb2RlbC5zY29wZUluZm87CgogICAgICBLZXJuZWxDYXB0dXJlZFNjb3BlIGNhcHR1cmVkU2NvcGU7CiAgICAgIHZhciBub2RlQm94ID0gbmV3IE5vZGVCb3goZ2V0Qm94TmFtZSgpLCBfZXhlY3V0YWJsZUNvbnRleHQpOwogICAgICBpZiAobm9kZSBpcyBpci5Gb3JTdGF0ZW1lbnQgfHwKICAgICAgICAgIG5vZGUgaXMgaXIuRm9ySW5TdGF0ZW1lbnQgfHwKICAgICAgICAgIG5vZGUgaXMgaXIuV2hpbGVTdGF0ZW1lbnQgfHwKICAgICAgICAgIG5vZGUgaXMgaXIuRG9TdGF0ZW1lbnQpIHsKICAgICAgICBjYXB0dXJlZFNjb3BlID0gbmV3IEtlcm5lbENhcHR1cmVkTG9vcFNjb3BlKAogICAgICAgICAgICBjYXB0dXJlZFZhcmlhYmxlc0ZvclNjb3BlLAogICAgICAgICAgICBub2RlQm94LAogICAgICAgICAgICBbXSwKICAgICAgICAgICAgZnJvbS5sb2NhbHNVc2VkSW5UcnlPclN5bmMsCiAgICAgICAgICAgIGZyb20uZnJlZVZhcmlhYmxlcywKICAgICAgICAgICAgZnJvbS5mcmVlVmFyaWFibGVzRm9yUnRpLAogICAgICAgICAgICBmcm9tLnRoaXNVc2VkQXNGcmVlVmFyaWFibGUsCiAgICAgICAgICAgIGZyb20udGhpc1VzZWRBc0ZyZWVWYXJpYWJsZUlmTmVlZHNSdGksCiAgICAgICAgICAgIF9oYXNUaGlzTG9jYWwpOwogICAgICB9IGVsc2UgewogICAgICAgIGNhcHR1cmVkU2NvcGUgPSBuZXcgS2VybmVsQ2FwdHVyZWRTY29wZSgKICAgICAgICAgICAgY2FwdHVyZWRWYXJpYWJsZXNGb3JTY29wZSwKICAgICAgICAgICAgbm9kZUJveCwKICAgICAgICAgICAgZnJvbS5sb2NhbHNVc2VkSW5UcnlPclN5bmMsCiAgICAgICAgICAgIGZyb20uZnJlZVZhcmlhYmxlcywKICAgICAgICAgICAgZnJvbS5mcmVlVmFyaWFibGVzRm9yUnRpLAogICAgICAgICAgICBmcm9tLnRoaXNVc2VkQXNGcmVlVmFyaWFibGUsCiAgICAgICAgICAgIGZyb20udGhpc1VzZWRBc0ZyZWVWYXJpYWJsZUlmTmVlZHNSdGksCiAgICAgICAgICAgIF9oYXNUaGlzTG9jYWwpOwogICAgICB9CiAgICAgIF9tb2RlbC5zY29wZUluZm8gPSBfc2NvcGVzQ2FwdHVyZWRJbkNsb3N1cmVNYXBbbm9kZV0gPSBjYXB0dXJlZFNjb3BlOwogICAgfQogIH0KCiAgLy8vIEdlbmVyYXRlIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBbX2JveENvdW50ZXJddGggYm94IGZpZWxkLgogIC8vLwogIC8vLyBUaGUgcmVzdWx0IGlzIHVzZWQgYXMgdGhlIG5hbWUgb2YgW05vZGVCb3hdcyBhbmQgW0JveExvY2FsXXMsIGFuZCBtdXN0CiAgLy8vIHRoZXJlZm9yZSBiZSB1bmlxdWUgdG8gYXZvaWQgYnJlYWtpbmcgYW4gaW52YXJpYW50IGluIHRoZSBlbGVtZW50IG1vZGVsCiAgLy8vIChjbGFzc2VzIGNhbm5vdCBkZWNsYXJlIG11bHRpcGxlIGZpZWxkcyB3aXRoIHRoZSBzYW1lIG5hbWUpLgogIC8vLwogIC8vLyBBbHNvLCB0aGUgbmFtZXMgc2hvdWxkIGJlIGRpc3RpbmN0IGZyb20gcmVhbCBmaWVsZCBuYW1lcyB0byBwcmV2ZW50CiAgLy8vIGNsYXNoZXMgd2l0aCBzZWxlY3RvcnMgZm9yIHRob3NlIGZpZWxkcy4KICAvLy8KICAvLy8gVGhlc2UgbmFtZXMgYXJlIG5vdCB1c2VkIGluIGdlbmVyYXRlZCBjb2RlLCBqdXN0IGFzIGVsZW1lbnQgbmFtZS4KICBTdHJpbmcgZ2V0Qm94TmFtZSgpIHsKICAgIHJldHVybiAiX2JveF8ke19ib3hDb3VudGVyKyt9IjsKICB9CgogIC8vLyBQZXJmb3JtIGJvb2sta2VlcGluZyB3aXRoIHRoZSBjdXJyZW50IHNldCBvZiBsb2NhbCB2YXJpYWJsZXMgdGhhdCBoYXZlCiAgLy8vIGJlZW4gc2VlbiB0aHVzIGZhciBiZWZvcmUgZW50ZXJpbmcgdGhpcyBuZXcgc2NvcGUuCiAgdm9pZCBlbnRlck5ld1Njb3BlKGlyLk5vZGUgbm9kZSwgdm9pZCB2aXNpdE5ld1Njb3BlKCkpIHsKICAgIExpc3Q8aXIuTm9kZT4gb2xkU2NvcGVWYXJpYWJsZXMgPSBfc2NvcGVWYXJpYWJsZXM7CiAgICBfc2NvcGVWYXJpYWJsZXMgPSA8aXIuTm9kZT5bXTsKICAgIHZpc2l0TmV3U2NvcGUoKTsKICAgIGF0dGFjaENhcHR1cmVkU2NvcGVWYXJpYWJsZXMobm9kZSk7CiAgICBfbXV0YXRlZFZhcmlhYmxlcy5yZW1vdmVBbGwoX3Njb3BlVmFyaWFibGVzKTsKICAgIF9zY29wZVZhcmlhYmxlcyA9IG9sZFNjb3BlVmFyaWFibGVzOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0TmFtZWRFeHByZXNzaW9uKGlyLk5hbWVkRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0VHJ5Q2F0Y2goaXIuVHJ5Q2F0Y2ggbm9kZSkgewogICAgYm9vbCBvbGRJblRyeSA9IF9pblRyeTsKICAgIF9pblRyeSA9IHRydWU7CiAgICB2aXNpdEluVmFyaWFibGVTY29wZShub2RlLCAoKSB7CiAgICAgIHZpc2l0Tm9kZShub2RlLmJvZHkpOwogICAgfSk7CiAgICB2aXNpdE5vZGVzKG5vZGUuY2F0Y2hlcyk7CiAgICBfaW5UcnkgPSBvbGRJblRyeTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0VHJ5RmluYWxseShpci5UcnlGaW5hbGx5IG5vZGUpIHsKICAgIGJvb2wgb2xkSW5UcnkgPSBfaW5Ucnk7CiAgICBfaW5UcnkgPSB0cnVlOwogICAgdmlzaXRJblZhcmlhYmxlU2NvcGUobm9kZSwgKCkgewogICAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICAgIH0pOwogICAgdmlzaXROb2RlKG5vZGUuZmluYWxpemVyKTsKICAgIF9pblRyeSA9IG9sZEluVHJ5OwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRWYXJpYWJsZUdldChpci5WYXJpYWJsZUdldCBub2RlKSB7CiAgICBfbWFya1ZhcmlhYmxlQXNVc2VkKG5vZGUudmFyaWFibGUsIFZhcmlhYmxlVXNlLmV4cGxpY2l0KTsKICAgIC8vIERvbid0IHZpc2l0IGBub2RlLnByb21vdGVkVHlwZWAuCiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFZhcmlhYmxlU2V0KGlyLlZhcmlhYmxlU2V0IG5vZGUpIHsKICAgIF9tdXRhdGVkVmFyaWFibGVzLmFkZChub2RlLnZhcmlhYmxlKTsKICAgIF9tYXJrVmFyaWFibGVBc1VzZWQobm9kZS52YXJpYWJsZSwgVmFyaWFibGVVc2UuZXhwbGljaXQpOwogICAgdmlzaXRJbkNvbnRleHQobm9kZS52YXJpYWJsZS50eXBlLCBWYXJpYWJsZVVzZS5sb2NhbFR5cGUpOwogICAgdmlzaXROb2RlKG5vZGUudmFsdWUpOwogICAgcmVnaXN0ZXJBc3NpZ25lZFZhcmlhYmxlKG5vZGUudmFyaWFibGUpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICB2b2lkIF9oYW5kbGVWYXJpYWJsZURlY2xhcmF0aW9uKAogICAgICBpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUsIFZhcmlhYmxlVXNlIHVzYWdlKSB7CiAgICBpZiAoIW5vZGUuaXNGaWVsZEZvcm1hbCkgewogICAgICBfc2NvcGVWYXJpYWJsZXMuYWRkKG5vZGUpOwogICAgfQoKICAgIHZpc2l0SW5Db250ZXh0KG5vZGUudHlwZSwgdXNhZ2UpOwogICAgdmlzaXROb2RlKG5vZGUuaW5pdGlhbGl6ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihpci5WYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIF9oYW5kbGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUsIFZhcmlhYmxlVXNlLmxvY2FsVHlwZSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIC8vLyBBZGQgdGhpcyB2YXJpYWJsZSB0byB0aGUgc2V0IG9mIGZyZWUgdmFyaWFibGVzIGlmIGFwcHJvcHJpYXRlIGFuZCBhZGQgdG8KICAvLy8gdGhlIHRhbGx5IG9mIHZhcmlhYmxlcyB1c2VkIGluIHRyeSBvciBzeW5jIGJsb2Nrcy4KICAvLy8gSWYgW29ubHlGb3JSdGlDaGVja3NdIGlzIHRydWUsIGFkZCB0byB0aGUgZnJlZVZhcmlhYmxlc0ZvclJ0aSBzZXQgaW5zdGVhZAogIC8vLyBvZiBmcmVlVmFyaWFibGVzIGFzIHdlIHdpbGwgb25seSB1c2UgaXQgaWYgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGlzCiAgLy8vIGNoZWNrZWQuCiAgdm9pZCBfbWFya1ZhcmlhYmxlQXNVc2VkKAogICAgICBpci5Ob2RlIC8qIFZhcmlhYmxlRGVjbGFyYXRpb24gfCBUeXBlUGFyYW1ldGVyVHlwZVdpdGhDb250ZXh0ICovIHZhcmlhYmxlLAogICAgICBWYXJpYWJsZVVzZSB1c2FnZSkgewogICAgYXNzZXJ0KHZhcmlhYmxlIGlzIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gfHwKICAgICAgICB2YXJpYWJsZSBpcyBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQpOwogICAgYXNzZXJ0KHVzYWdlICE9IG51bGwpOwogICAgaWYgKF9pc0luc2lkZUNsb3N1cmUgJiYgIV9pbkN1cnJlbnRDb250ZXh0KHZhcmlhYmxlKSkgewogICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBub3QgZGVjbGFyZWQgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24gYW5kIHRoZSBlbGVtZW50CiAgICAgIC8vIGlzIG5vdCB0aGUgY2xvc3VyZSBpdHNlbGYgd2UgbmVlZCB0byBtYXJrIHRoZSBlbGVtZW50IGFzIGZyZWUgdmFyaWFibGUuCiAgICAgIC8vIE5vdGUgdGhhdCB0aGUgY2hlY2sgb24gW2luc2lkZUNsb3N1cmVdIGlzIG5vdCBqdXN0IGFuCiAgICAgIC8vIG9wdGltaXphdGlvbjogZmFjdG9yaWVzIGhhdmUgdHlwZSBwYXJhbWV0ZXJzIGFzIGZ1bmN0aW9uCiAgICAgIC8vIHBhcmFtZXRlcnMsIGFuZCB0eXBlIHBhcmFtZXRlcnMgYXJlIGRlY2xhcmVkIGluIHRoZSBjbGFzcywgbm90CiAgICAgIC8vIHRoZSBmYWN0b3J5LgogICAgICBpZiAodXNhZ2UgPT0gVmFyaWFibGVVc2UuZXhwbGljaXQpIHsKICAgICAgICBfY3VycmVudFNjb3BlSW5mby5mcmVlVmFyaWFibGVzLmFkZCh2YXJpYWJsZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2N1cnJlbnRTY29wZUluZm8uZnJlZVZhcmlhYmxlc0ZvclJ0aQogICAgICAgICAgICAucHV0SWZBYnNlbnQodmFyaWFibGUsICgpID0+IG5ldyBTZXQ8VmFyaWFibGVVc2U+KCkpCiAgICAgICAgICAgIC5hZGQodXNhZ2UpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2luVHJ5ICYmIHZhcmlhYmxlIGlzIGlyLlZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgX2N1cnJlbnRTY29wZUluZm8ubG9jYWxzVXNlZEluVHJ5T3JTeW5jLmFkZCh2YXJpYWJsZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRUaGlzRXhwcmVzc2lvbihpci5UaGlzRXhwcmVzc2lvbiB0aGlzRXhwcmVzc2lvbikgewogICAgaWYgKF9oYXNUaGlzTG9jYWwpIHsKICAgICAgX3JlZ2lzdGVyTmVlZHNUaGlzKFZhcmlhYmxlVXNlLmV4cGxpY2l0KTsKICAgIH0KICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0VHlwZVBhcmFtZXRlcihpci5UeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIpIHsKICAgIGlyLlRyZWVOb2RlIGNvbnRleHQgPSBfZXhlY3V0YWJsZUNvbnRleHQ7CiAgICBUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQgdHlwZVZhcmlhYmxlID0gbmV3IFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCgKICAgICAgICBuZXcgaXIuVHlwZVBhcmFtZXRlclR5cGUodHlwZVBhcmFtZXRlciksCiAgICAgICAgLy8gSWYgdGhpcyB0eXBlUGFyYW1ldGVyIGlzIHBhcnQgb2YgYSB0eXBlZGVmIHRoZW4gaXRzIHBhcmVudCBpcwogICAgICAgIC8vIG51bGwgYmVjYXVzZSBpdCBoYXMgbm8gY29udGV4dC4gSnVzdCBwYXNzIGluIG51bGwgZm9yIHRoZQogICAgICAgIC8vIGNvbnRleHQgaW4gdGhhdCBjYXNlLgogICAgICAgIHR5cGVQYXJhbWV0ZXIucGFyZW50ICE9IG51bGwgPyB0eXBlUGFyYW1ldGVyLnBhcmVudC5wYXJlbnQgOiBudWxsKTsKICAgIGlmIChfaXNJbnNpZGVDbG9zdXJlICYmIGNvbnRleHQgaXMgaXIuUHJvY2VkdXJlICYmIGNvbnRleHQuaXNGYWN0b3J5KSB7CiAgICAgIC8vIFRoaXMgaXMgYSBjbG9zdXJlIGluIGEgZmFjdG9yeSBjb25zdHJ1Y3Rvci4gIFNpbmNlIHRoZXJlIGlzIG5vCiAgICAgIC8vIFs6dGhpczpdLCB3ZSBoYXZlIHRvIG1hcmsgdGhlIHR5cGUgYXJndW1lbnRzIGFzIGZyZWUgdmFyaWFibGVzIHRvCiAgICAgIC8vIGNhcHR1cmUgdGhlbSBpbiB0aGUgY2xvc3VyZS4KICAgICAgX3VzZVR5cGVWYXJpYWJsZUFzTG9jYWwodHlwZVZhcmlhYmxlLCBfY3VycmVudFR5cGVVc2FnZSk7CiAgICB9CgogICAgaWYgKF9leGVjdXRhYmxlQ29udGV4dCBpcyBpci5NZW1iZXIgJiYgX2V4ZWN1dGFibGVDb250ZXh0IGlzISBpci5GaWVsZCkgewogICAgICAvLyBJbiBjaGVja2VkIG1vZGUsIHVzaW5nIGEgdHlwZSB2YXJpYWJsZSBpbiBhIHR5cGUgYW5ub3RhdGlvbiBtYXkgbGVhZAogICAgICAvLyB0byBhIHJ1bnRpbWUgdHlwZSBjaGVjayB0aGF0IG5lZWRzIHRvIGFjY2VzcyB0aGUgdHlwZSBhcmd1bWVudCBhbmQKICAgICAgLy8gdGhlcmVmb3JlIHRoZSBjbG9zdXJlIG5lZWRzIGEgdGhpcy1lbGVtZW50LCBpZiBpdCBpcyBub3QgaW4gYSBmaWVsZAogICAgICAvLyBpbml0aWFsaXplcjsgZmllbGQgaW5pdGlhbGl6ZXJzIGFyZSBldmFsdWF0ZWQgaW4gYSBjb250ZXh0IHdoZXJlCiAgICAgIC8vIHRoZSB0eXBlIGFyZ3VtZW50cyBhcmUgYXZhaWxhYmxlIGluIGxvY2Fscy4KCiAgICAgIGlmIChfaGFzVGhpc0xvY2FsKSB7CiAgICAgICAgX3JlZ2lzdGVyTmVlZHNUaGlzKF9jdXJyZW50VHlwZVVzYWdlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfdXNlVHlwZVZhcmlhYmxlQXNMb2NhbCh0eXBlVmFyaWFibGUsIF9jdXJyZW50VHlwZVVzYWdlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpOwogIH0KCiAgLy8vIEFkZCBgdGhpc2AgYXMgYSB2YXJpYWJsZSB0aGF0IG5lZWRzIHRvIGJlIGFjY2Vzc2VkIChhbmQgdGh1cyBtYXkgYmVjb21lIGEKICAvLy8gZnJlZS9jYXB0dXJlZCB2YXJpYWJsZS4KICAvLy8gSWYgW29ubHlJZk5lZWRzUnRpXSBpcyB0cnVlLCBzZXQgdGhpc1VzZWRBc0ZyZWVWYXJpYWJsZUlmTmVlZHNSdGkgdG8gdHJ1ZQogIC8vLyBpbnN0ZWFkIG9mIHRoaXNVc2VkQXNGcmVlVmFyaWFibGUgYXMgd2Ugd2lsbCBvbmx5IHVzZSBgdGhpc2AgaWYgcnVudGltZQogIC8vLyB0eXBlIGluZm9ybWF0aW9uIGlzIGNoZWNrZWQuCiAgdm9pZCBfcmVnaXN0ZXJOZWVkc1RoaXMoVmFyaWFibGVVc2UgdXNhZ2UpIHsKICAgIGlmIChfaXNJbnNpZGVDbG9zdXJlKSB7CiAgICAgIGlmICh1c2FnZSA9PSBWYXJpYWJsZVVzZS5leHBsaWNpdCkgewogICAgICAgIF9jdXJyZW50U2NvcGVJbmZvLnRoaXNVc2VkQXNGcmVlVmFyaWFibGUgPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIF9jdXJyZW50U2NvcGVJbmZvLnRoaXNVc2VkQXNGcmVlVmFyaWFibGVJZk5lZWRzUnRpLmFkZCh1c2FnZSk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEZvckluU3RhdGVtZW50KGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIC8vIFdlIG5lZWQgdG8gc2V0IGBpblRyeWAgdG8gdHJ1ZSBpZiB0aGlzIGlzIGFuIGFzeW5jIGZvci1pbiBiZWNhdXNlIHdlCiAgICAvLyBkZXN1Z2FyIGl0IGludG8gYSB0cnktZmluYWxseSBpbiB0aGUgU1NBIHBoYXNlLgogICAgYm9vbCBvbGRJblRyeSA9IF9pblRyeTsKICAgIGlmIChub2RlLmlzQXN5bmMpIHsKICAgICAgX2luVHJ5ID0gdHJ1ZTsKICAgIH0KICAgIGVudGVyTmV3U2NvcGUobm9kZSwgKCkgewogICAgICB2aXNpdE5vZGUobm9kZS52YXJpYWJsZSk7CiAgICAgIHZpc2l0SW5WYXJpYWJsZVNjb3BlKG5vZGUsICgpIHsKICAgICAgICB2aXNpdE5vZGUobm9kZS5pdGVyYWJsZSk7CiAgICAgICAgdmlzaXROb2RlKG5vZGUuYm9keSk7CiAgICAgIH0pOwogICAgfSk7CiAgICBpZiAobm9kZS5pc0FzeW5jKSB7CiAgICAgIF9pblRyeSA9IG9sZEluVHJ5OwogICAgfQogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRXaGlsZVN0YXRlbWVudChpci5XaGlsZVN0YXRlbWVudCBub2RlKSB7CiAgICBlbnRlck5ld1Njb3BlKG5vZGUsICgpIHsKICAgICAgdmlzaXRJblZhcmlhYmxlU2NvcGUobm9kZSwgKCkgewogICAgICAgIHZpc2l0Tm9kZShub2RlLmNvbmRpdGlvbik7CiAgICAgICAgdmlzaXROb2RlKG5vZGUuYm9keSk7CiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdERvU3RhdGVtZW50KGlyLkRvU3RhdGVtZW50IG5vZGUpIHsKICAgIGVudGVyTmV3U2NvcGUobm9kZSwgKCkgewogICAgICB2aXNpdEluVmFyaWFibGVTY29wZShub2RlLCAoKSB7CiAgICAgICAgdmlzaXROb2RlKG5vZGUuYm9keSk7CiAgICAgICAgdmlzaXROb2RlKG5vZGUuY29uZGl0aW9uKTsKICAgICAgfSk7CiAgICB9KTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0Rm9yU3RhdGVtZW50KGlyLkZvclN0YXRlbWVudCBub2RlKSB7CiAgICBMaXN0PGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+IGJveGVkTG9vcFZhcmlhYmxlcyA9CiAgICAgICAgPGlyLlZhcmlhYmxlRGVjbGFyYXRpb24+W107CiAgICBlbnRlck5ld1Njb3BlKG5vZGUsICgpIHsKICAgICAgLy8gRmlyc3QgdmlzaXQgaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGFuZCB1cGRhdGUgc3RlcHMgc28gd2UgY2FuIGVhc2lseQogICAgICAvLyBjaGVjayBpZiBhIGxvb3AgdmFyaWFibGUgd2FzIGNhcHR1cmVkIGluIG9uZSBvZiB0aGVzZSBzdWJleHByZXNzaW9ucy4KICAgICAgdmlzaXROb2Rlcyhub2RlLnZhcmlhYmxlcyk7CiAgICAgIHZpc2l0SW5WYXJpYWJsZVNjb3BlKG5vZGUsICgpIHsKICAgICAgICB2aXNpdE5vZGVzKG5vZGUudXBkYXRlcyk7CiAgICAgIH0pOwoKICAgICAgLy8gTG9vcCB2YXJpYWJsZXMgdGhhdCBoYXZlIG5vdCBiZWVuIGNhcHR1cmVkIHlldCBjYW4gc2FmZWx5IGJlIGZsYWdnZWQgYXMKICAgICAgLy8gbm9uLW11dGF0ZWQsIGJlY2F1c2Ugbm8gbmVzdGVkIGZ1bmN0aW9uIGNhbiBvYnNlcnZlIHRoZSBtdXRhdGlvbi4KICAgICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIG5vZGUudmFyaWFibGVzKSB7CiAgICAgICAgaWYgKCFfY2FwdHVyZWRWYXJpYWJsZXMuY29udGFpbnModmFyaWFibGUpKSB7CiAgICAgICAgICBfbXV0YXRlZFZhcmlhYmxlcy5yZW1vdmUodmFyaWFibGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gVmlzaXQgY29uZGl0aW9uIGFuZCBib2R5LgogICAgICAvLyBUaGlzIG11c3QgaGFwcGVuIGFmdGVyIHRoZSBhYm92ZSwgc28gYW55IGxvb3AgdmFyaWFibGVzIG11dGF0ZWQgaW4gdGhlCiAgICAgIC8vIGNvbmRpdGlvbiBvciBib2R5IGFyZSBpbmRlZWQgZmxhZ2dlZCBhcyBtdXRhdGVkLgogICAgICB2aXNpdEluVmFyaWFibGVTY29wZShub2RlLCAoKSB7CiAgICAgICAgdmlzaXROb2RlKG5vZGUuY29uZGl0aW9uKTsKICAgICAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICAgICAgfSk7CgogICAgICAvLyBTZWUgaWYgd2UgaGF2ZSBkZWNsYXJlZCBsb29wIHZhcmlhYmxlcyB0aGF0IG5lZWQgdG8gYmUgYm94ZWQuCiAgICAgIGZvciAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSBpbiBub2RlLnZhcmlhYmxlcykgewogICAgICAgIC8vIE5vbi1tdXRhdGVkIHZhcmlhYmxlcyBzaG91bGQgbm90IGJlIGJveGVkLiAgVGhlIF9tdXRhdGVkVmFyaWFibGVzIHNldAogICAgICAgIC8vIGdldHMgY2xlYXJlZCB3aGVuIGBlbnRlck5ld1Njb3BlYCByZXR1cm5zLCBzbyBjaGVjayBpdCBoZXJlLgogICAgICAgIGlmIChfY2FwdHVyZWRWYXJpYWJsZXMuY29udGFpbnModmFyaWFibGUpICYmCiAgICAgICAgICAgIF9tdXRhdGVkVmFyaWFibGVzLmNvbnRhaW5zKHZhcmlhYmxlKSkgewogICAgICAgICAgYm94ZWRMb29wVmFyaWFibGVzLmFkZCh2YXJpYWJsZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIEtlcm5lbENhcHR1cmVkU2NvcGUgc2NvcGUgPSBfc2NvcGVzQ2FwdHVyZWRJbkNsb3N1cmVNYXBbbm9kZV07CiAgICBpZiAoc2NvcGUgIT0gbnVsbCkgewogICAgICBfc2NvcGVzQ2FwdHVyZWRJbkNsb3N1cmVNYXBbbm9kZV0gPSBuZXcgS2VybmVsQ2FwdHVyZWRMb29wU2NvcGUoCiAgICAgICAgICBzY29wZS5ib3hlZFZhcmlhYmxlcywKICAgICAgICAgIHNjb3BlLmNhcHR1cmVkVmFyaWFibGVzQWNjZXNzb3IsCiAgICAgICAgICBib3hlZExvb3BWYXJpYWJsZXMsCiAgICAgICAgICBzY29wZS5sb2NhbHNVc2VkSW5UcnlPclN5bmMsCiAgICAgICAgICBzY29wZS5mcmVlVmFyaWFibGVzLAogICAgICAgICAgc2NvcGUuZnJlZVZhcmlhYmxlc0ZvclJ0aSwKICAgICAgICAgIHNjb3BlLnRoaXNVc2VkQXNGcmVlVmFyaWFibGUsCiAgICAgICAgICBzY29wZS50aGlzVXNlZEFzRnJlZVZhcmlhYmxlSWZOZWVkc1J0aSwKICAgICAgICAgIHNjb3BlLmhhc1RoaXNMb2NhbCk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbigKICAgICAgaXIuU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmIChfaGFzVGhpc0xvY2FsKSB7CiAgICAgIF9yZWdpc3Rlck5lZWRzVGhpcyhWYXJpYWJsZVVzZS5leHBsaWNpdCk7CiAgICB9CiAgICBpZiAobm9kZS5hcmd1bWVudHMudHlwZXMuaXNOb3RFbXB0eSkgewogICAgICB2aXNpdE5vZGVzSW5Db250ZXh0KG5vZGUuYXJndW1lbnRzLnR5cGVzLAogICAgICAgICAgbmV3IFZhcmlhYmxlVXNlLnN0YXRpY1R5cGVBcmd1bWVudChub2RlLmludGVyZmFjZVRhcmdldCkpOwogICAgfQogICAgdmlzaXROb2Rlcyhub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsKTsKICAgIHZpc2l0Tm9kZXMobm9kZS5hcmd1bWVudHMubmFtZWQpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRTdXBlclByb3BlcnR5U2V0KGlyLlN1cGVyUHJvcGVydHlTZXQgbm9kZSkgewogICAgaWYgKF9oYXNUaGlzTG9jYWwpIHsKICAgICAgX3JlZ2lzdGVyTmVlZHNUaGlzKFZhcmlhYmxlVXNlLmV4cGxpY2l0KTsKICAgIH0KICAgIHZpc2l0Tm9kZShub2RlLnZhbHVlKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0U3VwZXJQcm9wZXJ0eUdldChpci5TdXBlclByb3BlcnR5R2V0IG5vZGUpIHsKICAgIGlmIChfaGFzVGhpc0xvY2FsKSB7CiAgICAgIF9yZWdpc3Rlck5lZWRzVGhpcyhWYXJpYWJsZVVzZS5leHBsaWNpdCk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIHZvaWQgdmlzaXRJbnZva2FibGUoaXIuVHJlZU5vZGUgbm9kZSwgdm9pZCBmKCkpIHsKICAgIGFzc2VydChub2RlIGlzIGlyLk1lbWJlciB8fCBub2RlIGlzIGlyLkxvY2FsRnVuY3Rpb24pOwogICAgYm9vbCBvbGRJc0luc2lkZUNsb3N1cmUgPSBfaXNJbnNpZGVDbG9zdXJlOwogICAgaXIuVHJlZU5vZGUgb2xkRXhlY3V0YWJsZUNvbnRleHQgPSBfZXhlY3V0YWJsZUNvbnRleHQ7CiAgICBLZXJuZWxTY29wZUluZm8gb2xkU2NvcGVJbmZvID0gX2N1cnJlbnRTY29wZUluZm87CgogICAgLy8gX291dGVybW9zdE5vZGUgaXMgb25seSBudWxsIHRoZSBmaXJzdCB0aW1lIHdlIGVudGVyIHRoZSBib2R5IG9mIHRoZQogICAgLy8gZmllbGQsIGNvbnN0cnVjdG9yLCBvciBtZXRob2QgdGhhdCBpcyBiZWluZyBhbmFseXplZC4KICAgIF9pc0luc2lkZUNsb3N1cmUgPSBfb3V0ZXJtb3N0Tm9kZSAhPSBudWxsOwogICAgX2V4ZWN1dGFibGVDb250ZXh0ID0gbm9kZTsKCiAgICBfY3VycmVudFNjb3BlSW5mbyA9IG5ldyBLZXJuZWxTY29wZUluZm8oX2hhc1RoaXNMb2NhbCk7CgogICAgaWYgKF9pc0luc2lkZUNsb3N1cmUpIHsKICAgICAgX2Nsb3N1cmVzVG9HZW5lcmF0ZVtub2RlXSA9IF9jdXJyZW50U2NvcGVJbmZvOwogICAgfSBlbHNlIHsKICAgICAgX291dGVybW9zdE5vZGUgPSBub2RlOwogICAgICBfbW9kZWwuc2NvcGVJbmZvID0gX2N1cnJlbnRTY29wZUluZm87CiAgICB9CgogICAgZW50ZXJOZXdTY29wZShub2RlLCBmKTsKCiAgICBLZXJuZWxTY29wZUluZm8gc2F2ZWRTY29wZUluZm8gPSBfY3VycmVudFNjb3BlSW5mbzsKICAgIGJvb2wgc2F2ZWRJc0luc2lkZUNsb3N1cmUgPSBfaXNJbnNpZGVDbG9zdXJlOwoKICAgIC8vIFJlc3RvcmUgb2xkIHZhbHVlcy4KICAgIF9pc0luc2lkZUNsb3N1cmUgPSBvbGRJc0luc2lkZUNsb3N1cmU7CiAgICBfY3VycmVudFNjb3BlSW5mbyA9IG9sZFNjb3BlSW5mbzsKICAgIF9leGVjdXRhYmxlQ29udGV4dCA9IG9sZEV4ZWN1dGFibGVDb250ZXh0OwoKICAgIC8vIE1hcmsgYWxsIGZyZWUgdmFyaWFibGVzIGFzIGNhcHR1cmVkIGFuZCBleHBlY3QgdG8gZW5jb3VudGVyIHRoZW0gaW4gdGhlCiAgICAvLyBvdXRlciBmdW5jdGlvbi4KICAgIEl0ZXJhYmxlPGlyLk5vZGU+IGZyZWVWYXJpYWJsZXMgPSBzYXZlZFNjb3BlSW5mby5mcmVlVmFyaWFibGVzOwogICAgYXNzZXJ0KGZyZWVWYXJpYWJsZXMuaXNFbXB0eSB8fCBzYXZlZElzSW5zaWRlQ2xvc3VyZSk7CiAgICBmb3IgKGlyLk5vZGUgZnJlZVZhcmlhYmxlIGluIGZyZWVWYXJpYWJsZXMpIHsKICAgICAgX2NhcHR1cmVkVmFyaWFibGVzLmFkZChmcmVlVmFyaWFibGUpOwogICAgICBfbWFya1ZhcmlhYmxlQXNVc2VkKGZyZWVWYXJpYWJsZSwgVmFyaWFibGVVc2UuZXhwbGljaXQpOwogICAgfQogICAgc2F2ZWRTY29wZUluZm8uZnJlZVZhcmlhYmxlc0ZvclJ0aS5mb3JFYWNoKAogICAgICAgIChUeXBlVmFyaWFibGVUeXBlV2l0aENvbnRleHQgZnJlZVZhcmlhYmxlRm9yUnRpLAogICAgICAgICAgICBTZXQ8VmFyaWFibGVVc2U+IHVzZVNldCkgewogICAgICBmb3IgKFZhcmlhYmxlVXNlIHVzYWdlIGluIHVzZVNldCkgewogICAgICAgIF9tYXJrVmFyaWFibGVBc1VzZWQoZnJlZVZhcmlhYmxlRm9yUnRpLCB1c2FnZSk7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKF9pc0luc2lkZUNsb3N1cmUgJiYgc2F2ZWRTY29wZUluZm8udGhpc1VzZWRBc0ZyZWVWYXJpYWJsZSkgewogICAgICBfY3VycmVudFNjb3BlSW5mby50aGlzVXNlZEFzRnJlZVZhcmlhYmxlID0gdHJ1ZTsKICAgIH0KICAgIGlmIChfaXNJbnNpZGVDbG9zdXJlKSB7CiAgICAgIF9jdXJyZW50U2NvcGVJbmZvLnRoaXNVc2VkQXNGcmVlVmFyaWFibGVJZk5lZWRzUnRpCiAgICAgICAgICAuYWRkQWxsKHNhdmVkU2NvcGVJbmZvLnRoaXNVc2VkQXNGcmVlVmFyaWFibGVJZk5lZWRzUnRpKTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm4gdHJ1ZSBpZiBbdmFyaWFibGVdJ3MgY29udGV4dCBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBleGVjdXRhYmxlCiAgLy8vIGNvbnRleHQuCiAgYm9vbCBfaW5DdXJyZW50Q29udGV4dChpci5Ob2RlIHZhcmlhYmxlKSB7CiAgICBhc3NlcnQodmFyaWFibGUgaXMgaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB8fAogICAgICAgIHZhcmlhYmxlIGlzIFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCk7CiAgICBpZiAodmFyaWFibGUgaXMgVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0KSB7CiAgICAgIHJldHVybiB2YXJpYWJsZS5jb250ZXh0ID09IF9leGVjdXRhYmxlQ29udGV4dDsKICAgIH0KICAgIGlyLlRyZWVOb2RlIG5vZGUgPSB2YXJpYWJsZTsKICAgIHdoaWxlIChub2RlICE9IF9vdXRlcm1vc3ROb2RlICYmIG5vZGUgIT0gX2V4ZWN1dGFibGVDb250ZXh0KSB7CiAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgIH0KICAgIHJldHVybiBub2RlID09IF9leGVjdXRhYmxlQ29udGV4dDsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEZpZWxkKGlyLkZpZWxkIG5vZGUpIHsKICAgIF9jdXJyZW50VHlwZVVzYWdlID0gVmFyaWFibGVVc2UuZmllbGRUeXBlOwogICAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IGNvbXBsZXhpdHk7CiAgICB2aXNpdEludm9rYWJsZShub2RlLCAoKSB7CiAgICAgIGNvbXBsZXhpdHkgPSB2aXNpdE5vZGUobm9kZS5pbml0aWFsaXplcik7CiAgICB9KTsKICAgIF9jdXJyZW50VHlwZVVzYWdlID0gbnVsbDsKICAgIHJldHVybiBjb21wbGV4aXR5OwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0Q29uc3RydWN0b3IoaXIuQ29uc3RydWN0b3Igbm9kZSkgewogICAgdmlzaXRJbnZva2FibGUobm9kZSwgKCkgewogICAgICB2aXNpdE5vZGVzKG5vZGUuaW5pdGlhbGl6ZXJzKTsKICAgICAgdmlzaXROb2RlKG5vZGUuZnVuY3Rpb24pOwogICAgfSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFByb2NlZHVyZShpci5Qcm9jZWR1cmUgbm9kZSkgewogICAgdmlzaXRJbnZva2FibGUobm9kZSwgKCkgewogICAgICB2aXNpdE5vZGUobm9kZS5mdW5jdGlvbik7CiAgICB9KTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKGlyLkZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAgICB2aXNpdEludm9rYWJsZShub2RlLCAoKSB7CiAgICAgIHZpc2l0SW5WYXJpYWJsZVNjb3BlKG5vZGUsICgpIHsKICAgICAgICB2aXNpdE5vZGUobm9kZS5mdW5jdGlvbik7CiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24oaXIuRnVuY3Rpb25EZWNsYXJhdGlvbiBub2RlKSB7CiAgICB2aXNpdEludm9rYWJsZShub2RlLCAoKSB7CiAgICAgIHZpc2l0SW5WYXJpYWJsZVNjb3BlKG5vZGUsICgpIHsKICAgICAgICB2aXNpdE5vZGUobm9kZS5mdW5jdGlvbik7CiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdER5bmFtaWNUeXBlKGlyLkR5bmFtaWNUeXBlIG5vZGUpID0+CiAgICAgIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpOwoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRCb3R0b21UeXBlKGlyLkJvdHRvbVR5cGUgbm9kZSkgPT4KICAgICAgY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0SW52YWxpZFR5cGUoaXIuSW52YWxpZFR5cGUgbm9kZSkgPT4KICAgICAgY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0Vm9pZFR5cGUoaXIuVm9pZFR5cGUgbm9kZSkgPT4KICAgICAgY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmNvbnN0YW50KCk7CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEludGVyZmFjZVR5cGUoaXIuSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICByZXR1cm4gdmlzaXROb2Rlcyhub2RlLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0RnVuY3Rpb25UeXBlKGlyLkZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBJbml0aWFsaXplckNvbXBsZXhpdHkgY29tcGxleGl0eSA9IHZpc2l0Tm9kZShub2RlLnJldHVyblR5cGUpOwogICAgY29tcGxleGl0eSA9IGNvbXBsZXhpdHkuY29tYmluZSh2aXNpdE5vZGVzKG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMpKTsKICAgIGNvbXBsZXhpdHkgPSBjb21wbGV4aXR5LmNvbWJpbmUodmlzaXROb2Rlcyhub2RlLm5hbWVkUGFyYW1ldGVycykpOwogICAgcmV0dXJuIGNvbXBsZXhpdHkuY29tYmluZSh2aXNpdE5vZGVzKG5vZGUudHlwZVBhcmFtZXRlcnMpKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdE5hbWVkVHlwZShpci5OYW1lZFR5cGUgbm9kZSkgewogICAgcmV0dXJuIHZpc2l0Tm9kZShub2RlLnR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoaXIuVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgX2FuYWx5emVUeXBlVmFyaWFibGUobm9kZSwgX2N1cnJlbnRUeXBlVXNhZ2UpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRJbkNvbnRleHQoaXIuTm9kZSBub2RlLCBWYXJpYWJsZVVzZSB1c2UpIHsKICAgIFZhcmlhYmxlVXNlIG9sZEN1cnJlbnRUeXBlVXNhZ2UgPSBfY3VycmVudFR5cGVVc2FnZTsKICAgIF9jdXJyZW50VHlwZVVzYWdlID0gdXNlOwogICAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IGNvbXBsZXhpdHkgPSB2aXNpdE5vZGUobm9kZSk7CiAgICBfY3VycmVudFR5cGVVc2FnZSA9IG9sZEN1cnJlbnRUeXBlVXNhZ2U7CiAgICByZXR1cm4gY29tcGxleGl0eTsKICB9CgogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdE5vZGVzSW5Db250ZXh0KAogICAgICBMaXN0PGlyLk5vZGU+IG5vZGVzLCBWYXJpYWJsZVVzZSB1c2UpIHsKICAgIFZhcmlhYmxlVXNlIG9sZEN1cnJlbnRUeXBlVXNhZ2UgPSBfY3VycmVudFR5cGVVc2FnZTsKICAgIF9jdXJyZW50VHlwZVVzYWdlID0gdXNlOwogICAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IGNvbXBsZXhpdHkgPSB2aXNpdE5vZGVzKG5vZGVzKTsKICAgIF9jdXJyZW50VHlwZVVzYWdlID0gb2xkQ3VycmVudFR5cGVVc2FnZTsKICAgIHJldHVybiBjb21wbGV4aXR5OwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0VHlwZUxpdGVyYWwoaXIuVHlwZUxpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIHZpc2l0SW5Db250ZXh0KG5vZGUudHlwZSwgVmFyaWFibGVVc2UuZXhwbGljaXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0SXNFeHByZXNzaW9uKGlyLklzRXhwcmVzc2lvbiBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5vcGVyYW5kKTsKICAgIHZpc2l0SW5Db250ZXh0KG5vZGUudHlwZSwgVmFyaWFibGVVc2UuZXhwbGljaXQpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRBc0V4cHJlc3Npb24oaXIuQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLm9wZXJhbmQpOwogICAgdmlzaXRJbkNvbnRleHQobm9kZS50eXBlLAogICAgICAgIG5vZGUuaXNUeXBlRXJyb3IgPyBWYXJpYWJsZVVzZS5pbXBsaWNpdENhc3QgOiBWYXJpYWJsZVVzZS5leHBsaWNpdCk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEF3YWl0RXhwcmVzc2lvbihpci5Bd2FpdEV4cHJlc3Npb24gbm9kZSkgewogICAgdmlzaXROb2RlKG5vZGUub3BlcmFuZCk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFlpZWxkU3RhdGVtZW50KGlyLllpZWxkU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRMb2FkTGlicmFyeShpci5Mb2FkTGlicmFyeSBub2RlKSB7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkKAogICAgICBpci5DaGVja0xpYnJhcnlJc0xvYWRlZCBub2RlKSB7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEZ1bmN0aW9uTm9kZShpci5GdW5jdGlvbk5vZGUgbm9kZSkgewogICAgVmFyaWFibGVVc2UgcGFyYW1ldGVyVXNhZ2UgPSBub2RlLnBhcmVudCBpcyBpci5NZW1iZXIKICAgICAgICA/IG5ldyBWYXJpYWJsZVVzZS5tZW1iZXJQYXJhbWV0ZXIobm9kZS5wYXJlbnQpCiAgICAgICAgOiBuZXcgVmFyaWFibGVVc2UubG9jYWxQYXJhbWV0ZXIobm9kZS5wYXJlbnQpOwogICAgdmlzaXROb2Rlc0luQ29udGV4dChub2RlLnR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJVc2FnZSk7CiAgICBmb3IgKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gaW4gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBfaGFuZGxlVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgcGFyYW1ldGVyVXNhZ2UpOwogICAgfQogICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIGluIG5vZGUubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIF9oYW5kbGVWYXJpYWJsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uLCBwYXJhbWV0ZXJVc2FnZSk7CiAgICB9CiAgICB2aXNpdEluQ29udGV4dCgKICAgICAgICBub2RlLnJldHVyblR5cGUsCiAgICAgICAgbm9kZS5wYXJlbnQgaXMgaXIuTWVtYmVyCiAgICAgICAgICAgID8gbmV3IFZhcmlhYmxlVXNlLm1lbWJlclJldHVyblR5cGUobm9kZS5wYXJlbnQpCiAgICAgICAgICAgIDogbmV3IFZhcmlhYmxlVXNlLmxvY2FsUmV0dXJuVHlwZShub2RlLnBhcmVudCkpOwogICAgdmlzaXROb2RlKG5vZGUuYm9keSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdExpc3RMaXRlcmFsKGlyLkxpc3RMaXRlcmFsIG5vZGUpIHsKICAgIEluaXRpYWxpemVyQ29tcGxleGl0eSBjb21wbGV4aXR5ID0KICAgICAgICB2aXNpdEluQ29udGV4dChub2RlLnR5cGVBcmd1bWVudCwgVmFyaWFibGVVc2UubGlzdExpdGVyYWwpOwogICAgY29tcGxleGl0eSA9IGNvbXBsZXhpdHkuY29tYmluZSh2aXNpdE5vZGVzKG5vZGUuZXhwcmVzc2lvbnMpKTsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGNvbXBsZXhpdHkubWFrZUVhZ2VyKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRTZXRMaXRlcmFsKGlyLlNldExpdGVyYWwgbm9kZSkgewogICAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IGNvbXBsZXhpdHkgPQogICAgICAgIHZpc2l0SW5Db250ZXh0KG5vZGUudHlwZUFyZ3VtZW50LCBWYXJpYWJsZVVzZS5zZXRMaXRlcmFsKTsKICAgIGNvbXBsZXhpdHkgPSBjb21wbGV4aXR5LmNvbWJpbmUodmlzaXROb2Rlcyhub2RlLmV4cHJlc3Npb25zKSk7CiAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkuY29uc3RhbnQoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBjb21wbGV4aXR5Lm1ha2VFYWdlcigpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0TWFwTGl0ZXJhbChpci5NYXBMaXRlcmFsIG5vZGUpIHsKICAgIEluaXRpYWxpemVyQ29tcGxleGl0eSBjb21wbGV4aXR5ID0KICAgICAgICB2aXNpdEluQ29udGV4dChub2RlLmtleVR5cGUsIFZhcmlhYmxlVXNlLm1hcExpdGVyYWwpOwogICAgY29tcGxleGl0eSA9IGNvbXBsZXhpdHkKICAgICAgICAuY29tYmluZSh2aXNpdEluQ29udGV4dChub2RlLnZhbHVlVHlwZSwgVmFyaWFibGVVc2UubWFwTGl0ZXJhbCkpOwogICAgY29tcGxleGl0eSA9IGNvbXBsZXhpdHkuY29tYmluZSh2aXNpdE5vZGVzKG5vZGUuZW50cmllcykpOwogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmNvbnN0YW50KCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gY29tcGxleGl0eS5tYWtlRWFnZXIoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdE1hcEVudHJ5KGlyLk1hcEVudHJ5IG5vZGUpIHsKICAgIEluaXRpYWxpemVyQ29tcGxleGl0eSBjb21wbGV4aXR5ID0gdmlzaXROb2RlKG5vZGUua2V5KTsKICAgIHJldHVybiBjb21wbGV4aXR5LmNvbWJpbmUodmlzaXROb2RlKG5vZGUudmFsdWUpKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdE51bGxMaXRlcmFsKGlyLk51bGxMaXRlcmFsIG5vZGUpID0+CiAgICAgIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpOwoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRTdHJpbmdMaXRlcmFsKGlyLlN0cmluZ0xpdGVyYWwgbm9kZSkgPT4KICAgICAgY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmNvbnN0YW50KCk7CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEludExpdGVyYWwoaXIuSW50TGl0ZXJhbCBub2RlKSA9PgogICAgICBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkuY29uc3RhbnQoKTsKCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0RG91YmxlTGl0ZXJhbChpci5Eb3VibGVMaXRlcmFsIG5vZGUpID0+CiAgICAgIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpOwoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRTeW1ib2xMaXRlcmFsKGlyLlN5bWJvbExpdGVyYWwgbm9kZSkgPT4KICAgICAgY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmNvbnN0YW50KCk7CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEJvb2xMaXRlcmFsKGlyLkJvb2xMaXRlcmFsIG5vZGUpID0+CiAgICAgIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpOwoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKGlyLlN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgewogICAgdmlzaXROb2Rlcyhub2RlLmV4cHJlc3Npb25zKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0U3RhdGljR2V0KGlyLlN0YXRpY0dldCBub2RlKSB7CiAgICBpci5NZW1iZXIgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBpZiAodGFyZ2V0IGlzIGlyLkZpZWxkKSB7CiAgICAgIHJldHVybiB0YXJnZXQuaXNDb25zdAogICAgICAgICAgPyBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkuY29uc3RhbnQoKQogICAgICAgICAgOiBuZXcgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmVhZ2VyKGZpZWxkczogPGlyLkZpZWxkPnt0YXJnZXR9KTsKICAgIH0gZWxzZSBpZiAodGFyZ2V0IGlzIGlyLlByb2NlZHVyZSAmJgogICAgICAgIHRhcmdldC5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuTWV0aG9kKSB7CiAgICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkuY29uc3RhbnQoKTsKICAgIH0KICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0U3RhdGljU2V0KGlyLlN0YXRpY1NldCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFN0YXRpY0ludm9jYXRpb24oaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZS5hcmd1bWVudHMudHlwZXMuaXNOb3RFbXB0eSkgewogICAgICBWYXJpYWJsZVVzZSB1c2FnZTsKICAgICAgaWYgKG5vZGUudGFyZ2V0LmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5GYWN0b3J5KSB7CiAgICAgICAgdXNhZ2UgPSBuZXcgVmFyaWFibGVVc2UuY29uc3RydWN0b3JUeXBlQXJndW1lbnQobm9kZS50YXJnZXQpOwogICAgICB9IGVsc2UgewogICAgICAgIHVzYWdlID0gbmV3IFZhcmlhYmxlVXNlLnN0YXRpY1R5cGVBcmd1bWVudChub2RlLnRhcmdldCk7CiAgICAgIH0KCiAgICAgIHZpc2l0Tm9kZXNJbkNvbnRleHQobm9kZS5hcmd1bWVudHMudHlwZXMsIHVzYWdlKTsKICAgIH0KICAgIHZpc2l0Tm9kZXMobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbCk7CiAgICB2aXNpdE5vZGVzKG5vZGUuYXJndW1lbnRzLm5hbWVkKTsKICAgIHJldHVybiBub2RlLmlzQ29uc3QKICAgICAgICA/IGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5jb25zdGFudCgpCiAgICAgICAgOiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICBpci5Db25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUuYXJndW1lbnRzLnR5cGVzLmlzTm90RW1wdHkpIHsKICAgICAgdmlzaXROb2Rlc0luQ29udGV4dChub2RlLmFyZ3VtZW50cy50eXBlcywKICAgICAgICAgIG5ldyBWYXJpYWJsZVVzZS5jb25zdHJ1Y3RvclR5cGVBcmd1bWVudChub2RlLnRhcmdldCkpOwogICAgfQogICAgdmlzaXROb2Rlcyhub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsKTsKICAgIHZpc2l0Tm9kZXMobm9kZS5hcmd1bWVudHMubmFtZWQpOwogICAgcmV0dXJuIG5vZGUuaXNDb25zdAogICAgICAgID8gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmNvbnN0YW50KCkKICAgICAgICA6IGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgIGlyLkNvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBJbml0aWFsaXplckNvbXBsZXhpdHkgY29tcGxleGl0eSA9IHZpc2l0Tm9kZShub2RlLmNvbmRpdGlvbik7CiAgICBjb21wbGV4aXR5ID0gY29tcGxleGl0eS5jb21iaW5lKHZpc2l0Tm9kZShub2RlLnRoZW4pKTsKICAgIHJldHVybiBjb21wbGV4aXR5LmNvbWJpbmUodmlzaXROb2RlKG5vZGUub3RoZXJ3aXNlKSk7CiAgICAvLyBEb24ndCB2aXNpdCBgbm9kZS5zdGF0aWNUeXBlYC4KICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdE1ldGhvZEludm9jYXRpb24oaXIuTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBpci5UcmVlTm9kZSByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CiAgICB2aXNpdE5vZGUocmVjZWl2ZXIpOwogICAgaWYgKG5vZGUuYXJndW1lbnRzLnR5cGVzLmlzTm90RW1wdHkpIHsKICAgICAgVmFyaWFibGVVc2UgdXNhZ2U7CiAgICAgIGlmIChyZWNlaXZlciBpcyBpci5WYXJpYWJsZUdldCAmJgogICAgICAgICAgKHJlY2VpdmVyLnZhcmlhYmxlLnBhcmVudCBpcyBpci5Mb2NhbEZ1bmN0aW9uKSkgewogICAgICAgIHVzYWdlID0KICAgICAgICAgICAgbmV3IFZhcmlhYmxlVXNlLmxvY2FsVHlwZUFyZ3VtZW50KHJlY2VpdmVyLnZhcmlhYmxlLnBhcmVudCwgbm9kZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdXNhZ2UgPSBuZXcgVmFyaWFibGVVc2UuaW5zdGFuY2VUeXBlQXJndW1lbnQobm9kZSk7CiAgICAgIH0KICAgICAgdmlzaXROb2Rlc0luQ29udGV4dChub2RlLmFyZ3VtZW50cy50eXBlcywgdXNhZ2UpOwogICAgfQogICAgdmlzaXROb2Rlcyhub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsKTsKICAgIHZpc2l0Tm9kZXMobm9kZS5hcmd1bWVudHMubmFtZWQpOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVjb2duaXplIGNvbnN0YW50IG9wZXJhdGlvbnMuCiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFByb3BlcnR5R2V0KGlyLlByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLnJlY2VpdmVyKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0UHJvcGVydHlTZXQoaXIuUHJvcGVydHlTZXQgbm9kZSkgewogICAgdmlzaXROb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgdmlzaXROb2RlKG5vZGUudmFsdWUpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXREaXJlY3RQcm9wZXJ0eUdldChpci5EaXJlY3RQcm9wZXJ0eUdldCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5yZWNlaXZlcik7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdERpcmVjdFByb3BlcnR5U2V0KGlyLkRpcmVjdFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLnJlY2VpdmVyKTsKICAgIHZpc2l0Tm9kZShub2RlLnZhbHVlKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0Tm90KGlyLk5vdCBub2RlKSB7CiAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUub3BlcmFuZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihpci5Mb2dpY2FsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBJbml0aWFsaXplckNvbXBsZXhpdHkgY29tcGxleGl0eSA9IHZpc2l0Tm9kZShub2RlLmxlZnQpOwogICAgcmV0dXJuIGNvbXBsZXhpdHkuY29tYmluZSh2aXNpdE5vZGUobm9kZS5yaWdodCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0TGV0KGlyLkxldCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS52YXJpYWJsZSk7CiAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0QmxvY2tFeHByZXNzaW9uKGlyLkJsb2NrRXhwcmVzc2lvbiBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICAgIHZpc2l0Tm9kZShub2RlLnZhbHVlKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0Q2F0Y2goaXIuQ2F0Y2ggbm9kZSkgewogICAgdmlzaXRJbkNvbnRleHQobm9kZS5ndWFyZCwgVmFyaWFibGVVc2UuZXhwbGljaXQpOwogICAgdmlzaXROb2RlKG5vZGUuZXhjZXB0aW9uKTsKICAgIHZpc2l0Tm9kZShub2RlLnN0YWNrVHJhY2UpOwogICAgdmlzaXRJblZhcmlhYmxlU2NvcGUobm9kZSwgKCkgewogICAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICAgIH0pOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRJbnN0YW50aWF0aW9uKGlyLkluc3RhbnRpYXRpb24gbm9kZSkgewogICAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IGNvbXBsZXhpdHkgPSB2aXNpdE5vZGVzSW5Db250ZXh0KAogICAgICAgIG5vZGUudHlwZUFyZ3VtZW50cywgbmV3IFZhcmlhYmxlVXNlLmluc3RhbnRpYXRpb25UeXBlQXJndW1lbnQobm9kZSkpOwogICAgcmV0dXJuIGNvbXBsZXhpdHkuY29tYmluZSh2aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRUaHJvdyhpci5UaHJvdyBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0UmV0aHJvdyhpci5SZXRocm93IG5vZGUpID0+CiAgICAgIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEJsb2NrKGlyLkJsb2NrIG5vZGUpIHsKICAgIHZpc2l0Tm9kZXMobm9kZS5zdGF0ZW1lbnRzKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0QXNzZXJ0U3RhdGVtZW50KGlyLkFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdEluVmFyaWFibGVTY29wZShub2RlLCAoKSB7CiAgICAgIHZpc2l0Tm9kZShub2RlLmNvbmRpdGlvbik7CiAgICAgIHZpc2l0Tm9kZShub2RlLm1lc3NhZ2UpOwogICAgfSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFJldHVyblN0YXRlbWVudChpci5SZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogICAgdmlzaXROb2RlKG5vZGUuZXhwcmVzc2lvbik7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEVtcHR5U3RhdGVtZW50KGlyLkVtcHR5U3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChpci5FeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoaXIuU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgdmlzaXRJblZhcmlhYmxlU2NvcGUobm9kZSwgKCkgewogICAgICB2aXNpdE5vZGVzKG5vZGUuY2FzZXMpOwogICAgfSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFN3aXRjaENhc2UoaXIuU3dpdGNoQ2FzZSBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5ib2R5KTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQoCiAgICAgIGlyLkNvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIHJlZ2lzdGVyQ29udGludWVTd2l0Y2goKTsKICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkubGF6eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5IHZpc2l0QnJlYWtTdGF0ZW1lbnQoaXIuQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRMYWJlbGVkU3RhdGVtZW50KGlyLkxhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgdmlzaXROb2RlKG5vZGUuYm9keSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdEZpZWxkSW5pdGlhbGl6ZXIoaXIuRmllbGRJbml0aWFsaXplciBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS52YWx1ZSk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdExvY2FsSW5pdGlhbGl6ZXIoaXIuTG9jYWxJbml0aWFsaXplciBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS52YXJpYWJsZS5pbml0aWFsaXplcik7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFN1cGVySW5pdGlhbGl6ZXIoaXIuU3VwZXJJbml0aWFsaXplciBub2RlKSB7CiAgICBpZiAobm9kZS5hcmd1bWVudHMudHlwZXMuaXNOb3RFbXB0eSkgewogICAgICB2aXNpdE5vZGVzSW5Db250ZXh0KG5vZGUuYXJndW1lbnRzLnR5cGVzLAogICAgICAgICAgbmV3IFZhcmlhYmxlVXNlLmNvbnN0cnVjdG9yVHlwZUFyZ3VtZW50KG5vZGUudGFyZ2V0KSk7CiAgICB9CiAgICB2aXNpdE5vZGVzKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwpOwogICAgdmlzaXROb2Rlcyhub2RlLmFyZ3VtZW50cy5uYW1lZCk7CiAgICByZXR1cm4gY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKTsKICB9CgogIEBvdmVycmlkZQogIEluaXRpYWxpemVyQ29tcGxleGl0eSB2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoCiAgICAgIGlyLlJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgaWYgKG5vZGUuYXJndW1lbnRzLnR5cGVzLmlzTm90RW1wdHkpIHsKICAgICAgdmlzaXROb2Rlc0luQ29udGV4dChub2RlLmFyZ3VtZW50cy50eXBlcywKICAgICAgICAgIG5ldyBWYXJpYWJsZVVzZS5jb25zdHJ1Y3RvclR5cGVBcmd1bWVudChub2RlLnRhcmdldCkpOwogICAgfQogICAgdmlzaXROb2Rlcyhub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsKTsKICAgIHZpc2l0Tm9kZXMobm9kZS5hcmd1bWVudHMubmFtZWQpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRBc3NlcnRJbml0aWFsaXplcihpci5Bc3NlcnRJbml0aWFsaXplciBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5zdGF0ZW1lbnQpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRJZlN0YXRlbWVudChpci5JZlN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdE5vZGUobm9kZS5jb25kaXRpb24pOwogICAgdmlzaXROb2RlKG5vZGUudGhlbik7CiAgICB2aXNpdE5vZGUobm9kZS5vdGhlcndpc2UpOwogICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplckNvbXBsZXhpdHkgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oaXIuQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmNvbnN0YW50IGlzIGlyLlVuZXZhbHVhdGVkQ29uc3RhbnQpIHsKICAgICAgbm9kZS5jb25zdGFudCA9IF9jb25zdGFudEV2YWx1YXRvci5ldmFsdWF0ZShub2RlKTsKICAgIH0KICAgIHJldHVybiBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkuY29uc3RhbnQoKTsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaXMgYSBmaWVsZCwgb3IgYSBjb25zdHJ1Y3RvciAoZmFjdG9yeSBvcgogIC8vLyBnZW5lcmF0aXZlKS4KICBib29sIF9pc0ZpZWxkT3JDb25zdHJ1Y3Rvcihpci5Ob2RlIG5vZGUpID0+CiAgICAgIG5vZGUgaXMgaXIuQ29uc3RydWN0b3IgfHwKICAgICAgbm9kZSBpcyBpci5GaWVsZCB8fAogICAgICAobm9kZSBpcyBpci5Qcm9jZWR1cmUgJiYgbm9kZS5pc0ZhY3RvcnkpOwoKICB2b2lkIF9hbmFseXplVHlwZVZhcmlhYmxlKGlyLlR5cGVQYXJhbWV0ZXJUeXBlIHR5cGUsIFZhcmlhYmxlVXNlIHVzYWdlKSB7CiAgICBhc3NlcnQodXNhZ2UgIT0gbnVsbCk7CiAgICBpZiAoX291dGVybW9zdE5vZGUgaXMgaXIuTWVtYmVyKSB7CiAgICAgIFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCB0eXBlVmFyaWFibGUgPQogICAgICAgICAgbmV3IFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCh0eXBlLCBfb3V0ZXJtb3N0Tm9kZSk7CiAgICAgIHN3aXRjaCAodHlwZVZhcmlhYmxlLmtpbmQpIHsKICAgICAgICBjYXNlIFR5cGVWYXJpYWJsZUtpbmQuY2xzOgogICAgICAgICAgaWYgKF9pc0ZpZWxkT3JDb25zdHJ1Y3Rvcihfb3V0ZXJtb3N0Tm9kZSkpIHsKICAgICAgICAgICAgLy8gQ2xhc3MgdHlwZSB2YXJpYWJsZSB1c2VkIGluIGEgZmllbGQgb3IgY29uc3RydWN0b3IuCiAgICAgICAgICAgIF91c2VUeXBlVmFyaWFibGVBc0xvY2FsKHR5cGVWYXJpYWJsZSwgdXNhZ2UpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gQ2xhc3MgdHlwZSB2YXJpYWJsZSB1c2VkIGluIGEgbWV0aG9kLgogICAgICAgICAgICBfcmVnaXN0ZXJOZWVkc1RoaXModXNhZ2UpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUeXBlVmFyaWFibGVLaW5kLm1ldGhvZDoKICAgICAgICBjYXNlIFR5cGVWYXJpYWJsZUtpbmQubG9jYWw6CiAgICAgICAgICBfdXNlVHlwZVZhcmlhYmxlQXNMb2NhbCh0eXBlVmFyaWFibGUsIHVzYWdlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVHlwZVZhcmlhYmxlS2luZC5mdW5jdGlvbjoKICAgICAgICAvLyBUaGUgdHlwZSB2YXJpYWJsZSBpcyBhIGZ1bmN0aW9uIHR5cGUgdmFyaWFibGUsIGxpa2UgYFRgIGluCiAgICAgICAgLy8KICAgICAgICAvLyAgICAgTGlzdDx2b2lkIEZ1bmN0aW9uPFQ+KFQpPiBsaXN0OwogICAgICAgIC8vCiAgICAgICAgLy8gd2hpY2ggZG9lc24ndCBjb3JyZXNwb25kIHRvIGEgY2FwdHVyZWQgbG9jYWwgdmFyaWFibGUuCiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBJZiBbb25seUZvclJ0aUNoZWNrc10gaXMgdHJ1ZSwgdGhlIHZhcmlhYmxlIHdpbGwgYmUgYWRkZWQgdG8gYSBsaXN0CiAgLy8vIGluZGljYXRpbmcgaXQgKm1heSogYmUgdXNlZCBvbmx5IGlmIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBpcyBjaGVja2VkLgogIHZvaWQgX3VzZVR5cGVWYXJpYWJsZUFzTG9jYWwoCiAgICAgIFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dCB0eXBlVmFyaWFibGUsIFZhcmlhYmxlVXNlIHVzYWdlKSB7CiAgICBfbWFya1ZhcmlhYmxlQXNVc2VkKHR5cGVWYXJpYWJsZSwgdXNhZ2UpOwogIH0KfQoKZW51bSBDb21wbGV4aXR5TGV2ZWwgewogIGNvbnN0YW50LAogIHBvdGVudGlhbGx5RWFnZXIsCiAgZGVmaW5pdGVseUxhenksCn0KCmNsYXNzIEluaXRpYWxpemVyQ29tcGxleGl0eSB7CiAgZmluYWwgQ29tcGxleGl0eUxldmVsIGxldmVsOwogIGZpbmFsIFNldDxpci5GaWVsZD4gZmllbGRzOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGlzIHNob3VsZCBob2xkIHRoZSBjb25zdGFudCBsaXRlcmFsIGZyb20gQ0ZFIHdoZW4KICAvLyBwcm92aWRlZC4KICBjb25zdCBJbml0aWFsaXplckNvbXBsZXhpdHkuY29uc3RhbnQoKQogICAgICA6IGxldmVsID0gQ29tcGxleGl0eUxldmVsLmNvbnN0YW50LAogICAgICAgIGZpZWxkcyA9IG51bGw7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSB0aGlzIHRvIGNvbGxlY3QgZGF0YSBvbiB0aGUgc2l6ZSBvZiB0aGUKICAvLyAgaW5pdGlhbGl6ZXIuCiAgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmVhZ2VyKHt0aGlzLmZpZWxkc30pCiAgICAgIDogbGV2ZWwgPSBDb21wbGV4aXR5TGV2ZWwucG90ZW50aWFsbHlFYWdlcjsKCiAgY29uc3QgSW5pdGlhbGl6ZXJDb21wbGV4aXR5LmxhenkoKQogICAgICA6IGxldmVsID0gQ29tcGxleGl0eUxldmVsLmRlZmluaXRlbHlMYXp5LAogICAgICAgIGZpZWxkcyA9IG51bGw7CgogIEluaXRpYWxpemVyQ29tcGxleGl0eSBjb21iaW5lKEluaXRpYWxpemVyQ29tcGxleGl0eSBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgaWYgKGlzTGF6eSB8fCBvdGhlci5pc0xhenkpIHsKICAgICAgcmV0dXJuIGNvbnN0IEluaXRpYWxpemVyQ29tcGxleGl0eS5sYXp5KCk7CiAgICB9IGVsc2UgaWYgKGlzRWFnZXIgfHwgb3RoZXIuaXNFYWdlcikgewogICAgICBpZiAoZmllbGRzICE9IG51bGwgJiYgb3RoZXIuZmllbGRzICE9IG51bGwpIHsKICAgICAgICBmaWVsZHMuYWRkQWxsKG90aGVyLmZpZWxkcyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0gZWxzZSBpZiAoZmllbGRzICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gb3RoZXI7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaXNDb25zdGFudCAmJiBvdGhlci5pc0NvbnN0YW50KSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoaXMgaXMgY2FzZSBkb2Vzbid0IHdvcmsgaWYgSW5pdGlhbGl6ZXJDb21wbGV4aXR5CiAgICAgIC8vIG9iamVjdHMgb2YgY29uc3RhbnQgY29tcGxleGl0eSBob2xkIHRoZSBjb25zdGFudCBsaXRlcmFsLgogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSBpZiAoaXNFYWdlcikgewogICAgICBhc3NlcnQob3RoZXIuaXNDb25zdGFudCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGlzQ29uc3RhbnQpOwogICAgICBhc3NlcnQob3RoZXIuaXNFYWdlcik7CiAgICAgIHJldHVybiBvdGhlcjsKICAgIH0KICB9CgogIEluaXRpYWxpemVyQ29tcGxleGl0eSBtYWtlRWFnZXIoKSB7CiAgICBpZiAoaXNMYXp5IHx8IGlzRWFnZXIpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IEluaXRpYWxpemVyQ29tcGxleGl0eS5lYWdlcigpOwogICAgfQogIH0KCiAgYm9vbCBnZXQgaXNDb25zdGFudCA9PiBsZXZlbCA9PSBDb21wbGV4aXR5TGV2ZWwuY29uc3RhbnQ7CgogIGJvb2wgZ2V0IGlzRWFnZXIgPT4gbGV2ZWwgPT0gQ29tcGxleGl0eUxldmVsLnBvdGVudGlhbGx5RWFnZXI7CgogIGJvb2wgZ2V0IGlzTGF6eSA9PiBsZXZlbCA9PSBDb21wbGV4aXR5TGV2ZWwuZGVmaW5pdGVseUxhenk7CgogIC8vLyBSZXR1cm5zIGEgc2hvcnQgdGV4dHVhbCByZXByZXNlbnRhdGlvbiB1c2VkIGZvciB0ZXN0aW5nLgogIFN0cmluZyBnZXQgc2hvcnRUZXh0IHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHN3aXRjaCAobGV2ZWwpIHsKICAgICAgY2FzZSBDb21wbGV4aXR5TGV2ZWwuY29uc3RhbnQ6CiAgICAgICAgc2Iud3JpdGUoJ2NvbnN0YW50Jyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29tcGxleGl0eUxldmVsLnBvdGVudGlhbGx5RWFnZXI6CiAgICAgICAgc2Iud3JpdGUoJ2VhZ2VyJyk7CiAgICAgICAgaWYgKGZpZWxkcyAhPSBudWxsKSB7CiAgICAgICAgICBzYi53cml0ZSgnJmZpZWxkcz1bJyk7CiAgICAgICAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSBmaWVsZHMubWFwKChmKSA9PiBmLm5hbWUubmFtZSkudG9MaXN0KCkuLnNvcnQoKTsKICAgICAgICAgIHNiLndyaXRlKG5hbWVzLmpvaW4oJywnKSk7CiAgICAgICAgICBzYi53cml0ZSgnXScpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb21wbGV4aXR5TGV2ZWwuZGVmaW5pdGVseUxhenk6CiAgICAgICAgc2Iud3JpdGUoJ2xhenknKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCBjb21wbGV4aXR5IGxldmVsICRsZXZlbCIpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBAb3ZlcnJp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bW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKCi8vLyBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBbbm9kZV0gdGhhdCBpbmNsdWRlIHRoZSBydW50aW1lIHR5cGUgYW5kCi8vLyBoYXNoIGNvZGUgb2YgdGhlIG5vZGUgYW5kIGEgb25lIGxpbmUgcHJlZml4IG9mIHRoZSBub2RlIHRvU3RyaW5nIHRleHQuClN0cmluZyBub2RlVG9EZWJ1Z1N0cmluZyhpci5Ob2RlIG5vZGUsIFtpbnQgdGV4dExlbmd0aCA9IDQwXSkgewogIFN0cmluZyBibG9ja1RleHQgPSBub2RlLnRvU3RyaW5nKCkucmVwbGFjZUFsbCgnXG4nLCAnICcpOwogIGlmIChibG9ja1RleHQubGVuZ3RoID4gdGV4dExlbmd0aCkgewogICAgYmxvY2tUZXh0ID0gYmxvY2tUZXh0LnN1YnN0cmluZygwLCB0ZXh0TGVuZ3RoIC0gMykgKyAnLi4uJzsKICB9CiAgcmV0dXJuICcoJHtub2RlLnJ1bnRpbWVUeXBlfToke25vZGUuaGFzaENvZGV9KSR7YmxvY2tUZXh0fSc7Cn0KCi8vLyBDb21wYXJhdG9yIGZvciB0aGUgY2Fub25pY2FsIG9yZGVyIG9yIG5hbWVkIHBhcmFtZXRlcnMuCi8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHdoZW4gbmFtZWQgcGFyYW1ldGVycyBhcmUgc29ydGVkIGluIGRpbGwuCmludCBuYW1lZE9yZGVyaW5nKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gYSwgaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBiKSB7CiAgcmV0dXJuIGEubmFtZS5jb21wYXJlVG8oYi5uYW1lKTsKfQoKLy8vIENvbXBhcmF0b3IgZm9yIHRoZSBkZWNsYXJhdGlvbiBvcmRlciBvZiBwYXJhbWV0ZXJzLgppbnQgbmF0aXZlT3JkZXJpbmcoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBhLCBpci5WYXJpYWJsZURlY2xhcmF0aW9uIGIpIHsKICByZXR1cm4gYS5maWxlT2Zmc2V0LmNvbXBhcmVUbyhiLmZpbGVPZmZzZXQpOwp9CgpTb3VyY2VTcGFuIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKGlyLlRyZWVOb2RlIG5vZGUpIHsKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgW2lyLkxvY2F0aW9uXSBkaXJlY3RseSBhcyBhIFtTb3VyY2VTcGFuXS4KICBVcmkgdXJpOwogIGludCBvZmZzZXQ7CiAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewogICAgaWYgKG5vZGUuZmlsZU9mZnNldCAhPSBpci5UcmVlTm9kZS5ub09mZnNldCkgewogICAgICBvZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICAgIC8vIEBwYXRjaCBhbm5vdGF0aW9ucyBoYXZlIG5vIGxvY2F0aW9uLgogICAgICB1cmkgPSBub2RlLmxvY2F0aW9uPy5maWxlOwogICAgICBicmVhazsKICAgIH0KICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICB9CiAgaWYgKHVyaSAhPSBudWxsKSB7CiAgICByZXR1cm4gbmV3IFNvdXJjZVNwYW4odXJpLCBvZmZzZXQsIG9mZnNldCArIDEpOwogIH0KICByZXR1cm4gbnVsbDsKfQoKLy8vIFJldHVybnMgdGhlIGBBc3luY01hcmtlcmAgY29ycmVzcG9uZGluZyB0byBgbm9kZS5hc3luY01hcmtlcmAuCkFzeW5jTWFya2VyIGdldEFzeW5jTWFya2VyKGlyLkZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgc3dpdGNoIChub2RlLmFzeW5jTWFya2VyKSB7CiAgICBjYXNlIGlyLkFzeW5jTWFya2VyLkFzeW5jOgogICAgICByZXR1cm4gQXN5bmNNYXJrZXIuQVNZTkM7CiAgICBjYXNlIGlyLkFzeW5jTWFya2VyLkFzeW5jU3RhcjoKICAgICAgcmV0dXJuIEFzeW5jTWFya2VyLkFTWU5DX1NUQVI7CiAgICBjYXNlIGlyLkFzeW5jTWFya2VyLlN5bmM6CiAgICAgIHJldHVybiBBc3luY01hcmtlci5TWU5DOwogICAgY2FzZSBpci5Bc3luY01hcmtlci5TeW5jU3RhcjoKICAgICAgcmV0dXJuIEFzeW5jTWFya2VyLlNZTkNfU1RBUjsKICAgIGNhc2UgaXIuQXN5bmNNYXJrZXIuU3luY1lpZWxkaW5nOgogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiQXN5bmMgbWFya2VyICR7bm9kZS5hc3luY01hcmtlcn0gaXMgbm90IHN1cHBvcnRlZC4iKTsKICB9Cn0KCi8vLyBLZXJuZWwgZW5jb2RlcyBhIG51bGwtYXdhcmUgZXhwcmVzc2lvbiBgYT8uYmAgYXMKLy8vCi8vLyAgICAgbGV0IGZpbmFsICMxID0gYSBpbiAjMSA9PSBudWxsID8gbnVsbCA6ICMxLmIKLy8vCi8vLyBbZ2V0TnVsbEF3YXJlRXhwcmVzc2lvbl0gcmVjb2duaXplcyBzdWNoIGV4cHJlc3Npb25zIHN0b3JpbmcgdGhlIHJlc3VsdCBpbgovLy8gYSBbTnVsbEF3YXJlRXhwcmVzc2lvbl0gb2JqZWN0LgovLy8KLy8vIFtzeW50aGV0aWNWYXJpYWJsZV0gaG9sZHMgdGhlIHN5bnRoZXNpemVkIGAjMWAgdmFyaWFibGUuIFtleHByZXNzaW9uXSBob2xkcwovLy8gdGhlIGAjMS5iYCBleHByZXNzaW9uLiBbcmVjZWl2ZXJdIHJldHVybnMgYGFgIGV4cHJlc3Npb24uIFtwYXJlbnRdIHJldHVybnMKLy8vIHRoZSBwYXJlbnQgb2YgdGhlIGxldCBub2RlLCBpLmUuIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgb3JpZ2luYWwgbnVsbC1hd2FyZQovLy8gZXhwcmVzc2lvbi4gW2xldF0gcmV0dXJucyB0aGUgbGV0IG5vZGUgY3JlYXRlZCBmb3IgdGhlIGVuY29kaW5nLgpjbGFzcyBOdWxsQXdhcmVFeHByZXNzaW9uIHsKICBmaW5hbCBpci5WYXJpYWJsZURlY2xhcmF0aW9uIHN5bnRoZXRpY1ZhcmlhYmxlOwogIGZpbmFsIGlyLkV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgTnVsbEF3YXJlRXhwcmVzc2lvbih0aGlzLnN5bnRoZXRpY1ZhcmlhYmxlLCB0aGlzLmV4cHJlc3Npb24pOwoKICBpci5FeHByZXNzaW9uIGdldCByZWNlaXZlciA9PiBzeW50aGV0aWNWYXJpYWJsZS5pbml0aWFsaXplcjsKCiAgaXIuVHJlZU5vZGUgZ2V0IHBhcmVudCA9PiBzeW50aGV0aWNWYXJpYWJsZS5wYXJlbnQucGFyZW50OwoKICBpci5MZXQgZ2V0IGxldCA9PiBzeW50aGV0aWNWYXJpYWJsZS5wYXJlbnQ7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IGxldC50b1N0cmluZygpOwp9CgpOdWxsQXdhcmVFeHByZXNzaW9uIGdldE51bGxBd2FyZUV4cHJlc3Npb24oaXIuVHJlZU5vZGUgbm9kZSkgewogIGlmIChub2RlIGlzIGlyLkxldCkgewogICAgaXIuRXhwcmVzc2lvbiBib2R5ID0gbm9kZS5ib2R5OwogICAgaWYgKG5vZGUudmFyaWFibGUubmFtZSA9PSBudWxsICYmCiAgICAgICAgbm9kZS52YXJpYWJsZS5pc0ZpbmFsICYmCiAgICAgICAgYm9keSBpcyBpci5Db25kaXRpb25hbEV4cHJlc3Npb24gJiYKICAgICAgICBib2R5LmNvbmRpdGlvbiBpcyBpci5NZXRob2RJbnZvY2F0aW9uICYmCiAgICAgICAgYm9keS50aGVuIGlzIGlyLk51bGxMaXRlcmFsKSB7CiAgICAgIGlyLk1ldGhvZEludm9jYXRpb24gaW52b2NhdGlvbiA9IGJvZHkuY29uZGl0aW9uOwogICAgICBpci5FeHByZXNzaW9uIHJlY2VpdmVyID0gaW52b2NhdGlvbi5yZWNlaXZlcjsKICAgICAgaWYgKGludm9jYXRpb24ubmFtZS5uYW1lID09ICc9PScgJiYKICAgICAgICAgIHJlY2VpdmVyIGlzIGlyLlZhcmlhYmxlR2V0ICYmCiAgICAgICAgICByZWNlaXZlci52YXJpYWJsZSA9PSBub2RlLnZhcmlhYmxlICYmCiAgICAgICAgICBpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLnNpbmdsZSBpcyBpci5OdWxsTGl0ZXJhbCkgewogICAgICAgIC8vIFdlIGhhdmUKICAgICAgICAvLyAgIGxldCAjdDEgPSBlMCBpbiAjdDEgPT0gbnVsbCA/IG51bGwgOiBlMQogICAgICAgIHJldHVybiBuZXcgTnVsbEF3YXJlRXhwcmVzc2lvbihub2RlLnZhcmlhYmxlLCBib2R5Lm90aGVyd2lzZSk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KCi8vLyBDaGVjayB3aGV0aGVyIFtub2RlXSBpcyBpbW1lZGlhdGVseSBndWFyZGVkIGJ5IGEKLy8vIFtpci5DaGVja0xpYnJhcnlJc0xvYWRlZF0sIGFuZCBoZW5jZSB0aGUgbm9kZSBpcyBhIGRlZmVycmVkIGFjY2Vzcy4KaXIuTGlicmFyeURlcGVuZGVuY3kgZ2V0RGVmZXJyZWRJbXBvcnQoaXIuVHJlZU5vZGUgbm9kZSkgewogIC8vIE5vdGU6IHRoaXMgY29kZSByZWxpZXMgb24gdGhlIENGRSBnZW5lcmF0aW5nIHRoZSBjb2RlIGFzIHdlIGV4cGVjdCBpdCBoZXJlLgogIC8vIElmIG9uZSBkYXkgd2Ugb3B0aW1pemUgYXdheSByZWR1bmRhbnQgQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgaW5zdHJ1Y3Rpb25zLAogIC8vIHdlJ2QgbmVlZCB0byBkZXJpdmUgdGhpcyBpbmZvcm1hdGlvbiBkaXJlY3RseSBmcm9tIHRoZSBDRkUgKFNlZSAjMzUwMDUpLAogIGlyLlRyZWVOb2RlIHBhcmVudCA9IG5vZGUucGFyZW50OwoKICAvLyBUT0RPKHNpZ211bmQpOiByZW1vdmUgd2hlbiBDRkUgZ2VuZXJhdGVzIHRoZSBjb3JyZWN0IHRyZWUgKCMzNTMyMCkuIEZvcgogIC8vIGluc3RhbmNlLCBpdCBjdXJyZW50bHkgZ2VuZXJhdGVzCiAgLy8KICAvLyAgIGxldCBfID0gY2hlY2socHJlZml4KSBpbiAocHJlZml4OjpmaWVsZC5wcm9wZXJ0eSkKICAvLwogIC8vIGluc3RlYWQgb2Y6CiAgLy8KICAvLyAgIChsZXQgXyA9IGNoZWNrKHByZWZpeCkgaW4gcHJlZml4OjpmaWVsZCkucHJvcGVydHkKICBpZiAobm9kZSBpcyBpci5TdGF0aWNHZXQgfHwgbm9kZSBpcyBpci5Db25zdGFudEV4cHJlc3Npb24pIHsKICAgIHdoaWxlIChwYXJlbnQgaXMgaXIuUHJvcGVydHlHZXQgfHwgcGFyZW50IGlzIGlyLk1ldGhvZEludm9jYXRpb24pIHsKICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgIH0KICB9CgogIGlmIChwYXJlbnQgaXMgaXIuTGV0KSB7CiAgICB2YXIgaW5pdGlhbGl6ZXIgPSBwYXJlbnQudmFyaWFibGUuaW5pdGlhbGl6ZXI7CiAgICBpZiAoaW5pdGlhbGl6ZXIgaXMgaXIuQ2hlY2tMaWJyYXJ5SXNMb2FkZWQpIHsKICAgICAgcmV0dXJuIGluaXRpYWxpemVyLmltcG9ydDsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KCmNsYXNzIF9GcmVlVmFyaWFibGVWaXNpdG9yIGltcGxlbWVudHMgaXIuRGFydFR5cGVWaXNpdG9yPGJvb2w+IHsKICBjb25zdCBfRnJlZVZhcmlhYmxlVmlzaXRvcigpOwoKICBib29sIHZpc2l0KGlyLkRhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlICE9IG51bGwpIHJldHVybiB0eXBlLmFjY2VwdCh0aGlzKTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGJvb2wgdmlzaXRMaXN0KExpc3Q8aXIuRGFydFR5cGU+IHR5cGVzKSB7CiAgICBmb3IgKGlyLkRhcnRUeXBlIHR5cGUgaW4gdHlwZXMpIHsKICAgICAgaWYgKHZpc2l0KHR5cGUpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRUeXBlZGVmVHlwZShpci5UeXBlZGVmVHlwZSBub2RlKSB7CiAgICByZXR1cm4gdmlzaXRMaXN0KG5vZGUudHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoaXIuVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlKGlyLkZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBpZiAodmlzaXQobm9kZS5yZXR1cm5UeXBlKSkgcmV0dXJuIHRydWU7CiAgICBpZiAodmlzaXRMaXN0KG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMpKSByZXR1cm4gdHJ1ZTsKICAgIGZvciAoaXIuTmFtZWRUeXBlIG5hbWVkVHlwZSBpbiBub2RlLm5hbWVkUGFyYW1ldGVycykgewogICAgICBpZiAodmlzaXQobmFtZWRUeXBlLnR5cGUpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcmZhY2VUeXBlKGlyLkludGVyZmFjZVR5cGUgbm9kZSkgewogICAgcmV0dXJuIHZpc2l0TGlzdChub2RlLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEJvdHRvbVR5cGUoaXIuQm90dG9tVHlwZSBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFZvaWRUeXBlKGlyLlZvaWRUeXBlIG5vZGUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RHluYW1pY1R5cGUoaXIuRHluYW1pY1R5cGUgbm9kZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnZhbGlkVHlwZShpci5JbnZhbGlkVHlwZSBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBkZWZhdWx0RGFydFR5cGUoaXIuRGFydFR5cGUgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkZyZWVWYXJpYWJsZVZpc2l0b3IuZGVmYXVsdFR5cGVOb2RlIik7CiAgfQp9CgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW3R5cGVdIGNvbnRhaW5zIGEgdHlwZSB2YXJpYWJsZS4KLy8vCi8vLyBBbGwgdHlwZSB2YXJpYWJsZXMgKGNsYXNzIHR5cGUgdmFyaWFibGVzLCBnZW5lcmljIG1ldGhvZCB0eXBlIHZhcmlhYmxlcywKLy8vIGFuZCBmdW5jdGlvbiB0eXBlIHZhcmlhYmxlcykgYXJlIGNvbnNpZGVyZWQuCmJvb2wgY29udGFpbnNGcmVlVmFyaWFibGVzKGlyLkRhcnRUeXBlIHR5cGUpID0+CiAgICB0eXBlLmFjY2VwdChjb25zdCBfRnJlZVZhcmlhYmxlVmlzaXRvcigpKTsKgNkATk48ASg0LzUBGSQBUUtAPCdABD8CATxOSCMCAThJLwIBPUgLDhkzIC4hDQYYBBU0BA8CAUMzHh8gIyUeHyIkJg0iQQQCATUENQRPJARQT1BFHDIiAUABPwE9AS4BDCcCAT8YJCYhLDEnNzQqKDBGEzVHCAYEDwIBNUg7UU5OJAFNJgU5BREFOT9IHgYEARozMiEGBA8CAUEgASEwEgQBLCYkBhIEAQwvKgQBDDsRBAEMMS07Oy4GEgQBDDMqBAEMNQEMMQEMNwEMNwEMK0cEAgE3BE0xMC8BIXBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL3V0aWwuZGFydDdzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pci9zdGF0aWNfdHlwZV9jYWNoZS5kYXJ0h34vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL3NlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbi5kYXJ0JzsKCmNsYXNzIFN0YXRpY1R5cGVDYWNoZSB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyB0YWcgPSAnc3RhdGljLXR5cGUtY2FjaGUnOwoKICBmaW5hbCBNYXA8aXIuRXhwcmVzc2lvbiwgaXIuRGFydFR5cGU+IF9leHByZXNzaW9uVHlwZXM7CiAgZmluYWwgTWFwPGlyLkZvckluU3RhdGVtZW50LCBpci5EYXJ0VHlwZT4gX2ZvckluSXRlcmF0b3JUeXBlczsKCiAgY29uc3QgU3RhdGljVHlwZUNhY2hlKAogICAgICBbdGhpcy5fZXhwcmVzc2lvblR5cGVzID0gY29uc3Qge30sIHRoaXMuX2ZvckluSXRlcmF0b3JUeXBlc10pOwoKICBmYWN0b3J5IFN0YXRpY1R5cGVDYWNoZS5yZWFkRnJvbURhdGFTb3VyY2UoCiAgICAgIERhdGFTb3VyY2Ugc291cmNlLCBpci5NZW1iZXIgY29udGV4dCkgewogICAgcmV0dXJuIHNvdXJjZS5pbk1lbWJlckNvbnRleHQoY29udGV4dCwgKCkgewogICAgICBzb3VyY2UuYmVnaW4odGFnKTsKICAgICAgTWFwPGlyLkV4cHJlc3Npb24sIGlyLkRhcnRUeXBlPiBleHByZXNzaW9uVHlwZXMgPQogICAgICAgICAgc291cmNlLnJlYWRUcmVlTm9kZU1hcEluQ29udGV4dChzb3VyY2UucmVhZERhcnRUeXBlTm9kZSk7CiAgICAgIE1hcDxpci5Gb3JJblN0YXRlbWVudCwgaXIuRGFydFR5cGU+IGZvckluSXRlcmF0b3JUeXBlcyA9IHNvdXJjZQogICAgICAgICAgLnJlYWRUcmVlTm9kZU1hcEluQ29udGV4dChzb3VyY2UucmVhZERhcnRUeXBlTm9kZSwgZW1wdHlBc051bGw6IHRydWUpOwogICAgICBzb3VyY2UuZW5kKHRhZyk7CiAgICAgIHJldHVybiBuZXcgU3RhdGljVHlwZUNhY2hlKGV4cHJlc3Npb25UeXBlcywgZm9ySW5JdGVyYXRvclR5cGVzKTsKICAgIH0pOwogIH0KCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaywgaXIuTWVtYmVyIGNvbnRleHQpIHsKICAgIHNpbmsuaW5NZW1iZXJDb250ZXh0KGNvbnRleHQsICgpIHsKICAgICAgc2luay5iZWdpbih0YWcpOwogICAgICBzaW5rLndyaXRlVHJlZU5vZGVNYXBJbkNvbnRleHQoX2V4cHJlc3Npb25UeXBlcywgc2luay53cml0ZURhcnRUeXBlTm9kZSk7CiAgICAgIHNpbmsud3JpdGVUcmVlTm9kZU1hcEluQ29udGV4dCgKICAgICAgICAgIF9mb3JJbkl0ZXJhdG9yVHlwZXMsIHNpbmsud3JpdGVEYXJ0VHlwZU5vZGUsCiAgICAgICAgICBhbGxvd051bGw6IHRydWUpOwogICAgICBzaW5rLmVuZCh0YWcpOwogICAgfSk7CiAgfQoKICBpci5EYXJ0VHlwZSBvcGVyYXRvciBbXShpci5FeHByZXNzaW9uIG5vZGUpID0+IF9leHByZXNzaW9uVHlwZXNbbm9kZV07CgogIGlyLkRhcnRUeXBlIGdldEZvckluSXRlcmF0b3JUeXBlKGlyLkZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBfZm9ySW5JdGVyYXRvclR5cGVzICE9IG51bGwgPyBfZm9ySW5JdGVyYXRvclR5cGVzW25vZGVdIDogbnVsbDsKICB9Cn0KNQBOTjwBKDQvMTUBLgEYMQE6QQEZRQEuLjAZOERGURdHCAQBOycXUCY3HBUIBAFJAT1LBAIBLnBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL3N0YXRpY190eXBlX2NhY2hlLmRhcnQ8c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaW5mZXJyZXIvdHlwZV9ncmFwaF9ub2Rlcy5kYXJ0wAEUgC8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGNvbXBpbGVyLnNyYy5pbmZlcnJlci50eXBlX2dyYXBoX25vZGVzOwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nIHNob3cgSXRlcmFibGVCYXNlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JyBzaG93IElkZW50aWZpZXJzOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCcgc2hvdyBJbW11dGFibGVFbXB0eVNldCwgU2V0bGV0OwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwppbXBvcnQgJ2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICdkZWJ1Zy5kYXJ0JyBhcyBkZWJ1ZzsKaW1wb3J0ICdsb2NhbHNfaGFuZGxlci5kYXJ0JyBzaG93IEFyZ3VtZW50c1R5cGVzOwppbXBvcnQgJ2luZmVycmVyX2VuZ2luZS5kYXJ0JzsKaW1wb3J0ICd0eXBlX3N5c3RlbS5kYXJ0JzsKCi8vLyBDb21tb24gY2xhc3MgZm9yIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGguIFRoZSBjdXJyZW50IG5vZGVzIGFyZToKLy8vCi8vLyAtIENvbmNyZXRlIHR5cGVzCi8vLyAtIEVsZW1lbnRzCi8vLyAtIENhbGwgc2l0ZXMKLy8vIC0gTmFycm93aW5nIGluc3RydWN0aW9ucwovLy8gLSBQaGkgaW5zdHJ1Y3Rpb25zCi8vLyAtIENvbnRhaW5lcnMgKGZvciBsaXN0cykKLy8vIC0gVHlwZSBvZiB0aGUgZWxlbWVudCBpbiBhIGNvbnRhaW5lcgovLy8KLy8vIEEgbm9kZSBoYXMgYSBzZXQgb2YgYXNzaWdubWVudHMgYW5kIHVzZXJzLiBBc3NpZ25tZW50cyBhcmUgdXNlZCB0bwovLy8gY29tcHV0ZSB0aGUgdHlwZSBvZiB0aGUgbm9kZSAoW1R5cGVJbmZvcm1hdGlvbi5jb21wdXRlVHlwZV0pLiBVc2VycyBhcmUKLy8vIGFkZGVkIHRvIHRoZSBpbmZlcnJlcidzIHdvcmsgcXVldWUgd2hlbiB0aGUgdHlwZSBvZiB0aGUgbm9kZQovLy8gY2hhbmdlcy4KYWJzdHJhY3QgY2xhc3MgVHlwZUluZm9ybWF0aW9uIHsKICBTZXQ8VHlwZUluZm9ybWF0aW9uPiB1c2VyczsKICB2YXIgLyogTGlzdHxQYXJhbWV0ZXJBc3NpZ25tZW50cyAqLyBfYXNzaWdubWVudHM7CgogIC8vLyBUaGUgdHlwZSB0aGUgaW5mZXJyZXIgaGFzIGZvdW5kIGZvciB0aGlzIFtUeXBlSW5mb3JtYXRpb25dLgogIC8vLyBJbml0aWFsbHkgZW1wdHkuCiAgQWJzdHJhY3RWYWx1ZSB0eXBlOwoKICAvLy8gVGhlIGdyYXBoIG5vZGUgb2YgdGhlIG1lbWJlciB0aGlzIFtUeXBlSW5mb3JtYXRpb25dIG5vZGUgYmVsb25ncyB0by4KICBmaW5hbCBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dDsKCiAgLy8vIFRoZSBlbGVtZW50IHRoaXMgW1R5cGVJbmZvcm1hdGlvbl0gbm9kZSBiZWxvbmdzIHRvLgogIE1lbWJlckVudGl0eSBnZXQgY29udGV4dE1lbWJlciA9PiBjb250ZXh0ID09IG51bGwgPyBudWxsIDogY29udGV4dC5tZW1iZXI7CgogIEl0ZXJhYmxlPFR5cGVJbmZvcm1hdGlvbj4gZ2V0IGFzc2lnbm1lbnRzID0+IF9hc3NpZ25tZW50czsKCiAgLy8vIFdlIGFiYW5kb24gaW5mZXJlbmNlIGluIGNlcnRhaW4gY2FzZXMgKGNvbXBsZXggY3ljbGljIGZsb3csIG5hdGl2ZQogIC8vLyBiZWhhdmlvdXJzLCBldGMuKS4gSW4gc29tZSBjYXNlLCB3ZSBtaWdodCByZXN1bWUgaW5mZXJlbmNlIGluIHRoZQogIC8vLyBjbG9zdXJlIHRyYWNlciwgd2hpY2ggaXMgaGFuZGxlZCBieSBjaGVja2luZyB3aGV0aGVyIFthc3NpZ25tZW50c10gaGFzCiAgLy8vIGJlZW4gc2V0IHRvIFtTVE9QX1RSQUNLSU5HX0FTU0lHTk1FTlRTX01BUktFUl0uCiAgYm9vbCBhYmFuZG9uSW5mZXJlbmNpbmcgPSBmYWxzZTsKICBib29sIGdldCBtaWdodFJlc3VtZSA9PgogICAgICAhaWRlbnRpY2FsKGFzc2lnbm1lbnRzLCBTVE9QX1RSQUNLSU5HX0FTU0lHTk1FTlRTX01BUktFUik7CgogIC8vLyBOdW1iZXIgb2YgdGltZXMgdGhpcyBbVHlwZUluZm9ybWF0aW9uXSBoYXMgY2hhbmdlZCB0eXBlLgogIGludCByZWZpbmVDb3VudCA9IDA7CgogIC8vLyBXaGV0aGVyIHRoaXMgW1R5cGVJbmZvcm1hdGlvbl0gaXMgY3VycmVudGx5IGluIHRoZSBpbmZlcnJlcidzCiAgLy8vIHdvcmsgcXVldWUuCiAgYm9vbCBpblF1ZXVlID0gZmFsc2U7CgogIC8vLyBVc2VkIHRvIGRpc2FibGUgZW5xdWV1ZWluZyBvZiB0eXBlIGluZm9ybWF0aW9ucyB3aGVyZSB3ZSBrbm93IHRoYXQgdGhlaXIKICAvLy8gdHlwZSB3aWxsIG5vdCBjaGFuZ2UgZm9yIG90aGVyIHJlYXNvbnMgdGhhbiBiZWluZyBzdGFibGUuIEZvciBleGFtcGxlLAogIC8vLyBpZiBpbmZlcmVuY2UgaXMgZGlzYWJsZWQgZm9yIGEgdHlwZSBhbmQgaXQgaXMgaGFyZHdpcmVkIHRvIGR5bmFtaWMsIHRoaXMKICAvLy8gaXMgc2V0IHRvIHRydWUgdG8gc3BhcmUgcmVjb21wdXRpbmcgZHluYW1pYyBhZ2FpbiBhbmQgYWdhaW4uIENoYW5naW5nIHRoaXMKICAvLy8gdG8gZmFsc2Ugc2hvdWxkIG5ldmVyIGNoYW5nZSBpbmZlcmVuY2Ugb3V0Y29tZSwganVzdCBtYWtlIGlzIHNsb3dlci4KICBib29sIGRvTm90RW5xdWV1ZSA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0aGlzIFtUeXBlSW5mb3JtYXRpb25dIGhhcyBhIHN0YWJsZSBbdHlwZV0gdGhhdCB3aWxsIG5vdAogIC8vLyBjaGFuZ2UuCiAgYm9vbCBpc1N0YWJsZSA9IGZhbHNlOwoKICAvLyBUeXBlSW5mb3JtYXRpb25zIGFyZSB1bmlxdWUuIFN0b3JlIGFuIGFyYml0cmFyeSBpZGVudGl0eSBoYXNoIGNvZGUuCiAgc3RhdGljIGludCBfc3RhdGljSGFzaENvZGUgPSAwOwogIEBvdmVycmlkZQogIGZpbmFsIGludCBoYXNoQ29kZSA9IF9zdGF0aWNIYXNoQ29kZSA9IChfc3RhdGljSGFzaENvZGUgKyAxKS50b1Vuc2lnbmVkKDMwKTsKCiAgYm9vbCBnZXQgaXNDb25jcmV0ZSA9PiBmYWxzZTsKCiAgVHlwZUluZm9ybWF0aW9uKHRoaXMudHlwZSwgdGhpcy5jb250ZXh0KQogICAgICA6IF9hc3NpZ25tZW50cyA9IDxUeXBlSW5mb3JtYXRpb24+W10sCiAgICAgICAgdXNlcnMgPSBuZXcgU2V0bGV0PFR5cGVJbmZvcm1hdGlvbj4oKTsKCiAgVHlwZUluZm9ybWF0aW9uLm5vQXNzaWdubWVudHModGhpcy50eXBlLCB0aGlzLmNvbnRleHQpCiAgICAgIDogX2Fzc2lnbm1lbnRzID0gY29uc3QgPFR5cGVJbmZvcm1hdGlvbj5bXSwKICAgICAgICB1c2VycyA9IG5ldyBTZXRsZXQ8VHlwZUluZm9ybWF0aW9uPigpOwoKICBUeXBlSW5mb3JtYXRpb24udW50cmFja2VkKHRoaXMudHlwZSkKICAgICAgOiBfYXNzaWdubWVudHMgPSBjb25zdCA8VHlwZUluZm9ybWF0aW9uPltdLAogICAgICAgIHVzZXJzID0gY29uc3QgSW1tdXRhYmxlRW1wdHlTZXQoKSwKICAgICAgICBjb250ZXh0ID0gbnVsbDsKCiAgVHlwZUluZm9ybWF0aW9uLndpdGhBc3NpZ25tZW50cyh0aGlzLnR5cGUsIHRoaXMuY29udGV4dCwgdGhpcy5fYXNzaWdubWVudHMpCiAgICAgIDogdXNlcnMgPSBuZXcgU2V0bGV0PFR5cGVJbmZvcm1hdGlvbj4oKTsKCiAgdm9pZCBhZGRVc2VyKFR5cGVJbmZvcm1hdGlvbiB1c2VyKSB7CiAgICBhc3NlcnQoIXVzZXIuaXNDb25jcmV0ZSk7CiAgICB1c2Vycy5hZGQodXNlcik7CiAgfQoKICB2b2lkIGFkZFVzZXJzT2YoVHlwZUluZm9ybWF0aW9uIG90aGVyKSB7CiAgICB1c2Vycy5hZGRBbGwob3RoZXIudXNlcnMpOwogIH0KCiAgdm9pZCByZW1vdmVVc2VyKFR5cGVJbmZvcm1hdGlvbiB1c2VyKSB7CiAgICBhc3NlcnQoIXVzZXIuaXNDb25jcmV0ZSk7CiAgICB1c2Vycy5yZW1vdmUodXNlcik7CiAgfQoKICAvLyBUaGUgYmVsb3cgaXMgbm90IGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IHRvIG1ha2UgaXQgZGlmZmVyZW50aWFibGUKICAvLyBmcm9tIG90aGVyIGVtcHR5IGxpc3RzIG9mIFtUeXBlSW5mb3JtYXRpb25dLgogIHN0YXRpYyBmaW5hbCBTVE9QX1RSQUNLSU5HX0FTU0lHTk1FTlRTX01BUktFUiA9IG5ldyBMaXN0PFR5cGVJbmZvcm1hdGlvbj4oMCk7CgogIGJvb2wgYXJlQXNzaWdubWVudHNUcmFja2VkKCkgewogICAgcmV0dXJuIGFzc2lnbm1lbnRzICE9IFNUT1BfVFJBQ0tJTkdfQVNTSUdOTUVOVFNfTUFSS0VSOwogIH0KCiAgdm9pZCBhZGRBc3NpZ25tZW50KFR5cGVJbmZvcm1hdGlvbiBhc3NpZ25tZW50KSB7CiAgICAvLyBDaGVhcCBvbmUtbGV2ZWwgY3ljbGUgZGV0ZWN0aW9uLgogICAgaWYgKGFzc2lnbm1lbnQgPT0gdGhpcykgcmV0dXJuOwogICAgaWYgKGFyZUFzc2lnbm1lbnRzVHJhY2tlZCgpKSB7CiAgICAgIF9hc3NpZ25tZW50cy5hZGQoYXNzaWdubWVudCk7CiAgICB9CiAgICAvLyBFdmVuIGlmIHdlIGFiYW5kb24gaW5mZXJlbmNpbmcgb24gdGhpcyBbVHlwZUluZm9ybWF0aW9uXSB3ZQogICAgLy8gbmVlZCB0byBjb2xsZWN0IHRoZSB1c2Vycywgc28gdGhhdCBwaGFzZXMgdGhhdCB0cmFjayB3aGVyZQogICAgLy8gZWxlbWVudHMgZmxvdyBpbiBzdGlsbCB3b3JrLgogICAgYXNzaWdubWVudC5hZGRVc2VyKHRoaXMpOwogIH0KCiAgdm9pZCByZW1vdmVBc3NpZ25tZW50KFR5cGVJbmZvcm1hdGlvbiBhc3NpZ25tZW50KSB7CiAgICBpZiAoIWFiYW5kb25JbmZlcmVuY2luZyB8fCBtaWdodFJlc3VtZSkgewogICAgICBfYXNzaWdubWVudHMucmVtb3ZlKGFzc2lnbm1lbnQpOwogICAgfQogICAgLy8gV2UgY2FuIGhhdmUgbXVsdGlwbGUgYXNzaWdubWVudHMgb2YgdGhlIHNhbWUgW1R5cGVJbmZvcm1hdGlvbl0uCiAgICBpZiAoIWFzc2lnbm1lbnRzLmNvbnRhaW5zKGFzc2lnbm1lbnQpKSB7CiAgICAgIGFzc2lnbm1lbnQucmVtb3ZlVXNlcih0aGlzKTsKICAgIH0KICB9CgogIEFic3RyYWN0VmFsdWUgcmVmaW5lKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gYWJhbmRvbkluZmVyZW5jaW5nID8gc2FmZVR5cGUoaW5mZXJyZXIpIDogY29tcHV0ZVR5cGUoaW5mZXJyZXIpOwogIH0KCiAgLy8vIENvbXB1dGVzIGEgbmV3IHR5cGUgZm9yIHRoaXMgW1R5cGVJbmZvcm1hdGlvbl0gbm9kZSBkZXBlbmRpbmcgb24gaXRzCiAgLy8vIHBvdGVudGlhbGx5IHVwZGF0ZWQgaW5wdXRzLgogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpOwoKICAvLy8gUmV0dXJucyBhbiBhcHByb3hpbWF0aW9uIGZvciB0aGlzIFtUeXBlSW5mb3JtYXRpb25dIG5vZGUgdGhhdCBpcyBhbHdheXMKICAvLy8gc2FmZSB0byB1c2UuIFVzZWQgd2hlbiBhYmFuZG9uaW5nIGluZmVyZW5jZSBvbiBhIG5vZGUuCiAgQWJzdHJhY3RWYWx1ZSBzYWZlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLnR5cGVzLmR5bmFtaWNUeXBlLnR5cGU7CiAgfQoKICB2b2lkIGdpdmVVcChJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwge2Jvb2wgY2xlYXJBc3NpZ25tZW50czogdHJ1ZX0pIHsKICAgIGFiYW5kb25JbmZlcmVuY2luZyA9IHRydWU7CiAgICAvLyBEbyBub3QgcmVtb3ZlIFt0aGlzXSBhcyBhIHVzZXIgb2Ygbm9kZXMgaW4gW2Fzc2lnbm1lbnRzXSwKICAgIC8vIGJlY2F1c2Ugb3VyIHRyYWNpbmcgYW5hbHlzaXMgY291bGQgYmUgaW50ZXJlc3RlZCBpbiB0cmFjaW5nCiAgICAvLyB0aGlzIG5vZGUuCiAgICBpZiAoY2xlYXJBc3NpZ25tZW50cykgX2Fzc2lnbm1lbnRzID0gU1RPUF9UUkFDS0lOR19BU1NJR05NRU5UU19NQVJLRVI7CiAgICAvLyBEbyBub3QgcmVtb3ZlIHVzZXJzIGJlY2F1c2Ugb3VyIHRyYWNpbmcgYW5hbHlzaXMgY291bGQgYmUKICAgIC8vIGludGVyZXN0ZWQgaW4gdHJhY2luZyB0aGUgdXNlcnMgb2YgdGhpcyBub2RlLgogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIF9hc3NpZ25tZW50cyA9IFNUT1BfVFJBQ0tJTkdfQVNTSUdOTUVOVFNfTUFSS0VSOwogICAgdXNlcnMgPSBjb25zdCBJbW11dGFibGVFbXB0eVNldCgpOwogIH0KCiAgLy8vIFJlc2V0IHRoZSBhbmFseXNpcyBvZiB0aGlzIG5vZGUgYnkgbWFraW5nIGl0cyB0eXBlIGVtcHR5LgoKICBib29sIHJlc2V0KEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBpZiAoYWJhbmRvbkluZmVyZW5jaW5nKSByZXR1cm4gZmFsc2U7CiAgICB0eXBlID0gaW5mZXJyZXIuYWJzdHJhY3RWYWx1ZURvbWFpbi5lbXB0eVR5cGU7CiAgICByZWZpbmVDb3VudCA9IDA7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpOwoKICAvLy8gVGhlIFtFbGVtZW50XSB3aGVyZSB0aGlzIFtUeXBlSW5mb3JtYXRpb25dIHdhcyBjcmVhdGVkLiBNYXkgYmUgYG51bGxgCiAgLy8vIGZvciBzb21lIFtUeXBlSW5mb3JtYXRpb25dIG5vZGVzLCB3aGVyZSB3ZSBkbyBub3QgbmVlZCB0byBzdG9yZQogIC8vLyB0aGUgaW5mb3JtYXRpb24uCiAgTWVtYmVyRW50aXR5IGdldCBvd25lciA9PiAoY29udGV4dCAhPSBudWxsKSA/IGNvbnRleHQubWVtYmVyIDogbnVsbDsKCiAgLy8vIFJldHVybnMgd2hldGhlciB0aGUgdHlwZSBjYW5ub3QgY2hhbmdlIGFmdGVyIGl0IGhhcyBiZWVuCiAgLy8vIGluZmVycmVkLgogIGJvb2wgaGFzU3RhYmxlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuICFtaWdodFJlc3VtZSAmJiBhc3NpZ25tZW50cy5ldmVyeSgoZSkgPT4gZS5pc1N0YWJsZSk7CiAgfQoKICB2b2lkIHJlbW92ZUFuZENsZWFyUmVmZXJlbmNlcyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgYXNzaWdubWVudHMuZm9yRWFjaCgoaW5mbykgewogICAgICBpbmZvLnJlbW92ZVVzZXIodGhpcyk7CiAgICB9KTsKICB9CgogIHZvaWQgc3RhYmlsaXplKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZW1vdmVBbmRDbGVhclJlZmVyZW5jZXMoaW5mZXJyZXIpOwogICAgLy8gRG8gbm90IHJlbW92ZSB1c2VycyBiZWNhdXNlIHRoZSB0cmFjaW5nIGFuYWx5c2lzIGNvdWxkIGJlIGludGVyZXN0ZWQKICAgIC8vIGluIHRyYWNpbmcgdGhlIHVzZXJzIG9mIHRoaXMgbm9kZS4KICAgIF9hc3NpZ25tZW50cyA9IFNUT1BfVFJBQ0tJTkdfQVNTSUdOTUVOVFNfTUFSS0VSOwogICAgYWJhbmRvbkluZmVyZW5jaW5nID0gdHJ1ZTsKICAgIGlzU3RhYmxlID0gdHJ1ZTsKICB9CgogIHZvaWQgbWF5YmVSZXN1bWUoKSB7CiAgICBpZiAoIW1pZ2h0UmVzdW1lKSByZXR1cm47CiAgICBhYmFuZG9uSW5mZXJlbmNpbmcgPSBmYWxzZTsKICAgIGRvTm90RW5xdWV1ZSA9IGZhbHNlOwogIH0KCiAgLy8vIERlc3Ryb3lzIGluZm9ybWF0aW9uIG5vdCBuZWVkZWQgYWZ0ZXIgdHlwZSBpbmZlcmVuY2UuCiAgdm9pZCBjbGVhbnVwKCkgewogICAgdXNlcnMgPSBudWxsOwogICAgX2Fzc2lnbm1lbnRzID0gbnVsbDsKICB9CgogIFN0cmluZyB0b1N0cnVjdHVyZWRUZXh0KFN0cmluZyBpbmRlbnQpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIF90b1N0cnVjdHVyZWRUZXh0KHNiLCBpbmRlbnQsIG5ldyBTZXQ8VHlwZUluZm9ybWF0aW9uPigpKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgdm9pZCBfdG9TdHJ1Y3R1cmVkVGV4dCgKICAgICAgU3RyaW5nQnVmZmVyIHNiLCBTdHJpbmcgaW5kZW50LCBTZXQ8VHlwZUluZm9ybWF0aW9uPiBzZWVuKSB7CiAgICBzYi53cml0ZSh0b1N0cmluZygpKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEFwcGx5YWJsZVR5cGVJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIFR5cGVJbmZvcm1hdGlvbiB7CiAgYm9vbCBtaWdodEJlUGFzc2VkVG9GdW5jdGlvbkFwcGx5ID0gZmFsc2U7Cn0KCi8vLyBNYXJrZXIgbm9kZSB1c2VkIG9ubHkgZHVyaW5nIHRyZWUgY29uc3RydWN0aW9uIGJ1dCBub3QgZHVyaW5nIGFjdHVhbCB0eXBlCi8vLyByZWZpbmVtZW50LgovLy8KLy8vIEN1cnJlbnRseSwgdGhpcyBpcyB1c2VkIHRvIGdpdmUgYSB0eXBlIHRvIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBldmVuIGJlZm9yZQovLy8gdGhlIGNvcnJlc3BvbmRpbmcgZGVmYXVsdCBleHByZXNzaW9uIGhhcyBiZWVuIGFuYWx5emVkLiBTZWUKLy8vIFtnZXREZWZhdWx0VHlwZU9mUGFyYW1ldGVyXSBhbmQgW3NldERlZmF1bHRUeXBlT2ZQYXJhbWV0ZXJdIGZvciBkZXRhaWxzLgpjbGFzcyBQbGFjZWhvbGRlclR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIFR5cGVJbmZvcm1hdGlvbiB7CiAgUGxhY2Vob2xkZXJUeXBlSW5mb3JtYXRpb24oCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQpCiAgICAgIDogc3VwZXIoYWJzdHJhY3RWYWx1ZURvbWFpbi5lbXB0eVR5cGUsIGNvbnRleHQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgdmlzaXQgcGxhY2Vob2xkZXIiKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVmaW5lIHBsYWNlaG9sZGVyIik7CiAgfQoKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICJQbGFjZWhvbGRlciBbJGhhc2hDb2RlXSI7Cn0KCi8vLyBQYXJhbWV0ZXJzIG9mIGluc3RhbmNlIGZ1bmN0aW9ucyBiZWhhdmUgZGlmZmVyZW50bHkgdGhhbiBvdGhlcgovLy8gZWxlbWVudHMgYmVjYXVzZSB0aGUgaW5mZXJyZXIgbWF5IHJlbW92ZSBhc3NpZ25tZW50cy4gVGhpcyBoYXBwZW5zCi8vLyB3aGVuIHRoZSByZWNlaXZlciBvZiBhIGR5bmFtaWMgY2FsbCBzaXRlIGNhbiBiZSByZWZpbmVkCi8vLyB0byBhIHR5cGUgd2hlcmUgd2Uga25vdyBtb3JlIGFib3V0IHdoaWNoIGluc3RhbmNlIG1ldGhvZCBpcyBiZWluZwovLy8gY2FsbGVkLgpjbGFzcyBQYXJhbWV0ZXJBc3NpZ25tZW50cyBleHRlbmRzIEl0ZXJhYmxlQmFzZTxUeXBlSW5mb3JtYXRpb24+IHsKICBmaW5hbCBNYXA8VHlwZUluZm9ybWF0aW9uLCBpbnQ+IGFzc2lnbm1lbnRzID0gbmV3IE1hcDxUeXBlSW5mb3JtYXRpb24sIGludD4oKTsKCiAgdm9pZCByZW1vdmUoVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGludCBleGlzdGluZyA9IGFzc2lnbm1lbnRzW2luZm9dOwogICAgaWYgKGV4aXN0aW5nID09IG51bGwpIHJldHVybjsKICAgIGlmIChleGlzdGluZyA9PSAxKSB7CiAgICAgIGFzc2lnbm1lbnRzLnJlbW92ZShpbmZvKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2lnbm1lbnRzW2luZm9dID0gZXhpc3RpbmcgLSAxOwogICAgfQogIH0KCiAgdm9pZCBhZGQoVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGludCBleGlzdGluZyA9IGFzc2lnbm1lbnRzW2luZm9dOwogICAgaWYgKGV4aXN0aW5nID09IG51bGwpIHsKICAgICAgYXNzaWdubWVudHNbaW5mb10gPSAxOwogICAgfSBlbHNlIHsKICAgICAgYXNzaWdubWVudHNbaW5mb10gPSBleGlzdGluZyArIDE7CiAgICB9CiAgfQoKICB2b2lkIHJlcGxhY2UoVHlwZUluZm9ybWF0aW9uIG9sZCwgVHlwZUluZm9ybWF0aW9uIHJlcGxhY2VtZW50KSB7CiAgICBpbnQgZXhpc3RpbmcgPSBhc3NpZ25tZW50c1tvbGRdOwogICAgaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKICAgICAgaW50IG90aGVyID0gYXNzaWdubWVudHNbcmVwbGFjZW1lbnRdOwogICAgICBpZiAob3RoZXIgIT0gbnVsbCkgZXhpc3RpbmcgKz0gb3RoZXI7CiAgICAgIGFzc2lnbm1lbnRzW3JlcGxhY2VtZW50XSA9IGV4aXN0aW5nOwogICAgICBhc3NpZ25tZW50cy5yZW1vdmUob2xkKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEl0ZXJhdG9yPFR5cGVJbmZvcm1hdGlvbj4gZ2V0IGl0ZXJhdG9yID0+IGFzc2lnbm1lbnRzLmtleXMuaXRlcmF0b3I7CiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8VHlwZUluZm9ybWF0aW9uPiB3aGVyZShGdW5jdGlvbiBmKSA9PiBhc3NpZ25tZW50cy5rZXlzLndoZXJlKGYpOwoKICBAb3ZlcnJpZGUKICBib29sIGNvbnRhaW5zKE9iamVjdCBpbmZvKSA9PiBhc3NpZ25tZW50cy5jb250YWluc0tleShpbmZvKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gYXNzaWdubWVudHMua2V5cy50b0xpc3QoKS50b1N0cmluZygpOwp9CgovLy8gQSBub2RlIHJlcHJlc2VudGluZyBhIHJlc29sdmVkIGVsZW1lbnQgb2YgdGhlIGNvbXBvbmVudC4gVGhlIGtpbmQgb2YKLy8vIGVsZW1lbnRzIHRoYXQgbmVlZCBhbiBbRWxlbWVudFR5cGVJbmZvcm1hdGlvbl0gYXJlOgovLy8KLy8vIC0gRnVuY3Rpb25zIChpbmNsdWRpbmcgZ2V0dGVycyBhbmQgc2V0dGVycykKLy8vIC0gQ29uc3RydWN0b3JzIChmYWN0b3J5IG9yIGdlbmVyYXRpdmUpCi8vLyAtIEZpZWxkcwovLy8gLSBQYXJhbWV0ZXJzCi8vLyAtIExvY2FsIHZhcmlhYmxlcyBtdXRhdGVkIGluIGNsb3N1cmVzCi8vLwovLy8gVGhlIFtFbGVtZW50VHlwZUluZm9ybWF0aW9uXSBvZiBhIGZ1bmN0aW9uIGFuZCBhIGNvbnN0cnVjdG9yIGlzIGl0cwovLy8gcmV0dXJuIHR5cGUuCi8vLwovLy8gTm90ZSB0aGF0IGEgZmV3IGVsZW1lbnRzIG9mIHRoZXNlIGtpbmRzIG11c3QgYmUgdHJlYXRlZCBzcGVjaWFsbHksCi8vLyBhbmQgdGhleSBhcmUgZGVhbHQgaW4gW0VsZW1lbnRUeXBlSW5mb3JtYXRpb24uaGFuZGxlU3BlY2lhbENhc2VzXToKLy8vCi8vLyAtIFBhcmFtZXRlcnMgb2YgY2xvc3VyZXMsIGBub1N1Y2hNZXRob2RgIGFuZCBgY2FsbGAgaW5zdGFuY2UKLy8vICAgbWV0aG9kczogd2UgY3VycmVudGx5IGRvIG5vdCBpbmZlciB0eXBlcyBmb3IgdGhvc2UuCi8vLwovLy8gLSBGaWVsZHMgYW5kIHBhcmFtZXRlcnMgYmVpbmcgYXNzaWduZWQgYnkgc3ludGhlc2l6ZWQgY2FsbHMgZG9uZSBieQovLy8gICB0aGUgYmFja2VuZDogd2UgZG8gbm90IGtub3cgd2hhdCB0eXBlcyB0aGUgYmFja2VuZCB3aWxsIHVzZS4KLy8vCi8vLyAtIE5hdGl2ZSBmdW5jdGlvbnMgYW5kIGZpZWxkczogYmVjYXVzZSBuYXRpdmUgbWV0aG9kcyBjb250YWluIG5vIERhcnQKLy8vICAgY29kZSwgYW5kIG5hdGl2ZSBmaWVsZHMgZG8gbm90IGhhdmUgRGFydCBhc3NpZ25tZW50cywgd2UganVzdAovLy8gICB0cnVzdCB0aGVpciB0eXBlIGFubm90YXRpb24uCi8vLwphYnN0cmFjdCBjbGFzcyBFbGVtZW50VHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgVHlwZUluZm9ybWF0aW9uIHsKICAvLy8gTWFya2VyIHRvIGRpc2FibGUgaW5mZXJlbmNlIGZvciBjbG9zdXJlcyBpbiBbaGFuZGxlU3BlY2lhbENhc2VzXS4KICBib29sIGRpc2FibGVJbmZlcmVuY2VGb3JDbG9zdXJlcyA9IHRydWU7CgogIEVsZW1lbnRUeXBlSW5mb3JtYXRpb24uX2ludGVybmFsKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjb250ZXh0KQogICAgICA6IHN1cGVyKGFic3RyYWN0VmFsdWVEb21haW4uZW1wdHlUeXBlLCBjb250ZXh0KTsKICBFbGVtZW50VHlwZUluZm9ybWF0aW9uLl93aXRoQXNzaWdubWVudHMoCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsCiAgICAgIFBhcmFtZXRlckFzc2lnbm1lbnRzIGFzc2lnbm1lbnRzKQogICAgICA6IHN1cGVyLndpdGhBc3NpZ25tZW50cygKICAgICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5lbXB0eVR5cGUsIGNvbnRleHQsIGFzc2lnbm1lbnRzKTsKCiAgU3RyaW5nIGdldEluZmVycmVkU2lnbmF0dXJlKFR5cGVTeXN0ZW0gdHlwZXMpOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZTsKfQoKLy8vIEEgbm9kZSByZXByZXNlbnRpbmcgbWVtYmVycyBpbiB0aGUgYnJvYWRlc3Qgc2Vuc2U6Ci8vLwovLy8gLSBGdW5jdGlvbnMKLy8vIC0gQ29uc3RydWN0b3JzCi8vLyAtIEZpZWxkcyAoYWxzbyBzeW50aGV0aWMgb25lcyBkdWUgdG8gY2xvc3VyZXMpCi8vLyAtIExvY2FsIGZ1bmN0aW9ucyAoY2xvc3VyZXMpCi8vLwovLy8gVGhlc2Ugc2hvdWxkIG5ldmVyIGJlIGNyZWF0ZWQgZGlyZWN0bHkgYnV0IGluc3RlYWQgYXJlIGNvbnN0cnVjdGVkIGJ5Ci8vLyB0aGUgW0VsZW1lbnRUeXBlSW5mb3JtYXRpb25dIGZhY3RvcnkuCmFic3RyYWN0IGNsYXNzIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIEVsZW1lbnRUeXBlSW5mb3JtYXRpb24KICAgIHdpdGggQXBwbHlhYmxlVHlwZUluZm9ybWF0aW9uIHsKICBmaW5hbCBNZW1iZXJFbnRpdHkgX21lbWJlcjsKCiAgLy8vIElmIFtlbGVtZW50XSBpcyBhIGZ1bmN0aW9uLCBbY2xvc3VyaXplZENvdW50XSBpcyB0aGUgbnVtYmVyIG9mCiAgLy8vIHRpbWVzIGl0IGlzIGNsb3N1cml6ZWQuIFRoZSB2YWx1ZSBnZXRzIHVwZGF0ZWQgd2hpbGUgaW5mZXJyaW5nLgogIGludCBjbG9zdXJpemVkQ291bnQgPSAwOwoKICAvLyBTdHJpY3QgYGJvb2xgIHZhbHVlIGlzIGNvbXB1dGVkIGluIGNsZWFudXAoKS4gQWxzbyB1c2VkIGFzIGEgZmxhZyB0byBzZWUgaWYKICAvLyBjbGVhbnVwIGhhcyBiZWVuIGNhbGxlZC4KICBib29sIF9pc0NhbGxlZE9uY2UgPSBudWxsOwoKICAvLy8gVGhpcyBtYXAgY29udGFpbnMgdGhlIGNhbGxlcnMgb2YgW2VsZW1lbnRdLiBJdCBzdG9yZXMgYWxsIHVuaXF1ZSBjYWxsCiAgLy8vIHNpdGVzIHRvIGVuYWJsZSBjb3VudGluZyB0aGUgZ2xvYmFsIG51bWJlciBvZiBjYWxsIHNpdGVzIG9mIFtlbGVtZW50XS4KICAvLy8KICAvLy8gQSBjYWxsIHNpdGUgaXMgZWl0aGVyIGFuIEFTVCBbYXN0Lk5vZGVdLCBhbiBbRWxlbWVudF0gKHNlZSB1c2VzIG9mCiAgLy8vIFtzeW50aGVzaXplRm9yd2FyZGluZ0NhbGxdIGluIFtTaW1wbGVUeXBlSW5mZXJyZXJWaXNpdG9yXSkgb3IgYW4gSVIKICAvLy8gW2lyLk5vZGVdLgogIC8vLwogIC8vLyBUaGUgZ2xvYmFsIGluZm9ybWF0aW9uIGlzIHN1bW1hcml6ZWQgaW4gW2NsZWFudXBdLCBhZnRlciB3aGljaCBbX2NhbGxlcnNdCiAgLy8vIGlzIHNldCB0byBgbnVsbGAuCiAgTWFwPE1lbWJlckVudGl0eSwgU2V0bGV0PE9iamVjdD4+IF9jYWxsZXJzOwoKICBNZW1iZXJUeXBlSW5mb3JtYXRpb24uX2ludGVybmFsKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sIHRoaXMuX21lbWJlcikKICAgICAgOiBzdXBlci5faW50ZXJuYWwoYWJzdHJhY3RWYWx1ZURvbWFpbiwgbnVsbCk7CgogIE1lbWJlckVudGl0eSBnZXQgbWVtYmVyID0+IF9tZW1iZXI7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICckbWVtYmVyJzsKCiAgdm9pZCBhZGRDYWxsKE1lbWJlckVudGl0eSBjYWxsZXIsIE9iamVjdCBub2RlKSB7CiAgICBfY2FsbGVycyA/Pz0gPE1lbWJlckVudGl0eSwgU2V0bGV0PE9iamVjdD4+e307CiAgICBfY2FsbGVycy5wdXRJZkFic2VudChjYWxsZXIsICgpID0+IG5ldyBTZXRsZXQoKSkuYWRkKG5vZGUpOwogIH0KCiAgdm9pZCByZW1vdmVDYWxsKE1lbWJlckVudGl0eSBjYWxsZXIsIE9iamVjdCBub2RlKSB7CiAgICBpZiAoX2NhbGxlcnMgPT0gbnVsbCkgcmV0dXJuOwogICAgU2V0bGV0IGNhbGxzID0gX2NhbGxlcnNbY2FsbGVyXTsKICAgIGlmIChjYWxscyA9PSBudWxsKSByZXR1cm47CiAgICBjYWxscy5yZW1vdmUobm9kZSk7CiAgICBpZiAoY2FsbHMuaXNFbXB0eSkgewogICAgICBfY2FsbGVycy5yZW1vdmUoY2FsbGVyKTsKICAgIH0KICB9CgogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZ2V0IGNhbGxlcnNGb3JUZXN0aW5nIHsKICAgIHJldHVybiBfY2FsbGVycz8ua2V5czsKICB9CgogIGJvb2wgaXNDYWxsZWRPbmNlKCkgewogICAgLy8gSWYgdGhpcyBhc3NlcnQgZmlyZXMgaXQgbWVhbnMgdGhhdCB0aGlzIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBmb3IgdGhlCiAgICAvLyBlbGVtZW50IHdhcyBub3QgcGFydCBvZiB0eXBlIGluZmVyZW5jZS4gVGhpcyBoYXBwZW5zIGZvcgogICAgLy8gQ29uc3RydWN0b3JCb2R5RWxlbWVudHMsIHNvIGd1YXJkIHRoZSBjYWxsIHdpdGggYSB0ZXN0IGZvcgogICAgLy8gQ29uc3RydWN0b3JCb2R5RWxlbWVudC4gRm9yIG90aGVyIGVsZW1lbnRzLCBpbnZlc3RpZ2F0ZSB3aHkgdGhlIGVsZW1lbnQKICAgIC8vIHdhcyBub3QgcHJlc2VudCBmb3IgdHlwZSBpbmZlcmVuY2UuCiAgICBhc3NlcnQoX2lzQ2FsbGVkT25jZSAhPSBudWxsKTsKICAgIHJldHVybiBfaXNDYWxsZWRPbmNlID8/IGZhbHNlOwogIH0KCiAgYm9vbCBfY29tcHV0ZUlzQ2FsbGVkT25jZSgpIHsKICAgIGlmIChfY2FsbGVycyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBpbnQgY291bnQgPSAwOwogICAgZm9yICh2YXIgc2V0IGluIF9jYWxsZXJzLnZhbHVlcykgewogICAgICBjb3VudCArPSBzZXQubGVuZ3RoOwogICAgICBpZiAoY291bnQgPiAxKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gY291bnQgPT0gMTsKICB9CgogIHZvaWQgY29tcHV0ZUlzQ2FsbGVkT25jZSgpIHsKICAgIGFzc2VydChfaXNDYWxsZWRPbmNlID09IG51bGwsICJpc0NhbGxlZE9uY2UgaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZC4iKTsKICAgIF9pc0NhbGxlZE9uY2UgPSBfY29tcHV0ZUlzQ2FsbGVkT25jZSgpOwogIH0KCiAgYm9vbCBnZXQgaXNDbG9zdXJpemVkID0+IGNsb3N1cml6ZWRDb3VudCA+IDA7CgogIC8vIENsb3N1cml6ZWQgbWV0aG9kcyBuZXZlciBiZWNvbWUgc3RhYmxlIHRvIGVuc3VyZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBpbgogIC8vIFt1c2Vyc10gaXMgYWNjdXJhdGUuIFRoZSBpbmZlcmVuY2Ugc3RvcHMgdHJhY2tpbmcgdXNlcnMgZm9yIHN0YWJsZSB0eXBlcy4KICAvLyBOb3RlIHRoYXQgd2Ugb25seSBvdmVycmlkZSB0aGUgZ2V0dGVyLCB0aGUgc2V0dGVyIHdpbGwgc3RpbGwgbW9kaWZ5IHRoZQogIC8vIHN0YXRlIG9mIHRoZSBbaXNTdGFibGVdIGZpZWxkIGluaGVyaXRlZCBmcm9tIFtUeXBlSW5mb3JtYXRpb25dLgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3RhYmxlID0+IHN1cGVyLmlzU3RhYmxlICYmICFpc0Nsb3N1cml6ZWQ7CgogIEFic3RyYWN0VmFsdWUgaGFuZGxlU3BlY2lhbENhc2VzKEluZmVycmVyRW5naW5lIGluZmVycmVyKTsKCiAgQWJzdHJhY3RWYWx1ZSBfaGFuZGxlRnVuY3Rpb25DYXNlKAogICAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiwgSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIGlmIChpbmZlcnJlci5jbG9zZWRXb3JsZC5uYXRpdmVEYXRhLmlzTmF0aXZlTWVtYmVyKGZ1bmN0aW9uKSkgewogICAgICAvLyBVc2UgdGhlIHR5cGUgYW5ub3RhdGlvbiBhcyB0aGUgdHlwZSBmb3IgbmF0aXZlIGVsZW1lbnRzLiBXZQogICAgICAvLyBhbHNvIGdpdmUgdXAgb24gaW5mZXJyaW5nIHRvIG1ha2Ugc3VyZSB0aGlzIGVsZW1lbnQgbmV2ZXIKICAgICAgLy8gZ29lcyBpbiB0aGUgd29yayBxdWV1ZS4KICAgICAgZ2l2ZVVwKGluZmVycmVyKTsKICAgICAgcmV0dXJuIGluZmVycmVyCiAgICAgICAgICAudHlwZU9mTmF0aXZlQmVoYXZpb3IoCiAgICAgICAgICAgICAgaW5mZXJyZXIuY2xvc2VkV29ybGQubmF0aXZlRGF0YS5nZXROYXRpdmVNZXRob2RCZWhhdmlvcihmdW5jdGlvbikpCiAgICAgICAgICAudHlwZTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQWJzdHJhY3RWYWx1ZSBwb3RlbnRpYWxseU5hcnJvd1R5cGUoCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywgSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBfcG90ZW50aWFsbHlOYXJyb3dUeXBlKG1hc2ssIGluZmVycmVyKTsKICB9CgogIEFic3RyYWN0VmFsdWUgX3BvdGVudGlhbGx5TmFycm93VHlwZSgKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLCBJbmZlcnJlckVuZ2luZSBpbmZlcnJlcik7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIEFic3RyYWN0VmFsdWUgc3BlY2lhbCA9IGhhbmRsZVNwZWNpYWxDYXNlcyhpbmZlcnJlcik7CiAgICBpZiAoc3BlY2lhbCAhPSBudWxsKSByZXR1cm4gcG90ZW50aWFsbHlOYXJyb3dUeXBlKHNwZWNpYWwsIGluZmVycmVyKTsKICAgIHJldHVybiBwb3RlbnRpYWxseU5hcnJvd1R5cGUoCiAgICAgICAgaW5mZXJyZXIudHlwZXMuY29tcHV0ZVR5cGVNYXNrKGFzc2lnbm1lbnRzKSwgaW5mZXJyZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBzYWZlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIHBvdGVudGlhbGx5TmFycm93VHlwZShzdXBlci5zYWZlVHlwZShpbmZlcnJlciksIGluZmVycmVyKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdNZW1iZXIgJF9tZW1iZXIgJHR5cGUnOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdE1lbWJlclR5cGVJbmZvcm1hdGlvbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xlYW51cCgpIHsKICAgIF9jYWxsZXJzID0gbnVsbDsKICAgIHN1cGVyLmNsZWFudXAoKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXRJbmZlcnJlZFNpZ25hdHVyZShUeXBlU3lzdGVtIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMuZ2V0SW5mZXJyZWRTaWduYXR1cmVPZk1ldGhvZChfbWVtYmVyKTsKICB9Cn0KCmNsYXNzIEZpZWxkVHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgTWVtYmVyVHlwZUluZm9ybWF0aW9uIHsKICBGaWVsZEVudGl0eSBnZXQgX2ZpZWxkID0+IF9tZW1iZXI7CiAgZmluYWwgRGFydFR5cGUgX3R5cGU7CgogIEZpZWxkVHlwZUluZm9ybWF0aW9uKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sIEZpZWxkRW50aXR5IGVsZW1lbnQsIHRoaXMuX3R5cGUpCiAgICAgIDogc3VwZXIuX2ludGVybmFsKGFic3RyYWN0VmFsdWVEb21haW4sIGVsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGhhbmRsZVNwZWNpYWxDYXNlcyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgaWYgKCFpbmZlcnJlci5jYW5GaWVsZEJlVXNlZEZvckdsb2JhbE9wdGltaXphdGlvbnMoX2ZpZWxkKSB8fAogICAgICAgIGluZmVycmVyLmFzc3VtZUR5bmFtaWMoX2ZpZWxkKSkgewogICAgICAvLyBEbyBub3QgaW5mZXIgdHlwZXMgZm9yIGZpZWxkcyB0aGF0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGFubm90YXRpb24gb3IKICAgICAgLy8gYXJlIGFzc2lnbmVkIGJ5IHN5bnRoZXNpemVkIGNhbGxzCgogICAgICBnaXZlVXAoaW5mZXJyZXIpOwogICAgICByZXR1cm4gc2FmZVR5cGUoaW5mZXJyZXIpOwogICAgfQogICAgaWYgKGluZmVycmVyLmNsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaXNOYXRpdmVNZW1iZXIoX2ZpZWxkKSkgewogICAgICAvLyBVc2UgdGhlIHR5cGUgYW5ub3RhdGlvbiBhcyB0aGUgdHlwZSBmb3IgbmF0aXZlIGVsZW1lbnRzLiBXZQogICAgICAvLyBhbHNvIGdpdmUgdXAgb24gaW5mZXJyaW5nIHRvIG1ha2Ugc3VyZSB0aGlzIGVsZW1lbnQgbmV2ZXIKICAgICAgLy8gZ29lcyBpbiB0aGUgd29yayBxdWV1ZS4KICAgICAgZ2l2ZVVwKGluZmVycmVyKTsKICAgICAgcmV0dXJuIGluZmVycmVyCiAgICAgICAgICAudHlwZU9mTmF0aXZlQmVoYXZpb3IoaW5mZXJyZXIuY2xvc2VkV29ybGQubmF0aXZlRGF0YQogICAgICAgICAgICAgIC5nZXROYXRpdmVGaWVsZExvYWRCZWhhdmlvcihfZmllbGQpKQogICAgICAgICAgLnR5cGU7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgX3BvdGVudGlhbGx5TmFycm93VHlwZSgKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLCBJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIF9uYXJyb3dUeXBlKGluZmVycmVyLmNsb3NlZFdvcmxkLCBtYXNrLCBfdHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc1N0YWJsZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIC8vIFRoZSBudW1iZXIgb2YgYXNzaWdubWVudHMgb2Ygbm9uLWZpbmFsIGZpZWxkcyBpcwogICAgLy8gbm90IHN0YWJsZS4gVGhlcmVmb3JlIHN1Y2ggYSBmaWVsZCBjYW5ub3QgYmUgc3RhYmxlLgogICAgaWYgKCFfZmllbGQuaXNBc3NpZ25hYmxlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiBzdXBlci5oYXNTdGFibGVUeXBlKGluZmVycmVyKTsKICB9Cn0KCmNsYXNzIEdldHRlclR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIE1lbWJlclR5cGVJbmZvcm1hdGlvbiB7CiAgRnVuY3Rpb25FbnRpdHkgZ2V0IF9nZXR0ZXIgPT4gX21lbWJlcjsKICBmaW5hbCBGdW5jdGlvblR5cGUgX3R5cGU7CgogIEdldHRlclR5cGVJbmZvcm1hdGlvbihBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQsIHRoaXMuX3R5cGUpCiAgICAgIDogc3VwZXIuX2ludGVybmFsKGFic3RyYWN0VmFsdWVEb21haW4sIGVsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGhhbmRsZVNwZWNpYWxDYXNlcyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIF9oYW5kbGVGdW5jdGlvbkNhc2UoX2dldHRlciwgaW5mZXJyZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBfcG90ZW50aWFsbHlOYXJyb3dUeXBlKAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssIEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gX25hcnJvd1R5cGUoaW5mZXJyZXIuY2xvc2VkV29ybGQsIG1hc2ssIF90eXBlLnJldHVyblR5cGUpOwogIH0KfQoKY2xhc3MgU2V0dGVyVHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgTWVtYmVyVHlwZUluZm9ybWF0aW9uIHsKICBGdW5jdGlvbkVudGl0eSBnZXQgX3NldHRlciA9PiBfbWVtYmVyOwoKICBTZXR0ZXJUeXBlSW5mb3JtYXRpb24oCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwgRnVuY3Rpb25FbnRpdHkgZWxlbWVudCkKICAgICAgOiBzdXBlci5faW50ZXJuYWwoYWJzdHJhY3RWYWx1ZURvbWFpbiwgZWxlbWVudCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgaGFuZGxlU3BlY2lhbENhc2VzKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gX2hhbmRsZUZ1bmN0aW9uQ2FzZShfc2V0dGVyLCBpbmZlcnJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIF9wb3RlbnRpYWxseU5hcnJvd1R5cGUoCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywgSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBtYXNrOwogIH0KfQoKY2xhc3MgTWV0aG9kVHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgTWVtYmVyVHlwZUluZm9ybWF0aW9uIHsKICBGdW5jdGlvbkVudGl0eSBnZXQgX21ldGhvZCA9PiBfbWVtYmVyOwogIGZpbmFsIEZ1bmN0aW9uVHlwZSBfdHlwZTsKCiAgTWV0aG9kVHlwZUluZm9ybWF0aW9uKEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgRnVuY3Rpb25FbnRpdHkgZWxlbWVudCwgdGhpcy5fdHlwZSkKICAgICAgOiBzdXBlci5faW50ZXJuYWwoYWJzdHJhY3RWYWx1ZURvbWFpbiwgZWxlbWVudCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgaGFuZGxlU3BlY2lhbENhc2VzKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gX2hhbmRsZUZ1bmN0aW9uQ2FzZShfbWV0aG9kLCBpbmZlcnJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIF9wb3RlbnRpYWxseU5hcnJvd1R5cGUoCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywgSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBfbmFycm93VHlwZShpbmZlcnJlci5jbG9zZWRXb3JsZCwgbWFzaywgX3R5cGUucmV0dXJuVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc1N0YWJsZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpID0+IGZhbHNlOwp9CgpjbGFzcyBGYWN0b3J5Q29uc3RydWN0b3JUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBNZW1iZXJUeXBlSW5mb3JtYXRpb24gewogIENvbnN0cnVjdG9yRW50aXR5IGdldCBfY29uc3RydWN0b3IgPT4gX21lbWJlcjsKICBmaW5hbCBGdW5jdGlvblR5cGUgX3R5cGU7CgogIEZhY3RvcnlDb25zdHJ1Y3RvclR5cGVJbmZvcm1hdGlvbihBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIENvbnN0cnVjdG9yRW50aXR5IGVsZW1lbnQsIHRoaXMuX3R5cGUpCiAgICAgIDogc3VwZXIuX2ludGVybmFsKGFic3RyYWN0VmFsdWVEb21haW4sIGVsZW1lbnQpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGhhbmRsZVNwZWNpYWxDYXNlcyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluID0gaW5mZXJyZXIuYWJzdHJhY3RWYWx1ZURvbWFpbjsKICAgIGlmIChfY29uc3RydWN0b3IuaXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3RvcikgewogICAgICBpZiAoX2NvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzID09IGluZmVycmVyLmNvbW1vbkVsZW1lbnRzLmludENsYXNzKSB7CiAgICAgICAgZ2l2ZVVwKGluZmVycmVyKTsKICAgICAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5pbmNsdWRlTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluLmludFR5cGUpOwogICAgICB9IGVsc2UgaWYgKF9jb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzcyA9PQogICAgICAgICAgaW5mZXJyZXIuY29tbW9uRWxlbWVudHMuYm9vbENsYXNzKSB7CiAgICAgICAgZ2l2ZVVwKGluZmVycmVyKTsKICAgICAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5pbmNsdWRlTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluLmJvb2xUeXBlKTsKICAgICAgfSBlbHNlIGlmIChfY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3MgPT0KICAgICAgICAgIGluZmVycmVyLmNvbW1vbkVsZW1lbnRzLnN0cmluZ0NsYXNzKSB7CiAgICAgICAgZ2l2ZVVwKGluZmVycmVyKTsKICAgICAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5pbmNsdWRlTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluLnN0cmluZ1R5cGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2hhbmRsZUZ1bmN0aW9uQ2FzZShfY29uc3RydWN0b3IsIGluZmVycmVyKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgX3BvdGVudGlhbGx5TmFycm93VHlwZSgKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLCBJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIF9uYXJyb3dUeXBlKGluZmVycmVyLmNsb3NlZFdvcmxkLCBtYXNrLCBfdHlwZS5yZXR1cm5UeXBlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzU3RhYmxlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIHN1cGVyLmhhc1N0YWJsZVR5cGUoaW5mZXJyZXIpOwogIH0KfQoKY2xhc3MgR2VuZXJhdGl2ZUNvbnN0cnVjdG9yVHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgTWVtYmVyVHlwZUluZm9ybWF0aW9uIHsKICBDb25zdHJ1Y3RvckVudGl0eSBnZXQgX2NvbnN0cnVjdG9yID0+IF9tZW1iZXI7CgogIEdlbmVyYXRpdmVDb25zdHJ1Y3RvclR5cGVJbmZvcm1hdGlvbigKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLCBDb25zdHJ1Y3RvckVudGl0eSBlbGVtZW50KQogICAgICA6IHN1cGVyLl9pbnRlcm5hbChhYnN0cmFjdFZhbHVlRG9tYWluLCBlbGVtZW50KTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBoYW5kbGVTcGVjaWFsQ2FzZXMoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBfaGFuZGxlRnVuY3Rpb25DYXNlKF9jb25zdHJ1Y3RvciwgaW5mZXJyZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBfcG90ZW50aWFsbHlOYXJyb3dUeXBlKAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssIEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gbWFzazsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzU3RhYmxlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIHN1cGVyLmhhc1N0YWJsZVR5cGUoaW5mZXJyZXIpOwogIH0KfQoKLy8vIEEgbm9kZSByZXByZXNlbnRpbmcgcGFyYW1ldGVyczoKLy8vCi8vLyAtIFBhcmFtZXRlcnMKLy8vIC0gSW5pdGlhbGl6aW5nIGZvcm1hbHMKLy8vCi8vLyBUaGVzZSBzaG91bGQgbmV2ZXIgYmUgY3JlYXRlZCBkaXJlY3RseSBidXQgaW5zdGVhZCBhcmUgY29uc3RydWN0ZWQgYnkKLy8vIHRoZSBbRWxlbWVudFR5cGVJbmZvcm1hdGlvbl0gZmFjdG9yeS4KY2xhc3MgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgRWxlbWVudFR5cGVJbmZvcm1hdGlvbiB7CiAgZmluYWwgTG9jYWwgX3BhcmFtZXRlcjsKICBmaW5hbCBEYXJ0VHlwZSBfdHlwZTsKICBmaW5hbCBGdW5jdGlvbkVudGl0eSBfbWV0aG9kOwogIGZpbmFsIGJvb2wgX2lzSW5zdGFuY2VNZW1iZXJQYXJhbWV0ZXI7CiAgZmluYWwgYm9vbCBfaXNDbG9zdXJlUGFyYW1ldGVyOwogIGZpbmFsIGJvb2wgX2lzSW5pdGlhbGl6aW5nRm9ybWFsOwogIGJvb2wgX2lzVGVhck9mZkNsb3N1cmVQYXJhbWV0ZXIgPSBmYWxzZTsKCiAgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uLmxvY2FsRnVuY3Rpb24oCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsCiAgICAgIHRoaXMuX3BhcmFtZXRlciwKICAgICAgdGhpcy5fdHlwZSwKICAgICAgdGhpcy5fbWV0aG9kKQogICAgICA6IF9pc0luc3RhbmNlTWVtYmVyUGFyYW1ldGVyID0gZmFsc2UsCiAgICAgICAgX2lzQ2xvc3VyZVBhcmFtZXRlciA9IHRydWUsCiAgICAgICAgX2lzSW5pdGlhbGl6aW5nRm9ybWFsID0gZmFsc2UsCiAgICAgICAgc3VwZXIuX2ludGVybmFsKGFic3RyYWN0VmFsdWVEb21haW4sIGNvbnRleHQpOwoKICBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24uc3RhdGljKEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsIHRoaXMuX3BhcmFtZXRlciwgdGhpcy5fdHlwZSwgdGhpcy5fbWV0aG9kLAogICAgICB7Ym9vbCBpc0luaXRpYWxpemluZ0Zvcm1hbDogZmFsc2V9KQogICAgICA6IF9pc0luc3RhbmNlTWVtYmVyUGFyYW1ldGVyID0gZmFsc2UsCiAgICAgICAgX2lzQ2xvc3VyZVBhcmFtZXRlciA9IGZhbHNlLAogICAgICAgIF9pc0luaXRpYWxpemluZ0Zvcm1hbCA9IGlzSW5pdGlhbGl6aW5nRm9ybWFsLAogICAgICAgIHN1cGVyLl9pbnRlcm5hbChhYnN0cmFjdFZhbHVlRG9tYWluLCBjb250ZXh0KTsKCiAgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uLmluc3RhbmNlTWVtYmVyKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjb250ZXh0LAogICAgICB0aGlzLl9wYXJhbWV0ZXIsCiAgICAgIHRoaXMuX3R5cGUsCiAgICAgIHRoaXMuX21ldGhvZCwKICAgICAgUGFyYW1ldGVyQXNzaWdubWVudHMgYXNzaWdubWVudHMpCiAgICAgIDogX2lzSW5zdGFuY2VNZW1iZXJQYXJhbWV0ZXIgPSB0cnVlLAogICAgICAgIF9pc0Nsb3N1cmVQYXJhbWV0ZXIgPSBmYWxzZSwKICAgICAgICBfaXNJbml0aWFsaXppbmdGb3JtYWwgPSBmYWxzZSwKICAgICAgICBzdXBlci5fd2l0aEFzc2lnbm1lbnRzKGFic3RyYWN0VmFsdWVEb21haW4sIGNvbnRleHQsIGFzc2lnbm1lbnRzKTsKCiAgRnVuY3Rpb25FbnRpdHkgZ2V0IG1ldGhvZCA9PiBfbWV0aG9kOwoKICBMb2NhbCBnZXQgcGFyYW1ldGVyID0+IF9wYXJhbWV0ZXI7CgogIGJvb2wgZ2V0IGlzUmVndWxhclBhcmFtZXRlciA9PiAhX2lzSW5pdGlhbGl6aW5nRm9ybWFsOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAnJHBhcmFtZXRlcic7CgogIHZvaWQgdGFnQXNUZWFyT2ZmQ2xvc3VyZVBhcmFtZXRlcihJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgYXNzZXJ0KCFfaXNJbml0aWFsaXppbmdGb3JtYWwpOwogICAgX2lzVGVhck9mZkNsb3N1cmVQYXJhbWV0ZXIgPSB0cnVlOwogICAgLy8gV2UgaGF2ZSB0byBhZGQgYSBmbG93LWVkZ2UgZm9yIHRoZSBkZWZhdWx0IHZhbHVlIChpZiBpdCBleGlzdHMpLCBhcyB3ZQogICAgLy8gbWlnaHQgbm90IHNlZSBhbGwgY2FsbC1zaXRlcyBhbmQgdGh1cyBtaXNzIHRoZSB1c2Ugb2YgaXQuCiAgICBUeXBlSW5mb3JtYXRpb24gZGVmYXVsdFR5cGUgPQogICAgICAgIGluZmVycmVyLmdldERlZmF1bHRUeXBlT2ZQYXJhbWV0ZXIoX3BhcmFtZXRlcik7CiAgICBpZiAoZGVmYXVsdFR5cGUgIT0gbnVsbCkgZGVmYXVsdFR5cGUuYWRkVXNlcih0aGlzKTsKICB9CgogIC8vIFRPRE8oaGVyaHV0KTogQ2xlYW51cCBpbnRvIG9uZSBjb25kaXRpb25hbC4KICBBYnN0cmFjdFZhbHVlIGhhbmRsZVNwZWNpYWxDYXNlcyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgaWYgKCFpbmZlcnJlci5jYW5GdW5jdGlvblBhcmFtZXRlcnNCZVVzZWRGb3JHbG9iYWxPcHRpbWl6YXRpb25zKF9tZXRob2QpIHx8CiAgICAgICAgaW5mZXJyZXIuYXNzdW1lRHluYW1pYyhfbWV0aG9kKSkgewogICAgICAvLyBEbyBub3QgaW5mZXIgdHlwZXMgZm9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGEgY29ycmVzcG9uZGluZyBhbm5vdGF0aW9uCiAgICAgIC8vIG9yIHRoYXQgYXJlIGFzc2lnbmVkIGJ5IHN5bnRoZXNpemVkIGNhbGxzLgogICAgICBnaXZlVXAoaW5mZXJyZXIpOwogICAgICByZXR1cm4gc2FmZVR5cGUoaW5mZXJyZXIpOwogICAgfQoKICAgIC8vIFRoZSBiZWxvdyBkbyBub3QgYXBwbHkgdG8gcGFyYW1ldGVycyBvZiBjb25zdHJ1Y3RvcnMsIHNvIHNraXAKICAgIC8vIGluaXRpYWxpemluZyBmb3JtYWxzLgogICAgaWYgKF9pc0luaXRpYWxpemluZ0Zvcm1hbCkgcmV0dXJuIG51bGw7CgogICAgaWYgKChfaXNUZWFyT2ZmQ2xvc3VyZVBhcmFtZXRlciB8fCBfaXNDbG9zdXJlUGFyYW1ldGVyKSAmJgogICAgICAgIGRpc2FibGVJbmZlcmVuY2VGb3JDbG9zdXJlcykgewogICAgICAvLyBEbyBub3QgaW5mZXIgdHlwZXMgZm9yIHBhcmFtZXRlcnMgb2YgY2xvc3VyZXMuIFdlIGRvIG5vdAogICAgICAvLyBjbGVhciB0aGUgYXNzaWdubWVudHMgaW4gY2FzZSB0aGUgY2xvc3VyZSBpcyBzdWNjZXNzZnVsbHkKICAgICAgLy8gdHJhY2VkLgogICAgICBnaXZlVXAoaW5mZXJyZXIsIGNsZWFyQXNzaWdubWVudHM6IGZhbHNlKTsKICAgICAgcmV0dXJuIHNhZmVUeXBlKGluZmVycmVyKTsKICAgIH0KICAgIGlmIChfaXNJbnN0YW5jZU1lbWJlclBhcmFtZXRlciAmJgogICAgICAgIChfbWV0aG9kLm5hbWUgPT0gSWRlbnRpZmllcnMubm9TdWNoTWV0aG9kXyB8fAogICAgICAgICAgICAoX21ldGhvZC5uYW1lID09IElkZW50aWZpZXJzLmNhbGwgJiYKICAgICAgICAgICAgICAgIGRpc2FibGVJbmZlcmVuY2VGb3JDbG9zdXJlcykpKSB7CiAgICAgIC8vIERvIG5vdCBpbmZlciB0eXBlcyBmb3IgcGFyYW1ldGVycyBvZiBbbm9TdWNoTWV0aG9kXSBhbmQgW2NhbGxdIGluc3RhbmNlCiAgICAgIC8vIG1ldGhvZHMuCiAgICAgIGdpdmVVcChpbmZlcnJlcik7CiAgICAgIHJldHVybiBzYWZlVHlwZShpbmZlcnJlcik7CiAgICB9CiAgICBpZiAoaW5mZXJyZXIuaW5mZXJyZWREYXRhQnVpbGRlcgogICAgICAgIC5nZXRDdXJyZW50bHlLbm93bk1pZ2h0QmVQYXNzZWRUb0FwcGx5KF9tZXRob2QpKSB7CiAgICAgIGdpdmVVcChpbmZlcnJlcik7CiAgICAgIHJldHVybiBzYWZlVHlwZShpbmZlcnJlcik7CiAgICB9CiAgICBpZiAoX21ldGhvZCA9PSBpbmZlcnJlci5tYWluRWxlbWVudCkgewogICAgICAvLyBUaGUgaW1wbGljaXQgY2FsbCB0byBtYWluIGlzIG5vdCBzZWVuIGJ5IHRoZSBpbmZlcnJlciwKICAgICAgLy8gdGhlcmVmb3JlIHdlIGV4cGxpY2l0bHkgc2V0IHRoZSB0eXBlIG9mIGl0cyBwYXJhbWV0ZXJzIGFzCiAgICAgIC8vIGR5bmFtaWMuCiAgICAgIC8vIFRPRE8oMTQ1NjYpOiBzeW50aGVzaXplIGEgY2FsbCBpbnN0ZWFkIHRvIGdldCB0aGUgZXhhY3QKICAgICAgLy8gdHlwZXMuCiAgICAgIGdpdmVVcChpbmZlcnJlcik7CiAgICAgIHJldHVybiBzYWZlVHlwZShpbmZlcnJlcik7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBBYnN0cmFjdFZhbHVlIHBvdGVudGlhbGx5TmFycm93VHlwZSgKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLCBJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgaWYgKGluZmVycmVyLmNsb3NlZFdvcmxkLmFubm90YXRpb25zRGF0YQogICAgICAgIC5nZXRQYXJhbWV0ZXJDaGVja1BvbGljeShtZXRob2QpCiAgICAgICAgLmlzVHJ1c3RlZCkgewogICAgICAvLyBJbiBjaGVja2VkIG9yIHN0cm9uZyBtb2RlIHdlIGRvbid0IHRydXN0IHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzCiAgICAgIC8vIHBhc3NlZCB0byBhIHBhcmFtZXRlci4gVGhlIG1lYW5zIHRoYXQgdGhlIGNoZWNraW5nIG9mIGEgcGFyYW1ldGVyIGlzCiAgICAgIC8vIGJhc2VkIG9uIHRoZSBhY3R1YWwgYXJndW1lbnRzLgogICAgICAvLwogICAgICAvLyBXaXRoIC0tdHJ1c3QtdHlwZS1hbm5vdGF0aW9ucyBvciAtLW9taXQtaW1wbGljaXQtY2hlY2tzIHdlIF9kb18gdHJ1c3QKICAgICAgLy8gdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYSBwYXJhbWV0ZXIgLSBhbmQgd2UgbmV2ZXIgY2hlY2sgdGhlbS4KICAgICAgLy8KICAgICAgLy8gSW4gYWxsIHRoZXNlIGNhc2VzIHdlIF9kb18gdHJ1c3QgdGhlIHN0YXRpYyB0eXBlIG9mIGEgcGFyYW1ldGVyIHdpdGhpbgogICAgICAvLyB0aGUgbWV0aG9kIGl0c2VsZi4gRm9yIGluc3RhbmNlOgogICAgICAvLwogICAgICAvLyAgICAgbWV0aG9kKGludCBpKSA9PiBpOwogICAgICAvLyAgICAgbWFpbigpIHsKICAgICAgLy8gICAgICAgZHluYW1pYyBmID0gbWV0aG9kOwogICAgICAvLyAgICAgICBmKDApOyAvLyB2YWxpZCBjYWxsCiAgICAgIC8vICAgICAgIGYoJycpOyAvLyBpbnZhbGlkIGNhbGwKICAgICAgLy8gICAgIH0KICAgICAgLy8KICAgICAgLy8gSGVyZSwgaW4gYWxsIGNhc2VzLCB3ZSBpbmZlciB0aGUgcmV0dXJuZWQgdmFsdWUgb2YgYG1ldGhvZGAgdG8gYmUgYW4KICAgICAgLy8gYGludGAuIEluIGNoZWNrZWQgYW5kIHN0cm9uZyBtb2RlIHdlIGluZmVyIHRoZSBwYXJhbWV0ZXIgb2YgYG1ldGhvZGAgdG8KICAgICAgLy8gYmUgZWl0aGVyIGBpbnRgIG9yIGBTdHJpbmdgIGFuZCB0aGVyZWZvcmUgaW5zZXJ0IGEgY2hlY2sgYXQgdGhlIGVudHJ5CiAgICAgIC8vIG9mICdtZXRob2QnLiBXaXRoIC0tdHJ1c3QtdHlwZS1hbm5vdGF0aW9ucyBvciAtLW9taXQtaW1wbGljaXQtY2hlY2tzIHdlCiAgICAgIC8vICh1bnNvdW5kbHkpIGluZmVyIHRoZSBwYXJhbWV0ZXIgdG8gYmUgYGludGAgYW5kIGxlYXZlIHRoZSBwYXJhbWV0ZXIKICAgICAgLy8gdW5jaGVja2VkLCBhbmQgYG1ldGhvZGAgd2lsbCBhdCBydW50aW1lIGFjdHVhbGx5IHJldHVybiBhIGBTdHJpbmdgIGZyb20KICAgICAgLy8gdGhlIHNlY29uZCBpbnZvY2F0aW9uLgogICAgICAvLwogICAgICAvLyBUaGUgdHJ1c3Rpbmcgb2YgdGhlIHBhcmFtZXRlciB0eXBlcyB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIG1ldGhvZCBpcwogICAgICAvLyBpcyBkb25lIHRocm91Z2ggYExvY2Fsc0hhbmRsZXIudXBkYXRlYCBjYWxsZWQgaW4KICAgICAgLy8gYEtlcm5lbFR5cGVHcmFwaEJ1aWxkZXIuaGFuZGxlUGFyYW1ldGVyYC4KICAgICAgcmV0dXJuIF9uYXJyb3dUeXBlKGluZmVycmVyLmNsb3NlZFdvcmxkLCBtYXNrLCBfdHlwZSk7CiAgICB9CiAgICByZXR1cm4gbWFzazsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIEFic3RyYWN0VmFsdWUgc3BlY2lhbCA9IGhhbmRsZVNwZWNpYWxDYXNlcyhpbmZlcnJlcik7CiAgICBpZiAoc3BlY2lhbCAhPSBudWxsKSByZXR1cm4gc3BlY2lhbDsKICAgIHJldHVybiBwb3RlbnRpYWxseU5hcnJvd1R5cGUoCiAgICAgICAgaW5mZXJyZXIudHlwZXMuY29tcHV0ZVR5cGVNYXNrKGFzc2lnbm1lbnRzKSwgaW5mZXJyZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBzYWZlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIHBvdGVudGlhbGx5TmFycm93VHlwZShzdXBlci5zYWZlVHlwZShpbmZlcnJlciksIGluZmVycmVyKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzU3RhYmxlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgLy8gVGhlIG51bWJlciBvZiBhc3NpZ25tZW50cyBvZiBwYXJhbWV0ZXJzIG9mIGluc3RhbmNlIG1ldGhvZHMgaXMKICAgIC8vIG5vdCBzdGFibGUuIFRoZXJlZm9yZSBzdWNoIGEgcGFyYW1ldGVyIGNhbm5vdCBiZSBzdGFibGUuCiAgICBpZiAoX2lzSW5zdGFuY2VNZW1iZXJQYXJhbWV0ZXIpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHN1cGVyLmhhc1N0YWJsZVR5cGUoaW5mZXJyZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KFR5cGVJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnUGFyYW1ldGVyICRfcGFyYW1ldGVyICR0eXBlJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldEluZmVycmVkU2lnbmF0dXJlKFR5cGVTeXN0ZW0gdHlwZXMpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24uZ2V0SW5mZXJyZWRTaWduYXR1cmUnKTsKICB9Cn0KCmVudW0gQ2FsbFR5cGUgewogIGFjY2VzcywKICBmb3JJbiwKfQoKYm9vbCB2YWxpZENhbGxUeXBlKENhbGxUeXBlIGNhbGxUeXBlLCBPYmplY3QgY2FsbCkgewogIHN3aXRjaCAoY2FsbFR5cGUpIHsKICAgIGNhc2UgQ2FsbFR5cGUuYWNjZXNzOgogICAgICByZXR1cm4gY2FsbCBpcyBpci5Ob2RlOwogICAgY2FzZSBDYWxsVHlwZS5mb3JJbjoKICAgICAgcmV0dXJuIGNhbGwgaXMgaXIuRm9ySW5TdGF0ZW1lbnQ7CiAgfQogIHRocm93IG5ldyBTdGF0ZUVycm9yKCdVbmV4cGVjdGVkIGNhbGwgdHlwZSAkY2FsbFR5cGUuJyk7Cn0KCi8vLyBBIFtDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbl0gaXMgYSBjYWxsIGZvdW5kIGluIHRoZSBBU1QsIG9yIGEKLy8vIHN5bnRoZXNpemVkIGNhbGwgZm9yIGltcGxpY2l0IGNhbGxzIGluIERhcnQgKHN1Y2ggYXMgZm9yd2FyZGluZwovLy8gZmFjdG9yaWVzKS4gVGhlIFtfY2FsbF0gZmllbGQgaXMgYSBbYXN0Lk5vZGVdIGZvciB0aGUgZm9ybWVyLCBhbmQgYW4KLy8vIFtFbGVtZW50XSBmb3IgdGhlIGxhdHRlci4KLy8vCi8vLyBJbiB0aGUgaW5mZXJyZXIgZ3JhcGgsIFtDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbl0gbm9kZXMgZG8gbm90IGhhdmUKLy8vIGFueSBhc3NpZ25tZW50LiBUaGV5IHJlbHkgb24gdGhlIFtjYWxsZXJdIGZpZWxkIGZvciBzdGF0aWMgY2FsbHMsCi8vLyBhbmQgW3NlbGVjdG9yXSBhbmQgW3JlY2VpdmVyXSBmaWVsZHMgZm9yIGR5bmFtaWMgY2FsbHMuCmFic3RyYWN0IGNsYXNzIENhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgVHlwZUluZm9ybWF0aW9uCiAgICB3aXRoIEFwcGx5YWJsZVR5cGVJbmZvcm1hdGlvbiB7CiAgZmluYWwgT2JqZWN0IF9jYWxsOwogIGZpbmFsIE1lbWJlckVudGl0eSBjYWxsZXI7CiAgZmluYWwgU2VsZWN0b3Igc2VsZWN0b3I7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZSBtYXNrOwogIGZpbmFsIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50czsKICBmaW5hbCBib29sIGluTG9vcDsKCiAgQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsCiAgICAgIHRoaXMuX2NhbGwsCiAgICAgIHRoaXMuY2FsbGVyLAogICAgICB0aGlzLnNlbGVjdG9yLAogICAgICB0aGlzLm1hc2ssCiAgICAgIHRoaXMuYXJndW1lbnRzLAogICAgICB0aGlzLmluTG9vcCkKICAgICAgOiBzdXBlci5ub0Fzc2lnbm1lbnRzKGFic3RyYWN0VmFsdWVEb21haW4uZW1wdHlUeXBlLCBjb250ZXh0KSB7CiAgICBhc3NlcnQoX2NhbGwgaXMgaXIuTm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnQ2FsbCBzaXRlICRkZWJ1Z05hbWUgJHR5cGUnOwoKICAvLy8gQWRkIFt0aGlzXSB0byB0aGUgZ3JhcGggYmVpbmcgY29tcHV0ZWQgYnkgW2VuZ2luZV0uCiAgdm9pZCBhZGRUb0dyYXBoKEluZmVycmVyRW5naW5lIGVuZ2luZSk7CgogIC8vLyBSZXR1cm4gYW4gaXRlcmFibGUgb3ZlciB0aGUgdGFyZ2V0cyBvZiB0aGlzIGNhbGwuCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXQgY2FsbGVlczsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gJyRfY2FsbCc7Cn0KCmNsYXNzIFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gewogIGZpbmFsIE1lbWJlckVudGl0eSBjYWxsZWRFbGVtZW50OwoKICBTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbigKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dCwKICAgICAgT2JqZWN0IGNhbGwsCiAgICAgIE1lbWJlckVudGl0eSBlbmNsb3NpbmcsCiAgICAgIHRoaXMuY2FsbGVkRWxlbWVudCwKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywKICAgICAgQXJndW1lbnRzVHlwZXMgYXJndW1lbnRzLAogICAgICBib29sIGluTG9vcCkKICAgICAgOiBzdXBlcihhYnN0cmFjdFZhbHVlRG9tYWluLCBjb250ZXh0LCBjYWxsLCBlbmNsb3NpbmcsIHNlbGVjdG9yLCBtYXNrLAogICAgICAgICAgICBhcmd1bWVudHMsIGluTG9vcCk7CgogIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBfZ2V0Q2FsbGVkVHlwZUluZm8oSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBpbmZlcnJlci50eXBlcy5nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihjYWxsZWRFbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkVG9HcmFwaChJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNhbGxlZSA9IF9nZXRDYWxsZWRUeXBlSW5mbyhpbmZlcnJlcik7CiAgICBjYWxsZWUuYWRkQ2FsbChjYWxsZXIsIF9jYWxsKTsKICAgIGNhbGxlZS5hZGRVc2VyKHRoaXMpOwogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFyZ3VtZW50cy5mb3JFYWNoKChpbmZvKSA9PiBpbmZvLmFkZFVzZXIodGhpcykpOwogICAgfQogICAgaW5mZXJyZXIudXBkYXRlUGFyYW1ldGVyQXNzaWdubWVudHMoCiAgICAgICAgdGhpcywgY2FsbGVkRWxlbWVudCwgYXJndW1lbnRzLCBzZWxlY3RvciwgbWFzaywKICAgICAgICByZW1vdmU6IGZhbHNlLCBhZGRUb1F1ZXVlOiBmYWxzZSk7CiAgfQoKICBib29sIGdldCBpc1N5bnRoZXNpemVkIHsKICAgIC8vIFNvbWUgY2FsbHMgZG8gbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIHNlbGVjdG9yLCBmb3IgZXhhbXBsZQogICAgLy8gZm9yd2FyZGluZyBmYWN0b3J5IGNvbnN0cnVjdG9ycywgb3Igc3ludGhlc2l6ZWQgc3VwZXIKICAgIC8vIGNvbnN0cnVjdG9yIGNhbGxzLiBXZSBzeW50aGVzaXplIHRoZXNlIGNhbGxzIGJ1dCBkbwogICAgLy8gbm90IGNyZWF0ZSBhIHNlbGVjdG9yIGZvciB0aGVtLgogICAgcmV0dXJuIHNlbGVjdG9yID09IG51bGw7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gX2dldENhbGxlZFR5cGVJbmZvV2l0aFNlbGVjdG9yKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW5mZXJyZXIudHlwZU9mTWVtYmVyV2l0aFNlbGVjdG9yKGNhbGxlZEVsZW1lbnQsIHNlbGVjdG9yKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIGlmIChpc1N5bnRoZXNpemVkKSB7CiAgICAgIGFzc2VydChhcmd1bWVudHMgIT0gbnVsbCk7CiAgICAgIHJldHVybiBfZ2V0Q2FsbGVkVHlwZUluZm8oaW5mZXJyZXIpLnR5cGU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gX2dldENhbGxlZFR5cGVJbmZvV2l0aFNlbGVjdG9yKGluZmVycmVyKS50eXBlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXQgY2FsbGVlcyA9PiBbY2FsbGVkRWxlbWVudF07CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc1N0YWJsZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIGJvb2wgaXNTdGFibGUgPSBfZ2V0Q2FsbGVkVHlwZUluZm8oaW5mZXJyZXIpLmlzU3RhYmxlOwogICAgcmV0dXJuIGlzU3RhYmxlICYmCiAgICAgICAgKGFyZ3VtZW50cyA9PSBudWxsIHx8IGFyZ3VtZW50cy5ldmVyeSgoaW5mbykgPT4gaW5mby5pc1N0YWJsZSkpICYmCiAgICAgICAgc3VwZXIuaGFzU3RhYmxlVHlwZShpbmZlcnJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZUFuZENsZWFyUmVmZXJlbmNlcyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgRWxlbWVudFR5cGVJbmZvcm1hdGlvbiBjYWxsZWUgPSBfZ2V0Q2FsbGVkVHlwZUluZm8oaW5mZXJyZXIpOwogICAgY2FsbGVlLnJlbW92ZVVzZXIodGhpcyk7CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgYXJndW1lbnRzLmZvckVhY2goKGluZm8pID0+IGluZm8ucmVtb3ZlVXNlcih0aGlzKSk7CiAgICB9CiAgICBzdXBlci5yZW1vdmVBbmRDbGVhclJlZmVyZW5jZXMoaW5mZXJyZXIpOwogIH0KfQoKY2xhc3MgRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uPFQ+IGV4dGVuZHMgQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gewogIGZpbmFsIENhbGxUeXBlIF9jYWxsVHlwZTsKICBmaW5hbCBUeXBlSW5mb3JtYXRpb24gcmVjZWl2ZXI7CiAgZmluYWwgYm9vbCBpc0NvbmRpdGlvbmFsOwogIGJvb2wgX2hhc0Nsb3N1cmVDYWxsVGFyZ2V0czsKCiAgLy8vIENhY2hlZCBjb25jcmV0ZSB0YXJnZXRzIG9mIHRoaXMgY2FsbC4KICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IF9jb25jcmV0ZVRhcmdldHM7CgogIER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbigKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dCwKICAgICAgdGhpcy5fY2FsbFR5cGUsCiAgICAgIFQgY2FsbCwKICAgICAgTWVtYmVyRW50aXR5IGVuY2xvc2luZywKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywKICAgICAgdGhpcy5yZWNlaXZlciwKICAgICAgQXJndW1lbnRzVHlwZXMgYXJndW1lbnRzLAogICAgICBib29sIGluTG9vcCwKICAgICAgdGhpcy5pc0NvbmRpdGlvbmFsKQogICAgICA6IHN1cGVyKGFic3RyYWN0VmFsdWVEb21haW4sIGNvbnRleHQsIGNhbGwsIGVuY2xvc2luZywgc2VsZWN0b3IsIG1hc2ssCiAgICAgICAgICAgIGFyZ3VtZW50cywgaW5Mb29wKSB7CiAgICBhc3NlcnQodmFsaWRDYWxsVHlwZShfY2FsbFR5cGUsIF9jYWxsKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFRvR3JhcGgoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIGFzc2VydChyZWNlaXZlciAhPSBudWxsKTsKICAgIEFic3RyYWN0VmFsdWUgdHlwZU1hc2sgPSBjb21wdXRlVHlwZWRTZWxlY3RvcihpbmZlcnJlcik7CiAgICBfaGFzQ2xvc3VyZUNhbGxUYXJnZXRzID0KICAgICAgICBpbmZlcnJlci5jbG9zZWRXb3JsZC5pbmNsdWRlc0Nsb3N1cmVDYWxsKHNlbGVjdG9yLCB0eXBlTWFzayk7CiAgICBfY29uY3JldGVUYXJnZXRzID0gaW5mZXJyZXIuY2xvc2VkV29ybGQubG9jYXRlTWVtYmVycyhzZWxlY3RvciwgdHlwZU1hc2spOwogICAgcmVjZWl2ZXIuYWRkVXNlcih0aGlzKTsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudHMuZm9yRWFjaCgoaW5mbykgPT4gaW5mby5hZGRVc2VyKHRoaXMpKTsKICAgIH0KICAgIGZvciAoTWVtYmVyRW50aXR5IGVsZW1lbnQgaW4gX2NvbmNyZXRlVGFyZ2V0cykgewogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY2FsbGVlID0KICAgICAgICAgIGluZmVycmVyLnR5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKGVsZW1lbnQpOwogICAgICBjYWxsZWUuYWRkQ2FsbChjYWxsZXIsIF9jYWxsKTsKICAgICAgY2FsbGVlLmFkZFVzZXIodGhpcyk7CiAgICAgIGluZmVycmVyLnVwZGF0ZVBhcmFtZXRlckFzc2lnbm1lbnRzKAogICAgICAgICAgdGhpcywgZWxlbWVudCwgYXJndW1lbnRzLCBzZWxlY3RvciwgdHlwZU1hc2ssCiAgICAgICAgICByZW1vdmU6IGZhbHNlLCBhZGRUb1F1ZXVlOiBmYWxzZSk7CiAgICB9CiAgfQoKICAvLy8gYHRydWVgIGlmIHRoaXMgaW52b2NhdGlvbiBjYW4gaGl0IGEgJ2NhbGwnIG1ldGhvZCBvbiBhIGNsb3N1cmUuCiAgYm9vbCBnZXQgaGFzQ2xvc3VyZUNhbGxUYXJnZXRzID0+IF9oYXNDbG9zdXJlQ2FsbFRhcmdldHM7CgogIC8vLyBBbGwgY29uY3JldGUgdGFyZ2V0cyBvZiB0aGlzIGludm9jYXRpb24uIElmIFtoYXNDbG9zdXJlQ2FsbFRhcmdldHNdIGlzCiAgLy8vIGB0cnVlYCB0aGUgaW52b2NhdGlvbiBjYW4gYWRkaXRpb25hbCB0YXJnZXQgYW4gdW5rbm93biBzZXQgb2YgJ2NhbGwnCiAgLy8vIG1ldGhvZHMgb24gY2xvc3VyZXMuCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXQgY29uY3JldGVUYXJnZXRzID0+IF9jb25jcmV0ZVRhcmdldHM7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZ2V0IGNhbGxlZXMgPT4gX2NvbmNyZXRlVGFyZ2V0czsKCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZWRTZWxlY3RvcihJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGUgPSByZWNlaXZlci50eXBlOwoKICAgIGlmIChtYXNrICE9IHJlY2VpdmVyVHlwZSkgewogICAgICByZXR1cm4gcmVjZWl2ZXJUeXBlID09IGluZmVycmVyLmFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUKICAgICAgICAgID8gbnVsbAogICAgICAgICAgOiByZWNlaXZlclR5cGU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbWFzazsKICAgIH0KICB9CgogIGJvb2wgdGFyZ2V0c0luY2x1ZGVDb21wbGV4Tm9TdWNoTWV0aG9kKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gX2NvbmNyZXRlVGFyZ2V0cy5hbnkoKE1lbWJlckVudGl0eSBlKSB7CiAgICAgIHJldHVybiBlLmlzRnVuY3Rpb24gJiYKICAgICAgICAgIGUuaXNJbnN0YW5jZU1lbWJlciAmJgogICAgICAgICAgZS5uYW1lID09IElkZW50aWZpZXJzLm5vU3VjaE1ldGhvZF8gJiYKICAgICAgICAgIGluZmVycmVyLm5vU3VjaE1ldGhvZERhdGEuaXNDb21wbGV4KGUpOwogICAgfSk7CiAgfQoKICAvLy8gV2Ugb3B0aW1pemUgY2VydGFpbiBvcGVyYXRpb25zIG9uIHRoZSBbaW50XSBjbGFzcyBiZWNhdXNlIHdlIGtub3cgbW9yZQogIC8vLyBhYm91dCB0aGVpciByZXR1cm4gdHlwZSB0aGFuIHRoZSBhY3R1YWwgRGFydCBjb2RlLiBGb3IgZXhhbXBsZSwgd2Uga25vdwogIC8vLyBpbnQgKyBpbnQgcmV0dXJucyBhbiBpbnQuIFRoZSBEYXJ0IGxpYnJhcnkgY29kZSBmb3IgW2ludC5vcGVyYXRvcitdIG9ubHkKICAvLy8gc2F5cyBpdCByZXR1cm5zIGEgW251bV0uCiAgLy8vCiAgLy8vIFJldHVybnMgdGhlIG1vcmUgcHJlY2lzZSBUeXBlSW5mb3JtYXRpb24sIG9yIGBudWxsYCB0byBkZWZlciB0byB0aGUKICAvLy8gbGlicmFyeSBjb2RlLgogIFR5cGVJbmZvcm1hdGlvbiBoYW5kbGVJbnRyaXNpZmllZFNlbGVjdG9yKAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSBtYXNrLCBJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkID0gaW5mZXJyZXIuY2xvc2VkV29ybGQ7CiAgICBpZiAobWFzayA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluLmlzSW50ZWdlck9yTnVsbChtYXNrKS5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIXNlbGVjdG9yLmlzQ2FsbCAmJiAhc2VsZWN0b3IuaXNPcGVyYXRvcikgcmV0dXJuIG51bGw7CiAgICBpZiAoIWFyZ3VtZW50cy5uYW1lZC5pc0VtcHR5KSByZXR1cm4gbnVsbDsKICAgIGlmIChhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPiAxKSByZXR1cm4gbnVsbDsKCiAgICBDbGFzc0VudGl0eSB1aW50MzFJbXBsZW1lbnRhdGlvbiA9IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmpzVUludDMxQ2xhc3M7CiAgICBib29sIGlzSW50KGluZm8pID0+IGluZm8udHlwZS5jb250YWluc09ubHlJbnQoY2xvc2VkV29ybGQpOwogICAgYm9vbCBpc0VtcHR5KGluZm8pID0+IGluZm8udHlwZS5pc0VtcHR5OwogICAgYm9vbCBpc1VJbnQzMShpbmZvKSB7CiAgICAgIHJldHVybiBpbmZvLnR5cGUuc2F0aXNmaWVzKHVpbnQzMUltcGxlbWVudGF0aW9uLCBjbG9zZWRXb3JsZCk7CiAgICB9CgogICAgYm9vbCBpc1Bvc2l0aXZlSW50KGluZm8pIHsKICAgICAgcmV0dXJuIGluZm8udHlwZS5zYXRpc2ZpZXMoCiAgICAgICAgICBjbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5qc1Bvc2l0aXZlSW50Q2xhc3MsIGNsb3NlZFdvcmxkKTsKICAgIH0KCiAgICBUeXBlSW5mb3JtYXRpb24gdHJ5TGF0ZXIoKSA9PiBpbmZlcnJlci50eXBlcy5ub25OdWxsRW1wdHlUeXBlOwoKICAgIFR5cGVJbmZvcm1hdGlvbiBhcmd1bWVudCA9CiAgICAgICAgYXJndW1lbnRzLmlzRW1wdHkgPyBudWxsIDogYXJndW1lbnRzLnBvc2l0aW9uYWwuZmlyc3Q7CgogICAgU3RyaW5nIG5hbWUgPSBzZWxlY3Rvci5uYW1lOwogICAgLy8gVGhlc2UgYXJlIHR5cGUgaW5mZXJlbmNlIHJ1bGVzIG9ubHkgZm9yIHVzZWZ1bCBjYXNlcyB0aGF0IGFyZSBub3QKICAgIC8vIGV4cHJlc3NlZCBpbiB0aGUgbGlicmFyeSBjb2RlLCBmb3IgZXhhbXBsZToKICAgIC8vCiAgICAvLyAgICAgaW50ICsgaW50ICAgICAgICAtPiAgaW50CiAgICAvLyAgICAgdWludDMxIHwgdWludDMxICAtPiAgdWludDMxCiAgICAvLwogICAgc3dpdGNoIChuYW1lKSB7CiAgICAgIGNhc2UgJyonOgogICAgICBjYXNlICcrJzoKICAgICAgY2FzZSAnJSc6CiAgICAgIGNhc2UgJ3JlbWFpbmRlcic6CiAgICAgIGNhc2UgJ34vJzoKICAgICAgICBpZiAoaXNFbXB0eShhcmd1bWVudCkpIHJldHVybiB0cnlMYXRlcigpOwogICAgICAgIGlmIChpc1Bvc2l0aXZlSW50KHJlY2VpdmVyKSAmJiBpc1Bvc2l0aXZlSW50KGFyZ3VtZW50KSkgewogICAgICAgICAgLy8gdWludDMxICsgdWludDMxIC0+IHVpbnQzMgogICAgICAgICAgaWYgKG5hbWUgPT0gJysnICYmIGlzVUludDMxKHJlY2VpdmVyKSAmJiBpc1VJbnQzMShhcmd1bWVudCkpIHsKICAgICAgICAgICAgcmV0dXJuIGluZmVycmVyLnR5cGVzLnVpbnQzMlR5cGU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaW5mZXJyZXIudHlwZXMucG9zaXRpdmVJbnRUeXBlOwogICAgICAgIH0KICAgICAgICBpZiAoaXNJbnQoYXJndW1lbnQpKSB7CiAgICAgICAgICByZXR1cm4gaW5mZXJyZXIudHlwZXMuaW50VHlwZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICBjYXNlICd8JzoKICAgICAgY2FzZSAnXic6CiAgICAgICAgaWYgKGlzRW1wdHkoYXJndW1lbnQpKSByZXR1cm4gdHJ5TGF0ZXIoKTsKICAgICAgICBpZiAoaXNVSW50MzEocmVjZWl2ZXIpICYmIGlzVUludDMxKGFyZ3VtZW50KSkgewogICAgICAgICAgcmV0dXJuIGluZmVycmVyLnR5cGVzLnVpbnQzMVR5cGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwoKICAgICAgY2FzZSAnPj4nOgogICAgICAgIGlmIChpc0VtcHR5KGFyZ3VtZW50KSkgcmV0dXJuIHRyeUxhdGVyKCk7CiAgICAgICAgaWYgKGlzVUludDMxKHJlY2VpdmVyKSkgewogICAgICAgICAgcmV0dXJuIGluZmVycmVyLnR5cGVzLnVpbnQzMVR5cGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwoKICAgICAgY2FzZSAnJic6CiAgICAgICAgaWYgKGlzRW1wdHkoYXJndW1lbnQpKSByZXR1cm4gdHJ5TGF0ZXIoKTsKICAgICAgICBpZiAoaXNVSW50MzEocmVjZWl2ZXIpIHx8IGlzVUludDMxKGFyZ3VtZW50KSkgewogICAgICAgICAgcmV0dXJuIGluZmVycmVyLnR5cGVzLnVpbnQzMVR5cGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwoKICAgICAgY2FzZSAnLSc6CiAgICAgICAgaWYgKGlzRW1wdHkoYXJndW1lbnQpKSByZXR1cm4gdHJ5TGF0ZXIoKTsKICAgICAgICBpZiAoaXNJbnQoYXJndW1lbnQpKSB7CiAgICAgICAgICByZXR1cm4gaW5mZXJyZXIudHlwZXMuaW50VHlwZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICBjYXNlICd1bmFyeS0nOgogICAgICAgIC8vIFRoZSByZWNlaXZlciBiZWluZyBhbiBpbnQsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBhbHNvIGJlIGFuIGludC4KICAgICAgICByZXR1cm4gaW5mZXJyZXIudHlwZXMuaW50VHlwZTsKCiAgICAgIGNhc2UgJ2Ficyc6CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5oYXNOb0FyZ3VtZW50cygpCiAgICAgICAgICAgID8gaW5mZXJyZXIudHlwZXMucG9zaXRpdmVJbnRUeXBlCiAgICAgICAgICAgIDogbnVsbDsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQgPSBpbmZlcnJlci5jbG9zZWRXb3JsZDsKICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiA9IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CiAgICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IG9sZFRhcmdldHMgPSBfY29uY3JldGVUYXJnZXRzOwogICAgQWJzdHJhY3RWYWx1ZSB0eXBlTWFzayA9IGNvbXB1dGVUeXBlZFNlbGVjdG9yKGluZmVycmVyKTsKICAgIGluZmVycmVyLnVwZGF0ZVNlbGVjdG9ySW5NZW1iZXIoCiAgICAgICAgY2FsbGVyLCBfY2FsbFR5cGUsIF9jYWxsLCBzZWxlY3RvciwgdHlwZU1hc2spOwoKICAgIF9oYXNDbG9zdXJlQ2FsbFRhcmdldHMgPQogICAgICAgIGNsb3NlZFdvcmxkLmluY2x1ZGVzQ2xvc3VyZUNhbGwoc2VsZWN0b3IsIHR5cGVNYXNrKTsKICAgIF9jb25jcmV0ZVRhcmdldHMgPSBjbG9zZWRXb3JsZC5sb2NhdGVNZW1iZXJzKHNlbGVjdG9yLCB0eXBlTWFzayk7CgogICAgLy8gVXBkYXRlIHRoZSBjYWxsIGdyYXBoIGlmIHRoZSB0YXJnZXRzIGNvdWxkIGhhdmUgY2hhbmdlZC4KICAgIGlmICghaWRlbnRpY2FsKF9jb25jcmV0ZVRhcmdldHMsIG9sZFRhcmdldHMpKSB7CiAgICAgIC8vIEFkZCBjYWxscyB0byBuZXcgdGFyZ2V0cyB0byB0aGUgZ3JhcGguCiAgICAgIF9jb25jcmV0ZVRhcmdldHMKICAgICAgICAgIC53aGVyZSgodGFyZ2V0KSA9PiAhb2xkVGFyZ2V0cy5jb250YWlucyh0YXJnZXQpKQogICAgICAgICAgLmZvckVhY2goKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNhbGxlZSA9CiAgICAgICAgICAgIGluZmVycmVyLnR5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKGVsZW1lbnQpOwogICAgICAgIGNhbGxlZS5hZGRDYWxsKGNhbGxlciwgX2NhbGwpOwogICAgICAgIGNhbGxlZS5hZGRVc2VyKHRoaXMpOwogICAgICAgIGluZmVycmVyLnVwZGF0ZVBhcmFtZXRlckFzc2lnbm1lbnRzKAogICAgICAgICAgICB0aGlzLCBlbGVtZW50LCBhcmd1bWVudHMsIHNlbGVjdG9yLCB0eXBlTWFzaywKICAgICAgICAgICAgcmVtb3ZlOiBmYWxzZSwgYWRkVG9RdWV1ZTogdHJ1ZSk7CiAgICAgIH0pOwoKICAgICAgLy8gV2FsayBvdmVyIHRoZSBvbGQgdGFyZ2V0cywgYW5kIHJlbW92ZSBjYWxscyB0aGF0IGNhbm5vdCBoYXBwZW4gYW55bW9yZS4KICAgICAgb2xkVGFyZ2V0cwogICAgICAgICAgLndoZXJlKCh0YXJnZXQpID0+ICFfY29uY3JldGVUYXJnZXRzLmNvbnRhaW5zKHRhcmdldCkpCiAgICAgICAgICAuZm9yRWFjaCgoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY2FsbGVlID0KICAgICAgICAgICAgaW5mZXJyZXIudHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZWxlbWVudCk7CiAgICAgICAgY2FsbGVlLnJlbW92ZUNhbGwoY2FsbGVyLCBfY2FsbCk7CiAgICAgICAgY2FsbGVlLnJlbW92ZVVzZXIodGhpcyk7CiAgICAgICAgaW5mZXJyZXIudXBkYXRlUGFyYW1ldGVyQXNzaWdubWVudHMoCiAgICAgICAgICAgIHRoaXMsIGVsZW1lbnQsIGFyZ3VtZW50cywgc2VsZWN0b3IsIHR5cGVNYXNrLAogICAgICAgICAgICByZW1vdmU6IHRydWUsIGFkZFRvUXVldWU6IHRydWUpOwogICAgICB9KTsKICAgIH0KCiAgICAvLyBXYWxrIG92ZXIgdGhlIGZvdW5kIHRhcmdldHMsIGFuZCBjb21wdXRlIHRoZSBqb2luZWQgdW5pb24gdHlwZSBtYXNrCiAgICAvLyBmb3IgYWxsIHRoZXNlIHRhcmdldHMuCiAgICBBYnN0cmFjdFZhbHVlIHJlc3VsdDsKICAgIGlmIChfaGFzQ2xvc3VyZUNhbGxUYXJnZXRzKSB7CiAgICAgIHJlc3VsdCA9IGFic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgPSBpbmZlcnJlci50eXBlcwogICAgICAgICAgLmpvaW5UeXBlTWFza3MoX2NvbmNyZXRlVGFyZ2V0cy5tYXAoKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICAgICAgaWYgKGluZmVycmVyLnJldHVybnNMaXN0RWxlbWVudFR5cGUoc2VsZWN0b3IsIHR5cGVNYXNrKSkgewogICAgICAgICAgcmV0dXJuIGFic3RyYWN0VmFsdWVEb21haW4uZ2V0Q29udGFpbmVyRWxlbWVudFR5cGUocmVjZWl2ZXIudHlwZSk7CiAgICAgICAgfSBlbHNlIGlmIChpbmZlcnJlci5yZXR1cm5zTWFwVmFsdWVUeXBlKHNlbGVjdG9yLCB0eXBlTWFzaykpIHsKICAgICAgICAgIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmlzRGljdGlvbmFyeSh0eXBlTWFzaykpIHsKICAgICAgICAgICAgQWJzdHJhY3RWYWx1ZSBhcmcgPSBhcmd1bWVudHMucG9zaXRpb25hbFswXS50eXBlOwogICAgICAgICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0gYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRQcmltaXRpdmVWYWx1ZShhcmcpOwogICAgICAgICAgICBpZiAodmFsdWUgaXMgU3RyaW5nQ29uc3RhbnRWYWx1ZSkgewogICAgICAgICAgICAgIFN0cmluZyBrZXkgPSB2YWx1ZS5zdHJpbmdWYWx1ZTsKICAgICAgICAgICAgICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5jb250YWluc0RpY3Rpb25hcnlLZXkodHlwZU1hc2ssIGtleSkpIHsKICAgICAgICAgICAgICAgIGlmIChkZWJ1Zy5WRVJCT1NFKSB7CiAgICAgICAgICAgICAgICAgIHByaW50KCJEaWN0aW9uYXJ5IGxvb2t1cCBmb3IgJGtleSB5aWVsZHMgIgogICAgICAgICAgICAgICAgICAgICAgIiR7YWJzdHJhY3RWYWx1ZURvbWFpbi5nZXREaWN0aW9uYXJ5VmFsdWVGb3JLZXkodHlwZU1hc2ssIGtleSl9LiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGFic3RyYWN0VmFsdWVEb21haW4uZ2V0RGljdGlvbmFyeVZhbHVlRm9yS2V5KAogICAgICAgICAgICAgICAgICAgIHR5cGVNYXNrLCBrZXkpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBUaGUgdHlwZU1hcCBpcyBwcmVjaXNlLCBzbyBpZiB3ZSBkbyBub3QgZmluZCB0aGUga2V5LCB0aGUKICAgICAgICAgICAgICAgIC8vIGxvb2t1cCB3aWxsIGJlIFtudWxsXSBhdCBydW50aW1lLgogICAgICAgICAgICAgICAgaWYgKGRlYnVnLlZFUkJPU0UpIHsKICAgICAgICAgICAgICAgICAgcHJpbnQoIkRpY3Rpb25hcnkgbG9va3VwIGZvciAka2V5IHlpZWxkcyBbbnVsbF0uIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gaW5mZXJyZXIudHlwZXMubnVsbFR5cGUudHlwZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGFzc2VydChhYnN0cmFjdFZhbHVlRG9tYWluLmlzTWFwKHR5cGVNYXNrKSk7CiAgICAgICAgICBpZiAoZGVidWcuVkVSQk9TRSkgewogICAgICAgICAgICBwcmludCgiTWFwIGxvb2t1cCBmb3IgJHNlbGVjdG9yIHlpZWxkcyAiCiAgICAgICAgICAgICAgICAiJHthYnN0cmFjdFZhbHVlRG9tYWluLmdldE1hcFZhbHVlVHlwZSh0eXBlTWFzayl9LiIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGFic3RyYWN0VmFsdWVEb21haW4uZ2V0TWFwVmFsdWVUeXBlKHR5cGVNYXNrKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgVHlwZUluZm9ybWF0aW9uIGluZm8gPQogICAgICAgICAgICAgIGhhbmRsZUludHJpc2lmaWVkU2VsZWN0b3Ioc2VsZWN0b3IsIHR5cGVNYXNrLCBpbmZlcnJlcik7CiAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSByZXR1cm4gaW5mby50eXBlOwogICAgICAgICAgcmV0dXJuIGluZmVycmVyLnR5cGVPZk1lbWJlcldpdGhTZWxlY3RvcihlbGVtZW50LCBzZWxlY3RvcikudHlwZTsKICAgICAgICB9CiAgICAgIH0pKTsKICAgIH0KICAgIGlmIChpc0NvbmRpdGlvbmFsICYmCiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5pc051bGwocmVjZWl2ZXIudHlwZSkuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgLy8gQ29uZGl0aW9uYWwgY2FsbCBzaXRlcyAoZS5nLiBgYT8uYmApIG1heSBiZSBudWxsIGlmIHRoZSByZWNlaXZlciBpcwogICAgICAvLyBudWxsLgogICAgICByZXN1bHQgPSBhYnN0cmFjdFZhbHVlRG9tYWluLmluY2x1ZGVOdWxsKHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBnaXZlVXAoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIsIHtib29sIGNsZWFyQXNzaWdubWVudHM6IHRydWV9KSB7CiAgICBpZiAoIWFiYW5kb25JbmZlcmVuY2luZykgewogICAgICBpbmZlcnJlci51cGRhdGVTZWxlY3RvckluTWVtYmVyKGNhbGxlciwgX2NhbGxUeXBlLCBfY2FsbCwgc2VsZWN0b3IsIG1hc2spOwogICAgICBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IG9sZFRhcmdldHMgPSBfY29uY3JldGVUYXJnZXRzOwogICAgICBfaGFzQ2xvc3VyZUNhbGxUYXJnZXRzID0KICAgICAgICAgIGluZmVycmVyLmNsb3NlZFdvcmxkLmluY2x1ZGVzQ2xvc3VyZUNhbGwoc2VsZWN0b3IsIG1hc2spOwogICAgICBfY29uY3JldGVUYXJnZXRzID0gaW5mZXJyZXIuY2xvc2VkV29ybGQubG9jYXRlTWVtYmVycyhzZWxlY3RvciwgbWFzayk7CiAgICAgIGZvciAoTWVtYmVyRW50aXR5IGVsZW1lbnQgaW4gX2NvbmNyZXRlVGFyZ2V0cykgewogICAgICAgIGlmICghb2xkVGFyZ2V0cy5jb250YWlucyhlbGVtZW50KSkgewogICAgICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNhbGxlZSA9CiAgICAgICAgICAgICAgaW5mZXJyZXIudHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZWxlbWVudCk7CiAgICAgICAgICBjYWxsZWUuYWRkQ2FsbChjYWxsZXIsIF9jYWxsKTsKICAgICAgICAgIGluZmVycmVyLnVwZGF0ZVBhcmFtZXRlckFzc2lnbm1lbnRzKAogICAgICAgICAgICAgIHRoaXMsIGVsZW1lbnQsIGFyZ3VtZW50cywgc2VsZWN0b3IsIG1hc2ssCiAgICAgICAgICAgICAgcmVtb3ZlOiBmYWxzZSwgYWRkVG9RdWV1ZTogdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBzdXBlci5naXZlVXAoaW5mZXJyZXIsIGNsZWFyQXNzaWdubWVudHM6IGNsZWFyQXNzaWdubWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZW1vdmVBbmRDbGVhclJlZmVyZW5jZXMoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIGZvciAoTWVtYmVyRW50aXR5IGVsZW1lbnQgaW4gX2NvbmNyZXRlVGFyZ2V0cykgewogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY2FsbGVlID0KICAgICAgICAgIGluZmVycmVyLnR5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKGVsZW1lbnQpOwogICAgICBjYWxsZWUucmVtb3ZlVXNlcih0aGlzKTsKICAgIH0KICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudHMuZm9yRWFjaCgoaW5mbykgPT4gaW5mby5yZW1vdmVVc2VyKHRoaXMpKTsKICAgIH0KICAgIHN1cGVyLnJlbW92ZUFuZENsZWFyUmVmZXJlbmNlcyhpbmZlcnJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnQ2FsbCBzaXRlICRkZWJ1Z05hbWUgb24gJHtyZWNlaXZlci50eXBlfSAkdHlwZSc7CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNTdGFibGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gcmVjZWl2ZXIuaXNTdGFibGUgJiYKICAgICAgICBfY29uY3JldGVUYXJnZXRzLmV2ZXJ5KChNZW1iZXJFbnRpdHkgZWxlbWVudCkgPT4KICAgICAgICAgICAgaW5mZXJyZXIudHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZWxlbWVudCkuaXNTdGFibGUpICYmCiAgICAgICAgKGFyZ3VtZW50cyA9PSBudWxsIHx8IGFyZ3VtZW50cy5ldmVyeSgoaW5mbykgPT4gaW5mby5pc1N0YWJsZSkpICYmCiAgICAgICAgc3VwZXIuaGFzU3RhYmxlVHlwZShpbmZlcnJlcik7CiAgfQp9CgpjbGFzcyBDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiB7CiAgZmluYWwgVHlwZUluZm9ybWF0aW9uIGNsb3N1cmU7CgogIENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbigKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dCwKICAgICAgT2JqZWN0IGNhbGwsCiAgICAgIE1lbWJlckVudGl0eSBlbmNsb3NpbmcsCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssCiAgICAgIHRoaXMuY2xvc3VyZSwKICAgICAgQXJndW1lbnRzVHlwZXMgYXJndW1lbnRzLAogICAgICBib29sIGluTG9vcCkKICAgICAgOiBzdXBlcihhYnN0cmFjdFZhbHVlRG9tYWluLCBjb250ZXh0LCBjYWxsLCBlbmNsb3NpbmcsIHNlbGVjdG9yLCBtYXNrLAogICAgICAgICAgICBhcmd1bWVudHMsIGluTG9vcCk7CgogIEBvdmVycmlkZQogIHZvaWQgYWRkVG9HcmFwaChJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgYXJndW1lbnRzLmZvckVhY2goKGluZm8pID0+IGluZm8uYWRkVXNlcih0aGlzKSk7CiAgICBjbG9zdXJlLmFkZFVzZXIodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSA9PiBzYWZlVHlwZShpbmZlcnJlcik7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZ2V0IGNhbGxlZXMgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBjb21wdXRlIGNhbGxlZXMgb2YgYSBjbG9zdXJlIGNhbGwuIik7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnQ2xvc3VyZSBjYWxsICRkZWJ1Z05hbWUgb24gJGNsb3N1cmUnOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVtb3ZlQW5kQ2xlYXJSZWZlcmVuY2VzKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICAvLyBUaGlzIG1ldGhvZCBpcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgZm9sbG93aW5nIGNvbW1lbnQ6CiAgICAvLyBXZSBzaG91bGQgbWFpbnRhaW4gdGhlIGluZm9ybWF0aW9uIHRoYXQgdGhlIGNsb3N1cmUgaXMgYSB1c2VyCiAgICAvLyBvZiBpdHMgYXJndW1lbnRzIGJlY2F1c2Ugd2UgZG8gbm90IGNoZWNrIHRoYXQgdGhlIGFyZ3VtZW50cwogICAgLy8gaGF2ZSBhIHN0YWJsZSB0eXBlIGZvciBhIGNsb3N1cmUgY2FsbCB0byBiZSBzdGFibGU7IG91ciB0cmFjaW5nCiAgICAvLyBhbmFseXNpcyB3YW50IHRvIGtub3cgd2hldGhlciBhbiAobm9uLXN0YWJsZSkgYXJndW1lbnQgaXMKICAgIC8vIHBhc3NlZCB0byBhIGNsb3N1cmUuCiAgICByZXR1cm4gc3VwZXIucmVtb3ZlQW5kQ2xlYXJSZWZlcmVuY2VzKGluZmVycmVyKTsKICB9Cn0KCi8vLyBBIFtDb25jcmV0ZVR5cGVJbmZvcm1hdGlvbl0gcmVwcmVzZW50cyBhIHR5cGUgdGhhdCBuZWVkZWQKLy8vIHRvIGJlIG1hdGVyaWFsaXplZCBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIHRoZSBncmFwaC4gRm9yIGV4YW1wbGUsCi8vLyBsaXRlcmFscywgWzp0aGlzOl0gb3IgWzpzdXBlcjpdIG5lZWQgYSBbQ29uY3JldGVUeXBlSW5mb3JtYXRpb25dLgovLy8KLy8vIFtDb25jcmV0ZVR5cGVJbmZvcm1hdGlvbl0gbm9kZXMgaGF2ZSBubyBhc3NpZ25tZW50LiBBbHNvLCB0byBzYXZlCi8vLyBvbiBtZW1vcnksIHdlIGRvIG5vdCBhZGQgdXNlcnMgdG8gW0NvbmNyZXRlVHlwZUluZm9ybWF0aW9uXSBub2RlcywKLy8vIGJlY2F1c2Ugd2Uga25vdyBzdWNoIG5vZGUgd2lsbCBuZXZlciBiZSByZWZpbmVkIHRvIGEgZGlmZmVyZW50Ci8vLyB0eXBlLgpjbGFzcyBDb25jcmV0ZVR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIFR5cGVJbmZvcm1hdGlvbiB7CiAgQ29uY3JldGVUeXBlSW5mb3JtYXRpb24oQWJzdHJhY3RWYWx1ZSB0eXBlKSA6IHN1cGVyLnVudHJhY2tlZCh0eXBlKSB7CiAgICB0aGlzLmlzU3RhYmxlID0gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ29uY3JldGUgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRVc2VyKFR5cGVJbmZvcm1hdGlvbiB1c2VyKSB7CiAgICAvLyBOb3RoaW5nIHRvIGRvLCBhIGNvbmNyZXRlIHR5cGUgZG9lcyBub3QgZ2V0IHVwZGF0ZWQgc28gbmV2ZXIKICAgIC8vIG5lZWRzIHRvIG5vdGlmeSBpdHMgdXNlcnMuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFVzZXJzT2YoVHlwZUluZm9ybWF0aW9uIG90aGVyKSB7CiAgICAvLyBOb3RoaW5nIHRvIGRvLCBhIGNvbmNyZXRlIHR5cGUgZG9lcyBub3QgZ2V0IHVwZGF0ZWQgc28gbmV2ZXIKICAgIC8vIG5lZWRzIHRvIG5vdGlmeSBpdHMgdXNlcnMuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlbW92ZVVzZXIoVHlwZUluZm9ybWF0aW9uIHVzZXIpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkQXNzaWdubWVudChUeXBlSW5mb3JtYXRpb24gYXNzaWdubWVudCkgewogICAgdGhyb3cgIk5vdCBzdXBwb3J0ZWQiOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZW1vdmVBc3NpZ25tZW50KFR5cGVJbmZvcm1hdGlvbiBhc3NpZ25tZW50KSB7CiAgICB0aHJvdyAiTm90IHN1cHBvcnRlZCI7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSA9PiB0eXBlOwoKICBAb3ZlcnJpZGUKICBib29sIHJlc2V0KEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICB0aHJvdyAiTm90IHN1cHBvcnRlZCI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnVHlwZSAkdHlwZSc7CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q29uY3JldGVUeXBlSW5mb3JtYXRpb24odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc1N0YWJsZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpID0+IHRydWU7Cn0KCmNsYXNzIFN0cmluZ0xpdGVyYWxUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBDb25jcmV0ZVR5cGVJbmZvcm1hdGlvbiB7CiAgZmluYWwgU3RyaW5nIHZhbHVlOwoKICBTdHJpbmdMaXRlcmFsVHlwZUluZm9ybWF0aW9uKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sIHRoaXMudmFsdWUsIEFic3RyYWN0VmFsdWUgbWFzaykKICAgICAgOiBzdXBlcihhYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZVByaW1pdGl2ZVZhbHVlKAogICAgICAgICAgICBtYXNrLCBuZXcgU3RyaW5nQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpKTsKCiAgU3RyaW5nIGFzU3RyaW5nKCkgPT4gdmFsdWU7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1R5cGUgJHR5cGUgdmFsdWUgJHt2YWx1ZX0nOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFN0cmluZ0xpdGVyYWxUeXBlSW5mb3JtYXRpb24odGhpcyk7CiAgfQp9CgpjbGFzcyBCb29sTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIENvbmNyZXRlVHlwZUluZm9ybWF0aW9uIHsKICBmaW5hbCBib29sIHZhbHVlOwoKICBCb29sTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbigKICAgICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLCB0aGlzLnZhbHVlLCBBYnN0cmFjdFZhbHVlIG1hc2spCiAgICAgIDogc3VwZXIoYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVQcmltaXRpdmVWYWx1ZSgKICAgICAgICAgICAgbWFzaywgdmFsdWUgPyBuZXcgVHJ1ZUNvbnN0YW50VmFsdWUoKSA6IG5ldyBGYWxzZUNvbnN0YW50VmFsdWUoKSkpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnVHlwZSAkdHlwZSB2YWx1ZSAke3ZhbHVlfSc7CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Qm9vbExpdGVyYWxUeXBlSW5mb3JtYXRpb24odGhpcyk7CiAgfQp9CgovLy8gQSBbTmFycm93VHlwZUluZm9ybWF0aW9uXSBuYXJyb3dzIGEgW1R5cGVJbmZvcm1hdGlvbl0gdG8gYSB0eXBlLAovLy8gcmVwcmVzZW50ZWQgaW4gW3R5cGVBbm5vdGF0aW9uXS4KLy8vCi8vLyBBIFtOYXJyb3dUeXBlSW5mb3JtYXRpb25dIG5vZGUgaGFzIG9ubHkgb25lIGFzc2lnbm1lbnQ6IHRoZQovLy8gW1R5cGVJbmZvcm1hdGlvbl0gaXQgbmFycm93cy4KLy8vCi8vLyBbTmFycm93VHlwZUluZm9ybWF0aW9uXSBub2RlcyBhcmUgY3JlYXRlZCBmb3I6Ci8vLwovLy8gLSBDb2RlIGFmdGVyIGBpc2AgYW5kIGBhc2AgY2hlY2tzLCB3aGVyZSB3ZSBoYXZlIG1vcmUgaW5mb3JtYXRpb24KLy8vICAgb24gdGhlIHR5cGUgb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgZXhwcmVzc2lvbi4KLy8vCi8vLyAtIENvZGUgYWZ0ZXIgYSBkeW5hbWljIGNhbGwsIHdoZXJlIHdlIGhhdmUgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUKLy8vICAgdHlwZSBvZiB0aGUgcmVjZWl2ZXI6IGl0IGNhbiBvbmx5IGJlIG9mIGEgY2xhc3MgdGhhdCBob2xkcyBhCi8vLyAgIHBvdGVudGlhbCB0YXJnZXQgb2YgdGhpcyBkeW5hbWljIGNhbGwuCi8vLwovLy8gLSBJbiBjaGVja2VkIG1vZGUsIGFmdGVyIGEgdHlwZSBhbm5vdGF0aW9uLCB3ZSBoYXZlIG1vcmUKLy8vICAgaW5mb3JtYXRpb24gb24gdGhlIHR5cGUgb2YgYSBsb2NhbC4KY2xhc3MgTmFycm93VHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgVHlwZUluZm9ybWF0aW9uIHsKICBmaW5hbCBBYnN0cmFjdFZhbHVlIHR5cGVBbm5vdGF0aW9uOwoKICBOYXJyb3dUeXBlSW5mb3JtYXRpb24oQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBUeXBlSW5mb3JtYXRpb24gbmFycm93ZWRUeXBlLCB0aGlzLnR5cGVBbm5vdGF0aW9uKQogICAgICA6IHN1cGVyKGFic3RyYWN0VmFsdWVEb21haW4uZW1wdHlUeXBlLCBuYXJyb3dlZFR5cGUuY29udGV4dCkgewogICAgYWRkQXNzaWdubWVudChuYXJyb3dlZFR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYWRkQXNzaWdubWVudChUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgc3VwZXIuYWRkQXNzaWdubWVudChpbmZvKTsKICAgIGFzc2VydChhc3NpZ25tZW50cy5sZW5ndGggPT0gMSk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4gPSBpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluOwogICAgQWJzdHJhY3RWYWx1ZSBpbnB1dCA9IGFzc2lnbm1lbnRzLmZpcnN0LnR5cGU7CiAgICBBYnN0cmFjdFZhbHVlIGludGVyc2VjdGlvbiA9CiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5pbnRlcnNlY3Rpb24oaW5wdXQsIHR5cGVBbm5vdGF0aW9uKTsKICAgIGlmIChkZWJ1Zy5BTk9NQUxZX1dBUk4pIHsKICAgICAgaWYgKGFic3RyYWN0VmFsdWVEb21haW4uY29udGFpbnMoaW5wdXQsIGludGVyc2VjdGlvbikuaXNEZWZpbml0ZWx5RmFsc2UgfHwKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgICAgICAuY29udGFpbnModHlwZUFubm90YXRpb24sIGludGVyc2VjdGlvbikKICAgICAgICAgICAgICAuaXNEZWZpbml0ZWx5RmFsc2UpIHsKICAgICAgICBwcmludCgiQU5PTUFMWSBXQVJOSU5HOiBuYXJyb3dlZCAkaW5wdXQgdG8gJGludGVyc2VjdGlvbiB2aWEgIgogICAgICAgICAgICAiJHR5cGVBbm5vdGF0aW9uIik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpbnRlcnNlY3Rpb247CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ05hcnJvdyB0byAkdHlwZUFubm90YXRpb24gJHR5cGUnOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KFR5cGVJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXROYXJyb3dUeXBlSW5mb3JtYXRpb24odGhpcyk7CiAgfQp9CgovLy8gQW4gW0luZmVycmVkVHlwZUluZm9ybWF0aW9uXSBpcyBhIFtUeXBlSW5mb3JtYXRpb25dIHRoYXQKLy8vIGRlZmF1bHRzIHRvIHRoZSBkeW5hbWljIHR5cGUgdW50aWwgaXQgaXMgbWFya2VkIGFzIGJlaW5nCi8vLyBpbmZlcnJlZCwgYXQgd2hpY2ggcG9pbnQgaXQgY29tcHV0ZXMgaXRzIHR5cGUgYmFzZWQgb24KLy8vIGl0cyBhc3NpZ25tZW50cy4KYWJzdHJhY3QgY2xhc3MgSW5mZXJyZWRUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBUeXBlSW5mb3JtYXRpb24gewogIC8vLyBXaGV0aGVyIHRoZSBlbGVtZW50IHR5cGUgaW4gdGhhdCBjb250YWluZXIgaGFzIGJlZW4gaW5mZXJyZWQuCiAgYm9vbCBpbmZlcnJlZCA9IGZhbHNlOwoKICBJbmZlcnJlZFR5cGVJbmZvcm1hdGlvbihBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjb250ZXh0LCBUeXBlSW5mb3JtYXRpb24gcGFyZW50VHlwZSkKICAgICAgOiBzdXBlcihhYnN0cmFjdFZhbHVlRG9tYWluLmVtcHR5VHlwZSwgY29udGV4dCkgewogICAgaWYgKHBhcmVudFR5cGUgIT0gbnVsbCkgYWRkQXNzaWdubWVudChwYXJlbnRUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIGlmICghaW5mZXJyZWQpIHJldHVybiBzYWZlVHlwZShpbmZlcnJlcik7CiAgICByZXR1cm4gaW5mZXJyZXIudHlwZXMuY29tcHV0ZVR5cGVNYXNrKGFzc2lnbm1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzU3RhYmxlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVkICYmIHN1cGVyLmhhc1N0YWJsZVR5cGUoaW5mZXJyZXIpOwogIH0KfQoKLy8vIEEgW0xpc3RUeXBlSW5mb3JtYXRpb25dIGlzIGEgW1R5cGVJbmZvcm1hdGlvbl0gY3JlYXRlZAovLy8gZm9yIGVhY2ggYExpc3RgIGluc3RhbnRpYXRpb25zLgpjbGFzcyBMaXN0VHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgVHlwZUluZm9ybWF0aW9uIHdpdGggVHJhY2VkVHlwZUluZm9ybWF0aW9uIHsKICBmaW5hbCBFbGVtZW50SW5Db250YWluZXJUeXBlSW5mb3JtYXRpb24gZWxlbWVudFR5cGU7CgogIC8vLyBUaGUgY29udGFpbmVyIHR5cGUgYmVmb3JlIGl0IGlzIGluZmVycmVkLgogIGZpbmFsIEFic3RyYWN0VmFsdWUgb3JpZ2luYWxUeXBlOwoKICAvLy8gVGhlIGxlbmd0aCBhdCB0aGUgYWxsb2NhdGlvbiBzaXRlLgogIGZpbmFsIGludCBvcmlnaW5hbExlbmd0aDsKCiAgLy8vIFRoZSBsZW5ndGggYWZ0ZXIgdGhlIGNvbnRhaW5lciBoYXMgYmVlbiB0cmFjZWQuCiAgaW50IGluZmVycmVkTGVuZ3RoOwoKICAvLy8gV2hldGhlciB0aGlzIGxpc3QgZ29lcyB0aHJvdWdoIGEgZ3Jvd2FibGUgY2hlY2suCiAgLy8vIFdlIGNvbnNlcnZhdGl2ZWx5IGFzc3VtZSBpdCBkb2VzLgogIGJvb2wgY2hlY2tzR3Jvd2FibGUgPSB0cnVlOwoKICBMaXN0VHlwZUluZm9ybWF0aW9uKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjb250ZXh0LAogICAgICB0aGlzLm9yaWdpbmFsVHlwZSwKICAgICAgdGhpcy5lbGVtZW50VHlwZSwKICAgICAgdGhpcy5vcmlnaW5hbExlbmd0aCkKICAgICAgOiBzdXBlcihvcmlnaW5hbFR5cGUsIGNvbnRleHQpIHsKICAgIGluZmVycmVkTGVuZ3RoID0gYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRDb250YWluZXJMZW5ndGgob3JpZ2luYWxUeXBlKTsKICAgIGVsZW1lbnRUeXBlLmFkZFVzZXIodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnTGlzdCB0eXBlICR0eXBlJzsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KFR5cGVJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRMaXN0VHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNTdGFibGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gZWxlbWVudFR5cGUuaXNTdGFibGUgJiYgc3VwZXIuaGFzU3RhYmxlVHlwZShpbmZlcnJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4gPSBpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gdHlwZTsKICAgIGlmICghYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0NvbnRhaW5lcih0eXBlKSB8fAogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZ2V0Q29udGFpbmVyRWxlbWVudFR5cGUodHlwZSkgIT0gZWxlbWVudFR5cGUudHlwZSB8fAogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZ2V0Q29udGFpbmVyTGVuZ3RoKHR5cGUpICE9IGluZmVycmVkTGVuZ3RoKSB7CiAgICAgIHJldHVybiBhYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZUNvbnRhaW5lclZhbHVlKAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRHZW5lcmFsaXphdGlvbihvcmlnaW5hbFR5cGUpLAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRBbGxvY2F0aW9uTm9kZShvcmlnaW5hbFR5cGUpLAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRBbGxvY2F0aW9uRWxlbWVudChvcmlnaW5hbFR5cGUpLAogICAgICAgICAgZWxlbWVudFR5cGUudHlwZSwKICAgICAgICAgIGluZmVycmVkTGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiBtYXNrOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBzYWZlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgPT4gb3JpZ2luYWxUeXBlOwoKICBAb3ZlcnJpZGUKICB2b2lkIGNsZWFudXAoKSB7CiAgICBzdXBlci5jbGVhbnVwKCk7CiAgICBlbGVtZW50VHlwZS5jbGVhbnVwKCk7CiAgICBfZmxvd3NJbnRvID0gbnVsbDsKICB9Cn0KCi8vLyBBbiBbRWxlbWVudEluQ29udGFpbmVyVHlwZUluZm9ybWF0aW9uXSBob2xkcyB0aGUgY29tbW9uIHR5cGUgb2YgdGhlCi8vLyBlbGVtZW50cyBpbiBhIFtMaXN0VHlwZUluZm9ybWF0aW9uXS4KY2xhc3MgRWxlbWVudEluQ29udGFpbmVyVHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgSW5mZXJyZWRUeXBlSW5mb3JtYXRpb24gewogIEVsZW1lbnRJbkNvbnRhaW5lclR5cGVJbmZvcm1hdGlvbihBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjb250ZXh0LCBlbGVtZW50VHlwZSkKICAgICAgOiBzdXBlcihhYnN0cmFjdFZhbHVlRG9tYWluLCBjb250ZXh0LCBlbGVtZW50VHlwZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdFbGVtZW50IGluIGNvbnRhaW5lciAkdHlwZSc7CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RWxlbWVudEluQ29udGFpbmVyVHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KfQoKLy8vIEEgW1NldFR5cGVJbmZvcm1hdGlvbl0gaXMgYSBbVHlwZUluZm9ybWF0aW9uXSBjcmVhdGVkIGZvciBzZXRzLgpjbGFzcyBTZXRUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBUeXBlSW5mb3JtYXRpb24gd2l0aCBUcmFjZWRUeXBlSW5mb3JtYXRpb24gewogIGZpbmFsIEVsZW1lbnRJblNldFR5cGVJbmZvcm1hdGlvbiBlbGVtZW50VHlwZTsKCiAgZmluYWwgQWJzdHJhY3RWYWx1ZSBvcmlnaW5hbFR5cGU7CgogIFNldFR5cGVJbmZvcm1hdGlvbigKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsIHRoaXMub3JpZ2luYWxUeXBlLCB0aGlzLmVsZW1lbnRUeXBlKQogICAgICA6IHN1cGVyKG9yaWdpbmFsVHlwZSwgY29udGV4dCkgewogICAgZWxlbWVudFR5cGUuYWRkVXNlcih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdTZXQgdHlwZSAkdHlwZSc7CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U2V0VHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluID0gaW5mZXJyZXIuYWJzdHJhY3RWYWx1ZURvbWFpbjsKICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IHR5cGU7CiAgICBpZiAoIWFic3RyYWN0VmFsdWVEb21haW4uaXNTZXQodHlwZSkgfHwKICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmdldFNldEVsZW1lbnRUeXBlKHR5cGUpICE9IGVsZW1lbnRUeXBlLnR5cGUpIHsKICAgICAgcmV0dXJuIGFic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlU2V0VmFsdWUoCiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmdldEdlbmVyYWxpemF0aW9uKG9yaWdpbmFsVHlwZSksCiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmdldEFsbG9jYXRpb25Ob2RlKG9yaWdpbmFsVHlwZSksCiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmdldEFsbG9jYXRpb25FbGVtZW50KG9yaWdpbmFsVHlwZSksCiAgICAgICAgICBlbGVtZW50VHlwZS50eXBlKTsKICAgIH0KICAgIHJldHVybiBtYXNrOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBzYWZlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgPT4gb3JpZ2luYWxUeXBlOwoKICBAb3ZlcnJpZGUKICBib29sIGhhc1N0YWJsZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBlbGVtZW50VHlwZS5pc1N0YWJsZSAmJiBzdXBlci5oYXNTdGFibGVUeXBlKGluZmVycmVyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xlYW51cCgpIHsKICAgIHN1cGVyLmNsZWFudXAoKTsKICAgIGVsZW1lbnRUeXBlLmNsZWFudXAoKTsKICAgIF9mbG93c0ludG8gPSBudWxsOwogIH0KfQoKLy8vIEFuIFtFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb25dIGhvbGRzIHRoZSBjb21tb24gdHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gYQovLy8gW1NldFR5cGVJbmZvcm1hdGlvbl0uCmNsYXNzIEVsZW1lbnRJblNldFR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIEluZmVycmVkVHlwZUluZm9ybWF0aW9uIHsKICBFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb24oQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dCwgZWxlbWVudFR5cGUpCiAgICAgIDogc3VwZXIoYWJzdHJhY3RWYWx1ZURvbWFpbiwgY29udGV4dCwgZWxlbWVudFR5cGUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRWxlbWVudCBpbiBzZXQgJHR5cGUnOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEVsZW1lbnRJblNldFR5cGVJbmZvcm1hdGlvbih0aGlzKTsKICB9Cn0KCi8vLyBBIFtNYXBUeXBlSW5mb3JtYXRpb25dIGlzIGEgW1R5cGVJbmZvcm1hdGlvbl0gY3JlYXRlZAovLy8gZm9yIG1hcHMuCmNsYXNzIE1hcFR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIFR5cGVJbmZvcm1hdGlvbiB3aXRoIFRyYWNlZFR5cGVJbmZvcm1hdGlvbiB7CiAgLy8gV2hlbiBpbiBEaWN0aW9uYXJ5IG1vZGUsIHRoaXMgbWFwIHRyYWNrcyB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIHRoYXQKICAvLyBoYXZlIGJlZW4gYXNzaWduZWQgdG8gYSBzcGVjaWZpYyBbU3RyaW5nXSBrZXkuCiAgZmluYWwgTWFwPFN0cmluZywgVmFsdWVJbk1hcFR5cGVJbmZvcm1hdGlvbj4gdHlwZUluZm9NYXAgPSB7fTsKICAvLyBUaGVzZSBmaWVsZHMgdHJhY2sgdGhlIG92ZXJhbGwgdHlwZSBvZiB0aGUga2V5cy92YWx1ZXMgaW4gdGhlIG1hcC4KICBmaW5hbCBLZXlJbk1hcFR5cGVJbmZvcm1hdGlvbiBrZXlUeXBlOwogIGZpbmFsIFZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb24gdmFsdWVUeXBlOwogIGZpbmFsIEFic3RyYWN0VmFsdWUgb3JpZ2luYWxUeXBlOwoKICAvLyBTZXQgdG8gZmFsc2UgaWYgYSBzdGF0aWNhbGx5IHVua25vd24ga2V5IGZsb3dzIGludG8gdGhpcyBtYXAuCiAgYm9vbCBfYWxsS2V5c0FyZVN0cmluZ3MgPSB0cnVlOwoKICBib29sIGdldCBpbkRpY3Rpb25hcnlNb2RlID0+ICFiYWlsZWRPdXQgJiYgX2FsbEtleXNBcmVTdHJpbmdzOwoKICBNYXBUeXBlSW5mb3JtYXRpb24oTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsIHRoaXMub3JpZ2luYWxUeXBlLAogICAgICB0aGlzLmtleVR5cGUsIHRoaXMudmFsdWVUeXBlKQogICAgICA6IHN1cGVyKG9yaWdpbmFsVHlwZSwgY29udGV4dCkgewogICAga2V5VHlwZS5hZGRVc2VyKHRoaXMpOwogICAgdmFsdWVUeXBlLmFkZFVzZXIodGhpcyk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gYWRkRW50cnlBc3NpZ25tZW50KEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgVHlwZUluZm9ybWF0aW9uIGtleSwgVHlwZUluZm9ybWF0aW9uIHZhbHVlLAogICAgICBbYm9vbCBub25OdWxsID0gZmFsc2VdKSB7CiAgICBUeXBlSW5mb3JtYXRpb24gbmV3SW5mbyA9IG51bGw7CiAgICBpZiAoX2FsbEtleXNBcmVTdHJpbmdzICYmIGtleSBpcyBTdHJpbmdMaXRlcmFsVHlwZUluZm9ybWF0aW9uKSB7CiAgICAgIFN0cmluZyBrZXlTdHJpbmcgPSBrZXkuYXNTdHJpbmcoKTsKICAgICAgdHlwZUluZm9NYXAucHV0SWZBYnNlbnQoa2V5U3RyaW5nLCAoKSB7CiAgICAgICAgbmV3SW5mbyA9IG5ldyBWYWx1ZUluTWFwVHlwZUluZm9ybWF0aW9uKAogICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLCBjb250ZXh0LCBudWxsLCBub25OdWxsKTsKICAgICAgICByZXR1cm4gbmV3SW5mbzsKICAgICAgfSk7CiAgICAgIHR5cGVJbmZvTWFwW2tleVN0cmluZ10uYWRkQXNzaWdubWVudCh2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICBfYWxsS2V5c0FyZVN0cmluZ3MgPSBmYWxzZTsKICAgICAgdHlwZUluZm9NYXAuY2xlYXIoKTsKICAgIH0KICAgIGtleVR5cGUuYWRkQXNzaWdubWVudChrZXkpOwogICAgdmFsdWVUeXBlLmFkZEFzc2lnbm1lbnQodmFsdWUpOwogICAgaWYgKG5ld0luZm8gIT0gbnVsbCkgbmV3SW5mby5hZGRVc2VyKHRoaXMpOwoKICAgIHJldHVybiBuZXdJbmZvOwogIH0KCiAgTGlzdDxUeXBlSW5mb3JtYXRpb24+IGFkZE1hcEFzc2lnbm1lbnQoCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwgTWFwVHlwZUluZm9ybWF0aW9uIG90aGVyKSB7CiAgICBMaXN0PFR5cGVJbmZvcm1hdGlvbj4gbmV3SW5mb3MgPSA8VHlwZUluZm9ybWF0aW9uPltdOwogICAgaWYgKF9hbGxLZXlzQXJlU3RyaW5ncyAmJiBvdGhlci5pbkRpY3Rpb25hcnlNb2RlKSB7CiAgICAgIG90aGVyLnR5cGVJbmZvTWFwLmZvckVhY2goKGtleVN0cmluZywgdmFsdWUpIHsKICAgICAgICB0eXBlSW5mb01hcC5wdXRJZkFic2VudChrZXlTdHJpbmcsICgpIHsKICAgICAgICAgIFR5cGVJbmZvcm1hdGlvbiBuZXdJbmZvID0gbmV3IFZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbiwgY29udGV4dCwgbnVsbCwgZmFsc2UpOwogICAgICAgICAgbmV3SW5mb3MuYWRkKG5ld0luZm8pOwogICAgICAgICAgcmV0dXJuIG5ld0luZm87CiAgICAgICAgfSk7CiAgICAgICAgdHlwZUluZm9NYXBba2V5U3RyaW5nXS5hZGRBc3NpZ25tZW50KHZhbHVlKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBfYWxsS2V5c0FyZVN0cmluZ3MgPSBmYWxzZTsKICAgICAgdHlwZUluZm9NYXAuY2xlYXIoKTsKICAgIH0KICAgIGtleVR5cGUuYWRkQXNzaWdubWVudChvdGhlci5rZXlUeXBlKTsKICAgIHZhbHVlVHlwZS5hZGRBc3NpZ25tZW50KG90aGVyLnZhbHVlVHlwZSk7CgogICAgcmV0dXJuIG5ld0luZm9zOwogIH0KCiAgbWFya0FzSW5mZXJyZWQoKSB7CiAgICBrZXlUeXBlLmluZmVycmVkID0gdmFsdWVUeXBlLmluZmVycmVkID0gdHJ1ZTsKICAgIHR5cGVJbmZvTWFwLnZhbHVlcy5mb3JFYWNoKCh2KSA9PiB2LmluZmVycmVkID0gdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBhZGRBc3NpZ25tZW50KFR5cGVJbmZvcm1hdGlvbiBvdGhlcikgewogICAgdGhyb3cgIm5vdCBzdXBwb3J0ZWQiOwogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KFR5cGVJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRNYXBUeXBlSW5mb3JtYXRpb24odGhpcyk7CiAgfQoKICBBYnN0cmFjdFZhbHVlIHRvVHlwZU1hc2soSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiA9IGluZmVycmVyLmFic3RyYWN0VmFsdWVEb21haW47CiAgICBpZiAoaW5EaWN0aW9uYXJ5TW9kZSkgewogICAgICBNYXA8U3RyaW5nLCBBYnN0cmFjdFZhbHVlPiBtYXBwaW5ncyA9IG5ldyBNYXA8U3RyaW5nLCBBYnN0cmFjdFZhbHVlPigpOwogICAgICBmb3IgKHZhciBrZXkgaW4gdHlwZUluZm9NYXAua2V5cykgewogICAgICAgIG1hcHBpbmdzW2tleV0gPSB0eXBlSW5mb01hcFtrZXldLnR5cGU7CiAgICAgIH0KICAgICAgcmV0dXJuIGluZmVycmVyLmFic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlRGljdGlvbmFyeVZhbHVlKAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRHZW5lcmFsaXphdGlvbihvcmlnaW5hbFR5cGUpLAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRBbGxvY2F0aW9uTm9kZShvcmlnaW5hbFR5cGUpLAogICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRBbGxvY2F0aW9uRWxlbWVudChvcmlnaW5hbFR5cGUpLAogICAgICAgICAga2V5VHlwZS50eXBlLAogICAgICAgICAgdmFsdWVUeXBlLnR5cGUsCiAgICAgICAgICBtYXBwaW5ncyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gaW5mZXJyZXIuYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVNYXBWYWx1ZSgKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZ2V0R2VuZXJhbGl6YXRpb24ob3JpZ2luYWxUeXBlKSwKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZ2V0QWxsb2NhdGlvbk5vZGUob3JpZ2luYWxUeXBlKSwKICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uZ2V0QWxsb2NhdGlvbkVsZW1lbnQob3JpZ2luYWxUeXBlKSwKICAgICAgICAgIGtleVR5cGUudHlwZSwKICAgICAgICAgIHZhbHVlVHlwZS50eXBlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiA9IGluZmVycmVyLmFic3RyYWN0VmFsdWVEb21haW47CiAgICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0RpY3Rpb25hcnkodHlwZSkgIT0gaW5EaWN0aW9uYXJ5TW9kZSkgewogICAgICByZXR1cm4gdG9UeXBlTWFzayhpbmZlcnJlcik7CiAgICB9IGVsc2UgaWYgKGFic3RyYWN0VmFsdWVEb21haW4uaXNEaWN0aW9uYXJ5KHR5cGUpKSB7CiAgICAgIGFzc2VydChpbkRpY3Rpb25hcnlNb2RlKTsKICAgICAgZm9yIChTdHJpbmcga2V5IGluIHR5cGVJbmZvTWFwLmtleXMpIHsKICAgICAgICBUeXBlSW5mb3JtYXRpb24gdmFsdWUgPSB0eXBlSW5mb01hcFtrZXldOwogICAgICAgIGlmICghYWJzdHJhY3RWYWx1ZURvbWFpbi5jb250YWluc0RpY3Rpb25hcnlLZXkodHlwZSwga2V5KSAmJgogICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmNvbnRhaW5zQWxsKHZhbHVlLnR5cGUpLmlzRGVmaW5pdGVseUZhbHNlICYmCiAgICAgICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uaXNOdWxsKHZhbHVlLnR5cGUpLmlzRGVmaW5pdGVseUZhbHNlKSB7CiAgICAgICAgICByZXR1cm4gdG9UeXBlTWFzayhpbmZlcnJlcik7CiAgICAgICAgfQogICAgICAgIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmdldERpY3Rpb25hcnlWYWx1ZUZvcktleSh0eXBlLCBrZXkpICE9CiAgICAgICAgICAgIHR5cGVJbmZvTWFwW2tleV0udHlwZSkgewogICAgICAgICAgcmV0dXJuIHRvVHlwZU1hc2soaW5mZXJyZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmlzTWFwKHR5cGUpKSB7CiAgICAgIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmdldE1hcEtleVR5cGUodHlwZSkgIT0ga2V5VHlwZS50eXBlIHx8CiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmdldE1hcFZhbHVlVHlwZSh0eXBlKSAhPSB2YWx1ZVR5cGUudHlwZSkgewogICAgICAgIHJldHVybiB0b1R5cGVNYXNrKGluZmVycmVyKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRvVHlwZU1hc2soaW5mZXJyZXIpOwogICAgfQoKICAgIHJldHVybiB0eXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBzYWZlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgPT4gb3JpZ2luYWxUeXBlOwoKICBAb3ZlcnJpZGUKICBib29sIGhhc1N0YWJsZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBrZXlUeXBlLmlzU3RhYmxlICYmCiAgICAgICAgdmFsdWVUeXBlLmlzU3RhYmxlICYmCiAgICAgICAgc3VwZXIuaGFzU3RhYmxlVHlwZShpbmZlcnJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsZWFudXAoKSB7CiAgICBzdXBlci5jbGVhbnVwKCk7CiAgICBrZXlUeXBlLmNsZWFudXAoKTsKICAgIHZhbHVlVHlwZS5jbGVhbnVwKCk7CiAgICBmb3IgKFR5cGVJbmZvcm1hdGlvbiBpbmZvIGluIHR5cGVJbmZvTWFwLnZhbHVlcykgewogICAgICBpbmZvLmNsZWFudXAoKTsKICAgIH0KICAgIF9mbG93c0ludG8gPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdNYXAgJHR5cGUgKEs6JGtleVR5cGUsIFY6JHZhbHVlVHlwZSkgY29udGVudHMgJHR5cGVJbmZvTWFwJzsKICB9Cn0KCi8vLyBBIFtLZXlJbk1hcFR5cGVJbmZvcm1hdGlvbl0gaG9sZHMgdGhlIGNvbW1vbiB0eXBlCi8vLyBmb3IgdGhlIGtleXMgaW4gYSBbTWFwVHlwZUluZm9ybWF0aW9uXQpjbGFzcyBLZXlJbk1hcFR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIEluZmVycmVkVHlwZUluZm9ybWF0aW9uIHsKICBLZXlJbk1hcFR5cGVJbmZvcm1hdGlvbihBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjb250ZXh0LCBUeXBlSW5mb3JtYXRpb24ga2V5VHlwZSkKICAgICAgOiBzdXBlcihhYnN0cmFjdFZhbHVlRG9tYWluLCBjb250ZXh0LCBrZXlUeXBlKTsKCiAgQG92ZXJyaWRlCiAgYWNjZXB0KFR5cGVJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRLZXlJbk1hcFR5cGVJbmZvcm1hdGlvbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdLZXkgaW4gTWFwICR0eXBlJzsKfQoKLy8vIEEgW1ZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb25dIGhvbGRzIHRoZSBjb21tb24gdHlwZQovLy8gZm9yIHRoZSB2YWx1ZXMgaW4gYSBbTWFwVHlwZUluZm9ybWF0aW9uXQpjbGFzcyBWYWx1ZUluTWFwVHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgSW5mZXJyZWRUeXBlSW5mb3JtYXRpb24gewogIC8vIFtub25OdWxsXSBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGlzIHZhbHVlIGlzIGtub3duIHRvIGJlIHBhcnQgb2YgdGhlIG1hcC4KICAvLyBOb3RlIHRoYXQgb25seSB2YWx1ZXMgYXNzaWduZWQgdG8gYSBzcGVjaWZpYyBrZXkgdmFsdWUgaW4gZGljdGlvbmFyeQogIC8vIG1vZGUgY2FuIGV2ZXIgYmUgbWFya2VkIGFzIFtub25OdWxsXS4KICBmaW5hbCBib29sIG5vbk51bGw7CgogIFZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb24oQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dCwgVHlwZUluZm9ybWF0aW9uIHZhbHVlVHlwZSwKICAgICAgW3RoaXMubm9uTnVsbCA9IGZhbHNlXSkKICAgICAgOiBzdXBlcihhYnN0cmFjdFZhbHVlRG9tYWluLCBjb250ZXh0LCB2YWx1ZVR5cGUpOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb24odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gbm9uTnVsbAogICAgICAgID8gc3VwZXIuY29tcHV0ZVR5cGUoaW5mZXJyZXIpCiAgICAgICAgOiBpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluLmluY2x1ZGVOdWxsKHN1cGVyLmNvbXB1dGVUeXBlKGluZmVycmVyKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnVmFsdWUgaW4gTWFwICR0eXBlJzsKfQoKLy8vIEEgW1BoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb25dIGlzIGFuIHVuaW9uIG9mCi8vLyBbRWxlbWVudFR5cGVJbmZvcm1hdGlvbl0sIHRoYXQgaXMgbG9jYWwgdG8gYSBtZXRob2QuCmNsYXNzIFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBUeXBlSW5mb3JtYXRpb24gewogIGZpbmFsIGlyLk5vZGUgYnJhbmNoTm9kZTsKICBmaW5hbCBMb2NhbCB2YXJpYWJsZTsKICBmaW5hbCBib29sIGlzVHJ5OwoKICBQaGlFbGVtZW50VHlwZUluZm9ybWF0aW9uKEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsIHRoaXMuYnJhbmNoTm9kZSwgdGhpcy52YXJpYWJsZSwKICAgICAge3RoaXMuaXNUcnl9KQogICAgICA6IHN1cGVyKGFic3RyYWN0VmFsdWVEb21haW4uZW1wdHlUeXBlLCBjb250ZXh0KTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgewogICAgcmV0dXJuIGluZmVycmVyLnR5cGVzLmNvbXB1dGVUeXBlTWFzayhhc3NpZ25tZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnUGhpKCRoYXNoQ29kZSkgJHZhcmlhYmxlICR0eXBlJzsKCiAgQG92ZXJyaWRlCiAgdm9pZCBfdG9TdHJ1Y3R1cmVkVGV4dCgKICAgICAgU3RyaW5nQnVmZmVyIHNiLCBTdHJpbmcgaW5kZW50LCBTZXQ8VHlwZUluZm9ybWF0aW9uPiBzZWVuKSB7CiAgICBpZiAoc2Vlbi5hZGQodGhpcykpIHsKICAgICAgc2Iud3JpdGUoJyR7dG9TdHJpbmcoKX0gWycpOwogICAgICBmb3IgKFR5cGVJbmZvcm1hdGlvbiBhc3NpZ25tZW50IGluIGFzc2lnbm1lbnRzKSB7CiAgICAgICAgc2Iud3JpdGUoJ1xuJGluZGVudCAgJyk7CiAgICAgICAgYXNzaWdubWVudC5fdG9TdHJ1Y3R1cmVkVGV4dChzYiwgJyRpbmRlbnQgICcsIHNlZW4pOwogICAgICB9CiAgICAgIHNiLndyaXRlKCcgXScpOwogICAgfSBlbHNlIHsKICAgICAgc2Iud3JpdGUoJyR7dG9TdHJpbmcoKX0gWyAuLi4gXScpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYWNjZXB0KFR5cGVJbmZvcm1hdGlvblZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRQaGlFbGVtZW50VHlwZUluZm9ybWF0aW9uKHRoaXMpOwogIH0KfQoKY2xhc3MgQ2xvc3VyZVR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIFR5cGVJbmZvcm1hdGlvbgogICAgd2l0aCBBcHBseWFibGVUeXBlSW5mb3JtYXRpb24gewogIGZpbmFsIEZ1bmN0aW9uRW50aXR5IF9lbGVtZW50OwoKICBDbG9zdXJlVHlwZUluZm9ybWF0aW9uKEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGNvbnRleHQsIHRoaXMuX2VsZW1lbnQpCiAgICAgIDogc3VwZXIoYWJzdHJhY3RWYWx1ZURvbWFpbi5lbXB0eVR5cGUsIGNvbnRleHQpOwoKICBGdW5jdGlvbkVudGl0eSBnZXQgY2xvc3VyZSA9PiBfZWxlbWVudDsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZShJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikgPT4gc2FmZVR5cGUoaW5mZXJyZXIpOwoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHNhZmVUeXBlKEluZmVycmVyRW5naW5lIGluZmVycmVyKSB7CiAgICByZXR1cm4gaW5mZXJyZXIudHlwZXMuZnVuY3Rpb25UeXBlLnR5cGU7CiAgfQoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAnJGNsb3N1cmUnOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnQ2xvc3VyZSAkX2VsZW1lbnQnOwoKICBAb3ZlcnJpZGUKICBhY2NlcHQoVHlwZUluZm9ybWF0aW9uVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdENsb3N1cmVUeXBlSW5mb3JtYXRpb24odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc1N0YWJsZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIFN0cmluZyBnZXRJbmZlcnJlZFNpZ25hdHVyZShUeXBlU3lzdGVtIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMuZ2V0SW5mZXJyZWRTaWduYXR1cmVPZk1ldGhvZChfZWxlbWVudCk7CiAgfQp9CgovLy8gTWl4aW4gZm9yIFtUeXBlSW5mb3JtYXRpb25dIG5vZGVzIHRoYXQgY2FuIGJhaWwgb3V0IGR1cmluZyB0cmFjaW5nLgphYnN0cmFjdCBjbGFzcyBUcmFjZWRUeXBlSW5mb3JtYXRpb24gaW1wbGVtZW50cyBUeXBlSW5mb3JtYXRpb24gewogIC8vLyBTZXQgdG8gZmFsc2Ugb25jZSBhbmFseXNpcyBoYXMgc3VjY2VlZGVkLgogIGJvb2wgYmFpbGVkT3V0ID0gdHJ1ZTsKCiAgLy8vIFNldCB0byB0cnVlIG9uY2UgYW5hbHlzaXMgaXMgY29tcGxldGVkLgogIGJvb2wgYW5hbHl6ZWQgPSBmYWxzZTsKCiAgU2V0PFR5cGVJbmZvcm1hdGlvbj4gX2Zsb3dzSW50bzsKCiAgLy8vIFRoZSBzZXQgb2YgW1R5cGVJbmZvcm1hdGlvbl0gbm9kZXMgd2hlcmUgdmFsdWVzIGZyb20gdGhlIHRyYWNlZCBub2RlIGNvdWxkCiAgLy8vIGZsb3cgaW4uCiAgU2V0PFR5cGVJbmZvcm1hdGlvbj4gZ2V0IGZsb3dzSW50byB7CiAgICByZXR1cm4gKF9mbG93c0ludG8gPT0gbnVsbCkKICAgICAgICA/IGNvbnN0IEltbXV0YWJsZUVtcHR5U2V0PFR5cGVJbmZvcm1hdGlvbj4oKQogICAgICAgIDogX2Zsb3dzSW50bzsKICB9CgogIC8vLyBBZGRzIFtub2Rlc10gdG8gdGhlIHNldHMgb2YgdmFsdWVzIHRoaXMgW1RyYWNlZFR5cGVJbmZvcm1hdGlvbl0gZmxvd3MKICAvLy8gaW50by4KICB2b2lkIGFkZEZsb3dzSW50b1RhcmdldHMoSXRlcmFibGU8VHlwZUluZm9ybWF0aW9uPiBub2RlcykgewogICAgaWYgKF9mbG93c0ludG8gPT0gbnVsbCkgewogICAgICBfZmxvd3NJbnRvID0gbm9kZXMudG9TZXQoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9mbG93c0ludG8uYWRkQWxsKG5vZGVzKTsKICAgIH0KICB9Cn0KCmNsYXNzIEF3YWl0VHlwZUluZm9ybWF0aW9uIGV4dGVuZHMgVHlwZUluZm9ybWF0aW9uIHsKICBmaW5hbCBpci5Ob2RlIF9ub2RlOwoKICBBd2FpdFR5cGVJbmZvcm1hdGlvbihBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjb250ZXh0LCB0aGlzLl9ub2RlKQogICAgICA6IHN1cGVyKGFic3RyYWN0VmFsdWVEb21haW4uZW1wdHlUeXBlLCBjb250ZXh0KTsKCiAgLy8gVE9ETygyMjg5NCk6IENvbXB1dGUgYSBiZXR0ZXIgdHlwZSBoZXJlLgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpID0+IHNhZmVUeXBlKGluZmVycmVyKTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gJyRfbm9kZSc7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdBd2FpdCc7CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QXdhaXRUeXBlSW5mb3JtYXRpb24odGhpcyk7CiAgfQp9CgpjbGFzcyBZaWVsZFR5cGVJbmZvcm1hdGlvbiBleHRlbmRzIFR5cGVJbmZvcm1hdGlvbiB7CiAgZmluYWwgaXIuTm9kZSBfbm9kZTsKCiAgWWllbGRUeXBlSW5mb3JtYXRpb24oQWJzdHJhY3RWYWx1ZURvbWFpbiBhYnN0cmFjdFZhbHVlRG9tYWluLAogICAgICBNZW1iZXJUeXBlSW5mb3JtYXRpb24gY29udGV4dCwgdGhpcy5fbm9kZSkKICAgICAgOiBzdXBlcihhYnN0cmFjdFZhbHVlRG9tYWluLmVtcHR5VHlwZSwgY29udGV4dCk7CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgY29tcHV0ZVR5cGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIpID0+IHNhZmVUeXBlKGluZmVycmVyKTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gJyRfbm9kZSc7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdZaWVsZCc7CgogIEBvdmVycmlkZQogIGFjY2VwdChUeXBlSW5mb3JtYXRpb25WaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0WWllbGRUeXBlSW5mb3JtYXRpb24odGhpcyk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBUeXBlSW5mb3JtYXRpb25WaXNpdG9yPFQ+IHsKICBUIHZpc2l0TmFycm93VHlwZUluZm9ybWF0aW9uKE5hcnJvd1R5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICBUIHZpc2l0UGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbihQaGlFbGVtZW50VHlwZUluZm9ybWF0aW9uIGluZm8pOwogIFQgdmlzaXRFbGVtZW50SW5Db250YWluZXJUeXBlSW5mb3JtYXRpb24oCiAgICAgIEVsZW1lbnRJbkNvbnRhaW5lclR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICBUIHZpc2l0RWxlbWVudEluU2V0VHlwZUluZm9ybWF0aW9uKEVsZW1lbnRJblNldFR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICBUIHZpc2l0S2V5SW5NYXBUeXBlSW5mb3JtYXRpb24oS2V5SW5NYXBUeXBlSW5mb3JtYXRpb24gaW5mbyk7CiAgVCB2aXNpdFZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb24oVmFsdWVJbk1hcFR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICBUIHZpc2l0TGlzdFR5cGVJbmZvcm1hdGlvbihMaXN0VHlwZUluZm9ybWF0aW9uIGluZm8pOwogIFQgdmlzaXRTZXRUeXBlSW5mb3JtYXRpb24oU2V0VHlwZUluZm9ybWF0aW9uIGluZm8pOwogIFQgdmlzaXRNYXBUeXBlSW5mb3JtYXRpb24oTWFwVHlwZUluZm9ybWF0aW9uIGluZm8pOwogIFQgdmlzaXRDb25jcmV0ZVR5cGVJbmZvcm1hdGlvbihDb25jcmV0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICBUIHZpc2l0U3RyaW5nTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbihTdHJpbmdMaXRlcmFsVHlwZUluZm9ybWF0aW9uIGluZm8pOwogIFQgdmlzaXRCb29sTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbihCb29sTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICBUIHZpc2l0Q2xvc3VyZUNhbGxTaXRlVHlwZUluZm9ybWF0aW9uKENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICBUIHZpc2l0U3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oU3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbyk7CiAgVCB2aXNpdER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbihEeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbyk7CiAgVCB2aXNpdE1lbWJlclR5cGVJbmZvcm1hdGlvbihNZW1iZXJUeXBlSW5mb3JtYXRpb24gaW5mbyk7CiAgVCB2aXNpdFBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbihQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24gaW5mbyk7CiAgVCB2aXNpdENsb3N1cmVUeXBlSW5mb3JtYXRpb24oQ2xvc3VyZVR5cGVJbmZvcm1hdGlvbiBpbmZvKTsKICBUIHZpc2l0QXdhaXRUeXBlSW5mb3JtYXRpb24oQXdhaXRUeXBlSW5mb3JtYXRpb24gaW5mbyk7CiAgVCB2aXNpdFlpZWxkVHlwZUluZm9ybWF0aW9uKFlpZWxkVHlwZUluZm9ybWF0aW9uIGluZm8pOwp9CgpBYnN0cmFjdFZhbHVlIF9uYXJyb3dUeXBlKAogICAgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCBBYnN0cmFjdFZhbHVlIHR5cGUsIERhcnRUeXBlIGFubm90YXRpb24sCiAgICB7Ym9vbCBpc051bGxhYmxlOiB0cnVlfSkgewogIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiA9IGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CiAgQWJzdHJhY3RWYWx1ZSBvdGhlclR5cGU7CiAgaWYgKGFubm90YXRpb24udHJlYXRBc0R5bmFtaWMpIHsKICAgIHJldHVybiB0eXBlOwogIH0gZWxzZSBpZiAoYW5ub3RhdGlvbi5pc0ludGVyZmFjZVR5cGUpIHsKICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IGFubm90YXRpb247CiAgICBpZiAoaW50ZXJmYWNlVHlwZS5lbGVtZW50ID09IGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSB7CiAgICAgIHJldHVybiB0eXBlOwogICAgfQogICAgb3RoZXJUeXBlID0gYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVOb25OdWxsU3VidHlwZShpbnRlcmZhY2VUeXBlLmVsZW1lbnQpOwogIH0gZWxzZSBpZiAoYW5ub3RhdGlvbi5pc1ZvaWQpIHsKICAgIHJldHVybiB0eXBlOwogIH0gZWxzZSBpZiAoYW5ub3RhdGlvbi5pc1R5cGVkZWYgfHwgYW5ub3RhdGlvbi5pc0Z1bmN0aW9uVHlwZSkgewogICAgb3RoZXJUeXBlID0gY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5mdW5jdGlvblR5cGU7CiAgfSBlbHNl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aWRlci5kYXJ0gpcvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgYXMgaXI7CgovLy8gSW50ZXJmYWNlIGZvciBhY2Nlc3Npbmcgc3RhdGljIHR5cGVzIG9uIGV4cHJlc3Npb25zLgphYnN0cmFjdCBjbGFzcyBTdGF0aWNUeXBlUHJvdmlkZXIgewogIGlyLkRhcnRUeXBlIGdldFN0YXRpY1R5cGUoaXIuRXhwcmVzc2lvbiBub2RlKTsKICBpci5EYXJ0VHlwZSBnZXRGb3JJbkl0ZXJhdG9yVHlwZShpci5Gb3JJblN0YXRlbWVudCBub2RlKTsKfQoRAE5OPAEoNC8xNQE5JDE8AgExcGFja2FnZTpjb21waWxlci9zcmMvaXIvc3RhdGljX3R5cGVfcHJvdmlkZXIuZGFydDNzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zc2EvdHlwZV9idWlsZGVyLmRhcnTAAE4ZLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnYnVpbGRlcl9rZXJuZWwuZGFydCc7CmltcG9ydCAnbm9kZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2pzX21vZGVsL3R5cGVfcmVjaXBlLmRhcnQnOwppbXBvcnQgJy4uL2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9vcHRpb25zLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3VzZS5kYXJ0JyBzaG93IFR5cGVVc2U7CmltcG9ydCAnLi4vd29ybGQuZGFydCc7CgovLy8gRW51bSB0aGF0IGRlZmluZXMgaG93IGEgbWVtYmVyIGhhcyBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgdHlwZSB2YXJpYWJsZXMuCmVudW0gQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgewogIC8vLyBUaGUgbWVtYmVyIGhhcyBubyBhY2Nlc3MgdG8gdHlwZSB2YXJpYWJsZXMuCiAgbm9uZSwKCiAgLy8vIFR5cGUgdmFyaWFibGVzIGFyZSBhY2Nlc3NpYmxlIGFzIGEgcHJvcGVydHkgb24gYHRoaXNgLgogIHByb3BlcnR5LAoKICAvLy8gVHlwZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2libGUgYXMgcGFyYW1ldGVycyBpbiB0aGUgY3VycmVudCBjb250ZXh0LgogIHBhcmFtZXRlciwKCiAgLy8vIElmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yLCB0eXBlIHZhcmlhYmxlcyBhcmUKICAvLy8gYWNjZXNzaWJsZSBhcyBwYXJhbWV0ZXJzLCBvdGhlcndpc2UgdHlwZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2libGUgYXMKICAvLy8gYSBwcm9wZXJ0eSBvbiBgdGhpc2AuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgaW5zdGFuY2UgZmllbGRzIHdob3NlIGluaXRpYWxpemVycyBhcmUgZXhlY3V0ZWQgaW4gdGhlCiAgLy8vIGNvbnN0cnVjdG9ycy4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB0aGUgbmVlZCBmb3IgdGhpcyBieSBhZGRpbmcgYSBmaWVsZC1zZXR0ZXIKICAvLyB0byB0aGUgSi1tb2RlbC4KICBpbnN0YW5jZUZpZWxkLAp9CgovLy8gRnVuY3Rpb25zIHRvIGluc2VydCB0eXBlIGNoZWNraW5nLCBjb2VyY2lvbiwgYW5kIGluc3RydWN0aW9uIGluc2VydGlvbgovLy8gZGVwZW5kaW5nIG9uIHRoZSBlbnZpcm9ubWVudCBmb3IgZGFydCBjb2RlLgphYnN0cmFjdCBjbGFzcyBUeXBlQnVpbGRlciB7CiAgZmluYWwgS2VybmVsU3NhR3JhcGhCdWlsZGVyIGJ1aWxkZXI7CgogIFR5cGVCdWlsZGVyKHRoaXMuYnVpbGRlcik7CgogIEpDbG9zZWRXb3JsZCBnZXQgX2Nsb3NlZFdvcmxkID0+IGJ1aWxkZXIuY2xvc2VkV29ybGQ7CgogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IF9hYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIF9jbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICAvLy8gQ3JlYXRlIGEgdHlwZSBtYXNrIGZvciAndHJ1c3RpbmcnIGEgRGFydFR5cGUuIFJldHVybnMgYG51bGxgIGlmIHRoZXJlIGlzCiAgLy8vIG5vIGFwcHJveGltYXRpbmcgdHlwZSBtYXNrIChpLmUuIHRoZSB0eXBlIG1hc2sgd291bGQgYmUgYGR5bmFtaWNgKS4KICBBYnN0cmFjdFZhbHVlIHRydXN0VHlwZU1hc2soRGFydFR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICB0eXBlID0gYnVpbGRlci5sb2NhbHNIYW5kbGVyLnN1YnN0SW5Db250ZXh0KHR5cGUpOwogICAgdHlwZSA9IHR5cGUudW5hbGlhc2VkOwogICAgaWYgKHR5cGUuaXNEeW5hbWljKSByZXR1cm4gbnVsbDsKICAgIGlmICghdHlwZS5pc0ludGVyZmFjZVR5cGUpIHJldHVybiBudWxsOwogICAgaWYgKHR5cGUgPT0gX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGUpIHJldHVybiBudWxsOwogICAgLy8gVGhlIHR5cGUgZWxlbWVudCBpcyBlaXRoZXIgYSBjbGFzcyBvciB0aGUgdm9pZCBlbGVtZW50LgogICAgQ2xhc3NFbnRpdHkgZWxlbWVudCA9ICh0eXBlIGFzIEludGVyZmFjZVR5cGUpLmVsZW1lbnQ7CiAgICByZXR1cm4gX2Fic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlTnVsbGFibGVTdWJ0eXBlKGVsZW1lbnQpOwogIH0KCiAgLy8vIENyZWF0ZSBhbiBpbnN0cnVjdGlvbiB0byBzaW1wbHkgdHJ1c3QgdGhlIHByb3ZpZGVkIHR5cGUuCiAgSEluc3RydWN0aW9uIF90cnVzdFR5cGUoSEluc3RydWN0aW9uIG9yaWdpbmFsLCBEYXJ0VHlwZSB0eXBlKSB7CiAgICBhc3NlcnQodHlwZSAhPSBudWxsKTsKICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IHRydXN0VHlwZU1hc2sodHlwZSk7CiAgICBpZiAobWFzayA9PSBudWxsKSByZXR1cm4gb3JpZ2luYWw7CiAgICByZXR1cm4gbmV3IEhUeXBlS25vd24ucGlubmVkKG1hc2ssIG9yaWdpbmFsKTsKICB9CgogIC8vLyBQcm9kdWNlcyBjb2RlIHRoYXQgY2hlY2tzIHRoZSBydW50aW1lIHR5cGUgaXMgYWN0dWFsbHkgdGhlIHR5cGUgc3BlY2lmaWVkCiAgLy8vIGJ5IGF0dGVtcHRpbmcgYSB0eXBlIGNvbnZlcnNpb24uCiAgSEluc3RydWN0aW9uIF9jaGVja1R5cGUoSEluc3RydWN0aW9uIG9yaWdpbmFsLCBEYXJ0VHlwZSB0eXBlKSB7CiAgICBhc3NlcnQodHlwZSAhPSBudWxsKTsKICAgIHR5cGUgPSBidWlsZGVyLmxvY2Fsc0hhbmRsZXIuc3Vic3RJbkNvbnRleHQodHlwZSk7CiAgICBISW5zdHJ1Y3Rpb24gb3RoZXIgPQogICAgICAgIGJ1aWxkVHlwZUNvbnZlcnNpb24ob3JpZ2luYWwsIHR5cGUsIEhUeXBlQ29udmVyc2lvbi5UWVBFX0NIRUNLKTsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoaXMgb3BlcmF0aW9uIG9uIGByZWdpc3RyeWAgbWF5IGJlIGluY29uc2lzdGVudC4KICAgIC8vIElmIGl0IGlzIG5lZWRlZCB0aGVuIGl0IHNlZW1zIGxpa2VseSB0aGF0IHNpbWlsYXIgaW52b2NhdGlvbnMgb2YKICAgIC8vIGBidWlsZFR5cGVDb252ZXJzaW9uYCBpbiBgU3NhQnVpbGRlci52aXNpdEFzYCBzaG91bGQgYWxzbyBiZSBmb2xsb3dlZCBieQogICAgLy8gYSBzaW1pbGFyIG9wZXJhdGlvbiBvbiBgcmVnaXN0cnlgOyBvdGhlcndpc2UsIHRoaXMgb25lIG1pZ2h0IG5vdCBiZQogICAgLy8gbmVlZGVkLgogICAgYnVpbGRlci5yZWdpc3RyeT8ucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmlzQ2hlY2sodHlwZSkpOwogICAgaWYgKG90aGVyIGlzIEhUeXBlQ29udmVyc2lvbiAmJiBvdGhlci5pc1JlZHVuZGFudChidWlsZGVyLmNsb3NlZFdvcmxkKSkgewogICAgICByZXR1cm4gb3JpZ2luYWw7CiAgICB9CiAgICByZXR1cm4gb3RoZXI7CiAgfQoKICAvLy8gUHJvZHVjZXMgY29kZSB0aGF0IGNoZWNrcyB0aGUgcnVudGltZSB0eXBlIGlzIGFjdHVhbGx5IHRoZSB0eXBlIHNwZWNpZmllZAogIC8vLyBieSBhdHRlbXB0aW5nIGEgdHlwZSBjb252ZXJzaW9uLgogIEhJbnN0cnVjdGlvbiBfY2hlY2tCb29sQ29udmVyaW9uKEhJbnN0cnVjdGlvbiBvcmlnaW5hbCkgewogICAgdmFyIGNoZWNrSW5zdHJ1Y3Rpb24gPQogICAgICAgIEhCb29sQ29udmVyc2lvbihvcmlnaW5hbCwgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpOwogICAgaWYgKGNoZWNrSW5zdHJ1Y3Rpb24uaXNSZWR1bmRhbnQoX2Nsb3NlZFdvcmxkKSkgewogICAgICByZXR1cm4gb3JpZ2luYWw7CiAgICB9CiAgICBEYXJ0VHlwZSBib29sVHlwZSA9IF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5ib29sVHlwZTsKICAgIGJ1aWxkZXIucmVnaXN0cnk/LnJlZ2lzdGVyVHlwZVVzZShuZXcgVHlwZVVzZS5pc0NoZWNrKGJvb2xUeXBlKSk7CiAgICByZXR1cm4gY2hlY2tJbnN0cnVjdGlvbjsKICB9CgogIEhJbnN0cnVjdGlvbiB0cnVzdFR5cGVPZlBhcmFtZXRlcihISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlID09IG51bGwpIHJldHVybiBvcmlnaW5hbDsKICAgIEhJbnN0cnVjdGlvbiB0cnVzdGVkID0gX3RydXN0VHlwZShvcmlnaW5hbCwgdHlwZSk7CiAgICBpZiAodHJ1c3RlZCA9PSBvcmlnaW5hbCkgcmV0dXJuIG9yaWdpbmFsOwogICAgaWYgKHRydXN0ZWQgaXMgSFR5cGVLbm93biAmJiB0cnVzdGVkLmlzUmVkdW5kYW50KGJ1aWxkZXIuY2xvc2VkV29ybGQpKSB7CiAgICAgIHJldHVybiBvcmlnaW5hbDsKICAgIH0KICAgIGJ1aWxkZXIuYWRkKHRydXN0ZWQpOwogICAgcmV0dXJuIHRydXN0ZWQ7CiAgfQoKICBISW5zdHJ1Y3Rpb24gcG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZQYXJhbWV0ZXIoCiAgICAgIE1lbWJlckVudGl0eSBtZW1iZXJDb250ZXh0LCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlID09IG51bGwpIHJldHVybiBvcmlnaW5hbDsKICAgIEhJbnN0cnVjdGlvbiBjaGVja2VkT3JUcnVzdGVkID0gb3JpZ2luYWw7CiAgICBDaGVja1BvbGljeSBwYXJhbWV0ZXJDaGVja1BvbGljeSA9IGJ1aWxkZXIuY2xvc2VkV29ybGQuYW5ub3RhdGlvbnNEYXRhCiAgICAgICAgLmdldFBhcmFtZXRlckNoZWNrUG9saWN5KG1lbWJlckNvbnRleHQpOwogICAgaWYgKHBhcmFtZXRlckNoZWNrUG9saWN5LmlzVHJ1c3RlZCkgewogICAgICBjaGVja2VkT3JUcnVzdGVkID0gX3RydXN0VHlwZShvcmlnaW5hbCwgdHlwZSk7CiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlckNoZWNrUG9saWN5LmlzRW1pdHRlZCkgewogICAgICBjaGVja2VkT3JUcnVzdGVkID0gX2NoZWNrVHlwZShvcmlnaW5hbCwgdHlwZSk7CiAgICB9CiAgICBpZiAoY2hlY2tlZE9yVHJ1c3RlZCA9PSBvcmlnaW5hbCkgcmV0dXJuIG9yaWdpbmFsOwogICAgYnVpbGRlci5hZGQoY2hlY2tlZE9yVHJ1c3RlZCk7CiAgICByZXR1cm4gY2hlY2tlZE9yVHJ1c3RlZDsKICB9CgogIC8vLyBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgYW5kIHRoZSBtb2RlLCB3cmFwIHRoZSBnaXZlbiB0eXBlIGluIGFuCiAgLy8vIGluc3RydWN0aW9uIHRoYXQgY2hlY2tzIHRoZSB0eXBlIGlzIHdoYXQgd2UgZXhwZWN0IG9yIGF1dG9tYXRpY2FsbHkKICAvLy8gdHJ1c3RzIHRoZSB3cml0dGVuIHR5cGUuCiAgSEluc3RydWN0aW9uIHBvdGVudGlhbGx5Q2hlY2tPclRydXN0VHlwZU9mQXNzaWdubWVudCgKICAgICAgTWVtYmVyRW50aXR5IG1lbWJlckNvbnRleHQsIEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgRGFydFR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIG9yaWdpbmFsOwogICAgSEluc3RydWN0aW9uIGNoZWNrZWRPclRydXN0ZWQgPSBfdHJ1c3RUeXBlKG9yaWdpbmFsLCB0eXBlKTsKICAgIGlmIChjaGVja2VkT3JUcnVzdGVkID09IG9yaWdpbmFsKSByZXR1cm4gb3JpZ2luYWw7CiAgICBidWlsZGVyLmFkZChjaGVja2VkT3JUcnVzdGVkKTsKICAgIHJldHVybiBjaGVja2VkT3JUcnVzdGVkOwogIH0KCiAgSEluc3RydWN0aW9uIHBvdGVudGlhbGx5Q2hlY2tPclRydXN0VHlwZU9mQ29uZGl0aW9uKAogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyQ29udGV4dCwgSEluc3RydWN0aW9uIG9yaWdpbmFsKSB7CiAgICBEYXJ0VHlwZSBib29sVHlwZSA9IF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5ib29sVHlwZTsKICAgIEhJbnN0cnVjdGlvbiBjaGVja2VkT3JUcnVzdGVkID0gb3JpZ2luYWw7CiAgICBDaGVja1BvbGljeSBjb25kaXRpb25DaGVja1BvbGljeSA9IGJ1aWxkZXIuY2xvc2VkV29ybGQuYW5ub3RhdGlvbnNEYXRhCiAgICAgICAgLmdldENvbmRpdGlvbkNoZWNrUG9saWN5KG1lbWJlckNvbnRleHQpOwogICAgaWYgKGNvbmRpdGlvbkNoZWNrUG9saWN5LmlzVHJ1c3RlZCkgewogICAgICBjaGVja2VkT3JUcnVzdGVkID0gX3RydXN0VHlwZShvcmlnaW5hbCwgYm9vbFR5cGUpOwogICAgfSBlbHNlIGlmIChjb25kaXRpb25DaGVja1BvbGljeS5pc0VtaXR0ZWQpIHsKICAgICAgY2hlY2tlZE9yVHJ1c3RlZCA9IF9jaGVja0Jvb2xDb252ZXJpb24ob3JpZ2luYWwpOwogICAgfQogICAgaWYgKGNoZWNrZWRPclRydXN0ZWQgPT0gb3JpZ2luYWwpIHJldHVybiBvcmlnaW5hbDsKICAgIGJ1aWxkZXIuYWRkKGNoZWNrZWRPclRydXN0ZWQpOwogICAgcmV0dXJuIGNoZWNrZWRPclRydXN0ZWQ7CiAgfQoKICBDbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyBjb21wdXRlVHlwZVZhcmlhYmxlQWNjZXNzKE1lbWJlckVudGl0eSBtZW1iZXIpOwoKICAvLy8gSGVscGVyIHRvIGNyZWF0ZSBhbiBpbnN0cnVjdGlvbiB0aGF0IGdldHMgdGhlIHZhbHVlIG9mIGEgdHlwZSB2YXJpYWJsZS4KICBISW5zdHJ1Y3Rpb24gYWRkVHlwZVZhcmlhYmxlUmVmZXJlbmNlKAogICAgICBUeXBlVmFyaWFibGVUeXBlIHR5cGUsIE1lbWJlckVudGl0eSBtZW1iZXIsCiAgICAgIHtTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbn0pIHsKICAgIExvY2FsIHR5cGVWYXJpYWJsZUxvY2FsID0KICAgICAgICBidWlsZGVyLmxvY2Fsc0hhbmRsZXIuZ2V0VHlwZVZhcmlhYmxlQXNMb2NhbCh0eXBlKTsKCiAgICAvLy8gUmVhZCBbdHlwZVZhcmlhYmxlXSBhcyBhIHByb3BlcnR5IG9mIG9uIGB0aGlzYC4KICAgIEhJbnN0cnVjdGlvbiByZWFkQXNQcm9wZXJ0eSgpIHsKICAgICAgcmV0dXJuIHJlYWRUeXBlVmFyaWFibGUodHlwZSwgbWVtYmVyLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KCiAgICAvLy8gUmVhZCBbdHlwZVZhcmlhYmxlXSBhcyBhIHBhcmFtZXRlci4KICAgIEhJbnN0cnVjdGlvbiByZWFkQXNQYXJhbWV0ZXIoKSB7CiAgICAgIHJldHVybiBidWlsZGVyLmxvY2Fsc0hhbmRsZXIKICAgICAgICAgIC5yZWFkTG9jYWwodHlwZVZhcmlhYmxlTG9jYWwsIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CgogICAgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MgdHlwZVZhcmlhYmxlQWNjZXNzOwogICAgaWYgKHR5cGUuZWxlbWVudC50eXBlRGVjbGFyYXRpb24gaXMgQ2xhc3NFbnRpdHkpIHsKICAgICAgdHlwZVZhcmlhYmxlQWNjZXNzID0gY29tcHV0ZVR5cGVWYXJpYWJsZUFjY2VzcyhtZW1iZXIpOwogICAgfSBlbHNlIHsKICAgICAgdHlwZVZhcmlhYmxlQWNjZXNzID0gQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MucGFyYW1ldGVyOwogICAgfQogICAgc3dpdGNoICh0eXBlVmFyaWFibGVBY2Nlc3MpIHsKICAgICAgY2FzZSBDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5wYXJhbWV0ZXI6CiAgICAgICAgcmV0dXJuIHJlYWRBc1BhcmFtZXRlcigpOwogICAgICBjYXNlIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzLmluc3RhbmNlRmllbGQ6CiAgICAgICAgaWYgKG1lbWJlciAhPSBidWlsZGVyLnRhcmdldEVsZW1lbnQpIHsKICAgICAgICAgIC8vIFdoZW4gW21lbWJlcl0gaXMgYSBmaWVsZCwgd2UgY2FuIGVpdGhlciBiZSBnZW5lcmF0aW5nIGEgY2hlY2tlZAogICAgICAgICAgLy8gc2V0dGVyIG9yIGlubGluaW5nIGl0cyBpbml0aWFsaXplciBpbiBhIGNvbnN0cnVjdG9yLiBBbiBpbml0aWFsaXplcgogICAgICAgICAgLy8gaXMgbmV2ZXIgYnVpbHQgc3RhbmRhbG9uZSwgc28gaW4gdGhhdCBjYXNlIFt0YXJnZXRdIGlzIG5vdCB0aGUKICAgICAgICAgIC8vIFttZW1iZXJdIGl0c2VsZi4KICAgICAgICAgIHJldHVybiByZWFkQXNQYXJhbWV0ZXIoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlYWRBc1Byb3BlcnR5KCk7CiAgICAgIGNhc2UgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MucHJvcGVydHk6CiAgICAgICAgcmV0dXJuIHJlYWRBc1Byb3BlcnR5KCk7CiAgICAgIGNhc2UgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3Mubm9uZToKICAgICAgICBidWlsZGVyLnJlcG9ydGVyLmludGVybmFsRXJyb3IoCiAgICAgICAgICAgIHR5cGUuZWxlbWVudCwgJ1VuZXhwZWN0ZWQgdHlwZSB2YXJpYWJsZSBpbiBzdGF0aWMgY29udGV4dC4nKTsKICAgIH0KICAgIGJ1aWxkZXIucmVwb3J0ZXIuaW50ZXJuYWxFcnJvcigKICAgICAgICB0eXBlLmVsZW1lbnQsICdVbmV4cGVjdGVkIHR5cGUgdmFyaWFibGUgYWNjZXNzOiAkdHlwZVZhcmlhYmxlQWNjZXNzLicpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8gR2VuZXJhdGUgY29kZSB0byBleHRyYWN0IHRoZSB0eXBlIGFyZ3VtZW50IGZyb20gdGhlIG9iamVjdC4KICBISW5zdHJ1Y3Rpb24gcmVhZFR5cGVWYXJpYWJsZShUeXBlVmFyaWFibGVUeXBlIHZhcmlhYmxlLCBNZW1iZXJFbnRpdHkgbWVtYmVyLAogICAgICB7U291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb259KSB7CiAgICBhc3NlcnQobWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIpOwogICAgYXNzZXJ0KHZhcmlhYmxlLmVsZW1lbnQudHlwZURlY2xhcmF0aW9uIGlzIENsYXNzRW50aXR5KTsKICAgIEhJbnN0cnVjdGlvbiB0YXJnZXQgPQogICAgICAgIGJ1aWxkZXIubG9jYWxzSGFuZGxlci5yZWFkVGhpcyhzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogICAgSEluc3RydWN0aW9uIGludGVyY2VwdG9yID0KICAgICAgICBuZXcgSEludGVyY2VwdG9yKHRhcmdldCwgX2Fic3RyYWN0VmFsdWVEb21haW4ubm9uTnVsbFR5cGUpCiAgICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICBidWlsZGVyLmFkZChpbnRlcmNlcHRvcik7CiAgICBidWlsZGVyLnB1c2gobmV3IEhUeXBlSW5mb1JlYWRWYXJpYWJsZS5pbnRlcmNlcHRlZCgKICAgICAgICB2YXJpYWJsZSwgaW50ZXJjZXB0b3IsIHRhcmdldCwgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpCiAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICByZXR1cm4gYnVpbGRlci5wb3AoKTsKICB9CgogIEhJbnN0cnVjdGlvbiBidWlsZFR5cGVBcmd1bWVudFJlcHJlc2VudGF0aW9ucygKICAgICAgRGFydFR5cGUgdHlwZSwgTWVtYmVyRW50aXR5IHNvdXJjZUVsZW1lbnQsCiAgICAgIFtTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbl0pIHsKICAgIGFzc2VydCghdHlwZS5pc1R5cGVWYXJpYWJsZSk7CiAgICAvLyBDb21wdXRlIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBhcmd1bWVudHMsIGluY2x1ZGluZyBhY2Nlc3MKICAgIC8vIHRvIHRoZSBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gZm9yIHR5cGUgdmFyaWFibGVzIGFzIGluc3RydWN0aW9ucy4KICAgIGFzc2VydCh0eXBlLmlzSW50ZXJmYWNlVHlwZSk7CiAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZSA9IHR5cGU7CiAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gPEhJbnN0cnVjdGlvbj5bXTsKICAgIGZvciAoRGFydFR5cGUgYXJndW1lbnQgaW4gaW50ZXJmYWNlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgaW5wdXRzLmFkZChhbmFseXplVHlwZUFyZ3VtZW50KGFyZ3VtZW50LCBzb3VyY2VFbGVtZW50LAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKSk7CiAgICB9CiAgICBISW5zdHJ1Y3Rpb24gcmVwcmVzZW50YXRpb24gPSBuZXcgSFR5cGVJbmZvRXhwcmVzc2lvbigKICAgICAgICBUeXBlSW5mb0V4cHJlc3Npb25LaW5kLklOU1RBTkNFLAogICAgICAgIF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoaW50ZXJmYWNlLmVsZW1lbnQpLAogICAgICAgIGlucHV0cywKICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSkKICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgcmV0dXJuIHJlcHJlc2VudGF0aW9uOwogIH0KCiAgSEluc3RydWN0aW9uIGFuYWx5emVUeXBlQXJndW1lbnQoCiAgICAgIERhcnRUeXBlIGFyZ3VtZW50LCBNZW1iZXJFbnRpdHkgc291cmNlRWxlbWVudCwKICAgICAge1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAgaWYgKGJ1aWxkZXIub3B0aW9ucy5leHBlcmltZW50TmV3UnRpKSB7CiAgICAgIHJldHVybiBhbmFseXplVHlwZUFyZ3VtZW50TmV3UnRpKGFyZ3VtZW50LCBzb3VyY2VFbGVtZW50LAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICAgIGFyZ3VtZW50ID0gYXJndW1lbnQudW5hbGlhc2VkOwogICAgaWYgKGFyZ3VtZW50LnRyZWF0QXNEeW5hbWljKSB7CiAgICAgIC8vIFJlcHJlc2VudCBbZHluYW1pY10gYXMgW251bGxdLgogICAgICByZXR1cm4gYnVpbGRlci5ncmFwaC5hZGRDb25zdGFudE51bGwoX2Nsb3NlZFdvcmxkKTsKICAgIH0KCiAgICBpZiAoYXJndW1lbnQuaXNUeXBlVmFyaWFibGUpIHsKICAgICAgcmV0dXJuIGFkZFR5cGVWYXJpYWJsZVJlZmVyZW5jZShhcmd1bWVudCwgc291cmNlRWxlbWVudCwKICAgICAgICAgIHNvdXJjZUluZm9ybWF0aW9uOiBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CgogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IDxISW5zdHJ1Y3Rpb24+W107CiAgICBhcmd1bWVudC5mb3JFYWNoVHlwZVZhcmlhYmxlKChUeXBlVmFyaWFibGVUeXBlIHZhcmlhYmxlKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEFsc28gbWFrZSB0aGlzIGNvbmRpdGlvbmFsIG9uIHdoZXRoZXIgd2UgaGF2ZQogICAgICAvLyBjYWxjdWxhdGVkIHdlIG5lZWQgdGhhdCBwYXJ0aWN1bGFyIG1ldGhvZCBzaWduYXR1cmUuCiAgICAgIGlucHV0cy5hZGQoYW5hbHl6ZVR5cGVBcmd1bWVudCh2YXJpYWJsZSwgc291cmNlRWxlbWVudCkpOwogICAgfSk7CiAgICBISW5zdHJ1Y3Rpb24gcmVzdWx0ID0gbmV3IEhUeXBlSW5mb0V4cHJlc3Npb24oCiAgICAgICAgVHlwZUluZm9FeHByZXNzaW9uS2luZC5DT01QTEVURSwKICAgICAgICBhcmd1bWVudCwKICAgICAgICBpbnB1dHMsCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpCiAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICAgIGJ1aWxkZXIuYWRkKHJlc3VsdCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgSEluc3RydWN0aW9uIGFuYWx5emVUeXBlQXJndW1lbnROZXdSdGkoCiAgICAgIERhcnRUeXBlIGFyZ3VtZW50LCBNZW1iZXJFbnRpdHkgc291cmNlRWxlbWVudCwKICAgICAge1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAgYXJndW1lbnQgPSBhcmd1bWVudC51bmFsaWFzZWQ7CgogICAgaWYgKCFhcmd1bWVudC5jb250YWluc1R5cGVWYXJpYWJsZXMpIHsKICAgICAgSEluc3RydWN0aW9uIHJ0aSA9IEhMb2FkVHlwZShhcmd1bWVudCwgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpCiAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgICBidWlsZGVyLmFkZChydGkpOwogICAgICByZXR1cm4gcnRpOwogICAgfQogICAgLy8gVE9ETyhzcmEpOiBMb2NhdGUgdHlwZSBlbnZpcm9ubWVudC4KICAgIF9FbnZpcm9ubWVudEV4cHJlc3Npb25BbmRTdHJ1Y3R1cmUgZW52aXJvbm1lbnRBY2Nlc3MgPQogICAgICAgIF9idWlsZEVudmlyb25tZW50Rm9yVHlwZShhcmd1bWVudCwgc291cmNlRWxlbWVudCwKICAgICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgICBISW5zdHJ1Y3Rpb24gcnRpID0gSFR5cGVFdmFsKAogICAgICAgIGVudmlyb25tZW50QWNjZXNzLmV4cHJlc3Npb24sCiAgICAgICAgZW52aXJvbm1lbnRBY2Nlc3Muc3RydWN0dXJlLAogICAgICAgIFR5cGVFeHByZXNzaW9uUmVjaXBlKGFyZ3VtZW50KSwKICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSkKICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgYnVpbGRlci5hZGQocnRpKTsKICAgIHJldHVybiBydGk7CiAgfQoKICBfRW52aXJvbm1lbnRFeHByZXNzaW9uQW5kU3RydWN0dXJlIF9idWlsZEVudmlyb25tZW50Rm9yVHlwZSgKICAgICAgRGFydFR5cGUgdHlwZSwgTWVtYmVyRW50aXR5IG1lbWJlciwKICAgICAge1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAgYXNzZXJ0KHR5cGUuY29udGFpbnNUeXBlVmFyaWFibGVzKTsKICAgIC8vIEJ1aWxkIHRoZSBlbnZpcm9ubWVudCBmb3IgZWFjaCBhY2Nlc3MsIGFuZCBob3BlIEdWTiByZWR1Y2VzIHRoZSBsYXJnZXIKICAgIC8vIG51bWJlciBvZiBleHByZXNzaW9ucy4gQW5vdGhlciBvcHRpb24gaXMgdG8gcHJlY29tcHV0ZSB0aGUgZW52aXJvbm1lbnQgYXQKICAgIC8vIHByb2NlZHVyZSBlbnRyeSBhbmQgb3B0aW1pemUgZWFybHktZXhpdHMgYnkgc2lua2luZyB0aGUgcHJlY29tcHV0ZWQKICAgIC8vIGVudmlyb25tZW50LgoKICAgIC8vIFNwbGl0IHRoZSB0eXBlIHZhcmlhYmxlcyBpbnRvIGNsYXNzLXNjb3BlIGFuZCBmdW5jdGlvbi1zY29wZShzKS4KICAgIGJvb2wgdXNlc0luc3RhbmNlUGFyYW1ldGVycyA9IGZhbHNlOwogICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlOwogICAgU2V0PFR5cGVWYXJpYWJsZVR5cGU+IHBhcmFtZXRlcnMgPSBTZXQoKTsKCiAgICB2b2lkIHByb2Nlc3NUeXBlVmFyaWFibGUoVHlwZVZhcmlhYmxlVHlwZSB0eXBlKSB7CiAgICAgIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIHR5cGVWYXJpYWJsZUFjY2VzczsKICAgICAgaWYgKHR5cGUuZWxlbWVudC50eXBlRGVjbGFyYXRpb24gaXMgQ2xhc3NFbnRpdHkpIHsKICAgICAgICB0eXBlVmFyaWFibGVBY2Nlc3MgPSBjb21wdXRlVHlwZVZhcmlhYmxlQWNjZXNzKG1lbWJlcik7CiAgICAgICAgaW50ZXJmYWNlVHlwZSA9IF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQKICAgICAgICAgICAgLmdldFRoaXNUeXBlKHR5cGUuZWxlbWVudC50eXBlRGVjbGFyYXRpb24pOwogICAgICB9IGVsc2UgewogICAgICAgIHR5cGVWYXJpYWJsZUFjY2VzcyA9IENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzLnBhcmFtZXRlcjsKICAgICAgfQogICAgICBzd2l0Y2ggKHR5cGVWYXJpYWJsZUFjY2VzcykgewogICAgICAgIGNhc2UgQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MucGFyYW1ldGVyOgogICAgICAgICAgcGFyYW1ldGVycy5hZGQodHlwZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgY2FzZSBDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5pbnN0YW5jZUZpZWxkOgogICAgICAgICAgaWYgKG1lbWJlciAhPSBidWlsZGVyLnRhcmdldEVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gV2hlbiBbbWVtYmVyXSBpcyBhIGZpZWxkLCB3ZSBjYW4gZWl0aGVyIGJlIGdlbmVyYXRpbmcgYSBjaGVja2VkCiAgICAgICAgICAgIC8vIHNldHRlciBvciBpbmxpbmluZyBpdHMgaW5pdGlhbGl6ZXIgaW4gYSBjb25zdHJ1Y3Rvci4gQW4KICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZXIgaXMgbmV2ZXIgYnVpbHQgc3RhbmRhbG9uZSwgc28gaW4gdGhhdCBjYXNlIFt0YXJnZXRdCiAgICAgICAgICAgIC8vIGlzIG5vdCB0aGUgW21lbWJlcl0gaXRzZWxmLgogICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZCh0eXBlKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdXNlc0luc3RhbmNlUGFyYW1ldGVycyA9IHRydWU7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgY2FzZSBDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5wcm9wZXJ0eToKICAgICAgICAgIHVzZXNJbnN0YW5jZVBhcmFtZXRlcnMgPSB0cnVlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBidWlsZGVyLnJlcG9ydGVyLmludGVybmFsRXJyb3IoCiAgICAgICAgICAgICAgdHlwZS5lbGVtZW50LCAnVW5leHBlY3RlZCB0eXBlIHZhcmlhYmxlIGluIHN0YXRpYyBjb250ZXh0LicpOwogICAgICB9CiAgICB9CgogICAgdHlwZS5mb3JFYWNoVHlwZVZhcmlhYmxlKHByb2Nlc3NUeXBlVmFyaWFibGUpOwoKICAgIEhJbnN0cnVjdGlvbiBlbnZpcm9ubWVudDsKICAgIFR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZSBzdHJ1Y3R1cmU7CgogICAgaWYgKHVzZXNJbnN0YW5jZVBhcmFtZXRlcnMpIHsKICAgICAgSEluc3RydWN0aW9uIHRhcmdldCA9CiAgICAgICAgICBidWlsZGVyLmxvY2Fsc0hhbmRsZXIucmVhZFRoaXMoc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgLy8gVE9ETyhzcmEpOiBISW5zdGFuY2VFbnZpcm9ubWVudCBzaG91bGQgcHJvYmFibHkgdGFrZSBhbiBpbnRlcmNlcHRvciB0bwogICAgICAvLyBhbGxvdyB0aGUgZ2V0SW50ZXJjZXB0b3IgY2FsbCB0byBiZSByZXVzZWQuCiAgICAgIGVudmlyb25tZW50ID0KICAgICAgICAgIEhJbnN0YW5jZUVudmlyb25tZW50KHRhcmdldCwgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpCiAgICAgICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICAgICAgYnVpbGRlci5hZGQoZW52aXJvbm1lbnQpOwogICAgICBzdHJ1Y3R1cmUgPSBGdWxsVHlwZUVudmlyb25tZW50U3RydWN0dXJlKGNsYXNzVHlwZTogaW50ZXJmYWNlVHlwZSk7CiAgICB9CgogICAgLy8gVE9ETyhzcmEpOiBWaXNpdCBwYXJhbWV0ZXJzIGluIHNvdXJjZS1vcmRlci4KICAgIGZvciAoVHlwZVZhcmlhYmxlVHlwZSBwYXJhbWV0ZXIgaW4gcGFyYW1ldGVycykgewogICAgICBMb2NhbCB0eXBlVmFyaWFibGVMb2NhbCA9CiAgICAgICAgICBidWlsZGVyLmxvY2Fsc0hhbmRsZXIuZ2V0VHlwZVZhcmlhYmxlQXNMb2NhbChwYXJhbWV0ZXIpOwogICAgICBISW5zdHJ1Y3Rpb24gYWNjZXNzID0gYnVpbGRlci5sb2NhbHNIYW5kbGVyCiAgICAgICAgICAucmVhZExvY2FsKHR5cGVWYXJpYWJsZUxvY2FsLCBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwoKICAgICAgaWYgKGVudmlyb25tZW50ID09IG51bGwpIHsKICAgICAgICBlbnZpcm9ubWVudCA9IGFjY2VzczsKICAgICAgICBzdHJ1Y3R1cmUgPSBTaW5nbGV0b25UeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUocGFyYW1ldGVyKTsKICAgICAgfSBlbHNlIGlmIChzdHJ1Y3R1cmUgaXMgU2luZ2xldG9uVHlwZUVudmlyb25tZW50U3RydWN0dXJlKSB7CiAgICAgICAgU2luZ2xldG9uVHlwZUVudmlyb25tZW50U3RydWN0dXJlIHNpbmdsZXRvblN0cnVjdHVyZSA9IHN0cnVjdHVyZTsKICAgICAgICAvLyBDb252ZXJ0IGEgc2luZ2xldG9uIGVudmlyb25tZW50IGludG8gYSBzaW5nbGV0b24gdHVwbGUgYW5kIGV4dGVuZCBpdAogICAgICAgIC8vIHZpYSAnYmluZCcuIGkuZS4gZ2VuZXJhdGUgYGVudjEuX2V2YWwoIkA8MD4iKS5fYmluZChlbnYyKWAgVE9ETyhzcmEpOgogICAgICAgIC8vIEhhdmUgYSBiaW5kMSBpbnN0cnVjdGlvbi4KICAgICAgICAvLyBUT0RPKHNyYSk6IEFkZCBhICdSdGkuX2JpbmQxJyBtZXRob2QgdG8gc2hvcnRlbiBhbmQgYWNjZWxlcmF0ZSB0aGlzCiAgICAgICAgLy8gY29tbW9uIGNhc2UuCiAgICAgICAgSEluc3RydWN0aW9uIHNpbmdsZXRvblR1cGxlID0gSFR5cGVFdmFsKAogICAgICAgICAgICBlbnZpcm9ubWVudCwKICAgICAgICAgICAgc3RydWN0dXJlLAogICAgICAgICAgICBGdWxsVHlwZUVudmlyb25tZW50UmVjaXBlKHR5cGVzOiBbc2luZ2xldG9uU3RydWN0dXJlLnZhcmlhYmxlXSksCiAgICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlKQogICAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgICAgIGJ1aWxkZXIuYWRkKHNpbmdsZXRvblR1cGxlKTsKICAgICAgICBlbnZpcm9ubWVudCA9CiAgICAgICAgICAgIEhUeXBlQmluZChzaW5nbGV0b25UdXBsZSwgYWNjZXNzLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSk7CiAgICAgICAgYnVpbGRlci5hZGQoZW52aXJvbm1lbnQpOwogICAgICAgIHN0cnVjdHVyZSA9IEZ1bGxUeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUoCiAgICAgICAgICAgIGJpbmRpbmdzOiBbc2luZ2xldG9uU3RydWN0dXJlLnZhcmlhYmxlLCBwYXJhbWV0ZXJdKTsKICAgICAgfSBlbHNlIGlmIChzdHJ1Y3R1cmUgaXMgRnVsbFR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZSkgewogICAgICAgIEZ1bGxUeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUgZnVsbFN0cnVjdHVyZSA9IHN0cnVjdHVyZTsKICAgICAgICBlbnZpcm9ubWVudCA9CiAgICAgICAgICAgIEhUeXBlQmluZChlbnZpcm9ubWVudCwgYWNjZXNzLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSk7CiAgICAgICAgYnVpbGRlci5hZGQoZW52aXJvbm1lbnQpOwogICAgICAgIHN0cnVjdHVyZSA9IEZ1bGxUeXBlRW52aXJvbm1lbnRTdHJ1Y3R1cmUoCiAgICAgICAgICAgIGNsYXNzVHlwZTogZnVsbFN0cnVjdHVyZS5jbGFzc1R5cGUsCiAgICAgICAgICAgIGJpbmRpbmdzOiBbLi4uZnVsbFN0cnVjdHVyZS5iaW5kaW5ncywgcGFyYW1ldGVyXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnVpbGRlci5yZXBvcnRlci5pbnRlcm5hbEVycm9yKHBhcmFtZXRlci5lbGVtZW50LCAnVW5leHBlY3RlZCcpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIF9FbnZpcm9ubWVudEV4cHJlc3Npb25BbmRTdHJ1Y3R1cmUoZW52aXJvbm1lbnQsIHN0cnVjdHVyZSk7CiAgfQoKICAvLy8gQnVpbGQgYSBbSFR5cGVDb252ZXJzaW9uXSBmb3IgY29udmVydGluZyBbb3JpZ2luYWxdIHRvIHR5cGUgW3R5cGVdLgogIC8vLwogIC8vLyBJbnZhcmlhbnQ6IFt0eXBlXSBtdXN0IGJlIHZhbGlkIGluIHRoZSBjb250ZXh0LgogIC8vLyBTZWUgW0xvY2Fsc0hhbmRsZXIuc3Vic3RJbkNvbnRleHRdLgogIEhJbnN0cnVjdGlvbiBidWlsZFR5cGVDb252ZXJzaW9uKAogICAgICBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIERhcnRUeXBlIHR5cGUsIGludCBraW5kLAogICAgICB7U291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb259KSB7CiAgICBpZiAoYnVpbGRlci5vcHRpb25zLmV4cGVyaW1lbnROZXdSdGkpIHsKICAgICAgcmV0dXJuIGJ1aWxkQXNDaGVjayhvcmlnaW5hbCwgdHlwZSwKICAgICAgICAgIGlzVHlwZUVycm9yOiBraW5kID09IEhUeXBlQ29udmVyc2lvbi5UWVBFX0NIRUNLLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KCiAgICBpZiAodHlwZSA9PSBudWxsKSByZXR1cm4gb3JpZ2luYWw7CiAgICB0eXBlID0gdHlwZS51bmFsaWFzZWQ7CiAgICBpZiAodHlwZS5pc0ludGVyZmFjZVR5cGUgJiYgIXR5cGUudHJlYXRBc1JhdykgewogICAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZVR5cGUgPSB0eXBlOwogICAgICBBYnN0cmFjdFZhbHVlIHN1YnR5cGUgPQogICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlTnVsbGFibGVTdWJ0eXBlKGludGVyZmFjZVR5cGUuZWxlbWVudCk7CiAgICAgIEhJbnN0cnVjdGlvbiByZXByZXNlbnRhdGlvbnMgPSBidWlsZFR5cGVBcmd1bWVudFJlcHJlc2VudGF0aW9ucygKICAgICAgICAgIHR5cGUsIGJ1aWxkZXIuc291cmNlRWxlbWVudCwgc291cmNlSW5mb3JtYXRpb24pOwogICAgICBidWlsZGVyLmFkZChyZXByZXNlbnRhdGlvbnMpOwogICAgICByZXR1cm4gbmV3IEhUeXBlQ29udmVyc2lvbi53aXRoVHlwZVJlcHJlc2VudGF0aW9uKAogICAgICAgICAgdHlwZSwga2luZCwgc3VidHlwZSwgb3JpZ2luYWwsIHJlcHJlc2VudGF0aW9ucykKICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICB9IGVsc2UgaWYgKHR5cGUuaXNUeXBlVmFyaWFibGUpIHsKICAgICAgQWJzdHJhY3RWYWx1ZSBzdWJ0eXBlID0gb3JpZ2luYWwuaW5zdHJ1Y3Rpb25UeXBlOwogICAgICBISW5zdHJ1Y3Rpb24gdHlwZVZhcmlhYmxlID0KICAgICAgICAgIGFkZFR5cGVWYXJpYWJsZVJlZmVyZW5jZSh0eXBlLCBidWlsZGVyLnNvdXJjZUVsZW1lbnQpOwogICAgICByZXR1cm4gbmV3IEhUeXBlQ29udmVyc2lvbi53aXRoVHlwZVJlcHJlc2VudGF0aW9uKAogICAgICAgICAgdHlwZSwga2luZCwgc3VidHlwZSwgb3JpZ2luYWwsIHR5cGVWYXJpYWJsZSkKICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICB9IGVsc2UgaWYgKHR5cGUuaXNGdW5jdGlvblR5cGUgfHwgdHlwZS5pc0Z1dHVyZU9yKSB7CiAgICAgIEhJbnN0cnVjdGlvbiByZWlmaWVkVHlwZSA9CiAgICAgICAgICBhbmFseXplVHlwZUFyZ3VtZW50KHR5cGUsIGJ1aWxkZXIuc291cmNlRWxlbWVudCk7CiAgICAgIC8vIFR5cGVNYXNrcyBkb24ndCBlbmNvZGUgZnVuY3Rpb24gdHlwZXMgb3IgRnV0dXJlT3IgdHlwZXMuCiAgICAgIEFic3RyYWN0VmFsdWUgcmVmaW5lZE1hc2sgPSBvcmlnaW5hbC5pbnN0cnVjdGlvblR5cGU7CiAgICAgIHJldHVybiBuZXcgSFR5cGVDb252ZXJzaW9uLndpdGhUeXBlUmVwcmVzZW50YXRpb24oCiAgICAgICAgICB0eXBlLCBraW5kLCByZWZpbmVkTWFzaywgb3JpZ2luYWwsIHJlaWZpZWRUeXBlKQogICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBvcmlnaW5hbC5jb252ZXJ0VHlwZShfY2xvc2VkV29ybGQsIHR5cGUsIGtpbmQpCiAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgfQogIH0KCiAgLy8vIEJ1aWxkIGEgW0hBc0NoZWNrXSBmb3IgY29udmVydGluZyBbb3JpZ2luYWxdIHRvIHR5cGUgW3R5cGVdLgogIC8vLwogIC8vLyBJbnZhcmlhbnQ6IFt0eXBlXSBtdXN0IGJlIHZhbGlkIGluIHRoZSBjb250ZXh0LgogIC8vLyBTZWUgW0xvY2Fsc0hhbmRsZXIuc3Vic3RJbkNvbnRleHRdLgogIEhJbnN0cnVjdGlvbiBidWlsZEFzQ2hlY2soSEluc3RydWN0aW9uIG9yaWdpbmFsLCBEYXJ0VHlwZSB0eXBlLAogICAgICB7Ym9vbCBpc1R5cGVFcnJvciwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb259KSB7CiAgICBpZiAodHlwZSA9PSBudWxsKSByZXR1cm4gb3JpZ2luYWw7CiAgICB0eXBlID0gdHlwZS51bmFsaWFzZWQ7CgogICAgaWYgKHR5cGUuaXNEeW5hbWljKSByZXR1cm4gb3JpZ2luYWw7CiAgICBpZiAodHlwZS5pc1ZvaWQpIHJldHVybiBvcmlnaW5hbDsKICAgIGlmICh0eXBlID09IF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5vYmplY3RUeXBlKSByZXR1cm4gb3JpZ2luYWw7CgogICAgSEluc3RydWN0aW9uIHJlaWZpZWRUeXBlID0gYW5hbHl6ZVR5cGVBcmd1bWVudE5ld1J0aSgKICAgICAgICB0eXBlLCBidWlsZGVyLnNvdXJjZUVsZW1lbnQsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIEFic3RyYWN0VmFsdWVXaXRoUHJlY2lzaW9uIGNoZWNrZWRUeXBlID0KICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVGcm9tU3RhdGljVHlwZSh0eXBlKTsKICAgIEFic3RyYWN0VmFsdWUgaW5zdHJ1Y3Rpb25UeXBlID0gX2Fic3RyYWN0VmFsdWVEb21haW4uaW50ZXJzZWN0aW9uKAogICAgICAgIG9yaWdpbmFsLmluc3RydWN0aW9uVHlwZSwgY2hlY2tlZFR5cGUuYWJzdHJhY3RWYWx1ZSk7CiAgICByZXR1cm4gSEFzQ2hlY2soCiAgICAgICAgb3JpZ2luYWwsIHJlaWZpZWRUeXBlLCBjaGVja2VkVHlwZSwgdHlwZSwgaXNUeXBlRXJyb3IsIGluc3RydWN0aW9uVHlwZSkKICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogIH0KfQoKY2xhc3MgX0Vudmlyb25tZW50RXhwcmVzc2lvbkFuZFN0cnVjdHVyZSB7CiAgZmluYWwgSEluc3RydWN0aW9uIGV4cHJlc3Npb247CiAgZmluYWwgVHlwZUVudmlyb25tZW50U3RydWN0dXJlIHN0cnVjdHVyZTsKICBfRW52aXJvbm1lbnRFeHByZXNzaW9uQW5kU3RydWN0dXJlKHRoaXMuZXhwcmVzc2lvbiwgdGhpcy5zdHJ1Y3R1cmUpOwp9CoHvAE5OPAEeFSQhMScoGiwYAU0fMggBPQwBSg0BTUscBk4USxURAgFLMB0nAR0BOAEyKAFPSi8jNxslLEU/O0AEAT9CGi4nMgQBUCdCGjcZSU5IUEsPQk4XBhIEAVAnPBtCNhcGPkYdBAFMJzcuTRcGGhQEATdKJy5LMSo1MTUGNyMdBAFHSh84SidANyMdBAE3Oz4uSzEqOTE4BjcjHQQBSgFOKTIvHjwBOCQsMQYBLCUjTwYBMDc+DT4GIi4iMi9NUUweJAohLSEpKEoGJFARBAFCUC8lPRpOH0MzHjhJMBoEATExLyJKSyIkMjk+MgY7KUgQKi8bBAEkNS8sQDEGIyMoOgYBIz8xBgEyP0w+QAgzKRIQKi8ZEwQBKjUvIwErTzEYEgYrOzozASImJSgqLxYQBAE/Ki8oTlFLFAFIKSEuATYyOUA4OA9ACCQwIBI0MU9HTysiFAwpEi8pEhEqTAgGATMBHigBIhxQUDUUSTUgSgYBNDUgQzJPASEeQkNKUFElTxgxGRdNLjMlFlEiMkE+QBZOIjIwPw9JCAYBRwQBSgY2KiQ2LywqOzEGAScbNCoeTUc7JDk6MSY4IkE5NzE5ITxCPDk6MQ08MQYEAUMGNipCQScbASkmSQE6JS8tOUc+FVAvBAIBKyEsRwIBKnBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS90eXBlX2J1aWxkZXIuZGFydDpzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci9idWlsZGVyX2tlcm5lbC5kYXJ0wAEyZi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY2xvc3VyZS5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vY29tbW9uL25hbWVzLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy9jb25zdGFudF9zeXN0ZW0uZGFydCcgYXMgY29uc3RhbnRfc3lzdGVtOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvanVtcHMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2lyL2NvbnN0YW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9pci9zdGF0aWNfdHlwZV9wcm92aWRlci5kYXJ0JzsKaW1wb3J0ICcuLi9pci91dGlsLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvbG9jYWxzLmRhcnQnIHNob3cgSnVtcFZpc2l0b3I7CmltcG9ydCAnLi4vanNfbW9kZWwvanNfd29ybGQuZGFydCc7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2lkZV9lZmZlY3RzLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICdpbmZlcnJlcl9lbmdpbmUuZGFydCc7CmltcG9ydCAnbG9jYWxzX2hhbmRsZXIuZGFydCc7CmltcG9ydCAndHlwZV9ncmFwaF9ub2Rlcy5kYXJ0JzsKaW1wb3J0ICd0eXBlX3N5c3RlbS5kYXJ0JzsKCi8vLyBbS2VybmVsVHlwZUdyYXBoQnVpbGRlcl0gY29uc3RydWN0cyBhIHR5cGUtaW5mZXJlbmNlIGdyYXBoIGZvciBhIHBhcnRpY3VsYXIKLy8vIGVsZW1lbnQuCi8vLwovLy8gQ2FsbGluZyBbcnVuXSB3aWxsIHN0YXJ0IHRoZSB3b3JrIG9mIHZpc2l0aW5nIHRoZSBib2R5IG9mIHRoZSBjb2RlIHRvCi8vLyBjb25zdHJ1Y3QgYSBzZXQgb2YgaW5mZXJlbmNlLW5vZGVzIHRoYXQgYWJzdHJhY3RseSByZXByZXNlbnQgd2hhdCB0aGUgY29kZQovLy8gaXMgZG9pbmcuCmNsYXNzIEtlcm5lbFR5cGVHcmFwaEJ1aWxkZXIgZXh0ZW5kcyBpci5WaXNpdG9yPFR5cGVJbmZvcm1hdGlvbj4gewogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBfb3B0aW9uczsKICBmaW5hbCBKc0Nsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKICBmaW5hbCBJbmZlcnJlckVuZ2luZSBfaW5mZXJyZXI7CiAgZmluYWwgVHlwZVN5c3RlbSBfdHlwZXM7CiAgZmluYWwgTWVtYmVyRW50aXR5IF9hbmFseXplZE1lbWJlcjsKICBmaW5hbCBpci5Ob2RlIF9hbmFseXplZE5vZGU7CiAgZmluYWwgS2VybmVsVG9Mb2NhbHNNYXAgX2xvY2Fsc01hcDsKICBmaW5hbCBHbG9iYWxUeXBlSW5mZXJlbmNlRWxlbWVudERhdGEgX21lbWJlckRhdGE7CiAgZmluYWwgYm9vbCBfaW5HZW5lcmF0aXZlQ29uc3RydWN0b3I7CgogIExvY2FsU3RhdGUgX3N0YXRlSW50ZXJuYWw7CiAgTG9jYWxTdGF0ZSBfc3RhdGVBZnRlcldoZW5UcnVlSW50ZXJuYWw7CiAgTG9jYWxTdGF0ZSBfc3RhdGVBZnRlcldoZW5GYWxzZUludGVybmFsOwoKICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBsb2NhbCBzdGF0ZSBmb3Igd2hlbiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgbW9zdAogIC8vLyByZWNlbnRseSB2aXNpdGVkIG5vZGUgaXMgbm90IHRha2VuIGludG8gYWNjb3VudAogIExvY2FsU3RhdGUgZ2V0IF9zdGF0ZSB7CiAgICByZXR1cm4gX3N0YXRlSW50ZXJuYWw7CiAgfQoKICAvLy8gU2V0cyB0aGUgY3VycmVudCBsb2NhbCBzdGF0ZSBmb3Igd2hlbiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgbW9zdAogIC8vLyByZWNlbnRseSB2aXNpdGVkIG5vZGUgaXMgbm90IHRha2VuIGludG8gYWNjb3VudAogIC8vLwogIC8vLyBUaGlzIHVzZWQgZm9yIHdoZW4gdGhlIG1vc3QgcmVjZW50bHkgdmlzaXRlZCBub2RlIGlzIG5vdCBhIGJvb2xlYW4KICAvLy8gZXhwcmVzc2lvbiBhbmQgdGhlcmUgZm9yIGFsc28gcmVzZXRzIFtfc3RhdGVBZnRlcldoZW5UcnVlXSBhbmQKICAvLy8gW19zdGF0ZUFmdGVyV2hlbkZhbHNlXSB0byB0aGUgc2FtZSB2YWx1ZS4KICB2b2lkIHNldCBfc3RhdGUoTG9jYWxTdGF0ZSB2YWx1ZSkgewogICAgX3N0YXRlSW50ZXJuYWwgPSB2YWx1ZTsKICAgIF9zdGF0ZUFmdGVyV2hlblRydWVJbnRlcm5hbCA9IF9zdGF0ZUFmdGVyV2hlbkZhbHNlSW50ZXJuYWwgPSBudWxsOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgbG9jYWwgc3RhdGUgZm9yIHdoZW4gdGhlIG1vc3QgcmVjZW50bHkgdmlzaXRlZCBub2RlCiAgLy8vIGhhcyBldmFsdWF0ZWQgdG8gYHRydWVgLgogIC8vLwogIC8vLyBJZiB0aGUgbW9zdCByZWNlbnRseSB2aXNpdGVkIG5vZGUgaXMgbm90IGEgYm9vbGVhbiBleHByZXNzaW9uIHRoZW4gdGhpcyBpcwogIC8vLyB0aGUgc2FtZSBhcyBbX3N0YXRlXS4KICBMb2NhbFN0YXRlIGdldCBfc3RhdGVBZnRlcldoZW5UcnVlID0+CiAgICAgIF9zdGF0ZUFmdGVyV2hlblRydWVJbnRlcm5hbCA/PyBfc3RhdGVJbnRlcm5hbDsKCiAgLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgbG9jYWwgc3RhdGUgZm9yIHdoZW4gdGhlIG1vc3QgcmVjZW50bHkgdmlzaXRlZCBub2RlCiAgLy8vIGhhcyBldmFsdWF0ZWQgdG8gYGZhbHNlYC4KICAvLy8KICAvLy8gSWYgdGhlIG1vc3QgcmVjZW50bHkgdmlzaXRlZCBub2RlIGlzIG5vdCBhIGJvb2xlYW4gZXhwcmVzc2lvbiB0aGVuIHRoaXMgaXMKICAvLy8gdGhlIHNhbWUgYXMgW19zdGF0ZV0uCiAgTG9jYWxTdGF0ZSBnZXQgX3N0YXRlQWZ0ZXJXaGVuRmFsc2UgPT4KICAgICAgX3N0YXRlQWZ0ZXJXaGVuRmFsc2VJbnRlcm5hbCA/PyBfc3RhdGVJbnRlcm5hbDsKCiAgLy8vIFNldHMgdGhlIGN1cnJlbnQgbG9jYWwgc3RhdGUuIFtiYXNlXSBpcyB0aGUgbG9jYWwgc3RhdGUgZm9yIHdoZW4gdGhlCiAgLy8vIGJvb2xlYW4gdmFsdWUgb2YgdGhlIG1vc3QgcmVjZW50bHkgdmlzaXRlZCBub2RlIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQuCiAgLy8vIFt3aGVuVHJ1ZV0gYW5kIFt3aGVuRmFsc2VdIGFyZSB0aGUgbG9jYWwgc3RhdGUgZm9yIHdoZW4gdGhlIGJvb2xlYW4gdmFsdWUKICAvLy8gb2YgdGhlIG1vc3QgcmVjZW50bHkgdmlzaXRlZCBub2RlIGlzIGB0cnVlYCBvciBgZmFsc2VgLCByZXNwZWN0aXZlbHkuCiAgdm9pZCBfc2V0U3RhdGVBZnRlcigKICAgICAgTG9jYWxTdGF0ZSBiYXNlLCBMb2NhbFN0YXRlIHdoZW5UcnVlLCBMb2NhbFN0YXRlIHdoZW5GYWxzZSkgewogICAgX3N0YXRlSW50ZXJuYWwgPSBiYXNlOwogICAgX3N0YXRlQWZ0ZXJXaGVuVHJ1ZUludGVybmFsID0gd2hlblRydWU7CiAgICBfc3RhdGVBZnRlcldoZW5GYWxzZUludGVybmFsID0gd2hlbkZhbHNlOwogIH0KCiAgZmluYWwgU2lkZUVmZmVjdHNCdWlsZGVyIF9zaWRlRWZmZWN0c0J1aWxkZXI7CiAgZmluYWwgTWFwPEp1bXBUYXJnZXQsIExpc3Q8TG9jYWxTdGF0ZT4+IF9icmVha3NGb3IgPQogICAgICA8SnVtcFRhcmdldCwgTGlzdDxMb2NhbFN0YXRlPj57fTsKICBmaW5hbCBNYXA8SnVtcFRhcmdldCwgTGlzdDxMb2NhbFN0YXRlPj4gX2NvbnRpbnVlc0ZvciA9CiAgICAgIDxKdW1wVGFyZ2V0LCBMaXN0PExvY2FsU3RhdGU+Pnt9OwogIFR5cGVJbmZvcm1hdGlvbiBfcmV0dXJuVHlwZTsKICBmaW5hbCBTZXQ8TG9jYWw+IF9jYXB0dXJlZFZhcmlhYmxlcyA9IG5ldyBTZXQ8TG9jYWw+KCk7CiAgZmluYWwgTWFwPExvY2FsLCBGaWVsZEVudGl0eT4gX2NhcHR1cmVkQW5kQm94ZWQ7CgogIGZpbmFsIFN0YXRpY1R5cGVQcm92aWRlciBfc3RhdGljVHlwZVByb3ZpZGVyOwoKICAvLy8gV2hldGhlciB3ZSBjdXJyZW50bHkgdGFrZW4gdGhlIGJvb2xlYW4gcmVzdWx0IG9mIGlzLWNoZWNrcyBvciBudWxsLWNoZWNrcwogIC8vLyBpbnRvIGFjY291bnQgaW4gdGhlIGxvY2FsIHN0YXRlLgogIGJvb2wgX2FjY3VtdWxhdGVJc0NoZWNrcyA9IGZhbHNlOwoKICBLZXJuZWxUeXBlR3JhcGhCdWlsZGVyKAogICAgICB0aGlzLl9vcHRpb25zLAogICAgICB0aGlzLl9jbG9zZWRXb3JsZCwKICAgICAgdGhpcy5faW5mZXJyZXIsCiAgICAgIHRoaXMuX2FuYWx5emVkTWVtYmVyLAogICAgICB0aGlzLl9hbmFseXplZE5vZGUsCiAgICAgIHRoaXMuX2xvY2Fsc01hcCwKICAgICAgdGhpcy5fc3RhdGljVHlwZVByb3ZpZGVyLAogICAgICBbdGhpcy5fc3RhdGVJbnRlcm5hbCwKICAgICAgTWFwPExvY2FsLCBGaWVsZEVudGl0eT4gY2FwdHVyZWRBbmRCb3hlZF0pCiAgICAgIDogdGhpcy5fdHlwZXMgPSBfaW5mZXJyZXIudHlwZXMsCiAgICAgICAgdGhpcy5fbWVtYmVyRGF0YSA9IF9pbmZlcnJlci5kYXRhT2ZNZW1iZXIoX2FuYWx5emVkTWVtYmVyKSwKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTaG91bGQgc2lkZSBlZmZlY3RzIGFsc28gYmUgdHJhY2tlZCBmb3IgZmllbGQKICAgICAgICAvLyBpbml0aWFsaXplcnM/CiAgICAgICAgdGhpcy5fc2lkZUVmZmVjdHNCdWlsZGVyID0gX2FuYWx5emVkTWVtYmVyIGlzIEZ1bmN0aW9uRW50aXR5CiAgICAgICAgICAgID8gX2luZmVycmVyLmluZmVycmVkRGF0YUJ1aWxkZXIKICAgICAgICAgICAgICAgIC5nZXRTaWRlRWZmZWN0c0J1aWxkZXIoX2FuYWx5emVkTWVtYmVyKQogICAgICAgICAgICA6IG5ldyBTaWRlRWZmZWN0c0J1aWxkZXIuZnJlZShfYW5hbHl6ZWRNZW1iZXIpLAogICAgICAgIHRoaXMuX2luR2VuZXJhdGl2ZUNvbnN0cnVjdG9yID0gX2FuYWx5emVkTm9kZSBpcyBpci5Db25zdHJ1Y3RvciwKICAgICAgICB0aGlzLl9jYXB0dXJlZEFuZEJveGVkID0gY2FwdHVyZWRBbmRCb3hlZCAhPSBudWxsCiAgICAgICAgICAgID8gbmV3IE1hcDxMb2NhbCwgRmllbGRFbnRpdHk+LmZyb20oY2FwdHVyZWRBbmRCb3hlZCkKICAgICAgICAgICAgOiA8TG9jYWwsIEZpZWxkRW50aXR5Pnt9IHsKICAgIGlmIChfc3RhdGUgIT0gbnVsbCkgcmV0dXJuOwoKICAgIF9zdGF0ZSA9IG5ldyBMb2NhbFN0YXRlLmluaXRpYWwoCiAgICAgICAgaW5HZW5lcmF0aXZlQ29uc3RydWN0b3I6IF9pbkdlbmVyYXRpdmVDb25zdHJ1Y3Rvcik7CiAgfQoKICBKc1RvRWxlbWVudE1hcCBnZXQgX2VsZW1lbnRNYXAgPT4gX2Nsb3NlZFdvcmxkLmVsZW1lbnRNYXA7CgogIENsb3N1cmVEYXRhIGdldCBfY2xvc3VyZURhdGFMb29rdXAgPT4gX2Nsb3NlZFdvcmxkLmNsb3N1cmVEYXRhTG9va3VwOwoKICBEYXJ0VHlwZSBfZ2V0U3RhdGljVHlwZShpci5FeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBfZWxlbWVudE1hcC5nZXREYXJ0VHlwZShfc3RhdGljVHlwZVByb3ZpZGVyLmdldFN0YXRpY1R5cGUobm9kZSkpOwogIH0KCiAgaW50IF9sb29wTGV2ZWwgPSAwOwoKICBib29sIGdldCBpbkxvb3AgPT4gX2xvb3BMZXZlbCA+IDA7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbWVtYmVyXSBpcyBkZWZpbmVkIGluIGEgc3ViY2xhc3Mgb2YgdGhlIGN1cnJlbnQgdGhpcwogIC8vLyB0eXBlLgogIGJvb2wgX2lzSW5DbGFzc09yU3ViY2xhc3MoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgQ2xhc3NFbnRpdHkgY2xzID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyVGhpc1R5cGUoX2FuYWx5emVkTWVtYmVyKT8uZWxlbWVudDsKICAgIGlmIChjbHMgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIF9jbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeS5pc1N1YmNsYXNzT2YobWVtYmVyLmVuY2xvc2luZ0NsYXNzLCBjbHMpOwogIH0KCiAgLy8vIENoZWNrcyB3aGV0aGVyIHRoZSBhY2Nlc3Mgb3IgdXBkYXRlIG9mIFtzZWxlY3Rvcl0gb24gW21hc2tdIHBvdGVudGlhbGx5CiAgLy8vIGV4cG9zZXMgYHRoaXNgLgogIC8vLwogIC8vLyBJZiBhbGwgbWF0Y2hpbmcgbWVtYmVycyBhcmUgaW5zdGFuY2UgZmllbGRzIG9uIHRoZSBjdXJyZW50IGB0aGlzYAogIC8vLyBjbGFzcyBvciBzdWJjbGFzc2VzLCBgdGhpc2AgaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUgZXhwb3NlZC4KICAvLy8KICAvLy8gSWYgYW4gaW5zdGFuY2UgZmllbGQgbWF0Y2hlZCB3aXRoIGEgW3NlbGVjdG9yXSB0aGF0IGlzIF9ub3RfIGEgc2V0dGVyLCB0aGUKICAvLy8gZmllbGQgaXMgY29uc2lkZXJlZCB0byBoYXZlIGJlZW4gcmVhZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gYW5kIHRoZSBmaWVsZAogIC8vLyBpcyBhc3N1bWVkIHRvIGJlIHBvdGVudGlhbGx5IGBudWxsYC4KICB2b2lkIF9jaGVja0lmRXhwb3Nlc1RoaXMoU2VsZWN0b3Igc2VsZWN0b3IsIEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgaWYgKF9zdGF0ZS5pc1RoaXNFeHBvc2VkKSB7CiAgICAgIC8vIFdlIGFscmVhZHkgY29uc2lkZXIgYHRoaXNgIHRvIGhhdmUgYmVlbiBleHBvc2VkLgogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoX2luZmVycmVyLmNsb3NlZFdvcmxkLmluY2x1ZGVzQ2xvc3VyZUNhbGwoc2VsZWN0b3IsIG1hc2spKSB7CiAgICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogV2UgY291bGQgZG8gYmV0dGVyIGhlcmUgaWYgd2Uga25ldyB3aGF0IHdlCiAgICAgIC8vIGFyZSBjYWxsaW5nIGRvZXMgbm90IGV4cG9zZSB0aGlzLgogICAgICBfc3RhdGUubWFya1RoaXNBc0V4cG9zZWQoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9pbmZlcnJlci5mb3JFYWNoRWxlbWVudE1hdGNoaW5nKHNlbGVjdG9yLCBtYXNrLCAoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuaXNGaWVsZCkgewogICAgICAgICAgRmllbGRFbnRpdHkgZmllbGQgPSBlbGVtZW50OwogICAgICAgICAgaWYgKCFzZWxlY3Rvci5pc1NldHRlciAmJgogICAgICAgICAgICAgIF9pc0luQ2xhc3NPclN1YmNsYXNzKGZpZWxkKSAmJgogICAgICAgICAgICAgIGZpZWxkLmlzQXNzaWduYWJsZSAmJgogICAgICAgICAgICAgIF9zdGF0ZS5yZWFkRmllbGQoZmllbGQpID09IG51bGwgJiYKICAgICAgICAgICAgICBnZXRGaWVsZEluaXRpYWxpemVyKF9lbGVtZW50TWFwLCBmaWVsZCkgPT0gbnVsbCkgewogICAgICAgICAgICAvLyBJZiB0aGUgZmllbGQgaXMgYmVpbmcgdXNlZCBiZWZvcmUgdGhpcyBjb25zdHJ1Y3RvcgogICAgICAgICAgICAvLyBhY3R1YWxseSBoYWQgYSBjaGFuY2UgdG8gaW5pdGlhbGl6ZSBpdCwgc2F5IGl0IGNhbiBiZQogICAgICAgICAgICAvLyBudWxsLgogICAgICAgICAgICBfaW5mZXJyZXIucmVjb3JkVHlwZU9mRmllbGQoZmllbGQsIF90eXBlcy5udWxsVHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBBY2Nlc3NpbmcgYSBmaWVsZCBkb2VzIG5vdCBleHBvc2UgYHRoaXNgLgogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogV2UgY291bGQgZG8gYmV0dGVyIGhlcmUgaWYgd2Uga25ldyB3aGF0IHdlCiAgICAgICAgLy8gYXJlIGNhbGxpbmcgZG9lcyBub3QgZXhwb3NlIHRoaXMuCiAgICAgICAgX3N0YXRlLm1hcmtUaGlzQXNFeHBvc2VkKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KTsKICAgIH0KICB9CgogIFR5cGVJbmZvcm1hdGlvbiBydW4oKSB7CiAgICBpZiAoX2FuYWx5emVkTWVtYmVyLmlzRmllbGQpIHsKICAgICAgaWYgKF9hbmFseXplZE5vZGUgPT0gbnVsbCB8fCBfYW5hbHl6ZWROb2RlIGlzIGlyLk51bGxMaXRlcmFsKSB7CiAgICAgICAgLy8gRWFnZXJseSBiYWlsb3V0LCBiZWNhdXNlIGNvbXB1dGluZyB0aGUgY2xvc3VyZSBkYXRhIG9ubHkKICAgICAgICAvLyB3b3JrcyBmb3IgZnVuY3Rpb25zIGFuZCBmaWVsZCBhc3NpZ25tZW50cy4KICAgICAgICByZXR1cm4gX3R5cGVzLm51bGxUeXBlOwogICAgICB9CiAgICB9CgogICAgLy8gVXBkYXRlIHRoZSBsb2NhbHMgdGhhdCBhcmUgYm94ZWQgaW4gW2xvY2Fsc10uIFRoZXNlIGxvY2FscyB3aWxsCiAgICAvLyBiZSBoYW5kbGVkIHNwZWNpYWxseSwgaW4gdGhhdCB3ZSBhcmUgY29tcHV0aW5nIHRoZWlyIExVQiBhdAogICAgLy8gZWFjaCB1cGRhdGUsIGFuZCByZWFkaW5nIHRoZW0geWllbGRzIHRoZSB0eXBlIHRoYXQgd2FzIGZvdW5kIGluIGEKICAgIC8vIHByZXZpb3VzIGFuYWx5c2lzIG9mIFtvdXRlcm1vc3RFbGVtZW50XS4KICAgIFNjb3BlSW5mbyBzY29wZUluZm8gPSBfY2xvc3VyZURhdGFMb29rdXAuZ2V0U2NvcGVJbmZvKF9hbmFseXplZE1lbWJlcik7CiAgICBzY29wZUluZm8uZm9yRWFjaEJveGVkVmFyaWFibGUoKHZhcmlhYmxlLCBmaWVsZCkgewogICAgICBfY2FwdHVyZWRBbmRCb3hlZFt2YXJpYWJsZV0gPSBmaWVsZDsKICAgIH0pOwoKICAgIHJldHVybiB2aXNpdChfYW5hbHl6ZWROb2RlKTsKICB9CgogIGJvb2wgaXNJbmNvbXBhdGlibGVJbnZva2UoRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24sIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cykgewogICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSA9IGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZTsKCiAgICByZXR1cm4gYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoIDwKICAgICAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlLnJlcXVpcmVkUGFyYW1ldGVycyB8fAogICAgICAgIGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA+IHBhcmFtZXRlclN0cnVjdHVyZS5wb3NpdGlvbmFsUGFyYW1ldGVycyB8fAogICAgICAgIGFyZ3VtZW50cy5uYW1lZC5rZXlzCiAgICAgICAgICAgIC5hbnkoKG5hbWUpID0+ICFwYXJhbWV0ZXJTdHJ1Y3R1cmUubmFtZWRQYXJhbWV0ZXJzLmNvbnRhaW5zKG5hbWUpKTsKICB9CgogIHZvaWQgcmVjb3JkUmV0dXJuVHlwZShUeXBlSW5mb3JtYXRpb24gdHlwZSkgewogICAgRnVuY3Rpb25FbnRpdHkgYW5hbHl6ZWRNZXRob2QgPSBfYW5hbHl6ZWRNZW1iZXI7CiAgICBfcmV0dXJuVHlwZSA9CiAgICAgICAgX2luZmVycmVyLmFkZFJldHVyblR5cGVGb3JNZXRob2QoYW5hbHl6ZWRNZXRob2QsIF9yZXR1cm5UeXBlLCB0eXBlKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBfdGhpc1R5cGU7CiAgVHlwZUluZm9ybWF0aW9uIGdldCB0aGlzVHlwZSB7CiAgICBpZiAoX3RoaXNUeXBlICE9IG51bGwpIHJldHVybiBfdGhpc1R5cGU7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJUaGlzVHlwZShfYW5hbHl6ZWRNZW1iZXIpPy5lbGVtZW50OwogICAgaWYgKF9jbG9zZWRXb3JsZC5pc1VzZWRBc01peGluKGNscykpIHsKICAgICAgcmV0dXJuIF90aGlzVHlwZSA9IF90eXBlcy5ub25OdWxsU3VidHlwZShjbHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF90aGlzVHlwZSA9IF90eXBlcy5ub25OdWxsU3ViY2xhc3MoY2xzKTsKICAgIH0KICB9CgogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdChpci5Ob2RlIG5vZGUsIHtib29sIGNvbmRpdGlvbkNvbnRleHQ6IGZhbHNlfSkgewogICAgdmFyIG9sZEFjY3VtdWxhdGVJc0NoZWNrcyA9IF9hY2N1bXVsYXRlSXNDaGVja3M7CiAgICBfYWNjdW11bGF0ZUlzQ2hlY2tzID0gY29uZGl0aW9uQ29udGV4dDsKICAgIHZhciByZXN1bHQgPSBub2RlPy5hY2NlcHQodGhpcyk7CiAgICBfYWNjdW11bGF0ZUlzQ2hlY2tzID0gb2xkQWNjdW11bGF0ZUlzQ2hlY2tzOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgdmlzaXRMaXN0KExpc3Q8aXIuTm9kZT4gbm9kZXMpIHsKICAgIGlmIChub2RlcyA9PSBudWxsKSByZXR1cm47CiAgICBub2Rlcy5mb3JFYWNoKHZpc2l0KTsKICB9CgogIHZvaWQgaGFuZGxlUGFyYW1ldGVyKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSwge2Jvb2wgaXNPcHRpb25hbH0pIHsKICAgIExvY2FsIGxvY2FsID0gX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKG5vZGUpOwogICAgRGFydFR5cGUgdHlwZSA9IF9sb2NhbHNNYXAuZ2V0TG9jYWxUeXBlKF9lbGVtZW50TWFwLCBsb2NhbCk7CiAgICBfc3RhdGUudXBkYXRlTG9jYWwoX2luZmVycmVyLCBfY2FwdHVyZWRBbmRCb3hlZCwgbG9jYWwsCiAgICAgICAgX2luZmVycmVyLnR5cGVPZlBhcmFtZXRlcihsb2NhbCksIG5vZGUsIHR5cGUpOwogICAgaWYgKGlzT3B0aW9uYWwpIHsKICAgICAgVHlwZUluZm9ybWF0aW9uIHR5cGU7CiAgICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICB0eXBlID0gdmlzaXQobm9kZS5pbml0aWFsaXplcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHlwZSA9IF90eXBlcy5udWxsVHlwZTsKICAgICAgfQogICAgICBfaW5mZXJyZXIuc2V0RGVmYXVsdFR5cGVPZlBhcmFtZXRlcihsb2NhbCwgdHlwZSwKICAgICAgICAgIGlzSW5zdGFuY2VNZW1iZXI6IF9hbmFseXplZE1lbWJlci5pc0luc3RhbmNlTWVtYmVyKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdENvbnN0cnVjdG9yKGlyLkNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIGhhbmRsZVBhcmFtZXRlcnMobm9kZS5mdW5jdGlvbik7CiAgICBub2RlLmluaXRpYWxpemVycy5mb3JFYWNoKHZpc2l0KTsKICAgIHZpc2l0KG5vZGUuZnVuY3Rpb24uYm9keSk7CgogICAgQ2xhc3NFbnRpdHkgY2xzID0gX2FuYWx5emVkTWVtYmVyLmVuY2xvc2luZ0NsYXNzOwogICAgaWYgKCEobm9kZS5pbml0aWFsaXplcnMuaXNOb3RFbXB0eSAmJgogICAgICAgIG5vZGUuaW5pdGlhbGl6ZXJzLmZpcnN0IGlzIGlyLlJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIpKSB7CiAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgaW5zdGFuY2UgZmllbGRzLCBhbmQgZ2l2ZSBhIG51bGwgdHlwZSB0bwogICAgICAvLyBmaWVsZHMgdGhhdCB3ZSBoYXZlbid0IGluaXRpYWxpemVkIGZvciBzdXJlLgogICAgICBfZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaExvY2FsQ2xhc3NNZW1iZXIoY2xzLAogICAgICAgICAgKE1lbWJlckVudGl0eSBtZW1iZXIpIHsKICAgICAgICBpZiAobWVtYmVyLmlzRmllbGQgJiYgbWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIgJiYgbWVtYmVyLmlzQXNzaWduYWJsZSkgewogICAgICAgICAgVHlwZUluZm9ybWF0aW9uIHR5cGUgPSBfc3RhdGUucmVhZEZpZWxkKG1lbWJlcik7CiAgICAgICAgICBNZW1iZXJEZWZpbml0aW9uIGRlZmluaXRpb24gPSBfZWxlbWVudE1hcC5nZXRNZW1iZXJEZWZpbml0aW9uKG1lbWJlcik7CiAgICAgICAgICBhc3NlcnQoZGVmaW5pdGlvbi5raW5kID09IE1lbWJlcktpbmQucmVndWxhcik7CiAgICAgICAgICBpci5GaWVsZCBub2RlID0gZGVmaW5pdGlvbi5ub2RlOwogICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCAmJgogICAgICAgICAgICAgIChub2RlLmluaXRpYWxpemVyID09IG51bGwgfHwKICAgICAgICAgICAgICAgICAgbm9kZS5pbml0aWFsaXplciBpcyBpci5OdWxsTGl0ZXJhbCkpIHsKICAgICAgICAgICAgX2luZmVycmVyLnJlY29yZFR5cGVPZkZpZWxkKG1lbWJlciwgX3R5cGVzLm51bGxUeXBlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgX2luZmVycmVyLnJlY29yZEV4cG9zZXNUaGlzKF9hbmFseXplZE1lbWJlciwgX3N0YXRlLmlzVGhpc0V4cG9zZWQpOwoKICAgIGlmIChjbHMuaXNBYnN0cmFjdCkgewogICAgICBpZiAoX2Nsb3NlZFdvcmxkLmNsYXNzSGllcmFyY2h5LmlzSW5zdGFudGlhdGVkKGNscykpIHsKICAgICAgICBfcmV0dXJuVHlwZSA9IF90eXBlcy5ub25OdWxsU3ViY2xhc3MoY2xzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCBhbmFseXppbmcgW19hbmFseXplZE1lbWJlcl0gaW4gdGhpcwogICAgICAgIC8vIGNhc2U7IGl0J3MgbmV2ZXIgY2FsbGVkLgogICAgICAgIF9yZXR1cm5UeXBlID0gX3R5cGVzLm5vbk51bGxFbXB0eSgpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBfcmV0dXJuVHlwZSA9IF90eXBlcy5ub25OdWxsRXhhY3QoY2xzKTsKICAgIH0KICAgIGFzc2VydChfYnJlYWtzRm9yLmlzRW1wdHkpOwogICAgYXNzZXJ0KF9jb250aW51ZXNGb3IuaXNFbXB0eSk7CiAgICByZXR1cm4gX3JldHVyblR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZpZWxkSW5pdGlhbGl6ZXIoaXIuRmllbGRJbml0aWFsaXplciBub2RlKSB7CiAgICBUeXBlSW5mb3JtYXRpb24gcmhzVHlwZSA9IHZpc2l0KG5vZGUudmFsdWUpOwogICAgRmllbGRFbnRpdHkgZmllbGQgPSBfZWxlbWVudE1hcC5nZXRGaWVsZChub2RlLmZpZWxkKTsKICAgIF9zdGF0ZS51cGRhdGVGaWVsZChmaWVsZCwgcmhzVHlwZSk7CiAgICBfaW5mZXJyZXIucmVjb3JkVHlwZU9mRmllbGQoZmllbGQsIHJoc1R5cGUpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN1cGVySW5pdGlhbGl6ZXIoaXIuU3VwZXJJbml0aWFsaXplciBub2RlKSB7CiAgICBDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciA9IF9lbGVtZW50TWFwLmdldENvbnN0cnVjdG9yKG5vZGUudGFyZ2V0KTsKICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cyA9IGFuYWx5emVBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3IoU2VsZWN0b3JLaW5kLkNBTEwsIGNvbnN0cnVjdG9yLm1lbWJlck5hbWUsCiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0Q2FsbFN0cnVjdHVyZShub2RlLmFyZ3VtZW50cykpOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX21lbWJlckRhdGEudHlwZU9mU2VuZChub2RlKTsKICAgIGhhbmRsZUNvbnN0cnVjdG9ySW52b2tlKAogICAgICAgIG5vZGUsIG5vZGUuYXJndW1lbnRzLCBzZWxlY3RvciwgbWFzaywgY29uc3RydWN0b3IsIGFyZ3VtZW50cyk7CgogICAgX2luZmVycmVyLmFuYWx5emUoY29uc3RydWN0b3IpOwogICAgaWYgKF9pbmZlcnJlci5jaGVja0lmRXhwb3Nlc1RoaXMoY29uc3RydWN0b3IpKSB7CiAgICAgIF9zdGF0ZS5tYXJrVGhpc0FzRXhwb3NlZCgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoaXIuUmVkaXJlY3RpbmdJbml0aWFsaXplciBub2RlKSB7CiAgICBDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciA9IF9lbGVtZW50TWFwLmdldENvbnN0cnVjdG9yKG5vZGUudGFyZ2V0KTsKICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cyA9IGFuYWx5emVBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3IoU2VsZWN0b3JLaW5kLkNBTEwsIGNvbnN0cnVjdG9yLm1lbWJlck5hbWUsCiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0Q2FsbFN0cnVjdHVyZShub2RlLmFyZ3VtZW50cykpOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX21lbWJlckRhdGEudHlwZU9mU2VuZChub2RlKTsKICAgIGhhbmRsZUNvbnN0cnVjdG9ySW52b2tlKAogICAgICAgIG5vZGUsIG5vZGUuYXJndW1lbnRzLCBzZWxlY3RvciwgbWFzaywgY29uc3RydWN0b3IsIGFyZ3VtZW50cyk7CgogICAgX2luZmVycmVyLmFuYWx5emUoY29uc3RydWN0b3IpOwogICAgaWYgKF9pbmZlcnJlci5jaGVja0lmRXhwb3Nlc1RoaXMoY29uc3RydWN0b3IpKSB7CiAgICAgIF9zdGF0ZS5tYXJrVGhpc0FzRXhwb3NlZCgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExvY2FsSW5pdGlhbGl6ZXIoaXIuTG9jYWxJbml0aWFsaXplciBub2RlKSB7CiAgICB2aXNpdChub2RlLnZhcmlhYmxlKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBoYW5kbGVQYXJhbWV0ZXJzKGlyLkZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBpbnQgcG9zaXRpb24gPSAwOwogICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciBpbiBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIGhhbmRsZVBhcmFtZXRlcihwYXJhbWV0ZXIsCiAgICAgICAgICBpc09wdGlvbmFsOiBwb3NpdGlvbiA+PSBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogICAgICBwb3NpdGlvbisrOwogICAgfQogICAgZm9yIChpci5WYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciBpbiBub2RlLm5hbWVkUGFyYW1ldGVycykgewogICAgICBoYW5kbGVQYXJhbWV0ZXIocGFyYW1ldGVyLCBpc09wdGlvbmFsOiB0cnVlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdEZ1bmN0aW9uTm9kZShpci5GdW5jdGlvbk5vZGUgbm9kZSkgewogICAgaGFuZGxlUGFyYW1ldGVycyhub2RlKTsKCiAgICBpZiAoX2Nsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaXNOYXRpdmVNZW1iZXIoX2FuYWx5emVkTWVtYmVyKSkgewogICAgICAvLyBOYXRpdmUgbWV0aG9kcyBkbyBub3QgaGF2ZSBhIGJvZHksIGFuZCB3ZSBjdXJyZW50bHkganVzdCBzYXkKICAgICAgLy8gdGhleSByZXR1cm4gZHluYW1pYy4KICAgICAgcmV0dXJuIF90eXBlcy5keW5hbWljVHlwZTsKICAgIH0KCiAgICB2aXNpdChub2RlLmJvZHkpOwogICAgc3dpdGNoIChub2RlLmFzeW5jTWFya2VyKSB7CiAgICAgIGNhc2UgaXIuQXN5bmNNYXJrZXIuU3luYzoKICAgICAgICBpZiAoX3JldHVyblR5cGUgPT0gbnVsbCkgewogICAgICAgICAgLy8gTm8gcmV0dXJuIGluIHRoZSBib2R5LgogICAgICAgICAgX3JldHVyblR5cGUgPSBfc3RhdGUuc2VlblJldHVybk9yVGhyb3cKICAgICAgICAgICAgICA/IF90eXBlcy5ub25OdWxsRW1wdHkoKSAvLyBCb2R5IGFsd2F5cyB0aHJvd3MuCiAgICAgICAgICAgICAgOiBfdHlwZXMubnVsbFR5cGU7CiAgICAgICAgfSBlbHNlIGlmICghX3N0YXRlLnNlZW5SZXR1cm5PclRocm93KSB7CiAgICAgICAgICAvLyBXZSBoYXZlbidUeXBlSW5mb3JtYXRpb24gc2VlbiByZXR1cm5zIG9uIGFsbCBicmFuY2hlcy4gU28gdGhlCiAgICAgICAgICAvLyBtZXRob2QgbWF5IGFsc28gcmV0dXJuIG51bGwuCiAgICAgICAgICByZWNvcmRSZXR1cm5UeXBlKF90eXBlcy5udWxsVHlwZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBpci5Bc3luY01hcmtlci5TeW5jU3RhcjoKICAgICAgICAvLyBUT0RPKGFzZ2VyZik6IE1heWJlIG1ha2UgYSBDb250YWluZXJUeXBlTWFzayBmb3IgdGhlc2U/IFRoZSB0eXBlCiAgICAgICAgLy8gICAgICAgICAgICAgICBjb250YWluZWQgaXMgdGhlIG1ldGhvZCBib2R5J3MgcmV0dXJuIHR5cGUuCiAgICAgICAgcmVjb3JkUmV0dXJuVHlwZShfdHlwZXMuc3luY1N0YXJJdGVyYWJsZVR5cGUpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBpci5Bc3luY01hcmtlci5Bc3luYzoKICAgICAgICByZWNvcmRSZXR1cm5UeXBlKF90eXBlcy5hc3luY0Z1dHVyZVR5cGUpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBpci5Bc3luY01hcmtlci5Bc3luY1N0YXI6CiAgICAgICAgcmVjb3JkUmV0dXJuVHlwZShfdHlwZXMuYXN5bmNTdGFyU3RyZWFtVHlwZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgaXIuQXN5bmNNYXJrZXIuU3luY1lpZWxkaW5nOgogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICBfYW5hbHl6ZWRNZW1iZXIsICJVbmV4cGVjdGVkIGFzeW5jIG1hcmtlcjogJHtub2RlLmFzeW5jTWFya2VyfSIpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgYXNzZXJ0KF9icmVha3NGb3IuaXNFbXB0eSk7CiAgICBhc3NlcnQoX2NvbnRpbnVlc0Zvci5pc0VtcHR5KTsKICAgIHJldHVybiBfcmV0dXJuVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdEluc3RhbnRpYXRpb24oaXIuSW5zdGFudGlhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gY3JlYXRlSW5zdGFudGlhdGlvblR5cGVJbmZvcm1hdGlvbih2aXNpdChub2RlLmV4cHJlc3Npb24pKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBjcmVhdGVJbnN0YW50aWF0aW9uVHlwZUluZm9ybWF0aW9uKAogICAgICBUeXBlSW5mb3JtYXRpb24gZXhwcmVzc2lvblR5cGUpIHsKICAgIC8vIFRPRE8oc3JhKTogQWRkIGEgVHlwZUluZm9ybWF0aW9uIGZvciBJbnN0YW50aWF0aW9ucy4gIEluc3RhbnRpYXRlZAogICAgLy8gZ2VuZXJpYyBtZXRob2RzIHdpbGwgbmVlZCB0byBiZSB0cmFjZWQgc2VwYXJhdGVseSwgYW5kIGhhdmUgdGhlCiAgICAvLyBpbmZvcm1hdGlvbiBnYXRoZXJlZCBpbiB0cmFjaW5nIHJlZmxlY3RlZCBiYWNrIHRvIHRoZSBnZW5lcmljIG1ldGhvZC4gRm9yCiAgICAvLyBub3csIHBhc3MgYWxvbmcgdGhlIHVuaW5zdGFudGlhdGVkIG1ldGhvZC4KICAgIHJldHVybiBleHByZXNzaW9uVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiBkZWZhdWx0RXhwcmVzc2lvbihpci5FeHByZXNzaW9uIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgJ1VuaGFuZGxlZCBleHByZXNzaW9uOiAke25vZGV9ICgke25vZGUucnVudGltZVR5cGV9KScpOwogIH0KCiAgQG92ZXJyaWRlCiAgZGVmYXVsdFN0YXRlbWVudChpci5TdGF0ZW1lbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAnVW5oYW5kbGVkIHN0YXRlbWVudDogJHtub2RlfSAoJHtub2RlLnJ1bnRpbWVUeXBlfSknKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdE51bGxMaXRlcmFsKGlyLk51bGxMaXRlcmFsIGxpdGVyYWwpIHsKICAgIHJldHVybiBjcmVhdGVOdWxsVHlwZUluZm9ybWF0aW9uKCk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gY3JlYXRlTnVsbFR5cGVJbmZvcm1hdGlvbigpIHsKICAgIHJldHVybiBfdHlwZXMubnVsbFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJsb2NrKGlyLkJsb2NrIGJsb2NrKSB7CiAgICBmb3IgKGlyLlN0YXRlbWVudCBzdGF0ZW1lbnQgaW4gYmxvY2suc3RhdGVtZW50cykgewogICAgICB2aXNpdChzdGF0ZW1lbnQpOwogICAgICBpZiAoX3N0YXRlLmFib3J0cykgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChpci5FeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RW1wdHlTdGF0ZW1lbnQoaXIuRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewogICAgLy8gTm90aGluZyB0byBkby4KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRBc3NlcnRTdGF0ZW1lbnQoaXIuQXNzZXJ0U3RhdGVtZW50IG5vZGUpIHsKICAgIC8vIEF2b2lkIHBvbGx1dGlvbiBmcm9tIGFzc2VydCBzdGF0ZW1lbnQgdW5sZXNzIGVuYWJsZWQuCiAgICBpZiAoIV9vcHRpb25zLmVuYWJsZVVzZXJBc3NlcnRpb25zKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hvdWxkIGFzc2VydCBiZSB1c2VkIHdpdGggLS10cnVzdC10eXBlLWFubm90YXRpb25zPwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVHJhY2sgcmVhY2hhYmxlIGZvciBhc3NlcnRpb25zIGtub3duIHRvIGZhaWwuCiAgICBMb2NhbFN0YXRlIHN0YXRlQmVmb3JlID0gX3N0YXRlOwogICAgaGFuZGxlQ29uZGl0aW9uKG5vZGUuY29uZGl0aW9uKTsKICAgIExvY2FsU3RhdGUgYWZ0ZXJDb25kaXRpb25XaGVuVHJ1ZSA9IF9zdGF0ZUFmdGVyV2hlblRydWU7CiAgICBMb2NhbFN0YXRlIGFmdGVyQ29uZGl0aW9uV2hlbkZhbHNlID0gX3N0YXRlQWZ0ZXJXaGVuRmFsc2U7CiAgICBfc3RhdGUgPSBuZXcgTG9jYWxTdGF0ZS5jaGlsZFBhdGgoYWZ0ZXJDb25kaXRpb25XaGVuRmFsc2UpOwogICAgdmlzaXQobm9kZS5tZXNzYWdlKTsKICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlck1lc3NhZ2UgPSBfc3RhdGU7CiAgICBzdGF0ZUFmdGVyTWVzc2FnZS5zZWVuUmV0dXJuT3JUaHJvdyA9IHRydWU7CiAgICBfc3RhdGUgPSBzdGF0ZUJlZm9yZS5tZXJnZURpYW1vbmRGbG93KAogICAgICAgIF9pbmZlcnJlciwgYWZ0ZXJDb25kaXRpb25XaGVuVHJ1ZSwgc3RhdGVBZnRlck1lc3NhZ2UpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJyZWFrU3RhdGVtZW50KGlyLkJyZWFrU3RhdGVtZW50IG5vZGUpIHsKICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gX2xvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yQnJlYWsobm9kZSk7CiAgICBfc3RhdGUuc2VlbkJyZWFrT3JDb250aW51ZSA9IHRydWU7CiAgICAvLyBEbyBhIGRlZXAtY29weSBvZiB0aGUgbG9jYWxzLCBiZWNhdXNlIHRoZSBjb2RlIGZvbGxvd2luZyB0aGUKICAgIC8vIGJyZWFrIHdpbGwgY2hhbmdlIHRoZW0uCiAgICBpZiAoX2xvY2Fsc01hcC5nZW5lcmF0ZUNvbnRpbnVlRm9yQnJlYWsobm9kZSkpIHsKICAgICAgX2NvbnRpbnVlc0Zvclt0YXJnZXRdLmFkZChuZXcgTG9jYWxTdGF0ZS5kZWVwQ29weU9mKF9zdGF0ZSkpOwogICAgfSBlbHNlIHsKICAgICAgX2JyZWFrc0Zvclt0YXJnZXRdLmFkZChuZXcgTG9jYWxTdGF0ZS5kZWVwQ29weU9mKF9zdGF0ZSkpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoaXIuTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAgICBpci5TdGF0ZW1lbnQgYm9keSA9IG5vZGUuYm9keTsKICAgIGlmIChKdW1wVmlzaXRvci5jYW5CZUJyZWFrVGFyZ2V0KGJvZHkpKSB7CiAgICAgIC8vIExvb3BzIGFuZCBzd2l0Y2hlcyBoYW5kbGUgdGhlaXIgb3duIGxhYmVscy4KICAgICAgdmlzaXQoYm9keSk7CiAgICB9IGVsc2UgewogICAgICBKdW1wVGFyZ2V0IGp1bXBUYXJnZXQgPSBfbG9jYWxzTWFwLmdldEp1bXBUYXJnZXRGb3JMYWJlbChub2RlKTsKICAgICAgX3NldHVwQnJlYWtzQW5kQ29udGludWVzKGp1bXBUYXJnZXQpOwogICAgICB2aXNpdChib2R5KTsKICAgICAgX3N0YXRlLm1lcmdlQWZ0ZXJCcmVha3MoX2luZmVycmVyLCBfZ2V0QnJlYWtzKGp1bXBUYXJnZXQpKTsKICAgICAgX2NsZWFyQnJlYWtzQW5kQ29udGludWVzKGp1bXBUYXJnZXQpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN3aXRjaFN0YXRlbWVudChpci5Td2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgdmlzaXQobm9kZS5leHByZXNzaW9uKTsKCiAgICBKdW1wVGFyZ2V0IGp1bXBUYXJnZXQgPSBfbG9jYWxzTWFwLmdldEp1bXBUYXJnZXRGb3JTd2l0Y2gobm9kZSk7CiAgICBfc2V0dXBCcmVha3NBbmRDb250aW51ZXMoanVtcFRhcmdldCk7CgogICAgTGlzdDxKdW1wVGFyZ2V0PiBjb250aW51ZVRhcmdldHMgPSA8SnVtcFRhcmdldD5bXTsKICAgIGZvciAoaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlIGluIG5vZGUuY2FzZXMpIHsKICAgICAgSnVtcFRhcmdldCBjb250aW51ZVRhcmdldCA9CiAgICAgICAgICBfbG9jYWxzTWFwLmdldEp1bXBUYXJnZXRGb3JTd2l0Y2hDYXNlKHN3aXRjaENhc2UpOwogICAgICBpZiAoY29udGludWVUYXJnZXQgIT0gbnVsbCkgewogICAgICAgIGNvbnRpbnVlVGFyZ2V0cy5hZGQoY29udGludWVUYXJnZXQpOwogICAgICB9CiAgICB9CiAgICBpZiAoY29udGludWVUYXJnZXRzLmlzTm90RW1wdHkpIHsKICAgICAgY29udGludWVUYXJnZXRzLmZvckVhY2goX3NldHVwQnJlYWtzQW5kQ29udGludWVzKTsKCiAgICAgIC8vIElmIHRoZSBzd2l0Y2ggc3RhdGVtZW50IGhhcyBhIGNvbnRpbnVlLCB3ZSBjb25zZXJ2YXRpdmVseQogICAgICAvLyB2aXNpdCBhbGwgY2FzZXMgYW5kIHVwZGF0ZSBbbG9jYWxzXSB1bnRpbCB3ZSBoYXZlIHJlYWNoZWQgYQogICAgICAvLyBmaXhlZCBwb2ludC4KICAgICAgYm9vbCBjaGFuZ2VkOwogICAgICBfc3RhdGUuc3RhcnRMb29wKF9pbmZlcnJlciwgbm9kZSk7CiAgICAgIGRvIHsKICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgZm9yIChpci5Td2l0Y2hDYXNlIHN3aXRjaENhc2UgaW4gbm9kZS5jYXNlcykgewogICAgICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUJlZm9yZUNhc2UgPSBfc3RhdGU7CiAgICAgICAgICBfc3RhdGUgPSBuZXcgTG9jYWxTdGF0ZS5jaGlsZFBhdGgoc3RhdGVCZWZvcmVDYXNlKTsKICAgICAgICAgIHZpc2l0KHN3aXRjaENhc2UpOwogICAgICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyQ2FzZSA9IF9zdGF0ZTsKICAgICAgICAgIGNoYW5nZWQgPQogICAgICAgICAgICAgIHN0YXRlQmVmb3JlQ2FzZS5tZXJnZUFsbChfaW5mZXJyZXIsIFtzdGF0ZUFmdGVyQ2FzZV0pIHx8IGNoYW5nZWQ7CiAgICAgICAgICBfc3RhdGUgPSBzdGF0ZUJlZm9yZUNhc2U7CiAgICAgICAgfQogICAgICB9IHdoaWxlIChjaGFuZ2VkKTsKICAgICAgX3N0YXRlLmVuZExvb3AoX2luZmVycmVyLCBub2RlKTsKCiAgICAgIGNvbnRpbnVlVGFyZ2V0cy5mb3JFYWNoKF9jbGVhckJyZWFrc0FuZENvbnRpbnVlcyk7CiAgICB9IGVsc2UgewogICAgICBMb2NhbFN0YXRlIHN0YXRlQmVmb3JlQ2FzZSA9IF9zdGF0ZTsKICAgICAgTGlzdDxMb2NhbFN0YXRlPiBzdGF0ZXNUb01lcmdlID0gPExvY2FsU3RhdGU+W107CiAgICAgIGJvb2wgaGFzRGVmYXVsdENhc2UgPSBmYWxzZTsKCiAgICAgIGZvciAoaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlIGluIG5vZGUuY2FzZXMpIHsKICAgICAgICBpZiAoc3dpdGNoQ2FzZS5pc0RlZmF1bHQpIHsKICAgICAgICAgIGhhc0RlZmF1bHRDYXNlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgX3N0YXRlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKHN0YXRlQmVmb3JlQ2FzZSk7CiAgICAgICAgdmlzaXQoc3dpdGNoQ2FzZSk7CiAgICAgICAgc3RhdGVzVG9NZXJnZS5hZGQoX3N0YXRlKTsKICAgICAgfQogICAgICBzdGF0ZUJlZm9yZUNhc2UubWVyZ2VBZnRlckJyZWFrcyhfaW5mZXJyZXIsIHN0YXRlc1RvTWVyZ2UsCiAgICAgICAgICBrZWVwT3duTG9jYWxzOiAhaGFzRGVmYXVsdENhc2UpOwogICAgICBfc3RhdGUgPSBzdGF0ZUJlZm9yZUNhc2U7CiAgICB9CiAgICBfY2xlYXJCcmVha3NBbmRDb250aW51ZXMoanVtcFRhcmdldCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3dpdGNoQ2FzZShpci5Td2l0Y2hDYXNlIG5vZGUpIHsKICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQoaXIuQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgSnVtcFRhcmdldCB0YXJnZXQgPSBfbG9jYWxzTWFwLmdldEp1bXBUYXJnZXRGb3JDb250aW51ZVN3aXRjaChub2RlKTsKICAgIF9zdGF0ZS5zZWVuQnJlYWtPckNvbnRpbnVlID0gdHJ1ZTsKICAgIC8vIERvIGEgZGVlcC1jb3B5IG9mIHRoZSBsb2NhbHMsIGJlY2F1c2UgdGhlIGNvZGUgZm9sbG93aW5nIHRoZQogICAgLy8gYnJlYWsgd2lsbCBjaGFuZ2UgdGhlbS4KICAgIF9jb250aW51ZXNGb3JbdGFyZ2V0XS5hZGQobmV3IExvY2FsU3RhdGUuZGVlcENvcHlPZihfc3RhdGUpKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0TGlzdExpdGVyYWwoaXIuTGlzdExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIGNyZWF0ZUxpc3RUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgbm9kZSwgbm9kZS5leHByZXNzaW9ucy5tYXAoKGUpID0+IHZpc2l0KGUpKSwKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGNyZWF0ZUxpc3RUeXBlSW5mb3JtYXRpb24oCiAgICAgIGlyLlRyZWVOb2RlIG5vZGUsIEl0ZXJhYmxlPFR5cGVJbmZvcm1hdGlvbj4gZWxlbWVudFR5cGVzLAogICAgICB7Ym9vbCBpc0NvbnN0fSkgewogICAgLy8gV2Ugb25seSBzZXQgdGhlIHR5cGUgb25jZS4gV2UgZG9uJ3QgbmVlZCB0byByZS12aXNpdCB0aGUgY2hpbGRyZW4KICAgIC8vIHdoZW4gcmUtYW5hbHl6aW5nIHRoZSBub2RlLgogICAgcmV0dXJuIF9pbmZlcnJlci5jb25jcmV0ZVR5cGVzLnB1dElmQWJzZW50KG5vZGUsICgpIHsKICAgICAgVHlwZUluZm9ybWF0aW9uIGVsZW1lbnRUeXBlOwogICAgICBpbnQgbGVuZ3RoID0gMDsKICAgICAgZm9yIChUeXBlSW5mb3JtYXRpb24gdHlwZSBpbiBlbGVtZW50VHlwZXMpIHsKICAgICAgICBlbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlID09IG51bGwKICAgICAgICAgICAgPyBfdHlwZXMuYWxsb2NhdGVQaGkobnVsbCwgbnVsbCwgdHlwZSwgaXNUcnk6IGZhbHNlKQogICAgICAgICAgICA6IF90eXBlcy5hZGRQaGlJbnB1dChudWxsLCBlbGVtZW50VHlwZSwgdHlwZSk7CiAgICAgICAgbGVuZ3RoKys7CiAgICAgIH0KICAgICAgZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZSA9PSBudWxsCiAgICAgICAgICA/IF90eXBlcy5ub25OdWxsRW1wdHkoKQogICAgICAgICAgOiBfdHlwZXMuc2ltcGxpZnlQaGkobnVsbCwgbnVsbCwgZWxlbWVudFR5cGUpOwogICAgICBUeXBlSW5mb3JtYXRpb24gY29udGFpbmVyVHlwZSA9CiAgICAgICAgICBpc0NvbnN0ID8gX3R5cGVzLmNvbnN0TGlzdFR5cGUgOiBfdHlwZXMuZ3Jvd2FibGVMaXN0VHlwZTsKICAgICAgcmV0dXJuIF90eXBlcy5hbGxvY2F0ZUxpc3QoCiAgICAgICAgICBjb250YWluZXJUeXBlLCBub2RlLCBfYW5hbHl6ZWRNZW1iZXIsIGVsZW1lbnRUeXBlLCBsZW5ndGgpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRTZXRMaXRlcmFsKGlyLlNldExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIGNyZWF0ZVNldFR5cGVJbmZvcm1hdGlvbihub2RlLCBub2RlLmV4cHJlc3Npb25zLm1hcCgoZSkgPT4gdmlzaXQoZSkpLAogICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gY3JlYXRlU2V0VHlwZUluZm9ybWF0aW9uKAogICAgICBpci5UcmVlTm9kZSBub2RlLCBJdGVyYWJsZTxUeXBlSW5mb3JtYXRpb24+IGVsZW1lbnRUeXBlcywKICAgICAge2Jvb2wgaXNDb25zdH0pIHsKICAgIHJldHVybiBfaW5mZXJyZXIuY29uY3JldGVUeXBlcy5wdXRJZkFic2VudChub2RlLCAoKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBlbGVtZW50VHlwZTsKICAgICAgZm9yIChUeXBlSW5mb3JtYXRpb24gdHlwZSBpbiBlbGVtZW50VHlwZXMpIHsKICAgICAgICBlbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlID09IG51bGwKICAgICAgICAgICAgPyBfdHlwZXMuYWxsb2NhdGVQaGkobnVsbCwgbnVsbCwgdHlwZSwgaXNUcnk6IGZhbHNlKQogICAgICAgICAgICA6IF90eXBlcy5hZGRQaGlJbnB1dChudWxsLCBlbGVtZW50VHlwZSwgdHlwZSk7CiAgICAgIH0KICAgICAgZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZSA9PSBudWxsCiAgICAgICAgICA/IF90eXBlcy5ub25OdWxsRW1wdHkoKQogICAgICAgICAgOiBfdHlwZXMuc2ltcGxpZnlQaGkobnVsbCwgbnVsbCwgZWxlbWVudFR5cGUpOwogICAgICBUeXBlSW5mb3JtYXRpb24gY29udGFpbmVyVHlwZSA9CiAgICAgICAgICBpc0NvbnN0ID8gX3R5cGVzLmNvbnN0U2V0VHlwZSA6IF90eXBlcy5zZXRUeXBlOwogICAgICByZXR1cm4gX3R5cGVzLmFsbG9jYXRlU2V0KAogICAgICAgICAgY29udGFpbmVyVHlwZSwgbm9kZSwgX2FuYWx5emVkTWVtYmVyLCBlbGVtZW50VHlwZSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdE1hcExpdGVyYWwoaXIuTWFwTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gY3JlYXRlTWFwVHlwZUluZm9ybWF0aW9uKAogICAgICAgIG5vZGUsIG5vZGUuZW50cmllcy5tYXAoKGUpID0+IG5ldyBQYWlyKHZpc2l0KGUua2V5KSwgdmlzaXQoZS52YWx1ZSkpKSwKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGNyZWF0ZU1hcFR5cGVJbmZvcm1hdGlvbihpci5UcmVlTm9kZSBub2RlLAogICAgICBJdGVyYWJsZTxQYWlyPFR5cGVJbmZvcm1hdGlvbiwgVHlwZUluZm9ybWF0aW9uPj4gZW50cnlUeXBlcywKICAgICAge2Jvb2wgaXNDb25zdH0pIHsKICAgIHJldHVybiBfaW5mZXJyZXIuY29uY3JldGVUeXBlcy5wdXRJZkFic2VudChub2RlLCAoKSB7CiAgICAgIExpc3Qga2V5VHlwZXMgPSA8VHlwZUluZm9ybWF0aW9uPltdOwogICAgICBMaXN0IHZhbHVlVHlwZXMgPSA8VHlwZUluZm9ybWF0aW9uPltdOwoKICAgICAgZm9yIChQYWlyPFR5cGVJbmZvcm1hdGlvbiwgVHlwZUluZm9ybWF0aW9uPiBlbnRyeVR5cGUgaW4gZW50cnlUeXBlcykgewogICAgICAgIGtleVR5cGVzLmFkZChlbnRyeVR5cGUuYSk7CiAgICAgICAgdmFsdWVUeXBlcy5hZGQoZW50cnlUeXBlLmIpOwogICAgICB9CgogICAgICBUeXBlSW5mb3JtYXRpb24gdHlwZSA9IGlzQ29uc3QgPyBfdHlwZXMuY29uc3RNYXBUeXBlIDogX3R5cGVzLm1hcFR5cGU7CiAgICAgIHJldHVybiBfdHlwZXMuYWxsb2NhdGVNYXAoCiAgICAgICAgICB0eXBlLCBub2RlLCBfYW5hbHl6ZWRNZW1iZXIsIGtleVR5cGVzLCB2YWx1ZVR5cGVzKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0UmV0dXJuU3RhdGVtZW50KGlyLlJldHVyblN0YXRlbWVudCBub2RlKSB7CiAgICBpci5Ob2RlIGV4cHJlc3Npb24gPSBub2RlLmV4cHJlc3Npb247CiAgICByZWNvcmRSZXR1cm5UeXBlKGV4cHJlc3Npb24gPT0gbnVsbCA/IF90eXBlcy5udWxsVHlwZSA6IHZpc2l0KGV4cHJlc3Npb24pKTsKICAgIF9zdGF0ZS5zZWVuUmV0dXJuT3JUaHJvdyA9IHRydWU7CiAgICBfc3RhdGUubWFya0luaXRpYWxpemF0aW9uQXNJbmRlZmluaXRlKCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdEJvb2xMaXRlcmFsKGlyLkJvb2xMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBjcmVhdGVCb29sVHlwZUluZm9ybWF0aW9uKG5vZGUudmFsdWUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGNyZWF0ZUJvb2xUeXBlSW5mb3JtYXRpb24oYm9vbCB2YWx1ZSkgewogICAgcmV0dXJuIF90eXBlcy5ib29sTGl0ZXJhbFR5cGUodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0SW50TGl0ZXJhbChpci5JbnRMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBjcmVhdGVJbnRUeXBlSW5mb3JtYXRpb24obm9kZS52YWx1ZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gY3JlYXRlSW50VHlwZUluZm9ybWF0aW9uKGludCB2YWx1ZSkgewogICAgLy8gVGhlIEphdmFTY3JpcHQgYmFja2VuZCBtYXkgdHVybiB0aGlzIGxpdGVyYWwgaW50byBhIGRvdWJsZSBhdAogICAgLy8gcnVudGltZS4KICAgIHJldHVybiBfdHlwZXMuZ2V0Q29uY3JldGVUeXBlRm9yKF9jbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgLmNvbXB1dGVBYnN0cmFjdFZhbHVlRm9yQ29uc3RhbnQoCiAgICAgICAgICAgIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVJbnRGcm9tSW50KHZhbHVlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0RG91YmxlTGl0ZXJhbChpci5Eb3VibGVMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBjcmVhdGVEb3VibGVUeXBlSW5mb3JtYXRpb24obm9kZS52YWx1ZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gY3JlYXRlRG91YmxlVHlwZUluZm9ybWF0aW9uKGRvdWJsZSB2YWx1ZSkgewogICAgLy8gVGhlIEphdmFTY3JpcHQgYmFja2VuZCBtYXkgdHVybiB0aGlzIGxpdGVyYWwgaW50byBhIGRvdWJsZSBhdAogICAgLy8gcnVudGltZS4KICAgIHJldHVybiBfdHlwZXMuZ2V0Q29uY3JldGVUeXBlRm9yKF9jbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgLmNvbXB1dGVBYnN0cmFjdFZhbHVlRm9yQ29uc3RhbnQoY29uc3RhbnRfc3lzdGVtLmNyZWF0ZURvdWJsZSh2YWx1ZSkpKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFN0cmluZ0xpdGVyYWwoaXIuU3RyaW5nTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gY3JlYXRlU3RyaW5nVHlwZUluZm9ybWF0aW9uKG5vZGUudmFsdWUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGNyZWF0ZVN0cmluZ1R5cGVJbmZvcm1hdGlvbihTdHJpbmcgdmFsdWUpIHsKICAgIHJldHVybiBfdHlwZXMuc3RyaW5nTGl0ZXJhbFR5cGUodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihpci5TdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIC8vIEludGVycG9sYXRpb24gY291bGQgaGF2ZSBhbnkgZWZmZWN0cyBzaW5jZSBpdCBjb3VsZCBjYWxsIGFueSB0b1N0cmluZygpCiAgICAvLyBtZXRob2QuCiAgICAvLyBUT0RPKHNyYSk6IFRoaXMgY291bGQgYmUgbW9kZWxsZWQgYnkgYSBjYWxsIHRvIHRvU3RyaW5nKCkgYnV0IHdpdGggYQogICAgLy8gZ3VhcmFudGVlZCBTdHJpbmcgcmV0dXJuIHR5cGUuICBJbnRlcnBvbGF0aW9uIG9mIGtub3duIHR5cGVzIHdvdWxkIGdldAogICAgLy8gc3BlY2lhbGl6ZWQgZWZmZWN0cy4gIFRoaXMgd291bGQgbm90IGN1cnJlbnRseSBiZSBlZmZlY3RpdmUgc2luY2UgdGhlIEpTCiAgICAvLyBjb2RlIGluIHRoZSB0b1N0cmluZyBtZXRob2RzIGZvciBpbnRlcmNlcHRlZCBwcmltaXRpdmUgdHlwZXMgaXMgYXNzdW1lZAogICAgLy8gdG8gaGF2ZSBhbGwgZWZmZWN0cy4gIEVmZmVjdCBhbm5vdGF0aW9ucyBvbiBKUyBjb2RlIHdvdWxkIGJlIG5lZWRlZCB0bwogICAgLy8gZ2V0IHRoZSBiZW5lZml0LgogICAgX3NpZGVFZmZlY3RzQnVpbGRlci5zZXRBbGxTaWRlRWZmZWN0cygpOwoKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIHJldHVybiBfdHlwZXMuc3RyaW5nVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFN5bWJvbExpdGVyYWwoaXIuU3ltYm9sTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gY3JlYXRlU3ltYm9sTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbigpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGNyZWF0ZVN5bWJvbExpdGVyYWxUeXBlSW5mb3JtYXRpb24oKSB7CiAgICByZXR1cm4gX3R5cGVzCiAgICAgICAgLm5vbk51bGxTdWJ0eXBlKF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5zeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFR5cGVMaXRlcmFsKGlyLlR5cGVMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBjcmVhdGVUeXBlTGl0ZXJhbEluZm9ybWF0aW9uKCk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gY3JlYXRlVHlwZUxpdGVyYWxJbmZvcm1hdGlvbigpIHsKICAgIHJldHVybiBfdHlwZXMudHlwZVR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgYXNzZXJ0KAogICAgICAgIG5vZGUucGFyZW50IGlzISBpci5GdW5jdGlvbk5vZGUsICJVbmV4cGVjdGVkIHBhcmFtZXRlciBkZWNsYXJhdGlvbi4iKTsKICAgIExvY2FsIGxvY2FsID0gX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKG5vZGUpOwogICAgRGFydFR5cGUgdHlwZSA9IF9sb2NhbHNNYXAuZ2V0TG9jYWxUeXBlKF9lbGVtZW50TWFwLCBsb2NhbCk7CiAgICBpZiAobm9kZS5pbml0aWFsaXplciA9PSBudWxsKSB7CiAgICAgIF9zdGF0ZS51cGRhdGVMb2NhbCgKICAgICAgICAgIF9pbmZlcnJlciwgX2NhcHR1cmVkQW5kQm94ZWQsIGxvY2FsLCBfdHlwZXMubnVsbFR5cGUsIG5vZGUsIHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgX3N0YXRlLnVwZGF0ZUxvY2FsKF9pbmZlcnJlciwgX2NhcHR1cmVkQW5kQm94ZWQsIGxvY2FsLAogICAgICAgICAgdmlzaXQobm9kZS5pbml0aWFsaXplciksIG5vZGUsIHR5cGUpOwogICAgfQogICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgaXMgaXIuVGhpc0V4cHJlc3Npb24pIHsKICAgICAgX3N0YXRlLm1hcmtUaGlzQXNFeHBvc2VkKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFZhcmlhYmxlR2V0KGlyLlZhcmlhYmxlR2V0IG5vZGUpIHsKICAgIExvY2FsIGxvY2FsID0gX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKG5vZGUudmFyaWFibGUpOwogICAgVHlwZUluZm9ybWF0aW9uIHR5cGUgPQogICAgICAgIF9zdGF0ZS5yZWFkTG9jYWwoX2luZmVycmVyLCBfY2FwdHVyZWRBbmRCb3hlZCwgbG9jYWwpOwogICAgYXNzZXJ0KHR5cGUgIT0gbnVsbCwgIk1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbiBmb3IgJGxvY2FsLiIpOwogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRWYXJpYWJsZVNldChpci5WYXJpYWJsZVNldCBub2RlKSB7CiAgICBUeXBlSW5mb3JtYXRpb24gcmhzVHlwZSA9IHZpc2l0KG5vZGUudmFsdWUpOwogICAgaWYgKG5vZGUudmFsdWUgaXMgaXIuVGhpc0V4cHJlc3Npb24pIHsKICAgICAgX3N0YXRlLm1hcmtUaGlzQXNFeHBvc2VkKCk7CiAgICB9CiAgICBMb2NhbCBsb2NhbCA9IF9sb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZShub2RlLnZhcmlhYmxlKTsKICAgIERhcnRUeXBlIHR5cGUgPSBfbG9jYWxzTWFwLmdldExvY2FsVHlwZShfZWxlbWVudE1hcCwgbG9jYWwpOwogICAgX3N0YXRlLnVwZGF0ZUxvY2FsKAogICAgICAgIF9pbmZlcnJlciwgX2NhcHR1cmVkQW5kQm94ZWQsIGxvY2FsLCByaHNUeXBlLCBub2RlLCB0eXBlKTsKICAgIHJldHVybiByaHNUeXBlOwogIH0KCiAgQXJndW1lbnRzVHlwZXMgYW5hbHl6ZUFyZ3VtZW50cyhpci5Bcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBMaXN0PFR5cGVJbmZvcm1hdGlvbj4gcG9zaXRpb25hbCA9IDxUeXBlSW5mb3JtYXRpb24+W107CiAgICBNYXA8U3RyaW5nLCBUeXBlSW5mb3JtYXRpb24+IG5hbWVkOwogICAgZm9yIChpci5FeHByZXNzaW9uIGFyZ3VtZW50IGluIGFyZ3VtZW50cy5wb3NpdGlvbmFsKSB7CiAgICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogV2UgY291bGQgZG8gYmV0dGVyIGhlcmUgaWYgd2Uga25ldyB3aGF0IHdlCiAgICAgIC8vIGFyZSBjYWxsaW5nIGRvZXMgbm90IGV4cG9zZSB0aGlzLgogICAgICBpZiAoYXJndW1lbnQgaXMgaXIuVGhpc0V4cHJlc3Npb24pIHsKICAgICAgICBfc3RhdGUubWFya1RoaXNBc0V4cG9zZWQoKTsKICAgICAgfQogICAgICBwb3NpdGlvbmFsLmFkZCh2aXNpdChhcmd1bWVudCkpOwogICAgfQogICAgZm9yIChpci5OYW1lZEV4cHJlc3Npb24gYXJndW1lbnQgaW4gYXJndW1lbnRzLm5hbWVkKSB7CiAgICAgIG5hbWVkID8/PSA8U3RyaW5nLCBUeXBlSW5mb3JtYXRpb24+e307CiAgICAgIGlyLkV4cHJlc3Npb24gdmFsdWUgPSBhcmd1bWVudC52YWx1ZTsKICAgICAgLy8gVE9ETyhuZ2VvZmZyYXkpOiBXZSBjb3VsZCBkbyBiZXR0ZXIgaGVyZSBpZiB3ZSBrbmV3IHdoYXQgd2UKICAgICAgLy8gYXJlIGNhbGxpbmcgZG9lcyBub3QgZXhwb3NlIHRoaXMuCiAgICAgIGlmICh2YWx1ZSBpcyBpci5UaGlzRXhwcmVzc2lvbikgewogICAgICAgIF9zdGF0ZS5tYXJrVGhpc0FzRXhwb3NlZCgpOwogICAgICB9CiAgICAgIG5hbWVkW2FyZ3VtZW50Lm5hbWVdID0gdmlzaXQodmFsdWUpOwogICAgfQoKICAgIHJldHVybiBuZXcgQXJndW1lbnRzVHlwZXMocG9zaXRpb25hbCwgbmFtZWQpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0TWV0aG9kSW52b2NhdGlvbihpci5NZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gX2VsZW1lbnRNYXAuZ2V0U2VsZWN0b3Iobm9kZSk7CiAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPSBfbWVtYmVyRGF0YS50eXBlT2ZTZW5kKG5vZGUpOwoKICAgIGlyLlRyZWVOb2RlIHJlY2VpdmVyID0gbm9kZS5yZWNlaXZlcjsKICAgIGlmIChyZWNlaXZlciBpcyBpci5WYXJpYWJsZUdldCAmJgogICAgICAgIHJlY2VpdmVyLnZhcmlhYmxlLnBhcmVudCBpcyBpci5GdW5jdGlvbkRlY2xhcmF0aW9uKSB7CiAgICAgIC8vIFRoaXMgaXMgYW4gaW52b2NhdGlvbiBvZiBhIG5hbWVkIGxvY2FsIGZ1bmN0aW9uLgogICAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMgPSBhbmFseXplQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKICAgICAgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbyBpbmZvID0KICAgICAgICAgIF9jbG9zdXJlRGF0YUxvb2t1cC5nZXRDbG9zdXJlSW5mbyhyZWNlaXZlci52YXJpYWJsZS5wYXJlbnQpOwogICAgICBpZiAoaXNJbmNvbXBhdGlibGVJbnZva2UoaW5mby5jYWxsTWV0aG9kLCBhcmd1bWVudHMpKSB7CiAgICAgICAgcmV0dXJuIF90eXBlcy5keW5hbWljVHlwZTsKICAgICAgfQoKICAgICAgVHlwZUluZm9ybWF0aW9uIHR5cGUgPQogICAgICAgICAgaGFuZGxlU3RhdGljSW52b2tlKG5vZGUsIHNlbGVjdG9yLCBtYXNrLCBpbmZvLmNhbGxNZXRob2QsIGFyZ3VtZW50cyk7CiAgICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPQogICAgICAgICAgX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldEZ1bmN0aW9uVHlwZShpbmZvLmNhbGxNZXRob2QpOwogICAgICBpZiAoZnVuY3Rpb25UeXBlLnJldHVyblR5cGUuY29udGFpbnNGcmVlVHlwZVZhcmlhYmxlcykgewogICAgICAgIC8vIFRoZSByZXR1cm4gdHlwZSB2YXJpZXMgd2l0aCB0aGUgY2FsbCBzaXRlIHNvIHdlIG5hcnJvdyB0aGUgc3RhdGljCiAgICAgICAgLy8gcmV0dXJuIHR5cGUuCiAgICAgICAgdHlwZSA9IF90eXBlcy5uYXJyb3dUeXBlKHR5cGUsIF9nZXRTdGF0aWNUeXBlKG5vZGUpKTsKICAgICAgfQogICAgICByZXR1cm4gdHlwZTsKICAgIH0KCiAgICBUeXBlSW5mb3JtYXRpb24gcmVjZWl2ZXJUeXBlID0gdmlzaXQocmVjZWl2ZXIpOwogICAgQXJndW1lbnRzVHlwZXMgYXJndW1lbnRzID0gYW5hbHl6ZUFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cyk7CiAgICBpZiAoc2VsZWN0b3IubmFtZSA9PSAnPT0nKSB7CiAgICAgIGlmIChfdHlwZXMuaXNOdWxsKHJlY2VpdmVyVHlwZSkpIHsKICAgICAgICAvLyBudWxsID09IG8KICAgICAgICBfcG90ZW50aWFsbHlBZGROdWxsQ2hlY2sobm9kZSwgbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5maXJzdCk7CiAgICAgICAgcmV0dXJuIF90eXBlcy5ib29sVHlwZTsKICAgICAgfSBlbHNlIGlmIChfdHlwZXMuaXNOdWxsKGFyZ3VtZW50cy5wb3NpdGlvbmFsWzBdKSkgewogICAgICAgIC8vIG8gPT0gbnVsbAogICAgICAgIF9wb3RlbnRpYWxseUFkZE51bGxDaGVjayhub2RlLCBub2RlLnJlY2VpdmVyKTsKICAgICAgICByZXR1cm4gX3R5cGVzLmJvb2xUeXBlOwogICAgICB9CiAgICB9CiAgICBpZiAobm9kZS5yZWNlaXZlciBpcyBpci5UaGlzRXhwcmVzc2lvbikgewogICAgICBfY2hlY2tJZkV4cG9zZXNUaGlzKAogICAgICAgICAgc2VsZWN0b3IsIF90eXBlcy5uZXdUeXBlZFNlbGVjdG9yKHJlY2VpdmVyVHlwZSwgbWFzaykpOwogICAgfQogICAgVHlwZUluZm9ybWF0aW9uIHR5cGUgPSBoYW5kbGVEeW5hbWljSW52b2tlKAogICAgICAgIENhbGxUeXBlLmFjY2Vzcywgbm9kZSwgc2VsZWN0b3IsIG1hc2ssIHJlY2VpdmVyVHlwZSwgYXJndW1lbnRzKTsKICAgIGlyLk1lbWJlciBpbnRlcmZhY2VUYXJnZXQgPSBub2RlLmludGVyZmFjZVRhcmdldDsKICAgIGlmIChpbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCkgewogICAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0IGlzIGlyLlByb2NlZHVyZSAmJgogICAgICAgICAgKGludGVyZmFjZVRhcmdldC5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuTWV0aG9kIHx8CiAgICAgICAgICAgICAgaW50ZXJmYWNlVGFyZ2V0LmtpbmQgPT0gaXIuUHJvY2VkdXJlS2luZC5PcGVyYXRvcikpIHsKICAgICAgICAvLyBQdWxsIHRoZSB0eXBlIGZyb20ga2VybmVsIChpbnN0ZWFkIG9mIGZyb20gdGhlIEotbW9kZWwpIGJlY2F1c2UgdGhlCiAgICAgICAgLy8gaW50ZXJmYWNlIHRhcmdldCBtaWdodCBiZSBhYnN0cmFjdCBhbmQgdGhlcmVmb3JlIG5vdCBwYXJ0IG9mIHRoZQogICAgICAgIC8vIEotbW9kZWwuCiAgICAgICAgaXIuRGFydFR5cGUgcmV0dXJuVHlwZSA9IGludGVyZmFjZVRhcmdldC5mdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgICAgIC8vIFRoZSByZXR1cm4gdHlwZSB2YXJpZXMgd2l0aCB0aGUgY2FsbCBzaXRlIHNvIHdlIG5hcnJvdyB0aGUgc3RhdGljCiAgICAgICAgLy8gcmV0dXJuIHR5cGUuCiAgICAgICAgaWYgKGNvbnRhaW5zRnJlZVZhcmlhYmxlcyhyZXR1cm5UeXBlKSkgewogICAgICAgICAgdHlwZSA9IF90eXBlcy5uYXJyb3dUeXBlKHR5cGUsIF9nZXRTdGF0aWNUeXBlKG5vZGUpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhlIHJldHVybiB0eXBlIGlzIHRocm93biBhd2F5IHdoZW4gdXNpbmcgW1R5cGVNYXNrXXM7IG5hcnJvdyB0byB0aGUKICAgICAgICAvLyBzdGF0aWMgcmV0dXJuIHR5cGUuCiAgICAgICAgdHlwZSA9IF90eXBlcy5uYXJyb3dUeXBlKHR5cGUsIF9nZXRTdGF0aWNUeXBlKG5vZGUpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIGtub3duIHRhcmdldCBidXQgdGhlIHN0YXRpYyB0eXBlIGhvbGQgc29tZSBpbmZvcm1hdGlvbgogICAgICAvLyBpZiBpdCBpcyBhIGZ1bmN0aW9uIHR5cGUuCiAgICAgIHR5cGUgPSBfdHlwZXMubmFycm93VHlwZSh0eXBlLCBfZ2V0U3RhdGljVHlwZShub2RlKSk7CiAgICB9CiAgICByZXR1cm4gdHlwZTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBfaGFuZGxlRHluYW1pYygKICAgICAgQ2FsbFR5cGUgY2FsbFR5cGUsCiAgICAgIGlyLk5vZGUgbm9kZSwKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywKICAgICAgVHlwZUluZm9ybWF0aW9uIHJlY2VpdmVyVHlwZSwKICAgICAgQXJndW1lbnRzVHlwZXMgYXJndW1lbnRzKSB7CiAgICBhc3NlcnQocmVjZWl2ZXJUeXBlICE9IG51bGwpOwogICAgaWYgKF90eXBlcy5zZWxlY3Rvck5lZWRzVXBkYXRlKHJlY2VpdmVyVHlwZSwgbWFzaykpIHsKICAgICAgbWFzayA9IHJlY2VpdmVyVHlwZSA9PSBfdHlwZXMuZHluYW1pY1R5cGUKICAgICAgICAgID8gbnVsbAogICAgICAgICAgOiBfdHlwZXMubmV3VHlwZWRTZWxlY3RvcihyZWNlaXZlclR5cGUsIG1hc2spOwogICAgICBfaW5mZXJyZXIudXBkYXRlU2VsZWN0b3JJbk1lbWJlcigKICAgICAgICAgIF9hbmFseXplZE1lbWJlciwgY2FsbFR5cGUsIG5vZGUsIHNlbGVjdG9yLCBtYXNrKTsKICAgIH0KCiAgICBpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOwogICAgaWYgKG5vZGUgaXMgaXIuTWV0aG9kSW52b2NhdGlvbiAmJiBub2RlLnJlY2VpdmVyIGlzIGlyLlZhcmlhYmxlR2V0KSB7CiAgICAgIGlyLlZhcmlhYmxlR2V0IGdldCA9IG5vZGUucmVjZWl2ZXI7CiAgICAgIHZhcmlhYmxlID0gZ2V0LnZhcmlhYmxlOwogICAgfSBlbHNlIGlmIChub2RlIGlzIGlyLlByb3BlcnR5R2V0ICYmIG5vZGUucmVjZWl2ZXIgaXMgaXIuVmFyaWFibGVHZXQpIHsKICAgICAgaXIuVmFyaWFibGVHZXQgZ2V0ID0gbm9kZS5yZWNlaXZlcjsKICAgICAgdmFyaWFibGUgPSBnZXQudmFyaWFibGU7CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgaXIuUHJvcGVydHlTZXQgJiYgbm9kZS5yZWNlaXZlciBpcyBpci5WYXJpYWJsZUdldCkgewogICAgICBpci5WYXJpYWJsZUdldCBnZXQgPSBub2RlLnJlY2VpdmVyOwogICAgICB2YXJpYWJsZSA9IGdldC52YXJpYWJsZTsKICAgIH0KCiAgICBpZiAodmFyaWFibGUgIT0gbnVsbCkgewogICAgICBMb2NhbCBsb2NhbCA9IF9sb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZSh2YXJpYWJsZSk7CiAgICAgIGlmICghX2NhcHR1cmVkVmFyaWFibGVzLmNvbnRhaW5zKGxvY2FsKSkgewogICAgICAgIERhcnRUeXBlIHR5cGUgPSBfbG9jYWxzTWFwLmdldExvY2FsVHlwZShfZWxlbWVudE1hcCwgbG9jYWwpOwogICAgICAgIF9zdGF0ZS51cGRhdGVMb2NhbCgKICAgICAgICAgICAgX2luZmVycmVyLCBfY2FwdHVyZWRBbmRCb3hlZCwgbG9jYWwsIHJlY2VpdmVyVHlwZSwgbm9kZSwgdHlwZSwKICAgICAgICAgICAgaXNOdWxsYWJsZTogc2VsZWN0b3IuYXBwbGllc1RvTnVsbFdpdGhvdXRUaHJvdygpKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBfaW5mZXJyZXIucmVnaXN0ZXJDYWxsZWRTZWxlY3RvcihjYWxsVHlwZSwgbm9kZSwgc2VsZWN0b3IsIG1hc2ssCiAgICAgICAgcmVjZWl2ZXJUeXBlLCBfYW5hbHl6ZWRNZW1iZXIsIGFyZ3VtZW50cywgX3NpZGVFZmZlY3RzQnVpbGRlciwKICAgICAgICBpbkxvb3A6IGluTG9vcCwgaXNDb25kaXRpb25hbDogZmFsc2UpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGhhbmRsZUR5bmFtaWNHZXQoaXIuTm9kZSBub2RlLCBTZWxlY3RvciBzZWxlY3RvciwKICAgICAgQWJzdHJhY3RWYWx1ZSBtYXNrLCBUeXBlSW5mb3JtYXRpb24gcmVjZWl2ZXJUeXBlKSB7CiAgICByZXR1cm4gX2hhbmRsZUR5bmFtaWMoCiAgICAgICAgQ2FsbFR5cGUuYWNjZXNzLCBub2RlLCBzZWxlY3RvciwgbWFzaywgcmVjZWl2ZXJUeXBlLCBudWxsKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBoYW5kbGVEeW5hbWljU2V0KAogICAgICBpci5Ob2RlIG5vZGUsCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssCiAgICAgIFR5cGVJbmZvcm1hdGlvbiByZWNlaXZlclR5cGUsCiAgICAgIFR5cGVJbmZvcm1hdGlvbiByaHNUeXBlKSB7CiAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMgPSBuZXcgQXJndW1lbnRzVHlwZXMoW3Joc1R5cGVdLCBudWxsKTsKICAgIHJldHVybiBfaGFuZGxlRHluYW1pYygKICAgICAgICBDYWxsVHlwZS5hY2Nlc3MsIG5vZGUsIHNlbGVjdG9yLCBtYXNrLCByZWNlaXZlclR5cGUsIGFyZ3VtZW50cyk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gaGFuZGxlRHluYW1pY0ludm9rZSgKICAgICAgQ2FsbFR5cGUgY2FsbFR5cGUsCiAgICAgIGlyLk5vZGUgbm9kZSwKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywKICAgICAgVHlwZUluZm9ybWF0aW9uIHJlY2VpdmVyVHlwZSwKICAgICAgQXJndW1lbnRzVHlwZXMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gX2hhbmRsZUR5bmFtaWMoCiAgICAgICAgY2FsbFR5cGUsIG5vZGUsIHNlbGVjdG9yLCBtYXNrLCByZWNlaXZlclR5cGUsIGFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRMZXQoaXIuTGV0IG5vZGUpIHsKICAgIHZpc2l0KG5vZGUudmFyaWFibGUpOwogICAgcmV0dXJuIHZpc2l0KG5vZGUuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRCbG9ja0V4cHJlc3Npb24oaXIuQmxvY2tFeHByZXNzaW9uIG5vZGUpIHsKICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgICByZXR1cm4gdmlzaXQobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRGb3JJblN0YXRlbWVudChpci5Gb3JJblN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAobm9kZS5pdGVyYWJsZSBpcyBpci5UaGlzRXhwcmVzc2lvbikgewogICAgICAvLyBBbnkgcmVhc29uYWJsZSBpbXBsZW1lbnRhdGlvbiBvZiBhbiBpdGVyYXRvciB3b3VsZCBleHBvc2UKICAgICAgLy8gdGhpcywgc28gd2UgcGxheSBpdCBzYWZlIGFuZCBhc3N1bWUgaXQgd2lsbC4KICAgICAgX3N0YXRlLm1hcmtUaGlzQXNFeHBvc2VkKCk7CiAgICB9CgogICAgQWJzdHJhY3RWYWx1ZSBjdXJyZW50TWFzazsKICAgIEFic3RyYWN0VmFsdWUgbW92ZU5leHRNYXNrOwogICAgVHlwZUluZm9ybWF0aW9uIGl0ZXJhdG9yVHlwZTsKICAgIGlmIChub2RlLmlzQXN5bmMpIHsKICAgICAgVHlwZUluZm9ybWF0aW9uIGV4cHJlc3Npb25UeXBlID0gdmlzaXQobm9kZS5pdGVyYWJsZSk7CgogICAgICBjdXJyZW50TWFzayA9IF9tZW1iZXJEYXRhLnR5cGVPZkl0ZXJhdG9yQ3VycmVudChub2RlKTsKICAgICAgbW92ZU5leHRNYXNrID0gX21lbWJlckRhdGEudHlwZU9mSXRlcmF0b3JNb3ZlTmV4dChub2RlKTsKCiAgICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yID0KICAgICAgICAgIF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5zdHJlYW1JdGVyYXRvckNvbnN0cnVjdG9yOwoKICAgICAgLy8vIFN5bnRoZXNpemUgYSBjYWxsIHRvIHRoZSBbU3RyZWFtSXRlcmF0b3JdIGNvbnN0cnVjdG9yLgogICAgICBpdGVyYXRvclR5cGUgPSBoYW5kbGVTdGF0aWNJbnZva2Uobm9kZSwgbnVsbCwgbnVsbCwgY29uc3RydWN0b3IsCiAgICAgICAgICBuZXcgQXJndW1lbnRzVHlwZXMoW2V4cHJlc3Npb25UeXBlXSwgbnVsbCkpOwogICAgfSBlbHNlIHsKICAgICAgVHlwZUluZm9ybWF0aW9uIGV4cHJlc3Npb25UeXBlID0gdmlzaXQobm9kZS5pdGVyYWJsZSk7CiAgICAgIFNlbGVjdG9yIGl0ZXJhdG9yU2VsZWN0b3IgPSBTZWxlY3RvcnMuaXRlcmF0b3I7CiAgICAgIEFic3RyYWN0VmFsdWUgaXRlcmF0b3JNYXNrID0gX21lbWJlckRhdGEudHlwZU9mSXRlcmF0b3Iobm9kZSk7CiAgICAgIGN1cnJlbnRNYXNrID0gX21lbWJlckRhdGEudHlwZU9mSXRlcmF0b3JDdXJyZW50KG5vZGUpOwogICAgICBtb3ZlTmV4dE1hc2sgPSBfbWVtYmVyRGF0YS50eXBlT2ZJdGVyYXRvck1vdmVOZXh0KG5vZGUpOwoKICAgICAgaXRlcmF0b3JUeXBlID0gaGFuZGxlRHluYW1pY0ludm9rZShDYWxsVHlwZS5mb3JJbiwgbm9kZSwgaXRlcmF0b3JTZWxlY3RvciwKICAgICAgICAgIGl0ZXJhdG9yTWFzaywgZXhwcmVzc2lvblR5cGUsIG5ldyBBcmd1bWVudHNUeXBlcy5lbXB0eSgpKTsKICAgIH0KCiAgICBoYW5kbGVEeW5hbWljSW52b2tlKENhbGxUeXBlLmZvckluLCBub2RlLCBTZWxlY3RvcnMubW92ZU5leHQsIG1vdmVOZXh0TWFzaywKICAgICAgICBpdGVyYXRvclR5cGUsIG5ldyBBcmd1bWVudHNUeXBlcy5lbXB0eSgpKTsKICAgIFR5cGVJbmZvcm1hdGlvbiBjdXJyZW50VHlwZSA9IGhhbmRsZUR5bmFtaWNJbnZva2UoCiAgICAgICAgQ2FsbFR5cGUuZm9ySW4sCiAgICAgICAgbm9kZSwKICAgICAgICBTZWxlY3RvcnMuY3VycmVudCwKICAgICAgICBjdXJyZW50TWFzaywKICAgICAgICBpdGVyYXRvclR5cGUsCiAgICAgICAgbmV3IEFyZ3VtZW50c1R5cGVzLmVtcHR5KCkpOwoKICAgIExvY2FsIHZhcmlhYmxlID0gX2xvY2Fsc01hcC5nZXRMb2NhbFZhcmlhYmxlKG5vZGUudmFyaWFibGUpOwogICAgRGFydFR5cGUgdmFyaWFibGVUeXBlID0gX2xvY2Fsc01hcC5nZXRMb2NhbFR5cGUoX2VsZW1lbnRNYXAsIHZhcmlhYmxlKTsKICAgIF9zdGF0ZS51cGRhdGVMb2NhbChfaW5mZXJyZXIsIF9jYXB0dXJlZEFuZEJveGVkLCB2YXJpYWJsZSwgY3VycmVudFR5cGUsCiAgICAgICAgbm9kZS52YXJpYWJsZSwgdmFyaWFibGVUeXBlKTsKCiAgICBKdW1wVGFyZ2V0IHRhcmdldCA9IF9sb2NhbHNNYXAuZ2V0SnVtcFRhcmdldEZvckZvckluKG5vZGUpOwogICAgcmV0dXJuIGhhbmRsZUxvb3Aobm9kZSwgdGFyZ2V0LCAoKSB7CiAgICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgICB9KTsKICB9CgogIHZvaWQgX3NldHVwQnJlYWtzQW5kQ29udGludWVzKEp1bXBUYXJnZXQgdGFyZ2V0KSB7CiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHJldHVybjsKICAgIGlmICh0YXJnZXQuaXNDb250aW51ZVRhcmdldCkgewogICAgICBfY29udGludWVzRm9yW3RhcmdldF0gPSA8TG9jYWxTdGF0ZT5bXTsKICAgIH0KICAgIGlmICh0YXJnZXQuaXNCcmVha1RhcmdldCkgewogICAgICBfYnJlYWtzRm9yW3RhcmdldF0gPSA8TG9jYWxTdGF0ZT5bXTsKICAgIH0KICB9CgogIHZvaWQgX2NsZWFyQnJlYWtzQW5kQ29udGludWVzKEp1bXBUYXJnZXQgZWxlbWVudCkgewogICAgX2NvbnRpbnVlc0Zvci5yZW1vdmUoZWxlbWVudCk7CiAgICBfYnJlYWtzRm9yLnJlbW92ZShlbGVtZW50KTsKICB9CgogIExpc3Q8TG9jYWxTdGF0ZT4gX2dldEJyZWFrcyhKdW1wVGFyZ2V0IHRhcmdldCkgewogICAgTGlzdDxMb2NhbFN0YXRlPiBsaXN0ID0gPExvY2FsU3RhdGU+W19zdGF0ZV07CiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHJldHVybiBsaXN0OwogICAgaWYgKCF0YXJnZXQuaXNCcmVha1RhcmdldCkgcmV0dXJuIGxpc3Q7CiAgICByZXR1cm4gbGlzdC4uYWRkQWxsKF9icmVha3NGb3JbdGFyZ2V0XSk7CiAgfQoKICBMaXN0PExvY2FsU3RhdGU+IF9nZXRMb29wQmFja0VkZ2VzKEp1bXBUYXJnZXQgdGFyZ2V0KSB7CiAgICBMaXN0PExvY2FsU3RhdGU+IGxpc3QgPSA8TG9jYWxTdGF0ZT5bX3N0YXRlXTsKICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgcmV0dXJuIGxpc3Q7CiAgICBpZiAoIXRhcmdldC5pc0NvbnRpbnVlVGFyZ2V0KSByZXR1cm4gbGlzdDsKICAgIHJldHVybiBsaXN0Li5hZGRBbGwoX2NvbnRpbnVlc0Zvclt0YXJnZXRdKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBoYW5kbGVMb29wKGlyLk5vZGUgbm9kZSwgSnVtcFRhcmdldCB0YXJnZXQsIHZvaWQgbG9naWMoKSkgewogICAgX2xvb3BMZXZlbCsrOwogICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CiAgICBMb2NhbFN0YXRlIHN0YXRlQmVmb3JlID0gX3N0YXRlOwogICAgc3RhdGVCZWZvcmUuc3RhcnRMb29wKF9pbmZlcnJlciwgbm9kZSk7CiAgICBkbyB7CiAgICAgIC8vIFNldHVwIChhbmQgY2xlYXIgaW4gY2FzZSBvZiBtdWx0aXBsZSBpdGVyYXRpb25zIG9mIHRoZSBsb29wKQogICAgICAvLyB0aGUgbGlzdHMgb2YgYnJlYWtzIGFuZCBjb250aW51ZXMgc2VlbiBpbiB0aGUgbG9vcC4KICAgICAgX3NldHVwQnJlYWtzQW5kQ29udGludWVzKHRhcmdldCk7CiAgICAgIF9zdGF0ZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChzdGF0ZUJlZm9yZSk7CiAgICAgIGxvZ2ljKCk7CiAgICAgIGNoYW5nZWQgPSBzdGF0ZUJlZm9yZS5tZXJnZUFsbChfaW5mZXJyZXIsIF9nZXRMb29wQmFja0VkZ2VzKHRhcmdldCkpOwogICAgfSB3aGlsZSAoY2hhbmdlZCk7CiAgICBfbG9vcExldmVsLS07CiAgICBzdGF0ZUJlZm9yZS5lbmRMb29wKF9pbmZlcnJlciwgbm9kZSk7CiAgICBib29sIGtlZXBPd25Mb2NhbHMgPSBub2RlIGlzISBpci5Eb1N0YXRlbWVudDsKICAgIF9zdGF0ZSA9IHN0YXRlQmVmb3JlLm1lcmdlQWZ0ZXJCcmVha3MoX2luZmVycmVyLCBfZ2V0QnJlYWtzKHRhcmdldCksCiAgICAgICAga2VlcE93bkxvY2Fsczoga2VlcE93bkxvY2Fscyk7CiAgICBfY2xlYXJCcmVha3NBbmRDb250aW51ZXModGFyZ2V0KTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKGlyLkNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICBDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciA9IF9lbGVtZW50TWFwLmdldENvbnN0cnVjdG9yKG5vZGUudGFyZ2V0KTsKICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cyA9IGFuYWx5emVBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBfZWxlbWVudE1hcC5nZXRTZWxlY3Rvcihub2RlKTsKICAgIEFic3RyYWN0VmFsdWUgbWFzayA9IF9tZW1iZXJEYXRhLnR5cGVPZlNlbmQobm9kZSk7CiAgICByZXR1cm4gaGFuZGxlQ29uc3RydWN0b3JJbnZva2UoCiAgICAgICAgbm9kZSwgbm9kZS5hcmd1bWVudHMsIHNlbGVjdG9yLCBtYXNrLCBjb25zdHJ1Y3RvciwgYXJndW1lbnRzKTsKICB9CgogIC8vLyBUcnkgdG8gZmluZCB0aGUgbGVuZ3RoIGdpdmVuIHRvIGEgZml4ZWQgYXJyYXkgY29uc3RydWN0b3IgY2FsbC4KICBpbnQgX2ZpbmRMZW5ndGgoaXIuQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgaW50IGZpbmlzaChpbnQgbGVuZ3RoKSB7CiAgICAgIC8vIEZpbHRlciBvdXQgbGVuZ3RocyB0aGF0IHNob3VsZCBub3QgYmUgdHJhY2tlZC4KICAgICAgaWYgKGxlbmd0aCA8IDApIHJldHVybiBudWxsOwogICAgICAvLyBTZXJpYWxpemF0aW9uIGxpbWl0LgogICAgICBpZiAobGVuZ3RoID49ICgxIDw8IDMwKSkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBsZW5ndGg7CiAgICB9CgogICAgaXIuRXhwcmVzc2lvbiBmaXJzdEFyZ3VtZW50ID0gYXJndW1lbnRzLnBvc2l0aW9uYWwuZmlyc3Q7CiAgICBpZiAoZmlyc3RBcmd1bWVudCBpcyBpci5Db25zdGFudEV4cHJlc3Npb24gJiYKICAgICAgICBmaXJzdEFyZ3VtZW50LmNvbnN0YW50IGlzIGlyLkRvdWJsZUNvbnN0YW50KSB7CiAgICAgIGlyLkRvdWJsZUNvbnN0YW50IGNvbnN0YW50ID0gZmlyc3RBcmd1bWVudC5jb25zdGFudDsKICAgICAgZG91YmxlIGRvdWJsZVZhbHVlID0gY29uc3RhbnQudmFsdWU7CiAgICAgIGludCB0cnVuY2F0ZWRWYWx1ZSA9IGRvdWJsZVZhbHVlLnRydW5jYXRlKCk7CiAgICAgIGlmIChkb3VibGVWYWx1ZSA9PSB0cnVuY2F0ZWRWYWx1ZSkgewogICAgICAgIHJldHVybiBmaW5pc2godHJ1bmNhdGVkVmFsdWUpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGZpcnN0QXJndW1lbnQgaXMgaXIuSW50TGl0ZXJhbCkgewogICAgICByZXR1cm4gZmluaXNoKGZpcnN0QXJndW1lbnQudmFsdWUpOwogICAgfSBlbHNlIGlmIChmaXJzdEFyZ3VtZW50IGlzIGlyLlN0YXRpY0dldCkgewogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gX2VsZW1lbnRNYXAuZ2V0TWVtYmVyKGZpcnN0QXJndW1lbnQudGFyZ2V0KTsKICAgICAgaWYgKG1lbWJlci5pc0ZpZWxkKSB7CiAgICAgICAgRmllbGRBbmFseXNpc0RhdGEgZmllbGREYXRhID0KICAgICAgICAgICAgX2Nsb3NlZFdvcmxkLmZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKG1lbWJlcik7CiAgICAgICAgaWYgKGZpZWxkRGF0YS5pc0VmZmVjdGl2ZWx5Q29uc3RhbnQgJiYgZmllbGREYXRhLmNvbnN0YW50VmFsdWUuaXNJbnQpIHsKICAgICAgICAgIEludENvbnN0YW50VmFsdWUgaW50VmFsdWUgPSBmaWVsZERhdGEuY29uc3RhbnRWYWx1ZTsKICAgICAgICAgIGlmIChpbnRWYWx1ZS5pbnRWYWx1ZS5pc1ZhbGlkSW50KSB7CiAgICAgICAgICAgIHJldHVybiBmaW5pc2goaW50VmFsdWUuaW50VmFsdWUudG9JbnQoKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZgogIGJvb2wgX2lzQ29uc3RydWN0b3JPZlR5cGVkQXJyYXlTdWJjbGFzcyhDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvcikgewogICAgQ2xhc3NFbnRpdHkgY2xzID0gY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3M7CiAgICByZXR1cm4gY2xzLmxpYnJhcnkuY2Fub25pY2FsVXJpID09IFVyaXMuZGFydF9fbmF0aXZlX3R5cGVkX2RhdGEgJiYKICAgICAgICBfY2xvc2VkV29ybGQubmF0aXZlRGF0YS5pc05hdGl2ZUNsYXNzKGNscykgJiYKICAgICAgICBfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkKICAgICAgICAgICAgLmlzU3VidHlwZU9mKGNscywgX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLnR5cGVkRGF0YUNsYXNzKSAmJgogICAgICAgIF9jbG9zZWRXb3JsZC5jbGFzc0hpZXJhcmNoeQogICAgICAgICAgICAuaXNTdWJ0eXBlT2YoY2xzLCBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMubGlzdENsYXNzKSAmJgogICAgICAgIGNvbnN0cnVjdG9yLm5hbWUgPT0gJyc7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gaGFuZGxlQ29uc3RydWN0b3JJbnZva2UoCiAgICAgIGlyLk5vZGUgbm9kZSwKICAgICAgaXIuQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywKICAgICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IsCiAgICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50c1R5cGVzKSB7CiAgICBUeXBlSW5mb3JtYXRpb24gcmV0dXJuVHlwZSA9CiAgICAgICAgaGFuZGxlU3RhdGljSW52b2tlKG5vZGUsIHNlbGVjdG9yLCBtYXNrLCBjb25zdHJ1Y3RvciwgYXJndW1lbnRzVHlwZXMpOwogICAgaWYgKF9lbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzLmlzVW5uYW1lZExpc3RDb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvcikpIHsKICAgICAgLy8gV2UgaGF2ZSBgbmV3IExpc3QoLi4uKWAuCiAgICAgIGlmIChhcmd1bWVudHMucG9zaXRpb25hbC5pc0VtcHR5ICYmIGFyZ3VtZW50cy5uYW1lZC5pc0VtcHR5KSB7CiAgICAgICAgLy8gV2UgaGF2ZSBgbmV3IExpc3QoKWAuCiAgICAgICAgcmV0dXJuIF9pbmZlcnJlci5jb25jcmV0ZVR5cGVzLnB1dElmQWJzZW50KAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICAoKSA9PiBfdHlwZXMuYWxsb2NhdGVMaXN0KF90eXBlcy5ncm93YWJsZUxpc3RUeXBlLCBub2RlLAogICAgICAgICAgICAgICAgX2FuYWx5emVkTWVtYmVyLCBfdHlwZXMubm9uTnVsbEVtcHR5KCksIDApKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBXZSBoYXZlIGBuZXcgTGlzdChsZW4pYC4KICAgICAgICBpbnQgbGVuZ3RoID0gX2ZpbmRMZW5ndGgoYXJndW1lbnRzKTsKICAgICAgICByZXR1cm4gX2luZmVycmVyLmNvbmNyZXRlVHlwZXMucHV0SWZBYnNlbnQoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgICgpID0+IF90eXBlcy5hbGxvY2F0ZUxpc3QoX3R5cGVzLmZpeGVkTGlzdFR5cGUsIG5vZGUsCiAgICAgICAgICAgICAgICBfYW5hbHl6ZWRNZW1iZXIsIF90eXBlcy5udWxsVHlwZSwgbGVuZ3RoKSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoX2VsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMKICAgICAgICAuaXNGaWxsZWRMaXN0Q29uc3RydWN0b3IoY29uc3RydWN0b3IpKSB7CiAgICAgIC8vIFdlIGhhdmUgYG5ldyBVaW50MzJMaXN0KGxlbiwgZmlsbClgLgogICAgICBpbnQgbGVuZ3RoID0gX2ZpbmRMZW5ndGgoYXJndW1lbnRzKTsKICAgICAgVHlwZUluZm9ybWF0aW9uIGVsZW1lbnRUeXBlID0gYXJndW1lbnRzVHlwZXMucG9zaXRpb25hbFsxXTsKCiAgICAgIHJldHVybiBfaW5mZXJyZXIuY29uY3JldGVUeXBlcy5wdXRJZkFic2VudCgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICAoKSA9PiBfdHlwZXMuYWxsb2NhdGVMaXN0KF90eXBlcy5maXhlZExpc3RUeXBlLCBub2RlLCBfYW5hbHl6ZWRNZW1iZXIsCiAgICAgICAgICAgICAgZWxlbWVudFR5cGUsIGxlbmd0aCkpOwogICAgfSBlbHNlIGlmIChfaXNDb25zdHJ1Y3Rvck9mVHlwZWRBcnJheVN1YmNsYXNzKGNvbnN0cnVjdG9yKSkgewogICAgICAvLyBXZSBoYXZlIHNvbWV0aGluZyBsaWtlIGBuZXcgTGlzdC5maWxsZWQobGVuLCBmaWxsKWAuCiAgICAgIGludCBsZW5ndGggPSBfZmluZExlbmd0aChhcmd1bWVudHMpOwogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgICAubG9va3VwQ2xhc3NNZW1iZXIoY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3MsICdbXScpOwogICAgICBUeXBlSW5mb3JtYXRpb24gZWxlbWVudFR5cGUgPSBfaW5mZXJyZXIucmV0dXJuVHlwZU9mTWVtYmVyKG1lbWJlcik7CiAgICAgIHJldHVybiBfaW5mZXJyZXIuY29uY3JldGVUeXBlcy5wdXRJZkFic2VudCgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICAoKSA9PiBfdHlwZXMuYWxsb2NhdGVMaXN0KAogICAgICAgICAgICAgIF90eXBlcy5ub25OdWxsRXhhY3QoY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3MpLAogICAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgICAgX2FuYWx5emVkTWVtYmVyLAogICAgICAgICAgICAgIGVsZW1lbnRUeXBlLAogICAgICAgICAgICAgIGxlbmd0aCkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJldHVyblR5cGU7CiAgICB9CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gaGFuZGxlU3RhdGljSW52b2tlKGlyLk5vZGUgbm9kZSwgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywgTWVtYmVyRW50aXR5IGVsZW1lbnQsIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIF9pbmZlcnJlci5yZWdpc3RlckNhbGxlZE1lbWJlcihub2RlLCBzZWxlY3RvciwgbWFzaywgX2FuYWx5emVkTWVtYmVyLAogICAgICAgIGVsZW1lbnQsIGFyZ3VtZW50cywgX3NpZGVFZmZlY3RzQnVpbGRlciwgaW5Mb29wKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBoYW5kbGVDbG9zdXJlQ2FsbChpci5Ob2RlIG5vZGUsIFNlbGVjdG9yIHNlbGVjdG9yLAogICAgICBBYnN0cmFjdFZhbHVlIG1hc2ssIE1lbWJlckVudGl0eSBtZW1iZXIsIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIF9pbmZlcnJlci5yZWdpc3RlckNhbGxlZENsb3N1cmUoCiAgICAgICAgbm9kZSwKICAgICAgICBzZWxlY3RvciwKICAgICAgICBtYXNrLAogICAgICAgIF9pbmZlcnJlci50eXBlT2ZNZW1iZXIobWVtYmVyKSwKICAgICAgICBfYW5hbHl6ZWRNZW1iZXIsCiAgICAgICAgYXJndW1lbnRzLAogICAgICAgIF9zaWRlRWZmZWN0c0J1aWxkZXIsCiAgICAgICAgaW5Mb29wOiBpbkxvb3ApOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGhhbmRsZUZvcmVpZ25JbnZva2UoCiAgICAgIGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSwKICAgICAgRnVuY3Rpb25FbnRpdHkgZnVuY3Rpb24sCiAgICAgIEFyZ3VtZW50c1R5cGVzIGFyZ3VtZW50cywKICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgU3RyaW5nIG5hbWUgPSBmdW5jdGlvbi5uYW1lOwogICAgaGFuZGxlU3RhdGljSW52b2tlKG5vZGUsIHNlbGVjdG9yLCBtYXNrLCBmdW5jdGlvbiwgYXJndW1lbnRzKTsKICAgIGlmIChuYW1lID09IElkZW50aWZpZXJzLkpTKSB7CiAgICAgIE5hdGl2ZUJlaGF2aW9yIG5hdGl2ZUJlaGF2aW9yID0KICAgICAgICAgIF9lbGVtZW50TWFwLmdldE5hdGl2ZUJlaGF2aW9yRm9ySnNDYWxsKG5vZGUpOwogICAgICBfc2lkZUVmZmVjdHNCdWlsZGVyLmFkZChuYXRpdmVCZWhhdmlvci5zaWRlRWZmZWN0cyk7CiAgICAgIHJldHVybiBfaW5mZXJyZXIudHlwZU9mTmF0aXZlQmVoYXZpb3IobmF0aXZlQmVoYXZpb3IpOwogICAgfSBlbHNlIGlmIChuYW1lID09IElkZW50aWZpZXJzLkpTX0VNQkVEREVEX0dMT0JBTCkgewogICAgICBOYXRpdmVCZWhhdmlvciBuYXRpdmVCZWhhdmlvciA9CiAgICAgICAgICBfZWxlbWVudE1hcC5nZXROYXRpdmVCZWhhdmlvckZvckpzRW1iZWRkZWRHbG9iYWxDYWxsKG5vZGUpOwogICAgICBfc2lkZUVmZmVjdHNCdWlsZGVyLmFkZChuYXRpdmVCZWhhdmlvci5zaWRlRWZmZWN0cyk7CiAgICAgIHJldHVybiBfaW5mZXJyZXIudHlwZU9mTmF0aXZlQmVoYXZpb3IobmF0aXZlQmVoYXZpb3IpOwogICAgfSBlbHNlIGlmIChuYW1lID09IElkZW50aWZpZXJzLkpTX0JVSUxUSU4pIHsKICAgICAgTmF0aXZlQmVoYXZpb3IgbmF0aXZlQmVoYXZpb3IgPQogICAgICAgICAgX2VsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0J1aWx0aW5DYWxsKG5vZGUpOwogICAgICBfc2lkZUVmZmVjdHNCdWlsZGVyLmFkZChuYXRpdmVCZWhhdmlvci5zaWRlRWZmZWN0cyk7CiAgICAgIHJldHVybiBfaW5mZXJyZXIudHlwZU9mTmF0aXZlQmVoYXZpb3IobmF0aXZlQmVoYXZpb3IpOwogICAgfSBlbHNlIGlmIChuYW1lID09IElkZW50aWZpZXJzLkpTX1NUUklOR19DT05DQVQpIHsKICAgICAgcmV0dXJuIF90eXBlcy5zdHJpbmdUeXBlOwogICAgfSBlbHNlIHsKICAgICAgX3NpZGVFZmZlY3RzQnVpbGRlci5zZXRBbGxTaWRlRWZmZWN0cygpOwogICAgICByZXR1cm4gX3R5cGVzLmR5bmFtaWNUeXBlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0U3RhdGljSW52b2NhdGlvbihpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPSBfZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZS50YXJnZXQpOwogICAgQXJndW1lbnRzVHlwZXMgYXJndW1lbnRzID0gYW5hbHl6ZUFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cyk7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKG5vZGUpOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX21lbWJlckRhdGEudHlwZU9mU2VuZChub2RlKTsKICAgIGlmIChfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuaXNGb3JlaWduKG1lbWJlcikpIHsKICAgICAgcmV0dXJuIGhhbmRsZUZvcmVpZ25JbnZva2Uobm9kZSwgbWVtYmVyLCBhcmd1bWVudHMsIHNlbGVjdG9yLCBtYXNrKTsKICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzQ29uc3RydWN0b3IpIHsKICAgICAgcmV0dXJuIGhhbmRsZUNvbnN0cnVjdG9ySW52b2tlKAogICAgICAgICAgbm9kZSwgbm9kZS5hcmd1bWVudHMsIHNlbGVjdG9yLCBtYXNrLCBtZW1iZXIsIGFyZ3VtZW50cyk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQobWVtYmVyLmlzRnVuY3Rpb24sICJVbmV4cGVjdGVkIHN0YXRpYyBpbnZvY2F0aW9uIHRhcmdldDogJG1lbWJlciIpOwogICAgICBUeXBlSW5mb3JtYXRpb24gdHlwZSA9CiAgICAgICAgICBoYW5kbGVTdGF0aWNJbnZva2Uobm9kZSwgc2VsZWN0b3IsIG1hc2ssIG1lbWJlciwgYXJndW1lbnRzKTsKICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSA9CiAgICAgICAgICBfZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlKG1lbWJlcik7CiAgICAgIGlmIChmdW5jdGlvblR5cGUucmV0dXJuVHlwZS5jb250YWluc0ZyZWVUeXBlVmFyaWFibGVzKSB7CiAgICAgICAgLy8gVGhlIHJldHVybiB0eXBlIHZhcmllcyB3aXRoIHRoZSBjYWxsIHNpdGUgc28gd2UgbmFycm93IHRoZSBzdGF0aWMKICAgICAgICAvLyByZXR1cm4gdHlwZS4KICAgICAgICB0eXBlID0gX3R5cGVzLm5hcnJvd1R5cGUodHlwZSwgX2dldFN0YXRpY1R5cGUobm9kZSkpOwogICAgICB9CiAgICAgIHJldHVybiB0eXBlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0TG9hZExpYnJhcnkoaXIuTG9hZExpYnJhcnkgbm9kZSkgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW1wcm92ZSB0aGlzIGJ5IHJldHVybmluZyBhIEZ1dHVyZSB0eXBlIGluc3RlYWQuCiAgICByZXR1cm4gX3R5cGVzLmR5bmFtaWNUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0U3RhdGljR2V0KGlyLlN0YXRpY0dldCBub2RlKSB7CiAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPSBfbWVtYmVyRGF0YS50eXBlT2ZTZW5kKG5vZGUpOwogICAgYXNzZXJ0KG1hc2sgPT0gbnVsbCk7CiAgICByZXR1cm4gY3JlYXRlU3RhdGljR2V0VHlwZUluZm9ybWF0aW9uKG5vZGUsIG5vZGUudGFyZ2V0LCBtYXNrOiBtYXNrKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBjcmVhdGVTdGF0aWNHZXRUeXBlSW5mb3JtYXRpb24oaXIuTm9kZSBub2RlLCBpci5NZW1iZXIgdGFyZ2V0LAogICAgICB7QWJzdHJhY3RWYWx1ZSBtYXNrfSkgewogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IF9lbGVtZW50TWFwLmdldE1lbWJlcih0YXJnZXQpOwogICAgcmV0dXJuIGhhbmRsZVN0YXRpY0ludm9rZSgKICAgICAgICBub2RlLCBuZXcgU2VsZWN0b3IuZ2V0dGVyKG1lbWJlci5tZW1iZXJOYW1lKSwgbWFzaywgbWVtYmVyLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFN0YXRpY1NldChpci5TdGF0aWNTZXQgbm9kZSkgewogICAgVHlwZUluZm9ybWF0aW9uIHJoc1R5cGUgPSB2aXNpdChub2RlLnZhbHVlKTsKICAgIGlmIChub2RlLnZhbHVlIGlzIGlyLlRoaXNFeHByZXNzaW9uKSB7CiAgICAgIF9zdGF0ZS5tYXJrVGhpc0FzRXhwb3NlZCgpOwogICAgfQogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IF9lbGVtZW50TWFwLmdldE1lbWJlcihub2RlLnRhcmdldCk7CiAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPSBfbWVtYmVyRGF0YS50eXBlT2ZTZW5kKG5vZGUpOwogICAgaGFuZGxlU3RhdGljSW52b2tlKG5vZGUsIG5ldyBTZWxlY3Rvci5zZXR0ZXIobWVtYmVyLm1lbWJlck5hbWUpLCBtYXNrLAogICAgICAgIG1lbWJlciwgbmV3IEFyZ3VtZW50c1R5cGVzKFtyaHNUeXBlXSwgbnVsbCkpOwogICAgcmV0dXJuIHJoc1R5cGU7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gaGFuZGxlUHJvcGVydHlHZXQoCiAgICAgIGlyLlRyZWVOb2RlIG5vZGUsIFR5cGVJbmZvcm1hdGlvbiByZWNlaXZlclR5cGUsIGlyLk1lbWJlciBpbnRlcmZhY2VUYXJnZXQsCiAgICAgIHtib29sIGlzVGhpc30pIHsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gX2VsZW1lbnRNYXAuZ2V0U2VsZWN0b3Iobm9kZSk7CiAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPSBfbWVtYmVyRGF0YS50eXBlT2ZTZW5kKG5vZGUpOwogICAgaWYgKGlzVGhpcykgewogICAgICBfY2hlY2tJZkV4cG9zZXNUaGlzKAogICAgICAgICAgc2VsZWN0b3IsIF90eXBlcy5uZXdUeXBlZFNlbGVjdG9yKHJlY2VpdmVyVHlwZSwgbWFzaykpOwogICAgfQogICAgVHlwZUluZm9ybWF0aW9uIHR5cGUgPSBoYW5kbGVEeW5hbWljR2V0KG5vZGUsIHNlbGVjdG9yLCBtYXNrLCByZWNlaXZlclR5cGUpOwogICAgaWYgKGludGVyZmFjZVRhcmdldCAhPSBudWxsKSB7CiAgICAgIC8vIFB1bGwgdGhlIHR5cGUgZnJvbSBrZXJuZWwgKGluc3RlYWQgb2YgZnJvbSB0aGUgSi1tb2RlbCkgYmVjYXVzZSB0aGUKICAgICAgLy8gaW50ZXJmYWNlIHRhcmdldCBtaWdodCBiZSBhYnN0cmFjdCBhbmQgdGhlcmVmb3JlIG5vdCBwYXJ0IG9mIHRoZQogICAgICAvLyBKLW1vZGVsLgogICAgICBpci5EYXJ0VHlwZSByZXN1bHRUeXBlID0gaW50ZXJmYWNlVGFyZ2V0LmdldHRlclR5cGU7CiAgICAgIC8vIFRoZSByZXN1bHQgdHlwZSB2YXJpZXMgd2l0aCB0aGUgY2FsbCBzaXRlIHNvIHdlIG5hcnJvdyB0aGUgc3RhdGljCiAgICAgIC8vIHJlc3VsdCB0eXBlLgogICAgICBpZiAoY29udGFpbnNGcmVlVmFyaWFibGVzKHJlc3VsdFR5cGUpKSB7CiAgICAgICAgdHlwZSA9IF90eXBlcy5uYXJyb3dUeXBlKHR5cGUsIF9nZXRTdGF0aWNUeXBlKG5vZGUpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRQcm9wZXJ0eUdldChpci5Qcm9wZXJ0eUdldCBub2RlKSB7CiAgICBUeXBlSW5mb3JtYXRpb24gcmVjZWl2ZXJUeXBlID0gdmlzaXQobm9kZS5yZWNlaXZlcik7CiAgICByZXR1cm4gaGFuZGxlUHJvcGVydHlHZXQobm9kZSwgcmVjZWl2ZXJUeXBlLCBub2RlLmludGVyZmFjZVRhcmdldCwKICAgICAgICBpc1RoaXM6IG5vZGUucmVjZWl2ZXIgaXMgaXIuVGhpc0V4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoaXIuRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgVHlwZUluZm9ybWF0aW9uIHJlY2VpdmVyVHlwZSA9IHRoaXNUeXBlOwogICAgcmV0dXJuIGhhbmRsZVByb3BlcnR5R2V0KG5vZGUsIHJlY2VpdmVyVHlwZSwgbm9kZS50YXJnZXQsIGlzVGhpczogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRQcm9wZXJ0eVNldChpci5Qcm9wZXJ0eVNldCBub2RlKSB7CiAgICBUeXBlSW5mb3JtYXRpb24gcmVjZWl2ZXJUeXBlID0gdmlzaXQobm9kZS5yZWNlaXZlcik7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IF9lbGVtZW50TWFwLmdldFNlbGVjdG9yKG5vZGUpOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX21lbWJlckRhdGEudHlwZU9mU2VuZChub2RlKTsKCiAgICBUeXBlSW5mb3JtYXRpb24gcmhzVHlwZSA9IHZpc2l0KG5vZGUudmFsdWUpOwogICAgaWYgKG5vZGUudmFsdWUgaXMgaXIuVGhpc0V4cHJlc3Npb24pIHsKICAgICAgX3N0YXRlLm1hcmtUaGlzQXNFeHBvc2VkKCk7CiAgICB9CgogICAgaWYgKF9pbkdlbmVyYXRpdmVDb25zdHJ1Y3RvciAmJiBub2RlLnJlY2VpdmVyIGlzIGlyLlRoaXNFeHByZXNzaW9uKSB7CiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZWRNYXNrID0gX3R5cGVzLm5ld1R5cGVkU2VsZWN0b3IocmVjZWl2ZXJUeXBlLCBtYXNrKTsKICAgICAgaWYgKCFfY2xvc2VkV29ybGQuaW5jbHVkZXNDbG9zdXJlQ2FsbChzZWxlY3RvciwgdHlwZWRNYXNrKSkgewogICAgICAgIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gdGFyZ2V0cyA9CiAgICAgICAgICAgIF9jbG9zZWRXb3JsZC5sb2NhdGVNZW1iZXJzKHNlbGVjdG9yLCB0eXBlZE1hc2spOwogICAgICAgIC8vIFdlIGp1c3QgcmVjb2duaXplZCBhIGZpZWxkIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmb3JtOgogICAgICAgIC8vIGB0aGlzLmZvbyA9IDQyYC4gSWYgdGhlcmUgaXMgb25seSBvbmUgdGFyZ2V0LCB3ZSBjYW4gdXBkYXRlCiAgICAgICAgLy8gaXRzIHR5cGUuCiAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIE1lbWJlckVudGl0eSBzaW5nbGUgPSB0YXJnZXRzLmZpcnN0OwogICAgICAgICAgaWYgKHNpbmdsZS5pc0ZpZWxkKSB7CiAgICAgICAgICAgIEZpZWxkRW50aXR5IGZpZWxkID0gc2luZ2xlOwogICAgICAgICAgICBfc3RhdGUudXBkYXRlRmllbGQoZmllbGQsIHJoc1R5cGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKG5vZGUucmVjZWl2ZXIgaXMgaXIuVGhpc0V4cHJlc3Npb24pIHsKICAgICAgX2NoZWNrSWZFeHBvc2VzVGhpcygKICAgICAgICAgIHNlbGVjdG9yLCBfdHlwZXMubmV3VHlwZWRTZWxlY3RvcihyZWNlaXZlclR5cGUsIG1hc2spKTsKICAgIH0KICAgIGhhbmRsZUR5bmFtaWNTZXQobm9kZSwgc2VsZWN0b3IsIG1hc2ssIHJlY2VpdmVyVHlwZSwgcmhzVHlwZSk7CiAgICByZXR1cm4gcmhzVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFRoaXNFeHByZXNzaW9uKGlyLlRoaXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiB0aGlzVHlwZTsKICB9CgogIHZvaWQgaGFuZGxlQ29uZGl0aW9uKGlyLk5vZGUgbm9kZSkgewogICAgYm9vbCBvbGRBY2N1bXVsYXRlSXNDaGVja3MgPSBfYWNjdW11bGF0ZUlzQ2hlY2tzOwogICAgX2FjY3VtdWxhdGVJc0NoZWNrcyA9IHRydWU7CiAgICB2aXNpdChub2RlLCBjb25kaXRpb25Db250ZXh0OiB0cnVlKTsKICAgIF9hY2N1bXVsYXRlSXNDaGVja3MgPSBvbGRBY2N1bXVsYXRlSXNDaGVja3M7CiAgfQoKICB2b2lkIF9wb3RlbnRpYWxseUFkZElzQ2hlY2soaXIuSXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlmICghX2FjY3VtdWxhdGVJc0NoZWNrcykgcmV0dXJuOwogICAgaXIuRXhwcmVzc2lvbiBvcGVyYW5kID0gbm9kZS5vcGVyYW5kOwogICAgaWYgKG9wZXJhbmQgaXMgaXIuVmFyaWFibGVHZXQpIHsKICAgICAgTG9jYWwgbG9jYWwgPSBfbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUob3BlcmFuZC52YXJpYWJsZSk7CiAgICAgIERhcnRUeXBlIHR5cGUgPSBfZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLnR5cGUpOwogICAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJDaGVja1doZW5UcnVlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKF9zdGF0ZSk7CiAgICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlckNoZWNrV2hlbkZhbHNlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKF9zdGF0ZSk7CiAgICAgIHN0YXRlQWZ0ZXJDaGVja1doZW5UcnVlLm5hcnJvd0xvY2FsKAogICAgICAgICAgX2luZmVycmVyLCBfY2FwdHVyZWRBbmRCb3hlZCwgbG9jYWwsIHR5cGUsIG5vZGUpOwogICAgICBfc2V0U3RhdGVBZnRlcihfc3RhdGUsIHN0YXRlQWZ0ZXJDaGVja1doZW5UcnVlLCBzdGF0ZUFmdGVyQ2hlY2tXaGVuRmFsc2UpOwogICAgfQogIH0KCiAgdm9pZCBfcG90ZW50aWFsbHlBZGROdWxsQ2hlY2soCiAgICAgIGlyLk1ldGhvZEludm9jYXRpb24gbm9kZSwgaXIuRXhwcmVzc2lvbiByZWNlaXZlcikgewogICAgaWYgKCFfYWNjdW11bGF0ZUlzQ2hlY2tzKSByZXR1cm47CiAgICBpZiAocmVjZWl2ZXIgaXMgaXIuVmFyaWFibGVHZXQpIHsKICAgICAgTG9jYWwgbG9jYWwgPSBfbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUocmVjZWl2ZXIudmFyaWFibGUpOwogICAgICBEYXJ0VHlwZSBsb2NhbFR5cGUgPSBfbG9jYWxzTWFwLmdldExvY2FsVHlwZShfZWxlbWVudE1hcCwgbG9jYWwpOwogICAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJDaGVja1doZW5UcnVlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKF9zdGF0ZSk7CiAgICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlckNoZWNrV2hlbkZhbHNlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKF9zdGF0ZSk7CiAgICAgIHN0YXRlQWZ0ZXJDaGVja1doZW5UcnVlLnVwZGF0ZUxvY2FsKF9pbmZlcnJlciwgX2NhcHR1cmVkQW5kQm94ZWQsIGxvY2FsLAogICAgICAgICAgX3R5cGVzLm51bGxUeXBlLCBub2RlLCBsb2NhbFR5cGUpOwogICAgICBzdGF0ZUFmdGVyQ2hlY2tXaGVuRmFsc2UubmFycm93TG9jYWwoX2luZmVycmVyLCBfY2FwdHVyZWRBbmRCb3hlZCwgbG9jYWwsCiAgICAgICAgICBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0VHlwZSwgbm9kZSk7CiAgICAgIF9zZXRTdGF0ZUFmdGVyKF9zdGF0ZSwgc3RhdGVBZnRlckNoZWNrV2hlblRydWUsIHN0YXRlQWZ0ZXJDaGVja1doZW5GYWxzZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRJZlN0YXRlbWVudChpci5JZlN0YXRlbWVudCBub2RlKSB7CiAgICBMb2NhbFN0YXRlIHN0YXRlQmVmb3JlID0gX3N0YXRlOwogICAgaGFuZGxlQ29uZGl0aW9uKG5vZGUuY29uZGl0aW9uKTsKICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlckNvbmRpdGlvbldoZW5UcnVlID0gX3N0YXRlQWZ0ZXJXaGVuVHJ1ZTsKICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlckNvbmRpdGlvbldoZW5GYWxzZSA9IF9zdGF0ZUFmdGVyV2hlbkZhbHNlOwogICAgX3N0YXRlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKHN0YXRlQWZ0ZXJDb25kaXRpb25XaGVuVHJ1ZSk7CiAgICB2aXNpdChub2RlLnRoZW4pOwogICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyVGhlbiA9IF9zdGF0ZTsKICAgIF9zdGF0ZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChzdGF0ZUFmdGVyQ29uZGl0aW9uV2hlbkZhbHNlKTsKICAgIHZpc2l0KG5vZGUub3RoZXJ3aXNlKTsKICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlckVsc2UgPSBfc3RhdGU7CiAgICBfc3RhdGUgPQogICAgICAgIHN0YXRlQmVmb3JlLm1lcmdlRGlhbW9uZEZsb3coX2luZmVycmVyLCBzdGF0ZUFmdGVyVGhlbiwgc3RhdGVBZnRlckVsc2UpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRJc0V4cHJlc3Npb24oaXIuSXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHZpc2l0KG5vZGUub3BlcmFuZCk7CiAgICBfcG90ZW50aWFsbHlBZGRJc0NoZWNrKG5vZGUpOwogICAgcmV0dXJuIF90eXBlcy5ib29sVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdE5vdChpci5Ob3Qgbm9kZSkgewogICAgdmlzaXQobm9kZS5vcGVyYW5kLCBjb25kaXRpb25Db250ZXh0OiBfYWNjdW11bGF0ZUlzQ2hlY2tzKTsKICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlck9wZXJhbmRXaGVuVHJ1ZSA9IF9zdGF0ZUFmdGVyV2hlblRydWU7CiAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJPcGVyYW5kV2hlbkZhbHNlID0gX3N0YXRlQWZ0ZXJXaGVuRmFsc2U7CiAgICBfc2V0U3RhdGVBZnRlcigKICAgICAgICBfc3RhdGUsIHN0YXRlQWZ0ZXJPcGVyYW5kV2hlbkZhbHNlLCBzdGF0ZUFmdGVyT3BlcmFuZFdoZW5UcnVlKTsKICAgIHJldHVybiBfdHlwZXMuYm9vbFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihpci5Mb2dpY2FsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpZiAobm9kZS5vcGVyYXRvciA9PSAnJiYnKSB7CiAgICAgIExvY2FsU3RhdGUgc3RhdGVCZWZvcmUgPSBfc3RhdGU7CiAgICAgIF9zdGF0ZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChzdGF0ZUJlZm9yZSk7CiAgICAgIGhhbmRsZUNvbmRpdGlvbihub2RlLmxlZnQpOwogICAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJMZWZ0V2hlblRydWUgPSBfc3RhdGVBZnRlcldoZW5UcnVlOwogICAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJMZWZ0V2hlbkZhbHNlID0gX3N0YXRlQWZ0ZXJXaGVuRmFsc2U7CiAgICAgIF9zdGF0ZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChzdGF0ZUFmdGVyTGVmdFdoZW5UcnVlKTsKICAgICAgaGFuZGxlQ29uZGl0aW9uKG5vZGUucmlnaHQpOwogICAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJSaWdodFdoZW5UcnVlID0gX3N0YXRlQWZ0ZXJXaGVuVHJ1ZTsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyUmlnaHRXaGVuRmFsc2UgPSBfc3RhdGVBZnRlcldoZW5GYWxzZTsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyV2hlblRydWUgPSBzdGF0ZUFmdGVyUmlnaHRXaGVuVHJ1ZTsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyV2hlbkZhbHNlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKHN0YXRlQmVmb3JlKQogICAgICAgICAgLm1lcmdlRGlhbW9uZEZsb3coCiAgICAgICAgICAgICAgX2luZmVycmVyLCBzdGF0ZUFmdGVyTGVmdFdoZW5GYWxzZSwgc3RhdGVBZnRlclJpZ2h0V2hlbkZhbHNlKTsKICAgICAgTG9jYWxTdGF0ZSBhZnRlciA9IHN0YXRlQmVmb3JlLm1lcmdlRGlhbW9uZEZsb3coCiAgICAgICAgICBfaW5mZXJyZXIsIHN0YXRlQWZ0ZXJXaGVuVHJ1ZSwgc3RhdGVBZnRlcldoZW5GYWxzZSk7CiAgICAgIF9zZXRTdGF0ZUFmdGVyKGFmdGVyLCBzdGF0ZUFmdGVyV2hlblRydWUsIHN0YXRlQWZ0ZXJXaGVuRmFsc2UpOwogICAgICByZXR1cm4gX3R5cGVzLmJvb2xUeXBlOwogICAgfSBlbHNlIGlmIChub2RlLm9wZXJhdG9yID09ICd8fCcpIHsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUJlZm9yZSA9IF9zdGF0ZTsKICAgICAgX3N0YXRlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKHN0YXRlQmVmb3JlKTsKICAgICAgaGFuZGxlQ29uZGl0aW9uKG5vZGUubGVmdCk7CiAgICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlckxlZnRXaGVuVHJ1ZSA9IF9zdGF0ZUFmdGVyV2hlblRydWU7CiAgICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlckxlZnRXaGVuRmFsc2UgPSBfc3RhdGVBZnRlcldoZW5GYWxzZTsKICAgICAgX3N0YXRlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKHN0YXRlQWZ0ZXJMZWZ0V2hlbkZhbHNlKTsKICAgICAgaGFuZGxlQ29uZGl0aW9uKG5vZGUucmlnaHQpOwogICAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJSaWdodFdoZW5UcnVlID0gX3N0YXRlQWZ0ZXJXaGVuVHJ1ZTsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyUmlnaHRXaGVuRmFsc2UgPSBfc3RhdGVBZnRlcldoZW5GYWxzZTsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyV2hlblRydWUgPSBuZXcgTG9jYWxTdGF0ZS5jaGlsZFBhdGgoc3RhdGVCZWZvcmUpCiAgICAgICAgICAubWVyZ2VEaWFtb25kRmxvdygKICAgICAgICAgICAgICBfaW5mZXJyZXIsIHN0YXRlQWZ0ZXJMZWZ0V2hlblRydWUsIHN0YXRlQWZ0ZXJSaWdodFdoZW5UcnVlKTsKICAgICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyV2hlbkZhbHNlID0gc3RhdGVBZnRlclJpZ2h0V2hlbkZhbHNlOwogICAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXIgPSBzdGF0ZUJlZm9yZS5tZXJnZURpYW1vbmRGbG93KAogICAgICAgICAgX2luZmVycmVyLCBzdGF0ZUFmdGVyV2hlblRydWUsIHN0YXRlQWZ0ZXJXaGVuRmFsc2UpOwogICAgICBfc2V0U3RhdGVBZnRlcihzdGF0ZUFmdGVyLCBzdGF0ZUFmdGVyV2hlblRydWUsIHN0YXRlQWZ0ZXJXaGVuRmFsc2UpOwogICAgICByZXR1cm4gX3R5cGVzLmJvb2xUeXBlOwogICAgfQogICAgZmFpbGVkQXQoQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAiVW5leHBlY3RlZCBsb2dpY2FsIG9wZXJhdG9yICcke25vZGUub3BlcmF0b3J9Jy4iKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKGlyLkNvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBMb2NhbFN0YXRlIHN0YXRlQmVmb3JlID0gX3N0YXRlOwogICAgaGFuZGxlQ29uZGl0aW9uKG5vZGUuY29uZGl0aW9uKTsKICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlcldoZW5UcnVlID0gX3N0YXRlQWZ0ZXJXaGVuVHJ1ZTsKICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlcldoZW5GYWxzZSA9IF9zdGF0ZUFmdGVyV2hlbkZhbHNlOwogICAgX3N0YXRlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKHN0YXRlQWZ0ZXJXaGVuVHJ1ZSk7CiAgICBUeXBlSW5mb3JtYXRpb24gZmlyc3RUeXBlID0gdmlzaXQobm9kZS50aGVuKTsKICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlclRoZW4gPSBfc3RhdGU7CiAgICBfc3RhdGUgPSBuZXcgTG9jYWxTdGF0ZS5jaGlsZFBhdGgoc3RhdGVBZnRlcldoZW5GYWxzZSk7CiAgICBUeXBlSW5mb3JtYXRpb24gc2Vjb25kVHlwZSA9IHZpc2l0KG5vZGUub3RoZXJ3aXNlKTsKICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlckVsc2UgPSBfc3RhdGU7CiAgICBfc3RhdGUgPQogICAgICAgIHN0YXRlQmVmb3JlLm1lcmdlRGlhbW9uZEZsb3coX2luZmVycmVyLCBzdGF0ZUFmdGVyVGhlbiwgc3RhdGVBZnRlckVsc2UpOwogICAgcmV0dXJuIF90eXBlcy5hbGxvY2F0ZURpYW1vbmRQaGkoZmlyc3RUeXBlLCBzZWNvbmRUeXBlKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBoYW5kbGVMb2NhbEZ1bmN0aW9uKAogICAgICBpci5UcmVlTm9kZSBub2RlLCBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlLAogICAgICBbaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZV0pIHsKICAgIC8vIFdlIGxvb3NlIHRyYWNrIG9mIFt0aGlzXSBpbiBjbG9zdXJlcyAoc2VlIGlzc3VlIDIwODQwKS4gVG8gYmUgb24KICAgIC8vIHRoZSBzYWZlIHNpZGUsIHdlIG1hcmsgW3RoaXNdIGFzIGV4cG9zZWQgaGVyZS4gV2UgY291bGQgZG8gYmV0dGVyIGJ5CiAgICAvLyBhbmFseXppbmcgdGhlIGNsb3N1cmUuCiAgICAvLyBUT0RPKGhlcmh1dCk6IEFuYWx5emUgd2hldGhlciBjbG9zdXJlIGV4cG9zZXMgdGhpcy4gUG9zc2libHkgdXNpbmcKICAgIC8vIHdoZXRoZXIgdGhlIGNyZWF0ZWQgY2xvc3VyZSBhcyBhIGB0aGlzTG9jYWxgLgogICAgX3N0YXRlLm1hcmtUaGlzQXNFeHBvc2VkKCk7CgogICAgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbyBpbmZvID0gX2Nsb3N1cmVEYXRhTG9va3VwLmdldENsb3N1cmVJbmZvKG5vZGUpOwoKICAgIC8vIFJlY29yZCB0aGUgdHlwZXMgb2YgY2FwdHVyZWQgbm9uLWJveGVkIHZhcmlhYmxlcy4gVHlwZXMgb2YKICAgIC8vIHRoZXNlIHZhcmlhYmxlcyBtYXkgYWxyZWFkeSBiZSB0aGVyZSwgYmVjYXVzZSBvZiBhbiBhbmFseXNpcyBvZgogICAgLy8gYSBwcmV2aW91cyBjbG9zdXJlLgogICAgaW5mby5mb3JFYWNoRnJlZVZhcmlhYmxlKChMb2NhbCB2YXJpYWJsZSwgRmllbGRFbnRpdHkgZmllbGQpIHsKICAgICAgaWYgKCFpbmZvLmlzQm94ZWRWYXJpYWJsZSh2YXJpYWJsZSkpIHsKICAgICAgICBpZiAodmFyaWFibGUgPT0gaW5mby50aGlzTG9jYWwpIHsKICAgICAgICAgIF9pbmZlcnJlci5yZWNvcmRUeXBlT2ZGaWVsZChmaWVsZCwgdGhpc1R5cGUpOwogICAgICAgIH0KICAgICAgICBUeXBlSW5mb3JtYXRpb24gbG9jYWxUeXBlID0KICAgICAgICAgICAgX3N0YXRlLnJlYWRMb2NhbChfaW5mZXJyZXIsIF9jYXB0dXJlZEFuZEJveGVkLCB2YXJpYWJsZSk7CiAgICAgICAgLy8gVGhlIHR5cGUgaXMgbnVsbCBmb3IgdHlwZSBwYXJhbWV0ZXJzLgogICAgICAgIGlmIChsb2NhbFR5cGUgIT0gbnVsbCkgewogICAgICAgICAgX2luZmVycmVyLnJlY29yZFR5cGVPZkZpZWxkKGZpZWxkLCBsb2NhbFR5cGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBfY2FwdHVyZWRWYXJpYWJsZXMuYWRkKHZhcmlhYmxlKTsKICAgIH0pOwoKICAgIFR5cGVJbmZvcm1hdGlvbiBsb2NhbEZ1bmN0aW9uVHlwZSA9CiAgICAgICAgX2luZmVycmVyLmNvbmNyZXRlVHlwZXMucHV0SWZBYnNlbnQobm9kZSwgKCkgewogICAgICByZXR1cm4gX3R5cGVzLmFsbG9jYXRlQ2xvc3VyZShpbmZvLmNhbGxNZXRob2QpOwogICAgfSk7CiAgICBpZiAodmFyaWFibGUgIT0gbnVsbCkgewogICAgICBMb2NhbCBsb2NhbCA9IF9sb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZSh2YXJpYWJsZSk7CiAgICAgIERhcnRUeXBlIHR5cGUgPSBfbG9jYWxzTWFwLmdldExvY2FsVHlwZShfZWxlbWVudE1hcCwgbG9jYWwpOwogICAgICBfc3RhdGUudXBkYXRlTG9jYWwoCiAgICAgICAgICBfaW5mZXJyZXIsIF9jYXB0dXJlZEFuZEJveGVkLCBsb2NhbCwgbG9jYWxGdW5jdGlvblR5cGUsIG5vZGUsIHR5cGUsCiAgICAgICAgICBpc051bGxhYmxlOiBmYWxzZSk7CiAgICB9CgogICAgLy8gV2UgZG9uJ3QgcHV0IHRoZSBjbG9zdXJlIGluIHRoZSB3b3JrIHF1ZXVlIG9mIHRoZQogICAgLy8gaW5mZXJyZXIsIGJlY2F1c2UgaXQgd2lsbCBzaGFyZSBpbmZvcm1hdGlvbiB3aXRoIGl0cyBlbmNsb3NpbmcKICAgIC8vIG1ldGhvZCwgbGlrZSBmb3IgZXhhbXBsZSB0aGUgdHlwZXMgb2YgbG9jYWwgdmFyaWFibGVzLgogICAgTG9jYWxTdGF0ZSBjbG9zdXJlU3RhdGUgPSBuZXcgTG9jYWxTdGF0ZS5jbG9zdXJlKF9zdGF0ZSk7CiAgICBLZXJuZWxUeXBlR3JhcGhCdWlsZGVyIHZpc2l0b3IgPSBuZXcgS2VybmVsVHlwZUdyYXBoQnVpbGRlcigKICAgICAgICBfb3B0aW9ucywKICAgICAgICBfY2xvc2VkV29ybGQsCiAgICAgICAgX2luZmVycmVyLAogICAgICAgIGluZm8uY2FsbE1ldGhvZCwKICAgICAgICBmdW5jdGlvbk5vZGUsCiAgICAgICAgX2xvY2Fsc01hcCwKICAgICAgICBfc3RhdGljVHlwZVByb3ZpZGVyLAogICAgICAgIGNsb3N1cmVTdGF0ZSwKICAgICAgICBfY2FwdHVyZWRBbmRCb3hlZCk7CiAgICB2aXNpdG9yLnJ1bigpOwogICAgX2luZmVycmVyLnJlY29yZFJldHVyblR5cGUoaW5mby5jYWxsTWV0aG9kLCB2aXNpdG9yLl9yZXR1cm5UeXBlKTsKCiAgICByZXR1cm4gbG9jYWxGdW5jdGlvblR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKGlyLkZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgewogICAgcmV0dXJuIGhhbmRsZUxvY2FsRnVuY3Rpb24obm9kZSwgbm9kZS5mdW5jdGlvbiwgbm9kZS52YXJpYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oaXIuRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBoYW5kbGVMb2NhbEZ1bmN0aW9uKG5vZGUsIG5vZGUuZnVuY3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRXaGlsZVN0YXRlbWVudChpci5XaGlsZVN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gaGFuZGxlTG9vcChub2RlLCBfbG9jYWxzTWFwLmdldEp1bXBUYXJnZXRGb3JXaGlsZShub2RlKSwgKCkgewogICAgICBoYW5kbGVDb25kaXRpb24obm9kZS5jb25kaXRpb24pOwogICAgICBfc3RhdGUgPSBuZXcgTG9jYWxTdGF0ZS5jaGlsZFBhdGgoX3N0YXRlQWZ0ZXJXaGVuVHJ1ZSk7CiAgICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RG9TdGF0ZW1lbnQoaXIuRG9TdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIGhhbmRsZUxvb3Aobm9kZSwgX2xvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yRG8obm9kZSksICgpIHsKICAgICAgdmlzaXQobm9kZS5ib2R5KTsKICAgICAgaGFuZGxlQ29uZGl0aW9uKG5vZGUuY29uZGl0aW9uKTsKICAgICAgLy8gVE9ETygyOTMwOSk6IFRoaXMgY29uZGl0aW9uIGFwcGVhcnMgdG8gc3RyZW5ndGhlbiBib3RoIHRoZSBiYWNrLWVkZ2UKICAgICAgLy8gYW5kIGV4aXQtZWRnZS4gRm9yIG5vdywgYXZvaWQgc3RyZW5ndGhlbmluZyBvbiB0aGUgY29uZGl0aW9uIHVudGlsIHRoZQogICAgICAvLyBwcm9wZXIgZml4IGlzIGZvdW5kLgogICAgICAvLwogICAgICAvLyAgICAgX3N0YXRlID0gbmV3IExvY2FsU3RhdGUuY2hpbGRQYXRoKF9zdGF0ZUFmdGVyV2hlblRydWUsIG5vZGUuYm9keSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Rm9yU3RhdGVtZW50KGlyLkZvclN0YXRlbWVudCBub2RlKSB7CiAgICBmb3IgKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgaW4gbm9kZS52YXJpYWJsZXMpIHsKICAgICAgdmlzaXQodmFyaWFibGUpOwogICAgfQogICAgcmV0dXJuIGhhbmRsZUxvb3Aobm9kZSwgX2xvY2Fsc01hcC5nZXRKdW1wVGFyZ2V0Rm9yRm9yKG5vZGUpLCAoKSB7CiAgICAgIGhhbmRsZUNvbmRpdGlvbihub2RlLmNvbmRpdGlvbik7CiAgICAgIF9zdGF0ZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChfc3RhdGVBZnRlcldoZW5UcnVlKTsKICAgICAgdmlzaXQobm9kZS5ib2R5KTsKICAgICAgZm9yIChpci5FeHByZXNzaW9uIHVwZGF0ZSBpbiBub2RlLnVwZGF0ZXMpIHsKICAgICAgICB2aXNpdCh1cGRhdGUpOwogICAgICB9CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHJ5Q2F0Y2goaXIuVHJ5Q2F0Y2ggbm9kZSkgewogICAgTG9jYWxTdGF0ZSBzdGF0ZUJlZm9yZSA9IF9zdGF0ZTsKICAgIF9zdGF0ZSA9IG5ldyBMb2NhbFN0YXRlLnRyeUJsb2NrKHN0YXRlQmVmb3JlLCBub2RlKTsKICAgIF9zdGF0ZS5tYXJrSW5pdGlhbGl6YXRpb25Bc0luZGVmaW5pdGUoKTsKICAgIHZpc2l0KG5vZGUuYm9keSk7CiAgICBMb2NhbFN0YXRlIHN0YXRlQWZ0ZXJCb2R5ID0gX3N0YXRlOwogICAgX3N0YXRlID0gc3RhdGVCZWZvcmUubWVyZ2VGbG93KF9pbmZlcnJlciwgc3RhdGVBZnRlckJvZHkpOwogICAgZm9yIChpci5DYXRjaCBjYXRjaEJsb2NrIGluIG5vZGUuY2F0Y2hlcykgewogICAgICBMb2NhbFN0YXRlIHN0YXRlQmVmb3JlQ2F0Y2ggPSBfc3RhdGU7CiAgICAgIF9zdGF0ZSA9IG5ldyBMb2NhbFN0YXRlLmNoaWxkUGF0aChzdGF0ZUJlZm9yZUNhdGNoKTsKICAgICAgdmlzaXQoY2F0Y2hCbG9jayk7CiAgICAgIExvY2FsU3RhdGUgc3RhdGVBZnRlckNhdGNoID0gX3N0YXRlOwogICAgICBfc3RhdGUgPSBzdGF0ZUJlZm9yZUNhdGNoLm1lcmdlRmxvdyhfaW5mZXJyZXIsIHN0YXRlQWZ0ZXJDYXRjaCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHJ5RmluYWxseShpci5UcnlGaW5hbGx5IG5vZGUpIHsKICAgIExvY2FsU3RhdGUgc3RhdGVCZWZvcmUgPSBfc3RhdGU7CiAgICBfc3RhdGUgPSBuZXcgTG9jYWxTdGF0ZS50cnlCbG9jayhzdGF0ZUJlZm9yZSwgbm9kZSk7CiAgICBfc3RhdGUubWFya0luaXRpYWxpemF0aW9uQXNJbmRlZmluaXRlKCk7CiAgICB2aXNpdChub2RlLmJvZHkpOwogICAgTG9jYWxTdGF0ZSBzdGF0ZUFmdGVyQm9keSA9IF9zdGF0ZTsKICAgIF9zdGF0ZSA9IHN0YXRlQmVmb3JlLm1lcmdlRmxvdyhfaW5mZXJyZXIsIHN0YXRlQWZ0ZXJCb2R5KTsKICAgIHZpc2l0KG5vZGUuZmluYWxpemVyKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDYXRjaChpci5DYXRjaCBub2RlKSB7CiAgICBpci5WYXJpYWJsZURlY2xhcmF0aW9uIGV4Y2VwdGlvbiA9IG5vZGUuZXhjZXB0aW9uOwogICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBtYXNrOwogICAgICBEYXJ0VHlwZSB0eXBlID0gbm9kZS5ndWFyZCAhPSBudWxsCiAgICAgICAgICA/IF9lbGVtZW50TWFwLmdldERhcnRUeXBlKG5vZGUuZ3VhcmQpCiAgICAgICAgICA6IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlVHlwZSkgewogICAgICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IHR5cGU7CiAgICAgICAgbWFzayA9IF90eXBlcy5ub25OdWxsU3VidHlwZShpbnRlcmZhY2VUeXBlLmVsZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIG1hc2sgPSBfdHlwZXMuZHluYW1pY1R5cGU7CiAgICAgIH0KICAgICAgTG9jYWwgbG9jYWwgPSBfbG9jYWxzTWFwLmdldExvY2FsVmFyaWFibGUoZXhjZXB0aW9uKTsKICAgICAgX3N0YXRlLnVwZGF0ZUxvY2FsKAogICAgICAgICAgX2luZmVycmVyLCBfY2FwdHVyZWRBbmRCb3hlZCwgbG9jYWwsIG1hc2ssIG5vZGUsIGNvbnN0IER5bmFtaWNUeXBlKCksCiAgICAgICAgICBpc051bGxhYmxlOiBmYWxzZSAvKiBgdGhyb3cgbnVsbGAgcHJvZHVjZXMgYSBOdWxsVGhyb3duRXJyb3IgKi8pOwogICAgfQogICAgaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBzdGFja1RyYWNlID0gbm9kZS5zdGFja1RyYWNlOwogICAgaWYgKHN0YWNrVHJhY2UgIT0gbnVsbCkgewogICAgICBMb2NhbCBsb2NhbCA9IF9sb2NhbHNNYXAuZ2V0TG9jYWxWYXJpYWJsZShzdGFja1RyYWNlKTsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIGEgbWFzayBiYXNlZCBvbiBbU3RhY2tUcmFjZV0uCiAgICAgIC8vIE5vdGU6IHN0YWNrIHRyYWNlIG1heSBiZSBudWxsIGlmIHVzZXJzIG9taXQgYSBzdGFjayBpbgogICAgICAvLyBgY29tcGxldGVyLmNvbXBsZXRlRXJyb3JgLgogICAgICBfc3RhdGUudXBkYXRlTG9jYWwoX2luZmVycmVyLCBfY2FwdHVyZWRBbmRCb3hlZCwgbG9jYWwsCiAgICAgICAgICBfdHlwZXMuZHluYW1pY1R5cGUsIG5vZGUsIGNvbnN0IER5bmFtaWNUeXBlKCkpOwogICAgfQogICAgdmlzaXQobm9kZS5ib2R5KTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0VGhyb3coaXIuVGhyb3cgbm9kZSkgewogICAgdmlzaXQobm9kZS5leHByZXNzaW9uKTsKICAgIF9zdGF0ZS5zZWVuUmV0dXJuT3JUaHJvdyA9IHRydWU7CiAgICByZXR1cm4gX3R5cGVzLm5vbk51bGxFbXB0eSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0UmV0aHJvdyhpci5SZXRocm93IG5vZGUpIHsKICAgIF9zdGF0ZS5zZWVuUmV0dXJuT3JUaHJvdyA9IHRydWU7CiAgICByZXR1cm4gX3R5cGVzLm5vbk51bGxFbXB0eSgpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGhhbmRsZVN1cGVyTm9TdWNoTWV0aG9kKGlyLk5vZGUgbm9kZSwgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIEFic3RyYWN0VmFsdWUgbWFzaywgQXJndW1lbnRzVHlwZXMgYXJndW1lbnRzKSB7CiAgICAvLyBFbnN1cmUgd2UgY3JlYXRlIGEgbm9kZSwgdG8gbWFrZSBleHBsaWNpdCB0aGUgY2FsbCB0byB0aGUKICAgIC8vIGBub1N1Y2hNZXRob2RgIGhhbmRsZXIuCiAgICBGdW5jdGlvbkVudGl0eSBub1N1Y2hNZXRob2QgPQogICAgICAgIF9lbGVtZW50TWFwLmdldFN1cGVyTm9TdWNoTWV0aG9kKF9hbmFseXplZE1lbWJlci5lbmNsb3NpbmdDbGFzcyk7CiAgICByZXR1cm4gaGFuZGxlU3RhdGljSW52b2tlKG5vZGUsIHNlbGVjdG9yLCBtYXNrLCBub1N1Y2hNZXRob2QsIGFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRTdXBlclByb3BlcnR5R2V0KGlyLlN1cGVyUHJvcGVydHlHZXQgbm9kZSkgewogICAgLy8gVE9ETyhoZXJodXQpOiBXZSBjb3VsZCBkbyBiZXR0ZXIgaGVyZSBpZiB3ZSBrbmV3IHdoYXQgd2UKICAgIC8vIGFyZSBjYWxsaW5nIGRvZXMgbm90IGV4cG9zZSB0aGlzLgogICAgX3N0YXRlLm1hcmtUaGlzQXNFeHBvc2VkKCk7CgogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9CiAgICAgICAgX2VsZW1lbnRNYXAuZ2V0U3VwZXJNZW1iZXIoX2FuYWx5emVkTWVtYmVyLCBub2RlLm5hbWUpOwogICAgYXNzZXJ0KG1lbWJlciAhPSBudWxsLCAiTm8gbWVtYmVyIGZvdW5kIGZvciBzdXBlciBwcm9wZXJ0eSBnZXQ6ICRub2RlIik7CiAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPSBfbWVtYmVyRGF0YS50eXBlT2ZTZW5kKG5vZGUpOwogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3IuZ2V0dGVyKF9lbGVtZW50TWFwLmdldE5hbWUobm9kZS5uYW1lKSk7CiAgICBUeXBlSW5mb3JtYXRpb24gdHlwZSA9CiAgICAgICAgaGFuZGxlU3RhdGljSW52b2tlKG5vZGUsIHNlbGVjdG9yLCBtYXNrLCBtZW1iZXIsIG51bGwpOwogICAgaWYgKG1lbWJlci5pc0dldHRlcikgewogICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0KICAgICAgICAgIF9lbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUobWVtYmVyKTsKICAgICAgaWYgKGZ1bmN0aW9uVHlwZS5yZXR1cm5UeXBlLmNvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMpIHsKICAgICAgICAvLyBUaGUgcmVzdWx0IHR5cGUgdmFyaWVzIHdpdGggdGhlIGNhbGwgc2l0ZSBzbyB3ZSBuYXJyb3cgdGhlIHN0YXRpYwogICAgICAgIC8vIHJlc3VsdCB0eXBlLgogICAgICAgIHR5cGUgPSBfdHlwZXMubmFycm93VHlwZSh0eXBlLCBfZ2V0U3RhdGljVHlwZShub2RlKSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzRmllbGQpIHsKICAgICAgRGFydFR5cGUgZmllbGRUeXBlID0gX2VsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldEZpZWxkVHlwZShtZW1iZXIpOwogICAgICBpZiAoZmllbGRUeXBlLmNvbnRhaW5zRnJlZVR5cGVWYXJpYWJsZXMpIHsKICAgICAgICAvLyBUaGUgcmVzdWx0IHR5cGUgdmFyaWVzIHdpdGggdGhlIGNhbGwgc2l0ZSBzbyB3ZSBuYXJyb3cgdGhlIHN0YXRpYwogICAgICAgIC8vIHJlc3VsdCB0eXBlLgogICAgICAgIHR5cGUgPSBfdHlwZXMubmFycm93VHlwZSh0eXBlLCBfZ2V0U3RhdGljVHlwZShub2RlKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0eXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0U3VwZXJQcm9wZXJ0eVNldChpci5TdXBlclByb3BlcnR5U2V0IG5vZGUpIHsKICAgIC8vIFRPRE8oaGVyaHV0KTogV2UgY291bGQgZG8gYmV0dGVyIGhlcmUgaWYgd2Uga25ldyB3aGF0IHdlCiAgICAvLyBhcmUgY2FsbGluZyBkb2VzIG5vdCBleHBvc2UgdGhpcy4KICAgIF9zdGF0ZS5tYXJrVGhpc0FzRXhwb3NlZCgpOwoKICAgIFR5cGVJbmZvcm1hdGlvbiByaHNUeXBlID0gdmlzaXQobm9kZS52YWx1ZSk7CiAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0KICAgICAgICBfZWxlbWVudE1hcC5nZXRTdXBlck1lbWJlcihfYW5hbHl6ZWRNZW1iZXIsIG5vZGUubmFtZSwgc2V0dGVyOiB0cnVlKTsKICAgIGFzc2VydChtZW1iZXIgIT0gbnVsbCwgIk5vIG1lbWJlciBmb3VuZCBmb3Igc3VwZXIgcHJvcGVydHkgc2V0OiAkbm9kZSIpOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX21lbWJlckRhdGEudHlwZU9mU2VuZChub2RlKTsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yLnNldHRlcihfZWxlbWVudE1hcC5nZXROYW1lKG5vZGUubmFtZSkpOwogICAgQXJndW1lbnRzVHlwZXMgYXJndW1lbnRzID0gbmV3IEFyZ3VtZW50c1R5cGVzKFtyaHNUeXBlXSwgbnVsbCk7CiAgICBoYW5kbGVTdGF0aWNJbnZva2Uobm9kZSwgc2VsZWN0b3IsIG1hc2ssIG1lbWJlciwgYXJndW1lbnRzKTsKICAgIHJldHVybiByaHNUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKGlyLlN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICAvLyBUT0RPKGhlcmh1dCk6IFdlIGNvdWxkIGRvIGJldHRlciBoZXJlIGlmIHdlIGtuZXcgd2hhdCB3ZQogICAgLy8gYXJlIGNhbGxpbmcgZG9lcyBub3QgZXhwb3NlIHRoaXMuCiAgICBfc3RhdGUubWFya1RoaXNBc0V4cG9zZWQoKTsKCiAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0KICAgICAgICBfZWxlbWVudE1hcC5nZXRTdXBlck1lbWJlcihfYW5hbHl6ZWRNZW1iZXIsIG5vZGUubmFtZSk7CiAgICBBcmd1bWVudHNUeXBlcyBhcmd1bWVudHMgPSBhbmFseXplQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gX2VsZW1lbnRNYXAuZ2V0U2VsZWN0b3Iobm9kZSk7CiAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPSBfbWVtYmVyRGF0YS50eXBlT2ZTZW5kKG5vZGUpOwogICAgaWYgKG1lbWJlciA9PSBudWxsKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeS4KICAgICAgcmV0dXJuIGhhbmRsZVN1cGVyTm9TdWNoTWV0aG9kKG5vZGUsIHNlbGVjdG9yLCBtYXNrLCBhcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KG1lbWJlci5pc0Z1bmN0aW9uLCAiVW5leHBlY3RlZCBzdXBlciBpbnZvY2F0aW9uIHRhcmdldDogJG1lbWJlciIpOwogICAgICBpZiAoaXNJbmNvbXBhdGlibGVJbnZva2UobWVtYmVyLCBhcmd1bWVudHMpKSB7CiAgICAgICAgcmV0dXJuIGhhbmRsZVN1cGVyTm9TdWNoTWV0aG9kKG5vZGUsIHNlbGVjdG9yLCBtYXNrLCBhcmd1bWVudHMpOwogICAgICB9IGVsc2UgewogICAgICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlID0KICAgICAgICAgICAgaGFuZGxlU3RhdGljSW52b2tlKG5vZGUsIHNlbGVjdG9yLCBtYXNrLCBtZW1iZXIsIGFyZ3VtZW50cyk7CiAgICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSA9CiAgICAgICAgICAgIF9lbGVtZW50TWFwLmVsZW1lbnRFbnZpcm9ubWVudC5nZXRGdW5jdGlvblR5cGUobWVtYmVyKTsKICAgICAgICBpZiAoZnVuY3Rpb25UeXBlLnJldHVyblR5cGUuY29udGFpbnNGcmVlVHlwZVZhcmlhYmxlcykgewogICAgICAgICAgLy8gVGhlIHJldHVybiB0eXBlIHZhcmllcyB3aXRoIHRoZSBjYWxsIHNpdGUgc28gd2UgbmFycm93IHRoZSBzdGF0aWMKICAgICAgICAgIC8vIHJldHVybiB0eXBlLgogICAgICAgICAgdHlwZSA9IF90eXBlcy5uYXJyb3dUeXBlKHR5cGUsIF9nZXRTdGF0aWNUeXBlKG5vZGUpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdEFzRXhwcmVzc2lvbihpci5Bc0V4cHJlc3Npb24gbm9kZSkgewogICAgVHlwZUluZm9ybWF0aW9uIG9wZXJhbmRUeXBlID0gdmlzaXQobm9kZS5vcGVyYW5kKTsKICAgIHJldHVybiBfdHlwZXMubmFycm93VHlwZShvcGVyYW5kVHlwZSwgX2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS50eXBlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRBd2FpdEV4cHJlc3Npb24oaXIuQXdhaXRFeHByZXNzaW9uIG5vZGUpIHsKICAgIFR5cGVJbmZvcm1hdGlvbiBmdXR1cmVUeXBlID0gdmlzaXQobm9kZS5vcGVyYW5kKTsKICAgIHJldHVybiBfaW5mZXJyZXIucmVnaXN0ZXJBd2FpdChub2RlLCBmdXR1cmVUeXBlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFlpZWxkU3RhdGVtZW50KGlyLllpZWxkU3RhdGVtZW50IG5vZGUpIHsKICAgIFR5cGVJbmZvcm1hdGlvbiBvcGVyYW5kVHlwZSA9IHZpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICByZXR1cm4gX2luZmVycmVyLnJlZ2lzdGVyWWllbGQobm9kZSwgb3BlcmFuZFR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0Q2hlY2tMaWJyYXJ5SXNMb2FkZWQoaXIuQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgbm9kZSkgewogICAgcmV0dXJuIF90eXBlcy5ub25OdWxsRW1wdHkoKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdEludmFsaWRFeHByZXNzaW9uKGlyLkludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1heWJlIHRoaXMgc2hvdWxkIGJlIFtlbXB0eV0gaW5zdGVhZD8KICAgIHJldHVybiBfdHlwZXMuZHluYW1pY1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRDb25zdGFudEV4cHJlc3Npb24oaXIuQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgVHlwZUluZm9ybWF0aW9uQ29uc3RhbnRWaXNpdG9yKHRoaXMsIG5vZGUpCiAgICAgICAgLnZpc2l0Q29uc3RhbnQobm9kZS5jb25zdGFudCk7CiAgfQp9CgpjbGFzcyBUeXBlSW5mb3JtYXRpb25Db25zdGFudFZpc2l0b3IKICAgIGV4dGVuZHMgaXIuQ29tcHV0ZU9uY2VDb25zdGFudFZpc2l0b3I8VHlwZUluZm9ybWF0aW9uPiB7CiAgZmluYWwgS2VybmVsVHlwZUdyYXBoQnVpbGRlciBidWlsZGVyOwogIGZpbmFsIGlyLkNvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uOwoKICBUeXBlSW5mb3JtYXRpb25Db25zdGFudFZpc2l0b3IodGhpcy5idWlsZGVyLCB0aGlzLmV4cHJlc3Npb24pOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gZGVmYXVsdENvbnN0YW50KGlyLkNvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmV4cGVjdGVkIGNvbnN0YW50OiAiCiAgICAgICAgIiR7bm9kZX0gKCR7bm9kZS5ydW50aW1lVHlwZX0pIik7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXROdWxsQ29uc3RhbnQoaXIuTnVsbENvbnN0YW50IG5vZGUpIHsKICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZU51bGxUeXBlSW5mb3JtYXRpb24oKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdEJvb2xDb25zdGFudChpci5Cb29sQ29uc3RhbnQgbm9kZSkgewogICAgcmV0dXJuIGJ1aWxkZXIuY3JlYXRlQm9vbFR5cGVJbmZvcm1hdGlvbihub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdEludENvbnN0YW50KGlyLkludENvbnN0YW50IG5vZGUpIHsKICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZUludFR5cGVJbmZvcm1hdGlvbihub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdERvdWJsZUNvbnN0YW50KGlyLkRvdWJsZUNvbnN0YW50IG5vZGUpIHsKICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZURvdWJsZVR5cGVJbmZvcm1hdGlvbihub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFN0cmluZ0NvbnN0YW50KGlyLlN0cmluZ0NvbnN0YW50IG5vZGUpIHsKICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZVN0cmluZ1R5cGVJbmZvcm1hdGlvbihub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFN5bWJvbENvbnN0YW50KGlyLlN5bWJvbENvbnN0YW50IG5vZGUpIHsKICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZVN5bWJvbExpdGVyYWxUeXBlSW5mb3JtYXRpb24oKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdE1hcENvbnN0YW50KGlyLk1hcENvbnN0YW50IG5vZGUpIHsKICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZU1hcFR5cGVJbmZvcm1hdGlvbigKICAgICAgICBuZXcgQ29uc3RhbnRSZWZlcmVuY2UoZXhwcmVzc2lvbiwgbm9kZSksCiAgICAgICAgbm9kZS5lbnRyaWVzCiAgICAgICAgICAgIC5tYXAoKGUpID0+IG5ldyBQYWlyKHZpc2l0Q29uc3RhbnQoZS5rZXkpLCB2aXNpdENvbnN0YW50KGUudmFsdWUpKSksCiAgICAgICAgaXNDb25zdDogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRMaXN0Q29uc3RhbnQoaXIuTGlzdENvbnN0YW50IG5vZGUpIHsKICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZUxpc3RUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgbmV3IENvbnN0YW50UmVmZXJlbmNlKGV4cHJlc3Npb24sIG5vZGUpLAogICAgICAgIG5vZGUuZW50cmllcy5tYXAoKGUpID0+IHZpc2l0Q29uc3RhbnQoZSkpLAogICAgICAgIGlzQ29uc3Q6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0U2V0Q29uc3RhbnQoaXIuU2V0Q29uc3RhbnQgbm9kZSkgewogICAgcmV0dXJuIGJ1aWxkZXIuY3JlYXRlU2V0VHlwZUluZm9ybWF0aW9uKAogICAgICAgIG5ldyBDb25zdGFudFJlZmVyZW5jZShleHByZXNzaW9uLCBub2RlKSwKICAgICAgICBub2RlLmVudHJpZXMubWFwKChlKSA9PiB2aXNpdENvbnN0YW50KGUpKSwKICAgICAgICBpc0NvbnN0OiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdEluc3RhbmNlQ29uc3RhbnQoaXIuSW5zdGFuY2VDb25zdGFudCBub2RlKSB7CiAgICBub2RlLmZpZWxkVmFsdWVzLmZvckVhY2goKGlyLlJlZmVyZW5jZSByZWZlcmVuY2UsIGlyLkNvbnN0YW50IHZhbHVlKSB7CiAgICAgIGJ1aWxkZXIuX2luZmVycmVyLnJlY29yZFR5cGVPZkZpZWxkKAogICAgICAgICAgYnVpbGRlci5fZWxlbWVudE1hcC5nZXRGaWVsZChyZWZlcmVuY2UuYXNGaWVsZCksCiAgICAgICAgICB2aXNpdENvbnN0YW50KHZhbHVlKSk7CiAgICB9KTsKICAgIHJldHVybiBidWlsZGVyLl90eXBlcy5nZXRDb25jcmV0ZVR5cGVGb3IoYnVpbGRlcgogICAgICAgIC5fY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgIC5jcmVhdGVOb25OdWxsRXhhY3QoYnVpbGRlci5fZWxlbWVudE1hcC5nZXRDbGFzcyhub2RlLmNsYXNzTm9kZSkpKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVJbmZvcm1hdGlvbiB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoCiAgICAgIGlyLlBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQgbm9kZSkgewogICAgcmV0dXJuIGJ1aWxkZXIuY3JlYXRlSW5zdGFudGlhdGlvblR5cGVJbmZvcm1hdGlvbigKICAgICAgICB2aXNpdENvbnN0YW50KG5vZGUudGVhck9mZkNvbnN0YW50KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRUZWFyT2ZmQ29uc3RhbnQoaXIuVGVhck9mZkNvbnN0YW50IG5vZGUpIHsKICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZVN0YXRpY0dldFR5cGVJbmZvcm1hdGlvbihub2RlLCBub2RlLnByb2NlZHVyZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlSW5mb3JtYXRpb24gdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KGlyLlR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgewogICAgcmV0dXJuIGJ1aWxkZXIuY3JlYXRlVHlwZUxpdGVyYWxJbmZvcm1hdGlvbigpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudChpci5VbmV2YWx1YXRlZENvbnN0YW50IG5vZGUpIHsKICAgIGFzc2VydChmYWxzZSwgIlVuZXhwZWN0ZWQgdW5ldmFsdWF0ZWQgY29uc3RhbnQ6ICRub2RlIik7CiAgICByZXR1cm4gYnVpbGRlci5fdHlwZXMuZHluYW1pY1R5cGU7CiAgfQp9CgpjbGFzcyBSZWZpbmVtZW50IHsKICBmaW5hbCBTZWxlY3RvciBzZWxlY3RvcjsKICBmaW5hbCBBYnN0cmFjdFZhbHVlIG1hc2s7CgogIFJlZmluZW1lbnQodGhpcy5zZWxlY3RvciwgdGhpcy5tYXNrKTsKfQoKY2xhc3MgTG9jYWxTdGF0ZSB7CiAgZmluYWwgTG9jYWxzSGFuZGxlciBfbG9jYWxzOwogIGZpbmFsIEZpZWxkSW5pdGlhbGl6YXRpb25TY29wZSBfZmllbGRzOwogIGJvb2wgc2VlblJldHVybk9yVGhyb3cgPSBmYWxzZTsKICBib29sIHNlZW5CcmVha09yQ29udGludWUgPSBmYWxzZTsKICBMb2NhbHNIYW5kbGVyIF90cnlCbG9jazsKCiAgTG9jYWxTdGF0ZS5pbml0aWFsKHtib29sIGluR2VuZXJhdGl2ZUNvbnN0cnVjdG9yfSkKICAgICAgOiB0aGlzLmludGVybmFsKAogICAgICAgICAgICBuZXcgTG9jYWxzSGFuZGxlcigpLAogICAgICAgICAgICBpbkdlbmVyYXRpdmVDb25zdHJ1Y3RvciA/IG5ldyBGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUoKSA6IG51bGwsCiAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgIHNlZW5SZXR1cm5PclRocm93OiBmYWxzZSwKICAgICAgICAgICAgc2VlbkJyZWFrT3JDb250aW51ZTogZmFsc2UpOwoKICBMb2NhbFN0YXRlLmNoaWxkUGF0aChMb2NhbFN0YXRlIG90aGVyKQogICAgICA6IHRoaXMuaW50ZXJuYWwobmV3IExvY2Fsc0hhbmRsZXIuZnJvbShvdGhlci5fbG9jYWxzKSwKICAgICAgICAgICAgbmV3IEZpZWxkSW5pdGlhbGl6YXRpb25TY29wZS5mcm9tKG90aGVyLl9maWVsZHMpLCBvdGhlci5fdHJ5QmxvY2ssCiAgICAgICAgICAgIHNlZW5SZXR1cm5PclRocm93OiBmYWxzZSwgc2VlbkJyZWFrT3JDb250aW51ZTogZmFsc2UpOwoKICBMb2NhbFN0YXRlLmNsb3N1cmUoTG9jYWxTdGF0ZSBvdGhlcikKICAgICAgOiB0aGlzLmludGVybmFsKG5ldyBMb2NhbHNIYW5kbGVyLmZyb20ob3RoZXIuX2xvY2FscyksCiAgICAgICAgICAgIG5ldyBGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUuZnJvbShvdGhlci5fZmllbGRzKSwgbnVsbCwKICAgICAgICAgICAgc2VlblJldHVybk9yVGhyb3c6IGZhbHNlLCBzZWVuQnJlYWtPckNvbnRpbnVlOiBmYWxzZSk7CgogIGZhY3RvcnkgTG9jYWxTdGF0ZS50cnlCbG9jayhMb2NhbFN0YXRlIG90aGVyLCBpci5UcmVlTm9kZSBub2RlKSB7CiAgICBMb2NhbHNIYW5kbGVyIGxvY2FscyA9IG5ldyBMb2NhbHNIYW5kbGVyLnRyeUJsb2NrKG90aGVyLl9sb2NhbHMsIG5vZGUpOwogICAgRmllbGRJbml0aWFsaXphdGlvblNjb3BlIGZpZWxkU2NvcGUgPQogICAgICAgIG5ldyBGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUuZnJvbShvdGhlci5fZmllbGRzKTsKICAgIExvY2Fsc0hhbmRsZXIgdHJ5QmxvY2sgPSBsb2NhbHM7CiAgICByZXR1cm4gbmV3IExvY2FsU3RhdGUuaW50ZXJuYWwobG9jYWxzLCBmaWVsZFNjb3BlLCB0cnlCbG9jaywKICAgICAgICBzZWVuUmV0dXJuT3JUaHJvdzogZmFsc2UsIHNlZW5CcmVha09yQ29udGludWU6IGZhbHNlKTsKICB9CgogIExvY2FsU3RhdGUuZGVlcENvcHlPZihMb2NhbFN0YXRlIG90aGVyKQogICAgICA6IF9sb2NhbHMgPSBuZXcgTG9jYWxzSGFuZGxlci5kZWVwQ29weU9mKG90aGVyLl9sb2NhbHMpLAogICAgICAgIF90cnlCbG9jayA9IG90aGVyLl90cnlCbG9jaywKICAgICAgICBfZmllbGRzID0gb3RoZXIuX2ZpZWxkczsKCiAgTG9jYWxTdGF0ZS5pbnRlcm5hbCh0aGlzLl9sb2NhbHMsIHRoaXMuX2ZpZWxkcywgdGhpcy5fdHJ5QmxvY2ssCiAgICAgIHt0aGlzLnNlZW5SZXR1cm5PclRocm93LCB0aGlzLnNlZW5CcmVha09yQ29udGludWV9KTsKCiAgYm9vbCBnZXQgYWJvcnRzIHsKICAgIHJldHVybiBzZWVuUmV0dXJuT3JUaHJvdyB8fCBzZWVuQnJlYWtPckNvbnRpbnVlOwogIH0KCiAgYm9vbCBnZXQgaXNUaGlzRXhwb3NlZCB7CiAgICByZXR1cm4gX2ZpZWxkcyA9PSBudWxsIHx8IF9maWVsZHMuaXNUaGlzRXhwb3NlZDsKICB9CgogIHZvaWQgbWFya1RoaXNBc0V4cG9zZWQoKSB7CiAgICBfZmllbGRzPy5pc1RoaXNFeHBvc2VkID0gdHJ1ZTsKICB9CgogIHZvaWQgbWFya0luaXRpYWxpemF0aW9uQXNJbmRlZmluaXRlKCkgewogICAgX2ZpZWxkcz8uaXNJbmRlZmluaXRlID0gdHJ1ZTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiByZWFkRmllbGQoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgIHJldHVybiBfZmllbGRzLnJlYWRGaWVsZChmaWVsZCk7CiAgfQoKICB2b2lkIHVwZGF0ZUZpZWxkKEZpZWxkRW50aXR5IGZpZWxkLCBUeXBlSW5mb3JtYXRpb24gdHlwZSkgewogICAgX2ZpZWxkcy51cGRhdGVGaWVsZChmaWVsZCwgdHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gcmVhZExvY2FsKEluZmVycmVyRW5naW5lIGluZmVycmVyLAogICAgICBNYXA8TG9jYWwsIEZpZWxkRW50aXR5PiBjYXB0dXJlZEFuZEJveGVkLCBMb2NhbCBsb2NhbCkgewogICAgRmllbGRFbnRpdHkgZmllbGQgPSBjYXB0dXJlZEFuZEJveGVkW2xvY2FsXTsKICAgIGlmIChmaWVsZCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBpbmZlcnJlci50eXBlT2ZNZW1iZXIoZmllbGQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9sb2NhbHMudXNlKGluZmVycmVyLCBsb2NhbCk7CiAgICB9CiAgfQoKICB2b2lkIHVwZGF0ZUxvY2FsKAogICAgICBJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwKICAgICAgTWFwPExvY2FsLCBGaWVsZEVudGl0eT4gY2FwdHVyZWRBbmRCb3hlZCwKICAgICAgTG9jYWwgbG9jYWwsCiAgICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlLAogICAgICBpci5Ob2RlIG5vZGUsCiAgICAgIERhcnRUeXBlIHN0YXRpY1R5cGUsCiAgICAgIHtpc051bGxhYmxlOiB0cnVlfSkgewogICAgYXNzZXJ0KHR5cGUgIT0gbnVsbCk7CiAgICB0eXBlID0gaW5mZXJyZXIudHlwZXMubmFycm93VHlwZSh0eXBlLCBzdGF0aWNUeXBlLCBpc051bGxhYmxlOiBpc051bGxhYmxlKTsKCiAgICBGaWVsZEVudGl0eSBmaWVsZCA9IGNhcHR1cmVkQW5kQm94ZWRbbG9jYWxdOwogICAgaWYgKGZpZWxkICE9IG51bGwpIHsKICAgICAgaW5mZXJyZXIucmVjb3JkVHlwZU9mRmllbGQoZmllbGQsIHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgX2xvY2Fscy51cGRhdGUoaW5mZXJyZXIsIGxvY2FsLCB0eXBlLCBub2RlLCBzdGF0aWNUeXBlLCBfdHJ5QmxvY2spOwogICAgfQogIH0KCiAgdm9pZCBuYXJyb3dMb2NhbCgKICAgICAgSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIsCiAgICAgIE1hcDxMb2NhbCwgRmllbGRFbnRpdHk+IGNhcHR1cmVkQW5kQm94ZWQsCiAgICAgIExvY2FsIGxvY2FsLAogICAgICBEYXJ0VHlwZSB0eXBlLAogICAgICBpci5Ob2RlIG5vZGUpIHsKICAgIFR5cGVJbmZvcm1hdGlvbiBjdXJyZW50VHlwZSA9IHJlYWRMb2NhbChpbmZlcnJlciwgY2FwdHVyZWRBbmRCb3hlZCwgbG9jYWwpOwogICAgdXBkYXRlTG9jYWwoaW5mZXJyZXIsIGNhcHR1cmVkQW5kQm94ZWQsIGxvY2FsLCBjdXJyZW50VHlwZSwgbm9kZSwgdHlwZSwKICAgICAgICBpc051bGxhYmxlOiBmYWxzZSk7CiAgfQoKICBMb2NhbFN0YXRlIG1lcmdlRmxvdyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwgTG9jYWxTdGF0ZSBvdGhlcikgewogICAgc2VlblJldHVybk9yVGhyb3cgPSBmYWxzZTsKICAgIHNlZW5CcmVha09yQ29udGludWUgPSBmYWxzZTsKCiAgICBpZiAob3RoZXIuYWJvcnRzKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgTG9jYWxzSGFuZGxlciBsb2NhbHMgPSBfbG9jYWxzLm1lcmdlRmxvdyhpbmZlcnJlciwgb3RoZXIuX2xvY2Fscyk7CiAgICByZXR1cm4gbmV3IExvY2FsU3RhdGUuaW50ZXJuYWwobG9jYWxzLCBfZmllbGRzLCBfdHJ5QmxvY2ssCiAgICAgICAgc2VlblJldHVybk9yVGhyb3c6IHNlZW5SZXR1cm5PclRocm93LAogICAgICAgIHNlZW5CcmVha09yQ29udGludWU6IHNlZW5CcmVha09yQ29udGludWUpOwogIH0KCiAgTG9jYWxTdGF0ZSBtZXJnZURpYW1vbmRGbG93KAogICAgICBJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwgTG9jYWxTdGF0ZSB0aGVuQnJhbmNoLCBMb2NhbFN0YXRlIGVsc2VCcmFuY2gpIHsKICAgIHNlZW5SZXR1cm5PclRocm93ID0KICAgICAgICB0aGVuQnJhbmNoLnNlZW5SZXR1cm5PclRocm93ICYmIGVsc2VCcmFuY2guc2VlblJldHVybk9yVGhyb3c7CiAgICBzZWVuQnJlYWtPckNvbnRpbnVlID0KICAgICAgICB0aGVuQnJhbmNoLnNlZW5CcmVha09yQ29udGludWUgJiYgZWxzZUJyYW5jaC5zZWVuQnJlYWtPckNvbnRpbnVlOwoKICAgIExvY2Fsc0hhbmRsZXIgbG9jYWxzOwogICAgaWYgKGFib3J0cykgewogICAgICBsb2NhbHMgPSBfbG9jYWxzOwogICAgfSBlbHNlIGlmICh0aGVuQnJhbmNoLmFib3J0cykgewogICAgICBsb2NhbHMgPSBfbG9jYWxzLm1lcmdlRmxvdyhpbmZlcnJlciwgZWxzZUJyYW5jaC5fbG9jYWxzLCBpblBsYWNlOiB0cnVlKTsKICAgIH0gZWxzZSBpZiAoZWxzZUJyYW5jaC5hYm9ydHMpIHsKICAgICAgbG9jYWxzID0gX2xvY2Fscy5tZXJnZUZsb3coaW5mZXJyZXIsIHRoZW5CcmFuY2guX2xvY2FscywgaW5QbGFjZTogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBsb2NhbHMgPSBfbG9jYWxzLm1lcmdlRGlhbW9uZEZsb3coCiAgICAgICAgICBpbmZlcnJlciwgdGhlbkJyYW5jaC5fbG9jYWxzLCBlbHNlQnJhbmNoLl9sb2NhbHMpOwogICAgfQoKICAgIEZpZWxkSW5pdGlhbGl6YXRpb25TY29wZSBmaWVsZFNjb3BlID0gX2ZpZWxkcz8ubWVyZ2VEaWFtb25kRmxvdygKICAgICAgICBpbmZlcnJlciwgdGhlbkJyYW5jaC5fZmllbGRzLCBlbHNlQnJhbmNoLl9maWVsZHMpOwogICAgcmV0dXJuIG5ldyBMb2NhbFN0YXRlLmludGVybmFsKGxvY2FscywgZmllbGRTY29wZSwgX3RyeUJsb2NrLAogICAgICAgIHNlZW5SZXR1cm5PclRocm93OiBzZWVuUmV0dXJuT3JUaHJvdywKICAgICAgICBzZWVuQnJlYWtPckNvbnRpbnVlOiBzZWVuQnJlYWtPckNvbnRpbnVlKTsKICB9CgogIExvY2FsU3RhdGUgbWVyZ2VBZnRlckJyZWFrcyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwgTGlzdDxMb2NhbFN0YXRlPiBzdGF0ZXMsCiAgICAgIHtib29sIGtlZXBPd25Mb2NhbHM6IHRydWV9KSB7CiAgICBib29sIGFsbEJyYW5jaGVzQWJvcnQgPSB0cnVlOwogICAgZm9yIChMb2NhbFN0YXRlIHN0YXRlIGluIHN0YXRlcykgewogICAgICBhbGxCcmFuY2hlc0Fib3J0ID0gYWxsQnJhbmNoZXNBYm9ydCAmJiBzdGF0ZS5zZWVuUmV0dXJuT3JUaHJvdzsKICAgIH0KCiAgICBrZWVwT3duTG9jYWxzID0ga2VlcE93bkxvY2FscyAmJiAhc2VlblJldHVybk9yVGhyb3c7CgogICAgTG9jYWxzSGFuZGxlciBsb2NhbHMgPSBfbG9jYWxzLm1lcmdlQWZ0ZXJCcmVha3MoCiAgICAgICAgaW5mZXJyZXIsCiAgICAgICAgc3RhdGVzCiAgICAgICAgICAgIC53aGVyZSgoTG9jYWxTdGF0ZSBzdGF0ZSkgPT4gIXN0YXRlLnNlZW5SZXR1cm5PclRocm93KQogICAgICAgICAgICAubWFwKChMb2NhbFN0YXRlIHN0YXRlKSA9PiBzdGF0ZS5fbG9jYWxzKSwKICAgICAgICBrZWVwT3duTG9jYWxzOiBrZWVwT3duTG9jYWxzKTsKICAgIHNlZW5SZXR1cm5PclRocm93ID0gYWxsQnJhbmNoZXNBYm9ydCAmJiAha2VlcE93bkxvY2FsczsKICAgIHJldHVybiBuZXcgTG9jYWxTdGF0ZS5pbnRlcm5hbChsb2NhbHMsIF9maWVsZHMsIF90cnlCbG9jaywKICAgICAgICBzZWVuUmV0dXJuT3JUaHJvdzogc2VlblJldHVybk9yVGhyb3csCiAgICAgICAgc2VlbkJyZWFrT3JDb250aW51ZTogc2VlbkJyZWFrT3JDb250aW51ZSk7CiAgfQoKICBib29sIG1lcmdlQWxsKEluZmVycmVyRW5naW5lIGluZmVycmVyLCBMaXN0PExvY2FsU3RhdGU+IHN0YXRlcykgewogICAgYXNzZXJ0KCFzZWVuUmV0dXJuT3JUaHJvdyk7CiAgICByZXR1cm4gX2xvY2Fscy5tZXJnZUFsbCgKICAgICAgICBpbmZlcnJlciwKICAgICAgICBzdGF0ZXMKICAgICAgICAgICAgLndoZXJlKChMb2NhbFN0YXRlIHN0YXRlKSA9PiAhc3RhdGUuc2VlblJldHVybk9yVGhyb3cpCiAgICAgICAgICAgIC5tYXAoKExvY2FsU3RhdGUgc3RhdGUpID0+IHN0YXRlLl9sb2NhbHMpKTsKICB9CgogIHZvaWQgc3RhcnRMb29wKEluZmVycmVyRW5naW5lIGluZmVycmVyLCBpci5Ob2RlIGxvb3ApIHsKICAgIF9sb2NhbHMuc3RhcnRMb29wKGluZmVycmVyLCBsb29wKTsKICB9CgogIHZvaWQgZW5kTG9vcChJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwgaXIuTm9kZSBsb29wKSB7CiAgICBfbG9jYWxzLmVuZExvb3AoaW5mZXJyZXIsIGxvb3ApOwogIH0KCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoU3RyaW5nIGluZGVudCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgX3RvU3RydWN0dXJlZFRleHQoc2IsIGluZGVudCk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIHZvaWQgX3RvU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiLCBTdHJpbmcgaW5kZW50KSB7CiAgICBzYi53cml0ZSgnTG9jYWxTdGF0ZSgkaGFzaENvZGUpIFsnKTsKICAgIHNiLndyaXRlKCdcbiR7aW5kZW50fSAgbG9jYWxzOicpOwogICAgc2Iud3JpdGUoX2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcke2luZGVudH0gICAgJykpOwogICAgc2Iud3JpdGUoJ1xuXScpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ0xvY2FsU3RhdGUoJyk7CiAgICBzYi53cml0ZSgnbG9jYWxzPSRfbG9jYWxzJyk7CiAgICBpZiAoX2ZpZWxkcyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCcsZmllbGRzPSRfZmllbGRzJyk7CiAgICB9CiAgICBpZiAoc2VlblJldHVybk9yVGhyb3cpIHsKICAgICAgc2Iud3JpdGUoJyxzZWVuUmV0dXJuT3JUaHJvdycpOwogICAgfQogICAgaWYgKHNlZW5CcmVha09yQ29udGludWUpIHsKICAgICAgc2Iud3JpdGUoJyxzZWVuQnJlYWtPckNvbnRpbnVlJyk7CiAgICB9CiAgICBzYi53cml0ZSgnKScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CoiJAE5OPAEoARoZHz8jJCEhMSEfKhosJzMkIhokKBwfHiAbAVANBEpPDkMiJCIbJh8mNCcBHSorAU02GhsEAUo2BklF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OwppbXBvcnQgJ2luZmVycmVyX2VuZ2luZS5kYXJ0JzsKaW1wb3J0ICdub2RlX3RyYWNlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX2dyYXBoX25vZGVzLmRhcnQnOwoKY2xhc3MgQ2xvc3VyZVRyYWNlclZpc2l0b3IgZXh0ZW5kcyBUcmFjZXJWaXNpdG9yIHsKICBmaW5hbCBJdGVyYWJsZTxGdW5jdGlvbkVudGl0eT4gdHJhY2VkRWxlbWVudHM7CiAgZmluYWwgTGlzdDxDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbj4gX2NhbGxzVG9BbmFseXplID0KICAgICAgbmV3IExpc3Q8Q2FsbFNpdGVUeXBlSW5mb3JtYXRpb24+KCk7CgogIENsb3N1cmVUcmFjZXJWaXNpdG9yKHRoaXMudHJhY2VkRWxlbWVudHMsIEFwcGx5YWJsZVR5cGVJbmZvcm1hdGlvbiB0cmFjZWRUeXBlLAogICAgICBJbmZlcnJlckVuZ2luZSBpbmZlcnJlcikKICAgICAgOiBzdXBlcih0cmFjZWRUeXBlLCBpbmZlcnJlcikgewogICAgYXNzZXJ0KAogICAgICAgIHRyYWNlZEVsZW1lbnRzLmV2ZXJ5KChmKSA9PiAhZi5pc0Fic3RyYWN0KSwKICAgICAgICAiVHJhY2luZyBhYnN0cmFjdCBtZXRob2RzOiAiCiAgICAgICAgIiR7dHJhY2VkRWxlbWVudHMud2hlcmUoKGYpID0+IGYuaXNBYnN0cmFjdCl9Iik7CiAgfQoKICBAb3ZlcnJpZGUKICBBcHBseWFibGVUeXBlSW5mb3JtYXRpb24gZ2V0IHRyYWNlZFR5cGUgPT4gc3VwZXIudHJhY2VkVHlwZTsKCiAgdm9pZCBydW4oKSB7CiAgICBhbmFseXplKCk7CiAgICBpZiAoIWNvbnRpbnVlQW5hbHl6aW5nKSByZXR1cm47CiAgICBfY2FsbHNUb0FuYWx5emUuZm9yRWFjaChfYW5hbHl6ZUNhbGwpOwogICAgZm9yIChGdW5jdGlvbkVudGl0eSBlbGVtZW50IGluIHRyYWNlZEVsZW1lbnRzKSB7CiAgICAgIGluZmVycmVyLnR5cGVzLnN0cmF0ZWd5LmZvckVhY2hQYXJhbWV0ZXIoZWxlbWVudCwgKExvY2FsIHBhcmFtZXRlcikgewogICAgICAgIEVsZW1lbnRUeXBlSW5mb3JtYXRpb24gaW5mbyA9CiAgICAgICAgICAgIGluZmVycmVyLnR5cGVzLmdldEluZmVycmVkVHlwZU9mUGFyYW1ldGVyKHBhcmFtZXRlcik7CiAgICAgICAgaW5mby5kaXNhYmxlSW5mZXJlbmNlRm9yQ2xvc3VyZXMgPSBmYWxzZTsKICAgICAgfSk7CiAgICB9CiAgfQoKICB2b2lkIF90YWdBc0Z1bmN0aW9uQXBwbHlUYXJnZXQoW1N0cmluZyByZWFzb25dKSB7CiAgICB0cmFjZWRUeXBlLm1pZ2h0QmVQYXNzZWRUb0Z1bmN0aW9uQXBwbHkgPSB0cnVlOwogICAgaWYgKGRlYnVnLlZFUkJPU0UpIHsKICAgICAgcHJpbnQoIkNsb3N1cmUgJHRyYWNlZFR5cGUgbWlnaHQgYmUgcGFzc2VkIHRvIGFwcGx5OiAkcmVhc29uIik7CiAgICB9CiAgfQoKICB2b2lkIF9yZWdpc3RlckNhbGxGb3JMYXRlckFuYWx5c2lzKENhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIF9jYWxsc1RvQW5hbHl6ZS5hZGQoaW5mbyk7CiAgfQoKICB2b2lkIF9hbmFseXplQ2FsbChDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IGluZm8uc2VsZWN0b3I7CiAgICBBYnN0cmFjdFZhbHVlIG1hc2sgPSBpbmZvLm1hc2s7CiAgICB0cmFjZWRFbGVtZW50cy5mb3JFYWNoKChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbkVsZW1lbnQpIHsKICAgICAgaWYgKCFzZWxlY3Rvci5jYWxsU3RydWN0dXJlCiAgICAgICAgICAuc2lnbmF0dXJlQXBwbGllcyhmdW5jdGlvbkVsZW1lbnQucGFyYW1ldGVyU3RydWN0dXJlKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpbmZlcnJlci51cGRhdGVQYXJhbWV0ZXJBc3NpZ25tZW50cygKICAgICAgICAgIGluZm8sIGZ1bmN0aW9uRWxlbWVudCwgaW5mby5hcmd1bWVudHMsIHNlbGVjdG9yLCBtYXNrLAogICAgICAgICAgcmVtb3ZlOiBmYWxzZSwgYWRkVG9RdWV1ZTogZmFsc2UpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbihDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgc3VwZXIudmlzaXRDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgICBpZiAoaW5mby5jbG9zdXJlID09IGN1cnJlbnRVc2VyKSB7CiAgICAgIF9yZWdpc3RlckNhbGxGb3JMYXRlckFuYWx5c2lzKGluZm8pOwogICAgfSBlbHNlIHsKICAgICAgYmFpbG91dCgnUGFzc2VkIHRvIGEgY2xvc3VyZScpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbihTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBzdXBlci52aXNpdFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKGluZm8pOwogICAgTWVtYmVyRW50aXR5IGNhbGxlZCA9IGluZm8uY2FsbGVkRWxlbWVudDsKICAgIGlmIChpbmZlcnJlci5jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5pc0ZvcmVpZ24oY2FsbGVkKSkgewogICAgICBTdHJpbmcgbmFtZSA9IGNhbGxlZC5uYW1lOwogICAgICBpZiAobmFtZSA9PSBJZGVudGlmaWVycy5KUyB8fCBuYW1lID09IElkZW50aWZpZXJzLkRBUlRfQ0xPU1VSRV9UT19KUykgewogICAgICAgIGJhaWxvdXQoJ1VzZWQgaW4gSlMgJHtpbmZvLmRlYnVnTmFtZX0nKTsKICAgICAgfQogICAgfQogICAgaWYgKGNhbGxlZC5pc0dldHRlciAmJgogICAgICAgIGluZm8uc2VsZWN0b3IgIT0gbnVsbCAmJgogICAgICAgIGluZm8uc2VsZWN0b3IuaXNDYWxsICYmCiAgICAgICAgaW5mZXJyZXIudHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoY2FsbGVkKSA9PSBjdXJyZW50VXNlcikgewogICAgICAvLyBUaGlzIG5vZGUgY2FuIGJlIGEgY2xvc3VyZSBjYWxsIGFzIHdlbGwuIEZvciBleGFtcGxlLCBgZm9vKClgCiAgICAgIC8vIHdoZXJlIGBmb29gIGlzIGEgZ2V0dGVyLgogICAgICBfcmVnaXN0ZXJDYWxsRm9yTGF0ZXJBbmFseXNpcyhpbmZvKTsKICAgIH0KICAgIGlmIChfY2hlY2tJZkZ1bmN0aW9uQXBwbHkoY2FsbGVkKSAmJgogICAgICAgIGluZm8uYXJndW1lbnRzICE9IG51bGwgJiYKICAgICAgICBpbmZvLmFyZ3VtZW50cy5jb250YWlucyhjdXJyZW50VXNlcikpIHsKICAgICAgX3RhZ0FzRnVuY3Rpb25BcHBseVRhcmdldCgic3RhdGljIGNhbGwiKTsKICAgIH0KICB9CgogIGJvb2wgX2NoZWNrSWZDdXJyZW50VXNlcihNZW1iZXJFbnRpdHkgZWxlbWVudCkgPT4KICAgICAgaW5mZXJyZXIudHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZWxlbWVudCkgPT0gY3VycmVudFVzZXI7CgogIGJvb2wgX2NoZWNrSWZGdW5jdGlvbkFwcGx5KE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gaW5mZXJyZXIuY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuaXNGdW5jdGlvbkFwcGx5TWV0aG9kKGVsZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIHN1cGVyLnZpc2l0RHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKGluZm8pOwogICAgaWYgKGluZm8uc2VsZWN0b3IuaXNDYWxsKSB7CiAgICAgIGlmIChpbmZvLmFyZ3VtZW50cy5jb250YWlucyhjdXJyZW50VXNlcikpIHsKICAgICAgICBpZiAoaW5mby5oYXNDbG9zdXJlQ2FsbFRhcmdldHMgfHwKICAgICAgICAgICAgaW5mby5jb25jcmV0ZVRhcmdldHMuYW55KChlbGVtZW50KSA9PiAhZWxlbWVudC5pc0Z1bmN0aW9uKSkgewogICAgICAgICAgYmFpbG91dCgnUGFzc2VkIHRvIGEgY2xvc3VyZScpOwogICAgICAgIH0KICAgICAgICBpZiAoaW5mby5jb25jcmV0ZVRhcmdldHMuYW55KF9jaGVja0lmRnVuY3Rpb25BcHBseSkpIHsKICAgICAgICAgIF90YWdBc0Z1bmN0aW9uQXBwbHlUYXJnZXQoImR5bmFtaWMgY2FsbCIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpbmZvLmNvbmNyZXRlVGFyZ2V0cy5hbnkoX2NoZWNrSWZDdXJyZW50VXNlcikpIHsKICAgICAgICBfcmVnaXN0ZXJDYWxsRm9yTGF0ZXJBbmFseXNpcyhpbmZvKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpbmZvLnNlbGVjdG9yLmlzR2V0dGVyICYmCiAgICAgICAgaW5mby5zZWxlY3Rvci5tZW1iZXJOYW1lID09IE5hbWVzLmNhbGwpIHsKICAgICAgLy8gV2UgYXJlIHBvdGVudGlhbGx5IHRlYXJpbmcgb2ZmIG91cnNlbGYgaGVyZQogICAgICBhZGROZXdFc2NhcGVJbmZvcm1hdGlvbihpbmZvKTsKICAgIH0KICB9Cn0KCmNsYXNzIFN0YXRpY1RlYXJPZmZDbG9zdXJlVHJhY2VyVmlzaXRvciBleHRlbmRzIENsb3N1cmVUcmFjZXJWaXNpdG9yIHsKICBTdGF0aWNUZWFyT2ZmQ2xvc3VyZVRyYWNlclZpc2l0b3IoCiAgICAgIEZ1bmN0aW9uRW50aXR5IHRyYWNlZEVsZW1lbnQsIHRyYWNlZFR5cGUsIGluZmVycmVyKQogICAgICA6IHN1cGVyKFt0cmFjZWRFbGVtZW50XSwgdHJhY2VkVHlwZSwgaW5mZXJyZXIpOwoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIHN1cGVyLnZpc2l0U3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgICBpZiAoaW5mby5jYWxsZWRFbGVtZW50ID09IHRyYWNlZEVsZW1lbnRzLmZpcnN0ICYmCiAgICAgICAgaW5mby5zZWxlY3RvciAhPSBudWxsICYmCiAgICAgICAgaW5mby5zZWxlY3Rvci5pc0dldHRlcikgewogICAgICBhZGROZXdFc2NhcGVJbmZvcm1hdGlvbihpbmZvKTsKICAgIH0KICB9Cn0KgJgATk48AS4BNyQyJR4fGyABMzE4KwFRHyYMNCU5BAEMPwEPDyQrNUwmQjIKBgQBNDQZRgYEAUUfBAE0JyQ+IkMQCCtBLQgEAQxNNScrDSYGBAEMSzQuQSFOMQgGGyEgSUciKwYpIjAwBgQBNEYBNU8EAQxNNSAyKkoqCj81CkItCCkyNSUGBAIBRyU6NgEMSzQ2ISIlBgQCATFwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci9jbG9zdXJlX3RyYWNlci5kYXJ0MXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL2RlYnVnLmRhcnSB6S8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gVmFsdWVzIHVzZWQgb25seSBmb3IgZGVidWdnaW5nIHR5cGUgaW5mZXJlbmNlLgpsaWJyYXJ5IGNvbXBpbGVyLnNyYy5pbmZlcnJlci5kZWJ1ZzsKCmNvbnN0IGJvb2wgVkVSQk9TRSA9IGZhbHNlOwpjb25zdCBib29sIFBSSU5UX1NVTU1BUlkgPSBmYWxzZTsKY29uc3QgYm9vbCBBTk9NQUxZX1dBUk4gPSBmYWxzZTsKYm9vbCBQUklOVF9HUkFQSCA9IGZhbHNlOwpib29sIFBSSU5UX0dSQVBIX0FMTF9OT0RFUyA9IGZhbHNlOyAvLyBJbmNsdWRlIHVzZWxlc3Mgbm9kZXM/Cg4ATk48ATMlARwiIRo+AShwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci9kZWJ1Zy5kYXJ0OnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL2xvY2Fsc19oYW5kbGVyLmRhcnTAAFGOLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgbG9jYWxzX2hhbmRsZXI7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgc2hvdyBJdGVyYWJsZU1peGluOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pci91dGlsLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JzsKaW1wb3J0ICdpbmZlcnJlcl9lbmdpbmUuZGFydCc7CmltcG9ydCAndHlwZV9ncmFwaF9ub2Rlcy5kYXJ0JzsKCi8vLyBBIHZhcmlhYmxlIHNjb3BlIGhvbGRzIHR5cGVzIGZvciB2YXJpYWJsZXMuIEl0IGhhcyBhIGxpbmsgdG8gYQovLy8gcGFyZW50IHNjb3BlLCBidXQgbmV2ZXIgY2hhbmdlcyB0aGUgdHlwZXMgaW4gdGhhdCBwYXJlbnQuIEluc3RlYWQsCi8vLyB1cGRhdGVzIHRvIGxvY2FscyBvZiBhIHBhcmVudCBzY29wZSBhcmUgcHV0IGluIHRoZSBjdXJyZW50IHNjb3BlLgovLy8gVGhlIGluZmVycmVyIG1ha2VzIHN1cmUgdXBkYXRlcyBnZXQgbWVyZ2VkIGludG8gdGhlIHBhcmVudCBzY29wZSwKLy8vIG9uY2UgdGhlIGNvbnRyb2wgZmxvdyBibG9jayBoYXMgYmVlbiB2aXNpdGVkLgpjbGFzcyBWYXJpYWJsZVNjb3BlIHsKICAvLy8gVGhlIG51bWJlciBvZiBwYXJlbnQgc2NvcGVzIG9mIHRoaXMgc2NvcGUuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgY29tcHV0aW5nIGNvbW1vbiBwYXJlbnRzIGVmZmljaWVudGx5LgogIGZpbmFsIGludCBfbGV2ZWw7CgogIE1hcDxMb2NhbCwgVHlwZUluZm9ybWF0aW9uPiB2YXJpYWJsZXM7CgogIC8vLyBUaGUgcGFyZW50IG9mIHRoaXMgc2NvcGUuIE51bGwgZm9yIHRoZSByb290IHNjb3BlLgogIGZpbmFsIFZhcmlhYmxlU2NvcGUgcGFyZW50OwoKICAvLy8gVGhlIFtpci5Ob2RlXSB0aGF0IGNyZWF0ZWQgdGhpcyBzY29wZS4KICBmaW5hbCBpci5Ob2RlIHRyeUJsb2NrOwoKICBmaW5hbCBWYXJpYWJsZVNjb3BlIGNvcHlPZjsKCiAgVmFyaWFibGVTY29wZSh7dGhpcy5wYXJlbnR9KQogICAgICA6IHRoaXMudmFyaWFibGVzID0gbnVsbCwKICAgICAgICB0aGlzLmNvcHlPZiA9IG51bGwsCiAgICAgICAgdGhpcy50cnlCbG9jayA9IG51bGwsCiAgICAgICAgX2xldmVsID0gKHBhcmVudD8uX2xldmVsID8/IC0xKSArIDE7CgogIFZhcmlhYmxlU2NvcGUudHJ5QmxvY2sodGhpcy50cnlCbG9jaywge3RoaXMucGFyZW50fSkKICAgICAgOiB0aGlzLnZhcmlhYmxlcyA9IG51bGwsCiAgICAgICAgdGhpcy5jb3B5T2YgPSBudWxsLAogICAgICAgIF9sZXZlbCA9IChwYXJlbnQ/Ll9sZXZlbCA/PyAtMSkgKyAxIHsKICAgIGFzc2VydCh0cnlCbG9jayBpcyBpci5UcnlDYXRjaCB8fCB0cnlCbG9jayBpcyBpci5UcnlGaW5hbGx5LAogICAgICAgICJVbmV4cGVjdGVkIGJsb2NrICR0cnlCbG9jayBmb3IgVmFyaWFibGVTY29wZS50cnlCbG9jayIpOwogIH0KCiAgVmFyaWFibGVTY29wZS5kZWVwQ29weU9mKFZhcmlhYmxlU2NvcGUgb3RoZXIpCiAgICAgIDogdmFyaWFibGVzID0gb3RoZXIudmFyaWFibGVzID09IG51bGwKICAgICAgICAgICAgPyBudWxsCiAgICAgICAgICAgIDogbmV3IE1hcDxMb2NhbCwgVHlwZUluZm9ybWF0aW9uPi5mcm9tKG90aGVyLnZhcmlhYmxlcyksCiAgICAgICAgdHJ5QmxvY2sgPSBvdGhlci50cnlCbG9jaywKICAgICAgICBjb3B5T2YgPSBvdGhlci5jb3B5T2YgPz8gb3RoZXIsCiAgICAgICAgX2xldmVsID0gb3RoZXIuX2xldmVsLAogICAgICAgIHBhcmVudCA9IG90aGVyLnBhcmVudCA9PSBudWxsCiAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICA6IG5ldyBWYXJpYWJsZVNjb3BlLmRlZXBDb3B5T2Yob3RoZXIucGFyZW50KTsKCiAgLy8vIGB0cnVlYCBpZiB0aGlzIHNjb3BlIGlzIGZvciBhIHRyeSBibG9jay4KICBib29sIGdldCBpc1RyeSA9PiB0cnlCbG9jayAhPSBudWxsOwoKICAvLy8gUmV0dXJucyB0aGUgW1ZhcmlhYmxlU2NvcGVdIHRoYXQgZGVmaW5lcyB0aGUgaWRlbnRpdHkgb2YgdGhpcyBzY29wZS4KICAvLy8KICAvLy8gSWYgdGhpcyBzY29wZSBpcyBhIGNvcHkgb2YgYW5vdGhlciBzY29wZSwgdGhlIGlkZW50aXR5IGlzIHRoZSBpZGVudGl0eQogIC8vLyBvZiB0aGUgb3RoZXIgc2NvcGUsIG90aGVyd2lzZSB0aGUgaWRlbnRpdHkgaXMgdGhlIHNjb3BlIGl0c2VsZi4KICBWYXJpYWJsZVNjb3BlIGdldCBpZGVudGl0eSA9PiBjb3B5T2YgPz8gdGhpczsKCiAgLy8vIFJldHVybnMgdGhlIGNvbW1vbiBwYXJlbnQgYmV0d2VlbiB0aGlzIGFuZCBbb3RoZXJdIGJhc2VkIG9uIFtpZGVudGl0eV0uCiAgVmFyaWFibGVTY29wZSBjb21tb25QYXJlbnQoVmFyaWFibGVTY29wZSBvdGhlcikgewogICAgaWYgKGlkZW50aXR5ID09IG90aGVyLmlkZW50aXR5KSB7CiAgICAgIHJldHVybiBpZGVudGl0eTsKICAgIH0gZWxzZSBpZiAoX2xldmVsID4gb3RoZXIuX2xldmVsKSB7CiAgICAgIHJldHVybiBwYXJlbnQuY29tbW9uUGFyZW50KG90aGVyKTsKICAgIH0gZWxzZSBpZiAoX2xldmVsIDwgb3RoZXIuX2xldmVsKSB7CiAgICAgIHJldHVybiBjb21tb25QYXJlbnQob3RoZXIucGFyZW50KTsKICAgIH0gZWxzZSBpZiAoX2xldmVsID4gMCkgewogICAgICByZXR1cm4gcGFyZW50LmNvbW1vblBhcmVudChvdGhlci5wYXJlbnQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gb3BlcmF0b3IgW10oTG9jYWwgdmFyaWFibGUpIHsKICAgIFR5cGVJbmZvcm1hdGlvbiByZXN1bHQ7CiAgICBpZiAodmFyaWFibGVzID09IG51bGwgfHwgKHJlc3VsdCA9IHZhcmlhYmxlc1t2YXJpYWJsZV0pID09IG51bGwpIHsKICAgICAgcmV0dXJuIHBhcmVudCA9PSBudWxsID8gbnVsbCA6IHBhcmVudFt2YXJpYWJsZV07CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oTG9jYWwgdmFyaWFibGUsIFR5cGVJbmZvcm1hdGlvbiBtYXNrKSB7CiAgICBhc3NlcnQobWFzayAhPSBudWxsKTsKICAgIGlmICh2YXJpYWJsZXMgPT0gbnVsbCkgewogICAgICB2YXJpYWJsZXMgPSBuZXcgTWFwPExvY2FsLCBUeXBlSW5mb3JtYXRpb24+KCk7CiAgICB9CiAgICB2YXJpYWJsZXNbdmFyaWFibGVdID0gbWFzazsKICB9CgogIC8vLyBDYWxscyBbZl0gZm9yIGFsbCB2YXJpYWJsZXMgaW4gdGhpcyBhbmQgcGFyZW50IHNjb3BlcyB1bnRpbCBhbmQgaW5jbHVkaW5nCiAgLy8vIFtzY29wZV0uIFtmXSBpcyBjYWxsZWQgYXQgbW9zdCBvbmNlIGZvciBlYWNoIHZhcmlhYmxlLgogIHZvaWQgZm9yRWFjaExvY2FsVW50aWxTY29wZSgKICAgICAgVmFyaWFibGVTY29wZSBzY29wZSwgdm9pZCBmKExvY2FsIHZhcmlhYmxlLCBUeXBlSW5mb3JtYXRpb24gdHlwZSkpIHsKICAgIF9mb3JFYWNoTG9jYWxVbnRpbFNjb3BlKHNjb3BlLCBmLCBuZXcgU2V0bGV0PExvY2FsPigpLCB0aGlzKTsKICB9CgogIHZvaWQgX2ZvckVhY2hMb2NhbFVudGlsU2NvcGUoCiAgICAgIFZhcmlhYmxlU2NvcGUgc2NvcGUsCiAgICAgIHZvaWQgZihMb2NhbCB2YXJpYWJsZSwgVHlwZUluZm9ybWF0aW9uIHR5cGUpLAogICAgICBTZXRsZXQ8TG9jYWw+IHNlZW5Mb2NhbHMsCiAgICAgIFZhcmlhYmxlU2NvcGUgb3JpZ2luKSB7CiAgICBpZiAodmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgdmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCB0eXBlKSB7CiAgICAgICAgaWYgKHNlZW5Mb2NhbHMuY29udGFpbnModmFyaWFibGUpKSByZXR1cm47CiAgICAgICAgc2VlbkxvY2Fscy5hZGQodmFyaWFibGUpOwogICAgICAgIGYodmFyaWFibGUsIHR5cGUpOwogICAgICB9KTsKICAgIH0KICAgIGlmIChzY29wZT8uaWRlbnRpdHkgPT0gaWRlbnRpdHkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CiAgICAgIHBhcmVudC5fZm9yRWFjaExvY2FsVW50aWxTY29wZShzY29wZSwgZiwgc2VlbkxvY2Fscywgb3JpZ2luKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydCgKICAgICAgICAgIHNjb3BlID09IG51bGwsCiAgICAgICAgICAiU2NvcGUgbm90IGZvdW5kOiBcbiIKICAgICAgICAgICJvcmlnaW49JHtvcmlnaW4udG9TdHJ1Y3R1cmVkVGV4dCgnJyl9XG4iCiAgICAgICAgICAic2NvcGU9JHtzY29wZS50b1N0cnVjdHVyZWRUZXh0KCcnKX0iKTsKICAgIH0KICB9CgogIHZvaWQgZm9yRWFjaExvY2FsKHZvaWQgZihMb2NhbCB2YXJpYWJsZSwgVHlwZUluZm9ybWF0aW9uIHR5cGUpKSB7CiAgICBmb3JFYWNoTG9jYWxVbnRpbFNjb3BlKG51bGwsIGYpOwogIH0KCiAgYm9vbCB1cGRhdGVzKExvY2FsIHZhcmlhYmxlKSB7CiAgICBpZiAodmFyaWFibGVzID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB2YXJpYWJsZXMuY29udGFpbnNLZXkodmFyaWFibGUpOwogIH0KCiAgU3RyaW5nIHRvU3RydWN0dXJlZFRleHQoU3RyaW5nIGluZGVudCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgX3RvU3RydWN0dXJlZFRleHQoc2IsIGluZGVudCk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIHZvaWQgX3RvU3RydWN0dXJlZFRleHQoU3RyaW5nQnVmZmVyIHNiLCBTdHJpbmcgaW5kZW50KSB7CiAgICBzYi53cml0ZSgnVmFyaWFibGVTY29wZSgkaGFzaENvZGUpIFsnKTsKICAgIHNiLndyaXRlKCdcbiR7aW5kZW50fSAgbGV2ZWw6JF9sZXZlbCcpOwogICAgaWYgKGNvcHlPZiAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCdcbiR7aW5kZW50fSAgY29weU9mOlZhcmlhYmxlU2NvcGUoJHtjb3B5T2YuaGFzaENvZGV9KScpOwogICAgfQogICAgaWYgKHRyeUJsb2NrICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJ1xuJHtpbmRlbnR9ICB0cnlCbG9jazogJHtub2RlVG9EZWJ1Z1N0cmluZyh0cnlCbG9jayl9Jyk7CiAgICB9CiAgICBpZiAodmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJ1xuJHtpbmRlbnR9ICB2YXJpYWJsZXM6Jyk7CiAgICAgIHZhcmlhYmxlcy5mb3JFYWNoKChMb2NhbCBsb2NhbCwgVHlwZUluZm9ybWF0aW9uIHR5cGUpIHsKICAgICAgICBzYi53cml0ZSgnXG4ke2luZGVudH0gICAgJGxvY2FsOiAnKTsKICAgICAgICBzYi53cml0ZSh0eXBlLnRvU3RydWN0dXJlZFRleHQoJyR7aW5kZW50fSAgICAgICcpKTsKICAgICAgfSk7CiAgICB9CiAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJ1xuJHtpbmRlbnR9ICBwYXJlbnQ6Jyk7CiAgICAgIHBhcmVudC5fdG9TdHJ1Y3R1cmVkVGV4dChzYiwgJyR7aW5kZW50fSAgICAgJyk7CiAgICB9CiAgICBzYi53cml0ZSgnXScpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nIHJlc3QgPSBwYXJlbnQgPT0gbnVsbCA/ICJudWxsIiA6IHBhcmVudC50b1N0cmluZygpOwogICAgcmV0dXJuICd7JHZhcmlhYmxlc30gJHJlc3QnOwogIH0KfQoKLy8vIFRyYWNrcyBpbml0aWFsaXplcnMgdmlhIGluaXRpYWxpemF0aW9ucyBhbmQgYXNzaWdubWVudHMuCmNsYXNzIEZpZWxkSW5pdGlhbGl6YXRpb25TY29wZSB7CiAgTWFwPEZpZWxkRW50aXR5LCBUeXBlSW5mb3JtYXRpb24+IGZpZWxkczsKICBib29sIGlzVGhpc0V4cG9zZWQ7CgogIC8vLyBgdHJ1ZWAgd2hlbiBjb250cm9sIGZsb3cgcHJldmVudHMgYWNjdW11bGF0aW5nIGRlZmluaXRlIGFzc2lnbm1lbnRzLAogIC8vLyBlLmcuIGFuIGVhcmx5IHJldHVybiBvciBjYXVnaHQgZXhjZXB0aW9uLgogIGJvb2wgaXNJbmRlZmluaXRlOwoKICBGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUoKQogICAgICA6IGlzVGhpc0V4cG9zZWQgPSBmYWxzZSwKICAgICAgICBpc0luZGVmaW5pdGUgPSBmYWxzZTsKCiAgRmllbGRJbml0aWFsaXphdGlvblNjb3BlLmludGVybmFsRnJvbShGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUgb3RoZXIpCiAgICAgIDogaXNUaGlzRXhwb3NlZCA9IG90aGVyLmlzVGhpc0V4cG9zZWQsCiAgICAgICAgaXNJbmRlZmluaXRlID0gb3RoZXIuaXNJbmRlZmluaXRlOwoKICBmYWN0b3J5IEZpZWxkSW5pdGlhbGl6YXRpb25TY29wZS5mcm9tKEZpZWxkSW5pdGlhbGl6YXRpb25TY29wZSBvdGhlcikgewogICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIG5ldyBGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUuaW50ZXJuYWxGcm9tKG90aGVyKTsKICB9CgogIHZvaWQgdXBkYXRlRmllbGQoRmllbGRFbnRpdHkgZmllbGQsIFR5cGVJbmZvcm1hdGlvbiB0eXBlKSB7CiAgICBpZiAoaXNUaGlzRXhwb3NlZCkgcmV0dXJuOwogICAgaWYgKGlzSW5kZWZpbml0ZSkgcmV0dXJuOwogICAgZmllbGRzID8/PSBuZXcgTWFwPEZpZWxkRW50aXR5LCBUeXBlSW5mb3JtYXRpb24+KCk7CiAgICBmaWVsZHNbZmllbGRdID0gdHlwZTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiByZWFkRmllbGQoRmllbGRFbnRpdHkgZmllbGQpIHsKICAgIHJldHVybiBmaWVsZHMgPT0gbnVsbCA/IG51bGwgOiBmaWVsZHNbZmllbGRdOwogIH0KCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihGaWVsZEVudGl0eSBlbGVtZW50LCBUeXBlSW5mb3JtYXRpb24gdHlwZSkpIHsKICAgIGZpZWxkcz8uZm9yRWFjaChmKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBqb2luIGJldHdlZW4gW3RoZW5TY29wZV0gYW5kIFtlbHNlU2NvcGVdIHdoaWNoIG1vZGVscyB0aGUKICAvLy8gZmxvdyB0aHJvdWdoIGVpdGhlciBbdGhlblNjb3BlXSBvciBbZWxzZVNjb3BlXS4KICBGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUgbWVyZ2VEaWFtb25kRmxvdyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwKICAgICAgRmllbGRJbml0aWFsaXphdGlvblNjb3BlIHRoZW5TY29wZSwgRmllbGRJbml0aWFsaXphdGlvblNjb3BlIGVsc2VTY29wZSkgewogICAgYXNzZXJ0KGVsc2VTY29wZSAhPSBudWxsKTsKCiAgICAvLyBRdWljayBiYWlsb3V0IGNoZWNrLiBJZiBbaXNUaGlzRXhwb3NlZF0gb3IgW2lzSW5kZWZpbml0ZV0gaXMgdHJ1ZSwgd2UKICAgIC8vIGtub3cgdGhlIGNvZGUgZm9sbG93aW5nIHdvbidUeXBlSW5mb3JtYXRpb24gZG8gYW55dGhpbmcuCiAgICBpZiAoaXNUaGlzRXhwb3NlZCkgcmV0dXJuIHRoaXM7CiAgICBpZiAoaXNJbmRlZmluaXRlKSByZXR1cm4gdGhpczsKCiAgICBGaWVsZEluaXRpYWxpemF0aW9uU2NvcGUgb3RoZXJTY29wZSA9CiAgICAgICAgZWxzZVNjb3BlLmZpZWxkcyA9PSBudWxsID8gdGhpcyA6IGVsc2VTY29wZTsKCiAgICB0aGVuU2NvcGUuZm9yRWFjaCgoRmllbGRFbnRpdHkgZmllbGQsIFR5cGVJbmZvcm1hdGlvbiB0eXBlKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBvdGhlclR5cGUgPSBvdGhlclNjb3BlLnJlYWRGaWVsZChmaWVsZCk7CiAgICAgIGlmIChvdGhlclR5cGUgPT0gbnVsbCkgcmV0dXJuOwogICAgICB1cGRhdGVGaWVsZChmaWVsZCwgaW5mZXJyZXIudHlwZXMuYWxsb2NhdGVEaWFtb25kUGhpKHR5cGUsIG90aGVyVHlwZSkpOwogICAgfSk7CgogICAgaXNUaGlzRXhwb3NlZCA9IHRoZW5TY29wZS5pc1RoaXNFeHBvc2VkIHx8IGVsc2VTY29wZS5pc1RoaXNFeHBvc2VkOwogICAgaXNJbmRlZmluaXRlID0gdGhlblNjb3BlLmlzSW5kZWZpbml0ZSB8fCBlbHNlU2NvcGUuaXNJbmRlZmluaXRlOwogICAgcmV0dXJuIHRoaXM7CiAgfQp9CgovLy8gUGxhY2Vob2xkZXIgZm9yIGluZmVycmVkIGFyZ3VtZW50cyB0eXBlcyBvbiBzZW5kcy4KY2xhc3MgQXJndW1lbnRzVHlwZXMgZXh0ZW5kcyBJdGVyYWJsZU1peGluPFR5cGVJbmZvcm1hdGlvbj4gewogIGZpbmFsIExpc3Q8VHlwZUluZm9ybWF0aW9uPiBwb3NpdGlvbmFsOwogIGZpbmFsIE1hcDxTdHJpbmcsIFR5cGVJbmZvcm1hdGlvbj4gbmFtZWQ7CiAgQXJndW1lbnRzVHlwZXModGhpcy5wb3NpdGlvbmFsLCBuYW1lZCkKICAgICAgOiB0aGlzLm5hbWVkID0gKG5hbWVkID09IG51bGwgfHwgbmFtZWQuaXNFbXB0eSkgPyBjb25zdCB7fSA6IG5hbWVkIHsKICAgIGFzc2VydCh0aGlzLnBvc2l0aW9uYWwuZXZlcnkoKFR5cGVJbmZvcm1hdGlvbiB0eXBlKSA9PiB0eXBlICE9IG51bGwpKTsKICAgIGFzc2VydCh0aGlzLm5hbWVkLnZhbHVlcy5ldmVyeSgoVHlwZUluZm9ybWF0aW9uIHR5cGUpID0+IHR5cGUgIT0gbnVsbCkpOwogIH0KCiAgQXJndW1lbnRzVHlwZXMuZW1wdHkoKQogICAgICA6IHBvc2l0aW9uYWwgPSBjb25zdCBbXSwKICAgICAgICBuYW1lZCA9IGNvbnN0IHt9OwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiBwb3NpdGlvbmFsLmxlbmd0aCArIG5hbWVkLmxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgSXRlcmF0b3I8VHlwZUluZm9ybWF0aW9uPiBnZXQgaXRlcmF0b3IgPT4gbmV3IEFyZ3VtZW50c1R5cGVzSXRlcmF0b3IodGhpcyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICJ7IHBvc2l0aW9uYWwgPSAkcG9zaXRpb25hbCwgbmFtZWQgPSAkbmFtZWQgfSI7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChwb3NpdGlvbmFsLmxlbmd0aCAhPSBvdGhlci5wb3NpdGlvbmFsLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG5hbWVkLmxlbmd0aCAhPSBvdGhlci5uYW1lZC5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25hbC5sZW5ndGg7IGkrKykgewogICAgICBpZiAocG9zaXRpb25hbFtpXSAhPSBvdGhlci5wb3NpdGlvbmFsW2ldKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsKICAgIG5hbWVkLmZvckVhY2goKG5hbWUsIHR5cGUpIHsKICAgICAgaWYgKG90aGVyLm5hbWVkW25hbWVdICE9IHR5cGUpIHJlc3VsdCA9IGZhbHNlOwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignQXJndW1lbnRzVHlwZXMuaGFzaENvZGUnKTsKCiAgYm9vbCBoYXNOb0FyZ3VtZW50cygpID0+IHBvc2l0aW9uYWwuaXNFbXB0eSAmJiBuYW1lZC5pc0VtcHR5OwoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2godm9pZCBmKFR5cGVJbmZvcm1hdGlvbiB0eXBlKSkgewogICAgcG9zaXRpb25hbC5mb3JFYWNoKGYpOwogICAgbmFtZWQudmFsdWVzLmZvckVhY2goZik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGV2ZXJ5KGJvb2wgZihUeXBlSW5mb3JtYXRpb24gdHlwZSkpIHsKICAgIHJldHVybiBwb3NpdGlvbmFsLmV2ZXJ5KGYpICYmIG5hbWVkLnZhbHVlcy5ldmVyeShmKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgY29udGFpbnMoT2JqZWN0IHR5cGUpIHsKICAgIHJldHVybiBwb3NpdGlvbmFsLmNvbnRhaW5zKHR5cGUpIHx8IG5hbWVkLmNvbnRhaW5zVmFsdWUodHlwZSk7CiAgfQp9CgpjbGFzcyBBcmd1bWVudHNUeXBlc0l0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8VHlwZUluZm9ybWF0aW9uPiB7CiAgZmluYWwgSXRlcmF0b3I8VHlwZUluZm9ybWF0aW9uPiBwb3NpdGlvbmFsOwogIGZpbmFsIEl0ZXJhdG9yPFR5cGVJbmZvcm1hdGlvbj4gbmFtZWQ7CiAgYm9vbCBfaXRlcmF0ZVBvc2l0aW9uYWwgPSB0cnVlOwoKICBBcmd1bWVudHNUeXBlc0l0ZXJhdG9yKEFyZ3VtZW50c1R5cGVzIGl0ZXJhdGVlKQogICAgICA6IHBvc2l0aW9uYWwgPSBpdGVyYXRlZS5wb3NpdGlvbmFsLml0ZXJhdG9yLAogICAgICAgIG5hbWVkID0gaXRlcmF0ZWUubmFtZWQudmFsdWVzLml0ZXJhdG9yOwoKICBJdGVyYXRvcjxUeXBlSW5mb3JtYXRpb24+IGdldCBfY3VycmVudEl0ZXJhdG9yID0+CiAgICAgIF9pdGVyYXRlUG9zaXRpb25hbCA/IHBvc2l0aW9uYWwgOiBuYW1lZDsKCiAgQG92ZXJyaWRlCiAgVHlwZUluZm9ybWF0aW9uIGdldCBjdXJyZW50ID0+IF9jdXJyZW50SXRlcmF0b3IuY3VycmVudDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfaXRlcmF0ZVBvc2l0aW9uYWwgJiYgcG9zaXRpb25hbC5tb3ZlTmV4dCgpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX2l0ZXJhdGVQb3NpdGlvbmFsID0gZmFsc2U7CiAgICByZXR1cm4gbmFtZWQubW92ZU5leHQoKTsKICB9Cn0KCi8vLyBQbGFjZWhvbGRlciBmb3IgaW5mZXJyZWQgdHlwZXMgb2YgbG9jYWwgdmFyaWFibGVzLgpjbGFzcyBMb2NhbHNIYW5kbGVyIHsKICBmaW5hbCBWYXJpYWJsZVNjb3BlIF9sb2NhbHM7CgogIExvY2Fsc0hhbmRsZXIoKSA6IF9sb2NhbHMgPSBuZXcgVmFyaWFibGVTY29wZSgpOwoKICBMb2NhbHNIYW5kbGVyLmZyb20oTG9jYWxzSGFuZGxlciBvdGhlcikKICAgICAgOiBfbG9jYWxzID0gbmV3IFZhcmlhYmxlU2NvcGUocGFyZW50OiBvdGhlci5fbG9jYWxzKTsKCiAgTG9jYWxzSGFuZGxlci50cnlCbG9jayhMb2NhbHNIYW5kbGVyIG90aGVyLCBpci5UcmVlTm9kZSBibG9jaykKICAgICAgOiBfbG9jYWxzID0gbmV3IFZhcmlhYmxlU2NvcGUudHJ5QmxvY2soYmxvY2ssIHBhcmVudDogb3RoZXIuX2xvY2Fscyk7CgogIExvY2Fsc0hhbmRsZXIuZGVlcENvcHlPZihMb2NhbHNIYW5kbGVyIG90aGVyKQogICAgICA6IF9sb2NhbHMgPSBuZXcgVmFyaWFibGVTY29wZS5kZWVwQ29weU9mKG90aGVyLl9sb2NhbHMpOwoKICBUeXBlSW5mb3JtYXRpb24gdXNlKEluZmVycmVyRW5naW5lIGluZmVycmVyLCBMb2NhbCBsb2NhbCkgewogICAgcmV0dXJuIF9sb2NhbHNbbG9jYWxdOwogIH0KCiAgdm9pZCB1cGRhdGUoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIsIExvY2FsIGxvY2FsLCBUeXBlSW5mb3JtYXRpb24gdHlwZSwKICAgICAgaXIuTm9kZSBub2RlLCBEYXJ0VHlwZSBzdGF0aWNUeXBlLCBMb2NhbHNIYW5kbGVyIHRyeUJsb2NrKSB7CiAgICBpZiAodHJ5QmxvY2sgIT0gbnVsbCkgewogICAgICAvLyBXZSBkb24ndCBrbm93IGlmIGFuIGFzc2lnbm1lbnQgaW4gYSB0cnkgYmxvY2sKICAgICAgLy8gd2lsbCBiZSBleGVjdXRlZCwgc28gYWxsIGFzc2lnbm1lbnRzIGluIHRoYXQgYmxvY2sgYXJlCiAgICAgIC8vIHBvdGVudGlhbCB0eXBlcyBhZnRlciB3ZSBoYXZlIGxlZnQgaXQuIFdlIHVwZGF0ZSB0aGUgcGFyZW50CiAgICAgIC8vIG9mIHRoZSB0cnkgYmxvY2sgc28gdGhhdCwgYXQgZXhpdCBvZiB0aGUgdHJ5IGJsb2NrLCB3ZSBnZXQKICAgICAgLy8gdGhlIHJpZ2h0IHBoaSBmb3IgaXQuCiAgICAgIFR5cGVJbmZvcm1hdGlvbiBleGlzdGluZyA9IHRyeUJsb2NrLl9sb2NhbHMucGFyZW50W2xvY2FsXTsKICAgICAgaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKICAgICAgICBUeXBlSW5mb3JtYXRpb24gcGhpVHlwZSA9IGluZmVycmVyLnR5cGVzLmFsbG9jYXRlUGhpKAogICAgICAgICAgICB0cnlCbG9jay5fbG9jYWxzLnRyeUJsb2NrLCBsb2NhbCwgZXhpc3RpbmcsCiAgICAgICAgICAgIGlzVHJ5OiB0cnlCbG9jay5fbG9jYWxzLmlzVHJ5KTsKICAgICAgICBUeXBlSW5mb3JtYXRpb24gaW5wdXRUeXBlID0KICAgICAgICAgICAgaW5mZXJyZXIudHlwZXMuYWRkUGhpSW5wdXQobG9jYWwsIHBoaVR5cGUsIHR5cGUpOwogICAgICAgIHRyeUJsb2NrLl9sb2NhbHMucGFyZW50W2xvY2FsXSA9IGlucHV0VHlwZTsKICAgICAgfQogICAgICAvLyBVcGRhdGUgdGhlIGN1cnJlbnQgaGFuZGxlciB1bmNvbmRpdGlvbmFsbHkgd2l0aCB0aGUgbmV3CiAgICAgIC8vIHR5cGUuCiAgICAgIF9sb2NhbHNbbG9jYWxdID0gdHlwZTsKICAgIH0gZWxzZSB7CiAgICAgIF9sb2NhbHNbbG9jYWxdID0gdHlwZTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSBqb2luIGJldHdlZW4gdGhpcyBsb2NhbHMgaGFuZGxlciBhbmQgW290aGVyXSB3aGljaCBtb2RlbHMgdGhlCiAgLy8vIGZsb3cgdGhyb3VnaCBlaXRoZXIgdGhpcyBvciBbb3RoZXJdLgogIC8vLwogIC8vLyBJZiBbaW5QbGFjZV0gaXMgYHRydWVgLCB0aGUgdmFyaWFibGUgdHlwZXMgaW4gdGhpcyBsb2NhbHMgaGFuZGxlciBhcmUKICAvLy8gcmVwbGFjZWQgYnkgdGhlIHZhcmlhYmxlcyB0eXBlcyBpbiBbb3RoZXJdLiBPdGhlcndpc2UgdGhlIHZhcmlhYmxlIHR5cGVzCiAgLy8vIGZyb20gYm90aCBhcmUgbWVyZ2VkIHdpdGggYSBwaGkgdHlwZS4KICBMb2NhbHNIYW5kbGVyIG1lcmdlRmxvdyhJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwgTG9jYWxzSGFuZGxlciBvdGhlciwKICAgICAge2Jvb2wgaW5QbGFjZTogZmFsc2V9KSB7CiAgICBWYXJpYWJsZVNjb3BlIGNvbW1vbiA9IF9sb2NhbHMuY29tbW9uUGFyZW50KG90aGVyLl9sb2NhbHMpOwogICAgYXNzZXJ0KAogICAgICAgIGNvbW1vbiAhPSBudWxsLAogICAgICAgICJObyBjb21tb24gcGFyZW50IGZvclxuIgogICAgICAgICIxOiR7X2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfVxuIgogICAgICAgICIyOiR7b3RoZXIuX2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfSIpOwogICAgYXNzZXJ0KAogICAgICAgIGNvbW1vbiA9PSBfbG9jYWxzIHx8IF9sb2NhbHMudmFyaWFibGVzID09IG51bGwsCiAgICAgICAgIk5vbi1lbXB0eSBjb21tb24gcGFyZW50IGZvclxuIgogICAgICAgICIxOiR7Y29tbW9uLnRvU3RydWN0dXJlZFRleHQoJyAgJyl9XG4iCiAgICAgICAgIjI6JHtfbG9jYWxzLnRvU3RydWN0dXJlZFRleHQoJyAgJyl9Iik7CiAgICBvdGhlci5fbG9jYWxzLmZvckVhY2hMb2NhbFVudGlsU2NvcGUoY29tbW9uLAogICAgICAgIChMb2NhbCBsb2NhbCwgVHlwZUluZm9ybWF0aW9uIHR5cGUpIHsKICAgICAgVHlwZUluZm9ybWF0aW9uIG15VHlwZSA9IF9sb2NhbHNbbG9jYWxdOwogICAgICBpZiAobXlUeXBlID09IG51bGwpIHJldHVybjsgLy8gVmFyaWFibGUgaXMgb25seSBkZWZpbmVkIGluIFtvdGhlcl0uCiAgICAgIGlmICh0eXBlID09IG15VHlwZSkgcmV0dXJuOwogICAgICBfbG9jYWxzW2xvY2FsXSA9CiAgICAgICAgICBpblBsYWNlID8gdHlwZSA6IGluZmVycmVyLnR5cGVzLmFsbG9jYXRlRGlhbW9uZFBoaShteVR5cGUsIHR5cGUpOwogICAgfSk7CiAgICByZXR1cm4gdGhpczsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBqb2luIGJldHdlZW4gW3RoZW5CcmFuY2hdIGFuZCBbZWxzZUJyYW5jaF0gd2hpY2ggbW9kZWxzIHRoZQogIC8vLyBmbG93IHRocm91Z2ggZWl0aGVyIFt0aGVuQnJhbmNoXSBvciBbZWxzZUJyYW5jaF0uCiAgTG9jYWxzSGFuZGxlciBtZXJnZURpYW1vbmRGbG93KEluZmVycmVyRW5naW5lIGluZmVycmVyLAogICAgICBMb2NhbHNIYW5kbGVyIHRoZW5CcmFuY2gsIExvY2Fsc0hhbmRsZXIgZWxzZUJyYW5jaCkgewogICAgYXNzZXJ0KGVsc2VCcmFuY2ggIT0gbnVsbCk7CgogICAgdm9pZCBtZXJnZUxvY2FsKExvY2FsIGxvY2FsKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBteVR5cGUgPSBfbG9jYWxzW2xvY2FsXTsKICAgICAgaWYgKG15VHlwZSA9PSBudWxsKSByZXR1cm47CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBlbHNlVHlwZSA9IGVsc2VCcmFuY2guX2xvY2Fsc1tsb2NhbF07CiAgICAgIFR5cGVJbmZvcm1hdGlvbiB0aGVuVHlwZSA9IHRoZW5CcmFuY2guX2xvY2Fsc1tsb2NhbF07CiAgICAgIGlmICh0aGVuVHlwZSA9PSBlbHNlVHlwZSkgewogICAgICAgIF9sb2NhbHNbbG9jYWxdID0gdGhlblR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2xvY2Fsc1tsb2NhbF0gPSBpbmZlcnJlci50eXBlcy5hbGxvY2F0ZURpYW1vbmRQaGkodGhlblR5cGUsIGVsc2VUeXBlKTsKICAgICAgfQogICAgfQoKICAgIFZhcmlhYmxlU2NvcGUgY29tbW9uID0gX2xvY2Fscy5jb21tb25QYXJlbnQodGhlbkJyYW5jaC5fbG9jYWxzKTsKICAgIGFzc2VydCgKICAgICAgICBjb21tb24gIT0gbnVsbCwKICAgICAgICAiTm8gY29tbW9uIHBhcmVudCBmb3JcbiIKICAgICAgICAiMToke19sb2NhbHMudG9TdHJ1Y3R1cmVkVGV4dCgnICAnKX1cbiIKICAgICAgICAiMjoke3RoZW5CcmFuY2guX2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfSIpOwogICAgYXNzZXJ0KAogICAgICAgIF9sb2NhbHMuY29tbW9uUGFyZW50KGVsc2VCcmFuY2guX2xvY2FscykgPT0gY29tbW9uLAogICAgICAgICJEaWZmIGNvbW1vbiBwYXJlbnQgZm9yXG4iCiAgICAgICAgIjE6JHtjb21tb24udG9TdHJ1Y3R1cmVkVGV4dCgnICAnKX1cbjI6IgogICAgICAgICIke19sb2NhbHMuY29tbW9uUGFyZW50KGVsc2VCcmFuY2guX2xvY2Fscyk/LnRvU3RydWN0dXJlZFRleHQoJyAgJyl9Iik7CiAgICBhc3NlcnQoCiAgICAgICAgY29tbW9uID09IF9sb2NhbHMgfHwgX2xvY2Fscy52YXJpYWJsZXMgPT0gbnVsbCwKICAgICAgICAiTm9uLWVtcHR5IGNvbW1vbiBwYXJlbnQgZm9yXG4iCiAgICAgICAgImNvbW1vbjoke2NvbW1vbi50b1N0cnVjdHVyZWRUZXh0KCcgICcpfVxuIgogICAgICAgICIxOiR7X2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfVxuIgogICAgICAgICIyOiR7dGhlbkJyYW5jaC5fbG9jYWxzLnRvU3RydWN0dXJlZFRleHQoJyAgJyl9Iik7CiAgICB0aGVuQnJhbmNoLl9sb2NhbHMuZm9yRWFjaExvY2FsVW50aWxTY29wZShjb21tb24sIChMb2NhbCBsb2NhbCwgXykgewogICAgICBtZXJnZUxvY2FsKGxvY2FsKTsKICAgIH0pOwogICAgZWxzZUJyYW5jaC5fbG9jYWxzLmZvckVhY2hMb2NhbFVudGlsU2NvcGUoY29tbW9uLCAoTG9jYWwgbG9jYWwsIF8pIHsKICAgICAgLy8gRGlzY2FyZCBsb2NhbHMgd2UgYWxyZWFkeSBwcm9jZXNzZWQgd2hlbiBpdGVyYXRpbmcgb3ZlcgogICAgICAvLyBbdGhlbkJyYW5jaF0ncyBsb2NhbHMuCiAgICAgIGlmICghdGhlbkJyYW5jaC5fbG9jYWxzLnVwZGF0ZXMobG9jYWwpKSBtZXJnZUxvY2FsKGxvY2FsKTsKICAgIH0pOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICAvLy8gTWVyZ2UgYWxsIFtMb2NhbHNIYW5kbGVyXSBpbiBbaGFuZGxlcnNdIGludG8gWzp0aGlzOl0uCiAgLy8vCiAgLy8vIElmIFtrZWVwT3duTG9jYWxzXSBpcyB0cnVlLCB0aGUgdHlwZXMgb2YgbG9jYWxzIGluIHRoaXMKICAvLy8gW0xvY2Fsc0hhbmRsZXJdIGFyZSBiZWluZyB1c2VkIGluIHRoZSBtZXJnZS4gW2tlZXBPd25Mb2NhbHNdCiAgLy8vIHNob3VsZCBiZSB0cnVlIGlmIHRoaXMgW0xvY2Fsc0hhbmRsZXJdLCB0aGUgZG9taW5hdG9yIG9mCiAgLy8vIGFsbCBbaGFuZGxlcnNdLCBhbHNvIGRpcmVjdGx5IGZsb3dzIGludG8gdGhlIGpvaW4gcG9pbnQsCiAgLy8vIHRoYXQgaXMgdGhlIGNvZGUgYWZ0ZXIgYWxsIFtoYW5kbGVyc10uIEZvciBleGFtcGxlLCBjb25zaWRlcjoKICAvLy8KICAvLy8gWzogc3dpdGNoICguLi4pIHsKICAvLy8gICAgICBjYXNlIDE6IC4uLjsgYnJlYWs7CiAgLy8vICAgIH0KICAvLy8gOl0KICAvLy8KICAvLy8gVGhlIFtMb2NhbHNIYW5kbGVyXSBhdCBlbnRyeSBvZiB0aGUgc3dpdGNoIGFsc28gZmxvd3MgaW50byB0aGUKICAvLy8gZXhpdCBvZiB0aGUgc3dpdGNoLCBiZWNhdXNlIHRoZXJlIGlzIG5vIGRlZmF1bHQgY2FzZS4gU28gdGhlCiAgLy8vIHR5cGVzIG9mIGxvY2FscyBhdCBlbnRyeSBvZiB0aGUgc3dpdGNoIGhhdmUgdG8gdGFrZSBwYXJ0IHRvIHRoZQogIC8vLyBtZXJnZS4KICAvLy8KICAvLy8gVGhlIGFib3ZlIHNpdHVhdGlvbiBpcyBhbHNvIHRydWUgZm9yIGxhYmVsZWQgc3RhdGVtZW50cyBsaWtlCiAgLy8vCiAgLy8vIFs6IEw6IHsKICAvLy8gICAgICBpZiAoLi4uKSBicmVhazsKICAvLy8gICAgICAuLi4KICAvLy8gICAgfQogIC8vLyA6XQogIC8vLwogIC8vLyB3aGVyZSBbOnRoaXM6XSBpcyB0aGUgW0xvY2Fsc0hhbmRsZXJdIGZvciB0aGUgcGF0aHMgdGhyb3VnaCB0aGUKICAvLy8gbGFiZWxlZCBzdGF0ZW1lbnQgdGhhdCBkbyBub3QgYnJlYWsgb3V0LgogIExvY2Fsc0hhbmRsZXIgbWVyZ2VBZnRlckJyZWFrcygKICAgICAgSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIsIEl0ZXJhYmxlPExvY2Fsc0hhbmRsZXI+IGhhbmRsZXJzLAogICAgICB7Ym9vbCBrZWVwT3duTG9jYWxzOiB0cnVlfSkgewogICAgaXIuTm9kZSB0cnlCbG9jayA9IF9sb2NhbHMudHJ5QmxvY2s7CiAgICAvLyBVc2UgYSBzZXBhcmF0ZSBsb2NhbHMgaGFuZGxlciB0byBwZXJmb3JtIHRoZSBtZXJnZSBpbiwgc28gdGhhdCBQaGkKICAgIC8vIGNyZWF0aW9uIGRvZXMgbm90IGludmFsaWRhdGUgcHJldmlvdXMgdHlwZSBrbm93bGVkZ2Ugd2hpbGUgd2UgbWlnaHQKICAgIC8vIHN0aWxsIGxvb2sgaXQgdXAuCiAgICBWYXJpYWJsZVNjb3BlIG1lcmdlZCA9IHRyeUJsb2NrICE9IG51bGwKICAgICAgICA/IG5ldyBWYXJpYWJsZVNjb3BlLnRyeUJsb2NrKHRyeUJsb2NrLCBwYXJlbnQ6IF9sb2NhbHMpCiAgICAgICAgOiBuZXcgVmFyaWFibGVTY29wZShwYXJlbnQ6IF9sb2NhbHMpOwogICAgU2V0PExvY2FsPiBzZWVuTG9jYWxzID0gbmV3IFNldGxldDxMb2NhbD4oKTsKICAgIC8vIE1lcmdlIGFsbCBvdGhlciBoYW5kbGVycy4KICAgIGZvciAoTG9jYWxzSGFuZGxlciBoYW5kbGVyIGluIGhhbmRsZXJzKSB7CiAgICAgIFZhcmlhYmxlU2NvcGUgY29tbW9uID0gX2xvY2Fscy5jb21tb25QYXJlbnQoaGFuZGxlci5fbG9jYWxzKTsKICAgICAgYXNzZXJ0KAogICAgICAgICAgY29tbW9uICE9IG51bGwsCiAgICAgICAgICAiTm8gY29tbW9uIHBhcmVudCBmb3JcbiIKICAgICAgICAgICIxOiR7X2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfVxuIgogICAgICAgICAgIjI6JHtoYW5kbGVyLl9sb2NhbHMudG9TdHJ1Y3R1cmVkVGV4dCgnICAnKX0iKTsKICAgICAgYXNzZXJ0KAogICAgICAgICAgY29tbW9uID09IF9sb2NhbHMgfHwgX2xvY2Fscy52YXJpYWJsZXMgPT0gbnVsbCwKICAgICAgICAgICJOb24tZW1wdHkgY29tbW9uIHBhcmVudCBmb3JcbiIKICAgICAgICAgICJjb21tb246JHtjb21tb24udG9TdHJ1Y3R1cmVkVGV4dCgnICAnKX1cbiIKICAgICAgICAgICIxOiR7X2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfVxuIgogICAgICAgICAgIjI6JHtoYW5kbGVyLl9sb2NhbHMudG9TdHJ1Y3R1cmVkVGV4dCgnICAnKX0iKTsKICAgICAgaGFuZGxlci5fbG9jYWxzLmZvckVhY2hMb2NhbFVudGlsU2NvcGUoY29tbW9uLCAobG9jYWwsIG90aGVyVHlwZSkgewogICAgICAgIFR5cGVJbmZvcm1hdGlvbiBteVR5cGUgPSBtZXJnZWRbbG9jYWxdOwogICAgICAgIGlmIChteVR5cGUgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgIFR5cGVJbmZvcm1hdGlvbiBuZXdUeXBlOwogICAgICAgIGlmICghc2VlbkxvY2Fscy5jb250YWlucyhsb2NhbCkpIHsKICAgICAgICAgIG5ld1R5cGUgPSBpbmZlcnJlci50eXBlcy5hbGxvY2F0ZVBoaSgKICAgICAgICAgICAgICBtZXJnZWQudHJ5QmxvY2ssIGxvY2FsLCBvdGhlclR5cGUsCiAgICAgICAgICAgICAgaXNUcnk6IG1lcmdlZC5pc1RyeSk7CiAgICAgICAgICBzZWVuTG9jYWxzLmFkZChsb2NhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5ld1R5cGUgPSBpbmZlcnJlci50eXBlcy5hZGRQaGlJbnB1dChsb2NhbCwgbXlUeXBlLCBvdGhlclR5cGUpOwogICAgICAgIH0KICAgICAgICBpZiAobmV3VHlwZSAhPSBteVR5cGUpIHsKICAgICAgICAgIG1lcmdlZFtsb2NhbF0gPSBuZXdUeXBlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICAvLyBJZiB3ZSB3YW50IHRvIGtlZXAgb3duIGxvY2Fscywgd2UgbWVyZ2UgW3NlZW5Mb2NhbHNdIGZyb20gW3RoaXNdIGludG8KICAgIC8vIFttZXJnZWRdIHRvIHVwZGF0ZSB0aGUgUGhpIG5vZGVzIHdpdGggb3JpZ2luYWwgdmFsdWVzLgogICAgaWYgKGtlZXBPd25Mb2NhbHMpIHsKICAgICAgZm9yIChMb2NhbCB2YXJpYWJsZSBpbiBzZWVuTG9jYWxzKSB7CiAgICAgICAgVHlwZUluZm9ybWF0aW9uIG9yaWdpbmFsVHlwZSA9IF9sb2NhbHNbdmFyaWFibGVdOwogICAgICAgIGlmIChvcmlnaW5hbFR5cGUgIT0gbnVsbCkgewogICAgICAgICAgbWVyZ2VkW3ZhcmlhYmxlXSA9IGluZmVycmVyLnR5cGVzCiAgICAgICAgICAgICAgLmFkZFBoaUlucHV0KHZhcmlhYmxlLCBtZXJnZWRbdmFyaWFibGVdLCBvcmlnaW5hbFR5cGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gQ2xlYW4gdXAgUGhpIG5vZGVzIHdpdGggc2luZ2xlIGlucHV0IGFuZCBzdG9yZSBiYWNrIHJlc3VsdCBpbnRvCiAgICAvLyBhY3R1YWwgbG9jYWxzIGhhbmRsZXIuCiAgICBtZXJnZWQuZm9yRWFjaExvY2FsVW50aWxTY29wZShtZXJnZWQsCiAgICAgICAgKExvY2FsIHZhcmlhYmxlLCBUeXBlSW5mb3JtYXRpb24gdHlwZSkgewogICAgICBfbG9jYWxzW3ZhcmlhYmxlXSA9IGluZmVycmVyLnR5cGVzLnNpbXBsaWZ5UGhpKHRyeUJsb2NrLCB2YXJpYWJsZSwgdHlwZSk7CiAgICB9KTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgLy8vIE1lcmdlIGFsbCBbTG9jYWxzSGFuZGxlcl0gaW4gW2hhbmRsZXJzXSBpbnRvIHRoaXMgaGFuZGxlci4KICAvLy8gUmV0dXJucyB3aGV0aGVyIGEgbG9jYWwgaW4gdGhpcyBoYW5kbGVyIGhhcyBjaGFuZ2VkLgogIGJvb2wgbWVyZ2VBbGwoSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXIsIEl0ZXJhYmxlPExvY2Fsc0hhbmRsZXI+IGhhbmRsZXJzKSB7CiAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKICAgIGhhbmRsZXJzLmZvckVhY2goKExvY2Fsc0hhbmRsZXIgb3RoZXIpIHsKICAgICAgVmFyaWFibGVTY29wZSBjb21tb24gPSBfbG9jYWxzLmNvbW1vblBhcmVudChvdGhlci5fbG9jYWxzKTsKICAgICAgYXNzZXJ0KAogICAgICAgICAgY29tbW9uICE9IG51bGwsCiAgICAgICAgICAiTm8gY29tbW9uIHBhcmVudCBmb3JcbiIKICAgICAgICAgICIxOiR7X2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfVxuIgogICAgICAgICAgIjI6JHtvdGhlci5fbG9jYWxzLnRvU3RydWN0dXJlZFRleHQoJyAgJyl9Iik7CiAgICAgIGFzc2VydCgKICAgICAgICAgIGNvbW1vbiA9PSBfbG9jYWxzIHx8IF9sb2NhbHMudmFyaWFibGVzID09IG51bGwsCiAgICAgICAgICAiTm9uLWVtcHR5IGNvbW1vbiBwYXJlbnQgZm9yXG4iCiAgICAgICAgICAiY29tbW9uOiR7Y29tbW9uLnRvU3RydWN0dXJlZFRleHQoJyAgJyl9XG4iCiAgICAgICAgICAiMToke19sb2NhbHMudG9TdHJ1Y3R1cmVkVGV4dCgnICAnKX1cbiIKICAgICAgICAgICIyOiR7b3RoZXIuX2xvY2Fscy50b1N0cnVjdHVyZWRUZXh0KCcgICcpfSIpOwogICAgICBvdGhlci5fbG9jYWxzLmZvckVhY2hMb2NhbFVudGlsU2NvcGUoY29tbW9uLCAobG9jYWwsIG90aGVyVHlwZSkgewogICAgICAgIFR5cGVJbmZvcm1hdGlvbiBteVR5cGUgPSBfbG9jYWxzW2xvY2FsXTsKICAgICAgICBpZiAobXlUeXBlID09IG51bGwpIHJldHVybjsKICAgICAgICBUeXBlSW5mb3JtYXRpb24gbmV3VHlwZSA9CiAgICAgICAgICAgIGluZmVycmVyLnR5cGVzLmFkZFBoaUlucHV0KGxvY2FsLCBteVR5cGUsIG90aGVyVHlwZSk7CiAgICAgICAgaWYgKG5ld1R5cGUgIT0gbXlUeXBlKSB7CiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgIF9sb2NhbHNbbG9jYWxdID0gbmV3VHlwZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gY2hhbmdlZDsKICB9CgogIHZvaWQgc3RhcnRMb29wKEluZmVycmVyRW5naW5lIGluZmVycmVyLCBpci5Ob2RlIGxvb3ApIHsKICAgIF9sb2NhbHMuZm9yRWFjaExvY2FsKChMb2NhbCB2YXJpYWJsZSwgVHlwZUluZm9ybWF0aW9uIHR5cGUpIHsKICAgICAgVHlwZUluZm9ybWF0aW9uIG5ld1R5cGUgPQogICAgICAgICAgaW5mZXJyZXIudHlwZXMuYWxsb2NhdGVMb29wUGhpKGxvb3AsIHZhcmlhYmxlLCB0eXBlLCBpc1RyeTogZmFsc2UpOwogICAgICBpZiAobmV3VHlwZSAhPSB0eXBlKSB7CiAgICAgICAgX2xvY2Fsc1t2YXJpYWJsZV0gPSBuZXdUeXBlOwogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgZW5kTG9vcChJbmZlcnJlckVuZ2luZSBpbmZlcnJlciwgaXIuTm9kZSBsb29wKSB7CiAgICBfbG9jYWxzLmZvckVhY2hMb2NhbCgoTG9jYWwgdmFyaWFibGUsIFR5cGVJbmZvcm1hdGlvbiB0eXBlKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBuZXdUeXBlID0KICAgICAgICAgIGluZmVycmVyLnR5cGVzLnNpbXBsaWZ5UGhpKGxvb3AsIHZhcmlhYmxlLCB0eXBlKTsKICAgICAgaWYgKG5ld1R5cGUgIT0gdHlwZSkgewogICAgICAgIF9sb2NhbHNbdmFyaWFibGVdID0gbmV3VHlwZTsKICAgICAgfQogICAgfSk7CiAgfQoKICBTdHJpbmcgdG9TdHJ1Y3R1cmVkVGV4dChTdHJpbmcgaW5kZW50KSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBfdG9TdHJ1Y3R1cmVkVGV4dChzYiwgaW5kZW50KTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgdm9pZCBfdG9TdHJ1Y3R1cmVkVGV4dChTdHJpbmdCdWZmZXIgc2IsIFN0cmluZyBpbmRlbnQpIHsKICAgIHNiLndyaXRlKCdMb2NhbHNIYW5kbGVyKCRoYXNoQ29kZSkgWycpOwogICAgc2Iud3JpdGUoJ1xuJHtpbmRlbnR9ICBsb2NhbHM6Jyk7CiAgICBfbG9jYWxzLl90b1N0cnVjdHVyZWRUZXh0KHNiLCAnJHtpbmRlbnR9ICAgICcpOwogICAgc2Iud3JpdGUoJ1xuXScpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ0xvY2Fsc0hhbmRsZXIoJyk7CiAgICBzYi53cml0ZSgnbG9jYWxzPSRfbG9jYWxzJyk7CiAgICBzYi53cml0ZSgnKScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CoJjAE5OPAEYAS0oJCEaHB8gAUNHRkYyFjEGPRQBKQE5HgEtGgEeAR8fHB4tATcfHC5BQgQBMCwTRSMoHyYTOgEvJgFLBk1GMAFONCYXKCkoKR0wDRMGBAEwHEc3BhMEATwaHTUGIAQBUD0fS0IEASAbNCAeHSszIhsKBicOBhpEDQ4ZIDQyBgQBRCUEASEpLAQBKyojGgQBOywsGkkGHEkGHSs+LTwKBhooNgYTBAEMFj8hBAIBPSEsFgFLMBUBHR8eAUgtKwFKJD0EAT4fHjgaBAExMgQBRBgEAUw2RVAfAU1AJCMBKjUBQj8lTggBSEURBAIBNz4qLClLS00EARkfGgEMNgEMTgEMRwEMHEQ6Mj4GFyE1CBMEAQxNAUABDC8bHQQBDC05BAEMH0MEAgFELikiATIzMAE0LwEMOwEMFDcTBiAdBAIBNxYfATMBKjwBQUwBMD8BPhsEAUpDHDdARUQfQR4+OCwkPjQIQQ8dDR0GBAFQKwZMTyxIH0AMGCEwNgw4KC8wMS4vSiIXTAgRBAFOODo8IAEjLyI8PCIjD1AIBgFFDBghMDsMPCMxUAw4KDQwO0kZCElBIEEIEQQBPQY+Qz8/RAYYHwsJBkVDRg0GQwYOGw8LCQZGLyJBJClKSxksQC4xIS5EDhojMjoOOio2MjpKMCQhKzAxJCERSgohIwoKBk0+GSs6JCxGCggGRx4qMVAIEQQBQTtNGi1CDhojMjgOOio2MjhIMSQiQiEaJAoKCBQEATpCIE4dJQgIBAE4QiA8HSUICAQBKyojGgQBOywmNBUEAQwWKiAhExoEAgExcGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvbG9jYWxzX2hhbmRsZXIuZGFydDdzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci9saXN0X3RyYWNlci5kYXJ0k+wvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBjb21waWxlci5zcmMuaW5mZXJyZXIubGlzdF90cmFjZXI7CgppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JyBzaG93IFNldGxldDsKaW1wb3J0ICdub2RlX3RyYWNlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX2dyYXBoX25vZGVzLmRhcnQnOwoKLy8vIEEgc2V0IG9mIHNlbGVjdG9yIG5hbWVzIHRoYXQgW0xpc3RdIGltcGxlbWVudHMsIHRoYXQgd2Uga25vdyBkbyBub3QKLy8vIGNoYW5nZSB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSBsaXN0LCBvciBsZXQgdGhlIGxpc3QgZXNjYXBlIHRvIGNvZGUKLy8vIHRoYXQgbWlnaHQgY2hhbmdlIHRoZSBlbGVtZW50IHR5cGUuClNldDxTdHJpbmc+IG9rTGlzdFNlbGVjdG9yc1NldCA9IG5ldyBTZXQ8U3RyaW5nPi5mcm9tKGNvbnN0IDxTdHJpbmc+WwogIC8vIEZyb20gT2JqZWN0LgogICc9PScsCiAgJ2hhc2hDb2RlJywKICAndG9TdHJpbmcnLAogICdub1N1Y2hNZXRob2QnLAogICdydW50aW1lVHlwZScsCgogIC8vIEZyb20gSXRlcmFibGUuCiAgJ2l0ZXJhdG9yJywKICAnbWFwJywKICAnd2hlcmUnLAogICdleHBhbmQnLAogICdjb250YWlucycsCiAgJ2ZvckVhY2gnLAogICdyZWR1Y2UnLAogICdmb2xkJywKICAnZXZlcnknLAogICdqb2luJywKICAnYW55JywKICAndG9MaXN0JywKICAndG9TZXQnLAogICdsZW5ndGgnLAogICdpc0VtcHR5JywKICAnaXNOb3RFbXB0eScsCiAgJ3Rha2UnLAogICd0YWtlV2hpbGUnLAogICdza2lwJywKICAnc2tpcFdoaWxlJywKICAnZmlyc3QnLAogICdsYXN0JywKICAnc2luZ2xlJywKICAnZmlyc3RXaGVyZScsCiAgJ2xhc3RXaGVyZScsCiAgJ3NpbmdsZVdoZXJlJywKICAnZWxlbWVudEF0JywKCiAgLy8gRnJvbSBMaXN0LgogICdbXScsCiAgJ2xlbmd0aCcsCiAgJ3JldmVyc2VkJywKICAnc29ydCcsCiAgJ2luZGV4T2YnLAogICdsYXN0SW5kZXhPZicsCiAgJ2NsZWFyJywKICAncmVtb3ZlJywKICAncmVtb3ZlQXQnLAogICdyZW1vdmVMYXN0JywKICAncmVtb3ZlV2hlcmUnLAogICdyZXRhaW5XaGVyZScsCiAgJ3N1Ymxpc3QnLAogICdnZXRSYW5nZScsCiAgJ3JlbW92ZVJhbmdlJywKICAnYXNNYXAnLAoKICAvLyBGcm9tIEpTQXJyYXkuCiAgJ2NoZWNrTXV0YWJsZScsCiAgJ2NoZWNrR3Jvd2FibGUnLApdKTsKClNldDxTdHJpbmc+IGRvTm90Q2hhbmdlTGVuZ3RoU2VsZWN0b3JzU2V0ID0gbmV3IFNldDxTdHJpbmc+LmZyb20oY29uc3QgPFN0cmluZz5bCiAgLy8gRnJvbSBPYmplY3QuCiAgJz09JywKICAnaGFzaENvZGUnLAogICd0b1N0cmluZycsCiAgJ25vU3VjaE1ldGhvZCcsCiAgJ3J1bnRpbWVUeXBlJywKCiAgLy8gRnJvbSBJdGVyYWJsZS4KICAnaXRlcmF0b3InLAogICdtYXAnLAogICd3aGVyZScsCiAgJ2V4cGFuZCcsCiAgJ2NvbnRhaW5zJywKICAnZm9yRWFjaCcsCiAgJ3JlZHVjZScsCiAgJ2ZvbGQnLAogICdldmVyeScsCiAgJ2pvaW4nLAogICdhbnknLAogICd0b0xpc3QnLAogICd0b1NldCcsCiAgJ2xlbmd0aCcsCiAgJ2lzRW1wdHknLAogICdpc05vdEVtcHR5JywKICAndGFrZScsCiAgJ3Rha2VXaGlsZScsCiAgJ3NraXAnLAogICdza2lwV2hpbGUnLAogICdmaXJzdCcsCiAgJ2xhc3QnLAogICdzaW5nbGUnLAogICdmaXJzdFdoZXJlJywKICAnbGFzdFdoZXJlJywKICAnc2luZ2xlV2hlcmUnLAogICdlbGVtZW50QXQnLAoKICAvLyBGcm9tIExpc3QuCiAgJ1tdJywKICAnW109JywKICAnbGVuZ3RoJywKICAncmV2ZXJzZWQnLAogICdzb3J0JywKICAnaW5kZXhPZicsCiAgJ2xhc3RJbmRleE9mJywKICAnc3VibGlzdCcsCiAgJ2dldFJhbmdlJywKICAnYXNNYXAnLAoKICAvLyBGcm9tIEpTQXJyYXkuCiAgJ2NoZWNrTXV0YWJsZScsCiAgJ2NoZWNrR3Jvd2FibGUnLApdKTsKCmNsYXNzIExpc3RUcmFjZXJWaXNpdG9yIGV4dGVuZHMgVHJhY2VyVmlzaXRvciB7CiAgLy8gVGhlIFtTZXRdIG9mIGZvdW5kIGFzc2lnbm1lbnRzIHRvIHRoZSBsaXN0LgogIFNldDxUeXBlSW5mb3JtYXRpb24+IGFzc2lnbm1lbnRzID0gbmV3IFNldGxldDxUeXBlSW5mb3JtYXRpb24+KCk7CiAgYm9vbCBjYWxsc0dyb3dhYmxlTWV0aG9kID0gZmFsc2U7CgogIExpc3RUcmFjZXJWaXNpdG9yKHRyYWNlZFR5cGUsIGluZmVycmVyKSA6IHN1cGVyKHRyYWNlZFR5cGUsIGluZmVycmVyKTsKCiAgLy8vIFJldHVybnMgW3RydWVdIGlmIHRoZSBhbmFseXNpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBbZmFsc2VdIGlmIGl0CiAgLy8vIGJhaWxlZCBvdXQuIEluIHRoZSBmb3JtZXIgY2FzZSwgW2Fzc2lnbm1lbnRzXSBob2xkcyBhIGxpc3Qgb2YKICAvLy8gW1R5cGVJbmZvcm1hdGlvbl0gbm9kZXMgdGhhdCBmbG93IGludG8gdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGlzIGxpc3QuCiAgYm9vbCBydW4oKSB7CiAgICBhbmFseXplKCk7CiAgICBMaXN0VHlwZUluZm9ybWF0aW9uIGxpc3QgPSB0cmFjZWRUeXBlOwogICAgaWYgKGNvbnRpbnVlQW5hbHl6aW5nKSB7CiAgICAgIGlmICghY2FsbHNHcm93YWJsZU1ldGhvZCAmJiBsaXN0LmluZmVycmVkTGVuZ3RoID09IG51bGwpIHsKICAgICAgICBsaXN0LmluZmVycmVkTGVuZ3RoID0gbGlzdC5vcmlnaW5hbExlbmd0aDsKICAgICAgfQogICAgICBsaXN0LmFkZEZsb3dzSW50b1RhcmdldHMoZmxvd3NJbnRvKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICBjYWxsc0dyb3dhYmxlTWV0aG9kID0gdHJ1ZTsKICAgICAgYXNzaWdubWVudHMgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbihDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYmFpbG91dCgnUGFzc2VkIHRvIGEgY2xvc3VyZScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbihTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBzdXBlci52aXNpdFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKGluZm8pOwogICAgTWVtYmVyRW50aXR5IGNhbGxlZCA9IGluZm8uY2FsbGVkRWxlbWVudDsKICAgIGlmIChpbmZlcnJlci5jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5pc0ZvcmVpZ24oY2FsbGVkKSAmJgogICAgICAgIGNhbGxlZC5uYW1lID09IElkZW50aWZpZXJzLkpTKSB7CiAgICAgIGJhaWxvdXQoJ1VzZWQgaW4gSlMgJHtpbmZvLmRlYnVnTmFtZX0nKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0RHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBzdXBlci52aXNpdER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbihpbmZvKTsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gaW5mby5zZWxlY3RvcjsKICAgIFN0cmluZyBzZWxlY3Rvck5hbWUgPSBzZWxlY3Rvci5uYW1lOwogICAgaWYgKGN1cnJlbnRVc2VyID09IGluZm8ucmVjZWl2ZXIpIHsKICAgICAgaWYgKCFva0xpc3RTZWxlY3RvcnNTZXQuY29udGFpbnMoc2VsZWN0b3JOYW1lKSkgewogICAgICAgIGlmIChzZWxlY3Rvci5pc0NhbGwpIHsKICAgICAgICAgIGludCBwb3NpdGlvbmFsTGVuZ3RoID0gaW5mby5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGg7CiAgICAgICAgICBpZiAoc2VsZWN0b3JOYW1lID09ICdhZGQnKSB7CiAgICAgICAgICAgIGlmIChwb3NpdGlvbmFsTGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICBhc3NpZ25tZW50cy5hZGQoaW5mby5hcmd1bWVudHMucG9zaXRpb25hbFswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3JOYW1lID09ICdpbnNlcnQnKSB7CiAgICAgICAgICAgIGlmIChwb3NpdGlvbmFsTGVuZ3RoID09IDIpIHsKICAgICAgICAgICAgICBhc3NpZ25tZW50cy5hZGQoaW5mby5hcmd1bWVudHMucG9zaXRpb25hbFsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJhaWxvdXQoJ1VzZWQgaW4gYSBub3Qtb2sgc2VsZWN0b3InKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNJbmRleFNldCkgewogICAgICAgICAgYXNzaWdubWVudHMuYWRkKGluZm8uYXJndW1lbnRzLnBvc2l0aW9uYWxbMV0pOwogICAgICAgIH0gZWxzZSBpZiAoIXNlbGVjdG9yLmlzSW5kZXgpIHsKICAgICAgICAgIGJhaWxvdXQoJ1VzZWQgaW4gYSBub3Qtb2sgc2VsZWN0b3InKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFkb05vdENoYW5nZUxlbmd0aFNlbGVjdG9yc1NldC5jb250YWlucyhzZWxlY3Rvck5hbWUpKSB7CiAgICAgICAgY2FsbHNHcm93YWJsZU1ldGhvZCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKHNlbGVjdG9yTmFtZSA9PSAnbGVuZ3RoJyAmJiBzZWxlY3Rvci5pc1NldHRlcikgewogICAgICAgIGNhbGxzR3Jvd2FibGVNZXRob2QgPSB0cnVlOwogICAgICAgIGFzc2lnbm1lbnRzLmFkZChpbmZlcnJlci50eXBlcy5udWxsVHlwZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNDYWxsICYmCiAgICAgICAgKGluZm8uaGFzQ2xvc3VyZUNhbGxUYXJnZXRzIHx8CiAgICAgICAgICAgIGluZm8uY29uY3JldGVUYXJnZXRzLmFueSgoZWxlbWVudCkgPT4gIWVsZW1lbnQuaXNGdW5jdGlvbikpKSB7CiAgICAgIGJhaWxvdXQoJ1Bhc3NlZCB0byBhIGNsb3N1cmUnKTsKICAgICAgcmV0dXJuOwogICAgfQogIH0KfQqA2ABOTjwBKwEfJDIoGyABSEgoRhIIDg4SEQEUDgkLDA4NDAoLCgkMCwwNEAoPCg8LCgwQDxEPARAIDA4KDRELDA4QERENDhELARMSEwQBURIIDg4SEQEUDgkLDA4NDAoLCgkMCwwNEAoPCg8LCgwQDxEPARAICQwOCg0RDQ4LARMSEwQBMDFEJAFJAUtETA8PKx1BMwgrEw0iGhQGBAEMTSQEAQxLNC5BKS8GBAEMTTUnKSg4H0MnKT0OMSk9DhMyFAwqOSgwEgoIQyQIOyQyCCInSyYOBgQCAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci9saXN0X3RyYWNlci5kYXJ0NnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL21hcF90cmFjZXIuZGFydJMeLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgY29tcGlsZXIuc3JjLmluZmVycmVyLm1hcF90cmFjZXI7CgppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwppbXBvcnQgJ25vZGVfdHJhY2VyLmRhcnQnOwppbXBvcnQgJ3R5cGVfZ3JhcGhfbm9kZXMuZGFydCc7CgpTZXQ8U3RyaW5nPiBva01hcFNlbGVjdG9yc1NldCA9IG5ldyBTZXQuZnJvbShjb25zdCA8U3RyaW5nPlsKICAvLyBGcm9tIE9iamVjdC4KICAiPT0iLAogICJoYXNoQ29kZSIsCiAgInRvU3RyaW5nIiwKICAibm9TdWNoTWV0aG9kIiwKICAicnVudGltZVR5cGUiLAogIC8vIEZyb20gTWFwCiAgIltdIiwKICAiaXNFbXB0eSIsCiAgImlzTm90RW1wdHkiLAogICJrZXlzIiwKICAibGVuZ3RoIiwKICAidmFsdWVzIiwKICAiY2xlYXIiLAogICJjb250YWluc0tleSIsCiAgImNvbnRhaW5zVmFsdWUiLAogICJmb3JFYWNoIiwKICAicmVtb3ZlIgpdKTsKCmNsYXNzIE1hcFRyYWNlclZpc2l0b3IgZXh0ZW5kcyBUcmFjZXJWaXNpdG9yIHsKICAvLyBUaGVzZSBsaXN0cyBhcmUgdXNlZCB0byBrZWVwIHRyYWNrIG9mIG5ld2x5IGRpc2NvdmVyZWQgYXNzaWdubWVudHMgdG8KICAvLyB0aGUgbWFwLiBOb3RlIHRoYXQgZWxlbWVudHMgYXQgY29ycmVzcG9uZGluZyBpbmRpY2VzIGFyZSBleHBlY3RlZCB0bwogIC8vIGJlbG9uZyB0byB0aGUgc2FtZSBhc3NpZ25tZW50IG9wZXJhdGlvbi4KICBMaXN0PFR5cGVJbmZvcm1hdGlvbj4ga2V5QXNzaWdubWVudHMgPSA8VHlwZUluZm9ybWF0aW9uPltdOwogIExpc3Q8VHlwZUluZm9ybWF0aW9uPiB2YWx1ZUFzc2lnbm1lbnRzID0gPFR5cGVJbmZvcm1hdGlvbj5bXTsKICAvLyBUaGlzIGxpc3QgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGFzc2lnbm1lbnRzIG9mIGVudGlyZSBtYXBzIHRvCiAgLy8gdGhpcyBtYXAuCiAgTGlzdDxNYXBUeXBlSW5mb3JtYXRpb24+IG1hcEFzc2lnbm1lbnRzID0gPE1hcFR5cGVJbmZvcm1hdGlvbj5bXTsKCiAgTWFwVHJhY2VyVmlzaXRvcih0cmFjZWRUeXBlLCBpbmZlcnJlcikgOiBzdXBlcih0cmFjZWRUeXBlLCBpbmZlcnJlcik7CgogIC8vLyBSZXR1cm5zIFt0cnVlXSBpZiB0aGUgYW5hbHlzaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgW2ZhbHNlXQogIC8vLyBpZiBpdCBiYWlsZWQgb3V0LiBJbiB0aGUgZm9ybWVyIGNhc2UsIFtrZXlBc3NpZ25tZW50c10gYW5kCiAgLy8vIFt2YWx1ZUFzc2lnbm1lbnRzXSBob2xkIGEgbGlzdCBvZiBbVHlwZUluZm9ybWF0aW9uXSBub2RlcyB0aGF0CiAgLy8vIGZsb3cgaW50byB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlcyBvZiB0aGlzIG1hcC4KICBib29sIHJ1bigpIHsKICAgIGFuYWx5emUoKTsKICAgIE1hcFR5cGVJbmZvcm1hdGlvbiBtYXAgPSB0cmFjZWRUeXBlOwogICAgaWYgKGNvbnRpbnVlQW5hbHl6aW5nKSB7CiAgICAgIG1hcC5hZGRGbG93c0ludG9UYXJnZXRzKGZsb3dzSW50byk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAga2V5QXNzaWdubWVudHMgPSB2YWx1ZUFzc2lnbm1lbnRzID0gbWFwQXNzaWdubWVudHMgPSBudWxsOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oQ2xvc3VyZUNhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGJhaWxvdXQoJ1Bhc3NlZCB0byBhIGNsb3N1cmUnKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oU3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgc3VwZXIudmlzaXRTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbihpbmZvKTsKICAgIE1lbWJlckVudGl0eSBjYWxsZWQgPSBpbmZvLmNhbGxlZEVsZW1lbnQ7CiAgICBpZiAoaW5mZXJyZXIuY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMuaXNGb3JlaWduKGNhbGxlZCkgJiYKICAgICAgICBjYWxsZWQubmFtZSA9PSBJZGVudGlmaWVycy5KUykgewogICAgICBiYWlsb3V0KCdVc2VkIGluIEpTICR7aW5mby5kZWJ1Z05hbWV9Jyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbihEeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgc3VwZXIudmlzaXREeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IGluZm8uc2VsZWN0b3I7CiAgICBTdHJpbmcgc2VsZWN0b3JOYW1lID0gc2VsZWN0b3IubmFtZTsKICAgIGlmIChjdXJyZW50VXNlciA9PSBpbmZvLnJlY2VpdmVyKSB7CiAgICAgIGlmICghb2tNYXBTZWxlY3RvcnNTZXQuY29udGFpbnMoc2VsZWN0b3JOYW1lKSkgewogICAgICAgIGlmIChzZWxlY3Rvci5pc0NhbGwpIHsKICAgICAgICAgIGlmIChzZWxlY3Rvck5hbWUgPT0gJ2FkZEFsbCcpIHsKICAgICAgICAgICAgLy8gQWxsIGtleXMgYW5kIHZhbHVlcyBmcm9tIHRoZSBhcmd1bWVudCBmbG93IGludG8KICAgICAgICAgICAgLy8gdGhlIG1hcC4KICAgICAgICAgICAgVHlwZUluZm9ybWF0aW9uIG1hcCA9IGluZm8uYXJndW1lbnRzLnBvc2l0aW9uYWxbMF07CiAgICAgICAgICAgIGlmIChtYXAgaXMgTWFwVHlwZUluZm9ybWF0aW9uKSB7CiAgICAgICAgICAgICAgaW5mZXJyZXIuYW5hbHl6ZU1hcEFuZEVucXVldWUobWFwKTsKICAgICAgICAgICAgICBtYXBBc3NpZ25tZW50cy5hZGQobWFwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZCBzZWxlY3QgYSBjb21wb25lbnQgZnJvbSBhIFtUeXBlSW5mb3JtYXRpb25dLAogICAgICAgICAgICAgIC8vIGxpa2UgdGhlIGtleXR5cGUgb3IgdmFsdWV0eXBlIGluIHRoaXMgY2FzZSwgd2UgY291bGQKICAgICAgICAgICAgICAvLyBwcm9wYWdhdGUgbW9yZSBoZXJlLgogICAgICAgICAgICAgIC8vIFRPRE8oaGVyaHV0KTogaW1wbGVtZW50IHNlbGVjdGlvbiBvbiBbVHlwZUluZm9ybWF0aW9uXS4KICAgICAgICAgICAgICBiYWlsb3V0KCdBZGRpbmcgbWFwIHdpdGggdW5rbm93biB0eXBlaW5mbyB0byBjdXJyZW50IG1hcCcpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yTmFtZSA9PSAncHV0SWZBYnNlbnQnKSB7CiAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIG5ldyBrZXksIHRoZSByZXN1bHQgdHlwZSBvZgogICAgICAgICAgICAvLyB0aGUgc2Vjb25kIGFyZ3VtZW50IGJlY29tZXMgYSBuZXcgdmFsdWUuCiAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZSB0eXBlIGluZm9ybWF0aW9uIGRvZXMgbm90CiAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgdHJhY2sgdGhlIHJldHVybiB0eXBlLCB5ZXQsIHNvIHdlIGhhdmUKICAgICAgICAgICAgLy8gdG8gZ28gdG8gZHluYW1pYy4KICAgICAgICAgICAgLy8gVE9ETyhoZXJodXQsMTY1MDcpOiBVc2UgcmV0dXJuIHR5cGUgb2YgY2xvc3VyZSBpbgogICAgICAgICAgICAvLyBNYXAucHV0SWZBYnNlbnQuCiAgICAgICAgICAgIGtleUFzc2lnbm1lbnRzLmFkZChpbmZvLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzBdKTsKICAgICAgICAgICAgdmFsdWVBc3NpZ25tZW50cy5hZGQoaW5mZXJyZXIudHlwZXMuZHluYW1pY1R5cGUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gSXQgd291bGQgYmUgbmljZSB0byBoYW5kbGUgW01hcC5rZXlzXSBhbmQgW01hcC52YWx1ZXNdLCB0b28uCiAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGN1cnJlbnRseSB0aG9zZSBjYWxscyBkbyBub3QgdHJpZ2dlciB0aGUgY3JlYXRpb24KICAgICAgICAgICAgLy8gb2YgYSBbTGlzdFR5cGVJbmZvcm1hdGlvbl0sIHNvIEkgaGF2ZSBub3doZXJlIHRvIHByb3BhZ2F0ZQogICAgICAgICAgICAvLyB0aGF0IGluZm9ybWF0aW9uLgogICAgICAgICAgICAvLyBUT0RPKGhlcmh1dCk6IGFkZCBzdXBwb3J0IGZvciBNYXAua2V5cyBhbmQgTWFwLnZhbHVlcy4KICAgICAgICAgICAgYmFpbG91dCgnTWFwIHVzZWQgaW4gYSBub3Qtb2sgc2VsZWN0b3IgWyRzZWxlY3Rvck5hbWVdJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmlzSW5kZXhTZXQpIHsKICAgICAgICAgIGtleUFzc2lnbm1lbnRzLmFkZChpbmZvLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzBdKTsKICAgICAgICAgIHZhbHVlQXNzaWdubWVudHMuYWRkKGluZm8uYXJndW1lbnRzLnBvc2l0aW9uYWxbMV0pOwogICAgICAgIH0gZWxzZSBpZiAoIXNlbGVjdG9yLmlzSW5kZXgpIHsKICAgICAgICAgIGJhaWxvdXQoJ01hcCB1c2VkIGluIGEgbm90LW9rIHNlbGVjdG9yIFskc2VsZWN0b3JOYW1lXScpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pc0NhbGwgJiYKICAgICAgICAoaW5mby5oYXNDbG9zdXJlQ2FsbFRhcmdldHMgfHwKICAgICAgICAgICAgaW5mby5jb25jcmV0ZVRhcmdldHMuYW55KChlbGVtZW50KSA9PiAhZWxlbWVudC5pc0Z1bmN0aW9uKSkpIHsKICAgICAgYmFpbG91dCgnUGFzc2VkIHRvIGEgY2xvc3VyZScpOwogICAgICByZXR1cm47CiAgICB9CiAgfQp9CoCGAE5OPAEqAR8kMhsgAT0SCA4OEhEOCA0QCgwMCxETDQsEAS9LSi4+QEYPRAFIAUVBRTUPDykdKhMGPxIEAQxNJAQBDEs0LkEpLwYEAQxNNScpKDcfKj8YQC0yJxVKRiZJSg42Qzg8QSFBID4+E0xKSiFGRhQMKjw+KEQSCggiJ0smDgYEAgEtcGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvbWFwX3RyYWNlci5kYXJ0NnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL3NldF90cmFjZXIuZGFydI2RLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgY29tcGlsZXIuc3JjLmluZmVycmVyLnNldF90cmFjZXI7CgppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwppbXBvcnQgJ25vZGVfdHJhY2VyLmRhcnQnOwppbXBvcnQgJ3R5cGVfZ3JhcGhfbm9kZXMuZGFydCc7CgovLy8gQSBzZXQgb2Ygc2VsZWN0b3IgbmFtZXMgdGhhdCBbU2V0XSBpbXBsZW1lbnRzIGFuZCB3aGljaCB3ZSBrbm93IGRvIG5vdAovLy8gY2hhbmdlIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIHNldCBvciBsZXQgdGhlIHNldCBlc2NhcGUgdG8gY29kZSB0aGF0IG1pZ2h0Ci8vLyBjaGFuZ2UgdGhlIGVsZW1lbnQgdHlwZS4KU2V0PFN0cmluZz4gb2tTZXRTZWxlY3RvclNldCA9IG5ldyBTZXQ8U3RyaW5nPi5mcm9tKGNvbnN0IDxTdHJpbmc+WwogIC8vIEZyb20gT2JqZWN0LgogICc9PScsCiAgJ2hhc2hDb2RlJywKICAndG9TdHJpbmcnLAogICdub1N1Y2hNZXRob2QnLAogICdydW50aW1lVHlwZScsCgogIC8vIEZyb20gSXRlcmFibGUuCiAgJ2l0ZXJhdG9yJywKICAnbWFwJywKICAnd2hlcmUnLAogICdleHBhbmQnLAogICdjb250YWlucycsCiAgJ2ZvckVhY2gnLAogICdyZWR1Y2UnLAogICdmb2xkJywKICAnZXZlcnknLAogICdqb2luJywKICAnYW55JywKICAndG9MaXN0JywKICAndG9TZXQnLAogICdsZW5ndGgnLAogICdpc0VtcHR5JywKICAnaXNOb3RFbXB0eScsCiAgJ3Rha2UnLAogICd0YWtlV2hpbGUnLAogICdza2lwJywKICAnc2tpcFdoaWxlJywKICAnZmlyc3QnLAogICdsYXN0JywKICAnc2luZ2xlJywKICAnZmlyc3RXaGVyZScsCiAgJ2xhc3RXaGVyZScsCiAgJ3NpbmdsZVdoZXJlJywKICAnZWxlbWVudEF0JywKCiAgLy8gRnJvbSBTZXQuCiAgJ2NsZWFyJywKICAnY29udGFpbnNBbGwnLAogICdkaWZmZXJlbmNlJywKICAnaW50ZXJzZWN0aW9uJywKICAnbG9va3VwJywKICAncmVtb3ZlJywKICAncmVtb3ZlQWxsJywKICAncmVtb3ZlV2hlcmUnLAogICdyZXRhaW5BbGwnLAogICdyZXRhaW5XaGVyZScsCiAgJ3VuaW9uJywKXSk7CgpjbGFzcyBTZXRUcmFjZXJWaXNpdG9yIGV4dGVuZHMgVHJhY2VyVmlzaXRvciB7CiAgTGlzdDxUeXBlSW5mb3JtYXRpb24+IGFzc2lnbm1lbnRzID0gPFR5cGVJbmZvcm1hdGlvbj5bXTsKCiAgU2V0VHJhY2VyVmlzaXRvcih0cmFjZWRUeXBlLCBpbmZlcnJlcikgOiBzdXBlcih0cmFjZWRUeXBlLCBpbmZlcnJlcik7CgogIC8vLyBSZXR1cm5zIFt0cnVlXSBpZiB0aGUgYW5hbHlzaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgW2ZhbHNlXSBpZiBpdAogIC8vLyBiYWlsZWQgb3V0LiBJbiB0aGUgZm9ybWVyIGNhc2UsIFthc3NpZ25tZW50c10gaG9sZHMgYSBsaXN0IG9mCiAgLy8vIFtUeXBlSW5mb3JtYXRpb25dIG5vZGVzIHRoYXQgZmxvdyBpbnRvIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhpcyBzZXQuCiAgYm9vbCBydW4oKSB7CiAgICBhbmFseXplKCk7CiAgICBTZXRUeXBlSW5mb3JtYXRpb24gc2V0ID0gdHJhY2VkVHlwZTsKICAgIGlmIChjb250aW51ZUFuYWx5emluZykgewogICAgICBzZXQuYWRkRmxvd3NJbnRvVGFyZ2V0cyhmbG93c0ludG8pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGFzc2lnbm1lbnRzID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2xvc3VyZUNhbGxTaXRlVHlwZUluZm9ybWF0aW9uKENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBiYWlsb3V0KCdQYXNzZWQgdG8gYSBjbG9zdXJlJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIHN1cGVyLnZpc2l0U3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgICBNZW1iZXJFbnRpdHkgY2FsbGVkID0gaW5mby5jYWxsZWRFbGVtZW50OwogICAgaWYgKGluZmVycmVyLmNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmlzRm9yZWlnbihjYWxsZWQpICYmCiAgICAgICAgY2FsbGVkLm5hbWUgPT0gSWRlbnRpZmllcnMuSlMpIHsKICAgICAgYmFpbG91dCgnVXNlZCBpbiBKUyAke2luZm8uZGVidWdOYW1lfScpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIHN1cGVyLnZpc2l0RHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKGluZm8pOwogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBpbmZvLnNlbGVjdG9yOwogICAgU3RyaW5nIHNlbGVjdG9yTmFtZSA9IHNlbGVjdG9yLm5hbWU7CiAgICBpZiAoY3VycmVudFVzZXIgPT0gaW5mby5yZWNlaXZlcikgewogICAgICBpZiAoIW9rU2V0U2VsZWN0b3JTZXQuY29udGFpbnMoc2VsZWN0b3JOYW1lKSkgewogICAgICAgIGlmIChzZWxlY3Rvci5pc0NhbGwpIHsKICAgICAgICAgIHN3aXRjaCAoc2VsZWN0b3JOYW1lKSB7CiAgICAgICAgICAgIGNhc2UgJ2FkZCc6CiAgICAgICAgICAgICAgYXNzaWdubWVudHMuYWRkKGluZm8uYXJndW1lbnRzLnBvc2l0aW9uYWxbMF0pOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhZGRBbGwnOgogICAgICAgICAgICAgIC8vIFRPRE8oZmlzaHl0aGVmaXNoKTogRXh0cmFjdCB0eXBlIGFyZ3VtZW50IGZyb20gdHlwZQogICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgIGJhaWxvdXQoJ0FkZGluZyBpdGVyYWJsZSB3aXRoIHVua25vd24gdHlwZWluZm8gdG8gY3VycmVudCBzZXQnKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBiYWlsb3V0KCdTZXQgdXNlZCBpbiBhIG5vdC1vayBzZWxlY3RvciBbJHNlbGVjdG9yTmFtZV0nKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNDYWxsICYmCiAgICAgICAgKGluZm8uaGFzQ2xvc3VyZUNhbGxUYXJnZXRzIHx8CiAgICAgICAgICAgIGluZm8uY29uY3JldGVUYXJnZXRzLmFueSgoZWxlbWVudCkgPT4gIWVsZW1lbnQuaXNGdW5jdGlvbikpKSB7CiAgICAgIGJhaWxvdXQoJ1Bhc3NlZCB0byBhIGNsb3N1cmUnKTsKICAgICAgcmV0dXJuOwogICAgfQogIH0KfQqAhQBOTjwBKgEfJDIbIAFLUB1EEggODhIRARQOCQsMDg0MCgsKCQwLDA0QCg8KDwsKDBAPEQ8BDwsREBIMDA8RDxELBAEvOwFIAUtESw8PKR0qEwYYEgQBDE0kBAEMSzQuQSkvBgQBDE01JykoNh8iGD0VG0UeTxUVSAwSCggiJ0smDgYEAgEtcGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvc2V0X3RyYWNlci5kYXJ0O3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2luZmVycmVyL3R5cGVfZ3JhcGhfZHVtcC5kYXJ0uq8vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgpsaWJyYXJ5IGRhcnQyanMuaW5mZXJyZXIudHlwZV9ncmFwaF9kdW1wOwoKaW1wb3J0ICcuLi8uLi9jb21waWxlcl9uZXcuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXR5X3V0aWxzLmRhcnQnIGFzIHV0aWxzOwppbXBvcnQgJ2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICdpbmZlcnJlcl9lbmdpbmUuZGFydCc7CmltcG9ydCAndHlwZV9ncmFwaF9ub2Rlcy5kYXJ0JzsKaW1wb3J0ICdkZWJ1Zy5kYXJ0JzsKCi8vLyBEdW1wcyB0aGUgdHlwZSBpbmZlcmVuY2UgZ3JhcGggaW4gR3JhcGh2aXogRG90IGZvcm1hdCBpbnRvIHRoZSBgdHlwZWdyYXBoYAovLy8gc3ViZm9sZGVyIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBFYWNoIGZ1bmN0aW9uIGJvZHkgaXMgZHVtcGVkIGluCi8vLyBhIHNlcGFyYXRlIGZpbGUuCi8vLwovLy8gVGhlIHJlc3VsdGluZyAuZG90IGZpbGVzIG11c3QgYmUgcHJvY2Vzc2VkIHVzaW5nIHRoZSBHcmFwaHZpeiBgZG90YCBjb21tYW5kLAovLy8gd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gYGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnYCwgb3IgaW5zdGFsbGVkIHVzaW5nCi8vLyBtb3N0IHBhY2thZ2UgbWFuYWdlcnMgKHNlYXJjaCBmb3IgYGdyYXBodml6YCBvciBgZG90YCkuCi8vLwovLy8gRXhhbXBsZSBjb21tYW5kczoKLy8vCi8vLyAgICAgZG90IC1UcG5nIC1PIHR5cGVncmFwaC9tYWluLmRvdAovLy8gICAgIG9wZW4gdHlwZWdyYXBoL21haW4uZG90LnBuZwovLy8KLy8vICAgICBkb3QgLVRwbmcgLU8gdHlwZWdyYXBoL2RhcnQuX2ludGVybmFsLlNvcnQuX2R1YWxQaXZvdFF1aWNrc29ydC5kb3QKLy8vICAgICBvcGVuIHR5cGVncmFwaC9kYXJ0Ll9pbnRlcm5hbC5Tb3J0Ll9kdWFsUGl2b3RRdWlja3NvcnQuZG90LnBuZwovLy8KY2xhc3MgVHlwZUdyYXBoRHVtcCB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBvdXRwdXREaXIgPSAndHlwZWdyYXBoJzsKCiAgZmluYWwgQ29tcGlsZXJPdXRwdXQgY29tcGlsZXJPdXRwdXQ7CiAgZmluYWwgSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXI7CiAgZmluYWwgTWFwPFR5cGVJbmZvcm1hdGlvbiwgU2V0PFR5cGVJbmZvcm1hdGlvbj4+IGFzc2lnbm1lbnRzQmVmb3JlQW5hbHlzaXMgPQogICAgICA8VHlwZUluZm9ybWF0aW9uLCBTZXQ8VHlwZUluZm9ybWF0aW9uPj57fTsKICBmaW5hbCBNYXA8VHlwZUluZm9ybWF0aW9uLCBTZXQ8VHlwZUluZm9ybWF0aW9uPj4gYXNzaWdubWVudHNCZWZvcmVUcmFjaW5nID0KICAgICAgPFR5cGVJbmZvcm1hdGlvbiwgU2V0PFR5cGVJbmZvcm1hdGlvbj4+e307CiAgZmluYWwgU2V0PFN0cmluZz4gdXNlZEZpbGVuYW1lcyA9IG5ldyBTZXQ8U3RyaW5nPigpOwoKICBUeXBlR3JhcGhEdW1wKHRoaXMuY29tcGlsZXJPdXRwdXQsIHRoaXMuaW5mZXJyZXIpOwoKICAvLy8gVGFrZSBhIGNvcHkgb2YgdGhlIGFzc2lnbm1lbnQgc2V0IGZvciBlYWNoIG5vZGUsIHNpbmNlIHRoYXQgbWF5IGNoYW5nZQogIC8vLyBkdXJpbmcgdGhlIGFuYWx5c2lzLgogIHZvaWQgYmVmb3JlQW5hbHlzaXMoKSB7CiAgICBmb3IgKFR5cGVJbmZvcm1hdGlvbiBub2RlIGluIGluZmVycmVyLnR5cGVzLmFsbFR5cGVzKSB7CiAgICAgIFNldDxUeXBlSW5mb3JtYXRpb24+IGNvcHkgPSBub2RlLmFzc2lnbm1lbnRzLnRvU2V0KCk7CiAgICAgIGlmICghY29weS5pc0VtcHR5KSB7CiAgICAgICAgYXNzaWdubWVudHNCZWZvcmVBbmFseXNpc1tub2RlXSA9IGNvcHk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBMaWtlIFtiZWZvcmVBbmFseXNpc10sIHRha2VzIGEgY29weSBvZiB0aGUgYXNzaWdubWVudCBzZXRzLgogIHZvaWQgYmVmb3JlVHJhY2luZygpIHsKICAgIGZvciAoVHlwZUluZm9ybWF0aW9uIG5vZGUgaW4gaW5mZXJyZXIudHlwZXMuYWxsVHlwZXMpIHsKICAgICAgU2V0PFR5cGVJbmZvcm1hdGlvbj4gY29weSA9IG5vZGUuYXNzaWdubWVudHMudG9TZXQoKTsKICAgICAgaWYgKCFjb3B5LmlzRW1wdHkpIHsKICAgICAgICBhc3NpZ25tZW50c0JlZm9yZVRyYWNpbmdbbm9kZV0gPSBjb3B5OwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gRHVtcHMgdGhlIGVudGlyZSBncmFwaC4KICB2b2lkIGFmdGVyQW5hbHlzaXMoKSB7CiAgICAvLyBHcm91cCBhbGwgdGhlIHR5cGUgbm9kZXMgYnkgdGhlaXIgY29udGV4dCBtZW1iZXIuCiAgICBNYXA8TWVtYmVyRW50aXR5LCBMaXN0PFR5cGVJbmZvcm1hdGlvbj4+IG5vZGVzID0KICAgICAgICA8TWVtYmVyRW50aXR5LCBMaXN0PFR5cGVJbmZvcm1hdGlvbj4+e307CiAgICBmb3IgKFR5cGVJbmZvcm1hdGlvbiBub2RlIGluIGluZmVycmVyLnR5cGVzLmFsbFR5cGVzKSB7CiAgICAgIGlmIChub2RlLmNvbnRleHRNZW1iZXIgIT0gbnVsbCkgewogICAgICAgIG5vZGVzCiAgICAgICAgICAgIC5wdXRJZkFic2VudChub2RlLmNvbnRleHRNZW1iZXIsICgpID0+IDxUeXBlSW5mb3JtYXRpb24+W10pCiAgICAgICAgICAgIC5hZGQobm9kZSk7CiAgICAgIH0KICAgIH0KICAgIC8vIFByaW50IGV2ZXJ5IGdyb3VwIHNlcGFyYXRlbHkuCiAgICBmb3IgKE1lbWJlckVudGl0eSBlbGVtZW50IGluIG5vZGVzLmtleXMpIHsKICAgICAgT3V0cHV0U2luayBvdXRwdXQ7CiAgICAgIHRyeSB7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlbmFtZUZyb21FbGVtZW50KGVsZW1lbnQpOwogICAgICAgIG91dHB1dCA9IGNvbXBpbGVyT3V0cHV0LmNyZWF0ZU91dHB1dFNpbmsoCiAgICAgICAgICAgICckb3V0cHV0RGlyLyRuYW1lJywgJ2RvdCcsIE91dHB1dFR5cGUuZGVidWcpOwogICAgICAgIF9HcmFwaEdlbmVyYXRvciB2aXNpdG9yID0gbmV3IF9HcmFwaEdlbmVyYXRvcigKICAgICAgICAgICAgdGhpcywgZWxlbWVudCwgb3V0cHV0LCBpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluLmdldENvbXBhY3RUZXh0KTsKICAgICAgICBmb3IgKFR5cGVJbmZvcm1hdGlvbiBub2RlIGluIG5vZGVzW2VsZW1lbnRdKSB7CiAgICAgICAgICB2aXNpdG9yLnZpc2l0KG5vZGUpOwogICAgICAgIH0KICAgICAgICB2aXNpdG9yLmFkZE1pc3NpbmdOb2RlcygpOwogICAgICAgIHZpc2l0b3IuZmluaXNoKCk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKSB7CiAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSBmaWxlbmFtZSAod2l0aG91dCBleHRlbnNpb24pIGluIHdoaWNoIHRvIGR1bXAgdGhlIHR5cGUKICAvLy8gZ3JhcGggZm9yIFtlbGVtZW50XS4KICAvLy8KICAvLy8gV2lsbCBuZXZlciByZXR1cm4gdGhlIGEgZ2l2ZW4gZmlsZW5hbWUgbW9yZSB0aGFuIG9uY2UsIGV2ZW4gaWYgY2FsbGVkIHdpdGgKICAvLy8gdGhlIHNhbWUgZWxlbWVudC4KICBTdHJpbmcgZmlsZW5hbWVGcm9tRWxlbWVudChNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgLy8gVGhlIHRvU3RyaW5nIG1ldGhvZCBvZiBlbGVtZW50cyBpbmNsdWRlIGNoYXJhY3RlcnMgdGhhdCBhcmUgdW5zdWl0YWJsZQogICAgLy8gZm9yIFVSSXMgYW5kIGZpbGUgc3lzdGVtcy4KICAgIExpc3Q8U3RyaW5nPiBwYXJ0cyA9IDxTdHJpbmc+W107CiAgICBwYXJ0cy5hZGQoZWxlbWVudC5saWJyYXJ5LmNhbm9uaWNhbFVyaS5wYXRoU2VnbWVudHMubGFzdCk7CiAgICBwYXJ0cy5hZGQoZWxlbWVudC5lbmNsb3NpbmdDbGFzcz8ubmFtZSk7CiAgICBpZiAoZWxlbWVudC5pc0dldHRlcikgewogICAgICBwYXJ0cy5hZGQoJ2dldC0ke2VsZW1lbnQubmFtZX0nKTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc1NldHRlcikgewogICAgICBwYXJ0cy5hZGQoJ3NldC0ke2VsZW1lbnQubmFtZX0nKTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc0NvbnN0cnVjdG9yKSB7CiAgICAgIGlmIChlbGVtZW50Lm5hbWUuaXNFbXB0eSkgewogICAgICAgIHBhcnRzLmFkZCgnLWNvbnN0cnVjdG9yJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGFydHMuYWRkKGVsZW1lbnQubmFtZSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHBhcnRzLmFkZCgKICAgICAgICAgIHV0aWxzLm9wZXJhdG9yTmFtZVRvSWRlbnRpZmllcihlbGVtZW50Lm5hbWUpLnJlcGxhY2VBbGwocickJywgJy0nKSk7CiAgICB9CiAgICBTdHJpbmcgZmlsZW5hbWUgPSBwYXJ0cy53aGVyZSgoeCkgPT4geCAhPSBudWxsICYmIHggIT0gJycpLmpvaW4oJy4nKTsKICAgIGlmICh1c2VkRmlsZW5hbWVzLmFkZChmaWxlbmFtZSkpIHJldHVybiBmaWxlbmFtZTsKICAgIC8vIFRoZSBmaWxlbmFtZSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgYnkgYW5vdGhlciBtZXRob2QuIEFwcGVuZCBhIHNlcmlhbAogICAgLy8gbnVtYmVyIHRvIGVuc3VyZSB3ZSBkb24ndCBvdmVyd3JpdGUgaXQuCiAgICBpbnQgc2VyaWFsTnVtYmVyID0gMjsKICAgIHdoaWxlICghdXNlZEZpbGVuYW1lcy5hZGQoJyRmaWxlbmFtZS0kc2VyaWFsTnVtYmVyJykpIHsKICAgICAgKytzZXJpYWxOdW1iZXI7CiAgICB9CiAgICByZXR1cm4gJyRmaWxlbmFtZS0kc2VyaWFsTnVtYmVyJzsKICB9Cn0KCi8vLyBCdWlsZHMgdGhlIEdyYXBodml6IERvdCBmaWxlIGZvciBvbmUgZnVuY3Rpb24gYm9keS4KY2xhc3MgX0dyYXBoR2VuZXJhdG9yIGV4dGVuZHMgVHlwZUluZm9ybWF0aW9uVmlzaXRvciB7CiAgZmluYWwgVHlwZUdyYXBoRHVtcCBnbG9iYWw7CiAgZmluYWwgU2V0PFR5cGVJbmZvcm1hdGlvbj4gc2VlbiA9IG5ldyBTZXQ8VHlwZUluZm9ybWF0aW9uPigpOwogIGZpbmFsIExpc3Q8VHlwZUluZm9ybWF0aW9uPiB3b3JrbGlzdCA9IG5ldyBMaXN0PFR5cGVJbmZvcm1hdGlvbj4oKTsKICBmaW5hbCBNYXA8VHlwZUluZm9ybWF0aW9uLCBpbnQ+IG5vZGVJZCA9IDxUeXBlSW5mb3JtYXRpb24sIGludD57fTsKICBmaW5hbCBTdHJpbmcgRnVuY3Rpb24oQWJzdHJhY3RWYWx1ZSkgZm9ybWF0VHlwZTsKICBpbnQgdXNlZElkcyA9IDA7CiAgZmluYWwgT3V0cHV0U2luayBvdXRwdXQ7CiAgZmluYWwgTWVtYmVyRW50aXR5IGVsZW1lbnQ7CiAgVHlwZUluZm9ybWF0aW9uIHJldHVyblZhbHVlOwoKICBfR3JhcGhHZW5lcmF0b3IodGhpcy5nbG9iYWwsIHRoaXMuZWxlbWVudCwgdGhpcy5vdXRwdXQsIHRoaXMuZm9ybWF0VHlwZSkgewogICAgcmV0dXJuVmFsdWUgPSBnbG9iYWwuaW5mZXJyZXIudHlwZXMuZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZWxlbWVudCk7CiAgICBnZXROb2RlKHJldHVyblZhbHVlKTsgLy8gRW5zdXJlIHJldHVybiB2YWx1ZSBpcyBwYXJ0IG9mIGdyYXBoLgogICAgYXBwZW5kKCdkaWdyYXBoIHsnKTsKICB9CgogIHZvaWQgZmluaXNoKCkgewogICAgYXBwZW5kKCd9Jyk7CiAgfQoKICAvLy8gRW5zdXJlcyB0aGF0IGFsbCBub2RlcyB3aGljaCBoYXZlIGJlZW4gcmVmZXJlbmNlZCBhcmUgZ2VuZXJhdGVkLgogIC8vLwogIC8vLyBTb21ldGltZXMgYW4gaW5wdXQgdG8gYSBUeXBlSW5mb3JtYXRpb24gbm9kZSBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIHNhbWUKICAvLy8gZnVuY3Rpb24gYm9keSwgYW5kIHRoZSBncmFwaCBsb29rcyBjb25mdXNpbmcgaWYgdGhleSBhcmUgbWlzc2luZy4KICB2b2lkIGFkZE1pc3NpbmdOb2RlcygpIHsKICAgIHdoaWxlICh3b3JrbGlzdC5pc05vdEVtcHR5KSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiBub2RlID0gd29ya2xpc3QucmVtb3ZlTGFzdCgpOwogICAgICBhc3NlcnQobm9kZUlkLmNvbnRhaW5zS2V5KG5vZGUpKTsKICAgICAgdmlzaXQobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0KFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBpZiAoc2Vlbi5jb250YWlucyhpbmZvKSkgcmV0dXJuOwogICAgaW5mby5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIGFwcGVuZChTdHJpbmcgc3RyaW5nKSB7CiAgICBvdXRwdXQuLmFkZChzdHJpbmcpLi5hZGQoJ1xuJyk7CiAgfQoKICBTdHJpbmcgc2hvcnRlbihTdHJpbmcgdGV4dCkgewogICAgaWYgKHRleHQubGVuZ3RoID4gNDApIHsKICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIDE5KSArICcuLi4nICsgdGV4dC5zdWJzdHJpbmcodGV4dC5sZW5ndGggLSAxOCk7CiAgICB9CiAgICByZXR1cm4gdGV4dDsKICB9CgogIGludCBnZXRGcmVzaElkKCkgPT4gKyt1c2VkSWRzOwoKICAvLy8gT2J0YWlucyBhIHVuaXF1ZSBJRCBmb3IgdGhlIG5vZGUgcmVwcmVzZW50aW5nIFtpbmZvXS4KICBTdHJpbmcgZ2V0Tm9kZShUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgaW50IGlkID0gbm9kZUlkLnB1dElmQWJzZW50KGluZm8sICgpIHsKICAgICAgd29ya2xpc3QuYWRkKGluZm8pOyAvLyBFbnN1cmUgdGhhdCB0aGUgcmVmZXJlbmNlZCBub2RlIGlzIGdlbmVyYXRlZC4KICAgICAgcmV0dXJuIGdldEZyZXNoSWQoKTsKICAgIH0pOwogICAgcmV0dXJuICckaWQnOwogIH0KCiAgZmluYWwgUmVnRXhwIGVzY2FwZVJlZ2V4cCA9IG5ldyBSZWdFeHAoJ1sie308PnxdJyk7CgogIC8vLyBFc2NhcGVzIGNoYXJhY3RlcnMgaW4gW3RleHRdIHNvIGl0IGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgYSBsYWJlbC4KICBTdHJpbmcgZXNjYXBlTGFiZWwoU3RyaW5nIHRleHQpIHsKICAgIHJldHVybiB0ZXh0LnJlcGxhY2VBbGxNYXBwZWQoZXNjYXBlUmVnZXhwLCAobSkgPT4gJ1xcJHttLmdyb3VwKDApfScpOwogIH0KCiAgLy8vIENyZWF0ZXMgYW4gZWRnZSBmcm9tIFtzcmNdIHRvIFtkc3RdLgogIC8vLwogIC8vLyBJZiBbZHN0XSBpcyBhIHJlY29yZCB0eXBlIG5vZGUsIFtwb3J0XSBtYXkgcmVmZXIgdG8gb25lIG9mIHRoZSBmaWVsZHMKICAvLy8gZGVmaW5lZCBpbiB0aGF0IHJlY29yZCAoZS5nLiBgb2JqYCwgYGFyZzBgLCBgYXJnMWAsIGV0YykKICB2b2lkIGFkZEVkZ2UoVHlwZUluZm9ybWF0aW9uIHNyYywgVHlwZUluZm9ybWF0aW9uIGRzdCwKICAgICAge1N0cmluZyBwb3J0LCBTdHJpbmcgY29sb3I6ICdibGFjayd9KSB7CiAgICBpZiAoaXNFeHRlcm5hbChzcmMpICYmIGlzRXh0ZXJuYWwoZHN0KSkgewogICAgICByZXR1cm47IC8vIERvIG5vdCBhZGQgZWRnZXMgYmV0d2VlbiBleHRlcm5hbCBub2Rlcy4KICAgIH0KICAgIFN0cmluZyBkc3RUZXh0ID0gZ2V0Tm9kZShkc3QpOwogICAgaWYgKHBvcnQgIT0gbnVsbCkgewogICAgICBkc3RUZXh0ICs9ICc6JHBvcnQnOwogICAgfQogICAgaWYgKHNyYyBpcyBDb25jcmV0ZVR5cGVJbmZvcm1hdGlvbikgewogICAgICAvLyBDb25jcmV0ZSB0eXBlcyBjYW4gaGF2ZSBhIGh1Z2UgbnVtYmVyIG9mIHVzZXMgd2hpY2ggd2lsbCBmbG9vZCB0aGUKICAgICAgLy8gZ3JhcGggd2l0aCB2ZXJ5IGxvbmcgaGFyZC10by1mb2xsb3cgZWRnZXMuIENvcHkgdGhlIGNvbmNyZXRlIG5vZGVzCiAgICAgIC8vIGZvciBldmVyeSB1c2UgdG8gZW5oYW5jZSByZWFkYWJpbGl0eS4KICAgICAgaW50IGlkID0gZ2V0RnJlc2hJZCgpOwogICAgICBTdHJpbmcgdHlwZSA9IGVzY2FwZUxhYmVsKCcke2Zvcm1hdFR5cGUoc3JjLnR5cGUpfScpOwogICAgICBTdHJpbmcgdGV4dCA9ICdDb25jcmV0ZSc7CiAgICAgIFN0cmluZyBsYWJlbCA9ICd7JHRleHR8PHJldHVyblR5cGU+ICR0eXBlfSc7CiAgICAgIGFwcGVuZCgnJGlkIFtzaGFwZT1yZWNvcmQsc3R5bGU9ZG90dGVkLGxhYmVsPSIkbGFiZWwiXScpOwogICAgICBhcHBlbmQoJyRpZCAtPiAkZHN0VGV4dCBbY29sb3I9IiRjb2xvciJdJyk7CiAgICB9IGVsc2UgewogICAgICBhcHBlbmQoJyR7Z2V0Tm9kZShzcmMpfTpyZXR1cm5UeXBlIC0+ICRkc3RUZXh0IFtjb2xvcj0iJGNvbG9yIl0nKTsKICAgIH0KICB9CgogIC8vIFNvbWUgZ3JhcGhzIGFyZSBmbG9vZGVkIGJ5IGEgaHVnZSBudW1iZXIgb2YgcGhpIGFuZCBuYXJyb3cgbm9kZXMuCiAgLy8gV2UgY29sb3IgdGhlIG5vZGVzIHNvIHRoZSAiaW50ZXJlc3RpbmciIG5vZGVzIHN0YW5kIG91dCBtb3JlLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgZGVmYXVsdE5vZGVDb2xvciA9ICcjZWVmZmVlJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHBoaUNvbG9yID0gJyNlZWZmZmYnOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgbmFycm93Q29sb3IgPSBwaGlDb2xvcjsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGNhbGxDb2xvciA9ICcjZmZmZmVlJzsKCiAgLy8gQ29sb3JzIGZvciBlZGdlcyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgd2VyZSBhZGRlZCBvciByZW1vdmVkIGR1cmluZyB0aGUKICAvLyBhbmFseXNpcy4KICBzdGF0aWMgY29uc3QgU3RyaW5nIHVuY2hhbmdlZEVkZ2UgPSAnYmxhY2snOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgYWRkZWRFZGdlID0gJ2dyZWVuNCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyByZW1vdmVkRWRnZSA9ICdyZWQzJzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHRlbXBvcmFyeUVkZ2UgPSAnb3JhbmdlJzsgLy8gQWRkZWQgYW5kIHRoZW4gcmVtb3ZlZCBhZ2Fpbi4KCiAgYm9vbCBpc0V4dGVybmFsKFR5cGVJbmZvcm1hdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbm9kZSAhPSByZXR1cm5WYWx1ZSAmJiBub2RlLmNvbnRleHRNZW1iZXIgIT0gZWxlbWVudDsKICB9CgogIFN0cmluZyBnZXRTdHlsZUZvck5vZGUoVHlwZUluZm9ybWF0aW9uIG5vZGUsIFN0cmluZyBjb2xvcikgewogICAgcmV0dXJuIGlzRXh0ZXJuYWwobm9kZSkKICAgICAgICA/ICdzdHlsZT1kb3R0ZWQnCiAgICAgICAgOiAnc3R5bGU9ZmlsbGVkLGZpbGxjb2xvcj0iJGNvbG9yIic7CiAgfQoKICAvLy8gQWRkcyBkZXRhaWxzIHRoYXQgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHN1YmNsYXNzIG9mIFtUeXBlSW5mb3JtYXRpb25dLgogIFN0cmluZyBhcHBlbmREZXRhaWxzKFR5cGVJbmZvcm1hdGlvbiBub2RlLCBTdHJpbmcgdGV4dCkgewogICAgaWYgKG5vZGUgPT0gcmV0dXJuVmFsdWUpIHsKICAgICAgcmV0dXJuICckdGV4dFxuKHJldHVybiB2YWx1ZSknOwogICAgfQogICAgaWYgKG5vZGUuY29udGV4dE1lbWJlciAhPSBudWxsICYmIG5vZGUuY29udGV4dE1lbWJlciAhPSBlbGVtZW50KSB7CiAgICAgIHJldHVybiAnJHRleHRcbihmcm9tICR7bm9kZS5jb250ZXh0TWVtYmVyfSknOwogICAgfQogICAgcmV0dXJuIHRleHQ7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIG5vZGUgZm9yIFtub2RlXSBkaXNwbGF5aW5nIHRoZSBnaXZlbiBbdGV4dF0gaW4gaXRzIGJveC4KICAvLy8KICAvLy8gW2lucHV0c10gc3BlY2lmeSBuYW1lZCBpbnB1dHMgdG8gdGhlIG5vZGUuIElmIG9taXR0ZWQsIGVkZ2VzIHdpbGwgYmUKICAvLy8gYmFzZWQgb24gW25vZGUuYXNzaWdubWVudHNdLgogIHZvaWQgYWRkTm9kZShUeXBlSW5mb3JtYXRpb24gbm9kZSwgU3RyaW5nIHRleHQsCiAgICAgIHtTdHJpbmcgY29sb3I6IGRlZmF1bHROb2RlQ29sb3IsIE1hcDxTdHJpbmcsIFR5cGVJbmZvcm1hdGlvbj4gaW5wdXRzfSkgewogICAgc2Vlbi5hZGQobm9kZSk7CiAgICBTdHJpbmcgc3R5bGUgPSBnZXRTdHlsZUZvck5vZGUobm9kZSwgY29sb3IpOwogICAgdGV4dCA9IGFwcGVuZERldGFpbHMobm9kZSwgdGV4dCk7CiAgICB0ZXh0ID0gZXNjYXBlTGFiZWwodGV4dCk7CiAgICBTdHJpbmcgaWQgPSBnZXROb2RlKG5vZGUpOwogICAgU3RyaW5nIHJldHVyblR5cGUgPSBlc2NhcGVMYWJlbChmb3JtYXRUeXBlKG5vZGUudHlwZSkpOwogICAgaWYgKGlucHV0cyAhPSBudWxsKSB7CiAgICAgIEl0ZXJhYmxlPFN0cmluZz4ga2V5cyA9IGlucHV0cy5rZXlzLndoZXJlKChrZXkpID0+IGlucHV0c1trZXldICE9IG51bGwpOwogICAgICBTdHJpbmcgaGVhZGVyID0ga2V5cy5tYXAoKGtleSkgPT4gJzxhJGtleT4gJGtleScpLmpvaW4oJ3wnKTsKICAgICAgU3RyaW5nIGxhYmVsID0gJ3t7JGhlYWRlcn18JHRleHR8PHJldHVyblR5cGU+ICRyZXR1cm5UeXBlfSc7CiAgICAgIGFwcGVuZCgnJGlkIFtzaGFwZT1yZWNvcmQsbGFiZWw9IiRsYWJlbCIsJHN0eWxlXScpOwogICAgICBmb3IgKFN0cmluZyBrZXkgaW4ga2V5cykgewogICAgICAgIGFkZEVkZ2UoaW5wdXRzW2tleV0sIG5vZGUsIHBvcnQ6ICdhJGtleScpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBTdHJpbmcgbGFiZWwgPSAneyR0ZXh0fDxyZXR1cm5UeXBlPiAkcmV0dXJuVHlwZX0nOwogICAgICBhcHBlbmQoJyRpZCBbc2hhcGU9cmVjb3JkLGxhYmVsPSIkbGFiZWwiLCRzdHlsZV0nKTsKICAgICAgLy8gQWRkIGFzc2lnbm1lbnQgZWRnZXMuIENvbG9yIHRoZSBlZGdlcyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgd2VyZQogICAgICAvLyBhZGRlZCwgcmVtb3ZlZCwgdGVtcG9yYXJ5LCBvciB1bmNoYW5nZWQuCiAgICAgIGR5bmFtaWMgb3JpZ2luYWxTZXQgPSBnbG9iYWwuYXNzaWdubWVudHNCZWZvcmVBbmFseXNpc1tub2RlXSA/PyBjb25zdCBbXTsKICAgICAgdmFyIHRyYWNlclNldCA9IGdsb2JhbC5hc3NpZ25tZW50c0JlZm9yZVRyYWNpbmdbbm9kZV0gPz8gY29uc3QgW107CiAgICAgIHZhciBjdXJyZW50U2V0ID0gbm9kZS5hc3NpZ25tZW50cy50b1NldCgpOwogICAgICBmb3IgKFR5cGVJbmZvcm1hdGlvbiBhc3NpZ25tZW50IGluIGN1cnJlbnRTZXQpIHsKICAgICAgICBTdHJpbmcgY29sb3IgPQogICAgICAgICAgICBvcmlnaW5hbFNldC5jb250YWlucyhhc3NpZ25tZW50KSA/IHVuY2hhbmdlZEVkZ2UgOiBhZGRlZEVkZ2U7CiAgICAgICAgYWRkRWRnZShhc3NpZ25tZW50LCBub2RlLCBjb2xvcjogY29sb3IpOwogICAgICB9CiAgICAgIGZvciAoVHlwZUluZm9ybWF0aW9uIGFzc2lnbm1lbnQgaW4gb3JpZ2luYWxTZXQpIHsKICAgICAgICBpZiAoIWN1cnJlbnRTZXQuY29udGFpbnMoYXNzaWdubWVudCkpIHsKICAgICAgICAgIGFkZEVkZ2UoYXNzaWdubWVudCwgbm9kZSwgY29sb3I6IHJlbW92ZWRFZGdlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChUeXBlSW5mb3JtYXRpb24gYXNzaWdubWVudCBpbiB0cmFjZXJTZXQpIHsKICAgICAgICBpZiAoIWN1cnJlbnRTZXQuY29udGFpbnMoYXNzaWdubWVudCkgJiYKICAgICAgICAgICAgIW9yaWdpbmFsU2V0LmNvbnRhaW5zKGFzc2lnbm1lbnQpKSB7CiAgICAgICAgICBhZGRFZGdlKGFzc2lnbm1lbnQsIG5vZGUsIGNvbG9yOiB0ZW1wb3JhcnlFZGdlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChQUklOVF9HUkFQSF9BTExfTk9ERVMpIHsKICAgICAgZm9yIChUeXBlSW5mb3JtYXRpb24gdXNlciBpbiBub2RlLnVzZXJzKSB7CiAgICAgICAgaWYgKCFpc0V4dGVybmFsKHVzZXIpKSB7CiAgICAgICAgICB2aXNpdCh1c2VyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROYXJyb3dUeXBlSW5mb3JtYXRpb24oTmFycm93VHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIC8vIE9taXQgdW51c2VkIE5hcnJvd3MuCiAgICBpZiAoIVBSSU5UX0dSQVBIX0FMTF9OT0RFUyAmJiBpbmZvLnVzZXJzLmlzRW1wdHkpIHJldHVybjsKICAgIGFkZE5vZGUoaW5mbywgJ05hcnJvd1xuJHtmb3JtYXRUeXBlKGluZm8udHlwZUFubm90YXRpb24pfScsCiAgICAgICAgY29sb3I6IG5hcnJvd0NvbG9yKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQaGlFbGVtZW50VHlwZUluZm9ybWF0aW9uKFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgLy8gT21pdCB1bnVzZWQgUGhpcy4KICAgIGlmICghUFJJTlRfR1JBUEhfQUxMX05PREVTICYmIGluZm8udXNlcnMuaXNFbXB0eSkgcmV0dXJuOwogICAgYWRkTm9kZShpbmZvLCAnUGhpICR7aW5mby52YXJpYWJsZT8ubmFtZSA/PyAnJ30nLCBjb2xvcjogcGhpQ29sb3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEVsZW1lbnRJbkNvbnRhaW5lclR5cGVJbmZvcm1hdGlvbigKICAgICAgRWxlbWVudEluQ29udGFpbmVyVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGFkZE5vZGUoaW5mbywgJ0VsZW1lbnRJbkNvbnRhaW5lcicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEVsZW1lbnRJblNldFR5cGVJbmZvcm1hdGlvbihFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYWRkTm9kZShpbmZvLCAnRWxlbWVudEluU2V0Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0S2V5SW5NYXBUeXBlSW5mb3JtYXRpb24oS2V5SW5NYXBUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYWRkTm9kZShpbmZvLCAnS2V5SW5NYXAnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYWx1ZUluTWFwVHlwZUluZm9ybWF0aW9uKFZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYWRkTm9kZShpbmZvLCAnVmFsdWVJbk1hcCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpc3RUeXBlSW5mb3JtYXRpb24oTGlzdFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBhZGROb2RlKGluZm8sICdMaXN0Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0VHlwZUluZm9ybWF0aW9uKFNldFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBhZGROb2RlKGluZm8sICdTZXQnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXBUeXBlSW5mb3JtYXRpb24oTWFwVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGFkZE5vZGUoaW5mbywgJ01hcCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbmNyZXRlVHlwZUluZm9ybWF0aW9uKENvbmNyZXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGFkZE5vZGUoaW5mbywgJ0NvbmNyZXRlJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbihTdHJpbmdMaXRlcmFsVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIFN0cmluZyB0ZXh0ID0gc2hvcnRlbihpbmZvLnZhbHVlKS5yZXBsYWNlQWxsKCdcbicsICdcXG4nKTsKICAgIGFkZE5vZGUoaW5mbywgJ1N0cmluZ0xpdGVyYWxcbiIkdGV4dCInKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb29sTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbihCb29sTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBhZGROb2RlKGluZm8sICdCb29sTGl0ZXJhbFxuJHtpbmZvLnZhbHVlfScpOwogIH0KCiAgdm9pZCBoYW5kbGVDYWxsKENhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8sIFN0cmluZyB0ZXh0LAogICAgICBNYXA8U3RyaW5nLCBUeXBlSW5mb3JtYXRpb24+IGlucHV0cykgewogICAgU3RyaW5nIHNvdXJjZUNvZGUgPSBzaG9ydGVuKCcke2luZm8uZGVidWdOYW1lfScpOwogICAgdGV4dCA9ICckdGV4dFxuJHNvdXJjZUNvZGUnOwogICAgaWYgKGluZm8uYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaW5wdXRzWydhcmckaSddID0gaW5mby5hcmd1bWVudHMucG9zaXRpb25hbFtpXTsKICAgICAgfQogICAgICBmb3IgKFN0cmluZyBhcmdOYW1lIGluIGluZm8uYXJndW1lbnRzLm5hbWVkLmtleXMpIHsKICAgICAgICBpbnB1dHNbYXJnTmFtZV0gPSBpbmZvLmFyZ3VtZW50cy5uYW1lZFthcmdOYW1lXTsKICAgICAgfQogICAgfQogICAgYWRkTm9kZShpbmZvLCB0ZXh0LCBjb2xvcjogY2FsbENvbG9yLCBpbnB1dHM6IGlucHV0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2xvc3VyZUNhbGxTaXRlVHlwZUluZm9ybWF0aW9uKAogICAgICBDbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgaGFuZGxlQ2FsbChpbmZvLCAnQ2xvc3VyZUNhbGxTaXRlJywge30pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGhhbmRsZUNhbGwoaW5mbywgJ1N0YXRpY0NhbGxTaXRlJywge30pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbigKICAgICAgRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGhhbmRsZUNhbGwoaW5mbywgJ0R5bmFtaWNDYWxsU2l0ZScsIHsnb2JqJzogaW5mby5yZWNlaXZlcn0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1lbWJlclR5cGVJbmZvcm1hdGlvbihNZW1iZXJUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYWRkTm9kZShpbmZvLCAnTWVtYmVyXG4ke2luZm8uZGVidWdOYW1lfScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbihQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYWRkTm9kZShpbmZvLCAnUGFyYW1ldGVyICR7aW5mby5kZWJ1Z05hbWV9Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2xvc3VyZVR5cGVJbmZvcm1hdGlvbihDbG9zdXJlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIFN0cmluZyB0ZXh0ID0gc2hvcnRlbignJHtpbmZvLmRlYnVnTmFtZX0nKTsKICAgIGFkZE5vZGUoaW5mbywgJ0Nsb3N1cmVcbiR0ZXh0Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXdhaXRUeXBlSW5mb3JtYXRpb24oQXdhaXRUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgU3RyaW5nIHRleHQgPSBzaG9ydGVuKCcke2luZm8uZGVidWdOYW1lfScpOwogICAgYWRkTm9kZShpbmZvLCAnQXdhaXRcbiR0ZXh0Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0WWllbGRUeXBlSW5mb3JtYXRpb24oWWllbGRUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgU3RyaW5nIHRleHQgPSBzaG9ydGVuKCcke2luZm8uZGVidWdOYW1lfScpOwogICAgYWRkTm9kZShpbmZvLCAnWWllbGRcbiR0ZXh0Jyk7CiAgfQp9CoHAAE5OPCoBIiQxJR8gFQFPUBUEUU08BBYEKCQES0cEFi8BJyFPMU4xNwE1AU0bGjw8GzAIBgQBQhk8PBsvCAYEAR4ZOTUxPCgOSBgIBiUvGQw0Mjo3UTcfCiMaEh4aCggGBAFJGwZRGDVOIiU/LRwoIygoIiMPIQgNEU8GSjZNLxo8FgYmBAIBODceQEZFMxMbHh8BTUpDGQQBEhEEAUcGT0gbIjQoEwYEASUlFwQBHyQEASAcTwYRBAEhATwpK0sbCBIEATYBSSRKBAErBkw/OS4uOgYjGBsGKkxMLx08IDNAMg1JBgQBR0M0LC4tAU0PLywsUQEqQQQBPxwZLQQBTTwfJgZHNAYRBAFIBksjMk8UMSYeHzwaT0NDOiEzCA05OkoyUEkxNxdKMQg4MDkKCDYwMTsKCAYhMSEXCggGBAEMQBw+QB0EAQxIGT5IBAEMLzApBAEMTCMEAQxEHwQBDEghBAEMPBsEAQw6GgQBDDoaBAEMRB8EAQxOPy0EAQxKMQQBPS02ISJDOAg6OQgGOwQBDCwtLQQBDFAsBAEMLC1BBAEMQDAEAQxGMgQBDEIwJQQBDD4wIwQBDD4wIwQCATJwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlX2dyYXBoX2R1bXAuZGFydDdzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pbmZlcnJlci90eXBlX3N5c3RlbS5kYXJ0wABh4C8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCc7CmltcG9ydCAnYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJ3R5cGVfZ3JhcGhfbm9kZXMuZGFydCc7CgovLy8gU3RyYXRlZ3kgZm9yIGNyZWF0aW5nIHR5cGUgaW5mb3JtYXRpb24gZnJvbSBtZW1iZXJzIGFuZCBwYXJhbWV0ZXJzIGFuZCB0eXBlCi8vLyBpbmZvcm1hdGlvbiBmb3Igbm9kZXMuCmFic3RyYWN0IGNsYXNzIFR5cGVTeXN0ZW1TdHJhdGVneSB7CiAgLy8vIENyZWF0ZXMgW01lbWJlclR5cGVJbmZvcm1hdGlvbl0gZm9yIFttZW1iZXJdLgogIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBjcmVhdGVNZW1iZXJUeXBlSW5mb3JtYXRpb24oCiAgICAgIEFic3RyYWN0VmFsdWVEb21haW4gYWJzdHJhY3RWYWx1ZURvbWFpbiwgTWVtYmVyRW50aXR5IG1lbWJlcik7CgogIC8vLyBDcmVhdGVzIFtQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb25dIGZvciBbcGFyYW1ldGVyXS4KICBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24gY3JlYXRlUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uKAogICAgICBBYnN0cmFjdFZhbHVlRG9tYWluIGFic3RyYWN0VmFsdWVEb21haW4sCiAgICAgIExvY2FsIHBhcmFtZXRlciwKICAgICAgVHlwZVN5c3RlbSB0eXBlcyk7CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggcGFyYW1ldGVyIGluIFtmdW5jdGlvbl0uCiAgdm9pZCBmb3JFYWNoUGFyYW1ldGVyKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uLCB2b2lkIGYoTG9jYWwgcGFyYW1ldGVyKSk7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgW25vZGVdIGlzIHZhbGlkIGFzIGEgZ2VuZXJhbCBwaGkgbm9kZS4KICBib29sIGNoZWNrUGhpTm9kZShpci5Ob2RlIG5vZGUpOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIFtub2RlXSBpcyB2YWxpZCBhcyBhIGxvb3AgcGhpIG5vZGUuCiAgYm9vbCBjaGVja0xvb3BQaGlOb2RlKGlyLk5vZGUgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgW25vZGVdIGlzIHZhbGlkIGFzIGEgbGlzdCBhbGxvY2F0aW9uIG5vZGUuCiAgYm9vbCBjaGVja0xpc3ROb2RlKGlyLk5vZGUgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgW25vZGVdIGlzIHZhbGlkIGFzIGEgc2V0IGFsbG9jYXRpb24gbm9kZS4KICBib29sIGNoZWNrU2V0Tm9kZShpci5Ob2RlIG5vZGUpOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIFtub2RlXSBpcyB2YWxpZCBhcyBhIG1hcCBhbGxvY2F0aW9uIG5vZGUuCiAgYm9vbCBjaGVja01hcE5vZGUoaXIuTm9kZSBub2RlKTsKCiAgLy8vIFJldHVybnMgd2hldGhlciBbY2xzXSBpcyB2YWxpZCBhcyBhIHR5cGUgbWFzayBiYXNlIGNsYXNzLgogIGJvb2wgY2hlY2tDbGFzc0VudGl0eShDbGFzc0VudGl0eSBjbHMpOwp9CgovLy8gVGhlIGNsYXNzIFtTaW1wbGVJbmZlcnJlclZpc2l0b3JdIHdpbGwgdXNlIHdoZW4gd29ya2luZyBvbiB0eXBlcy4KY2xhc3MgVHlwZVN5c3RlbSB7CiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKICBmaW5hbCBUeXBlU3lzdGVtU3RyYXRlZ3kgc3RyYXRlZ3k7CgogIC8vLyBbcGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uc10gYW5kIFttZW1iZXJUeXBlSW5mb3JtYXRpb25zXSBvcmRlcmVkIGJ5CiAgLy8vIGNyZWF0aW9uIHRpbWUuIFRoaXMgaXMgdXNlZCBhcyB0aGUgaW5mZXJlbmNlIGVucXVldWVpbmcgb3JkZXIuCiAgZmluYWwgTGlzdDxUeXBlSW5mb3JtYXRpb24+IF9vcmRlcmVkVHlwZUluZm9ybWF0aW9ucyA9IDxUeXBlSW5mb3JtYXRpb24+W107CgogIC8vLyBbUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uXXMgZm9yIHBhcmFtZXRlcnMuCiAgZmluYWwgTWFwPExvY2FsLCBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24+IHBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbnMgPQogICAgICBuZXcgTWFwPExvY2FsLCBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24+KCk7CgogIC8vLyBbTWVtYmVyVHlwZUluZm9ybWF0aW9uXXMgZm9yIG1lbWJlcnMuCiAgZmluYWwgTWFwPE1lbWJlckVudGl0eSwgTWVtYmVyVHlwZUluZm9ybWF0aW9uPiBtZW1iZXJUeXBlSW5mb3JtYXRpb25zID0KICAgICAgbmV3IE1hcDxNZW1iZXJFbnRpdHksIE1lbWJlclR5cGVJbmZvcm1hdGlvbj4oKTsKCiAgLy8vIFtMaXN0VHlwZUluZm9ybWF0aW9uXSBmb3IgYWxsb2NhdGVkIGxpc3RzLgogIGZpbmFsIE1hcDxpci5UcmVlTm9kZSwgTGlzdFR5cGVJbmZvcm1hdGlvbj4gYWxsb2NhdGVkTGlzdHMgPQogICAgICBuZXcgTWFwPGlyLlRyZWVOb2RlLCBMaXN0VHlwZUluZm9ybWF0aW9uPigpOwoKICAvLy8gW1NldFR5cGVJbmZvcm1hdGlvbl0gZm9yIGFsbG9jYXRlZCBTZXRzLgogIGZpbmFsIE1hcDxpci5UcmVlTm9kZSwgU2V0VHlwZUluZm9ybWF0aW9uPiBhbGxvY2F0ZWRTZXRzID0KICAgICAgbmV3IE1hcDxpci5UcmVlTm9kZSwgU2V0VHlwZUluZm9ybWF0aW9uPigpOwoKICAvLy8gW01hcFR5cGVJbmZvcm1hdGlvbl0gZm9yIGFsbG9jYXRlZCBNYXBzLgogIGZpbmFsIE1hcDxpci5UcmVlTm9kZSwgVHlwZUluZm9ybWF0aW9uPiBhbGxvY2F0ZWRNYXBzID0KICAgICAgbmV3IE1hcDxpci5UcmVlTm9kZSwgVHlwZUluZm9ybWF0aW9uPigpOwoKICAvLy8gQ2xvc3VyZXMgZm91bmQgZHVyaW5nIHRoZSBhbmFseXNpcy4KICBmaW5hbCBTZXQ8VHlwZUluZm9ybWF0aW9uPiBhbGxvY2F0ZWRDbG9zdXJlcyA9IG5ldyBTZXQ8VHlwZUluZm9ybWF0aW9uPigpOwoKICAvLy8gQ2FjaGUgb2YgW0NvbmNyZXRlVHlwZUluZm9ybWF0aW9uXS4KICBmaW5hbCBNYXA8QWJzdHJhY3RWYWx1ZSwgVHlwZUluZm9ybWF0aW9uPiBjb25jcmV0ZVR5cGVzID0KICAgICAgbmV3IE1hcDxBYnN0cmFjdFZhbHVlLCBUeXBlSW5mb3JtYXRpb24+KCk7CgogIC8vLyBMaXN0IG9mIFtUeXBlSW5mb3JtYXRpb25dcyBmb3IgY2FsbHMgaW5zaWRlIG1ldGhvZCBib2RpZXMuCiAgZmluYWwgTGlzdDxDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbj4gYWxsb2NhdGVkQ2FsbHMgPQogICAgICA8Q2FsbFNpdGVUeXBlSW5mb3JtYXRpb24+W107CgogIC8vLyBMaXN0IG9mIFtUeXBlSW5mb3JtYXRpb25dcyBhbGxvY2F0ZWQgaW5zaWRlIG1ldGhvZCBib2RpZXMgKG5hcnJvd2luZywKICAvLy8gcGhpcywgYW5kIGNvbnRhaW5lcnMpLgogIGZpbmFsIExpc3Q8VHlwZUluZm9ybWF0aW9uPiBhbGxvY2F0ZWRUeXBlcyA9IDxUeXBlSW5mb3JtYXRpb24+W107CgogIC8vLyBbcGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uc10gYW5kIFttZW1iZXJUeXBlSW5mb3JtYXRpb25zXSBvcmRlcmVkIGJ5CiAgLy8vIGNyZWF0aW9uIHRpbWUuIFRoaXMgaXMgdXNlZCBhcyB0aGUgaW5mZXJlbmNlIGVucXVldWVpbmcgb3JkZXIuCiAgSXRlcmFibGU8VHlwZUluZm9ybWF0aW9uPiBnZXQgb3JkZXJlZFR5cGVJbmZvcm1hdGlvbnMgPT4KICAgICAgX29yZGVyZWRUeXBlSW5mb3JtYXRpb25zOwoKICBJdGVyYWJsZTxUeXBlSW5mb3JtYXRpb24+IGdldCBhbGxUeXBlcyA9PiBbCiAgICAgICAgcGFyYW1ldGVyVHlwZUluZm9ybWF0aW9ucy52YWx1ZXMsCiAgICAgICAgbWVtYmVyVHlwZUluZm9ybWF0aW9ucy52YWx1ZXMsCiAgICAgICAgYWxsb2NhdGVkTGlzdHMudmFsdWVzLAogICAgICAgIGFsbG9jYXRlZFNldHMudmFsdWVzLAogICAgICAgIGFsbG9jYXRlZE1hcHMudmFsdWVzLAogICAgICAgIGFsbG9jYXRlZENsb3N1cmVzLAogICAgICAgIGNvbmNyZXRlVHlwZXMudmFsdWVzLAogICAgICAgIGFsbG9jYXRlZENhbGxzLAogICAgICAgIGFsbG9jYXRlZFR5cGVzCiAgICAgIF0uZXhwYW5kKCh4KSA9PiB4KTsKCiAgVHlwZVN5c3RlbSh0aGlzLl9jbG9zZWRXb3JsZCwgdGhpcy5zdHJhdGVneSkgewogICAgbm9uTnVsbEVtcHR5VHlwZSA9IGdldENvbmNyZXRlVHlwZUZvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5lbXB0eVR5cGUpOwogIH0KCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgX2Fic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgX2Nsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIC8vLyBVc2VkIHRvIGdyb3VwIFtUeXBlSW5mb3JtYXRpb25dIG5vZGVzIGJ5IHRoZSBlbGVtZW50IHRoYXQgdHJpZ2dlcmVkIHRoZWlyCiAgLy8vIGNyZWF0aW9uLgogIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBfY3VycmVudE1lbWJlciA9IG51bGw7CiAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIGdldCBjdXJyZW50TWVtYmVyID0+IF9jdXJyZW50TWVtYmVyOwoKICB2b2lkIHdpdGhNZW1iZXIoTWVtYmVyRW50aXR5IGVsZW1lbnQsIHZvaWQgYWN0aW9uKCkpIHsKICAgIGFzc2VydChfY3VycmVudE1lbWJlciA9PSBudWxsLAogICAgICAgIGZhaWxlZEF0KGVsZW1lbnQsICJBbHJlYWR5IGNvbnN0cnVjdGluZyBncmFwaCBmb3IgJF9jdXJyZW50TWVtYmVyLiIpKTsKICAgIF9jdXJyZW50TWVtYmVyID0gZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZWxlbWVudCk7CiAgICBhY3Rpb24oKTsKICAgIF9jdXJyZW50TWVtYmVyID0gbnVsbDsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBudWxsVHlwZUNhY2hlOwogIFR5cGVJbmZvcm1hdGlvbiBnZXQgbnVsbFR5cGUgewogICAgaWYgKG51bGxUeXBlQ2FjaGUgIT0gbnVsbCkgcmV0dXJuIG51bGxUeXBlQ2FjaGU7CiAgICByZXR1cm4gbnVsbFR5cGVDYWNoZSA9IGdldENvbmNyZXRlVHlwZUZvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5udWxsVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gaW50VHlwZUNhY2hlOwogIFR5cGVJbmZvcm1hdGlvbiBnZXQgaW50VHlwZSB7CiAgICBpZiAoaW50VHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBpbnRUeXBlQ2FjaGU7CiAgICByZXR1cm4gaW50VHlwZUNhY2hlID0gZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmludFR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIHVpbnQzMlR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IHVpbnQzMlR5cGUgewogICAgaWYgKHVpbnQzMlR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gdWludDMyVHlwZUNhY2hlOwogICAgcmV0dXJuIHVpbnQzMlR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLnVpbnQzMlR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIHVpbnQzMVR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IHVpbnQzMVR5cGUgewogICAgaWYgKHVpbnQzMVR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gdWludDMxVHlwZUNhY2hlOwogICAgcmV0dXJuIHVpbnQzMVR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLnVpbnQzMVR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIHBvc2l0aXZlSW50VHlwZUNhY2hlOwogIFR5cGVJbmZvcm1hdGlvbiBnZXQgcG9zaXRpdmVJbnRUeXBlIHsKICAgIGlmIChwb3NpdGl2ZUludFR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gcG9zaXRpdmVJbnRUeXBlQ2FjaGU7CiAgICByZXR1cm4gcG9zaXRpdmVJbnRUeXBlQ2FjaGUgPQogICAgICAgIGdldENvbmNyZXRlVHlwZUZvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5wb3NpdGl2ZUludFR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGRvdWJsZVR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IGRvdWJsZVR5cGUgewogICAgaWYgKGRvdWJsZVR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gZG91YmxlVHlwZUNhY2hlOwogICAgcmV0dXJuIGRvdWJsZVR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmRvdWJsZVR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIG51bVR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IG51bVR5cGUgewogICAgaWYgKG51bVR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gbnVtVHlwZUNhY2hlOwogICAgcmV0dXJuIG51bVR5cGVDYWNoZSA9IGdldENvbmNyZXRlVHlwZUZvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5udW1UeXBlKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBib29sVHlwZUNhY2hlOwogIFR5cGVJbmZvcm1hdGlvbiBnZXQgYm9vbFR5cGUgewogICAgaWYgKGJvb2xUeXBlQ2FjaGUgIT0gbnVsbCkgcmV0dXJuIGJvb2xUeXBlQ2FjaGU7CiAgICByZXR1cm4gYm9vbFR5cGVDYWNoZSA9IGdldENvbmNyZXRlVHlwZUZvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gZnVuY3Rpb25UeXBlQ2FjaGU7CiAgVHlwZUluZm9ybWF0aW9uIGdldCBmdW5jdGlvblR5cGUgewogICAgaWYgKGZ1bmN0aW9uVHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBmdW5jdGlvblR5cGVDYWNoZTsKICAgIHJldHVybiBmdW5jdGlvblR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmZ1bmN0aW9uVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gbGlzdFR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IGxpc3RUeXBlIHsKICAgIGlmIChsaXN0VHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBsaXN0VHlwZUNhY2hlOwogICAgcmV0dXJuIGxpc3RUeXBlQ2FjaGUgPSBnZXRDb25jcmV0ZVR5cGVGb3IoX2Fic3RyYWN0VmFsdWVEb21haW4ubGlzdFR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGNvbnN0TGlzdFR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IGNvbnN0TGlzdFR5cGUgewogICAgaWYgKGNvbnN0TGlzdFR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gY29uc3RMaXN0VHlwZUNhY2hlOwogICAgcmV0dXJuIGNvbnN0TGlzdFR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmNvbnN0TGlzdFR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGZpeGVkTGlzdFR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IGZpeGVkTGlzdFR5cGUgewogICAgaWYgKGZpeGVkTGlzdFR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gZml4ZWRMaXN0VHlwZUNhY2hlOwogICAgcmV0dXJuIGZpeGVkTGlzdFR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmZpeGVkTGlzdFR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGdyb3dhYmxlTGlzdFR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IGdyb3dhYmxlTGlzdFR5cGUgewogICAgaWYgKGdyb3dhYmxlTGlzdFR5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gZ3Jvd2FibGVMaXN0VHlwZUNhY2hlOwogICAgcmV0dXJuIGdyb3dhYmxlTGlzdFR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmdyb3dhYmxlTGlzdFR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIHNldFR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IHNldFR5cGUgPT4KICAgICAgc2V0VHlwZUNhY2hlID8/PSBnZXRDb25jcmV0ZVR5cGVGb3IoX2Fic3RyYWN0VmFsdWVEb21haW4uc2V0VHlwZSk7CgogIFR5cGVJbmZvcm1hdGlvbiBjb25zdFNldFR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IGNvbnN0U2V0VHlwZSA9PiBjb25zdFNldFR5cGVDYWNoZSA/Pz0KICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmNvbnN0U2V0VHlwZSk7CgogIFR5cGVJbmZvcm1hdGlvbiBtYXBUeXBlQ2FjaGU7CiAgVHlwZUluZm9ybWF0aW9uIGdldCBtYXBUeXBlIHsKICAgIGlmIChtYXBUeXBlQ2FjaGUgIT0gbnVsbCkgcmV0dXJuIG1hcFR5cGVDYWNoZTsKICAgIHJldHVybiBtYXBUeXBlQ2FjaGUgPSBnZXRDb25jcmV0ZVR5cGVGb3IoX2Fic3RyYWN0VmFsdWVEb21haW4ubWFwVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gY29uc3RNYXBUeXBlQ2FjaGU7CiAgVHlwZUluZm9ybWF0aW9uIGdldCBjb25zdE1hcFR5cGUgewogICAgaWYgKGNvbnN0TWFwVHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBjb25zdE1hcFR5cGVDYWNoZTsKICAgIHJldHVybiBjb25zdE1hcFR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmNvbnN0TWFwVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gc3RyaW5nVHlwZUNhY2hlOwogIFR5cGVJbmZvcm1hdGlvbiBnZXQgc3RyaW5nVHlwZSB7CiAgICBpZiAoc3RyaW5nVHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBzdHJpbmdUeXBlQ2FjaGU7CiAgICByZXR1cm4gc3RyaW5nVHlwZUNhY2hlID0KICAgICAgICBnZXRDb25jcmV0ZVR5cGVGb3IoX2Fic3RyYWN0VmFsdWVEb21haW4uc3RyaW5nVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gdHlwZVR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IHR5cGVUeXBlIHsKICAgIGlmICh0eXBlVHlwZUNhY2hlICE9IG51bGwpIHJldHVybiB0eXBlVHlwZUNhY2hlOwogICAgcmV0dXJuIHR5cGVUeXBlQ2FjaGUgPSBnZXRDb25jcmV0ZVR5cGVGb3IoX2Fic3RyYWN0VmFsdWVEb21haW4udHlwZVR5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGR5bmFtaWNUeXBlQ2FjaGU7CiAgVHlwZUluZm9ybWF0aW9uIGdldCBkeW5hbWljVHlwZSB7CiAgICBpZiAoZHluYW1pY1R5cGVDYWNoZSAhPSBudWxsKSByZXR1cm4gZHluYW1pY1R5cGVDYWNoZTsKICAgIHJldHVybiBkeW5hbWljVHlwZUNhY2hlID0KICAgICAgICBnZXRDb25jcmV0ZVR5cGVGb3IoX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGFzeW5jRnV0dXJlVHlwZUNhY2hlOwogIC8vIFN1YnR5cGUgb2YgRnV0dXJlIHJldHVybmVkIGJ5IGFzeW5jIG1ldGhvZHMuCiAgVHlwZUluZm9ybWF0aW9uIGdldCBhc3luY0Z1dHVyZVR5cGUgewogICAgaWYgKGFzeW5jRnV0dXJlVHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBhc3luY0Z1dHVyZVR5cGVDYWNoZTsKICAgIHJldHVybiBhc3luY0Z1dHVyZVR5cGVDYWNoZSA9CiAgICAgICAgZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmFzeW5jRnV0dXJlVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gc3luY1N0YXJJdGVyYWJsZVR5cGVDYWNoZTsKICBUeXBlSW5mb3JtYXRpb24gZ2V0IHN5bmNTdGFySXRlcmFibGVUeXBlIHsKICAgIGlmIChzeW5jU3Rhckl0ZXJhYmxlVHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBzeW5jU3Rhckl0ZXJhYmxlVHlwZUNhY2hlOwogICAgcmV0dXJuIHN5bmNTdGFySXRlcmFibGVUeXBlQ2FjaGUgPQogICAgICAgIGdldENvbmNyZXRlVHlwZUZvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5zeW5jU3Rhckl0ZXJhYmxlVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gYXN5bmNTdGFyU3RyZWFtVHlwZUNhY2hlOwogIFR5cGVJbmZvcm1hdGlvbiBnZXQgYXN5bmNTdGFyU3RyZWFtVHlwZSB7CiAgICBpZiAoYXN5bmNTdGFyU3RyZWFtVHlwZUNhY2hlICE9IG51bGwpIHJldHVybiBhc3luY1N0YXJTdHJlYW1UeXBlQ2FjaGU7CiAgICByZXR1cm4gYXN5bmNTdGFyU3RyZWFtVHlwZUNhY2hlID0KICAgICAgICBnZXRDb25jcmV0ZVR5cGVGb3IoX2Fic3RyYWN0VmFsdWVEb21haW4uYXN5bmNTdGFyU3RyZWFtVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gbm9uTnVsbEVtcHR5VHlwZTsKCiAgVHlwZUluZm9ybWF0aW9uIHN0cmluZ0xpdGVyYWxUeXBlKFN0cmluZyB2YWx1ZSkgewogICAgcmV0dXJuIG5ldyBTdHJpbmdMaXRlcmFsVHlwZUluZm9ybWF0aW9uKAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLCB2YWx1ZSwgX2Fic3RyYWN0VmFsdWVEb21haW4uc3RyaW5nVHlwZSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gYm9vbExpdGVyYWxUeXBlKGJvb2wgdmFsdWUpIHsKICAgIHJldHVybiBuZXcgQm9vbExpdGVyYWxUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIHZhbHVlLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgYmV0d2VlbiBbZmlyc3RUeXBlXSBhbmQKICAvLy8gW3NlY29uZFR5cGVdLgogIFR5cGVJbmZvcm1hdGlvbiBjb21wdXRlTFVCKAogICAgICBUeXBlSW5mb3JtYXRpb24gZmlyc3RUeXBlLCBUeXBlSW5mb3JtYXRpb24gc2Vjb25kVHlwZSkgewogICAgaWYgKGZpcnN0VHlwZSA9PSBudWxsKSByZXR1cm4gc2Vjb25kVHlwZTsKICAgIGlmIChmaXJzdFR5cGUgPT0gc2Vjb25kVHlwZSkgcmV0dXJuIGZpcnN0VHlwZTsKICAgIGlmIChmaXJzdFR5cGUgPT0gbm9uTnVsbEVtcHR5VHlwZSkgcmV0dXJuIHNlY29uZFR5cGU7CiAgICBpZiAoc2Vjb25kVHlwZSA9PSBub25OdWxsRW1wdHlUeXBlKSByZXR1cm4gZmlyc3RUeXBlOwogICAgaWYgKGZpcnN0VHlwZSA9PSBkeW5hbWljVHlwZSB8fCBzZWNvbmRUeXBlID09IGR5bmFtaWNUeXBlKSB7CiAgICAgIHJldHVybiBkeW5hbWljVHlwZTsKICAgIH0KICAgIHJldHVybiBnZXRDb25jcmV0ZVR5cGVGb3IoCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4udW5pb24oZmlyc3RUeXBlLnR5cGUsIHNlY29uZFR5cGUudHlwZSkpOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGBzZWxlY3RvcmAgc2hvdWxkIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgbmV3CiAgLy8vIGByZWNlaXZlclR5cGVgLgogIGJvb2wgc2VsZWN0b3JOZWVkc1VwZGF0ZShUeXBlSW5mb3JtYXRpb24gaW5mbywgQWJzdHJhY3RWYWx1ZSBtYXNrKSB7CiAgICByZXR1cm4gaW5mby50eXBlICE9IG1hc2s7CiAgfQoKICBib29sIF9pc05vbk51bGxOYXJyb3coVHlwZUluZm9ybWF0aW9uIHR5cGUpID0+CiAgICAgIHR5cGUgaXMgTmFycm93VHlwZUluZm9ybWF0aW9uICYmCiAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbCh0eXBlLnR5cGVBbm5vdGF0aW9uKS5pc0RlZmluaXRlbHlGYWxzZTsKCiAgLy8vIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIFt0eXBlXSBhbmQgW2Fubm90YXRpb25dLgogIC8vLyBbaXNOdWxsYWJsZV0gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFubm90YXRpb24gaW1wbGllcyBhIG51bGwKICAvLy8gdHlwZS4KICBUeXBlSW5mb3JtYXRpb24gbmFycm93VHlwZShUeXBlSW5mb3JtYXRpb24gdHlwZSwgRGFydFR5cGUgYW5ub3RhdGlvbiwKICAgICAge2Jvb2wgaXNOdWxsYWJsZTogdHJ1ZX0pIHsKICAgIEFic3RyYWN0VmFsdWUgb3RoZXJUeXBlOwogICAgaWYgKGFubm90YXRpb24uaXNWb2lkKSByZXR1cm4gdHlwZTsKICAgIGlmIChhbm5vdGF0aW9uLnRyZWF0QXNEeW5hbWljKSB7CiAgICAgIGlmIChpc051bGxhYmxlKSByZXR1cm4gdHlwZTsKICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGFscmVhZHkgbmFycm93ZWQgdG8gYmUgbm90LW51bGwsIHRoZXJlIGlzIG5vIHZhbHVlCiAgICAgIC8vIGluIGFkZGluZyBhbm90aGVyIG5hcnJvd2luZyBub2RlLgogICAgICBpZiAoX2lzTm9uTnVsbE5hcnJvdyh0eXBlKSkgcmV0dXJuIHR5cGU7CiAgICAgIG90aGVyVHlwZSA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLmV4Y2x1ZGVOdWxsKGR5bmFtaWNUeXBlLnR5cGUpOwogICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uLmlzSW50ZXJmYWNlVHlwZSkgewogICAgICBJbnRlcmZhY2VUeXBlIGludGVyZmFjZSA9IGFubm90YXRpb247CiAgICAgIGlmIChpbnRlcmZhY2UuZWxlbWVudCA9PSBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMub2JqZWN0Q2xhc3MpIHsKICAgICAgICBpZiAoaXNOdWxsYWJsZSkgcmV0dXJuIHR5cGU7CiAgICAgICAgaWYgKF9pc05vbk51bGxOYXJyb3codHlwZSkpIHJldHVybiB0eXBlOwogICAgICAgIG90aGVyVHlwZSA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLmV4Y2x1ZGVOdWxsKGR5bmFtaWNUeXBlLnR5cGUpOwogICAgICB9IGVsc2UgewogICAgICAgIG90aGVyVHlwZSA9CiAgICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxTdWJ0eXBlKGludGVyZmFjZS5lbGVtZW50KTsKICAgICAgfQogICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uLmlzVHlwZWRlZiB8fCBhbm5vdGF0aW9uLmlzRnVuY3Rpb25UeXBlKSB7CiAgICAgIG90aGVyVHlwZSA9IGZ1bmN0aW9uVHlwZS50eXBlOwogICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uLmlzRnV0dXJlT3IpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCBuYXJyb3dpbmcgb2YgRnV0dXJlT3IuCiAgICAgIHJldHVybiB0eXBlOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGFubm90YXRpb24uaXNUeXBlVmFyaWFibGUpOwogICAgICAvLyBUT0RPKG5nZW9mZnJheSk6IE5hcnJvdyB0byBib3VuZC4KICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CiAgICBpZiAoaXNOdWxsYWJsZSkgewogICAgICBvdGhlclR5cGUgPSBfYWJzdHJhY3RWYWx1ZURvbWFpbi5pbmNsdWRlTnVsbChvdGhlclR5cGUpOwogICAgfQogICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzRXhhY3QodHlwZS50eXBlKS5pc0RlZmluaXRlbHlUcnVlKSByZXR1cm4gdHlwZTsKICAgIFR5cGVJbmZvcm1hdGlvbiBuZXdUeXBlID0KICAgICAgICBuZXcgTmFycm93VHlwZUluZm9ybWF0aW9uKF9hYnN0cmFjdFZhbHVlRG9tYWluLCB0eXBlLCBvdGhlclR5cGUpOwogICAgYWxsb2NhdGVkVHlwZXMuYWRkKG5ld1R5cGUpOwogICAgcmV0dXJuIG5ld1R5cGU7CiAgfQoKICBQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24gZ2V0SW5mZXJyZWRUeXBlT2ZQYXJhbWV0ZXIoTG9jYWwgcGFyYW1ldGVyKSB7CiAgICByZXR1cm4gcGFyYW1ldGVyVHlwZUluZm9ybWF0aW9ucy5wdXRJZkFic2VudChwYXJhbWV0ZXIsICgpIHsKICAgICAgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uIHR5cGVJbmZvcm1hdGlvbiA9CiAgICAgICAgICBzdHJhdGVneS5jcmVhdGVQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIHBhcmFtZXRlciwgdGhpcyk7CiAgICAgIF9vcmRlcmVkVHlwZUluZm9ybWF0aW9ucy5hZGQodHlwZUluZm9ybWF0aW9uKTsKICAgICAgcmV0dXJuIHR5cGVJbmZvcm1hdGlvbjsKICAgIH0pOwogIH0KCiAgdm9pZCBmb3JFYWNoUGFyYW1ldGVyVHlwZSgKICAgICAgdm9pZCBmKExvY2FsIHBhcmFtZXRlciwgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uIHR5cGVJbmZvcm1hdGlvbikpIHsKICAgIHBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbnMuZm9yRWFjaChmKTsKICB9CgogIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBnZXRJbmZlcnJlZFR5cGVPZk1lbWJlcihNZW1iZXJFbnRpdHkgbWVtYmVyKSB7CiAgICBhc3NlcnQoIW1lbWJlci5pc0Fic3RyYWN0LAogICAgICAgIGZhaWxlZEF0KG1lbWJlciwgIlVuZXhwZWN0ZWQgYWJzdHJhY3QgbWVtYmVyICRtZW1iZXIuIikpOwogICAgcmV0dXJuIG1lbWJlclR5cGVJbmZvcm1hdGlvbnNbbWVtYmVyXSA/Pz0gX2dldEluZmVycmVkVHlwZU9mTWVtYmVyKG1lbWJlcik7CiAgfQoKICB2b2lkIGZvckVhY2hNZW1iZXJUeXBlKAogICAgICB2b2lkIGYoTWVtYmVyRW50aXR5IG1lbWJlciwgTWVtYmVyVHlwZUluZm9ybWF0aW9uIHR5cGVJbmZvcm1hdGlvbikpIHsKICAgIG1lbWJlclR5cGVJbmZvcm1hdGlvbnMuZm9yRWFjaChmKTsKICB9CgogIE1lbWJlclR5cGVJbmZvcm1hdGlvbiBfZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoTWVtYmVyRW50aXR5IG1lbWJlcikgewogICAgTWVtYmVyVHlwZUluZm9ybWF0aW9uIHR5cGVJbmZvcm1hdGlvbiA9CiAgICAgICAgc3RyYXRlZ3kuY3JlYXRlTWVtYmVyVHlwZUluZm9ybWF0aW9uKF9hYnN0cmFjdFZhbHVlRG9tYWluLCBtZW1iZXIpOwogICAgX29yZGVyZWRUeXBlSW5mb3JtYXRpb25zLmFkZCh0eXBlSW5mb3JtYXRpb24pOwogICAgcmV0dXJuIHR5cGVJbmZvcm1hdGlvbjsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBpbnRlcm5hbCBpbmZlcnJlciByZXByZXNlbnRhdGlvbiBmb3IgW21hc2tdLgogIENvbmNyZXRlVHlwZUluZm9ybWF0aW9uIGdldENvbmNyZXRlVHlwZUZvcihBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIGFzc2VydChtYXNrICE9IG51bGwpOwogICAgcmV0dXJuIGNvbmNyZXRlVHlwZXMucHV0SWZBYnNlbnQobWFzaywgKCkgewogICAgICByZXR1cm4gbmV3IENvbmNyZXRlVHlwZUluZm9ybWF0aW9uKG1hc2spOwogICAgfSk7CiAgfQoKICBTdHJpbmcgZ2V0SW5mZXJyZWRTaWduYXR1cmVPZk1ldGhvZChGdW5jdGlvbkVudGl0eSBmdW5jdGlvbikgewogICAgRWxlbWVudFR5cGVJbmZvcm1hdGlvbiBpbmZvID0gZ2V0SW5mZXJyZWRUeXBlT2ZNZW1iZXIoZnVuY3Rpb24pOwogICAgdmFyIHJlcyA9ICIiOwogICAgc3RyYXRlZ3kuZm9yRWFjaFBhcmFtZXRlcihmdW5jdGlvbiwgKExvY2FsIHBhcmFtZXRlcikgewogICAgICBUeXBlSW5mb3JtYXRpb24gdHlwZSA9IGdldEluZmVycmVkVHlwZU9mUGFyYW1ldGVyKHBhcmFtZXRlcik7CiAgICAgIHJlcyArPSAiJHtyZXMuaXNFbXB0eSA/ICcoJyA6ICcsICd9JHt0eXBlLnR5cGV9ICR7cGFyYW1ldGVyLm5hbWV9IjsKICAgIH0pOwogICAgcmVzICs9ICIpIC0+ICR7aW5mby50eXBlfSI7CiAgICByZXR1cm4gcmVzOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIG5vbk51bGxTdWJ0eXBlKENsYXNzRW50aXR5IGNscykgewogICAgYXNzZXJ0KHN0cmF0ZWd5LmNoZWNrQ2xhc3NFbnRpdHkoY2xzKSk7CiAgICByZXR1cm4gZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxTdWJ0eXBlKGNscykpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIG5vbk51bGxTdWJjbGFzcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIGFzc2VydChzdHJhdGVneS5jaGVja0NsYXNzRW50aXR5KGNscykpOwogICAgcmV0dXJuIGdldENvbmNyZXRlVHlwZUZvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVOb25OdWxsU3ViY2xhc3MoY2xzKSk7CiAgfQoKICBUeXBlSW5mb3JtYXRpb24gbm9uTnVsbEV4YWN0KENsYXNzRW50aXR5IGNscykgewogICAgYXNzZXJ0KHN0cmF0ZWd5LmNoZWNrQ2xhc3NFbnRpdHkoY2xzKSk7CiAgICByZXR1cm4gZ2V0Q29uY3JldGVUeXBlRm9yKF9hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxFeGFjdChjbHMpKTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBub25OdWxsRW1wdHkoKSB7CiAgICByZXR1cm4gbm9uTnVsbEVtcHR5VHlwZTsKICB9CgogIGJvb2wgaXNOdWxsKFR5cGVJbmZvcm1hdGlvbiB0eXBlKSB7CiAgICByZXR1cm4gdHlwZSA9PSBudWxsVHlwZTsKICB9CgogIFR5cGVJbmZvcm1hdGlvbiBhbGxvY2F0ZUxpc3QoCiAgICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlLCBpci5UcmVlTm9kZSBub2RlLCBNZW1iZXJFbnRpdHkgZW5jbG9zaW5nLAogICAgICBbVHlwZUluZm9ybWF0aW9uIGVsZW1lbnRUeXBlLCBpbnQgbGVuZ3RoXSkgewogICAgYXNzZXJ0KHN0cmF0ZWd5LmNoZWNrTGlzdE5vZGUobm9kZSkpOwogICAgQ2xhc3NFbnRpdHkgdHlwZWREYXRhQ2xhc3MgPSBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMudHlwZWREYXRhQ2xhc3M7CiAgICBib29sIGlzVHlwZWRBcnJheSA9IHR5cGVkRGF0YUNsYXNzICE9IG51bGwgJiYKICAgICAgICBfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkuaXNJbnN0YW50aWF0ZWQodHlwZWREYXRhQ2xhc3MpICYmCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAgICAgLmlzSW5zdGFuY2VPZk9yTnVsbCh0eXBlLnR5cGUsIHR5cGVkRGF0YUNsYXNzKQogICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZTsKICAgIGJvb2wgaXNDb25zdCA9ICh0eXBlLnR5cGUgPT0gX2Fic3RyYWN0VmFsdWVEb21haW4uY29uc3RMaXN0VHlwZSk7CiAgICBib29sIGlzRml4ZWQgPSAodHlwZS50eXBlID09IF9hYnN0cmFjdFZhbHVlRG9tYWluLmZpeGVkTGlzdFR5cGUpIHx8CiAgICAgICAgaXNDb25zdCB8fAogICAgICAgIGlzVHlwZWRBcnJheTsKICAgIGJvb2wgaXNFbGVtZW50SW5mZXJyZWQgPSBpc0NvbnN0IHx8IGlzVHlwZWRBcnJheTsKCiAgICBpbnQgaW5mZXJyZWRMZW5ndGggPSBpc0ZpeGVkID8gbGVuZ3RoIDogbnVsbDsKICAgIEFic3RyYWN0VmFsdWUgZWxlbWVudFR5cGVNYXNrID0KICAgICAgICBpc0VsZW1lbnRJbmZlcnJlZCA/IGVsZW1lbnRUeXBlLnR5cGUgOiBkeW5hbWljVHlwZS50eXBlOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX2Fic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlQ29udGFpbmVyVmFsdWUoCiAgICAgICAgdHlwZS50eXBlLCBub2RlLCBlbmNsb3NpbmcsIGVsZW1lbnRUeXBlTWFzaywgaW5mZXJyZWRMZW5ndGgpOwogICAgRWxlbWVudEluQ29udGFpbmVyVHlwZUluZm9ybWF0aW9uIGVsZW1lbnQgPQogICAgICAgIG5ldyBFbGVtZW50SW5Db250YWluZXJUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLCBjdXJyZW50TWVtYmVyLCBlbGVtZW50VHlwZSk7CiAgICBlbGVtZW50LmluZmVycmVkID0gaXNFbGVtZW50SW5mZXJyZWQ7CgogICAgYWxsb2NhdGVkVHlwZXMuYWRkKGVsZW1lbnQpOwogICAgcmV0dXJuIGFsbG9jYXRlZExpc3RzW25vZGVdID0gbmV3IExpc3RUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIGN1cnJlbnRNZW1iZXIsIG1hc2ssIGVsZW1lbnQsIGxlbmd0aCk7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIFtUeXBlSW5mb3JtYXRpb25dIG9iamVjdCBlaXRoZXIgZm9yIHRoZSBjbG9zdXJpemF0aW9uIG9mIGEKICAvLy8gc3RhdGljIG9yIHRvcC1sZXZlbCBtZXRob2QgW2VsZW1lbnRdIHVzZWQgYXMgYSBmdW5jdGlvbiBjb25zdGFudCBvciBmb3IKICAvLy8gdGhlIHN5bnRoZXNpemVkICdjYWxsJyBtZXRob2QgW2VsZW1lbnRdIGNyZWF0ZWQgZm9yIGEgbG9jYWwgZnVuY3Rpb24uCiAgVHlwZUluZm9ybWF0aW9uIGFsbG9jYXRlQ2xvc3VyZShGdW5jdGlvbkVudGl0eSBlbGVtZW50KSB7CiAgICBUeXBlSW5mb3JtYXRpb24gcmVzdWx0ID0gbmV3IENsb3N1cmVUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIGN1cnJlbnRNZW1iZXIsIGVsZW1lbnQpOwogICAgYWxsb2NhdGVkQ2xvc3VyZXMuYWRkKHJlc3VsdCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGFsbG9jYXRlU2V0KAogICAgICBUeXBlSW5mb3JtYXRpb24gdHlwZSwgaXIuVHJlZU5vZGUgbm9kZSwgTWVtYmVyRW50aXR5IGVuY2xvc2luZywKICAgICAgW1R5cGVJbmZvcm1hdGlvbiBlbGVtZW50VHlwZV0pIHsKICAgIGFzc2VydChzdHJhdGVneS5jaGVja1NldE5vZGUobm9kZSkpOwogICAgYm9vbCBpc0NvbnN0ID0gdHlwZS50eXBlID09IF9hYnN0cmFjdFZhbHVlRG9tYWluLmNvbnN0U2V0VHlwZTsKCiAgICBBYnN0cmFjdFZhbHVlIGVsZW1lbnRUeXBlTWFzayA9CiAgICAgICAgaXNDb25zdCA/IGVsZW1lbnRUeXBlLnR5cGUgOiBkeW5hbWljVHlwZS50eXBlOwogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX2Fic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlU2V0VmFsdWUoCiAgICAgICAgdHlwZS50eXBlLCBub2RlLCBlbmNsb3NpbmcsIGVsZW1lbnRUeXBlTWFzayk7CiAgICBFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb24gZWxlbWVudCA9IG5ldyBFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIGN1cnJlbnRNZW1iZXIsIGVsZW1lbnRUeXBlKTsKICAgIGVsZW1lbnQuaW5mZXJyZWQgPSBpc0NvbnN0OwoKICAgIGFsbG9jYXRlZFR5cGVzLmFkZChlbGVtZW50KTsKICAgIHJldHVybiBhbGxvY2F0ZWRTZXRzW25vZGVdID0KICAgICAgICBuZXcgU2V0VHlwZUluZm9ybWF0aW9uKGN1cnJlbnRNZW1iZXIsIG1hc2ssIGVsZW1lbnQpOwogIH0KCiAgVHlwZUluZm9ybWF0aW9uIGFsbG9jYXRlTWFwKAogICAgICBDb25jcmV0ZVR5cGVJbmZvcm1hdGlvbiB0eXBlLCBpci5UcmVlTm9kZSBub2RlLCBNZW1iZXJFbnRpdHkgZWxlbWVudCwKICAgICAgW0xpc3Q8VHlwZUluZm9ybWF0aW9uPiBrZXlUeXBlcywgTGlzdDxUeXBlSW5mb3JtYXRpb24+IHZhbHVlVHlwZXNdKSB7CiAgICBhc3NlcnQoc3RyYXRlZ3kuY2hlY2tNYXBOb2RlKG5vZGUpKTsKICAgIGFzc2VydChrZXlUeXBlcy5sZW5ndGggPT0gdmFsdWVUeXBlcy5sZW5ndGgpOwogICAgYm9vbCBpc0ZpeGVkID0gKHR5cGUudHlwZSA9PSBfYWJzdHJhY3RWYWx1ZURvbWFpbi5jb25zdE1hcFR5cGUpOwoKICAgIFR5cGVJbmZvcm1hdGlvbiBrZXlUeXBlLCB2YWx1ZVR5cGU7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleVR5cGVzLmxlbmd0aDsgKytpKSB7CiAgICAgIFR5cGVJbmZvcm1hdGlvbiB0eXBlID0ga2V5VHlwZXNbaV07CiAgICAgIGtleVR5cGUgPSBrZXlUeXBlID09IG51bGwKICAgICAgICAgID8gYWxsb2NhdGVQaGkobnVsbCwgbnVsbCwgdHlwZSwgaXNUcnk6IGZhbHNlKQogICAgICAgICAgOiBhZGRQaGlJbnB1dChudWxsLCBrZXlUeXBlLCB0eXBlKTsKCiAgICAgIHR5cGUgPSB2YWx1ZVR5cGVzW2ldOwogICAgICB2YWx1ZVR5cGUgPSB2YWx1ZVR5cGUgPT0gbnVsbAogICAgICAgICAgPyBhbGxvY2F0ZVBoaShudWxsLCBudWxsLCB0eXBlLCBpc1RyeTogZmFsc2UpCiAgICAgICAgICA6IGFkZFBoaUlucHV0KG51bGwsIHZhbHVlVHlwZSwgdHlwZSk7CiAgICB9CgogICAga2V5VHlwZSA9CiAgICAgICAga2V5VHlwZSA9PSBudWxsID8gbm9uTnVsbEVtcHR5KCkgOiBzaW1wbGlmeVBoaShudWxsLCBudWxsLCBrZXlUeXBlKTsKICAgIHZhbHVlVHlwZSA9CiAgICAgICAgdmFsdWVUeXBlID09IG51bGwgPyBub25OdWxsRW1wdHkoKSA6IHNpbXBsaWZ5UGhpKG51bGwsIG51bGwsIHZhbHVlVHlwZSk7CgogICAgQWJzdHJhY3RWYWx1ZSBrZXlUeXBlTWFzaywgdmFsdWVUeXBlTWFzazsKICAgIGlmIChpc0ZpeGVkKSB7CiAgICAgIGtleVR5cGVNYXNrID0ga2V5VHlwZS50eXBlOwogICAgICB2YWx1ZVR5cGVNYXNrID0gdmFsdWVUeXBlLnR5cGU7CiAgICB9IGVsc2UgewogICAgICBrZXlUeXBlTWFzayA9IHZhbHVlVHlwZU1hc2sgPSBkeW5hbWljVHlwZS50eXBlOwogICAgfQogICAgQWJzdHJhY3RWYWx1ZSBtYXNrID0gX2Fic3RyYWN0VmFsdWVEb21haW4uY3JlYXRlTWFwVmFsdWUoCiAgICAgICAgdHlwZS50eXBlLCBub2RlLCBlbGVtZW50LCBrZXlUeXBlTWFzaywgdmFsdWVUeXBlTWFzayk7CgogICAgVHlwZUluZm9ybWF0aW9uIGtleVR5cGVJbmZvID0gbmV3IEtleUluTWFwVHlwZUluZm9ybWF0aW9uKAogICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLCBjdXJyZW50TWVtYmVyLCBrZXlUeXBlKTsKICAgIFR5cGVJbmZvcm1hdGlvbiB2YWx1ZVR5cGVJbmZvID0gbmV3IFZhbHVlSW5NYXBUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIGN1cnJlbnRNZW1iZXIsIHZhbHVlVHlwZSk7CiAgICBhbGxvY2F0ZWRUeXBlcy5hZGQoa2V5VHlwZUluZm8pOwogICAgYWxsb2NhdGVkVHlwZXMuYWRkKHZhbHVlVHlwZUluZm8pOwoKICAgIE1hcFR5cGVJbmZvcm1hdGlvbiBtYXAgPQogICAgICAgIG5ldyBNYXBUeXBlSW5mb3JtYXRpb24oY3VycmVudE1lbWJlciwgbWFzaywga2V5VHlwZUluZm8sIHZhbHVlVHlwZUluZm8pOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5VHlwZXMubGVuZ3RoOyArK2kpIHsKICAgICAgVHlwZUluZm9ybWF0aW9uIG5ld1R5cGUgPSBtYXAuYWRkRW50cnlBc3NpZ25tZW50KAogICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIGtleVR5cGVzW2ldLCB2YWx1ZVR5cGVzW2ldLCB0cnVlKTsKICAgICAgaWYgKG5ld1R5cGUgIT0gbnVsbCkgYWxsb2NhdGVkVHlwZXMuYWRkKG5ld1R5cGUpOwogICAgfQoKICAgIC8vIFNob3J0Y3V0OiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBmaXJzdCBhcHByb3hpbWF0aW9uIG9mIHRoZSBrZXkvdmFsdWUgdHlwZSwKICAgIC8vIHN0YXJ0IHByb3BhZ2F0aW5nIGl0IGVhcmx5LgogICAgaWYgKGlzRml4ZWQpIG1hcC5tYXJrQXNJbmZlcnJlZCgpOwoKICAgIGFsbG9jYXRlZE1hcHNbbm9kZV0gPSBtYXA7CiAgICByZXR1cm4gbWFwOwogIH0KCiAgQWJzdHJhY3RWYWx1ZSBuZXdUeXBlZFNlbGVjdG9yKFR5cGVJbmZvcm1hdGlvbiBpbmZvLCBBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgIC8vIE9ubHkgdHlwZSB0aGUgc2VsZWN0b3IgaWYgW2luZm9dIGlzIGNvbmNyZXRlLCBiZWNhdXNlIHRoZSBvdGhlcgogICAgLy8ga2luZHMgb2YgW1R5cGVJbmZvcm1hdGlvbl0gaGF2ZSB0aGUgZW1wdHkgdHlwZSBhdCB0aGlzIHBvaW50IG9mCiAgICAvLyBhbmFseXNpcy4KICAgIHJldHVybiBpbmZvLmlzQ29uY3JldGUgPyBpbmZvLnR5cGUgOiBtYXNrOwogIH0KCiAgLy8vIFJldHVybnMgYSBuZXcgdHlwZSB0aGF0IHVuaW9ucyBbZmlyc3RJbnB1dF0gYW5kIFtzZWNvbmRJbnB1dF0uCiAgVHlwZUluZm9ybWF0aW9uIGFsbG9jYXRlRGlhbW9uZFBoaSgKICAgICAgVHlwZUluZm9ybWF0aW9uIGZpcnN0SW5wdXQsIFR5cGVJbmZvcm1hdGlvbiBzZWNvbmRJbnB1dCkgewogICAgUGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbiByZXN1bHQgPSBuZXcgUGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbigKICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbiwgY3VycmVudE1lbWJlciwgbnVsbCwgbnVsbCwKICAgICAgICBpc1RyeTogZmFsc2UpOwogICAgcmVzdWx0LmFkZEFzc2lnbm1lbnQoZmlyc3RJbnB1dCk7CiAgICByZXN1bHQuYWRkQXNzaWdubWVudChzZWNvbmRJbnB1dCk7CiAgICBhbGxvY2F0ZWRUeXBlcy5hZGQocmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBQaGlFbGVtZW50VHlwZUluZm9ybWF0aW9uIF9hZGRQaGkoCiAgICAgIGlyLk5vZGUgbm9kZSwgTG9jYWwgdmFyaWFibGUsIFR5cGVJbmZvcm1hdGlvbiBpbnB1dFR5cGUsIGJvb2wgaXNUcnkpIHsKICAgIFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24gcmVzdWx0ID0gbmV3IFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24oCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIGN1cnJlbnRNZW1iZXIsIG5vZGUsIHZhcmlhYmxlLAogICAgICAgIGlzVHJ5OiBpc1RyeSk7CiAgICBhbGxvY2F0ZWRUeXBlcy5hZGQocmVzdWx0KTsKICAgIHJlc3VsdC5hZGRBc3NpZ25tZW50KGlucHV0VHlwZSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFJldHVybnMgYSBuZXcgdHlwZSBmb3IgaG9sZGluZyB0aGUgcG90ZW50aWFsIHR5cGVzIG9mIFtlbGVtZW50XS4KICAvLy8gW2lucHV0VHlwZV0gaXMgdGhlIGZpcnN0IGluY29taW5nIHR5cGUgb2YgdGhlIHBoaS4KICBQaGlFbGVtZW50VHlwZUluZm9ybWF0aW9uIGFsbG9jYXRlUGhpKAogICAgICBpci5Ob2RlIG5vZGUsIExvY2FsIHZhcmlhYmxlLCBUeXBlSW5mb3JtYXRpb24gaW5wdXRUeXBlLAogICAgICB7Ym9vbCBpc1RyeX0pIHsKICAgIGFzc2VydChzdHJhdGVneS5jaGVja1BoaU5vZGUobm9kZSkpOwogICAgLy8gQ2hlY2sgaWYgW2lucHV0VHlwZV0gaXMgYSBwaGkgZm9yIGEgbG9jYWwgdXBkYXRlZCBpbgogICAgLy8gdGhlIHRyeS9jYXRjaCBibG9jayBbbm9kZV0uIElmIGl0IGlzLCBubyBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3CiAgICAvLyBwaGkuCiAgICBpZiAoaW5wdXRUeXBlIGlzIFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24gJiYKICAgICAgICBpbnB1dFR5cGUuYnJhbmNoTm9kZSA9PSBub2RlICYmCiAgICAgICAgaW5wdXRUeXBlLmlzVHJ5KSB7CiAgICAgIHJldHVybiBpbnB1dFR5cGU7CiAgICB9CiAgICByZXR1cm4gX2FkZFBoaShub2RlLCB2YXJpYWJsZSwgaW5wdXRUeXBlLCBpc1RyeSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIG5ldyB0eXBlIGZvciBob2xkaW5nIHRoZSBwb3RlbnRpYWwgdHlwZXMgb2YgW2VsZW1lbnRdLgogIC8vLyBbaW5wdXRUeXBlXSBpcyB0aGUgZmlyc3QgaW5jb21pbmcgdHlwZSBvZiB0aGUgcGhpLiBbYWxsb2NhdGVMb29wUGhpXQogIC8vLyBvbmx5IGRpZmZlcnMgZnJvbSBbYWxsb2NhdGVQaGldIGluIHRoYXQgaXQgYWxsb3dzIHRoZSB1bmRlcmx5aW5nCiAgLy8vIGltcGxlbWVudGF0aW9uIG9mIFtUeXBlU3lzdGVtXSB0byBkaWZmZXJlbnRpYXRlIFBoaSBub2RlcyBkdWUgdG8gbG9vcHMKICAvLy8gZnJvbSBvdGhlciBtZXJnaW5nIHVzZXMuCiAgUGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbiBhbGxvY2F0ZUxvb3BQaGkoCiAgICAgIGlyLk5vZGUgbm9kZSwgTG9jYWwgdmFyaWFibGUsIFR5cGVJbmZvcm1hdGlvbiBpbnB1dFR5cGUsCiAgICAgIHtib29sIGlzVHJ5fSkgewogICAgYXNzZXJ0KHN0cmF0ZWd5LmNoZWNrTG9vcFBoaU5vZGUobm9kZSkpOwogICAgcmV0dXJuIF9hZGRQaGkobm9kZSwgdmFyaWFibGUsIGlucHV0VHlwZSwgaXNUcnkpOwogIH0KCiAgLy8vIFNpbXBsaWVzIHRoZSBwaGkgcmVwcmVzZW50aW5nIFtlbGVtZW50XSBhbmQgb2YgdGhlIHR5cGUKICAvLy8gW3BoaVR5cGVdLiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBwaGkgaGFzIG9uZSBpbmNvbWluZyBpbnB1dCwgYW4KICAvLy8gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgY291bGQganVzdCByZXR1cm4gdGhhdCBpbmNvbWluZwogIC8vLyBpbnB1dCB0eXBlLgogIFR5cGVJbmZvcm1hdGlvbiBzaW1wbGlmeVBoaSgKICAgICAgaXIuTm9kZSBub2RlLCBMb2NhbCB2YXJpYWJsZSwgUGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbiBwaGlUeXBlKSB7CiAgICBhc3NlcnQocGhpVHlwZS5icmFuY2hOb2RlID09IG5vZGUpOwogICAgaWYgKHBoaVR5cGUuYXNzaWdubWVudHMubGVuZ3RoID09IDEpIHJldHVybiBwaGlUeXBlLmFzc2lnbm1lbnRzLmZpcnN0OwogICAgcmV0dXJuIHBoaVR5cGU7CiAgfQoKICAvLy8gQWRkcyBbbmV3VHlwZV0gYXMgYW4gaW5wdXQgb2YgW3BoaVR5cGVdLgogIFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24gYWRkUGhpSW5wdXQoTG9jYWwgdmFyaWFibGUsCiAgICAgIFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24gcGhpVHlwZSwgVHlwZUluZm9ybWF0aW9uIG5ld1R5cGUpIHsKICAgIHBoaVR5cGUuYWRkQXNzaWdubWVudChuZXdUeXBlKTsKICAgIHJldHVybiBwaGlUeXBlOwogIH0KCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlVHlwZU1hc2soSXRlcmFibGU8VHlwZUluZm9ybWF0aW9uPiBhc3NpZ25tZW50cykgewogICAgcmV0dXJuIGpvaW5UeXBlTWFza3MoYXNzaWdubWVudHMubWFwKChlKSA9PiBlLnR5cGUpKTsKICB9CgogIEFic3RyYWN0VmFsdWUgam9pblR5cGVNYXNrcyhJdGVyYWJsZTxBYnN0cmFjdFZhbHVlPiBtYXNrcykgewogICAgdmFyIGR5bmFtaWNUeXBlID0gX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGU7CiAgICAvLyBPcHRpbWl6YXRpb246IHdlIGFyZSBpdGVyYXRpbmcgb3ZlciBtYXNrcyB0d2ljZSwgYnV0IGJlY2F1c2UgYG1hc2tzYCBpcyBhCiAgICAvLyBtYXBwZWQgaXRlcmFibGUsIHdlIHNhdmUgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzIHRvIGF2b2lkIGNvbXB1dGluZyB0aGVtCiAgICAvLyBhZ2Fpbi4KICAgIHZhciBsaXN0ID0gW107CiAgICBib29sIGlzRHluYW1pY0luZ29yaW5nTnVsbCA9IGZhbHNlOwogICAgYm9vbCBtYXlCZU51bGwgPSBmYWxzZTsKICAgIGZvciAoQWJzdHJhY3RWYWx1ZSBtYXNrIGluIG1hc2tzKSB7CiAgICAgIC8vIERvbid0IGRvIGFueSB3b3JrIG9uIGNvbXB1dGluZyB1bmlvbnMgaWYgd2Uga25vdyB0aGF0IGFmdGVyIGFsbCB0aGF0CiAgICAgIC8vIHdvcmsgdGhlIHJlc3VsdCB3aWxsIGJlIGBkeW5hbWljYC4KICAgICAgLy8gVE9ETyhzaWdtdW5kKTogY2hhbmdlIHRvIGBtYXNrID09IGR5bmFtaWNUeXBlYCBzbyB3ZSBjYW4gY29udGludWUgdG8KICAgICAgLy8gdHJhY2sgdGhlIG5vbi1udWxsYWJsZSBiaXQuCiAgICAgIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbi5jb250YWluc0FsbChtYXNrKS5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICAgIGlzRHluYW1pY0luZ29yaW5nTnVsbCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbChtYXNrKS5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICAgIG1heUJlTnVsbCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKGlzRHluYW1pY0luZ29yaW5nTnVsbCAmJiBtYXlCZU51bGwpIHJldHVybiBkeW5hbWljVHlwZTsKICAgICAgbGlzdC5hZGQobWFzayk7CiAgICB9CgogICAgQWJzdHJhY3RWYWx1ZSBuZXdUeXBlID0gbnVsbDsKICAgIGZvciAoQWJzdHJhY3RWYWx1ZSBtYXNrIGluIGxpc3QpIHsKICAgICAgbmV3VHlwZSA9CiAgICAgICAgICBuZXdUeXBlID09IG51bGwgPyBtYXNrIDogX2Fic3RyYWN0VmFsdWVEb21haW4udW5pb24obmV3VHlwZSwgbWFzayk7CiAgICAgIC8vIExpa2V3aXNlIC0gc3RvcCBlYXJseSBpZiB3ZSBhbHJlYWR5IHJlYWNoIGR5bmFtaWMuCiAgICAgIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbi5jb250YWluc0FsbChuZXdUeXBlKS5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICAgIGlzRHluYW1pY0luZ29yaW5nTnVsbCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbChuZXdUeXBlKS5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICAgIG1heUJlTnVsbCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKGlzRHluYW1pY0luZ29yaW5nTnVsbCAmJiBtYXlCZU51bGwpIHJldHVybiBkeW5hbWljVHlwZTsKICAgIH0KCiAgICByZXR1cm4gbmV3VHlwZSA/PyBfYWJzdHJhY3RWYWx1ZURvbWFpbi5lbXB0eVR5cGU7CiAgfQp9CoKhAE5OPAEoGSQhGCUgAVAbJDQ1RQE6Oy8XGQEySwE9IwE6JwFBJAFAIwFAIwFAKgIBRhMjJQFKRU4BMkkyASxKNgExPzMBLz0yAS86LwEqTQEqPDEBQTcjAUwdRAFKRTsgAS4qJx8eHhseGBcaATFLBAEyKAFQEC89ATkjTzcOGwQBISE1TgQBICAzTAQBIyM5HT0EASMjOR09BAEoKEMiQgQBIyM5HT0EASAgM0wEASEhNU4EASUlPR8/BAEhITVOBAEmJj8gQAQBJiY/IEAEASkpRSNDBAEgIUkBJTw9ASAgM0wEASUlPR8/BAEjIzkdPQQBISE1TgQBJCQ7Hj4EASgyKEMiQgQBLS1NJ0cEASwsSyZGBAEkATQtRwQBMCtFBAE8FB4/LjM6OkEaBh9GBAFIFkceBAExJ0oBQEMMSCEdKCUjTCsvRi0sSiUxSA8USghEJSg9Ew0pKxMGFj8GTx5KIRQEAUlBMTM2NR4IBAEdSyoEAUcfQlAEARpMJwQBSCxMMxwEAT9DGjAwCAQBQUUSPERKCCAQBAE0LE8EATUsUAQBMixNBAEjHQQBJh0EASBGMypNMkYdOx9GSBMWNgEyJEFERjAvPyoBITtFBAFLTkw8OTcjEwQBH0YnKUMBJDc+Nks7IAEhIT4EAR9MTCkyRQEoMCogOC4BHCQ4MAYBDk0QUQEuEyImDTYGPj8BPzdDOSUnAR1RATA4QzgGAVEjJwEfEAQBTUdHES8EAUUmQUY5FyYnIBMEASVNRj0XICUTBAFHOSk/Fik8RwwyKBsYBjYEAUdLR00fLT8WLTYEAT5FRBIfSShLFAQBLzhEJBQEAUk6BAE/OFFRDhMoHChOLE4lRiYIQRoIQhYGASInEE48SSYIRBoIQgYBNgQCAS5wYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlX3N5c3RlbS5kYXJ0MXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NzYS9zc2FfdHJhY2VyLmRhcnTAAFUxLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgc3NhLnRyYWNlcjsKCmltcG9ydCAnLi4vLi4vY29tcGlsZXJfbmV3LmRhcnQnIHNob3cgT3V0cHV0U2luazsKaW1wb3J0ICcuLi9kaWFnbm9zdGljcy9pbnZhcmlhbnQuZGFydCcgc2hvdyBERUJVR19NT0RFOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hbWVyLmRhcnQnIHNob3cgc3VmZml4Rm9yR2V0SW50ZXJjZXB0b3I7CmltcG9ydCAnLi4vdHJhY2VyLmRhcnQnOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwppbXBvcnQgJ25vZGVzLmRhcnQnOwoKLy8vIE91dHB1dHMgU1NBIGNvZGUgaW4gYSBmb3JtYXQgcmVhZGFibGUgYnkgSHlkcmEgSVIuCi8vLyBUcmFjaW5nIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIHNlZSAuLi90cmFjZXIuZGFydCBmb3IgaG93Ci8vLyB0byBlbmFibGUgaXQuCmNsYXNzIEhUcmFjZXIgZXh0ZW5kcyBIR3JhcGhWaXNpdG9yIHdpdGggVHJhY2VyVXRpbCB7CiAgZmluYWwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkOwogIEBvdmVycmlkZQogIGZpbmFsIE91dHB1dFNpbmsgb3V0cHV0OwoKICBIVHJhY2VyKHRoaXMub3V0cHV0LCB0aGlzLmNsb3NlZFdvcmxkKTsKCiAgdm9pZCB0cmFjZUdyYXBoKFN0cmluZyBuYW1lLCBIR3JhcGggZ3JhcGgpIHsKICAgIERFQlVHX01PREUgPSB0cnVlOwogICAgdGFnKCJjZmciLCAoKSB7CiAgICAgIHByaW50UHJvcGVydHkoIm5hbWUiLCBuYW1lKTsKICAgICAgdmlzaXREb21pbmF0b3JUcmVlKGdyYXBoKTsKICAgIH0pOwogIH0KCiAgdm9pZCBhZGRQcmVkZWNlc3NvcnMoSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGlmIChibG9jay5wcmVkZWNlc3NvcnMuaXNFbXB0eSkgewogICAgICBwcmludEVtcHR5UHJvcGVydHkoInByZWRlY2Vzc29ycyIpOwogICAgfSBlbHNlIHsKICAgICAgYWRkSW5kZW50KCk7CiAgICAgIGFkZCgicHJlZGVjZXNzb3JzIik7CiAgICAgIGZvciAoSEJhc2ljQmxvY2sgcHJlZGVjZXNzb3IgaW4gYmxvY2sucHJlZGVjZXNzb3JzKSB7CiAgICAgICAgYWRkKCcgIkIke3ByZWRlY2Vzc29yLmlkfSInKTsKICAgICAgfQogICAgICBhZGQoIlxuIik7CiAgICB9CiAgfQoKICB2b2lkIGFkZFN1Y2Nlc3NvcnMoSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGlmIChibG9jay5zdWNjZXNzb3JzLmlzRW1wdHkpIHsKICAgICAgcHJpbnRFbXB0eVByb3BlcnR5KCJzdWNjZXNzb3JzIik7CiAgICB9IGVsc2UgewogICAgICBhZGRJbmRlbnQoKTsKICAgICAgYWRkKCJzdWNjZXNzb3JzIik7CiAgICAgIGZvciAoSEJhc2ljQmxvY2sgc3VjY2Vzc29yIGluIGJsb2NrLnN1Y2Nlc3NvcnMpIHsKICAgICAgICBhZGQoJyAiQiR7c3VjY2Vzc29yLmlkfSInKTsKICAgICAgfQogICAgICBhZGQoIlxuIik7CiAgICB9CiAgfQoKICB2b2lkIGFkZEluc3RydWN0aW9ucygKICAgICAgSEluc3RydWN0aW9uU3RyaW5naWZpZXIgc3RyaW5naWZpZXIsIEhJbnN0cnVjdGlvbkxpc3QgbGlzdCkgewogICAgZm9yIChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBsaXN0LmZpcnN0OwogICAgICAgIGluc3RydWN0aW9uICE9IG51bGw7CiAgICAgICAgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi5uZXh0KSB7CiAgICAgIGludCBiY2kgPSAwOwogICAgICBpbnQgdXNlcyA9IGluc3RydWN0aW9uLnVzZWRCeS5sZW5ndGg7CiAgICAgIFN0cmluZyBjaGFuZ2VzID0gaW5zdHJ1Y3Rpb24uc2lkZUVmZmVjdHMuaGFzU2lkZUVmZmVjdHMoKSA/ICchJyA6ICcgJzsKICAgICAgU3RyaW5nIGRlcGVuZHMgPSBpbnN0cnVjdGlvbi5zaWRlRWZmZWN0cy5kZXBlbmRzT25Tb21ldGhpbmcoKSA/ICc/JyA6ICcnOwogICAgICBhZGRJbmRlbnQoKTsKICAgICAgU3RyaW5nIHRlbXBvcmFyeUlkID0gc3RyaW5naWZpZXIudGVtcG9yYXJ5SWQoaW5zdHJ1Y3Rpb24pOwogICAgICBTdHJpbmcgaW5zdHJ1Y3Rpb25TdHJpbmcgPSBzdHJpbmdpZmllci52aXNpdChpbnN0cnVjdGlvbik7CiAgICAgIGFkZCgiJGJjaSAkdXNlcyAkdGVtcG9yYXJ5SWQgJGluc3RydWN0aW9uU3RyaW5nICRjaGFuZ2VzICRkZXBlbmRzIDx8QFxuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgSEluc3RydWN0aW9uU3RyaW5naWZpZXIgc3RyaW5naWZpZXIgPQogICAgICAgIG5ldyBISW5zdHJ1Y3Rpb25TdHJpbmdpZmllcihibG9jaywgY2xvc2VkV29ybGQpOwogICAgYXNzZXJ0KGJsb2NrLmlkICE9IG51bGwpOwogICAgdGFnKCJibG9jayIsICgpIHsKICAgICAgcHJpbnRQcm9wZXJ0eSgibmFtZSIsICJCJHtibG9jay5pZH0iKTsKICAgICAgcHJpbnRQcm9wZXJ0eSgiZnJvbV9iY2kiLCAtMSk7CiAgICAgIHByaW50UHJvcGVydHkoInRvX2JjaSIsIC0xKTsKICAgICAgYWRkUHJlZGVjZXNzb3JzKGJsb2NrKTsKICAgICAgYWRkU3VjY2Vzc29ycyhibG9jayk7CiAgICAgIHByaW50RW1wdHlQcm9wZXJ0eSgieGhhbmRsZXJzIik7CiAgICAgIHByaW50RW1wdHlQcm9wZXJ0eSgiZmxhZ3MiKTsKICAgICAgaWYgKGJsb2NrLmRvbWluYXRvciAhPSBudWxsKSB7CiAgICAgICAgcHJpbnRQcm9wZXJ0eSgiZG9taW5hdG9yIiwgIkIke2Jsb2NrLmRvbWluYXRvci5pZH0iKTsKICAgICAgfQogICAgICB0YWcoInN0YXRlcyIsICgpIHsKICAgICAgICB0YWcoImxvY2FscyIsICgpIHsKICAgICAgICAgIHByaW50UHJvcGVydHkoInNpemUiLCAwKTsKICAgICAgICAgIHByaW50UHJvcGVydHkoIm1ldGhvZCIsICJOb25lIik7CiAgICAgICAgICBibG9jay5mb3JFYWNoUGhpKChwaGkpIHsKICAgICAgICAgICAgU3RyaW5nIHBoaUlkID0gc3RyaW5naWZpZXIudGVtcG9yYXJ5SWQocGhpKTsKICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGlucHV0SWRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoaS5pbnB1dHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBpbnB1dElkcy53cml0ZShzdHJpbmdpZmllci50ZW1wb3JhcnlJZChwaGkuaW5wdXRzW2ldKSk7CiAgICAgICAgICAgICAgaW5wdXRJZHMud3JpdGUoIiAiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludGxuKCIke3BoaS5pZH0gJHBoaUlkIFsgJGlucHV0SWRzXSIpOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICB0YWcoIkhJUiIsICgpIHsKICAgICAgICBhZGRJbnN0cnVjdGlvbnMoc3RyaW5naWZpZXIsIGJsb2NrLnBoaXMpOwogICAgICAgIGFkZEluc3RydWN0aW9ucyhzdHJpbmdpZmllciwgYmxvY2spOwogICAgICB9KTsKICAgIH0pOwogIH0KfQoKY2xhc3MgSEluc3RydWN0aW9uU3RyaW5naWZpZXIgaW1wbGVtZW50cyBIVmlzaXRvcjxTdHJpbmc+IHsKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CiAgZmluYWwgSEJhc2ljQmxvY2sgY3VycmVudEJsb2NrOwoKICBISW5zdHJ1Y3Rpb25TdHJpbmdpZmllcih0aGlzLmN1cnJlbnRCbG9jaywgdGhpcy5jbG9zZWRXb3JsZCk7CgogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IF9hYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIHZpc2l0KEhJbnN0cnVjdGlvbiBub2RlKSA9PiAnJHtub2RlLmFjY2VwdCh0aGlzKX0gJHtub2RlLmluc3RydWN0aW9uVHlwZX0nOwoKICBTdHJpbmcgdGVtcG9yYXJ5SWQoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBTdHJpbmcgcHJlZml4OwogICAgaWYgKGluc3RydWN0aW9uLmlzTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBwcmVmaXggPSAndSc7CiAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uCiAgICAgICAgLmlzQ29uZmxpY3RpbmcoX2Fic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcHJlZml4ID0gJ2MnOwogICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbgogICAgICAgIC5pc0V4dGVuZGFibGVBcnJheShfYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBwcmVmaXggPSAnZSc7CiAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uCiAgICAgICAgLmlzRml4ZWRBcnJheShfYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBwcmVmaXggPSAnZic7CiAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uCiAgICAgICAgLmlzTXV0YWJsZUFycmF5KF9hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHByZWZpeCA9ICdtJzsKICAgIH0gZWxzZSBpZiAoaW5zdHJ1Y3Rpb24uaXNBcnJheShfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBwcmVmaXggPSAnYSc7CiAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uLmlzU3RyaW5nKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHByZWZpeCA9ICdzJzsKICAgIH0gZWxzZSBpZiAoaW5zdHJ1Y3Rpb24KICAgICAgICAuaXNJbmRleGFibGVQcmltaXRpdmUoX2Fic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcHJlZml4ID0gJ3InOwogICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbi5pc0Jvb2xlYW4oX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcHJlZml4ID0gJ2InOwogICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbi5pc0ludGVnZXIoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcHJlZml4ID0gJ2knOwogICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbi5pc0RvdWJsZShfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBwcmVmaXggPSAnZCc7CiAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uLmlzTnVtYmVyKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHByZWZpeCA9ICduJzsKICAgIH0gZWxzZSBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4KICAgICAgICAuY29udGFpbnNBbGwoaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25UeXBlKQogICAgICAgIC5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICBwcmVmaXggPSAndic7CiAgICB9IGVsc2UgewogICAgICBwcmVmaXggPSAnVSc7CiAgICB9CiAgICByZXR1cm4gIiRwcmVmaXgke2luc3RydWN0aW9uLmlkfSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRMYXRlVmFsdWUoSExhdGVWYWx1ZSBub2RlKSB7CiAgICByZXR1cm4gIkxhdGVWYWx1ZTogJHt0ZW1wb3JhcnlJZChub2RlLmlucHV0c1swXSl9IjsKICB9CgogIFN0cmluZyBoYW5kbGVJbnZva2VCaW5hcnkoSEludm9rZUJpbmFyeSBub2RlLCBTdHJpbmcgb3Bjb2RlKSB7CiAgICBTdHJpbmcgbGVmdCA9IHRlbXBvcmFyeUlkKG5vZGUubGVmdCk7CiAgICBTdHJpbmcgcmlnaHQgPSB0ZW1wb3JhcnlJZChub2RlLnJpZ2h0KTsKICAgIHJldHVybiAnJG9wY29kZTogJGxlZnQgJHJpZ2h0JzsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEFicyhIQWJzIG5vZGUpIHsKICAgIFN0cmluZyBvcGVyYW5kID0gdGVtcG9yYXJ5SWQobm9kZS5vcGVyYW5kKTsKICAgIHJldHVybiAiQWJzOiAkb3BlcmFuZCI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRBZGQoSEFkZCBub2RlKSA9PiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ0FkZCcpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRCaXRBbmQoSEJpdEFuZCBub2RlKSA9PiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ0JpdEFuZCcpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRCaXROb3QoSEJpdE5vdCBub2RlKSB7CiAgICBTdHJpbmcgb3BlcmFuZCA9IHRlbXBvcmFyeUlkKG5vZGUub3BlcmFuZCk7CiAgICByZXR1cm4gIkJpdE5vdDogJG9wZXJhbmQiOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0Qml0T3IoSEJpdE9yIG5vZGUpID0+IGhhbmRsZUludm9rZUJpbmFyeShub2RlLCAnQml0T3InKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0Qml0WG9yKEhCaXRYb3Igbm9kZSkgPT4gaGFuZGxlSW52b2tlQmluYXJ5KG5vZGUsICdCaXRYb3InKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0Qm91bmRzQ2hlY2soSEJvdW5kc0NoZWNrIG5vZGUpIHsKICAgIFN0cmluZyBsZW5ndGhJZCA9IHRlbXBvcmFyeUlkKG5vZGUubGVuZ3RoKTsKICAgIFN0cmluZyBpbmRleElkID0gdGVtcG9yYXJ5SWQobm9kZS5pbmRleCk7CiAgICByZXR1cm4gIkJvdW5kc0NoZWNrOiBsZW5ndGggPSAkbGVuZ3RoSWQsIGluZGV4ID0gJGluZGV4SWQiOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0QnJlYWsoSEJyZWFrIG5vZGUpIHsKICAgIEhCYXNpY0Jsb2NrIHRhcmdldCA9IGN1cnJlbnRCbG9jay5zdWNjZXNzb3JzWzBdOwogICAgaWYgKG5vZGUubGFiZWwgIT0gbnVsbCkgewogICAgICByZXR1cm4gIkJyZWFrICR7bm9kZS5sYWJlbC5sYWJlbE5hbWV9OiAoQiR7dGFyZ2V0LmlkfSkiOwogICAgfQogICAgcmV0dXJuICJCcmVhazogKEIke3RhcmdldC5pZH0pIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdENvbnN0YW50KEhDb25zdGFudCBjb25zdGFudCkgPT4gIkNvbnN0YW50OiAke2NvbnN0YW50LmNvbnN0YW50fSI7CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdENvbnRpbnVlKEhDb250aW51ZSBub2RlKSB7CiAgICBIQmFzaWNCbG9jayB0YXJnZXQgPSBjdXJyZW50QmxvY2suc3VjY2Vzc29yc1swXTsKICAgIGlmIChub2RlLmxhYmVsICE9IG51bGwpIHsKICAgICAgcmV0dXJuICJDb250aW51ZSAke25vZGUubGFiZWwubGFiZWxOYW1lfTogKEIke3RhcmdldC5pZH0pIjsKICAgIH0KICAgIHJldHVybiAiQ29udGludWU6IChCJHt0YXJnZXQuaWR9KSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRDcmVhdGUoSENyZWF0ZSBub2RlKSB7CiAgICByZXR1cm4gaGFuZGxlR2VuZXJpY0ludm9rZSgiQ3JlYXRlIiwgIiR7bm9kZS5lbGVtZW50Lm5hbWV9Iiwgbm9kZS5pbnB1dHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0Q3JlYXRlQm94KEhDcmVhdGVCb3ggbm9kZSkgewogICAgcmV0dXJuIGhhbmRsZUdlbmVyaWNJbnZva2UoIkNyZWF0ZUJveCIsICIiLCBub2RlLmlucHV0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXREaXZpZGUoSERpdmlkZSBub2RlKSA9PiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ0RpdmlkZScpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRFeGl0KEhFeGl0IG5vZGUpID0+ICJFeGl0IjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0RmllbGRHZXQoSEZpZWxkR2V0IG5vZGUpIHsKICAgIGlmIChub2RlLmlzTnVsbENoZWNrKSB7CiAgICAgIHJldHVybiAnRmllbGRHZXQ6IE51bGxDaGVjayAke3RlbXBvcmFyeUlkKG5vZGUucmVjZWl2ZXIpfSc7CiAgICB9CiAgICBTdHJpbmcgZmllbGROYW1lID0gbm9kZS5lbGVtZW50Lm5hbWU7CiAgICByZXR1cm4gJ0ZpZWxkR2V0OiAke3RlbXBvcmFyeUlkKG5vZGUucmVjZWl2ZXIpfS4kZmllbGROYW1lJzsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEZpZWxkU2V0KEhGaWVsZFNldCBub2RlKSB7CiAgICBTdHJpbmcgdmFsdWVJZCA9IHRlbXBvcmFyeUlkKG5vZGUudmFsdWUpOwogICAgU3RyaW5nIGZpZWxkTmFtZSA9IG5vZGUuZWxlbWVudC5uYW1lOwogICAgcmV0dXJuICdGaWVsZFNldDogJHt0ZW1wb3JhcnlJZChub2RlLnJlY2VpdmVyKX0uJGZpZWxkTmFtZSB0byAkdmFsdWVJZCc7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRSZWFkTW9kaWZ5V3JpdGUoSFJlYWRNb2RpZnlXcml0ZSBub2RlKSB7CiAgICBTdHJpbmcgZmllbGROYW1lID0gbm9kZS5lbGVtZW50Lm5hbWU7CiAgICBTdHJpbmcgcmVjZWl2ZXJJZCA9IHRlbXBvcmFyeUlkKG5vZGUucmVjZWl2ZXIpOwogICAgU3RyaW5nIG9wID0gbm9kZS5qc09wOwogICAgaWYgKG5vZGUuaXNBc3NpZ25PcCkgewogICAgICBTdHJpbmcgdmFsdWVJZCA9IHRlbXBvcmFyeUlkKG5vZGUudmFsdWUpOwogICAgICByZXR1cm4gJ1JlYWRNb2RpZnlXcml0ZTogJHJlY2VpdmVySWQuJGZpZWxkTmFtZSAkb3A9ICR2YWx1ZUlkJzsKICAgIH0gZWxzZSBpZiAobm9kZS5pc1ByZU9wKSB7CiAgICAgIHJldHVybiAnUmVhZE1vZGlmeVdyaXRlOiAkb3AkcmVjZWl2ZXJJZC4kZmllbGROYW1lJzsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAnUmVhZE1vZGlmeVdyaXRlOiAkcmVjZWl2ZXJJZC4kZmllbGROYW1lJG9wJzsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEdldExlbmd0aChIR2V0TGVuZ3RoIG5vZGUpIHsKICAgIHJldHVybiAnR2V0TGVuZ3RoOiAke3RlbXBvcmFyeUlkKG5vZGUucmVjZWl2ZXIpfSc7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRMb2NhbEdldChITG9jYWxHZXQgbm9kZSkgewogICAgU3RyaW5nIGxvY2FsTmFtZSA9IG5vZGUudmFyaWFibGUubmFtZTsKICAgIHJldHVybiAnTG9jYWxHZXQ6ICR7dGVtcG9yYXJ5SWQobm9kZS5sb2NhbCl9LiRsb2NhbE5hbWUnOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0TG9jYWxTZXQoSExvY2FsU2V0IG5vZGUpIHsKICAgIFN0cmluZyB2YWx1ZUlkID0gdGVtcG9yYXJ5SWQobm9kZS52YWx1ZSk7CiAgICBTdHJpbmcgbG9jYWxOYW1lID0gbm9kZS52YXJpYWJsZS5uYW1lOwogICAgcmV0dXJuICdMb2NhbFNldDogJHt0ZW1wb3JhcnlJZChub2RlLmxvY2FsKX0uJGxvY2FsTmFtZSB0byAkdmFsdWVJZCc7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRHb3RvKEhHb3RvIG5vZGUpIHsKICAgIEhCYXNpY0Jsb2NrIHRhcmdldCA9IGN1cnJlbnRCbG9jay5zdWNjZXNzb3JzWzBdOwogICAgcmV0dXJuICJHb3RvOiAoQiR7dGFyZ2V0LmlkfSkiOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0R3JlYXRlcihIR3JlYXRlciBub2RlKSA9PiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ0dyZWF0ZXInKTsKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRHcmVhdGVyRXF1YWwoSEdyZWF0ZXJFcXVhbCBub2RlKSB7CiAgICByZXR1cm4gaGFuZGxlSW52b2tlQmluYXJ5KG5vZGUsICdHcmVhdGVyRXF1YWwnKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdElkZW50aXR5KEhJZGVudGl0eSBub2RlKSA9PiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ0lkZW50aXR5Jyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdElmKEhJZiBub2RlKSB7CiAgICBIQmFzaWNCbG9jayB0aGVuQmxvY2sgPSBjdXJyZW50QmxvY2suc3VjY2Vzc29yc1swXTsKICAgIEhCYXNpY0Jsb2NrIGVsc2VCbG9jayA9IGN1cnJlbnRCbG9jay5zdWNjZXNzb3JzWzFdOwogICAgU3RyaW5nIGNvbmRpdGlvbklkID0gdGVtcG9yYXJ5SWQobm9kZS5pbnB1dHNbMF0pOwogICAgcmV0dXJuICJJZiAoJGNvbmRpdGlvbklkKTogKEIke3RoZW5CbG9jay5pZH0pIGVsc2UgKEIke2Vsc2VCbG9jay5pZH0pIjsKICB9CgogIFN0cmluZyBoYW5kbGVHZW5lcmljSW52b2tlKAogICAgICBTdHJpbmcgaW52b2tlVHlwZSwgU3RyaW5nIGZ1bmN0aW9uTmFtZSwgTGlzdDxISW5zdHJ1Y3Rpb24+IGFyZ3VtZW50cykgewogICAgU3RyaW5nQnVmZmVyIGFyZ3VtZW50c1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChpICE9IDApIGFyZ3VtZW50c1N0cmluZy53cml0ZSgiLCAiKTsKICAgICAgYXJndW1lbnRzU3RyaW5nLndyaXRlKHRlbXBvcmFyeUlkKGFyZ3VtZW50c1tpXSkpOwogICAgfQogICAgcmV0dXJuICIkaW52b2tlVHlwZTogJGZ1bmN0aW9uTmFtZSgkYXJndW1lbnRzU3RyaW5nKSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRJbmRleChISW5kZXggbm9kZSkgewogICAgU3RyaW5nIHJlY2VpdmVyID0gdGVtcG9yYXJ5SWQobm9kZS5yZWNlaXZlcik7CiAgICBTdHJpbmcgaW5kZXggPSB0ZW1wb3JhcnlJZChub2RlLmluZGV4KTsKICAgIHJldHVybiAiSW5kZXg6ICRyZWNlaXZlclskaW5kZXhdIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEluZGV4QXNzaWduKEhJbmRleEFzc2lnbiBub2RlKSB7CiAgICBTdHJpbmcgcmVjZWl2ZXIgPSB0ZW1wb3JhcnlJZChub2RlLnJlY2VpdmVyKTsKICAgIFN0cmluZyBpbmRleCA9IHRlbXBvcmFyeUlkKG5vZGUuaW5kZXgpOwogICAgU3RyaW5nIHZhbHVlID0gdGVtcG9yYXJ5SWQobm9kZS52YWx1ZSk7CiAgICByZXR1cm4gIkluZGV4QXNzaWduOiAkcmVjZWl2ZXJbJGluZGV4XSA9ICR2YWx1ZSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRJbnRlcmNlcHRvcihISW50ZXJjZXB0b3Igbm9kZSkgewogICAgU3RyaW5nIHZhbHVlID0gdGVtcG9yYXJ5SWQobm9kZS5pbnB1dHNbMF0pOwogICAgaWYgKG5vZGUuaW50ZXJjZXB0ZWRDbGFzc2VzICE9IG51bGwpIHsKICAgICAgU3RyaW5nIGNscyA9IHN1ZmZpeEZvckdldEludGVyY2VwdG9yKGNsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLAogICAgICAgICAgY2xvc2VkV29ybGQubmF0aXZlRGF0YSwgbm9kZS5pbnRlcmNlcHRlZENsYXNzZXMpOwogICAgICByZXR1cm4gIkludGVyY2VwdG9yICgke2Nsc30pOiAkdmFsdWUiOwogICAgfQogICAgcmV0dXJuICJJbnRlcmNlcHRvcjogJHZhbHVlIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEludm9rZUNsb3N1cmUoSEludm9rZUNsb3N1cmUgbm9kZSkgPT4KICAgICAgaGFuZGxlSW52b2tlRHluYW1pYyhub2RlLCAiSW52b2tlQ2xvc3VyZSIpOwoKICBTdHJpbmcgaGFuZGxlSW52b2tlRHluYW1pYyhISW52b2tlRHluYW1pYyBpbnZva2UsIFN0cmluZyBraW5kKSB7CiAgICBTdHJpbmcgcmVjZWl2ZXIgPSB0ZW1wb3JhcnlJZChpbnZva2UucmVjZWl2ZXIpOwogICAgU3RyaW5nIG5hbWUgPSBpbnZva2Uuc2VsZWN0b3IubmFtZTsKICAgIFN0cmluZyB0YXJnZXQgPSAiJHJlY2VpdmVyLiRuYW1lIjsKICAgIGludCBvZmZzZXQgPSBISW52b2tlLkFSR1VNRU5UU19PRkZTRVQ7CiAgICBMaXN0IGFyZ3VtZW50cyA9IGludm9rZS5pbnB1dHMuc3VibGlzdChvZmZzZXQpOwogICAgcmV0dXJuIGhhbmRsZUdlbmVyaWNJbnZva2Uoa2luZCwgdGFyZ2V0LCBhcmd1bWVudHMpICsKICAgICAgICAiKCR7aW52b2tlLnJlY2VpdmVyVHlwZX0pIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEludm9rZUR5bmFtaWNNZXRob2QoSEludm9rZUR5bmFtaWNNZXRob2Qgbm9kZSkgPT4KICAgICAgaGFuZGxlSW52b2tlRHluYW1pYyhub2RlLCAiSW52b2tlRHluYW1pY01ldGhvZCIpOwogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEludm9rZUR5bmFtaWNHZXR0ZXIoSEludm9rZUR5bmFtaWNHZXR0ZXIgbm9kZSkgPT4KICAgICAgaGFuZGxlSW52b2tlRHluYW1pYyhub2RlLCAiSW52b2tlRHluYW1pY0dldHRlciIpOwogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEludm9rZUR5bmFtaWNTZXR0ZXIoSEludm9rZUR5bmFtaWNTZXR0ZXIgbm9kZSkgPT4KICAgICAgaGFuZGxlSW52b2tlRHluYW1pYyhub2RlLCAiSW52b2tlRHluYW1pY1NldHRlciIpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRJbnZva2VTdGF0aWMoSEludm9rZVN0YXRpYyBpbnZva2UpIHsKICAgIFN0cmluZyB0YXJnZXQgPSBpbnZva2UuZWxlbWVudC5uYW1lOwogICAgcmV0dXJuIGhhbmRsZUdlbmVyaWNJbnZva2UoIkludm9rZVN0YXRpYyIsIHRhcmdldCwgaW52b2tlLmlucHV0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRJbnZva2VTdXBlcihISW52b2tlU3VwZXIgaW52b2tlKSB7CiAgICBTdHJpbmcgdGFyZ2V0ID0gaW52b2tlLmVsZW1lbnQubmFtZTsKICAgIHJldHVybiBoYW5kbGVHZW5lcmljSW52b2tlKCJJbnZva2VTdXBlciIsIHRhcmdldCwgaW52b2tlLmlucHV0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRJbnZva2VDb25zdHJ1Y3RvckJvZHkoSEludm9rZUNvbnN0cnVjdG9yQm9keSBpbnZva2UpIHsKICAgIFN0cmluZyB0YXJnZXQgPSBpbnZva2UuZWxlbWVudC5uYW1lOwogICAgcmV0dXJuIGhhbmRsZUdlbmVyaWNJbnZva2UoIkludm9rZUNvbnN0cnVjdG9yQm9keSIsIHRhcmdldCwgaW52b2tlLmlucHV0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRJbnZva2VHZW5lcmF0b3JCb2R5KEhJbnZva2VHZW5lcmF0b3JCb2R5IGludm9rZSkgewogICAgU3RyaW5nIHRhcmdldCA9IGludm9rZS5lbGVtZW50Lm5hbWU7CiAgICByZXR1cm4gaGFuZGxlR2VuZXJpY0ludm9rZSgiSW52b2tlR2VuZXJhdG9yQm9keSIsIHRhcmdldCwgaW52b2tlLmlucHV0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRGb3JlaWduQ29kZShIRm9yZWlnbkNvZGUgbm9kZSkgewogICAgdmFyIHRlbXBsYXRlID0gbm9kZS5jb2RlVGVtcGxhdGU7CiAgICBTdHJpbmcgY29kZSA9ICcke3RlbXBsYXRlLmFzdH0nOwogICAgdmFyIGlucHV0cyA9IG5vZGUuaW5wdXRzLm1hcCh0ZW1wb3JhcnlJZCkuam9pbignLCAnKTsKICAgIHJldHVybiAiRm9yZWlnbkNvZGU6ICRjb2RlICgkaW5wdXRzKSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRMZXNzKEhMZXNzIG5vZGUpID0+IGhhbmRsZUludm9rZUJpbmFyeShub2RlLCAnTGVzcycpOwogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdExlc3NFcXVhbChITGVzc0VxdWFsIG5vZGUpID0+CiAgICAgIGhhbmRsZUludm9rZUJpbmFyeShub2RlLCAnTGVzc0VxdWFsJyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdExpdGVyYWxMaXN0KEhMaXRlcmFsTGlzdCBub2RlKSB7CiAgICBTdHJpbmdCdWZmZXIgZWxlbWVudHNTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuaW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChpICE9IDApIGVsZW1lbnRzU3RyaW5nLndyaXRlKCIsICIpOwogICAgICBlbGVtZW50c1N0cmluZy53cml0ZSh0ZW1wb3JhcnlJZChub2RlLmlucHV0c1tpXSkpOwogICAgfQogICAgcmV0dXJuICJMaXRlcmFsTGlzdDogWyRlbGVtZW50c1N0cmluZ10iOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0TG9vcEJyYW5jaChITG9vcEJyYW5jaCBicmFuY2gpIHsKICAgIEhCYXNpY0Jsb2NrIGJvZHlCbG9jayA9IGN1cnJlbnRCbG9jay5zdWNjZXNzb3JzWzBdOwogICAgSEJhc2ljQmxvY2sgZXhpdEJsb2NrID0gY3VycmVudEJsb2NrLnN1Y2Nlc3NvcnNbMV07CiAgICBTdHJpbmcgY29uZGl0aW9uSWQgPSB0ZW1wb3JhcnlJZChicmFuY2guaW5wdXRzWzBdKTsKICAgIHJldHVybiAiTG9vcEJyYW5jaCAoJGNvbmRpdGlvbklkKTogKEIke2JvZHlCbG9jay5pZH0pIHRoZW4gKEIke2V4aXRCbG9jay5pZH0pIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdE11bHRpcGx5KEhNdWx0aXBseSBub2RlKSA9PiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ011bHRpcGx5Jyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdE5lZ2F0ZShITmVnYXRlIG5vZGUpIHsKICAgIFN0cmluZyBvcGVyYW5kID0gdGVtcG9yYXJ5SWQobm9kZS5vcGVyYW5kKTsKICAgIHJldHVybiAiTmVnYXRlOiAkb3BlcmFuZCI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXROb3QoSE5vdCBub2RlKSA9PiAiTm90OiAke3RlbXBvcmFyeUlkKG5vZGUuaW5wdXRzWzBdKX0iOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRQYXJhbWV0ZXJWYWx1ZShIUGFyYW1ldGVyVmFsdWUgbm9kZSkgewogICAgcmV0dXJuICJQYXJhbWV0ZXJWYWx1ZTogJHtub2RlLnNvdXJjZUVsZW1lbnQubmFtZX0iOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0TG9jYWxWYWx1ZShITG9jYWxWYWx1ZSBub2RlKSB7CiAgICByZXR1cm4gIkxvY2FsVmFsdWU6ICR7bm9kZS5zb3VyY2VFbGVtZW50Lm5hbWV9IjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFBoaShIUGhpIHBoaSkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGJ1ZmZlci53cml0ZSgiUGhpOiAiKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhpLmlucHV0cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaSA+IDApIGJ1ZmZlci53cml0ZSgiLCAiKTsKICAgICAgYnVmZmVyLndyaXRlKHRlbXBvcmFyeUlkKHBoaS5pbnB1dHNbaV0pKTsKICAgIH0KICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFJlZihIUmVmIG5vZGUpIHsKICAgIHJldHVybiAnUmVmOiAke3RlbXBvcmFyeUlkKG5vZGUudmFsdWUpfSc7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRSZXR1cm4oSFJldHVybiBub2RlKSA9PiAiUmV0dXJuOiAke3RlbXBvcmFyeUlkKG5vZGUuaW5wdXRzWzBdKX0iOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRTaGlmdExlZnQoSFNoaWZ0TGVmdCBub2RlKSA9PgogICAgICBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ1NoaWZ0TGVmdCcpOwogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFNoaWZ0UmlnaHQoSFNoaWZ0UmlnaHQgbm9kZSkgPT4KICAgICAgaGFuZGxlSW52b2tlQmluYXJ5KG5vZGUsICdTaGlmdFJpZ2h0Jyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFN0YXRpYyhIU3RhdGljIG5vZGUpID0+ICJTdGF0aWM6ICR7bm9kZS5lbGVtZW50Lm5hbWV9IjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0TGF6eVN0YXRpYyhITGF6eVN0YXRpYyBub2RlKSA9PgogICAgICAiTGF6eVN0YXRpYzogJHtub2RlLmVsZW1lbnQubmFtZX0iOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRPbmVTaG90SW50ZXJjZXB0b3IoSE9uZVNob3RJbnRlcmNlcHRvciBub2RlKSA9PgogICAgICBoYW5kbGVJbnZva2VEeW5hbWljKG5vZGUsICJPbmVTaG90SW50ZXJjZXB0b3IiKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0U3RhdGljU3RvcmUoSFN0YXRpY1N0b3JlIG5vZGUpIHsKICAgIFN0cmluZyBsaHMgPSBub2RlLmVsZW1lbnQubmFtZTsKICAgIHJldHVybiAiU3RhdGljU3RvcmU6ICRsaHMgPSAke3RlbXBvcmFyeUlkKG5vZGUuaW5wdXRzWzBdKX0iOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0U3RyaW5nQ29uY2F0KEhTdHJpbmdDb25jYXQgbm9kZSkgewogICAgdmFyIGxlZnRJZCA9IHRlbXBvcmFyeUlkKG5vZGUubGVmdCk7CiAgICB2YXIgcmlnaHRJZCA9IHRlbXBvcmFyeUlkKG5vZGUucmlnaHQpOwogICAgcmV0dXJuICJTdHJpbmdDb25jYXQ6ICRsZWZ0SWQgKyAkcmlnaHRJZCI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRTdHJpbmdpZnkoSFN0cmluZ2lmeSBub2RlKSB7CiAgICByZXR1cm4gIlN0cmluZ2lmeTogJHt0ZW1wb3JhcnlJZChub2RlLmlucHV0c1swXSl9IjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFN1YnRyYWN0KEhTdWJ0cmFjdCBub2RlKSA9PiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ1N1YnRyYWN0Jyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFN3aXRjaChIU3dpdGNoIG5vZGUpIHsKICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBidWYud3JpdGUoIlN3aXRjaDogKCIpOwogICAgYnVmLndyaXRlKHRlbXBvcmFyeUlkKG5vZGUuaW5wdXRzWzBdKSk7CiAgICBidWYud3JpdGUoIikgIik7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IG5vZGUuaW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGJ1Zi53cml0ZSh0ZW1wb3JhcnlJZChub2RlLmlucHV0c1tpXSkpOwogICAgICBidWYud3JpdGUoIjogQiIpOwogICAgICBidWYud3JpdGUobm9kZS5ibG9jay5zdWNjZXNzb3JzW2kgLSAxXS5pZCk7CiAgICAgIGJ1Zi53cml0ZSgiLCAiKTsKICAgIH0KICAgIGJ1Zi53cml0ZSgiZGVmYXVsdDogQiIpOwogICAgYnVmLndyaXRlKG5vZGUuZGVmYXVsdFRhcmdldC5pZCk7CiAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRUaGlzKEhUaGlzIG5vZGUpID0+ICJUaGlzIjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0VGhyb3coSFRocm93IG5vZGUpID0+ICJUaHJvdzogJHt0ZW1wb3JhcnlJZChub2RlLmlucHV0c1swXSl9IjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0VGhyb3dFeHByZXNzaW9uKEhUaHJvd0V4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuICJUaHJvd0V4cHJlc3Npb246ICR7dGVtcG9yYXJ5SWQobm9kZS5pbnB1dHNbMF0pfSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRUcnVuY2F0aW5nRGl2aWRlKEhUcnVuY2F0aW5nRGl2aWRlIG5vZGUpIHsKICAgIHJldHVybiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ1RydW5jYXRpbmdEaXZpZGUnKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFJlbWFpbmRlcihIUmVtYWluZGVyIG5vZGUpIHsKICAgIHJldHVybiBoYW5kbGVJbnZva2VCaW5hcnkobm9kZSwgJ1JlbWFpbmRlcicpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0RXhpdFRyeShIRXhpdFRyeSBub2RlKSB7CiAgICByZXR1cm4gIkV4aXRUcnkiOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0VHJ5KEhUcnkgbm9kZSkgewogICAgTGlzdDxIQmFzaWNCbG9jaz4gc3VjY2Vzc29ycyA9IGN1cnJlbnRCbG9jay5zdWNjZXNzb3JzOwogICAgU3RyaW5nIHRyeUJsb2NrID0gJ0Ike3N1Y2Nlc3NvcnNbMF0uaWR9JzsKICAgIFN0cmluZyBjYXRjaEJsb2NrID0gJ25vbmUnOwogICAgaWYgKG5vZGUuY2F0Y2hCbG9jayAhPSBudWxsKSB7CiAgICAgIGNhdGNoQmxvY2sgPSAnQiR7c3VjY2Vzc29yc1sxXS5pZH0nOwogICAgfQoKICAgIFN0cmluZyBmaW5hbGx5QmxvY2sgPSAnbm9uZSc7CiAgICBpZiAobm9kZS5maW5hbGx5QmxvY2sgIT0gbnVsbCkgewogICAgICBmaW5hbGx5QmxvY2sgPSAnQiR7bm9kZS5maW5hbGx5QmxvY2suaWR9JzsKICAgIH0KCiAgICByZXR1cm4gIlRyeTogJHRyeUJsb2NrLCBDYXRjaDogJGNhdGNoQmxvY2ssIEZpbmFsbHk6ICRmaW5hbGx5QmxvY2ssICIKICAgICAgICAiSm9pbjogQiR7c3VjY2Vzc29ycy5sYXN0LmlkfSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRJcyhISXMgbm9kZSkgewogICAgU3RyaW5nIHR5cGUgPSBub2RlLnR5cGVFeHByZXNzaW9uLnRvU3RyaW5nKCk7CiAgICByZXR1cm4gIklzOiAke3RlbXBvcmFyeUlkKG5vZGUuZXhwcmVzc2lvbil9IGlzICR0eXBlIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdElzVmlhSW50ZXJjZXB0b3IoSElzVmlhSW50ZXJjZXB0b3Igbm9kZSkgewogICAgU3RyaW5nIHR5cGUgPSBub2RlLnR5cGVFeHByZXNzaW9uLnRvU3RyaW5nKCk7CiAgICByZXR1cm4gIklzVmlhSW50ZXJjZXB0b3I6ICR7dGVtcG9yYXJ5SWQobm9kZS5pbnB1dHNbMF0pfSBpcyAkdHlwZSI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRUeXBlQ29udmVyc2lvbihIVHlwZUNvbnZlcnNpb24gbm9kZSkgewogICAgU3RyaW5nIGNoZWNrZWRJbnB1dCA9IHRlbXBvcmFyeUlkKG5vZGUuY2hlY2tlZElucHV0KTsKICAgIFN0cmluZyByZXN0OwogICAgaWYgKG5vZGUuaW5wdXRzLmxlbmd0aCA9PSAyKSB7CiAgICAgIHJlc3QgPSAiICR7dGVtcG9yYXJ5SWQobm9kZS5pbnB1dHMubGFzdCl9IjsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChub2RlLmlucHV0cy5sZW5ndGggPT0gMSk7CiAgICAgIHJlc3QgPSAiIjsKICAgIH0KICAgIFN0cmluZyBraW5kID0gX3R5cGVDb252ZXJzaW9uS2luZChub2RlKTsKICAgIHJldHVybiAiVHlwZUNvbnZlcnNpb246ICRraW5kICRjaGVja2VkSW5wdXQgdG8gJHtub2RlLmluc3RydWN0aW9uVHlwZX0kcmVzdCI7CiAgfQoKICBTdHJpbmcgX3R5cGVDb252ZXJzaW9uS2luZChIVHlwZUNvbnZlcnNpb24gbm9kZSkgewogICAgaWYgKG5vZGUuaXNUeXBlQ2hlY2spIHJldHVybiAnVFlQRV9DSEVDSyc7CiAgICBpZiAobm9kZS5pc0Nhc3RDaGVjaykgcmV0dXJuICdDQVNUX0NIRUNLJzsKICAgIHJldHVybiAnPyc7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRQcmltaXRpdmVDaGVjayhIUHJpbWl0aXZlQ2hlY2sgbm9kZSkgewogICAgU3RyaW5nIGNoZWNrZWRJbnB1dCA9IHRlbXBvcmFyeUlkKG5vZGUuY2hlY2tlZElucHV0KTsKICAgIGFzc2VydChub2RlLmlucHV0cy5sZW5ndGggPT0gMSk7CiAgICBTdHJpbmcga2luZCA9IF9wcmltaXRpdmVDaGVja0tpbmQobm9kZSk7CiAgICByZXR1cm4gIlByaW1pdGl2ZUNoZWNrOiAka2luZCAkY2hlY2tlZElucHV0IHRvICR7bm9kZS5pbnN0cnVjdGlvblR5cGV9IjsKICB9CgogIFN0cmluZyBfcHJpbWl0aXZlQ2hlY2tLaW5kKEhQcmltaXRpdmVDaGVjayBub2RlKSB7CiAgICBpZiAobm9kZS5pc1JlY2VpdmVyVHlwZUNoZWNrKSByZXR1cm4gJ1JFQ0VJVkVSJzsKICAgIGlmIChub2RlLmlzQXJndW1lbnRUeXBlQ2hlY2spIHJldHVybiAnQVJHVU1FTlQnOwogICAgcmV0dXJuICc/JzsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEJvb2xDb252ZXJzaW9uKEhCb29sQ29udmVyc2lvbiBub2RlKSB7CiAgICBTdHJpbmcgY2hlY2tlZElucHV0ID0gdGVtcG9yYXJ5SWQobm9kZS5jaGVja2VkSW5wdXQpOwogICAgcmV0dXJuICJCb29sQ29udmVyc2lvbjogJGNoZWNrZWRJbnB1dCI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRUeXBlS25vd24oSFR5cGVLbm93biBub2RlKSB7CiAgICBhc3NlcnQobm9kZS5pbnB1dHMubGVuZ3RoIDw9IDIpOwogICAgU3RyaW5nIHJlc3VsdCA9CiAgICAgICAgIlR5cGVLbm93bjogJHt0ZW1wb3JhcnlJZChub2RlLmNoZWNrZWRJbnB1dCl9IGlzICR7bm9kZS5rbm93blR5cGV9IjsKICAgIGlmIChub2RlLndpdG5lc3MgIT0gbnVsbCkgewogICAgICByZXN1bHQgKz0gIiB3aXRuZXNzZWQgYnkgJHt0ZW1wb3JhcnlJZChub2RlLndpdG5lc3MpfSI7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0UmFuZ2VDb252ZXJzaW9uKEhSYW5nZUNvbnZlcnNpb24gbm9kZSkgewogICAgcmV0dXJuICJSYW5nZUNvbnZlcnNpb246ICR7bm9kZS5jaGVja2VkSW5wdXR9IjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdFR5cGVJbmZvUmVhZFJhdyhIVHlwZUluZm9SZWFkUmF3IG5vZGUpIHsKICAgIHZhciBpbnB1dHMgPSBub2RlLmlucHV0cy5tYXAodGVtcG9yYXJ5SWQpLmpvaW4oJywgJyk7CiAgICByZXR1cm4gIlR5cGVJbmZvUmVhZFJhdzogJGlucHV0cyI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRUeXBlSW5mb1JlYWRWYXJpYWJsZShIVHlwZUluZm9SZWFkVmFyaWFibGUgbm9kZSkgewogICAgdmFyIGlucHV0cyA9IG5vZGUuaW5wdXRzLm1hcCh0ZW1wb3JhcnlJZCkuam9pbignLCAnKTsKICAgIHJldHVybiAiVHlwZUluZm9SZWFkVmFyaWFibGU6ICR7bm9kZS52YXJpYWJsZX0gICRpbnB1dHMiOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0VHlwZUluZm9FeHByZXNzaW9uKEhUeXBlSW5mb0V4cHJlc3Npb24gbm9kZSkgewogICAgdmFyIGlucHV0cyA9IG5vZGUuaW5wdXRzLm1hcCh0ZW1wb3JhcnlJZCkuam9pbignLCAnKTsKICAgIHJldHVybiAiVHlwZUluZm9FeHByZXNzaW9uOiAke25vZGUua2luZEFzU3RyaW5nfSAke25vZGUuZGFydFR5cGV9IgogICAgICAgICIgKCRpbnB1dHMpIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdEF3YWl0KEhBd2FpdCBub2RlKSB7CiAgICByZXR1cm4gIkF3YWl0OiAke3RlbXBvcmFyeUlkKG5vZGUuaW5wdXRzWzBdKX0iOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0WWllbGQoSFlpZWxkIG5vZGUpIHsKICAgIHJldHVybiAiWWllbGQke25vZGUuaGFzU3RhciA/ICIqIiA6ICIifTogJHt0ZW1wb3JhcnlJZChub2RlLmlucHV0c1swXSl9IjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdElzVGVzdChISXNUZXN0IG5vZGUpIHsKICAgIHZhciBpbnB1dHMgPSBub2RlLmlucHV0cy5tYXAodGVtcG9yYXJ5SWQpLmpvaW4oJywgJyk7CiAgICByZXR1cm4gIklzVGVzdDogJGlucHV0cyI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRBc0NoZWNrKEhBc0NoZWNrIG5vZGUpIHsKICAgIHZhciBpbnB1dHMgPSBub2RlLmlucHV0cy5tYXAodGVtcG9yYXJ5SWQpLmpvaW4oJywgJyk7CiAgICBTdHJpbmcgZXJyb3IgPSBub2RlLmlzVHlwZUVycm9yID8gJ1R5cGVFcnJvcicgOiAnQ2FzdEVycm9yJzsKICAgIHJldHVybiAiQXNDaGVjazogJGVycm9yICRpbnB1dHMiOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0QXNDaGVja1NpbXBsZShIQXNDaGVja1NpbXBsZSBub2RlKSB7CiAgICB2YXIgaW5wdXRzID0gbm9kZS5pbnB1dHMubWFwKHRlbXBvcmFyeUlkKS5qb2luKCcsICcpOwogICAgU3RyaW5nIGVycm9yID0gbm9kZS5pc1R5cGVFcnJvciA/ICdUeXBlRXJyb3InIDogJ0Nhc3RFcnJvcic7CiAgICByZXR1cm4gIkFzQ2hlY2tTaW1wbGU6ICRlcnJvciAke25vZGUuZGFydFR5cGV9ICRpbnB1dHMiOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0U3VidHlwZUNoZWNrKEhTdWJ0eXBlQ2hlY2sgbm9kZSkgewogICAgdmFyIGlucHV0cyA9IG5vZGUuaW5wdXRzLm1hcCh0ZW1wb3JhcnlJZCkuam9pbignLCAnKTsKICAgIHJldHVybiAiU3VidHlwZUNoZWNrOiAkaW5wdXRzIjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB2aXNpdExvYWRUeXBlKEhMb2FkVHlwZSBub2RlKSB7CiAgICB2YXIgaW5wdXRzID0gbm9kZS5pbnB1dHMubWFwKHRlbXBvcmFyeUlkKS5qb2luKCcsICcpOwogICAgcmV0dXJuICJMb2FkVHlwZTogJHtub2RlLnR5cGVFeHByZXNzaW9ufSAgJGlucHV0cyI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRJbnN0YW5jZUVudmlyb25tZW50KEhJbnN0YW5jZUVudmlyb25tZW50IG5vZGUpIHsKICAgIHZhciBpbnB1dHMgPSBub2RlLmlucHV0cy5tYXAodGVtcG9yYXJ5SWQpLmpvaW4oJywgJyk7CiAgICByZXR1cm4gIkluc3RhbmNlRW52aXJvbm1lbnQ6ICRpbnB1dHMiOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0VHlwZUV2YWwoSFR5cGVFdmFsIG5vZGUpIHsKICAgIHZhciBpbnB1dHMgPSBub2RlLmlucHV0cy5tYXAodGVtcG9yYXJ5SWQpLmpvaW4oJywgJyk7CiAgICByZXR1cm4gIlR5cGVFdmFsOiAke25vZGUudHlwZUV4cHJlc3Npb259ICAke25vZGUuZW52U3RydWN0dXJlfSAgJGlucHV0cyI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRUeXBlQmluZChIVHlwZUJpbmQgbm9kZSkgewogICAgdmFyIGlucHV0cyA9IG5vZGUuaW5wdXRzLm1hcCh0ZW1wb3JhcnlJZCkuam9pbignLCAnKTsKICAgIHJldHVybiAiVHlwZUJpbmQ6ICRpbnB1dHMiOwogIH0KfQqC2ABOTjwBFAEyODFAGSoVATc/EjYiDBsBKgEvFxQjIQgEASwmKg0TGzwmCBEGBAEqJCgNExk4JAgRBgQBGEQwHSoTLE1QE0FBUQYEAQwsKjkeFi0lIx4cJyMlPggZGyQrIzk4OkYjDjYODAoWMi0KCAQCATwiIgFAATInAU4BMRNFFBstHRQbMR0UGywdFBsuHRRNFE4UGzQdFE8UTxROFE4UJDIeFA0UBicEAQwrOAQBQSosJAQBDB8wHAQBDEEBDEoBDCUwHwQBDEcBDEoBDC8wLkAEAQwjNR4/BiUEAQxQAQwpNR5CBigEAQwlTwQBDCs+BAEMSgEMKgEMKRxCBipBBAEMKS4qTQQBDDcqNBsbMEYfOw07BgQBDCs3BAEMKSs+BAEMKS4rSgQBDCE1JAQBDE0MMTUEAQxQAQwdODg2TAQBHk43MS84BjsEAQwjMiwnBAEMLzIsLDYEAQwvMCtHPC0GIgQBDDQyAUM0KCcrNDokBAEMQDgMQDgMQDgBDDMpRwQBDDEpRgQBDEUpUAQBDEEpTgQBDC8mJTorBAEMRAwsLQEMLzYzLjkGLQQBDC84ODhUBAEMUAEMJTAfBAEMRwEMNTkEAQwtNQQBDB4uGzIlMAYeBAEMHy4EAQxQAQwsLQwuLgEMRgEMLioBDD43AQwvJEEEAQwxKSsvBAEMKzgEAQxQAQwlKxwsFTMuGDIXBh0mGwQBDCoBDE0BDDc+BAEMOTkEAQwrMgQBDCcWBAEMHzwuICMrBgEiJTEGAUooBAEMHTI7BAEMOTJIBAEMNToRIzINJxEGLVIEATUvLxAEAQw1OiUtTQQBNTU1EAQBDDU6LAQBDCslFE0gPgYTBAEMNzQEAQw3OicEAQxBOj4EAQw9OkcWBAEMIzQEAQwjTgQBDCU6HgQBDCc6QSYEAQwzOkE9BAEMMTokBAEMKTo4BAEMPzorBAEMKTpOBAEMKTogBAIBKHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9zc2FfdHJhY2VyLmRhcnRDc2Rrcm9vdDovc2RrL2xpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvc2hhcmVkL3JlY2lwZV9zeW50YXguZGFydKTULy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBDb25zdGFudHMgYW5kIHByZWRpY2F0ZXMgdXNlZCBmb3IgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHR5cGUgcmVjaXBlcy4KLy8vCi8vLyBUaGlzIGxpYnJhcnkgaXMgc2hhcmVkIGJldHdlZW4gdGhlIGNvbXBpbGVyIGFuZCB0aGUgcnVudGltZSBzeXN0ZW0uCmxpYnJhcnkgZGFydDJqcy5fcmVjaXBlX3N5bnRheDsKCmFic3RyYWN0IGNsYXNzIFJlY2lwZSB7CiAgUmVjaXBlLl8oKTsKCiAgLy8gT3BlcmF0b3JzLgoKICBzdGF0aWMgY29uc3QgaW50IHNlcGFyYXRvciA9IF9jb21tYTsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHNlcGFyYXRvclN0cmluZyA9IF9jb21tYVN0cmluZzsKCiAgc3RhdGljIGNvbnN0IGludCB0b1R5cGUgPSBfc2VtaWNvbG9uOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgdG9UeXBlU3RyaW5nID0gX3NlbWljb2xvblN0cmluZzsKCiAgc3RhdGljIGNvbnN0IGludCBwdXNoRHluYW1pYyA9IF9hdDsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHB1c2hEeW5hbWljU3RyaW5nID0gX2F0U3RyaW5nOwogIHN0YXRpYyBjb25zdCBpbnQgcHVzaFZvaWQgPSBfdGlsZGU7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBwdXNoVm9pZFN0cmluZyA9IF90aWxkZVN0cmluZzsKCiAgc3RhdGljIGNvbnN0IGludCB3cmFwU3RhciA9IF9hc3RlcmlzazsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHdyYXBTdGFyU3RyaW5nID0gX2FzdGVyaXNrU3RyaW5nOwogIHN0YXRpYyBjb25zdCBpbnQgd3JhcFF1ZXN0aW9uID0gX3F1ZXN0aW9uOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgd3JhcFF1ZXN0aW9uU3RyaW5nID0gX3F1ZXN0aW9uU3RyaW5nOwogIHN0YXRpYyBjb25zdCBpbnQgd3JhcEZ1dHVyZU9yID0gX3NsYXNoOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgd3JhcEZ1dHVyZU9yU3RyaW5nID0gX3NsYXNoU3RyaW5nOwoKICBzdGF0aWMgY29uc3QgaW50IHN0YXJ0VHlwZUFyZ3VtZW50cyA9IF9sZXNzVGhhbjsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHN0YXJ0VHlwZUFyZ3VtZW50c1N0cmluZyA9IF9sZXNzVGhhblN0cmluZzsKICBzdGF0aWMgY29uc3QgaW50IGVuZFR5cGVBcmd1bWVudHMgPSBfZ3JlYXRlclRoYW47CiAgc3RhdGljIGNvbnN0IFN0cmluZyBlbmRUeXBlQXJndW1lbnRzU3RyaW5nID0gX2dyZWF0ZXJUaGFuU3RyaW5nOwoKICBzdGF0aWMgY29uc3QgaW50IHN0YXJ0RnVuY3Rpb25Bcmd1bWVudHMgPSBfbGVmdFBhcmVuOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgc3RhcnRGdW5jdGlvbkFyZ3VtZW50c1N0cmluZyA9IF9sZWZ0UGFyZW5TdHJpbmc7CiAgc3RhdGljIGNvbnN0IGludCBlbmRGdW5jdGlvbkFyZ3VtZW50cyA9IF9yaWdodFBhcmVuOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZW5kRnVuY3Rpb25Bcmd1bWVudHNTdHJpbmcgPSBfcmlnaHRQYXJlblN0cmluZzsKICBzdGF0aWMgY29uc3QgaW50IHN0YXJ0T3B0aW9uYWxHcm91cCA9IF9sZWZ0QnJhY2tldDsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHN0YXJ0T3B0aW9uYWxHcm91cFN0cmluZyA9IF9sZWZ0QnJhY2tldFN0cmluZzsKICBzdGF0aWMgY29uc3QgaW50IGVuZE9wdGlvbmFsR3JvdXAgPSBfcmlnaHRCcmFja2V0OwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZW5kT3B0aW9uYWxHcm91cFN0cmluZyA9IF9yaWdodEJyYWNrZXRTdHJpbmc7CiAgc3RhdGljIGNvbnN0IGludCBzdGFydE5hbWVkR3JvdXAgPSBfbGVmdEJyYWNlOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgc3RhcnROYW1lZEdyb3VwU3RyaW5nID0gX2xlZnRCcmFjZVN0cmluZzsKICBzdGF0aWMgY29uc3QgaW50IGVuZE5hbWVkR3JvdXAgPSBfcmlnaHRCcmFjZTsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGVuZE5hbWVkR3JvdXBTdHJpbmcgPSBfcmlnaHRCcmFjZVN0cmluZzsKICBzdGF0aWMgY29uc3QgaW50IG5hbWVTZXBhcmF0b3IgPSBfY29sb247CiAgc3RhdGljIGNvbnN0IFN0cmluZyBuYW1lU2VwYXJhdG9yU3RyaW5nID0gX2NvbG9uU3RyaW5nOwoKICBzdGF0aWMgY29uc3QgaW50IGdlbmVyaWNGdW5jdGlvblR5cGVQYXJhbWV0ZXJJbmRleCA9IF9jaXJjdW1mbGV4OwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZ2VuZXJpY0Z1bmN0aW9uVHlwZVBhcmFtZXRlckluZGV4U3RyaW5nID0KICAgICAgX2NpcmN1bWZsZXhTdHJpbmc7CgogIHN0YXRpYyBjb25zdCBpbnQgZXh0ZW5zaW9uT3AgPSBfYW1wZXJzYW5kOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgZXh0ZW5zaW9uT3BTdHJpbmcgPSBfYW1wZXJzYW5kU3RyaW5nOwogIHN0YXRpYyBjb25zdCBpbnQgcHVzaE5ldmVyRXh0ZW5zaW9uID0gMDsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHB1c2hOZXZlckV4dGVuc2lvblN0cmluZyA9ICckcHVzaE5ldmVyRXh0ZW5zaW9uJzsKICBzdGF0aWMgY29uc3QgaW50IHB1c2hBbnlFeHRlbnNpb24gPSAxOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgcHVzaEFueUV4dGVuc2lvblN0cmluZyA9ICckcHVzaEFueUV4dGVuc2lvbic7CgogIC8vIE51bWJlciBhbmQgbmFtZSBjb21wb25lbnRzLgoKICBzdGF0aWMgYm9vbCBpc0RpZ2l0KGludCBjb2RlKSA9PiBjb2RlID49IF9kaWdpdDAgJiYgY29kZSA8PSBfZGlnaXQ5OwogIHN0YXRpYyBpbnQgZGlnaXRWYWx1ZShpbnQgY29kZSkgPT4gY29kZSAtIF9kaWdpdDA7CgogIHN0YXRpYyBib29sIGlzSWRlbnRpZmllclN0YXJ0KGludCBjaCkgPT4KICAgICAgKCgoY2ggfCAzMikgLSBfbG93ZXJjYXNlQSkgJiAweGZmZmYpIDwgMjYgfHwKICAgICAgKGNoID09IF91bmRlcnNjb3JlKSB8fAogICAgICAoY2ggPT0gX2RvbGxhcik7CgogIHN0YXRpYyBjb25zdCBpbnQgcGVyaW9kID0gX3BlcmlvZDsKCiAgLy8gUHJpdmF0ZSBuYW1lcy4KCiAgc3RhdGljIGNvbnN0IGludCBfZm9ybWZlZWQgPSAweDBDOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgX2Zvcm1mZWVkU3RyaW5nID0gJ1xmJzsKCiAgc3RhdGljIGNvbnN0IGludCBfc3BhY2UgPSAweDIwOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgX3NwYWNlU3RyaW5nID0gJyAnOwogIHN0YXRpYyBjb25zdCBpbnQgX2V4Y2xhbWF0aW9uID0gMHgyMTsKICBzdGF0aWMgY29uc3QgU3RyaW5nIF9leGNsYW1hdGlvblN0cmluZyA9ICchJzsKICBzdGF0aWMgY29uc3QgaW50IF9oYXNoID0gMHgyMzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIF9oYXNoU3RyaW5nID0gJyMnOwogIHN0YXRpYyBjb25zdCBpbnQgX2RvbGxhciA9IDB4MjQ7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfZG9sbGFyU3RyaW5nID0gcickJzsKICBzdGF0aWMgY29uc3QgaW50IF9wZXJjZW50ID0gMHgyNTsKICBzdGF0aWMgY29uc3QgU3RyaW5nIF9wZXJjZW50U3RyaW5nID0gJyUnOwogIHN0YXRpYyBjb25zdCBpbnQgX2FtcGVyc2FuZCA9IDB4MjY7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfYW1wZXJzYW5kU3RyaW5nID0gJyYnOwogIHN0YXRpYyBjb25zdCBpbnQgX2Fwb3N0cm9waGUgPSAweDI3OwogIHN0YXRpYyBjb25zdCBTdHJpbmcgX2Fwb3N0cm9waGVTdHJpbmcgPSAiJyI7CiAgc3RhdGljIGNvbnN0IGludCBfbGVmdFBhcmVuID0gMHgyODsKICBzdGF0aWMgY29uc3QgU3RyaW5nIF9sZWZ0UGFyZW5TdHJpbmcgPSAnKCc7CiAgc3RhdGljIGNvbnN0IGludCBfcmlnaHRQYXJlbiA9IDB4Mjk7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfcmlnaHRQYXJlblN0cmluZyA9ICcpJzsKICBzdGF0aWMgY29uc3QgaW50IF9hc3RlcmlzayA9IDB4MkE7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfYXN0ZXJpc2tTdHJpbmcgPSAnKic7CiAgc3RhdGljIGNvbnN0IGludCBfcGx1cyA9IDB4MkI7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfcGx1c1N0cmluZyA9ICcrJzsKICBzdGF0aWMgY29uc3QgaW50IF9jb21tYSA9IDB4MkM7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfY29tbWFTdHJpbmcgPSAnLCc7CiAgc3RhdGljIGNvbnN0IGludCBfbWludXMgPSAweDJEOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgX21pbnVzU3RyaW5nID0gJy0nOwogIHN0YXRpYyBjb25zdCBpbnQgX3BlcmlvZCA9IDB4MkU7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfcGVyaW9kU3RyaW5nID0gJy4nOwogIHN0YXRpYyBjb25zdCBpbnQgX3NsYXNoID0gMHgyRjsKICBzdGF0aWMgY29uc3QgU3RyaW5nIF9zbGFzaFN0cmluZyA9ICcvJzsKCiAgc3RhdGljIGNvbnN0IGludCBfZGlnaXQwID0gMHgzMDsKICBzdGF0aWMgY29uc3QgaW50IF9kaWdpdDkgPSAweDM5OwoKICBzdGF0aWMgY29uc3QgaW50IF9jb2xvbiA9IDB4M0E7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfY29sb25TdHJpbmcgPSAnOic7CiAgc3RhdGljIGNvbnN0IGludCBfc2VtaWNvbG9uID0gMHgzQjsKICBzdGF0aWMgY29uc3QgU3RyaW5nIF9zZW1pY29sb25TdHJpbmcgPSAnOyc7CiAgc3RhdGljIGNvbnN0IGludCBfbGVzc1RoYW4gPSAweDNDOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgX2xlc3NUaGFuU3RyaW5nID0gJzwnOwogIHN0YXRpYyBjb25zdCBpbnQgX2VxdWFscyA9IDB4M0Q7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfZXF1YWxzU3RyaW5nID0gJz0nOwogIHN0YXRpYyBjb25zdCBpbnQgX2dyZWF0ZXJUaGFuID0gMHgzRTsKICBzdGF0aWMgY29uc3QgU3RyaW5nIF9ncmVhdGVyVGhhblN0cmluZyA9ICc+JzsKICBzdGF0aWMgY29uc3QgaW50IF9xdWVzdGlvbiA9IDB4M0Y7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfcXVlc3Rpb25TdHJpbmcgPSAnPyc7CiAgc3RhdGljIGNvbnN0IGludCBfYXQgPSAweDQwOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgX2F0U3RyaW5nID0gJ0AnOwoKICBzdGF0aWMgY29uc3QgaW50IF91cHBlcmNhc2VBID0gMHg0MTsKICBzdGF0aWMgY29uc3QgaW50IF91cHBlcmNhc2VaID0gMHg1QTsKCiAgc3RhdGljIGNvbnN0IGludCBfbGVmdEJyYWNrZXQgPSAweDVCOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgX2xlZnRCcmFja2V0U3RyaW5nID0gJ1snOwogIHN0YXRpYyBjb25zdCBpbnQgX2JhY2tzbGFzaCA9IDB4NUM7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfYmFja3NsYXNoU3RyaW5nID0gcidcJzsKICBzdGF0aWMgY29uc3QgaW50IF9yaWdodEJyYWNrZXQgPSAweDVEOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgX3JpZ2h0QnJhY2tldFN0cmluZyA9ICddJzsKICBzdGF0aWMgY29uc3QgaW50IF9jaXJjdW1mbGV4ID0gMHg1RTsKICBzdGF0aWMgY29uc3QgU3RyaW5nIF9jaXJjdW1mbGV4U3RyaW5nID0gJ14nOwogIHN0YXRpYyBjb25zdCBpbnQgX3VuZGVyc2NvcmUgPSAweDVGOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgX3VuZGVyc2NvcmVTdHJpbmcgPSAnXyc7CiAgc3RhdGljIGNvbnN0IGludCBfYmFja3RpY2sgPSAweDYwOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgX2JhY2t0aWNrU3RyaW5nID0gJ2AnOwoKICBzdGF0aWMgY29uc3QgaW50IF9sb3dlcmNhc2VBID0gMHg2MTsKICBzdGF0aWMgY29uc3QgaW50IF9sb3dlcmNhc2VaID0gMHg3QTsKCiAgc3RhdGljIGNvbnN0IGludCBfbGVmdEJyYWNlID0gMHg3QjsKICBzdGF0aWMgY29uc3QgU3RyaW5nIF9sZWZ0QnJhY2VTdHJpbmcgPSAneyc7CiAgc3RhdGljIGNvbnN0IGludCBfdmVydGljYWwgPSAweDdDOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgX3ZlcnRpY2FsU3RyaW5nID0gJ3wnOwogIHN0YXRpYyBjb25zdCBpbnQgX3JpZ2h0QnJhY2UgPSAweDdEOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgX3JpZ2h0QnJhY2VTdHJpbmcgPSAnfSc7CiAgc3RhdGljIGNvbnN0IGludCBfdGlsZGUgPSAweDdFOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgX3RpbGRlU3RyaW5nID0gJ34nOwoKICBzdGF0aWMgdm9pZCB0ZXN0RXF1aXZhbGVuY2UoKSB7CiAgICB2b2lkIHRlc3QoU3RyaW5nIGxhYmVsLCBpbnQgY2hhckNvZGUsIFN0cmluZyBzdHIpIHsKICAgICAgaWYgKFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpICE9IHN0cikgewogICAgICAgIHRocm93IFN0YXRlRXJyb3IoIiRsYWJlbDogU3RyaW5nLmZyb21DaGFyQ29kZSgkY2hhckNvZGUpICE9ICRzdHIiKTsKICAgICAgfQogICAgfQoKICAgIHZvaWQgdGVzdEV4dGVuc2lvbihTdHJpbmcgbGFiZWwsIGludCBvcCwgU3RyaW5nIHN0cikgewogICAgICBpZiAoJyRvcCcgIT0gc3RyKSB7CiAgICAgICAgdGhyb3cgU3RhdGVFcnJvcigiJGxhYmVsOiAkb3AudG9TdHJpbmcoKSAhPSAkc3RyIik7CiAgICAgIH0KICAgIH0KCiAgICB0ZXN0KCJzZXBhcmF0b3IiLCBzZXBhcmF0b3IsIHNlcGFyYXRvclN0cmluZyk7CiAgICB0ZXN0KCJ0b1R5cGUiLCB0b1R5cGUsIHRvVHlwZVN0cmluZyk7CiAgICB0ZXN0KCJwdXNoRHluYW1pYyIsIHB1c2hEeW5hbWljLCBwdXNoRHluYW1pY1N0cmluZyk7CiAgICB0ZXN0KCJwdXNoVm9pZCIsIHB1c2hWb2lkLCBwdXNoVm9pZFN0cmluZyk7CiAgICB0ZXN0KCJ3cmFwU3RhciIsIHdyYXBTdGFyLCB3cmFwU3RhclN0cmluZyk7CiAgICB0ZXN0KCJ3cmFwUXVlc3Rpb24iLCB3cmFwUXVlc3Rpb24sIHdyYXBRdWVzdGlvblN0cmluZyk7CiAgICB0ZXN0KCJ3cmFwRnV0dXJlT3IiLCB3cmFwRnV0dXJlT3IsIHdyYXBGdXR1cmVPclN0cmluZyk7CiAgICB0ZXN0KCJzdGFydFR5cGVBcmd1bWVudHMiLCBzdGFydFR5cGVBcmd1bWVudHMsIHN0YXJ0VHlwZUFyZ3VtZW50c1N0cmluZyk7CiAgICB0ZXN0KCJlbmRUeXBlQXJndW1lbnRzIiwgZW5kVHlwZUFyZ3VtZW50cywgZW5kVHlwZUFyZ3VtZW50c1N0cmluZyk7CiAgICB0ZXN0KCJzdGFydEZ1bmN0aW9uQXJndW1lbnRzIiwgc3RhcnRGdW5jdGlvbkFyZ3VtZW50cywKICAgICAgICBzdGFydEZ1bmN0aW9uQXJndW1lbnRzU3RyaW5nKTsKICAgIHRlc3QoImVuZEZ1bmN0aW9uQXJndW1lbnRzIiwgZW5kRnVuY3Rpb25Bcmd1bWVudHMsCiAgICAgICAgZW5kRnVuY3Rpb25Bcmd1bWVudHNTdHJpbmcpOwogICAgdGVzdCgic3RhcnRPcHRpb25hbEdyb3VwIiwgc3RhcnRPcHRpb25hbEdyb3VwLCBzdGFydE9wdGlvbmFsR3JvdXBTdHJpbmcpOwogICAgdGVzdCgiZW5kT3B0aW9uYWxHcm91cCIsIGVuZE9wdGlvbmFsR3JvdXAsIGVuZE9wdGlvbmFsR3JvdXBTdHJpbmcpOwogICAgdGVzdCgic3RhcnROYW1lZEdyb3VwIiwgc3RhcnROYW1lZEdyb3VwLCBzdGFydE5hbWVkR3JvdXBTdHJpbmcpOwogICAgdGVzdCgiZW5kTmFtZWRHcm91cCIsIGVuZE5hbWVkR3JvdXAsIGVuZE5hbWVkR3JvdXBTdHJpbmcpOwogICAgdGVzdCgibmFtZVNlcGFyYXRvciIsIG5hbWVTZXBhcmF0b3IsIG5hbWVTZXBhcmF0b3JTdHJpbmcpOwogICAgdGVzdCgiZ2VuZXJpY0Z1bmN0aW9uVHlwZVBhcmFtZXRlckluZGV4IiwgZ2VuZXJpY0Z1bmN0aW9uVHlwZVBhcmFtZXRlckluZGV4LAogICAgICAgIGdlbmVyaWNGdW5jdGlvblR5cGVQYXJhbWV0ZXJJbmRleFN0cmluZyk7CiAgICB0ZXN0KCJleHRlbnNpb25PcCIsIGV4dGVuc2lvbk9wLCBleHRlbnNpb25PcFN0cmluZyk7CiAgICB0ZXN0RXh0ZW5zaW9uKAogICAgICAgICJwdXNoTmV2ZXJFeHRlbnNpb24iLCBwdXNoTmV2ZXJFeHRlbnNpb24sIHB1c2hOZXZlckV4dGVuc2lvblN0cmluZyk7CiAgICB0ZXN0RXh0ZW5zaW9uKCJwdXNoQW55RXh0ZW5zaW9uIiwgcHVzaEFueUV4dGVuc2lvbiwgcHVzaEFueUV4dGVuc2lvblN0cmluZyk7CgogICAgdGVzdCgiX2Zvcm1mZWVkIiwgX2Zvcm1mZWVkLCBfZm9ybWZlZWRTdHJpbmcpOwogICAgdGVzdCgiX3NwYWNlIiwgX3NwYWNlLCBfc3BhY2VTdHJpbmcpOwogICAgdGVzdCgiX2V4Y2xhbWF0aW9uIiwgX2V4Y2xhbWF0aW9uLCBfZXhjbGFtYXRpb25TdHJpbmcpOwogICAgdGVzdCgiX2hhc2giLCBfaGFzaCwgX2hhc2hTdHJpbmcpOwogICAgdGVzdCgiX2RvbGxhciIsIF9kb2xsYXIsIF9kb2xsYXJTdHJpbmcpOwogICAgdGVzdCgiX3BlcmNlbnQiLCBfcGVyY2VudCwgX3BlcmNlbnRTdHJpbmcpOwogICAgdGVzdCgiX2FtcGVyc2FuZCIsIF9hbXBlcnNhbmQsIF9hbXBlcnNhbmRTdHJpbmcpOwogICAgdGVzdCgiX2Fwb3N0cm9waGUiLCBfYXBvc3Ryb3BoZSwgX2Fwb3N0cm9waGVTdHJpbmcpOwogICAgdGVzdCgiX2xlZnRQYXJlbiIsIF9sZWZ0UGFyZW4sIF9sZWZ0UGFyZW5TdHJpbmcpOwogICAgdGVzdCgiX3JpZ2h0UGFyZW4iLCBfcmlnaHRQYXJlbiwgX3JpZ2h0UGFyZW5TdHJpbmcpOwogICAgdGVzdCgiX2FzdGVyaXNrIiwgX2FzdGVyaXNrLCBfYXN0ZXJpc2tTdHJpbmcpOwogICAgdGVzdCgiX3BsdXMiLCBfcGx1cywgX3BsdXNTdHJpbmcpOwogICAgdGVzdCgiX2NvbW1hIiwgX2NvbW1hLCBfY29tbWFTdHJpbmcpOwogICAgdGVzdCgiX21pbnVzIiwgX21pbnVzLCBfbWludXNTdHJpbmcpOwogICAgdGVzdCgiX3BlcmlvZCIsIF9wZXJpb2QsIF9wZXJpb2RTdHJpbmcpOwogICAgdGVzdCgiX3NsYXNoIiwgX3NsYXNoLCBfc2xhc2hTdHJpbmcpOwogICAgdGVzdCgiX2NvbG9uIiwgX2NvbG9uLCBfY29sb25TdHJpbmcpOwogICAgdGVzdCgiX3NlbWljb2xvbiIsIF9zZW1pY29sb24sIF9zZW1pY29sb25TdHJpbmcpOwogICAgdGVzdCgiX2xlc3NUaGFuIiwgX2xlc3NUaGFuLCBfbGVzc1RoYW5TdHJpbmcpOwogICAgdGVzdCgiX2VxdWFscyIsIF9lcXVhbHMsIF9lcXVhbHNTdHJpbmcpOwogICAgdGVzdCgiX2dyZWF0ZXJUaGFuIiwgX2dyZWF0ZXJUaGFuLCBfZ3JlYXRlclRoYW5TdHJpbmcpOwogICAgdGVzdCgiX3F1ZXN0aW9uIiwgX3F1ZXN0aW9uLCBfcXVlc3Rpb25TdHJpbmcpOwogICAgdGVzdCgiX2F0IiwgX2F0LCBfYXRTdHJpbmcpOwogICAgdGVzdCgiX2xlZnRCcmFja2V0IiwgX2xlZnRCcmFja2V0LCBfbGVmdEJyYWNrZXRTdHJpbmcpOwogICAgdGVzdCgiX2JhY2tzbGFzaCIsIF9iYWNrc2xhc2gsIF9iYWNrc2xhc2hTdHJpbmcpOwogICAgdGVzdCgiX3JpZ2h0QnJhY2tldCIsIF9yaWdodEJyYWNrZXQsIF9yaWdodEJyYWNrZXRTdHJpbmcpOwogICAgdGVzdCgiX2NpcmN1bWZsZXgiLCBfY2lyY3VtZmxleCwgX2NpcmN1bWZsZXhTdHJpbmcpOwogICAgdGVzdCgiX3VuZGVyc2NvcmUiLCBfdW5kZXJzY29yZSwgX3VuZGVyc2NvcmVTdHJpbmcpOwogICAgdGVzdCgiX2JhY2t0aWNrIiwgX2JhY2t0aWNrLCBfYmFja3RpY2tTdHJpbmcpOwogICAgdGVzdCgiX2xlZnRCcmFjZSIsIF9sZWZ0QnJhY2UsIF9sZWZ0QnJhY2VTdHJpbmcpOwogICAgdGVzdCgiX3ZlcnRpY2FsIiwgX3ZlcnRpY2FsLCBfdmVydGljYWxTdHJpbmcpOwogICAgdGVzdCgiX3JpZ2h0QnJhY2UiLCBfcmlnaHRCcmFjZSwgX3JpZ2h0QnJhY2VTdHJpbmcpOwogICAgdGVzdCgiX3RpbGRlIiwgX3RpbGRlLCBfdGlsZGVTdHJpbmcpOwogIH0KfQqA6ABOTjwBSgRIIAEYDgEQASc2ASg3ASY1JjUBKTgtPCo5ATNCNEMBOEc3RjZFNUQxQDA/KzoBREAZAS08K0gpRAEhAUc1ASszHRcBJQEUASUuASIqKDAhKSMsJCwmLicvJi4nLyUtISkiKiIqIysiKgEjIwEiKiYuJS0jKygwJS0fJwEnJwEoMCYvKTEnLycvJS0BJycBJi4lLScvIioBIjgyTAgGATsaPAgGATMqOTAwPDxOSDsnNyVOSEU/P1EyORNNUQEzKjwnLTA2OTY5MycqKi0qKjYzLTwzITw2Pzk5MzYzOSoEAgEscGFja2FnZTpqc19ydW50aW1lL3NoYXJlZC9yZWNpcGVfc3ludGF4LmRhcnRCc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfZW1pdHRlci9jbGFzc19zdHViX2dlbmVyYXRvci5kYXJ0uVAvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX2VtaXR0ZXIuY2xhc3Nfc3R1Yl9nZW5lcmF0b3I7CgppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JyBzaG93IElkZW50aWZpZXJzLCBTZWxlY3RvcnM7CmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganNBc3Q7CmltcG9ydCAnLi4vanMvanMuZGFydCcgc2hvdyBqczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ZpZWxkX2FuYWx5c2lzLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmFtZXIuZGFydCcgc2hvdyBOYW1lcjsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ludGVyY2VwdG9yX2RhdGEuZGFydCcgc2hvdyBJbnRlcmNlcHRvckRhdGE7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9idWlsZGVyLmRhcnQnIHNob3cgU2VsZWN0b3JDb25zdHJhaW50czsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKCmltcG9ydCAnY29kZV9lbWl0dGVyX3Rhc2suZGFydCc7CmltcG9ydCAnbW9kZWwuZGFydCc7CgpjbGFzcyBDbGFzc1N0dWJHZW5lcmF0b3IgewogIGZpbmFsIE5hbWVyIF9uYW1lcjsKICBmaW5hbCBDb2RlZ2VuV29ybGQgX2NvZGVnZW5Xb3JsZDsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIGJvb2wgZW5hYmxlTWluaWZpY2F0aW9uOwogIGZpbmFsIEVtaXR0ZXIgX2VtaXR0ZXI7CiAgZmluYWwgQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwoKICBDbGFzc1N0dWJHZW5lcmF0b3IodGhpcy5fZW1pdHRlciwgdGhpcy5fY29tbW9uRWxlbWVudHMsIHRoaXMuX25hbWVyLAogICAgICB0aGlzLl9jb2RlZ2VuV29ybGQsIHRoaXMuX2Nsb3NlZFdvcmxkLAogICAgICB7dGhpcy5lbmFibGVNaW5pZmljYXRpb259KTsKCiAgSW50ZXJjZXB0b3JEYXRhIGdldCBfaW50ZXJjZXB0b3JEYXRhID0+IF9jbG9zZWRXb3JsZC5pbnRlcmNlcHRvckRhdGE7CgogIGpzQXN0LkV4cHJlc3Npb24gZ2VuZXJhdGVDbGFzc0NvbnN0cnVjdG9yKAogICAgICBDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQsIExpc3Q8anNBc3QuTmFtZT4gZmllbGRzLCBib29sIGhhc1J0aUZpZWxkKSB7CiAgICAvLyBUT0RPKHNyYSk6IEltcGxlbWVudCBwbGFjZWhvbGRlcnMgaW4gVmFyaWFibGVEZWNsYXJhdGlvbiBwb3NpdGlvbjoKICAgIC8vCiAgICAvLyAgICAgU3RyaW5nIGNvbnN0cnVjdG9yTmFtZSA9IG5hbWVyLmdldE5hbWVPZkNsYXNzKGNsYXNzRWxlbWVudCk7CiAgICAvLyAgICAgcmV0dXJuIGpzLnN0YXRlbWVudCgnZnVuY3Rpb24gIygjKSB7ICM7IH0nLAogICAgLy8gICAgICAgIFsgY29uc3RydWN0b3JOYW1lLCBmaWVsZHMsCiAgICAvLyAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAvLyAgICAgICAgICAgICAgICAobmFtZSkgPT4ganMoJ3RoaXMuIyA9ICMnLCBbbmFtZSwgbmFtZV0pKV0pKTsKICAgIGR5bmFtaWMgdHlwZVBhcmFtZXRlcnMgPSBjb25zdCA8anNBc3QuUGFyYW1ldGVyPltdOwogICAgZHluYW1pYyB0eXBlSW5pdHMgPSBjb25zdCA8anNBc3QuRXhwcmVzc2lvbj5bXTsKICAgIGlmIChoYXNSdGlGaWVsZCkgewogICAgICBkeW5hbWljIHJ0aU5hbWUgPSBfbmFtZXIucnRpRmllbGRKc05hbWU7CiAgICAgIHR5cGVQYXJhbWV0ZXJzID0gcnRpTmFtZTsKICAgICAgdHlwZUluaXRzID0ganMoJ3RoaXMuIyA9ICMnLCBbcnRpTmFtZSwgcnRpTmFtZV0pOwogICAgfQogICAgTGlzdDxqc0FzdC5QYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuZXcgTGlzdDxqc0FzdC5QYXJhbWV0ZXI+LmdlbmVyYXRlKAogICAgICAgIGZpZWxkcy5sZW5ndGgsIChpKSA9PiBuZXcganNBc3QuUGFyYW1ldGVyKCd0JGknKSk7CiAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGZpZWxkSW5pdGlhbGl6ZXJzID0KICAgICAgICBuZXcgTGlzdDxqc0FzdC5FeHByZXNzaW9uPi5nZW5lcmF0ZShmaWVsZHMubGVuZ3RoLCAoaSkgewogICAgICByZXR1cm4ganMoJ3RoaXMuIyA9ICMnLCBbZmllbGRzW2ldLCBwYXJhbWV0ZXJzW2ldXSk7CiAgICB9KTsKICAgIHJldHVybiBqcygnZnVuY3Rpb24oIywgIykgeyAjOyAjOyB0aGlzLiMoKTt9JywgWwogICAgICBwYXJhbWV0ZXJzLAogICAgICB0eXBlUGFyYW1ldGVycywKICAgICAgZmllbGRJbml0aWFsaXplcnMsCiAgICAgIHR5cGVJbml0cywKICAgICAgX25hbWVyLmZpeGVkTmFtZXMuZGVmZXJyZWRBY3Rpb24KICAgIF0pOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiBnZW5lcmF0ZUdldHRlcihNZW1iZXJFbnRpdHkgbWVtYmVyLCBqc0FzdC5OYW1lIGZpZWxkTmFtZSkgewogICAgQ2xhc3NFbnRpdHkgY2xzID0gbWVtYmVyLmVuY2xvc2luZ0NsYXNzOwogICAgU3RyaW5nIHJlY2VpdmVyID0KICAgICAgICBfaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRDbGFzcyhjbHMpID8gJ3JlY2VpdmVyJyA6ICd0aGlzJzsKICAgIExpc3Q8U3RyaW5nPiBhcmdzID0KICAgICAgICBfaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRNZXRob2QobWVtYmVyKSA/IFsncmVjZWl2ZXInXSA6IFtdOwogICAgcmV0dXJuIGpzKCdmdW5jdGlvbigjKSB7IHJldHVybiAjLiMgfScsIFthcmdzLCByZWNlaXZlciwgZmllbGROYW1lXSk7CiAgfQoKICBqc0FzdC5FeHByZXNzaW9uIGdlbmVyYXRlU2V0dGVyKE1lbWJlckVudGl0eSBtZW1iZXIsIGpzQXN0Lk5hbWUgZmllbGROYW1lKSB7CiAgICBDbGFzc0VudGl0eSBjbHMgPSBtZW1iZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICBTdHJpbmcgcmVjZWl2ZXIgPQogICAgICAgIF9pbnRlcmNlcHRvckRhdGEuaXNJbnRlcmNlcHRlZENsYXNzKGNscykgPyAncmVjZWl2ZXInIDogJ3RoaXMnOwogICAgTGlzdDxTdHJpbmc+IGFyZ3MgPQogICAgICAgIF9pbnRlcmNlcHRvckRhdGEuaXNJbnRlcmNlcHRlZE1ldGhvZChtZW1iZXIpID8gWydyZWNlaXZlciddIDogW107CiAgICAvLyBUT0RPKGZsb2l0c2NoKTogcmVtb3ZlICdyZXR1cm4nPwogICAgcmV0dXJuIGpzKAogICAgICAgICdmdW5jdGlvbigjLCB2KSB7IHJldHVybiAjLiMgPSB2OyB9JywgW2FyZ3MsIHJlY2VpdmVyLCBmaWVsZE5hbWVdKTsKICB9CgogIC8vLyBEb2N1bWVudGF0aW9uIHdhbnRlZCAtLSBqb2hubml3aW50aGVyCiAgLy8vCiAgLy8vIEludmFyaWFudDogW21lbWJlcl0gbXVzdCBiZSBhIGRlY2xhcmF0aW9uIGVsZW1lbnQuCiAgTWFwPGpzQXN0Lk5hbWUsIGpzQXN0LkV4cHJlc3Npb24+IGdlbmVyYXRlQ2FsbFN0dWJzRm9yR2V0dGVyKAogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IHNlbGVjdG9ycykgewogICAgLy8gSWYgdGhlIG1ldGhvZCBpcyBpbnRlcmNlcHRlZCwgdGhlIHN0dWIgZ2V0cyB0aGUKICAgIC8vIHJlY2VpdmVyIGV4cGxpY2l0bHkgYW5kIHdlIG5lZWQgdG8gcGFzcyBpdCB0byB0aGUgZ2V0dGVyIGNhbGwuCiAgICBib29sIGlzSW50ZXJjZXB0ZWRNZXRob2QgPSBfaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRNZXRob2QobWVtYmVyKTsKICAgIGJvb2wgaXNJbnRlcmNlcHRlZENsYXNzID0KICAgICAgICBfaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRDbGFzcyhtZW1iZXIuZW5jbG9zaW5nQ2xhc3MpOwoKICAgIGNvbnN0IFN0cmluZyByZWNlaXZlckFyZ3VtZW50TmFtZSA9IHInJHJlY2VpdmVyJzsKCiAgICBqc0FzdC5FeHByZXNzaW9uIGJ1aWxkR2V0dGVyKCkgewogICAgICBqc0FzdC5FeHByZXNzaW9uIHJlY2VpdmVyID0KICAgICAgICAgIGpzKGlzSW50ZXJjZXB0ZWRDbGFzcyA/IHJlY2VpdmVyQXJndW1lbnROYW1lIDogJ3RoaXMnKTsKICAgICAgaWYgKG1lbWJlci5pc0dldHRlcikgewogICAgICAgIGpzQXN0Lk5hbWUgZ2V0dGVyTmFtZSA9IF9uYW1lci5nZXR0ZXJGb3JFbGVtZW50KG1lbWJlcik7CiAgICAgICAgaWYgKGlzSW50ZXJjZXB0ZWRNZXRob2QpIHsKICAgICAgICAgIHJldHVybiBqcygndGhpcy4jKCMpJywgW2dldHRlck5hbWUsIHJlY2VpdmVyXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBqcygnIy4jKCknLCBbcmVjZWl2ZXIsIGdldHRlck5hbWVdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBGaWVsZEFuYWx5c2lzRGF0YSBmaWVsZERhdGEgPQogICAgICAgICAgICBfY2xvc2VkV29ybGQuZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEobWVtYmVyKTsKICAgICAgICBpZiAoZmllbGREYXRhLmlzRWZmZWN0aXZlbHlDb25zdGFudCkgewogICAgICAgICAgcmV0dXJuIF9lbWl0dGVyLmNvbnN0YW50UmVmZXJlbmNlKGZpZWxkRGF0YS5jb25zdGFudFZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAganNBc3QuTmFtZSBmaWVsZE5hbWUgPSBfbmFtZXIuaW5zdGFuY2VGaWVsZFByb3BlcnR5TmFtZShtZW1iZXIpOwogICAgICAgICAgcmV0dXJuIGpzKCcjLiMnLCBbcmVjZWl2ZXIsIGZpZWxkTmFtZV0pOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIE1hcDxqc0FzdC5OYW1lLCBqc0FzdC5FeHByZXNzaW9uPiBnZW5lcmF0ZWRTdHVicyA9CiAgICAgICAgPGpzQXN0Lk5hbWUsIGpzQXN0LkV4cHJlc3Npb24+e307CgogICAgLy8gVHdvIHNlbGVjdG9ycyBtYXkgbWF0Y2ggYnV0IGRpZmZlciBvbmx5IGluIHR5cGUuICBUbyBhdm9pZCBnZW5lcmF0aW5nCiAgICAvLyBpZGVudGljYWwgc3R1YnMgZm9yIGVhY2ggd2UgdHJhY2sgdW50eXBlZCBzZWxlY3RvcnMgd2hpY2ggYWxyZWFkeSBoYXZlCiAgICAvLyBzdHVicy4KICAgIFNldDxTZWxlY3Rvcj4gZ2VuZXJhdGVkU2VsZWN0b3JzID0gbmV3IFNldDxTZWxlY3Rvcj4oKTsKICAgIGZvciAoU2VsZWN0b3Igc2VsZWN0b3IgaW4gc2VsZWN0b3JzLmtleXMpIHsKICAgICAgaWYgKGdlbmVyYXRlZFNlbGVjdG9ycy5jb250YWlucyhzZWxlY3RvcikpIGNvbnRpbnVlOwogICAgICBpZiAoIXNlbGVjdG9yLmFwcGxpZXNVbm5hbWVkKG1lbWJlcikpIGNvbnRpbnVlOwogICAgICBpZiAoc2VsZWN0b3JzW3NlbGVjdG9yXQogICAgICAgICAgLmNhbkhpdChtZW1iZXIsIHNlbGVjdG9yLm1lbWJlck5hbWUsIF9jbG9zZWRXb3JsZCkpIHsKICAgICAgICBnZW5lcmF0ZWRTZWxlY3RvcnMuYWRkKHNlbGVjdG9yKTsKCiAgICAgICAganNBc3QuTmFtZSBpbnZvY2F0aW9uTmFtZSA9IF9uYW1lci5pbnZvY2F0aW9uTmFtZShzZWxlY3Rvcik7CiAgICAgICAgU2VsZWN0b3IgY2FsbFNlbGVjdG9yID0gbmV3IFNlbGVjdG9yLmNhbGxDbG9zdXJlRnJvbShzZWxlY3Rvcik7CiAgICAgICAganNBc3QuTmFtZSBjbG9zdXJlQ2FsbE5hbWUgPSBfbmFtZXIuaW52b2NhdGlvbk5hbWUoY2FsbFNlbGVjdG9yKTsKCiAgICAgICAgTGlzdDxqc0FzdC5QYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSA8anNBc3QuUGFyYW1ldGVyPltdOwogICAgICAgIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gYXJndW1lbnRzID0gPGpzQXN0LkV4cHJlc3Npb24+W107CiAgICAgICAgaWYgKGlzSW50ZXJjZXB0ZWRNZXRob2QpIHsKICAgICAgICAgIHBhcmFtZXRlcnMuYWRkKG5ldyBqc0FzdC5QYXJhbWV0ZXIocmVjZWl2ZXJBcmd1bWVudE5hbWUpKTsKICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0b3IuYXJndW1lbnRDb3VudDsgaSsrKSB7CiAgICAgICAgICBTdHJpbmcgbmFtZSA9ICdhcmckaSc7CiAgICAgICAgICBwYXJhbWV0ZXJzLmFkZChuZXcganNBc3QuUGFyYW1ldGVyKG5hbWUpKTsKICAgICAgICAgIGFyZ3VtZW50cy5hZGQoanMoJyMnLCBuYW1lKSk7CiAgICAgICAgfQoKICAgICAgICBqc0FzdC5GdW4gZnVuY3Rpb24gPSBqcygnZnVuY3Rpb24oIykgeyByZXR1cm4gIy4jKCMpOyB9JywKICAgICAgICAgICAgW3BhcmFtZXRlcnMsIGJ1aWxkR2V0dGVyKCksIGNsb3N1cmVDYWxsTmFtZSwgYXJndW1lbnRzXSk7CgogICAgICAgIGdlbmVyYXRlZFN0dWJzW2ludm9jYXRpb25OYW1lXSA9IGZ1bmN0aW9uOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGdlbmVyYXRlZFN0dWJzOwogIH0KCiAgTWFwPGpzQXN0Lk5hbWUsIFNlbGVjdG9yPiBjb21wdXRlU2VsZWN0b3JzRm9yTnNtSGFuZGxlcnMoKSB7CiAgICBNYXA8anNBc3QuTmFtZSwgU2VsZWN0b3I+IGpzTmFtZXMgPSA8anNBc3QuTmFtZSwgU2VsZWN0b3I+e307CgogICAgLy8gRG8gbm90IGdlbmVyYXRlIG5vIHN1Y2ggbWV0aG9kIGhhbmRsZXJzIGlmIHRoZXJlIGlzIG5vIGNsYXNzLgogICAgaWYgKF9jb2RlZ2VuV29ybGQuZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIGpzTmFtZXM7CiAgICB9CgogICAgdm9pZCBhZGROb1N1Y2hNZXRob2RIYW5kbGVycygKICAgICAgICBTdHJpbmcgaWdub3JlLCBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IHNlbGVjdG9ycykgewogICAgICBmb3IgKFNlbGVjdG9yIHNlbGVjdG9yIGluIHNlbGVjdG9ycy5rZXlzKSB7CiAgICAgICAgaWYgKHNlbGVjdG9yID09IFNlbGVjdG9ycy5ydW50aW1lVHlwZV8gfHwKICAgICAgICAgICAgc2VsZWN0b3IgPT0gU2VsZWN0b3JzLmVxdWFscyB8fAogICAgICAgICAgICBzZWxlY3RvciA9PSBTZWxlY3RvcnMudG9TdHJpbmdfIHx8CiAgICAgICAgICAgIHNlbGVjdG9yID09IFNlbGVjdG9ycy5oYXNoQ29kZV8gfHwKICAgICAgICAgICAgc2VsZWN0b3IgPT0gU2VsZWN0b3JzLm5vU3VjaE1ldGhvZF8pIHsKICAgICAgICAgIC8vIFNraXAgT2JqZWN0IG1ldGhvZHMgc2luY2UgdGhlc2UgbmVlZCBubyBub1N1Y2hNZXRob2QgaGFuZGxpbmcKICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZWNpc2lvbiBvZiB0aGUgc2VsZWN0b3IgY29uc3RyYWludHMuCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIFNlbGVjdG9yQ29uc3RyYWludHMgbWFza1NldCA9IHNlbGVjdG9yc1tzZWxlY3Rvcl07CiAgICAgICAgaWYgKG1hc2tTZXQubmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZyhzZWxlY3RvciwgX2Nsb3NlZFdvcmxkKSkgewogICAgICAgICAganNBc3QuTmFtZSBqc05hbWUgPSBfbmFtZXIuaW52b2NhdGlvbk1pcnJvckludGVybmFsTmFtZShzZWxlY3Rvcik7CiAgICAgICAgICBqc05hbWVzW2pzTmFtZV0gPSBzZWxlY3RvcjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBfY29kZWdlbldvcmxkLmZvckVhY2hJbnZva2VkTmFtZShhZGROb1N1Y2hNZXRob2RIYW5kbGVycyk7CiAgICBfY29kZWdlbldvcmxkLmZvckVhY2hJbnZva2VkR2V0dGVyKGFkZE5vU3VjaE1ldGhvZEhhbmRsZXJzKTsKICAgIF9jb2RlZ2VuV29ybGQuZm9yRWFjaEludm9rZWRTZXR0ZXIoYWRkTm9TdWNoTWV0aG9kSGFuZGxlcnMpOwogICAgcmV0dXJuIGpzTmFtZXM7CiAgfQoKICBTdHViTWV0aG9kIGdlbmVyYXRlU3R1YkZvck5vU3VjaE1ldGhvZChqc0FzdC5OYW1lIG5hbWUsIFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAvLyBWYWx1ZXMgbWF0Y2ggSlNJbnZvY2F0aW9uTWlycm9yIGluIGpzLWhlbHBlciBsaWJyYXJ5LgogICAgaW50IHR5cGUgPSBzZWxlY3Rvci5pbnZvY2F0aW9uTWlycm9yS2luZDsKICAgIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJOYW1lcyA9CiAgICAgICAgbmV3IExpc3QuZ2VuZXJhdGUoc2VsZWN0b3IuYXJndW1lbnRDb3VudCwgKGkpID0+ICdcJCRpJykgKwogICAgICAgICAgICBuZXcgTGlzdC5nZW5lcmF0ZShzZWxlY3Rvci50eXBlQXJndW1lbnRDb3VudCwgKGkpID0+ICdcJFQke2kgKyAxfScpOwoKICAgIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gYXJnTmFtZXMgPSBzZWxlY3Rvci5jYWxsU3RydWN0dXJlCiAgICAgICAgLmdldE9yZGVyZWROYW1lZEFyZ3VtZW50cygpCiAgICAgICAgLm1hcCgoU3RyaW5nIG5hbWUpID0+IGpzLnN0cmluZyhuYW1lKSkKICAgICAgICAudG9MaXN0KCk7CgogICAganNBc3QuTmFtZSBtZXRob2ROYW1lID0gX25hbWVyLmFzTmFtZShzZWxlY3Rvci5pbnZvY2F0aW9uTWlycm9yTWVtYmVyTmFtZSk7CiAgICBqc0FzdC5OYW1lIGludGVybmFsTmFtZSA9IF9uYW1lci5pbnZvY2F0aW9uTWlycm9ySW50ZXJuYWxOYW1lKHNlbGVjdG9yKTsKCiAgICBhc3NlcnQoX2ludGVyY2VwdG9yRGF0YS5pc0ludGVyY2VwdGVkTmFtZShJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfKSk7CiAgICBib29sIGlzSW50ZXJjZXB0ZWQgPSBfaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWROYW1lKHNlbGVjdG9yLm5hbWUpOwogICAganNBc3QuRXhwcmVzc2lvbiBleHByZXNzaW9uID0ganMoJycndGhpcy4jbm9TdWNoTWV0aG9kTmFtZSgjcmVjZWl2ZXIsCiAgICAgICAgICAgICAgICAgICAgI2NyZWF0ZUludm9jYXRpb25NaXJyb3IoI21ldGhvZE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ludGVybmFsTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYXJndW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNuYW1lZEFyZ3VtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdHlwZUFyZ3VtZW50Q291bnQpKScnJywgewogICAgICAncmVjZWl2ZXInOiBpc0ludGVyY2VwdGVkID8gcickcmVjZWl2ZXInIDogJ3RoaXMnLAogICAgICAnbm9TdWNoTWV0aG9kTmFtZSc6IF9uYW1lci5ub1N1Y2hNZXRob2ROYW1lLAogICAgICAnY3JlYXRlSW52b2NhdGlvbk1pcnJvcic6CiAgICAgICAgICBfZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcyhfY29tbW9uRWxlbWVudHMuY3JlYXRlSW52b2NhdGlvbk1pcnJvciksCiAgICAgICdtZXRob2ROYW1lJzoKICAgICAgICAgIGpzLnF1b3RlTmFtZShlbmFibGVNaW5pZmljYXRpb24gPyBpbnRlcm5hbE5hbWUgOiBtZXRob2ROYW1lKSwKICAgICAgJ2ludGVybmFsTmFtZSc6IGpzLnF1b3RlTmFtZShpbnRlcm5hbE5hbWUpLAogICAgICAndHlwZSc6IGpzLm51bWJlcih0eXBlKSwKICAgICAgJ2FyZ3VtZW50cyc6IG5ldyBqc0FzdC5BcnJheUluaXRpYWxpemVyKAogICAgICAgICAgcGFyYW1ldGVyTmFtZXMubWFwPGpzQXN0LkV4cHJlc3Npb24+KGpzKS50b0xpc3QoKSksCiAgICAgICduYW1lZEFyZ3VtZW50cyc6IG5ldyBqc0FzdC5BcnJheUluaXRpYWxpemVyKGFyZ05hbWVzKSwKICAgICAgJ3R5cGVBcmd1bWVudENvdW50JzoganMubnVtYmVyKHNlbGVjdG9yLnR5cGVBcmd1bWVudENvdW50KQogICAgfSk7CgogICAganNBc3QuRXhwcmVzc2lvbiBmdW5jdGlvbjsKICAgIGlmIChpc0ludGVyY2VwdGVkKSB7CiAgICAgIGZ1bmN0aW9uID0ganMoCiAgICAgICAgICByJ2Z1bmN0aW9uKCRyZWNlaXZlciwgIykgeyByZXR1cm4gIyB9JywgW3BhcmFtZXRlck5hbWVzLCBleHByZXNzaW9uXSk7CiAgICB9IGVsc2UgewogICAgICBmdW5jdGlvbiA9IGpzKHInZnVuY3Rpb24oIykgeyByZXR1cm4gIyB9JywgW3BhcmFtZXRlck5hbWVzLCBleHByZXNzaW9uXSk7CiAgICB9CiAgICByZXR1cm4gbmV3IFN0dWJNZXRob2QobmFtZSwgZnVuY3Rpb24pOwogIH0KfQoKLy8vIENyZWF0ZXMgdHdvIEphdmFTY3JpcHQgZnVuY3Rpb25zOiBgdGVhck9mZkdldHRlcmAgYW5kIGB0ZWFyT2ZmYC4KLy8vCi8vLyBgdGVhck9mZkdldHRlcmAgaXMgaW50ZXJuYWwgYW5kIG9ubHkgdXNlZCBieSBgdGVhck9mZmAuCi8vLwovLy8gYHRlYXJPZmZgIHRha2VzIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgovLy8gICAqIGBmdW5jc2A6IGEgbGlzdCBvZiBmdW5jdGlvbnMuIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHJlcHJlc2VudGluZyB0aGUKLy8vICAgICBtZW1iZXIgdGhhdCBpcyB0b3JuIG9mZi4gVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUsIHNpbmNlIGEgbWVtYmVyCi8vLyAgICAgY2FuIGhhdmUgc2V2ZXJhbCBzdHVicy4KLy8vICAgICBFYWNoIGZ1bmN0aW9uIG11c3QgaGF2ZSB0aGUgYCRjYWxsTmFtZWAgcHJvcGVydHkgc2V0LgovLy8gICAqIGBhcHBseVRyYW1wb2xpbmVJbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBzdHViIHRvIGJlIHVzZWQgZm9yCi8vLyAgICAgRnVuY3Rpb24uYXBwbHkKLy8vICAgKiBgcmVmbGVjdGlvbkluZm9gOiBjb250YWlucyByZWZsZWN0aXZlIGluZm9ybWF0aW9uLCBhbmQgdGhlIGZ1bmN0aW9uCi8vLyAgICAgdHlwZS4gVE9ETyhmbG9pdHNjaCk6IHBvaW50IHRvIHdoZXJlIHRoaXMgaXMgc3BlY2lmaWVkLgovLy8gICAqIGBpc1N0YXRpY2AuCi8vLyAgICogYG5hbWVgLgovLy8gICAqIGBpc0ludGVyY2VwdGVkLgpMaXN0PGpzQXN0LlN0YXRlbWVudD4gYnVpbGRUZWFyT2ZmQ29kZShDb21waWxlck9wdGlvbnMgb3B0aW9ucywgRW1pdHRlciBlbWl0dGVyLAogICAgTmFtZXIgbmFtZXIsIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSB7CiAgRnVuY3Rpb25FbnRpdHkgY2xvc3VyZUZyb21UZWFyT2ZmID0gY29tbW9uRWxlbWVudHMuY2xvc3VyZUZyb21UZWFyT2ZmOwogIGpzQXN0LkV4cHJlc3Npb24gdGVhck9mZkFjY2Vzc0V4cHJlc3Npb247CiAganNBc3QuRXhwcmVzc2lvbiB0ZWFyT2ZmR2xvYmFsT2JqZWN0U3RyaW5nOwogIGpzQXN0LkV4cHJlc3Npb24gdGVhck9mZkdsb2JhbE9iamVjdDsKICBpZiAoY2xvc3VyZUZyb21UZWFyT2ZmICE9IG51bGwpIHsKICAgIHRlYXJPZmZBY2Nlc3NFeHByZXNzaW9uID0gZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcyhjbG9zdXJlRnJvbVRlYXJPZmYpOwogICAgdGVhck9mZkdsb2JhbE9iamVjdCA9CiAgICAgICAganMuc3RyaW5nUGFydChuYW1lci5nbG9iYWxPYmplY3RGb3JNZW1iZXIoY2xvc3VyZUZyb21UZWFyT2ZmKSk7CiAgICB0ZWFyT2ZmR2xvYmFsT2JqZWN0U3RyaW5nID0KICAgICAgICBqcy5zdHJpbmcobmFtZXIuZ2xvYmFsT2JqZWN0Rm9yTWVtYmVyKGNsb3N1cmVGcm9tVGVhck9mZikpOwogIH0gZWxzZSB7CiAgICAvLyBEZWZhdWx0IHZhbHVlcyBmb3IgbW9ja2VkLXVwIHRlc3QgbGlicmFyaWVzLgogICAgdGVhck9mZkFjY2Vzc0V4cHJlc3Npb24gPQogICAgICAgIGpzKHInJydmdW5jdGlvbigpIHsgdGhyb3cgIkhlbHBlciAnY2xvc3VyZUZyb21UZWFyT2ZmJyBtaXNzaW5nLiIgfScnJyk7CiAgICB0ZWFyT2ZmR2xvYmFsT2JqZWN0U3RyaW5nID0ganMuc3RyaW5nKCdNaXNzaW5nSGVscGVyRnVuY3Rpb24nKTsKICAgIHRlYXJPZmZHbG9iYWxPYmplY3QgPSBqcygKICAgICAgICByJycnKGZ1bmN0aW9uKCkgeyB0aHJvdyAiSGVscGVyICdjbG9zdXJlRnJvbVRlYXJPZmYnIG1pc3NpbmcuIiB9KSgpJycnKTsKICB9CgogIGpzQXN0LlN0YXRlbWVudCB0ZWFyT2ZmR2V0dGVyOwogIGlmICghb3B0aW9ucy51c2VDb250ZW50U2VjdXJpdHlQb2xpY3kpIHsKICAgIGpzQXN0LkV4cHJlc3Npb24gdGVhck9mZkFjY2Vzc1RleHQgPSBuZXcganNBc3QuVW5wYXJzZWROb2RlKAogICAgICAgIHRlYXJPZmZBY2Nlc3NFeHByZXNzaW9uLCBvcHRpb25zLmVuYWJsZU1pbmlmaWNhdGlvbiwgZmFsc2UpOwogICAgdGVhck9mZkdldHRlciA9IGpzLnN0YXRlbWVudCgnJycKZnVuY3Rpb24gdGVhck9mZkdldHRlcihmdW5jcywgYXBwbHlUcmFtcG9saW5lSW5kZXgsIHJlZmxlY3Rpb25JbmZvLCBuYW1lLCBpc0ludGVyY2VwdGVkKSB7CiAgcmV0dXJuIGlzSW50ZXJjZXB0ZWQKICAgICAgPyBuZXcgRnVuY3Rpb24oImZ1bmNzIiwgImFwcGx5VHJhbXBvbGluZUluZGV4IiwgInJlZmxlY3Rpb25JbmZvIiwgIm5hbWUiLAogICAgICAgICAgICAgICAgICAgICAjdGVhck9mZkdsb2JhbE9iamVjdFN0cmluZywgImMiLAogICAgICAgICAgInJldHVybiBmdW5jdGlvbiB0ZWFyT2ZmXyIgKyBuYW1lICsgKGZ1bmN0aW9uQ291bnRlcisrKSArICIocmVjZWl2ZXIpIHsiICsKICAgICAgICAgICAgImlmIChjID09PSBudWxsKSBjID0gIiArICN0ZWFyT2ZmQWNjZXNzVGV4dCArICIoIiArCiAgICAgICAgICAgICAgICAidGhpcywgZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LCByZWZsZWN0aW9uSW5mbywgZmFsc2UsIHRydWUsIG5hbWUpOyIgKwogICAgICAgICAgICAgICAgInJldHVybiBuZXcgYyh0aGlzLCBmdW5jc1swXSwgcmVjZWl2ZXIsIG5hbWUpOyIgKwogICAgICAgICAgICJ9IikoZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LCByZWZsZWN0aW9uSW5mbywgbmFtZSwgI3RlYXJPZmZHbG9iYWxPYmplY3QsIG51bGwpCiAgICAgIDogbmV3IEZ1bmN0aW9uKCJmdW5jcyIsICJhcHBseVRyYW1wb2xpbmVJbmRleCIsICJyZWZsZWN0aW9uSW5mbyIsICJuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgI3RlYXJPZmZHbG9iYWxPYmplY3RTdHJpbmcsICJjIiwKICAgICAgICAgICJyZXR1cm4gZnVuY3Rpb24gdGVhck9mZl8iICsgbmFtZSArIChmdW5jdGlvbkNvdW50ZXIrKykrICIoKSB7IiArCiAgICAgICAgICAgICJpZiAoYyA9PT0gbnVsbCkgYyA9ICIgKyAjdGVhck9mZkFjY2Vzc1RleHQgKyAiKCIgKwogICAgICAgICAgICAgICAgInRoaXMsIGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIGZhbHNlLCBmYWxzZSwgbmFtZSk7IiArCiAgICAgICAgICAgICAgICAicmV0dXJuIG5ldyBjKHRoaXMsIGZ1bmNzWzBdLCBudWxsLCBuYW1lKTsiICsKICAgICAgICAgICAgICJ9IikoZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LCByZWZsZWN0aW9uSW5mbywgbmFtZSwgI3RlYXJPZmZHbG9iYWxPYmplY3QsIG51bGwpOwp9JycnLCB7CiAgICAgICd0ZWFyT2ZmQWNjZXNzVGV4dCc6IHRlYXJPZmZBY2Nlc3NUZXh0LAogICAgICAndGVhck9mZkdsb2JhbE9iamVjdCc6IHRlYXJPZmZHbG9iYWxPYmplY3QsCiAgICAgICd0ZWFyT2ZmR2xvYmFsT2JqZWN0U3RyaW5nJzogdGVhck9mZkdsb2JhbE9iamVjdFN0cmluZwogICAgfSk7CiAgfSBlbHNlIHsKICAgIHRlYXJPZmZHZXR0ZXIgPSBqcy5zdGF0ZW1lbnQoJycnCiAgICAgIGZ1bmN0aW9uIHRlYXJPZmZHZXR0ZXIoZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LCByZWZsZWN0aW9uSW5mbywgbmFtZSwgaXNJbnRlcmNlcHRlZCkgewogICAgICAgIHZhciBjYWNoZSA9IG51bGw7CiAgICAgICAgcmV0dXJuIGlzSW50ZXJjZXB0ZWQKICAgICAgICAgICAgPyBmdW5jdGlvbihyZWNlaXZlcikgewogICAgICAgICAgICAgICAgaWYgKGNhY2hlID09PSBudWxsKSBjYWNoZSA9ICMoCiAgICAgICAgICAgICAgICAgICAgdGhpcywgZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LCByZWZsZWN0aW9uSW5mbywgZmFsc2UsIHRydWUsIG5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBjYWNoZSh0aGlzLCBmdW5jc1swXSwgcmVjZWl2ZXIsIG5hbWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZSA9PT0gbnVsbCkgY2FjaGUgPSAjKAogICAgICAgICAgICAgICAgICAgIHRoaXMsIGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIGZhbHNlLCBmYWxzZSwgbmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGNhY2hlKHRoaXMsIGZ1bmNzWzBdLCBudWxsLCBuYW1lKTsKICAgICAgICAgICAgICB9OwogICAgICB9JycnLCBbdGVhck9mZkFjY2Vzc0V4cHJlc3Npb24sIHRlYXJPZmZBY2Nlc3NFeHByZXNzaW9uXSk7CiAgfQoKICBqc0FzdC5TdGF0ZW1lbnQgdGVhck9mZiA9IGpzLnN0YXRlbWVudCgnJycKICAgICAgZnVuY3Rpb24gdGVhck9mZihmdW5jcywgYXBwbHlUcmFtcG9saW5lSW5kZXgsCiAgICAgICAgICByZWZsZWN0aW9uSW5mbywgaXNTdGF0aWMsIG5hbWUsIGlzSW50ZXJjZXB0ZWQpIHsKICAgICAgdmFyIGNhY2hlID0gbnVsbDsKICAgICAgcmV0dXJuIGlzU3RhdGljCiAgICAgICAgICA/IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGlmIChjYWNoZSA9PT0gbnVsbCkgY2FjaGUgPSAjdGVhck9mZigKICAgICAgICAgICAgICAgICAgdGhpcywgZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LAogICAgICAgICAgICAgICAgICByZWZsZWN0aW9uSW5mbywgdHJ1ZSwgZmFsc2UsIG5hbWUpLnByb3RvdHlwZTsKICAgICAgICAgICAgICByZXR1cm4gY2FjaGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIDogdGVhck9mZkdldHRlcihmdW5jcywgYXBwbHlUcmFtcG9saW5lSW5kZXgsCiAgICAgICAgICAgICAgcmVmbGVjdGlvbkluZm8sIG5hbWUsIGlzSW50ZXJjZXB0ZWQpOwogICAgfScnJywgeyd0ZWFyT2ZmJzogdGVhck9mZkFjY2Vzc0V4cHJlc3Npb259KTsKCiAgcmV0dXJuIDxqc0FzdC5TdGF0ZW1lbnQ+W3RlYXJPZmZHZXR0ZXIsIHRlYXJPZmZdOwp9CoFaAE5OPAExATs2JCEgLC5DGjEyQioBIRUBGxYkIyEaKAFHLSIBSAEtTUoHSDcpHkQ4NBcvIDgGSzsvQTsINRIWGREnCAQBTy0WSBhKSgQBTy0WSBhKKA9MBAEsBjlASzdGTR5EATYBJSJCHUEjOgo0DyY9L0YRSzMKCAYBNyoBTU4OPDA7Nh5AKgFFSEoBQEEjRQoBOyE1KAoBQkYBMwgGARsEAT9CAUU9FgYBIkcyMiwvLzNLRhQKATtJTSYKCAYBP0FBFAQBTz0uIkNRAT0kLxMBUE0BS0xKOTszOD1HOTMgURRIMh8vPj5BCAEfGRVRDVAGKwQCAUUEPAQtT0wgPkcXTEAUEBhRMkksLigkUBpIIEQLNB5QRB5RBAEhK0FFJVsXUDZVQFtCX1A2TEBcPmIILjI9CAslYRodIy9bQhAbL1w+EUEEAS00OxgWGTQ1QBwONzQxATQCATlwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL2NsYXNzX3N0dWJfZ2VuZXJhdG9yLmRhcnRKc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfZW1pdHRlci9pbnN0YW50aWF0aW9uX3N0dWJfZ2VuZXJhdG9yLmRhcnSdUi8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMuanNfZW1pdHRlci5pbnN0YW50aWF0aW9uX3N0dWJfZ2VuZXJhdG9yOwoKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBKQ29tbW9uRWxlbWVudHMsIEpFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vaW8vc291cmNlX2luZm9ybWF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIHNob3cganM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYW1lci5kYXJ0JyBzaG93IE5hbWVyOwppbXBvcnQgJy4uL3VuaXZlcnNlL2NhbGxfc3RydWN0dXJlLmRhcnQnIHNob3cgQ2FsbFN0cnVjdHVyZTsKaW1wb3J0ICcuLi91bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICcuLi91bml2ZXJzZS93b3JsZF9idWlsZGVyLmRhcnQnIHNob3cgU2VsZWN0b3JDb25zdHJhaW50czsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKCmltcG9ydCAnbW9kZWwuZGFydCc7CgppbXBvcnQgJ2NvZGVfZW1pdHRlcl90YXNrLmRhcnQnIHNob3cgQ29kZUVtaXR0ZXJUYXNrLCBFbWl0dGVyOwoKLy8gR2VuZXJhdG9yIG9mIHN0dWJzIHJlcXVpcmVkIGZvciBJbnN0YW50aWF0aW9uIGNsYXNzZXMuCmNsYXNzIEluc3RhbnRpYXRpb25TdHViR2VuZXJhdG9yIHsKICBmaW5hbCBDb2RlRW1pdHRlclRhc2sgX2VtaXR0ZXJUYXNrOwogIGZpbmFsIE5hbWVyIF9uYW1lcjsKICBmaW5hbCBDb2RlZ2VuV29ybGQgX2NvZGVnZW5Xb3JsZDsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIC8vIGlnbm9yZTogVU5VU0VEX0ZJRUxECiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSBfc291cmNlSW5mb3JtYXRpb25TdHJhdGVneTsKCiAgSW5zdGFudGlhdGlvblN0dWJHZW5lcmF0b3IodGhpcy5fZW1pdHRlclRhc2ssIHRoaXMuX25hbWVyLCB0aGlzLl9jbG9zZWRXb3JsZCwKICAgICAgdGhpcy5fY29kZWdlbldvcmxkLCB0aGlzLl9zb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5KTsKCiAgRW1pdHRlciBnZXQgX2VtaXR0ZXIgPT4gX2VtaXR0ZXJUYXNrLmVtaXR0ZXI7CgogIEpDb21tb25FbGVtZW50cyBnZXQgX2NvbW1vbkVsZW1lbnRzID0+IF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50czsKICBKRWxlbWVudEVudmlyb25tZW50IGdldCBfZWxlbWVudEVudmlyb25tZW50ID0+CiAgICAgIF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQ7CgogIC8vLyBHZW5lcmF0ZXMgYSBzdHViIHRvIGZvcndhcmQgYSBjYWxsIHNlbGVjdG9yIHdpdGggbm8gdHlwZSBhcmd1bWVudHMgdG8gYQogIC8vLyBjYWxsIHNlbGVjdG9yIHdpdGggc3RvcmVkIHR5cGVzLgogIC8vLwogIC8vLyBbaW5zdGFudGlhdGlvbkNsYXNzXSBpcyB0aGUgY2xhc3MgY29udGFpbmluZyB0aGUgY2FwdHVyZWQgdHlwZSBhcmd1bWVudHMuCiAgLy8vIFtjYWxsU2VsZWN0b3JdIGlzIHRoZSBzZWxlY3RvciB3aXRoIG5vIHR5cGUgYXJndW1lbnRzLiBbdGFyZ2V0U2VsZWN0b3JdIGlzCiAgLy8vIHRoZSBzZWxlY3RvciBhY2NlcHRpbmcgdGhlIHR5cGUgYXJndW1lbnRzLgogIFBhcmFtZXRlclN0dWJNZXRob2QgX2dlbmVyYXRlU3R1YigKICAgICAgQ2xhc3NFbnRpdHkgaW5zdGFudGlhdGlvbkNsYXNzLAogICAgICBGaWVsZEVudGl0eSBmdW5jdGlvbkZpZWxkLAogICAgICBTZWxlY3RvciBjYWxsU2VsZWN0b3IsCiAgICAgIFNlbGVjdG9yIHRhcmdldFNlbGVjdG9yKSB7CiAgICAvLyBUT0RPKHNyYSk6IEdlbmVyYXRlIHNvdXJjZSBpbmZvcm1hdGlvbiBmb3Igc3R1YiB0aGF0IGhhcyBubyBtZW1iZXIuCiAgICAvLwogICAgLy9Tb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIgc291cmNlSW5mb3JtYXRpb25CdWlsZGVyID0KICAgIC8vICAgIF9zb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5LmNyZWF0ZUJ1aWxkZXJGb3JDb250ZXh0KG1lbWJlcik7CiAgICAvL1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uID0KICAgIC8vICAgIHNvdXJjZUluZm9ybWF0aW9uQnVpbGRlci5idWlsZFN0dWIobWVtYmVyLCBjYWxsU3RydWN0dXJlKTsKCiAgICBhc3NlcnQoY2FsbFNlbGVjdG9yLnR5cGVBcmd1bWVudENvdW50ID09IDApOwogICAgaW50IHR5cGVBcmd1bWVudENvdW50ID0gdGFyZ2V0U2VsZWN0b3IudHlwZUFyZ3VtZW50Q291bnQ7CiAgICBhc3NlcnQodHlwZUFyZ3VtZW50Q291bnQgPiAwKTsKCiAgICAvLyBUaGUgZm9yd2FyZGluZyBzdHViIGZvciB0aHJlZSBhcmd1bWVudHMgb2YgYW4gaW5zdGFudGlhdGlvbiB3aXRoIHR3byB0eXBlCiAgICAvLyBhcmd1bWVudHMgbG9va3MgbGlrZSB0aGlzOgogICAgLy8KICAgIC8vIGBgYAogICAgLy8gY2FsbCQzOiBmdW5jdGlvbihhMCwgYTEsIGEyKSB7CiAgICAvLyAgIHJldHVybiB0aGlzLl9mLmNhbGwkMiQzKGEwLCBhMSwgYTIsIHRoaXMuJHRpWzBdLCB0aGlzLiR0aVsxXSk7CiAgICAvLyB9CiAgICAvLyBgYGAKCiAgICBMaXN0PGpzQXN0LlBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IDxqc0FzdC5QYXJhbWV0ZXI+W107CiAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGFyZ3VtZW50cyA9IDxqc0FzdC5FeHByZXNzaW9uPltdOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbFNlbGVjdG9yLmFyZ3VtZW50Q291bnQ7IGkrKykgewogICAgICBTdHJpbmcganNOYW1lID0gJ2EkaSc7CiAgICAgIGFyZ3VtZW50cy5hZGQoanMoJyMnLCBqc05hbWUpKTsKICAgICAgcGFyYW1ldGVycy5hZGQobmV3IGpzQXN0LlBhcmFtZXRlcihqc05hbWUpKTsKICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldFNlbGVjdG9yLnR5cGVBcmd1bWVudENvdW50OyBpKyspIHsKICAgICAgYXJndW1lbnRzLmFkZChqcygndGhpcy4jWyNdJywgW19uYW1lci5ydGlGaWVsZEpzTmFtZSwganMubnVtYmVyKGkpXSkpOwogICAgfQoKICAgIGpzQXN0LkZ1biBmdW5jdGlvbiA9IGpzKCdmdW5jdGlvbigjKSB7IHJldHVybiB0aGlzLiMuIygjKTsgfScsIFsKICAgICAgcGFyYW1ldGVycywKICAgICAgX25hbWVyLmZpZWxkUHJvcGVydHlOYW1lKGZ1bmN0aW9uRmllbGQpLAogICAgICBfbmFtZXIuaW52b2NhdGlvbk5hbWUodGFyZ2V0U2VsZWN0b3IpLAogICAgICBhcmd1bWVudHMsCiAgICBdKTsKICAgIC8vIFRPRE8oc3JhKTogLndpdGhTb3VyY2VJbmZvcm1hdGlvbihzb3VyY2VJbmZvcm1hdGlvbik7CgogICAganNBc3QuTmFtZSBuYW1lID0gX25hbWVyLmludm9jYXRpb25OYW1lKGNhbGxTZWxlY3Rvcik7CiAgICByZXR1cm4gbmV3IFBhcmFtZXRlclN0dWJNZXRob2QobmFtZSwgbnVsbCwgZnVuY3Rpb24pOwogIH0KCiAgLy8vIEdlbmVyYXRlcyBhIHN0dWIgZm9yIGEgJ3NpZ25hdHVyZScgc2VsZWN0b3IuIFRoZSBzdHViIGNhbGxzIHRoZSB1bmRlcmx5aW5nCiAgLy8vIGZ1bmN0aW9uJ3MgJ3NpZ25hdHVyZScgbWV0aG9kIGFuZCBjYWxscyBhIGhlbHBlciB0byBzdWJzaXR1dGUgdGhlIHR5cGUKICAvLy8gcGFyYW1ldGVycyBpbiB0aGUgdHlwZSB0ZXJtLiBUaGUgc3R1YiBsb29rcyBsaWtlIHRoaXM6CiAgLy8vCiAgLy8vIGBgYAogIC8vLyAkc2lnbmF0dXJlOjogZnVuY3Rpb24oKSB7CiAgLy8vICAgcmV0dXJuIEguaW5zdGFudGlhdGVkR2VuZXJpY0Z1bmN0aW9uVHlwZSgKICAvLy8gICAgICAgSC5leHRyYWN0RnVuY3Rpb25UeXBlT2JqZWN0RnJvbUludGVybmFsKHRoaXMuX2dlbmVyaWNDbG9zdXJlKSwKICAvLy8gICAgICAgdGhpcy4kdGkpOwogIC8vLyB9CiAgLy8vIGBgYAogIFBhcmFtZXRlclN0dWJNZXRob2QgX2dlbmVyYXRlU2lnbmF0dXJlU3R1YihGaWVsZEVudGl0eSBmdW5jdGlvbkZpZWxkKSB7CiAgICBqc0FzdC5OYW1lIG9wZXJhdG9yU2lnbmF0dXJlID0KICAgICAgICBfbmFtZXIuYXNOYW1lKF9uYW1lci5maXhlZE5hbWVzLm9wZXJhdG9yU2lnbmF0dXJlKTsKCiAgICBqc0FzdC5GdW4gZnVuY3Rpb24gPSBqcygnZnVuY3Rpb24oKSB7IHJldHVybiAjKCModGhpcy4jKSwgdGhpcy4jKTsgfScsIFsKICAgICAgX2VtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MoCiAgICAgICAgICBfY29tbW9uRWxlbWVudHMuaW5zdGFudGlhdGVkR2VuZXJpY0Z1bmN0aW9uVHlwZSksCiAgICAgIF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKAogICAgICAgICAgX2NvbW1vbkVsZW1lbnRzLmV4dHJhY3RGdW5jdGlvblR5cGVPYmplY3RGcm9tSW50ZXJuYWwpLAogICAgICBfbmFtZXIuZmllbGRQcm9wZXJ0eU5hbWUoZnVuY3Rpb25GaWVsZCksCiAgICAgIF9uYW1lci5ydGlGaWVsZEpzTmFtZSwKICAgIF0pOwogICAgLy8gVE9ETyhzcmEpOiBHZW5lcmF0ZSBzb3VyY2UgaW5mb3JtYXRpb24gZm9yIHN0dWIgdGhhdCBoYXMgbm8gbWVtYmVyLgogICAgLy8gVE9ETyhzcmEpOiAud2l0aFNvdXJjZUluZm9ybWF0aW9uKHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgICByZXR1cm4gbmV3IFBhcmFtZXRlclN0dWJNZXRob2Qob3BlcmF0b3JTaWduYXR1cmUsIG51bGwsIGZ1bmN0aW9uKTsKICB9CgogIC8vIFJldHVybnMgYWxsIHN0dWJzIGZvciBhbiBpbnN0YW50aWF0aW9uIGNsYXNzLgogIC8vCiAgTGlzdDxTdHViTWV0aG9kPiBnZW5lcmF0ZVN0dWJzKAogICAgICBDbGFzc0VudGl0eSBpbnN0YW50aWF0aW9uQ2xhc3MsIEZ1bmN0aW9uRW50aXR5IG1lbWJlcikgewogICAgLy8gMS4gRmluZCB0aGUgbnVtYmVyIG9mIHR5cGUgcGFyYW1ldGVycyBpbiBbaW5zdGFudGlhdGlvbkNsYXNzXS4KICAgIGludCB0eXBlQXJndW1lbnRDb3VudCA9IF9jbG9zZWRXb3JsZC5kYXJ0VHlwZXMKICAgICAgICAuZ2V0VGhpc1R5cGUoaW5zdGFudGlhdGlvbkNsYXNzKQogICAgICAgIC50eXBlQXJndW1lbnRzCiAgICAgICAgLmxlbmd0aDsKICAgIGFzc2VydCh0eXBlQXJndW1lbnRDb3VudCA+IDApOwoKICAgIC8vIDIuIEZpbmQgdGhlIGZ1bmN0aW9uIGZpZWxkIGFjY2VzcyBwYXRoLgogICAgRmllbGRFbnRpdHkgZnVuY3Rpb25GaWVsZDsKICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaEluc3RhbmNlRmllbGQoaW5zdGFudGlhdGlvbkNsYXNzLAogICAgICAgIChDbGFzc0VudGl0eSBlbmNsb3NpbmcsIEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICAgIGlmIChfY2xvc2VkV29ybGQuZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEoZmllbGQpLmlzRWxpZGVkKSByZXR1cm47CiAgICAgIGlmIChmaWVsZC5uYW1lID09ICdfZ2VuZXJpY0Nsb3N1cmUnKSBmdW5jdGlvbkZpZWxkID0gZmllbGQ7CiAgICB9KTsKICAgIGFzc2VydChmdW5jdGlvbkZpZWxkICE9IG51bGwsCiAgICAgICAgIkNhbid0IGZpbmQgQ2xvc3VyZSBmaWVsZCBvZiAkaW5zdGFudGlhdGlvbkNsYXNzIik7CgogICAgU3RyaW5nIGNhbGwgPSBfbmFtZXIuY2xvc3VyZUludm9jYXRpb25TZWxlY3Rvck5hbWU7CiAgICBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IGNhbGxTZWxlY3RvcnMgPQogICAgICAgIF9jb2RlZ2VuV29ybGQuaW52b2NhdGlvbnNCeU5hbWUoY2FsbCk7CgogICAgU2V0PFBhcmFtZXRlclN0cnVjdHVyZT4gY29tcHV0ZUxpdmVQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkgewogICAgICBTZXQ8UGFyYW1ldGVyU3RydWN0dXJlPiBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0KICAgICAgICAgIG5ldyBTZXQ8UGFyYW1ldGVyU3RydWN0dXJlPigpOwoKICAgICAgdm9pZCBwcm9jZXNzKEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uKSB7CiAgICAgICAgaWYgKGZ1bmN0aW9uLnBhcmFtZXRlclN0cnVjdHVyZS50eXBlUGFyYW1ldGVycyA9PSB0eXBlQXJndW1lbnRDb3VudCkgewogICAgICAgICAgcGFyYW1ldGVyU3RydWN0dXJlcy5hZGQoZnVuY3Rpb24ucGFyYW1ldGVyU3RydWN0dXJlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9jb2RlZ2VuV29ybGQuY2xvc3VyaXplZFN0YXRpY3MuZm9yRWFjaChwcm9jZXNzKTsKICAgICAgX2NvZGVnZW5Xb3JsZC5jbG9zdXJpemVkTWVtYmVycy5mb3JFYWNoKHByb2Nlc3MpOwogICAgICBfY29kZWdlbldvcmxkLmZvckVhY2hHZW5lcmljQ2xvc3VyZUNhbGxNZXRob2QocHJvY2Vzcyk7CgogICAgICByZXR1cm4gcGFyYW1ldGVyU3RydWN0dXJlczsKICAgIH0KCiAgICBMaXN0PFN0dWJNZXRob2Q+IHN0dWJzID0gPFN0dWJNZXRob2Q+W107CgogICAgLy8gRm9yIGV2ZXJ5IGNhbGwtc2VsZWN0b3IgZ2VuZXJhdGUgYSBzdHViIHRvIHRoZSBjb3JyZXNwb25kaW5nIHNlbGVjdG9yCiAgICAvLyB3aXRoIGZpbGxlZC1pbiB0eXBlIGFyZ3VtZW50cy4KCiAgICBpZiAoY2FsbFNlbGVjdG9ycyAhPSBudWxsKSB7CiAgICAgIFNldDxQYXJhbWV0ZXJTdHJ1Y3R1cmU+IHBhcmFtZXRlclN0cnVjdHVyZXM7CiAgICAgIGZvciAoU2VsZWN0b3Igc2VsZWN0b3IgaW4gY2FsbFNlbGVjdG9ycy5rZXlzKSB7CiAgICAgICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gc2VsZWN0b3IuY2FsbFN0cnVjdHVyZTsKICAgICAgICBpZiAoY2FsbFN0cnVjdHVyZS50eXBlQXJndW1lbnRDb3VudCAhPSAwKSBjb250aW51ZTsKICAgICAgICBDYWxsU3RydWN0dXJlIGdlbmVyaWNDYWxsU3RydWN0dXJlID0KICAgICAgICAgICAgY2FsbFN0cnVjdHVyZS53aXRoVHlwZUFyZ3VtZW50Q291bnQodHlwZUFyZ3VtZW50Q291bnQpOwogICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPz89IGNvbXB1dGVMaXZlUGFyYW1ldGVyU3RydWN0dXJlcygpOwogICAgICAgIGZvciAoUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSBpbiBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKSB7CiAgICAgICAgICBpZiAoZ2VuZXJpY0NhbGxTdHJ1Y3R1cmUuc2lnbmF0dXJlQXBwbGllcyhwYXJhbWV0ZXJTdHJ1Y3R1cmUpKSB7CiAgICAgICAgICAgIFNlbGVjdG9yIGdlbmVyaWNTZWxlY3RvciA9CiAgICAgICAgICAgICAgICBuZXcgU2VsZWN0b3IuY2FsbChzZWxlY3Rvci5tZW1iZXJOYW1lLCBnZW5lcmljQ2FsbFN0cnVjdHVyZSk7CiAgICAgICAgICAgIHN0dWJzLmFkZChfZ2VuZXJhdGVTdHViKAogICAgICAgICAgICAgICAgaW5zdGFudGlhdGlvbkNsYXNzLCBmdW5jdGlvbkZpZWxkLCBzZWxlY3RvciwgZ2VuZXJpY1NlbGVjdG9yKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHN0dWJzLmFkZChfZ2VuZXJhdGVTaWduYXR1cmVTdHViKGZ1bmN0aW9uRmllbGQpKTsKCiAgICByZXR1cm4gc3R1YnM7CiAgfQp9CoDHAE5OPAE5AUwkKCEgLj0xMkIqARUBPwE6IyYWJCMaPgFQPAEwAUYxJwFOJwZQUTElJiEdIUsHOkYsRQExPiMBUSIHCyZICQsBPD0BOx0mMwYBQU0GAUUSLy0RCD0BOzoEAVFNPQYKIDJLFwgKSiM8AU0lPCVCLx0ISz0BRwQBMwUiP0YzKRcRIwEvH0E1S0IIIjwBODcvAT80KQEuT0AKCAE4OD4BIgYBLQFNJgEhMzY+PC1EQk1LJ04lUBMMCggGATYBEgQCAUFwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL2luc3RhbnRpYXRpb25fc3R1Yl9nZW5lcmF0b3IuZGFydEhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19lbWl0dGVyL2ludGVyY2VwdG9yX3N0dWJfZ2VuZXJhdG9yLmRhcnTAAEMALy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19lbWl0dGVyLmludGVyY2VwdG9yX3N0dWJfZ2VuZXJhdG9yOwoKaW1wb3J0ICdwYWNrYWdlOmpzX3J1bnRpbWUvc2hhcmVkL2VtYmVkZGVkX25hbWVzLmRhcnQnIGFzIGVtYmVkZGVkTmFtZXM7CgppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnIHNob3cgSW50ZXJmYWNlVHlwZTsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqc0FzdDsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBzaG93IGpzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmFtZXIuZGFydCcgc2hvdyBOYW1lcjsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2N1c3RvbV9lbGVtZW50c19hbmFseXNpcy5kYXJ0JwogICAgc2hvdyBDdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hdGl2ZV9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvaW50ZXJjZXB0b3JfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9uYXRpdmUvZW5xdWV1ZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKCmltcG9ydCAnY29kZV9lbWl0dGVyX3Rhc2suZGFydCcgc2hvdyBFbWl0dGVyOwoKY2xhc3MgSW50ZXJjZXB0b3JTdHViR2VuZXJhdG9yIHsKICBmaW5hbCBDb21tb25FbGVtZW50cyBfY29tbW9uRWxlbWVudHM7CiAgZmluYWwgRW1pdHRlciBfZW1pdHRlcjsKICBmaW5hbCBOYXRpdmVDb2RlZ2VuRW5xdWV1ZXIgX25hdGl2ZUNvZGVnZW5FbnF1ZXVlcjsKICBmaW5hbCBOYW1lciBfbmFtZXI7CiAgZmluYWwgQ3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXMgX2N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzOwogIGZpbmFsIENvZGVnZW5Xb3JsZCBfY29kZWdlbldvcmxkOwogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CgogIEludGVyY2VwdG9yU3R1YkdlbmVyYXRvcigKICAgICAgdGhpcy5fY29tbW9uRWxlbWVudHMsCiAgICAgIHRoaXMuX2VtaXR0ZXIsCiAgICAgIHRoaXMuX25hdGl2ZUNvZGVnZW5FbnF1ZXVlciwKICAgICAgdGhpcy5fbmFtZXIsCiAgICAgIHRoaXMuX2N1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzLAogICAgICB0aGlzLl9jb2RlZ2VuV29ybGQsCiAgICAgIHRoaXMuX2Nsb3NlZFdvcmxkKTsKCiAgTmF0aXZlRGF0YSBnZXQgX25hdGl2ZURhdGEgPT4gX2Nsb3NlZFdvcmxkLm5hdGl2ZURhdGE7CgogIEludGVyY2VwdG9yRGF0YSBnZXQgX2ludGVyY2VwdG9yRGF0YSA9PiBfY2xvc2VkV29ybGQuaW50ZXJjZXB0b3JEYXRhOwoKICBqc0FzdC5FeHByZXNzaW9uIGdlbmVyYXRlR2V0SW50ZXJjZXB0b3JNZXRob2QoCiAgICAgIFNwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3IgaW50ZXJjZXB0b3IpIHsKICAgIFNldDxDbGFzc0VudGl0eT4gY2xhc3NlcyA9IGludGVyY2VwdG9yLmNsYXNzZXM7CgogICAganNBc3QuRXhwcmVzc2lvbiBpbnRlcmNlcHRvckZvcihDbGFzc0VudGl0eSBjbHMpIHsKICAgICAgcmV0dXJuIF9lbWl0dGVyLmludGVyY2VwdG9yUHJvdG90eXBlQWNjZXNzKGNscyk7CiAgICB9CgogICAgLy8vIEJ1aWxkIGEgSmF2YVNjcmlwdCBBU1Qgbm9kZSBmb3IgZG9pbmcgYSB0eXBlIGNoZWNrIG9uCiAgICAvLy8gW2Nsc10uIFtjbHNdIG11c3QgYmUgYSBub24tbmF0aXZlIGludGVyY2VwdG9yIGNsYXNzLgogICAganNBc3QuU3RhdGVtZW50IGJ1aWxkSW50ZXJjZXB0b3JDaGVjayhDbGFzc0VudGl0eSBjbHMpIHsKICAgICAganNBc3QuRXhwcmVzc2lvbiBjb25kaXRpb247CiAgICAgIGFzc2VydChfaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRDbGFzcyhjbHMpKTsKICAgICAgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNCb29sQ2xhc3MpIHsKICAgICAgICBjb25kaXRpb24gPSBqcygnKHR5cGVvZiByZWNlaXZlcikgPT0gImJvb2xlYW4iJyk7CiAgICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc0ludENsYXNzIHx8CiAgICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3MgfHwKICAgICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNOdW1iZXJDbGFzcykgewogICAgICAgIHRocm93ICdpbnRlcm5hbCBlcnJvcic7CiAgICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MgfHwKICAgICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNNdXRhYmxlQXJyYXlDbGFzcyB8fAogICAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc0ZpeGVkQXJyYXlDbGFzcyB8fAogICAgICAgICAgY2xzID09IF9jb21tb25FbGVtZW50cy5qc0V4dGVuZGFibGVBcnJheUNsYXNzKSB7CiAgICAgICAgY29uZGl0aW9uID0ganMoJ3JlY2VpdmVyLmNvbnN0cnVjdG9yID09IEFycmF5Jyk7CiAgICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzKSB7CiAgICAgICAgY29uZGl0aW9uID0ganMoJyh0eXBlb2YgcmVjZWl2ZXIpID09ICJzdHJpbmciJyk7CiAgICAgIH0gZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc051bGxDbGFzcykgewogICAgICAgIGNvbmRpdGlvbiA9IGpzKCdyZWNlaXZlciA9PSBudWxsJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgJ2ludGVybmFsIGVycm9yJzsKICAgICAgfQogICAgICByZXR1cm4ganMuc3RhdGVtZW50KCdpZiAoIykgcmV0dXJuICMnLCBbY29uZGl0aW9uLCBpbnRlcmNlcHRvckZvcihjbHMpXSk7CiAgICB9CgogICAgYm9vbCBoYXNBcnJheSA9IGZhbHNlOwogICAgYm9vbCBoYXNCb29sID0gZmFsc2U7CiAgICBib29sIGhhc0RvdWJsZSA9IGZhbHNlOwogICAgYm9vbCBoYXNJbnQgPSBmYWxzZTsKICAgIGJvb2wgaGFzTnVsbCA9IGZhbHNlOwogICAgYm9vbCBoYXNOdW1iZXIgPSBmYWxzZTsKICAgIGJvb2wgaGFzU3RyaW5nID0gZmFsc2U7CiAgICBib29sIGhhc05hdGl2ZSA9IGZhbHNlOwogICAgYm9vbCBhbnlOYXRpdmVDbGFzc2VzID0gX25hdGl2ZUNvZGVnZW5FbnF1ZXVlci5oYXNJbnN0YW50aWF0ZWROYXRpdmVDbGFzc2VzOwoKICAgIGZvciAoQ2xhc3NFbnRpdHkgY2xzIGluIGNsYXNzZXMpIHsKICAgICAgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzIHx8CiAgICAgICAgICBjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzTXV0YWJsZUFycmF5Q2xhc3MgfHwKICAgICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNGaXhlZEFycmF5Q2xhc3MgfHwKICAgICAgICAgIGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNFeHRlbmRhYmxlQXJyYXlDbGFzcykKICAgICAgICBoYXNBcnJheSA9IHRydWU7CiAgICAgIGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNCb29sQ2xhc3MpCiAgICAgICAgaGFzQm9vbCA9IHRydWU7CiAgICAgIGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzcykKICAgICAgICBoYXNEb3VibGUgPSB0cnVlOwogICAgICBlbHNlIGlmIChjbHMgPT0gX2NvbW1vbkVsZW1lbnRzLmpzSW50Q2xhc3MpCiAgICAgICAgaGFzSW50ID0gdHJ1ZTsKICAgICAgZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc051bGxDbGFzcykKICAgICAgICBoYXNOdWxsID0gdHJ1ZTsKICAgICAgZWxzZSBpZiAoY2xzID09IF9jb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzKQogICAgICAgIGhhc051bWJlciA9IHRydWU7CiAgICAgIGVsc2UgaWYgKGNscyA9PSBfY29tbW9uRWxlbWVudHMuanNTdHJpbmdDbGFzcykKICAgICAgICBoYXNTdHJpbmcgPSB0cnVlOwogICAgICBlbHNlIHsKICAgICAgICAvLyBUaGUgc2V0IG9mIGNsYXNzZXMgaW5jbHVkZXMgY2xhc3NlcyBtaXhlZC1pbiB0byBpbnRlcmNlcHRvciBjbGFzc2VzCiAgICAgICAgLy8gYW5kIHVzZXIgZXh0ZW5zaW9ucyBvZiBuYXRpdmUgY2xhc3Nlcy4KICAgICAgICAvLwogICAgICAgIC8vIFRoZSBzZXQgb2YgY2xhc3NlcyBhbHNvIGluY2x1ZGVzIHRoZSAncHJpbWl0aXZlJyBpbnRlcmNlcHRvcgogICAgICAgIC8vIFBsYWluSmF2YVNjcmlwdE9iamVjdCBldmVuIHdoZW4gaXQgaGFzIG5vdCBiZWVuIHJlc29sdmVkLCBzaW5jZSBpdCBpcwogICAgICAgIC8vIG9ubHkgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgcmVmZXJlbmNlIGluIGdldE5hdGl2ZUludGVyY2VwdG9yIHdoZW4KICAgICAgICAvLyBnZXROYXRpdmVJbnRlcmNlcHRvciBpcyBtYXJrZWQgYXMgdXNlZC4gIEd1YXJkIGFnYWluc3QgcHJvYmluZwogICAgICAgIC8vIHVucmVzb2x2ZWQgUGxhaW5KYXZhU2NyaXB0T2JqZWN0IGJ5IHRlc3RpbmcgZm9yIGFueU5hdGl2ZUNsYXNzZXMuCgogICAgICAgIGlmIChhbnlOYXRpdmVDbGFzc2VzKSB7CiAgICAgICAgICBpZiAoX25hdGl2ZURhdGEuaXNOYXRpdmVPckV4dGVuZHNOYXRpdmUoY2xzKSkgaGFzTmF0aXZlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChoYXNEb3VibGUpIHsKICAgICAgaGFzTnVtYmVyID0gdHJ1ZTsKICAgIH0KICAgIGlmIChoYXNJbnQpIGhhc051bWJlciA9IHRydWU7CgogICAgaWYgKGNsYXNzZXMuY29udGFpbnNBbGwoX2ludGVyY2VwdG9yRGF0YS5pbnRlcmNlcHRlZENsYXNzZXMpKSB7CiAgICAgIC8vIEkuZS4gdGhpcyBpcyB0aGUgZ2VuZXJhbCBpbnRlcmNlcHRvci4KICAgICAgaGFzTmF0aXZlID0gYW55TmF0aXZlQ2xhc3NlczsKICAgIH0KCiAgICBMaXN0PGpzQXN0LlN0YXRlbWVudD4gc3RhdGVtZW50cyA9IDxqc0FzdC5TdGF0ZW1lbnQ+W107CgogICAgaWYgKGhhc051bWJlcikgewogICAgICBqc0FzdC5TdGF0ZW1lbnQgd2hlbk51bWJlcjsKCiAgICAgIC8vLyBOb3RlOiB0aGVyZSBhcmUgdHdvIG51bWJlciBjbGFzc2VzIGluIHBsYXk6IERhcnQncyBbbnVtXSwKICAgICAgLy8vIGFuZCBKYXZhU2NyaXB0J3MgTnVtYmVyICh0eXBlb2YgcmVjZWl2ZXIgPT0gJ251bWJlcicpLiAgVGhpcwogICAgICAvLy8gaXMgdGhlIGZhbGxiYWNrIHVzZWQgd2hlbiB3ZSBoYXZlIGRldGVybWluZWQgdGhhdCByZWNlaXZlcgogICAgICAvLy8gaXMgYSBKYXZhU2NyaXB0IE51bWJlci4KICAgICAganNBc3QuRXhwcmVzc2lvbiBpbnRlcmNlcHRvckZvck51bWJlciA9IGludGVyY2VwdG9yRm9yKGhhc0RvdWJsZQogICAgICAgICAgPyBfY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzcwogICAgICAgICAgOiBfY29tbW9uRWxlbWVudHMuanNOdW1iZXJDbGFzcyk7CgogICAgICBpZiAoaGFzSW50KSB7CiAgICAgICAgd2hlbk51bWJlciA9IGpzLnN0YXRlbWVudCgnJyd7CiAgICAgICAgICAgIGlmIChNYXRoLmZsb29yKHJlY2VpdmVyKSA9PSByZWNlaXZlcikgcmV0dXJuICM7CiAgICAgICAgICAgIHJldHVybiAjOwogICAgICAgIH0nJycsCiAgICAgICAgICAgIFtpbnRlcmNlcHRvckZvcihfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcyksIGludGVyY2VwdG9yRm9yTnVtYmVyXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2hlbk51bWJlciA9IGpzLnN0YXRlbWVudCgncmV0dXJuICMnLCBpbnRlcmNlcHRvckZvck51bWJlcik7CiAgICAgIH0KICAgICAgc3RhdGVtZW50cwogICAgICAgICAgLmFkZChqcy5zdGF0ZW1lbnQoJ2lmICh0eXBlb2YgcmVjZWl2ZXIgPT0gIm51bWJlciIpICM7Jywgd2hlbk51bWJlcikpOwogICAgfQoKICAgIGlmIChoYXNTdHJpbmcpIHsKICAgICAgc3RhdGVtZW50cy5hZGQoYnVpbGRJbnRlcmNlcHRvckNoZWNrKF9jb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzKSk7CiAgICB9CiAgICBpZiAoaGFzTnVsbCkgewogICAgICBzdGF0ZW1lbnRzLmFkZChidWlsZEludGVyY2VwdG9yQ2hlY2soX2NvbW1vbkVsZW1lbnRzLmpzTnVsbENsYXNzKSk7CiAgICB9IGVsc2UgewogICAgICAvLyBSZXR1cm5pbmcgInVuZGVmaW5lZCIgb3IgIm51bGwiIGhlcmUgd2lsbCBwcm92b2tlIGEgSmF2YVNjcmlwdAogICAgICAvLyBUeXBlRXJyb3Igd2hpY2ggaXMgbGF0ZXIgaWRlbnRpZmllZCBhcyBhIG51bGwtZXJyb3IgYnkKICAgICAgLy8gW3Vud3JhcEV4Y2VwdGlvbl0gaW4ganNfaGVscGVyLmRhcnQuCiAgICAgIHN0YXRlbWVudHMuYWRkKGpzLnN0YXRlbWVudCgnaWYgKHJlY2VpdmVyID09IG51bGwpIHJldHVybiByZWNlaXZlcicpKTsKICAgIH0KICAgIGlmIChoYXNCb29sKSB7CiAgICAgIHN0YXRlbWVudHMuYWRkKGJ1aWxkSW50ZXJjZXB0b3JDaGVjayhfY29tbW9uRWxlbWVudHMuanNCb29sQ2xhc3MpKTsKICAgIH0KICAgIC8vIFRPRE8oYWhlKTogSXQgbWlnaHQgYmUgZmFzdGVyIHRvIGNoZWNrIGZvciBBcnJheSBiZWZvcmUKICAgIC8vIGZ1bmN0aW9uIGFuZCBib29sLgogICAgaWYgKGhhc0FycmF5KSB7CiAgICAgIHN0YXRlbWVudHMuYWRkKGJ1aWxkSW50ZXJjZXB0b3JDaGVjayhfY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzKSk7CiAgICB9CgogICAgaWYgKGhhc05hdGl2ZSkgewogICAgICBzdGF0ZW1lbnRzLmFkZChqcy5zdGF0ZW1lbnQocicnJ3sKICAgICAgICAgIGlmICh0eXBlb2YgcmVjZWl2ZXIgIT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlY2VpdmVyID09ICJmdW5jdGlvbiIgKSByZXR1cm4gIzsKICAgICAgICAgICAgICByZXR1cm4gcmVjZWl2ZXI7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiAjKSByZXR1cm4gcmVjZWl2ZXI7CiAgICAgICAgICByZXR1cm4gIyhyZWNlaXZlcik7CiAgICAgIH0nJycsIFsKICAgICAgICBpbnRlcmNlcHRvckZvcihfY29tbW9uRWxlbWVudHMuanNKYXZhU2NyaXB0RnVuY3Rpb25DbGFzcyksCiAgICAgICAgX2VtaXR0ZXIuY29uc3RydWN0b3JBY2Nlc3MoX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSwKICAgICAgICBfZW1pdHRlcgogICAgICAgICAgICAuc3RhdGljRnVuY3Rpb25BY2Nlc3MoX2NvbW1vbkVsZW1lbnRzLmdldE5hdGl2ZUludGVyY2VwdG9yTWV0aG9kKQogICAgICBdKSk7CiAgICB9IGVsc2UgewogICAgICBDbGFzc0VudGl0eSBqc1Vua25vd24gPSBfY29tbW9uRWxlbWVudHMuanNVbmtub3duSmF2YVNjcmlwdE9iamVjdENsYXNzOwogICAgICBpZiAoX2NvZGVnZW5Xb3JsZC5kaXJlY3RseUluc3RhbnRpYXRlZENsYXNzZXMuY29udGFpbnMoanNVbmtub3duKSkgewogICAgICAgIHN0YXRlbWVudHMuYWRkKGpzLnN0YXRlbWVudCgnaWYgKCEocmVjZWl2ZXIgaW5zdGFuY2VvZiAjKSkgcmV0dXJuICM7JywgWwogICAgICAgICAgX2VtaXR0ZXIuY29uc3RydWN0b3JBY2Nlc3MoX2NvbW1vbkVsZW1lbnRzLm9iamVjdENsYXNzKSwKICAgICAgICAgIGludGVyY2VwdG9yRm9yKGpzVW5rbm93bikKICAgICAgICBdKSk7CiAgICAgIH0KCiAgICAgIHN0YXRlbWVudHMuYWRkKGpzLnN0YXRlbWVudCgncmV0dXJuIHJlY2VpdmVyJykpOwogICAgfQoKICAgIHJldHVybiBqcygnJydmdW5jdGlvbihyZWNlaXZlcikgeyAjOyB9JycnLCBuZXcganNBc3QuQmxvY2soc3RhdGVtZW50cykpOwogIH0KCiAganNBc3QuQ2FsbCBfZ2VuZXJhdGVJc0pzSW5kZXhhYmxlQ2FsbCgKICAgICAganNBc3QuRXhwcmVzc2lvbiB1c2UxLCBqc0FzdC5FeHByZXNzaW9uIHVzZTIpIHsKICAgIFN0cmluZyBkaXNwYXRjaFByb3BlcnR5TmFtZSA9IGVtYmVkZGVkTmFtZXMuRElTUEFUQ0hfUFJPUEVSVFlfTkFNRTsKICAgIGpzQXN0LkV4cHJlc3Npb24gZGlzcGF0Y2hQcm9wZXJ0eSA9CiAgICAgICAgX2VtaXR0ZXIuZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhkaXNwYXRjaFByb3BlcnR5TmFtZSk7CgogICAgLy8gV2UgcGFzcyB0aGUgZGlzcGF0Y2ggcHJvcGVydHkgcmVjb3JkIHRvIHRoZSBpc0pzSW5kZXhhYmxlCiAgICAvLyBoZWxwZXIgcmF0aGVyIHRoYW4gcmVhZGluZyBpdCBpbnNpZGUgdGhlIGhlbHBlciB0byBpbmNyZWFzZSB0aGUKICAgIC8vIGNoYW5jZSBvZiBtYWtpbmcgdGhlIGRpc3BhdGNoIHJlY29yZCBhY2Nlc3MgbW9ub21vcnBoaWMuCiAgICBqc0FzdC5Qcm9wZXJ0eUFjY2VzcyByZWNvcmQgPQogICAgICAgIG5ldyBqc0FzdC5Qcm9wZXJ0eUFjY2Vzcyh1c2UyLCBkaXNwYXRjaFByb3BlcnR5KTsKCiAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGFyZ3VtZW50cyA9IDxqc0FzdC5FeHByZXNzaW9uPlt1c2UxLCByZWNvcmRdOwogICAgRnVuY3Rpb25FbnRpdHkgaGVscGVyID0gX2NvbW1vbkVsZW1lbnRzLmlzSnNJbmRleGFibGU7CiAgICBqc0FzdC5FeHByZXNzaW9uIGhlbHBlckV4cHJlc3Npb24gPSBfZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcyhoZWxwZXIpOwogICAgcmV0dXJuIG5ldyBqc0FzdC5DYWxsKGhlbHBlckV4cHJlc3Npb24sIGFyZ3VtZW50cyk7CiAgfQoKICAvLyBSZXR1cm5zIGEgc3RhdGVtZW50IHRoYXQgdGFrZXMgY2FyZSBvZiBwZXJmb3JtYW5jZSBjcml0aWNhbAogIC8vIGNvbW1vbiBjYXNlIGZvciBhIG9uZS1zaG90IGludGVyY2VwdG9yLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vCiAgLy8gZmFzdCBwYXRoLgogIGpzQXN0LlN0YXRlbWVudCBfZmFzdFBhdGhGb3JPbmVTaG90SW50ZXJjZXB0b3IoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBTZXQ8Q2xhc3NFbnRpdHk+IGNsYXNzZXMpIHsKICAgIGlmIChzZWxlY3Rvci5pc09wZXJhdG9yKSB7CiAgICAgIFN0cmluZyBuYW1lID0gc2VsZWN0b3IubmFtZTsKICAgICAgaWYgKG5hbWUgPT0gJz09JykgewogICAgICAgIHJldHVybiBqcy5zdGF0ZW1lbnQoJycnewogICAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHJldHVybiBhMCA9PSBudWxsOwogICAgICAgICAgaWYgKHR5cGVvZiByZWNlaXZlciAhPSAib2JqZWN0IikKICAgICAgICAgICAgcmV0dXJuIGEwICE9IG51bGwgJiYgcmVjZWl2ZXIgPT09IGEwOwogICAgICAgIH0nJycpOwogICAgICB9CiAgICAgIGlmICghY2xhc3Nlcy5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcykgJiYKICAgICAgICAgICFjbGFzc2VzLmNvbnRhaW5zKF9jb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzKSAmJgogICAgICAgICAgIWNsYXNzZXMuY29udGFpbnMoX2NvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3MpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKHNlbGVjdG9yLmFyZ3VtZW50Q291bnQgPT0gMSkgewogICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgb3BlcmF0b3JzIGRvIG5vdCBtYXAgdG8gYSBKYXZhU2NyaXB0IG9wZXJhdG9yLgogICAgICAgIGlmIChuYW1lID09ICd+LycgfHwgbmFtZSA9PSAnPDwnIHx8IG5hbWUgPT0gJyUnIHx8IG5hbWUgPT0gJz4+JykgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGpzQXN0LkV4cHJlc3Npb24gcmVzdWx0ID0ganMoJ3JlY2VpdmVyICRuYW1lIGEwJyk7CiAgICAgICAgaWYgKG5hbWUgPT0gJyYnIHx8IG5hbWUgPT0gJ3wnIHx8IG5hbWUgPT0gJ14nKSB7CiAgICAgICAgICByZXN1bHQgPSBqcygnIyA+Pj4gMCcsIHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBqcy5zdGF0ZW1lbnQoCiAgICAgICAgICAgICdpZiAodHlwZW9mIHJlY2VpdmVyID09ICJudW1iZXIiICYmIHR5cGVvZiBhMCA9PSAibnVtYmVyIiknCiAgICAgICAgICAgICcgIHJldHVybiAjOycsCiAgICAgICAgICAgIHJlc3VsdCk7CiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAndW5hcnktJykgewogICAgICAgIHJldHVybiBqcwogICAgICAgICAgICAuc3RhdGVtZW50KCdpZiAodHlwZW9mIHJlY2VpdmVyID09ICJudW1iZXIiKSByZXR1cm4gLXJlY2VpdmVyJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KG5hbWUgPT0gJ34nKTsKICAgICAgICByZXR1cm4ganMuc3RhdGVtZW50KCcnJwogICAgICAgICAgaWYgKHR5cGVvZiByZWNlaXZlciA9PSAibnVtYmVyIiAmJiBNYXRoLmZsb29yKHJlY2VpdmVyKSA9PSByZWNlaXZlcikKICAgICAgICAgICAgcmV0dXJuICh+cmVjZWl2ZXIpID4+PiAwOwogICAgICAgICAgJycnKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pc0luZGV4IHx8IHNlbGVjdG9yLmlzSW5kZXhTZXQpIHsKICAgICAgLy8gRm9yIGFuIGluZGV4IG9wZXJhdGlvbiwgdGhpcyBjb2RlIGdlbmVyYXRlczoKICAgICAgLy8KICAgICAgLy8gICAgaWYgKHR5cGVvZiBhMCA9PT0gIm51bWJlciIpIHsKICAgICAgLy8gICAgICBpZiAocmVjZWl2ZXIuY29uc3RydWN0b3IgPT0gQXJyYXkgfHwKICAgICAgLy8gICAgICAgICAgdHlwZW9mIHJlY2VpdmVyID09ICJzdHJpbmciKSB7CiAgICAgIC8vICAgICAgICBpZiAoYTAgPj4+IDAgPT09IGEwICYmIGEwIDwgcmVjZWl2ZXIubGVuZ3RoKSB7CiAgICAgIC8vICAgICAgICAgIHJldHVybiByZWNlaXZlclthMF07CiAgICAgIC8vICAgICAgICB9CiAgICAgIC8vICAgICAgfQogICAgICAvLyAgICB9CiAgICAgIC8vCiAgICAgIC8vIEZvciBhbiBpbmRleCBzZXQgb3BlcmF0aW9uLCB0aGlzIGNvZGUgZ2VuZXJhdGVzOgogICAgICAvLwogICAgICAvLyAgICBpZiAodHlwZW9mIGEwID09PSAibnVtYmVyIikgewogICAgICAvLyAgICAgIGlmIChyZWNlaXZlci5jb25zdHJ1Y3RvciA9PSBBcnJheSAmJiAhcmVjZWl2ZXIuaW1tdXRhYmxlJGxpc3QpIHsKICAgICAgLy8gICAgICAgIGlmIChhMCA+Pj4gMCA9PT0gYTAgJiYgYTAgPCByZWNlaXZlci5sZW5ndGgpIHsKICAgICAgLy8gICAgICAgICAgcmV0dXJuIHJlY2VpdmVyW2EwXSA9IGExOwogICAgICAvLyAgICAgICAgfQogICAgICAvLyAgICAgIH0KICAgICAgLy8gICAgfQogICAgICBib29sIGNvbnRhaW5zQXJyYXkgPSBjbGFzc2VzLmNvbnRhaW5zKF9jb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MpOwogICAgICBib29sIGNvbnRhaW5zU3RyaW5nID0gY2xhc3Nlcy5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNTdHJpbmdDbGFzcyk7CiAgICAgIGJvb2wgY29udGFpbnNKc0luZGV4YWJsZSA9IF9jbG9zZWRXb3JsZAogICAgICAgICAgICAgIC5pc0ltcGxlbWVudGVkKF9jb21tb25FbGVtZW50cy5qc0luZGV4aW5nQmVoYXZpb3JJbnRlcmZhY2UpICYmCiAgICAgICAgICBjbGFzc2VzLmFueSgoY2xzKSB7CiAgICAgICAgICAgIHJldHVybiBfY2xvc2VkV29ybGQuY2xhc3NIaWVyYXJjaHkKICAgICAgICAgICAgICAgIC5pc1N1YnR5cGVPZihjbHMsIF9jb21tb25FbGVtZW50cy5qc0luZGV4aW5nQmVoYXZpb3JJbnRlcmZhY2UpOwogICAgICAgICAgfSk7CiAgICAgIC8vIFRoZSBpbmRleCBzZXQgb3BlcmF0b3IgcmVxdWlyZXMgYSBjaGVjayBvbiBpdHMgc2V0IHZhbHVlIGluCiAgICAgIC8vIGNoZWNrZWQgbW9kZSwgc28gd2UgZG9uJ3Qgb3B0aW1pemUgdGhlIGludGVyY2VwdG9yIGlmIHRoZQogICAgICAvLyBfY29tcGlsZXIgaGFzIHR5cGUgYXNzZXJ0aW9ucyBlbmFibGVkLgogICAgICBpZiAoc2VsZWN0b3IuaXNJbmRleFNldCAmJgogICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCBhbm5vdGF0aW9ucyBvbiB0aGUgcG9zc2libGUgdGFyZ2V0cwogICAgICAgICAgLy8gYW5kIHVzZWQgdGhlaXIgcGFyYW1ldGVyIGNoZWNrIHBvbGljeSBoZXJlLgogICAgICAgICAgKF9jbG9zZWRXb3JsZC5hbm5vdGF0aW9uc0RhdGEKICAgICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlckNoZWNrUG9saWN5KG51bGwpCiAgICAgICAgICAgICAgICAgIC5pc0VtaXR0ZWQgfHwKICAgICAgICAgICAgICAhY29udGFpbnNBcnJheSkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoIWNvbnRhaW5zQXJyYXkgJiYgIWNvbnRhaW5zU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAganNBc3QuRXhwcmVzc2lvbiBhcnJheUNoZWNrID0ganMoJ3JlY2VpdmVyLmNvbnN0cnVjdG9yID09IEFycmF5Jyk7CgogICAgICAvLyBMYXp5IGdlbmVyYXRpb24gb2YgdGhlIGluZGV4YWJsZSBjaGVjay4gSWYgaW5kZXhhYmxlIGJlaGF2aW9yIGlzbid0CiAgICAgIC8vIHVzZWQsIHRoZSBpc0pzSW5kZXhhYmxlIGZ1bmN0aW9uIGlzbid0IHBhcnQgb2YgdGhlIGNsb3NlZCB3b3JsZC4KICAgICAganNBc3QuRXhwcmVzc2lvbiBnZW5lcmljSW5kZXhhYmxlQ2hlY2soKSA9PgogICAgICAgICAgX2dlbmVyYXRlSXNKc0luZGV4YWJsZUNhbGwoanMoJ3JlY2VpdmVyJyksIGpzKCdyZWNlaXZlcicpKTsKCiAgICAgIGpzQXN0LkV4cHJlc3Npb24gb3JFeHAobGVmdCwgcmlnaHQpIHsKICAgICAgICByZXR1cm4gbGVmdCA9PSBudWxsID8gcmlnaHQgOiBqcygnIyB8fCAjJywgW2xlZnQsIHJpZ2h0XSk7CiAgICAgIH0KCiAgICAgIGlmIChzZWxlY3Rvci5pc0luZGV4KSB7CiAgICAgICAganNBc3QuRXhwcmVzc2lvbiB0eXBlQ2hlY2s7CiAgICAgICAgaWYgKGNvbnRhaW5zQXJyYXkpIHsKICAgICAgICAgIHR5cGVDaGVjayA9IGFycmF5Q2hlY2s7CiAgICAgICAgfQoKICAgICAgICBpZiAoY29udGFpbnNTdHJpbmcpIHsKICAgICAgICAgIHR5cGVDaGVjayA9IG9yRXhwKHR5cGVDaGVjaywganMoJ3R5cGVvZiByZWNlaXZlciA9PSAic3RyaW5nIicpKTsKICAgICAgICB9CgogICAgICAgIGlmIChjb250YWluc0pzSW5kZXhhYmxlKSB7CiAgICAgICAgICB0eXBlQ2hlY2sgPSBvckV4cCh0eXBlQ2hlY2ssIGdlbmVyaWNJbmRleGFibGVDaGVjaygpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBqcy5zdGF0ZW1lbnQoJycnCiAgICAgICAgICBpZiAodHlwZW9mIGEwID09PSAibnVtYmVyIikKICAgICAgICAgICAgaWYgKCMpCiAgICAgICAgICAgICAgaWYgKChhMCA+Pj4gMCkgPT09IGEwICYmIGEwIDwgcmVjZWl2ZXIubGVuZ3RoKQogICAgICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVyW2EwXTsKICAgICAgICAgICcnJywgdHlwZUNoZWNrKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBqc0FzdC5FeHByZXNzaW9uIHR5cGVDaGVjazsKICAgICAgICBpZiAoY29udGFpbnNBcnJheSkgewogICAgICAgICAgdHlwZUNoZWNrID0gYXJyYXlDaGVjazsKICAgICAgICB9CgogICAgICAgIGlmIChjb250YWluc0pzSW5kZXhhYmxlKSB7CiAgICAgICAgICB0eXBlQ2hlY2sgPSBvckV4cCh0eXBlQ2hlY2ssIGdlbmVyaWNJbmRleGFibGVDaGVjaygpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBqcy5zdGF0ZW1lbnQocicnJwogICAgICAgICAgaWYgKHR5cGVvZiBhMCA9PT0gIm51bWJlciIpCiAgICAgICAgICAgIGlmICgjICYmICFyZWNlaXZlci5pbW11dGFibGUkbGlzdCAmJgogICAgICAgICAgICAgICAgKGEwID4+PiAwKSA9PT0gYTAgJiYgYTAgPCByZWNlaXZlci5sZW5ndGgpCiAgICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVyW2EwXSA9IGExOwogICAgICAgICAgJycnLCB0eXBlQ2hlY2spOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmlzQ2FsbCkgewogICAgICBpZiAoc2VsZWN0b3IubmFtZSA9PSAnYWJzJyAmJiBzZWxlY3Rvci5hcmd1bWVudENvdW50ID09IDApIHsKICAgICAgICByZXR1cm4ganMuc3RhdGVtZW50KHInJycKICAgICAgICAgIGlmICh0eXBlb2YgcmVjZWl2ZXIgPT09ICJudW1iZXIiKSByZXR1cm4gTWF0aC5hYnMocmVjZWl2ZXIpOwogICAgICAgICcnJyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNHZXR0ZXIpIHsKICAgICAgaWYgKHNlbGVjdG9yLm5hbWUgPT0gJ3NpZ24nKSB7CiAgICAgICAgcmV0dXJuIGpzLnN0YXRlbWVudChyJycnCiAgICAgICAgICBpZiAodHlwZW9mIHJlY2VpdmVyID09PSAibnVtYmVyIikKICAgICAgICAgICAgIHJldHVybiByZWNlaXZlciA+IDAgPyAxIDogcmVjZWl2ZXIgPCAwID8gLTEgOiByZWNlaXZlcjsKICAgICAgICAnJycpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGpzQXN0LkV4cHJlc3Npb24gZ2VuZXJhdGVPbmVTaG90SW50ZXJjZXB0b3IoT25lU2hvdEludGVyY2VwdG9yIGludGVyY2VwdG9yKSB7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IGludGVyY2VwdG9yLnNlbGVjdG9yOwogICAgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzID0gaW50ZXJjZXB0b3IuY2xhc3NlczsKICAgIGpzQXN0Lk5hbWUgZ2V0SW50ZXJjZXB0b3JOYW1lID0gX25hbWVyLm5hbWVGb3JHZXRJbnRlcmNlcHRvcihjbGFzc2VzKTsKCiAgICBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTmFtZXMgPSA8U3RyaW5nPltdOwogICAgcGFyYW1ldGVyTmFtZXMuYWRkKCdyZWNlaXZlcicpOwoKICAgIGlmIChzZWxlY3Rvci5pc1NldHRlcikgewogICAgICBwYXJhbWV0ZXJOYW1lcy5hZGQoJ3ZhbHVlJyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdG9yLmFyZ3VtZW50Q291bnQ7IGkrKykgewogICAgICAgIHBhcmFtZXRlck5hbWVzLmFkZCgnYSRpJyk7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gc2VsZWN0b3IudHlwZUFyZ3VtZW50Q291bnQ7IGkrKykgewogICAgICAgIHBhcmFtZXRlck5hbWVzLmFkZCgnXCRUJGknKTsKICAgICAgfQogICAgfQoKICAgIGpzQXN0Lk5hbWUgaW52b2NhdGlvbk5hbWUgPSBfbmFtZXIuaW52b2NhdGlvbk5hbWUoc2VsZWN0b3IpOwogICAgU3RyaW5nIGdsb2JhbE9iamVjdCA9CiAgICAgICAgX25hbWVyLmdsb2JhbE9iamVjdEZvckxpYnJhcnkoX2NvbW1vbkVsZW1lbnRzLmludGVyY2VwdG9yc0xpYnJhcnkpOwoKICAgIGpzQXN0LlN0YXRlbWVudCBvcHRpbWl6ZWRQYXRoID0KICAgICAgICBfZmFzdFBhdGhGb3JPbmVTaG90SW50ZXJjZXB0b3Ioc2VsZWN0b3IsIGNsYXNzZXMpOwogICAgaWYgKG9wdGltaXplZFBhdGggPT0gbnVsbCkgb3B0aW1pemVkUGF0aCA9IGpzLnN0YXRlbWVudCgnOycpOwoKICAgIHJldHVybiBqcygnZnVuY3Rpb24oIykgeyAjOyByZXR1cm4gIy4jKHJlY2VpdmVyKS4jKCMpIH0nLCBbCiAgICAgIHBhcmFtZXRlck5hbWVzLAogICAgICBvcHRpbWl6ZWRQYXRoLAogICAgICBnbG9iYWxPYmplY3QsCiAgICAgIGdldEludGVyY2VwdG9yTmFtZSwKICAgICAgaW52b2NhdGlvbk5hbWUsCiAgICAgIHBhcmFtZXRlck5hbWVzCiAgICBdKTsKICB9CgogIGpzQXN0LkFycmF5SW5pdGlhbGl6ZXIgZ2VuZXJhdGVUeXBlVG9JbnRlcmNlcHRvck1hcCgpIHsKICAgIC8vIFRPRE8oc3JhKTogUGVyaGFwcyBpbmplY3QgYSBjb25zdGFudCBpbnN0ZWFkPwogICAgQ3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXMgYW5hbHlzaXMgPSBfY3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXM7CiAgICBpZiAoIWFuYWx5c2lzLm5lZWRzVGFibGUpIHJldHVybiBudWxsOwoKICAgIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gZWxlbWVudHMgPSA8anNBc3QuRXhwcmVzc2lvbj5bXTsKICAgIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IGNvbnN0YW50cyA9CiAgICAgICAgX2NvZGVnZW5Xb3JsZC5nZXRDb25zdGFudHNGb3JFbWlzc2lvbihfZW1pdHRlci5jb21wYXJlQ29uc3RhbnRzKTsKICAgIGZvciAoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCBpbiBjb25zdGFudHMpIHsKICAgICAgaWYgKGNvbnN0YW50IGlzIFR5cGVDb25zdGFudFZhbHVlICYmCiAgICAgICAgICBjb25zdGFudC5yZXByZXNlbnRlZFR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IGNvbnN0YW50LnJlcHJlc2VudGVkVHlwZTsKICAgICAgICBDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQgPSB0eXBlLmVsZW1lbnQ7CiAgICAgICAgaWYgKCFhbmFseXNpcy5uZWVkc0NsYXNzKGNsYXNzRWxlbWVudCkpIGNvbnRpbnVlOwoKICAgICAgICBlbGVtZW50cy5hZGQoX2VtaXR0ZXIuY29uc3RhbnRSZWZlcmVuY2UoY29uc3RhbnQpKTsKICAgICAgICBlbGVtZW50cy5hZGQoX2VtaXR0ZXIuaW50ZXJjZXB0b3JDbGFzc0FjY2VzcyhjbGFzc0VsZW1lbnQpKTsKCiAgICAgICAgLy8gQ3JlYXRlIEphdmFTY3JpcHQgT2JqZWN0IG1hcCBmb3IgYnktbmFtZSBsb29rdXAgb2YgZ2VuZXJhdGl2ZQogICAgICAgIC8vIGNvbnN0cnVjdG9ycy4gIEZvciBleGFtcGxlLCB0aGUgY2xhc3MgQSBoYXMgdGhyZWUgZ2VuZXJhdGl2ZQogICAgICAgIC8vIGNvbnN0cnVjdG9ycwogICAgICAgIC8vCiAgICAgICAgLy8gICAgIGNsYXNzIEEgewogICAgICAgIC8vICAgICAgIEEoKSB7fQogICAgICAgIC8vICAgICAgIEEuZm9vKCkge30KICAgICAgICAvLyAgICAgICBBLmJhcigpIHt9CiAgICAgICAgLy8gICAgIH0KICAgICAgICAvLwogICAgICAgIC8vIFdoaWNoIGFyZSBkZXNjcmliZWQgYnkgdGhlIG1hcAogICAgICAgIC8vCiAgICAgICAgLy8gICAgIHsiIjogQS5BJCwgImZvbyI6IEEuQSRmb28sICJiYXIiOiBBLkEkYmFyfQogICAgICAgIC8vCiAgICAgICAgLy8gV2UgZXhwZWN0IG1vc3Qgb2YgdGhlIHRpbWUgdGhlIG1hcCB3aWxsIGJlIGEgc2luZ2xldG9uLgogICAgICAgIHZhciBwcm9wZXJ0aWVzID0gPGpzQXN0LlByb3BlcnR5PltdOwogICAgICAgIGZvciAoQ29uc3RydWN0b3JFbnRpdHkgbWVtYmVyIGluIGFuYWx5c2lzLmNvbnN0cnVjdG9ycyhjbGFzc0VsZW1lbnQpKSB7CiAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChuZXcganNBc3QuUHJvcGVydHkoCiAgICAgICAgICAgICAganMuc3RyaW5nKG1lbWJlci5uYW1lKSwgX2VtaXR0ZXIuc3RhdGljRnVuY3Rpb25BY2Nlc3MobWVtYmVyKSkpOwogICAgICAgIH0KCiAgICAgICAgdmFyIG1hcCA9IG5ldyBqc0FzdC5PYmplY3RJbml0aWFsaXplcihwcm9wZXJ0aWVzKTsKICAgICAgICBlbGVtZW50cy5hZGQobWFwKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBuZXcganNBc3QuQXJyYXlJbml0aWFsaXplcihlbGVtZW50cyk7CiAgfQp9CoHRAE5OPAE3AUkBIiMkNCEgLjUoKS4hMTIqAS4BISgaNhZGJCMBHBwVIxMrGhoBOQFIATEvNAE3NwYBPj09IjgwOjYyMiA4ODY7OTk5NywPIAhQBgEbGhwZGhwcHFEBJzE4NjkZMxg1GjIXMxg1GjUaDU8yC0hRTEpNASBKCggGFRgGIgFELyQGATwBFSIBREdFIkcqLAEUJzwWDlEPRQgRUQYBFUwGE0oNSEAuTQYTSgY/GhRLBgEVKC08Hww2Hg5DQRFOCw1OS1FDJA0IATcGAU0EASk2SChFAUFHQCI6AUk7TzgEAUFEEDI1HyMaITMrMg8IOz4+FQgpSEsXCjs5KgodSBsVJRJNDx0gTyYQCDo2CSozMT8nEhAOCToJKk8/LBIQDktNLk0eL1AORUMwIU45KDEgIRUILxUISQFNSjJGASxDCAEeJB0iCgEeSwoBI0EKASAmEz0lGw8kHSIKASNBCgEhJjE7KBsIIkMhRw4IJCUhLEUOCAYRBAFQLjRLAS4kAR0jDTkjCD4lCAYBQRpMASQ7QgFAFhUUGhYVCAQBOjVNKwE8KEowKzc3MToBPEUBSUgYCxkYHBwRCyoLOgtDLVAtTwoBOxsIBgExBAIBP3BhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvaW50ZXJjZXB0b3Jfc3R1Yl9nZW5lcmF0b3IuZGFydEZzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19lbWl0dGVyL21haW5fY2FsbF9zdHViX2dlbmVyYXRvci5kYXJ0iLMvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX2VtaXR0ZXIubWFpbl9jYWxsX3N0dWJfZ2VuZXJhdG9yOwoKaW1wb3J0ICdwYWNrYWdlOmpzX3J1bnRpbWUvc2hhcmVkL2VtYmVkZGVkX25hbWVzLmRhcnQnIGFzIGVtYmVkZGVkTmFtZXM7CgppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIHNob3cganM7CgppbXBvcnQgJ2NvZGVfZW1pdHRlcl90YXNrLmRhcnQnIHNob3cgRW1pdHRlcjsKCmNsYXNzIE1haW5DYWxsU3R1YkdlbmVyYXRvciB7CiAgc3RhdGljIGpzQXN0LlN0YXRlbWVudCBnZW5lcmF0ZUludm9rZU1haW4oCiAgICAgIEVtaXR0ZXIgZW1pdHRlciwgRnVuY3Rpb25FbnRpdHkgbWFpbikgewogICAganNBc3QuRXhwcmVzc2lvbiBtYWluQ2FsbENsb3N1cmUgPSBlbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKG1haW4pOwogICAganNBc3QuRXhwcmVzc2lvbiBjdXJyZW50U2NyaXB0QWNjZXNzID0KICAgICAgICBlbWl0dGVyLmdlbmVyYXRlRW1iZWRkZWRHbG9iYWxBY2Nlc3MoZW1iZWRkZWROYW1lcy5DVVJSRU5UX1NDUklQVCk7CgogICAgLy8gVGhpcyBjb2RlIGZpbmRzIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHNjcmlwdCBieSBsaXN0ZW5pbmcgdG8gdGhlCiAgICAvLyBvbmxvYWQgZXZlbnQgb2YgYWxsIHNjcmlwdCB0YWdzIGFuZCBnZXR0aW5nIHRoZSBmaXJzdCBzY3JpcHQgd2hpY2gKICAgIC8vIGZpbmlzaGVzLiBTaW5jZSBvbmxvYWQgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGV4ZWN1dGlvbiB0aGlzIHNob3VsZAogICAgLy8gbm90IHN1YnN0YW50aWFsbHkgY2hhbmdlIGV4ZWN1dGlvbiBvcmRlci4KICAgIHJldHVybiBqcy5zdGF0ZW1lbnQoJycnCiAgICAgIChmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIFdoZW4gcnVubmluZyBhcyBhIGNvbnRlbnQtc2NyaXB0IG9mIGEgY2hyb21lLWV4dGVuc2lvbiB0aGUKICAgICAgICAvLyAnY3VycmVudFNjcmlwdCcgaXMgYG51bGxgIChidXQgbm90IHVuZGVmaW5lZCkuCiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICBjYWxsYmFjayhkb2N1bWVudC5jdXJyZW50U2NyaXB0KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuc2NyaXB0czsKICAgICAgICBmdW5jdGlvbiBvbkxvYWQoZXZlbnQpIHsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NyaXB0cy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICBzY3JpcHRzW2ldLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLCBvbkxvYWQsIGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICAgIGNhbGxiYWNrKGV2ZW50LnRhcmdldCk7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NyaXB0cy5sZW5ndGg7ICsraSkgewogICAgICAgICAgc2NyaXB0c1tpXS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgb25Mb2FkLCBmYWxzZSk7CiAgICAgICAgfQogICAgICB9KShmdW5jdGlvbihjdXJyZW50U2NyaXB0KSB7CiAgICAgICAgI2N1cnJlbnRTY3JpcHQgPSBjdXJyZW50U2NyaXB0OwoKICAgICAgICBpZiAodHlwZW9mIGRhcnRNYWluUnVubmVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBkYXJ0TWFpblJ1bm5lcigjbWFpbkNhbGxDbG9zdXJlLCBbXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICNtYWluQ2FsbENsb3N1cmUoW10pOwogICAgICAgIH0KICAgICAgfSknJycsIHsKICAgICAgJ2N1cnJlbnRTY3JpcHQnOiBjdXJyZW50U2NyaXB0QWNjZXNzLAogICAgICAnbWFpbkNhbGxDbG9zdXJlJzogbWFpbkNhbGxDbG9zdXJlCiAgICB9KTsKICB9Cn0KQABOTjwBNQFJASQhIAEuAR4tLksrTAFKSlAxHB0vGhIKRjo8LBIKASghNUMMIgozPgojKAE0MBEgCg8sKQgEAgE9cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9tYWluX2NhbGxfc3R1Yl9nZW5lcmF0b3IuZGFydD5zZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19lbWl0dGVyL25hdGl2ZV9nZW5lcmF0b3IuZGFydKEhLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19lbWl0dGVyLm5hdGl2ZV9nZW5lcmF0b3I7CgppbXBvcnQgJ3BhY2thZ2U6anNfcnVudGltZS9zaGFyZWQvZW1iZWRkZWRfbmFtZXMuZGFydCcgYXMgZW1iZWRkZWROYW1lczsKCmltcG9ydCAnLi4vanMvanMuZGFydCcgYXMganNBc3Q7CmltcG9ydCAnLi4vanMvanMuZGFydCcgc2hvdyBqczsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2JhY2tlbmRfdXNhZ2UuZGFydCcgc2hvdyBCYWNrZW5kVXNhZ2U7CgppbXBvcnQgJ21vZGVsLmRhcnQnOwoKY2xhc3MgTmF0aXZlR2VuZXJhdG9yIHsKICBzdGF0aWMgYm9vbCBuZWVkc0lzb2xhdGVBZmZpbml0eVRhZ0luaXRpYWxpemF0aW9uKEJhY2tlbmRVc2FnZSBiYWNrZW5kVXNhZ2UpIHsKICAgIHJldHVybiBiYWNrZW5kVXNhZ2UubmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZzsKICB9CgogIC8vLyBHZW5lcmF0ZXMgdGhlIGNvZGUgZm9yIGlzb2xhdGUgYWZmaW5pdHkgdGFncy4KICAvLy8KICAvLy8gSW5kZXBlbmRlbnRseSBEYXJ0IHByb2dyYW1zIG9uIHRoZSBzYW1lIHBhZ2UgbXVzdCBub3QgaW50ZXJmZXJlIGFuZAogIC8vLyB0aGlzIGNvZGUgc2V0cyB1cCB0aGUgdmFyaWFibGVzIG5lZWRlZCB0byBndWFyYW50ZWUgdGhhdCBiZWhhdmlvci4KICBzdGF0aWMganNBc3QuU3RhdGVtZW50IGdlbmVyYXRlSXNvbGF0ZUFmZmluaXR5VGFnSW5pdGlhbGl6YXRpb24oCiAgICAgIEJhY2tlbmRVc2FnZSBiYWNrZW5kVXNhZ2UsCiAgICAgIGpzQXN0LkV4cHJlc3Npb24gZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhTdHJpbmcgZ2xvYmFsKSwKICAgICAganNBc3QuRXhwcmVzc2lvbiBpbnRlcm5TdHJpbmdGdW5jdGlvbikgewogICAgYXNzZXJ0KGJhY2tlbmRVc2FnZS5uZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnKTsKCiAgICBqc0FzdC5FeHByZXNzaW9uIGdldElzb2xhdGVUYWdBY2Nlc3MgPQogICAgICAgIGdlbmVyYXRlRW1iZWRkZWRHbG9iYWxBY2Nlc3MoZW1iZWRkZWROYW1lcy5HRVRfSVNPTEFURV9UQUcpOwogICAganNBc3QuRXhwcmVzc2lvbiBpc29sYXRlVGFnQWNjZXNzID0KICAgICAgICBnZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzKGVtYmVkZGVkTmFtZXMuSVNPTEFURV9UQUcpOwogICAganNBc3QuRXhwcmVzc2lvbiBkaXNwYXRjaFByb3BlcnR5TmFtZUFjY2VzcyA9CiAgICAgICAgZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhlbWJlZGRlZE5hbWVzLkRJU1BBVENIX1BST1BFUlRZX05BTUUpOwoKICAgIHJldHVybiBqcy5zdGF0ZW1lbnQoJycnCiAgICAgICFmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaW50ZXJuID0gI2ludGVyblN0cmluZ0Z1bmN0aW9uOwoKICAgICAgICAjZ2V0SXNvbGF0ZVRhZyA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgIHJldHVybiBpbnRlcm4oIl9fX2RhcnRfIiArIG5hbWUgKyAjaXNvbGF0ZVRhZyk7CiAgICAgICAgfTsKCiAgICAgICAgLy8gVG8gZW5zdXJlIHRoYXQgZGlmZmVyZW50IHByb2dyYW1zIGxvYWRlZCBpbnRvIHRoZSBzYW1lIGNvbnRleHQgKHBhZ2UpCiAgICAgICAgLy8gdXNlIGRpc3RpbmN0IGRpc3BhdGNoIHByb3Blcmllcywgd2UgcGxhY2UgYW4gb2JqZWN0IG9uIGBPYmplY3RgIHRvCiAgICAgICAgLy8gY29udGFpbiB0aGUgbmFtZXMgYWxyZWFkeSBpbiB1c2UuCiAgICAgICAgdmFyIHRhYmxlUHJvcGVydHkgPSAiX19fZGFydF9pc29sYXRlX3RhZ3NfIjsKICAgICAgICB2YXIgdXNlZFByb3BlcnRpZXMgPSBPYmplY3RbdGFibGVQcm9wZXJ0eV0gfHwKICAgICAgICAgICAgKE9iamVjdFt0YWJsZVByb3BlcnR5XSA9IE9iamVjdC5jcmVhdGUobnVsbCkpOwoKICAgICAgICB2YXIgcm9vdFByb3BlcnR5ID0gIl8ke2dlbmVyYXRlSXNvbGF0ZVRhZ1Jvb3QoKX0iOwogICAgICAgIGZvciAodmFyIGkgPSAwOyA7IGkrKykgewogICAgICAgICAgdmFyIHByb3BlcnR5ID0gaW50ZXJuKHJvb3RQcm9wZXJ0eSArICJfIiArIGkgKyAiXyIpOwogICAgICAgICAgaWYgKCEocHJvcGVydHkgaW4gdXNlZFByb3BlcnRpZXMpKSB7CiAgICAgICAgICAgIHVzZWRQcm9wZXJ0aWVzW3Byb3BlcnR5XSA9IDE7CiAgICAgICAgICAgICNpc29sYXRlVGFnID0gcHJvcGVydHk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoI2luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5KSB7CiAgICAgICAgICAjZGlzcGF0Y2hQcm9wZXJ0eU5hbWUgPSAjZ2V0SXNvbGF0ZVRhZygiZGlzcGF0Y2hfcmVjb3JkIik7CiAgICAgICAgfQogICAgICB9KCk7CiAgICAnJycsIHsKICAgICAgJ2luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5JzoKICAgICAgICAgIGJhY2tlbmRVc2FnZS5uZWVkVG9Jbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eSwKICAgICAgJ2ludGVyblN0cmluZ0Z1bmN0aW9uJzogaW50ZXJuU3RyaW5nRnVuY3Rpb24sCiAgICAgICdnZXRJc29sYXRlVGFnJzogZ2V0SXNvbGF0ZVRhZ0FjY2VzcywKICAgICAgJ2lzb2xhdGVUYWcnOiBpc29sYXRlVGFnQWNjZXNzLAogICAgICAnZGlzcGF0Y2hQcm9wZXJ0eU5hbWUnOiBkaXNwYXRjaFByb3BlcnR5TmFtZUFjY2VzcwogICAgfSk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlSXNvbGF0ZVRhZ1Jvb3QoKSB7CiAgICAvLyBUT0RPKHNyYSk6IE1ENSBvZiBjb250cmlidXRpbmcgc291cmNlIGNvZGUgb3IgVVJJcz8KICAgIHJldHVybiAnWnhZeFgnOwogIH0KCiAgLy8vIEVuY29kZXMgdGhlIGNvbGxlY3RlZCBuYXRpdmUgaW5mb3JtYXRpb24gc28gdGhhdCBpdCBjYW4gYmUgdHJlYXRlZCBieQogIC8vLyB0aGUgbmF0aXZlIGluZm8taGFuZGxlciBiZWxvdy4KICAvLy8KICAvLy8gVGhlIGVuY29kZWQgaW5mb3JtYXRpb24gaGFzIHRoZSBmb3JtOgogIC8vLwogIC8vICAgICIlIjogImxlYWZUYWcxfGxlYWZUYWcyfC4uLjtub25sZWFmVGFnMXwuLi47Q2xhc3MxfENsYXNzMnwuLi4iLAogIC8vCiAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSBmb2xsb3dpbmcgYSBzZW1pY29sb24sIHRoZSBzZW1pY29sb24gY2FuIGJlIG9taXR0ZWQuCiAgc3RhdGljIGpzQXN0LkV4cHJlc3Npb24gZW5jb2RlTmF0aXZlSW5mbyhDbGFzcyBjbHMpIHsKICAgIExpc3Q8U3RyaW5nPiBsZWFmVGFncyA9IGNscy5uYXRpdmVMZWFmVGFnczsKICAgIExpc3Q8U3RyaW5nPiBub25MZWFmVGFncyA9IGNscy5uYXRpdmVOb25MZWFmVGFnczsKICAgIExpc3Q8Q2xhc3M+IGV4dGVuc2lvbnMgPSBjbHMubmF0aXZlRXh0ZW5zaW9uczsKCiAgICBTdHJpbmcgZm9ybWF0VGFncyhJdGVyYWJsZTxTdHJpbmc+IHRhZ3MpIHsKICAgICAgaWYgKHRhZ3MgPT0gbnVsbCkgcmV0dXJuICcnOwogICAgICByZXR1cm4gKHRhZ3MudG9MaXN0KCkuLnNvcnQoKSkuam9pbignfCcpOwogICAgfQoKICAgIFN0cmluZyBsZWFmU3RyID0gZm9ybWF0VGFncyhsZWFmVGFncyk7CiAgICBTdHJpbmcgbm9uTGVhZlN0ciA9IGZvcm1hdFRhZ3Mobm9uTGVhZlRhZ3MpOwoKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIobGVhZlN0cik7CiAgICBpZiAobm9uTGVhZlN0ciAhPSAnJykgewogICAgICBzYi4ud3JpdGUoJzsnKS4ud3JpdGUobm9uTGVhZlN0cik7CiAgICB9CgogICAgU3RyaW5nIGVuY29kaW5nID0gc2IudG9TdHJpbmcoKTsKCiAgICBpZiAoY2xzLmlzTmF0aXZlIHx8IGVuY29kaW5nICE9ICcnIHx8IGV4dGVuc2lvbnMgIT0gbnVsbCkgewogICAgICBMaXN0PGpzQXN0LkxpdGVyYWw+IHBhcnRzID0gPGpzQXN0LkxpdGVyYWw+W2pzLnN0cmluZ1BhcnQoZW5jb2RpbmcpXTsKICAgICAgaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewogICAgICAgIHBhcnRzCiAgICAgICAgICAuLmFkZChqcy5zdHJpbmdQYXJ0KCc7JykpCiAgICAgICAgICAuLmFkZEFsbChqcy5qb2luTGl0ZXJhbHMoCiAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5tYXAoKENsYXNzIGNscykgPT4gY2xzLm5hbWUpLCBqcy5zdHJpbmdQYXJ0KCd8JykpKTsKICAgICAgfQogICAgICByZXR1cm4ganNBc3QuY29uY2F0ZW5hdGVTdHJpbmdzKHBhcnRzLCBhZGRRdW90ZXM6IHRydWUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8gUmV0dXJucyBhIEphdmFTY3JpcHQgdGVtcGxhdGUgdGhhdCBmaWxscyB0aGUgZW1iZWRkZWQgZ2xvYmFscyByZWZlcmVuY2VkCiAgLy8vIGJ5IFtpbnRlcmNlcHRvcnNCeVRhZ0FjY2Vzc10gYW5kIFtsZWFmVGFnc0FjY2Vzc10uCiAgLy8vCiAgLy8vIFRoaXMgY29kZSBtdXN0IGJlIGludm9rZWQgZm9yIGV2ZXJ5IGNsYXNzIHRoYXQgaGFzIGEgbmF0aXZlIGluZm8gYmVmb3JlCiAgLy8vIHRoZSBwcm9ncmFtIHN0YXJ0cy4KICAvLy8KICAvLy8gVGhlIFtpbmZvQWNjZXNzXSBwYXJhbWV0ZXIgbXVzdCBldmFsdWF0ZSB0byBhbiBleHByZXNzaW9uIHRoYXQgY29udGFpbnMKICAvLy8gdGhlIGluZm8gKGFzIGEgSmF2YVNjcmlwdCBzdHJpbmcpLgogIC8vLwogIC8vLyBUaGUgW2NvbnN0cnVjdG9yQWNjZXNzXSBwYXJhbWV0ZXIgbXVzdCBldmFsdWF0ZSB0byBhbiBleHByZXNzaW9uIHRoYXQKICAvLy8gY29udGFpbnMgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBjbGFzcy4gVGhlIGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlIG11c3QKICAvLy8gYmUgc2V0IHVwLgogIC8vLwogIC8vLyBUaGUgW3N1YmNsYXNzUmVhZEdlbmVyYXRvcl0gZnVuY3Rpb24gbXVzdCBldmFsdWF0ZSB0byBhIEpTIGV4cHJlc3Npb24KICAvLy8gdGhhdCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjb25zdHJ1Y3RvciAod2l0aCBldmFsdWF0ZWQgcHJvdG90eXBlKQogIC8vLyBvZiB0aGUgZ2l2ZW4gSlMgZXhwcmVzc2lvbi4KICAvLy8KICAvLy8gVGhlIFtpbnRlcmNlcHRvcnNCeVRhZ0FjY2Vzc10gbXVzdCBwb2ludCB0byB0aGUgZW1iZWRkZWQgZ2xvYmFsCiAgLy8vIFtlbWJlZGRlZE5hbWVzLklOVEVSQ0VQVE9SU19CWV9UQUddIGFuZCBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkKICAvLy8gSlMgT2JqZWN0ICh1c2VkIGFzIGEgbWFwKS4KICAvLy8KICAvLy8gU2ltaWxhcmx5LCB0aGUgW2xlYWZUYWdzQWNjZXNzXSBtdXN0IHBvaW50IHRvIHRoZSBlbWJlZGRlZCBnbG9iYWwKICAvLy8gW2VtYmVkZGVkTmFtZXMuTEVBRl9UQUdTXSBhbmQgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGVtcHR5IEpTIE9iamVjdAogIC8vLyAodXNlZCBhcyBhIG1hcCkuCiAgLy8vCiAgLy8vIEJvdGggdmFyaWFibGVzIGFyZSBwYXNzZWQgaW4gKGluc3RlYWQgb2YgY3JlYXRpbmcgdGhlIGFjY2VzcyBoZXJlKSB0bwogIC8vLyBtYWtlIHN1cmUgdGhlIGNhbGxlciBpcyBhd2FyZSBvZiB0aGVzZSBnbG9iYWxzLgogIHN0YXRpYyBqc0FzdC5TdGF0ZW1lbnQgYnVpbGROYXRpdmVJbmZvSGFuZGxlcigKICAgICAganNBc3QuRXhwcmVzc2lvbiBpbmZvQWNjZXNzLAogICAgICBqc0FzdC5FeHByZXNzaW9uIGNvbnN0cnVjdG9yQWNjZXNzLAogICAgICBqc0FzdC5FeHByZXNzaW9uIHN1YmNsYXNzUmVhZEdlbmVyYXRvcihqc0FzdC5FeHByZXNzaW9uIHN1YmNsYXNzKSwKICAgICAganNBc3QuRXhwcmVzc2lvbiBpbnRlcmNlcHRvcnNCeVRhZ0FjY2VzcywKICAgICAganNBc3QuRXhwcmVzc2lvbiBsZWFmVGFnc0FjY2VzcykgewogICAganNBc3QuRXhwcmVzc2lvbiBzdWJjbGFzc1JlYWQgPQogICAgICAgIHN1YmNsYXNzUmVhZEdlbmVyYXRvcihqcygnc3ViY2xhc3Nlc1tpXScsIFtdKSk7CiAgICByZXR1cm4ganMuc3RhdGVtZW50KCcnJwogICAgICAgICAgLy8gVGhlIG5hdGl2ZSBpbmZvIGxvb2tzIGxpa2UgdGhpczoKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBIdG1sRWxlbWVudDogewogICAgICAgICAgLy8gICAgICIlIjogIkhUTUxEaXZFbGVtZW50fEhUTUxBbmNob3JFbGVtZW50O0hUTUxFbGVtZW50O0ZhbmN5QnV0dG9uIgogICAgICAgICAgLy8KICAgICAgICAgIC8vIFRoZSBmaXJzdCB0d28gc2VtaWNvbG9uLXNlcGFyYXRlZCBwYXJ0cyBjb250YWluIGRpc3BhdGNoIHRhZ3MsIHRoZQogICAgICAgICAgLy8gdGhpcmQgY29udGFpbnMgdGhlIEphdmFTY3JpcHQgbmFtZXMgZm9yIGNsYXNzZXMuCiAgICAgICAgICAvLwogICAgICAgICAgLy8gVGhlIHRhZ3MgaW5kaWNhdGUgdGhhdCBKYXZhU2NyaXB0IG9iamVjdHMgd2l0aCB0aGUgZGlzcGF0Y2ggdGFncwogICAgICAgICAgLy8gKHVzdWFsbHkgY29uc3RydWN0b3IgbmFtZXMpIEhUTUxEaXZFbGVtZW50LCBIVE1MQW5jaG9yRWxlbWVudCBhbmQKICAgICAgICAgIC8vIEhUTUxFbGVtZW50IGFsbCBtYXAgdG8gdGhlIERhcnQgbmF0aXZlIGNsYXNzIG5hbWVkIEh0bWxFbGVtZW50LgogICAgICAgICAgLy8gVGhlIGZpcnN0IHNldCBpcyBmb3IgZWZmZWN0aXZlIGxlYWYgbm9kZXMgaW4gdGhlIGhpZXJhcmNoeSwgdGhlCiAgICAgICAgICAvLyBzZWNvbmQgc2V0IGlzIG5vbi1sZWFmIG5vZGVzLgogICAgICAgICAgLy8KICAgICAgICAgIC8vIFRoZSB0aGlyZCBwYXJ0IGNvbnRhaW5zIHRoZSBKYXZhU2NyaXB0IG5hbWVzIG9mIERhcnQgY2xhc3NlcyB0aGF0CiAgICAgICAgICAvLyBleHRlbmQgdGhlIG5hdGl2ZSBjbGFzcy4gSGVyZSwgRmFuY3lCdXR0b24gZXh0ZW5kcyBIdG1sRWxlbWVudCwgc28KICAgICAgICAgIC8vIHRoZSBydW50aW1lIG5lZWRzIHRvIGtub3cgdGhhdCB3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlIGlzIHRoZQogICAgICAgICAgLy8gcHJvdG90eXBlIHRoYXQgbmVlZHMgdG8gYmUgZXh0ZW5kZWQgaW4gY3JlYXRpbmcgdGhlIGN1c3RvbSBlbGVtZW50LgogICAgICAgICAgLy8KICAgICAgICAgIC8vIFRoZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGJ1aWxkIHRhYmxlcyByZWZlcmVuY2VkIGJ5CiAgICAgICAgICAvLyBnZXROYXRpdmVJbnRlcmNlcHRvciBhbmQgY3VzdG9tIGVsZW1lbnQgc3VwcG9ydC4KICAgICAgICAgIHsKICAgICAgICAgICAgdmFyIG5hdGl2ZVNwZWMgPSAjaW5mby5zcGxpdCgiOyIpOwogICAgICAgICAgICBpZiAobmF0aXZlU3BlY1swXSkgewogICAgICAgICAgICAgIHZhciB0YWdzID0gbmF0aXZlU3BlY1swXS5zcGxpdCgifCIpOwogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgI2ludGVyY2VwdG9yc0J5VGFnQWNjZXNzW3RhZ3NbaV1dID0gI2NvbnN0cnVjdG9yOwogICAgICAgICAgICAgICAgI2xlYWZUYWdzQWNjZXNzW3RhZ3NbaV1dID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5hdGl2ZVNwZWNbMV0pIHsKICAgICAgICAgICAgICB0YWdzID0gbmF0aXZlU3BlY1sxXS5zcGxpdCgifCIpOwogICAgICAgICAgICAgIGlmICgjYWxsb3dOYXRpdmVzU3ViY2xhc3NpbmcpIHsKICAgICAgICAgICAgICAgIGlmIChuYXRpdmVTcGVjWzJdKSB7CiAgICAgICAgICAgICAgICAgIHZhciBzdWJjbGFzc2VzID0gbmF0aXZlU3BlY1syXS5zcGxpdCgifCIpOwogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YmNsYXNzZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ViY2xhc3MgPSAjc3ViY2xhc3NSZWFkOwogICAgICAgICAgICAgICAgICAgIHN1YmNsYXNzLiNuYXRpdmVTdXBlcmNsYXNzVGFnTmFtZSA9IHRhZ3NbMF07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICNpbnRlcmNlcHRvcnNCeVRhZ0FjY2Vzc1t0YWdzW2ldXSA9ICNjb25zdHJ1Y3RvcjsKICAgICAgICAgICAgICAgICAgI2xlYWZUYWdzQWNjZXNzW3RhZ3NbaV1dID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAnJycsIHsKICAgICAgJ2luZm8nOiBpbmZvQWNjZXNzLAogICAgICAnY29uc3RydWN0b3InOiBjb25zdHJ1Y3RvckFjY2VzcywKICAgICAgJ3N1YmNsYXNzUmVhZCc6IHN1YmNsYXNzUmVhZCwKICAgICAgJ2ludGVyY2VwdG9yc0J5VGFnQWNjZXNzJzogaW50ZXJjZXB0b3JzQnlUYWdBY2Nlc3MsCiAgICAgICdsZWFmVGFnc0FjY2Vzcyc6IGxlYWZUYWdzQWNjZXNzLAogICAgICAnbmF0aXZlU3VwZXJjbGFzc1RhZ05hbWUnOiBlbWJlZGRlZE5hbWVzLk5BVElWRV9TVVBFUkNMQVNTX1RBR19OQU1FLAogICAgICAnYWxsb3dOYXRpdmVzU3ViY2xhc3NpbmcnOiB0cnVlCiAgICB9KTsKICB9Cn0KgNgATk48AS0BSQEhID0BFQEYUTwEATQGSklDIUQvPQErRShBMkwBHBQsASo6CwFRTi01NjsBOyE/LyokEwwKK0UKCwskOTQsJjkIBAErOxQEAUwlBiwGSAVOODA2MwEvIzAGASsxATEcKQYBJQFATCAOJCRNCD8GEQQBTzkGThoGTikGTE4RBkxNIgZGUCEGSFAXBkw2MSMqSTApJDgcLg0cUQ1QPg1OT01NKw1PUFBRDUM+DC8hMzZCMRAOIS8uJT1AMkEUEjRENBIQDgwLGigkOihLJggEAgE1cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9uYXRpdmVfZ2VuZXJhdG9yLmRhcnRGc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfZW1pdHRlci9wYXJhbWV0ZXJfc3R1Yl9nZW5lcmF0b3IuZGFydMAAQ4AvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX2VtaXR0ZXIucGFyYW1ldGVyX3N0dWJfZ2VuZXJhdG9yOwoKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBKRWxlbWVudEVudmlyb25tZW50OwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW8vc291cmNlX2luZm9ybWF0aW9uLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIHNob3cganM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYW1lci5kYXJ0JyBzaG93IE5hbWVyOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvcnVudGltZV90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXNfbmV3LmRhcnQnIHNob3cgUmVjaXBlRW5jb2RlcjsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JyBzaG93IENhbGxTdHJ1Y3R1cmU7CmltcG9ydCAnLi4vdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfYnVpbGRlci5kYXJ0JyBzaG93IFNlbGVjdG9yQ29uc3RyYWludHM7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CgppbXBvcnQgJ21vZGVsLmRhcnQnOwoKaW1wb3J0ICdjb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JyBzaG93IEVtaXR0ZXI7CmltcG9ydCAnbmF0aXZlX2VtaXR0ZXIuZGFydCc7CgpjbGFzcyBQYXJhbWV0ZXJTdHViR2VuZXJhdG9yIHsKICBzdGF0aWMgZmluYWwgU2V0PFNlbGVjdG9yPiBlbXB0eVNlbGVjdG9yU2V0ID0gbmV3IFNldDxTZWxlY3Rvcj4oKTsKCiAgZmluYWwgRW1pdHRlciBfZW1pdHRlcjsKICBmaW5hbCBOYXRpdmVFbWl0dGVyIF9uYXRpdmVFbWl0dGVyOwogIGZpbmFsIE5hbWVyIF9uYW1lcjsKICBmaW5hbCBSdW50aW1lVHlwZXNFbmNvZGVyIF9ydGlFbmNvZGVyOwogIGZpbmFsIFJlY2lwZUVuY29kZXIgX3J0aVJlY2lwZUVuY29kZXI7IC8vIGBudWxsYCBpZiBub3QgZXhwZXJpbWVudE5ld1J0aS4KICBmaW5hbCBOYXRpdmVEYXRhIF9uYXRpdmVEYXRhOwogIGZpbmFsIEludGVyY2VwdG9yRGF0YSBfaW50ZXJjZXB0b3JEYXRhOwogIGZpbmFsIENvZGVnZW5Xb3JsZCBfY29kZWdlbldvcmxkOwogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CiAgZmluYWwgU291cmNlSW5mb3JtYXRpb25TdHJhdGVneSBfc291cmNlSW5mb3JtYXRpb25TdHJhdGVneTsKCiAgUGFyYW1ldGVyU3R1YkdlbmVyYXRvcigKICAgICAgdGhpcy5fZW1pdHRlciwKICAgICAgdGhpcy5fbmF0aXZlRW1pdHRlciwKICAgICAgdGhpcy5fbmFtZXIsCiAgICAgIHRoaXMuX3J0aUVuY29kZXIsCiAgICAgIHRoaXMuX3J0aVJlY2lwZUVuY29kZXIsCiAgICAgIHRoaXMuX25hdGl2ZURhdGEsCiAgICAgIHRoaXMuX2ludGVyY2VwdG9yRGF0YSwKICAgICAgdGhpcy5fY29kZWdlbldvcmxkLAogICAgICB0aGlzLl9jbG9zZWRXb3JsZCwKICAgICAgdGhpcy5fc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSk7CgogIEpFbGVtZW50RW52aXJvbm1lbnQgZ2V0IF9lbGVtZW50RW52aXJvbm1lbnQgPT4KICAgICAgX2Nsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudDsKCiAgYm9vbCBuZWVkc1N1cGVyR2V0dGVyKEZ1bmN0aW9uRW50aXR5IGVsZW1lbnQpID0+CiAgICAgIF9jb2RlZ2VuV29ybGQubWV0aG9kc05lZWRzU3VwZXJHZXR0ZXIoZWxlbWVudCk7CgogIC8vLyBHZW5lcmF0ZXMgc3R1YnMgdG8gZmlsbCBpbiBtaXNzaW5nIG9wdGlvbmFsIG5hbWVkIG9yIHBvc2l0aW9uYWwgYXJndW1lbnRzCiAgLy8vIGFuZCBtaXNzaW5nIHR5cGUgYXJndW1lbnRzLiAgUmV0dXJucyBgbnVsbGAgaWYgbm8gc3R1YiBpcyBuZWVkZWQuCiAgLy8vCiAgLy8vIE1ldGhvZHMgbGlrZSBgZm9vKFt4XSlgIGFuZCBgYmFyKHt4fSlgIG1heSBiZSBpbnZva2VkIGJ5IHRoZSBmb2xsb3dpbmcKICAvLy8gY2FsbHM6IGBmb28oKSwgZm9vKDEpLCBiYXIoKSwgYmFyKHg6IDEpYC4gVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHRoZSBzdHViCiAgLy8vIGZvciB0aGUgZ2l2ZW4gW3NlbGVjdG9yXSBhbmQgcmV0dXJucyB0aGUgZ2VuZXJhdGVkIFtQYXJhbWV0ZXJTdHViTWV0aG9kXS4KICAvLy8KICAvLy8gTWVtYmVycyBtYXkgYmUgaW52b2tlZCBpbiB0d28gd2F5czogZGlyZWN0bHksIG9yIHRocm91Z2ggYSBjbG9zdXJlLiBJbiB0aGUKICAvLy8gbGF0dGVyIGNhc2UgdGhlIGNhbGxlciBpbnZva2VzIHRoZSB0ZWFyLW9mZiBjbG9zdXJlJ3MgYGNhbGxgIG1ldGhvZC4gVGhpcwogIC8vLyBtZXRob2QgW2dlbmVyYXRlUGFyYW1ldGVyU3R1Yl0gYWNjZXB0cyB0d28gc2VsZWN0b3JzLiBUaGUgcmV0dXJuZWQgc3R1YgogIC8vLyBtZXRob2QgaGFzIHRoZSBjb3JyZXNwb25kaW5nIG5hbWUgW1BhcmFtZXRlclN0dWJNZXRob2QubmFtZV0gYW5kCiAgLy8vIFtQYXJhbWV0ZXJTdHViTWV0aG9kLmNhbGxOYW1lXSBzZXQgaWYgdGhlIGlucHV0IHNlbGVjdG9yIGlzIG5vbi1udWxsIChhbmQKICAvLy8gdGhlIG1lbWJlciBuZWVkcyBhIHN0dWIpLgogIFBhcmFtZXRlclN0dWJNZXRob2QgZ2VuZXJhdGVQYXJhbWV0ZXJTdHViKAogICAgICBGdW5jdGlvbkVudGl0eSBtZW1iZXIsIFNlbGVjdG9yIHNlbGVjdG9yLCBTZWxlY3RvciBjYWxsU2VsZWN0b3IpIHsKICAgIC8vIFRoZSBuYW1pbmcgaGVyZSBjYW4gYmUgYSBiaXQgY29uZnVzaW5nLiBUaGVyZSBpcyBhIGNhbGwgc2l0ZSBzb21ld2hlcmUKICAgIC8vIHRoYXQgY2FsbHMgdGhlIHN0dWIgdmlhIHRoZSBbc2VsZWN0b3JdLCB3aGljaCBoYXMgYSBbQ2FsbFN0cnVjdHVyZV0sIHNvCiAgICAvLyB0aGUgKkNhbGwqU3RydWN0dXJlIGRldGVybWluZXMgdGhlICpwYXJhbWV0ZXJzKiBvZiB0aGUgc3R1Yi4gVGhlIGJvZHkgb2YKICAgIC8vIHRoZSBzdHViIGNhbGxzIHRoZSBtZW1iZXIgd2hpY2ggaGFzIGEgW1BhcmFtZXRlclN0cnVjdHVyZV0sIHNvIHRoZQogICAgLy8gKlBhcmFtZXRlcipTdHJ1Y3R1cmUgZGV0ZXJtaW5lcyB0aGUgKmFyZ3VtZW50cyogb2YgdGhlIGZvcndhcmRpbmcgY2FsbC4KCiAgICBDYWxsU3RydWN0dXJlIGNhbGxTdHJ1Y3R1cmUgPSBzZWxlY3Rvci5jYWxsU3RydWN0dXJlOwogICAgUGFyYW1ldGVyU3RydWN0dXJlIHBhcmFtZXRlclN0cnVjdHVyZSA9IG1lbWJlci5wYXJhbWV0ZXJTdHJ1Y3R1cmU7CiAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50Q291bnQgPSBjYWxsU3RydWN0dXJlLnBvc2l0aW9uYWxBcmd1bWVudENvdW50OwogICAgYXNzZXJ0KGNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50Q291bnQgPT0gMCB8fAogICAgICAgIGNhbGxTdHJ1Y3R1cmUudHlwZUFyZ3VtZW50Q291bnQgPT0gcGFyYW1ldGVyU3RydWN0dXJlLnR5cGVQYXJhbWV0ZXJzKTsKCiAgICAvLyBXZSBkb24ndCBuZWVkIGEgc3R1YiBpZiB0aGUgYXJndW1lbnRzIG1hdGNoIHRoZSB0YXJnZXQgcGFyYW1ldGVycywKICAgIC8vIGkuZS4gdGhlcmUgYXJlIG5vIG1pc3Npbmcgb3B0aW9uYWwgYXJndW1lbnRzIG9yIHR5cGVzLiBUaGUgc2VsZWN0b3IKICAgIC8vIGFwcGxpZXMgdG8gdGhlIG1lbWJlciwgc28gd2UgY2FuIGNoZWNrIHVzaW5nIGNvdW50cy4KICAgIGlmIChjYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudENvdW50ID09IHBhcmFtZXRlclN0cnVjdHVyZS50eXBlUGFyYW1ldGVycykgewogICAgICBpZiAocG9zaXRpb25hbEFyZ3VtZW50Q291bnQgPT0gcGFyYW1ldGVyU3RydWN0dXJlLnRvdGFsUGFyYW1ldGVycykgewogICAgICAgIC8vIFBvc2l0aW9uYWwgb3B0aW9uYWwgYXJndW1lbnRzIGFyZSBhbGwgcHJvdmlkZWQuCiAgICAgICAgYXNzZXJ0KGNhbGxTdHJ1Y3R1cmUuaXNVbm5hbWVkKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlLm5hbWVkUGFyYW1ldGVycy5pc05vdEVtcHR5ICYmCiAgICAgICAgICBjYWxsU3RydWN0dXJlLm5hbWVkQXJndW1lbnRDb3VudCA9PQogICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgLy8gTmFtZWQgb3B0aW9uYWwgYXJndW1lbnRzIGFyZSBhbGwgcHJvdmlkZWQuCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KCiAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSBjYWxsU3RydWN0dXJlLmdldE9yZGVyZWROYW1lZEFyZ3VtZW50cygpOwoKICAgIGJvb2wgaXNJbnRlcmNlcHRlZE1ldGhvZCA9IF9pbnRlcmNlcHRvckRhdGEuaXNJbnRlcmNlcHRlZE1ldGhvZChtZW1iZXIpOwoKICAgIC8vIElmIHRoZSBtZXRob2QgaXMgaW50ZXJjZXB0ZWQsIHdlIG5lZWQgdG8gYWxzbyBwYXNzIHRoZSBhY3R1YWwgcmVjZWl2ZXIuCiAgICBpbnQgZXh0cmFBcmd1bWVudENvdW50ID0gaXNJbnRlcmNlcHRlZE1ldGhvZCA/IDEgOiAwOwogICAgLy8gVXNlICckcmVjZWl2ZXInIHRvIGF2b2lkIGNsYXNoZXMgd2l0aCBvdGhlciBwYXJhbWV0ZXIgbmFtZXMuIFVzaW5nCiAgICAvLyAnJHJlY2VpdmVyJyB3b3JrcyBiZWNhdXNlIG5hbWVyLnNhZmVWYXJpYWJsZU5hbWUgdXNlZCBmb3IgZ2V0dGluZwogICAgLy8gcGFyYW1ldGVyIG5hbWVzIG5ldmVyIHJldHVybnMgYSBuYW1lIGJlZ2lubmluZyB3aXRoIGEgc2luZ2xlICckJy4KICAgIFN0cmluZyByZWNlaXZlckFyZ3VtZW50TmFtZSA9IHInJHJlY2VpdmVyJzsKCiAgICAvLyBUaGUgcGFyYW1ldGVycyB0aGF0IHRoaXMgc3R1YiB0YWtlcy4KICAgIExpc3Q8anNBc3QuUGFyYW1ldGVyPiBzdHViUGFyYW1ldGVycyA9IG5ldyBMaXN0PGpzQXN0LlBhcmFtZXRlcj4oCiAgICAgICAgZXh0cmFBcmd1bWVudENvdW50ICsKICAgICAgICAgICAgc2VsZWN0b3IuYXJndW1lbnRDb3VudCArCiAgICAgICAgICAgIHNlbGVjdG9yLnR5cGVBcmd1bWVudENvdW50KTsKICAgIC8vIFRoZSBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcmVhbCBtZXRob2QuCiAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IHRhcmdldEFyZ3VtZW50cyA9IG5ldyBMaXN0PGpzQXN0LkV4cHJlc3Npb24+KAogICAgICAgIGV4dHJhQXJndW1lbnRDb3VudCArCiAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZS50b3RhbFBhcmFtZXRlcnMgKwogICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmUudHlwZVBhcmFtZXRlcnMpOwoKICAgIGludCBjb3VudCA9IDA7CiAgICBpZiAoaXNJbnRlcmNlcHRlZE1ldGhvZCkgewogICAgICBjb3VudCsrOwogICAgICBzdHViUGFyYW1ldGVyc1swXSA9IG5ldyBqc0FzdC5QYXJhbWV0ZXIocmVjZWl2ZXJBcmd1bWVudE5hbWUpOwogICAgICB0YXJnZXRBcmd1bWVudHNbMF0gPSBqcygnIycsIHJlY2VpdmVyQXJndW1lbnROYW1lKTsKICAgIH0KCiAgICBpbnQgb3B0aW9uYWxQYXJhbWV0ZXJTdGFydCA9IHBvc2l0aW9uYWxBcmd1bWVudENvdW50ICsgZXh0cmFBcmd1bWVudENvdW50OwogICAgLy8gSW5jbHVkZXMgZXh0cmEgcmVjZWl2ZXIgYXJndW1lbnQgd2hlbiB1c2luZyBpbnRlcmNlcHRvciBjb252ZW50aW9uCiAgICBpbnQgaW5kZXhPZkxhc3RPcHRpb25hbEFyZ3VtZW50SW5QYXJhbWV0ZXJzID0gb3B0aW9uYWxQYXJhbWV0ZXJTdGFydCAtIDE7CgogICAgX2VsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoUGFyYW1ldGVyKG1lbWJlciwKICAgICAgICAoXywgU3RyaW5nIG5hbWUsIENvbnN0YW50VmFsdWUgdmFsdWUpIHsKICAgICAgU3RyaW5nIGpzTmFtZSA9IF9uYW1lci5zYWZlVmFyaWFibGVOYW1lKG5hbWUpOwogICAgICBhc3NlcnQoanNOYW1lICE9IHJlY2VpdmVyQXJndW1lbnROYW1lKTsKICAgICAgaWYgKGNvdW50IDwgb3B0aW9uYWxQYXJhbWV0ZXJTdGFydCkgewogICAgICAgIHN0dWJQYXJhbWV0ZXJzW2NvdW50XSA9IG5ldyBqc0FzdC5QYXJhbWV0ZXIoanNOYW1lKTsKICAgICAgICB0YXJnZXRBcmd1bWVudHNbY291bnRdID0ganMoJyMnLCBqc05hbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGludCBpbmRleCA9IG5hbWVzLmluZGV4T2YobmFtZSk7CiAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7CiAgICAgICAgICBpbmRleE9mTGFzdE9wdGlvbmFsQXJndW1lbnRJblBhcmFtZXRlcnMgPSBjb3VudDsKICAgICAgICAgIC8vIFRoZSBvcmRlciBvZiB0aGUgbmFtZWQgYXJndW1lbnRzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUKICAgICAgICAgIC8vIG9uZSBpbiB0aGUgcmVhbCBtZXRob2QgKHdoaWNoIGlzIGluIERhcnQgc291cmNlIG9yZGVyKS4KICAgICAgICAgIHRhcmdldEFyZ3VtZW50c1tjb3VudF0gPSBqcygnIycsIGpzTmFtZSk7CiAgICAgICAgICBzdHViUGFyYW1ldGVyc1tvcHRpb25hbFBhcmFtZXRlclN0YXJ0ICsgaW5kZXhdID0KICAgICAgICAgICAgICBuZXcganNBc3QuUGFyYW1ldGVyKGpzTmFtZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgIHRhcmdldEFyZ3VtZW50c1tjb3VudF0gPQogICAgICAgICAgICAgICAgX2VtaXR0ZXIuY29uc3RhbnRSZWZlcmVuY2UobmV3IE51bGxDb25zdGFudFZhbHVlKCkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCF2YWx1ZS5pc051bGwpIHsKICAgICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgdGhlIG51bGwgY29uc3RhbnQsIHdlIHNob3VsZCBub3QgcGFzcyBpdAogICAgICAgICAgICAgIC8vIGRvd24gdG8gdGhlIG5hdGl2ZSBtZXRob2QuCiAgICAgICAgICAgICAgaW5kZXhPZkxhc3RPcHRpb25hbEFyZ3VtZW50SW5QYXJhbWV0ZXJzID0gY291bnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGFyZ2V0QXJndW1lbnRzW2NvdW50XSA9IF9lbWl0dGVyLmNvbnN0YW50UmVmZXJlbmNlKHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY291bnQrKzsKICAgIH0pOwoKICAgIGlmIChwYXJhbWV0ZXJTdHJ1Y3R1cmUudHlwZVBhcmFtZXRlcnMgPiAwKSB7CiAgICAgIGludCBwYXJhbWV0ZXJJbmRleCA9CiAgICAgICAgICBzdHViUGFyYW1ldGVycy5sZW5ndGggLSBwYXJhbWV0ZXJTdHJ1Y3R1cmUudHlwZVBhcmFtZXRlcnM7CiAgICAgIGZvciAoVHlwZVZhcmlhYmxlVHlwZSB0eXBlVmFyaWFibGUKICAgICAgICAgIGluIF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0RnVuY3Rpb25UeXBlVmFyaWFibGVzKG1lbWJlcikpIHsKICAgICAgICBpZiAoc2VsZWN0b3IudHlwZUFyZ3VtZW50Q291bnQgPT0gMCkgewogICAgICAgICAgRGFydFR5cGUgZGVmYXVsdFR5cGUgPSBfY2xvc2VkV29ybGQuZWxlbWVudEVudmlyb25tZW50CiAgICAgICAgICAgICAgLmdldFR5cGVWYXJpYWJsZURlZmF1bHRUeXBlKHR5cGVWYXJpYWJsZS5lbGVtZW50KTsKICAgICAgICAgIGlmIChfcnRpUmVjaXBlRW5jb2RlciAhPSBudWxsKSB7CiAgICAgICAgICAgIGpzQXN0LkV4cHJlc3Npb24gdHlwZVJ0aSA9IF9ydGlSZWNpcGVFbmNvZGVyLmV2YWx1YXRlUmVjaXBlKAogICAgICAgICAgICAgICAgX2VtaXR0ZXIsCiAgICAgICAgICAgICAgICBfcnRpUmVjaXBlRW5jb2Rlci5lbmNvZGVSZWNpcGVXaXRoVmFyaWFibGVzUmVwbGFjZUJ5QW55KAogICAgICAgICAgICAgICAgICAgIF9lbWl0dGVyLCBkZWZhdWx0VHlwZSkpOwogICAgICAgICAgICB0YXJnZXRBcmd1bWVudHNbY291bnQrK10gPSB0eXBlUnRpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGFyZ2V0QXJndW1lbnRzW2NvdW50KytdID0gX3J0aUVuY29kZXIuZ2V0VHlwZVJlcHJlc2VudGF0aW9uKAogICAgICAgICAgICAgICAgX2VtaXR0ZXIsIGRlZmF1bHRUeXBlLCAoXykgPT4gX2VtaXR0ZXIuY29uc3RhbnRSZWZlcmVuY2UoCiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETygzMzQyMik6IFN1cHBvcnQgdHlwZSB2YXJpYWJsZXMgaW4gZGVmYXVsdAogICAgICAgICAgICAgICAgICAgIC8vIHR5cGVzLiBUZW1wb3JhcmlseSB1c2luZyB0aGUgImFueSIgdHlwZSAoZW5jb2RlZCBhcyAtMikgdG8KICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBmYWlsaW5nIG9uIGJvdW5kcyBjaGVja3MuCiAgICAgICAgICAgICAgICAgICAgbmV3IEludENvbnN0YW50VmFsdWUobmV3IEJpZ0ludC5mcm9tKC0yKSkpKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgU3RyaW5nIGpzTmFtZSA9ICdcJCR7dHlwZVZhcmlhYmxlLmVsZW1lbnQubmFtZX0nOwogICAgICAgICAgc3R1YlBhcmFtZXRlcnNbcGFyYW1ldGVySW5kZXgrK10gPSBuZXcganNBc3QuUGFyYW1ldGVyKGpzTmFtZSk7CiAgICAgICAgICB0YXJnZXRBcmd1bWVudHNbY291bnQrK10gPSBqcygnIycsIGpzTmFtZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdmFyIGJvZHk7IC8vIExpc3Qgb3IganNBc3QuU3RhdGVtZW50LgogICAgaWYgKF9uYXRpdmVEYXRhLmhhc0ZpeGVkQmFja2VuZE5hbWUobWVtYmVyKSkgewogICAgICBib2R5ID0gX25hdGl2ZUVtaXR0ZXIuZ2VuZXJhdGVQYXJhbWV0ZXJTdHViU3RhdGVtZW50cygKICAgICAgICAgIG1lbWJlciwKICAgICAgICAgIGlzSW50ZXJjZXB0ZWRNZXRob2QsCiAgICAgICAgICBfbmFtZXIuaW52b2NhdGlvbk5hbWUoc2VsZWN0b3IpLAogICAgICAgICAgc3R1YlBhcmFtZXRlcnMsCiAgICAgICAgICB0YXJnZXRBcmd1bWVudHMsCiAgICAgICAgICBpbmRleE9mTGFzdE9wdGlvbmFsQXJndW1lbnRJblBhcmFtZXRlcnMpOwogICAgfSBlbHNlIGlmIChtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICBpZiAobmVlZHNTdXBlckdldHRlcihtZW1iZXIpKSB7CiAgICAgICAgQ2xhc3NFbnRpdHkgc3VwZXJDbGFzcyA9IG1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgICAgICBqc0FzdC5OYW1lIG1ldGhvZE5hbWUgPSBfbmFtZXIuaW5zdGFuY2VNZXRob2ROYW1lKG1lbWJlcik7CiAgICAgICAgLy8gV2hlbiByZWRpcmVjdGluZywgd2UgbXVzdCBlbnN1cmUgdGhhdCB3ZSBkb24ndCBlbmQgdXAgaW4gYSBzdWJjbGFzcy4KICAgICAgICAvLyBXZSB0aHVzIGNhbid0IGp1c3QgaW52b2tlIGB0aGlzLmZvbyQxLmNhbGwoZmlsbGVkSW5Bcmd1bWVudHMpYC4KICAgICAgICAvLyBJbnN0ZWFkIHdlIG5lZWQgdG8gY2FsbCB0aGUgc3RhdGljYWxseSByZXNvbHZlZCB0YXJnZXQuCiAgICAgICAgLy8gICBgPGNsYXNzPi5wcm90b3R5cGUuYmFyJDEuY2FsbCh0aGlzLCBhcmd1bWVudDAsIC4uLilgLgogICAgICAgIGJvZHkgPSBqcy5zdGF0ZW1lbnQoJ3JldHVybiAjLiMuY2FsbCh0aGlzLCAjKTsnLCBbCiAgICAgICAgICBfZW1pdHRlci5wcm90b3R5cGVBY2Nlc3Moc3VwZXJDbGFzcywgaGFzQmVlbkluc3RhbnRpYXRlZDogdHJ1ZSksCiAgICAgICAgICBtZXRob2ROYW1lLAogICAgICAgICAgdGFyZ2V0QXJndW1lbnRzCiAgICAgICAgXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYm9keSA9IGpzLnN0YXRlbWVudCgncmV0dXJuIHRoaXMuIygjKTsnLAogICAgICAgICAgICBbX25hbWVyLmluc3RhbmNlTWV0aG9kTmFtZShtZW1iZXIpLCB0YXJnZXRBcmd1bWVudHNdKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYm9keSA9IGpzLnN0YXRlbWVudCgncmV0dXJuICMoIyknLAogICAgICAgICAgW19lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKG1lbWJlciksIHRhcmdldEFyZ3VtZW50c10pOwogICAgfQoKICAgIFNvdXJjZUluZm9ybWF0aW9uQnVpbGRlciBzb3VyY2VJbmZvcm1hdGlvbkJ1aWxkZXIgPQogICAgICAgIF9zb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5LmNyZWF0ZUJ1aWxkZXJGb3JDb250ZXh0KG1lbWJlcik7CiAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiA9CiAgICAgICAgc291cmNlSW5mb3JtYXRpb25CdWlsZGVyLmJ1aWxkU3R1YihtZW1iZXIsIGNhbGxTdHJ1Y3R1cmUpOwoKICAgIGpzQXN0LkZ1biBmdW5jdGlvbiA9IGpzKCdmdW5jdGlvbigjKSB7ICM7IH0nLCBbc3R1YlBhcmFtZXRlcnMsIGJvZHldKQogICAgICAgIC53aXRoU291cmNlSW5mb3JtYXRpb24oc291cmNlSW5mb3JtYXRpb24pOwoKICAgIGpzQXN0Lk5hbWUgbmFtZSA9IG1lbWJlci5pc1N0YXRpYyA/IG51bGwgOiBfbmFtZXIuaW52b2NhdGlvbk5hbWUoc2VsZWN0b3IpOwogICAganNBc3QuTmFtZSBjYWxsTmFtZSA9CiAgICAgICAgKGNhbGxTZWxlY3RvciAhPSBudWxsKSA/IF9uYW1lci5pbnZvY2F0aW9uTmFtZShjYWxsU2VsZWN0b3IpIDogbnVsbDsKICAgIHJldHVybiBuZXcgUGFyYW1ldGVyU3R1Yk1ldGhvZChuYW1lLCBjYWxsTmFtZSwgZnVuY3Rpb24sIGVsZW1lbnQ6IG1lbWJlcik7CiAgfQoKICAvLyBXZSBmaWxsIHRoZSBsaXN0cyBkZXBlbmRpbmcgb24gcG9zc2libGUvaW52b2tlZCBzZWxlY3RvcnMuIEZvciBleGFtcGxlLAogIC8vIHRha2UgbWV0aG9kIGZvbzoKICAvLyAgICBmb28oYSwgYiwge2MsIGR9KTsKICAvLwogIC8vIFdlIG1heSBoYXZlIG11bHRpcGxlIHdheXMgb2YgY2FsbGluZyBmb286CiAgLy8gKDEpIGZvbygxLCAyKTsKICAvLyAoMikgZm9vKDEsIDIsIGM6IDMpOwogIC8vICgzKSBmb28oMSwgMiwgZDogNCk7CiAgLy8gKDQpIGZvbygxLCAyLCBjOiAzLCBkOiA0KTsKICAvLyAoNSkgZm9vKDEsIDIsIGQ6IDQsIGM6IDMpOwogIC8vCiAgLy8gV2hhdCB3ZSBnZW5lcmF0ZSBhdCB0aGUgY2FsbCBzaXRlcyBhcmU6CiAgLy8gKDEpIGZvbyQyKDEsIDIpOwogIC8vICgyKSBmb28kMyRjKDEsIDIsIDMpOwogIC8vICgzKSBmb28kMyRkKDEsIDIsIDQpOwogIC8vICg0KSBmb28kNCRjJGQoMSwgMiwgMywgNCk7CiAgLy8gKDUpIGZvbyQ0JGMkZCgxLCAyLCAzLCA0KTsKICAvLwogIC8vIFRoZSBzdHVicyB3ZSBnZW5lcmF0ZSBhcmUgKGV4cHJlc3NlZCBpbiBEYXJ0KToKICAvLyAoMSkgZm9vJDIoYSwgYikgPT4gZm9vJDQkYyRkKGEsIGIsIG51bGwsIG51bGwpCiAgLy8gKDIpIGZvbyQzJGMoYSwgYiwgYykgPT4gZm9vJDQkYyRkKGEsIGIsIGMsIG51bGwpOwogIC8vICgzKSBmb28kMyRkKGEsIGIsIGQpID0+IGZvbyQ0JGMkZChhLCBiLCBudWxsLCBkKTsKICAvLyAoNCkgTm8gc3R1YiBnZW5lcmF0ZWQsIGNhbGwgaXMgZGlyZWN0LgogIC8vICg1KSBObyBzdHViIGdlbmVyYXRlZCwgY2FsbCBpcyBkaXJlY3QuCiAgLy8KICAvLyBXZSBuZWVkIHRvIHBheSBhdHRlbnRpb24gaWYgdGhpcyBzdHViIGlzIGZvciBhIGZ1bmN0aW9uIHRoYXQgaGFzIGJlZW4KICAvLyBpbnZva2VkIGZyb20gYSBzdWJjbGFzcy4gVGhlbiB3ZSBjYW5ub3QganVzdCByZWRpcmVjdCwgc2luY2UgdGhhdAogIC8vIHdvdWxkIGludm9rZSB0aGUgbWV0aG9kcyBvZiB0aGUgc3ViY2xhc3MuIFdlIGhhdmUgdG8gY29tcGlsZSB0bzoKICAvLyAoMSkgZm9vJDIoYSwgYikgPT4gTXlDbGFzcy5mb28kNCRjJGQuY2FsbCh0aGlzLCBhLCBiLCBudWxsLCBudWxsKQogIC8vICgyKSBmb28kMyRjKGEsIGIsIGMpID0+IE15Q2xhc3MuZm9vJDQkYyRkKHRoaXMsIGEsIGIsIGMsIG51bGwpOwogIC8vICgzKSBmb28kMyRkKGEsIGIsIGQpID0+IE15Q2xhc3MuZm9vJDQkYyRkKHRoaXMsIGEsIGIsIG51bGwsIGQpOwogIExpc3Q8UGFyYW1ldGVyU3R1Yk1ldGhvZD4gZ2VuZXJhdGVQYXJhbWV0ZXJTdHVicyhGdW5jdGlvbkVudGl0eSBtZW1iZXIsCiAgICAgIHtib29sIGNhblRlYXJPZmYsIGJvb2wgY2FuQmVBcHBsaWVkfSkgewogICAgYXNzZXJ0KGNhblRlYXJPZmYgIT0gbnVsbCk7CiAgICBhc3NlcnQoY2FuQmVBcHBsaWVkICE9IG51bGwpOwogICAgLy8gVGhlIHNldCBvZiBzZWxlY3RvcnMgdGhhdCBhcHBseSB0byBgbWVtYmVyYC4gRm9yIGV4YW1wbGUsIGZvcgogICAgLy8gYSBtZW1iZXIgYGZvbyh4LCBbeV0pYCB0aGUgZm9sbG93aW5nIHNlbGVjdG9ycyBtYXkgYXBwbHk6CiAgICAvLyBgZm9vKHgpYCwgYW5kIGBmb28oeCwgeSlgLgogICAgTWFwPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPiBsaXZlU2VsZWN0b3JzOwogICAgLy8gVGhlIHNldCBvZiBzZWxlY3RvcnMgdGhhdCBhcHBseSB0byBgbWVtYmVyYCBpZiBpdCdzIG5hbWUgd2FzIGBjYWxsYC4KICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIGEgbWVtYmVyIGlzIHRvcm4gb2ZmLiBJbiB0aGF0IGNhc2UgY2FsbHMgdG8gdGhlCiAgICAvLyBmdW5jdGlvbiB1c2UgdGhlIG5hbWUgYGNhbGxgLCBhbmQgd2UgbXVzdCBiZSBhYmxlIHRvIGhhbmRsZSBldmVyeQogICAgLy8gYGNhbGxgIGludm9jYXRpb24gdGhhdCBtYXRjaGVzIHRoZSBzaWduYXR1cmUuIEZvciBleGFtcGxlLCBmb3IKICAgIC8vIGEgbWVtYmVyIGBmb28oeCwgW3ldKWAgdGhlIGZvbGxvd2luZyBzZWxlY3RvcnMgd291bGQgYmUgcG9zc2libGUKICAgIC8vIGNhbGwtc2VsZWN0b3JzOiBgY2FsbCh4KWAsIGFuZCBgY2FsbCh4LCB5KWAuCiAgICBNYXA8U2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHM+IGNhbGxTZWxlY3RvcnM7CgogICAgaW50IG1lbWJlclR5cGVQYXJhbWV0ZXJzID0gbWVtYmVyLnBhcmFtZXRlclN0cnVjdHVyZS50eXBlUGFyYW1ldGVyczsKCiAgICAvLyBPbmx5IGluc3RhbmNlIG1lbWJlcnMgKG5vdCBzdGF0aWMgbWV0aG9kcykgbmVlZCBzdHVicy4KICAgIGlmIChtZW1iZXIuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICBsaXZlU2VsZWN0b3JzID0gX2NvZGVnZW5Xb3JsZC5pbnZvY2F0aW9uc0J5TmFtZShtZW1iZXIubmFtZSk7CiAgICB9CgogICAgaWYgKGNhblRlYXJPZmYpIHsKICAgICAgU3RyaW5nIGNhbGwgPSBfbmFtZXIuY2xvc3VyZUludm9jYXRpb25TZWxlY3Rvck5hbWU7CiAgICAgIGNhbGxTZWxlY3RvcnMgPSBfY29kZWdlbldvcmxkLmludm9jYXRpb25zQnlOYW1lKGNhbGwpOwogICAgfQoKICAgIGFzc2VydChlbXB0eVNlbGVjdG9yU2V0LmlzRW1wdHkpOwogICAgbGl2ZVNlbGVjdG9ycyA/Pz0gY29uc3QgPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPnt9OwogICAgY2FsbFNlbGVjdG9ycyA/Pz0gY29uc3QgPFNlbGVjdG9yLCBTZWxlY3RvckNvbnN0cmFpbnRzPnt9OwoKICAgIExpc3Q8UGFyYW1ldGVyU3R1Yk1ldGhvZD4gc3R1YnMgPSA8UGFyYW1ldGVyU3R1Yk1ldGhvZD5bXTsKCiAgICBpZiAobGl2ZVNlbGVjdG9ycy5pc0VtcHR5ICYmCiAgICAgICAgY2FsbFNlbGVjdG9ycy5pc0VtcHR5ICYmCiAgICAgICAgLy8gRnVuY3Rpb24uYXBwbHkgbWlnaHQgbmVlZCBhIHN0dWIgdG8gZGVmYXVsdCB0aGUgdHlwZSBwYXJhbWV0ZXIuCiAgICAgICAgIShjYW5CZUFwcGxpZWQgJiYgbWVtYmVyVHlwZVBhcmFtZXRlcnMgPiAwKSkgewogICAgICByZXR1cm4gc3R1YnM7CiAgICB9CgogICAgLy8gRm9yIGV2ZXJ5IGNhbGwtc2VsZWN0b3IgdGhlIGNvcnJlc3BvbmRpbmcgc2VsZWN0b3Igd2l0aCB0aGUgbmFtZSBvZiB0aGUKICAgIC8vIG1lbWJlci4KICAgIC8vCiAgICAvLyBGb3IgZXhhbXBsZSwgZm9yIHRoZSBjYWxsLXNlbGVjdG9yIGBjYWxsKHgsIHkpYCB0aGUgcmVuYW1lZCBzZWxlY3RvcgogICAgLy8gZm9yIG1lbWJlciBgZm9vYCB3b3VsZCBiZSBgZm9vKHgsIHkpYC4KICAgIFNldDxTZWxlY3Rvcj4gcmVuYW1lZENhbGxTZWxlY3RvcnMgPSBuZXcgU2V0PFNlbGVjdG9yPigpOwoKICAgIFNldDxTZWxlY3Rvcj4gc3R1YlNlbGVjdG9ycyA9IG5ldyBTZXQ8U2VsZWN0b3I+KCk7CgogICAgLy8gU3RhcnQgd2l0aCBjbG9zdXJlLWNhbGwgc2VsZWN0b3JzLCBzaW5jZSBzaW5jZSB0aGV5IGltcGx5IHRoZSBnZW5lcmF0aW9uCiAgICAvLyBvZiB0aGUgbm9uLWNhbGwgdmVyc2lvbi4KICAgIGlmIChjYW5CZUFwcGxpZWQgJiYgbWVtYmVyVHlwZVBhcmFtZXRlcnMgPiAwKSB7CiAgICAgIC8vIEZ1bmN0aW9uLmFwcGx5IGNhbGxzIHRoZSBmdW5jdGlvbiB3aXRoIG5vIHR5cGUgYXJndW1lbnRzLCBzbyBnZW5lcmljCiAgICAgIC8vIG1ldGhvZHMgbmVlZCB0aGUgc3R1YiB0byBkZWZhdWx0IHRoZSB0eXBlIGFyZ3VtZW50cy4KICAgICAgLy8gVGhpcyBoYXMgdG8gYmUgdGhlIGZpcnN0IHN0dWIuCiAgICAgIFNlbGVjdG9yIG5hbWVkU2VsZWN0b3IgPSBuZXcgU2VsZWN0b3IuZnJvbUVsZW1lbnQobWVtYmVyKS50b05vbkdlbmVyaWMoKTsKICAgICAgU2VsZWN0b3IgY2xvc3VyZVNlbGVjdG9yID0KICAgICAgICAgIG5hbWVkU2VsZWN0b3IuaXNDbG9zdXJlQ2FsbCA/IG51bGwgOiBuYW1lZFNlbGVjdG9yLnRvQ2FsbFNlbGVjdG9yKCk7CgogICAgICByZW5hbWVkQ2FsbFNlbGVjdG9ycy5hZGQobmFtZWRTZWxlY3Rvcik7CiAgICAgIHN0dWJTZWxlY3RvcnMuYWRkKG5hbWVkU2VsZWN0b3IpOwogICAgICBQYXJhbWV0ZXJTdHViTWV0aG9kIHN0dWIgPQogICAgICAgICAgZ2VuZXJhdGVQYXJhbWV0ZXJTdHViKG1lbWJlciwgbmFtZWRTZWxlY3RvciwgY2xvc3VyZVNlbGVjdG9yKTsKICAgICAgYXNzZXJ0KHN0dWIgIT0gbnVsbCk7CiAgICAgIHN0dWJzLmFkZChzdHViKTsKICAgIH0KCiAgICBmb3IgKFNlbGVjdG9yIHNlbGVjdG9yIGluIGNhbGxTZWxlY3RvcnMua2V5cykgewogICAgICBTZWxlY3RvciByZW5hbWVkU2VsZWN0b3IgPQogICAgICAgICAgbmV3IFNlbGVjdG9yLmNhbGwobWVtYmVyLm1lbWJlck5hbWUsIHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUpOwogICAgICByZW5hbWVkQ2FsbFNlbGVjdG9ycy5hZGQocmVuYW1lZFNlbGVjdG9yKTsKCiAgICAgIGlmICghcmVuYW1lZFNlbGVjdG9yLmFwcGxpZXNVbm5hbWVkKG1lbWJlcikpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgaWYgKHN0dWJTZWxlY3RvcnMuYWRkKHJlbmFtZWRTZWxlY3RvcikpIHsKICAgICAgICBQYXJhbWV0ZXJTdHViTWV0aG9kIHN0dWIgPQogICAgICAgICAgICBnZW5lcmF0ZVBhcmFtZXRlclN0dWIobWVtYmVyLCByZW5hbWVkU2VsZWN0b3IsIHNlbGVjdG9yKTsKICAgICAgICBpZiAoc3R1YiAhPSBudWxsKSB7CiAgICAgICAgICBzdHVicy5hZGQoc3R1Yik7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBBIGdlbmVyaWMgbWV0aG9kIG1pZ2h0IG5lZWQgdG8gc3VwcG9ydCBgY2FsbDxUPih4KWAgZm9yIGEgZ2VuZXJpYwogICAgICAvLyBpbnN0YW50aWF0aW9uIHN0dWIgd2l0aG91dCBgY2FsbDxUPih4KWAgYmVpbmcgaW4gW2NhbGxTZWxlY3RvcnNdLgogICAgICAvLyBbc2VsZWN0b3JdIHdpbGwgYmUgYGNhbGwoeClgICh0aGF0IGFscmVhZHkgcGFzc2VzIHRoZSBhcHBsaWVzVW5uYW1lZAogICAgICAvLyBjaGVjayBieSBkZWZhdWx0aW5nIHR5cGUgYXJndW1lbnRzKSwgYW5kIHRoZSBtZXRob2Qgd2lsbCBiZSBnZW5lcmljLgogICAgICAvLwogICAgICAvLyBUaGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBsb2dpYyBhcyBhYm92ZSwgYnV0IHdpdGggdHlwZSBhcmd1bWVudHMuCiAgICAgIGlmIChzZWxlY3Rvci5jYWxsU3RydWN0dXJlLnR5cGVBcmd1bWVudENvdW50ID09IDApIHsKICAgICAgICBpZiAobWVtYmVyVHlwZVBhcmFtZXRlcnMgPiAwKSB7CiAgICAgICAgICBTZWxlY3RvciByZW5hbWVkU2VsZWN0b3JXaXRoVHlwZUFyZ3VtZW50cyA9IG5ldyBTZWxlY3Rvci5jYWxsKAogICAgICAgICAgICAgIG1lbWJlci5tZW1iZXJOYW1lLAogICAgICAgICAgICAgIHNlbGVjdG9yLmNhbGxTdHJ1Y3R1cmUKICAgICAgICAgICAgICAgICAgLndpdGhUeXBlQXJndW1lbnRDb3VudChtZW1iZXJUeXBlUGFyYW1ldGVycykpOwogICAgICAgICAgcmVuYW1lZENhbGxTZWxlY3RvcnMuYWRkKHJlbmFtZWRTZWxlY3RvcldpdGhUeXBlQXJndW1lbnRzKTsKCiAgICAgICAgICBpZiAoc3R1YlNlbGVjdG9ycy5hZGQocmVuYW1lZFNlbGVjdG9yV2l0aFR5cGVBcmd1bWVudHMpKSB7CiAgICAgICAgICAgIFNlbGVjdG9yIGNsb3N1cmVTZWxlY3RvciA9CiAgICAgICAgICAgICAgICBuZXcgU2VsZWN0b3IuY2FsbENsb3N1cmVGcm9tKHJlbmFtZWRTZWxlY3RvcldpdGhUeXBlQXJndW1lbnRzKTsKICAgICAgICAgICAgUGFyYW1ldGVyU3R1Yk1ldGhvZCBzdHViID0gZ2VuZXJhdGVQYXJhbWV0ZXJTdHViKAogICAgICAgICAgICAgICAgbWVtYmVyLCByZW5hbWVkU2VsZWN0b3JXaXRoVHlwZUFyZ3VtZW50cywgY2xvc3VyZVNlbGVjdG9yKTsKICAgICAgICAgICAgaWYgKHN0dWIgIT0gbnVsbCkgewogICAgICAgICAgICAgIHN0dWJzLmFkZChzdHViKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIE5vdyBydW4gdGhyb3VnaCB0aGUgYWN0dWFsIG1lbWJlciBzZWxlY3RvcnMgKGVnLiBgZm9vJDIoeCwgeSlgIGFuZCBub3QKICAgIC8vIGBjYWxsJDIoeCwgeSlgKS4gU29tZSBvZiB0aGVtIGhhdmUgYWxyZWFkeSBiZWVuIGdlbmVyYXRlZCBiZWNhdXNlIG9mIHRoZQogICAgLy8gY2FsbC1zZWxlY3RvcnMgYW5kIHRoZXkgYXJlIGluIHRoZSByZW5hbWVkQ2FsbFNlbGVjdG9ycyBzZXQuCiAgICBmb3IgKFNlbGVjdG9yIHNlbGVjdG9yIGluIGxpdmVTZWxlY3RvcnMua2V5cykgewogICAgICBpZiAocmVuYW1lZENhbGxTZWxlY3RvcnMuY29udGFpbnMoc2VsZWN0b3IpKSBjb250aW51ZTsKICAgICAgaWYgKCFzZWxlY3Rvci5hcHBsaWVzVW5uYW1lZChtZW1iZXIpKSBjb250aW51ZTsKICAgICAgaWYgKCFsaXZlU2VsZWN0b3JzW3NlbGVjdG9yXQogICAgICAgICAgLmNhbkhpdChtZW1iZXIsIHNlbGVjdG9yLm1lbWJlck5hbWUsIF9jbG9zZWRXb3JsZCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgaWYgKHN0dWJTZWxlY3RvcnMuYWRkKHNlbGVjdG9yKSkgewogICAgICAgIFBhcmFtZXRlclN0dWJNZXRob2Qgc3R1YiA9CiAgICAgICAgICAgIGdlbmVyYXRlUGFyYW1ldGVyU3R1YihtZW1iZXIsIHNlbGVjdG9yLCBudWxsKTsKICAgICAgICBpZiAoc3R1YiAhPSBudWxsKSB7CiAgICAgICAgICBzdHVicy5hZGQoc3R1Yik7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHN0dWJzOwogIH0KfQqBngBOTjwBNQE7IyQhKCEgLikuK0I9MTJCKgEVAS4eAR9FARomFilMICokIz4BGhUbExgeGB0aGSgBMScBMzYBUEgGTU9QBlFQTkdQIC1JTk9QSk8BOkdJM08BSks8UEs7KRUIOy47NhUIBgFDAU0BTzpKSUkwASxGHSUpPUkdMTABEx8PRToGAU9KTgExMDUuLD0yDykbO0VFNDsrER8lRRMhSiw/DkgMCggPCAExG0UpUS9BQStJGkktMBNKSkZSN0EMETxKNgoIBgEqMz0SHysaGzQqJjhDUEtDQztLFhoMDzFDCA0pRQYBOEQqQwFKMwFQGk1PBAFNFhsFLxQaGiAgBS0WGxsgIAU0NDc3LCwFS0dGR0VFSi4gIkVBIjZMSUlGSDQ2AUkBPiNEBgEWOj0GASY/PwE/ASEhSzcUBgFPDwdMLj4BNwFQIDROPihQIU8BLyghSRwXBgE0IUgxATUSCAEwI0YcGwoIAUtLTk4JTTsoSSElQUYBRSdQPkwgHw4MCggGAU5QRDQ9NiNAEggBKSM7HBsKCAYBEgQCAT1wYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL3BhcmFtZXRlcl9zdHViX2dlbmVyYXRvci5kYXJ0RHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvcnVudGltZV90eXBlX2dlbmVyYXRvci5kYXJ0tzQvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX2VtaXR0ZXIucnVudGltZV90eXBlX2dlbmVyYXRvcjsKCmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vZGVmZXJyZWRfbG9hZC5kYXJ0JyBzaG93IE91dHB1dFVuaXQsIE91dHB1dFVuaXREYXRhOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIGFzIGpzQXN0OwppbXBvcnQgJy4uL2pzL2pzLmRhcnQnIHNob3cganM7CmltcG9ydCAnLi4vanNfYmFja2VuZC9qc19pbnRlcm9wX2FuYWx5c2lzLmRhcnQnIGFzIGpzSW50ZXJvcEFuYWx5c2lzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmFtZXIuZGFydCcgc2hvdyBOYW1lcjsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydCcKICAgIHNob3cgUnVudGltZVR5cGVzQ2hlY2tzLCBSdW50aW1lVHlwZXNFbmNvZGVyLCBPblZhcmlhYmxlQ2FsbGJhY2s7CmltcG9ydCAnLi4vanNfYmFja2VuZC9ydW50aW1lX3R5cGVzX2NvZGVnZW4uZGFydCcKICAgIHNob3cgQ2xhc3NDaGVja3MsIENsYXNzRnVuY3Rpb25UeXBlLCBTdWJzdGl0dXRpb24sIFR5cGVDaGVjazsKaW1wb3J0ICcuLi9qc19lbWl0dGVyL3NvcnRlci5kYXJ0JzsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCcgc2hvdyBTZXRsZXQ7CgppbXBvcnQgJ2NvZGVfZW1pdHRlcl90YXNrLmRhcnQnIHNob3cgQ29kZUVtaXR0ZXJUYXNrLCBFbWl0dGVyOwoKLy8gRnVuY3Rpb24gc2lnbmF0dXJlcyB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIG9mIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbi4KdHlwZWRlZiB2b2lkIEZ1bmN0aW9uVHlwZVNpZ25hdHVyZUVtaXR0ZXIoQ2xhc3NGdW5jdGlvblR5cGUgY2xhc3NGdW5jdGlvblR5cGUpOwoKY2xhc3MgVHlwZVRlc3QgewogIGZpbmFsIGpzQXN0Lk5hbWUgbmFtZTsKICBmaW5hbCBqc0FzdC5Ob2RlIGV4cHJlc3Npb247CgogIFR5cGVUZXN0KHRoaXMubmFtZSwgdGhpcy5leHByZXNzaW9uKTsKfQoKY2xhc3MgVHlwZVRlc3RzIHsKICBUeXBlVGVzdCBpc1Rlc3Q7CiAgVHlwZVRlc3Qgc3Vic3RpdHV0aW9uOwogIFR5cGVUZXN0IHNpZ25hdHVyZTsKfQoKY2xhc3MgVHlwZVRlc3RQcm9wZXJ0aWVzIHsKICAvLy8gVGhlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiB0eXBlIGludG8gdGhlIG1ldGFkYXRhLgogIC8vLwogIC8vLyBJZiB0aGUgY2xhc3MgZG9lc24ndCBoYXZlIGEgZnVuY3Rpb24gdHlwZSB0aGlzIGZpZWxkIGlzIGBudWxsYC4KICAvLy8KICAvLy8gSWYgdGhlIGlzIHRlc3RzIHdlcmUgZ2VuZXJhdGVkIHdpdGggYHN0b3JlRnVuY3Rpb25UeXBlSW5NZXRhZGF0YWAgc2V0IHRvCiAgLy8vIGBmYWxzZWAsIHRoaXMgZmllbGQgaXMgYG51bGxgLCBhbmQgdGhlIFtwcm9wZXJ0aWVzXSBjb250YWluIGEgcHJvcGVydHkKICAvLy8gdGhhdCBlbmNvZGVzIHRoZSBmdW5jdGlvbiB0eXBlLgogIGpzQXN0LkV4cHJlc3Npb24gZnVuY3Rpb25UeXBlSW5kZXg7CgogIC8vLyBUaGUgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBwcm90b3R5cGUgb2YgdGhlCiAgLy8vIEpTIGNvbnN0cnVjdG9yIG9mIHRoZSBbQ2xhc3NFbnRpdHldIGZvciB3aGljaCB0aGUgaXMgY2hlY2tzIHdlcmUKICAvLy8gZ2VuZXJhdGVkLgogIGZpbmFsIE1hcDxDbGFzc0VudGl0eSwgVHlwZVRlc3RzPiBfcHJvcGVydGllcyA9IDxDbGFzc0VudGl0eSwgVHlwZVRlc3RzPnt9OwoKICB2b2lkIGFkZElzVGVzdChDbGFzc0VudGl0eSBjbHMsIGpzQXN0Lk5hbWUgbmFtZSwganNBc3QuTm9kZSBleHByZXNzaW9uKSB7CiAgICBUeXBlVGVzdHMgdHlwZVRlc3RzID0gX3Byb3BlcnRpZXMucHV0SWZBYnNlbnQoY2xzLCAoKSA9PiBuZXcgVHlwZVRlc3RzKCkpOwogICAgdHlwZVRlc3RzLmlzVGVzdCA9IG5ldyBUeXBlVGVzdChuYW1lLCBleHByZXNzaW9uKTsKICB9CgogIHZvaWQgYWRkU3Vic3RpdHV0aW9uKAogICAgICBDbGFzc0VudGl0eSBjbHMsIGpzQXN0Lk5hbWUgbmFtZSwganNBc3QuTm9kZSBleHByZXNzaW9uKSB7CiAgICBUeXBlVGVzdHMgdHlwZVRlc3RzID0gX3Byb3BlcnRpZXMucHV0SWZBYnNlbnQoY2xzLCAoKSA9PiBuZXcgVHlwZVRlc3RzKCkpOwogICAgdHlwZVRlc3RzLnN1YnN0aXR1dGlvbiA9IG5ldyBUeXBlVGVzdChuYW1lLCBleHByZXNzaW9uKTsKICB9CgogIHZvaWQgYWRkU2lnbmF0dXJlKENsYXNzRW50aXR5IGNscywganNBc3QuTmFtZSBuYW1lLCBqc0FzdC5Ob2RlIGV4cHJlc3Npb24pIHsKICAgIFR5cGVUZXN0cyB0eXBlVGVzdHMgPSBfcHJvcGVydGllcy5wdXRJZkFic2VudChjbHMsICgpID0+IG5ldyBUeXBlVGVzdHMoKSk7CiAgICB0eXBlVGVzdHMuc2lnbmF0dXJlID0gbmV3IFR5cGVUZXN0KG5hbWUsIGV4cHJlc3Npb24pOwogIH0KCiAgdm9pZCBmb3JFYWNoUHJvcGVydHkoCiAgICAgIFNvcnRlciBzb3J0ZXIsIHZvaWQgZihqc0FzdC5OYW1lIG5hbWUsIGpzQXN0Lk5vZGUgZXhwcmVzc2lvbikpIHsKICAgIHZvaWQgaGFuZGxlVHlwZVRlc3QoVHlwZVRlc3QgdHlwZVRlc3QpIHsKICAgICAgaWYgKHR5cGVUZXN0ID09IG51bGwpIHJldHVybjsKICAgICAgZih0eXBlVGVzdC5uYW1lLCB0eXBlVGVzdC5leHByZXNzaW9uKTsKICAgIH0KCiAgICBmb3IgKENsYXNzRW50aXR5IGNscyBpbiBzb3J0ZXIuc29ydENsYXNzZXMoX3Byb3BlcnRpZXMua2V5cykpIHsKICAgICAgVHlwZVRlc3RzIHR5cGVUZXN0cyA9IF9wcm9wZXJ0aWVzW2Nsc107CiAgICAgIGhhbmRsZVR5cGVUZXN0KHR5cGVUZXN0cy5pc1Rlc3QpOwogICAgICBoYW5kbGVUeXBlVGVzdCh0eXBlVGVzdHMuc3Vic3RpdHV0aW9uKTsKICAgICAgaGFuZGxlVHlwZVRlc3QodHlwZVRlc3RzLnNpZ25hdHVyZSk7CiAgICB9CiAgfQp9CgpjbGFzcyBSdW50aW1lVHlwZUdlbmVyYXRvciB7CiAgZmluYWwgQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwogIGZpbmFsIE91dHB1dFVuaXREYXRhIF9vdXRwdXRVbml0RGF0YTsKICBmaW5hbCBDb2RlRW1pdHRlclRhc2sgZW1pdHRlclRhc2s7CiAgZmluYWwgTmFtZXIgX25hbWVyOwogIGZpbmFsIFJ1bnRpbWVUeXBlc0NoZWNrcyBfcnRpQ2hlY2tzOwogIGZpbmFsIFJ1bnRpbWVUeXBlc0VuY29kZXIgX3J0aUVuY29kZXI7CiAgZmluYWwgX1R5cGVDb250YWluZWRJbk91dHB1dFVuaXRWaXNpdG9yIF9vdXRwdXRVbml0VmlzaXRvcjsKCiAgUnVudGltZVR5cGVHZW5lcmF0b3IodGhpcy5fY29tbW9uRWxlbWVudHMsIHRoaXMuX291dHB1dFVuaXREYXRhLAogICAgICB0aGlzLmVtaXR0ZXJUYXNrLCB0aGlzLl9uYW1lciwgdGhpcy5fcnRpQ2hlY2tzLCB0aGlzLl9ydGlFbmNvZGVyKQogICAgICA6IF9vdXRwdXRVbml0VmlzaXRvciA9IG5ldyBfVHlwZUNvbnRhaW5lZEluT3V0cHV0VW5pdFZpc2l0b3IoCiAgICAgICAgICAgIF9jb21tb25FbGVtZW50cywgX291dHB1dFVuaXREYXRhKTsKCiAgLy8vIEdlbmVyYXRlICJpcyB0ZXN0cyIgZm9yIFtjbHNdIGl0c2VsZiwgYW5kIHRoZSAiaXMgdGVzdHMiIGZvciB0aGUKICAvLy8gY2xhc3NlcyBpdCBpbXBsZW1lbnRzIGFuZCB0eXBlIGFyZ3VtZW50IHN1YnN0aXR1dGlvbiBmdW5jdGlvbnMgZm9yIHRoZXNlCiAgLy8vIHRlc3RzLiAgIFdlIGRvbid0IG5lZWQgdG8gYWRkIHRoZSAiaXMgdGVzdHMiIG9mIHRoZSBzdXBlciBjbGFzcyBiZWNhdXNlCiAgLy8vIHRoZXkgd2lsbCBiZSBpbmhlcml0ZWQgYXQgcnVudGltZSwgYnV0IHdlIG1heSBuZWVkIHRvIGdlbmVyYXRlIHRoZQogIC8vLyBzdWJzdGl0dXRpb25zLCBiZWNhdXNlIHRoZXkgbWF5IGhhdmUgY2hhbmdlZC4KCiAgLy8vIEdlbmVyYXRlcyBhbGwgcHJvcGVydGllcyBuZWNlc3NhcnkgZm9yIGlzLWNoZWNrcyBvbiB0aGUgW2NsYXNzRWxlbWVudF0uCiAgLy8vCiAgLy8vIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgW1R5cGVUZXN0UHJvcGVydGllc10gdGhhdCBjb250YWlucyB0aGUgcHJvcGVydGllcwogIC8vLyB0aGF0IG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBwcm90b3R5cGUgb2YgdGhlIEpTIGNvbnN0cnVjdG9yIG9mIHRoZQogIC8vLyBbY2xhc3NFbGVtZW50XS4KICAvLy8KICAvLy8gSWYgW3N0b3JlRnVuY3Rpb25UeXBlSW5NZXRhZGF0YV0gaXMgYHRydWVgLCBzdG9yZXMgdGhlIHJlaWZpZWQgZnVuY3Rpb24KICAvLy8gdHlwZSAoaWYgY2xhc3MgaGFzIG9uZSkgaW4gdGhlIG1ldGFkYXRhIG9iamVjdCBhbmQgc3RvcmVzIGl0cyBpbmRleCBpbgogIC8vLyB0aGUgcmVzdWx0LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgZm9yIGZ1bmN0aW9uIHR5cGVzIHRoYXQgZG8gbm90IGNvbnRhaW4KICAvLy8gdHlwZSB2YXJpYWJsZXMuCiAgVHlwZVRlc3RQcm9wZXJ0aWVzIGdlbmVyYXRlSXNUZXN0cyhDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQsCiAgICAgIE1hcDxNZW1iZXJFbnRpdHksIGpzQXN0LkV4cHJlc3Npb24+IGdlbmVyYXRlZENvZGUsCiAgICAgIHtib29sIHN0b3JlRnVuY3Rpb25UeXBlSW5NZXRhZGF0YTogdHJ1ZX0pIHsKICAgIFR5cGVUZXN0UHJvcGVydGllcyByZXN1bHQgPSBuZXcgVHlwZVRlc3RQcm9wZXJ0aWVzKCk7CgogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSW5jbHVkZSBmdW5jdGlvbiBzaWduYXR1cmVzIGluIFtDbGFzc0NoZWNrc10uCiAgICB2b2lkIGdlbmVyYXRlRnVuY3Rpb25UeXBlU2lnbmF0dXJlKENsYXNzRnVuY3Rpb25UeXBlIGNsYXNzRnVuY3Rpb25UeXBlKSB7CiAgICAgIEZ1bmN0aW9uRW50aXR5IG1ldGhvZCA9IGNsYXNzRnVuY3Rpb25UeXBlLmNhbGxGdW5jdGlvbjsKICAgICAgRnVuY3Rpb25UeXBlIHR5cGUgPSBjbGFzc0Z1bmN0aW9uVHlwZS5jYWxsVHlwZTsKCiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIHVubmVlZGVkIGZ1bmN0aW9uIHR5cGUgaW5kaWNlcyBvcgogICAgICAvLyBzaWduYXR1cmVzLiBXZSBlaXRoZXIgbmVlZCB0aGVtIGZvciBtaXJyb3JzIG9yIGJlY2F1c2UgW3R5cGVdIGlzCiAgICAgIC8vIHBvdGVudGlhbGx5IGEgc3VidHlwZSBvZiBhIGNoZWNrZWQgZnVuY3Rpb24uIEN1cnJlbnRseSB3ZSBlYWdlcmx5CiAgICAgIC8vIGdlbmVyYXRlIGEgZnVuY3Rpb24gdHlwZSBpbmRleCBvciBzaWduYXR1cmUgZm9yIGFsbCBjYWxsYWJsZSBjbGFzc2VzLgogICAgICBqc0FzdC5FeHByZXNzaW9uIGZ1bmN0aW9uVHlwZUluZGV4OwogICAgICBib29sIGlzRGVmZXJyZWQgPSBmYWxzZTsKICAgICAgaWYgKCF0eXBlLmNvbnRhaW5zVHlwZVZhcmlhYmxlcykgewogICAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IHVzZSBvdXRwdXQgdW5pdCBvZiBbbWV0aG9kXSB3aGVuIHRoZSBjbGFzc2VzIG1lbnRpb25lZAogICAgICAgIC8vIGluIFt0eXBlXSBhcmVuJ3QgaW4gdGhlIG1haW4gb3V0cHV0IHVuaXQuIChJc3N1ZSAjMzEwMzIpCiAgICAgICAgT3V0cHV0VW5pdCBtYWluT3V0cHV0VW5pdCA9IF9vdXRwdXRVbml0RGF0YS5tYWluT3V0cHV0VW5pdDsKICAgICAgICBpZiAoX291dHB1dFVuaXRWaXNpdG9yLmlzVHlwZUNvbnRhaW5lZEluKHR5cGUsIG1haW5PdXRwdXRVbml0KSkgewogICAgICAgICAgZnVuY3Rpb25UeXBlSW5kZXggPQogICAgICAgICAgICAgIGVtaXR0ZXJUYXNrLm1ldGFkYXRhQ29sbGVjdG9yLnJlaWZ5VHlwZSh0eXBlLCBtYWluT3V0cHV0VW5pdCk7CiAgICAgICAgfSBlbHNlIGlmICghc3RvcmVGdW5jdGlvblR5cGVJbk1ldGFkYXRhKSB7CiAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IHNoYXJpbmcgZGVmZXJyZWQgc2lnbmF0dXJlcyB3aXRoIHRoZQogICAgICAgICAgLy8gZnVsbCBlbWl0dGVyLgogICAgICAgICAgaXNEZWZlcnJlZCA9IHRydWU7CiAgICAgICAgICBmdW5jdGlvblR5cGVJbmRleCA9IGVtaXR0ZXJUYXNrLm1ldGFkYXRhQ29sbGVjdG9yCiAgICAgICAgICAgICAgLnJlaWZ5VHlwZSh0eXBlLCBfb3V0cHV0VW5pdERhdGEub3V0cHV0VW5pdEZvck1lbWJlcihtZXRob2QpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHN0b3JlRnVuY3Rpb25UeXBlSW5NZXRhZGF0YSAmJiBmdW5jdGlvblR5cGVJbmRleCAhPSBudWxsKSB7CiAgICAgICAgcmVzdWx0LmZ1bmN0aW9uVHlwZUluZGV4ID0gZnVuY3Rpb25UeXBlSW5kZXg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAganNBc3QuRXhwcmVzc2lvbiBlbmNvZGluZyA9CiAgICAgICAgICAgIGdlbmVyYXRlZENvZGVbY2xhc3NGdW5jdGlvblR5cGUuc2lnbmF0dXJlRnVuY3Rpb25dOwogICAgICAgIGlmIChjbGFzc0Z1bmN0aW9uVHlwZS5zaWduYXR1cmVGdW5jdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAvLyBUaGUgc2lnbmF0dXJlIGZ1bmN0aW9uIGlzbid0IGxpdmUuCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChmdW5jdGlvblR5cGVJbmRleCAhPSBudWxsKSB7CiAgICAgICAgICBpZiAoaXNEZWZlcnJlZCkgewogICAgICAgICAgICAvLyBUaGUgZnVuY3Rpb24gdHlwZSBpbmRleCBtdXN0IGJlIG9mZnNldCBieSB0aGUgbnVtYmVyIG9mIHR5cGVzCiAgICAgICAgICAgIC8vIGFscmVhZHkgbG9hZGVkLgogICAgICAgICAgICBlbmNvZGluZyA9IG5ldyBqc0FzdC5CaW5hcnkoCiAgICAgICAgICAgICAgICAnKycsCiAgICAgICAgICAgICAgICBuZXcganNBc3QuVmFyaWFibGVVc2UoX25hbWVyLnR5cGVzT2Zmc2V0TmFtZSksCiAgICAgICAgICAgICAgICBmdW5jdGlvblR5cGVJbmRleCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlbmNvZGluZyA9IGZ1bmN0aW9uVHlwZUluZGV4OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewogICAgICAgICAganNBc3QuTmFtZSBvcGVyYXRvclNpZ25hdHVyZSA9CiAgICAgICAgICAgICAgX25hbWVyLmFzTmFtZShfbmFtZXIuZml4ZWROYW1lcy5vcGVyYXRvclNpZ25hdHVyZSk7CiAgICAgICAgICByZXN1bHQuYWRkU2lnbmF0dXJlKGNsYXNzRWxlbWVudCwgb3BlcmF0b3JTaWduYXR1cmUsIGVuY29kaW5nKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB2b2lkIGdlbmVyYXRlVHlwZUNoZWNrKFR5cGVDaGVjayBjaGVjaykgewogICAgICBDbGFzc0VudGl0eSBjaGVja2VkQ2xhc3MgPSBjaGVjay5jbHM7CiAgICAgIGlmIChjaGVjay5uZWVkc0lzKSB7CiAgICAgICAgcmVzdWx0LmFkZElzVGVzdCgKICAgICAgICAgICAgY2hlY2tlZENsYXNzLCBfbmFtZXIub3BlcmF0b3JJcyhjaGVja2VkQ2xhc3MpLCBqcygnMScpKTsKICAgICAgfQogICAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gY2hlY2suc3Vic3RpdHV0aW9uOwogICAgICBpZiAoc3Vic3RpdHV0aW9uICE9IG51bGwpIHsKICAgICAgICBqc0FzdC5FeHByZXNzaW9uIGJvZHkgPQogICAgICAgICAgICBfZ2V0U3Vic3RpdHV0aW9uQ29kZShlbWl0dGVyVGFzay5lbWl0dGVyLCBzdWJzdGl0dXRpb24pOwogICAgICAgIHJlc3VsdC5hZGRTdWJzdGl0dXRpb24oCiAgICAgICAgICAgIGNoZWNrZWRDbGFzcywgX25hbWVyLnN1YnN0aXR1dGlvbk5hbWUoY2hlY2tlZENsYXNzKSwgYm9keSk7CiAgICAgIH0KICAgIH0KCiAgICBfZ2VuZXJhdGVJc1Rlc3RzT24oCiAgICAgICAgY2xhc3NFbGVtZW50LCBnZW5lcmF0ZUZ1bmN0aW9uVHlwZVNpZ25hdHVyZSwgZ2VuZXJhdGVUeXBlQ2hlY2spOwoKICAgIGlmIChjbGFzc0VsZW1lbnQgPT0gX2NvbW1vbkVsZW1lbnRzLmpzSmF2YVNjcmlwdEZ1bmN0aW9uQ2xhc3MpIHsKICAgICAgdmFyIHR5cGUgPSBqc0ludGVyb3BBbmFseXNpcy5idWlsZEpzRnVuY3Rpb25UeXBlKCk7CiAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKICAgICAgICBqc0FzdC5FeHByZXNzaW9uIHRoaXNBY2Nlc3MgPSBuZXcganNBc3QuVGhpcygpOwogICAgICAgIGpzQXN0LkV4cHJlc3Npb24gZW5jb2RpbmcgPSBfcnRpRW5jb2Rlci5nZXRTaWduYXR1cmVFbmNvZGluZygKICAgICAgICAgICAgX25hbWVyLCBlbWl0dGVyVGFzay5lbWl0dGVyLCB0eXBlLCB0aGlzQWNjZXNzKTsKICAgICAgICBqc0FzdC5OYW1lIG9wZXJhdG9yU2lnbmF0dXJlID0KICAgICAgICAgICAgX25hbWVyLmFzTmFtZShfbmFtZXIuZml4ZWROYW1lcy5vcGVyYXRvclNpZ25hdHVyZSk7CiAgICAgICAgcmVzdWx0LmFkZFNpZ25hdHVyZShjbGFzc0VsZW1lbnQsIG9wZXJhdG9yU2lnbmF0dXJlLCBlbmNvZGluZyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gQ29tcHV0ZSBhIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB0aGF0IGRlc2NyaWJlcyB0aGUgbmVjZXNzYXJ5IHN1YnN0aXR1dGlvbgogIC8vLyBmb3IgdHlwZSBhcmd1bWVudHMgaW4gYSBzdWJ0eXBlIHRlc3QuCiAgLy8vCiAgLy8vIFRoZSByZXN1bHQgY2FuIGJlOgogIC8vLyAgMSkgYG51bGxgLCBpZiBubyBzdWJzdGl0dXRlZCBjaGVjayBpcyBuZWNlc3NhcnksIGJlY2F1c2UgdGhlIHR5cGUKICAvLy8gICAgIHZhcmlhYmxlcyBhcmUgdGhlIHNhbWUgb3IgdGhlcmUgYXJlIG5vIHR5cGUgdmFyaWFibGVzIGluIHRoZSBjbGFzcwogIC8vLyAgICAgdGhhdCBpcyBjaGVja2VkIGZvci4KICAvLy8gIDIpIEEgbGlzdCBleHByZXNzaW9uIGRlc2NyaWJpbmcgdGhlIHR5cGUgYXJndW1lbnRzIHRvIGJlIHVzZWQgaW4gdGhlCiAgLy8vICAgICBzdWJ0eXBlIGNoZWNrLCBpZiB0aGUgdHlwZSBhcmd1bWVudHMgdG8gYmUgdXNlZCBpbiB0aGUgY2hlY2sgZG8gbm90CiAgLy8vICAgICBkZXBlbmQgb24gdGhlIHR5cGUgYXJndW1lbnRzIG9mIHRoZSBvYmplY3QuCiAgLy8vICAzKSBBIGZ1bmN0aW9uIG1hcHBpbmcgdGhlIHR5cGUgdmFyaWFibGVzIG9mIHRoZSBvYmplY3QgdG8gYmUgY2hlY2tlZCB0bwogIC8vLyAgICAgYSBsaXN0IGV4cHJlc3Npb24uCiAganNBc3QuRXhwcmVzc2lvbiBfZ2V0U3Vic3RpdHV0aW9uQ29kZSgKICAgICAgRW1pdHRlciBlbWl0dGVyLCBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uKSB7CiAgICBpZiAoc3Vic3RpdHV0aW9uLmlzVHJpdmlhbCkgewogICAgICByZXR1cm4gbmV3IGpzQXN0LkxpdGVyYWxOdWxsKCk7CiAgICB9CgogICAgaWYgKHN1YnN0aXR1dGlvbi5pc0pzSW50ZXJvcCkgewogICAgICByZXR1cm4ganMoJ2Z1bmN0aW9uKCkgeyByZXR1cm4gIyB9JywKICAgICAgICAgIF9ydGlFbmNvZGVyLmdldEpzSW50ZXJvcFR5cGVBcmd1bWVudHMoc3Vic3RpdHV0aW9uLmxlbmd0aCkpOwogICAgfQoKICAgIGpzQXN0LkV4cHJlc3Npb24gZGVjbGFyYXRpb24oVHlwZVZhcmlhYmxlVHlwZSB2YXJpYWJsZSkgewogICAgICByZXR1cm4gbmV3IGpzQXN0LlBhcmFtZXRlcihfZ2V0VmFyaWFibGVOYW1lKHZhcmlhYmxlLmVsZW1lbnQubmFtZSkpOwogICAgfQoKICAgIGpzQXN0LkV4cHJlc3Npb24gdXNlKFR5cGVWYXJpYWJsZVR5cGUgdmFyaWFibGUpIHsKICAgICAgcmV0dXJuIG5ldyBqc0FzdC5WYXJpYWJsZVVzZShfZ2V0VmFyaWFibGVOYW1lKHZhcmlhYmxlLmVsZW1lbnQubmFtZSkpOwogICAgfQoKICAgIGlmIChzdWJzdGl0dXRpb24uYXJndW1lbnRzLmV2ZXJ5KChEYXJ0VHlwZSB0eXBlKSA9PiB0eXBlLmlzRHluYW1pYykpIHsKICAgICAgcmV0dXJuIGVtaXR0ZXIuZ2VuZXJhdGVGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCgpOwogICAgfSBlbHNlIHsKICAgICAganNBc3QuRXhwcmVzc2lvbiB2YWx1ZSA9CiAgICAgICAgICBfZ2V0U3Vic3RpdHV0aW9uUmVwcmVzZW50YXRpb24oZW1pdHRlciwgc3Vic3RpdHV0aW9uLmFyZ3VtZW50cywgdXNlKTsKICAgICAgaWYgKHN1YnN0aXR1dGlvbi5pc0Z1bmN0aW9uKSB7CiAgICAgICAgSXRlcmFibGU8anNBc3QuRXhwcmVzc2lvbj4gZm9ybWFscyA9CiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFBhc3MgW2RlY2xhcmF0aW9uXSBkaXJlY3RseSB0byBgbWFwYCB3aGVuCiAgICAgICAgICAgIC8vIGBzdWJzdGl0dXRpb24ucGFyYW1ldGVyc2AgY2FuIG5vIGxvbmdlciBiZSBhCiAgICAgICAgICAgIC8vIGBMaXN0PFJlc29sdXRpb25EYXJ0VHlwZT5gLgogICAgICAgICAgICBzdWJzdGl0dXRpb24ucGFyYW1ldGVycy5tYXAoKHR5cGUpID0+IGRlY2xhcmF0aW9uKHR5cGUpKTsKICAgICAgICByZXR1cm4ganMoJ2Z1bmN0aW9uKCMpIHsgcmV0dXJuICMgfScsIFtmb3JtYWxzLCB2YWx1ZV0pOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBqcygnZnVuY3Rpb24oKSB7IHJldHVybiAjIH0nLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIGpzQXN0LkV4cHJlc3Npb24gX2dldFN1YnN0aXR1dGlvblJlcHJlc2VudGF0aW9uKAogICAgICBFbWl0dGVyIGVtaXR0ZXIsIExpc3Q8RGFydFR5cGU+IHR5cGVzLCBPblZhcmlhYmxlQ2FsbGJhY2sgb25WYXJpYWJsZSkgewogICAgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBlbGVtZW50cyA9IHR5cGVzCiAgICAgICAgLm1hcCgoRGFydFR5cGUgdHlwZSkgPT4KICAgICAgICAgICAgX3J0aUVuY29kZXIuZ2V0VHlwZVJlcHJlc2VudGF0aW9uKGVtaXR0ZXIsIHR5cGUsIG9uVmFyaWFibGUpKQogICAgICAgIC50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgIHJldHVybiBuZXcganNBc3QuQXJyYXlJbml0aWFsaXplcihlbGVtZW50cyk7CiAgfQoKICBTdHJpbmcgX2dldFZhcmlhYmxlTmFtZShTdHJpbmcgbmFtZSkgewogICAgLy8gS2VybmVsIHR5cGUgdmFyaWFibGUgbmFtZXMgZm9yIGFub255bW91cyBtaXhpbiBhcHBsaWNhdGlvbnMgaGF2ZSBuYW1lcwogICAgLy8gY2Fub25pY2FsaXplZCB0byBhIG5vbi1pZGVudGlmaWVkLCBlLmcuICcjVTAnLgogICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgnIycsICdfJyk7CiAgICByZXR1cm4gX25hbWVyLnNhZmVWYXJpYWJsZU5hbWUobmFtZSk7CiAgfQoKICB2b2lkIF9nZW5lcmF0ZUlzVGVzdHNPbigKICAgICAgQ2xhc3NFbnRpdHkgY2xzLAogICAgICBGdW5jdGlvblR5cGVTaWduYXR1cmVFbWl0dGVyIGdlbmVyYXRlRnVuY3Rpb25UeXBlU2lnbmF0dXJlLAogICAgICB2b2lkIGVtaXRUeXBlQ2hlY2soVHlwZUNoZWNrIGNoZWNrKSkgewogICAgU2V0bGV0PENsYXNzRW50aXR5PiBnZW5lcmF0ZWQgPSBuZXcgU2V0bGV0PENsYXNzRW50aXR5PigpOwoKICAgIC8vIFByZWNvbXB1dGVkIGlzIGNoZWNrcy4KICAgIENsYXNzQ2hlY2tzIGNsYXNzQ2hlY2tzID0gX3J0aUNoZWNrcy5yZXF1aXJlZENoZWNrc1tjbHNdOwogICAgSXRlcmFibGU8VHlwZUNoZWNrPiB0eXBlQ2hlY2tzID0gY2xhc3NDaGVja3MuY2hlY2tzOwogICAgaWYgKHR5cGVDaGVja3MgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVDaGVjayB0eXBlQ2hlY2sgaW4gdHlwZUNoZWNrcykgewogICAgICAgIGlmICghZ2VuZXJhdGVkLmNvbnRhaW5zKHR5cGVDaGVjay5jbHMpKSB7CiAgICAgICAgICBlbWl0VHlwZUNoZWNrKHR5cGVDaGVjayk7CiAgICAgICAgICBnZW5lcmF0ZWQuYWRkKHR5cGVDaGVjay5jbHMpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChjbGFzc0NoZWNrcy5mdW5jdGlvblR5cGUgIT0gbnVsbCkgewogICAgICBnZW5lcmF0ZUZ1bmN0aW9uVHlwZVNpZ25hdHVyZShjbGFzc0NoZWNrcy5mdW5jdGlvblR5cGUpOwogICAgfQogIH0KfQoKLy8vIFZpc2l0b3IgdGhhdCBjaGVja3Mgd2hldGhlciBhIHR5cGUgaXMgY29udGFpbmVkIHdpdGhpbiBvbmUgb3V0cHV0IHVuaXQuCmNsYXNzIF9UeXBlQ29udGFpbmVkSW5PdXRwdXRVbml0VmlzaXRvcgogICAgaW1wbGVtZW50cyBEYXJ0VHlwZVZpc2l0b3I8Ym9vbCwgT3V0cHV0VW5pdD4gewogIGZpbmFsIENvbW1vbkVsZW1lbnRzIF9jb21tb25FbGVtZW50czsKICBmaW5hbCBPdXRwdXRVbml0RGF0YSBfb3V0cHV0VW5pdERhdGE7CgogIF9UeXBlQ29udGFpbmVkSW5PdXRwdXRVbml0VmlzaXRvcih0aGlzLl9jb21tb25FbGVtZW50cywgdGhpcy5fb3V0cHV0VW5pdERhdGEpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGNsYXNzZXMgbWVudGlvbmVkIGluIFt0eXBlXSBhcmUgaW4gW291dHB1dFVuaXRdLgogIGJvb2wgaXNUeXBlQ29udGFpbmVkSW4oRGFydFR5cGUgdHlwZSwgT3V0cHV0VW5pdCBvdXRwdXRVbml0KSA9PgogICAgICB2aXNpdCh0eXBlLCBvdXRwdXRVbml0KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdChEYXJ0VHlwZSB0eXBlLCBPdXRwdXRVbml0IGFyZ3VtZW50KSA9PiB0eXBlLmFjY2VwdCh0aGlzLCBhcmd1bWVudCk7CgogIGJvb2wgdmlzaXRMaXN0KExpc3Q8RGFydFR5cGU+IHR5cGVzLCBPdXRwdXRVbml0IGFyZ3VtZW50KSB7CiAgICBmb3IgKERhcnRUeXBlIHR5cGUgaW4gdHlwZXMpIHsKICAgICAgaWYgKCF2aXNpdCh0eXBlLCBhcmd1bWVudCkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEZ1dHVyZU9yVHlwZShGdXR1cmVPclR5cGUgdHlwZSwgT3V0cHV0VW5pdCBhcmd1bWVudCkgewogICAgaWYgKF9vdXRwdXRVbml0RGF0YS5vdXRwdXRVbml0Rm9yQ2xhc3MoX2NvbW1vbkVsZW1lbnRzLmZ1bmN0aW9uQ2xhc3MpICE9CiAgICAgICAgYXJndW1lbnQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHZpc2l0KHR5cGUudHlwZUFyZ3VtZW50LCBhcmd1bWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgdHlwZSwgT3V0cHV0VW5pdCBhcmd1bWVudCkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIHR5cGUsIE91dHB1dFVuaXQgYXJndW1lbnQpIHsKICAgIHJldHVybiB2aXNpdCh0eXBlLnVuYWxpYXNlZCwgYXJndW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlLCBPdXRwdXRVbml0IGFyZ3VtZW50KSB7CiAgICBpZiAoX291dHB1dFVuaXREYXRhLm91dHB1dFVuaXRGb3JDbGFzcyh0eXBlLmVsZW1lbnQpICE9IGFyZ3VtZW50KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB2aXNpdExpc3QodHlwZS50eXBlQXJndW1lbnRzLCBhcmd1bWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSB0eXBlLCBPdXRwdXRVbml0IGFyZ3VtZW50KSB7CiAgICBib29sIHJlc3VsdCA9IHZpc2l0KHR5cGUucmV0dXJuVHlwZSwgYXJndW1lbnQpICYmCiAgICAgICAgdmlzaXRMaXN0KHR5cGUucGFyYW1ldGVyVHlwZXMsIGFyZ3VtZW50KSAmJgogICAgICAgIHZpc2l0TGlzdCh0eXBlLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMsIGFyZ3VtZW50KSAmJgogICAgICAgIHZpc2l0TGlzdCh0eXBlLm5hbWVkUGFyYW1ldGVyVHlwZXMsIGFyZ3VtZW50KTsKICAgIGlmICghcmVzdWx0KSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSBpbiB0eXBlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgaWYgKCF2aXNpdCh0eXBlVmFyaWFibGUuYm91bmQsIGFyZ3VtZW50KSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlVmFyaWFibGUoCiAgICAgIEZ1bmN0aW9uVHlwZVZhcmlhYmxlIHR5cGUsIE91dHB1dFVuaXQgYXJndW1lbnQpIHsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFR5cGVWYXJpYWJsZVR5cGUoVHlwZVZhcmlhYmxlVHlwZSB0eXBlLCBPdXRwdXRVbml0IGFyZ3VtZW50KSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgdHlwZSwgT3V0cHV0VW5pdCBhcmd1bWVudCkgewogICAgcmV0dXJuIHRydWU7CiAgfQp9CoF7AE5OPAEzATZAJCEhIEYuKkYyQiQoAT8BS1ABERkfASgCARITGRYCARs4BkYGT00mJgFERxFOAUxPNwQBGEFPPQQBT086BAEYRy0kLQYBRC4oLisGBAIBHSgoJRYnKT4BQ0hELwFHT05JNAFOBk9LFgZOTU8WPzkyOgFKTj42AUZKS08qHylRRERKHk0zTxsdPE0KCEY2DyRAOzASCikcTR8pFT8kEyoMCiApQkoKCAYBLiwbGkUINiIgRSBICAYBGEkBRToaOEY8J0BICAYTBAFQLAYZSU0fTE42Tx0pNCImBgEkK0cGAT5LBgE2TQYBSzgNH1AlLU48K0ZBDzUIBgQBM04sIEoiMQQBKU42JioEARsXQi0/AR4+OR4wMiQoCggGASw/BgQCAUwoMygoAVEBTUIfAQxRAT4jJBYIBhEEAQxDTRQUBi8EAQxIAQxBLAQBDEVIFAY0BAEMQzY0PDcfRDIWCAYRBAEMIjgRBAEMSxIEAQw7EQQCATtwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL3J1bnRpbWVfdHlwZV9nZW5lcmF0b3IuZGFydDlzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy91bml2ZXJzZS90YXJnZXRfY2hlY2tzLmRhcnSIVy8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQyanMudGFyZ2V0X2NoZWNrczsKCi8vLyBBIHN1bW1hcnkgb2YgdGhlIGNoZWNrcyByZXF1aXJlZCB3aGVuIGVudGVyaW5nIGEgdGFyZ2V0IG1ldGhvZC4KLy8vCi8vLyBUaGUgdGFyZ2V0IGNoZWNrcyBhcmUgdXNlZCB0byBhbm5vdGF0ZSBjYWxsIHNpdGVzIHdpdGggdGhlIGNoZWNraW5nIHJlcXVpcmVkCi8vLyBmcm9tIHRoYXQgY2FsbCBzaXRlLgovLy8KLy8vIFRoZSB0YXJnZXQgY2FuIGVpdGhlciBwZXJmb3JtIHdvcnN0LWNhc2UgY2hlY2tzIG92ZXIgYWxsIGNhbGwgc2l0ZXMsIG9yIGNhbgovLy8gYmUgZ2VuZXJhdGVkIGFzIG11bHRpcGxlIGVudHJ5IHBvaW50cyBmb3IgZGlmZmVyZW50IFRhcmdldENoZWNrcy4KLy8vCi8vLyBUaGUgVGFyZ2V0Q2hlY2tzIGF0IGEgY2FsbCBzaXRlIGNhbiBiZSByZWZpbmVkIGJ5IGFuYWx5c2lzLiAgRm9yIGV4YW1wbGUsCi8vLyB0aGUgZ2VuZXJpYyBjb3ZhcmlhbnQgY2hlY2sgZm9yIHdyaXRpbmcgaW50byBhIExpc3QgbWlnaHQgbm90IGJlIHJlcXVpcmVkCi8vLyB3aGVuIGNvcHlpbmcgdmFsdWVzIGZyb20gYSBMaXN0IGFsbG9jYXRlZCB3aXRoIHRoZSBzYW1lIHR5cGUgdmFyaWFibGUgdmFsdWUuCi8vLwovLy8gVGhlIFRhcmdldENoZWNrcyBhdCBhIGNhbGwgc2l0ZSBjYW4gYmUgdXNlZCB0byBpbmZvcm0gb3B0aW1pemF0aW9ucywgZm9yCi8vLyBleGFtcGxlLCBvbmx5IGxvd2VyaW5nIHRvIHNpbXBsZXIgaW5zdHJ1Y3Rpb25zIHdoZW4gZ2VuZXJpYyBjb3ZhcmlhbnQgY2hlY2sKLy8vIGlzIHJlcXVpcmVkLgovLy8KLy8vIFVuc291bmQgbW9kZXMgY2FuIGJlIGltcGxlbWVudGVkIGluIGEgc2NvcGVkIG1hbm5lciBieSB1c2luZyBhIFRhcmdldENoZWNrcwovLy8gdGhhdCBoYXMgZmV3ZXIgY2hlY2tzIHRoYW4gcmVxdWlyZWQgKG9yIG5vIGNoZWNrcykgaW4gdGhlIHVuc291bmQgcmVnaW9uLgpjbGFzcyBUYXJnZXRDaGVja3MgewogIC8vIFR5cGljYWwgb2YgZGlyZWN0IHN0YXRpYyBjYWxsIHNpdGVzLgogIC8vIFR5cGljYWwgb2Ygc3RhdGljIG1ldGhvZCB0YXJnZXRzIHdpdGggbm8gdGVhci1vZmZzLgogIHN0YXRpYyBmaW5hbCBUYXJnZXRDaGVja3Mgbm9uZSA9IGNvbnN0IFRhcmdldENoZWNrcy5fKGZhbHNlLCBmYWxzZSwgZmFsc2UpOwoKICAvLyBUeXBpY2FsIG9mIGNsb3N1cmUgY2FsbHMgYW5kIGR5bmFtaWMgY2FsbHMuCiAgc3RhdGljIGZpbmFsIFRhcmdldENoZWNrcyBkeW5hbWljQ2hlY2tzID0KICAgICAgY29uc3QgVGFyZ2V0Q2hlY2tzLl8odHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CgogIC8vIFR5cGljYWwgb2YgbWV0aG9kIGNhbGxzLgogIHN0YXRpYyBmaW5hbCBUYXJnZXRDaGVja3MgY292YXJpYW50Q2hlY2tzID0KICAgICAgY29uc3QgVGFyZ2V0Q2hlY2tzLl8oZmFsc2UsIHRydWUsIGZhbHNlKTsKCiAgLy8gVE9ETyhzcmEpOiBUaGlzIGNhbiBiZSBtb3JlIGZpbmUtZ3JhaW5lZCwgdGFsa2luZyBhYm91dCBpbmRpdmlkdWFsCiAgLy8gcGFyYW1ldGVycy4KICBmaW5hbCBib29sIF9jaGVja090aGVyUGFyYW1ldGVyczsKICBmaW5hbCBib29sIF9jaGVja0NvdmFyaWFudFBhcmFtZXRlcnM7CiAgZmluYWwgYm9vbCBfY2hlY2tUeXBlUGFyYW1ldGVyczsKICBjb25zdCBUYXJnZXRDaGVja3MuXygKICAgIHRoaXMuX2NoZWNrT3RoZXJQYXJhbWV0ZXJzLAogICAgdGhpcy5fY2hlY2tDb3ZhcmlhbnRQYXJhbWV0ZXJzLAogICAgdGhpcy5fY2hlY2tUeXBlUGFyYW1ldGVycywKICApOwoKICBib29sIGdldCBjaGVja1R5cGVQYXJhbWV0ZXJzID0+IF9jaGVja1R5cGVQYXJhbWV0ZXJzOwogIGJvb2wgZ2V0IGNoZWNrQ292YXJpYW50UGFyYW1ldGVycyA9PiBfY2hlY2tDb3ZhcmlhbnRQYXJhbWV0ZXJzOwogIGJvb2wgZ2V0IGNoZWNrQWxsUGFyYW1ldGVycyA9PiBfY2hlY2tPdGhlclBhcmFtZXRlcnM7Cn0KNgBOTjwBHwFEBFEZBFBGBE5OUQRNUBEEUE4VKjlOATEsLgEeLjABSBEkKCMYICQfBQE4QjgCATBwYWNrYWdlOmNvbXBpbGVyL3NyYy91bml2ZXJzZS90YXJnZXRfY2hlY2tzLmRhcnQzc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL2p1bXBfaGFuZGxlci5kYXJ0n6AvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21tb24uZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvanVtcHMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKCmltcG9ydCAnYnVpbGRlcl9rZXJuZWwuZGFydCc7CmltcG9ydCAnbG9jYWxzX2hhbmRsZXIuZGFydCc7CmltcG9ydCAnbm9kZXMuZGFydCc7CgovLy8gQSBzaW5nbGUgYnJlYWsvY29udGludWUgaW5zdHJ1Y3Rpb24uCmNsYXNzIF9KdW1wSGFuZGxlckVudHJ5IHsKICBmaW5hbCBISnVtcCBqdW1wSW5zdHJ1Y3Rpb247CiAgZmluYWwgTG9jYWxzSGFuZGxlciBsb2NhbHM7CiAgYm9vbCBpc0JyZWFrKCkgPT4ganVtcEluc3RydWN0aW9uIGlzIEhCcmVhazsKICBib29sIGlzQ29udGludWUoKSA9PiBqdW1wSW5zdHJ1Y3Rpb24gaXMgSENvbnRpbnVlOwogIF9KdW1wSGFuZGxlckVudHJ5KHRoaXMuanVtcEluc3RydWN0aW9uLCB0aGlzLmxvY2Fscyk7Cn0KCmFic3RyYWN0IGNsYXNzIEp1bXBIYW5kbGVyIHsKICBmYWN0b3J5IEp1bXBIYW5kbGVyKEtlcm5lbFNzYUdyYXBoQnVpbGRlciBidWlsZGVyLCBKdW1wVGFyZ2V0IHRhcmdldCkgewogICAgcmV0dXJuIG5ldyBUYXJnZXRKdW1wSGFuZGxlcihidWlsZGVyLCB0YXJnZXQpOwogIH0KICB2b2lkIGdlbmVyYXRlQnJlYWsoU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIFtMYWJlbERlZmluaXRpb24gbGFiZWxdKTsKICB2b2lkIGdlbmVyYXRlQ29udGludWUoU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIFtMYWJlbERlZmluaXRpb24gbGFiZWxdKTsKICB2b2lkIGZvckVhY2hCcmVhayh2b2lkIGFjdGlvbihIQnJlYWsgaW5zdHJ1Y3Rpb24sIExvY2Fsc0hhbmRsZXIgbG9jYWxzKSk7CiAgdm9pZCBmb3JFYWNoQ29udGludWUoCiAgICAgIHZvaWQgYWN0aW9uKEhDb250aW51ZSBpbnN0cnVjdGlvbiwgTG9jYWxzSGFuZGxlciBsb2NhbHMpKTsKICBib29sIGhhc0FueUNvbnRpbnVlKCk7CiAgYm9vbCBoYXNBbnlCcmVhaygpOwogIHZvaWQgY2xvc2UoKTsKICBmaW5hbCBKdW1wVGFyZ2V0IHRhcmdldDsKICBMaXN0PExhYmVsRGVmaW5pdGlvbj4gZ2V0IGxhYmVsczsKfQoKLy8vIEp1bXAgaGFuZGxlciB1c2VkIHRvIGF2b2lkIG51bGwgY2hlY2tzIHdoZW4gYSB0YXJnZXQgaXNuJ3QgdXNlZCBhcyB0aGUKLy8vIHRhcmdldCBvZiBhIGJyZWFrLCBhbmQgdGhlcmVmb3JlIGRvZXNuJ3QgbmVlZCBhIGJyZWFrIGhhbmRsZXIgYXNzb2NpYXRlZAovLy8gd2l0aCBpdC4KY2xhc3MgTnVsbEp1bXBIYW5kbGVyIGltcGxlbWVudHMgSnVtcEhhbmRsZXIgewogIGZpbmFsIERpYWdub3N0aWNSZXBvcnRlciByZXBvcnRlcjsKCiAgTnVsbEp1bXBIYW5kbGVyKHRoaXMucmVwb3J0ZXIpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGdlbmVyYXRlQnJlYWsoU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIFtMYWJlbERlZmluaXRpb24gbGFiZWxdKSB7CiAgICByZXBvcnRlci5pbnRlcm5hbEVycm9yKENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgJ051bGxKdW1wSGFuZGxlci5nZW5lcmF0ZUJyZWFrIHNob3VsZCBub3QgYmUgY2FsbGVkLicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBnZW5lcmF0ZUNvbnRpbnVlKFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uLAogICAgICBbTGFiZWxEZWZpbml0aW9uIGxhYmVsXSkgewogICAgcmVwb3J0ZXIuaW50ZXJuYWxFcnJvcihDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLAogICAgICAgICdOdWxsSnVtcEhhbmRsZXIuZ2VuZXJhdGVDb250aW51ZSBzaG91bGQgbm90IGJlIGNhbGxlZC4nKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaEJyZWFrKEZ1bmN0aW9uIGlnbm9yZWQpIHt9CiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoQ29udGludWUoRnVuY3Rpb24gaWdub3JlZCkge30KICBAb3ZlcnJpZGUKICB2b2lkIGNsb3NlKCkge30KICBAb3ZlcnJpZGUKICBib29sIGhhc0FueUNvbnRpbnVlKCkgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNBbnlCcmVhaygpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBMaXN0PExhYmVsRGVmaW5pdGlvbj4gZ2V0IGxhYmVscyA9PiBjb25zdCA8TGFiZWxEZWZpbml0aW9uPltdOwogIEBvdmVycmlkZQogIEp1bXBUYXJnZXQgZ2V0IHRhcmdldCA9PiBudWxsOwp9CgovLy8gSnVtcCBoYW5kbGVyIHRoYXQgcmVjb3JkcyBicmVha3MgdW50aWwgYSB0YXJnZXQgYmxvY2sgaXMgYXZhaWxhYmxlLgovLy8KLy8vIEJyZWFrcyBhcmUgYWx3YXlzIGZvcndhcmQganVtcHMuIENvbnRpbnVlcyBpbiBsb29wcyBhcmUgaW1wbGVtZW50ZWQgYXMKLy8vIGJyZWFrcyBvZiB0aGUgYm9keS4gQ29udGludWVzIGluIHN3aXRjaGVzIGlzIGN1cnJlbnRseSBub3QgaGFuZGxlZC4KY2xhc3MgVGFyZ2V0SnVtcEhhbmRsZXIgaW1wbGVtZW50cyBKdW1wSGFuZGxlciB7CiAgZmluYWwgS2VybmVsU3NhR3JhcGhCdWlsZGVyIGJ1aWxkZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgSnVtcFRhcmdldCB0YXJnZXQ7CiAgZmluYWwgTGlzdDxfSnVtcEhhbmRsZXJFbnRyeT4ganVtcHM7CgogIFRhcmdldEp1bXBIYW5kbGVyKEtlcm5lbFNzYUdyYXBoQnVpbGRlciBidWlsZGVyLCB0aGlzLnRhcmdldCkKICAgICAgOiB0aGlzLmJ1aWxkZXIgPSBidWlsZGVyLAogICAgICAgIGp1bXBzID0gPF9KdW1wSGFuZGxlckVudHJ5PltdIHsKICAgIGFzc2VydChidWlsZGVyLmp1bXBUYXJnZXRzW3RhcmdldF0gPT0gbnVsbCk7CiAgICBidWlsZGVyLmp1bXBUYXJnZXRzW3RhcmdldF0gPSB0aGlzOwogIH0KCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgX2Fic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgYnVpbGRlci5jbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICBAb3ZlcnJpZGUKICB2b2lkIGdlbmVyYXRlQnJlYWsoU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIFtMYWJlbERlZmluaXRpb24gbGFiZWxdKSB7CiAgICBISW5zdHJ1Y3Rpb24gYnJlYWtJbnN0cnVjdGlvbjsKICAgIGlmIChsYWJlbCA9PSBudWxsKSB7CiAgICAgIGJyZWFrSW5zdHJ1Y3Rpb24gPQogICAgICAgICAgbmV3IEhCcmVhayhfYWJzdHJhY3RWYWx1ZURvbWFpbiwgdGFyZ2V0LCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9IGVsc2UgewogICAgICBicmVha0luc3RydWN0aW9uID0KICAgICAgICAgIG5ldyBIQnJlYWsudG9MYWJlbChfYWJzdHJhY3RWYWx1ZURvbWFpbiwgbGFiZWwsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICAgIExvY2Fsc0hhbmRsZXIgbG9jYWxzID0gbmV3IExvY2Fsc0hhbmRsZXIuZnJvbShidWlsZGVyLmxvY2Fsc0hhbmRsZXIpOwogICAgYnVpbGRlci5jbG9zZShicmVha0luc3RydWN0aW9uKTsKICAgIGp1bXBzLmFkZChuZXcgX0p1bXBIYW5kbGVyRW50cnkoYnJlYWtJbnN0cnVjdGlvbiwgbG9jYWxzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGdlbmVyYXRlQ29udGludWUoU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIFtMYWJlbERlZmluaXRpb24gbGFiZWxdKSB7CiAgICBISW5zdHJ1Y3Rpb24gY29udGludWVJbnN0cnVjdGlvbjsKICAgIGlmIChsYWJlbCA9PSBudWxsKSB7CiAgICAgIGNvbnRpbnVlSW5zdHJ1Y3Rpb24gPQogICAgICAgICAgbmV3IEhDb250aW51ZShfYWJzdHJhY3RWYWx1ZURvbWFpbiwgdGFyZ2V0LCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9IGVsc2UgewogICAgICBjb250aW51ZUluc3RydWN0aW9uID0KICAgICAgICAgIG5ldyBIQ29udGludWUudG9MYWJlbChfYWJzdHJhY3RWYWx1ZURvbWFpbiwgbGFiZWwsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgLy8gU3dpdGNoIGNhc2UgY29udGludWUgc3RhdGVtZW50cyBtdXN0IGJlIGhhbmRsZWQgYnkgdGhlCiAgICAgIC8vIFtTd2l0Y2hDYXNlSnVtcEhhbmRsZXJdLgogICAgICBhc3NlcnQoIWxhYmVsLnRhcmdldC5pc1N3aXRjaENhc2UpOwogICAgfQogICAgTG9jYWxzSGFuZGxlciBsb2NhbHMgPSBuZXcgTG9jYWxzSGFuZGxlci5mcm9tKGJ1aWxkZXIubG9jYWxzSGFuZGxlcik7CiAgICBidWlsZGVyLmNsb3NlKGNvbnRpbnVlSW5zdHJ1Y3Rpb24pOwogICAganVtcHMuYWRkKG5ldyBfSnVtcEhhbmRsZXJFbnRyeShjb250aW51ZUluc3RydWN0aW9uLCBsb2NhbHMpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaEJyZWFrKEZ1bmN0aW9uIGFjdGlvbikgewogICAgZm9yIChfSnVtcEhhbmRsZXJFbnRyeSBlbnRyeSBpbiBqdW1wcykgewogICAgICBpZiAoZW50cnkuaXNCcmVhaygpKSBhY3Rpb24oZW50cnkuanVtcEluc3RydWN0aW9uLCBlbnRyeS5sb2NhbHMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoQ29udGludWUoRnVuY3Rpb24gYWN0aW9uKSB7CiAgICBmb3IgKF9KdW1wSGFuZGxlckVudHJ5IGVudHJ5IGluIGp1bXBzKSB7CiAgICAgIGlmIChlbnRyeS5pc0NvbnRpbnVlKCkpIGFjdGlvbihlbnRyeS5qdW1wSW5zdHJ1Y3Rpb24sIGVudHJ5LmxvY2Fscyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGhhc0FueUNvbnRpbnVlKCkgewogICAgZm9yIChfSnVtcEhhbmRsZXJFbnRyeSBlbnRyeSBpbiBqdW1wcykgewogICAgICBpZiAoZW50cnkuaXNDb250aW51ZSgpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaGFzQW55QnJlYWsoKSB7CiAgICBmb3IgKF9KdW1wSGFuZGxlckVudHJ5IGVudHJ5IGluIGp1bXBzKSB7CiAgICAgIGlmIChlbnRyeS5pc0JyZWFrKCkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHsKICAgIC8vIFRoZSBtYXBwaW5nIGZyb20gVGFyZ2V0RWxlbWVudCB0byBKdW1wSGFuZGxlciBpcyBubyBsb25nZXIgbmVlZGVkLgogICAgYnVpbGRlci5qdW1wVGFyZ2V0cy5yZW1vdmUodGFyZ2V0KTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8TGFiZWxEZWZpbml0aW9uPiBnZXQgbGFiZWxzIHsKICAgIExpc3Q8TGFiZWxEZWZpbml0aW9uPiByZXN1bHQgPSBudWxsOwogICAgZm9yIChMYWJlbERlZmluaXRpb24gZWxlbWVudCBpbiB0YXJnZXQubGFiZWxzKSB7CiAgICAgIHJlc3VsdCA/Pz0gPExhYmVsRGVmaW5pdGlvbj5bXTsKICAgICAgcmVzdWx0LmFkZChlbGVtZW50KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQgPz8gY29uc3QgPExhYmVsRGVmaW5pdGlvbj5bXTsKICB9Cn0KCi8vLyBTcGVjaWFsIFtKdW1wSGFuZGxlcl0gaW1wbGVtZW50YXRpb24gdXNlZCB0byBoYW5kbGUgY29udGludWUgc3RhdGVtZW50cwovLy8gdGFyZ2V0aW5nIHN3aXRjaCBjYXNlcy4KYWJzdHJhY3QgY2xhc3MgU3dpdGNoQ2FzZUp1bXBIYW5kbGVyIGV4dGVuZHMgVGFyZ2V0SnVtcEhhbmRsZXIgewogIC8vLyBNYXAgZnJvbSBzd2l0Y2ggY2FzZSB0YXJnZXRzIHRvIGluZGljZXMgdXNlZCB0byBlbmNvZGUgdGhlIGZsb3cgb2YgdGhlCiAgLy8vIHN3aXRjaCBjYXNlIGxvb3AuCiAgZmluYWwgTWFwPEp1bXBUYXJnZXQsIGludD4gdGFyZ2V0SW5kZXhNYXAgPSBuZXcgTWFwPEp1bXBUYXJnZXQsIGludD4oKTsKCiAgU3dpdGNoQ2FzZUp1bXBIYW5kbGVyKEtlcm5lbFNzYUdyYXBoQnVpbGRlciBidWlsZGVyLCBKdW1wVGFyZ2V0IHRhcmdldCkKICAgICAgOiBzdXBlcihidWlsZGVyLCB0YXJnZXQpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGdlbmVyYXRlQnJlYWsoU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIFtMYWJlbERlZmluaXRpb24gbGFiZWxdKSB7CiAgICBpZiAobGFiZWwgPT0gbnVsbCkgewogICAgICAvLyBDcmVhdGVzIGEgc3BlY2lhbCBicmVhayBpbnN0cnVjdGlvbiBmb3IgdGhlIHN5bnRoZXRpYyBsb29wIGdlbmVyYXRlZAogICAgICAvLyBmb3IgYSBzd2l0Y2ggc3RhdGVtZW50IHdpdGggY29udGludWUgc3RhdGVtZW50cy4gU2VlCiAgICAgIC8vIFtTc2FGcm9tQXN0TWl4aW4uYnVpbGRDb21wbGV4U3dpdGNoU3RhdGVtZW50XSBmb3IgZGV0YWlsLgoKICAgICAgSEluc3RydWN0aW9uIGJyZWFrSW5zdHJ1Y3Rpb24gPSBuZXcgSEJyZWFrKAogICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4sIHRhcmdldCwgc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgICBicmVha1N3aXRjaENvbnRpbnVlTG9vcDogdHJ1ZSk7CiAgICAgIExvY2Fsc0hhbmRsZXIgbG9jYWxzID0gbmV3IExvY2Fsc0hhbmRsZXIuZnJvbShidWlsZGVyLmxvY2Fsc0hhbmRsZXIpOwogICAgICBidWlsZGVyLmNsb3NlKGJyZWFrSW5zdHJ1Y3Rpb24pOwogICAgICBqdW1wcy5hZGQobmV3IF9KdW1wSGFuZGxlckVudHJ5KGJyZWFrSW5zdHJ1Y3Rpb24sIGxvY2FscykpOwogICAgfSBlbHNlIHsKICAgICAgc3VwZXIuZ2VuZXJhdGVCcmVhayhzb3VyY2VJbmZvcm1hdGlvbiwgbGFiZWwpOwogICAgfQogIH0KCiAgYm9vbCBpc0NvbnRpbnVlVG9Td2l0Y2hDYXNlKExhYmVsRGVmaW5pdGlvbiBsYWJlbCkgewogICAgcmV0dXJuIGxhYmVsICE9IG51bGwgJiYgdGFyZ2V0SW5kZXhNYXAuY29udGFpbnNLZXkobGFiZWwudGFyZ2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZ2VuZXJhdGVDb250aW51ZShTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgW0xhYmVsRGVmaW5pdGlvbiBsYWJlbF0pIHsKICAgIGlmIChpc0NvbnRpbnVlVG9Td2l0Y2hDYXNlKGxhYmVsKSkgewogICAgICAvLyBDcmVhdGVzIHRoZSBzcGVjaWFsIGluc3RydWN0aW9ucyAnbGFiZWwgPSBpOyBjb250aW51ZSBsOycgdXNlZCBpbgogICAgICAvLyBzd2l0Y2ggc3RhdGVtZW50cyB3aXRoIGNvbnRpbnVlIHN0YXRlbWVudHMuIFNlZQogICAgICAvLyBbU3NhRnJvbUFzdE1peGluLmJ1aWxkQ29tcGxleFN3aXRjaFN0YXRlbWVudF0gZm9yIGRldGFpbC4KCiAgICAgIGFzc2VydChsYWJlbCAhPSBudWxsKTsKICAgICAgSEluc3RydWN0aW9uIHZhbHVlID0gYnVpbGRlci5ncmFwaAogICAgICAgICAgLmFkZENvbnN0YW50SW50KHRhcmdldEluZGV4TWFwW2xhYmVsLnRhcmdldF0sIGJ1aWxkZXIuY2xvc2VkV29ybGQpOwogICAgICBidWlsZGVyLmxvY2Fsc0hhbmRsZXIudXBkYXRlTG9jYWwodGFyZ2V0LCB2YWx1ZSk7CgogICAgICBhc3NlcnQobGFiZWwudGFyZ2V0LmxhYmVscy5jb250YWlucyhsYWJlbCkpOwogICAgICBISW5zdHJ1Y3Rpb24gY29udGludWVJbnN0cnVjdGlvbiA9CiAgICAgICAgICBuZXcgSENvbnRpbnVlKF9hYnN0cmFjdFZhbHVlRG9tYWluLCB0YXJnZXQsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgTG9jYWxzSGFuZGxlciBsb2NhbHMgPSBuZXcgTG9jYWxzSGFuZGxlci5mcm9tKGJ1aWxkZXIubG9jYWxzSGFuZGxlcik7CiAgICAgIGJ1aWxkZXIuY2xvc2UoY29udGludWVJbnN0cnVjdGlvbik7CiAgICAgIGp1bXBzLmFkZChuZXcgX0p1bXBIYW5kbGVyRW50cnkoY29udGludWVJbnN0cnVjdGlvbiwgbG9jYWxzKSk7CiAgICB9IGVsc2UgewogICAgICBzdXBlci5nZW5lcmF0ZUNvbnRpbnVlKHNvdXJjZUluZm9ybWF0aW9uLCBsYWJlbCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsb3NlKCkgewogICAgLy8gVGhlIG1hcHBpbmcgZnJvbSBUYXJnZXRFbGVtZW50IHRvIEp1bXBIYW5kbGVyIGlzIG5vIGxvbmdlciBuZWVkZWQuCiAgICBmb3IgKEp1bXBUYXJnZXQgdGFyZ2V0IGluIHRhcmdldEluZGV4TWFwLmtleXMpIHsKICAgICAgYnVpbGRlci5qdW1wVGFyZ2V0cy5yZW1vdmUodGFyZ2V0KTsKICAgIH0KICAgIHN1cGVyLmNsb3NlKCk7CiAgfQp9CoD5AE5OPAEZITEoAR4eFQEpGh8eLzU4AgEdSjMEOiA9IEwYQRkWEBskAgFLTQ0vJQEiAQw6ITZABAEMPSE2QwQBDCkMLAwSDCIMHwEMQQwhAgFIBEtIMScMGycBQCAoMSgEATIvAQw6ISMZGUcNGU4GSiVABAEMPSEmGRxKDRxRQCIqBkooQwQBDCctSAYEAQwqLUsGBAEMGi0rBhIEAQwXLSgGEgQBDBFKKAQBDCUpNSYbBjAEAgFMHEFNGEoBSiABDDohGU4+QwEyOypMJ0INNQYEATdGBAEMPSEpSzlDAR0pTjgBMylKTCpFDTgGBAEMEUo1KgYTBAIBKnBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9qdW1wX2hhbmRsZXIuZGFydDxzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9zc2Eva2VybmVsX3N0cmluZ19idWlsZGVyLmRhcnSJ4S8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICdidWlsZGVyX2tlcm5lbC5kYXJ0JzsKaW1wb3J0ICdub2Rlcy5kYXJ0JzsKCi8vLyBWaXNpdHMgYW5kIGNvbmNhdGVuYXRlcyB0aGUgZXhwcmVzc2lvbnMgaW4gYSBzdHJpbmcgY29uY2F0ZW5hdGlvbi4KY2xhc3MgS2VybmVsU3RyaW5nQnVpbGRlciBleHRlbmRzIGlyLlZpc2l0b3IgewogIGZpbmFsIEtlcm5lbFNzYUdyYXBoQnVpbGRlciBidWlsZGVyOwoKICAvLy8gVGhlIHN0cmluZyB2YWx1ZSBnZW5lcmF0ZWQgc28gZmFyLgogIEhJbnN0cnVjdGlvbiByZXN1bHQgPSBudWxsOwoKICBLZXJuZWxTdHJpbmdCdWlsZGVyKHRoaXMuYnVpbGRlcik7CgogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IF9hYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIGJ1aWxkZXIuY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbjsKCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0Tm9kZShpci5Ob2RlIG5vZGUpIHsKICAgIGZhaWxlZEF0KENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsICdVbmV4cGVjdGVkIG5vZGU6ICRub2RlJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRFeHByZXNzaW9uKGlyLkV4cHJlc3Npb24gbm9kZSkgewogICAgbm9kZS5hY2NlcHQoYnVpbGRlcik7CiAgICBISW5zdHJ1Y3Rpb24gZXhwcmVzc2lvbiA9IGJ1aWxkZXIucG9wKCk7CgogICAgLy8gV2Ugd2FudCB0byB1c2UgSFN0cmluZ2lmeSB3aGVuOgogICAgLy8gICAxLiBUaGUgdmFsdWUgaXMga25vd24gdG8gYmUgYSBwcmltaXRpdmUgdHlwZSwgYmVjYXVzZSBpdCBtaWdodCBnZXQKICAgIC8vICAgICAgY29uc3RhbnQtZm9sZGVkIGFuZCBjb2RlZ2VuIGhhcyBzb21lIHRyaWNrcyB3aXRoIEphdmFTY3JpcHQKICAgIC8vICAgICAgY29udmVyc2lvbnMuCiAgICAvLyAgIDIuIFRoZSB2YWx1ZSBjYW4gYmUgcHJpbWl0aXZlLCBiZWNhdXNlIHRoZSBsaWJyYXJ5IHN0cmluZ2lmaWVyIGhhcwogICAgLy8gICAgICBmYXN0LXBhdGggY29kZSBmb3IgbW9zdCBwcmltaXRpdmVzLgogICAgaWYgKGV4cHJlc3Npb24uaXNQcmltaXRpdmUoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgIGFwcGVuZChzdHJpbmdpZnkoZXhwcmVzc2lvbikpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gVE9ETyhlZm9ydHVuYSk6IElmIHdlIGRlY2lkZSB0byBkbyBpbmxpbmluZyBiZWZvcmUgZmluaXNoaW5nIGNvbnN0cnVjdGluZwogICAgLy8gdGhlIGNvbnRyb2wgZmxvdyBncmFwaCwgd2UnZCB3YW50IHRvIGRvIHRoZSBvcHRpbWl6YXRpb24gb2YKICAgIC8vIGNhbGxpbmcgdG9TdHJpbmcgaGVyZSBpZiB0aGUgdHlwZSBpcyBwcm92YWJseSBhIHN0cmluZyByYXRoZXIgdGhhbiBpbiB0aGUKICAgIC8vIG9wdGltaXphdGlvbiBwaGFzZSAod2hpY2ggaXMgd2hlcmUgd2UgY3VycmVudGx5IGRvIGl0KS4KCiAgICBhcHBlbmQoc3RyaW5naWZ5KGV4cHJlc3Npb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKGlyLlN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgewogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgdm9pZCBhcHBlbmQoSEluc3RydWN0aW9uIGV4cHJlc3Npb24pIHsKICAgIHJlc3VsdCA9IChyZXN1bHQgPT0gbnVsbCkgPyBleHByZXNzaW9uIDogY29uY2F0KHJlc3VsdCwgZXhwcmVzc2lvbik7CiAgfQoKICBISW5zdHJ1Y3Rpb24gY29uY2F0KEhJbnN0cnVjdGlvbiBsZWZ0LCBISW5zdHJ1Y3Rpb24gcmlnaHQpIHsKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9CiAgICAgICAgbmV3IEhTdHJpbmdDb25jYXQobGVmdCwgcmlnaHQsIF9hYnN0cmFjdFZhbHVlRG9tYWluLnN0cmluZ1R5cGUpOwogICAgYnVpbGRlci5hZGQoaW5zdHJ1Y3Rpb24pOwogICAgcmV0dXJuIGluc3RydWN0aW9uOwogIH0KCiAgSEluc3RydWN0aW9uIHN0cmluZ2lmeShISW5zdHJ1Y3Rpb24gZXhwcmVzc2lvbikgewogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0KICAgICAgICBuZXcgSFN0cmluZ2lmeShleHByZXNzaW9uLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5zdHJpbmdUeXBlKQogICAgICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IGV4cHJlc3Npb24uc291cmNlSW5mb3JtYXRpb247CiAgICBidWlsZGVyLmFkZChpbnN0cnVjdGlvbik7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb247CiAgfQp9Ck4ATk48ASgBGTEeFQFHLycBKR4BJQEyLwEMI0MEAQwvGi0BJ0xIGUwwSiUOBgFRQ1E/ASMEAQw/HgQBKUkEAT8fSR4YBAE0H0Q+HhgEAgEzcGFja2FnZTpjb21waWxlci9zcmMvc3NhL2tlcm5lbF9zdHJpbmdfYnVpbGRlci5kYXJ0NXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NzYS9sb2NhbHNfaGFuZGxlci5kYXJ0wABxxy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2Nsb3N1cmUuZGFydCc7CmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCc7CmltcG9ydCAnLi4vanNfYmFja2VuZC9uYXRpdmVfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ludGVyY2VwdG9yX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vanNfbW9kZWwvY2xvc3VyZS5kYXJ0JyBzaG93IEpSZWNvcmRGaWVsZCwgSkNsb3N1cmVGaWVsZDsKaW1wb3J0ICcuLi9qc19tb2RlbC9sb2NhbHMuZGFydCcgc2hvdyBKTG9jYWw7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CgppbXBvcnQgJ2J1aWxkZXJfa2VybmVsLmRhcnQnOwppbXBvcnQgJ25vZGVzLmRhcnQnOwppbXBvcnQgJ3R5cGVzLmRhcnQnOwoKLy8vIEtlZXBzIHRyYWNrIG9mIGxvY2FscyAoaW5jbHVkaW5nIHBhcmFtZXRlcnMgYW5kIHBoaXMpIHdoZW4gYnVpbGRpbmcuIFRoZQovLy8gJ3RoaXMnIHJlZmVyZW5jZSBpcyB0cmVhdGVkIGFzIHBhcmFtZXRlciBhbmQgaGVuY2UgaGFuZGxlZCBieSB0aGlzIGNsYXNzLAovLy8gdG9vLgpjbGFzcyBMb2NhbHNIYW5kbGVyIHsKICAvLy8gVGhlIHZhbHVlcyBvZiBsb2NhbHMgdGhhdCBjYW4gYmUgZGlyZWN0bHkgYWNjZXNzZWQgKHdpdGhvdXQgcmVkaXJlY3Rpb25zCiAgLy8vIHRvIGJveGVzIG9yIGNsb3N1cmUtZmllbGRzKS4KICAvLy8KICAvLy8gW2RpcmVjdExvY2Fsc10gaXMgaXRlcmF0ZWQsIHNvIGl0IGlzICJpbnNlcnRpb24gb3JkZXJlZCIgdG8gbWFrZSB0aGUKICAvLy8gaXRlcmF0aW9uIG9yZGVyIGEgZnVuY3Rpb24gb25seSBvZiBpbnNlcnRpb25zIGFuZCBub3QgYSBmdW5jdGlvbiBvZgogIC8vLyBlLmcuIEVsZW1lbnQgaGFzaCBjb2Rlcy4gIEknZCBwcmVmZXIgdG8gdXNlIGEgU29ydGVkTWFwIGJ1dCBzb21lIGVsZW1lbnRzCiAgLy8vIGRvbid0IGhhdmUgc291cmNlIGxvY2F0aW9ucyBmb3IgW0VsZW1lbnRzLmNvbXBhcmVCeVBvc2l0aW9uXS4KICBNYXA8TG9jYWwsIEhJbnN0cnVjdGlvbj4gZGlyZWN0TG9jYWxzID0gbmV3IE1hcDxMb2NhbCwgSEluc3RydWN0aW9uPigpOwogIE1hcDxMb2NhbCwgRmllbGRFbnRpdHk+IHJlZGlyZWN0aW9uTWFwcGluZyA9IG5ldyBNYXA8TG9jYWwsIEZpZWxkRW50aXR5PigpOwogIGZpbmFsIEtlcm5lbFNzYUdyYXBoQnVpbGRlciBidWlsZGVyOwogIFNjb3BlSW5mbyBzY29wZUluZm87CiAgTWFwPFR5cGVWYXJpYWJsZVR5cGUsIFR5cGVWYXJpYWJsZUxvY2FsPiB0eXBlVmFyaWFibGVMb2NhbHMgPQogICAgICBuZXcgTWFwPFR5cGVWYXJpYWJsZVR5cGUsIFR5cGVWYXJpYWJsZUxvY2FsPigpOwogIGZpbmFsIEVudGl0eSBleGVjdXRhYmxlQ29udGV4dDsKICBmaW5hbCBNZW1iZXJFbnRpdHkgbWVtYmVyQ29udGV4dDsKCiAgLy8vIFRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLiBgbnVsbGAgaWYgaW4gYSBzdGF0aWMgY29udGV4dC4KICAvLy8KICAvLy8gVGhpcyBpcyB0aGUgdHlwZSBvZiBgdGhpc2AgaXMgdGhlIGN1cnJlbnQgY29udGV4dCwgYW5kIGlzIG9mdGVuIHRoZQogIC8vLyAndGhpcyB0eXBlJyBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzIG9mIGEgbWVtYmVyLgogIC8vLwogIC8vLyBJZiB0aGUgY3VycmVudCBpbnN0YW5jZSBpcyBjb25jcmV0ZSwgd2UgY2FuIGhhbmRsZSBmaXhlZCB0eXBlIGFyZ3VtZW50IGluCiAgLy8vIGNhc2Ugb2YgaW5saW5pbmcuIEZvciBpbnN0YW5jZSwgY2hlY2tpbmcgYCdmb28nYCBhZ2FpbnN0IGBTdHJpbmdgIGluc3RlYWQKICAvLy8gb2YgYFRgIGluIGBtYWluYDoKICAvLy8KICAvLy8gICAgIGNsYXNzIEZvbzxUPiB7CiAgLy8vICAgICAgIFQgZmllbGQ7CiAgLy8vICAgICAgIEZvbyh0aGlzLmZpZWxkKTsKICAvLy8gICAgIH0KICAvLy8gICAgIG1haW4oKSB7CiAgLy8vICAgICAgIG5ldyBGb288U3RyaW5nPignZm9vJyk7CiAgLy8vICAgICB9CiAgLy8vCiAgZmluYWwgSW50ZXJmYWNlVHlwZSBpbnN0YW5jZVR5cGU7CgogIGZpbmFsIE5hdGl2ZURhdGEgX25hdGl2ZURhdGE7CgogIGZpbmFsIEludGVyY2VwdG9yRGF0YSBfaW50ZXJjZXB0b3JEYXRhOwoKICBMb2NhbHNIYW5kbGVyKHRoaXMuYnVpbGRlciwgdGhpcy5leGVjdXRhYmxlQ29udGV4dCwgdGhpcy5tZW1iZXJDb250ZXh0LAogICAgICB0aGlzLmluc3RhbmNlVHlwZSwgdGhpcy5fbmF0aXZlRGF0YSwgdGhpcy5faW50ZXJjZXB0b3JEYXRhKTsKCiAgSkNsb3NlZFdvcmxkIGdldCBfY2xvc2VkV29ybGQgPT4gYnVpbGRlci5jbG9zZWRXb3JsZDsKCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgX2Fic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgX2Nsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW47CgogIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIGdldCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyA9PgogICAgICBidWlsZGVyLmdsb2JhbEluZmVyZW5jZVJlc3VsdHM7CgogIC8vLyBTdWJzdGl0dXRlZCB0eXBlIHZhcmlhYmxlcyBvY2N1cnJpbmcgaW4gW3R5cGVdIGludG8gdGhlIGNvbnRleHQgb2YKICAvLy8gW2NvbnRleHRDbGFzc10uCiAgRGFydFR5cGUgc3Vic3RJbkNvbnRleHQoRGFydFR5cGUgdHlwZSkgewogICAgRGFydFR5cGUgbmV3VHlwZSA9IHR5cGU7CiAgICBpZiAoaW5zdGFuY2VUeXBlICE9IG51bGwpIHsKICAgICAgQ2xhc3NFbnRpdHkgdHlwZUNvbnRleHQgPSBEYXJ0VHlwZXMuZ2V0Q2xhc3NDb250ZXh0KG5ld1R5cGUpOwogICAgICBpZiAodHlwZUNvbnRleHQgIT0gbnVsbCkgewogICAgICAgIG5ld1R5cGUgPSBfY2xvc2VkV29ybGQuZGFydFR5cGVzLnN1YnN0QnlDb250ZXh0KAogICAgICAgICAgICBuZXdUeXBlLAogICAgICAgICAgICBfY2xvc2VkV29ybGQuZGFydFR5cGVzLmFzSW5zdGFuY2VPZigKICAgICAgICAgICAgICAgIF9jbG9zZWRXb3JsZC5kYXJ0VHlwZXMuZ2V0VGhpc1R5cGUoaW5zdGFuY2VUeXBlLmVsZW1lbnQpLAogICAgICAgICAgICAgICAgdHlwZUNvbnRleHQpKTsKICAgICAgfQogICAgICBpZiAoIWluc3RhbmNlVHlwZS5jb250YWluc1R5cGVWYXJpYWJsZXMpIHsKICAgICAgICBuZXdUeXBlID0gX2Nsb3NlZFdvcmxkLmRhcnRUeXBlcy5zdWJzdEJ5Q29udGV4dChuZXdUeXBlLCBpbnN0YW5jZVR5cGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3VHlwZTsKICB9CgogIC8vLyBDcmVhdGVzIGEgbmV3IFtMb2NhbHNIYW5kbGVyXSBiYXNlZCBvbiBbb3RoZXJdLiBXZSBvbmx5IG5lZWQgdG8KICAvLy8gY29weSB0aGUgW2RpcmVjdExvY2Fsc10sIHNpbmNlIHRoZSBvdGhlciBmaWVsZHMgY2FuIGJlIHNoYXJlZAogIC8vLyB0aHJvdWdob3V0IHRoZSBBU1QgdmlzaXQuCiAgTG9jYWxzSGFuZGxlci5mcm9tKExvY2Fsc0hhbmRsZXIgb3RoZXIpCiAgICAgIDogZGlyZWN0TG9jYWxzID0gbmV3IE1hcDxMb2NhbCwgSEluc3RydWN0aW9uPi5mcm9tKG90aGVyLmRpcmVjdExvY2FscyksCiAgICAgICAgcmVkaXJlY3Rpb25NYXBwaW5nID0gb3RoZXIucmVkaXJlY3Rpb25NYXBwaW5nLAogICAgICAgIGV4ZWN1dGFibGVDb250ZXh0ID0gb3RoZXIuZXhlY3V0YWJsZUNvbnRleHQsCiAgICAgICAgbWVtYmVyQ29udGV4dCA9IG90aGVyLm1lbWJlckNvbnRleHQsCiAgICAgICAgaW5zdGFuY2VUeXBlID0gb3RoZXIuaW5zdGFuY2VUeXBlLAogICAgICAgIGJ1aWxkZXIgPSBvdGhlci5idWlsZGVyLAogICAgICAgIHNjb3BlSW5mbyA9IG90aGVyLnNjb3BlSW5mbywKICAgICAgICBfbmF0aXZlRGF0YSA9IG90aGVyLl9uYXRpdmVEYXRhLAogICAgICAgIF9pbnRlcmNlcHRvckRhdGEgPSBvdGhlci5faW50ZXJjZXB0b3JEYXRhLAogICAgICAgIGFjdGl2YXRpb25WYXJpYWJsZXMgPSBvdGhlci5hY3RpdmF0aW9uVmFyaWFibGVzLAogICAgICAgIGNhY2hlZFR5cGVPZlRoaXMgPSBvdGhlci5jYWNoZWRUeXBlT2ZUaGlzLAogICAgICAgIGNhY2hlZFR5cGVzT2ZDYXB0dXJlZFZhcmlhYmxlcyA9IG90aGVyLmNhY2hlZFR5cGVzT2ZDYXB0dXJlZFZhcmlhYmxlczsKCiAgLy8vIFJlZGlyZWN0cyBhY2Nlc3NlcyBmcm9tIGVsZW1lbnQgW2Zyb21dIHRvIGVsZW1lbnQgW3RvXS4gVGhlIFt0b10gZWxlbWVudAogIC8vLyBtdXN0IGJlIGEgYm94ZWQgdmFyaWFibGUgb3IgYSB2YXJpYWJsZSB0aGF0IGlzIHN0b3JlZCBpbiBhIGNsb3N1cmUtZmllbGQuCiAgdm9pZCByZWRpcmVjdEVsZW1lbnQoTG9jYWwgZnJvbSwgRmllbGRFbnRpdHkgdG8pIHsKICAgIGFzc2VydChyZWRpcmVjdGlvbk1hcHBpbmdbZnJvbV0gPT0gbnVsbCk7CiAgICByZWRpcmVjdGlvbk1hcHBpbmdbZnJvbV0gPSB0bzsKICAgIGFzc2VydChpc1N0b3JlZEluQ2xvc3VyZUZpZWxkKGZyb20pIHx8IGlzQm94ZWQoZnJvbSkpOwogIH0KCiAgSEluc3RydWN0aW9uIGNyZWF0ZUJveChTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgSEluc3RydWN0aW9uIGJveCA9IG5ldyBIQ3JlYXRlQm94KF9hYnN0cmFjdFZhbHVlRG9tYWluLm5vbk51bGxUeXBlKQogICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICBidWlsZGVyLmFkZChib3gpOwogICAgcmV0dXJuIGJveDsKICB9CgogIC8vLyBJZiB0aGUgc2NvcGUgKGZ1bmN0aW9uIG9yIGxvb3ApIFtub2RlXSBoYXMgY2FwdHVyZWQgdmFyaWFibGVzIHRoZW4gdGhpcwogIC8vLyBtZXRob2QgY3JlYXRlcyBhIGJveCBhbmQgc2V0cyB1cCB0aGUgcmVkaXJlY3Rpb25zLgogIHZvaWQgZW50ZXJTY29wZSgKICAgICAgQ2FwdHVyZWRTY29wZSBjbG9zdXJlSW5mbywgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb24sCiAgICAgIHtib29sIGZvckdlbmVyYXRpdmVDb25zdHJ1Y3RvckJvZHk6IGZhbHNlLCBISW5zdHJ1Y3Rpb24gaW5saW5lZEJveH0pIHsKICAgIC8vIFNlZSBpZiBhbnkgdmFyaWFibGUgaW4gdGhlIHRvcC1zY29wZSBvZiB0aGUgZnVuY3Rpb24gaXMgY2FwdHVyZWQuIElmIHllcwogICAgLy8gd2UgbmVlZCB0byBjcmVhdGUgYSBib3gtb2JqZWN0LgogICAgaWYgKCFjbG9zdXJlSW5mby5yZXF1aXJlc0NvbnRleHRCb3gpIHJldHVybjsKICAgIEhJbnN0cnVjdGlvbiBib3g7CiAgICAvLyBUaGUgc2NvcGUgaGFzIGNhcHR1cmVkIHZhcmlhYmxlcy4KICAgIGlmIChmb3JHZW5lcmF0aXZlQ29uc3RydWN0b3JCb2R5KSB7CiAgICAgIC8vIFRoZSBib3ggaXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBib2R5LgogICAgICBib3ggPSBpbmxpbmVkQm94ID8/CiAgICAgICAgICBidWlsZGVyLmFkZFBhcmFtZXRlcigKICAgICAgICAgICAgICBjbG9zdXJlSW5mby5jb250ZXh0LCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5ub25OdWxsVHlwZSk7CiAgICB9IGVsc2UgewogICAgICBib3ggPSBjcmVhdGVCb3goc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogICAgLy8gQWRkIHRoZSBib3ggdG8gdGhlIGtub3duIGxvY2Fscy4KICAgIGRpcmVjdExvY2Fsc1tjbG9zdXJlSW5mby5jb250ZXh0XSA9IGJveDsKICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFjY2Vzc2VzIHRvIHRoZSBib3hlZCBsb2NhbHMgZ28gaW50byB0aGUgYm94LiBXZSBhbHNvCiAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHBhcmFtZXRlcnMgYXJlIGNvcGllZCBpbnRvIHRoZSBib3ggaWYgbmVjZXNzYXJ5LgogICAgY2xvc3VyZUluZm8uZm9yRWFjaEJveGVkVmFyaWFibGUoKExvY2FsIGZyb20sIEZpZWxkRW50aXR5IHRvKSB7CiAgICAgIC8vIFRoZSBbZnJvbV0gY2FuIG9ubHkgYmUgYSBwYXJhbWV0ZXIgZm9yIGZ1bmN0aW9uLXNjb3BlcyBhbmQgbm90CiAgICAgIC8vIGxvb3Agc2NvcGVzLgogICAgICBKTG9jYWwgakZyb20gPSBmcm9tOwogICAgICBib29sIGlzUGFyYW1ldGVyID0gakZyb20uaXNSZWd1bGFyUGFyYW1ldGVyOwogICAgICBhc3NlcnQoaXNQYXJhbWV0ZXIgIT0gbnVsbCk7CiAgICAgIGlmIChpc1BhcmFtZXRlciAmJiAhZm9yR2VuZXJhdGl2ZUNvbnN0cnVjdG9yQm9keSkgewogICAgICAgIC8vIE5vdyB0aGF0IHRoZSByZWRpcmVjdGlvbiBpcyBzZXQgdXAsIHRoZSB1cGRhdGUgdG8gdGhlIGxvY2FsIHdpbGwKICAgICAgICAvLyB3cml0ZSB0aGUgcGFyYW1ldGVyIHZhbHVlIGludG8gdGhlIGJveC4KICAgICAgICAvLyBTdG9yZSB0aGUgY2FwdHVyZWQgcGFyYW1ldGVyIGluIHRoZSBib3guIEdldCB0aGUgY3VycmVudCB2YWx1ZQogICAgICAgIC8vIGJlZm9yZSB3ZSBwdXQgdGhlIHJlZGlyZWN0aW9uIGluIHBsYWNlLgogICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gdXBkYXRlIHRoZSBsb2NhbCBmb3IgYSBnZW5lcmF0aXZlCiAgICAgICAgLy8gY29uc3RydWN0b3IgYm9keSwgYmVjYXVzZSBpdCByZWNlaXZlcyBhIGJveCB0aGF0IGFscmVhZHkKICAgICAgICAvLyBjb250YWlucyB0aGUgdXBkYXRlcyBhcyB0aGUgbGFzdCBwYXJhbWV0ZXIuCiAgICAgICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gcmVhZExvY2FsKGZyb20pOwogICAgICAgIHJlZGlyZWN0RWxlbWVudChmcm9tLCB0byk7CiAgICAgICAgdXBkYXRlTG9jYWwoZnJvbSwgaW5zdHJ1Y3Rpb24pOwogICAgICB9IGVsc2UgewogICAgICAgIHJlZGlyZWN0RWxlbWVudChmcm9tLCB0byk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgLy8vIFJlcGxhY2VzIHRoZSBjdXJyZW50IGJveCB3aXRoIGEgbmV3IGJveCBhbmQgY29waWVzIG92ZXIgdGhlIGdpdmVuIGxpc3QKICAvLy8gb2YgZWxlbWVudHMgZnJvbSB0aGUgb2xkIGJveCBpbnRvIHRoZSBuZXcgYm94LgogIHZvaWQgdXBkYXRlQ2FwdHVyZUJveChMb2NhbCBjdXJyZW50Qm94LCBMaXN0PExvY2FsPiB0b0JlQ29waWVkRWxlbWVudHMsCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAvLyBDcmVhdGUgYSBuZXcgYm94IGFuZCBjb3B5IG92ZXIgdGhlIHZhbHVlcyBmcm9tIHRoZSBvbGQgYm94IGludG8gdGhlCiAgICAvLyBuZXcgb25lLgogICAgSEluc3RydWN0aW9uIG9sZEJveCA9IHJlYWRMb2NhbChjdXJyZW50Qm94KTsKICAgIEhJbnN0cnVjdGlvbiBuZXdCb3ggPSBjcmVhdGVCb3goc291cmNlSW5mb3JtYXRpb24pOwogICAgZm9yIChMb2NhbCBib3hlZFZhcmlhYmxlIGluIHRvQmVDb3BpZWRFbGVtZW50cykgewogICAgICAvLyBbcmVhZExvY2FsXSB1c2VzIHRoZSBbY3VycmVudEJveF0gdG8gZmluZCBpdHMgYm94LiBCeSByZXBsYWNpbmcgaXQKICAgICAgLy8gYmVoaW5kIGl0cyBiYWNrIHdlIGNhbiBzdGlsbCBnZXQgdG8gdGhlIG9sZCB2YWx1ZXMuCiAgICAgIHVwZGF0ZUxvY2FsKGN1cnJlbnRCb3gsIG9sZEJveCk7CiAgICAgIEhJbnN0cnVjdGlvbiBvbGRWYWx1ZSA9IHJlYWRMb2NhbChib3hlZFZhcmlhYmxlKTsKICAgICAgdXBkYXRlTG9jYWwoY3VycmVudEJveCwgbmV3Qm94KTsKICAgICAgdXBkYXRlTG9jYWwoYm94ZWRWYXJpYWJsZSwgb2xkVmFsdWUpOwogICAgfQogICAgdXBkYXRlTG9jYWwoY3VycmVudEJveCwgbmV3Qm94KTsKICB9CgogIC8vLyBEb2N1bWVudGF0aW9uIHdhbnRlZCAtLSBqb2hubml3aW50aGVyCiAgLy8vCiAgLy8vIEludmFyaWFudDogW2Z1bmN0aW9uXSBtdXN0IGJlIGFuIGltcGxlbWVudGF0aW9uIGVsZW1lbnQuCiAgdm9pZCBzdGFydEZ1bmN0aW9uKAogICAgICBNZW1iZXJFbnRpdHkgZWxlbWVudCwKICAgICAgU2NvcGVJbmZvIHNjb3BlSW5mbywKICAgICAgQ2FwdHVyZWRTY29wZSBzY29wZURhdGEsCiAgICAgIE1hcDxMb2NhbCwgQWJzdHJhY3RWYWx1ZT4gcGFyYW1ldGVycywKICAgICAgU2V0PExvY2FsPiBlbGlkZWRQYXJhbWV0ZXJzLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAge2Jvb2wgaXNHZW5lcmF0aXZlQ29uc3RydWN0b3JCb2R5fSkgewogICAgdGhpcy5zY29wZUluZm8gPSBzY29wZUluZm87CgogICAgcGFyYW1ldGVycy5mb3JFYWNoKChMb2NhbCBsb2NhbCwgQWJzdHJhY3RWYWx1ZSB0eXBlTWFzaykgewogICAgICBpZiAoaXNHZW5lcmF0aXZlQ29uc3RydWN0b3JCb2R5KSB7CiAgICAgICAgaWYgKHNjb3BlRGF0YS5pc0JveGVkVmFyaWFibGUobG9jYWwpKSB7CiAgICAgICAgICAvLyBUaGUgcGFyYW1ldGVyIHdpbGwgYmUgYSBmaWVsZCBpbiB0aGUgYm94IHBhc3NlZCBhcyB0aGUKICAgICAgICAgIC8vIGxhc3QgcGFyYW1ldGVyLiBTbyBubyBuZWVkIHRvIGhhdmUgaXQuCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIEhJbnN0cnVjdGlvbiBwYXJhbWV0ZXIgPSBidWlsZGVyLmFkZFBhcmFtZXRlcihsb2NhbCwgdHlwZU1hc2ssCiAgICAgICAgICBpc0VsaWRlZDogZWxpZGVkUGFyYW1ldGVycy5jb250YWlucyhsb2NhbCkpOwogICAgICBidWlsZGVyLnBhcmFtZXRlcnNbbG9jYWxdID0gcGFyYW1ldGVyOwogICAgICBkaXJlY3RMb2NhbHNbbG9jYWxdID0gcGFyYW1ldGVyOwogICAgfSk7CiAgICBidWlsZGVyLmVsaWRlZFBhcmFtZXRlcnMgPSBlbGlkZWRQYXJhbWV0ZXJzOwoKICAgIGVudGVyU2NvcGUoc2NvcGVEYXRhLCBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAgICBmb3JHZW5lcmF0aXZlQ29uc3RydWN0b3JCb2R5OiBpc0dlbmVyYXRpdmVDb25zdHJ1Y3RvckJvZHkpOwoKICAgIC8vIFdoZW4gd2UgcmVtb3ZlIHRoZSBlbGVtZW50IG1vZGVsLCB3ZSBjYW4ganVzdCB1c2UgdGhlIGZpcnN0IGNoZWNrCiAgICAvLyAoYmVjYXVzZSB0aGUgdW5kZXJseWluZyBlbGVtZW50cyB3b24ndCBhbGwgYmUgKmJvdGgqIFNjb3BlSW5mb3MgYW5kCiAgICAvLyBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvcykuCiAgICBpZiAoc2NvcGVJbmZvIGlzIENsb3N1cmVSZXByZXNlbnRhdGlvbkluZm8gJiYgc2NvcGVJbmZvLmlzQ2xvc3VyZSkgewogICAgICBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvIGNsb3N1cmVEYXRhID0gc2NvcGVJbmZvOwogICAgICAvLyBJZiB0aGUgZnJlZVZhcmlhYmxlTWFwcGluZyBpcyBub3QgZW1wdHksIHRoZW4gdGhpcyBmdW5jdGlvbiB3YXMgYQogICAgICAvLyBuZXN0ZWQgY2xvc3VyZSB0aGF0IGNhcHR1cmVzIHZhcmlhYmxlcy4gUmVkaXJlY3QgdGhlIGNhcHR1cmVkCiAgICAgIC8vIHZhcmlhYmxlcyB0byBmaWVsZHMgaW4gdGhlIGNsb3N1cmUuCiAgICAgIGNsb3N1cmVEYXRhLmZvckVhY2hGcmVlVmFyaWFibGUoKExvY2FsIGZyb20sIEZpZWxkRW50aXR5IHRvKSB7CiAgICAgICAgcmVkaXJlY3RFbGVtZW50KGZyb20sIHRvKTsKICAgICAgfSk7CiAgICAgIC8vIEluc2lkZSBjbG9zdXJlIHJlZGlyZWN0IHJlZmVyZW5jZXMgdG8gaXRzZWxmIHRvIFs6dGhpczpdLgogICAgICBIVGhpcyB0aGlzSW5zdHJ1Y3Rpb24gPQogICAgICAgICAgbmV3IEhUaGlzKGNsb3N1cmVEYXRhLnRoaXNMb2NhbCwgX2Fic3RyYWN0VmFsdWVEb21haW4ubm9uTnVsbFR5cGUpOwogICAgICBidWlsZGVyLmdyYXBoLnRoaXNJbnN0cnVjdGlvbiA9IHRoaXNJbnN0cnVjdGlvbjsKICAgICAgYnVpbGRlci5ncmFwaC5lbnRyeS5hZGRBdEVudHJ5KHRoaXNJbnN0cnVjdGlvbik7CiAgICAgIHVwZGF0ZUxvY2FsKGNsb3N1cmVEYXRhLmNsb3N1cmVFbnRpdHksIHRoaXNJbnN0cnVjdGlvbik7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICAvLyBPbmNlIGNsb3N1cmVzIGhhdmUgYmVlbiBtYXBwZWQgdG8gY2xhc3NlcyB0aGVpciBpbnN0YW5jZSBtZW1iZXJzIG1pZ2h0CiAgICAgIC8vIG5vdCBoYXZlIGFueSB0aGlzRWxlbWVudCBpZiB0aGUgY2xvc3VyZSB3YXMgY3JlYXRlZCBpbnNpZGUgYSBzdGF0aWMKICAgICAgLy8gY29udGV4dC4KICAgICAgSFRoaXMgdGhpc0luc3RydWN0aW9uID0gbmV3IEhUaGlzKHNjb3BlSW5mby50aGlzTG9jYWwsIGdldFR5cGVPZlRoaXMoKSk7CiAgICAgIGJ1aWxkZXIuZ3JhcGgudGhpc0luc3RydWN0aW9uID0gdGhpc0luc3RydWN0aW9uOwogICAgICBidWlsZGVyLmdyYXBoLmVudHJ5LmFkZEF0RW50cnkodGhpc0luc3RydWN0aW9uKTsKICAgICAgZGlyZWN0TG9jYWxzW3Njb3BlSW5mby50aGlzTG9jYWxdID0gdGhpc0luc3RydWN0aW9uOwogICAgfQoKICAgIC8vIElmIHRoaXMgbWV0aG9kIGlzIGFuIGludGVyY2VwdGVkIG1ldGhvZCwgYWRkIHRoZSBleHRyYQogICAgLy8gcGFyYW1ldGVyIHRvIGl0LCB0aGF0IGlzIHRoZSBhY3R1YWwgcmVjZWl2ZXIgZm9yIGludGVyY2VwdGVkCiAgICAvLyBjbGFzc2VzLCBvciB0aGUgc2FtZSBhcyBbOnRoaXM6XSBmb3Igbm9uLWludGVyY2VwdGVkIGNsYXNzZXMuCiAgICBDbGFzc0VudGl0eSBjbHMgPSBlbGVtZW50LmVuY2xvc2luZ0NsYXNzOwoKICAgIC8vIFdoZW4gdGhlIGNsYXNzIGV4dGVuZHMgYSBuYXRpdmUgY2xhc3MsIHRoZSBpbnN0YW5jZSBpcyBwcmUtY29uc3RydWN0ZWQKICAgIC8vIGFuZCBwYXNzZWQgdG8gdGhlIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgZmFjdG9yeSBmdW5jdGlvbiBhcyBhIHBhcmFtZXRlci4KICAgIC8vIEluc3RlYWQgb2YgYWxsb2NhdGluZyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBvYmplY3QsIHRoZSBjb25zdHJ1Y3RvcgogICAgLy8gJ3VwZ3JhZGVzJyB0aGUgbmF0aXZlIHN1YmNsYXNzIG9iamVjdCBieSBpbml0aWFsaXppbmcgdGhlIERhcnQgZmllbGRzLgogICAgYm9vbCBpc05hdGl2ZVVwZ3JhZGVGYWN0b3J5ID0gZWxlbWVudCBpcyBDb25zdHJ1Y3RvckVudGl0eSAmJgogICAgICAgIGVsZW1lbnQuaXNHZW5lcmF0aXZlQ29uc3RydWN0b3IgJiYKICAgICAgICBfbmF0aXZlRGF0YS5pc05hdGl2ZU9yRXh0ZW5kc05hdGl2ZShjbHMpOwogICAgaWYgKF9pbnRlcmNlcHRvckRhdGEuaXNJbnRlcmNlcHRlZE1ldGhvZChlbGVtZW50KSkgewogICAgICBib29sIGlzSW50ZXJjZXB0ZWRDbGFzcyA9IF9pbnRlcmNlcHRvckRhdGEuaXNJbnRlcmNlcHRlZENsYXNzKGNscyk7CiAgICAgIFN0cmluZyBuYW1lID0gaXNJbnRlcmNlcHRlZENsYXNzID8gJ3JlY2VpdmVyJyA6ICdfJzsKICAgICAgU3ludGhldGljTG9jYWwgcGFyYW1ldGVyID0gY3JlYXRlTG9jYWwobmFtZSk7CiAgICAgIEhQYXJhbWV0ZXJWYWx1ZSB2YWx1ZSA9IG5ldyBIUGFyYW1ldGVyVmFsdWUocGFyYW1ldGVyLCBnZXRUeXBlT2ZUaGlzKCkpOwogICAgICBidWlsZGVyLmdyYXBoLmV4cGxpY2l0UmVjZWl2ZXJQYXJhbWV0ZXIgPSB2YWx1ZTsKICAgICAgYnVpbGRlci5ncmFwaC5lbnRyeS5hZGRBZnRlcihkaXJlY3RMb2NhbHNbc2NvcGVJbmZvLnRoaXNMb2NhbF0sIHZhbHVlKTsKICAgICAgaWYgKGJ1aWxkZXIubGFzdEFkZGVkUGFyYW1ldGVyID09IG51bGwpIHsKICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaW5zZXJ0ZWQsIG1ha2Ugc3VyZSBpdCBzdGF5cyBmaXJzdC4KICAgICAgICBidWlsZGVyLmxhc3RBZGRlZFBhcmFtZXRlciA9IHZhbHVlOwogICAgICB9CiAgICAgIGlmIChpc0ludGVyY2VwdGVkQ2xhc3MpIHsKICAgICAgICAvLyBPbmx5IHVzZSB0aGUgZXh0cmEgcGFyYW1ldGVyIGluIGludGVyY2VwdGVkIGNsYXNzZXMuCiAgICAgICAgZGlyZWN0TG9jYWxzW3Njb3BlSW5mby50aGlzTG9jYWxdID0gdmFsdWU7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaXNOYXRpdmVVcGdyYWRlRmFjdG9yeSkgewogICAgICBTeW50aGV0aWNMb2NhbCBwYXJhbWV0ZXIgPSBjcmVhdGVMb2NhbCgncmVjZWl2ZXInKTsKICAgICAgLy8gVW5saWtlIGB0aGlzYCwgcmVjZWl2ZXIgaXMgbnVsbGFibGUgc2luY2UgZGlyZWN0IGNhbGxzIHRvIGdlbmVyYXRpdmUKICAgICAgLy8gY29uc3RydWN0b3IgY2FsbCB0aGUgY29uc3RydWN0b3Igd2l0aCBgbnVsbGAuCiAgICAgIEhQYXJhbWV0ZXJWYWx1ZSB2YWx1ZSA9IG5ldyBIUGFyYW1ldGVyVmFsdWUoCiAgICAgICAgICBwYXJhbWV0ZXIsIF9jbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU51bGxhYmxlRXhhY3QoY2xzKSk7CiAgICAgIGJ1aWxkZXIuZ3JhcGguZXhwbGljaXRSZWNlaXZlclBhcmFtZXRlciA9IHZhbHVlOwogICAgICBidWlsZGVyLmdyYXBoLmVudHJ5LmFkZEF0RW50cnkodmFsdWUpOwogICAgICBpZiAoYnVpbGRlci5sYXN0QWRkZWRQYXJhbWV0ZXIgPT0gbnVsbCkgewogICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHBhcmFtZXRlciBpbnNlcnRlZCwgbWFrZSBzdXJlIGl0IHN0YXlzIGZpcnN0LgogICAgICAgIGJ1aWxkZXIubGFzdEFkZGVkUGFyYW1ldGVyID0gdmFsdWU7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGxvY2FsIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseS4gQm94ZWQgdmFyaWFibGVzIG9yCiAgLy8vIGNhcHR1cmVkIHZhcmlhYmxlcyB0aGF0IGFyZSBzdG9yZWQgaW4gdGhlIGNsb3N1cmUtZmllbGQgcmV0dXJuIFs6ZmFsc2U6XS4KICBib29sIGlzQWNjZXNzZWREaXJlY3RseShMb2NhbCBsb2NhbCkgewogICAgYXNzZXJ0KGxvY2FsICE9IG51bGwpOwogICAgcmV0dXJuICFyZWRpcmVjdGlvbk1hcHBpbmcuY29udGFpbnNLZXkobG9jYWwpICYmCiAgICAgICAgIXNjb3BlSW5mby5sb2NhbElzVXNlZEluVHJ5T3JTeW5jKGxvY2FsKTsKICB9CgogIGJvb2wgaXNTdG9yZWRJbkNsb3N1cmVGaWVsZChMb2NhbCBsb2NhbCkgewogICAgYXNzZXJ0KGxvY2FsICE9IG51bGwpOwogICAgaWYgKGlzQWNjZXNzZWREaXJlY3RseShsb2NhbCkpIHJldHVybiBmYWxzZTsKICAgIGlmIChzY29wZUluZm8gaXMhIENsb3N1cmVSZXByZXNlbnRhdGlvbkluZm8pIHJldHVybiBmYWxzZTsKICAgIEZpZWxkRW50aXR5IHJlZGlyZWN0VGFyZ2V0ID0gcmVkaXJlY3Rpb25NYXBwaW5nW2xvY2FsXTsKICAgIGlmIChyZWRpcmVjdFRhcmdldCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gcmVkaXJlY3RUYXJnZXQgaXMgSkNsb3N1cmVGaWVsZDsKICB9CgogIGJvb2wgaXNCb3hlZChMb2NhbCBsb2NhbCkgewogICAgaWYgKGlzQWNjZXNzZWREaXJlY3RseShsb2NhbCkpIHJldHVybiBmYWxzZTsKICAgIGlmIChpc1N0b3JlZEluQ2xvc3VyZUZpZWxkKGxvY2FsKSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHJlZGlyZWN0aW9uTWFwcGluZy5jb250YWluc0tleShsb2NhbCk7CiAgfQoKICBib29sIF9pc1VzZWRJblRyeU9yR2VuZXJhdG9yKExvY2FsIGxvY2FsKSB7CiAgICByZXR1cm4gc2NvcGVJbmZvLmxvY2FsSXNVc2VkSW5UcnlPclN5bmMobG9jYWwpOwogIH0KCiAgLy8vIFJldHVybnMgYW4gW0hJbnN0cnVjdGlvbl0gZm9yIHRoZSBnaXZlbiBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCBpcwogIC8vLyBib3hlZCBvciBzdG9yZWQgaW4gYSBjbG9zdXJlIHRoZW4gdGhlIG1ldGhvZCBnZW5lcmF0ZXMgY29kZSB0byByZXRyaWV2ZQogIC8vLyB0aGUgdmFsdWUuCiAgSEluc3RydWN0aW9uIHJlYWRMb2NhbChMb2NhbCBsb2NhbCwge1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAgaWYgKGlzQWNjZXNzZWREaXJlY3RseShsb2NhbCkpIHsKICAgICAgaWYgKGRpcmVjdExvY2Fsc1tsb2NhbF0gPT0gbnVsbCkgewogICAgICAgIGlmIChsb2NhbCBpcyBUeXBlVmFyaWFibGVMb2NhbCkgewogICAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgICAgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRSwKICAgICAgICAgICAgICAiUnVudGltZSB0eXBlIGluZm9ybWF0aW9uIG5vdCBhdmFpbGFibGUgZm9yICRsb2NhbCAiCiAgICAgICAgICAgICAgImluICR7ZGlyZWN0TG9jYWxzLmtleXN9IGZvciAkZXhlY3V0YWJsZUNvbnRleHQuIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICAgIGxvY2FsLAogICAgICAgICAgICAgICJDYW5ub3QgZmluZCB2YWx1ZSAkbG9jYWwgaW4gJHtkaXJlY3RMb2NhbHMua2V5c30gZm9yICIKICAgICAgICAgICAgICAiJGV4ZWN1dGFibGVDb250ZXh0LiIpOwogICAgICAgIH0KICAgICAgfQogICAgICBISW5zdHJ1Y3Rpb24gdmFsdWUgPSBkaXJlY3RMb2NhbHNbbG9jYWxdOwogICAgICBpZiAoc291cmNlSW5mb3JtYXRpb24gIT0gbnVsbCkgewogICAgICAgIHZhbHVlID0gbmV3IEhSZWYodmFsdWUsIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgICAgICBidWlsZGVyLmFkZCh2YWx1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlOwogICAgfSBlbHNlIGlmIChpc1N0b3JlZEluQ2xvc3VyZUZpZWxkKGxvY2FsKSkgewogICAgICBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvIGNsb3N1cmVEYXRhID0gc2NvcGVJbmZvOwogICAgICBGaWVsZEVudGl0eSByZWRpcmVjdCA9IHJlZGlyZWN0aW9uTWFwcGluZ1tsb2NhbF07CiAgICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IHJlYWRMb2NhbChjbG9zdXJlRGF0YS5jbG9zdXJlRW50aXR5KTsKICAgICAgQWJzdHJhY3RWYWx1ZSB0eXBlID0gbG9jYWwgaXMgQm94TG9jYWwKICAgICAgICAgID8gX2Fic3RyYWN0VmFsdWVEb21haW4ubm9uTnVsbFR5cGUKICAgICAgICAgIDogZ2V0VHlwZU9mQ2FwdHVyZWRWYXJpYWJsZShyZWRpcmVjdCk7CiAgICAgIEhJbnN0cnVjdGlvbiBmaWVsZEdldCA9CiAgICAgICAgICBuZXcgSEZpZWxkR2V0KHJlZGlyZWN0LCByZWNlaXZlciwgdHlwZSwgc291cmNlSW5mb3JtYXRpb24pOwogICAgICBidWlsZGVyLmFkZChmaWVsZEdldCk7CiAgICAgIHJldHVybiBmaWVsZEdldDsKICAgIH0gZWxzZSBpZiAoaXNCb3hlZChsb2NhbCkpIHsKICAgICAgRmllbGRFbnRpdHkgcmVkaXJlY3QgPSByZWRpcmVjdGlvbk1hcHBpbmdbbG9jYWxdOwogICAgICBCb3hMb2NhbCBsb2NhbEJveDsKICAgICAgLy8gSW4gdGhlIGZ1bmN0aW9uIHRoYXQgZGVjbGFyZXMgdGhlIGNhcHR1cmVkIHZhcmlhYmxlIHRoZSBib3ggaXMKICAgICAgLy8gYWNjZXNzZWQgYXMgZGlyZWN0IGxvY2FsLiBJbnNpZGUgdGhlIG5lc3RlZCBjbG9zdXJlIHRoZSBib3ggaXMKICAgICAgLy8gYWNjZXNzZWQgdGhyb3VnaCBhIGNsb3N1cmUtZmllbGQuCiAgICAgIC8vIENhbGxpbmcgW3JlYWRMb2NhbF0gbWFrZXMgc3VyZSB3ZSBnZW5lcmF0ZSB0aGUgY29ycmVjdCBjb2RlIHRvIGdldAogICAgICAvLyB0aGUgYm94LgogICAgICBpZiAocmVkaXJlY3QgaXMgSlJlY29yZEZpZWxkKSB7CiAgICAgICAgbG9jYWxCb3ggPSByZWRpcmVjdC5ib3g7CiAgICAgIH0KICAgICAgYXNzZXJ0KGxvY2FsQm94ICE9IG51bGwpOwoKICAgICAgSEluc3RydWN0aW9uIGJveCA9IHJlYWRMb2NhbChsb2NhbEJveCk7CiAgICAgIEhJbnN0cnVjdGlvbiBsb29rdXAgPSBuZXcgSEZpZWxkR2V0KHJlZGlyZWN0LCBib3gsCiAgICAgICAgICBnZXRUeXBlT2ZDYXB0dXJlZFZhcmlhYmxlKHJlZGlyZWN0KSwgc291cmNlSW5mb3JtYXRpb24pOwogICAgICBidWlsZGVyLmFkZChsb29rdXApOwogICAgICByZXR1cm4gbG9va3VwOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KF9pc1VzZWRJblRyeU9yR2VuZXJhdG9yKGxvY2FsKSk7CiAgICAgIEhMb2NhbFZhbHVlIGxvY2FsVmFsdWUgPSBnZXRMb2NhbChsb2NhbCk7CiAgICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IG5ldyBITG9jYWxHZXQobG9jYWwsIGxvY2FsVmFsdWUsCiAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSwgc291cmNlSW5mb3JtYXRpb24pOwogICAgICBidWlsZGVyLmFkZChpbnN0cnVjdGlvbik7CiAgICAgIHJldHVybiBpbnN0cnVjdGlvbjsKICAgIH0KICB9CgogIEhJbnN0cnVjdGlvbiByZWFkVGhpcyh7U291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb259KSB7CiAgICBISW5zdHJ1Y3Rpb24gcmVzID0KICAgICAgICByZWFkTG9jYWwoc2NvcGVJbmZvLnRoaXNMb2NhbCwgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIGlmIChyZXMuaW5zdHJ1Y3Rpb25UeXBlID09IG51bGwpIHsKICAgICAgcmVzLmluc3RydWN0aW9uVHlwZSA9IGdldFR5cGVPZlRoaXMoKTsKICAgIH0KICAgIHJldHVybiByZXM7CiAgfQoKICBITG9jYWxWYWx1ZSBnZXRMb2NhbChMb2NhbCBsb2NhbCwge1NvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9ufSkgewogICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSBwYXJhbWV0ZXIsIHdlIGFscmVhZHkgaGF2ZSBhCiAgICAvLyBIUGFyYW1ldGVyVmFsdWUgZm9yIGl0LiBXZSBjYW5ub3QgY3JlYXRlIGFub3RoZXIgb25lIGJlY2F1c2UKICAgIC8vIGl0IGNvdWxkIHRoZW4gaGF2ZSBhbm90aGVyIG5hbWUgdGhhbiB0aGUgcmVhbCBwYXJhbWV0ZXIuIEFuZAogICAgLy8gdGhlIG90aGVyIG9uZSB3b3VsZCBub3Qga25vdyBpdCBpcyBqdXN0IGEgY29weSBvZiB0aGUgcmVhbAogICAgLy8gcGFyYW1ldGVyLgogICAgaWYgKGJ1aWxkZXIucGFyYW1ldGVycy5jb250YWluc0tleShsb2NhbCkpIHsKICAgICAgcmV0dXJuIGJ1aWxkZXIucGFyYW1ldGVyc1tsb2NhbF07CiAgICB9CgogICAgcmV0dXJuIGFjdGl2YXRpb25WYXJpYWJsZXMucHV0SWZBYnNlbnQobG9jYWwsICgpIHsKICAgICAgSExvY2FsVmFsdWUgbG9jYWxWYWx1ZSA9CiAgICAgICAgICBuZXcgSExvY2FsVmFsdWUobG9jYWwsIF9hYnN0cmFjdFZhbHVlRG9tYWluLm5vbk51bGxUeXBlKQogICAgICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb247CiAgICAgIGJ1aWxkZXIuZ3JhcGguZW50cnkuYWRkQXRFeGl0KGxvY2FsVmFsdWUpOwogICAgICByZXR1cm4gbG9jYWxWYWx1ZTsKICAgIH0pOwogIH0KCiAgTG9jYWwgZ2V0VHlwZVZhcmlhYmxlQXNMb2NhbChUeXBlVmFyaWFibGVUeXBlIHR5cGUpIHsKICAgIHJldHVybiB0eXBlVmFyaWFibGVMb2NhbHMucHV0SWZBYnNlbnQodHlwZSwgKCkgewogICAgICByZXR1cm4gbmV3IFR5cGVWYXJpYWJsZUxvY2FsKHR5cGUpOwogICAgfSk7CiAgfQoKICAvLy8gU2V0cyB0aGUgW2VsZW1lbnRdIHRvIFt2YWx1ZV0uIElmIHRoZSBlbGVtZW50IGlzIGJveGVkIG9yIHN0b3JlZCBpbiBhCiAgLy8vIGNsb3N1cmUgdGhlbiB0aGUgbWV0aG9kIGdlbmVyYXRlcyBjb2RlIHRvIHNldCB0aGUgdmFsdWUuCiAgdm9pZCB1cGRhdGVMb2NhbChMb2NhbCBsb2NhbCwgSEluc3RydWN0aW9uIHZhbHVlLAogICAgICB7U291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb259KSB7CiAgICBpZiAodmFsdWUgaXMgSFJlZikgewogICAgICBIUmVmIHJlZiA9IHZhbHVlOwogICAgICB2YWx1ZSA9IHJlZi52YWx1ZTsKICAgIH0KICAgIGFzc2VydCghaXNTdG9yZWRJbkNsb3N1cmVGaWVsZChsb2NhbCksCiAgICAgICAgIkxvY2FsICRsb2NhbCBpcyBzdG9yZWQgaW4gYSBjbG9zdXJlIGZpZWxkLiIpOwogICAgaWYgKGlzQWNjZXNzZWREaXJlY3RseShsb2NhbCkpIHsKICAgICAgZGlyZWN0TG9jYWxzW2xvY2FsXSA9IHZhbHVlOwogICAgfSBlbHNlIGlmIChpc0JveGVkKGxvY2FsKSkgewogICAgICBGaWVsZEVudGl0eSByZWRpcmVjdCA9IHJlZGlyZWN0aW9uTWFwcGluZ1tsb2NhbF07CiAgICAgIGFzc2VydChyZWRpcmVjdCAhPSBudWxsKTsKICAgICAgQm94TG9jYWwgbG9jYWxCb3g7CiAgICAgIGlmIChyZWRpcmVjdCBpcyBKUmVjb3JkRmllbGQpIHsKICAgICAgICBsb2NhbEJveCA9IHJlZGlyZWN0LmJveDsKICAgICAgfQogICAgICBhc3NlcnQobG9jYWxCb3ggIT0gbnVsbCk7CgogICAgICAvLyBUaGUgYm94IGl0c2VsZiBjb3VsZCBiZSBjYXB0dXJlZCwgb3IgYmUgbG9jYWwuIEEgbG9jYWwgdmFyaWFibGUgdGhhdAogICAgICAvLyBpcyBjYXB0dXJlZCB3aWxsIGJlIGJveGVkLCBidXQgdGhlIGJveCBpdHNlbGYgd2lsbCBiZSBhIGxvY2FsLgogICAgICAvLyBJbnNpZGUgdGhlIGNsb3N1cmUgdGhlIGJveCBpcyBzdG9yZWQgaW4gYSBjbG9zdXJlLWZpZWxkIGFuZCBjYW5ub3QKICAgICAgLy8gYmUgYWNjZXNzZWQgZGlyZWN0bHkuCiAgICAgIEhJbnN0cnVjdGlvbiBib3ggPSByZWFkTG9jYWwobG9jYWxCb3gpOwogICAgICBidWlsZGVyLmFkZChuZXcgSEZpZWxkU2V0KF9hYnN0cmFjdFZhbHVlRG9tYWluLCByZWRpcmVjdCwgYm94LCB2YWx1ZSkKICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KF9pc1VzZWRJblRyeU9yR2VuZXJhdG9yKGxvY2FsKSk7CiAgICAgIEhMb2NhbFZhbHVlIGxvY2FsVmFsdWUgPSBnZXRMb2NhbChsb2NhbCk7CiAgICAgIGJ1aWxkZXIuYWRkKG5ldyBITG9jYWxTZXQoX2Fic3RyYWN0VmFsdWVEb21haW4sIGxvY2FsLCBsb2NhbFZhbHVlLCB2YWx1ZSkKICAgICAgICAuLnNvdXJjZUluZm9ybWF0aW9uID0gc291cmNlSW5mb3JtYXRpb24pOwogICAgfQogIH0KCiAgLy8vIFRoaXMgZnVuY3Rpb24sIHN0YXJ0TG9vcCwgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHZpc2l0aW5nIGFueSBjaGlsZHJlbiBvZgogIC8vLyB0aGUgbG9vcC4gSW4gcGFydGljdWxhciBpdCBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIGV4ZWN1dGluZyB0aGUKICAvLy8gaW5pdGlhbGl6ZXJzLgogIC8vLwogIC8vLyBUaGUgW0xvY2Fsc0hhbmRsZXJdIHdpbGwgbWFrZSB0aGUgYm94ZXMgYW5kIHVwZGF0ZXMgYXQgdGhlIHJpZ2h0IG1vbWVudC4KICAvLy8gVGhlIGJ1aWxkZXIganVzdCBuZWVkcyB0byBjYWxsIFtlbnRlckxvb3BCb2R5XSBhbmQgW2VudGVyTG9vcFVwZGF0ZXNdCiAgLy8vIChmb3IgW2FzdC5Gb3JdIGxvb3BzKSBhdCB0aGUgY29ycmVjdCBwbGFjZXMuIEZvciBwaGktaGFuZGxpbmcKICAvLy8gW2JlZ2luTG9vcEhlYWRlcl0gYW5kIFtlbmRMb29wXSBtdXN0IGFsc28gYmUgY2FsbGVkLgogIC8vLwogIC8vLyBUaGUgY29ycmVjdCBwbGFjZSBmb3IgdGhlIGJveCBkZXBlbmRzIG9uIHRoZSBnaXZlbiBsb29wLiBJbiBtb3N0IGNhc2VzCiAgLy8vIHRoZSBib3ggd2lsbCBiZSBjcmVhdGVkIHdoZW4gZW50ZXJpbmcgdGhlIGxvb3AtYm9keTogd2hpbGUsIGRvLXdoaWxlLCBhbmQKICAvLy8gZm9yLWluIChhc3N1bWluZyB0aGUgY2FsbCB0byBbOm5leHQ6XSBpcyBpbnNpZGUgdGhlIGJvZHkpIGNhbiBhbHdheXMgYmUKICAvLy8gY29uc3RydWN0ZWQgdGhpcyB3YXkuCiAgLy8vCiAgLy8vIFRoaW5ncyBhcmUgc2xpZ2h0bHkgbW9yZSBjb21wbGljYXRlZCBmb3IgW2FzdC5Gb3JdIGxvb3BzLiBJZiBubyBkZWNsYXJlZAogIC8vLyBsb29wIHZhcmlhYmxlIGlzIGJveGVkIHRoZW4gdGhlIGxvb3AtYm9keSBhcHByb2FjaCB3b3JrcyBoZXJlIHRvby4gSWYgYQogIC8vLyBsb29wLXZhcmlhYmxlIGlzIGJveGVkIHdlIG5lZWQgdG8gaW50cm9kdWNlIGEgbmV3IGJveCBmb3IgdGhlCiAgLy8vIGxvb3AtdmFyaWFibGUgYmVmb3JlIHdlIGVudGVyIHRoZSBpbml0aWFsaXplciBzbyB0aGF0IHRoZSBpbml0aWFsaXplcgogIC8vLyB3cml0ZXMgdGhlIHZhbHVlcyBpbnRvIHRoZSBib3guIEluIGFueSBjYXNlIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBib3gKICAvLy8gYmVmb3JlIHRoZSBjb25kaXRpb24gc2luY2UgdGhlIGNvbmRpdGlvbiBjb3VsZCBib3ggdGhlIHZhcmlhYmxlLgogIC8vLyBTaW5jZSB0aGUgZmlyc3QgYm94IGlzIGNyZWF0ZWQgb3V0c2lkZSB0aGUgYWN0dWFsIGxvb3Agd2UgaGF2ZSBhIHNlY29uZAogIC8vLyBsb2NhdGlvbiB3aGVyZSBhIGJveCBpcyBjcmVhdGVkOiBqdXN0IGJlZm9yZSB0aGUgdXBkYXRlcy4gVGhpcyBpcwogIC8vLyBuZWNlc3Nhcnkgc2luY2UgdXBkYXRlcyBhcmUgY29uc2lkZXJlZCB0byBiZSBwYXJ0IG9mIHRoZSBuZXh0IGl0ZXJhdGlvbgogIC8vLyAoYW5kIGNhbiBhZ2FpbiBjYXB0dXJlIHZhcmlhYmxlcykuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgRGFydCBjb2RlIHByaW50cyAxIDMgLS0gMyA0LgogIC8vLwogIC8vLyAgICAgdmFyIGZzID0gW107CiAgLy8vICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IChmKCkgeyBmcy5hZGQoZik7IHByaW50KGkpOyBpKys7IH0pKCkpIHsKICAvLy8gICAgICAgaSsrOwogIC8vLyAgICAgfQogIC8vLyAgICAgcHJpbnQoIi0tIik7CiAgLy8vICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI7IGkrKykgZnNbaV0oKTsKICAvLy8KICAvLy8gV2Ugc29sdmUgdGhpcyBieSBlbWl0dGluZyB0aGUgZm9sbG93aW5nIGNvZGUgKG9ubHkgZm9yIFthc3QuRm9yXSBsb29wcyk6CiAgLy8vICA8Q3JlYXRlIGJveD4gICAgPD09IG1vdmUgdGhlIGZpcnN0IGJveCBjcmVhdGlvbiBvdXRzaWRlIHRoZSBsb29wLgogIC8vLyAgPGluaXRpYWxpemVyPjsKICAvLy8gIGxvb3AtZW50cnk6CiAgLy8vICAgIGlmICghPGNvbmRpdGlvbj4pIGdvdG8gbG9vcC1leGl0OwogIC8vLyAgICA8Ym9keT4KICAvLy8gICAgPHVwZGF0ZSBib3g+ICAvLyBjcmVhdGUgYSBuZXcgYm94IGFuZCBjb3B5IHRoZSBjYXB0dXJlZCBsb29wLXZhcmlhYmxlcy4KICAvLy8gICAgPHVwZGF0ZXM+CiAgLy8vICAgIGdvdG8gbG9vcC1lbnRyeTsKICAvLy8gIGxvb3AtZXhpdDoKICB2b2lkIHN0YXJ0TG9vcCgKICAgICAgQ2FwdHVyZWRMb29wU2NvcGUgbG9vcEluZm8sIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICBpZiAobG9vcEluZm8uaGFzQm94ZWRMb29wVmFyaWFibGVzKSB7CiAgICAgIC8vIElmIHRoZXJlIGFyZSBib3hlZCBsb29wIHZhcmlhYmxlcyB0aGVuIHdlIHNldCB1cCB0aGUgYm94IGFuZAogICAgICAvLyByZWRpcmVjdGlvbnMgYWxyZWFkeSBub3cuIFRoaXMgd2F5IHRoZSBpbml0aWFsaXplciBjYW4gd3JpdGUgaXRzCiAgICAgIC8vIHZhbHVlcyBpbnRvIHRoZSBib3guCiAgICAgIC8vIEZvciBvdGhlciBsb29wcyB0aGUgYm94IHdpbGwgYmUgY3JlYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBib2R5LgogICAgICBlbnRlclNjb3BlKGxvb3BJbmZvLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgfQoKICAvLy8gQ3JlYXRlIHBoaXMgYXQgdGhlIGxvb3AgZW50cnkgZm9yIGxvY2FsIHZhcmlhYmxlcyAocmVhZHkgZm9yIHRoZSB2YWx1ZXMKICAvLy8gZnJvbSB0aGUgYmFjayBlZGdlKS4gIFBvcHVsYXRlIHRoZSBwaGlzIHdpdGggdGhlIGN1cnJlbnQgdmFsdWVzLgogIHZvaWQgYmVnaW5Mb29wSGVhZGVyKEhCYXNpY0Jsb2NrIGxvb3BFbnRyeSkgewogICAgLy8gQ3JlYXRlIGEgY29weSBiZWNhdXNlIHdlIG1vZGlmeSB0aGUgbWFwIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGl0LgogICAgTWFwPExvY2FsLCBISW5zdHJ1Y3Rpb24+IHNhdmVkRGlyZWN0TG9jYWxzID0KICAgICAgICBuZXcgTWFwPExvY2FsLCBISW5zdHJ1Y3Rpb24+LmZyb20oZGlyZWN0TG9jYWxzKTsKCiAgICAvLyBDcmVhdGUgcGhpcyBmb3IgYWxsIGVsZW1lbnRzIGluIHRoZSBkZWZpbml0aW9ucyBlbnZpcm9ubWVudC4KICAgIHNhdmVkRGlyZWN0TG9jYWxzLmZvckVhY2goKExvY2FsIGxvY2FsLCBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgICAgaWYgKGlzQWNjZXNzZWREaXJlY3RseShsb2NhbCkpIHsKICAgICAgICAvLyBXZSBrbm93ICd0aGlzJyBjYW5ub3QgYmUgbW9kaWZpZWQuCiAgICAgICAgaWYgKGxvY2FsICE9IHNjb3BlSW5mby50aGlzTG9jYWwpIHsKICAgICAgICAgIEhQaGkgcGhpID0gbmV3IEhQaGkuc2luZ2xlSW5wdXQoCiAgICAgICAgICAgICAgbG9jYWwsIGluc3RydWN0aW9uLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSk7CiAgICAgICAgICBsb29wRW50cnkuYWRkUGhpKHBoaSk7CiAgICAgICAgICBkaXJlY3RMb2NhbHNbbG9jYWxdID0gcGhpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkaXJlY3RMb2NhbHNbbG9jYWxdID0gaW5zdHJ1Y3Rpb247CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgZW50ZXJMb29wQm9keSgKICAgICAgQ2FwdHVyZWRMb29wU2NvcGUgbG9vcEluZm8sIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZGVjbGFyZWQgYm94ZWQgbG9vcCB2YXJpYWJsZXMgdGhlbiB3ZSBkaWQgbm90IGNyZWF0ZSB0aGUKICAgIC8vIGJveCBiZWZvcmUgdGhlIGluaXRpYWxpemVyIGFuZCB3ZSBoYXZlIHRvIGNyZWF0ZSB0aGUgYm94IG5vdy4KICAgIGlmICghbG9vcEluZm8uaGFzQm94ZWRMb29wVmFyaWFibGVzKSB7CiAgICAgIGVudGVyU2NvcGUobG9vcEluZm8sIHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0KICB9CgogIHZvaWQgZW50ZXJMb29wVXBkYXRlcygKICAgICAgQ2FwdHVyZWRMb29wU2NvcGUgbG9vcEluZm8sIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAvLyBJZiB0aGVyZSBhcmUgZGVjbGFyZWQgYm94ZWQgbG9vcCB2YXJpYWJsZXMgdGhlbiB0aGUgdXBkYXRlcyBtaWdodCBoYXZlCiAgICAvLyBhY2Nlc3MgdG8gdGhlIGJveCBhbmQgd2UgbXVzdCBzd2l0Y2ggdG8gYSBuZXcgYm94IGJlZm9yZSBleGVjdXRpbmcgdGhlCiAgICAvLyB1cGRhdGVzLgogICAgLy8gSW4gYWxsIG90aGVyIGNhc2VzIGEgbmV3IGJveCB3aWxsIGJlIGNyZWF0ZWQgd2hlbiBlbnRlcmluZyB0aGUgYm9keSBvZgogICAgLy8gdGhlIG5leHQgaXRlcmF0aW9uLgogICAgaWYgKGxvb3BJbmZvLmhhc0JveGVkTG9vcFZhcmlhYmxlcykgewogICAgICB1cGRhdGVDYXB0dXJlQm94KAogICAgICAgICAgbG9vcEluZm8uY29udGV4dCwgbG9vcEluZm8uYm94ZWRMb29wVmFyaWFibGVzLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9CiAgfQoKICAvLy8gR29lcyB0aHJvdWdoIHRoZSBwaGlzIGNyZWF0ZWQgaW4gYmVnaW5Mb29wSGVhZGVyIGVudHJ5IGFuZCBhZGRzIHRoZQogIC8vLyBpbnB1dCBmcm9tIHRoZSBiYWNrIGVkZ2UgKGZyb20gdGhlIGN1cnJlbnQgdmFsdWUgb2YgZGlyZWN0TG9jYWxzKSB0byB0aGVtLgogIHZvaWQgZW5kTG9vcChIQmFzaWNCbG9jayBsb29wRW50cnkpIHsKICAgIC8vIElmIHRoZSBsb29wIGhhcyBhbiBhYm9ydGluZyBib2R5LCB3ZSBkb24ndCB1cGRhdGUgdGhlIGxvb3AKICAgIC8vIHBoaXMuCiAgICBpZiAobG9vcEVudHJ5LnByZWRlY2Vzc29ycy5sZW5ndGggPT0gMSkgcmV0dXJuOwogICAgbG9vcEVudHJ5LmZvckVhY2hQaGkoKEhQaGkgcGhpKSB7CiAgICAgIExvY2FsIGVsZW1lbnQgPSBwaGkuc291cmNlRWxlbWVudDsKICAgICAgSEluc3RydWN0aW9uIHBvc3RMb29wRGVmaW5pdGlvbiA9IGRpcmVjdExvY2Fsc1tlbGVtZW50XTsKICAgICAgcGhpLmFkZElucHV0KHBvc3RMb29wRGVmaW5pdGlvbik7CiAgICB9KTsKICB9CgogIC8vLyBNZXJnZSBbb3RoZXJMb2NhbHNdIGludG8gdGhpcyBsb2NhbHMgaGFuZGxlciwgY3JlYXRpbmcgcGhpLW5vZGVzIHdoZW4KICAvLy8gdGhlcmUgaXMgYSBjb25mbGljdC4KICAvLy8gSWYgYSBwaGkgbm9kZSBpcyBuZWNlc3NhcnksIGl0IHdpbGwgdXNlIHRoaXMgaGFuZGxlcidzIGluc3RydWN0aW9uIGFzIHRoZQogIC8vLyBmaXJzdCBpbnB1dCwgYW5kIHRoZSBvdGhlckxvY2FscyBpbnN0cnVjdGlvbiBhcyB0aGUgc2Vjb25kLgogIHZvaWQgbWVyZ2VXaXRoKExvY2Fsc0hhbmRsZXIgb3RoZXJMb2NhbHMsIEhCYXNpY0Jsb2NrIGpvaW5CbG9jaykgewogICAgLy8gSWYgYW4gZWxlbWVudCBpcyBpbiBvbmUgbWFwIGJ1dCBub3QgdGhlIG90aGVyIHdlIGNhbiBzYWZlbHkKICAgIC8vIGlnbm9yZSBpdC4gSXQgbWVhbnMgdGhhdCBhIHZhcmlhYmxlIHdhcyBkZWNsYXJlZCBpbiB0aGUKICAgIC8vIGJsb2NrLiBTaW5jZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgYXJlIHNjb3BlZCB0aGUgZGVjbGFyZWQKICAgIC8vIHZhcmlhYmxlIGNhbm5vdCBiZSBhbGl2ZSBvdXRzaWRlIHRoZSBibG9jay4gTm90ZTogdGhpcyBpcyBvbmx5CiAgICAvLyB0cnVlIGZvciBub2RlcyB3aGVyZSB3ZSBkbyBqb2lucy4KICAgIE1hcDxMb2NhbCwgSEluc3RydWN0aW9uPiBqb2luZWRMb2NhbHMgPSBuZXcgTWFwPExvY2FsLCBISW5zdHJ1Y3Rpb24+KCk7CiAgICBvdGhlckxvY2Fscy5kaXJlY3RMb2NhbHMuZm9yRWFjaCgoTG9jYWwgbG9jYWwsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgICAvLyBXZSBrbm93ICd0aGlzJyBjYW5ub3QgYmUgbW9kaWZpZWQuCiAgICAgIGlmIChsb2NhbCA9PSBzY29wZUluZm8udGhpc0xvY2FsKSB7CiAgICAgICAgYXNzZXJ0KGRpcmVjdExvY2Fsc1tsb2NhbF0gPT0gaW5zdHJ1Y3Rpb24pOwogICAgICAgIGpvaW5lZExvY2Fsc1tsb2NhbF0gPSBpbnN0cnVjdGlvbjsKICAgICAgfSBlbHNlIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gbWluZSA9IGRpcmVjdExvY2Fsc1tsb2NhbF07CiAgICAgICAgaWYgKG1pbmUgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgIGlmIChpZGVudGljYWwoaW5zdHJ1Y3Rpb24sIG1pbmUpKSB7CiAgICAgICAgICBqb2luZWRMb2NhbHNbbG9jYWxdID0gaW5zdHJ1Y3Rpb247CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIEhJbnN0cnVjdGlvbiBwaGkgPSBuZXcgSFBoaS5tYW55SW5wdXRzKAogICAgICAgICAgICAgIGxvY2FsLAogICAgICAgICAgICAgIDxISW5zdHJ1Y3Rpb24+W21pbmUsIGluc3RydWN0aW9uXSwKICAgICAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5keW5hbWljVHlwZSk7CiAgICAgICAgICBqb2luQmxvY2suYWRkUGhpKHBoaSk7CiAgICAgICAgICBqb2luZWRMb2NhbHNbbG9jYWxdID0gcGhpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBkaXJlY3RMb2NhbHMgPSBqb2luZWRMb2NhbHM7CiAgfQoKICAvLy8gV2hlbiBjb250cm9sIGZsb3cgbWVyZ2VzLCB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBtZXJnZSBzZXZlcmFsCiAgLy8vIGxvY2Fsc0hhbmRsZXJzIGludG8gYSBuZXcgb25lIHVzaW5nIHBoaXMuICBUaGUgbmV3IGxvY2Fsc0hhbmRsZXIgaXMKICAvLy8gcmV0dXJuZWQuICBVbmxlc3MgaXQgaXMgYWxzbyBpbiB0aGUgbGlzdCwgdGhlIGN1cnJlbnQgbG9jYWxzSGFuZGxlciBpcyBub3QKICAvLy8gdXNlZCBmb3IgaXRzIHZhbHVlcywgb25seSBmb3IgaXRzIGRlY2xhcmVkIHZhcmlhYmxlcy4gVGhpcyBpcyBhIHdheSB0bwogIC8vLyBleGNsdWRlIGxvY2FsIHZhbHVlcyBmcm9tIHRoZSByZXN1bHQgd2hlbiB0aGV5IGFyZSBubyBsb25nZXIgaW4gc2NvcGUuCiAgTG9jYWxzSGFuZGxlciBtZXJnZU11bHRpcGxlKAogICAgICBMaXN0PExvY2Fsc0hhbmRsZXI+IGxvY2Fsc0hhbmRsZXJzLCBIQmFzaWNCbG9jayBqb2luQmxvY2spIHsKICAgIGFzc2VydChsb2NhbHNIYW5kbGVycy5sZW5ndGggPiAwKTsKICAgIGlmIChsb2NhbHNIYW5kbGVycy5sZW5ndGggPT0gMSkgcmV0dXJuIGxvY2Fsc0hhbmRsZXJzLnNpbmdsZTsKICAgIE1hcDxMb2NhbCwgSEluc3RydWN0aW9uPiBqb2luZWRMb2NhbHMgPSBuZXcgTWFwPExvY2FsLCBISW5zdHJ1Y3Rpb24+KCk7CiAgICBISW5zdHJ1Y3Rpb24gdGhpc1ZhbHVlID0gbnVsbDsKICAgIGRpcmVjdExvY2Fscy5mb3JFYWNoKChMb2NhbCBsb2NhbCwgSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICAgIGlmIChsb2NhbCAhPSBzY29wZUluZm8udGhpc0xvY2FsKSB7CiAgICAgICAgSFBoaSBwaGkgPSBuZXcgSFBoaS5ub0lucHV0cyhsb2NhbCwgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpOwogICAgICAgIGpvaW5lZExvY2Fsc1tsb2NhbF0gPSBwaGk7CiAgICAgICAgam9pbkJsb2NrLmFkZFBoaShwaGkpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFdlIGtub3cgdGhhdCAidGhpcyIgbmV2ZXIgY2hhbmdlcywgaWYgaXQncyB0aGVyZS4KICAgICAgICAvLyBTYXZlIGl0IGZvciBsYXRlci4gV2hpbGUgbWVyZ2luZywgdGhlcmUgaXMgbm8gcGhpIGZvciAidGhpcyIsCiAgICAgICAgLy8gc28gd2UgZG9uJ3QgaGF2ZSB0byBzcGVjaWFsIGNhc2UgaXQgaW4gdGhlIG1lcmdlIGxvb3AuCiAgICAgICAgdGhpc1ZhbHVlID0gaW5zdHJ1Y3Rpb247CiAgICAgIH0KICAgIH0pOwogICAgZm9yIChMb2NhbHNIYW5kbGVyIGhhbmRsZXIgaW4gbG9jYWxzSGFuZGxlcnMpIHsKICAgICAgaGFuZGxlci5kaXJlY3RMb2NhbHMuZm9yRWFjaCgoTG9jYWwgbG9jYWwsIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgICAgIEhQaGkgcGhpID0gam9pbmVkTG9jYWxzW2xvY2FsXTsKICAgICAgICBpZiAocGhpICE9IG51bGwpIHsKICAgICAgICAgIHBoaS5hZGRJbnB1dChpbnN0cnVjdGlvbik7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGlmICh0aGlzVmFsdWUgIT0gbnVsbCkgewogICAgICAvLyBJZiB0aGVyZSB3YXMgYSAidGhpcyIgZm9yIHRoZSBzY29wZSwgYWRkIGl0IHRvIHRoZSBuZXcgbG9jYWxzLgogICAgICBqb2luZWRMb2NhbHNbc2NvcGVJbmZvLnRoaXNMb2NhbF0gPSB0aGlzVmFsdWU7CiAgICB9CgogICAgLy8gUmVtb3ZlIGxvY2FscyB0aGF0IGFyZSBub3QgaW4gYWxsIGhhbmRsZXJzLgogICAgZGlyZWN0TG9jYWxzID0gbmV3IE1hcDxMb2NhbCwgSEluc3RydWN0aW9uPigpOwogICAgam9pbmVkTG9jYWxzLmZvckVhY2goKExvY2FsIGxvY2FsLCBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgICAgaWYgKGxvY2FsICE9IHNjb3BlSW5mby50aGlzTG9jYWwgJiYKICAgICAgICAgIGluc3RydWN0aW9uLmlucHV0cy5sZW5ndGggIT0gbG9jYWxzSGFuZGxlcnMubGVuZ3RoKSB7CiAgICAgICAgam9pbkJsb2NrLnJlbW92ZVBoaShpbnN0cnVjdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGlyZWN0TG9jYWxzW2xvY2FsXSA9IGluc3RydWN0aW9uOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgQWJzdHJhY3RWYWx1ZSBjYWNoZWRUeXBlT2ZUaGlzOwoKICBBYnN0cmFjdFZhbHVlIGdldFR5cGVPZlRoaXMoKSB7CiAgICBBYnN0cmFjdFZhbHVlIHJlc3VsdCA9IGNhY2hlZFR5cGVPZlRoaXM7CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgVGhpc0xvY2FsIGxvY2FsID0gc2NvcGVJbmZvLnRoaXNMb2NhbDsKICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gbG9jYWwuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIGlmIChfY2xvc2VkV29ybGQuaXNVc2VkQXNNaXhpbihjbHMpKSB7CiAgICAgICAgLy8gSWYgdGhlIGVuY2xvc2luZyBjbGFzcyBpcyB1c2VkIGFzIGEgbWl4aW4sIFs6dGhpczpdIGNhbiBiZQogICAgICAgIC8vIG9mIHRoZSBjbGFzcyB0aGF0IG1peGlucyB0aGUgZW5jbG9zaW5nIGNsYXNzLiBUaGVzZSB0d28KICAgICAgICAvLyBjbGFzc2VzIGRvIG5vdCBoYXZlIGEgc3ViY2xhc3MgcmVsYXRpb25zaGlwLCBzbywgZm9yCiAgICAgICAgLy8gc2ltcGxpY2l0eSwgd2UgbWFyayB0aGUgdHlwZSBhcyBhbiBpbnRlcmZhY2UgdHlwZS4KICAgICAgICByZXN1bHQgPSBfYWJzdHJhY3RWYWx1ZURvbWFpbi5jcmVhdGVOb25OdWxsU3VidHlwZShjbHMpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdCA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxTdWJjbGFzcyhjbHMpOwogICAgICB9CiAgICAgIGNhY2hlZFR5cGVPZlRoaXMgPSByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTWFwPEZpZWxkRW50aXR5LCBBYnN0cmFjdFZhbHVlPiBjYWNoZWRUeXBlc09mQ2FwdHVyZWRWYXJpYWJsZXMgPQogICAgICBuZXcgTWFwPEZpZWxkRW50aXR5LCBBYnN0cmFjdFZhbHVlPigpOwoKICBBYnN0cmFjdFZhbHVlIGdldFR5cGVPZkNhcHR1cmVkVmFyaWFibGUoRmllbGRFbnRpdHkgZWxlbWVudCkgewogICAgcmV0dXJuIGNhY2hlZFR5cGVzT2ZDYXB0dXJlZFZhcmlhYmxlcy5wdXRJZkFic2VudChlbGVtZW50LCAoKSB7CiAgICAgIHJldHVybiBBYnN0cmFjdFZhbHVlRmFjdG9yeS5pbmZlcnJlZFR5cGVGb3JNZW1iZXIoCiAgICAgICAgICBlbGVtZW50LCBfZ2xvYmFsSW5mZXJlbmNlUmVzdWx0cyk7CiAgICB9KTsKICB9CgogIC8vLyBWYXJpYWJsZXMgc3RvcmVkIGluIHRoZSBjdXJyZW50IGFjdGl2YXRpb24uIFRoZXNlIHZhcmlhYmxlcyBhcmUKICAvLy8gYmVpbmcgdXBkYXRlZCBpbiB0cnkvY2F0Y2ggYmxvY2tzLCBhbmQgc2hvdWxkIGJlCiAgLy8vIGFjY2Vzc2VkIGluZGlyZWN0bHkgdGhyb3VnaCBbSExvY2FsR2V0XSBhbmQgW0hMb2NhbFNldF0uCiAgTWFwPExvY2FsLCBITG9jYWxWYWx1ZT4gYWN0aXZhdGlvblZhcmlhYmxlcyA9IDxMb2NhbCwgSExvY2FsVmFsdWU+e307CgogIFN5bnRoZXRpY0xvY2FsIGNyZWF0ZUxvY2FsKFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gbmV3IFN5bnRoZXRpY0xvY2FsKG5hbWUsIGV4ZWN1dGFibGVDb250ZXh0LCBtZW1iZXJDb250ZXh0KTsKICB9Cn0KCi8vLyBBIHN5bnRoZXRpYyBsb2NhbCB2YXJpYWJsZSBvbmx5IHVzZWQgd2l0aCB0aGUgU1NBIGdyYXBoLgovLy8KLy8vIEZvciBpbnN0YW5jZSB1c2VkIGZvciBob2xkaW5nIHJldHVybiB2YWx1ZSBvZiBmdW5jdGlvbiBvciB0aGUgZXhjZXB0aW9uIG9mIGEKLy8vIHRyeS1jYXRjaCBzdGF0ZW1lbnQuCmNsYXNzIFN5bnRoZXRpY0xvY2FsIGV4dGVuZHMgTG9jYWwgewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIEVudGl0eSBleGVjdXRhYmxlQ29udGV4dDsKICBmaW5hbCBNZW1iZXJFbnRpdHkgbWVtYmVyQ29udGV4dDsKCiAgLy8gQXZvaWQgc2xvdyBPYmplY3QuaGFzaENvZGUuCiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGhhc2hDb2RlID0gX25leHRIYXNoQ29kZSA9IChfbmV4dEhhc2hDb2RlICsgMSkudG9VbnNpZ25lZCgzMCk7CiAgc3RhdGljIGludCBfbmV4dEhhc2hDb2RlID0gMDsKCiAgU3ludGhldGljTG9jYWwodGhpcy5uYW1lLCB0aGlzLmV4ZWN1dGFibGVDb250ZXh0LCB0aGlzLm1lbWJlckNvbnRleHQpOwoKICBAb3ZlcnJpZGUKICB0b1N0cmluZygpID0+ICdTeW50aGV0aWNMb2NhbCgkbmFtZSknOwp9CoLGAE5OPAEaGSQhMSEoKS5ELioBHhUVAU1OCRZPIwZLSlBESk4nF0A2IiQBRwZKNgZQUBgGGRUdDBMkDAYkASABKgFKQwE4ATIoATwmAUkWKx0gRCE5FTFKHwgxUAgGFAQBRkQgKk43NS0rISUpMzkzTwFPUDUuIzsEAUBILxYQBAFOORNGTVAnMRYpKEwaIEYNKgYoLUxPREgWGzMjOkwzSjM+RDc0IygPIwgIBAFNNUotSxAxODZMPSc4JywGJQQBLAY/FhwbHywjKywgAT8pMEQ0EgoIRTctJwgxAS1EAUlLJEk5S0ctRSMKQx5ONzc/K1BNEk83NzsGAT5ERS4BTlFKTkIrMjlKOzRPN04wTiwIIEAzCCk6TjczUTctME4sCAYEAU1QKRs1MgQBLRsxPzwuLAQBHjE1MgQBLjQEAUlOEU8lKSoUKUNCERQVRiYKCDAnNBwIFDA5OEQtLTEeRh0XITgZSEgrTBImIQggAS45QxsVDS4wQkAgGgYEAUEXTictBhAEAU04RERCEjEoBgE3H0M1MRkIBAE4NSoIBAFMPzQvGRgZBis3JSMhOCAZJiEIIAFOSEwfLkwyDS4wUDIGBAFPSRQGT0xEOwZNUE4cBk9ORExMR05ITikGPQYXShEMFy8GT0kWEysQURMaEhJJKkZKHkkvBgQBTkcwSDE5AURIJy4sK0UhJREtCggIBAEWSVBFKy8GBAEZSU5OEE4bKhhNBgQBSlEoQg00Jik/KAgEAUwbUEJFQz9CRilMTywqNCsPMSIsLREyFTExISUKCAghBAFJSlFNTR9DJ0JMI0MqTyMfDz1JQiEICDRNKBslCgoGHUg1BgEzM0MqQCoPKwgIEQQBIgEiLRotLi1GQ0A+QQ9CCCEGEwQBQy0BQUQ5LQgEAUY3P0gBLEcEAgE9BFEZJQwVIiQBIQxLIAFJAQwpAgEscGFja2FnZTpjb21waWxlci9zcmMvc3NhL2xvY2Fsc19oYW5kbGVyLmRhcnQzc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL2xvb3BfaGFuZGxlci5kYXJ0tPEvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2Nsb3N1cmUuZGFydCcgc2hvdyBDYXB0dXJlZExvb3BTY29wZTsKaW1wb3J0ICcuLi9lbGVtZW50cy9qdW1wcy5kYXJ0JzsKaW1wb3J0ICcuLi9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnLi4vaW8vc291cmNlX2luZm9ybWF0aW9uLmRhcnQnOwoKaW1wb3J0ICdidWlsZGVyX2tlcm5lbC5kYXJ0JzsKaW1wb3J0ICdqdW1wX2hhbmRsZXIuZGFydCc7CmltcG9ydCAnbG9jYWxzX2hhbmRsZXIuZGFydCc7CmltcG9ydCAnbm9kZXMuZGFydCc7CgovLy8gQnVpbGRzIHRoZSBTU0EgZ3JhcGggZm9yIGxvb3Agbm9kZXMuCmFic3RyYWN0IGNsYXNzIExvb3BIYW5kbGVyIHsKICBmaW5hbCBLZXJuZWxTc2FHcmFwaEJ1aWxkZXIgYnVpbGRlcjsKCiAgTG9vcEhhbmRsZXIodGhpcy5idWlsZGVyKTsKCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgX2Fic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgYnVpbGRlci5jbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICAvLy8gQnVpbGRzIGEgZ3JhcGggZm9yIHRoZSBnaXZlbiBbbG9vcF0gbm9kZS4KICAvLy8KICAvLy8gRm9yIHdoaWxlIGxvb3BzLCBbaW5pdGlhbGl6ZV0gYW5kIFt1cGRhdGVdIGFyZSBudWxsLgogIC8vLyBUaGUgW2NvbmRpdGlvbl0gZnVuY3Rpb24gbXVzdCByZXR1cm4gYSBib29sZWFuIHJlc3VsdC4KICAvLy8gTm9uZSBvZiB0aGUgZnVuY3Rpb25zIG11c3QgbGVhdmUgYW55dGhpbmcgb24gdGhlIHN0YWNrLgogIHZvaWQgaGFuZGxlTG9vcCgKICAgICAgaXIuTm9kZSBsb29wLAogICAgICBDYXB0dXJlZExvb3BTY29wZSBsb29wQ2xvc3VyZUluZm8sCiAgICAgIEp1bXBUYXJnZXQganVtcFRhcmdldCwKICAgICAgdm9pZCBpbml0aWFsaXplKCksCiAgICAgIEhJbnN0cnVjdGlvbiBjb25kaXRpb24oKSwKICAgICAgdm9pZCB1cGRhdGUoKSwKICAgICAgdm9pZCBib2R5KCksCiAgICAgIFNvdXJjZUluZm9ybWF0aW9uIHNvdXJjZUluZm9ybWF0aW9uKSB7CiAgICAvLyBHZW5lcmF0ZToKICAgIC8vICA8aW5pdGlhbGl6ZXI+CiAgICAvLyAgbG9vcC1lbnRyeToKICAgIC8vICAgIGlmICghPGNvbmRpdGlvbj4pIGdvdG8gbG9vcC1leGl0OwogICAgLy8gICAgPGJvZHk+CiAgICAvLyAgICA8dXBkYXRlcz4KICAgIC8vICAgIGdvdG8gbG9vcC1lbnRyeTsKICAgIC8vICBsb29wLWV4aXQ6CgogICAgYnVpbGRlci5sb2NhbHNIYW5kbGVyLnN0YXJ0TG9vcChsb29wQ2xvc3VyZUluZm8sIHNvdXJjZUluZm9ybWF0aW9uKTsKCiAgICAvLyBUaGUgaW5pdGlhbGl6ZXIuCiAgICBTdWJFeHByZXNzaW9uIGluaXRpYWxpemVyR3JhcGggPSBudWxsOwogICAgSEJhc2ljQmxvY2sgc3RhcnRCbG9jazsKICAgIGlmIChpbml0aWFsaXplICE9IG51bGwpIHsKICAgICAgSEJhc2ljQmxvY2sgaW5pdGlhbGl6ZXJCbG9jayA9IGJ1aWxkZXIub3Blbk5ld0Jsb2NrKCk7CiAgICAgIHN0YXJ0QmxvY2sgPSBpbml0aWFsaXplckJsb2NrOwogICAgICBpbml0aWFsaXplKCk7CiAgICAgIGFzc2VydCghYnVpbGRlci5pc0Fib3J0ZWQoKSk7CiAgICAgIGluaXRpYWxpemVyR3JhcGggPSBuZXcgU3ViRXhwcmVzc2lvbihpbml0aWFsaXplckJsb2NrLCBidWlsZGVyLmN1cnJlbnQpOwogICAgfQoKICAgIGJ1aWxkZXIubG9vcERlcHRoKys7CiAgICBKdW1wSGFuZGxlciBqdW1wSGFuZGxlciA9IGJlZ2luTG9vcEhlYWRlcihsb29wLCBqdW1wVGFyZ2V0KTsKICAgIEhMb29wSW5mb3JtYXRpb24gbG9vcEluZm8gPSBidWlsZGVyLmN1cnJlbnQubG9vcEluZm9ybWF0aW9uOwogICAgSEJhc2ljQmxvY2sgY29uZGl0aW9uQmxvY2sgPSBidWlsZGVyLmN1cnJlbnQ7CiAgICBpZiAoc3RhcnRCbG9jayA9PSBudWxsKSBzdGFydEJsb2NrID0gY29uZGl0aW9uQmxvY2s7CgogICAgSEluc3RydWN0aW9uIGNvbmRpdGlvbkluc3RydWN0aW9uID0gY29uZGl0aW9uKCk7CiAgICBIQmFzaWNCbG9jayBjb25kaXRpb25FbmRCbG9jayA9IGJ1aWxkZXIKICAgICAgICAuY2xvc2UobmV3IEhMb29wQnJhbmNoKF9hYnN0cmFjdFZhbHVlRG9tYWluLCBjb25kaXRpb25JbnN0cnVjdGlvbikpOwogICAgU3ViRXhwcmVzc2lvbiBjb25kaXRpb25FeHByZXNzaW9uID0KICAgICAgICBuZXcgU3ViRXhwcmVzc2lvbihjb25kaXRpb25CbG9jaywgY29uZGl0aW9uRW5kQmxvY2spOwoKICAgIC8vIFNhdmUgdGhlIHZhbHVlcyBvZiB0aGUgbG9jYWwgdmFyaWFibGVzIGF0IHRoZSBlbmQgb2YgdGhlIGNvbmRpdGlvbgogICAgLy8gYmxvY2suICBUaGVzZSBhcmUgdGhlIHZhbHVlcyB0aGF0IHdpbGwgZmxvdyB0byB0aGUgbG9vcCBleGl0IGlmIHRoZQogICAgLy8gY29uZGl0aW9uIGZhaWxzLgogICAgTG9jYWxzSGFuZGxlciBzYXZlZExvY2FscyA9IG5ldyBMb2NhbHNIYW5kbGVyLmZyb20oYnVpbGRlci5sb2NhbHNIYW5kbGVyKTsKCiAgICAvLyBUaGUgYm9keS4KICAgIEhCYXNpY0Jsb2NrIGJlZ2luQm9keUJsb2NrID0gYnVpbGRlci5hZGROZXdCbG9jaygpOwogICAgY29uZGl0aW9uRW5kQmxvY2suYWRkU3VjY2Vzc29yKGJlZ2luQm9keUJsb2NrKTsKICAgIGJ1aWxkZXIub3BlbihiZWdpbkJvZHlCbG9jayk7CgogICAgYnVpbGRlci5sb2NhbHNIYW5kbGVyLmVudGVyTG9vcEJvZHkobG9vcENsb3N1cmVJbmZvLCBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICBib2R5KCk7CgogICAgU3ViR3JhcGggYm9keUdyYXBoID0gbmV3IFN1YkdyYXBoKGJlZ2luQm9keUJsb2NrLCBidWlsZGVyLmxhc3RPcGVuZWRCbG9jayk7CiAgICBIQmFzaWNCbG9jayBib2R5QmxvY2sgPSBidWlsZGVyLmN1cnJlbnQ7CiAgICBpZiAoYnVpbGRlci5jdXJyZW50ICE9IG51bGwpIGJ1aWxkZXIuY2xvc2UobmV3IEhHb3RvKF9hYnN0cmFjdFZhbHVlRG9tYWluKSk7CgogICAgU3ViRXhwcmVzc2lvbiB1cGRhdGVHcmFwaDsKCiAgICBib29sIGxvb3BJc0RlZ2VuZXJhdGUgPSAhanVtcEhhbmRsZXIuaGFzQW55Q29udGludWUoKSAmJiBib2R5QmxvY2sgPT0gbnVsbDsKICAgIGlmICghbG9vcElzRGVnZW5lcmF0ZSkgewogICAgICAvLyBVcGRhdGUuCiAgICAgIC8vIFdlIGNyZWF0ZSBhbiB1cGRhdGUgYmxvY2ssIGV2ZW4gd2hlbiB3ZSBhcmUgaW4gYSB3aGlsZSBsb29wLiBUaGVyZSB0aGUKICAgICAgLy8gdXBkYXRlIGJsb2NrIGlzIHRoZSBqdW1wLXRhcmdldCBmb3IgY29udGludWUgc3RhdGVtZW50cy4gV2UgY291bGQgYXZvaWQKICAgICAgLy8gdGhlIGNyZWF0aW9uIGlmIHRoZXJlIGlzIG5vIGNvbnRpbnVlLCBidXQgZm9yIG5vdyB3ZSBhbHdheXMgY3JlYXRlIGl0LgogICAgICBIQmFzaWNCbG9jayB1cGRhdGVCbG9jayA9IGJ1aWxkZXIuYWRkTmV3QmxvY2soKTsKCiAgICAgIExpc3Q8TG9jYWxzSGFuZGxlcj4gY29udGludWVIYW5kbGVycyA9IDxMb2NhbHNIYW5kbGVyPltdOwogICAgICBqdW1wSGFuZGxlcgogICAgICAgICAgLmZvckVhY2hDb250aW51ZSgoSENvbnRpbnVlIGluc3RydWN0aW9uLCBMb2NhbHNIYW5kbGVyIGxvY2FscykgewogICAgICAgIGluc3RydWN0aW9uLmJsb2NrLmFkZFN1Y2Nlc3Nvcih1cGRhdGVCbG9jayk7CiAgICAgICAgY29udGludWVIYW5kbGVycy5hZGQobG9jYWxzKTsKICAgICAgfSk7CgogICAgICBpZiAoYm9keUJsb2NrICE9IG51bGwpIHsKICAgICAgICBjb250aW51ZUhhbmRsZXJzLmFkZChidWlsZGVyLmxvY2Fsc0hhbmRsZXIpOwogICAgICAgIGJvZHlCbG9jay5hZGRTdWNjZXNzb3IodXBkYXRlQmxvY2spOwogICAgICB9CgogICAgICBidWlsZGVyLm9wZW4odXBkYXRlQmxvY2spOwogICAgICBidWlsZGVyLmxvY2Fsc0hhbmRsZXIgPQogICAgICAgICAgY29udGludWVIYW5kbGVyc1swXS5tZXJnZU11bHRpcGxlKGNvbnRpbnVlSGFuZGxlcnMsIHVwZGF0ZUJsb2NrKTsKCiAgICAgIExpc3Q8TGFiZWxEZWZpbml0aW9uPiBsYWJlbHMgPSBqdW1wSGFuZGxlci5sYWJlbHM7CiAgICAgIGlmIChsYWJlbHMuaXNOb3RFbXB0eSkgewogICAgICAgIGJlZ2luQm9keUJsb2NrLnNldEJsb2NrRmxvdygKICAgICAgICAgICAgbmV3IEhMYWJlbGVkQmxvY2tJbmZvcm1hdGlvbigKICAgICAgICAgICAgICAgIG5ldyBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uKGJvZHlHcmFwaCksIGp1bXBIYW5kbGVyLmxhYmVscywKICAgICAgICAgICAgICAgIGlzQ29udGludWU6IHRydWUpLAogICAgICAgICAgICB1cGRhdGVCbG9jayk7CiAgICAgIH0gZWxzZSBpZiAoanVtcFRhcmdldCAhPSBudWxsICYmIGp1bXBUYXJnZXQuaXNDb250aW51ZVRhcmdldCkgewogICAgICAgIGJlZ2luQm9keUJsb2NrLnNldEJsb2NrRmxvdygKICAgICAgICAgICAgbmV3IEhMYWJlbGVkQmxvY2tJbmZvcm1hdGlvbi5pbXBsaWNpdCgKICAgICAgICAgICAgICAgIG5ldyBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uKGJvZHlHcmFwaCksIGp1bXBUYXJnZXQsCiAgICAgICAgICAgICAgICBpc0NvbnRpbnVlOiB0cnVlKSwKICAgICAgICAgICAgdXBkYXRlQmxvY2spOwogICAgICB9CgogICAgICBidWlsZGVyLmxvY2Fsc0hhbmRsZXIKICAgICAgICAgIC5lbnRlckxvb3BVcGRhdGVzKGxvb3BDbG9zdXJlSW5mbywgc291cmNlSW5mb3JtYXRpb24pOwoKICAgICAgdXBkYXRlKCk7CgogICAgICBIQmFzaWNCbG9jayB1cGRhdGVFbmRCbG9jayA9CiAgICAgICAgICBidWlsZGVyLmNsb3NlKG5ldyBIR290byhfYWJzdHJhY3RWYWx1ZURvbWFpbikpOwogICAgICAvLyBUaGUgYmFjay1lZGdlIGNvbXBsZXRpbmcgdGhlIGN5Y2xlLgogICAgICB1cGRhdGVFbmRCbG9jay5hZGRTdWNjZXNzb3IoY29uZGl0aW9uQmxvY2spOwogICAgICB1cGRhdGVHcmFwaCA9IG5ldyBTdWJFeHByZXNzaW9uKHVwZGF0ZUJsb2NrLCB1cGRhdGVFbmRCbG9jayk7CgogICAgICAvLyBBdm9pZCBhIGNyaXRpY2FsIGVkZ2UgZnJvbSB0aGUgY29uZGl0aW9uIHRvIHRoZSBsb29wLWV4aXQgYm9keS4KICAgICAgSEJhc2ljQmxvY2sgY29uZGl0aW9uRXhpdEJsb2NrID0gYnVpbGRlci5hZGROZXdCbG9jaygpOwogICAgICBidWlsZGVyLm9wZW4oY29uZGl0aW9uRXhpdEJsb2NrKTsKICAgICAgYnVpbGRlci5jbG9zZShuZXcgSEdvdG8oX2Fic3RyYWN0VmFsdWVEb21haW4pKTsKICAgICAgY29uZGl0aW9uRW5kQmxvY2suYWRkU3VjY2Vzc29yKGNvbmRpdGlvbkV4aXRCbG9jayk7CgogICAgICBlbmRMb29wKGNvbmRpdGlvbkJsb2NrLCBjb25kaXRpb25FeGl0QmxvY2ssIGp1bXBIYW5kbGVyLCBzYXZlZExvY2Fscyk7CgogICAgICBjb25kaXRpb25CbG9jay5wb3N0UHJvY2Vzc0xvb3BIZWFkZXIoKTsKICAgICAgSExvb3BCbG9ja0luZm9ybWF0aW9uIGluZm8gPSBuZXcgSExvb3BCbG9ja0luZm9ybWF0aW9uKAogICAgICAgICAgbG9vcEtpbmQobG9vcCksCiAgICAgICAgICBidWlsZGVyLndyYXBFeHByZXNzaW9uR3JhcGgoaW5pdGlhbGl6ZXJHcmFwaCksCiAgICAgICAgICBidWlsZGVyLndyYXBFeHByZXNzaW9uR3JhcGgoY29uZGl0aW9uRXhwcmVzc2lvbiksCiAgICAgICAgICBidWlsZGVyLndyYXBTdGF0ZW1lbnRHcmFwaChib2R5R3JhcGgpLAogICAgICAgICAgYnVpbGRlci53cmFwRXhwcmVzc2lvbkdyYXBoKHVwZGF0ZUdyYXBoKSwKICAgICAgICAgIGNvbmRpdGlvbkJsb2NrLmxvb3BJbmZvcm1hdGlvbi50YXJnZXQsCiAgICAgICAgICBjb25kaXRpb25CbG9jay5sb29wSW5mb3JtYXRpb24ubGFiZWxzLAogICAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwoKICAgICAgc3RhcnRCbG9jay5zZXRCbG9ja0Zsb3coaW5mbywgYnVpbGRlci5jdXJyZW50KTsKICAgICAgbG9vcEluZm8ubG9vcEJsb2NrSW5mb3JtYXRpb24gPSBpbmZvOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhlIGJvZHkgb2YgdGhlIGZvci93aGlsZSBsb29wIGFsd2F5cyBhYm9ydHMsIHNvIHRoZXJlIGlzIG5vIGJhY2sgZWRnZS4KICAgICAgLy8gV2UgdHVybiB0aGUgY29kZSBpbnRvOgogICAgICAvLyBpZiAoY29uZGl0aW9uKSB7CiAgICAgIC8vICAgYm9keTsKICAgICAgLy8gfSBlbHNlIHsKICAgICAgLy8gICAvLyBXZSBhbHdheXMgY3JlYXRlIGFuIGVtcHR5IGVsc2UgYmxvY2sgdG8gYXZvaWQgY3JpdGljYWwgZWRnZXMuCiAgICAgIC8vIH0KICAgICAgLy8KICAgICAgLy8gSWYgdGhlcmUgaXMgYW55IGJyZWFrIGluIHRoZSBib2R5LCB3ZSBhdHRhY2ggYSBzeW50aGV0aWMKICAgICAgLy8gbGFiZWwgdG8gdGhlIGlmLgogICAgICBIQmFzaWNCbG9jayBlbHNlQmxvY2sgPSBidWlsZGVyLmFkZE5ld0Jsb2NrKCk7CiAgICAgIGJ1aWxkZXIub3BlbihlbHNlQmxvY2spOwogICAgICBidWlsZGVyLmNsb3NlKG5ldyBIR290byhfYWJzdHJhY3RWYWx1ZURvbWFpbikpOwogICAgICAvLyBQYXNzIHRoZSBlbHNlQmxvY2sgYXMgdGhlIGJyYW5jaEJsb2NrLCBiZWNhdXNlIHRoYXQncyB0aGUgYmxvY2sgd2UgZ28KICAgICAgLy8gdG8ganVzdCBiZWZvcmUgbGVhdmluZyB0aGUgJ2xvb3AnLgogICAgICBlbmRMb29wKGNvbmRpdGlvbkJsb2NrLCBlbHNlQmxvY2ssIGp1bXBIYW5kbGVyLCBzYXZlZExvY2Fscyk7CgogICAgICBTdWJHcmFwaCBlbHNlR3JhcGggPSBuZXcgU3ViR3JhcGgoZWxzZUJsb2NrLCBlbHNlQmxvY2spOwogICAgICAvLyBSZW1vdmUgdGhlIGxvb3AgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gdGhlIGhlYWRlci4KICAgICAgY29uZGl0aW9uQmxvY2subG9vcEluZm9ybWF0aW9uID0gbnVsbDsKCiAgICAgIC8vIFJlbW92ZSB0aGUgW0hMb29wQnJhbmNoXSBpbnN0cnVjdGlvbiBhbmQgcmVwbGFjZSBpdCB3aXRoCiAgICAgIC8vIFtISWZdLgogICAgICBISW5zdHJ1Y3Rpb24gY29uZGl0aW9uID0gY29uZGl0aW9uRW5kQmxvY2subGFzdC5pbnB1dHNbMF07CiAgICAgIGNvbmRpdGlvbkVuZEJsb2NrLmFkZEF0RXhpdChuZXcgSElmKF9hYnN0cmFjdFZhbHVlRG9tYWluLCBjb25kaXRpb24pKTsKICAgICAgY29uZGl0aW9uRW5kQmxvY2suYWRkU3VjY2Vzc29yKGVsc2VCbG9jayk7CiAgICAgIGNvbmRpdGlvbkVuZEJsb2NrLnJlbW92ZShjb25kaXRpb25FbmRCbG9jay5sYXN0KTsKICAgICAgSElmQmxvY2tJbmZvcm1hdGlvbiBpbmZvID0gbmV3IEhJZkJsb2NrSW5mb3JtYXRpb24oCiAgICAgICAgICBidWlsZGVyLndyYXBFeHByZXNzaW9uR3JhcGgoY29uZGl0aW9uRXhwcmVzc2lvbiksCiAgICAgICAgICBidWlsZGVyLndyYXBTdGF0ZW1lbnRHcmFwaChib2R5R3JhcGgpLAogICAgICAgICAgYnVpbGRlci53cmFwU3RhdGVtZW50R3JhcGgoZWxzZUdyYXBoKSk7CgogICAgICBjb25kaXRpb25FbmRCbG9jay5zZXRCbG9ja0Zsb3coaW5mbywgYnVpbGRlci5jdXJyZW50KTsKICAgICAgSElmIGlmQmxvY2sgPSBjb25kaXRpb25FbmRCbG9jay5sYXN0OwogICAgICBpZkJsb2NrLmJsb2NrSW5mb3JtYXRpb24gPSBjb25kaXRpb25FbmRCbG9jay5ibG9ja0Zsb3c7CgogICAgICAvLyBJZiB0aGUgYm9keSBoYXMgYW55IGJyZWFrLCBhdHRhY2ggYSBzeW50aGVzaXplZCBsYWJlbCB0byB0aGUKICAgICAgLy8gaWYgYmxvY2suCiAgICAgIGlmIChqdW1wSGFuZGxlci5oYXNBbnlCcmVhaygpKSB7CiAgICAgICAgTGFiZWxEZWZpbml0aW9uIGxhYmVsID0KICAgICAgICAgICAganVtcFRhcmdldC5hZGRMYWJlbCgnbG9vcCcsIGlzQnJlYWtUYXJnZXQ6IHRydWUpOwogICAgICAgIFN1YkdyYXBoIGxhYmVsR3JhcGggPSBuZXcgU3ViR3JhcGgoY29uZGl0aW9uQmxvY2ssIGJ1aWxkZXIuY3VycmVudCk7CiAgICAgICAgSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uIGxhYmVsSW5mbyA9IG5ldyBITGFiZWxlZEJsb2NrSW5mb3JtYXRpb24oCiAgICAgICAgICAgIG5ldyBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uKGxhYmVsR3JhcGgpLAogICAgICAgICAgICA8TGFiZWxEZWZpbml0aW9uPltsYWJlbF0pOwoKICAgICAgICBjb25kaXRpb25CbG9jay5zZXRCbG9ja0Zsb3cobGFiZWxJbmZvLCBidWlsZGVyLmN1cnJlbnQpOwoKICAgICAgICBqdW1wSGFuZGxlci5mb3JFYWNoQnJlYWsoKEhCcmVhayBicmVha0luc3RydWN0aW9uLCBfKSB7CiAgICAgICAgICBIQmFzaWNCbG9jayBibG9jayA9IGJyZWFrSW5zdHJ1Y3Rpb24uYmxvY2s7CiAgICAgICAgICBibG9jay5hZGRBdEV4aXQobmV3IEhCcmVhay50b0xhYmVsKAogICAgICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLCBsYWJlbCwgc291cmNlSW5mb3JtYXRpb24pKTsKICAgICAgICAgIGJsb2NrLnJlbW92ZShicmVha0luc3RydWN0aW9uKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAganVtcEhhbmRsZXIuY2xvc2UoKTsKICAgIGJ1aWxkZXIubG9vcERlcHRoLS07CiAgfQoKICAvLy8gQ3JlYXRlcyBhIG5ldyBsb29wLWhlYWRlciBibG9jay4gVGhlIHByZXZpb3VzIFtjdXJyZW50XSBibG9jawogIC8vLyBpcyBjbG9zZWQgd2l0aCBhbiBbSEdvdG9dIGFuZCByZXBsYWNlZCBieSB0aGUgbmV3bHkgY3JlYXRlZCBibG9jay4KICAvLy8gQWxzbyBub3RpZmllcyB0aGUgbG9jYWxzIGhhbmRsZXIgdGhhdCB3ZSdyZSBlbnRlcmluZyBhIGxvb3AuCiAgSnVtcEhhbmRsZXIgYmVnaW5Mb29wSGVhZGVyKGlyLlRyZWVOb2RlIG5vZGUsIEp1bXBUYXJnZXQganVtcFRhcmdldCkgewogICAgYXNzZXJ0KCFidWlsZGVyLmlzQWJvcnRlZCgpKTsKICAgIEhCYXNpY0Jsb2NrIHByZXZpb3VzQmxvY2sgPSBidWlsZGVyLmNsb3NlKG5ldyBIR290byhfYWJzdHJhY3RWYWx1ZURvbWFpbikpOwoKICAgIEp1bXBIYW5kbGVyIGp1bXBIYW5kbGVyID0KICAgICAgICBjcmVhdGVKdW1wSGFuZGxlcihub2RlLCBqdW1wVGFyZ2V0LCBpc0xvb3BKdW1wOiB0cnVlKTsKICAgIEhCYXNpY0Jsb2NrIGxvb3BFbnRyeSA9IGJ1aWxkZXIuZ3JhcGgKICAgICAgICAuYWRkTmV3TG9vcEhlYWRlckJsb2NrKGp1bXBIYW5kbGVyLnRhcmdldCwganVtcEhhbmRsZXIubGFiZWxzKTsKICAgIHByZXZpb3VzQmxvY2suYWRkU3VjY2Vzc29yKGxvb3BFbnRyeSk7CiAgICBidWlsZGVyLm9wZW4obG9vcEVudHJ5KTsKCiAgICBidWlsZGVyLmxvY2Fsc0hhbmRsZXIuYmVnaW5Mb29wSGVhZGVyKGxvb3BFbnRyeSk7CiAgICByZXR1cm4ganVtcEhhbmRsZXI7CiAgfQoKICAvLy8gRW5kcyB0aGUgbG9vcC4KICAvLy8KICAvLy8gSXQgZG9lcyB0aGlzIGJ5OgogIC8vLyAtIGNyZWF0aW5nIGEgbmV3IGJsb2NrIGFuZCBhZGRpbmcgaXQgYXMgc3VjY2Vzc29yIHRvIHRoZSBbYnJhbmNoRXhpdEJsb2NrXQogIC8vLyAgIGFuZCBhbnkgYmxvY2tzIHRoYXQgZW5kIGluIGJyZWFrLgogIC8vLyAtIG9wZW5pbmcgdGhlIG5ldyBibG9jayAoc2V0dGluZyBhcyBbY3VycmVudF0pLgogIC8vLyAtIG5vdGlmeWluZyB0aGUgbG9jYWxzIGhhbmRsZXIgdGhhdCB3ZSdyZSBleGl0aW5nIGEgbG9vcC4KICAvLy8KICAvLy8gW3NhdmVkTG9jYWxzXSBhcmUgdGhlIGxvY2FscyBmcm9tIHRoZSBlbmQgb2YgdGhlIGxvb3AgY29uZGl0aW9uLgogIC8vLwogIC8vLyBbYnJhbmNoRXhpdEJsb2NrXSBpcyB0aGUgZXhpdCAoYnJhbmNoaW5nKSBibG9jayBvZiB0aGUgY29uZGl0aW9uLgogIC8vLyBHZW5lcmFsbHkgdGhpcyBpcyBub3QgdGhlIHRvcCBvZiB0aGUgbG9vcCwgc2luY2UgdGhpcyB3b3VsZCBsZWFkIHRvCiAgLy8vIGNyaXRpY2FsIGVkZ2VzLiBJdCBpcyBudWxsIGZvciBkZWdlbmVyYXRlIGRvLXdoaWxlIGxvb3BzIHRoYXQgaGF2ZSBubyBiYWNrCiAgLy8vIGVkZ2UgYmVjYXVzZSB0aGV5IGFib3J0ICh0aHJvdy9yZXR1cm4vYnJlYWsgaW4gdGhlIGJvZHkgYW5kIGhhdmUgbm8KICAvLy8gY29udGludWVzKS4KICB2b2lkIGVuZExvb3AoSEJhc2ljQmxvY2sgbG9vcEVudHJ5LCBIQmFzaWNCbG9jayBicmFuY2hFeGl0QmxvY2ssCiAgICAgIEp1bXBIYW5kbGVyIGp1bXBIYW5kbGVyLCBMb2NhbHNIYW5kbGVyIHNhdmVkTG9jYWxzKSB7CiAgICBIQmFzaWNCbG9jayBsb29wRXhpdEJsb2NrID0gYnVpbGRlci5hZGROZXdCbG9jaygpOwoKICAgIExpc3Q8TG9jYWxzSGFuZGxlcj4gYnJlYWtIYW5kbGVycyA9IDxMb2NhbHNIYW5kbGVyPltdOwogICAgLy8gQ29sbGVjdCBkYXRhIGZvciB0aGUgc3VjY2Vzc29ycyBhbmQgdGhlIHBoaXMgYXQgZWFjaCBicmVhay4KICAgIGp1bXBIYW5kbGVyLmZvckVhY2hCcmVhaygoSEJyZWFrIGJyZWFrSW5zdHJ1Y3Rpb24sIExvY2Fsc0hhbmRsZXIgbG9jYWxzKSB7CiAgICAgIGJyZWFrSW5zdHJ1Y3Rpb24uYmxvY2suYWRkU3VjY2Vzc29yKGxvb3BFeGl0QmxvY2spOwogICAgICBicmVha0hhbmRsZXJzLmFkZChsb2NhbHMpOwogICAgfSk7CgogICAgLy8gVGhlIGV4aXQgYmxvY2sgaXMgYSBzdWNjZXNzb3Igb2YgdGhlIGxvb3AgY29uZGl0aW9uIGlmIGl0IGlzIHJlYWNoZWQuCiAgICAvLyBXZSBkb24ndCBhZGQgdGhlIHN1Y2Nlc3NvciBpbiB0aGUgY2FzZSBvZiBhIHdoaWxlL2ZvciBsb29wIHRoYXQgYWJvcnRzCiAgICAvLyBiZWNhdXNlIHRoZSBjYWxsZXIgb2YgZW5kTG9vcCB3aWxsIGJlIHdpcmluZyB1cCBhIHNwZWNpYWwgZW1wdHkgZWxzZQogICAgLy8gYmxvY2sgaW5zdGVhZC4KICAgIGlmIChicmFuY2hFeGl0QmxvY2sgIT0gbnVsbCkgewogICAgICBicmFuY2hFeGl0QmxvY2suYWRkU3VjY2Vzc29yKGxvb3BFeGl0QmxvY2spOwogICAgfQogICAgLy8gVXBkYXRlIHRoZSBwaGlzIGF0IHRoZSBsb29wIGVudHJ5IHdpdGggdGhlIGN1cnJlbnQgdmFsdWVzIG9mIGxvY2Fscy4KICAgIGJ1aWxkZXIubG9jYWxzSGFuZGxlci5lbmRMb29wKGxvb3BFbnRyeSk7CgogICAgLy8gU3RhcnQgZ2VuZXJhdGluZyBjb2RlIGZvciB0aGUgZXhpdCBibG9jay4KICAgIGJ1aWxkZXIub3Blbihsb29wRXhpdEJsb2NrKTsKCiAgICAvLyBDcmVhdGUgYSBuZXcgbG9jYWxzSGFuZGxlciBmb3IgdGhlIGxvb3BFeGl0QmxvY2sgd2l0aCB0aGUgY29ycmVjdCBwaGlzLgogICAgaWYgKCFicmVha0hhbmRsZXJzLmlzRW1wdHkpIHsKICAgICAgaWYgKGJyYW5jaEV4aXRCbG9jayAhPSBudWxsKSB7CiAgICAgICAgLy8gQWRkIHRoZSB2YWx1ZXMgb2YgdGhlIGxvY2FscyBhdCB0aGUgZW5kIG9mIHRoZSBjb25kaXRpb24gYmxvY2sgdG8KICAgICAgICAvLyB0aGUgcGhpcy4gIFRoZXNlIGFyZSB0aGUgdmFsdWVzIHRoYXQgZmxvdyB0byB0aGUgZXhpdCBpZiB0aGUKICAgICAgICAvLyBjb25kaXRpb24gZmFpbHMuCiAgICAgICAgYnJlYWtIYW5kbGVycy5hZGQoc2F2ZWRMb2NhbHMpOwogICAgICB9CiAgICAgIGJ1aWxkZXIubG9jYWxzSGFuZGxlciA9CiAgICAgICAgICBzYXZlZExvY2Fscy5tZXJnZU11bHRpcGxlKGJyZWFrSGFuZGxlcnMsIGxvb3BFeGl0QmxvY2spOwogICAgfSBlbHNlIHsKICAgICAgYnVpbGRlci5sb2NhbHNIYW5kbGVyID0gc2F2ZWRMb2NhbHM7CiAgICB9CiAgfQoKICAvLy8gRGV0ZXJtaW5lIHdoYXQga2luZCBvZiBsb29wIFtub2RlXSByZXByZXNlbnRzLgogIC8vLwogIC8vLyBUaGUgcmVzdWx0IGlzIG9uZSBvZiB0aGUga2luZHMgZGVmaW5lZCBpbiBbSExvb3BCbG9ja0luZm9ybWF0aW9uXS4KICBpbnQgbG9vcEtpbmQoaXIuVHJlZU5vZGUgbm9kZSk7CgogIC8vLyBDcmVhdGVzIGEgW0p1bXBIYW5kbGVyXSBmb3IgYSBzdGF0ZW1lbnQuIFRoZSBub2RlIG11c3QgYmUgYSBqdW1wCiAgLy8vIHRhcmdldC4gSWYgdGhlcmUgYXJlIG5vIGJyZWFrcyBvciBjb250aW51ZXMgdGFyZ2V0aW5nIHRoZSBzdGF0ZW1lbnQsCiAgLy8vIGEgc3BlY2lhbCAibnVsbCBoYW5kbGVyIiBpcyByZXR1cm5lZC4KICAvLy8KICAvLy8gW2lzTG9vcEp1bXBdIGlzIFs6dHJ1ZTpdIHdoZW4gdGhlIGp1bXAgaGFuZGxlciBpcyBmb3IgYSBsb29wLiBUaGlzIGlzIHVzZWQKICAvLy8gdG8gZGlzdGluZ3Vpc2ggdGhlIHN5bnRoZXNpemVkIGxvb3AgY3JlYXRlZCBmb3IgYSBzd2l0Y2ggc3RhdGVtZW50IHdpdGgKICAvLy8gY29udGludWUgc3RhdGVtZW50cyBmcm9tIHNpbXBsZSBzd2l0Y2ggc3RhdGVtZW50cy4KICBKdW1wSGFuZGxlciBjcmVhdGVKdW1wSGFuZGxlcihpci5UcmVlTm9kZSBub2RlLCBKdW1wVGFyZ2V0IGp1bXBUYXJnZXQsCiAgICAgIHtib29sIGlzTG9vcEp1bXB9KTsKfQoKLy8gVE9ETyhoZXQpOiBTaW5jZSBrZXJuZWwgc2ltcGxpZmllcyBsb29wIGJyZWFrcyBhbmQgY29udGludWVzLCB3ZSBzaG91bGQKLy8gcmV3cml0ZSB0aGUgbG9vcCBoYW5kbGVyIGZyb20gc2NyYXRjaCB0byBhY2NvdW50IGZvciB0aGUgc2ltcGxpZmllZCBzdHJ1Y3R1cmUKY2xhc3MgS2VybmVsTG9vcEhhbmRsZXIgZXh0ZW5kcyBMb29wSGFuZGxlciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgS2VybmVsU3NhR3JhcGhCdWlsZGVyIGJ1aWxkZXI7CgogIEtlcm5lbExvb3BIYW5kbGVyKEtlcm5lbFNzYUdyYXBoQnVpbGRlciBidWlsZGVyKQogICAgICA6IHRoaXMuYnVpbGRlciA9IGJ1aWxkZXIsCiAgICAgICAgc3VwZXIoYnVpbGRlcik7CgogIEBvdmVycmlkZQogIEp1bXBIYW5kbGVyIGNyZWF0ZUp1bXBIYW5kbGVyKGlyLlRyZWVOb2RlIG5vZGUsIEp1bXBUYXJnZXQganVtcFRhcmdldCwKICAgICAgICAgIHtib29sIGlzTG9vcEp1bXB9KSA9PgogICAgICBidWlsZGVyLmNyZWF0ZUp1bXBIYW5kbGVyKG5vZGUsIGp1bXBUYXJnZXQsIGlzTG9vcEp1bXA6IGlzTG9vcEp1bXApOwoKICBAb3ZlcnJpZGUKICBpbnQgbG9vcEtpbmQoaXIuVHJlZU5vZGUgbm9kZSkgPT4gbm9kZS5hY2NlcHQobmV3IF9LZXJuZWxMb29wVHlwZVZpc2l0b3IoKSk7Cn0KCmNsYXNzIF9LZXJuZWxMb29wVHlwZVZpc2l0b3IgZXh0ZW5kcyBpci5WaXNpdG9yPGludD4gewogIEBvdmVycmlkZQogIGludCBkZWZhdWx0Tm9kZShpci5Ob2RlIG5vZGUpID0+IEhMb29wQmxvY2tJbmZvcm1hdGlvbi5OT1RfQV9MT09QOwoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRXaGlsZVN0YXRlbWVudChpci5XaGlsZVN0YXRlbWVudCBub2RlKSA9PgogICAgICBITG9vcEJsb2NrSW5mb3JtYXRpb24uV0hJTEVfTE9PUDsKCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0Rm9yU3RhdGVtZW50KGlyLkZvclN0YXRlbWVudCBub2RlKSA9PiBITG9vcEJsb2NrSW5mb3JtYXRpb24uRk9SX0xPT1A7CgogIEBvdmVycmlkZQogIGludCB2aXNpdERvU3RhdGVtZW50KGlyLkRvU3RhdGVtZW50IG5vZGUpID0+CiAgICAgIEhMb29wQmxvY2tJbmZvcm1hdGlvbi5ET19XSElMRV9MT09QOwoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRGb3JJblN0YXRlbWVudChpci5Gb3JJblN0YXRlbWVudCBub2RlKSA9PgogICAgICBITG9vcEJsb2NrSW5mb3JtYXRpb24uRk9SX0lOX0xPT1A7CgogIEBvdmVycmlkZQogIGludCB2aXNpdFN3aXRjaFN0YXRlbWVudChpci5Td2l0Y2hTdGF0ZW1lbnQgbm9kZSkgPT4KICAgICAgSExvb3BCbG9ja0luZm9ybWF0aW9uLlNXSVRDSF9DT05USU5VRV9MT09QOwp9CoFkAE5OPAEoATEhMSgBHhweFQEpHScBHQEyLwEwBjs9PhMUKR0ZIBUTLREWFCwRFBsTAUkBGCscHj0lFCRPBgEZQUEyOQE1LE0oPgFKSxhPARE4NCIBTQwBUC1RAR8BUB0RUFFQNwFAEks1JgoBHzUtCAEhHkwBOR8lKk4jGkYlM0YjGggBHEEBEAEjOi0zRAFJPig2OgFNAS4+Gjk8MTQxMR4BNiwNUSAaERJMCwlCGjUfNk8sRAE/PS0BQhBBTTE4OjwxMgE9LD4BRhMnID5NSzcnAUEBQDYuQCoMCAYZGQQBRElDSSJQAR4/KkgrHQE2GAQBFQYXUSo2QAZHBkhKUUoSQzw3ATtDTzohCAFNTkwWIzMGTC4BMSEBTyIlTUgcKAgeQw0rBgQBNQZJIgFHSywGUU45SRoCAUtRLgwnATMgGAEMSSBLAQxPAgE3DEUBDDUoAQxRAQwvKwEMNSkBDDcyAgEqcGFja2FnZTpjb21waWxlci9zcmMvc3NhL2xvb3BfaGFuZGxlci5kYXJ0OXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NzYS9zc2FfYnJhbmNoX2J1aWxkZXIuZGFydJ6lLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9pby9zb3VyY2VfaW5mb3JtYXRpb24uZGFydCc7CgppbXBvcnQgJ2J1aWxkZXJfa2VybmVsLmRhcnQnOwppbXBvcnQgJ2xvY2Fsc19oYW5kbGVyLmRhcnQnOwppbXBvcnQgJ25vZGVzLmRhcnQnOwoKY2xhc3MgU3NhQnJhbmNoIHsKICBmaW5hbCBTc2FCcmFuY2hCdWlsZGVyIGJyYW5jaEJ1aWxkZXI7CiAgZmluYWwgSEJhc2ljQmxvY2sgYmxvY2s7CiAgTG9jYWxzSGFuZGxlciBzdGFydExvY2FsczsKICBMb2NhbHNIYW5kbGVyIGV4aXRMb2NhbHM7CiAgU3ViR3JhcGggZ3JhcGg7CgogIFNzYUJyYW5jaCh0aGlzLmJyYW5jaEJ1aWxkZXIpIDogYmxvY2sgPSBuZXcgSEJhc2ljQmxvY2soKTsKfQoKY2xhc3MgU3NhQnJhbmNoQnVpbGRlciB7CiAgZmluYWwgS2VybmVsU3NhR3JhcGhCdWlsZGVyIGJ1aWxkZXI7CiAgZmluYWwgU3Bhbm5hYmxlIGRpYWdub3N0aWNOb2RlOwoKICBTc2FCcmFuY2hCdWlsZGVyKHRoaXMuYnVpbGRlciwgW3RoaXMuZGlhZ25vc3RpY05vZGVdKTsKCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgX2Fic3RyYWN0VmFsdWVEb21haW4gPT4KICAgICAgYnVpbGRlci5jbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICB2b2lkIGNoZWNrTm90QWJvcnRlZCgpIHsKICAgIGlmIChidWlsZGVyLmlzQWJvcnRlZCgpKSB7CiAgICAgIGZhaWxlZEF0KGRpYWdub3N0aWNOb2RlLCAiYWJvcnRlZCBjb250cm9sIGZsb3ciKTsKICAgIH0KICB9CgogIHZvaWQgYnVpbGRDb25kaXRpb24oCiAgICAgIHZvaWQgdmlzaXRDb25kaXRpb24oKSwKICAgICAgU3NhQnJhbmNoIGNvbmRpdGlvbkJyYW5jaCwKICAgICAgU3NhQnJhbmNoIHRoZW5CcmFuY2gsCiAgICAgIFNzYUJyYW5jaCBlbHNlQnJhbmNoLAogICAgICBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbikgewogICAgc3RhcnRCcmFuY2goY29uZGl0aW9uQnJhbmNoKTsKICAgIHZpc2l0Q29uZGl0aW9uKCk7CiAgICBjaGVja05vdEFib3J0ZWQoKTsKICAgIGFzc2VydChpZGVudGljYWwoYnVpbGRlci5jdXJyZW50LCBidWlsZGVyLmxhc3RPcGVuZWRCbG9jaykpOwogICAgSEluc3RydWN0aW9uIGNvbmRpdGlvblZhbHVlID0gYnVpbGRlci5wb3BCb29saWZpZWQoKTsKICAgIEhJZiBicmFuY2ggPSBuZXcgSElmKF9hYnN0cmFjdFZhbHVlRG9tYWluLCBjb25kaXRpb25WYWx1ZSkKICAgICAgLi5zb3VyY2VJbmZvcm1hdGlvbiA9IHNvdXJjZUluZm9ybWF0aW9uOwogICAgSEJhc2ljQmxvY2sgY29uZGl0aW9uRXhpdEJsb2NrID0gYnVpbGRlci5jdXJyZW50OwogICAgYnVpbGRlci5jbG9zZShicmFuY2gpOwogICAgY29uZGl0aW9uQnJhbmNoLmV4aXRMb2NhbHMgPSBidWlsZGVyLmxvY2Fsc0hhbmRsZXI7CiAgICBjb25kaXRpb25FeGl0QmxvY2suYWRkU3VjY2Vzc29yKHRoZW5CcmFuY2guYmxvY2spOwogICAgY29uZGl0aW9uRXhpdEJsb2NrLmFkZFN1Y2Nlc3NvcihlbHNlQnJhbmNoLmJsb2NrKTsKICAgIGJvb2wgY29uZGl0aW9uQnJhbmNoTG9jYWxzQ2FuQmVSZXVzZWQgPQogICAgICAgIG1lcmdlTG9jYWxzKGNvbmRpdGlvbkJyYW5jaCwgdGhlbkJyYW5jaCwgbWF5UmV1c2VGcm9tTG9jYWxzOiB0cnVlKTsKICAgIG1lcmdlTG9jYWxzKGNvbmRpdGlvbkJyYW5jaCwgZWxzZUJyYW5jaCwKICAgICAgICBtYXlSZXVzZUZyb21Mb2NhbHM6IGNvbmRpdGlvbkJyYW5jaExvY2Fsc0NhbkJlUmV1c2VkKTsKCiAgICBjb25kaXRpb25CcmFuY2guZ3JhcGggPQogICAgICAgIG5ldyBTdWJFeHByZXNzaW9uKGNvbmRpdGlvbkJyYW5jaC5ibG9jaywgY29uZGl0aW9uRXhpdEJsb2NrKTsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGxvY2FscyBvZiB0aGUgW2Zyb21CcmFuY2hdIG1heSBiZSByZXVzZWQuIEEgWzp0cnVlOl0KICAvLy8gcmV0dXJuIHZhbHVlIGltcGxpZXMgdGhhdCBbbWF5UmV1c2VGcm9tTG9jYWxzXSB3YXMgc2V0IHRvIFs6dHJ1ZTpdLgogIGJvb2wgbWVyZ2VMb2NhbHMoU3NhQnJhbmNoIGZyb21CcmFuY2gsIFNzYUJyYW5jaCB0b0JyYW5jaCwKICAgICAge2Jvb2wgbWF5UmV1c2VGcm9tTG9jYWxzfSkgewogICAgTG9jYWxzSGFuZGxlciBmcm9tTG9jYWxzID0gZnJvbUJyYW5jaC5leGl0TG9jYWxzOwogICAgaWYgKHRvQnJhbmNoLnN0YXJ0TG9jYWxzID09IG51bGwpIHsKICAgICAgaWYgKG1heVJldXNlRnJvbUxvY2FscykgewogICAgICAgIHRvQnJhbmNoLnN0YXJ0TG9jYWxzID0gZnJvbUxvY2FsczsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9CcmFuY2guc3RhcnRMb2NhbHMgPSBuZXcgTG9jYWxzSGFuZGxlci5mcm9tKGZyb21Mb2NhbHMpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0b0JyYW5jaC5zdGFydExvY2Fscy5tZXJnZVdpdGgoZnJvbUxvY2FscywgdG9CcmFuY2guYmxvY2spOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CgogIHZvaWQgc3RhcnRCcmFuY2goU3NhQnJhbmNoIGJyYW5jaCkgewogICAgYnVpbGRlci5ncmFwaC5hZGRCbG9jayhicmFuY2guYmxvY2spOwogICAgYnVpbGRlci5sb2NhbHNIYW5kbGVyID0gYnJhbmNoLnN0YXJ0TG9jYWxzOwogICAgYnVpbGRlci5vcGVuKGJyYW5jaC5ibG9jayk7CiAgfQoKICBISW5zdHJ1Y3Rpb24gYnVpbGRCcmFuY2goU3NhQnJhbmNoIGJyYW5jaCwgdm9pZCB2aXNpdEJyYW5jaCgpLAogICAgICBTc2FCcmFuY2ggam9pbkJyYW5jaCwgYm9vbCBpc0V4cHJlc3Npb24pIHsKICAgIHN0YXJ0QnJhbmNoKGJyYW5jaCk7CiAgICB2aXNpdEJyYW5jaCgpOwogICAgYnJhbmNoLmdyYXBoID0gbmV3IFN1YkdyYXBoKGJyYW5jaC5ibG9jaywgYnVpbGRlci5sYXN0T3BlbmVkQmxvY2spOwogICAgYnJhbmNoLmV4aXRMb2NhbHMgPSBidWlsZGVyLmxvY2Fsc0hhbmRsZXI7CiAgICBpZiAoIWJ1aWxkZXIuaXNBYm9ydGVkKCkpIHsKICAgICAgYnVpbGRlci5nb3RvKGJ1aWxkZXIuY3VycmVudCwgam9pbkJyYW5jaC5ibG9jayk7CiAgICAgIG1lcmdlTG9jYWxzKGJyYW5jaCwgam9pbkJyYW5jaCwgbWF5UmV1c2VGcm9tTG9jYWxzOiB0cnVlKTsKICAgIH0KICAgIGlmIChpc0V4cHJlc3Npb24pIHsKICAgICAgY2hlY2tOb3RBYm9ydGVkKCk7CiAgICAgIHJldHVybiBidWlsZGVyLnBvcCgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBoYW5kbGVJZih2b2lkIHZpc2l0Q29uZGl0aW9uKCksIHZvaWQgdmlzaXRUaGVuKCksIHZvaWQgdmlzaXRFbHNlKCksCiAgICAgIHtTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbn0pIHsKICAgIGlmICh2aXNpdEVsc2UgPT0gbnVsbCkgewogICAgICAvLyBNYWtlIHN1cmUgdG8gaGF2ZSBhbiBlbHNlIHBhcnQgdG8gYXZvaWQgYSBjcml0aWNhbCBlZGdlLiBBCiAgICAgIC8vIGNyaXRpY2FsIGVkZ2UgaXMgYW4gZWRnZSB0aGF0IGNvbm5lY3RzIGEgYmxvY2sgd2l0aCBtdWx0aXBsZQogICAgICAvLyBzdWNjZXNzb3JzIHRvIGEgYmxvY2sgd2l0aCBtdWx0aXBsZSBwcmVkZWNlc3NvcnMuIFdlIGF2b2lkCiAgICAgIC8vIHN1Y2ggZWRnZXMgYmVjYXVzZSB0aGV5IHByZXZlbnQgaW5zZXJ0aW5nIGNvcGllcyBkdXJpbmcgY29kZQogICAgICAvLyBnZW5lcmF0aW9uIG9mIHBoaSBpbnN0cnVjdGlvbnMuCiAgICAgIHZpc2l0RWxzZSA9ICgpIHt9OwogICAgfQoKICAgIF9oYW5kbGVEaWFtb25kQnJhbmNoKHZpc2l0Q29uZGl0aW9uLCB2aXNpdFRoZW4sIHZpc2l0RWxzZSwKICAgICAgICBpc0V4cHJlc3Npb246IGZhbHNlLCBzb3VyY2VJbmZvcm1hdGlvbjogc291cmNlSW5mb3JtYXRpb24pOwogIH0KCiAgaGFuZGxlQ29uZGl0aW9uYWwodm9pZCB2aXNpdENvbmRpdGlvbigpLCB2b2lkIHZpc2l0VGhlbigpLCB2b2lkIHZpc2l0RWxzZSgpKSB7CiAgICBhc3NlcnQodmlzaXRFbHNlICE9IG51bGwpOwogICAgX2hhbmRsZURpYW1vbmRCcmFuY2godmlzaXRDb25kaXRpb24sIHZpc2l0VGhlbiwgdmlzaXRFbHNlLAogICAgICAgIGlzRXhwcmVzc2lvbjogdHJ1ZSk7CiAgfQoKICBoYW5kbGVJZk51bGwodm9pZCBsZWZ0KCksIHZvaWQgcmlnaHQoKSkgewogICAgLy8geCA/PyB5IGlzIHRyYW5zZm9ybWVkIGludG86IHggPT0gbnVsbCA/IHkgOiB4CiAgICBISW5zdHJ1Y3Rpb24gbGVmdEV4cHJlc3Npb247CiAgICBoYW5kbGVDb25kaXRpb25hbCgoKSB7CiAgICAgIGxlZnQoKTsKICAgICAgbGVmdEV4cHJlc3Npb24gPSBidWlsZGVyLnBvcCgpOwogICAgICBidWlsZGVyLnB1c2hDaGVja051bGwobGVmdEV4cHJlc3Npb24pOwogICAgfSwgcmlnaHQsICgpID0+IGJ1aWxkZXIuc3RhY2suYWRkKGxlZnRFeHByZXNzaW9uKSk7CiAgfQoKICAvLy8gQ3JlYXRlcyB0aGUgZ3JhcGggZm9yICcmJicgb3IgJ3x8JyBvcGVyYXRvcnMuCiAgLy8vCiAgLy8vIHggJiYgeSBpcyB0cmFuc2Zvcm1lZCBpbnRvOgogIC8vLwogIC8vLyAgICAgdDAgPSBib29saWZ5KHgpOwogIC8vLyAgICAgaWYgKHQwKSB7CiAgLy8vICAgICAgIHQxID0gYm9vbGlmeSh5KTsKICAvLy8gICAgIH0KICAvLy8gICAgIHJlc3VsdCA9IHBoaSh0MSwgZmFsc2UpOwogIC8vLwogIC8vLyB4IHx8IHkgaXMgdHJhbnNmb3JtZWQgaW50bzoKICAvLy8KICAvLy8gICAgIHQwID0gYm9vbGlmeSh4KTsKICAvLy8gICAgIGlmIChub3QodDApKSB7CiAgLy8vICAgICAgIHQxID0gYm9vbGlmeSh5KTsKICAvLy8gICAgIH0KICAvLy8gICAgIHJlc3VsdCA9IHBoaSh0MSwgdHJ1ZSk7CiAgdm9pZCBoYW5kbGVMb2dpY2FsQmluYXJ5KAogICAgICB2b2lkIGxlZnQoKSwgdm9pZCByaWdodCgpLCBTb3VyY2VJbmZvcm1hdGlvbiBzb3VyY2VJbmZvcm1hdGlvbiwKICAgICAge2Jvb2wgaXNBbmR9KSB7CiAgICBISW5zdHJ1Y3Rpb24gYm9vbGlmaWVkTGVmdDsKICAgIEhJbnN0cnVjdGlvbiBib29saWZpZWRSaWdodDsKCiAgICB2b2lkIHZpc2l0Q29uZGl0aW9uKCkgewogICAgICBsZWZ0KCk7CiAgICAgIGJvb2xpZmllZExlZnQgPSBidWlsZGVyLnBvcEJvb2xpZmllZCgpOwogICAgICBidWlsZGVyLnN0YWNrLmFkZChib29saWZpZWRMZWZ0KTsKICAgICAgaWYgKCFpc0FuZCkgewogICAgICAgIGJ1aWxkZXIucHVzaChuZXcgSE5vdChidWlsZGVyLnBvcCgpLCBfYWJzdHJhY3RWYWx1ZURvbWFpbi5ib29sVHlwZSkKICAgICAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgIH0KICAgIH0KCiAgICB2b2lkIHZpc2l0VGhlbigpIHsKICAgICAgcmlnaHQoKTsKICAgICAgYm9vbGlmaWVkUmlnaHQgPSBidWlsZGVyLnBvcEJvb2xpZmllZCgpOwogICAgfQoKICAgIGhhbmRsZUlmKHZpc2l0Q29uZGl0aW9uLCB2aXNpdFRoZW4sIG51bGwsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb246IHNvdXJjZUluZm9ybWF0aW9uKTsKICAgIEhDb25zdGFudCBub3RJc0FuZCA9CiAgICAgICAgYnVpbGRlci5ncmFwaC5hZGRDb25zdGFudEJvb2woIWlzQW5kLCBidWlsZGVyLmNsb3NlZFdvcmxkKTsKICAgIEhQaGkgcmVzdWx0ID0gbmV3IEhQaGkubWFueUlucHV0cygKICAgICAgICBudWxsLAogICAgICAgIDxISW5zdHJ1Y3Rpb24+W2Jvb2xpZmllZFJpZ2h0LCBub3RJc0FuZF0sCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZHluYW1pY1R5cGUpCiAgICAgIC4uc291cmNlSW5mb3JtYXRpb24gPSBzb3VyY2VJbmZvcm1hdGlvbjsKICAgIGJ1aWxkZXIuY3VycmVudC5hZGRQaGkocmVzdWx0KTsKICAgIGJ1aWxkZXIuc3RhY2suYWRkKHJlc3VsdCk7CiAgfQoKICB2b2lkIF9oYW5kbGVEaWFtb25kQnJhbmNoKAogICAgICB2b2lkIHZpc2l0Q29uZGl0aW9uKCksIHZvaWQgdmlzaXRUaGVuKCksIHZvaWQgdmlzaXRFbHNlKCksCiAgICAgIHtib29sIGlzRXhwcmVzc2lvbiwgU291cmNlSW5mb3JtYXRpb24gc291cmNlSW5mb3JtYXRpb259KSB7CiAgICBTc2FCcmFuY2ggY29uZGl0aW9uQnJhbmNoID0gbmV3IFNzYUJyYW5jaCh0aGlzKTsKICAgIFNzYUJyYW5jaCB0aGVuQnJhbmNoID0gbmV3IFNzYUJyYW5jaCh0aGlzKTsKICAgIFNzYUJyYW5jaCBlbHNlQnJhbmNoID0gbmV3IFNzYUJyYW5jaCh0aGlzKTsKICAgIFNzYUJyYW5jaCBqb2luQnJhbmNoID0gbmV3IFNzYUJyYW5jaCh0aGlzKTsKCiAgICBjb25kaXRpb25CcmFuY2guc3RhcnRMb2NhbHMgPSBidWlsZGVyLmxvY2Fsc0hhbmRsZXI7CiAgICBidWlsZGVyLmdvdG8oYnVpbGRlci5jdXJyZW50LCBjb25kaXRpb25CcmFuY2guYmxvY2spOwoKICAgIGJ1aWxkQ29uZGl0aW9uKHZpc2l0Q29uZGl0aW9uLCBjb25kaXRpb25CcmFuY2gsIHRoZW5CcmFuY2gsIGVsc2VCcmFuY2gsCiAgICAgICAgc291cmNlSW5mb3JtYXRpb24pOwogICAgSEluc3RydWN0aW9uIHRoZW5WYWx1ZSA9CiAgICAgICAgYnVpbGRCcmFuY2godGhlbkJyYW5jaCwgdmlzaXRUaGVuLCBqb2luQnJhbmNoLCBpc0V4cHJlc3Npb24pOwogICAgSEluc3RydWN0aW9uIGVsc2VWYWx1ZSA9CiAgICAgICAgYnVpbGRCcmFuY2goZWxzZUJyYW5jaCwgdmlzaXRFbHNlLCBqb2luQnJhbmNoLCBpc0V4cHJlc3Npb24pOwoKICAgIGlmIChpc0V4cHJlc3Npb24pIHsKICAgICAgYXNzZXJ0KHRoZW5WYWx1ZSAhPSBudWxsICYmIGVsc2VWYWx1ZSAhPSBudWxsKTsKICAgICAgSFBoaSBwaGkgPSBuZXcgSFBoaS5tYW55SW5wdXRzKG51bGwsIDxISW5zdHJ1Y3Rpb24+W3RoZW5WYWx1ZSwgZWxzZVZhbHVlXSwKICAgICAgICAgIF9hYnN0cmFjdFZhbHVlRG9tYWluLmR5bmFtaWNUeXBlKTsKICAgICAgam9pbkJyYW5jaC5ibG9jay5hZGRQaGkocGhpKTsKICAgICAgYnVpbGRlci5zdGFjay5hZGQocGhpKTsKICAgIH0KCiAgICBIQmFzaWNCbG9jayBqb2luQmxvY2s7CiAgICAvLyBJZiBhdCBsZWFzdCBvbmUgYnJhbmNoIGRpZCBub3QgYWJvcnQsIG9wZW4gdGhlIGpvaW5CcmFuY2guCiAgICBpZiAoIWpvaW5CcmFuY2guYmxvY2sucHJlZGVjZXNzb3JzLmlzRW1wdHkpIHsKICAgICAgc3RhcnRCcmFuY2goam9pbkJyYW5jaCk7CiAgICAgIGpvaW5CbG9jayA9IGpvaW5CcmFuY2guYmxvY2s7CiAgICB9CgogICAgSElmQmxvY2tJbmZvcm1hdGlvbiBpbmZvID0gbmV3IEhJZkJsb2NrSW5mb3JtYXRpb24oCiAgICAgICAgbmV3IEhTdWJFeHByZXNzaW9uQmxvY2tJbmZvcm1hdGlvbihjb25kaXRpb25CcmFuY2guZ3JhcGgpLAogICAgICAgIG5ldyBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uKHRoZW5CcmFuY2guZ3JhcGgpLAogICAgICAgIG5ldyBIU3ViR3JhcGhCbG9ja0luZm9ybWF0aW9uKGVsc2VCcmFuY2guZ3JhcGgpKTsKCiAgICBIQmFzaWNCbG9jayBjb25kaXRpb25TdGFydEJsb2NrID0gY29uZGl0aW9uQnJhbmNoLmJsb2NrOwogICAgY29uZGl0aW9uU3RhcnRCbG9jay5zZXRCbG9ja0Zsb3coaW5mbywgam9pbkJsb2NrKTsKICAgIFN1YkdyYXBoIGNvbmRpdGlvbkdyYXBoID0gY29uZGl0aW9uQnJhbmNoLmdyYXBoOwogICAgSElmIGJyYW5jaCA9IGNvbmRpdGlvbkdyYXBoLmVuZC5sYXN0OwogICAgYXNzZXJ0KGJyYW5jaCBpcyBISWYpOwogICAgYnJhbmNoLmJsb2NrSW5mb3JtYXRpb24gPSBjb25kaXRpb25TdGFydEJsb2NrLmJsb2NrRmxvdzsKICB9Cn0KgOwATk48ARkxKAEeHhUBEigbHRwSAT0CARknIgE5ATIvARsfOAYEARcdIRwcLSIWF0E6Py82Gzg3NyxMLT8BHEYEAU9KPSM2KCArFg9DFQgNQhMGBAEnKjAgBAFBMRkTSC8gN0EGGBkcBhEEAUYvHURGREYpGQYBP0QEAVEfPx0EASw1IRsOJi04BAE0BiIGGxQdDCMGIgYbGR0MIhxGFiAhARwOLigUTDQIBgEXDy8GAS4vGUQnDjIqLyQfBAEdQUI1MDAwATk6AUwcHUYdRgEYNlEtJB4GARtCMh8kBgE4Qzk6AT03NSobPQQCATBwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2Evc3NhX2JyYW5jaF9idWlsZGVyLmRhcnQ/c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL3N3aXRjaF9jb250aW51ZV9hbmFseXNpcy5kYXJ0jjIvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CgovLy8gSGVscGVyIGNsYXNzIHRoYXQgdHJhdmVyc2VzIGEga2VybmVsIEFTVCBzdWJ0cmVlIHRvIHNlZSBpZiBpdCBoYXMgYW55Ci8vLyBjb250aW51ZSBzdGF0ZW1lbnRzIGluIHRoZSBib2R5IG9mIGFueSBzd2l0Y2ggY2FzZXMgKGhhdmluZyBjb250aW51ZQovLy8gc3RhdGVtZW50cyByZXN1bHRzIGluIGEgbW9yZSBjb21wbGV4IGdlbmVyYXRlZCBjb2RlKS4KY2xhc3MgU3dpdGNoQ29udGludWVBbmFseXNpcyBleHRlbmRzIGlyLlZpc2l0b3I8Ym9vbD4gewogIFN3aXRjaENvbnRpbnVlQW5hbHlzaXMuXygpOwoKICBzdGF0aWMgYm9vbCBjb250YWluc0NvbnRpbnVlKGlyLlN0YXRlbWVudCBzd2l0Y2hDYXNlQm9keSkgewogICAgcmV0dXJuIHN3aXRjaENhc2VCb2R5LmFjY2VwdChuZXcgU3dpdGNoQ29udGludWVBbmFseXNpcy5fKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KGlyLkNvbnRpbnVlU3dpdGNoU3RhdGVtZW50IGNvbnRpbnVlU3RtdCkgewogICAgLy8gVE9ETyhlZm9ydHVuYSk6IENoZWNrIHdoYXQgdGhlIHRhcmdldCBvZiB0aGlzIGNvbnRpbnVlIHN0YXRlbWVudCBhY3R1YWxseQogICAgLy8gSVMsIGJlY2F1c2UgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBsYWJlbCBwb2ludHMgaWYgd2UgaGF2ZSBhIG5lc3RlZAogICAgLy8gc3dpdGNoIHN0YXRlbWVudCB3ZSBtaWdodCBiZSBhYmxlIHRvIG91dHB1dCBzaW1wbGVyIGNvZGUgKG5vdCB0aGUgY29tcGxleAogICAgLy8gc3dpdGNoIHN0YXRlbWVudCkuCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRCbG9jayhpci5CbG9jayBibG9jaykgewogICAgZm9yIChpci5TdGF0ZW1lbnQgc3RhdGVtZW50IGluIGJsb2NrLnN0YXRlbWVudHMpIHsKICAgICAgaWYgKHN0YXRlbWVudC5hY2NlcHQodGhpcykpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoaXIuTGFiZWxlZFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIHJldHVybiBzdGF0ZW1lbnQuYm9keS5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RG9TdGF0ZW1lbnQoaXIuRG9TdGF0ZW1lbnQgZG9TdGF0ZW1lbnQpIHsKICAgIHJldHVybiBkb1N0YXRlbWVudC5ib2R5LmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGb3JTdGF0ZW1lbnQoaXIuRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCkgewogICAgcmV0dXJuIGZvclN0YXRlbWVudC5ib2R5LmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGb3JJblN0YXRlbWVudChpci5Gb3JJblN0YXRlbWVudCBmb3JJblN0YXRlbWVudCkgewogICAgcmV0dXJuIGZvckluU3RhdGVtZW50LmJvZHkuYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFN3aXRjaFN0YXRlbWVudChpci5Td2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50KSB7CiAgICBmb3IgKHZhciBzd2l0Y2hDYXNlIGluIHN3aXRjaFN0YXRlbWVudC5jYXNlcykgewogICAgICBpZiAoc3dpdGNoQ2FzZS5hY2NlcHQodGhpcykpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFN3aXRjaENhc2UoaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlKSB7CiAgICByZXR1cm4gc3dpdGNoQ2FzZS5ib2R5LmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJZlN0YXRlbWVudChpci5JZlN0YXRlbWVudCBpZlN0YXRlbWVudCkgewogICAgcmV0dXJuIGlmU3RhdGVtZW50LnRoZW4uYWNjZXB0KHRoaXMpIHx8CiAgICAgICAgKGlmU3RhdGVtZW50Lm90aGVyd2lzZSAhPSBudWxsICYmIGlmU3RhdGVtZW50Lm90aGVyd2lzZS5hY2NlcHQodGhpcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFRyeUNhdGNoKGlyLlRyeUNhdGNoIHRyeUNhdGNoKSB7CiAgICBpZiAodHJ5Q2F0Y2guYm9keS5hY2NlcHQodGhpcykpIHsKICAgICAgZm9yICh2YXIgY2F0Y2hTdGF0ZW1lbnQgaW4gdHJ5Q2F0Y2guY2F0Y2hlcykgewogICAgICAgIGlmIChjYXRjaFN0YXRlbWVudC5hY2NlcHQodGhpcykpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFdoaWxlU3RhdGVtZW50KGlyLldoaWxlU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgcmV0dXJuIHN0YXRlbWVudC5ib2R5LmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRDYXRjaChpci5DYXRjaCBjYXRjaFN0YXRlbWVudCkgewogICAgcmV0dXJuIGNhdGNoU3RhdGVtZW50LmJvZHkuYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFRyeUZpbmFsbHkoaXIuVHJ5RmluYWxseSB0cnlGaW5hbGx5KSB7CiAgICByZXR1cm4gdHJ5RmluYWxseS5ib2R5LmFjY2VwdCh0aGlzKSAmJiB0cnlGaW5hbGx5LmZpbmFsaXplci5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihpci5GdW5jdGlvbkRlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgICByZXR1cm4gZGVjbGFyYXRpb24uZnVuY3Rpb24uYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEZ1bmN0aW9uTm9kZShpci5GdW5jdGlvbk5vZGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGUuYm9keS5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGRlZmF1bHRTdGF0ZW1lbnQoaXIuU3RhdGVtZW50IG5vZGUpIHsKICAgIGlmIChub2RlIGlzIGlyLkV4cHJlc3Npb25TdGF0ZW1lbnQgfHwKICAgICAgICBub2RlIGlzIGlyLkVtcHR5U3RhdGVtZW50IHx8CiAgICAgICAgbm9kZSBpcyBpci5CcmVha1N0YXRlbWVudCB8fAogICAgICAgIG5vZGUgaXMgaXIuUmV0dXJuU3RhdGVtZW50IHx8CiAgICAgICAgbm9kZSBpcyBpci5Bc3NlcnRTdGF0ZW1lbnQgfHwKICAgICAgICBub2RlIGlzIGlyLllpZWxkU3RhdGVtZW50IHx8CiAgICAgICAgbm9kZSBpcyBpci5WYXJpYWJsZURlY2xhcmF0aW9uKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRocm93ICdTdGF0ZW1lbnQgdHlwZSAke25vZGUucnVudGltZVR5cGV9IG5vdCBoYW5kbGVkIGluICcKICAgICAgICAnU3dpdGNoQ29udGludWVBbmFseXNpcyc7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGRlZmF1bHROb2RlKGlyLk5vZGUgbm9kZSkgPT4gZmFsc2U7Cn0KgIUATk48ASgBSkk6OB4BPkIEAQxPUUtRGhEEAQwkNyQVCAYSBAEMPigEAQw2KgQBDDkrBAEMPy0EAQxCNCUVCAYSBAEMMykEAQw2LE8EAQwtJjUrFwoIBhIEAQw6KAQBDC0tBAEMM04EAQxGLgQBDDEjBAEMLSolJSYmJSoUBj8iBAEMKwIBNnBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9zd2l0Y2hfY29udGludWVfYW5hbHlzaXMuZGFydDFzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pci9lbGVtZW50X21hcC5kYXJ0iygvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9pbmRleGVkLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL29yZGVyZWRfdHlwZXNldC5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9jYWxsX3N0cnVjdHVyZS5kYXJ0JzsKCi8vLyBJbnRlcmZhY2UgdGhhdCB0cmFuc2xhdGVzIGJldHdlZW4gS2VybmVsIElSIG5vZGVzIGFuZCBlbnRpdGllcy4KLy8vCi8vLyBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGludGVybmFsbHkgdG8gaW1wbGVtZW50IFtLZXJuZWxUb0VsZW1lbnRNYXBdIGluIHRoZQovLy8gZnJvbnRlbmQgYW5kIFtKc1RvRWxlbWVudE1hcF0gaW4gdGhlIGJhY2tlbmQuCmFic3RyYWN0IGNsYXNzIElyVG9FbGVtZW50TWFwIHsKICAvLy8gUmV0dXJucyB0aGUgW0RhcnRUeXBlXSBjb3JyZXNwb25kaW5nIHRvIFt0eXBlXS4KICBEYXJ0VHlwZSBnZXREYXJ0VHlwZShpci5EYXJ0VHlwZSB0eXBlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtNZW1iZXJFbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1lbWJlciBbbm9kZV0uCiAgTWVtYmVyRW50aXR5IGdldE1lbWJlcihpci5NZW1iZXIgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbRnVuY3Rpb25FbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb2NlZHVyZSBbbm9kZV0uCiAgRnVuY3Rpb25FbnRpdHkgZ2V0TWV0aG9kKGlyLlByb2NlZHVyZSBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtDb25zdHJ1Y3RvckVudGl0eV0gY29ycmVzcG9uZGluZyB0byB0aGUgZ2VuZXJhdGl2ZSBvciBmYWN0b3J5CiAgLy8vIGNvbnN0cnVjdG9yIFtub2RlXS4KICBDb25zdHJ1Y3RvckVudGl0eSBnZXRDb25zdHJ1Y3Rvcihpci5NZW1iZXIgbm9kZSk7CgogIC8vLyBSZXR1cm5zIHRoZSBbRmllbGRFbnRpdHldIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkIFtub2RlXS4KICBGaWVsZEVudGl0eSBnZXRGaWVsZChpci5GaWVsZCBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtDbGFzc0VudGl0eV0gY29ycmVzcG9uZGluZyB0byB0aGUgY2xhc3MgW25vZGVdLgogIENsYXNzRW50aXR5IGdldENsYXNzKGlyLkNsYXNzIG5vZGUpOwoKICAvLy8gUmV0dXJucyB0aGUgW0Z1bmN0aW9uVHlwZV0gb2YgdGhlIFtub2RlXS4KICBGdW5jdGlvblR5cGUgZ2V0RnVuY3Rpb25UeXBlKGlyLkZ1bmN0aW9uTm9kZSBub2RlKTsKCiAgLy8vIFJldHVybnMgdGhlIFtUeXBlZGVmVHlwZV0gY29ycmVzcG9uZGluZyB0byByYXcgdHlwZSBvZiB0aGUgdHlwZWRlZiBbbm9kZV0uCiAgVHlwZWRlZlR5cGUgZ2V0VHlwZWRlZlR5cGUoaXIuVHlwZWRlZiBub2RlKTsKCiAgLy8vIFJldHVybiB0aGUgW0ludGVyZmFjZVR5cGVdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFtjbHNdIHdpdGggdGhlIGdpdmVuCiAgLy8vIFt0eXBlQXJndW1lbnRzXS4KICBJbnRlcmZhY2VUeXBlIGNyZWF0ZUludGVyZmFjZVR5cGUoCiAgICAgIGlyLkNsYXNzIGNscywgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyk7CgogIC8vLyBSZXR1cm5zIHRoZSBbQ2FsbFN0cnVjdHVyZV0gY29ycmVzcG9uZGluZyB0byB0aGUgW2FyZ3VtZW50c10uCiAgQ2FsbFN0cnVjdHVyZSBnZXRDYWxsU3RydWN0dXJlKGlyLkFyZ3VtZW50cyBhcmd1bWVudHMpOwoKICAvLy8gUmV0dXJucyB0aGUgW1R5cGVWYXJpYWJsZUVudGl0eV0gY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBwYXJhbWV0ZXIKICAvLy8gW25vZGVdLgogIFR5cGVWYXJpYWJsZUVudGl0eSBnZXRUeXBlVmFyaWFibGUoaXIuVHlwZVBhcmFtZXRlciBub2RlKTsKCiAgQ29tbW9uRWxlbWVudHMgZ2V0IGNvbW1vbkVsZW1lbnRzOwogIERpYWdub3N0aWNSZXBvcnRlciBnZXQgcmVwb3J0ZXI7CiAgSW50ZXJmYWNlVHlwZSBnZXRUaGlzVHlwZShJbmRleGVkQ2xhc3MgY2xzKTsKICBJbnRlcmZhY2VUeXBlIGdldFN1cGVyVHlwZShJbmRleGVkQ2xhc3MgY2xzKTsKICBPcmRlcmVkVHlwZVNldCBnZXRPcmRlcmVkVHlwZVNldChJbmRleGVkQ2xhc3MgY2xzKTsKICBJdGVyYWJsZTxJbnRlcmZhY2VUeXBlPiBnZXRJbnRlcmZhY2VzKEluZGV4ZWRDbGFzcyBjbHMpOwogIEludGVyZmFjZVR5cGUgYXNJbnN0YW5jZU9mKEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3NFbnRpdHkgY2xzKTsKICBEYXJ0VHlwZSBzdWJzdEJ5Q29udGV4dChEYXJ0VHlwZSB0eXBlLCBJbnRlcmZhY2VUeXBlIGNvbnRleHQpOwogIERhcnRUeXBlIGdldENhbGxUeXBlKEludGVyZmFjZVR5cGUgdHlwZSk7CiAgaW50IGdldEhpZXJhcmNoeURlcHRoKEluZGV4ZWRDbGFzcyBjbHMpOwogIERhcnRUeXBlIGdldFR5cGVWYXJpYWJsZUJvdW5kKEluZGV4ZWRUeXBlVmFyaWFibGUgdHlwZVZhcmlhYmxlKTsKfQpJAE5OPAEoNC81ARkiJCMhIioBRARPMiA2KgFFKgFKLwFRGjQBQycBQycBMDYBUS8BSxclNgFEOgFLDj0BJSMvMDY7Q0EsK0MCAShwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9lbGVtZW50X21hcC5kYXJ0MnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL29yZGVyZWRfdHlwZXNldC5kYXJ0p34vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBvcmRlcmVkX3R5cGVzZXQ7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JwogICAgc2hvdyBMaW5rLCBMaW5rQnVpbGRlciwgTGlua0VudHJ5OwoKaW1wb3J0ICdjb21tb24uZGFydCc7CmltcG9ydCAnZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnQnOwoKLy8vIEFuIG9yZGVyZWQgc2V0IG9mIHRoZSBzdXBlcnR5cGVzIG9mIGEgY2xhc3MuIFRoZSBzdXBlcnR5cGVzIG9mIGEgY2xhc3MgYXJlCi8vLyBvcmRlcmVkIGJ5IGRlY3JlYXNpbmcgaGllcmFyY2h5IGRlcHRoIGFuZCBieSB0aGUgb3JkZXIgdGhleSBhcmUgZXh0ZW5kZWQsCi8vLyBtaXhlZCBpbiwgb3IgaW1wbGVtZW50ZWQuCi8vLwovLy8gRm9yIHRoZXNlIGNsYXNzZXMKLy8vCi8vLyAgICAgY2xhc3MgQSB7fSAvLyBEZXB0aCA9IDEuCi8vLyAgICAgY2xhc3MgQiB7fSAvLyBEZXB0aCA9IDEuCi8vLyAgICAgY2xhc3MgQyBleHRlbmRzIEIgaW1wbGVtZW50cyBBIHt9IC8vIERlcHRoIDIuCi8vLwovLy8gdGhlIG9yZGVyZWQgc3VwZXJ0eXBlcyBhcmUKLy8vCi8vLyAgICAgQTogW0EsIE9iamVjdF0KLy8vICAgICBCOiBbQiwgT2JqZWN0XQovLy8gICAgIEM6IFtDLCBCLCBBLCBPYmplY3RdCmNsYXNzIE9yZGVyZWRUeXBlU2V0IHsKICAvLy8gVGFnIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNlcmlhbGl6ZWQgW09yZGVyZWRUeXBlU2V0XSBvYmplY3RzIGluIGEKICAvLy8gZGVidWdnaW5nIGRhdGEgc3RyZWFtLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgdGFnID0gJ29yZGVyZWQtdHlwZS1zZXQnOwoKICBmaW5hbCBMaXN0PExpbms8SW50ZXJmYWNlVHlwZT4+IF9sZXZlbHM7CiAgZmluYWwgTGluazxJbnRlcmZhY2VUeXBlPiB0eXBlczsKCiAgT3JkZXJlZFR5cGVTZXQuaW50ZXJuYWwodGhpcy5fbGV2ZWxzLCB0aGlzLnR5cGVzKTsKCiAgLy8vIERlc2VyaWFsaXplcyBhIFtPcmRlcmVkVHlwZVNldF0gb2JqZWN0IGZyb20gW3NvdXJjZV0uCiAgZmFjdG9yeSBPcmRlcmVkVHlwZVNldC5yZWFkRnJvbURhdGFTb3VyY2UoRGF0YVNvdXJjZSBzb3VyY2UpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1ha2UgdGhlIGRlc2VyaWFsaXplZCB0eXBlIHNldHMgc2hhcmUgdGhlaXIKICAgIC8vIGludGVybmFsIGxpbmtzIGxpa2UgdGhlIG9yaWdpbmFsIHR5cGUgc2V0cyBkbz8KICAgIHNvdXJjZS5iZWdpbih0YWcpOwogICAgaW50IHR5cGVzQ291bnQgPSBzb3VyY2UucmVhZEludCgpOwogICAgTGlua0J1aWxkZXI8SW50ZXJmYWNlVHlwZT4gdHlwZUxpbmtCdWlsZGVyID0KICAgICAgICBuZXcgTGlua0J1aWxkZXI8SW50ZXJmYWNlVHlwZT4oKTsKICAgIExpc3Q8TGluazxJbnRlcmZhY2VUeXBlPj4gbGlua3MgPSBbXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXNDb3VudDsgaSsrKSB7CiAgICAgIGxpbmtzLmFkZCh0eXBlTGlua0J1aWxkZXIuYWRkTGFzdChzb3VyY2UucmVhZERhcnRUeXBlKCkpKTsKICAgIH0KICAgIExpbms8SW50ZXJmYWNlVHlwZT4gdHlwZXMgPQogICAgICAgIHR5cGVMaW5rQnVpbGRlci50b0xpbmsoY29uc3QgTGluazxJbnRlcmZhY2VUeXBlPigpKTsKICAgIGxpbmtzLmFkZChjb25zdCBMaW5rPEludGVyZmFjZVR5cGU+KCkpOwoKICAgIGludCBsZXZlbENvdW50ID0gc291cmNlLnJlYWRJbnQoKTsKICAgIExpc3Q8TGluazxJbnRlcmZhY2VUeXBlPj4gbGV2ZWxzID0KICAgICAgICBuZXcgTGlzdDxMaW5rPEludGVyZmFjZVR5cGU+PihsZXZlbENvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGV2ZWxDb3VudDsgaSsrKSB7CiAgICAgIGxldmVsc1tpXSA9IGxpbmtzW3NvdXJjZS5yZWFkSW50KCldOwogICAgfQogICAgc291cmNlLmVuZCh0YWcpOwogICAgcmV0dXJuIG5ldyBPcmRlcmVkVHlwZVNldC5pbnRlcm5hbChsZXZlbHMsIHR5cGVzKTsKICB9CgogIC8vLyBTZXJpYWxpemVzIHRoaXMgW09yZGVyZWRUeXBlU2V0XSB0byBbc2lua10uCiAgdm9pZCB3cml0ZVRvRGF0YVNpbmsoRGF0YVNpbmsgc2luaykgewogICAgc2luay5iZWdpbih0YWcpOwogICAgTGlzdDxJbnRlcmZhY2VUeXBlPiB0eXBlTGlzdCA9IHR5cGVzLnRvTGlzdCgpOwogICAgc2luay53cml0ZUludCh0eXBlTGlzdC5sZW5ndGgpOwogICAgZm9yIChJbnRlcmZhY2VUeXBlIHR5cGUgaW4gdHlwZUxpc3QpIHsKICAgICAgc2luay53cml0ZURhcnRUeXBlKHR5cGUpOwogICAgfQogICAgTGlzdDxpbnQ+IGxldmVsTGlzdCA9IFtdOwogICAgTGluazxJbnRlcmZhY2VUeXBlPiBsaW5rID0gdHlwZXM7CiAgICB3aGlsZSAobGluayAhPSBudWxsKSB7CiAgICAgIGludCBpbmRleCA9IF9sZXZlbHMuaW5kZXhPZihsaW5rKTsKICAgICAgaWYgKGluZGV4ICE9IC0xKSB7CiAgICAgICAgbGV2ZWxMaXN0LmFkZChpbmRleCk7CiAgICAgIH0KICAgICAgbGluayA9IGxpbmsudGFpbDsKICAgIH0KICAgIHNpbmsud3JpdGVJbnQobGV2ZWxMaXN0Lmxlbmd0aCk7CiAgICBmb3IgKGludCBsZXZlbCBpbiBsZXZlbExpc3QpIHsKICAgICAgc2luay53cml0ZUludChsZXZlbCk7CiAgICB9CiAgICBzaW5rLmVuZCh0YWcpOwogIH0KCiAgZmFjdG9yeSBPcmRlcmVkVHlwZVNldC5zaW5nbGV0b24oSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICBMaW5rPEludGVyZmFjZVR5cGU+IHR5cGVzID0KICAgICAgICBuZXcgTGlua0VudHJ5PEludGVyZmFjZVR5cGU+KHR5cGUsIGNvbnN0IExpbms8SW50ZXJmYWNlVHlwZT4oKSk7CiAgICBMaXN0PExpbms8SW50ZXJmYWNlVHlwZT4+IGxpc3QgPSBuZXcgTGlzdDxMaW5rPEludGVyZmFjZVR5cGU+PigxKTsKICAgIGxpc3RbMF0gPSB0eXBlczsKICAgIHJldHVybiBuZXcgT3JkZXJlZFR5cGVTZXQuaW50ZXJuYWwobGlzdCwgdHlwZXMpOwogIH0KCiAgLy8vIENyZWF0ZXMgYSBuZXcgW09yZGVyZWRUeXBlU2V0XSBmb3IgW3R5cGVdIHdoZW4gaXQgZGlyZWN0bHkgZXh0ZW5kcyB0aGUKICAvLy8gY2xhc3Mgd2hpY2ggdGhpcyBzZXQgcmVwcmVzZW50cy4gVGhpcyBpcyBmb3IgaW5zdGFuY2UgdXNlZCB0byBjcmVhdGUgdGhlCiAgLy8vIHR5cGUgc2V0IGZvciBbQ2xvc3VyZUNsYXNzRWxlbWVudF0gd2hpY2ggZXh0ZW5kcyBbQ2xvc3VyZV0uCiAgT3JkZXJlZFR5cGVTZXQgZXh0ZW5kQ2xhc3MoSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICBhc3NlcnQoCiAgICAgICAgdHlwZXMuaGVhZC50cmVhdEFzUmF3LAogICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICB0eXBlLmVsZW1lbnQsCiAgICAgICAgICAgICdDYW5ub3QgZXh0ZW5kIGdlbmVyaWMgY2xhc3MgJHt0eXBlcy5oZWFkfSB1c2luZyAnCiAgICAgICAgICAgICdPcmRlcmVkVHlwZVNldC5leHRlbmRDbGFzcycpKTsKICAgIExpbms8SW50ZXJmYWNlVHlwZT4gZXh0ZW5kZWRUeXBlcyA9CiAgICAgICAgbmV3IExpbmtFbnRyeTxJbnRlcmZhY2VUeXBlPih0eXBlLCB0eXBlcyk7CiAgICBMaXN0PExpbms8SW50ZXJmYWNlVHlwZT4+IGxpc3QgPSBuZXcgTGlzdDxMaW5rPEludGVyZmFjZVR5cGU+PihsZXZlbHMgKyAxKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGV2ZWxzOyBpKyspIHsKICAgICAgbGlzdFtpXSA9IF9sZXZlbHNbaV07CiAgICB9CiAgICBsaXN0W2xldmVsc10gPSBleHRlbmRlZFR5cGVzOwogICAgcmV0dXJuIG5ldyBPcmRlcmVkVHlwZVNldC5pbnRlcm5hbChsaXN0LCBleHRlbmRlZFR5cGVzKTsKICB9CgogIExpbms8SW50ZXJmYWNlVHlwZT4gZ2V0IHN1cGVydHlwZXMgPT4gdHlwZXMudGFpbDsKCiAgaW50IGdldCBsZXZlbHMgPT4gX2xldmVscy5sZW5ndGg7CgogIGludCBnZXQgbWF4RGVwdGggPT4gbGV2ZWxzIC0gMTsKCiAgTGluazxJbnRlcmZhY2VUeXBlPiBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IGxldmVscykgewogICAgICByZXR1cm4gX2xldmVsc1tpbmRleF07CiAgICB9CiAgICByZXR1cm4gY29uc3QgTGluazxJbnRlcmZhY2VUeXBlPigpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIG9mZnNldHMgaW50byBbdHlwZXNdIGF0IHdoaWNoIGVhY2ggbGV2ZWwgYmVnaW5zLgogIExpc3Q8aW50PiBnZXQgbGV2ZWxPZmZzZXRzIHsKICAgIExpc3Q8aW50PiBvZmZzZXRzID0gbmV3IExpc3QuZmlsbGVkKGxldmVscywgLTEpOwogICAgaW50IG9mZnNldCA9IDA7CiAgICBMaW5rPEludGVyZmFjZVR5cGU+IHBvaW50ZXIgPSB0eXBlczsKICAgIGZvciAoaW50IGRlcHRoID0gbWF4RGVwdGg7IGRlcHRoID49IDA7IGRlcHRoLS0pIHsKICAgICAgd2hpbGUgKCFpZGVudGljYWwocG9pbnRlciwgX2xldmVsc1tkZXB0aF0pKSB7CiAgICAgICAgcG9pbnRlciA9IHBvaW50ZXIudGFpbDsKICAgICAgICBvZmZzZXQrKzsKICAgICAgfQogICAgICBvZmZzZXRzW2RlcHRoXSA9IG9mZnNldDsKICAgIH0KICAgIHJldHVybiBvZmZzZXRzOwogIH0KCiAgdm9pZCBmb3JFYWNoKGludCBsZXZlbCwgdm9pZCBmKEludGVyZmFjZVR5cGUgdHlwZSkpIHsKICAgIGlmIChsZXZlbCA8IGxldmVscykgewogICAgICBMaW5rPEludGVyZmFjZVR5cGU+IHBvaW50ZXIgPSBfbGV2ZWxzW2xldmVsXTsKICAgICAgTGluazxJbnRlcmZhY2VUeXBlPiBlbmQgPQogICAgICAgICAgbGV2ZWwgPiAwID8gX2xldmVsc1tsZXZlbCAtIDFdIDogY29uc3QgTGluazxJbnRlcmZhY2VUeXBlPigpOwogICAgICAvLyBUT0RPKGhldCk6IGNoZWNraW5nIGBpc05vdEVtcHR5YCBzaG91bGQgYmUgdW5uZWNlc3NhcnksIHJlbW92ZSB3aGVuCiAgICAgIC8vIGNvbnN0YW50cyBhcmUgcHJvcGVybHkgY2Fub25pY2FsaXplZAogICAgICB3aGlsZSAocG9pbnRlci5pc05vdEVtcHR5ICYmICFpZGVudGljYWwocG9pbnRlciwgZW5kKSkgewogICAgICAgIGYocG9pbnRlci5oZWFkKTsKICAgICAgICBwb2ludGVyID0gcG9pbnRlci50YWlsOwogICAgICB9CiAgICB9CiAgfQoKICBJbnRlcmZhY2VUeXBlIGFzSW5zdGFuY2VPZihDbGFzc0VudGl0eSBjbHMsIGludCBoaWVyYXJjaHlEZXB0aCkgewogICAgaW50IGxldmVsID0gaGllcmFyY2h5RGVwdGg7CiAgICBpZiAobGV2ZWwgPCBsZXZlbHMpIHsKICAgICAgTGluazxJbnRlcmZhY2VUeXBlPiBwb2ludGVyID0gX2xldmVsc1tsZXZlbF07CiAgICAgIExpbms8SW50ZXJmYWNlVHlwZT4gZW5kID0KICAgICAgICAgIGxldmVsID4gMCA/IF9sZXZlbHNbbGV2ZWwgLSAxXSA6IGNvbnN0IExpbms8SW50ZXJmYWNlVHlwZT4oKTsKICAgICAgLy8gVE9ETyhoZXQpOiBjaGVja2luZyBgaXNOb3RFbXB0eWAgc2hvdWxkIGJlIHVubmVjZXNzYXJ5LCByZW1vdmUgd2hlbgogICAgICAvLyBjb25zdGFudHMgYXJlIHByb3Blcmx5IGNhbm9uaWNhbGl6ZWQKICAgICAgd2hpbGUgKHBvaW50ZXIuaXNOb3RFbXB0eSAmJiAhaWRlbnRpY2FsKHBvaW50ZXIsIGVuZCkpIHsKICAgICAgICBpZiAoY2xzID09IHBvaW50ZXIuaGVhZC5lbGVtZW50KSB7CiAgICAgICAgICByZXR1cm4gcG9pbnRlci5oZWFkOwogICAgICAgIH0KICAgICAgICBwb2ludGVyID0gcG9pbnRlci50YWlsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IHR5cGVzLnRvU3RyaW5nKCk7Cn0KCi8vLyBCdWlsZGVyIGZvciBjcmVhdGlvbiBhbiBvcmRlcmVkIHNldCBvZiB0aGUgc3VwZXJ0eXBlcyBvZiBhIGNsYXNzLiBUaGUKLy8vIHN1cGVydHlwZXMgYXJlIG9yZGVyZWQgYnkgZGVjcmVhc2luZyBoaWVyYXJjaHkgZGVwdGggYW5kIGJ5IHRoZSBvcmRlciB0aGV5Ci8vLyBhcmUgZXh0ZW5kZWQsIG1peGVkIGluLCBvciBpbXBsZW1lbnRlZC4KLy8vCi8vLyBGb3IgdGhlc2UgY2xhc3NlcwovLy8KLy8vICAgICBjbGFzcyBBIHt9IC8vIERlcHRoID0gMS4KLy8vICAgICBjbGFzcyBCIHt9IC8vIERlcHRoID0gMS4KLy8vICAgICBjbGFzcyBDIGV4dGVuZHMgQiBpbXBsZW1lbnRzIEEge30gLy8gRGVwdGggMi4KLy8vCi8vLyB0aGUgb3JkZXJlZCBzdXBlcnR5cGVzIGFyZQovLy8KLy8vICAgICBBOiBbQSwgT2JqZWN0XQovLy8gICAgIEI6IFtCLCBPYmplY3RdCi8vLyAgICAgQzogW0MsIEIsIEEsIE9iamVjdF0KYWJzdHJhY3QgY2xhc3MgT3JkZXJlZFR5cGVTZXRCdWlsZGVyIHsKICBPcmRlcmVkVHlwZVNldCBjcmVhdGVPcmRlcmVkVHlwZVNldCgKICAgICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUsIExpbms8RGFydFR5cGU+IGludGVyZmFjZXMpOwp9CgphYnN0cmFjdCBjbGFzcyBPcmRlcmVkVHlwZVNldEJ1aWxkZXJCYXNlIGltcGxlbWVudHMgT3JkZXJlZFR5cGVTZXRCdWlsZGVyIHsKICBNYXA8aW50LCBMaW5rRW50cnk8SW50ZXJmYWNlVHlwZT4+IG1hcCA9CiAgICAgIG5ldyBNYXA8aW50LCBMaW5rRW50cnk8SW50ZXJmYWNlVHlwZT4+KCk7CiAgaW50IG1heERlcHRoID0gLTE7CgogIGZpbmFsIENsYXNzRW50aXR5IGNsczsKCiAgT3JkZXJlZFR5cGVTZXRCdWlsZGVyQmFzZSh0aGlzLmNscyk7CgogIEludGVyZmFjZVR5cGUgZ2V0VGhpc1R5cGUoY292YXJpYW50IENsYXNzRW50aXR5IGNscyk7CiAgSW50ZXJmYWNlVHlwZSBzdWJzdEJ5Q29udGV4dCgKICAgICAgY292YXJpYW50IEludGVyZmFjZVR5cGUgdHlwZSwgY292YXJpYW50IEludGVyZmFjZVR5cGUgY29udGV4dCk7CiAgaW50IGdldEhpZXJhcmNoeURlcHRoKGNvdmFyaWFudCBDbGFzc0VudGl0eSBjbHMpOwogIE9yZGVyZWRUeXBlU2V0IGdldE9yZGVyZWRUeXBlU2V0KGNvdmFyaWFudCBDbGFzc0VudGl0eSBjbHMpOwoKICBAb3ZlcnJpZGUKICBPcmRlcmVkVHlwZVNldCBjcmVhdGVPcmRlcmVkVHlwZVNldCgKICAgICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUsIExpbms8RGFydFR5cGU+IGludGVyZmFjZXMpIHsKICAgIC8vIFRPRE8oMTUyOTYpOiBDb2xsYXBzZSB0aGVzZSBpdGVyYXRpb25zIHRvIG9uZSB3aGVuIHRoZSBvcmRlciBpcyBub3QKICAgIC8vIG5lZWRlZC4KICAgIGFkZChzdXBlcnR5cGUpOwogICAgZm9yIChMaW5rPERhcnRUeXBlPiBsaW5rID0gaW50ZXJmYWNlczsgIWxpbmsuaXNFbXB0eTsgbGluayA9IGxpbmsudGFpbCkgewogICAgICBhZGQobGluay5oZWFkKTsKICAgIH0KCiAgICBfYWRkQWxsU3VwZXJ0eXBlcyhzdXBlcnR5cGUpOwogICAgZm9yIChMaW5rPERhcnRUeXBlPiBsaW5rID0gaW50ZXJmYWNlczsgIWxpbmsuaXNFbXB0eTsgbGluayA9IGxpbmsudGFpbCkgewogICAgICBfYWRkQWxsU3VwZXJ0eXBlcyhsaW5rLmhlYWQpOwogICAgfQogICAgYWRkKGdldFRoaXNUeXBlKGNscykpOwogICAgcmV0dXJuIHRvVHlwZVNldCgpOwogIH0KCiAgLy8vIEFkZHMgW3R5cGVdIGFuZCBhbGwgc3VwZXJ0eXBlcyBvZiBbdHlwZV0gdG8gW2FsbFN1cGVydHlwZXNdIHdoaWxlCiAgLy8vIHN1YnN0aXR1dGluZyB0eXBlIHZhcmlhYmxlcy4KICB2b2lkIF9hZGRBbGxTdXBlcnR5cGVzKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgQ2xhc3NFbnRpdHkgY2xhc3NFbGVtZW50ID0gdHlwZS5lbGVtZW50OwogICAgTGluazxJbnRlcmZhY2VUeXBlPiBzdXBlcnR5cGVzID0gZ2V0T3JkZXJlZFR5cGVTZXQoY2xhc3NFbGVtZW50KS5zdXBlcnR5cGVzOwogICAgYXNzZXJ0KAogICAgICAgIHN1cGVydHlwZXMgIT0gbnVsbCwKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgY2xzLAogICAgICAgICAgICAiU3VwZXJ0eXBlcyBub3QgY29tcHV0ZWQgb24gJGNsYXNzRWxlbWVudCAiCiAgICAgICAgICAgICJkdXJpbmcgcmVzb2x1dGlvbiBvZiAkY2xzIikpOwogICAgd2hpbGUgKCFzdXBlcnR5cGVzLmlzRW1wdHkpIHsKICAgICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUgPSBzdXBlcnR5cGVzLmhlYWQ7CiAgICAgIGFkZChzdWJzdEJ5Q29udGV4dChzdXBlcnR5cGUsIHR5cGUpKTsKICAgICAgc3VwZXJ0eXBlcyA9IHN1cGVydHlwZXMudGFpbDsKICAgIH0KICB9CgogIHZvaWQgYWRkKEludGVyZmFjZVR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUuZWxlbWVudCA9PSBjbHMpIHsKICAgICAgX2FkZEF0RGVwdGgodHlwZSwgbWF4RGVwdGggKyAxKTsKICAgIH0gZWxzZSB7CiAgICAgIF9hZGRBdERlcHRoKHR5cGUsIGdldEhpZXJhcmNoeURlcHRoKHR5cGUuZWxlbWVudCkpOwogICAgfQogIH0KCiAgdm9pZCBfYWRkQXREZXB0aChJbnRlcmZhY2VUeXBlIHR5cGUsIGludCBkZXB0aCkgewogICAgTGlua0VudHJ5PEludGVyZmFjZVR5cGU+IHByZXYgPSBudWxsOwogICAgTGlua0VudHJ5PEludGVyZmFjZVR5cGU+IGxpbmsgPSBtYXBbZGVwdGhdOwogICAgd2hpbGUgKGxpbmsgIT0gbnVsbCkgewogICAgICBJbnRlcmZhY2VUeXBlIGV4aXN0aW5nVHlwZSA9IGxpbmsuaGVhZDsKICAgICAgaWYgKGV4aXN0aW5nVHlwZSA9PSB0eXBlKSByZXR1cm47CiAgICAgIGlmIChleGlzdGluZ1R5cGUuZWxlbWVudCA9PSB0eXBlLmVsZW1lbnQpIHsKICAgICAgICBhc3NlcnQoZmFsc2UsIGZhaWxlZEF0KGNscywgJ0ludmFsaWQgb3JkZXJlZCB0eXBlc2V0IGZvciAkY2xzJykpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBwcmV2ID0gbGluazsKICAgICAgbGluayA9IGxpbmsudGFpbDsKICAgIH0KICAgIExpbmtFbnRyeTxJbnRlcmZhY2VUeXBlPiBuZXh0ID0gbmV3IExpbmtFbnRyeTxJbnRlcmZhY2VUeXBlPih0eXBlKTsKICAgIG5leHQudGFpbCA9IG51bGw7CiAgICBpZiAocHJldiA9PSBudWxsKSB7CiAgICAgIG1hcFtkZXB0aF0gPSBuZXh0OwogICAgfSBlbHNlIHsKICAgICAgcHJldi50YWlsID0gbmV4dDsKICAgIH0KICAgIGlmIChkZXB0aCA+IG1heERlcHRoKSB7CiAgICAgIG1heERlcHRoID0gZGVwdGg7CiAgICB9CiAgfQoKICBPcmRlcmVkVHlwZVNldCB0b1R5cGVTZXQoKSB7CiAgICBMaXN0PExpbms8SW50ZXJmYWNlVHlwZT4+IGxldmVscyA9CiAgICAgICAgbmV3IExpc3Q8TGluazxJbnRlcmZhY2VUeXBlPj4obWF4RGVwdGggKyAxKTsKICAgIGlmIChtYXhEZXB0aCA8IDApIHsKICAgICAgcmV0dXJuIG5ldyBPcmRlcmVkVHlwZVNldC5pbnRlcm5hbChsZXZlbHMsIGNvbnN0IExpbms8SW50ZXJmYWNlVHlwZT4oKSk7CiAgICB9CiAgICBMaW5rPEludGVyZmFjZVR5cGU+IG5leHQgPSBjb25zdCBMaW5rPEludGVyZmFjZVR5cGU+KCk7CiAgICBmb3IgKGludCBkZXB0aCA9IDA7IGRlcHRoIDw9IG1heERlcHRoOyBkZXB0aCsrKSB7CiAgICAgIExpbmtFbnRyeTxJbnRlcmZhY2VUeXBlPiBmaXJzdCA9IG1hcFtkZXB0aF07CiAgICAgIGlmIChmaXJzdCA9PSBudWxsKSB7CiAgICAgICAgbGV2ZWxzW2RlcHRoXSA9IG5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV2ZWxzW2RlcHRoXSA9IGZpcnN0OwogICAgICAgIExpbmtFbnRyeTxJbnRlcmZhY2VUeXBlPiBsYXN0ID0gZmlyc3Q7CiAgICAgICAgd2hpbGUgKGxhc3QudGFpbCAhPSBudWxsKSB7CiAgICAgICAgICBsYXN0ID0gbGFzdC50YWlsOwogICAgICAgIH0KICAgICAgICBsYXN0LnRhaWwgPSBuZXh0OwogICAgICAgIG5leHQgPSBmaXJzdDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBPcmRlcmVkVHlwZVNldC5pbnRlcm5hbChsZXZlbHMsIGxldmVscy5sYXN0KTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAoaW50IGRlcHRoID0gMDsgZGVwdGggPD0gbWF4RGVwdGg7IGRlcHRoKyspIHsKICAgICAgc2Iud3JpdGUoJyRkZXB0aDogJyk7CiAgICAgIExpbmtFbnRyeTxJbnRlcmZhY2VUeXBlPiBmaXJzdCA9IG1hcFtkZXB0aF07CiAgICAgIGZpcnN0LnByaW50T24oc2IsICIsICIpOwogICAgICBzYi53cml0ZSgnXG4nKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQqBQwBOTjwBGQE5JwEWIR4rAU9OHgQWBCEhNgQfBBcXHRdIHTABKyMBNQE8QUg2FycxKiorQQYgPSwBJyczKysGFTcEATIoFTMkKyAGHiYbKRkeCBgGJSMcBhMEATkgSUcVNQQBTU9CMwwfEho/LCgzUCccBiI9BAE0ASQBIgEvGh0GKAQBQx81FCk2NCASCB8GFAQBOBo0IEhNLj8ZIAgGBAFEIBo0IEhNLj8rHwogCAYRBAEMKQIBSk8sBBYEISE2BB8EFxcdJyc7AgFMKzAVARkBJwE4IEY0PwEMJzxLDxROFgYBIk4kBhsYBAFIIy8tUQwcEhE4KyIxLCQGBAEhHycNOgYEATQqMBsuKDJKEAgTGAZIFhgZDRgGHBgGBAEfJzUYTwY8NjMbHg8fLyQcChoWCAY9BAEMFio2HDMfFgYaBAIBKXBhY2thZ2U6Y29tcGlsZXIvc3JjL29yZGVyZWRfdHlwZXNldC5kYXJ0OXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2NvbXBpbGVfdGltZV9jb25zdGFudHMuZGFydIQ0Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5jb21waWxlX3RpbWVfY29uc3RhbnRfZXZhbHVhdG9yOwoKaW1wb3J0ICdjb21tb24vdGFza3MuZGFydCcgc2hvdyBDb21waWxlclRhc2ssIE1lYXN1cmVyOwppbXBvcnQgJ2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwoKLy8vIEEgW0NvbnN0YW50RW52aXJvbm1lbnRdIHByb3ZpZGVzIGFjY2VzcyBmb3IgY29uc3RhbnRzIGNvbXBpbGVkIGZvciB2YXJpYWJsZQovLy8gaW5pdGlhbGl6ZXJzLgphYnN0cmFjdCBjbGFzcyBDb25zdGFudEVudmlyb25tZW50IHt9CgovLy8gQSBbQmFja2VuZENvbnN0YW50RW52aXJvbm1lbnRdIHByb3ZpZGVzIGFjY2VzcyB0byBjb25zdGFudHMgbmVlZGVkIGZvcgovLy8gYmFja2VuZCBpbXBsZW1lbnRhdGlvbi4KYWJzdHJhY3QgY2xhc3MgQmFja2VuZENvbnN0YW50RW52aXJvbm1lbnQgZXh0ZW5kcyBDb25zdGFudEVudmlyb25tZW50IHsKICAvLy8gUmVnaXN0ZXIgdGhhdCBbZWxlbWVudF0gbmVlZHMgbGF6eSBpbml0aWFsaXphdGlvbi4KICB2b2lkIHJlZ2lzdGVyTGF6eVN0YXRpYyhGaWVsZEVudGl0eSBlbGVtZW50KTsKfQoKLy8vIEludGVyZmFjZSBmb3IgdGhlIHRhc2sgdGhhdCBjb21waWxlcyB0aGUgY29uc3RhbnQgZW52aXJvbm1lbnRzIGZvciB0aGUKLy8vIGZyb250ZW5kIGFuZCBiYWNrZW5kIGludGVycHJldGF0aW9uIG9mIGNvbXBpbGUtdGltZSBjb25zdGFudHMuCmFic3RyYWN0IGNsYXNzIENvbnN0YW50Q29tcGlsZXJUYXNrIGV4dGVuZHMgQ29tcGlsZXJUYXNrCiAgICBpbXBsZW1lbnRzIENvbnN0YW50RW52aXJvbm1lbnQgewogIENvbnN0YW50Q29tcGlsZXJUYXNrKE1lYXN1cmVyIG1lYXN1cmVyKSA6IHN1cGVyKG1lYXN1cmVyKTsKfQocAE5OPAExATghAVASJgFLHEg5MAIBS0M5JT0CATBwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21waWxlX3RpbWVfY29uc3RhbnRzLmRhcnQ4c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaXIvY2FjaGVkX3N0YXRpY190eXBlLmRhcnSKUy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKaW1wb3J0ICdzdGF0aWNfdHlwZV9iYXNlLmRhcnQnOwppbXBvcnQgJ3N0YXRpY190eXBlX2NhY2hlLmRhcnQnOwppbXBvcnQgJ3N0YXRpY190eXBlX3Byb3ZpZGVyLmRhcnQnOwoKLy8vIENsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIHN0YXRpYyB0eXBlIG9mIGV4cHJlc3Npb24gdXNpbmcgdGhlIHZpc2l0b3IgcGF0dGVybgovLy8gYW5kIGEgcHJlY29tcHV0ZWQgY2FjaGUgZm9yIGNvbXBsZXggZXhwcmVzc2lvbiB0eXBlLgpjbGFzcyBDYWNoZWRTdGF0aWNUeXBlIGV4dGVuZHMgU3RhdGljVHlwZUJhc2UgaW1wbGVtZW50cyBTdGF0aWNUeXBlUHJvdmlkZXIgewogIGZpbmFsIFN0YXRpY1R5cGVDYWNoZSBfY2FjaGU7CgogIEBvdmVycmlkZQogIGZpbmFsIFRoaXNJbnRlcmZhY2VUeXBlIHRoaXNUeXBlOwoKICBDYWNoZWRTdGF0aWNUeXBlKAogICAgICBpci5UeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCB0aGlzLl9jYWNoZSwgdGhpcy50aGlzVHlwZSkKICAgICAgOiBzdXBlcih0eXBlRW52aXJvbm1lbnQpOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKGlyLkV4cHJlc3Npb24gbm9kZSkgewogICAgaXIuRGFydFR5cGUgdHlwZSA9IG5vZGUuYWNjZXB0KHRoaXMpOwogICAgYXNzZXJ0KHR5cGUgIT0gbnVsbCwgIk5vIHN0YXRpYyB0eXBlIGZvdW5kIGZvciAke25vZGUucnVudGltZVR5cGV9LiIpOwogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSBnZXRGb3JJbkl0ZXJhdG9yVHlwZShpci5Gb3JJblN0YXRlbWVudCBub2RlKSB7CiAgICBpci5EYXJ0VHlwZSB0eXBlID0gX2NhY2hlLmdldEZvckluSXRlcmF0b3JUeXBlKG5vZGUpOwogICAgYXNzZXJ0KHR5cGUgIT0gbnVsbCwgIk5vIGZvci1pbiBpdGVyYXRvciB0eXBlIGZvdW5kIGZvciAke25vZGV9LiIpOwogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBpci5EYXJ0VHlwZSBfZ2V0U3RhdGljVHlwZShpci5FeHByZXNzaW9uIG5vZGUpIHsKICAgIGlyLkRhcnRUeXBlIHR5cGUgPSBfY2FjaGVbbm9kZV07CiAgICBhc3NlcnQodHlwZSAhPSBudWxsLCAiTm8gc3RhdGljIHR5cGUgY2FjaGVkIGZvciAke25vZGUucnVudGltZVR5cGV9LiIpOwogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFZhcmlhYmxlR2V0KGlyLlZhcmlhYmxlR2V0IG5vZGUpID0+IF9nZXRTdGF0aWNUeXBlKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFByb3BlcnR5R2V0KGlyLlByb3BlcnR5R2V0IG5vZGUpID0+IF9nZXRTdGF0aWNUeXBlKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdERpcmVjdFByb3BlcnR5R2V0KGlyLkRpcmVjdFByb3BlcnR5R2V0IG5vZGUpID0+CiAgICAgIF9nZXRTdGF0aWNUeXBlKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN1cGVyUHJvcGVydHlHZXQoaXIuU3VwZXJQcm9wZXJ0eUdldCBub2RlKSA9PgogICAgICBfZ2V0U3RhdGljVHlwZShub2RlKTsKCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRNZXRob2RJbnZvY2F0aW9uKGlyLk1ldGhvZEludm9jYXRpb24gbm9kZSkgPT4KICAgICAgX2dldFN0YXRpY1R5cGUobm9kZSk7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0RGlyZWN0TWV0aG9kSW52b2NhdGlvbihpci5EaXJlY3RNZXRob2RJbnZvY2F0aW9uIG5vZGUpID0+CiAgICAgIF9nZXRTdGF0aWNUeXBlKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdFN0YXRpY0ludm9jYXRpb24oaXIuU3RhdGljSW52b2NhdGlvbiBub2RlKSA9PgogICAgICBfZ2V0U3RhdGljVHlwZShub2RlKTsKCiAgQG92ZXJyaWRlCiAgaXIuRGFydFR5cGUgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oaXIuU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpID0+CiAgICAgIF9nZXRTdGF0aWNUeXBlKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBpci5EYXJ0VHlwZSB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihpci5Db25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgPT4KICAgICAgX2dldFN0YXRpY1R5cGUobm9kZSk7CgogIEBvdmVycmlkZQogIGlyLkRhcnRUeXBlIHZpc2l0SW5zdGFudGlhdGlvbihpci5JbnN0YW50aWF0aW9uIG5vZGUpID0+IF9nZXRTdGF0aWNUeXBlKG5vZGUpOwp9ClQATk48ASg0LzE1ICEkAVA5TiABDCQBFEYgAQwyKksRBAEMPTpIEQQBMyVMEQQBDE0BDE0BDEMcAQxBHAEMQRwBDE0cAQxBHAEMSxwBDEscAQxRAgEvcGFja2FnZTpjb21waWxlci9zcmMvaXIvY2FjaGVkX3N0YXRpY190eXBlLmRhcnQrc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaXIvZGVidWcuZGFydIgxLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBIZWxwZXIgZm9yIGRlYnVnIEtlcm5lbCBub2Rlcy4KCmxpYnJhcnkga2VybmVsLmRlYnVnOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdmlzaXRvci5kYXJ0JzsKCmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgSW5kZW50YXRpb24sIFRhZ2dpbmc7CgpjbGFzcyBEZWJ1Z1ByaW50ZXIgZXh0ZW5kcyBWaXNpdG9yIHdpdGggSW5kZW50YXRpb24sIFRhZ2dpbmc8Tm9kZT4gewogIEBvdmVycmlkZQogIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKCiAgdm9pZCB2aXNpdE5vZGVXaXRoQ2hpbGRyZW4oTm9kZSBub2RlLCBTdHJpbmcgdHlwZSwgW01hcCBwYXJhbXNdKSB7CiAgICBvcGVuTm9kZShub2RlLCB0eXBlLCBwYXJhbXMpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgY2xvc2VOb2RlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHROb2RlKE5vZGUgbm9kZSkgewogICAgdmlzaXROb2RlV2l0aENoaWxkcmVuKG5vZGUsICcke25vZGUucnVudGltZVR5cGV9Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmFtZShOYW1lIG5vZGUpIHsKICAgIG9wZW5BbmRDbG9zZU5vZGUobm9kZSwgJyR7bm9kZS5ydW50aW1lVHlwZX0nLAogICAgICAgIHsnbmFtZSc6IG5vZGUubmFtZSwgJ2xpYnJhcnknOiBub2RlLmxpYnJhcnk/Lm5hbWV9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRMaXRlcmFsKEludExpdGVyYWwgbm9kZSkgewogICAgb3BlbkFuZENsb3NlTm9kZShub2RlLCAnJHtub2RlLnJ1bnRpbWVUeXBlfScsIHsndmFsdWUnOiAnJHtub2RlLnZhbHVlfSd9KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlKSB7CiAgICBvcGVuQW5kQ2xvc2VOb2RlKAogICAgICAgIG5vZGUsICcke25vZGUucnVudGltZVR5cGV9Jywgeyd2YXJpYWJsZSc6ICcke25vZGUudmFyaWFibGV9J30pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgewogICAgb3BlbkFuZENsb3NlTm9kZShub2RlLCAnJHtub2RlLnJ1bnRpbWVUeXBlfScsIHsndGFyZ2V0JzogJyR7bm9kZS50YXJnZXR9J30pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBvcGVuTm9kZShub2RlLCAnJHtub2RlLnJ1bnRpbWVUeXBlfScsIHsKICAgICAgJ25hbWUnOiAnJHtub2RlLm5hbWUgPz8gJy0tdW5uYW1lZC0tJ30nLAogICAgICAnaXNGaW5hbCc6ICcke25vZGUuaXNGaW5hbH0nLAogICAgICAnaXNDb25zdCc6ICcke25vZGUuaXNDb25zdH0nLAogICAgICAnaXNGaWVsZEZvcm1hbCc6ICcke25vZGUuaXNGaWVsZEZvcm1hbH0nCiAgICB9KTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIGNsb3NlTm9kZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICBvcGVuTm9kZShub2RlLCAnJHtub2RlLnJ1bnRpbWVUeXBlfScsIHsKICAgICAgJ25hbWUnOiAnJHtub2RlLmNsYXNzTm9kZS5uYW1lfScsCiAgICB9KTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIGNsb3NlTm9kZSgpOwogIH0KCiAgLy8vIFByZXR0eS1wcmludHMgZ2l2ZW4gbm9kZSB0cmVlIGludG8gc3RyaW5nLgogIHN0YXRpYyBTdHJpbmcgcHJldHR5UHJpbnQoTm9kZSBub2RlKSB7CiAgICB2YXIgcCA9IG5ldyBEZWJ1Z1ByaW50ZXIoKTsKICAgIG5vZGUuYWNjZXB0KHApOwogICAgcmV0dXJuIHAuc2IudG9TdHJpbmcoKTsKICB9Cn0KUABOTjwBIwEWASImATYBRQwoAUUiHhEEAQwgOAQBDB4yPQQBDCpPBAEMLBZIBAEMKFEEAQw8LC8kJC8IHhEEAQwwLCgIHhEEATEpIBQcBAIBInBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL2RlYnVnLmRhcnQrc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaXIvdHlwZXMuZGFydJINLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL29yZGVyZWRfdHlwZXNldC5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50X21hcC5kYXJ0JzsKCi8vLyBTdXBwb3J0IGZvciBzdWJ0eXBlIGNoZWNrcyBvZiBrZXJuZWwgYmFzZWQgW0RhcnRUeXBlXXMuCmNsYXNzIEtlcm5lbERhcnRUeXBlcyBleHRlbmRzIERhcnRUeXBlcyB7CiAgZmluYWwgSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcDsKICBmaW5hbCBTdWJ0eXBlVmlzaXRvcjxEYXJ0VHlwZT4gc3VidHlwZVZpc2l0b3I7CiAgZmluYWwgUG90ZW50aWFsU3VidHlwZVZpc2l0b3I8RGFydFR5cGU+IHBvdGVudGlhbFN1YnR5cGVWaXNpdG9yOwoKICBLZXJuZWxEYXJ0VHlwZXModGhpcy5lbGVtZW50TWFwKQogICAgICA6IHRoaXMuc3VidHlwZVZpc2l0b3IgPSBuZXcgS2VybmVsU3VidHlwZVZpc2l0b3IoZWxlbWVudE1hcCksCiAgICAgICAgdGhpcy5wb3RlbnRpYWxTdWJ0eXBlVmlzaXRvciA9CiAgICAgICAgICAgIG5ldyBfS2VybmVsUG90ZW50aWFsU3VidHlwZVZpc2l0b3IoZWxlbWVudE1hcCk7CgogIEBvdmVycmlkZQogIGJvb2wgaXNQb3RlbnRpYWxTdWJ0eXBlKERhcnRUeXBlIHQsIERhcnRUeXBlIHMsCiAgICAgIHtib29sIGFzc3VtZUluc3RhbnRpYXRpb25zOiB0cnVlfSkgewogICAgcmV0dXJuIHBvdGVudGlhbFN1YnR5cGVWaXNpdG9yLmlzUG90ZW50aWFsU3VidHlwZSh0LCBzLAogICAgICAgIGFzc3VtZUluc3RhbnRpYXRpb25zOiBhc3N1bWVJbnN0YW50aWF0aW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzQXNzaWduYWJsZShEYXJ0VHlwZSB0LCBEYXJ0VHlwZSBzKSB7CiAgICByZXR1cm4gaXNTdWJ0eXBlKHQsIHMpIHx8IGlzU3VidHlwZShzLCB0KTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNTdWJ0eXBlKERhcnRUeXBlIHQsIERhcnRUeXBlIHMpIHsKICAgIHJldHVybiBzdWJ0eXBlVmlzaXRvci5pc1N1YnR5cGUodCwgcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldFRoaXNUeXBlKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0VGhpc1R5cGUoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0U3VwZXJ0eXBlKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0U3VwZXJUeXBlKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxJbnRlcmZhY2VUeXBlPiBnZXRTdXBlcnR5cGVzKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0T3JkZXJlZFR5cGVTZXQoY2xzKS5zdXBlcnR5cGVzOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8SW50ZXJmYWNlVHlwZT4gZ2V0SW50ZXJmYWNlcyhDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLmdldEludGVyZmFjZXMoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgYXNJbnN0YW5jZU9mKEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3NFbnRpdHkgY2xzKSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5hc0luc3RhbmNlT2YodHlwZSwgY2xzKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHN1YnN0QnlDb250ZXh0KERhcnRUeXBlIGJhc2UsIEludGVyZmFjZVR5cGUgY29udGV4dCkgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuc3Vic3RCeUNvbnRleHQoYmFzZSwgY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBGdW5jdGlvblR5cGUgZ2V0Q2FsbFR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICBEYXJ0VHlwZSBjYWxsVHlwZSA9IGVsZW1lbnRNYXAuZ2V0Q2FsbFR5cGUodHlwZSk7CiAgICByZXR1cm4gY2FsbFR5cGUgaXMgRnVuY3Rpb25UeXBlID8gY2FsbFR5cGUgOiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjaGVja1R5cGVWYXJpYWJsZUJvdW5kczxUPigKICAgICAgVCBjb250ZXh0LAogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlVmFyaWFibGVzLAogICAgICB2b2lkIGNoZWNrVHlwZVZhcmlhYmxlQm91bmQoVCBjb250ZXh0LCBEYXJ0VHlwZSB0eXBlQXJndW1lbnQsCiAgICAgICAgICBUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZSwgRGFydFR5cGUgYm91bmQpKSB7CiAgICBhc3NlcnQodHlwZVZhcmlhYmxlcy5sZW5ndGggPT0gdHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgIERhcnRUeXBlIHR5cGVBcmd1bWVudCA9IHR5cGVBcmd1bWVudHNbaW5kZXhdOwogICAgICBUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZSA9IHR5cGVWYXJpYWJsZXNbaW5kZXhdOwogICAgICBEYXJ0VHlwZSBib3VuZCA9IGVsZW1lbnRNYXAKICAgICAgICAgIC5nZXRUeXBlVmFyaWFibGVCb3VuZCh0eXBlVmFyaWFibGUuZWxlbWVudCkKICAgICAgICAgIC5zdWJzdCh0eXBlQXJndW1lbnRzLCB0eXBlVmFyaWFibGVzKTsKICAgICAgY2hlY2tUeXBlVmFyaWFibGVCb3VuZChjb250ZXh0LCB0eXBlQXJndW1lbnQsIHR5cGVWYXJpYWJsZSwgYm91bmQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgQ29tbW9uRWxlbWVudHMgZ2V0IGNvbW1vbkVsZW1lbnRzID0+IGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHM7Cn0KCmNsYXNzIEtlcm5lbE9yZGVyZWRUeXBlU2V0QnVpbGRlciBleHRlbmRzIE9yZGVyZWRUeXBlU2V0QnVpbGRlckJhc2UgewogIGZpbmFsIElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXA7CgogIEtlcm5lbE9yZGVyZWRUeXBlU2V0QnVpbGRlcih0aGlzLmVsZW1lbnRNYXAsIENsYXNzRW50aXR5IGNscykgOiBzdXBlcihjbHMpOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldFRoaXNUeXBlKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0VGhpc1R5cGUoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgc3Vic3RCeUNvbnRleHQoSW50ZXJmYWNlVHlwZSB0eXBlLCBJbnRlcmZhY2VUeXBlIGNvbnRleHQpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLnN1YnN0QnlDb250ZXh0KHR5cGUsIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldEhpZXJhcmNoeURlcHRoKENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0SGllcmFyY2h5RGVwdGgoY2xzKTsKICB9CgogIEBvdmVycmlkZQogIE9yZGVyZWRUeXBlU2V0IGdldE9yZGVyZWRUeXBlU2V0KENsYXNzRW50aXR5IGNscykgewogICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0T3JkZXJlZFR5cGVTZXQoY2xzKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHlwZVJlbGF0aW9uTWl4aW4KICAgIGltcGxlbWVudHMgQWJzdHJhY3RUeXBlUmVsYXRpb248RGFydFR5cGU+IHsKICBJclRvRWxlbWVudE1hcCBnZXQgZWxlbWVudE1hcDsKCiAgQG92ZXJyaWRlCiAgQ29tbW9uRWxlbWVudHMgZ2V0IGNvbW1vbkVsZW1lbnRzID0+IGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHM7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldFR5cGVWYXJpYWJsZUJvdW5kKFR5cGVWYXJpYWJsZUVudGl0eSBlbGVtZW50KSB7CiAgICByZXR1cm4gZWxlbWVudE1hcC5nZXRUeXBlVmFyaWFibGVCb3VuZChlbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uVHlwZSBnZXRDYWxsVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLmdldENhbGxUeXBlKHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBhc0luc3RhbmNlT2YoSW50ZXJmYWNlVHlwZSB0eXBlLCBDbGFzc0VudGl0eSBjbHMpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLmFzSW5zdGFuY2VPZih0eXBlLCBjbHMpOwogIH0KfQoKY2xhc3MgS2VybmVsU3VidHlwZVZpc2l0b3IgZXh0ZW5kcyBTdWJ0eXBlVmlzaXRvcjxEYXJ0VHlwZT4KICAgIHdpdGggQWJzdHJhY3RUeXBlUmVsYXRpb25NaXhpbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcDsKCiAgS2VybmVsU3VidHlwZVZpc2l0b3IodGhpcy5lbGVtZW50TWFwKTsKfQoKY2xhc3MgX0tlcm5lbFBvdGVudGlhbFN1YnR5cGVWaXNpdG9yIGV4dGVuZHMgUG90ZW50aWFsU3VidHlwZVZpc2l0b3I8RGFydFR5cGU+CiAgICB3aXRoIEFic3RyYWN0VHlwZVJlbGF0aW9uTWl4aW4gewogIEBvdmVycmlkZQogIGZpbmFsIElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXA7CgogIF9LZXJuZWxQb3RlbnRpYWxTdWJ0eXBlVmlzaXRvcih0aGlzLmVsZW1lbnRNYXApOwp9CoCiAE5OPAEiJCEiGwE8KiMxQwEjRCc8AQwyKzw1BAEMLi8EAQwrKwQBDC8oBAEMMCkEAQw7OQQBDDsqBAEMRC8EAQxCNQQBDDE2NwQBDCMRJCREPDpBNDwiNjBKBgQBDEICAUYjAU4BDC8oBAEMTDUEAQwrLgQBDDYuBAIBKTAhAQxCAQw+NQQBDDEpBAEMRC8EAgE8JQwjASkCAU8lDCMBMwIBInBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL3R5cGVzLmRhcnQuc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaXIvdmlzaXRvcnMuZGFydMAAbokvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgYXMgaXI7CgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvY29uc3RhbnRfc3lzdGVtLmRhcnQnIGFzIGNvbnN0YW50X3N5c3RlbTsKaW1wb3J0ICcuLi9jb25zdGFudHMvY29uc3RydWN0b3JzLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy9leHByZXNzaW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9vcGVyYXRvcnMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaXIvZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnLi4vaXIvdXRpbC5kYXJ0JzsKCi8vLyBWaXNpdG9yIHRoYXQgY29udmVydHMgc3RyaW5nIGxpdGVyYWxzIGFuZCBjb25jYXRlbmF0aW9ucyBvZiBzdHJpbmcgbGl0ZXJhbHMKLy8vIGludG8gdGhlIHN0cmluZyB2YWx1ZS4KY2xhc3MgU3RyaW5naWZpZXIgZXh0ZW5kcyBpci5FeHByZXNzaW9uVmlzaXRvcjxTdHJpbmc+IHsKICBAb3ZlcnJpZGUKICBTdHJpbmcgdmlzaXRTdHJpbmdMaXRlcmFsKGlyLlN0cmluZ0xpdGVyYWwgbm9kZSkgPT4gbm9kZS52YWx1ZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihpci5TdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAoaXIuRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIG5vZGUuZXhwcmVzc2lvbnMpIHsKICAgICAgU3RyaW5nIHZhbHVlID0gZXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgc2Iud3JpdGUodmFsdWUpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgovLy8gVmlzaXRvciB0aGF0IGNvbnZlcnRzIGEga2VybmVsIGNvbnN0YW50IGV4cHJlc3Npb24gaW50byBhCi8vLyBbQ29uc3RhbnRFeHByZXNzaW9uXS4KY2xhc3MgQ29uc3RhbnRpZmllciBleHRlbmRzIGlyLkV4cHJlc3Npb25WaXNpdG9yPENvbnN0YW50RXhwcmVzc2lvbj4gewogIGZpbmFsIGJvb2wgcmVxdWlyZUNvbnN0YW50OwogIGZpbmFsIElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXA7CiAgaXIuVHJlZU5vZGUgZmFpbE5vZGU7CiAgZmluYWwgTWFwPGlyLlZhcmlhYmxlRGVjbGFyYXRpb24sIENvbnN0YW50RXhwcmVzc2lvbj4gX2luaXRpYWxpemVyTG9jYWxzID0KICAgICAgPGlyLlZhcmlhYmxlRGVjbGFyYXRpb24sIENvbnN0YW50RXhwcmVzc2lvbj57fTsKCiAgQ29uc3RhbnRpZmllcih0aGlzLmVsZW1lbnRNYXAsIHt0aGlzLnJlcXVpcmVDb25zdGFudDogdHJ1ZX0pOwoKICBDb21tb25FbGVtZW50cyBnZXQgX2NvbW1vbkVsZW1lbnRzID0+IGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHM7CgogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdChpci5FeHByZXNzaW9uIG5vZGUpIHsKICAgIENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudCA9IG5vZGUuYWNjZXB0KHRoaXMpOwogICAgaWYgKGNvbnN0YW50ID09IG51bGwgJiYgcmVxdWlyZUNvbnN0YW50KSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFN1cHBvcnQgY29udGV4dHVhbCBlcnJvciBtZXNzYWdlcy4KICAgICAgZWxlbWVudE1hcC5yZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShmYWlsTm9kZSA/PyBub2RlKSwKICAgICAgICAgIE1lc3NhZ2VLaW5kLk5PVF9BX0NPTVBJTEVfVElNRV9DT05TVEFOVCk7CiAgICAgIHJldHVybiBuZXcgRXJyb25lb3VzQ29uc3RhbnRFeHByZXNzaW9uKCk7CiAgICB9CiAgICByZXR1cm4gY29uc3RhbnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gZGVmYXVsdEV4cHJlc3Npb24oaXIuRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpZiAocmVxdWlyZUNvbnN0YW50KSB7CiAgICAgIGZhaWxOb2RlID8/PSBub2RlOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBMaXN0PENvbnN0YW50RXhwcmVzc2lvbj4gX2NvbXB1dGVMaXN0KExpc3Q8aXIuRXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMpIHsKICAgIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiBsaXN0ID0gPENvbnN0YW50RXhwcmVzc2lvbj5bXTsKICAgIGZvciAoaXIuRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGV4cHJlc3Npb25zKSB7CiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudCA9IHZpc2l0KGV4cHJlc3Npb24pOwogICAgICBpZiAoY29uc3RhbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIGxpc3QuYWRkKGNvbnN0YW50KTsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgTGlzdDxDb25zdGFudEV4cHJlc3Npb24+IF9jb21wdXRlQXJndW1lbnRzKGlyLkFyZ3VtZW50cyBub2RlKSB7CiAgICBMaXN0PENvbnN0YW50RXhwcmVzc2lvbj4gYXJndW1lbnRzID0gPENvbnN0YW50RXhwcmVzc2lvbj5bXTsKICAgIGZvciAoaXIuRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBub2RlLnBvc2l0aW9uYWwpIHsKICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50ID0gdmlzaXQoYXJndW1lbnQpOwogICAgICBpZiAoY29uc3RhbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIGFyZ3VtZW50cy5hZGQoY29uc3RhbnQpOwogICAgfQogICAgZm9yIChpci5OYW1lZEV4cHJlc3Npb24gYXJndW1lbnQgaW4gbm9kZS5uYW1lZCkgewogICAgICBDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnQgPSB2aXNpdChhcmd1bWVudC52YWx1ZSk7CiAgICAgIGlmIChjb25zdGFudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgYXJndW1lbnRzLmFkZChjb25zdGFudCk7CiAgICB9CiAgICByZXR1cm4gYXJndW1lbnRzOwogIH0KCiAgQ29uc3RydWN0ZWRDb25zdGFudEV4cHJlc3Npb24gX2NvbXB1dGVDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgIGlyLkNvbnN0cnVjdG9yIHRhcmdldCwKICAgICAgaXIuQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiBjb3JyZWN0IHR5cGUgYXJndW1lbnRzIGFyZSBwYXNzZWQKICAgICAgLy8gdGhyb3VnaCBbYXJndW1lbnRzXS4gQ3VycmVudCBbaXIuUmVkaXJlY3RpbmdJbml0aWFsaXplcl0gZG9lc24ndCBoYXZlCiAgICAgIC8vIGFueSB0eXBlIGFyZ3VtZW50cy4KICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZXMpIHsKICAgIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9IF9jb21wdXRlQXJndW1lbnRzKGFyZ3VtZW50cyk7CiAgICBpZiAoZXhwcmVzc2lvbnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmV3IENvbnN0cnVjdGVkQ29uc3RhbnRFeHByZXNzaW9uKAogICAgICAgIGVsZW1lbnRNYXAuY3JlYXRlSW50ZXJmYWNlVHlwZSh0YXJnZXQuZW5jbG9zaW5nQ2xhc3MsIHR5cGVzKSwKICAgICAgICBlbGVtZW50TWFwLmdldENvbnN0cnVjdG9yKHRhcmdldCksCiAgICAgICAgZWxlbWVudE1hcC5nZXRDYWxsU3RydWN0dXJlKGFyZ3VtZW50cyksCiAgICAgICAgZXhwcmVzc2lvbnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKGlyLkNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICBpZiAoIW5vZGUuaXNDb25zdCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX2NvbXB1dGVDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgICAgbm9kZS50YXJnZXQsIG5vZGUuYXJndW1lbnRzLCBub2RlLmFyZ3VtZW50cy50eXBlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRWYXJpYWJsZUdldChpci5WYXJpYWJsZUdldCBub2RlKSB7CiAgICBDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnQgPSBfaW5pdGlhbGl6ZXJMb2NhbHNbbm9kZS52YXJpYWJsZV07CiAgICBpZiAoY29uc3RhbnQgIT0gbnVsbCkgewogICAgICByZXR1cm4gY29uc3RhbnQ7CiAgICB9CiAgICBpZiAobm9kZS52YXJpYWJsZS5wYXJlbnQgaXMgaXIuRnVuY3Rpb25Ob2RlKSB7CiAgICAgIGlyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbiA9IG5vZGUudmFyaWFibGUucGFyZW50OwogICAgICBpbnQgaW5kZXggPSBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5pbmRleE9mKG5vZGUudmFyaWFibGUpOwogICAgICBpZiAoaW5kZXggIT0gLTEpIHsKICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uYWxBcmd1bWVudFJlZmVyZW5jZShpbmRleCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5jb250YWlucyhub2RlLnZhcmlhYmxlKSk7CiAgICAgICAgcmV0dXJuIG5ldyBOYW1lZEFyZ3VtZW50UmVmZXJlbmNlKG5vZGUudmFyaWFibGUubmFtZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobm9kZS52YXJpYWJsZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiB2aXNpdChub2RlLnZhcmlhYmxlLmluaXRpYWxpemVyKTsKICAgIH0KICAgIHJldHVybiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdFN0YXRpY0dldChpci5TdGF0aWNHZXQgbm9kZSkgewogICAgaXIuTWVtYmVyIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgaWYgKHRhcmdldCBpcyBpci5GaWVsZCAmJiB0YXJnZXQuaXNDb25zdCkgewogICAgICByZXR1cm4gbmV3IEZpZWxkQ29uc3RhbnRFeHByZXNzaW9uKGVsZW1lbnRNYXAuZ2V0RmllbGQobm9kZS50YXJnZXQpKTsKICAgIH0gZWxzZSBpZiAodGFyZ2V0IGlzIGlyLlByb2NlZHVyZSAmJgogICAgICAgIHRhcmdldC5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuTWV0aG9kKSB7CiAgICAgIEZ1bmN0aW9uRW50aXR5IGZ1bmN0aW9uID0gZWxlbWVudE1hcC5nZXRNZXRob2Qobm9kZS50YXJnZXQpOwogICAgICBEYXJ0VHlwZSB0eXBlID0gZWxlbWVudE1hcC5nZXRGdW5jdGlvblR5cGUobm9kZS50YXJnZXQuZnVuY3Rpb24pOwogICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uQ29uc3RhbnRFeHByZXNzaW9uKGZ1bmN0aW9uLCB0eXBlKTsKICAgIH0KICAgIHJldHVybiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdE51bGxMaXRlcmFsKGlyLk51bGxMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTnVsbENvbnN0YW50RXhwcmVzc2lvbigpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIHZpc2l0Qm9vbExpdGVyYWwoaXIuQm9vbExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBCb29sQ29uc3RhbnRFeHByZXNzaW9uKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIHZpc2l0SW50TGl0ZXJhbChpci5JbnRMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBuZXcgSW50Q29uc3RhbnRFeHByZXNzaW9uKAogICAgICAgIG5ldyBCaWdJbnQuZnJvbShub2RlLnZhbHVlKS50b1Vuc2lnbmVkKDY0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXREb3VibGVMaXRlcmFsKGlyLkRvdWJsZUxpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBEb3VibGVDb25zdGFudEV4cHJlc3Npb24obm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRTdHJpbmdMaXRlcmFsKGlyLlN0cmluZ0xpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdHJpbmdDb25zdGFudEV4cHJlc3Npb24obm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRTeW1ib2xMaXRlcmFsKGlyLlN5bWJvbExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBTeW1ib2xDb25zdGFudEV4cHJlc3Npb24obm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKGlyLlN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgewogICAgTGlzdDxDb25zdGFudEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gX2NvbXB1dGVMaXN0KG5vZGUuZXhwcmVzc2lvbnMpOwogICAgaWYgKGV4cHJlc3Npb25zID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIG5ldyBDb25jYXRlbmF0ZUNvbnN0YW50RXhwcmVzc2lvbihleHByZXNzaW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRNYXBMaXRlcmFsKGlyLk1hcExpdGVyYWwgbm9kZSkgewogICAgaWYgKCFub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogICAgfQogICAgRGFydFR5cGUga2V5VHlwZSA9IGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS5rZXlUeXBlKTsKICAgIERhcnRUeXBlIHZhbHVlVHlwZSA9IGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS52YWx1ZVR5cGUpOwogICAgTGlzdDxDb25zdGFudEV4cHJlc3Npb24+IGtleXMgPSA8Q29uc3RhbnRFeHByZXNzaW9uPltdOwogICAgTGlzdDxDb25zdGFudEV4cHJlc3Npb24+IHZhbHVlcyA9IDxDb25zdGFudEV4cHJlc3Npb24+W107CiAgICBmb3IgKGlyLk1hcEVudHJ5IGVudHJ5IGluIG5vZGUuZW50cmllcykgewogICAgICBDb25zdGFudEV4cHJlc3Npb24ga2V5ID0gdmlzaXQoZW50cnkua2V5KTsKICAgICAgaWYgKGtleSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAga2V5cy5hZGQoa2V5KTsKICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIHZhbHVlID0gdmlzaXQoZW50cnkudmFsdWUpOwogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHZhbHVlcy5hZGQodmFsdWUpOwogICAgfQogICAgcmV0dXJuIG5ldyBNYXBDb25zdGFudEV4cHJlc3Npb24oCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLm1hcFR5cGUoa2V5VHlwZSwgdmFsdWVUeXBlKSwga2V5cywgdmFsdWVzKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdFNldExpdGVyYWwoaXIuU2V0TGl0ZXJhbCBub2RlKSB7CiAgICBpZiAoIW5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgICB9CiAgICBEYXJ0VHlwZSBlbGVtZW50VHlwZSA9IGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS50eXBlQXJndW1lbnQpOwogICAgTGlzdDxDb25zdGFudEV4cHJlc3Npb24+IHZhbHVlcyA9IDxDb25zdGFudEV4cHJlc3Npb24+W107CiAgICBmb3IgKGlyLkV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBub2RlLmV4cHJlc3Npb25zKSB7CiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiB2YWx1ZSA9IHZpc2l0KGV4cHJlc3Npb24pOwogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHZhbHVlcy5hZGQodmFsdWUpOwogICAgfQogICAgcmV0dXJuIG5ldyBTZXRDb25zdGFudEV4cHJlc3Npb24oCiAgICAgICAgX2NvbW1vbkVsZW1lbnRzLnNldFR5cGUoZWxlbWVudFR5cGUpLCB2YWx1ZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIHZpc2l0TGlzdExpdGVyYWwoaXIuTGlzdExpdGVyYWwgbm9kZSkgewogICAgaWYgKCFub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogICAgfQogICAgRGFydFR5cGUgZWxlbWVudFR5cGUgPSBlbGVtZW50TWFwLmdldERhcnRUeXBlKG5vZGUudHlwZUFyZ3VtZW50KTsKICAgIExpc3Q8Q29uc3RhbnRFeHByZXNzaW9uPiB2YWx1ZXMgPSA8Q29uc3RhbnRFeHByZXNzaW9uPltdOwogICAgZm9yIChpci5FeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gbm9kZS5leHByZXNzaW9ucykgewogICAgICBDb25zdGFudEV4cHJlc3Npb24gdmFsdWUgPSB2aXNpdChleHByZXNzaW9uKTsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwogICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBuZXcgTGlzdENvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICBfY29tbW9uRWxlbWVudHMubGlzdFR5cGUoZWxlbWVudFR5cGUpLCB2YWx1ZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIHZpc2l0VHlwZUxpdGVyYWwoaXIuVHlwZUxpdGVyYWwgbm9kZSkgewogICAgU3RyaW5nIG5hbWU7CiAgICBEYXJ0VHlwZSB0eXBlID0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLnR5cGUpOwogICAgaWYgKHR5cGUuaXNEeW5hbWljKSB7CiAgICAgIG5hbWUgPSAnZHluYW1pYyc7CiAgICB9IGVsc2UgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBuYW1lID0gdHlwZS5lbGVtZW50Lm5hbWU7CiAgICB9IGVsc2UgaWYgKHR5cGUuaXNUeXBlZGVmKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENvbXB1dGUgYSBuYW1lIGZvciB0aGUgdHlwZSBsaXRlcmFsPyBJdCBpcyBvbmx5CiAgICAgIC8vIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMgaW4gdGhlIG9sZCBTU0EgYnVpbGRlci4KICAgICAgbmFtZSA9ICc/JzsKICAgIH0gZWxzZSBpZiAobm9kZS50eXBlIGlzIGlyLkZ1bmN0aW9uVHlwZSkgewogICAgICBpci5GdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0gbm9kZS50eXBlOwogICAgICBhc3NlcnQoZnVuY3Rpb25UeXBlLnR5cGVkZWYgIT0gbnVsbCk7CiAgICAgIHR5cGUgPSBlbGVtZW50TWFwLmdldFR5cGVkZWZUeXBlKGZ1bmN0aW9uVHlwZS50eXBlZGVmKTsKICAgICAgbmFtZSA9IGZ1bmN0aW9uVHlwZS50eXBlZGVmLm5hbWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgICB9CiAgICByZXR1cm4gbmV3IFR5cGVDb25zdGFudEV4cHJlc3Npb24odHlwZSwgbmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRBc0V4cHJlc3Npb24oaXIuQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uID0gdmlzaXQobm9kZS5vcGVyYW5kKTsKICAgIGlmIChleHByZXNzaW9uID09IG51bGwpIHJldHVybiBudWxsOwogICAgRGFydFR5cGUgdHlwZSA9IGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS50eXBlKTsKICAgIHJldHVybiBuZXcgQXNDb25zdGFudEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgdHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRJbnN0YW50aWF0aW9uKGlyLkluc3RhbnRpYXRpb24gbm9kZSkgewogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9CiAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzLm1hcChlbGVtZW50TWFwLmdldERhcnRUeXBlKS50b0xpc3QoKTsKICAgIGZvciAoRGFydFR5cGUgdHlwZUFyZ3VtZW50IGluIHR5cGVBcmd1bWVudHMpIHsKICAgICAgaWYgKHR5cGVBcmd1bWVudC5jb250YWluc1R5cGVWYXJpYWJsZXMpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2aXNpdChub2RlLmV4cHJlc3Npb24pOwogICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmV3IEluc3RhbnRpYXRpb25Db25zdGFudEV4cHJlc3Npb24odHlwZUFyZ3VtZW50cywgZXhwcmVzc2lvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXROb3QoaXIuTm90IG5vZGUpIHsKICAgIENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uID0gdmlzaXQobm9kZS5vcGVyYW5kKTsKICAgIGlmIChleHByZXNzaW9uID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIG5ldyBVbmFyeUNvbnN0YW50RXhwcmVzc2lvbihVbmFyeU9wZXJhdG9yLk5PVCwgZXhwcmVzc2lvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oaXIuQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIENvbnN0YW50RXhwcmVzc2lvbiBjb25kaXRpb24gPSB2aXNpdChub2RlLmNvbmRpdGlvbik7CiAgICBpZiAoY29uZGl0aW9uID09IG51bGwpIHJldHVybiBudWxsOwogICAgQ29uc3RhbnRFeHByZXNzaW9uIHRydWVFeHAgPSB2aXNpdChub2RlLnRoZW4pOwogICAgaWYgKHRydWVFeHAgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBDb25zdGFudEV4cHJlc3Npb24gZmFsc2VFeHAgPSB2aXNpdChub2RlLm90aGVyd2lzZSk7CiAgICBpZiAoZmFsc2VFeHAgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmV3IENvbmRpdGlvbmFsQ29uc3RhbnRFeHByZXNzaW9uKGNvbmRpdGlvbiwgdHJ1ZUV4cCwgZmFsc2VFeHApOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIHZpc2l0UHJvcGVydHlHZXQoaXIuUHJvcGVydHlHZXQgbm9kZSkgewogICAgaWYgKG5vZGUubmFtZS5uYW1lICE9ICdsZW5ndGgnKSB7CiAgICAgIGZhaWxOb2RlID8/PSBub2RlOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIENvbnN0YW50RXhwcmVzc2lvbiByZWNlaXZlciA9IHZpc2l0KG5vZGUucmVjZWl2ZXIpOwogICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIG5ldyBTdHJpbmdMZW5ndGhDb25zdGFudEV4cHJlc3Npb24ocmVjZWl2ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIHZpc2l0TWV0aG9kSW52b2NhdGlvbihpci5NZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIC8vIE1ldGhvZCBpbnZvY2F0aW9ucyBhcmUgZ2VuZXJhbGx5IG5vdCBjb25zdGFudCBleHByZXNzaW9ucyBidXQgdW5hcnkKICAgIC8vIGFuZCBiaW5hcnkgZXhwcmVzc2lvbnMgYXJlIGVuY29kZWQgYXMgbWV0aG9kIGludm9jYXRpb25zIGluIGtlcm5lbC4KICAgIGlmIChub2RlLmFyZ3VtZW50cy5uYW1lZC5pc05vdEVtcHR5KSB7CiAgICAgIHJldHVybiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICAgIH0KICAgIGlmIChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA9PSAwKSB7CiAgICAgIFVuYXJ5T3BlcmF0b3Igb3BlcmF0b3I7CiAgICAgIGlmIChub2RlLm5hbWUubmFtZSA9PSBVbmFyeU9wZXJhdG9yLk5FR0FURS5zZWxlY3Rvck5hbWUpIHsKICAgICAgICBvcGVyYXRvciA9IFVuYXJ5T3BlcmF0b3IuTkVHQVRFOwogICAgICB9IGVsc2UgewogICAgICAgIG9wZXJhdG9yID0gVW5hcnlPcGVyYXRvci5wYXJzZShub2RlLm5hbWUubmFtZSk7CiAgICAgIH0KICAgICAgaWYgKG9wZXJhdG9yICE9IG51bGwpIHsKICAgICAgICBDb25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZpc2l0KG5vZGUucmVjZWl2ZXIpOwogICAgICAgIGlmIChleHByZXNzaW9uID09IG51bGwpIHJldHVybiBudWxsOwogICAgICAgIHJldHVybiBuZXcgVW5hcnlDb25zdGFudEV4cHJlc3Npb24ob3BlcmF0b3IsIGV4cHJlc3Npb24pOwogICAgICB9CiAgICB9CiAgICBpZiAobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPT0gMSkgewogICAgICBCaW5hcnlPcGVyYXRvciBvcGVyYXRvciA9IEJpbmFyeU9wZXJhdG9yLnBhcnNlKG5vZGUubmFtZS5uYW1lKTsKICAgICAgaWYgKG9wZXJhdG9yICE9IG51bGwpIHsKICAgICAgICBDb25zdGFudEV4cHJlc3Npb24gbGVmdCA9IHZpc2l0KG5vZGUucmVjZWl2ZXIpOwogICAgICAgIGlmIChsZWZ0ID09IG51bGwpIHJldHVybiBudWxsOwogICAgICAgIENvbnN0YW50RXhwcmVzc2lvbiByaWdodCA9IHZpc2l0KG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwuc2luZ2xlKTsKICAgICAgICBpZiAocmlnaHQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlDb25zdGFudEV4cHJlc3Npb24obGVmdCwgb3BlcmF0b3IsIHJpZ2h0KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRFeHByZXNzaW9uIHZpc2l0U3RhdGljSW52b2NhdGlvbihpci5TdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPSBlbGVtZW50TWFwLmdldE1lbWJlcihub2RlLnRhcmdldCk7CiAgICBpZiAobWVtYmVyID09IF9jb21tb25FbGVtZW50cy5pZGVudGljYWxGdW5jdGlvbikgewogICAgICBpZiAobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPT0gMiAmJgogICAgICAgICAgbm9kZS5hcmd1bWVudHMubmFtZWQuaXNFbXB0eSkgewogICAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBsZWZ0ID0gdmlzaXQobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbFswXSk7CiAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIHJpZ2h0ID0gdmlzaXQobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbFsxXSk7CiAgICAgICAgaWYgKHJpZ2h0ID09IG51bGwpIHJldHVybiBudWxsOwogICAgICAgIHJldHVybiBuZXcgSWRlbnRpY2FsQ29uc3RhbnRFeHByZXNzaW9uKGxlZnQsIHJpZ2h0KTsKICAgICAgfQogICAgfSBlbHNlIGlmIChtZW1iZXIubmFtZSA9PSAnZnJvbUVudmlyb25tZW50JyAmJgogICAgICAgIG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoID09IDEpIHsKICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIG5hbWUgPSB2aXNpdChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLnNpbmdsZSk7CiAgICAgIGlmIChuYW1lID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBDb25zdGFudEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlOwogICAgICBpZiAobm9kZS5hcmd1bWVudHMubmFtZWQubGVuZ3RoID09IDEpIHsKICAgICAgICBpZiAobm9kZS5hcmd1bWVudHMubmFtZWQuc2luZ2xlLm5hbWUgIT0gJ2RlZmF1bHRWYWx1ZScpIHsKICAgICAgICAgIHJldHVybiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdFZhbHVlID0gdmlzaXQobm9kZS5hcmd1bWVudHMubmFtZWQuc2luZ2xlLnZhbHVlKTsKICAgICAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmIChtZW1iZXIuZW5jbG9zaW5nQ2xhc3MgPT0gX2NvbW1vbkVsZW1lbnRzLmJvb2xDbGFzcykgewogICAgICAgIHJldHVybiBuZXcgQm9vbEZyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbihuYW1lLCBkZWZhdWx0VmFsdWUpOwogICAgICB9IGVsc2UgaWYgKG1lbWJlci5lbmNsb3NpbmdDbGFzcyA9PSBfY29tbW9uRWxlbWVudHMuaW50Q2xhc3MpIHsKICAgICAgICByZXR1cm4gbmV3IEludEZyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbihuYW1lLCBkZWZhdWx0VmFsdWUpOwogICAgICB9IGVsc2UgaWYgKG1lbWJlci5lbmNsb3NpbmdDbGFzcyA9PSBfY29tbW9uRWxlbWVudHMuc3RyaW5nQ2xhc3MpIHsKICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0Zyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbihuYW1lLCBkZWZhdWx0VmFsdWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihpci5Mb2dpY2FsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBCaW5hcnlPcGVyYXRvciBvcGVyYXRvciA9IEJpbmFyeU9wZXJhdG9yLnBhcnNlKG5vZGUub3BlcmF0b3IpOwogICAgaWYgKG9wZXJhdG9yICE9IG51bGwgJiYKICAgICAgICBCaW5hcnlDb25zdGFudEV4cHJlc3Npb24ucG90ZW50aWFsT3BlcmF0b3Iob3BlcmF0b3IpKSB7CiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBsZWZ0ID0gdmlzaXQobm9kZS5sZWZ0KTsKICAgICAgaWYgKGxlZnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIENvbnN0YW50RXhwcmVzc2lvbiByaWdodCA9IHZpc2l0KG5vZGUucmlnaHQpOwogICAgICBpZiAocmlnaHQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBuZXcgQmluYXJ5Q29uc3RhbnRFeHByZXNzaW9uKGxlZnQsIG9wZXJhdG9yLCByaWdodCk7CiAgICB9CiAgICByZXR1cm4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudEV4cHJlc3Npb24gdmlzaXRMZXQoaXIuTGV0IG5vZGUpIHsKICAgIGlyLkV4cHJlc3Npb24gYm9keSA9IG5vZGUuYm9keTsKICAgIGlmIChib2R5IGlzIGlyLkNvbmRpdGlvbmFsRXhwcmVzc2lvbikgewogICAgICBpci5FeHByZXNzaW9uIGNvbmRpdGlvbiA9IGJvZHkuY29uZGl0aW9uOwogICAgICBpZiAoY29uZGl0aW9uIGlzIGlyLk1ldGhvZEludm9jYXRpb24pIHsKICAgICAgICBpci5FeHByZXNzaW9uIHJlY2VpdmVyID0gY29uZGl0aW9uLnJlY2VpdmVyOwogICAgICAgIGlyLkV4cHJlc3Npb24gb3RoZXJ3aXNlID0gYm9keS5vdGhlcndpc2U7CiAgICAgICAgaWYgKGNvbmRpdGlvbi5uYW1lLm5hbWUgPT0gQmluYXJ5T3BlcmF0b3IuRVEubmFtZSAmJgogICAgICAgICAgICByZWNlaXZlciBpcyBpci5WYXJpYWJsZUdldCAmJgogICAgICAgICAgICBjb25kaXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWwuc2luZ2xlIGlzIGlyLk51bGxMaXRlcmFsICYmCiAgICAgICAgICAgIG90aGVyd2lzZSBpcyBpci5WYXJpYWJsZUdldCkgewogICAgICAgICAgaWYgKHJlY2VpdmVyLnZhcmlhYmxlID09IG5vZGUudmFyaWFibGUgJiYKICAgICAgICAgICAgICBvdGhlcndpc2UudmFyaWFibGUgPT0gbm9kZS52YXJpYWJsZSkgewogICAgICAgICAgICAvLyBXZSBoYXZlIDxsZWZ0PiA/PyA8cmlnaHQ+IGVuY29kZWQgYXM6CiAgICAgICAgICAgIC8vICAgIGxldCAjMSA9IDxsZWZ0PiBpbiAjMSA9PSBudWxsID8gPHJpZ2h0PiA6ICMxCiAgICAgICAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBsZWZ0ID0gdmlzaXQobm9kZS52YXJpYWJsZS5pbml0aWFsaXplcik7CiAgICAgICAgICAgIGlmIChsZWZ0ID09IG51bGwpIHJldHVybiBudWxsOwogICAgICAgICAgICBDb25zdGFudEV4cHJlc3Npb24gcmlnaHQgPSB2aXNpdChib2R5LnRoZW4pOwogICAgICAgICAgICBpZiAocmlnaHQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSBbSUZfTlVMTF0gYmluYXJ5IGNvbnN0YW50IGV4cHJlc3Npb24KICAgICAgICAgICAgLy8gd2hlbiB0aGUgcmVzb2x2ZXIgaXMgcmVtb3ZlZDsgdGhlbiB3ZSBubyBsb25nZXIgbmVlZCB0aGUKICAgICAgICAgICAgLy8gZXhwcmVzc2lvbnMgdG8gYmUgc3RydWN0dXJhbGx5IGVxdWl2YWxlbmNlIGZvciBlcXVpdmFsZW5jZQogICAgICAgICAgICAvLyB0ZXN0aW5nLgogICAgICAgICAgICByZXR1cm4gbmV3IEJpbmFyeUNvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICAgICAgICAgIGxlZnQsIEJpbmFyeU9wZXJhdG9yLklGX05VTEwsIHJpZ2h0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiB2aXNpdEJsb2NrRXhwcmVzc2lvbihpci5CbG9ja0V4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIH0KCiAgLy8vIENvbXB1dGUgdGhlIFtDb25zdGFudENvbnN0cnVjdG9yXSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb25zdCBjb25zdHJ1Y3RvcgogIC8vLyBbbm9kZV0uCiAgQ29uc3RhbnRDb25zdHJ1Y3RvciBjb21wdXRlQ29uc3RhbnRDb25zdHJ1Y3Rvcihpci5Db25zdHJ1Y3RvciBub2RlKSB7CiAgICBhc3NlcnQobm9kZS5pc0NvbnN0KTsKICAgIGlyLkNsYXNzIGNscyA9IG5vZGUuZW5jbG9zaW5nQ2xhc3M7CiAgICBJbnRlcmZhY2VUeXBlIHR5cGUgPSBlbGVtZW50TWFwLmdldFRoaXNUeXBlKGVsZW1lbnRNYXAuZ2V0Q2xhc3MoY2xzKSk7CgogICAgTWFwPGR5bmFtaWMsIENvbnN0YW50RXhwcmVzc2lvbj4gZGVmYXVsdFZhbHVlcyA9CiAgICAgICAgPGR5bmFtaWMsIENvbnN0YW50RXhwcmVzc2lvbj57fTsKICAgIGludCBwYXJhbWV0ZXJJbmRleCA9IDA7CiAgICBmb3IgKGlyLlZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyCiAgICAgICAgaW4gbm9kZS5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBpZiAocGFyYW1ldGVySW5kZXggPj0gbm9kZS5mdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZTsKICAgICAgICBpZiAocGFyYW1ldGVyLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHZpc2l0KHBhcmFtZXRlci5pbml0aWFsaXplcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IG5ldyBOdWxsQ29uc3RhbnRFeHByZXNzaW9uKCk7CiAgICAgICAgfQogICAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgZGVmYXVsdFZhbHVlc1twYXJhbWV0ZXJJbmRleF0gPSBkZWZhdWx0VmFsdWU7CiAgICAgIH0KICAgICAgcGFyYW1ldGVySW5kZXgrKzsKICAgIH0KICAgIGZvciAoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgaW4gbm9kZS5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZSA9IHZpc2l0KHBhcmFtZXRlci5pbml0aWFsaXplcik7CiAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIGRlZmF1bHRWYWx1ZXNbcGFyYW1ldGVyLm5hbWVdID0gZGVmYXVsdFZhbHVlOwogICAgfQoKICAgIGJvb2wgaXNSZWRpcmVjdGluZyA9IG5vZGUuaW5pdGlhbGl6ZXJzLmxlbmd0aCA9PSAxICYmCiAgICAgICAgbm9kZS5pbml0aWFsaXplcnMuc2luZ2xlIGlzIGlyLlJlZGlyZWN0aW5nSW5pdGlhbGl6ZXI7CgogICAgTWFwPEZpZWxkRW50aXR5LCBDb25zdGFudEV4cHJlc3Npb24+IGZpZWxkTWFwID0KICAgICAgICA8RmllbGRFbnRpdHksIENvbnN0YW50RXhwcmVzc2lvbj57fTsKCiAgICB2b2lkIHJlZ2lzdGVyRmllbGQoaXIuRmllbGQgZmllbGQsIENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudCkgewogICAgICBmaWVsZE1hcFtlbGVtZW50TWFwLmdldEZpZWxkKGZpZWxkKV0gPSBjb25zdGFudDsKICAgIH0KCiAgICBpZiAoIWlzUmVkaXJlY3RpbmcpIHsKICAgICAgZm9yIChpci5GaWVsZCBmaWVsZCBpbiBjbHMuZmllbGRzKSB7CiAgICAgICAgaWYgKGZpZWxkLmlzU3RhdGljKSBjb250aW51ZTsKICAgICAgICBpZiAoZmllbGQuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgcmVnaXN0ZXJGaWVsZChmaWVsZCwgdmlzaXQoZmllbGQuaW5pdGlhbGl6ZXIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBDb25zdHJ1Y3RlZENvbnN0YW50RXhwcmVzc2lvbiBzdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbjsKICAgIExpc3Q8QXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uPiBhc3NlcnRpb25zID0gPEFzc2VydENvbnN0YW50RXhwcmVzc2lvbj5bXTsKICAgIGZvciAoaXIuSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgaW4gbm9kZS5pbml0aWFsaXplcnMpIHsKICAgICAgaWYgKGluaXRpYWxpemVyIGlzIGlyLkZpZWxkSW5pdGlhbGl6ZXIpIHsKICAgICAgICByZWdpc3RlckZpZWxkKGluaXRpYWxpemVyLmZpZWxkLCB2aXNpdChpbml0aWFsaXplci52YWx1ZSkpOwogICAgICB9IGVsc2UgaWYgKGluaXRpYWxpemVyIGlzIGlyLlN1cGVySW5pdGlhbGl6ZXIpIHsKICAgICAgICBzdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiA9IF9jb21wdXRlQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgICAgICBpbml0aWFsaXplci50YXJnZXQsCiAgICAgICAgICAgIGluaXRpYWxpemVyLmFyZ3VtZW50cywKICAgICAgICAgICAgaW5pdGlhbGl6ZXIuYXJndW1lbnRzLnR5cGVzKTsKICAgICAgfSBlbHNlIGlmIChpbml0aWFsaXplciBpcyBpci5SZWRpcmVjdGluZ0luaXRpYWxpemVyKSB7CiAgICAgICAgc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gPSBfY29tcHV0ZUNvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgaW5pdGlhbGl6ZXIudGFyZ2V0LAogICAgICAgICAgICBpbml0aWFsaXplci5hcmd1bWVudHMsCiAgICAgICAgICAgIG5vZGUuZW5jbG9zaW5nQ2xhc3MudGhpc1R5cGUudHlwZUFyZ3VtZW50cyk7CiAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXIgaXMgaXIuQXNzZXJ0SW5pdGlhbGl6ZXIpIHsKICAgICAgICBDb25zdGFudEV4cHJlc3Npb24gY29uZGl0aW9uID0gdmlzaXQoaW5pdGlhbGl6ZXIuc3RhdGVtZW50LmNvbmRpdGlvbik7CiAgICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIG1lc3NhZ2UgPSBpbml0aWFsaXplci5zdGF0ZW1lbnQubWVzc2FnZSAhPSBudWxsCiAgICAgICAgICAgID8gdmlzaXQoaW5pdGlhbGl6ZXIuc3RhdGVtZW50Lm1lc3NhZ2UpCiAgICAgICAgICAgIDogbnVsbDsKICAgICAgICBhc3NlcnRpb25zLmFkZChuZXcgQXNzZXJ0Q29uc3RhbnRFeHByZXNzaW9uKGNvbmRpdGlvbiwgbWVzc2FnZSkpOwogICAgICB9IGVsc2UgaWYgKGluaXRpYWxpemVyIGlzIGlyLkludmFsaWRJbml0aWFsaXplcikgewogICAgICAgIFN0cmluZyBjb25zdHJ1Y3Rvck5hbWUgPSAnJHtjbHMubmFtZX0uJHtub2RlLm5hbWV9JzsKICAgICAgICBlbGVtZW50TWFwLnJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUoaW5pdGlhbGl6ZXIpLAogICAgICAgICAgICBNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0NPTlNUUlVDVE9SLAogICAgICAgICAgICB7J2NvbnN0cnVjdG9yTmFtZSc6IGNvbnN0cnVjdG9yTmFtZX0pOwogICAgICAgIHJldHVybiBuZXcgRXJyb25lb3VzQ29uc3RhbnRDb25zdHJ1Y3RvcigpOwogICAgICB9IGVsc2UgaWYgKGluaXRpYWxpemVyIGlzIGlyLkxvY2FsSW5pdGlhbGl6ZXIpIHsKICAgICAgICBpci5WYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gaW5pdGlhbGl6ZXIudmFyaWFibGU7CiAgICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50ID0gdmlzaXQodmFyaWFibGUuaW5pdGlhbGl6ZXIpOwogICAgICAgIGlmIChjb25zdGFudCAhPSBudWxsKSB7CiAgICAgICAgICBfaW5pdGlhbGl6ZXJMb2NhbHNbdmFyaWFibGVdID0gY29uc3RhbnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSBbX0Vycm9uZW91c0luaXRpYWxpemVyVmlzaXRvcl0gaW4KICAgICAgICAgIC8vIGBzc2EvYnVpbGRlcl9rZXJuZWwuZGFydGAgdG8gaWRlbnRpZnkgZXJyb25lb3VzIGluaXRpYWxpemVyLgogICAgICAgICAgU3RyaW5nIGNvbnN0cnVjdG9yTmFtZSA9ICcke2Nscy5uYW1lfS4ke25vZGUubmFtZX0nOwogICAgICAgICAgZWxlbWVudE1hcC5yZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUoaW5pdGlhbGl6ZXIpLAogICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQ09OU1RSVUNUT1IsCiAgICAgICAgICAgICAgeydjb25zdHJ1Y3Rvck5hbWUnOiBjb25zdHJ1Y3Rvck5hbWV9KTsKICAgICAgICAgIHJldHVybiBuZXcgRXJyb25lb3VzQ29uc3RhbnRDb25zdHJ1Y3RvcigpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgaW5pdGlhbGl6ZXIgJGluaXRpYWxpemVyICgke2luaXRpYWxpemVyLnJ1bnRpbWVUeXBlfSknKTsKICAgICAgfQogICAgfQogICAgaWYgKGlzUmVkaXJlY3RpbmcpIHsKICAgICAgcmV0dXJuIG5ldyBSZWRpcmVjdGluZ0dlbmVyYXRpdmVDb25zdGFudENvbnN0cnVjdG9yKAogICAgICAgICAgZGVmYXVsdFZhbHVlcywgc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBHZW5lcmF0aXZlQ29uc3RhbnRDb25zdHJ1Y3Rvcih0eXBlLCBkZWZhdWx0VmFsdWVzLCBmaWVsZE1hcCwKICAgICAgICAgIGFzc2VydGlvbnMsIHN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uKTsKICAgIH0KICB9Cn0KCi8vLyBWaXNpdG9yIHRoYXQgY29udmVydHMga2VybmVsIGRhcnQgdHlwZXMgaW50byBbRGFydFR5cGVdLgpjbGFzcyBEYXJ0VHlwZUNvbnZlcnRlciBleHRlbmRzIGlyLkRhcnRUeXBlVmlzaXRvcjxEYXJ0VHlwZT4gewogIGZpbmFsIElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXA7CiAgZmluYWwgTWFwPGlyLlR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBjdXJyZW50RnVuY3Rpb25UeXBlUGFyYW1ldGVycyA9CiAgICAgIDxpci5UeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICBib29sIHRvcExldmVsID0gdHJ1ZTsKCiAgRGFydFR5cGVDb252ZXJ0ZXIodGhpcy5lbGVtZW50TWFwKTsKCiAgRGFydFR5cGUgY29udmVydChpci5EYXJ0VHlwZSB0eXBlKSB7CiAgICB0b3BMZXZlbCA9IHRydWU7CiAgICByZXR1cm4gdHlwZS5hY2NlcHQodGhpcyk7CiAgfQoKICAvLy8gVmlzaXQgYSBpbm5lciB0eXBlLgogIERhcnRUeXBlIHZpc2l0VHlwZShpci5EYXJ0VHlwZSB0eXBlKSB7CiAgICB0b3BMZXZlbCA9IGZhbHNlOwogICAgcmV0dXJuIHR5cGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgSW50ZXJmYWNlVHlwZSB2aXNpdFN1cGVydHlwZShpci5TdXBlcnR5cGUgbm9kZSkgewogICAgQ2xhc3NFbnRpdHkgY2xzID0gZWxlbWVudE1hcC5nZXRDbGFzcyhub2RlLmNsYXNzTm9kZSk7CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoY2xzLCB2aXNpdFR5cGVzKG5vZGUudHlwZUFyZ3VtZW50cykpOwogIH0KCiAgTGlzdDxEYXJ0VHlwZT4gdmlzaXRUeXBlcyhMaXN0PGlyLkRhcnRUeXBlPiB0eXBlcykgewogICAgdG9wTGV2ZWwgPSBmYWxzZTsKICAgIHJldHVybiBuZXcgTGlzdC5nZW5lcmF0ZSgKICAgICAgICB0eXBlcy5sZW5ndGgsIChpbnQgaW5kZXgpID0+IHR5cGVzW2luZGV4XS5hY2NlcHQodGhpcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShpci5UeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICBEYXJ0VHlwZSB0eXBlUGFyYW1ldGVyID0gY3VycmVudEZ1bmN0aW9uVHlwZVBhcmFtZXRlcnNbbm9kZS5wYXJhbWV0ZXJdOwogICAgaWYgKHR5cGVQYXJhbWV0ZXIgIT0gbnVsbCkgewogICAgICByZXR1cm4gdHlwZVBhcmFtZXRlcjsKICAgIH0KICAgIGlmIChub2RlLnBhcmFtZXRlci5wYXJlbnQgaXMgaXIuVHlwZWRlZikgewogICAgICAvLyBUeXBlZGVmcyBhcmUgb25seSB1c2VkIGluIHR5cGUgbGl0ZXJhbHMgc28gd2UgbmV2ZXIgbmVlZCB0aGVpciB0eXBlCiAgICAgIC8vIHZhcmlhYmxlcy4KICAgICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gbmV3IFR5cGVWYXJpYWJsZVR5cGUoZWxlbWVudE1hcC5nZXRUeXBlVmFyaWFibGUobm9kZS5wYXJhbWV0ZXIpKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0RnVuY3Rpb25UeXBlKGlyLkZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBpbnQgaW5kZXggPSAwOwogICAgTGlzdDxGdW5jdGlvblR5cGVWYXJpYWJsZT4gdHlwZVZhcmlhYmxlczsKICAgIGZvciAoaXIuVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIG5vZGUudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgRnVuY3Rpb25UeXBlVmFyaWFibGUgdHlwZVZhcmlhYmxlID0gbmV3IEZ1bmN0aW9uVHlwZVZhcmlhYmxlKGluZGV4KTsKICAgICAgY3VycmVudEZ1bmN0aW9uVHlwZVBhcmFtZXRlcnNbdHlwZVBhcmFtZXRlcl0gPSB0eXBlVmFyaWFibGU7CiAgICAgIHR5cGVWYXJpYWJsZXMgPz89IDxGdW5jdGlvblR5cGVWYXJpYWJsZT5bXTsKICAgICAgdHlwZVZhcmlhYmxlcy5hZGQodHlwZVZhcmlhYmxlKTsKICAgICAgaW5kZXgrKzsKICAgIH0KICAgIGlmICh0eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHR5cGVWYXJpYWJsZXMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgdHlwZVZhcmlhYmxlc1tpbmRleF0uYm91bmQgPQogICAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzW2luZGV4XS5ib3VuZC5hY2NlcHQodGhpcyk7CiAgICAgIH0KICAgIH0KCiAgICBGdW5jdGlvblR5cGUgdHlwZSA9IG5ldyBGdW5jdGlvblR5cGUoCiAgICAgICAgdmlzaXRUeXBlKG5vZGUucmV0dXJuVHlwZSksCiAgICAgICAgdmlzaXRUeXBlcyhub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzCiAgICAgICAgICAgIC50YWtlKG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkKICAgICAgICAgICAgLnRvTGlzdCgpKSwKICAgICAgICB2aXNpdFR5cGVzKG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMKICAgICAgICAgICAgLnNraXAobm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KQogICAgICAgICAgICAudG9MaXN0KCkpLAogICAgICAgIG5vZGUubmFtZWRQYXJhbWV0ZXJzLm1hcCgobikgPT4gbi5uYW1lKS50b0xpc3QoKSwKICAgICAgICBub2RlLm5hbWVkUGFyYW1ldGVycy5tYXAoKG4pID0+IHZpc2l0VHlwZShuLnR5cGUpKS50b0xpc3QoKSwKICAgICAgICB0eXBlVmFyaWFibGVzID8/IGNvbnN0IDxGdW5jdGlvblR5cGVWYXJpYWJsZT5bXSk7CiAgICBmb3IgKGlyLlR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciBpbiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIGN1cnJlbnRGdW5jdGlvblR5cGVQYXJhbWV0ZXJzLnJlbW92ZSh0eXBlUGFyYW1ldGVyKTsKICAgIH0KICAgIHJldHVybiB0eXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRJbnRlcmZhY2VUeXBlKGlyLkludGVyZmFjZVR5cGUgbm9kZSkgewogICAgQ2xhc3NFbnRpdHkgY2xzID0gZWxlbWVudE1hcC5nZXRDbGFzcyhub2RlLmNsYXNzTm9kZSk7CiAgICBpZiAoY2xzLm5hbWUgPT0gJ0Z1dHVyZU9yJyAmJgogICAgICAgIGNscy5saWJyYXJ5ID09IGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMuYXN5bmNMaWJyYXJ5KSB7CiAgICAgIHJldHVybiBuZXcgRnV0dXJlT3JUeXBlKHZpc2l0VHlwZXMobm9kZS50eXBlQXJndW1lbnRzKS5zaW5nbGUpOwogICAgfQogICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKGNscywgdmlzaXRUeXBlcyhub2RlLnR5cGVBcmd1bWVudHMpKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0Vm9pZFR5cGUoaXIuVm9pZFR5cGUgbm9kZSkgewogICAgcmV0dXJuIGNvbnN0IFZvaWRUeXBlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdER5bmFtaWNUeXBlKGlyLkR5bmFtaWNUeXBlIG5vZGUpIHsKICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRJbnZhbGlkVHlwZShpci5JbnZhbGlkVHlwZSBub2RlKSB7CiAgICAvLyBSb290IHVzZXMgc3VjaCBhIGBvIGlzIFVucmVzb2x2ZWRgIGFuZCBgbyBhcyBVbnJlc29sdmVkYCBtdXN0IGJlIHNwZWNpYWwKICAgIC8vIGNhc2VkIGluIHRoZSBidWlsZGVyLCBuZXN0ZWQgaW52YWxpZCB0eXBlcyBhcmUgdHJlYXRlZCBhcyBgZHluYW1pY2AuCiAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0Qm90dG9tVHlwZShpci5Cb3R0b21UeXBlIG5vZGUpIHsKICAgIHJldHVybiBlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzLm51bGxUeXBlOwogIH0KfQoKY2xhc3MgQ29uc3RhbnRWYWx1ZWZpZXIgZXh0ZW5kcyBpci5Db21wdXRlT25jZUNvbnN0YW50VmlzaXRvcjxDb25zdGFudFZhbHVlPiB7CiAgZmluYWwgSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcDsKCiAgQ29uc3RhbnRWYWx1ZWZpZXIodGhpcy5lbGVtZW50TWFwKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0Q29uc3RhbnQoaXIuQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIlVuZXhwZWN0ZWQgY29uc3RhbnQgJG5vZGUgKCR7bm9kZS5ydW50aW1lVHlwZX0pLiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnQoaXIuVW5ldmFsdWF0ZWRDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5leHBlY3RlZCB1bmV2YWx1YXRlZCBjb25zdGFudCAkbm9kZS4iKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KGlyLlR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVUeXBlKAogICAgICAgIGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMsIGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS50eXBlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0VGVhck9mZkNvbnN0YW50KGlyLlRlYXJPZmZDb25zdGFudCBub2RlKSB7CiAgICBGdW5jdGlvbkVudGl0eSBmdW5jdGlvbiA9IGVsZW1lbnRNYXAuZ2V0TWV0aG9kKG5vZGUucHJvY2VkdXJlKTsKICAgIERhcnRUeXBlIHR5cGUgPSBlbGVtZW50TWFwLmdldEZ1bmN0aW9uVHlwZShub2RlLnByb2NlZHVyZS5mdW5jdGlvbik7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZShmdW5jdGlvbiwgdHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCgKICAgICAgaXIuUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSB7CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0gW107CiAgICBmb3IgKGlyLkRhcnRUeXBlIHR5cGUgaW4gbm9kZS50eXBlcykgewogICAgICB0eXBlQXJndW1lbnRzLmFkZChlbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpKTsKICAgIH0KICAgIEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSBmdW5jdGlvbiA9IHZpc2l0Q29uc3RhbnQobm9kZS50ZWFyT2ZmQ29uc3RhbnQpOwogICAgcmV0dXJuIG5ldyBJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSh0eXBlQXJndW1lbnRzLCBmdW5jdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0SW5zdGFuY2VDb25zdGFudChpci5JbnN0YW5jZUNvbnN0YW50IG5vZGUpIHsKICAgIEludGVyZmFjZVR5cGUgdHlwZSA9CiAgICAgICAgZWxlbWVudE1hcC5jcmVhdGVJbnRlcmZhY2VUeXBlKG5vZGUuY2xhc3NOb2RlLCBub2RlLnR5cGVBcmd1bWVudHMpOwogICAgTWFwPEZpZWxkRW50aXR5LCBDb25zdGFudFZhbHVlPiBmaWVsZHMgPSB7fTsKICAgIG5vZGUuZmllbGRWYWx1ZXMuZm9yRWFjaCgoaXIuUmVmZXJlbmNlIHJlZmVyZW5jZSwgaXIuQ29uc3RhbnQgdmFsdWUpIHsKICAgICAgRmllbGRFbnRpdHkgZmllbGQgPSBlbGVtZW50TWFwLmdldEZpZWxkKHJlZmVyZW5jZS5hc0ZpZWxkKTsKICAgICAgZmllbGRzW2ZpZWxkXSA9IHZpc2l0Q29uc3RhbnQodmFsdWUpOwogICAgfSk7CiAgICByZXR1cm4gbmV3IENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSh0eXBlLCBmaWVsZHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdExpc3RDb25zdGFudChpci5MaXN0Q29uc3RhbnQgbm9kZSkgewogICAgTGlzdDxDb25zdGFudFZhbHVlPiBlbGVtZW50cyA9IFtdOwogICAgZm9yIChpci5Db25zdGFudCBlbGVtZW50IGluIG5vZGUuZW50cmllcykgewogICAgICBlbGVtZW50cy5hZGQodmlzaXRDb25zdGFudChlbGVtZW50KSk7CiAgICB9CiAgICBEYXJ0VHlwZSB0eXBlID0gZWxlbWVudE1hcC5jb21tb25FbGVtZW50cwogICAgICAgIC5saXN0VHlwZShlbGVtZW50TWFwLmdldERhcnRUeXBlKG5vZGUudHlwZUFyZ3VtZW50KSk7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUxpc3QodHlwZSwgZWxlbWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRWYWx1ZSB2aXNpdFNldENvbnN0YW50KGlyLlNldENvbnN0YW50IG5vZGUpIHsKICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZWxlbWVudHMgPSBbXTsKICAgIGZvciAoaXIuQ29uc3RhbnQgZWxlbWVudCBpbiBub2RlLmVudHJpZXMpIHsKICAgICAgZWxlbWVudHMuYWRkKHZpc2l0Q29uc3RhbnQoZWxlbWVudCkpOwogICAgfQogICAgRGFydFR5cGUgdHlwZSA9IGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMKICAgICAgICAuc2V0VHlwZShlbGVtZW50TWFwLmdldERhcnRUeXBlKG5vZGUudHlwZUFyZ3VtZW50KSk7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZVNldChlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzLCB0eXBlLCBlbGVtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0TWFwQ29uc3RhbnQoaXIuTWFwQ29uc3RhbnQgbm9kZSkgewogICAgTGlzdDxDb25zdGFudFZhbHVlPiBrZXlzID0gW107CiAgICBMaXN0PENvbnN0YW50VmFsdWU+IHZhbHVlcyA9IFtdOwogICAgZm9yIChpci5Db25zdGFudE1hcEVudHJ5IGVsZW1lbnQgaW4gbm9kZS5lbnRyaWVzKSB7CiAgICAgIGtleXMuYWRkKHZpc2l0Q29uc3RhbnQoZWxlbWVudC5rZXkpKTsKICAgICAgdmFsdWVzLmFkZCh2aXNpdENvbnN0YW50KGVsZW1lbnQudmFsdWUpKTsKICAgIH0KICAgIERhcnRUeXBlIHR5cGUgPSBlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzLm1hcFR5cGUoCiAgICAgICAgZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLmtleVR5cGUpLAogICAgICAgIGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS52YWx1ZVR5cGUpKTsKICAgIHJldHVybiBjb25zdGFudF9zeXN0ZW0uY3JlYXRlTWFwKAogICAgICAgIGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMsIHR5cGUsIGtleXMsIHZhbHVlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0U3ltYm9sQ29uc3RhbnQoaXIuU3ltYm9sQ29uc3RhbnQgbm9kZSkgewogICAgcmV0dXJuIGNvbnN0YW50X3N5c3RlbS5jcmVhdGVTeW1ib2woZWxlbWVudE1hcC5jb21tb25FbGVtZW50cywgbm9kZS5uYW1lKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXRTdHJpbmdDb25zdGFudChpci5TdHJpbmdDb25zdGFudCBub2RlKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZVN0cmluZyhub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXREb3VibGVDb25zdGFudChpci5Eb3VibGVDb25zdGFudCBub2RlKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZURvdWJsZShub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50VmFsdWUgdmlzaXRJbnRDb25zdGFudChpci5JbnRDb25zdGFudCBub2RlKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUludEZyb21JbnQobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0Qm9vbENvbnN0YW50KGlyLkJvb2xDb25zdGFudCBub2RlKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUJvb2wobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudFZhbHVlIHZpc2l0TnVsbENvbnN0YW50KGlyLk51bGxDb25zdGFudCBub2RlKSB7CiAgICByZXR1cm4gY29uc3RhbnRfc3lzdGVtLmNyZWF0ZU51bGwoKTsKICB9Cn0Kgw4ATk48ASg0LzE1ARk/KSgjIiQlISEaAVAbOQxCAQxBKjkuJhcGGgQCAT4aRx4jGE02AUABQwExNS9BLjs0MAYVBAEMPRsZBhEEAUs8NDcpGgYRBAFCQTY1KR8GNjspHwYWBAE/HR5RTx0hSSouRiswFgQBDFEkKjwEAQw9RRwXBjM3SBk3D0I/CCgvBiQEAQw5JDBMKTJDSD0GJAQBDD0pBAEMPTMEAQw7JjUEAQxBNQQBDEE1BAEMQTUEAQxNSyo7BAEMOxkmBj1BPD4uMSQVNSYZBiZEBAEMOxkmBkY+OTQmGQYmNwQBDD0ZJgZGPjk0JhkGJzgEAQw9ETcaGCggIU44Ei8wLD4oDSYGMwQBDD85KTc3BAEMQSNBMzAVCAY8KUsEAQwtOSlHBAEMUTooMyY5J0wEAQw9JhkTBjgnOQQBDEdLSysmBjEeQSkPOAgePi1CCAYxRh44J0woRAgGJAQBDEc9NzMqRydIKD0IMzFJJScuQioKQS8IQE5GTUlQCAYkBAEMSUMcQDIlNCZCBiQEAQwtJCwwLjUyPSpHKzQ1NT9IKzksUEhKGDE2DAoIBiQEAQxFJAQBTw5IGihLATUpHCoxRCktNxE3Ci82CBgGTkYtNAYBOj8BNC0BRjcGARorJik6CggGAT5OPDBEN0QgIyo9RCAjOThPSzMUSjk9MDg2MzM3QEMgMxFISj8yOjg1NQoPJFEIBhk7Ng1OMwYEAgE9PyNIJhgBJgEnFR4EARopFh4EATQ7QwQBNxYeQQQBDD9MIRwGL00UIgZNBAEMNRMuQktDMicPBiFDJTsIBgEqJC0vGC0vGDpFOkI7BhEEAQw3OyJBRgZDBAEMLR0EAQwzIAQBDDNQTCAEAQwxLwQCAU8jASYBDDQgPQQBDEhKBAEMSCdHBAEMQERJNgQBDDMuJys3BkpEBAEMQhlMMUtCLAg3BAEMOicwLAYuPjcEAQw4JzAsBi49UQQBDDgjJTgsMAY3LjEmOAQBDD5PBAEMPjUEAQw+NQQBDDg5BAEMOjMEAQw6KQQCASVwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci92aXNpdG9ycy5kYXJ0LXNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2tlcm5lbC9lbnYuZGFydMAAcrsvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmtlcm5lbC5lbnY7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JwogICAgc2hvdyBpc1JlZGlyZWN0aW5nRmFjdG9yeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGlyOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2Nsb25lLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmNvbGxlY3Rpb24vY29sbGVjdGlvbi5kYXJ0JyBzaG93IG1lcmdlU29ydDsgLy8gYSBzdGFibGUgc29ydC4KCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy9jb25zdHJ1Y3RvcnMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL2V4cHJlc3Npb25zLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaXIvZWxlbWVudF9tYXAuZGFydCc7CmltcG9ydCAnLi4vaXIvc3RhdGljX3R5cGVfY2FjaGUuZGFydCc7CmltcG9ydCAnLi4vaXIvdmlzaXRvcnMuZGFydCc7CmltcG9ydCAnLi4vaXIvdXRpbC5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9lbGVtZW50X21hcC5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC9lbnYuZGFydCc7CmltcG9ydCAnLi4vb3JkZXJlZF90eXBlc2V0LmRhcnQnOwppbXBvcnQgJy4uL3NzYS90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvbWVtYmVyX3VzYWdlLmRhcnQnOwppbXBvcnQgJ2VsZW1lbnRfbWFwX2ltcGwuZGFydCc7CgovLy8gRW52aXJvbm1lbnQgZm9yIGZhc3QgbG9va3VwIG9mIGNvbXBvbmVudCBsaWJyYXJpZXMuCmNsYXNzIEtQcm9ncmFtRW52IHsKICBmaW5hbCBTZXQ8aXIuQ29tcG9uZW50PiBfY29tcG9uZW50cyA9IG5ldyBTZXQ8aXIuQ29tcG9uZW50PigpOwoKICBNYXA8VXJpLCBLTGlicmFyeUVudj4gX2xpYnJhcnlNYXA7CgogIC8vLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBIYW5kbGUgYXJiaXRyYXJ5IGxvYWQgb3JkZXIgaWYgbmVlZGVkLgogIGlyLk1lbWJlciBnZXQgbWFpbk1ldGhvZCA9PiBfY29tcG9uZW50cy5maXJzdD8ubWFpbk1ldGhvZDsKCiAgaXIuQ29tcG9uZW50IGdldCBtYWluQ29tcG9uZW50ID0+IF9jb21wb25lbnRzLmZpcnN0OwoKICB2b2lkIGFkZENvbXBvbmVudChpci5Db21wb25lbnQgY29tcG9uZW50KSB7CiAgICBpZiAoX2NvbXBvbmVudHMuYWRkKGNvbXBvbmVudCkpIHsKICAgICAgaWYgKF9saWJyYXJ5TWFwICE9IG51bGwpIHsKICAgICAgICBfYWRkTGlicmFyaWVzKGNvbXBvbmVudCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX2FkZExpYnJhcmllcyhpci5Db21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKGlyLkxpYnJhcnkgbGlicmFyeSBpbiBjb21wb25lbnQubGlicmFyaWVzKSB7CiAgICAgIF9saWJyYXJ5TWFwW2xpYnJhcnkuaW1wb3J0VXJpXSA9IG5ldyBLTGlicmFyeUVudihsaWJyYXJ5KTsKICAgIH0KICB9CgogIHZvaWQgX2Vuc3VyZUxpYnJhcnlNYXAoKSB7CiAgICBpZiAoX2xpYnJhcnlNYXAgPT0gbnVsbCkgewogICAgICBfbGlicmFyeU1hcCA9IDxVcmksIEtMaWJyYXJ5RW52Pnt9OwogICAgICBmb3IgKGlyLkNvbXBvbmVudCBjb21wb25lbnQgaW4gX2NvbXBvbmVudHMpIHsKICAgICAgICBfYWRkTGlicmFyaWVzKGNvbXBvbmVudCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBSZXR1cm4gdGhlIFtLTGlicmFyeUVudl0gZm9yIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGNhbm9uaWNhbCBbdXJpXS4KICBLTGlicmFyeUVudiBsb29rdXBMaWJyYXJ5KFVyaSB1cmkpIHsKICAgIF9lbnN1cmVMaWJyYXJ5TWFwKCk7CiAgICByZXR1cm4gX2xpYnJhcnlNYXBbdXJpXTsKICB9CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggbGlicmFyeSBpbiB0aGlzIGVudmlyb25tZW50LgogIHZvaWQgZm9yRWFjaExpYnJhcnkodm9pZCBmKEtMaWJyYXJ5RW52IGxpYnJhcnkpKSB7CiAgICBfZW5zdXJlTGlicmFyeU1hcCgpOwogICAgX2xpYnJhcnlNYXAudmFsdWVzLmZvckVhY2goZik7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpYnJhcmllcyBpbiB0aGlzIGVudmlyb25tZW50LgogIGludCBnZXQgbGVuZ3RoIHsKICAgIF9lbnN1cmVMaWJyYXJ5TWFwKCk7CiAgICByZXR1cm4gX2xpYnJhcnlNYXAubGVuZ3RoOwogIH0KCiAgLy8vIENvbnZlcnQgdGhpcyBbS1Byb2dyYW1FbnZdIHRvIHRoZSBjb3JyZXNwb25kaW5nIFtKUHJvZ3JhbUVudl0uCiAgSlByb2dyYW1FbnYgY29udmVydCgpID0+IG5ldyBKUHJvZ3JhbUVudihfY29tcG9uZW50cyk7Cn0KCi8vLyBFbnZpcm9ubWVudCBmb3IgZmFzdCBsb29rdXAgb2YgbGlicmFyeSBjbGFzc2VzIGFuZCBtZW1iZXJzLgpjbGFzcyBLTGlicmFyeUVudiB7CiAgZmluYWwgaXIuTGlicmFyeSBsaWJyYXJ5OwoKICBNYXA8U3RyaW5nLCBLQ2xhc3NFbnY+IF9jbGFzc01hcDsKICBNYXA8U3RyaW5nLCBpci5NZW1iZXI+IF9tZW1iZXJNYXA7CiAgTWFwPFN0cmluZywgaXIuTWVtYmVyPiBfc2V0dGVyTWFwOwoKICBLTGlicmFyeUVudih0aGlzLmxpYnJhcnkpOwoKICB2b2lkIF9lbnN1cmVDbGFzc01hcCgpIHsKICAgIGlmIChfY2xhc3NNYXAgPT0gbnVsbCkgewogICAgICBfY2xhc3NNYXAgPSA8U3RyaW5nLCBLQ2xhc3NFbnY+e307CiAgICAgIGZvciAoaXIuQ2xhc3MgY2xzIGluIGxpYnJhcnkuY2xhc3NlcykgewogICAgICAgIF9jbGFzc01hcFtjbHMubmFtZV0gPSBuZXcgS0NsYXNzRW52SW1wbChjbHMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gUmV0dXJuIHRoZSBbS0NsYXNzRW52XSBmb3IgdGhlIGNsYXNzIFtuYW1lXSBpbiBbbGlicmFyeV0uCiAgS0NsYXNzRW52IGxvb2t1cENsYXNzKFN0cmluZyBuYW1lKSB7CiAgICBfZW5zdXJlQ2xhc3NNYXAoKTsKICAgIHJldHVybiBfY2xhc3NNYXBbbmFtZV07CiAgfQoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGNsYXNzIGluIHRoaXMgbGlicmFyeS4KICB2b2lkIGZvckVhY2hDbGFzcyh2b2lkIGYoS0NsYXNzRW52IGNscykpIHsKICAgIF9lbnN1cmVDbGFzc01hcCgpOwogICAgX2NsYXNzTWFwLnZhbHVlcy5mb3JFYWNoKGYpOwogIH0KCiAgdm9pZCBfZW5zdXJlTWVtYmVyTWFwcygpIHsKICAgIGlmIChfbWVtYmVyTWFwID09IG51bGwpIHsKICAgICAgX21lbWJlck1hcCA9IDxTdHJpbmcsIGlyLk1lbWJlcj57fTsKICAgICAgX3NldHRlck1hcCA9IDxTdHJpbmcsIGlyLk1lbWJlcj57fTsKICAgICAgZm9yIChpci5NZW1iZXIgbWVtYmVyIGluIGxpYnJhcnkubWVtYmVycykgewogICAgICAgIGlmIChtZW1iZXIubmFtZS5uYW1lLmNvbnRhaW5zKCcjJykpIHsKICAgICAgICAgIC8vIFNraXAgc3ludGhldGljIC5kaWxsIG1lbWJlcnMuCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKG1lbWJlciBpcyBpci5Qcm9jZWR1cmUpIHsKICAgICAgICAgIGlmIChtZW1iZXIua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLlNldHRlcikgewogICAgICAgICAgICBfc2V0dGVyTWFwW21lbWJlci5uYW1lLm5hbWVdID0gbWVtYmVyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX21lbWJlck1hcFttZW1iZXIubmFtZS5uYW1lXSA9IG1lbWJlcjsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG1lbWJlciBpcyBpci5GaWVsZCkgewogICAgICAgICAgX21lbWJlck1hcFttZW1iZXIubmFtZS5uYW1lXSA9IG1lbWJlcjsKICAgICAgICAgIGlmIChtZW1iZXIuaXNNdXRhYmxlKSB7CiAgICAgICAgICAgIF9zZXR0ZXJNYXBbbWVtYmVyLm5hbWUubmFtZV0gPSBtZW1iZXI7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZhaWxlZEF0KAogICAgICAgICAgICAgIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwgIlVuZXhwZWN0ZWQgbGlicmFyeSBtZW1iZXIgbm9kZTogJG1lbWJlciIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8vIFJldHVybiB0aGUgW2lyLk1lbWJlcl0gZm9yIHRoZSBtZW1iZXIgW25hbWVdIGluIFtsaWJyYXJ5XS4KICBpci5NZW1iZXIgbG9va3VwTWVtYmVyKFN0cmluZyBuYW1lLCB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSkgewogICAgX2Vuc3VyZU1lbWJlck1hcHMoKTsKICAgIHJldHVybiBzZXR0ZXIgPyBfc2V0dGVyTWFwW25hbWVdIDogX21lbWJlck1hcFtuYW1lXTsKICB9CgogIHZvaWQgZm9yRWFjaE1lbWJlcih2b2lkIGYoaXIuTWVtYmVyIG1lbWJlcikpIHsKICAgIF9lbnN1cmVNZW1iZXJNYXBzKCk7CiAgICBfbWVtYmVyTWFwLnZhbHVlcy5mb3JFYWNoKGYpOwogICAgZm9yIChpci5NZW1iZXIgbWVtYmVyIGluIF9zZXR0ZXJNYXAudmFsdWVzKSB7CiAgICAgIGlmIChtZW1iZXIgaXMgaXIuUHJvY2VkdXJlKSB7CiAgICAgICAgZihtZW1iZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNraXAgZmllbGRzOyB0aGVzZSBhcmUgYWxzbyBpbiBfbWVtYmVyTWFwLgogICAgICB9CiAgICB9CiAgfQoKICAvLy8gQ29udmVydCB0aGlzIFtLTGlicmFyeUVudl0gdG8gYSBjb3JyZXNwb25kaW5nIFtKTGlicmFyeUVudl0gY29udGFpbmluZwogIC8vLyBvbmx5IHRoZSBtZW1iZXJzIGluIFtsaXZlTWVtYmVyc10uCiAgSkxpYnJhcnlFbnYgY29udmVydChJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLAogICAgICBNYXA8TWVtYmVyRW50aXR5LCBNZW1iZXJVc2FnZT4gbGl2ZU1lbWJlclVzYWdlKSB7CiAgICBNYXA8U3RyaW5nLCBpci5NZW1iZXI+IG1lbWJlck1hcDsKICAgIE1hcDxTdHJpbmcsIGlyLk1lbWJlcj4gc2V0dGVyTWFwOwogICAgaWYgKF9tZW1iZXJNYXAgPT0gbnVsbCkgewogICAgICBtZW1iZXJNYXAgPSBjb25zdCA8U3RyaW5nLCBpci5NZW1iZXI+e307CiAgICB9IGVsc2UgewogICAgICBtZW1iZXJNYXAgPSA8U3RyaW5nLCBpci5NZW1iZXI+e307CiAgICAgIF9tZW1iZXJNYXAuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIGlyLk1lbWJlciBub2RlKSB7CiAgICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyKG5vZGUpOwogICAgICAgIGlmIChsaXZlTWVtYmVyVXNhZ2UuY29udGFpbnNLZXkobWVtYmVyKSkgewogICAgICAgICAgbWVtYmVyTWFwW25hbWVdID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgaWYgKF9zZXR0ZXJNYXAgPT0gbnVsbCkgewogICAgICBzZXR0ZXJNYXAgPSBjb25zdCA8U3RyaW5nLCBpci5NZW1iZXI+e307CiAgICB9IGVsc2UgewogICAgICBzZXR0ZXJNYXAgPSA8U3RyaW5nLCBpci5NZW1iZXI+e307CiAgICAgIF9zZXR0ZXJNYXAuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIGlyLk1lbWJlciBub2RlKSB7CiAgICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyKG5vZGUpOwogICAgICAgIGlmIChsaXZlTWVtYmVyVXNhZ2UuY29udGFpbnNLZXkobWVtYmVyKSkgewogICAgICAgICAgc2V0dGVyTWFwW25hbWVdID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIG5ldyBKTGlicmFyeUVudihsaWJyYXJ5LCBtZW1iZXJNYXAsIHNldHRlck1hcCk7CiAgfQp9CgpjbGFzcyBLTGlicmFyeURhdGEgewogIGZpbmFsIGlyLkxpYnJhcnkgbGlicmFyeTsKICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBfbWV0YWRhdGE7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXZvaWQgZGlyZWN0IGFjY2VzcyB0byBbaW1wb3J0c10uCiAgTWFwPGlyLkxpYnJhcnlEZXBlbmRlbmN5LCBJbXBvcnRFbnRpdHk+IGltcG9ydHM7CgogIEtMaWJyYXJ5RGF0YSh0aGlzLmxpYnJhcnkpOwoKICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBnZXRNZXRhZGF0YShLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBfbWV0YWRhdGEgPz89IGVsZW1lbnRNYXAuZ2V0TWV0YWRhdGEobGlicmFyeS5hbm5vdGF0aW9ucyk7CiAgfQoKICBJdGVyYWJsZTxJbXBvcnRFbnRpdHk+IGdldEltcG9ydHMoS2VybmVsVG9FbGVtZW50TWFwSW1wbCBlbGVtZW50TWFwKSB7CiAgICBpZiAoaW1wb3J0cyA9PSBudWxsKSB7CiAgICAgIExpc3Q8aXIuTGlicmFyeURlcGVuZGVuY3k+IGRlcGVuZGVuY2llcyA9IGxpYnJhcnkuZGVwZW5kZW5jaWVzOwogICAgICBpZiAoZGVwZW5kZW5jaWVzLmlzRW1wdHkpIHsKICAgICAgICBpbXBvcnRzID0gY29uc3QgPGlyLkxpYnJhcnlEZXBlbmRlbmN5LCBJbXBvcnRFbnRpdHk+e307CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW1wb3J0cyA9IDxpci5MaWJyYXJ5RGVwZW5kZW5jeSwgSW1wb3J0RW50aXR5Pnt9OwogICAgICAgIGRlcGVuZGVuY2llcy5mb3JFYWNoKChpci5MaWJyYXJ5RGVwZW5kZW5jeSBub2RlKSB7CiAgICAgICAgICBpZiAobm9kZS5pc0V4cG9ydCkgcmV0dXJuOwogICAgICAgICAgaW1wb3J0c1tub2RlXSA9IG5ldyBJbXBvcnRFbnRpdHkoCiAgICAgICAgICAgICAgbm9kZS5pc0RlZmVycmVkLAogICAgICAgICAgICAgIG5vZGUubmFtZSwKICAgICAgICAgICAgICBub2RlLnRhcmdldExpYnJhcnkuaW1wb3J0VXJpLAogICAgICAgICAgICAgIGVsZW1lbnRNYXAuZ2V0TGlicmFyeShub2RlLmVuY2xvc2luZ0xpYnJhcnkpLmNhbm9uaWNhbFVyaSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpbXBvcnRzLnZhbHVlczsKICB9CgogIC8vLyBDb252ZXJ0IHRoaXMgW0tMaWJyYXJ5RGF0YV0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgW0pMaWJyYXJ5RGF0YV0uCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogV2h5IGlzbid0IFtpbXBvcnRzXSBlbnN1cmVkIHRvIGJlIG5vbi1udWxsIGhlcmU/CiAgSkxpYnJhcnlEYXRhIGNvbnZlcnQoKSB7CiAgICByZXR1cm4gbmV3IEpMaWJyYXJ5RGF0YShsaWJyYXJ5LCBpbXBvcnRzKTsKICB9Cn0KCi8vLyBNZW1iZXIgZGF0YSBmb3IgYSBjbGFzcy4KYWJzdHJhY3QgY2xhc3MgS0NsYXNzRW52IHsKICAvLy8gVGhlIFtpci5DbGFzc10gdGhhdCBkZWZpbmVkIHRoZSBjbGFzcywgaWYgYW55LgogIGlyLkNsYXNzIGdldCBjbHM7CgogIC8vLyBXaGV0aGVyIHRoZSBjbGFzcyBpcyBhbiB1bm5hbWVkIG1peGluIGFwcGxpY2F0aW9uLgogIGJvb2wgZ2V0IGlzVW5uYW1lZE1peGluQXBwbGljYXRpb247CgogIC8vLyBXaGV0aGVyIHRoZSBjbGFzcyBpcyBhIG1peGluIGFwcGxpY2F0aW9uIHRoYXQgbWl4ZXMgaW4gbWV0aG9kcyB3aXRoIHN1cGVyCiAgLy8vIGNhbGxzLgogIGJvb2wgZ2V0IGlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uOwoKICAvLy8gRW5zdXJlcyB0aGF0IGFsbCBtZW1iZXJzIGhhdmUgYmVlbiBjb21wdXRlZCBmb3IgW2Nsc10uCiAgdm9pZCBlbnN1cmVNZW1iZXJzKEtlcm5lbFRvRWxlbWVudE1hcEltcGwgZWxlbWVudE1hcCk7CgogIC8vLyBSZXR1cm4gdGhlIFtNZW1iZXJFbnRpdHldIGZvciB0aGUgbWVtYmVyIFtuYW1lXSBpbiB0aGUgY2xhc3MuIElmIFtzZXR0ZXJdCiAgLy8vIGlzIGB0cnVlYCwgdGhlIHNldHRlciBvciBhc3NpZ25hYmxlIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gW25hbWVdIGlzCiAgLy8vIHJldHVybmVkLgogIE1lbWJlckVudGl0eSBsb29rdXBNZW1iZXIoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KTsKCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBtZW1iZXIgb2YgW2Nsc10uCiAgdm9pZCBmb3JFYWNoTWVtYmVyKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSk7CgogIC8vLyBSZXR1cm4gdGhlIFtDb25zdHJ1Y3RvckVudGl0eV0gZm9yIHRoZSBjb25zdHJ1Y3RvciBbbmFtZV0gaW4gW2Nsc10uCiAgQ29uc3RydWN0b3JFbnRpdHkgbG9va3VwQ29uc3RydWN0b3IoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgU3RyaW5nIG5hbWUpOwoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGNvbnN0cnVjdG9yIG9mIFtjbHNdLgogIHZvaWQgZm9yRWFjaENvbnN0cnVjdG9yKAogICAgICBJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwLCB2b2lkIGYoQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpKTsKCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBjb25zdHJ1Y3RvciBib2R5IGZvciB0aGUgbGl2ZSBjb25zdHJ1Y3RvcnMgaW4gdGhlCiAgLy8vIGNsYXNzLgogIHZvaWQgZm9yRWFjaENvbnN0cnVjdG9yQm9keSh2b2lkIGYoQ29uc3RydWN0b3JCb2R5RW50aXR5IGNvbnN0cnVjdG9yKSk7CgogIC8vLyBDb252ZXJ0IHRoaXMgW0tDbGFzc0Vudl0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgW0pDbGFzc0Vudl0gY29udGFpbmluZyBvbmx5CiAgLy8vIHRoZSBtZW1iZXJzIGluIFtsaXZlTWVtYmVyc10uCiAgSkNsYXNzRW52IGNvbnZlcnQoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwKICAgICAgTWFwPE1lbWJlckVudGl0eSwgTWVtYmVyVXNhZ2U+IGxpdmVNZW1iZXJVc2FnZSk7Cn0KCmludCBvcmRlckJ5RmlsZU9mZnNldChpci5UcmVlTm9kZSBhLCBpci5UcmVlTm9kZSBiKSB7CiAgdmFyIGFMb2MgPSBhLmxvY2F0aW9uOwogIHZhciBiTG9jID0gYi5sb2NhdGlvbjsKICB2YXIgYVVyaSA9ICcke2FMb2MuZmlsZX0nOwogIHZhciBiVXJpID0gJyR7YkxvYy5maWxlfSc7CiAgdmFyIHVyaUNvbXBhcmUgPSBhVXJpLmNvbXBhcmVUbyhiVXJpKTsKICBpZiAodXJpQ29tcGFyZSAhPSAwKSByZXR1cm4gdXJpQ29tcGFyZTsKICByZXR1cm4gYS5maWxlT2Zmc2V0LmNvbXBhcmVUbyhiLmZpbGVPZmZzZXQpOwp9CgovLy8gRW52aXJvbm1lbnQgZm9yIGZhc3QgbG9va3VwIG9mIGNsYXNzIG1lbWJlcnMuCmNsYXNzIEtDbGFzc0VudkltcGwgaW1wbGVtZW50cyBLQ2xhc3NFbnYgewogIEBvdmVycmlkZQogIGZpbmFsIGlyLkNsYXNzIGNsczsKCiAgTWFwPFN0cmluZywgaXIuTWVtYmVyPiBfY29uc3RydWN0b3JNYXA7CiAgTWFwPFN0cmluZywgaXIuTWVtYmVyPiBfbWVtYmVyTWFwOwogIE1hcDxTdHJpbmcsIGlyLk1lbWJlcj4gX3NldHRlck1hcDsKICBMaXN0PGlyLk1lbWJlcj4gX21lbWJlcnM7IC8vIGluIGRlY2xhcmF0aW9uIG9yZGVyLgogIGJvb2wgX2lzU3VwZXJNaXhpbkFwcGxpY2F0aW9uOwoKICAvLy8gQ29uc3RydWN0b3IgYm9kaWVzIGNyZWF0ZWQgZm9yIHRoaXMgY2xhc3MuCiAgTGlzdDxDb25zdHJ1Y3RvckJvZHlFbnRpdHk+IF9jb25zdHJ1Y3RvckJvZHlMaXN0OwoKICBLQ2xhc3NFbnZJbXBsKHRoaXMuY2xzKTsKCiAgS0NsYXNzRW52SW1wbC5pbnRlcm5hbCh0aGlzLmNscywgdGhpcy5fY29uc3RydWN0b3JNYXAsIHRoaXMuX21lbWJlck1hcCwKICAgICAgdGhpcy5fc2V0dGVyTWFwLCB0aGlzLl9tZW1iZXJzLCB0aGlzLl9pc1N1cGVyTWl4aW5BcHBsaWNhdGlvbik7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVW5uYW1lZE1peGluQXBwbGljYXRpb24gPT4gY2xzLmlzQW5vbnltb3VzTWl4aW47CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3VwZXJNaXhpbkFwcGxpY2F0aW9uIHsKICAgIGFzc2VydChfaXNTdXBlck1peGluQXBwbGljYXRpb24gIT0gbnVsbCk7CiAgICByZXR1cm4gX2lzU3VwZXJNaXhpbkFwcGxpY2F0aW9uOwogIH0KCiAgLy8vIENvcGllZCBmcm9tICdwYWNrYWdlOmtlcm5lbC90cmFuc2Zvcm1hdGlvbnMvbWl4aW5fZnVsbF9yZXNvbHV0aW9uLmRhcnQnLgogIGlyLkNvbnN0cnVjdG9yIF9idWlsZEZvcndhcmRpbmdDb25zdHJ1Y3RvcigKICAgICAgQ2xvbmVWaXNpdG9yIGNsb25lciwgaXIuQ29uc3RydWN0b3Igc3VwZXJjbGFzc0NvbnN0cnVjdG9yKSB7CiAgICB2YXIgc3VwZXJGdW5jdGlvbiA9IHN1cGVyY2xhc3NDb25zdHJ1Y3Rvci5mdW5jdGlvbjsKCiAgICAvLyBXZSBrZWVwIHR5cGVzIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHBhcmFtZXRlcnMgYnV0IGFsd2F5cyBtYXJrIHRoZQogICAgLy8gcGFyYW1ldGVycyBhcyBmaW5hbCAoc2luY2Ugd2UganVzdCBmb3J3YXJkIHRoZW0gdG8gdGhlIHN1cGVyCiAgICAvLyBjb25zdHJ1Y3RvcikuCiAgICBpci5WYXJpYWJsZURlY2xhcmF0aW9uIGNsb25lVmFyaWFibGUoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgICBpci5WYXJpYWJsZURlY2xhcmF0aW9uIGNsb25lID0gY2xvbmVyLmNsb25lKHZhcmlhYmxlKTsKICAgICAgY2xvbmUuaXNGaW5hbCA9IHRydWU7CiAgICAgIHJldHVybiBjbG9uZTsKICAgIH0KCiAgICAvLyBCdWlsZCBhIFtGdW5jdGlvbk5vZGVdIHdoaWNoIGhhcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIHRoZSBvbmUgaW4gdGhlCiAgICAvLyBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLgogICAgdmFyIHBvc2l0aW9uYWxQYXJhbWV0ZXJzID0KICAgICAgICBzdXBlckZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLm1hcChjbG9uZVZhcmlhYmxlKS50b0xpc3QoKTsKICAgIHZhciBuYW1lZFBhcmFtZXRlcnMgPQogICAgICAgIHN1cGVyRnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLm1hcChjbG9uZVZhcmlhYmxlKS50b0xpc3QoKTsKICAgIHZhciBmdW5jdGlvbiA9IG5ldyBpci5GdW5jdGlvbk5vZGUobmV3IGlyLkVtcHR5U3RhdGVtZW50KCksCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHN1cGVyRnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICByZXR1cm5UeXBlOiBjb25zdCBpci5Wb2lkVHlwZSgpKTsKCiAgICAvLyBCdWlsZCBhIFtTdXBlckluaXRpYWxpemVyXSB3aGljaCB0YWtlcyBhbGwgcG9zaXRpb25hbC9uYW1lZCBwYXJhbWV0ZXJzCiAgICAvLyBhbmQgZm9yd2FyZCB0aGVtIHRvIHRoZSBzdXBlciBjbGFzcyBjb25zdHJ1Y3Rvci4KICAgIHZhciBwb3NpdGlvbmFsQXJndW1lbnRzID0gPGlyLkV4cHJlc3Npb24+W107CiAgICBmb3IgKHZhciB2YXJpYWJsZSBpbiBwb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBwb3NpdGlvbmFsQXJndW1lbnRzLmFkZChuZXcgaXIuVmFyaWFibGVHZXQodmFyaWFibGUpKTsKICAgIH0KICAgIHZhciBuYW1lZEFyZ3VtZW50cyA9IDxpci5OYW1lZEV4cHJlc3Npb24+W107CiAgICBmb3IgKHZhciB2YXJpYWJsZSBpbiBuYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgbmFtZWRBcmd1bWVudHMuYWRkKAogICAgICAgICAgbmV3IGlyLk5hbWVkRXhwcmVzc2lvbih2YXJpYWJsZS5uYW1lLCBuZXcgaXIuVmFyaWFibGVHZXQodmFyaWFibGUpKSk7CiAgICB9CiAgICB2YXIgc3VwZXJJbml0aWFsaXplciA9IG5ldyBpci5TdXBlckluaXRpYWxpemVyKHN1cGVyY2xhc3NDb25zdHJ1Y3RvciwKICAgICAgICBuZXcgaXIuQXJndW1lbnRzKHBvc2l0aW9uYWxBcmd1bWVudHMsIG5hbWVkOiBuYW1lZEFyZ3VtZW50cykpOwoKICAgIC8vIEFzc2VtYmxlIHRoZSBjb25zdHJ1Y3Rvci4KICAgIHJldHVybiBuZXcgaXIuQ29uc3RydWN0b3IoZnVuY3Rpb24sCiAgICAgICAgbmFtZTogc3VwZXJjbGFzc0NvbnN0cnVjdG9yLm5hbWUsCiAgICAgICAgaW5pdGlhbGl6ZXJzOiA8aXIuSW5pdGlhbGl6ZXI+W3N1cGVySW5pdGlhbGl6ZXJdKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5zdXJlTWVtYmVycyhLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXApIHsKICAgIF9lbnN1cmVNYXBzKGVsZW1lbnRNYXApOwogIH0KCiAgdm9pZCBfZW5zdXJlTWFwcyhLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXApIHsKICAgIGlmIChfbWVtYmVyTWFwICE9IG51bGwpIHJldHVybjsKCiAgICBfbWVtYmVyTWFwID0gPFN0cmluZywgaXIuTWVtYmVyPnt9OwogICAgX3NldHRlck1hcCA9IDxTdHJpbmcsIGlyLk1lbWJlcj57fTsKICAgIF9jb25zdHJ1Y3Rvck1hcCA9IDxTdHJpbmcsIGlyLk1lbWJlcj57fTsKICAgIHZhciBtZW1iZXJzID0gPGlyLk1lbWJlcj5bXTsKICAgIF9pc1N1cGVyTWl4aW5BcHBsaWNhdGlvbiA9IGZhbHNlOwoKICAgIHZvaWQgYWRkRmllbGQoaXIuRmllbGQgbWVtYmVyLCB7Ym9vbCBpbmNsdWRlU3RhdGljfSkgewogICAgICBpZiAoIWluY2x1ZGVTdGF0aWMgJiYgbWVtYmVyLmlzU3RhdGljKSByZXR1cm47CiAgICAgIHZhciBuYW1lID0gbWVtYmVyLm5hbWUubmFtZTsKICAgICAgaWYgKG5hbWUuY29udGFpbnMoJyMnKSkgewogICAgICAgIC8vIFNraXAgc3ludGhldGljIC5kaWxsIG1lbWJlcnMuCiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9tZW1iZXJNYXBbbmFtZV0gPSBtZW1iZXI7CiAgICAgIGlmIChtZW1iZXIuaXNNdXRhYmxlKSB7CiAgICAgICAgX3NldHRlck1hcFtuYW1lXSA9IG1lbWJlcjsKICAgICAgfQogICAgICBtZW1iZXJzLmFkZChtZW1iZXIpOwogICAgfQoKICAgIHZvaWQgYWRkUHJvY2VkdXJlKGlyLlByb2NlZHVyZSBtZW1iZXIsCiAgICAgICAge2Jvb2wgaW5jbHVkZVN0YXRpYywgYm9vbCBpbmNsdWRlTm9TdWNoTWV0aG9kRm9yd2FyZGVyc30pIHsKICAgICAgaWYgKG1lbWJlci5pc0ZvcndhcmRpbmdTdHViICYmIG1lbWJlci5pc0Fic3RyYWN0KSB7CiAgICAgICAgLy8gU2tpcCBhYnN0cmFjdCBmb3J3YXJkaW5nIHN0dWJzLiBUaGVzZSBhcmUgbmV2ZXIgZW1pdHRlZCBidXQgdGhleQogICAgICAgIC8vIG1pZ2h0IHNoYWRvdyB0aGUgaW5jbHVzaW9uIG9mIGEgbWl4ZWQgaW4gbWV0aG9kIGluIGNvZGUgbGlrZToKICAgICAgICAvLwogICAgICAgIC8vICAgICBjbGFzcyBTdXBlciB7fQogICAgICAgIC8vICAgICBjbGFzcyBNaXhpbjxUPiB7CiAgICAgICAgLy8gICAgICAgdm9pZCBtZXRob2QoVCB0KSB7fQogICAgICAgIC8vICAgICB9CiAgICAgICAgLy8gICAgIGNsYXNzIENsYXNzIGV4dGVuZHMgU3VwZXIgd2l0aCBNaXhpbjxpbnQ+IHt9CiAgICAgICAgLy8gICAgIG1haW4oKSA9PiBuZXcgQ2xhc3MoKS5tZXRob2QoKTsKICAgICAgICAvLwogICAgICAgIC8vIEhlcmUgYSBzdHViIGlzIGNyZWF0ZWQgZm9yIGBTdXBlciZNaXhpbi5tZXRob2RgIGhpZGluZyB0aGF0CiAgICAgICAgLy8gYE1peGluLm1ldGhvZGAgaXMgaW5oZXJpdGVkIGJ5IGBDbGFzc2AuCiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChtZW1iZXIuaXNGb3J3YXJkaW5nU3R1YiAmJiBjbHMuaXNBbm9ueW1vdXNNaXhpbikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWluY2x1ZGVTdGF0aWMgJiYgbWVtYmVyLmlzU3RhdGljKSByZXR1cm47CiAgICAgIGlmIChtZW1iZXIuaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXIpIHsKICAgICAgICAvLyBUT0RPKHNpZ211bmQpOiByZW1vdmUgb25jZSAjMzM3MzIgaXMgZml4ZWQuCiAgICAgICAgaWYgKCFpbmNsdWRlTm9TdWNoTWV0aG9kRm9yd2FyZGVycyB8fAogICAgICAgICAgICBtZW1iZXIubmFtZS5pc1ByaXZhdGUgJiYKICAgICAgICAgICAgICAgIG1lbWJlci5uYW1lLmxpYnJhcnlOYW1lICE9IG1lbWJlci5lbmNsb3NpbmdMaWJyYXJ5LnJlZmVyZW5jZSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgbmFtZSA9IG1lbWJlci5uYW1lLm5hbWU7CiAgICAgIGFzc2VydCghbmFtZS5jb250YWlucygnIycpKTsKICAgICAgaWYgKG1lbWJlci5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuRmFjdG9yeSkgewogICAgICAgIGlmIChpc1JlZGlyZWN0aW5nRmFjdG9yeShtZW1iZXIpKSB7CiAgICAgICAgICAvLyBEb24ndCBpbmNsdWRlIHJlZGlyZWN0aW5nIGZhY3Rvcmllcy4KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgX2NvbnN0cnVjdG9yTWFwW25hbWVdID0gbWVtYmVyOwogICAgICB9IGVsc2UgaWYgKG1lbWJlci5raW5kID09IGlyLlByb2NlZHVyZUtpbmQuU2V0dGVyKSB7CiAgICAgICAgX3NldHRlck1hcFtuYW1lXSA9IG1lbWJlcjsKICAgICAgICBtZW1iZXJzLmFkZChtZW1iZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChtZW1iZXIua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLk1ldGhvZCB8fAogICAgICAgICAgICBtZW1iZXIua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLkdldHRlciB8fAogICAgICAgICAgICBtZW1iZXIua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLk9wZXJhdG9yKTsKICAgICAgICBfbWVtYmVyTWFwW25hbWVdID0gbWVtYmVyOwogICAgICAgIG1lbWJlcnMuYWRkKG1lbWJlcik7CiAgICAgIH0KICAgIH0KCiAgICB2b2lkIGFkZENvbnN0cnVjdG9ycyhpci5DbGFzcyBjKSB7CiAgICAgIGZvciAoaXIuQ29uc3RydWN0b3IgbWVtYmVyIGluIGMuY29uc3RydWN0b3JzKSB7CiAgICAgICAgdmFyIG5hbWUgPSBtZW1iZXIubmFtZS5uYW1lOwogICAgICAgIGFzc2VydCghbmFtZS5jb250YWlucygnIycpKTsKICAgICAgICBfY29uc3RydWN0b3JNYXBbbmFtZV0gPSBtZW1iZXI7CiAgICAgIH0KICAgIH0KCiAgICBpbnQgbWl4aW5NZW1iZXJDb3VudCA9IDA7CgogICAgaWYgKGNscy5taXhlZEluQ2xhc3MgIT0gbnVsbCkgewogICAgICBDbG9uZVZpc2l0b3IgY2xvbmVWaXNpdG9yOwogICAgICBmb3IgKGlyLkZpZWxkIGZpZWxkIGluIGNscy5taXhlZEluQ2xhc3MubWl4aW4uZmllbGRzKSB7CiAgICAgICAgaWYgKGZpZWxkLmNvbnRhaW5zU3VwZXJDYWxscykgewogICAgICAgICAgX2lzU3VwZXJNaXhpbkFwcGxpY2F0aW9uID0gdHJ1ZTsKICAgICAgICAgIGNsb25lVmlzaXRvciA/Pz0gbmV3IENsb25lVmlzaXRvcigKICAgICAgICAgICAgICB0eXBlU3Vic3RpdHV0aW9uOiBnZXRTdWJzdGl0dXRpb25NYXAoY2xzLm1peGVkSW5UeXBlKSk7CiAgICAgICAgICBjbHMuYWRkTWVtYmVyKGNsb25lVmlzaXRvci5jbG9uZShmaWVsZCkpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGFkZEZpZWxkKGZpZWxkLCBpbmNsdWRlU3RhdGljOiBmYWxzZSk7CiAgICAgIH0KICAgICAgZm9yIChpci5Qcm9jZWR1cmUgcHJvY2VkdXJlIGluIGNscy5taXhlZEluQ2xhc3MubWl4aW4ucHJvY2VkdXJlcykgewogICAgICAgIGlmIChwcm9jZWR1cmUuY29udGFpbnNTdXBlckNhbGxzKSB7CiAgICAgICAgICBfaXNTdXBlck1peGluQXBwbGljYXRpb24gPSB0cnVlOwogICAgICAgICAgY2xvbmVWaXNpdG9yID8/PSBuZXcgQ2xvbmVWaXNpdG9yKAogICAgICAgICAgICAgIHR5cGVTdWJzdGl0dXRpb246IGdldFN1YnN0aXR1dGlvbk1hcChjbHMubWl4ZWRJblR5cGUpKTsKICAgICAgICAgIGNscy5hZGRNZW1iZXIoY2xvbmVWaXNpdG9yLmNsb25lKHByb2NlZHVyZSkpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGFkZFByb2NlZHVyZShwcm9jZWR1cmUsCiAgICAgICAgICAgIGluY2x1ZGVTdGF0aWM6IGZhbHNlLCBpbmNsdWRlTm9TdWNoTWV0aG9kRm9yd2FyZGVyczogZmFsc2UpOwogICAgICB9CiAgICAgIG1lcmdlU29ydChtZW1iZXJzLCBjb21wYXJlOiBvcmRlckJ5RmlsZU9mZnNldCk7CiAgICAgIG1peGluTWVtYmVyQ291bnQgPSBtZW1iZXJzLmxlbmd0aDsKICAgIH0KCiAgICBmb3IgKGlyLkZpZWxkIG1lbWJlciBpbiBjbHMuZmllbGRzKSB7CiAgICAgIGFkZEZpZWxkKG1lbWJlciwgaW5jbHVkZVN0YXRpYzogdHJ1ZSk7CiAgICB9CiAgICBhZGRDb25zdHJ1Y3RvcnMoY2xzKTsKICAgIGZvciAoaXIuUHJvY2VkdXJlIG1lbWJlciBpbiBjbHMucHJvY2VkdXJlcykgewogICAgICBhZGRQcm9jZWR1cmUobWVtYmVyLAogICAgICAgICAgaW5jbHVkZVN0YXRpYzogdHJ1ZSwgaW5jbHVkZU5vU3VjaE1ldGhvZEZvcndhcmRlcnM6IHRydWUpOwogICAgfQoKICAgIGlmIChpc1VubmFtZWRNaXhpbkFwcGxpY2F0aW9uICYmIF9jb25zdHJ1Y3Rvck1hcC5pc0VtcHR5KSB7CiAgICAgIC8vIEVuc3VyZSB0aGF0IGNvbnN0cnVjdG9ycyBhcmUgY3JlYXRlZCBmb3IgdGhlIHN1cGVyY2xhc3MgaW4gY2FzZSBpdAogICAgICAvLyBpcyBhbHNvIGFuIHVubmFtZWQgbWl4aW4gYXBwbGljYXRpb24uCiAgICAgIENsYXNzRW50aXR5IHN1cGVyY2xhc3MgPSBlbGVtZW50TWFwLmdldENsYXNzKGNscy5zdXBlcmNsYXNzKTsKICAgICAgZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQubG9va3VwQ29uc3RydWN0b3Ioc3VwZXJjbGFzcywgJycpOwoKICAgICAgLy8gVW5uYW1lZCBtaXhpbiBhcHBsaWNhdGlvbnMgaGF2ZSBubyBjb25zdHJ1Y3RvcnMgd2hlbiByZWFkIGZyb20gLmRpbGwuCiAgICAgIC8vIEZvciBlYWNoIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgaW4gdGhlIHN1cGVyY2xhc3Mgd2UgbWFrZSBhCiAgICAgIC8vIGNvcnJlc3BvbmRpbmcgZm9yd2FyZGluZyBjb25zdHJ1Y3RvciBpbiB0aGUgc3ViY2xhc3MuCiAgICAgIC8vCiAgICAgIC8vIFRoaXMgY29kZSBpcyBjb3BpZWQgZnJvbQogICAgICAvLyAncGFja2FnZTprZXJuZWwvdHJhbnNmb3JtYXRpb25zL21peGluX2Z1bGxfcmVzb2x1dGlvbi5kYXJ0JwogICAgICB2YXIgc3VwZXJjbGFzc1N1YnN0aXR1dGlvbiA9IGdldFN1YnN0aXR1dGlvbk1hcChjbHMuc3VwZXJ0eXBlKTsKICAgICAgdmFyIHN1cGVyY2xhc3NDbG9uZXIgPQogICAgICAgICAgbmV3IENsb25lVmlzaXRvcih0eXBlU3Vic3RpdHV0aW9uOiBzdXBlcmNsYXNzU3Vic3RpdHV0aW9uKTsKCiAgICAgIGZvciAodmFyIHN1cGVyY2xhc3NDb25zdHJ1Y3RvciBpbiBjbHMuc3VwZXJjbGFzcy5jb25zdHJ1Y3RvcnMpIHsKICAgICAgICB2YXIgZm9yd2FyZGluZ0NvbnN0cnVjdG9yID0gX2J1aWxkRm9yd2FyZGluZ0NvbnN0cnVjdG9yKAogICAgICAgICAgICBzdXBlcmNsYXNzQ2xvbmVyLCBzdXBlcmNsYXNzQ29uc3RydWN0b3IpOwogICAgICAgIGNscy5hZGRNZW1iZXIoZm9yd2FyZGluZ0NvbnN0cnVjdG9yKTsKICAgICAgICBfY29uc3RydWN0b3JNYXBbZm9yd2FyZGluZ0NvbnN0cnVjdG9yLm5hbWUubmFtZV0gPQogICAgICAgICAgICBmb3J3YXJkaW5nQ29uc3RydWN0b3I7CiAgICAgIH0KICAgIH0KCiAgICBtZXJnZVNvcnQobWVtYmVycywgc3RhcnQ6IG1peGluTWVtYmVyQ291bnQsIGNvbXBhcmU6IG9yZGVyQnlGaWxlT2Zmc2V0KTsKICAgIF9tZW1iZXJzID0gbWVtYmVyczsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlckVudGl0eSBsb29rdXBNZW1iZXIoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICBfZW5zdXJlTWFwcyhlbGVtZW50TWFwKTsKICAgIGlyLk1lbWJlciBtZW1iZXIgPSBzZXR0ZXIgPyBfc2V0dGVyTWFwW25hbWVdIDogX21lbWJlck1hcFtuYW1lXTsKICAgIHJldHVybiBtZW1iZXIgIT0gbnVsbCA/IGVsZW1lbnRNYXAuZ2V0TWVtYmVyKG1lbWJlcikgOiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoTWVtYmVyKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIHZvaWQgZihNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgX2Vuc3VyZU1hcHMoZWxlbWVudE1hcCk7CiAgICBfbWVtYmVycy5mb3JFYWNoKChpci5NZW1iZXIgbWVtYmVyKSB7CiAgICAgIGYoZWxlbWVudE1hcC5nZXRNZW1iZXIobWVtYmVyKSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yRW50aXR5IGxvb2t1cENvbnN0cnVjdG9yKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIFN0cmluZyBuYW1lKSB7CiAgICBfZW5zdXJlTWFwcyhlbGVtZW50TWFwKTsKICAgIGlyLk1lbWJlciBjb25zdHJ1Y3RvciA9IF9jb25zdHJ1Y3Rvck1hcFtuYW1lXTsKICAgIHJldHVybiBjb25zdHJ1Y3RvciAhPSBudWxsID8gZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvcikgOiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoQ29uc3RydWN0b3IoCiAgICAgIElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsIHZvaWQgZihDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvcikpIHsKICAgIF9lbnN1cmVNYXBzKGVsZW1lbnRNYXApOwogICAgX2NvbnN0cnVjdG9yTWFwLnZhbHVlcy5mb3JFYWNoKChpci5NZW1iZXIgY29uc3RydWN0b3IpIHsKICAgICAgZihlbGVtZW50TWFwLmdldENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKSk7CiAgICB9KTsKICB9CgogIHZvaWQgYWRkQ29uc3RydWN0b3JCb2R5KENvbnN0cnVjdG9yQm9keUVudGl0eSBjb25zdHJ1Y3RvckJvZHkpIHsKICAgIF9jb25zdHJ1Y3RvckJvZHlMaXN0ID8/PSA8Q29uc3RydWN0b3JCb2R5RW50aXR5PltdOwogICAgX2NvbnN0cnVjdG9yQm9keUxpc3QuYWRkKGNvbnN0cnVjdG9yQm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hDb25zdHJ1Y3RvckJvZHkodm9pZCBmKENvbnN0cnVjdG9yQm9keUVudGl0eSBjb25zdHJ1Y3RvcikpIHsKICAgIF9jb25zdHJ1Y3RvckJvZHlMaXN0Py5mb3JFYWNoKGYpOwogIH0KCiAgQG92ZXJyaWRlCiAgSkNsYXNzRW52IGNvbnZlcnQoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCwKICAgICAgTWFwPE1lbWJlckVudGl0eSwgTWVtYmVyVXNhZ2U+IGxpdmVNZW1iZXJVc2FnZSkgewogICAgTWFwPFN0cmluZywgaXIuTWVtYmVyPiBjb25zdHJ1Y3Rvck1hcDsKICAgIE1hcDxTdHJpbmcsIGlyLk1lbWJlcj4gbWVtYmVyTWFwOwogICAgTWFwPFN0cmluZywgaXIuTWVtYmVyPiBzZXR0ZXJNYXA7CiAgICBMaXN0PGlyLk1lbWJlcj4gbWVtYmVyczsKICAgIGlmIChfY29uc3RydWN0b3JNYXAgPT0gbnVsbCkgewogICAgICBjb25zdHJ1Y3Rvck1hcCA9IGNvbnN0IDxTdHJpbmcsIGlyLk1lbWJlcj57fTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0cnVjdG9yTWFwID0gPFN0cmluZywgaXIuTWVtYmVyPnt9OwogICAgICBfY29uc3RydWN0b3JNYXAuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIGlyLk1lbWJlciBub2RlKSB7CiAgICAgICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyKG5vZGUpOwogICAgICAgIGlmIChsaXZlTWVtYmVyVXNhZ2UuY29udGFpbnNLZXkobWVtYmVyKSkgewogICAgICAgICAgY29uc3RydWN0b3JNYXBbbmFtZV0gPSBub2RlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBpZiAoX21lbWJlck1hcCA9PSBudWxsKSB7CiAgICAgIG1lbWJlck1hcCA9IGNvbnN0IDxTdHJpbmcsIGlyLk1lbWJlcj57fTsKICAgIH0gZWxzZSB7CiAgICAgIG1lbWJlck1hcCA9IDxTdHJpbmcsIGlyLk1lbWJlcj57fTsKICAgICAgX21lbWJlck1hcC5mb3JFYWNoKChTdHJpbmcgbmFtZSwgaXIuTWVtYmVyIG5vZGUpIHsKICAgICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZSk7CiAgICAgICAgaWYgKGxpdmVNZW1iZXJVc2FnZS5jb250YWluc0tleShtZW1iZXIpKSB7CiAgICAgICAgICBtZW1iZXJNYXBbbmFtZV0gPSBub2RlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBpZiAoX3NldHRlck1hcCA9PSBudWxsKSB7CiAgICAgIHNldHRlck1hcCA9IGNvbnN0IDxTdHJpbmcsIGlyLk1lbWJlcj57fTsKICAgIH0gZWxzZSB7CiAgICAgIHNldHRlck1hcCA9IDxTdHJpbmcsIGlyLk1lbWJlcj57fTsKICAgICAgX3NldHRlck1hcC5mb3JFYWNoKChTdHJpbmcgbmFtZSwgaXIuTWVtYmVyIG5vZGUpIHsKICAgICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gZWxlbWVudE1hcC5nZXRNZW1iZXIobm9kZSk7CiAgICAgICAgaWYgKGxpdmVNZW1iZXJVc2FnZS5jb250YWluc0tleShtZW1iZXIpKSB7CiAgICAgICAgICBzZXR0ZXJNYXBbbmFtZV0gPSBub2RlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBpZiAoX21lbWJlcnMgPT0gbnVsbCkgewogICAgICBtZW1iZXJzID0gY29uc3QgPGlyLk1lbWJlcj5bXTsKICAgIH0gZWxzZSB7CiAgICAgIG1lbWJlcnMgPSA8aXIuTWVtYmVyPltdOwogICAgICBfbWVtYmVycy5mb3JFYWNoKChpci5NZW1iZXIgbm9kZSkgewogICAgICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPSBlbGVtZW50TWFwLmdldE1lbWJlcihub2RlKTsKICAgICAgICBpZiAobGl2ZU1lbWJlclVzYWdlLmNvbnRhaW5zS2V5KG1lbWJlcikpIHsKICAgICAgICAgIG1lbWJlcnMuYWRkKG5vZGUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gbmV3IEpDbGFzc0VudkltcGwoY2xzLCBjb25zdHJ1Y3Rvck1hcCwgbWVtYmVyTWFwLCBzZXR0ZXJNYXAsIG1lbWJlcnMsCiAgICAgICAgX2lzU3VwZXJNaXhpbkFwcGxpY2F0aW9uID8/IGZhbHNlKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEtDbGFzc0RhdGEgewogIGlyLkNsYXNzIGdldCBub2RlOwoKICBJbnRlcmZhY2VUeXBlIGdldCB0aGlzVHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCByYXdUeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IHN1cGVydHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCBtaXhlZEluVHlwZTsKICBMaXN0PEludGVyZmFjZVR5cGU+IGdldCBpbnRlcmZhY2VzOwogIE9yZGVyZWRUeXBlU2V0IGdldCBvcmRlcmVkVHlwZVNldDsKICBEYXJ0VHlwZSBnZXQgY2FsbFR5cGU7CgogIGJvb2wgZ2V0IGlzRW51bUNsYXNzOwogIGJvb2wgZ2V0IGlzTWl4aW5BcHBsaWNhdGlvbjsKCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gZ2V0TWV0YWRhdGEoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCk7CgogIC8vLyBDb252ZXJ0IHRoaXMgW0tDbGFzc0RhdGFdIHRvIHRoZSBjb3JyZXNwb25kaW5nIFtKQ2xhc3NEYXRhXS4KICBKQ2xhc3NEYXRhIGNvbnZlcnQoKTsKfQoKY2xhc3MgS0NsYXNzRGF0YUltcGwgaW1wbGVtZW50cyBLQ2xhc3NEYXRhIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBpci5DbGFzcyBub2RlOwogIEBvdmVycmlkZQogIGJvb2wgaXNNaXhpbkFwcGxpY2F0aW9uOwogIGJvb2wgaXNDYWxsVHlwZUNvbXB1dGVkID0gZmFsc2U7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgdGhpc1R5cGU7CiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSByYXdUeXBlOwogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlOwogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgbWl4ZWRJblR5cGU7CiAgQG92ZXJyaWRlCiAgTGlzdDxJbnRlcmZhY2VUeXBlPiBpbnRlcmZhY2VzOwogIEBvdmVycmlkZQogIE9yZGVyZWRUeXBlU2V0IG9yZGVyZWRUeXBlU2V0OwoKICBJdGVyYWJsZTxDb25zdGFudFZhbHVlPiBfbWV0YWRhdGE7CgogIEtDbGFzc0RhdGFJbXBsKHRoaXMubm9kZSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRW51bUNsYXNzID0+IG5vZGUuaXNFbnVtOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXQgY2FsbFR5cGUgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gZ2V0TWV0YWRhdGEoCiAgICAgIGNvdmFyaWFudCBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBfbWV0YWRhdGEgPz89IGVsZW1lbnRNYXAuZ2V0TWV0YWRhdGEobm9kZS5hbm5vdGF0aW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICBKQ2xhc3NEYXRhIGNvbnZlcnQoKSB7CiAgICByZXR1cm4gbmV3IEpDbGFzc0RhdGFJbXBsKG5vZGUsIG5ldyBSZWd1bGFyQ2xhc3NEZWZpbml0aW9uKG5vZGUpKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEtNZW1iZXJEYXRhIHsKICBpci5NZW1iZXIgZ2V0IG5vZGU7CgogIFN0YXRpY1R5cGVDYWNoZSBzdGF0aWNUeXBlczsKCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gZ2V0TWV0YWRhdGEoSXJUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCk7CgogIEludGVyZmFjZVR5cGUgZ2V0TWVtYmVyVGhpc1R5cGUoSnNUb0VsZW1lbnRNYXAgZWxlbWVudE1hcCk7CgogIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIGdldCBjbGFzc1R5cGVWYXJpYWJsZUFjY2VzczsKCiAgLy8vIENvbnZlcnQgdGhpcyBbS01lbWJlckRhdGFdIHRvIHRoZSBjb3JyZXNwb25kaW5nIFtKTWVtYmVyRGF0YV0uCiAgSk1lbWJlckRhdGEgY29udmVydCgpOwp9CgphYnN0cmFjdCBjbGFzcyBLTWVtYmVyRGF0YUltcGwgaW1wbGVtZW50cyBLTWVtYmVyRGF0YSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgaXIuTWVtYmVyIG5vZGU7CgogIEl0ZXJhYmxlPENvbnN0YW50VmFsdWU+IF9tZXRhZGF0YTsKCiAgQG92ZXJyaWRlCiAgU3RhdGljVHlwZUNhY2hlIHN0YXRpY1R5cGVzOwoKICBLTWVtYmVyRGF0YUltcGwodGhpcy5ub2RlKTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q29uc3RhbnRWYWx1ZT4gZ2V0TWV0YWRhdGEoCiAgICAgIGNvdmFyaWFudCBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBfbWV0YWRhdGEgPz89IGVsZW1lbnRNYXAuZ2V0TWV0YWRhdGEobm9kZS5hbm5vdGF0aW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldE1lbWJlclRoaXNUeXBlKEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApIHsKICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPSBlbGVtZW50TWFwLmdldE1lbWJlcihub2RlKTsKICAgIENsYXNzRW50aXR5IGNscyA9IG1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgIGlmIChjbHMgIT0gbnVsbCkgewogICAgICByZXR1cm4gZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0VGhpc1R5cGUoY2xzKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgS0Z1bmN0aW9uRGF0YSBpbXBsZW1lbnRzIEtNZW1iZXJEYXRhIHsKICBGdW5jdGlvblR5cGUgZ2V0RnVuY3Rpb25UeXBlKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApOwoKICBMaXN0PFR5cGVWYXJpYWJsZVR5cGU+IGdldEZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhJclRvRWxlbWVudE1hcCBlbGVtZW50TWFwKTsKCiAgdm9pZCBmb3JFYWNoUGFyYW1ldGVyKEpzVG9FbGVtZW50TWFwIGVsZW1lbnRNYXAsCiAgICAgIHZvaWQgZihEYXJ0VHlwZSB0eXBlLCBTdHJpbmcgbmFtZSwgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0VmFsdWUpKTsKfQoKYWJzdHJhY3QgY2xhc3MgS0Z1bmN0aW9uRGF0YU1peGluIGltcGxlbWVudHMgS0Z1bmN0aW9uRGF0YSB7CiAgaXIuRnVuY3Rpb25Ob2RlIGdldCBmdW5jdGlvbk5vZGU7CiAgTGlzdDxUeXBlVmFyaWFibGVUeXBlPiBfdHlwZVZhcmlhYmxlczsKCiAgQG92ZXJyaWRlCiAgTGlzdDxUeXBlVmFyaWFibGVUeXBlPiBnZXRGdW5jdGlvblR5cGVWYXJpYWJsZXMoCiAgICAgIGNvdmFyaWFudCBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXApIHsKICAgIGlmIChfdHlwZVZhcmlhYmxlcyA9PSBudWxsKSB7CiAgICAgIGlmIChmdW5jdGlvbk5vZGUudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICAgIF90eXBlVmFyaWFibGVzID0gY29uc3QgPFR5cGVWYXJpYWJsZVR5cGU+W107CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaXIuVHJlZU5vZGUgcGFyZW50ID0gZnVuY3Rpb25Ob2RlLnBhcmVudDsKICAgICAgICBpZiAocGFyZW50IGlzIGlyLkNvbnN0cnVjdG9yIHx8CiAgICAgICAgICAgIChwYXJlbnQgaXMgaXIuUHJvY2VkdXJlICYmCiAgICAgICAgICAgICAgICBwYXJlbnQua2luZCA9PSBpci5Qcm9jZWR1cmVLaW5kLkZhY3RvcnkpKSB7CiAgICAgICAgICBfdHlwZVZhcmlhYmxlcyA9IGNvbnN0IDxUeXBlVmFyaWFibGVUeXBlPltdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfdHlwZVZhcmlhYmxlcyA9IGZ1bmN0aW9uTm9kZS50eXBlUGFyYW1ldGVycwogICAgICAgICAgICAgIC5tYXA8VHlwZVZhcmlhYmxlVHlwZT4oKGlyLlR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlcikgewogICAgICAgICAgICByZXR1cm4gZWxlbWVudE1hcAogICAgICAgICAgICAgICAgLmdldERhcnRUeXBlKG5ldyBpci5UeXBlUGFyYW1ldGVyVHlwZSh0eXBlUGFyYW1ldGVyKSk7CiAgICAgICAgICB9KS50b0xpc3QoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfdHlwZVZhcmlhYmxlczsKICB9Cn0KCmNsYXNzIEtGdW5jdGlvbkRhdGFJbXBsIGV4dGVuZHMgS01lbWJlckRhdGFJbXBsCiAgICB3aXRoIEtGdW5jdGlvbkRhdGFNaXhpbgogICAgaW1wbGVtZW50cyBLRnVuY3Rpb25EYXRhIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBpci5GdW5jdGlvbk5vZGUgZnVuY3Rpb25Ob2RlOwogIEZ1bmN0aW9uVHlwZSBfdHlwZTsKCiAgS0Z1bmN0aW9uRGF0YUltcGwoaXIuTWVtYmVyIG5vZGUsIHRoaXMuZnVuY3Rpb25Ob2RlKSA6IHN1cGVyKG5vZGUpOwoKICBAb3ZlcnJpZGUKICBGdW5jdGlvblR5cGUgZ2V0RnVuY3Rpb25UeXBlKGNvdmFyaWFudCBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXApIHsKICAgIHJldHVybiBfdHlwZSA/Pz0gZWxlbWVudE1hcC5nZXRGdW5jdGlvblR5cGUoZnVuY3Rpb25Ob2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaFBhcmFtZXRlcihKc1RvRWxlbWVudE1hcCBlbGVtZW50TWFwLAogICAgICB2b2lkIGYoRGFydFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIENvbnN0YW50VmFsdWUgZGVmYXVsdFZhbHVlKSkgewogICAgdm9pZCBoYW5kbGVQYXJhbWV0ZXIoaXIuVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlLCB7Ym9vbCBpc09wdGlvbmFsOiB0cnVlfSkgewogICAgICBEYXJ0VHlwZSB0eXBlID0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShub2RlLnR5cGUpOwogICAgICBTdHJpbmcgbmFtZSA9IG5vZGUubmFtZTsKICAgICAgQ29uc3RhbnRWYWx1ZSBkZWZhdWx0VmFsdWU7CiAgICAgIGlmIChpc09wdGlvbmFsKSB7CiAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgZGVmYXVsdFZhbHVlID0gZWxlbWVudE1hcC5nZXRDb25zdGFudFZhbHVlKG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBuZXcgTnVsbENvbnN0YW50VmFsdWUoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZih0eXBlLCBuYW1lLCBkZWZhdWx0VmFsdWUpOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnVuY3Rpb25Ob2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGhhbmRsZVBhcmFtZXRlcihmdW5jdGlvbk5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0sCiAgICAgICAgICBpc09wdGlvbmFsOiBpID49IGZ1bmN0aW9uTm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KTsKICAgIH0KICAgIGZ1bmN0aW9uTm9kZS5uYW1lZFBhcmFtZXRlcnMudG9MaXN0KCkKICAgICAgLi5zb3J0KG5hbWVkT3JkZXJpbmcpCiAgICAgIC4uZm9yRWFjaChoYW5kbGVQYXJhbWV0ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25EYXRhIGNvbnZlcnQoKSB7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uRGF0YUltcGwoCiAgICAgICAgbm9kZSwgZnVuY3Rpb25Ob2RlLCBuZXcgUmVndWxhck1lbWJlckRlZmluaXRpb24obm9kZSksIHN0YXRpY1R5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIGdldCBjbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyB7CiAgICBpZiAobm9kZS5pc0luc3RhbmNlTWVtYmVyKSByZXR1cm4gQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MucHJvcGVydHk7CiAgICByZXR1cm4gQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3Mubm9uZTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEtDb25zdHJ1Y3RvckRhdGEgZXh0ZW5kcyBLRnVuY3Rpb25EYXRhIHsKICBDb25zdGFudENvbnN0cnVjdG9yIGdldENvbnN0cnVjdG9yQ29uc3RhbnQoCiAgICAgIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgZWxlbWVudE1hcCwgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IpOwp9CgpjbGFzcyBLQ29uc3RydWN0b3JEYXRhSW1wbCBleHRlbmRzIEtGdW5jdGlvbkRhdGFJbXBsCiAgICBpbXBsZW1lbnRzIEtDb25zdHJ1Y3RvckRhdGEgewogIENvbnN0YW50Q29uc3RydWN0b3IgX2NvbnN0YW50Q29uc3RydWN0b3I7CiAgQ29uc3RydWN0b3JCb2R5RW50aXR5IGNvbnN0cnVjdG9yQm9keTsKCiAgS0NvbnN0cnVjdG9yRGF0YUltcGwoaXIuTWVtYmVyIG5vZGUsIGlyLkZ1bmN0aW9uTm9kZSBmdW5jdGlvbk5vZGUpCiAgICAgIDogc3VwZXIobm9kZSwgZnVuY3Rpb25Ob2RlKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRDb25zdHJ1Y3RvciBnZXRDb25zdHJ1Y3RvckNvbnN0YW50KAogICAgICBLZXJuZWxUb0VsZW1lbnRNYXBJbXBsIGVsZW1lbnRNYXAsIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yKSB7CiAgICBpZiAoX2NvbnN0YW50Q29uc3RydWN0b3IgPT0gbnVsbCkgewogICAgICBpZiAobm9kZSBpcyBpci5Db25zdHJ1Y3RvciAmJiBjb25zdHJ1Y3Rvci5pc0NvbnN0KSB7CiAgICAgICAgX2NvbnN0YW50Q29uc3RydWN0b3IgPQogICAgICAgICAgICBuZXcgQ29uc3RhbnRpZmllcihlbGVtZW50TWFwKS5jb21wdXRlQ29uc3RhbnRDb25zdHJ1Y3Rvcihub2RlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmYWlsZWRBdCgKICAgICAgICAgICAgY29uc3RydWN0b3IsCiAgICAgICAgICAgICJVbmV4cGVjdGVkIGNvbnN0cnVjdG9yICRjb25zdHJ1Y3RvciBpbiAiCiAgICAgICAgICAgICJDb25zdHJ1Y3RvckRhdGFJbXBsLl9nZXRDb25zdHJ1Y3RvckNvbnN0YW50Iik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfY29uc3RhbnRDb25zdHJ1Y3RvcjsKICB9CgogIEBvdmVycmlkZQogIEpDb25zdHJ1Y3RvckRhdGEgY29udmVydCgpIHsKICAgIE1lbWJlckRlZmluaXRpb24gZGVmaW5pdGlvbjsKICAgIGlmIChub2RlIGlzIGlyLkNvbnN0cnVjdG9yKSB7CiAgICAgIGRlZmluaXRpb24gPSBuZXcgU3BlY2lhbE1lbWJlckRlZmluaXRpb24obm9kZSwgTWVtYmVyS2luZC5jb25zdHJ1Y3Rvcik7CiAgICB9IGVsc2UgewogICAgICBkZWZpbml0aW9uID0gbmV3IFJlZ3VsYXJNZW1iZXJEZWZpbml0aW9uKG5vZGUpOwogICAgfQogICAgcmV0dXJuIG5ldyBKQ29uc3RydWN0b3JEYXRhSW1wbCgKICAgICAgICBub2RlLCBmdW5jdGlvbk5vZGUsIGRlZmluaXRpb24sIHN0YXRpY1R5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIGdldCBjbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyA9PgogICAgICBDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5wYXJhbWV0ZXI7Cn0KCmFic3RyYWN0IGNsYXNzIEtGaWVsZERhdGEgZXh0ZW5kcyBLTWVtYmVyRGF0YSB7CiAgRGFydFR5cGUgZ2V0RmllbGRUeXBlKElyVG9FbGVtZW50TWFwIGVsZW1lbnRNYXApOwoKICBDb25zdGFudEV4cHJlc3Npb24gZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb24oCiAgICAgIEtlcm5lbFRvRWxlbWVudE1hcEltcGwgZWxlbWVudE1hcCk7Cn0KCmNsYXNzIEtGaWVsZERhdGFJbXBsIGV4dGVuZHMgS01lbWJlckRhdGFJbXBsIGltcGxlbWVudHMgS0ZpZWxkRGF0YSB7CiAgRGFydFR5cGUgX3R5cGU7CiAgQ29uc3RhbnRFeHByZXNzaW9uIF9jb25zdGFudEV4cHJlc3Npb247CgogIEtGaWVsZERhdGFJbXBsKGlyLkZpZWxkIG5vZGUpIDogc3VwZXIobm9kZSk7CgogIEBvdmVycmlkZQogIGlyLkZpZWxkIGdldCBub2RlID0+IHN1cGVyLm5vZGU7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldEZpZWxkVHlwZShjb3ZhcmlhbnQgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBlbGVtZW50TWFwKSB7CiAgICByZXR1cm4gX3R5cGUgPz89IGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUobm9kZS50eXBlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50RXhwcmVzc2lvbiBnZXRGaWVsZENvbnN0YW50RXhwcmVzc2lvbigKICAgICAgS2VybmVsVG9FbGVtZW50TWFwSW1wbCBlbGVtZW50TWFwKSB7CiAgICBpZiAoX2NvbnN0YW50RXhwcmVzc2lvbiA9PSBudWxsKSB7CiAgICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgICBfY29uc3RhbnRFeHByZXNzaW9uID0KICAgICAgICAgICAgbmV3IENvbnN0YW50aWZpZXIoZWxlbWVudE1hcCkudmlzaXQobm9kZS5pbml0aWFsaXplcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmFpbGVkQXQoCiAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG5vZGUpLAogICAgICAgICAgICAiVW5leHBlY3RlZCBmaWVsZCAke25vZGV9IGluICIKICAgICAgICAgICAgIkZpZWxkRGF0YUltcGwuZ2V0RmllbGRDb25zdGFudCIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2NvbnN0YW50RXhwcmVzc2lvbjsKICB9CgogIEBvdmVycmlkZQogIENsYXNzVHlwZVZhcmlhYmxlQWNjZXNzIGdldCBjbGFzc1R5cGVWYXJpYWJsZUFjY2VzcyB7CiAgICBpZiAobm9kZS5pc0luc3RhbmNlTWVtYmVyKSByZXR1cm4gQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MuaW5zdGFuY2VGaWVsZDsKICAgIHJldHVybiBDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5ub25lOwogIH0KCiAgQG92ZXJyaWRlCiAgSkZpZWxkRGF0YSBjb252ZXJ0KCkgewogICAgcmV0dXJuIG5ldyBKRmllbGREYXRhSW1wbCgKICAgICAgICBub2RlLCBuZXcgUmVndWxhck1lbWJlckRlZmluaXRpb24obm9kZSksIHN0YXRpY1R5cGVzKTsKICB9Cn0KCmNsYXNzIEtUeXBlZGVmRGF0YSB7CiAgZmluYWwgaXIuVHlwZWRlZiBub2RlOwogIGZpbmFsIFR5cGVkZWZFbnRpdHkgZWxlbWVudDsKICBmaW5hbCBUeXBlZGVmVHlwZSByYXdUeXBlOwoKICBLVHlwZWRl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Z292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB1bml2ZXJzZS5mdW5jdGlvbl9zZXQ7CgppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JyBzaG93IElkZW50aWZpZXJzLCBTZWxlY3RvcnM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JyBzaG93IEhhc2hpbmcsIFNldGxldDsKaW1wb3J0ICdzZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwoKLy8gVE9ETyhrYXNwZXJsKTogVGhpcyBhY3R1YWxseSBob2xkcyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGp1c3QgZmluZQovLyB0b28gYW5kIHN0cmljbHkgdGhleSBhcmVuJ3QgZnVuY3Rpb25zLiBNYXliZSB0aGlzIG5lZWRzIGEgYmV0dGVyCi8vIG5hbWUgLS0gc29tZXRoaW5nIGxpa2UgRWxlbWVudFNldCBzZWVtcyBhIGJpdCB0b28gZ2VuZXJpYy4KY2xhc3MgRnVuY3Rpb25TZXQgewogIGZpbmFsIE1hcDxTdHJpbmcsIEZ1bmN0aW9uU2V0Tm9kZT4gX25vZGVzOwoKICBmYWN0b3J5IEZ1bmN0aW9uU2V0KEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gbGl2ZUluc3RhbmNlTWVtYmVycykgewogICAgTWFwPFN0cmluZywgRnVuY3Rpb25TZXROb2RlPiBub2RlcyA9IG5ldyBNYXA8U3RyaW5nLCBGdW5jdGlvblNldE5vZGU+KCk7CiAgICBmb3IgKE1lbWJlckVudGl0eSBtZW1iZXIgaW4gbGl2ZUluc3RhbmNlTWVtYmVycykgewogICAgICBTdHJpbmcgbmFtZSA9IG1lbWJlci5uYW1lOwogICAgICAobm9kZXNbbmFtZV0gPz89IG5ldyBGdW5jdGlvblNldE5vZGUobmFtZSkpLmFkZChtZW1iZXIpOwogICAgfQogICAgcmV0dXJuIG5ldyBGdW5jdGlvblNldC5pbnRlcm5hbChub2Rlcyk7CiAgfQoKICBGdW5jdGlvblNldC5pbnRlcm5hbCh0aGlzLl9ub2Rlcyk7CgogIGJvb2wgY29udGFpbnMoTWVtYmVyRW50aXR5IGVsZW1lbnQpIHsKICAgIGFzc2VydChlbGVtZW50LmlzSW5zdGFuY2VNZW1iZXIpOwogICAgYXNzZXJ0KCFlbGVtZW50LmlzQWJzdHJhY3QpOwogICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50Lm5hbWU7CiAgICBGdW5jdGlvblNldE5vZGUgbm9kZSA9IF9ub2Rlc1tuYW1lXTsKICAgIHJldHVybiAobm9kZSAhPSBudWxsKSA/IG5vZGUuY29udGFpbnMoZWxlbWVudCkgOiBmYWxzZTsKICB9CgogIC8vLyBSZXR1cm5zIGFsbCB0aGUgZnVuY3Rpb25zIHRoYXQgbWF5IGJlIGludm9rZWQgd2l0aCB0aGUgW3NlbGVjdG9yXSBvbiBhCiAgLy8vIHJlY2VpdmVyIHdpdGggdGhlIGdpdmVuIFtjb25zdHJhaW50XS4gVGhlIHJldHVybmVkIGVsZW1lbnRzIG1heSBpbmNsdWRlCiAgLy8vIG5vU3VjaE1ldGhvZCBoYW5kbGVycyB0aGF0IGFyZSBwb3RlbnRpYWwgdGFyZ2V0cyBpbmRpcmVjdGx5IHRocm91Z2ggdGhlCiAgLy8vIG5vU3VjaE1ldGhvZCBtZWNoYW5pc20uCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBmaWx0ZXIoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyLCBBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgewogICAgcmV0dXJuIHF1ZXJ5KHNlbGVjdG9yLCByZWNlaXZlciwgZG9tYWluKS5mdW5jdGlvbnM7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbWFzayBmb3IgdGhlIHBvdGVudGlhbCByZWNlaXZlcnMgb2YgYSBkeW5hbWljIGNhbGwgdG8KICAvLy8gW3NlbGVjdG9yXSBvbiBbY29uc3RyYWludF0uCiAgLy8vCiAgLy8vIFRoaXMgd2lsbCBuYXJyb3cgdGhlIGNvbnN0cmFpbnRzIG9mIFtjb25zdHJhaW50XSB0byBhIFtUeXBlTWFza10gb2YgdGhlCiAgLy8vIHNldCBvZiBjbGFzc2VzIHRoYXQgYWN0dWFsbHkgaW1wbGVtZW50IHRoZSBzZWxlY3RlZCBtZW1iZXIgb3IgaW1wbGVtZW50CiAgLy8vIHRoZSBoYW5kbGluZyAnbm9TdWNoTWV0aG9kJyB3aGVyZSB0aGUgc2VsZWN0ZWQgbWVtYmVyIGlzIHVuaW1wbGVtZW50ZWQuCiAgQWJzdHJhY3RWYWx1ZSByZWNlaXZlclR5cGUoCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyLCBBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgewogICAgcmV0dXJuIHF1ZXJ5KHNlbGVjdG9yLCByZWNlaXZlciwgZG9tYWluKS5jb21wdXRlTWFzayhkb21haW4pOwogIH0KCiAgU2VsZWN0b3JNYXNrIF9jcmVhdGVTZWxlY3Rvck1hc2soCiAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLCBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyLCBBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgewogICAgcmV0dXJuIHJlY2VpdmVyICE9IG51bGwKICAgICAgICA/IG5ldyBTZWxlY3Rvck1hc2soc2VsZWN0b3IsIHJlY2VpdmVyKQogICAgICAgIDogbmV3IFNlbGVjdG9yTWFzayhzZWxlY3RvciwgZG9tYWluLmR5bmFtaWNUeXBlKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBzZXQgb2YgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHRoZSB0YXJnZXQgb2YgYSBjYWxsIHRvCiAgLy8vIFtzZWxlY3Rvcl0gb24gYSByZWNlaXZlciBjb25zdHJhaW5lZCBieSBbY29uc3RyYWludF0gaW5jbHVkaW5nCiAgLy8vICdub1N1Y2hNZXRob2QnIG1ldGhvZHMgd2hlcmUgYXBwbGljYWJsZS4KICBGdW5jdGlvblNldFF1ZXJ5IHF1ZXJ5KAogICAgICBTZWxlY3RvciBzZWxlY3RvciwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlciwgQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pIHsKICAgIFN0cmluZyBuYW1lID0gc2VsZWN0b3IubmFtZTsKICAgIFNlbGVjdG9yTWFzayBzZWxlY3Rvck1hc2sgPSBfY3JlYXRlU2VsZWN0b3JNYXNrKHNlbGVjdG9yLCByZWNlaXZlciwgZG9tYWluKTsKICAgIFNlbGVjdG9yTWFzayBub1N1Y2hNZXRob2RNYXNrID0KICAgICAgICBuZXcgU2VsZWN0b3JNYXNrKFNlbGVjdG9ycy5ub1N1Y2hNZXRob2RfLCBzZWxlY3Rvck1hc2sucmVjZWl2ZXIpOwogICAgRnVuY3Rpb25TZXROb2RlIG5vZGUgPSBfbm9kZXNbbmFtZV07CiAgICBGdW5jdGlvblNldE5vZGUgbm9TdWNoTWV0aG9kcyA9IF9ub2Rlc1tJZGVudGlmaWVycy5ub1N1Y2hNZXRob2RfXTsKICAgIGlmIChub2RlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIG5vZGUucXVlcnkoc2VsZWN0b3JNYXNrLCBkb21haW4sIG5vU3VjaE1ldGhvZHMsIG5vU3VjaE1ldGhvZE1hc2spOwogICAgfQogICAgLy8gSWYgdGhlcmUgaXMgbm8gbWV0aG9kIHRoYXQgbWF0Y2hlcyBbc2VsZWN0b3JdIHdlIGtub3cgd2UgY2FuCiAgICAvLyBvbmx5IGhpdCBbOm5vU3VjaE1ldGhvZDpdLgogICAgaWYgKG5vU3VjaE1ldGhvZHMgPT0gbnVsbCkgewogICAgICByZXR1cm4gY29uc3QgRW1wdHlGdW5jdGlvblNldFF1ZXJ5KCk7CiAgICB9CiAgICByZXR1cm4gbm9TdWNoTWV0aG9kcy5xdWVyeShub1N1Y2hNZXRob2RNYXNrLCBkb21haW4pOwogIH0KCiAgdm9pZCBmb3JFYWNoKHZvaWQgYWN0aW9uKE1lbWJlckVudGl0eSBtZW1iZXIpKSB7CiAgICBfbm9kZXMuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIEZ1bmN0aW9uU2V0Tm9kZSBub2RlKSB7CiAgICAgIG5vZGUuZm9yRWFjaChhY3Rpb24pOwogICAgfSk7CiAgfQp9CgovLy8gQSBzZWxlY3Rvci9jb25zdHJhaW50IHBhaXIgcmVwcmVzZW50aW5nIHRoZSBkeW5hbWljIGludm9jYXRpb24gb2YgW3NlbGVjdG9yXQovLy8gb24gYSByZWNlaXZlciBjb25zdHJhaW5lZCBieSBbY29uc3RyYWludF0uCmNsYXNzIFNlbGVjdG9yTWFzayB7CiAgZmluYWwgU2VsZWN0b3Igc2VsZWN0b3I7CiAgZmluYWwgQWJzdHJhY3RWYWx1ZSByZWNlaXZlcjsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGU7CgogIFNlbGVjdG9yTWFzayh0aGlzLnNlbGVjdG9yLCB0aGlzLnJlY2VpdmVyKQogICAgICA6IHRoaXMuaGFzaENvZGUgPQogICAgICAgICAgICBIYXNoaW5nLm1peEhhc2hDb2RlQml0cyhzZWxlY3Rvci5oYXNoQ29kZSwgcmVjZWl2ZXIuaGFzaENvZGUpIHsKICAgIGFzc2VydChyZWNlaXZlciAhPSBudWxsKTsKICB9CgogIFN0cmluZyBnZXQgbmFtZSA9PiBzZWxlY3Rvci5uYW1lOwoKICBib29sIGFwcGxpZXMoTWVtYmVyRW50aXR5IGVsZW1lbnQsIEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluKSB7CiAgICBpZiAoIXNlbGVjdG9yLmFwcGxpZXNVbm5hbWVkKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gZG9tYWluCiAgICAgICAgLmlzVGFyZ2V0aW5nTWVtYmVyKHJlY2VpdmVyLCBlbGVtZW50LCBzZWxlY3Rvci5tZW1iZXJOYW1lKQogICAgICAgIC5pc1BvdGVudGlhbGx5VHJ1ZTsKICB9CgogIGJvb2wgbmVlZHNOb1N1Y2hNZXRob2RIYW5kbGluZyhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgewogICAgcmV0dXJuIGRvbWFpbgogICAgICAgIC5uZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKHJlY2VpdmVyLCBzZWxlY3RvcikKICAgICAgICAuaXNQb3RlbnRpYWxseVRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gc2VsZWN0b3IgPT0gb3RoZXIuc2VsZWN0b3IgJiYgcmVjZWl2ZXIgPT0gb3RoZXIucmVjZWl2ZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnKCRzZWxlY3RvciwkcmVjZWl2ZXIpJzsKfQoKLy8vIEEgbm9kZSBpbiB0aGUgW0Z1bmN0aW9uU2V0XSBjYWNoaW5nIGFsbCBbRnVuY3Rpb25TZXRRdWVyeV0gb2JqZWN0IGZvcgovLy8gc2VsZWN0b3JzIHdpdGggdGhlIHNhbWUgW25hbWVdLgpjbGFzcyBGdW5jdGlvblNldE5vZGUgewogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIE1hcDxTZWxlY3Rvck1hc2ssIEZ1bmN0aW9uU2V0UXVlcnk+IGNhY2hlID0KICAgICAgPFNlbGVjdG9yTWFzaywgRnVuY3Rpb25TZXRRdWVyeT57fTsKCiAgLy8gSW5pdGlhbGx5LCB3ZSBrZWVwIHRoZSBlbGVtZW50cyBpbiBhIGxpc3QgYmVjYXVzZSBpdCBpcyBtb3JlCiAgLy8gY29tcGFjdCB0aGFuIGEgaGFzaCBzZXQuIE9uY2Ugd2UgZ2V0IGVub3VnaCBlbGVtZW50cywgd2UgY2hhbmdlCiAgLy8gdGhlIHJlcHJlc2VudGF0aW9uIHRvIGJlIGEgc2V0IHRvIGdldCBmYXN0ZXIgY29udGFpbnMgY2hlY2tzLgogIHN0YXRpYyBjb25zdCBpbnQgTUFYX0VMRU1FTlRTX0lOX0xJU1QgPSA4OwogIEl0ZXJhYmxlPE1lbWJlckVudGl0eT4gZWxlbWVudHMgPSA8TWVtYmVyRW50aXR5PltdOwogIGJvb2wgaXNMaXN0ID0gdHJ1ZTsKCiAgRnVuY3Rpb25TZXROb2RlKHRoaXMubmFtZSk7CgogIHZvaWQgYWRkKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoZWxlbWVudC5uYW1lID09IG5hbWUpOwogICAgLy8gV2UgdHJ5IHRvIGF2b2lkIGNsZWFyaW5nIHRoZSBjYWNoZSB1bmxlc3Mgd2UgaGF2ZSB0by4gRm9yIHRoYXQKICAgIC8vIHJlYXNvbiB3ZSBrZWVwIHRoZSBleHBsaWNpdCBjb250YWlucyBjaGVjayBldmVuIHRob3VnaCB0aGUgYWRkCiAgICAvLyBtZXRob2QgZW5kcyB1cCBkb2luZyB0aGUgd29yayBhZ2FpbiAoZm9yIHNldHMpLgogICAgaWYgKCFlbGVtZW50cy5jb250YWlucyhlbGVtZW50KSkgewogICAgICBpZiAoaXNMaXN0ICYmIGVsZW1lbnRzLmxlbmd0aCA+PSBNQVhfRUxFTUVOVFNfSU5fTElTVCkgewogICAgICAgIGVsZW1lbnRzID0gZWxlbWVudHMudG9TZXQoKTsKICAgICAgICBpc0xpc3QgPSBmYWxzZTsKICAgICAgfQogICAgICBpZiAoaXNMaXN0KSB7CiAgICAgICAgTGlzdDxNZW1iZXJFbnRpdHk+IGxpc3QgPSBlbGVtZW50czsKICAgICAgICBsaXN0LmFkZChlbGVtZW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBTZXQ8TWVtYmVyRW50aXR5PiBzZXQgPSBlbGVtZW50czsKICAgICAgICBzZXQuYWRkKGVsZW1lbnQpOwogICAgICB9CiAgICAgIGlmICghY2FjaGUuaXNFbXB0eSkgY2FjaGUuY2xlYXIoKTsKICAgIH0KICB9CgogIHZvaWQgcmVtb3ZlKE1lbWJlckVudGl0eSBlbGVtZW50KSB7CiAgICBhc3NlcnQoZWxlbWVudC5uYW1lID09IG5hbWUpOwogICAgaWYgKGlzTGlzdCkgewogICAgICBMaXN0PE1lbWJlckVudGl0eT4gbGlzdCA9IGVsZW1lbnRzOwogICAgICBpbnQgaW5kZXggPSBsaXN0LmluZGV4T2YoZWxlbWVudCk7CiAgICAgIGlmIChpbmRleCA8IDApIHJldHVybjsKICAgICAgTWVtYmVyRW50aXR5IGxhc3QgPSBsaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgaWYgKGluZGV4ICE9IGxpc3QubGVuZ3RoKSB7CiAgICAgICAgbGlzdFtpbmRleF0gPSBsYXN0OwogICAgICB9CiAgICAgIGlmICghY2FjaGUuaXNFbXB0eSkgY2FjaGUuY2xlYXIoKTsKICAgIH0gZWxzZSB7CiAgICAgIFNldDxNZW1iZXJFbnRpdHk+IHNldCA9IGVsZW1lbnRzOwogICAgICBpZiAoc2V0LnJlbW92ZShlbGVtZW50KSkgewogICAgICAgIC8vIFRvIGF2b2lkIHdvYmJsaW5nIGJldHdlZW4gdGhlIHR3byByZXByZXNlbnRhdGlvbnMsIHdlIGRvCiAgICAgICAgLy8gbm90IHRyYW5zaXRpb24gYmFjayB0byB0aGUgbGlzdCByZXByZXNlbnRhdGlvbiBldmVuIGlmIHdlCiAgICAgICAgLy8gZW5kIHVwIHdpdGggZmV3IGVub3VnaCBlbGVtZW50cyBhdCB0aGlzIHBvaW50LgogICAgICAgIGlmICghY2FjaGUuaXNFbXB0eSkgY2FjaGUuY2xlYXIoKTsKICAgICAgfQogICAgfQogIH0KCiAgYm9vbCBjb250YWlucyhNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgYXNzZXJ0KGVsZW1lbnQubmFtZSA9PSBuYW1lKTsKICAgIHJldHVybiBlbGVtZW50cy5jb250YWlucyhlbGVtZW50KTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGFjdGlvbihNZW1iZXJFbnRpdHkgbWVtYmVyKSkgewogICAgZWxlbWVudHMuZm9yRWFjaChhY3Rpb24pOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHNldCBvZiBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdGhlIHRhcmdldCBvZiBbc2VsZWN0b3JNYXNrXQogIC8vLyBpbmNsdWRpbmcgbm8gc3VjaCBtZXRob2QgaGFuZGxpbmcgd2hlcmUgYXBwbGljYWJsZS4KICBGdW5jdGlvblNldFF1ZXJ5IHF1ZXJ5KFNlbGVjdG9yTWFzayBzZWxlY3Rvck1hc2ssIEFic3RyYWN0VmFsdWVEb21haW4gZG9tYWluLAogICAgICBbRnVuY3Rpb25TZXROb2RlIG5vU3VjaE1ldGhvZHMsIFNlbGVjdG9yTWFzayBub1N1Y2hNZXRob2RNYXNrXSkgewogICAgYXNzZXJ0KHNlbGVjdG9yTWFzay5uYW1lID09IG5hbWUpOwogICAgRnVuY3Rpb25TZXRRdWVyeSByZXN1bHQgPSBjYWNoZVtzZWxlY3Rvck1hc2tdOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSByZXR1cm4gcmVzdWx0OwoKICAgIFNldGxldDxNZW1iZXJFbnRpdHk+IGZ1bmN0aW9uczsKICAgIGZvciAoTWVtYmVyRW50aXR5IGVsZW1lbnQgaW4gZWxlbWVudHMpIHsKICAgICAgaWYgKHNlbGVjdG9yTWFzay5hcHBsaWVzKGVsZW1lbnQsIGRvbWFpbikpIHsKICAgICAgICBpZiAoZnVuY3Rpb25zID09IG51bGwpIHsKICAgICAgICAgIC8vIERlZmVyIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBmdW5jdGlvbnMgc2V0IHVudGlsIHdlIGFyZQogICAgICAgICAgLy8gc3VyZSB3ZSBuZWVkIGl0LiBUaGlzIGFsbG93cyB1cyB0byByZXR1cm4gaW1tdXRhYmxlIGVtcHR5CiAgICAgICAgICAvLyBsaXN0cyB3aGVuIHRoZSBmaWx0ZXJpbmcgcHJvZHVjZWQgbm8gcmVzdWx0cy4KICAgICAgICAgIGZ1bmN0aW9ucyA9IG5ldyBTZXRsZXQ8TWVtYmVyRW50aXR5PigpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbnMuYWRkKGVsZW1lbnQpOwogICAgICB9CiAgICB9CgogICAgLy8gSWYgd2UgY2Fubm90IGVuc3VyZSBhIG1ldGhvZCB3aWxsIGJlIGZvdW5kIGF0IHJ1bnRpbWUsIHdlIGFsc28KICAgIC8vIGFkZCBbbm9TdWNoTWV0aG9kXSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBhcHBseSB0byBbbWFza10gYXMKICAgIC8vIHBvdGVudGlhbCB0YXJnZXRzLgogICAgaWYgKG5vU3VjaE1ldGhvZHMgIT0gbnVsbCAmJgogICAgICAgIHNlbGVjdG9yTWFzay5uZWVkc05vU3VjaE1ldGhvZEhhbmRsaW5nKGRvbWFpbikpIHsKICAgICAgRnVuY3Rpb25TZXRRdWVyeSBub1N1Y2hNZXRob2RRdWVyeSA9CiAgICAgICAgICBub1N1Y2hNZXRob2RzLnF1ZXJ5KG5vU3VjaE1ldGhvZE1hc2ssIGRvbWFpbik7CiAgICAgIGlmICghbm9TdWNoTWV0aG9kUXVlcnkuZnVuY3Rpb25zLmlzRW1wdHkpIHsKICAgICAgICBpZiAoZnVuY3Rpb25zID09IG51bGwpIHsKICAgICAgICAgIGZ1bmN0aW9ucyA9CiAgICAgICAgICAgICAgbmV3IFNldGxldDxNZW1iZXJFbnRpdHk+LmZyb20obm9TdWNoTWV0aG9kUXVlcnkuZnVuY3Rpb25zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZnVuY3Rpb25zLmFkZEFsbChub1N1Y2hNZXRob2RRdWVyeS5mdW5jdGlvbnMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY2FjaGVbc2VsZWN0b3JNYXNrXSA9IHJlc3VsdCA9IChmdW5jdGlvbnMgIT0gbnVsbCkKICAgICAgICA/IG5ldyBGdWxsRnVuY3Rpb25TZXRRdWVyeShmdW5jdGlvbnMpCiAgICAgICAgOiBjb25zdCBFbXB0eUZ1bmN0aW9uU2V0UXVlcnkoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnRnVuY3Rpb25TZXROb2RlKCcpOwogICAgU3RyaW5nIGNvbW1hID0gJyc7CiAgICBjYWNoZS5mb3JFYWNoKChtYXNrLCBxdWVyeSkgewogICAgICBzYi53cml0ZShjb21tYSk7CiAgICAgIHNiLndyaXRlKCckbWFzaz0kcXVlcnknKTsKICAgICAgY29tbWEgPSAnLCc7CiAgICB9KTsKICAgIHNiLndyaXRlKCcpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBBIHNldCBvZiBmdW5jdGlvbnMgdGhhdCBhcmUgdGhlIHBvdGVudGlhbCB0YXJnZXRzIG9mIGFsbCBjYWxsIHNpdGVzIHNoYXJpbmcKLy8vIHRoZSBzYW1lIHJlY2VpdmVyIG1hc2sgYW5kIHNlbGVjdG9yLgphYnN0cmFjdCBjbGFzcyBGdW5jdGlvblNldFF1ZXJ5IHsKICBjb25zdCBGdW5jdGlvblNldFF1ZXJ5KCk7CgogIC8vLyBDb21wdXRlIHRoZSB0eXBlIG9mIGFsbCBwb3RlbnRpYWwgcmVjZWl2ZXJzIG9mIHRoaXMgZnVuY3Rpb24gc2V0LgogIEFic3RyYWN0VmFsdWUgY29tcHV0ZU1hc2soQWJzdHJhY3RWYWx1ZURvbWFpbiBkb21haW4pOwoKICAvLy8gUmV0dXJucyBhbGwgcG90ZW50aWFsIHRhcmdldHMgb2YgdGhpcyBmdW5jdGlvbiBzZXQuCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXQgZnVuY3Rpb25zOwp9CgpjbGFzcyBFbXB0eUZ1bmN0aW9uU2V0UXVlcnkgaW1wbGVtZW50cyBGdW5jdGlvblNldFF1ZXJ5IHsKICBjb25zdCBFbXB0eUZ1bmN0aW9uU2V0UXVlcnkoKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlTWFzayhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgPT4gZG9tYWluLmVtcHR5VHlwZTsKCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiBnZXQgZnVuY3Rpb25zID0+IGNvbnN0IDxNZW1iZXJFbnRpdHk+W107CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICc8ZW1wdHk+JzsKfQoKY2xhc3MgRnVsbEZ1bmN0aW9uU2V0UXVlcnkgaW1wbGVtZW50cyBGdW5jdGlvblNldFF1ZXJ5IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBJdGVyYWJsZTxNZW1iZXJFbnRpdHk+IGZ1bmN0aW9uczsKCiAgQWJzdHJhY3RWYWx1ZSBfcmVjZWl2ZXI7CgogIEZ1bGxGdW5jdGlvblNldFF1ZXJ5KHRoaXMuZnVuY3Rpb25zKTsKCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSBjb21wdXRlTWFzayhBYnN0cmFjdFZhbHVlRG9tYWluIGRvbWFpbikgewogICAgcmV0dXJuIF9yZWNlaXZlciA/Pz0gZG9tYWluLmNvbXB1dGVSZWNlaXZlcihmdW5jdGlvbnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRfcmVjZWl2ZXI6JGZ1bmN0aW9ucyc7Cn0KgS0ATk48AR8BOyQxMSYBREQ+FC0BRE03IT8GLAQBJQEoJiEgKTwEAU1OTh4hTzgEAUgiBk5OTh5PQgQBJE8cLzoEAUdFLxpPIVEkSilHGFAGRCIhLAY6BAEzORwIBAIBUS8VGyAMFgEtGEweBAEkAUM5EkMcBAE/EjccBAEMHC1FBAEMMAIBSiQYFTQqAUJFQy02FgEeASMiRkY3Jz8lGAgULBsPKhoIKQYEASYiEiopHS0iHAgpDSghREU6KwgGBAEoIicEATMeBAFMOlBIJzMnASQtMyFERzsyCiAIBgFGQhohOis5MiEWShE5CggGNy4pEwQBDBYqIhciFyATCBMaBAIBUCkiHAFIOQE6KAIBOiEBDE0BDEIBDCICATkMKgEbASgBDDo8BAEMMAIBL3BhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL2Z1bmN0aW9uX3NldC5kYXJ0RHNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy9hcGlfcHJvdG90eXBlL2NvbnN0YW50X2V2YWx1YXRvci5kYXJ0gf4vLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmcm9udF9lbmQuY29uc3RhbnRfZXZhbHVhdG9yOwoKZXhwb3J0ICcuLi9mYXN0YS9rZXJuZWwvY29uc3RhbnRfZXZhbHVhdG9yLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ29uc3RhbnRFdmFsdWF0b3IsCiAgICAgICAgQ29uc3RhbnRzVHJhbnNmb3JtZXIsCiAgICAgICAgRXJyb3JSZXBvcnRlciwKICAgICAgICBFdmFsdWF0aW9uRW52aXJvbm1lbnQsCiAgICAgICAgU2ltcGxlRXJyb3JSZXBvcnRlciwKICAgICAgICB0cmFuc2Zvcm1Db21wb25lbnQsCiAgICAgICAgdHJhbnNmb3JtTGlicmFyaWVzOwoRAE5OPAEmATEJGx4XHx0cHAE7cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvY29uc3RhbnRfZXZhbHVhdG9yLmRhcnQ3c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMva2VybmVsL2tlcm5lbF9pbXBhY3QuZGFydMAAgagvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMgaXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBhcyBpcjsKCmltcG9ydCAnLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb24vcmVzb2x1dGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL2V4cHJlc3Npb25zLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaXIvY29uc3RhbnRzLmRhcnQnOwppbXBvcnQgJy4uL2lyL2ltcGFjdC5kYXJ0JzsKaW1wb3J0ICcuLi9pci9pbXBhY3RfZGF0YS5kYXJ0JzsKaW1wb3J0ICcuLi9pci9ydW50aW1lX3R5cGVfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnLi4vaXIvc2NvcGUuZGFydCc7CmltcG9ydCAnLi4vaXIvc3RhdGljX3R5cGUuZGFydCc7CmltcG9ydCAnLi4vaXIvdXRpbC5kYXJ0JzsKaW1wb3J0ICcuLi9pci92aXNpdG9ycy5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2Fubm90YXRpb25zLmRhcnQnOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vbmF0aXZlL2JlaGF2aW9yLmRhcnQnOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4vcmVzb2x1dGlvbi9yZWdpc3RyeS5kYXJ0JyBzaG93IFJlc29sdXRpb25Xb3JsZEltcGFjdEJ1aWxkZXI7CmltcG9ydCAnLi4vdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2UvZmVhdHVyZS5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS91c2UuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvd29ybGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdlbGVtZW50X21hcC5kYXJ0JzsKCi8vLyBWaXNpdG9yIHRoYXQgY29tcHV0ZXMgdGhlIHdvcmxkIGltcGFjdCBvZiBhIG1lbWJlci4KY2xhc3MgS2VybmVsSW1wYWN0QnVpbGRlciBleHRlbmRzIEltcGFjdEJ1aWxkZXJCYXNlCiAgICB3aXRoIEtlcm5lbEltcGFjdFJlZ2lzdHJ5TWl4aW4gewogIEBvdmVycmlkZQogIGZpbmFsIFJlc29sdXRpb25Xb3JsZEltcGFjdEJ1aWxkZXIgaW1wYWN0QnVpbGRlcjsKICBAb3ZlcnJpZGUKICBmaW5hbCBLZXJuZWxUb0VsZW1lbnRNYXAgZWxlbWVudE1hcDsKICBAb3ZlcnJpZGUKICBmaW5hbCBEaWFnbm9zdGljUmVwb3J0ZXIgcmVwb3J0ZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIEBvdmVycmlkZQogIGZpbmFsIE1lbWJlckVudGl0eSBjdXJyZW50TWVtYmVyOwogIGZpbmFsIFNldDxQcmFnbWFBbm5vdGF0aW9uPiBfYW5ub3RhdGlvbnM7CiAgQG92ZXJyaWRlCiAgZmluYWwgQ29uc3RhbnRWYWx1ZWZpZXIgX2NvbnN0YW50VmFsdWVmaWVyOwoKICBLZXJuZWxJbXBhY3RCdWlsZGVyKAogICAgICB0aGlzLmVsZW1lbnRNYXAsCiAgICAgIHRoaXMuY3VycmVudE1lbWJlciwKICAgICAgdGhpcy5yZXBvcnRlciwKICAgICAgdGhpcy5fb3B0aW9ucywKICAgICAgVmFyaWFibGVTY29wZU1vZGVsIHZhcmlhYmxlU2NvcGVNb2RlbCwKICAgICAgdGhpcy5fYW5ub3RhdGlvbnMsCiAgICAgIHRoaXMuX2NvbnN0YW50VmFsdWVmaWVyKQogICAgICA6IHRoaXMuaW1wYWN0QnVpbGRlciA9IG5ldyBSZXNvbHV0aW9uV29ybGRJbXBhY3RCdWlsZGVyKGN1cnJlbnRNZW1iZXIpLAogICAgICAgIHN1cGVyKGVsZW1lbnRNYXAudHlwZUVudmlyb25tZW50LCBlbGVtZW50TWFwLmNsYXNzSGllcmFyY2h5LAogICAgICAgICAgICB2YXJpYWJsZVNjb3BlTW9kZWwpOwoKICBAb3ZlcnJpZGUKICBDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHMgPT4gZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgQG92ZXJyaWRlCiAgTmF0aXZlQmFzaWNEYXRhIGdldCBfbmF0aXZlQmFzaWNEYXRhID0+IGVsZW1lbnRNYXAubmF0aXZlQmFzaWNEYXRhOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCB1c2VBc3NlcnRzID0+IF9vcHRpb25zLmVuYWJsZVVzZXJBc3NlcnRpb25zOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpbmZlckVmZmVjdGl2ZWx5RmluYWxWYXJpYWJsZVR5cGVzID0+CiAgICAgICFfYW5ub3RhdGlvbnMuY29udGFpbnMoUHJhZ21hQW5ub3RhdGlvbi5kaXNhYmxlRmluYWwpOwp9CgovLy8gQ29udmVydHMgYSBbSW1wYWN0RGF0YV0gb2JqZWN0IGJhc2VkIG9uIGtlcm5lbCB0byB0aGUgY29ycmVzcG9uZGluZwovLy8gW1Jlc29sdXRpb25JbXBhY3RdIGJhc2VkIG9uIHRoZSBLIG1vZGVsLgpjbGFzcyBLZXJuZWxJbXBhY3RDb252ZXJ0ZXIgZXh0ZW5kcyBLZXJuZWxJbXBhY3RSZWdpc3RyeU1peGluIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBSZXNvbHV0aW9uV29ybGRJbXBhY3RCdWlsZGVyIGltcGFjdEJ1aWxkZXI7CiAgQG92ZXJyaWRlCiAgZmluYWwgS2VybmVsVG9FbGVtZW50TWFwIGVsZW1lbnRNYXA7CiAgQG92ZXJyaWRlCiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIHJlcG9ydGVyOwogIEBvdmVycmlkZQogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBfb3B0aW9uczsKICBAb3ZlcnJpZGUKICBmaW5hbCBNZW1iZXJFbnRpdHkgY3VycmVudE1lbWJlcjsKICBAb3ZlcnJpZGUKICBmaW5hbCBDb25zdGFudFZhbHVlZmllciBfY29uc3RhbnRWYWx1ZWZpZXI7CgogIEtlcm5lbEltcGFjdENvbnZlcnRlcih0aGlzLmVsZW1lbnRNYXAsIHRoaXMuY3VycmVudE1lbWJlciwgdGhpcy5yZXBvcnRlciwKICAgICAgdGhpcy5fb3B0aW9ucywgdGhpcy5fY29uc3RhbnRWYWx1ZWZpZXIpCiAgICAgIDogdGhpcy5pbXBhY3RCdWlsZGVyID0gbmV3IFJlc29sdXRpb25Xb3JsZEltcGFjdEJ1aWxkZXIoY3VycmVudE1lbWJlcik7CgogIEBvdmVycmlkZQogIGlyLlR5cGVFbnZpcm9ubWVudCBnZXQgdHlwZUVudmlyb25tZW50ID0+IGVsZW1lbnRNYXAudHlwZUVudmlyb25tZW50OwoKICBAb3ZlcnJpZGUKICBDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHMgPT4gZWxlbWVudE1hcC5jb21tb25FbGVtZW50czsKCiAgQG92ZXJyaWRlCiAgTmF0aXZlQmFzaWNEYXRhIGdldCBfbmF0aXZlQmFzaWNEYXRhID0+IGVsZW1lbnRNYXAubmF0aXZlQmFzaWNEYXRhOwoKICAvLy8gQ29udmVydHMgYSBbSW1wYWN0RGF0YV0gb2JqZWN0IGJhc2VkIG9uIGtlcm5lbCB0byB0aGUgY29ycmVzcG9uZGluZwogIC8vLyBbUmVzb2x1dGlvbkltcGFjdF0gYmFzZWQgb24gdGhlIEsgbW9kZWwuCiAgUmVzb2x1dGlvbkltcGFjdCBjb252ZXJ0KEltcGFjdERhdGEgaW1wYWN0RGF0YSkgewogICAgaW1wYWN0RGF0YS5hcHBseSh0aGlzKTsKICAgIHJldHVybiBpbXBhY3RCdWlsZGVyOwogIH0KfQoKLy8vIFtJbXBhY3RSZWdpc3RyeV0gdGhhdCBjb252ZXJ0cyBrZXJuZWwgYmFzZWQgaW1wYWN0IGRhdGEgdG8gd29ybGQgaW1wYWN0Ci8vLyBvYmplY3QgYmFzZWQgb24gdGhlIEsgbW9kZWwuCmFic3RyYWN0IGNsYXNzIEtlcm5lbEltcGFjdFJlZ2lzdHJ5TWl4aW4gaW1wbGVtZW50cyBJbXBhY3RSZWdpc3RyeSB7CiAgQ29tcGlsZXJPcHRpb25zIGdldCBfb3B0aW9uczsKICBEaWFnbm9zdGljUmVwb3J0ZXIgZ2V0IHJlcG9ydGVyOwogIEtlcm5lbFRvRWxlbWVudE1hcCBnZXQgZWxlbWVudE1hcDsKICBNZW1iZXJFbnRpdHkgZ2V0IGN1cnJlbnRNZW1iZXI7CiAgUmVzb2x1dGlvbldvcmxkSW1wYWN0QnVpbGRlciBnZXQgaW1wYWN0QnVpbGRlcjsKICBpci5UeXBlRW52aXJvbm1lbnQgZ2V0IHR5cGVFbnZpcm9ubWVudDsKICBDb21tb25FbGVtZW50cyBnZXQgY29tbW9uRWxlbWVudHM7CiAgTmF0aXZlQmFzaWNEYXRhIGdldCBfbmF0aXZlQmFzaWNEYXRhOwogIENvbnN0YW50VmFsdWVmaWVyIGdldCBfY29uc3RhbnRWYWx1ZWZpZXI7CgogIE9iamVjdCBfY29tcHV0ZVJlY2VpdmVyQ29uc3RyYWludCgKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uKSB7CiAgICBpZiAocmVjZWl2ZXJUeXBlIGlzIGlyLkludGVyZmFjZVR5cGUpIHsKICAgICAgaWYgKHJlY2VpdmVyVHlwZS5jbGFzc05vZGUgPT0gdHlwZUVudmlyb25tZW50LmZ1dHVyZU9yQ2xhc3MpIHsKICAgICAgICAvLyBDRkUgZW5jb2RlcyBGdXR1cmVPciBhcyBhbiBpbnRlcmZhY2UgdHlwZSEKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFN0cm9uZ01vZGVDb25zdHJhaW50KGNvbW1vbkVsZW1lbnRzLCBfbmF0aXZlQmFzaWNEYXRhLAogICAgICAgICAgZWxlbWVudE1hcC5nZXRDbGFzcyhyZWNlaXZlclR5cGUuY2xhc3NOb2RlKSwgcmVsYXRpb24pOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUGFyYW1ldGVyQ2hlY2soaXIuRGFydFR5cGUgaXJUeXBlKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShpclR5cGUpOwogICAgaWYgKCF0eXBlLmlzRHluYW1pYykgewogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyVHlwZVVzZShuZXcgVHlwZVVzZS5wYXJhbWV0ZXJDaGVjayh0eXBlKSk7CiAgICB9CiAgfQoKICBMaXN0PERhcnRUeXBlPiBfZ2V0VHlwZUFyZ3VtZW50cyhMaXN0PGlyLkRhcnRUeXBlPiB0eXBlcykgewogICAgaWYgKHR5cGVzLmlzRW1wdHkpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHR5cGVzLm1hcChlbGVtZW50TWFwLmdldERhcnRUeXBlKS50b0xpc3QoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJMYXp5RmllbGQoKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRmVhdHVyZShGZWF0dXJlLkxBWllfRklFTEQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckZpZWxkTm9kZShpci5GaWVsZCBmaWVsZCkgewogICAgaWYgKGZpZWxkLmlzSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICBfbmF0aXZlQmFzaWNEYXRhCiAgICAgICAgICAgIC5pc05hdGl2ZUNsYXNzKGVsZW1lbnRNYXAuZ2V0Q2xhc3MoZmllbGQuZW5jbG9zaW5nQ2xhc3MpKSkgewogICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gZWxlbWVudE1hcC5nZXRNZW1iZXIoZmllbGQpOwogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBOYXRpdmVEYXRhQnVpbGRlciBhbHJlYWR5IGhhcyB0aGUgbmF0aXZlIGJlaGF2aW9yCiAgICAgIC8vIGF0IHRoaXMgcG9pbnQuIFVzZSB0aGF0IGluc3RlYWQuCiAgICAgIGJvb2wgaXNKc0ludGVyb3AgPSBfbmF0aXZlQmFzaWNEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKG1lbWJlcik7CiAgICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gbWV0YWRhdGEgPQogICAgICAgICAgZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0TWVtYmVyTWV0YWRhdGEobWVtYmVyKTsKICAgICAgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMgPQogICAgICAgICAgZ2V0Q3JlYXRlc0Fubm90YXRpb25zKHJlcG9ydGVyLCBjb21tb25FbGVtZW50cywgbWV0YWRhdGEpOwogICAgICBJdGVyYWJsZTxTdHJpbmc+IHJldHVybnNBbm5vdGF0aW9ucyA9CiAgICAgICAgICBnZXRSZXR1cm5zQW5ub3RhdGlvbnMocmVwb3J0ZXIsIGNvbW1vbkVsZW1lbnRzLCBtZXRhZGF0YSk7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJOYXRpdmVEYXRhKGVsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JGaWVsZExvYWQoCiAgICAgICAgICBmaWVsZCwgY3JlYXRlc0Fubm90YXRpb25zLCByZXR1cm5zQW5ub3RhdGlvbnMsCiAgICAgICAgICBpc0pzSW50ZXJvcDogaXNKc0ludGVyb3ApKTsKICAgICAgaW1wYWN0QnVpbGRlcgogICAgICAgICAgLnJlZ2lzdGVyTmF0aXZlRGF0YShlbGVtZW50TWFwLmdldE5hdGl2ZUJlaGF2aW9yRm9yRmllbGRTdG9yZShmaWVsZCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckNvbnN0cnVjdG9yTm9kZShpci5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgewogICAgTWVtYmVyRW50aXR5IG1lbWJlciA9IGVsZW1lbnRNYXAuZ2V0TWVtYmVyKGNvbnN0cnVjdG9yKTsKICAgIGlmIChjb25zdHJ1Y3Rvci5pc0V4dGVybmFsICYmICFjb21tb25FbGVtZW50cy5pc0ZvcmVpZ25IZWxwZXIobWVtYmVyKSkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBOYXRpdmVEYXRhQnVpbGRlciBhbHJlYWR5IGhhcyB0aGUgbmF0aXZlIGJlaGF2aW9yCiAgICAgIC8vIGF0IHRoaXMgcG9pbnQuIFVzZSB0aGF0IGluc3RlYWQuCiAgICAgIGJvb2wgaXNKc0ludGVyb3AgPSBfbmF0aXZlQmFzaWNEYXRhLmlzSnNJbnRlcm9wTWVtYmVyKG1lbWJlcik7CiAgICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gbWV0YWRhdGEgPQogICAgICAgICAgZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQuZ2V0TWVtYmVyTWV0YWRhdGEobWVtYmVyKTsKICAgICAgSXRlcmFibGU8U3RyaW5nPiBjcmVhdGVzQW5ub3RhdGlvbnMgPQogICAgICAgICAgZ2V0Q3JlYXRlc0Fubm90YXRpb25zKHJlcG9ydGVyLCBjb21tb25FbGVtZW50cywgbWV0YWRhdGEpOwogICAgICBJdGVyYWJsZTxTdHJpbmc+IHJldHVybnNBbm5vdGF0aW9ucyA9CiAgICAgICAgICBnZXRSZXR1cm5zQW5ub3RhdGlvbnMocmVwb3J0ZXIsIGNvbW1vbkVsZW1lbnRzLCBtZXRhZGF0YSk7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJOYXRpdmVEYXRhKGVsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JNZXRob2QoCiAgICAgICAgICBjb25zdHJ1Y3RvciwgY3JlYXRlc0Fubm90YXRpb25zLCByZXR1cm5zQW5ub3RhdGlvbnMsCiAgICAgICAgICBpc0pzSW50ZXJvcDogaXNKc0ludGVyb3ApKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTeW5jU3Rhcihpci5EYXJ0VHlwZSBlbGVtZW50VHlwZSkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5TWU5DX1NUQVIpOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0ludm9rZSgKICAgICAgICBjb21tb25FbGVtZW50cy5zeW5jU3Rhckl0ZXJhYmxlRmFjdG9yeSwKICAgICAgICBjb25zdCBDYWxsU3RydWN0dXJlLnVubmFtZWQoMSwgMSksCiAgICAgICAgPERhcnRUeXBlPltlbGVtZW50TWFwLmdldERhcnRUeXBlKGVsZW1lbnRUeXBlKV0pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJBc3luYyhpci5EYXJ0VHlwZSBlbGVtZW50VHlwZSkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5BU1lOQyk7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKAogICAgICAgIGNvbW1vbkVsZW1lbnRzLmFzeW5jQXdhaXRDb21wbGV0ZXJGYWN0b3J5LAogICAgICAgIGNvbnN0IENhbGxTdHJ1Y3R1cmUudW5uYW1lZCgwLCAxKSwKICAgICAgICA8RGFydFR5cGU+W2VsZW1lbnRNYXAuZ2V0RGFydFR5cGUoZWxlbWVudFR5cGUpXSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckFzeW5jU3Rhcihpci5EYXJ0VHlwZSBlbGVtZW50VHlwZSkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5BU1lOQ19TVEFSKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoCiAgICAgICAgY29tbW9uRWxlbWVudHMuYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckZhY3RvcnksCiAgICAgICAgY29uc3QgQ2FsbFN0cnVjdHVyZS51bm5hbWVkKDEsIDEpLAogICAgICAgIDxEYXJ0VHlwZT5bZWxlbWVudE1hcC5nZXREYXJ0VHlwZShlbGVtZW50VHlwZSldKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUHJvY2VkdXJlTm9kZShpci5Qcm9jZWR1cmUgcHJvY2VkdXJlKSB7CiAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0gZWxlbWVudE1hcC5nZXRNZW1iZXIocHJvY2VkdXJlKTsKICAgIGlmIChwcm9jZWR1cmUuaXNFeHRlcm5hbCAmJiAhY29tbW9uRWxlbWVudHMuaXNGb3JlaWduSGVscGVyKG1lbWJlcikpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogTmF0aXZlRGF0YUJ1aWxkZXIgYWxyZWFkeSBoYXMgdGhlIG5hdGl2ZSBiZWhhdmlvcgogICAgICAvLyBhdCB0aGlzIHBvaW50LiBVc2UgdGhhdCBpbnN0ZWFkLgogICAgICBib29sIGlzSnNJbnRlcm9wID0gX25hdGl2ZUJhc2ljRGF0YS5pc0pzSW50ZXJvcE1lbWJlcihtZW1iZXIpOwogICAgICBMaXN0PENvbnN0YW50VmFsdWU+IG1ldGFkYXRhID0KICAgICAgICAgIGVsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldE1lbWJlck1ldGFkYXRhKG1lbWJlcik7CiAgICAgIEl0ZXJhYmxlPFN0cmluZz4gY3JlYXRlc0Fubm90YXRpb25zID0KICAgICAgICAgIGdldENyZWF0ZXNBbm5vdGF0aW9ucyhyZXBvcnRlciwgY29tbW9uRWxlbWVudHMsIG1ldGFkYXRhKTsKICAgICAgSXRlcmFibGU8U3RyaW5nPiByZXR1cm5zQW5ub3RhdGlvbnMgPQogICAgICAgICAgZ2V0UmV0dXJuc0Fubm90YXRpb25zKHJlcG9ydGVyLCBjb21tb25FbGVtZW50cywgbWV0YWRhdGEpOwogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyTmF0aXZlRGF0YShlbGVtZW50TWFwLmdldE5hdGl2ZUJlaGF2aW9yRm9yTWV0aG9kKAogICAgICAgICAgcHJvY2VkdXJlLCBjcmVhdGVzQW5ub3RhdGlvbnMsIHJldHVybnNBbm5vdGF0aW9ucywKICAgICAgICAgIGlzSnNJbnRlcm9wOiBpc0pzSW50ZXJvcCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckludExpdGVyYWwoaW50IHZhbHVlKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyQ29uc3RhbnRMaXRlcmFsKAogICAgICAgIG5ldyBJbnRDb25zdGFudEV4cHJlc3Npb24obmV3IEJpZ0ludC5mcm9tKHZhbHVlKS50b1Vuc2lnbmVkKDY0KSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckRvdWJsZUxpdGVyYWwoZG91YmxlIHZhbHVlKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyQ29uc3RhbnRMaXRlcmFsKG5ldyBEb3VibGVDb25zdGFudEV4cHJlc3Npb24odmFsdWUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJCb29sTGl0ZXJhbChib29sIHZhbHVlKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyQ29uc3RhbnRMaXRlcmFsKG5ldyBCb29sQ29uc3RhbnRFeHByZXNzaW9uKHZhbHVlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RyaW5nTGl0ZXJhbChTdHJpbmcgdmFsdWUpIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJDb25zdGFudExpdGVyYWwobmV3IFN0cmluZ0NvbnN0YW50RXhwcmVzc2lvbih2YWx1ZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN5bWJvbExpdGVyYWwoU3RyaW5nIHZhbHVlKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyQ29uc3RTeW1ib2xOYW1lKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJOdWxsTGl0ZXJhbCgpIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJDb25zdGFudExpdGVyYWwobmV3IE51bGxDb25zdGFudEV4cHJlc3Npb24oKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTGlzdExpdGVyYWwoaXIuRGFydFR5cGUgZWxlbWVudFR5cGUsCiAgICAgIHtib29sIGlzQ29uc3QsIGJvb2wgaXNFbXB0eX0pIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJMaXN0TGl0ZXJhbChuZXcgTGlzdExpdGVyYWxVc2UoCiAgICAgICAgY29tbW9uRWxlbWVudHMubGlzdFR5cGUoZWxlbWVudE1hcC5nZXREYXJ0VHlwZShlbGVtZW50VHlwZSkpLAogICAgICAgIGlzQ29uc3RhbnQ6IGlzQ29uc3QsCiAgICAgICAgaXNFbXB0eTogaXNFbXB0eSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclNldExpdGVyYWwoaXIuRGFydFR5cGUgZWxlbWVudFR5cGUsCiAgICAgIHtib29sIGlzQ29uc3QsIGJvb2wgaXNFbXB0eX0pIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTZXRMaXRlcmFsKG5ldyBTZXRMaXRlcmFsVXNlKAogICAgICAgIGNvbW1vbkVsZW1lbnRzLnNldFR5cGUoZWxlbWVudE1hcC5nZXREYXJ0VHlwZShlbGVtZW50VHlwZSkpLAogICAgICAgIGlzQ29uc3RhbnQ6IGlzQ29uc3QsCiAgICAgICAgaXNFbXB0eTogaXNFbXB0eSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck1hcExpdGVyYWwoaXIuRGFydFR5cGUga2V5VHlwZSwgaXIuRGFydFR5cGUgdmFsdWVUeXBlLAogICAgICB7Ym9vbCBpc0NvbnN0LCBib29sIGlzRW1wdHl9KSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyTWFwTGl0ZXJhbChuZXcgTWFwTGl0ZXJhbFVzZSgKICAgICAgICBjb21tb25FbGVtZW50cy5tYXBUeXBlKAogICAgICAgICAgICBlbGVtZW50TWFwLmdldERhcnRUeXBlKGtleVR5cGUpLCBlbGVtZW50TWFwLmdldERhcnRUeXBlKHZhbHVlVHlwZSkpLAogICAgICAgIGlzQ29uc3RhbnQ6IGlzQ29uc3QsCiAgICAgICAgaXNFbXB0eTogaXNFbXB0eSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlck5ldygKICAgICAgaXIuTWVtYmVyIHRhcmdldCwKICAgICAgaXIuSW50ZXJmYWNlVHlwZSB0eXBlLAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBpci5MaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQsCiAgICAgIHtib29sIGlzQ29uc3R9KSB7CiAgICBDb25zdHJ1Y3RvckVudGl0eSBjb25zdHJ1Y3RvciA9IGVsZW1lbnRNYXAuZ2V0Q29uc3RydWN0b3IodGFyZ2V0KTsKICAgIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IG5ldyBDYWxsU3RydWN0dXJlKAogICAgICAgIHBvc2l0aW9uYWxBcmd1bWVudHMgKyBuYW1lZEFyZ3VtZW50cy5sZW5ndGgsCiAgICAgICAgbmFtZWRBcmd1bWVudHMsCiAgICAgICAgdHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0ID0gZWxlbWVudE1hcC5nZXRJbXBvcnQoaW1wb3J0KTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UoaXNDb25zdAogICAgICAgID8gbmV3IFN0YXRpY1VzZS5jb25zdENvbnN0cnVjdG9ySW52b2tlKGNvbnN0cnVjdG9yLCBjYWxsU3RydWN0dXJlLAogICAgICAgICAgICBlbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpLCBkZWZlcnJlZEltcG9ydCkKICAgICAgICA6IG5ldyBTdGF0aWNVc2UudHlwZWRDb25zdHJ1Y3Rvckludm9rZShjb25zdHJ1Y3RvciwgY2FsbFN0cnVjdHVyZSwKICAgICAgICAgICAgZWxlbWVudE1hcC5nZXREYXJ0VHlwZSh0eXBlKSwgZGVmZXJyZWRJbXBvcnQpKTsKICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMuYW55KChpci5EYXJ0VHlwZSB0eXBlKSA9PiB0eXBlIGlzISBpci5EeW5hbWljVHlwZSkpIHsKICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5UWVBFX1ZBUklBQkxFX0JPVU5EU19DSEVDSyk7CiAgICB9CgogICAgaWYgKGNvbW1vbkVsZW1lbnRzLmlzU3ltYm9sQ29uc3RydWN0b3IoY29uc3RydWN0b3IpKSB7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJGZWF0dXJlKEZlYXR1cmUuU1lNQk9MX0NPTlNUUlVDVE9SKTsKICAgIH0KCiAgICBpZiAodGFyZ2V0LmlzRXh0ZXJuYWwgJiYKICAgICAgICBjb25zdHJ1Y3Rvci5pc0Zyb21FbnZpcm9ubWVudENvbnN0cnVjdG9yICYmCiAgICAgICAgIWlzQ29uc3QpIHsKICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5USFJPV19VTlNVUFBPUlRFRF9FUlJPUik7CiAgICAgIC8vIFdlIG5lZWQgdG8gcmVnaXN0ZXIgdGhlIGV4dGVybmFsIGNvbnN0cnVjdG9yIGFzIGxpdmUgYmVsb3csIHNvIGRvbid0CiAgICAgIC8vIHJldHVybiBoZXJlLgogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckNvbnN0SW5zdGFudGlhdGlvbihpci5DbGFzcyBjbHMsIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCkgewogICAgSW1wb3J0RW50aXR5IGRlZmVycmVkSW1wb3J0ID0gZWxlbWVudE1hcC5nZXRJbXBvcnQoaW1wb3J0KTsKICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IGVsZW1lbnRNYXAuY3JlYXRlSW50ZXJmYWNlVHlwZShjbHMsIHR5cGVBcmd1bWVudHMpOwogICAgaW1wYWN0QnVpbGRlcgogICAgICAgIC5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuY29uc3RJbnN0YW50aWF0aW9uKHR5cGUsIGRlZmVycmVkSW1wb3J0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQ29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb25Ob2RlKGlyLkNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICBhc3NlcnQobm9kZS5pc0NvbnN0KTsKICAgIENvbnN0cnVjdG9yRW50aXR5IGNvbnN0cnVjdG9yID0gZWxlbWVudE1hcC5nZXRDb25zdHJ1Y3Rvcihub2RlLnRhcmdldCk7CiAgICBpZiAoY29tbW9uRWxlbWVudHMuaXNTeW1ib2xDb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvcikpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9CiAgICAgICAgICBlbGVtZW50TWFwLmdldENvbnN0YW50VmFsdWUobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5maXJzdCk7CiAgICAgIGlmICghdmFsdWUuaXNTdHJpbmcpIHsKICAgICAgICAvLyBUT0RPKGhldCk6IEdldCB0aGUgYWN0dWFsIHNwYW4gZm9yIHRoZSBTeW1ib2wgY29uc3RydWN0b3IgYXJndW1lbnQKICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICAgICAgIENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsCiAgICAgICAgICAgIE1lc3NhZ2VLaW5kLlNUUklOR19FWFBFQ1RFRCwKICAgICAgICAgICAgeyd0eXBlJzogdmFsdWUuZ2V0VHlwZShlbGVtZW50TWFwLmNvbW1vbkVsZW1lbnRzKX0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBTdHJpbmdDb25zdGFudFZhbHVlIHN0cmluZ1ZhbHVlID0gdmFsdWU7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJDb25zdFN5bWJvbE5hbWUoc3RyaW5nVmFsdWUuc3RyaW5nVmFsdWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN1cGVySW5pdGlhbGl6ZXIoCiAgICAgIGlyLkNvbnN0cnVjdG9yIHNvdXJjZSwKICAgICAgaXIuQ29uc3RydWN0b3IgdGFyZ2V0LAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBNYXliZSByZXdyaXRlIGBub2RlLnRhcmdldGAgdG8gcG9pbnQgdG8gYQogICAgLy8gc3ludGhlc2l6ZWQgdW5uYW1lZCBtaXhpbiBjb25zdHJ1Y3RvciB3aGVuIG5lZWRlZC4gVGhpcyB3b3VsZCByZXF1aXJlIHVzCiAgICAvLyB0byBjb25zaWRlciBpbXBhY3QgYnVpbGRpbmcgYSByZXF1aXJlZCBwcmUtc3RlcCBmb3IgaW5mZXJlbmNlIGFuZAogICAgLy8gc3NhLWJ1aWxkaW5nLgogICAgQ29uc3RydWN0b3JFbnRpdHkgY29uc3RydWN0b3IgPQogICAgICAgIGVsZW1lbnRNYXAuZ2V0U3VwZXJDb25zdHJ1Y3Rvcihzb3VyY2UsIHRhcmdldCk7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3VwZXJDb25zdHJ1Y3Rvckludm9rZSgKICAgICAgICBjb25zdHJ1Y3RvciwKICAgICAgICBuZXcgQ2FsbFN0cnVjdHVyZShwb3NpdGlvbmFsQXJndW1lbnRzICsgbmFtZWRBcmd1bWVudHMubGVuZ3RoLAogICAgICAgICAgICBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cy5sZW5ndGgpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RhdGljSW52b2NhdGlvbigKICAgICAgaXIuUHJvY2VkdXJlIHByb2NlZHVyZSwKICAgICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywKICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0KSB7CiAgICBGdW5jdGlvbkVudGl0eSB0YXJnZXQgPSBlbGVtZW50TWFwLmdldE1ldGhvZChwcm9jZWR1cmUpOwogICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IENhbGxTdHJ1Y3R1cmUoCiAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50cyArIG5hbWVkQXJndW1lbnRzLmxlbmd0aCwKICAgICAgICBuYW1lZEFyZ3VtZW50cywKICAgICAgICB0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBMaXN0PERhcnRUeXBlPiBkYXJ0VHlwZUFyZ3VtZW50cyA9IF9nZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpOwogICAgaWYgKGNvbW1vbkVsZW1lbnRzLmlzRXh0cmFjdFR5cGVBcmd1bWVudHModGFyZ2V0KSkgewogICAgICBfaGFuZGxlRXh0cmFjdFR5cGVBcmd1bWVudHModGFyZ2V0LCBkYXJ0VHlwZUFyZ3VtZW50cywgY2FsbFN0cnVjdHVyZSk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgIEltcG9ydEVudGl0eSBkZWZlcnJlZEltcG9ydCA9IGVsZW1lbnRNYXAuZ2V0SW1wb3J0KGltcG9ydCk7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UoCiAgICAgICAgICB0YXJnZXQsIGNhbGxTdHJ1Y3R1cmUsIGRhcnRUeXBlQXJndW1lbnRzLCBkZWZlcnJlZEltcG9ydCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN0YXRpY0ludm9jYXRpb25Ob2RlKGlyLlN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgc3dpdGNoIChlbGVtZW50TWFwLmdldEZvcmVpZ25LaW5kKG5vZGUpKSB7CiAgICAgIGNhc2UgRm9yZWlnbktpbmQuSlM6CiAgICAgICAgaW1wYWN0QnVpbGRlcgogICAgICAgICAgICAucmVnaXN0ZXJOYXRpdmVEYXRhKGVsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0NhbGwobm9kZSkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEZvcmVpZ25LaW5kLkpTX0JVSUxUSU46CiAgICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3Rlck5hdGl2ZURhdGEoCiAgICAgICAgICAgIGVsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0J1aWx0aW5DYWxsKG5vZGUpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBGb3JlaWduS2luZC5KU19FTUJFRERFRF9HTE9CQUw6CiAgICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3Rlck5hdGl2ZURhdGEoCiAgICAgICAgICAgIGVsZW1lbnRNYXAuZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0VtYmVkZGVkR2xvYmFsQ2FsbChub2RlKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgRm9yZWlnbktpbmQuSlNfSU5URVJDRVBUT1JfQ09OU1RBTlQ6CiAgICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlID0KICAgICAgICAgICAgZWxlbWVudE1hcC5nZXRJbnRlcmZhY2VUeXBlRm9ySnNJbnRlcmNlcHRvckNhbGwobm9kZSk7CiAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaW5zdGFudGlhdGlvbih0eXBlKSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEZvcmVpZ25LaW5kLk5PTkU6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICB2b2lkIF9oYW5kbGVFeHRyYWN0VHlwZUFyZ3VtZW50cyhGdW5jdGlvbkVudGl0eSB0YXJnZXQsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMsIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSkgewogICAgLy8gZXh0cmFjdFR5cGVBcmd1bWVudHM8TWFwPihvYmosIGZuKSBoYXMgYWRkaXRpb25hbCBpbXBhY3RzOgogICAgLy8KICAgIC8vICAgMS4gQWxsIGNsYXNzZXMgaW1wbGVtZW50aW5nIE1hcCBuZWVkIHRvIGNhcnJ5IHR5cGUgYXJndW1lbnRzIChzaW1pbGFyCiAgICAvLyAgICAgIHRvIGNoZWNraW5nIGBvIGlzIE1hcDxLLCBWPmApLgogICAgLy8KICAgIC8vICAgMi4gVGhlcmUgaXMgYW4gaW52b2NhdGlvbiBvZiBmbiB3aXRoIHNvbWUgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzLgogICAgLy8KICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UoCiAgICAgICAgbmV3IFN0YXRpY1VzZS5zdGF0aWNJbnZva2UodGFyZ2V0LCBjYWxsU3RydWN0dXJlLCB0eXBlQXJndW1lbnRzKSk7CgogICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IDEpIHJldHVybjsKICAgIERhcnRUeXBlIG1hdGNoZWRUeXBlID0gdHlwZUFyZ3VtZW50cy5maXJzdDsKCiAgICBpZiAobWF0Y2hlZFR5cGUgaXMhIEludGVyZmFjZVR5cGUpIHJldHVybjsKICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA9IG1hdGNoZWRUeXBlOwogICAgQ2xhc3NFbnRpdHkgY2xzID0gaW50ZXJmYWNlVHlwZS5lbGVtZW50OwogICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9IGVsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKGNscyk7CgogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaXNDaGVjayh0aGlzVHlwZSkpOwoKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yLmNhbGxDbG9zdXJlKAogICAgICAgIDAsIGNvbnN0IDxTdHJpbmc+W10sIHRoaXNUeXBlLnR5cGVBcmd1bWVudHMubGVuZ3RoKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKAogICAgICAgIG5ldyBEeW5hbWljVXNlKHNlbGVjdG9yLCBudWxsLCB0aGlzVHlwZS50eXBlQXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RhdGljVGVhck9mZigKICAgICAgaXIuUHJvY2VkdXJlIHByb2NlZHVyZSwgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0KSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljVGVhck9mZigKICAgICAgICBlbGVtZW50TWFwLmdldE1ldGhvZChwcm9jZWR1cmUpLCBlbGVtZW50TWFwLmdldEltcG9ydChpbXBvcnQpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RhdGljR2V0KGlyLk1lbWJlciBtZW1iZXIsIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY0dldCgKICAgICAgICBlbGVtZW50TWFwLmdldE1lbWJlcihtZW1iZXIpLCBlbGVtZW50TWFwLmdldEltcG9ydChpbXBvcnQpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RhdGljU2V0KGlyLk1lbWJlciBtZW1iZXIsIGlyLkxpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN0YXRpY1NldCgKICAgICAgICBlbGVtZW50TWFwLmdldE1lbWJlcihtZW1iZXIpLCBlbGVtZW50TWFwLmdldEltcG9ydChpbXBvcnQpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3VwZXJJbnZvY2F0aW9uKGlyLk5hbWUgbmFtZSwgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0KICAgICAgICBlbGVtZW50TWFwLmdldFN1cGVyTWVtYmVyKGN1cnJlbnRNZW1iZXIsIG5hbWUsIHNldHRlcjogZmFsc2UpOwogICAgTGlzdDxEYXJ0VHlwZT4gZGFydFR5cGVBcmd1bWVudHMgPSBfZ2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKTsKICAgIGlmIChtZXRob2QgIT0gbnVsbCkgewogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3VwZXJJbnZva2UoCiAgICAgICAgICBtZXRob2QsCiAgICAgICAgICBuZXcgQ2FsbFN0cnVjdHVyZShwb3NpdGlvbmFsQXJndW1lbnRzICsgbmFtZWRBcmd1bWVudHMubGVuZ3RoLAogICAgICAgICAgICAgIG5hbWVkQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzLmxlbmd0aCksCiAgICAgICAgICBkYXJ0VHlwZUFyZ3VtZW50cykpOwogICAgfSBlbHNlIHsKICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN1cGVySW52b2tlKAogICAgICAgICAgZWxlbWVudE1hcC5nZXRTdXBlck5vU3VjaE1ldGhvZChjdXJyZW50TWVtYmVyLmVuY2xvc2luZ0NsYXNzKSwKICAgICAgICAgIENhbGxTdHJ1Y3R1cmUuT05FX0FSRykpOwogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRmVhdHVyZShGZWF0dXJlLlNVUEVSX05PX1NVQ0hfTUVUSE9EKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdXBlckdldChpci5OYW1lIG5hbWUpIHsKICAgIE1lbWJlckVudGl0eSBtZW1iZXIgPQogICAgICAgIGVsZW1lbnRNYXAuZ2V0U3VwZXJNZW1iZXIoY3VycmVudE1lbWJlciwgbmFtZSwgc2V0dGVyOiBmYWxzZSk7CiAgICBpZiAobWVtYmVyICE9IG51bGwpIHsKICAgICAgaWYgKG1lbWJlci5pc0Z1bmN0aW9uKSB7CiAgICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN1cGVyVGVhck9mZihtZW1iZXIpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3VwZXJHZXQobWVtYmVyKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdXBlckludm9rZSgKICAgICAgICAgIGVsZW1lbnRNYXAuZ2V0U3VwZXJOb1N1Y2hNZXRob2QoY3VycmVudE1lbWJlci5lbmNsb3NpbmdDbGFzcyksCiAgICAgICAgICBDYWxsU3RydWN0dXJlLk9ORV9BUkcpKTsKICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5TVVBFUl9OT19TVUNIX01FVEhPRCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3VwZXJTZXQoaXIuTmFtZSBuYW1lKSB7CiAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0KICAgICAgICBlbGVtZW50TWFwLmdldFN1cGVyTWVtYmVyKGN1cnJlbnRNZW1iZXIsIG5hbWUsIHNldHRlcjogdHJ1ZSk7CiAgICBpZiAobWVtYmVyICE9IG51bGwpIHsKICAgICAgaWYgKG1lbWJlci5pc0ZpZWxkKSB7CiAgICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN1cGVyRmllbGRTZXQobWVtYmVyKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclN0YXRpY1VzZShuZXcgU3RhdGljVXNlLnN1cGVyU2V0dGVyU2V0KG1lbWJlcikpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3VwZXJJbnZva2UoCiAgICAgICAgICBlbGVtZW50TWFwLmdldFN1cGVyTm9TdWNoTWV0aG9kKGN1cnJlbnRNZW1iZXIuZW5jbG9zaW5nQ2xhc3MpLAogICAgICAgICAgQ2FsbFN0cnVjdHVyZS5PTkVfQVJHKSk7CiAgICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJGZWF0dXJlKEZlYXR1cmUuU1VQRVJfTk9fU1VDSF9NRVRIT0QpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckxvY2FsRnVuY3Rpb25JbnZvY2F0aW9uKAogICAgICBpci5GdW5jdGlvbkRlY2xhcmF0aW9uIGxvY2FsRnVuY3Rpb24sCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIENhbGxTdHJ1Y3R1cmUgY2FsbFN0cnVjdHVyZSA9IG5ldyBDYWxsU3RydWN0dXJlKAogICAgICAgIHBvc2l0aW9uYWxBcmd1bWVudHMgKyBuYW1lZEFyZ3VtZW50cy5sZW5ndGgsCiAgICAgICAgbmFtZWRBcmd1bWVudHMsCiAgICAgICAgdHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgTGlzdDxEYXJ0VHlwZT4gZGFydFR5cGVBcmd1bWVudHMgPSBfZ2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKTsKICAgIC8vIEludm9jYXRpb24gb2YgYSBsb2NhbCBmdW5jdGlvbi4gTm8gbmVlZCBmb3IgZHluYW1pYyB1c2UsIGJ1dAogICAgLy8gd2UgbmVlZCB0byB0cmFjayB0aGUgdHlwZSBhcmd1bWVudHMuCiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2UuY2xvc3VyZUNhbGwoCiAgICAgICAgZWxlbWVudE1hcC5nZXRMb2NhbEZ1bmN0aW9uKGxvY2FsRnVuY3Rpb24pLAogICAgICAgIGNhbGxTdHJ1Y3R1cmUsCiAgICAgICAgZGFydFR5cGVBcmd1bWVudHMpKTsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFlldCwgYWxhcywgd2UgbmVlZCB0aGUgZHluYW1pYyB1c2UgZm9yIG5vdy4gUmVtb3ZlCiAgICAvLyB0aGlzIHdoZW4ga2VybmVsIGFkZHMgYW4gYGlzRnVuY3Rpb25DYWxsYCBmbGFnIHRvCiAgICAvLyBbaXIuTWV0aG9kSW52b2NhdGlvbl0uCiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRHluYW1pY1VzZSgKICAgICAgICBuZXcgRHluYW1pY1VzZShjYWxsU3RydWN0dXJlLmNhbGxTZWxlY3RvciwgbnVsbCwgZGFydFR5cGVBcmd1bWVudHMpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJEeW5hbWljSW52b2NhdGlvbigKICAgICAgaXIuRGFydFR5cGUgcmVjZWl2ZXJUeXBlLAogICAgICBDbGFzc1JlbGF0aW9uIHJlbGF0aW9uLAogICAgICBpci5OYW1lIG5hbWUsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gZWxlbWVudE1hcC5nZXRJbnZvY2F0aW9uU2VsZWN0b3IoCiAgICAgICAgbmFtZSwgcG9zaXRpb25hbEFyZ3VtZW50cywgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMubGVuZ3RoKTsKICAgIExpc3Q8RGFydFR5cGU+IGRhcnRUeXBlQXJndW1lbnRzID0gX2dldFR5cGVBcmd1bWVudHModHlwZUFyZ3VtZW50cyk7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRHluYW1pY1VzZShuZXcgRHluYW1pY1VzZShzZWxlY3RvciwKICAgICAgICBfY29tcHV0ZVJlY2VpdmVyQ29uc3RyYWludChyZWNlaXZlclR5cGUsIHJlbGF0aW9uKSwgZGFydFR5cGVBcmd1bWVudHMpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJGdW5jdGlvbkludm9jYXRpb24oCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgaW50IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIExpc3Q8U3RyaW5nPiBuYW1lZEFyZ3VtZW50cywKICAgICAgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgQ2FsbFN0cnVjdHVyZSBjYWxsU3RydWN0dXJlID0gbmV3IENhbGxTdHJ1Y3R1cmUoCiAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50cyArIG5hbWVkQXJndW1lbnRzLmxlbmd0aCwKICAgICAgICBuYW1lZEFyZ3VtZW50cywKICAgICAgICB0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBMaXN0PERhcnRUeXBlPiBkYXJ0VHlwZUFyZ3VtZW50cyA9IF9nZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckR5bmFtaWNVc2UobmV3IER5bmFtaWNVc2UoCiAgICAgICAgY2FsbFN0cnVjdHVyZS5jYWxsU2VsZWN0b3IsCiAgICAgICAgX2NvbXB1dGVSZWNlaXZlckNvbnN0cmFpbnQocmVjZWl2ZXJUeXBlLCBDbGFzc1JlbGF0aW9uLnN1YnR5cGUpLAogICAgICAgIGRhcnRUeXBlQXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVySW5zdGFuY2VJbnZvY2F0aW9uKAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIENsYXNzUmVsYXRpb24gcmVsYXRpb24sCiAgICAgIGlyLk1lbWJlciB0YXJnZXQsCiAgICAgIGludCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBMaXN0PFN0cmluZz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIExpc3Q8aXIuRGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIExpc3Q8RGFydFR5cGU+IGRhcnRUeXBlQXJndW1lbnRzID0gX2dldFR5cGVBcmd1bWVudHModHlwZUFyZ3VtZW50cyk7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRHluYW1pY1VzZShuZXcgRHluYW1pY1VzZSgKICAgICAgICBlbGVtZW50TWFwLmdldEludm9jYXRpb25TZWxlY3Rvcih0YXJnZXQubmFtZSwgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgICAgICAgbmFtZWRBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMubGVuZ3RoKSwKICAgICAgICBfY29tcHV0ZVJlY2VpdmVyQ29uc3RyYWludChyZWNlaXZlclR5cGUsIHJlbGF0aW9uKSwKICAgICAgICBkYXJ0VHlwZUFyZ3VtZW50cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckR5bmFtaWNHZXQoCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwgaXIuTmFtZSBuYW1lKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRHluYW1pY1VzZShuZXcgRHluYW1pY1VzZSgKICAgICAgICBuZXcgU2VsZWN0b3IuZ2V0dGVyKGVsZW1lbnRNYXAuZ2V0TmFtZShuYW1lKSksCiAgICAgICAgX2NvbXB1dGVSZWNlaXZlckNvbnN0cmFpbnQocmVjZWl2ZXJUeXBlLCByZWxhdGlvbiksCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVySW5zdGFuY2VHZXQoCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgQ2xhc3NSZWxhdGlvbiByZWxhdGlvbiwgaXIuTWVtYmVyIHRhcmdldCkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckR5bmFtaWNVc2UobmV3IER5bmFtaWNVc2UoCiAgICAgICAgbmV3IFNlbGVjdG9yLmdldHRlcihlbGVtZW50TWFwLmdldE5hbWUodGFyZ2V0Lm5hbWUpKSwKICAgICAgICBfY29tcHV0ZVJlY2VpdmVyQ29uc3RyYWludChyZWNlaXZlclR5cGUsIHJlbGF0aW9uKSwKICAgICAgICBjb25zdCA8RGFydFR5cGU+W10pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJEeW5hbWljU2V0KAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIENsYXNzUmVsYXRpb24gcmVsYXRpb24sIGlyLk5hbWUgbmFtZSkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckR5bmFtaWNVc2UobmV3IER5bmFtaWNVc2UoCiAgICAgICAgbmV3IFNlbGVjdG9yLnNldHRlcihlbGVtZW50TWFwLmdldE5hbWUobmFtZSkpLAogICAgICAgIF9jb21wdXRlUmVjZWl2ZXJDb25zdHJhaW50KHJlY2VpdmVyVHlwZSwgcmVsYXRpb24pLAogICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bXSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3Rlckluc3RhbmNlU2V0KAogICAgICBpci5EYXJ0VHlwZSByZWNlaXZlclR5cGUsIENsYXNzUmVsYXRpb24gcmVsYXRpb24sIGlyLk1lbWJlciB0YXJnZXQpIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKG5ldyBEeW5hbWljVXNlKAogICAgICAgIG5ldyBTZWxlY3Rvci5zZXR0ZXIoZWxlbWVudE1hcC5nZXROYW1lKHRhcmdldC5uYW1lKSksCiAgICAgICAgX2NvbXB1dGVSZWNlaXZlckNvbnN0cmFpbnQocmVjZWl2ZXJUeXBlLCByZWxhdGlvbiksCiAgICAgICAgY29uc3QgPERhcnRUeXBlPltdKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyUnVudGltZVR5cGVVc2UoaXIuUHJvcGVydHlHZXQgbm9kZSwgUnVudGltZVR5cGVVc2VLaW5kIGtpbmQsCiAgICAgIGlyLkRhcnRUeXBlIHJlY2VpdmVyVHlwZSwgaXIuRGFydFR5cGUgYXJndW1lbnRUeXBlKSB7CiAgICBEYXJ0VHlwZSByZWNlaXZlckRhcnRUeXBlID0gZWxlbWVudE1hcC5nZXREYXJ0VHlwZShyZWNlaXZlclR5cGUpOwogICAgRGFydFR5cGUgYXJndW1lbnREYXJ0VHlwZSA9CiAgICAgICAgYXJndW1lbnRUeXBlID09IG51bGwgPyBudWxsIDogZWxlbWVudE1hcC5nZXREYXJ0VHlwZShhcmd1bWVudFR5cGUpOwoKICAgIGlmIChfb3B0aW9ucy5vbWl0SW1wbGljaXRDaGVja3MpIHsKICAgICAgc3dpdGNoIChraW5kKSB7CiAgICAgICAgY2FzZSBSdW50aW1lVHlwZVVzZUtpbmQuc3RyaW5nOgogICAgICAgICAgaWYgKCFfb3B0aW9ucy5sYXhSdW50aW1lVHlwZVRvU3RyaW5nKSB7CiAgICAgICAgICAgIGlmIChyZWNlaXZlckRhcnRUeXBlID09IGNvbW1vbkVsZW1lbnRzLm9iamVjdFR5cGUpIHsKICAgICAgICAgICAgICByZXBvcnRlci5yZXBvcnRIaW50TWVzc2FnZShjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShub2RlKSwKICAgICAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuUlVOVElNRV9UWVBFX1RPX1NUUklOR19PQkpFQ1QpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEhpbnRNZXNzYWdlKAogICAgICAgICAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShub2RlKSwKICAgICAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuUlVOVElNRV9UWVBFX1RPX1NUUklOR19TVUJUWVBFLAogICAgICAgICAgICAgICAgICB7J3JlY2VpdmVyVHlwZSc6ICcke3JlY2VpdmVyRGFydFR5cGV9Lid9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBSdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzOgogICAgICAgIGNhc2UgUnVudGltZVR5cGVVc2VLaW5kLnVua25vd246CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclJ1bnRpbWVUeXBlVXNlKAogICAgICAgIG5ldyBSdW50aW1lVHlwZVVzZShraW5kLCByZWNlaXZlckRhcnRUeXBlLCBhcmd1bWVudERhcnRUeXBlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQXNzZXJ0KHtib29sIHdpdGhNZXNzYWdlfSkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoCiAgICAgICAgd2l0aE1lc3NhZ2UgPyBGZWF0dXJlLkFTU0VSVF9XSVRIX01FU1NBR0UgOiBGZWF0dXJlLkFTU0VSVCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyR2VuZXJpY0luc3RhbnRpYXRpb24oCiAgICAgIGlyLkZ1bmN0aW9uVHlwZSBleHByZXNzaW9uVHlwZSwgTGlzdDxpci5EYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykgewogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVHJhY2sgd2hpY2ggYXJpdGllcyBhcmUgdXNlZCBpbiBpbnN0YW50aWF0aW9uLgogICAgaW1wYWN0QnVpbGRlci5yZWdpc3Rlckluc3RhbnRpYXRpb24obmV3IEdlbmVyaWNJbnN0YW50aWF0aW9uKAogICAgICAgIGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUoZXhwcmVzc2lvblR5cGUpLAogICAgICAgIHR5cGVBcmd1bWVudHMubWFwKGVsZW1lbnRNYXAuZ2V0RGFydFR5cGUpLnRvTGlzdCgpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyU3RyaW5nQ29uY2F0ZW5hdGlvbigpIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJGZWF0dXJlKEZlYXR1cmUuU1RSSU5HX0lOVEVSUE9MQVRJT04pOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5TVFJJTkdfSlVYVEFQT1NJVElPTik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTG9jYWxGdW5jdGlvbihpci5UcmVlTm9kZSBub2RlKSB7CiAgICBMb2NhbCBmdW5jdGlvbiA9IGVsZW1lbnRNYXAuZ2V0TG9jYWxGdW5jdGlvbihub2RlKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5jbG9zdXJlKGZ1bmN0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTG9jYWxXaXRob3V0SW5pdGlhbGl6ZXIoKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRmVhdHVyZShGZWF0dXJlLkxPQ0FMX1dJVEhPVVRfSU5JVElBTElaRVIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlcklzQ2hlY2soaXIuRGFydFR5cGUgdHlwZSkgewogICAgaW1wYWN0QnVpbGRlcgogICAgICAgIC5yZWdpc3RlclR5cGVVc2UobmV3IFR5cGVVc2UuaXNDaGVjayhlbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVySW1wbGljaXRDYXN0KGlyLkRhcnRUeXBlIHR5cGUpIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJUeXBlVXNlKAogICAgICAgIG5ldyBUeXBlVXNlLmltcGxpY2l0Q2FzdChlbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQXNDYXN0KGlyLkRhcnRUeXBlIHR5cGUpIHsKICAgIGltcGFjdEJ1aWxkZXIKICAgICAgICAucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmFzQ2FzdChlbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyVGhyb3coKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRmVhdHVyZShGZWF0dXJlLlRIUk9XX0VYUFJFU1NJT04pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN5bmNGb3JJbihpci5EYXJ0VHlwZSBpdGVyYWJsZVR5cGUsIGlyLkRhcnRUeXBlIGl0ZXJhdG9yVHlwZSwKICAgICAgQ2xhc3NSZWxhdGlvbiBpdGVyYXRvckNsYXNzUmVsYXRpb24pIHsKICAgIE9iamVjdCByZWNlaXZlckNvbnN0cmFpbnQgPQogICAgICAgIF9jb21wdXRlUmVjZWl2ZXJDb25zdHJhaW50KGl0ZXJhdG9yVHlwZSwgaXRlcmF0b3JDbGFzc1JlbGF0aW9uKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJGZWF0dXJlKEZlYXR1cmUuU1lOQ19GT1JfSU4pOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckR5bmFtaWNVc2UoCiAgICAgICAgbmV3IER5bmFtaWNVc2UoU2VsZWN0b3JzLml0ZXJhdG9yLCByZWNlaXZlckNvbnN0cmFpbnQsIGNvbnN0IFtdKSk7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRHluYW1pY1VzZSgKICAgICAgICBuZXcgRHluYW1pY1VzZShTZWxlY3RvcnMuY3VycmVudCwgcmVjZWl2ZXJDb25zdHJhaW50LCBjb25zdCBbXSkpOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckR5bmFtaWNVc2UoCiAgICAgICAgbmV3IER5bmFtaWNVc2UoU2VsZWN0b3JzLm1vdmVOZXh0LCByZWNlaXZlckNvbnN0cmFpbnQsIGNvbnN0IFtdKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQXN5bmNGb3JJbihpci5EYXJ0VHlwZSBpdGVyYWJsZVR5cGUsIGlyLkRhcnRUeXBlIGl0ZXJhdG9yVHlwZSwKICAgICAgQ2xhc3NSZWxhdGlvbiBpdGVyYXRvckNsYXNzUmVsYXRpb24pIHsKICAgIE9iamVjdCByZWNlaXZlckNvbnN0cmFpbnQgPQogICAgICAgIF9jb21wdXRlUmVjZWl2ZXJDb25zdHJhaW50KGl0ZXJhdG9yVHlwZSwgaXRlcmF0b3JDbGFzc1JlbGF0aW9uKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJGZWF0dXJlKEZlYXR1cmUuQVNZTkNfRk9SX0lOKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKAogICAgICAgIG5ldyBEeW5hbWljVXNlKFNlbGVjdG9ycy5jYW5jZWwsIHJlY2VpdmVyQ29uc3RyYWludCwgY29uc3QgW10pKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJEeW5hbWljVXNlKAogICAgICAgIG5ldyBEeW5hbWljVXNlKFNlbGVjdG9ycy5jdXJyZW50LCByZWNlaXZlckNvbnN0cmFpbnQsIGNvbnN0IFtdKSk7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyRHluYW1pY1VzZSgKICAgICAgICBuZXcgRHluYW1pY1VzZShTZWxlY3RvcnMubW92ZU5leHQsIHJlY2VpdmVyQ29uc3RyYWludCwgY29uc3QgW10pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJDYXRjaCgpIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJGZWF0dXJlKEZlYXR1cmUuQ0FUQ0hfU1RBVEVNRU5UKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJTdGFja1RyYWNlKCkgewogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5TVEFDS19UUkFDRV9JTl9DQVRDSCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyQ2F0Y2hUeXBlKGlyLkRhcnRUeXBlIHR5cGUpIHsKICAgIGltcGFjdEJ1aWxkZXIKICAgICAgICAucmVnaXN0ZXJUeXBlVXNlKG5ldyBUeXBlVXNlLmNhdGNoVHlwZShlbGVtZW50TWFwLmdldERhcnRUeXBlKHR5cGUpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyVHlwZUxpdGVyYWwoaXIuRGFydFR5cGUgdHlwZSwgaXIuTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0KSB7CiAgICBJbXBvcnRFbnRpdHkgZGVmZXJyZWRJbXBvcnQgPSBlbGVtZW50TWFwLmdldEltcG9ydChpbXBvcnQpOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlclR5cGVVc2UoCiAgICAgICAgbmV3IFR5cGVVc2UudHlwZUxpdGVyYWwoZWxlbWVudE1hcC5nZXREYXJ0VHlwZSh0eXBlKSwgZGVmZXJyZWRJbXBvcnQpKTsKICAgIGlmICh0eXBlIGlzIGlyLkZ1bmN0aW9uVHlwZSkgewogICAgICBhc3NlcnQodHlwZS50eXBlZGVmICE9IG51bGwpOwogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDYW4gd2UgYXZvaWQgdGhlIHR5cGVkZWYgdHlwZSBhbHRvZ2V0aGVyPwogICAgICAvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSB0eXBlZGVmIGlzIGxpdmUuCiAgICAgIGVsZW1lbnRNYXAuZ2V0VHlwZWRlZlR5cGUodHlwZS50eXBlZGVmKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJGaWVsZEluaXRpYWxpemF0aW9uKGlyLkZpZWxkIG5vZGUpIHsKICAgIGltcGFjdEJ1aWxkZXIKICAgICAgICAucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5maWVsZEluaXQoZWxlbWVudE1hcC5nZXRGaWVsZChub2RlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlckZpZWxkQ29uc3RhbnRJbml0aWFsaXphdGlvbigKICAgICAgaXIuRmllbGQgbm9kZSwgQ29uc3RhbnRSZWZlcmVuY2UgY29uc3RhbnQpIHsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5maWVsZENvbnN0YW50SW5pdCgKICAgICAgICBlbGVtZW50TWFwLmdldEZpZWxkKG5vZGUpLAogICAgICAgIF9jb25zdGFudFZhbHVlZmllci52aXNpdENvbnN0YW50KGNvbnN0YW50LmNvbnN0YW50KSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoCiAgICAgIGlyLkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLAogICAgICBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVkQXJndW1lbnRzLAogICAgICBMaXN0PGlyLkRhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBDb25zdHJ1Y3RvckVudGl0eSB0YXJnZXQgPSBlbGVtZW50TWFwLmdldENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKTsKICAgIGltcGFjdEJ1aWxkZXIucmVnaXN0ZXJTdGF0aWNVc2UobmV3IFN0YXRpY1VzZS5zdXBlckNvbnN0cnVjdG9ySW52b2tlKAogICAgICAgIHRhcmdldCwKICAgICAgICBuZXcgQ2FsbFN0cnVjdHVyZShwb3NpdGlvbmFsQXJndW1lbnRzICsgbmFtZWRBcmd1bWVudHMubGVuZ3RoLAogICAgICAgICAgICBuYW1lZEFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cy5sZW5ndGgpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTG9hZExpYnJhcnkoKSB7CiAgICBpbXBhY3RCdWlsZGVyLnJlZ2lzdGVyU3RhdGljVXNlKG5ldyBTdGF0aWNVc2Uuc3RhdGljSW52b2tlKAogICAgICAgIGNvbW1vbkVsZW1lbnRzLmxvYWREZWZlcnJlZExpYnJhcnksIENhbGxTdHJ1Y3R1cmUuT05FX0FSRykpOwogICAgaW1wYWN0QnVpbGRlci5yZWdpc3RlckZlYXR1cmUoRmVhdHVyZS5MT0FEX0xJQlJBUlkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWdpc3RlclN3aXRjaFN0YXRlbWVudE5vZGUoaXIuU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIC8vIFRPRE8oMzI1NTcpOiBSZW1vdmUgdGhpcyB3aGVuIGlzc3VlIDMyNTU3IGlzIGZpeGVkLgogICAgaXIuVHJlZU5vZGUgZmlyc3RDYXNlOwogICAgRGFydFR5cGUgZmlyc3RDYXNlVHlwZTsKICAgIERpYWdub3N0aWNNZXNzYWdlIGVycm9yOwogICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MgPSA8RGlhZ25vc3RpY01lc3NhZ2U+W107CgogICAgYm9vbCBvdmVycmlkZXNFcXVhbHMoSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICAgIGlmICh0eXBlID09IGNvbW1vbkVsZW1lbnRzLnN5bWJvbEltcGxlbWVudGF0aW9uVHlwZSkgewogICAgICAgIC8vIFRyZWF0IHN5bWJvbCBjb25zdGFudHMgYXMgaWYgU3ltYm9sIGRvZXNuJ3Qgb3ZlcnJpZGUgYD09YC4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgQ2xhc3NFbnRpdHkgY2xzID0gdHlwZS5lbGVtZW50OwogICAgICB3aGlsZSAoY2xzICE9IG51bGwpIHsKICAgICAgICBNZW1iZXJFbnRpdHkgbWVtYmVyID0KICAgICAgICAgICAgZWxlbWVudE1hcC5lbGVtZW50RW52aXJvbm1lbnQubG9va3VwQ2xhc3NNZW1iZXIoY2xzLCAnPT0nKTsKICAgICAgICBpZiAobWVtYmVyLmlzQWJzdHJhY3QpIHsKICAgICAgICAgIGNscyA9IGVsZW1lbnRNYXAuZWxlbWVudEVudmlyb25tZW50LmdldFN1cGVyQ2xhc3MoY2xzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIG1lbWJlci5lbmNsb3NpbmdDbGFzcyAhPSBjb21tb25FbGVtZW50cy5vYmplY3RDbGFzczsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGZvciAoaXIuU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlIGluIG5vZGUuY2FzZXMpIHsKICAgICAgZm9yIChpci5FeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gc3dpdGNoQ2FzZS5leHByZXNzaW9ucykgewogICAgICAgIENvbnN0YW50VmFsdWUgdmFsdWUgPSBlbGVtZW50TWFwLmdldENvbnN0YW50VmFsdWUoZXhwcmVzc2lvbik7CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IHZhbHVlLmdldFR5cGUoZWxlbWVudE1hcC5jb21tb25FbGVtZW50cyk7CiAgICAgICAgaWYgKGZpcnN0Q2FzZVR5cGUgPT0gbnVsbCkgewogICAgICAgICAgZmlyc3RDYXNlID0gZXhwcmVzc2lvbjsKICAgICAgICAgIGZpcnN0Q2FzZVR5cGUgPSB0eXBlOwoKICAgICAgICAgIC8vIFdlIG9ubHkgcmVwb3J0IHRoZSBiYWQgdHlwZSBvbiB0aGUgZmlyc3QgY2xhc3MgZWxlbWVudC4gQWxsIG90aGVycwogICAgICAgICAgLy8gZ2V0IGEgInR5cGUgZGlmZmVycyIgZXJyb3IuCiAgICAgICAgICBpZiAodHlwZSA9PSBjb21tb25FbGVtZW50cy5kb3VibGVUeXBlKSB7CiAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKGV4cHJlc3Npb24pLAogICAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuU1dJVENIX0NBU0VfVkFMVUVfT1ZFUlJJREVTX0VRVUFMUywKICAgICAgICAgICAgICAgIHsndHlwZSc6ICJkb3VibGUifSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gY29tbW9uRWxlbWVudHMuZnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZShjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShub2RlKSwKICAgICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX0ZPUkJJRERFTiwgeyd0eXBlJzogIkZ1bmN0aW9uIn0pOwogICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pc09iamVjdCAmJgogICAgICAgICAgICAgIHR5cGUgIT0gY29tbW9uRWxlbWVudHMudHlwZUxpdGVyYWxUeXBlICYmCiAgICAgICAgICAgICAgb3ZlcnJpZGVzRXF1YWxzKHR5cGUpKSB7CiAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKICAgICAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKGZpcnN0Q2FzZSksCiAgICAgICAgICAgICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9WQUxVRV9PVkVSUklERVNfRVFVQUxTLAogICAgICAgICAgICAgICAgeyd0eXBlJzogdHlwZX0pOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAodHlwZSAhPSBmaXJzdENhc2VUeXBlKSB7CiAgICAgICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgZXJyb3IgPSByZXBvcnRlci5jcmVhdGVNZXNzYWdlKAogICAgICAgICAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShub2RlKSwKICAgICAgICAgICAgICAgICAgTWVzc2FnZUtpbmQuU1dJVENIX0NBU0VfVFlQRVNfTk9UX0VRVUFMLAogICAgICAgICAgICAgICAgICB7J3R5cGUnOiBmaXJzdENhc2VUeXBlfSk7CiAgICAgICAgICAgICAgaW5mb3MuYWRkKHJlcG9ydGVyLmNyZWF0ZU1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKGZpcnN0Q2FzZSksCiAgICAgICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX1RZUEVTX05PVF9FUVVBTF9DQVNFLAogICAgICAgICAgICAgICAgICB7J3R5cGUnOiBmaXJzdENhc2VUeXBlfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluZm9zLmFkZChyZXBvcnRlci5jcmVhdGVNZXNzYWdlKAogICAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUoZXhwcmVzc2lvbiksCiAgICAgICAgICAgICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9UWVBFU19OT1RfRVFVQUxfQ0FTRSwKICAgICAgICAgICAgICAgIHsndHlwZSc6IHR5cGV9KSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewogICAgICByZXBvcnRlci5yZXBvcnRFcnJvcihlcnJvciwgaW5mb3MpOwogICAgfQogIH0KfQqDjABOTjwBKDUBGR8kIigjJCEfHCErGyEaHikpIhpIKiMkHykbATg0JQw0DCcMJQwiDCQsDC4BFxcaFRUtGR9ORSEBDEIBDEYBDDgBDDE9AgFILUAMNAwnDCUMIgwkDC4BTC5OAQxIAQxCAQxGAUovNBwaBAIBTCFFICMlIjIqJSgsASU6LEU2FQhIQgYRBAEMNDQbRwYEAT4kNwQBDB03BAEMKyIZSTlQKkUlQyxFLEVROSYUUQYEAQw9PU1QKkUlQyxFLEVOPyYGBAEMMzZAMCs7BAEMMDJAMys7BAEMNDdAOSs7BAEMNztLUCpFJUMsRSxFTj0mBgQBDCcrSwQBDC1QBAEMKU4EAQwtUAQBDC0yBAEMH0kEAQw0JjpGHRwEAQwzJjhFHRwEAQxGJjggUR0cBAEMFBgdHyMnIxhHNTUYH0AsSzpLPFFJBgE7QQYBHTQURk4WBgQBDFElQE0SUAQBDE8aTDscSB1OJScpQRAIL0YGBAEMIR0dHyMpRlBJFSQ4ShVHNQQBDCEeHyMnJT01NRgfSTlNDg1CQkYGBAEMQC8bFk4PIypBDysqSA8wHUMcSgoPHQ8GBAE6Q0IHTysHTQclSwErMAEvLy1NAUIBMj0mQQQBDB49QUkEAQxKPUYEAQxKPUYEAQxGRhxHSRpBEkk1Hw1BSSNDBgQBDCgaRxofTQ9JCA1BSSNDBgQBDCgaRhocTg9PCA1BSSNDBgQBDCgsHyMpNTUYH0lELD80Fx1POR4mTgQBDCIgHhQfIyk6Skk+UQQBDCMgHyMpNTUYH0k1JEkdBAEMIyAeGB8jKUk1SzM8HQQBDBtINTc8HgQBDBxMNT48HgQBDBtINTc8HgQBDBxMNT48HgQBDEw8RiBMAScWKDJBTj4VKjc+PQ4MESgpEQgGKkcEAQwsI0UEAQwlSUtCMD4EAQwnQUEEAQwxOEYEAQwrRgQBDCsSTQQBDDAjQQQBDCoSTAQBDBk9BAEMTS0gSTgmSyZKJksEAQxOLSBJOSZJJkomSwQBDBk8BAEMHkEEAQwtEk8EAQxMQCNQIyRINS8GBAEMNBJQBAEMLDNFIz8EAQwnIh8jKUdKEEc1BAEMH0BFOQQBDD47GxwdOwEvPUYWCCYcHkghQhFGCggUBgEzQUdCJSIgAVApMyk7QCU8TUonOCcpOkAhDBEnIS43OywwPEAtDi47PiIMCggGGSoGBAIBLnBhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9rZXJuZWxfaW1wYWN0LmRhcnQuc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL2xvZ2dpbmcuZGFydKDSLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL3Rlc3RpbmcvZmVhdHVyZXMuZGFydCc7CmltcG9ydCAnbm9kZXMuZGFydCc7CgovLy8gTG9nIHVzZWQgZm9yIHVuaXQgdGVzdGluZyBvcHRpbWl6YXRpb25zLgpjbGFzcyBPcHRpbWl6YXRpb25UZXN0TG9nIHsKICBMaXN0PE9wdGltaXphdGlvbkxvZ0VudHJ5PiBlbnRyaWVzID0gW107CgogIE1hcDxTdHJpbmcsIFNldDxISW5zdHJ1Y3Rpb24+PiBfdW5jb252ZXJ0ZWQ7CgogIEZlYXR1cmVzIF9yZWdpc3RlcihTdHJpbmcgdGFnLCBISW5zdHJ1Y3Rpb24gb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQsCiAgICAgIHZvaWQgZihGZWF0dXJlcyBmZWF0dXJlcykpIHsKICAgIGlmIChjb252ZXJ0ZWQgPT0gbnVsbCkgewogICAgICBfdW5jb252ZXJ0ZWQgPz89IHt9OwogICAgICBTZXQ8SEluc3RydWN0aW9uPiBzZXQgPSBfdW5jb252ZXJ0ZWRbdGFnXSA/Pz0gbmV3IFNldDxISW5zdHJ1Y3Rpb24+KCk7CiAgICAgIGlmICghc2V0LmFkZChvcmlnaW5hbCkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgRmVhdHVyZXMgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZXMoKTsKICAgIGYoZmVhdHVyZXMpOwogICAgZW50cmllcy5hZGQobmV3IE9wdGltaXphdGlvbkxvZ0VudHJ5KHRhZywgZmVhdHVyZXMpKTsKICAgIHJldHVybiBmZWF0dXJlczsKICB9CgogIHZvaWQgcmVnaXN0ZXJGaWVsZEdldChISW52b2tlRHluYW1pY0dldHRlciBvcmlnaW5hbCwgSEZpZWxkR2V0IGNvbnZlcnRlZCkgewogICAgRmVhdHVyZXMgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZXMoKTsKICAgIGlmIChjb252ZXJ0ZWQuZWxlbWVudCAhPSBudWxsKSB7CiAgICAgIGZlYXR1cmVzWyduYW1lJ10gPQogICAgICAgICAgJyR7Y29udmVydGVkLmVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MubmFtZX0uJHtjb252ZXJ0ZWQuZWxlbWVudC5uYW1lfSc7CiAgICB9IGVsc2UgewogICAgICBmZWF0dXJlc1snbmFtZSddID0gJzxudWxsLWd1YXJkPic7CiAgICB9CiAgICBlbnRyaWVzLmFkZChuZXcgT3B0aW1pemF0aW9uTG9nRW50cnkoJ0ZpZWxkR2V0JywgZmVhdHVyZXMpKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJGaWVsZFNldChISW52b2tlRHluYW1pY1NldHRlciBvcmlnaW5hbCwgW0hGaWVsZFNldCBjb252ZXJ0ZWRdKSB7CiAgICBGZWF0dXJlcyBmZWF0dXJlcyA9IG5ldyBGZWF0dXJlcygpOwogICAgaWYgKGNvbnZlcnRlZCAhPSBudWxsKSB7CiAgICAgIGZlYXR1cmVzWyduYW1lJ10gPQogICAgICAgICAgJyR7Y29udmVydGVkLmVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MubmFtZX0uJHtjb252ZXJ0ZWQuZWxlbWVudC5uYW1lfSc7CiAgICB9IGVsc2UgewogICAgICBmZWF0dXJlc1sncmVtb3ZlZCddID0gb3JpZ2luYWwuc2VsZWN0b3IubmFtZTsKICAgIH0KICAgIGVudHJpZXMuYWRkKG5ldyBPcHRpbWl6YXRpb25Mb2dFbnRyeSgnRmllbGRTZXQnLCBmZWF0dXJlcykpOwogIH0KCiAgdm9pZCByZWdpc3RlckZpZWxkQ2FsbChISW52b2tlRHluYW1pY01ldGhvZCBvcmlnaW5hbCwgSEZpZWxkR2V0IGNvbnZlcnRlZCkgewogICAgRmVhdHVyZXMgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZXMoKTsKICAgIGlmIChjb252ZXJ0ZWQuZWxlbWVudCAhPSBudWxsKSB7CiAgICAgIGZlYXR1cmVzWyduYW1lJ10gPQogICAgICAgICAgJyR7Y29udmVydGVkLmVsZW1lbnQuZW5jbG9zaW5nQ2xhc3MubmFtZX0uJHtjb252ZXJ0ZWQuZWxlbWVudC5uYW1lfSc7CiAgICB9IGVsc2UgewogICAgICBmZWF0dXJlc1snbmFtZSddID0gJzxudWxsLWd1YXJkPic7CiAgICB9CiAgICBlbnRyaWVzLmFkZChuZXcgT3B0aW1pemF0aW9uTG9nRW50cnkoJ0ZpZWxkQ2FsbCcsIGZlYXR1cmVzKSk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQ29uc3RhbnRGaWVsZEdldCgKICAgICAgSEludm9rZUR5bmFtaWNHZXR0ZXIgb3JpZ2luYWwsIEZpZWxkRW50aXR5IGZpZWxkLCBIQ29uc3RhbnQgY29udmVydGVkKSB7CiAgICBGZWF0dXJlcyBmZWF0dXJlcyA9IG5ldyBGZWF0dXJlcygpOwogICAgZmVhdHVyZXNbJ25hbWUnXSA9ICcke2ZpZWxkLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiR7ZmllbGQubmFtZX0nOwogICAgZmVhdHVyZXNbJ3ZhbHVlJ10gPSBjb252ZXJ0ZWQuY29uc3RhbnQudG9TdHJ1Y3R1cmVkVGV4dCgpOwogICAgZW50cmllcy5hZGQobmV3IE9wdGltaXphdGlvbkxvZ0VudHJ5KCdDb25zdGFudEZpZWxkR2V0JywgZmVhdHVyZXMpKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJDb25zdGFudEZpZWxkQ2FsbCgKICAgICAgSEludm9rZUR5bmFtaWNNZXRob2Qgb3JpZ2luYWwsIEZpZWxkRW50aXR5IGZpZWxkLCBIQ29uc3RhbnQgY29udmVydGVkKSB7CiAgICBGZWF0dXJlcyBmZWF0dXJlcyA9IG5ldyBGZWF0dXJlcygpOwogICAgZmVhdHVyZXNbJ25hbWUnXSA9ICcke2ZpZWxkLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiR7ZmllbGQubmFtZX0nOwogICAgZmVhdHVyZXNbJ3ZhbHVlJ10gPSBjb252ZXJ0ZWQuY29uc3RhbnQudG9TdHJ1Y3R1cmVkVGV4dCgpOwogICAgZW50cmllcy5hZGQobmV3IE9wdGltaXphdGlvbkxvZ0VudHJ5KCdDb25zdGFudEZpZWxkQ2FsbCcsIGZlYXR1cmVzKSk7CiAgfQoKICBGZWF0dXJlcyBfcmVnaXN0ZXJTcGVjaWFsaXplcigKICAgICAgSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhJbnN0cnVjdGlvbiBjb252ZXJ0ZWQsIFN0cmluZyBuYW1lLAogICAgICBbU3RyaW5nIHVuY29udmVydGVkTmFtZV0pIHsKICAgIGFzc2VydCghKGNvbnZlcnRlZCA9PSBudWxsICYmIHVuY29udmVydGVkTmFtZSA9PSBudWxsKSk7CiAgICByZXR1cm4gX3JlZ2lzdGVyKCdTcGVjaWFsaXplcicsIG9yaWdpbmFsLCBjb252ZXJ0ZWQsIChGZWF0dXJlcyBmZWF0dXJlcykgewogICAgICBpZiAoY29udmVydGVkICE9IG51bGwpIHsKICAgICAgICBmZWF0dXJlcy5hZGQobmFtZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmVhdHVyZXMuYWRkKHVuY29udmVydGVkTmFtZSk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCByZWdpc3RlckluZGV4QXNzaWduKEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBISW5kZXhBc3NpZ24gY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnSW5kZXhBc3NpZ24nKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJJbmRleChISW52b2tlRHluYW1pYyBvcmlnaW5hbCwgSEluZGV4IGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ0luZGV4Jyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQml0Tm90KEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBIQml0Tm90IGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ0JpdE5vdCcpOwogIH0KCiAgdm9pZCByZWdpc3RlclVuYXJ5TmVnYXRlKEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBITmVnYXRlIGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ05lZ2F0ZScpOwogIH0KCiAgdm9pZCByZWdpc3RlckFicyhISW52b2tlRHluYW1pYyBvcmlnaW5hbCwgSEFicyBjb252ZXJ0ZWQpIHsKICAgIF9yZWdpc3RlclNwZWNpYWxpemVyKG9yaWdpbmFsLCBjb252ZXJ0ZWQsICdBYnMnKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJBZGQoSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhBZGQgY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnQWRkJyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyRGl2aWRlKEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBIRGl2aWRlIGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ0RpdmlkZScpOwogIH0KCiAgdm9pZCByZWdpc3Rlck1vZHVsbyhISW52b2tlRHluYW1pYyBvcmlnaW5hbCwgW0hSZW1haW5kZXIgY29udmVydGVkXSkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ01vZHVsbycsICdEeW5hbWljTW9kdWxvJyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyUmVtYWluZGVyKEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBIUmVtYWluZGVyIGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ1JlbWFpbmRlcicpOwogIH0KCiAgdm9pZCByZWdpc3Rlck11bHRpcGx5KEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBITXVsdGlwbHkgY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnTXVsdGlwbHknKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTdWJ0cmFjdChISW52b2tlRHluYW1pYyBvcmlnaW5hbCwgSFN1YnRyYWN0IGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ1N1YnRyYWN0Jyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyVHJ1bmNhdGluZ0RpdmlkZSgKICAgICAgSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhUcnVuY2F0aW5nRGl2aWRlIGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ1RydW5jYXRpbmdEaXZpZGUnLAogICAgICAgICdUcnVuY2F0aW5nRGl2aWRlLiR7b3JpZ2luYWwuc2VsZWN0b3IubmFtZX0nKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTaGlmdExlZnQoSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhTaGlmdExlZnQgY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnU2hpZnRMZWZ0JywKICAgICAgICAnU2hpZnRMZWZ0LiR7b3JpZ2luYWwuc2VsZWN0b3IubmFtZX0nKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTaGlmdFJpZ2h0KEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBIU2hpZnRSaWdodCBjb252ZXJ0ZWQpIHsKICAgIF9yZWdpc3RlclNwZWNpYWxpemVyKG9yaWdpbmFsLCBjb252ZXJ0ZWQsICdTaGlmdFJpZ2h0JywKICAgICAgICAnU2hpZnRSaWdodC4ke29yaWdpbmFsLnNlbGVjdG9yLm5hbWV9Jyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQml0T3IoSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhCaXRPciBjb252ZXJ0ZWQpIHsKICAgIF9yZWdpc3RlclNwZWNpYWxpemVyKG9yaWdpbmFsLCBjb252ZXJ0ZWQsICdCaXRPcicpOwogIH0KCiAgdm9pZCByZWdpc3RlckJpdEFuZChISW52b2tlRHluYW1pYyBvcmlnaW5hbCwgSEJpdEFuZCBjb252ZXJ0ZWQpIHsKICAgIF9yZWdpc3RlclNwZWNpYWxpemVyKG9yaWdpbmFsLCBjb252ZXJ0ZWQsICdCaXRBbmQnKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJCaXRYb3IoSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhCaXRYb3IgY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnQml0WG9yJyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyRXF1YWxzKEhJbnZva2VEeW5hbWljIG9yaWdpbmFsLCBISWRlbnRpdHkgY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnRXF1YWxzJyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyTGVzcyhISW52b2tlRHluYW1pYyBvcmlnaW5hbCwgSExlc3MgY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnTGVzcycpOwogIH0KCiAgdm9pZCByZWdpc3RlckdyZWF0ZXIoSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhHcmVhdGVyIGNvbnZlcnRlZCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIGNvbnZlcnRlZCwgJ0dyZWF0ZXInKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJMZXNzRXF1YWwoSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIEhMZXNzRXF1YWwgY29udmVydGVkKSB7CiAgICBfcmVnaXN0ZXJTcGVjaWFsaXplcihvcmlnaW5hbCwgY29udmVydGVkLCAnTGVzc0VxdWFscycpOwogIH0KCiAgdm9pZCByZWdpc3RlckdyZWF0ZXJFcXVhbChISW52b2tlRHluYW1pYyBvcmlnaW5hbCwgSEdyZWF0ZXJFcXVhbCBjb252ZXJ0ZWQpIHsKICAgIF9yZWdpc3RlclNwZWNpYWxpemVyKG9yaWdpbmFsLCBjb252ZXJ0ZWQsICdHcmVhdGVyRXF1YWxzJyk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyQ29kZVVuaXRBdChISW52b2tlRHluYW1pYyBvcmlnaW5hbCkgewogICAgRmVhdHVyZXMgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZXMoKTsKICAgIGZlYXR1cmVzWyduYW1lJ10gPSBvcmlnaW5hbC5zZWxlY3Rvci5uYW1lOwogICAgZW50cmllcy5hZGQobmV3IE9wdGltaXphdGlvbkxvZ0VudHJ5KCdDb2RlVW5pdEF0JywgZmVhdHVyZXMpKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJDb21wYXJlVG8oSEludm9rZUR5bmFtaWMgb3JpZ2luYWwsIFtIQ29uc3RhbnQgY29udmVydGVkXSkgewogICAgRmVhdHVyZXMgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZXMoKTsKICAgIGlmIChjb252ZXJ0ZWQgIT0gbnVsbCkgewogICAgICBmZWF0dXJlc1snY29uc3RhbnQnXSA9IGNvbnZlcnRlZC5jb25zdGFudC50b0RhcnRUZXh0KCk7CiAgICB9CiAgICBlbnRyaWVzLmFkZChuZXcgT3B0aW1pemF0aW9uTG9nRW50cnkoJ0NvbXBhcmVUbycsIGZlYXR1cmVzKSk7CiAgfQoKICB2b2lkIHJlZ2lzdGVyU3Vic3RyaW5nKEhJbnZva2VEeW5hbWljIG9yaWdpbmFsKSB7CiAgICBGZWF0dXJlcyBmZWF0dXJlcyA9IG5ldyBGZWF0dXJlcygpOwogICAgZW50cmllcy5hZGQobmV3IE9wdGltaXphdGlvbkxvZ0VudHJ5KCdTdWJzdHJpbmcnLCBmZWF0dXJlcykpOwogIH0KCiAgdm9pZCByZWdpc3RlclRyaW0oSEludm9rZUR5bmFtaWMgb3JpZ2luYWwpIHsKICAgIEZlYXR1cmVzIGZlYXR1cmVzID0gbmV3IEZlYXR1cmVzKCk7CiAgICBlbnRyaWVzLmFkZChuZXcgT3B0aW1pemF0aW9uTG9nRW50cnkoJ1RyaW0nLCBmZWF0dXJlcykpOwogIH0KCiAgdm9pZCByZWdpc3RlclBhdHRlcm5NYXRjaChISW52b2tlRHluYW1pYyBvcmlnaW5hbCkgewogICAgRmVhdHVyZXMgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZXMoKTsKICAgIGVudHJpZXMuYWRkKG5ldyBPcHRpbWl6YXRpb25Mb2dFbnRyeSgnUGF0dGVybk1hdGNoJywgZmVhdHVyZXMpKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJSb3VuZChISW52b2tlRHluYW1pYyBvcmlnaW5hbCkgewogICAgX3JlZ2lzdGVyU3BlY2lhbGl6ZXIob3JpZ2luYWwsIG51bGwsIG51bGwsICdSb3VuZCcpOwogIH0KCiAgdm9pZCByZWdpc3RlclByaW1pdGl2ZUNoZWNrKEhJbnN0cnVjdGlvbiBvcmlnaW5hbCwgSFByaW1pdGl2ZUNoZWNrIGNoZWNrKSB7CiAgICBGZWF0dXJlcyBmZWF0dXJlcyA9IG5ldyBGZWF0dXJlcygpOwoKICAgIGlmIChjaGVjay5pc1JlY2VpdmVyVHlwZUNoZWNrKSB7CiAgICAgIGZlYXR1cmVzWydraW5kJ10gPSAncmVjZWl2ZXInOwogICAgfSBlbHNlIGlmIChjaGVjay5pc0FyZ3VtZW50VHlwZUNoZWNrKSB7CiAgICAgIGZlYXR1cmVzWydraW5kJ10gPSAnYXJndW1lbnQnOwogICAgfQogICAgaWYgKGNoZWNrLnR5cGVFeHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgZmVhdHVyZXNbJ3R5cGUnXSA9ICcke2NoZWNrLnR5cGVFeHByZXNzaW9ufSc7CiAgICB9CiAgICBlbnRyaWVzLmFkZChuZXcgT3B0aW1pemF0aW9uTG9nRW50cnkoJ1ByaW1pdGl2ZUNoZWNrJywgZmVhdHVyZXMpKTsKICB9CgogIFN0cmluZyBnZXRUZXh0KCkgewogICAgcmV0dXJuIGVudHJpZXMuam9pbignLFxuJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnT3B0aW1pemF0aW9uTG9nKCR7Z2V0VGV4dCgpfSknOwp9CgovLy8gQSByZWdpc3RlcmVkIG9wdGltaXphdGlvbi4KY2xhc3MgT3B0aW1pemF0aW9uTG9nRW50cnkgewogIC8vLyBTdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBvcHRpbWl6YXRpb24ga2luZC4KICBmaW5hbCBTdHJpbmcgdGFnOwoKICAvLy8gQWRkaXRpb25hbCBkYXRhIGZvciB0aGlzIG9wdGltaXphdGlvbi4KICBmaW5hbCBGZWF0dXJlcyBmZWF0dXJlczsKCiAgT3B0aW1pemF0aW9uTG9nRW50cnkodGhpcy50YWcsIHRoaXMuZmVhdHVyZXMpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHRhZygke2ZlYXR1cmVzLmdldFRleHQoKX0pJzsKfQqA/QBOTjwBJDYVAS0cKwEvAVAjHRtNIBUIBigROhUEAU4oJRlQDSkGQQQBUCgdGVANNAZBBAFPKCUZUA0pBkIEASFPKEU/SQQBIk8oRT9KBAEhRCI9Tx8cDycICAQBTj4EAUI4BAFEOQQBSTkEAT42BAE+NgQBRDkEAUlKBAFKPAQBSDsEAUg7BAEhPkI3BAFKOzAEAUw8MQQBQjgEAUQ5BAFEOQQBRjkEAUA3BAFGOgQBSj0EAVBABAE1KC9DBAFLKB0+BkIEATQoQgQBLyg9BAE3KEUEATA5BAFOKAElJSwlBig0BkcEARUgBAEMOAIBHx09FAEtGwExAQw2AgElcGFja2FnZTpjb21waWxlci9zcmMvc3NhL2xvZ2dpbmcuZGFydEhzZGtyb290Oi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcGFyc2VyL2xpdGVyYWxfZW50cnlfaW5mb19pbXBsLmRhcnSfyS8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JzsKaW1wb3J0ICdsaXRlcmFsX2VudHJ5X2luZm8uZGFydCc7CmltcG9ydCAncGFyc2VyLmRhcnQnOwppbXBvcnQgJ3V0aWwuZGFydCc7CgovLy8gW2lmQ29uZGl0aW9uXSBpcyB0aGUgZmlyc3Qgc3RlcCBmb3IgcGFyc2luZyBhIGxpdGVyYWwgZW50cnkKLy8vIHN0YXJ0aW5nIHdpdGggYGlmYCBjb250cm9sIGZsb3cuCmNvbnN0IExpdGVyYWxFbnRyeUluZm8gaWZDb25kaXRpb24gPSBjb25zdCBJZkNvbmRpdGlvbigpOwoKLy8vIFtzcHJlYWRPcGVyYXRvcl0gaXMgdGhlIGZpcnN0IHN0ZXAgZm9yIHBhcnNpbmcgYSBsaXRlcmFsIGVudHJ5Ci8vLyBwcmVjZWRlZCBieSBhICcuLi4nIHNwcmVhZCBvcGVyYXRvci4KY29uc3QgTGl0ZXJhbEVudHJ5SW5mbyBzcHJlYWRPcGVyYXRvciA9IGNvbnN0IFNwcmVhZE9wZXJhdG9yKCk7CgovLy8gVGhlIGZpcnN0IHN0ZXAgd2hlbiBwcm9jZXNzaW5nIGEgYGZvcmAgY29udHJvbCBmbG93IGNvbGxlY3Rpb24gZW50cnkuCmNsYXNzIEZvckNvbmRpdGlvbiBleHRlbmRzIExpdGVyYWxFbnRyeUluZm8gewogIGJvb2wgaW5TdHlsZTsKCiAgRm9yQ29uZGl0aW9uKCkgOiBzdXBlcihmYWxzZSwgMCk7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIFRva2VuIGF3YWl0VG9rZW47CiAgICBpZiAob3B0aW9uYWwoJ2F3YWl0JywgbmV4dCkpIHsKICAgICAgYXdhaXRUb2tlbiA9IHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9CiAgICBmaW5hbCBmb3JUb2tlbiA9IG5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2ZvcicsIGZvclRva2VuKSk7CiAgICBwYXJzZXIubGlzdGVuZXIuYmVnaW5Gb3JDb250cm9sRmxvdyhhd2FpdFRva2VuLCBmb3JUb2tlbik7CgogICAgdG9rZW4gPSBwYXJzZXIucGFyc2VGb3JMb29wUGFydHNTdGFydChhd2FpdFRva2VuLCBmb3JUb2tlbik7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRm9yTG9vcFBhcnRzTWlkKHRva2VuLCBhd2FpdFRva2VuLCBmb3JUb2tlbik7CgogICAgaWYgKG9wdGlvbmFsKCdpbicsIHRva2VuLm5leHQpIHx8IG9wdGlvbmFsKCc6JywgdG9rZW4ubmV4dCkpIHsKICAgICAgLy8gUHJvY2VzcyBgZm9yICggLi4uIGluIC4uLiApYAogICAgICBpblN0eWxlID0gdHJ1ZTsKICAgICAgdG9rZW4gPSBwYXJzZXIucGFyc2VGb3JJbkxvb3BQYXJ0c1Jlc3QoCiAgICAgICAgICB0b2tlbiwgYXdhaXRUb2tlbiwgZm9yVG9rZW4sIGlkZW50aWZpZXIpOwogICAgfSBlbHNlIHsKICAgICAgLy8gUHJvY2VzcyBgZm9yICggLi4uIDsgLi4uIDsgLi4uIClgCiAgICAgIGluU3R5bGUgPSBmYWxzZTsKICAgICAgdG9rZW4gPSBwYXJzZXIucGFyc2VGb3JMb29wUGFydHNSZXN0KHRva2VuLCBmb3JUb2tlbiwgYXdhaXRUb2tlbik7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnZm9yJywgbmV4dCkgfHwKICAgICAgICAob3B0aW9uYWwoJ2F3YWl0JywgbmV4dCkgJiYgb3B0aW9uYWwoJ2ZvcicsIG5leHQubmV4dCkpKSB7CiAgICAgIHJldHVybiBuZXcgTmVzdGVkKAogICAgICAgIG5ldyBGb3JDb25kaXRpb24oKSwKICAgICAgICBpblN0eWxlID8gY29uc3QgRm9ySW5Db21wbGV0ZSgpIDogY29uc3QgRm9yQ29tcGxldGUoKSwKICAgICAgKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2lmJywgbmV4dCkpIHsKICAgICAgcmV0dXJuIG5ldyBOZXN0ZWQoCiAgICAgICAgaWZDb25kaXRpb24sCiAgICAgICAgaW5TdHlsZSA/IGNvbnN0IEZvckluQ29tcGxldGUoKSA6IGNvbnN0IEZvckNvbXBsZXRlKCksCiAgICAgICk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCcuLi4nLCBuZXh0KSB8fCBvcHRpb25hbCgnLi4uPycsIG5leHQpKSB7CiAgICAgIHJldHVybiBpblN0eWxlID8gY29uc3QgRm9ySW5TcHJlYWQoKSA6IGNvbnN0IEZvclNwcmVhZCgpOwogICAgfQogICAgcmV0dXJuIGluU3R5bGUgPyBjb25zdCBGb3JJbkVudHJ5KCkgOiBjb25zdCBGb3JFbnRyeSgpOwogIH0KfQoKLy8vIEEgc3RlcCBmb3IgcGFyc2luZyBhIHNwcmVhZCBjb2xsZWN0aW9uCi8vLyBhcyB0aGUgImZvciIgY29udHJvbCBmbG93J3MgZXhwcmVzc2lvbi4KY2xhc3MgRm9yU3ByZWFkIGV4dGVuZHMgU3ByZWFkT3BlcmF0b3IgewogIGNvbnN0IEZvclNwcmVhZCgpOwoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gY29uc3QgRm9yQ29tcGxldGUoKTsKICB9Cn0KCi8vLyBBIHN0ZXAgZm9yIHBhcnNpbmcgYSBzcHJlYWQgY29sbGVjdGlvbgovLy8gYXMgdGhlICJmb3ItaW4iIGNvbnRyb2wgZmxvdydzIGV4cHJlc3Npb24uCmNsYXNzIEZvckluU3ByZWFkIGV4dGVuZHMgU3ByZWFkT3BlcmF0b3IgewogIGNvbnN0IEZvckluU3ByZWFkKCk7CgogIEBvdmVycmlkZQogIExpdGVyYWxFbnRyeUluZm8gY29tcHV0ZU5leHQoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBjb25zdCBGb3JJbkNvbXBsZXRlKCk7CiAgfQp9CgovLy8gQSBzdGVwIGZvciBwYXJzaW5nIGEgbGl0ZXJhbCBsaXN0LCBzZXQsIG9yIG1hcCBlbnRyeQovLy8gYXMgdGhlICJmb3IiIGNvbnRyb2wgZmxvdydzIGV4cHJlc3Npb24uCmNsYXNzIEZvckVudHJ5IGV4dGVuZHMgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgY29uc3QgRm9yRW50cnkoKSA6IHN1cGVyKHRydWUsIDApOwoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gY29uc3QgRm9yQ29tcGxldGUoKTsKICB9Cn0KCi8vLyBBIHN0ZXAgZm9yIHBhcnNpbmcgYSBsaXRlcmFsIGxpc3QsIHNldCwgb3IgbWFwIGVudHJ5Ci8vLyBhcyB0aGUgImZvci1pbiIgY29udHJvbCBmbG93J3MgZXhwcmVzc2lvbi4KY2xhc3MgRm9ySW5FbnRyeSBleHRlbmRzIExpdGVyYWxFbnRyeUluZm8gewogIGNvbnN0IEZvckluRW50cnkoKSA6IHN1cGVyKHRydWUsIDApOwoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gY29uc3QgRm9ySW5Db21wbGV0ZSgpOwogIH0KfQoKY2xhc3MgRm9yQ29tcGxldGUgZXh0ZW5kcyBMaXRlcmFsRW50cnlJbmZvIHsKICBjb25zdCBGb3JDb21wbGV0ZSgpIDogc3VwZXIoZmFsc2UsIDApOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgcGFyc2VyLmxpc3RlbmVyLmVuZEZvckNvbnRyb2xGbG93KHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9Cn0KCmNsYXNzIEZvckluQ29tcGxldGUgZXh0ZW5kcyBMaXRlcmFsRW50cnlJbmZvIHsKICBjb25zdCBGb3JJbkNvbXBsZXRlKCkgOiBzdXBlcihmYWxzZSwgMCk7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBwYXJzZXIubGlzdGVuZXIuZW5kRm9ySW5Db250cm9sRmxvdyh0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQp9CgovLy8gVGhlIGZpcnN0IHN0ZXAgd2hlbiBwcm9jZXNzaW5nIGFuIGBpZmAgY29udHJvbCBmbG93IGNvbGxlY3Rpb24gZW50cnkuCmNsYXNzIElmQ29uZGl0aW9uIGV4dGVuZHMgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgY29uc3QgSWZDb25kaXRpb24oKSA6IHN1cGVyKGZhbHNlLCAxKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2UoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIGZpbmFsIGlmVG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdpZicsIGlmVG9rZW4pKTsKICAgIHBhcnNlci5saXN0ZW5lci5iZWdpbklmQ29udHJvbEZsb3coaWZUb2tlbik7CiAgICBUb2tlbiByZXN1bHQgPSBwYXJzZXIuZW5zdXJlUGFyZW50aGVzaXplZENvbmRpdGlvbihpZlRva2VuKTsKICAgIHBhcnNlci5saXN0ZW5lci5iZWdpblRoZW5Db250cm9sRmxvdyhyZXN1bHQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIExpdGVyYWxFbnRyeUluZm8gY29tcHV0ZU5leHQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCdmb3InLCBuZXh0KSB8fAogICAgICAgIChvcHRpb25hbCgnYXdhaXQnLCBuZXh0KSAmJiBvcHRpb25hbCgnZm9yJywgbmV4dC5uZXh0KSkpIHsKICAgICAgcmV0dXJuIG5ldyBOZXN0ZWQobmV3IEZvckNvbmRpdGlvbigpLCBjb25zdCBJZkNvbXBsZXRlKCkpOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnaWYnLCBuZXh0KSkgewogICAgICByZXR1cm4gbmV3IE5lc3RlZChpZkNvbmRpdGlvbiwgY29uc3QgSWZDb21wbGV0ZSgpKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJy4uLicsIG5leHQpIHx8IG9wdGlvbmFsKCcuLi4/JywgbmV4dCkpIHsKICAgICAgcmV0dXJuIGNvbnN0IElmU3ByZWFkKCk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgSWZFbnRyeSgpOwogIH0KfQoKLy8vIEEgc3RlcCBmb3IgcGFyc2luZyBhIHNwcmVhZCBjb2xsZWN0aW9uCi8vLyBhcyB0aGUgYGlmYCBjb250cm9sIGZsb3cncyB0aGVuLWV4cHJlc3Npb24uCmNsYXNzIElmU3ByZWFkIGV4dGVuZHMgU3ByZWFkT3BlcmF0b3IgewogIGNvbnN0IElmU3ByZWFkKCk7CgogIEBvdmVycmlkZQogIExpdGVyYWxFbnRyeUluZm8gY29tcHV0ZU5leHQoVG9rZW4gdG9rZW4pID0+IGNvbnN0IElmQ29tcGxldGUoKTsKfQoKLy8vIEEgc3RlcCBmb3IgcGFyc2luZyBhIGxpdGVyYWwgbGlzdCwgc2V0LCBvciBtYXAgZW50cnkKLy8vIGFzIHRoZSBgaWZgIGNvbnRyb2wgZmxvdydzIHRoZW4tZXhwcmVzc2lvbi4KY2xhc3MgSWZFbnRyeSBleHRlbmRzIExpdGVyYWxFbnRyeUluZm8gewogIGNvbnN0IElmRW50cnkoKSA6IHN1cGVyKHRydWUsIDApOwoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSA9PiBjb25zdCBJZkNvbXBsZXRlKCk7Cn0KCmNsYXNzIElmQ29tcGxldGUgZXh0ZW5kcyBMaXRlcmFsRW50cnlJbmZvIHsKICBjb25zdCBJZkNvbXBsZXRlKCkgOiBzdXBlcihmYWxzZSwgMCk7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBpZiAoIW9wdGlvbmFsKCdlbHNlJywgdG9rZW4ubmV4dCkpIHsKICAgICAgcGFyc2VyLmxpc3RlbmVyLmVuZElmQ29udHJvbEZsb3codG9rZW4pOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG9wdGlvbmFsKCdlbHNlJywgdG9rZW4ubmV4dCkgPyBjb25zdCBJZkVsc2UoKSA6IG51bGw7CiAgfQp9CgovLy8gQSBzdGVwIGZvciBwYXJzaW5nIHRoZSBgZWxzZWAgcG9ydGlvbiBvZiBhbiBgaWZgIGNvbnRyb2wgZmxvdy4KY2xhc3MgSWZFbHNlIGV4dGVuZHMgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgY29uc3QgSWZFbHNlKCkgOiBzdXBlcihmYWxzZSwgLTEpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gZWxzZVRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnZWxzZScsIGVsc2VUb2tlbikpOwogICAgcGFyc2VyLmxpc3RlbmVyLmhhbmRsZUVsc2VDb250cm9sRmxvdyhlbHNlVG9rZW4pOwogICAgcmV0dXJuIGVsc2VUb2tlbjsKICB9CgogIEBvdmVycmlkZQogIExpdGVyYWxFbnRyeUluZm8gY29tcHV0ZU5leHQoVG9rZW4gdG9rZW4pIHsKICAgIGFzc2VydChvcHRpb25hbCgnZWxzZScsIHRva2VuKSk7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnZm9yJywgbmV4dCkgfHwKICAgICAgICAob3B0aW9uYWwoJ2F3YWl0JywgbmV4dCkgJiYgb3B0aW9uYWwoJ2ZvcicsIG5leHQubmV4dCkpKSB7CiAgICAgIHJldHVybiBuZXcgTmVzdGVkKG5ldyBGb3JDb25kaXRpb24oKSwgY29uc3QgSWZFbHNlQ29tcGxldGUoKSk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdpZicsIG5leHQpKSB7CiAgICAgIHJldHVybiBuZXcgTmVzdGVkKGlmQ29uZGl0aW9uLCBjb25zdCBJZkVsc2VDb21wbGV0ZSgpKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJy4uLicsIG5leHQpIHx8IG9wdGlvbmFsKCcuLi4/JywgbmV4dCkpIHsKICAgICAgcmV0dXJuIGNvbnN0IEVsc2VTcHJlYWQoKTsKICAgIH0KICAgIHJldHVybiBjb25zdCBFbHNlRW50cnkoKTsKICB9Cn0KCmNsYXNzIEVsc2VTcHJlYWQgZXh0ZW5kcyBTcHJlYWRPcGVyYXRvciB7CiAgY29uc3QgRWxzZVNwcmVhZCgpOwoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gY29uc3QgSWZFbHNlQ29tcGxldGUoKTsKICB9Cn0KCmNsYXNzIEVsc2VFbnRyeSBleHRlbmRzIExpdGVyYWxFbnRyeUluZm8gewogIGNvbnN0IEVsc2VFbnRyeSgpIDogc3VwZXIodHJ1ZSwgMCk7CgogIEBvdmVycmlkZQogIExpdGVyYWxFbnRyeUluZm8gY29tcHV0ZU5leHQoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBjb25zdCBJZkVsc2VDb21wbGV0ZSgpOwogIH0KfQoKY2xhc3MgSWZFbHNlQ29tcGxldGUgZXh0ZW5kcyBMaXRlcmFsRW50cnlJbmZvIHsKICBjb25zdCBJZkVsc2VDb21wbGV0ZSgpIDogc3VwZXIoZmFsc2UsIDApOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgcGFyc2VyLmxpc3RlbmVyLmVuZElmRWxzZUNvbnRyb2xGbG93KHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9Cn0KCi8vLyBUaGUgZmlyc3Qgc3RlcCB3aGVuIHByb2Nlc3NpbmcgYSBzcHJlYWQgZW50cnkuCmNsYXNzIFNwcmVhZE9wZXJhdG9yIGV4dGVuZHMgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgY29uc3QgU3ByZWFkT3BlcmF0b3IoKSA6IHN1cGVyKGZhbHNlLCAwKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2UoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIGZpbmFsIG9wZXJhdG9yID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnLi4uJywgb3BlcmF0b3IpIHx8IG9wdGlvbmFsKCcuLi4/Jywgb3BlcmF0b3IpKTsKICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbihvcGVyYXRvcik7CiAgICBwYXJzZXIubGlzdGVuZXIuaGFuZGxlU3ByZWFkRXhwcmVzc2lvbihvcGVyYXRvcik7CiAgICByZXR1cm4gdG9rZW47CiAgfQp9CgpjbGFzcyBOZXN0ZWQgZXh0ZW5kcyBMaXRlcmFsRW50cnlJbmZvIHsKICBMaXRlcmFsRW50cnlJbmZvIG5lc3RlZFN0ZXA7CiAgZmluYWwgTGl0ZXJhbEVudHJ5SW5mbyBsYXN0U3RlcDsKCiAgTmVzdGVkKHRoaXMubmVzdGVkU3RlcCwgdGhpcy5sYXN0U3RlcCkgOiBzdXBlcihmYWxzZSwgMCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGhhc0VudHJ5ID0+IG5lc3RlZFN0ZXAuaGFzRW50cnk7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PiBuZXN0ZWRTdGVwLnBhcnNlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSB7CiAgICBuZXN0ZWRTdGVwID0gbmVzdGVkU3RlcC5jb21wdXRlTmV4dCh0b2tlbik7CiAgICByZXR1cm4gbmVzdGVkU3RlcCAhPSBudWxsID8gdGhpcyA6IGxhc3RTdGVwOwogIH0KfQqBIwBNTjwBIyIWFAFAJToBQylAAUouEAEkAQwsHRYjIRkGGyc/AUEjRgFDJhYuNA0rF0kGEgQBDC4dIUMZHD8JJxkVPwlCQAY8BAIBKywpFQEMLiAEAgErLysXAQwuIgQCATksKiUBDC4gBAIBOS8sJwEMLiIEAgEtKQEMLC4SBAIBLysBDCwwEgQCAUotKQEMLCAlMUEyEwQBDC4dIUNBJzpCHwYcBAIBKzAoFAEMQwIBOTApJAEMQwIBLCgBDCwpLwYSBAEMLkEEAgFDKCUBDCwiKTYWBAEMLiUdIUNFJz5CIQYeBAIBKhYBDC4jBAIBKyYBDC4jBAIBMCwBDCwxEgQCATMwLAEMLCFFLjYSBAIBKB8jATwBDCwBDE4BDC4wMQQCAT9wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2xpdGVyYWxfZW50cnlfaW5mb19pbXBsLmRhcnQ/c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3BhcnNlci90eXBlX2luZm9faW1wbC5kYXJ0wACNjy8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnBhcnNlci50eXBlX2luZm9faW1wbDsKCmltcG9ydCAnLi4vLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFN5bnRoZXRpY1Rva2VuLCBUb2tlbiwgVG9rZW5UeXBlOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBhcyBmYXN0YTsKCmltcG9ydCAnLi4vc2Nhbm5lci90b2tlbl9jb25zdGFudHMuZGFydCcgc2hvdyBJREVOVElGSUVSX1RPS0VOOwoKaW1wb3J0ICcuLi91dGlsL2xpbmsuZGFydCcgc2hvdyBMaW5rOwoKaW1wb3J0ICdmb3J3YXJkaW5nX2xpc3RlbmVyLmRhcnQnIHNob3cgRm9yd2FyZGluZ0xpc3RlbmVyOwoKaW1wb3J0ICdpZGVudGlmaWVyX2NvbnRleHQuZGFydCcgc2hvdyBJZGVudGlmaWVyQ29udGV4dDsKCmltcG9ydCAnbWVtYmVyX2tpbmQuZGFydCcgc2hvdyBNZW1iZXJLaW5kOwoKaW1wb3J0ICdsaXN0ZW5lci5kYXJ0JyBzaG93IExpc3RlbmVyOwoKaW1wb3J0ICdwYXJzZXIuZGFydCcgc2hvdyBQYXJzZXI7CgppbXBvcnQgJ3R5cGVfaW5mby5kYXJ0JzsKCmltcG9ydCAndXRpbC5kYXJ0JwogICAgc2hvdwogICAgICAgIG9wdGlvbmFsLAogICAgICAgIHNraXBNZXRhZGF0YSwKICAgICAgICBzcGxpdEd0RXEsCiAgICAgICAgc3BsaXRHdEZyb21HdEd0RXEsCiAgICAgICAgc3BsaXRHdEZyb21HdEd0R3QsCiAgICAgICAgc3BsaXRHdEZyb21HdEd0R3RFcSwKICAgICAgICBzcGxpdEd0R3QsCiAgICAgICAgc3ludGhldGljR3Q7CgovLy8gW1NpbXBsZVR5cGVdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVJbmZvXSByZXR1cm5lZCBieSBbY29tcHV0ZVR5cGVdCi8vLyB3aGVuIHRoZXJlIGlzIGEgc2luZ2xlIGlkZW50aWZpZXIgYXMgdGhlIHR5cGUgcmVmZXJlbmNlLgpjb25zdCBUeXBlSW5mbyBzaW1wbGVUeXBlID0gY29uc3QgU2ltcGxlVHlwZSgpOwoKLy8vIFtTaW1wbGVOdWxsYWJsZVR5cGVdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVJbmZvXSByZXR1cm5lZCBieSBbY29tcHV0ZVR5cGVdCi8vLyB3aGVuIHRoZXJlIGlzIGEgc2luZ2xlIGlkZW50aWZpZXIgZm9sbG93ZWQgYnkgYD9gIGFzIHRoZSB0eXBlIHJlZmVyZW5jZS4KY29uc3QgVHlwZUluZm8gc2ltcGxlTnVsbGFibGVUeXBlID0gY29uc3QgU2ltcGxlTnVsbGFibGVUeXBlKCk7CgovLy8gW1ByZWZpeGVkVHlwZV0gaXMgYSBzcGVjaWFsaXplZCBbVHlwZUluZm9dIHJldHVybmVkIGJ5IFtjb21wdXRlVHlwZV0KLy8vIHdoZW4gdGhlIHR5cGUgcmVmZXJlbmNlIGlzIG9mIHRoZSBmb3JtOiBpZGVudGlmaWVyIGAuYCBpZGVudGlmaWVyLgpjb25zdCBUeXBlSW5mbyBwcmVmaXhlZFR5cGUgPSBjb25zdCBQcmVmaXhlZFR5cGUoKTsKCi8vLyBbU2ltcGxlVHlwZVdpdGgxQXJndW1lbnRdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVJbmZvXSByZXR1cm5lZCBieQovLy8gW2NvbXB1dGVUeXBlXSB3aGVuIHRoZSB0eXBlIHJlZmVyZW5jZSBpcyBvZiB0aGUgZm9ybToKLy8vIGlkZW50aWZpZXIgYDxgIGlkZW50aWZpZXIgYD5gLgpjb25zdCBUeXBlSW5mbyBzaW1wbGVUeXBlV2l0aDFBcmd1bWVudCA9CiAgICBjb25zdCBTaW1wbGVUeXBlV2l0aDFBcmd1bWVudChzaW1wbGVUeXBlQXJndW1lbnQxKTsKCi8vLyBbU2ltcGxlVHlwZVdpdGgxQXJndW1lbnRdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVJbmZvXSByZXR1cm5lZCBieQovLy8gW2NvbXB1dGVUeXBlXSB3aGVuIHRoZSB0eXBlIHJlZmVyZW5jZSBpcyBvZiB0aGUgZm9ybToKLy8vIGlkZW50aWZpZXIgYDxgIGlkZW50aWZpZXIgYD49YC4KY29uc3QgVHlwZUluZm8gc2ltcGxlVHlwZVdpdGgxQXJndW1lbnRHdEVxID0KICAgIGNvbnN0IFNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50KHNpbXBsZVR5cGVBcmd1bWVudDFHdEVxKTsKCi8vLyBbU2ltcGxlVHlwZVdpdGgxQXJndW1lbnRdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVJbmZvXSByZXR1cm5lZCBieQovLy8gW2NvbXB1dGVUeXBlXSB3aGVuIHRoZSB0eXBlIHJlZmVyZW5jZSBpcyBvZiB0aGUgZm9ybToKLy8vIGlkZW50aWZpZXIgYDxgIGlkZW50aWZpZXIgYD4+YC4KY29uc3QgVHlwZUluZm8gc2ltcGxlVHlwZVdpdGgxQXJndW1lbnRHdEd0ID0KICAgIGNvbnN0IFNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50KHNpbXBsZVR5cGVBcmd1bWVudDFHdEd0KTsKCi8vLyBbU2ltcGxlTnVsbGFibGVUeXBlV2l0aDFBcmd1bWVudF0gaXMgYSBzcGVjaWFsaXplZCBbVHlwZUluZm9dIHJldHVybmVkIGJ5Ci8vLyBbY29tcHV0ZVR5cGVdIHdoZW4gdGhlIHR5cGUgcmVmZXJlbmNlIGlzIG9mIHRoZSBmb3JtOgovLy8gaWRlbnRpZmllciBgPGAgaWRlbnRpZmllciBgPmAgYD9gLgpjb25zdCBUeXBlSW5mbyBzaW1wbGVOdWxsYWJsZVR5cGVXaXRoMUFyZ3VtZW50ID0KICAgIGNvbnN0IFNpbXBsZU51bGxhYmxlVHlwZVdpdGgxQXJndW1lbnQoKTsKCi8vLyBbU2ltcGxlVHlwZUFyZ3VtZW50MV0gaXMgYSBzcGVjaWFsaXplZCBbVHlwZVBhcmFtT3JBcmdJbmZvXSByZXR1cm5lZCBieQovLy8gW2NvbXB1dGVUeXBlUGFyYW1PckFyZ10gd2hlbiB0aGUgdHlwZSByZWZlcmVuY2UgaXMgb2YgdGhlIGZvcm06Ci8vLyBgPGAgaWRlbnRpZmllciBgPmAuCmNvbnN0IFR5cGVQYXJhbU9yQXJnSW5mbyBzaW1wbGVUeXBlQXJndW1lbnQxID0gY29uc3QgU2ltcGxlVHlwZUFyZ3VtZW50MSgpOwoKLy8vIFtTaW1wbGVUeXBlQXJndW1lbnQxXSBpcyBhIHNwZWNpYWxpemVkIFtUeXBlUGFyYW1PckFyZ0luZm9dIHJldHVybmVkIGJ5Ci8vLyBbY29tcHV0ZVR5cGVQYXJhbU9yQXJnXSB3aGVuIHRoZSB0eXBlIHJlZmVyZW5jZSBpcyBvZiB0aGUgZm9ybToKLy8vIGA8YCBpZGVudGlmaWVyIGA+PWAuCmNvbnN0IFR5cGVQYXJhbU9yQXJnSW5mbyBzaW1wbGVUeXBlQXJndW1lbnQxR3RFcSA9CiAgICBjb25zdCBTaW1wbGVUeXBlQXJndW1lbnQxR3RFcSgpOwoKLy8vIFtTaW1wbGVUeXBlQXJndW1lbnQxXSBpcyBhIHNwZWNpYWxpemVkIFtUeXBlUGFyYW1PckFyZ0luZm9dIHJldHVybmVkIGJ5Ci8vLyBbY29tcHV0ZVR5cGVQYXJhbU9yQXJnXSB3aGVuIHRoZSB0eXBlIHJlZmVyZW5jZSBpcyBvZiB0aGUgZm9ybToKLy8vIGA8YCBpZGVudGlmaWVyIGA+PmAuCmNvbnN0IFR5cGVQYXJhbU9yQXJnSW5mbyBzaW1wbGVUeXBlQXJndW1lbnQxR3RHdCA9CiAgICBjb25zdCBTaW1wbGVUeXBlQXJndW1lbnQxR3RHdCgpOwoKLy8vIFNlZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBbbm9UeXBlXSBjb25zdC4KY2xhc3MgTm9UeXBlIGltcGxlbWVudHMgVHlwZUluZm8gewogIGNvbnN0IE5vVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZSA9PiB0aGlzOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBjb3VsZEJlRXhwcmVzc2lvbiA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsYWJsZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgIHRva2VuLm5leHQsIGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRUeXBlKTsKICAgIHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuKTsKICAgIHJldHVybiBzaW1wbGVUeXBlLnBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZVR5cGVPclZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIGVuc3VyZVR5cGVOb3RWb2lkKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGVOb3RWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgcGFyc2VyLmxpc3RlbmVyLmhhbmRsZU5vVHlwZSh0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBza2lwVHlwZShUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIHRva2VuOwogIH0KfQoKLy8vIFNlZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBbcHJlZml4ZWRUeXBlXSBjb25zdC4KY2xhc3MgUHJlZml4ZWRUeXBlIGltcGxlbWVudHMgVHlwZUluZm8gewogIGNvbnN0IFByZWZpeGVkVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZSA9PiB0aGlzOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBjb3VsZEJlRXhwcmVzc2lvbiA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc051bGxhYmxlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlTm90Vm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4KICAgICAgcGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlT3JWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIHBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VUeXBlKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBzdGFydCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydCh0b2tlbi5pc0tleXdvcmRPcklkZW50aWZpZXIpOwogICAgTGlzdGVuZXIgbGlzdGVuZXIgPSBwYXJzZXIubGlzdGVuZXI7CiAgICBsaXN0ZW5lci5oYW5kbGVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5wcmVmaXhlZFR5cGVSZWZlcmVuY2UpOwoKICAgIFRva2VuIHBlcmlvZCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnLicsIHRva2VuKSk7CgogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KHRva2VuLmlzS2V5d29yZE9ySWRlbnRpZmllcik7CiAgICBsaXN0ZW5lci5oYW5kbGVJZGVudGlmaWVyKAogICAgICAgIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC50eXBlUmVmZXJlbmNlQ29udGludWF0aW9uKTsKICAgIGxpc3RlbmVyLmhhbmRsZVF1YWxpZmllZChwZXJpb2QpOwoKICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZUFyZ3VtZW50cyh0b2tlbi5uZXh0KTsKICAgIGxpc3RlbmVyLmhhbmRsZVR5cGUoc3RhcnQsIG51bGwpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2tpcFR5cGUoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiB0b2tlbi5uZXh0Lm5leHQubmV4dDsKICB9Cn0KCi8vLyBTZWUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgW3NpbXBsZU51bGxhYmxlVHlwZVdpdGgxQXJndW1lbnRdIGNvbnN0LgpjbGFzcyBTaW1wbGVOdWxsYWJsZVR5cGVXaXRoMUFyZ3VtZW50IGV4dGVuZHMgU2ltcGxlVHlwZVdpdGgxQXJndW1lbnQgewogIGNvbnN0IFNpbXBsZU51bGxhYmxlVHlwZVdpdGgxQXJndW1lbnQoKSA6IHN1cGVyKHNpbXBsZVR5cGVBcmd1bWVudDEpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZSA9PiBzaW1wbGVUeXBlV2l0aDFBcmd1bWVudDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsYWJsZSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGVSZXN0KFRva2VuIHN0YXJ0LCBUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc/JywgdG9rZW4pKTsKICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVUeXBlKHN0YXJ0LCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBza2lwVHlwZShUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSBzdXBlci5za2lwVHlwZSh0b2tlbikubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPycsIHRva2VuKSk7CiAgICByZXR1cm4gdG9rZW47CiAgfQp9CgovLy8gU2VlIGRvY3VtZW50YXRpb24gb24gdGhlIFtzaW1wbGVUeXBlV2l0aDFBcmd1bWVudF0gY29uc3QuCmNsYXNzIFNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50IGltcGxlbWVudHMgVHlwZUluZm8gewogIGZpbmFsIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlQXJnOwoKICBjb25zdCBTaW1wbGVUeXBlV2l0aDFBcmd1bWVudCh0aGlzLnR5cGVBcmcpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZSA9PiB0aGlzOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBjb3VsZEJlRXhwcmVzc2lvbiA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsYWJsZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIHBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlVHlwZU9yVm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4KICAgICAgcGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGVOb3RWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gc3RhcnQgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQodG9rZW4uaXNLZXl3b3JkT3JJZGVudGlmaWVyKTsKICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC50eXBlUmVmZXJlbmNlKTsKICAgIHRva2VuID0gdHlwZUFyZy5wYXJzZUFyZ3VtZW50cyh0b2tlbiwgcGFyc2VyKTsKICAgIHJldHVybiBwYXJzZVR5cGVSZXN0KHN0YXJ0LCB0b2tlbiwgcGFyc2VyKTsKICB9CgogIFRva2VuIHBhcnNlVHlwZVJlc3QoVG9rZW4gc3RhcnQsIFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBwYXJzZXIubGlzdGVuZXIuaGFuZGxlVHlwZShzdGFydCwgbnVsbCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBza2lwVHlwZShUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KHRva2VuLmlzS2V5d29yZE9ySWRlbnRpZmllcik7CiAgICByZXR1cm4gdHlwZUFyZy5za2lwKHRva2VuKTsKICB9Cn0KCi8vLyBTZWUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgW3NpbXBsZU51bGxhYmxlVHlwZV0gY29uc3QuCmNsYXNzIFNpbXBsZU51bGxhYmxlVHlwZSBleHRlbmRzIFNpbXBsZVR5cGUgewogIGNvbnN0IFNpbXBsZU51bGxhYmxlVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZSA9PiBzaW1wbGVUeXBlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc051bGxhYmxlID0+IHRydWU7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZVJlc3QoVG9rZW4gc3RhcnQsIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIHRva2VuID0gc3RhcnQubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPycsIHRva2VuKSk7CiAgICBwYXJzZXIubGlzdGVuZXIuaGFuZGxlVHlwZShzdGFydCwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2tpcFR5cGUoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiB0b2tlbi5uZXh0Lm5leHQ7CiAgfQp9CgovLy8gU2VlIGRvY3VtZW50YXRpb24gb24gdGhlIFtzaW1wbGVUeXBlXSBjb25zdC4KY2xhc3MgU2ltcGxlVHlwZSBpbXBsZW1lbnRzIFR5cGVJbmZvIHsKICBjb25zdCBTaW1wbGVUeXBlKCk7CgogIEBvdmVycmlkZQogIFR5cGVJbmZvIGdldCBhc05vbk51bGxhYmxlID0+IHRoaXM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGNvdWxkQmVFeHByZXNzaW9uID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTnVsbGFibGUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZVR5cGVOb3RWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZVR5cGVPclZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIHBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VUeXBlTm90Vm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4KICAgICAgcGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGUoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpc1ZhbGlkVHlwZVJlZmVyZW5jZSh0b2tlbikpOwogICAgcGFyc2VyLmxpc3RlbmVyLmhhbmRsZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LnR5cGVSZWZlcmVuY2UpOwogICAgdG9rZW4gPSBub1R5cGVQYXJhbU9yQXJnLnBhcnNlQXJndW1lbnRzKHRva2VuLCBwYXJzZXIpOwogICAgcmV0dXJuIHBhcnNlVHlwZVJlc3QodG9rZW4sIHBhcnNlcik7CiAgfQoKICBUb2tlbiBwYXJzZVR5cGVSZXN0KFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBwYXJzZXIubGlzdGVuZXIuaGFuZGxlVHlwZSh0b2tlbiwgbnVsbCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBza2lwVHlwZShUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIHRva2VuLm5leHQ7CiAgfQp9CgovLy8gU2VlIGRvY3VtZW50YXRpb24gb24gdGhlIFt2b2lkVHlwZV0gY29uc3QuCmNsYXNzIFZvaWRUeXBlIGltcGxlbWVudHMgVHlwZUluZm8gewogIGNvbnN0IFZvaWRUeXBlKCk7CgogIEBvdmVycmlkZQogIFR5cGVJbmZvIGdldCBhc05vbk51bGxhYmxlID0+IHRoaXM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGNvdWxkQmVFeHByZXNzaW9uID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc051bGxhYmxlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlTm90Vm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgLy8gUmVwb3J0IGFuIGVycm9yLCB0aGVuIHBhcnNlIGB2b2lkYCBhcyBpZiBpdCB3ZXJlIGEgdHlwZSBuYW1lLgogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4ubmV4dCwgZmFzdGEubWVzc2FnZUludmFsaWRWb2lkKTsKICAgIHJldHVybiBzaW1wbGVUeXBlLnBhcnNlVHlwZU5vdFZvaWQodG9rZW4sIHBhcnNlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlT3JWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIGVuc3VyZVR5cGVOb3RWb2lkKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGUoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVWb2lkS2V5d29yZCh0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBza2lwVHlwZShUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIHRva2VuLm5leHQ7CiAgfQp9Cgpib29sIGxvb2tzTGlrZU5hbWUoVG9rZW4gdG9rZW4pID0+CiAgICB0b2tlbi5raW5kID09IElERU5USUZJRVJfVE9LRU4gfHwKICAgIG9wdGlvbmFsKCd0aGlzJywgdG9rZW4pIHx8CiAgICAodG9rZW4uaXNJZGVudGlmaWVyICYmCiAgICAgICAgLy8gQWx0aG91Z2ggYHR5cGVkZWZgIGlzIGEgbGVnYWwgaWRlbnRpZmllciwKICAgICAgICAvLyB0eXBlIGB0eXBlZGVmYCBpZGVudGlmaWVyIGlzIG5vdCBsZWdhbCBhbmQgaW4gdGhpcyBzaXR1YXRpb24KICAgICAgICAvLyBgdHlwZWRlZmAgaXMgcHJvYmFibHkgYSBzZXBhcmF0ZSBkZWNsYXJhdGlvbi4KICAgICAgICAoIW9wdGlvbmFsKCd0eXBlZGVmJywgdG9rZW4pIHx8ICF0b2tlbi5uZXh0LmlzSWRlbnRpZmllcikpOwoKLy8vIFdoZW4gbWlzc2luZyBhIGNvbW1hLCBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHRva2VuIGxvb2tzIGxpa2UgaXQgc2hvdWxkCi8vLyBiZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiBvZiB0eXBlIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLgpib29sIGxvb2tzTGlrZVR5cGVQYXJhbU9yQXJnKGJvb2wgaW5EZWNsYXJhdGlvbiwgVG9rZW4gdG9rZW4pIHsKICBpZiAoaW5EZWNsYXJhdGlvbiAmJiB0b2tlbi5raW5kID09IElERU5USUZJRVJfVE9LRU4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG5leHQua2luZCA9PSBJREVOVElGSUVSX1RPS0VOIHx8CiAgICAgICAgb3B0aW9uYWwoJywnLCBuZXh0KSB8fAogICAgICAgIGlzQ2xvc2VyKG5leHQpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn0KCi8vLyBJbnN0YW5jZXMgb2YgW0NvbXBsZXhUeXBlSW5mb10gYXJlIHJldHVybmVkIGJ5IFtjb21wdXRlVHlwZV0gdG8gcmVwcmVzZW50Ci8vLyB0eXBlIHJlZmVyZW5jZXMgdGhhdCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYnkgdGhlIGNvbnN0YW50cyBhYm92ZS4KY2xhc3MgQ29tcGxleFR5cGVJbmZvIGltcGxlbWVudHMgVHlwZUluZm8gewogIC8vLyBUaGUgZmlyc3QgdG9rZW4gaW4gdGhlIHR5cGUgcmVmZXJlbmNlLgogIFRva2VuIHN0YXJ0OwoKICAvLy8gVHlwZSBhcmd1bWVudHMgd2VyZSBzZWVuIGR1cmluZyBhbmFseXNpcy4KICBmaW5hbCBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZUFyZ3VtZW50czsKCiAgLy8vIFRoZSB0b2tlbiBiZWZvcmUgdGhlIHRyYWlsaW5nIHF1ZXN0aW9uIG1hcmsgb3IgYG51bGxgIGlmIGVpdGhlcgogIC8vLyAxKSB0aGVyZSBpcyBubyB0cmFpbGluZyBxdWVzdGlvbiBtYXJrLCBvcgogIC8vLyAyKSB0aGUgdHJhaWxpbmcgcXVlc3Rpb24gbWFyayBpcyBub3QgcGFydCBvZiB0aGUgdHlwZSByZWZlcmVuY2UuCiAgVG9rZW4gYmVmb3JlUXVlc3Rpb25NYXJrOwoKICAvLy8gVGhlIGxhc3QgdG9rZW4gaW4gdGhlIHR5cGUgcmVmZXJlbmNlLgogIFRva2VuIGVuZDsKCiAgLy8vIFRoZSBgRnVuY3Rpb25gIHRva2VucyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHR5cGUgdmFyaWFibGVzIG9mIGZ1bmN0aW9uIHR5cGVzCiAgLy8vIGFzIHNlZW4gZHVyaW5nIGFuYWx5c2lzLgogIExpbms8VG9rZW4+IHR5cGVWYXJpYWJsZVN0YXJ0ZXJzID0gY29uc3QgTGluazxUb2tlbj4oKTsKCiAgLy8vIElmIHRoZSByZWNlaXZlciByZXByZXNlbnRzIGEgZ2VuZXJhbGl6ZWQgZnVuY3Rpb24gdHlwZSB0aGVuIHRoaXMgaW5kaWNhdGVzCiAgLy8vIHdoZXRoZXIgaXQgaGFzIGEgcmV0dXJuIHR5cGUsIG90aGVyd2lzZSB0aGlzIGlzIGBudWxsYC4KICBib29sIGdmdEhhc1JldHVyblR5cGU7CgogIENvbXBsZXhUeXBlSW5mbyhUb2tlbiBiZWZvcmVTdGFydCwgdGhpcy50eXBlQXJndW1lbnRzKQogICAgICA6IHRoaXMuc3RhcnQgPSBiZWZvcmVTdGFydC5uZXh0IHsKICAgIGFzc2VydCh0eXBlQXJndW1lbnRzICE9IG51bGwpOwogIH0KCiAgQ29tcGxleFR5cGVJbmZvLl9ub25OdWxsYWJsZSh0aGlzLnN0YXJ0LCB0aGlzLnR5cGVBcmd1bWVudHMsIHRoaXMuZW5kLAogICAgICB0aGlzLnR5cGVWYXJpYWJsZVN0YXJ0ZXJzLCB0aGlzLmdmdEhhc1JldHVyblR5cGUpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZSB7CiAgICByZXR1cm4gYmVmb3JlUXVlc3Rpb25NYXJrID09IG51bGwKICAgICAgICA/IHRoaXMKICAgICAgICA6IG5ldyBDb21wbGV4VHlwZUluZm8uX25vbk51bGxhYmxlKHN0YXJ0LCB0eXBlQXJndW1lbnRzLAogICAgICAgICAgICBiZWZvcmVRdWVzdGlvbk1hcmssIHR5cGVWYXJpYWJsZVN0YXJ0ZXJzLCBnZnRIYXNSZXR1cm5UeXBlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGNvdWxkQmVFeHByZXNzaW9uID0+CiAgICAgIHR5cGVBcmd1bWVudHMgPT0gbm9UeXBlUGFyYW1PckFyZyAmJiB0eXBlVmFyaWFibGVTdGFydGVycy5pc0VtcHR5OwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc051bGxhYmxlID0+IGJlZm9yZVF1ZXN0aW9uTWFyayAhPSBudWxsOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlTm90Vm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4KICAgICAgcGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlT3JWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIHBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VUeXBlKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBhc3NlcnQoaWRlbnRpY2FsKHRva2VuLm5leHQsIHN0YXJ0KSk7CgogICAgaWYgKG9wdGlvbmFsKCcuJywgc3RhcnQpKSB7CiAgICAgIC8vIFJlY292ZXJ5OiBJbnNlcnQgbWlzc2luZyBpZGVudGlmaWVyIHdpdGhvdXQgc2VuZGluZyBldmVudHMKICAgICAgc3RhcnQgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcigKICAgICAgICAgIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5wcmVmaXhlZFR5cGVSZWZlcmVuY2UpOwogICAgfQoKICAgIGZpbmFsIHR5cGVWYXJpYWJsZUVuZEdyb3VwcyA9IDxUb2tlbj5bXTsKICAgIGZvciAoTGluazxUb2tlbj4gdCA9IHR5cGVWYXJpYWJsZVN0YXJ0ZXJzOyB0LmlzTm90RW1wdHk7IHQgPSB0LnRhaWwpIHsKICAgICAgdHlwZVZhcmlhYmxlRW5kR3JvdXBzLmFkZCgKICAgICAgICAgIGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0LmhlYWQsIHRydWUpLnBhcnNlVmFyaWFibGVzKHQuaGVhZCwgcGFyc2VyKSk7CiAgICAgIHBhcnNlci5saXN0ZW5lci5iZWdpbkZ1bmN0aW9uVHlwZShzdGFydCk7CiAgICB9CgogICAgaWYgKGdmdEhhc1JldHVyblR5cGUgPT0gZmFsc2UpIHsKICAgICAgLy8gQSBmdW5jdGlvbiB0eXBlIHdpdGhvdXQgcmV0dXJuIHR5cGUuCiAgICAgIC8vIFB1c2ggdGhlIG5vbi1leGlzdGluZyByZXR1cm4gdHlwZSBmaXJzdC4gVGhlIGxvb3AgYmVsb3cgd2lsbAogICAgICAvLyBnZW5lcmF0ZSB0aGUgZnVsbCB0eXBlLgogICAgICBub1R5cGUucGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwogICAgfSBlbHNlIHsKICAgICAgVG9rZW4gdHlwZVJlZk9yUHJlZml4ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCd2b2lkJywgdHlwZVJlZk9yUHJlZml4KSkgewogICAgICAgIHRva2VuID0gdm9pZFR5cGUucGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICghb3B0aW9uYWwoJy4nLCB0eXBlUmVmT3JQcmVmaXgpICYmCiAgICAgICAgICAgICFvcHRpb25hbCgnLicsIHR5cGVSZWZPclByZWZpeC5uZXh0KSkgewogICAgICAgICAgdG9rZW4gPQogICAgICAgICAgICAgIHBhcnNlci5lbnN1cmVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC50eXBlUmVmZXJlbmNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG9rZW4gPSBwYXJzZXIuZW5zdXJlSWRlbnRpZmllcigKICAgICAgICAgICAgICB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQucHJlZml4ZWRUeXBlUmVmZXJlbmNlKTsKICAgICAgICAgIHRva2VuID0gcGFyc2VyLnBhcnNlUXVhbGlmaWVkUmVzdCgKICAgICAgICAgICAgICB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQudHlwZVJlZmVyZW5jZUNvbnRpbnVhdGlvbik7CiAgICAgICAgICBpZiAodG9rZW4uaXNTeW50aGV0aWMgJiYgZW5kID09IHR5cGVSZWZPclByZWZpeC5uZXh0KSB7CiAgICAgICAgICAgIC8vIFJlY292ZXJ5OiBVcGRhdGUgYGVuZGAgaWYgYSBzeW50aGV0aWMgaWRlbnRpZmllciB3YXMgaW5zZXJ0ZWQuCiAgICAgICAgICAgIGVuZCA9IHRva2VuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0b2tlbiA9IHR5cGVBcmd1bWVudHMucGFyc2VBcmd1bWVudHModG9rZW4sIHBhcnNlcik7CgogICAgICAgIC8vIE9ubHkgY29uc3VtZSB0aGUgYD9gIGlmIGl0IGlzIHBhcnQgb2YgdGhlIGNvbXBsZXggdHlwZQogICAgICAgIFRva2VuIHF1ZXN0aW9uTWFyayA9IHRva2VuLm5leHQ7CiAgICAgICAgaWYgKG9wdGlvbmFsKCc/JywgcXVlc3Rpb25NYXJrKSAmJgogICAgICAgICAgICAodHlwZVZhcmlhYmxlRW5kR3JvdXBzLmlzTm90RW1wdHkgfHwgYmVmb3JlUXVlc3Rpb25NYXJrICE9IG51bGwpKSB7CiAgICAgICAgICB0b2tlbiA9IHF1ZXN0aW9uTWFyazsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcXVlc3Rpb25NYXJrID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVUeXBlKHR5cGVSZWZPclByZWZpeCwgcXVlc3Rpb25NYXJrKTsKICAgICAgfQogICAgfQoKICAgIGludCBlbmRHcm91cEluZGV4ID0gdHlwZVZhcmlhYmxlRW5kR3JvdXBzLmxlbmd0aCAtIDE7CiAgICBmb3IgKExpbms8VG9rZW4+IHQgPSB0eXBlVmFyaWFibGVTdGFydGVyczsgdC5pc05vdEVtcHR5OyB0ID0gdC50YWlsKSB7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgYXNzZXJ0KG9wdGlvbmFsKCdGdW5jdGlvbicsIHRva2VuKSk7CiAgICAgIFRva2VuIGZ1bmN0aW9uVG9rZW4gPSB0b2tlbjsKCiAgICAgIGlmIChvcHRpb25hbCgiPCIsIHRva2VuLm5leHQpKSB7CiAgICAgICAgLy8gU2tpcCB0eXBlIHBhcmFtZXRlcnMsIHRoZXkgd2VyZSBwYXJzZWQgYWJvdmUuCiAgICAgICAgdG9rZW4gPSB0eXBlVmFyaWFibGVFbmRHcm91cHNbZW5kR3JvdXBJbmRleF07CiAgICAgICAgYXNzZXJ0KG9wdGlvbmFsKCc+JywgdG9rZW4pKTsKICAgICAgfQogICAgICB0b2tlbiA9IHBhcnNlci5wYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXF1aXJlZE9wdCgKICAgICAgICAgIHRva2VuLCBNZW1iZXJLaW5kLkdlbmVyYWxpemVkRnVuY3Rpb25UeXBlKTsKCiAgICAgIC8vIE9ubHkgY29uc3VtZSB0aGUgYD9gIGlmIGl0IGlzIHBhcnQgb2YgdGhlIGNvbXBsZXggdHlwZQogICAgICBUb2tlbiBxdWVzdGlvbk1hcmsgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJz8nLCBxdWVzdGlvbk1hcmspICYmCiAgICAgICAgICAoZW5kR3JvdXBJbmRleCA+IDAgfHwgYmVmb3JlUXVlc3Rpb25NYXJrICE9IG51bGwpKSB7CiAgICAgICAgdG9rZW4gPSBxdWVzdGlvbk1hcms7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcXVlc3Rpb25NYXJrID0gbnVsbDsKICAgICAgfQoKICAgICAgLS1lbmRHcm91cEluZGV4OwogICAgICBwYXJzZXIubGlzdGVuZXIuZW5kRnVuY3Rpb25UeXBlKGZ1bmN0aW9uVG9rZW4sIHF1ZXN0aW9uTWFyayk7CiAgICB9CgogICAgLy8gVGhlcmUgYXJlIHR3byBzaXR1YXRpb25zIGluIHdoaWNoIHRoZSBbdG9rZW5dICE9IFtlbmRdOgogICAgLy8gVmFsaWQgY29kZTogICAgaWRlbnRpZmllciBgPGAgaWRlbnRpZmllciBgPGAgaWRlbnRpZmllciBgPj5gCiAgICAvLyAgICB3aGVyZSBgPj5gIGlzIHJlcGxhY2VkIGJ5IHR3byB0b2tlbnMuCiAgICAvLyBJbnZhbGlkIGNvZGU6ICBpZGVudGlmaWVyIGA8YCBpZGVudGlmaWVyIGlkZW50aWZpZXIgYD5gCiAgICAvLyAgICB3aGVyZSBhIHN5bnRoZXRpYyBgPmAgaXMgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgaWRlbnRpZmllcnMuCiAgICBhc3NlcnQoaWRlbnRpY2FsKHRva2VuLCBlbmQpIHx8IG9wdGlvbmFsKCc+JywgdG9rZW4pKTsKCiAgICAvLyBEdXJpbmcgcmVjb3ZlcnksIFt0b2tlbl0gbWF5IGJlIGEgc3ludGhldGljIHRoYXQgd2FzIGluc2VydGVkIGluIHRoZQogICAgLy8gbWlkZGxlIG9mIHRoZSB0eXBlIHJlZmVyZW5jZS4KICAgIGVuZCA9IHRva2VuOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2tpcFR5cGUoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBlbmQ7CiAgfQoKICAvLy8gR2l2ZW4gYEZ1bmN0aW9uYCBub24taWRlbnRpZmllciwgY29tcHV0ZSB0aGUgdHlwZQogIC8vLyBhbmQgcmV0dXJuIHRoZSByZWNlaXZlciBvciBvbmUgb2YgdGhlIFtUeXBlSW5mb10gY29uc3RhbnRzLgogIFR5cGVJbmZvIGNvbXB1dGVOb1R5cGVHRlQoVG9rZW4gYmVmb3JlU3RhcnQsIGJvb2wgcmVxdWlyZWQpIHsKICAgIGFzc2VydChvcHRpb25hbCgnRnVuY3Rpb24nLCBzdGFydCkpOwogICAgYXNzZXJ0KGJlZm9yZVN0YXJ0Lm5leHQgPT0gc3RhcnQpOwoKICAgIGNvbXB1dGVSZXN0KGJlZm9yZVN0YXJ0LCByZXF1aXJlZCk7CiAgICBpZiAoZ2Z0SGFzUmV0dXJuVHlwZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiByZXF1aXJlZCA/IHNpbXBsZVR5cGUgOiBub1R5cGU7CiAgICB9CiAgICBhc3NlcnQoZW5kICE9IG51bGwpOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICAvLy8gR2l2ZW4gdm9pZCBgRnVuY3Rpb25gIG5vbi1pZGVudGlmaWVyLCBjb21wdXRlIHRoZSB0eXBlCiAgLy8vIGFuZCByZXR1cm4gdGhlIHJlY2VpdmVyIG9yIG9uZSBvZiB0aGUgW1R5cGVJbmZvXSBjb25zdGFudHMuCiAgVHlwZUluZm8gY29tcHV0ZVZvaWRHRlQoYm9vbCByZXF1aXJlZCkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCd2b2lkJywgc3RhcnQpKTsKICAgIGFzc2VydChvcHRpb25hbCgnRnVuY3Rpb24nLCBzdGFydC5uZXh0KSk7CgogICAgY29tcHV0ZVJlc3Qoc3RhcnQsIHJlcXVpcmVkKTsKICAgIGlmIChnZnRIYXNSZXR1cm5UeXBlID09IG51bGwpIHsKICAgICAgcmV0dXJuIHZvaWRUeXBlOwogICAgfQogICAgYXNzZXJ0KGVuZCAhPSBudWxsKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgLy8vIEdpdmVuIGlkZW50aWZpZXIgYEZ1bmN0aW9uYCBub24taWRlbnRpZmllciwgY29tcHV0ZSB0aGUgdHlwZQogIC8vLyBhbmQgcmV0dXJuIHRoZSByZWNlaXZlciBvciBvbmUgb2YgdGhlIFtUeXBlSW5mb10gY29uc3RhbnRzLgogIFR5cGVJbmZvIGNvbXB1dGVJZGVudGlmaWVyR0ZUKGJvb2wgcmVxdWlyZWQpIHsKICAgIGFzc2VydChpc1ZhbGlkVHlwZVJlZmVyZW5jZShzdGFydCkpOwogICAgYXNzZXJ0KG9wdGlvbmFsKCdGdW5jdGlvbicsIHN0YXJ0Lm5leHQpKTsKCiAgICBjb21wdXRlUmVzdChzdGFydCwgcmVxdWlyZWQpOwogICAgaWYgKGdmdEhhc1JldHVyblR5cGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gc2ltcGxlVHlwZTsKICAgIH0KICAgIGFzc2VydChlbmQgIT0gbnVsbCk7CiAgICByZXR1cm4gdGhpczsKICB9CgogIC8vLyBHaXZlbiBpZGVudGlmaWVyIGA/YCBgRnVuY3Rpb25gIG5vbi1pZGVudGlmaWVyLCBjb21wdXRlIHRoZSB0eXBlCiAgLy8vIGFuZCByZXR1cm4gdGhlIHJlY2VpdmVyIG9yIG9uZSBvZiB0aGUgW1R5cGVJbmZvXSBjb25zdGFudHMuCiAgVHlwZUluZm8gY29tcHV0ZUlkZW50aWZpZXJRdWVzdGlvbkdGVChib29sIHJlcXVpcmVkKSB7CiAgICBhc3NlcnQoaXNWYWxpZFR5cGVSZWZlcmVuY2Uoc3RhcnQpKTsKICAgIGFzc2VydChvcHRpb25hbCgnPycsIHN0YXJ0Lm5leHQpKTsKICAgIGFzc2VydChvcHRpb25hbCgnRnVuY3Rpb24nLCBzdGFydC5uZXh0Lm5leHQpKTsKCiAgICBjb21wdXRlUmVzdChzdGFydCwgcmVxdWlyZWQpOwogICAgaWYgKGdmdEhhc1JldHVyblR5cGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gc2ltcGxlTnVsbGFibGVUeXBlOwogICAgfQogICAgYXNzZXJ0KGVuZCAhPSBudWxsKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgLy8vIEdpdmVuIGEgYnVpbHRpbiwgcmV0dXJuIHRoZSByZWNlaXZlciBzbyB0aGF0IHBhcnNlVHlwZSB3aWxsIHJlcG9ydAogIC8vLyBhbiBlcnJvciBmb3IgdGhlIGJ1aWx0aW4gdXNlZCBhcyBhIHR5cGUuCiAgVHlwZUluZm8gY29tcHV0ZUJ1aWx0aW5PclZhckFzVHlwZShib29sIHJlcXVpcmVkKSB7CiAgICBhc3NlcnQoc3RhcnQudHlwZS5pc0J1aWx0SW4gfHwgb3B0aW9uYWwoJ3ZhcicsIHN0YXJ0KSk7CgogICAgZW5kID0gdHlwZUFyZ3VtZW50cy5za2lwKHN0YXJ0KTsKICAgIGNvbXB1dGVSZXN0KGVuZCwgcmVxdWlyZWQpOwogICAgYXNzZXJ0KGVuZCAhPSBudWxsKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgLy8vIEdpdmVuIGlkZW50aWZpZXIgYDxgIC4uLiBgPmAsIGNvbXB1dGUgdGhlIHR5cGUKICAvLy8gYW5kIHJldHVybiB0aGUgcmVjZWl2ZXIgb3Igb25lIG9mIHRoZSBbVHlwZUluZm9dIGNvbnN0YW50cy4KICBUeXBlSW5mbyBjb21wdXRlU2ltcGxlV2l0aFR5cGVBcmd1bWVudHMoYm9vbCByZXF1aXJlZCkgewogICAgYXNzZXJ0KGlzVmFsaWRUeXBlUmVmZXJlbmNlKHN0YXJ0KSk7CiAgICBhc3NlcnQob3B0aW9uYWwoJzwnLCBzdGFydC5uZXh0KSk7CiAgICBhc3NlcnQodHlwZUFyZ3VtZW50cyAhPSBub1R5cGVQYXJhbU9yQXJnKTsKCiAgICBlbmQgPSB0eXBlQXJndW1lbnRzLnNraXAoc3RhcnQpOwogICAgY29tcHV0ZVJlc3QoZW5kLCByZXF1aXJlZCk7CgogICAgaWYgKCFyZXF1aXJlZCAmJiAhbG9va3NMaWtlTmFtZShlbmQubmV4dCkgJiYgZ2Z0SGFzUmV0dXJuVHlwZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBub1R5cGU7CiAgICB9CiAgICBhc3NlcnQoZW5kICE9IG51bGwpOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICAvLy8gR2l2ZW4gaWRlbnRpZmllciBgLmAgaWRlbnRpZmllciAob3IgYC5gIGlkZW50aWZpZXIgb3IgaWRlbnRpZmllciBgLmAKICAvLy8gZm9yIHJlY292ZXJ5KSwgY29tcHV0ZSB0aGUgdHlwZSBhbmQgcmV0dXJuIHRoZSByZWNlaXZlciBvciBvbmUgb2YgdGhlCiAgLy8vIFtUeXBlSW5mb10gY29uc3RhbnRzLgogIFR5cGVJbmZvIGNvbXB1dGVQcmVmaXhlZFR5cGUoYm9vbCByZXF1aXJlZCkgewogICAgVG9rZW4gdG9rZW4gPSBzdGFydDsKICAgIGlmICghb3B0aW9uYWwoJy4nLCB0b2tlbikpIHsKICAgICAgYXNzZXJ0KHRva2VuLmlzS2V5d29yZE9ySWRlbnRpZmllcik7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIGFzc2VydChvcHRpb25hbCgnLicsIHRva2VuKSk7CiAgICBpZiAodG9rZW4ubmV4dC5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgfQoKICAgIGVuZCA9IHR5cGVBcmd1bWVudHMuc2tpcCh0b2tlbik7CiAgICBjb21wdXRlUmVzdChlbmQsIHJlcXVpcmVkKTsKICAgIGlmICghcmVxdWlyZWQgJiYgIWxvb2tzTGlrZU5hbWUoZW5kLm5leHQpICYmIGdmdEhhc1JldHVyblR5cGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gbm9UeXBlOwogICAgfQogICAgYXNzZXJ0KGVuZCAhPSBudWxsKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgdm9pZCBjb21wdXRlUmVzdChUb2tlbiB0b2tlbiwgYm9vbCByZXF1aXJlZCkgewogICAgaWYgKG9wdGlvbmFsKCc/JywgdG9rZW4ubmV4dCkpIHsKICAgICAgYmVmb3JlUXVlc3Rpb25NYXJrID0gdG9rZW47CiAgICAgIGVuZCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIHdoaWxlIChvcHRpb25hbCgnRnVuY3Rpb24nLCB0b2tlbikpIHsKICAgICAgVG9rZW4gdHlwZVZhcmlhYmxlU3RhcnQgPSB0b2tlbjsKICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIGNhY2hpbmcgVHlwZVBhcmFtT3JBcmdJbmZvCiAgICAgIHRva2VuID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHRva2VuLCB0cnVlKS5za2lwKHRva2VuKTsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICBpZiAoIW9wdGlvbmFsKCcoJywgdG9rZW4pKSB7CiAgICAgICAgYnJlYWs7IC8vIE5vdCBhIGZ1bmN0aW9uIHR5cGUuCiAgICAgIH0KICAgICAgdG9rZW4gPSB0b2tlbi5lbmRHcm91cDsKICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKICAgICAgICBicmVhazsgLy8gTm90IGEgZnVuY3Rpb24gdHlwZS4KICAgICAgfQogICAgICBpZiAoIXJlcXVpcmVkKSB7CiAgICAgICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgaWYgKG9wdGlvbmFsKCc/JywgbmV4dCkpIHsKICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgICAgfQogICAgICAgIGlmICghKG5leHQuaXNJZGVudGlmaWVyIHx8IG9wdGlvbmFsKCd0aGlzJywgbmV4dCkpKSB7CiAgICAgICAgICBicmVhazsgLy8gYEZ1bmN0aW9uYCB1c2VkIGFzIHRoZSBuYW1lIGluIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24uCiAgICAgICAgfQogICAgICB9CiAgICAgIGFzc2VydChvcHRpb25hbCgnKScsIHRva2VuKSk7CiAgICAgIGdmdEhhc1JldHVyblR5cGUgPz89IHR5cGVWYXJpYWJsZVN0YXJ0ICE9IHN0YXJ0OwogICAgICB0eXBlVmFyaWFibGVTdGFydGVycyA9IHR5cGVWYXJpYWJsZVN0YXJ0ZXJzLnByZXBlbmQodHlwZVZhcmlhYmxlU3RhcnQpOwoKICAgICAgYmVmb3JlUXVlc3Rpb25NYXJrID0gbnVsbDsKICAgICAgZW5kID0gdG9rZW47CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKCiAgICAgIGlmIChvcHRpb25hbCgnPycsIHRva2VuKSkgewogICAgICAgIGJlZm9yZVF1ZXN0aW9uTWFyayA9IGVuZDsKICAgICAgICBlbmQgPSB0b2tlbjsKICAgICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgIH0KICB9Cn0KCi8vLyBTZWUgW25vVHlwZVBhcmFtT3JBcmddLgpjbGFzcyBOb1R5cGVQYXJhbU9yQXJnIGV4dGVuZHMgVHlwZVBhcmFtT3JBcmdJbmZvIHsKICBjb25zdCBOb1R5cGVQYXJhbU9yQXJnKCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgdHlwZUFyZ3VtZW50Q291bnQgPT4gMDsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VBcmd1bWVudHMoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVOb1R5cGVBcmd1bWVudHModG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVZhcmlhYmxlcyhUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgcGFyc2VyLmxpc3RlbmVyLmhhbmRsZU5vVHlwZVZhcmlhYmxlcyh0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHNraXAoVG9rZW4gdG9rZW4pID0+IHRva2VuOwp9CgpjbGFzcyBTaW1wbGVUeXBlQXJndW1lbnQxIGV4dGVuZHMgVHlwZVBhcmFtT3JBcmdJbmZvIHsKICBjb25zdCBTaW1wbGVUeXBlQXJndW1lbnQxKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU2ltcGxlVHlwZUFyZ3VtZW50ID0+IHRydWU7CgogIEBvdmVycmlkZQogIGludCBnZXQgdHlwZUFyZ3VtZW50Q291bnQgPT4gMTsKCiAgQG92ZXJyaWRlCiAgVHlwZUluZm8gZ2V0IHR5cGVJbmZvID0+IHNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50OwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZUFyZ3VtZW50cyhUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gYmVnaW5Hcm91cCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJzwnLCBiZWdpbkdyb3VwKSk7CiAgICBUb2tlbiBlbmRHcm91cCA9IHBhcnNlRW5kR3JvdXAoYmVnaW5Hcm91cCwgYmVnaW5Hcm91cC5uZXh0KTsKICAgIExpc3RlbmVyIGxpc3RlbmVyID0gcGFyc2VyLmxpc3RlbmVyOwogICAgbGlzdGVuZXIuYmVnaW5UeXBlQXJndW1lbnRzKGJlZ2luR3JvdXApOwogICAgc2ltcGxlVHlwZS5wYXJzZVR5cGUoYmVnaW5Hcm91cCwgcGFyc2VyKTsKICAgIHBhcnNlci5saXN0ZW5lci5lbmRUeXBlQXJndW1lbnRzKDEsIGJlZ2luR3JvdXAsIGVuZEdyb3VwKTsKICAgIHJldHVybiBlbmRHcm91cDsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVmFyaWFibGVzKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBiZWdpbkdyb3VwID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPCcsIGJlZ2luR3JvdXApKTsKICAgIHRva2VuID0gYmVnaW5Hcm91cC5uZXh0OwogICAgVG9rZW4gZW5kR3JvdXAgPSBwYXJzZUVuZEdyb3VwKGJlZ2luR3JvdXAsIHRva2VuKTsKICAgIExpc3RlbmVyIGxpc3RlbmVyID0gcGFyc2VyLmxpc3RlbmVyOwogICAgbGlzdGVuZXIuYmVnaW5UeXBlVmFyaWFibGVzKGJlZ2luR3JvdXApOwogICAgbGlzdGVuZXIuYmVnaW5NZXRhZGF0YVN0YXIodG9rZW4pOwogICAgbGlzdGVuZXIuZW5kTWV0YWRhdGFTdGFyKDApOwogICAgbGlzdGVuZXIuaGFuZGxlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQudHlwZVZhcmlhYmxlRGVjbGFyYXRpb24pOwogICAgbGlzdGVuZXIuYmVnaW5UeXBlVmFyaWFibGUodG9rZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlVHlwZVZhcmlhYmxlc0RlZmluZWQodG9rZW4sIDEpOwogICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlKHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZFR5cGVWYXJpYWJsZShlbmRHcm91cCwgMCwgbnVsbCk7CiAgICBsaXN0ZW5lci5lbmRUeXBlVmFyaWFibGVzKGJlZ2luR3JvdXAsIGVuZEdyb3VwKTsKICAgIHJldHVybiBlbmRHcm91cDsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHNraXAoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPCcsIHRva2VuKSk7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQodG9rZW4uaXNLZXl3b3JkT3JJZGVudGlmaWVyKTsKICAgIHJldHVybiBza2lwRW5kR3JvdXAodG9rZW4pOwogIH0KCiAgVG9rZW4gc2tpcEVuZEdyb3VwKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJz4nLCB0b2tlbikpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VFbmRHcm91cChUb2tlbiBiZWdpbkdyb3VwLCBUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc+JywgdG9rZW4pKTsKICAgIHJldHVybiB0b2tlbjsKICB9Cn0KCmNsYXNzIFNpbXBsZVR5cGVBcmd1bWVudDFHdEVxIGV4dGVuZHMgU2ltcGxlVHlwZUFyZ3VtZW50MSB7CiAgY29uc3QgU2ltcGxlVHlwZUFyZ3VtZW50MUd0RXEoKTsKCiAgQG92ZXJyaWRlCiAgVHlwZUluZm8gZ2V0IHR5cGVJbmZvID0+IHNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50R3RFcTsKCiAgVG9rZW4gc2tpcEVuZEdyb3VwKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJz49JywgdG9rZW4pKTsKICAgIHJldHVybiBzcGxpdEd0RXEodG9rZW4pOwogIH0KCiAgVG9rZW4gcGFyc2VFbmRHcm91cChUb2tlbiBiZWdpbkdyb3VwLCBUb2tlbiBiZWZvcmVFbmRHcm91cCkgewogICAgVG9rZW4gZW5kR3JvdXAgPSBiZWZvcmVFbmRHcm91cC5uZXh0OwogICAgaWYgKCFvcHRpb25hbCgnPicsIGVuZEdyb3VwKSkgewogICAgICBlbmRHcm91cCA9IHNwbGl0R3RFcShlbmRHcm91cCk7CiAgICAgIGVuZEdyb3VwLm5leHQuc2V0TmV4dChlbmRHcm91cC5uZXh0Lm5leHQpOwogICAgfQogICAgYmVmb3JlRW5kR3JvdXAuc2V0TmV4dChlbmRHcm91cCk7CiAgICByZXR1cm4gZW5kR3JvdXA7CiAgfQp9CgpjbGFzcyBTaW1wbGVUeXBlQXJndW1lbnQxR3RHdCBleHRlbmRzIFNpbXBsZVR5cGVBcmd1bWVudDEgewogIGNvbnN0IFNpbXBsZVR5cGVBcmd1bWVudDFHdEd0KCk7CgogIEBvdmVycmlkZQogIFR5cGVJbmZvIGdldCB0eXBlSW5mbyA9PiBzaW1wbGVUeXBlV2l0aDFBcmd1bWVudEd0R3Q7CgogIFRva2VuIHNraXBFbmRHcm91cChUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc+PicsIHRva2VuKSk7CiAgICByZXR1cm4gc3BsaXRHdEd0KHRva2VuKTsKICB9CgogIFRva2VuIHBhcnNlRW5kR3JvdXAoVG9rZW4gYmVnaW5Hcm91cCwgVG9rZW4gYmVmb3JlRW5kR3JvdXApIHsKICAgIFRva2VuIGVuZEdyb3VwID0gYmVmb3JlRW5kR3JvdXAubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJz4nLCBlbmRHcm91cCkpIHsKICAgICAgZW5kR3JvdXAgPSBzcGxpdEd0R3QoZW5kR3JvdXApOwogICAgICBlbmRHcm91cC5uZXh0LnNldE5leHQoZW5kR3JvdXAubmV4dC5uZXh0KTsKICAgIH0KICAgIGJlZm9yZUVuZEdyb3VwLnNldE5leHQoZW5kR3JvdXApOwogICAgcmV0dXJuIGVuZEdyb3VwOwogIH0KfQoKY2xhc3MgQ29tcGxleFR5cGVQYXJhbU9yQXJnSW5mbyBleHRlbmRzIFR5cGVQYXJhbU9yQXJnSW5mbyB7CiAgLy8vIFRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgdHlwZSB2YXIuCiAgZmluYWwgVG9rZW4gc3RhcnQ7CgogIC8vLyBJZiBbaW5EZWNsYXJhdGlvbl0gaXMgYHRydWVgLCB0aGVuIHRoaXMgd2lsbCBtb3JlIGFnZ3Jlc3NpdmVseSByZWNvdmVyCiAgLy8vIGdpdmVuIHVuYmFsYW5jZWQgYDxgIGA+YCBhbmQgaW52YWxpZCBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cy4KICBmaW5hbCBib29sIGluRGVjbGFyYXRpb247CgogIEBvdmVycmlkZQogIGludCB0eXBlQXJndW1lbnRDb3VudDsKCiAgLy8vIFRoZSBgPmAgdG9rZW4gd2hpY2ggZW5kcyB0aGUgdHlwZSBwYXJhbWV0ZXIgb3IgYXJndW1lbnQuCiAgLy8vIFRoaXMgY2xvc2VyIG1heSBiZSBzeW50aGV0aWMsIHBvaW50cyB0byB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgc3RyZWFtLAogIC8vLyBpcyBvbmx5IHVzZWQgd2hlbiBza2lwcGluZyBvdmVyIHRoZSB0eXBlIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLAogIC8vLyBhbmQgbWF5IG5vdCBiZSBwYXJ0IG9mIHRoZSB0b2tlbiBzdHJlYW0uCiAgVG9rZW4gc2tpcEVuZDsKCiAgQ29tcGxleFR5cGVQYXJhbU9yQXJnSW5mbyhUb2tlbiB0b2tlbiwgdGhpcy5pbkRlY2xhcmF0aW9uKQogICAgICA6IGFzc2VydChvcHRpb25hbCgnPCcsIHRva2VuLm5leHQpKSwKICAgICAgICBhc3NlcnQoaW5EZWNsYXJhdGlvbiAhPSBudWxsKSwKICAgICAgICBzdGFydCA9IHRva2VuLm5leHQ7CgogIC8vLyBQYXJzZSB0aGUgdG9rZW5zIGFuZCByZXR1cm4gdGhlIHJlY2VpdmVyIG9yIFtub1R5cGVQYXJhbU9yQXJnXSBpZiB0aGVyZQogIC8vLyBhcmUgbm8gdHlwZSBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cy4gVGhpcyBkb2VzIG5vdCBtb2RpZnkgdGhlIHRva2VuCiAgLy8vIHN0cmVhbS4KICBUeXBlUGFyYW1PckFyZ0luZm8gY29tcHV0ZSgpIHsKICAgIFRva2VuIHRva2VuOwogICAgVG9rZW4gbmV4dCA9IHN0YXJ0OwogICAgdHlwZUFyZ3VtZW50Q291bnQgPSAwOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgVHlwZUluZm8gdHlwZUluZm8gPSBjb21wdXRlVHlwZShuZXh0LCB0cnVlLCBpbkRlY2xhcmF0aW9uKTsKICAgICAgaWYgKHR5cGVJbmZvID09IG5vVHlwZSkgewogICAgICAgIHdoaWxlICh0eXBlSW5mbyA9PSBub1R5cGUgJiYgb3B0aW9uYWwoJ0AnLCBuZXh0Lm5leHQpKSB7CiAgICAgICAgICBuZXh0ID0gc2tpcE1ldGFkYXRhKG5leHQpOwogICAgICAgICAgdHlwZUluZm8gPSBjb21wdXRlVHlwZShuZXh0LCB0cnVlLCBpbkRlY2xhcmF0aW9uKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVJbmZvID09IG5vVHlwZSkgewogICAgICAgICAgaWYgKG5leHQgPT0gc3RhcnQgJiYgIWluRGVjbGFyYXRpb24gJiYgIWlzQ2xvc2VyKG5leHQubmV4dCkpIHsKICAgICAgICAgICAgcmV0dXJuIG5vVHlwZVBhcmFtT3JBcmc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIW9wdGlvbmFsKCcsJywgbmV4dC5uZXh0KSkgewogICAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYXNzZXJ0KHR5cGVJbmZvICE9IG5vVHlwZSB8fCBvcHRpb25hbCgnLCcsIG5leHQubmV4dCkpOwogICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBwcm9jZXNzIHR5cGUgKGlmIGFueSkgYW5kIGNvbnN1bWUgYCxgCiAgICAgIH0KICAgICAgKyt0eXBlQXJndW1lbnRDb3VudDsKICAgICAgdG9rZW4gPSB0eXBlSW5mby5za2lwVHlwZShuZXh0KTsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgnZXh0ZW5kcycsIG5leHQpKSB7CiAgICAgICAgdG9rZW4gPSBjb21wdXRlVHlwZShuZXh0LCB0cnVlLCBpbkRlY2xhcmF0aW9uKS5za2lwVHlwZShuZXh0KTsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgICBpZiAoIW9wdGlvbmFsKCcsJywgbmV4dCkpIHsKICAgICAgICBza2lwRW5kID0gc3BsaXRDbG9zZXIobmV4dCk7CiAgICAgICAgaWYgKHNraXBFbmQgIT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIGlmICghaW5EZWNsYXJhdGlvbikgewogICAgICAgICAgcmV0dXJuIG5vVHlwZVBhcmFtT3JBcmc7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIGlmICghbG9va3NMaWtlVHlwZVBhcmFtT3JBcmcoaW5EZWNsYXJhdGlvbiwgbmV4dCkpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvLyBMb29rcyBsaWtlIG1pc3NpbmcgY29tbWEuIENvbnRpbnVlIGxvb3BpbmcuCiAgICAgICAgbmV4dCA9IHRva2VuOwogICAgICB9CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIHNraXBFbmQgPSBzcGxpdENsb3NlcihuZXh0KTsKICAgIGlmIChza2lwRW5kID09IG51bGwpIHsKICAgICAgaWYgKG9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgICB0b2tlbiA9IG5leHQuZW5kR3JvdXA7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgc2tpcEVuZCA9IHNwbGl0Q2xvc2VyKG5leHQpOwogICAgICBpZiAoc2tpcEVuZCA9PSBudWxsKSB7CiAgICAgICAgc2tpcEVuZCA9IHNwbGl0Q2xvc2VyKG5leHQubmV4dCk7CiAgICAgIH0KICAgICAgaWYgKHNraXBFbmQgPT0gbnVsbCkgewogICAgICAgIHNraXBFbmQgPSBzeW50aGV0aWNHdChuZXh0KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZUFyZ3VtZW50cyhUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgYXNzZXJ0KGlkZW50aWNhbCh0b2tlbi5uZXh0LCBzdGFydCkpOwogICAgVG9rZW4gbmV4dCA9IHN0YXJ0OwogICAgcGFyc2VyLmxpc3RlbmVyLmJlZ2luVHlwZUFyZ3VtZW50cyhzdGFydCk7CiAgICBpbnQgY291bnQgPSAwOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgVHlwZUluZm8gdHlwZUluZm8gPSBjb21wdXRlVHlwZShuZXh0LCB0cnVlLCBpbkRlY2xhcmF0aW9uKTsKICAgICAgaWYgKHR5cGVJbmZvID09IG5vVHlwZSkgewogICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgd2hpbGUgKHR5cGVJbmZvID09IG5vVHlwZSAmJiBvcHRpb25hbCgnQCcsIG5leHQubmV4dCkpIHsKICAgICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICAgIG5leHQubmV4dCwgZmFzdGEudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgICAgICAgbmV4dCA9IHNraXBNZXRhZGF0YShuZXh0KTsKICAgICAgICAgIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUobmV4dCwgdHJ1ZSwgaW5EZWNsYXJhdGlvbik7CiAgICAgICAgfQogICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBwcm9jZXNzIHR5cGUgKGlmIGFueSkgYW5kIGNvbnN1bWUgYCxgCiAgICAgIH0KICAgICAgdG9rZW4gPSB0eXBlSW5mby5lbnN1cmVUeXBlT3JWb2lkKG5leHQsIHBhcnNlcik7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICArK2NvdW50OwogICAgICBpZiAoIW9wdGlvbmFsKCcsJywgbmV4dCkpIHsKICAgICAgICBpZiAocGFyc2VDbG9zZXIodG9rZW4pKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgaWYgKCFsb29rc0xpa2VUeXBlUGFyYW1PckFyZyhpbkRlY2xhcmF0aW9uLCBuZXh0KSkgewogICAgICAgICAgdG9rZW4gPSBwYXJzZVVuZXhwZWN0ZWRFbmQodG9rZW4sIHRydWUsIHBhcnNlcik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gTWlzc2luZyBjb21tYS4gUmVwb3J0IGVycm9yLCBpbnNlcnQgY29tbWEsIGFuZCBjb250aW51ZSBsb29waW5nLgogICAgICAgIG5leHQgPSBwYXJzZU1pc3NpbmdDb21tYSh0b2tlbiwgcGFyc2VyKTsKICAgICAgfQogICAgfQogICAgVG9rZW4gZW5kR3JvdXAgPSB0b2tlbi5uZXh0OwogICAgcGFyc2VyLmxpc3RlbmVyLmVuZFR5cGVBcmd1bWVudHMoY291bnQsIHN0YXJ0LCBlbmRHcm91cCk7CiAgICByZXR1cm4gZW5kR3JvdXA7CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVZhcmlhYmxlcyhUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgYXNzZXJ0KGlkZW50aWNhbCh0b2tlbi5uZXh0LCBzdGFydCkpOwogICAgVG9rZW4gbmV4dCA9IHN0YXJ0OwogICAgTGlzdGVuZXIgbGlzdGVuZXIgPSBwYXJzZXIubGlzdGVuZXI7CiAgICBsaXN0ZW5lci5iZWdpblR5cGVWYXJpYWJsZXMoc3RhcnQpOwogICAgaW50IGNvdW50ID0gMDsKCiAgICBMaW5rPFRva2VuPiB0eXBlU3RhcnRzID0gY29uc3QgTGluazxUb2tlbj4oKTsKICAgIExpbms8VHlwZUluZm8+IHN1cGVyVHlwZUluZm9zID0gY29uc3QgTGluazxUeXBlSW5mbz4oKTsKCiAgICB3aGlsZSAodHJ1ZSkgewogICAgICB0b2tlbiA9IHBhcnNlci5wYXJzZU1ldGFkYXRhU3RhcihuZXh0KTsKICAgICAgbmV4dCA9IHBhcnNlci5lbnN1cmVJZGVudGlmaWVyKAogICAgICAgICAgdG9rZW4sIElkZW50aWZpZXJDb250ZXh0LnR5cGVWYXJpYWJsZURlY2xhcmF0aW9uKTsKICAgICAgdG9rZW4gPSBuZXh0OwogICAgICBsaXN0ZW5lci5iZWdpblR5cGVWYXJpYWJsZSh0b2tlbik7CiAgICAgIHR5cGVTdGFydHMgPSB0eXBlU3RhcnRzLnByZXBlbmQodG9rZW4pOwoKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgnZXh0ZW5kcycsIG5leHQpKSB7CiAgICAgICAgVHlwZUluZm8gdHlwZUluZm8gPSBjb21wdXRlVHlwZShuZXh0LCB0cnVlLCBpbkRlY2xhcmF0aW9uKTsKICAgICAgICB0b2tlbiA9IHR5cGVJbmZvLnNraXBUeXBlKG5leHQpOwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIHN1cGVyVHlwZUluZm9zID0gc3VwZXJUeXBlSW5mb3MucHJlcGVuZCh0eXBlSW5mbyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3VwZXJUeXBlSW5mb3MgPSBzdXBlclR5cGVJbmZvcy5wcmVwZW5kKG51bGwpOwogICAgICB9CgogICAgICArK2NvdW50OwogICAgICBpZiAoIW9wdGlvbmFsKCcsJywgbmV4dCkpIHsKICAgICAgICBpZiAoaXNDbG9zZXIodG9rZW4pKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgaWYgKCFsb29rc0xpa2VUeXBlUGFyYW1PckFyZyhpbkRlY2xhcmF0aW9uLCBuZXh0KSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8vIE1pc3NpbmcgY29tbWEuIFJlcG9ydCBlcnJvciwgaW5zZXJ0IGNvbW1hLCBhbmQgY29udGludWUgbG9vcGluZy4KICAgICAgICBuZXh0ID0gcGFyc2VNaXNzaW5nQ29tbWEodG9rZW4sIHBhcnNlcik7CiAgICAgIH0KICAgIH0KCiAgICBhc3NlcnQoY291bnQgPiAwKTsKICAgIGFzc2VydCh0eXBlU3RhcnRzLnNsb3dMZW5ndGgoKSA9PSBjb3VudCk7CiAgICBhc3NlcnQoc3VwZXJUeXBlSW5mb3Muc2xvd0xlbmd0aCgpID09IGNvdW50KTsKICAgIGxpc3RlbmVyLmhhbmRsZVR5cGVWYXJpYWJsZXNEZWZpbmVkKHRva2VuLCBjb3VudCk7CgogICAgdG9rZW4gPSBudWxsOwogICAgd2hpbGUgKHR5cGVTdGFydHMuaXNOb3RFbXB0eSkgewogICAgICBUb2tlbiB0b2tlbjIgPSB0eXBlU3RhcnRzLmhlYWQ7CiAgICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gc3VwZXJUeXBlSW5mb3MuaGVhZDsKCiAgICAgIFRva2VuIGV4dGVuZHNPclN1cGVyID0gbnVsbDsKICAgICAgVG9rZW4gbmV4dDIgPSB0b2tlbjIubmV4dDsKICAgICAgaWYgKHR5cGVJbmZvICE9IG51bGwpIHsKICAgICAgICBhc3NlcnQob3B0aW9uYWwoJ2V4dGVuZHMnLCBuZXh0MikpOwogICAgICAgIGV4dGVuZHNPclN1cGVyID0gbmV4dDI7CiAgICAgICAgdG9rZW4yID0gdHlwZUluZm8uZW5zdXJlVHlwZU5vdFZvaWQobmV4dDIsIHBhcnNlcik7CiAgICAgICAgbmV4dDIgPSB0b2tlbjIubmV4dDsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoIW9wdGlvbmFsKCdleHRlbmRzJywgbmV4dDIpKTsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGUodG9rZW4yKTsKICAgICAgfQogICAgICAvLyBUeXBlIHZhcmlhYmxlcyBhcmUgImNvbXBsZXRlZCIgaW4gcmV2ZXJzZSBvcmRlciwgc28gY2FwdHVyZSB0aGUgbGFzdAogICAgICAvLyBjb25zdW1lZCB0b2tlbiBmcm9tIHRoZSBmaXJzdCAiY29tcGxldGVkIiB0eXBlIHZhcmlhYmxlLgogICAgICB0b2tlbiA/Pz0gdG9rZW4yOwogICAgICBsaXN0ZW5lci5lbmRUeXBlVmFyaWFibGUobmV4dDIsIC0tY291bnQsIGV4dGVuZHNPclN1cGVyKTsKCiAgICAgIHR5cGVTdGFydHMgPSB0eXBlU3RhcnRzLnRhaWw7CiAgICAgIHN1cGVyVHlwZUluZm9zID0gc3VwZXJUeXBlSW5mb3MudGFpbDsKICAgIH0KCiAgICBpZiAoIXBhcnNlQ2xvc2VyKHRva2VuKSkgewogICAgICB0b2tlbiA9IHBhcnNlVW5leHBlY3RlZEVuZCh0b2tlbiwgZmFsc2UsIHBhcnNlcik7CiAgICB9CiAgICBUb2tlbiBlbmRHcm91cCA9IHRva2VuLm5leHQ7CiAgICBsaXN0ZW5lci5lbmRUeXBlVmFyaWFibGVzKHN0YXJ0LCBlbmRHcm91cCk7CiAgICByZXR1cm4gZW5kR3JvdXA7CiAgfQoKICBUb2tlbiBwYXJzZU1pc3NpbmdDb21tYShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICBuZXh0LCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJywnKSk7CiAgICByZXR1cm4gcGFyc2VyLnJld3JpdGVyLmluc2VydFRva2VuKAogICAgICAgIHRva2VuLCBuZXcgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLkNPTU1BLCBuZXh0LmNoYXJPZmZzZXQpKTsKICB9CgogIFRva2VuIHBhcnNlVW5leHBlY3RlZEVuZChUb2tlbiB0b2tlbiwgYm9vbCBpc0FyZ3VtZW50cywgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBib29sIGVycm9yUmVwb3J0ZWQgPSB0b2tlbi5pc1N5bnRoZXRpYyB8fCAobmV4dC5pc1N5bnRoZXRpYyAmJiAhbmV4dC5pc0VvZik7CgogICAgYm9vbCB0eXBlRm9sbG93c0V4dGVuZHMgPSBmYWxzZTsKICAgIGlmIChvcHRpb25hbCgnZXh0ZW5kcycsIG5leHQpKSB7CiAgICAgIGlmICghZXJyb3JSZXBvcnRlZCkgewogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJz4nKSk7CiAgICAgICAgZXJyb3JSZXBvcnRlZCA9IHRydWU7CiAgICAgIH0KICAgICAgdG9rZW4gPSBuZXh0OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgdHlwZUZvbGxvd3NFeHRlbmRzID0gaXNWYWxpZFR5cGVSZWZlcmVuY2UobmV4dCk7CgogICAgICBpZiAocGFyc2VDbG9zZXIodG9rZW4pKSB7CiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9CiAgICB9CgogICAgaWYgKHR5cGVGb2xsb3dzRXh0ZW5kcyB8fAogICAgICAgIG9wdGlvbmFsKCdkeW5hbWljJywgbmV4dCkgfHwKICAgICAgICBvcHRpb25hbCgndm9pZCcsIG5leHQpIHx8CiAgICAgICAgb3B0aW9uYWwoJ0Z1bmN0aW9uJywgbmV4dCkpIHsKICAgICAgVHlwZUluZm8gaW52YWxpZFR5cGUgPSBjb21wdXRlVHlwZSh0b2tlbiwgdHJ1ZSk7CiAgICAgIGlmIChpbnZhbGlkVHlwZSAhPSBub1R5cGUpIHsKICAgICAgICBpZiAoIWVycm9yUmVwb3J0ZWQpIHsKICAgICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIHRva2VuLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3Qud2l0aEFyZ3VtZW50cygnPicpKTsKICAgICAgICAgIGVycm9yUmVwb3J0ZWQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gUGFyc2UgdGhlIHR5cGUgc28gdGhhdCB0aGUgdG9rZW4gc3RyZWFtIGlzIHByb3Blcmx5IG1vZGlmaWVkLAogICAgICAgIC8vIGJ1dCBlbnN1cmUgdGhhdCBwYXJzZXIgZXZlbnRzIGFyZSBpZ25vcmVkIGJ5IHJlcGxhY2luZyB0aGUgbGlzdGVuZXIuCiAgICAgICAgZmluYWwgb3JpZ2luYWxMaXN0ZW5lciA9IHBhcnNlci5saXN0ZW5lcjsKICAgICAgICBwYXJzZXIubGlzdGVuZXIgPSBuZXcgRm9yd2FyZGluZ0xpc3RlbmVyKCk7CiAgICAgICAgdG9rZW4gPSBpbnZhbGlkVHlwZS5wYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgcGFyc2VyLmxpc3RlbmVyID0gb3JpZ2luYWxMaXN0ZW5lcjsKCiAgICAgICAgaWYgKHBhcnNlQ2xvc2VyKHRva2VuKSkgewogICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIFR5cGVQYXJhbU9yQXJnSW5mbyBpbnZhbGlkVHlwZVZhciA9CiAgICAgICAgY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHRva2VuLCBpbkRlY2xhcmF0aW9uKTsKICAgIGlmIChpbnZhbGlkVHlwZVZhciAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgIGlmICghZXJyb3JSZXBvcnRlZCkgewogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJz4nKSk7CiAgICAgICAgZXJyb3JSZXBvcnRlZCA9IHRydWU7CiAgICAgIH0KCiAgICAgIC8vIFBhcnNlIHRoZSB0eXBlIHNvIHRoYXQgdGhlIHRva2VuIHN0cmVhbSBpcyBwcm9wZXJseSBtb2RpZmllZCwKICAgICAgLy8gYnV0IGVuc3VyZSB0aGF0IHBhcnNlciBldmVudHMgYXJlIGlnbm9yZWQgYnkgcmVwbGFjaW5nIHRoZSBsaXN0ZW5lci4KICAgICAgZmluYWwgb3JpZ2luYWxMaXN0ZW5lciA9IHBhcnNlci5saXN0ZW5lcjsKICAgICAgcGFyc2VyLmxpc3RlbmVyID0gbmV3IEZvcndhcmRpbmdMaXN0ZW5lcigpOwogICAgICB0b2tlbiA9IGlzQXJndW1lbnRzCiAgICAgICAgICA/IGludmFsaWRUeXBlVmFyLnBhcnNlQXJndW1lbnRzKHRva2VuLCBwYXJzZXIpCiAgICAgICAgICA6IGludmFsaWRUeXBlVmFyLnBhcnNlVmFyaWFibGVzKHRva2VuLCBwYXJzZXIpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgcGFyc2VyLmxpc3RlbmVyID0gb3JpZ2luYWxMaXN0ZW5lcjsKCiAgICAgIGlmIChwYXJzZUNsb3Nlcih0b2tlbikpIHsKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0KICAgIH0KCiAgICBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSAmJiBuZXh0LmVuZEdyb3VwICE9IG51bGwpIHsKICAgICAgaWYgKCFlcnJvclJlcG9ydGVkKSB7CiAgICAgICAgLy8gT25seSByZXBvcnQgYW4gZXJyb3IgaWYgb25lIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLgogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbiwgZmFzdGEudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJz4nKSk7CiAgICAgICAgZXJyb3JSZXBvcnRlZCA9IHRydWU7CiAgICAgIH0KICAgICAgdG9rZW4gPSBuZXh0LmVuZEdyb3VwOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKCiAgICAgIGlmIChwYXJzZUNsb3Nlcih0b2tlbikpIHsKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIWVycm9yUmVwb3J0ZWQpIHsKICAgICAgLy8gT25seSByZXBvcnQgYW4gZXJyb3IgaWYgb25lIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLgogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIHRva2VuLCBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3Qud2l0aEFyZ3VtZW50cygnPicpKTsKICAgIH0KICAgIGlmIChwYXJzZUNsb3NlcihuZXh0KSkgewogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICAgIFRva2VuIGVuZEdyb3VwID0gc3ludGhldGljR3QobmV4dCk7CiAgICBlbmRHcm91cC5zZXROZXh0KG5leHQpOwogICAgdG9rZW4uc2V0TmV4dChlbmRHcm91cCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBza2lwKFRva2VuIHRva2VuKSB7CiAgICBhc3NlcnQoc2tpcEVuZCAhPSBudWxsKTsKICAgIHJldHVybiBza2lwRW5kOwogIH0KfQoKLy8vIFJldHVybiBgdHJ1ZWAgaWYgW3Rva2VuXSBpcyBvbmUgb2YgYD5gLCBgPj5gLCBgPj4+YCwgYD49YCwgYD4+PWAsIG9yIGA+Pj49YC4KYm9vbCBpc0Nsb3NlcihUb2tlbiB0b2tlbikgewogIGZpbmFsIHZhbHVlID0gdG9rZW4uc3RyaW5nVmFsdWU7CiAgcmV0dXJuIGlkZW50aWNhbCh2YWx1ZSwgJz4nKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICc+PicpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJz49JykgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnPj4+JykgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnPj49JykgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnPj4+PScpOwp9CgovLy8gSWYgW2JlZm9yZUNsb3Nlcl0ubmV4dCBpcyBvbmUgb2YgYD5gLCBgPj5gLCBgPj4+YCwgYD49YCwgYD4+PWAsIG9yIGA+Pj49YAovLy8gdGhlbiB1cGRhdGUgdGhlIHRva2VuIHN0cmVhbSBhbmQgcmV0dXJuIGB0cnVlYC4KYm9vbCBwYXJzZUNsb3NlcihUb2tlbiBiZWZvcmVDbG9zZXIpIHsKICBUb2tlbiB1bnNwbGl0ID0gYmVmb3JlQ2xvc2VyLm5leHQ7CiAgVG9rZW4gc3BsaXQgPSBzcGxpdENsb3Nlcih1bnNwbGl0KTsKICBpZiAoc3BsaXQgPT0gdW5zcGxpdCkgewogICAgcmV0dXJuIHRydWU7CiAgfSBlbHNlIGlmIChzcGxpdCA9PSBudWxsKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHNwbGl0Lm5leHQuc2V0TmV4dCh1bnNwbGl0Lm5leHQpOwogIGJlZm9yZUNsb3Nlci5zZXROZXh0KHNwbGl0KTsKICByZXR1cm4gdHJ1ZTsKfQoKLy8vIElmIFtjbG9zZXJdIGlzIGA+YCB0aGVuIHJldHVybiBpdC4KLy8vIElmIFtjbG9zZXJdIGlzIG9uZSBvZiBgPj5gLCBg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NS4cJ0oeCAFHTjAyGjk6GSoBIBYIBgE4HEYnSh4IHRkBIBYIBgEaRCVIBh0TBigcHRIEAQwcHRQEAgFRHSMiICAhISACAU40JyUmGhEeEgQkHw8CASdKTDgiJR8TJx4nHigmKCYpKAQPAgE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci90eXBlX2luZm9faW1wbC5kYXJ0PnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvY29uc3RhbnRfZW1pdHRlci5kYXJ0wABI/y8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRzL2NvbnN0YW50X3N5c3RlbS5kYXJ0JyBhcyBjb25zdGFudF9zeXN0ZW07CmltcG9ydCAnLi4vY29uc3RhbnRzL3ZhbHVlcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9pby9jb2RlX291dHB1dC5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqc0FzdDsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBzaG93IGpzOwppbXBvcnQgJy4uL2pzX2JhY2tlbmQvZmllbGRfYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnLi4vanNfZW1pdHRlci9jb2RlX2VtaXR0ZXJfdGFzay5kYXJ0JzsKaW1wb3J0ICcuLi9qc19tb2RlbC90eXBlX3JlY2lwZS5kYXJ0JyBzaG93IFR5cGVFeHByZXNzaW9uUmVjaXBlOwppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CmltcG9ydCAnZmllbGRfYW5hbHlzaXMuZGFydCcgc2hvdyBKRmllbGRBbmFseXNpczsKaW1wb3J0ICdydW50aW1lX3R5cGVzLmRhcnQnOwppbXBvcnQgJ3J1bnRpbWVfdHlwZXNfbmV3LmRhcnQnIHNob3cgUmVjaXBlRW5jb2RlcjsKaW1wb3J0ICdydW50aW1lX3R5cGVzX3Jlc29sdXRpb24uZGFydCc7Cgp0eXBlZGVmIGpzQXN0LkV4cHJlc3Npb24gX0NvbnN0YW50UmVmZXJlbmNlR2VuZXJhdG9yKENvbnN0YW50VmFsdWUgY29uc3RhbnQpOwoKdHlwZWRlZiBqc0FzdC5FeHByZXNzaW9uIF9Db25zdGFudExpc3RHZW5lcmF0b3IoanNBc3QuRXhwcmVzc2lvbiBhcnJheSk7CgovLy8gVmlzaXRvciB0aGF0IGNyZWF0ZXMgW2pzQXN0LkV4cHJlc3Npb25dcyBmb3IgY29uc3RhbnRzIHRoYXQgYXJlIGlubGluZWQKLy8vIGFuZCB0aGVyZWZvcmUgY2FuIGJlIGNyZWF0ZWQgZHVyaW5nIG1vZHVsYXIgY29kZSBnZW5lcmF0aW9uLgpjbGFzcyBNb2R1bGFyQ29uc3RhbnRFbWl0dGVyCiAgICBpbXBsZW1lbnRzIENvbnN0YW50VmFsdWVWaXNpdG9yPGpzQXN0LkV4cHJlc3Npb24sIE51bGw+IHsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CgogIE1vZHVsYXJDb25zdGFudEVtaXR0ZXIodGhpcy5fb3B0aW9ucyk7CgogIC8vLyBDb25zdHJ1Y3RzIGEgbGl0ZXJhbCBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBjb25zdGFudC4gVXNlcyBhCiAgLy8vIGNhbm9uaWNhbCBuYW1lIHVubGVzcyB0aGUgY29uc3RhbnQgY2FuIGJlIGVtaXR0ZWQgbXVsdGlwbGUgdGltZXMgKGFzIGZvcgogIC8vLyBudW1iZXJzIGFuZCBzdHJpbmdzKS4KICBqc0FzdC5FeHByZXNzaW9uIGdlbmVyYXRlKENvbnN0YW50VmFsdWUgY29uc3RhbnQpIHsKICAgIHJldHVybiBfdmlzaXQoY29uc3RhbnQpOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiBfdmlzaXQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgcmV0dXJuIGNvbnN0YW50LmFjY2VwdCh0aGlzLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRGdW5jdGlvbihGdW5jdGlvbkNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgdGhyb3cgZmFpbGVkQXQoTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICJUaGUgZnVuY3Rpb24gY29uc3RhbnQgZG9lcyBub3QgbmVlZCBzcGVjaWZpYyBKUyBjb2RlLiIpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdE51bGwoTnVsbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgcmV0dXJuIG5ldyBqc0FzdC5MaXRlcmFsTnVsbCgpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdE5vbkNvbnN0YW50KE5vbkNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgcmV0dXJuIG5ldyBqc0FzdC5MaXRlcmFsTnVsbCgpOwogIH0KCiAgc3RhdGljIGZpbmFsIF9leHBvbmVudGlhbFJFID0gbmV3IFJlZ0V4cCgnXicKICAgICAgJ1woWy0rXT9cKScgLy8gMTogc2lnbgogICAgICAnXChbMC05XStcKScgLy8gMjogbGVhZGluZyBkaWdpdChzKQogICAgICAnXChcLlwoWzAtOV0qXClcKT8nIC8vIDQ6IGZyYWN0aW9uIGRpZ2l0cwogICAgICAnZVwoWy0rXT9bMC05XStcKScgLy8gNTogZXhwb25lbnQgd2l0aCBzaWduCiAgICAgIHInJCcpOwoKICAvLy8gUmVkdWNlcyB0aGUgc2l6ZSBvZiBleHBvbmVudGlhbCByZXByZXNlbnRhdGlvbnMgd2hlbiBtaW5pZmljYXRpb24gaXMKICAvLy8gZW5hYmxlZC4KICAvLy8KICAvLy8gUmVtb3ZlcyB0aGUgIisiIGFmdGVyIHRoZSBleHBvbmVudGlhbCBzaWduLCBhbmQgcmVtb3ZlcyB0aGUgIi4iIGJlZm9yZSB0aGUKICAvLy8gImUiLiBGb3IgZXhhbXBsZSBgMS4yM2UrNWAgaXMgY2hhbmdlZCB0byBgMTIzZTNgLgogIFN0cmluZyBfc2hvcnRlbkV4cG9uZW50aWFsUmVwcmVzZW50YXRpb24oU3RyaW5nIG51bWJlclN0cmluZykgewogICAgTWF0Y2ggbWF0Y2ggPSBfZXhwb25lbnRpYWxSRS5maXJzdE1hdGNoKG51bWJlclN0cmluZyk7CiAgICBpZiAobWF0Y2ggPT0gbnVsbCkgcmV0dXJuIG51bWJlclN0cmluZzsKICAgIFN0cmluZyBzaWduID0gbWF0Y2hbMV07CiAgICBTdHJpbmcgbGVhZGluZ0RpZ2l0cyA9IG1hdGNoWzJdOwogICAgU3RyaW5nIGZyYWN0aW9uRGlnaXRzID0gbWF0Y2hbNF07CiAgICBpbnQgZXhwb25lbnQgPSBpbnQucGFyc2UobWF0Y2hbNV0pOwogICAgaWYgKGZyYWN0aW9uRGlnaXRzID09IG51bGwpIGZyYWN0aW9uRGlnaXRzID0gJyc7CiAgICBleHBvbmVudCAtPSBmcmFjdGlvbkRpZ2l0cy5sZW5ndGg7CiAgICBTdHJpbmcgcmVzdWx0ID0gJyR7c2lnbn0ke2xlYWRpbmdEaWdpdHN9JHtmcmFjdGlvbkRpZ2l0c31lJHtleHBvbmVudH0nOwogICAgYXNzZXJ0KGRvdWJsZS5wYXJzZShyZXN1bHQpID09IGRvdWJsZS5wYXJzZShudW1iZXJTdHJpbmcpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0SW50KEludENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgQmlnSW50IHZhbHVlID0gY29uc3RhbnQuaW50VmFsdWU7CiAgICAvLyBTaW5jZSB3ZSBhcmUgaW4gSmF2YVNjcmlwdCB3ZSBjYW4gc2hvcnRlbiBsb25nIGludGVnZXJzIHRvIHRoZWlyIHNob3J0ZXIKICAgIC8vIGV4cG9uZW50aWFsIHJlcHJlc2VudGF0aW9uLCBmb3IgZXhhbXBsZTogIjFlNCIgaXMgc2hvcnRlciB0aGFuICIxMDAwMCIuCiAgICAvLwogICAgLy8gTm90ZSB0aGF0IHRoaXMgc2hvcnRlbmluZyBhcHBhcmVudGx5IGxvc2VzIHByZWNpc2lvbiBmb3IgYmlnIG51bWJlcnMKICAgIC8vIChsaWtlIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDUgd2hpY2ggYmVjb21lcyAxMjM0NTY3ODkwMTIzNDU2OGU4KS4KICAgIC8vIEhvd2V2ZXIsIHNpbmNlIEphdmFTY3JpcHQgZW5naW5lcyByZXByZXNlbnQgYWxsIG51bWJlcnMgYXMgZG91YmxlcywgdGhlc2UKICAgIC8vIGRpZ2l0cyBhcmUgbG9zdCBhbnl3YXkuCiAgICBTdHJpbmcgcmVwcmVzZW50YXRpb24gPSB2YWx1ZS50b1N0cmluZygpOwogICAgU3RyaW5nIGFsdGVybmF0aXZlID0gbnVsbDsKICAgIGludCBjdXRvZmYgPSBfb3B0aW9ucy5lbmFibGVNaW5pZmljYXRpb24gPyAxMDAwMCA6IDFlMTAudG9JbnQoKTsKICAgIGlmICh2YWx1ZS5hYnMoKSA+PSBuZXcgQmlnSW50LmZyb20oY3V0b2ZmKSkgewogICAgICBhbHRlcm5hdGl2ZSA9IF9zaG9ydGVuRXhwb25lbnRpYWxSZXByZXNlbnRhdGlvbigKICAgICAgICAgIHZhbHVlLnRvRG91YmxlKCkudG9TdHJpbmdBc0V4cG9uZW50aWFsKCkpOwogICAgfQogICAgaWYgKGFsdGVybmF0aXZlICE9IG51bGwgJiYgYWx0ZXJuYXRpdmUubGVuZ3RoIDwgcmVwcmVzZW50YXRpb24ubGVuZ3RoKSB7CiAgICAgIHJlcHJlc2VudGF0aW9uID0gYWx0ZXJuYXRpdmU7CiAgICB9CiAgICByZXR1cm4gbmV3IGpzQXN0LkxpdGVyYWxOdW1iZXIocmVwcmVzZW50YXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdERvdWJsZShEb3VibGVDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIGRvdWJsZSB2YWx1ZSA9IGNvbnN0YW50LmRvdWJsZVZhbHVlOwogICAgaWYgKHZhbHVlLmlzTmFOKSB7CiAgICAgIHJldHVybiBqcygiMC8wIik7CiAgICB9IGVsc2UgaWYgKHZhbHVlID09IGRvdWJsZS5pbmZpbml0eSkgewogICAgICByZXR1cm4ganMoIjEvMCIpOwogICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtZG91YmxlLmluZmluaXR5KSB7CiAgICAgIHJldHVybiBqcygiLTEvMCIpOwogICAgfSBlbHNlIHsKICAgICAgU3RyaW5nIHNob3J0ZW5lZCA9IF9zaG9ydGVuRXhwb25lbnRpYWxSZXByZXNlbnRhdGlvbigiJHZhbHVlIik7CiAgICAgIHJldHVybiBuZXcganNBc3QuTGl0ZXJhbE51bWJlcihzaG9ydGVuZWQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdEJvb2woQm9vbENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgaWYgKF9vcHRpb25zLmVuYWJsZU1pbmlmaWNhdGlvbikgewogICAgICBpZiAoY29uc3RhbnQuaXNUcnVlKSB7CiAgICAgICAgLy8gVXNlICEwIGZvciB0cnVlLgogICAgICAgIHJldHVybiBqcygiITAiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBVc2UgITEgZm9yIGZhbHNlLgogICAgICAgIHJldHVybiBqcygiITEiKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGNvbnN0YW50LmlzVHJ1ZSA/IGpzKCd0cnVlJykgOiBqcygnZmFsc2UnKTsKICAgIH0KICB9CgogIC8vLyBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIHF1b3RlZCBzdHJpbmcgdG8gYSBbQ29kZUJ1ZmZlcl0gaW4KICAvLy8gYSBmb3JtIHRoYXQgaXMgdmFsaWQgYXMgSmF2YVNjcmlwdCBzdHJpbmcgbGl0ZXJhbCBjb250ZW50LgogIC8vLyBUaGUgc3RyaW5nIGlzIGFzc3VtZWQgcXVvdGVkIGJ5IGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzLgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRTdHJpbmcoU3RyaW5nQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICByZXR1cm4ganMuZXNjYXBlZFN0cmluZyhjb25zdGFudC5zdHJpbmdWYWx1ZSwgYXNjaWk6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdER1bW15SW50ZXJjZXB0b3IoRHVtbXlJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgY29uc3RhbnQsCiAgICAgIFtfXSkgewogICAgcmV0dXJuIG5ldyBqc0FzdC5MaXRlcmFsTnVtYmVyKCcwJyk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0VW5yZWFjaGFibGUoVW5yZWFjaGFibGVDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIHJldHVybiBuZXcganNBc3QuTGl0ZXJhbE51bWJlcignMCcpOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdEpzTmFtZShKc05hbWVDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pIHsKICAgIHJldHVybiBjb25zdGFudC5uYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdEluc3RhbnRpYXRpb24oSW5zdGFudGlhdGlvbkNvbnN0YW50VmFsdWUgY29uc3RhbnQsCiAgICAgICAgICBbX10pID0+CiAgICAgIG51bGw7CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXREZWZlcnJlZEdsb2JhbChEZWZlcnJlZEdsb2JhbENvbnN0YW50VmFsdWUgY29uc3RhbnQsCiAgICAgICAgICBbX10pID0+CiAgICAgIG51bGw7CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRJbnRlcmNlcHRvcihJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgPT4KICAgICAgbnVsbDsKCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdFR5cGUoVHlwZUNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdENvbnN0cnVjdGVkKENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSA9PgogICAgICBudWxsOwoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0TWFwKE1hcENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAganNBc3QuRXhwcmVzc2lvbiB2aXNpdFNldChTZXRDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pID0+IG51bGw7CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRMaXN0KExpc3RDb25zdGFudFZhbHVlIGNvbnN0YW50LCBbX10pID0+IG51bGw7Cn0KCi8vLyBHZW5lcmF0ZXMgdGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbnMgZm9yIGNvbnN0YW50cy4KLy8vCi8vLyBJdCB1c2VzIGEgZ2l2ZW4gW19jb25zdGFudFJlZmVyZW5jZUdlbmVyYXRvcl0gdG8gcmVmZXJlbmNlIG5lc3RlZCBjb25zdGFudHMKLy8vIChpZiB0aGVyZSBhcmUgc29tZSkuIEl0IGlzIGhlbmNlIHVwIHRvIHRoYXQgZnVuY3Rpb24gdG8gZGVjaWRlIHdoaWNoCi8vLyBjb25zdGFudHMgc2hvdWxkIGJlIGlubGluZWQgb3Igbm90LgpjbGFzcyBDb25zdGFudEVtaXR0ZXIgZXh0ZW5kcyBNb2R1bGFyQ29uc3RhbnRFbWl0dGVyIHsKICAvLyBNYXRjaGVzIGJsYW5rIGxpbmVzLCBjb21tZW50IGxpbmVzIGFuZCB0cmFpbGluZyBjb21tZW50cyB0aGF0IGNhbid0IGJlIHBhcnQKICAvLyBvZiBhIHN0cmluZy4KICBzdGF0aWMgZmluYWwgUmVnRXhwIENPTU1FTlRfUkUgPQogICAgICBuZXcgUmVnRXhwKHInJydeICooLy8uKik/XG58ICAqLy9bXicnIlxuXSokJycnLCBtdWx0aUxpbmU6IHRydWUpOwoKICBmaW5hbCBKQ29tbW9uRWxlbWVudHMgX2NvbW1vbkVsZW1lbnRzOwogIGZpbmFsIEpFbGVtZW50RW52aXJvbm1lbnQgX2VsZW1lbnRFbnZpcm9ubWVudDsKICBmaW5hbCBSdW50aW1lVHlwZXNOZWVkIF9ydGlOZWVkOwogIGZpbmFsIFJ1bnRpbWVUeXBlc0VuY29kZXIgX3J0aUVuY29kZXI7CiAgZmluYWwgUmVjaXBlRW5jb2RlciBfcnRpUmVjaXBlRW5jb2RlcjsKICBmaW5hbCBKRmllbGRBbmFseXNpcyBfZmllbGRBbmFseXNpczsKICBmaW5hbCBFbWl0dGVyIF9lbWl0dGVyOwogIGZpbmFsIF9Db25zdGFudFJlZmVyZW5jZUdlbmVyYXRvciBfY29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3I7CiAgZmluYWwgX0NvbnN0YW50TGlzdEdlbmVyYXRvciBfbWFrZUNvbnN0YW50TGlzdDsKCiAgLy8vIFRoZSBnaXZlbiBbX2NvbnN0YW50UmVmZXJlbmNlR2VuZXJhdG9yXSBmdW5jdGlvbiBtdXN0LCB3aGVuIGludm9rZWQgd2l0aCBhCiAgLy8vIGNvbnN0YW50LCBlaXRoZXIgcmV0dXJuIGEgcmVmZXJlbmNlIG9yIHJldHVybiBpdHMgbGl0ZXJhbCBleHByZXNzaW9uIGlmIGl0CiAgLy8vIGNhbiBiZSBpbmxpbmVkLgogIENvbnN0YW50RW1pdHRlcigKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICAgIHRoaXMuX2NvbW1vbkVsZW1lbnRzLAogICAgICB0aGlzLl9lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgIHRoaXMuX3J0aU5lZWQsCiAgICAgIHRoaXMuX3J0aUVuY29kZXIsCiAgICAgIHRoaXMuX3J0aVJlY2lwZUVuY29kZXIsCiAgICAgIHRoaXMuX2ZpZWxkQW5hbHlzaXMsCiAgICAgIHRoaXMuX2VtaXR0ZXIsCiAgICAgIHRoaXMuX2NvbnN0YW50UmVmZXJlbmNlR2VuZXJhdG9yLAogICAgICB0aGlzLl9tYWtlQ29uc3RhbnRMaXN0KQogICAgICA6IHN1cGVyKG9wdGlvbnMpOwoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0TGlzdChMaXN0Q29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGVsZW1lbnRzID0gY29uc3RhbnQuZW50cmllcwogICAgICAgIC5tYXAoX2NvbnN0YW50UmVmZXJlbmNlR2VuZXJhdG9yKQogICAgICAgIC50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgIGpzQXN0LkFycmF5SW5pdGlhbGl6ZXIgYXJyYXkgPSBuZXcganNBc3QuQXJyYXlJbml0aWFsaXplcihlbGVtZW50cyk7CiAgICBqc0FzdC5FeHByZXNzaW9uIHZhbHVlID0gX21ha2VDb25zdGFudExpc3QoYXJyYXkpOwogICAgaWYgKF9vcHRpb25zLmV4cGVyaW1lbnROZXdSdGkpIHsKICAgICAgcmV0dXJuIG1heWJlQWRkTGlzdFR5cGVBcmd1bWVudHNOZXdSdGkoY29uc3RhbnQsIGNvbnN0YW50LnR5cGUsIHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBtYXliZUFkZFR5cGVBcmd1bWVudHMoY29uc3RhbnQsIGNvbnN0YW50LnR5cGUsIHZhbHVlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRTZXQoY29uc3RhbnRfc3lzdGVtLkphdmFTY3JpcHRTZXRDb25zdGFudCBjb25zdGFudCwKICAgICAgW19dKSB7CiAgICBJbnRlcmZhY2VUeXBlIHNvdXJjZVR5cGUgPSBjb25zdGFudC50eXBlOwogICAgQ2xhc3NFbnRpdHkgY2xhc3NFbGVtZW50ID0gc291cmNlVHlwZS5lbGVtZW50OwogICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzRWxlbWVudC5uYW1lOwogICAgaWYgKCFpZGVudGljYWwoY2xhc3NFbGVtZW50LCBfY29tbW9uRWxlbWVudHMuY29uc3RTZXRMaXRlcmFsQ2xhc3MpKSB7CiAgICAgIGZhaWxlZEF0KAogICAgICAgICAgY2xhc3NFbGVtZW50LCAiQ29tcGlsZXIgZW5jb3V0ZXJlZCB1bmV4cGVjdGVkIHNldCBjbGFzcyAkY2xhc3NOYW1lIik7CiAgICB9CgogICAgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBhcmd1bWVudHMgPSA8anNBc3QuRXhwcmVzc2lvbj5bCiAgICAgIF9jb25zdGFudFJlZmVyZW5jZUdlbmVyYXRvcihjb25zdGFudC5lbnRyaWVzKSwKICAgIF07CgogICAgaWYgKF9ydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGNsYXNzRWxlbWVudCkpIHsKICAgICAgaWYgKF9vcHRpb25zLmV4cGVyaW1lbnROZXdSdGkpIHsKICAgICAgICBhcmd1bWVudHMuYWRkKF9yZWlmaWVkVHlwZU5ld1J0aShzb3VyY2VUeXBlKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXJndW1lbnRzCiAgICAgICAgICAgIC5hZGQoX3JlaWZpZWRUeXBlQXJndW1lbnRzKGNvbnN0YW50LCBzb3VyY2VUeXBlLnR5cGVBcmd1bWVudHMpKTsKICAgICAgfQogICAgfQoKICAgIGpzQXN0LkV4cHJlc3Npb24gY29uc3RydWN0b3IgPSBfZW1pdHRlci5jb25zdHJ1Y3RvckFjY2VzcyhjbGFzc0VsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBqc0FzdC5OZXcoY29uc3RydWN0b3IsIGFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0TWFwKGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQgY29uc3RhbnQsCiAgICAgIFtfXSkgewogICAganNBc3QuRXhwcmVzc2lvbiBqc01hcCgpIHsKICAgICAgTGlzdDxqc0FzdC5Qcm9wZXJ0eT4gcHJvcGVydGllcyA9IDxqc0FzdC5Qcm9wZXJ0eT5bXTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdGFudC5sZW5ndGg7IGkrKykgewogICAgICAgIFN0cmluZ0NvbnN0YW50VmFsdWUga2V5ID0gY29uc3RhbnQua2V5c1tpXTsKICAgICAgICBpZiAoa2V5LnN0cmluZ1ZhbHVlID09CiAgICAgICAgICAgIGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQuUFJPVE9fUFJPUEVSVFkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gS2V5cyBpbiBsaXRlcmFsIG1hcHMgbXVzdCBiZSBlbWl0dGVkIGluIHBsYWNlLgogICAgICAgIGpzQXN0LkxpdGVyYWwga2V5RXhwcmVzc2lvbiA9IF92aXNpdChrZXkpOwogICAgICAgIGpzQXN0LkV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0KICAgICAgICAgICAgX2NvbnN0YW50UmVmZXJlbmNlR2VuZXJhdG9yKGNvbnN0YW50LnZhbHVlc1tpXSk7CiAgICAgICAgcHJvcGVydGllcy5hZGQobmV3IGpzQXN0LlByb3BlcnR5KGtleUV4cHJlc3Npb24sIHZhbHVlRXhwcmVzc2lvbikpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcganNBc3QuT2JqZWN0SW5pdGlhbGl6ZXIocHJvcGVydGllcyk7CiAgICB9CgogICAganNBc3QuRXhwcmVzc2lvbiBqc0dlbmVyYWxNYXAoKSB7CiAgICAgIExpc3Q8anNBc3QuRXhwcmVzc2lvbj4gZGF0YSA9IDxqc0FzdC5FeHByZXNzaW9uPltdOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0YW50LmtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBqc0FzdC5FeHByZXNzaW9uIGtleUV4cHJlc3Npb24gPQogICAgICAgICAgICBfY29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3IoY29uc3RhbnQua2V5c1tpXSk7CiAgICAgICAganNBc3QuRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPQogICAgICAgICAgICBfY29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3IoY29uc3RhbnQudmFsdWVzW2ldKTsKICAgICAgICBkYXRhLmFkZChrZXlFeHByZXNzaW9uKTsKICAgICAgICBkYXRhLmFkZCh2YWx1ZUV4cHJlc3Npb24pOwogICAgICB9CiAgICAgIHJldHVybiBuZXcganNBc3QuQXJyYXlJbml0aWFsaXplcihkYXRhKTsKICAgIH0KCiAgICBDbGFzc0VudGl0eSBjbGFzc0VsZW1lbnQgPSBjb25zdGFudC50eXBlLmVsZW1lbnQ7CiAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NFbGVtZW50Lm5hbWU7CgogICAgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBhcmd1bWVudHMgPSA8anNBc3QuRXhwcmVzc2lvbj5bXTsKCiAgICAvLyBUaGUgYXJndW1lbnRzIG9mIHRoZSBKYXZhU2NyaXB0IGNvbnN0cnVjdG9yIGZvciBhbnkgZ2l2ZW4gRGFydCBjbGFzcwogICAgLy8gYXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBtZW1iZXJzIG9mIHRoZSBjbGFzcyBlbGVtZW50LgogICAgaW50IGVtaXR0ZWRBcmd1bWVudENvdW50ID0gMDsKICAgIF9lbGVtZW50RW52aXJvbm1lbnQuZm9yRWFjaEluc3RhbmNlRmllbGQoY2xhc3NFbGVtZW50LAogICAgICAgIChDbGFzc0VudGl0eSBlbmNsb3NpbmcsIEZpZWxkRW50aXR5IGZpZWxkKSB7CiAgICAgIGlmIChfZmllbGRBbmFseXNpcy5nZXRGaWVsZERhdGEoZmllbGQpLmlzRWxpZGVkKSByZXR1cm47CiAgICAgIGlmIChmaWVsZC5uYW1lID09IGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQuTEVOR1RIX05BTUUpIHsKICAgICAgICBhcmd1bWVudHMKICAgICAgICAgICAgLmFkZChuZXcganNBc3QuTGl0ZXJhbE51bWJlcignJHtjb25zdGFudC5rZXlMaXN0LmVudHJpZXMubGVuZ3RofScpKTsKICAgICAgfSBlbHNlIGlmIChmaWVsZC5uYW1lID09CiAgICAgICAgICBjb25zdGFudF9zeXN0ZW0uSmF2YVNjcmlwdE1hcENvbnN0YW50LkpTX09CSkVDVF9OQU1FKSB7CiAgICAgICAgYXJndW1lbnRzLmFkZChqc01hcCgpKTsKICAgICAgfSBlbHNlIGlmIChmaWVsZC5uYW1lID09CiAgICAgICAgICBjb25zdGFudF9zeXN0ZW0uSmF2YVNjcmlwdE1hcENvbnN0YW50LktFWVNfTkFNRSkgewogICAgICAgIGFyZ3VtZW50cy5hZGQoX2NvbnN0YW50UmVmZXJlbmNlR2VuZXJhdG9yKGNvbnN0YW50LmtleUxpc3QpKTsKICAgICAgfSBlbHNlIGlmIChmaWVsZC5uYW1lID09CiAgICAgICAgICBjb25zdGFudF9zeXN0ZW0uSmF2YVNjcmlwdE1hcENvbnN0YW50LlBST1RPX1ZBTFVFKSB7CiAgICAgICAgYXNzZXJ0KGNvbnN0YW50LnByb3RvVmFsdWUgIT0gbnVsbCk7CiAgICAgICAgYXJndW1lbnRzLmFkZChfY29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3IoY29uc3RhbnQucHJvdG9WYWx1ZSkpOwogICAgICB9IGVsc2UgaWYgKGZpZWxkLm5hbWUgPT0KICAgICAgICAgIGNvbnN0YW50X3N5c3RlbS5KYXZhU2NyaXB0TWFwQ29uc3RhbnQuSlNfREFUQV9OQU1FKSB7CiAgICAgICAgYXJndW1lbnRzLmFkZChqc0dlbmVyYWxNYXAoKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmFpbGVkQXQoZmllbGQsCiAgICAgICAgICAgICJDb21waWxlciBoYXMgdW5leHBlY3RlZCBmaWVsZCAke2ZpZWxkLm5hbWV9IGZvciAke2NsYXNzTmFtZX0uIik7CiAgICAgIH0KICAgICAgZW1pdHRlZEFyZ3VtZW50Q291bnQrKzsKICAgIH0pOwogICAgaWYgKChjbGFzc05hbWUgPT0gY29uc3RhbnRfc3lzdGVtLkphdmFTY3JpcHRNYXBDb25zdGFudC5EQVJUX1NUUklOR19DTEFTUyAmJgogICAgICAgICAgICBlbWl0dGVkQXJndW1lbnRDb3VudCAhPSAzKSB8fAogICAgICAgIChjbGFzc05hbWUgPT0gY29uc3RhbnRfc3lzdGVtLkphdmFTY3JpcHRNYXBDb25zdGFudC5EQVJUX1BST1RPX0NMQVNTICYmCiAgICAgICAgICAgIGVtaXR0ZWRBcmd1bWVudENvdW50ICE9IDQpIHx8CiAgICAgICAgKGNsYXNzTmFtZSA9PQogICAgICAgICAgICAgICAgY29uc3RhbnRfc3lzdGVtLkphdmFTY3JpcHRNYXBDb25zdGFudC5EQVJUX0dFTkVSQUxfQ0xBU1MgJiYKICAgICAgICAgICAgZW1pdHRlZEFyZ3VtZW50Q291bnQgIT0gMSkpIHsKICAgICAgZmFpbGVkQXQoY2xhc3NFbGVtZW50LAogICAgICAgICAgIkNvbXBpbGVyIGFuZCAke2NsYXNzTmFtZX0gZGlzYWdyZWUgb24gbnVtYmVyIG9mIGZpZWxkcy4iKTsKICAgIH0KCiAgICBpZiAoX3J0aU5lZWQuY2xhc3NOZWVkc1R5cGVBcmd1bWVudHMoY2xhc3NFbGVtZW50KSkgewogICAgICBpZiAoX29wdGlvbnMuZXhwZXJpbWVudE5ld1J0aSkgewogICAgICAgIGFyZ3VtZW50cy5hZGQoX3JlaWZpZWRUeXBlTmV3UnRpKGNvbnN0YW50LnR5cGUpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcmd1bWVudHMKICAgICAgICAgICAgLmFkZChfcmVpZmllZFR5cGVBcmd1bWVudHMoY29uc3RhbnQsIGNvbnN0YW50LnR5cGUudHlwZUFyZ3VtZW50cykpOwogICAgICB9CiAgICB9CgogICAganNBc3QuRXhwcmVzc2lvbiBjb25zdHJ1Y3RvciA9IF9lbWl0dGVyLmNvbnN0cnVjdG9yQWNjZXNzKGNsYXNzRWxlbWVudCk7CiAgICBqc0FzdC5FeHByZXNzaW9uIHZhbHVlID0gbmV3IGpzQXN0Lk5ldyhjb25zdHJ1Y3RvciwgYXJndW1lbnRzKTsKICAgIHJldHVybiB2YWx1ZTsKICB9CgogIGpzQXN0LlByb3BlcnR5QWNjZXNzIGdldEhlbHBlclByb3BlcnR5KEZ1bmN0aW9uRW50aXR5IGhlbHBlcikgewogICAgcmV0dXJuIF9lbWl0dGVyLnN0YXRpY0Z1bmN0aW9uQWNjZXNzKGhlbHBlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0VHlwZShUeXBlQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgW19dKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gY29uc3RhbnQucmVwcmVzZW50ZWRUeXBlLnVuYWxpYXNlZDsKCiAgICBpZiAoX29wdGlvbnMuZXhwZXJpbWVudE5ld1J0aSkgewogICAgICBhc3NlcnQoIXR5cGUuY29udGFpbnNUeXBlVmFyaWFibGVzKTsKCiAgICAgIGpzQXN0LkV4cHJlc3Npb24gcmVjaXBlID0gX3J0aVJlY2lwZUVuY29kZXIuZW5jb2RlR3JvdW5kUmVjaXBlKAogICAgICAgICAgX2VtaXR0ZXIsIFR5cGVFeHByZXNzaW9uUmVjaXBlKHR5cGUpKTsKCiAgICAgIC8vIEdlbmVyYXRlICBgdHlwZUxpdGVyYWwocmVjaXBlKWAuCgogICAgICAvLyBUT0RPKHNyYSk6IGB0eXBlTGl0ZXJhbChyKWAgY2FsbHMgYGNyZWF0ZVJ1bnRpbWVUeXBlKGZpbmRUeXBlKHIpKWAuCiAgICAgIC8vIEZpbmQgYSB3YXkgdG8gc2hhcmUgdGhlIGBmaW5kVHlwZWAgY2FsbCB3aXRoIG1ldGhvZHMgdGhhdCBhbHNvIHVzZSB0aGUKICAgICAgLy8gdHlwZS4KICAgICAgcmV0dXJuIGpzKCcjKCMpJywKICAgICAgICAgIFtnZXRIZWxwZXJQcm9wZXJ0eShfY29tbW9uRWxlbWVudHMudHlwZUxpdGVyYWxNYWtlciksIHJlY2lwZV0pOwogICAgfSBlbHNlIHsKICAgICAganNBc3QuRXhwcmVzc2lvbiB1bmV4cGVjdGVkKFR5cGVWYXJpYWJsZVR5cGUgX3ZhcmlhYmxlKSB7CiAgICAgICAgVHlwZVZhcmlhYmxlVHlwZSB2YXJpYWJsZSA9IF92YXJpYWJsZTsKICAgICAgICB0aHJvdyBmYWlsZWRBdCgKICAgICAgICAgICAgTk9fTE9DQVRJT05fU1BBTk5BQkxFLAogICAgICAgICAgICAiVW5leHBlY3RlZCB0eXBlIHZhcmlhYmxlICcke3ZhcmlhYmxlfSciCiAgICAgICAgICAgICIgaW4gY29uc3RhbnQgJyR7Y29uc3RhbnQudG9EYXJ0VGV4dCgpfSciKTsKICAgICAgfQoKICAgICAganNBc3QuRXhwcmVzc2lvbiBydGkgPQogICAgICAgICAgX3J0aUVuY29kZXIuZ2V0VHlwZVJlcHJlc2VudGF0aW9uKF9lbWl0dGVyLCB0eXBlLCB1bmV4cGVjdGVkKTsKCiAgICAgIHJldHVybiBuZXcganNBc3QuQ2FsbCgKICAgICAgICAgIGdldEhlbHBlclByb3BlcnR5KF9jb21tb25FbGVtZW50cy5jcmVhdGVSdW50aW1lVHlwZSksIFtydGldKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRJbnRlcmNlcHRvcihJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgQ2xhc3NFbnRpdHkgaW50ZXJjZXB0b3JDbGFzcyA9IGNvbnN0YW50LmNsczsKICAgIHJldHVybiBfZW1pdHRlci5pbnRlcmNlcHRvclByb3RvdHlwZUFjY2VzcyhpbnRlcmNlcHRvckNsYXNzKTsKICB9CgogIEBvdmVycmlkZQogIGpzQXN0LkV4cHJlc3Npb24gdmlzaXRDb25zdHJ1Y3RlZChDb25zdHJ1Y3RlZENvbnN0YW50VmFsdWUgY29uc3RhbnQsIFtfXSkgewogICAgQ2xhc3NFbnRpdHkgZWxlbWVudCA9IGNvbnN0YW50LnR5cGUuZWxlbWVudDsKICAgIGlmIChlbGVtZW50ID09IF9jb21tb25FbGVtZW50cy5qc0NvbnN0Q2xhc3MpIHsKICAgICAgU3RyaW5nQ29uc3RhbnRWYWx1ZSBzdHIgPSBjb25zdGFudC5maWVsZHMudmFsdWVzLnNpbmdsZTsKICAgICAgU3RyaW5nIHZhbHVlID0gc3RyLnN0cmluZ1ZhbHVlOwogICAgICByZXR1cm4gbmV3IGpzQXN0LkxpdGVyYWxFeHByZXNzaW9uKHN0cmlwQ29tbWVudHModmFsdWUpKTsKICAgIH0KICAgIGpzQXN0LkV4cHJlc3Npb24gY29uc3RydWN0b3IgPQogICAgICAgIF9lbWl0dGVyLmNvbnN0cnVjdG9yQWNjZXNzKGNvbnN0YW50LnR5cGUuZWxlbWVudCk7CiAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGZpZWxkcyA9IDxqc0FzdC5FeHByZXNzaW9uPltdOwogICAgX2VsZW1lbnRFbnZpcm9ubWVudC5mb3JFYWNoSW5zdGFuY2VGaWVsZChlbGVtZW50LCAoXywgRmllbGRFbnRpdHkgZmllbGQpIHsKICAgICAgRmllbGRBbmFseXNpc0RhdGEgZmllbGREYXRhID0gX2ZpZWxkQW5hbHlzaXMuZ2V0RmllbGREYXRhKGZpZWxkKTsKICAgICAgaWYgKGZpZWxkRGF0YS5pc0VsaWRlZCkgcmV0dXJuOwogICAgICBpZiAoIWZpZWxkRGF0YS5pc0luaXRpYWxpemVkSW5BbGxvY2F0b3IpIHsKICAgICAgICBmaWVsZHMuYWRkKF9jb25zdGFudFJlZmVyZW5jZUdlbmVyYXRvcihjb25zdGFudC5maWVsZHNbZmllbGRdKSk7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKF9ydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKGNvbnN0YW50LnR5cGUuZWxlbWVudCkpIHsKICAgICAgaWYgKF9vcHRpb25zLmV4cGVyaW1lbnROZXdSdGkpIHsKICAgICAgICBmaWVsZHMuYWRkKF9yZWlmaWVkVHlwZU5ld1J0aShjb25zdGFudC50eXBlKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmllbGRzCiAgICAgICAgICAgIC5hZGQoX3JlaWZpZWRUeXBlQXJndW1lbnRzKGNvbnN0YW50LCBjb25zdGFudC50eXBlLnR5cGVBcmd1bWVudHMpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBqc0FzdC5OZXcoY29uc3RydWN0b3IsIGZpZWxkcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0SW5zdGFudGlhdGlvbihJbnN0YW50aWF0aW9uQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwKICAgICAgW19dKSB7CiAgICBDbGFzc0VudGl0eSBjbHMgPQogICAgICAgIF9jb21tb25FbGVtZW50cy5nZXRJbnN0YW50aWF0aW9uQ2xhc3MoY29uc3RhbnQudHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgTGlzdDxqc0FzdC5FeHByZXNzaW9uPiBmaWVsZHMgPSA8anNBc3QuRXhwcmVzc2lvbj5bCiAgICAgIF9jb25zdGFudFJlZmVyZW5jZUdlbmVyYXRvcihjb25zdGFudC5mdW5jdGlvbikKICAgIF07CiAgICBpZiAoX29wdGlvbnMuZXhwZXJpbWVudE5ld1J0aSkgewogICAgICBmaWVsZHMKICAgICAgICAgIC5hZGQoX3JlaWZpZWRUeXBlTmV3UnRpKEludGVyZmFjZVR5cGUoY2xzLCBjb25zdGFudC50eXBlQXJndW1lbnRzKSkpOwogICAgfSBlbHNlIHsKICAgICAgZmllbGRzLmFkZChfcmVpZmllZFR5cGVBcmd1bWVudHMoY29uc3RhbnQsIGNvbnN0YW50LnR5cGVBcmd1bWVudHMpKTsKICAgIH0KICAgIGpzQXN0LkV4cHJlc3Npb24gY29uc3RydWN0b3IgPSBfZW1pdHRlci5jb25zdHJ1Y3RvckFjY2VzcyhjbHMpOwogICAgcmV0dXJuIG5ldyBqc0FzdC5OZXcoY29uc3RydWN0b3IsIGZpZWxkcyk7CiAgfQoKICBTdHJpbmcgc3RyaXBDb21tZW50cyhTdHJpbmcgcmF3SmF2YVNjcmlwdCkgewogICAgcmV0dXJuIHJhd0phdmFTY3JpcHQucmVwbGFjZUFsbChDT01NRU5UX1JFLCAnJyk7CiAgfQoKICBqc0FzdC5FeHByZXNzaW9uIG1heWJlQWRkVHlwZUFyZ3VtZW50cygKICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCwgSW50ZXJmYWNlVHlwZSB0eXBlLCBqc0FzdC5FeHByZXNzaW9uIHZhbHVlKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgIXR5cGUudHJlYXRBc1JhdyAmJgogICAgICAgIF9ydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKHR5cGUuZWxlbWVudCkpIHsKICAgICAgcmV0dXJuIG5ldyBqc0FzdC5DYWxsKAogICAgICAgICAgZ2V0SGVscGVyUHJvcGVydHkoX2NvbW1vbkVsZW1lbnRzLnNldFJ1bnRpbWVUeXBlSW5mbyksCiAgICAgICAgICBbdmFsdWUsIF9yZWlmaWVkVHlwZUFyZ3VtZW50cyhjb25zdGFudCwgdHlwZS50eXBlQXJndW1lbnRzKV0pOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiBtYXliZUFkZExpc3RUeXBlQXJndW1lbnRzTmV3UnRpKAogICAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50LCBJbnRlcmZhY2VUeXBlIHR5cGUsIGpzQXN0LkV4cHJlc3Npb24gdmFsdWUpIHsKICAgIC8vIExpc3Q8VD4gLS0+IEpTQXJyYXk8VD4KICAgIGlmICh0eXBlLmVsZW1lbnQgIT0gX2NvbW1vbkVsZW1lbnRzLmpzQXJyYXlDbGFzcykgewogICAgICB0eXBlID0gSW50ZXJmYWNlVHlwZShfY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzLCB0eXBlLnR5cGVBcmd1bWVudHMpOwogICAgfQogICAgaWYgKF9ydGlOZWVkLmNsYXNzTmVlZHNUeXBlQXJndW1lbnRzKHR5cGUuZWxlbWVudCkpIHsKICAgICAgcmV0dXJuIG5ldyBqc0FzdC5DYWxsKAogICAgICAgICAgZ2V0SGVscGVyUHJvcGVydHkoX2NvbW1vbkVsZW1lbnRzLnNldFJ1bnRpbWVUeXBlSW5mbyksCiAgICAgICAgICBbdmFsdWUsIF9yZWlmaWVkVHlwZU5ld1J0aSh0eXBlKV0pOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAganNBc3QuRXhwcmVzc2lvbiBfcmVpZmllZFR5cGVBcmd1bWVudHMoCiAgICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIGpzQXN0LkV4cHJlc3Npb24gdW5leHBlY3RlZChUeXBlVmFyaWFibGVUeXBlIF92YXJpYWJsZSkgewogICAgICBUeXBlVmFyaWFibGVUeXBlIHZhcmlhYmxlID0gX3ZhcmlhYmxlOwogICAgICB0aHJvdyBmYWlsZWRBdCgKICAgICAgICAgIE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwKICAgICAgICAgICJVbmV4cGVjdGVkIHR5cGUgdmFyaWFibGUgJyR7dmFyaWFibGV9JyIKICAgICAgICAgICIgaW4gY29uc3RhbnQgJyR7Y29uc3RhbnQudG9EYXJ0VGV4dCgpfSciKTsKICAgIH0KCiAgICBMaXN0PGpzQXN0LkV4cHJlc3Npb24+IGFyZ3VtZW50cyA9IDxqc0FzdC5FeHByZXNzaW9uPltdOwogICAgZm9yIChEYXJ0VHlwZSBhcmd1bWVudCBpbiB0eXBlQXJndW1lbnRzKSB7CiAgICAgIGFyZ3VtZW50cy5hZGQoCiAgICAgICAgICBfcnRpRW5jb2Rlci5nZXRUeXBlUmVwcmVzZW50YXRpb24oX2VtaXR0ZXIsIGFyZ3VtZW50LCB1bmV4cGVjdGVkKSk7CiAgICB9CiAgICByZXR1cm4gbmV3IGpzQXN0LkFycmF5SW5pdGlhbGl6ZXIoYXJndW1lbnRzKTsKICB9CgogIGpzQXN0LkV4cHJlc3Npb24gX3JlaWZpZWRUeXBlTmV3UnRpKERhcnRUeXBlIHR5cGUpIHsKICAgIGFzc2VydChfb3B0aW9ucy5leHBlcmltZW50TmV3UnRpKTsKICAgIGFzc2VydCghdHlwZS5jb250YWluc1R5cGVWYXJpYWJsZXMpOwogICAganNBc3QuRXhwcmVzc2lvbiByZWNpcGUgPSBfcnRpUmVjaXBlRW5jb2Rlci5lbmNvZGVHcm91bmRSZWNpcGUoCiAgICAgICAgX2VtaXR0ZXIsIFR5cGVFeHByZXNzaW9uUmVjaXBlKHR5cGUpKTsKICAgIHJldHVybiBqcyhyJyMoIyknLCBbZ2V0SGVscGVyUHJvcGVydHkoX2NvbW1vbkVsZW1lbnRzLmZpbmRUeXBlKSwgcmVjaXBlXSk7CiAgfQoKICBAb3ZlcnJpZGUKICBqc0FzdC5FeHByZXNzaW9uIHZpc2l0RGVmZXJyZWRHbG9iYWwoRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlIGNvbnN0YW50LAogICAgICBbX10pIHsKICAgIHJldHVybiBfY29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3IoY29uc3RhbnQucmVmZXJlbmNlZCk7CiAgfQp9CoIJAE5OPAEZIj8jJCEhISAsL0EaMh00KAFOAUkBTEEdPiIBKQFNTxw2HQQBNCgEAQxIKkIEAQxAJAQBDEYkBAEvHSowMg0BSw8GUThCOywcJSYoNSdMQBMEAQw+JlBPB0xLUR8uH0UyNzUGTSQGNAQBDEQpFxgrGCwZDUYxBgQBDEAnHRwZDx0ZCA05BgQBQ0E/DERABAEMUQ0pBAEMTikEAQxEGgQBDEsSDAEMTRIMAQxPDAEMRwEMTwwBDEUBDEUBDEcCATgEUEkoN1ESI0gBKTEjKSknGkEyAVFRFhMfHCAVGB4bFSgeGAEMQDcqIkk3JU4NRAYEAQxMDS4zKkoQUAYBOzUHATonNw8STQgGAU0yBAEMTA0fPDI0H0QUCgE6Mys9TAg2BgEmOjcpOys9ISMILwYBNioBPQFMQiI7NT9NElEfQiAfPUYfPy1JH0AnDxhOCB4IUSpQKhZMKh1GBgE6JzoPElAIBgFNRBIEAUIyBAEMQDgBJSsBRjEBKgFNUA8YSg1ALxgjNTgIAR1JAR1IBgQBDE4xQgQBDE4xMz8mQAYjOzpPSCYxSQgIQyc3Dw9QCAYvBAEMSw0WTjg1ByUNUA1LBkQvBAEvNQQBKkwhHDodQUkGEgQBNEweOE4GOh1BLgYSBAEqPj4tFiEzNgYBPS8VTgYyBAE3JylEL08EAQxNDT0EAgE1cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9jb25zdGFudF9lbWl0dGVyLmRhcnRLc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfZW1pdHRlci9zdGFydHVwX2VtaXR0ZXIvbW9kZWxfZW1pdHRlci5kYXJ0vs4vLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0MmpzLmpzX2VtaXR0ZXIuc3RhcnR1cF9lbWl0dGVyLm1vZGVsX2VtaXR0ZXI7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBKc29uRW5jb2RlcjsKaW1wb3J0ICdkYXJ0Om1hdGgnIHNob3cgUmFuZG9tOwoKaW1wb3J0ICdwYWNrYWdlOmpzX3J1bnRpbWUvc2hhcmVkL2VtYmVkZGVkX25hbWVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgREVGRVJSRURfSU5JVElBTElaRUQsCiAgICAgICAgREVGRVJSRURfTElCUkFSWV9QQVJUUywKICAgICAgICBERUZFUlJFRF9QQVJUX1VSSVMsCiAgICAgICAgREVGRVJSRURfUEFSVF9IQVNIRVMsCiAgICAgICAgR0VUX1RZUEVfRlJPTV9OQU1FLAogICAgICAgIElOSVRJQUxJWkVfTE9BREVEX0hVTkssCiAgICAgICAgSU5URVJDRVBUT1JTX0JZX1RBRywKICAgICAgICBJU19IVU5LX0lOSVRJQUxJWkVELAogICAgICAgIElTX0hVTktfTE9BREVELAogICAgICAgIEpzR2V0TmFtZSwKICAgICAgICBMRUFGX1RBR1MsCiAgICAgICAgTUFOR0xFRF9HTE9CQUxfTkFNRVMsCiAgICAgICAgTUFOR0xFRF9OQU1FUywKICAgICAgICBNRVRBREFUQSwKICAgICAgICBOQVRJVkVfU1VQRVJDTEFTU19UQUdfTkFNRSwKICAgICAgICBSVElfVU5JVkVSU0UsCiAgICAgICAgUnRpVW5pdmVyc2VGaWVsZE5hbWVzLAogICAgICAgIFRZUEVfVE9fSU5URVJDRVBUT1JfTUFQLAogICAgICAgIFRZUEVTOwoKaW1wb3J0ICdwYWNrYWdlOmpzX2FzdC9zcmMvcHJlY2VkZW5jZS5kYXJ0JyBhcyBqc19wcmVjZWRlbmNlOwoKaW1wb3J0ICcuLi8uLi8uLi9jb21waWxlcl9uZXcuZGFydCc7CmltcG9ydCAnLi4vLi4vY29tbW9uLmRhcnQnOwppbXBvcnQgJy4uLy4uL2NvbW1vbi90YXNrcy5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnCiAgICBzaG93IENvbnN0YW50VmFsdWUsIEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSwgTnVsbENvbnN0YW50VmFsdWU7CmltcG9ydCAnLi4vLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHMsIEpFbGVtZW50RW52aXJvbm1lbnQ7CmltcG9ydCAnLi4vLi4vZHVtcF9pbmZvLmRhcnQnOwppbXBvcnQgJy4uLy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uLy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uLy4uL2hhc2gvc2hhMS5kYXJ0JyBzaG93IEhhc2hlcjsKaW1wb3J0ICcuLi8uLi9pby9jb2RlX291dHB1dC5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9pby9sb2NhdGlvbl9wcm92aWRlci5kYXJ0JyBzaG93IExvY2F0aW9uQ29sbGVjdG9yOwppbXBvcnQgJy4uLy4uL2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9pby9zb3VyY2VfbWFwX2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VNYXBCdWlsZGVyOwppbXBvcnQgJy4uLy4uL2pzL2pzLmRhcnQnIGFzIGpzOwppbXBvcnQgJy4uLy4uL2pzX2JhY2tlbmQvanNfYmFja2VuZC5kYXJ0JwogICAgc2hvdyBOYW1lciwgQ29uc3RhbnRFbWl0dGVyLCBTdHJpbmdCYWNrZWROYW1lOwppbXBvcnQgJy4uLy4uL2pzX2JhY2tlbmQvanNfaW50ZXJvcF9hbmFseXNpcy5kYXJ0JyBhcyBqc0ludGVyb3BBbmFseXNpczsKaW1wb3J0ICcuLi8uLi9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vLi4vanNfYmFja2VuZC9ydW50aW1lX3R5cGVzX2NvZGVnZW4uZGFydCc7CmltcG9ydCAnLi4vLi4vanNfYmFja2VuZC9ydW50aW1lX3R5cGVzX25ldy5kYXJ0JwogICAgc2hvdyBSZWNpcGVFbmNvZGVyLCBSZWNpcGVFbmNvZGVySW1wbCwgUnVsZXNldEVuY29kZXI7CmltcG9ydCAnLi4vLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi8uLi91bml2ZXJzZS9jb2RlZ2VuX3dvcmxkX2J1aWxkZXIuZGFydCcgc2hvdyBDb2RlZ2VuV29ybGQ7CmltcG9ydCAnLi4vLi4vd29ybGQuZGFydCc7CmltcG9ydCAnLi4vY29kZV9lbWl0dGVyX3Rhc2suZGFydCc7CmltcG9ydCAnLi4vY29uc3RhbnRfb3JkZXJpbmcuZGFydCcgc2hvdyBDb25zdGFudE9yZGVyaW5nOwppbXBvcnQgJy4uL2hlYWRlcnMuZGFydCc7CmltcG9ydCAnLi4vanNfZW1pdHRlci5kYXJ0JyBzaG93IGJ1aWxkVGVhck9mZkNvZGUsIE5hdGl2ZUdlbmVyYXRvcjsKaW1wb3J0ICcuLi9tb2RlbC5kYXJ0JzsKCnBhcnQgJ2ZyYWdtZW50X2VtaXR0ZXIuZGFydCc7CgpjbGFzcyBNb2RlbEVtaXR0ZXIgewogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBfb3B0aW9uczsKICBmaW5hbCBEaWFnbm9zdGljUmVwb3J0ZXIgX3JlcG9ydGVyOwogIGZpbmFsIENvbXBpbGVyT3V0cHV0IF9vdXRwdXRQcm92aWRlcjsKICBmaW5hbCBEdW1wSW5mb1Rhc2sgX2R1bXBJbmZvVGFzazsKICBmaW5hbCBOYW1lciBfbmFtZXI7CiAgZmluYWwgQ29tcGlsZXJUYXNrIF90YXNrOwogIGZpbmFsIEVtaXR0ZXIgX2VtaXR0ZXI7CiAgQ29uc3RhbnRFbWl0dGVyIF9jb25zdGFudEVtaXR0ZXI7CiAgZmluYWwgYm9vbCBfc2hvdWxkR2VuZXJhdGVTb3VyY2VNYXA7CiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKICBmaW5hbCBDb25zdGFudE9yZGVyaW5nIF9jb25zdGFudE9yZGVyaW5nOwogIGZpbmFsIFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3kgX3NvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3k7CgogIC8vIFRoZSBmdWxsIGNvZGUgdGhhdCBpcyB3cml0dGVuIHRvIGVhY2ggaHVuayBwYXJ0LWZpbGUuCiAgZmluYWwgTWFwPEZyYWdtZW50LCBDb2RlT3V0cHV0PiBvdXRwdXRCdWZmZXJzID0ge307CgogIFNldDxGcmFnbWVudD4gb21pdHRlZEZyYWdtZW50cyA9IFNldCgpOwoKICAvLy8gRm9yIGRlZmVycmVkIGxvYWRpbmcgd2UgY29tbXVuaWNhdGUgdGhlIGluaXRpYWxpemVycyB2aWEgdGhpcyBnbG9iYWwgdmFyLgogIHN0YXRpYyBjb25zdCBTdHJpbmcgZGVmZXJyZWRJbml0aWFsaXplcnNHbG9iYWwgPQogICAgICByIiRfX2RhcnRfZGVmZXJyZWRfaW5pdGlhbGl6ZXJzX18iOwoKICBzdGF0aWMgY29uc3QgU3RyaW5nIHBhcnRFeHRlbnNpb24gPSAicGFydCI7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBkZWZlcnJlZEV4dGVuc2lvbiA9ICJwYXJ0LmpzIjsKCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0eXBlTmFtZVByb3BlcnR5ID0gciJidWlsdGluJGNscyI7CgogIE1vZGVsRW1pdHRlcigKICAgICAgdGhpcy5fb3B0aW9ucywKICAgICAgdGhpcy5fcmVwb3J0ZXIsCiAgICAgIHRoaXMuX291dHB1dFByb3ZpZGVyLAogICAgICB0aGlzLl9kdW1wSW5mb1Rhc2ssCiAgICAgIHRoaXMuX25hbWVyLAogICAgICB0aGlzLl9jbG9zZWRXb3JsZCwKICAgICAgdGhpcy5fdGFzaywKICAgICAgdGhpcy5fZW1pdHRlciwKICAgICAgdGhpcy5fc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSwKICAgICAgUnVudGltZVR5cGVzRW5jb2RlciBydGlFbmNvZGVyLAogICAgICBSZWNpcGVFbmNvZGVyIHJ0aVJlY2lwZUVuY29kZXIsCiAgICAgIHRoaXMuX3Nob3VsZEdlbmVyYXRlU291cmNlTWFwKQogICAgICA6IF9jb25zdGFudE9yZGVyaW5nID0gbmV3IENvbnN0YW50T3JkZXJpbmcoX2Nsb3NlZFdvcmxkLnNvcnRlcikgewogICAgdGhpcy5fY29uc3RhbnRFbWl0dGVyID0gbmV3IENvbnN0YW50RW1pdHRlcigKICAgICAgICBfb3B0aW9ucywKICAgICAgICBfY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMsCiAgICAgICAgX2Nsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICBfY2xvc2VkV29ybGQucnRpTmVlZCwKICAgICAgICBydGlFbmNvZGVyLAogICAgICAgIHJ0aVJlY2lwZUVuY29kZXIsCiAgICAgICAgX2Nsb3NlZFdvcmxkLmZpZWxkQW5hbHlzaXMsCiAgICAgICAgX2VtaXR0ZXIsCiAgICAgICAgdGhpcy5nZW5lcmF0ZUNvbnN0YW50UmVmZXJlbmNlLAogICAgICAgIGNvbnN0YW50TGlzdEdlbmVyYXRvcik7CiAgfQoKICBqcy5FeHByZXNzaW9uIGNvbnN0YW50TGlzdEdlbmVyYXRvcihqcy5FeHByZXNzaW9uIGFycmF5KSB7CiAgICAvLyBUT0RPKGZsb2l0c2NoKTogcmVtb3ZlIGhhcmQtY29kZWQgbmFtZS4KICAgIHJldHVybiBqcy5qcygnbWFrZUNvbnN0TGlzdCgjKScsIFthcnJheV0pOwogIH0KCiAgYm9vbCBpc0NvbnN0YW50SW5saW5lZE9yQWxyZWFkeUVtaXR0ZWQoQ29uc3RhbnRWYWx1ZSBjb25zdGFudCkgewogICAgaWYgKGNvbnN0YW50LmlzRnVuY3Rpb24pIHJldHVybiB0cnVlOyAvLyBBbHJlYWR5IGVtaXR0ZWQuCiAgICBpZiAoY29uc3RhbnQuaXNQcmltaXRpdmUpIHJldHVybiB0cnVlOyAvLyBJbmxpbmVkLgogICAgaWYgKGNvbnN0YW50LmlzRHVtbXkpIHJldHVybiB0cnVlOyAvLyBJbmxpbmVkLgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8gVE9ETyhmbG9pdHNjaCk6IGNvcGllZCBmcm9tIE9sZEVtaXR0ZXIuIEFkanVzdCBvciBzaGFyZS4KICBpbnQgY29tcGFyZUNvbnN0YW50cyhDb25zdGFudFZhbHVlIGEsIENvbnN0YW50VmFsdWUgYikgewogICAgLy8gSW5saW5lZCBjb25zdGFudHMgZG9uJ3QgYWZmZWN0IHRoZSBvcmRlciBhbmQgc29tZXRpbWVzIGRvbid0IGV2ZW4gaGF2ZQogICAgLy8gbmFtZXMuCiAgICBpbnQgY21wMSA9IGlzQ29uc3RhbnRJbmxpbmVkT3JBbHJlYWR5RW1pdHRlZChhKSA/IDAgOiAxOwogICAgaW50IGNtcDIgPSBpc0NvbnN0YW50SW5saW5lZE9yQWxyZWFkeUVtaXR0ZWQoYikgPyAwIDogMTsKICAgIGlmIChjbXAxICsgY21wMiA8IDIpIHJldHVybiBjbXAxIC0gY21wMjsKCiAgICAvLyBFbWl0IGNvbnN0YW50IGludGVyY2VwdG9ycyBmaXJzdC4gQ29uc3RhbnQgaW50ZXJjZXB0b3JzIGZvciBwcmltaXRpdmVzCiAgICAvLyBtaWdodCBiZSB1c2VkIGJ5IGNvZGUgdGhhdCBidWlsZHMgb3RoZXIgY29uc3RhbnRzLiAgU2VlIElzc3VlIDE4MTczLgogICAgaWYgKGEuaXNJbnRlcmNlcHRvciAhPSBiLmlzSW50ZXJjZXB0b3IpIHsKICAgICAgcmV0dXJuIGEuaXNJbnRlcmNlcHRvciA/IC0xIDogMTsKICAgIH0KCiAgICAvLyBTb3J0aW5nIGJ5IHRoZSBsb25nIG5hbWUgY2x1c3RlcnMgY29uc3RhbnRzIHdpdGggdGhlIHNhbWUgY29uc3RydWN0b3IKICAgIC8vIHdoaWNoIGNvbXByZXNzZXMgYSB0aW55IGJpdCBiZXR0ZXIuCiAgICBpbnQgciA9IF9uYW1lci5jb25zdGFudExvbmdOYW1lKGEpLmNvbXBhcmVUbyhfbmFtZXIuY29uc3RhbnRMb25nTmFtZShiKSk7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKCiAgICAvLyBSZXNvbHZlIGNvbGxpc2lvbnMgaW4gdGhlIGxvbmcgbmFtZSBieSB1c2luZyBhIHN0cnVjdHVyYWwgb3JkZXIuCiAgICByZXR1cm4gX2NvbnN0YW50T3JkZXJpbmcuY29tcGFyZShhLCBiKTsKICB9CgogIGpzLkV4cHJlc3Npb24gZ2VuZXJhdGVDb25zdGFudFJlZmVyZW5jZShDb25zdGFudFZhbHVlIHZhbHVlKSB7CiAgICBpZiAodmFsdWUuaXNGdW5jdGlvbikgewogICAgICBGdW5jdGlvbkNvbnN0YW50VmFsdWUgZnVuY3Rpb25Db25zdGFudCA9IHZhbHVlOwogICAgICByZXR1cm4gX2VtaXR0ZXIuc3RhdGljQ2xvc3VyZUFjY2VzcyhmdW5jdGlvbkNvbnN0YW50LmVsZW1lbnQpOwogICAgfQoKICAgIC8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlICJpc0lubGluZWQiIHBhcnQsIGJ1dCBpdCBkb2VzIG5vdCBodXJ0IHRvCiAgICAvLyB0ZXN0IGZvciB0aGUgb3RoZXIgcHJlZGljYXRlcy4KICAgIGlmIChpc0NvbnN0YW50SW5saW5lZE9yQWxyZWFkeUVtaXR0ZWQodmFsdWUpKSB7CiAgICAgIHJldHVybiBfY29uc3RhbnRFbWl0dGVyLmdlbmVyYXRlKHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBqcy5qcygnIy4jJywKICAgICAgICBbX25hbWVyLmdsb2JhbE9iamVjdEZvckNvbnN0YW50KHZhbHVlKSwgX25hbWVyLmNvbnN0YW50TmFtZSh2YWx1ZSldKTsKICB9CgogIGludCBlbWl0UHJvZ3JhbShQcm9ncmFtIHByb2dyYW0sIENvZGVnZW5Xb3JsZCBjb2RlZ2VuV29ybGQpIHsKICAgIE1haW5GcmFnbWVudCBtYWluRnJhZ21lbnQgPSBwcm9ncmFtLmZyYWdtZW50cy5maXJzdDsKICAgIExpc3Q8RGVmZXJyZWRGcmFnbWVudD4gZGVmZXJyZWRGcmFnbWVudHMgPQogICAgICAgIG5ldyBMaXN0PERlZmVycmVkRnJhZ21lbnQ+LmZyb20ocHJvZ3JhbS5kZWZlcnJlZEZyYWdtZW50cyk7CgogICAgRnJhZ21lbnRFbWl0dGVyIGZyYWdtZW50RW1pdHRlciA9IG5ldyBGcmFnbWVudEVtaXR0ZXIoCiAgICAgICAgX29wdGlvbnMsCiAgICAgICAgX2R1bXBJbmZvVGFzaywKICAgICAgICBfbmFtZXIsCiAgICAgICAgX2VtaXR0ZXIsCiAgICAgICAgX2NvbnN0YW50RW1pdHRlciwKICAgICAgICB0aGlzLAogICAgICAgIF9jbG9zZWRXb3JsZCwKICAgICAgICBjb2RlZ2VuV29ybGQpOwoKICAgIHZhciBkZWZlcnJlZExvYWRpbmdTdGF0ZSA9IG5ldyBEZWZlcnJlZExvYWRpbmdTdGF0ZSgpOwogICAganMuU3RhdGVtZW50IG1haW5Db2RlID0KICAgICAgICBmcmFnbWVudEVtaXR0ZXIuZW1pdE1haW5GcmFnbWVudChwcm9ncmFtLCBkZWZlcnJlZExvYWRpbmdTdGF0ZSk7CgogICAgTWFwPERlZmVycmVkRnJhZ21lbnQsIGpzLkV4cHJlc3Npb24+IGRlZmVycmVkRnJhZ21lbnRzQ29kZSA9IHt9OwoKICAgIGZvciAoRGVmZXJyZWRGcmFnbWVudCBmcmFnbWVudCBpbiBkZWZlcnJlZEZyYWdtZW50cykgewogICAgICBqcy5FeHByZXNzaW9uIHR5cGVzID0KICAgICAgICAgIHByb2dyYW0ubWV0YWRhdGFUeXBlc0Zvck91dHB1dFVuaXQoZnJhZ21lbnQub3V0cHV0VW5pdCk7CiAgICAgIGpzLkV4cHJlc3Npb24gZnJhZ21lbnRDb2RlID0gZnJhZ21lbnRFbWl0dGVyLmVtaXREZWZlcnJlZEZyYWdtZW50KAogICAgICAgICAgZnJhZ21lbnQsIHR5cGVzLCBwcm9ncmFtLmhvbGRlcnMpOwogICAgICBpZiAoZnJhZ21lbnRDb2RlICE9IG51bGwpIHsKICAgICAgICBkZWZlcnJlZEZyYWdtZW50c0NvZGVbZnJhZ21lbnRdID0gZnJhZ21lbnRDb2RlOwogICAgICB9IGVsc2UgewogICAgICAgIG9taXR0ZWRGcmFnbWVudHMuYWRkKGZyYWdtZW50KTsKICAgICAgfQogICAgfQoKICAgIGpzLlRva2VuQ291bnRlciBjb3VudGVyID0gbmV3IGpzLlRva2VuQ291bnRlcigpOwogICAgZGVmZXJyZWRGcmFnbWVudHNDb2RlLnZhbHVlcy5mb3JFYWNoKGNvdW50ZXIuY291bnRUb2tlbnMpOwogICAgY291bnRlci5jb3VudFRva2VucyhtYWluQ29kZSk7CgogICAgcHJvZ3JhbS5maW5hbGl6ZXJzLmZvckVhY2goKGpzLlRva2VuRmluYWxpemVyIGYpID0+IGYuZmluYWxpemVUb2tlbnMoKSk7CgogICAgLy8gVE9ETyhzcmEpOiBUaGlzIGlzIHdoZXJlIHdlIGtub3cgaWYgdGhlIHR5cGVzIChhbmQgcG90ZW50aWFsbHkgb3RoZXIKICAgIC8vIGRlZmVycmVkIEFTVHMgaW5zaWRlIHRoZSBwYXJ0cykgaGF2ZSBhbnkgY29udGVudHMuIFdlIHNob3VsZCB3YWl0IHVudGlsCiAgICAvLyB0aGlzIHBvaW50IHRvIGRlY2lkZSBpZiBhIHBhcnQgaXMgZW1wdHkuCgogICAgTWFwPERlZmVycmVkRnJhZ21lbnQsIFN0cmluZz4gaHVua0hhc2hlcyA9CiAgICAgICAgX3Rhc2subWVhc3VyZVN1YnRhc2soJ3dyaXRlIGZyYWdtZW50cycsICgpIHsKICAgICAgcmV0dXJuIHdyaXRlRGVmZXJyZWRGcmFnbWVudHMoZGVmZXJyZWRGcmFnbWVudHNDb2RlKTsKICAgIH0pOwoKICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgd3JpdHRlbiB0aGUgZGVmZXJyZWQgaHVua3MsIHdlIGNhbiBjcmVhdGUgdGhlIGRlZmVycmVkCiAgICAvLyBsb2FkaW5nIGRhdGEuCiAgICBmcmFnbWVudEVtaXR0ZXIuZmluYWxpemVEZWZlcnJlZExvYWRpbmdEYXRhKAogICAgICAgIHByb2dyYW0ubG9hZE1hcCwgaHVua0hhc2hlcywgZGVmZXJyZWRMb2FkaW5nU3RhdGUpOwoKICAgIF90YXNrLm1lYXN1cmVTdWJ0YXNrKCd3cml0ZSBmcmFnbWVudHMnLCAoKSB7CiAgICAgIHdyaXRlTWFpbkZyYWdtZW50KG1haW5GcmFnbWVudCwgbWFpbkNvZGUsCiAgICAgICAgICBpc1NwbGl0OiBwcm9ncmFtLmRlZmVycmVkRnJhZ21lbnRzLmlzTm90RW1wdHkgfHwKICAgICAgICAgICAgICBwcm9ncmFtLmhhc1NvZnREZWZlcnJlZENsYXNzZXMgfHwKICAgICAgICAgICAgICBfb3B0aW9ucy5leHBlcmltZW50YWxUcmFja0FsbG9jYXRpb25zKTsKICAgIH0pOwoKICAgIGlmIChfY2xvc2VkV29ybGQuYmFja2VuZFVzYWdlLnJlcXVpcmVzUHJlYW1ibGUgJiYKICAgICAgICAhX2Nsb3NlZFdvcmxkLmJhY2tlbmRVc2FnZS5pc0h0bWxMb2FkZWQpIHsKICAgICAgX3JlcG9ydGVyLnJlcG9ydEhpbnRNZXNzYWdlKE5PX0xPQ0FUSU9OX1NQQU5OQUJMRSwgTWVzc2FnZUtpbmQuUFJFQU1CTEUpOwogICAgfQoKICAgIGlmIChfb3B0aW9ucy5kZWZlcnJlZE1hcFVyaSAhPSBudWxsKSB7CiAgICAgIHdyaXRlRGVmZXJyZWRNYXAoKTsKICAgIH0KCiAgICAvLyBSZXR1cm4gdGhlIHRvdGFsIHByb2dyYW0gc2l6ZS4KICAgIHJldHVybiBvdXRwdXRCdWZmZXJzLnZhbHVlcy5mb2xkKDAsIChhLCBiKSA9PiBhICsgYi5sZW5ndGgpOwogIH0KCiAgLy8vIEdlbmVyYXRlcyBhIHNpbXBsZSBoZWFkZXIgdGhhdCBwcm92aWRlcyB0aGUgY29tcGlsZXIncyBidWlsZCBpZC4KICBqcy5Db21tZW50IGJ1aWxkR2VuZXJhdGVkQnkoKSB7CiAgICBTdHJpbmdCdWZmZXIgZmxhdm9yID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgZmxhdm9yLndyaXRlKCdmYXN0IHN0YXJ0dXAgZW1pdHRlcicpOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgZmxhdm9yLgogICAgZmxhdm9yLndyaXRlKCcsIHN0cm9uZycpOwogICAgaWYgKF9vcHRpb25zLnRydXN0UHJpbWl0aXZlcykgZmxhdm9yLndyaXRlKCcsIHRydXN0IHByaW1pdGl2ZXMnKTsKICAgIGlmIChfb3B0aW9ucy5vbWl0SW1wbGljaXRDaGVja3MpIGZsYXZvci53cml0ZSgnLCBvbWl0IGNoZWNrcycpOwogICAgaWYgKF9vcHRpb25zLmxheFJ1bnRpbWVUeXBlVG9TdHJpbmcpIHsKICAgICAgZmxhdm9yLndyaXRlKCcsIGxheCBydW50aW1lIHR5cGUnKTsKICAgIH0KICAgIGlmIChfb3B0aW9ucy51c2VDb250ZW50U2VjdXJpdHlQb2xpY3kpIGZsYXZvci53cml0ZSgnLCBDU1AnKTsKICAgIHJldHVybiBuZXcganMuQ29tbWVudChnZW5lcmF0ZWRCeShfb3B0aW9ucywgZmxhdm9yOiAnJGZsYXZvcicpKTsKICB9CgogIC8vLyBXcml0ZXMgYWxsIGRlZmVycmVkIGZyYWdtZW50J3MgY29kZSBpbnRvIGZpbGVzLgogIC8vLwogIC8vLyBSZXR1cm5zIGEgbWFwIGZyb20gZnJhZ21lbnQgdG8gaXRzIGhhc2hjb2RlIChhcyB1c2VkIGZvciB0aGUgZGVmZXJyZWQKICAvLy8gbGlicmFyeSBjb2RlKS4KICAvLy8KICAvLy8gVXBkYXRlcyB0aGUgc2hhcmVkIFtvdXRwdXRCdWZmZXJzXSBmaWVsZCB3aXRoIHRoZSBvdXRwdXQuCiAgTWFwPERlZmVycmVkRnJhZ21lbnQsIFN0cmluZz4gd3JpdGVEZWZlcnJlZEZyYWdtZW50cygKICAgICAgTWFwPERlZmVycmVkRnJhZ21lbnQsIGpzLkV4cHJlc3Npb24+IGZyYWdtZW50c0NvZGUpIHsKICAgIE1hcDxEZWZlcnJlZEZyYWdtZW50LCBTdHJpbmc+IGh1bmtIYXNoZXMgPSB7fTsKCiAgICBmcmFnbWVudHNDb2RlLmZvckVhY2goKERlZmVycmVkRnJhZ21lbnQgZnJhZ21lbnQsIGpzLkV4cHJlc3Npb24gY29kZSkgewogICAgICBodW5rSGFzaGVzW2ZyYWdtZW50XSA9IHdyaXRlRGVmZXJyZWRGcmFnbWVudChmcmFnbWVudCwgY29kZSk7CiAgICB9KTsKCiAgICByZXR1cm4gaHVua0hhc2hlczsKICB9CgogIGpzLlN0YXRlbWVudCBidWlsZERlZmVycmVkSW5pdGlhbGl6ZXJHbG9iYWwoKSB7CiAgICByZXR1cm4ganMuanMuc3RhdGVtZW50KAogICAgICAgICdzZWxmLiNkZWZlcnJlZEluaXRpYWxpemVycyA9ICcKICAgICAgICAnc2VsZi4jZGVmZXJyZWRJbml0aWFsaXplcnMgfHwgT2JqZWN0LmNyZWF0ZShudWxsKTsnLAogICAgICAgIHsnZGVmZXJyZWRJbml0aWFsaXplcnMnOiBkZWZlcnJlZEluaXRpYWxpemVyc0dsb2JhbH0pOwogIH0KCiAgLy8gV3JpdGVzIHRoZSBnaXZlbiBbZnJhZ21lbnRdJ3MgW2NvZGVdIGludG8gYSBmaWxlLgogIC8vCiAgLy8gVXBkYXRlcyB0aGUgc2hhcmVkIFtvdXRwdXRCdWZmZXJzXSBmaWVsZCB3aXRoIHRoZSBvdXRwdXQuCiAgdm9pZCB3cml0ZU1haW5GcmFnbWVudChNYWluRnJhZ21lbnQgZnJhZ21lbnQsIGpzLlN0YXRlbWVudCBjb2RlLAogICAgICB7Ym9vbCBpc1NwbGl0fSkgewogICAgTG9jYXRpb25Db2xsZWN0b3IgbG9jYXRpb25Db2xsZWN0b3I7CiAgICBMaXN0PENvZGVPdXRwdXRMaXN0ZW5lcj4gY29kZU91dHB1dExpc3RlbmVyczsKICAgIGlmIChfc2hvdWxkR2VuZXJhdGVTb3VyY2VNYXApIHsKICAgICAgX3Rhc2subWVhc3VyZVN1YnRhc2soJ3NvdXJjZS1tYXBzJywgKCkgewogICAgICAgIGxvY2F0aW9uQ29sbGVjdG9yID0gbmV3IExvY2F0aW9uQ29sbGVjdG9yKCk7CiAgICAgICAgY29kZU91dHB1dExpc3RlbmVycyA9IDxDb2RlT3V0cHV0TGlzdGVuZXI+W2xvY2F0aW9uQ29sbGVjdG9yXTsKICAgICAgfSk7CiAgICB9CgogICAgQ29kZU91dHB1dCBtYWluT3V0cHV0ID0gbmV3IFN0cmVhbUNvZGVPdXRwdXQoCiAgICAgICAgX291dHB1dFByb3ZpZGVyLmNyZWF0ZU91dHB1dFNpbmsoJycsICdqcycsIE91dHB1dFR5cGUuanMpLAogICAgICAgIGNvZGVPdXRwdXRMaXN0ZW5lcnMpOwogICAgb3V0cHV0QnVmZmVyc1tmcmFnbWVudF0gPSBtYWluT3V0cHV0OwoKICAgIGpzLlByb2dyYW0gcHJvZ3JhbSA9IG5ldyBqcy5Qcm9ncmFtKFsKICAgICAgYnVpbGRHZW5lcmF0ZWRCeSgpLAogICAgICBuZXcganMuQ29tbWVudChIT09LU19BUElfVVNBR0UpLAogICAgICBpc1NwbGl0ID8gYnVpbGREZWZlcnJlZEluaXRpYWxpemVyR2xvYmFsKCkgOiBuZXcganMuQmxvY2suZW1wdHkoKSwKICAgICAgY29kZQogICAgXSk7CgogICAgQ29kZUJ1ZmZlciBidWZmZXIgPSBqcy5jcmVhdGVDb2RlQnVmZmVyKAogICAgICAgIHByb2dyYW0sIF9vcHRpb25zLCBfc291cmNlSW5mb3JtYXRpb25TdHJhdGVneSwKICAgICAgICBtb25pdG9yOiBfZHVtcEluZm9UYXNrKTsKICAgIF90YXNrLm1lYXN1cmVTdWJ0YXNrKCdlbWl0IGJ1ZmZlcnMnLCAoKSB7CiAgICAgIG1haW5PdXRwdXQuYWRkQnVmZmVyKGJ1ZmZlcik7CiAgICB9KTsKCiAgICBpZiAoX3Nob3VsZEdlbmVyYXRlU291cmNlTWFwKSB7CiAgICAgIF90YXNrLm1lYXN1cmVTdWJ0YXNrKCdzb3VyY2UtbWFwcycsICgpIHsKICAgICAgICBtYWluT3V0cHV0LmFkZChTb3VyY2VNYXBCdWlsZGVyLmdlbmVyYXRlU291cmNlTWFwVGFnKAogICAgICAgICAgICBfb3B0aW9ucy5zb3VyY2VNYXBVcmksIF9vcHRpb25zLm91dHB1dFVyaSkpOwogICAgICB9KTsKICAgIH0KCiAgICBtYWluT3V0cHV0LmNsb3NlKCk7CgogICAgaWYgKF9zaG91bGRHZW5lcmF0ZVNvdXJjZU1hcCkgewogICAgICBfdGFzay5tZWFzdXJlU3VidGFzaygnc291cmNlLW1hcHMnLCAoKSB7CiAgICAgICAgU291cmNlTWFwQnVpbGRlci5vdXRwdXRTb3VyY2VNYXAoCiAgICAgICAgICAgIG1haW5PdXRwdXQsCiAgICAgICAgICAgIGxvY2F0aW9uQ29sbGVjdG9yLAogICAgICAgICAgICBfbmFtZXIuY3JlYXRlTWluaWZpZWRHbG9iYWxOYW1lTWFwKCksCiAgICAgICAgICAgIF9uYW1lci5jcmVhdGVNaW5pZmllZEluc3RhbmNlTmFtZU1hcCgpLAogICAgICAgICAgICAnJywKICAgICAgICAgICAgX29wdGlvbnMuc291cmNlTWFwVXJpLAogICAgICAgICAgICBfb3B0aW9ucy5vdXRwdXRVcmksCiAgICAgICAgICAgIF9vdXRwdXRQcm92aWRlcik7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gV3JpdGVzIHRoZSBnaXZlbiBbZnJhZ21lbnRdJ3MgW2NvZGVdIGludG8gYSBmaWxlLgogIC8vCiAgLy8gUmV0dXJucyB0aGUgZGVmZXJyZWQgZnJhZ21lbnQncyBoYXNoLgogIC8vCiAgLy8gVXBkYXRlcyB0aGUgc2hhcmVkIFtvdXRwdXRCdWZmZXJzXSBmaWVsZCB3aXRoIHRoZSBvdXRwdXQuCiAgU3RyaW5nIHdyaXRlRGVmZXJyZWRGcmFnbWVudChEZWZlcnJlZEZyYWdtZW50IGZyYWdtZW50LCBqcy5FeHByZXNzaW9uIGNvZGUpIHsKICAgIExpc3Q8Q29kZU91dHB1dExpc3RlbmVyPiBvdXRwdXRMaXN0ZW5lcnMgPSBbXTsKICAgIEhhc2hlciBoYXNoZXIgPSBuZXcgSGFzaGVyKCk7CiAgICBvdXRwdXRMaXN0ZW5lcnMuYWRkKGhhc2hlcik7CgogICAgTG9jYXRpb25Db2xsZWN0b3IgbG9jYXRpb25Db2xsZWN0b3I7CiAgICBpZiAoX3Nob3VsZEdlbmVyYXRlU291cmNlTWFwKSB7CiAgICAgIF90YXNrLm1lYXN1cmVTdWJ0YXNrKCdzb3VyY2UtbWFwcycsICgpIHsKICAgICAgICBsb2NhdGlvbkNvbGxlY3RvciA9IG5ldyBMb2NhdGlvbkNvbGxlY3RvcigpOwogICAgICAgIG91dHB1dExpc3RlbmVycy5hZGQobG9jYXRpb25Db2xsZWN0b3IpOwogICAgICB9KTsKICAgIH0KCiAgICBTdHJpbmcgaHVua1ByZWZpeCA9IGZyYWdtZW50Lm91dHB1dEZpbGVOYW1lOwoKICAgIENvZGVPdXRwdXQgb3V0cHV0ID0gbmV3IFN0cmVhbUNvZGVPdXRwdXQoCiAgICAgICAgX291dHB1dFByb3ZpZGVyLmNyZWF0ZU91dHB1dFNpbmsoCiAgICAgICAgICAgIGh1bmtQcmVmaXgsIGRlZmVycmVkRXh0ZW5zaW9uLCBPdXRwdXRUeXBlLmpzUGFydCksCiAgICAgICAgb3V0cHV0TGlzdGVuZXJzKTsKCiAgICBvdXRwdXRCdWZmZXJzW2ZyYWdtZW50XSA9IG91dHB1dDsKCiAgICAvLyBUaGUgW2NvZGVdIGNvbnRhaW5zIHRoZSBmdW5jdGlvbiB0aGF0IG11c3QgYmUgaW52b2tlZCB3aGVuIHRoZSBkZWZlcnJlZAogICAgLy8gaHVuayBpcyBsb2FkZWQuCiAgICAvLyBUaGF0IGZ1bmN0aW9uIG11c3QgYmUgaW4gYSBtYXAgZnJvbSBpdHMgaGFzaGNvZGUgdG8gdGhlIGZ1bmN0aW9uLiBTaW5jZQogICAgLy8gd2UgZG9uJ3Qga25vdyB0aGUgaGFzaCBiZWZvcmUgd2UgYWN0dWFsbHkgZW1pdCB0aGUgY29kZSB3ZSBzdG9yZSB0aGUKICAgIC8vIGZ1bmN0aW9uIGluIGEgdGVtcG9yYXJ5IGZpZWxkIGZpcnN0OgogICAgLy8KICAgIC8vICAgZGVmZXJyZWRJbml0aWFsaXplci5jdXJyZW50ID0gPHByZXR0eS1wcmludGVkIGNvZGU+OwogICAgLy8gICBkZWZlcnJlZEluaXRpYWxpemVyWzxoYXNoPl0gPSBkZWZlcnJlZEluaXRpYWxpemVyLmN1cnJlbnQ7CgogICAganMuUHJvZ3JhbSBwcm9ncmFtID0gbmV3IGpzLlByb2dyYW0oWwogICAgICBidWlsZEdlbmVyYXRlZEJ5KCksCiAgICAgIGJ1aWxkRGVmZXJyZWRJbml0aWFsaXplckdsb2JhbCgpLAogICAgICBqcy5qcy5zdGF0ZW1lbnQoJyRkZWZlcnJlZEluaXRpYWxpemVyc0dsb2JhbC5jdXJyZW50ID0gIycsIGNvZGUpCiAgICBdKTsKCiAgICBDb2RlQnVmZmVyIGJ1ZmZlciA9IGpzLmNyZWF0ZUNvZGVCdWZmZXIoCiAgICAgICAgcHJvZ3JhbSwgX29wdGlvbnMsIF9zb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5LAogICAgICAgIG1vbml0b3I6IF9kdW1wSW5mb1Rhc2spOwogICAgX3Rhc2subWVhc3VyZVN1YnRhc2soJ2VtaXQgYnVmZmVycycsICgpIHsKICAgICAgb3V0cHV0LmFkZEJ1ZmZlcihidWZmZXIpOwogICAgfSk7CgogICAgLy8gTWFrZSBhIHVuaXF1ZSBoYXNoIG9mIHRoZSBjb2RlIChiZWZvcmUgdGhlIHNvdXJjZW1hcHMgYXJlIGFkZGVkKQogICAgLy8gVGhpcyB3aWxsIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIGluaXRpYWxpemluZyBmdW5jdGlvbiBmcm9tIHRoZSBnbG9iYWwKICAgIC8vIHZhcmlhYmxlLgogICAgU3RyaW5nIGhhc2ggPSBoYXNoZXIuZ2V0SGFzaCgpOwoKICAgIC8vIE5vdyB3ZSBjb3B5IHRoZSBkZWZlcnJlZEluaXRpYWxpemVyLmN1cnJlbnQgaW50byBpdHMgY29ycmVjdCBoYXNoLgogICAgb3V0cHV0LmFkZCgnXG4ke2RlZmVycmVkSW5pdGlhbGl6ZXJzR2xvYmFsfVsiJGhhc2giXSA9ICcKICAgICAgICAnJHtkZWZlcnJlZEluaXRpYWxpemVyc0dsb2JhbH0uY3VycmVudCcpOwoKICAgIGlmIChfc2hvdWxkR2VuZXJhdGVTb3VyY2VNYXApIHsKICAgICAgX3Rhc2subWVhc3VyZVN1YnRhc2soJ3NvdXJjZS1tYXBzJywgKCkgewogICAgICAgIFVyaSBtYXBVcmksIHBhcnRVcmk7CiAgICAgICAgVXJpIHNvdXJjZU1hcFVyaSA9IF9vcHRpb25zLnNvdXJjZU1hcFVyaTsKICAgICAgICBVcmkgb3V0cHV0VXJpID0gX29wdGlvbnMub3V0cHV0VXJpOwogICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9ICIkaHVua1ByZWZpeC4kcGFydEV4dGVuc2lvbiI7CiAgICAgICAgU3RyaW5nIGh1bmtGaWxlTmFtZSA9ICIkaHVua1ByZWZpeC4kZGVmZXJyZWRFeHRlbnNpb24iOwoKICAgICAgICBpZiAoc291cmNlTWFwVXJpICE9IG51bGwpIHsKICAgICAgICAgIFN0cmluZyBtYXBGaWxlTmFtZSA9IGh1bmtGaWxlTmFtZSArICIubWFwIjsKICAgICAgICAgIExpc3Q8U3RyaW5nPiBtYXBTZWdtZW50cyA9IHNvdXJjZU1hcFVyaS5wYXRoU2VnbWVudHMudG9MaXN0KCk7CiAgICAgICAgICBtYXBTZWdtZW50c1ttYXBTZWdtZW50cy5sZW5ndGggLSAxXSA9IG1hcEZpbGVOYW1lOwogICAgICAgICAgbWFwVXJpID0gX29wdGlvbnMuc291cmNlTWFwVXJpLnJlcGxhY2UocGF0aFNlZ21lbnRzOiBtYXBTZWdtZW50cyk7CiAgICAgICAgfQoKICAgICAgICBpZiAob3V0cHV0VXJpICE9IG51bGwpIHsKICAgICAgICAgIExpc3Q8U3RyaW5nPiBwYXJ0U2VnbWVudHMgPSBvdXRwdXRVcmkucGF0aFNlZ21lbnRzLnRvTGlzdCgpOwogICAgICAgICAgcGFydFNlZ21lbnRzW3BhcnRTZWdtZW50cy5sZW5ndGggLSAxXSA9IGh1bmtGaWxlTmFtZTsKICAgICAgICAgIHBhcnRVcmkgPSBfb3B0aW9ucy5vdXRwdXRVcmkucmVwbGFjZShwYXRoU2VnbWVudHM6IHBhcnRTZWdtZW50cyk7CiAgICAgICAgfQoKICAgICAgICBvdXRwdXQuYWRkKFNvdXJjZU1hcEJ1aWxkZXIuZ2VuZXJhdGVTb3VyY2VNYXBUYWcobWFwVXJpLCBwYXJ0VXJpKSk7CiAgICAgICAgb3V0cHV0LmNsb3NlKCk7CiAgICAgICAgU291cmNlTWFwQnVpbGRlci5vdXRwdXRTb3VyY2VNYXAob3V0cHV0LCBsb2NhdGlvbkNvbGxlY3Rvciwge30sIHt9LAogICAgICAgICAgICBwYXJ0TmFtZSwgbWFwVXJpLCBwYXJ0VXJpLCBfb3V0cHV0UHJvdmlkZXIpOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIG91dHB1dC5jbG9zZSgpOwogICAgfQoKICAgIHJldHVybiBoYXNoOwogIH0KCiAgLy8vIFdyaXRlcyBhIG1hcHBpbmcgZnJvbSBsaWJyYXJ5LW5hbWUgdG8gaHVuayBmaWxlcy4KICAvLy8KICAvLy8gVGhlIG91dHB1dCBpcyB3cml0dGVuIGludG8gYSBzZXBhcmF0ZSBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgYnkgb3V0c2lkZQogIC8vLyB0b29scy4KICB2b2lkIHdyaXRlRGVmZXJyZWRNYXAoKSB7CiAgICBNYXA8U3RyaW5nLCBkeW5hbWljPiBtYXBwaW5nID0ge307CiAgICAvLyBKc29uIGRvZXMgbm90IHN1cHBvcnQgY29tbWVudHMsIHNvIHdlIGVtYmVkIHRoZSBleHBsYW5hdGlvbiBpbiB0aGUKICAgIC8vIGRhdGEuCiAgICBtYXBwaW5nWyJfY29tbWVudCJdID0gIlRoaXMgbWFwcGluZyBzaG93cyB3aGljaCBjb21waWxlZCBgLmpzYCBmaWxlcyBhcmUgIgogICAgICAgICJuZWVkZWQgZm9yIGEgZ2l2ZW4gZGVmZXJyZWQgbGlicmFyeSBpbXBvcnQuIjsKICAgIG1hcHBpbmcuYWRkQWxsKF9jbG9zZWRXb3JsZC5vdXRwdXRVbml0RGF0YS5jb21wdXRlRGVmZXJyZWRNYXAoCiAgICAgICAgX29wdGlvbnMsIF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQsCiAgICAgICAgb21pdHRlZFVuaXRzOgogICAgICAgICAgICBvbWl0dGVkRnJhZ21lbnRzLm1hcCgoZnJhZ21lbnQpID0+IGZyYWdtZW50Lm91dHB1dFVuaXQpLnRvU2V0KCkpKTsKICAgIF9vdXRwdXRQcm92aWRlci5jcmVhdGVPdXRwdXRTaW5rKAogICAgICAgIF9vcHRpb25zLmRlZmVycmVkTWFwVXJpLnBhdGgsICcnLCBPdXRwdXRUeXBlLmRlZmVycmVkTWFwKQogICAgICAuLmFkZChjb25zdCBKc29uRW5jb2Rlci53aXRoSW5kZW50KCIgICIpLmNvbnZlcnQobWFwcGluZykpCiAgICAgIC4uY2xvc2UoKTsKICB9Cn0KgcUATk48AToBKCABNwkeIBweHCAdHRgTEx4XEiQWHyEPAT4BJRwiJUJOHyckKyRBK0EhKjNJLjYxOx1GGyQ6GkQYAR4BFSImKCQWHBokJyMsPgE7NgEqAVAzKgEuNQE5ARAVFhwaExkSFScmJiVIMRIlKR4UGiQSKCAEAT0vLwQBQz43MxIEAT47Tg49PS0BTkwuJwYBTStOGgFILAQBQRw2RQYBTyY0LwYYTgQBQDkvRAE7EhcQEhoOFhcBOxxJAUUBOxxDSS0iOA8oCAYBNT8jAU0BTE8wAS81PAgBTxUxPAExMDswNggBNjNQBgErGgYBJkEEAUciLiowHkZEKyoGQkUEATYGTBUGQDg8MwFMRAgBFwQBMhwoPj8EATcFP0MYKTIkLzVHCgYBMkMeKgEqGidJCwgBLTchLiQIASQvPjkKBgEYASQvKhgfMjQQIyAeCgYEATcFKwU/UDMiIQEpJC81MAoGATEBLio/GgEmAU8XT0wsBz5EASoaKEcIAS03IS4gCAFITxEkAUo9MgEkLx0yLDhAASQ2ST1NCgEhR0BMCgFMGEw5Cg0WBgERBAE4Bk0NHCdKDU83QzMWTyZCQREEAgFCcGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9zdGFydHVwX2VtaXR0ZXIvbW9kZWxfZW1pdHRlci5kYXJ0TnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvc3RhcnR1cF9lbWl0dGVyL2ZyYWdtZW50X2VtaXR0ZXIuZGFydMABNkUvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0MmpzLmpzX2VtaXR0ZXIuc3RhcnR1cF9lbWl0dGVyLm1vZGVsX2VtaXR0ZXI7CgovLy8gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgc3RvcmVzIHRoZSB0ZWFyLW9mZiBnZXR0ZXIgb24gYSBzdGF0aWMKLy8vIGZ1bmN0aW9uLgovLy8KLy8vIFRoaXMgcHJvcGVydHkgaXMgb25seSB1c2VkIHdoZW4gaXNvbGF0ZXMgYXJlIHVzZWQuCi8vLwovLy8gV2hlbiBzZXJpYWxpemluZyBzdGF0aWMgZnVuY3Rpb25zIHdlIHRyYW5zbWl0IHRoZQovLy8gbmFtZSBvZiB0aGUgc3RhdGljIGZ1bmN0aW9uLCBidXQgbm90IHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbidzIGdldHRlci4gV2UKLy8vIHN0b3JlIHRoZSBnZXR0ZXItZnVuY3Rpb24gb24gdGhlIHN0YXRpYyBmdW5jdGlvbiBpdHNlbGYsIHdoaWNoIGFsbG93cyB1cyB0bwovLy8gZmluZCBpdCBlYXNpbHkuCmNvbnN0IFN0cmluZyB0ZWFyT2ZmUHJvcGVydHlOYW1lID0gcickdGVhck9mZic7CgovLy8gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgc3RvcmVzIHRoZSBsaXN0IG9mIGZpZWxkcyBvbiBhIGNvbnN0cnVjdG9yLgovLy8KLy8vIFRoaXMgcHJvcGVydHkgaXMgb25seSB1c2VkIHdoZW4gaXNvbGF0ZXMgYXJlIHVzZWQuCi8vLwovLy8gV2hlbiBzZXJpYWxpemluZyBvYmplY3RzIHdlIGV4dHJhY3QgYWxsIGZpZWxkcyBmcm9tIGFueSBnaXZlbiBvYmplY3QuCi8vLyBXZSBleHRyYWN0IHRoZSBuYW1lcyBvZiBhbGwgZmllbGRzIGZyb20gYSBmcmVzaCBlbXB0eSBvYmplY3QuIFRoaXMgbGlzdAovLy8gaXMgY2FjaGVkIG9uIHRoZSBjb25zdHJ1Y3RvciBpbiB0aGlzIHByb3BlcnR5IHRvIHRvIGF2b2lkIHRvbyBtYW55Ci8vLyBhbGxvY2F0aW9ucy4KY29uc3QgU3RyaW5nIGNhY2hlZENsYXNzRmllbGROYW1lcyA9IHInJGNhY2hlZEZpZWxkTmFtZXMnOwoKLy8vIFRoZSBmYXN0IHN0YXJ0dXAgZW1pdHRlcidzIGdvYWwgaXMgdG8gbWluaW1pemUgdGhlIGFtb3VudCBvZiB3b3JrIHRoYXQgdGhlCi8vLyBKYXZhU2NyaXB0IGVuZ2luZSBoYXMgdG8gZG8gYmVmb3JlIGl0IGNhbiBzdGFydCBydW5uaW5nIHVzZXIgY29kZS4KLy8vCi8vLyBXaGVuZXZlciBwb3NzaWJsZSwgdGhlIGVtaXR0ZXIgdXNlcyBvYmplY3QgbGl0ZXJhbHMgaW5zdGVhZCBvZiB1cGRhdGluZwovLy8gb2JqZWN0cy4KLy8vCi8vLyBFeGFtcGxlOgovLy8KLy8vICAgICAvLyBIb2xkZXJzIGFyZSBpbml0aWFsaXplZCBkaXJlY3RseSB3aXRoIHRoZSBjbGFzc2VzIGFuZCBzdGF0aWMKLy8vICAgICAvLyBmdW5jdGlvbnMuCi8vLyAgICAgdmFyIEEgPSB7IFBvaW50OiBmdW5jdGlvbiBQb2ludCh4LCB5KSB7IHRoaXMueCA9IHg7IHRoaXMueSA9IHkgfSwKLy8vICAgICAgICAgICAgICAgc29tZVN0YXRpY0Z1bmN0aW9uOiBmdW5jdGlvbiBzb21lU3RhdGljRnVuY3Rpb24oKSB7IC4uLiB9IH07Ci8vLwovLy8gICAgIC8vIENsYXNzLWJlaGF2aW9yIGlzIGVtaXR0ZWQgaW4gYSBwcm90b3R5cGUgb2JqZWN0IHRoYXQgaXMgZGlyZWN0bHkKLy8vICAgICAvLyBhc3NpZ25lZDoKLy8vICAgICBBLlBvaW50LnByb3RvdHlwZSA9IHsgZGlzdGFuY2VUbzogZnVuY3Rpb24ob3RoZXIpIHsgLi4uIH0gfTsKLy8vCi8vLyAgICAgLy8gSW5oZXJpdGFuY2UgaXMgYWNoaWV2ZWQgYnkgdXBkYXRpbmcgdGhlIHByb3RvdHlwZSBvYmplY3RzIChoaWRkZW4gaW4KLy8vICAgICAvLyBhIGhlbHBlciBmdW5jdGlvbik6Ci8vLyAgICAgQS5Qb2ludC5wcm90b3R5cGUuX19wcm90b19fID0gSC5PYmplY3QucHJvdG90eXBlOwovLy8KLy8vIFRoZSBlbWl0dGVyIGRvZXNuJ3QgdHJ5IHRvIGJlIGNsZXZlciBhbmQgZW1pdHMgZXZlcnl0aGluZyBiZWZvcmVoYW5kLiBUaGlzCi8vLyBpbmNyZWFzZXMgdGhlIG91dHB1dCBzaXplLCBidXQgaW1wcm92ZXMgcGVyZm9ybWFuY2UuCi8vLwovLyBUaGUgY29kZSByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBhbGwgRGFydCBjb2RlIGlzIGluc2lkZSBob2xkZXJzLiBBcyBzdWNoCi8vIHdlIGNhbiB1c2UgImdsb2JhbCIgbmFtZXMgaG93ZXZlciB3ZSB3YW50LiBBcyBsb25nIGFzIHdlIGRvbid0IHNoYWRvdwovLyBKYXZhU2NyaXB0IHZhcmlhYmxlcyAobGlrZSBgQXJyYXlgKSB3ZSBhcmUgZnJlZSB0byBjaG9zZSB3aGF0ZXZlciB2YXJpYWJsZQovLyBuYW1lcyB3ZSB3YW50LiBGdXJ0aGVybW9yZSwgdGhlIHByZXR0eS1wcmludGVyIG1pbmlmaWVzIGxvY2FsIHZhcmlhYmxlcywgdGh1cwovLyByZWR1Y2luZyB0aGVpciBzaXplLgpjb25zdCBTdHJpbmcgbWFpbkJvaWxlcnBsYXRlID0gJycnCihmdW5jdGlvbiBkYXJ0UHJvZ3JhbSgpIHsKLy8gQ29waWVzIHRoZSBvd24gcHJvcGVydGllcyBmcm9tIFtmcm9tXSB0byBbdG9dLgpmdW5jdGlvbiBjb3B5UHJvcGVydGllcyhmcm9tLCB0bykgewogIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJvbSk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIga2V5ID0ga2V5c1tpXTsKICAgIHRvW2tleV0gPSBmcm9tW2tleV07CiAgfQp9CgovLyBPbmx5IHVzZSBkaXJlY3QgcHJvdG8gYWNjZXNzIHRvIGNvbnN0cnVjdCB0aGUgcHJvdG90eXBlIGNoYWluIChpbnN0ZWFkIG9mCi8vIGNvcHlpbmcgcHJvcGVydGllcykgb24gcGxhdGZvcm1zIHdoZXJlIHdlIGtub3cgaXQgd29ya3Mgd2VsbCAoQ2hyb21lIC8gZDgpLgp2YXIgc3VwcG9ydHNEaXJlY3RQcm90b0FjY2VzcyA9ICNkaXJlY3RBY2Nlc3NUZXN0RXhwcmVzc2lvbjsKCi8vIFNldHMgdGhlIG5hbWUgcHJvcGVydHkgb2YgZnVuY3Rpb25zLCBpZiB0aGUgSlMgZW5naW5lIGRvZXNuJ3Qgc2V0IHRoZSBuYW1lCi8vIGl0c2VsZi4KLy8gQXMgb2YgMjAxOCBvbmx5IElFMTEgZG9lc24ndCBzZXQgdGhlIG5hbWUuCmZ1bmN0aW9uIHNldEZ1bmN0aW9uTmFtZXNJZk5lY2Vzc2FyeShob2xkZXJzKSB7CiAgZnVuY3Rpb24gdCgpe307CiAgaWYgKHR5cGVvZiB0Lm5hbWUgPT0gInN0cmluZyIpIHJldHVybjsKCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob2xkZXJzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgaG9sZGVyID0gaG9sZGVyc1tpXTsKICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoaG9sZGVyKTsKICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5cy5sZW5ndGg7IGorKykgewogICAgICB2YXIga2V5ID0ga2V5c1tqXTsKICAgICAgdmFyIGYgPSBob2xkZXJba2V5XTsKICAgICAgaWYgKHR5cGVvZiBmID09ICdmdW5jdGlvbicpIGYubmFtZSA9IGtleTsKICAgIH0KICB9Cn0KCi8vIE1ha2VzIFtjbHNdIGluaGVyaXQgZnJvbSBbc3VwXS4KLy8gT24gQ2hyb21lLCBGaXJlZm94IGFuZCByZWNlbnQgSUVzIHRoaXMgaGFwcGVucyBieSB1cGRhdGluZyB0aGUgaW50ZXJuYWwKLy8gcHJvdG8tcHJvcGVydHkgb2YgdGhlIGNsYXNzZXMgJ3Byb3RvdHlwZScgZmllbGQuCi8vIE9sZGVyIElFcyB1c2UgYE9iamVjdC5jcmVhdGVgIGFuZCBjb3B5IG92ZXIgdGhlIHByb3BlcnRpZXMuCmZ1bmN0aW9uIGluaGVyaXQoY2xzLCBzdXApIHsKICAvLyBOb3RlIHRoYXQgUlRJIG5lZWRzIGNscy5uYW1lLCBidXQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgaXQgYW55bW9yZS4KICBjbHMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY2xzOwogIGNscy5wcm90b3R5cGVbI29wZXJhdG9ySXNQcmVmaXggKyBjbHMubmFtZV0gPSBjbHM7CgogIC8vIFRoZSBzdXBlcmNsYXNzIGlzIG9ubHkgbnVsbCBmb3IgdGhlIERhcnQgT2JqZWN0LgogIGlmIChzdXAgIT0gbnVsbCkgewogICAgaWYgKHN1cHBvcnRzRGlyZWN0UHJvdG9BY2Nlc3MpIHsKICAgICAgLy8gRmlyZWZveCBkb2Vzbid0IGxpa2UgdG8gdXBkYXRlIHRoZSBwcm90b3R5cGVzLCBidXQgd2hlbiBzZXR0aW5nIHVwCiAgICAgIC8vIHRoZSBoaWVyYXJjaHkgY2hhaW4gaXQncyBvay4KICAgICAgY2xzLnByb3RvdHlwZS5fX3Byb3RvX18gPSBzdXAucHJvdG90eXBlOwogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgY2xzUHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXAucHJvdG90eXBlKTsKICAgIGNvcHlQcm9wZXJ0aWVzKGNscy5wcm90b3R5cGUsIGNsc1Byb3RvdHlwZSk7CiAgICBjbHMucHJvdG90eXBlID0gY2xzUHJvdG90eXBlOwogIH0KfQoKLy8gQmF0Y2hlZCB2ZXJzaW9uIG9mIFtpbmhlcml0XSBmb3IgbXVsdGlwbGUgY2xhc3NlcyBmcm9tIG9uZSBzdXBlcmNsYXNzLgpmdW5jdGlvbiBpbmhlcml0TWFueShzdXAsIGNsYXNzZXMpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKICAgIGluaGVyaXQoY2xhc3Nlc1tpXSwgc3VwKTsKICB9Cn0KCi8vIE1peGVzIGluIHRoZSBwcm9wZXJ0aWVzIG9mIFttaXhpbl0gaW50byBbY2xzXS4KZnVuY3Rpb24gbWl4aW4oY2xzLCBtaXhpbikgewogIGNvcHlQcm9wZXJ0aWVzKG1peGluLnByb3RvdHlwZSwgY2xzLnByb3RvdHlwZSk7CiAgY2xzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNsczsKfQoKLy8gQ3JlYXRlcyBhIGxhenkgZmllbGQuCi8vCi8vIEEgbGF6eSBmaWVsZCBoYXMgYSBzdG9yYWdlIGVudHJ5LCBbbmFtZV0sIHdoaWNoIGhvbGRzIHRoZSB2YWx1ZSwgYW5kIGEKLy8gZ2V0dGVyIChbZ2V0dGVyTmFtZV0pIHRvIGFjY2VzcyB0aGUgZmllbGQuIElmIHRoZSBmaWVsZCB3YXNuJ3Qgc2V0IGJlZm9yZQovLyB0aGUgZmlyc3QgYWNjZXNzLCBpdCBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBbaW5pdGlhbGl6ZXJdLgpmdW5jdGlvbiBsYXp5KGhvbGRlciwgbmFtZSwgZ2V0dGVyTmFtZSwgaW5pdGlhbGl6ZXIpIHsKICB2YXIgdW5pbml0aWFsaXplZFNlbnRpbmVsID0gaG9sZGVyOwogIGhvbGRlcltuYW1lXSA9IHVuaW5pdGlhbGl6ZWRTZW50aW5lbDsKICBob2xkZXJbZ2V0dGVyTmFtZV0gPSBmdW5jdGlvbigpIHsKICAgIGhvbGRlcltnZXR0ZXJOYW1lXSA9IGZ1bmN0aW9uKCkgeyAjY3ljbGljVGhyb3cobmFtZSkgfTsKICAgIHZhciByZXN1bHQ7CiAgICB2YXIgc2VudGluZWxJblByb2dyZXNzID0gaW5pdGlhbGl6ZXI7CiAgICB0cnkgewogICAgICBpZiAoaG9sZGVyW25hbWVdID09PSB1bmluaXRpYWxpemVkU2VudGluZWwpIHsKICAgICAgICByZXN1bHQgPSBob2xkZXJbbmFtZV0gPSBzZW50aW5lbEluUHJvZ3Jlc3M7CiAgICAgICAgcmVzdWx0ID0gaG9sZGVyW25hbWVdID0gaW5pdGlhbGl6ZXIoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHQgPSBob2xkZXJbbmFtZV07CiAgICAgIH0KICAgIH0gZmluYWxseSB7CiAgICAgIC8vIFVzZSB0cnktZmluYWxseSwgbm90IHRyeS1jYXRjaC90aHJvdyBhcyBpdCBkZXN0cm95cyB0aGUgc3RhY2sKICAgICAgLy8gdHJhY2UuCiAgICAgIGlmIChyZXN1bHQgPT09IHNlbnRpbmVsSW5Qcm9ncmVzcykgewogICAgICAgIC8vIFRoZSBsYXp5IHN0YXRpYyAoaG9sZGVyW25hbWVdKSBtaWdodCBoYXZlIGJlZW4gc2V0IHRvIGEgZGlmZmVyZW50CiAgICAgICAgLy8gdmFsdWUuIEFjY29yZGluZyB0byBzcGVjIHdlIHN0aWxsIGhhdmUgdG8gcmVzZXQgaXQgdG8gbnVsbCwgaWYKICAgICAgICAvLyB0aGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkLgogICAgICAgIGhvbGRlcltuYW1lXSA9IG51bGw7CiAgICAgIH0KICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoZSBmdW5jdGlvbiBzaG91bGQgcHJvYmFibHkKICAgICAgLy8gYmUgdW5pcXVlIGZvciBlYWNoIHN0YXRpYy4KICAgICAgaG9sZGVyW2dldHRlck5hbWVdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzW25hbWVdOyB9OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Owp9CgovLyBHaXZlbiBhIGxpc3QsIG1hcmtzIGl0IGFzIGNvbnN0YW50LgovLwovLyBUaGUgcnVudGltZSBlbnN1cmVzIHRoYXQgY29uc3QtbGlzdHMgY2Fubm90IGJlIG1vZGlmaWVkLgpmdW5jdGlvbiBtYWtlQ29uc3RMaXN0KGxpc3QpIHsKICAvLyBCeSBhc3NpZ25pbmcgYSBmdW5jdGlvbiB0byB0aGUgcHJvcGVydGllcyB0aGV5IGJlY29tZSBwYXJ0IG9mIHRoZQogIC8vIGhpZGRlbiBjbGFzcy4gVGhlIGFjdHVhbCB2YWx1ZXMgb2YgdGhlIGZpZWxkcyBkb24ndCBtYXR0ZXIsIHNpbmNlIHdlCiAgLy8gb25seSBjaGVjayBpZiB0aGV5IGV4aXN0LgogIGxpc3QuaW1tdXRhYmxlXCRsaXN0ID0gQXJyYXk7CiAgbGlzdC5maXhlZFwkbGVuZ3RoID0gQXJyYXk7CiAgcmV0dXJuIGxpc3Q7Cn0KCmZ1bmN0aW9uIGNvbnZlcnRUb0Zhc3RPYmplY3QocHJvcGVydGllcykgewogIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSB0aGF0IHVzZXMgJ3Byb3BlcnRpZXMnIGFzIHByb3RvdHlwZS4gVGhpcyBzaG91bGQKICAvLyBtYWtlICdwcm9wZXJ0aWVzJyBhIGZhc3Qgb2JqZWN0LgogIGZ1bmN0aW9uIHQoKSB7fQogIHQucHJvdG90eXBlID0gcHJvcGVydGllczsKICBuZXcgdCgpOwogIHJldHVybiBwcm9wZXJ0aWVzOwp9CgpmdW5jdGlvbiBjb252ZXJ0QWxsVG9GYXN0T2JqZWN0KGFycmF5T2ZPYmplY3RzKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mT2JqZWN0cy5sZW5ndGg7ICsraSkgewogICAgY29udmVydFRvRmFzdE9iamVjdChhcnJheU9mT2JqZWN0c1tpXSk7CiAgfQp9CgovLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgdGhlIHRlYXJPZmZDb2RlIHRvIGd1YXJhbnRlZSB1bmlxdWUgZnVuY3Rpb25zIHBlcgovLyB0ZWFyLW9mZnMuCnZhciBmdW5jdGlvbkNvdW50ZXIgPSAwOwojdGVhck9mZkNvZGU7CgovLyBFYWNoIGRlZmVycmVkIGh1bmsgY29tZXMgd2l0aCBpdHMgb3duIHR5cGVzIHdoaWNoIGFyZSBhZGRlZCB0byB0aGUgZW5kCi8vIG9mIHRoZSB0eXBlcy1hcnJheS4KLy8gVGhlIGBmdW5UeXBlc2AgcGFzc2VkIHRvIHRoZSBgaW5zdGFsbFRlYXJPZmZgIGZ1bmN0aW9uIGJlbG93IGlzIHJlbGF0aXZlIHRvCi8vIHRoZSBodW5rIHRoZSBmdW5jdGlvbiBjb21lcyBmcm9tLiBUaGUgYHR5cGVzT2Zmc2V0YCB2YXJpYWJsZSBlbmNvZGVzIHRoZQovLyBvZmZzZXQgYXQgd2hpY2ggdGhlIG5ldyB0eXBlcyB3aWxsIGJlIGFkZGVkLgp2YXIgdHlwZXNPZmZzZXQgPSAwOwoKLy8gQWRhcHRzIHRoZSBzdG9yZWQgZGF0YSwgc28gaXQncyBzdWl0YWJsZSBmb3IgYSB0ZWFyT2ZmIGNhbGwuCi8vCi8vIFN0b3JlcyB0aGUgdGVhci1vZmYgZ2V0dGVyLWZ1bmN0aW9uIGluIHRoZSBbY29udGFpbmVyXSdzIFtnZXR0ZXJOYW1lXQovLyBwcm9wZXJ0eS4KLy8KLy8gVGhlIFtjb250YWluZXJdIGlzIGVpdGhlciBhIGNsYXNzICh0aGF0IGlzLCBpdHMgcHJvdG90eXBlKSwgb3IgdGhlIGhvbGRlciBmb3IKLy8gc3RhdGljIGZ1bmN0aW9ucy4KLy8KLy8gVGhlIGFyZ3VtZW50IFtmdW5zT3JOYW1lc10gaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyBvciBmdW5jdGlvbnMuIElmIGl0IGlzIGEKLy8gbmFtZSwgdGhlbiB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGZldGNoZWQgZnJvbSB0aGUgY29udGFpbmVyLiBUaGUgZmlyc3QKLy8gZW50cnkgaW4gdGhhdCBhcnJheSAqbXVzdCogYmUgYSBzdHJpbmcuCi8vCi8vIFRPRE8oZmxvaXRzY2gpOiBDaGFuZ2UgdGVhck9mZkNvZGUgdG8gYWNjZXB0IHRoZSBkYXRhIGRpcmVjdGx5LCBvciBjcmVhdGUgYQovLyBkaWZmZXJlbnQgdGVhck9mZkNvZGU/CmZ1bmN0aW9uIGluc3RhbGxUZWFyT2ZmKAogICAgY29udGFpbmVyLCBnZXR0ZXJOYW1lLCBpc1N0YXRpYywgaXNJbnRlcmNlcHRlZCwgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywgY2FsbE5hbWVzLCBmdW5zT3JOYW1lcywgZnVuVHlwZSwgYXBwbHlJbmRleCkgewogIC8vIEEgZnVuY3Rpb24gY2FuIGhhdmUgc2V2ZXJhbCBzdHVicyAoZm9yIGV4YW1wbGUgdG8gZmlsbCBpbiBvcHRpb25hbAogIC8vIGFyZ3VtZW50cykuIFdlIGNvbGxlY3QgdGhlc2UgZnVuY3Rpb25zIGluIHRoZSBgZnVuc2AgYXJyYXkuCiAgdmFyIGZ1bnMgPSBbXTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGZ1bnNPck5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZnVuID0gZnVuc09yTmFtZXNbaV07CiAgICBpZiAoKHR5cGVvZiBmdW4pID09ICdzdHJpbmcnKSBmdW4gPSBjb250YWluZXJbZnVuXTsKICAgIGZ1bi4jY2FsbE5hbWUgPSBjYWxsTmFtZXNbaV07CiAgICBmdW5zLnB1c2goZnVuKTsKICB9CgogIC8vIFRoZSBtYWluIGZ1bmN0aW9uIHRvIHdoaWNoIGFsbCBzdHVicyByZWRpcmVjdC4KICB2YXIgZnVuID0gZnVuc1swXTsKCiAgZnVuWyNhcmd1bWVudENvdW50XSA9IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ7CiAgZnVuWyNkZWZhdWx0QXJndW1lbnRWYWx1ZXNdID0gb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzOwogIHZhciByZWZsZWN0aW9uSW5mbyA9IGZ1blR5cGU7CiAgaWYgKHR5cGVvZiByZWZsZWN0aW9uSW5mbyA9PSAibnVtYmVyIikgewogICAgLy8gVGhlIHJlZmxlY3Rpb25JbmZvIGNhbiBlaXRoZXIgYmUgYSBmdW5jdGlvbiwgb3IgYSBwb2ludGVyIGludG8gdGhlIHR5cGVzCiAgICAvLyB0YWJsZS4gSWYgaXQgcG9pbnRzIGludG8gdGhlIHR5cGVzLXRhYmxlIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBpbmRleCwKICAgIC8vIGluIGNhc2UgdGhlIHRlYXItb2ZmIGlzIHBhcnQgb2YgYSBkZWZlcnJlZCBodW5rLgogICAgcmVmbGVjdGlvbkluZm8gPSByZWZsZWN0aW9uSW5mbyArIHR5cGVzT2Zmc2V0OwogIH0KICB2YXIgbmFtZSA9IGZ1bnNPck5hbWVzWzBdOwogIGZ1bi4jc3R1Yk5hbWUgPSBuYW1lOwogIHZhciBnZXR0ZXJGdW5jdGlvbiA9CiAgICAgIHRlYXJPZmYoZnVucywgYXBwbHlJbmRleCB8fCAwLCByZWZsZWN0aW9uSW5mbywgaXNTdGF0aWMsIG5hbWUsIGlzSW50ZXJjZXB0ZWQpOwogIGNvbnRhaW5lcltnZXR0ZXJOYW1lXSA9IGdldHRlckZ1bmN0aW9uOwogIGlmIChpc1N0YXRpYykgewogICAgZnVuLiR0ZWFyT2ZmUHJvcGVydHlOYW1lID0gZ2V0dGVyRnVuY3Rpb247CiAgfQp9CgpmdW5jdGlvbiBpbnN0YWxsU3RhdGljVGVhck9mZigKICAgIGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwKICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgIGNhbGxOYW1lcywgZnVuc09yTmFtZXMsIGZ1blR5cGUsIGFwcGx5SW5kZXgpIHsKICAvLyBUT0RPKHNyYSk6IFNwZWNpYWxpemUgaW5zdGFsbFRlYXJPZmYgZm9yIHN0YXRpYyBtZXRob2RzLiBJdCBtaWdodCBiZQogIC8vIHBvc3NpYmxlIHRvIGhhbmRsZSBzb21lIHZlcnkgY29tbW9uIHNpbXBsZSBjYXNlcyBkaXJlY3RseS4KICByZXR1cm4gaW5zdGFsbFRlYXJPZmYoCiAgICAgIGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwgdHJ1ZSwgZmFsc2UsCiAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgY2FsbE5hbWVzLCBmdW5zT3JOYW1lcywgZnVuVHlwZSwgYXBwbHlJbmRleCk7Cn0KCmZ1bmN0aW9uIGluc3RhbGxJbnN0YW5jZVRlYXJPZmYoCiAgICBjb250YWluZXIsIGdldHRlck5hbWUsIGlzSW50ZXJjZXB0ZWQsCiAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50LCBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICBjYWxsTmFtZXMsIGZ1bnNPck5hbWVzLCBmdW5UeXBlLCBhcHBseUluZGV4KSB7CiAgLy8gVE9ETyhzcmEpOiBTcGVjaWFsaXplIGluc3RhbGxUZWFyT2ZmIGZvciBpbnN0YW5jZSBtZXRob2RzLgogIHJldHVybiBpbnN0YWxsVGVhck9mZigKICAgICAgY29udGFpbmVyLCBnZXR0ZXJOYW1lLCBmYWxzZSwgaXNJbnRlcmNlcHRlZCwKICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICBjYWxsTmFtZXMsIGZ1bnNPck5hbWVzLCBmdW5UeXBlLCBhcHBseUluZGV4KTsKfQoKLy8gSW5zdGVhZCBvZiBzZXR0aW5nIHRoZSBpbnRlcmNlcHRvciB0YWdzIGRpcmVjdGx5IHdlIHVzZSB0aGlzIHVwZGF0ZQovLyBmdW5jdGlvbi4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgZm9yIGRlZmVycmVkIGZyYWdtZW50cyB0byBjb250cmlidXRlIHRvIHRoZQovLyBlbWJlZGRlZCBnbG9iYWwuCmZ1bmN0aW9uIHNldE9yVXBkYXRlSW50ZXJjZXB0b3JzQnlUYWcobmV3VGFncykgewogIHZhciB0YWdzID0gI2VtYmVkZGVkSW50ZXJjZXB0b3JUYWdzOwogIGlmICghdGFncykgewogICAgI2VtYmVkZGVkSW50ZXJjZXB0b3JUYWdzID0gbmV3VGFnczsKICAgIHJldHVybjsKICB9CiAgY29weVByb3BlcnRpZXMobmV3VGFncywgdGFncyk7Cn0KCi8vIEluc3RlYWQgb2Ygc2V0dGluZyB0aGUgbGVhZiB0YWdzIGRpcmVjdGx5IHdlIHVzZSB0aGlzIHVwZGF0ZQovLyBmdW5jdGlvbi4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgZm9yIGRlZmVycmVkIGZyYWdtZW50cyB0byBjb250cmlidXRlIHRvIHRoZQovLyBlbWJlZGRlZCBnbG9iYWwuCmZ1bmN0aW9uIHNldE9yVXBkYXRlTGVhZlRhZ3MobmV3VGFncykgewogIHZhciB0YWdzID0gI2VtYmVkZGVkTGVhZlRhZ3M7CiAgaWYgKCF0YWdzKSB7CiAgICAjZW1iZWRkZWRMZWFmVGFncyA9IG5ld1RhZ3M7CiAgICByZXR1cm47CiAgfQogIGNvcHlQcm9wZXJ0aWVzKG5ld1RhZ3MsIHRhZ3MpOwp9CgovLyBVcGRhdGVzIHRoZSB0eXBlcyBlbWJlZGRlZCBnbG9iYWwuCmZ1bmN0aW9uIHVwZGF0ZVR5cGVzKG5ld1R5cGVzKSB7CiAgdmFyIHR5cGVzID0gI2VtYmVkZGVkVHlwZXM7CiAgdmFyIGxlbmd0aCA9IHR5cGVzLmxlbmd0aDsKICAvLyBUaGUgdGVhci1vZmYgZnVuY3Rpb24gdXNlcyBhbm90aGVyICd0eXBlc09mZnNldCcgdmFsdWUgY2FjaGVkIGluCiAgLy8gW2luaXRpYWxpemVEZWZlcnJlZEh1bmtdIHNvIFt1cGRhdGVUeXBlc10gY2FuIGJlIGNhbGxlZCBlaXRoZXIgYmVmb3JlIG9yCiAgLy8gYWZ0ZXIgdGhlIHRlYXJvZmZzIGhhdmUgYmVlbiBpbnN0YWxsZWQuCiAgdHlwZXMucHVzaC5hcHBseSh0eXBlcywgbmV3VHlwZXMpOwogIHJldHVybiBsZW5ndGg7Cn0KCi8vIFVwZGF0ZXMgdGhlIGdpdmVuIGhvbGRlciB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBbbmV3SG9sZGVyXS4KLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gYSBkZWZlcnJlZCBmcmFnbWVudCBpcyBpbml0aWFsaXplZC4KZnVuY3Rpb24gdXBkYXRlSG9sZGVyKGhvbGRlciwgbmV3SG9sZGVyKSB7CiAgY29weVByb3BlcnRpZXMobmV3SG9sZGVyLCBob2xkZXIpOwogIHJldHVybiBob2xkZXI7Cn0KCnZhciAjaHVua0hlbHBlcnMgPSAoZnVuY3Rpb24oKXsKICB2YXIgbWtJbnN0YW5jZSA9IGZ1bmN0aW9uKAogICAgICBpc0ludGVyY2VwdGVkLCByZXF1aXJlZFBhcmFtZXRlckNvdW50LCBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgIGNhbGxOYW1lcywgYXBwbHlJbmRleCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwgbmFtZSwgZnVuVHlwZSkgewogICAgICByZXR1cm4gaW5zdGFsbEluc3RhbmNlVGVhck9mZigKICAgICAgICAgIGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwgaXNJbnRlcmNlcHRlZCwKICAgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgICAgIGNhbGxOYW1lcywgW25hbWVdLCBmdW5UeXBlLCBhcHBseUluZGV4KTsKICAgIH0KICB9LAoKICBta1N0YXRpYyA9IGZ1bmN0aW9uKAogICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50LCBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgIGNhbGxOYW1lcywgYXBwbHlJbmRleCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwgbmFtZSwgZnVuVHlwZSkgewogICAgICByZXR1cm4gaW5zdGFsbFN0YXRpY1RlYXJPZmYoCiAgICAgICAgICBjb250YWluZXIsIGdldHRlck5hbWUsCiAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50LCBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgICAgICBjYWxsTmFtZXMsIFtuYW1lXSwgZnVuVHlwZSwgYXBwbHlJbmRleCk7CiAgICB9CiAgfTsKCiAgLy8gVE9ETyhzcmEpOiBNaW5pZnkgcHJvcGVydGllcyBvZiAnaHVua0hlbHBlcnMnLgogIHJldHVybiB7CiAgICBpbmhlcml0OiBpbmhlcml0LAogICAgaW5oZXJpdE1hbnk6IGluaGVyaXRNYW55LAogICAgbWl4aW46IG1peGluLAogICAgaW5zdGFsbFN0YXRpY1RlYXJPZmY6IGluc3RhbGxTdGF0aWNUZWFyT2ZmLAogICAgaW5zdGFsbEluc3RhbmNlVGVhck9mZjogaW5zdGFsbEluc3RhbmNlVGVhck9mZiwKCiAgICAgICAgLy8gVW5pbnRlcmNlcHRlZCBtZXRob2RzLgogICAgX2luc3RhbmNlXzB1OiBta0luc3RhbmNlKDAsIDAsIG51bGwsIFsjY2FsbDBzZWxlY3Rvcl0sIDApLAogICAgX2luc3RhbmNlXzF1OiBta0luc3RhbmNlKDAsIDEsIG51bGwsIFsjY2FsbDFzZWxlY3Rvcl0sIDApLAogICAgX2luc3RhbmNlXzJ1OiBta0luc3RhbmNlKDAsIDIsIG51bGwsIFsjY2FsbDJzZWxlY3Rvcl0sIDApLAoKICAgICAgICAvLyBJbnRlcmNlcHRlZCBtZXRob2RzLgogICAgX2luc3RhbmNlXzBpOiBta0luc3RhbmNlKDEsIDAsIG51bGwsIFsjY2FsbDBzZWxlY3Rvcl0sIDApLAogICAgX2luc3RhbmNlXzFpOiBta0luc3RhbmNlKDEsIDEsIG51bGwsIFsjY2FsbDFzZWxlY3Rvcl0sIDApLAogICAgX2luc3RhbmNlXzJpOiBta0luc3RhbmNlKDEsIDIsIG51bGwsIFsjY2FsbDJzZWxlY3Rvcl0sIDApLAoKICAgICAgICAvLyBTdGF0aWMgbWV0aG9kcy4KICAgIF9zdGF0aWNfMDogbWtTdGF0aWMoMCwgbnVsbCwgWyNjYWxsMHNlbGVjdG9yXSwgMCksCiAgICBfc3RhdGljXzE6IG1rU3RhdGljKDEsIG51bGwsIFsjY2FsbDFzZWxlY3Rvcl0sIDApLAogICAgX3N0YXRpY18yOiBta1N0YXRpYygyLCBudWxsLCBbI2NhbGwyc2VsZWN0b3JdLCAwKSwKCiAgICBtYWtlQ29uc3RMaXN0OiBtYWtlQ29uc3RMaXN0LAogICAgbGF6eTogbGF6eSwKICAgIHVwZGF0ZUhvbGRlcjogdXBkYXRlSG9sZGVyLAogICAgY29udmVydFRvRmFzdE9iamVjdDogY29udmVydFRvRmFzdE9iamVjdCwKICAgIHNldEZ1bmN0aW9uTmFtZXNJZk5lY2Vzc2FyeTogc2V0RnVuY3Rpb25OYW1lc0lmTmVjZXNzYXJ5LAogICAgdXBkYXRlVHlwZXM6IHVwZGF0ZVR5cGVzLAogICAgc2V0T3JVcGRhdGVJbnRlcmNlcHRvcnNCeVRhZzogc2V0T3JVcGRhdGVJbnRlcmNlcHRvcnNCeVRhZywKICAgIHNldE9yVXBkYXRlTGVhZlRhZ3M6IHNldE9yVXBkYXRlTGVhZlRhZ3MsCiAgfTsKfSkoKTsKCi8vIEV2ZXJ5IGRlZmVycmVkIGh1bmsgKGkuZS4gZnJhZ21lbnQpIGlzIGEgZnVuY3Rpb24gdGhhdCB3ZSBjYW4gaW52b2tlIHRvCi8vIGluaXRpYWxpemUgaXQuIEF0IHRoaXMgbW9tZW50IGl0IGNvbnRyaWJ1dGVzIGl0cyBkYXRhIHRvIHRoZSBtYWluIGh1bmsuCmZ1bmN0aW9uIGluaXRpYWxpemVEZWZlcnJlZEh1bmsoaHVuaykgewogIC8vIFVwZGF0ZSB0aGUgdHlwZXNPZmZzZXQgZm9yIHRoZSBuZXh0IGRlZmVycmVkIGxpYnJhcnkuCiAgdHlwZXNPZmZzZXQgPSAjZW1iZWRkZWRUeXBlcy5sZW5ndGg7CgogIC8vIFRPRE8oZmxvaXRzY2gpOiBleHRlbmQgbmF0aXZlcy4KICBodW5rKGh1bmtIZWxwZXJzLCAjZW1iZWRkZWRHbG9iYWxzT2JqZWN0LCBob2xkZXJzLCAjc3RhdGljU3RhdGUpOwp9CgovLyBSZXR1cm5zIHRoZSBnbG9iYWwgd2l0aCB0aGUgZ2l2ZW4gW25hbWVdLgpmdW5jdGlvbiBnZXRHbG9iYWxGcm9tTmFtZShuYW1lKSB7CiAgLy8gVE9ETyhmbG9pdHNjaCk6IHdlIGFyZSBydW5uaW5nIHRocm91Z2ggYWxsIGhvbGRlcnMuIFNpbmNlIG5lZ2F0aXZlCiAgLy8gbG9va3VwcyBhcmUgZXhwZW5zaXZlIHdlIG1pZ2h0IG5lZWQgdG8gaW1wcm92ZSB0aGlzLgogIC8vIFJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGFsbCBuYW1lcyBhcmUgdW5pcXVlIGFjcm9zcyBhbGwgaG9sZGVycy4KICBmb3IgKHZhciBpID0gMDsgaSA8IGhvbGRlcnMubGVuZ3RoOyBpKyspIHsKICAgIC8vIFRoZSBjb25zdGFudCBob2xkZXIgcmV1c2VzIHRoZSBzYW1lIG5hbWVzLiBUaGVyZWZvcmUgd2UgbXVzdCBza2lwIGl0LgogICAgaWYgKGhvbGRlcnNbaV0gPT0gI2NvbnN0YW50SG9sZGVyUmVmZXJlbmNlKSBjb250aW51ZTsKICAgIC8vIFJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGFsbCB2YXJpYWJsZXMgYXJlIHVuaXF1ZS4KICAgIGlmIChob2xkZXJzW2ldW25hbWVdKSByZXR1cm4gaG9sZGVyc1tpXVtuYW1lXTsKICB9Cn0KCmlmICgjaGFzU29mdERlZmVycmVkQ2xhc3NlcykgewogIC8vIExvYWRzIHRoZSBzb2Z0LWRlZmVycmVkIGNsYXNzZXMgYW5kIGluaXRpYWxpemVzIHRoZW0uCiAgLy8gVXBkYXRlcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBnaXZlbiBvYmplY3QuCiAgZnVuY3Rpb24gc29mdERlZihvKSB7CiAgICBzb2Z0RGVmID0gZnVuY3Rpb24obykge307ICAvLyBSZXBsYWNlIG91cnNlbHZlcy4KICAgICNkZWZlcnJlZEdsb2JhbFsjc29mdElkXSgKICAgICAgICBob2xkZXJzLCAjZW1iZWRkZWRHbG9iYWxzT2JqZWN0LCAjc3RhdGljU3RhdGUsCiAgICAgICAgaHVua0hlbHBlcnMpOwogICAgaWYgKG8gIT0gbnVsbCkgewogICAgICAvLyBUT0RPKDI5NTc0KTogc2hvdWxkIHdlIGRvIHNvbWV0aGluZyBkaWZmZXJlbnQgZm9yIEZpcmVmb3g/CiAgICAgIC8vIElmIHdlIHJlY29tbWVuZCB0aGF0IHRoZSBwcm9ncmFtIHRyaWdnZXJzIHRoZSBsb2FkIGJ5IGl0c2VsZiBiZWZvcmUKICAgICAgLy8gY2xhc3NlcyBhcmUgbmVlZGVkLCB0aGVuIHRoaXMgbGluZSBzaG91bGQgcmFyZWx5IGJlIGhpdC4KICAgICAgLy8gQWxzbywgaXQgaXMgb25seSBoaXQgYXQgbW9zdCBvbmNlIChwZXIgc29mdC1kZWZlcnJlZCBjaHVuaykuCiAgICAgIG8uX19wcm90b19fID0gby5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgICB9CiAgfQp9CgppZiAoI2lzVHJhY2tpbmdBbGxvY2F0aW9ucykgewogIHZhciBhbGxvY2F0aW9ucyA9ICNkZWZlcnJlZEdsb2JhbFsnYWxsb2NhdGlvbnMnXSA9IHt9Owp9CgovLyBDcmVhdGVzIHRoZSBob2xkZXJzLgojaG9sZGVyczsKCi8vIElmIHRoZSBuYW1lIGlzIG5vdCBzZXQgb24gdGhlIGZ1bmN0aW9ucywgZG8gaXQgbm93LgpodW5rSGVscGVycy5zZXRGdW5jdGlvbk5hbWVzSWZOZWNlc3NhcnkoaG9sZGVycyk7CgovLyBUT0RPKGZsb2l0c2NoKTogd2Ugc2hvdWxkIGJ1aWxkIHRoaXMgb2JqZWN0IGFzIGEgbGl0ZXJhbC4KdmFyICNzdGF0aWNTdGF0ZURlY2xhcmF0aW9uID0ge307CgovLyBTZXRzIHRoZSBwcm90b3R5cGVzIG9mIGNsYXNzZXMuCiNwcm90b3R5cGVzOwovLyBTZXRzIGFsaWFzZXMgb2YgbWV0aG9kcyAob24gdGhlIHByb3RvdHlwZXMgb2YgY2xhc3NlcykuCiNhbGlhc2VzOwovLyBJbnN0YWxscyB0aGUgdGVhci1vZmZzIG9mIGZ1bmN0aW9ucy4KI3RlYXJPZmZzOwovLyBCdWlsZHMgdGhlIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4KI2luaGVyaXRhbmNlOwoKLy8gRW1pdHMgdGhlIGVtYmVkZGVkIGdsb2JhbHMuIFRoaXMgbmVlZHMgdG8gYmUgYmVmb3JlIGNvbnN0YW50cyBzbyB0aGUgZW1iZWRkZWQKLy8gZ2xvYmFsIHR5cGUgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgZm9yIGdlbmVyYXRpbmcgY29uc3RhbnRzLgojZW1iZWRkZWRHbG9iYWxzUGFydDE7CgovLyBBZGRzIHRoZSBzdWJ0eXBlIHJ1bGVzIGZvciB0aGUgbmV3IFJUSS4KI3R5cGVSdWxlczsKCi8vIEluc3RhbnRpYXRlcyBhbGwgY29uc3RhbnRzLgojY29uc3RhbnRzOwoKLy8gQWRkcyB0byB0aGUgZW1iZWRkZWQgZ2xvYmFscy4gQSBmZXcgZ2xvYmFscyByZWZlciB0byBjb25zdGFudHMuCiNlbWJlZGRlZEdsb2JhbHNQYXJ0MjsgCgovLyBJbml0aWFsaXplcyB0aGUgc3RhdGljIG5vbi1maW5hbCBmaWVsZHMgKHdpdGggdGhlaXIgY29uc3RhbnQgdmFsdWVzKS4KI3N0YXRpY05vbkZpbmFsRmllbGRzOwovLyBDcmVhdGVzIGxhenkgZ2V0dGVycyBmb3Igc3RhdGljcyB0aGF0IG11c3QgcnVuIGluaXRpYWxpemVycyBvbiBmaXJzdCBhY2Nlc3MuCiNsYXp5U3RhdGljczsKCi8vIFNldHMgdXAgdGhlIG5hdGl2ZSBzdXBwb3J0LgovLyBOYXRpdmUtc3VwcG9ydCB1c2VzIHNldE9yVXBkYXRlSW50ZXJjZXB0b3JzQnlUYWcgYW5kIHNldE9yVXBkYXRlTGVhZlRhZ3MuCiNuYXRpdmVTdXBwb3J0OwoKLy8gU2V0cyB1cCB0aGUganMtaW50ZXJvcCBzdXBwb3J0LgojanNJbnRlcm9wU3VwcG9ydDsKCi8vIEVuc3VyZSBob2xkZXJzIGFyZSBpbiBmYXN0IG1vZGUsIG5vdyB3ZSBoYXZlIGZpbmlzaGVkIGFkZGluZyB0aGluZ3MuCmNvbnZlcnRBbGxUb0Zhc3RPYmplY3QoaG9sZGVycyk7CmNvbnZlcnRUb0Zhc3RPYmplY3QoI3N0YXRpY1N0YXRlKTsKCi8vIEludm9rZXMgbWFpbiAobWFraW5nIHN1cmUgdGhhdCBpdCByZWNvcmRzIHRoZSAnY3VycmVudC1zY3JpcHQnIHZhbHVlKS4KI2ludm9rZU1haW47Cn0pKCkKJycnOwoKLy8vIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIGB0cnVlYCBpZiBgX19wcm90b19fYCBjYW4gYmUgYXNzaWduZWQgdG8gc3RpdGNoCi8vLyB0b2dldGhlciBhIHByb3RvdHlwZSBjaGFpbiwgYW5kIHRoZSBwZXJmb3JtYW5jZSBpcyBnb29kLgpjb25zdCBTdHJpbmcgZGlyZWN0QWNjZXNzVGVzdEV4cHJlc3Npb24gPSByJycnCiAgKGZ1bmN0aW9uICgpIHsKICAgIHZhciBjbHMgPSBmdW5jdGlvbiAoKSB7fTsKICAgIGNscy5wcm90b3R5cGUgPSB7J3AnOiB7fX07CiAgICB2YXIgb2JqZWN0ID0gbmV3IGNscygpOwogICAgaWYgKCEob2JqZWN0Ll9fcHJvdG9fXyAmJiBvYmplY3QuX19wcm90b19fLnAgPT09IGNscy5wcm90b3R5cGUucCkpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICB0cnkgewogICAgICAvLyBBcmUgd2UgcnVubmluZyBvbiBhIHBsYXRmb3JtIHdoZXJlIHRoZSBwZXJmb3JtYW5jZSBpcyBnb29kPwogICAgICAvLyAoaS5lLiBDaHJvbWUgb3IgZDgpLgoKICAgICAgLy8gQ2hyb21lIHVzZXJBZ2VudD8KICAgICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT0gInVuZGVmaW5lZCIgJiYKICAgICAgICAgIHR5cGVvZiBuYXZpZ2F0b3IudXNlckFnZW50ID09ICJzdHJpbmciICYmCiAgICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZS8iKSA+PSAwKSByZXR1cm4gdHJ1ZTsKICAgICAgLy8gZDggdmVyc2lvbigpIGxvb2tzIGxpa2UgIk4uTi5OLk4iLCBqc3NoZWxsIHZlcnNpb24oKSBsaWtlICJOIi4KICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09ICJmdW5jdGlvbiIgJiYKICAgICAgICAgIHZlcnNpb24ubGVuZ3RoID09IDApIHsKICAgICAgICB2YXIgdiA9IHZlcnNpb24oKTsKICAgICAgICBpZiAoL15cZCtcLlxkK1wuXGQrXC5cZCskLy50ZXN0KHYpKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBjYXRjaChfKSB7fQoKICAgIHJldHVybiBmYWxzZTsKICB9KSgpCicnJzsKCi8vLyBTb2Z0LWRlZmVycmVkIGZyYWdtZW50cyBhcmUgYnVpbHQgc2ltaWxhcmx5IHRvIHRoZSBtYWluIGZyYWdtZW50LgoKLy8vIERlZmVycmVkIGZyYWdtZW50cyAoYWthICdodW5rcycpIGFyZSBidWlsdCBzaW1pbGFybHkgdG8gdGhlIG1haW4gZnJhZ21lbnQuCi8vLwovLy8gSG93ZXZlciwgYXQgc3BlY2lmaWMgbW9tZW50cyB0aGV5IG5lZWQgdG8gY29udHJpYnV0ZSB0aGVpciBkYXRhLgovLy8gRm9yIGV4YW1wbGUsIG9uY2UgdGhlIGhvbGRlcnMgaGF2ZSBiZWVuIGNyZWF0ZWQsIHRoZXkgYXJlIGluY2x1ZGVkIGludG8KLy8vIHRoZSBtYWluIGhvbGRlcnMuCi8vLwovLy8gVGhpcyB0ZW1wbGF0ZSBpcyB1c2VkIGZvciBEYXJ0IDIuCmNvbnN0IFN0cmluZyBkZWZlcnJlZEJvaWxlcnBsYXRlRGFydDIgPSAnJycKZnVuY3Rpb24oaHVua0hlbHBlcnMsICNlbWJlZGRlZEdsb2JhbHNPYmplY3QsIGhvbGRlcnNMaXN0LCAjc3RhdGljU3RhdGUpIHsKCi8vIEJ1aWxkcyB0aGUgaG9sZGVycy4gVGhleSBvbmx5IGNvbnRhaW4gdGhlIGRhdGEgZm9yIG5ldyBob2xkZXJzLgojaG9sZGVyczsKCi8vIElmIHRoZSBuYW1lIGlzIG5vdCBzZXQgb24gdGhlIGZ1bmN0aW9ucywgZG8gaXQgbm93LgpodW5rSGVscGVycy5zZXRGdW5jdGlvbk5hbWVzSWZOZWNlc3NhcnkoI2RlZmVycmVkSG9sZGVyc0xpc3QpOwoKLy8gVXBkYXRlcyB0aGUgaG9sZGVycyBvZiB0aGUgbWFpbi1mcmFnbWVudC4gVXNlcyB0aGUgcHJvdmlkZWQgaG9sZGVyc0xpc3QgdG8KLy8gYWNjZXNzIHRoZSBtYWluIGhvbGRlcnMuCi8vIFRoZSBsb2NhbCBob2xkZXJzIGFyZSByZXBsYWNlZCBieSB0aGUgY29tYmluZWQgaG9sZGVycy4gVGhpcyBpcyBuZWNlc3NhcnkKLy8gZm9yIHRoZSBpbmhlcml0YW5jZSBzZXR1cCBiZWxvdy4KI3VwZGF0ZUhvbGRlcnM7Ci8vIFNldHMgdGhlIHByb3RvdHlwZXMgb2YgdGhlIG5ldyBjbGFzc2VzLgojcHJvdG90eXBlczsKLy8gQWRkIHNpZ25hdHVyZSBmdW5jdGlvbiB0eXBlcyBhbmQgY29tcHV0ZSB0aGUgdHlwZXMgb2Zmc2V0IGluIGBpbml0LnR5cGVzYC4KLy8gVGhlc2UgY2FuIG9ubHkgcmVmZXIgdG8gcmVndWxhciBjbGFzc2VzIGFuZCBpbiBEYXJ0IDIgb25seSBjbG9zdXJlcyBoYXZlCi8vIGZ1bmN0aW9uIHR5cGVzIHNvIHRoZSBgdHlwZXNPZmZzZXRgIGhhcyBiZWVuIHNhZmVseSBjb21wdXRlZCBiZWZvcmUgaXQncwovLyByZWZlcnJlZCBpbiB0aGUgc2lnbmF0dXJlcyBvZiB0aGUgYGNsb3N1cmVzYCBiZWxvdy4KdmFyICN0eXBlc09mZnNldCA9IGh1bmtIZWxwZXJzLnVwZGF0ZVR5cGVzKCN0eXBlcyk7CiNjbG9zdXJlczsKLy8gU2V0cyBhbGlhc2VzIG9mIG1ldGhvZHMgKG9uIHRoZSBwcm90b3R5cGVzIG9mIGNsYXNzZXMpLgojYWxpYXNlczsKLy8gSW5zdGFsbHMgdGhlIHRlYXItb2ZmcyBvZiBmdW5jdGlvbnMuCiN0ZWFyT2ZmczsKLy8gQnVpbGRzIHRoZSBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuCiNpbmhlcml0YW5jZTsKCi8vIEFkZHMgdGhlIHN1YnR5cGUgcnVsZXMgZm9yIHRoZSBuZXcgUlRJLgojdHlwZVJ1bGVzOwoKLy8gSW5zdGFudGlhdGVzIGFsbCBjb25zdGFudHMgb2YgdGhpcyBkZWZlcnJlZCBmcmFnbWVudC4KLy8gTm90ZSB0aGF0IHRoZSBjb25zdGFudC1ob2xkZXIgaGFzIGJlZW4gdXBkYXRlZCBlYXJsaWVyIGFuZCBzdG9yaW5nIHRoZQovLyBjb25zdGFudCB2YWx1ZXMgaW4gdGhlIGNvbnN0YW50LWhvbGRlciBtYWtlcyB0aGVtIGF2YWlsYWJsZSBnbG9iYWxseS4KI2NvbnN0YW50czsKLy8gSW5pdGlhbGl6ZXMgdGhlIHN0YXRpYyBub24tZmluYWwgZmllbGRzICh3aXRoIHRoZWlyIGNvbnN0YW50IHZhbHVlcykuCiNzdGF0aWNOb25GaW5hbEZpZWxkczsKLy8gQ3JlYXRlcyBsYXp5IGdldHRlcnMgZm9yIHN0YXRpY3MgdGhhdCBtdXN0IHJ1biBpbml0aWFsaXplcnMgb24gZmlyc3QgYWNjZXNzLgojbGF6eVN0YXRpY3M7CgovLyBOYXRpdmUtc3VwcG9ydCB1c2VzIHNldE9yVXBkYXRlSW50ZXJjZXB0b3JzQnlUYWcgYW5kIHNldE9yVXBkYXRlTGVhZlRhZ3MuCiNuYXRpdmVTdXBwb3J0Owp9JycnOwoKLy8vCi8vLyBIb3dldmVyLCB0aGV5IGRvbid0IGNvbnRyaWJ1dGUgYW55dGhpbmcgdG8gZ2xvYmFsIG5hbWVzcGFjZSwgYnV0IGp1c3QKLy8vIGluaXRpYWxpemUgZXhpc3RpbmcgY2xhc3Nlcy4gRm9yIGV4YW1wbGUsIHRoZXkgdXBkYXRlIHRoZSBpbmhlcml0YW5jZQovLy8gaGllcmFyY2h5LCBhbmQgYWRkIG1ldGhvZHMgdGhlIHByb3RvdHlwZXMuCmNvbnN0IFN0cmluZyBzb2Z0RGVmZXJyZWRCb2lsZXJwbGF0ZSA9ICcnJwojZGVmZXJyZWRHbG9iYWxbI3NvZnRJZF0gPQogIGZ1bmN0aW9uKGhvbGRlcnNMaXN0LCAjZW1iZWRkZWRHbG9iYWxzT2JqZWN0LCAjc3RhdGljU3RhdGUsCiAgICAgICAgICAgaHVua0hlbHBlcnMpIHsKCi8vIEluc3RhbGxzIHRoZSBob2xkZXJzIGFzIGxvY2FsIHZhcmlhYmxlcy4KI2luc3RhbGxIb2xkZXJzQXNMb2NhbHM7Ci8vIFNldHMgdGhlIHByb3RvdHlwZXMgb2YgdGhlIG5ldyBjbGFzc2VzLgojcHJvdG90eXBlczsKLy8gU2V0cyBhbGlhc2VzIG9mIG1ldGhvZHMgKG9uIHRoZSBwcm90b3R5cGVzIG9mIGNsYXNzZXMpLgojYWxpYXNlczsKLy8gSW5zdGFsbHMgdGhlIHRlYXItb2ZmcyBvZiBmdW5jdGlvbnMuCiN0ZWFyT2ZmczsKLy8gQnVpbGRzIHRoZSBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuCiNpbmhlcml0YW5jZTsKfScnJzsKCi8vLyBUaGlzIGNsYXNzIGJ1aWxkcyBhIEphdmFTY3JpcHQgdHJlZSBmb3IgYSBnaXZlbiBmcmFnbWVudC4KLy8vCi8vLyBBIGZyYWdtZW50IGlzIGdlbmVyYWxseSB3cml0dGVuIGludG8gYSBzZXBhcmF0ZSBmaWxlIHNvIHRoYXQgaXQgY2FuIGJlCi8vLyBsb2FkZWQgZHluYW1pY2FsbHkgd2hlbiBhIGRlZmVycmVkIGxpYnJhcnkgaXMgbG9hZGVkLgovLy8KLy8vIFRoaXMgY2xhc3MgaXMgc3RhdGVsZXNzIGFuZCBjYW4gYmUgcmV1c2VkIGZvciBkaWZmZXJlbnQgZnJhZ21lbnRzLgpjbGFzcyBGcmFnbWVudEVtaXR0ZXIgewogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBfb3B0aW9uczsKICBmaW5hbCBEdW1wSW5mb1Rhc2sgX2R1bXBJbmZvVGFzazsKICBmaW5hbCBOYW1lciBfbmFtZXI7CiAgZmluYWwgRW1pdHRlciBfZW1pdHRlcjsKICBmaW5hbCBDb25zdGFudEVtaXR0ZXIgX2NvbnN0YW50RW1pdHRlcjsKICBmaW5hbCBNb2RlbEVtaXR0ZXIgX21vZGVsRW1pdHRlcjsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIENvZGVnZW5Xb3JsZCBfY29kZWdlbldvcmxkOwogIFJlY2lwZUVuY29kZXIgX3JlY2lwZUVuY29kZXI7CiAgUnVsZXNldEVuY29kZXIgX3J1bGVzZXRFbmNvZGVyOwoKICBEYXJ0VHlwZXMgZ2V0IF9kYXJ0VHlwZXMgPT4gX2Nsb3NlZFdvcmxkLmRhcnRUeXBlczsKICBKRWxlbWVudEVudmlyb25tZW50IGdldCBfZWxlbWVudEVudmlyb25tZW50ID0+CiAgICAgIF9jbG9zZWRXb3JsZC5lbGVtZW50RW52aXJvbm1lbnQ7CgogIGpzLk5hbWUgX2NhbGwwTmFtZSwgX2NhbGwxTmFtZSwgX2NhbGwyTmFtZTsKICBqcy5OYW1lIGdldCBjYWxsME5hbWUgPT4KICAgICAgX2NhbGwwTmFtZSA/Pz0gX25hbWVyLmdldE5hbWVGb3JKc0dldE5hbWUobnVsbCwgSnNHZXROYW1lLkNBTExfUFJFRklYMCk7CiAganMuTmFtZSBnZXQgY2FsbDFOYW1lID0+CiAgICAgIF9jYWxsMU5hbWUgPz89IF9uYW1lci5nZXROYW1lRm9ySnNHZXROYW1lKG51bGwsIEpzR2V0TmFtZS5DQUxMX1BSRUZJWDEpOwogIGpzLk5hbWUgZ2V0IGNhbGwyTmFtZSA9PgogICAgICBfY2FsbDJOYW1lID8/PSBfbmFtZXIuZ2V0TmFtZUZvckpzR2V0TmFtZShudWxsLCBKc0dldE5hbWUuQ0FMTF9QUkVGSVgyKTsKCiAgRnJhZ21lbnRFbWl0dGVyKAogICAgICB0aGlzLl9vcHRpb25zLAogICAgICB0aGlzLl9kdW1wSW5mb1Rhc2ssCiAgICAgIHRoaXMuX25hbWVyLAogICAgICB0aGlzLl9lbWl0dGVyLAogICAgICB0aGlzLl9jb25zdGFudEVtaXR0ZXIsCiAgICAgIHRoaXMuX21vZGVsRW1pdHRlciwKICAgICAgdGhpcy5fY2xvc2VkV29ybGQsCiAgICAgIHRoaXMuX2NvZGVnZW5Xb3JsZCkgewogICAgaWYgKF9vcHRpb25zLmV4cGVyaW1lbnROZXdSdGkpIHsKICAgICAgX3JlY2lwZUVuY29kZXIgPSBSZWNpcGVFbmNvZGVySW1wbCgKICAgICAgICAgIF9jbG9zZWRXb3JsZCwKICAgICAgICAgIF9vcHRpb25zLmRpc2FibGVSdGlPcHRpbWl6YXRpb24KICAgICAgICAgICAgICA/IFRyaXZpYWxSdW50aW1lVHlwZXNTdWJzdGl0dXRpb25zKF9jbG9zZWRXb3JsZCkKICAgICAgICAgICAgICA6IFJ1bnRpbWVUeXBlc0ltcGwoX2Nsb3NlZFdvcmxkKSwKICAgICAgICAgIF9jbG9zZWRXb3JsZC5uYXRpdmVEYXRhLAogICAgICAgICAgX2Nsb3NlZFdvcmxkLmVsZW1lbnRFbnZpcm9ubWVudCwKICAgICAgICAgIF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cywKICAgICAgICAgIF9jbG9zZWRXb3JsZC5ydGlOZWVkKTsKICAgICAgX3J1bGVzZXRFbmNvZGVyID0KICAgICAgICAgIFJ1bGVzZXRFbmNvZGVyKF9jbG9zZWRXb3JsZC5kYXJ0VHlwZXMsIF9lbWl0dGVyLCBfcmVjaXBlRW5jb2Rlcik7CiAgICB9CiAgfQoKICBqcy5FeHByZXNzaW9uIGdlbmVyYXRlRW1iZWRkZWRHbG9iYWxBY2Nlc3MoU3RyaW5nIGdsb2JhbCkgPT4KICAgICAgX2VtaXR0ZXIuZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhnbG9iYWwpOwoKICBqcy5FeHByZXNzaW9uIGdlbmVyYXRlQ29uc3RhbnRSZWZlcmVuY2UoQ29uc3RhbnRWYWx1ZSB2YWx1ZSkgPT4KICAgICAgX21vZGVsRW1pdHRlci5nZW5lcmF0ZUNvbnN0YW50UmVmZXJlbmNlKHZhbHVlKTsKCiAganMuRXhwcmVzc2lvbiBjbGFzc1JlZmVyZW5jZShDbGFzcyBjbHMpIHsKICAgIHJldHVybiBqcy5qcygnIy4jJywgW2Nscy5ob2xkZXIubmFtZSwgY2xzLm5hbWVdKTsKICB9CgogIHZvaWQgcmVnaXN0ZXJFbnRpdHlBc3QoRW50aXR5IGVudGl0eSwganMuTm9kZSBjb2RlLCB7TGlicmFyeUVudGl0eSBsaWJyYXJ5fSkgewogICAgX2R1bXBJbmZvVGFzay5yZWdpc3RlckVudGl0eUFzdChlbnRpdHksIGNvZGUpOwogICAgLy8gVE9ETyhzaWdtdW5kKTogc3RvcCByZWNvZGluZyBhc3NvY2lhdGlvbnMgdHdpY2UsIGR1bXAtaW5mbyBhbHJlYWR5CiAgICAvLyBoYXMgbGlicmFyeSB0byBlbGVtZW50IGRlcGVuZGVuY2llcyB0byByZWNvdmVyIHRoaXMgZGF0YS4KICAgIGlmIChsaWJyYXJ5ICE9IG51bGwpIF9kdW1wSW5mb1Rhc2sucmVnaXN0ZXJFbnRpdHlBc3QobGlicmFyeSwgY29kZSk7CiAgfQoKICBqcy5TdGF0ZW1lbnQgZW1pdE1haW5GcmFnbWVudCgKICAgICAgUHJvZ3JhbSBwcm9ncmFtLCBEZWZlcnJlZExvYWRpbmdTdGF0ZSBkZWZlcnJlZExvYWRpbmdTdGF0ZSkgewogICAgTWFpbkZyYWdtZW50IGZyYWdtZW50ID0gcHJvZ3JhbS5mcmFnbWVudHMuZmlyc3Q7CgogICAgSXRlcmFibGU8SG9sZGVyPiBub25TdGF0aWNTdGF0ZUhvbGRlcnMgPQogICAgICAgIHByb2dyYW0uaG9sZGVycy53aGVyZSgoSG9sZGVyIGhvbGRlcikgPT4gIWhvbGRlci5pc1N0YXRpY1N0YXRlSG9sZGVyKTsKCiAgICBTdHJpbmcgc29mdERlZmVycmVkSWQgPSAic29mdERlZmVycmVkJHtuZXcgUmFuZG9tKCkubmV4dEludCgweDdGRkZGRkZGKX0iOwoKICAgIEhvbGRlckNvZGUgaG9sZGVyQ29kZSA9CiAgICAgICAgZW1pdEhvbGRlcnMocHJvZ3JhbS5ob2xkZXJzLCBmcmFnbWVudCwgaW5pdGlhbGl6ZUVtcHR5SG9sZGVyczogdHJ1ZSk7CgogICAganMuU3RhdGVtZW50IG1haW5Db2RlID0ganMuanMuc3RhdGVtZW50KG1haW5Cb2lsZXJwbGF0ZSwgewogICAgICAvLyBUT0RPKDI5NDU1KTogJ2h1bmtIZWxwZXJzJyBkaXNwbGFjZXMgb3RoZXIgbmFtZXMsIHNvIGRvbid0IG1pbmlmeSBpdC4KICAgICAgJ2h1bmtIZWxwZXJzJzoganMuVmFyaWFibGVEZWNsYXJhdGlvbignaHVua0hlbHBlcnMnLCBhbGxvd1JlbmFtZTogZmFsc2UpLAogICAgICAnZGlyZWN0QWNjZXNzVGVzdEV4cHJlc3Npb24nOiBqcy5qcyhkaXJlY3RBY2Nlc3NUZXN0RXhwcmVzc2lvbiksCiAgICAgICdjeWNsaWNUaHJvdyc6IF9lbWl0dGVyCiAgICAgICAgICAuc3RhdGljRnVuY3Rpb25BY2Nlc3MoX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLmN5Y2xpY1Rocm93SGVscGVyKSwKICAgICAgJ29wZXJhdG9ySXNQcmVmaXgnOiBqcy5zdHJpbmcoX25hbWVyLmZpeGVkTmFtZXMub3BlcmF0b3JJc1ByZWZpeCksCiAgICAgICd0ZWFyT2ZmQ29kZSc6IG5ldyBqcy5CbG9jayhidWlsZFRlYXJPZmZDb2RlKAogICAgICAgICAgX29wdGlvbnMsIF9lbWl0dGVyLCBfbmFtZXIsIF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cykpLAogICAgICAnZW1iZWRkZWRUeXBlcyc6IGdlbmVyYXRlRW1iZWRkZWRHbG9iYWxBY2Nlc3MoVFlQRVMpLAogICAgICAnZW1iZWRkZWRJbnRlcmNlcHRvclRhZ3MnOgogICAgICAgICAgZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhJTlRFUkNFUFRPUlNfQllfVEFHKSwKICAgICAgJ2VtYmVkZGVkTGVhZlRhZ3MnOiBnZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzKExFQUZfVEFHUyksCiAgICAgICdlbWJlZGRlZEdsb2JhbHNPYmplY3QnOiBqcy5qcygiaW5pdCIpLAogICAgICAnc3RhdGljU3RhdGVEZWNsYXJhdGlvbic6IG5ldyBqcy5WYXJpYWJsZURlY2xhcmF0aW9uKAogICAgICAgICAgX25hbWVyLnN0YXRpY1N0YXRlSG9sZGVyLAogICAgICAgICAgYWxsb3dSZW5hbWU6IGZhbHNlKSwKICAgICAgJ3N0YXRpY1N0YXRlJzoganMuanMoJyMnLCBfbmFtZXIuc3RhdGljU3RhdGVIb2xkZXIpLAogICAgICAnY29uc3RhbnRIb2xkZXJSZWZlcmVuY2UnOiBidWlsZENvbnN0YW50SG9sZGVyUmVmZXJlbmNlKHByb2dyYW0pLAogICAgICAnaG9sZGVycyc6IGhvbGRlckNvZGUuc3RhdGVtZW50cywKICAgICAgJ2NhbGxOYW1lJzoganMuc3RyaW5nKF9uYW1lci5maXhlZE5hbWVzLmNhbGxOYW1lRmllbGQpLAogICAgICAnc3R1Yk5hbWUnOiBqcy5zdHJpbmcoX25hbWVyLnN0dWJOYW1lRmllbGQpLAogICAgICAnYXJndW1lbnRDb3VudCc6IGpzLnN0cmluZyhfbmFtZXIuZml4ZWROYW1lcy5yZXF1aXJlZFBhcmFtZXRlckZpZWxkKSwKICAgICAgJ2RlZmF1bHRBcmd1bWVudFZhbHVlcyc6IGpzLnN0cmluZyhfbmFtZXIuZml4ZWROYW1lcy5kZWZhdWx0VmFsdWVzRmllbGQpLAogICAgICAnZGVmZXJyZWRHbG9iYWwnOiBNb2RlbEVtaXR0ZXIuZGVmZXJyZWRJbml0aWFsaXplcnNHbG9iYWwsCiAgICAgICdoYXNTb2Z0RGVmZXJyZWRDbGFzc2VzJzogcHJvZ3JhbS5oYXNTb2Z0RGVmZXJyZWRDbGFzc2VzLAogICAgICAnc29mdElkJzoganMuc3RyaW5nKHNvZnREZWZlcnJlZElkKSwKICAgICAgJ2lzVHJhY2tpbmdBbGxvY2F0aW9ucyc6IF9vcHRpb25zLmV4cGVyaW1lbnRhbFRyYWNrQWxsb2NhdGlvbnMsCiAgICAgICdwcm90b3R5cGVzJzogZW1pdFByb3RvdHlwZXMoZnJhZ21lbnQpLAogICAgICAnaW5oZXJpdGFuY2UnOiBlbWl0SW5oZXJpdGFuY2UoZnJhZ21lbnQpLAogICAgICAnYWxpYXNlcyc6IGVtaXRJbnN0YW5jZU1ldGhvZEFsaWFzZXMoZnJhZ21lbnQpLAogICAgICAndGVhck9mZnMnOiBlbWl0SW5zdGFsbFRlYXJPZmZzKGZyYWdtZW50KSwKICAgICAgJ2NvbnN0YW50cyc6IGVtaXRDb25zdGFudHMoZnJhZ21lbnQpLAogICAgICAnc3RhdGljTm9uRmluYWxGaWVsZHMnOiBlbWl0U3RhdGljTm9uRmluYWxGaWVsZHMoZnJhZ21lbnQpLAogICAgICAnbGF6eVN0YXRpY3MnOiBlbWl0TGF6aWx5SW5pdGlhbGl6ZWRTdGF0aWNzKGZyYWdtZW50KSwKICAgICAgJ2VtYmVkZGVkR2xvYmFsc1BhcnQxJzoKICAgICAgICAgIGVtaXRFbWJlZGRlZEdsb2JhbHNQYXJ0MShwcm9ncmFtLCBkZWZlcnJlZExvYWRpbmdTdGF0ZSksCiAgICAgICdlbWJlZGRlZEdsb2JhbHNQYXJ0Mic6CiAgICAgICAgICBlbWl0RW1iZWRkZWRHbG9iYWxzUGFydDIocHJvZ3JhbSwgZGVmZXJyZWRMb2FkaW5nU3RhdGUpLAogICAgICAndHlwZVJ1bGVzJzogZW1pdFR5cGVSdWxlcyhmcmFnbWVudCksCiAgICAgICduYXRpdmVTdXBwb3J0JzogcHJvZ3JhbS5uZWVkc05hdGl2ZVN1cHBvcnQKICAgICAgICAgID8gZW1pdE5hdGl2ZVN1cHBvcnQoZnJhZ21lbnQpCiAgICAgICAgICA6IG5ldyBqcy5FbXB0eVN0YXRlbWVudCgpLAogICAgICAnanNJbnRlcm9wU3VwcG9ydCc6IGpzSW50ZXJvcEFuYWx5c2lzLmJ1aWxkSnNJbnRlcm9wQm9vdHN0cmFwKAogICAgICAgICAgICAgIF9jb2RlZ2VuV29ybGQsIF9jbG9zZWRXb3JsZC5uYXRpdmVEYXRhLCBfbmFtZXIpID8/CiAgICAgICAgICBuZXcganMuRW1wdHlTdGF0ZW1lbnQoKSwKICAgICAgJ2ludm9rZU1haW4nOiBmcmFnbWVudC5pbnZva2VNYWluLAoKICAgICAgJ2NhbGwwc2VsZWN0b3InOiBqcy5xdW90ZU5hbWUoY2FsbDBOYW1lKSwKICAgICAgJ2NhbGwxc2VsZWN0b3InOiBqcy5xdW90ZU5hbWUoY2FsbDFOYW1lKSwKICAgICAgJ2NhbGwyc2VsZWN0b3InOiBqcy5xdW90ZU5hbWUoY2FsbDJOYW1lKSwKICAgIH0pOwogICAgaWYgKHByb2dyYW0uaGFzU29mdERlZmVycmVkQ2xhc3NlcykgewogICAgICByZXR1cm4gbmV3IGpzLkJsb2NrKFsKICAgICAgICBqcy5qcy5zdGF0ZW1lbnQoc29mdERlZmVycmVkQm9pbGVycGxhdGUsIHsKICAgICAgICAgICdkZWZlcnJlZEdsb2JhbCc6IE1vZGVsRW1pdHRlci5kZWZlcnJlZEluaXRpYWxpemVyc0dsb2JhbCwKICAgICAgICAgICdzb2Z0SWQnOiBqcy5zdHJpbmcoc29mdERlZmVycmVkSWQpLAogICAgICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IGRvbid0IGp1c3QgcmVmZXJlbmNlICdpbml0Jy4KICAgICAgICAgICdlbWJlZGRlZEdsb2JhbHNPYmplY3QnOiBuZXcganMuUGFyYW1ldGVyKCdpbml0JyksCiAgICAgICAgICAnc3RhdGljU3RhdGUnOiBuZXcganMuUGFyYW1ldGVyKF9uYW1lci5zdGF0aWNTdGF0ZUhvbGRlciksCiAgICAgICAgICAnaW5zdGFsbEhvbGRlcnNBc0xvY2Fscyc6CiAgICAgICAgICAgICAgZW1pdEluc3RhbGxIb2xkZXJzQXNMb2NhbHMobm9uU3RhdGljU3RhdGVIb2xkZXJzKSwKICAgICAgICAgICdwcm90b3R5cGVzJzogZW1pdFByb3RvdHlwZXMoZnJhZ21lbnQsIHNvZnREZWZlcnJlZDogdHJ1ZSksCiAgICAgICAgICAnYWxpYXNlcyc6IGVtaXRJbnN0YW5jZU1ldGhvZEFsaWFzZXMoZnJhZ21lbnQsIHNvZnREZWZlcnJlZDogdHJ1ZSksCiAgICAgICAgICAndGVhck9mZnMnOiBlbWl0SW5zdGFsbFRlYXJPZmZzKGZyYWdtZW50LCBzb2Z0RGVmZXJyZWQ6IHRydWUpLAogICAgICAgICAgJ2luaGVyaXRhbmNlJzogZW1pdEluaGVyaXRhbmNlKGZyYWdtZW50LCBzb2Z0RGVmZXJyZWQ6IHRydWUpLAogICAgICAgIH0pLAogICAgICAgIG1haW5Db2RlCiAgICAgIF0pOwogICAgfQogICAgcmV0dXJuIG1haW5Db2RlOwogIH0KCiAganMuU3RhdGVtZW50IGVtaXRJbnN0YWxsSG9sZGVyc0FzTG9jYWxzKEl0ZXJhYmxlPEhvbGRlcj4gaG9sZGVycykgewogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IGhvbGRlckluaXRzID0gW107CiAgICBpbnQgY291bnRlciA9IDA7CiAgICBmb3IgKEhvbGRlciBob2xkZXIgaW4gaG9sZGVycykgewogICAgICBob2xkZXJJbml0cy5hZGQobmV3IGpzLkV4cHJlc3Npb25TdGF0ZW1lbnQobmV3IGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24oCiAgICAgICAgICBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbihob2xkZXIubmFtZSwgYWxsb3dSZW5hbWU6IGZhbHNlKSwKICAgICAgICAgIGpzLmpzKCJob2xkZXJzTGlzdFsjXSIsIGpzLm51bWJlcihjb3VudGVyKyspKSkpKTsKICAgIH0KICAgIHJldHVybiBuZXcganMuQmxvY2soaG9sZGVySW5pdHMpOwogIH0KCiAganMuRXhwcmVzc2lvbiBlbWl0RGVmZXJyZWRGcmFnbWVudChEZWZlcnJlZEZyYWdtZW50IGZyYWdtZW50LAogICAgICBqcy5FeHByZXNzaW9uIGRlZmVycmVkVHlwZXMsIExpc3Q8SG9sZGVyPiBob2xkZXJzKSB7CiAgICBIb2xkZXJDb2RlIGhvbGRlckNvZGUgPQogICAgICAgIGVtaXRIb2xkZXJzKGhvbGRlcnMsIGZyYWdtZW50LCBpbml0aWFsaXplRW1wdHlIb2xkZXJzOiBmYWxzZSk7CgogICAgTGlzdDxIb2xkZXI+IG5vblN0YXRpY1N0YXRlSG9sZGVycyA9IGhvbGRlcnMKICAgICAgICAud2hlcmUoKEhvbGRlciBob2xkZXIpID0+ICFob2xkZXIuaXNTdGF0aWNTdGF0ZUhvbGRlcikKICAgICAgICAudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CgogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IHVwZGF0ZUhvbGRlckFzc2lnbm1lbnRzID0gW107CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblN0YXRpY1N0YXRlSG9sZGVycy5sZW5ndGg7IGkrKykgewogICAgICBIb2xkZXIgaG9sZGVyID0gbm9uU3RhdGljU3RhdGVIb2xkZXJzW2ldOwogICAgICBpZiAoaG9sZGVyQ29kZS5hY3RpdmVIb2xkZXJzLmNvbnRhaW5zKGhvbGRlcikpIHsKICAgICAgICB1cGRhdGVIb2xkZXJBc3NpZ25tZW50cy5hZGQoanMuanMuc3RhdGVtZW50KAogICAgICAgICAgICAnI2hvbGRlciA9IGh1bmtIZWxwZXJzLnVwZGF0ZUhvbGRlcihob2xkZXJzTGlzdFsjaW5kZXhdLCAjaG9sZGVyKScsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAnaW5kZXgnOiBqcy5udW1iZXIoaSksCiAgICAgICAgICAgICAgJ2hvbGRlcic6IG5ldyBqcy5WYXJpYWJsZVVzZShob2xkZXIubmFtZSkKICAgICAgICAgICAgfSkpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRPRE8oc3JhKTogQ2hhbmdlIGRlY2xhcmF0aW9uIGZvbGxvd2VkIGJ5IGFzc2lnbm1lbnRzIHRvIGRlY2xhcmF0aW9ucwogICAgICAgIC8vIHdpdGggaW5pdGlhbGl6YXRpb24uCiAgICAgICAgdXBkYXRlSG9sZGVyQXNzaWdubWVudHMuYWRkKGpzLmpzLnN0YXRlbWVudCgKICAgICAgICAgICAgJyNob2xkZXIgPSBob2xkZXJzTGlzdFsjaW5kZXhdJywgewogICAgICAgICAgJ2luZGV4JzoganMubnVtYmVyKGkpLAogICAgICAgICAgJ2hvbGRlcic6IG5ldyBqcy5WYXJpYWJsZVVzZShob2xkZXIubmFtZSkKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgY2xhc3NQcm90b3R5cGVzID0gZW1pdFByb3RvdHlwZXMoZnJhZ21lbnQsIGluY2x1ZGVDbG9zdXJlczogZmFsc2UpOwogICAgdmFyIGNsb3N1cmVQcm90b3R5cGVzID0gZW1pdFByb3RvdHlwZXMoZnJhZ21lbnQsIGluY2x1ZGVDbG9zdXJlczogdHJ1ZSk7CiAgICB2YXIgaW5oZXJpdGFuY2UgPSBlbWl0SW5oZXJpdGFuY2UoZnJhZ21lbnQpOwogICAgdmFyIG1ldGhvZEFsaWFzZXMgPSBlbWl0SW5zdGFuY2VNZXRob2RBbGlhc2VzKGZyYWdtZW50KTsKICAgIHZhciB0ZWFyT2ZmcyA9IGVtaXRJbnN0YWxsVGVhck9mZnMoZnJhZ21lbnQpOwogICAgdmFyIGNvbnN0YW50cyA9IGVtaXRDb25zdGFudHMoZnJhZ21lbnQpOwogICAgdmFyIHR5cGVSdWxlcyA9IGVtaXRUeXBlUnVsZXMoZnJhZ21lbnQpOwogICAgdmFyIHN0YXRpY05vbkZpbmFsRmllbGRzID0gZW1pdFN0YXRpY05vbkZpbmFsRmllbGRzKGZyYWdtZW50KTsKICAgIHZhciBsYXp5SW5pdGlhbGl6ZXJzID0gZW1pdExhemlseUluaXRpYWxpemVkU3RhdGljcyhmcmFnbWVudCk7CiAgICAvLyBUT0RPKGZsb2l0c2NoKTogb25seSBjYWxsIGVtaXROYXRpdmVTdXBwb3J0IGlmIHdlIG5lZWQgbmF0aXZlLgogICAgdmFyIG5hdGl2ZVN1cHBvcnQgPSBlbWl0TmF0aXZlU3VwcG9ydChmcmFnbWVudCk7CgogICAgLy8gVE9ETyhzcmEpOiBIb3cgZG8gd2UgdGVsbCBpZiBbZGVmZXJyZWRUeXBlc10gaXMgZW1wdHk/IEl0IGlzIGZpbGxlZC1pbgogICAgLy8gbGF0ZXIgdmlhIHRoZSBwcm9ncmFtIGZpbmFsaXplcnMuIFNvIHdlIHNob3VsZCBkZWZlciB0aGUgZGVjaXNpb24gb24gdGhlCiAgICAvLyBlbXB0aW5lc3Mgb2YgdGhlIGZyYWdtZW50IHVudGlsIHRoZSBmaW5hbGl6ZXJzIGhhdmUgcnVuLiAgRm9yIG5vdyB3ZSBzZWVtCiAgICAvLyB0byBnZXQgYXdheSB3aXRoIHRoZSBmYWN0IHRoYXQgdHlwZSBpbmRleGVzIGFyZSBlaXRoZXIgKDEpIG1haW4gdW5pdCBvcgogICAgLy8gKDIpIGxvY2FsIHRvIHRoZSBlbWl0dGVkIHVuaXQsIHNvIHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgYSB0eXBlIGluIGEKICAgIC8vIGRlZmVycmVkIHVuaXQgdGhhdCBpcyByZWZlcmVuY2VkIGZyb20gYW5vdGhlciBkZWZlcnJlZCB1bml0LiAgSWYgd2UgZGlkCiAgICAvLyBub3QgZW1pdCBhbnkgZnVuY3Rpb25zLCB0aGVuIHdlIHByb2JhYmx5IGRpZCBub3QgdXNlIHRoZSBzaWduYXR1cmUgdHlwZXMKICAgIC8vIGluIHRoZSBPdXRwdXRVbml0J3MgdHlwZXMsIGxlYXZpbmcgdGhlbSB1bnVzZWQgYW5kIHRyZWUtc2hha2VuLgoKICAgIGlmIChob2xkZXJDb2RlLmFjdGl2ZUhvbGRlcnMuaXNFbXB0eSAmJgogICAgICAgIGlzRW1wdHlTdGF0ZW1lbnQoY2xhc3NQcm90b3R5cGVzKSAmJgogICAgICAgIGlzRW1wdHlTdGF0ZW1lbnQoY2xvc3VyZVByb3RvdHlwZXMpICYmCiAgICAgICAgaXNFbXB0eVN0YXRlbWVudChpbmhlcml0YW5jZSkgJiYKICAgICAgICBpc0VtcHR5U3RhdGVtZW50KG1ldGhvZEFsaWFzZXMpICYmCiAgICAgICAgaXNFbXB0eVN0YXRlbWVudCh0ZWFyT2ZmcykgJiYKICAgICAgICBpc0VtcHR5U3RhdGVtZW50KGNvbnN0YW50cykgJiYKICAgICAgICBpc0VtcHR5U3RhdGVtZW50KHN0YXRpY05vbkZpbmFsRmllbGRzKSAmJgogICAgICAgIGlzRW1wdHlTdGF0ZW1lbnQobGF6eUluaXRpYWxpemVycykgJiYKICAgICAgICBpc0VtcHR5U3RhdGVtZW50KG5hdGl2ZVN1cHBvcnQpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGpzLkV4cHJlc3Npb24gY29kZSA9IGpzLmpzKGRlZmVycmVkQm9pbGVycGxhdGVEYXJ0MiwgewogICAgICAvLyBUT0RPKGZsb2l0c2NoKTogZG9uJ3QganVzdCByZWZlcmVuY2UgJ2luaXQnLgogICAgICAnZW1iZWRkZWRHbG9iYWxzT2JqZWN0JzogbmV3IGpzLlBhcmFtZXRlcignaW5pdCcpLAogICAgICAnc3RhdGljU3RhdGUnOiBuZXcganMuUGFyYW1ldGVyKF9uYW1lci5zdGF0aWNTdGF0ZUhvbGRlciksCiAgICAgICdob2xkZXJzJzogaG9sZGVyQ29kZS5zdGF0ZW1lbnRzLAogICAgICAnZGVmZXJyZWRIb2xkZXJzTGlzdCc6IG5ldyBqcy5BcnJheUluaXRpYWxpemVyKGhvbGRlckNvZGUuYWN0aXZlSG9sZGVycwogICAgICAgICAgLm1hcCgoaG9sZGVyKSA9PiBqcy5qcygiIyIsIGhvbGRlci5uYW1lKSkKICAgICAgICAgIC50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKSksCiAgICAgICd1cGRhdGVIb2xkZXJzJzogbmV3IGpzLkJsb2NrKHVwZGF0ZUhvbGRlckFzc2lnbm1lbnRzKSwKICAgICAgJ3Byb3RvdHlwZXMnOiBjbGFzc1Byb3RvdHlwZXMsCiAgICAgICdjbG9zdXJlcyc6IGNsb3N1cmVQcm90b3R5cGVzLAogICAgICAnaW5oZXJpdGFuY2UnOiBpbmhlcml0YW5jZSwKICAgICAgJ2FsaWFzZXMnOiBtZXRob2RBbGlhc2VzLAogICAgICAndGVhck9mZnMnOiB0ZWFyT2ZmcywKICAgICAgJ3R5cGVSdWxlcyc6IHR5cGVSdWxlcywKICAgICAgJ2NvbnN0YW50cyc6IGNvbnN0YW50cywKICAgICAgJ3N0YXRpY05vbkZpbmFsRmllbGRzJzogc3RhdGljTm9uRmluYWxGaWVsZHMsCiAgICAgICdsYXp5U3RhdGljcyc6IGxhenlJbml0aWFsaXplcnMsCiAgICAgICd0eXBlcyc6IGRlZmVycmVkVHlwZXMsCiAgICAgICduYXRpdmVTdXBwb3J0JzogbmF0aXZlU3VwcG9ydCwKICAgICAgJ3R5cGVzT2Zmc2V0JzogX25hbWVyLnR5cGVzT2Zmc2V0TmFtZSwKICAgIH0pOwoKICAgIGlmIChfb3B0aW9ucy5leHBlcmltZW50U3RhcnR1cEZ1bmN0aW9ucykgewogICAgICBjb2RlID0ganMuUGFyZW50aGVzZXMoY29kZSk7CiAgICB9CiAgICByZXR1cm4gY29kZTsKICB9CgogIC8vLyBFbWl0cyBhbGwgaG9sZGVycywgZXhjZXB0IGZvciB0aGUgc3RhdGljLXN0YXRlIGhvbGRlci4KICAvLy8KICAvLy8gVGhlIGVtaXR0ZWQgaG9sZGVycyBjb250YWluIGNsYXNzZXMgKG9ubHkgdGhlIGNvbnN0cnVjdG9ycykgYW5kIGFsbAogIC8vLyBzdGF0aWMgZnVuY3Rpb25zLgogIEhvbGRlckNvZGUgZW1pdEhvbGRlcnMoTGlzdDxIb2xkZXI+IGhvbGRlcnMsIEZyYWdtZW50IGZyYWdtZW50LAogICAgICB7Ym9vbCBpbml0aWFsaXplRW1wdHlIb2xkZXJzfSkgewogICAgYXNzZXJ0KGluaXRpYWxpemVFbXB0eUhvbGRlcnMgIT0gbnVsbCk7CiAgICAvLyBTa2lwIHRoZSBzdGF0aWMtc3RhdGUgaG9sZGVyIGluIHRoaXMgZnVuY3Rpb24uCiAgICBob2xkZXJzID0gaG9sZGVycwogICAgICAgIC53aGVyZSgoSG9sZGVyIGhvbGRlcikgPT4gIWhvbGRlci5pc1N0YXRpY1N0YXRlSG9sZGVyKQogICAgICAgIC50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKCiAgICBNYXA8SG9sZGVyLCBMaXN0PGpzLlByb3BlcnR5Pj4gaG9sZGVyQ29kZSA9IHt9OwoKICAgIGZvciAoSG9sZGVyIGhvbGRlciBpbiBob2xkZXJzKSB7CiAgICAgIGhvbGRlckNvZGVbaG9sZGVyXSA9IDxqcy5Qcm9wZXJ0eT5bXTsKICAgIH0KCiAgICBmb3IgKExpYnJhcnkgbGlicmFyeSBpbiBmcmFnbWVudC5saWJyYXJpZXMpIHsKICAgICAgZm9yIChTdGF0aWNNZXRob2QgbWV0aG9kIGluIGxpYnJhcnkuc3RhdGljcykgewogICAgICAgIGFzc2VydCghbWV0aG9kLmhvbGRlci5pc1N0YXRpY1N0YXRlSG9sZGVyKTsKICAgICAgICBNYXA8anMuTmFtZSwganMuRXhwcmVzc2lvbj4gcHJvcGVydHlNYXAgPSBlbWl0U3RhdGljTWV0aG9kKG1ldGhvZCk7CiAgICAgICAgcHJvcGVydHlNYXAuZm9yRWFjaCgoanMuTmFtZSBrZXksIGpzLkV4cHJlc3Npb24gdmFsdWUpIHsKICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IG5ldyBqcy5Qcm9wZXJ0eShqcy5xdW90ZU5hbWUoa2V5KSwgdmFsdWUpOwogICAgICAgICAgaG9sZGVyQ29kZVttZXRob2QuaG9sZGVyXS5hZGQocHJvcGVydHkpOwogICAgICAgICAgcmVnaXN0ZXJFbnRpdHlBc3QobWV0aG9kLmVsZW1lbnQsIHByb3BlcnR5LCBsaWJyYXJ5OiBsaWJyYXJ5LmVsZW1lbnQpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGZvciAoQ2xhc3MgY2xzIGluIGxpYnJhcnkuY2xhc3NlcykgewogICAgICAgIGFzc2VydCghY2xzLmhvbGRlci5pc1N0YXRpY1N0YXRlSG9sZGVyKTsKICAgICAgICBqcy5FeHByZXNzaW9uIGNvbnN0cnVjdG9yID0gZW1pdENvbnN0cnVjdG9yKGNscyk7CiAgICAgICAgdmFyIHByb3BlcnR5ID0gbmV3IGpzLlByb3BlcnR5KGpzLnF1b3RlTmFtZShjbHMubmFtZSksIGNvbnN0cnVjdG9yKTsKICAgICAgICByZWdpc3RlckVudGl0eUFzdChjbHMuZWxlbWVudCwgcHJvcGVydHksIGxpYnJhcnk6IGxpYnJhcnkuZWxlbWVudCk7CiAgICAgICAgaG9sZGVyQ29kZVtjbHMuaG9sZGVyXS5hZGQocHJvcGVydHkpOwogICAgICB9CiAgICB9CgogICAgTGlzdDxqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uPiBob2xkZXJJbml0aWFsaXphdGlvbnMgPSBbXTsKICAgIExpc3Q8SG9sZGVyPiBhY3RpdmVIb2xkZXJzID0gW107CgogICAgZm9yIChIb2xkZXIgaG9sZGVyIGluIGhvbGRlcnMpIHsKICAgICAgTGlzdDxqcy5Qcm9wZXJ0eT4gcHJvcGVydGllcyA9IGhvbGRlckNvZGVbaG9sZGVyXTsKICAgICAgaWYgKHByb3BlcnRpZXMuaXNFbXB0eSkgewogICAgICAgIGhvbGRlckluaXRpYWxpemF0aW9ucy5hZGQobmV3IGpzLlZhcmlhYmxlSW5pdGlhbGl6YXRpb24oCiAgICAgICAgICAgIG5ldyBqcy5WYXJpYWJsZURlY2xhcmF0aW9uKGhvbGRlci5uYW1lLCBhbGxvd1JlbmFtZTogZmFsc2UpLAogICAgICAgICAgICBpbml0aWFsaXplRW1wdHlIb2xkZXJzCiAgICAgICAgICAgICAgICA/IG5ldyBqcy5PYmplY3RJbml0aWFsaXplcihwcm9wZXJ0aWVzKQogICAgICAgICAgICAgICAgOiBudWxsKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWN0aXZlSG9sZGVycy5hZGQoaG9sZGVyKTsKICAgICAgICBob2xkZXJJbml0aWFsaXphdGlvbnMuYWRkKG5ldyBqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uKAogICAgICAgICAgICBuZXcganMuVmFyaWFibGVEZWNsYXJhdGlvbihob2xkZXIubmFtZSwgYWxsb3dSZW5hbWU6IGZhbHNlKSwKICAgICAgICAgICAgbmV3IGpzLk9iamVjdEluaXRpYWxpemVyKHByb3BlcnRpZXMpKSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBUaGUgZ2VuZXJhdGVkIGNvZGUgbG9va3MgbGlrZSB0aGlzOgogICAgLy8KICAgIC8vICAgIHsKICAgIC8vICAgICAgdmFyIEggPSB7Li4ufSwgLi4uLCBHID0gey4uLn07CiAgICAvLyAgICAgIHZhciBob2xkZXJzID0gWyBILCAuLi4sIEcgXTsgLy8gTWFpbiB1bml0IG9ubHkuCiAgICAvLyAgICB9CgogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IHN0YXRlbWVudHMgPSBbXTsKICAgIHN0YXRlbWVudHMuYWRkKG5ldyBqcy5FeHByZXNzaW9uU3RhdGVtZW50KG5ldyBqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgKICAgICAgICBob2xkZXJJbml0aWFsaXphdGlvbnMsCiAgICAgICAgaW5kZW50U3BsaXRzOiBmYWxzZSkpKTsKICAgIGlmIChpbml0aWFsaXplRW1wdHlIb2xkZXJzKSB7CiAgICAgIHN0YXRlbWVudHMuYWRkKGpzLmpzLnN0YXRlbWVudCgKICAgICAgICAgICd2YXIgaG9sZGVycyA9ICMnLAogICAgICAgICAgbmV3IGpzLkFycmF5SW5pdGlhbGl6ZXIoaG9sZGVycwogICAgICAgICAgICAgIC5tYXAoKGhvbGRlcikgPT4gbmV3IGpzLlZhcmlhYmxlVXNlKGhvbGRlci5uYW1lKSkKICAgICAgICAgICAgICAudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSkpKSk7CiAgICB9CiAgICByZXR1cm4gbmV3IEhvbGRlckNvZGUoCiAgICAgIGFjdGl2ZUhvbGRlcnM6IGFjdGl2ZUhvbGRlcnMsCiAgICAgIHN0YXRlbWVudHM6IG5ldyBqcy5CbG9jayhzdGF0ZW1lbnRzKSwKICAgICk7CiAgfQoKICAvLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgY29uc3RhbnQgaG9sZGVyLCBvciB0aGUgSlMtbGl0ZXJhbCBgbnVsbGAuCiAganMuRXhwcmVzc2lvbiBidWlsZENvbnN0YW50SG9sZGVyUmVmZXJlbmNlKFByb2dyYW0gcHJvZ3JhbSkgewogICAgSG9sZGVyIGNvbnN0YW50SG9sZGVyID0gcHJvZ3JhbS5ob2xkZXJzLmZpcnN0V2hlcmUoCiAgICAgICAgKEhvbGRlciBob2xkZXIpID0+IGhvbGRlci5pc0NvbnN0YW50c0hvbGRlciwKICAgICAgICBvckVsc2U6ICgpID0+IG51bGwpOwogICAgaWYgKGNvbnN0YW50SG9sZGVyID09IG51bGwpIHJldHVybiBuZXcganMuTGl0ZXJhbE51bGwoKTsKICAgIHJldHVybiBuZXcganMuVmFyaWFibGVVc2UoY29uc3RhbnRIb2xkZXIubmFtZSk7CiAgfQoKICAvLy8gRW1pdHMgdGhlIGdpdmVuIFttZXRob2RdLgogIC8vLwogIC8vLyBBIERhcnQgbWV0aG9kIG1pZ2h0IHJlc3VsdCBpbiBzZXZlcmFsIEphdmFTY3JpcHQgZnVuY3Rpb25zLCBpZiBpdAogIC8vLyByZXF1aXJlcyBzdHVicy4gVGhlIHJldHVybmVkIG1hcCBjb250YWlucyB0aGUgb3JpZ2luYWwgbWV0aG9kIGFuZCBhbGwKICAvLy8gdGhlIHN0dWJzIGl0IG5lZWRzLgogIE1hcDxqcy5OYW1lLCBqcy5FeHByZXNzaW9uPiBlbWl0U3RhdGljTWV0aG9kKFN0YXRpY01ldGhvZCBtZXRob2QpIHsKICAgIE1hcDxqcy5OYW1lLCBqcy5FeHByZXNzaW9uPiBqc01ldGhvZHMgPSB7fTsKCiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGluc3RhbGwgc3R1Yi1tZXRob2RzLiBUaGV5IGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGVyZQogICAgLy8gYXJlIHRlYXItb2ZmcywgaW4gd2hpY2ggY2FzZSB0aGV5IGFyZSBlbWl0dGVkIHRoZXJlLgogICAgYXNzZXJ0KCgpIHsKICAgICAgaWYgKG1ldGhvZCBpcyBTdGF0aWNEYXJ0TWV0aG9kKSB7CiAgICAgICAgcmV0dXJuIG1ldGhvZC5uZWVkc1RlYXJPZmYgfHwgbWV0aG9kLnBhcmFtZXRlclN0dWJzLmlzRW1wdHk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9KCkpOwogICAganNNZXRob2RzW21ldGhvZC5uYW1lXSA9IG1ldGhvZC5jb2RlOwoKICAgIHJldHVybiBqc01ldGhvZHM7CiAgfQoKICAvLy8gRW1pdHMgYSBjb25zdHJ1Y3RvciBmb3IgdGhlIGdpdmVuIGNsYXNzIFtjbHNdLgogIC8vLwogIC8vLyBUaGUgY29uc3RydWN0b3IgaXMgc3RhdGljYWxseSBidWlsdC4KICBqcy5FeHByZXNzaW9uIGVtaXRDb25zdHJ1Y3RvcihDbGFzcyBjbHMpIHsKICAgIGpzLk5hbWUgbmFtZSA9IGNscy5uYW1lOwogICAgLy8gSWYgdGhlIGNsYXNzIGlzIG5vdCBkaXJlY3RseSBpbnN0YW50aWF0ZWQgd2Ugb25seSBuZWVkIGl0IGZvciBpbmhlcml0YW5jZQogICAgLy8gb3IgUlRJLiBJbiBlaXRoZXIgY2FzZSB3ZSBkb24ndCBuZWVkIGl0cyBmaWVsZHMuCiAgICBpZiAoY2xzLmlzTmF0aXZlIHx8ICFjbHMuaXNEaXJlY3RseUluc3RhbnRpYXRlZCkgewogICAgICByZXR1cm4ganMuanMoJ2Z1bmN0aW9uICMoKSB7IH0nLCBuYW1lKTsKICAgIH0KCiAgICB2YXIgc3RhdGVtZW50cyA9IDxqcy5TdGF0ZW1lbnQ+W107CiAgICB2YXIgcGFyYW1ldGVycyA9IDxqcy5QYXJhbWV0ZXI+W107CiAgICB2YXIgdGhpc1JlZjsKCiAgICBpZiAoY2xzLmlzU29mdERlZmVycmVkKSB7CiAgICAgIHN0YXRlbWVudHMuYWRkKGpzLmpzLnN0YXRlbWVudCgnc29mdERlZih0aGlzKScpKTsKICAgIH0gZWxzZSBpZiAoX29wdGlvbnMuZXhwZXJpbWVudGFsVHJhY2tBbGxvY2F0aW9ucykgewogICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSA9CiAgICAgICAgICAiJHtjbHMuZWxlbWVudC5saWJyYXJ5LmNhbm9uaWNhbFVyaX06JHtjbHMuZWxlbWVudC5uYW1lfSI7CiAgICAgIHN0YXRlbWVudHMuYWRkKGpzLmpzLnN0YXRlbWVudCgnYWxsb2NhdGlvbnNbIiRxdWFsaWZpZWROYW1lIl0gPSB0cnVlJykpOwogICAgfQoKICAgIExpc3Q8RmllbGQ+IGVtaXR0ZWRGaWVsZHMgPSBjbHMuZmllbGRzLndoZXJlKChmKSA9PiAhZi5pc0VsaWRlZCkudG9MaXN0KCk7CgogICAgLy8gSWYgdGhlcmUgYXJlIG1hbnkgcmVmZXJlbmNlcyB0byBgdGhpc2AsIGNhY2hlIGl0IGluIGEgbG9jYWwuCiAgICBpZiAoZW1pdHRlZEZpZWxkcy5sZW5ndGggKyAoY2xzLmhhc1J0aUZpZWxkID8gMSA6IDApID49IDQpIHsKICAgICAgLy8gUGFyYW1ldGVycyBhcmUgbmFtZWQgdDAsIHQxLCBldGMsIHNvICdfJyB3aWxsIG5vdCBjb25mbGljdC4gRm9yY2luZyAnXycKICAgICAgLy8gaW4gbWluaWZpZWQgbW9kZSB3b3JrcyBiZWNhdXNlIG5vIHBhcmFtZXRlciBvciBsb2NhbCBhbHNvIG1pbmlmaWVzIHRvCiAgICAgIC8vICdfJyAodGhlIG1pbmlmaWVyIGRvZXNuJ3Qga25vdyAnXycgaXMgYXZhaWxhYmxlKS4KICAgICAganMuTmFtZSB1bmRlcnNjb3JlID0gbmV3IFN0cmluZ0JhY2tlZE5hbWUoJ18nKTsKICAgICAgc3RhdGVtZW50cy5hZGQoanMuanMuc3RhdGVtZW50KCd2YXIgIyA9IHRoaXM7JywgdW5kZXJzY29yZSkpOwogICAgICB0aGlzUmVmID0gdW5kZXJzY29yZTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXNSZWYgPSBqcy5qcygndGhpcycpOwogICAgfQoKICAgIC8vIENoYWluIGFzc2lnbm1lbnRzIG9mIHRoZSBzYW1lIHZhbHVlLCBlLmcuIGB0aGlzLmIgPSB0aGlzLmEgPSBudWxsYC4KICAgIC8vIExpbWl0IGNoYWluIGxlbmd0aCBzbyB0aGF0IHRoZSBKYXZhU2NyaXB0IHBhcnNlciBoYXMgYm91bmRlZCByZWN1cnNpb24uCiAgICBjb25zdCBpbnQgbWF4Q2hhaW5MZW5ndGggPSAzMDsKICAgIGpzLkV4cHJlc3Npb24gYXNzaWdubWVudCA9IG51bGw7CiAgICBpbnQgY2hhaW5MZW5ndGggPSAwOwogICAgQ29uc3RhbnRWYWx1ZSBwcmV2aW91c0NvbnN0YW50ID0gbnVsbDsKICAgIHZvaWQgZmx1c2hBc3NpZ25tZW50KCkgewogICAgICBpZiAoYXNzaWdubWVudCAhPSBudWxsKSB7CiAgICAgICAgc3RhdGVtZW50cy5hZGQoanMuanMuc3RhdGVtZW50KCcjOycsIGFzc2lnbm1lbnQpKTsKICAgICAgICBhc3NpZ25tZW50ID0gbnVsbDsKICAgICAgICBjaGFpbkxlbmd0aCA9IDA7CiAgICAgICAgcHJldmlvdXNDb25zdGFudCA9IG51bGw7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKEZpZWxkIGZpZWxkIGluIGVtaXR0ZWRGaWVsZHMpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IGZpZWxkLmluaXRpYWxpemVySW5BbGxvY2F0b3I7CiAgICAgIGlmIChjb25zdGFudCAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNvbnN0YW50ID09IHByZXZpb3VzQ29uc3RhbnQgJiYgY2hhaW5MZW5ndGggPCBtYXhDaGFpbkxlbmd0aCkgewogICAgICAgICAgYXNzaWdubWVudCA9IGpzLmpzKCcjLiMgPSAjJywgW3RoaXNSZWYsIGZpZWxkLm5hbWUsIGFzc2lnbm1lbnRdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZmx1c2hBc3NpZ25tZW50KCk7CiAgICAgICAgICBhc3NpZ25tZW50ID0ganMuanMoJyMuIyA9ICMnLCBbCiAgICAgICAgICAgIHRoaXNSZWYsCiAgICAgICAgICAgIGZpZWxkLm5hbWUsCiAgICAgICAgICAgIF9jb25zdGFudEVtaXR0ZXIuZ2VuZXJhdGUoY29uc3RhbnQpLAogICAgICAgICAgXSk7CiAgICAgICAgfQogICAgICAgICsrY2hhaW5MZW5ndGg7CiAgICAgICAgcHJldmlvdXNDb25zdGFudCA9IGNvbnN0YW50OwogICAgICB9IGVsc2UgewogICAgICAgIGZsdXNoQXNzaWdubWVudCgpOwogICAgICAgIGpzLlBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcganMuUGFyYW1ldGVyKCd0JHtwYXJhbWV0ZXJzLmxlbmd0aH0nKTsKICAgICAgICBwYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOwogICAgICAgIHN0YXRlbWVudHMuYWRkKAogICAgICAgICAgICBqcy5qcy5zdGF0ZW1lbnQoJyMuIyA9ICMnLCBbdGhpc1JlZiwgZmllbGQubmFtZSwgcGFyYW1ldGVyLm5hbWVdKSk7CiAgICAgIH0KICAgIH0KICAgIGZsdXNoQXNzaWdubWVudCgpOwoKICAgIGlmIChjbHMuaGFzUnRpRmllbGQpIHsKICAgICAganMuUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBqcy5QYXJhbWV0ZXIoJ3Qke3BhcmFtZXRlcnMubGVuZ3RofScpOwogICAgICBwYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOwogICAgICBzdGF0ZW1lbnRzLmFkZChqcy5qcy5zdGF0ZW1lbnQoCiAgICAgICAgICAnIy4jID0gIycsIFt0aGlzUmVmLCBfbmFtZXIucnRpRmllbGRKc05hbWUsIHBhcmFtZXRlci5uYW1lXSkpOwogICAgfQoKICAgIHJldHVybiBqcy5qcygnZnVuY3Rpb24gIygjKSB7ICMgfScsIFtuYW1lLCBwYXJhbWV0ZXJzLCBzdGF0ZW1lbnRzXSk7CiAgfQoKICAvLy8gRW1pdHMgdGhlIHByb3RvdHlwZS1zZWN0aW9uIG9mIHRoZSBmcmFnbWVudC4KICAvLy8KICAvLy8gVGhpcyBzZWN0aW9uIHVwZGF0ZXMgdGhlIHByb3RvdHlwZS1wcm9wZXJ0eSBvZiBhbGwgY29uc3RydWN0b3JzIGluIHRoZQogIC8vLyBnbG9iYWwgaG9sZGVycy4KICAvLy8KICAvLy8gW3NvZnREZWZlcnJlZF0gZGV0ZXJtaW5lIHdoZXRoZXIgcHJvdG90eXBlcyBmb3Igc29mdCBkZWZlcnJlZCBjbGFzc2VzIGFyZQogIC8vLyBnZW5lcmF0ZWQuCiAgLy8vCiAgLy8vIElmIFtpbmNsdWRlQ2xvc3VyZXNdIGlzIGB0cnVlYCBvbmx5IHByb3RvdHlwZXMgZm9yIGNsb3N1cmUgY2xhc3NlcyBhcmUKICAvLy8gZ2VuZXJhdGVkLCBpZiBbaW5jbHVkZUNsb3N1cmVzXSBpcyBgZmFsc2VgIG9ubHkgcHJvdG90eXBlcyBmb3Igbm9uLWNsb3N1cmUKICAvLy8gY2xhc3NlcyBhcmUgZ2VuZXJhdGVkLiBPdGhlcndpc2UgcHJvdG90eXBlcyBmb3IgYWxsIGNsYXNzZXMgYXJlIGdlbmVyYXRlZC4KICBqcy5TdGF0ZW1lbnQgZW1pdFByb3RvdHlwZXMoRnJhZ21lbnQgZnJhZ21lbnQsCiAgICAgIHtib29sIHNvZnREZWZlcnJlZCA9IGZhbHNlLCBib29sIGluY2x1ZGVDbG9zdXJlc30pIHsKICAgIExpc3Q8anMuU3RhdGVtZW50PiBhc3NpZ25tZW50cyA9IGZyYWdtZW50LmxpYnJhcmllcwogICAgICAgIC5leHBhbmQoKExpYnJhcnkgbGlicmFyeSkgPT4gbGlicmFyeS5jbGFzc2VzKQogICAgICAgIC53aGVyZSgoQ2xhc3MgY2xzKSB7CiAgICAgIGlmIChpbmNsdWRlQ2xvc3VyZXMgIT0gbnVsbCkgewogICAgICAgIGlmIChjbHMuZWxlbWVudC5pc0Nsb3N1cmUgIT0gaW5jbHVkZUNsb3N1cmVzKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjbHMuaXNTb2Z0RGVmZXJyZWQgPT0gc29mdERlZmVycmVkOwogICAgfSkubWFwKChDbGFzcyBjbHMpIHsKICAgICAgdmFyIHByb3RvID0ganMuanMuc3RhdGVtZW50KAogICAgICAgICAgJyMucHJvdG90eXBlID0gIzsnLCBbY2xhc3NSZWZlcmVuY2UoY2xzKSwgZW1pdFByb3RvdHlwZShjbHMpXSk7CiAgICAgIENsYXNzRW50aXR5IGVsZW1lbnQgPSBjbHMuZWxlbWVudDsKICAgICAgcmVnaXN0ZXJFbnRpdHlBc3QoZWxlbWVudCwgcHJvdG8sIGxpYnJhcnk6IGVsZW1lbnQubGlicmFyeSk7CiAgICAgIHJldHVybiBwcm90bzsKICAgIH0pLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwoKICAgIHJldHVybiBuZXcganMuQmxvY2soYXNzaWdubWVudHMpOwogIH0KCiAgLy8vIEVtaXRzIHRoZSBwcm90b3R5cGUgb2YgdGhlIGdpdmVuIGNsYXNzIFtjbHNdLgogIC8vLwogIC8vLyBUaGUgcHJvdG90eXBlIGlzIGdlbmVyYXRlZCBhcyBvYmplY3QgbGl0ZXJhbC4gSW5oZXJpdGFuY2UgaXMgaWdub3JlZC4KICAvLy8KICAvLy8gVGhlIHByb3RvdHlwZSBhbHNvIGluY2x1ZGVzIHRoZSBgaXMtcHJvcGVydHlgIHRoYXQgZXZlcnkgY2xhc3MgbXVzdCBoYXZlLgogIC8vIFRPRE8oZmxvaXRzY2gpOiB3ZSBjb3VsZCBhdm9pZCB0aGF0IHByb3BlcnR5IGlmIHdlIGtuZXcgdGhhdCBpdCB3YXNuJ3QKICAvLyAgICBuZWVkZWQuCiAganMuRXhwcmVzc2lvbiBlbWl0UHJvdG90eXBlKENsYXNzIGNscykgewogICAgSXRlcmFibGU8TWV0aG9kPiBtZXRob2RzID0gY2xzLm1ldGhvZHM7CiAgICBJdGVyYWJsZTxNZXRob2Q+IGNoZWNrZWRTZXR0ZXJzID0gY2xzLmNoZWNrZWRTZXR0ZXJzOwogICAgSXRlcmFibGU8TWV0aG9kPiBpc0NoZWNrcyA9IGNscy5pc0NoZWNrczsKICAgIEl0ZXJhYmxlPE1ldGhvZD4gY2FsbFN0dWJzID0gY2xzLmNhbGxTdHViczsKICAgIEl0ZXJhYmxlPE1ldGhvZD4gbm9TdWNoTWV0aG9kU3R1YnMgPSBjbHMubm9TdWNoTWV0aG9kU3R1YnM7CiAgICBJdGVyYWJsZTxNZXRob2Q+IGdldHRlcnNTZXR0ZXJzID0gZ2VuZXJhdGVHZXR0ZXJzU2V0dGVycyhjbHMpOwogICAgSXRlcmFibGU8TWV0aG9kPiBhbGxNZXRob2RzID0gWwogICAgICBtZXRob2RzLAogICAgICBjaGVja2VkU2V0dGVycywKICAgICAgaXNDaGVja3MsCiAgICAgIGNhbGxTdHVicywKICAgICAgbm9TdWNoTWV0aG9kU3R1YnMsCiAgICAgIGdldHRlcnNTZXR0ZXJzCiAgICBdLmV4cGFuZCgoeCkgPT4geCk7CgogICAgTGlzdDxqcy5Qcm9wZXJ0eT4gcHJvcGVydGllcyA9IFtdOwoKICAgIGlmIChjbHMuc3VwZXJjbGFzcyA9PSBudWxsKSB7CiAgICAgIC8vIFRPRE8oc3JhKTogV2hhdCBpcyB0aGlzIGRvaW5nPyBEb2N1bWVudCBvciByZW1vdmUuCiAgICAgIHByb3BlcnRpZXMKICAgICAgICAgIC5hZGQoanMuUHJvcGVydHkoanMuc3RyaW5nKCJjb25zdHJ1Y3RvciIpLCBjbGFzc1JlZmVyZW5jZShjbHMpKSk7CiAgICAgIHByb3BlcnRpZXMuYWRkKGpzLlByb3BlcnR5KF9uYW1lci5vcGVyYXRvcklzKGNscy5lbGVtZW50KSwganMubnVtYmVyKDEpKSk7CiAgICB9CgogICAgYWxsTWV0aG9kcy5mb3JFYWNoKChNZXRob2QgbWV0aG9kKSB7CiAgICAgIGVtaXRJbnN0YW5jZU1ldGhvZChtZXRob2QpCiAgICAgICAgICAuZm9yRWFjaCgoanMuRXhwcmVzc2lvbiBuYW1lLCBqcy5FeHByZXNzaW9uIGNvZGUpIHsKICAgICAgICB2YXIgcHJvcCA9IGpzLlByb3BlcnR5KG5hbWUsIGNvZGUpOwogICAgICAgIHJlZ2lzdGVyRW50aXR5QXN0KG1ldGhvZC5lbGVtZW50LCBwcm9wKTsKICAgICAgICBwcm9wZXJ0aWVzLmFkZChwcm9wKTsKICAgICAgfSk7CiAgICB9KTsKCiAgICBpZiAoY2xzLmlzQ2xvc3VyZUJhc2VDbGFzcykgewogICAgICAvLyBDbG9zdXJlcyBleHRlbmQgYSBjb21tb24gYmFzZSBjbGFzcywgc28gd2UgY2FuIHB1dCBwcm9wZXJ0aWVzIG9uIHRoZQogICAgICAvLyBwcm90b3R5cGUgZm9yIGNvbW1vbiB2YWx1ZXMuCgogICAgICAvLyBDbG9zdXJlcyB0YWtpbmcgZXhhY3RseSBvbmUgYXJndW1lbnQgYXJlIGNvbW1vbi4KICAgICAgcHJvcGVydGllcy5hZGQoanMuUHJvcGVydHkoanMuc3RyaW5nKF9uYW1lci5maXhlZE5hbWVzLmNhbGxDYXRjaEFsbE5hbWUpLAogICAgICAgICAganMucXVvdGVOYW1lKGNhbGwxTmFtZSkpKTsKICAgICAgcHJvcGVydGllcy5hZGQoanMuUHJvcGVydHkoCiAgICAgICAgICBqcy5zdHJpbmcoX25hbWVyLmZpeGVkTmFtZXMucmVxdWlyZWRQYXJhbWV0ZXJGaWVsZCksIGpzLm51bWJlcigxKSkpOwoKICAgICAgLy8gTW9zdCBjbG9zdXJlcyBoYXZlIG5vIG9wdGlvbmFsIGFyZ3VtZW50cy4KICAgICAgcHJvcGVydGllcy5hZGQoanMuUHJvcGVydHkoCiAgICAgICAgICBqcy5zdHJpbmcoX25hbWVyLmZpeGVkTmFtZXMuZGVmYXVsdFZhbHVlc0ZpZWxkKSwKICAgICAgICAgIG5ldyBqcy5MaXRlcmFsTnVsbCgpKSk7CiAgICB9CgogICAgcmV0dXJuIG5ldyBqcy5PYmplY3RJbml0aWFsaXplcihwcm9wZXJ0aWVzKTsKICB9CgogIC8vLyBHZW5lcmF0ZXMgYSBnZXR0ZXIgZm9yIHRoZSBnaXZlbiBbZmllbGRdLgogIE1ldGhvZCBnZW5lcmF0ZUdldHRlcihGaWVsZCBmaWVsZCkgewogICAgYXNzZXJ0KGZpZWxkLm5lZWRzR2V0dGVyKTsKCiAgICBqcy5FeHByZXNzaW9uIGNvZGU7CiAgICBpZiAoZmllbGQuaXNFbGlkZWQpIHsKICAgICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudFZhbHVlID0gZmllbGQuY29uc3RhbnRWYWx1ZTsKICAgICAgYXNzZXJ0KAogICAgICAgICAgY29uc3RhbnRWYWx1ZSAhPSBudWxsLCAiTm8gY29uc3RhbnQgdmFsdWUgZm9yIGVsaWRlZCBmaWVsZDogJGZpZWxkIik7CiAgICAgIGlmIChjb25zdGFudFZhbHVlID09IG51bGwpIHsKICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBvY2N1ciBiZWNhdXNlIGNvZGVnZW4gbWVtYmVyIHVzYWdlIGlzIG5vdyBsaW1pdGVkCiAgICAgICAgLy8gYnkgY2xvc2VkIHdvcmxkIG1lbWJlciB1c2FnZS4gSW4gdGhlIGNhc2Ugd2UndmUgbWlzc2VkIGEgc3BvdCB3ZQogICAgICAgIC8vIGNhdXRpb3VzbHkgZ2VuZXJhdGUgYSBudWxsIGNvbnN0YW50LgogICAgICAgIGNvbnN0YW50VmFsdWUgPSBuZXcgTnVsbENvbnN0YW50VmFsdWUoKTsKICAgICAgfQogICAgICBjb2RlID0ganMuanMoCiAgICAgICAgICAiZnVuY3Rpb24oKSB7IHJldHVybiAjOyB9IiwgZ2VuZXJhdGVDb25zdGFudFJlZmVyZW5jZShjb25zdGFudFZhbHVlKSk7CiAgICB9IGVsc2UgewogICAgICBTdHJpbmcgdGVtcGxhdGU7CiAgICAgIGlmIChmaWVsZC5uZWVkc0ludGVyY2VwdGVkR2V0dGVyT25SZWNlaXZlcikgewogICAgICAgIHRlbXBsYXRlID0gImZ1bmN0aW9uKHJlY2VpdmVyKSB7IHJldHVybiByZWNlaXZlclsjXTsgfSI7CiAgICAgIH0gZWxzZSBpZiAoZmllbGQubmVlZHNJbnRlcmNlcHRlZEdldHRlck9uVGhpcykgewogICAgICAgIHRlbXBsYXRlID0gImZ1bmN0aW9uKHJlY2VpdmVyKSB7IHJldHVybiB0aGlzWyNdOyB9IjsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoIWZpZWxkLm5lZWRzSW50ZXJjZXB0ZWRHZXR0ZXIpOwogICAgICAgIHRlbXBsYXRlID0gImZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpc1sjXTsgfSI7CiAgICAgIH0KICAgICAganMuRXhwcmVzc2lvbiBmaWVsZE5hbWUgPSBqcy5xdW90ZU5hbWUoZmllbGQubmFtZSk7CiAgICAgIGNvZGUgPSBqcy5qcyh0ZW1wbGF0ZSwgZmllbGROYW1lKTsKICAgIH0KICAgIGpzLk5hbWUgZ2V0dGVyTmFtZSA9IF9uYW1lci5kZXJpdmVHZXR0ZXJOYW1lKGZpZWxkLmFjY2Vzc29yTmFtZSk7CiAgICByZXR1cm4gbmV3IFN0dWJNZXRob2QoZ2V0dGVyTmFtZSwgY29kZSk7CiAgfQoKICAvLy8gR2VuZXJhdGVzIGEgc2V0dGVyIGZvciB0aGUgZ2l2ZW4gW2ZpZWxkXS4KICBNZXRob2QgZ2VuZXJhdGVTZXR0ZXIoRmllbGQgZmllbGQpIHsKICAgIGFzc2VydChmaWVsZC5uZWVkc1VuY2hlY2tlZFNldHRlcik7CgogICAgU3RyaW5nIHRlbXBsYXRlOwogICAganMuRXhwcmVzc2lvbiBjb2RlOwogICAgaWYgKGZpZWxkLmlzRWxpZGVkKSB7CiAgICAgIGNvZGUgPSBqcy5qcygiZnVuY3Rpb24oKSB7IH0iKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChmaWVsZC5uZWVkc0ludGVyY2VwdGVkU2V0dGVyT25SZWNlaXZlcikgewogICAgICAgIHRlbXBsYXRlID0gImZ1bmN0aW9uKHJlY2VpdmVyLCB2YWwpIHsgcmV0dXJuIHJlY2VpdmVyWyNdID0gdmFsOyB9IjsKICAgICAgfSBlbHNlIGlmIChmaWVsZC5uZWVkc0ludGVyY2VwdGVkU2V0dGVyT25UaGlzKSB7CiAgICAgICAgdGVtcGxhdGUgPSAiZnVuY3Rpb24ocmVjZWl2ZXIsIHZhbCkgeyByZXR1cm4gdGhpc1sjXSA9IHZhbDsgfSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KCFmaWVsZC5uZWVkc0ludGVyY2VwdGVkU2V0dGVyKTsKICAgICAgICB0ZW1wbGF0ZSA9ICJmdW5jdGlvbih2YWwpIHsgcmV0dXJuIHRoaXNbI10gPSB2YWw7IH0iOwogICAgICB9CiAgICAgIGpzLkV4cHJlc3Npb24gZmllbGROYW1lID0ganMucXVvdGVOYW1lKGZpZWxkLm5hbWUpOwogICAgICBjb2RlID0ganMuanModGVtcGxhdGUsIGZpZWxkTmFtZSk7CiAgICB9CgogICAganMuTmFtZSBzZXR0ZXJOYW1lID0gX25hbWVyLmRlcml2ZVNldHRlck5hbWUoZmllbGQuYWNjZXNzb3JOYW1lKTsKICAgIHJldHVybiBuZXcgU3R1Yk1ldGhvZChzZXR0ZXJOYW1lLCBjb2RlKTsKICB9CgogIC8vLyBHZW5lcmF0ZXMgYWxsIGdldHRlcnMgYW5kIHNldHRlcnMgdGhlIGdpdmVuIGNsYXNzIFtjbHNdIG5lZWRzLgogIEl0ZXJhYmxlPE1ldGhvZD4gZ2VuZXJhdGVHZXR0ZXJzU2V0dGVycyhDbGFzcyBjbHMpIHsKICAgIEl0ZXJhYmxlPE1ldGhvZD4gZ2V0dGVycyA9IGNscy5maWVsZHMKICAgICAgICAud2hlcmUoKEZpZWxkIGZpZWxkKSA9PiBmaWVsZC5uZWVkc0dldHRlcikKICAgICAgICAubWFwKGdlbmVyYXRlR2V0dGVyKTsKCiAgICBJdGVyYWJsZTxNZXRob2Q+IHNldHRlcnMgPSBjbHMuZmllbGRzCiAgICAgICAgLndoZXJlKChGaWVsZCBmaWVsZCkgPT4gZmllbGQubmVlZHNVbmNoZWNrZWRTZXR0ZXIpCiAgICAgICAgLm1hcChnZW5lcmF0ZVNldHRlcik7CgogICAgcmV0dXJuIFtnZXR0ZXJzLCBzZXR0ZXJzXS5leHBhbmQoKHgpID0+IHgpOwogIH0KCiAgLy8vIEVtaXRzIHRoZSBnaXZlbiBpbnN0YW5jZSBbbWV0aG9kXS4KICAvLy8KICAvLy8gVGhlIGdpdmVuIG1ldGhvZCBtYXkgYmUgYSBzdHViLW1ldGhvZCAoZm9yIGV4YW1wbGUgZm9yIGlzLWNoZWNrcykuCiAgLy8vCiAgLy8vIElmIGl0IGlzIGEgRGFydC1tZXRob2QsIGFsbCBuZWNlc3Nhcnkgc3R1Yi1tZXRob2RzIGFyZSBlbWl0dGVkLCB0b28uIEluCiAgLy8vIHRoYXQgY2FzZSB0aGUgcmV0dXJuZWQgbWFwIGNvbnRhaW5zIG1vcmUgdGhhbiBqdXN0IG9uZSBlbnRyeS4KICAvLy8KICAvLy8gSWYgdGhlIG1ldGhvZCBpcyBhIGNsb3N1cmUgY2FsbC1tZXRob2QsIGFsc28gcmV0dXJucyB0aGUgbmVjZXNzYXJ5CiAgLy8vIHByb3BlcnRpZXMgaW4gY2FzZSB0aGUgY2xvc3VyZSBjYW4gYmUgYXBwbGllZC4KICBNYXA8anMuRXhwcmVzc2lvbiwganMuRXhwcmVzc2lvbj4gZW1pdEluc3RhbmNlTWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKICAgIHZhciBwcm9wZXJ0aWVzID0gPGpzLkV4cHJlc3Npb24sIGpzLkV4cHJlc3Npb24+e307CgogICAgcHJvcGVydGllc1ttZXRob2QubmFtZV0gPSBtZXRob2QuY29kZTsKICAgIGlmIChtZXRob2QgaXMgSW5zdGFuY2VNZXRob2QpIHsKICAgICAgZm9yIChQYXJhbWV0ZXJTdHViTWV0aG9kIHN0dWJNZXRob2QgaW4gbWV0aG9kLnBhcmFtZXRlclN0dWJzKSB7CiAgICAgICAgcHJvcGVydGllc1tzdHViTWV0aG9kLm5hbWVdID0gc3R1Yk1ldGhvZC5jb2RlOwogICAgICB9CgogICAgICBpZiAobWV0aG9kLmlzQ2xvc3VyZUNhbGxNZXRob2QgJiYgbWV0aG9kLmNhbkJlQXBwbGllZCkgewogICAgICAgIC8vIFRPRE8oc3JhKTogV2Ugc2hvdWxkIGFsc28gYWRkIHRoZXNlIHByb3BlcnRpZXMgZm9yIHRoZSB1c2VyLWRlZmluZWQKICAgICAgICAvLyBgY2FsbGAgbWV0aG9kIG9uIGNsYXNzZXMuIEZ1bmN0aW9uLmFwcGx5IGlzIGN1cnJlbnRseSBicm9rZW4gZm9yCiAgICAgICAgLy8gY29tcGxleCBjYXNlcy4gW2ZvcmNlQWRkXSBtaWdodCBiZSB0cnVlIHdoZW4gdGhpcyBpcyBmaXhlZC4KICAgICAgICBib29sIGZvcmNlQWRkID0gIW1ldGhvZC5pc0Nsb3N1cmVDYWxsTWV0aG9kOwoKICAgICAgICAvLyBDb21tb24gY2FzZSBvZiAiY2FsbCoiOiAiY2FsbCQxIiBpcyBzdG9yZWQgb24gdGhlIENsb3N1cmUgY2xhc3MuCiAgICAgICAgaWYgKG1ldGhvZC5hcHBseUluZGV4ICE9IDAgfHwKICAgICAgICAgICAgbWV0aG9kLnBhcmFtZXRlclN0dWJzLmlzTm90RW1wdHkgfHwKICAgICAgICAgICAgbWV0aG9kLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgIT0gMSB8fAogICAgICAgICAgICBmb3JjZUFkZCkgewogICAgICAgICAganMuTmFtZSBhcHBseU5hbWUgPSBtZXRob2QuYXBwbHlJbmRleCA9PSAwCiAgICAgICAgICAgICAgPyBtZXRob2QubmFtZQogICAgICAgICAgICAgIDogbWV0aG9kLnBhcmFtZXRlclN0dWJzW21ldGhvZC5hcHBseUluZGV4IC0gMV0ubmFtZTsKICAgICAgICAgIHByb3BlcnRpZXNbanMuc3RyaW5nKF9uYW1lci5maXhlZE5hbWVzLmNhbGxDYXRjaEFsbE5hbWUpXSA9CiAgICAgICAgICAgICAganMucXVvdGVOYW1lKGFwcGx5TmFtZSk7CiAgICAgICAgfQogICAgICAgIC8vIENvbW1vbiBjYXNlIG9mICcxJyBpcyBzdG9yZWQgb24gdGhlIENsb3N1cmUgY2xhc3MuCiAgICAgICAgaWYgKG1ldGhvZC5yZXF1aXJlZFBhcmFtZXRlckNvdW50ICE9IDEgfHwgZm9yY2VBZGQpIHsKICAgICAgICAgIHByb3BlcnRpZXNbanMuc3RyaW5nKF9uYW1lci5maXhlZE5hbWVzLnJlcXVpcmVkUGFyYW1ldGVyRmllbGQpXSA9CiAgICAgICAgICAgICAganMubnVtYmVyKG1ldGhvZC5yZXF1aXJlZFBhcmFtZXRlckNvdW50KTsKICAgICAgICB9CgogICAgICAgIGpzLkV4cHJlc3Npb24gZGVmYXVsdFZhbHVlcyA9CiAgICAgICAgICAgIF9lbmNvZGVPcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMobWV0aG9kKTsKICAgICAgICAvLyBEZWZhdWx0IHZhbHVlcyBwcm9wZXJ0eSBvZiBgbnVsbGAgaXMgc3RvcmVkIG9uIHRoZSBjb21tb24gSlMKICAgICAgICAvLyBzdXBlcmNsYXNzLgogICAgICAgIGlmIChkZWZhdWx0VmFsdWVzIGlzISBqcy5MaXRlcmFsTnVsbCB8fCBmb3JjZUFkZCkgewogICAgICAgICAgcHJvcGVydGllc1tqcy5zdHJpbmcoX25hbWVyLmZpeGVkTmFtZXMuZGVmYXVsdFZhbHVlc0ZpZWxkKV0gPQogICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZXM7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgfQoKICAvLy8gRW1pdHMgdGhlIGluaGVyaXRhbmNlIGJsb2NrIG9mIHRoZSBmcmFnbWVudC4KICAvLy8KICAvLy8gSW4gdGhpcyBzZWN0aW9uIHByb3RvdHlwZSBjaGFpbnMgYXJlIHVwZGF0ZWQgYW5kIG1peGluIGZ1bmN0aW9ucyBhcmUKICAvLy8gY29waWVkLgogIGpzLlN0YXRlbWVudCBlbWl0SW5oZXJpdGFuY2UoRnJhZ21lbnQgZnJhZ21lbnQsIHtib29sIHNvZnREZWZlcnJlZCA9IGZhbHNlfSkgewogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IGluaGVyaXRDYWxscyA9IFtdOwogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IG1peGluQ2FsbHMgPSBbXTsKICAgIC8vIGxvY2FsIGNhY2hlcyBvZiBmdW5jdGlvbnMgdG8gYWxsb3cgbWluaWZhY3Rpb24gb2YgZnVuY3Rpb24gbmFtZSBpbiBjYWxsLgogICAgTG9jYWxBbGlhc2VzIGxvY2FscyA9IExvY2FsQWxpYXNlcygpOwoKICAgIFNldDxDbGFzcz4gY2xhc3Nlc0luRnJhZ21lbnQgPSBTZXQoKTsKICAgIGZvciAoTGlicmFyeSBsaWJyYXJ5IGluIGZyYWdtZW50LmxpYnJhcmllcykgewogICAgICBjbGFzc2VzSW5GcmFnbWVudC5hZGRBbGwobGlicmFyeS5jbGFzc2VzCiAgICAgICAgICAud2hlcmUoKChDbGFzcyBjbHMpID0+IGNscy5pc1NvZnREZWZlcnJlZCA9PSBzb2Z0RGVmZXJyZWQpKSk7CiAgICB9CgogICAgTWFwPENsYXNzLCBMaXN0PENsYXNzPj4gc3ViY2xhc3NlcyA9IHt9OwogICAgU2V0PENsYXNzPiBzZWVuID0gU2V0KCk7CgogICAgdm9pZCBjb2xsZWN0KGNscykgewogICAgICBpZiAoY2xzID09IG51bGwgfHwgc2Vlbi5jb250YWlucyhjbHMpKSByZXR1cm47CgogICAgICBDbGFzcyBzdXBlcmNsYXNzID0gY2xzLnN1cGVyY2xhc3M7CiAgICAgIGlmIChjbGFzc2VzSW5GcmFnbWVudC5jb250YWlucyhzdXBlcmNsYXNzKSkgewogICAgICAgIGNvbGxlY3Qoc3VwZXJjbGFzcyk7CiAgICAgIH0KCiAgICAgIHN1YmNsYXNzZXMucHV0SWZBYnNlbnQoc3VwZXJjbGFzcywgKCkgPT4gPENsYXNzPltdKS5hZGQoY2xzKTsKCiAgICAgIHNlZW4uYWRkKGNscyk7CiAgICB9CgogICAgZm9yIChMaWJyYXJ5IGxpYnJhcnkgaW4gZnJhZ21lbnQubGlicmFyaWVzKSB7CiAgICAgIGZvciAoQ2xhc3MgY2xzIGluIGxpYnJhcnkuY2xhc3NlcykgewogICAgICAgIGlmIChjbHMuaXNTb2Z0RGVmZXJyZWQgIT0gc29mdERlZmVycmVkKSBjb250aW51ZTsKICAgICAgICBjb2xsZWN0KGNscyk7CiAgICAgICAgaWYgKGNscy5taXhpbkNsYXNzICE9IG51bGwpIHsKICAgICAgICAgIGpzLlN0YXRlbWVudCBzdGF0ZW1lbnQgPSBqcy5qcy5zdGF0ZW1lbnQoJyMoIywgIyknLCBbCiAgICAgICAgICAgIGxvY2Fscy5maW5kKCdfbWl4aW4nLCAnaHVua0hlbHBlcnMubWl4aW4nKSwKICAgICAgICAgICAgY2xhc3NSZWZlcmVuY2UoY2xzKSwKICAgICAgICAgICAgY2xhc3NSZWZlcmVuY2UoY2xzLm1peGluQ2xhc3MpLAogICAgICAgICAgXSk7CiAgICAgICAgICByZWdpc3RlckVudGl0eUFzdChjbHMuZWxlbWVudCwgc3RhdGVtZW50LCBsaWJyYXJ5OiBsaWJyYXJ5LmVsZW1lbnQpOwogICAgICAgICAgbWl4aW5DYWxscy5hZGQoc3RhdGVtZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKENsYXNzIHN1cGVyY2xhc3MgaW4gc3ViY2xhc3Nlcy5rZXlzKSB7CiAgICAgIExpc3Q8Q2xhc3M+IGxpc3QgPSBzdWJjbGFzc2VzW3N1cGVyY2xhc3NdOwogICAgICBqcy5FeHByZXNzaW9uIHN1cGVyY2xhc3NSZWZlcmVuY2UgPSAoc3VwZXJjbGFzcyA9PSBudWxsKQogICAgICAgICAgPyBuZXcganMuTGl0ZXJhbE51bGwoKQogICAgICAgICAgOiBjbGFzc1JlZmVyZW5jZShzdXBlcmNsYXNzKTsKICAgICAgaWYgKGxpc3QubGVuZ3RoID09IDEpIHsKICAgICAgICBDbGFzcyBjbHMgPSBsaXN0LnNpbmdsZTsKICAgICAgICB2YXIgc3RhdGVtZW50ID0ganMuanMuc3RhdGVtZW50KCcjKCMsICMpJywgWwogICAgICAgICAgbG9jYWxzLmZpbmQoJ19pbmhlcml0JywgJ2h1bmtIZWxwZXJzLmluaGVyaXQnKSwKICAgICAgICAgIGNsYXNzUmVmZXJlbmNlKGNscyksCiAgICAgICAgICBzdXBlcmNsYXNzUmVmZXJlbmNlCiAgICAgICAgXSk7CiAgICAgICAgcmVnaXN0ZXJFbnRpdHlBc3QoY2xzLmVsZW1lbnQsIHN0YXRlbWVudCwgbGlicmFyeTogY2xzLmVsZW1lbnQubGlicmFyeSk7CiAgICAgICAgaW5oZXJpdENhbGxzLmFkZChzdGF0ZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIExpc3Q8anMuRXhwcmVzc2lvbj4gbGlzdEVsZW1lbnRzID0gW107CiAgICAgICAgLy8gU2luY2UgaW5oZXJpdE1hbnkgc2hhcmVzIHRoZSBzdXBlcmNsYXNzIHJlZmVyZW5jZSwgd2UgYXR0cmlidXRlIGl0CiAgICAgICAgLy8gb25seSB0byB0aGUgZmlyc3Qgc3ViY2xhc3MuCiAgICAgICAgQ2xhc3NFbnRpdHkgZmlyc3RDbGFzcyA9IGxpc3QuZmlyc3QuZWxlbWVudDsKICAgICAgICByZWdpc3RlckVudGl0eUFzdChmaXJzdENsYXNzLCBzdXBlcmNsYXNzUmVmZXJlbmNlLAogICAgICAgICAgICBsaWJyYXJ5OiBmaXJzdENsYXNzLmxpYnJhcnkpOwogICAgICAgIGZvciAoQ2xhc3MgY2xzIGluIGxpc3QpIHsKICAgICAgICAgIGpzLkV4cHJlc3Npb24gcmVmZXJlbmNlID0gY2xhc3NSZWZlcmVuY2UoY2xzKTsKICAgICAgICAgIHJlZ2lzdGVyRW50aXR5QXN0KGNscy5lbGVtZW50LCByZWZlcmVuY2UsCiAgICAgICAgICAgICAgbGlicmFyeTogY2xzLmVsZW1lbnQubGlicmFyeSk7CiAgICAgICAgICBsaXN0RWxlbWVudHMuYWRkKHJlZmVyZW5jZSk7CiAgICAgICAgfQogICAgICAgIGluaGVyaXRDYWxscy5hZGQoanMuanMuc3RhdGVtZW50KCcjKCMsICMpJywgWwogICAgICAgICAgbG9jYWxzLmZpbmQoJ19pbmhlcml0TWFueScsICdodW5rSGVscGVycy5pbmhlcml0TWFueScpLAogICAgICAgICAgc3VwZXJjbGFzc1JlZmVyZW5jZSwKICAgICAgICAgIGpzLkFycmF5SW5pdGlhbGl6ZXIobGlzdEVsZW1lbnRzKQogICAgICAgIF0pKTsKICAgICAgfQogICAgfQoKICAgIExpc3Q8anMuU3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gW107CiAgICBpZiAobG9jYWxzLmlzTm90RW1wdHkpIHsKICAgICAgc3RhdGVtZW50cy5hZGQobG9jYWxzLnRvU3RhdGVtZW50KCkpOwogICAgfQogICAgc3RhdGVtZW50cy5hZGRBbGwoaW5oZXJpdENhbGxzKTsKICAgIHN0YXRlbWVudHMuYWRkQWxsKG1peGluQ2FsbHMpOwogICAgcmV0dXJuIHdyYXBQaGFzZSgnaW5oZXJpdGFuY2UnLCBzdGF0ZW1lbnRzKTsKICB9CgogIC8vLyBFbWl0cyB0aGUgc2V0dXAgb2YgbWV0aG9kIGFsaWFzZXMuCiAgLy8vCiAgLy8vIFRoaXMgc3RlcCBjb25zaXN0cyBvZiBzaW1wbHkgY29weWluZyBKYXZhU2NyaXB0IGZ1bmN0aW9ucyB0byB0aGVpcgogIC8vLyBhbGlhc2VkIG5hbWVzIHNvIHRoZXkgcG9pbnQgdG8gdGhlIHNhbWUgZnVuY3Rpb24uCiAganMuU3RhdGVtZW50IGVtaXRJbnN0YW5jZU1ldGhvZEFsaWFzZXMoRnJhZ21lbnQgZnJhZ21lbnQsCiAgICAgIHtib29sIHNvZnREZWZlcnJlZCA9IGZhbHNlfSkgewogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IGFzc2lnbm1lbnRzID0gW107CgogICAgZm9yIChMaWJyYXJ5IGxpYnJhcnkgaW4gZnJhZ21lbnQubGlicmFyaWVzKSB7CiAgICAgIGZvciAoQ2xhc3MgY2xzIGluIGxpYnJhcnkuY2xhc3NlcykgewogICAgICAgIGlmIChjbHMuaXNTb2Z0RGVmZXJyZWQgIT0gc29mdERlZmVycmVkKSBjb250aW51ZTsKICAgICAgICBib29sIGZpcnN0QWxpYXMgPSB0cnVlOwogICAgICAgIGZvciAoSW5zdGFuY2VNZXRob2QgbWV0aG9kIGluIGNscy5tZXRob2RzKSB7CiAgICAgICAgICBpZiAobWV0aG9kLmFsaWFzTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgIGlmIChmaXJzdEFsaWFzKSB7CiAgICAgICAgICAgICAgZmlyc3RBbGlhcyA9IGZhbHNlOwogICAgICAgICAgICAgIGpzLlN0YXRlbWVudCBzdGF0ZW1lbnQgPSBqcy5qcy5zdGF0ZW1lbnQoCiAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRzLmlzRW1wdHkKICAgICAgICAgICAgICAgICAgICAgID8gJ3ZhciBfID0gIy5wcm90b3R5cGU7JwogICAgICAgICAgICAgICAgICAgICAgOiAnXyA9ICMucHJvdG90eXBlJywKICAgICAgICAgICAgICAgICAgY2xhc3NSZWZlcmVuY2UoY2xzKSk7CiAgICAgICAgICAgICAgcmVnaXN0ZXJFbnRpdHlBc3QobWV0aG9kLmVsZW1lbnQsIHN0YXRlbWVudCk7CiAgICAgICAgICAgICAgYXNzaWdubWVudHMuYWRkKHN0YXRlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAganMuU3RhdGVtZW50IHN0YXRlbWVudCA9IGpzLmpzLnN0YXRlbWVudCgnXy4jID0gXy4jJywKICAgICAgICAgICAgICAgIFtqcy5xdW90ZU5hbWUobWV0aG9kLmFsaWFzTmFtZSksIGpzLnF1b3RlTmFtZShtZXRob2QubmFtZSldKTsKICAgICAgICAgICAgcmVnaXN0ZXJFbnRpdHlBc3QobWV0aG9kLmVsZW1lbnQsIHN0YXRlbWVudCk7CiAgICAgICAgICAgIGFzc2lnbm1lbnRzLmFkZChzdGF0ZW1lbnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHdyYXBQaGFzZSgnYWxpYXNlcycsIGFzc2lnbm1lbnRzKTsKICB9CgogIC8vLyBFbmNvZGVzIHRoZSBvcHRpb25hbCBkZWZhdWx0IHZhbHVlcyBzbyB0aGF0IHRoZSBydW50aW1lIEZ1bmN0aW9uLmFwcGx5CiAgLy8vIGNhbiB1c2UgdGhlbS4KICBqcy5FeHByZXNzaW9uIF9lbmNvZGVPcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMoRGFydE1ldGhvZCBtZXRob2QpIHsKICAgIC8vIFRPRE8oaGVyaHV0KTogUmVwbGFjZSBbanMuTGl0ZXJhbE51bGxdIHdpdGggW2pzLkFycmF5SG9sZV0uCiAgICBpZiAobWV0aG9kLm9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcyBpcyBMaXN0KSB7CiAgICAgIExpc3Q8Q29uc3RhbnRWYWx1ZT4gZGVmYXVsdFZhbHVlcyA9IG1ldGhvZC5vcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXM7CiAgICAgIGlmIChkZWZhdWx0VmFsdWVzLmlzRW1wdHkpIHsKICAgICAgICByZXR1cm4gbmV3IGpzLkxpdGVyYWxOdWxsKCk7CiAgICAgIH0KICAgICAgSXRlcmFibGU8anMuRXhwcmVzc2lvbj4gZWxlbWVudHMgPQogICAgICAgICAgZGVmYXVsdFZhbHVlcy5tYXAoZ2VuZXJhdGVDb25zdGFudFJlZmVyZW5jZSk7CiAgICAgIHJldHVybiBqcy5qcygnZnVuY3Rpb24oKSB7IHJldHVybiAjOyB9JywKICAgICAgICAgIG5ldyBqcy5BcnJheUluaXRpYWxpemVyKGVsZW1lbnRzLnRvTGlzdCgpKSk7CiAgICB9IGVsc2UgewogICAgICBNYXA8U3RyaW5nLCBDb25zdGFudFZhbHVlPiBkZWZhdWx0VmFsdWVzID0KICAgICAgICAgIG1ldGhvZC5vcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXM7CiAgICAgIExpc3Q8anMuUHJvcGVydHk+IHByb3BlcnRpZXMgPSBbXTsKICAgICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gZGVmYXVsdFZhbHVlcy5rZXlzLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgICAvLyBTb3J0IHRoZSBuYW1lcyB0aGUgc2FtZSB3YXkgd2Ugc29ydCB0aGVtIGZvciB0aGUgbmFtZWQtYXJndW1lbnQgY2FsbGluZwogICAgICAvLyBjb252ZW50aW9uLgogICAgICBuYW1lcy5zb3J0KCk7CgogICAgICBmb3IgKFN0cmluZyBuYW1lIGluIG5hbWVzKSB7CiAgICAgICAgQ29uc3RhbnRWYWx1ZSB2YWx1ZSA9IGRlZmF1bHRWYWx1ZXNbbmFtZV07CiAgICAgICAgcHJvcGVydGllcy5hZGQoCiAgICAgICAgICAgIG5ldyBqcy5Qcm9wZXJ0eShqcy5zdHJpbmcobmFtZSksIGdlbmVyYXRlQ29uc3RhbnRSZWZlcmVuY2UodmFsdWUpKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGpzLmpzKAogICAgICAgICAgJ2Z1bmN0aW9uKCkgeyByZXR1cm4gIzsgfScsIG5ldyBqcy5PYmplY3RJbml0aWFsaXplcihwcm9wZXJ0aWVzKSk7CiAgICB9CiAgfQoKICAvLy8gV3JhcHMgdGhlIHN0YXRlbWVudCBpbiBhIG5hbWVkIGZ1bmN0aW9uIHRvIHRoYXQgaXQgc2hvd3MgdXAgYXMgYSB1bml0IGluCiAgLy8vIHByb2ZpbGVzLgogIC8vIFRPRE8oc3JhKTogU2hvdWxkIHRoaXMgYmUgY29uZGl0aW9uYWw/CiAganMuU3RhdGVtZW50IHdyYXBQaGFzZShTdHJpbmcgbmFtZSwgTGlzdDxqcy5TdGF0ZW1lbnQ+IHN0YXRlbWVudHMpIHsKICAgIGpzLkJsb2NrIGJsb2NrID0gbmV3IGpzLkJsb2NrKHN0YXRlbWVudHMpOwogICAgaWYgKHN0YXRlbWVudHMuaXNFbXB0eSkgcmV0dXJuIGJsb2NrOwogICAgcmV0dXJuIGpzLmpzLnN0YXRlbWVudCgnKGZ1bmN0aW9uICMoKXsjfSkoKTsnLCBbbmFtZSwgYmxvY2tdKTsKICB9CgogIGJvb2wgaXNFbXB0eVN0YXRlbWVudChqcy5TdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICBpZiAoc3RhdGVtZW50IGlzIGpzLkJsb2NrKSB7CiAgICAgIHJldHVybiBzdGF0ZW1lbnQuc3RhdGVtZW50cy5pc0VtcHR5OwogICAgfQogICAgcmV0dXJuIHN0YXRlbWVudCBpcyBqcy5FbXB0eVN0YXRlbWVudDsKICB9CgogIC8vLyBFbWl0cyB0aGUgc2VjdGlvbiB0aGF0IGluc3RhbGxzIHRlYXItb2ZmIGdldHRlcnMuCiAganMuU3RhdGVtZW50IGVtaXRJbnN0YWxsVGVhck9mZnMoRnJhZ21lbnQgZnJhZ21lbnQsCiAgICAgIHtib29sIHNvZnREZWZlcnJlZCA9IGZhbHNlfSkgewogICAgTG9jYWxBbGlhc2VzIGxvY2FscyA9IExvY2FsQWxpYXNlcygpOwoKICAgIC8vLyBFbWl0cyB0aGUgc3RhdGVtZW50IHRoYXQgaW5zdGFsbHMgYSB0ZWFyIG9mZiBmb3IgYSBtZXRob2QuCiAgICAvLy8KICAgIC8vLyBUZWFyLW9mZnMgbWlnaHQgYmUgcGFzc2VkIHRvIGBGdW5jdGlvbi5hcHBseWAgd2hpY2ggbWVhbnMgdGhhdCBhbGwKICAgIC8vLyBjYWxsaW5nLWNvbnZlbnRpb25zICh3aXRoIG9yIHdpdGhvdXQgb3B0aW9uYWwgcG9zaXRpb25hbC9uYW1lZAogICAgLy8vIGFyZ3VtZW50cykgYXJlIHBvc3NpYmxlLiBBcyBzdWNoLCB0aGUgdGVhci1vZmYgbmVlZHMgZW5vdWdoIGluZm9ybWF0aW9uCiAgICAvLy8gdG8gZmlsbCBpbiBtaXNzaW5nIHBhcmFtZXRlcnMuCiAgICBqcy5TdGF0ZW1lbnQgZW1pdEluc3RhbGxUZWFyT2ZmKAogICAgICAgIGpzLkV4cHJlc3Npb24gY29udGFpbmVyLCBEYXJ0TWV0aG9kIG1ldGhvZCkgewogICAgICBMaXN0PGpzLk5hbWU+IGNhbGxOYW1lcyA9IFtdOwogICAgICBMaXN0PGpzLkV4cHJlc3Npb24+IGZ1bnNPck5hbWVzID0gW107CgogICAgICAvLy8gQWRkcyB0aGUgc3R1Yi1tZXRob2QncyBjb2RlIG9yIG5hbWUgdG8gdGhlIFtmdW5zT3JOYW1lc10gYXJyYXkuCiAgICAgIC8vLwogICAgICAvLy8gU3RhdGljIG1ldGhvZHMgZG9uJ3QgbmVlZCBzdHViLW1ldGhvZHMgZXhjZXB0IGZvciB0ZWFyLW9mZnMuIEFzIHN1Y2gsCiAgICAgIC8vLyB0aGV5IGFyZSBub3QgZW1pdHRlZCBpbiB0aGUgcHJvdG90eXBlLCBidXQgZGlyZWN0bHkgcGFzc2VkIGhlcmUuCiAgICAgIC8vLwogICAgICAvLy8gSW5zdGFuY2UtbWV0aG9kcyBpbnN0YWxsIHRoZSBzdHViLW1ldGhvZHMgaW4gdGhlaXIgcHJvdG90eXBlLCBhbmQgd2UKICAgICAgLy8vIHVzZSBzdHJpbmctYmFzZWQgcmVkaXJlY3Rpb25zIHRvIGZpbmQgdGhlbSB0aGVyZS4KICAgICAgdm9pZCBhZGRGdW5Pck5hbWUoU3R1Yk1ldGhvZCBzdHViTWV0aG9kKSB7CiAgICAgICAgaWYgKG1ldGhvZC5pc1N0YXRpYykgewogICAgICAgICAgZnVuc09yTmFtZXMuYWRkKHN0dWJNZXRob2QuY29kZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZ1bnNPck5hbWVzLmFkZChqcy5xdW90ZU5hbWUoc3R1Yk1ldGhvZC5uYW1lKSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBjYWxsTmFtZXMuYWRkKG1ldGhvZC5jYWxsTmFtZSk7CiAgICAgIC8vIFRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgZnVuc09yTmFtZXMtYXJyYXkgbXVzdCBiZSBhIHN0cmluZy4KICAgICAgZnVuc09yTmFtZXMuYWRkKGpzLnF1b3RlTmFtZShtZXRob2QubmFtZSkpOwogICAgICBmb3IgKFBhcmFtZXRlclN0dWJNZXRob2Qgc3R1Yk1ldGhvZCBpbiBtZXRob2QucGFyYW1ldGVyU3R1YnMpIHsKICAgICAgICBjYWxsTmFtZXMuYWRkKHN0dWJNZXRob2QuY2FsbE5hbWUpOwogICAgICAgIGFkZEZ1bk9yTmFtZShzdHViTWV0aG9kKTsKICAgICAgfQoKICAgICAganMuQXJyYXlJbml0aWFsaXplciBjYWxsTmFtZUFycmF5ID0KICAgICAgICAgIG5ldyBqcy5BcnJheUluaXRpYWxpemVyKGNhbGxOYW1lcy5tYXAoanMucXVvdGVOYW1lKS50b0xpc3QoKSk7CiAgICAgIGpzLkFycmF5SW5pdGlhbGl6ZXIgZnVuc09yTmFtZXNBcnJheSA9CiAgICAgICAgICBuZXcganMuQXJyYXlJbml0aWFsaXplcihmdW5zT3JOYW1lcyk7CgogICAgICBib29sIGlzSW50ZXJjZXB0ZWQgPSBmYWxzZTsKICAgICAgaWYgKG1ldGhvZCBpcyBJbnN0YW5jZU1ldGhvZCkgewogICAgICAgIGlzSW50ZXJjZXB0ZWQgPSBtZXRob2QuaXNJbnRlcmNlcHRlZDsKICAgICAgfQoKICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPSBtZXRob2QucmVxdWlyZWRQYXJhbWV0ZXJDb3VudDsKICAgICAganMuRXhwcmVzc2lvbiBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMgPSBuZXcganMuTGl0ZXJhbE51bGwoKTsKICAgICAgaWYgKG1ldGhvZC5jYW5CZUFwcGxpZWQpIHsKICAgICAgICBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMgPQogICAgICAgICAgICBfZW5jb2RlT3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzKG1ldGhvZCk7CiAgICAgIH0KCiAgICAgIHZhciBhcHBseUluZGV4ID0ganMubnVtYmVyKG1ldGhvZC5hcHBseUluZGV4KTsKCiAgICAgIGlmIChtZXRob2QuaXNTdGF0aWMpIHsKICAgICAgICBpZiAocmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA8PSAyICYmCiAgICAgICAgICAgIGNhbGxOYW1lcy5sZW5ndGggPT0gMSAmJgogICAgICAgICAgICBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMgaXMganMuTGl0ZXJhbE51bGwgJiYKICAgICAgICAgICAgbWV0aG9kLmFwcGx5SW5kZXggPT0gMCkgewogICAgICAgICAganMuU3RhdGVtZW50IGZpbmlzaChpbnQgYXJpdHkpIHsKICAgICAgICAgICAgLy8gU2hvcnQgZm9ybSBmb3IgZXhhY3RseSAwLzEvMiBhcmd1bWVudHMuCiAgICAgICAgICAgIHZhciBpbnN0YWxsID0KICAgICAgICAgICAgICAgIGxvY2Fscy5maW5kKCdfc3RhdGljXyR7YXJpdHl9JywgJ2h1bmtIZWxwZXJzLl9zdGF0aWNfJHthcml0eX0nKTsKICAgICAgICAgICAgcmV0dXJuIGpzLmpzLnN0YXRlbWVudCgnJycKICAgICAgICAgICAgICAgICNpbnN0YWxsKCNjb250YWluZXIsICNnZXR0ZXJOYW1lLCAjbmFtZSwgI2Z1blR5cGUpJycnLCB7CiAgICAgICAgICAgICAgImluc3RhbGwiOiBpbnN0YWxsLAogICAgICAgICAgICAgICJjb250YWluZXIiOiBjb250YWluZXIsCiAgICAgICAgICAgICAgImdldHRlck5hbWUiOiBqcy5xdW90ZU5hbWUobWV0aG9kLnRlYXJPZmZOYW1lKSwKICAgICAgICAgICAgICAibmFtZSI6IGZ1bnNPck5hbWVzLnNpbmdsZSwKICAgICAgICAgICAgICAiZnVuVHlwZSI6IG1ldGhvZC5mdW5jdGlvblR5cGUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQoKICAgICAgICAgIHZhciBpbnN0YWxsZWROYW1lID0gY2FsbE5hbWVzLnNpbmdsZTsKICAgICAgICAgIGlmIChpbnN0YWxsZWROYW1lID09IGNhbGwwTmFtZSkgcmV0dXJuIGZpbmlzaCgwKTsKICAgICAgICAgIGlmIChpbnN0YWxsZWROYW1lID09IGNhbGwxTmFtZSkgcmV0dXJuIGZpbmlzaCgxKTsKICAgICAgICAgIGlmIChpbnN0YWxsZWROYW1lID09IGNhbGwyTmFtZSkgcmV0dXJuIGZpbmlzaCgyKTsKICAgICAgICB9CgogICAgICAgIHZhciBpbnN0YWxsID0KICAgICAgICAgICAgbG9jYWxzLmZpbmQoJ19zdGF0aWMnLCAnaHVua0hlbHBlcnMuaW5zdGFsbFN0YXRpY1RlYXJPZmYnKTsKICAgICAgICByZXR1cm4ganMuanMuc3RhdGVtZW50KCcnJwogICAgICAgICAgICAjaW5zdGFsbCgjY29udGFpbmVyLCAjZ2V0dGVyTmFtZSwKICAgICAgICAgICAgICAgICAgICAgI3JlcXVpcmVkUGFyYW1ldGVyQ291bnQsICNvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICAjY2FsbE5hbWVzLCAjZnVuc09yTmFtZXMsICNmdW5UeXBlLCAjYXBwbHlJbmRleCknJycsIHsKICAgICAgICAgICJpbnN0YWxsIjogaW5zdGFsbCwKICAgICAgICAgICJjb250YWluZXIiOiBjb250YWluZXIsCiAgICAgICAgICAiZ2V0dGVyTmFtZSI6IGpzLnF1b3RlTmFtZShtZXRob2QudGVhck9mZk5hbWUpLAogICAgICAgICAgInJlcXVpcmVkUGFyYW1ldGVyQ291bnQiOiBqcy5udW1iZXIocmVxdWlyZWRQYXJhbWV0ZXJDb3VudCksCiAgICAgICAgICAib3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzIjogb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICAgICAgImNhbGxOYW1lcyI6IGNhbGxOYW1lQXJyYXksCiAgICAgICAgICAiZnVuc09yTmFtZXMiOiBmdW5zT3JOYW1lc0FycmF5LAogICAgICAgICAgImZ1blR5cGUiOiBtZXRob2QuZnVuY3Rpb25UeXBlLAogICAgICAgICAgImFwcGx5SW5kZXgiOiBhcHBseUluZGV4LAogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChyZXF1aXJlZFBhcmFtZXRlckNvdW50IDw9IDIgJiYKICAgICAgICAgICAgY2FsbE5hbWVzLmxlbmd0aCA9PSAxICYmCiAgICAgICAgICAgIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcyBpcyBqcy5MaXRlcmFsTnVsbCAmJgogICAgICAgICAgICBtZXRob2QuYXBwbHlJbmRleCA9PSAwKSB7CiAgICAgICAgICBqcy5TdGF0ZW1lbnQgZmluaXNoKGludCBhcml0eSkgewogICAgICAgICAgICAvLyBTaG9ydCBmb3JtIGZvciBleGFjdGx5IDAvMS8yIGFyZ3VtZW50cy4KICAgICAgICAgICAgU3RyaW5nIGlzSW50ZXJjZXB0ZWRUYWcgPSBpc0ludGVyY2VwdGVkID8gJ2knIDogJ3UnOwogICAgICAgICAgICB2YXIgaW5zdGFsbCA9IGxvY2Fscy5maW5kKCdfaW5zdGFuY2VfJHthcml0eX1fJHtpc0ludGVyY2VwdGVkVGFnfScsCiAgICAgICAgICAgICAgICAnaHVua0hlbHBlcnMuX2luc3RhbmNlXyR7YXJpdHl9JHtpc0ludGVyY2VwdGVkVGFnfScpOwogICAgICAgICAgICByZXR1cm4ganMuanMuc3RhdGVtZW50KCcnJwogICAgICAgICAgICAgICAgI2luc3RhbGwoI2NvbnRhaW5lciwgI2dldHRlck5hbWUsICNuYW1lLCAjZnVuVHlwZSknJycsIHsKICAgICAgICAgICAgICAiaW5zdGFsbCI6IGluc3RhbGwsCiAgICAgICAgICAgICAgImNvbnRhaW5lciI6IGNvbnRhaW5lciwKICAgICAgICAgICAgICAiZ2V0dGVyTmFtZSI6IGpzLnF1b3RlTmFtZShtZXRob2QudGVhck9mZk5hbWUpLAogICAgICAgICAgICAgICJuYW1lIjogZnVuc09yTmFtZXMuc2luZ2xlLAogICAgICAgICAgICAgICJmdW5UeXBlIjogbWV0aG9kLmZ1bmN0aW9uVHlwZSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CgogICAgICAgICAgdmFyIGluc3RhbGxlZE5hbWUgPSBjYWxsTmFtZXMuc2luZ2xlOwogICAgICAgICAgaWYgKGluc3RhbGxlZE5hbWUgPT0gY2FsbDBOYW1lKSByZXR1cm4gZmluaXNoKDApOwogICAgICAgICAgaWYgKGluc3RhbGxlZE5hbWUgPT0gY2FsbDFOYW1lKSByZXR1cm4gZmluaXNoKDEpOwogICAgICAgICAgaWYgKGluc3RhbGxlZE5hbWUgPT0gY2FsbDJOYW1lKSByZXR1cm4gZmluaXNoKDIpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGluc3RhbGwgPQogICAgICAgICAgICBsb2NhbHMuZmluZCgnX2luc3RhbmNlJywgJ2h1bmtIZWxwZXJzLmluc3RhbGxJbnN0YW5jZVRlYXJPZmYnKTsKICAgICAgICByZXR1cm4ganMuanMuc3RhdGVtZW50KCcnJwogICAgICAgICAgICAjaW5zdGFsbCgjY29udGFpbmVyLCAjZ2V0dGVyTmFtZSwgI2lzSW50ZXJjZXB0ZWQsCiAgICAgICAgICAgICAgICAgICAgICNyZXF1aXJlZFBhcmFtZXRlckNvdW50LCAjb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAjY2FsbE5hbWVzLCAjZnVuc09yTmFtZXMsICNmdW5UeXBlLCAjYXBwbHlJbmRleCknJycsIHsKICAgICAgICAgICJpbnN0YWxsIjogaW5zdGFsbCwKICAgICAgICAgICJjb250YWluZXIiOiBjb250YWluZXIsCiAgICAgICAgICAiZ2V0dGVyTmFtZSI6IGpzLnF1b3RlTmFtZShtZXRob2QudGVhck9mZk5hbWUpLAogICAgICAgICAgLy8gJ1RydXRoeScgdmFsdWVzIGFyZSBvayBmb3IgYGlzSW50ZXJjZXB0ZWRgLgogICAgICAgICAgImlzSW50ZXJjZXB0ZWQiOiBqcy5udW1iZXIoaXNJbnRlcmNlcHRlZCA/IDEgOiAwKSwKICAgICAgICAgICJyZXF1aXJlZFBhcmFtZXRlckNvdW50IjoganMubnVtYmVyKHJlcXVpcmVkUGFyYW1ldGVyQ291bnQpLAogICAgICAgICAgIm9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcyI6IG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgICAgICJjYWxsTmFtZXMiOiBjYWxsTmFtZUFycmF5LAogICAgICAgICAgImZ1bnNPck5hbWVzIjogZnVuc09yTmFtZXNBcnJheSwKICAgICAgICAgICJmdW5UeXBlIjogbWV0aG9kLmZ1bmN0aW9uVHlwZSwKICAgICAgICAgICJhcHBseUluZGV4IjogYXBwbHlJbmRleCwKICAgICAgICB9KTsKICAgICAgfQogICAgfQoKICAgIExpc3Q8anMuU3RhdGVtZW50PiBpbml0cyA9IFtdOwogICAganMuRXhwcmVzc2lvbiB0ZW1wOwoKICAgIGZvciAoTGlicmFyeSBsaWJyYXJ5IGluIGZyYWdtZW50LmxpYnJhcmllcykgewogICAgICBmb3IgKFN0YXRpY01ldGhvZCBtZXRob2QgaW4gbGlicmFyeS5zdGF0aWNzKSB7CiAgICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IGNhbiB0aGVyZSBiZSBhbnl0aGluZyBlbHNlIHRoYW4gYSBTdGF0aWNEYXJ0TWV0aG9kPwogICAgICAgIGlmIChtZXRob2QgaXMgU3RhdGljRGFydE1ldGhvZCkgewogICAgICAgICAgaWYgKG1ldGhvZC5uZWVkc1RlYXJPZmYpIHsKICAgICAgICAgICAgSG9sZGVyIGhvbGRlciA9IG1ldGhvZC5ob2xkZXI7CiAgICAgICAgICAgIGpzLlN0YXRlbWVudCBzdGF0ZW1lbnQgPQogICAgICAgICAgICAgICAgZW1pdEluc3RhbGxUZWFyT2ZmKG5ldyBqcy5WYXJpYWJsZVVzZShob2xkZXIubmFtZSksIG1ldGhvZCk7CiAgICAgICAgICAgIHJlZ2lzdGVyRW50aXR5QXN0KG1ldGhvZC5lbGVtZW50LCBzdGF0ZW1lbnQsCiAgICAgICAgICAgICAgICBsaWJyYXJ5OiBsaWJyYXJ5LmVsZW1lbnQpOwogICAgICAgICAgICBpbml0cy5hZGQoc3RhdGVtZW50KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChDbGFzcyBjbHMgaW4gbGlicmFyeS5jbGFzc2VzKSB7CiAgICAgICAgaWYgKGNscy5pc1NvZnREZWZlcnJlZCAhPSBzb2Z0RGVmZXJyZWQpIGNvbnRpbnVlOwogICAgICAgIHZhciBtZXRob2RzID0gY2xzLm1ldGhvZHMud2hlcmUoKGR5bmFtaWMgbSkgPT4gbS5uZWVkc1RlYXJPZmYpLnRvTGlzdCgpOwogICAgICAgIGpzLkV4cHJlc3Npb24gY29udGFpbmVyID0ganMuanMoIiMucHJvdG90eXBlIiwgY2xhc3NSZWZlcmVuY2UoY2xzKSk7CiAgICAgICAganMuRXhwcmVzc2lvbiByZWZlcmVuY2UgPSBjb250YWluZXI7CiAgICAgICAgaWYgKG1ldGhvZHMubGVuZ3RoID4gMSkgewogICAgICAgICAgaWYgKHRlbXAgPT0gbnVsbCkgewogICAgICAgICAgICBpbml0cy5hZGQoanMuanMuc3RhdGVtZW50KCd2YXIgXzsnKSk7CiAgICAgICAgICAgIHRlbXAgPSBqcy5qcygnXycpOwogICAgICAgICAgfQogICAgICAgICAgLy8gRmlyc3QgY2FsbCB1c2VzIGFzc2lnbm1lbnQgdG8gdGVtcCB0byBjYWNoZSB0aGUgY29udGFpbmVyLgogICAgICAgICAgcmVmZXJlbmNlID0ganMuanMoJyMgPSAjJywgW3RlbXAsIGNvbnRhaW5lcl0pOwogICAgICAgIH0KICAgICAgICBmb3IgKEluc3RhbmNlTWV0aG9kIG1ldGhvZCBpbiBtZXRob2RzKSB7CiAgICAgICAgICBqcy5TdGF0ZW1lbnQgc3RhdGVtZW50ID0gZW1pdEluc3RhbGxUZWFyT2ZmKHJlZmVyZW5jZSwgbWV0aG9kKTsKICAgICAgICAgIHJlZ2lzdGVyRW50aXR5QXN0KG1ldGhvZC5lbGVtZW50LCBzdGF0ZW1lbnQpOwogICAgICAgICAgaW5pdHMuYWRkKHN0YXRlbWVudCk7CiAgICAgICAgICByZWZlcmVuY2UgPSB0ZW1wOyAvLyBTZWNvbmQgYW5kIHN1YnNlcXVlbnQgY2FsbHMgdXNlIHRlbXAuCiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGxvY2Fscy5pc05vdEVtcHR5KSB7CiAgICAgIGluaXRzLmluc2VydCgwLCBsb2NhbHMudG9TdGF0ZW1lbnQoKSk7CiAgICB9CgogICAgcmV0dXJuIHdyYXBQaGFzZSgnaW5zdGFsbFRlYXJPZmZzJywgaW5pdHMpOwogIH0KCiAgLy8vIEVtaXRzIHRoZSBjb25zdGFudHMgc2VjdGlvbi4KICBqcy5TdGF0ZW1lbnQgZW1pdENvbnN0YW50cyhGcmFnbWVudCBmcmFnbWVudCkgewogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IGFzc2lnbm1lbnRzID0gW107CiAgICBib29sIGhhc0xpc3QgPSBmYWxzZTsKICAgIGZvciAoQ29uc3RhbnQgY29uc3RhbnQgaW4gZnJhZ21lbnQuY29uc3RhbnRzKSB7CiAgICAgIC8vIFRPRE8oMjUyMzApOiBXZSBvbmx5IG5lZWQgdG8gbmFtZSBjb25zdGFudHMgdGhhdCBhcmUgdXNlZCBmcm9tIGZ1bmN0aW9uCiAgICAgIC8vIGJvZGllcyBvciBmcm9tIG90aGVyIGNvbnN0YW50cyBpbiBhIGRpZmZlcmVudCBwYXJ0LgogICAgICB2YXIgYXNzaWdubWVudCA9IGpzLmpzLnN0YXRlbWVudCgnIy4jID0gIycsIFsKICAgICAgICBjb25zdGFudC5ob2xkZXIubmFtZSwKICAgICAgICBjb25zdGFudC5uYW1lLAogICAgICAgIF9jb25zdGFudEVtaXR0ZXIuZ2VuZXJhdGUoY29uc3RhbnQudmFsdWUpCiAgICAgIF0pOwogICAgICBfZHVtcEluZm9UYXNrLnJlZ2lzdGVyQ29uc3RhbnRBc3QoY29uc3RhbnQudmFsdWUsIGFzc2lnbm1lbnQpOwogICAgICBhc3NpZ25tZW50cy5hZGQoYXNzaWdubWVudCk7CiAgICAgIGlmIChjb25zdGFudC52YWx1ZS5pc0xpc3QpIGhhc0xpc3QgPSB0cnVlOwogICAgfQogICAgaWYgKGhhc0xpc3QpIHsKICAgICAgYXNzaWdubWVudHMuaW5zZXJ0KAogICAgICAgICAgMCwganMuanMuc3RhdGVtZW50KCd2YXIgbWFrZUNvbnN0TGlzdCA9IGh1bmtIZWxwZXJzLm1ha2VDb25zdExpc3Q7JykpOwogICAgfQogICAgcmV0dXJuIHdyYXBQaGFzZSgnY29uc3RhbnRzJywgYXNzaWdubWVudHMpOwogIH0KCiAgLy8vIEVtaXRzIHRoZSBzdGF0aWMgbm9uLWZpbmFsIGZpZWxkcyBzZWN0aW9uLgogIC8vLwogIC8vLyBUaGlzIHNlY3Rpb24gaW5pdGlhbGl6ZXMgYWxsIHN0YXRpYyBub24tZmluYWwgZmllbGRzIHRoYXQgZG9uJ3QgcmVxdWlyZQogIC8vLyBhbiBpbml0aWFsaXplci4KICBqcy5TdGF0ZW1lbnQgZW1pdFN0YXRpY05vbkZpbmFsRmllbGRzKEZyYWdtZW50IGZyYWdtZW50KSB7CiAgICBMaXN0PFN0YXRpY0ZpZWxkPiBmaWVsZHMgPSBmcmFnbWVudC5zdGF0aWNOb25GaW5hbEZpZWxkczsKICAgIC8vIFRPRE8oc3JhKTogQ2hhaW4gYXNzaWdubWVudHMgdGhhdCBoYXZlIHRoZSBzYW1lIHZhbHVlLCBpLmUuCiAgICAvLwogICAgLy8gICAgJC54ID0gbnVsbDsgJC55ID0gbnVsbDsgJC56ID0gbnVsbDsKICAgIC8vIC0tPgogICAgLy8gICAgJC56ID0gJC55ID0gJC54ID0gbnVsbDsKICAgIC8vCiAgICBJdGVyYWJsZTxqcy5TdGF0ZW1lbnQ+IHN0YXRlbWVudHMgPSBmaWVsZHMubWFwKChTdGF0aWNGaWVsZCBmaWVsZCkgewogICAgICBhc3NlcnQoZmllbGQuaG9sZGVyLmlzU3RhdGljU3RhdGVIb2xkZXIpOwogICAgICBqcy5TdGF0ZW1lbnQgc3RhdGVtZW50OwogICAgICBpZiAoZmllbGQuaXNJbml0aWFsaXplZEJ5Q29uc3RhbnQpIHsKICAgICAgICBzdGF0ZW1lbnQgPSBqcy5qcwogICAgICAgICAgICAuc3RhdGVtZW50KCIjLiMgPSAjOyIsIFtmaWVsZC5ob2xkZXIubmFtZSwgZmllbGQubmFtZSwgZmllbGQuY29kZV0pOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrLiBGaWVsZCBpbml0aWFsaXplcnMgYXJlIGdlbmVyYXRlZCBhcyBhCiAgICAgICAgLy8gZnVuY3Rpb24gZW5kaW5nIHdpdGggYSByZXR1cm4gc3RhdGVtZW50LiBXZSByZXBsYWNlIHRoZSBmdW5jdGlvbgogICAgICAgIC8vIHdpdGggdGhlIGJvZHkgYmxvY2sgYW5kIHJlcGxhY2UgdGhlIHJldHVybiBzdGF0ZW1lbnQgd2l0aCBhbgogICAgICAgIC8vIGFzc2lnbm1lbnQgdG8gdGhlIGZpZWxkLgogICAgICAgIC8vCiAgICAgICAgLy8gU2luY2UgdW5uZWVkZWQgYmxvY2tzIGFyZSBub3QgZ2VuZXJhdGVkIGluIHRoZSBvdXRwdXQsCiAgICAgICAgLy8gdGhlIHN0YXRlbWVudChzKSBvZiB0aGUgaW5pdGlhbGl6ZXMgYXJlIGlubGluZWQgaW4gdGhlIGVtaXR0ZWQgY29kZS4KICAgICAgICAvLwogICAgICAgIC8vIFRoaXMgaXMgYSBjaGVhcCB3YXkgb2Ygc3VwcG9ydGluZyBlYWdlciBmaWVsZHMgKGFzIG9wcG9zZWQgdG8KICAgICAgICAvLyBnZW5lcmF0aW5nIG9uZSBTU0EgZ3JhcGggZm9yIGFsbCBlYWdlciBmaWVsZHMpIHRob3VnaCBpdCBkb2VzIG5vdAogICAgICAgIC8vIGF2b2lkIHJlZHVuZGFudCBkZWNsYXJhdGlvbiBvZiBsb2NhbCB2YXJpYWJsZSwgZm9yIGluc3RhbmNlIGZvcgogICAgICAgIC8vIHR5cGUgYXJndW1lbnRzLgogICAgICAgIGpzLkZ1biBjb2RlID0gZmllbGQuY29kZTsKICAgICAgICBhc3NlcnQoY29kZSAhPSBudWxsLCAiTm8gY29kZSBmb3IgJGZpZWxkIik7CiAgICAgICAgaWYgKGNvZGUucGFyYW1zLmlzRW1wdHkgJiYKICAgICAgICAgICAgY29kZS5ib2R5LnN0YXRlbWVudHMubGVuZ3RoID09IDEgJiYKICAgICAgICAgICAgY29kZS5ib2R5LnN0YXRlbWVudHMubGFzdCBpcyBqcy5SZXR1cm4pIHsKICAgICAgICAgIC8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IGluaXRpYWxpemVycyBvZiB0aGUgZm9ybQogICAgICAgICAgLy8KICAgICAgICAgIC8vICAgZnVuY3Rpb24oKSB7IHJldHVybiBlOyB9CiAgICAgICAgICAvLwogICAgICAgICAgLy8gVG8gYXZvaWQgdW5mb3Jlc2VlbiBjb25zZXF1ZW5jZXMgb2YgaGF2aW5nIHBhcmFtZXRlcnMgYW5kIGxvY2FscwogICAgICAgICAgLy8gaW4gdGhlIGluaXRpYWxpemVyIGNvZGUuCiAgICAgICAgICBqcy5SZXR1cm4gbGFzdCA9IGNvZGUuYm9keS5zdGF0ZW1lbnRzLmxhc3Q7CiAgICAgICAgICBzdGF0ZW1lbnQgPSBqcy5qcy5zdGF0ZW1lbnQoCiAgICAgICAgICAgICAgIiMuIyA9ICM7IiwgW2ZpZWxkLmhvbGRlci5uYW1lLCBmaWVsZC5uYW1lLCBsYXN0LnZhbHVlXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFNhZmUgZmFsbGJhY2sgaW4gdGhlIGV2ZW50IG9mIGEgZmllbGQgaW5pdGlhbGl6ZXIgd2l0aCBubyByZXR1cm4KICAgICAgICAgIC8vIHN0YXRlbWVudCBhcyB0aGUgbGFzdCBzdGF0ZW1lbnQuCiAgICAgICAgICBzdGF0ZW1lbnQgPSBqcy5qcwogICAgICAgICAgICAgIC5zdGF0ZW1lbnQoIiMuIyA9ICMoKTsiLCBbZmllbGQuaG9sZGVyLm5hbWUsIGZpZWxkLm5hbWUsIGNvZGVdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmVnaXN0ZXJFbnRpdHlBc3QoZmllbGQuZWxlbWVudCwgc3RhdGVtZW50LAogICAgICAgICAgbGlicmFyeTogZmllbGQuZWxlbWVudC5saWJyYXJ5KTsKICAgICAgcmV0dXJuIHN0YXRlbWVudDsKICAgIH0pOwogICAgcmV0dXJuIHdyYXBQaGFzZSgnc3RhdGljRmllbGRzJywgc3RhdGVtZW50cy50b0xpc3QoKSk7CiAgfQoKICAvLy8gRW1pdHMgbGF6eSBmaWVsZHMuCiAgLy8vCiAgLy8vIFRoaXMgc2VjdGlvbiBpbml0aWFsaXplcyBhbGwgc3RhdGljIChmaW5hbCBhbmQgbm9uLWZpbmFsKSBmaWVsZHMgdGhhdAogIC8vLyByZXF1aXJlIGFuIGluaXRpYWxpemVyLgogIGpzLlN0YXRlbWVudCBlbWl0TGF6aWx5SW5pdGlhbGl6ZWRTdGF0aWNzKEZyYWdtZW50IGZyYWdtZW50KSB7CiAgICBMaXN0PFN0YXRpY0ZpZWxkPiBmaWVsZHMgPSBmcmFnbWVudC5zdGF0aWNMYXppbHlJbml0aWFsaXplZEZpZWxkczsKICAgIExpc3Q8anMuU3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gW107CiAgICBMb2NhbEFsaWFzZXMgbG9jYWxzID0gTG9jYWxBbGlhc2VzKCk7CiAgICBmb3IgKFN0YXRpY0ZpZWxkIGZpZWxkIGluIGZpZWxkcykgewogICAgICBhc3NlcnQoZmllbGQuaG9sZGVyLmlzU3RhdGljU3RhdGVIb2xkZXIpOwogICAgICBqcy5TdGF0ZW1lbnQgc3RhdGVtZW50ID0ganMuanMuc3RhdGVtZW50KCIjKCMsICMsICMsICMpOyIsIFsKICAgICAgICBsb2NhbHMuZmluZCgnX2xhenknLCAnaHVua0hlbHBlcnMubGF6eScpLAogICAgICAgIGZpZWxkLmhvbGRlci5uYW1lLAogICAgICAgIGpzLnF1b3RlTmFtZShmaWVsZC5uYW1lKSwKICAgICAgICBqcy5xdW90ZU5hbWUoZmllbGQuZ2V0dGVyTmFtZSksCiAgICAgICAgZmllbGQuY29kZQogICAgICBdKTsKCiAgICAgIHJlZ2lzdGVyRW50aXR5QXN0KGZpZWxkLmVsZW1lbnQsIHN0YXRlbWVudCwKICAgICAgICAgIGxpYnJhcnk6IGZpZWxkLmVsZW1lbnQubGlicmFyeSk7CiAgICAgIHN0YXRlbWVudHMuYWRkKHN0YXRlbWVudCk7CiAgICB9CgogICAgaWYgKGxvY2Fscy5pc05vdEVtcHR5KSB7CiAgICAgIHN0YXRlbWVudHMuaW5zZXJ0KDAsIGxvY2Fscy50b1N0YXRlbWVudCgpKTsKICAgIH0KCiAgICByZXR1cm4gd3JhcFBoYXNlKCdsYXp5SW5pdGlhbGl6ZXJzJywgc3RhdGVtZW50cyk7CiAgfQoKICAvLy8gRW1pdHMgdGhlIGVtYmVkZGVkIGdsb2JhbHMgdGhhdCBhcmUgbmVlZGVkIGZvciBkZWZlcnJlZCBsb2FkaW5nLgogIC8vLwogIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgaW52b2tlZCBmb3IgdGhlIG1haW4gZnJhZ21lbnQuCiAgLy8vCiAgLy8vIFRoZSBbbG9hZE1hcF0gY29udGFpbnMgYSBtYXAgZnJvbSBsb2FkLWlkcyAoZm9yIGVhY2ggZGVmZXJyZWQgbGlicmFyeSkKICAvLy8gdG8gdGhlIGxpc3Qgb2YgZ2VuZXJhdGVkIGZyYWdtZW50cyB0aGF0IG11c3QgYmUgaW5zdGFsbGVkIHdoZW4gdGhlCiAgLy8vIGRlZmVycmVkIGxpYnJhcnkgaXMgbG9hZGVkLgogIEl0ZXJhYmxlPGpzLlByb3BlcnR5PiBlbWl0RW1iZWRkZWRHbG9iYWxzRm9yRGVmZXJyZWRMb2FkaW5nKAogICAgICBEZWZlcnJlZExvYWRpbmdTdGF0ZSBkZWZlcnJlZExvYWRpbmdTdGF0ZSkgewogICAgTGlzdDxqcy5Qcm9wZXJ0eT4gZ2xvYmFscyA9IFtdOwoKICAgIGdsb2JhbHMuYWRkKG5ldyBqcy5Qcm9wZXJ0eSgKICAgICAgICBqcy5zdHJpbmcoREVGRVJSRURfSU5JVElBTElaRUQpLCBqcy5qcygiT2JqZWN0LmNyZWF0ZShudWxsKSIpKSk7CgogICAgU3RyaW5nIGRlZmVycmVkR2xvYmFsID0gTW9kZWxFbWl0dGVyLmRlZmVycmVkSW5pdGlhbGl6ZXJzR2xvYmFsOwogICAganMuRXhwcmVzc2lvbiBpc0h1bmtMb2FkZWRGdW5jdGlvbiA9CiAgICAgICAganMuanMoImZ1bmN0aW9uKGhhc2gpIHsgcmV0dXJuICEhJGRlZmVycmVkR2xvYmFsW2hhc2hdOyB9Iik7CiAgICBnbG9iYWxzCiAgICAgICAgLmFkZChuZXcganMuUHJvcGVydHkoanMuc3RyaW5nKElTX0hVTktfTE9BREVEKSwgaXNIdW5rTG9hZGVkRnVuY3Rpb24pKTsKCiAgICBqcy5FeHByZXNzaW9uIGlzSHVua0luaXRpYWxpemVkRnVuY3Rpb24gPSBqcy5qcygKICAgICAgICAiZnVuY3Rpb24oaGFzaCkgeyByZXR1cm4gISEjZGVmZXJyZWRJbml0aWFsaXplZFtoYXNoXTsgfSIsIHsKICAgICAgJ2RlZmVycmVkSW5pdGlhbGl6ZWQnOiBnZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzKERFRkVSUkVEX0lOSVRJQUxJWkVEKQogICAgfSk7CiAgICBnbG9iYWxzLmFkZChuZXcganMuUHJvcGVydHkoCiAgICAgICAganMuc3RyaW5nKElTX0hVTktfSU5JVElBTElaRUQpLCBpc0h1bmtJbml0aWFsaXplZEZ1bmN0aW9uKSk7CgogICAgLy8vIFNlZSBbZmluYWxpemVEZWZlcnJlZExvYWRpbmdEYXRhXSBmb3IgdGhlIGZvcm1hdCBvZiB0aGUgZGVmZXJyZWQgaHVuay4KICAgIGpzLkV4cHJlc3Npb24gaW5pdGlhbGl6ZUxvYWRlZEh1bmtGdW5jdGlvbiA9IGpzLmpzKCIiIgogICAgICAgICAgICBmdW5jdGlvbihoYXNoKSB7CiAgICAgICAgICAgICAgdmFyIGh1bmsgPSAkZGVmZXJyZWRHbG9iYWxbaGFzaF07CiAgICAgICAgICAgICAgaWYgKGh1bmsgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgIkRlZmVycmVkTG9hZGluZyBzdGF0ZSBlcnJvcjogY29kZSB3aXRoIGhhc2ggJyIgKwogICAgICAgICAgICAgICAgICAgIGhhc2ggKyAiJyB3YXMgbm90IGxvYWRlZCI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGluaXRpYWxpemVEZWZlcnJlZEh1bmsoaHVuayk7CiAgICAgICAgICAgICAgI2RlZmVycmVkSW5pdGlhbGl6ZWRbaGFzaF0gPSB0cnVlOwogICAgICAgICAgICB9IiIiLCB7CiAgICAgICdkZWZlcnJlZEluaXRpYWxpemVkJzogZ2VuZXJhdGVFbWJlZGRlZEdsb2JhbEFjY2VzcyhERUZFUlJFRF9JTklUSUFMSVpFRCkKICAgIH0pOwoKICAgIGdsb2JhbHMuYWRkKG5ldyBqcy5Qcm9wZXJ0eSgKICAgICAgICBqcy5zdHJpbmcoSU5JVElBTElaRV9MT0FERURfSFVOSyksIGluaXRpYWxpemVMb2FkZWRIdW5rRnVuY3Rpb24pKTsKCiAgICBnbG9iYWxzLmFkZChuZXcganMuUHJvcGVydHkoanMuc3RyaW5nKERFRkVSUkVEX0xJQlJBUllfUEFSVFMpLAogICAgICAgIGRlZmVycmVkTG9hZGluZ1N0YXRlLmRlZmVycmVkTGlicmFyeVBhcnRzKSk7CiAgICBnbG9iYWxzLmFkZChuZXcganMuUHJvcGVydHkoCiAgICAgICAganMuc3RyaW5nKERFRkVSUkVEX1BBUlRfVVJJUyksIGRlZmVycmVkTG9hZGluZ1N0YXRlLmRlZmVycmVkUGFydFVyaXMpKTsKICAgIGdsb2JhbHMuYWRkKG5ldyBqcy5Qcm9wZXJ0eShqcy5zdHJpbmcoREVGRVJSRURfUEFSVF9IQVNIRVMpLAogICAgICAgIGRlZmVycmVkTG9hZGluZ1N0YXRlLmRlZmVycmVkUGFydEhhc2hlcykpOwoKICAgIHJldHVybiBnbG9iYWxzOwogIH0KCiAgLy8gQ3JlYXRlIGRhdGEgdXNlZCBmb3IgbG9hZGluZyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBodW5rcyBmb3IgYSBkZWZlcnJlZAogIC8vIGltcG9ydC4gVGhlcmUgYXJlIHRocmVlIHBhcnRzOiBhIG1hcCBmcm9tIGxvYWRJZCB0byBsaXN0IG9mIHBhcnRzLCB3aGVyZQogIC8vIHBhcnRzIGFyZSByZXByZXNlbnRlZCBhcyBhbiBpbmRleDsgYW4gYXJyYXkgb2YgdXJpcyBpbmRleGVkIGJ5IHBhcnQ7IGFuZCBhbgogIC8vIGFycmF5IG9mIGhhc2hlcyBpbmRleGVkIGJ5IHBhcnQuCiAgLy8gW2RlZmVycmVkTG9hZEhhc2hlc10gbWF5IGhhdmUgbWlzc2luZyBlbnRyaWVzIHRvIGluZGljYXRlIGVtcHR5IHBhcnRzLgogIHZvaWQgZmluYWxpemVEZWZlcnJlZExvYWRpbmdEYXRhKAogICAgICBNYXA8U3RyaW5nLCBMaXN0PEZyYWdtZW50Pj4gbG9hZE1hcCwKICAgICAgTWFwPERlZmVycmVkRnJhZ21lbnQsIFN0cmluZz4gZGVmZXJyZWRMb2FkSGFzaGVzLAogICAgICBEZWZlcnJlZExvYWRpbmdTdGF0ZSBkZWZlcnJlZExvYWRpbmdTdGF0ZSkgewogICAgaWYgKGxvYWRNYXAuaXNFbXB0eSkgcmV0dXJuOwoKICAgIE1hcDxGcmFnbWVudCwgaW50PiBmcmFnbWVudEluZGV4ZXMgPSB7fTsKICAgIExpc3Q8U3RyaW5nPiBmcmFnbWVudFVyaXMgPSBbXTsKICAgIExpc3Q8U3RyaW5nPiBmcmFnbWVudEhhc2hlcyA9IFtdOwoKICAgIExpc3Q8anMuUHJvcGVydHk+IGxpYnJhcnlQYXJ0c01hcEVudHJpZXMgPSBbXTsKCiAgICBsb2FkTWFwLmZvckVhY2goKFN0cmluZyBsb2FkSWQsIExpc3Q8RnJhZ21lbnQ+IGZyYWdtZW50TGlzdCkgewogICAgICBMaXN0PGpzLkV4cHJlc3Npb24+IGluZGV4ZXMgPSBbXTsKICAgICAgZm9yIChGcmFnbWVudCBmcmFnbWVudCBpbiBmcmFnbWVudExpc3QpIHsKICAgICAgICBTdHJpbmcgZnJhZ21lbnRIYXNoID0gZGVmZXJyZWRMb2FkSGFzaGVzW2ZyYWdtZW50XTsKICAgICAgICBpZiAoZnJhZ21lbnRIYXNoID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgIGludCBpbmRleCA9IGZyYWdtZW50SW5kZXhlc1tmcmFnbWVudF07CiAgICAgICAgaWYgKGluZGV4ID09IG51bGwpIHsKICAgICAgICAgIGluZGV4ID0gZnJhZ21lbnRJbmRleGVzW2ZyYWdtZW50XSA9IGZyYWdtZW50SW5kZXhlcy5sZW5ndGg7CiAgICAgICAgICBmcmFnbWVudFVyaXMuYWRkKAogICAgICAgICAgICAgICIke2ZyYWdtZW50Lm91dHB1dEZpbGVOYW1lfS4ke01vZGVsRW1pdHRlci5kZWZlcnJlZEV4dGVuc2lvbn0iKTsKICAgICAgICAgIGZyYWdtZW50SGFzaGVzLmFkZChmcmFnbWVudEhhc2gpOwogICAgICAgIH0KICAgICAgICBpbmRleGVzLmFkZChqcy5udW1iZXIoaW5kZXgpKTsKICAgICAgfQogICAgICBsaWJyYXJ5UGFydHNNYXBFbnRyaWVzLmFkZCgKICAgICAgICAgIG5ldyBqcy5Qcm9wZXJ0eShqcy5zdHJpbmcobG9hZElkKSwgbmV3IGpzLkFycmF5SW5pdGlhbGl6ZXIoaW5kZXhlcykpKTsKICAgIH0pOwoKICAgIGRlZmVycmVkTG9hZGluZ1N0YXRlLmRlZmVycmVkTGlicmFyeVBhcnRzCiAgICAgICAgLnNldFZhbHVlKG5ldyBqcy5PYmplY3RJbml0aWFsaXplcihsaWJyYXJ5UGFydHNNYXBFbnRyaWVzKSk7CiAgICBkZWZlcnJlZExvYWRpbmdTdGF0ZS5kZWZlcnJlZFBhcnRVcmlzCiAgICAgICAgLnNldFZhbHVlKGpzLnN0cmluZ0FycmF5KGZyYWdtZW50VXJpcykpOwogICAgZGVmZXJyZWRMb2FkaW5nU3RhdGUuZGVmZXJyZWRQYXJ0SGFzaGVzCiAgICAgICAgLnNldFZhbHVlKGpzLnN0cmluZ0FycmF5KGZyYWdtZW50SGFzaGVzKSk7CiAgfQoKICAvLy8gRW1pdHMgdGhlIFtNQU5HTEVEX0dMT0JBTF9OQU1FU10gZW1iZWRkZWQgZ2xvYmFsLgogIC8vLwogIC8vLyBUaGlzIGdsb2JhbCBtYXBzIG1pbmlmaWVkIG5hbWVzIGZvciBzZWxlY3RlZCBjbGFzc2VzIChzb21lIGltcG9ydGFudAogIC8vLyBjb3JlIGNsYXNzZXMsIGFuZCBzb21lIG5hdGl2ZSBjbGFzc2VzKSB0byB0aGVpciB1bm1pbmlmaWVkIG5hbWVzLgogIGpzLlByb3BlcnR5IGVtaXRNYW5nbGVkR2xvYmFsTmFtZXMoKSB7CiAgICBMaXN0PGpzLlByb3BlcnR5PiBuYW1lcyA9IFtdOwoKICAgIENvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzID0gX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzOwogICAgLy8gV2Ugd2FudCB0byBrZWVwIHRoZSBvcmlnaW5hbCBuYW1lcyBmb3IgdGhlIG1vc3QgY29tbW9uIGNvcmUgY2xhc3NlcyB3aGVuCiAgICAvLyBjYWxsaW5nIHRvU3RyaW5nIG9uIHRoZW0uCiAgICBMaXN0PENsYXNzRW50aXR5PiBuYXRpdmVDbGFzc2VzTmVlZGluZ1VubWFuZ2xlZE5hbWUgPSBbCiAgICAgIGNvbW1vbkVsZW1lbnRzLmludENsYXNzLAogICAgICBjb21tb25FbGVtZW50cy5kb3VibGVDbGFzcywKICAgICAgY29tbW9uRWxlbWVudHMubnVtQ2xhc3MsCiAgICAgIGNvbW1vbkVsZW1lbnRzLnN0cmluZ0NsYXNzLAogICAgICBjb21tb25FbGVtZW50cy5ib29sQ2xhc3MsCiAgICAgIGNvbW1vbkVsZW1lbnRzLm51bGxDbGFzcywKICAgICAgY29tbW9uRWxlbWVudHMubGlzdENsYXNzCiAgICBdOwogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIG9uIGEgcGVyLWZyYWdtZW50IGJhc2lzLgogICAgbmF0aXZlQ2xhc3Nlc05lZWRpbmdVbm1hbmdsZWROYW1lLmZvckVhY2goKGVsZW1lbnQpIHsKICAgICAgbmFtZXMuYWRkKG5ldyBqcy5Qcm9wZXJ0eSgKICAgICAgICAgIGpzLnF1b3RlTmFtZShfbmFtZXIuY2xhc3NOYW1lKGVsZW1lbnQpKSwganMuc3RyaW5nKGVsZW1lbnQubmFtZSkpKTsKICAgIH0pOwoKICAgIHJldHVybiBuZXcganMuUHJvcGVydHkoCiAgICAgICAganMuc3RyaW5nKE1BTkdMRURfR0xPQkFMX05BTUVTKSwgbmV3IGpzLk9iamVjdEluaXRpYWxpemVyKG5hbWVzKSk7CiAgfQoKICAvLy8gRW1pdHMgdGhlIFtHRVRfVFlQRV9GUk9NX05BTUVdIGVtYmVkZGVkIGdsb2JhbC4KICAvLy8KICAvLy8gVGhpcyBlbWJlZGRlZCBnbG9iYWwgcHJvdmlkZXMgYSB3YXkgdG8gZ28gZnJvbSBhIGNsYXNzIG5hbWUgKHdoaWNoIGlzCiAgLy8vIGFsc28gdGhlIGNvbnN0cnVjdG9yJ3MgbmFtZSkgdG8gdGhlIGNvbnN0cnVjdG9yIGl0c2VsZi4KICBqcy5Qcm9wZXJ0eSBlbWl0R2V0VHlwZUZyb21OYW1lKCkgewogICAganMuRXhwcmVzc2lvbiBmdW5jdGlvbiA9IGpzLmpzKCJnZXRHbG9iYWxGcm9tTmFtZSIpOwogICAgcmV0dXJuIG5ldyBqcy5Qcm9wZXJ0eShqcy5zdHJpbmcoR0VUX1RZUEVfRlJPTV9OQU1FKSwgZnVuY3Rpb24pOwogIH0KCiAgLy8vIEVtaXRzIHRoZSBbTUVUQURBVEFdIGVtYmVkZGVkIGdsb2JhbC4KICAvLy8KICAvLy8gVGhlIG1ldGFkYXRhIGl0c2VsZiBoYXMgYWxyZWFkeSBiZWVuIGNvbXB1dGVkIGVhcmxpZXIgYW5kIGlzIHN0b3JlZCBpbgogIC8vLyB0aGUgW3Byb2dyYW1dLgogIExpc3Q8anMuUHJvcGVydHk+IGVtaXRNZXRhZGF0YShQcm9ncmFtIHByb2dyYW0pIHsKICAgIExpc3Q8anMuUHJvcGVydHk+IG1ldGFkYXRhR2xvYmFscyA9IFtdOwoKICAgIGpzLlByb3BlcnR5IGNyZWF0ZUdsb2JhbChqcy5FeHByZXNzaW9uIG1ldGFkYXRhLCBTdHJpbmcgZ2xvYmFsKSB7CiAgICAgIHJldHVybiBuZXcganMuUHJvcGVydHkoanMuc3RyaW5nKGdsb2JhbCksIG1ldGFkYXRhKTsKICAgIH0KCiAgICB2YXIgbWFpblVuaXQgPSBwcm9ncmFtLm1haW5GcmFnbWVudC5vdXRwdXRVbml0OwogICAganMuRXhwcmVzc2lvbiBtZXRhZGF0YSA9IHByb2dyYW0ubWV0YWRhdGFGb3JPdXRwdXRVbml0KG1haW5Vbml0KTsKICAgIG1ldGFkYXRhR2xvYmFscy5hZGQoY3JlYXRlR2xvYmFsKG1ldGFkYXRhLCBNRVRBREFUQSkpOwogICAganMuRXhwcmVzc2lvbiB0eXBlcyA9IHByb2dyYW0ubWV0YWRhdGFUeXBlc0Zvck91dHB1dFVuaXQobWFpblVuaXQpOwogICAgbWV0YWRhdGFHbG9iYWxzLmFkZChjcmVhdGVHbG9iYWwodHlwZXMsIFRZUEVTKSk7CgogICAgcmV0dXJuIG1ldGFkYXRhR2xvYmFsczsKICB9CgogIC8vLyBFbWl0cyBhbGwgZW1iZWRkZWQgZ2xvYmFscy4KICBqcy5TdGF0ZW1lbnQgZW1pdEVtYmVkZGVkR2xvYmFsc1BhcnQxKAogICAgICBQcm9ncmFtIHByb2dyYW0sIERlZmVycmVkTG9hZGluZ1N0YXRlIGRlZmVycmVkTG9hZGluZ1N0YXRlKSB7CiAgICBMaXN0PGpzLlByb3BlcnR5PiBnbG9iYWxzID0gW107CgogICAgaWYgKHByb2dyYW0ubG9hZE1hcC5pc05vdEVtcHR5KSB7CiAgICAgIGdsb2JhbHMKICAgICAgICAgIC5hZGRBbGwoZW1pdEVtYmVkZGVkR2xvYmFsc0ZvckRlZmVycmVkTG9hZGluZyhkZWZlcnJlZExvYWRpbmdTdGF0ZSkpOwogICAgfQoKICAgIGlmIChwcm9ncmFtLnR5cGVUb0ludGVyY2VwdG9yTWFwICE9IG51bGwpIHsKICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBpcyBhc3NpZ25lZCBsYXRlci4KICAgICAgLy8gSW5pdGlhbGl6ZSBwcm9wZXJ0eSB0byBhdm9pZCBtYXAgdHJhbnNpdGlvbnMuCiAgICAgIGdsb2JhbHMuYWRkKG5ldyBqcy5Qcm9wZXJ0eSgKICAgICAgICAgIGpzLnN0cmluZyhUWVBFX1RPX0lOVEVSQ0VQVE9SX01BUCksIGpzLkxpdGVyYWxOdWxsKCkpKTsKICAgIH0KCiAgICBpZiAoX29wdGlvbnMuZXhwZXJpbWVudE5ld1J0aSkgewogICAgICBnbG9iYWxzLmFkZChqcy5Qcm9wZXJ0eShqcy5zdHJpbmcoUlRJX1VOSVZFUlNFKSwgY3JlYXRlUnRpVW5pdmVyc2UoKSkpOwogICAgfQoKICAgIGdsb2JhbHMuYWRkKGVtaXRNYW5nbGVkR2xvYmFsTmFtZXMoKSk7CgogICAgLy8gVGhlIFtNQU5HTEVEX05BTUVTXSB0YWJsZSBtdXN0IGNvbnRhaW4gdGhlIG1hcHBpbmcgZm9yIGNvbnN0IHN5bWJvbHMuCiAgICAvLyBXaXRob3V0IGNvbnN0IHN5bWJvbHMsIHRoZSB0YWJsZSBpcyBvbmx5IHJlbGV2YW50IGZvciByZWZsZWN0aW9uIGFuZAogICAgLy8gdGhlcmVmb3JlIHVudXNlZCBpbiB0aGlzIGVtaXR0ZXIuCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhlIG5lZWQgZm9yIGFkZGluZyBhbiBlbXB0eSBsaXN0IG9mCiAgICAvLyBtYW5nbGVkIG5hbWVzLgogICAgZ2xvYmFscy5hZGQobmV3IGpzLlByb3BlcnR5KAogICAgICAgIGpzLnN0cmluZyhNQU5HTEVEX05BTUVTKSwgbmV3IGpzLk9iamVjdEluaXRpYWxpemVyKDxqcy5Qcm9wZXJ0eT5bXSkpKTsKCiAgICBnbG9iYWxzLmFkZChlbWl0R2V0VHlwZUZyb21OYW1lKCkpOwoKICAgIGdsb2JhbHMuYWRkQWxsKGVtaXRNZXRhZGF0YShwcm9ncmFtKSk7CgogICAgaWYgKHByb2dyYW0ubmVlZHNOYXRpdmVTdXBwb3J0KSB7CiAgICAgIGdsb2JhbHMuYWRkKG5ldyBqcy5Qcm9wZXJ0eSgKICAgICAgICAgIGpzLnN0cmluZyhJTlRFUkNFUFRPUlNfQllfVEFHKSwgbmV3IGpzLkxpdGVyYWxOdWxsKCkpKTsKICAgICAgZ2xvYmFscy5hZGQobmV3IGpzLlByb3BlcnR5KGpzLnN0cmluZyhMRUFGX1RBR1MpLCBuZXcganMuTGl0ZXJhbE51bGwoKSkpOwogICAgfQoKICAgIGpzLk9iamVjdEluaXRpYWxpemVyIGdsb2JhbHNPYmplY3QgPSBuZXcganMuT2JqZWN0SW5pdGlhbGl6ZXIoZ2xvYmFscyk7CgogICAgcmV0dXJuIGpzLmpzLnN0YXRlbWVudCgndmFyIGluaXQgPSAjOycsIGdsb2JhbHNPYmplY3QpOwogIH0KCiAgLy8vIEZpbmlzaCBzZXR0aW5nIHVwIGVtYmVkZGVkIGdsb2JhbHMuCiAganMuU3RhdGVtZW50IGVtaXRFbWJlZGRlZEdsb2JhbHNQYXJ0MigKICAgICAgUHJvZ3JhbSBwcm9ncmFtLCBEZWZlcnJlZExvYWRpbmdTdGF0ZSBkZWZlcnJlZExvYWRpbmdTdGF0ZSkgewogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IHN0YXRlbWVudHMgPSBbXTsKICAgIGlmIChwcm9ncmFtLnR5cGVUb0ludGVyY2VwdG9yTWFwICE9IG51bGwpIHsKICAgICAgc3RhdGVtZW50cy5hZGQoanMuanMuc3RhdGVtZW50KCdpbml0LiMgPSAjOycsCiAgICAgICAgICBbanMuc3RyaW5nKFRZUEVfVE9fSU5URVJDRVBUT1JfTUFQKSwgcHJvZ3JhbS50eXBlVG9JbnRlcmNlcHRvck1hcF0pKTsKICAgIH0KICAgIHJldHVybiBqcy5CbG9jayhzdGF0ZW1lbnRzKTsKICB9CgogIGpzLlN0YXRlbWVudCBlbWl0VHlwZVJ1bGVzKEZyYWdtZW50IGZyYWdtZW50KSB7CiAgICBpZiAoIV9vcHRpb25zLmV4cGVyaW1lbnROZXdSdGkpIHJldHVybiBqcy5FbXB0eVN0YXRlbWVudCgpOwoKICAgIE1hcDxJbnRlcmZhY2VUeXBlLCBJdGVyYWJsZTxJbnRlcmZhY2VUeXBlPj4gcnVsZXNldCA9IHt9OwogICAgSXRlcmFibGU8Q2xhc3M+IGNsYXNzZXMgPQogICAgICAgIGZyYWdtZW50LmxpYnJhcmllcy5leHBhbmQoKExpYnJhcnkgbGlicmFyeSkgPT4gbGlicmFyeS5jbGFzc2VzKTsKICAgIGNsYXNzZXMuZm9yRWFjaCgoQ2xhc3MgY2xzKSB7CiAgICAgIGlmIChjbHMuY2xhc3NDaGVja3NOZXdSdGkgPT0gbnVsbCkgcmV0dXJuOwogICAgICBJbnRlcmZhY2VUeXBlIHRhcmdldFR5cGUgPSBfZWxlbWVudEVudmlyb25tZW50LmdldFRoaXNUeXBlKGNscy5lbGVtZW50KTsKICAgICAgSXRlcmFibGU8SW50ZXJmYWNlVHlwZT4gc3VwZXJ0eXBlcyA9IGNscy5jbGFzc0NoZWNrc05ld1J0aS5jaGVja3MubWFwKAogICAgICAgICAgKFR5cGVDaGVjayBjaGVjaykgPT4gX2RhcnRUeXBlcy5hc0luc3RhbmNlT2YodGFyZ2V0VHlwZSwgY2hlY2suY2xzKSk7CiAgICAgIHJ1bGVzZXRbdGFyZ2V0VHlwZV0gPSBzdXBlcnR5cGVzOwogICAgfSk7CgogICAgRnVuY3Rpb25FbnRpdHkgbWV0aG9kID0gX2Nsb3NlZFdvcmxkLmNvbW1vbkVsZW1lbnRzLnJ0aUFkZFJ1bGVzTWV0aG9kOwogICAgcmV0dXJuIGpzLmpzLnN0YXRlbWVudCgnIyhpbml0LiMsSlNPTi5wYXJzZSgjKSk7JywgWwogICAgICBfZW1pdHRlci5zdGF0aWNGdW5jdGlvbkFjY2VzcyhtZXRob2QpLAogICAgICBSVElfVU5JVkVSU0UsCiAgICAgIF9ydWxlc2V0RW5jb2Rlci5lbmNvZGVSdWxlc2V0KHJ1bGVzZXQpLAogICAgXSk7CiAgfQoKICAvLy8gUmV0dXJucyBhbiBleHByZXNzaW9uIHRoYXQgY3JlYXRlcyB0aGUgaW5pdGlhbCBSdGkgVW5pdmVyc2UuCiAgLy8vCiAgLy8vIFRoaXMgbmVlZHMgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggYF9Vbml2ZXJzZS5jcmVhdGVgIGluIGBkYXJ0Ol9ydGlgLgogIGpzLkV4cHJlc3Npb24gY3JlYXRlUnRpVW5pdmVyc2UoKSB7CiAgICBMaXN0PGpzLlByb3BlcnR5PiB1bml2ZXJzZUZpZWxkcyA9IFtdOwogICAgdm9pZCBpbml0RmllbGQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewogICAgICB1bml2ZXJzZUZpZWxkcy5hZGQoanMuUHJvcGVydHkoanMuc3RyaW5nKG5hbWUpLCBqcy5qcyh2YWx1ZSkpKTsKICAgIH0KCiAgICBpbml0RmllbGQoUnRpVW5pdmVyc2VGaWVsZE5hbWVzLmV2YWxDYWNoZSwgJ25ldyBNYXAoKScpOwogICAgaW5pdEZpZWxkKFJ0aVVuaXZlcnNlRmllbGROYW1lcy50eXBlUnVsZXMsICd7fScpOwogICAgaW5pdEZpZWxkKFJ0aVVuaXZlcnNlRmllbGROYW1lcy5zaGFyZWRFbXB0eUFycmF5LCAnW10nKTsKCiAgICByZXR1cm4ganMuT2JqZWN0SW5pdGlhbGl6ZXIodW5pdmVyc2VGaWVsZHMpOwogIH0KCiAgLy8vIEVtaXRzIGRhdGEgbmVlZGVkIGZvciBuYXRpdmUgY2xhc3Nlcy4KICAvLy8KICAvLy8gV2UgZG9uJ3QgdHJ5IHRvIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgbmF0aXZlIGRhdGEsIGJ1dCByYXRoZXIgYnVpbGQKICAvLy8gSmF2YVNjcmlwdCBvYmplY3QgbGl0ZXJhbHMgdGhhdCBjb250YWluIGFsbCB0aGUgaW5mb3JtYXRpb24gZGlyZWN0bHkuCiAgLy8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgb3V0cHV0IHNpemUgaXMgYmlnZ2VyLCBidXQgdGhhdCB0aGUgc3RhcnR1cCBpcyBmYXN0ZXIuCiAgLy8vCiAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHN0YXRpYyBlcXVpdmFsZW50IG9mCiAgLy8vIFtOYXRpdmVHZW5lcmF0b3IuYnVpbGROYXRpdmVJbmZvSGFuZGxlcl0uCiAganMuU3RhdGVtZW50IGVtaXROYXRpdmVTdXBwb3J0KEZyYWdtZW50IGZyYWdtZW50KSB7CiAgICBMaXN0PGpzLlN0YXRlbWVudD4gc3RhdGVtZW50cyA9IFtdOwoKICAgIC8vIFRoZSBpc29sYXRlLWFmZmluaXR5IHRhZyBtdXN0IG9ubHkgYmUgaW5pdGlhbGl6ZWQgb25jZSBwZXIgcHJvZ3JhbS4KICAgIGlmIChmcmFnbWVudC5pc01haW5GcmFnbWVudCAmJgogICAgICAgIE5hdGl2ZUdlbmVyYXRvci5uZWVkc0lzb2xhdGVBZmZpbml0eVRhZ0luaXRpYWxpemF0aW9uKAogICAgICAgICAgICBfY2xvc2VkV29ybGQuYmFja2VuZFVzYWdlKSkgewogICAgICBzdGF0ZW1lbnRzLmFkZChOYXRpdmVHZW5lcmF0b3IuZ2VuZXJhdGVJc29sYXRlQWZmaW5pdHlUYWdJbml0aWFsaXphdGlvbigKICAgICAgICAgIF9jbG9zZWRXb3JsZC5iYWNrZW5kVXNhZ2UsIGdlbmVyYXRlRW1iZWRkZWRHbG9iYWxBY2Nlc3MsIGpzLmpzKCIiIgogICAgICAgIC8vIE9uIFY4LCB0aGUgJ2ludGVybicgZnVuY3Rpb24gY29udmVydHMgYSBzdHJpbmcgdG8gYSBzeW1ib2wsIHdoaWNoCiAgICAgICAgLy8gbWFrZXMgcHJvcGVydHkgYWNjZXNzIG11Y2ggZmFzdGVyLgogICAgICAgIC8vIFRPRE8oc3JhKTogVXNlIFN5bWJvbCBvbiBub24tSUUxMSBicm93c2Vycy4KICAgICAgICBmdW5jdGlvbiAocykgewogICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgIG9bc10gPSAxOwogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGh1bmtIZWxwZXJzLmNvbnZlcnRUb0Zhc3RPYmplY3QobykpWzBdOwogICAgICAgIH0iIiIsIFtdKSkpOwogICAgfQoKICAgIE1hcDxTdHJpbmcsIGpzLkV4cHJlc3Npb24+IGludGVyY2VwdG9yc0J5VGFnID0ge307CiAgICBNYXA8U3RyaW5nLCBqcy5FeHByZXNzaW9uPiBsZWFmVGFncyA9IHt9OwogICAgTGlzdDxqcy5TdGF0ZW1lbnQ+IHN1YmNsYXNzQXNzaWdubWVudHMgPSBbXTsKCiAgICBmb3IgKExpYnJhcnkgbGlicmFyeSBpbiBmcmFnbWVudC5saWJyYXJpZXMpIHsKICAgICAgZm9yIChDbGFzcyBjbHMgaW4gbGlicmFyeS5jbGFzc2VzKSB7CiAgICAgICAgaWYgKGNscy5uYXRpdmVMZWFmVGFncyAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKFN0cmluZyB0YWcgaW4gY2xzLm5hdGl2ZUxlYWZUYWdzKSB7CiAgICAgICAgICAgIGludGVyY2VwdG9yc0J5VGFnW3RhZ10gPSBjbGFzc1JlZmVyZW5jZShjbHMpOwogICAgICAgICAgICBsZWFmVGFnc1t0YWddID0gbmV3IGpzLkxpdGVyYWxCb29sKHRydWUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY2xzLm5hdGl2ZU5vbkxlYWZUYWdzICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoU3RyaW5nIHRhZyBpbiBjbHMubmF0aXZlTm9uTGVhZlRhZ3MpIHsKICAgICAgICAgICAgaW50ZXJjZXB0b3JzQnlUYWdbdGFnXSA9IGNsYXNzUmVmZXJlbmNlKGNscyk7CiAgICAgICAgICAgIGxlYWZUYWdzW3RhZ10gPSBuZXcganMuTGl0ZXJhbEJvb2woZmFsc2UpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNscy5uYXRpdmVFeHRlbnNpb25zICE9IG51bGwpIHsKICAgICAgICAgICAgTGlzdDxDbGFzcz4gc3ViY2xhc3NlcyA9IGNscy5uYXRpdmVFeHRlbnNpb25zOwogICAgICAgICAgICBqcy5FeHByZXNzaW9uIGJhc2UgPSBqcy5zdHJpbmcoY2xzLm5hdGl2ZU5vbkxlYWZUYWdzWzBdKTsKCiAgICAgICAgICAgIGZvciAoQ2xhc3Mgc3ViY2xhc3MgaW4gc3ViY2xhc3NlcykgewogICAgICAgICAgICAgIHN1YmNsYXNzQXNzaWdubWVudHMuYWRkKGpzLmpzLnN0YXRlbWVudCgnIy4jID0gIzsnLCBbCiAgICAgICAgICAgICAgICBjbGFzc1JlZmVyZW5jZShzdWJjbGFzcyksCiAgICAgICAgICAgICAgICBOQVRJVkVfU1VQRVJDTEFTU19UQUdfTkFNRSwKICAgICAgICAgICAgICAgIGJhc2UKICAgICAgICAgICAgICBdKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaW50ZXJjZXB0b3JzQnlUYWcuaXNOb3RFbXB0eSkgewogICAgICBzdGF0ZW1lbnRzLmFkZChqcy5qcy5zdGF0ZW1lbnQoCiAgICAgICAgICAiaHVua0hlbHBlcnMuc2V0T3JVcGRhdGVJbnRlcmNlcHRvcnNCeVRhZygjKTsiLAogICAgICAgICAganMub2JqZWN0TGl0ZXJhbChpbnRlcmNlcHRvcnNCeVRhZykpKTsKICAgIH0KICAgIGlmIChsZWFmVGFncy5pc05vdEVtcHR5KSB7CiAgICAgIHN0YXRlbWVudHMuYWRkKGpzLmpzLnN0YXRlbWVudCgKICAgICAgICAgICJodW5rSGVscGVycy5zZXRPclVwZGF0ZUxlYWZUYWdzKCMpOyIsIGpzLm9iamVjdExpdGVyYWwobGVhZlRhZ3MpKSk7CiAgICB9CiAgICBzdGF0ZW1lbnRzLmFkZEFsbChzdWJjbGFzc0Fzc2lnbm1lbnRzKTsKCiAgICByZXR1cm4gd3JhcFBoYXNlKCduYXRpdmVTdXBwb3J0Jywgc3RhdGVtZW50cyk7CiAgfQp9CgpjbGFzcyBMb2NhbEFsaWFzZXMgewogIGZpbmFsIE1hcDxTdHJpbmcsIGpzLkV4cHJlc3Npb24+IF9sb2NhbHMgPSB7fTsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfbG9jYWxzLmlzRW1wdHk7CiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKCiAgU3RyaW5nIGZpbmQoU3RyaW5nIGFsaWFzLCBTdHJpbmcgZXhwcmVzc2lvbikgewogICAgX2xvY2Fsc1thbGlhc10gPz89IGpzLmpzKGV4cHJlc3Npb24pOwogICAgcmV0dXJuIGFsaWFzOwogIH0KCiAganMuU3RhdGVtZW50IHRvU3RhdGVtZW50KCkgewogICAgTGlzdDxqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uPiBpbml0aWFsaXphdGlvbnMgPSBbXTsKICAgIF9sb2NhbHMuZm9yRWFjaCgobG9jYWwsIHZhbHVlKSB7CiAgICAgIGluaXRpYWxpemF0aW9ucwogICAgICAgICAgLmFkZChqcy5WYXJpYWJsZUluaXRpYWxpemF0aW9uKGpzLlZhcmlhYmxlRGVjbGFyYXRpb24obG9jYWwpLCB2YWx1ZSkpOwogICAgfSk7CiAgICByZXR1cm4ganMuRXhwcmVzc2lvblN0YXRlbWVudChqcy5WYXJpYWJsZURlY2xhcmF0aW9uTGlzdChpbml0aWFsaXphdGlvbnMpKTsKICB9Cn0KCi8vLyBDb2RlIHRvIGluaXRpYWxpemUgaG9sZGVyIHdpdGggYW5jaWxsYXJ5IGluZm9ybWF0aW9uLgpjbGFzcyBIb2xkZXJDb2RlIHsKICBmaW5hbCBMaXN0PEhvbGRlcj4gYWN0aXZlSG9sZGVyczsKICBqcy5TdGF0ZW1lbnQgc3RhdGVtZW50czsKICBIb2xkZXJDb2RlKHt0aGlzLmFjdGl2ZUhvbGRlcnMsIHRoaXMuc3RhdGVtZW50c30pOwp9CgpjbGFzcyBEZWZlcnJlZExvYWRpbmdTdGF0ZSB7CiAgZmluYWwgZGVmZXJyZWRMaWJyYXJ5UGFydHMgPSBuZXcgRGVmZXJyZWRQcmltYXJ5RXhwcmVzc2lvbigpOwogIGZpbmFsIGRlZmVycmVkUGFydFVyaXMgPSBuZXcgRGVmZXJyZWRQ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ZS9saWIvc2hhcmVkL2FzeW5jX2F3YWl0X2Vycm9yX2NvZGVzLmRhcnSBmy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gQ29udGFpbnMgZXJyb3IgY29kZXMgdGhhdCB0cmFuc2Zvcm1lZCBhc3luYy9hc3luYyogZnVuY3Rpb25zIHVzZSB0bwovLy8gY29tbXVuaWNhdGUgd2l0aCBqc19oZWxwZXIgZnVuY3Rpb25zLgoKY29uc3QgaW50IFNVQ0NFU1MgPSAwOwpjb25zdCBpbnQgRVJST1IgPSAxOwpjb25zdCBpbnQgU1RSRUFNX1dBU19DQU5DRUxFRCA9IDI7CgwATk48AUgqARcVIwE2cGFja2FnZTpqc19ydW50aW1lL3NoYXJlZC9hc3luY19hd2FpdF9lcnJvcl9jb2Rlcy5kYXJ0NnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NzYS9jb2RlZ2VuX2hlbHBlcnMuZGFydMAAs1UvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ludGVyY2VwdG9yX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vb3B0aW9ucy5kYXJ0JzsKaW1wb3J0ICcuLi91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0JyBzaG93IFNlbGVjdG9yOwppbXBvcnQgJy4uL3dvcmxkLmRhcnQnIHNob3cgSkNsb3NlZFdvcmxkOwppbXBvcnQgJ2NvZGVnZW4uZGFydCcgc2hvdyBDb2RlZ2VuUGhhc2U7CmltcG9ydCAnbm9kZXMuZGFydCc7CgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGludm9jYXRpb24gb2YgW3NlbGVjdG9yXSBvbiBbbWVtYmVyXSBjYW4gdXNlIGFuCi8vLyBhbGlhc2VkIG1lbWJlci4KLy8vCi8vLyBJbnZva2luZyBhIHN1cGVyIGdldHRlciBpc24ndCBzdXBwb3J0ZWQsIHRoaXMgd291bGQgcmVxdWlyZSBjaGFuZ2VzIHRvCi8vLyBjb21wYWN0IGZpZWxkIGRlc2NyaXB0b3JzIGluIHRoZSBlbWl0dGVyLgpib29sIGNhblVzZUFsaWFzZWRTdXBlck1lbWJlcihNZW1iZXJFbnRpdHkgbWVtYmVyLCBTZWxlY3RvciBzZWxlY3RvcikgewogIHJldHVybiAhc2VsZWN0b3IuaXNHZXR0ZXI7Cn0KCi8vLyBSZXBsYWNlcyBzb21lIGluc3RydWN0aW9ucyB3aXRoIHNwZWNpYWxpemVkIHZlcnNpb25zIHRvIG1ha2UgY29kZWdlbiBlYXNpZXIuCi8vLyBDYWNoZXMgY29kZWdlbiBpbmZvcm1hdGlvbiBvbiBub2Rlcy4KY2xhc3MgU3NhSW5zdHJ1Y3Rpb25TZWxlY3Rpb24gZXh0ZW5kcyBIQmFzZVZpc2l0b3Igd2l0aCBDb2RlZ2VuUGhhc2UgewogIGZpbmFsIEpDbG9zZWRXb3JsZCBfY2xvc2VkV29ybGQ7CiAgZmluYWwgSW50ZXJjZXB0b3JEYXRhIF9pbnRlcmNlcHRvckRhdGE7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwogIEhHcmFwaCBncmFwaDsKCiAgU3NhSW5zdHJ1Y3Rpb25TZWxlY3Rpb24oCiAgICAgIHRoaXMuX29wdGlvbnMsIHRoaXMuX2Nsb3NlZFdvcmxkLCB0aGlzLl9pbnRlcmNlcHRvckRhdGEpOwoKICBBYnN0cmFjdFZhbHVlRG9tYWluIGdldCBfYWJzdHJhY3RWYWx1ZURvbWFpbiA9PgogICAgICBfY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbjsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEdyYXBoKEhHcmFwaCBncmFwaCkgewogICAgdGhpcy5ncmFwaCA9IGdyYXBoOwogICAgdmlzaXREb21pbmF0b3JUcmVlKGdyYXBoKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gYmxvY2suZmlyc3Q7CiAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICBISW5zdHJ1Y3Rpb24gbmV4dCA9IGluc3RydWN0aW9uLm5leHQ7CiAgICAgIEhJbnN0cnVjdGlvbiByZXBsYWNlbWVudCA9IGluc3RydWN0aW9uLmFjY2VwdCh0aGlzKTsKICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IGluc3RydWN0aW9uICYmIHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgICAgICBibG9jay5yZXdyaXRlKGluc3RydWN0aW9uLCByZXBsYWNlbWVudCk7CgogICAgICAgIC8vIElmIHRoZSByZXBsYWNlbWVudCBpbnN0cnVjdGlvbiBkb2VzIG5vdCBrbm93IGl0cyBzb3VyY2UgZWxlbWVudCwgdXNlCiAgICAgICAgLy8gdGhlIHNvdXJjZSBlbGVtZW50IG9mIHRoZSBpbnN0cnVjdGlvbi4KICAgICAgICBpZiAocmVwbGFjZW1lbnQuc291cmNlRWxlbWVudCA9PSBudWxsKSB7CiAgICAgICAgICByZXBsYWNlbWVudC5zb3VyY2VFbGVtZW50ID0gaW5zdHJ1Y3Rpb24uc291cmNlRWxlbWVudDsKICAgICAgICB9CiAgICAgICAgaWYgKHJlcGxhY2VtZW50LnNvdXJjZUluZm9ybWF0aW9uID09IG51bGwpIHsKICAgICAgICAgIHJlcGxhY2VtZW50LnNvdXJjZUluZm9ybWF0aW9uID0gaW5zdHJ1Y3Rpb24uc291cmNlSW5mb3JtYXRpb247CiAgICAgICAgfQogICAgICAgIGlmICghcmVwbGFjZW1lbnQuaXNJbkJhc2ljQmxvY2soKSkgewogICAgICAgICAgLy8gVGhlIGNvbnN0YW50IGZvbGRpbmcgY2FuIHJldHVybiBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzIGFscmVhZHkKICAgICAgICAgIC8vIHBhcnQgb2YgdGhlIGdyYXBoIChsaWtlIGFuIGlucHV0KSwgc28gd2Ugb25seSBhZGQgdGhlIHJlcGxhY2VtZW50CiAgICAgICAgICAvLyBpZiBuZWNlc3NhcnkuCiAgICAgICAgICBibG9jay5hZGRBZnRlcihpbnN0cnVjdGlvbiwgcmVwbGFjZW1lbnQpOwogICAgICAgICAgLy8gVmlzaXQgdGhlIHJlcGxhY2VtZW50IGFzIHRoZSBuZXh0IGluc3RydWN0aW9uIGluIGNhc2UgaXQgY2FuIGFsc28KICAgICAgICAgIC8vIGJlIGNvbnN0YW50IGZvbGRlZCBhd2F5LgogICAgICAgICAgbmV4dCA9IHJlcGxhY2VtZW50OwogICAgICAgIH0KICAgICAgICBibG9jay5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogICAgICB9CiAgICAgIGluc3RydWN0aW9uID0gbmV4dDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdEluc3RydWN0aW9uKEhJbnN0cnVjdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdElzKEhJcyBub2RlKSB7CiAgICBpZiAobm9kZS5raW5kID09IEhJcy5SQVdfQ0hFQ0spIHsKICAgICAgSEluc3RydWN0aW9uIGludGVyY2VwdG9yID0gbm9kZS5pbnRlcmNlcHRvcjsKICAgICAgaWYgKGludGVyY2VwdG9yICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gbmV3IEhJc1ZpYUludGVyY2VwdG9yKAogICAgICAgICAgICBub2RlLnR5cGVFeHByZXNzaW9uLCBpbnRlcmNlcHRvciwgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdElkZW50aXR5KEhJZGVudGl0eSBub2RlKSB7CiAgICBub2RlLnNpbmdsZUNvbXBhcmlzb25PcCA9IHNpbXBsZU9wKG5vZGUubGVmdCwgbm9kZS5yaWdodCk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBzaW5nbGUgSmF2YVNjcmlwdCBjb21wYXJpc29uIChgPT1gIG9yIGA9PT1gKSBpZiB0aGF0CiAgLy8vIGltcGxlbWVudHMgYGlkZW50aWNhbChsZWZ0LCByaWdodClgLCBvciByZXR1cm5zIGBudWxsYCBpZiB0aGUgbW9yZSBjb21wbGV4CiAgLy8vIHRlcm5hcnkgYGxlZnQgPT0gbnVsbCA/IHJpZ2h0ID09IG51bGwgOiBsZWZ0ID09PSByaWdodGAgaXMgcmVxdWlyZWQuCiAgU3RyaW5nIHNpbXBsZU9wKEhJbnN0cnVjdGlvbiBsZWZ0LCBISW5zdHJ1Y3Rpb24gcmlnaHQpIHsKICAgIEFic3RyYWN0VmFsdWUgbGVmdFR5cGUgPSBsZWZ0Lmluc3RydWN0aW9uVHlwZTsKICAgIEFic3RyYWN0VmFsdWUgcmlnaHRUeXBlID0gcmlnaHQuaW5zdHJ1Y3Rpb25UeXBlOwogICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbChsZWZ0VHlwZSkuaXNEZWZpbml0ZWx5RmFsc2UpIHsKICAgICAgcmV0dXJuICc9PT0nOwogICAgfQogICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbChyaWdodFR5cGUpLmlzRGVmaW5pdGVseUZhbHNlKSB7CiAgICAgIHJldHVybiAnPT09JzsKICAgIH0KCiAgICAvLyBEYXJ0IGBudWxsYCBpcyBpbXBsZW1lbnRlZCBieSBKYXZhU2NyaXB0IGBudWxsYCBhbmQgYHVuZGVmaW5lZGAgd2hpY2ggYXJlCiAgICAvLyBub3Qgc3RyaWN0LWVxdWFscywgc28gd2UgY2FuJ3QgdXNlIGA9PT1gLiBXZSB3b3VsZCBsaWtlIHRvIHVzZSBgPT1gIGJ1dAogICAgLy8gbmVlZCB0byBhdm9pZCBhbnkgY2FzZXMgZnJvbSBFUzYgNy4yLjE0IHRoYXQgaW52b2x2ZSBjb252ZXJzaW9ucy4KICAgIGlmIChsZWZ0LmlzQ29uc3RhbnROdWxsKCkgfHwgcmlnaHQuaXNDb25zdGFudE51bGwoKSkgewogICAgICByZXR1cm4gJz09JzsKICAgIH0KCiAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4uaXNOdW1iZXJPck51bGwobGVmdFR5cGUpLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc051bWJlck9yTnVsbChyaWdodFR5cGUpLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuICc9PSc7CiAgICB9CiAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4uaXNTdHJpbmdPck51bGwobGVmdFR5cGUpLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc1N0cmluZ09yTnVsbChyaWdodFR5cGUpLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuICc9PSc7CiAgICB9CiAgICBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4uaXNCb29sZWFuT3JOdWxsKGxlZnRUeXBlKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uaXNCb29sZWFuT3JOdWxsKHJpZ2h0VHlwZSkuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gJz09JzsKICAgIH0KCiAgICBpZiAoX2ludGVyY2VwdGVkKGxlZnRUeXBlKSkgcmV0dXJuIG51bGw7CiAgICBpZiAoX2ludGVyY2VwdGVkKHJpZ2h0VHlwZSkpIHJldHVybiBudWxsOwogICAgcmV0dXJuICc9PSc7CiAgfQoKICAvLyBUb1ByaW1pdGl2ZSBjb252ZXJzaW9ucyBvZiBhbiBvYmplY3Qgb2NjdXIgd2hlbiB0aGUgb3RoZXIgb3BlcmFuZCBpcyBhCiAgLy8gcHJpbWl0aXZlIChOdW1iZXIsIFN0cmluZywgU3ltYm9sIGFuZCwgaW5kaXJlY3RseSwgQm9vbGVhbikuIFdlIHVzZQogIC8vICdpbnRlcmNlcHRlZCcgdHlwZXMgYXMgYSBwcm94eSBmb3IgYWxsIHRoZSBwcmltaXRpdmUgdHlwZXMuCiAgYm9vbCBfaW50ZXJjZXB0ZWQoQWJzdHJhY3RWYWx1ZSB0eXBlKSA9PiBfYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAuaXNJbnRlcmNlcHRvcihfYWJzdHJhY3RWYWx1ZURvbWFpbi5leGNsdWRlTnVsbCh0eXBlKSkKICAgICAgLmlzUG90ZW50aWFsbHlUcnVlOwoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRJbnZva2VEeW5hbWljKEhJbnZva2VEeW5hbWljIG5vZGUpIHsKICAgIHRyeVJlcGxhY2VFeHBsaWNpdFJlY2VpdmVyV2l0aER1bW15KAogICAgICAgIG5vZGUsIG5vZGUuc2VsZWN0b3IsIG5vZGUuZWxlbWVudCwgbm9kZS5yZWNlaXZlclR5cGUpOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRJbnZva2VTdXBlcihISW52b2tlU3VwZXIgbm9kZSkgewogICAgdHJ5UmVwbGFjZUV4cGxpY2l0UmVjZWl2ZXJXaXRoRHVtbXkoCiAgICAgICAgbm9kZSwgbm9kZS5zZWxlY3Rvciwgbm9kZS5lbGVtZW50LCBudWxsKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0T25lU2hvdEludGVyY2VwdG9yKEhPbmVTaG90SW50ZXJjZXB0b3Igbm9kZSkgewogICAgLy8gVGhlIHJlY2VpdmVyIHBhcmFtZXRlciBzaG91bGQgbmV2ZXIgYmUgcmVwbGFjZWQgd2l0aCBhIGR1bW15IGNvbnN0YW50LgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICB2b2lkIHRyeVJlcGxhY2VFeHBsaWNpdFJlY2VpdmVyV2l0aER1bW15KEhJbnZva2Ugbm9kZSwgU2VsZWN0b3Igc2VsZWN0b3IsCiAgICAgIE1lbWJlckVudGl0eSB0YXJnZXQsIEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgLy8gQ2FsbHMgb2YgdGhlIGZvcm0KICAgIC8vCiAgICAvLyAgICAgYS5mb28kMShhLCB4KQogICAgLy8KICAgIC8vIHdoZXJlIHRoZSBpbnRlcmNlcHRvciBjYWxsaW5nIGNvbnZlbnRpb24gaXMgdXNlZCBjb21lIGZyb20gcmVjb2duaXppbmcKICAgIC8vIHRoYXQgJ2EnIGlzIGEgJ3NlbGYtaW50ZXJjZXB0b3InLiAgSWYgdGhlIHNlbGVjdG9yIG1hdGNoZXMgb25seSBtZXRob2RzCiAgICAvLyB0aGF0IGlnbm9yZSB0aGUgZXhwbGljaXQgcmVjZWl2ZXIgcGFyYW1ldGVyLCByZXBsYWNlIG9jY3VycmVuY2VzIG9mIHRoZQogICAgLy8gcmVjZWl2ZXIgYXJndW1lbnQgd2l0aCBhIGR1bW15IHJlY2VpdmVyICcwJzoKICAgIC8vCiAgICAvLyAgICAgYS5mb28kMShhLCB4KSAgIC0tLT4gICBhLmZvbyQxKDAsIHgpCiAgICAvLwogICAgLy8gVGhpcyBvZnRlbiByZWR1Y2VzIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byAnYScgdG8gb25lLCBhbGxvd2luZyAnYScKICAgIC8vIHRvIGJlIGdlbmVyYXRlZCBhdCB1c2UgdG8gYXZvaWQgYSB0ZW1wb3JhcnksIGUuZy4KICAgIC8vCiAgICAvLyAgICAgdDEgPSBiLmdldCR0aGluZygpOwogICAgLy8gICAgIHQxLmZvbyQxKHQxLCB4KQogICAgLy8gLS0tPgogICAgLy8gICAgIGIuZ2V0JHRoaW5nKCkuZm9vJDEoMCwgeCkKICAgIC8vCiAgICBhc3NlcnQodGFyZ2V0ICE9IG51bGwgfHwgbWFzayAhPSBudWxsKTsKCiAgICBpZiAoIW5vZGUuaXNJbnRlcmNlcHRlZENhbGwpIHJldHVybjsKCiAgICAvLyBUT0RPKDE1OTMzKTogTWFrZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBwcm9wZXJ0eSBleHRyYWN0aW9uIGNsb3N1cmVzCiAgICAvLyB3b3JrIHdpdGggdGhlIGR1bW15IHJlY2VpdmVyIG9wdGltaXphdGlvbi4KICAgIGlmIChzZWxlY3Rvci5pc0dldHRlcikgcmV0dXJuOwoKICAgIC8vIFRoaXMgYXNzaWdubWVudCBvZiBpbnB1dHMgaXMgdW5pZm9ybSBmb3IgSEludm9rZUR5bmFtaWMgYW5kIEhJbnZva2VTdXBlci4KICAgIEhJbnN0cnVjdGlvbiBpbnRlcmNlcHRvciA9IG5vZGUuaW5wdXRzWzBdOwogICAgSEluc3RydWN0aW9uIHJlY2VpdmVyQXJndW1lbnQgPSBub2RlLmlucHV0c1sxXTsKCiAgICAvLyBBICdzZWxmLWludGVyY2VwdG9yJz8KICAgIGlmIChpbnRlcmNlcHRvci5ub25DaGVjaygpICE9IHJlY2VpdmVyQXJndW1lbnQubm9uQ2hlY2soKSkgcmV0dXJuOwoKICAgIC8vIFRPRE8oc3JhKTogU2hvdWxkIHRoaXMgYmUgYW4gYXNzZXJ0PwogICAgaWYgKCFfaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRTZWxlY3RvcihzZWxlY3RvcikpIHJldHVybjsKCiAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKICAgICAgLy8gQSBjYWxsIHRoYXQgcmVzb2x2ZXMgdG8gYSBzaW5nbGUgaW5zdGFuY2UgbWV0aG9kIChlbGVtZW50KSByZXF1aXJlcyB0aGUKICAgICAgLy8gY2FsbGluZyBjb252ZW50aW9uIGNvbnNpc3RlbnQgd2l0aCB0aGUgbWV0aG9kLgogICAgICBDbGFzc0VudGl0eSBjbHMgPSB0YXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIGFzc2VydChfaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRNZXRob2QodGFyZ2V0KSk7CiAgICAgIGlmIChfaW50ZXJjZXB0b3JEYXRhLmlzSW50ZXJjZXB0ZWRDbGFzcyhjbHMpKSByZXR1cm47CiAgICB9IGVsc2UgaWYgKF9pbnRlcmNlcHRvckRhdGEuaXNJbnRlcmNlcHRlZE1peGluU2VsZWN0b3IoCiAgICAgICAgc2VsZWN0b3IsIG1hc2ssIF9jbG9zZWRXb3JsZCkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQgPQogICAgICAgIER1bW15SW50ZXJjZXB0b3JDb25zdGFudFZhbHVlKHJlY2VpdmVyQXJndW1lbnQuaW5zdHJ1Y3Rpb25UeXBlKTsKICAgIEhDb25zdGFudCBkdW1teSA9IGdyYXBoLmFkZENvbnN0YW50KGNvbnN0YW50LCBfY2xvc2VkV29ybGQpOwogICAgcmVjZWl2ZXJBcmd1bWVudC51c2VkQnkucmVtb3ZlKG5vZGUpOwogICAgbm9kZS5pbnB1dHNbMV0gPSBkdW1teTsKICAgIGR1bW15LnVzZWRCeS5hZGQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRGaWVsZFNldChIRmllbGRTZXQgc2V0dGVyKSB7CiAgICAvLyBQYXR0ZXJuIG1hdGNoCiAgICAvLyAgICAgdDEgPSB4LmY7IHQyID0gdDEgKyAxOyB4LmYgPSB0MjsgdXNlKHQyKSAgIC0tPiAgKyt4LmYKICAgIC8vICAgICB0MSA9IHguZjsgdDIgPSB0MSBvcCB5OyB4LmYgPSB0MjsgdXNlKHQyKSAgLS0+ICB4LmYgb3A9IHkKICAgIC8vICAgICB0MSA9IHguZjsgdDIgPSB0MSArIDE7IHguZiA9IHQyOyB1c2UodDEpICAgLS0+ICB4LmYrKwogICAgSEJhc2ljQmxvY2sgYmxvY2sgPSBzZXR0ZXIuYmxvY2s7CiAgICBISW5zdHJ1Y3Rpb24gb3AgPSBzZXR0ZXIudmFsdWU7CiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBzZXR0ZXIucmVjZWl2ZXI7CgogICAgYm9vbCBpc01hdGNoaW5nUmVhZChISW5zdHJ1Y3Rpb24gY2FuZGlkYXRlKSB7CiAgICAgIGlmIChjYW5kaWRhdGUgaXMgSEZpZWxkR2V0KSB7CiAgICAgICAgaWYgKGNhbmRpZGF0ZS5lbGVtZW50ICE9IHNldHRlci5lbGVtZW50KSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKGNhbmRpZGF0ZS5yZWNlaXZlciAhPSBzZXR0ZXIucmVjZWl2ZXIpIHJldHVybiBmYWxzZTsKICAgICAgICAvLyBSZWNvZ25pemUgb25seSB0aHJlZSBpbnN0cnVjdGlvbnMgaW4gc2VxdWVuY2UgaW4gdGhlIHNhbWUgYmxvY2suIFRoaXMKICAgICAgICAvLyBjb3VsZCBiZSBicm9hZGVuZWQgdG8gYWxsb3cgbm9uLWludGVyZmVyaW5nIGludGVybGVhdmVkIGluc3RydWN0aW9ucy4KICAgICAgICBpZiAob3AuYmxvY2sgIT0gYmxvY2spIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoY2FuZGlkYXRlLmJsb2NrICE9IGJsb2NrKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKHNldHRlci5wcmV2aW91cyAhPSBvcCkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChvcC5wcmV2aW91cyAhPSBjYW5kaWRhdGUpIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgSEluc3RydWN0aW9uIG5vTWF0Y2hpbmdSZWFkKCkgewogICAgICAvLyBJZiB3ZSBoYXZlIG90aGVyIEhGaWVsZFNldCBvcHRpbWl6YXRpb25zLCB0aGV5IGdvIGhlcmUuCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiByZXBsYWNlT3AoSEluc3RydWN0aW9uIHJlcGxhY2VtZW50LCBISW5zdHJ1Y3Rpb24gZ2V0dGVyKSB7CiAgICAgIGJsb2NrLmFkZEJlZm9yZShzZXR0ZXIsIHJlcGxhY2VtZW50KTsKICAgICAgYmxvY2sucmVtb3ZlKHNldHRlcik7CiAgICAgIGJsb2NrLnJld3JpdGUob3AsIHJlcGxhY2VtZW50KTsKICAgICAgYmxvY2sucmVtb3ZlKG9wKTsKICAgICAgYmxvY2sucmVtb3ZlKGdldHRlcik7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiBwbHVzT3JNaW51cyhTdHJpbmcgYXNzaWduT3AsIFN0cmluZyBpbmNyZW1lbnRPcCkgewogICAgICBISW52b2tlQmluYXJ5IGJpbmFyeSA9IG9wOwogICAgICBISW5zdHJ1Y3Rpb24gbGVmdCA9IGJpbmFyeS5sZWZ0OwogICAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBiaW5hcnkucmlnaHQ7CiAgICAgIGlmIChpc01hdGNoaW5nUmVhZChsZWZ0KSkgewogICAgICAgIGlmIChsZWZ0LnVzZWRCeS5sZW5ndGggPT0gMSkgewogICAgICAgICAgaWYgKHJpZ2h0IGlzIEhDb25zdGFudCAmJiByaWdodC5jb25zdGFudC5pc09uZSkgewogICAgICAgICAgICBISW5zdHJ1Y3Rpb24gcm13ID0gbmV3IEhSZWFkTW9kaWZ5V3JpdGUucHJlT3AoCiAgICAgICAgICAgICAgICBzZXR0ZXIuZWxlbWVudCwgaW5jcmVtZW50T3AsIHJlY2VpdmVyLCBvcC5pbnN0cnVjdGlvblR5cGUpOwogICAgICAgICAgICByZXR1cm4gcmVwbGFjZU9wKHJtdywgbGVmdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBISW5zdHJ1Y3Rpb24gcm13ID0gbmV3IEhSZWFkTW9kaWZ5V3JpdGUuYXNzaWduT3AoCiAgICAgICAgICAgICAgICBzZXR0ZXIuZWxlbWVudCwgYXNzaWduT3AsIHJlY2VpdmVyLCByaWdodCwgb3AuaW5zdHJ1Y3Rpb25UeXBlKTsKICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VPcChybXcsIGxlZnQpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AudXNlZEJ5Lmxlbmd0aCA9PSAxICYmCiAgICAgICAgICAgIHJpZ2h0IGlzIEhDb25zdGFudCAmJgogICAgICAgICAgICByaWdodC5jb25zdGFudC5pc09uZSkgewogICAgICAgICAgSEluc3RydWN0aW9uIHJtdyA9IG5ldyBIUmVhZE1vZGlmeVdyaXRlLnBvc3RPcCgKICAgICAgICAgICAgICBzZXR0ZXIuZWxlbWVudCwgaW5jcmVtZW50T3AsIHJlY2VpdmVyLCBvcC5pbnN0cnVjdGlvblR5cGUpOwogICAgICAgICAgYmxvY2suYWRkQWZ0ZXIobGVmdCwgcm13KTsKICAgICAgICAgIGJsb2NrLnJlbW92ZShzZXR0ZXIpOwogICAgICAgICAgYmxvY2sucmVtb3ZlKG9wKTsKICAgICAgICAgIGJsb2NrLnJld3JpdGUobGVmdCwgcm13KTsKICAgICAgICAgIGJsb2NrLnJlbW92ZShsZWZ0KTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbm9NYXRjaGluZ1JlYWQoKTsKICAgIH0KCiAgICBISW5zdHJ1Y3Rpb24gc2ltcGxlKAogICAgICAgIFN0cmluZyBhc3NpZ25PcCwgSEluc3RydWN0aW9uIGxlZnQsIEhJbnN0cnVjdGlvbiByaWdodCkgewogICAgICBpZiAoaXNNYXRjaGluZ1JlYWQobGVmdCkpIHsKICAgICAgICBpZiAobGVmdC51c2VkQnkubGVuZ3RoID09IDEpIHsKICAgICAgICAgIEhJbnN0cnVjdGlvbiBybXcgPSBuZXcgSFJlYWRNb2RpZnlXcml0ZS5hc3NpZ25PcCgKICAgICAgICAgICAgICBzZXR0ZXIuZWxlbWVudCwgYXNzaWduT3AsIHJlY2VpdmVyLCByaWdodCwgb3AuaW5zdHJ1Y3Rpb25UeXBlKTsKICAgICAgICAgIHJldHVybiByZXBsYWNlT3Aocm13LCBsZWZ0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vTWF0Y2hpbmdSZWFkKCk7CiAgICB9CgogICAgSEluc3RydWN0aW9uIHNpbXBsZUJpbmFyeShTdHJpbmcgYXNzaWduT3ApIHsKICAgICAgSEludm9rZUJpbmFyeSBiaW5hcnkgPSBvcDsKICAgICAgcmV0dXJuIHNpbXBsZShhc3NpZ25PcCwgYmluYXJ5LmxlZnQsIGJpbmFyeS5yaWdodCk7CiAgICB9CgogICAgSEluc3RydWN0aW9uIGJpdG9wKFN0cmluZyBhc3NpZ25PcCkgewogICAgICAvLyBIQml0QW5kLCBIQml0T3IgZXRjLiBhcmUgbW9yZSBkaWZmaWN1bHQgYmVjYXVzZSBIQml0QW5kKGEueCwgeSkKICAgICAgLy8gc29tZXRpbWVzIG5lZWRzIHRvIGJlIGZvcmNlZCB0byB1bnNpZ25lZDogYS54ID0gKGEueCAmIHkpID4+PiAwLgogICAgICBpZiAob3AuaXNVSW50MzEoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICByZXR1cm4gc2ltcGxlQmluYXJ5KGFzc2lnbk9wKTsKICAgICAgfQogICAgICByZXR1cm4gbm9NYXRjaGluZ1JlYWQoKTsKICAgIH0KCiAgICBpZiAob3AgaXMgSEFkZCkgcmV0dXJuIHBsdXNPck1pbnVzKCcrJywgJysrJyk7CiAgICBpZiAob3AgaXMgSFN1YnRyYWN0KSByZXR1cm4gcGx1c09yTWludXMoJy0nLCAnLS0nKTsKCiAgICBpZiAob3AgaXMgSFN0cmluZ0NvbmNhdCkgcmV0dXJuIHNpbXBsZSgnKycsIG9wLmxlZnQsIG9wLnJpZ2h0KTsKCiAgICBpZiAob3AgaXMgSE11bHRpcGx5KSByZXR1cm4gc2ltcGxlQmluYXJ5KCcqJyk7CiAgICBpZiAob3AgaXMgSERpdmlkZSkgcmV0dXJuIHNpbXBsZUJpbmFyeSgnLycpOwoKICAgIGlmIChvcCBpcyBIQml0QW5kKSByZXR1cm4gYml0b3AoJyYnKTsKICAgIGlmIChvcCBpcyBIQml0T3IpIHJldHVybiBiaXRvcCgnfCcpOwogICAgaWYgKG9wIGlzIEhCaXRYb3IpIHJldHVybiBiaXRvcCgnXicpOwoKICAgIHJldHVybiBub01hdGNoaW5nUmVhZCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJZihISWYgbm9kZSkgewogICAgaWYgKCFfb3B0aW9ucy5leHBlcmltZW50VG9Cb29sZWFuKSByZXR1cm4gbm9kZTsKICAgIEhJbnN0cnVjdGlvbiBjb25kaXRpb24gPSBub2RlLmlucHV0cy5zaW5nbGU7CiAgICAvLyBpZiAoeCAhPSBudWxsKSAtLT4gaWYgKHgpCiAgICBpZiAoY29uZGl0aW9uIGlzIEhOb3QpIHsKICAgICAgSEluc3RydWN0aW9uIHRlc3QgPSBjb25kaXRpb24uaW5wdXRzLnNpbmdsZTsKICAgICAgaWYgKHRlc3QgaXMgSElkZW50aXR5KSB7CiAgICAgICAgSEluc3RydWN0aW9uIG9wZXJhbmQxID0gdGVzdC5pbnB1dHNbMF07CiAgICAgICAgSEluc3RydWN0aW9uIG9wZXJhbmQyID0gdGVzdC5pbnB1dHNbMV07CiAgICAgICAgaWYgKG9wZXJhbmQyLmlzTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgICAgICAhX2ludGVyY2VwdGVkKG9wZXJhbmQxLmluc3RydWN0aW9uVHlwZSkpIHsKICAgICAgICAgIGlmICh0ZXN0LnVzZWRCeS5sZW5ndGggPT0gMSAmJiBjb25kaXRpb24udXNlZEJ5Lmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgIG5vZGUuY2hhbmdlVXNlKGNvbmRpdGlvbiwgb3BlcmFuZDEpOwogICAgICAgICAgICBjb25kaXRpb24uYmxvY2sucmVtb3ZlKGNvbmRpdGlvbik7CiAgICAgICAgICAgIHRlc3QuYmxvY2sucmVtb3ZlKHRlc3QpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gaWYgKHggPT0gbnVsbCkgPT4gaWYgKCF4KQogICAgaWYgKGNvbmRpdGlvbiBpcyBISWRlbnRpdHkgJiYgY29uZGl0aW9uLnVzZWRCeS5sZW5ndGggPT0gMSkgewogICAgICBISW5zdHJ1Y3Rpb24gb3BlcmFuZDEgPSBjb25kaXRpb24uaW5wdXRzWzBdOwogICAgICBISW5zdHJ1Y3Rpb24gb3BlcmFuZDIgPSBjb25kaXRpb24uaW5wdXRzWzFdOwogICAgICBpZiAob3BlcmFuZDIuaXNOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgICAhX2ludGVyY2VwdGVkKG9wZXJhbmQxLmluc3RydWN0aW9uVHlwZSkpIHsKICAgICAgICB2YXIgbm90ID0gSE5vdChvcGVyYW5kMSwgX2Fic3RyYWN0VmFsdWVEb21haW4uYm9vbFR5cGUpOwogICAgICAgIG5vZGUuYmxvY2suYWRkQmVmb3JlKG5vZGUsIG5vdCk7CiAgICAgICAgbm9kZS5jaGFuZ2VVc2UoY29uZGl0aW9uLCBub3QpOwogICAgICAgIGNvbmRpdGlvbi5ibG9jay5yZW1vdmUoY29uZGl0aW9uKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQp9CgovLy8gUmVtb3ZlIFtIVHlwZUtub3duXSBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgZ3JhcGgsIHRvIG1ha2UgY29kZWdlbgovLy8gYW5hbHlzaXMgZWFzaWVyLgpjbGFzcyBTc2FUeXBlS25vd25SZW1vdmVyIGV4dGVuZHMgSEJhc2VWaXNpdG9yIHdpdGggQ29kZWdlblBoYXNlIHsKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICB2aXNpdERvbWluYXRvclRyZWUoZ3JhcGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IGJsb2NrLmZpcnN0OwogICAgd2hpbGUgKGluc3RydWN0aW9uICE9IG51bGwpIHsKICAgICAgSEluc3RydWN0aW9uIG5leHQgPSBpbnN0cnVjdGlvbi5uZXh0OwogICAgICBpbnN0cnVjdGlvbi5hY2NlcHQodGhpcyk7CiAgICAgIGluc3RydWN0aW9uID0gbmV4dDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlS25vd24oSFR5cGVLbm93biBpbnN0cnVjdGlvbikgewogICAgZm9yIChISW5zdHJ1Y3Rpb24gdXNlciBpbiBpbnN0cnVjdGlvbi51c2VkQnkpIHsKICAgICAgaWYgKHVzZXIgaXMgSFR5cGVDb252ZXJzaW9uKSB7CiAgICAgICAgdXNlci5pbnB1dFR5cGUgPSBpbnN0cnVjdGlvbi5pbnN0cnVjdGlvblR5cGU7CiAgICAgIH0gZWxzZSBpZiAodXNlciBpcyBIUHJpbWl0aXZlQ2hlY2spIHsKICAgICAgICB1c2VyLmlucHV0VHlwZSA9IGluc3RydWN0aW9uLmluc3RydWN0aW9uVHlwZTsKICAgICAgfQogICAgfQogICAgaW5zdHJ1Y3Rpb24uYmxvY2sucmV3cml0ZShpbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb24uY2hlY2tlZElucHV0KTsKICAgIGluc3RydWN0aW9uLmJsb2NrLnJlbW92ZShpbnN0cnVjdGlvbik7CiAgfQp9CgovLy8gUmVtb3ZlIFtIUHJpbWl0aXZlQ2hlY2tdIGluc3RydWN0aW9ucyBmcm9tIHRoZSBncmFwaCBpbiAnLS10cnVzdC1wcmltaXRpdmVzJwovLy8gbW9kZS4KY2xhc3MgU3NhVHJ1c3RlZENoZWNrUmVtb3ZlciBleHRlbmRzIEhCYXNlVmlzaXRvciB3aXRoIENvZGVnZW5QaGFzZSB7CiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9vcHRpb25zOwoKICBTc2FUcnVzdGVkQ2hlY2tSZW1vdmVyKHRoaXMuX29wdGlvbnMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICBpZiAoIV9vcHRpb25zLnRydXN0UHJpbWl0aXZlcykgcmV0dXJuOwogICAgdmlzaXREb21pbmF0b3JUcmVlKGdyYXBoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCYXNpY0Jsb2NrKEhCYXNpY0Jsb2NrIGJsb2NrKSB7CiAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSBibG9jay5maXJzdDsKICAgIHdoaWxlIChpbnN0cnVjdGlvbiAhPSBudWxsKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBuZXh0ID0gaW5zdHJ1Y3Rpb24ubmV4dDsKICAgICAgaW5zdHJ1Y3Rpb24uYWNjZXB0KHRoaXMpOwogICAgICBpbnN0cnVjdGlvbiA9IG5leHQ7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJpbWl0aXZlQ2hlY2soSFByaW1pdGl2ZUNoZWNrIGluc3RydWN0aW9uKSB7CiAgICBpbnN0cnVjdGlvbi5ibG9jay5yZXdyaXRlKGluc3RydWN0aW9uLCBpbnN0cnVjdGlvbi5jaGVja2VkSW5wdXQpOwogICAgaW5zdHJ1Y3Rpb24uYmxvY2sucmVtb3ZlKGluc3RydWN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb29sQ29udmVyc2lvbihIQm9vbENvbnZlcnNpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGluc3RydWN0aW9uLmJsb2NrLnJld3JpdGUoaW5zdHJ1Y3Rpb24sIGluc3RydWN0aW9uLmNoZWNrZWRJbnB1dCk7CiAgICBpbnN0cnVjdGlvbi5ibG9jay5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogIH0KfQoKLy8vIFVzZSB0aGUgcmVzdWx0IG9mIHN0YXRpYyBhbmQgZmllbGQgYXNzaWdubWVudHMgd2hlcmUgaXQgaXMgcHJvZml0YWJsZSB0byB1c2UKLy8vIHRoZSByZXN1bHQgb2YgdGhlIGFzc2lnbm1lbnQgaW5zdGVhZCBvZiB0aGUgdmFsdWUuCi8vLwovLy8gICAgIGEueCA9IHY7Ci8vLyAgICAgYi55ID0gdjsKLy8vIC0tPgovLy8gICAgIGIueSA9IGEueCA9IHY7CmNsYXNzIFNzYUFzc2lnbm1lbnRDaGFpbmluZyBleHRlbmRzIEhCYXNlVmlzaXRvciB3aXRoIENvZGVnZW5QaGFzZSB7CiAgZmluYWwgSkNsb3NlZFdvcmxkIF9jbG9zZWRXb3JsZDsKICBmaW5hbCBDb21waWxlck9wdGlvbnMgX29wdGlvbnM7CiAgLy9IR3JhcGggZ3JhcGg7CgogIFNzYUFzc2lnbm1lbnRDaGFpbmluZyh0aGlzLl9vcHRpb25zLCB0aGlzLl9jbG9zZWRXb3JsZCk7CgogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IF9hYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIF9jbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICAvL3RoaXMuZ3JhcGggPSBncmFwaDsKICAgIHZpc2l0RG9taW5hdG9yVHJlZShncmFwaCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gYmxvY2suZmlyc3Q7CiAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLmFjY2VwdCh0aGlzKTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSBuZXh0IGluc3RydWN0aW9uLgogIEBvdmVycmlkZQogIEhJbnN0cnVjdGlvbiB2aXNpdEluc3RydWN0aW9uKEhJbnN0cnVjdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbm9kZS5uZXh0OwogIH0KCiAgQG92ZXJyaWRlCiAgSEluc3RydWN0aW9uIHZpc2l0RmllbGRTZXQoSEZpZWxkU2V0IHNldHRlcikgewogICAgcmV0dXJuIHRyeUNoYWluQXNzaWdubWVudChzZXR0ZXIsIHNldHRlci52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBISW5zdHJ1Y3Rpb24gdmlzaXRTdGF0aWNTdG9yZShIU3RhdGljU3RvcmUgc3RvcmUpIHsKICAgIHJldHVybiB0cnlDaGFpbkFzc2lnbm1lbnQoc3RvcmUsIHN0b3JlLmlucHV0cy5zaW5nbGUpOwogIH0KCiAgSEluc3RydWN0aW9uIHRyeUNoYWluQXNzaWdubWVudChISW5zdHJ1Y3Rpb24gc2V0dGVyLCBISW5zdHJ1Y3Rpb24gdmFsdWUpIHsKICAgIC8vIFRyeSB0byB1c2UgcmVzdWx0IG9mIGZpZWxkIG9yIHN0YXRpYyBhc3NpZ25tZW50CiAgICAvLwogICAgLy8gICAgIHQxID0gdjsgIHguZiA9IHQxOyAgLi4uIHQxIC4uLgogICAgLy8gLS0+CiAgICAvLyAgICAgdDEgPSB4LmYgPSB2OyAgLi4uIHQxIC4uLgogICAgLy8KCiAgICAvLyBTaW5nbGUgdXNlIGlzIHRoaXMgc2V0dGVyIHNvIHRoZXJlIHdpbGwgYmUgbm8gb3RoZXIgdXNlcyB0byBjaGFpbiB0by4KICAgIGlmICh2YWx1ZS51c2VkQnkubGVuZ3RoIDw9IDEpIHJldHVybiBzZXR0ZXIubmV4dDsKCiAgICAvLyBJdCBpcyBhbHdheXMgd29ydGh3aGlsZSBjaGFpbmluZyBpbnRvIGFub3RoZXIgc2V0dGVyLCBzaW5jZSBpdCByZWR1Y2VzCiAgICAvLyB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZXMgdG8gW3ZhbHVlXS4KICAgIEhJbnN0cnVjdGlvbiBjaGFpbiA9IHNldHRlcjsKICAgIHNldHRlci5pbnN0cnVjdGlvblR5cGUgPSB2YWx1ZS5pbnN0cnVjdGlvblR5cGU7CiAgICBmb3IgKEhJbnN0cnVjdGlvbiBjdXJyZW50ID0gc2V0dGVyLm5leHQ7OykgewogICAgICBpZiAoY3VycmVudCBpcyBIRmllbGRTZXQpIHsKICAgICAgICBIRmllbGRTZXQgbmV4dFNldHRlciA9IGN1cnJlbnQ7CiAgICAgICAgaWYgKG5leHRTZXR0ZXIudmFsdWUgPT0gdmFsdWUgJiYgbmV4dFNldHRlci5yZWNlaXZlciAhPSB2YWx1ZSkgewogICAgICAgICAgbmV4dFNldHRlci5jaGFuZ2VVc2UodmFsdWUsIGNoYWluKTsKICAgICAgICAgIG5leHRTZXR0ZXIuaW5zdHJ1Y3Rpb25UeXBlID0gdmFsdWUuaW5zdHJ1Y3Rpb25UeXBlOwogICAgICAgICAgY2hhaW4gPSBuZXh0U2V0dGVyOwogICAgICAgICAgY3VycmVudCA9IG5leHRTZXR0ZXIubmV4dDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjdXJyZW50IGlzIEhTdGF0aWNTdG9yZSkgewogICAgICAgIEhTdGF0aWNTdG9yZSBuZXh0U3RvcmUgPSBjdXJyZW50OwogICAgICAgIGlmIChuZXh0U3RvcmUudmFsdWUgPT0gdmFsdWUpIHsKICAgICAgICAgIG5leHRTdG9yZS5jaGFuZ2VVc2UodmFsdWUsIGNoYWluKTsKICAgICAgICAgIG5leHRTdG9yZS5pbnN0cnVjdGlvblR5cGUgPSB2YWx1ZS5pbnN0cnVjdGlvblR5cGU7CiAgICAgICAgICBjaGFpbiA9IG5leHRTdG9yZTsKICAgICAgICAgIGN1cnJlbnQgPSBuZXh0U3RvcmUubmV4dDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjdXJyZW50IGlzIEhSZXR1cm4pIHsKICAgICAgICBpZiAoY3VycmVudC5pbnB1dHMuc2luZ2xlID09IHZhbHVlKSB7CiAgICAgICAgICBjdXJyZW50LmNoYW5nZVVzZSh2YWx1ZSwgY2hhaW4pOwogICAgICAgICAgcmV0dXJuIGN1cnJlbnQubmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CgogICAgZmluYWwgSEluc3RydWN0aW9uIG5leHQgPSBjaGFpbi5uZXh0OwoKICAgIGlmICh2YWx1ZS51c2VkQnkubGVuZ3RoIDw9IDEpIHJldHVybiBuZXh0OyAvLyBzZXR0ZXIgaXMgb25seSByZW1haW5pbmcgdXNlLgoKICAgIC8vIENoYWluIHRvIG90aGVyIHBsYWNlcy4KICAgIHZhciB1c2VzID0gRG9taW5hdGVkVXNlcy5vZih2YWx1ZSwgY2hhaW4sIGV4Y2x1ZGVEb21pbmF0b3I6IHRydWUpOwoKICAgIGlmICh1c2VzLmlzRW1wdHkpIHJldHVybiBuZXh0OwoKICAgIGJvb2wgc2ltcGxlU291cmNlID0gdmFsdWUgaXMgSENvbnN0YW50IHx8IHZhbHVlIGlzIEhQYXJhbWV0ZXJWYWx1ZTsKCiAgICBpZiAodXNlcy5pc1NpbmdsZXRvbikgewogICAgICB2YXIgdXNlID0gdXNlcy5zaW5nbGU7CiAgICAgIGlmICh1c2UgaXMgSFBoaSkgewogICAgICAgIC8vIEZpbHRlciBvdXQgYmFjay1lZGdlcyAtIHRoYXQgY2F1c2VzIHByb2JsZW1zIGZvciB2YXJpYWJsZQogICAgICAgIC8vIGFzc2lnbm1lbnQuCiAgICAgICAgLy8gVE9ETyhzcmEpOiBCZXR0ZXIgYW5hbHlzaXMgdG8gcGVybWl0IHBoaXMgdGhhdCBhcmUgcGFydCBvZiBhCiAgICAgICAgLy8gZm9yd2FyZHMtb25seSB0cmVlLgogICAgICAgIGlmICh1c2UuYmxvY2suaWQgPCBjaGFpbi5ibG9jay5pZCkgcmV0dXJuIG5leHQ7CiAgICAgICAgaWYgKHVzZS51c2VkQnkuYW55KChub2RlKSA9PiBub2RlIGlzIEhQaGkpKSByZXR1cm4gbmV4dDsKCiAgICAgICAgLy8gQSBmb3J3YXJkIHBoaSBvZnRlbiBoYXMgYSBuZXcgbmFtZS4gV2Ugd2FudCB0byBhdm9pZCBbdmFsdWVdIGhhdmluZyBhCiAgICAgICAgLy8gbmFtZSBhdCB0aGUgc2FtZSB0aW1lLCBzbyBjaGFpbiBpbnRvIHRoZSBwaGkgb25seSBpZiBbdmFsdWVdICgxKSB3aWxsCiAgICAgICAgLy8gbmV2ZXIgaGF2ZSBhIG5hbWUgKGxpa2UgYSBjb25zdGFudCkgKDIpIHVuYXZvaWRhYmx5IGhhcyBhIG5hbWUKICAgICAgICAvLyAoZS5nLiBhIHBhcmFtZXRlcikgb3IgKDMpIGNoYWluaW5nIHdpbGwgcmVzdWx0IGluIGEgc2luZ2xlIHVzZSB0aGF0CiAgICAgICAgLy8gdmFyaWFibGUgYWxsb2NhdG9yIGNhbiB0cnkgdG8gbmFtZSBjb25zaXN0ZW50bHkgd2l0aCB0aGUgb3RoZXIgcGhpCiAgICAgICAgLy8gaW5wdXRzLgogICAgICAgIGlmIChzaW1wbGVTb3VyY2UgfHwgdmFsdWUudXNlZEJ5Lmxlbmd0aCA8PSAyKSB7CiAgICAgICAgICBpZiAodmFsdWUuaXNQdXJlKF9hYnN0cmFjdFZhbHVlRG9tYWluKSB8fAogICAgICAgICAgICAgIHNldHRlci5wcmV2aW91cyA9PSB2YWx1ZSB8fAogICAgICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgdGVzdHMgZm9yIGltbWVkaWF0ZWx5IHByZXZpb3VzIHBoaS4KICAgICAgICAgICAgICAoc2V0dGVyLnByZXZpb3VzID09IG51bGwgJiYgdmFsdWUuYmxvY2sgPT0gc2V0dGVyLmJsb2NrKSkgewogICAgICAgICAgICB1c2VzLnJlcGxhY2VXaXRoKGNoYWluKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgICAgLy8gVE9ETyhzcmEpOiBDaGFpbnMgd2l0aCBvbmUgcmVtYWluaW5nIHBvdGVudGlhbCB1c2UgaGF2ZSB0aGUgcG90ZW50aWFsCiAgICAgIC8vIHRvIGdlbmVyYXRlIGh1Z2UgZXhwcmVzc2lvbiBjb250YWluaW5nIG1hbnkgbmVzdGVkIGFzc2lnbm1lbnRzLiBUaGlzCiAgICAgIC8vIHdpbGwgYmUgc21hbGxlciBidXQgbmVhcmx5IGltcG9zc2libGUgdG8gcmVhZC4gQXJlIHRoZXJlIGludGVyaW9yCiAgICAgIC8vIHBvc2l0aW9ucyB0aGF0IHdlIHNob3VsZCBjaGFpbiBpbnRvIGJlY2F1c2UgdGhleSBhcmUgbm90IHRvbyBkaWZmaWN1bHQKICAgICAgLy8gdG8gcmVhZD8KICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CgogICAgaWYgKHNpbXBsZVNvdXJjZSkgcmV0dXJuIG5leHQ7CgogICAgLy8gSWYgdGhlcmUgYXJlIG1hbnkgcmVtYWluaW5nIHVzZXMsIGJ1dCB0aGV5IGFyZSBhbGwgZG9taW5hdGVkIGJ5IFtjaGFpbl0sCiAgICAvLyB0aGUgdmFyaWFibGUgYWxsb2NhdG9yIHdpbGwgdHJ5IHRvIGdpdmUgdGhlbSBhbGwgdGhlIHNhbWUgbmFtZS4KICAgIGlmICh1c2VzLmxlbmd0aCA+PSAyICYmCiAgICAgICAgdmFsdWUudXNlZEJ5Lmxlbmd0aCAtIHVzZXMubGVuZ3RoIDw9IDEgJiYKICAgICAgICB2YWx1ZSA9PSB2YWx1ZS5ub25DaGVjaygpKSB7CiAgICAgIC8vIElmIFt2YWx1ZV0gaXMgYSBwaGksIGl0IG1pZ2h0IGhhdmUgYSBuYW1lLiBFeGNlcHRpb25zIGFyZSBwaGlzIHRoYXQgY2FuCiAgICAgIC8vIGJlIGNvbXBpbGVkIGludG8gZXhwcmVzc2lvbnMgbGlrZSBgYT9iOmNgIGFuZCBgYSYmYmAuIFdlIGNhbid0IHRlbGwKICAgICAgLy8gaGVyZSBpZiB0aGUgcGhpIGlzIGFuIGV4cHJlc3Npb24sIHdoaWNoIHdlIGNvdWxkIGNoYWluLCBvciBhbgogICAgICAvLyBpZi10aGVuLWVsc2Ugd2l0aCBhc3NpZ25tZW50cyB0byBhIHZhcmlhYmxlLiBJZiB3ZSB0cnkgdG8gY2hhaW4gYW4KICAgICAgLy8gaWYtdGhlbi1lbHNlIHBoaSB3ZSB3aWxsIGVuZCB1cCBnZW5lcmF0aW5nIGNvZGUgbGlrZQogICAgICAvLwogICAgICAvLyAgICAgdDIgPSB0aGlzLnggPSB0MTsgIC8vIHQxIGlzIHRoZSBwaGksIHQyIGlzIHRoZSBjaGFpbmVkIG5hbWUKICAgICAgLy8KICAgICAgaWYgKHZhbHVlIGlzIEhQaGkpIHJldHVybiBuZXh0OwoKICAgICAgLy8gV2UgbmVlZCBbdmFsdWVdIHRvIGJlIGdlbmVyYXRlLWF0LXVzZSBpbiB0aGUgc2V0dGVyIHRvIGF2b2lkIGl0IGhhdmluZwogICAgICAvLyBhIG5hbWUuIEFzIGEgcXVpY2sgY2hlY2sgZm9yIGdlbmVyYXRlLWF0LXVzZSwgYWNjZXB0IHB1cmUgYW5kCiAgICAgIC8vIGltbWVkaWF0ZWx5IHByZWNlZGluZyBpbnN0cnVjdGlvbnMuCiAgICAgIGlmICh2YWx1ZS5pc1B1cmUoX2Fic3RyYWN0VmFsdWVEb21haW4pIHx8IHNldHRlci5wcmV2aW91cyA9PSB2YWx1ZSkgewogICAgICAgIC8vIFRPRE8oc3JhKTogV2UgY2FuIHRvbGVyYXRlIGEgZmV3IG5vbi10aHJvd2luZyBsb2FkcyBiZXR3ZWVuIHNldHRlcgogICAgICAgIC8vIGFuZCB2YWx1ZS4KICAgICAgICB1c2VzLnJlcGxhY2VXaXRoKGNoYWluKTsKICAgICAgICBjaGFpbi5zb3VyY2VFbGVtZW50ID8/PSB2YWx1ZS5zb3VyY2VFbGVtZW50OwogICAgICB9CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIHJldHVybiBuZXh0OwogIH0KfQoKLy8vIEluc3RlYWQgb2YgZW1pdHRpbmcgZWFjaCBTU0EgaW5zdHJ1Y3Rpb24gd2l0aCBhIHRlbXBvcmFyeSB2YXJpYWJsZQovLy8gbWFyayBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gYmUgZW1pdHRlZCBhdCB0aGVpciB1c2Utc2l0ZS4KLy8vIEZvciBleGFtcGxlLCBpbjoKLy8vICAgdDAgPSA0OwovLy8gICB0MSA9IDM7Ci8vLyAgIHQyID0gYWRkKHQwLCB0MSk7Ci8vLyB0MCBhbmQgdDEgd291bGQgYmUgbWFya2VkIGFuZCB0aGUgcmVzdWx0aW5nIGNvZGUgd291bGQgdGhlbiBiZToKLy8vICAgdDIgPSBhZGQoNCwgMyk7CmNsYXNzIFNzYUluc3RydWN0aW9uTWVyZ2VyIGV4dGVuZHMgSEJhc2VWaXNpdG9yIHdpdGggQ29kZWdlblBoYXNlIHsKICBmaW5hbCBBYnN0cmFjdFZhbHVlRG9tYWluIF9hYnN0cmFjdFZhbHVlRG9tYWluOwoKICAvLy8gTGlzdCBvZiBbSEluc3RydWN0aW9uXSB0aGF0IHRoZSBpbnN0cnVjdGlvbiBtZXJnZXIgZXhwZWN0cyBpbgogIC8vLyBvcmRlciB3aGVuIHZpc2l0aW5nIHRoZSBpbnB1dHMgb2YgYW4gaW5zdHJ1Y3Rpb24uCiAgTGlzdDxISW5zdHJ1Y3Rpb24+IGV4cGVjdGVkSW5wdXRzOwoKICAvLy8gU2V0IG9mIHB1cmUgW0hJbnN0cnVjdGlvbl0gdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gbWVyZ2VyIGV4cGVjdHMgdG8KICAvLy8gZmluZC4gVGhlIG9yZGVyIG9mIHB1cmUgaW5zdHJ1Y3Rpb25zIGRvIG5vdCBtYXR0ZXIsIGFzIHRoZXkgd2lsbAogIC8vLyBub3QgYmUgYWZmZWN0ZWQgYnkgc2lkZSBlZmZlY3RzLgogIFNldDxISW5zdHJ1Y3Rpb24+IHB1cmVJbnB1dHM7CiAgU2V0PEhJbnN0cnVjdGlvbj4gZ2VuZXJhdGVBdFVzZVNpdGU7CgogIHZvaWQgbWFya0FzR2VuZXJhdGVBdFVzZVNpdGUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBhc3NlcnQoIWluc3RydWN0aW9uLmlzSnNTdGF0ZW1lbnQoKSk7CiAgICBnZW5lcmF0ZUF0VXNlU2l0ZS5hZGQoaW5zdHJ1Y3Rpb24pOwogIH0KCiAgU3NhSW5zdHJ1Y3Rpb25NZXJnZXIodGhpcy5fYWJzdHJhY3RWYWx1ZURvbWFpbiwgdGhpcy5nZW5lcmF0ZUF0VXNlU2l0ZSk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRHcmFwaChIR3JhcGggZ3JhcGgpIHsKICAgIHZpc2l0RG9taW5hdG9yVHJlZShncmFwaCk7CiAgfQoKICB2b2lkIGFuYWx5emVJbnB1dHMoSEluc3RydWN0aW9uIHVzZXIsIGludCBzdGFydCkgewogICAgTGlzdDxISW5zdHJ1Y3Rpb24+IGlucHV0cyA9IHVzZXIuaW5wdXRzOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IGlucHV0c1tpXTsKICAgICAgaWYgKCFnZW5lcmF0ZUF0VXNlU2l0ZS5jb250YWlucyhpbnB1dCkgJiYKICAgICAgICAgICFpbnB1dC5pc0NvZGVNb3Rpb25JbnZhcmlhbnQoKSAmJgogICAgICAgICAgaW5wdXQudXNlZEJ5Lmxlbmd0aCA9PSAxICYmCiAgICAgICAgICBpbnB1dCBpcyEgSFBoaSAmJgogICAgICAgICAgaW5wdXQgaXMhIEhMb2NhbFZhbHVlICYmCiAgICAgICAgICAhaW5wdXQuaXNKc1N0YXRlbWVudCgpKSB7CiAgICAgICAgaWYgKGlzRWZmZWN0aXZlbHlQdXJlKGlucHV0KSkgewogICAgICAgICAgLy8gT25seSBjb25zaWRlciBhIHB1cmUgaW5wdXQgaWYgaXQgaXMgaW4gdGhlIHNhbWUgbG9vcC4KICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgbWlnaHQgbW92ZSBHVk4nZWQgaW5zdHJ1Y3Rpb24gYmFjayBpbnRvIHRoZQogICAgICAgICAgLy8gbG9vcC4KICAgICAgICAgIGlmICh1c2VyLmhhc1NhbWVMb29wSGVhZGVyQXMoaW5wdXQpKSB7CiAgICAgICAgICAgIC8vIE1vdmUgaXQgY2xvc2VyIHRvIFt1c2VyXSwgc28gdGhhdCBpbnN0cnVjdGlvbnMgaW4KICAgICAgICAgICAgLy8gYmV0d2VlbiBkbyBub3QgcHJldmVudCBtYWtpbmcgaXQgZ2VuZXJhdGUgYXQgdXNlIHNpdGUuCiAgICAgICAgICAgIGlucHV0Lm1vdmVCZWZvcmUodXNlcik7CiAgICAgICAgICAgIHB1cmVJbnB1dHMuYWRkKGlucHV0KTsKICAgICAgICAgICAgLy8gUHJldmlvdXMgY29tcHV0YXRpb25zIGRvbmUgb24gW2lucHV0XSBhcmUgbm93IGludmFsaWQKICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSBtb3ZlZCBbaW5wdXRdIHRvIGFub3RoZXIgcGxhY2UuIFNvIGFsbAogICAgICAgICAgICAvLyBub24gY29kZSBtb3Rpb24gaW52YXJpYW50IGluc3RydWN0aW9ucyBuZWVkCiAgICAgICAgICAgIC8vIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgW2dlbmVyYXRlQXRVc2VTaXRlXSBzZXQuCiAgICAgICAgICAgIGlucHV0LmlucHV0cy5mb3JFYWNoKChpbnN0cnVjdGlvbikgewogICAgICAgICAgICAgIGlmICghaW5zdHJ1Y3Rpb24uaXNDb2RlTW90aW9uSW52YXJpYW50KCkpIHsKICAgICAgICAgICAgICAgIGdlbmVyYXRlQXRVc2VTaXRlLnJlbW92ZShpbnN0cnVjdGlvbik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gVmlzaXQgdGhlIHB1cmUgaW5wdXQgbm93IHNvIHRoYXQgdGhlIGV4cGVjdGVkIGlucHV0cwogICAgICAgICAgICAvLyBhcmUgYWZ0ZXIgdGhlIGV4cGVjdGVkIGlucHV0cyBvZiBbdXNlcl0uCiAgICAgICAgICAgIGlucHV0LmFjY2VwdCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZXhwZWN0ZWRJbnB1dHMuYWRkKGlucHV0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFNvbWUgbm9uLXB1cmUgaW5zdHJ1Y3Rpb25zIG1heSBiZSB0cmVhdGVkIGFzIHB1cmUuIEhMb2NhbEdldCBkZXBlbmRzIG9uCiAgLy8gYXNzaWdubWVudHMsIGJ1dCB3ZSBjYW4gaWdub3JlIHRoZSBpbml0aWFsaXppbmcgYXNzaWdubWVudCBzaW5jZSBpdCB3aWxsIGJ5CiAgLy8gY29uc3RydWN0aW9uIGFsd2F5cyBwcmVjZWRlIGEgdXNlLgogIGJvb2wgaXNFZmZlY3RpdmVseVB1cmUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSExvY2FsR2V0KSByZXR1cm4gIWlzQXNzaWduZWRMb2NhbChpbnN0cnVjdGlvbi5sb2NhbCk7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb24uaXNQdXJlKF9hYnN0cmFjdFZhbHVlRG9tYWluKTsKICB9CgogIGJvb2wgaXNBc3NpZ25lZExvY2FsKEhMb2NhbFZhbHVlIGxvY2FsKSB7CiAgICAvLyBbSExvY2FsVmFsdWVdcyBoYXZlIGFuIGluaXRpYWxpemluZyBhc3NpZ25tZW50IHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8KICAgIC8vIHByZWNlZGUgdGhlIHVzZSwgZXhjZXB0IGZvciBbSFBhcmFtZXRlclZhbHVlXXMgd2hpY2ggYXJlICdhc3NpZ25lZCcgYXQKICAgIC8vIGVudHJ5LgogICAgaW50IGluaXRpYWxpemluZ0Fzc2lnbm1lbnRDb3VudCA9IChsb2NhbCBpcyBIUGFyYW1ldGVyVmFsdWUpID8gMCA6IDE7CiAgICByZXR1cm4gbG9jYWwudXNlZEJ5CiAgICAgICAgLndoZXJlKCh1c2VyKSA9PiB1c2VyIGlzIEhMb2NhbFNldCkKICAgICAgICAuc2tpcChpbml0aWFsaXppbmdBc3NpZ25tZW50Q291bnQpCiAgICAgICAgLmlzTm90RW1wdHk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdHJ1Y3Rpb24oSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICAvLyBBIGNvZGUgbW90aW9uIGludmFyaWFudCBpbnN0cnVjdGlvbiBpcyBkZWFsdCBiZWZvcmUgdmlzaXRpbmcgaXQuCiAgICBhc3NlcnQoIWluc3RydWN0aW9uLmlzQ29kZU1vdGlvbkludmFyaWFudCgpKTsKICAgIGFuYWx5emVJbnB1dHMoaW5zdHJ1Y3Rpb24sIDApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludm9rZVN1cGVyKEhJbnZva2VTdXBlciBpbnN0cnVjdGlvbikgewogICAgTWVtYmVyRW50aXR5IHN1cGVyTWV0aG9kID0gaW5zdHJ1Y3Rpb24uZWxlbWVudDsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gaW5zdHJ1Y3Rpb24uc2VsZWN0b3I7CiAgICAvLyBJZiBhbGlhc2VkIHN1cGVyIG1lbWJlcnMgY2Fubm90IGJlIHVzZWQsIHdlIHdpbGwgZ2VuZXJhdGUgY29kZSBsaWtlCiAgICAvLwogICAgLy8gICAgIEMucHJvdG90eXBlLm1ldGhvZC5jYWxsKGluc3RhbmNlKQogICAgLy8KICAgIC8vIHdoZXJlIGluc3RhbmNlIGlzIHRoZSBbdGhpc10gb2JqZWN0IGZvciB0aGUgbWV0aG9kLiBJbiBzdWNoIGEgY2FzZSwgdGhlCiAgICAvLyBnZXQgb2YgcHJvdG90eXBlIG1pZ2h0IGJlIGV2YWx1YXRlZCBiZWZvcmUgaW5zdGFuY2UgaXMgY3JlYXRlZCBpZiB3ZQogICAgLy8gZ2VuZXJhdGUgaW5zdGFuY2UgYXQgdXNlIHNpdGUsIHdoaWNoIGluIHR1cm4gbWlnaHQgdXBkYXRlIHRoZSBwcm90b3R5cGUKICAgIC8vIGFmdGVyIGZpcnN0IGFjY2VzcyBpZiB3ZSB1c2UgbGF6eSBpbml0aWFsaXphdGlvbi4KICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgdGhlcmVmb3JlIGRvbid0IGFsbG93IHRoZSByZWNlaXZlciAodGhlIGZpcnN0IGFyZ3VtZW50KQogICAgLy8gdG8gYmUgZ2VuZXJhdGVkIGF0IHVzZSBzaXRlLCBhbmQgb25seSBhbmFseXplIGFsbCBvdGhlciBhcmd1bWVudHMuCiAgICBpZiAoIWNhblVzZUFsaWFzZWRTdXBlck1lbWJlcihzdXBlck1ldGhvZCwgc2VsZWN0b3IpKSB7CiAgICAgIGFuYWx5emVJbnB1dHMoaW5zdHJ1Y3Rpb24sIDEpOwogICAgfSBlbHNlIHsKICAgICAgc3VwZXIudmlzaXRJbnZva2VTdXBlcihpbnN0cnVjdGlvbik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SXMoSElzIGluc3RydWN0aW9uKSB7CiAgICAvLyBJbiB0aGUgZ2VuZXJhbCBjYXNlIHRoZSBpbnB1dCBtaWdodCBiZSB1c2VkIG11bHRwbGUgbXVsdGlwbGUgdGltZXMsIHNvIGl0CiAgICAvLyBtdXN0IG5vdCBiZSBzZXQgZ2VuZXJhdGUgYXQgdXNlIHNpdGUuCgogICAgLy8gSWYgdGhlIGNvZGUgd2lsbCBnZW5lcmF0ZSAnaW5zdGFuY2VvZicgdGhlbiB3ZSBjYW4gZ2VuZXJhdGUgYXQgdXNlIHNpdGUuCiAgICBpZiAoaW5zdHJ1Y3Rpb24udXNlSW5zdGFuY2VPZikgewogICAgICBhbmFseXplSW5wdXRzKGluc3RydWN0aW9uLCAwKTsKICAgIH0KCiAgICAvLyBDb21wb3VuZCBhbmQgdmFyaWFibGUgY2hlY2tzIHVzZSBhIHNlcGFyYXRlIGluc3RydWN0aW9uIHRvIGNvbXB1dGUgdGhlCiAgICAvLyByZXN1bHQuCiAgICBpZiAoaW5zdHJ1Y3Rpb24uaXNDb21wb3VuZENoZWNrIHx8IGluc3RydWN0aW9uLmlzVmFyaWFibGVDaGVjaykgewogICAgICBhbmFseXplSW5wdXRzKGluc3RydWN0aW9uLCAwKTsKICAgIH0KICB9CgogIC8vIEEgYm91bmRzIGNoZWNrIG1ldGhvZCBtdXN0IG5vdCBoYXZlIGl0cyBmaXJzdCBpbnB1dCBnZW5lcmF0ZWQgYXQgdXNlIHNpdGUsCiAgLy8gYmVjYXVzZSBpdCdzIHVzaW5nIGl0IHR3aWNlLgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb3VuZHNDaGVjayhIQm91bmRzQ2hlY2sgaW5zdHJ1Y3Rpb24pIHsKICAgIGFuYWx5emVJbnB1dHMoaW5zdHJ1Y3Rpb24sIDEpOwogIH0KCiAgLy8gQW4gaWRlbnRpdHkgb3BlcmF0aW9uIG11c3Qgb25seSBoYXZlIGl0cyBpbnB1dHMgZ2VuZXJhdGVkIGF0IHVzZSBzaXRlIGlmCiAgLy8gZG9lcyBub3QgcmVxdWlyZSBhbiBleHByZXNzaW9uIHdpdGggbXVsdGlwbGUgdXNlcyAoYmVjYXVzZSBvZiBudWxsIC8KICAvLyB1bmRlZmluZWQpLgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJZGVudGl0eShISWRlbnRpdHkgaW5zdHJ1Y3Rpb24pIHsKICAgIGlmIChpbnN0cnVjdGlvbi5zaW5nbGVDb21wYXJpc29uT3AgIT0gbnVsbCkgewogICAgICBzdXBlci52aXNpdElkZW50aXR5KGluc3RydWN0aW9uKTsKICAgIH0KICAgIC8vIERvIG5vdGhpbmcuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUNvbnZlcnNpb24oSFR5cGVDb252ZXJzaW9uIGluc3RydWN0aW9uKSB7CiAgICAvLyBUeXBlIGNoZWNrcyBhbmQgY2FzdCBjaGVja3MgY29tcGlsZSB0byBjb2RlIHRoYXQgb25seSB1c2UgdGhlaXIgaW5wdXQKICAgIC8vIG9uY2UsIHNvIHdlIGNhbiBzYWZlbHkgdmlzaXQgdGhlbSBhbmQgdHJ5IHRvIG1lcmdlIHRoZSBpbnB1dC4KICAgIHZpc2l0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEFzQ2hlY2soSEFzQ2hlY2sgaW5zdHJ1Y3Rpb24pIHsKICAgIC8vIFR5cGUgY2hlY2tzIGFuZCBjYXN0IGNoZWNrcyBjb21waWxlIHRvIGNvZGUgdGhhdCBvbmx5IHVzZSB0aGVpciBpbnB1dAogICAgLy8gb25jZSwgc28gd2UgY2FuIHNhZmVseSB2aXNpdCB0aGVtIGFuZCB0cnkgdG8gbWVyZ2UgdGhlIGlucHV0LgogICAgdmlzaXRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXNDaGVja1NpbXBsZShIQXNDaGVja1NpbXBsZSBpbnN0cnVjdGlvbikgewogICAgLy8gVHlwZSBjaGVja3MgYW5kIGNhc3QgY2hlY2tzIGNvbXBpbGUgdG8gY29kZSB0aGF0IG9ubHkgdXNlIHRoZWlyIGlucHV0CiAgICAvLyBvbmNlLCBzbyB3ZSBjYW4gc2FmZWx5IHZpc2l0IHRoZW0gYW5kIHRyeSB0byBtZXJnZSB0aGUgaW5wdXQuCiAgICB2aXNpdEluc3RydWN0aW9uKGluc3RydWN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlRXZhbChIVHlwZUV2YWwgaW5zdHJ1Y3Rpb24pIHsKICAgIC8vIFR5cGUgZXhwcmVzc2lvbnMgY29tcGlsZSB0byBjb2RlIHRoYXQgb25seSB1c2UgdGhlaXIgaW5wdXQgb25jZSwgc28gd2UKICAgIC8vIGNhbiBzYWZlbHkgdmlzaXQgdGhlbSBhbmQgdHJ5IHRvIG1lcmdlIHRoZSBpbnB1dC4KICAgIHZpc2l0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFByaW1pdGl2ZUNoZWNrKEhQcmltaXRpdmVDaGVjayBpbnN0cnVjdGlvbikge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVLbm93bihIVHlwZUtub3duIGluc3RydWN0aW9uKSB7CiAgICAvLyBbSFR5cGVLbm93bl0gaW5zdHJ1Y3Rpb25zIGFyZSByZW1vdmVkIGJlZm9yZSBjb2RlIGdlbmVyYXRpb24uCiAgICBhc3NlcnQoZmFsc2UpOwogIH0KCiAgdm9pZCB0cnlHZW5lcmF0ZUF0VXNlU2l0ZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGlmIChpbnN0cnVjdGlvbi5pc0NvbnRyb2xGbG93KCkpIHJldHVybjsKICAgIG1hcmtBc0dlbmVyYXRlQXRVc2VTaXRlKGluc3RydWN0aW9uKTsKICB9CgogIGJvb2wgaXNCbG9ja1NpbmdsZVByZWRlY2Vzc29yKEhCYXNpY0Jsb2NrIGJsb2NrKSB7CiAgICByZXR1cm4gYmxvY2suc3VjY2Vzc29ycy5sZW5ndGggPT0gMSAmJgogICAgICAgIGJsb2NrLnN1Y2Nlc3NvcnNbMF0ucHJlZGVjZXNzb3JzLmxlbmd0aCA9PSAxOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIC8vIENvbXBlbnNhdGUgZnJvbSBub3QgbWVyZ2luZyBibG9ja3M6IGlmIHRoZSBibG9jayBpcyB0aGUKICAgIC8vIHNpbmdsZSBwcmVkZWNlc3NvciBvZiBpdHMgc2luZ2xlIHN1Y2Nlc3NvciwgbGV0IHRoZSBzdWNjZXNzb3IKICAgIC8vIHZpc2l0IGl0LgogICAgaWYgKGlzQmxvY2tTaW5nbGVQcmVkZWNlc3NvcihibG9jaykpIHJldHVybjsKCiAgICB0cnlNZXJnaW5nRXhwcmVzc2lvbnMoYmxvY2spOwogIH0KCiAgdm9pZCB0cnlNZXJnaW5nRXhwcmVzc2lvbnMoSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIC8vIFZpc2l0IGVhY2ggaW5zdHJ1Y3Rpb24gb2YgdGhlIGJhc2ljIGJsb2NrIGluIGxhc3QtdG8tZmlyc3Qgb3JkZXIuCiAgICAvLyBLZWVwIGEgbGlzdCBvZiBleHBlY3RlZCBpbnB1dHMgb2YgdGhlIGN1cnJlbnQgImV4cHJlc3Npb24iIGJlaW5nCiAgICAvLyBtZXJnZWQuIElmIGluc3RydWN0aW9ucyBvY2N1ciBpbiB0aGUgZXhwZWN0ZWQgb3JkZXIsIHRoZXkgYXJlCiAgICAvLyBpbmNsdWRlZCBpbiB0aGUgZXhwcmVzc2lvbi4KCiAgICAvLyBUaGUgZXhwZWN0ZWRJbnB1dHMgbGlzdCBob2xkcyBub24tdHJpdmlhbCBpbnN0cnVjdGlvbnMgdGhhdCBtYXkKICAgIC8vIGJlIGdlbmVyYXRlZCBhdCB0aGVpciB1c2Ugc2l0ZSwgaWYgdGhleSBvY2N1ciBpbiB0aGUgY29ycmVjdCBvcmRlci4KICAgIGlmIChleHBlY3RlZElucHV0cyA9PSBudWxsKSBleHBlY3RlZElucHV0cyA9IG5ldyBMaXN0PEhJbnN0cnVjdGlvbj4oKTsKICAgIGlmIChwdXJlSW5wdXRzID09IG51bGwpIHB1cmVJbnB1dHMgPSBuZXcgU2V0PEhJbnN0cnVjdGlvbj4oKTsKCiAgICAvLyBQb3AgaW5zdHJ1Y3Rpb25zIGZyb20gZXhwZWN0ZWRJbnB1dHMgdW50aWwgaW5zdHJ1Y3Rpb24gaXMgZm91bmQuCiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBmb3VuZCwgb3IgZmFsc2UgaWYgbm90LgogICAgYm9vbCBmaW5kSW5JbnB1dHNBbmRQb3BOb25NYXRjaGluZyhISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgICAgYXNzZXJ0KCFpc0VmZmVjdGl2ZWx5UHVyZShpbnN0cnVjdGlvbikpOwogICAgICB3aGlsZSAoIWV4cGVjdGVkSW5wdXRzLmlzRW1wdHkpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gbmV4dElucHV0ID0gZXhwZWN0ZWRJbnB1dHMucmVtb3ZlTGFzdCgpOwogICAgICAgIGFzc2VydCghZ2VuZXJhdGVBdFVzZVNpdGUuY29udGFpbnMobmV4dElucHV0KSk7CiAgICAgICAgYXNzZXJ0KG5leHRJbnB1dC51c2VkQnkubGVuZ3RoID09IDEpOwogICAgICAgIGlmIChpZGVudGljYWwobmV4dElucHV0LCBpbnN0cnVjdGlvbikpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgYmxvY2subGFzdC5hY2NlcHQodGhpcyk7CiAgICBmb3IgKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IGJsb2NrLmxhc3QucHJldmlvdXM7CiAgICAgICAgaW5zdHJ1Y3Rpb24gIT0gbnVsbDsKICAgICAgICBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLnByZXZpb3VzKSB7CiAgICAgIGlmIChnZW5lcmF0ZUF0VXNlU2l0ZS5jb250YWlucyhpbnN0cnVjdGlvbikpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoaW5zdHJ1Y3Rpb24uaXNDb2RlTW90aW9uSW52YXJpYW50KCkpIHsKICAgICAgICBtYXJrQXNHZW5lcmF0ZUF0VXNlU2l0ZShpbnN0cnVjdGlvbik7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGlzRWZmZWN0aXZlbHlQdXJlKGluc3RydWN0aW9uKSkgewogICAgICAgIGlmIChwdXJlSW5wdXRzLmNvbnRhaW5zKGluc3RydWN0aW9uKSkgewogICAgICAgICAgdHJ5R2VuZXJhdGVBdFVzZVNpdGUoaW5zdHJ1Y3Rpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBJZiB0aGUgaW5wdXQgaXMgbm90IGluIHRoZSBbcHVyZUlucHV0c10gc2V0LCBpdCBoYXMgbm90CiAgICAgICAgICAvLyBiZWVuIHZpc2l0ZWQgb3Igc2hvdWxkIG5vdCBiZSBnZW5lcmF0ZWQgYXQgdXNlLXNpdGUuIFRoZSBtb3N0CiAgICAgICAgICAvLyBsaWtlbHkgcmVhc29uIGZvciB0aGUgbGF0dGVyLCBpcyB0aGF0IHRoZSBpbnN0cnVjdGlvbiBpcyB1c2VkCiAgICAgICAgICAvLyBpbiBtb3JlIHRoYW4gb25lIGxvY2F0aW9uLgogICAgICAgICAgLy8gV2UgbXVzdCBlaXRoZXIgY2xlYXIgdGhlIGV4cGVjdGVkSW5wdXRzLCBvciBtb3ZlIHRoZSBwdXJlCiAgICAgICAgICAvLyBpbnN0cnVjdGlvbidzIGlucHV0cyBpbiBmcm9udCBvZiB0aGUgZXhpc3Rpbmcgb25lcy4KICAgICAgICAgIC8vIEV4YW1wbGU6CiAgICAgICAgICAvLyAgIHQxID0gZm9vKCk7ICAvLyBzaWRlLWVmZmVjdC4KICAgICAgICAgIC8vICAgdDIgPSBiYXIoKTsgIC8vIHNpZGUtZWZmZWN0LgogICAgICAgICAgLy8gICB0MyA9IHB1cmUodDIpOyAgICAvLyB1c2VkIG1vcmUgdGhhbiBvbmNlLgogICAgICAgICAgLy8gICBmKHQxLCB0Myk7ICAgLy8gZXhwZWN0ZWQgaW5wdXRzIG9mICdmJzogdDEuCiAgICAgICAgICAvLyAgIHVzZSh0Myk7CiAgICAgICAgICAvLwogICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgY2xlYXIgdGhlIGV4cGVjdGVkIGlucHV0cyB3ZSBlbmQgdXAgaW4gYSBzaXR1YXRpb24KICAgICAgICAgIC8vIHdoZXJlIHB1cmUgcHVzaGVzICJ0MiIgb24gdG9wIG9mICJ0MSIgbGVhZGluZyB0bzoKICAgICAgICAgIC8vICAgdDMgPSBwdXJlKGJhcigpKTsKICAgICAgICAgIC8vICAgZihmb28oKSwgdDMpOwogICAgICAgICAgLy8gICB1c2UodDMpOwogICAgICAgICAgLy8KICAgICAgICAgIC8vIElmIHdlIGNsZWFyIHRoZSBleHBlY3RlZC1pbnB1dHMgbGlzdCB3ZSBoYXZlIHRoZSBjb3JyZWN0CiAgICAgICAgICAvLyBvdXRwdXQ6CiAgICAgICAgICAvLyAgIHQxID0gZm9vKCk7CiAgICAgICAgICAvLyAgIHQzID0gcHVyZShiYXIoKSk7CiAgICAgICAgICAvLyAgIGYodDEsIHQzKTsKICAgICAgICAgIC8vICAgdXNlKHQzKTsKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBDbGVhcmluZyBpcywgaG93ZXZlciwgbm90IG9wdGltYWwuCiAgICAgICAgICAvLyBFeGFtcGxlOgogICAgICAgICAgLy8gICB0MSA9IGZvbygpOyAgLy8gdDEgaXMgbm93IHVzZWQgYnkgYHB1cmVgLgogICAgICAgICAgLy8gICB0MiA9IGJhcigpOyAgLy8gdDIgaXMgbm93IHVzZWQgYnkgYGZgLgogICAgICAgICAgLy8gICB0MyA9IHB1cmUodDEpOwogICAgICAgICAgLy8gICBmKHQyLCB0Myk7CiAgICAgICAgICAvLyAgIHVzZSh0Myk7CiAgICAgICAgICAvLwogICAgICAgICAgLy8gSWYgd2UgY2xlYXIgdGhlIGV4cGVjdGVkLWlucHV0cyB3ZSBjYW4ndCBnZW5lcmF0ZS1hdC11c2UgYW55IG9mCiAgICAgICAgICAvLyB0aGUgaW5zdHJ1Y3Rpb25zLgogICAgICAgICAgLy8KICAgICAgICAgIC8vIFRoZSBvcHRpbWFsIHNvbHV0aW9uIGlzIHRvIG1vdmUgdGhlIGlucHV0cyBvZiAncHVyZScgaW4KICAgICAgICAgIC8vIGZyb250IG9mIHRoZSBleHBlY3RlZElucHV0cyBsaXN0LiBUaGlzIG1ha2VzIHNlbnNlLCBzaW5jZSB3ZQogICAgICAgICAgLy8gcHVzaCBleHBlY3RlZC1pbnB1dHMgZnJvbSBsZWZ0LXRvIHJpZ2h0LCBhbmQgdGhlIGBwdXJlYCBmdW5jdGlvbgogICAgICAgICAgLy8gaW52b2NhdGlvbiBpcyAibW9yZSBsZWZ0IiAoaS5lLiBiZWZvcmUpIHRoZSBmaXJzdCBhcmd1bWVudCBvZiBgZmAuCiAgICAgICAgICAvLyBXaXRoIHRoYXQgYXBwcm9hY2ggd2UgZW5kIHVwIHdpdGg6CiAgICAgICAgICAvLyAgIHQzID0gcHVyZShmb28oKSk7CiAgICAgICAgICAvLyAgIGYoYmFyKCksIHQzKTsKICAgICAgICAgIC8vICAgdXNlKHQzKTsKICAgICAgICAgIC8vCiAgICAgICAgICBpbnQgb2xkTGVuZ3RoID0gZXhwZWN0ZWRJbnB1dHMubGVuZ3RoOwogICAgICAgICAgaW5zdHJ1Y3Rpb24uYWNjZXB0KHRoaXMpOwogICAgICAgICAgaWYgKG9sZExlbmd0aCAhPSAwICYmIG9sZExlbmd0aCAhPSBleHBlY3RlZElucHV0cy5sZW5ndGgpIHsKICAgICAgICAgICAgLy8gTW92ZSB0aGUgcHVyZSBpbnN0cnVjdGlvbidzIGlucHV0cyB0byB0aGUgZnJvbnQuCiAgICAgICAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBuZXdJbnB1dHMgPSBleHBlY3RlZElucHV0cy5zdWJsaXN0KG9sZExlbmd0aCk7CiAgICAgICAgICAgIGludCBuZXdDb3VudCA9IG5ld0lucHV0cy5sZW5ndGg7CiAgICAgICAgICAgIGV4cGVjdGVkSW5wdXRzLnNldFJhbmdlKAogICAgICAgICAgICAgICAgbmV3Q291bnQsIG5ld0NvdW50ICsgb2xkTGVuZ3RoLCBleHBlY3RlZElucHV0cyk7CiAgICAgICAgICAgIGV4cGVjdGVkSW5wdXRzLnNldFJhbmdlKDAsIG5ld0NvdW50LCBuZXdJbnB1dHMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoZmluZEluSW5wdXRzQW5kUG9wTm9uTWF0Y2hpbmcoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgICAgICAvLyBUaGUgY3VycmVudCBpbnN0cnVjdGlvbiBpcyB0aGUgbmV4dCBub24tdHJpdmlhbAogICAgICAgICAgLy8gZXhwZWN0ZWQgaW5wdXQuCiAgICAgICAgICB0cnlHZW5lcmF0ZUF0VXNlU2l0ZShpbnN0cnVjdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFzc2VydChleHBlY3RlZElucHV0cy5pc0VtcHR5KTsKICAgICAgICB9CiAgICAgICAgaW5zdHJ1Y3Rpb24uYWNjZXB0KHRoaXMpOwogICAgICB9CiAgICB9CgogICAgaWYgKGJsb2NrLnByZWRlY2Vzc29ycy5sZW5ndGggPT0gMSAmJgogICAgICAgIGlzQmxvY2tTaW5nbGVQcmVkZWNlc3NvcihibG9jay5wcmVkZWNlc3NvcnNbMF0pKSB7CiAgICAgIGFzc2VydChibG9jay5waGlzLmlzRW1wdHkpOwogICAgICB0cnlNZXJnaW5nRXhwcmVzc2lvbnMoYmxvY2sucHJlZGVjZXNzb3JzWzBdKTsKICAgIH0gZWxzZSB7CiAgICAgIGV4cGVjdGVkSW5wdXRzID0gbnVsbDsKICAgICAgcHVyZUlucHV0cyA9IG51bGw7CiAgICB9CiAgfQp9CgovLy8gIERldGVjdCBjb250cm9sIGZsb3cgYXJpc2luZyBmcm9tIHNob3J0LWNpcmN1aXQgbG9naWNhbCBhbmQKLy8vICBjb25kaXRpb25hbCBvcGVyYXRvcnMsIGFuZCBwcmVwYXJlIHRoZSBwcm9ncmFtIHRvIGJlIGdlbmVyYXRlZAovLy8gIHVzaW5nIHRoZXNlIG9wZXJhdG9ycyBpbnN0ZWFkIG9mIG5lc3RlZCBpZnMgYW5kIGJvb2xlYW4gdmFyaWFibGVzLgpjbGFzcyBTc2FDb25kaXRpb25NZXJnZXIgZXh0ZW5kcyBIR3JhcGhWaXNpdG9yIHdpdGggQ29kZWdlblBoYXNlIHsKICBTZXQ8SEluc3RydWN0aW9uPiBnZW5lcmF0ZUF0VXNlU2l0ZTsKICBTZXQ8SEluc3RydWN0aW9uPiBjb250cm9sRmxvd09wZXJhdG9yczsKCiAgdm9pZCBtYXJrQXNHZW5lcmF0ZUF0VXNlU2l0ZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGFzc2VydCghaW5zdHJ1Y3Rpb24uaXNKc1N0YXRlbWVudCgpKTsKICAgIGdlbmVyYXRlQXRVc2VTaXRlLmFkZChpbnN0cnVjdGlvbik7CiAgfQoKICBTc2FDb25kaXRpb25NZXJnZXIodGhpcy5nZW5lcmF0ZUF0VXNlU2l0ZSwgdGhpcy5jb250cm9sRmxvd09wZXJhdG9ycyk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRHcmFwaChIR3JhcGggZ3JhcGgpIHsKICAgIHZpc2l0UG9zdERvbWluYXRvclRyZWUoZ3JhcGgpOwogIH0KCiAgLy8vIENoZWNrIGlmIGEgYmxvY2sgaGFzIGF0IGxlYXN0IG9uZSBzdGF0ZW1lbnQgb3RoZXIgdGhhbgogIC8vLyBbaW5zdHJ1Y3Rpb25dLgogIGJvb2wgaGFzQW55U3RhdGVtZW50KEhCYXNpY0Jsb2NrIGJsb2NrLCBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIC8vIElmIFtpbnN0cnVjdGlvbl0gaXMgbm90IGluIFtibG9ja10sIHRoZW4gaWYgdGhlIGJsb2NrIGlzIG5vdAogICAgLy8gZW1wdHksIHdlIGtub3cgdGhlcmUgd2lsbCBiZSBhIHN0YXRlbWVudCB0byBlbWl0LgogICAgaWYgKCFpZGVudGljYWwoaW5zdHJ1Y3Rpb24uYmxvY2ssIGJsb2NrKSkgewogICAgICByZXR1cm4gIWlkZW50aWNhbChibG9jay5sYXN0LCBibG9jay5maXJzdCk7CiAgICB9CgogICAgLy8gSWYgW2luc3RydWN0aW9uXSBpcyBub3QgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gb2YgdGhlIGJsb2NrCiAgICAvLyBiZWZvcmUgdGhlIGNvbnRyb2wgZmxvdyBpbnN0cnVjdGlvbiwgb3IgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24sCiAgICAvLyB0aGVuIHdlIHdpbGwgaGF2ZSB0byBlbWl0IGEgc3RhdGVtZW50IGZvciB0aGF0IGxhc3QgaW5zdHJ1Y3Rpb24uCiAgICBpZiAoaW5zdHJ1Y3Rpb24gIT0gYmxvY2subGFzdCAmJgogICAgICAgICFpZGVudGljYWwoaW5zdHJ1Y3Rpb24sIGJsb2NrLmxhc3QucHJldmlvdXMpKSByZXR1cm4gdHJ1ZTsKCiAgICAvLyBJZiBvbmUgb2YgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgYmxvY2sgdW50aWwgW2luc3RydWN0aW9uXSBpcwogICAgLy8gbm90IGdlbmVyYXRlZCBhdCB1c2Ugc2l0ZSwgdGhlbiB3ZSB3aWxsIGhhdmUgdG8gZW1pdCBhCiAgICAvLyBzdGF0ZW1lbnQgZm9yIGl0LgogICAgLy8gVE9ETyhuZ2VvZmZyYXkpOiB3ZSBjb3VsZCBnZW5lcmF0ZSBhIGNvbW1hIHNlcGFyYXRlZAogICAgLy8gbGlzdCBvZiBleHByZXNzaW9ucy4KICAgIGZvciAoSEluc3RydWN0aW9uIHRlbXAgPSBibG9jay5maXJzdDsKICAgICAgICAhaWRlbnRpY2FsKHRlbXAsIGluc3RydWN0aW9uKTsKICAgICAgICB0ZW1wID0gdGVtcC5uZXh0KSB7CiAgICAgIGlmICghZ2VuZXJhdGVBdFVzZVNpdGUuY29udGFpbnModGVtcCkpIHJldHVybiB0cnVlOwogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGJvb2wgaXNTYWZlVG9HZW5lcmF0ZUF0VXNlU2l0ZShISW5zdHJ1Y3Rpb24gdXNlciwgSEluc3RydWN0aW9uIGlucHV0KSB7CiAgICAvLyBIQ3JlYXRlIGV2YWx1YXRlcyBhcmd1bWVudHMgaW4gb3JkZXIgYW5kIHBhc3NlcyB0aGVtIHRvIGEgY29uc3RydWN0b3IuCiAgICBpZiAodXNlciBpcyBIQ3JlYXRlKSByZXR1cm4gdHJ1ZTsKICAgIC8vIEEgW0hGb3JlaWduXSBpbnN0cnVjdGlvbiB1c2VzIG9wZXJhdG9ycyBhbmQgaWYgd2UgZ2VuZXJhdGUgW2lucHV0XSBhdCB1c2UKICAgIC8vIHNpdGUsIHRoZSBwcmVjZWRlbmNlIG9yIGV2YWx1YXRpb24gb3JkZXIgbWlnaHQgYmUgd3JvbmcuCiAgICBpZiAodXNlciBpcyBIRm9yZWlnbikgcmV0dXJuIGZhbHNlOwogICAgLy8gQSBbSENoZWNrXSBpbnN0cnVjdGlvbiB3aXRoIGNvbnRyb2wgZmxvdyB1c2VzIGl0cyBpbnB1dAogICAgLy8gbXVsdGlwbGUgdGltZXMsIHNvIHdlIGF2b2lkIGdlbmVyYXRpbmcgaXQgYXQgdXNlIHNpdGUuCiAgICBpZiAodXNlciBpcyBIQ2hlY2sgJiYgdXNlci5pc0NvbnRyb2xGbG93KCkpIHJldHVybiBmYWxzZTsKICAgIC8vIEEgW0hJc10gaW5zdHJ1Y3Rpb24gdXNlcyBpdHMgaW5wdXQgbXVsdGlwbGUgdGltZXMsIHNvIHdlCiAgICAvLyBhdm9pZCBnZW5lcmF0aW5nIGl0IGF0IHVzZSBzaXRlLgogICAgaWYgKHVzZXIgaXMgSElzKSByZXR1cm4gZmFsc2U7CiAgICAvLyBBdm9pZCBjb2RlIG1vdGlvbiBpbnRvIGEgbG9vcC4KICAgIHJldHVybiB1c2VyLmhhc1NhbWVMb29wSGVhZGVyQXMoaW5wdXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIGlmIChibG9jay5sYXN0IGlzISBISWYpIHJldHVybjsKICAgIEhJZiBzdGFydElmID0gYmxvY2subGFzdDsKICAgIEhCYXNpY0Jsb2NrIGVuZCA9IHN0YXJ0SWYuam9pbkJsb2NrOwoKICAgIC8vIFdlIGNoZWNrIHRoYXQgdGhlIHN0cnVjdHVyZSBpcyB0aGUgZm9sbG93aW5nOgogICAgLy8gICAgICAgICBJZgogICAgLy8gICAgICAgLyAgICBcCiAgICAvLyAgICAgIC8gICAgICBcCiAgICAvLyAgIDEgZXhwciAgICBnb3RvCiAgICAvLyAgICBnb3RvICAgICAvCiAgICAvLyAgICAgIFwgICAgIC8KICAgIC8vICAgICAgIFwgICAvCiAgICAvLyBwaGkoZXhwciwgdHJ1ZXxmYWxzZSkKICAgIC8vCiAgICAvLyBhbmQgdGhlIHNhbWUgZm9yIG5lc3RlZCBub2RlczoKICAgIC8vCiAgICAvLyAgICAgICAgICAgIElmCiAgICAvLyAgICAgICAgICAvICAgIFwKICAgIC8vICAgICAgICAgLyAgICAgIFwKICAgIC8vICAgICAgMSBleHByMSAgICBcCiAgICAvLyAgICAgICBJZiAgICAgICAgIFwKICAgIC8vICAgICAgLyAgXCAgICAgICAgIFwKICAgIC8vICAgICAvICAgIFwgICAgICAgICBnb3RvCiAgICAvLyAgMSBleHByMiAgICAgICAgICAgIHwKICAgIC8vICAgIGdvdG8gICAgZ290byAgICAgfAogICAgLy8gICAgICBcICAgICAvICAgICAgICB8CiAgICAvLyAgICAgICBcICAgLyAgICAgICAgIHwKICAgIC8vICAgcGhpMShleHByMiwgdHJ1ZXxmYWxzZSkKICAgIC8vICAgICAgICAgIFwgICAgICAgICAgfAogICAgLy8gICAgICAgICAgIFwgICAgICAgICB8CiAgICAvLyAgICAgICAgICAgICBwaGkocGhpMSwgdHJ1ZXxmYWxzZSkKCiAgICBpZiAoZW5kID09IG51bGwpIHJldHVybjsKICAgIGlmIChlbmQucGhpcy5pc0VtcHR5KSByZXR1cm47CiAgICBpZiAoIWlkZW50aWNhbChlbmQucGhpcy5maXJzdCwgZW5kLnBoaXMubGFzdCkpIHJldHVybjsKICAgIEhCYXNpY0Jsb2NrIGVsc2VCbG9jayA9IHN0YXJ0SWYuZWxzZUJsb2NrOwoKICAgIGlmICghaWRlbnRpY2FsKGVuZC5wcmVkZWNlc3NvcnNbMV0sIGVsc2VCbG9jaykpIHJldHVybjsKICAgIEhQaGkgcGhpID0gZW5kLnBoaXMuZmlyc3Q7CiAgICBISW5zdHJ1Y3Rpb24gdGhlbklucHV0ID0gcGhpLmlucHV0c1swXTsKICAgIEhJbnN0cnVjdGlvbiBlbHNlSW5wdXQgPSBwaGkuaW5wdXRzWzFdOwogICAgaWYgKHRoZW5JbnB1dC5pc0pzU3RhdGVtZW50KCkgfHwgZWxzZUlucHV0LmlzSnNTdGF0ZW1lbnQoKSkgcmV0dXJuOwoKICAgIGlmIChoYXNBbnlTdGF0ZW1lbnQoZWxzZUJsb2NrLCBlbHNlSW5wdXQpKSByZXR1cm47CiAgICBhc3NlcnQoZWxzZUJsb2NrLnN1Y2Nlc3NvcnMubGVuZ3RoID09IDEpOwogICAgYXNzZXJ0KGVuZC5wcmVkZWNlc3NvcnMubGVuZ3RoID09IDIpOwoKICAgIEhCYXNpY0Jsb2NrIHRoZW5CbG9jayA9IHN0YXJ0SWYudGhlbkJsb2NrOwogICAgLy8gU2tpcCB0cml2aWFsIGdvdG8gYmxvY2tzLgogICAgd2hpbGUgKHRoZW5CbG9jay5zdWNjZXNzb3JzWzBdICE9IGVuZCAmJiB0aGVuQmxvY2suZmlyc3QgaXMgSEdvdG8pIHsKICAgICAgdGhlbkJsb2NrID0gdGhlbkJsb2NrLnN1Y2Nlc3NvcnNbMF07CiAgICB9CgogICAgLy8gSWYgdGhlIFt0aGVuQmxvY2tdIGlzIGFscmVhZHkgYSBjb250cm9sIGZsb3cgb3BlcmF0aW9uLCBhbmQgZG9lcyBub3QKICAgIC8vIGhhdmUgYW55IHN0YXRlbWVudCBhbmQgaXRzIGpvaW4gYmxvY2sgaXMgW2VuZF0sIHdlIGNhbiBlbWl0IGEKICAgIC8vIHNlcXVlbmNlIG9mIGNvbnRyb2wgZmxvdyBvcGVyYXRpb24uCiAgICBpZiAoY29udHJvbEZsb3dPcGVyYXRvcnMuY29udGFpbnModGhlbkJsb2NrLmxhc3QpKSB7CiAgICAgIEhJZiBvdGhlcklmID0gdGhlbkJsb2NrLmxhc3Q7CiAgICAgIGlmICghaWRlbnRpY2FsKG90aGVySWYuam9pbkJsb2NrLCBlbmQpKSB7CiAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBhIGpvaW4gYmxvY2sgdGhhdCBqdXN0IGZlZWRzIGludG8gb3VyIGpvaW4gYmxvY2suCiAgICAgICAgSEJhc2ljQmxvY2sgb3RoZXJKb2luID0gb3RoZXJJZi5qb2luQmxvY2s7CiAgICAgICAgaWYgKG90aGVySm9pbi5maXJzdCAhPSBvdGhlckpvaW4ubGFzdCkgcmV0dXJuOwogICAgICAgIGlmIChvdGhlckpvaW4uc3VjY2Vzc29ycy5sZW5ndGggIT0gMSkgcmV0dXJuOwogICAgICAgIGlmIChvdGhlckpvaW4uc3VjY2Vzc29yc1swXSAhPSBlbmQpIHJldHVybjsKICAgICAgICBpZiAob3RoZXJKb2luLnBoaXMuaXNFbXB0eSkgcmV0dXJuOwogICAgICAgIGlmICghaWRlbnRpY2FsKG90aGVySm9pbi5waGlzLmZpcnN0LCBvdGhlckpvaW4ucGhpcy5sYXN0KSkgcmV0dXJuOwogICAgICAgIEhQaGkgb3RoZXJQaGkgPSBvdGhlckpvaW4ucGhpcy5maXJzdDsKICAgICAgICBpZiAodGhlbklucHV0ICE9IG90aGVyUGhpKSByZXR1cm47CiAgICAgICAgaWYgKGVsc2VJbnB1dCAhPSBvdGhlclBoaS5pbnB1dHNbMV0pIHJldHVybjsKICAgICAgfQogICAgICBpZiAoaGFzQW55U3RhdGVtZW50KHRoZW5CbG9jaywgb3RoZXJJZikpIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghaWRlbnRpY2FsKGVuZC5wcmVkZWNlc3NvcnNbMF0sIHRoZW5CbG9jaykpIHJldHVybjsKICAgICAgaWYgKGhhc0FueVN0YXRlbWVudCh0aGVuQmxvY2ssIHRoZW5JbnB1dCkpIHJldHVybjsKICAgICAgYXNzZXJ0KHRoZW5CbG9jay5zdWNjZXNzb3JzLmxlbmd0aCA9PSAxKTsKICAgIH0KCiAgICAvLyBGcm9tIG5vdyBvbiwgd2UgaGF2ZSByZWNvZ25pemVkIGEgY29udHJvbCBmbG93IG9wZXJhdGlvbiBidWlsdCBmcm9tCiAgICAvLyB0aGUgYnVpbGRlci4gTWFyayB0aGUgaWYgaW5zdHJ1Y3Rpb24gYXMgc3VjaC4KICAgIGNvbnRyb2xGbG93T3BlcmF0b3JzLmFkZChzdGFydElmKTsKCiAgICAvLyBGaW5kIHRoZSBuZXh0IG5vbi1IR290byBpbnN0cnVjdGlvbiBmb2xsb3dpbmcgdGhlIHBoaS4KICAgIEhJbnN0cnVjdGlvbiBuZXh0SW5zdHJ1Y3Rpb24gPSBwaGkuYmxvY2suZmlyc3Q7CiAgICB3aGlsZSAobmV4dEluc3RydWN0aW9uIGlzIEhHb3RvKSB7CiAgICAgIG5leHRJbnN0cnVjdGlvbiA9IG5leHRJbnN0cnVjdGlvbi5ibG9jay5zdWNjZXNzb3JzWzBdLmZpcnN0OwogICAgfQoKICAgIC8vIElmIHRoZSBvcGVyYXRpb24gaXMgb25seSB1c2VkIGJ5IHRoZSBmaXJzdCBpbnN0cnVjdGlvbgogICAgLy8gb2YgaXRzIGJsb2NrIGFuZCBpcyBzYWZlIHRvIGJlIGdlbmVyYXRlZCBhdCB1c2Ugc2l0ZSwgbWFyayBpdAogICAgLy8gc28uCiAgICBpZiAocGhpLnVzZWRCeS5sZW5ndGggPT0gMSAmJgogICAgICAgIHBoaS51c2VkQnlbMF0gPT0gbmV4dEluc3RydWN0aW9uICYmCiAgICAgICAgaXNTYWZlVG9HZW5lcmF0ZUF0VXNlU2l0ZShwaGkudXNlZEJ5WzBdLCBwaGkpKSB7CiAgICAgIG1hcmtBc0dlbmVyYXRlQXRVc2VTaXRlKHBoaSk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChlbHNlSW5wdXQuYmxvY2ssIGVsc2VCbG9jaykpIHsKICAgICAgYXNzZXJ0KGVsc2VJbnB1dC51c2VkQnkubGVuZ3RoID09IDEpOwogICAgICBtYXJrQXNHZW5lcmF0ZUF0VXNlU2l0ZShlbHNlSW5wdXQpOwogICAgfQoKICAgIC8vIElmIFt0aGVuSW5wdXRdIGlzIGRlZmluZWQgaW4gdGhlIGZpcnN0IHByZWRlY2Vzc29yLCB0aGVuIGl0IGlzIG9ubHkgdXNlZAogICAgLy8gYnkgW3BoaV0gYW5kIGNhbiBiZSBnZW5lcmF0ZWQgYXQgdXNlIHNpdGUuCiAgICBpZiAoaWRlbnRpY2FsKHRoZW5JbnB1dC5ibG9jaywgZW5kLnByZWRlY2Vzc29yc1swXSkpIHsKICAgICAgYXNzZXJ0KHRoZW5JbnB1dC51c2VkQnkubGVuZ3RoID09IDEpOwogICAgICBtYXJrQXNHZW5lcmF0ZUF0VXNlU2l0ZSh0aGVuSW5wdXQpOwogICAgfQogIH0KfQoKLy8vIEluc2VydCAnY2FjaGVzJyBmb3Igd2hvbGUtZnVuY3Rpb24gcmVnaW9uLWNvbnN0YW50cyB3aGVuIHRoZSBsb2NhbCBtaW5pZmllZAovLy8gbmFtZSB3b3VsZCBiZSBzaG9ydGVyIHRoYW4gcmVwZWF0ZWQgcmVmZXJlbmNlcy4gIFRoZXNlIGFyZSBjYWNoZXMgZm9yICd0aGlzJwovLy8gYW5kIGNvbnN0YW50IHZhbHVlcy4KY2xhc3MgU3NhU2hhcmVSZWdpb25Db25zdGFudHMgZXh0ZW5kcyBIQmFzZVZpc2l0b3Igd2l0aCBDb2RlZ2VuUGhhc2UgewogIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBfb3B0aW9uczsKCiAgU3NhU2hhcmVSZWdpb25Db25zdGFudHModGhpcy5fb3B0aW9ucyk7CgogIEBvdmVycmlkZQogIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICAvLyBXZSBuZWVkIHRoZSBhc3luYyByZXdyaXRlIHRvIGJlIHNtYXJ0ZXIgYWJvdXQgaG9pc3RpbmcgcmVnaW9uIGNvbnN0YW50cwogICAgLy8gYmVmb3JlIGl0IGlzIHdvcnRoLXdoaWxlLgogICAgaWYgKGdyYXBoLm5lZWRzQXN5bmNSZXdyaXRlKSByZXR1cm47CgogICAgLy8gJ0hUaGlzJyBhbmQgY29uc3RhbnRzIGFyZSBpbiB0aGUgZW50cnkgYmxvY2suIE5vIG5lZWQgdG8gd2FsayB0aGUgcmVzdCBvZgogICAgLy8gdGhlIGdyYXBoLgogICAgdmlzaXRCYXNpY0Jsb2NrKGdyYXBoLmVudHJ5KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QmFzaWNCbG9jayhIQmFzaWNCbG9jayBibG9jaykgewogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gYmxvY2suZmlyc3Q7CiAgICB3aGlsZSAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCkgewogICAgICBISW5zdHJ1Y3Rpb24gbmV4dCA9IGluc3RydWN0aW9uLm5leHQ7CiAgICAgIGluc3RydWN0aW9uLmFjY2VwdCh0aGlzKTsKICAgICAgaW5zdHJ1Y3Rpb24gPSBuZXh0OwogICAgfQogIH0KCiAgLy8gTm90IGFsbCBvY2N1cnJlbmNlcyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBhIGxvY2FsIHZhcmlhYmxlIGNhY2hlLCBzbyB3ZQogIC8vIGZpbHRlciB0aGUgdXNlcy4KICBpbnQgX2NvdW50Q2FjaGVhYmxlVXNlcygKICAgICAgSEluc3RydWN0aW9uIG5vZGUsIGJvb2wgRnVuY3Rpb24oSEluc3RydWN0aW9uKSBjYWNoZWFibGUpIHsKICAgIHJldHVybiBub2RlLnVzZWRCeS53aGVyZShjYWNoZWFibGUpLmxlbmd0aDsKICB9CgogIC8vIFJlcGxhY2UgY2FjaGVhYmxlIHVzZXMgd2l0aCBhIHJlZmVyZW5jZSB0byBhIEhMYXRlVmFsdWUgbm9kZS4KICBfY2FjaGUoCiAgICAgIEhJbnN0cnVjdGlvbiBub2RlLCBib29sIEZ1bmN0aW9uKEhJbnN0cnVjdGlvbikgY2FjaGVhYmxlLCBTdHJpbmcgbmFtZSkgewogICAgdmFyIHVzZXJzID0gbm9kZS51c2VkQnkudG9MaXN0KCk7CiAgICB2YXIgcmVmZXJlbmNlID0gbmV3IEhMYXRlVmFsdWUobm9kZSk7CiAgICAvLyBUT0RPKHNyYSk6IFRoZSBzb3VyY2VJbmZvcm1hdGlvbiBzaG91bGQgcmVhbGx5IGJlIGZyb20gdGhlIGZ1bmN0aW9uCiAgICAvLyBlbnRyeSwgbm90IHRoZSB1c2Ugb2YgYHRoaXNgLgogICAgcmVmZXJlbmNlLnNvdXJjZUluZm9ybWF0aW9uID0gbm9kZS5zb3VyY2VJbmZvcm1hdGlvbjsKICAgIHJlZmVyZW5jZS5zb3VyY2VFbGVtZW50ID0gX0V4cHJlc3Npb25OYW1lKG5hbWUpOwogICAgbm9kZS5ibG9jay5hZGRBZnRlcihub2RlLCByZWZlcmVuY2UpOwogICAgZm9yIChISW5zdHJ1Y3Rpb24gdXNlciBpbiB1c2VycykgewogICAgICBpZiAoY2FjaGVhYmxlKHVzZXIpKSB7CiAgICAgICAgdXNlci5jaGFuZ2VVc2Uobm9kZSwgcmVmZXJlbmNlKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRoaXMoSFRoaXMgbm9kZSkgewogICAgaW50IHNpemUgPSA0OwogICAgLy8gQ29tcGFyZSB0aGUgc2l6ZSBvZiB0aGUgdW5jaGFuZ2VkIG1pbmlmaWVkIHdpdGggdGhlIHNpemUgb2YgdGhlIG1pbmlmaWVkCiAgICAvLyBjb2RlIHdoZXJlICd0aGlzJyBpcyBhc3NpZ25lZCB0byBhIHZhcmlhYmxlLiBXZSBhc3N1bWUgdGhlIHZhcmlhYmxlIGhhcwogICAgLy8gbWluaWZpZWQgc2l6ZSAxLgogICAgLy8KICAgIC8vIFRoZSBzaXplIG92ZXJoZWFkIG9mIGludHJvZHVjaW5nIGEgdmFyaWFibGUgaW4gdGhlIHdvcnN0IGNhc2UgaW5jbHVkZXMKICAgIC8vICd2YXIgJzoKICAgIC8vCiAgICAvLyAgICAgICAgICAgMTIzNCAgIC8vIHNpemUKICAgIC8vICAgICB2YXIgeD10aGlzOyAgLy8gKG1pbmlmaWVkICc7JyBjYW4gYmUgZW5kLW9mLWxpbmUpCiAgICAvLyAgICAgMTIzNDU2ICAgIDcgIC8vIGFkZGl0aW9uYWwgb3ZlcmhlYWQKICAgIC8vCiAgICAvLyBUT0RPKHNyYSk6IElmIHRoZXJlIGFyZSBtdWx0aXBsZSB2YWx1ZXMgdGhhdCBjYW4gcG90ZW50aWFsbHkgYmUgY2FjaGVkLAogICAgLy8gdGhleSBjYW4gc2hhcmUgdGhlICd2YXIgJyBjb3N0LCBldmVuIGlmIG5vbmUgb2YgdGhlbSBhcmUgYmVuZWZpY2lhbAogICAgLy8gaW5kaXZpZHVhbGx5LgogICAgaW50IHVzZUNvdW50ID0gbm9kZS51c2VkQnkubGVuZ3RoOwogICAgaWYgKHVzZUNvdW50ICogc2l6ZSA8PSA3ICsgc2l6ZSArIHVzZUNvdW50ICogMSkgcmV0dXJuOwogICAgX2NhY2hlKG5vZGUsIChfKSA9PiB0cnVlLCAnX3RoaXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25zdGFudChIQ29uc3RhbnQgbm9kZSkgewogICAgaWYgKG5vZGUudXNlZEJ5Lmxlbmd0aCA8PSAxKSByZXR1cm47CiAgICBDb25zdGFudFZhbHVlIGNvbnN0YW50ID0gbm9kZS5jb25zdGFudDsKCiAgICBpZiAoY29uc3RhbnQuaXNOdWxsKSB7CiAgICAgIF9oYW5kbGVOdWxsKG5vZGUpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGNvbnN0YW50LmlzSW50KSB7CiAgICAgIF9oYW5kbGVJbnQobm9kZSwgY29uc3RhbnQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGNvbnN0YW50LmlzU3RyaW5nKSB7CiAgICAgIF9oYW5kbGVTdHJpbmcobm9kZSwgY29uc3RhbnQpOwogICAgICByZXR1cm47CiAgICB9CiAgfQoKICB2b2lkIF9oYW5kbGVOdWxsKEhDb25zdGFudCBub2RlKSB7CiAgICBpbnQgc2l6ZSA9IDQ7CgogICAgYm9vbCBfaXNDYWNoZWFibGVVc2UoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICAgIC8vIE9uZS1zaG90IGludGVyY2VwdG9ycyBoYXZlIGBudWxsYCBhcyBhIGR1bW15IGludGVyY2VwdG9yLgogICAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSE9uZVNob3RJbnRlcmNlcHRvcikgcmV0dXJuIGZhbHNlOwoKICAgICAgaWYgKGluc3RydWN0aW9uIGlzIEhJbnZva2UpIHJldHVybiB0cnVlOwogICAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSENyZWF0ZSkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIUGhpKSByZXR1cm4gdHJ1ZTsKCiAgICAgIC8vIFdlIHJldHVybiBgbnVsbGAgYnkgcmVtb3ZpbmcgdGhlIHJldHVybiBleHByZXNzaW9uIG9yIHN0YXRlbWVudC4KICAgICAgaWYgKGluc3RydWN0aW9uIGlzIEhSZXR1cm4pIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIEphdmFTY3JpcHQgYHggPT0gbnVsbGAgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBgeCA9PSBfbnVsbGAuCiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBISWRlbnRpdHkpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIFRPRE8oc3JhKTogRGV0ZXJtaW5lIGlmIG90aGVyIHVzZXMgcmVzdWx0IGluIGZhc3RlciBKYXZhU2NyaXB0IGNvZGUuCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpbnQgdXNlQ291bnQgPSBfY291bnRDYWNoZWFibGVVc2VzKG5vZGUsIF9pc0NhY2hlYWJsZVVzZSk7CiAgICBpZiAodXNlQ291bnQgKiBzaXplIDw9IDcgKyBzaXplICsgdXNlQ291bnQgKiAxKSByZXR1cm47CiAgICBfY2FjaGUobm9kZSwgX2lzQ2FjaGVhYmxlVXNlLCAnX251bGwnKTsKICAgIHJldHVybjsKICB9CgogIHZvaWQgX2hhbmRsZUludChIQ29uc3RhbnQgbm9kZSwgSW50Q29uc3RhbnRWYWx1ZSBpbnRDb25zdGFudCkgewogICAgQmlnSW50IHZhbHVlID0gaW50Q29uc3RhbnQuaW50VmFsdWU7CiAgICBTdHJpbmcgdGV4dCA9IHZhbHVlLnRvU3RyaW5nKCk7CiAgICBpbnQgc2l6ZSA9IHRleHQubGVuZ3RoOwogICAgaWYgKHNpemUgPD0gMykgcmV0dXJuOwoKICAgIGJvb2wgX2lzQ2FjaGVhYmxlVXNlKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSEludm9rZSkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIQ3JlYXRlKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGluc3RydWN0aW9uIGlzIEhSZXR1cm4pIHJldHVybiB0cnVlOwogICAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSFBoaSkgcmV0dXJuIHRydWU7CgogICAgICAvLyBKYXZhU2NyaXB0IGB4ID09PSA1YCBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGB4ID09PSBfNWAuCiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBISWRlbnRpdHkpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIEZvcmVpZ24gY29kZSB0ZW1wbGF0ZXMgbWF5IHVzZSBsaXRlcmFscyBpbiB3YXlzIHRoYXQgYXJlIGJlbmVmaWNpYWwuCiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIRm9yZWlnbkNvZGUpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIFRPRE8oc3JhKTogRGV0ZXJtaW5lIGlmIG90aGVyIHVzZXMgcmVzdWx0IGluIGZhc3RlciBKYXZhU2NyaXB0IGNvZGUuCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpbnQgdXNlQ291bnQgPSBfY291bnRDYWNoZWFibGVVc2VzKG5vZGUsIF9pc0NhY2hlYWJsZVVzZSk7CiAgICBpZiAodXNlQ291bnQgKiBzaXplIDw9IDcgKyBzaXplICsgdXNlQ291bnQgKiAxKSByZXR1cm47CiAgICBfY2FjaGUobm9kZSwgX2lzQ2FjaGVhYmxlVXNlLCAnXyR7dGV4dC5yZXBsYWNlRmlyc3QoIi0iLCAiXyIpfScpOwogIH0KCiAgdm9pZCBfaGFuZGxlU3RyaW5nKEhDb25zdGFudCBub2RlLCBTdHJpbmdDb25zdGFudFZhbHVlIHN0cmluZ0NvbnN0YW50KSB7CiAgICBTdHJpbmcgdmFsdWUgPSBzdHJpbmdDb25zdGFudC5zdHJpbmdWYWx1ZTsKICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7CiAgICBpbnQgc2l6ZSA9IGxlbmd0aCArIDI7IC8vIEluY2x1ZGUgcXVvdGVzLgogICAgaWYgKHNpemUgPD0gMikgcmV0dXJuOwoKICAgIGJvb2wgX2lzQ2FjaGVhYmxlVXNlKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgICAvLyBGb3JlaWduIGNvZGUgdGVtcGxhdGVzIG1heSB1c2UgbGl0ZXJhbHMgaW4gd2F5cyB0aGF0IGFyZSBiZW5lZmljaWFsLgogICAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSEZvcmVpZ25Db2RlKSByZXR1cm4gZmFsc2U7CgogICAgICAvLyBDYWNoZSBsYXJnZXIgc3RyaW5ncyBldmVuIGlmIHVuZm9ydHVuYXRlLgogICAgICBpZiAobGVuZ3RoID49IDE2KSByZXR1cm4gdHJ1ZTsKCiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBISW52b2tlKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGluc3RydWN0aW9uIGlzIEhDcmVhdGUpIHJldHVybiB0cnVlOwogICAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSFJldHVybikgcmV0dXJuIHRydWU7CiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIUGhpKSByZXR1cm4gdHJ1ZTsKCiAgICAgIC8vIFRPRE8oc3JhKTogQ2hlY2sgaWYg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ASUSATVDPAEvLywBSjABRTIBThQGAT88LAwEAUIpJBwbATUvLy8sAUEyAU41AU4UBgE/PEYEAUsvHy4bATVONQEzJQEvLy8sAU4xAU4UBgE/PDMEAgFPEyoMFR4CAS1wYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvY29kZWdlbl9oZWxwZXJzLmRhcnQ5c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL3ZhcmlhYmxlX2FsbG9jYXRvci5kYXJ0wABckS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2NvbW1vbi5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL25hbWVyLmRhcnQnIHNob3cgTW9kdWxhck5hbWVyOwppbXBvcnQgJ2NvZGVnZW4uZGFydCcgc2hvdyBDb2RlZ2VuUGhhc2U7CmltcG9ydCAnbm9kZXMuZGFydCc7CgovLy8gVGhlIFtMaXZlUmFuZ2VdIGNsYXNzIGNvdmVycyBhIHJhbmdlIHdoZXJlIGFuIGluc3RydWN0aW9uIGlzIGxpdmUuCmNsYXNzIExpdmVSYW5nZSB7CiAgZmluYWwgaW50IHN0YXJ0OwogIC8vIFtlbmRdIGlzIG5vdCBmaW5hbCBiZWNhdXNlIGl0IGNhbiBiZSB1cGRhdGVkIGR1ZSB0byBsb29wcy4KICBpbnQgZW5kOwogIExpdmVSYW5nZSh0aGlzLnN0YXJ0LCB0aGlzLmVuZCkgewogICAgYXNzZXJ0KHN0YXJ0IDw9IGVuZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnWyRzdGFydCAkZW5kWyc7Cn0KCi8vLyBUaGUgW0xpdmVJbnRlcnZhbF0gY2xhc3MgY29udGFpbnMgdGhlIGxpc3Qgb2YgcmFuZ2VzIHdoZXJlIGFuCi8vLyBpbnN0cnVjdGlvbiBpcyBsaXZlLgpjbGFzcyBMaXZlSW50ZXJ2YWwgewogIC8vLyBUaGUgaWQgd2hlcmUgdGhlIGluc3RydWN0aW9uIGlzIGRlZmluZWQuCiAgaW50IHN0YXJ0OwogIGZpbmFsIExpc3Q8TGl2ZVJhbmdlPiByYW5nZXM7CiAgTGl2ZUludGVydmFsKCkgOiByYW5nZXMgPSA8TGl2ZVJhbmdlPltdOwoKICAvLyBXZSB3YW50IFtIQ2hlY2tdIGluc3RydWN0aW9ucyB0byBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgdGhlCiAgLy8gaW5zdHJ1Y3Rpb24gaXQgY2hlY2tzLCBzbyBib3RoIGluc3RydWN0aW9ucyBzaG91bGQgc2hhcmUgdGhlIHNhbWUKICAvLyBsaXZlIHJhbmdlcy4KICBMaXZlSW50ZXJ2YWwuZm9yQ2hlY2sodGhpcy5zdGFydCwgTGl2ZUludGVydmFsIGNoZWNrZWRJbnRlcnZhbCkKICAgICAgOiByYW5nZXMgPSBjaGVja2VkSW50ZXJ2YWwucmFuZ2VzOwoKICAvLy8gVXBkYXRlIGFsbCByYW5nZXMgdGhhdCBhcmUgY29udGFpbmVkIGluIFtmcm9tLCB0b1sgdG8KICAvLy8gZGllIGF0IFt0b10uCiAgdm9pZCBsb29wVXBkYXRlKGludCBmcm9tLCBpbnQgdG8pIHsKICAgIGZvciAoTGl2ZVJhbmdlIHJhbmdlIGluIHJhbmdlcykgewogICAgICBpZiAoZnJvbSA8PSByYW5nZS5zdGFydCAmJiByYW5nZS5lbmQgPCB0bykgewogICAgICAgIHJhbmdlLmVuZCA9IHRvOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gQWRkIGEgbmV3IHJhbmdlIHRvIHRoaXMgaW50ZXJ2YWwuCiAgdm9pZCBhZGQoTGl2ZVJhbmdlIGludGVydmFsKSB7CiAgICByYW5nZXMuYWRkKGludGVydmFsKTsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgb25lIG9mIHRoZSByYW5nZXMgb2YgdGhpcyBpbnRlcnZhbCBkaWVzIGF0IFthdF0uCiAgYm9vbCBkaWVzQXQoaW50IGF0KSB7CiAgICBmb3IgKExpdmVSYW5nZSByYW5nZSBpbiByYW5nZXMpIHsKICAgICAgaWYgKHJhbmdlLmVuZCA9PSBhdCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBMaXN0PFN0cmluZz4gcmVzID0gbmV3IExpc3Q8U3RyaW5nPigpOwogICAgZm9yIChmaW5hbCBpbnRlcnZhbCBpbiByYW5nZXMpIHJlcy5hZGQoaW50ZXJ2YWwudG9TdHJpbmcoKSk7CiAgICByZXR1cm4gJygke3Jlcy5qb2luKCIsICIpfSknOwogIH0KfQoKLy8vIFRoZSBbTGl2ZUVudmlyb25tZW50XSBjbGFzcyBjb250YWlucyB0aGUgbGl2ZUluIHNldCBvZiBhIGJhc2ljCi8vLyBibG9jay4gQSBsaXZlSW4gc2V0IG9mIGEgYmxvY2sgY29udGFpbnMgdGhlIGluc3RydWN0aW9ucyB0aGF0IGFyZQovLy8gbGl2ZSB3aGVuIGVudGVyaW5nIHRoYXQgYmxvY2suCmNsYXNzIExpdmVFbnZpcm9ubWVudCB7CiAgLy8vIFRoZSBpbnN0cnVjdGlvbiBpZCB3aGVyZSB0aGUgYmFzaWMgYmxvY2sgc3RhcnRzLiBTZWUKICAvLy8gW1NzYUxpdmVJbnRlcnZhbEJ1aWxkZXIuaW5zdHJ1Y3Rpb25JZF0uCiAgaW50IHN0YXJ0SWQ7CgogIC8vLyBUaGUgaW5zdHJ1Y3Rpb24gaWQgd2hlcmUgdGhlIGJhc2ljIGJsb2NrIGVuZHMuCiAgZmluYWwgaW50IGVuZElkOwoKICAvLy8gTG9vcCBtYXJrZXJzIHRoYXQgd2lsbCBiZSB1cGRhdGVkIG9uY2UgdGhlIGxvb3AgaGVhZGVyIGlzCiAgLy8vIHZpc2l0ZWQuIFRoZSBsaXZlSW4gc2V0IG9mIHRoZSBsb29wIGhlYWRlciB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoaXMKICAvLy8gZW52aXJvbm1lbnQuIFtsb29wTWFya2Vyc10gaXMgYSBtYXBwaW5nIGZyb20gYmxvY2sgaGVhZGVyIHRvIHRoZQogIC8vLyBlbmQgaW5zdHJ1Y3Rpb24gaWQgb2YgdGhlIGxvb3AgZXhpdCBibG9jay4KICBmaW5hbCBNYXA8SEJhc2ljQmxvY2ssIGludD4gbG9vcE1hcmtlcnM7CgogIC8vLyBUaGUgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGxpdmUgaW4gdGhpcyBiYXNpYyBibG9jay4gVGhlIHZhbHVlcyBvZgogIC8vLyB0aGUgbWFwIGNvbnRhaW4gdGhlIGluc3RydWN0aW9uIGlkcyB3aGVyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRpZS4KICAvLy8gSXQgd2lsbCBiZSB1c2VkIHdoZW4gYWRkaW5nIGEgcmFuZ2UgdG8gdGhlIGxpdmUgaW50ZXJ2YWwgb2YgYW4KICAvLy8gaW5zdHJ1Y3Rpb24uCiAgZmluYWwgTWFwPEhJbnN0cnVjdGlvbiwgaW50PiBsaXZlSW5zdHJ1Y3Rpb25zOwoKICAvLy8gTWFwIGNvbnRhaW5pbmcgdGhlIGxpdmUgaW50ZXJ2YWxzIG9mIGluc3RydWN0aW9ucy4KICBmaW5hbCBNYXA8SEluc3RydWN0aW9uLCBMaXZlSW50ZXJ2YWw+IGxpdmVJbnRlcnZhbHM7CgogIExpdmVFbnZpcm9ubWVudCh0aGlzLmxpdmVJbnRlcnZhbHMsIHRoaXMuZW5kSWQpCiAgICAgIDogbGl2ZUluc3RydWN0aW9ucyA9IG5ldyBNYXA8SEluc3RydWN0aW9uLCBpbnQ+KCksCiAgICAgICAgbG9vcE1hcmtlcnMgPSBuZXcgTWFwPEhCYXNpY0Jsb2NrLCBpbnQ+KCk7CgogIC8vLyBSZW1vdmUgYW4gaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgbGl2ZUluIHNldC4gVGhpcyBtZXRob2QgYWxzbwogIC8vLyB1cGRhdGVzIHRoZSBsaXZlIGludGVydmFsIG9mIFtpbnN0cnVjdGlvbl0gdG8gY29udGFpbiB0aGUgbmV3CiAgLy8vIHJhbmdlOiBbaWQsIC8gaWQgY29udGFpbmVkIGluIFtsaXZlSW5zdHJ1Y3Rpb25zXSAvXS4KICB2b2lkIHJlbW92ZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIGludCBpZCkgewogICAgTGl2ZUludGVydmFsIGludGVydmFsID0KICAgICAgICBsaXZlSW50ZXJ2YWxzLnB1dElmQWJzZW50KGluc3RydWN0aW9uLCAoKSA9PiBuZXcgTGl2ZUludGVydmFsKCkpOwogICAgaW50IGxhc3RJZCA9IGxpdmVJbnN0cnVjdGlvbnNbaW5zdHJ1Y3Rpb25dOwogICAgLy8gSWYgW2xhc3RJZF0gaXMgbnVsbCwgdGhlbiB0aGlzIGluc3RydWN0aW9uIGlzIG5vdCBiZWluZyB1c2VkLgogICAgaW50ZXJ2YWwuYWRkKG5ldyBMaXZlUmFuZ2UoaWQsIGxhc3RJZCA9PSBudWxsID8gaWQgOiBsYXN0SWQpKTsKICAgIC8vIFRoZSBpbnN0cnVjdGlvbiBpcyBkZWZpbmVkIGF0IFtpZF0uCiAgICBpbnRlcnZhbC5zdGFydCA9IGlkOwogICAgbGl2ZUluc3RydWN0aW9ucy5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogIH0KCiAgLy8vIEFkZCBbaW5zdHJ1Y3Rpb25dIHRvIHRoZSBsaXZlSW4gc2V0LiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90CiAgLy8vIGFscmVhZHkgaW4gdGhlIHNldCwgd2Ugc2F2ZSB0aGUgaWQgd2hlcmUgaXQgZGllcy4KICB2b2lkIGFkZChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIGludCB1c2VySWQpIHsKICAgIC8vIE5vdGUgdGhhdCB3ZSBhcmUgdmlzaXRpbmcgdGhlIGdyYXBoIGluIHBvc3QtZG9taW5hdG9yIG9yZGVyLCBzbwogICAgLy8gdGhlIGZpcnN0IHRpbWUgd2Ugc2VlIGEgdmFyaWFibGUgaXMgd2hlbiBpdCBkaWVzLgogICAgbGl2ZUluc3RydWN0aW9ucy5wdXRJZkFic2VudChpbnN0cnVjdGlvbiwgKCkgPT4gdXNlcklkKTsKICB9CgogIC8vLyBNZXJnZSB0aGlzIGVudmlyb25tZW50IHdpdGggW290aGVyXS4gVXBkYXRlIHRoZSBlbmQgaWQgb2YKICAvLy8gaW5zdHJ1Y3Rpb25zIGluIGNhc2UgdGhleSBhcmUgZGlmZmVyZW50IGJldHdlZW4gdGhpcyBhbmQgW290aGVyXS4KICB2b2lkIG1lcmdlV2l0aChMaXZlRW52aXJvbm1lbnQgb3RoZXIpIHsKICAgIG90aGVyLmxpdmVJbnN0cnVjdGlvbnMuZm9yRWFjaCgoSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBpbnQgZXhpc3RpbmdJZCkgewogICAgICAvLyBJZiBib3RoIGVudmlyb25tZW50cyBoYXZlIHRoZSBzYW1lIGluc3RydWN0aW9uIGlkIG9mIHdoZXJlCiAgICAgIC8vIFtpbnN0cnVjdGlvbl0gZGllcywgdGhlcmUgaXMgbm8gbmVlZCB0byB1cGRhdGUgdGhlIGxpdmUKICAgICAgLy8gaW50ZXJ2YWwgb2YgW2luc3RydWN0aW9uXS4gRm9yIGV4YW1wbGUgdGhlIGlmIGJsb2NrIGFuZCB0aGUKICAgICAgLy8gZWxzZSBibG9jayBoYXZlIHRoZSBzYW1lIGVuZCBpZCBmb3IgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcwogICAgICAvLyBiZWluZyB1c2VkIGluIHRoZSBqb2luIGJsb2NrIGFuZCBkZWZpbmVkIGJlZm9yZSB0aGUgaWYvZWxzZS4KICAgICAgaWYgKGV4aXN0aW5nSWQgPT0gZW5kSWQpIHJldHVybjsKICAgICAgTGl2ZUludGVydmFsIHJhbmdlID0KICAgICAgICAgIGxpdmVJbnRlcnZhbHMucHV0SWZBYnNlbnQoaW5zdHJ1Y3Rpb24sICgpID0+IG5ldyBMaXZlSW50ZXJ2YWwoKSk7CiAgICAgIHJhbmdlLmFkZChuZXcgTGl2ZVJhbmdlKG90aGVyLnN0YXJ0SWQsIGV4aXN0aW5nSWQpKTsKICAgICAgbGl2ZUluc3RydWN0aW9uc1tpbnN0cnVjdGlvbl0gPSBlbmRJZDsKICAgIH0pOwogICAgb3RoZXIubG9vcE1hcmtlcnMuZm9yRWFjaCgoaywgdikgewogICAgICBsb29wTWFya2Vyc1trXSA9IHY7CiAgICB9KTsKICB9CgogIHZvaWQgYWRkTG9vcE1hcmtlcihIQmFzaWNCbG9jayBoZWFkZXIsIGludCBpZCkgewogICAgYXNzZXJ0KCFsb29wTWFya2Vycy5jb250YWluc0tleShoZWFkZXIpKTsKICAgIGxvb3BNYXJrZXJzW2hlYWRlcl0gPSBpZDsKICB9CgogIHZvaWQgcmVtb3ZlTG9vcE1hcmtlcihIQmFzaWNCbG9jayBoZWFkZXIpIHsKICAgIGFzc2VydChsb29wTWFya2Vycy5jb250YWluc0tleShoZWFkZXIpKTsKICAgIGxvb3BNYXJrZXJzLnJlbW92ZShoZWFkZXIpOwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBsaXZlSW5zdHJ1Y3Rpb25zLmlzRW1wdHkgJiYgbG9vcE1hcmtlcnMuaXNFbXB0eTsKICBib29sIGNvbnRhaW5zKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgPT4KICAgICAgbGl2ZUluc3RydWN0aW9ucy5jb250YWluc0tleShpbnN0cnVjdGlvbik7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gbGl2ZUluc3RydWN0aW9ucy50b1N0cmluZygpOwp9CgovLy8gQnVpbGRzIHRoZSBsaXZlIGludGVydmFscyBvZiBlYWNoIGluc3RydWN0aW9uLiBUaGUgYWxnb3JpdGhtIHZpc2l0cwovLy8gdGhlIGdyYXBoIHBvc3QtZG9taW5hdG9yIHRyZWUgdG8gZmluZCB0aGUgbGFzdCB1c2VzIG9mIGFuCi8vLyBpbnN0cnVjdGlvbiwgYW5kIGNvbXB1dGVzIHRoZSBsaXZlSW5zIG9mIGVhY2ggYmFzaWMgYmxvY2suCmNsYXNzIFNzYUxpdmVJbnRlcnZhbEJ1aWxkZXIgZXh0ZW5kcyBIQmFzZVZpc2l0b3Igd2l0aCBDb2RlZ2VuUGhhc2UgewogIGZpbmFsIFNldDxISW5zdHJ1Y3Rpb24+IGdlbmVyYXRlQXRVc2VTaXRlOwogIGZpbmFsIFNldDxISW5zdHJ1Y3Rpb24+IGNvbnRyb2xGbG93T3BlcmF0b3JzOwoKICAvLy8gQSBjb3VudGVyIHRvIGFzc2lnbiBzdGFydCBhbmQgZW5kIGlkcyB0byBsaXZlIHJhbmdlcy4gVGhlIGluaXRpYWwKICAvLy8gdmFsdWUgaXMgbm90IHJlbGV2YW50LiBOb3RlIHRoYXQgaW5zdHJ1Y3Rpb25JZCBnb2VzIGRvd253YXJkIHRvIGVhc2UKICAvLy8gcmVhc29uaW5nIGFib3V0IGxpdmUgcmFuZ2VzICh0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YgYSBncmFwaCBoYXMKICAvLy8gdGhlIGxvd2VzdCBpZCkuCiAgaW50IGluc3RydWN0aW9uSWQgPSAwOwoKICAvLy8gVGhlIGxpdmVJbnMgb2YgYmFzaWMgYmxvY2tzLgogIGZpbmFsIE1hcDxIQmFzaWNCbG9jaywgTGl2ZUVudmlyb25tZW50PiBsaXZlSW5zdHJ1Y3Rpb25zOwoKICAvLy8gVGhlIGxpdmUgaW50ZXJ2YWxzIG9mIGluc3RydWN0aW9ucy4KICBmaW5hbCBNYXA8SEluc3RydWN0aW9uLCBMaXZlSW50ZXJ2YWw+IGxpdmVJbnRlcnZhbHM7CgogIFNzYUxpdmVJbnRlcnZhbEJ1aWxkZXIodGhpcy5nZW5lcmF0ZUF0VXNlU2l0ZSwgdGhpcy5jb250cm9sRmxvd09wZXJhdG9ycykKICAgICAgOiBsaXZlSW5zdHJ1Y3Rpb25zID0gbmV3IE1hcDxIQmFzaWNCbG9jaywgTGl2ZUVudmlyb25tZW50PigpLAogICAgICAgIGxpdmVJbnRlcnZhbHMgPSBuZXcgTWFwPEhJbnN0cnVjdGlvbiwgTGl2ZUludGVydmFsPigpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICB2aXNpdFBvc3REb21pbmF0b3JUcmVlKGdyYXBoKTsKICAgIGlmICghbGl2ZUluc3RydWN0aW9uc1tncmFwaC5lbnRyeV0uaXNFbXB0eSkgewogICAgICBmYWlsZWRBdChDVVJSRU5UX0VMRU1FTlRfU1BBTk5BQkxFLCAnTGl2ZUludGVydmFsQnVpbGRlci4nKTsKICAgIH0KICB9CgogIHZvaWQgbWFya0lucHV0c0FzTGl2ZUluRW52aXJvbm1lbnQoCiAgICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwgTGl2ZUVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBmb3IgKGludCBpID0gMCwgbGVuID0gaW5zdHJ1Y3Rpb24uaW5wdXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIG1hcmtBc0xpdmVJbkVudmlyb25tZW50KGluc3RydWN0aW9uLmlucHV0c1tpXSwgZW52aXJvbm1lbnQpOwogICAgfQogIH0KCiAgLy8gUmV0dXJucyB0aGUgbm9uLUhDaGVjayBpbnN0cnVjdGlvbiwgb3IgdGhlIGxhc3QgW0hDaGVja10gaW4gdGhlCiAgLy8gY2hlY2sgY2hhaW4gdGhhdCBpcyBub3QgZ2VuZXJhdGUgYXQgdXNlIHNpdGUuCiAgLy8KICAvLyBGb3IgZXhhbXBsZToKICAvLwogIC8vICAgICB0MSA9IEdlbmVyYXRlZEF0VXNlU2l0ZSBpbnN0cnVjdGlvbgogIC8vICAgICB0MiA9IGNoZWNrKHQxKQogIC8vICAgICB0MyA9IGNoZWNrKHQyKQogIC8vICAgICB0NCA9IHVzZSh0MykKICAvLyAgICAgdDUgPSB1c2UodDMpCiAgLy8gICAgIHQ2ID0gdXNlKHQyKQogIC8vCiAgLy8gVGhlIHQxIGlzIGdlbmVyYXRlLWF0LXVzZSBzaXRlLCBhbmQgdGhlIGxpdmUtcmFuZ2UgbXVzdCB0aHVzIGJlIG9uIHQyIGFuZAogIC8vIG5vdCBvbiB0aGUgY2hlY2tlZCBpbnN0cnVjdGlvbiB0MS4KICAvLyBXaGVuIGxvb2tpbmcgZm9yIHRoZSBjaGVja2VkSW5zdHJ1Y3Rpb25Pck5vbkdlbmVyYXRlQXRVc2VTaXRlIG9mIHQzIHdlIG11c3QKICAvLyByZXR1cm4gdDIuCiAgSEluc3RydWN0aW9uIGNoZWNrZWRJbnN0cnVjdGlvbk9yTm9uR2VuZXJhdGVBdFVzZVNpdGUoSENoZWNrIGNoZWNrKSB7CiAgICBkeW5hbWljIGNoZWNrZWQgPSBjaGVjay5jaGVja2VkSW5wdXQ7CiAgICB3aGlsZSAoY2hlY2tlZCBpcyBIQ2hlY2spIHsKICAgICAgSEluc3RydWN0aW9uIG5leHQgPSBjaGVja2VkLmNoZWNrZWRJbnB1dDsKICAgICAgaWYgKGdlbmVyYXRlQXRVc2VTaXRlLmNvbnRhaW5zKG5leHQpKSBicmVhazsKICAgICAgY2hlY2tlZCA9IG5leHQ7CiAgICB9CiAgICByZXR1cm4gY2hlY2tlZDsKICB9CgogIHZvaWQgbWFya0FzTGl2ZUluRW52aXJvbm1lbnQoCiAgICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwgTGl2ZUVudmlyb25tZW50IGVudmlyb25tZW50KSB7CiAgICBpZiAoZ2VuZXJhdGVBdFVzZVNpdGUuY29udGFpbnMoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgIG1hcmtJbnB1dHNBc0xpdmVJbkVudmlyb25tZW50KGluc3RydWN0aW9uLCBlbnZpcm9ubWVudCk7CiAgICB9IGVsc2UgewogICAgICBlbnZpcm9ubWVudC5hZGQoaW5zdHJ1Y3Rpb24sIGluc3RydWN0aW9uSWQpOwogICAgICAvLyBTcGVjaWFsIGNhc2UgdGhlIEhDaGVjayBpbnN0cnVjdGlvbiB0byBtYXJrIHRoZSBhY3R1YWwKICAgICAgLy8gY2hlY2tlZCBpbnN0cnVjdGlvbiBsaXZlLiBUaGUgY2hlY2tlZCBpbnN0cnVjdGlvbiBhbmQgdGhlCiAgICAgIC8vIFtIQ2hlY2tdIHdpbGwgc2hhcmUgdGhlIHNhbWUgbGl2ZSByYW5nZXMuCiAgICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIQ2hlY2spIHsKICAgICAgICBIQ2hlY2sgY2hlY2sgPSBpbnN0cnVjdGlvbjsKICAgICAgICBISW5zdHJ1Y3Rpb24gY2hlY2tlZCA9IGNoZWNrZWRJbnN0cnVjdGlvbk9yTm9uR2VuZXJhdGVBdFVzZVNpdGUoY2hlY2spOwogICAgICAgIGlmICghZ2VuZXJhdGVBdFVzZVNpdGUuY29udGFpbnMoY2hlY2tlZCkpIHsKICAgICAgICAgIGVudmlyb25tZW50LmFkZChjaGVja2VkLCBpbnN0cnVjdGlvbklkKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgcmVtb3ZlRnJvbUVudmlyb25tZW50KAogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIExpdmVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewogICAgZW52aXJvbm1lbnQucmVtb3ZlKGluc3RydWN0aW9uLCBpbnN0cnVjdGlvbklkKTsKICAgIC8vIFNwZWNpYWwgY2FzZSB0aGUgSENoZWNrIGluc3RydWN0aW9uIHRvIGhhdmUgdGhlIHNhbWUgbGl2ZQogICAgLy8gaW50ZXJ2YWwgYXMgdGhlIGluc3RydWN0aW9uIGl0IGlzIGNoZWNraW5nLgogICAgaWYgKGluc3RydWN0aW9uIGlzIEhDaGVjaykgewogICAgICBIQ2hlY2sgY2hlY2sgPSBpbnN0cnVjdGlvbjsKICAgICAgSEluc3RydWN0aW9uIGNoZWNrZWQgPSBjaGVja2VkSW5zdHJ1Y3Rpb25Pck5vbkdlbmVyYXRlQXRVc2VTaXRlKGNoZWNrKTsKICAgICAgaWYgKCFnZW5lcmF0ZUF0VXNlU2l0ZS5jb250YWlucyhjaGVja2VkKSkgewogICAgICAgIGxpdmVJbnRlcnZhbHMucHV0SWZBYnNlbnQoY2hlY2tlZCwgKCkgPT4gbmV3IExpdmVJbnRlcnZhbCgpKTsKICAgICAgICAvLyBVbmNvbmRpdGlvbmFsbHkgZm9yY2UgdGhlIGxpdmUgcmFuZ2VzIG9mIHRoZSBIQ2hlY2sgdG8KICAgICAgICAvLyBiZSB0aGUgbGl2ZSByYW5nZXMgb2YgdGhlIGluc3RydWN0aW9uIGl0IGlzIGNoZWNraW5nLgogICAgICAgIGxpdmVJbnRlcnZhbHNbaW5zdHJ1Y3Rpb25dID0KICAgICAgICAgICAgbmV3IExpdmVJbnRlcnZhbC5mb3JDaGVjayhpbnN0cnVjdGlvbklkLCBsaXZlSW50ZXJ2YWxzW2NoZWNrZWRdKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIExpdmVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9CiAgICAgICAgbmV3IExpdmVFbnZpcm9ubWVudChsaXZlSW50ZXJ2YWxzLCBpbnN0cnVjdGlvbklkKTsKCiAgICAvLyBJZiB0aGUgY29udHJvbCBmbG93IGluc3RydWN0aW9uIGluIHRoaXMgYmxvY2sgd2lsbCBhY3R1YWxseSBiZQogICAgLy8gaW5saW5lZCBpbiB0aGUgY29kZWdlbiBpbiB0aGUgam9pbiBibG9jaywgd2UgbmVlZCB0byBtYWtlCiAgICAvLyB3aGF0ZXZlciBpcyB1c2VkIGJ5IHRoYXQgY29udHJvbCBmbG93IGluc3RydWN0aW9uIGFzIGxpdmUgaW4KICAgIC8vIHRoZSBqb2luIGJsb2NrLgogICAgaWYgKGNvbnRyb2xGbG93T3BlcmF0b3JzLmNvbnRhaW5zKGJsb2NrLmxhc3QpKSB7CiAgICAgIEhJZiBpZkluc3RydWN0aW9uID0gYmxvY2subGFzdDsKICAgICAgSEJhc2ljQmxvY2sgam9pbkJsb2NrID0gaWZJbnN0cnVjdGlvbi5qb2luQmxvY2s7CiAgICAgIGlmIChnZW5lcmF0ZUF0VXNlU2l0ZS5jb250YWlucyhqb2luQmxvY2sucGhpcy5maXJzdCkpIHsKICAgICAgICBtYXJrSW5wdXRzQXNMaXZlSW5FbnZpcm9ubWVudCgKICAgICAgICAgICAgaWZJbnN0cnVjdGlvbiwgbGl2ZUluc3RydWN0aW9uc1tqb2luQmxvY2tdKTsKICAgICAgfQogICAgfQoKICAgIC8vIEFkZCB0byB0aGUgZW52aXJvbm1lbnQgdGhlIGxpdmVJbiBvZiBpdHMgc3VjY2Vzc29yLCBhcyB3ZWxsIGFzCiAgICAvLyB0aGUgaW5wdXRzIG9mIHRoZSBwaGlzIG9mIHRoZSBzdWNjZXNzb3IgdGhhdCBmbG93IGZyb20gdGhpcyBibG9jay4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2suc3VjY2Vzc29ycy5sZW5ndGg7IGkrKykgewogICAgICBIQmFzaWNCbG9jayBzdWNjZXNzb3IgPSBibG9jay5zdWNjZXNzb3JzW2ldOwogICAgICBMaXZlRW52aXJvbm1lbnQgc3VjY2Vzc29yRW52ID0gbGl2ZUluc3RydWN0aW9uc1tzdWNjZXNzb3JdOwogICAgICBpZiAoc3VjY2Vzc29yRW52ICE9IG51bGwpIHsKICAgICAgICBlbnZpcm9ubWVudC5tZXJnZVdpdGgoc3VjY2Vzc29yRW52KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbnZpcm9ubWVudC5hZGRMb29wTWFya2VyKHN1Y2Nlc3NvciwgaW5zdHJ1Y3Rpb25JZCk7CiAgICAgIH0KCiAgICAgIGludCBpbmRleCA9IHN1Y2Nlc3Nvci5wcmVkZWNlc3NvcnMuaW5kZXhPZihibG9jayk7CiAgICAgIGZvciAoSFBoaSBwaGkgPSBzdWNjZXNzb3IucGhpcy5maXJzdDsgcGhpICE9IG51bGw7IHBoaSA9IHBoaS5uZXh0KSB7CiAgICAgICAgbWFya0FzTGl2ZUluRW52aXJvbm1lbnQocGhpLmlucHV0c1tpbmRleF0sIGVudmlyb25tZW50KTsKICAgICAgfQogICAgfQoKICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgaW5zdHJ1Y3Rpb25zIHRvIHJlbW92ZSBhbiBpbnN0cnVjdGlvbiBmcm9tIHRoZQogICAgLy8gZW52aXJvbm1lbnQgYW5kIGFkZCBpdHMgaW5wdXRzLgogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gYmxvY2subGFzdDsKICAgIHdoaWxlIChpbnN0cnVjdGlvbiAhPSBudWxsKSB7CiAgICAgIGlmICghZ2VuZXJhdGVBdFVzZVNpdGUuY29udGFpbnMoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgICAgcmVtb3ZlRnJvbUVudmlyb25tZW50KGluc3RydWN0aW9uLCBlbnZpcm9ubWVudCk7CiAgICAgICAgbWFya0lucHV0c0FzTGl2ZUluRW52aXJvbm1lbnQoaW5zdHJ1Y3Rpb24sIGVudmlyb25tZW50KTsKICAgICAgfQogICAgICBpbnN0cnVjdGlvbklkLS07CiAgICAgIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24ucHJldmlvdXM7CiAgICB9CgogICAgLy8gV2UganVzdCByZW1vdmUgdGhlIHBoaXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuIFRoZSBpbnB1dHMgb2YgdGhlCiAgICAvLyBwaGlzIHdpbGwgYmUgcHV0IGluIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgcHJlZGVjZXNzb3JzLgogICAgZm9yIChIUGhpIHBoaSA9IGJsb2NrLnBoaXMuZmlyc3Q7IHBoaSAhPSBudWxsOyBwaGkgPSBwaGkubmV4dCkgewogICAgICBpZiAoIWdlbmVyYXRlQXRVc2VTaXRlLmNvbnRhaW5zKHBoaSkpIHsKICAgICAgICBlbnZpcm9ubWVudC5yZW1vdmUocGhpLCBpbnN0cnVjdGlvbklkKTsKICAgICAgfQogICAgfQoKICAgIC8vIFNhdmUgdGhlIGxpdmVJbnN0cnVjdGlvbnMgb2YgdGhhdCBibG9jay4KICAgIGVudmlyb25tZW50LnN0YXJ0SWQgPSBpbnN0cnVjdGlvbklkICsgMTsKICAgIGxpdmVJbnN0cnVjdGlvbnNbYmxvY2tdID0gZW52aXJvbm1lbnQ7CgogICAgLy8gSWYgdGhlIGJsb2NrIGlzIGEgbG9vcCBoZWFkZXIsIHdlIGNhbiByZW1vdmUgdGhlIGxvb3AgbWFya2VyLAogICAgLy8gYmVjYXVzZSBpdCB3aWxsIGp1c3QgcmVjb21wdXRlIHRoZSBsb29wIHBoaXMuCiAgICAvLyBXZSBhbHNvIGNoZWNrIGlmIHRoaXMgbG9vcCBoZWFkZXIgaGFzIGFueSBiYWNrIGVkZ2VzLiBJZiBub3QsCiAgICAvLyB3ZSBrbm93IHRoZXJlIGlzIG5vIGxvb3AgbWFya2VyIGZvciBpdC4KICAgIGlmIChibG9jay5pc0xvb3BIZWFkZXIoKSAmJiBibG9jay5wcmVkZWNlc3NvcnMubGVuZ3RoID4gMSkgewogICAgICB1cGRhdGVMb29wTWFya2VyKGJsb2NrKTsKICAgIH0KICB9CgogIHZvaWQgdXBkYXRlTG9vcE1hcmtlcihIQmFzaWNCbG9jayBoZWFkZXIpIHsKICAgIExpdmVFbnZpcm9ubWVudCBlbnYgPSBsaXZlSW5zdHJ1Y3Rpb25zW2hlYWRlcl07CiAgICBpbnQgbGFzdElkID0gZW52Lmxvb3BNYXJrZXJzW2hlYWRlcl07CiAgICAvLyBVcGRhdGUgYWxsIGluc3RydWN0aW9ucyB0aGF0IGFyZSBsaXZlSW5zIGluIFtoZWFkZXJdIHRvIGhhdmUgYQogICAgLy8gcmFuZ2UgdGhhdCBjb3ZlcnMgdGhlIGxvb3AuCiAgICBlbnYubGl2ZUluc3RydWN0aW9ucy5mb3JFYWNoKChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIGludCBpZCkgewogICAgICBMaXZlSW50ZXJ2YWwgcmFuZ2UgPQogICAgICAgICAgZW52LmxpdmVJbnRlcnZhbHMucHV0SWZBYnNlbnQoaW5zdHJ1Y3Rpb24sICgpID0+IG5ldyBMaXZlSW50ZXJ2YWwoKSk7CiAgICAgIHJhbmdlLmxvb3BVcGRhdGUoZW52LnN0YXJ0SWQsIGxhc3RJZCk7CiAgICAgIGVudi5saXZlSW5zdHJ1Y3Rpb25zW2luc3RydWN0aW9uXSA9IGxhc3RJZDsKICAgIH0pOwoKICAgIGVudi5yZW1vdmVMb29wTWFya2VyKGhlYWRlcik7CgogICAgLy8gVXBkYXRlIGFsbCBsaXZlSW5zIHNldCB0byBjb250YWluIHRoZSBsaXZlSW5zIG9mIFtoZWFkZXJdLgogICAgbGl2ZUluc3RydWN0aW9ucy5mb3JFYWNoKChIQmFzaWNCbG9jayBibG9jaywgTGl2ZUVudmlyb25tZW50IG90aGVyKSB7CiAgICAgIGlmIChvdGhlci5sb29wTWFya2Vycy5jb250YWluc0tleShoZWFkZXIpKSB7CiAgICAgICAgZW52LmxpdmVJbnN0cnVjdGlvbnMuZm9yRWFjaCgoSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBpbnQgaWQpIHsKICAgICAgICAgIG90aGVyLmxpdmVJbnN0cnVjdGlvbnNbaW5zdHJ1Y3Rpb25dID0gaWQ7CiAgICAgICAgfSk7CiAgICAgICAgb3RoZXIucmVtb3ZlTG9vcE1hcmtlcihoZWFkZXIpOwogICAgICAgIGVudi5sb29wTWFya2Vycy5mb3JFYWNoKChrLCB2KSB7CiAgICAgICAgICBvdGhlci5sb29wTWFya2Vyc1trXSA9IHY7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogIH0KfQoKLy8vIFJlcHJlc2VudHMgYSBjb3B5IGZyb20gb25lIGluc3RydWN0aW9uIHRvIGFub3RoZXIuIFRoZSBjb2RlZ2VuCi8vLyBhbHNvIHVzZXMgdGhpcyBjbGFzcyB0byByZXByZXNlbnQgYSBjb3B5IGZyb20gb25lIHZhcmlhYmxlIHRvCi8vLyBhbm90aGVyLgpjbGFzcyBDb3B5PFQ+IHsKICBmaW5hbCBUIHNvdXJjZTsKICBmaW5hbCBUIGRlc3RpbmF0aW9uOwoKICBDb3B5KHRoaXMuc291cmNlLCB0aGlzLmRlc3RpbmF0aW9uKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRkZXN0aW5hdGlvbiA8LSAkc291cmNlJzsKfQoKLy8vIEEgY29weSBoYW5kbGVyIGNvbnRhaW5zIHRoZSBjb3BpZXMgdGhhdCBhIGJhc2ljIGJsb2NrIG5lZWRzIHRvIGRvCi8vLyBhZnRlciBleGVjdXRpbmcgYWxsIGl0cyBpbnN0cnVjdGlvbnMuCmNsYXNzIENvcHlIYW5kbGVyIHsKICAvLy8gVGhlIGNvcGllcyBmcm9tIGFuIGluc3RydWN0aW9uIHRvIGEgcGhpIG9mIHRoZSBzdWNjZXNzb3IuCiAgZmluYWwgTGlzdDxDb3B5PEhJbnN0cnVjdGlvbj4+IGNvcGllczsKCiAgLy8vIEFzc2lnbm1lbnRzIGZyb20gYW4gaW5zdHJ1Y3Rpb24gdGhhdCBkb2VzIG5vdCBuZWVkIGEgbmFtZSAoZS5nLiBhCiAgLy8vIGNvbnN0YW50KSB0byB0aGUgcGhpIG9mIGEgc3VjY2Vzc29yLgogIGZpbmFsIExpc3Q8Q29weTxISW5zdHJ1Y3Rpb24+PiBhc3NpZ25tZW50czsKCiAgQ29weUhhbmRsZXIoKQogICAgICA6IGNvcGllcyA9IG5ldyBMaXN0PENvcHk8SEluc3RydWN0aW9uPj4oKSwKICAgICAgICBhc3NpZ25tZW50cyA9IG5ldyBMaXN0PENvcHk8SEluc3RydWN0aW9uPj4oKTsKCiAgdm9pZCBhZGRDb3B5KEhJbnN0cnVjdGlvbiBzb3VyY2UsIEhJbnN0cnVjdGlvbiBkZXN0aW5hdGlvbikgewogICAgY29waWVzLmFkZChuZXcgQ29weTxISW5zdHJ1Y3Rpb24+KHNvdXJjZSwgZGVzdGluYXRpb24pKTsKICB9CgogIHZvaWQgYWRkQXNzaWdubWVudChISW5zdHJ1Y3Rpb24gc291cmNlLCBISW5zdHJ1Y3Rpb24gZGVzdGluYXRpb24pIHsKICAgIGFzc2lnbm1lbnRzLmFkZChuZXcgQ29weTxISW5zdHJ1Y3Rpb24+KHNvdXJjZSwgZGVzdGluYXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdDb3BpZXM6ICRjb3BpZXMsIGFzc2lnbm1lbnRzOiAkYXNzaWdubWVudHMnOwoKICBib29sIGdldCBpc0VtcHR5ID0+IGNvcGllcy5pc0VtcHR5ICYmIGFzc2lnbm1lbnRzLmlzRW1wdHk7Cn0KCi8vLyBDb250YWlucyB0aGUgbWFwcGluZyBiZXR3ZWVuIGluc3RydWN0aW9ucyBhbmQgdGhlaXIgbmFtZXMgZm9yIGNvZGUKLy8vIGdlbmVyYXRpb24sIGFzIHdlbGwgYXMgdGhlIFtDb3B5SGFuZGxlcl0gZm9yIGVhY2ggYmFzaWMgYmxvY2suCmNsYXNzIFZhcmlhYmxlTmFtZXMgewogIGZpbmFsIE1hcDxISW5zdHJ1Y3Rpb24sIFN0cmluZz4gb3duTmFtZTsKICBmaW5hbCBNYXA8SEJhc2ljQmxvY2ssIENvcHlIYW5kbGVyPiBjb3B5SGFuZGxlcnM7CgogIC8vIFVzZWQgdG8gY29udHJvbCBoZXVyaXN0aWMgdGhhdCBkZXRlcm1pbmVzIGhvdyBsb2NhbCB2YXJpYWJsZXMgYXJlIGRlY2xhcmVkLgogIGZpbmFsIFNldDxTdHJpbmc+IGFsbFVzZWROYW1lczsKCiAgLy8vIE5hbWUgdGhhdCBpcyB1c2VkIGFzIGEgdGVtcG9yYXJ5IHRvIGJyZWFrIGN5Y2xlcyBpbgogIC8vLyBwYXJhbGxlbCBjb3BpZXMuIFdlIG1ha2Ugc3VyZSB0aGlzIG5hbWUgaXMgbm90IGJlaW5nIHVzZWQKICAvLy8gYW55d2hlcmUgYnkgcmVzZXJ2aW5nIGl0IHdoZW4gd2UgYWxsb2NhdGUgbmFtZXMgZm9yIGluc3RydWN0aW9ucy4KICBmaW5hbCBTdHJpbmcgc3dhcFRlbXA7CgogIFN0cmluZyBnZXRTd2FwVGVtcCgpIHsKICAgIGFsbFVzZWROYW1lcy5hZGQoc3dhcFRlbXApOwogICAgcmV0dXJuIHN3YXBUZW1wOwogIH0KCiAgVmFyaWFibGVOYW1lcygpCiAgICAgIDogb3duTmFtZSA9IG5ldyBNYXA8SEluc3RydWN0aW9uLCBTdHJpbmc+KCksCiAgICAgICAgY29weUhhbmRsZXJzID0gbmV3IE1hcDxIQmFzaWNCbG9jaywgQ29weUhhbmRsZXI+KCksCiAgICAgICAgYWxsVXNlZE5hbWVzID0gbmV3IFNldDxTdHJpbmc+KCksCiAgICAgICAgc3dhcFRlbXAgPSAndDAnOwoKICBpbnQgZ2V0IG51bWJlck9mVmFyaWFibGVzID0+IGFsbFVzZWROYW1lcy5sZW5ndGg7CgogIFN0cmluZyBnZXROYW1lKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgcmV0dXJuIG93bk5hbWVbaW5zdHJ1Y3Rpb25dOwogIH0KCiAgQ29weUhhbmRsZXIgZ2V0Q29weUhhbmRsZXIoSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIHJldHVybiBjb3B5SGFuZGxlcnNbYmxvY2tdOwogIH0KCiAgdm9pZCBhZGROYW1lVXNlZChTdHJpbmcgbmFtZSkgewogICAgYWxsVXNlZE5hbWVzLmFkZChuYW1lKTsKICB9CgogIGJvb2wgaGFzTmFtZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pID0+IG93bk5hbWUuY29udGFpbnNLZXkoaW5zdHJ1Y3Rpb24pOwoKICB2b2lkIGFkZENvcHkoSEJhc2ljQmxvY2sgYmxvY2ssIEhJbnN0cnVjdGlvbiBzb3VyY2UsIEhQaGkgZGVzdGluYXRpb24pIHsKICAgIENvcHlIYW5kbGVyIGhhbmRsZXIgPQogICAgICAgIGNvcHlIYW5kbGVycy5wdXRJZkFic2VudChibG9jaywgKCkgPT4gbmV3IENvcHlIYW5kbGVyKCkpOwogICAgaGFuZGxlci5hZGRDb3B5KHNvdXJjZSwgZGVzdGluYXRpb24pOwogIH0KCiAgdm9pZCBhZGRBc3NpZ25tZW50KEhCYXNpY0Jsb2NrIGJsb2NrLCBISW5zdHJ1Y3Rpb24gc291cmNlLCBIUGhpIGRlc3RpbmF0aW9uKSB7CiAgICBDb3B5SGFuZGxlciBoYW5kbGVyID0KICAgICAgICBjb3B5SGFuZGxlcnMucHV0SWZBYnNlbnQoYmxvY2ssICgpID0+IG5ldyBDb3B5SGFuZGxlcigpKTsKICAgIGhhbmRsZXIuYWRkQXNzaWdubWVudChzb3VyY2UsIGRlc3RpbmF0aW9uKTsKICB9Cn0KCi8vLyBBbGxvY2F0ZXMgdmFyaWFibGUgbmFtZXMgZm9yIGluc3RydWN0aW9ucywgbWFraW5nIHN1cmUgdGhleSBkb24ndCBjb2xsaWRlLgpjbGFzcyBWYXJpYWJsZU5hbWVyIHsKICBmaW5hbCBWYXJpYWJsZU5hbWVzIG5hbWVzOwogIGZpbmFsIE1vZHVsYXJOYW1lciBfbmFtZXI7CiAgZmluYWwgU2V0PFN0cmluZz4gdXNlZE5hbWVzOwogIGZpbmFsIExpc3Q8U3RyaW5nPiBmcmVlVGVtcG9yYXJ5TmFtZXM7CiAgaW50IHRlbXBvcmFyeUluZGV4ID0gMDsKICBzdGF0aWMgZmluYWwgUmVnRXhwIHJlZ2V4cCA9IG5ldyBSZWdFeHAoJ3RbMC05XSsnKTsKCiAgVmFyaWFibGVOYW1lcihMaXZlRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIHRoaXMubmFtZXMsIHRoaXMuX25hbWVyKQogICAgICA6IHVzZWROYW1lcyA9IG5ldyBTZXQ8U3RyaW5nPigpLAogICAgICAgIGZyZWVUZW1wb3JhcnlOYW1lcyA9IG5ldyBMaXN0PFN0cmluZz4oKSB7CiAgICAvLyBbVmFyaWFibGVOYW1lcy5zd2FwVGVtcF0gaXMgdXNlZCB3aGVuIHRoZXJlIGlzIGEgY3ljbGUgaW4gYSBjb3B5IGhhbmRsZXIuCiAgICAvLyBUaGVyZWZvcmUgd2UgbWFrZSBzdXJlIG5vIG9uZSB1c2VzIGl0LgogICAgdXNlZE5hbWVzLmFkZChuYW1lcy5zd2FwVGVtcCk7CgogICAgLy8gQWxsIGxpdmVJbnMgaW5zdHJ1Y3Rpb25zIG11c3QgaGF2ZSBhIG5hbWUgYXQgdGhpcyBwb2ludCwgc28gd2UKICAgIC8vIGFkZCB0aGVtIHRvIHRoZSBsaXN0IG9mIHVzZWQgbmFtZXMuCiAgICBlbnZpcm9ubWVudC5saXZlSW5zdHJ1Y3Rpb25zLmZvckVhY2goKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwgaW50IGluZGV4KSB7CiAgICAgIFN0cmluZyBuYW1lID0gbmFtZXMuZ2V0TmFtZShpbnN0cnVjdGlvbik7CiAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKICAgICAgICB1c2VkTmFtZXMuYWRkKG5hbWUpOwogICAgICAgIG5hbWVzLmFkZE5hbWVVc2VkKG5hbWUpOwogICAgICB9CiAgICB9KTsKICB9CgogIFN0cmluZyBhbGxvY2F0ZVdpdGhIaW50KFN0cmluZyBvcmlnaW5hbE5hbWUpIHsKICAgIGludCBpID0gMDsKICAgIFN0cmluZyBuYW1lID0gX25hbWVyLnNhZmVWYXJpYWJsZU5hbWUob3JpZ2luYWxOYW1lKTsKICAgIHdoaWxlICh1c2VkTmFtZXMuY29udGFpbnMobmFtZSkpIHsKICAgICAgbmFtZSA9IF9uYW1lci5zYWZlVmFyaWFibGVOYW1lKCckb3JpZ2luYWxOYW1lJHtpKyt9Jyk7CiAgICB9CiAgICByZXR1cm4gbmFtZTsKICB9CgogIFN0cmluZyBhbGxvY2F0ZVRlbXBvcmFyeSgpIHsKICAgIHdoaWxlICghZnJlZVRlbXBvcmFyeU5hbWVzLmlzRW1wdHkpIHsKICAgICAgU3RyaW5nIG5hbWUgPSBmcmVlVGVtcG9yYXJ5TmFtZXMucmVtb3ZlTGFzdCgpOwogICAgICBpZiAoIXVzZWROYW1lcy5jb250YWlucyhuYW1lKSkgcmV0dXJuIG5hbWU7CiAgICB9CiAgICBTdHJpbmcgbmFtZSA9ICd0JHt0ZW1wb3JhcnlJbmRleCsrfSc7CiAgICB3aGlsZSAodXNlZE5hbWVzLmNvbnRhaW5zKG5hbWUpKSBuYW1lID0gJ3Qke3RlbXBvcmFyeUluZGV4Kyt9JzsKICAgIHJldHVybiBuYW1lOwogIH0KCiAgSFBoaSBmaXJzdFBoaVVzZXJXaXRoRWxlbWVudChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGZvciAoSEluc3RydWN0aW9uIHVzZXIgaW4gaW5zdHJ1Y3Rpb24udXNlZEJ5KSB7CiAgICAgIGlmICh1c2VyIGlzIEhQaGkgJiYgdXNlci5zb3VyY2VFbGVtZW50ICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gdXNlcjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBTdHJpbmcgYWxsb2NhdGVOYW1lKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgU3RyaW5nIG5hbWU7CiAgICBpZiAoaW5zdHJ1Y3Rpb24gaXMgSENoZWNrKSB7CiAgICAgIC8vIFNwZWNpYWwgY2FzZSB0aGlzIGluc3RydWN0aW9uIHRvIHVzZSB0aGUgbmFtZSBvZiBpdHMKICAgICAgLy8gaW5wdXQgaWYgaXQgaGFzIG9uZS4KICAgICAgSEluc3RydWN0aW9uIHRlbXAgPSBpbnN0cnVjdGlvbjsKICAgICAgZG8gewogICAgICAgIHRlbXAgPSAodGVtcCBhcyBIQ2hlY2spLmNoZWNrZWRJbnB1dDsKICAgICAgICBuYW1lID0gbmFtZXMub3duTmFtZVt0ZW1wXTsKICAgICAgfSB3aGlsZSAobmFtZSA9PSBudWxsICYmIHRlbXAgaXMgSENoZWNrKTsKICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgcmV0dXJuIGFkZEFsbG9jYXRlZE5hbWUoaW5zdHJ1Y3Rpb24sIG5hbWUpOwogICAgfQoKICAgIGlmIChpbnN0cnVjdGlvbi5zb3VyY2VFbGVtZW50ICE9IG51bGwpIHsKICAgICAgaWYgKGluc3RydWN0aW9uLnNvdXJjZUVsZW1lbnQubmFtZSAhPSBudWxsKSB7CiAgICAgICAgbmFtZSA9IGFsbG9jYXRlV2l0aEhpbnQoaW5zdHJ1Y3Rpb24uc291cmNlRWxlbWVudC5uYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBTb3VyY2UgZWxlbWVudCBpcyBzeW50aGVzaXplZCBhbmQgaGFzIG5vIG5hbWUuCiAgICAgICAgbmFtZSA9IGFsbG9jYXRlVGVtcG9yYXJ5KCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIFdlIGNvdWxkIG5vdCBmaW5kIGFuIGVsZW1lbnQgZm9yIHRoZSBpbnN0cnVjdGlvbi4gSWYgdGhlCiAgICAgIC8vIGluc3RydWN0aW9uIGlzIHVzZWQgYnkgYSBwaGksIHRyeSB0byB1c2UgdGhlIG5hbWUgb2YgdGhlIHBoaS4KICAgICAgLy8gT3RoZXJ3aXNlLCBqdXN0IGFsbG9jYXRlIGEgdGVtcG9yYXJ5IG5hbWUuCiAgICAgIEhQaGkgcGhpID0gZmlyc3RQaGlVc2VyV2l0aEVsZW1lbnQoaW5zdHJ1Y3Rpb24pOwogICAgICBpZiAocGhpICE9IG51bGwpIHsKICAgICAgICBuYW1lID0gYWxsb2NhdGVXaXRoSGludChwaGkuc291cmNlRWxlbWVudC5uYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYW1lID0gYWxsb2NhdGVUZW1wb3JhcnkoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGFkZEFsbG9jYXRlZE5hbWUoaW5zdHJ1Y3Rpb24sIG5hbWUpOwogIH0KCiAgU3RyaW5nIGFkZEFsbG9jYXRlZE5hbWUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uLCBTdHJpbmcgbmFtZSkgewogICAgdXNlZE5hbWVzLmFkZChuYW1lKTsKICAgIG5hbWVzLmFkZE5hbWVVc2VkKG5hbWUpOwogICAgbmFtZXMub3duTmFtZVtpbnN0cnVjdGlvbl0gPSBuYW1lOwogICAgcmV0dXJuIG5hbWU7CiAgfQoKICAvLy8gRnJlZXMgW2luc3RydWN0aW9uXSdzIG5hbWUgc28gaXQgY2FuIGJlIHVzZWQgZm9yIG90aGVyIGluc3RydWN0aW9ucy4KICB2b2lkIGZyZWVOYW1lKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgU3RyaW5nIG93bk5hbWUgPSBuYW1lcy5vd25OYW1lW2luc3RydWN0aW9uXTsKICAgIGlmIChvd25OYW1lICE9IG51bGwpIHsKICAgICAgLy8gV2UgY2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGxvb2tlZCBmb3IgdGVtcG9yYXJ5IG5hbWVzCiAgICAgIC8vIGJlY2F1c2UgaWYgd2UgaGF2ZW4ndCwgY2hhbmNlcyBhcmUgdGhlIHRlbXBvcmFyeSB3ZSBhbGxvY2F0ZQogICAgICAvLyBpbiB0aGlzIGJsb2NrIGNhbiBtYXRjaCBhIHBoaSB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlCiAgICAgIC8vIHN1Y2Nlc3NvciBibG9jay4KICAgICAgaWYgKHRlbXBvcmFyeUluZGV4ICE9IDAgJiYgcmVnZXhwLmhhc01hdGNoKG93bk5hbWUpKSB7CiAgICAgICAgZnJlZVRlbXBvcmFyeU5hbWVzLmFkZChvd25OYW1lKTsKICAgICAgfQogICAgICB1c2VkTmFtZXMucmVtb3ZlKG93bk5hbWUpOwogICAgfQogIH0KfQoKLy8vIFZpc2l0cyBhbGwgYmxvY2tzIGluIHRoZSBncmFwaCwgc2V0cyBuYW1lcyB0byBpbnN0cnVjdGlvbnMsIGFuZAovLy8gY3JlYXRlcyB0aGUgW0NvcHlIYW5kbGVyXSBmb3IgZWFjaCBibG9jay4gVGhpcyBjbGFzcyBuZWVkcyB0byBoYXZlCi8vLyB0aGUgbGl2ZUlucyBzZXQgYXMgd2VsbCBhcyBhbGwgdGhlIGxpdmUgaW50ZXJ2YWxzIG9mIGluc3RydWN0aW9ucy4KLy8vIEl0IHZpc2l0cyB0aGUgZ3JhcGggaW4gZG9taW5hdG9yIG9yZGVyLCBzbyB0aGF0IGF0IGVhY2ggZW50cnkgb2YgYQovLy8gYmxvY2ssIHRoZSBpbnN0cnVjdGlvbnMgaW4gaXRzIGxpdmVJbnMgc2V0IGhhdmUgbmFtZXMuCi8vLwovLy8gV2hlbiB2aXNpdGluZyBhIGJsb2NrLCBpdCBnb2VzIHRocm91Z2ggYWxsIGluc3RydWN0aW9ucy4gRm9yIGVhY2gKLy8vIGluc3RydWN0aW9uLCBpdCBmcmVlcyB0aGUgbmFtZXMgb2YgdGhlIGlucHV0cyB0aGF0IGRpZSBhdCB0aGF0Ci8vLyBpbnN0cnVjdGlvbiwgYW5kIGFsbG9jYXRlcyBhIG5hbWUgdG8gdGhlIGluc3RydWN0aW9uLiBGb3IgZWFjaCBwaGksCi8vLyBpdCBhZGRzIGEgY29weSB0byB0aGUgQ29weUhhbmRsZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGVjZXNzb3IuCmNsYXNzIFNzYVZhcmlhYmxlQWxsb2NhdG9yIGV4dGVuZHMgSEJhc2VWaXNpdG9yIHdpdGggQ29kZWdlblBoYXNlIHsKICBmaW5hbCBNb2R1bGFyTmFtZXIgX25hbWVyOwogIGZpbmFsIE1hcDxIQmFzaWNCbG9jaywgTGl2ZUVudmlyb25tZW50PiBsaXZlSW5zdHJ1Y3Rpb25zOwogIGZpbmFsIE1hcDxISW5zdHJ1Y3Rpb24sIExpdmVJbnRlcnZhbD4gbGl2ZUludGVydmFsczsKICBmaW5hbCBTZXQ8SEluc3RydWN0aW9uPiBnZW5lcmF0ZUF0VXNlU2l0ZTsKCiAgZmluYWwgVmFyaWFibGVOYW1lcyBuYW1lczsKCiAgU3NhVmFyaWFibGVBbGxvY2F0b3IodGhpcy5fbmFtZXIsIHRoaXMubGl2ZUluc3RydWN0aW9ucywgdGhpcy5saXZlSW50ZXJ2YWxzLAogICAgICB0aGlzLmdlbmVyYXRlQXRVc2VTaXRlKQogICAgICA6IHRoaXMubmFtZXMgPSBuZXcgVmFyaWFibGVOYW1lcygpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICB2aXNpdERvbWluYXRvclRyZWUoZ3JhcGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIFZhcmlhYmxlTmFtZXIgdmFyaWFibGVOYW1lciA9CiAgICAgICAgbmV3IFZhcmlhYmxlTmFtZXIobGl2ZUluc3RydWN0aW9uc1tibG9ja10sIG5hbWVzLCBfbmFtZXIpOwoKICAgIGJsb2NrLmZvckVhY2hQaGkoKEhQaGkgcGhpKSB7CiAgICAgIGhhbmRsZVBoaShwaGksIHZhcmlhYmxlTmFtZXIpOwogICAgfSk7CgogICAgYmxvY2suZm9yRWFjaEluc3RydWN0aW9uKChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgICAgaGFuZGxlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIHZhcmlhYmxlTmFtZXIpOwogICAgfSk7CiAgfQoKICAvLy8gUmV0dXJucyB3aGV0aGVyIFtpbnN0cnVjdGlvbl0gbmVlZHMgYSBuYW1lLiBJbnN0cnVjdGlvbnMgdGhhdAogIC8vLyBoYXZlIG5vIHVzZXJzIG9yIHRoYXQgYXJlIGdlbmVyYXRlZCBhdCB1c2Ugc2l0ZSBkbyBub3QgbmVlZCBhIG5hbWUuCiAgYm9vbCBuZWVkc05hbWUoaW5zdHJ1Y3Rpb24pIHsKICAgIGlmIChpbnN0cnVjdGlvbiBpcyBIVGhpcykgcmV0dXJuIGZhbHNlOwogICAgaWYgKGluc3RydWN0aW9uIGlzIEhQYXJhbWV0ZXJWYWx1ZSkgcmV0dXJuIHRydWU7CiAgICBpZiAoaW5zdHJ1Y3Rpb24udXNlZEJ5LmlzRW1wdHkpIHJldHVybiBmYWxzZTsKICAgIGlmIChnZW5lcmF0ZUF0VXNlU2l0ZS5jb250YWlucyhpbnN0cnVjdGlvbikpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiAhaW5zdHJ1Y3Rpb24ubm9uQ2hlY2soKS5pc0NvZGVNb3Rpb25JbnZhcmlhbnQoKTsKICB9CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgW2luc3RydWN0aW9uXSBkaWVzIGF0IHRoZSBpbnN0cnVjdGlvbiBbYXRdLgogIGJvb2wgZGllc0F0KEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwgSEluc3RydWN0aW9uIGF0KSB7CiAgICBMaXZlSW50ZXJ2YWwgYXRJbnRlcnZhbCA9IGxpdmVJbnRlcnZhbHNbYXRdOwogICAgTGl2ZUludGVydmFsIGluc3RydWN0aW9uSW50ZXJ2YWwgPSBsaXZlSW50ZXJ2YWxzW2luc3RydWN0aW9uXTsKICAgIGludCBzdGFydCA9IGF0SW50ZXJ2YWwuc3RhcnQ7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25JbnRlcnZhbC5kaWVzQXQoc3RhcnQpOwogIH0KCiAgdm9pZCBmcmVlVXNlZE5hbWVzQXQoCiAgICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwgSEluc3RydWN0aW9uIGF0LCBWYXJpYWJsZU5hbWVyIG5hbWVyKSB7CiAgICBpZiAobmVlZHNOYW1lKGluc3RydWN0aW9uKSkgewogICAgICBpZiAoZGllc0F0KGluc3RydWN0aW9uLCBhdCkpIHsKICAgICAgICBuYW1lci5mcmVlTmFtZShpbnN0cnVjdGlvbik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZ2VuZXJhdGVBdFVzZVNpdGUuY29udGFpbnMoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgIC8vIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBnZW5lcmF0ZWQgYXQgdXNlIHNpdGUsIHRoZW4gYWxsIGl0cwogICAgICAvLyBpbnB1dHMgbWF5IGFsc28gZGllIGF0IFthdF0uCiAgICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBpbnN0cnVjdGlvbi5pbnB1dHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gaW5wdXQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbaV07CiAgICAgICAgZnJlZVVzZWROYW1lc0F0KGlucHV0LCBhdCwgbmFtZXIpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGhhbmRsZUluc3RydWN0aW9uKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwgVmFyaWFibGVOYW1lciBuYW1lcikgewogICAgaWYgKGdlbmVyYXRlQXRVc2VTaXRlLmNvbnRhaW5zKGluc3RydWN0aW9uKSkgewogICAgICBhc3NlcnQoIWxpdmVJbnRlcnZhbHMuY29udGFpbnNLZXkoaW5zdHJ1Y3Rpb24pKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBpbnN0cnVjdGlvbi5pbnB1dHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgSEluc3RydWN0aW9uIGlucHV0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzW2ldOwogICAgICBmcmVlVXNlZE5hbWVzQXQoaW5wdXQsIGluc3RydWN0aW9uLCBuYW1lcik7CiAgICB9CgogICAgaWYgKG5lZWRzTmFtZShpbnN0cnVjdGlvbikpIHsKICAgICAgbmFtZXIuYWxsb2NhdGVOYW1lKGluc3RydWN0aW9uKTsKICAgIH0KICB9CgogIHZvaWQgaGFuZGxlUGhpKEhQaGkgcGhpLCBWYXJpYWJsZU5hbWVyIG5hbWVyKSB7CiAgICBpZiAoIW5lZWRzTmFtZShwaGkpKSByZXR1cm47CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGkuaW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IHBoaS5pbnB1dHNbaV07CiAgICAgIEhCYXNpY0Jsb2NrIHByZWRlY2Vzc29yID0gcGhpLmJsb2NrLnByZWRlY2Vzc29yc1tpXTsKICAgICAgLy8gQSBbSFR5cGVLbm93bl0gaW5zdHJ1Y3Rpb24gbmV2ZXIgaGFzIGEgbmFtZSwgYnV0IGl0cyBjaGVja2VkCiAgICAgIC8vIGlucHV0IG1pZ2h0LCB0aGVyZWZvcmUgd2UgbmVlZCB0byBkbyBhIGNvcHkgaW5zdGVhZCBvZiBhbgogICAgICAvLyBhc3NpZ25tZW50LgogICAgICB3aGlsZSAoaW5wdXQgaXMgSFR5cGVLbm93bikgaW5wdXQgPSBpbnB1dC5pbnB1dHNbMF07CiAgICAgIGlmICghbmVlZHNOYW1lKGlucHV0KSkgewogICAgICAgIG5hbWVzLmFkZEFzc2lnbm1lbnQocHJlZGVjZXNzb3IsIGlucHV0LCBwaGkpOwogICAgICB9IGVsc2UgewogICAgICAgIG5hbWVzLmFkZENvcHkocHJlZGVjZXNzb3IsIGlucHV0LCBwaGkpOwogICAgICB9CiAgICB9CgogICAgbmFtZXIuYWxsb2NhdGVOYW1lKHBoaSk7CiAgfQp9CoKiAE5OPAEZNSkVAUcSE0ALJBoEAQwoAgFCGRUvDSArAUBHEkIpATwTJiYzGAgGBAEoIRoEAUcYJigGEgQBDBYrQSIEAgFDRiMYOy4PATUTAUBKRzErAUhGRRMxATk3ATI5MwFCRDsyHEowRUMrGSoEAUU4M0c5PQQBQEgqUERBRURGJxtMOy0IJxoIBAEzLh4EAS4tIAQBRy0xDDQCAUg+P0YtMAFIS0gWGQEjPAEqNwFMRD8BDCIjMkMGBAEmP0VDBgQBRTMFEgUtGBgWFhYFTyhREEgqIDAzFgYUBAEgPzM/DTNAQzMjJFA0MwoIBgQBHj80QTMhIk4yRkJBJU4IBgQBDCwiOwFGQUQXNSY3Pic5CAYBRko4M0IiLQ89CAE5S0EIBgFHJysiNjlBCBcqBgFHQEUuMAgGATAtKwFFNUUvQR8GBAEuNCpGI0YbUC0yCAEiAUJKM0o0DCgpJAwICAQCAUNCDRASFwEnAQwyAgFGKhRAKQFIKy4BEDE2AUA9BAFGQgQBDEUBPQIBR0MWKzQBUSIBOkBIGQEZIBUEARIzPCoZATQBLSEEATIgBAEiHAQBTgFLGkIqBAFRGkIwBAIBTxYdHR8pGjYBRicyUS4jAUYrUTAaHSEICAQBMQ85Jz0GEQQBHyo1MgYqRBEEATs0OBUIBhEEATIRIT4eJwsuJDBEBgEtNEEPOiQIDUJHNDcZOQ8kCAYwBAFDGR0nEQQBSywxG0BGQRo9KQghBgQCAURHR0c7BEZDSEhEHTw3LQEdAU8eKgEMIh8EAQwsIkMBIiUIATo1CAQBREogLDUyPzwEAUI7MUMiLgQBGEgiJSUIOkMmRzQrCAYEAUozNw4GAUUyMgYBIicGBAEyIQEyKjtGQxU7HzYPMAgGAR0EAgEwcGFja2FnZTpjb21waWxlci9zcmMvc3NhL3ZhcmlhYmxlX2FsbG9jYXRvci5kYXJ0QHNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvc3BlY2lhbGl6ZWRfY2hlY2tzLmRhcnSJ3S8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2NvbW1vbl9lbGVtZW50cy5kYXJ0JyBzaG93IEpDb21tb25FbGVtZW50czsKaW1wb3J0ICcuLi9lbGVtZW50cy9lbnRpdGllcy5kYXJ0JzsKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKCmNsYXNzIFNwZWNpYWxpemVkQ2hlY2tzIHsKICBzdGF0aWMgTWVtYmVyRW50aXR5IGZpbmRBc0NoZWNrKAogICAgICBEYXJ0VHlwZSBkYXJ0VHlwZSwgYm9vbCBpc1R5cGVFcnJvciwgSkNvbW1vbkVsZW1lbnRzIGNvbW1vbkVsZW1lbnRzKSB7CiAgICBpZiAoZGFydFR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBpZiAoZGFydFR5cGUudHlwZUFyZ3VtZW50cy5pc05vdEVtcHR5KSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIF9maW5kQXNDaGVjayhkYXJ0VHlwZS5lbGVtZW50LCBjb21tb25FbGVtZW50cywKICAgICAgICAgIGlzVHlwZUVycm9yOiBpc1R5cGVFcnJvciwgaXNOdWxsYWJsZTogdHJ1ZSk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHN0YXRpYyBNZW1iZXJFbnRpdHkgX2ZpbmRBc0NoZWNrKAogICAgICBDbGFzc0VudGl0eSBlbGVtZW50LCBKQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHMsCiAgICAgIHtib29sIGlzVHlwZUVycm9yLCBib29sIGlzTnVsbGFibGV9KSB7CiAgICBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc1N0cmluZ0NsYXNzIHx8CiAgICAgICAgZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5zdHJpbmdDbGFzcykgewogICAgICBpZiAoaXNOdWxsYWJsZSkgewogICAgICAgIHJldHVybiBpc1R5cGVFcnJvcgogICAgICAgICAgICA/IGNvbW1vbkVsZW1lbnRzLnNwZWNpYWxpemVkQ2hlY2tTdHJpbmdOdWxsYWJsZQogICAgICAgICAgICA6IGNvbW1vbkVsZW1lbnRzLnNwZWNpYWxpemVkQXNTdHJpbmdOdWxsYWJsZTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZiAoZWxlbWVudCA9PSBjb21tb25FbGVtZW50cy5qc0Jvb2xDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuYm9vbENsYXNzKSB7CiAgICAgIGlmIChpc051bGxhYmxlKSB7CiAgICAgICAgcmV0dXJuIGlzVHlwZUVycm9yCiAgICAgICAgICAgID8gY29tbW9uRWxlbWVudHMuc3BlY2lhbGl6ZWRDaGVja0Jvb2xOdWxsYWJsZQogICAgICAgICAgICA6IGNvbW1vbkVsZW1lbnRzLnNwZWNpYWxpemVkQXNCb29sTnVsbGFibGU7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgaWYgKGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuZG91YmxlQ2xhc3MpIHsKICAgICAgaWYgKGlzTnVsbGFibGUpIHsKICAgICAgICByZXR1cm4gaXNUeXBlRXJyb3IKICAgICAgICAgICAgPyBjb21tb25FbGVtZW50cy5zcGVjaWFsaXplZENoZWNrRG91YmxlTnVsbGFibGUKICAgICAgICAgICAgOiBjb21tb25FbGVtZW50cy5zcGVjaWFsaXplZEFzRG91YmxlTnVsbGFibGU7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgaWYgKGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuanNOdW1iZXJDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMubnVtQ2xhc3MpIHsKICAgICAgaWYgKGlzTnVsbGFibGUpIHsKICAgICAgICByZXR1cm4gaXNUeXBlRXJyb3IKICAgICAgICAgICAgPyBjb21tb25FbGVtZW50cy5zcGVjaWFsaXplZENoZWNrTnVtTnVsbGFibGUKICAgICAgICAgICAgOiBjb21tb25FbGVtZW50cy5zcGVjaWFsaXplZEFzTnVtTnVsbGFibGU7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgaWYgKGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcyB8fAogICAgICAgIGVsZW1lbnQgPT0gY29tbW9uRWxlbWVudHMuaW50Q2xhc3MgfHwKICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmpzVUludDMyQ2xhc3MgfHwKICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmpzVUludDMxQ2xhc3MgfHwKICAgICAgICBlbGVtZW50ID09IGNvbW1vbkVsZW1lbnRzLmpzUG9zaXRpdmVJbnRDbGFzcykgewogICAgICBpZiAoaXNOdWxsYWJsZSkgewogICAgICAgIHJldHVybiBpc1R5cGVFcnJvcgogICAgICAgICAgICA/IGNvbW1vbkVsZW1lbnRzLnNwZWNpYWxpemVkQ2hlY2tJbnROdWxsYWJsZQogICAgICAgICAgICA6IGNvbW1vbkVsZW1lbnRzLnNwZWNpYWxpemVkQXNJbnROdWxsYWJsZTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9Cn0KUABOTjwBNyQhARojTSU6PDcGEQQBJDstMzEYGzw6CBMGATEvGBs6OAgTBgEzMRgbPDoIEwYBMy4YGzk3CBMGATAuMzM4GBs5NwgTBgERBAIBN3BhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvc3BlY2lhbGl6ZWRfY2hlY2tzLmRhcnQ9c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL2ludGVyY2VwdG9yX3NpbXBsaWZpZXIuZGFydMAASxIvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9jb21tb25fZWxlbWVudHMuZGFydCcgc2hvdyBDb21tb25FbGVtZW50czsKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL2Fic3RyYWN0X3ZhbHVlX2RvbWFpbi5kYXJ0JzsKaW1wb3J0ICcuLi9qc19iYWNrZW5kL2ludGVyY2VwdG9yX2RhdGEuZGFydCc7CmltcG9ydCAnLi4vdW5pdmVyc2Uvc2VsZWN0b3IuZGFydCcgc2hvdyBTZWxlY3RvcjsKaW1wb3J0ICcuLi93b3JsZC5kYXJ0JyBzaG93IEpDbG9zZWRXb3JsZDsKaW1wb3J0ICdub2Rlcy5kYXJ0JzsKaW1wb3J0ICdvcHRpbWl6ZS5kYXJ0JzsKCi8vLyBUaGlzIHBoYXNlIHNpbXBsaWZpZXMgaW50ZXJjZXB0b3JzIGluIG11bHRpcGxlIHdheXM6Ci8vLwovLy8gMSkgSWYgdGhlIGludGVyY2VwdG9yIGlzIGZvciBhbiBvYmplY3Qgd2hvc2UgdHlwZSBpcyBrbm93biwgaXQKLy8vIHRyaWVzIHRvIHVzZSBhIGNvbnN0YW50IGludGVyY2VwdG9yIGluc3RlYWQuCi8vLwovLy8gMikgSW50ZXJjZXB0b3JzIGFyZSBzcGVjaWFsaXplZCBiYXNlZCBvbiB0aGUgc2VsZWN0b3IgaXQgaXMgdXNlZCB3aXRoLgovLy8KLy8vIDMpIElmIHdlIGtub3cgdGhlIG9iamVjdCBpcyBub3QgaW50ZXJjZXB0ZWQsIHdlIGp1c3QgdXNlIHRoZSBvYmplY3QKLy8vIGluc3RlYWQuCi8vLwovLy8gNCkgU2luZ2xlIHVzZSBpbnRlcmNlcHRvcnMgYXQgZHluYW1pYyBpbnZva2Ugc2l0ZXMgYXJlIHJlcGxhY2VkIHdpdGggJ29uZQovLy8gc2hvdCBpbnRlcmNlcHRvcnMnIHdoaWNoIGFyZSBzeW50aGVzaXplZCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucyB0aGF0IGZldGNoCi8vLyB0aGUgaW50ZXJjZXB0b3IgYW5kIHRoZW4gY2FsbCB0aGUgbWV0aG9kLiAgVGhpcyBzYXZlcyBjb2RlIHNpemUgYW5kIG1ha2VzIHRoZQovLy8gcmVjZWl2ZXIgb2YgYW4gaW50ZXJjZXB0ZWQgY2FsbCBhIGNhbmRpZGF0ZSBmb3IgYmVpbmcgZ2VuZXJhdGVkIGF0IHVzZSBzaXRlLgovLy8KLy8vIDUpIFNvbWUgSElzIG9wZXJhdGlvbnMgb24gYW4gaW50ZXJjZXB0b3IgYXJlIHJlcGxhY2VkIHdpdGggYSBISXMgdmVyc2lvbiB0aGF0Ci8vLyB1c2VzICdpbnN0YW5jZW9mJyByYXRoZXIgdGhhbiB0ZXN0aW5nIGEgdHlwZSBmbGFnLgovLy8KY2xhc3MgU3NhU2ltcGxpZnlJbnRlcmNlcHRvcnMgZXh0ZW5kcyBIQmFzZVZpc2l0b3IKICAgIGltcGxlbWVudHMgT3B0aW1pemF0aW9uUGhhc2UgewogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lID0gIlNzYVNpbXBsaWZ5SW50ZXJjZXB0b3JzIjsKICBmaW5hbCBKQ2xvc2VkV29ybGQgX2Nsb3NlZFdvcmxkOwogIGZpbmFsIENsYXNzRW50aXR5IF9lbmNsb3NpbmdDbGFzczsKICBIR3JhcGggX2dyYXBoOwoKICBTc2FTaW1wbGlmeUludGVyY2VwdG9ycyh0aGlzLl9jbG9zZWRXb3JsZCwgdGhpcy5fZW5jbG9zaW5nQ2xhc3MpOwoKICBDb21tb25FbGVtZW50cyBnZXQgX2NvbW1vbkVsZW1lbnRzID0+IF9jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50czsKCiAgSW50ZXJjZXB0b3JEYXRhIGdldCBfaW50ZXJjZXB0b3JEYXRhID0+IF9jbG9zZWRXb3JsZC5pbnRlcmNlcHRvckRhdGE7CgogIEFic3RyYWN0VmFsdWVEb21haW4gZ2V0IF9hYnN0cmFjdFZhbHVlRG9tYWluID0+CiAgICAgIF9jbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICB0aGlzLl9ncmFwaCA9IGdyYXBoOwogICAgdmlzaXREb21pbmF0b3JUcmVlKGdyYXBoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCYXNpY0Jsb2NrKEhCYXNpY0Jsb2NrIG5vZGUpIHsKICAgIGN1cnJlbnRCbG9jayA9IG5vZGU7CgogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gbm9kZS5maXJzdDsKICAgIHdoaWxlIChpbnN0cnVjdGlvbiAhPSBudWxsKSB7CiAgICAgIGJvb2wgc2hvdWxkUmVtb3ZlID0gaW5zdHJ1Y3Rpb24uYWNjZXB0KHRoaXMpOwogICAgICBISW5zdHJ1Y3Rpb24gbmV4dCA9IGluc3RydWN0aW9uLm5leHQ7CiAgICAgIGlmIChzaG91bGRSZW1vdmUpIHsKICAgICAgICBpbnN0cnVjdGlvbi5ibG9jay5yZW1vdmUoaW5zdHJ1Y3Rpb24pOwogICAgICB9CiAgICAgIGluc3RydWN0aW9uID0gbmV4dDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnN0cnVjdGlvbihISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW52b2tlKEhJbnZva2UgaW52b2tlKSB7CiAgICBpZiAoIWludm9rZS5pc0ludGVyY2VwdGVkQ2FsbCkgcmV0dXJuIGZhbHNlOwogICAgZHluYW1pYyBpbnRlcmNlcHRvciA9IGludm9rZS5pbnB1dHNbMF07CiAgICBpZiAoaW50ZXJjZXB0b3IgaXMhIEhJbnRlcmNlcHRvcikgcmV0dXJuIGZhbHNlOwoKICAgIC8vIFRPRE8oc3JhKTogTW92ZSB0aGlzIHBlci1jYWxsIGNvZGUgdG8gdmlzaXRJbnRlcmNlcHRvci4KICAgIC8vCiAgICAvLyBUaGUgaW50ZXJjZXB0b3IgaXMgdmlzaXRlZCBmaXJzdCwgc28gd2UgZ2V0IGhlcmUgb25seSB3aGVuIHRoZQogICAgLy8gaW50ZXJjZXB0b3Igd2FzIG5vdCByZXdyaXR0ZW4gdG8gYSBzaW5nbGUgc2hhcmVkIHJlcGxhY2VtZW50LiAgSSdtIG5vdAogICAgLy8gc3VyZSB3ZSBzaG91bGQgc3Vic3RpdHV0ZSBhIGNvbnN0YW50IGludGVyY2VwdG9yIG9uIGEgcGVyLWNhbGwgYmFzaXMgaWYKICAgIC8vIHRoZSBpbnRlcmNlcHRvciBpcyBhbHJlYWR5IGF2YWlsYWJsZSBpbiBhIGxvY2FsIHZhcmlhYmxlLCBidXQgaXQgaXMKICAgIC8vIHBvc3NpYmxlIHRoYXQgYWxsIHVzZXMgY2FuIGJlIHJld3JpdHRlbiB0byB1c2UgZGlmZmVyZW50IGNvbnN0YW50cy4KCiAgICBISW5zdHJ1Y3Rpb24gY29uc3RhbnQgPSB0cnlDb21wdXRlQ29uc3RhbnRJbnRlcmNlcHRvcigKICAgICAgICBpbnZva2UuaW5wdXRzWzFdLCBpbnRlcmNlcHRvci5pbnRlcmNlcHRlZENsYXNzZXMpOwogICAgaWYgKGNvbnN0YW50ICE9IG51bGwpIHsKICAgICAgaW52b2tlLmNoYW5nZVVzZShpbnRlcmNlcHRvciwgY29uc3RhbnQpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBjYW5Vc2VTZWxmRm9ySW50ZXJjZXB0b3IoSEluc3RydWN0aW9uIHJlY2VpdmVyLAogICAgICB7U2V0PENsYXNzRW50aXR5PiBpbnRlcmNlcHRlZENsYXNzZXN9KSB7CiAgICBpZiAocmVjZWl2ZXIuaXNQcmltaXRpdmUoX2Fic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgIC8vIFByaW1pdGl2ZXMgYWx3YXlzIG5lZWQgaW50ZXJjZXB0b3JzLgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAocmVjZWl2ZXIuaXNOdWxsKF9hYnN0cmFjdFZhbHVlRG9tYWluKS5pc1BvdGVudGlhbGx5VHJ1ZSkgewogICAgICBpZiAoaW50ZXJjZXB0ZWRDbGFzc2VzID09IG51bGwgfHwKICAgICAgICAgIGludGVyY2VwdGVkQ2xhc3Nlcy5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNOdWxsQ2xhc3MpKSB7CiAgICAgICAgLy8gTmVlZCB0aGUgSlNOdWxsIGludGVyY2VwdG9yLgogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIC8vIEFsbCBpbnRlcmNlcHRlZCBjbGFzc2VzIGV4dGVuZCBgSW50ZXJjZXB0b3JgLCBzbyBpZiB0aGUgcmVjZWl2ZXIgY2FuJ3QgYmUKICAgIC8vIGEgY2xhc3MgZXh0ZW5kaW5nIGBJbnRlcmNlcHRvcmAgdGhlbiBpdCBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5LgogICAgcmV0dXJuIF9hYnN0cmFjdFZhbHVlRG9tYWluCiAgICAgICAgLmlzSW50ZXJjZXB0b3IocmVjZWl2ZXIuaW5zdHJ1Y3Rpb25UeXBlKQogICAgICAgIC5pc0RlZmluaXRlbHlGYWxzZTsKICB9CgogIEhJbnN0cnVjdGlvbiB0cnlDb21wdXRlQ29uc3RhbnRJbnRlcmNlcHRvcigKICAgICAgSEluc3RydWN0aW9uIGlucHV0LCBTZXQ8Q2xhc3NFbnRpdHk+IGludGVyY2VwdGVkQ2xhc3NlcykgewogICAgQ2xhc3NFbnRpdHkgY29uc3RhbnRJbnRlcmNlcHRvciA9IHRyeUNvbXB1dGVDb25zdGFudEludGVyY2VwdG9yRnJvbVR5cGUoCiAgICAgICAgaW5wdXQuaW5zdHJ1Y3Rpb25UeXBlLCBpbnRlcmNlcHRlZENsYXNzZXMpOwoKICAgIGlmIChjb25zdGFudEludGVyY2VwdG9yID09IG51bGwpIHJldHVybiBudWxsOwoKICAgIC8vIElmIHdlIGp1c3QgaGFwcGVuIHRvIGJlIGluIGFuIGluc3RhbmNlIG1ldGhvZCBvZiB0aGUgY29uc3RhbnQKICAgIC8vIGludGVyY2VwdG9yLCBgdGhpc2AgaXMgYSBzaG9ydGVyIGFsaWFzLgogICAgaWYgKGNvbnN0YW50SW50ZXJjZXB0b3IgPT0gX2VuY2xvc2luZ0NsYXNzICYmCiAgICAgICAgX2dyYXBoLnRoaXNJbnN0cnVjdGlvbiAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfZ3JhcGgudGhpc0luc3RydWN0aW9uOwogICAgfQoKICAgIENvbnN0YW50VmFsdWUgY29uc3RhbnQgPSBuZXcgSW50ZXJjZXB0b3JDb25zdGFudFZhbHVlKGNvbnN0YW50SW50ZXJjZXB0b3IpOwogICAgcmV0dXJuIF9ncmFwaC5hZGRDb25zdGFudChjb25zdGFudCwgX2Nsb3NlZFdvcmxkKTsKICB9CgogIENsYXNzRW50aXR5IHRyeUNvbXB1dGVDb25zdGFudEludGVyY2VwdG9yRnJvbVR5cGUoCiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSwgU2V0PENsYXNzRW50aXR5PiBpbnRlcmNlcHRlZENsYXNzZXMpIHsKICAgIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc051bGwodHlwZSkuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVsbCh0eXBlKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgcmV0dXJuIF9jb21tb25FbGVtZW50cy5qc051bGxDbGFzczsKICAgICAgfQogICAgfSBlbHNlIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0ludGVnZXJPck51bGwodHlwZSkuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gX2NvbW1vbkVsZW1lbnRzLmpzSW50Q2xhc3M7CiAgICB9IGVsc2UgaWYgKF9hYnN0cmFjdFZhbHVlRG9tYWluLmlzRG91YmxlT3JOdWxsKHR5cGUpLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIF9jb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzOwogICAgfSBlbHNlIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0Jvb2xlYW5Pck51bGwodHlwZSkuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gX2NvbW1vbkVsZW1lbnRzLmpzQm9vbENsYXNzOwogICAgfSBlbHNlIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc1N0cmluZ09yTnVsbCh0eXBlKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBfY29tbW9uRWxlbWVudHMuanNTdHJpbmdDbGFzczsKICAgIH0gZWxzZSBpZiAoX2Fic3RyYWN0VmFsdWVEb21haW4uaXNBcnJheSh0eXBlKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBfY29tbW9uRWxlbWVudHMuanNBcnJheUNsYXNzOwogICAgfSBlbHNlIGlmIChfYWJzdHJhY3RWYWx1ZURvbWFpbi5pc051bWJlck9yTnVsbCh0eXBlKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgIWludGVyY2VwdGVkQ2xhc3Nlcy5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcykgJiYKICAgICAgICAhaW50ZXJjZXB0ZWRDbGFzc2VzLmNvbnRhaW5zKF9jb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzKSkgewogICAgICAvLyBJZiB0aGUgbWV0aG9kIGJlaW5nIGludGVyY2VwdGVkIGlzIG5vdCBkZWZpbmVkIGluIFtpbnRdIG9yIFtkb3VibGVdIHdlCiAgICAgIC8vIGNhbiBzYWZlbHkgdXNlIHRoZSBudW1iZXIgaW50ZXJjZXB0b3IuICBUaGlzIGlzIGJlY2F1c2Ugbm9uZSBvZiB0aGUKICAgICAgLy8gW2ludF0gb3IgW2RvdWJsZV0gbWV0aG9kcyBhcmUgY2FsbGVkIGZyb20gYSBtZXRob2QgZGVmaW5lZCBvbiBbbnVtXS4KICAgICAgcmV0dXJuIF9jb21tb25FbGVtZW50cy5qc051bWJlckNsYXNzOwogICAgfSBlbHNlIHsKICAgICAgLy8gVHJ5IHRvIGZpbmQgY29uc3RhbnQgaW50ZXJjZXB0b3IgZm9yIGEgbmF0aXZlIGNsYXNzLiAgSWYgdGhlIHJlY2VpdmVyCiAgICAgIC8vIGlzIGNvbnN0cmFpbmVkIHRvIGEgbGVhZiBuYXRpdmUgY2xhc3MsIHdlIGNhbiB1c2UgdGhlIGNsYXNzJ3MKICAgICAgLy8gaW50ZXJjZXB0b3IgZGlyZWN0bHkuCgogICAgICAvLyBUT0RPKHNyYSk6IEtleSBET00gY2xhc3NlcyBsaWtlIE5vZGUsIEVsZW1lbnQgYW5kIEV2ZW50IGFyZSBub3QgbGVhZgogICAgICAvLyBjbGFzc2VzLiAgV2hlbiB0aGUgcmVjZWl2ZXIgdHlwZSBpcyBub3QgYSBsZWFmIGNsYXNzLCB3ZSBtaWdodCBzdGlsbCBiZQogICAgICAvLyBhYmxlIHRvIHVzZSB0aGUgcmVjZWl2ZXIgY2xhc3MgYXMgYSBjb25zdGFudCBpbnRlcmNlcHRvci4gIEl0IGlzCiAgICAgIC8vIHVzdWFsbHkgdGhlIGNhc2UgdGhhdCBtZXRob2RzIGRlZmluZWQgb24gYSBub24tbGVhZiBjbGFzcyBkb24ndCB0ZXN0CiAgICAgIC8vIGZvciBhIHN1YmNsYXNzIG9yIGNhbGwgbWV0aG9kcyBkZWZpbmVkIG9uIGEgc3ViY2xhc3MuICBQcm92aWRlZCB0aGUKICAgICAgLy8gY29kZSBpcyBjb21wbGV0ZWx5IGluc2Vuc2l0aXZlIHRvIHRoZSBzcGVjaWZpYyBpbnN0YW5jZSBzdWJjbGFzc2VzLCB3ZQogICAgICAvLyBjYW4gdXNlIHRoZSBub24tbGVhZiBjbGFzcyBkaXJlY3RseS4KICAgICAgQ2xhc3NFbnRpdHkgZWxlbWVudCA9IF9hYnN0cmFjdFZhbHVlRG9tYWluLmdldEV4YWN0Q2xhc3ModHlwZSk7CiAgICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgX2Nsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaXNOYXRpdmVDbGFzcyhlbGVtZW50KSkgewogICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBISW5zdHJ1Y3Rpb24gZmluZERvbWluYXRvcihJdGVyYWJsZTxISW5zdHJ1Y3Rpb24+IGluc3RydWN0aW9ucykgewogICAgSEluc3RydWN0aW9uIHJlc3VsdDsKICAgIEwxOgogICAgZm9yIChISW5zdHJ1Y3Rpb24gY2FuZGlkYXRlIGluIGluc3RydWN0aW9ucykgewogICAgICBmb3IgKEhJbnN0cnVjdGlvbiBjdXJyZW50IGluIGluc3RydWN0aW9ucykgewogICAgICAgIGlmIChjdXJyZW50ICE9IGNhbmRpZGF0ZSAmJiAhY2FuZGlkYXRlLmRvbWluYXRlcyhjdXJyZW50KSkgY29udGludWUgTDE7CiAgICAgIH0KICAgICAgcmVzdWx0ID0gY2FuZGlkYXRlOwogICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgaW50IHVzZUNvdW50KEhJbnN0cnVjdGlvbiB1c2VyLCBISW5zdHJ1Y3Rpb24gdXNlZCkgPT4KICAgICAgdXNlci5pbnB1dHMud2hlcmUoKGlucHV0KSA9PiBpbnB1dCA9PSB1c2VkKS5sZW5ndGg7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcmNlcHRvcihISW50ZXJjZXB0b3Igbm9kZSkgewogICAgaWYgKG5vZGUucmVjZWl2ZXIubm9uQ2hlY2soKSA9PSBfZ3JhcGguZXhwbGljaXRSZWNlaXZlclBhcmFtZXRlcikgewogICAgICAvLyBJZiBgZXhwbGljaXRSZWNlaXZlclBhcmFtZXRlcmAgaXMgc2V0IGl0IG1lYW5zIHRoZSBjdXJyZW50IG1ldGhvZCBpcyBhbgogICAgICAvLyBpbnRlcmNlcHRvciBtZXRob2QsIGFuZCBgdGhpc2AgaXMgdGhlIGludGVyY2VwdG9yLiAgVGhlIGNhbGxlciBqdXN0IGRpZAogICAgICAvLyBgZ2V0SW50ZXJjZXB0b3IoZm9vKS5jdXJyZW50TWV0aG9kKGZvbylgIHRvIGVudGVyIHRoZSBjdXJyZW50IG1ldGhvZC4KICAgICAgbm9kZS5ibG9jay5yZXdyaXRlKG5vZGUsIF9ncmFwaC50aGlzSW5zdHJ1Y3Rpb24pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICByZXdyaXRlU2VsZkludGVyY2VwdG9yVXNlcyhub2RlKTsKCiAgICBpZiAobm9kZS51c2VkQnkuaXNFbXB0eSkgcmV0dXJuIHRydWU7CgogICAgLy8gU3BlY2lhbGl6ZSB0aGUgaW50ZXJjZXB0b3Igd2l0aCBzZXQgb2YgY2xhc3NlcyBpdCBpbnRlcmNlcHRzLCBjb25zaWRlcmluZwogICAgLy8gYWxsIHVzZXMuICAoVGhlIHNwZWNpYWxpemVkIGludGVyY2VwdG9yIGhhcyBhIHNob3J0ZXIgZGlzcGF0Y2ggY2hhaW4pLgogICAgLy8gVGhpcyBvcGVyYXRpb24gYXBwbGllcyBvbmx5IHdoZXJlIHRoZSBpbnRlcmNlcHRvciBpcyB1c2VkIHRvIGRpc3BhdGNoIGEKICAgIC8vIG1ldGhvZC4gIE90aGVyIHVzZXMsIGUuZy4gYXMgYW4gb3JkaW5hcnkgYXJndW1lbnQgb3IgYSBISXMgY2hlY2sgdXNlIHRoZQogICAgLy8gbW9zdCBnZW5lcmFsIGludGVyY2VwdG9yLgogICAgLy8KICAgIC8vIFRPRE8oc3JhKTogVGFrZSBpbnRvIGFjY291bnQgdGhlIHJlY2VpdmVyIHR5cGUgYXQgZWFjaCBjYWxsLiAgZS5nOgogICAgLy8KICAgIC8vICAgICAoYSkgPT4gYS5sZW5ndGggKyBhLmhhc2hDb2RlCiAgICAvLwogICAgLy8gQ3VycmVudGx5IHdlIHVzZSB0aGUgbW9zdCBnZW5lcmFsIGludGVyY2VwdG9yIHNpbmNlIGFsbCBpbnRlcmNlcHRlZCB0eXBlcwogICAgLy8gaW1wbGVtZW50IGBoYXNoQ29kZWAuIEJ1dCBpbiB0aGlzIGV4YW1wbGUsIGBhLmhhc2hDb2RlYCBpcyBvbmx5IHJlYWNoZWQKICAgIC8vIGlmIGBhLmxlbmd0aGAgc3VjY2VlZHMsIHdoaWNoIGlzIGluZGljYXRlZCBieSB0aGUgaGFzaENvZGUgcmVjZWl2ZXIgYmVpbmcKICAgIC8vIGEgSFR5cGVLbm93biBpbnN0cnVjdGlvbi4KCiAgICBTZXQ8Q2xhc3NFbnRpdHk+IGludGVyY2VwdGVkQ2xhc3NlczsKICAgIEhJbnN0cnVjdGlvbiBkb21pbmF0b3IgPSBmaW5kRG9taW5hdG9yKG5vZGUudXNlZEJ5KTsKICAgIC8vIElmIHRoZXJlIGlzIGEgY2FsbCB0aGF0IGRvbWluYXRlcyBhbGwgb3RoZXIgdXNlcywgd2UgY2FuIHVzZSBqdXN0IHRoZQogICAgLy8gc2VsZWN0b3Igb2YgdGhhdCBpbnN0cnVjdGlvbi4KICAgIGlmIChkb21pbmF0b3IgaXMgSEludm9rZUR5bmFtaWMgJiYKICAgICAgICBkb21pbmF0b3IuaXNDYWxsT25JbnRlcmNlcHRvcihfY2xvc2VkV29ybGQpICYmCiAgICAgICAgbm9kZSA9PSBkb21pbmF0b3IucmVjZWl2ZXIgJiYKICAgICAgICB1c2VDb3VudChkb21pbmF0b3IsIG5vZGUpID09IDEpIHsKICAgICAgaW50ZXJjZXB0ZWRDbGFzc2VzID0gX2ludGVyY2VwdG9yRGF0YS5nZXRJbnRlcmNlcHRlZENsYXNzZXNPbigKICAgICAgICAgIGRvbWluYXRvci5zZWxlY3Rvci5uYW1lLCBfY2xvc2VkV29ybGQpOwoKICAgICAgLy8gSWYgd2UgZm91bmQgdGhhdCB3ZSBuZWVkIG51bWJlciwgd2UgbXVzdCBzdGlsbCBnbyB0aHJvdWdoIGFsbAogICAgICAvLyB1c2VzIHRvIGNoZWNrIGlmIHRoZXkgcmVxdWlyZSBpbnQsIG9yIGRvdWJsZS4KICAgICAgaWYgKGludGVyY2VwdGVkQ2xhc3Nlcy5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNOdW1iZXJDbGFzcykgJiYKICAgICAgICAgICEoaW50ZXJjZXB0ZWRDbGFzc2VzLmNvbnRhaW5zKF9jb21tb25FbGVtZW50cy5qc0RvdWJsZUNsYXNzKSB8fAogICAgICAgICAgICAgIGludGVyY2VwdGVkQ2xhc3Nlcy5jb250YWlucyhfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcykpKSB7CiAgICAgICAgU2V0PENsYXNzRW50aXR5PiByZXF1aXJlZDsKICAgICAgICBmb3IgKEhJbnN0cnVjdGlvbiB1c2VyIGluIG5vZGUudXNlZEJ5KSB7CiAgICAgICAgICBpZiAodXNlciBpcyEgSEludm9rZSkgY29udGludWU7CiAgICAgICAgICBTZXQ8Q2xhc3NFbnRpdHk+IGludGVyY2VwdGVkID0gX2ludGVyY2VwdG9yRGF0YQogICAgICAgICAgICAgIC5nZXRJbnRlcmNlcHRlZENsYXNzZXNPbih1c2VyLnNlbGVjdG9yLm5hbWUsIF9jbG9zZWRXb3JsZCk7CiAgICAgICAgICBpZiAoaW50ZXJjZXB0ZWQuY29udGFpbnMoX2NvbW1vbkVsZW1lbnRzLmpzSW50Q2xhc3MpKSB7CiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSB0eXBlIGFyZ3VtZW50IHdoZW4gYWxsIHVzZXMgb2YKICAgICAgICAgICAgLy8gaW50ZXJjZXB0ZWQgY2xhc3NlcyBleHBlY3QgZW50aXRpZXMgaW5zdGVhZCBvZiBlbGVtZW50cy4KICAgICAgICAgICAgcmVxdWlyZWQgPz89IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICAgICAgICAgIHJlcXVpcmVkLmFkZChfY29tbW9uRWxlbWVudHMuanNJbnRDbGFzcyk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaW50ZXJjZXB0ZWQuY29udGFpbnMoX2NvbW1vbkVsZW1lbnRzLmpzRG91YmxlQ2xhc3MpKSB7CiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSB0eXBlIGFyZ3VtZW50IHdoZW4gYWxsIHVzZXMgb2YKICAgICAgICAgICAgLy8gaW50ZXJjZXB0ZWQgY2xhc3NlcyBleHBlY3QgZW50aXRpZXMgaW5zdGVhZCBvZiBlbGVtZW50cy4KICAgICAgICAgICAgcmVxdWlyZWQgPz89IG5ldyBTZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICAgICAgICAgIHJlcXVpcmVkLmFkZChfY29tbW9uRWxlbWVudHMuanNEb3VibGVDbGFzcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIERvbid0IG1vZGlmeSB0aGUgcmVzdWx0IG9mCiAgICAgICAgLy8gW19pbnRlcmNlcHRvckRhdGEuZ2V0SW50ZXJjZXB0ZWRDbGFzc2VzT25dLgogICAgICAgIGlmIChyZXF1aXJlZCAhPSBudWxsKSB7CiAgICAgICAgICBpbnRlcmNlcHRlZENsYXNzZXMgPSBpbnRlcmNlcHRlZENsYXNzZXMudW5pb24ocmVxdWlyZWQpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIHR5cGUgYXJndW1lbnQgd2hlbiBhbGwgdXNlcyBvZiBpbnRlcmNlcHRlZAogICAgICAvLyBjbGFzc2VzIGV4cGVjdCBlbnRpdGllcyBpbnN0ZWFkIG9mIGVsZW1lbnRzLgogICAgICBpbnRlcmNlcHRlZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzRW50aXR5PigpOwogICAgICBmb3IgKEhJbnN0cnVjdGlvbiB1c2VyIGluIG5vZGUudXNlZEJ5KSB7CiAgICAgICAgaWYgKHVzZXIgaXMgSEludm9rZUR5bmFtaWMgJiYKICAgICAgICAgICAgdXNlci5pc0NhbGxPbkludGVyY2VwdG9yKF9jbG9zZWRXb3JsZCkgJiYKICAgICAgICAgICAgbm9kZSA9PSB1c2VyLnJlY2VpdmVyICYmCiAgICAgICAgICAgIHVzZUNvdW50KHVzZXIsIG5vZGUpID09IDEpIHsKICAgICAgICAgIGludGVyY2VwdGVkQ2xhc3Nlcy5hZGRBbGwoX2ludGVyY2VwdG9yRGF0YS5nZXRJbnRlcmNlcHRlZENsYXNzZXNPbigKICAgICAgICAgICAgICB1c2VyLnNlbGVjdG9yLm5hbWUsIF9jbG9zZWRXb3JsZCkpOwogICAgICAgIH0gZWxzZSBpZiAodXNlciBpcyBISW52b2tlU3VwZXIgJiYKICAgICAgICAgICAgdXNlci5pc0NhbGxPbkludGVyY2VwdG9yKF9jbG9zZWRXb3JsZCkgJiYKICAgICAgICAgICAgbm9kZSA9PSB1c2VyLnJlY2VpdmVyICYmCiAgICAgICAgICAgIHVzZUNvdW50KHVzZXIsIG5vZGUpID09IDEpIHsKICAgICAgICAgIGludGVyY2VwdGVkQ2xhc3Nlcy5hZGRBbGwoX2ludGVyY2VwdG9yRGF0YS5nZXRJbnRlcmNlcHRlZENsYXNzZXNPbigKICAgICAgICAgICAgICB1c2VyLnNlbGVjdG9yLm5hbWUsIF9jbG9zZWRXb3JsZCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBVc2UgYSBtb3N0IGdlbmVyYWwgaW50ZXJjZXB0b3IgZm9yIG90aGVyIGluc3RydWN0aW9ucywgZXhhbXBsZSwKICAgICAgICAgIC8vIGlzLWNoZWNrcyBhbmQgZXNjYXBpbmcgaW50ZXJjZXB0b3JzLgogICAgICAgICAgaW50ZXJjZXB0ZWRDbGFzc2VzLmFkZEFsbChfaW50ZXJjZXB0b3JEYXRhLmludGVyY2VwdGVkQ2xhc3Nlcyk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBub2RlLmludGVyY2VwdGVkQ2xhc3NlcyA9IGludGVyY2VwdGVkQ2xhc3NlczsKCiAgICBISW5zdHJ1Y3Rpb24gcmVjZWl2ZXIgPSBub2RlLnJlY2VpdmVyOwoKICAgIC8vIFRyeSBjb21wdXRpbmcgYSBjb25zdGFudCBpbnRlcmNlcHRvci4KICAgIEhJbnN0cnVjdGlvbiBjb25zdGFudEludGVyY2VwdG9yID0KICAgICAgICB0cnlDb21wdXRlQ29uc3RhbnRJbnRlcmNlcHRvcihyZWNlaXZlciwgaW50ZXJjZXB0ZWRDbGFzc2VzKTsKICAgIGlmIChjb25zdGFudEludGVyY2VwdG9yICE9IG51bGwpIHsKICAgICAgbm9kZS5ibG9jay5yZXdyaXRlKG5vZGUsIGNvbnN0YW50SW50ZXJjZXB0b3IpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gSWYgaXQgaXMgYSBjb25kaXRpb25hbCBjb25zdGFudCBpbnRlcmNlcHRvciBhbmQgd2FzIG5vdCBzdHJlbmd0aGVuZWQgdG8gYQogICAgLy8gY29uc3RhbnQgaW50ZXJjZXB0b3IgdGhlbiB0aGVyZSBpcyBub3RoaW5nIG1vcmUgd2UgY2FuIGRvLgogICAgaWYgKG5vZGUuaXNDb25kaXRpb25hbENvbnN0YW50SW50ZXJjZXB0b3IpIHJldHVybiBmYWxzZTsKCiAgICAvLyBEbyB3ZSBoYXZlIGFuICdhbG1vc3QgY29uc3RhbnQnIGludGVyY2VwdG9yPyAgVGhlIHJlY2VpdmVyIGNvdWxkIGJlCiAgICAvLyBgbnVsbGAgYnV0IG5vdCBhbnkgb3RoZXIgSmF2YVNjcmlwdCBmYWxzeSB2YWx1ZSwgYG51bGxgIHZhbHVlcyBjYXVzZQogICAgLy8gYE5vU3VjaE1ldGhvZEVycm9yYHMsIGFuZCBpZiB0aGUgcmVjZWl2ZXIgd2FzIG5vdCBudWxsIHdlIHdvdWxkIGhhdmUgYQogICAgLy8gY29uc3RhbnQgaW50ZXJjZXB0b3IgYENgLiAgVGhlbiB3ZSBjYW4gdXNlIGAocmVjZWl2ZXIgJiYgQylgIGZvciB0aGUKICAgIC8vIGludGVyY2VwdG9yLgogICAgaWYgKHJlY2VpdmVyLmlzTnVsbChfYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgaWYgKCFpbnRlcmNlcHRlZENsYXNzZXMuY29udGFpbnMoX2NvbW1vbkVsZW1lbnRzLmpzTnVsbENsYXNzKSkgewogICAgICAgIC8vIENhbiB1c2UgYChyZWNlaXZlciAmJiBDKWAgb25seSBpZiByZWNlaXZlciBpcyBlaXRoZXIgbnVsbCBvciB0cnV0aHkuCiAgICAgICAgaWYgKCEocmVjZWl2ZXIKICAgICAgICAgICAgICAgIC5pc1ByaW1pdGl2ZU51bWJlcihfYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgICAgIC5pc1BvdGVudGlhbGx5VHJ1ZSB8fAogICAgICAgICAgICByZWNlaXZlcgogICAgICAgICAgICAgICAgLmlzUHJpbWl0aXZlQm9vbGVhbihfYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgICAgIC5pc1BvdGVudGlhbGx5VHJ1ZSB8fAogICAgICAgICAgICByZWNlaXZlcgogICAgICAgICAgICAgICAgLmlzUHJpbWl0aXZlU3RyaW5nKF9hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgICAgICAgICAgLmlzUG90ZW50aWFsbHlUcnVlKSkgewogICAgICAgICAgQ2xhc3NFbnRpdHkgaW50ZXJjZXB0b3JDbGFzcyA9IHRyeUNvbXB1dGVDb25zdGFudEludGVyY2VwdG9yRnJvbVR5cGUoCiAgICAgICAgICAgICAgX2Fic3RyYWN0VmFsdWVEb21haW4uZXhjbHVkZU51bGwocmVjZWl2ZXIuaW5zdHJ1Y3Rpb25UeXBlKSwKICAgICAgICAgICAgICBpbnRlcmNlcHRlZENsYXNzZXMpOwogICAgICAgICAgaWYgKGludGVyY2VwdG9yQ2xhc3MgIT0gbnVsbCkgewogICAgICAgICAgICBISW5zdHJ1Y3Rpb24gY29uc3RhbnRJbnN0cnVjdGlvbiA9IF9ncmFwaC5hZGRDb25zdGFudCgKICAgICAgICAgICAgICAgIG5ldyBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUoaW50ZXJjZXB0b3JDbGFzcyksIF9jbG9zZWRXb3JsZCk7CiAgICAgICAgICAgIG5vZGUuY29uZGl0aW9uYWxDb25zdGFudEludGVyY2VwdG9yID0gY29uc3RhbnRJbnN0cnVjdGlvbjsKICAgICAgICAgICAgY29uc3RhbnRJbnN0cnVjdGlvbi51c2VkQnkuYWRkKG5vZGUpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gVHJ5IGNyZWF0aW5nIGEgb25lLXNob3QgaW50ZXJjZXB0b3Igb3Igb3B0aW1pemVkIGlzLWNoZWNrCiAgICBpZiAobm9kZS51c2VkQnkubGVuZ3RoICE9IDEpIHJldHVybiBmYWxzZTsKICAgIEhJbnN0cnVjdGlvbiB1c2VyID0gbm9kZS51c2VkQnkuc2luZ2xlOwoKICAgIC8vIElmIHRoZSBpbnRlcmNlcHRvciBbbm9kZV0gd2FzIGxvb3AgaG9pc3RlZCwgd2Uga2VlcCB0aGUgaW50ZXJjZXB0b3IuCiAgICBpZiAoIXVzZXIuaGFzU2FtZUxvb3BIZWFkZXJBcyhub2RlKSkgcmV0dXJuIGZhbHNlOwoKICAgIGJvb2wgcmVwbGFjZVVzZXJXaXRoKEhJbnN0cnVjdGlvbiByZXBsYWNlbWVudCkgewogICAgICBIQmFzaWNCbG9jayBibG9jayA9IHVzZXIuYmxvY2s7CiAgICAgIGJsb2NrLmFkZEFmdGVyKHVzZXIsIHJlcGxhY2VtZW50KTsKICAgICAgYmxvY2sucmV3cml0ZSh1c2VyLCByZXBsYWNlbWVudCk7CiAgICAgIGJsb2NrLnJlbW92ZSh1c2VyKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmICh1c2VyIGlzIEhJcykgewogICAgICAvLyBTZWUgaWYgd2UgY2FuIHJld3JpdGUgdGhlIGlzLWNoZWNrIHRvIHVzZSAnaW5zdGFuY2VvZicsIGkuZS4gcmV3cml0ZQogICAgICAvLyAiZ2V0SW50ZXJjZXB0b3IoeCkuJGlzVCIgdG8gInggaW5zdGFuY2VvZiBUIi4KICAgICAgaWYgKG5vZGUgPT0gdXNlci5pbnRlcmNlcHRvcikgewogICAgICAgIGlmIChfaW50ZXJjZXB0b3JEYXRhLm1heUdlbmVyYXRlSW5zdGFuY2VvZkNoZWNrKAogICAgICAgICAgICB1c2VyLnR5cGVFeHByZXNzaW9uLCBfY2xvc2VkV29ybGQpKSB7CiAgICAgICAgICBISW5zdHJ1Y3Rpb24gaW5zdGFuY2VvZkNoZWNrID0gbmV3IEhJcy5pbnN0YW5jZU9mKHVzZXIudHlwZUV4cHJlc3Npb24sCiAgICAgICAgICAgICAgdXNlci5leHByZXNzaW9uLCB1c2VyLmluc3RydWN0aW9uVHlwZSwgdXNlci5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICAgICAgICBpbnN0YW5jZW9mQ2hlY2suc291cmNlRWxlbWVudCA9IHVzZXIuc291cmNlRWxlbWVudDsKICAgICAgICAgIHJldHVybiByZXBsYWNlVXNlcldpdGgoaW5zdGFuY2VvZkNoZWNrKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodXNlciBpcyBISW52b2tlRHluYW1pYykgewogICAgICBpZiAobm9kZSA9PSB1c2VyLmlucHV0c1swXSkgewogICAgICAgIC8vIFJlcGxhY2UgdGhlIHVzZXIgd2l0aCBhIFtIT25lU2hvdEludGVyY2VwdG9yXS4KICAgICAgICBIQ29uc3RhbnQgbnVsbENvbnN0YW50ID0gX2dyYXBoLmFkZENvbnN0YW50TnVsbChfY2xvc2VkV29ybGQpOwogICAgICAgIExpc3Q8SEluc3RydWN0aW9uPiBpbnB1dHMgPSBuZXcgTGlzdDxISW5zdHJ1Y3Rpb24+LmZyb20odXNlci5pbnB1dHMpOwogICAgICAgIGlucHV0c1swXSA9IG51bGxDb25zdGFudDsKICAgICAgICBIT25lU2hvdEludGVyY2VwdG9yIG9uZVNob3RJbnRlcmNlcHRvciA9IG5ldyBIT25lU2hvdEludGVyY2VwdG9yKAogICAgICAgICAgICBfYWJzdHJhY3RWYWx1ZURvbWFpbiwKICAgICAgICAgICAgdXNlci5zZWxlY3RvciwKICAgICAgICAgICAgdXNlci5yZWNlaXZlclR5cGUsCiAgICAgICAgICAgIGlucHV0cywKICAgICAgICAgICAgdXNlci5pbnN0cnVjdGlvblR5cGUsCiAgICAgICAgICAgIHVzZXIudHlwZUFyZ3VtZW50cywKICAgICAgICAgICAgaW50ZXJjZXB0ZWRDbGFzc2VzKTsKICAgICAgICBvbmVTaG90SW50ZXJjZXB0b3Iuc291cmNlSW5mb3JtYXRpb24gPSB1c2VyLnNvdXJjZUluZm9ybWF0aW9uOwogICAgICAgIG9uZVNob3RJbnRlcmNlcHRvci5zb3VyY2VFbGVtZW50ID0gdXNlci5zb3VyY2VFbGVtZW50OwogICAgICAgIHJldHVybiByZXBsYWNlVXNlcldpdGgob25lU2hvdEludGVyY2VwdG9yKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgcmV3cml0ZVNlbGZJbnRlcmNlcHRvclVzZXMoSEludGVyY2VwdG9yIG5vZGUpIHsKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CgogICAgLy8gQXQgaW5zdHJ1Y3Rpb25zIHRoYXQgdXNlIHRoZSBpbnRlcmNlcHRvciBhbmQgaXRzIHJlY2VpdmVyLCB0aGUgcmVjZWl2ZXIKICAgIC8vIG1pZ2h0IGJlIHJlZmluZWQgYXQgdGhlIHVzZSBzaXRlLgoKICAgIC8vICAgICBkeW5hbWljIHggPSAuLi4KICAgIC8vICAgICBpZiAoeCBpcyBNdW1ibGUpIHsKICAgIC8vICAgICAgIHByaW50KHgubGVuZ3RoKTsgIC8vIFNlbGYtaW50ZXJjZXB0b3IgaGVyZS4KICAgIC8vICAgICB9IGVsc2UgewogICAgLy8gICAgICAgcHJpbnQoeC5sZW5ndGgpOyAgLy8KICAgIC8vICAgICB9CgogICAgZmluaXNoSW52b2tlKEhJbnZva2UgaW52b2tlLCBTZWxlY3RvciBzZWxlY3RvcikgewogICAgICBISW5zdHJ1Y3Rpb24gY2FsbFJlY2VpdmVyID0gaW52b2tlLmdldERhcnRSZWNlaXZlcihfY2xvc2VkV29ybGQpOwogICAgICBpZiAocmVjZWl2ZXIubm9uQ2hlY2soKSA9PSBjYWxsUmVjZWl2ZXIubm9uQ2hlY2soKSkgewogICAgICAgIFNldDxDbGFzc0VudGl0eT4gaW50ZXJjZXB0ZWRDbGFzc2VzID0gX2ludGVyY2VwdG9yRGF0YQogICAgICAgICAgICAuZ2V0SW50ZXJjZXB0ZWRDbGFzc2VzT24oc2VsZWN0b3IubmFtZSwgX2Nsb3NlZFdvcmxkKTsKCiAgICAgICAgaWYgKGNhblVzZVNlbGZGb3JJbnRlcmNlcHRvcihjYWxsUmVjZWl2ZXIsCiAgICAgICAgICAgIGludGVyY2VwdGVkQ2xhc3NlczogaW50ZXJjZXB0ZWRDbGFzc2VzKSkgewogICAgICAgICAgaW52b2tlLmNoYW5nZVVzZShub2RlLCBjYWxsUmVjZWl2ZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZvciAoSEluc3RydWN0aW9uIHVzZXIgaW4gbm9kZS51c2VkQnkudG9MaXN0KCkpIHsKICAgICAgaWYgKHVzZXIgaXMgSElzKSB7CiAgICAgICAgaWYgKHVzZXIuaW50ZXJjZXB0b3IgPT0gbm9kZSkgewogICAgICAgICAgSEluc3RydWN0aW9uIGV4cHJlc3Npb24gPSB1c2VyLmV4cHJlc3Npb247CiAgICAgICAgICBpZiAoY2FuVXNlU2VsZkZvckludGVyY2VwdG9yKGV4cHJlc3Npb24pKSB7CiAgICAgICAgICAgIHVzZXIuY2hhbmdlVXNlKG5vZGUsIGV4cHJlc3Npb24pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh1c2VyIGlzIEhJbnZva2VEeW5hbWljKSB7CiAgICAgICAgaWYgKHVzZXIuaXNDYWxsT25JbnRlcmNlcHRvcihfY2xvc2VkV29ybGQpICYmCiAgICAgICAgICAgIG5vZGUgPT0gdXNlci5pbnB1dHNbMF0gJiYKICAgICAgICAgICAgdXNlQ291bnQodXNlciwgbm9kZSkgPT0gMSkgewogICAgICAgICAgZmluaXNoSW52b2tlKHVzZXIsIHVzZXIuc2VsZWN0b3IpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh1c2VyIGlzIEhJbnZva2VTdXBlcikgewogICAgICAgIGlmICh1c2VyLmlzQ2FsbE9uSW50ZXJjZXB0b3IoX2Nsb3NlZFdvcmxkKSAmJgogICAgICAgICAgICBub2RlID09IHVzZXIuaW5wdXRzWzBdICYmCiAgICAgICAgICAgIHVzZUNvdW50KHVzZXIsIG5vZGUpID09IDEpIHsKICAgICAgICAgIGZpbmlzaEludm9rZSh1c2VyLCB1c2VyLnNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVE9ETyhzcmEpOiBBcmUgdGhlcmUgb3RoZXIgcGFpcmVkIHVzZXMgb2YgdGhlIHJlY2VpdmVyIGFuZAogICAgICAgIC8vIGludGVyY2VwdG9yIHdoZXJlIHdlIGNhbiBtYWtlIHVzZSBvZiBhIHN0cmVuZ3RoZW5lZCByZWNlaXZlcj8KICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdE9uZVNob3RJbnRlcmNlcHRvcihIT25lU2hvdEludGVyY2VwdG9yIG5vZGUpIHsKICAgIC8vICdVbmRvJyB0aGUgb25lLXNob3QgdHJhbnNmb3JtYXRpb24gaWYgdGhlIHJlY2VpdmVyIGhhcyBhIGNvbnN0YW50CiAgICAvLyBpbnRlcmNlcHRvci4KICAgIEhJbnN0cnVjdGlvbiBjb25zdGFudCA9CiAgICAgICAgdHJ5Q29tcHV0ZUNvbnN0YW50SW50ZXJjZXB0b3Iobm9kZS5pbnB1dHNbMV0sIG5vZGUuaW50ZXJjZXB0ZWRDbGFzc2VzKTsKCiAgICBpZiAoY29uc3RhbnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwoKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gbm9kZS5zZWxlY3RvcjsKICAgIEFic3RyYWN0VmFsdWUgcmVjZWl2ZXJUeXBlID0gbm9kZS5yZWNlaXZlclR5cGU7CiAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb247CiAgICBpZiAoc2VsZWN0b3IuaXNHZXR0ZXIpIHsKICAgICAgaW5zdHJ1Y3Rpb24gPSBuZXcgSEludm9rZUR5bmFtaWNHZXR0ZXIoCiAgICAgICAgICBzZWxlY3RvciwKICAgICAgICAgIHJlY2VpdmVyVHlwZSwKICAgICAgICAgIG5vZGUuZWxlbWVudCwKICAgICAgICAgIDxISW5zdHJ1Y3Rpb24+W2NvbnN0YW50LCBub2RlLmlucHV0c1sxXV0sCiAgICAgICAgICB0cnVlLAogICAgICAgICAgbm9kZS5pbnN0cnVjdGlvblR5cGUsCiAgICAgICAgICBub2RlLnNvdXJjZUluZm9ybWF0aW9uKTsKICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaXNTZXR0ZXIpIHsKICAgICAgaW5zdHJ1Y3Rpb24gPSBuZXcgSEludm9rZUR5bmFtaWNTZXR0ZXIoCiAgICAgICAgICBzZWxlY3RvciwKICAgICAgICAgIHJlY2VpdmVyVHlwZSwKICAgICAgICAgIG5vZGUuZWxlbWVudCwKICAgICAgICAgIDxISW5zdHJ1Y3Rpb24+W2NvbnN0YW50LCBub2RlLmlucHV0c1sxXSwgbm9kZS5pbnB1dHNbMl1dLAogICAgICAgICAgdHJ1ZSwKICAgICAgICAgIG5vZGUuaW5zdHJ1Y3Rpb25UeXBlLAogICAgICAgICAgbm9kZS5zb3VyY2VJbmZvcm1hdGlvbik7CiAgICB9IGVsc2UgewogICAgICBMaXN0PEhJbnN0cnVjdGlvbj4gaW5wdXRzID0gbmV3IExpc3Q8SEluc3RydWN0aW9uPi5mcm9tKG5vZGUuaW5wdXRzKTsKICAgICAgaW5wdXRzWzBdID0gY29uc3RhbnQ7CiAgICAgIGluc3RydWN0aW9uID0gbmV3IEhJbnZva2VEeW5hbWljTWV0aG9kKHNlbGVjdG9yLCByZWNlaXZlclR5cGUsIGlucHV0cywKICAgICAgICAgIG5vZGUuaW5zdHJ1Y3Rpb25UeXBlLCBub2RlLnR5cGVBcmd1bWVudHMsIG5vZGUuc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgICBpc0ludGVyY2VwdGVkOiB0cnVlKTsKICAgIH0KCiAgICBIQmFzaWNCbG9jayBibG9jayA9IG5vZGUuYmxvY2s7CiAgICBibG9jay5hZGRBZnRlcihub2RlLCBpbnN0cnVjdGlvbik7CiAgICBibG9jay5yZXdyaXRlKG5vZGUsIGluc3RydWN0aW9uKTsKICAgIHJldHVybiB0cnVlOwogIH0KfQqB5QBOTjwBNiMkMS4yKhUYATkEQzEESwRIDQROUFJRBFI3BDMjDDEjJREBRAFFAUgBMigBDCIZHwQBDCsZASsiNCwaLwgaBgQBDDwBDCUxLDQBPwdGTk9LSwE7OxwvBhIEATcvSC4UBkMoRigWCAYBUUcgMRwEAS5BTTQBMgFFLzIqJQYBUDcEATVBP0AsCE4pTSxOKk0sRitNREdQTU4sDU9HHwFOUUpOTVAuRk8YCAYBEQQBRBkIMzNQCBoNBhMEAT86AQwtSFFRTzgTBgEmASoBUU5PUCEHSgcoB1FPUSEBKTlNJSc3JipFMgFHN0hKSiMxKjpKQkdIMTYMRUdIMTkMCiY3IEMKCA1NNjMvJjYlKU4yKzYlKU4yEU0yShEKCAYBMgErAS0nRSc1FAYBUUI9AUtMTkwUQ0dQFzkmFTomFTknUEojKkNPRzIaDAoIBgFBLywBTDcBNSYpKBoUBgEXTjcmOTJRTj4zCggpJDpHTiJKIhsfFCIgIUc/NAgGARIEATcrAU8pARseORQiDQE2SDw/QwEzNzAKCAYBNhkoNTYuDAorNiYpLQopNiYpLQoPRkkIBgQBDDtJFBxQASgBJzQeHS4UGBg0ECAjJC4UGBhEECAjDUwcTUwgBgEkJyYRBAIBNHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9pbnRlcmNlcHRvcl9zaW1wbGlmaWVyLmRhcnQ4c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvc3NhL3R5cGVzX3Byb3BhZ2F0aW9uLmRhcnTAAFCnLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vY29tbW9uX2VsZW1lbnRzLmRhcnQnIHNob3cgQ29tbW9uRWxlbWVudHM7CmltcG9ydCAnLi4vZWxlbWVudHMvZW50aXRpZXMuZGFydCc7CmltcG9ydCAnLi4vZWxlbWVudHMvdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vaW5mZXJyZXIvYWJzdHJhY3RfdmFsdWVfZG9tYWluLmRhcnQnOwppbXBvcnQgJy4uL2luZmVycmVyL3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CmltcG9ydCAnbG9nZ2luZy5kYXJ0JzsKaW1wb3J0ICdub2Rlcy5kYXJ0JzsKaW1wb3J0ICdvcHRpbWl6ZS5kYXJ0JzsKCi8vLyBUeXBlIHByb3BhZ2F0aW9uIGFuZCBjb25kaXRpb25pbmcgY2hlY2sgaW5zZXJ0aW9uLgovLy8KLy8vIDEuIFR5cGUgcHJvcGFnYXRpb24gKGRhdGFmbG93KSB0byBkZXRlcm1pbmUgdGhlIHR5cGVzIG9mIGFsbCBub2Rlcy4KLy8vCi8vLyAyLiBIVHlwZUtub3duIG5vZGUgaW5zZXJ0aW9uIGNhcHR1cmVzIHR5cGUgc3RyZW5ndGhlbmluZy4KLy8vCi8vLyAzLiBDb25kaXRpb25pbmcgY2hlY2sgaW5zZXJ0aW9uIGluc2VydHMgcmVjZWl2ZXIgYW5kIGFyZ3VtZW50IGNoZWNrcyBvbgovLy8gICAgY2FsbHMgd2hlcmUgdGhhdCBjYWxsIGlzIGV4cGVjdGVkIHRvIGJlIHJlcGxhY2VkIHdpdGggYW4gaW5zdHJ1Y3Rpb24gd2l0aAovLy8gICAgYSBuYXJyb3dlciBkb21haW4uIEZvciBleGFtcGxlIGB7TnVsbCxpbnR9ICsge2ludH1gIHdvdWxkIGluc2VydCBhbgovLy8gICAgcmVjZWl2ZXIgY2hlY2sgdG8gc3RyZW5ndGhlbiB0aGUgdHlwZXMgdG8gYHtpbnR9ICsge2ludH1gIHRvIGFsbG93IHRoZQovLy8gICAgY2FsbCBvZiBgb3BlcmF0b3IrYCB0byBiZSByZXBsYWNlZCB3aXRoIGEgSEFkZCBpbnN0cnVjdGlvbi4KLy8vCi8vLyBBbmFseXNpcyBhbmQgbm9kZSBpbnNlcnRpb24gYXJlIGRvbmUgdG9nZXRoZXIsIHNpbmNlIGluc2VydGlvbiBpbXByb3ZlcyB0aGUKLy8vIHR5cGUgcHJvcGFnYXRpb24gcmVzdWx0cy4KLy8gVE9ETyhzcmEpOiBUaGUgSW52b2tlRHluYW1pY1NwZWNpYWxpemVyIHNob3VsZCBiZSBjb25zdWx0ZWQgZm9yIGJldHRlcgovLyB0YXJnZXRlZCBjb25kaXRpb25pbmcgY2hlY2tzLgpjbGFzcyBTc2FUeXBlUHJvcGFnYXRvciBleHRlbmRzIEhCYXNlVmlzaXRvciBpbXBsZW1lbnRzIE9wdGltaXphdGlvblBoYXNlIHsKICBmaW5hbCBNYXA8aW50LCBISW5zdHJ1Y3Rpb24+IHdvcmttYXAgPSBuZXcgTWFwPGludCwgSEluc3RydWN0aW9uPigpOwogIGZpbmFsIExpc3Q8aW50PiB3b3JrbGlzdCA9IG5ldyBMaXN0PGludD4oKTsKICBmaW5hbCBNYXA8SEluc3RydWN0aW9uLCBGdW5jdGlvbj4gcGVuZGluZ09wdGltaXphdGlvbnMgPQogICAgICBuZXcgTWFwPEhJbnN0cnVjdGlvbiwgRnVuY3Rpb24+KCk7CgogIGZpbmFsIEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzIHJlc3VsdHM7CiAgZmluYWwgQ29tbW9uRWxlbWVudHMgY29tbW9uRWxlbWVudHM7CiAgZmluYWwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkOwogIGZpbmFsIE9wdGltaXphdGlvblRlc3RMb2cgX2xvZzsKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJ1NzYVR5cGVQcm9wYWdhdG9yJzsKCiAgU3NhVHlwZVByb3BhZ2F0b3IoCiAgICAgIHRoaXMucmVzdWx0cywgdGhpcy5jb21tb25FbGVtZW50cywgdGhpcy5jbG9zZWRXb3JsZCwgdGhpcy5fbG9nKTsKCiAgQWJzdHJhY3RWYWx1ZURvbWFpbiBnZXQgYWJzdHJhY3RWYWx1ZURvbWFpbiA9PgogICAgICBjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluOwoKICBBYnN0cmFjdFZhbHVlIGNvbXB1dGVUeXBlKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgcmV0dXJuIGluc3RydWN0aW9uLmFjY2VwdCh0aGlzKTsKICB9CgogIC8vIFJlLWNvbXB1dGUgYW5kIHVwZGF0ZSB0aGUgdHlwZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uIFJldHVybnMKICAvLyB3aGV0aGVyIG9yIG5vdCB0aGUgdHlwZSB3YXMgY2hhbmdlZC4KICBib29sIHVwZGF0ZVR5cGUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICAvLyBDb21wdXRlIG9sZCBhbmQgbmV3IHR5cGVzLgogICAgQWJzdHJhY3RWYWx1ZSBvbGRUeXBlID0gaW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25UeXBlOwogICAgQWJzdHJhY3RWYWx1ZSBuZXdUeXBlID0gY29tcHV0ZVR5cGUoaW5zdHJ1Y3Rpb24pOwogICAgYXNzZXJ0KG5ld1R5cGUgIT0gbnVsbCk7CiAgICAvLyBXZSB1bmNvbmRpdGlvbmFsbHkgcmVwbGFjZSB0aGUgcHJvcGFnYXRlZCB0eXBlIHdpdGggdGhlIG5ldyB0eXBlLiBUaGUKICAgIC8vIGNvbXB1dGVUeXBlIG11c3QgbWFrZSBzdXJlIHRoYXQgd2UgZXZlbnR1YWxseSByZWFjaCBhIHN0YWJsZSBzdGF0ZS4KICAgIGluc3RydWN0aW9uLmluc3RydWN0aW9uVHlwZSA9IG5ld1R5cGU7CiAgICByZXR1cm4gb2xkVHlwZSAhPSBuZXdUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEdyYXBoKEhHcmFwaCBncmFwaCkgewogICAgdmlzaXREb21pbmF0b3JUcmVlKGdyYXBoKTsKICAgIHByb2Nlc3NXb3JrbGlzdCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRCYXNpY0Jsb2NrKEhCYXNpY0Jsb2NrIGJsb2NrKSB7CiAgICBpZiAoYmxvY2suaXNMb29wSGVhZGVyKCkpIHsKICAgICAgYmxvY2suZm9yRWFjaFBoaSgoSFBoaSBwaGkpIHsKICAgICAgICAvLyBTZXQgdGhlIGluaXRpYWwgdHlwZSBmb3IgdGhlIHBoaS4gV2UncmUgbm90IHVzaW5nIHRoZSB0eXBlCiAgICAgICAgLy8gdGhlIHBoaSB0aGlua3MgaXQgaGFzIGJlY2F1c2UgbmV3IG9wdGltaXphdGlvbnMgbWF5IGltcGx5CiAgICAgICAgLy8gY2hhbmdpbmcgaXQuCiAgICAgICAgLy8gSW4gdGhlb3J5IHdlIHdvdWxkIG5lZWQgdG8gbWFyawogICAgICAgIC8vIHRoZSB0eXBlIG9mIGFsbCBvdGhlciBpbmNvbWluZyBlZGdlcyBhcyAidW5pbml0aWFsaXplZCIgYW5kIHRha2UgdGhpcwogICAgICAgIC8vIGludG8gYWNjb3VudCB3aGVuIGRvaW5nIHRoZSBwcm9wYWdhdGlvbiBpbnNpZGUgdGhlIHBoaXMuIEp1c3QKICAgICAgICAvLyBzZXR0aW5nIHRoZSBwcm9wYWdhdGVkIHR5cGUgaXMgaG93ZXZlciBlYXNpZXIuCiAgICAgICAgcGhpLmluc3RydWN0aW9uVHlwZSA9IHBoaS5pbnB1dHNbMF0uaW5zdHJ1Y3Rpb25UeXBlOwogICAgICAgIGFkZFRvV29ya0xpc3QocGhpKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBibG9jay5mb3JFYWNoUGhpKChIUGhpIHBoaSkgewogICAgICAgIGlmICh1cGRhdGVUeXBlKHBoaSkpIHsKICAgICAgICAgIGFkZERlcGVuZGVudEluc3RydWN0aW9uc1RvV29ya0xpc3QocGhpKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiA9IGJsb2NrLmZpcnN0OwogICAgd2hpbGUgKGluc3RydWN0aW9uICE9IG51bGwpIHsKICAgICAgaWYgKHVwZGF0ZVR5cGUoaW5zdHJ1Y3Rpb24pKSB7CiAgICAgICAgYWRkRGVwZW5kZW50SW5zdHJ1Y3Rpb25zVG9Xb3JrTGlzdChpbnN0cnVjdGlvbik7CiAgICAgIH0KICAgICAgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi5uZXh0OwogICAgfQogIH0KCiAgdm9pZCBwcm9jZXNzV29ya2xpc3QoKSB7CiAgICBkbyB7CiAgICAgIHdoaWxlICghd29ya2xpc3QuaXNFbXB0eSkgewogICAgICAgIGludCBpZCA9IHdvcmtsaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSB3b3JrbWFwW2lkXTsKICAgICAgICBhc3NlcnQoaW5zdHJ1Y3Rpb24gIT0gbnVsbCk7CiAgICAgICAgd29ya21hcC5yZW1vdmUoaWQpOwogICAgICAgIGlmICh1cGRhdGVUeXBlKGluc3RydWN0aW9uKSkgewogICAgICAgICAgYWRkRGVwZW5kZW50SW5zdHJ1Y3Rpb25zVG9Xb3JrTGlzdChpbnN0cnVjdGlvbik7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFdoaWxlIHByb2Nlc3NpbmcgdGhlIG9wdGltaXphYmxlIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zLCB3ZQogICAgICAvLyBtYXkgZGlzY292ZXIgYmV0dGVyIHR5cGUgaW5mb3JtYXRpb24gZm9yIGRvbWluYXRlZCB1c2VycyBvZgogICAgICAvLyByZXBsYWNlZCBvcGVyYW5kcywgc28gd2UgbWF5IG5lZWQgdG8gdGFrZSBhbm90aGVyIHN0YWIgYXQKICAgICAgLy8gZW1wdHlpbmcgdGhlIHdvcmtsaXN0IGFmdGVyd2FyZHMuCiAgICAgIHByb2Nlc3NQZW5kaW5nT3B0aW1pemF0aW9ucygpOwogICAgfSB3aGlsZSAoIXdvcmtsaXN0LmlzRW1wdHkpOwogIH0KCiAgdm9pZCBhZGRUb1dvcmtMaXN0KEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgZmluYWwgaW50IGlkID0gaW5zdHJ1Y3Rpb24uaWQ7CgogICAgaWYgKCF3b3JrbWFwLmNvbnRhaW5zS2V5KGlkKSkgewogICAgICB3b3JrbGlzdC5hZGQoaWQpOwogICAgICB3b3JrbWFwW2lkXSA9IGluc3RydWN0aW9uOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB2aXNpdEJpbmFyeUFyaXRobWV0aWMoSEJpbmFyeUFyaXRobWV0aWMgaW5zdHJ1Y3Rpb24pIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24ubGVmdDsKICAgIEhJbnN0cnVjdGlvbiByaWdodCA9IGluc3RydWN0aW9uLnJpZ2h0OwogICAgaWYgKGxlZnQuaXNJbnRlZ2VyKGFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICByaWdodC5pc0ludGVnZXIoYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5pbnRUeXBlOwogICAgfQogICAgaWYgKGxlZnQuaXNEb3VibGUoYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5kb3VibGVUeXBlOwogICAgfQogICAgcmV0dXJuIGFic3RyYWN0VmFsdWVEb21haW4ubnVtVHlwZTsKICB9CgogIEFic3RyYWN0VmFsdWUgY2hlY2tQb3NpdGl2ZUludGVnZXIoSEJpbmFyeUFyaXRobWV0aWMgaW5zdHJ1Y3Rpb24pIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24ubGVmdDsKICAgIEhJbnN0cnVjdGlvbiByaWdodCA9IGluc3RydWN0aW9uLnJpZ2h0OwogICAgaWYgKGxlZnQuaXNQb3NpdGl2ZUludGVnZXIoYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgIHJpZ2h0LmlzUG9zaXRpdmVJbnRlZ2VyKGFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIGFic3RyYWN0VmFsdWVEb21haW4ucG9zaXRpdmVJbnRUeXBlOwogICAgfQogICAgcmV0dXJuIHZpc2l0QmluYXJ5QXJpdGhtZXRpYyhpbnN0cnVjdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHZpc2l0TXVsdGlwbHkoSE11bHRpcGx5IGluc3RydWN0aW9uKSB7CiAgICByZXR1cm4gY2hlY2tQb3NpdGl2ZUludGVnZXIoaW5zdHJ1Y3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB2aXNpdEFkZChIQWRkIGluc3RydWN0aW9uKSB7CiAgICByZXR1cm4gY2hlY2tQb3NpdGl2ZUludGVnZXIoaW5zdHJ1Y3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB2aXNpdERpdmlkZShIRGl2aWRlIGluc3RydWN0aW9uKSB7CiAgICAvLyBBbHdheXMgZG91YmxlLCBhcyBpbml0aWFsaXplZC4KICAgIHJldHVybiBpbnN0cnVjdGlvbi5pbnN0cnVjdGlvblR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHZpc2l0VHJ1bmNhdGluZ0RpdmlkZShIVHJ1bmNhdGluZ0RpdmlkZSBpbnN0cnVjdGlvbikgewogICAgLy8gQWx3YXlzIGFzIGluaXRpYWxpemVkLgogICAgcmV0dXJuIGluc3RydWN0aW9uLmluc3RydWN0aW9uVHlwZTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdmlzaXRSZW1haW5kZXIoSFJlbWFpbmRlciBpbnN0cnVjdGlvbikgewogICAgLy8gQWx3YXlzIGFzIGluaXRpYWxpemVkLgogICAgcmV0dXJuIGluc3RydWN0aW9uLmluc3RydWN0aW9uVHlwZTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdmlzaXROZWdhdGUoSE5lZ2F0ZSBpbnN0cnVjdGlvbikgewogICAgSEluc3RydWN0aW9uIG9wZXJhbmQgPSBpbnN0cnVjdGlvbi5vcGVyYW5kOwogICAgLy8gV2UgaGF2ZSBpbnRlZ2VyIHN1YmNsYXNzZXMgdGhhdCByZXByZXNlbnQgcmFuZ2VzLCBzbyB3aWRlbiBhbnkgaW50CiAgICAvLyBzdWJjbGFzcyB0byBmdWxsIGludGVnZXIuCiAgICBpZiAob3BlcmFuZC5pc0ludGVnZXIoYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gYWJzdHJhY3RWYWx1ZURvbWFpbi5pbnRUeXBlOwogICAgfQogICAgcmV0dXJuIGluc3RydWN0aW9uLm9wZXJhbmQuaW5zdHJ1Y3Rpb25UeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB2aXNpdEFicyhIQWJzIGluc3RydWN0aW9uKSB7CiAgICAvLyBUT0RPKHNyYSk6IENhbiBuYXJyb3cgdG8gbm9uLW5lZ2F0aXZlIHR5cGUgZm9yIGludGVnZXJzLgogICAgcmV0dXJuIGluc3RydWN0aW9uLm9wZXJhbmQuaW5zdHJ1Y3Rpb25UeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB2aXNpdEluc3RydWN0aW9uKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgYXNzZXJ0KGluc3RydWN0aW9uLmluc3RydWN0aW9uVHlwZSAhPSBudWxsKTsKICAgIHJldHVybiBpbnN0cnVjdGlvbi5pbnN0cnVjdGlvblR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHZpc2l0UGhpKEhQaGkgcGhpKSB7CiAgICBBYnN0cmFjdFZhbHVlIGNhbmRpZGF0ZVR5cGUgPSBhYnN0cmFjdFZhbHVlRG9tYWluLmVtcHR5VHlwZTsKICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwaGkuaW5wdXRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIEFic3RyYWN0VmFsdWUgaW5wdXRUeXBlID0gcGhpLmlucHV0c1tpXS5pbnN0cnVjdGlvblR5cGU7CiAgICAgIGNhbmRpZGF0ZVR5cGUgPSBhYnN0cmFjdFZhbHVlRG9tYWluLnVuaW9uKGNhbmRpZGF0ZVR5cGUsIGlucHV0VHlwZSk7CiAgICB9CiAgICByZXR1cm4gY2FuZGlkYXRlVHlwZTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdmlzaXRUeXBlQ29udmVyc2lvbihIVHlwZUNvbnZlcnNpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IGluc3RydWN0aW9uLmNoZWNrZWRJbnB1dDsKICAgIEFic3RyYWN0VmFsdWUgaW5wdXRUeXBlID0gaW5wdXQuaW5zdHJ1Y3Rpb25UeXBlOwogICAgQWJzdHJhY3RWYWx1ZSBjaGVja2VkVHlwZSA9IGluc3RydWN0aW9uLmNoZWNrZWRUeXBlOwogICAgQWJzdHJhY3RWYWx1ZSBvdXRwdXRUeXBlID0KICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmludGVyc2VjdGlvbihjaGVja2VkVHlwZSwgaW5wdXRUeXBlKTsKICAgIG91dHB1dFR5cGUgPSBfbnVtZXJpY0ZpeHVwKG91dHB1dFR5cGUsIGlucHV0VHlwZSwgY2hlY2tlZFR5cGUpOwogICAgaWYgKGlucHV0VHlwZSAhPSBvdXRwdXRUeXBlKSB7CiAgICAgIC8vIFJlcGxhY2UgZG9taW5hdGVkIHVzZXMgb2YgaW5wdXQgd2l0aCB1c2VzIG9mIHRoaXMgSFR5cGVDb252ZXJzaW9uIHNvCiAgICAgIC8vIHRoZSB1c2VzIGJlbmVmaXQgZnJvbSB0aGUgc3Ryb25nZXIgdHlwZS4KICAgICAgLy8KICAgICAgLy8gVGhlIGRlcGVuZGVuY3kgb24gdGhlIGNoZWNrZWQgdmFsdWUgYWxzbyBpbXByb3ZlcyB0aGUgZ2VuZXJhdGVkCiAgICAgIC8vIEphdmFTY3JpcHQuIE1hbnkgY2hlY2tzIGFyZSBjb21waWxlZCB0byBhIGZ1bmN0aW9uIGNhbGwgZXhwcmVzc2lvbiB0aGF0CiAgICAgIC8vIHJldHVybnMgdGhlIGNoZWNrZWQgcmVzdWx0LCBzbyB0aGUgY2hlY2sgY2FuIGJlIGdlbmVyYXRlZCBhcyBhCiAgICAgIC8vIHN1YmV4cHJlc3Npb24gcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBzdGF0ZW1lbnQuCiAgICAgIC8vCiAgICAgIC8vIERvIG5vdCByZXBsYWNlIGxvY2FsIGFjY2Vzc2VzLCBzaW5jZSB0aGUgbG9jYWwgbXVzdCBiZSBhIEhMb2NhbFZhbHVlLAogICAgICAvLyBub3QgYSBIVHlwZUNvbnZlcnNpb24uCiAgICAgIGlmICghKGlucHV0IGlzIEhQYXJhbWV0ZXJWYWx1ZSAmJiBpbnB1dC51c2VkQXNWYXJpYWJsZSgpKSkgewogICAgICAgIGlucHV0LnJlcGxhY2VBbGxVc2Vyc0RvbWluYXRlZEJ5KGluc3RydWN0aW9uLm5leHQsIGluc3RydWN0aW9uKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG91dHB1dFR5cGU7CiAgfQoKICBBYnN0cmFjdFZhbHVlIF9udW1lcmljRml4dXAoQWJzdHJhY3RWYWx1ZSBvdXRwdXRUeXBlLCBBYnN0cmFjdFZhbHVlIGlucHV0VHlwZSwKICAgICAgQWJzdHJhY3RWYWx1ZSBjaGVja2VkVHlwZSkgewogICAgaWYgKGFic3RyYWN0VmFsdWVEb21haW4uaXNFbXB0eShvdXRwdXRUeXBlKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIC8vIEludGVyc2VjdGlvbiBvZiBkb3VibGUgYW5kIGludGVnZXIgY29uZmxpY3RzIChpcyBlbXB0eSksIGJ1dCBKUyBudW1iZXJzCiAgICAgIC8vIGNhbiBiZSBib3RoIGludCBhbmQgZG91YmxlIGF0IHRoZSBzYW1lIHRpbWUuICBGb3IgZXhhbXBsZSwgdGhlIGlucHV0CiAgICAgIC8vIGNhbiBiZSBhIGxpdGVyYWwgZG91YmxlICc4LjAnIHRoYXQgaXMgbWFya2VkIGFzIGFuIGludGVnZXIgKGJlY2F1c2UgJ2lzCiAgICAgIC8vIGludCcgd2lsbCByZXR1cm4gJ3RydWUnKS4gIFdoYXQgd2UgcmVhbGx5IG5lZWQgdG8gZG8gaXMgbWFrZSB0aGUKICAgICAgLy8gb3ZlcmxhcCBiZXR3ZWVuIGludCBhbmQgZG91YmxlIHZhbHVlcyBleHBsaWNpdCBpbiB0aGUgVHlwZU1hc2sgc3lzdGVtLgogICAgICBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0ludGVnZXJPck51bGwoaW5wdXRUeXBlKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmlzRG91YmxlT3JOdWxsKGNoZWNrZWRUeXBlKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgaWYgKGFic3RyYWN0VmFsdWVEb21haW4uaXNOdWxsKGlucHV0VHlwZSkuaXNQb3RlbnRpYWxseVRydWUgJiYKICAgICAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5pc051bGwoY2hlY2tlZFR5cGUpLmlzUG90ZW50aWFsbHlUcnVlKSB7CiAgICAgICAgICBvdXRwdXRUeXBlID0KICAgICAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmluY2x1ZGVOdWxsKGFic3RyYWN0VmFsdWVEb21haW4uZG91YmxlVHlwZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG91dHB1dFR5cGUgPSBhYnN0cmFjdFZhbHVlRG9tYWluLmRvdWJsZVR5cGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gb3V0cHV0VHlwZTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdmlzaXRQcmltaXRpdmVDaGVjayhIUHJpbWl0aXZlQ2hlY2sgaW5zdHJ1Y3Rpb24pIHsKICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IGluc3RydWN0aW9uLmNoZWNrZWRJbnB1dDsKICAgIEFic3RyYWN0VmFsdWUgaW5wdXRUeXBlID0gaW5wdXQuaW5zdHJ1Y3Rpb25UeXBlOwogICAgQWJzdHJhY3RWYWx1ZSBjaGVja2VkVHlwZSA9IGluc3RydWN0aW9uLmNoZWNrZWRUeXBlOwoKICAgIC8vIFdlIG11c3QgbWFrZSBzdXJlIGEgcmVjZWl2ZXIgb3IgYXJndW1lbnQgY2hlY2sgZG9lcyBub3QgdHJ5IHRvIGRvIGFuIGludAogICAgLy8gY2hlY2ssIGJlY2F1c2UgYW4gaW50IGNoZWNrIGlzIG5vdCBlbm91Z2guICBXZSBvbmx5IGRvIGFuIGludCBjaGVjayBpZgogICAgLy8gdGhlIGlucHV0IGlzIGludGVnZXIgb3IgbnVsbC4KICAgIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVtYmVyT3JOdWxsKGNoZWNrZWRUeXBlKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgYWJzdHJhY3RWYWx1ZURvbWFpbi5pc0RvdWJsZU9yTnVsbChjaGVja2VkVHlwZSkuaXNEZWZpbml0ZWx5RmFsc2UgJiYKICAgICAgICBpbnB1dC5pc0ludGVnZXJPck51bGwoYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBpbnN0cnVjdGlvbi5jaGVja2VkVHlwZSA9IGFic3RyYWN0VmFsdWVEb21haW4uaW50VHlwZTsKICAgIH0gZWxzZSBpZiAoYWJzdHJhY3RWYWx1ZURvbWFpbgogICAgICAgICAgICAuaXNJbnRlZ2VyT3JOdWxsKGNoZWNrZWRUeXBlKQogICAgICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgIGlucHV0LmlzSW50ZWdlck9yTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluKS5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgaW5zdHJ1Y3Rpb24uY2hlY2tlZFR5cGUgPSBhYnN0cmFjdFZhbHVlRG9tYWluLm51bVR5cGU7CiAgICB9CgogICAgQWJzdHJhY3RWYWx1ZSBvdXRwdXRUeXBlID0KICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmludGVyc2VjdGlvbihjaGVja2VkVHlwZSwgaW5wdXRUeXBlKTsKICAgIG91dHB1dFR5cGUgPSBfbnVtZXJpY0ZpeHVwKG91dHB1dFR5cGUsIGlucHV0VHlwZSwgY2hlY2tlZFR5cGUpOwogICAgaWYgKGlucHV0VHlwZSAhPSBvdXRwdXRUeXBlKSB7CiAgICAgIC8vIFJlcGxhY2UgZG9taW5hdGVkIHVzZXMgb2YgaW5wdXQgd2l0aCB1c2VzIG9mIHRoaXMgSFByaW1pdGl2ZUNoZWNrIHNvCiAgICAgIC8vIHRoZSB1c2VzIGJlbmVmaXQgZnJvbSB0aGUgc3Ryb25nZXIgdHlwZS4KICAgICAgLy8KICAgICAgLy8gRG8gbm90IHJlcGxhY2UgbG9jYWwgdmFyaWFibGUgYWNjZXNzZXMsIHNpbmNlIHRoZSBsb2NhbCBtdXN0IGJlIGEKICAgICAgLy8gSExvY2FsVmFsdWUsIG5vdCBhbm90aGVyIGtpbmQgb2YgaW5zdHJ1Y3Rpb24uCiAgICAgIGlmICghKGlucHV0IGlzIEhQYXJhbWV0ZXJWYWx1ZSAmJiBpbnB1dC51c2VkQXNWYXJpYWJsZSgpKSkgewogICAgICAgIGlucHV0LnJlcGxhY2VBbGxVc2Vyc0RvbWluYXRlZEJ5KGluc3RydWN0aW9uLm5leHQsIGluc3RydWN0aW9uKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG91dHB1dFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBBYnN0cmFjdFZhbHVlIHZpc2l0VHlwZUtub3duKEhUeXBlS25vd24gaW5zdHJ1Y3Rpb24pIHsKICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IGluc3RydWN0aW9uLmNoZWNrZWRJbnB1dDsKICAgIEFic3RyYWN0VmFsdWUgaW5wdXRUeXBlID0gaW5wdXQuaW5zdHJ1Y3Rpb25UeXBlOwogICAgQWJzdHJhY3RWYWx1ZSBvdXRwdXRUeXBlID0KICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmludGVyc2VjdGlvbihpbnN0cnVjdGlvbi5rbm93blR5cGUsIGlucHV0VHlwZSk7CiAgICBpZiAoaW5wdXRUeXBlICE9IG91dHB1dFR5cGUpIHsKICAgICAgaW5wdXQucmVwbGFjZUFsbFVzZXJzRG9taW5hdGVkQnkoaW5zdHJ1Y3Rpb24ubmV4dCwgaW5zdHJ1Y3Rpb24pOwogICAgfQogICAgcmV0dXJuIG91dHB1dFR5cGU7CiAgfQoKICB2b2lkIGNvbnZlcnRJbnB1dChISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbiwgSEluc3RydWN0aW9uIGlucHV0LAogICAgICBBYnN0cmFjdFZhbHVlIHR5cGUsIGludCBraW5kLCBEYXJ0VHlwZSB0eXBlRXhwcmVzc2lvbikgewogICAgYXNzZXJ0KGtpbmQgPT0gSFByaW1pdGl2ZUNoZWNrLlJFQ0VJVkVSX1RZUEVfQ0hFQ0sgfHwKICAgICAgICBraW5kID09IEhQcmltaXRpdmVDaGVjay5BUkdVTUVOVF9UWVBFX0NIRUNLKTsKICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gKGtpbmQgPT0gSFByaW1pdGl2ZUNoZWNrLlJFQ0VJVkVSX1RZUEVfQ0hFQ0spCiAgICAgICAgPyBpbnN0cnVjdGlvbi5zZWxlY3RvcgogICAgICAgIDogbnVsbDsKICAgIEhQcmltaXRpdmVDaGVjayBjb252ZXJ0ZWQgPSBuZXcgSFByaW1pdGl2ZUNoZWNrKAogICAgICAgIHR5cGVFeHByZXNzaW9uLCBraW5kLCB0eXBlLCBpbnB1dCwgaW5zdHJ1Y3Rpb24uc291cmNlSW5mb3JtYXRpb24sCiAgICAgICAgcmVjZWl2ZXJUeXBlQ2hlY2tTZWxlY3Rvcjogc2VsZWN0b3IpOwogICAgaW5zdHJ1Y3Rpb24uYmxvY2suYWRkQmVmb3JlKGluc3RydWN0aW9uLCBjb252ZXJ0ZWQpOwogICAgaW5wdXQucmVwbGFjZUFsbFVzZXJzRG9taW5hdGVkQnkoaW5zdHJ1Y3Rpb24sIGNvbnZlcnRlZCk7CiAgICBfbG9nPy5yZWdpc3RlclByaW1pdGl2ZUNoZWNrKGluc3RydWN0aW9uLCBjb252ZXJ0ZWQpOwogIH0KCiAgYm9vbCBpc0NoZWNrRW5vdWdoRm9yTnNtT3JBZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24sIEFic3RyYWN0VmFsdWUgdHlwZSkgewogICAgLy8gSW4gc29tZSBjYXNlcywgd2Ugd2FudCB0aGUgcmVjZWl2ZXIgdG8gYmUgYW4gaW50ZWdlciwKICAgIC8vIGJ1dCB0aGF0IGRvZXMgbm90IG1lYW4gd2Ugd2lsbCBnZXQgYSBOb1N1Y2hNZXRob2RFcnJvcgogICAgLy8gaWYgaXQncyBub3Q6IHRoZSByZWNlaXZlciBjb3VsZCBiZSBhIGRvdWJsZS4KICAgIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmlzSW50ZWdlck9yTnVsbCh0eXBlKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIC8vIElmIHRoZSBpbnN0cnVjdGlvbidzIHR5cGUgaXMgaW50ZWdlciBvciBudWxsLCB0aGUgY29kZWdlbgogICAgICAvLyB3aWxsIGVtaXQgYSBudWxsIGNoZWNrLCB3aGljaCBpcyBlbm91Z2ggdG8ga25vdyBpZiBpdCB3aWxsCiAgICAgIC8vIGhpdCBhIG5vU3VjaE1ldGhvZC4KICAgICAgcmV0dXJuIGluc3RydWN0aW9uLmlzSW50ZWdlck9yTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLyBBZGQgYSByZWNlaXZlciB0eXBlIGNoZWNrIHdoZW4gdGhlIGNhbGwgY2FuIG9ubHkgaGl0CiAgLy8gW25vU3VjaE1ldGhvZF0gaWYgdGhlIHJlY2VpdmVyIGlzIG5vdCBvZiBhIHNwZWNpZmljIHR5cGUuCiAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIHR5cGUgY2hlY2sgd2FzIGFkZGVkLgogIGJvb2wgY2hlY2tSZWNlaXZlcihISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbikgewogICAgYXNzZXJ0KGluc3RydWN0aW9uLmlzSW50ZXJjZXB0ZWRDYWxsKTsKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IGluc3RydWN0aW9uLmlucHV0c1sxXTsKICAgIGlmIChyZWNlaXZlci5pc051bWJlcihhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChyZWNlaXZlci5pc051bWJlck9yTnVsbChhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIGNvbnZlcnRJbnB1dCgKICAgICAgICAgIGluc3RydWN0aW9uLAogICAgICAgICAgcmVjZWl2ZXIsCiAgICAgICAgICBhYnN0cmFjdFZhbHVlRG9tYWluLmV4Y2x1ZGVOdWxsKHJlY2VpdmVyLmluc3RydWN0aW9uVHlwZSksCiAgICAgICAgICBIUHJpbWl0aXZlQ2hlY2suUkVDRUlWRVJfVFlQRV9DSEVDSywKICAgICAgICAgIGNvbW1vbkVsZW1lbnRzLm51bVR5cGUpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoaW5zdHJ1Y3Rpb24uZWxlbWVudCA9PSBudWxsKSB7CiAgICAgIGlmIChjbG9zZWRXb3JsZC5pbmNsdWRlc0Nsb3N1cmVDYWxsKAogICAgICAgICAgaW5zdHJ1Y3Rpb24uc2VsZWN0b3IsIGluc3RydWN0aW9uLnJlY2VpdmVyVHlwZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgSXRlcmFibGU8TWVtYmVyRW50aXR5PiB0YXJnZXRzID0gY2xvc2VkV29ybGQubG9jYXRlTWVtYmVycygKICAgICAgICAgIGluc3RydWN0aW9uLnNlbGVjdG9yLCBpbnN0cnVjdGlvbi5yZWNlaXZlclR5cGUpOwogICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT0gMSkgewogICAgICAgIE1lbWJlckVudGl0eSB0YXJnZXQgPSB0YXJnZXRzLmZpcnN0OwogICAgICAgIENsYXNzRW50aXR5IGNscyA9IHRhcmdldC5lbmNsb3NpbmdDbGFzczsKICAgICAgICBBYnN0cmFjdFZhbHVlIHR5cGUgPSBhYnN0cmFjdFZhbHVlRG9tYWluLmNyZWF0ZU5vbk51bGxTdWJjbGFzcyhjbHMpOwogICAgICAgIC8vIFdlIGN1cnJlbnRseSBvbmx5IG9wdGltaXplIG9uIHNvbWUgcHJpbWl0aXZlIHR5cGVzLgogICAgICAgIERhcnRUeXBlIHR5cGVFeHByZXNzaW9uOwogICAgICAgIGlmIChhYnN0cmFjdFZhbHVlRG9tYWluLmlzTnVtYmVyT3JOdWxsKHR5cGUpLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICAgIHR5cGVFeHByZXNzaW9uID0gY29tbW9uRWxlbWVudHMubnVtVHlwZTsKICAgICAgICB9IGVsc2UgaWYgKGFic3RyYWN0VmFsdWVEb21haW4uaXNCb29sZWFuT3JOdWxsKHR5cGUpLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICAgIHR5cGVFeHByZXNzaW9uID0gY29tbW9uRWxlbWVudHMuYm9vbFR5cGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFpc0NoZWNrRW5vdWdoRm9yTnNtT3JBZShyZWNlaXZlciwgdHlwZSkpIHJldHVybiBmYWxzZTsKICAgICAgICBpbnN0cnVjdGlvbi5lbGVtZW50ID0gdGFyZ2V0OwogICAgICAgIGNvbnZlcnRJbnB1dChpbnN0cnVjdGlvbiwgcmVjZWl2ZXIsIHR5cGUsCiAgICAgICAgICAgIEhQcmltaXRpdmVDaGVjay5SRUNFSVZFUl9UWVBFX0NIRUNLLCB0eXBlRXhwcmVzc2lvbik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vIEFkZCBhbiBhcmd1bWVudCB0eXBlIGNoZWNrIGlmIHRoZSBhcmd1bWVudCBpcyBub3Qgb2YgYSB0eXBlCiAgLy8gZXhwZWN0ZWQgYnkgdGhlIGNhbGwuCiAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGFyZ3VtZW50IHR5cGUgY2hlY2sgd2FzIGFkZGVkLgogIGJvb2wgY2hlY2tBcmd1bWVudChISW52b2tlRHluYW1pYyBpbnN0cnVjdGlvbikgewogICAgSEluc3RydWN0aW9uIGxlZnQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMV07CiAgICBISW5zdHJ1Y3Rpb24gcmlnaHQgPSBpbnN0cnVjdGlvbi5pbnB1dHNbMl07CgogICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBpbnN0cnVjdGlvbi5zZWxlY3RvcjsKICAgIGlmIChzZWxlY3Rvci5pc09wZXJhdG9yICYmCiAgICAgICAgbGVmdC5pc051bWJlcihhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIGlmIChyaWdodC5pc051bWJlcihhYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIEFic3RyYWN0VmFsdWUgdHlwZSA9CiAgICAgICAgICByaWdodC5pc0ludGVnZXJPck51bGwoYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZQogICAgICAgICAgICAgID8gYWJzdHJhY3RWYWx1ZURvbWFpbi5leGNsdWRlTnVsbChyaWdodC5pbnN0cnVjdGlvblR5cGUpCiAgICAgICAgICAgICAgOiBhYnN0cmFjdFZhbHVlRG9tYWluLm51bVR5cGU7CiAgICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogU29tZSBudW1iZXIgb3BlcmF0aW9ucyBkb24ndCBoYXZlIGEgYnVpbHRpbgogICAgICAvLyB2YXJpYW50IGFuZCB3aWxsIGRvIHRoZSBjaGVjayBpbiB0aGVpciBtZXRob2QgYW55d2F5LiBXZQogICAgICAvLyBzdGlsbCBhZGQgYSBjaGVjayBiZWNhdXNlIGl0IGFsbG93cyB0byBHVk4gdGhlc2Ugb3BlcmF0aW9ucywKICAgICAgLy8gYnV0IHdlIHNob3VsZCBmaW5kIGEgYmV0dGVyIHdheS4KICAgICAgY29udmVydElucHV0KGluc3RydWN0aW9uLCByaWdodCwgdHlwZSwKICAgICAgICAgIEhQcmltaXRpdmVDaGVjay5BUkdVTUVOVF9UWVBFX0NIRUNLLCBjb21tb25FbGVtZW50cy5udW1UeXBlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIHByb2Nlc3NQZW5kaW5nT3B0aW1pemF0aW9ucygpIHsKICAgIHBlbmRpbmdPcHRpbWl6YXRpb25zLmZvckVhY2goKGluc3RydWN0aW9uLCBhY3Rpb24pID0+IGFjdGlvbigpKTsKICAgIHBlbmRpbmdPcHRpbWl6YXRpb25zLmNsZWFyKCk7CiAgfQoKICB2b2lkIGFkZERlcGVuZGVudEluc3RydWN0aW9uc1RvV29ya0xpc3QoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gaW5zdHJ1Y3Rpb24udXNlZEJ5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIC8vIFRoZSB0eXBlIHByb3BhZ2F0b3Igb25seSBwcm9wYWdhdGVzIHR5cGVzIGZvcndhcmQuIFdlCiAgICAgIC8vIHRodXMgb25seSBuZWVkIHRvIGFkZCB0aGUgdXNlcnMgb2YgdGhlIFtpbnN0cnVjdGlvbl0gdG8gdGhlIGxpc3QuCiAgICAgIGFkZFRvV29ya0xpc3QoaW5zdHJ1Y3Rpb24udXNlZEJ5W2ldKTsKICAgIH0KICB9CgogIHZvaWQgYWRkQWxsVXNlcnNCdXQoSEludm9rZUR5bmFtaWMgaW52b2tlLCBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGluc3RydWN0aW9uLnVzZWRCeS5mb3JFYWNoKChISW5zdHJ1Y3Rpb24gdXNlcikgewogICAgICBpZiAodXNlciAhPSBpbnZva2UpIGFkZFRvV29ya0xpc3QodXNlcik7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIEFic3RyYWN0VmFsdWUgdmlzaXRJbnZva2VEeW5hbWljKEhJbnZva2VEeW5hbWljIGluc3RydWN0aW9uKSB7CiAgICBpZiAoaW5zdHJ1Y3Rpb24uaXNJbnRlcmNlcHRlZENhbGwpIHsKICAgICAgLy8gV2UgY2Fubm90IGRvIHRoZSBmb2xsb3dpbmcgb3B0aW1pemF0aW9uIG5vdywgYmVjYXVzZSB3ZSBoYXZlIHRvIHdhaXQKICAgICAgLy8gZm9yIHRoZSB0eXBlIHByb3BhZ2F0aW9uIHRvIGJlIHN0YWJsZS4gVGhlIHJlY2VpdmVyIG9mIFtpbnN0cnVjdGlvbl0KICAgICAgLy8gbWlnaHQgbW92ZSBmcm9tIG51bWJlciB0byBkeW5hbWljLgogICAgICB2b2lkIGNoZWNrSW5wdXRzKCkgewogICAgICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gaW5zdHJ1Y3Rpb24uc2VsZWN0b3I7CiAgICAgICAgaWYgKHNlbGVjdG9yLmlzT3BlcmF0b3IgJiYgc2VsZWN0b3IubmFtZSAhPSAnPT0nKSB7CiAgICAgICAgICBpZiAoY2hlY2tSZWNlaXZlcihpbnN0cnVjdGlvbikpIHsKICAgICAgICAgICAgYWRkQWxsVXNlcnNCdXQoaW5zdHJ1Y3Rpb24sIGluc3RydWN0aW9uLmlucHV0c1sxXSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXNlbGVjdG9yLmlzVW5hcnlPcGVyYXRvciAmJiBjaGVja0FyZ3VtZW50KGluc3RydWN0aW9uKSkgewogICAgICAgICAgICBhZGRBbGxVc2Vyc0J1dChpbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb24uaW5wdXRzWzJdKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmlzQ2FsbCkgewogICAgICAgICAgaWYgKHNlbGVjdG9yLm5hbWUgPT0gJ2FicycgJiYgc2VsZWN0b3IuYXJndW1lbnRDb3VudCA9PSAwKSB7CiAgICAgICAgICAgIGlmIChjaGVja1JlY2VpdmVyKGluc3RydWN0aW9uKSkgewogICAgICAgICAgICAgIGFkZEFsbFVzZXJzQnV0KGluc3RydWN0aW9uLCBpbnN0cnVjdGlvbi5pbnB1dHNbMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBwZW5kaW5nT3B0aW1pemF0aW9ucy5wdXRJZkFic2VudChpbnN0cnVjdGlvbiwgKCkgPT4gY2hlY2tJbnB1dHMpOwogICAgfQoKICAgIEhJbnN0cnVjdGlvbiByZWNlaXZlciA9IGluc3RydWN0aW9uLmdldERhcnRSZWNlaXZlcihjbG9zZWRXb3JsZCk7CiAgICBBYnN0cmFjdFZhbHVlIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyLmluc3RydWN0aW9uVHlwZTsKICAgIGluc3RydWN0aW9uLnVwZGF0ZVJlY2VpdmVyVHlwZShhYnN0cmFjdFZhbHVlRG9tYWluLCByZWNlaXZlclR5cGUpOwoKICAgIC8vIFRyeSB0byByZWZpbmUgdGhhdCB0aGUgcmVjZWl2ZXIgaXMgbm90IG51bGwgYWZ0ZXIgdGhpcyBjYWxsIGJ5IGluc2VydGluZwogICAgLy8gYSByZWZpbmVtZW50IG5vZGUgKEhUeXBlS25vd24pLgogICAgdmFyIHNlbGVjdG9yID0gaW5zdHJ1Y3Rpb24uc2VsZWN0b3I7CiAgICBpZiAoIXNlbGVjdG9yLmlzQ2xvc3VyZUNhbGwgJiYgIXNlbGVjdG9yLmFwcGxpZXNUb051bGxXaXRob3V0VGhyb3coKSkgewogICAgICB2YXIgbmV4dCA9IGluc3RydWN0aW9uLm5leHQ7CiAgICAgIGlmIChuZXh0IGlzIEhUeXBlS25vd24gJiYgbmV4dC5jaGVja2VkSW5wdXQgPT0gcmVjZWl2ZXIpIHsKICAgICAgICAvLyBPbiBhIHByZXZpb3VzIHBhc3Mgb3IgaXRlcmF0aW9uIHdlIGFscmVhZHkgcmVmaW5lZCBbcmVjZWl2ZXJdIGJ5CiAgICAgICAgLy8gaW5zZXJ0aW5nIGEgW0hUeXBlS25vd25dIGluc3RydWN0aW9uLiBUaGF0IHJlcGxhY2VkIHNldmVyYWwgZG9taW5hdGVkCiAgICAgICAgLy8gdXNlcyB3aXRoIHRoZSByZWZpbmVtZW50LiBXZSB1cGRhdGUgdGhlIHR5cGUgb2YgdGhlIFtIVHlwZUtub3duXQogICAgICAgIC8vIGluc3RydWN0aW9uIGJlY2F1c2UgaXQgbWF5IGhhdmUgYmVlbiByZWZpbmVkIHdpdGggYSBjb3JyZWN0IHR5cGUgYXQKICAgICAgICAvLyB0aGUgdGltZSwgYnV0IGluY29ycmVjdCBub3cuCiAgICAgICAgQWJzdHJhY3RWYWx1ZSBuZXdUeXBlID0gYWJzdHJhY3RWYWx1ZURvbWFpbi5leGNsdWRlTnVsbChyZWNlaXZlclR5cGUpOwogICAgICAgIGlmIChuZXh0Lmluc3RydWN0aW9uVHlwZSAhPSBuZXdUeXBlKSB7CiAgICAgICAgICBuZXh0Lmtub3duVHlwZSA9IG5leHQuaW5zdHJ1Y3Rpb25UeXBlID0gbmV3VHlwZTsKICAgICAgICAgIGFkZERlcGVuZGVudEluc3RydWN0aW9uc1RvV29ya0xpc3QobmV4dCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGFic3RyYWN0VmFsdWVEb21haW4uaXNOdWxsKHJlY2VpdmVyVHlwZSkuaXNQb3RlbnRpYWxseVRydWUpIHsKICAgICAgICBEb21pbmF0ZWRVc2VzIHVzZXMgPQogICAgICAgICAgICBEb21pbmF0ZWRVc2VzLm9mKHJlY2VpdmVyLCBpbnN0cnVjdGlvbiwgZXhjbHVkZURvbWluYXRvcjogdHJ1ZSk7CiAgICAgICAgaWYgKHVzZXMuaXNOb3RFbXB0eSkgewogICAgICAgICAgLy8gSW5zZXJ0IGEgcmVmaW5lbWVudCBub2RlIGFmdGVyIHRoZSBjYWxsIGFuZCB1cGRhdGUgYWxsIHVzZXJzCiAgICAgICAgICAvLyBkb21pbmF0ZWQgYnkgdGhlIGNhbGwgdG8gdXNlIHRoYXQgbm9kZSBpbnN0ZWFkIG9mIFtyZWNlaXZlcl0uCiAgICAgICAgICBBYnN0cmFjdFZhbHVlIG5ld1R5cGUgPSBhYnN0cmFjdFZhbHVlRG9tYWluLmV4Y2x1ZGVOdWxsKHJlY2VpdmVyVHlwZSk7CiAgICAgICAgICBIVHlwZUtub3duIGNvbnZlcnRlZCA9CiAgICAgICAgICAgICAgbmV3IEhUeXBlS25vd24ud2l0bmVzc2VkKG5ld1R5cGUsIHJlY2VpdmVyLCBpbnN0cnVjdGlvbik7CiAgICAgICAgICBpbnN0cnVjdGlvbi5ibG9jay5hZGRCZWZvcmUoaW5zdHJ1Y3Rpb24ubmV4dCwgY29udmVydGVkKTsKICAgICAgICAgIHVzZXMucmVwbGFjZVdpdGgoY29udmVydGVkKTsKICAgICAgICAgIGFkZERlcGVuZGVudEluc3RydWN0aW9uc1RvV29ya0xpc3QoY29udmVydGVkKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaW5zdHJ1Y3Rpb24uc3BlY2lhbGl6ZXIKICAgICAgICAuY29tcHV0ZVR5cGVGcm9tSW5wdXRUeXBlcyhpbnN0cnVjdGlvbiwgcmVzdWx0cywgY2xvc2VkV29ybGQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQWJzdHJhY3RWYWx1ZSB2aXNpdEFzQ2hlY2soSEFzQ2hlY2sgaW5zdHJ1Y3Rpb24pIHsKICAgIEhJbnN0cnVjdGlvbiBpbnB1dCA9IGluc3RydWN0aW9uLmNoZWNrZWRJbnB1dDsKICAgIEFic3RyYWN0VmFsdWUgaW5wdXRUeXBlID0gaW5wdXQuaW5zdHJ1Y3Rpb25UeXBlOwogICAgQWJzdHJhY3RWYWx1ZSBjaGVja2VkVHlwZSA9IGluc3RydWN0aW9uLmNoZWNrZWRUeXBlLmFic3RyYWN0VmFsdWU7CiAgICBBYnN0cmFjdFZhbHVlIG91dHB1dFR5cGUgPQogICAgICAgIGFic3RyYWN0VmFsdWVEb21haW4uaW50ZXJzZWN0aW9uKGNoZWNrZWRUeXBlLCBpbnB1dFR5cGUpOwogICAgb3V0cHV0VHlwZSA9IF9udW1lcmljRml4dXAob3V0cHV0VHlwZSwgaW5wdXRUeXBlLCBjaGVja2VkVHlwZSk7CiAgICBpZiAoaW5wdXRUeXBlICE9IG91dHB1dFR5cGUpIHsKICAgICAgLy8gUmVwbGFjZSBkb21pbmF0ZWQgdXNlcyBvZiBpbnB1dCB3aXRoIHVzZXMgb2YgdGhpcyBIVHlwZUNvbnZlcnNpb24gc28KICAgICAgLy8gdGhlIHVzZXMgYmVuZWZpdCBmcm9tIHRoZSBzdHJvbmdlciB0eXBlLgogICAgICAvLwogICAgICAvLyBEbyBub3QgcmVwbGFjZSBsb2NhbCBhY2Nlc3Nlcywgc2luY2UgdGhlIGxvY2FsIG11c3QgYmUgYSBITG9jYWxWYWx1ZSwKICAgICAgLy8gbm90IGEgSEFzQ2hlY2suCiAgICAgIGlmICghKGlucHV0IGlzIEhQYXJhbWV0ZXJWYWx1ZSAmJiBpbnB1dC51c2VkQXNWYXJpYWJsZSgpKSkgewogICAgICAgIGlucHV0LnJlcGxhY2VBbGxVc2Vyc0RvbWluYXRlZEJ5KGluc3RydWN0aW9uLm5leHQsIGluc3RydWN0aW9uKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG91dHB1dFR5cGU7CiAgfQp9CoINAE5OPAE2JCExITIqFxUYATcESAQ+BExRS05DBFAeSiFMRy47KQEsJyIiDCoBFUcBMScBOCUEAUAqLiI5Nh1NSysfBAEMIh8XBAEMJyAkRkUYK1FJOj0cCg0kHzMKCgYBLCIlOQgmBgQBGwkiKDAlHCc7CghGRUMrJSEEATEjASQYIQYEAQxHKixAQSoGPy0GKAQBRiosSEkyBi8EAQw3LgQBDC0uBAEMMyYoBAEMRx4oBAEMOR4oBAEMMzBKIUMqBjAEAQwtQDAEAQw9MSgEAQwlQUM/SwYaBAEMQzM1OR9CRCNOMglJUUg5CU8gQ0kIBhcEAVEjRFFOUUpQTU5HSRdPETcKCAYXBAEMQzM1OQFQTiVMTUc9IyohST0GAR9CRCNOMglLN0NJCAYXBAEMOTM1H0wjRwYXBAFEPzo2Rh8QNUouOT46BAFPPT40RkNEHVAGEQQBOj83MyszQxQGSRQXFEUvIxMuKz0WCEI7IS0xTT8hSTNRNBEYCkQmMkIVCAYSBAFBGzczLzABLh8/QhYIG0ZHLUZCRiotSBMGEgQBJ0UiBAFGSz9LLAYEAUk1LwgEAQxBKU5OLBsyPCxADElADCZHLkIODAoIAUgGAUY7RwFQJylMI0FMUUxPKE8vOzQKTx1NH0pLUSFIRCc5CggGASNHBAEMNTM1Rx9CRCNOMglPGUNJCAYXBAIBL3BhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS90eXBlc19wcm9wYWdhdGlvbi5kYXJ0O3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3NzYS92YWx1ZV9yYW5nZV9hbmFseXplci5kYXJ0wACcBS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL2NvbnN0YW50cy9jb25zdGFudF9zeXN0ZW0uZGFydCcgYXMgY29uc3RhbnRfc3lzdGVtOwppbXBvcnQgJy4uL2NvbnN0YW50cy92YWx1ZXMuZGFydCc7CmltcG9ydCAnLi4vd29ybGQuZGFydCcgc2hvdyBKQ2xvc2VkV29ybGQ7CmltcG9ydCAnbm9kZXMuZGFydCc7CmltcG9ydCAnb3B0aW1pemUuZGFydCc7CgpjbGFzcyBWYWx1ZVJhbmdlSW5mbyB7CiAgSW50VmFsdWUgaW50WmVybzsKICBJbnRWYWx1ZSBpbnRPbmU7CgogIFZhbHVlUmFuZ2VJbmZvKCkgewogICAgaW50WmVybyA9IG5ld0ludFZhbHVlKEJpZ0ludC56ZXJvKTsKICAgIGludE9uZSA9IG5ld0ludFZhbHVlKEJpZ0ludC5vbmUpOwogIH0KCiAgVmFsdWUgbmV3SW50VmFsdWUoQmlnSW50IHZhbHVlKSB7CiAgICByZXR1cm4gbmV3IEludFZhbHVlKHZhbHVlLCB0aGlzKTsKICB9CgogIFZhbHVlIG5ld0luc3RydWN0aW9uVmFsdWUoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICByZXR1cm4gbmV3IEluc3RydWN0aW9uVmFsdWUoaW5zdHJ1Y3Rpb24sIHRoaXMpOwogIH0KCiAgVmFsdWUgbmV3UG9zaXRpdmVWYWx1ZShISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIHJldHVybiBuZXcgUG9zaXRpdmVWYWx1ZShpbnN0cnVjdGlvbiwgdGhpcyk7CiAgfQoKICBWYWx1ZSBuZXdBZGRWYWx1ZShWYWx1ZSBsZWZ0LCBWYWx1ZSByaWdodCkgewogICAgcmV0dXJuIG5ldyBBZGRWYWx1ZShsZWZ0LCByaWdodCwgdGhpcyk7CiAgfQoKICBWYWx1ZSBuZXdTdWJ0cmFjdFZhbHVlKFZhbHVlIGxlZnQsIFZhbHVlIHJpZ2h0KSB7CiAgICByZXR1cm4gbmV3IFN1YnRyYWN0VmFsdWUobGVmdCwgcmlnaHQsIHRoaXMpOwogIH0KCiAgVmFsdWUgbmV3TmVnYXRlVmFsdWUoVmFsdWUgdmFsdWUpIHsKICAgIHJldHVybiBuZXcgTmVnYXRlVmFsdWUodmFsdWUsIHRoaXMpOwogIH0KCiAgUmFuZ2UgbmV3VW5ib3VuZFJhbmdlKCkgewogICAgcmV0dXJuIG5ldyBSYW5nZS51bmJvdW5kKHRoaXMpOwogIH0KCiAgUmFuZ2UgbmV3Tm9ybWFsaXplZFJhbmdlKFZhbHVlIGxvdywgVmFsdWUgdXApIHsKICAgIHJldHVybiBuZXcgUmFuZ2Uubm9ybWFsaXplKGxvdywgdXAsIHRoaXMpOwogIH0KCiAgUmFuZ2UgbmV3TWFya2VyUmFuZ2UoKSB7CiAgICByZXR1cm4gbmV3IFJhbmdlKAogICAgICAgIG5ldyBNYXJrZXJWYWx1ZShmYWxzZSwgdGhpcyksIG5ldyBNYXJrZXJWYWx1ZSh0cnVlLCB0aGlzKSwgdGhpcyk7CiAgfQp9CgovLy8gQSBbVmFsdWVdIHJlcHJlc2VudHMgYm90aCBzeW1ib2xpYyB2YWx1ZXMgbGlrZSB0aGUgdmFsdWUgb2YgYQovLy8gcGFyYW1ldGVyLCBvciB0aGUgbGVuZ3RoIG9mIGFuIGFycmF5LCBhbmQgY29uY3JldGUgdmFsdWVzLCBsaWtlCi8vLyBjb25zdGFudHMuCmFic3RyYWN0IGNsYXNzIFZhbHVlIHsKICBmaW5hbCBWYWx1ZVJhbmdlSW5mbyBpbmZvOwogIGNvbnN0IFZhbHVlKHRoaXMuaW5mbyk7CgogIFZhbHVlIG9wZXJhdG9yICsoVmFsdWUgb3RoZXIpID0+IGNvbnN0IFVua25vd25WYWx1ZSgpOwogIFZhbHVlIG9wZXJhdG9yIC0oVmFsdWUgb3RoZXIpID0+IGNvbnN0IFVua25vd25WYWx1ZSgpOwogIFZhbHVlIG9wZXJhdG9yIC0oKSA9PiBjb25zdCBVbmtub3duVmFsdWUoKTsKICBWYWx1ZSBvcGVyYXRvciAmKFZhbHVlIG90aGVyKSA9PiBjb25zdCBVbmtub3duVmFsdWUoKTsKCiAgVmFsdWUgbWluKFZhbHVlIG90aGVyKSB7CiAgICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuIHRoaXM7CiAgICBpZiAob3RoZXIgPT0gY29uc3QgTWluSW50VmFsdWUoKSkgcmV0dXJuIG90aGVyOwogICAgaWYgKG90aGVyID09IGNvbnN0IE1heEludFZhbHVlKCkpIHJldHVybiB0aGlzOwogICAgVmFsdWUgdmFsdWUgPSB0aGlzIC0gb3RoZXI7CiAgICBpZiAodmFsdWUuaXNQb3NpdGl2ZSkgcmV0dXJuIG90aGVyOwogICAgaWYgKHZhbHVlLmlzTmVnYXRpdmUpIHJldHVybiB0aGlzOwogICAgcmV0dXJuIGNvbnN0IFVua25vd25WYWx1ZSgpOwogIH0KCiAgVmFsdWUgbWF4KFZhbHVlIG90aGVyKSB7CiAgICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuIHRoaXM7CiAgICBpZiAob3RoZXIgPT0gY29uc3QgTWluSW50VmFsdWUoKSkgcmV0dXJuIHRoaXM7CiAgICBpZiAob3RoZXIgPT0gY29uc3QgTWF4SW50VmFsdWUoKSkgcmV0dXJuIG90aGVyOwogICAgVmFsdWUgdmFsdWUgPSB0aGlzIC0gb3RoZXI7CiAgICBpZiAodmFsdWUuaXNQb3NpdGl2ZSkgcmV0dXJuIHRoaXM7CiAgICBpZiAodmFsdWUuaXNOZWdhdGl2ZSkgcmV0dXJuIG90aGVyOwogICAgcmV0dXJuIGNvbnN0IFVua25vd25WYWx1ZSgpOwogIH0KCiAgYm9vbCBnZXQgaXNOZWdhdGl2ZSA9PiBmYWxzZTsKICBib29sIGdldCBpc1Bvc2l0aXZlID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzWmVybyA9PiBmYWxzZTsKfQoKLy8vIFRoZSBbTWFya2VyVmFsdWVdIGNsYXNzIGlzIHVzZWQgdG8gcmVjb2duaXplIHJhbmdlcyBvZiBsb29wCi8vLyB1cGRhdGVzLgpjbGFzcyBNYXJrZXJWYWx1ZSBleHRlbmRzIFZhbHVlIHsKICAvLy8gSWYgW3Bvc2l0aXZlXSBpcyB0cnVlIChyZXNwZWN0aXZlbHkgZmFsc2UpLCB0aGUgbWFya2VyIGdvZXMKICAvLy8gdG8gW01heEludFZhbHVlXSAocmVzcGVjdGl2ZWx5IFtNaW5JbnRWYWx1ZV0pIHdoZW4gYmVpbmcgYWRkZWQKICAvLy8gdG8gYSBwb3NpdGl2ZSAocmVzcGVjdGl2ZWx5IG5lZ2F0aXZlKSB2YWx1ZS4KICBmaW5hbCBib29sIHBvc2l0aXZlOwoKICBjb25zdCBNYXJrZXJWYWx1ZSh0aGlzLnBvc2l0aXZlLCBpbmZvKSA6IHN1cGVyKGluZm8pOwoKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciArKFZhbHVlIG90aGVyKSB7CiAgICBpZiAob3RoZXIuaXNQb3NpdGl2ZSAmJiBwb3NpdGl2ZSkgcmV0dXJuIGNvbnN0IE1heEludFZhbHVlKCk7CiAgICBpZiAob3RoZXIuaXNOZWdhdGl2ZSAmJiAhcG9zaXRpdmUpIHJldHVybiBjb25zdCBNaW5JbnRWYWx1ZSgpOwogICAgaWYgKG90aGVyIGlzIEludFZhbHVlKSByZXR1cm4gdGhpczsKICAgIHJldHVybiBjb25zdCBVbmtub3duVmFsdWUoKTsKICB9CgogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yIC0oVmFsdWUgb3RoZXIpIHsKICAgIGlmIChvdGhlci5pc1Bvc2l0aXZlICYmICFwb3NpdGl2ZSkgcmV0dXJuIGNvbnN0IE1pbkludFZhbHVlKCk7CiAgICBpZiAob3RoZXIuaXNOZWdhdGl2ZSAmJiBwb3NpdGl2ZSkgcmV0dXJuIGNvbnN0IE1heEludFZhbHVlKCk7CiAgICBpZiAob3RoZXIgaXMgSW50VmFsdWUpIHJldHVybiB0aGlzOwogICAgcmV0dXJuIGNvbnN0IFVua25vd25WYWx1ZSgpOwogIH0KfQoKLy8vIEFuIFtJbnRWYWx1ZV0gY29udGFpbnMgYSBjb25zdGFudCBpbnRlZ2VyIHZhbHVlLgpjbGFzcyBJbnRWYWx1ZSBleHRlbmRzIFZhbHVlIHsKICBmaW5hbCBCaWdJbnQgdmFsdWU7CgogIGNvbnN0IEludFZhbHVlKHRoaXMudmFsdWUsIGluZm8pIDogc3VwZXIoaW5mbyk7CgogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yICsoZHluYW1pYyBvdGhlcikgewogICAgaWYgKG90aGVyLmlzWmVybykgcmV0dXJuIHRoaXM7CiAgICBpZiAob3RoZXIgaXMhIEludFZhbHVlKSByZXR1cm4gb3RoZXIgKyB0aGlzOwogICAgZHluYW1pYyBjb25zdGFudCA9IGNvbnN0YW50X3N5c3RlbS5hZGQuZm9sZCgKICAgICAgICBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50KHZhbHVlKSwKICAgICAgICBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50KG90aGVyLnZhbHVlKSk7CiAgICBpZiAoIWNvbnN0YW50LmlzSW50KSByZXR1cm4gY29uc3QgVW5rbm93blZhbHVlKCk7CiAgICByZXR1cm4gaW5mby5uZXdJbnRWYWx1ZShjb25zdGFudC5pbnRWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciAtKGR5bmFtaWMgb3RoZXIpIHsKICAgIGlmIChvdGhlci5pc1plcm8pIHJldHVybiB0aGlzOwogICAgaWYgKG90aGVyIGlzISBJbnRWYWx1ZSkgcmV0dXJuIC1vdGhlciArIHRoaXM7CiAgICBkeW5hbWljIGNvbnN0YW50ID0gY29uc3RhbnRfc3lzdGVtLnN1YnRyYWN0LmZvbGQoCiAgICAgICAgY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUludCh2YWx1ZSksCiAgICAgICAgY29uc3RhbnRfc3lzdGVtLmNyZWF0ZUludChvdGhlci52YWx1ZSkpOwogICAgaWYgKCFjb25zdGFudC5pc0ludCkgcmV0dXJuIGNvbnN0IFVua25vd25WYWx1ZSgpOwogICAgcmV0dXJuIGluZm8ubmV3SW50VmFsdWUoY29uc3RhbnQuaW50VmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgLSgpIHsKICAgIGlmIChpc1plcm8pIHJldHVybiB0aGlzOwogICAgZHluYW1pYyBjb25zdGFudCA9CiAgICAgICAgY29uc3RhbnRfc3lzdGVtLm5lZ2F0ZS5mb2xkKGNvbnN0YW50X3N5c3RlbS5jcmVhdGVJbnQodmFsdWUpKTsKICAgIGlmICghY29uc3RhbnQuaXNJbnQpIHJldHVybiBjb25zdCBVbmtub3duVmFsdWUoKTsKICAgIHJldHVybiBpbmZvLm5ld0ludFZhbHVlKGNvbnN0YW50LmludFZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yICYoZHluYW1pYyBvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBJbnRWYWx1ZSkgcmV0dXJuIGNvbnN0IFVua25vd25WYWx1ZSgpOwogICAgZHluYW1pYyBjb25zdGFudCA9IGNvbnN0YW50X3N5c3RlbS5iaXRBbmQuZm9sZCgKICAgICAgICBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50KHZhbHVlKSwKICAgICAgICBjb25zdGFudF9zeXN0ZW0uY3JlYXRlSW50KG90aGVyLnZhbHVlKSk7CiAgICByZXR1cm4gaW5mby5uZXdJbnRWYWx1ZShjb25zdGFudC5pbnRWYWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBWYWx1ZSBtaW4oZHluYW1pYyBvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBJbnRWYWx1ZSkgcmV0dXJuIG90aGVyLm1pbih0aGlzKTsKICAgIHJldHVybiB0aGlzLnZhbHVlIDwgb3RoZXIudmFsdWUgPyB0aGlzIDogb3RoZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBWYWx1ZSBtYXgoZHluYW1pYyBvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBJbnRWYWx1ZSkgcmV0dXJuIG90aGVyLm1heCh0aGlzKTsKICAgIHJldHVybiB0aGlzLnZhbHVlIDwgb3RoZXIudmFsdWUgPyBvdGhlciA6IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIEludFZhbHVlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdGhpcy52YWx1ZSA9PSBvdGhlci52YWx1ZTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ0ludFZhbHVlLmhhc2hDb2RlJyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdJbnRWYWx1ZSAkdmFsdWUnOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgPT4gdmFsdWUgPCBCaWdJbnQuemVybzsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1Bvc2l0aXZlID0+IHZhbHVlID49IEJpZ0ludC56ZXJvOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzWmVybyA9PiB2YWx1ZSA9PSBCaWdJbnQuemVybzsKfQoKLy8vIFRoZSBbTWF4SW50VmFsdWVdIHJlcHJlc2VudHMgdGhlIG1heGltdW0gdmFsdWUgYW4gaW50ZWdlciBjYW4gaGF2ZSwKLy8vIHdoaWNoIGlzIGN1cnJlbnRseSAraW5maW5pdHkuCmNsYXNzIE1heEludFZhbHVlIGV4dGVuZHMgVmFsdWUgewogIGNvbnN0IE1heEludFZhbHVlKCkgOiBzdXBlcihudWxsKTsKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciArKFZhbHVlIG90aGVyKSA9PiB0aGlzOwogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yIC0oVmFsdWUgb3RoZXIpID0+IHRoaXM7CiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgLSgpID0+IGNvbnN0IE1pbkludFZhbHVlKCk7CiAgQG92ZXJyaWRlCiAgVmFsdWUgbWluKFZhbHVlIG90aGVyKSA9PiBvdGhlcjsKICBAb3ZlcnJpZGUKICBWYWx1ZSBtYXgoVmFsdWUgb3RoZXIpID0+IHRoaXM7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ01heCc7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOZWdhdGl2ZSA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1Bvc2l0aXZlID0+IHRydWU7Cn0KCi8vLyBUaGUgW01pbkludFZhbHVlXSByZXByZXNlbnRzIHRoZSBtaW5pbXVtIHZhbHVlIGFuIGludGVnZXIgY2FuIGhhdmUsCi8vLyB3aGljaCBpcyBjdXJyZW50bHkgLWluZmluaXR5LgpjbGFzcyBNaW5JbnRWYWx1ZSBleHRlbmRzIFZhbHVlIHsKICBjb25zdCBNaW5JbnRWYWx1ZSgpIDogc3VwZXIobnVsbCk7CiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgKyhWYWx1ZSBvdGhlcikgPT4gdGhpczsKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciAtKFZhbHVlIG90aGVyKSA9PiB0aGlzOwogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yIC0oKSA9PiBjb25zdCBNYXhJbnRWYWx1ZSgpOwogIEBvdmVycmlkZQogIFZhbHVlIG1pbihWYWx1ZSBvdGhlcikgPT4gdGhpczsKICBAb3ZlcnJpZGUKICBWYWx1ZSBtYXgoVmFsdWUgb3RoZXIpID0+IG90aGVyOwogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdNaW4nOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgPT4gdHJ1ZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1Bvc2l0aXZlID0+IGZhbHNlOwp9CgovLy8gVGhlIFtVbmtub3duVmFsdWVdIGlzIHRoZSBzZW50aW5lbCBpbiBvdXIgYW5hbHlzaXMgdG8gbWFyayBhbgovLy8gb3BlcmF0aW9uIHRoYXQgY291bGQgbm90IGJlIGRvbmUgYmVjYXVzZSBvZiB0b28gbXVjaCBjb21wbGV4aXR5LgpjbGFzcyBVbmtub3duVmFsdWUgZXh0ZW5kcyBWYWx1ZSB7CiAgY29uc3QgVW5rbm93blZhbHVlKCkgOiBzdXBlcihudWxsKTsKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciArKFZhbHVlIG90aGVyKSA9PiBjb25zdCBVbmtub3duVmFsdWUoKTsKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciAtKFZhbHVlIG90aGVyKSA9PiBjb25zdCBVbmtub3duVmFsdWUoKTsKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciAtKCkgPT4gY29uc3QgVW5rbm93blZhbHVlKCk7CiAgQG92ZXJyaWRlCiAgVmFsdWUgbWluKFZhbHVlIG90aGVyKSA9PiBjb25zdCBVbmtub3duVmFsdWUoKTsKICBAb3ZlcnJpZGUKICBWYWx1ZSBtYXgoVmFsdWUgb3RoZXIpID0+IGNvbnN0IFVua25vd25WYWx1ZSgpOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgPT4gZmFsc2U7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNQb3NpdGl2ZSA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnVW5rbm93bic7Cn0KCi8vLyBBIHN5bWJvbGljIHZhbHVlIHJlcHJlc2VudGluZyBhbiBbSEluc3RydWN0aW9uXS4KY2xhc3MgSW5zdHJ1Y3Rpb25WYWx1ZSBleHRlbmRzIFZhbHVlIHsKICBmaW5hbCBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb247CiAgSW5zdHJ1Y3Rpb25WYWx1ZSh0aGlzLmluc3RydWN0aW9uLCBpbmZvKSA6IHN1cGVyKGluZm8pOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIEluc3RydWN0aW9uVmFsdWUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0aGlzLmluc3RydWN0aW9uID09IG90aGVyLmluc3RydWN0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignSW5zdHJ1Y3Rpb25WYWx1ZS5oYXNoQ29kZScpOwoKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciArKFZhbHVlIG90aGVyKSB7CiAgICBpZiAob3RoZXIuaXNaZXJvKSByZXR1cm4gdGhpczsKICAgIGlmIChvdGhlciBpcyBJbnRWYWx1ZSkgewogICAgICBpZiAob3RoZXIuaXNOZWdhdGl2ZSkgewogICAgICAgIHJldHVybiBpbmZvLm5ld1N1YnRyYWN0VmFsdWUodGhpcywgLW90aGVyKTsKICAgICAgfQogICAgICByZXR1cm4gaW5mby5uZXdBZGRWYWx1ZSh0aGlzLCBvdGhlcik7CiAgICB9CiAgICBpZiAob3RoZXIgaXMgSW5zdHJ1Y3Rpb25WYWx1ZSkgewogICAgICByZXR1cm4gaW5mby5uZXdBZGRWYWx1ZSh0aGlzLCBvdGhlcik7CiAgICB9CiAgICByZXR1cm4gb3RoZXIgKyB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgLShWYWx1ZSBvdGhlcikgewogICAgaWYgKG90aGVyLmlzWmVybykgcmV0dXJuIHRoaXM7CiAgICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuIGluZm8uaW50WmVybzsKICAgIGlmIChvdGhlciBpcyBJbnRWYWx1ZSkgewogICAgICBpZiAob3RoZXIuaXNOZWdhdGl2ZSkgewogICAgICAgIHJldHVybiBpbmZvLm5ld0FkZFZhbHVlKHRoaXMsIC1vdGhlcik7CiAgICAgIH0KICAgICAgcmV0dXJuIGluZm8ubmV3U3VidHJhY3RWYWx1ZSh0aGlzLCBvdGhlcik7CiAgICB9CiAgICBpZiAob3RoZXIgaXMgSW5zdHJ1Y3Rpb25WYWx1ZSkgewogICAgICByZXR1cm4gaW5mby5uZXdTdWJ0cmFjdFZhbHVlKHRoaXMsIG90aGVyKTsKICAgIH0KICAgIHJldHVybiAtb3RoZXIgKyB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgLSgpIHsKICAgIHJldHVybiBpbmZvLm5ld05lZ2F0ZVZhbHVlKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOZWdhdGl2ZSA9PiBmYWxzZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1Bvc2l0aXZlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnSW5zdHJ1Y3Rpb246ICRpbnN0cnVjdGlvbic7Cn0KCi8vLyBTcGVjaWFsIHZhbHVlIGZvciBpbnN0cnVjdGlvbnMgd2hvc2UgdHlwZSBpcyBhIHBvc2l0aXZlIGludGVnZXIuCmNsYXNzIFBvc2l0aXZlVmFsdWUgZXh0ZW5kcyBJbnN0cnVjdGlvblZhbHVlIHsKICBQb3NpdGl2ZVZhbHVlKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiwgaW5mbykgOiBzdXBlcihpbnN0cnVjdGlvbiwgaW5mbyk7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNQb3NpdGl2ZSA9PiB0cnVlOwp9CgovLy8gUmVwcmVzZW50cyBhIGJpbmFyeSBvcGVyYXRpb24gb24gdHdvIFtWYWx1ZV0sIHdoZXJlIHRoZSBvcGVyYXRpb24KLy8vIGRpZCBub3QgeWllbGQgYSBjYW5vbmljYWwgdmFsdWUuCmNsYXNzIEJpbmFyeU9wZXJhdGlvblZhbHVlIGV4dGVuZHMgVmFsdWUgewogIGZpbmFsIFZhbHVlIGxlZnQ7CiAgZmluYWwgVmFsdWUgcmlnaHQ7CiAgQmluYXJ5T3BlcmF0aW9uVmFsdWUodGhpcy5sZWZ0LCB0aGlzLnJpZ2h0LCBpbmZvKSA6IHN1cGVyKGluZm8pOwp9CgpjbGFzcyBBZGRWYWx1ZSBleHRlbmRzIEJpbmFyeU9wZXJhdGlvblZhbHVlIHsKICBBZGRWYWx1ZShsZWZ0LCByaWdodCwgaW5mbykgOiBzdXBlcihsZWZ0LCByaWdodCwgaW5mbyk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgQWRkVmFsdWUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiAobGVmdCA9PSBvdGhlci5sZWZ0ICYmIHJpZ2h0ID09IG90aGVyLnJpZ2h0KSB8fAogICAgICAgIChsZWZ0ID09IG90aGVyLnJpZ2h0ICYmIHJpZ2h0ID09IG90aGVyLmxlZnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignQWRkVmFsdWUuaGFzaENvZGUnKTsKCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgLSgpID0+IC1sZWZ0IC0gcmlnaHQ7CgogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yICsoVmFsdWUgb3RoZXIpIHsKICAgIGlmIChvdGhlci5pc1plcm8pIHJldHVybiB0aGlzOwogICAgVmFsdWUgdmFsdWUgPSBsZWZ0ICsgb3RoZXI7CiAgICBpZiAodmFsdWUgIT0gY29uc3QgVW5rbm93blZhbHVlKCkgJiYgdmFsdWUgaXMhIEJpbmFyeU9wZXJhdGlvblZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZSArIHJpZ2h0OwogICAgfQogICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBub3Qgc2ltcGxlIGVub3VnaCwgd2UgdHJ5IHRoZSBzYW1lIGFwcHJvYWNoCiAgICAvLyB3aXRoIFtyaWdodF0uCiAgICB2YWx1ZSA9IHJpZ2h0ICsgb3RoZXI7CiAgICBpZiAodmFsdWUgIT0gY29uc3QgVW5rbm93blZhbHVlKCkgJiYgdmFsdWUgaXMhIEJpbmFyeU9wZXJhdGlvblZhbHVlKSB7CiAgICAgIHJldHVybiBsZWZ0ICsgdmFsdWU7CiAgICB9CiAgICByZXR1cm4gY29uc3QgVW5rbm93blZhbHVlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBWYWx1ZSBvcGVyYXRvciAtKFZhbHVlIG90aGVyKSB7CiAgICBpZiAob3RoZXIuaXNaZXJvKSByZXR1cm4gdGhpczsKICAgIFZhbHVlIHZhbHVlID0gbGVmdCAtIG90aGVyOwogICAgaWYgKHZhbHVlICE9IGNvbnN0IFVua25vd25WYWx1ZSgpICYmIHZhbHVlIGlzISBCaW5hcnlPcGVyYXRpb25WYWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgKyByaWdodDsKICAgIH0KICAgIC8vIElmIHRoZSByZXN1bHQgaXMgbm90IHNpbXBsZSBlbm91Z2gsIHdlIHRyeSB0aGUgc2FtZSBhcHByb2FjaAogICAgLy8gd2l0aCBbcmlnaHRdLgogICAgdmFsdWUgPSByaWdodCAtIG90aGVyOwogICAgaWYgKHZhbHVlICE9IGNvbnN0IFVua25vd25WYWx1ZSgpICYmIHZhbHVlIGlzISBCaW5hcnlPcGVyYXRpb25WYWx1ZSkgewogICAgICByZXR1cm4gbGVmdCArIHZhbHVlOwogICAgfQogICAgcmV0dXJuIGNvbnN0IFVua25vd25WYWx1ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOZWdhdGl2ZSA9PiBsZWZ0LmlzTmVnYXRpdmUgJiYgcmlnaHQuaXNOZWdhdGl2ZTsKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1Bvc2l0aXZlID0+IGxlZnQuaXNQb3NpdGl2ZSAmJiByaWdodC5pc1Bvc2l0aXZlOwogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICckbGVmdCArICRyaWdodCc7Cn0KCmNsYXNzIFN1YnRyYWN0VmFsdWUgZXh0ZW5kcyBCaW5hcnlPcGVyYXRpb25WYWx1ZSB7CiAgU3VidHJhY3RWYWx1ZShsZWZ0LCByaWdodCwgaW5mbykgOiBzdXBlcihsZWZ0LCByaWdodCwgaW5mbyk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgU3VidHJhY3RWYWx1ZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGxlZnQgPT0gb3RoZXIubGVmdCAmJiByaWdodCA9PSBvdGhlci5yaWdodDsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1N1YnRyYWN0VmFsdWUuaGFzaENvZGUnKTsKCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgLSgpID0+IHJpZ2h0IC0gbGVmdDsKCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgKyhWYWx1ZSBvdGhlcikgewogICAgaWYgKG90aGVyLmlzWmVybykgcmV0dXJuIHRoaXM7CiAgICBWYWx1ZSB2YWx1ZSA9IGxlZnQgKyBvdGhlcjsKICAgIGlmICh2YWx1ZSAhPSBjb25zdCBVbmtub3duVmFsdWUoKSAmJiB2YWx1ZSBpcyEgQmluYXJ5T3BlcmF0aW9uVmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlIC0gcmlnaHQ7CiAgICB9CiAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIG5vdCBzaW1wbGUgZW5vdWdoLCB3ZSB0cnkgdGhlIHNhbWUgYXBwcm9hY2gKICAgIC8vIHdpdGggW3JpZ2h0XS4KICAgIHZhbHVlID0gb3RoZXIgLSByaWdodDsKICAgIGlmICh2YWx1ZSAhPSBjb25zdCBVbmtub3duVmFsdWUoKSAmJiB2YWx1ZSBpcyEgQmluYXJ5T3BlcmF0aW9uVmFsdWUpIHsKICAgICAgcmV0dXJuIGxlZnQgKyB2YWx1ZTsKICAgIH0KICAgIHJldHVybiBjb25zdCBVbmtub3duVmFsdWUoKTsKICB9CgogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yIC0oVmFsdWUgb3RoZXIpIHsKICAgIGlmIChvdGhlci5pc1plcm8pIHJldHVybiB0aGlzOwogICAgVmFsdWUgdmFsdWUgPSBsZWZ0IC0gb3RoZXI7CiAgICBpZiAodmFsdWUgIT0gY29uc3QgVW5rbm93blZhbHVlKCkgJiYgdmFsdWUgaXMhIEJpbmFyeU9wZXJhdGlvblZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZSAtIHJpZ2h0OwogICAgfQogICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBub3Qgc2ltcGxlIGVub3VnaCwgd2UgdHJ5IHRoZSBzYW1lIGFwcHJvYWNoCiAgICAvLyB3aXRoIFtyaWdodF0uCiAgICB2YWx1ZSA9IHJpZ2h0ICsgb3RoZXI7CiAgICBpZiAodmFsdWUgIT0gY29uc3QgVW5rbm93blZhbHVlKCkgJiYgdmFsdWUgaXMhIEJpbmFyeU9wZXJhdGlvblZhbHVlKSB7CiAgICAgIHJldHVybiBsZWZ0IC0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gY29uc3QgVW5rbm93blZhbHVlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05lZ2F0aXZlID0+IGxlZnQuaXNOZWdhdGl2ZSAmJiByaWdodC5pc1Bvc2l0aXZlOwogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUG9zaXRpdmUgPT4gbGVmdC5pc1Bvc2l0aXZlICYmIHJpZ2h0LmlzTmVnYXRpdmU7CiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRsZWZ0IC0gJHJpZ2h0JzsKfQoKY2xhc3MgTmVnYXRlVmFsdWUgZXh0ZW5kcyBWYWx1ZSB7CiAgZmluYWwgVmFsdWUgdmFsdWU7CiAgTmVnYXRlVmFsdWUodGhpcy52YWx1ZSwgaW5mbykgOiBzdXBlcihpbmZvKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBOZWdhdGVWYWx1ZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHZhbHVlID09IG90aGVyLnZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignTmVnYXRlLmhhc2hDb2RlJyk7CgogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yICsob3RoZXIpIHsKICAgIGlmIChvdGhlci5pc1plcm8pIHJldHVybiB0aGlzOwogICAgaWYgKG90aGVyID09IHZhbHVlKSByZXR1cm4gaW5mby5pbnRaZXJvOwogICAgaWYgKG90aGVyIGlzIE5lZ2F0ZVZhbHVlKSByZXR1cm4gdGhpcyAtIG90aGVyLnZhbHVlOwogICAgaWYgKG90aGVyIGlzIEludFZhbHVlKSB7CiAgICAgIGlmIChvdGhlci5pc05lZ2F0aXZlKSB7CiAgICAgICAgcmV0dXJuIGluZm8ubmV3U3VidHJhY3RWYWx1ZSh0aGlzLCAtb3RoZXIpOwogICAgICB9CiAgICAgIHJldHVybiBpbmZvLm5ld1N1YnRyYWN0VmFsdWUob3RoZXIsIHZhbHVlKTsKICAgIH0KICAgIGlmIChvdGhlciBpcyBJbnN0cnVjdGlvblZhbHVlKSB7CiAgICAgIHJldHVybiBpbmZvLm5ld1N1YnRyYWN0VmFsdWUob3RoZXIsIHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBvdGhlciAtIHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgJihWYWx1ZSBvdGhlcikgPT4gY29uc3QgVW5rbm93blZhbHVlKCk7CgogIEBvdmVycmlkZQogIFZhbHVlIG9wZXJhdG9yIC0ob3RoZXIpIHsKICAgIGlmIChvdGhlci5pc1plcm8pIHJldHVybiB0aGlzOwogICAgaWYgKG90aGVyIGlzIEludFZhbHVlKSB7CiAgICAgIGlmIChvdGhlci5pc05lZ2F0aXZlKSB7CiAgICAgICAgcmV0dXJuIGluZm8ubmV3U3VidHJhY3RWYWx1ZSgtb3RoZXIsIHZhbHVlKTsKICAgICAgfQogICAgICByZXR1cm4gaW5mby5uZXdTdWJ0cmFjdFZhbHVlKHRoaXMsIG90aGVyKTsKICAgIH0KICAgIGlmIChvdGhlciBpcyBJbnN0cnVjdGlvblZhbHVlKSB7CiAgICAgIHJldHVybiBpbmZvLm5ld1N1YnRyYWN0VmFsdWUodGhpcywgb3RoZXIpOwogICAgfQogICAgaWYgKG90aGVyIGlzIE5lZ2F0ZVZhbHVlKSByZXR1cm4gdGhpcyArIG90aGVyLnZhbHVlOwogICAgcmV0dXJuIC1vdGhlciAtIHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgVmFsdWUgb3BlcmF0b3IgLSgpID0+IHZhbHVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05lZ2F0aXZlID0+IHZhbHVlLmlzUG9zaXRpdmU7CiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNQb3NpdGl2ZSA9PiB2YWx1ZS5pc05lZ2F0aXZlOwogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICctJHZhbHVlJzsKfQoKLy8vIEEgW1JhbmdlXSByZXByZXNlbnRzIHRoZSBwb3NzaWJsZSBpbnRlZ2VyIHZhbHVlcyBhbiBpbnN0cnVjdGlvbgovLy8gY2FuIGhhdmUsIGZyb20gaXRzIFtsb3dlcl0gYm91bmQgdG8gaXRzIFt1cHBlcl0gYm91bmQsIGJvdGgKLy8vIGluY2x1ZGVkLgpjbGFzcyBSYW5nZSB7CiAgZmluYWwgVmFsdWUgbG93ZXI7CiAgZmluYWwgVmFsdWUgdXBwZXI7CiAgZmluYWwgVmFsdWVSYW5nZUluZm8gaW5mbzsKICBSYW5nZSh0aGlzLmxvd2VyLCB0aGlzLnVwcGVyLCB0aGlzLmluZm8pIHsKICAgIGFzc2VydChsb3dlciAhPSBjb25zdCBVbmtub3duVmFsdWUoKSk7CiAgICBhc3NlcnQodXBwZXIgIT0gY29uc3QgVW5rbm93blZhbHVlKCkpOwogIH0KCiAgUmFuZ2UudW5ib3VuZChpbmZvKSA6IHRoaXMoY29uc3QgTWluSW50VmFsdWUoKSwgY29uc3QgTWF4SW50VmFsdWUoKSwgaW5mbyk7CgogIC8vLyBDaGVja3MgaWYgdGhlIGdpdmVuIHZhbHVlcyBhcmUgdW5rbm93biwgYW5kIGNyZWF0ZXMgYQogIC8vLyByYW5nZSB0aGF0IGRvZXMgbm90IGhhdmUgYW55IHVua25vd24gdmFsdWVzLgogIFJhbmdlLm5vcm1hbGl6ZShWYWx1ZSBsb3csIFZhbHVlIHVwLCBpbmZvKQogICAgICA6IHRoaXMobG93ID09IGNvbnN0IFVua25vd25WYWx1ZSgpID8gY29uc3QgTWluSW50VmFsdWUoKSA6IGxvdywKICAgICAgICAgICAgdXAgPT0gY29uc3QgVW5rbm93blZhbHVlKCkgPyBjb25zdCBNYXhJbnRWYWx1ZSgpIDogdXAsIGluZm8pOwoKICBSYW5nZSB1bmlvbihSYW5nZSBvdGhlcikgewogICAgcmV0dXJuIGluZm8ubmV3Tm9ybWFsaXplZFJhbmdlKAogICAgICAgIGxvd2VyLm1pbihvdGhlci5sb3dlciksIHVwcGVyLm1heChvdGhlci51cHBlcikpOwogIH0KCiAgUmFuZ2UgaW50ZXJzZWN0aW9uKFJhbmdlIG90aGVyKSB7CiAgICBWYWx1ZSBsb3cgPSBsb3dlci5tYXgob3RoZXIubG93ZXIpOwogICAgVmFsdWUgdXAgPSB1cHBlci5taW4ob3RoZXIudXBwZXIpOwogICAgLy8gSWYgd2UgY291bGQgbm90IGNvbXB1dGUgbWF4IG9yIG1pbiwgcGljayBhIHZhbHVlIGluIHRoZSB0d28KICAgIC8vIHJhbmdlcywgd2l0aCBwcmlvcml0eSB0byBbSW50VmFsdWVdcyBiZWNhdXNlIHRoZXkgYXJlIHNpbXBsZXIuCiAgICBpZiAobG93ID09IGNvbnN0IFVua25vd25WYWx1ZSgpKSB7CiAgICAgIGlmIChsb3dlciBpcyBJbnRWYWx1ZSkKICAgICAgICBsb3cgPSBsb3dlcjsKICAgICAgZWxzZSBpZiAob3RoZXIubG93ZXIgaXMgSW50VmFsdWUpCiAgICAgICAgbG93ID0gb3RoZXIubG93ZXI7CiAgICAgIGVsc2UKICAgICAgICBsb3cgPSBsb3dlcjsKICAgIH0KICAgIGlmICh1cCA9PSBjb25zdCBVbmtub3duVmFsdWUoKSkgewogICAgICBpZiAodXBwZXIgaXMgSW50VmFsdWUpCiAgICAgICAgdXAgPSB1cHBlcjsKICAgICAgZWxzZSBpZiAob3RoZXIudXBwZXIgaXMgSW50VmFsdWUpCiAgICAgICAgdXAgPSBvdGhlci51cHBlcjsKICAgICAgZWxzZQogICAgICAgIHVwID0gdXBwZXI7CiAgICB9CiAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UobG93LCB1cCk7CiAgfQoKICBSYW5nZSBvcGVyYXRvciArKFJhbmdlIG90aGVyKSB7CiAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UobG93ZXIgKyBvdGhlci5sb3dlciwgdXBwZXIgKyBvdGhlci51cHBlcik7CiAgfQoKICBSYW5nZSBvcGVyYXRvciAtKFJhbmdlIG90aGVyKSB7CiAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UobG93ZXIgLSBvdGhlci51cHBlciwgdXBwZXIgLSBvdGhlci5sb3dlcik7CiAgfQoKICBSYW5nZSBvcGVyYXRvciAtKCkgewogICAgcmV0dXJuIGluZm8ubmV3Tm9ybWFsaXplZFJhbmdlKC11cHBlciwgLWxvd2VyKTsKICB9CgogIFJhbmdlIG9wZXJhdG9yICYoUmFuZ2Ugb3RoZXIpIHsKICAgIGlmIChpc1NpbmdsZVZhbHVlICYmCiAgICAgICAgb3RoZXIuaXNTaW5nbGVWYWx1ZSAmJgogICAgICAgIGxvd2VyIGlzIEludFZhbHVlICYmCiAgICAgICAgb3RoZXIubG93ZXIgaXMgSW50VmFsdWUpIHsKICAgICAgcmV0dXJuIGluZm8ubmV3Tm9ybWFsaXplZFJhbmdlKGxvd2VyICYgb3RoZXIubG93ZXIsIHVwcGVyICYgb3RoZXIudXBwZXIpOwogICAgfQogICAgaWYgKGlzUG9zaXRpdmUgJiYgb3RoZXIuaXNQb3NpdGl2ZSkgewogICAgICBWYWx1ZSB1cCA9IHVwcGVyLm1pbihvdGhlci51cHBlcik7CiAgICAgIGlmICh1cCA9PSBjb25zdCBVbmtub3duVmFsdWUoKSkgewogICAgICAgIC8vIElmIHdlIGNvdWxkIG5vdCBmaW5kIGEgdHJpdmlhbCBib3VuZCwganVzdCB0cnkgdG8gdXNlIHRoZQogICAgICAgIC8vIG9uZSB0aGF0IGlzIGFuIGludC4KICAgICAgICB1cCA9IHVwcGVyIGlzIEludFZhbHVlID8gdXBwZXIgOiBvdGhlci51cHBlcjsKICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZ2V0IHRoZSBzYW1lIHVwcGVyIGJvdW5kLCB3aGV0aGVyIGl0J3MgYSAmIGIKICAgICAgICAvLyBvciBiICYgYS4KICAgICAgICBpZiAodXAgaXMhIEludFZhbHVlICYmIHVwcGVyICE9IG90aGVyLnVwcGVyKSB1cCA9IGNvbnN0IE1heEludFZhbHVlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluZm8ubmV3Tm9ybWFsaXplZFJhbmdlKGluZm8uaW50WmVybywgdXApOwogICAgfSBlbHNlIGlmIChpc1Bvc2l0aXZlKSB7CiAgICAgIHJldHVybiBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZShpbmZvLmludFplcm8sIHVwcGVyKTsKICAgIH0gZWxzZSBpZiAob3RoZXIuaXNQb3NpdGl2ZSkgewogICAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoaW5mby5pbnRaZXJvLCBvdGhlci51cHBlcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgUmFuZ2UpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBvdGhlci5sb3dlciA9PSBsb3dlciAmJiBvdGhlci51cHBlciA9PSB1cHBlcjsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1JhbmdlLmhhc2hDb2RlJyk7CgogIGJvb2wgb3BlcmF0b3IgPChSYW5nZSBvdGhlcikgewogICAgcmV0dXJuIHVwcGVyICE9IG90aGVyLmxvd2VyICYmIHVwcGVyLm1pbihvdGhlci5sb3dlcikgPT0gdXBwZXI7CiAgfQoKICBib29sIG9wZXJhdG9yID4oUmFuZ2Ugb3RoZXIpIHsKICAgIHJldHVybiBsb3dlciAhPSBvdGhlci51cHBlciAmJiBsb3dlci5tYXgob3RoZXIudXBwZXIpID09IGxvd2VyOwogIH0KCiAgYm9vbCBvcGVyYXRvciA8PShSYW5nZSBvdGhlcikgewogICAgcmV0dXJuIHVwcGVyLm1pbihvdGhlci5sb3dlcikgPT0gdXBwZXI7CiAgfQoKICBib29sIG9wZXJhdG9yID49KFJhbmdlIG90aGVyKSB7CiAgICByZXR1cm4gbG93ZXIubWF4KG90aGVyLnVwcGVyKSA9PSBsb3dlcjsKICB9CgogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgPT4gdXBwZXIuaXNOZWdhdGl2ZTsKICBib29sIGdldCBpc1Bvc2l0aXZlID0+IGxvd2VyLmlzUG9zaXRpdmU7CiAgYm9vbCBnZXQgaXNTaW5nbGVWYWx1ZSA9PiBsb3dlciA9PSB1cHBlcjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1skbG93ZXIsICR1cHBlcl0nOwp9CgovLy8gVmlzaXRzIHRoZSBncmFwaCBpbiBkb21pbmF0b3Igb3JkZXIsIGFuZCBjb21wdXRlcyB2YWx1ZSByYW5nZXMgZm9yCi8vLyBpbnRlZ2VyIGluc3RydWN0aW9ucy4gV2hpbGUgdmlzaXRpbmcgdGhlIGdyYXBoLCB0aGlzIHBoYXNlIGFsc28KLy8vIHJlbW92ZXMgdW5uZWNlc3NhcnkgYm91bmRzIGNoZWNrcywgYW5kIGNvbXBhcmlzb25zIHRoYXQgYXJlIHByb3ZlbgovLy8gdG8gYmUgdHJ1ZSBvciBmYWxzZS4KY2xhc3MgU3NhVmFsdWVSYW5nZUFuYWx5emVyIGV4dGVuZHMgSEJhc2VWaXNpdG9yIGltcGxlbWVudHMgT3B0aW1pemF0aW9uUGhhc2UgewogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiAnU1NBIHZhbHVlIHJhbmdlIGJ1aWxkZXInOwoKICAvLy8gTGlzdCBvZiBbSFJhbmdlQ29udmVyc2lvbl0gaW5zdHJ1Y3Rpb25zIGNyZWF0ZWQgYnkgdGhlIHBoYXNlLiBXZQogIC8vLyBzYXZlIHRoZW0gaGVyZSBpbiBvcmRlciB0byByZW1vdmUgdGhlbSBvbmNlIHRoZSBwaGFzZSBpcyBkb25lLgogIGZpbmFsIExpc3Q8SFJhbmdlQ29udmVyc2lvbj4gY29udmVyc2lvbnMgPSA8SFJhbmdlQ29udmVyc2lvbj5bXTsKCiAgLy8vIFZhbHVlIHJhbmdlcyBmb3IgaW50ZWdlciBpbnN0cnVjdGlvbnMuIFRoaXMgbWFwIGdldHMgcG9wdWxhdGVkIGJ5CiAgLy8vIHRoZSBkb21pbmF0b3IgdHJlZSB2aXNpdC4KICBmaW5hbCBNYXA8SEluc3RydWN0aW9uLCBSYW5nZT4gcmFuZ2VzID0gbmV3IE1hcDxISW5zdHJ1Y3Rpb24sIFJhbmdlPigpOwoKICBmaW5hbCBKQ2xvc2VkV29ybGQgY2xvc2VkV29ybGQ7CiAgZmluYWwgVmFsdWVSYW5nZUluZm8gaW5mbzsKICBmaW5hbCBTc2FPcHRpbWl6ZXJUYXNrIG9wdGltaXplcjsKCiAgSEdyYXBoIGdyYXBoOwoKICBTc2FWYWx1ZVJhbmdlQW5hbHl6ZXIoSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkLCB0aGlzLm9wdGltaXplcikKICAgICAgOiBpbmZvID0gbmV3IFZhbHVlUmFuZ2VJbmZvKCksCiAgICAgICAgdGhpcy5jbG9zZWRXb3JsZCA9IGNsb3NlZFdvcmxkOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0R3JhcGgoSEdyYXBoIGdyYXBoKSB7CiAgICB0aGlzLmdyYXBoID0gZ3JhcGg7CiAgICB2aXNpdERvbWluYXRvclRyZWUoZ3JhcGgpOwogICAgLy8gV2UgcmVtb3ZlIHRoZSByYW5nZSBjb252ZXJzaW9ucyBhZnRlciB2aXNpdGluZyB0aGUgZ3JhcGggc28KICAgIC8vIHRoYXQgdGhlIGdyYXBoIGRvZXMgbm90IGdldCBwb2xsdXRlZCB3aXRoIHRoZXNlIGluc3RydWN0aW9ucwogICAgLy8gb25seSBuZWNlc3NhcnkgZm9yIHRoaXMgcGhhc2UuCiAgICByZW1vdmVSYW5nZUNvbnZlcnNpb24oKTsKICAgIC8vIFRPRE8oaGVyaHV0KTogRmluZCBhIGNsZWFuZXIgd2F5IHRvIHBhc3MgYXJvdW5kIHJhbmdlcy4KICAgIG9wdGltaXplci5yYW5nZXMgPSByYW5nZXM7CiAgfQoKICB2b2lkIHJlbW92ZVJhbmdlQ29udmVyc2lvbigpIHsKICAgIGNvbnZlcnNpb25zLmZvckVhY2goKEhSYW5nZUNvbnZlcnNpb24gaW5zdHJ1Y3Rpb24pIHsKICAgICAgaW5zdHJ1Y3Rpb24uYmxvY2sucmV3cml0ZShpbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb24uaW5wdXRzWzBdKTsKICAgICAgaW5zdHJ1Y3Rpb24uYmxvY2sucmVtb3ZlKGluc3RydWN0aW9uKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJhc2ljQmxvY2soSEJhc2ljQmxvY2sgYmxvY2spIHsKICAgIHZvaWQgdmlzaXQoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICAgIFJhbmdlIHJhbmdlID0gaW5zdHJ1Y3Rpb24uYWNjZXB0KHRoaXMpOwogICAgICBpZiAoaW5zdHJ1Y3Rpb24KICAgICAgICAgIC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgYXNzZXJ0KHJhbmdlICE9IG51bGwpOwogICAgICAgIHJhbmdlc1tpbnN0cnVjdGlvbl0gPSByYW5nZTsKICAgICAgfQogICAgfQoKICAgIGJsb2NrLmZvckVhY2hQaGkodmlzaXQpOwogICAgYmxvY2suZm9yRWFjaEluc3RydWN0aW9uKHZpc2l0KTsKICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0SW5zdHJ1Y3Rpb24oSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBpZiAoaW5zdHJ1Y3Rpb24KICAgICAgICAuaXNQb3NpdGl2ZUludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoCiAgICAgICAgICBpbmZvLmludFplcm8sIGluZm8ubmV3UG9zaXRpdmVWYWx1ZShpbnN0cnVjdGlvbikpOwogICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbgogICAgICAgIC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNEZWZpbml0ZWx5VHJ1ZSkgewogICAgICBJbnN0cnVjdGlvblZhbHVlIHZhbHVlID0gaW5mby5uZXdJbnN0cnVjdGlvblZhbHVlKGluc3RydWN0aW9uKTsKICAgICAgcmV0dXJuIGluZm8ubmV3Tm9ybWFsaXplZFJhbmdlKHZhbHVlLCB2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0UGhpKEhQaGkgcGhpKSB7CiAgICBpZiAocGhpLmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc1BvdGVudGlhbGx5RmFsc2UpCiAgICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogICAgLy8gU29tZSBwaGFzZXMgbWF5IHJlcGxhY2UgaW5zdHJ1Y3Rpb25zIHRoYXQgY2hhbmdlIHRoZSBpbnB1dHMgb2YKICAgIC8vIHRoaXMgcGhpLiBPbmx5IHRoZSBbU3NhVHlwZXNQcm9wYWdhdGlvbl0gcGhhc2Ugd2lsbCB1cGRhdGUgdGhlCiAgICAvLyBwaGkgdHlwZS4gUGxheSBpdCBzYWZlIGJ5IGFzc3VtaW5nIHRoZSBbU3NhVHlwZXNQcm9wYWdhdGlvbl0KICAgIC8vIHBoYXNlIGlzIG5vdCBuZWNlc3NhcmlseSBydW4gYmVmb3JlIHRoZSBbVmFsdWVSYW5nZUFuYWx5emVyXS4KICAgIGlmIChwaGkuaW5wdXRzLmFueSgoaSkgPT4KICAgICAgICBpLmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc1BvdGVudGlhbGx5RmFsc2UpKSB7CiAgICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogICAgfQogICAgaWYgKHBoaS5ibG9jay5pc0xvb3BIZWFkZXIoKSkgewogICAgICBSYW5nZSByYW5nZSA9CiAgICAgICAgICBuZXcgTG9vcFVwZGF0ZVJlY29nbml6ZXIoY2xvc2VkV29ybGQsIHJhbmdlcywgaW5mbykucnVuKHBoaSk7CiAgICAgIGlmIChyYW5nZSA9PSBudWxsKSByZXR1cm4gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICAgICAgcmV0dXJuIHJhbmdlOwogICAgfQoKICAgIFJhbmdlIHJhbmdlID0gcmFuZ2VzW3BoaS5pbnB1dHNbMF1dOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwaGkuaW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJhbmdlID0gcmFuZ2UudW5pb24ocmFuZ2VzW3BoaS5pbnB1dHNbaV1dKTsKICAgIH0KICAgIHJldHVybiByYW5nZTsKICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0Q29uc3RhbnQoSENvbnN0YW50IGhDb25zdGFudCkgewogICAgaWYgKGhDb25zdGFudAogICAgICAgIC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNQb3RlbnRpYWxseUZhbHNlKSB7CiAgICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogICAgfQogICAgQ29uc3RhbnRWYWx1ZSBjb25zdGFudCA9IGhDb25zdGFudC5jb25zdGFudDsKICAgIE51bUNvbnN0YW50VmFsdWUgY29uc3RhbnROdW07CiAgICBpZiAoY29uc3RhbnQgaXMgRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlKSB7CiAgICAgIGNvbnN0YW50TnVtID0gY29uc3RhbnQucmVmZXJlbmNlZDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0YW50TnVtID0gY29uc3RhbnQ7CiAgICB9CiAgICBpZiAoY29uc3RhbnROdW0uaXNQb3NpdGl2ZUluZmluaXR5IHx8IGNvbnN0YW50TnVtLmlzTmVnYXRpdmVJbmZpbml0eSkgewogICAgICByZXR1cm4gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICAgIH0KICAgIGlmIChjb25zdGFudE51bS5pc01pbnVzWmVybykgewogICAgICBjb25zdGFudE51bSA9IG5ldyBJbnRDb25zdGFudFZhbHVlKEJpZ0ludC56ZXJvKTsKICAgIH0KCiAgICBCaWdJbnQgaW50VmFsdWUgPSBjb25zdGFudE51bSBpcyBJbnRDb25zdGFudFZhbHVlCiAgICAgICAgPyBjb25zdGFudE51bS5pbnRWYWx1ZQogICAgICAgIDogbmV3IEJpZ0ludC5mcm9tKGNvbnN0YW50TnVtLmRvdWJsZVZhbHVlLnRvSW50KCkpOwogICAgVmFsdWUgdmFsdWUgPSBpbmZvLm5ld0ludFZhbHVlKGludFZhbHVlKTsKICAgIHJldHVybiBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZSh2YWx1ZSwgdmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgUmFuZ2UgdmlzaXRGaWVsZEdldChIRmllbGRHZXQgZmllbGRHZXQpIHsKICAgIHJldHVybiB2aXNpdEluc3RydWN0aW9uKGZpZWxkR2V0KTsKICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0R2V0TGVuZ3RoKEhHZXRMZW5ndGggbm9kZSkgewogICAgUG9zaXRpdmVWYWx1ZSB2YWx1ZSA9IGluZm8ubmV3UG9zaXRpdmVWYWx1ZShub2RlKTsKICAgIC8vIFdlIGtub3cgdGhpcyByYW5nZSBpcyBhYm92ZSB6ZXJvLiBUbyBzaW1wbGlmeSB0aGUgYW5hbHlzaXMsIHdlCiAgICAvLyBwdXQgdGhlIHplcm8gdmFsdWUgYXMgdGhlIGxvd2VyIGJvdW5kIG9mIHRoaXMgcmFuZ2UuIFRoaXMKICAgIC8vIGFsbG93cyB0byBlYXNpbHkgcmVtb3ZlIHRoZSBzZWNvbmQgYm91bmQgY2hlY2sgaW4gdGhlIGZvbGxvd2luZwogICAgLy8gZXhwcmVzc2lvbjogYVsxXSArIGFbMF0uCiAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoaW5mby5pbnRaZXJvLCB2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBSYW5nZSB2aXNpdEJvdW5kc0NoZWNrKEhCb3VuZHNDaGVjayBjaGVjaykgewogICAgLy8gU2F2ZSB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgaW4gY2FzZSB0aGUgY2hlY2sgZ2V0cyByZW1vdmVkLgogICAgSEluc3RydWN0aW9uIG5leHQgPSBjaGVjay5uZXh0OwogICAgUmFuZ2UgaW5kZXhSYW5nZSA9IHJhbmdlc1tjaGVjay5pbmRleF07CiAgICBSYW5nZSBsZW5ndGhSYW5nZSA9IHJhbmdlc1tjaGVjay5sZW5ndGhdOwogICAgaWYgKGluZGV4UmFuZ2UgPT0gbnVsbCkgewogICAgICBpbmRleFJhbmdlID0gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICAgICAgYXNzZXJ0KGNoZWNrLmluZGV4CiAgICAgICAgICAuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAuaXNQb3RlbnRpYWxseUZhbHNlKTsKICAgIH0KICAgIGlmIChsZW5ndGhSYW5nZSA9PSBudWxsKSB7CiAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgbG9zdCB0aGUgbGVuZ3RoIHJhbmdlIGR1ZSB0byBhIHR5cGUgY29udmVyc2lvbiB0aGF0CiAgICAgIC8vIGFzc2VydHMgYSBub24taW50ZWdlciB0eXBlLiBJbiBzdWNoIGEgY2FzZSwgdGhlIHByb2dyYW0gd2lsbCBuZXZlcgogICAgICAvLyBnZXQgdG8gdGhpcyBwb2ludCBhbnl3YXksIHNvIG5vIG5lZWQgdG8gdHJ5IGFuZCByZWZpbmUgcmFuZ2VzLgogICAgICByZXR1cm4gaW5kZXhSYW5nZTsKICAgIH0KICAgIGFzc2VydChjaGVjay5sZW5ndGgKICAgICAgICAuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpOwoKICAgIC8vIENoZWNrIGlmIHRoZSBpbmRleCBpcyBzdHJpY3RseSBiZWxvdyB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIGxlbmd0aAogICAgLy8gcmFuZ2UuCiAgICBWYWx1ZSBtYXhJbmRleCA9IGxlbmd0aFJhbmdlLnVwcGVyIC0gaW5mby5pbnRPbmU7CiAgICBib29sIGJlbG93TGVuZ3RoID0gbWF4SW5kZXggIT0gY29uc3QgTWF4SW50VmFsdWUoKSAmJgogICAgICAgIGluZGV4UmFuZ2UudXBwZXIubWluKG1heEluZGV4KSA9PSBpbmRleFJhbmdlLnVwcGVyOwoKICAgIC8vIENoZWNrIGlmIHRoZSBpbmRleCBpcyBzdHJpY3RseSBiZWxvdyB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIGxlbmd0aAogICAgLy8gcmFuZ2UuCiAgICBiZWxvd0xlbmd0aCA9IGJlbG93TGVuZ3RoIHx8CiAgICAgICAgKGluZGV4UmFuZ2UudXBwZXIgIT0gbGVuZ3RoUmFuZ2UubG93ZXIgJiYKICAgICAgICAgICAgaW5kZXhSYW5nZS51cHBlci5taW4obGVuZ3RoUmFuZ2UubG93ZXIpID09IGluZGV4UmFuZ2UudXBwZXIpOwogICAgaWYgKGluZGV4UmFuZ2UuaXNQb3NpdGl2ZSAmJiBiZWxvd0xlbmd0aCkgewogICAgICBjaGVjay5ibG9jay5yZXdyaXRlKGNoZWNrLCBjaGVjay5pbmRleCk7CiAgICAgIGNoZWNrLmJsb2NrLnJlbW92ZShjaGVjayk7CiAgICB9IGVsc2UgaWYgKGluZGV4UmFuZ2UuaXNOZWdhdGl2ZSB8fCBsZW5ndGhSYW5nZSA8IGluZGV4UmFuZ2UpIHsKICAgICAgY2hlY2suc3RhdGljQ2hlY2tzID0gSEJvdW5kc0NoZWNrLkFMV0FZU19GQUxTRTsKICAgICAgLy8gVGhlIGNoZWNrIGlzIGFsd2F5cyBmYWxzZSwgYW5kIHdoYXRldmVyIGluc3RydWN0aW9uIGl0CiAgICAgIC8vIGRvbWluYXRlcyBpcyBkZWFkIGNvZGUuCiAgICAgIHJldHVybiBpbmRleFJhbmdlOwogICAgfSBlbHNlIGlmIChpbmRleFJhbmdlLmlzUG9zaXRpdmUpIHsKICAgICAgY2hlY2suc3RhdGljQ2hlY2tzID0gSEJvdW5kc0NoZWNrLkFMV0FZU19BQk9WRV9aRVJPOwogICAgfSBlbHNlIGlmIChiZWxvd0xlbmd0aCkgewogICAgICBjaGVjay5zdGF0aWNDaGVja3MgPSBIQm91bmRzQ2hlY2suQUxXQVlTX0JFTE9XX0xFTkdUSDsKICAgIH0KCiAgICBpZiAoaW5kZXhSYW5nZS5pc1Bvc2l0aXZlKSB7CiAgICAgIC8vIElmIHRoZSB0ZXN0IHBhc3Nlcywgd2Uga25vdyB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIGxlbmd0aCBpcwogICAgICAvLyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBpbmRleC4KICAgICAgVmFsdWUgbG93ID0gbGVuZ3RoUmFuZ2UubG93ZXIubWF4KGluZGV4UmFuZ2UubG93ZXIpOwogICAgICBpZiAobG93ICE9IGNvbnN0IFVua25vd25WYWx1ZSgpKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gY3JlYXRlUmFuZ2VDb252ZXJzaW9uKG5leHQsIGNoZWNrLmxlbmd0aCk7CiAgICAgICAgcmFuZ2VzW2luc3RydWN0aW9uXSA9IGluZm8ubmV3Tm9ybWFsaXplZFJhbmdlKGxvdywgbGVuZ3RoUmFuZ2UudXBwZXIpOwogICAgICB9CiAgICB9CgogICAgLy8gVXBkYXRlIHRoZSByYW5nZSBvZiB0aGUgaW5kZXggaWYgdXNpbmcgdGhlIG1heGltdW0gaW5kZXgKICAgIC8vIG5hcnJvd3MgaXQuIFVzZSB0aGF0IG5ldyByYW5nZSBmb3IgdGhpcyBpbnN0cnVjdGlvbiBhcyB3ZWxsLgogICAgUmFuZ2UgbmV3SW5kZXhSYW5nZSA9IGluZGV4UmFuZ2UKICAgICAgICAuaW50ZXJzZWN0aW9uKGluZm8ubmV3Tm9ybWFsaXplZFJhbmdlKGluZm8uaW50WmVybywgbWF4SW5kZXgpKTsKICAgIGlmIChpbmRleFJhbmdlID09IG5ld0luZGV4UmFuZ2UpIHJldHVybiBpbmRleFJhbmdlOwogICAgLy8gRXhwbGljaXRseSBhdHRhY2ggdGhlIHJhbmdlIGluZm9ybWF0aW9uIHRvIHRoZSBpbmRleCBpbnN0cnVjdGlvbiwKICAgIC8vIHdoaWNoIG1heSBiZSB1c2VkIGJ5IG90aGVyIGluc3RydWN0aW9ucy4gIFJldHVybmluZyB0aGUgbmV3IHJhbmdlIHdpbGwKICAgIC8vIGF0dGFjaCBpdCB0byB0aGlzIGluc3RydWN0aW9uLgogICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gY3JlYXRlUmFuZ2VDb252ZXJzaW9uKG5leHQsIGNoZWNrLmluZGV4KTsKICAgIHJhbmdlc1tpbnN0cnVjdGlvbl0gPSBuZXdJbmRleFJhbmdlOwogICAgcmV0dXJuIG5ld0luZGV4UmFuZ2U7CiAgfQoKICBAb3ZlcnJpZGUKICBSYW5nZSB2aXNpdFJlbGF0aW9uYWwoSFJlbGF0aW9uYWwgcmVsYXRpb25hbCkgewogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gcmVsYXRpb25hbC5yaWdodDsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gcmVsYXRpb25hbC5sZWZ0OwogICAgaWYgKGxlZnQuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlGYWxzZSkgewogICAgICByZXR1cm4gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICAgIH0KICAgIGlmIChyaWdodC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNQb3RlbnRpYWxseUZhbHNlKSB7CiAgICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogICAgfQogICAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24gPSByZWxhdGlvbmFsLm9wZXJhdGlvbigpOwogICAgUmFuZ2UgcmlnaHRSYW5nZSA9IHJhbmdlc1tyZWxhdGlvbmFsLnJpZ2h0XTsKICAgIFJhbmdlIGxlZnRSYW5nZSA9IHJhbmdlc1tyZWxhdGlvbmFsLmxlZnRdOwoKICAgIGlmIChyZWxhdGlvbmFsIGlzIEhJZGVudGl0eSkgewogICAgICBoYW5kbGVFcXVhbGl0eUNoZWNrKHJlbGF0aW9uYWwpOwogICAgfSBlbHNlIGlmIChvcGVyYXRpb24uYXBwbHkobGVmdFJhbmdlLCByaWdodFJhbmdlKSkgewogICAgICByZWxhdGlvbmFsLmJsb2NrCiAgICAgICAgICAucmV3cml0ZShyZWxhdGlvbmFsLCBncmFwaC5hZGRDb25zdGFudEJvb2wodHJ1ZSwgY2xvc2VkV29ybGQpKTsKICAgICAgcmVsYXRpb25hbC5ibG9jay5yZW1vdmUocmVsYXRpb25hbCk7CiAgICB9IGVsc2UgaWYgKG5lZ2F0ZU9wZXJhdGlvbihvcGVyYXRpb24pLmFwcGx5KGxlZnRSYW5nZSwgcmlnaHRSYW5nZSkpIHsKICAgICAgcmVsYXRpb25hbC5ibG9jawogICAgICAgICAgLnJld3JpdGUocmVsYXRpb25hbCwgZ3JhcGguYWRkQ29uc3RhbnRCb29sKGZhbHNlLCBjbG9zZWRXb3JsZCkpOwogICAgICByZWxhdGlvbmFsLmJsb2NrLnJlbW92ZShyZWxhdGlvbmFsKTsKICAgIH0KICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogIH0KCiAgdm9pZCBoYW5kbGVFcXVhbGl0eUNoZWNrKEhSZWxhdGlvbmFsIG5vZGUpIHsKICAgIFJhbmdlIHJpZ2h0ID0gcmFuZ2VzW25vZGUucmlnaHRdOwogICAgUmFuZ2UgbGVmdCA9IHJhbmdlc1tub2RlLmxlZnRdOwogICAgaWYgKGxlZnQuaXNTaW5nbGVWYWx1ZSAmJiByaWdodC5pc1NpbmdsZVZhbHVlICYmIGxlZnQgPT0gcmlnaHQpIHsKICAgICAgbm9kZS5ibG9jay5yZXdyaXRlKG5vZGUsIGdyYXBoLmFkZENvbnN0YW50Qm9vbCh0cnVlLCBjbG9zZWRXb3JsZCkpOwogICAgICBub2RlLmJsb2NrLnJlbW92ZShub2RlKTsKICAgIH0KICB9CgogIFJhbmdlIGhhbmRsZUludm9rZU1vZHVsbyhISW52b2tlRHluYW1pY01ldGhvZCBpbnZva2UpIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW52b2tlLmlucHV0c1sxXTsKICAgIEhJbnN0cnVjdGlvbiByaWdodCA9IGludm9rZS5pbnB1dHNbMl07CiAgICBSYW5nZSBkaXZpc29yID0gcmFuZ2VzW3JpZ2h0XTsKICAgIGlmIChkaXZpc29yICE9IG51bGwpIHsKICAgICAgLy8gRm9yIEludGVnZXIgdmFsdWVzIHdlIGNhbiBiZSBwcmVjaXNlIGluIHRoZSB1cHBlciBib3VuZCwgc28gc3BlY2lhbAogICAgICAvLyBjYXNlIHRob3NlLgogICAgICBpZiAobGVmdC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNEZWZpbml0ZWx5VHJ1ZSAmJgogICAgICAgICAgcmlnaHQuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICBpZiAoZGl2aXNvci5pc1Bvc2l0aXZlKSB7CiAgICAgICAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoCiAgICAgICAgICAgICAgaW5mby5pbnRaZXJvLCBkaXZpc29yLnVwcGVyIC0gaW5mby5pbnRPbmUpOwogICAgICAgIH0gZWxzZSBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKSB7CiAgICAgICAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoCiAgICAgICAgICAgICAgaW5mby5pbnRaZXJvLCBpbmZvLm5ld05lZ2F0ZVZhbHVlKGRpdmlzb3IubG93ZXIpIC0gaW5mby5pbnRPbmUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChsZWZ0CiAgICAgICAgICAgICAgLmlzTnVtYmVyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICAgIHJpZ2h0LmlzTnVtYmVyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICBpZiAoZGl2aXNvci5pc1Bvc2l0aXZlKSB7CiAgICAgICAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoaW5mby5pbnRaZXJvLCBkaXZpc29yLnVwcGVyKTsKICAgICAgICB9IGVsc2UgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSkgewogICAgICAgICAgcmV0dXJuIGluZm8ubmV3Tm9ybWFsaXplZFJhbmdlKAogICAgICAgICAgICAgIGluZm8uaW50WmVybywgaW5mby5uZXdOZWdhdGVWYWx1ZShkaXZpc29yLmxvd2VyKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0UmVtYWluZGVyKEhSZW1haW5kZXIgaW5zdHJ1Y3Rpb24pIHsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzBdOwogICAgSEluc3RydWN0aW9uIHJpZ2h0ID0gaW5zdHJ1Y3Rpb24uaW5wdXRzWzFdOwogICAgUmFuZ2UgZGl2aWRlbmQgPSByYW5nZXNbbGVmdF07CiAgICAvLyBJZiBib3RoIG9wZXJhbmRzIGFyZSA+PTAsIHRoZSByZXN1bHQgaXMgPj0gMCBhbmQgYm91bmRlZCBieSB0aGUgZGl2aXNvci4KICAgIGlmICgoZGl2aWRlbmQgIT0gbnVsbCAmJiBkaXZpZGVuZC5pc1Bvc2l0aXZlKSB8fAogICAgICAgIGxlZnQKICAgICAgICAgICAgLmlzUG9zaXRpdmVJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgIFJhbmdlIGRpdmlzb3IgPSByYW5nZXNbcmlnaHRdOwogICAgICBpZiAoZGl2aXNvciAhPSBudWxsKSB7CiAgICAgICAgaWYgKGRpdmlzb3IuaXNQb3NpdGl2ZSkgewogICAgICAgICAgLy8gRm9yIEludGVnZXIgdmFsdWVzIHdlIGNhbiBiZSBwcmVjaXNlIGluIHRoZSB1cHBlciBib3VuZC4KICAgICAgICAgIGlmIChsZWZ0CiAgICAgICAgICAgICAgICAgIC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICAgICAgICByaWdodAogICAgICAgICAgICAgICAgICAuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgICAgICAgICAgIC5pc0RlZmluaXRlbHlUcnVlKSB7CiAgICAgICAgICAgIHJldHVybiBpbmZvLm5ld05vcm1hbGl6ZWRSYW5nZSgKICAgICAgICAgICAgICAgIGluZm8uaW50WmVybywgZGl2aXNvci51cHBlciAtIGluZm8uaW50T25lKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChsZWZ0LmlzTnVtYmVyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUgJiYKICAgICAgICAgICAgICByaWdodAogICAgICAgICAgICAgICAgICAuaXNOdW1iZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAgICAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgICAgICAgcmV0dXJuIGluZm8ubmV3Tm9ybWFsaXplZFJhbmdlKGluZm8uaW50WmVybywgZGl2aXNvci51cHBlcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0SW52b2tlRHluYW1pY01ldGhvZChISW52b2tlRHluYW1pY01ldGhvZCBpbnZva2UpIHsKICAgIGlmICgoaW52b2tlLmlucHV0cy5sZW5ndGggPT0gMykgJiYgKGludm9rZS5zZWxlY3Rvci5uYW1lID09ICIlIikpCiAgICAgIHJldHVybiBoYW5kbGVJbnZva2VNb2R1bG8oaW52b2tlKTsKICAgIHJldHVybiBzdXBlci52aXNpdEludm9rZUR5bmFtaWNNZXRob2QoaW52b2tlKTsKICB9CgogIFJhbmdlIGhhbmRsZUJpbmFyeU9wZXJhdGlvbihIQmluYXJ5QXJpdGhtZXRpYyBpbnN0cnVjdGlvbikgewogICAgaWYgKGluc3RydWN0aW9uCiAgICAgICAgLmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKQogICAgICAgIC5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgcmV0dXJuIGluZm8ubmV3VW5ib3VuZFJhbmdlKCk7CiAgICB9CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb24KICAgICAgICAub3BlcmF0aW9uKCkKICAgICAgICAuYXBwbHkocmFuZ2VzW2luc3RydWN0aW9uLmxlZnRdLCByYW5nZXNbaW5zdHJ1Y3Rpb24ucmlnaHRdKTsKICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0QWRkKEhBZGQgYWRkKSB7CiAgICByZXR1cm4gaGFuZGxlQmluYXJ5T3BlcmF0aW9uKGFkZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBSYW5nZSB2aXNpdFN1YnRyYWN0KEhTdWJ0cmFjdCBzdWIpIHsKICAgIHJldHVybiBoYW5kbGVCaW5hcnlPcGVyYXRpb24oc3ViKTsKICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0Qml0QW5kKEhCaXRBbmQgbm9kZSkgewogICAgaWYgKG5vZGUuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzUG90ZW50aWFsbHlGYWxzZSkgewogICAgICByZXR1cm4gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICAgIH0KICAgIEhJbnN0cnVjdGlvbiByaWdodCA9IG5vZGUucmlnaHQ7CiAgICBISW5zdHJ1Y3Rpb24gbGVmdCA9IG5vZGUubGVmdDsKICAgIGlmIChsZWZ0LmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc0RlZmluaXRlbHlUcnVlICYmCiAgICAgICAgcmlnaHQuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIHJhbmdlc1tsZWZ0XSAmIHJhbmdlc1tyaWdodF07CiAgICB9CgogICAgUmFuZ2UgdHJ5Q29tcHV0ZVJhbmdlKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgICBSYW5nZSByYW5nZSA9IHJhbmdlc1tpbnN0cnVjdGlvbl07CiAgICAgIGlmIChyYW5nZS5pc1Bvc2l0aXZlKSB7CiAgICAgICAgcmV0dXJuIGluZm8ubmV3Tm9ybWFsaXplZFJhbmdlKGluZm8uaW50WmVybywgcmFuZ2UudXBwZXIpOwogICAgICB9IGVsc2UgaWYgKHJhbmdlLmlzTmVnYXRpdmUpIHsKICAgICAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UocmFuZ2UubG93ZXIsIGluZm8uaW50WmVybyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluZm8ubmV3VW5ib3VuZFJhbmdlKCk7CiAgICB9CgogICAgaWYgKGxlZnQuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIHRyeUNvbXB1dGVSYW5nZShsZWZ0KTsKICAgIH0gZWxzZSBpZiAocmlnaHQKICAgICAgICAuaXNJbnRlZ2VyKGNsb3NlZFdvcmxkLmFic3RyYWN0VmFsdWVEb21haW4pCiAgICAgICAgLmlzRGVmaW5pdGVseVRydWUpIHsKICAgICAgcmV0dXJuIHRyeUNvbXB1dGVSYW5nZShyaWdodCk7CiAgICB9CiAgICByZXR1cm4gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICB9CgogIEBvdmVycmlkZQogIFJhbmdlIHZpc2l0Q2hlY2soSENoZWNrIGluc3RydWN0aW9uKSB7CiAgICBpZiAocmFuZ2VzW2luc3RydWN0aW9uLmNoZWNrZWRJbnB1dF0gPT0gbnVsbCkgewogICAgICByZXR1cm4gdmlzaXRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7CiAgICB9CiAgICByZXR1cm4gcmFuZ2VzW2luc3RydWN0aW9uLmNoZWNrZWRJbnB1dF07CiAgfQoKICBISW5zdHJ1Y3Rpb24gY3JlYXRlUmFuZ2VDb252ZXJzaW9uKAogICAgICBISW5zdHJ1Y3Rpb24gY3Vyc29yLCBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIEhSYW5nZUNvbnZlcnNpb24gbmV3SW5zdHJ1Y3Rpb24gPSBuZXcgSFJhbmdlQ29udmVyc2lvbigKICAgICAgICBpbnN0cnVjdGlvbiwgY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbi5pbnRUeXBlKTsKICAgIGNvbnZlcnNpb25zLmFkZChuZXdJbnN0cnVjdGlvbik7CiAgICBjdXJzb3IuYmxvY2suYWRkQmVmb3JlKGN1cnNvciwgbmV3SW5zdHJ1Y3Rpb24pOwogICAgLy8gVXBkYXRlIHRoZSB1c2VycyBvZiB0aGUgaW5zdHJ1Y3Rpb24gZG9taW5hdGVkIGJ5IFtjdXJzb3JdIHRvCiAgICAvLyB1c2UgdGhlIG5ldyBpbnN0cnVjdGlvbiwgdGhhdCBoYXMgYW4gbmFycm93ZXIgcmFuZ2UuCiAgICBpbnN0cnVjdGlvbi5yZXBsYWNlQWxsVXNlcnNEb21pbmF0ZWRCeShjdXJzb3IsIG5ld0luc3RydWN0aW9uKTsKICAgIHJldHVybiBuZXdJbnN0cnVjdGlvbjsKICB9CgogIHN0YXRpYyBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG5lZ2F0ZU9wZXJhdGlvbigKICAgICAgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKICAgIGlmIChvcGVyYXRpb24gPT0gY29uc3QgY29uc3RhbnRfc3lzdGVtLkxlc3NPcGVyYXRpb24oKSkgewogICAgICByZXR1cm4gY29uc3QgY29uc3RhbnRfc3lzdGVtLkdyZWF0ZXJFcXVhbE9wZXJhdGlvbigpOwogICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT0gY29uc3QgY29uc3RhbnRfc3lzdGVtLkxlc3NFcXVhbE9wZXJhdGlvbigpKSB7CiAgICAgIHJldHVybiBjb25zdCBjb25zdGFudF9zeXN0ZW0uR3JlYXRlck9wZXJhdGlvbigpOwogICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT0gY29uc3QgY29uc3RhbnRfc3lzdGVtLkdyZWF0ZXJPcGVyYXRpb24oKSkgewogICAgICByZXR1cm4gY29uc3QgY29uc3RhbnRfc3lzdGVtLkxlc3NFcXVhbE9wZXJhdGlvbigpOwogICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT0gY29uc3QgY29uc3RhbnRfc3lzdGVtLkdyZWF0ZXJFcXVhbE9wZXJhdGlvbigpKSB7CiAgICAgIHJldHVybiBjb25zdCBjb25zdGFudF9zeXN0ZW0uTGVzc09wZXJhdGlvbigpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBzdGF0aWMgY29uc3RhbnRfc3lzdGVtLkJpbmFyeU9wZXJhdGlvbiBmbGlwT3BlcmF0aW9uKAogICAgICBjb25zdGFudF9zeXN0ZW0uQmluYXJ5T3BlcmF0aW9uIG9wZXJhdGlvbikgewogICAgaWYgKG9wZXJhdGlvbiA9PSBjb25zdCBjb25zdGFudF9zeXN0ZW0uTGVzc09wZXJhdGlvbigpKSB7CiAgICAgIHJldHVybiBjb25zdCBjb25zdGFudF9zeXN0ZW0uR3JlYXRlck9wZXJhdGlvbigpOwogICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT0gY29uc3QgY29uc3RhbnRfc3lzdGVtLkxlc3NFcXVhbE9wZXJhdGlvbigpKSB7CiAgICAgIHJldHVybiBjb25zdCBjb25zdGFudF9zeXN0ZW0uR3JlYXRlckVxdWFsT3BlcmF0aW9uKCk7CiAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBjb25zdCBjb25zdGFudF9zeXN0ZW0uR3JlYXRlck9wZXJhdGlvbigpKSB7CiAgICAgIHJldHVybiBjb25zdCBjb25zdGFudF9zeXN0ZW0uTGVzc09wZXJhdGlvbigpOwogICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT0gY29uc3QgY29uc3RhbnRfc3lzdGVtLkdyZWF0ZXJFcXVhbE9wZXJhdGlvbigpKSB7CiAgICAgIHJldHVybiBjb25zdCBjb25zdGFudF9zeXN0ZW0uTGVzc0VxdWFsT3BlcmF0aW9uKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIFJhbmdlIGNvbXB1dGVDb25zdHJhaW5lZFJhbmdlKGNvbnN0YW50X3N5c3RlbS5CaW5hcnlPcGVyYXRpb24gb3BlcmF0aW9uLAogICAgICBSYW5nZSBsZWZ0UmFuZ2UsIFJhbmdlIHJpZ2h0UmFuZ2UpIHsKICAgIFJhbmdlIHJhbmdlOwogICAgaWYgKG9wZXJhdGlvbiA9PSBjb25zdCBjb25zdGFudF9zeXN0ZW0uTGVzc09wZXJhdGlvbigpKSB7CiAgICAgIHJhbmdlID0gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoCiAgICAgICAgICBjb25zdCBNaW5JbnRWYWx1ZSgpLCByaWdodFJhbmdlLnVwcGVyIC0gaW5mby5pbnRPbmUpOwogICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT0gY29uc3QgY29uc3RhbnRfc3lzdGVtLkxlc3NFcXVhbE9wZXJhdGlvbigpKSB7CiAgICAgIHJhbmdlID0gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoY29uc3QgTWluSW50VmFsdWUoKSwgcmlnaHRSYW5nZS51cHBlcik7CiAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBjb25zdCBjb25zdGFudF9zeXN0ZW0uR3JlYXRlck9wZXJhdGlvbigpKSB7CiAgICAgIHJhbmdlID0gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UoCiAgICAgICAgICByaWdodFJhbmdlLmxvd2VyICsgaW5mby5pbnRPbmUsIGNvbnN0IE1heEludFZhbHVlKCkpOwogICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT0gY29uc3QgY29uc3RhbnRfc3lzdGVtLkdyZWF0ZXJFcXVhbE9wZXJhdGlvbigpKSB7CiAgICAgIHJhbmdlID0gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UocmlnaHRSYW5nZS5sb3dlciwgY29uc3QgTWF4SW50VmFsdWUoKSk7CiAgICB9IGVsc2UgewogICAgICByYW5nZSA9IGluZm8ubmV3VW5ib3VuZFJhbmdlKCk7CiAgICB9CiAgICByZXR1cm4gcmFuZ2UuaW50ZXJzZWN0aW9uKGxlZnRSYW5nZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBSYW5nZSB2aXNpdENvbmRpdGlvbmFsQnJhbmNoKEhDb25kaXRpb25hbEJyYW5jaCBicmFuY2gpIHsKICAgIGR5bmFtaWMgY29uZGl0aW9uID0gYnJhbmNoLmNvbmRpdGlvbjsKICAgIC8vIFRPRE8obmdlb2ZmcmF5KTogSGFuZGxlIGNvbXBsZXggY29uZGl0aW9ucy4KICAgIGlmIChjb25kaXRpb24gaXMhIEhSZWxhdGlvbmFsKSByZXR1cm4gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICAgIGlmIChjb25kaXRpb24gaXMgSElkZW50aXR5KSByZXR1cm4gaW5mby5uZXdVbmJvdW5kUmFuZ2UoKTsKICAgIEhJbnN0cnVjdGlvbiByaWdodCA9IGNvbmRpdGlvbi5yaWdodDsKICAgIEhJbnN0cnVjdGlvbiBsZWZ0ID0gY29uZGl0aW9uLmxlZnQ7CiAgICBpZiAobGVmdC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikuaXNQb3RlbnRpYWxseUZhbHNlKSB7CiAgICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogICAgfQogICAgaWYgKHJpZ2h0LmlzSW50ZWdlcihjbG9zZWRXb3JsZC5hYnN0cmFjdFZhbHVlRG9tYWluKS5pc1BvdGVudGlhbGx5RmFsc2UpIHsKICAgICAgcmV0dXJuIGluZm8ubmV3VW5ib3VuZFJhbmdlKCk7CiAgICB9CgogICAgUmFuZ2UgcmlnaHRSYW5nZSA9IHJhbmdlc1tyaWdodF07CiAgICBSYW5nZSBsZWZ0UmFuZ2UgPSByYW5nZXNbbGVmdF07CiAgICBjb25zdGFudF9zeXN0ZW0uT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGNvbmRpdGlvbi5vcGVyYXRpb24oKTsKICAgIGNvbnN0YW50X3N5c3RlbS5PcGVyYXRpb24gbWlycm9yT3AgPSBmbGlwT3BlcmF0aW9uKG9wZXJhdGlvbik7CiAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgdHJ1ZSBicmFuY2ggaWYgdGhpcyBibG9jayBpcyB0aGUgb25seQogICAgLy8gcHJlZGVjZXNzb3IuCiAgICBpZiAoYnJhbmNoLnRydWVCcmFuY2gucHJlZGVjZXNzb3JzLmxlbmd0aCA9PSAxKSB7CiAgICAgIGFzc2VydChicmFuY2gudHJ1ZUJyYW5jaC5wcmVkZWNlc3NvcnNbMF0gPT0gYnJhbmNoLmJsb2NrKTsKICAgICAgLy8gVXBkYXRlIHRoZSB0cnVlIGJyYW5jaCB0byB1c2UgbmFycm93ZXIgcmFuZ2VzIGZvciBbbGVmdF0gYW5kCiAgICAgIC8vIFtyaWdodF0uCiAgICAgIFJhbmdlIHJhbmdlID0gY29tcHV0ZUNvbnN0cmFpbmVkUmFuZ2Uob3BlcmF0aW9uLCBsZWZ0UmFuZ2UsIHJpZ2h0UmFuZ2UpOwogICAgICBpZiAobGVmdFJhbmdlICE9IHJhbmdlKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0KICAgICAgICAgICAgY3JlYXRlUmFuZ2VDb252ZXJzaW9uKGJyYW5jaC50cnVlQnJhbmNoLmZpcnN0LCBsZWZ0KTsKICAgICAgICByYW5nZXNbaW5zdHJ1Y3Rpb25dID0gcmFuZ2U7CiAgICAgIH0KCiAgICAgIHJhbmdlID0gY29tcHV0ZUNvbnN0cmFpbmVkUmFuZ2UobWlycm9yT3AsIHJpZ2h0UmFuZ2UsIGxlZnRSYW5nZSk7CiAgICAgIGlmIChyaWdodFJhbmdlICE9IHJhbmdlKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0KICAgICAgICAgICAgY3JlYXRlUmFuZ2VDb252ZXJzaW9uKGJyYW5jaC50cnVlQnJhbmNoLmZpcnN0LCByaWdodCk7CiAgICAgICAgcmFuZ2VzW2luc3RydWN0aW9uXSA9IHJhbmdlOwogICAgICB9CiAgICB9CgogICAgLy8gT25seSB1cGRhdGUgdGhlIGZhbHNlIGJyYW5jaCBpZiB0aGlzIGJsb2NrIGlzIHRoZSBvbmx5CiAgICAvLyBwcmVkZWNlc3Nvci4KICAgIGlmIChicmFuY2guZmFsc2VCcmFuY2gucHJlZGVjZXNzb3JzLmxlbmd0aCA9PSAxKSB7CiAgICAgIGFzc2VydChicmFuY2guZmFsc2VCcmFuY2gucHJlZGVjZXNzb3JzWzBdID09IGJyYW5jaC5ibG9jayk7CiAgICAgIGNvbnN0YW50X3N5c3RlbS5PcGVyYXRpb24gcmV2ZXJzZSA9IG5lZ2F0ZU9wZXJhdGlvbihvcGVyYXRpb24pOwogICAgICBjb25zdGFudF9zeXN0ZW0uT3BlcmF0aW9uIHJldmVyc2VkTWlycm9yID0gZmxpcE9wZXJhdGlvbihyZXZlcnNlKTsKICAgICAgLy8gVXBkYXRlIHRoZSBmYWxzZSBicmFuY2ggdG8gdXNlIG5hcnJvd2VyIHJhbmdlcyBmb3IgW2xlZnRdIGFuZAogICAgICAvLyBbcmlnaHRdLgogICAgICBSYW5nZSByYW5nZSA9IGNvbXB1dGVDb25zdHJhaW5lZFJhbmdlKHJldmVyc2UsIGxlZnRSYW5nZSwgcmlnaHRSYW5nZSk7CiAgICAgIGlmIChsZWZ0UmFuZ2UgIT0gcmFuZ2UpIHsKICAgICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPQogICAgICAgICAgICBjcmVhdGVSYW5nZUNvbnZlcnNpb24oYnJhbmNoLmZhbHNlQnJhbmNoLmZpcnN0LCBsZWZ0KTsKICAgICAgICByYW5nZXNbaW5zdHJ1Y3Rpb25dID0gcmFuZ2U7CiAgICAgIH0KCiAgICAgIHJhbmdlID0gY29tcHV0ZUNvbnN0cmFpbmVkUmFuZ2UocmV2ZXJzZWRNaXJyb3IsIHJpZ2h0UmFuZ2UsIGxlZnRSYW5nZSk7CiAgICAgIGlmIChyaWdodFJhbmdlICE9IHJhbmdlKSB7CiAgICAgICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0KICAgICAgICAgICAgY3JlYXRlUmFuZ2VDb252ZXJzaW9uKGJyYW5jaC5mYWxzZUJyYW5jaC5maXJzdCwgcmlnaHQpOwogICAgICAgIHJhbmdlc1tpbnN0cnVjdGlvbl0gPSByYW5nZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBpbmZvLm5ld1VuYm91bmRSYW5nZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgUmFuZ2UgdmlzaXRSYW5nZUNvbnZlcnNpb24oSFJhbmdlQ29udmVyc2lvbiBjb252ZXJzaW9uKSB7CiAgICByZXR1cm4gcmFuZ2VzW2NvbnZlcnNpb25dOwogIH0KfQoKLy8vIFRyaWVzIHRvIGZpbmQgYSByYW5nZSBmb3IgdGhlIHVwZGF0ZSBpbnN0cnVjdGlvbiBvZiBhIGxvb3AgcGhpLgpjbGFzcyBMb29wVXBkYXRlUmVjb2duaXplciBleHRlbmRzIEhCYXNlVmlzaXRvciB7CiAgZmluYWwgSkNsb3NlZFdvcmxkIGNsb3NlZFdvcmxkOwogIGZpbmFsIE1hcDxISW5zdHJ1Y3Rpb24sIFJhbmdlPiByYW5nZXM7CiAgZmluYWwgVmFsdWVSYW5nZUluZm8gaW5mbzsKICBMb29wVXBkYXRlUmVjb2duaXplcih0aGlzLmNsb3NlZFdvcmxkLCB0aGlzLnJhbmdlcywgdGhpcy5pbmZvKTsKCiAgUmFuZ2UgcnVuKEhQaGkgbG9vcFBoaSkgewogICAgLy8gQ3JlYXRlIGEgbWFya2VyIHJhbmdlIGZvciB0aGUgbG9vcCBwaGksIHNvIHRoYXQgaWYgdGhlIHVwZGF0ZQogICAgLy8gdXNlcyB0aGUgbG9vcCBwaGksIGl0IGhhcyBhIHJhbmdlIHRvIHVzZS4KICAgIHJhbmdlc1tsb29wUGhpXSA9IGluZm8ubmV3TWFya2VyUmFuZ2UoKTsKICAgIFJhbmdlIHVwZGF0ZVJhbmdlID0gdmlzaXQobG9vcFBoaS5pbnB1dHNbMV0pOwogICAgcmFuZ2VzW2xvb3BQaGldID0gbnVsbDsKICAgIGlmICh1cGRhdGVSYW5nZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIFJhbmdlIHN0YXJ0UmFuZ2UgPSByYW5nZXNbbG9vcFBoaS5pbnB1dHNbMF1dOwogICAgLy8gSWYgdGhlIGxvd2VyIChyZXNwZWN0aXZlbHkgdXBwZXIpIHZhbHVlIGlzIHRoZSBtYXJrZXIsIHdlIGtub3cKICAgIC8vIHRoZSBsb29wIGRvZXMgbm90IGNoYW5nZSBpdCwgc28gd2UgY2FuIGp1c3QgdXNlIHRoZQogICAgLy8gW3N0YXJ0UmFuZ2VdJ3MgbG93ZXIgKHVwcGVyKSB2YWx1ZS4gT3RoZXJ3aXNlIHRoZSBsb3dlciAodXBwZXIpIHZhbHVlCiAgICAvLyBpcyB0aGUgbWluaW11bSBvZiB0aGUgW3N0YXJ0UmFuZ2VdJ3MgbG93ZXIgKHVwcGVyKSBhbmQgdGhlCiAgICAvLyBbdXBkYXRlUmFuZ2VdJ3MgbG93ZXIgKHVwcGVyKS4KICAgIFZhbHVlIGxvdyA9IHVwZGF0ZVJhbmdlLmxvd2VyIGlzIE1hcmtlclZhbHVlCiAgICAgICAgPyBzdGFydFJhbmdlLmxvd2VyCiAgICAgICAgOiB1cGRhdGVSYW5nZS5sb3dlci5taW4oc3RhcnRSYW5nZS5sb3dlcik7CiAgICBWYWx1ZSB1cCA9IHVwZGF0ZVJhbmdlLnVwcGVyIGlzIE1hcmtlclZhbHVlCiAgICAgICAgPyBzdGFydFJhbmdlLnVwcGVyCiAgICAgICAgOiB1cGRhdGVSYW5nZS51cHBlci5tYXgoc3RhcnRSYW5nZS51cHBlcik7CiAgICByZXR1cm4gaW5mby5uZXdOb3JtYWxpemVkUmFuZ2UobG93LCB1cCk7CiAgfQoKICBSYW5nZSB2aXNpdChISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24pIHsKICAgIGlmIChpbnN0cnVjdGlvbgogICAgICAgIC5pc0ludGVnZXIoY2xvc2VkV29ybGQuYWJzdHJhY3RWYWx1ZURvbWFpbikKICAgICAgICAuaXNQb3RlbnRpYWxseUZhbHNlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKHJhbmdlc1tpbnN0cnVjdGlvbl0gIT0gbnVsbCkgcmV0dXJuIHJhbmdlc1tpbnN0cnVjdGlvbl07CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb24uYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgUmFuZ2UgdmlzaXRQaGkoSFBoaSBwaGkpIHsKICAgIC8vIElmIHRoZSB1cGRhdGUgb2YgYSBsb29wIHBoaSBpbnZvbHZlcyBhbm90aGVyIGxvb3AgcGhpLCB3ZSBnaXZlCiAgICAvLyB1cC4KICAgIGlmIChwaGkuYmxvY2suaXNMb29wSGVhZGVyKCkpIHJldHVybiBudWxsOwogICAgUmFuZ2UgcGhpUmFuZ2U7CiAgICBmb3IgKEhJbnN0cnVjdGlvbiBpbnB1dCBpbiBwaGkuaW5wdXRzKSB7CiAgICAgIFJhbmdlIGlucHV0UmFuZ2UgPSB2aXNpdChpbnB1dCk7CiAgICAgIGlmIChpbnB1dFJhbmdlID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBpZiAocGhpUmFuZ2UgPT0gbnVsbCkgewogICAgICAgIHBoaVJhbmdlID0gaW5wdXRSYW5nZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwaGlSYW5nZSA9IHBoaVJhbmdlLnVuaW9uKGlucHV0UmFuZ2UpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGhpUmFuZ2U7CiAgfQoKICBAb3ZlcnJpZGUKICBSYW5nZSB2aXNpdENoZWNrKEhDaGVjayBpbnN0cnVjdGlvbikgewogICAgcmV0dXJuIHZpc2l0KGluc3RydWN0aW9uLmNoZWNrZWRJbnB1dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBSYW5nZSB2aXNpdEFkZChIQWRkIG9wZXJhdGlvbikgewogICAgcmV0dXJuIGhhbmRsZUJpbmFyeU9wZXJhdGlvbihvcGVyYXRpb24p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k2kvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi91bml2ZXJzZS9zaWRlX2VmZmVjdHMuZGFydCcgc2hvdyBTaWRlRWZmZWN0czsKaW1wb3J0ICdub2Rlcy5kYXJ0JzsKCmNsYXNzIFZhbHVlU2V0IHsKICBpbnQgc2l6ZSA9IDA7CiAgTGlzdDxISW5zdHJ1Y3Rpb24+IHRhYmxlOwogIFZhbHVlU2V0Tm9kZSBjb2xsaXNpb25zOwogIFZhbHVlU2V0KCkgOiB0YWJsZSA9IG5ldyBMaXN0PEhJbnN0cnVjdGlvbj4oOCk7CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gc2l6ZSA9PSAwOwogIGludCBnZXQgbGVuZ3RoID0+IHNpemU7CgogIHZvaWQgYWRkKEhJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikgewogICAgYXNzZXJ0KGxvb2t1cChpbnN0cnVjdGlvbikgPT0gbnVsbCk7CiAgICBpbnQgaGFzaENvZGUgPSBpbnN0cnVjdGlvbi5ndm5IYXNoQ29kZSgpOwogICAgaW50IGNhcGFjaXR5ID0gdGFibGUubGVuZ3RoOwogICAgLy8gUmVzaXplIHdoZW4gaGFsZiBvZiB0aGUgaGFzaCB0YWJsZSBpcyBpbiB1c2UuCiAgICBpZiAoc2l6ZSA+PSBjYXBhY2l0eSA+PiAxKSB7CiAgICAgIGNhcGFjaXR5ID0gY2FwYWNpdHkgPDwgMTsKICAgICAgcmVzaXplKGNhcGFjaXR5KTsKICAgIH0KICAgIC8vIFRyeSB0byBpbnNlcnQgaW4gdGhlIGhhc2ggdGFibGUgZmlyc3QuCiAgICBpbnQgaW5kZXggPSBoYXNoQ29kZSAlIGNhcGFjaXR5OwogICAgaWYgKHRhYmxlW2luZGV4XSA9PSBudWxsKSB7CiAgICAgIHRhYmxlW2luZGV4XSA9IGluc3RydWN0aW9uOwogICAgfSBlbHNlIHsKICAgICAgY29sbGlzaW9ucyA9IG5ldyBWYWx1ZVNldE5vZGUoaW5zdHJ1Y3Rpb24sIGhhc2hDb2RlLCBjb2xsaXNpb25zKTsKICAgIH0KICAgIHNpemUrKzsKICB9CgogIEhJbnN0cnVjdGlvbiBsb29rdXAoSEluc3RydWN0aW9uIGluc3RydWN0aW9uKSB7CiAgICBpbnQgaGFzaENvZGUgPSBpbnN0cnVjdGlvbi5ndm5IYXNoQ29kZSgpOwogICAgaW50IGluZGV4ID0gaGFzaENvZGUgJSB0YWJsZS5sZW5ndGg7CiAgICAvLyBMb29rIGluIHRoZSBoYXNoIHRhYmxlLgogICAgSEluc3RydWN0aW9uIHByb2JlID0gdGFibGVbaW5kZXhdOwogICAgaWYgKHByb2JlICE9IG51bGwgJiYgcHJvYmUuZ3ZuRXF1YWxzKGluc3RydWN0aW9uKSkgcmV0dXJuIHByb2JlOwogICAgLy8gTG9vayBpbiB0aGUgY29sbGlzaW9ucyBsaXN0LgogICAgZm9yIChWYWx1ZVNldE5vZGUgbm9kZSA9IGNvbGxpc2lvbnM7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUubmV4dCkgewogICAgICBpZiAobm9kZS5oYXNoQ29kZSA9PSBoYXNoQ29kZSkgewogICAgICAgIEhJbnN0cnVjdGlvbiBjYWNoZWQgPSBub2RlLnZhbHVlOwogICAgICAgIGlmIChjYWNoZWQuZ3ZuRXF1YWxzKGluc3RydWN0aW9uKSkgcmV0dXJuIGNhY2hlZDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIGtpbGwoaW50IGZsYWdzKSB7CiAgICBpZiAoZmxhZ3MgPT0gMCkgcmV0dXJuOwogICAgaW50IGRlcGVuZHMgPSBTaWRlRWZmZWN0cy5jb21wdXRlRGVwZW5kc09uRmxhZ3MoZmxhZ3MpOwogICAgLy8gS2lsbCBpbiB0aGUgaGFzaCB0YWJsZS4KICAgIGZvciAoaW50IGluZGV4ID0gMCwgbGVuZ3RoID0gdGFibGUubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSB0YWJsZVtpbmRleF07CiAgICAgIGlmIChpbnN0cnVjdGlvbiAhPSBudWxsICYmIGluc3RydWN0aW9uLnNpZGVFZmZlY3RzLmRlcGVuZHNPbihkZXBlbmRzKSkgewogICAgICAgIHRhYmxlW2luZGV4XSA9IG51bGw7CiAgICAgICAgc2l6ZS0tOwogICAgICB9CiAgICB9CiAgICAvLyBLaWxsIGluIHRoZSBjb2xsaXNpb25zIGxpc3QuCiAgICBWYWx1ZVNldE5vZGUgcHJldmlvdXMgPSBudWxsOwogICAgVmFsdWVTZXROb2RlIGN1cnJlbnQgPSBjb2xsaXNpb25zOwogICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgewogICAgICBWYWx1ZVNldE5vZGUgbmV4dCA9IGN1cnJlbnQubmV4dDsKICAgICAgSEluc3RydWN0aW9uIGNhY2hlZCA9IGN1cnJlbnQudmFsdWU7CiAgICAgIGlmIChjYWNoZWQuc2lkZUVmZmVjdHMuZGVwZW5kc09uKGRlcGVuZHMpKSB7CiAgICAgICAgaWYgKHByZXZpb3VzID09IG51bGwpIHsKICAgICAgICAgIGNvbGxpc2lvbnMgPSBuZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDsKICAgICAgICB9CiAgICAgICAgc2l6ZS0tOwogICAgICB9IGVsc2UgewogICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKICAgICAgfQogICAgICBjdXJyZW50ID0gbmV4dDsKICAgIH0KICB9CgogIFZhbHVlU2V0IGNvcHkoKSB7CiAgICByZXR1cm4gY29weVRvKG5ldyBWYWx1ZVNldCgpLCB0YWJsZSwgY29sbGlzaW9ucyk7CiAgfQoKICBMaXN0PEhJbnN0cnVjdGlvbj4gdG9MaXN0KCkgewogICAgcmV0dXJuIGNvcHlUbyg8SEluc3RydWN0aW9uPltdLCB0YWJsZSwgY29sbGlzaW9ucyk7CiAgfQoKICAvLyBDb3B5IHRoZSBpbnN0cnVjdGlvbnMgaW4gdmFsdWUgc2V0IGRlZmluZWQgYnkgW3RhYmxlXSBhbmQKICAvLyBbY29sbGlzaW9uc10gaW50byBbb3RoZXJdIGFuZCByZXR1cm5zIFtvdGhlcl0uIFRoZSBjb3B5IGlzIGRvbmUKICAvLyBieSBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgaGFzaCB0YWJsZSBhbmQgdGhlIGNvbGxpc2lvbnMgbGlzdCBhbmQKICAvLyBjYWxsaW5nIFs6b3RoZXIuYWRkOl0uCiAgc3RhdGljIGNvcHlUbyh2YXIgb3RoZXIsIExpc3Q8SEluc3RydWN0aW9uPiB0YWJsZSwgVmFsdWVTZXROb2RlIGNvbGxpc2lvbnMpIHsKICAgIC8vIENvcHkgZWxlbWVudHMgZnJvbSB0aGUgaGFzaCB0YWJsZS4KICAgIGZvciAoaW50IGluZGV4ID0gMCwgbGVuZ3RoID0gdGFibGUubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewogICAgICBISW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gPSB0YWJsZVtpbmRleF07CiAgICAgIGlmIChpbnN0cnVjdGlvbiAhPSBudWxsKSBvdGhlci5hZGQoaW5zdHJ1Y3Rpb24pOwogICAgfQogICAgLy8gQ29weSBlbGVtZW50cyBmcm9tIHRoZSBjb2xsaXNpb24gbGlzdC4KICAgIFZhbHVlU2V0Tm9kZSBjdXJyZW50ID0gY29sbGlzaW9uczsKICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKICAgICAgLy8gVE9ETyhrYXNwZXJsKTogTWF5YmUgZmluZCBhIHdheSBvZiByZXVzaW5nIHRoZSBoYXNoIGNvZGUKICAgICAgLy8gcmF0aGVyIHRoYW4gcmVjb21wdXRpbmcgaXQgZXZlcnkgdGltZS4KICAgICAgb3RoZXIuYWRkKGN1cnJlbnQudmFsdWUpOwogICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0OwogICAgfQogICAgcmV0dXJuIG90aGVyOwogIH0KCiAgVmFsdWVTZXQgaW50ZXJzZWN0aW9uKFZhbHVlU2V0IG90aGVyKSB7CiAgICBpZiAoc2l6ZSA+IG90aGVyLnNpemUpIHJldHVybiBvdGhlci5pbnRlcnNlY3Rpb24odGhpcyk7CiAgICBWYWx1ZVNldCByZXN1bHQgPSBuZXcgVmFsdWVTZXQoKTsKICAgIC8vIExvb2sgaW4gdGhlIGhhc2ggdGFibGUuCiAgICBmb3IgKGludCBpbmRleCA9IDAsIGxlbmd0aCA9IHRhYmxlLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHsKICAgICAgSEluc3RydWN0aW9uIGluc3RydWN0aW9uID0gdGFibGVbaW5kZXhdOwogICAgICBpZiAoaW5zdHJ1Y3Rpb24gIT0gbnVsbCAmJiBvdGhlci5sb29rdXAoaW5zdHJ1Y3Rpb24pICE9IG51bGwpIHsKICAgICAgICByZXN1bHQuYWRkKGluc3RydWN0aW9uKTsKICAgICAgfQogICAgfQogICAgLy8gTG9vayBpbiB0aGUgY29sbGlzaW9uIGxpc3QuCiAgICBWYWx1ZVNldE5vZGUgY3VycmVudCA9IGNvbGxpc2lvbnM7CiAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CiAgICAgIEhJbnN0cnVjdGlvbiB2YWx1ZSA9IGN1cnJlbnQudmFsdWU7CiAgICAgIGlmIChvdGhlci5sb29rdXAodmFsdWUpICE9IG51bGwpIHsKICAgICAgICByZXN1bHQuYWRkKHZhbHVlKTsKICAgICAgfQogICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgcmVzaXplKGludCBjYXBhY2l0eSkgewogICAgdmFyIG9sZFNpemUgPSBzaXplOwogICAgdmFyIG9sZFRhYmxlID0gdGFibGU7CiAgICB2YXIgb2xkQ29sbGlzaW9ucyA9IGNvbGxpc2lvbnM7CiAgICAvLyBSZXNldCB0aGUgdGFibGUgd2l0aCBhIGJpZ2dlciBjYXBhY2l0eS4KICAgIGFzc2VydChjYXBhY2l0eSA+IHRhYmxlLmxlbmd0aCk7CiAgICBzaXplID0gMDsKICAgIHRhYmxlID0gbmV3IExpc3Q8SEluc3RydWN0aW9uPihjYXBhY2l0eSk7CiAgICBjb2xsaXNpb25zID0gbnVsbDsKICAgIC8vIEFkZCB0aGUgb2xkIGluc3RydWN0aW9ucyB0byB0aGUgbmV3IHRhYmxlLgogICAgY29weVRvKHRoaXMsIG9sZFRhYmxlLCBvbGRDb2xsaXNpb25zKTsKICAgIC8vIE1ha2Ugc3VyZSB3ZSBwcmVzZXJ2ZWQgYWxsIGVsZW1lbnRzIGFuZCB0aGF0IG5vIHJlc2l6aW5nCiAgICAvLyBoYXBwZW5lZCBhcyBwYXJ0IG9mIHRoaXMgcmVzaXppbmcuCiAgICBhc3NlcnQoc2l6ZSA9PSBvbGRTaXplKTsKICAgIGFzc2VydCh0YWJsZS5sZW5ndGggPT0gY2FwYWNpdHkpOwogIH0KfQoKY2xhc3MgVmFsdWVTZXROb2RlIHsKICBmaW5hbCBISW5zdHJ1Y3Rpb24gdmFsdWU7CiAgZmluYWwgaW50IGhhc2g7CiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBoYXNoOwogIFZhbHVlU2V0Tm9kZSBuZXh0OwogIFZhbHVlU2V0Tm9kZSh0aGlzLnZhbHVlLCB0aGlzLmhhc2gsIHRoaXMubmV4dCk7Cn0KgKEATk48ATkVAREQHBsyASEaAScpLiE1ISAYBi4lICINSAYMBAEyLikfJ0UkSycqOggGEQQBGRw8H0ovTx0QCAYkIiceKCszIB0RIAoQDxwIFgYEARQ2BAEgOAQBP0VFHFAqSi83Bi4nHkIwIB4GEgQBKjwmH0ovRiEIBiMnHiopGwgeBhMEAR4YGiQvJQ4uFzIrQCodJgQCARUcEgwcFTICASdwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvdmFsdWVfc2V0LmRhcnQrc2Rrcm9vdDovcGtnL2pzX2FzdC9saWIvc3JjL2NoYXJhY3RlcnMuZGFydIpJLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkganNfY2hhcmFjdGVyX2NvZGVzOwoKY29uc3QgaW50ICRFT0YgPSAwOwpjb25zdCBpbnQgJFNUWCA9IDI7CmNvbnN0IGludCAkQlMgPSA4Owpjb25zdCBpbnQgJFRBQiA9IDk7CmNvbnN0IGludCAkTEYgPSAxMDsKY29uc3QgaW50ICRWVEFCID0gMTE7CmNvbnN0IGludCAkRkYgPSAxMjsKY29uc3QgaW50ICRDUiA9IDEzOwpjb25zdCBpbnQgJFNQQUNFID0gMzI7CmNvbnN0IGludCAkQkFORyA9IDMzOwpjb25zdCBpbnQgJERRID0gMzQ7CmNvbnN0IGludCAkSEFTSCA9IDM1Owpjb25zdCBpbnQgJCQgPSAzNjsKY29uc3QgaW50ICRQRVJDRU5UID0gMzc7CmNvbnN0IGludCAkQU1QRVJTQU5EID0gMzg7CmNvbnN0IGludCAkU1EgPSAzOTsKY29uc3QgaW50ICRPUEVOX1BBUkVOID0gNDA7CmNvbnN0IGludCAkQ0xPU0VfUEFSRU4gPSA0MTsKY29uc3QgaW50ICRTVEFSID0gNDI7CmNvbnN0IGludCAkUExVUyA9IDQzOwpjb25zdCBpbnQgJENPTU1BID0gNDQ7CmNvbnN0IGludCAkTUlOVVMgPSA0NTsKY29uc3QgaW50ICRQRVJJT0QgPSA0NjsKY29uc3QgaW50ICRTTEFTSCA9IDQ3Owpjb25zdCBpbnQgJDAgPSA0ODsKY29uc3QgaW50ICQxID0gNDk7CmNvbnN0IGludCAkMiA9IDUwOwpjb25zdCBpbnQgJDMgPSA1MTsKY29uc3QgaW50ICQ0ID0gNTI7CmNvbnN0IGludCAkNSA9IDUzOwpjb25zdCBpbnQgJDYgPSA1NDsKY29uc3QgaW50ICQ3ID0gNTU7CmNvbnN0IGludCAkOCA9IDU2Owpjb25zdCBpbnQgJDkgPSA1NzsKY29uc3QgaW50ICRDT0xPTiA9IDU4Owpjb25zdCBpbnQgJFNFTUlDT0xPTiA9IDU5Owpjb25zdCBpbnQgJExUID0gNjA7CmNvbnN0IGludCAkRVEgPSA2MTsKY29uc3QgaW50ICRHVCA9IDYyOwpjb25zdCBpbnQgJFFVRVNUSU9OID0gNjM7CmNvbnN0IGludCAkQVQgPSA2NDsKY29uc3QgaW50ICRBID0gNjU7CmNvbnN0IGludCAkQiA9IDY2Owpjb25zdCBpbnQgJEMgPSA2NzsKY29uc3QgaW50ICREID0gNjg7CmNvbnN0IGludCAkRSA9IDY5Owpjb25zdCBpbnQgJEYgPSA3MDsKY29uc3QgaW50ICRHID0gNzE7CmNvbnN0IGludCAkSCA9IDcyOwpjb25zdCBpbnQgJEkgPSA3MzsKY29uc3QgaW50ICRKID0gNzQ7CmNvbnN0IGludCAkSyA9IDc1Owpjb25zdCBpbnQgJEwgPSA3NjsKY29uc3QgaW50ICRNID0gNzc7CmNvbnN0IGludCAkTiA9IDc4Owpjb25zdCBpbnQgJE8gPSA3OTsKY29uc3QgaW50ICRQID0gODA7CmNvbnN0IGludCAkUSA9IDgxOwpjb25zdCBpbnQgJFIgPSA4MjsKY29uc3QgaW50ICRTID0gODM7CmNvbnN0IGludCAkVCA9IDg0Owpjb25zdCBpbnQgJFUgPSA4NTsKY29uc3QgaW50ICRWID0gODY7CmNvbnN0IGludCAkVyA9IDg3Owpjb25zdCBpbnQgJFggPSA4ODsKY29uc3QgaW50ICRZID0gODk7CmNvbnN0IGludCAkWiA9IDkwOwpjb25zdCBpbnQgJE9QRU5fU1FVQVJFX0JSQUNLRVQgPSA5MTsKY29uc3QgaW50ICRCQUNLU0xBU0ggPSA5MjsKY29uc3QgaW50ICRDTE9TRV9TUVVBUkVfQlJBQ0tFVCA9IDkzOwpjb25zdCBpbnQgJENBUkVUID0gOTQ7CmNvbnN0IGludCAkXyA9IDk1Owpjb25zdCBpbnQgJEJBQ0tQSU5HID0gOTY7CmNvbnN0IGludCAkYSA9IDk3Owpjb25zdCBpbnQgJGIgPSA5ODsKY29uc3QgaW50ICRjID0gOTk7CmNvbnN0IGludCAkZCA9IDEwMDsKY29uc3QgaW50ICRlID0gMTAxOwpjb25zdCBpbnQgJGYgPSAxMDI7CmNvbnN0IGludCAkZyA9IDEwMzsKY29uc3QgaW50ICRoID0gMTA0Owpjb25zdCBpbnQgJGkgPSAxMDU7CmNvbnN0IGludCAkaiA9IDEwNjsKY29uc3QgaW50ICRrID0gMTA3Owpjb25zdCBpbnQgJGwgPSAxMDg7CmNvbnN0IGludCAkbSA9IDEwOTsKY29uc3QgaW50ICRuID0gMTEwOwpjb25zdCBpbnQgJG8gPSAxMTE7CmNvbnN0IGludCAkcCA9IDExMjsKY29uc3QgaW50ICRxID0gMTEzOwpjb25zdCBpbnQgJHIgPSAxMTQ7CmNvbnN0IGludCAkcyA9IDExNTsKY29uc3QgaW50ICR0ID0gMTE2Owpjb25zdCBpbnQgJHUgPSAxMTc7CmNvbnN0IGludCAkdiA9IDExODsKY29uc3QgaW50ICR3ID0gMTE5Owpjb25zdCBpbnQgJHggPSAxMjA7CmNvbnN0IGludCAkeSA9IDEyMTsKY29uc3QgaW50ICR6ID0gMTIyOwpjb25zdCBpbnQgJE9QRU5fQ1VSTFlfQlJBQ0tFVCA9IDEyMzsKY29uc3QgaW50ICRCQVIgPSAxMjQ7CmNvbnN0IGludCAkQ0xPU0VfQ1VSTFlfQlJBQ0tFVCA9IDEyNTsKY29uc3QgaW50ICRUSUxERSA9IDEyNjsKY29uc3QgaW50ICRERUwgPSAxMjc7CmNvbnN0IGludCAkTkJTUCA9IDE2MDsKY29uc3QgaW50ICRMUyA9IDB4MjAyODsKY29uc3QgaW50ICRQUyA9IDB4MjAyOTsKCmNvbnN0IGludCAkRklSU1RfU1VSUk9HQVRFID0gMHhkODAwOwpjb25zdCBpbnQgJExBU1RfU1VSUk9HQVRFID0gMHhkZmZmOwpjb25zdCBpbnQgJExBU1RfQ09ERV9QT0lOVCA9IDB4MTBmZmZmOwp3AE5OPAEcARQUExQUFhQUFxYUFhMZGxQcHRYWFxcYFxMTExMTExMTExMXGxQUFBoUExMTExMTExMTExMTExMTExMTExMTExMTExMlGyYXExoTExMUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCUWJhgWFxgYASUkJwEicGFja2FnZTpqc19hc3Qvc3JjL2NoYXJhY3RlcnMuZGFydDtzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29sbGVjdGlvbi9saWIvc3JjL2FsZ29yaXRobXMuZGFydKYfLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAiZGFydDptYXRoIiBhcyBtYXRoOwoKaW1wb3J0ICJ1dGlscy5kYXJ0IjsKCi8vLyBSZXR1cm5zIGEgcG9zaXRpb24gb2YgdGhlIFt2YWx1ZV0gaW4gW3NvcnRlZExpc3RdLCBpZiBpdCBpcyB0aGVyZS4KLy8vCi8vLyBJZiB0aGUgbGlzdCBpc24ndCBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBbY29tcGFyZV0gZnVuY3Rpb24sIHRoZSByZXN1bHQKLy8vIGlzIHVucHJlZGljdGFibGUuCi8vLwovLy8gSWYgW2NvbXBhcmVdIGlzIG9taXR0ZWQsIHRoaXMgZGVmYXVsdHMgdG8gY2FsbGluZyBbQ29tcGFyYWJsZS5jb21wYXJlVG9dIG9uCi8vLyB0aGUgb2JqZWN0cy4gSWYgYW55IG9iamVjdCBpcyBub3QgW0NvbXBhcmFibGVdLCB0aGlzIHRocm93cyBhIFtDYXN0RXJyb3JdLgovLy8KLy8vIFJldHVybnMgLTEgaWYgW3ZhbHVlXSBpcyBub3QgaW4gdGhlIGxpc3QgYnkgZGVmYXVsdC4KaW50IGJpbmFyeVNlYXJjaDxUPihMaXN0PFQ+IHNvcnRlZExpc3QsIFQgdmFsdWUsIHtpbnQgY29tcGFyZShUIGEsIFQgYil9KSB7CiAgY29tcGFyZSA/Pz0gZGVmYXVsdENvbXBhcmU8VD4oKTsKICBpbnQgbWluID0gMDsKICBpbnQgbWF4ID0gc29ydGVkTGlzdC5sZW5ndGg7CiAgd2hpbGUgKG1pbiA8IG1heCkgewogICAgaW50IG1pZCA9IG1pbiArICgobWF4IC0gbWluKSA+PiAxKTsKICAgIHZhciBlbGVtZW50ID0gc29ydGVkTGlzdFttaWRdOwogICAgaW50IGNvbXAgPSBjb21wYXJlKGVsZW1lbnQsIHZhbHVlKTsKICAgIGlmIChjb21wID09IDApIHJldHVybiBtaWQ7CiAgICBpZiAoY29tcCA8IDApIHsKICAgICAgbWluID0gbWlkICsgMTsKICAgIH0gZWxzZSB7CiAgICAgIG1heCA9IG1pZDsKICAgIH0KICB9CiAgcmV0dXJuIC0xOwp9CgovLy8gUmV0dXJucyB0aGUgZmlyc3QgcG9zaXRpb24gaW4gW3NvcnRlZExpc3RdIHRoYXQgZG9lcyBub3QgY29tcGFyZSBsZXNzIHRoYW4KLy8vIFt2YWx1ZV0uCi8vLwovLy8gSWYgdGhlIGxpc3QgaXNuJ3Qgc29ydGVkIGFjY29yZGluZyB0byB0aGUgW2NvbXBhcmVdIGZ1bmN0aW9uLCB0aGUgcmVzdWx0Ci8vLyBpcyB1bnByZWRpY3RhYmxlLgovLy8KLy8vIElmIFtjb21wYXJlXSBpcyBvbWl0dGVkLCB0aGlzIGRlZmF1bHRzIHRvIGNhbGxpbmcgW0NvbXBhcmFibGUuY29tcGFyZVRvXSBvbgovLy8gdGhlIG9iamVjdHMuIElmIGFueSBvYmplY3QgaXMgbm90IFtDb21wYXJhYmxlXSwgdGhpcyB0aHJvd3MgYSBbQ2FzdEVycm9yXS4KLy8vCi8vLyBSZXR1cm5zIFtzb3J0ZWRMaXN0Lmxlbmd0aF0gaWYgYWxsIHRoZSBpdGVtcyBpbiBbc29ydGVkTGlzdF0gY29tcGFyZSBsZXNzCi8vLyB0aGFuIFt2YWx1ZV0uCmludCBsb3dlckJvdW5kPFQ+KExpc3Q8VD4gc29ydGVkTGlzdCwgVCB2YWx1ZSwge2ludCBjb21wYXJlKFQgYSwgVCBiKX0pIHsKICBjb21wYXJlID8/PSBkZWZhdWx0Q29tcGFyZTxUPigpOwogIGludCBtaW4gPSAwOwogIGludCBtYXggPSBzb3J0ZWRMaXN0Lmxlbmd0aDsKICB3aGlsZSAobWluIDwgbWF4KSB7CiAgICBpbnQgbWlkID0gbWluICsgKChtYXggLSBtaW4pID4+IDEpOwogICAgdmFyIGVsZW1lbnQgPSBzb3J0ZWRMaXN0W21pZF07CiAgICBpbnQgY29tcCA9IGNvbXBhcmUoZWxlbWVudCwgdmFsdWUpOwogICAgaWYgKGNvbXAgPCAwKSB7CiAgICAgIG1pbiA9IG1pZCArIDE7CiAgICB9IGVsc2UgewogICAgICBtYXggPSBtaWQ7CiAgICB9CiAgfQogIHJldHVybiBtaW47Cn0KCi8vLyBTaHVmZmxlcyBhIGxpc3QgcmFuZG9tbHkuCi8vLwovLy8gQSBzdWItcmFuZ2Ugb2YgYSBsaXN0IGNhbiBiZSBzaHVmZmxlZCBieSBwcm92aWRpbmcgW3N0YXJ0XSBhbmQgW2VuZF0uCnZvaWQgc2h1ZmZsZShMaXN0IGxpc3QsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogIHZhciByYW5kb20gPSBuZXcgbWF0aC5SYW5kb20oKTsKICBpZiAoZW5kID09IG51bGwpIGVuZCA9IGxpc3QubGVuZ3RoOwogIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICB3aGlsZSAobGVuZ3RoID4gMSkgewogICAgaW50IHBvcyA9IHJhbmRvbS5uZXh0SW50KGxlbmd0aCk7CiAgICBsZW5ndGgtLTsKICAgIHZhciB0bXAxID0gbGlzdFtzdGFydCArIHBvc107CiAgICBsaXN0W3N0YXJ0ICsgcG9zXSA9IGxpc3Rbc3RhcnQgKyBsZW5ndGhdOwogICAgbGlzdFtzdGFydCArIGxlbmd0aF0gPSB0bXAxOwogIH0KfQoKLy8vIFJldmVyc2VzIGEgbGlzdCwgb3IgYSBwYXJ0IG9mIGEgbGlzdCwgaW4tcGxhY2UuCnZvaWQgcmV2ZXJzZShMaXN0IGxpc3QsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogIGlmIChlbmQgPT0gbnVsbCkgZW5kID0gbGlzdC5sZW5ndGg7CiAgX3JldmVyc2UobGlzdCwgc3RhcnQsIGVuZCk7Cn0KCi8vLyBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24gdGhhdCBhc3N1bWVzIHZhbGlkIGFyZ3VtZW50cy4Kdm9pZCBfcmV2ZXJzZShMaXN0IGxpc3QsIGludCBzdGFydCwgaW50IGVuZCkgewogIGZvciAoaW50IGkgPSBzdGFydCwgaiA9IGVuZCAtIDE7IGkgPCBqOyBpKyssIGotLSkgewogICAgdmFyIHRtcCA9IGxpc3RbaV07CiAgICBsaXN0W2ldID0gbGlzdFtqXTsKICAgIGxpc3Rbal0gPSB0bXA7CiAgfQp9CgovLy8gU29ydCBhIGxpc3QgYmV0d2VlbiBbc3RhcnRdIChpbmNsdXNpdmUpIGFuZCBbZW5kXSAoZXhjbHVzaXZlKSB1c2luZwovLy8gaW5zZXJ0aW9uIHNvcnQuCi8vLwovLy8gSWYgW2NvbXBhcmVdIGlzIG9taXR0ZWQsIHRoaXMgZGVmYXVsdHMgdG8gY2FsbGluZyBbQ29tcGFyYWJsZS5jb21wYXJlVG9dIG9uCi8vLyB0aGUgb2JqZWN0cy4gSWYgYW55IG9iamVjdCBpcyBub3QgW0NvbXBhcmFibGVdLCB0aGlzIHRocm93cyBhIFtDYXN0RXJyb3JdLgovLy8KLy8vIEluc2VydGlvbiBzb3J0IGlzIGEgc2ltcGxlIHNvcnRpbmcgYWxnb3JpdGhtLiBGb3IgYG5gIGVsZW1lbnRzIGl0IGRvZXMgb24KLy8vIHRoZSBvcmRlciBvZiBgbiAqIGxvZyhuKWAgY29tcGFyaXNvbnMgYnV0IHVwIHRvIGBuYCBzcXVhcmVkIG1vdmVzLiBUaGUKLy8vIHNvcnRpbmcgaXMgcGVyZm9ybWVkIGluLXBsYWNlLCB3aXRob3V0IHVzaW5nIGV4dHJhIG1lbW9yeS4KLy8vCi8vLyBGb3Igc2hvcnQgbGlzdHMgdGhlIG1hbnkgbW92ZXMgaGF2ZSBsZXNzIGltcGFjdCB0aGFuIHRoZSBzaW1wbGUgYWxnb3JpdGhtLAovLy8gYW5kIGl0IGlzIG9mdGVuIHRoZSBmYXZvcmVkIHNvcnRpbmcgYWxnb3JpdGhtIGZvciBzaG9ydCBsaXN0cy4KLy8vCi8vLyBUaGlzIGluc2VydGlvbiBzb3J0IGlzIHN0YWJsZTogRXF1YWwgZWxlbWVudHMgZW5kIHVwIGluIHRoZSBzYW1lIG9yZGVyCi8vLyBhcyB0aGV5IHN0YXJ0ZWQgaW4uCnZvaWQgaW5zZXJ0aW9uU29ydDxUPihMaXN0PFQ+IGxpc3QsCiAgICB7aW50IGNvbXBhcmUoVCBhLCBUIGIpLCBpbnQgc3RhcnQ6IDAsIGludCBlbmR9KSB7CiAgLy8gSWYgdGhlIHNhbWUgbWV0aG9kIGNvdWxkIGhhdmUgYm90aCBwb3NpdGlvbmFsIGFuZCBuYW1lZCBvcHRpb25hbAogIC8vIHBhcmFtZXRlcnMsIHRoaXMgc2hvdWxkIGJlIChsaXN0LCBbc3RhcnQsIGVuZF0sIHtjb21wYXJlfSkuCiAgY29tcGFyZSA/Pz0gZGVmYXVsdENvbXBhcmU8VD4oKTsKICBlbmQgPz89IGxpc3QubGVuZ3RoOwoKICBmb3IgKGludCBwb3MgPSBzdGFydCArIDE7IHBvcyA8IGVuZDsgcG9zKyspIHsKICAgIGludCBtaW4gPSBzdGFydDsKICAgIGludCBtYXggPSBwb3M7CiAgICB2YXIgZWxlbWVudCA9IGxpc3RbcG9zXTsKICAgIHdoaWxlIChtaW4gPCBtYXgpIHsKICAgICAgaW50IG1pZCA9IG1pbiArICgobWF4IC0gbWluKSA+PiAxKTsKICAgICAgaW50IGNvbXBhcmlzb24gPSBjb21wYXJlKGVsZW1lbnQsIGxpc3RbbWlkXSk7CiAgICAgIGlmIChjb21wYXJpc29uIDwgMCkgewogICAgICAgIG1heCA9IG1pZDsKICAgICAgfSBlbHNlIHsKICAgICAgICBtaW4gPSBtaWQgKyAxOwogICAgICB9CiAgICB9CiAgICBsaXN0LnNldFJhbmdlKG1pbiArIDEsIHBvcyArIDEsIGxpc3QsIG1pbik7CiAgICBsaXN0W21pbl0gPSBlbGVtZW50OwogIH0KfQoKLy8vIExpbWl0IGJlbG93IHdoaWNoIG1lcmdlIHNvcnQgZGVmYXVsdHMgdG8gaW5zZXJ0aW9uIHNvcnQuCmNvbnN0IGludCBfTUVSR0VfU09SVF9MSU1JVCA9IDMyOwoKLy8vIFNvcnRzIGEgbGlzdCBiZXR3ZWVuIFtzdGFydF0gKGluY2x1c2l2ZSkgYW5kIFtlbmRdIChleGNsdXNpdmUpIHVzaW5nIHRoZQovLy8gbWVyZ2Ugc29ydCBhbGdvcml0aG0uCi8vLwovLy8gSWYgW2NvbXBhcmVdIGlzIG9taXR0ZWQsIHRoaXMgZGVmYXVsdHMgdG8gY2FsbGluZyBbQ29tcGFyYWJsZS5jb21wYXJlVG9dIG9uCi8vLyB0aGUgb2JqZWN0cy4gSWYgYW55IG9iamVjdCBpcyBub3QgW0NvbXBhcmFibGVdLCB0aGlzIHRocm93cyBhIFtDYXN0RXJyb3JdLgovLy8KLy8vIE1lcmdlLXNvcnRpbmcgd29ya3MgYnkgc3BsaXR0aW5nIHRoZSBqb2IgaW50byB0d28gcGFydHMsIHNvcnRpbmcgZWFjaAovLy8gcmVjdXJzaXZlbHksIGFuZCB0aGVuIG1lcmdpbmcgdGhlIHR3byBzb3J0ZWQgcGFydHMuCi8vLwovLy8gVGhpcyB0YWtlcyBvbiB0aGUgb3JkZXIgb2YgYG4gKiBsb2cobilgIGNvbXBhcmlzb25zIGFuZCBtb3ZlcyB0byBzb3J0Ci8vLyBgbmAgZWxlbWVudHMsIGJ1dCByZXF1aXJlcyBleHRyYSBzcGFjZSBvZiBhYm91dCB0aGUgc2FtZSBzaXplIGFzIHRoZSBsaXN0Ci8vLyBiZWluZyBzb3J0ZWQuCi8vLwovLy8gVGhpcyBtZXJnZSBzb3J0IGlzIHN0YWJsZTogRXF1YWwgZWxlbWVudHMgZW5kIHVwIGluIHRoZSBzYW1lIG9yZGVyCi8vLyBhcyB0aGV5IHN0YXJ0ZWQgaW4uCnZvaWQgbWVyZ2VTb3J0PFQ+KExpc3Q8VD4gbGlzdCwKICAgIHtpbnQgc3RhcnQ6IDAsIGludCBlbmQsIGludCBjb21wYXJlKFQgYSwgVCBiKX0pIHsKICBlbmQgPz89IGxpc3QubGVuZ3RoOwogIGNvbXBhcmUgPz89IGRlZmF1bHRDb21wYXJlPFQ+KCk7CgogIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICBpZiAobGVuZ3RoIDwgMikgcmV0dXJuOwogIGlmIChsZW5ndGggPCBfTUVSR0VfU09SVF9MSU1JVCkgewogICAgaW5zZXJ0aW9uU29ydChsaXN0LCBjb21wYXJlOiBjb21wYXJlLCBzdGFydDogc3RhcnQsIGVuZDogZW5kKTsKICAgIHJldHVybjsKICB9CiAgLy8gU3BlY2lhbCBjYXNlIHRoZSBmaXJzdCBzcGxpdCBpbnN0ZWFkIG9mIGRpcmVjdGx5IGNhbGxpbmcKICAvLyBfbWVyZ2VTb3J0LCBiZWNhdXNlIHRoZSBfbWVyZ2VTb3J0IHJlcXVpcmVzIGl0cyB0YXJnZXQgdG8KICAvLyBiZSBkaWZmZXJlbnQgZnJvbSBpdHMgc291cmNlLCBhbmQgaXQgcmVxdWlyZXMgZXh0cmEgc3BhY2UKICAvLyBvZiB0aGUgc2FtZSBzaXplIGFzIHRoZSBsaXN0IHRvIHNvcnQuCiAgLy8gVGhpcyBzcGxpdCBhbGxvd3MgdXMgdG8gaGF2ZSBvbmx5IGhhbGYgYXMgbXVjaCBleHRyYSBzcGFjZSwKICAvLyBhbmQgaXQgZW5kcyB1cCBpbiB0aGUgb3JpZ2luYWwgcGxhY2UuCiAgaW50IG1pZGRsZSA9IHN0YXJ0ICsgKChlbmQgLSBzdGFydCkgPj4gMSk7CiAgaW50IGZpcnN0TGVuZ3RoID0gbWlkZGxlIC0gc3RhcnQ7CiAgaW50IHNlY29uZExlbmd0aCA9IGVuZCAtIG1pZGRsZTsKICAvLyBzZWNvbmRMZW5ndGggaXMgYWx3YXlzIHRoZSBzYW1lIGFzIGZpcnN0TGVuZ3RoLCBvciBvbmUgZ3JlYXRlci4KICB2YXIgc2NyYXRjaFNwYWNlID0gbmV3IExpc3Q8VD4oc2Vjb25kTGVuZ3RoKTsKICBfbWVyZ2VTb3J0KGxpc3QsIGNvbXBhcmUsIG1pZGRsZSwgZW5kLCBzY3JhdGNoU3BhY2UsIDApOwogIGludCBmaXJzdFRhcmdldCA9IGVuZCAtIGZpcnN0TGVuZ3RoOwogIF9tZXJnZVNvcnQobGlzdCwgY29tcGFyZSwgc3RhcnQsIG1pZGRsZSwgbGlzdCwgZmlyc3RUYXJnZXQpOwogIF9tZXJnZShjb21wYXJlLCBsaXN0LCBmaXJzdFRhcmdldCwgZW5kLCBzY3JhdGNoU3BhY2UsIDAsIHNlY29uZExlbmd0aCwgbGlzdCwKICAgICAgc3RhcnQpOwp9CgovLy8gUGVyZm9ybXMgYW4gaW5zZXJ0aW9uIHNvcnQgaW50byBhIHBvdGVudGlhbGx5IGRpZmZlcmVudCBsaXN0IHRoYW4gdGhlCi8vLyBvbmUgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgdmFsdWVzLgovLy8KLy8vIEl0IHdpbGwgd29yayBpbi1wbGFjZSBhcyB3ZWxsLgp2b2lkIF9tb3ZpbmdJbnNlcnRpb25Tb3J0PFQ+KExpc3Q8VD4gbGlzdCwgaW50IGNvbXBhcmUoVCBhLCBUIGIpLCBpbnQgc3RhcnQsCiAgICBpbnQgZW5kLCBMaXN0PFQ+IHRhcmdldCwgaW50IHRhcmdldE9mZnNldCkgewogIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICBpZiAobGVuZ3RoID09IDApIHJldHVybjsKICB0YXJnZXRbdGFyZ2V0T2Zmc2V0XSA9IGxpc3Rbc3RhcnRdOwogIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgIHZhciBlbGVtZW50ID0gbGlzdFtzdGFydCArIGldOwogICAgaW50IG1pbiA9IHRhcmdldE9mZnNldDsKICAgIGludCBtYXggPSB0YXJnZXRPZmZzZXQgKyBpOwogICAgd2hpbGUgKG1pbiA8IG1heCkgewogICAgICBpbnQgbWlkID0gbWluICsgKChtYXggLSBtaW4pID4+IDEpOwogICAgICBpZiAoY29tcGFyZShlbGVtZW50LCB0YXJnZXRbbWlkXSkgPCAwKSB7CiAgICAgICAgbWF4ID0gbWlkOwogICAgICB9IGVsc2UgewogICAgICAgIG1pbiA9IG1pZCArIDE7CiAgICAgIH0KICAgIH0KICAgIHRhcmdldC5zZXRSYW5nZShtaW4gKyAxLCB0YXJnZXRPZmZzZXQgKyBpICsgMSwgdGFyZ2V0LCBtaW4pOwogICAgdGFyZ2V0W21pbl0gPSBlbGVtZW50OwogIH0KfQoKLy8vIFNvcnRzIFtsaXN0XSBmcm9tIFtzdGFydF0gdG8gW2VuZF0gaW50byBbdGFyZ2V0XSBhdCBbdGFyZ2V0T2Zmc2V0XS4KLy8vCi8vLyBUaGUgYHRhcmdldGAgbGlzdCBtdXN0IGJlIGFibGUgdG8gY29udGFpbiB0aGUgcmFuZ2UgZnJvbSBgc3RhcnRgIHRvIGBlbmRgCi8vLyBhZnRlciBgdGFyZ2V0T2Zmc2V0YC4KLy8vCi8vLyBBbGxvd3MgdGFyZ2V0IHRvIGJlIHRoZSBzYW1lIGxpc3QgYXMgW2xpc3RdLCBhcyBsb25nIGFzIGl0J3Mgbm90Ci8vLyBvdmVybGFwcGluZyB0aGUgYHN0YXJ0Li5lbmRgIHJhbmdlLgp2b2lkIF9tZXJnZVNvcnQ8VD4oTGlzdDxUPiBsaXN0LCBpbnQgY29tcGFyZShUIGEsIFQgYiksIGludCBzdGFydCwgaW50IGVuZCwKICAgIExpc3Q8VD4gdGFyZ2V0LCBpbnQgdGFyZ2V0T2Zmc2V0KSB7CiAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogIGlmIChsZW5ndGggPCBfTUVSR0VfU09SVF9MSU1JVCkgewogICAgX21vdmluZ0luc2VydGlvblNvcnQobGlzdCwgY29tcGFyZSwgc3RhcnQsIGVuZCwgdGFyZ2V0LCB0YXJnZXRPZmZzZXQpOwogICAgcmV0dXJuOwogIH0KICBpbnQgbWlkZGxlID0gc3RhcnQgKyAobGVuZ3RoID4+IDEpOwogIGludCBmaXJzdExlbmd0aCA9IG1pZGRsZSAtIHN0YXJ0OwogIGludCBzZWNvbmRMZW5ndGggPSBlbmQgLSBtaWRkbGU7CiAgLy8gSGVyZSBzZWNvbmRMZW5ndGggPj0gZmlyc3RMZW5ndGggKGRpZmZlcnMgYnkgYXQgbW9zdCBvbmUpLgogIGludCB0YXJnZXRNaWRkbGUgPSB0YXJnZXRPZmZzZXQgKyBmaXJzdExlbmd0aDsKICAvLyBTb3J0IHRoZSBzZWNvbmQgaGFsZiBpbnRvIHRoZSBlbmQgb2YgdGhlIHRhcmdldCBhcmVhLgogIF9tZXJnZVNvcnQobGlzdCwgY29tcGFyZSwgbWlkZGxlLCBlbmQsIHRhcmdldCwgdGFyZ2V0TWlkZGxlKTsKICAvLyBTb3J0IHRoZSBmaXJzdCBoYWxmIGludG8gdGhlIGVuZCBvZiB0aGUgc291cmNlIGFyZWEuCiAgX21lcmdlU29ydChsaXN0LCBjb21wYXJlLCBzdGFydCwgbWlkZGxlLCBsaXN0LCBtaWRkbGUpOwogIC8vIE1lcmdlIHRoZSB0d28gcGFydHMgaW50byB0aGUgdGFyZ2V0IGFyZWEuCiAgX21lcmdlKGNvbXBhcmUsIGxpc3QsIG1pZGRsZSwgbWlkZGxlICsgZmlyc3RMZW5ndGgsIHRhcmdldCwgdGFyZ2V0TWlkZGxlLAogICAgICB0YXJnZXRNaWRkbGUgKyBzZWNvbmRMZW5ndGgsIHRhcmdldCwgdGFyZ2V0T2Zmc2V0KTsKfQoKLy8vIE1lcmdlcyB0d28gbGlzdHMgaW50byBhIHRhcmdldCBsaXN0LgovLy8KLy8vIE9uZSBvZiB0aGUgaW5wdXQgbGlzdHMgbWF5IGJlIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBvZiB0aGUgdGFyZ2V0Ci8vLyBsaXN0LgovLy8KLy8vIEZvciBlcXVhbCBvYmplY3QsIGVsZW1lbnRzIGZyb20gW2ZpcnN0TGlzdF0gYXJlIGFsd2F5cyBwcmVmZXJyZWQuCi8vLyBUaGlzIGFsbG93cyB0aGUgbWVyZ2UgdG8gYmUgc3RhYmxlIGlmIHRoZSBmaXJzdCBsaXN0IGNvbnRhaW5zIGVsZW1lbnRzCi8vLyB0aGF0IHN0YXJ0ZWQgb3V0IGVhcmxpZXIgdGhhbiB0aGUgb25lcyBpbiBbc2Vjb25kTGlzdF0Kdm9pZCBfbWVyZ2U8VD4oCiAgICBpbnQgY29tcGFyZShUIGEsIFQgYiksCiAgICBMaXN0PFQ+IGZpcnN0TGlzdCwKICAgIGludCBmaXJzdFN0YXJ0LAogICAgaW50IGZpcnN0RW5kLAogICAgTGlzdDxUPiBzZWNvbmRMaXN0LAogICAgaW50IHNlY29uZFN0YXJ0LAogICAgaW50IHNlY29uZEVuZCwKICAgIExpc3Q8VD4gdGFyZ2V0LAogICAgaW50IHRhcmdldE9mZnNldCkgewogIC8vIE5vIGVtcHR5IGxpc3RzIHJlYWNoZXMgaGVyZS4KICBhc3NlcnQoZmlyc3RTdGFydCA8IGZpcnN0RW5kKTsKICBhc3NlcnQoc2Vjb25kU3RhcnQgPCBzZWNvbmRFbmQpOwogIGludCBjdXJzb3IxID0gZmlyc3RTdGFydDsKICBpbnQgY3Vyc29yMiA9IHNlY29uZFN0YXJ0OwogIHZhciBmaXJzdEVsZW1lbnQgPSBmaXJzdExpc3RbY3Vyc29yMSsrXTsKICB2YXIgc2Vjb25kRWxlbWVudCA9IHNlY29uZExpc3RbY3Vyc29yMisrXTsKICB3aGlsZSAodHJ1ZSkgewogICAgaWYgKGNvbXBhcmUoZmlyc3RFbGVtZW50LCBzZWNvbmRFbGVtZW50KSA8PSAwKSB7CiAgICAgIHRhcmdldFt0YXJnZXRPZmZzZXQrK10gPSBmaXJzdEVsZW1lbnQ7CiAgICAgIGlmIChjdXJzb3IxID09IGZpcnN0RW5kKSBicmVhazsgLy8gRmx1c2hpbmcgc2Vjb25kIGxpc3QgYWZ0ZXIgbG9vcC4KICAgICAgZmlyc3RFbGVtZW50ID0gZmlyc3RMaXN0W2N1cnNvcjErK107CiAgICB9IGVsc2UgewogICAgICB0YXJnZXRbdGFyZ2V0T2Zmc2V0KytdID0gc2Vjb25kRWxlbWVudDsKICAgICAgaWYgKGN1cnNvcjIgIT0gc2Vjb25kRW5kKSB7CiAgICAgICAgc2Vjb25kRWxlbWVudCA9IHNlY29uZExpc3RbY3Vyc29yMisrXTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICAvLyBTZWNvbmQgbGlzdCBlbXB0aWVzIGZpcnN0LiBGbHVzaGluZyBmaXJzdCBsaXN0IGhlcmUuCiAgICAgIHRhcmdldFt0YXJnZXRPZmZzZXQrK10gPSBmaXJzdEVsZW1lbnQ7CiAgICAgIHRhcmdldC5zZXRSYW5nZSh0YXJnZXRPZmZzZXQsIHRhcmdldE9mZnNldCArIChmaXJzdEVuZCAtIGN1cnNvcjEpLAogICAgICAgICAgZmlyc3RMaXN0LCBjdXJzb3IxKTsKICAgICAgcmV0dXJuOwogICAgfQogIH0KICAvLyBGaXJzdCBsaXN0IGVtcHRpZXMgZmlyc3QuIFJlYWNoZWQgYnkgYnJlYWsgYWJvdmUuCiAgdGFyZ2V0W3RhcmdldE9mZnNldCsrXSA9IHNlY29uZEVsZW1lbnQ7CiAgdGFyZ2V0LnNldFJhbmdlKAogICAgICB0YXJnZXRPZmZzZXQsIHRhcmdldE9mZnNldCArIChzZWNvbmRFbmQgLSBjdXJzb3IyKSwgc2Vjb25kTGlzdCwgY3Vyc29yMik7Cn0KgR0ATk48ARwBFQFHBE0WBFBPBDlMIw8fFigjKB8UFQ0RBgQNAgFPDQRNFgRQTwROEkojDx8WKCMoFBUNEQYEDgIBHgRKNCImHBcmDiIuIQQCATQ0Jh4CATsvNhcXEwQCAUgUBFBPBE5LPwRPQwRLGCQ2RkEjFwEwFRMdGCo0HBMPFwgGMBkEAgE9IgFNGgRQTwRKOARKThIERxggNhcjARwaJEMMBD4/PytBKy0kI0UwOyc/Tw4CAUooBCNNMRwbJiUjHCAYKi8TDxcIBkEbBAIBSAROGgRFKEwoHCRLDAQmJCNAMTtAOjovTDoCASkERgoERks7EBsXFBIYFRMUGCIhIxwdKy0RNS1KKw0uIi8SCD4tSR8OBgQ3KhNQAgEmcGFja2FnZTpjb2xsZWN0aW9uL3NyYy9hbGdvcml0aG1zLmRhcnRCc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9jYW5vbmljYWxpemVkX21hcC5kYXJ0lVkvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKaW1wb3J0ICd1dGlscy5kYXJ0JzsKCnR5cGVkZWYgQyBfQ2Fub25pY2FsaXplPEMsIEs+KEsga2V5KTsKCnR5cGVkZWYgYm9vbCBfSXNWYWxpZEtleShPYmplY3Qga2V5KTsKCi8vLyBBIG1hcCB3aG9zZSBrZXlzIGFyZSBjb252ZXJ0ZWQgdG8gY2Fub25pY2FsIHZhbHVlcyBvZiB0eXBlIGBDYC4KLy8vCi8vLyBUaGlzIGlzIHVzZWZ1bCBmb3IgdXNpbmcgY2FzZS1pbnNlbnNpdGl2ZSBTdHJpbmcga2V5cywgZm9yIGV4YW1wbGUuIEl0J3MKLy8vIG1vcmUgZWZmaWNpZW50IHRoYW4gYSBbTGlua2VkSGFzaE1hcF0gd2l0aCBhIGN1c3RvbSBlcXVhbGl0eSBvcGVyYXRvcgovLy8gYmVjYXVzZSBpdCBvbmx5IGNhbm9uaWNhbGl6ZXMgZWFjaCBrZXkgb25jZSwgcmF0aGVyIHRoYW4gZG9pbmcgc28gZm9yIGVhY2gKLy8vIGNvbXBhcmlzb24uCi8vLwovLy8gQnkgZGVmYXVsdCwgYG51bGxgIGlzIGFsbG93ZWQgYXMgYSBrZXkuIEl0IGNhbiBiZSBmb3JiaWRkZW4gdmlhIHRoZQovLy8gYGlzVmFsaWRLZXlgIHBhcmFtZXRlci4KY2xhc3MgQ2Fub25pY2FsaXplZE1hcDxDLCBLLCBWPiBpbXBsZW1lbnRzIE1hcDxLLCBWPiB7CiAgZmluYWwgX0Nhbm9uaWNhbGl6ZTxDLCBLPiBfY2Fub25pY2FsaXplOwoKICBmaW5hbCBfSXNWYWxpZEtleSBfaXNWYWxpZEtleUZuOwoKICBmaW5hbCBfYmFzZSA9IG5ldyBNYXA8QywgUGFpcjxLLCBWPj4oKTsKCiAgLy8vIENyZWF0ZXMgYW4gZW1wdHkgY2Fub25pY2FsaXplZCBtYXAuCiAgLy8vCiAgLy8vIFRoZSBbY2Fub25pY2FsaXplXSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBjYW5vbmljYWwgdmFsdWUgZm9yIHRoZQogIC8vLyBnaXZlbiBrZXkuIEtleXMgd2l0aCB0aGUgc2FtZSBjYW5vbmljYWwgdmFsdWUgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudC4KICAvLy8KICAvLy8gVGhlIFtpc1ZhbGlkS2V5XSBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgW2Nhbm9uaWNhbGl6ZV0gZm9yCiAgLy8vIG1ldGhvZHMgdGhhdCB0YWtlIGFyYml0cmFyeSBvYmplY3RzLiBJdCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgb3V0IGtleXMKICAvLy8gdGhhdCBjYW4ndCBiZSBjYW5vbmljYWxpemVkLgogIENhbm9uaWNhbGl6ZWRNYXAoQyBjYW5vbmljYWxpemUoSyBrZXkpLCB7Ym9vbCBpc1ZhbGlkS2V5KE9iamVjdCBrZXkpfSkKICAgICAgOiBfY2Fub25pY2FsaXplID0gY2Fub25pY2FsaXplLAogICAgICAgIF9pc1ZhbGlkS2V5Rm4gPSBpc1ZhbGlkS2V5OwoKICAvLy8gQ3JlYXRlcyBhIGNhbm9uaWNhbGl6ZWQgbWFwIHRoYXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUga2V5L3ZhbHVlIHBhaXJzCiAgLy8vIG9mIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFRoZSBbY2Fub25pY2FsaXplXSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBjYW5vbmljYWwgdmFsdWUgZm9yIHRoZQogIC8vLyBnaXZlbiBrZXkuIEtleXMgd2l0aCB0aGUgc2FtZSBjYW5vbmljYWwgdmFsdWUgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudC4KICAvLy8KICAvLy8gVGhlIFtpc1ZhbGlkS2V5XSBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgW2Nhbm9uaWNhbGl6ZV0gZm9yCiAgLy8vIG1ldGhvZHMgdGhhdCB0YWtlIGFyYml0cmFyeSBvYmplY3RzLiBJdCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgb3V0IGtleXMKICAvLy8gdGhhdCBjYW4ndCBiZSBjYW5vbmljYWxpemVkLgogIENhbm9uaWNhbGl6ZWRNYXAuZnJvbShNYXA8SywgVj4gb3RoZXIsIEMgY2Fub25pY2FsaXplKEsga2V5KSwKICAgICAge2Jvb2wgaXNWYWxpZEtleShPYmplY3Qga2V5KX0pCiAgICAgIDogX2Nhbm9uaWNhbGl6ZSA9IGNhbm9uaWNhbGl6ZSwKICAgICAgICBfaXNWYWxpZEtleUZuID0gaXNWYWxpZEtleSB7CiAgICBhZGRBbGwob3RoZXIpOwogIH0KCiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KSB7CiAgICBpZiAoIV9pc1ZhbGlkS2V5KGtleSkpIHJldHVybiBudWxsOwogICAgdmFyIHBhaXIgPSBfYmFzZVtfY2Fub25pY2FsaXplKGtleSBhcyBLKV07CiAgICByZXR1cm4gcGFpciA9PSBudWxsID8gbnVsbCA6IHBhaXIubGFzdDsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBpZiAoIV9pc1ZhbGlkS2V5KGtleSkpIHJldHVybjsKICAgIF9iYXNlW19jYW5vbmljYWxpemUoa2V5KV0gPSBuZXcgUGFpcihrZXksIHZhbHVlKTsKICB9CgogIHZvaWQgYWRkQWxsKE1hcDxLLCBWPiBvdGhlcikgewogICAgb3RoZXIuZm9yRWFjaCgoa2V5LCB2YWx1ZSkgPT4gdGhpc1trZXldID0gdmFsdWUpOwogIH0KCiAgdm9pZCBhZGRFbnRyaWVzKEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBlbnRyaWVzKSA9PgogICAgICBfYmFzZS5hZGRFbnRyaWVzKGVudHJpZXMubWFwKAogICAgICAgICAgKGUpID0+IG5ldyBNYXBFbnRyeShfY2Fub25pY2FsaXplKGUua2V5KSwgbmV3IFBhaXIoZS5rZXksIGUudmFsdWUpKSkpOwoKICBNYXA8SzIsIFYyPiBjYXN0PEsyLCBWMj4oKSA9PiBfYmFzZS5jYXN0PEsyLCBWMj4oKTsKCiAgdm9pZCBjbGVhcigpIHsKICAgIF9iYXNlLmNsZWFyKCk7CiAgfQoKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKICAgIGlmICghX2lzVmFsaWRLZXkoa2V5KSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIF9iYXNlLmNvbnRhaW5zS2V5KF9jYW5vbmljYWxpemUoa2V5IGFzIEspKTsKICB9CgogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpID0+CiAgICAgIF9iYXNlLnZhbHVlcy5hbnkoKHBhaXIpID0+IHBhaXIubGFzdCA9PSB2YWx1ZSk7CgogIEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBnZXQgZW50cmllcyA9PgogICAgICBfYmFzZS5lbnRyaWVzLm1hcCgoZSkgPT4gbmV3IE1hcEVudHJ5KGUudmFsdWUuZmlyc3QsIGUudmFsdWUubGFzdCkpOwoKICB2b2lkIGZvckVhY2godm9pZCBmKEsga2V5LCBWIHZhbHVlKSkgewogICAgX2Jhc2UuZm9yRWFjaCgoa2V5LCBwYWlyKSA9PiBmKHBhaXIuZmlyc3QsIHBhaXIubGFzdCkpOwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfYmFzZS5pc0VtcHR5OwoKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9iYXNlLmlzTm90RW1wdHk7CgogIEl0ZXJhYmxlPEs+IGdldCBrZXlzID0+IF9iYXNlLnZhbHVlcy5tYXAoKHBhaXIpID0+IHBhaXIuZmlyc3QpOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfYmFzZS5sZW5ndGg7CgogIE1hcDxLMiwgVjI+IG1hcDxLMiwgVjI+KE1hcEVudHJ5PEsyLCBWMj4gdHJhbnNmb3JtKEsga2V5LCBWIHZhbHVlKSkgPT4KICAgICAgX2Jhc2UubWFwKChfLCBwYWlyKSA9PiB0cmFuc2Zvcm0ocGFpci5maXJzdCwgcGFpci5sYXN0KSk7CgogIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgaWZBYnNlbnQoKSkgewogICAgcmV0dXJuIF9iYXNlCiAgICAgICAgLnB1dElmQWJzZW50KF9jYW5vbmljYWxpemUoa2V5KSwgKCkgPT4gbmV3IFBhaXIoa2V5LCBpZkFic2VudCgpKSkKICAgICAgICAubGFzdDsKICB9CgogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIGlmICghX2lzVmFsaWRLZXkoa2V5KSkgcmV0dXJuIG51bGw7CiAgICB2YXIgcGFpciA9IF9iYXNlLnJlbW92ZShfY2Fub25pY2FsaXplKGtleSBhcyBLKSk7CiAgICByZXR1cm4gcGFpciA9PSBudWxsID8gbnVsbCA6IHBhaXIubGFzdDsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEsga2V5LCBWIHZhbHVlKSkgPT4KICAgICAgX2Jhc2UucmVtb3ZlV2hlcmUoKF8sIHBhaXIpID0+IHRlc3QocGFpci5maXJzdCwgcGFpci5sYXN0KSk7CgogIEBkZXByZWNhdGVkCiAgTWFwPEsyLCBWMj4gcmV0eXBlPEsyLCBWMj4oKSA9PiBjYXN0PEsyLCBWMj4oKTsKCiAgViB1cGRhdGUoSyBrZXksIFYgdXBkYXRlKFYgdmFsdWUpLCB7ViBpZkFic2VudCgpfSkgPT4gX2Jhc2UKICAgICAgLnVwZGF0ZShfY2Fub25pY2FsaXplKGtleSksIChwYWlyKSA9PiBuZXcgUGFpcihrZXksIHVwZGF0ZShwYWlyLmxhc3QpKSwKICAgICAgICAgIGlmQWJzZW50OiBpZkFic2VudCA9PSBudWxsID8gbnVsbCA6ICgpID0+IG5ldyBQYWlyKGtleSwgaWZBYnNlbnQoKSkpCiAgICAgIC5sYXN0OwoKICB2b2lkIHVwZGF0ZUFsbChWIHVwZGF0ZShLIGtleSwgViB2YWx1ZSkpID0+IF9iYXNlLnVwZGF0ZUFsbCgKICAgICAgKF8sIHBhaXIpID0+IG5ldyBQYWlyKHBhaXIuZmlyc3QsIHVwZGF0ZShwYWlyLmZpcnN0LCBwYWlyLmxhc3QpKSk7CgogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgPT4gX2Jhc2UudmFsdWVzLm1hcCgocGFpcikgPT4gcGFpci5sYXN0KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgLy8gRGV0ZWN0IHRvU3RyaW5nKCkgY3ljbGVzLgogICAgaWYgKF9pc1RvU3RyaW5nVmlzaXRpbmcodGhpcykpIHsKICAgICAgcmV0dXJuICd7Li4ufSc7CiAgICB9CgogICAgdmFyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHRyeSB7CiAgICAgIF90b1N0cmluZ1Zpc2l0aW5nLmFkZCh0aGlzKTsKICAgICAgcmVzdWx0LndyaXRlKCd7Jyk7CiAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgICBmb3JFYWNoKChrLCB2KSB7CiAgICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgICAgcmVzdWx0LndyaXRlKCcsICcpOwogICAgICAgIH0KICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgIHJlc3VsdC53cml0ZSgnJGs6ICR2Jyk7CiAgICAgIH0pOwogICAgICByZXN1bHQud3JpdGUoJ30nKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGFzc2VydChpZGVudGljYWwoX3RvU3RyaW5nVmlzaXRpbmcubGFzdCwgdGhpcykpOwogICAgICBfdG9TdHJpbmdWaXNpdGluZy5yZW1vdmVMYXN0KCk7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogIH0KCiAgYm9vbCBfaXNWYWxpZEtleShPYmplY3Qga2V5KSA9PgogICAgICAoa2V5ID09IG51bGwgfHwga2V5IGlzIEspICYmCiAgICAgIChfaXNWYWxpZEtleUZuID09IG51bGwgfHwgX2lzVmFsaWRLZXlGbihrZXkpKTsKfQoKLy8vIEEgY29sbGVjdGlvbiB1c2VkIHRvIGlkZW50aWZ5IGN5Y2xpYyBtYXBzIGR1cmluZyB0b1N0cmluZygpIGNhbGxzLgpmaW5hbCBMaXN0IF90b1N0cmluZ1Zpc2l0aW5nID0gW107CgovLy8gQ2hlY2sgaWYgd2UgYXJlIGN1cnJlbnRseSB2aXNpdGluZyBgb2AgaW4gYSB0b1N0cmluZygpIGNhbGwuCmJvb2wgX2lzVG9TdHJpbmdWaXNpdGluZyhvKSA9PiBfdG9TdHJpbmdWaXNpdGluZy5hbnkoKGUpID0+IGlkZW50aWNhbChvLCBlKSk7CoCuAE5OPAEaARUBJgEmAUQETUpPEARIHDcrASMBKgEqBkxPBkxNI0kmJAFPEgZMTwZMTSNAJSYlEwQBHigvLAQBJiM2BAEhNgQBNyRRATYBERMEASEpNwQBJjYBKksBKTwEASUBKwFCASIBSUABJxFKDwQBGSg2LAQBMUMBDjIBPk5PDQE/SQFDARYhJRYGASUKIxkZFxYeChcgChkQNyYGAR4EASIjNQIBRyMBQU4BLXBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvY2Fub25pY2FsaXplZF9tYXAuZGFydFRzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29sbGVjdGlvbi9saWIvc3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX2l0ZXJhYmxlLmRhcnSH2S8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgovLy8gQSB2aWV3IG9mIHNldmVyYWwgaXRlcmFibGVzIGNvbWJpbmVkIHNlcXVlbnRpYWxseSBpbnRvIGEgc2luZ2xlIGl0ZXJhYmxlLgovLy8KLy8vIEFsbCBtZXRob2RzIGFuZCBhY2Nlc3NvcnMgdHJlYXQgdGhlIFtDb21iaW5lZEl0ZXJhYmxlVmlld10gYXMgaWYgaXQgd2VyZSBhCi8vLyBzaW5nbGUgY29uY2F0ZW5hdGVkIGl0ZXJhYmxlLCBidXQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24KLy8vIGxhemlseSBhY2Nlc3NpbmcgaW5kaXZpZHVhbCBpdGVyYWJsZSBpbnN0YW5jZXMuIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGUKLy8vIHVuZGVybHlpbmcgaXRlcmFibGVzIGNoYW5nZSwgdGhlIFtDb21iaW5lZEl0ZXJhYmxlVmlld10gd2lsbCByZWZsZWN0IHRob3NlCi8vLyBjaGFuZ2VzLgpjbGFzcyBDb21iaW5lZEl0ZXJhYmxlVmlldzxUPiBleHRlbmRzIEl0ZXJhYmxlQmFzZTxUPiB7CiAgLy8vIFRoZSBpdGVyYWJsZXMgdGhhdCB0aGlzIGNvbWJpbmVzLgogIGZpbmFsIEl0ZXJhYmxlPEl0ZXJhYmxlPFQ+PiBfaXRlcmFibGVzOwoKICAvLy8gQ3JlYXRlcyBhIGNvbWJpbmVkIHZpZXcgb2YgW2l0ZXJhYmxlc10uCiAgY29uc3QgQ29tYmluZWRJdGVyYWJsZVZpZXcodGhpcy5faXRlcmFibGVzKTsKCiAgSXRlcmF0b3I8VD4gZ2V0IGl0ZXJhdG9yID0+CiAgICAgIG5ldyBfQ29tYmluZWRJdGVyYXRvcjxUPihfaXRlcmFibGVzLm1hcCgoaSkgPT4gaS5pdGVyYXRvcikuaXRlcmF0b3IpOwoKICAvLyBTcGVjaWFsIGNhc2VkIGNvbnRhaW5zL2lzRW1wdHkvbGVuZ3RoIHNpbmNlIG1hbnkgaXRlcmFibGVzIGhhdmUgYW4KICAvLyBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gaW5zdGVhZCBvZiBydW5uaW5nIHRocm91Z2ggdGhlIGVudGlyZSBpdGVyYXRvci4KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgPT4gX2l0ZXJhYmxlcy5hbnkoKGkpID0+IGkuY29udGFpbnMoZWxlbWVudCkpOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF9pdGVyYWJsZXMuZXZlcnkoKGkpID0+IGkuaXNFbXB0eSk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9pdGVyYWJsZXMuZm9sZCgwLCAobGVuZ3RoLCBpKSA9PiBsZW5ndGggKyBpLmxlbmd0aCk7Cn0KCi8vLyBUaGUgaXRlcmF0b3IgZm9yIFtDb21iaW5lZEl0ZXJhYmxlVmlld10uCi8vLwovLy8gVGhpcyBtb3ZlcyB0aHJvdWdoIGVhY2ggaXRlcmFibGUncyBpdGVyYXRvcnMgaW4gc2VxdWVuY2UuCmNsYXNzIF9Db21iaW5lZEl0ZXJhdG9yPFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4gewogIC8vLyBUaGUgaXRlcmF0b3JzIHRoYXQgdGhpcyBjb21iaW5lcy4KICAvLy8KICAvLy8gQmVjYXVzZSB0aGlzIGNvbWVzIGZyb20gYSBjYWxsIHRvIFtJdGVyYWJsZS5tYXBdLCBpdCdzIGxhenkgYW5kIHdpbGwKICAvLy8gYXZvaWQgaW5zdGFudGlhdGluZyB1bm5lY2Vzc2FyeSBpdGVyYXRvcnMuCiAgZmluYWwgSXRlcmF0b3I8SXRlcmF0b3I8VD4+IF9pdGVyYXRvcnM7CgogIF9Db21iaW5lZEl0ZXJhdG9yKHRoaXMuX2l0ZXJhdG9ycyk7CgogIFQgZ2V0IGN1cnJlbnQgPT4gX2l0ZXJhdG9ycy5jdXJyZW50Py5jdXJyZW50OwoKICBib29sIG1vdmVOZXh0KCkgewogICAgdmFyIGN1cnJlbnQgPSBfaXRlcmF0b3JzLmN1cnJlbnQ7CiAgICBpZiAoY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQubW92ZU5leHQoKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBfaXRlcmF0b3JzLm1vdmVOZXh0KCkgJiYgbW92ZU5leHQoKTsKICB9Cn0KOQBOTjwBGgFOBE9QS08NOCgqAS4vAR5MAUhOAU8BOgFKAgEtBD40KAZLMSoBJgEwARQmMRMGMAQCAT9wYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX2l0ZXJhYmxlLmRhcnRQc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9jb21iaW5lZF93cmFwcGVycy9jb21iaW5lZF9saXN0LmRhcnSHKS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgovLy8gQSB2aWV3IG9mIHNldmVyYWwgbGlzdHMgY29tYmluZWQgaW50byBhIHNpbmdsZSBsaXN0LgovLy8KLy8vIEFsbCBtZXRob2RzIGFuZCBhY2Nlc3NvcnMgdHJlYXQgdGhlIFtDb21iaW5lZExpc3RWaWV3XSBsaXN0IGFzIGlmIGl0IHdlcmUgYQovLy8gc2luZ2xlIGNvbmNhdGVuYXRlZCBsaXN0LCBidXQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24KLy8vIGxhemlseSBhY2Nlc3NpbmcgaW5kaXZpZHVhbCBsaXN0IGluc3RhbmNlcy4gVGhpcyBtZWFucyB0aGF0IGlmIHRoZQovLy8gdW5kZXJseWluZyBsaXN0cyBjaGFuZ2UsIHRoZSBbQ29tYmluZWRMaXN0Vmlld10gd2lsbCByZWZsZWN0IHRob3NlIGNoYW5nZXMuCi8vLwovLy8gVGhlIGluZGV4IG9wZXJhdG9yIChgW11gKSBhbmQgW2xlbmd0aF0gcHJvcGVydHkgb2YgYSBbQ29tYmluZWRMaXN0Vmlld10gYXJlCi8vLyBib3RoIGBPKGxpc3RzKWAgcmF0aGVyIHRoYW4gYE8oMSlgLiBBIFtDb21iaW5lZExpc3RWaWV3XSBpcyB1bm1vZGlmaWFibGUuCmNsYXNzIENvbWJpbmVkTGlzdFZpZXc8VD4gZXh0ZW5kcyBMaXN0QmFzZTxUPgogICAgaW1wbGVtZW50cyBVbm1vZGlmaWFibGVMaXN0VmlldzxUPiB7CiAgc3RhdGljIHZvaWQgX3Rocm93KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ0Nhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIExpc3QnKTsKICB9CgogIC8vLyBUaGUgbGlzdHMgdGhhdCB0aGlzIGNvbWJpbmVzLgogIGZpbmFsIExpc3Q8TGlzdDxUPj4gX2xpc3RzOwoKICAvLy8gQ3JlYXRlcyBhIGNvbWJpbmVkIHZpZXcgb2YgW2xpc3RzXS4KICBDb21iaW5lZExpc3RWaWV3KHRoaXMuX2xpc3RzKTsKCiAgc2V0IGxlbmd0aChpbnQgbGVuZ3RoKSB7CiAgICBfdGhyb3coKTsKICB9CgogIGludCBnZXQgbGVuZ3RoID0+IF9saXN0cy5mb2xkKDAsIChsZW5ndGgsIGxpc3QpID0+IGxlbmd0aCArIGxpc3QubGVuZ3RoKTsKCiAgVCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIHZhciBpbml0aWFsSW5kZXggPSBpbmRleDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX2xpc3RzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBsaXN0ID0gX2xpc3RzW2ldOwogICAgICBpZiAoaW5kZXggPCBsaXN0Lmxlbmd0aCkgewogICAgICAgIHJldHVybiBsaXN0W2luZGV4XTsKICAgICAgfQogICAgICBpbmRleCAtPSBsaXN0Lmxlbmd0aDsKICAgIH0KICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluaXRpYWxJbmRleCwgdGhpcywgJ2luZGV4JywgbnVsbCwgbGVuZ3RoKTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgVCB2YWx1ZSkgewogICAgX3Rocm93KCk7CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgX3Rocm93KCk7CiAgfQoKICBib29sIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewogICAgX3Rocm93KCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KFQgZWxlbWVudCkpIHsKICAgIF90aHJvdygpOwogIH0KCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoVCBlbGVtZW50KSkgewogICAgX3Rocm93KCk7CiAgfQp9CkQATk48ARoBOQRQTEdQBFBOLikZRgQBJB4BKiEBGw4EAUwBHR4uHCEcCBwGSwQBKg4EAREOBAEgDhEEASsOBAErDgQCATtwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX2xpc3QuZGFydDdvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29sbGVjdGlvbi9jb2xsZWN0aW9ucy5kYXJ0g6gvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbGxlY3Rpb247CgovLy8gQW4gdW5tb2RpZmlhYmxlIFtMaXN0XSB2aWV3IG9mIGFub3RoZXIgTGlzdC4KLy8vCi8vLyBUaGUgc291cmNlIG9mIHRoZSBlbGVtZW50cyBtYXkgYmUgYSBbTGlzdF0gb3IgYW55IFtJdGVyYWJsZV0gd2l0aAovLy8gZWZmaWNpZW50IFtJdGVyYWJsZS5sZW5ndGhdIGFuZCBbSXRlcmFibGUuZWxlbWVudEF0XS4KY2xhc3MgVW5tb2RpZmlhYmxlTGlzdFZpZXc8RT4gZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gX3NvdXJjZTsKCiAgLy8vIENyZWF0ZXMgYW4gdW5tb2RpZmlhYmxlIGxpc3QgYmFja2VkIGJ5IFtzb3VyY2VdLgogIC8vLwogIC8vLyBUaGUgW3NvdXJjZV0gb2YgdGhlIGVsZW1lbnRzIG1heSBiZSBhIFtMaXN0XSBvciBhbnkgW0l0ZXJhYmxlXSB3aXRoCiAgLy8vIGVmZmljaWVudCBbSXRlcmFibGUubGVuZ3RoXSBhbmQgW0l0ZXJhYmxlLmVsZW1lbnRBdF0uCiAgVW5tb2RpZmlhYmxlTGlzdFZpZXcoSXRlcmFibGU8RT4gc291cmNlKSA6IF9zb3VyY2UgPSBzb3VyY2U7CgogIExpc3Q8Uj4gY2FzdDxSPigpID0+IFVubW9kaWZpYWJsZUxpc3RWaWV3KF9zb3VyY2UuY2FzdDxSPigpKTsKICBpbnQgZ2V0IGxlbmd0aCA9PiBfc291cmNlLmxlbmd0aDsKCiAgRSBvcGVyYXRvciBbXShpbnQgaW5kZXgpID0+IF9zb3VyY2UuZWxlbWVudEF0KGluZGV4KTsKfQoaAE5OPAEZATEERjpAHQE3Bko8PwFAJAE4AgEgZGFydDpjb2xsZWN0aW9uL2NvbGxlY3Rpb25zLmRhcnRPc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9jb21iaW5lZF93cmFwcGVycy9jb21iaW5lZF9tYXAuZGFydIf7Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCmltcG9ydCAnY29tYmluZWRfaXRlcmFibGUuZGFydCc7CgovLy8gUmV0dXJucyBhIG5ldyBtYXAgdGhhdCByZXByZXNlbnRzIG1hcHMgZmxhdHRlbmVkIGludG8gYSBzaW5nbGUgbWFwLgovLy8KLy8vIEFsbCBtZXRob2RzIGFuZCBhY2Nlc3NvcnMgdHJlYXQgdGhlIG5ldyBtYXAgYXMtaWYgaXQgd2VyZSBhIHNpbmdsZQovLy8gY29uY2F0ZW5hdGVkIG1hcCwgYnV0IHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGxhemlseQovLy8gYWNjZXNzaW5nIGluZGl2aWR1YWwgbWFwIGluc3RhbmNlcy4gSW4gdGhlIG9jY2FzaW9uIHdoZXJlIGEga2V5IG9jY3VycyBpbgovLy8gbXVsdGlwbGUgbWFwcyB0aGUgZmlyc3QgdmFsdWUgaXMgcmV0dXJuZWQuCi8vLwovLy8gVGhlIHJlc3VsdGluZyBtYXAgaGFzIGFuIGluZGV4IG9wZXJhdG9yIChgW11gKSBhbmQgYGxlbmd0aGAgcHJvcGVydHkgdGhhdAovLy8gYXJlIGJvdGggYE8obWFwcylgLCByYXRoZXIgdGhhbiBgTygxKWAsIGFuZCB0aGUgbWFwIGlzIHVubW9kaWZpYWJsZSAtIGJ1dAovLy8gdW5kZXJseWluZyBjaGFuZ2VzIHRvIHRoZXNlIG1hcHMgYXJlIHN0aWxsIGFjY2Vzc2libGUgZnJvbSB0aGUgcmVzdWx0aW5nCi8vLyBtYXAuCmNsYXNzIENvbWJpbmVkTWFwVmlldzxLLCBWPiBleHRlbmRzIFVubW9kaWZpYWJsZU1hcEJhc2U8SywgVj4gewogIGZpbmFsIEl0ZXJhYmxlPE1hcDxLLCBWPj4gX21hcHM7CgogIC8vLyBDcmVhdGUgYSBuZXcgY29tYmluZWQgdmlldyBpbnRvIG11bHRpcGxlIG1hcHMuCiAgLy8vCiAgLy8vIFRoZSBpdGVyYWJsZSBpcyBhY2Nlc3NlZCBsYXppbHkgc28gaXQgc2hvdWxkIGJlIGNvbGxlY3Rpb24gdHlwZSBsaWtlCiAgLy8vIFtMaXN0XSBvciBbU2V0XSByYXRoZXIgdGhhbiBhIGxhenkgaXRlcmFibGUgcHJvZHVjZWQgYnkgYG1hcCgpYCBldCBhbC4KICBDb21iaW5lZE1hcFZpZXcodGhpcy5fbWFwcyk7CgogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgewogICAgZm9yICh2YXIgbWFwIGluIF9tYXBzKSB7CiAgICAgIC8vIEF2b2lkIHR3byBoYXNoIGxvb2t1cHMgb24gYSBwb3NpdGl2ZSBoaXQuCiAgICAgIHZhciB2YWx1ZSA9IG1hcFtrZXldOwogICAgICBpZiAodmFsdWUgIT0gbnVsbCB8fCBtYXAuY29udGFpbnNLZXkodmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBUaGUga2V5cyBvZiBbdGhpc10uCiAgLy8vCiAgLy8vIFRoZSByZXR1cm5lZCBpdGVyYWJsZSBoYXMgZWZmaWNpZW50IGBsZW5ndGhgIGFuZCBgY29udGFpbnNgIG9wZXJhdGlvbnMsCiAgLy8vIGJhc2VkIG9uIFtsZW5ndGhdIGFuZCBbY29udGFpbnNLZXldIG9mIHRoZSBpbmRpdmlkdWFsIG1hcHMuCiAgLy8vCiAgLy8vIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgZGVmaW5lZCBieSB0aGUgaW5kaXZpZHVhbCBgTWFwYCBpbXBsZW1lbnRhdGlvbnMsCiAgLy8vIGJ1dCBtdXN0IGJlIGNvbnNpc3RlbnQgYmV0d2VlbiBjaGFuZ2VzIHRvIHRoZSBtYXBzLgogIC8vLwogIC8vLyBVbmxpa2UgbW9zdCBbTWFwXSBpbXBsZW1lbnRhdGlvbnMsIG1vZGlmeWluZyBhbiBpbmRpdmlkdWFsIG1hcCB3aGlsZQogIC8vLyBpdGVyYXRpbmcgdGhlIGtleXMgd2lsbCBfc29tZXRpbWVzXyB0aHJvdy4gVGhpcyBiZWhhdmlvciBtYXkgY2hhbmdlIGluCiAgLy8vIHRoZSBmdXR1cmUuCiAgSXRlcmFibGU8Sz4gZ2V0IGtleXMgPT4gbmV3IENvbWJpbmVkSXRlcmFibGVWaWV3PEs+KF9tYXBzLm1hcCgobSkgPT4gbS5rZXlzKSk7Cn0KNgBOTjwBGgEhAUgER0tOLwROTk0JQCMBNQZLTR8BHh0zHDUWCAYRBAEaBk5CBlE6BktNElECATpwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX21hcC5kYXJ0PHNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb2xsZWN0aW9uL2xpYi9zcmMvY29tcGFyYXRvcnMuZGFydLpxLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUNCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhDQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KDQovLyBDaGFyYWN0ZXIgY29uc3RhbnRzLg0KY29uc3QgaW50IF96ZXJvID0gMHgzMDsNCmNvbnN0IGludCBfdXBwZXJDYXNlQSA9IDB4NDE7DQpjb25zdCBpbnQgX3VwcGVyQ2FzZVogPSAweDVhOw0KY29uc3QgaW50IF9sb3dlckNhc2VBID0gMHg2MTsNCmNvbnN0IGludCBfbG93ZXJDYXNlWiA9IDB4N2E7DQpjb25zdCBpbnQgX2FzY2lpQ2FzZUJpdCA9IDB4MjA7DQoNCi8vLyBDaGVja3MgaWYgc3RyaW5ncyBbYV0gYW5kIFtiXSBkaWZmZXIgb25seSBvbiB0aGUgY2FzZSBvZiBBU0NJSSBsZXR0ZXJzLg0KLy8vDQovLy8gU3RyaW5ncyBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgYW5kIHRoZSBjaGFyYWN0ZXJzIGF0DQovLy8gZWFjaCBpbmRleCBhcmUgdGhlIHNhbWUsIG9yIHRoZXkgYXJlIEFTQ0lJIGxldHRlcnMgd2hlcmUgb25lIGlzIHVwcGVyLWNhc2UNCi8vLyBhbmQgdGhlIG90aGVyIGlzIHRoZSBsb3dlci1jYXNlIHZlcnNpb24gb2YgdGhlIHNhbWUgbGV0dGVyLg0KLy8vDQovLy8gVGhlIGNvbXBhcmlzb24gZG9lcyBub3QgaWdub3JlIHRoZSBjYXNlIG9mIG5vbi1BU0NJSSBsZXR0ZXJzLCBzbw0KLy8vIGFuIHVwcGVyLWNhc2UgYWUtbGlnYXR1cmUgKMOGKSBpcyBkaWZmZXJlbnQgZnJvbQ0KLy8vIGEgbG93ZXIgY2FzZSBhZS1saWdhdHVyZSAow6YpLg0KLy8vDQovLy8gSWdub3Jpbmcgbm9uLUFTQ0lJIGxldHRlcnMgaXMgbm90IGdlbmVyYWxseSBhIGdvb2QgaWRlYSwgYnV0IGl0IG1ha2VzIHNlbnNlDQovLy8gZm9yIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHN0cmluZ3MgYXJlIGtub3duIHRvIGJlIEFTQ0lJLiBFeGFtcGxlcyBjb3VsZA0KLy8vIGJlIERhcnQgaWRlbnRpZmllcnMsIGJhc2UtNjQgb3IgaGV4IGVuY29kZWQgc3RyaW5ncywgR1VJRHMgb3Igc2ltaWxhcg0KLy8vIHN0cmluZ3Mgd2l0aCBhIGtub3duIHN0cnVjdHVyZS4NCmJvb2wgZXF1YWxzSWdub3JlQXNjaWlDYXNlKFN0cmluZyBhLCBTdHJpbmcgYikgew0KICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTsNCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7DQogICAgdmFyIGFDaGFyID0gYS5jb2RlVW5pdEF0KGkpOw0KICAgIHZhciBiQ2hhciA9IGIuY29kZVVuaXRBdChpKTsNCiAgICBpZiAoYUNoYXIgPT0gYkNoYXIpIGNvbnRpbnVlOw0KICAgIC8vIFF1aWNrLWNoZWNrIGZvciB3aGV0aGVyIHRoaXMgbWF5IGJlIGRpZmZlcmVudCBjYXNlcyBvZiB0aGUgc2FtZSBsZXR0ZXIuDQogICAgaWYgKGFDaGFyIF4gYkNoYXIgIT0gX2FzY2lpQ2FzZUJpdCkgcmV0dXJuIGZhbHNlOw0KICAgIC8vIElmIGl0J3MgcG9zc2libGUsIHRoZW4gY2hlY2sgaWYgZWl0aGVyIGNoYXJhY3RlciBpcyBhY3R1YWxseSBhbiBBU0NJSQ0KICAgIC8vIGxldHRlci4NCiAgICBpbnQgYUNoYXJMb3dlckNhc2UgPSBhQ2hhciB8IF9hc2NpaUNhc2VCaXQ7DQogICAgaWYgKF9sb3dlckNhc2VBIDw9IGFDaGFyTG93ZXJDYXNlICYmIGFDaGFyTG93ZXJDYXNlIDw9IF9sb3dlckNhc2VaKSB7DQogICAgICBjb250aW51ZTsNCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KICB9DQogIHJldHVybiB0cnVlOw0KfQ0KDQovLy8gSGFzaCBjb2RlIGZvciBhIHN0cmluZyB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggW2VxdWFsc0lnbm9yZUFzY2lpQ2FzZV0uDQovLy8NCi8vLyBUaGUgaGFzaCBjb2RlIGlzIHVuYWZmZWN0ZWQgYnkgY2hhbmdpbmcgdGhlIGNhc2Ugb2YgQVNDSUkgbGV0dGVycywgYnV0DQovLy8gdGhlIGNhc2Ugb2Ygbm9uLUFTQ0lJIGxldHRlcnMgZG8gYWZmZWN0IHRoZSByZXN1bHQuDQppbnQgaGFzaElnbm9yZUFzY2lpQ2FzZShTdHJpbmcgc3RyaW5nKSB7DQogIC8vIEplbmtpbnMgaGFzaCBjb2RlICggaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9KZW5raW5zX2hhc2hfZnVuY3Rpb24pLg0KICAvLyBhZGFwdGVkIHRvIHNtaSB2YWx1ZXMuDQogIC8vIFNhbWUgaGFzaCB1c2VkIGJ5IGRhcnQyanMgZm9yIHN0cmluZ3MsIG1vZGlmaWVkIHRvIGlnbm9yZSBBU0NJSSBsZXR0ZXINCiAgLy8gY2FzZS4NCiAgaW50IGhhc2ggPSAwOw0KICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykgew0KICAgIGludCBjaGFyID0gc3RyaW5nLmNvZGVVbml0QXQoaSk7DQogICAgLy8gQ29udmVydCBsb3dlci1jYXNlIEFTQ0lJIGxldHRlcnMgdG8gdXBwZXIgY2FzZS51cHBlcg0KICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHN0cmluZ3MgdGhhdCBkaWZmZXIgb25seSBpbiBjYXNlIHdpbGwgaGF2ZSB0aGUNCiAgICAvLyBzYW1lIGhhc2ggY29kZS4NCiAgICBpZiAoX2xvd2VyQ2FzZUEgPD0gY2hhciAmJiBjaGFyIDw9IF9sb3dlckNhc2VaKSBjaGFyIC09IF9hc2NpaUNhc2VCaXQ7DQogICAgaGFzaCA9IDB4MWZmZmZmZmYgJiAoaGFzaCArIGNoYXIpOw0KICAgIGhhc2ggPSAweDFmZmZmZmZmICYgKGhhc2ggKyAoKDB4MDAwN2ZmZmYgJiBoYXNoKSA8PCAxMCkpOw0KICAgIGhhc2ggPj49IDY7DQogIH0NCiAgaGFzaCA9IDB4MWZmZmZmZmYgJiAoaGFzaCArICgoMHgwM2ZmZmZmZiAmIGhhc2gpIDw8IDMpKTsNCiAgaGFzaCA+Pj0gMTE7DQogIHJldHVybiAweDFmZmZmZmZmICYgKGhhc2ggKyAoKDB4MDAwMDNmZmYgJiBoYXNoKSA8PCAxNSkpOw0KfQ0KDQovLy8gQ29tcGFyZXMgW2FdIGFuZCBbYl0gbGV4aWNhbGx5LCBjb252ZXJ0aW5nIEFTQ0lJIGxldHRlcnMgdG8gdXBwZXIgY2FzZS4NCi8vLw0KLy8vIENvbXBhcmlzb24gdHJlYXRzIGFsbCBsb3dlci1jYXNlIEFTQ0lJIGxldHRlcnMgYXMgdXBwZXItY2FzZSBsZXR0ZXJzLA0KLy8vIGJ1dCBkb2VzIG5vIGNhc2UgY29udmVyc2lvbiBmb3Igbm9uLUFTQ0lJIGxldHRlcnMuDQovLy8NCi8vLyBJZiB0d28gc3RyaW5ncyBkaWZmZXIgb25seSBvbiB0aGUgY2FzZSBvZiBBU0NJSSBsZXR0ZXJzLCB0aGUgb25lIHdpdGggdGhlDQovLy8gY2FwaXRhbCBsZXR0ZXIgYXQgdGhlIGZpcnN0IGRpZmZlcmVuY2Ugd2lsbCBjb21wYXJlIGFzIGxlc3MgdGhhbiB0aGUgb3RoZXINCi8vLyBzdHJpbmcuIFRoaXMgdGllLWJyZWFraW5nIGVuc3VyZXMgdGhhdCB0aGUgY29tcGFyaXNvbiBpcyBhIHRvdGFsIG9yZGVyaW5nDQovLy8gb24gc3RyaW5ncyBhbmQgaXMgY29tcGF0aWJsZSB3aXRoIGVxdWFsaXR5Lg0KLy8vDQovLy8gSWdub3Jpbmcgbm9uLUFTQ0lJIGxldHRlcnMgaXMgbm90IGdlbmVyYWxseSBhIGdvb2QgaWRlYSwgYnV0IGl0IG1ha2VzIHNlbnNlDQovLy8gZm9yIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHN0cmluZ3MgYXJlIGtub3duIHRvIGJlIEFTQ0lJLiBFeGFtcGxlcyBjb3VsZA0KLy8vIGJlIERhcnQgaWRlbnRpZmllcnMsIGJhc2UtNjQgb3IgaGV4IGVuY29kZWQgc3RyaW5ncywgR1VJRHMgb3Igc2ltaWxhcg0KLy8vIHN0cmluZ3Mgd2l0aCBhIGtub3duIHN0cnVjdHVyZS4NCmludCBjb21wYXJlQXNjaWlVcHBlckNhc2UoU3RyaW5nIGEsIFN0cmluZyBiKSB7DQogIGludCBkZWZhdWx0UmVzdWx0ID0gMDsgLy8gUmV0dXJuZWQgaWYgbm8gZGlmZmVyZW5jZSBmb3VuZC4NCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7DQogICAgaWYgKGkgPj0gYi5sZW5ndGgpIHJldHVybiAxOw0KICAgIHZhciBhQ2hhciA9IGEuY29kZVVuaXRBdChpKTsNCiAgICB2YXIgYkNoYXIgPSBiLmNvZGVVbml0QXQoaSk7DQogICAgaWYgKGFDaGFyID09IGJDaGFyKSBjb250aW51ZTsNCiAgICAvLyBVcHBlci1jYXNlIGlmIGxldHRlcnMuDQogICAgaW50IGFVcHBlckNhc2UgPSBhQ2hhcjsNCiAgICBpbnQgYlVwcGVyQ2FzZSA9IGJDaGFyOw0KICAgIGlmIChfbG93ZXJDYXNlQSA8PSBhQ2hhciAmJiBhQ2hhciA8PSBfbG93ZXJDYXNlWikgew0KICAgICAgYVVwcGVyQ2FzZSAtPSBfYXNjaWlDYXNlQml0Ow0KICAgIH0NCiAgICBpZiAoX2xvd2VyQ2FzZUEgPD0gYkNoYXIgJiYgYkNoYXIgPD0gX2xvd2VyQ2FzZVopIHsNCiAgICAgIGJVcHBlckNhc2UgLT0gX2FzY2lpQ2FzZUJpdDsNCiAgICB9DQogICAgaWYgKGFVcHBlckNhc2UgIT0gYlVwcGVyQ2FzZSkgcmV0dXJuIChhVXBwZXJDYXNlIC0gYlVwcGVyQ2FzZSkuc2lnbjsNCiAgICBpZiAoZGVmYXVsdFJlc3VsdCA9PSAwKSBkZWZhdWx0UmVzdWx0ID0gKGFDaGFyIC0gYkNoYXIpOw0KICB9DQogIGlmIChiLmxlbmd0aCA+IGEubGVuZ3RoKSByZXR1cm4gLTE7DQogIHJldHVybiBkZWZhdWx0UmVzdWx0LnNpZ247DQp9DQoNCi8vLyBDb21wYXJlcyBbYV0gYW5kIFtiXSBsZXhpY2FsbHksIGNvbnZlcnRpbmcgQVNDSUkgbGV0dGVycyB0byBsb3dlciBjYXNlLg0KLy8vDQovLy8gQ29tcGFyaXNvbiB0cmVhdHMgYWxsIHVwcGVyLWNhc2UgQVNDSUkgbGV0dGVycyBhcyBsb3dlci1jYXNlIGxldHRlcnMsDQovLy8gYnV0IGRvZXMgbm8gY2FzZSBjb252ZXJzaW9uIGZvciBub24tQVNDSUkgbGV0dGVycy4NCi8vLw0KLy8vIElmIHR3byBzdHJpbmdzIGRpZmZlciBvbmx5IG9uIHRoZSBjYXNlIG9mIEFTQ0lJIGxldHRlcnMsIHRoZSBvbmUgd2l0aCB0aGUNCi8vLyBjYXBpdGFsIGxldHRlciBhdCB0aGUgZmlyc3QgZGlmZmVyZW5jZSB3aWxsIGNvbXBhcmUgYXMgbGVzcyB0aGFuIHRoZSBvdGhlcg0KLy8vIHN0cmluZy4gVGhpcyB0aWUtYnJlYWtpbmcgZW5zdXJlcyB0aGF0IHRoZSBjb21wYXJpc29uIGlzIGEgdG90YWwgb3JkZXJpbmcNCi8vLyBvbiBzdHJpbmdzLg0KLy8vDQovLy8gSWdub3Jpbmcgbm9uLUFTQ0lJIGxldHRlcnMgaXMgbm90IGdlbmVyYWxseSBhIGdvb2QgaWRlYSwgYnV0IGl0IG1ha2VzIHNlbnNlDQovLy8gZm9yIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHN0cmluZ3MgYXJlIGtub3duIHRvIGJlIEFTQ0lJLiBFeGFtcGxlcyBjb3VsZA0KLy8vIGJlIERhcnQgaWRlbnRpZmllcnMsIGJhc2UtNjQgb3IgaGV4IGVuY29kZWQgc3RyaW5ncywgR1VJRHMgb3Igc2ltaWxhcg0KLy8vIHN0cmluZ3Mgd2l0aCBhIGtub3duIHN0cnVjdHVyZS4NCmludCBjb21wYXJlQXNjaWlMb3dlckNhc2UoU3RyaW5nIGEsIFN0cmluZyBiKSB7DQogIGludCBkZWZhdWx0UmVzdWx0ID0gMDsNCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7DQogICAgaWYgKGkgPj0gYi5sZW5ndGgpIHJldHVybiAxOw0KICAgIHZhciBhQ2hhciA9IGEuY29kZVVuaXRBdChpKTsNCiAgICB2YXIgYkNoYXIgPSBiLmNvZGVVbml0QXQoaSk7DQogICAgaWYgKGFDaGFyID09IGJDaGFyKSBjb250aW51ZTsNCiAgICBpbnQgYUxvd2VyQ2FzZSA9IGFDaGFyOw0KICAgIGludCBiTG93ZXJDYXNlID0gYkNoYXI7DQogICAgLy8gVXBwZXIgY2FzZSBpZiBBU0NJSSBsZXR0ZXJzLg0KICAgIGlmIChfdXBwZXJDYXNlQSA8PSBiQ2hhciAmJiBiQ2hhciA8PSBfdXBwZXJDYXNlWikgew0KICAgICAgYkxvd2VyQ2FzZSArPSBfYXNjaWlDYXNlQml0Ow0KICAgIH0NCiAgICBpZiAoX3VwcGVyQ2FzZUEgPD0gYUNoYXIgJiYgYUNoYXIgPD0gX3VwcGVyQ2FzZVopIHsNCiAgICAgIGFMb3dlckNhc2UgKz0gX2FzY2lpQ2FzZUJpdDsNCiAgICB9DQogICAgaWYgKGFMb3dlckNhc2UgIT0gYkxvd2VyQ2FzZSkgcmV0dXJuIChhTG93ZXJDYXNlIC0gYkxvd2VyQ2FzZSkuc2lnbjsNCiAgICBpZiAoZGVmYXVsdFJlc3VsdCA9PSAwKSBkZWZhdWx0UmVzdWx0ID0gYUNoYXIgLSBiQ2hhcjsNCiAgfQ0KICBpZiAoYi5sZW5ndGggPiBhLmxlbmd0aCkgcmV0dXJuIC0xOw0KICByZXR1cm4gZGVmYXVsdFJlc3VsdC5zaWduOw0KfQ0KDQovLy8gQ29tcGFyZXMgc3RyaW5ncyBbYV0gYW5kIFtiXSBhY2NvcmRpbmcgdG8gW25hdHVyYWwgc29ydCBvcmRlcmluZ11bXS4NCi8vLw0KLy8vIEEgbmF0dXJhbCBzb3J0IG9yZGVyaW5nIGlzIGEgbGV4aWNhbCBvcmRlcmluZyB3aGVyZSBlbWJlZGRlZA0KLy8vIG51bWVyYWxzIChkaWdpdCBzZXF1ZW5jZXMpIGFyZSB0cmVhdGVkIGFzIGEgc2luZ2xlIHVuaXQgYW5kIG9yZGVyZWQgYnkNCi8vLyBudW1lcmljYWwgdmFsdWUuDQovLy8gVGhpcyBtZWFucyB0aGF0IGAiYTEwYiJgIHdpbGwgYmUgb3JkZXJlZCBhZnRlciBgImE3YiJgIGluIG5hdHVyYWwNCi8vLyBvcmRlcmluZywgd2hlcmUgbGV4aWNhbCBvcmRlcmluZyB3b3VsZCBwdXQgdGhlIGAxYCBiZWZvcmUgdGhlIGA3YCwgaWdub3JpbmcNCi8vLyB0aGF0IHRoZSBgMWAgaXMgcGFydCBvZiBhIGxhcmdlciBudW1iZXIuDQovLy8NCi8vLyBFeGFtcGxlOg0KLy8vIFRoZSBmb2xsb3dpbmcgc3RyaW5ncyBhcmUgaW4gdGhlIG9yZGVyIHRoZXkgd291bGQgYmUgc29ydGVkIGJ5IHVzaW5nIHRoaXMNCi8vLyBjb21wYXJpc29uIGZ1bmN0aW9uOg0KLy8vDQovLy8gICAgICJhIiwgImEwIiwgImEwYiIsICJhMSIsICJhMDEiLCAiYTkiLCAiYTEwIiwgImExMDAiLCAiYTEwMGIiLCAiYWEiDQovLy8NCi8vLyBbbmF0dXJhbCBzb3J0IG9yZGVyaW5nXTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTmF0dXJhbF9zb3J0X29yZGVyDQppbnQgY29tcGFyZU5hdHVyYWwoU3RyaW5nIGEsIFN0cmluZyBiKSB7DQogIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgew0KICAgIGlmIChpID49IGIubGVuZ3RoKSByZXR1cm4gMTsNCiAgICB2YXIgYUNoYXIgPSBhLmNvZGVVbml0QXQoaSk7DQogICAgdmFyIGJDaGFyID0gYi5jb2RlVW5pdEF0KGkpOw0KICAgIGlmIChhQ2hhciAhPSBiQ2hhcikgew0KICAgICAgcmV0dXJuIF9jb21wYXJlTmF0dXJhbGx5KGEsIGIsIGksIGFDaGFyLCBiQ2hhcik7DQogICAgfQ0KICB9DQogIGlmIChiLmxlbmd0aCA+IGEubGVuZ3RoKSByZXR1cm4gLTE7DQogIHJldHVybiAwOw0KfQ0KDQovLy8gQ29tcGFyZXMgc3RyaW5ncyBbYV0gYW5kIFtiXSBhY2NvcmRpbmcgdG8gbG93ZXItY2FzZQ0KLy8vIFtuYXR1cmFsIHNvcnQgb3JkZXJpbmddW10uDQovLy8NCi8vLyBBU0NJSSBsZXR0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZSBiZWZvcmUgYmVpbmcgY29tcGFyZWQsIGxpa2UNCi8vLyBmb3IgW2NvbXBhcmVBc2NpaUxvd2VyQ2FzZV0sIHRoZW4gdGhlIHJlc3VsdCBpcyBjb21wYXJlZCBsaWtlIGZvcg0KLy8vIFtjb21wYXJlTmF0dXJhbF0uDQovLy8NCi8vLyBJZiB0d28gc3RyaW5ncyBkaWZmZXIgb25seSBvbiB0aGUgY2FzZSBvZiBBU0NJSSBsZXR0ZXJzLCB0aGUgb25lIHdpdGggdGhlDQovLy8gY2FwaXRhbCBsZXR0ZXIgYXQgdGhlIGZpcnN0IGRpZmZlcmVuY2Ugd2lsbCBjb21wYXJlIGFzIGxlc3MgdGhhbiB0aGUgb3RoZXINCi8vLyBzdHJpbmcuIFRoaXMgdGllLWJyZWFraW5nIGVuc3VyZXMgdGhhdCB0aGUgY29tcGFyaXNvbiBpcyBhIHRvdGFsIG9yZGVyaW5nDQovLy8gb24gc3RyaW5ncy4NCi8vLw0KLy8vIFtuYXR1cmFsIHNvcnQgb3JkZXJpbmddOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OYXR1cmFsX3NvcnRfb3JkZXINCmludCBjb21wYXJlQXNjaWlMb3dlckNhc2VOYXR1cmFsKFN0cmluZyBhLCBTdHJpbmcgYikgew0KICBpbnQgZGVmYXVsdFJlc3VsdCA9IDA7IC8vIFJldHVybmVkIGlmIG5vIGRpZmZlcmVuY2UgZm91bmQuDQogIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgew0KICAgIGlmIChpID49IGIubGVuZ3RoKSByZXR1cm4gMTsNCiAgICB2YXIgYUNoYXIgPSBhLmNvZGVVbml0QXQoaSk7DQogICAgdmFyIGJDaGFyID0gYi5jb2RlVW5pdEF0KGkpOw0KICAgIGlmIChhQ2hhciA9PSBiQ2hhcikgY29udGludWU7DQogICAgaW50IGFMb3dlckNhc2UgPSBhQ2hhcjsNCiAgICBpbnQgYkxvd2VyQ2FzZSA9IGJDaGFyOw0KICAgIGlmIChfdXBwZXJDYXNlQSA8PSBhQ2hhciAmJiBhQ2hhciA8PSBfdXBwZXJDYXNlWikgew0KICAgICAgYUxvd2VyQ2FzZSArPSBfYXNjaWlDYXNlQml0Ow0KICAgIH0NCiAgICBpZiAoX3VwcGVyQ2FzZUEgPD0gYkNoYXIgJiYgYkNoYXIgPD0gX3VwcGVyQ2FzZVopIHsNCiAgICAgIGJMb3dlckNhc2UgKz0gX2FzY2lpQ2FzZUJpdDsNCiAgICB9DQogICAgaWYgKGFMb3dlckNhc2UgIT0gYkxvd2VyQ2FzZSkgew0KICAgICAgcmV0dXJuIF9jb21wYXJlTmF0dXJhbGx5KGEsIGIsIGksIGFMb3dlckNhc2UsIGJMb3dlckNhc2UpOw0KICAgIH0NCiAgICBpZiAoZGVmYXVsdFJlc3VsdCA9PSAwKSBkZWZhdWx0UmVzdWx0ID0gYUNoYXIgLSBiQ2hhcjsNCiAgfQ0KICBpZiAoYi5sZW5ndGggPiBhLmxlbmd0aCkgcmV0dXJuIC0xOw0KICByZXR1cm4gZGVmYXVsdFJlc3VsdC5zaWduOw0KfQ0KDQovLy8gQ29tcGFyZXMgc3RyaW5ncyBbYV0gYW5kIFtiXSBhY2NvcmRpbmcgdG8gdXBwZXItY2FzZQ0KLy8vIFtuYXR1cmFsIHNvcnQgb3JkZXJpbmddW10uDQovLy8NCi8vLyBBU0NJSSBsZXR0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZSBiZWZvcmUgYmVpbmcgY29tcGFyZWQsIGxpa2UNCi8vLyBmb3IgW2NvbXBhcmVBc2NpaVVwcGVyQ2FzZV0sIHRoZW4gdGhlIHJlc3VsdCBpcyBjb21wYXJlZCBsaWtlIGZvcg0KLy8vIFtjb21wYXJlTmF0dXJhbF0uDQovLy8NCi8vLyBJZiB0d28gc3RyaW5ncyBkaWZmZXIgb25seSBvbiB0aGUgY2FzZSBvZiBBU0NJSSBsZXR0ZXJzLCB0aGUgb25lIHdpdGggdGhlDQovLy8gY2FwaXRhbCBsZXR0ZXIgYXQgdGhlIGZpcnN0IGRpZmZlcmVuY2Ugd2lsbCBjb21wYXJlIGFzIGxlc3MgdGhhbiB0aGUgb3RoZXINCi8vLyBzdHJpbmcuIFRoaXMgdGllLWJyZWFraW5nIGVuc3VyZXMgdGhhdCB0aGUgY29tcGFyaXNvbiBpcyBhIHRvdGFsIG9yZGVyaW5nDQovLy8gb24gc3RyaW5ncw0KLy8vDQovLy8gW25hdHVyYWwgc29ydCBvcmRlcmluZ106IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL05hdHVyYWxfc29ydF9vcmRlcg0KaW50IGNvbXBhcmVBc2NpaVVwcGVyQ2FzZU5hdHVyYWwoU3RyaW5nIGEsIFN0cmluZyBiKSB7DQogIGludCBkZWZhdWx0UmVzdWx0ID0gMDsNCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7DQogICAgaWYgKGkgPj0gYi5sZW5ndGgpIHJldHVybiAxOw0KICAgIHZhciBhQ2hhciA9IGEuY29kZVVuaXRBdChpKTsNCiAgICB2YXIgYkNoYXIgPSBiLmNvZGVVbml0QXQoaSk7DQogICAgaWYgKGFDaGFyID09IGJDaGFyKSBjb250aW51ZTsNCiAgICBpbnQgYVVwcGVyQ2FzZSA9IGFDaGFyOw0KICAgIGludCBiVXBwZXJDYXNlID0gYkNoYXI7DQogICAgaWYgKF9sb3dlckNhc2VBIDw9IGFDaGFyICYmIGFDaGFyIDw9IF9sb3dlckNhc2VaKSB7DQogICAgICBhVXBwZXJDYXNlIC09IF9hc2NpaUNhc2VCaXQ7DQogICAgfQ0KICAgIGlmIChfbG93ZXJDYXNlQSA8PSBiQ2hhciAmJiBiQ2hhciA8PSBfbG93ZXJDYXNlWikgew0KICAgICAgYlVwcGVyQ2FzZSAtPSBfYXNjaWlDYXNlQml0Ow0KICAgIH0NCiAgICBpZiAoYVVwcGVyQ2FzZSAhPSBiVXBwZXJDYXNlKSB7DQogICAgICByZXR1cm4gX2NvbXBhcmVOYXR1cmFsbHkoYSwgYiwgaSwgYVVwcGVyQ2FzZSwgYlVwcGVyQ2FzZSk7DQogICAgfQ0KICAgIGlmIChkZWZhdWx0UmVzdWx0ID09IDApIGRlZmF1bHRSZXN1bHQgPSBhQ2hhciAtIGJDaGFyOw0KICB9DQogIGlmIChiLmxlbmd0aCA+IGEubGVuZ3RoKSByZXR1cm4gLTE7DQogIHJldHVybiBkZWZhdWx0UmVzdWx0LnNpZ247DQp9DQoNCi8vLyBDaGVjayBmb3IgbnVtYmVycyBvdmVybGFwcGluZyB0aGUgY3VycmVudCBtaXNtYXRjaGVkIGNoYXJhY3RlcnMuDQovLy8NCi8vLyBJZiBib3RoIFthQ2hhcl0gYW5kIFtiQ2hhcl0gYXJlIGRpZ2l0cywgdXNlIG51bWVyaWNhbCBjb21wYXJpc29uLg0KLy8vIENoZWNrIGlmIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXJzIGlzIGEgbm9uLXplcm8gbnVtYmVyLCBhbmQgaWYgbm90LA0KLy8vIHNraXAgLSBidXQgY291bnQgLSBsZWFkaW5nIHplcm9zIGJlZm9yZSBjb21wYXJpbmcgbnVtYmVycy4NCi8vLw0KLy8vIElmIG9uZSBpcyBhIGRpZ2l0IGFuZCB0aGUgb3RoZXIgaXNuJ3QsIGNoZWNrIGlmIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXINCi8vLyBpcyBhIGRpZ2l0LCBhbmQgaWYgc28sIHRoZSB0aGUgb25lIHdpdGggdGhlIGRpZ2l0IGlzIHRoZSBncmVhdGVyIG51bWJlci4NCi8vLw0KLy8vIE90aGVyd2lzZSBqdXN0IHJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBbYUNoYXJdIGFuZCBbYkNoYXJdLg0KaW50IF9jb21wYXJlTmF0dXJhbGx5KFN0cmluZyBhLCBTdHJpbmcgYiwgaW50IGluZGV4LCBpbnQgYUNoYXIsIGludCBiQ2hhcikgew0KICBhc3NlcnQoYUNoYXIgIT0gYkNoYXIpOw0KICB2YXIgYUlzRGlnaXQgPSBfaXNEaWdpdChhQ2hhcik7DQogIHZhciBiSXNEaWdpdCA9IF9pc0RpZ2l0KGJDaGFyKTsNCiAgaWYgKGFJc0RpZ2l0KSB7DQogICAgaWYgKGJJc0RpZ2l0KSB7DQogICAgICByZXR1cm4gX2NvbXBhcmVOdW1lcmljYWxseShhLCBiLCBhQ2hhciwgYkNoYXIsIGluZGV4KTsNCiAgICB9IGVsc2UgaWYgKGluZGV4ID4gMCAmJiBfaXNEaWdpdChhLmNvZGVVbml0QXQoaW5kZXggLSAxKSkpIHsNCiAgICAgIC8vIGFDaGFyIGlzIHRoZSBjb250aW51YXRpb24gb2YgYSBsb25nZXIgbnVtYmVyLg0KICAgICAgcmV0dXJuIDE7DQogICAgfQ0KICB9IGVsc2UgaWYgKGJJc0RpZ2l0ICYmIGluZGV4ID4gMCAmJiBfaXNEaWdpdChiLmNvZGVVbml0QXQoaW5kZXggLSAxKSkpIHsNCiAgICAvLyBiQ2hhciBpcyB0aGUgY29udGludWF0aW9uIG9mIGEgbG9uZ2VyIG51bWJlci4NCiAgICByZXR1cm4gLTE7DQogIH0NCiAgLy8gQ2hhcmFjdGVycyBhcmUgYm90aCBub24tZGlnaXRzLCBvciBub3QgY29udGludWF0aW9uIG9mIGVhcmxpZXIgbnVtYmVyLg0KICByZXR1cm4gKGFDaGFyIC0gYkNoYXIpLnNpZ247DQp9DQoNCi8vLyBDb21wYXJlIG51bWJlcnMgb3ZlcmxhcHBpbmcgW2FDaGFyXSBhbmQgW2JDaGFyXSBudW1lcmljYWxseS4NCi8vLw0KLy8vIElmIHRoZSBudW1iZXJzIGhhdmUgdGhlIHNhbWUgbnVtZXJpY2FsIHZhbHVlLCBidXQgb25lIGhhcyBtb3JlIGxlYWRpbmcNCi8vLyB6ZXJvcywgdGhlIGxvbmdlciBudW1iZXIgaXMgY29uc2lkZXJlZCBncmVhdGVyIHRoYW4gdGhlIHNob3J0ZXIgb25lLg0KLy8vDQovLy8gVGhpcyBlbnN1cmVzIGEgdG90YWwgb3JkZXJpbmcgb24gc3RyaW5ncyBjb21wYXRpYmxlIHdpdGggZXF1YWxpdHkuDQppbnQgX2NvbXBhcmVOdW1lcmljYWxseShTdHJpbmcgYSwgU3RyaW5nIGIsIGludCBhQ2hhciwgaW50IGJDaGFyLCBpbnQgaW5kZXgpIHsNCiAgLy8gQm90aCBhcmUgZGlnaXRzLiBGaW5kIHRoZSBmaXJzdCBzaWduaWZpY2FudCBkaWZmZXJlbnQgZGlnaXQsIHRoZW4gZmluZA0KICAvLyB0aGUgbGVuZ3RoIG9mIHRoZSBudW1iZXJzLg0KICBpZiAoX2lzTm9uWmVyb051bWJlclN1ZmZpeChhLCBpbmRleCkpIHsNCiAgICAvLyBQYXJ0IG9mIGEgbG9uZ2VyIG51bWJlciwgZGlmZmVycyBhdCB0aGlzIGluZGV4LCBqdXN0IGNvdW50IHRoZSBsZW5ndGguDQogICAgaW50IHJlc3VsdCA9IF9jb21wYXJlRGlnaXRDb3VudChhLCBiLCBpbmRleCwgaW5kZXgpOw0KICAgIGlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIHJlc3VsdDsNCiAgICAvLyBJZiBzYW1lIGxlbmd0aCwgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIHRoZSBtb3N0IHNpZ25pZmljYW50IGRpZmZlcmluZw0KICAgIC8vIGRpZ2l0Lg0KICAgIHJldHVybiAoYUNoYXIgLSBiQ2hhcikuc2lnbjsNCiAgfQ0KICAvLyBOb3QgcGFydCBvZiBsYXJnZXIgKG5vbi16ZXJvKSBudW1iZXIsIHNvIHNraXAgbGVhZGluZyB6ZXJvcyBiZWZvcmUNCiAgLy8gY29tcGFyaW5nIG51bWJlcnMuDQogIGludCBhSW5kZXggPSBpbmRleDsNCiAgaW50IGJJbmRleCA9IGluZGV4Ow0KICBpZiAoYUNoYXIgPT0gX3plcm8pIHsNCiAgICBkbyB7DQogICAgICBhSW5kZXgrKzsNCiAgICAgIGlmIChhSW5kZXggPT0gYS5sZW5ndGgpIHJldHVybiAtMTsgLy8gbnVtYmVyIGluIGEgaXMgemVybywgYiBpcyBub3QuDQogICAgICBhQ2hhciA9IGEuY29kZVVuaXRBdChhSW5kZXgpOw0KICAgIH0gd2hpbGUgKGFDaGFyID09IF96ZXJvKTsNCiAgICBpZiAoIV9pc0RpZ2l0KGFDaGFyKSkgcmV0dXJuIC0xOw0KICB9IGVsc2UgaWYgKGJDaGFyID09IF96ZXJvKSB7DQogICAgZG8gew0KICAgICAgYkluZGV4Kys7DQogICAgICBpZiAoYkluZGV4ID09IGIubGVuZ3RoKSByZXR1cm4gMTsgLy8gbnVtYmVyIGluIGIgaXMgemVybywgYSBpcyBub3QuDQogICAgICBiQ2hhciA9IGIuY29kZVVuaXRBdChiSW5kZXgpOw0KICAgIH0gd2hpbGUgKGJDaGFyID09IF96ZXJvKTsNCiAgICBpZiAoIV9pc0RpZ2l0KGJDaGFyKSkgcmV0dXJuIDE7DQogIH0NCiAgaWYgKGFDaGFyICE9IGJDaGFyKSB7DQogICAgaW50IHJlc3VsdCA9IF9jb21wYXJlRGlnaXRDb3VudChhLCBiLCBhSW5kZXgsIGJJbmRleCk7DQogICAgaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gcmVzdWx0Ow0KICAgIHJldHVybiAoYUNoYXIgLSBiQ2hhcikuc2lnbjsNCiAgfQ0KICAvLyBTYW1lIGxlYWRpbmcgZGlnaXQsIG9uZSBoYWQgbW9yZSBsZWFkaW5nIHplcm9zLg0KICAvLyBDb21wYXJlIGRpZ2l0cyB1bnRpbCByZWFjaGluZyBhIGRpZmZlcmVuY2UuDQogIHdoaWxlICh0cnVlKSB7DQogICAgdmFyIGFJc0RpZ2l0ID0gZmFsc2U7DQogICAgdmFyIGJJc0RpZ2l0ID0gZmFsc2U7DQogICAgYUNoYXIgPSAwOw0KICAgIGJDaGFyID0gMDsNCiAgICBpZiAoKythSW5kZXggPCBhLmxlbmd0aCkgew0KICAgICAgYUNoYXIgPSBhLmNvZGVVbml0QXQoYUluZGV4KTsNCiAgICAgIGFJc0RpZ2l0ID0gX2lzRGlnaXQoYUNoYXIpOw0KICAgIH0NCiAgICBpZiAoKytiSW5kZXggPCBiLmxlbmd0aCkgew0KICAgICAgYkNoYXIgPSBiLmNvZGVVbml0QXQoYkluZGV4KTsNCiAgICAgIGJJc0RpZ2l0ID0gX2lzRGlnaXQoYkNoYXIpOw0KICAgIH0NCiAgICBpZiAoYUlzRGlnaXQpIHsNCiAgICAgIGlmIChiSXNEaWdpdCkgew0KICAgICAgICBpZiAoYUNoYXIgPT0gYkNoYXIpIGNvbnRpbnVlOw0KICAgICAgICAvLyBGaXJzdCBkaWZmZXJlbnQgZGlnaXQgZm91bmQuDQogICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgICAgLy8gYkNoYXIgaXMgbm9uLWRpZ2l0LCBzbyBhIGhhcyBsb25nZXIgbnVtYmVyLg0KICAgICAgcmV0dXJuIDE7DQogICAgfSBlbHNlIGlmIChiSXNEaWdpdCkgew0KICAgICAgcmV0dXJuIC0xOyAvLyBiIGhhcyBsb25nZXIgbnVtYmVyLg0KICAgIH0gZWxzZSB7DQogICAgICAvLyBOZWl0aGVyIGlzIGRpZ2l0LCBzbyBudW1iZXJzIGhhZCBzYW1lIG51bWVyaWNhbCB2YWx1ZS4NCiAgICAgIC8vIEZhbGwgYmFjayBvbiBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcw0KICAgICAgLy8gKHJlZmxlY3RlZCBieSBkaWZmZXJlbmNlIGluIGluZGljZXMpLg0KICAgICAgcmV0dXJuIChhSW5kZXggLSBiSW5kZXgpLnNpZ247DQogICAgfQ0KICB9DQogIC8vIEF0IGZpcnN0IGRpZmZlcmluZyBkaWdpdHMuDQogIGludCByZXN1bHQgPSBfY29tcGFyZURpZ2l0Q291bnQoYSwgYiwgYUluZGV4LCBiSW5kZXgpOw0KICBpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7DQogIHJldHVybiAoYUNoYXIgLSBiQ2hhcikuc2lnbjsNCn0NCg0KLy8vIENoZWNrcyB3aGljaCBvZiBbYV0gYW5kIFtiXSBoYXMgdGhlIGxvbmdlc3Qgc2VxdWVuY2Ugb2YgZGlnaXRzLg0KLy8vDQovLy8gU3RhcnRzIGNvdW50aW5nIGZyb20gYGkgKyAxYCBhbmQgYGogKyAxYCAoYXNzdW1lcyB0aGF0IGBhW2ldYCBhbmQgYGJbal1gIGFyZQ0KLy8vIGJvdGggYWxyZWFkeSBrbm93biB0byBiZSBkaWdpdHMpLg0KaW50IF9jb21wYXJlRGlnaXRDb3VudChTdHJpbmcgYSwgU3RyaW5nIGIsIGludCBpLCBpbnQgaikgew0KICB3aGlsZSAoKytpIDwgYS5sZW5ndGgpIHsNCiAgICBib29sIGFJc0RpZ2l0ID0gX2lzRGlnaXQoYS5jb2RlVW5pdEF0KGkpKTsNCiAgICBpZiAoKytqID09IGIubGVuZ3RoKSByZXR1cm4gYUlzRGlnaXQgPyAxIDogMDsNCiAgICBib29sIGJJc0RpZ2l0ID0gX2lzRGlnaXQoYi5jb2RlVW5pdEF0KGopKTsNCiAgICBpZiAoYUlzRGlnaXQpIHsNCiAgICAgIGlmIChiSXNEaWdpdCkgY29udGludWU7DQogICAgICByZXR1cm4gMTsNCiAgICB9IGVsc2UgaWYgKGJJc0RpZ2l0KSB7DQogICAgICByZXR1cm4gLTE7DQogICAgfSBlbHNlIHsNCiAgICAgIHJldHVybiAwOw0KICAgIH0NCiAgfQ0KICBpZiAoKytqIDwgYi5sZW5ndGggJiYgX2lzRGlnaXQoYi5jb2RlVW5pdEF0KGopKSkgew0KICAgIHJldHVybiAtMTsNCiAgfQ0KICByZXR1cm4gMDsNCn0NCg0KYm9vbCBfaXNEaWdpdChpbnQgY2hhckNvZGUpID0+IChjaGFyQ29kZSBeIF96ZXJvKSA8PSA5Ow0KDQovLy8gQ2hlY2sgaWYgdGhlIGRpZ2l0IGF0IFtpbmRleF0gaXMgY29udGludWluZyBhIG5vbi16ZXJvIG51bWJlci4NCi8vLw0KLy8vIElmIHRoZXJlIGlzIG5vIG5vbi16ZXJvIGRpZ2l0cyBiZWZvcmUsIHRoZW4gbGVhZGluZyB6ZXJvcyBhdCBbaW5kZXhdDQovLy8gYXJlIGFsc28gaWdub3JlZCB3aGVuIGNvbXBhcmluZyBudW1lcmljYWxseS4gSWYgdGhlcmUgaXMgYSBub24temVybyBkaWdpdA0KLy8vIGJlZm9yZSwgdGhlbiB6ZXJvcyBhdCBbaW5kZXhdIGFyZSBzaWduaWZpY2FudC4NCmJvb2wgX2lzTm9uWmVyb051bWJlclN1ZmZpeChTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXgpIHsNCiAgd2hpbGUgKC0taW5kZXggPj0gMCkgew0KICAgIGludCBjaGFyID0gc3RyaW5nLmNvZGVVbml0QXQoaW5kZXgpOw0KICAgIGlmIChjaGFyICE9IF96ZXJvKSByZXR1cm4gX2lzRGlnaXQoY2hhcik7DQogIH0NCiAgcmV0dXJuIGZhbHNlOw0KfQ0KgYsAT089AhkZHx8fHyECTQVLUEEFRjUjBVFMSyUyKygiIiNQN04QMUsRBxMFEAMCTgVMOSpPHU0MES0mPUkYTCg/EQU8ED0DAk0FSzgFT1BPMQVRTEslMT4oIiIiIx8dHTkkBzkkB0o+BSceAwJNBUs4BU9QTxEFUUxLJTEaKCIiIiMdHSU5JAc5JAdKPAUnHgMCSgVCTBZHUS4FDk8aBUsFTyooIiIiGzgHBScNAwI6IAVLRxcFT1BPEQVPOD4oIiIiIx0dOSQHOSQHJUIHPAUnHgMCOiAFS0cXBU9QTxAFTzgaKCIiIiMdHTkkBzkkByVCBzwFJx4DAkYFR0hABUxOBUhOGyMjExU+QjgRB0w2EAVNIAMCQgVMSgVIUE0hK086JVAPIgVJGRcXGQoRTCUfJiAKEUslHyUFGTwlIgU2MhIbGxAQICUjByAlIwcVFycpEAk2ERwqDkEvMCYHBSE6IyADAkUFUic8HDAzMBUfERwSDhEHBTYQBQ0DAjkCRAVKTzQ5GiovBREDASdwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2NvbXBhcmF0b3JzLmRhcnQ5c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9lcXVhbGl0eS5kYXJ0u/MvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICJkYXJ0OmNvbGxlY3Rpb24iOwoKaW1wb3J0ICJjb21wYXJhdG9ycy5kYXJ0IjsKCmNvbnN0IGludCBfSEFTSF9NQVNLID0gMHg3ZmZmZmZmZjsKCi8vLyBBIGdlbmVyaWMgZXF1YWxpdHkgcmVsYXRpb24gb24gb2JqZWN0cy4KYWJzdHJhY3QgY2xhc3MgRXF1YWxpdHk8RT4gewogIGNvbnN0IGZhY3RvcnkgRXF1YWxpdHkoKSA9IERlZmF1bHRFcXVhbGl0eTxFPjsKCiAgLy8vIENvbXBhcmUgdHdvIGVsZW1lbnRzIGZvciBiZWluZyBlcXVhbC4KICAvLy8KICAvLy8gVGhpcyBzaG91bGQgYmUgYSBwcm9wZXIgZXF1YWxpdHkgcmVsYXRpb24uCiAgYm9vbCBlcXVhbHMoRSBlMSwgRSBlMik7CgogIC8vLyBHZXQgYSBoYXNoY29kZSBvZiBhbiBlbGVtZW50LgogIC8vLwogIC8vLyBUaGUgaGFzaGNvZGUgc2hvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBbZXF1YWxzXSwgc28gdGhhdCBpZgogIC8vLyBgZXF1YWxzKGEsIGIpYCB0aGVuIGBoYXNoKGEpID09IGhhc2goYilgLgogIGludCBoYXNoKEUgZSk7CgogIC8vLyBUZXN0IHdoZXRoZXIgYW4gb2JqZWN0IGlzIGEgdmFsaWQgYXJndW1lbnQgdG8gW2VxdWFsc10gYW5kIFtoYXNoXS4KICAvLy8KICAvLy8gU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IGJlIHJlc3RyaWN0ZWQgdG8gb25seSB3b3JrIG9uIHNwZWNpZmljIHR5cGVzCiAgLy8vIG9mIG9iamVjdHMuCiAgYm9vbCBpc1ZhbGlkS2V5KE9iamVjdCBvKTsKfQoKdHlwZWRlZiBGIF9HZXRLZXk8RSwgRj4oRSBvYmplY3QpOwoKLy8vIEVxdWFsaXR5IG9mIG9iamVjdHMgYmFzZWQgb24gZGVyaXZlZCB2YWx1ZXMuCi8vLwovLy8gRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBjbGFzczoKLy8vIGBgYGRhcnQKLy8vIGFic3RyYWN0IGNsYXNzIEVtcGxveWVlIHsKLy8vICAgaW50IGdldCBlbXBsb3ltZW50SWQ7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBUaGUgZm9sbG93aW5nIFtFcXVhbGl0eV0gY29uc2lkZXJzIGVtcGxveWVlcyB3aXRoIHRoZSBzYW1lIElEcyB0byBiZSBlcXVhbDoKLy8vIGBgYGRhcnQKLy8vIG5ldyBFcXVhbGl0eUJ5KChFbXBsb3llZSBlKSA9PiBlLmVtcGxveW1lbnRJZCk7Ci8vLyBgYGAKLy8vCi8vLyBJdCdzIGFsc28gcG9zc2libGUgdG8gcGFzcyBhbiBhZGRpdGlvbmFsIGVxdWFsaXR5IGluc3RhbmNlIHRoYXQgc2hvdWxkIGJlCi8vLyB1c2VkIHRvIGNvbXBhcmUgdGhlIHZhbHVlIGl0c2VsZi4KY2xhc3MgRXF1YWxpdHlCeTxFLCBGPiBpbXBsZW1lbnRzIEVxdWFsaXR5PEU+IHsKICAvLyBSZXR1cm5zIGEgZGVyaXZlZCB2YWx1ZSBGIGZyb20gYW4gb2JqZWN0IEUuCiAgZmluYWwgX0dldEtleTxFLCBGPiBfZ2V0S2V5OwoKICAvLyBEZXRlcm1pbmVzIGVxdWFsaXR5IGJldHdlZW4gdHdvIHZhbHVlcyBvZiBGLgogIGZpbmFsIEVxdWFsaXR5PEY+IF9pbm5lcjsKCiAgRXF1YWxpdHlCeShGIGdldEtleShFIG9iamVjdCksIFtFcXVhbGl0eTxGPiBpbm5lciA9IGNvbnN0IERlZmF1bHRFcXVhbGl0eSgpXSkKICAgICAgOiBfZ2V0S2V5ID0gZ2V0S2V5LAogICAgICAgIF9pbm5lciA9IGlubmVyOwoKICBib29sIGVxdWFscyhFIGUxLCBFIGUyKSA9PiBfaW5uZXIuZXF1YWxzKF9nZXRLZXkoZTEpLCBfZ2V0S2V5KGUyKSk7CgogIGludCBoYXNoKEUgZSkgPT4gX2lubmVyLmhhc2goX2dldEtleShlKSk7CgogIGJvb2wgaXNWYWxpZEtleShPYmplY3QgbykgewogICAgaWYgKG8gaXMgRSkgewogICAgICBmaW5hbCB2YWx1ZSA9IF9nZXRLZXkobyk7CiAgICAgIHJldHVybiB2YWx1ZSBpcyBGICYmIF9pbm5lci5pc1ZhbGlkS2V5KHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9Cn0KCi8vLyBFcXVhbGl0eSBvZiBvYmplY3RzIHRoYXQgY29tcGFyZXMgb25seSB0aGUgbmF0dXJhbCBlcXVhbGl0eSBvZiB0aGUgb2JqZWN0cy4KLy8vCi8vLyBUaGlzIGVxdWFsaXR5IHVzZXMgdGhlIG9iamVjdHMnIG93biBbT2JqZWN0Lj09XSBhbmQgW09iamVjdC5oYXNoQ29kZV0gZm9yCi8vLyB0aGUgZXF1YWxpdHkuCi8vLwovLy8gTm90ZSB0aGF0IFtlcXVhbHNdIGFuZCBbaGFzaF0gdGFrZSBgT2JqZWN0YHMgcmF0aGVyIHRoYW4gYEVgcy4gVGhpcyBhbGxvd3MKLy8vIGBFYCB0byBiZSBpbmZlcnJlZCBhcyBgTnVsbGAgaW4gY29uc3QgY29udGV4dHMgd2hlcmUgYEVgIHdvdWxkbid0IGJlIGEKLy8vIGNvbXBpbGUtdGltZSBjb25zdGFudCwgd2hpbGUgc3RpbGwgYWxsb3dpbmcgdGhlIGNsYXNzIHRvIGJlIHVzZWQgYXQgcnVudGltZS4KY2xhc3MgRGVmYXVsdEVxdWFsaXR5PEU+IGltcGxlbWVudHMgRXF1YWxpdHk8RT4gewogIGNvbnN0IERlZmF1bHRFcXVhbGl0eSgpOwogIGJvb2wgZXF1YWxzKE9iamVjdCBlMSwgT2JqZWN0IGUyKSA9PiBlMSA9PSBlMjsKICBpbnQgaGFzaChPYmplY3QgZSkgPT4gZS5oYXNoQ29kZTsKICBib29sIGlzVmFsaWRLZXkoT2JqZWN0IG8pID0+IHRydWU7Cn0KCi8vLyBFcXVhbGl0eSBvZiBvYmplY3RzIHRoYXQgY29tcGFyZXMgb25seSB0aGUgaWRlbnRpdHkgb2YgdGhlIG9iamVjdHMuCmNsYXNzIElkZW50aXR5RXF1YWxpdHk8RT4gaW1wbGVtZW50cyBFcXVhbGl0eTxFPiB7CiAgY29uc3QgSWRlbnRpdHlFcXVhbGl0eSgpOwogIGJvb2wgZXF1YWxzKEUgZTEsIEUgZTIpID0+IGlkZW50aWNhbChlMSwgZTIpOwogIGludCBoYXNoKEUgZSkgPT4gaWRlbnRpdHlIYXNoQ29kZShlKTsKICBib29sIGlzVmFsaWRLZXkoT2JqZWN0IG8pID0+IHRydWU7Cn0KCi8vLyBFcXVhbGl0eSBvbiBpdGVyYWJsZXMuCi8vLwovLy8gVHdvIGl0ZXJhYmxlcyBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLgovLy8KLy8vIFRoZSBbZXF1YWxzXSBhbmQgW2hhc2hdIG1ldGhvZHMgYWNjZXB0cyBgbnVsbGAgdmFsdWVzLAovLy8gZXZlbiBpZiB0aGUgW2lzVmFsaWRLZXldIHJldHVybnMgYGZhbHNlYCBmb3IgYG51bGxgLgovLy8gVGhlIFtoYXNoXSBvZiBgbnVsbGAgaXMgYG51bGwuaGFzaENvZGVgLgpjbGFzcyBJdGVyYWJsZUVxdWFsaXR5PEU+IGltcGxlbWVudHMgRXF1YWxpdHk8SXRlcmFibGU8RT4+IHsKICBmaW5hbCBFcXVhbGl0eTxFPiBfZWxlbWVudEVxdWFsaXR5OwogIGNvbnN0IEl0ZXJhYmxlRXF1YWxpdHkoCiAgICAgIFtFcXVhbGl0eTxFPiBlbGVtZW50RXF1YWxpdHkgPSBjb25zdCBEZWZhdWx0RXF1YWxpdHkoKV0pCiAgICAgIDogX2VsZW1lbnRFcXVhbGl0eSA9IGVsZW1lbnRFcXVhbGl0eTsKCiAgYm9vbCBlcXVhbHMoSXRlcmFibGU8RT4gZWxlbWVudHMxLCBJdGVyYWJsZTxFPiBlbGVtZW50czIpIHsKICAgIGlmIChpZGVudGljYWwoZWxlbWVudHMxLCBlbGVtZW50czIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChlbGVtZW50czEgPT0gbnVsbCB8fCBlbGVtZW50czIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgdmFyIGl0MSA9IGVsZW1lbnRzMS5pdGVyYXRvcjsKICAgIHZhciBpdDIgPSBlbGVtZW50czIuaXRlcmF0b3I7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBib29sIGhhc05leHQgPSBpdDEubW92ZU5leHQoKTsKICAgICAgaWYgKGhhc05leHQgIT0gaXQyLm1vdmVOZXh0KCkpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKCFoYXNOZXh0KSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKCFfZWxlbWVudEVxdWFsaXR5LmVxdWFscyhpdDEuY3VycmVudCwgaXQyLmN1cnJlbnQpKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBpbnQgaGFzaChJdGVyYWJsZTxFPiBlbGVtZW50cykgewogICAgaWYgKGVsZW1lbnRzID09IG51bGwpIHJldHVybiBudWxsLmhhc2hDb2RlOwogICAgLy8gSmVua2lucydzIG9uZS1hdC1hLXRpbWUgaGFzaCBmdW5jdGlvbi4KICAgIGludCBoYXNoID0gMDsKICAgIGZvciAoRSBlbGVtZW50IGluIGVsZW1lbnRzKSB7CiAgICAgIGludCBjID0gX2VsZW1lbnRFcXVhbGl0eS5oYXNoKGVsZW1lbnQpOwogICAgICBoYXNoID0gKGhhc2ggKyBjKSAmIF9IQVNIX01BU0s7CiAgICAgIGhhc2ggPSAoaGFzaCArIChoYXNoIDw8IDEwKSkgJiBfSEFTSF9NQVNLOwogICAgICBoYXNoIF49IChoYXNoID4+IDYpOwogICAgfQogICAgaGFzaCA9IChoYXNoICsgKGhhc2ggPDwgMykpICYgX0hBU0hfTUFTSzsKICAgIGhhc2ggXj0gKGhhc2ggPj4gMTEpOwogICAgaGFzaCA9IChoYXNoICsgKGhhc2ggPDwgMTUpKSAmIF9IQVNIX01BU0s7CiAgICByZXR1cm4gaGFzaDsKICB9CgogIGJvb2wgaXNWYWxpZEtleShPYmplY3QgbykgPT4gbyBpcyBJdGVyYWJsZTxFPjsKfQoKLy8vIEVxdWFsaXR5IG9uIGxpc3RzLgovLy8KLy8vIFR3byBsaXN0cyBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhbmQgdGhlaXIgZWxlbWVudHMKLy8vIGF0IGVhY2ggaW5kZXggYXJlIGVxdWFsLgovLy8KLy8vIFRoaXMgaXMgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgW0l0ZXJhYmxlRXF1YWxpdHldIGV4Y2VwdCB0aGF0IGl0Ci8vLyBhY2Nlc3NlcyBlbGVtZW50cyBieSBpbmRleCBpbnN0ZWFkIG9mIHRocm91Z2ggaXRlcmF0aW9uLgovLy8KLy8vIFRoZSBbZXF1YWxzXSBhbmQgW2hhc2hdIG1ldGhvZHMgYWNjZXB0cyBgbnVsbGAgdmFsdWVzLAovLy8gZXZlbiBpZiB0aGUgW2lzVmFsaWRLZXldIHJldHVybnMgYGZhbHNlYCBmb3IgYG51bGxgLgovLy8gVGhlIFtoYXNoXSBvZiBgbnVsbGAgaXMgYG51bGwuaGFzaENvZGVgLgpjbGFzcyBMaXN0RXF1YWxpdHk8RT4gaW1wbGVtZW50cyBFcXVhbGl0eTxMaXN0PEU+PiB7CiAgZmluYWwgRXF1YWxpdHk8RT4gX2VsZW1lbnRFcXVhbGl0eTsKICBjb25zdCBMaXN0RXF1YWxpdHkoW0VxdWFsaXR5PEU+IGVsZW1lbnRFcXVhbGl0eSA9IGNvbnN0IERlZmF1bHRFcXVhbGl0eSgpXSkKICAgICAgOiBfZWxlbWVudEVxdWFsaXR5ID0gZWxlbWVudEVxdWFsaXR5OwoKICBib29sIGVxdWFscyhMaXN0PEU+IGxpc3QxLCBMaXN0PEU+IGxpc3QyKSB7CiAgICBpZiAoaWRlbnRpY2FsKGxpc3QxLCBsaXN0MikpIHJldHVybiB0cnVlOwogICAgaWYgKGxpc3QxID09IG51bGwgfHwgbGlzdDIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgaW50IGxlbmd0aCA9IGxpc3QxLmxlbmd0aDsKICAgIGlmIChsZW5ndGggIT0gbGlzdDIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICghX2VsZW1lbnRFcXVhbGl0eS5lcXVhbHMobGlzdDFbaV0sIGxpc3QyW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBpbnQgaGFzaChMaXN0PEU+IGxpc3QpIHsKICAgIGlmIChsaXN0ID09IG51bGwpIHJldHVybiBudWxsLmhhc2hDb2RlOwogICAgLy8gSmVua2lucydzIG9uZS1hdC1hLXRpbWUgaGFzaCBmdW5jdGlvbi4KICAgIC8vIFRoaXMgY29kZSBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSBvbmUgaW4gSXRlcmFibGVFcXVhbGl0eSwgZXhjZXB0CiAgICAvLyB0aGF0IGl0IHVzZXMgaW5kZXhpbmcgaW5zdGVhZCBvZiBpdGVyYXRpbmcgdG8gZ2V0IHRoZSBlbGVtZW50cy4KICAgIGludCBoYXNoID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICBpbnQgYyA9IF9lbGVtZW50RXF1YWxpdHkuaGFzaChsaXN0W2ldKTsKICAgICAgaGFzaCA9IChoYXNoICsgYykgJiBfSEFTSF9NQVNLOwogICAgICBoYXNoID0gKGhhc2ggKyAoaGFzaCA8PCAxMCkpICYgX0hBU0hfTUFTSzsKICAgICAgaGFzaCBePSAoaGFzaCA+PiA2KTsKICAgIH0KICAgIGhhc2ggPSAoaGFzaCArIChoYXNoIDw8IDMpKSAmIF9IQVNIX01BU0s7CiAgICBoYXNoIF49IChoYXNoID4+IDExKTsKICAgIGhhc2ggPSAoaGFzaCArIChoYXNoIDw8IDE1KSkgJiBfSEFTSF9NQVNLOwogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBib29sIGlzVmFsaWRLZXkoT2JqZWN0IG8pID0+IG8gaXMgTGlzdDxFPjsKfQoKYWJzdHJhY3QgY2xhc3MgX1Vub3JkZXJlZEVxdWFsaXR5PEUsIFQgZXh0ZW5kcyBJdGVyYWJsZTxFPj4KICAgIGltcGxlbWVudHMgRXF1YWxpdHk8VD4gewogIGZpbmFsIEVxdWFsaXR5PEU+IF9lbGVtZW50RXF1YWxpdHk7CgogIGNvbnN0IF9Vbm9yZGVyZWRFcXVhbGl0eSh0aGlzLl9lbGVtZW50RXF1YWxpdHkpOwoKICBib29sIGVxdWFscyhUIGVsZW1lbnRzMSwgVCBlbGVtZW50czIpIHsKICAgIGlmIChpZGVudGljYWwoZWxlbWVudHMxLCBlbGVtZW50czIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChlbGVtZW50czEgPT0gbnVsbCB8fCBlbGVtZW50czIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgSGFzaE1hcDxFLCBpbnQ+IGNvdW50cyA9IG5ldyBIYXNoTWFwKAogICAgICAgIGVxdWFsczogX2VsZW1lbnRFcXVhbGl0eS5lcXVhbHMsCiAgICAgICAgaGFzaENvZGU6IF9lbGVtZW50RXF1YWxpdHkuaGFzaCwKICAgICAgICBpc1ZhbGlkS2V5OiBfZWxlbWVudEVxdWFsaXR5LmlzVmFsaWRLZXkpOwogICAgaW50IGxlbmd0aCA9IDA7CiAgICBmb3IgKHZhciBlIGluIGVsZW1lbnRzMSkgewogICAgICBpbnQgY291bnQgPSBjb3VudHNbZV07CiAgICAgIGlmIChjb3VudCA9PSBudWxsKSBjb3VudCA9IDA7CiAgICAgIGNvdW50c1tlXSA9IGNvdW50ICsgMTsKICAgICAgbGVuZ3RoKys7CiAgICB9CiAgICBmb3IgKHZhciBlIGluIGVsZW1lbnRzMikgewogICAgICBpbnQgY291bnQgPSBjb3VudHNbZV07CiAgICAgIGlmIChjb3VudCA9PSBudWxsIHx8IGNvdW50ID09IDApIHJldHVybiBmYWxzZTsKICAgICAgY291bnRzW2VdID0gY291bnQgLSAxOwogICAgICBsZW5ndGgtLTsKICAgIH0KICAgIHJldHVybiBsZW5ndGggPT0gMDsKICB9CgogIGludCBoYXNoKFQgZWxlbWVudHMpIHsKICAgIGlmIChlbGVtZW50cyA9PSBudWxsKSByZXR1cm4gbnVsbC5oYXNoQ29kZTsKICAgIGludCBoYXNoID0gMDsKICAgIGZvciAoRSBlbGVtZW50IGluIGVsZW1lbnRzKSB7CiAgICAgIGludCBjID0gX2VsZW1lbnRFcXVhbGl0eS5oYXNoKGVsZW1lbnQpOwogICAgICBoYXNoID0gKGhhc2ggKyBjKSAmIF9IQVNIX01BU0s7CiAgICB9CiAgICBoYXNoID0gKGhhc2ggKyAoaGFzaCA8PCAzKSkgJiBfSEFTSF9NQVNLOwogICAgaGFzaCBePSAoaGFzaCA+PiAxMSk7CiAgICBoYXNoID0gKGhhc2ggKyAoaGFzaCA8PCAxNSkpICYgX0hBU0hfTUFTSzsKICAgIHJldHVybiBoYXNoOwogIH0KfQoKLy8vIEVxdWFsaXR5IG9mIHRoZSBlbGVtZW50cyBvZiB0d28gaXRlcmFibGVzIHdpdGhvdXQgY29uc2lkZXJpbmcgb3JkZXIuCi8vLwovLy8gVHdvIGl0ZXJhYmxlcyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLAovLy8gYW5kIHRoZSBlbGVtZW50cyBvZiBvbmUgc2V0IGNhbiBiZSBwYWlyZWQgd2l0aCB0aGUgZWxlbWVudHMKLy8vIG9mIHRoZSBvdGhlciBpdGVyYWJsZSwgc28gdGhhdCBlYWNoIHBhaXIgYXJlIGVxdWFsLgpjbGFzcyBVbm9yZGVyZWRJdGVyYWJsZUVxdWFsaXR5PEU+IGV4dGVuZHMgX1Vub3JkZXJlZEVxdWFsaXR5PEUsIEl0ZXJhYmxlPEU+PiB7CiAgY29uc3QgVW5vcmRlcmVkSXRlcmFibGVFcXVhbGl0eSgKICAgICAgW0VxdWFsaXR5PEU+IGVsZW1lbnRFcXVhbGl0eSA9IGNvbnN0IERlZmF1bHRFcXVhbGl0eSgpXSkKICAgICAgOiBzdXBlcihlbGVtZW50RXF1YWxpdHkpOwoKICBib29sIGlzVmFsaWRLZXkoT2JqZWN0IG8pID0+IG8gaXMgSXRlcmFibGU8RT47Cn0KCi8vLyBFcXVhbGl0eSBvZiBzZXRzLgovLy8KLy8vIFR3byBzZXRzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMsCi8vLyBhbmQgdGhlIGVsZW1lbnRzIG9mIG9uZSBzZXQgY2FuIGJlIHBhaXJlZCB3aXRoIHRoZSBlbGVtZW50cwovLy8gb2YgdGhlIG90aGVyIHNldCwgc28gdGhhdCBlYWNoIHBhaXIgYXJlIGVxdWFsLgovLy8KLy8vIFRoaXMgZXF1YWxpdHkgYmVoYXZlcyB0aGUgc2FtZSBhcyBbVW5vcmRlcmVkSXRlcmFibGVFcXVhbGl0eV0gZXhjZXB0IHRoYXQKLy8vIGl0IGV4cGVjdHMgc2V0cyBpbnN0ZWFkIG9mIGl0ZXJhYmxlcyBhcyBhcmd1bWVudHMuCi8vLwovLy8gVGhlIFtlcXVhbHNdIGFuZCBbaGFzaF0gbWV0aG9kcyBhY2NlcHRzIGBudWxsYCB2YWx1ZXMsCi8vLyBldmVuIGlmIHRoZSBbaXNWYWxpZEtleV0gcmV0dXJucyBgZmFsc2VgIGZvciBgbnVsbGAuCi8vLyBUaGUgW2hhc2hdIG9mIGBudWxsYCBpcyBgbnVsbC5oYXNoQ29kZWAuCmNsYXNzIFNldEVxdWFsaXR5PEU+IGV4dGVuZHMgX1Vub3JkZXJlZEVxdWFsaXR5PEUsIFNldDxFPj4gewogIGNvbnN0IFNldEVxdWFsaXR5KFtFcXVhbGl0eTxFPiBlbGVtZW50RXF1YWxpdHkgPSBjb25zdCBEZWZhdWx0RXF1YWxpdHkoKV0pCiAgICAgIDogc3VwZXIoZWxlbWVudEVxdWFsaXR5KTsKCiAgYm9vbCBpc1ZhbGlkS2V5KE9iamVjdCBvKSA9PiBvIGlzIFNldDxFPjsKfQoKLy8vIEludGVybmFsIGNsYXNzIHVzZWQgYnkgW01hcEVxdWFsaXR5XS4KLy8vCi8vLyBUaGUgY2xhc3MgcmVwcmVzZW50cyBhIG1hcCBlbnRyeSBhcyBhIHNpbmdsZSBvYmplY3QsCi8vLyB1c2luZyBhIGNvbWJpbmVkIGhhc2hDb2RlIGFuZCBlcXVhbGl0eSBvZiB0aGUga2V5IGFuZCB2YWx1ZS4KY2xhc3MgX01hcEVudHJ5IHsKICBmaW5hbCBNYXBFcXVhbGl0eSBlcXVhbGl0eTsKICBmaW5hbCBrZXk7CiAgZmluYWwgdmFsdWU7CiAgX01hcEVudHJ5KHRoaXMuZXF1YWxpdHksIHRoaXMua2V5LCB0aGlzLnZhbHVlKTsKCiAgaW50IGdldCBoYXNoQ29kZSA9PgogICAgICAoMyAqIGVxdWFsaXR5Ll9rZXlFcXVhbGl0eS5oYXNoKGtleSkgKwogICAgICAgICAgNyAqIGVxdWFsaXR5Ll92YWx1ZUVxdWFsaXR5Lmhhc2godmFsdWUpKSAmCiAgICAgIF9IQVNIX01BU0s7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICBvdGhlciBpcyBfTWFwRW50cnkgJiYKICAgICAgZXF1YWxpdHkuX2tleUVxdWFsaXR5LmVxdWFscyhrZXksIG90aGVyLmtleSkgJiYKICAgICAgZXF1YWxpdHkuX3ZhbHVlRXF1YWxpdHkuZXF1YWxzKHZhbHVlLCBvdGhlci52YWx1ZSk7Cn0KCi8vLyBFcXVhbGl0eSBvbiBtYXBzLgovLy8KLy8vIFR3byBtYXBzIGFyZSBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVudHJpZXMsIGFuZCBpZiB0aGUKLy8vIGVudHJpZXMgb2YgdGhlIHR3byBtYXBzIGFyZSBwYWlyd2lzZSBlcXVhbCBvbiBib3RoIGtleSBhbmQgdmFsdWUuCi8vLwovLy8gVGhlIFtlcXVhbHNdIGFuZCBbaGFzaF0gbWV0aG9kcyBhY2NlcHRzIGBudWxsYCB2YWx1ZXMsCi8vLyBldmVuIGlmIHRoZSBbaXNWYWxpZEtleV0gcmV0dXJucyBgZmFsc2VgIGZvciBgbnVsbGAuCi8vLyBUaGUgW2hhc2hdIG9mIGBudWxsYCBpcyBgbnVsbC5oYXNoQ29kZWAuCmNsYXNzIE1hcEVxdWFsaXR5PEssIFY+IGltcGxlbWVudHMgRXF1YWxpdHk8TWFwPEssIFY+PiB7CiAgZmluYWwgRXF1YWxpdHk8Sz4gX2tleUVxdWFsaXR5OwogIGZpbmFsIEVxdWFsaXR5PFY+IF92YWx1ZUVxdWFsaXR5OwogIGNvbnN0IE1hcEVxdWFsaXR5KAogICAgICB7RXF1YWxpdHk8Sz4ga2V5czogY29uc3QgRGVmYXVsdEVxdWFsaXR5KCksCiAgICAgIEVxdWFsaXR5PFY+IHZhbHVlczogY29uc3QgRGVmYXVsdEVxdWFsaXR5KCl9KQogICAgICA6IF9rZXlFcXVhbGl0eSA9IGtleXMsCiAgICAgICAgX3ZhbHVlRXF1YWxpdHkgPSB2YWx1ZXM7CgogIGJvb2wgZXF1YWxzKE1hcDxLLCBWPiBtYXAxLCBNYXA8SywgVj4gbWFwMikgewogICAgaWYgKGlkZW50aWNhbChtYXAxLCBtYXAyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAobWFwMSA9PSBudWxsIHx8IG1hcDIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgaW50IGxlbmd0aCA9IG1hcDEubGVuZ3RoOwogICAgaWYgKGxlbmd0aCAhPSBtYXAyLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgTWFwPF9NYXBFbnRyeSwgaW50PiBlcXVhbEVsZW1lbnRDb3VudHMgPSBuZXcgSGFzaE1hcCgpOwogICAgZm9yIChLIGtleSBpbiBtYXAxLmtleXMpIHsKICAgICAgX01hcEVudHJ5IGVudHJ5ID0gbmV3IF9NYXBFbnRyeSh0aGlzLCBrZXksIG1hcDFba2V5XSk7CiAgICAgIGludCBjb3VudCA9IGVxdWFsRWxlbWVudENvdW50c1tlbnRyeV07CiAgICAgIGlmIChjb3VudCA9PSBudWxsKSBjb3VudCA9IDA7CiAgICAgIGVxdWFsRWxlbWVudENvdW50c1tlbnRyeV0gPSBjb3VudCArIDE7CiAgICB9CiAgICBmb3IgKEsga2V5IGluIG1hcDIua2V5cykgewogICAgICBfTWFwRW50cnkgZW50cnkgPSBuZXcgX01hcEVudHJ5KHRoaXMsIGtleSwgbWFwMltrZXldKTsKICAgICAgaW50IGNvdW50ID0gZXF1YWxFbGVtZW50Q291bnRzW2VudHJ5XTsKICAgICAgaWYgKGNvdW50ID09IG51bGwgfHwgY291bnQgPT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICBlcXVhbEVsZW1lbnRDb3VudHNbZW50cnldID0gY291bnQgLSAxOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBpbnQgaGFzaChNYXA8SywgVj4gbWFwKSB7CiAgICBpZiAobWFwID09IG51bGwpIHJldHVybiBudWxsLmhhc2hDb2RlOwogICAgaW50IGhhc2ggPSAwOwogICAgZm9yIChLIGtleSBpbiBtYXAua2V5cykgewogICAgICBpbnQga2V5SGFzaCA9IF9rZXlFcXVhbGl0eS5oYXNoKGtleSk7CiAgICAgIGludCB2YWx1ZUhhc2ggPSBfdmFsdWVFcXVhbGl0eS5oYXNoKG1hcFtrZXldKTsKICAgICAgaGFzaCA9IChoYXNoICsgMyAqIGtleUhhc2ggKyA3ICogdmFsdWVIYXNoKSAmIF9IQVNIX01BU0s7CiAgICB9CiAgICBoYXNoID0gKGhhc2ggKyAoaGFzaCA8PCAzKSkgJiBfSEFTSF9NQVNLOwogICAgaGFzaCBePSAoaGFzaCA+PiAxMSk7CiAgICBoYXNoID0gKGhhc2ggKyAoaGFzaCA8PCAxNSkpICYgX0hBU0hfTUFTSzsKICAgIHJldHVybiBoYXNoOwogIH0KCiAgYm9vbCBpc1ZhbGlkS2V5KE9iamVjdCBvKSA9PiBvIGlzIE1hcDxLLCBWPjsKfQoKLy8vIENvbWJpbmVzIHNldmVyYWwgZXF1YWxpdGllcyBpbnRvIGEgc2luZ2xlIGVxdWFsaXR5LgovLy8KLy8vIFRyaWVzIGVhY2ggZXF1YWxpdHkgaW4gb3JkZXIsIHVzaW5nIFtFcXVhbGl0eS5pc1ZhbGlkS2V5XSwgYW5kIHJldHVybnMKLy8vIHRoZSByZXN1bHQgb2YgdGhlIGZpcnN0IGVxdWFsaXR5IHRoYXQgYXBwbGllcyB0byB0aGUgYXJndW1lbnQgb3IgYXJndW1lbnRzLgovLy8KLy8vIEZvciBgZXF1YWxzYCwgdGhlIGZpcnN0IGVxdWFsaXR5IHRoYXQgbWF0Y2hlcyB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdXNlZCwKLy8vIGFuZCBpZiB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIGBlcXVhbHNgIGlzIG5vdCB2YWxpZCBmb3IgdGhhdCBlcXVhbGl0eSwKLy8vIGl0IHJldHVybnMgZmFsc2UuCi8vLwovLy8gQmVjYXVzZSB0aGUgZXF1YWxpdGllcyBhcmUgdHJpZWQgaW4gb3JkZXIsIHRoZXkgc2hvdWxkIGdlbmVyYWxseSB3b3JrIG9uCi8vLyBkaXNqb2ludCB0eXBlcy4gT3RoZXJ3aXNlIHRoZSBtdWx0aS1lcXVhbGl0eSBtYXkgZ2l2ZSBpbmNvbnNpc3RlbnQgcmVzdWx0cwovLy8gZm9yIGBlcXVhbHMoZTEsIGUyKWAgYW5kIGBlcXVhbHMoZTIsIGUxKWAuIFRoaXMgY2FuIGhhcHBlbiBpZiBvbmUgZXF1YWxpdHkKLy8vIGNvbnNpZGVycyBvbmx5IGBlMWAgYSB2YWxpZCBrZXksIGFuZCBub3QgYGUyYCwgYnV0IGFuIGVxdWFsaXR5IHdoaWNoIGlzCi8vLyBjaGVja2VkIGxhdGVyLCBhbGxvd3MgYm90aC4KY2xhc3MgTXVsdGlFcXVhbGl0eTxFPiBpbXBsZW1lbnRzIEVxdWFsaXR5PEU+IHsKICBmaW5hbCBJdGVyYWJsZTxFcXVhbGl0eTxFPj4gX2VxdWFsaXRpZXM7CgogIGNvbnN0IE11bHRpRXF1YWxpdHkoSXRlcmFibGU8RXF1YWxpdHk8RT4+IGVxdWFsaXRpZXMpCiAgICAgIDogX2VxdWFsaXRpZXMgPSBlcXVhbGl0aWVzOwoKICBib29sIGVxdWFscyhFIGUxLCBFIGUyKSB7CiAgICBmb3IgKEVxdWFsaXR5PEU+IGVxIGluIF9lcXVhbGl0aWVzKSB7CiAgICAgIGlmIChlcS5pc1ZhbGlkS2V5KGUxKSkgcmV0dXJuIGVxLmlzVmFsaWRLZXkoZTIpICYmIGVxLmVxdWFscyhlMSwgZTIpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgaW50IGhhc2goRSBlKSB7CiAgICBmb3IgKEVxdWFsaXR5PEU+IGVxIGluIF9lcXVhbGl0aWVzKSB7CiAgICAgIGlmIChlcS5pc1ZhbGlkS2V5KGUpKSByZXR1cm4gZXEuaGFzaChlKTsKICAgIH0KICAgIHJldHVybiAwOwogIH0KCiAgYm9vbCBpc1ZhbGlkS2V5KE9iamVjdCBvKSB7CiAgICBmb3IgKEVxdWFsaXR5PEU+IGVxIGluIF9lcXVhbGl0aWVzKSB7CiAgICAgIGlmIChlcS5pc1ZhbGlkS2V5KG8pKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9Cn0KCi8vLyBEZWVwIGVxdWFsaXR5IG9uIGNvbGxlY3Rpb25zLgovLy8KLy8vIFJlY29nbml6ZXMgbGlzdHMsIHNldHMsIGl0ZXJhYmxlcyBhbmQgbWFwcyBhbmQgY29tcGFyZXMgdGhlaXIgZWxlbWVudHMgdXNpbmcKLy8vIGRlZXAgZXF1YWxpdHkgYXMgd2VsbC4KLy8vCi8vLyBOb24taXRlcmFibGUvbWFwIG9iamVjdHMgYXJlIGNvbXBhcmVkIHVzaW5nIGEgY29uZmlndXJhYmxlIGJhc2UgZXF1YWxpdHkuCi8vLwovLy8gV29ya3MgaW4gb25lIG9mIHR3byBtb2Rlczogb3JkZXJlZCBvciB1bm9yZGVyZWQuCi8vLwovLy8gSW4gb3JkZXJlZCBtb2RlLCBsaXN0cyBhbmQgaXRlcmFibGVzIGFyZSByZXF1aXJlZCB0byBoYXZlIGVxdWFsIGVsZW1lbnRzCi8vLyBpbiB0aGUgc2FtZSBvcmRlci4gSW4gdW5vcmRlcmVkIG1vZGUsIHRoZSBvcmRlciBvZiBlbGVtZW50cyBpbiBpdGVyYWJsZXMKLy8vIGFuZCBsaXN0cyBhcmUgbm90IGltcG9ydGFudC4KLy8vCi8vLyBBIGxpc3QgaXMgb25seSBlcXVhbCB0byBhbm90aGVyIGxpc3QsIGxpa2V3aXNlIGZvciBzZXRzIGFuZCBtYXBzLiBBbGwgb3RoZXIKLy8vIGl0ZXJhYmxlcyBhcmUgY29tcGFyZWQgYXMgaXRlcmFibGVzIG9ubHkuCmNsYXNzIERlZXBDb2xsZWN0aW9uRXF1YWxpdHkgaW1wbGVtZW50cyBFcXVhbGl0eSB7CiAgZmluYWwgRXF1YWxpdHkgX2Jhc2U7CiAgZmluYWwgYm9vbCBfdW5vcmRlcmVkOwogIGNvbnN0IERlZXBDb2xsZWN0aW9uRXF1YWxpdHkoW0VxdWFsaXR5IGJhc2UgPSBjb25zdCBEZWZhdWx0RXF1YWxpdHkoKV0pCiAgICAgIDogX2Jhc2UgPSBiYXNlLAogICAgICAgIF91bm9yZGVyZWQgPSBmYWxzZTsKCiAgLy8vIENyZWF0ZXMgYSBkZWVwIGVxdWFsaXR5IG9uIGNvbGxlY3Rpb25zIHdoZXJlIHRoZSBvcmRlciBvZiBsaXN0cyBhbmQKICAvLy8gaXRlcmFibGVzIGFyZSBub3QgY29uc2lkZXJlZCBpbXBvcnRhbnQuIFRoYXQgaXMsIGxpc3RzIGFuZCBpdGVyYWJsZXMgYXJlCiAgLy8vIHRyZWF0ZWQgYXMgdW5vcmRlcmVkIGl0ZXJhYmxlcy4KICBjb25zdCBEZWVwQ29sbGVjdGlvbkVxdWFsaXR5LnVub3JkZXJlZCgKICAgICAgW0VxdWFsaXR5IGJhc2UgPSBjb25zdCBEZWZhdWx0RXF1YWxpdHkoKV0pCiAgICAgIDogX2Jhc2UgPSBiYXNlLAogICAgICAgIF91bm9yZGVyZWQgPSB0cnVlOwoKICBib29sIGVxdWFscyhlMSwgZTIpIHsKICAgIGlmIChlMSBpcyBTZXQpIHsKICAgICAgcmV0dXJuIGUyIGlzIFNldCAmJiBuZXcgU2V0RXF1YWxpdHkodGhpcykuZXF1YWxzKGUxLCBlMik7CiAgICB9CiAgICBpZiAoZTEgaXMgTWFwKSB7CiAgICAgIHJldHVybiBlMiBpcyBNYXAgJiYKICAgICAgICAgIG5ldyBNYXBFcXVhbGl0eShrZXlzOiB0aGlzLCB2YWx1ZXM6IHRoaXMpLmVxdWFscyhlMSwgZTIpOwogICAgfQogICAgaWYgKCFfdW5vcmRlcmVkKSB7CiAgICAgIGlmIChlMSBpcyBMaXN0KSB7CiAgICAgICAgcmV0dXJuIGUyIGlzIExpc3QgJiYgbmV3IExpc3RFcXVhbGl0eSh0aGlzKS5lcXVhbHMoZTEsIGUyKTsKICAgICAgfQogICAgICBpZiAoZTEgaXMgSXRlcmFibGUpIHsKICAgICAgICByZXR1cm4gZTIgaXMgSXRlcmFibGUgJiYgbmV3IEl0ZXJhYmxlRXF1YWxpdHkodGhpcykuZXF1YWxzKGUxLCBlMik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZTEgaXMgSXRlcmFibGUpIHsKICAgICAgaWYgKGUxIGlzIExpc3QgIT0gZTIgaXMgTGlzdCkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gZTIgaXMgSXRlcmFibGUgJiYKICAgICAgICAgIG5ldyBVbm9yZGVyZWRJdGVyYWJsZUVxdWFsaXR5KHRoaXMpLmVxdWFscyhlMSwgZTIpOwogICAgfQogICAgcmV0dXJuIF9iYXNlLmVxdWFscyhlMSwgZTIpOwogIH0KCiAgaW50IGhhc2goT2JqZWN0IG8pIHsKICAgIGlmIChvIGlzIFNldCkgcmV0dXJuIG5ldyBTZXRFcXVhbGl0eSh0aGlzKS5oYXNoKG8pOwogICAgaWYgKG8gaXMgTWFwKSByZXR1cm4gbmV3IE1hcEVxdWFsaXR5KGtleXM6IHRoaXMsIHZhbHVlczogdGhpcykuaGFzaChvKTsKICAgIGlmICghX3Vub3JkZXJlZCkgewogICAgICBpZiAobyBpcyBMaXN0KSByZXR1cm4gbmV3IExpc3RFcXVhbGl0eSh0aGlzKS5oYXNoKG8pOwogICAgICBpZiAobyBpcyBJdGVyYWJsZSkgcmV0dXJuIG5ldyBJdGVyYWJsZUVxdWFsaXR5KHRoaXMpLmhhc2gobyk7CiAgICB9IGVsc2UgaWYgKG8gaXMgSXRlcmFibGUpIHsKICAgICAgcmV0dXJuIG5ldyBVbm9yZGVyZWRJdGVyYWJsZUVxdWFsaXR5KHRoaXMpLmhhc2gobyk7CiAgICB9CiAgICByZXR1cm4gX2Jhc2UuaGFzaChvKTsKICB9CgogIGJvb2wgaXNWYWxpZEtleShPYmplY3QgbykgPT4gbyBpcyBJdGVyYWJsZSB8fCBvIGlzIE1hcCB8fCBfYmFzZS5pc1ZhbGlkS2V5KG8pOwp9CgovLy8gU3RyaW5nIGVxdWFsaXR5IHRoYXQncyBpbnNlbnNpdGl2ZSB0byBkaWZmZXJlbmNlcyBpbiBBU0NJSSBjYXNlLgovLy8KLy8vIE5vbi1BU0NJSSBjaGFyYWN0ZXJzIGFyZSBjb21wYXJlZCBhcy1pcywgd2l0aCBubyBjb252ZXJzaW9uLgpjbGFzcyBDYXNlSW5zZW5zaXRpdmVFcXVhbGl0eSBpbXBsZW1lbnRzIEVxdWFsaXR5PFN0cmluZz4gewogIGNvbnN0IENhc2VJbnNlbnNpdGl2ZUVxdWFsaXR5KCk7CgogIGJvb2wgZXF1YWxzKFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMikgPT4KICAgICAgZXF1YWxzSWdub3JlQXNjaWlDYXNlKHN0cmluZzEsIHN0cmluZzIpOwoKICBpbnQgaGFzaChTdHJpbmcgc3RyaW5nKSA9PiBoYXNoSWdub3JlQXNjaWlDYXNlKHN0cmluZyk7CgogIGJvb2wgaXNWYWxpZEtleShPYmplY3Qgb2JqZWN0KSA9PiBvYmplY3QgaXMgU3RyaW5nOwp9CoHSAE5OPAEaARsBIwEsHTEBLAYxGwEkBkIwEQFJBkwSHQIBIwExBCIMHhwGCARQDDQIBE4mMDEfATIcAVAaGAFGASwBHhIgNQYSBAIBUAROEgRPS1EyGzEkJQIBSDMcMCglAgEbBE4EOzktPSYaPywBPjY+IiITJTMhTAYEASMwLhIiLiYxGwYuGi8RBAExAgEXBEgdBEY9BDs5LTUmTiwBLi42Hy4nRgYRBAEbLC5MRxIsLiYxGwYuGi8RBAEtAgE8HSYBMwEqNj4qKSkyFB8dJB0QBh8dNR0QBhgEARkwEiIuJgYuGi8RBAIBSQRRQDhQIz8gATECARYETEAzBE43BDs5LT1NIAEsAgEqBDlBEh4NDzIBFi01EgEkHDY6AgEWBEtGBDs5LTkiJBUyNB0hATAsNB4tPB89LSQtBh89LTUtBhEEARwrEh4sNUAGLhovEQQBLwIBOARLUAROSxYETU9PTCAwKwE4IgEcKkwGEgQBEiovBg4EAR4qKQYSBAIBIgRRGwROBDUETU0hBFAuMxgZShYcAUpPJioxFhsBGBVABhUaRAYXGEQIHEwIITIfPgYhBAEXOEwXPEQgOgYaBAFRAgFFBEE8IwExLwE6ATYCASRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2VxdWFsaXR5LmRhcnQ9c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9lcXVhbGl0eV9tYXAuZGFydISDLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCmltcG9ydCAnZXF1YWxpdHkuZGFydCc7CmltcG9ydCAnd3JhcHBlcnMuZGFydCc7CgovLy8gQSBbTWFwXSB3aG9zZSBrZXkgZXF1YWxpdHkgaXMgZGV0ZXJtaW5lZCBieSBhbiBbRXF1YWxpdHldIG9iamVjdC4KY2xhc3MgRXF1YWxpdHlNYXA8SywgVj4gZXh0ZW5kcyBEZWxlZ2F0aW5nTWFwPEssIFY+IHsKICAvLy8gQ3JlYXRlcyBhIG1hcCB3aXRoIGVxdWFsaXR5IGJhc2VkIG9uIFtlcXVhbGl0eV0uCiAgRXF1YWxpdHlNYXAoRXF1YWxpdHk8Sz4gZXF1YWxpdHkpCiAgICAgIDogc3VwZXIobmV3IExpbmtlZEhhc2hNYXAoCiAgICAgICAgICAgIGVxdWFsczogZXF1YWxpdHkuZXF1YWxzLAogICAgICAgICAgICBoYXNoQ29kZTogZXF1YWxpdHkuaGFzaCwKICAgICAgICAgICAgaXNWYWxpZEtleTogZXF1YWxpdHkuaXNWYWxpZEtleSkpOwoKICAvLy8gQ3JlYXRlcyBhIG1hcCB3aXRoIGVxdWFsaXR5IGJhc2VkIG9uIFtlcXVhbGl0eV0gdGhhdCBjb250YWlucyBhbGwKICAvLy8ga2V5LXZhbHVlIHBhaXJzIG9mIFtvdGhlcl0uCiAgLy8vCiAgLy8vIElmIFtvdGhlcl0gaGFzIG11bHRpcGxlIGtleXMgdGhhdCBhcmUgZXF1aXZhbGVudCBhY2NvcmRpbmcgdG8gW2VxdWFsaXR5XSwKICAvLy8gdGhlIGxhc3Qgb25lIHJlYWNoZWQgZHVyaW5nIGl0ZXJhdGlvbiB0YWtlcyBwcmVjZWRlbmNlLgogIEVxdWFsaXR5TWFwLmZyb20oRXF1YWxpdHk8Sz4gZXF1YWxpdHksIE1hcDxLLCBWPiBvdGhlcikKICAgICAgOiBzdXBlcihuZXcgTGlua2VkSGFzaE1hcCgKICAgICAgICAgICAgZXF1YWxzOiBlcXVhbGl0eS5lcXVhbHMsCiAgICAgICAgICAgIGhhc2hDb2RlOiBlcXVhbGl0eS5oYXNoLAogICAgICAgICAgICBpc1ZhbGlkS2V5OiBlcXVhbGl0eS5pc1ZhbGlkS2V5KSkgewogICAgYWRkQWxsKG90aGVyKTsKICB9Cn0KIQBOTjwBGgEYGAFGNjckISUlLwFIIgZQPjohJSUwEwQCAShwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2VxdWFsaXR5X21hcC5kYXJ0PXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb2xsZWN0aW9uL2xpYi9zcmMvZXF1YWxpdHlfc2V0LmRhcnSEey8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgppbXBvcnQgJ2VxdWFsaXR5LmRhcnQnOwppbXBvcnQgJ3dyYXBwZXJzLmRhcnQnOwoKLy8vIEEgW01hcF0gd2hvc2Uga2V5IGVxdWFsaXR5IGlzIGRldGVybWluZWQgYnkgYW4gW0VxdWFsaXR5XSBvYmplY3QuCmNsYXNzIEVxdWFsaXR5U2V0PEU+IGV4dGVuZHMgRGVsZWdhdGluZ1NldDxFPiB7CiAgLy8vIENyZWF0ZXMgYSBzZXQgd2l0aCBlcXVhbGl0eSBiYXNlZCBvbiBbZXF1YWxpdHldLgogIEVxdWFsaXR5U2V0KEVxdWFsaXR5PEU+IGVxdWFsaXR5KQogICAgICA6IHN1cGVyKG5ldyBMaW5rZWRIYXNoU2V0KAogICAgICAgICAgICBlcXVhbHM6IGVxdWFsaXR5LmVxdWFscywKICAgICAgICAgICAgaGFzaENvZGU6IGVxdWFsaXR5Lmhhc2gsCiAgICAgICAgICAgIGlzVmFsaWRLZXk6IGVxdWFsaXR5LmlzVmFsaWRLZXkpKTsKCiAgLy8vIENyZWF0ZXMgYSBzZXQgd2l0aCBlcXVhbGl0eSBiYXNlZCBvbiBbZXF1YWxpdHldIHRoYXQgY29udGFpbnMgYWxsCiAgLy8vIGVsZW1lbnRzIGluIFtvdGhlcl0uCiAgLy8vCiAgLy8vIElmIFtvdGhlcl0gaGFzIG11bHRpcGxlIHZhbHVlcyB0aGF0IGFyZSBlcXVpdmFsZW50IGFjY29yZGluZyB0bwogIC8vLyBbZXF1YWxpdHldLCB0aGUgZmlyc3Qgb25lIHJlYWNoZWQgZHVyaW5nIGl0ZXJhdGlvbiB0YWtlcyBwcmVjZWRlbmNlLgogIEVxdWFsaXR5U2V0LmZyb20oRXF1YWxpdHk8RT4gZXF1YWxpdHksIEl0ZXJhYmxlPEU+IG90aGVyKQogICAgICA6IHN1cGVyKG5ldyBMaW5rZWRIYXNoU2V0KAogICAgICAgICAgICBlcXVhbHM6IGVxdWFsaXR5LmVxdWFscywKICAgICAgICAgICAgaGFzaENvZGU6IGVxdWFsaXR5Lmhhc2gsCiAgICAgICAgICAgIGlzVmFsaWRLZXk6IGVxdWFsaXR5LmlzVmFsaWRLZXkpKSB7CiAgICBhZGRBbGwob3RoZXIpOwogIH0KfQohAE5OPAEaARgYAUYwNyQhJSUvAUgbBkZLPCElJTATBAIBKHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvZXF1YWxpdHlfc2V0LmRhcnQ6c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9mdW5jdGlvbnMuZGFydJvHLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKaW1wb3J0ICdkYXJ0Om1hdGgnIGFzIG1hdGg7CgppbXBvcnQgJ3V0aWxzLmRhcnQnOwoKLy8gVE9ETyhud2Vpeik6IFdoZW4gc2RrIzI2NDg4IGlzIGZpeGVkLCB1c2Ugb3ZlcmxvYWRzIHRvIGVuc3VyZSB0aGF0IGlmIFtrZXldCi8vIG9yIFt2YWx1ZV0gaXNuJ3QgcGFzc2VkLCBgSzJgL2BWMmAgZGVmYXVsdHMgdG8gYEsxYC9gVjFgLCByZXNwZWN0aXZlbHkuCi8vLyBDcmVhdGVzIGEgbmV3IG1hcCBmcm9tIFttYXBdIHdpdGggbmV3IGtleXMgYW5kIHZhbHVlcy4KLy8vCi8vLyBUaGUgcmV0dXJuIHZhbHVlcyBvZiBba2V5XSBhcmUgdXNlZCBhcyB0aGUga2V5cyBhbmQgdGhlIHJldHVybiB2YWx1ZXMgb2YKLy8vIFt2YWx1ZV0gYXJlIHVzZWQgYXMgdGhlIHZhbHVlcyBmb3IgdGhlIG5ldyBtYXAuCk1hcDxLMiwgVjI+IG1hcE1hcDxLMSwgVjEsIEsyLCBWMj4oTWFwPEsxLCBWMT4gbWFwLAogICAge0syIGtleShLMSBrZXksIFYxIHZhbHVlKSwgVjIgdmFsdWUoSzEga2V5LCBWMSB2YWx1ZSl9KSB7CiAga2V5ID8/PSAobWFwS2V5LCBfKSA9PiBtYXBLZXkgYXMgSzI7CiAgdmFsdWUgPz89IChfLCBtYXBWYWx1ZSkgPT4gbWFwVmFsdWUgYXMgVjI7CgogIHZhciByZXN1bHQgPSA8SzIsIFYyPnt9OwogIG1hcC5mb3JFYWNoKChtYXBLZXksIG1hcFZhbHVlKSB7CiAgICByZXN1bHRba2V5KG1hcEtleSwgbWFwVmFsdWUpXSA9IHZhbHVlKG1hcEtleSwgbWFwVmFsdWUpOwogIH0pOwogIHJldHVybiByZXN1bHQ7Cn0KCi8vLyBSZXR1cm5zIGEgbmV3IG1hcCB3aXRoIGFsbCBrZXkvdmFsdWUgcGFpcnMgaW4gYm90aCBbbWFwMV0gYW5kIFttYXAyXS4KLy8vCi8vLyBJZiB0aGVyZSBhcmUga2V5cyB0aGF0IG9jY3VyIGluIGJvdGggbWFwcywgdGhlIFt2YWx1ZV0gZnVuY3Rpb24gaXMgdXNlZCB0bwovLy8gc2VsZWN0IHRoZSB2YWx1ZSB0aGF0IGdvZXMgaW50byB0aGUgcmVzdWx0aW5nIG1hcCBiYXNlZCBvbiB0aGUgdHdvIG9yaWdpbmFsCi8vLyB2YWx1ZXMuIElmIFt2YWx1ZV0gaXMgb21pdHRlZCwgdGhlIHZhbHVlIGZyb20gW21hcDJdIGlzIHVzZWQuCk1hcDxLLCBWPiBtZXJnZU1hcHM8SywgVj4oTWFwPEssIFY+IG1hcDEsIE1hcDxLLCBWPiBtYXAyLAogICAge1YgdmFsdWUoViB2YWx1ZTEsIFYgdmFsdWUyKX0pIHsKICB2YXIgcmVzdWx0ID0gbmV3IE1hcDxLLCBWPi5mcm9tKG1hcDEpOwogIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gcmVzdWx0Li5hZGRBbGwobWFwMik7CgogIG1hcDIuZm9yRWFjaCgoa2V5LCBtYXBWYWx1ZSkgewogICAgcmVzdWx0W2tleV0gPQogICAgICAgIHJlc3VsdC5jb250YWluc0tleShrZXkpID8gdmFsdWUocmVzdWx0W2tleV0sIG1hcFZhbHVlKSA6IG1hcFZhbHVlOwogIH0pOwogIHJldHVybiByZXN1bHQ7Cn0KCi8vLyBHcm91cHMgdGhlIGVsZW1lbnRzIGluIFt2YWx1ZXNdIGJ5IHRoZSB2YWx1ZSByZXR1cm5lZCBieSBba2V5XS4KLy8vCi8vLyBSZXR1cm5zIGEgbWFwIGZyb20ga2V5cyBjb21wdXRlZCBieSBba2V5XSB0byBhIGxpc3Qgb2YgYWxsIHZhbHVlcyBmb3Igd2hpY2gKLy8vIFtrZXldIHJldHVybnMgdGhhdCBrZXkuIFRoZSB2YWx1ZXMgYXBwZWFyIGluIHRoZSBsaXN0IGluIHRoZSBzYW1lIHJlbGF0aXZlCi8vLyBvcmRlciBhcyBpbiBbdmFsdWVzXS4KTWFwPFQsIExpc3Q8Uz4+IGdyb3VwQnk8UywgVD4oSXRlcmFibGU8Uz4gdmFsdWVzLCBUIGtleShTIGVsZW1lbnQpKSB7CiAgdmFyIG1hcCA9IDxULCBMaXN0PFM+Pnt9OwogIGZvciAodmFyIGVsZW1lbnQgaW4gdmFsdWVzKSB7CiAgICB2YXIgbGlzdCA9IG1hcC5wdXRJZkFic2VudChrZXkoZWxlbWVudCksICgpID0+IFtdKTsKICAgIGxpc3QuYWRkKGVsZW1lbnQpOwogIH0KICByZXR1cm4gbWFwOwp9CgovLy8gUmV0dXJucyB0aGUgZWxlbWVudCBvZiBbdmFsdWVzXSBmb3Igd2hpY2ggW29yZGVyQnldIHJldHVybnMgdGhlIG1pbmltdW0KLy8vIHZhbHVlLgovLy8KLy8vIFRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgW29yZGVyQnldIGFyZSBjb21wYXJlZCB1c2luZyB0aGUgW2NvbXBhcmVdIGZ1bmN0aW9uLgovLy8gSWYgW2NvbXBhcmVdIGlzIG9taXR0ZWQsIHZhbHVlcyBtdXN0IGltcGxlbWVudCBbQ29tcGFyYWJsZTxUPl0gYW5kIHRoZXkgYXJlCi8vLyBjb21wYXJlZCB1c2luZyB0aGVpciBbQ29tcGFyYWJsZS5jb21wYXJlVG9dLgpTIG1pbkJ5PFMsIFQ+KEl0ZXJhYmxlPFM+IHZhbHVlcywgVCBvcmRlckJ5KFMgZWxlbWVudCksCiAgICB7aW50IGNvbXBhcmUoVCB2YWx1ZTEsIFQgdmFsdWUyKX0pIHsKICBjb21wYXJlID8/PSBkZWZhdWx0Q29tcGFyZTxUPigpOwoKICBTIG1pblZhbHVlOwogIFQgbWluT3JkZXJCeTsKICBmb3IgKHZhciBlbGVtZW50IGluIHZhbHVlcykgewogICAgdmFyIGVsZW1lbnRPcmRlckJ5ID0gb3JkZXJCeShlbGVtZW50KTsKICAgIGlmIChtaW5PcmRlckJ5ID09IG51bGwgfHwgY29tcGFyZShlbGVtZW50T3JkZXJCeSwgbWluT3JkZXJCeSkgPCAwKSB7CiAgICAgIG1pblZhbHVlID0gZWxlbWVudDsKICAgICAgbWluT3JkZXJCeSA9IGVsZW1lbnRPcmRlckJ5OwogICAgfQogIH0KICByZXR1cm4gbWluVmFsdWU7Cn0KCi8vLyBSZXR1cm5zIHRoZSBlbGVtZW50IG9mIFt2YWx1ZXNdIGZvciB3aGljaCBbb3JkZXJCeV0gcmV0dXJucyB0aGUgbWF4aW11bQovLy8gdmFsdWUuCi8vLwovLy8gVGhlIHZhbHVlcyByZXR1cm5lZCBieSBbb3JkZXJCeV0gYXJlIGNvbXBhcmVkIHVzaW5nIHRoZSBbY29tcGFyZV0gZnVuY3Rpb24uCi8vLyBJZiBbY29tcGFyZV0gaXMgb21pdHRlZCwgdmFsdWVzIG11c3QgaW1wbGVtZW50IFtDb21wYXJhYmxlPFQ+XSBhbmQgdGhleSBhcmUKLy8vIGNvbXBhcmVkIHVzaW5nIHRoZWlyIFtDb21wYXJhYmxlLmNvbXBhcmVUb10uClMgbWF4Qnk8UywgVD4oSXRlcmFibGU8Uz4gdmFsdWVzLCBUIG9yZGVyQnkoUyBlbGVtZW50KSwKICAgIHtpbnQgY29tcGFyZShUIHZhbHVlMSwgVCB2YWx1ZTIpfSkgewogIGNvbXBhcmUgPz89IGRlZmF1bHRDb21wYXJlPFQ+KCk7CgogIFMgbWF4VmFsdWU7CiAgVCBtYXhPcmRlckJ5OwogIGZvciAodmFyIGVsZW1lbnQgaW4gdmFsdWVzKSB7CiAgICB2YXIgZWxlbWVudE9yZGVyQnkgPSBvcmRlckJ5KGVsZW1lbnQpOwogICAgaWYgKG1heE9yZGVyQnkgPT0gbnVsbCB8fCBjb21wYXJlKGVsZW1lbnRPcmRlckJ5LCBtYXhPcmRlckJ5KSA+IDApIHsKICAgICAgbWF4VmFsdWUgPSBlbGVtZW50OwogICAgICBtYXhPcmRlckJ5ID0gZWxlbWVudE9yZGVyQnk7CiAgICB9CiAgfQogIHJldHVybiBtYXhWYWx1ZTsKfQoKLy8vIFJldHVybnMgdGhlIFt0cmFuc2l0aXZlIGNsb3N1cmVdW10gb2YgW2dyYXBoXS4KLy8vCi8vLyBbdHJhbnNpdGl2ZSBjbG9zdXJlXTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVHJhbnNpdGl2ZV9jbG9zdXJlCi8vLwovLy8gSW50ZXJwcmV0cyBbZ3JhcGhdIGFzIGEgZGlyZWN0ZWQgZ3JhcGggd2l0aCBhIHZlcnRleCBmb3IgZWFjaCBrZXkgYW5kIGVkZ2VzCi8vLyBmcm9tIGVhY2gga2V5IHRvIHRoZSB2YWx1ZXMgdGhhdCB0aGUga2V5IG1hcHMgdG8uCi8vLwovLy8gQXNzdW1lcyB0aGF0IGV2ZXJ5IHZlcnRleCBpbiB0aGUgZ3JhcGggaGFzIGEga2V5IHRvIHJlcHJlc2VudCBpdCwgZXZlbiBpZgovLy8gdGhhdCB2ZXJ0ZXggaGFzIG5vIG91dGdvaW5nIGVkZ2VzLiBUaGlzIGlzbid0IGNoZWNrZWQsIGJ1dCBpZiBpdCdzIG5vdAovLy8gc2F0aXNmaWVkLCB0aGUgZnVuY3Rpb24gbWF5IGNyYXNoIG9yIHByb3ZpZGUgdW5leHBlY3RlZCBvdXRwdXQuIEZvciBleGFtcGxlLAovLy8gYHsiYSI6IFsiYiJdfWAgaXMgbm90IHZhbGlkLCBidXQgYHsiYSI6IFsiYiJdLCAiYiI6IFtdfWAgaXMuCk1hcDxULCBTZXQ8VD4+IHRyYW5zaXRpdmVDbG9zdXJlPFQ+KE1hcDxULCBJdGVyYWJsZTxUPj4gZ3JhcGgpIHsKICAvLyBUaGlzIHVzZXMgW1dhcnNoYWxsJ3MgYWxnb3JpdGhtXVtdLCBtb2RpZmllZCBub3QgdG8gYWRkIGEgdmVydGV4IGZyb20gZWFjaAogIC8vIG5vZGUgdG8gaXRzZWxmLgogIC8vCiAgLy8gW1dhcnNoYWxsJ3MgYWxnb3JpdGhtXTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmxveWQlRTIlODAlOTNXYXJzaGFsbF9hbGdvcml0aG0jQXBwbGljYXRpb25zX2FuZF9nZW5lcmFsaXphdGlvbnMuCiAgdmFyIHJlc3VsdCA9IDxULCBTZXQ8VD4+e307CiAgZ3JhcGguZm9yRWFjaCgodmVydGV4LCBlZGdlcykgewogICAgcmVzdWx0W3ZlcnRleF0gPSBuZXcgU2V0PFQ+LmZyb20oZWRnZXMpOwogIH0pOwoKICAvLyBMaXN0cyBhcmUgZmFzdGVyIHRvIGl0ZXJhdGUgdGhhbiBtYXBzLCBzbyB3ZSBjcmVhdGUgYSBsaXN0IHNpbmNlIHdlJ3JlCiAgLy8gaXRlcmF0aW5nIHJlcGVhdGVkbHkuCiAgdmFyIGtleXMgPSBncmFwaC5rZXlzLnRvTGlzdCgpOwogIGZvciAodmFyIHZlcnRleDEgaW4ga2V5cykgewogICAgZm9yICh2YXIgdmVydGV4MiBpbiBrZXlzKSB7CiAgICAgIGZvciAodmFyIHZlcnRleDMgaW4ga2V5cykgewogICAgICAgIGlmIChyZXN1bHRbdmVydGV4Ml0uY29udGFpbnModmVydGV4MSkgJiYKICAgICAgICAgICAgcmVzdWx0W3ZlcnRleDFdLmNvbnRhaW5zKHZlcnRleDMpKSB7CiAgICAgICAgICByZXN1bHRbdmVydGV4Ml0uYWRkKHZlcnRleDMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIHJlc3VsdDsKfQoKLy8vIFJldHVybnMgdGhlIFtzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50c11bXSBvZiBbZ3JhcGhdLCBpbiB0b3BvbG9naWNhbAovLy8gb3JkZXIuCi8vLwovLy8gW3N0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzXTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3Ryb25nbHlfY29ubmVjdGVkX2NvbXBvbmVudAovLy8KLy8vIEludGVycHJldHMgW2dyYXBoXSBhcyBhIGRpcmVjdGVkIGdyYXBoIHdpdGggYSB2ZXJ0ZXggZm9yIGVhY2gga2V5IGFuZCBlZGdlcwovLy8gZnJvbSBlYWNoIGtleSB0byB0aGUgdmFsdWVzIHRoYXQgdGhlIGtleSBtYXBzIHRvLgovLy8KLy8vIEFzc3VtZXMgdGhhdCBldmVyeSB2ZXJ0ZXggaW4gdGhlIGdyYXBoIGhhcyBhIGtleSB0byByZXByZXNlbnQgaXQsIGV2ZW4gaWYKLy8vIHRoYXQgdmVydGV4IGhhcyBubyBvdXRnb2luZyBlZGdlcy4gVGhpcyBpc24ndCBjaGVja2VkLCBidXQgaWYgaXQncyBub3QKLy8vIHNhdGlzZmllZCwgdGhlIGZ1bmN0aW9uIG1heSBjcmFzaCBvciBwcm92aWRlIHVuZXhwZWN0ZWQgb3V0cHV0LiBGb3IgZXhhbXBsZSwKLy8vIGB7ImEiOiBbImIiXX1gIGlzIG5vdCB2YWxpZCwgYnV0IGB7ImEiOiBbImIiXSwgImIiOiBbXX1gIGlzLgpMaXN0PFNldDxUPj4gc3Ryb25nbHlDb25uZWN0ZWRDb21wb25lbnRzPFQ+KE1hcDxULCBJdGVyYWJsZTxUPj4gZ3JhcGgpIHsKICAvLyBUaGlzIHVzZXMgW1RhcmphbidzIGFsZ29yaXRobV1bXS4KICAvLwogIC8vIFtUYXJqYW4ncyBhbGdvcml0aG1dOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UYXJqYW4lMjdzX3N0cm9uZ2x5X2Nvbm5lY3RlZF9jb21wb25lbnRzX2FsZ29yaXRobQogIHZhciBpbmRleCA9IDA7CiAgdmFyIHN0YWNrID0gPFQ+W107CiAgdmFyIHJlc3VsdCA9IDxTZXQ8VD4+W107CgogIC8vIFRoZSBvcmRlciBvZiB0aGVzZSBkb2Vzbid0IG1hdHRlciwgc28gd2UgdXNlIHVuLWxpbmtlZCBpbXBsZW1lbnRhdGlvbnMgdG8KICAvLyBhdm9pZCB1bm5lY2Vzc2FyeSBvdmVyaGVhZC4KICB2YXIgaW5kaWNlcyA9IG5ldyBIYXNoTWFwPFQsIGludD4oKTsKICB2YXIgbG93TGlua3MgPSBuZXcgSGFzaE1hcDxULCBpbnQ+KCk7CiAgdmFyIG9uU3RhY2sgPSBuZXcgSGFzaFNldDxUPigpOwoKICBzdHJvbmdDb25uZWN0KFQgdmVydGV4KSB7CiAgICBpbmRpY2VzW3ZlcnRleF0gPSBpbmRleDsKICAgIGxvd0xpbmtzW3ZlcnRleF0gPSBpbmRleDsKICAgIGluZGV4Kys7CgogICAgc3RhY2suYWRkKHZlcnRleCk7CiAgICBvblN0YWNrLmFkZCh2ZXJ0ZXgpOwoKICAgIGZvciAodmFyIHN1Y2Nlc3NvciBpbiBncmFwaFt2ZXJ0ZXhdKSB7CiAgICAgIGlmICghaW5kaWNlcy5jb250YWluc0tleShzdWNjZXNzb3IpKSB7CiAgICAgICAgc3Ryb25nQ29ubmVjdChzdWNjZXNzb3IpOwogICAgICAgIGxvd0xpbmtzW3ZlcnRleF0gPSBtYXRoLm1pbihsb3dMaW5rc1t2ZXJ0ZXhdLCBsb3dMaW5rc1tzdWNjZXNzb3JdKTsKICAgICAgfSBlbHNlIGlmIChvblN0YWNrLmNvbnRhaW5zKHN1Y2Nlc3NvcikpIHsKICAgICAgICBsb3dMaW5rc1t2ZXJ0ZXhdID0gbWF0aC5taW4obG93TGlua3NbdmVydGV4XSwgbG93TGlua3Nbc3VjY2Vzc29yXSk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAobG93TGlua3NbdmVydGV4XSA9PSBpbmRpY2VzW3ZlcnRleF0pIHsKICAgICAgdmFyIGNvbXBvbmVudCA9IG5ldyBTZXQ8VD4oKTsKICAgICAgVCBuZWlnaGJvcjsKICAgICAgZG8gewogICAgICAgIG5laWdoYm9yID0gc3RhY2sucmVtb3ZlTGFzdCgpOwogICAgICAgIG9uU3RhY2sucmVtb3ZlKG5laWdoYm9yKTsKICAgICAgICBjb21wb25lbnQuYWRkKG5laWdoYm9yKTsKICAgICAgfSB3aGlsZSAobmVpZ2hib3IgIT0gdmVydGV4KTsKICAgICAgcmVzdWx0LmFkZChjb21wb25lbnQpOwogICAgfQogIH0KCiAgZm9yICh2YXIgdmVydGV4IGluIGdyYXBoLmtleXMpIHsKICAgIGlmICghaW5kaWNlcy5jb250YWluc0tleSh2ZXJ0ZXgpKSBzdHJvbmdDb25uZWN0KHZlcnRleCk7CiAgfQoKICAvLyBUYXJqYW4ncyBhbGdvcml0aG0gcHJvZHVjZXMgYSByZXZlcnNlLXRvcG9sb2dpY2FsIHNvcnQsIHNvIHdlIHJldmVyc2UgaXQgdG8KICAvLyBnZXQgYSBub3JtYWwgdG9wb2xvZ2ljYWwgc29ydC4KICByZXR1cm4gcmVzdWx0LnJldmVyc2VkLnRvTGlzdCgpOwp9CoDNAE5OPAEaHAEVAU9LOwRNNDQ+Jy0BGyM9BhECAUoET1BCOiUpMgEhEksGEQIBRARQTxpGHCA4FwQOAgFMCwRQUDE4KSMBDhAgK0kaIwYEEwIBTAsEUFAxOCkjAQ4QICtJGiMGBBMCATMESwRQNgROS1FBQVAVBX4eIi0GAUwbIh4gIjExKAoIBgQBEQIBTQsEYARQNgROS1FBSScFbBEVGwFPIScoIgEcHR4NARcZASstIkwwTAgGAS8kEgsnIiEkHQYEASM9BAFRJCMCASVwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2Z1bmN0aW9ucy5kYXJ0PXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb2xsZWN0aW9uL2xpYi9zcmMvaXRlcmFibGVfemlwLmRhcnSHHi8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgImRhcnQ6Y29sbGVjdGlvbiI7CgovLy8gSXRlcmFibGUgdGhhdCBpdGVyYXRlcyBvdmVyIGxpc3RzIG9mIHZhbHVlcyBmcm9tIG90aGVyIGl0ZXJhYmxlcy4KLy8vCi8vLyBXaGVuIFtpdGVyYXRvcl0gaXMgcmVhZCwgYW4gW0l0ZXJhdG9yXSBpcyBjcmVhdGVkIGZvciBlYWNoIFtJdGVyYWJsZV0gaW4KLy8vIHRoZSBbSXRlcmFibGVdIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCi8vLwovLy8gQXMgbG9uZyBhcyBhbGwgdGhlc2UgaXRlcmF0b3JzIGhhdmUgYSBuZXh0IHZhbHVlLCB0aG9zZSBuZXh0IHZhbHVlcyBhcmUKLy8vIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgbGlzdCwgd2hpY2ggYmVjb21lcyB0aGUgbmV4dCB2YWx1ZSBvZiB0aGlzCi8vLyBbSXRlcmFibGVdJ3MgW0l0ZXJhdG9yXS4gQXMgc29vbiBhcyBhbnkgb2YgdGhlIGl0ZXJhdG9ycyBydW4gb3V0LAovLy8gdGhlIHppcHBlZCBpdGVyYXRvciBhbHNvIHN0b3BzLgpjbGFzcyBJdGVyYWJsZVppcDxUPiBleHRlbmRzIEl0ZXJhYmxlQmFzZTxMaXN0PFQ+PiB7CiAgZmluYWwgSXRlcmFibGU8SXRlcmFibGU8VD4+IF9pdGVyYWJsZXM7CgogIEl0ZXJhYmxlWmlwKEl0ZXJhYmxlPEl0ZXJhYmxlPFQ+PiBpdGVyYWJsZXMpIDogdGhpcy5faXRlcmFibGVzID0gaXRlcmFibGVzOwoKICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IGNvbWJpbmVzIHZhbHVlcyBvZiB0aGUgaXRlcmFibGVzJyBpdGVyYXRvcnMKICAvLy8gYXMgbG9uZyBhcyB0aGV5IGFsbCBoYXZlIHZhbHVlcy4KICBJdGVyYXRvcjxMaXN0PFQ+PiBnZXQgaXRlcmF0b3IgewogICAgdmFyIGl0ZXJhdG9ycyA9IF9pdGVyYWJsZXMubWFwKCh4KSA9PiB4Lml0ZXJhdG9yKS50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgIC8vIFRPRE8obHJuKTogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhdG9yIGRpcmVjdGx5IGlmIGl0ZXJhdG9ycyBpcyBlbXB0eT8KICAgIHJldHVybiBuZXcgX0l0ZXJhdG9yWmlwPFQ+KGl0ZXJhdG9ycyk7CiAgfQp9CgpjbGFzcyBfSXRlcmF0b3JaaXA8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxMaXN0PFQ+PiB7CiAgZmluYWwgTGlzdDxJdGVyYXRvcjxUPj4gX2l0ZXJhdG9yczsKICBMaXN0PFQ+IF9jdXJyZW50OwoKICBfSXRlcmF0b3JaaXAoTGlzdDxJdGVyYXRvcjxUPj4gaXRlcmF0b3JzKSA6IF9pdGVyYXRvcnMgPSBpdGVyYXRvcnM7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX2l0ZXJhdG9ycy5pc0VtcHR5KSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9pdGVyYXRvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFfaXRlcmF0b3JzW2ldLm1vdmVOZXh0KCkpIHsKICAgICAgICBfY3VycmVudCA9IG51bGw7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICBfY3VycmVudCA9IG5ldyBMaXN0KF9pdGVyYXRvcnMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2l0ZXJhdG9ycy5sZW5ndGg7IGkrKykgewogICAgICBfY3VycmVudFtpXSA9IF9pdGVyYXRvcnNbaV0uY3VycmVudDsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgTGlzdDxUPiBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKfQo2AE5OPAEaAUYETS4ETEZGJDUqAU4BSycjT0srBAIBNSYUAUYBFCoyJxkWCAYsMisGEQQBIwIBKHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvaXRlcmFibGVfemlwLmRhcnQ/c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9wcmlvcml0eV9xdWV1ZS5kYXJ0q6cvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICJkYXJ0OmNvbGxlY3Rpb24iOwoKaW1wb3J0ICJ1dGlscy5kYXJ0IjsKCi8vLyBBIHByaW9yaXR5IHF1ZXVlIGlzIGEgcHJpb3JpdHkgYmFzZWQgd29yay1saXN0IG9mIGVsZW1lbnRzLgovLy8KLy8vIFRoZSBxdWV1ZSBhbGxvd3MgYWRkaW5nIGVsZW1lbnRzLCBhbmQgcmVtb3ZpbmcgdGhlbSBhZ2FpbiBpbiBwcmlvcml0eSBvcmRlci4KYWJzdHJhY3QgY2xhc3MgUHJpb3JpdHlRdWV1ZTxFPiB7CiAgLy8vIENyZWF0ZXMgYW4gZW1wdHkgW1ByaW9yaXR5UXVldWVdLgogIC8vLwogIC8vLyBUaGUgY3JlYXRlZCBbUHJpb3JpdHlRdWV1ZV0gaXMgYSBwbGFpbiBbSGVhcFByaW9yaXR5UXVldWVdLgogIC8vLwogIC8vLyBUaGUgW2NvbXBhcmlzb25dIGlzIGEgW0NvbXBhcmF0b3JdIHVzZWQgdG8gY29tcGFyZSB0aGUgcHJpb3JpdHkgb2YKICAvLy8gZWxlbWVudHMuIEFuIGVsZW1lbnQgdGhhdCBjb21wYXJlcyBhcyBsZXNzIHRoYW4gYW5vdGhlciBlbGVtZW50IGhhcwogIC8vLyBhIGhpZ2hlciBwcmlvcml0eS4KICAvLy8KICAvLy8gSWYgW2NvbXBhcmlzb25dIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIFtDb21wYXJhYmxlLmNvbXBhcmVdLiBJZiB0aGlzCiAgLy8vIGlzIHRoZSBjYXNlLCBgRWAgbXVzdCBpbXBsZW1lbnQgW0NvbXBhcmFibGVdLCBhbmQgdGhpcyBpcyBjaGVja2VkIGF0CiAgLy8vIHJ1bnRpbWUgZm9yIGV2ZXJ5IGNvbXBhcmlzb24uCiAgZmFjdG9yeSBQcmlvcml0eVF1ZXVlKFtpbnQgY29tcGFyaXNvbihFIGUxLCBFIGUyKV0pID0gSGVhcFByaW9yaXR5UXVldWU8RT47CgogIC8vLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlLgogIGludCBnZXQgbGVuZ3RoOwoKICAvLy8gV2hldGhlciB0aGUgcXVldWUgaXMgZW1wdHkuCiAgYm9vbCBnZXQgaXNFbXB0eTsKCiAgLy8vIFdoZXRoZXIgdGhlIHF1ZXVlIGhhcyBhbnkgZWxlbWVudHMuCiAgYm9vbCBnZXQgaXNOb3RFbXB0eTsKCiAgLy8vIENoZWNrcyBpZiBbb2JqZWN0XSBpcyBpbiB0aGUgcXVldWUuCiAgLy8vCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBmb3VuZC4KICBib29sIGNvbnRhaW5zKEUgb2JqZWN0KTsKCiAgLy8vIEFkZHMgZWxlbWVudCB0byB0aGUgcXVldWUuCiAgLy8vCiAgLy8vIFRoZSBlbGVtZW50IHdpbGwgYmVjb21lIHRoZSBuZXh0IHRvIGJlIHJlbW92ZWQgYnkgW3JlbW92ZUZpcnN0XQogIC8vLyB3aGVuIGFsbCBlbGVtZW50cyB3aXRoIGhpZ2hlciBwcmlvcml0eSBoYXZlIGJlZW4gcmVtb3ZlZC4KICB2b2lkIGFkZChFIGVsZW1lbnQpOwoKICAvLy8gQWRkcyBhbGwgW2VsZW1lbnRzXSB0byB0aGUgcXVldWUuCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpOwoKICAvLy8gUmV0dXJucyB0aGUgbmV4dCBlbGVtZW50IHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSBbcmVtb3ZlRmlyc3RdLgogIC8vLwogIC8vLyBUaGUgZWxlbWVudCBpcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS4KICAvLy8KICAvLy8gVGhlIHF1ZXVlIG11c3Qgbm90IGJlIGVtcHR5IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgogIEUgZ2V0IGZpcnN0OwoKICAvLy8gUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5LgogIC8vLwogIC8vLyBSZXBlYXRlZGx5IGNhbGxpbmcgdGhpcyBtZXRob2QsIHdpdGhvdXQgYWRkaW5nIGVsZW1lbnQgaW4gYmV0d2VlbiwKICAvLy8gaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gZWxlbWVudHMgaW4gbm9uLWRlY3JlYXNpbmcgb3JkZXIgYXMsIHNwZWNpZmllZCBieQogIC8vLyBbY29tcGFyaXNvbl0uCiAgLy8vCiAgLy8vIFRoZSBxdWV1ZSBtdXN0IG5vdCBiZSBlbXB0eSB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KICBFIHJlbW92ZUZpcnN0KCk7CgogIC8vLyBSZW1vdmVzIGFuIGVsZW1lbnQgdGhhdCBjb21wYXJlcyBlcXVhbCB0byBbZWxlbWVudF0gaW4gdGhlIHF1ZXVlLgogIC8vLwogIC8vLyBSZXR1cm5zIHRydWUgaWYgYW4gZWxlbWVudCBpcyBmb3VuZCBhbmQgcmVtb3ZlZCwKICAvLy8gYW5kIGZhbHNlIGlmIG5vIGVxdWFsIGVsZW1lbnQgaXMgZm91bmQuCiAgYm9vbCByZW1vdmUoRSBlbGVtZW50KTsKCiAgLy8vIFJlbW92ZXMgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgcXVldWUgYW5kIHJldHVybnMgdGhlbS4KICAvLy8KICAvLy8gVGhlIHJldHVybmVkIGl0ZXJhYmxlIGhhcyBubyBzcGVjaWZpZWQgb3JkZXIuCiAgSXRlcmFibGU8RT4gcmVtb3ZlQWxsKCk7CgogIC8vLyBSZW1vdmVzIGFsbCB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIHF1ZXVlLgogIHZvaWQgY2xlYXIoKTsKCiAgLy8vIFJldHVybnMgYSBsaXN0IG9mIHRoZSBlbGVtZW50cyBvZiB0aGlzIHF1ZXVlIGluIHByaW9yaXR5IG9yZGVyLgogIC8vLwogIC8vLyBUaGUgcXVldWUgaXMgbm90IG1vZGlmaWVkLgogIC8vLwogIC8vLyBUaGUgb3JkZXIgaXMgdGhlIG9yZGVyIHRoYXQgdGhlIGVsZW1lbnRzIHdvdWxkIGJlIGluIGlmIHRoZXkgd2VyZQogIC8vLyByZW1vdmVkIGZyb20gdGhpcyBxdWV1ZSB1c2luZyBbcmVtb3ZlRmlyc3RdLgogIExpc3Q8RT4gdG9MaXN0KCk7CgogIC8vLyBSZXR1cm4gYSBjb21wYXJhdG9yIGJhc2VkIHNldCB1c2luZyB0aGUgY29tcGFyYXRvciBvZiB0aGlzIHF1ZXVlLgogIC8vLwogIC8vLyBUaGUgcXVldWUgaXMgbm90IG1vZGlmaWVkLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgW1NldF0gaXMgY3VycmVudGx5IGEgW1NwbGF5VHJlZVNldF0sCiAgLy8vIGJ1dCB0aGlzIG1heSBjaGFuZ2UgYXMgb3RoZXIgb3JkZXJlZCBzZXRzIGFyZSBpbXBsZW1lbnRlZC4KICAvLy8KICAvLy8gVGhlIHNldCBjb250YWlucyBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoaXMgcXVldWUuCiAgLy8vIElmIGFuIGVsZW1lbnQgb2NjdXJzIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBxdWV1ZSwKICAvLy8gdGhlIHNldCB3aWxsIGNvbnRhaW4gaXQgb25seSBvbmNlLgogIFNldDxFPiB0b1NldCgpOwp9CgovLy8gSGVhcCBiYXNlZCBwcmlvcml0eSBxdWV1ZS4KLy8vCi8vLyBUaGUgZWxlbWVudHMgYXJlIGtlcHQgaW4gYSBoZWFwIHN0cnVjdHVyZSwKLy8vIHdoZXJlIHRoZSBlbGVtZW50IHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkgaXMgaW1tZWRpYXRlbHkgYWNjZXNzaWJsZSwKLy8vIGFuZCBtb2RpZnlpbmcgYSBzaW5nbGUgZWxlbWVudCB0YWtlcwovLy8gbG9nYXJpdGhtaWMgdGltZSBpbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9uIGF2ZXJhZ2UuCi8vLwovLy8gKiBUaGUgW2FkZF0gYW5kIFtyZW1vdmVGaXJzdF0gb3BlcmF0aW9ucyB0YWtlIGFtb3J0aXplZCBsb2dhcml0aG1pYyB0aW1lLAovLy8gICBPKGxvZyhuKSksIGJ1dCBtYXkgb2NjYXNpb25hbGx5IHRha2UgbGluZWFyIHRpbWUgd2hlbiBncm93aW5nIHRoZSBjYXBhY2l0eQovLy8gICBvZiB0aGUgaGVhcC4KLy8vICogVGhlIFthZGRBbGxdIG9wZXJhdGlvbiB3b3JrcyBhcyBkb2luZyByZXBlYXRlZCBbYWRkXSBvcGVyYXRpb25zLgovLy8gKiBUaGUgW2ZpcnN0XSBnZXR0ZXIgdGFrZXMgY29uc3RhbnQgdGltZSwgTygxKS4KLy8vICogVGhlIFtjbGVhcl0gYW5kIFtyZW1vdmVBbGxdIG1ldGhvZHMgYWxzbyB0YWtlIGNvbnN0YW50IHRpbWUsIE8oMSkuCi8vLyAqIFRoZSBbY29udGFpbnNdIGFuZCBbcmVtb3ZlXSBvcGVyYXRpb25zIG1heSBuZWVkIHRvIHNlYXJjaCB0aGUgZW50aXJlCi8vLyAgIHF1ZXVlIGZvciB0aGUgZWxlbWVudHMsIHRha2luZyBPKG4pIHRpbWUuCi8vLyAqIFRoZSBbdG9MaXN0XSBvcGVyYXRpb24gZWZmZWN0aXZlbHkgc29ydHMgdGhlIGVsZW1lbnRzLCB0YWtpbmcgTyhuKmxvZyhuKSkKLy8vICAgdGltZS4KLy8vICogVGhlIFt0b1NldF0gb3BlcmF0aW9uIGVmZmVjdGl2ZWx5IGFkZHMgZWFjaCBlbGVtZW50IHRvIHRoZSBuZXcgc2V0LCB0YWtpbmcKLy8vICAgYW4gZXhwZWN0ZWQgTyhuKmxvZyhuKSkgdGltZS4KY2xhc3MgSGVhcFByaW9yaXR5UXVldWU8RT4gaW1wbGVtZW50cyBQcmlvcml0eVF1ZXVlPEU+IHsKICAvLy8gSW5pdGlhbCBjYXBhY2l0eSBvZiBhIHF1ZXVlIHdoZW4gY3JlYXRlZCwgb3Igd2hlbiBhZGRlZCB0byBhZnRlciBhCiAgLy8vIFtjbGVhcl0uCiAgLy8vCiAgLy8vIE51bWJlciBjYW4gYmUgYW55IHBvc2l0aXZlIHZhbHVlLiBQaWNraW5nIGEgc2l6ZSB0aGF0IGdpdmVzIGEgd2hvbGUKICAvLy8gbnVtYmVyIG9mICJ0cmVlIGxldmVscyIgaW4gdGhlIGhlYXAgaXMgb25seSBkb25lIGZvciBhZXN0aGV0aWMgcmVhc29ucy4KICBzdGF0aWMgY29uc3QgaW50IF9JTklUSUFMX0NBUEFDSVRZID0gNzsKCiAgLy8vIFRoZSBjb21wYXJpc29uIGJlaW5nIHVzZWQgdG8gY29tcGFyZSB0aGUgcHJpb3JpdHkgb2YgZWxlbWVudHMuCiAgZmluYWwgQ29tcGFyYXRvcjxFPiBjb21wYXJpc29uOwoKICAvLy8gTGlzdCBpbXBsZW1lbnRhdGlvbiBvZiBhIGhlYXAuCiAgTGlzdDxFPiBfcXVldWUgPSBuZXcgTGlzdDxFPihfSU5JVElBTF9DQVBBQ0lUWSk7CgogIC8vLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcXVldWUuCiAgLy8vCiAgLy8vIFRoZSBoZWFwIGlzIGltcGxlbWVudGVkIGluIHRoZSBmaXJzdCBbX2xlbmd0aF0gZW50cmllcyBvZiBbX3F1ZXVlXS4KICBpbnQgX2xlbmd0aCA9IDA7CgogIC8vLyBDcmVhdGUgYSBuZXcgcHJpb3JpdHkgcXVldWUuCiAgLy8vCiAgLy8vIFRoZSBbY29tcGFyaXNvbl0gaXMgYSBbQ29tcGFyYXRvcl0gdXNlZCB0byBjb21wYXJlIHRoZSBwcmlvcml0eSBvZgogIC8vLyBlbGVtZW50cy4gQW4gZWxlbWVudCB0aGF0IGNvbXBhcmVzIGFzIGxlc3MgdGhhbiBhbm90aGVyIGVsZW1lbnQgaGFzCiAgLy8vIGEgaGlnaGVyIHByaW9yaXR5LgogIC8vLwogIC8vLyBJZiBbY29tcGFyaXNvbl0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gW0NvbXBhcmFibGUuY29tcGFyZV0uIElmIHRoaXMKICAvLy8gaXMgdGhlIGNhc2UsIGBFYCBtdXN0IGltcGxlbWVudCBbQ29tcGFyYWJsZV0sIGFuZCB0aGlzIGlzIGNoZWNrZWQgYXQKICAvLy8gcnVudGltZSBmb3IgZXZlcnkgY29tcGFyaXNvbi4KICBIZWFwUHJpb3JpdHlRdWV1ZShbaW50IGNvbXBhcmlzb24oRSBlMSwgRSBlMildKQogICAgICA6IGNvbXBhcmlzb24gPSBjb21wYXJpc29uID8/IGRlZmF1bHRDb21wYXJlPEU+KCk7CgogIHZvaWQgYWRkKEUgZWxlbWVudCkgewogICAgX2FkZChlbGVtZW50KTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGVsZW1lbnRzKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICBfYWRkKGVsZW1lbnQpOwogICAgfQogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIF9xdWV1ZSA9IGNvbnN0IFtdOwogICAgX2xlbmd0aCA9IDA7CiAgfQoKICBib29sIGNvbnRhaW5zKEUgb2JqZWN0KSB7CiAgICByZXR1cm4gX2xvY2F0ZShvYmplY3QpID49IDA7CiAgfQoKICBFIGdldCBmaXJzdCB7CiAgICBpZiAoX2xlbmd0aCA9PSAwKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiTm8gc3VjaCBlbGVtZW50Iik7CiAgICByZXR1cm4gX3F1ZXVlWzBdOwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfbGVuZ3RoID09IDA7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX2xlbmd0aCAhPSAwOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbGVuZ3RoOwoKICBib29sIHJlbW92ZShFIGVsZW1lbnQpIHsKICAgIGludCBpbmRleCA9IF9sb2NhdGUoZWxlbWVudCk7CiAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gZmFsc2U7CiAgICBFIGxhc3QgPSBfcmVtb3ZlTGFzdCgpOwogICAgaWYgKGluZGV4IDwgX2xlbmd0aCkgewogICAgICBpbnQgY29tcCA9IGNvbXBhcmlzb24obGFzdCwgZWxlbWVudCk7CiAgICAgIGlmIChjb21wIDw9IDApIHsKICAgICAgICBfYnViYmxlVXAobGFzdCwgaW5kZXgpOwogICAgICB9IGVsc2UgewogICAgICAgIF9idWJibGVEb3duKGxhc3QsIGluZGV4KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBJdGVyYWJsZTxFPiByZW1vdmVBbGwoKSB7CiAgICBMaXN0PEU+IHJlc3VsdCA9IF9xdWV1ZTsKICAgIGludCBsZW5ndGggPSBfbGVuZ3RoOwogICAgX3F1ZXVlID0gY29uc3QgW107CiAgICBfbGVuZ3RoID0gMDsKICAgIHJldHVybiByZXN1bHQudGFrZShsZW5ndGgpOwogIH0KCiAgRSByZW1vdmVGaXJzdCgpIHsKICAgIGlmIChfbGVuZ3RoID09IDApIHRocm93IG5ldyBTdGF0ZUVycm9yKCJObyBzdWNoIGVsZW1lbnQiKTsKICAgIEUgcmVzdWx0ID0gX3F1ZXVlWzBdOwogICAgRSBsYXN0ID0gX3JlbW92ZUxhc3QoKTsKICAgIGlmIChfbGVuZ3RoID4gMCkgewogICAgICBfYnViYmxlRG93bihsYXN0LCAwKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaXN0PEU+IHRvTGlzdCgpIHsKICAgIExpc3Q8RT4gbGlzdCA9IG5ldyBMaXN0PEU+KCkuLmxlbmd0aCA9IF9sZW5ndGg7CiAgICBsaXN0LnNldFJhbmdlKDAsIF9sZW5ndGgsIF9xdWV1ZSk7CiAgICBsaXN0LnNvcnQoY29tcGFyaXNvbik7CiAgICByZXR1cm4gbGlzdDsKICB9CgogIFNldDxFPiB0b1NldCgpIHsKICAgIFNldDxFPiBzZXQgPSBuZXcgU3BsYXlUcmVlU2V0PEU+KGNvbXBhcmlzb24pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGVuZ3RoOyBpKyspIHsKICAgICAgc2V0LmFkZChfcXVldWVbaV0pOwogICAgfQogICAgcmV0dXJuIHNldDsKICB9CgogIC8vLyBSZXR1cm5zIHNvbWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHF1ZXVlLgogIC8vLwogIC8vLyBUaGUgZm9ybWF0IGlzbid0IHNpZ25pZmljYW50LCBhbmQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiBfcXVldWUudGFrZShfbGVuZ3RoKS50b1N0cmluZygpOwogIH0KCiAgLy8vIEFkZCBlbGVtZW50IHRvIHRoZSBxdWV1ZS4KICAvLy8KICAvLy8gR3Jvd3MgdGhlIGNhcGFjaXR5IGlmIHRoZSBiYWNraW5nIGxpc3QgaXMgZnVsbC4KICB2b2lkIF9hZGQoRSBlbGVtZW50KSB7CiAgICBpZiAoX2xlbmd0aCA9PSBfcXVldWUubGVuZ3RoKSBfZ3JvdygpOwogICAgX2J1YmJsZVVwKGVsZW1lbnQsIF9sZW5ndGgrKyk7CiAgfQoKICAvLy8gRmluZCB0aGUgaW5kZXggb2YgYW4gb2JqZWN0IGluIHRoZSBoZWFwLgogIC8vLwogIC8vLyBSZXR1cm5zIC0xIGlmIHRoZSBvYmplY3QgaXMgbm90IGZvdW5kLgogIGludCBfbG9jYXRlKEUgb2JqZWN0KSB7CiAgICBpZiAoX2xlbmd0aCA9PSAwKSByZXR1cm4gLTE7CiAgICAvLyBDb3VudCBwb3NpdGlvbnMgZnJvbSBvbmUgaW5zdGVhZCBvZiB6ZXJvLiBUaGlzIGdpdmVzIHRoZSBudW1iZXJzCiAgICAvLyBzb21lIG5pY2UgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUsIGFsbCByaWdodCBjaGlsZHJlbiBhcmUgb2RkLAogICAgLy8gdGhlaXIgbGVmdCBzaWJsaW5nIGlzIGV2ZW4sIGFuZCB0aGUgcGFyZW50IGlzIGZvdW5kIGJ5IHNoaWZ0aW5nCiAgICAvLyByaWdodCBieSBvbmUuCiAgICAvLyBWYWxpZCByYW5nZSBmb3IgcG9zaXRpb24gaXMgWzEuLl9sZW5ndGhdLCBpbmNsdXNpdmUuCiAgICBpbnQgcG9zaXRpb24gPSAxOwogICAgLy8gUHJlLW9yZGVyIGRlcHRoIGZpcnN0IHNlYXJjaCwgb21pdCBjaGlsZCBub2RlcyBpZiB0aGUgY3VycmVudAogICAgLy8gbm9kZSBoYXMgbG93ZXIgcHJpb3JpdHkgdGhhbiBbb2JqZWN0XSwgYmVjYXVzZSBhbGwgbm9kZXMgbG93ZXIKICAgIC8vIGluIHRoZSBoZWFwIHdpbGwgYWxzbyBoYXZlIGxvd2VyIHByaW9yaXR5LgogICAgZG8gewogICAgICBpbnQgaW5kZXggPSBwb3NpdGlvbiAtIDE7CiAgICAgIEUgZWxlbWVudCA9IF9xdWV1ZVtpbmRleF07CiAgICAgIGludCBjb21wID0gY29tcGFyaXNvbihlbGVtZW50LCBvYmplY3QpOwogICAgICBpZiAoY29tcCA9PSAwKSByZXR1cm4gaW5kZXg7CiAgICAgIGlmIChjb21wIDwgMCkgewogICAgICAgIC8vIEVsZW1lbnQgbWF5IGJlIGluIHN1YnRyZWUuCiAgICAgICAgLy8gQ29udGludWUgd2l0aCB0aGUgbGVmdCBjaGlsZCwgaWYgaXQgaXMgdGhlcmUuCiAgICAgICAgaW50IGxlZnRDaGlsZFBvc2l0aW9uID0gcG9zaXRpb24gKiAyOwogICAgICAgIGlmIChsZWZ0Q2hpbGRQb3NpdGlvbiA8PSBfbGVuZ3RoKSB7CiAgICAgICAgICBwb3NpdGlvbiA9IGxlZnRDaGlsZFBvc2l0aW9uOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIEZpbmQgdGhlIG5leHQgcmlnaHQgc2libGluZyBvciByaWdodCBhbmNlc3RvciBzaWJsaW5nLgogICAgICBkbyB7CiAgICAgICAgd2hpbGUgKHBvc2l0aW9uLmlzT2RkKSB7CiAgICAgICAgICAvLyBXaGlsZSBwb3NpdGlvbiBpcyBhIHJpZ2h0IGNoaWxkLCBnbyB0byB0aGUgcGFyZW50LgogICAgICAgICAgcG9zaXRpb24gPj49IDE7CiAgICAgICAgfQogICAgICAgIC8vIFRoZW4gZ28gdG8gdGhlIHJpZ2h0IHNpYmxpbmcgb2YgdGhlIGxlZnQtY2hpbGQuCiAgICAgICAgcG9zaXRpb24gKz0gMTsKICAgICAgfSB3aGlsZSAocG9zaXRpb24gPiBfbGVuZ3RoKTsgLy8gSGFwcGVucyBpZiBsYXN0IGVsZW1lbnQgaXMgYSBsZWZ0IGNoaWxkLgogICAgfSB3aGlsZSAocG9zaXRpb24gIT0gMSk7IC8vIEF0IHJvb3QgYWdhaW4uIEhhcHBlbnMgZm9yIHJpZ2h0LW1vc3QgZWxlbWVudC4KICAgIHJldHVybiAtMTsKICB9CgogIEUgX3JlbW92ZUxhc3QoKSB7CiAgICBpbnQgbmV3TGVuZ3RoID0gX2xlbmd0aCAtIDE7CiAgICBFIGxhc3QgPSBfcXVldWVbbmV3TGVuZ3RoXTsKICAgIF9xdWV1ZVtuZXdMZW5ndGhdID0gbnVsbDsKICAgIF9sZW5ndGggPSBuZXdMZW5ndGg7CiAgICByZXR1cm4gbGFzdDsKICB9CgogIC8vLyBQbGFjZSBbZWxlbWVudF0gaW4gaGVhcCBhdCBbaW5kZXhdIG9yIGFib3ZlLgogIC8vLwogIC8vLyBQdXQgZWxlbWVudCBpbnRvIHRoZSBlbXB0eSBjZWxsIGF0IGBpbmRleGAuCiAgLy8vIFdoaWxlIHRoZSBgZWxlbWVudGAgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZQogIC8vLyBwYXJlbnQsIHN3YXAgaXQgd2l0aCB0aGUgcGFyZW50LgogIHZvaWQgX2J1YmJsZVVwKEUgZWxlbWVudCwgaW50IGluZGV4KSB7CiAgICB3aGlsZSAoaW5kZXggPiAwKSB7CiAgICAgIGludCBwYXJlbnRJbmRleCA9IChpbmRleCAtIDEpIH4vIDI7CiAgICAgIEUgcGFyZW50ID0gX3F1ZXVlW3BhcmVudEluZGV4XTsKICAgICAgaWYgKGNvbXBhcmlzb24oZWxlbWVudCwgcGFyZW50KSA+IDApIGJyZWFrOwogICAgICBfcXVldWVbaW5kZXhdID0gcGFyZW50OwogICAgICBpbmRleCA9IHBhcmVudEluZGV4OwogICAgfQogICAgX3F1ZXVlW2luZGV4XSA9IGVsZW1lbnQ7CiAgfQoKICAvLy8gUGxhY2UgW2VsZW1lbnRdIGluIGhlYXAgYXQgW2luZGV4XSBvciBhYm92ZS4KICAvLy8KICAvLy8gUHV0IGVsZW1lbnQgaW50byB0aGUgZW1wdHkgY2VsbCBhdCBgaW5kZXhgLgogIC8vLyBXaGlsZSB0aGUgYGVsZW1lbnRgIGhhcyBsb3dlciBwcmlvcml0eSB0aGFuIGVpdGhlciBjaGlsZCwKICAvLy8gc3dhcCBpdCB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5IGNoaWxkLgogIHZvaWQgX2J1YmJsZURvd24oRSBlbGVtZW50LCBpbnQgaW5kZXgpIHsKICAgIGludCByaWdodENoaWxkSW5kZXggPSBpbmRleCAqIDIgKyAyOwogICAgd2hpbGUgKHJpZ2h0Q2hpbGRJbmRleCA8IF9sZW5ndGgpIHsKICAgICAgaW50IGxlZnRDaGlsZEluZGV4ID0gcmlnaHRDaGlsZEluZGV4IC0gMTsKICAgICAgRSBsZWZ0Q2hpbGQgPSBfcXVldWVbbGVmdENoaWxkSW5kZXhdOwogICAgICBFIHJpZ2h0Q2hpbGQgPSBfcXVldWVbcmlnaHRDaGlsZEluZGV4XTsKICAgICAgaW50IGNvbXAgPSBjb21wYXJpc29uKGxlZnRDaGlsZCwgcmlnaHRDaGlsZCk7CiAgICAgIGludCBtaW5DaGlsZEluZGV4OwogICAgICBFIG1pbkNoaWxkOwogICAgICBpZiAoY29tcCA8IDApIHsKICAgICAgICBtaW5DaGlsZCA9IGxlZnRDaGlsZDsKICAgICAgICBtaW5DaGlsZEluZGV4ID0gbGVmdENoaWxkSW5kZXg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWluQ2hpbGQgPSByaWdodENoaWxkOwogICAgICAgIG1pbkNoaWxkSW5kZXggPSByaWdodENoaWxkSW5kZXg7CiAgICAgIH0KICAgICAgY29tcCA9IGNvbXBhcmlzb24oZWxlbWVudCwgbWluQ2hpbGQpOwogICAgICBpZiAoY29tcCA8PSAwKSB7CiAgICAgICAgX3F1ZXVlW2luZGV4XSA9IGVsZW1lbnQ7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9xdWV1ZVtpbmRleF0gPSBtaW5DaGlsZDsKICAgICAgaW5kZXggPSBtaW5DaGlsZEluZGV4OwogICAgICByaWdodENoaWxkSW5kZXggPSBpbmRleCAqIDIgKyAyOwogICAgfQogICAgaW50IGxlZnRDaGlsZEluZGV4ID0gcmlnaHRDaGlsZEluZGV4IC0gMTsKICAgIGlmIChsZWZ0Q2hpbGRJbmRleCA8IF9sZW5ndGgpIHsKICAgICAgRSBjaGlsZCA9IF9xdWV1ZVtsZWZ0Q2hpbGRJbmRleF07CiAgICAgIGludCBjb21wID0gY29tcGFyaXNvbihlbGVtZW50LCBjaGlsZCk7CiAgICAgIGlmIChjb21wID4gMCkgewogICAgICAgIF9xdWV1ZVtpbmRleF0gPSBjaGlsZDsKICAgICAgICBpbmRleCA9IGxlZnRDaGlsZEluZGV4OwogICAgICB9CiAgICB9CiAgICBfcXVldWVbaW5kZXhdID0gZWxlbWVudDsKICB9CgogIC8vLyBHcm93cyB0aGUgY2FwYWNpdHkgb2YgdGhlIGxpc3QgaG9sZGluZyB0aGUgaGVhcC4KICAvLy8KICAvLy8gQ2FsbGVkIHdoZW4gdGhlIGxpc3QgaXMgZnVsbC4KICB2b2lkIF9ncm93KCkgewogICAgaW50IG5ld0NhcGFjaXR5ID0gX3F1ZXVlLmxlbmd0aCAqIDIgKyAxOwogICAgaWYgKG5ld0NhcGFjaXR5IDwgX0lOSVRJQUxfQ0FQQUNJVFkpIG5ld0NhcGFjaXR5ID0gX0lOSVRJQUxfQ0FQQUNJVFk7CiAgICBMaXN0PEU+IG5ld1F1ZXVlID0gbmV3IExpc3Q8RT4obmV3Q2FwYWNpdHkpOwogICAgbmV3UXVldWUuc2V0UmFuZ2UoMCwgX2xlbmd0aCwgX3F1ZXVlKTsKICAgIF9xdWV1ZSA9IG5ld1F1ZXVlOwogIH0KfQqBagBOTjwBGgEVAUAEUSIoBkIGSUoZBk9LJE4BJxIBIhQBKhcBKgYsGwEhBkZAFwEoJQFHBjEGPg8BQQZJUBQGPhMBSAY3LhoBQQY0GwEwEAFGBiEGSDMUAUgGIQY4QQY3OCkSAgEfBC9LKTsETlETRzRJSzBQDFEkOUkPBkpOKgFFIgElMwEjBkoTASMGSUoZBk9LJDI4ARgTBAEmIhUGBAERFxEEARwhBAEQPxYEASQBJwEdARsiIRwbLBcgDyIIBhEEARwdGhcRIAQBFD8aHBccBhMEARU0JxsRBAETMigaBhAEATAGQhYsBAEgBjYZKyMEAS8GLRohSEZHFTwWRUYyCSAhLiMWJjkuLCgUCghACyFAGgo7F1BPDwQBFCEgHhkRBAEzBjI3JykYKiYyHhsGHQQBMwYyQC8rKSgwLC40GRIWHigPHykILBchEAggHScGLiQoLRYfIAgGHQQBNwYkES1KMSsXBAIBKnBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvcHJpb3JpdHlfcXVldWUuZGFydDtzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29sbGVjdGlvbi9saWIvc3JjL3F1ZXVlX2xpc3QuZGFydJ5RLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCi8vLyBBIGNsYXNzIHRoYXQgZWZmaWNpZW50bHkgaW1wbGVtZW50cyBib3RoIFtRdWV1ZV0gYW5kIFtMaXN0XS4KLy8gVE9ETyhud2Vpeik6IEN1cnJlbnRseSB0aGlzIGNvZGUgaXMgY29waWVkIGFsbW9zdCB2ZXJiYXRpbSBmcm9tCi8vIGRhcnQ6Y29sbGVjdGlvbi4gVGhlIG9ubHkgY2hhbmdlcyBhcmUgdG8gaW1wbGVtZW50IExpc3QgYW5kIHRvIHJlbW92ZSBtZXRob2RzCi8vIHRoYXQgYXJlIHJlZHVuZGFudCB3aXRoIExpc3RNaXhpbi4gUmVtb3ZlIG9yIHNpbXBsaWZ5IGl0IHdoZW4gaXNzdWUgMjEzMzAgaXMKLy8gZml4ZWQuCmNsYXNzIFF1ZXVlTGlzdDxFPiBleHRlbmRzIE9iamVjdCB3aXRoIExpc3RNaXhpbjxFPiBpbXBsZW1lbnRzIFF1ZXVlPEU+IHsKICAvLy8gQWRhcHRzIFtzb3VyY2VdIHRvIGJlIGEgYFF1ZXVlTGlzdDxUPmAuCiAgLy8vCiAgLy8vIEFueSB0aW1lIHRoZSBjbGFzcyB3b3VsZCBwcm9kdWNlIGFuIGVsZW1lbnQgdGhhdCBpcyBub3QgYSBbVF0sIHRoZSBlbGVtZW50CiAgLy8vIGFjY2VzcyB3aWxsIHRocm93LgogIC8vLwogIC8vLyBBbnkgdGltZSBhIFtUXSB2YWx1ZSBpcyBhdHRlbXB0ZWQgc3RvcmVkIGludG8gdGhlIGFkYXB0ZWQgY2xhc3MsIHRoZSBzdG9yZQogIC8vLyB3aWxsIHRocm93IHVubGVzcyB0aGUgdmFsdWUgaXMgYWxzbyBhbiBpbnN0YW5jZSBvZiBbU10uCiAgLy8vCiAgLy8vIElmIGFsbCBhY2Nlc3NlZCBlbGVtZW50cyBvZiBbc291cmNlXSBhcmUgYWN0dWFsbHkgaW5zdGFuY2VzIG9mIFtUXSBhbmQgaWYKICAvLy8gYWxsIGVsZW1lbnRzIHN0b3JlZCBpbiB0aGUgcmV0dXJuZWQgIGFyZSBhY3R1YWxseSBpbnN0YW5jZSBvZiBbU10sCiAgLy8vIHRoZW4gdGhlIHJldHVybmVkIGluc3RhbmNlIGNhbiBiZSB1c2VkIGFzIGEgYFF1ZXVlTGlzdDxUPmAuCiAgc3RhdGljIFF1ZXVlTGlzdDxUPiBfY2FzdEZyb208UywgVD4oUXVldWVMaXN0PFM+IHNvdXJjZSkgewogICAgcmV0dXJuIG5ldyBfQ2FzdFF1ZXVlTGlzdDxTLCBUPihzb3VyY2UpOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBfSU5JVElBTF9DQVBBQ0lUWSA9IDg7CiAgTGlzdDxFPiBfdGFibGU7CiAgaW50IF9oZWFkOwogIGludCBfdGFpbDsKCiAgLy8vIENyZWF0ZSBhbiBlbXB0eSBxdWV1ZS4KICAvLy8KICAvLy8gSWYgW2luaXRpYWxDYXBhY2l0eV0gaXMgZ2l2ZW4sIHByZXBhcmUgdGhlIHF1ZXVlIGZvciBhdCBsZWFzdCB0aGF0IG1hbnkKICAvLy8gZWxlbWVudHMuCiAgUXVldWVMaXN0KFtpbnQgaW5pdGlhbENhcGFjaXR5XSkKICAgICAgOiBfaGVhZCA9IDAsCiAgICAgICAgX3RhaWwgPSAwIHsKICAgIGlmIChpbml0aWFsQ2FwYWNpdHkgPT0gbnVsbCB8fCBpbml0aWFsQ2FwYWNpdHkgPCBfSU5JVElBTF9DQVBBQ0lUWSkgewogICAgICBpbml0aWFsQ2FwYWNpdHkgPSBfSU5JVElBTF9DQVBBQ0lUWTsKICAgIH0gZWxzZSBpZiAoIV9pc1Bvd2VyT2YyKGluaXRpYWxDYXBhY2l0eSkpIHsKICAgICAgaW5pdGlhbENhcGFjaXR5ID0gX25leHRQb3dlck9mMihpbml0aWFsQ2FwYWNpdHkpOwogICAgfQogICAgYXNzZXJ0KF9pc1Bvd2VyT2YyKGluaXRpYWxDYXBhY2l0eSkpOwogICAgX3RhYmxlID0gbmV3IExpc3Q8RT4oaW5pdGlhbENhcGFjaXR5KTsKICB9CgogIC8vIEFuIGludGVybmFsIGNvbnN0cnVjdG9yIGZvciB1c2UgYnkgX0Nhc3RRdWV1ZUxpc3QuCiAgUXVldWVMaXN0Ll8oKTsKCiAgLy8vIENyZWF0ZSBhIHF1ZXVlIGluaXRpYWxseSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiBbc291cmNlXS4KICBmYWN0b3J5IFF1ZXVlTGlzdC5mcm9tKEl0ZXJhYmxlPEU+IHNvdXJjZSkgewogICAgaWYgKHNvdXJjZSBpcyBMaXN0KSB7CiAgICAgIGludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoOwogICAgICBRdWV1ZUxpc3Q8RT4gcXVldWUgPSBuZXcgUXVldWVMaXN0KGxlbmd0aCArIDEpOwogICAgICBhc3NlcnQocXVldWUuX3RhYmxlLmxlbmd0aCA+IGxlbmd0aCk7CiAgICAgIHZhciBzb3VyY2VMaXN0ID0gc291cmNlOwogICAgICBxdWV1ZS5fdGFibGUuc2V0UmFuZ2UoMCwgbGVuZ3RoLCBzb3VyY2VMaXN0LCAwKTsKICAgICAgcXVldWUuX3RhaWwgPSBsZW5ndGg7CiAgICAgIHJldHVybiBxdWV1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgUXVldWVMaXN0PEU+KCkuLmFkZEFsbChzb3VyY2UpOwogICAgfQogIH0KCiAgLy8gQ29sbGVjdGlvbiBpbnRlcmZhY2UuCgogIHZvaWQgYWRkKEUgZWxlbWVudCkgewogICAgX2FkZChlbGVtZW50KTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBpZiAoaXRlcmFibGUgaXMgTGlzdCkgewogICAgICB2YXIgbGlzdCA9IGl0ZXJhYmxlOwogICAgICBpbnQgYWRkQ291bnQgPSBsaXN0Lmxlbmd0aDsKICAgICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAobGVuZ3RoICsgYWRkQ291bnQgPj0gX3RhYmxlLmxlbmd0aCkgewogICAgICAgIF9wcmVHcm93KGxlbmd0aCArIGFkZENvdW50KTsKICAgICAgICAvLyBBZnRlciBwcmVHcm93LCBhbGwgZWxlbWVudHMgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgbGlzdC4KICAgICAgICBfdGFibGUuc2V0UmFuZ2UobGVuZ3RoLCBsZW5ndGggKyBhZGRDb3VudCwgbGlzdCwgMCk7CiAgICAgICAgX3RhaWwgKz0gYWRkQ291bnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQWRkaW5nIGFkZENvdW50IGVsZW1lbnRzIHdvbid0IHJlYWNoIF9oZWFkLgogICAgICAgIGludCBlbmRTcGFjZSA9IF90YWJsZS5sZW5ndGggLSBfdGFpbDsKICAgICAgICBpZiAoYWRkQ291bnQgPCBlbmRTcGFjZSkgewogICAgICAgICAgX3RhYmxlLnNldFJhbmdlKF90YWlsLCBfdGFpbCArIGFkZENvdW50LCBsaXN0LCAwKTsKICAgICAgICAgIF90YWlsICs9IGFkZENvdW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbnQgcHJlU3BhY2UgPSBhZGRDb3VudCAtIGVuZFNwYWNlOwogICAgICAgICAgX3RhYmxlLnNldFJhbmdlKF90YWlsLCBfdGFpbCArIGVuZFNwYWNlLCBsaXN0LCAwKTsKICAgICAgICAgIF90YWJsZS5zZXRSYW5nZSgwLCBwcmVTcGFjZSwgbGlzdCwgZW5kU3BhY2UpOwogICAgICAgICAgX3RhaWwgPSBwcmVTcGFjZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoRSBlbGVtZW50IGluIGl0ZXJhYmxlKSBfYWRkKGVsZW1lbnQpOwogICAgfQogIH0KCiAgUXVldWVMaXN0PFQ+IGNhc3Q8VD4oKSA9PiBRdWV1ZUxpc3QuX2Nhc3RGcm9tPEUsIFQ+KHRoaXMpOwoKICBAZGVwcmVjYXRlZAogIFF1ZXVlTGlzdDxUPiByZXR5cGU8VD4oKSA9PiBjYXN0PFQ+KCk7CgogIFN0cmluZyB0b1N0cmluZygpID0+IEl0ZXJhYmxlQmFzZS5pdGVyYWJsZVRvRnVsbFN0cmluZyh0aGlzLCAieyIsICJ9Iik7CgogIC8vIFF1ZXVlIGludGVyZmFjZS4KCiAgdm9pZCBhZGRMYXN0KEUgZWxlbWVudCkgewogICAgX2FkZChlbGVtZW50KTsKICB9CgogIHZvaWQgYWRkRmlyc3QoRSBlbGVtZW50KSB7CiAgICBfaGVhZCA9IChfaGVhZCAtIDEpICYgKF90YWJsZS5sZW5ndGggLSAxKTsKICAgIF90YWJsZVtfaGVhZF0gPSBlbGVtZW50OwogICAgaWYgKF9oZWFkID09IF90YWlsKSBfZ3JvdygpOwogIH0KCiAgRSByZW1vdmVGaXJzdCgpIHsKICAgIGlmIChfaGVhZCA9PSBfdGFpbCkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIk5vIGVsZW1lbnQiKTsKICAgIEUgcmVzdWx0ID0gX3RhYmxlW19oZWFkXTsKICAgIF90YWJsZVtfaGVhZF0gPSBudWxsOwogICAgX2hlYWQgPSAoX2hlYWQgKyAxKSAmIChfdGFibGUubGVuZ3RoIC0gMSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRSByZW1vdmVMYXN0KCkgewogICAgaWYgKF9oZWFkID09IF90YWlsKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiTm8gZWxlbWVudCIpOwogICAgX3RhaWwgPSAoX3RhaWwgLSAxKSAmIChfdGFibGUubGVuZ3RoIC0gMSk7CiAgICBFIHJlc3VsdCA9IF90YWJsZVtfdGFpbF07CiAgICBfdGFibGVbX3RhaWxdID0gbnVsbDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBMaXN0IGludGVyZmFjZS4KCiAgaW50IGdldCBsZW5ndGggPT4gKF90YWlsIC0gX2hlYWQpICYgKF90YWJsZS5sZW5ndGggLSAxKTsKCiAgc2V0IGxlbmd0aChpbnQgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCJMZW5ndGggJHZhbHVlIG1heSBub3QgYmUgbmVnYXRpdmUuIik7CgogICAgaW50IGRlbHRhID0gdmFsdWUgLSBsZW5ndGg7CiAgICBpZiAoZGVsdGEgPj0gMCkgewogICAgICBpZiAoX3RhYmxlLmxlbmd0aCA8PSB2YWx1ZSkgewogICAgICAgIF9wcmVHcm93KHZhbHVlKTsKICAgICAgfQogICAgICBfdGFpbCA9IChfdGFpbCArIGRlbHRhKSAmIChfdGFibGUubGVuZ3RoIC0gMSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpbnQgbmV3VGFpbCA9IF90YWlsICsgZGVsdGE7IC8vIFtkZWx0YV0gaXMgbmVnYXRpdmUuCiAgICBpZiAobmV3VGFpbCA+PSAwKSB7CiAgICAgIF90YWJsZS5maWxsUmFuZ2UobmV3VGFpbCwgX3RhaWwsIG51bGwpOwogICAgfSBlbHNlIHsKICAgICAgbmV3VGFpbCArPSBfdGFibGUubGVuZ3RoOwogICAgICBfdGFibGUuZmlsbFJhbmdlKDAsIF90YWlsLCBudWxsKTsKICAgICAgX3RhYmxlLmZpbGxSYW5nZShuZXdUYWlsLCBfdGFibGUubGVuZ3RoLCBudWxsKTsKICAgIH0KICAgIF90YWlsID0gbmV3VGFpbDsKICB9CgogIEUgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggJGluZGV4IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLi4kbGVuZ3RoKS4iKTsKICAgIH0KCiAgICByZXR1cm4gX3RhYmxlWyhfaGVhZCArIGluZGV4KSAmIChfdGFibGUubGVuZ3RoIC0gMSldOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBFIHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggJGluZGV4IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLi4kbGVuZ3RoKS4iKTsKICAgIH0KCiAgICBfdGFibGVbKF9oZWFkICsgaW5kZXgpICYgKF90YWJsZS5sZW5ndGggLSAxKV0gPSB2YWx1ZTsKICB9CgogIC8vIEludGVybmFsIGhlbHBlciBmdW5jdGlvbnMuCgogIC8vLyBXaGV0aGVyIFtudW1iZXJdIGlzIGEgcG93ZXIgb2YgdHdvLgogIC8vLwogIC8vLyBPbmx5IHdvcmtzIGZvciBwb3NpdGl2ZSBudW1iZXJzLgogIHN0YXRpYyBib29sIF9pc1Bvd2VyT2YyKGludCBudW1iZXIpID0+IChudW1iZXIgJiAobnVtYmVyIC0gMSkpID09IDA7CgogIC8vLyBSb3VuZHMgW251bWJlcl0gdXAgdG8gdGhlIG5lYXJlc3QgcG93ZXIgb2YgMi4KICAvLy8KICAvLy8gSWYgW251bWJlcl0gaXMgYSBwb3dlciBvZiAyIGFscmVhZHksIGl0IGlzIHJldHVybmVkLgogIC8vLwogIC8vLyBPbmx5IHdvcmtzIGZvciBwb3NpdGl2ZSBudW1iZXJzLgogIHN0YXRpYyBpbnQgX25leHRQb3dlck9mMihpbnQgbnVtYmVyKSB7CiAgICBhc3NlcnQobnVtYmVyID4gMCk7CiAgICBudW1iZXIgPSAobnVtYmVyIDw8IDEpIC0gMTsKICAgIGZvciAoOzspIHsKICAgICAgaW50IG5leHROdW1iZXIgPSBudW1iZXIgJiAobnVtYmVyIC0gMSk7CiAgICAgIGlmIChuZXh0TnVtYmVyID09IDApIHJldHVybiBudW1iZXI7CiAgICAgIG51bWJlciA9IG5leHROdW1iZXI7CiAgICB9CiAgfQoKICAvLy8gQWRkcyBlbGVtZW50IGF0IGVuZCBvZiBxdWV1ZS4gVXNlZCBieSBib3RoIFthZGRdIGFuZCBbYWRkQWxsXS4KICB2b2lkIF9hZGQoRSBlbGVtZW50KSB7CiAgICBfdGFibGVbX3RhaWxdID0gZWxlbWVudDsKICAgIF90YWlsID0gKF90YWlsICsgMSkgJiAoX3RhYmxlLmxlbmd0aCAtIDEpOwogICAgaWYgKF9oZWFkID09IF90YWlsKSBfZ3JvdygpOwogIH0KCiAgLy8vIEdyb3cgdGhlIHRhYmxlIHdoZW4gZnVsbC4KICB2b2lkIF9ncm93KCkgewogICAgTGlzdDxFPiBuZXdUYWJsZSA9IG5ldyBMaXN0PEU+KF90YWJsZS5sZW5ndGggKiAyKTsKICAgIGludCBzcGxpdCA9IF90YWJsZS5sZW5ndGggLSBfaGVhZDsKICAgIG5ld1RhYmxlLnNldFJhbmdlKDAsIHNwbGl0LCBfdGFibGUsIF9oZWFkKTsKICAgIG5ld1RhYmxlLnNldFJhbmdlKHNwbGl0LCBzcGxpdCArIF9oZWFkLCBfdGFibGUsIDApOwogICAgX2hlYWQgPSAwOwogICAgX3RhaWwgPSBfdGFibGUubGVuZ3RoOwogICAgX3RhYmxlID0gbmV3VGFibGU7CiAgfQoKICBpbnQgX3dyaXRlVG9MaXN0KExpc3Q8RT4gdGFyZ2V0KSB7CiAgICBhc3NlcnQodGFyZ2V0Lmxlbmd0aCA+PSBsZW5ndGgpOwogICAgaWYgKF9oZWFkIDw9IF90YWlsKSB7CiAgICAgIGludCBsZW5ndGggPSBfdGFpbCAtIF9oZWFkOwogICAgICB0YXJnZXQuc2V0UmFuZ2UoMCwgbGVuZ3RoLCBfdGFibGUsIF9oZWFkKTsKICAgICAgcmV0dXJuIGxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGludCBmaXJzdFBhcnRTaXplID0gX3RhYmxlLmxlbmd0aCAtIF9oZWFkOwogICAgICB0YXJnZXQuc2V0UmFuZ2UoMCwgZmlyc3RQYXJ0U2l6ZSwgX3RhYmxlLCBfaGVhZCk7CiAgICAgIHRhcmdldC5zZXRSYW5nZShmaXJzdFBhcnRTaXplLCBmaXJzdFBhcnRTaXplICsgX3RhaWwsIF90YWJsZSwgMCk7CiAgICAgIHJldHVybiBfdGFpbCArIGZpcnN0UGFydFNpemU7CiAgICB9CiAgfQoKICAvLy8gR3Jvd3MgdGhlIHRhYmxlIGV2ZW4gaWYgaXQgaXMgbm90IGZ1bGwuCiAgdm9pZCBfcHJlR3JvdyhpbnQgbmV3RWxlbWVudENvdW50KSB7CiAgICBhc3NlcnQobmV3RWxlbWVudENvdW50ID49IGxlbmd0aCk7CgogICAgLy8gQWRkIDEuNXggZXh0cmEgcm9vbSB0byBlbnN1cmUgdGhhdCB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZWxlbWVudHMgYWZ0ZXIKICAgIC8vIGV4cGFuc2lvbi4KICAgIG5ld0VsZW1lbnRDb3VudCArPSBuZXdFbGVtZW50Q291bnQgPj4gMTsKICAgIGludCBuZXdDYXBhY2l0eSA9IF9uZXh0UG93ZXJPZjIobmV3RWxlbWVudENvdW50KTsKICAgIExpc3Q8RT4gbmV3VGFibGUgPSBuZXcgTGlzdDxFPihuZXdDYXBhY2l0eSk7CiAgICBfdGFpbCA9IF93cml0ZVRvTGlzdChuZXdUYWJsZSk7CiAgICBfdGFibGUgPSBuZXdUYWJsZTsKICAgIF9oZWFkID0gMDsKICB9Cn0KCmNsYXNzIF9DYXN0UXVldWVMaXN0PFMsIFQ+IGV4dGVuZHMgUXVldWVMaXN0PFQ+IHsKICBmaW5hbCBRdWV1ZUxpc3Q8Uz4gX2RlbGVnYXRlOwoKICBfQ2FzdFF1ZXVlTGlzdCh0aGlzLl9kZWxlZ2F0ZSkgOiBzdXBlci5fKCkgewogICAgX3RhYmxlID0gX2RlbGVnYXRlLl90YWJsZS5jYXN0PFQ+KCk7CiAgfQoKICBpbnQgZ2V0IF9oZWFkID0+IF9kZWxlZ2F0ZS5faGVhZDsKICBzZXQgX2hlYWQoaW50IHZhbHVlKSA9PiBfZGVsZWdhdGUuX2hlYWQgPSB2YWx1ZTsKCiAgaW50IGdldCBfdGFpbCA9PiBfZGVsZWdhdGUuX3RhaWw7CiAgc2V0IF90YWlsKGludCB2YWx1ZSkgPT4gX2RlbGVnYXRlLl90YWlsID0gdmFsdWU7Cn0KgQYATk48ARoBQUNRUApKLgZRGQZRPgZQSUI9LQQBKhINDQEdBk4QIxMUSiswOAYqKwQBOBEBRC8aIjYsHzccFA0xBgQBGwEYEwQBJhwbIiAwJUU9Gw83LiM9HREuPTgcCggNMQYEAT0BDikBSgEWARwTBAEdLx0hBAEUPB4aLxMEARM8Lx4aEwQBFQE7ARpPASAWJBkINQ4GATkYLg0gKDYGFQQBHShPBgE6BAEqKE8GATsEASABKgYnRwE0BjsGJykYIA8uKhsGBAFFGR0vIQQBIBE3JzA4DxsXBAElJRoiMRUNMThIJAYEAS4nJwFPEi02MSQXDwQCATIgAS8pBAEkMwEkMwIBJnBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvcXVldWVfbGlzdC5kYXJ0OnNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb2xsZWN0aW9uL2xpYi9zcmMvdW5pb25fc2V0LmRhcnSNYC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgppbXBvcnQgJ3VubW9kaWZpYWJsZV93cmFwcGVycy5kYXJ0JzsKCi8vLyBBIHNpbmdsZSBzZXQgdGhhdCBwcm92aWRlcyBhIHZpZXcgb2YgdGhlIHVuaW9uIG92ZXIgYSBzZXQgb2Ygc2V0cy4KLy8vCi8vLyBTaW5jZSB0aGlzIGlzIGp1c3QgYSB2aWV3LCBpdCByZWZsZWN0cyBhbGwgY2hhbmdlcyBpbiB0aGUgdW5kZXJseWluZyBzZXRzLgovLy8KLy8vIElmIGFuIGVsZW1lbnQgaXMgaW4gbXVsdGlwbGUgc2V0cyBhbmQgdGhlIG91dGVyIHNldCBpcyBvcmRlcmVkLCB0aGUgdmVyc2lvbgovLy8gaW4gdGhlIGVhcmxpZXN0IGlubmVyIHNldCBpcyBwcmVmZXJyZWQuIENvbXBvbmVudCBzZXRzIGFyZSBhc3N1bWVkIHRvIHVzZQovLy8gYD09YCBhbmQgYGhhc2hDb2RlYCBmb3IgZXF1YWxpdHkuCmNsYXNzIFVuaW9uU2V0PEU+IGV4dGVuZHMgU2V0QmFzZTxFPiB3aXRoIFVubW9kaWZpYWJsZVNldE1peGluPEU+IHsKICAvLy8gVGhlIHNldCBvZiBzZXRzIHRoYXQgdGhpcyBwcm92aWRlcyBhIHZpZXcgb2YuCiAgZmluYWwgU2V0PFNldDxFPj4gX3NldHM7CgogIC8vLyBXaGV0aGVyIHRoZSBzZXRzIGluIFtfc2V0c10gYXJlIGd1YXJhbnRlZWQgdG8gYmUgZGlzam9pbnQuCiAgZmluYWwgYm9vbCBfZGlzam9pbnQ7CgogIC8vLyBDcmVhdGVzIGEgbmV3IHNldCB0aGF0J3MgYSB2aWV3IG9mIHRoZSB1bmlvbiBvZiBhbGwgc2V0cyBpbiBbc2V0c10uCiAgLy8vCiAgLy8vIElmIGFueSBzZXRzIGluIFtzZXRzXSBjaGFuZ2UsIHRoaXMgW1VuaW9uU2V0XSByZWZsZWN0cyB0aGF0IGNoYW5nZS4gSWYgYQogIC8vLyBuZXcgc2V0IGlzIGFkZGVkIHRvIFtzZXRzXSwgdGhpcyBbVW5pb25TZXRdIHJlZmxlY3RzIHRoYXQgYXMgd2VsbC4KICAvLy8KICAvLy8gSWYgW2Rpc2pvaW50XSBpcyBgdHJ1ZWAsIHRoZW4gYWxsIGNvbXBvbmVudCBzZXRzIG11c3QgYmUgZGlzam9pbnQuIFRoYXQKICAvLy8gaXMsIHRoYXQgdGhleSBjb250YWluIG5vIGVsZW1lbnRzIGluIGNvbW1vbi4gVGhpcyBtYWtlcyBtYW55IG9wZXJhdGlvbnMKICAvLy8gaW5jbHVkaW5nIFtsZW5ndGhdIG1vcmUgZWZmaWNpZW50LiBJZiB0aGUgY29tcG9uZW50IHNldHMgdHVybiBvdXQgbm90IHRvCiAgLy8vIGJlIGRpc2pvaW50LCBzb21lIG9wZXJhdGlvbnMgbWF5IGJlaGF2ZSBpbmNvbnNpc3RlbnRseS4KICBVbmlvblNldCh0aGlzLl9zZXRzLCB7Ym9vbCBkaXNqb2ludDogZmFsc2V9KSA6IF9kaXNqb2ludCA9IGRpc2pvaW50OwoKICAvLy8gQ3JlYXRlcyBhIG5ldyBzZXQgdGhhdCdzIGEgdmlldyBvZiB0aGUgdW5pb24gb2YgYWxsIHNldHMgaW4gW3NldHNdLgogIC8vLwogIC8vLyBJZiBhbnkgc2V0cyBpbiBbc2V0c10gY2hhbmdlLCB0aGlzIFtVbmlvblNldF0gcmVmbGVjdHMgdGhhdCBjaGFuZ2UuCiAgLy8vIEhvd2V2ZXIsIHVubGlrZSBbbmV3IFVuaW9uU2V0XSwgdGhpcyBjcmVhdGVzIGEgY29weSBvZiBpdHMgcGFyYW1ldGVyLCBzbwogIC8vLyBjaGFuZ2VzIGluIFtzZXRzXSBhcmVuJ3QgcmVmbGVjdGVkIGluIHRoaXMgW1VuaW9uU2V0XS4KICAvLy8KICAvLy8gSWYgW2Rpc2pvaW50XSBpcyBgdHJ1ZWAsIHRoZW4gYWxsIGNvbXBvbmVudCBzZXRzIG11c3QgYmUgZGlzam9pbnQuIFRoYXQKICAvLy8gaXMsIHRoYXQgdGhleSBjb250YWluIG5vIGVsZW1lbnRzIGluIGNvbW1vbi4gVGhpcyBtYWtlcyBtYW55IG9wZXJhdGlvbnMKICAvLy8gaW5jbHVkaW5nIFtsZW5ndGhdIG1vcmUgZWZmaWNpZW50LiBJZiB0aGUgY29tcG9uZW50IHNldHMgdHVybiBvdXQgbm90IHRvCiAgLy8vIGJlIGRpc2pvaW50LCBzb21lIG9wZXJhdGlvbnMgbWF5IGJlaGF2ZSBpbmNvbnNpc3RlbnRseS4KICBVbmlvblNldC5mcm9tKEl0ZXJhYmxlPFNldDxFPj4gc2V0cywge2Jvb2wgZGlzam9pbnQ6IGZhbHNlfSkKICAgICAgOiB0aGlzKHNldHMudG9TZXQoKSwgZGlzam9pbnQ6IGRpc2pvaW50KTsKCiAgaW50IGdldCBsZW5ndGggPT4gX2Rpc2pvaW50CiAgICAgID8gX3NldHMuZm9sZCgwLCAobGVuZ3RoLCBzZXQpID0+IGxlbmd0aCArIHNldC5sZW5ndGgpCiAgICAgIDogX2l0ZXJhYmxlLmxlbmd0aDsKCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+IF9pdGVyYWJsZS5pdGVyYXRvcjsKCiAgLy8vIFJldHVybnMgYW4gaXRlcmFibGUgb3ZlciB0aGUgY29udGVudHMgb2YgYWxsIHRoZSBzZXRzIGluIFt0aGlzXS4KICBJdGVyYWJsZTxFPiBnZXQgX2l0ZXJhYmxlID0+CiAgICAgIF9kaXNqb2ludCA/IF9zZXRzLmV4cGFuZCgoc2V0KSA9PiBzZXQpIDogX2RlZHVwSXRlcmFibGU7CgogIC8vLyBSZXR1cm5zIGFuIGl0ZXJhYmxlIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGFsbCB0aGUgc2V0cyBpbiBbdGhpc10gdGhhdAogIC8vLyBkZS1kdXBsaWNhdGVzIGVsZW1lbnRzLgogIC8vLwogIC8vLyBJZiB0aGUgc2V0cyBhcmVuJ3QgZ3VhcmFudGVlZCB0byBiZSBkaXNqb2ludCwgdGhpcyBrZWVwcyB0cmFjayBvZiB0aGUKICAvLy8gZWxlbWVudHMgd2UndmUgYWxyZWFkeSBlbWl0dGVkIHNvIHRoYXQgd2UgY2FuIGRlLWR1cGxpY2F0ZSB0aGVtLgogIEl0ZXJhYmxlPEU+IGdldCBfZGVkdXBJdGVyYWJsZSB7CiAgICB2YXIgc2VlbiA9IG5ldyBTZXQ8RT4oKTsKICAgIHJldHVybiBfc2V0cy5leHBhbmQoKHNldCkgPT4gc2V0KS53aGVyZSgoZWxlbWVudCkgewogICAgICBpZiAoc2Vlbi5jb250YWlucyhlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgICBzZWVuLmFkZChlbGVtZW50KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KTsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpID0+IF9zZXRzLmFueSgoc2V0KSA9PiBzZXQuY29udGFpbnMoZWxlbWVudCkpOwoKICBFIGxvb2t1cChPYmplY3QgZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgcmV0dXJuIF9zZXRzCiAgICAgICAgLm1hcCgoc2V0KSA9PiBzZXQubG9va3VwKGVsZW1lbnQpKQogICAgICAgIC5maXJzdFdoZXJlKChyZXN1bHQpID0+IHJlc3VsdCAhPSBudWxsLCBvckVsc2U6ICgpID0+IG51bGwpOwogIH0KCiAgU2V0PEU+IHRvU2V0KCkgewogICAgdmFyIHJlc3VsdCA9IG5ldyBTZXQ8RT4oKTsKICAgIGZvciAodmFyIHNldCBpbiBfc2V0cykgewogICAgICByZXN1bHQuYWRkQWxsKHNldCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQpaAE5OPAEaASUBRwRPBFBOJkQ0GwFBGAFKBk9JBk5OTz5HAUoGSk89Bk5OTz4/MAEePBoBMgFHHz8BSx4GTEcjHTgwGRMIBAFOAR0mARErRQQBEx8dGgYTBAIBJXBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvdW5pb25fc2V0LmRhcnRGc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy91bm1vZGlmaWFibGVfd3JhcHBlcnMuZGFydJjxLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZW1wdHlfdW5tb2RpZmlhYmxlX3NldC5kYXJ0JzsKaW1wb3J0ICd3cmFwcGVycy5kYXJ0JzsKCmV4cG9ydCAiZGFydDpjb2xsZWN0aW9uIiBzaG93IFVubW9kaWZpYWJsZUxpc3RWaWV3LCBVbm1vZGlmaWFibGVNYXBWaWV3OwoKLy8vIEEgZml4ZWQtbGVuZ3RoIGxpc3QuCi8vLwovLy8gQSBgTm9uR3Jvd2FibGVMaXN0Vmlld2AgY29udGFpbnMgYSBbTGlzdF0gb2JqZWN0IGFuZCBlbnN1cmVzIHRoYXQKLy8vIGl0cyBsZW5ndGggZG9lcyBub3QgY2hhbmdlLgovLy8gTWV0aG9kcyB0aGF0IHdvdWxkIGNoYW5nZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0LAovLy8gc3VjaCBhcyBbYWRkXSBhbmQgW3JlbW92ZV0sIHRocm93IGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KLy8vIEFsbCBvdGhlciBtZXRob2RzIHdvcmsgZGlyZWN0bHkgb24gdGhlIHVuZGVybHlpbmcgbGlzdC4KLy8vCi8vLyBUaGlzIGNsYXNzIF9kb2VzXyBhbGxvdyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgd3JhcHBlZCBsaXN0LgovLy8gWW91IGNhbiwgZm9yIGV4YW1wbGUsIFtzb3J0XSB0aGUgbGlzdC4KLy8vIFBlcm1pdHRlZCBvcGVyYXRpb25zIGRlZmVyIHRvIHRoZSB3cmFwcGVkIGxpc3QuCmNsYXNzIE5vbkdyb3dhYmxlTGlzdFZpZXc8RT4gZXh0ZW5kcyBEZWxlZ2F0aW5nTGlzdDxFPgogICAgd2l0aCBOb25Hcm93YWJsZUxpc3RNaXhpbjxFPiB7CiAgTm9uR3Jvd2FibGVMaXN0VmlldyhMaXN0PEU+IGxpc3RCYXNlKSA6IHN1cGVyKGxpc3RCYXNlKTsKfQoKLy8vIE1peGluIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIHRocm93aW5nIHZlcnNpb24gb2YgYWxsIGxpc3Qgb3BlcmF0aW9ucyB0aGF0Ci8vLyBjaGFuZ2UgdGhlIExpc3QncyBsZW5ndGguCmFic3RyYWN0IGNsYXNzIE5vbkdyb3dhYmxlTGlzdE1peGluPEU+IGltcGxlbWVudHMgTGlzdDxFPiB7CiAgc3RhdGljIFQgX3Rocm93PFQ+KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkNhbm5vdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGFyZSBkaXNhbGxvd2VkLgogIHNldCBsZW5ndGgoaW50IG5ld0xlbmd0aCkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXJlIGRpc2FsbG93ZWQuCiAgYm9vbCBhZGQoRSB2YWx1ZSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gaXRlcmFibGUpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGFyZSBkaXNhbGxvd2VkLgogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRSBlbGVtZW50KSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIGluc2VydEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICBib29sIHJlbW92ZShPYmplY3QgdmFsdWUpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGFyZSBkaXNhbGxvd2VkLgogIEUgcmVtb3ZlQXQoaW50IGluZGV4KSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICBFIHJlbW92ZUxhc3QoKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIHJlbW92ZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCByZXBsYWNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCBjbGVhcigpID0+IF90aHJvdygpOwp9CgovLy8gQW4gdW5tb2RpZmlhYmxlIHNldC4KLy8vCi8vLyBBbiBVbm1vZGlmaWFibGVTZXRWaWV3IGNvbnRhaW5zIGEgW1NldF0gb2JqZWN0IGFuZCBlbnN1cmVzCi8vLyB0aGF0IGl0IGRvZXMgbm90IGNoYW5nZS4KLy8vIE1ldGhvZHMgdGhhdCB3b3VsZCBjaGFuZ2UgdGhlIHNldCwKLy8vIHN1Y2ggYXMgW2FkZF0gYW5kIFtyZW1vdmVdLCB0aHJvdyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0uCi8vLyBQZXJtaXR0ZWQgb3BlcmF0aW9ucyBkZWZlciB0byB0aGUgd3JhcHBlZCBzZXQuCmNsYXNzIFVubW9kaWZpYWJsZVNldFZpZXc8RT4gZXh0ZW5kcyBEZWxlZ2F0aW5nU2V0PEU+CiAgICB3aXRoIFVubW9kaWZpYWJsZVNldE1peGluPEU+IHsKICBVbm1vZGlmaWFibGVTZXRWaWV3KFNldDxFPiBzZXRCYXNlKSA6IHN1cGVyKHNldEJhc2UpOwoKICAvLy8gQW4gdW5tb2RpZmlhYmxlIGVtcHR5IHNldC4KICAvLy8KICAvLy8gVGhpcyBpcyB0aGUgc2FtZSBhcyBgbmV3IFVubW9kaWZpYWJsZVNldFZpZXcobmV3IFNldCgpKWAsIGV4Y2VwdCB0aGF0IGl0CiAgLy8vIGNhbiBiZSB1c2VkIGluIGNvbnN0IGNvbnRleHRzLgogIGNvbnN0IGZhY3RvcnkgVW5tb2RpZmlhYmxlU2V0Vmlldy5lbXB0eSgpID0gRW1wdHlVbm1vZGlmaWFibGVTZXQ8RT47Cn0KCi8vLyBNaXhpbiBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSB0aHJvd2luZyB2ZXJzaW9uIG9mIGFsbCBzZXQgb3BlcmF0aW9ucyB0aGF0Ci8vLyBjaGFuZ2UgdGhlIFNldC4KYWJzdHJhY3QgY2xhc3MgVW5tb2RpZmlhYmxlU2V0TWl4aW48RT4gaW1wbGVtZW50cyBTZXQ8RT4gewogIHN0YXRpYyBUIF90aHJvdzxUPigpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBTZXQiKTsKICB9CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBzZXQgYXJlIGRpc2FsbG93ZWQuCiAgYm9vbCBhZGQoRSB2YWx1ZSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBzZXQgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgc2V0IGFyZSBkaXNhbGxvd2VkLgogIGJvb2wgcmVtb3ZlKE9iamVjdCB2YWx1ZSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBzZXQgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCByZW1vdmVBbGwoSXRlcmFibGUgZWxlbWVudHMpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgc2V0IGFyZSBkaXNhbGxvd2VkLgogIHZvaWQgcmV0YWluQWxsKEl0ZXJhYmxlIGVsZW1lbnRzKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIHNldCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIHNldCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIHNldCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIGNsZWFyKCkgPT4gX3Rocm93KCk7Cn0KCi8vLyBNaXhpbiBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSB0aHJvd2luZyB2ZXJzaW9uIG9mIGFsbCBtYXAgb3BlcmF0aW9ucyB0aGF0Ci8vLyBjaGFuZ2UgdGhlIE1hcC4KYWJzdHJhY3QgY2xhc3MgVW5tb2RpZmlhYmxlTWFwTWl4aW48SywgVj4gaW1wbGVtZW50cyBNYXA8SywgVj4gewogIHN0YXRpYyBUIF90aHJvdzxUPigpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBNYXAiKTsKICB9CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBtYXAgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbWFwIGFyZSBkaXNhbGxvd2VkLgogIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgaWZBYnNlbnQoKSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBtYXAgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCBhZGRBbGwoTWFwPEssIFY+IG90aGVyKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIG1hcCBhcmUgZGlzYWxsb3dlZC4KICBWIHJlbW92ZShPYmplY3Qga2V5KSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIG1hcCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIGNsZWFyKCkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBtYXAgYXJlIGRpc2FsbG93ZWQuCiAgc2V0IGZpcnN0KF8pID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbWFwIGFyZSBkaXNhbGxvd2VkLgogIHNldCBsYXN0KF8pID0+IF90aHJvdygpOwp9CoC1AE5OPAEmGAFJARkERiA2PTwESSs0NyM7AgFPHjwZIDwEASREKQEkRCEBJEQxASREMQEkRD8BJEQpASREJQEkRB4BJEQ2ASRENgEkRDQBJERLASREHAIBGQQ/HSc9MzYjOAEhBk8lRwIBThQ7GUUEASQ1IQEkNTEBJDUpASQ1MQEkNTEBJDU2ASQ1NgEkNRwCAU4UQRlFBAEkNTEBJDUyASQ1LAEkNSQBJDUcASQ1HAEkNRsCATFwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL3VubW9kaWZpYWJsZV93cmFwcGVycy5kYXJ0RXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb2xsZWN0aW9uL2xpYi9zcmMvdW5pb25fc2V0X2NvbnRyb2xsZXIuZGFydIdQLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAndW5pb25fc2V0LmRhcnQnOwoKLy8vIEEgY29udHJvbGxlciB0aGF0IGV4cG9zZXMgYSB2aWV3IG9mIHRoZSB1bmlvbiBvZiBhIGNvbGxlY3Rpb24gb2Ygc2V0cy4KLy8vCi8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgY2xhc3MgZm9yIGNyZWF0aW5nIGEgW1VuaW9uU2V0XSB3aG9zZSBjb250ZW50cyBjaGFuZ2UKLy8vIG92ZXIgdGhlIGxpZmV0aW1lIG9mIGEgY2xhc3MuIEZvciBleGFtcGxlOgovLy8KLy8vIGBgYGRhcnQKLy8vIGNsYXNzIEVuZ2luZSB7Ci8vLyAgIFNldDxUZXN0PiBnZXQgYWN0aXZlVGVzdHMgPT4gX2FjdGl2ZVRlc3RzR3JvdXAuc2V0OwovLy8gICBmaW5hbCBfYWN0aXZlVGVzdHNHcm91cCA9IG5ldyBVbmlvblNldENvbnRyb2xsZXI8VGVzdD4oKTsKLy8vCi8vLyAgIHZvaWQgYWRkU3VpdGUoU3VpdGUgc3VpdGUpIHsKLy8vICAgICBfYWN0aXZlVGVzdHNHcm91cC5hZGQoc3VpdGUudGVzdHMpOwovLy8gICAgIF9ydW5TdWl0ZShzdWl0ZSk7Ci8vLyAgICAgX2FjdGl2ZVRlc3RzR3JvdXAucmVtb3ZlKHN1aXRlLnRlc3RzKTsKLy8vICAgfQovLy8gfQovLy8gYGBgCmNsYXNzIFVuaW9uU2V0Q29udHJvbGxlcjxFPiB7CiAgLy8vIFRoZSBbVW5pb25TZXRdIHRoYXQgcHJvdmlkZXMgYSB2aWV3IG9mIHRoZSB1bmlvbiBvZiBzZXRzIGluIFt0aGlzXS4KICBVbmlvblNldDxFPiBnZXQgc2V0ID0+IF9zZXQ7CiAgVW5pb25TZXQ8RT4gX3NldDsKCiAgLy8vIFRoZSBzZXRzIHdob3NlIHVuaW9uIGlzIGV4cG9zZWQgdGhyb3VnaCBbc2V0XS4KICBmaW5hbCBfc2V0cyA9IG5ldyBTZXQ8U2V0PEU+PigpOwoKICAvLy8gQ3JlYXRlcyBhIHNldCBvZiBzZXRzIHRoYXQgcHJvdmlkZXMgYSB2aWV3IG9mIHRoZSB1bmlvbiBvZiB0aG9zZSBzZXRzLgogIC8vLwogIC8vLyBJZiBbZGlzam9pbnRdIGlzIGB0cnVlYCwgdGhpcyBhc3N1bWVzIHRoYXQgYWxsIGNvbXBvbmVudCBzZXRzIGFyZQogIC8vLyBkaXNqb2ludOKAlHRoYXQgaXMsIHRoYXQgdGhleSBjb250YWluIG5vIGVsZW1lbnRzIGluIGNvbW1vbi4gVGhpcyBtYWtlcwogIC8vLyBtYW55IG9wZXJhdGlvbnMgaW5jbHVkaW5nIFtsZW5ndGhdIG1vcmUgZWZmaWNpZW50LgogIFVuaW9uU2V0Q29udHJvbGxlcih7Ym9vbCBkaXNqb2ludDogZmFsc2V9KSB7CiAgICBfc2V0ID0gbmV3IFVuaW9uU2V0PEU+KF9zZXRzLCBkaXNqb2ludDogZGlzam9pbnQpOwogIH0KCiAgLy8vIEFkZHMgdGhlIGNvbnRlbnRzIG9mIFtjb21wb25lbnRdIHRvIFtzZXRdLgogIC8vLwogIC8vLyBJZiB0aGUgY29udGVudHMgb2YgW2NvbXBvbmVudF0gY2hhbmdlIG92ZXIgdGltZSwgW3NldF0gd2lsbCBjaGFuZ2UKICAvLy8gYWNjb3JkaW5nbHkuCiAgdm9pZCBhZGQoU2V0PEU+IGNvbXBvbmVudCkgewogICAgX3NldHMuYWRkKGNvbXBvbmVudCk7CiAgfQoKICAvLy8gUmVtb3ZlcyB0aGUgY29udGVudHMgb2YgW2NvbXBvbmVudF0gdG8gW3NldF0uCiAgLy8vCiAgLy8vIElmIGFub3RoZXIgc2V0IGluIFt0aGlzXSBoYXMgb3ZlcmxhcHBpbmcgZWxlbWVudHMgd2l0aCBbY29tcG9uZW50XSwgdGhvc2UKICAvLy8gZWxlbWVudHMgd2lsbCByZW1haW4gaW4gW3NldF0uCiAgYm9vbCByZW1vdmUoU2V0PEU+IGNvbXBvbmVudCkgPT4gX3NldHMucmVtb3ZlKGNvbXBvbmVudCk7Cn0KOABOTjwBGQFLBFAvBAwTOkAEIywaLwgGCB5KHxQBNSMBTQZITDkvNwQBMQZJEx8aBAE0BlAlPAIBMHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvdW5pb25fc2V0X2NvbnRyb2xsZXIuZGFydDlzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29sbGVjdGlvbi9saWIvc3JjL3dyYXBwZXJzLmRhcnTAAFOELy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIjsKaW1wb3J0ICJkYXJ0Om1hdGgiIGFzIG1hdGg7CgppbXBvcnQgInVubW9kaWZpYWJsZV93cmFwcGVycy5kYXJ0IjsKCnR5cGVkZWYgSyBfS2V5Rm9yVmFsdWU8SywgVj4oViB2YWx1ZSk7CgovLy8gQSBiYXNlIGNsYXNzIGZvciBkZWxlZ2F0aW5nIGl0ZXJhYmxlcy4KLy8vCi8vLyBTdWJjbGFzc2VzIGNhbiBwcm92aWRlIGEgW19iYXNlXSB0aGF0IHNob3VsZCBiZSBkZWxlZ2F0ZWQgdG8uIFVubGlrZQovLy8gW0RlbGVnYXRpbmdJdGVyYWJsZV0sIHRoaXMgYWxsb3dzIHRoZSBiYXNlIHRvIGJlIGNyZWF0ZWQgb24gZGVtYW5kLgphYnN0cmFjdCBjbGFzcyBfRGVsZWdhdGluZ0l0ZXJhYmxlQmFzZTxFPiBpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+IHsKICBJdGVyYWJsZTxFPiBnZXQgX2Jhc2U7CgogIGNvbnN0IF9EZWxlZ2F0aW5nSXRlcmFibGVCYXNlKCk7CgogIGJvb2wgYW55KGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfYmFzZS5hbnkodGVzdCk7CgogIEl0ZXJhYmxlPFQ+IGNhc3Q8VD4oKSA9PiBfYmFzZS5jYXN0PFQ+KCk7CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpID0+IF9iYXNlLmNvbnRhaW5zKGVsZW1lbnQpOwoKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpID0+IF9iYXNlLmVsZW1lbnRBdChpbmRleCk7CgogIGJvb2wgZXZlcnkoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IF9iYXNlLmV2ZXJ5KHRlc3QpOwoKICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihFIGVsZW1lbnQpKSA9PiBfYmFzZS5leHBhbmQoZik7CgogIEUgZ2V0IGZpcnN0ID0+IF9iYXNlLmZpcnN0OwoKICBFIGZpcnN0V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgPT4KICAgICAgX2Jhc2UuZmlyc3RXaGVyZSh0ZXN0LCBvckVsc2U6IG9yRWxzZSk7CgogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgcHJldmlvdXNWYWx1ZSwgRSBlbGVtZW50KSkgPT4KICAgICAgX2Jhc2UuZm9sZChpbml0aWFsVmFsdWUsIGNvbWJpbmUpOwoKICBJdGVyYWJsZTxFPiBmb2xsb3dlZEJ5KEl0ZXJhYmxlPEU+IG90aGVyKSA9PiBfYmFzZS5mb2xsb3dlZEJ5KG90aGVyKTsKCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihFIGVsZW1lbnQpKSA9PiBfYmFzZS5mb3JFYWNoKGYpOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF9iYXNlLmlzRW1wdHk7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX2Jhc2UuaXNOb3RFbXB0eTsKCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+IF9iYXNlLml0ZXJhdG9yOwoKICBTdHJpbmcgam9pbihbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgPT4gX2Jhc2Uuam9pbihzZXBhcmF0b3IpOwoKICBFIGdldCBsYXN0ID0+IF9iYXNlLmxhc3Q7CgogIEUgbGFzdFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pID0+CiAgICAgIF9iYXNlLmxhc3RXaGVyZSh0ZXN0LCBvckVsc2U6IG9yRWxzZSk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9iYXNlLmxlbmd0aDsKCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihFIGVsZW1lbnQpKSA9PiBfYmFzZS5tYXAoZik7CgogIEUgcmVkdWNlKEUgY29tYmluZShFIHZhbHVlLCBFIGVsZW1lbnQpKSA9PiBfYmFzZS5yZWR1Y2UoY29tYmluZSk7CgogIEBkZXByZWNhdGVkCiAgSXRlcmFibGU8VD4gcmV0eXBlPFQ+KCkgPT4gY2FzdDxUPigpOwoKICBFIGdldCBzaW5nbGUgPT4gX2Jhc2Uuc2luZ2xlOwoKICBFIHNpbmdsZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pIHsKICAgIHJldHVybiBfYmFzZS5zaW5nbGVXaGVyZSh0ZXN0LCBvckVsc2U6IG9yRWxzZSk7CiAgfQoKICBJdGVyYWJsZTxFPiBza2lwKGludCBuKSA9PiBfYmFzZS5za2lwKG4pOwoKICBJdGVyYWJsZTxFPiBza2lwV2hpbGUoYm9vbCB0ZXN0KEUgdmFsdWUpKSA9PiBfYmFzZS5za2lwV2hpbGUodGVzdCk7CgogIEl0ZXJhYmxlPEU+IHRha2UoaW50IG4pID0+IF9iYXNlLnRha2Uobik7CgogIEl0ZXJhYmxlPEU+IHRha2VXaGlsZShib29sIHRlc3QoRSB2YWx1ZSkpID0+IF9iYXNlLnRha2VXaGlsZSh0ZXN0KTsKCiAgTGlzdDxFPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSA9PiBfYmFzZS50b0xpc3QoZ3Jvd2FibGU6IGdyb3dhYmxlKTsKCiAgU2V0PEU+IHRvU2V0KCkgPT4gX2Jhc2UudG9TZXQoKTsKCiAgSXRlcmFibGU8RT4gd2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IF9iYXNlLndoZXJlKHRlc3QpOwoKICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBfYmFzZS53aGVyZVR5cGU8VD4oKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX2Jhc2UudG9TdHJpbmcoKTsKfQoKLy8vIEFuIFtJdGVyYWJsZV0gdGhhdCBkZWxlZ2F0ZXMgYWxsIG9wZXJhdGlvbnMgdG8gYSBiYXNlIGl0ZXJhYmxlLgovLy8KLy8vIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gaGlkZSBub24tYEl0ZXJhYmxlYCBtZXRob2RzIG9mIGFuIGl0ZXJhYmxlIG9iamVjdCwKLy8vIG9yIGl0IGNhbiBiZSBleHRlbmRlZCB0byBhZGQgZXh0cmEgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgYW4gZXhpc3RpbmcKLy8vIGl0ZXJhYmxlIG9iamVjdC4KY2xhc3MgRGVsZWdhdGluZ0l0ZXJhYmxlPEU+IGV4dGVuZHMgX0RlbGVnYXRpbmdJdGVyYWJsZUJhc2U8RT4gewogIGZpbmFsIEl0ZXJhYmxlPEU+IF9iYXNlOwoKICAvLy8gQ3JlYXRlcyBhIHdyYXBwZXIgdGhhdCBmb3J3YXJkcyBvcGVyYXRpb25zIHRvIFtiYXNlXS4KICBjb25zdCBEZWxlZ2F0aW5nSXRlcmFibGUoSXRlcmFibGU8RT4gYmFzZSkgOiBfYmFzZSA9IGJhc2U7CgogIC8vLyBDcmVhdGVzIGEgd3JhcHBlciB0aGF0IGFzc2VydHMgdGhlIHR5cGVzIG9mIHZhbHVlcyBpbiBbYmFzZV0uCiAgLy8vCiAgLy8vIFRoaXMgc291bmRseSBjb252ZXJ0cyBhbiBbSXRlcmFibGVdIHdpdGhvdXQgYSBnZW5lcmljIHR5cGUgdG8gYW4KICAvLy8gYEl0ZXJhYmxlPEU+YCBieSBhc3NlcnRpbmcgdGhhdCBpdHMgZWxlbWVudHMgYXJlIGluc3RhbmNlcyBvZiBgRWAgd2hlbmV2ZXIKICAvLy8gdGhleSdyZSBhY2Nlc3NlZC4gSWYgdGhleSdyZSBub3QsIGl0IHRocm93cyBhIFtDYXN0RXJyb3JdLgogIC8vLwogIC8vLyBUaGlzIGZvcndhcmRzIGFsbCBvcGVyYXRpb25zIHRvIFtiYXNlXSwgc28gYW55IGNoYW5nZXMgaW4gW2Jhc2VdIHdpbGwgYmUKICAvLy8gcmVmbGVjdGVkIGluIFt0aGlzXS4gSWYgW2Jhc2VdIGlzIGFscmVhZHkgYW4gYEl0ZXJhYmxlPEU+YCwgaXQncyByZXR1cm5lZAogIC8vLyB1bm1vZGlmaWVkLgogIEBEZXByZWNhdGVkKCdVc2UgaXRlcmFibGUuY2FzdDxFPiBpbnN0ZWFkLicpCiAgc3RhdGljIEl0ZXJhYmxlPEU+IHR5cGVkPEU+KEl0ZXJhYmxlIGJhc2UpID0+IGJhc2UuY2FzdDxFPigpOwp9CgovLy8gQSBbTGlzdF0gdGhhdCBkZWxlZ2F0ZXMgYWxsIG9wZXJhdGlvbnMgdG8gYSBiYXNlIGxpc3QuCi8vLwovLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBoaWRlIG5vbi1gTGlzdGAgbWV0aG9kcyBvZiBhIGxpc3Qgb2JqZWN0LCBvciBpdAovLy8gY2FuIGJlIGV4dGVuZGVkIHRvIGFkZCBleHRyYSBmdW5jdGlvbmFsaXR5IG9uIHRvcCBvZiBhbiBleGlzdGluZyBsaXN0Ci8vLyBvYmplY3QuCmNsYXNzIERlbGVnYXRpbmdMaXN0PEU+IGV4dGVuZHMgRGVsZWdhdGluZ0l0ZXJhYmxlPEU+IGltcGxlbWVudHMgTGlzdDxFPiB7CiAgY29uc3QgRGVsZWdhdGluZ0xpc3QoTGlzdDxFPiBiYXNlKSA6IHN1cGVyKGJhc2UpOwoKICAvLy8gQ3JlYXRlcyBhIHdyYXBwZXIgdGhhdCBhc3NlcnRzIHRoZSB0eXBlcyBvZiB2YWx1ZXMgaW4gW2Jhc2VdLgogIC8vLwogIC8vLyBUaGlzIHNvdW5kbHkgY29udmVydHMgYSBbTGlzdF0gd2l0aG91dCBhIGdlbmVyaWMgdHlwZSB0byBhIGBMaXN0PEU+YCBieQogIC8vLyBhc3NlcnRpbmcgdGhhdCBpdHMgZWxlbWVudHMgYXJlIGluc3RhbmNlcyBvZiBgRWAgd2hlbmV2ZXIgdGhleSdyZQogIC8vLyBhY2Nlc3NlZC4gSWYgdGhleSdyZSBub3QsIGl0IHRocm93cyBhIFtDYXN0RXJyb3JdLiBOb3RlIHRoYXQgZXZlbiBpZiBhbgogIC8vLyBvcGVyYXRpb24gdGhyb3dzIGEgW0Nhc3RFcnJvcl0sIGl0IG1heSBzdGlsbCBtdXRhdGUgdGhlIHVuZGVybHlpbmcKICAvLy8gY29sbGVjdGlvbi4KICAvLy8KICAvLy8gVGhpcyBmb3J3YXJkcyBhbGwgb3BlcmF0aW9ucyB0byBbYmFzZV0sIHNvIGFueSBjaGFuZ2VzIGluIFtiYXNlXSB3aWxsIGJlCiAgLy8vIHJlZmxlY3RlZCBpbiBbdGhpc10uIElmIFtiYXNlXSBpcyBhbHJlYWR5IGEgYExpc3Q8RT5gLCBpdCdzIHJldHVybmVkCiAgLy8vIHVubW9kaWZpZWQuCiAgQERlcHJlY2F0ZWQoJ1VzZSBsaXN0LmNhc3Q8RT4gaW5zdGVhZC4nKQogIHN0YXRpYyBMaXN0PEU+IHR5cGVkPEU+KExpc3QgYmFzZSkgPT4gYmFzZS5jYXN0PEU+KCk7CgogIExpc3Q8RT4gZ2V0IF9saXN0QmFzZSA9PiBfYmFzZTsKCiAgRSBvcGVyYXRvciBbXShpbnQgaW5kZXgpID0+IF9saXN0QmFzZVtpbmRleF07CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgRSB2YWx1ZSkgewogICAgX2xpc3RCYXNlW2luZGV4XSA9IHZhbHVlOwogIH0KCiAgTGlzdDxFPiBvcGVyYXRvciArKExpc3Q8RT4gb3RoZXIpID0+IF9saXN0QmFzZSArIG90aGVyOwoKICB2b2lkIGFkZChFIHZhbHVlKSB7CiAgICBfbGlzdEJhc2UuYWRkKHZhbHVlKTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBfbGlzdEJhc2UuYWRkQWxsKGl0ZXJhYmxlKTsKICB9CgogIE1hcDxpbnQsIEU+IGFzTWFwKCkgPT4gX2xpc3RCYXNlLmFzTWFwKCk7CgogIExpc3Q8VD4gY2FzdDxUPigpID0+IF9saXN0QmFzZS5jYXN0PFQ+KCk7CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfbGlzdEJhc2UuY2xlYXIoKTsKICB9CgogIHZvaWQgZmlsbFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgW0UgZmlsbFZhbHVlXSkgewogICAgX2xpc3RCYXNlLmZpbGxSYW5nZShzdGFydCwgZW5kLCBmaWxsVmFsdWUpOwogIH0KCiAgc2V0IGZpcnN0KEUgdmFsdWUpIHsKICAgIGlmICh0aGlzLmlzRW1wdHkpIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1swXSA9IHZhbHVlOwogIH0KCiAgSXRlcmFibGU8RT4gZ2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSA9PiBfbGlzdEJhc2UuZ2V0UmFuZ2Uoc3RhcnQsIGVuZCk7CgogIGludCBpbmRleE9mKEUgZWxlbWVudCwgW2ludCBzdGFydCA9IDBdKSA9PiBfbGlzdEJhc2UuaW5kZXhPZihlbGVtZW50LCBzdGFydCk7CgogIGludCBpbmRleFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCBbaW50IHN0YXJ0ID0gMF0pID0+CiAgICAgIF9saXN0QmFzZS5pbmRleFdoZXJlKHRlc3QsIHN0YXJ0KTsKCiAgdm9pZCBpbnNlcnQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKICAgIF9saXN0QmFzZS5pbnNlcnQoaW5kZXgsIGVsZW1lbnQpOwogIH0KCiAgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIF9saXN0QmFzZS5pbnNlcnRBbGwoaW5kZXgsIGl0ZXJhYmxlKTsKICB9CgogIHNldCBsYXN0KEUgdmFsdWUpIHsKICAgIGlmICh0aGlzLmlzRW1wdHkpIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1t0aGlzLmxlbmd0aCAtIDFdID0gdmFsdWU7CiAgfQoKICBpbnQgbGFzdEluZGV4T2YoRSBlbGVtZW50LCBbaW50IHN0YXJ0XSkgPT4KICAgICAgX2xpc3RCYXNlLmxhc3RJbmRleE9mKGVsZW1lbnQsIHN0YXJ0KTsKCiAgaW50IGxhc3RJbmRleFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCBbaW50IHN0YXJ0XSkgPT4KICAgICAgX2xpc3RCYXNlLmxhc3RJbmRleFdoZXJlKHRlc3QsIHN0YXJ0KTsKCiAgc2V0IGxlbmd0aChpbnQgbmV3TGVuZ3RoKSB7CiAgICBfbGlzdEJhc2UubGVuZ3RoID0gbmV3TGVuZ3RoOwogIH0KCiAgYm9vbCByZW1vdmUoT2JqZWN0IHZhbHVlKSA9PiBfbGlzdEJhc2UucmVtb3ZlKHZhbHVlKTsKCiAgRSByZW1vdmVBdChpbnQgaW5kZXgpID0+IF9saXN0QmFzZS5yZW1vdmVBdChpbmRleCk7CgogIEUgcmVtb3ZlTGFzdCgpID0+IF9saXN0QmFzZS5yZW1vdmVMYXN0KCk7CgogIHZvaWQgcmVtb3ZlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBfbGlzdEJhc2UucmVtb3ZlUmFuZ2Uoc3RhcnQsIGVuZCk7CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBfbGlzdEJhc2UucmVtb3ZlV2hlcmUodGVzdCk7CiAgfQoKICB2b2lkIHJlcGxhY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBfbGlzdEJhc2UucmVwbGFjZVJhbmdlKHN0YXJ0LCBlbmQsIGl0ZXJhYmxlKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIF9saXN0QmFzZS5yZXRhaW5XaGVyZSh0ZXN0KTsKICB9CgogIEBkZXByZWNhdGVkCiAgTGlzdDxUPiByZXR5cGU8VD4oKSA9PiBjYXN0PFQ+KCk7CgogIEl0ZXJhYmxlPEU+IGdldCByZXZlcnNlZCA9PiBfbGlzdEJhc2UucmV2ZXJzZWQ7CgogIHZvaWQgc2V0QWxsKGludCBpbmRleCwgSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIF9saXN0QmFzZS5zZXRBbGwoaW5kZXgsIGl0ZXJhYmxlKTsKICB9CgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiBpdGVyYWJsZSwgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgX2xpc3RCYXNlLnNldFJhbmdlKHN0YXJ0LCBlbmQsIGl0ZXJhYmxlLCBza2lwQ291bnQpOwogIH0KCiAgdm9pZCBzaHVmZmxlKFttYXRoLlJhbmRvbSByYW5kb21dKSB7CiAgICBfbGlzdEJhc2Uuc2h1ZmZsZShyYW5kb20pOwogIH0KCiAgdm9pZCBzb3J0KFtpbnQgY29tcGFyZShFIGEsIEUgYildKSB7CiAgICBfbGlzdEJhc2Uuc29ydChjb21wYXJlKTsKICB9CgogIExpc3Q8RT4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgPT4gX2xpc3RCYXNlLnN1Ymxpc3Qoc3RhcnQsIGVuZCk7Cn0KCi8vLyBBIFtTZXRdIHRoYXQgZGVsZWdhdGVzIGFsbCBvcGVyYXRpb25zIHRvIGEgYmFzZSBzZXQuCi8vLwovLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBoaWRlIG5vbi1gU2V0YCBtZXRob2RzIG9mIGEgc2V0IG9iamVjdCwgb3IgaXQgY2FuCi8vLyBiZSBleHRlbmRlZCB0byBhZGQgZXh0cmEgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgYW4gZXhpc3Rpbmcgc2V0IG9iamVjdC4KY2xhc3MgRGVsZWdhdGluZ1NldDxFPiBleHRlbmRzIERlbGVnYXRpbmdJdGVyYWJsZTxFPiBpbXBsZW1lbnRzIFNldDxFPiB7CiAgY29uc3QgRGVsZWdhdGluZ1NldChTZXQ8RT4gYmFzZSkgOiBzdXBlcihiYXNlKTsKCiAgLy8vIENyZWF0ZXMgYSB3cmFwcGVyIHRoYXQgYXNzZXJ0cyB0aGUgdHlwZXMgb2YgdmFsdWVzIGluIFtiYXNlXS4KICAvLy8KICAvLy8gVGhpcyBzb3VuZGx5IGNvbnZlcnRzIGEgW1NldF0gd2l0aG91dCBhIGdlbmVyaWMgdHlwZSB0byBhIGBTZXQ8RT5gIGJ5CiAgLy8vIGFzc2VydGluZyB0aGF0IGl0cyBlbGVtZW50cyBhcmUgaW5zdGFuY2VzIG9mIGBFYCB3aGVuZXZlciB0aGV5J3JlCiAgLy8vIGFjY2Vzc2VkLiBJZiB0aGV5J3JlIG5vdCwgaXQgdGhyb3dzIGEgW0Nhc3RFcnJvcl0uIE5vdGUgdGhhdCBldmVuIGlmIGFuCiAgLy8vIG9wZXJhdGlvbiB0aHJvd3MgYSBbQ2FzdEVycm9yXSwgaXQgbWF5IHN0aWxsIG11dGF0ZSB0aGUgdW5kZXJseWluZwogIC8vLyBjb2xsZWN0aW9uLgogIC8vLwogIC8vLyBUaGlzIGZvcndhcmRzIGFsbCBvcGVyYXRpb25zIHRvIFtiYXNlXSwgc28gYW55IGNoYW5nZXMgaW4gW2Jhc2VdIHdpbGwgYmUKICAvLy8gcmVmbGVjdGVkIGluIFt0aGlzXS4gSWYgW2Jhc2VdIGlzIGFscmVhZHkgYSBgU2V0PEU+YCwgaXQncyByZXR1cm5lZAogIC8vLyB1bm1vZGlmaWVkLgogIEBEZXByZWNhdGVkKCdVc2Ugc2V0LmNhc3Q8RT4gaW5zdGVhZC4nKQogIHN0YXRpYyBTZXQ8RT4gdHlwZWQ8RT4oU2V0IGJhc2UpID0+IGJhc2UuY2FzdDxFPigpOwoKICBTZXQ8RT4gZ2V0IF9zZXRCYXNlID0+IF9iYXNlOwoKICBib29sIGFkZChFIHZhbHVlKSA9PiBfc2V0QmFzZS5hZGQodmFsdWUpOwoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBlbGVtZW50cykgewogICAgX3NldEJhc2UuYWRkQWxsKGVsZW1lbnRzKTsKICB9CgogIFNldDxUPiBjYXN0PFQ+KCkgPT4gX3NldEJhc2UuY2FzdDxUPigpOwoKICB2b2lkIGNsZWFyKCkgewogICAgX3NldEJhc2UuY2xlYXIoKTsKICB9CgogIGJvb2wgY29udGFpbnNBbGwoSXRlcmFibGU8T2JqZWN0PiBvdGhlcikgPT4gX3NldEJhc2UuY29udGFpbnNBbGwob3RoZXIpOwoKICBTZXQ8RT4gZGlmZmVyZW5jZShTZXQ8T2JqZWN0PiBvdGhlcikgPT4gX3NldEJhc2UuZGlmZmVyZW5jZShvdGhlcik7CgogIFNldDxFPiBpbnRlcnNlY3Rpb24oU2V0PE9iamVjdD4gb3RoZXIpID0+IF9zZXRCYXNlLmludGVyc2VjdGlvbihvdGhlcik7CgogIEUgbG9va3VwKE9iamVjdCBlbGVtZW50KSA9PiBfc2V0QmFzZS5sb29rdXAoZWxlbWVudCk7CgogIGJvb2wgcmVtb3ZlKE9iamVjdCB2YWx1ZSkgPT4gX3NldEJhc2UucmVtb3ZlKHZhbHVlKTsKCiAgdm9pZCByZW1vdmVBbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgX3NldEJhc2UucmVtb3ZlQWxsKGVsZW1lbnRzKTsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIF9zZXRCYXNlLnJlbW92ZVdoZXJlKHRlc3QpOwogIH0KCiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgX3NldEJhc2UucmV0YWluQWxsKGVsZW1lbnRzKTsKICB9CgogIEBkZXByZWNhdGVkCiAgU2V0PFQ+IHJldHlwZTxUPigpID0+IGNhc3Q8VD4oKTsKCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgX3NldEJhc2UucmV0YWluV2hlcmUodGVzdCk7CiAgfQoKICBTZXQ8RT4gdW5pb24oU2V0PEU+IG90aGVyKSA9PiBfc2V0QmFzZS51bmlvbihvdGhlcik7CgogIFNldDxFPiB0b1NldCgpID0+IG5ldyBEZWxlZ2F0aW5nU2V0PEU+KF9zZXRCYXNlLnRvU2V0KCkpOwp9CgovLy8gQSBbUXVldWVdIHRoYXQgZGVsZWdhdGVzIGFsbCBvcGVyYXRpb25zIHRvIGEgYmFzZSBxdWV1ZS4KLy8vCi8vLyBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGhpZGUgbm9uLWBRdWV1ZWAgbWV0aG9kcyBvZiBhIHF1ZXVlIG9iamVjdCwgb3IgaXQKLy8vIGNhbiBiZSBleHRlbmRlZCB0byBhZGQgZXh0cmEgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgYW4gZXhpc3RpbmcgcXVldWUKLy8vIG9iamVjdC4KY2xhc3MgRGVsZWdhdGluZ1F1ZXVlPEU+IGV4dGVuZHMgRGVsZWdhdGluZ0l0ZXJhYmxlPEU+IGltcGxlbWVudHMgUXVldWU8RT4gewogIGNvbnN0IERlbGVnYXRpbmdRdWV1ZShRdWV1ZTxFPiBxdWV1ZSkgOiBzdXBlcihxdWV1ZSk7CgogIC8vLyBDcmVhdGVzIGEgd3JhcHBlciB0aGF0IGFzc2VydHMgdGhlIHR5cGVzIG9mIHZhbHVlcyBpbiBbYmFzZV0uCiAgLy8vCiAgLy8vIFRoaXMgc291bmRseSBjb252ZXJ0cyBhIFtRdWV1ZV0gd2l0aG91dCBhIGdlbmVyaWMgdHlwZSB0byBhIGBRdWV1ZTxFPmAgYnkKICAvLy8gYXNzZXJ0aW5nIHRoYXQgaXRzIGVsZW1lbnRzIGFyZSBpbnN0YW5jZXMgb2YgYEVgIHdoZW5ldmVyIHRoZXkncmUKICAvLy8gYWNjZXNzZWQuIElmIHRoZXkncmUgbm90LCBpdCB0aHJvd3MgYSBbQ2FzdEVycm9yXS4gTm90ZSB0aGF0IGV2ZW4gaWYgYW4KICAvLy8gb3BlcmF0aW9uIHRocm93cyBhIFtDYXN0RXJyb3JdLCBpdCBtYXkgc3RpbGwgbXV0YXRlIHRoZSB1bmRlcmx5aW5nCiAgLy8vIGNvbGxlY3Rpb24uCiAgLy8vCiAgLy8vIFRoaXMgZm9yd2FyZHMgYWxsIG9wZXJhdGlvbnMgdG8gW2Jhc2VdLCBzbyBhbnkgY2hhbmdlcyBpbiBbYmFzZV0gd2lsbCBiZQogIC8vLyByZWZsZWN0ZWQgaW4gW3RoaXNdLiBJZiBbYmFzZV0gaXMgYWxyZWFkeSBhIGBRdWV1ZTxFPmAsIGl0J3MgcmV0dXJuZWQKICAvLy8gdW5tb2RpZmllZC4KICBARGVwcmVjYXRlZCgnVXNlIHF1ZXVlLmNhc3Q8RT4gaW5zdGVhZC4nKQogIHN0YXRpYyBRdWV1ZTxFPiB0eXBlZDxFPihRdWV1ZSBiYXNlKSA9PiBiYXNlLmNhc3Q8RT4oKTsKCiAgUXVldWU8RT4gZ2V0IF9iYXNlUXVldWUgPT4gX2Jhc2U7CgogIHZvaWQgYWRkKEUgdmFsdWUpIHsKICAgIF9iYXNlUXVldWUuYWRkKHZhbHVlKTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBfYmFzZVF1ZXVlLmFkZEFsbChpdGVyYWJsZSk7CiAgfQoKICB2b2lkIGFkZEZpcnN0KEUgdmFsdWUpIHsKICAgIF9iYXNlUXVldWUuYWRkRmlyc3QodmFsdWUpOwogIH0KCiAgdm9pZCBhZGRMYXN0KEUgdmFsdWUpIHsKICAgIF9iYXNlUXVldWUuYWRkTGFzdCh2YWx1ZSk7CiAgfQoKICBRdWV1ZTxUPiBjYXN0PFQ+KCkgPT4gX2Jhc2VRdWV1ZS5jYXN0PFQ+KCk7CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfYmFzZVF1ZXVlLmNsZWFyKCk7CiAgfQoKICBib29sIHJlbW92ZShPYmplY3Qgb2JqZWN0KSA9PiBfYmFzZVF1ZXVlLnJlbW92ZShvYmplY3QpOwoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBfYmFzZVF1ZXVlLnJlbW92ZVdoZXJlKHRlc3QpOwogIH0KCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgX2Jhc2VRdWV1ZS5yZXRhaW5XaGVyZSh0ZXN0KTsKICB9CgogIEBkZXByZWNhdGVkCiAgUXVldWU8VD4gcmV0eXBlPFQ+KCkgPT4gY2FzdDxUPigpOwoKICBFIHJlbW92ZUZpcnN0KCkgPT4gX2Jhc2VRdWV1ZS5yZW1vdmVGaXJzdCgpOwoKICBFIHJlbW92ZUxhc3QoKSA9PiBfYmFzZVF1ZXVlLnJlbW92ZUxhc3QoKTsKfQoKLy8vIEEgW01hcF0gdGhhdCBkZWxlZ2F0ZXMgYWxsIG9wZXJhdGlvbnMgdG8gYSBiYXNlIG1hcC4KLy8vCi8vLyBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGhpZGUgbm9uLWBNYXBgIG1ldGhvZHMgb2YgYW4gb2JqZWN0IHRoYXQgZXh0ZW5kcwovLy8gYE1hcGAsIG9yIGl0IGNhbiBiZSBleHRlbmRlZCB0byBhZGQgZXh0cmEgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgYW4KLy8vIGV4aXN0aW5nIG1hcCBvYmplY3QuCmNsYXNzIERlbGVnYXRpbmdNYXA8SywgVj4gaW1wbGVtZW50cyBNYXA8SywgVj4gewogIGZpbmFsIE1hcDxLLCBWPiBfYmFzZTsKCiAgY29uc3QgRGVsZWdhdGluZ01hcChNYXA8SywgVj4gYmFzZSkgOiBfYmFzZSA9IGJhc2U7CgogIC8vLyBDcmVhdGVzIGEgd3JhcHBlciB0aGF0IGFzc2VydHMgdGhlIHR5cGVzIG9mIGtleXMgYW5kIHZhbHVlcyBpbiBbYmFzZV0uCiAgLy8vCiAgLy8vIFRoaXMgc291bmRseSBjb252ZXJ0cyBhIFtNYXBdIHdpdGhvdXQgZ2VuZXJpYyB0eXBlcyB0byBhIGBNYXA8SywgVj5gIGJ5CiAgLy8vIGFzc2VydGluZyB0aGF0IGl0cyBrZXlzIGFyZSBpbnN0YW5jZXMgb2YgYEVgIGFuZCBpdHMgdmFsdWVzIGFyZSBpbnN0YW5jZXMKICAvLy8gb2YgYFZgIHdoZW5ldmVyIHRoZXkncmUgYWNjZXNzZWQuIElmIHRoZXkncmUgbm90LCBpdCB0aHJvd3MgYSBbQ2FzdEVycm9yXS4KICAvLy8gTm90ZSB0aGF0IGV2ZW4gaWYgYW4gb3BlcmF0aW9uIHRocm93cyBhIFtDYXN0RXJyb3JdLCBpdCBtYXkgc3RpbGwgbXV0YXRlCiAgLy8vIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24uCiAgLy8vCiAgLy8vIFRoaXMgZm9yd2FyZHMgYWxsIG9wZXJhdGlvbnMgdG8gW2Jhc2VdLCBzbyBhbnkgY2hhbmdlcyBpbiBbYmFzZV0gd2lsbCBiZQogIC8vLyByZWZsZWN0ZWQgaW4gW3RoaXNdLiBJZiBbYmFzZV0gaXMgYWxyZWFkeSBhIGBNYXA8SywgVj5gLCBpdCdzIHJldHVybmVkCiAgLy8vIHVubW9kaWZpZWQuCiAgQERlcHJlY2F0ZWQoJ1VzZSBtYXAuY2FzdDxLLCBWPiBpbnN0ZWFkLicpCiAgc3RhdGljIE1hcDxLLCBWPiB0eXBlZDxLLCBWPihNYXAgYmFzZSkgPT4gYmFzZS5jYXN0PEssIFY+KCk7CgogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgPT4gX2Jhc2Vba2V5XTsKCiAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpIHsKICAgIF9iYXNlW2tleV0gPSB2YWx1ZTsKICB9CgogIHZvaWQgYWRkQWxsKE1hcDxLLCBWPiBvdGhlcikgewogICAgX2Jhc2UuYWRkQWxsKG90aGVyKTsKICB9CgogIHZvaWQgYWRkRW50cmllcyhJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZW50cmllcykgewogICAgX2Jhc2UuYWRkRW50cmllcyhlbnRyaWVzKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfYmFzZS5jbGVhcigpOwogIH0KCiAgTWFwPEsyLCBWMj4gY2FzdDxLMiwgVjI+KCkgPT4gX2Jhc2UuY2FzdDxLMiwgVjI+KCk7CgogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgPT4gX2Jhc2UuY29udGFpbnNLZXkoa2V5KTsKCiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgPT4gX2Jhc2UuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CgogIEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBnZXQgZW50cmllcyA9PiBfYmFzZS5lbnRyaWVzOwoKICB2b2lkIGZvckVhY2godm9pZCBmKEsga2V5LCBWIHZhbHVlKSkgewogICAgX2Jhc2UuZm9yRWFjaChmKTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2Jhc2UuaXNFbXB0eTsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfYmFzZS5pc05vdEVtcHR5OwoKICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PiBfYmFzZS5rZXlzOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfYmFzZS5sZW5ndGg7CgogIE1hcDxLMiwgVjI+IG1hcDxLMiwgVjI+KE1hcEVudHJ5PEsyLCBWMj4gdHJhbnNmb3JtKEsga2V5LCBWIHZhbHVlKSkgPT4KICAgICAgX2Jhc2UubWFwKHRyYW5zZm9ybSk7CgogIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgaWZBYnNlbnQoKSkgPT4gX2Jhc2UucHV0SWZBYnNlbnQoa2V5LCBpZkFic2VudCk7CgogIFYgcmVtb3ZlKE9iamVjdCBrZXkpID0+IF9iYXNlLnJlbW92ZShrZXkpOwoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChLIGtleSwgViB2YWx1ZSkpID0+IF9iYXNlLnJlbW92ZVdoZXJlKHRlc3QpOwoKICBAZGVwcmVjYXRlZAogIE1hcDxLMiwgVjI+IHJldHlwZTxLMiwgVjI+KCkgPT4gY2FzdDxLMiwgVjI+KCk7CgogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgPT4gX2Jhc2UudmFsdWVzOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfYmFzZS50b1N0cmluZygpOwoKICBWIHVwZGF0ZShLIGtleSwgViB1cGRhdGUoViB2YWx1ZSksIHtWIGlmQWJzZW50KCl9KSA9PgogICAgICBfYmFzZS51cGRhdGUoa2V5LCB1cGRhdGUsIGlmQWJzZW50OiBpZkFic2VudCk7CgogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSkgPT4gX2Jhc2UudXBkYXRlQWxsKHVwZGF0ZSk7Cn0KCi8vLyBBbiB1bm1vZGlmaWFibGUgW1NldF0gdmlldyBvZiB0aGUga2V5cyBvZiBhIFtNYXBdLgovLy8KLy8vIFRoZSBzZXQgZGVsZWdhdGVzIGFsbCBvcGVyYXRpb25zIHRvIHRoZSB1bmRlcmx5aW5nIG1hcC4KLy8vCi8vLyBBIGBNYXBgIGNhbiBvbmx5IGNvbnRhaW4gZWFjaCBrZXkgb25jZSwgc28gaXRzIGtleXMgY2FuIGFsd2F5cwovLy8gYmUgdmlld2VkIGFzIGEgYFNldGAgd2l0aG91dCBhbnkgbG9zcywgZXZlbiBpZiB0aGUgW01hcC5rZXlzXQovLy8gZ2V0dGVyIG9ubHkgc2hvd3MgYW4gW0l0ZXJhYmxlXSB2aWV3IG9mIHRoZSBrZXlzLgovLy8KLy8vIE5vdGUgdGhhdCBbbG9va3VwXSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHNldC4KY2xhc3MgTWFwS2V5U2V0PEU+IGV4dGVuZHMgX0RlbGVnYXRpbmdJdGVyYWJsZUJhc2U8RT4KICAgIHdpdGggVW5tb2RpZmlhYmxlU2V0TWl4aW48RT4gewogIGZpbmFsIE1hcDxFLCBkeW5hbWljPiBfYmFzZU1hcDsKCiAgTWFwS2V5U2V0KE1hcDxFLCBkeW5hbWljPiBiYXNlKSA6IF9iYXNlTWFwID0gYmFzZTsKCiAgSXRlcmFibGU8RT4gZ2V0IF9iYXNlID0+IF9iYXNlTWFwLmtleXM7CgogIFNldDxUPiBjYXN0PFQ+KCkgewogICAgaWYgKHRoaXMgaXMgTWFwS2V5U2V0PFQ+KSB7CiAgICAgIHJldHVybiB0aGlzIGFzIE1hcEtleVNldDxUPjsKICAgIH0KICAgIHJldHVybiBTZXQuY2FzdEZyb208RSwgVD4odGhpcyk7CiAgfQoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSA9PiBfYmFzZU1hcC5jb250YWluc0tleShlbGVtZW50KTsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfYmFzZU1hcC5pc0VtcHR5OwoKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9iYXNlTWFwLmlzTm90RW1wdHk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9iYXNlTWFwLmxlbmd0aDsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gInske19iYXNlLmpvaW4oJywgJyl9fSI7CgogIGJvb2wgY29udGFpbnNBbGwoSXRlcmFibGU8T2JqZWN0PiBvdGhlcikgPT4gb3RoZXIuZXZlcnkoY29udGFpbnMpOwoKICAvLy8gUmV0dXJucyBhIG5ldyBzZXQgd2l0aCB0aGUgdGhlIGVsZW1lbnRzIG9mIFt0aGlzXSB0aGF0IGFyZSBub3QgaW4gW290aGVyXS4KICAvLy8KICAvLy8gVGhhdCBpcywgdGhlIHJldHVybmVkIHNldCBjb250YWlucyBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoaXMgW1NldF0gdGhhdCBhcmUKICAvLy8gbm90IGVsZW1lbnRzIG9mIFtvdGhlcl0gYWNjb3JkaW5nIHRvIGBvdGhlci5jb250YWluc2AuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgc2V0IHdpbGwgdXNlIHRoZSBkZWZhdWx0IGVxdWFsaXR5IG9wZXJhdGlvbiwgd2hpY2gKICAvLy8gbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBlcXVhbGl0eSBvcGVyYXRpb24gW3RoaXNdIHVzZXMuCiAgU2V0PEU+IGRpZmZlcmVuY2UoU2V0PE9iamVjdD4gb3RoZXIpID0+CiAgICAgIHdoZXJlKChlbGVtZW50KSA9PiAhb3RoZXIuY29udGFpbnMoZWxlbWVudCkpLnRvU2V0KCk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IHNldCB3aGljaCBpcyB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gW3RoaXNdIGFuZCBbb3RoZXJdLgogIC8vLwogIC8vLyBUaGF0IGlzLCB0aGUgcmV0dXJuZWQgc2V0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhpcyBbU2V0XSB0aGF0IGFyZQogIC8vLyBhbHNvIGVsZW1lbnRzIG9mIFtvdGhlcl0gYWNjb3JkaW5nIHRvIGBvdGhlci5jb250YWluc2AuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgc2V0IHdpbGwgdXNlIHRoZSBkZWZhdWx0IGVxdWFsaXR5IG9wZXJhdGlvbiwgd2hpY2gKICAvLy8gbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBlcXVhbGl0eSBvcGVyYXRpb24gW3RoaXNdIHVzZXMuCiAgU2V0PEU+IGludGVyc2VjdGlvbihTZXQ8T2JqZWN0PiBvdGhlcikgPT4gd2hlcmUob3RoZXIuY29udGFpbnMpLnRvU2V0KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdIHNpbmNlIHRoZXJlJ3Mgbm8gY29ycmVzcG9uZGluZyBtZXRob2QgZm9yCiAgLy8vIFtNYXBdcy4KICBFIGxvb2t1cChPYmplY3QgZWxlbWVudCkgPT4KICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIk1hcEtleVNldCBkb2Vzbid0IHN1cHBvcnQgbG9va3VwKCkuIik7CgogIEBkZXByZWNhdGVkCiAgU2V0PFQ+IHJldHlwZTxUPigpID0+IFNldC5jYXN0RnJvbTxFLCBUPih0aGlzKTsKCiAgLy8vIFJldHVybnMgYSBuZXcgc2V0IHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgW3RoaXNdIGFuZCBbb3RoZXJdLgogIC8vLwogIC8vLyBUaGF0IGlzLCB0aGUgcmV0dXJuZWQgc2V0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhpcyBbU2V0XSBhbmQgYWxsCiAgLy8vIHRoZSBlbGVtZW50cyBvZiBbb3RoZXJdLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHNldCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBlcXVhbGl0eSBvcGVyYXRpb24sIHdoaWNoCiAgLy8vIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgZXF1YWxpdHkgb3BlcmF0aW9uIFt0aGlzXSB1c2VzLgogIFNldDxFPiB1bmlvbihTZXQ8RT4gb3RoZXIpID0+IHRvU2V0KCkuLmFkZEFsbChvdGhlcik7Cn0KCi8vLyBDcmVhdGVzIGEgbW9kaWZpYWJsZSBbU2V0XSB2aWV3IG9mIHRoZSB2YWx1ZXMgb2YgYSBbTWFwXS4KLy8vCi8vLyBUaGUgYFNldGAgdmlldyBhc3N1bWVzIHRoYXQgdGhlIGtleXMgb2YgdGhlIGBNYXBgIGNhbiBiZSB1bmlxdWVseSBkZXRlcm1pbmVkCi8vLyBmcm9tIHRoZSB2YWx1ZXMuIFRoZSBga2V5Rm9yVmFsdWVgIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IgZmluZHMKLy8vIHRoZSBrZXkgZm9yIGEgc2luZ2xlIHZhbHVlLiBUaGUgYGtleUZvclZhbHVlYCBmdW5jdGlvbiBzaG91bGQgYmUgY29uc2lzdGVudAovLy8gd2l0aCBlcXVhbGl0eS4gSWYgYHZhbHVlMSA9PSB2YWx1ZTJgIHRoZW4gYGtleUZvclZhbHVlKHZhbHVlMSlgIGFuZAovLy8gYGtleUZvclZhbHVlKHZhbHVlMilgIHNob3VsZCBiZSBjb25zaWRlcmVkIGVxdWFsIGtleXMgYnkgdGhlIHVuZGVybHlpbmcgbWFwLAovLy8gYW5kIHZpY2UgdmVyc2EuCi8vLwovLy8gTW9kaWZ5aW5nIHRoZSBzZXQgd2lsbCBtb2RpZnkgdGhlIHVuZGVybHlpbmcgbWFwIGJhc2VkIG9uIHRoZSBrZXkgcmV0dXJuZWQKLy8vIGJ5IGBrZXlGb3JWYWx1ZWAuCi8vLwovLy8gSWYgdGhlIGBNYXBgIGNvbnRlbnRzIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBga2V5Rm9yVmFsdWVgIGZ1bmN0aW9uLAovLy8gdGhlIHNldCB3aWxsIG5vdCB3b3JrIGNvbnNpc3RlbnRseSwgYW5kIG1heSBnaXZlIG1lYW5pbmdsZXNzIHJlc3BvbnNlcyBvciBkbwovLy8gaW5jb25zaXN0ZW50IHVwZGF0ZXMuCi8vLwovLy8gVGhpcyBzZXQgY2FuLCBmb3IgZXhhbXBsZSwgYmUgdXNlZCBvbiBhIG1hcCBmcm9tIGRhdGFiYXNlIHJlY29yZCBJRHMgdG8gdGhlCi8vLyByZWNvcmRzLiBJdCBleHBvc2VzIHRoZSByZWNvcmRzIGFzIGEgc2V0LCBhbmQgYWxsb3dzIGZvciB3cml0aW5nIGJvdGgKLy8vIGByZWNvcmRTZXQuYWRkKGRhdGFiYXNlUmVjb3JkKWAgYW5kIGByZWNvcmRNYXBbaWRdYC4KLy8vCi8vLyBFZmZlY3RpdmVseSwgdGhlIG1hcCB3aWxsIGFjdCBhcyBhIGtpbmQgb2YgaW5kZXggZm9yIHRoZSBzZXQuCmNsYXNzIE1hcFZhbHVlU2V0PEssIFY+IGV4dGVuZHMgX0RlbGVnYXRpbmdJdGVyYWJsZUJhc2U8Vj4gaW1wbGVtZW50cyBTZXQ8Vj4gewogIGZpbmFsIE1hcDxLLCBWPiBfYmFzZU1hcDsKICBmaW5hbCBfS2V5Rm9yVmFsdWU8SywgVj4gX2tleUZvclZhbHVlOwoKICAvLy8gQ3JlYXRlcyBhIG5ldyBbTWFwVmFsdWVTZXRdIGJhc2VkIG9uIFtiYXNlXS4KICAvLy8KICAvLy8gW2tleUZvclZhbHVlXSByZXR1cm5zIHRoZSBrZXkgaW4gdGhlIG1hcCB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGgKICAvLy8gdGhlIGdpdmVuIHZhbHVlLiBUaGUgc2V0J3Mgbm90aW9uIG9mIGVxdWFsaXR5IGlzIGlkZW50aWNhbCB0byB0aGUgZXF1YWxpdHkKICAvLy8gb2YgdGhlIHJldHVybiB2YWx1ZXMgb2YgW2tleUZvclZhbHVlXS4KICBNYXBWYWx1ZVNldChNYXA8SywgVj4gYmFzZSwgSyBrZXlGb3JWYWx1ZShWIHZhbHVlKSkKICAgICAgOiBfYmFzZU1hcCA9IGJhc2UsCiAgICAgICAgX2tleUZvclZhbHVlID0ga2V5Rm9yVmFsdWU7CgogIEl0ZXJhYmxlPFY+IGdldCBfYmFzZSA9PiBfYmFzZU1hcC52YWx1ZXM7CgogIFNldDxUPiBjYXN0PFQ+KCkgewogICAgaWYgKHRoaXMgaXMgU2V0PFQ+KSB7CiAgICAgIHJldHVybiB0aGlzIGFzIFNldDxUPjsKICAgIH0KICAgIHJldHVybiBTZXQuY2FzdEZyb208ViwgVD4odGhpcyk7CiAgfQoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSB7CiAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaXMhIFYpIHJldHVybiBmYWxzZTsKICAgIHZhciBrZXkgPSBfa2V5Rm9yVmFsdWUoZWxlbWVudCBhcyBWKTsKCiAgICByZXR1cm4gX2Jhc2VNYXAuY29udGFpbnNLZXkoa2V5KTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2Jhc2VNYXAuaXNFbXB0eTsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfYmFzZU1hcC5pc05vdEVtcHR5OwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfYmFzZU1hcC5sZW5ndGg7CgogIFN0cmluZyB0b1N0cmluZygpID0+IHRvU2V0KCkudG9TdHJpbmcoKTsKCiAgYm9vbCBhZGQoViB2YWx1ZSkgewogICAgSyBrZXkgPSBfa2V5Rm9yVmFsdWUodmFsdWUpOwogICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKICAgIF9iYXNlTWFwLnB1dElmQWJzZW50KGtleSwgKCkgewogICAgICByZXN1bHQgPSB0cnVlOwogICAgICByZXR1cm4gdmFsdWU7CiAgICB9KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxWPiBlbGVtZW50cykgPT4gZWxlbWVudHMuZm9yRWFjaChhZGQpOwoKICB2b2lkIGNsZWFyKCkgPT4gX2Jhc2VNYXAuY2xlYXIoKTsKCiAgYm9vbCBjb250YWluc0FsbChJdGVyYWJsZTxPYmplY3Q+IG90aGVyKSA9PiBvdGhlci5ldmVyeShjb250YWlucyk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IHNldCB3aXRoIHRoZSB0aGUgZWxlbWVudHMgb2YgW3RoaXNdIHRoYXQgYXJlIG5vdCBpbiBbb3RoZXJdLgogIC8vLwogIC8vLyBUaGF0IGlzLCB0aGUgcmV0dXJuZWQgc2V0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhpcyBbU2V0XSB0aGF0IGFyZQogIC8vLyBub3QgZWxlbWVudHMgb2YgW290aGVyXSBhY2NvcmRpbmcgdG8gYG90aGVyLmNvbnRhaW5zYC4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBzZXQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgZXF1YWxpdHkgb3BlcmF0aW9uLCB3aGljaAogIC8vLyBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIGVxdWFsaXR5IG9wZXJhdGlvbiBbdGhpc10gdXNlcy4KICBTZXQ8Vj4gZGlmZmVyZW5jZShTZXQ8T2JqZWN0PiBvdGhlcikgPT4KICAgICAgd2hlcmUoKGVsZW1lbnQpID0+ICFvdGhlci5jb250YWlucyhlbGVtZW50KSkudG9TZXQoKTsKCiAgLy8vIFJldHVybnMgYSBuZXcgc2V0IHdoaWNoIGlzIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiBbdGhpc10gYW5kIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFRoYXQgaXMsIHRoZSByZXR1cm5lZCBzZXQgY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGlzIFtTZXRdIHRoYXQgYXJlCiAgLy8vIGFsc28gZWxlbWVudHMgb2YgW290aGVyXSBhY2NvcmRpbmcgdG8gYG90aGVyLmNvbnRhaW5zYC4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBzZXQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgZXF1YWxpdHkgb3BlcmF0aW9uLCB3aGljaAogIC8vLyBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIGVxdWFsaXR5IG9wZXJhdGlvbiBbdGhpc10gdXNlcy4KICBTZXQ8Vj4gaW50ZXJzZWN0aW9uKFNldDxPYmplY3Q+IG90aGVyKSA9PiB3aGVyZShvdGhlci5jb250YWlucykudG9TZXQoKTsKCiAgViBsb29rdXAoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpcyEgVikgcmV0dXJuIG51bGw7CiAgICB2YXIga2V5ID0gX2tleUZvclZhbHVlKGVsZW1lbnQgYXMgVik7CgogICAgcmV0dXJuIF9iYXNlTWFwW2tleV07CiAgfQoKICBib29sIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50IGlzISBWKSByZXR1cm4gZmFsc2U7CiAgICB2YXIga2V5ID0gX2tleUZvclZhbHVlKGVsZW1lbnQgYXMgVik7CgogICAgaWYgKCFfYmFzZU1hcC5jb250YWluc0tleShrZXkpKSByZXR1cm4gZmFsc2U7CiAgICBfYmFzZU1hcC5yZW1vdmUoa2V5KTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgdm9pZCByZW1vdmVBbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgPT4gZWxlbWVudHMuZm9yRWFjaChyZW1vdmUpOwoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChWIGVsZW1lbnQpKSB7CiAgICB2YXIgdG9SZW1vdmUgPSBbXTsKICAgIF9iYXNlTWFwLmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKHRlc3QodmFsdWUpKSB0b1JlbW92ZS5hZGQoa2V5KTsKICAgIH0pOwogICAgdG9SZW1vdmUuZm9yRWFjaChfYmFzZU1hcC5yZW1vdmUpOwogIH0KCiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgdmFyIHZhbHVlc1RvUmV0YWluID0gbmV3IFNldDxWPi5pZGVudGl0eSgpOwogICAgZm9yICh2YXIgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaXMhIFYpIGNvbnRpbnVlOwogICAgICB2YXIga2V5ID0gX2tleUZvclZhbHVlKGVsZW1lbnQgYXMgVik7CgogICAgICBpZiAoIV9iYXNlTWFwLmNvbnRhaW5zS2V5KGtleSkpIGNvbnRpbnVlOwogICAgICB2YWx1ZXNUb1JldGFpbi5hZGQoX2Jhc2VNYXBba2V5XSk7CiAgICB9CgogICAgdmFyIGtleXNUb1JlbW92ZSA9IFtdOwogICAgX2Jhc2VNYXAuZm9yRWFjaCgoaywgdikgewogICAgICBpZiAoIXZhbHVlc1RvUmV0YWluLmNvbnRhaW5zKHYpKSBrZXlzVG9SZW1vdmUuYWRkKGspOwogICAgfSk7CiAgICBrZXlzVG9SZW1vdmUuZm9y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IFBvcnRpb25zIG9mIHRoZSBjb2RlIGluIHRoaXMgbGlicmFyeSB3YXMgYWRhcHRlZCBmcm9tCi8vLyBgcGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2NvbGxlY3Rpb25fdXRpbGl0aWVzLmRhcnRgLgovLyBUT0RPKHNpZ211bmQpOiBtb3ZlIHRoaXMgaW50byBhIHNoYXJlZCBwbGFjZSwgbGlrZSBxdWl2ZXI/CmxpYnJhcnkgZGFydDJqc19pbmZvLnNyYy5ncmFwaDsKCmltcG9ydCAnZGFydDptYXRoJyBhcyBtYXRoOwoKYWJzdHJhY3QgY2xhc3MgR3JhcGg8Tj4gewogIEl0ZXJhYmxlPE4+IGdldCBub2RlczsKICBib29sIGdldCBpc0VtcHR5OwogIGludCBnZXQgbm9kZUNvdW50OwogIEl0ZXJhYmxlPE4+IHRhcmdldHNPZihOIHNvdXJjZSk7CiAgSXRlcmFibGU8Tj4gc291cmNlc09mKE4gc291cmNlKTsKCiAgLy8vIFJ1biBhIHRvcG9sb2dpY2FsIHNvcnQgb2YgdGhlIGdyYXBoLiBTaW5jZSB0aGUgZ3JhcGggbWF5IGNvbnRhaW4gY3ljbGVzLAogIC8vLyB0aGlzIHJlc3VsdHMgaW4gYSBsaXN0IG9mIHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIHJhdGhlciB0aGFuIGEgbGlzdAogIC8vLyBvZiBub2Rlcy4gVGhlIG5vZGVzIGluIGVhY2ggc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmVudHMgb25seSBoYXZlIGVkZ2VzCiAgLy8vIHRoYXQgcG9pbnQgdG8gbm9kZXMgaW4gdGhlIHNhbWUgY29tcG9uZW50IG9yIGVhcmxpZXIgY29tcG9uZW50cy4KICBMaXN0PExpc3Q8Tj4+IGNvbXB1dGVUb3BvbG9naWNhbFNvcnQoKSB7CiAgICBfU2NjRmluZGVyPE4+IGZpbmRlciA9IG5ldyBfU2NjRmluZGVyPE4+KHRoaXMpOwogICAgcmV0dXJuIGZpbmRlci5jb21wdXRlVG9wb2xvZ2ljYWxTb3J0KCk7CiAgfQoKICAvLy8gV2hldGhlciBbc291cmNlXSBjYW4gdHJhbnNpdGl2ZWx5IHJlYWNoIFt0YXJnZXRdLgogIGJvb2wgY29udGFpbnNQYXRoKE4gc291cmNlLCBOIHRhcmdldCkgewogICAgU2V0PE4+IHNlZW4gPSBuZXcgU2V0PE4+KCk7CiAgICBib29sIGhlbHBlcihOIG5vZGUpIHsKICAgICAgaWYgKGlkZW50aWNhbChub2RlLCB0YXJnZXQpKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKCFzZWVuLmFkZChub2RlKSkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gdGFyZ2V0c09mKG5vZGUpLmFueShoZWxwZXIpOwogICAgfQoKICAgIHJldHVybiBoZWxwZXIoc291cmNlKTsKICB9CgogIC8vLyBSZXR1cm5zIGFsbCBub2RlcyByZWFjaGFibGUgZnJvbSBbcm9vdF0gaW4gcG9zdCBvcmRlci4KICBJdGVyYWJsZTxOPiBwb3N0T3JkZXIoTiByb290KSBzeW5jKiB7CiAgICB2YXIgc2VlbiA9IG5ldyBTZXQ8Tj4oKTsKICAgIEl0ZXJhYmxlPE4+IGhlbHBlcihOIG4pIHN5bmMqIHsKICAgICAgaWYgKCFzZWVuLmFkZChuKSkgcmV0dXJuOwogICAgICBmb3IgKHZhciB4IGluIHRhcmdldHNPZihuKSkgewogICAgICAgIHlpZWxkKiBoZWxwZXIoeCk7CiAgICAgIH0KICAgICAgeWllbGQgbjsKICAgIH0KCiAgICB5aWVsZCogaGVscGVyKHJvb3QpOwogIH0KCiAgLy8vIFJldHVybnMgYW4gaXRlcmFibGUgb2YgYWxsIG5vZGVzIHJlYWNoYWJsZSBmcm9tIFtyb290XSBpbiBwcmVvcmRlci4KICBJdGVyYWJsZTxOPiBwcmVPcmRlcihOIHJvb3QpIHN5bmMqIHsKICAgIHZhciBzZWVuID0gbmV3IFNldDxOPigpOwogICAgdmFyIHN0YWNrID0gPE4+W3Jvb3RdOwogICAgd2hpbGUgKHN0YWNrLmlzTm90RW1wdHkpIHsKICAgICAgdmFyIG5leHQgPSBzdGFjay5yZW1vdmVMYXN0KCk7CiAgICAgIGlmICghc2Vlbi5jb250YWlucyhuZXh0KSkgewogICAgICAgIHNlZW4uYWRkKG5leHQpOwogICAgICAgIHlpZWxkIG5leHQ7CiAgICAgICAgc3RhY2suYWRkQWxsKHRhcmdldHNPZihuZXh0KSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIGEgbGlzdCBvZiBub2RlcyB0aGF0IGZvcm0gYSBjeWNsZSBjb250YWluaW5nIHRoZSBnaXZlbiBub2RlLiBJZgogIC8vLyB0aGUgbm9kZSBpcyBub3QgcGFydCBvZiBhIGN5Y2xlIGluIHRoaXMgZ3JhcGgsIHRoZW4gYSBsaXN0IGNvbnRhaW5pbmcgb25seQogIC8vLyB0aGUgbm9kZSBpdHNlbGYgd2lsbCBiZSByZXR1cm5lZC4KICBMaXN0PE4+IGZpbmRDeWNsZUNvbnRhaW5pbmcoTiBub2RlKSB7CiAgICBhc3NlcnQobm9kZSAhPSBudWxsKTsKICAgIF9TY2NGaW5kZXI8Tj4gZmluZGVyID0gbmV3IF9TY2NGaW5kZXI8Tj4odGhpcyk7CiAgICByZXR1cm4gZmluZGVyLl9jb21wb25lbnRDb250YWluaW5nKG5vZGUpOwogIH0KCiAgLy8vIFJldHVybnMgYSBkb21pbmF0b3IgdHJlZSBzdGFydGluZyBmcm9tIHJvb3QuIFRoaXMgaXMgYSBuZXcgZ3JhcGgsIHdpdGggdGhlCiAgLy8vIHNhbWUgbm9kZXMgYXMgdGhpcyBncmFwaCwgYnV0IHdoZXJlIGVkZ2VzIGV4aXN0IGJldHdlZW4gYSBub2RlIGFuZCB0aGUKICAvLy8gbm9kZXMgaXQgaW1tZWRpYXRlbHkgZG9taW5hdGVzLiBGb3IgZXhhbXBsZSwgdGhpcyBncmFwaDoKICAvLy8KICAvLy8gICAgICAgcm9vdAogIC8vLyAgICAgICAvICAgXAogIC8vLyAgICAgIGEgICAgIGIKICAvLy8gICAgICB8ICAgIC8gXAogIC8vLyAgICAgIGMgICBkICAgZQogIC8vLyAgICAgICBcIC8gXCAvCiAgLy8vICAgICAgICBmICAgZwogIC8vLwogIC8vLyBQcm9kdWNlcyB0aGlzIHRyZWU6CiAgLy8vCiAgLy8vICAgICAgIHJvb3QKICAvLy8gICAgICAgL3wgIFwKICAvLy8gICAgICBhIHwgICBiCiAgLy8vICAgICAgfCB8ICAvfFwKICAvLy8gICAgICBjIHwgZCB8IGUKICAvLy8gICAgICAgIHwgICB8CiAgLy8vICAgICAgICBmICAgZwogIC8vLwogIC8vLyBJbnRlcm5hbGx5IHdlIGNvbXB1dGUgZG9taW5hdG9ycyB1c2luZyAoQ29vcGVyLCBIYXJ2ZXksIGFuZCBLZW5uZWR5J3MKICAvLy8gYWxnb3JpdGhtKVtodHRwOi8vd3d3LmNzLnJpY2UuZWR1L35rZWl0aC9FTUJFRC9kb20ucGRmXS4KICBHcmFwaDxOPiBkb21pbmF0b3JUcmVlKE4gcm9vdCkgewogICAgdmFyIGlEb20gPSAobmV3IF9Eb21pbmF0b3JGaW5kZXIodGhpcykuLnJ1bihyb290KSkuaW1tZWRpYXRlRG9taW5hdG9yczsKICAgIHZhciBncmFwaCA9IG5ldyBFZGdlTGlzdEdyYXBoPE4+KCk7CiAgICBmb3IgKE4gbm9kZSBpbiBpRG9tLmtleXMpIHsKICAgICAgaWYgKG5vZGUgIT0gcm9vdCkgZ3JhcGguYWRkRWRnZShpRG9tW25vZGVdLCBub2RlKTsKICAgIH0KICAgIHJldHVybiBncmFwaDsKICB9Cn0KCmNsYXNzIEVkZ2VMaXN0R3JhcGg8Tj4gZXh0ZW5kcyBHcmFwaDxOPiB7CiAgLy8vIEVkZ2VzIGluIHRoZSBncmFwaC4KICBNYXA8TiwgU2V0PE4+PiBfZWRnZXMgPSBuZXcgTWFwPE4sIFNldDxOPj4oKTsKCiAgLy8vIFRoZSByZXZlcnNlIG9mIF9lZGdlcy4KICBNYXA8TiwgU2V0PE4+PiBfcmV2RWRnZXMgPSBuZXcgTWFwPE4sIFNldDxOPj4oKTsKCiAgSXRlcmFibGU8Tj4gZ2V0IG5vZGVzID0+IF9lZGdlcy5rZXlzOwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2VkZ2VzLmlzRW1wdHk7CiAgaW50IGdldCBub2RlQ291bnQgPT4gX2VkZ2VzLmxlbmd0aDsKCiAgZmluYWwgX2VtcHR5ID0gbmV3IFNldDxOPigpOwoKICBJdGVyYWJsZTxOPiB0YXJnZXRzT2YoTiBzb3VyY2UpID0+IF9lZGdlc1tzb3VyY2VdID8/IF9lbXB0eTsKICBJdGVyYWJsZTxOPiBzb3VyY2VzT2YoTiBzb3VyY2UpID0+IF9yZXZFZGdlc1tzb3VyY2VdID8/IF9lbXB0eTsKCiAgdm9pZCBhZGRFZGdlKE4gc291cmNlLCBOIHRhcmdldCkgewogICAgYXNzZXJ0KHNvdXJjZSAhPSBudWxsKTsKICAgIGFzc2VydCh0YXJnZXQgIT0gbnVsbCk7CiAgICBhZGROb2RlKHNvdXJjZSk7CiAgICBhZGROb2RlKHRhcmdldCk7CiAgICBfZWRnZXNbc291cmNlXS5hZGQodGFyZ2V0KTsKICAgIF9yZXZFZGdlc1t0YXJnZXRdLmFkZChzb3VyY2UpOwogIH0KCiAgdm9pZCBhZGROb2RlKE4gbm9kZSkgewogICAgYXNzZXJ0KG5vZGUgIT0gbnVsbCk7CiAgICBfZWRnZXMucHV0SWZBYnNlbnQobm9kZSwgKCkgPT4gbmV3IFNldDxOPigpKTsKICAgIF9yZXZFZGdlcy5wdXRJZkFic2VudChub2RlLCAoKSA9PiBuZXcgU2V0PE4+KCkpOwogIH0KCiAgLy8vIFJlbW92ZSB0aGUgZWRnZSBmcm9tIHRoZSBnaXZlbiBbc291cmNlXSBub2RlIHRvIHRoZSBnaXZlbiBbdGFyZ2V0XSBub2RlLgogIC8vLyBJZiB0aGVyZSB3YXMgbm8gc3VjaCBlZGdlIHRoZW4gdGhlIGdyYXBoIHdpbGwgYmUgdW5tb2RpZmllZDogdGhlIG51bWJlciBvZgogIC8vLyBlZGdlcyB3aWxsIGJlIHRoZSBzYW1lIGFuZCB0aGUgc2V0IG9mIG5vZGVzIHdpbGwgYmUgdGhlIHNhbWUgKG5laXRoZXIgbm9kZQogIC8vLyB3aWxsIGVpdGhlciBiZSBhZGRlZCBvciByZW1vdmVkKS4KICB2b2lkIHJlbW92ZUVkZ2UoTiBzb3VyY2UsIE4gdGFyZ2V0KSB7CiAgICBfZWRnZXNbc291cmNlXT8ucmVtb3ZlKHRhcmdldCk7CiAgfQoKICAvLy8gUmVtb3ZlIHRoZSBnaXZlbiBub2RlIGZyb20gdGhpcyBncmFwaC4gQXMgYSBjb25zZXF1ZW5jZSwgYW55IGVkZ2VzIGZvcgogIC8vLyB3aGljaCB0aGF0IG5vZGUgd2FzIGVpdGhlciBhIGhlYWQgb3IgYSB0YWlsIHdpbGwgYWxzbyBiZSByZW1vdmVkLgogIHZvaWQgcmVtb3ZlTm9kZShOIG5vZGUpIHsKICAgIF9lZGdlcy5yZW1vdmUobm9kZSk7CiAgICB2YXIgc291cmNlcyA9IF9yZXZFZGdlc1tub2RlXTsKICAgIGlmIChzb3VyY2VzID09IG51bGwpIHJldHVybjsKICAgIGZvciAodmFyIHNvdXJjZSBpbiBzb3VyY2VzKSB7CiAgICAgIF9lZGdlc1tzb3VyY2VdLnJlbW92ZShub2RlKTsKICAgIH0KICB9CgogIC8vLyBSZW1vdmUgYWxsIG9mIHRoZSBnaXZlbiBub2RlcyBmcm9tIHRoaXMgZ3JhcGguIEFzIGEgY29uc2VxdWVuY2UsIGFueSBlZGdlcwogIC8vLyBmb3Igd2hpY2ggdGhvc2Ugbm9kZXMgd2VyZSBlaXRoZXIgYSBoZWFkIG9yIGEgdGFpbCB3aWxsIGFsc28gYmUgcmVtb3ZlZC4KICB2b2lkIHJlbW92ZUFsbE5vZGVzKExpc3Q8Tj4gbm9kZXMpID0+IG5vZGVzLmZvckVhY2gocmVtb3ZlTm9kZSk7Cn0KCi8vLyBVc2VkIGJ5IHRoZSBbU2NjRmluZGVyXSB0byBtYWludGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbm9kZXMgdGhhdCBoYXZlCi8vLyBiZWVuIGV4YW1pbmVkLiBUaGVyZSBpcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHBlciBub2RlIGluIHRoZSBncmFwaC4KY2xhc3MgX05vZGVJbmZvPE4+IHsKICAvLy8gRGVwdGggb2YgdGhlIG5vZGUgY29ycmVzcG9uZGluZyB0byB0aGlzIGluZm8uCiAgaW50IGluZGV4ID0gMDsKCiAgLy8vIERlcHRoIG9mIHRoZSBmaXJzdCBub2RlIGluIGEgY3ljbGUuCiAgaW50IGxvd2xpbmsgPSAwOwoKICAvLy8gV2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBub2RlIGlzIG9uIHRoZSBzdGFjay4gVXNlZCB0byByZW1vdmUgdGhlIG5lZWQKICAvLy8gZm9yIHNlYXJjaGluZyBhIGNvbGxlY3Rpb24gZm9yIHRoZSBub2RlIGVhY2ggdGltZSB0aGUgcXVlc3Rpb24gbmVlZHMgdG8gYmUKICAvLy8gYXNrZWQuCiAgYm9vbCBvblN0YWNrID0gZmFsc2U7CgogIC8vLyBDb21wb25lbnQgdGhhdCBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZyBub2RlLgogIExpc3Q8Tj4gY29tcG9uZW50OwoKICBfTm9kZUluZm8oaW50IGRlcHRoKQogICAgICA6IGluZGV4ID0gZGVwdGgsCiAgICAgICAgbG93bGluayA9IGRlcHRoLAogICAgICAgIG9uU3RhY2sgPSBmYWxzZTsKfQoKLy8vIEltcGxlbWVudHMgVGFyamFuJ3MgQWxnb3JpdGhtIGZvciBmaW5kaW5nIHRoZSBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50cwovLy8gaW4gYSBncmFwaC4KY2xhc3MgX1NjY0ZpbmRlcjxOPiB7CiAgLy8vIFRoZSBncmFwaCB0byBwcm9jZXNzLgogIGZpbmFsIEdyYXBoPE4+IF9ncmFwaDsKCiAgLy8vIFRoZSBpbmRleCB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkZXB0aCBvZiBub2Rlcy4KICBpbnQgX2luZGV4ID0gMDsKCiAgLy8vIE5vZGVzIHRoYXQgYXJlIGJlaW5nIHZpc2l0ZWQgaW4gb3JkZXIgdG8gaWRlbnRpZnkgY29tcG9uZW50cy4KICBMaXN0PE4+IF9zdGFjayA9IG5ldyBMaXN0PE4+KCk7CgogIC8vLyBJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZWFjaCBub2RlLgogIE1hcDxOLCBfTm9kZUluZm88Tj4+IF9pbmZvID0gPE4sIF9Ob2RlSW5mbzxOPj57fTsKCiAgLy8vIEFsbCBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50cyBmb3VuZCwgaW4gdG9wb2xvZ2ljYWwgc29ydCBvcmRlciAoZWFjaAogIC8vLyBub2RlIGluIGEgc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmVudCBvbmx5IGhhcyBlZGdlcyB0aGF0IHBvaW50IHRvIG5vZGVzCiAgLy8vIGluIHRoZSBzYW1lIGNvbXBvbmVudCBvciBlYXJsaWVyIGNvbXBvbmVudHMpLgogIExpc3Q8TGlzdDxOPj4gX2FsbENvbXBvbmVudHMgPSBuZXcgTGlzdDxMaXN0PE4+PigpOwoKICBfU2NjRmluZGVyKHRoaXMuX2dyYXBoKTsKCiAgLy8vIFJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgc3Ryb25nbHkgY29ubmVjdGVkCiAgLy8vIGNvbXBvbmVudCB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBub2RlLgogIExpc3Q8Tj4gX2NvbXBvbmVudENvbnRhaW5pbmcoTiBub2RlKSA9PiBfc3Ryb25nQ29ubmVjdChub2RlKS5jb21wb25lbnQ7CgogIC8vLyBSdW4gVGFyamFuJ3MgYWxnb3JpdGhtIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBsaXN0IG9mIHN0cm9uZ2x5IGNvbm5lY3RlZAogIC8vLyBjb21wb25lbnRzLiBUaGUgbGlzdCBpcyBpbiB0b3BvbG9naWNhbCBzb3J0IG9yZGVyIChlYWNoIG5vZGUgaW4gYSBzdHJvbmdseQogIC8vLyBjb25uZWN0ZWQgY29tcG9uZW50IG9ubHkgaGFzIGVkZ2VzIHRoYXQgcG9pbnQgdG8gbm9kZXMgaW4gdGhlIHNhbWUKICAvLy8gY29tcG9uZW50IG9yIGVhcmxpZXIgY29tcG9uZW50cykuCiAgTGlzdDxMaXN0PE4+PiBjb21wdXRlVG9wb2xvZ2ljYWxTb3J0KCkgewogICAgZm9yIChOIG5vZGUgaW4gX2dyYXBoLm5vZGVzKSB7CiAgICAgIHZhciBub2RlSW5mbyA9IF9pbmZvW25vZGVdOwogICAgICBpZiAobm9kZUluZm8gPT0gbnVsbCkgX3N0cm9uZ0Nvbm5lY3Qobm9kZSk7CiAgICB9CiAgICByZXR1cm4gX2FsbENvbXBvbmVudHM7CiAgfQoKICAvLy8gUmVtb3ZlIGFuZCByZXR1cm4gdGhlIHRvcC1tb3N0IGVsZW1lbnQgZnJvbSB0aGUgc3RhY2suCiAgTiBfcG9wKCkgewogICAgTiBub2RlID0gX3N0YWNrLnJlbW92ZUF0KF9zdGFjay5sZW5ndGggLSAxKTsKICAgIF9pbmZvW25vZGVdLm9uU3RhY2sgPSBmYWxzZTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgLy8vIEFkZCB0aGUgZ2l2ZW4gbm9kZSB0byB0aGUgc3RhY2suCiAgdm9pZCBfcHVzaChOIG5vZGUpIHsKICAgIF9pbmZvW25vZGVdLm9uU3RhY2sgPSB0cnVlOwogICAgX3N0YWNrLmFkZChub2RlKTsKICB9CgogIC8vLyBDb21wdXRlIHRoZSBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50IHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIG5vZGUgYXMKICAvLy8gd2VsbCBhcyBhbnkgY29tcG9uZW50cyBjb250YWluaW5nIG5vZGVzIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIHRoZSBnaXZlbgogIC8vLyBjb21wb25lbnQuCiAgX05vZGVJbmZvPE4+IF9zdHJvbmdDb25uZWN0KE4gdikgewogICAgLy8gU2V0IHRoZSBkZXB0aCBpbmRleCBmb3IgdiB0byB0aGUgc21hbGxlc3QgdW51c2VkIGluZGV4CiAgICB2YXIgdkluZm8gPSBuZXcgX05vZGVJbmZvPE4+KF9pbmRleCsrKTsKICAgIF9pbmZvW3ZdID0gdkluZm87CiAgICBfcHVzaCh2KTsKCiAgICBmb3IgKE4gdyBpbiBfZ3JhcGgudGFyZ2V0c09mKHYpKSB7CiAgICAgIHZhciB3SW5mbyA9IF9pbmZvW3ddOwogICAgICBpZiAod0luZm8gPT0gbnVsbCkgewogICAgICAgIC8vIFN1Y2Nlc3NvciB3IGhhcyBub3QgeWV0IGJlZW4gdmlzaXRlZDsgcmVjdXJzZSBvbiBpdAogICAgICAgIHdJbmZvID0gX3N0cm9uZ0Nvbm5lY3Qodyk7CiAgICAgICAgdkluZm8ubG93bGluayA9IG1hdGgubWluKHZJbmZvLmxvd2xpbmssIHdJbmZvLmxvd2xpbmspOwogICAgICB9IGVsc2UgaWYgKHdJbmZvLm9uU3RhY2spIHsKICAgICAgICAvLyBTdWNjZXNzb3IgdyBpcyBpbiBzdGFjayBTIGFuZCBoZW5jZSBpbiB0aGUgY3VycmVudCBTQ0MKICAgICAgICB2SW5mby5sb3dsaW5rID0gbWF0aC5taW4odkluZm8ubG93bGluaywgd0luZm8uaW5kZXgpOwogICAgICB9CiAgICB9CgogICAgLy8gSWYgdiBpcyBhIHJvb3Qgbm9kZSwgcG9wIHRoZSBzdGFjayBhbmQgZ2VuZXJhdGUgYW4gU0NDCiAgICBpZiAodkluZm8ubG93bGluayA9PSB2SW5mby5pbmRleCkgewogICAgICB2YXIgY29tcG9uZW50ID0gbmV3IExpc3Q8Tj4oKTsKICAgICAgTiB3OwogICAgICBkbyB7CiAgICAgICAgdyA9IF9wb3AoKTsKICAgICAgICBjb21wb25lbnQuYWRkKHcpOwogICAgICAgIF9pbmZvW3ddLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKICAgICAgfSB3aGlsZSAoIWlkZW50aWNhbCh3LCB2KSk7CiAgICAgIF9hbGxDb21wb25lbnRzLmFkZChjb21wb25lbnQpOwogICAgfQogICAgcmV0dXJuIHZJbmZvOwogIH0KfQoKLy8vIENvbXB1dGVzIGRvbWluYXRvcnMgdXNpbmcgKENvb3BlciwgSGFydmV5LCBhbmQgS2VubmVkeSdzCi8vLyBhbGdvcml0aG0pW2h0dHA6Ly93d3cuY3MucmljZS5lZHUvfmtlaXRoL0VNQkVEL2RvbS5wZGZdLgpjbGFzcyBfRG9taW5hdG9yRmluZGVyPE4+IHsKICBmaW5hbCBHcmFwaDxOPiBfZ3JhcGg7CiAgTWFwPE4sIE4+IGltbWVkaWF0ZURvbWluYXRvcnMgPSB7fTsKICBNYXA8TiwgaW50PiBwb3N0T3JkZXJJZCA9IHt9OwogIF9Eb21pbmF0b3JGaW5kZXIodGhpcy5fZ3JhcGgpOwoKICBydW4oTiByb290KSB7CiAgICBpbW1lZGlhdGVEb21pbmF0b3JzW3Jvb3RdID0gcm9vdDsKICAgIGJvb2wgY2hhbmdlZCA9IHRydWU7CiAgICBpbnQgaSA9IDA7CiAgICB2YXIgbm9kZXNJblBvc3RPcmRlciA9IF9ncmFwaC5wb3N0T3JkZXIocm9vdCkudG9MaXN0KCk7CiAgICBmb3IgKHZhciBuIGluIG5vZGVzSW5Qb3N0T3JkZXIpIHsKICAgICAgcG9zdE9yZGVySWRbbl0gPSBpKys7CiAgICB9CiAgICB2YXIgbm9kZXNJblJldmVyc2VkUG9zdE9yZGVyID0gbm9kZXNJblBvc3RPcmRlci5yZXZlcnNlZDsKICAgIHdoaWxlIChjaGFuZ2VkKSB7CiAgICAgIGNoYW5nZWQgPSBmYWxzZTsKICAgICAgZm9yICh2YXIgbiBpbiBub2Rlc0luUmV2ZXJzZWRQb3N0T3JkZXIpIHsKICAgICAgICBpZiAobiA9PSByb290KSBjb250aW51ZTsKICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICAgICBOIGlkb207CiAgICAgICAgZm9yICh2YXIgcCBpbiBfZ3JhcGguc291cmNlc09mKG4pKSB7CiAgICAgICAgICBpZiAoaW1tZWRpYXRlRG9taW5hdG9yc1twXSAhPSBudWxsKSB7CiAgICAgICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICAgICAgIGlkb20gPSBwOwogICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWRvbSA9IF9pbnRlcnNlY3QocCwgaWRvbSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGltbWVkaWF0ZURvbWluYXRvcnNbbl0gIT0gaWRvbSkgewogICAgICAgICAgaW1tZWRpYXRlRG9taW5hdG9yc1tuXSA9IGlkb207CiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIE4gX2ludGVyc2VjdChOIGIxLCBOIGIyKSB7CiAgICB2YXIgZmluZ2VyMSA9IGIxOwogICAgdmFyIGZpbmdlcjIgPSBiMjsKICAgIHdoaWxlIChmaW5nZXIxICE9IGZpbmdlcjIpIHsKICAgICAgd2hpbGUgKHBvc3RPcmRlcklkW2ZpbmdlcjFdIDwgcG9zdE9yZGVySWRbZmluZ2VyMl0pIHsKICAgICAgICBmaW5nZXIxID0gaW1tZWRpYXRlRG9taW5hdG9yc1tmaW5nZXIxXTsKICAgICAgfQogICAgICB3aGlsZSAocG9zdE9yZGVySWRbZmluZ2VyMl0gPCBwb3N0T3JkZXJJZFtmaW5nZXIxXSkgewogICAgICAgIGZpbmdlcjIgPSBpbW1lZGlhdGVEb21pbmF0b3JzW2ZpbmdlcjJdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmluZ2VyMTsKICB9Cn0KgVAATk48AU5PKAQ6QD4gARwBGhkUFSMjAU9RUEcrNCwEATgqIBowKSoGARsEAT0oHSQgJBoIDwYBGQQBSicdGx8lIhgUJwgGBAFOUSgoGjQuBAFRTT8GERITFBUUEwYaBhESExQVExMGTD8jTCggOQYSBAIBKhowAR0zASgmJgEfAT9CASUcHBUVICMEARkaMjUEAU9RUSgoJAQBTUgcGSMhIiMGBAFRT0MCAU5NFTQRASoTAU5RDRgBNhUBFxcZGQIBUBAWHBkBPhIBRCIBLTQBT1A0NgEbAVEuSgFRUUkoKyMiMgYbBAE9DTEhEQQBJxcgFgQBT1ARJT4sFg4BJxwbPyNAIkI+CAYBPiglCwsUGigiJQYSBAIBPT0cGSYgIQEQJhkPPCYcBj4WFzAhGxAtMBkYHRUqDgwKLikaCggGBAEdFhYhPDAIPDAIBhQEAgEjcGFja2FnZTpkYXJ0MmpzX2luZm8vc3JjL2dyYXBoLmRhcnQ3c2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaW5mZXJyZXIvbm9kZV90cmFjZXIuZGFydMAARjMvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBjb21waWxlci5zcmMuaW5mZXJyZXIubm9kZV90cmFjZXI7CgppbXBvcnQgJy4uL2NvbW1vbi9uYW1lcy5kYXJ0JyBzaG93IElkZW50aWZpZXJzOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnOwppbXBvcnQgJy4uL3V0aWwvdXRpbC5kYXJ0JyBzaG93IFNldGxldDsKaW1wb3J0ICdhYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydCc7CmltcG9ydCAnZGVidWcuZGFydCcgYXMgZGVidWc7CmltcG9ydCAnaW5mZXJyZXJfZW5naW5lLmRhcnQnOwppbXBvcnQgJ3R5cGVfZ3JhcGhfbm9kZXMuZGFydCc7CgovLyBBIHNldCBvZiBzZWxlY3RvcnMgd2Uga25vdyBkbyBub3QgZXNjYXBlIHRoZSBlbGVtZW50cyBpbnNpZGUgdGhlCi8vIGxpc3QuClNldDxTdHJpbmc+IGRvZXNOb3RFc2NhcGVMaXN0U2V0ID0gbmV3IFNldDxTdHJpbmc+LmZyb20oY29uc3QgPFN0cmluZz5bCiAgLy8gRnJvbSBPYmplY3QuCiAgJz09JywKICAnaGFzaENvZGUnLAogICd0b1N0cmluZycsCiAgJ25vU3VjaE1ldGhvZCcsCiAgJ3J1bnRpbWVUeXBlJywKCiAgLy8gRnJvbSBJdGVyYWJsZS4KICAnaXNFbXB0eScsCiAgJ2lzTm90RW1wdHknLAogICdsZW5ndGgnLAogICdjb250YWlucycsCiAgJ2pvaW4nLAoKICAvLyBGcm9tIExpc3QuCiAgJ2FkZCcsCiAgJ2FkZEFsbCcsCiAgJ2NsZWFyJywKICAnZmlsbFJhbmdlJywKICAnaW5kZXhPZicsCiAgJ2luc2VydCcsCiAgJ2luc2VydEFsbCcsCiAgJ2xhc3RJbmRleE9mJywKICAncmVtb3ZlJywKICAncmVtb3ZlUmFuZ2UnLAogICdyZXBsYWNlUmFuZ2UnLAogICdzZXRBbGwnLAogICdzZXRSYW5nZScsCiAgJ3NodWZmbGUnLAogICdbXT0nLAoKICAvLyBGcm9tIEpTQXJyYXkuCiAgJ2NoZWNrTXV0YWJsZScsCiAgJ2NoZWNrR3Jvd2FibGUnLApdKTsKClNldDxTdHJpbmc+IGRvZXNOb3RFc2NhcGVTZXRTZXQgPSBuZXcgU2V0PFN0cmluZz4uZnJvbShjb25zdCA8U3RyaW5nPlsKICAvLyBGcm9tIE9iamVjdC4KICAnPT0nLAogICdoYXNoQ29kZScsCiAgJ3RvU3RyaW5nJywKICAnbm9TdWNoTWV0aG9kJywKICAncnVudGltZVR5cGUnLAoKICAvLyBGcm9tIEl0ZXJhYmxlLgogICdpc0VtcHR5JywKICAnaXNOb3RFbXB0eScsCiAgJ2xlbmd0aCcsCiAgJ2NvbnRhaW5zJywKICAnam9pbicsCgogIC8vIEZyb20gU2V0LgogICdhZGQnLAogICdhZGRBbGwnLAogICdjbGVhcicsCiAgJ2NvbnRhaW5zQWxsJywKICAncmVtb3ZlJywKICAncmVtb3ZlQWxsJywKICAncmV0YWluQWxsJywKXSk7CgpTZXQ8U3RyaW5nPiBkb2VzTm90RXNjYXBlTWFwU2V0ID0gbmV3IFNldDxTdHJpbmc+LmZyb20oY29uc3QgPFN0cmluZz5bCiAgLy8gRnJvbSBPYmplY3QuCiAgJz09JywKICAnaGFzaENvZGUnLAogICd0b1N0cmluZycsCiAgJ25vU3VjaE1ldGhvZCcsCiAgJ3J1bnRpbWVUeXBlJywKICAvLyBmcm9tIE1hcC4KICAnaXNFbXB0eScsCiAgJ2lzTm90RW1wdHknLAogICdsZW5ndGgnLAogICdjbGVhcicsCiAgJ2NvbnRhaW5zS2V5JywKICAnY29udGFpbnNWYWx1ZScsCiAgJ1tdPScsCiAgLy8gW2tleXNdIG9ubHkgYWxsb3dzIGtleSB2YWx1ZXMgdG8gZXNjYXBlLCB3aGljaCB3ZSBkbyBub3QgdHJhY2suCiAgJ2tleXMnCl0pOwoKLy8vIENvbW1vbiBsb2dpYyB0byB0cmFjZSBhIHZhbHVlIHRocm91Z2ggdGhlIHR5cGUgaW5mZXJlbmNlIGdyYXBoIG5vZGVzLgphYnN0cmFjdCBjbGFzcyBUcmFjZXJWaXNpdG9yIGltcGxlbWVudHMgVHlwZUluZm9ybWF0aW9uVmlzaXRvciB7CiAgZmluYWwgVHlwZUluZm9ybWF0aW9uIHRyYWNlZFR5cGU7CiAgZmluYWwgSW5mZXJyZXJFbmdpbmUgaW5mZXJyZXI7CgogIHN0YXRpYyBjb25zdCBpbnQgTUFYX0FOQUxZU0lTX0NPVU5UID0KICAgICAgY29uc3QgaW50LmZyb21FbnZpcm9ubWVudCgnZGFydDJqcy50cmFjaW5nLmxpbWl0JywgZGVmYXVsdFZhbHVlOiAzMik7CiAgZmluYWwgU2V0bGV0PE1lbWJlckVudGl0eT4gYW5hbHl6ZWRFbGVtZW50cyA9IG5ldyBTZXRsZXQ8TWVtYmVyRW50aXR5PigpOwoKICBUcmFjZXJWaXNpdG9yKHRoaXMudHJhY2VkVHlwZSwgdGhpcy5pbmZlcnJlcik7CgogIC8vLyBXb3JrIGxpc3QgdGhhdCBnZXRzIHBvcHVsYXRlZCB3aXRoIFtUeXBlSW5mb3JtYXRpb25dIHRoYXQgY291bGQKICAvLy8gY29udGFpbiB0aGUgY29udGFpbmVyLgogIGZpbmFsIExpc3Q8VHlwZUluZm9ybWF0aW9uPiB3b3JrTGlzdCA9IDxUeXBlSW5mb3JtYXRpb24+W107CgogIC8vLyBXb3JrIGxpc3Qgb2YgbGlzdHMgdG8gYW5hbHl6ZSBhZnRlciBhbmFseXppbmcgdGhlIHVzZXJzIG9mIGEKICAvLy8gW1R5cGVJbmZvcm1hdGlvbl0uIFdlIGtub3cgdGhlIFt0cmFjZWRUeXBlXSBoYXMgYmVlbiBzdG9yZWQgaW4gdGhlc2UKICAvLy8gbGlzdHMgYW5kIHdlIG11c3QgY2hlY2sgaG93IGl0IGVzY2FwZXMgZnJvbSB0aGVzZSBsaXN0cy4KICBmaW5hbCBMaXN0PExpc3RUeXBlSW5mb3JtYXRpb24+IGxpc3RzVG9BbmFseXplID0gPExpc3RUeXBlSW5mb3JtYXRpb24+W107CgogIC8vLyBXb3JrIGxpc3Qgb2Ygc2V0cyB0byBhbmFseXplIGFmdGVyIGFuYWx5emluZyB0aGUgdXNlcnMgb2YgYQogIC8vLyBbVHlwZUluZm9ybWF0aW9uXS4gV2Uga25vdyB0aGUgW3RyYWNlZFR5cGVdIGhhcyBiZWVuIHN0b3JlZCBpbiB0aGVzZSBzZXRzCiAgLy8vIGFuZCB3ZSBtdXN0IGNoZWNrIGhvdyBpdCBlc2NhcGVzIGZyb20gdGhlc2Ugc2V0cy4KICBmaW5hbCBMaXN0PFNldFR5cGVJbmZvcm1hdGlvbj4gc2V0c1RvQW5hbHl6ZSA9IDxTZXRUeXBlSW5mb3JtYXRpb24+W107CgogIC8vLyBXb3JrIGxpc3Qgb2YgbWFwcyB0byBhbmFseXplIGFmdGVyIGFuYWx5emluZyB0aGUgdXNlcnMgb2YgYQogIC8vLyBbVHlwZUluZm9ybWF0aW9uXS4gV2Uga25vdyB0aGUgW3RyYWNlZFR5cGVdIGhhcyBiZWVuIHN0b3JlZCBpbiB0aGVzZQogIC8vLyBtYXBzIGFuZCB3ZSBtdXN0IGNoZWNrIGhvdyBpdCBlc2NhcGVzIGZyb20gdGhlc2UgbWFwcy4KICBmaW5hbCBMaXN0PE1hcFR5cGVJbmZvcm1hdGlvbj4gbWFwc1RvQW5hbHl6ZSA9IDxNYXBUeXBlSW5mb3JtYXRpb24+W107CgogIGZpbmFsIFNldGxldDxUeXBlSW5mb3JtYXRpb24+IGZsb3dzSW50byA9IG5ldyBTZXRsZXQ8VHlwZUluZm9ybWF0aW9uPigpOwoKICAvLyBUaGUgY3VycmVudCBbVHlwZUluZm9ybWF0aW9uXSBpbiB0aGUgYW5hbHlzaXMuCiAgVHlwZUluZm9ybWF0aW9uIGN1cnJlbnRVc2VyOwogIGJvb2wgY29udGludWVBbmFseXppbmcgPSB0cnVlOwoKICB2b2lkIGFkZE5ld0VzY2FwZUluZm9ybWF0aW9uKFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBpZiAoZmxvd3NJbnRvLmNvbnRhaW5zKGluZm8pKSByZXR1cm47CiAgICBmbG93c0ludG8uYWRkKGluZm8pOwogICAgd29ya0xpc3QuYWRkKGluZm8pOwogIH0KCiAgYm9vbCBfd291bGRCZVRvb01hbnlVc2VycyhTZXQgdXNlcnMpIHsKICAgIGludCBzZWVuU29GYXIgPSBhbmFseXplZEVsZW1lbnRzLmxlbmd0aDsKICAgIGlmIChzZWVuU29GYXIgKyB1c2Vycy5sZW5ndGggPD0gTUFYX0FOQUxZU0lTX0NPVU5UKSByZXR1cm4gZmFsc2U7CiAgICBpbnQgYWN0dWFsV29yayA9IDA7CiAgICBmb3IgKFR5cGVJbmZvcm1hdGlvbiB1c2VyIGluIHVzZXJzKSB7CiAgICAgIGlmICghYW5hbHl6ZWRFbGVtZW50cy5jb250YWlucyh1c2VyLm93bmVyKSkgewogICAgICAgIGFjdHVhbFdvcmsrKzsKICAgICAgICBpZiAoYWN0dWFsV29yayA+IE1BWF9BTkFMWVNJU19DT1VOVCAtIHNlZW5Tb0ZhcikgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgYW5hbHl6ZSgpIHsKICAgIC8vIENvbGxlY3QgdGhlIFtUeXBlSW5mb3JtYXRpb25dIHdoZXJlIHRoZSBsaXN0IGNhbiBmbG93IGluLAogICAgLy8gYXMgd2VsbCBhcyB0aGUgb3BlcmF0aW9ucyBkb25lIG9uIGFsbCB0aGVzZSBbVHlwZUluZm9ybWF0aW9uXXMuCiAgICBhZGROZXdFc2NhcGVJbmZvcm1hdGlvbih0cmFjZWRUeXBlKTsKICAgIHdoaWxlICghd29ya0xpc3QuaXNFbXB0eSkgewogICAgICBjdXJyZW50VXNlciA9IHdvcmtMaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgaWYgKF93b3VsZEJlVG9vTWFueVVzZXJzKGN1cnJlbnRVc2VyLnVzZXJzKSkgewogICAgICAgIGJhaWxvdXQoJ1RvbyBtYW55IHVzZXJzJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZm9yIChUeXBlSW5mb3JtYXRpb24gaW5mbyBpbiBjdXJyZW50VXNlci51c2VycykgewogICAgICAgIGFuYWx5emVkRWxlbWVudHMuYWRkKGluZm8ub3duZXIpOwogICAgICAgIGluZm8uYWNjZXB0KHRoaXMpOwogICAgICB9CiAgICAgIHdoaWxlICghbGlzdHNUb0FuYWx5emUuaXNFbXB0eSkgewogICAgICAgIGFuYWx5emVTdG9yZWRJbnRvTGlzdChsaXN0c1RvQW5hbHl6ZS5yZW1vdmVMYXN0KCkpOwogICAgICB9CiAgICAgIHdoaWxlIChzZXRzVG9BbmFseXplLmlzTm90RW1wdHkpIHsKICAgICAgICBhbmFseXplU3RvcmVkSW50b1NldChzZXRzVG9BbmFseXplLnJlbW92ZUxhc3QoKSk7CiAgICAgIH0KICAgICAgd2hpbGUgKCFtYXBzVG9BbmFseXplLmlzRW1wdHkpIHsKICAgICAgICBhbmFseXplU3RvcmVkSW50b01hcChtYXBzVG9BbmFseXplLnJlbW92ZUxhc3QoKSk7CiAgICAgIH0KICAgICAgaWYgKCFjb250aW51ZUFuYWx5emluZykgYnJlYWs7CiAgICB9CiAgfQoKICB2b2lkIGJhaWxvdXQoU3RyaW5nIHJlYXNvbikgewogICAgaWYgKGRlYnVnLlZFUkJPU0UpIHsKICAgICAgcHJpbnQoJ0JhaWxpbmcgb3V0IG9uICR0cmFjZWRUeXBlIGJlY2F1c2U6ICRyZWFzb24nKTsKICAgIH0KICAgIGNvbnRpbnVlQW5hbHl6aW5nID0gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXdhaXRUeXBlSW5mb3JtYXRpb24oQXdhaXRUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgYmFpbG91dCgiUGFzc2VkIHRocm91Z2ggYXdhaXQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRZaWVsZFR5cGVJbmZvcm1hdGlvbihZaWVsZFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICAvLyBUT0RPKDI5MzQ0KTogVGhlIGVuY2xvc2luZyBzeW5jKi9hc3luYy9hc3luYyogbWV0aG9kIGNvdWxkIGhhdmUgYQogICAgLy8gdHJhY2FibGUgVHlwZUluZm9ybWF0aW9uIGZvciB0aGUgSXRlcmFibGUgLyBGdXR1cmUgLyBTdHJlYW0gd2l0aCBhbgogICAgLy8gZWxlbWVudCBUeXBlSW5mb3JtYXRpb24uIFRoZW4gWWllbGRUeXBlSW5mb3JtYXRpb24gY291bGQgY29ubmVjdCB0aGUKICAgIC8vIHNvdXJjZSB0eXBlIGluZm9ybWF0aW9uIHRvIHRoZSB0cmFjYWJsZSBlbGVtZW50LgogICAgYmFpbG91dCgiUGFzc2VkIHRocm91Z2ggeWllbGQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROYXJyb3dUeXBlSW5mb3JtYXRpb24oTmFycm93VHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGFkZE5ld0VzY2FwZUluZm9ybWF0aW9uKGluZm8pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFBoaUVsZW1lbnRUeXBlSW5mb3JtYXRpb24oUGhpRWxlbWVudFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBhZGROZXdFc2NhcGVJbmZvcm1hdGlvbihpbmZvKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRFbGVtZW50SW5Db250YWluZXJUeXBlSW5mb3JtYXRpb24oCiAgICAgIEVsZW1lbnRJbkNvbnRhaW5lclR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBhZGROZXdFc2NhcGVJbmZvcm1hdGlvbihpbmZvKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb24oRWxlbWVudEluU2V0VHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGFkZE5ld0VzY2FwZUluZm9ybWF0aW9uKGluZm8pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEtleUluTWFwVHlwZUluZm9ybWF0aW9uKEtleUluTWFwVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIC8vIFdlIGRvIG5vdCB0cmFjayB0aGUgdXNlIG9mIGtleXMgZnJvbSBhIG1hcCwgc28gd2UgaGF2ZSB0byBiYWlsLgogICAgYmFpbG91dCgnVXNlZCBhcyBrZXkgaW4gTWFwJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VmFsdWVJbk1hcFR5cGVJbmZvcm1hdGlvbihWYWx1ZUluTWFwVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGFkZE5ld0VzY2FwZUluZm9ybWF0aW9uKGluZm8pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpc3RUeXBlSW5mb3JtYXRpb24oTGlzdFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBsaXN0c1RvQW5hbHl6ZS5hZGQoaW5mbyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0VHlwZUluZm9ybWF0aW9uKFNldFR5cGVJbmZvcm1hdGlvbiBpbmZvKSB7CiAgICBzZXRzVG9BbmFseXplLmFkZChpbmZvKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXBUeXBlSW5mb3JtYXRpb24oTWFwVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIG1hcHNUb0FuYWx5emUuYWRkKGluZm8pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbmNyZXRlVHlwZUluZm9ybWF0aW9uKENvbmNyZXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdMaXRlcmFsVHlwZUluZm9ybWF0aW9uKFN0cmluZ0xpdGVyYWxUeXBlSW5mb3JtYXRpb24gaW5mbykge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJvb2xMaXRlcmFsVHlwZUluZm9ybWF0aW9uKEJvb2xMaXRlcmFsVHlwZUluZm9ybWF0aW9uIGluZm8pIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDbG9zdXJlVHlwZUluZm9ybWF0aW9uKENsb3N1cmVUeXBlSW5mb3JtYXRpb24gaW5mbykge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbigKICAgICAgQ2xvc3VyZUNhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHt9CgogIEBvdmVycmlkZQogIHZpc2l0U3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24oU3RhdGljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgTWVtYmVyRW50aXR5IGNhbGxlZCA9IGluZm8uY2FsbGVkRWxlbWVudDsKICAgIFR5cGVJbmZvcm1hdGlvbiBpbmZlcnJlZCA9IGluZmVycmVyLnR5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKGNhbGxlZCk7CiAgICBpZiAoaW5mZXJyZWQgPT0gY3VycmVudFVzZXIpIHsKICAgICAgYWRkTmV3RXNjYXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgICB9CiAgfQoKICB2b2lkIGFuYWx5emVTdG9yZWRJbnRvTGlzdChMaXN0VHlwZUluZm9ybWF0aW9uIGxpc3QpIHsKICAgIGluZmVycmVyLmFuYWx5emVMaXN0QW5kRW5xdWV1ZShsaXN0KTsKICAgIGlmIChsaXN0LmJhaWxlZE91dCkgewogICAgICBiYWlsb3V0KCdTdG9yZWQgaW4gYSBsaXN0IHRoYXQgYmFpbGVkIG91dCcpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdC5mbG93c0ludG8uZm9yRWFjaCgoVHlwZUluZm9ybWF0aW9uIGZsb3cpIHsKICAgICAgICBmbG93LnVzZXJzLmZvckVhY2goKFR5cGVJbmZvcm1hdGlvbiB1c2VyKSB7CiAgICAgICAgICBpZiAodXNlciBpcyBEeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24pIHsKICAgICAgICAgICAgaWYgKHVzZXIucmVjZWl2ZXIgIT0gZmxvdykgcmV0dXJuOwogICAgICAgICAgICBpZiAoaW5mZXJyZXIucmV0dXJuc0xpc3RFbGVtZW50VHlwZVNldC5jb250YWlucyh1c2VyLnNlbGVjdG9yKSkgewogICAgICAgICAgICAgIGFkZE5ld0VzY2FwZUluZm9ybWF0aW9uKHVzZXIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFkb2VzTm90RXNjYXBlTGlzdFNldC5jb250YWlucyh1c2VyLnNlbGVjdG9yLm5hbWUpKSB7CiAgICAgICAgICAgICAgYmFpbG91dCgnRXNjYXBlIGZyb20gYSBsaXN0IHZpYSBbJHt1c2VyLnNlbGVjdG9yLm5hbWV9XScpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgdm9pZCBhbmFseXplU3RvcmVkSW50b1NldChTZXRUeXBlSW5mb3JtYXRpb24gc2V0KSB7CiAgICBpbmZlcnJlci5hbmFseXplU2V0QW5kRW5xdWV1ZShzZXQpOwogICAgaWYgKHNldC5iYWlsZWRPdXQpIHsKICAgICAgYmFpbG91dCgnU3RvcmVkIGluIGEgc2V0IHRoYXQgYmFpbGVkIG91dCcpOwogICAgfSBlbHNlIHsKICAgICAgc2V0LmZsb3dzSW50by5mb3JFYWNoKChUeXBlSW5mb3JtYXRpb24gZmxvdykgewogICAgICAgIGZsb3cudXNlcnMuZm9yRWFjaCgoVHlwZUluZm9ybWF0aW9uIHVzZXIpIHsKICAgICAgICAgIGlmICh1c2VyIGlzIER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbikgewogICAgICAgICAgICBpZiAodXNlci5yZWNlaXZlciAhPSBmbG93KSByZXR1cm47CiAgICAgICAgICAgIGlmICh1c2VyLnNlbGVjdG9yLmlzSW5kZXgpIHsKICAgICAgICAgICAgICBhZGROZXdFc2NhcGVJbmZvcm1hdGlvbih1c2VyKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghZG9lc05vdEVzY2FwZVNldFNldC5jb250YWlucyh1c2VyLnNlbGVjdG9yLm5hbWUpKSB7CiAgICAgICAgICAgICAgYmFpbG91dCgnRXNjYXBlIGZyb20gYSBzZXQgdmlhIFske3VzZXIuc2VsZWN0b3IubmFtZX1dJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgfQoKICB2b2lkIGFuYWx5emVTdG9yZWRJbnRvTWFwKE1hcFR5cGVJbmZvcm1hdGlvbiBtYXApIHsKICAgIGluZmVycmVyLmFuYWx5emVNYXBBbmRFbnF1ZXVlKG1hcCk7CiAgICBpZiAobWFwLmJhaWxlZE91dCkgewogICAgICBiYWlsb3V0KCdTdG9yZWQgaW4gYSBtYXAgdGhhdCBiYWlsZWQgb3V0Jyk7CiAgICB9IGVsc2UgewogICAgICBtYXAuZmxvd3NJbnRvLmZvckVhY2goKFR5cGVJbmZvcm1hdGlvbiBmbG93KSB7CiAgICAgICAgZmxvdy51c2Vycy5mb3JFYWNoKChUeXBlSW5mb3JtYXRpb24gdXNlcikgewogICAgICAgICAgaWYgKHVzZXIgaXMgRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uKSB7CiAgICAgICAgICAgIGlmICh1c2VyLnJlY2VpdmVyICE9IGZsb3cpIHJldHVybjsKICAgICAgICAgICAgaWYgKHVzZXIuc2VsZWN0b3IuaXNJbmRleCkgewogICAgICAgICAgICAgIGFkZE5ld0VzY2FwZUluZm9ybWF0aW9uKHVzZXIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFkb2VzTm90RXNjYXBlTWFwU2V0LmNvbnRhaW5zKHVzZXIuc2VsZWN0b3IubmFtZSkpIHsKICAgICAgICAgICAgICBiYWlsb3V0KCdFc2NhcGUgZnJvbSBhIG1hcCB2aWEgWyR7dXNlci5zZWxlY3Rvci5uYW1lfV0nKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICB9CgogIC8vLyBDaGVja3Mgd2hldGhlciB0aGlzIGlzIGEgY2FsbCB0byBhIGxpc3QgYWRkaW5nIG1ldGhvZC4gVGhlIGRlZmluaXRpb24gb2YKICAvLy8gd2hhdCBsaXN0IGFkZGluZyBtZWFucyBoYXMgdG8gc3RheSBpbiBzeW5jIHdpdGgKICAvLy8gW2lzUGFyYW1ldGVyT2ZMaXN0QWRkaW5nTWV0aG9kXS4KICBib29sIG1pZ2h0QWRkVG9Db250YWluZXIoRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGlmIChpbmZvLmFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoaW5mby5hcmd1bWVudHMubmFtZWQuaXNOb3RFbXB0eSkgcmV0dXJuIGZhbHNlOwogICAgU3RyaW5nIHNlbGVjdG9yTmFtZSA9IGluZm8uc2VsZWN0b3IubmFtZTsKICAgIExpc3Q8VHlwZUluZm9ybWF0aW9uPiBhcmd1bWVudHMgPSBpbmZvLmFyZ3VtZW50cy5wb3NpdGlvbmFsOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICByZXR1cm4gKHNlbGVjdG9yTmFtZSA9PSAnYWRkJyAmJiBjdXJyZW50VXNlciA9PSBhcmd1bWVudHNbMF0pOwogICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsKICAgICAgcmV0dXJuIChzZWxlY3Rvck5hbWUgPT0gJ2luc2VydCcgJiYgY3VycmVudFVzZXIgPT0gYXJndW1lbnRzWzFdKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGJvb2wgaXNJbmRleFNldEFyZ3VtZW50KER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiBpbmZvLCBpbnQgaW5kZXgpIHsKICAgIFN0cmluZyBzZWxlY3Rvck5hbWUgPSBpbmZvLnNlbGVjdG9yLm5hbWU7CiAgICBpZiAoc2VsZWN0b3JOYW1lICE9ICdbXT0nKSByZXR1cm4gZmFsc2U7CiAgICBhc3NlcnQoaW5mby5hcmd1bWVudHMubGVuZ3RoID09IDIpOwogICAgTGlzdDxUeXBlSW5mb3JtYXRpb24+IGFyZ3VtZW50cyA9IGluZm8uYXJndW1lbnRzLnBvc2l0aW9uYWw7CiAgICByZXR1cm4gY3VycmVudFVzZXIgPT0gYXJndW1lbnRzW2luZGV4XTsKICB9CgogIC8vLyBDaGVja3Mgd2hldGhlciB0aGUgY2FsbCBzaXRlIGZsb3dzIHRoZSBjdXJyZW50VXNlciB0byB0aGUga2V5IGFyZ3VtZW50IG9mCiAgLy8vIGFuIGluZGV4aW5nIHNldHRlci4gVGhpcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoCiAgLy8vIFtpc1BhcmFtZXRlck9mTWFwQWRkaW5nTWV0aG9kXS4KICBib29sIGlzSW5kZXhTZXRLZXkoRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIHJldHVybiBpc0luZGV4U2V0QXJndW1lbnQoaW5mbywgMCk7CiAgfQoKICAvLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGNhbGwgc2l0ZSBmbG93cyB0aGUgY3VycmVudFVzZXIgdG8gdGhlIHZhbHVlIGFyZ3VtZW50CiAgLy8vIG9mIGFuIGluZGV4aW5nIHNldHRlci4gVGhpcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoCiAgLy8vIFtpc1BhcmFtZXRlck9mTGlzdEFkZGluZ01ldGhvZF0gYW5kIFtpc1BhcmFtZXRlck9mTWFwQWRkaW5nTWV0aG9kXS4KICBib29sIGlzSW5kZXhTZXRWYWx1ZShEeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgcmV0dXJuIGlzSW5kZXhTZXRBcmd1bWVudChpbmZvLCAxKTsKICB9CgogIHZvaWQgYmFpbG91dElmUmVhY2hlcyhib29sIHByZWRpY2F0ZShQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24gZSkpIHsKICAgIGZvciAodmFyIHVzZXIgaW4gY3VycmVudFVzZXIudXNlcnMpIHsKICAgICAgaWYgKHVzZXIgaXMgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uKSB7CiAgICAgICAgaWYgKHByZWRpY2F0ZSh1c2VyKSkgewogICAgICAgICAgYmFpbG91dCgnUmVhY2hlZCBzdXBwcmVzc2VkIHBhcmFtZXRlciB3aXRob3V0IHByZWNpc2UgcmVjZWl2ZXInKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdER5bmFtaWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbigKICAgICAgRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIHZvaWQgYWRkc1RvQ29udGFpbmVyKEFic3RyYWN0VmFsdWUgbWFzaykgewogICAgICBPYmplY3QgYWxsb2NhdGlvbk5vZGUgPQogICAgICAgICAgaW5mZXJyZXIuYWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRBbGxvY2F0aW9uTm9kZShtYXNrKTsKICAgICAgaWYgKGFsbG9jYXRpb25Ob2RlICE9IG51bGwpIHsKICAgICAgICBMaXN0VHlwZUluZm9ybWF0aW9uIGxpc3QgPQogICAgICAgICAgICBpbmZlcnJlci50eXBlcy5hbGxvY2F0ZWRMaXN0c1thbGxvY2F0aW9uTm9kZV07CiAgICAgICAgbGlzdHNUb0FuYWx5emUuYWRkKGxpc3QpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoZSBbbWFza10gaXMgYSB1bmlvbiBvZiB0d28gY29udGFpbmVycywgYW5kIHdlIGxvc2UgdHJhY2sgb2Ygd2hlcmUKICAgICAgICAvLyB0aGVzZSBjb250YWluZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludC4KICAgICAgICBiYWlsb3V0KCdTdG9yZWQgaW4gdG9vIG1hbnkgY29udGFpbmVycycpOwogICAgICB9CiAgICB9CgogICAgdm9pZCBhZGRzVG9NYXBWYWx1ZShBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgICAgT2JqZWN0IGFsbG9jYXRpb25Ob2RlID0KICAgICAgICAgIGluZmVycmVyLmFic3RyYWN0VmFsdWVEb21haW4uZ2V0QWxsb2NhdGlvbk5vZGUobWFzayk7CiAgICAgIGlmIChhbGxvY2F0aW9uTm9kZSAhPSBudWxsKSB7CiAgICAgICAgTWFwVHlwZUluZm9ybWF0aW9uIG1hcCA9IGluZmVycmVyLnR5cGVzLmFsbG9jYXRlZE1hcHNbYWxsb2NhdGlvbk5vZGVdOwogICAgICAgIG1hcHNUb0FuYWx5emUuYWRkKG1hcCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhlIFttYXNrXSBpcyBhIHVuaW9uLiBTZWUgY29tbWVudCBmb3IgW21hc2tdIGFib3ZlLgogICAgICAgIGJhaWxvdXQoJ1N0b3JlZCBpbiB0b28gbWFueSBtYXBzJyk7CiAgICAgIH0KICAgIH0KCiAgICB2b2lkIGFkZHNUb01hcEtleShBYnN0cmFjdFZhbHVlIG1hc2spIHsKICAgICAgLy8gV2UgZG8gbm90IHRyYWNrIHRoZSB1c2Ugb2Yga2V5cyBmcm9tIGEgbWFwLCBzbyB3ZSBoYXZlIHRvIGJhaWwuCiAgICAgIGJhaWxvdXQoJ1VzZWQgYXMga2V5IGluIE1hcCcpOwogICAgfQoKICAgIC8vICJhWy4uLl0gPSB4IiBjb3VsZCBiZSBhIGxpc3QgKGNvbnRhaW5lcikgb3IgbWFwIGFzc2lnbmVtbnQuCiAgICBpZiAoaXNJbmRleFNldFZhbHVlKGluZm8pKSB7CiAgICAgIHZhciByZWNlaXZlclR5cGUgPSBpbmZvLnJlY2VpdmVyLnR5cGU7CiAgICAgIGlmIChpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluLmlzQ29udGFpbmVyKHJlY2VpdmVyVHlwZSkpIHsKICAgICAgICBhZGRzVG9Db250YWluZXIocmVjZWl2ZXJUeXBlKTsKICAgICAgfSBlbHNlIGlmIChpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluLmlzTWFwKHJlY2VpdmVyVHlwZSkpIHsKICAgICAgICBhZGRzVG9NYXBWYWx1ZShyZWNlaXZlclR5cGUpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIE5vdCBhIGNvbnRhaW5lciBvciBtYXAsIHNvIHRoZSB0YXJnZXRzIGNvdWxkIGJlIGFueSBtZXRob2RzLiBUaGVyZQogICAgICAgIC8vIGFyZSBlZGdlcyBmcm9tIHRoZSBbY3VycmVudFVzZXJdIHRvIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSB0YXJnZXRzLCBzbwogICAgICAgIC8vIHRyYWNpbmcgd2lsbCBjb250aW51ZSBpbnRvIHRoZSB0YXJnZXRzLiAgVHJhY2luZyBzdG9wcyBhdCBwYXJhbWV0ZXJzCiAgICAgICAgLy8gdGhhdCBtYXRjaCB0aGUgdGFyZ2V0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSByZWNlaXZlclR5cGVzIGFib3ZlICh0bwogICAgICAgIC8vIHByZXZlbnQgaW1wcmVjaXNlIHJlc3VsdHMgZnJvbSB0cmFjaW5nIHRoZSBpbXBsZW1lbnRhdGlvbiksIHNvIHdlCiAgICAgICAgLy8gbmVlZCBjb21wZW5zYXRlIGlmIG9uZSBvZiB0aGUgdGFyZ2V0cyBpcyBpbiB0aGUgdGFyZ2V0IHNldC4gSWYgdGhlcmUKICAgICAgICAvLyBpcyBhbiBlZGdlIHRvIGEgcGFyYW1ldGVyIG1hdGNoaW5nIFtpc1BhcmFtZXRlck9mTGlzdEFkZGluZ01ldGhvZF0gb3IKICAgICAgICAvLyBbaXNQYXJhbWV0ZXJPZk1hcEFkZGluZ01ldGhvZF0gdGhlbiB0aGUgdHJhY2VkIHZhbHVlIGlzIGJlaW5nIHN0b3JlZAogICAgICAgIC8vIGludG8gYW4gdW50cmFjZWQgbGlzdCBvciBtYXAuCgogICAgICAgIC8vIFRPRE8oc3JhKTogSXQgd291bGQgYmUgbW9yZSBwcmVjaXNlIHRvIHNwZWNpZmljYWxseSBtYXRjaCB0aGUgYHZhbHVlJwogICAgICAgIC8vIHBhcmFtZXRlcnMgb2YgIm9wZXJhdG9yIFtdPSIuCiAgICAgICAgYmFpbG91dElmUmVhY2hlcyhpc1BhcmFtZXRlck9mTGlzdEFkZGluZ01ldGhvZCk7CiAgICAgICAgYmFpbG91dElmUmVhY2hlcyhpc1BhcmFtZXRlck9mTWFwQWRkaW5nTWV0aG9kKTsKICAgICAgfQogICAgfQoKICAgIC8vIENvdWxkIGJlOiAgbVt4XSA9IC4uLjsKICAgIGlmIChpc0luZGV4U2V0S2V5KGluZm8pKSB7CiAgICAgIHZhciByZWNlaXZlclR5cGUgPSBpbmZvLnJlY2VpdmVyLnR5cGU7CiAgICAgIGlmIChpbmZlcnJlci5hYnN0cmFjdFZhbHVlRG9tYWluLmlzTWFwKHJlY2VpdmVyVHlwZSkpIHsKICAgICAgICBhZGRzVG9NYXBLZXkocmVjZWl2ZXJUeXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBiYWlsb3V0SWZSZWFjaGVzKGlzUGFyYW1ldGVyT2ZMaXN0QWRkaW5nTWV0aG9kKTsKICAgICAgICBiYWlsb3V0SWZSZWFjaGVzKGlzUGFyYW1ldGVyT2ZNYXBBZGRpbmdNZXRob2QpOwogICAgICB9CiAgICB9CgogICAgaWYgKG1pZ2h0QWRkVG9Db250YWluZXIoaW5mbykpIHsKICAgICAgdmFyIHJlY2VpdmVyVHlwZSA9IGluZm8ucmVjZWl2ZXIudHlwZTsKICAgICAgaWYgKGluZmVycmVyLmFic3RyYWN0VmFsdWVEb21haW4uaXNDb250YWluZXIocmVjZWl2ZXJUeXBlKSkgewogICAgICAgIGFkZHNUb0NvbnRhaW5lcihyZWNlaXZlclR5cGUpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIE5vdCBhIGNvbnRhaW5lciwgc2VlIG5vdGUgYWJvdmUuCiAgICAgICAgYmFpbG91dElmUmVhY2hlcyhpc1BhcmFtZXRlck9mTGlzdEFkZGluZ01ldGhvZCk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaW5mby50YXJnZXRzSW5jbHVkZUNvbXBsZXhOb1N1Y2hNZXRob2QoaW5mZXJyZXIpICYmCiAgICAgICAgaW5mby5hcmd1bWVudHMgIT0gbnVsbCAmJgogICAgICAgIGluZm8uYXJndW1lbnRzLmNvbnRhaW5zKGN1cnJlbnRVc2VyKSkgewogICAgICBiYWlsb3V0KCdQYXNzZWQgdG8gbm9TdWNoTWV0aG9kJyk7CiAgICB9CgogICAgSXRlcmFibGU8VHlwZUluZm9ybWF0aW9uPiBpbmZlcnJlZFRhcmdldFR5cGVzID0KICAgICAgICBpbmZvLmNvbmNyZXRlVGFyZ2V0cy5tYXAoKE1lbWJlckVudGl0eSBlbnRpdHkpIHsKICAgICAgcmV0dXJuIGluZmVycmVyLnR5cGVzLmdldEluZmVycmVkVHlwZU9mTWVtYmVyKGVudGl0eSk7CiAgICB9KTsKICAgIGlmIChpbmZlcnJlZFRhcmdldFR5cGVzLmFueSgodXNlcikgPT4gdXNlciA9PSBjdXJyZW50VXNlcikpIHsKICAgICAgYWRkTmV3RXNjYXBlSW5mb3JtYXRpb24oaW5mbyk7CiAgICB9CiAgfQoKICAvLy8gQ2hlY2sgd2hldGhlciBlbGVtZW50IGlzIHRoZSBwYXJhbWV0ZXIgb2YgYSBsaXN0IGFkZGluZyBtZXRob2QuCiAgLy8vIFRoZSBkZWZpbml0aW9uIG9mIHdoYXQgYSBsaXN0IGFkZGluZyBtZXRob2QgaXMgaGFzIHRvIHN0YXkgaW4gc3luYyB3aXRoCiAgLy8vIFttaWdodEFkZFRvQ29udGFpbmVyXS4KICBib29sIGlzUGFyYW1ldGVyT2ZMaXN0QWRkaW5nTWV0aG9kKFBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbiBwYXJhbWV0ZXJJbmZvKSB7CiAgICBpZiAoIXBhcmFtZXRlckluZm8uaXNSZWd1bGFyUGFyYW1ldGVyKSByZXR1cm4gZmFsc2U7CiAgICBpZiAocGFyYW1ldGVySW5mby5tZXRob2QuZW5jbG9zaW5nQ2xhc3MgIT0KICAgICAgICBpbmZlcnJlci5jbG9zZWRXb3JsZC5jb21tb25FbGVtZW50cy5qc0FycmF5Q2xhc3MpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgU3RyaW5nIG5hbWUgPSBwYXJhbWV0ZXJJbmZvLm1ldGhvZC5uYW1lOwogICAgcmV0dXJuIChuYW1lID09ICdbXT0nKSB8fCAobmFtZSA9PSAnYWRkJykgfHwgKG5hbWUgPT0gJ2luc2VydCcpOwogIH0KCiAgLy8vIENoZWNrIHdoZXRoZXIgZWxlbWVudCBpcyB0aGUgcGFyYW1ldGVyIG9mIGEgbGlzdCBhZGRpbmcgbWV0aG9kLgogIC8vLyBUaGUgZGVmaW5pdGlvbiBvZiB3aGF0IGEgbGlzdCBhZGRpbmcgbWV0aG9kIGlzIGhhcyB0byBzdGF5IGluIHN5bmMgd2l0aAogIC8vLyBbaXNJbmRleFNldEtleV0gYW5kIFtpc0luZGV4U2V0VmFsdWVdLgogIGJvb2wgaXNQYXJhbWV0ZXJPZk1hcEFkZGluZ01ldGhvZChQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24gcGFyYW1ldGVySW5mbykgewogICAgaWYgKCFwYXJhbWV0ZXJJbmZvLmlzUmVndWxhclBhcmFtZXRlcikgcmV0dXJuIGZhbHNlOwogICAgaWYgKHBhcmFtZXRlckluZm8ubWV0aG9kLmVuY2xvc2luZ0NsYXNzICE9CiAgICAgICAgaW5mZXJyZXIuY2xvc2VkV29ybGQuY29tbW9uRWxlbWVudHMubWFwTGl0ZXJhbENsYXNzKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIFN0cmluZyBuYW1lID0gcGFyYW1ldGVySW5mby5tZXRob2QubmFtZTsKICAgIHJldHVybiAobmFtZSA9PSAnW109Jyk7CiAgfQoKICBib29sIGlzQ2xvc3VyZShNZW1iZXJFbnRpdHkgZWxlbWVudCkgewogICAgaWYgKCFlbGVtZW50LmlzRnVuY3Rpb24pIHJldHVybiBmYWxzZTsKCiAgICAvLy8gQ3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgW0Z1bmN0aW9uXSBhbHNvCiAgICAvLy8gY2xvc3VyaXplcyB0aGUgY29ycmVzcG9uZGluZyBbY2FsbF0gbWVtYmVyLiBXZSBkbyBub3QgY3VycmVudGx5CiAgICAvLy8gdHJhY2sgdGhlc2UsIHRodXMgdGhlIGNoZWNrIGZvciBbaXNDbG9zdXJpemVkXSBvbiBzdWNoIGEgbWV0aG9kIHdpbGwKICAgIC8vLyByZXR1cm4gZmFsc2UuIEluc3RlYWQgd2UgY2F0Y2ggdGhhdCBjYXNlIGhlcmUgZm9yIG5vdy4KICAgIC8vIFRPRE8oaGVyaHV0KTogSGFuZGxlIGNyZWF0aW9uIG9mIGNsb3N1cmVzIGZyb20gaW5zdGFuY2VzIG9mIEZ1bmN0aW9uLgogICAgaWYgKGVsZW1lbnQuaXNJbnN0YW5jZU1lbWJlciAmJiBlbGVtZW50Lm5hbWUgPT0gSWRlbnRpZmllcnMuY2FsbCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIENsYXNzRW50aXR5IGNscyA9IGVsZW1lbnQuZW5jbG9zaW5nQ2xhc3M7CiAgICByZXR1cm4gY2xzICE9IG51bGwgJiYgY2xzLmlzQ2xvc3VyZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNZW1iZXJUeXBlSW5mb3JtYXRpb24oTWVtYmVyVHlwZUluZm9ybWF0aW9uIGluZm8pIHsKICAgIGlmIChpbmZvLmlzQ2xvc3VyaXplZCkgewogICAgICBiYWlsb3V0KCdSZXR1cm5lZCBmcm9tIGEgY2xvc3VyaXplZCBtZXRob2QnKTsKICAgIH0KICAgIGlmIChpc0Nsb3N1cmUoaW5mby5tZW1iZXIpKSB7CiAgICAgIGJhaWxvdXQoJ1JldHVybmVkIGZyb20gYSBjbG9zdXJlJyk7CiAgICB9CiAgICBpZiAoaW5mby5tZW1iZXIuaXNGaWVsZCAmJgogICAgICAgICFpbmZlcnJlci5jYW5GaWVsZEJlVXNlZEZvckdsb2JhbE9wdGltaXphdGlvbnMoaW5mby5tZW1iZXIpKSB7CiAgICAgIGJhaWxvdXQoJ0VzY2FwZSB0byBjb2RlIHRoYXQgaGFzIHNwZWNpYWwgYmFja2VuZCB0cmVhdG1lbnQnKTsKICAgIH0KICAgIGFkZE5ld0VzY2FwZUluZm9ybWF0aW9uKGluZm8pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbihQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb24gaW5mbykgewogICAgaWYgKGluZmVycmVyLmNsb3NlZFdvcmxkLm5hdGl2ZURhdGEuaXNOYXRpdmVNZW1iZXIoaW5mby5tZXRob2QpKSB7CiAgICAgIGJhaWxvdXQoJ1Bhc3NlZCB0byBhIG5hdGl2ZSBtZXRob2QnKTsKICAgIH0KICAgIGlmICghaW5mZXJyZXIKICAgICAgICAuY2FuRnVuY3Rpb25QYXJhbWV0ZXJzQmVVc2VkRm9yR2xvYmFsT3B0aW1pemF0aW9ucyhpbmZvLm1ldGhvZCkpIHsKICAgICAgYmFpbG91dCgnRXNjYXBlIHRvIGNvZGUgdGhhdCBoYXMgc3BlY2lhbCBiYWNrZW5kIHRyZWF0bWVudCcpOwogICAgfQogICAgaWYgKGlzUGFyYW1ldGVyT2ZMaXN0QWRkaW5nTWV0aG9kKGluZm8pIHx8CiAgICAgICAgaXNQYXJhbWV0ZXJPZk1hcEFkZGluZ01ldGhvZChpbmZvKSkgewogICAgICAvLyBUaGVzZSBlbGVtZW50cyBhcmUgYmVpbmcgaGFuZGxlZCBpbgogICAgICAvLyBbdmlzaXREeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb25dLgogICAgICByZXR1cm47CiAgICB9CiAgICBhZGROZXdFc2NhcGVJbmZvcm1hdGlvbihpbmZvKTsKICB9Cn0KgigATk48ASsBMCQoJR4fIAFECUgSCA4OEhEBFA0QDA4KARAJDAsPDQwPEQwREgwODQkBExITBAFHEggODhIRARQNEAwOCgEPCQwLEQwPDwQBRxIIDg4SEQ8NEAwLERMJRQkEAUpBJCEBKExMATEBRh0+AUNLP0wBQlA4SQFCSz1JAUsBNB8hATcqGRgEASktRhgqNBZGCAYSBAETQUcpICs1Iw8IOCobCCg8CCk6CCc6CCUGBAEgGTwGHwQBDD4lBAEMPklLTDglBAEMQCMEAQxIIwQBDC8wIwQBDEwjBAEMREcjBAEMSCMEAQw8HgQBDDodBAEMOh0EAQxFAQxPAQxLAQxDAQwsLgEMSy5PIyUGBAE5KhozDTY0OC9OLU1JDgwMCgYEATYoGTINNTQ4LyktTEgODAwKBgQBNigZMg01NDgvKS1MSA4MDAoGBAFPNidCLjcuQSFFKEgGEgQBTC4tKEEsBAFQOSY8KAQBTzxKPigEAUYqLh9MEQoIBgQBDCwtLx5AJCM7Ig9PPzIIBgEuHkAkTyAPQCwIBgEsSSUGAUMhLUQnRSYPTlFQT01QUVApAVEpOTgIBgEeHy0+JA85OAgGASUtRCcPLDkIBgE8IjApBgE0OT0IQiUGBAFGTh1POS88FAYtRQQBRk4tTjkvPxQGLRwEASkrAUhITT9NSBMGLikEAQxAHTQGIioGH0dEBiMEAQxGRywGEktEBi8uLTAOBiMEAgEucGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvbm9kZV90cmFjZXIuZGFydEFzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2pzX2ludGVyb3BfYW5hbHlzaXMuZGFydIijLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBBbmFseXNpcyB0byBkZXRlcm1pbmUgaG93IHRvIGdlbmVyYXRlIGNvZGUgZm9yIHR5cGVkIEphdmFTY3JpcHQgaW50ZXJvcC4KbGlicmFyeSBjb21waWxlci5zcmMuanNfYmFja2VuZC5qc19pbnRlcm9wX2FuYWx5c2lzOwoKaW1wb3J0ICcuLi9lbGVtZW50cy90eXBlcy5kYXJ0JzsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBhcyBqc0FzdDsKaW1wb3J0ICcuLi9qcy9qcy5kYXJ0JyBzaG93IGpzOwppbXBvcnQgJy4uL3VuaXZlcnNlL3NlbGVjdG9yLmRhcnQnIHNob3cgU2VsZWN0b3I7CmltcG9ydCAnLi4vdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2J1aWxkZXIuZGFydCcgc2hvdyBTZWxlY3RvckNvbnN0cmFpbnRzOwppbXBvcnQgJ25hbWVyLmRhcnQnOwppbXBvcnQgJ25hdGl2ZV9kYXRhLmRhcnQnOwoKanNBc3QuU3RhdGVtZW50IGJ1aWxkSnNJbnRlcm9wQm9vdHN0cmFwKAogICAgQ29kZWdlbldvcmxkIGNvZGVnZW5Xb3JsZCwgTmF0aXZlQmFzaWNEYXRhIG5hdGl2ZUJhc2ljRGF0YSwgTmFtZXIgbmFtZXIpIHsKICBpZiAoIW5hdGl2ZUJhc2ljRGF0YS5pc0pzSW50ZXJvcFVzZWQpIHJldHVybiBudWxsOwogIExpc3Q8anNBc3QuU3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gPGpzQXN0LlN0YXRlbWVudD5bXTsKICBjb2RlZ2VuV29ybGQuZm9yRWFjaEludm9rZWROYW1lKAogICAgICAoU3RyaW5nIG5hbWUsIE1hcDxTZWxlY3RvciwgU2VsZWN0b3JDb25zdHJhaW50cz4gc2VsZWN0b3JzKSB7CiAgICBzZWxlY3RvcnMuZm9yRWFjaCgoU2VsZWN0b3Igc2VsZWN0b3IsIFNlbGVjdG9yQ29uc3RyYWludHMgY29uc3RyYWludHMpIHsKICAgICAgaWYgKHNlbGVjdG9yLmlzQ2xvc3VyZUNhbGwpIHsKICAgICAgICAvLyBUT0RPKGphY29icik6IHN1cHBvcnQgbmFtZWQgYXJndW1lbnRzLgogICAgICAgIGlmIChzZWxlY3Rvci5uYW1lZEFyZ3VtZW50Q291bnQgPiAwKSByZXR1cm47CiAgICAgICAgaW50IGFyZ3VtZW50Q291bnQgPSBzZWxlY3Rvci5hcmd1bWVudENvdW50OwogICAgICAgIFN0cmluZyBjYW5kaWRhdGVQYXJhbWV0ZXJOYW1lcyA9CiAgICAgICAgICAgICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJzsKICAgICAgICBMaXN0PFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBMaXN0PFN0cmluZz4uZ2VuZXJhdGUoCiAgICAgICAgICAgIGFyZ3VtZW50Q291bnQsIChpKSA9PiBjYW5kaWRhdGVQYXJhbWV0ZXJOYW1lc1tpXSk7CgogICAgICAgIGpzQXN0Lk5hbWUgbmFtZSA9IG5hbWVyLmludm9jYXRpb25OYW1lKHNlbGVjdG9yKTsKICAgICAgICBzdGF0ZW1lbnRzLmFkZChqcy5zdGF0ZW1lbnQoCiAgICAgICAgICAgICdGdW5jdGlvbi5wcm90b3R5cGUuIyA9IGZ1bmN0aW9uKCMpIHsgcmV0dXJuIHRoaXMoIykgfScsCiAgICAgICAgICAgIFtuYW1lLCBwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzXSkpOwogICAgICB9CiAgICB9KTsKICB9KTsKICByZXR1cm4gbmV3IGpzQXN0LkJsb2NrKHN0YXRlbWVudHMpOwp9CgpGdW5jdGlvblR5cGUgYnVpbGRKc0Z1bmN0aW9uVHlwZSgpIHsKICAvLyBUT0RPKGphY29icik6IGNvbnNpZGVyIHVzaW5nIGNvZGVnZW5Xb3JsZEJ1aWxkZXIuaXNDaGVja3MgdG8gZGV0ZXJtaW5lIHRoZQogIC8vIHJhbmdlIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYXQgbmVlZCB0byBiZSBzdXBwb3J0ZWQgYnkgSmF2YVNjcmlwdAogIC8vIGZ1bmN0aW9uIHR5cGVzLgogIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKAogICAgICBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoMTYsIGNvbnN0IER5bmFtaWNUeXBlKCkpLAogICAgICBjb25zdCA8U3RyaW5nPltdLAogICAgICBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgIGNvbnN0IDxGdW5jdGlvblR5cGVWYXJpYWJsZT5bXSk7Cn0KOABOTjwBTTUBISEgMjFCFRsBKU81OiNETSQyNTQpRD0/ATolRS4ICAYmAgElUEsVGxsaOhgaJwIBOHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvanNfaW50ZXJvcF9hbmFseXNpcy5kYXJ0NnNka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL3Jlc29sdXRpb24vcmVnaXN0cnkuZGFydJaKLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5yZXNvbHV0aW9uLnJlZ2lzdHJ5OwoKaW1wb3J0ICcuLi9jb21tb24vcmVzb2x1dGlvbi5kYXJ0JyBzaG93IFJlc29sdXRpb25JbXBhY3Q7CmltcG9ydCAnLi4vY29uc3RhbnRzL2V4cHJlc3Npb25zLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnIHNob3cgQ2xhc3NFbnRpdHksIE1lbWJlckVudGl0eTsKaW1wb3J0ICcuLi91bml2ZXJzZS9mZWF0dXJlLmRhcnQnOwppbXBvcnQgJy4uL3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0JyBzaG93IFdvcmxkSW1wYWN0LCBXb3JsZEltcGFjdEJ1aWxkZXJJbXBsOwppbXBvcnQgJy4uL3V0aWwvZW51bXNldC5kYXJ0JyBzaG93IEVudW1TZXQ7CmltcG9ydCAnLi4vdXRpbC91dGlsLmRhcnQnIHNob3cgU2V0bGV0OwoKY2xhc3MgUmVzb2x1dGlvbldvcmxkSW1wYWN0QnVpbGRlciBleHRlbmRzIFdvcmxkSW1wYWN0QnVpbGRlckltcGwKICAgIGltcGxlbWVudHMgUmVzb2x1dGlvbkltcGFjdCB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyRW50aXR5IG1lbWJlcjsKICBFbnVtU2V0PEZlYXR1cmU+IF9mZWF0dXJlczsKICBTZXRsZXQ8TWFwTGl0ZXJhbFVzZT4gX21hcExpdGVyYWxzOwogIFNldGxldDxTZXRMaXRlcmFsVXNlPiBfc2V0TGl0ZXJhbHM7CiAgU2V0bGV0PExpc3RMaXRlcmFsVXNlPiBfbGlzdExpdGVyYWxzOwogIFNldGxldDxTdHJpbmc+IF9jb25zdFN5bWJvbE5hbWVzOwogIFNldGxldDxDb25zdGFudEV4cHJlc3Npb24+IF9jb25zdGFudExpdGVyYWxzOwogIFNldGxldDxkeW5hbWljPiBfbmF0aXZlRGF0YTsKICBTZXRsZXQ8Q2xhc3NFbnRpdHk+IF9zZWVuQ2xhc3NlczsKICBTZXQ8UnVudGltZVR5cGVVc2U+IF9ydW50aW1lVHlwZVVzZXM7CiAgU2V0PEdlbmVyaWNJbnN0YW50aWF0aW9uPiBfZ2VuZXJpY0luc3RhbnRpYXRpb25zOwoKICBSZXNvbHV0aW9uV29ybGRJbXBhY3RCdWlsZGVyKHRoaXMubWVtYmVyKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBmYWxzZTsKCiAgdm9pZCByZWdpc3Rlck1hcExpdGVyYWwoTWFwTGl0ZXJhbFVzZSBtYXBMaXRlcmFsVXNlKSB7CiAgICBhc3NlcnQobWFwTGl0ZXJhbFVzZSAhPSBudWxsKTsKICAgIF9tYXBMaXRlcmFscyA/Pz0gbmV3IFNldGxldDxNYXBMaXRlcmFsVXNlPigpOwogICAgX21hcExpdGVyYWxzLmFkZChtYXBMaXRlcmFsVXNlKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPE1hcExpdGVyYWxVc2U+IGdldCBtYXBMaXRlcmFscyB7CiAgICByZXR1cm4gX21hcExpdGVyYWxzICE9IG51bGwgPyBfbWFwTGl0ZXJhbHMgOiBjb25zdCA8TWFwTGl0ZXJhbFVzZT5bXTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTZXRMaXRlcmFsKFNldExpdGVyYWxVc2Ugc2V0TGl0ZXJhbFVzZSkgewogICAgYXNzZXJ0KHNldExpdGVyYWxVc2UgIT0gbnVsbCk7CiAgICBfc2V0TGl0ZXJhbHMgPz89IG5ldyBTZXRsZXQ8U2V0TGl0ZXJhbFVzZT4oKTsKICAgIF9zZXRMaXRlcmFscy5hZGQoc2V0TGl0ZXJhbFVzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxTZXRMaXRlcmFsVXNlPiBnZXQgc2V0TGl0ZXJhbHMgPT4KICAgICAgX3NldExpdGVyYWxzID8/IGNvbnN0IDxTZXRMaXRlcmFsVXNlPltdOwoKICB2b2lkIHJlZ2lzdGVyTGlzdExpdGVyYWwoTGlzdExpdGVyYWxVc2UgbGlzdExpdGVyYWxVc2UpIHsKICAgIGFzc2VydChsaXN0TGl0ZXJhbFVzZSAhPSBudWxsKTsKICAgIF9saXN0TGl0ZXJhbHMgPz89IG5ldyBTZXRsZXQ8TGlzdExpdGVyYWxVc2U+KCk7CiAgICBfbGlzdExpdGVyYWxzLmFkZChsaXN0TGl0ZXJhbFVzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxMaXN0TGl0ZXJhbFVzZT4gZ2V0IGxpc3RMaXRlcmFscyB7CiAgICByZXR1cm4gX2xpc3RMaXRlcmFscyAhPSBudWxsID8gX2xpc3RMaXRlcmFscyA6IGNvbnN0IDxMaXN0TGl0ZXJhbFVzZT5bXTsKICB9CgogIHZvaWQgcmVnaXN0ZXJSdW50aW1lVHlwZVVzZShSdW50aW1lVHlwZVVzZSBydW50aW1lVHlwZVVzZSkgewogICAgYXNzZXJ0KHJ1bnRpbWVUeXBlVXNlICE9IG51bGwpOwogICAgX3J1bnRpbWVUeXBlVXNlcyA/Pz0gbmV3IFNldGxldDxSdW50aW1lVHlwZVVzZT4oKTsKICAgIF9ydW50aW1lVHlwZVVzZXMuYWRkKHJ1bnRpbWVUeXBlVXNlKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFJ1bnRpbWVUeXBlVXNlPiBnZXQgcnVudGltZVR5cGVVc2VzIHsKICAgIHJldHVybiBfcnVudGltZVR5cGVVc2VzICE9IG51bGwKICAgICAgICA/IF9ydW50aW1lVHlwZVVzZXMKICAgICAgICA6IGNvbnN0IDxSdW50aW1lVHlwZVVzZT5bXTsKICB9CgogIHZvaWQgcmVnaXN0ZXJDb25zdFN5bWJvbE5hbWUoU3RyaW5nIG5hbWUpIHsKICAgIF9jb25zdFN5bWJvbE5hbWVzID8/PSBuZXcgU2V0bGV0PFN0cmluZz4oKTsKICAgIF9jb25zdFN5bWJvbE5hbWVzLmFkZChuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IGNvbnN0U3ltYm9sTmFtZXMgewogICAgcmV0dXJuIF9jb25zdFN5bWJvbE5hbWVzICE9IG51bGwgPyBfY29uc3RTeW1ib2xOYW1lcyA6IGNvbnN0IDxTdHJpbmc+W107CiAgfQoKICB2b2lkIHJlZ2lzdGVyRmVhdHVyZShGZWF0dXJlIGZlYXR1cmUpIHsKICAgIF9mZWF0dXJlcyA/Pz0gbmV3IEVudW1TZXQ8RmVhdHVyZT4oKTsKICAgIF9mZWF0dXJlcy5hZGQoZmVhdHVyZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxGZWF0dXJlPiBnZXQgZmVhdHVyZXMgewogICAgcmV0dXJuIF9mZWF0dXJlcyAhPSBudWxsCiAgICAgICAgPyBfZmVhdHVyZXMuaXRlcmFibGUoRmVhdHVyZS52YWx1ZXMpCiAgICAgICAgOiBjb25zdCA8RmVhdHVyZT5bXTsKICB9CgogIHZvaWQgcmVnaXN0ZXJDb25zdGFudExpdGVyYWwoQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50KSB7CiAgICBfY29uc3RhbnRMaXRlcmFscyA/Pz0gbmV3IFNldGxldDxDb25zdGFudEV4cHJlc3Npb24+KCk7CiAgICBfY29uc3RhbnRMaXRlcmFscy5hZGQoY29uc3RhbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8Q29uc3RhbnRFeHByZXNzaW9uPiBnZXQgY29uc3RhbnRMaXRlcmFscyB7CiAgICByZXR1cm4gX2NvbnN0YW50TGl0ZXJhbHMgIT0gbnVsbAogICAgICAgID8gX2NvbnN0YW50TGl0ZXJhbHMKICAgICAgICA6IGNvbnN0IDxDb25zdGFudEV4cHJlc3Npb24+W107CiAgfQoKICB2b2lkIHJlZ2lzdGVyTmF0aXZlRGF0YShkeW5hbWljIG5hdGl2ZURhdGEpIHsKICAgIGFzc2VydChuYXRpdmVEYXRhICE9IG51bGwpOwogICAgX25hdGl2ZURhdGEgPz89IG5ldyBTZXRsZXQ8ZHluYW1pYz4oKTsKICAgIF9uYXRpdmVEYXRhLmFkZChuYXRpdmVEYXRhKTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPGR5bmFtaWM+IGdldCBuYXRpdmVEYXRhIHsKICAgIHJldHVybiBfbmF0aXZlRGF0YSAhPSBudWxsID8gX25hdGl2ZURhdGEgOiBjb25zdCA8ZHluYW1pYz5bXTsKICB9CgogIHZvaWQgcmVnaXN0ZXJTZWVuQ2xhc3MoQ2xhc3NFbnRpdHkgc2VlbkNsYXNzKSB7CiAgICBfc2VlbkNsYXNzZXMgPz89IG5ldyBTZXRsZXQ8Q2xhc3NFbnRpdHk+KCk7CiAgICBfc2VlbkNsYXNzZXMuYWRkKHNlZW5DbGFzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzc0VudGl0eT4gZ2V0IHNlZW5DbGFzc2VzIHsKICAgIHJldHVybiBfc2VlbkNsYXNzZXMgPz8gY29uc3QgPENsYXNzRW50aXR5PltdOwogIH0KCiAgdm9pZCByZWdpc3Rlckluc3RhbnRpYXRpb24oR2VuZXJpY0luc3RhbnRpYXRpb24gaW5zdGFudGlhdGlvbikgewogICAgX2dlbmVyaWNJbnN0YW50aWF0aW9ucyA/Pz0gbmV3IFNldDxHZW5lcmljSW5zdGFudGlhdGlvbj4oKTsKICAgIF9nZW5lcmljSW5zdGFudGlhdGlvbnMuYWRkKGluc3RhbnRpYXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgSXRlcmFibGU8R2VuZXJpY0luc3RhbnRpYXRpb24+IGdldCBnZW5lcmljSW5zdGFudGlhdGlvbnMgewogICAgcmV0dXJuIF9nZW5lcmljSW5zdGFudGlhdGlvbnMgPz8gY29uc3QgPEdlbmVyaWNJbnN0YW50aWF0aW9uPltdOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ1Jlc29sdXRpb25Xb3JsZEltcGFjdEJ1aWxkZXIoJG1lbWJlciknKTsKICAgIFdvcmxkSW1wYWN0LnByaW50T24oc2IsIHRoaXMpOwogICAgaWYgKF9mZWF0dXJlcyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCdcbiBmZWF0dXJlczonKTsKICAgICAgZm9yIChGZWF0dXJlIGZlYXR1cmUgaW4gX2ZlYXR1cmVzLml0ZXJhYmxlKEZlYXR1cmUudmFsdWVzKSkgewogICAgICAgIHNiLndyaXRlKCdcbiAgJGZlYXR1cmUnKTsKICAgICAgfQogICAgfQogICAgaWYgKF9tYXBMaXRlcmFscyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCdcbiBtYXAtbGl0ZXJhbHM6Jyk7CiAgICAgIGZvciAoTWFwTGl0ZXJhbFVzZSB1c2UgaW4gX21hcExpdGVyYWxzKSB7CiAgICAgICAgc2Iud3JpdGUoJ1xuICAkdXNlJyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfc2V0TGl0ZXJhbHMgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgnXG4gc2V0LWxpdGVyYWxzOicpOwogICAgICBmb3IgKFNldExpdGVyYWxVc2UgdXNlIGluIF9zZXRMaXRlcmFscykgewogICAgICAgIHNiLndyaXRlKCdcbiAgJHVzZScpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2xpc3RMaXRlcmFscyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCdcbiBsaXN0LWxpdGVyYWxzOicpOwogICAgICBmb3IgKExpc3RMaXRlcmFsVXNlIHVzZSBpbiBfbGlzdExpdGVyYWxzKSB7CiAgICAgICAgc2Iud3JpdGUoJ1xuICAkdXNlJyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChfY29uc3RhbnRMaXRlcmFscyAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCdcbiBjb25zdC1saXRlcmFsczonKTsKICAgICAgZm9yIChDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnQgaW4gX2NvbnN0YW50TGl0ZXJhbHMpIHsKICAgICAgICBzYi53cml0ZSgnXG4gICR7Y29uc3RhbnQudG9EYXJ0VGV4dCgpfScpOwogICAgICB9CiAgICB9CiAgICBpZiAoX2NvbnN0U3ltYm9sTmFtZXMgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgnXG4gY29uc3Qtc3ltYm9sLW5hbWVzOiAkX2NvbnN0U3ltYm9sTmFtZXMnKTsKICAgIH0KICAgIGlmIChfbmF0aXZlRGF0YSAhPSBudWxsKSB7CiAgICAgIHNiLndyaXRlKCdcbiBuYXRpdmUtZGF0YTonKTsKICAgICAgZm9yICh2YXIgZGF0YSBpbiBfbmF0aXZlRGF0YSkgewogICAgICAgIHNiLndyaXRlKCdcbiAgJGRhdGEnKTsKICAgICAgfQogICAgfQogICAgaWYgKF9nZW5lcmljSW5zdGFudGlhdGlvbnMgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgnXG4gaW5zdGFudGlhdGlvbnM6Jyk7CiAgICAgIGZvciAodmFyIGRhdGEgaW4gX2dlbmVyaWNJbnN0YW50aWF0aW9ucykgewogICAgICAgIHNiLndyaXRlKCdcbiAgJGRhdGEnKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CoDHAE5OPAElATooQyNRLCgBQiIMHR4mJigkMB8kKDQBLQEMHQE5IzIlBAEMLEoEATkjMiUEAQwtLwE8JDQnBAEMLk0EAT8kNyoEAQwxJBskBAEuMCEEAQwqTQQBKiocBAEMIx0tHQQBPjwlBAEMNiUcKAQBMCArIQQBDCVCBAEyMCEEAQwqMgQBQ0AvBAEMPUUEAQwWKjcjHSBEIggGICQwHggGICQwHggGISUyHggGJSY/MggGJT0GHyMmHwgGKiYxHwgGGgQCAS1wYWNrYWdlOmNvbXBpbGVyL3NyYy9yZXNvbHV0aW9uL3JlZ2lzdHJ5LmRhcnQ0c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL3Rlc3RpbmcvZmVhdHVyZXMuZGFydKSYLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnaWRfdGVzdGluZy5kYXJ0JzsKCi8vLyBVdGlsaXR5IGNsYXNzIGZvciBhbm5vdGF0ZWQgdGVzdGluZyByZXByZXNlbnRpbmcgYSBzZXQgb2YgZmVhdHVyZXMuCmNsYXNzIEZlYXR1cmVzIHsKICBNYXA8U3RyaW5nLCBPYmplY3Q+IF9mZWF0dXJlcyA9IHt9OwogIFNldDxTdHJpbmc+IF91bnNvcnRlZCA9IG5ldyBTZXQ8U3RyaW5nPigpOwoKICAvLy8gTWFyayB0aGUgZmVhdHVyZSBba2V5XSBhcyBleGlzdGluZy4gSWYgW3ZhbHVlXSBpcyBwcm92aWRlZCwgdGhlIGZlYXR1cmUKICAvLy8gW2tleV0gaXMgc2V0IHRvIGhhdmUgdGhpcyB2YWx1ZS4KICB2b2lkIGFkZChTdHJpbmcga2V5LCB7dmFyIHZhbHVlOiAnJ30pIHsKICAgIF9mZWF0dXJlc1trZXldID0gdmFsdWUudG9TdHJpbmcoKTsKICB9CgogIC8vLyBBZGQgW3ZhbHVlXSBhcyBhbiBlbGVtZW50IG9mIHRoZSBsaXN0IHZhbHVlcyBvZiBmZWF0dXJlIFtrZXldLgogIHZvaWQgYWRkRWxlbWVudChTdHJpbmcga2V5LCBbdmFyIHZhbHVlXSkgewogICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBfZmVhdHVyZXMucHV0SWZBYnNlbnQoa2V5LCAoKSA9PiA8U3RyaW5nPltdKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIGxpc3QuYWRkKHZhbHVlLnRvU3RyaW5nKCkpOwogICAgfQogIH0KCiAgLy8vIE1hcmtzIGxpc3QgdmFsdWVzIG9mIFtrZXldIGFzIHVuc29ydGVkLiBUaGlzIHByZXZlbnRzIHRoZSBbZ2V0VGV4dF0KICAvLy8gcmVwcmVzZW50YXRpb24gZnJvbSBhdXRvbWF0aWNhbGx5IHNvcnRpbmcgdGhlIHZhbHVlcy4KICB2b2lkIG1hcmtBc1Vuc29ydGVkKFN0cmluZyBrZXkpIHsKICAgIF91bnNvcnRlZC5hZGQoa2V5KTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBmZWF0dXJlIFtrZXldIGV4aXN0cy4KICBib29sIGNvbnRhaW5zS2V5KFN0cmluZyBrZXkpIHsKICAgIHJldHVybiBfZmVhdHVyZXMuY29udGFpbnNLZXkoa2V5KTsKICB9CgogIC8vLyBTZXQgdGhlIGZlYXR1cmUgW2tleV0gdG8gZXhpc3Qgd2l0aCB0aGUgW3ZhbHVlXS4KICB2b2lkIG9wZXJhdG9yIFtdPShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKICAgIF9mZWF0dXJlc1trZXldID0gdmFsdWU7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgc2V0IGZvciBmZWF0dXJlIFtrZXldLgogIE9iamVjdCBvcGVyYXRvciBbXShTdHJpbmcga2V5KSA9PiBfZmVhdHVyZXNba2V5XTsKCiAgLy8vIFJlbW92ZXMgdGhlIHZhbHVlIHNldCBmb3IgZmVhdHVyZSBba2V5XS4gUmV0dXJucyB0aGUgZXhpc3RpbmcgdmFsdWUuCiAgT2JqZWN0IHJlbW92ZShTdHJpbmcga2V5KSA9PiBfZmVhdHVyZXMucmVtb3ZlKGtleSk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGZlYXR1cmUgc2V0IGlzIGVtcHR5LgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2ZlYXR1cmVzLmlzRW1wdHk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGZlYXR1cmUgc2V0IGlzIG5vbi1lbXB0eS4KICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9mZWF0dXJlcy5pc05vdEVtcHR5OwoKICAvLy8gQ2FsbCBbZl0gZm9yIGVhY2ggZmVhdHVyZSBpbiB0aGlzIGZlYXR1cmUgc2V0IHdpdGggaXRzIGNvcnJlc3BvbmRpbmcKICAvLy8gdmFsdWUuCiAgdm9pZCBmb3JFYWNoKHZvaWQgRnVuY3Rpb24oU3RyaW5nLCBPYmplY3QpIGYpIHsKICAgIF9mZWF0dXJlcy5mb3JFYWNoKGYpOwogIH0KCiAgLy8vIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhbGwgZmVhdHVyZXMgaW4gYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBzb3J0ZWQKICAvLy8gYnkgZmVhdHVyZSBuYW1lcy4KICBTdHJpbmcgZ2V0VGV4dCgpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGJvb2wgbmVlZHNDb21tYSA9IGZhbHNlOwogICAgZm9yIChTdHJpbmcgbmFtZSBpbiBfZmVhdHVyZXMua2V5cy50b0xpc3QoKS4uc29ydCgpKSB7CiAgICAgIGR5bmFtaWMgdmFsdWUgPSBfZmVhdHVyZXNbbmFtZV07CiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICAgIHNiLndyaXRlKCcsJyk7CiAgICAgICAgfQogICAgICAgIHNiLndyaXRlKG5hbWUpOwogICAgICAgIGlmICh2YWx1ZSBpcyBMaXN0PFN0cmluZz4pIHsKICAgICAgICAgIGlmIChfdW5zb3J0ZWQuY29udGFpbnMobmFtZSkpIHsKICAgICAgICAgICAgdmFsdWUgPSAnWyR7dmFsdWUuam9pbignLCcpfV0nOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFsdWUgPSAnWyR7KHZhbHVlLi5zb3J0KCkpLmpvaW4oJywnKX1dJzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlICE9ICcnKSB7CiAgICAgICAgICBzYi53cml0ZSgnPScpOwogICAgICAgICAgc2Iud3JpdGUodmFsdWUpOwogICAgICAgIH0KICAgICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRmVhdHVyZXMoJHtnZXRUZXh0KCl9KSc7CgogIC8vLyBDcmVhdGVzIGEgW0ZlYXR1cmVzXSBvYmplY3QgYnkgcGFyc2UgdGhlIFt0ZXh0XSBlbmNvZGluZy4KICAvLy8KICAvLy8gU2luZ2xlIGZlYXR1cmVzIHdpbGwgYmUgcGFyc2VkIGFzIHN0cmluZ3MgYW5kIGxpc3QgZmVhdHVyZXMgKGZlYXR1cmVzCiAgLy8vIGVuY29kZWQgaW4gYFsuLi5dYCB3aWxsIGJlIHBhcnNlZCBhcyBsaXN0cyBvZiBzdHJpbmdzLgogIHN0YXRpYyBGZWF0dXJlcyBmcm9tVGV4dChTdHJpbmcgdGV4dCkgewogICAgRmVhdHVyZXMgZmVhdHVyZXMgPSBuZXcgRmVhdHVyZXMoKTsKICAgIGlmICh0ZXh0ID09IG51bGwpIHJldHVybiBmZWF0dXJlczsKICAgIGludCBpbmRleCA9IDA7CiAgICB3aGlsZSAoaW5kZXggPCB0ZXh0Lmxlbmd0aCkgewogICAgICBpbnQgZXFQb3MgPSB0ZXh0LmluZGV4T2YoJz0nLCBpbmRleCk7CiAgICAgIGludCBjb21tYVBvcyA9IHRleHQuaW5kZXhPZignLCcsIGluZGV4KTsKICAgICAgU3RyaW5nIG5hbWU7CiAgICAgIGJvb2wgaGFzVmFsdWUgPSBmYWxzZTsKICAgICAgaWYgKGVxUG9zICE9IC0xICYmIGNvbW1hUG9zICE9IC0xKSB7CiAgICAgICAgaWYgKGVxUG9zIDwgY29tbWFQb3MpIHsKICAgICAgICAgIG5hbWUgPSB0ZXh0LnN1YnN0cmluZyhpbmRleCwgZXFQb3MpOwogICAgICAgICAgaGFzVmFsdWUgPSB0cnVlOwogICAgICAgICAgaW5kZXggPSBlcVBvcyArIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5hbWUgPSB0ZXh0LnN1YnN0cmluZyhpbmRleCwgY29tbWFQb3MpOwogICAgICAgICAgaW5kZXggPSBjb21tYVBvcyArIDE7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGVxUG9zICE9IC0xKSB7CiAgICAgICAgbmFtZSA9IHRleHQuc3Vic3RyaW5nKGluZGV4LCBlcVBvcyk7CiAgICAgICAgaGFzVmFsdWUgPSB0cnVlOwogICAgICAgIGluZGV4ID0gZXFQb3MgKyAxOwogICAgICB9IGVsc2UgaWYgKGNvbW1hUG9zICE9IC0xKSB7CiAgICAgICAgbmFtZSA9IHRleHQuc3Vic3RyaW5nKGluZGV4LCBjb21tYVBvcyk7CiAgICAgICAgaW5kZXggPSBjb21tYVBvcyArIDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmFtZSA9IHRleHQuc3Vic3RyaW5nKGluZGV4KTsKICAgICAgICBpbmRleCA9IHRleHQubGVuZ3RoOwogICAgICB9CiAgICAgIGlmIChoYXNWYWx1ZSkgewogICAgICAgIGNvbnN0IE1hcDxTdHJpbmcsIFN0cmluZz4gZGVsaW1pdGVycyA9IGNvbnN0IHsKICAgICAgICAgICdbJzogJ10nLAogICAgICAgICAgJ3snOiAnfScsCiAgICAgICAgICAnKCc6ICcpJywKICAgICAgICAgICc8JzogJz4nCiAgICAgICAgfTsKICAgICAgICBMaXN0PFN0cmluZz4gZW5kRGVsaW1pdGVycyA9IDxTdHJpbmc+W107CiAgICAgICAgYm9vbCBpc0xpc3QgPSBpbmRleCA8IHRleHQubGVuZ3RoICYmIHRleHQuc3RhcnRzV2l0aCgnWycsIGluZGV4KTsKICAgICAgICBpZiAoaXNMaXN0KSB7CiAgICAgICAgICBmZWF0dXJlcy5hZGRFbGVtZW50KG5hbWUpOwogICAgICAgICAgZW5kRGVsaW1pdGVycy5hZGQoJ10nKTsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgfQogICAgICAgIGludCB2YWx1ZVN0YXJ0ID0gaW5kZXg7CiAgICAgICAgd2hpbGUgKGluZGV4IDwgdGV4dC5sZW5ndGgpIHsKICAgICAgICAgIFN0cmluZyBjaGFyID0gdGV4dC5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgMSk7CiAgICAgICAgICBpZiAoZW5kRGVsaW1pdGVycy5pc05vdEVtcHR5ICYmIGVuZERlbGltaXRlcnMubGFzdCA9PSBjaGFyKSB7CiAgICAgICAgICAgIGVuZERlbGltaXRlcnMucmVtb3ZlTGFzdCgpOwogICAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgU3RyaW5nIGVuZERlbGltaXRlciA9IGRlbGltaXRlcnNbY2hhcl07CiAgICAgICAgICAgIGlmIChlbmREZWxpbWl0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgIGVuZERlbGltaXRlcnMuYWRkKGVuZERlbGltaXRlcik7CiAgICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICcsJykgewogICAgICAgICAgICAgIGlmIChlbmREZWxpbWl0ZXJzLmlzRW1wdHkpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kRGVsaW1pdGVycy5sZW5ndGggPT0gMSAmJiBpc0xpc3QpIHsKICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHRleHQuc3Vic3RyaW5nKHZhbHVlU3RhcnQsIGluZGV4KTsKICAgICAgICAgICAgICAgIGZlYXR1cmVzLmFkZEVsZW1lbnQobmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgICAgICAgIHZhbHVlU3RhcnQgPSBpbmRleDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaXNMaXN0KSB7CiAgICAgICAgICBTdHJpbmcgdmFsdWUgPSB0ZXh0LnN1YnN0cmluZyh2YWx1ZVN0YXJ0LCBpbmRleCAtIDEpOwogICAgICAgICAgaWYgKHZhbHVlLmlzTm90RW1wdHkpIHsKICAgICAgICAgICAgZmVhdHVyZXMuYWRkRWxlbWVudChuYW1lLCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHRleHQuc3Vic3RyaW5nKHZhbHVlU3RhcnQsIGluZGV4KTsKICAgICAgICAgIGZlYXR1cmVzLmFkZChuYW1lLCB2YWx1ZTogdmFsdWUpOwogICAgICAgIH0KICAgICAgICBpbmRleCsrOwogICAgICB9IGVsc2UgewogICAgICAgIGZlYXR1cmVzLmFkZChuYW1lKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZlYXR1cmVzOwogIH0KfQoKY2xhc3MgRmVhdHVyZXNEYXRhSW50ZXJwcmV0ZXIgaW1wbGVtZW50cyBEYXRhSW50ZXJwcmV0ZXI8RmVhdHVyZXM+IHsKICBjb25zdCBGZWF0dXJlc0RhdGFJbnRlcnByZXRlcigpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgaXNBc0V4cGVjdGVkKEZlYXR1cmVzIGFjdHVhbEZlYXR1cmVzLCBTdHJpbmcgZXhwZWN0ZWREYXRhKSB7CiAgICBpZiAoZXhwZWN0ZWREYXRhID09ICcqJykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWREYXRhID09ICcnKSB7CiAgICAgIHJldHVybiBhY3R1YWxGZWF0dXJlcy5pc05vdEVtcHR5ID8gIkV4cGVjdGVkIGVtcHR5IGRhdGEuIiA6IG51bGw7CiAgICB9IGVsc2UgewogICAgICBMaXN0PFN0cmluZz4gZXJyb3JzRm91bmQgPSBbXTsKICAgICAgRmVhdHVyZXMgZXhwZWN0ZWRGZWF0dXJlcyA9IEZlYXR1cmVzLmZyb21UZXh0KGV4cGVjdGVkRGF0YSk7CiAgICAgIFNldDxTdHJpbmc+IHZhbGlkYXRlZEZlYXR1cmVzID0gbmV3IFNldDxTdHJpbmc+KCk7CiAgICAgIGV4cGVjdGVkRmVhdHVyZXMuZm9yRWFjaCgoU3RyaW5nIGtleSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKICAgICAgICBib29sIGV4cGVjdE1hdGNoID0gdHJ1ZTsKICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJyEnKSkgewogICAgICAgICAga2V5ID0ga2V5LnN1YnN0cmluZygxKTsKICAgICAgICAgIGV4cGVjdE1hdGNoID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHZhbGlkYXRlZEZlYXR1cmVzLmFkZChrZXkpOwogICAgICAgIE9iamVjdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbEZlYXR1cmVzW2tleV07CiAgICAgICAgaWYgKCFleHBlY3RNYXRjaCkgewogICAgICAgICAgaWYgKGFjdHVhbEZlYXR1cmVzLmNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgICAgICAgZXJyb3JzRm91bmQuYWRkKCdVbmV4cGVjdGVkIGRhdGEgZm91bmQgZm9yICRrZXk9JGFjdHVhbFZhbHVlJyk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghYWN0dWFsRmVhdHVyZXMuY29udGFpbnNLZXkoa2V5KSkgewogICAgICAgICAgZXJyb3JzRm91bmQuYWRkKCdObyBkYXRhIGZvdW5kIGZvciAka2V5Jyk7CiAgICAgICAgfSBlbHNlIGlmIChleHBlY3RlZFZhbHVlID09ICcnKSB7CiAgICAgICAgICBpZiAoYWN0dWFsVmFsdWUgIT0gJycpIHsKICAgICAgICAgICAgZXJyb3JzRm91bmQuYWRkKCdOb24tZW1wdHkgZGF0YSBmb3VuZCBmb3IgJGtleScpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRWYWx1ZSA9PSAnKicpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkVmFsdWUgaXMgTGlzdCkgewogICAgICAgICAgaWYgKGFjdHVhbFZhbHVlIGlzIExpc3QpIHsKICAgICAgICAgICAgTGlzdCBhY3R1YWxMaXN0ID0gYWN0dWFsVmFsdWUudG9MaXN0KCk7CiAgICAgICAgICAgIGZvciAoT2JqZWN0IGV4cGVjdGVkT2JqZWN0IGluIGV4cGVjdGVkVmFsdWUpIHsKICAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRUZXh0ID0gJyRleHBlY3RlZE9iamVjdCc7CiAgICAgICAgICAgICAgYm9vbCBtYXRjaEZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkVGV4dC5lbmRzV2l0aCgnKicpKSB7CiAgICAgICAgICAgICAgICAvLyBXaWxkY2FyZCBtYXRjaGVyLgogICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9CiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUZXh0LnN1YnN0cmluZygwLCBleHBlY3RlZFRleHQuaW5kZXhPZignKicpKTsKICAgICAgICAgICAgICAgIExpc3QgbWF0Y2hlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yIChPYmplY3QgYWN0dWFsT2JqZWN0IGluIGFjdHVhbExpc3QpIHsKICAgICAgICAgICAgICAgICAgaWYgKCckYWN0dWFsT2JqZWN0Jy5zdGFydHNXaXRoKHByZWZpeCkpIHsKICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLmFkZChhY3R1YWxPYmplY3QpOwogICAgICAgICAgICAgICAgICAgIG1hdGNoRm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBtYXRjaCBpbiBtYXRjaGVzKSB7CiAgICAgICAgICAgICAgICAgIGFjdHVhbExpc3QucmVtb3ZlKG1hdGNoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yIChPYmplY3QgYWN0dWFsT2JqZWN0IGluIGFjdHVhbExpc3QpIHsKICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkVGV4dCA9PSAnJGFjdHVhbE9iamVjdCcpIHsKICAgICAgICAgICAgICAgICAgICBhY3R1YWxMaXN0LnJlbW92ZShhY3R1YWxPYmplY3QpOwogICAgICAgICAgICAgICAgICAgIG1hdGNoRm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICghbWF0Y2hGb3VuZCkgewogICAgICAgICAgICAgICAgZXJyb3JzRm91bmQuYWRkKCJObyBtYXRjaCBmb3VuZCBmb3IgJGtleT1bJGV4cGVjdGVkVGV4dF0iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFjdHVhbExpc3QuaXNOb3RFbXB0eSkgewogICAgICAgICAgICAgIGVycm9yc0ZvdW5kCiAgICAgICAgICAgICAgICAgIC5hZGQoIkV4dHJhIGRhdGEgZm91bmQgJGtleT1bJHthY3R1YWxMaXN0LmpvaW4oJywnKX1dIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVycm9yc0ZvdW5kLmFkZCgiTGlzdCBkYXRhIGV4cGVjdGVkIGZvciAka2V5OiAiCiAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJyRleHBlY3RlZFZhbHVlJywgZm91bmQgJyR7YWN0dWFsVmFsdWV9JyIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRWYWx1ZSAhPSBhY3R1YWxWYWx1ZSkgewogICAgICAgICAgZXJyb3JzRm91bmQuYWRkKAogICAgICAgICAgICAgICJNaXNtYXRjaCBmb3IgJGtleTogZXhwZWN0ZWQgJyRleHBlY3RlZFZhbHVlJywgZm91bmQgJyR7YWN0dWFsVmFsdWV9JyIpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGFjdHVhbEZlYXR1cmVzLmZvckVhY2goKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewogICAgICAgIGlmICghdmFsaWRhdGVkRmVhdHVyZXMuY29udGFpbnMoa2V5KSkgewogICAgICAgICAgaWYgKHZhbHVlID09ICcnKSB7CiAgICAgICAgICAgIGVycm9yc0ZvdW5kLmFkZCgiRXh0cmEgZGF0YSBmb3VuZCAnJGtleSciKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVycm9yc0ZvdW5kLmFkZCgiRXh0cmEgZGF0YSBmb3VuZCAka2V5PSR2YWx1ZSIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBlcnJvcnNGb3VuZC5pc05vdEVtcHR5ID8gZXJyb3JzRm91bmQuam9pbignXG4gJykgOiBudWxsOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldFRleHQoRmVhdHVyZXMgYWN0dWFsRGF0YSkgewogICAgcmV0dXJuIGFjdHVhbERhdGEuZ2V0VGV4dCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0VtcHR5KEZlYXR1cmVzIGFjdHVhbERhdGEpIHsKICAgIHJldHVybiBhY3R1YWxEYXRhID09IG51bGwgfHwgYWN0dWFsRGF0YS5pc0VtcHR5OwogIH0KfQqBHwBOTjwBGgFIESYtAU4nKicEAUUtRhkiBgQBSjwkGAQBLiEnBAE3MBwEAS80AUs2ATMpATcvAUsNMhoEAVAYFSodOycbGhkKGCUqLBM2DAobGRsKGwgGGgQBDDEBQAZMPSooJxMiLC8THSsgLxsdETIgCiAtGRsjMB4PJh0IFjcUFBQTCzFKFiUiEwogJjpIKBUTNCgvFyYrF0BCMhkkFxkQFRcODAoWQCIuDBE8LAoRDxwIBhUEAgFFIwEMRh8TJUgNJUM5RCEjIh8KJDIcMUwMNzUqIz4MKxIsJTQ7NycwJSBKIzo8LycUEjAsEhc6OTUnGxQSECFMEA4pGksOEzxGDDMbVwoKOjAdOBM9DAoKRgYEAQwoIQQBDCY1BAIBK3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy90ZXN0aW5nL2ZlYXR1cmVzLmRhcnQsc2Rrcm9vdDovcGtnL2NvbXBpbGVyL2xpYi9zcmMvaGFzaC9zaGExLmRhcnSF9C8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CgppbXBvcnQgJ3BhY2thZ2U6Y3J5cHRvL2NyeXB0by5kYXJ0JzsKCmltcG9ydCAnLi4vaW8vY29kZV9vdXRwdXQuZGFydCcgc2hvdyBDb2RlT3V0cHV0TGlzdGVuZXI7CgpjbGFzcyBIYXNoZXIgaW1wbGVtZW50cyBDb2RlT3V0cHV0TGlzdGVuZXIgewogIGZpbmFsIF9EaWdlc3RTaW5rIF9kaWdlc3RTaW5rOwogIEJ5dGVDb252ZXJzaW9uU2luayBfYnl0ZVNpbms7CgogIEhhc2hlci5fKHRoaXMuX2RpZ2VzdFNpbmspCiAgICAgIDogX2J5dGVTaW5rID0gc2hhMS5zdGFydENodW5rZWRDb252ZXJzaW9uKF9kaWdlc3RTaW5rKTsKCiAgZmFjdG9yeSBIYXNoZXIoKSA9PiBIYXNoZXIuXyhfRGlnZXN0U2luaygpKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBvbkRvbmUoaW50IGxlbmd0aCkgewogICAgLy8gRG8gbm90aGluZy4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgb25UZXh0KFN0cmluZyB0ZXh0KSB7CiAgICBpZiAoX2J5dGVTaW5rICE9IG51bGwpIHsKICAgICAgX2J5dGVTaW5rLmFkZCh1dGY4LmVuY29kZSh0ZXh0KSk7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgYmFzZTY0LWVuY29kZWQgU0hBLTEgaGFzaCBvZiB0aGUgdXRmLTggYnl0ZXMgb2YgdGhlIG91dHB1dAogIC8vLyB0ZXh0LgogIFN0cmluZyBnZXRIYXNoKCkgewogICAgaWYgKF9ieXRlU2luayAhPSBudWxsKSB7CiAgICAgIF9ieXRlU2luay5jbG9zZSgpOwogICAgICBfYnl0ZVNpbmsgPSBudWxsOwogICAgfQogICAgcmV0dXJuIGJhc2U2NC5lbmNvZGUoX2RpZ2VzdFNpbmsudmFsdWUuYnl0ZXMpOwogIH0KfQoKLy8vIEEgc2luayB1c2VkIHRvIGdldCBhIGRpZ2VzdCB2YWx1ZSBvdXQgb2YgYEhhc2guc3RhcnRDaHVua2VkQ29udmVyc2lvbmAuCmNsYXNzIF9EaWdlc3RTaW5rIGV4dGVuZHMgU2luazxEaWdlc3Q+IHsKICBEaWdlc3QgX3ZhbHVlOwoKICAvLy8gVGhlIHZhbHVlIGFkZGVkIHRvIHRoZSBzaW5rLCBpZiBhbnkuCiAgRGlnZXN0IGdldCB2YWx1ZSB7CiAgICBhc3NlcnQoX3ZhbHVlICE9IG51bGwpOwogICAgcmV0dXJuIF92YWx1ZTsKICB9CgogIC8vLyBBZGRzIFt2YWx1ZV0gdG8gdGhlIHNpbmsuCiAgLy8vCiAgLy8vIFVubGlrZSBtb3N0IHNpbmtzLCB0aGlzIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlLgogIEBvdmVycmlkZQogIHZvaWQgYWRkKERpZ2VzdCB2YWx1ZSkgewogICAgYXNzZXJ0KF92YWx1ZSA9PSBudWxsKTsKICAgIF92YWx1ZSA9IHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHsKICAgIGFzc2VydChfdmFsdWUgIT0gbnVsbCk7CiAgfQp9CkQATk48ARcBJQE5AS0hIAEdPgEvAQwcEwQBDB0dKAYEAU0MFR0ZGAYzBAIBTCkRASsVHBMEASAGNwwbHBQEAQwRHAQCASNwYWNrYWdlOmNvbXBpbGVyL3NyYy9oYXNoL3NoYTEuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9pby9zb3VyY2VfbWFwX2J1aWxkZXIuZGFydLwDLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5zb3VyY2VfbWFwX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0JyBhcyBmZTsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBMb2NhdGlvbjsKaW1wb3J0ICcuLi8uLi9jb21waWxlcl9uZXcuZGFydCcgc2hvdyBDb21waWxlck91dHB1dCwgT3V0cHV0U2luaywgT3V0cHV0VHlwZTsKaW1wb3J0ICcuLi91dGlsL3V0aWwuZGFydCc7CmltcG9ydCAnbG9jYXRpb25fcHJvdmlkZXIuZGFydCc7CmltcG9ydCAnY29kZV9vdXRwdXQuZGFydCcgc2hvdyBTb3VyY2VMb2NhdGlvbnNQcm92aWRlciwgU291cmNlTG9jYXRpb25zOwppbXBvcnQgJ3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0JyBzaG93IFNvdXJjZUxvY2F0aW9uLCBGcmFtZUVudHJ5OwoKY2xhc3MgU291cmNlTWFwQnVpbGRlciB7CiAgZmluYWwgU3RyaW5nIHZlcnNpb247CgogIC8vLyBUaGUgVVJJIG9mIHRoZSBzb3VyY2UgbWFwIGZpbGUuCiAgZmluYWwgVXJpIHNvdXJjZU1hcFVyaTsKCiAgLy8vIFRoZSBVUkkgb2YgdGhlIHRhcmdldCBsYW5ndWFnZSBmaWxlLgogIGZpbmFsIFVyaSB0YXJnZXRGaWxlVXJpOwoKICBmaW5hbCBMb2NhdGlvblByb3ZpZGVyIGxvY2F0aW9uUHJvdmlkZXI7CiAgZmluYWwgTGlzdDxTb3VyY2VNYXBFbnRyeT4gZW50cmllcyA9IG5ldyBMaXN0PFNvdXJjZU1hcEVudHJ5PigpOwoKICAvLy8gRXh0ZW5zaW9uIHVzZWQgdG8gZGVvYmZ1c2NhdGUgbWluaWZpZWQgbmFtZXMgaW4gZXJyb3IgbWVzc2FnZXMuCiAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBtaW5pZmllZEdsb2JhbE5hbWVzOwogIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWluaWZpZWRJbnN0YW5jZU5hbWVzOwoKICAvLy8gRXh0ZW5zaW9uIHVzZWQgdG8gZGVvYmZ1c2NhdGUgaW5saW5lZCBzdGFjayBmcmFtZXMuCiAgZmluYWwgTWFwPGludCwgTGlzdDxGcmFtZUVudHJ5Pj4gZnJhbWVzOwoKICBTb3VyY2VNYXBCdWlsZGVyKAogICAgICB0aGlzLnZlcnNpb24sCiAgICAgIHRoaXMuc291cmNlTWFwVXJpLAogICAgICB0aGlzLnRhcmdldEZpbGVVcmksCiAgICAgIHRoaXMubG9jYXRpb25Qcm92aWRlciwKICAgICAgdGhpcy5taW5pZmllZEdsb2JhbE5hbWVzLAogICAgICB0aGlzLm1pbmlmaWVkSW5zdGFuY2VOYW1lcywKICAgICAgdGhpcy5mcmFtZXMpOwoKICB2b2lkIGFkZE1hcHBpbmcoaW50IHRhcmdldE9mZnNldCwgU291cmNlTG9jYXRpb24gc291cmNlTG9jYXRpb24pIHsKICAgIGVudHJpZXMuYWRkKG5ldyBTb3VyY2VNYXBFbnRyeShzb3VyY2VMb2NhdGlvbiwgdGFyZ2V0T2Zmc2V0KSk7CiAgfQoKICB2b2lkIHByaW50U3RyaW5nTGlzdE9uKEl0ZXJhYmxlPFN0cmluZz4gc3RyaW5ncywgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewogICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICBidWZmZXIud3JpdGUoJ1snKTsKICAgIGZvciAoU3RyaW5nIHN0cmluZyBpbiBzdHJpbmdzKSB7CiAgICAgIGlmICghZmlyc3QpIGJ1ZmZlci53cml0ZSgnLCcpOwogICAgICBidWZmZXIud3JpdGUoJyInKTsKICAgICAgd3JpdGVKc29uRXNjYXBlZENoYXJzT24oc3RyaW5nLCBidWZmZXIpOwogICAgICBidWZmZXIud3JpdGUoJyInKTsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0KICAgIGJ1ZmZlci53cml0ZSgnXScpOwogIH0KCiAgU3RyaW5nIGJ1aWxkKCkgewogICAgTGluZUNvbHVtbk1hcDxTb3VyY2VNYXBFbnRyeT4gbGluZUNvbHVtbk1hcCA9CiAgICAgICAgbmV3IExpbmVDb2x1bW5NYXA8U291cmNlTWFwRW50cnk+KCk7CiAgICBNYXA8VXJpLCBMaW5lQ29sdW1uTWFwPFNvdXJjZU1hcEVudHJ5Pj4gc291cmNlTG9jYXRpb25NYXAgPQogICAgICAgIDxVcmksIExpbmVDb2x1bW5NYXA8U291cmNlTWFwRW50cnk+Pnt9OwogICAgZW50cmllcy5mb3JFYWNoKChTb3VyY2VNYXBFbnRyeSBzb3VyY2VNYXBFbnRyeSkgewogICAgICBMb2NhdGlvbiBrZXJuZWxMb2NhdGlvbiA9CiAgICAgICAgICBsb2NhdGlvblByb3ZpZGVyLmdldExvY2F0aW9uKHNvdXJjZU1hcEVudHJ5LnRhcmdldE9mZnNldCk7CiAgICAgIGludCBsaW5lID0ga2VybmVsTG9jYXRpb24ubGluZSAtIDE7CiAgICAgIGludCBjb2x1bW4gPSBrZXJuZWxMb2NhdGlvbi5jb2x1bW4gLSAxOwogICAgICBsaW5lQ29sdW1uTWFwLmFkZChsaW5lLCBjb2x1bW4sIHNvdXJjZU1hcEVudHJ5KTsKCiAgICAgIFNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uID0gc291cmNlTWFwRW50cnkuc291cmNlTG9jYXRpb247CiAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgaWYgKGxvY2F0aW9uLnNvdXJjZVVyaSAhPSBudWxsKSB7CiAgICAgICAgICBMaW5lQ29sdW1uTWFwPFNvdXJjZU1hcEVudHJ5PiBzb3VyY2VMaW5lQ29sdW1uTWFwID0KICAgICAgICAgICAgICBzb3VyY2VMb2NhdGlvbk1hcC5wdXRJZkFic2VudChsb2NhdGlvbi5zb3VyY2VVcmksCiAgICAgICAgICAgICAgICAgICgpID0+IG5ldyBMaW5lQ29sdW1uTWFwPFNvdXJjZU1hcEVudHJ5PigpKTsKICAgICAgICAgIHNvdXJjZUxpbmVDb2x1bW5NYXAuYWRkKAogICAgICAgICAgICAgIGxvY2F0aW9uLmxpbmUgLSAxLCBsb2NhdGlvbi5jb2x1bW4gLSAxLCBzb3VyY2VNYXBFbnRyeSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICByZXR1cm4gX2J1aWxkKGxpbmVDb2x1bW5NYXApOwogIH0KCiAgU3RyaW5nIF9idWlsZChMaW5lQ29sdW1uTWFwPFNvdXJjZU1hcEVudHJ5PiBsaW5lQ29sdW1uTWFwKSB7CiAgICBJbmRleE1hcDxVcmk+IHVyaU1hcCA9IG5ldyBJbmRleE1hcDxVcmk+KCk7CiAgICBJbmRleE1hcDxTdHJpbmc+IG5hbWVNYXAgPSBuZXcgSW5kZXhNYXA8U3RyaW5nPigpOwoKICAgIHZvaWQgcmVnaXN0ZXJMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBzb3VyY2VMb2NhdGlvbikgewogICAgICBpZiAoc291cmNlTG9jYXRpb24gIT0gbnVsbCkgewogICAgICAgIGlmIChzb3VyY2VMb2NhdGlvbi5zb3VyY2VVcmkgIT0gbnVsbCkgewogICAgICAgICAgdXJpTWFwLnJlZ2lzdGVyKHNvdXJjZUxvY2F0aW9uLnNvdXJjZVVyaSk7CiAgICAgICAgICBpZiAoc291cmNlTG9jYXRpb24uc291cmNlTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgIG5hbWVNYXAucmVnaXN0ZXIoc291cmNlTG9jYXRpb24uc291cmNlTmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgbGluZUNvbHVtbk1hcC5mb3JFYWNoRWxlbWVudCgoU291cmNlTWFwRW50cnkgZW50cnkpIHsKICAgICAgcmVnaXN0ZXJMb2NhdGlvbihlbnRyeS5zb3VyY2VMb2NhdGlvbik7CiAgICB9KTsKCiAgICBtaW5pZmllZEdsb2JhbE5hbWVzLnZhbHVlcy5mb3JFYWNoKG5hbWVNYXAucmVnaXN0ZXIpOwogICAgbWluaWZpZWRJbnN0YW5jZU5hbWVzLnZhbHVlcy5mb3JFYWNoKG5hbWVNYXAucmVnaXN0ZXIpOwogICAgZm9yIChMaXN0PEZyYW1lRW50cnk+IGVudHJpZXMgaW4gZnJhbWVzLnZhbHVlcykgewogICAgICBmb3IgKHZhciBmcmFtZSBpbiBlbnRyaWVzKSB7CiAgICAgICAgcmVnaXN0ZXJMb2NhdGlvbihmcmFtZS5wdXNoTG9jYXRpb24pOwogICAgICAgIGlmIChmcmFtZS5pbmxpbmVkTWV0aG9kTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICBuYW1lTWFwLnJlZ2lzdGVyKGZyYW1lLmlubGluZWRNZXRob2ROYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBTdHJpbmdCdWZmZXIgbWFwcGluZ3NCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICB3cml0ZUVudHJpZXMobGluZUNvbHVtbk1hcCwgdXJpTWFwLCBuYW1lTWFwLCBtYXBwaW5nc0J1ZmZlcik7CgogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGJ1ZmZlci53cml0ZSgne1xuJyk7CiAgICBidWZmZXIud3JpdGUoJyAgInZlcnNpb24iOiAzLFxuJyk7CiAgICBidWZmZXIud3JpdGUoJyAgImVuZ2luZSI6ICIkdmVyc2lvbiIsXG4nKTsKICAgIGlmIChzb3VyY2VNYXBVcmkgIT0gbnVsbCAmJiB0YXJnZXRGaWxlVXJpICE9IG51bGwpIHsKICAgICAgYnVmZmVyLndyaXRlKCcgICJmaWxlIjogJwogICAgICAgICAgJyIke2ZlLnJlbGF0aXZpemVVcmkoc291cmNlTWFwVXJpLCB0YXJnZXRGaWxlVXJpLCBmYWxzZSl9IixcbicpOwogICAgfQogICAgYnVmZmVyLndyaXRlKCcgICJzb3VyY2VSb290IjogIiIsXG4nKTsKICAgIGJ1ZmZlci53cml0ZSgnICAic291cmNlcyI6ICcpOwogICAgSXRlcmFibGU8U3RyaW5nPiByZWxhdGl2ZVNvdXJjZVVyaUxpc3QgPSBjb25zdCA8U3RyaW5nPltdOwogICAgaWYgKHNvdXJjZU1hcFVyaSAhPSBudWxsKSB7CiAgICAgIHJlbGF0aXZlU291cmNlVXJpTGlzdCA9CiAgICAgICAgICB1cmlNYXAuZWxlbWVudHMubWFwKCh1KSA9PiBmZS5yZWxhdGl2aXplVXJpKHNvdXJjZU1hcFVyaSwgdSwgZmFsc2UpKTsKICAgIH0KICAgIHByaW50U3RyaW5nTGlzdE9uKHJlbGF0aXZlU291cmNlVXJpTGlzdCwgYnVmZmVyKTsKICAgIGJ1ZmZlci53cml0ZSgnLFxuJyk7CiAgICBidWZmZXIud3JpdGUoJyAgIm5hbWVzIjogJyk7CiAgICBwcmludFN0cmluZ0xpc3RPbihuYW1lTWFwLmVsZW1lbnRzLCBidWZmZXIpOwogICAgYnVmZmVyLndyaXRlKCcsXG4nKTsKICAgIGJ1ZmZlci53cml0ZSgnICAibWFwcGluZ3MiOiAiJyk7CiAgICBidWZmZXIud3JpdGUobWFwcGluZ3NCdWZmZXIpOwogICAgYnVmZmVyLndyaXRlKCciLFxuJyk7CiAgICBidWZmZXIud3JpdGUoJyAgInhfb3JnX2RhcnRsYW5nX2RhcnQyanMiOiB7XG4nKTsKICAgIGJ1ZmZlci53cml0ZSgnICAgICJtaW5pZmllZF9uYW1lcyI6IHtcbicpOwogICAgYnVmZmVyLndyaXRlKCcgICAgICAiZ2xvYmFsIjogJyk7CiAgICB3cml0ZU1pbmlmaWVkTmFtZXMobWluaWZpZWRHbG9iYWxOYW1lcywgbmFtZU1hcCwgYnVmZmVyKTsKICAgIGJ1ZmZlci53cml0ZSgnLFxuJyk7CiAgICBidWZmZXIud3JpdGUoJyAgICAgICJpbnN0YW5jZSI6ICcpOwogICAgd3JpdGVNaW5pZmllZE5hbWVzKG1pbmlmaWVkSW5zdGFuY2VOYW1lcywgbmFtZU1hcCwgYnVmZmVyKTsKICAgIGJ1ZmZlci53cml0ZSgnXG4gICAgfSxcbicpOwogICAgYnVmZmVyLndyaXRlKCcgICAgImZyYW1lcyI6ICcpOwogICAgd3JpdGVGcmFtZXModXJpTWFwLCBuYW1lTWFwLCBidWZmZXIpOwogICAgYnVmZmVyLndyaXRlKCdcbiAgfVxufVxuJyk7CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICB2b2lkIHdyaXRlRW50cmllcyhMaW5lQ29sdW1uTWFwPFNvdXJjZU1hcEVudHJ5PiBlbnRyaWVzLCBJbmRleE1hcDxVcmk+IHVyaU1hcCwKICAgICAgSW5kZXhNYXA8U3RyaW5nPiBuYW1lTWFwLCBTdHJpbmdCdWZmZXIgb3V0cHV0KSB7CiAgICBTb3VyY2VMb2NhdGlvbiBwcmV2aW91c1NvdXJjZUxvY2F0aW9uOwogICAgaW50IHByZXZpb3VzVGFyZ2V0TGluZSA9IDA7CiAgICBEZWx0YUVuY29kZXIgdGFyZ2V0Q29sdW1uRW5jb2RlciA9IG5ldyBEZWx0YUVuY29kZXIoKTsKICAgIGJvb2wgZmlyc3RFbnRyeUluTGluZSA9IHRydWU7CiAgICBEZWx0YUVuY29kZXIgc291cmNlVXJpSW5kZXhFbmNvZGVyID0gbmV3IERlbHRhRW5jb2RlcigpOwogICAgRGVsdGFFbmNvZGVyIHNvdXJjZUxpbmVFbmNvZGVyID0gbmV3IERlbHRhRW5jb2RlcigpOwogICAgRGVsdGFFbmNvZGVyIHNvdXJjZUNvbHVtbkVuY29kZXIgPSBuZXcgRGVsdGFFbmNvZGVyKCk7CiAgICBEZWx0YUVuY29kZXIgc291cmNlTmFtZUluZGV4RW5jb2RlciA9IG5ldyBEZWx0YUVuY29kZXIoKTsKCiAgICBlbnRyaWVzLmZvckVhY2goKGludCB0YXJnZXRMaW5lLCBpbnQgdGFyZ2V0Q29sdW1uLCBTb3VyY2VNYXBFbnRyeSBlbnRyeSkgewogICAgICBTb3VyY2VMb2NhdGlvbiBzb3VyY2VMb2NhdGlvbiA9IGVudHJ5LnNvdXJjZUxvY2F0aW9uOwogICAgICBpZiAoc291cmNlTG9jYXRpb24gPT0gcHJldmlvdXNTb3VyY2VMb2NhdGlvbikgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgaWYgKHRhcmdldExpbmUgPiBwcmV2aW91c1RhcmdldExpbmUpIHsKICAgICAgICBmb3IgKGludCBpID0gcHJldmlvdXNUYXJnZXRMaW5lOyBpIDwgdGFyZ2V0TGluZTsgKytpKSB7CiAgICAgICAgICBvdXRwdXQud3JpdGUoJzsnKTsKICAgICAgICB9CiAgICAgICAgcHJldmlvdXNUYXJnZXRMaW5lID0gdGFyZ2V0TGluZTsKICAgICAgICBwcmV2aW91c1NvdXJjZUxvY2F0aW9uID0gbnVsbDsKICAgICAgICB0YXJnZXRDb2x1bW5FbmNvZGVyLnJlc2V0KCk7CiAgICAgICAgZmlyc3RFbnRyeUluTGluZSA9IHRydWU7CiAgICAgIH0KCiAgICAgIGlmICghZmlyc3RFbnRyeUluTGluZSkgewogICAgICAgIG91dHB1dC53cml0ZSgnLCcpOwogICAgICB9CiAgICAgIGZpcnN0RW50cnlJbkxpbmUgPSBmYWxzZTsKCiAgICAgIHRhcmdldENvbHVtbkVuY29kZXIuZW5jb2RlKG91dHB1dCwgdGFyZ2V0Q29sdW1uKTsKCiAgICAgIGlmIChzb3VyY2VMb2NhdGlvbiA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBVcmkgc291cmNlVXJpID0gc291cmNlTG9jYXRpb24uc291cmNlVXJpOwogICAgICBpZiAoc291cmNlVXJpICE9IG51bGwpIHsKICAgICAgICBzb3VyY2VVcmlJbmRleEVuY29kZXIuZW5jb2RlKG91dHB1dCwgdXJpTWFwW3NvdXJjZVVyaV0pOwogICAgICAgIHNvdXJjZUxpbmVFbmNvZGVyLmVuY29kZShvdXRwdXQsIHNvdXJjZUxvY2F0aW9uLmxpbmUgLSAxKTsKICAgICAgICBzb3VyY2VDb2x1bW5FbmNvZGVyLmVuY29kZShvdXRwdXQsIHNvdXJjZUxvY2F0aW9uLmNvbHVtbiAtIDEpOwogICAgICB9CgogICAgICBTdHJpbmcgc291cmNlTmFtZSA9IHNvdXJjZUxvY2F0aW9uLnNvdXJjZU5hbWU7CiAgICAgIGlmIChzb3VyY2VOYW1lICE9IG51bGwpIHsKICAgICAgICBzb3VyY2VOYW1lSW5kZXhFbmNvZGVyLmVuY29kZShvdXRwdXQsIG5hbWVNYXBbc291cmNlTmFtZV0pOwogICAgICB9CgogICAgICBwcmV2aW91c1NvdXJjZUxvY2F0aW9uID0gc291cmNlTG9jYXRpb247CiAgICB9KTsKICB9CgogIHZvaWQgd3JpdGVNaW5pZmllZE5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gbWluaWZpZWROYW1lcywKICAgICAgSW5kZXhNYXA8U3RyaW5nPiBuYW1lTWFwLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGJ1ZmZlci53cml0ZSgnIicpOwogICAgbWluaWZpZWROYW1lcy5mb3JFYWNoKChTdHJpbmcgbWluaWZpZWROYW1lLCBTdHJpbmcgbmFtZSkgewogICAgICBpZiAoIWZpcnN0KSBidWZmZXIud3JpdGUoJywnKTsKICAgICAgLy8gbWluaWZpZWROYW1lcyBhcmUgdmFsaWQgSlMgaWRlbnRpZmllcnMgc28gdGhleSBkb24ndCBuZWVkIHRvIGJlIGVzY2FwZWQKICAgICAgYnVmZmVyLndyaXRlKG1pbmlmaWVkTmFtZSk7CiAgICAgIGJ1ZmZlci53cml0ZSgnLCcpOwogICAgICBidWZmZXIud3JpdGUobmFtZU1hcFtuYW1lXSk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9KTsKICAgIGJ1ZmZlci53cml0ZSgnIicpOwogIH0KCiAgdm9pZCB3cml0ZUZyYW1lcygKICAgICAgSW5kZXhNYXA8VXJpPiB1cmlNYXAsIEluZGV4TWFwPFN0cmluZz4gbmFtZU1hcCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewogICAgdmFyIG9mZnNldEVuY29kZXIgPSBEZWx0YUVuY29kZXIoKTsKICAgIHZhciB1cmlFbmNvZGVyID0gRGVsdGFFbmNvZGVyKCk7CiAgICB2YXIgbGluZUVuY29kZXIgPSBEZWx0YUVuY29kZXIoKTsKICAgIHZhciBjb2x1bW5FbmNvZGVyID0gRGVsdGFFbmNvZGVyKCk7CiAgICB2YXIgbmFtZUVuY29kZXIgPSBEZWx0YUVuY29kZXIoKTsKICAgIGJ1ZmZlci53cml0ZSgnIicpOwogICAgZnJhbWVzLmZvckVhY2goKGludCBvZmZzZXQsIExpc3Q8RnJhbWVFbnRyeT4gZW50cmllcykgewogICAgICBmb3IgKHZhciBlbnRyeSBpbiBlbnRyaWVzKSB7CiAgICAgICAgb2Zmc2V0RW5jb2Rlci5lbmNvZGUoYnVmZmVyLCBvZmZzZXQpOwogICAgICAgIGlmIChlbnRyeS5pc1B1c2gpIHsKICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGxvY2F0aW9uID0gZW50cnkucHVzaExvY2F0aW9uOwogICAgICAgICAgdXJpRW5jb2Rlci5lbmNvZGUoYnVmZmVyLCB1cmlNYXBbbG9jYXRpb24uc291cmNlVXJpXSk7CiAgICAgICAgICBsaW5lRW5jb2Rlci5lbmNvZGUoYnVmZmVyLCBsb2NhdGlvbi5saW5lIC0gMSk7CiAgICAgICAgICBjb2x1bW5FbmNvZGVyLmVuY29kZShidWZmZXIsIGxvY2F0aW9uLmNvbHVtbiAtIDEpOwogICAgICAgICAgbmFtZUVuY29kZXIuZW5jb2RlKGJ1ZmZlciwgbmFtZU1hcFtlbnRyeS5pbmxpbmVkTWV0aG9kTmFtZV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyA7IGFuZCAsIGFyZSBub3QgdXNlZCBieSBWTFEgc28gd2UgY2FuIGRpc3Rpbmd1aXNoIHRoZW0gaW4gdGhlCiAgICAgICAgICAvLyBlbmNvZGluZywgdGhpcyBpcyB0aGUgc2FtZSByZWFzb24gdGhleSBhcmUgdXNlZCBpbiB0aGUgbWFwcGluZ3MKICAgICAgICAgIC8vIGZpZWxkLgogICAgICAgICAgYnVmZmVyLndyaXRlKGVudHJ5LmlzRW1wdHlQb3AgPyAiOyIgOiAiLCIpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBidWZmZXIud3JpdGUoJyInKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBzb3VyY2UgbWFwIHRhZyB0byBwdXQgYXQgdGhlIGVuZCBhIC5qcyBmaWxlIGluIFtmaWxlVXJpXSB0bwogIC8vLyBtYWtlIGl0IHBvaW50IHRvIHRoZSBzb3VyY2UgbWFwIGZpbGUgaW4gW3NvdXJjZU1hcFVyaV0uCiAgc3RhdGljIFN0cmluZyBnZW5lcmF0ZVNvdXJjZU1hcFRhZyhVcmkgc291cmNlTWFwVXJpLCBVcmkgZmlsZVVyaSkgewogICAgaWYgKHNvdXJjZU1hcFVyaSAhPSBudWxsICYmIGZpbGVVcmkgIT0gbnVsbCkgewogICAgICBTdHJpbmcgc291cmNlTWFwRmlsZU5hbWUgPSBmZS5yZWxhdGl2aXplVXJpKGZpbGVVcmksIHNvdXJjZU1hcFVyaSwgZmFsc2UpOwogICAgICByZXR1cm4gJycnCgovLyMgc291cmNlTWFwcGluZ1VSTD0kc291cmNlTWFwRmlsZU5hbWUKJycnOwogICAgfQogICAgcmV0dXJuICcnOwogIH0KCiAgLy8vIEdlbmVyYXRlcyBzb3VyY2UgbWFwIGZpbGVzIGZvciBhbGwgW1NvdXJjZUxvY2F0aW9uc10gaW4KICAvLy8gW3NvdXJjZUxvY2F0aW9uc1Byb3ZpZGVyXSBmb3IgdGhlIC5qcyBjb2RlIGluIFtsb2NhdGlvblByb3ZpZGVyXQogIC8vLyBbc291cmNlTWFwVXJpXSBpcyB1c2VkIHRvIHJlbGF0aXZpemVzIHRoZSBVUklzIG9mIHRoZSByZWZlcmVuY2VkIHNvdXJjZQogIC8vLyBmaWxlcyBhbmQgdGhlIHRhcmdldCBbZmlsZVVyaV0uIFtuYW1lXSBhbmQgW291dHB1dFByb3ZpZGVyXSBhcmUgdXNlZCB0bwogIC8vLyBjcmVhdGUgdGhlIFtPdXRwdXRTaW5rXSBmb3IgdGhlIHNvdXJjZSBtYXAgdGV4dC4KICBzdGF0aWMgdm9pZCBvdXRwdXRTb3VyY2VNYXAoCiAgICAgIFNvdXJjZUxvY2F0aW9uc1Byb3ZpZGVyIHNvdXJjZUxvY2F0aW9uc1Byb3ZpZGVyLAogICAgICBMb2NhdGlvblByb3ZpZGVyIGxvY2F0aW9uUHJvdmlkZXIsCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWluaWZpZWRHbG9iYWxOYW1lcywKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtaW5pZmllZEluc3RhbmNlTmFtZXMsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBVcmkgc291cmNlTWFwVXJpLAogICAgICBVcmkgZmlsZVVyaSwKICAgICAgQ29tcGlsZXJPdXRwdXQgY29tcGlsZXJPdXRwdXQpIHsKICAgIC8vIENyZWF0ZSBhIHNvdXJjZSBmaWxlIGZvciB0aGUgY29tcGlsYXRpb24gb3V0cHV0LiBUaGlzIGFsbG93cyB1c2luZwogICAgLy8gWzpnZXRMaW5lOl0gdG8gdHJhbnNmb3JtIG9mZnNldHMgdG8gbGluZSBudW1iZXJzIGluIFtTb3VyY2VNYXBCdWlsZGVyXS4KICAgIGludCBpbmRleCA9IDA7CiAgICBzb3VyY2VMb2NhdGlvbnNQcm92aWRlci5zb3VyY2VMb2NhdGlvbnMKICAgICAgICAuZm9yRWFjaCgoU291cmNlTG9jYXRpb25zIHNvdXJjZUxvY2F0aW9ucykgewogICAgICBTb3VyY2VNYXBCdWlsZGVyIHNvdXJjZU1hcEJ1aWxkZXIgPSBuZXcgU291cmNlTWFwQnVpbGRlcigKICAgICAgICAgIHNvdXJjZUxvY2F0aW9ucy5uYW1lLAogICAgICAgICAgc291cmNlTWFwVXJpLAogICAgICAgICAgZmlsZVVyaSwKICAgICAgICAgIGxvY2F0aW9uUHJvdmlkZXIsCiAgICAgICAgICBtaW5pZmllZEdsb2JhbE5hbWVzLAogICAgICAgICAgbWluaWZpZWRJbnN0YW5jZU5hbWVzLAogICAgICAgICAgc291cmNlTG9jYXRpb25zLmZyYW1lTWFya2Vycyk7CiAgICAgIHNvdXJjZUxvY2F0aW9ucy5mb3JFYWNoU291cmNlTG9jYXRpb24oc291cmNlTWFwQnVpbGRlci5hZGRNYXBwaW5nKTsKICAgICAgU3RyaW5nIHNvdXJjZU1hcCA9IHNvdXJjZU1hcEJ1aWxkZXIuYnVpbGQoKTsKICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9ICdqcy5tYXAnOwogICAgICBpZiAoaW5kZXggPiAwKSB7CiAgICAgICAgaWYgKG5hbWUgPT0gJycpIHsKICAgICAgICAgIG5hbWUgPSBmaWxlVXJpICE9IG51bGwgPyBmaWxlVXJpLnBhdGhTZWdtZW50cy5sYXN0IDogJ291dC5qcyc7CiAgICAgICAgICBleHRlbnNpb24gPSAnbWFwLiR7c291cmNlTG9jYXRpb25zLm5hbWV9JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZXh0ZW5zaW9uID0gJ2pzLm1hcC4ke3NvdXJjZUxvY2F0aW9ucy5uYW1lfSc7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbXBpbGVyT3V0cHV0LmNyZWF0ZU91dHB1dFNpbmsobmFtZSwgZXh0ZW5zaW9uLCBPdXRwdXRUeXBlLnNvdXJjZU1hcCkKICAgICAgICAuLmFkZChzb3VyY2VNYXApCiAgICAgICAgLi5jbG9zZSgpOwogICAgICBpbmRleCsrOwogICAgfSk7CiAgfQp9CgovLy8gRW5jb2RlciBmb3IgdmFsdWUgZGVsdGFzIGluIFZMUSBmb3JtYXQuCmNsYXNzIERlbHRhRW5jb2RlciB7CiAgLy8vIFRoZSBsYXN0IGVtaXR0ZWQgdmFsdWUgb2YgdGhlIGVuY29kZXIuCiAgaW50IF92YWx1ZSA9IDA7CgogIC8vLyBSZXNldCB0aGUgZW5jb2RlciB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KICB2b2lkIHJlc2V0KCkgewogICAgX3ZhbHVlID0gMDsKICB9CgogIC8vLyBXcml0ZXMgdGhlIFZMUSBvZiBkZWx0YSBiZXR3ZWVuIFt2YWx1ZV0gYW5kIHRoZSBsYXN0IGVtaXR0ZWQgdmFsdWUgaW50bwogIC8vLyBbb3V0cHV0XSBhbmQgdXBkYXRlcyB0aGUgbGFzdCBlbWl0dGVkIHZhbHVlIG9mIHRoZSBlbmNvZGVyLgogIHZvaWQgZW5jb2RlKFN0cmluZ0J1ZmZlciBvdXRwdXQsIGludCB2YWx1ZSkgewogICAgX3ZhbHVlID0gZW5jb2RlVkxRKG91dHB1dCwgdmFsdWUsIF92YWx1ZSk7CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IFZMUV9CQVNFX1NISUZUID0gNTsKICBzdGF0aWMgY29uc3QgaW50IFZMUV9CQVNFX01BU0sgPSAoMSA8PCA1KSAtIDE7CiAgc3RhdGljIGNvbnN0IGludCBWTFFfQ09OVElOVUFUSU9OX0JJVCA9IDEgPDwgNTsKICBzdGF0aWMgY29uc3QgaW50IFZMUV9DT05USU5VQVRJT05fTUFTSyA9IDEgPDwgNTsKICBzdGF0aWMgY29uc3QgU3RyaW5nIEJBU0U2NF9ESUdJVFMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbicKICAgICAgJ29wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CgogIC8vLyBXcml0ZXMgdGhlIFZMUSBvZiBkZWx0YSBiZXR3ZWVuIFt2YWx1ZV0gYW5kIFtvZmZzZXRdIGludG8gW291dHB1dF0gYW5kCiAgLy8vIHJldHVybiBbdmFsdWVdLgogIHN0YXRpYyBpbnQgZW5jb2RlVkxRKFN0cmluZ0J1ZmZlciBvdXRwdXQsIGludCB2YWx1ZSwgaW50IG9mZnNldCkgewogICAgaW50IGRlbHRhID0gdmFsdWUgLSBvZmZzZXQ7CiAgICBpbnQgc2lnbkJpdCA9IDA7CiAgICBpZiAoZGVsdGEgPCAwKSB7CiAgICAgIHNpZ25CaXQgPSAxOwogICAgICBkZWx0YSA9IC1kZWx0YTsKICAgIH0KICAgIGRlbHRhID0gKGRlbHRhIDw8IDEpIHwgc2lnbkJpdDsKICAgIGRvIHsKICAgICAgaW50IGRpZ2l0ID0gZGVsdGEgJiBWTFFfQkFTRV9NQVNLOwogICAgICBkZWx0YSA+Pj0gVkxRX0JBU0VfU0hJRlQ7CiAgICAgIGlmIChkZWx0YSA+IDApIHsKICAgICAgICBkaWdpdCB8PSBWTFFfQ09OVElOVUFUSU9OX0JJVDsKICAgICAgfQogICAgICBvdXRwdXQud3JpdGUoQkFTRTY0X0RJR0lUU1tkaWdpdF0pOwogICAgfSB3aGlsZSAoZGVsdGEgPiAwKTsKICAgIHJldHVybiB2YWx1ZTsKICB9Cn0KCmNsYXNzIFNvdXJjZU1hcEVudHJ5IHsKICBTb3VyY2VMb2NhdGlvbiBzb3VyY2VMb2NhdGlvbjsKICBpbnQgdGFyZ2V0T2Zmc2V0OwoKICBTb3VyY2VNYXBFbnRyeSh0aGlzLnNvdXJjZUxvY2F0aW9uLCB0aGlzLnRhcmdldE9mZnNldCk7Cn0KCi8vLyBNYXAgZnJvbSBsaW5lL2NvbHVtbiBwYWlycyB0byBsaXN0cyBvZiBbVF0gZWxlbWVudHMuCmNsYXNzIExpbmVDb2x1bW5NYXA8VD4gewogIE1hcDxpbnQsIE1hcDxpbnQsIExpc3Q8VD4+PiBfbWFwID0gPGludCwgTWFwPGludCwgTGlzdDxUPj4+e307CgogIC8vLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGVsZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCAoW2xpbmVdLFtjb2x1bW5dKS4KICBMaXN0PFQ+IF9nZXRMaXN0KGludCBsaW5lLCBpbnQgY29sdW1uKSB7CiAgICBNYXA8aW50LCBMaXN0PFQ+PiBsaW5lTWFwID0gX21hcFtsaW5lXSA/Pz0gPGludCwgTGlzdDxUPj57fTsKICAgIHJldHVybiBsaW5lTWFwW2NvbHVtbl0gPz89IDxUPltdOwogIH0KCiAgLy8vIEFkZHMgW2VsZW1lbnRdIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoCiAgLy8vIChbbGluZV0sW2NvbHVtbl0pLgogIHZvaWQgYWRkKGludCBsaW5lLCBpbnQgY29sdW1uLCBUIGVsZW1lbnQpIHsKICAgIF9nZXRMaXN0KGxpbmUsIGNvbHVtbikuYWRkKGVsZW1lbnQpOwogIH0KCiAgLy8vIEFkZHMgW2VsZW1lbnRdIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3Qgb2YgZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoCiAgLy8vIChbbGluZV0sW2NvbHVtbl0pLgogIHZvaWQgYWRkRmlyc3QoaW50IGxpbmUsIGludCBjb2x1bW4sIFQgZWxlbWVudCkgewogICAgX2dldExpc3QobGluZSwgY29sdW1uKS5pbnNlcnQoMCwgZWxlbWVudCk7CiAgfQoKICAvLy8gQ2FsbHMgW2ZdIHdpdGggdGhlIGxpbmUgbnVtYmVyIGZvciBlYWNoIGxpbmUgd2l0aCBhc3NvY2lhdGVkIGVsZW1lbnRzLgogIC8vLwogIC8vLyBbZl0gaXMgY2FsbGVkIGluIGluY3JlYXNpbmcgbGluZSBvcmRlci4KICB2b2lkIGZvckVhY2hMaW5lKGYoaW50IGxpbmUpKSB7CiAgICBMaXN0PGludD4gbGluZXMgPSBfbWFwLmtleXMudG9MaXN0KCkuLnNvcnQoKTsKICAgIGxpbmVzLmZvckVhY2goZik7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgZWxlbWVudHMgZm9yIHRoZSBmaXJzdCB0aGUgY29sdW1uIGluIFtsaW5lXSB0aGF0IGhhcwogIC8vLyBhc3NvY2lhdGVkIGVsZW1lbnRzLgogIExpc3Q8VD4gZ2V0Rmlyc3RFbGVtZW50c0luTGluZShpbnQgbGluZSkgewogICAgTWFwPGludCwgTGlzdDxUPj4gbGluZU1hcCA9IF9tYXBbbGluZV07CiAgICBpZiAobGluZU1hcCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIExpc3Q8aW50PiBjb2x1bW5zID0gbGluZU1hcC5rZXlzLnRvTGlzdCgpLi5zb3J0KCk7CiAgICByZXR1cm4gbGluZU1hcFtjb2x1bW5zLmZpcnN0XTsKICB9CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggY29sdW1uIHdpdGggYXNzb2NpYXRlZCBlbGVtZW50cyBpbiBbbGluZV0uCiAgLy8vCiAgLy8vIFtmXSBpcyBjYWxsZWQgaW4gaW5jcmVhc2luZyBjb2x1bW4gb3JkZXIuCiAgdm9pZCBmb3JFYWNoQ29sdW1uKGludCBsaW5lLCBmKGludCBjb2x1bW4sIExpc3Q8VD4gZWxlbWVudHMpKSB7CiAgICBNYXA8aW50LCBMaXN0PFQ+PiBsaW5lTWFwID0gX21hcFtsaW5lXTsKICAgIGlmIChsaW5lTWFwICE9IG51bGwpIHsKICAgICAgTGlzdDxpbnQ+IGNvbHVtbnMgPSBsaW5lTWFwLmtleXMudG9MaXN0KCkuLnNvcnQoKTsKICAgICAgY29sdW1ucy5mb3JFYWNoKChpbnQgY29sdW1uKSB7CiAgICAgICAgZihjb2x1bW4sIGxpbmVNYXBbY29sdW1uXSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8vIENhbGxzIFtmXSBmb3IgZWFjaCBsaW5lL2NvbHVtbi9lbGVtZW50IHRyaXBsZXQgaW4gdGhlIG1hcC4KICAvLy8KICAvLy8gW2ZdIGlzIGNhbGxlZCBpbiBpbmNyZWFzaW5nIGxpbmUsIGNvbHVtbiwgZWxlbWVudCBvcmRlci4KICB2b2lkIGZvckVhY2goZihpbnQgbGluZSwgaW50IGNvbHVtbiwgVCBlbGVtZW50KSkgewogICAgTGlzdDxpbnQ+IGxpbmVzID0gX21hcC5rZXlzLnRvTGlzdCgpLi5zb3J0KCk7CiAgICBmb3IgKGludCBsaW5lIGluIGxpbmVzKSB7CiAgICAgIE1hcDxpbnQsIExpc3Q8VD4+IGxpbmVNYXAgPSBfbWFwW2xpbmVdOwogICAgICBMaXN0PGludD4gY29sdW1ucyA9IGxpbmVNYXAua2V5cy50b0xpc3QoKS4uc29ydCgpOwogICAgICBmb3IgKGludCBjb2x1bW4gaW4gY29sdW1ucykgewogICAgICAgIGxpbmVNYXBbY29sdW1uXS5mb3JFYWNoKChlKSA9PiBmKGxpbmUsIGNvbHVtbiwgZSkpOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGVsZW1lbnQgYXNzb2NpYXRlZCBpbiB0aGUgbWFwLgogIC8vLwogIC8vLyBbZl0gaXMgY2FsbGVkIGluIGluY3JlYXNpbmcgbGluZSwgY29sdW1uLCBlbGVtZW50IG9yZGVyLgogIHZvaWQgZm9yRWFjaEVsZW1lbnQoZihUIGVsZW1lbnQpKSB7CiAgICBmb3JFYWNoKChsaW5lLCBjb2x1bW4sIGVsZW1lbnQpID0+IGYoZWxlbWVudCkpOwogIH0KfQoKLy8vIE1hcCBmcm9tIFtUXSBlbGVtZW50cyB0byBhc3NpZ25lZCBpbmRpY2VzLgpjbGFzcyBJbmRleE1hcDxUPiB7CiAgTWFwPFQsIGludD4gbWFwID0gPFQsIGludD57fTsKCiAgLy8vIFJlZ2lzdGVyIFtlbGVtZW50XSBhbmQgcmV0dXJucyBpdHMgaW5kZXguCiAgaW50IHJlZ2lzdGVyKFQgZWxlbWVudCkgewogICAgcmV0dXJuIG1hcC5wdXRJZkFic2VudChlbGVtZW50LCAoKSA9PiBtYXAubGVuZ3RoKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBpbmRleCBvZiBbZWxlbWVudF0uCiAgaW50IG9wZXJhdG9yIFtdKFQgZWxlbWVudCkgPT4gbWFwW2VsZW1lbnRdOwoKICAvLy8gUmV0dXJucyB0aGUgaW5kZXhlZCBlbGVtZW50cy4KICBJdGVyYWJsZTxUPiBnZXQgZWxlbWVudHMgPT4gbWFwLmtleXM7Cn0KgccATk48ASQBQDBOHCFJQgEZGAEmGgErGwErQwFGMTMBOisBFBQZGh0gIhQBRUMEAUoXFyUlGS8ZFQYXBAETMi1AMDYgRSouNwE/Hio+QD4jRwoICAEiBAE/MDcBOyQwNTM5DAoIBgE6LggBOjw2Iy4vNQoIBgE2QgEuGScvOSBLBisjPyAeUAY2GSExGSUiGjUvJj4ZKEAgJCogHgQBUTcrIDsiPTk7PgFPPDYQCAEtQB0KKSclIQgBHxsIIAE4ASQQCAEwH0FDRwgBNSBECAEvCAQBPTcXFz8lUSIZIxUIFwQBFE0oJSYoJhc8Iy4cOEE5PUgRS00UNgoICBcEAU4+RjNREQEoBQYPBAE+R05ONx83KS8xExgTJ0pPEyw1QCAYExwfISlKMyMXGkk1ETgKCE0ZEw8IBAIBLBUtEgEuERAEAU5CMC8EAScxMjNRIgFNFkUgFRUTFgYkCSkgFycIKhkSBAIBFyEUAToCATkZQQFGK0EmBAFIGS4pBAFOGTMvBAFNBi4iMhYEAUcbLSwmNyMEAUQGMEIsGzklJAoGBAFBBj81Mh4uOSQ8CAYEATgGPyY0BAIBLxQgATAcNwQBJi4BJCgCAS9wYWNrYWdlOmNvbXBpbGVyL3NyYy9pby9zb3VyY2VfbWFwX2J1aWxkZXIuZGFydDhzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL2pzX2JhY2tlbmQuZGFydIGtLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkganNfYmFja2VuZDsKCmV4cG9ydCAnYmFja2VuZC5kYXJ0JzsKZXhwb3J0ICdjaGVja2VkX21vZGVfaGVscGVycy5kYXJ0JzsKZXhwb3J0ICdjb25zdGFudF9lbWl0dGVyLmRhcnQnOwpleHBvcnQgJ2N1c3RvbV9lbGVtZW50c19hbmFseXNpcy5kYXJ0JzsKZXhwb3J0ICduYW1lci5kYXJ0JzsKZXhwb3J0ICdub19zdWNoX21ldGhvZF9yZWdpc3RyeS5kYXJ0JzsKDgBOTjwBFAEXJCAoFScBL3BhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvanNfYmFja2VuZC5kYXJ0P3Nka3Jvb3Q6L3BrZy9jb21waWxlci9saWIvc3JjL2pzX2VtaXR0ZXIvY29uc3RhbnRfb3JkZXJpbmcuZGFydKMrLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19lbWl0dGVyLmNvbnN0YW50X29yZGVyaW5nOwoKaW1wb3J0ICcuLi9jb25zdGFudHMvdmFsdWVzLmRhcnQnOwppbXBvcnQgJy4uL2VsZW1lbnRzL2VudGl0aWVzLmRhcnQnCiAgICBzaG93IENsYXNzRW50aXR5LCBGaWVsZEVudGl0eSwgTWVtYmVyRW50aXR5LCBUeXBlZGVmRW50aXR5OwppbXBvcnQgJy4uL2VsZW1lbnRzL3R5cGVzLmRhcnQnOwppbXBvcnQgJ3NvcnRlci5kYXJ0JyBzaG93IFNvcnRlcjsKCi8vLyBBIGNhbm9uaWNhbCBidXQgYXJiaXRyYXJ5IG9yZGVyaW5nIG9mIGNvbnN0YW50cy4gVGhlIG9yZGVyaW5nIGlzICdzdGFibGUnCi8vLyB1bmRlciBwZXJ0dXJiYXRpb24gb2YgdGhlIHNvdXJjZS4KYWJzdHJhY3QgY2xhc3MgQ29uc3RhbnRPcmRlcmluZyB7CiAgZmFjdG9yeSBDb25zdGFudE9yZGVyaW5nKFNvcnRlciBzb3J0ZXIpID0gX0NvbnN0YW50T3JkZXJpbmc7CgogIGludCBjb21wYXJlKENvbnN0YW50VmFsdWUgYSwgQ29uc3RhbnRWYWx1ZSBiKTsKfQoKY2xhc3MgX0NvbnN0YW50T3JkZXJpbmcKICAgIGltcGxlbWVudHMgQ29uc3RhbnRPcmRlcmluZywgQ29uc3RhbnRWYWx1ZVZpc2l0b3I8aW50LCBDb25zdGFudFZhbHVlPiB7CiAgZmluYWwgU29ydGVyIF9zb3J0ZXI7CiAgX0RhcnRUeXBlT3JkZXJpbmcgX2RhcnRUeXBlT3JkZXJpbmc7CiAgX0NvbnN0YW50T3JkZXJpbmcodGhpcy5fc29ydGVyKSB7CiAgICBfZGFydFR5cGVPcmRlcmluZyA9IG5ldyBfRGFydFR5cGVPcmRlcmluZyh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGludCBjb21wYXJlKENvbnN0YW50VmFsdWUgYSwgQ29uc3RhbnRWYWx1ZSBiKSA9PiBjb21wYXJlVmFsdWVzKGEsIGIpOwoKICBpbnQgY29tcGFyZVZhbHVlcyhDb25zdGFudFZhbHVlIGEsIENvbnN0YW50VmFsdWUgYikgewogICAgaWYgKGlkZW50aWNhbChhLCBiKSkgcmV0dXJuIDA7CiAgICBpbnQgciA9IGEua2luZC5pbmRleC5jb21wYXJlVG8oYi5raW5kLmluZGV4KTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgcmV0dXJuIGEuYWNjZXB0KHRoaXMsIGIpOwogIH0KCiAgc3RhdGljIGludCBjb21wYXJlTnVsbGFibGU8VD4oaW50IGNvbXBhcmUoVCBhLCBUIGIpLCBUIGEsIFQgYikgewogICAgaWYgKGEgPT0gbnVsbCAmJiBiID09IG51bGwpIHJldHVybiAwOwogICAgaWYgKGEgPT0gbnVsbCkgcmV0dXJuIC0xOwogICAgaWYgKGIgPT0gbnVsbCkgcmV0dXJuIDE7CiAgICByZXR1cm4gY29tcGFyZShhLCBiKTsKICB9CgogIHN0YXRpYyBpbnQgY29tcGFyZUxpc3RzPFMsIFQ+KGludCBjb21wYXJlKFMgYSwgVCBiKSwgTGlzdDxTPiBhLCBMaXN0PFQ+IGIpIHsKICAgIGludCByID0gYS5sZW5ndGguY29tcGFyZVRvKGIubGVuZ3RoKTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CiAgICAgIHIgPSBjb21wYXJlKGFbaV0sIGJbaV0pOwogICAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICAgIH0KICAgIHJldHVybiAwOwogIH0KCiAgaW50IGNvbXBhcmVDbGFzc2VzKENsYXNzRW50aXR5IGEsIENsYXNzRW50aXR5IGIpIHsKICAgIGludCByID0gYS5uYW1lLmNvbXBhcmVUbyhiLm5hbWUpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICByZXR1cm4gX3NvcnRlci5jb21wYXJlQ2xhc3Nlc0J5TG9jYXRpb24oYSwgYik7CiAgfQoKICBpbnQgY29tcGFyZU1lbWJlcnMoTWVtYmVyRW50aXR5IGEsIE1lbWJlckVudGl0eSBiKSB7CiAgICBpbnQgciA9IGEubmFtZS5jb21wYXJlVG8oYi5uYW1lKTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgcmV0dXJuIF9zb3J0ZXIuY29tcGFyZU1lbWJlcnNCeUxvY2F0aW9uKGEsIGIpOwogIH0KCiAgaW50IGNvbXBhcmVUeXBlZGVmcyhUeXBlZGVmRW50aXR5IGEsIFR5cGVkZWZFbnRpdHkgYikgewogICAgaW50IHIgPSBhLm5hbWUuY29tcGFyZVRvKGIubmFtZSk7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICAgIHJldHVybiBfc29ydGVyLmNvbXBhcmVUeXBlZGVmc0J5TG9jYXRpb24oYSwgYik7CiAgfQoKICBpbnQgY29tcGFyZURhcnRUeXBlcyhEYXJ0VHlwZSBhLCBEYXJ0VHlwZSBiKSB7CiAgICByZXR1cm4gX2RhcnRUeXBlT3JkZXJpbmcuY29tcGFyZShhLCBiKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdEZ1bmN0aW9uKEZ1bmN0aW9uQ29uc3RhbnRWYWx1ZSBhLCBGdW5jdGlvbkNvbnN0YW50VmFsdWUgYikgewogICAgcmV0dXJuIGNvbXBhcmVNZW1iZXJzKGEuZWxlbWVudCwgYi5lbGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdE51bGwoTnVsbENvbnN0YW50VmFsdWUgYSwgTnVsbENvbnN0YW50VmFsdWUgYikgewogICAgcmV0dXJuIDA7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXROb25Db25zdGFudChOb25Db25zdGFudFZhbHVlIGEsIE5vbkNvbnN0YW50VmFsdWUgYikgewogICAgcmV0dXJuIDA7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRJbnQoSW50Q29uc3RhbnRWYWx1ZSBhLCBJbnRDb25zdGFudFZhbHVlIGIpIHsKICAgIHJldHVybiBhLmludFZhbHVlLmNvbXBhcmVUbyhiLmludFZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdERvdWJsZShEb3VibGVDb25zdGFudFZhbHVlIGEsIERvdWJsZUNvbnN0YW50VmFsdWUgYikgewogICAgcmV0dXJuIGEuZG91YmxlVmFsdWUuY29tcGFyZVRvKGIuZG91YmxlVmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0Qm9vbChCb29sQ29uc3RhbnRWYWx1ZSBhLCBCb29sQ29uc3RhbnRWYWx1ZSBiKSB7CiAgICBpbnQgYUludCA9IGEuYm9vbFZhbHVlID8gMSA6IDA7CiAgICBpbnQgYkludCA9IGIuYm9vbFZhbHVlID8gMSA6IDA7CiAgICByZXR1cm4gYUludC5jb21wYXJlVG8oYkludCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRTdHJpbmcoU3RyaW5nQ29uc3RhbnRWYWx1ZSBhLCBTdHJpbmdDb25zdGFudFZhbHVlIGIpIHsKICAgIFN0cmluZyBhU3RyaW5nID0gYS5zdHJpbmdWYWx1ZTsKICAgIFN0cmluZyBiU3RyaW5nID0gYi5zdHJpbmdWYWx1ZTsKICAgIHJldHVybiBhU3RyaW5nLmNvbXBhcmVUbyhiU3RyaW5nKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdExpc3QoTGlzdENvbnN0YW50VmFsdWUgYSwgTGlzdENvbnN0YW50VmFsdWUgYikgewogICAgaW50IHIgPSBjb21wYXJlTGlzdHMoY29tcGFyZVZhbHVlcywgYS5lbnRyaWVzLCBiLmVudHJpZXMpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICByZXR1cm4gY29tcGFyZURhcnRUeXBlcyhhLnR5cGUsIGIudHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRTZXQoU2V0Q29uc3RhbnRWYWx1ZSBhLCBTZXRDb25zdGFudFZhbHVlIGIpIHsKICAgIGludCByID0gY29tcGFyZUxpc3RzKGNvbXBhcmVWYWx1ZXMsIGEudmFsdWVzLCBiLnZhbHVlcyk7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICAgIHJldHVybiBjb21wYXJlRGFydFR5cGVzKGEudHlwZSwgYi50eXBlKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdE1hcChNYXBDb25zdGFudFZhbHVlIGEsIE1hcENvbnN0YW50VmFsdWUgYikgewogICAgaW50IHIgPSBjb21wYXJlTGlzdHMoY29tcGFyZVZhbHVlcywgYS5rZXlzLCBiLmtleXMpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICByID0gY29tcGFyZUxpc3RzKGNvbXBhcmVWYWx1ZXMsIGEudmFsdWVzLCBiLnZhbHVlcyk7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICAgIHJldHVybiBjb21wYXJlRGFydFR5cGVzKGEudHlwZSwgYi50eXBlKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdENvbnN0cnVjdGVkKENvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZSBhLCBDb25zdHJ1Y3RlZENvbnN0YW50VmFsdWUgYikgewogICAgaW50IHIgPSBjb21wYXJlRGFydFR5cGVzKGEudHlwZSwgYi50eXBlKTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwoKICAgIC8vIFRPRE8oc3JhKTogQXZvaWQgYWxsIHRoZXNlIHRlYXItb2Zmcy4KICAgIExpc3Q8RmllbGRFbnRpdHk+IGFGaWVsZHMgPSBhLmZpZWxkcy5rZXlzLnRvTGlzdCgpLi5zb3J0KGNvbXBhcmVNZW1iZXJzKTsKICAgIExpc3Q8RmllbGRFbnRpdHk+IGJGaWVsZHMgPSBiLmZpZWxkcy5rZXlzLnRvTGlzdCgpLi5zb3J0KGNvbXBhcmVNZW1iZXJzKTsKCiAgICByID0gY29tcGFyZUxpc3RzKGNvbXBhcmVNZW1iZXJzLCBhRmllbGRzLCBiRmllbGRzKTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwoKICAgIHJldHVybiBjb21wYXJlTGlzdHMoCiAgICAgICAgY29tcGFyZVZhbHVlcywKICAgICAgICBhRmllbGRzLm1hcCgoZmllbGQpID0+IGEuZmllbGRzW2ZpZWxkXSkudG9MaXN0KCksCiAgICAgICAgYUZpZWxkcy5tYXAoKGZpZWxkKSA9PiBiLmZpZWxkc1tmaWVsZF0pLnRvTGlzdCgpKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdFR5cGUoVHlwZUNvbnN0YW50VmFsdWUgYSwgVHlwZUNvbnN0YW50VmFsdWUgYikgewogICAgaW50IHIgPSBjb21wYXJlRGFydFR5cGVzKGEucmVwcmVzZW50ZWRUeXBlLCBiLnJlcHJlc2VudGVkVHlwZSk7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICAgIHJldHVybiBjb21wYXJlRGFydFR5cGVzKGEudHlwZSwgYi50eXBlKTsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdEludGVyY2VwdG9yKEludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBhLCBJbnRlcmNlcHRvckNvbnN0YW50VmFsdWUgYikgewogICAgcmV0dXJuIGNvbXBhcmVDbGFzc2VzKGEuY2xzLCBiLmNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXREdW1teUludGVyY2VwdG9yKAogICAgICBEdW1teUludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBhLCBEdW1teUludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBiKSB7CiAgICAvLyBOZXZlciBlbWl0dGVkLgogICAgcmV0dXJuIDA7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRVbnJlYWNoYWJsZShVbnJlYWNoYWJsZUNvbnN0YW50VmFsdWUgYSwgVW5yZWFjaGFibGVDb25zdGFudFZhbHVlIGIpIHsKICAgIC8vIE5ldmVyIGVtaXR0ZWQuCiAgICByZXR1cm4gMDsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdEpzTmFtZShKc05hbWVDb25zdGFudFZhbHVlIGEsIEpzTmFtZUNvbnN0YW50VmFsdWUgYikgewogICAgLy8gQW4gb3BhcXVlIGRlZmVycmVkIEpTIEFTVCByZWZlcmVuY2UgdG8gYSBuYW1lLgogICAgcmV0dXJuIDA7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXREZWZlcnJlZEdsb2JhbCgKICAgICAgRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlIGEsIERlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZSBiKSB7CiAgICBpbnQgciA9IGNvbXBhcmVWYWx1ZXMoYS5yZWZlcmVuY2VkLCBiLnJlZmVyZW5jZWQpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICByZXR1cm4gYS51bml0LmNvbXBhcmVUbyhiLnVuaXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0SW5zdGFudGlhdGlvbigKICAgICAgSW5zdGFudGlhdGlvbkNvbnN0YW50VmFsdWUgYSwgSW5zdGFudGlhdGlvbkNvbnN0YW50VmFsdWUgYikgewogICAgaW50IHIgPSBjb21wYXJlVmFsdWVzKGEuZnVuY3Rpb24sIGIuZnVuY3Rpb24pOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICByZXR1cm4gY29tcGFyZUxpc3RzKGNvbXBhcmVEYXJ0VHlwZXMsIGEudHlwZUFyZ3VtZW50cywgYi50eXBlQXJndW1lbnRzKTsKICB9Cn0KCi8vLyBWaXNpdG9yIGZvciBkaXN0aW5ndWlzaGluZyB0eXBlcyBieSBraW5kLgpjbGFzcyBfRGFydFR5cGVLaW5kVmlzaXRvciBleHRlbmRzIERhcnRUeXBlVmlzaXRvcjxpbnQsIE51bGw+IHsKICBjb25zdCBfRGFydFR5cGVLaW5kVmlzaXRvcigpOwoKICBzdGF0aWMgaW50IGtpbmQoRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIHR5cGUuYWNjZXB0KGNvbnN0IF9EYXJ0VHlwZUtpbmRWaXNpdG9yKCksIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0Vm9pZFR5cGUoY292YXJpYW50IFZvaWRUeXBlIHR5cGUsIF8pID0+IDY7CiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0VHlwZVZhcmlhYmxlVHlwZShjb3ZhcmlhbnQgVHlwZVZhcmlhYmxlVHlwZSB0eXBlLCBfKSA9PiAzOwogIEBvdmVycmlkZQogIGludCB2aXNpdEZ1bmN0aW9uVHlwZShjb3ZhcmlhbnQgRnVuY3Rpb25UeXBlIHR5cGUsIF8pID0+IDA7CiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0SW50ZXJmYWNlVHlwZShjb3ZhcmlhbnQgSW50ZXJmYWNlVHlwZSB0eXBlLCBfKSA9PiAxOwogIEBvdmVycmlkZQogIGludCB2aXNpdFR5cGVkZWZUeXBlKGNvdmFyaWFudCBUeXBlZGVmVHlwZSB0eXBlLCBfKSA9PiAyOwogIEBvdmVycmlkZQogIGludCB2aXNpdER5bmFtaWNUeXBlKGNvdmFyaWFudCBEeW5hbWljVHlwZSB0eXBlLCBfKSA9PiA1Owp9CgpjbGFzcyBfRGFydFR5cGVPcmRlcmluZyBleHRlbmRzIERhcnRUeXBlVmlzaXRvcjxpbnQsIERhcnRUeXBlPiB7CiAgZmluYWwgX0NvbnN0YW50T3JkZXJpbmcgX2NvbnN0YW50T3JkZXJpbmc7CiAgRGFydFR5cGUgX3Jvb3Q7CiAgX0RhcnRUeXBlT3JkZXJpbmcodGhpcy5fY29uc3RhbnRPcmRlcmluZyk7CgogIGludCBjb21wYXJlKERhcnRUeXBlIGEsIERhcnRUeXBlIGIpIHsKICAgIGlmIChhID09IGIpIHJldHVybiAwOwogICAgaW50IHIgPQogICAgICAgIF9EYXJ0VHlwZUtpbmRWaXNpdG9yLmtpbmQoYSkuY29tcGFyZVRvKF9EYXJ0VHlwZUtpbmRWaXNpdG9yLmtpbmQoYikpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICBfcm9vdCA9IGE7CiAgICByID0gYS5hY2NlcHQodGhpcywgYik7CiAgICBfcm9vdCA9IG51bGw7CiAgICByZXR1cm4gcjsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdFZvaWRUeXBlKGNvdmFyaWFudCBWb2lkVHlwZSB0eXBlLCBjb3ZhcmlhbnQgVm9pZFR5cGUgb3RoZXIpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVbnJlYWNoYWJsZScpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0VHlwZVZhcmlhYmxlVHlwZSgKICAgICAgY292YXJpYW50IFR5cGVWYXJpYWJsZVR5cGUgdHlwZSwgY292YXJpYW50IFR5cGVWYXJpYWJsZVR5cGUgb3RoZXIpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJUeXBlIHZhcmlhYmxlcyBhcmUgbm90IGV4cGVjdGVkIGluIGNvbnN0YW50czogJyR0eXBlJyBpbiAnJF9yb290JyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0RnVuY3Rpb25UeXBlKAogICAgICBjb3ZhcmlhbnQgRnVuY3Rpb25UeXBlIHR5cGUsIGNvdmFyaWFudCBGdW5jdGlvblR5cGUgb3RoZXIpIHsKICAgIGludCByID0gX2NvbXBhcmVUeXBlQXJndW1lbnRzKHR5cGUucGFyYW1ldGVyVHlwZXMsIG90aGVyLnBhcmFtZXRlclR5cGVzKTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgciA9IF9jb21wYXJlVHlwZUFyZ3VtZW50cygKICAgICAgICB0eXBlLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMsIG90aGVyLm9wdGlvbmFsUGFyYW1ldGVyVHlwZXMpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICByID0gX0NvbnN0YW50T3JkZXJpbmcuY29tcGFyZUxpc3RzKChTdHJpbmcgYSwgU3RyaW5nIGIpID0+IGEuY29tcGFyZVRvKGIpLAogICAgICAgIHR5cGUubmFtZWRQYXJhbWV0ZXJzLCBvdGhlci5uYW1lZFBhcmFtZXRlcnMpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICByID0gX2NvbXBhcmVUeXBlQXJndW1lbnRzKAogICAgICAgIHR5cGUubmFtZWRQYXJhbWV0ZXJUeXBlcywgb3RoZXIubmFtZWRQYXJhbWV0ZXJUeXBlcyk7CiAgICBpZiAociAhPSAwKSByZXR1cm4gcjsKICAgIHJldHVybiBjb21wYXJlKHR5cGUucmV0dXJuVHlwZSwgb3RoZXIucmV0dXJuVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRJbnRlcmZhY2VUeXBlKAogICAgICBjb3ZhcmlhbnQgSW50ZXJmYWNlVHlwZSB0eXBlLCBjb3ZhcmlhbnQgSW50ZXJmYWNlVHlwZSBvdGhlcikgewogICAgaW50IHIgPSBfY29uc3RhbnRPcmRlcmluZy5jb21wYXJlQ2xhc3Nlcyh0eXBlLmVsZW1lbnQsIG90aGVyLmVsZW1lbnQpOwogICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CiAgICByZXR1cm4gX2NvbXBhcmVUeXBlQXJndW1lbnRzKHR5cGUudHlwZUFyZ3VtZW50cywgb3RoZXIudHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRUeXBlZGVmVHlwZSgKICAgICAgY292YXJpYW50IFR5cGVkZWZUeXBlIHR5cGUsIGNvdmFyaWFudCBUeXBlZGVmVHlwZSBvdGhlcikgewogICAgaW50IHIgPSBfY29uc3RhbnRPcmRlcmluZy5jb21wYXJlVHlwZWRlZnModHlwZS5lbGVtZW50LCBvdGhlci5lbGVtZW50KTsKICAgIGlmIChyICE9IDApIHJldHVybiByOwogICAgcmV0dXJuIF9jb21wYXJlVHlwZUFyZ3VtZW50cyh0eXBlLnR5cGVBcmd1bWVudHMsIG90aGVyLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0RHluYW1pY1R5cGUoCiAgICAgIGNvdmFyaWFudCBEeW5hbWljVHlwZSB0eXBlLCBjb3ZhcmlhbnQgRHluYW1pY1R5cGUgb3RoZXIpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVbnJlYWNoYWJsZScpOwogIH0KCiAgaW50IF9jb21wYXJlVHlwZUFyZ3VtZW50cygKICAgICAgTGlzdDxEYXJ0VHlwZT4gYUFyZ3VtZW50cywgTGlzdDxEYXJ0VHlwZT4gYkFyZ3VtZW50cykgewogICAgcmV0dXJuIF9Db25zdGFudE9yZGVyaW5nLmNvbXBhcmVMaXN0cyhjb21wYXJlLCBhQXJndW1lbnRzLCBiQXJndW1lbnRzKTsKICB9Cn0KgS0ATk48AS4BIyNAISIBTiYiPwExAgEYTBgnJDUEAQxIATgjMhoeBAFDKh4dGgQBTyoaKR8cBg4EATUmGjMEATcmGjMEATomGjQEATEsBAEMSDEEAQw8DgQBDEEOBAEMOS0EAQxCMwQBDDwkJCEEAQxCJCQnBAEMPD8aLQQBDDk9Gi0EAQw5ORo5Gi0EAQxRLhoBLU5OATgaARkXOjsEAQw8RBotBAEMUSkEAQwdShYOBAEMURYOBAEMQjYOBAEMG0Y3GiUEAQwaRDMaTQQCAS5AIAEjPAQBDDYMRgw+DEAMPAw8AgFBLRItASgaDE4aDxsSDgQBDEkvBAEMHUsgTgQBDBlDThofRBpPNhofPho3BAEMGkVLGksEAQwYQUwaSwQBDBhBLwQBHT5MBAIBNnBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvY29uc3RhbnRfb3JkZXJpbmcuZGFydDVzZGtyb290Oi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19lbWl0dGVyL2hlYWRlcnMuZGFydIYaLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5qc19lbWl0dGVyLmhlYWRlcnM7CgppbXBvcnQgJy4uL29wdGlvbnMuZGFydCc7CgpTdHJpbmcgZ2VuZXJhdGVkQnkoQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsIHtTdHJpbmcgZmxhdm9yOiAiIn0pIHsKICBTdHJpbmcgc3VmZml4ID0gJyc7CiAgaWYgKG9wdGlvbnMuaGFzQnVpbGRJZCkgewogICAgc3VmZml4ID0gJyB2ZXJzaW9uOiAke29wdGlvbnMuYnVpbGRJZH0nOwogIH0KICBpZiAoZmxhdm9yICE9ICIiKSBmbGF2b3IgPSAiICgkZmxhdm9yKSI7CiAgcmV0dXJuICcvLyBHZW5lcmF0ZWQgYnkgZGFydDJqcyRmbGF2b3IsICcKICAgICAgJ3RoZSBEYXJ0IHRvIEphdmFTY3JpcHQgY29tcGlsZXIkc3VmZml4Lic7Cn0KCmNvbnN0IFN0cmluZyBIT09LU19BUElfVVNBR0UgPSAiIiIKLy8gVGhlIGNvZGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBob29rczoKLy8gZGFydFByaW50KG1lc3NhZ2UpOgovLyAgICBpZiB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaXQgaXMgY2FsbGVkIGluc3RlYWQgb2YgdGhlIERhcnQgW3ByaW50XQovLyAgICBtZXRob2QuCi8vCi8vIGRhcnRNYWluUnVubmVyKG1haW4sIGFyZ3MpOgovLyAgICBpZiB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQsIHRoZSBEYXJ0IFttYWluXSBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZAovLyAgICBkaXJlY3RseS4gSW5zdGVhZCwgYSBjbG9zdXJlIHRoYXQgd2lsbCBpbnZva2UgW21haW5dLCBhbmQgaXRzIGFyZ3VtZW50cwovLyAgICBbYXJnc10gaXMgcGFzc2VkIHRvIFtkYXJ0TWFpblJ1bm5lcl0uCi8vCi8vIGRhcnREZWZlcnJlZExpYnJhcnlMb2FkZXIodXJpLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOgovLyAgICBpZiB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGl0IHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBkZWZlcnJlZCBsaWJyYXJ5Ci8vICAgIGlzIGxvYWRlZC4gSXQgc2hvdWxkIGxvYWQgYW5kIGV2YWwgdGhlIGphdmFzY3JpcHQgb2YgYHVyaWAsIGFuZCBjYWxsCi8vICAgIHN1Y2Nlc3NDYWxsYmFjay4gSWYgaXQgZmFpbHMgdG8gZG8gc28sIGl0IHNob3VsZCBjYWxsIGVycm9yQ2FsbGJhY2sgd2l0aAovLyAgICBhbiBlcnJvci4KLy8KLy8gZGFydENhbGxJbnN0cnVtZW50YXRpb24oaWQsIHF1YWxpZmllZE5hbWUpOgovLyAgICBpZiB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGl0IHdpbGwgYmUgY2FsbGVkIGF0IGVhY2ggZW50cnkgb2YgYQovLyAgICBtZXRob2Qgb3IgY29uc3RydWN0b3IuIFVzZWQgb25seSB3aGVuIGNvbXBpbGluZyBwcm9ncmFtcyB3aXRoCi8vICAgIC0tZXhwZXJpbWVudC1jYWxsLWluc3RydW1lbnRhdGlvbi4KIiIiOwoqAE5OPAEkARoBQxYcLQQrLDECASMqF0sOAx9OTiwDQ01LTxADL0hEKQUBLHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvaGVhZGVycy5kYXJ0NnNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb2xsZWN0aW9uL2xpYi9zcmMvdXRpbHMuZGFydIHwLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBBIHBhaXIgb2YgdmFsdWVzLgpjbGFzcyBQYWlyPEUsIEY+IHsKICBFIGZpcnN0OwogIEYgbGFzdDsKCiAgUGFpcih0aGlzLmZpcnN0LCB0aGlzLmxhc3QpOwp9CgovLy8gUmV0dXJucyBhIFtDb21wYXJhdG9yXSB0aGF0IGFzc2VydHMgdGhhdCBpdHMgZmlyc3QgYXJndW1lbnQgaXMgY29tcGFyYWJsZS4KQ29tcGFyYXRvcjxUPiBkZWZhdWx0Q29tcGFyZTxUPigpID0+CiAgICAodmFsdWUxLCB2YWx1ZTIpID0+ICh2YWx1ZTEgYXMgQ29tcGFyYWJsZSkuY29tcGFyZVRvKHZhbHVlMik7ChEATk48ARYTCwoBHwIBTyVCASFwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL3V0aWxzLmRhcnRHc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbGxlY3Rpb24vbGliL3NyYy9lbXB0eV91bm1vZGlmaWFibGVfc2V0LmRhcnSHLS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgppbXBvcnQgJ3VubW9kaWZpYWJsZV93cmFwcGVycy5kYXJ0JzsKCi8vIFVuZm9ydHVuYXRlbHksIHdlIGNhbid0IHVzZSBVbm1vZGlmaWFibGVTZXRNaXhpbiBoZXJlLCBzaW5jZSBjb25zdCBjbGFzc2VzCi8vIGNhbid0IHVzZSBtaXhpbnMuCi8vLyBBbiB1bm1vZGlmaWFibGUsIGVtcHR5IHNldCB0aGF0IGNhbiBoYXZlIGEgY29uc3QgY29uc3RydWN0b3IuCmNsYXNzIEVtcHR5VW5tb2RpZmlhYmxlU2V0PEU+IGV4dGVuZHMgSXRlcmFibGVCYXNlPEU+CiAgICBpbXBsZW1lbnRzIFVubW9kaWZpYWJsZVNldFZpZXc8RT4gewogIHN0YXRpYyBUIF90aHJvdzxUPigpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBTZXQiKTsKICB9CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBuZXcgSXRlcmFibGU8RT4uZW1wdHkoKS5pdGVyYXRvcjsKICBpbnQgZ2V0IGxlbmd0aCA9PiAwOwoKICBjb25zdCBFbXB0eVVubW9kaWZpYWJsZVNldCgpOwoKICBFbXB0eVVubW9kaWZpYWJsZVNldDxUPiBjYXN0PFQ+KCkgPT4gbmV3IEVtcHR5VW5tb2RpZmlhYmxlU2V0PFQ+KCk7CiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgPT4gZmFsc2U7CiAgYm9vbCBjb250YWluc0FsbChJdGVyYWJsZTxPYmplY3Q+IG90aGVyKSA9PiBvdGhlci5pc0VtcHR5OwogIEl0ZXJhYmxlPEU+IGZvbGxvd2VkQnkoSXRlcmFibGU8RT4gb3RoZXIpID0+IG5ldyBTZXQuZnJvbShvdGhlcik7CiAgRSBsb29rdXAoT2JqZWN0IGVsZW1lbnQpID0+IG51bGw7CiAgQGRlcHJlY2F0ZWQKICBFbXB0eVVubW9kaWZpYWJsZVNldDxUPiByZXR5cGU8VD4oKSA9PiBuZXcgRW1wdHlVbm1vZGlmaWFibGVTZXQ8VD4oKTsKICBFIHNpbmdsZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pID0+IHN1cGVyLnNpbmdsZVdoZXJlKHRlc3QpOwogIEl0ZXJhYmxlPFQ+IHdoZXJlVHlwZTxUPigpID0+IG5ldyBFbXB0eVVubW9kaWZpYWJsZVNldDxUPigpOwogIFNldDxFPiB0b1NldCgpID0+IG5ldyBTZXQoKTsKICBTZXQ8RT4gdW5pb24oU2V0PEU+IG90aGVyKSA9PiBuZXcgU2V0LmZyb20ob3RoZXIpOwogIFNldDxFPiBpbnRlcnNlY3Rpb24oU2V0PE9iamVjdD4gb3RoZXIpID0+IG5ldyBTZXQoKTsKICBTZXQ8RT4gZGlmZmVyZW5jZShTZXQ8T2JqZWN0PiBvdGhlcikgPT4gbmV3IFNldCgpOwoKICBib29sIGFkZChFIHZhbHVlKSA9PiBfdGhyb3coKTsKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBlbGVtZW50cykgPT4gX3Rocm93KCk7CiAgdm9pZCBjbGVhcigpID0+IF90aHJvdygpOwogIGJvb2wgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSA9PiBfdGhyb3coKTsKICB2b2lkIHJlbW92ZUFsbChJdGVyYWJsZTxPYmplY3Q+IGVsZW1lbnRzKSA9PiBfdGhyb3coKTsKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfdGhyb3coKTsKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfdGhyb3coKTsKICB2b2lkIHJldGFpbkFsbChJdGVyYWJsZTxPYmplY3Q+IGVsZW1lbnRzKSA9PiBfdGhyb3coKTsKfQovAE5OPAEaASUBThVCNigZRQQBQBcBIAFGKj1EJA5IUD8fNTc1ASExHCs5NjY5AgEycGFja2FnZTpjb2xsZWN0aW9uL3NyYy9lbXB0eV91bm1vZGlmaWFibGVfc2V0LmRhcnQ2c2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL3Rlc3RpbmcvaWRfdGVzdGluZy5kYXJ0wABcIS8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6aW8nOwppbXBvcnQgJ2Fubm90YXRlZF9jb2RlX2hlbHBlci5kYXJ0JzsKaW1wb3J0ICdpZC5kYXJ0JzsKaW1wb3J0ICcuLi9mYXN0YS9jb2xvcnMuZGFydCcgYXMgY29sb3JzOwoKY29uc3QgU3RyaW5nIGNmZU1hcmtlciA9ICdjZmUnOwpjb25zdCBTdHJpbmcgZGFydDJqc01hcmtlciA9ICdkYXJ0MmpzJzsKY29uc3QgU3RyaW5nIGFuYWx5emVyTWFya2VyID0gJ2FuYWx5emVyJzsKCi8vLyBNYXJrZXJzIHVzZWQgaW4gYW5ub3RhdGVkIHRlc3RzIHNoYXJkIGJ5IENGRSwgYW5hbHl6ZXIgYW5kIGRhcnQyanMuCmNvbnN0IExpc3Q8U3RyaW5nPiBzaGFyZWRNYXJrZXJzID0gWwogIGNmZU1hcmtlciwKICBkYXJ0MmpzTWFya2VyLAogIGFuYWx5emVyTWFya2VyLApdOwoKLy8vIGB0cnVlYCBpZiBBTlNJIGNvbG9ycyBhcmUgc3VwcG9ydGVkIGJ5IHN0ZG91dC4KYm9vbCB1c2VDb2xvcnMgPSBzdGRvdXQuc3VwcG9ydHNBbnNpRXNjYXBlczsKCi8vLyBDb2xvcml6ZSBhIG1lc3NhZ2UgW3RleHRdLCBpZiBBTlNJIGNvbG9ycyBhcmUgc3VwcG9ydGVkLgpTdHJpbmcgY29sb3JpemVNZXNzYWdlKFN0cmluZyB0ZXh0KSB7CiAgaWYgKHVzZUNvbG9ycykgewogICAgcmV0dXJuICcke2NvbG9ycy5ZRUxMT1dfQ09MT1J9JHt0ZXh0fSR7Y29sb3JzLkRFRkFVTFRfQ09MT1J9JzsKICB9IGVsc2UgewogICAgcmV0dXJuIHRleHQ7CiAgfQp9CgovLy8gQ29sb3JpemUgYSBtYXRjaGluZyBhbm5vdGF0aW9uIFt0ZXh0XSwgaWYgQU5TSSBjb2xvcnMgYXJlIHN1cHBvcnRlZC4KU3RyaW5nIGNvbG9yaXplTWF0Y2goU3RyaW5nIHRleHQpIHsKICBpZiAodXNlQ29sb3JzKSB7CiAgICByZXR1cm4gJyR7Y29sb3JzLkJMVUVfQ09MT1J9JHt0ZXh0fSR7Y29sb3JzLkRFRkFVTFRfQ09MT1J9JzsKICB9IGVsc2UgewogICAgcmV0dXJuIHRleHQ7CiAgfQp9CgovLy8gQ29sb3JpemUgYSBzaW5nbGUgYW5ub3RhdGlvbiBbdGV4dF0sIGlmIEFOU0kgY29sb3JzIGFyZSBzdXBwb3J0ZWQuClN0cmluZyBjb2xvcml6ZVNpbmdsZShTdHJpbmcgdGV4dCkgewogIGlmICh1c2VDb2xvcnMpIHsKICAgIHJldHVybiAnJHtjb2xvcnMuR1JFRU5fQ09MT1J9JHt0ZXh0fSR7Y29sb3JzLkRFRkFVTFRfQ09MT1J9JzsKICB9IGVsc2UgewogICAgcmV0dXJuIHRleHQ7CiAgfQp9CgovLy8gQ29sb3JpemUgdGhlIGFjdHVhbCBhbm5vdGF0aW9uIFt0ZXh0XSwgaWYgQU5TSSBjb2xvcnMgYXJlIHN1cHBvcnRlZC4KU3RyaW5nIGNvbG9yaXplQWN0dWFsKFN0cmluZyB0ZXh0KSB7CiAgaWYgKHVzZUNvbG9ycykgewogICAgcmV0dXJuICcke2NvbG9ycy5SRURfQ09MT1J9JHt0ZXh0fSR7Y29sb3JzLkRFRkFVTFRfQ09MT1J9JzsKICB9IGVsc2UgewogICAgcmV0dXJuIHRleHQ7CiAgfQp9CgovLy8gQ29sb3JpemUgYW4gZXhwZWN0ZWQgYW5ub3RhdGlvbiBbdGV4dF0sIGlmIEFOU0kgY29sb3JzIGFyZSBzdXBwb3J0ZWQuClN0cmluZyBjb2xvcml6ZUV4cGVjdGVkKFN0cmluZyB0ZXh0KSB7CiAgaWYgKHVzZUNvbG9ycykgewogICAgcmV0dXJuICcke2NvbG9ycy5HUkVFTl9DT0xPUn0ke3RleHR9JHtjb2xvcnMuREVGQVVMVF9DT0xPUn0nOwogIH0gZWxzZSB7CiAgICByZXR1cm4gdGV4dDsKICB9Cn0KCi8vLyBDb2xvcml6ZSBkZWxpbWl0ZXIgW3RleHRdLCBpZiBBTlNJIGNvbG9ycyBhcmUgc3VwcG9ydGVkLgpTdHJpbmcgY29sb3JpemVEZWxpbWl0ZXIoU3RyaW5nIHRleHQpIHsKICBpZiAodXNlQ29sb3JzKSB7CiAgICByZXR1cm4gJyR7Y29sb3JzLllFTExPV19DT0xPUn0ke3RleHR9JHtjb2xvcnMuREVGQVVMVF9DT0xPUn0nOwogIH0gZWxzZSB7CiAgICByZXR1cm4gdGV4dDsKICB9Cn0KCi8vLyBDb2xvcml6ZSBkaWZmcyBbZXhwZWN0ZWRdIGFuZCBbYWN0dWFsXSBhbmQgW2RlbGltaXRlcl0sIGlmIEFOU0kgY29sb3JzIGFyZQovLy8gc3VwcG9ydGVkLgpTdHJpbmcgY29sb3JpemVEaWZmKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIGRlbGltaXRlciwgU3RyaW5nIGFjdHVhbCkgewogIHJldHVybiAnJHtjb2xvcml6ZUV4cGVjdGVkKGV4cGVjdGVkKX0nCiAgICAgICcke2NvbG9yaXplRGVsaW1pdGVyKGRlbGltaXRlcil9JHtjb2xvcml6ZUFjdHVhbChhY3R1YWwpfSc7Cn0KCi8vLyBDb2xvcml6ZSBhbm5vdGF0aW9uIGRlbGltaXRlcnMgW3N0YXJ0XSBhbmQgW2VuZF0gc3Vycm91bmRpbmcgW3RleHRdLCBpZgovLy8gQU5TSSBjb2xvcnMgYXJlIHN1cHBvcnRlZC4KU3RyaW5nIGNvbG9yaXplQW5ub3RhdGlvbihTdHJpbmcgc3RhcnQsIFN0cmluZyB0ZXh0LCBTdHJpbmcgZW5kKSB7CiAgcmV0dXJuICcke2NvbG9yaXplRGVsaW1pdGVyKHN0YXJ0KX0kdGV4dCR7Y29sb3JpemVEZWxpbWl0ZXIoZW5kKX0nOwp9CgovLy8gRW5jYXBzdWxhdGVzIHRoZSBtZW1iZXIgZGF0YSBjb21wdXRlZCBmb3IgZWFjaCBzb3VyY2UgZmlsZSBvZiBpbnRlcmVzdC4KLy8vIEl0J3MgYSBnbG9yaWZpZWQgd3JhcHBlciBhcm91bmQgYSBtYXAgb2YgbWFwcywgYnV0IHdyaXR0ZW4gdGhpcyB3YXkgdG8KLy8vIHByb3ZpZGUgYSBsaXR0bGUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGl0J3MgZG9pbmcuIFtEYXRhVHlwZV0gcmVmZXJzCi8vLyB0byB0aGUgdHlwZSB0aGlzIG1hcCBpcyBob2xkaW5nIC0tIGl0IGlzIGVpdGhlciBbSWRWYWx1ZV0gb3IgW0FjdHVhbERhdGFdLgpjbGFzcyBNZW1iZXJBbm5vdGF0aW9uczxEYXRhVHlwZT4gewogIC8vLyBGb3IgZWFjaCBVcmksIHdlIGNyZWF0ZSBhIG1hcCBhc3NvY2lhdGluZyBhbiBlbGVtZW50IGlkIHdpdGggaXRzCiAgLy8vIGNvcnJlc3BvbmRpbmcgYW5ub3RhdGlvbnMuCiAgZmluYWwgTWFwPFVyaSwgTWFwPElkLCBEYXRhVHlwZT4+IF9jb21wdXRlZERhdGFGb3JFYWNoRmlsZSA9CiAgICAgIG5ldyBNYXA8VXJpLCBNYXA8SWQsIERhdGFUeXBlPj4oKTsKCiAgLy8vIE1lbWJlciBvciBjbGFzcyBhbm5vdGF0aW9ucyB0aGF0IGRvbid0IHJlZmVyIHRvIGFueSBvZiB0aGUgdXNlciBmaWxlcy4KICBmaW5hbCBNYXA8SWQsIERhdGFUeXBlPiBnbG9iYWxEYXRhID0gPElkLCBEYXRhVHlwZT57fTsKCiAgdm9pZCBvcGVyYXRvciBbXT0oVXJpIGZpbGUsIE1hcDxJZCwgRGF0YVR5cGU+IGNvbXB1dGVkRGF0YSkgewogICAgX2NvbXB1dGVkRGF0YUZvckVhY2hGaWxlW2ZpbGVdID0gY29tcHV0ZWREYXRhOwogIH0KCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihVcmkgZmlsZSwgTWFwPElkLCBEYXRhVHlwZT4gY29tcHV0ZWREYXRhKSkgewogICAgX2NvbXB1dGVkRGF0YUZvckVhY2hGaWxlLmZvckVhY2goZik7CiAgfQoKICBNYXA8SWQsIERhdGFUeXBlPiBvcGVyYXRvciBbXShVcmkgZmlsZSkgewogICAgaWYgKCFfY29tcHV0ZWREYXRhRm9yRWFjaEZpbGUuY29udGFpbnNLZXkoZmlsZSkpIHsKICAgICAgX2NvbXB1dGVkRGF0YUZvckVhY2hGaWxlW2ZpbGVdID0gPElkLCBEYXRhVHlwZT57fTsKICAgIH0KICAgIHJldHVybiBfY29tcHV0ZWREYXRhRm9yRWFjaEZpbGVbZmlsZV07CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnTWVtYmVyQW5ub3RhdGlvbnMoJyk7CiAgICBTdHJpbmcgY29tbWEgPSAnJzsKICAgIGlmIChfY29tcHV0ZWREYXRhRm9yRWFjaEZpbGUuaXNOb3RFbXB0eSAmJgogICAgICAgIChfY29tcHV0ZWREYXRhRm9yRWFjaEZpbGUubGVuZ3RoID4gMSB8fAogICAgICAgICAgICBfY29tcHV0ZWREYXRhRm9yRWFjaEZpbGUudmFsdWVzLnNpbmdsZS5pc05vdEVtcHR5KSkgewogICAgICBzYi53cml0ZSgnZGF0YTp7Jyk7CiAgICAgIF9jb21wdXRlZERhdGFGb3JFYWNoRmlsZS5mb3JFYWNoKChVcmkgdXJpLCBNYXA8SWQsIERhdGFUeXBlPiBkYXRhKSB7CiAgICAgICAgc2Iud3JpdGUoY29tbWEpOwogICAgICAgIHNiLndyaXRlKCckdXJpOicpOwogICAgICAgIHNiLndyaXRlKGRhdGEpOwogICAgICAgIGNvbW1hID0gJywnOwogICAgICB9KTsKICAgICAgc2Iud3JpdGUoJ30nKTsKICAgIH0KICAgIGlmIChnbG9iYWxEYXRhLmlzTm90RW1wdHkpIHsKICAgICAgc2Iud3JpdGUoY29tbWEpOwogICAgICBzYi53cml0ZSgnZ2xvYmFsOicpOwogICAgICBzYi53cml0ZShnbG9iYWxEYXRhKTsKICAgIH0KICAgIHNiLndyaXRlKCcpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBDb21wdXRlIGEgW01lbWJlckFubm90YXRpb25zXSBvYmplY3QgZnJvbSBbY29kZV0gZm9yIGVhY2ggbWFya2VyIGluIFttYXBzXQovLy8gc3BlY2lmeWluZyB0aGUgZXhwZWN0ZWQgYW5ub3RhdGlvbnMuCi8vLwovLy8gSWYgYW4gYW5ub3RhdGlvbiBzdGFydHMgd2l0aCBhIG1hcmtlciwgaXQgaXMgb25seSBleHBlY3RlZCBmb3IgdGhlCi8vLyBjb3JyZXNwb25kaW5nIHRlc3QgY29uZmlndXJhdGlvbi4gT3RoZXJ3aXNlIGl0IGlzIGV4cGVjdGVkIGZvciBhbGwKLy8vIGNvbmZpZ3VyYXRpb25zLgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IGFuIGVtcHR5IG1hcmtlciBzZXQuCnZvaWQgY29tcHV0ZUV4cGVjdGVkTWFwKFVyaSBzb3VyY2VVcmksIFN0cmluZyBmaWxlbmFtZSwgQW5ub3RhdGVkQ29kZSBjb2RlLAogICAgTWFwPFN0cmluZywgTWVtYmVyQW5ub3RhdGlvbnM8SWRWYWx1ZT4+IG1hcHMsCiAgICB7dm9pZCBvbkZhaWx1cmUoU3RyaW5nIG1lc3NhZ2UpfSkgewogIExpc3Q8U3RyaW5nPiBtYXBLZXlzID0gbWFwcy5rZXlzLnRvTGlzdCgpOwogIE1hcDxTdHJpbmcsIEFubm90YXRlZENvZGU+IHNwbGl0ID0gc3BsaXRCeVByZWZpeGVzKGNvZGUsIG1hcEtleXMpOwoKICBzcGxpdC5mb3JFYWNoKChTdHJpbmcgbWFya2VyLCBBbm5vdGF0ZWRDb2RlIGNvZGUpIHsKICAgIE1lbWJlckFubm90YXRpb25zPElkVmFsdWU+IGZpbGVBbm5vdGF0aW9ucyA9IG1hcHNbbWFya2VyXTsKICAgIGFzc2VydChmaWxlQW5ub3RhdGlvbnMgIT0gbnVsbCwgIk5vIGFubm90YXRpb25zIGZvciAkbWFya2VyIGluICRtYXBzIik7CiAgICBNYXA8SWQsIElkVmFsdWU+IGV4cGVjdGVkVmFsdWVzID0gZmlsZUFubm90YXRpb25zW3NvdXJjZVVyaV07CiAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiBpbiBjb2RlLmFubm90YXRpb25zKSB7CiAgICAgIFN0cmluZyB0ZXh0ID0gYW5ub3RhdGlvbi50ZXh0OwogICAgICBJZFZhbHVlIGlkVmFsdWUgPSBJZFZhbHVlLmRlY29kZShzb3VyY2VVcmksIGFubm90YXRpb24ub2Zmc2V0LCB0ZXh0KTsKICAgICAgaWYgKGlkVmFsdWUuaWQuaXNHbG9iYWwpIHsKICAgICAgICBpZiAoZmlsZUFubm90YXRpb25zLmdsb2JhbERhdGEuY29udGFpbnNLZXkoaWRWYWx1ZS5pZCkpIHsKICAgICAgICAgIG9uRmFpbHVyZSgiRXJyb3IgaW4gdGVzdCAnJGZpbGVuYW1lJzogIgogICAgICAgICAgICAgICJEdXBsaWNhdGUgYW5ub3RhdGlvbnMgZm9yICR7aWRWYWx1ZS5pZH0gaW4gJG1hcmtlcjogIgogICAgICAgICAgICAgICIke2lkVmFsdWV9IGFuZCAke2ZpbGVBbm5vdGF0aW9ucy5nbG9iYWxEYXRhW2lkVmFsdWUuaWRdfS4iKTsKICAgICAgICB9CiAgICAgICAgZmlsZUFubm90YXRpb25zLmdsb2JhbERhdGFbaWRWYWx1ZS5pZF0gPSBpZFZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChleHBlY3RlZFZhbHVlcy5jb250YWluc0tleShpZFZhbHVlLmlkKSkgewogICAgICAgICAgb25GYWlsdXJlKCJFcnJvciBpbiB0ZXN0ICckZmlsZW5hbWUnOiAiCiAgICAgICAgICAgICAgIkR1cGxpY2F0ZSBhbm5vdGF0aW9ucyBmb3IgJHtpZFZhbHVlLmlkfSBpbiAkbWFya2VyOiAiCiAgICAgICAgICAgICAgIiR7aWRWYWx1ZX0gYW5kICR7ZXhwZWN0ZWRWYWx1ZXNbaWRWYWx1ZS5pZF19LiIpOwogICAgICAgIH0KICAgICAgICBleHBlY3RlZFZhbHVlc1tpZFZhbHVlLmlkXSA9IGlkVmFsdWU7CiAgICAgIH0KICAgIH0KICB9KTsKfQoKLy8vIENyZWF0ZXMgYSBbVGVzdERhdGFdIG9iamVjdCBmb3IgdGhlIGFubm90YXRlZCB0ZXN0IGluIFt0ZXN0RmlsZV0uCi8vLwovLy8gSWYgW3Rlc3RGaWxlXSBpcyBhIGZpbGUsIHVzZSB0aGF0IGRpcmVjdGx5LiBJZiBpdCdzIGEgZGlyZWN0b3J5IGluY2x1ZGUKLy8vIGV2ZXJ5dGhpbmcgaW4gdGhhdCBkaXJlY3RvcnkuCi8vLwovLy8gSWYgW3Rlc3RMaWJEaXJlY3RvcnldIGlzIG5vdCBgbnVsbGAsIGZpbGVzIGluIFt0ZXN0TGliRGlyZWN0b3J5XSB3aXRoIHRoZQovLy8gW3Rlc3RGaWxlXSBuYW1lIGFzIGEgcHJlZml4IGFyZSBpbmNsdWRlZC4KVGVzdERhdGEgY29tcHV0ZVRlc3REYXRhKEZpbGVTeXN0ZW1FbnRpdHkgdGVzdEZpbGUsIERpcmVjdG9yeSB0ZXN0TGliRGlyZWN0b3J5LAogICAge0l0ZXJhYmxlPFN0cmluZz4gc3VwcG9ydGVkTWFya2VycywKICAgIFVyaSBjcmVhdGVVcmlGb3JGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUsIHtib29sIGlzTGlifSksCiAgICB2b2lkIG9uRmFpbHVyZShTdHJpbmcgbWVzc2FnZSl9KSB7CiAgVXJpIGVudHJ5UG9pbnQgPSBjcmVhdGVVcmlGb3JGaWxlTmFtZSgnbWFpbi5kYXJ0JywgaXNMaWI6IGZhbHNlKTsKCiAgRmlsZSBtYWluVGVzdEZpbGU7CiAgTWFwPFN0cmluZywgRmlsZT4gYWRkaXRpb25hbEZpbGVzOwogIGlmICh0ZXN0RmlsZSBpcyBGaWxlKSB7CiAgICBtYWluVGVzdEZpbGUgPSB0ZXN0RmlsZTsKICB9IGVsc2UgaWYgKHRlc3RGaWxlIGlzIERpcmVjdG9yeSkgewogICAgYWRkaXRpb25hbEZpbGVzID0gbmV3IE1hcDxTdHJpbmcsIEZpbGU+KCk7CiAgICBmb3IgKEZpbGVTeXN0ZW1FbnRpdHkgZW50cnkgaW4gdGVzdEZpbGUubGlzdFN5bmMocmVjdXJzaXZlOiB0cnVlKSkgewogICAgICBpZiAoZW50cnkgaXMhIEZpbGUpIGNvbnRpbnVlOwogICAgICBpZiAoZW50cnkudXJpLnBhdGhTZWdtZW50cy5sYXN0ID09ICJtYWluLmRhcnQiKSB7CiAgICAgICAgbWFpblRlc3RGaWxlID0gZW50cnk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWRkaXRpb25hbEZpbGVzW2VudHJ5LnVyaS5wYXRoLnN1YnN0cmluZyh0ZXN0RmlsZS51cmkucGF0aC5sZW5ndGgpXSA9CiAgICAgICAgICAgIGVudHJ5OwogICAgICB9CiAgICB9CiAgfQoKICBTdHJpbmcgYW5ub3RhdGVkQ29kZSA9IG5ldyBGaWxlLmZyb21VcmkobWFpblRlc3RGaWxlLnVyaSkucmVhZEFzU3RyaW5nU3luYygpOwogIE1hcDxVcmksIEFubm90YXRlZENvZGU+IGNvZGUgPSB7CiAgICBlbnRyeVBvaW50OgogICAgICAgIG5ldyBBbm5vdGF0ZWRDb2RlLmZyb21UZXh0KGFubm90YXRlZENvZGUsIGNvbW1lbnRTdGFydCwgY29tbWVudEVuZCkKICB9OwogIE1hcDxTdHJpbmcsIE1lbWJlckFubm90YXRpb25zPElkVmFsdWU+PiBleHBlY3RlZE1hcHMgPSB7fTsKICBmb3IgKFN0cmluZyB0ZXN0TWFya2VyIGluIHN1cHBvcnRlZE1hcmtlcnMpIHsKICAgIGV4cGVjdGVkTWFwc1t0ZXN0TWFya2VyXSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uczxJZFZhbHVlPigpOwogIH0KICBjb21wdXRlRXhwZWN0ZWRNYXAoZW50cnlQb2ludCwgdGVzdEZpbGUudXJpLnBhdGhTZWdtZW50cy5sYXN0LAogICAgICBjb2RlW2VudHJ5UG9pbnRdLCBleHBlY3RlZE1hcHMsCiAgICAgIG9uRmFpbHVyZTogb25GYWlsdXJlKTsKICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1lbW9yeVNvdXJjZUZpbGVzID0gewogICAgZW50cnlQb2ludC5wYXRoOiBjb2RlW2VudHJ5UG9pbnRdLnNvdXJjZUNvZGUKICB9OwoKICBMaXN0PFN0cmluZz4gbGliRmlsZU5hbWVzOwoKICBhZGRTdXBwb3J0aW5nRmlsZShTdHJpbmcgbGliRmlsZU5hbWUsIEZpbGUgbGliRW50aXR5LCBib29sIGlzTGliKSB7CiAgICBsaWJGaWxlTmFtZXMgPz89IFtdOwogICAgbGliRmlsZU5hbWVzLmFkZChsaWJGaWxlTmFtZSk7CiAgICBVcmkgbGliRmlsZVVyaSA9IGNyZWF0ZVVyaUZvckZpbGVOYW1lKGxpYkZpbGVOYW1lLCBpc0xpYjogaXNMaWIpOwogICAgU3RyaW5nIGxpYkNvZGUgPSBsaWJFbnRpdHkucmVhZEFzU3RyaW5nU3luYygpOwogICAgQW5ub3RhdGVkQ29kZSBhbm5vdGF0ZWRMaWJDb2RlID0KICAgICAgICBuZXcgQW5ub3RhdGVkQ29kZS5mcm9tVGV4dChsaWJDb2RlLCBjb21tZW50U3RhcnQsIGNvbW1lbnRFbmQpOwogICAgbWVtb3J5U291cmNlRmlsZXNbbGliRmlsZVVyaS5wYXRoXSA9IGFubm90YXRlZExpYkNvZGUuc291cmNlQ29kZTsKICAgIGNvZGVbbGliRmlsZVVyaV0gPSBhbm5vdGF0ZWRMaWJDb2RlOwogICAgY29tcHV0ZUV4cGVjdGVkTWFwKGxpYkZpbGVVcmksIGxpYkZpbGVOYW1lLCBhbm5vdGF0ZWRMaWJDb2RlLCBleHBlY3RlZE1hcHMsCiAgICAgICAgb25GYWlsdXJlOiBvbkZhaWx1cmUpOwogIH0KCiAgaWYgKHRlc3RMaWJEaXJlY3RvcnkgIT0gbnVsbCkgewogICAgU3RyaW5nIG5hbWUgPSB0ZXN0RmlsZS51cmkucGF0aFNlZ21lbnRzLmxhc3Q7CiAgICBTdHJpbmcgZmlsZVByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoJy4nKSk7CiAgICBmb3IgKEZpbGVTeXN0ZW1FbnRpdHkgbGliRW50aXR5IGluIHRlc3RMaWJEaXJlY3RvcnkubGlzdFN5bmMoKSkgewogICAgICBTdHJpbmcgbGliRmlsZU5hbWUgPSBsaWJFbnRpdHkudXJpLnBhdGhTZWdtZW50cy5sYXN0OwogICAgICBpZiAobGliRmlsZU5hbWUuc3RhcnRzV2l0aChmaWxlUHJlZml4KSkgewogICAgICAgIGFkZFN1cHBvcnRpbmdGaWxlKGxpYkZpbGVOYW1lLCBsaWJFbnRpdHksIHRydWUpOwogICAgICB9CiAgICB9CiAgfQogIGlmIChhZGRpdGlvbmFsRmlsZXMgIT0gbnVsbCkgewogICAgZm9yIChNYXBFbnRyeTxTdHJpbmcsIEZpbGU+IGFkZGl0aW9uYWxGaWxlRGF0YSBpbiBhZGRpdGlvbmFsRmlsZXMuZW50cmllcykgewogICAgICBhZGRTdXBwb3J0aW5nRmlsZSgKICAgICAgICAgIGFkZGl0aW9uYWxGaWxlRGF0YS5rZXksIGFkZGl0aW9uYWxGaWxlRGF0YS52YWx1ZSwgZmFsc2UpOwogICAgfQogIH0KCiAgcmV0dXJuIG5ldyBUZXN0RGF0YSh0ZXN0RmlsZS51cmksIGVudHJ5UG9pbnQsIG1lbW9yeVNvdXJjZUZpbGVzLCBjb2RlLAogICAgICBleHBlY3RlZE1hcHMsIGxpYkZpbGVOYW1lcyk7Cn0KCi8vLyBEYXRhIGZvciBhbiBhbm5vdGF0ZWQgdGVzdC4KY2xhc3MgVGVzdERhdGEgewogIGZpbmFsIFVyaSB0ZXN0RmlsZVVyaTsKICBmaW5hbCBVcmkgZW50cnlQb2ludDsKICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1lbW9yeVNvdXJjZUZpbGVzOwogIGZpbmFsIE1hcDxVcmksIEFubm90YXRlZENvZGU+IGNvZGU7CiAgZmluYWwgTWFwPFN0cmluZywgTWVtYmVyQW5ub3RhdGlvbnM8SWRWYWx1ZT4+IGV4cGVjdGVkTWFwczsKICBmaW5hbCBMaXN0PFN0cmluZz4gbGliRmlsZU5hbWVzOwoKICBUZXN0RGF0YSh0aGlzLnRlc3RGaWxlVXJpLCB0aGlzLmVudHJ5UG9pbnQsIHRoaXMubWVtb3J5U291cmNlRmlsZXMsIHRoaXMuY29kZSwKICAgICAgdGhpcy5leHBlY3RlZE1hcHMsIHRoaXMubGliRmlsZU5hbWVzKTsKCiAgU3RyaW5nIGdldCBuYW1lID0+IHRlc3RGaWxlVXJpLnBhdGhTZWdtZW50cy5sYXN0Owp9CgovLy8gVGhlIGFjdHVhbCByZXN1bHQgY29tcHV0ZWQgZm9yIGFuIGFubm90YXRlZCB0ZXN0LgphYnN0cmFjdCBjbGFzcyBDb21waWxlZERhdGE8VD4gewogIGZpbmFsIFVyaSBtYWluVXJpOwoKICAvLy8gRm9yIGVhY2ggVXJpLCBhIG1hcCBhc3NvY2lhdGluZyBhbiBlbGVtZW50IGlkIHdpdGggdGhlIGluc3RydW1lbnRhdGlvbgogIC8vLyBkYXRhIHdlJ3ZlIGNvbGxlY3RlZCBmb3IgaXQuCiAgZmluYWwgTWFwPFVyaSwgTWFwPElkLCBBY3R1YWxEYXRhPFQ+Pj4gYWN0dWFsTWFwczsKCiAgLy8vIENvbGxlY3RlZCBpbnN0cnVtZW50YXRpb24gZGF0YSB0aGF0IGRvZXNuJ3QgcmVmZXIgdG8gYW55IG9mIHRoZSB1c2VyCiAgLy8vIGZpbGVzLiAgKEUuZy4gaW5mb3JtYXRpb24gdGhlIHRlc3QgaGFzIGNvbGxlY3RlZCBhYm91dCBmaWxlcyBpbgogIC8vLyBgZGFydDpjb3JlYCkuCiAgZmluYWwgTWFwPElkLCBBY3R1YWxEYXRhPFQ+PiBnbG9iYWxEYXRhOwoKICBDb21waWxlZERhdGEodGhpcy5tYWluVXJpLCB0aGlzLmFjdHVhbE1hcHMsIHRoaXMuZ2xvYmFsRGF0YSk7CgogIE1hcDxpbnQsIExpc3Q8U3RyaW5nPj4gY29tcHV0ZUFubm90YXRpb25zKFVyaSB1cmkpIHsKICAgIE1hcDxJZCwgQWN0dWFsRGF0YTxUPj4gYWN0dWFsTWFwID0gYWN0dWFsTWFwc1t1cmldOwogICAgTWFwPGludCwgTGlzdDxTdHJpbmc+PiBhbm5vdGF0aW9ucyA9IDxpbnQsIExpc3Q8U3RyaW5nPj57fTsKICAgIGFjdHVhbE1hcC5mb3JFYWNoKChJZCBpZCwgQWN0dWFsRGF0YTxUPiBkYXRhKSB7CiAgICAgIFN0cmluZyB2YWx1ZTEgPSAnJHtkYXRhLnZhbHVlfSc7CiAgICAgIGFubm90YXRpb25zCiAgICAgICAgICAucHV0SWZBYnNlbnQoZGF0YS5vZmZzZXQsICgpID0+IFtdKQogICAgICAgICAgLmFkZChjb2xvcml6ZUFjdHVhbCh2YWx1ZTEpKTsKICAgIH0pOwogICAgcmV0dXJuIGFubm90YXRpb25zOwogIH0KCiAgTWFwPGludCwgTGlzdDxTdHJpbmc+PiBjb21wdXRlRGlmZkFubm90YXRpb25zQWdhaW5zdCgKICAgICAgTWFwPElkLCBBY3R1YWxEYXRhPFQ+PiB0aGlzTWFwLCBNYXA8SWQsIEFjdHVhbERhdGE8VD4+IG90aGVyTWFwLCBVcmkgdXJpLAogICAgICB7Ym9vbCBpbmNsdWRlTWF0Y2hlczogZmFsc2V9KSB7CiAgICBNYXA8aW50LCBMaXN0PFN0cmluZz4+IGFubm90YXRpb25zID0gPGludCwgTGlzdDxTdHJpbmc+Pnt9OwogICAgdGhpc01hcC5mb3JFYWNoKChJZCBpZCwgQWN0dWFsRGF0YTxUPiB0aGlzRGF0YSkgewogICAgICBBY3R1YWxEYXRhPFQ+IG90aGVyRGF0YSA9IG90aGVyTWFwW2lkXTsKICAgICAgU3RyaW5nIHRoaXNWYWx1ZSA9ICcke3RoaXNEYXRhLnZhbHVlfSc7CiAgICAgIGlmICh0aGlzRGF0YS52YWx1ZSAhPSBvdGhlckRhdGE/LnZhbHVlKSB7CiAgICAgICAgU3RyaW5nIG90aGVyVmFsdWUgPSAnJHtvdGhlckRhdGE/LnZhbHVlID8/ICctLS0nfSc7CiAgICAgICAgYW5ub3RhdGlvbnMKICAgICAgICAgICAgLnB1dElmQWJzZW50KHRoaXNEYXRhLm9mZnNldCwgKCkgPT4gW10pCiAgICAgICAgICAgIC5hZGQoY29sb3JpemVEaWZmKHRoaXNWYWx1ZSwgJyB8ICcsIG90aGVyVmFsdWUpKTsKICAgICAgfSBlbHNlIGlmIChpbmNsdWRlTWF0Y2hlcykgewogICAgICAgIGFubm90YXRpb25zCiAgICAgICAgICAgIC5wdXRJZkFic2VudCh0aGlzRGF0YS5vZmZzZXQsICgpID0+IFtdKQogICAgICAgICAgICAuYWRkKGNvbG9yaXplTWF0Y2godGhpc1ZhbHVlKSk7CiAgICAgIH0KICAgIH0pOwogICAgb3RoZXJNYXAuZm9yRWFjaCgoSWQgaWQsIEFjdHVhbERhdGE8VD4gb3RoZXJEYXRhKSB7CiAgICAgIGlmICghdGhpc01hcC5jb250YWluc0tleShpZCkpIHsKICAgICAgICBTdHJpbmcgdGhpc1ZhbHVlID0gJy0tLSc7CiAgICAgICAgU3RyaW5nIG90aGVyVmFsdWUgPSAnJHtvdGhlckRhdGEudmFsdWV9JzsKICAgICAgICBhbm5vdGF0aW9ucwogICAgICAgICAgICAucHV0SWZBYnNlbnQob3RoZXJEYXRhLm9mZnNldCwgKCkgPT4gW10pCiAgICAgICAgICAgIC5hZGQoY29sb3JpemVEaWZmKHRoaXNWYWx1ZSwgJyB8ICcsIG90aGVyVmFsdWUpKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gYW5ub3RhdGlvbnM7CiAgfQoKICBpbnQgZ2V0T2Zmc2V0RnJvbUlkKElkIGlkLCBVcmkgdXJpKTsKCiAgdm9pZCByZXBvcnRFcnJvcihVcmkgdXJpLCBpbnQgb2Zmc2V0LCBTdHJpbmcgbWVzc2FnZSwge2Jvb2wgc3VjY2luY3Q6IGZhbHNlfSk7Cn0KCi8vLyBJbnRlcmZhY2UgdXNlZCBmb3IgaW50ZXJwcmV0aW5nIGFubm90YXRpb25zLgphYnN0cmFjdCBjbGFzcyBEYXRhSW50ZXJwcmV0ZXI8VD4gewogIC8vLyBSZXR1cm5zIGBudWxsYCBpZiBbYWN0dWFsRGF0YV0gc2F0aXNmaWVzIHRoZSBbZXhwZWN0ZWREYXRhXSBhbm5vdGF0aW9uLgogIC8vLyBPdGhlcndpc2UsIGEgbWVzc2FnZSBpcyByZXR1cm5lZCBjb250YWluIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKICAvLy8gcHJvYmxlbXMgZm91bmQuCiAgU3RyaW5nIGlzQXNFeHBlY3RlZChUIGFjdHVhbERhdGEsIFN0cmluZyBleHBlY3RlZERhdGEpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW2FjdHVhbERhdGFdIGNvcnJlc3BvbmRzIHRvIGVtcHR5IGRhdGEuCiAgYm9vbCBpc0VtcHR5KFQgYWN0dWFsRGF0YSk7CgogIC8vLyBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBbYWN0dWFsRGF0YV0uCiAgU3RyaW5nIGdldFRleHQoVCBhY3R1YWxEYXRhKTsKfQoKLy8vIERlZmF1bHQgZGF0YSBpbnRlcnByZXRlciBmb3Igc3RyaW5nIGRhdGEuCmNsYXNzIFN0cmluZ0RhdGFJbnRlcnByZXRlciBpbXBsZW1lbnRzIERhdGFJbnRlcnByZXRlcjxTdHJpbmc+IHsKICBjb25zdCBTdHJpbmdEYXRhSW50ZXJwcmV0ZXIoKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGlzQXNFeHBlY3RlZChTdHJpbmcgYWN0dWFsRGF0YSwgU3RyaW5nIGV4cGVjdGVkRGF0YSkgewogICAgYWN0dWFsRGF0YSA/Pz0gJyc7CiAgICBleHBlY3RlZERhdGEgPz89ICcnOwogICAgaWYgKGFjdHVhbERhdGEgIT0gZXhwZWN0ZWREYXRhKSB7CiAgICAgIHJldHVybiAiRXhwZWN0ZWQgJGV4cGVjdGVkRGF0YSwgZm91bmQgJGFjdHVhbERhdGEiOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzRW1wdHkoU3RyaW5nIGFjdHVhbERhdGEpIHsKICAgIHJldHVybiBhY3R1YWxEYXRhID09ICcnOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldFRleHQoU3RyaW5nIGFjdHVhbERhdGEpIHsKICAgIHJldHVybiBhY3R1YWxEYXRhOwogIH0KfQoKU3RyaW5nIHdpdGhBbm5vdGF0aW9ucyhTdHJpbmcgc291cmNlQ29kZSwgTWFwPGludCwgTGlzdDxTdHJpbmc+PiBhbm5vdGF0aW9ucykgewogIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBpbnQgZW5kID0gMDsKICBmb3IgKGludCBvZmZzZXQgaW4gYW5ub3RhdGlvbnMua2V5cy50b0xpc3QoKS4uc29ydCgpKSB7CiAgICBpZiAob2Zmc2V0ID49IHNvdXJjZUNvZGUubGVuZ3RoKSB7CiAgICAgIHNiLndyaXRlKCcuLi4nKTsKICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICB9CiAgICBpZiAob2Zmc2V0ID4gZW5kKSB7CiAgICAgIHNiLndyaXRlKHNvdXJjZUNvZGUuc3Vic3RyaW5nKGVuZCwgb2Zmc2V0KSk7CiAgICB9CiAgICBmb3IgKFN0cmluZyBhbm5vdGF0aW9uIGluIGFubm90YXRpb25zW29mZnNldF0pIHsKICAgICAgc2Iud3JpdGUoY29sb3JpemVBbm5vdGF0aW9uKCcvKicsIGFubm90YXRpb24sICcqLycpKTsKICAgIH0KICAgIGVuZCA9IG9mZnNldDsKICB9CiAgaWYgKGVuZCA8IHNvdXJjZUNvZGUubGVuZ3RoKSB7CiAgICBzYi53cml0ZShzb3VyY2VDb2RlLnN1YnN0cmluZyhlbmQpKTsKICB9CiAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Cn0KCi8vLyBDb21wdXRlZCBhbmQgZXhwZWN0ZWQgZGF0YSBmb3IgYW4gYW5ub3RhdGVkIHRlc3QuIFRoaXMgaXMgdXNlZCBmb3IgY2hlY2tpbmcKLy8vIGFuZCBkaXNwbGF5aW5nIHJlc3VsdHMgb2YgYW4gYW5ub3RhdGVkIHRlc3QuCmNsYXNzIElkRGF0YTxUPiB7CiAgZmluYWwgTWFwPFVyaSwgQW5ub3RhdGVkQ29kZT4gY29kZTsKICBmaW5hbCBNZW1iZXJBbm5vdGF0aW9uczxJZFZhbHVlPiBleHBlY3RlZE1hcHM7CiAgZmluYWwgQ29tcGlsZWREYXRhPFQ+IF9jb21waWxlZERhdGE7CiAgZmluYWwgTWVtYmVyQW5ub3RhdGlvbnM8QWN0dWFsRGF0YTxUPj4gX2FjdHVhbE1hcHMgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbnMoKTsKCiAgSWREYXRhKHRoaXMuY29kZSwgdGhpcy5leHBlY3RlZE1hcHMsIHRoaXMuX2NvbXBpbGVkRGF0YSkgewogICAgZm9yIChVcmkgdXJpIGluIGNvZGUua2V5cykgewogICAgICBfYWN0dWFsTWFwc1t1cmldID0gX2NvbXBpbGVkRGF0YS5hY3R1YWxNYXBzW3VyaV0gPz8gPElkLCBBY3R1YWxEYXRhPFQ+Pnt9OwogICAgfQogICAgX2FjdHVhbE1hcHMuZ2xvYmFsRGF0YS5hZGRBbGwoX2NvbXBpbGVkRGF0YS5nbG9iYWxEYXRhKTsKICB9CgogIFVyaSBnZXQgbWFpblVyaSA9PiBfY29tcGlsZWREYXRhLm1haW5Vcmk7CiAgTWVtYmVyQW5ub3RhdGlvbnM8QWN0dWFsRGF0YTxUPj4gZ2V0IGFjdHVhbE1hcHMgPT4gX2FjdHVhbE1hcHM7CgogIFN0cmluZyBhY3R1YWxDb2RlKFVyaSB1cmkpIHsKICAgIE1hcDxpbnQsIExpc3Q8U3RyaW5nPj4gYW5ub3RhdGlvbnMgPSA8aW50LCBMaXN0PFN0cmluZz4+e307CiAgICBhY3R1YWxNYXBzW3VyaV0uZm9yRWFjaCgoSWQgaWQsIEFjdHVhbERhdGE8VD4gZGF0YSkgewogICAgICBhbm5vdGF0aW9ucy5wdXRJZkFic2VudChkYXRhLm9mZnNldCwgKCkgPT4gW10pLmFkZCgnJHtkYXRhLnZhbHVlfScpOwogICAgfSk7CiAgICByZXR1cm4gd2l0aEFubm90YXRpb25zKGNvZGVbdXJpXS5zb3VyY2VDb2RlLCBhbm5vdGF0aW9ucyk7CiAgfQoKICBTdHJpbmcgZGlmZkNvZGUoVXJpIHVyaSwgRGF0YUludGVycHJldGVyPFQ+IGRhdGFWYWxpZGF0b3IpIHsKICAgIE1hcDxpbnQsIExpc3Q8U3RyaW5nPj4gYW5ub3RhdGlvbnMgPSA8aW50LCBMaXN0PFN0cmluZz4+e307CiAgICBhY3R1YWxNYXBzW3VyaV0uZm9yRWFjaCgoSWQgaWQsIEFjdHVhbERhdGE8VD4gZGF0YSkgewogICAgICBJZFZhbHVlIGV4cGVjdGVkVmFsdWUgPSBleHBlY3RlZE1hcHNbdXJpXVtpZF07CiAgICAgIFQgYWN0dWFsVmFsdWUgPSBkYXRhLnZhbHVlOwogICAgICBTdHJpbmcgdW5leHBlY3RlZE1lc3NhZ2UgPQogICAgICAgICAgZGF0YVZhbGlkYXRvci5pc0FzRXhwZWN0ZWQoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWU/LnZhbHVlKTsKICAgICAgaWYgKHVuZXhwZWN0ZWRNZXNzYWdlICE9IG51bGwpIHsKICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBleHBlY3RlZFZhbHVlPy50b1N0cmluZygpID8/ICcnOwogICAgICAgIFN0cmluZyBhY3R1YWwgPSBkYXRhVmFsaWRhdG9yLmdldFRleHQoYWN0dWFsVmFsdWUpOwogICAgICAgIGludCBvZmZzZXQgPSBnZXRPZmZzZXRGcm9tSWQoaWQsIHVyaSk7CiAgICAgICAgaWYgKG9mZnNldCAhPSBudWxsKSB7CiAgICAgICAgICBTdHJpbmcgdmFsdWUxID0gJyR7ZXhwZWN0ZWR9JzsKICAgICAgICAgIFN0cmluZyB2YWx1ZTIgPSBJZFZhbHVlLmlkVG9TdHJpbmcoaWQsICcke2FjdHVhbH0nKTsKICAgICAgICAgIGFubm90YXRpb25zCiAgICAgICAgICAgICAgLnB1dElmQWJzZW50KG9mZnNldCwgKCkgPT4gW10pCiAgICAgICAgICAgICAgLmFkZChjb2xvcml6ZURpZmYodmFsdWUxLCAnIHwgJywgdmFsdWUyKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIGV4cGVjdGVkTWFwc1t1cmldLmZvckVhY2goKElkIGlkLCBJZFZhbHVlIGV4cGVjdGVkKSB7CiAgICAgIGlmICghYWN0dWFsTWFwc1t1cmldLmNvbnRhaW5zS2V5KGlkKSkgewogICAgICAgIGludCBvZmZzZXQgPSBnZXRPZmZzZXRGcm9tSWQoaWQsIHVyaSk7CiAgICAgICAgaWYgKG9mZnNldCAhPSBudWxsKSB7CiAgICAgICAgICBTdHJpbmcgdmFsdWUxID0gJyR7ZXhwZWN0ZWR9JzsKICAgICAgICAgIFN0cmluZyB2YWx1ZTIgPSAnLS0tJzsKICAgICAgICAgIGFubm90YXRpb25zCiAgICAgICAgICAgICAgLnB1dElmQWJzZW50KG9mZnNldCwgKCkgPT4gW10pCiAgICAgICAgICAgICAgLmFkZChjb2xvcml6ZURpZmYodmFsdWUxLCAnIHwgJywgdmFsdWUyKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB3aXRoQW5ub3RhdGlvbnMoY29kZVt1cmldLnNvdXJjZUNvZGUsIGFubm90YXRpb25zKTsKICB9CgogIGludCBnZXRPZmZzZXRGcm9tSWQoSWQgaWQsIFVyaSB1cmkpIHsKICAgIHJldHVybiBfY29tcGlsZWREYXRhLmdldE9mZnNldEZyb21JZChpZCwgdXJpKTsKICB9Cn0KCi8vLyBDaGVja3MgW2NvbXBpbGVkRGF0YV0gYWdhaW5zdCB0aGUgZXhwZWN0ZWQgZGF0YSBpbiBbZXhwZWN0ZWRNYXBzXSBkZXJpdmVkCi8vLyBmcm9tIFtjb2RlXS4KRnV0dXJlPGJvb2w+IGNoZWNrQ29kZTxUPigKICAgIFN0cmluZyBtb2RlTmFtZSwKICAgIFVyaSBtYWluRmlsZVVyaSwKICAgIE1hcDxVcmksIEFubm90YXRlZENvZGU+IGNvZGUsCiAgICBNZW1iZXJBbm5vdGF0aW9uczxJZFZhbHVlPiBleHBlY3RlZE1hcHMsCiAgICBDb21waWxlZERhdGE8VD4gY29tcGlsZWREYXRhLAogICAgRGF0YUludGVycHJldGVyPFQ+IGRhdGFWYWxpZGF0b3IsCiAgICB7Ym9vbCBmaWx0ZXJBY3R1YWxEYXRhKElkVmFsdWUgZXhwZWN0ZWQsIEFjdHVhbERhdGE8VD4gYWN0dWFsRGF0YSksCiAgICBib29sIGZhdGFsRXJyb3JzOiB0cnVlLAogICAgYm9vbCBzdWNjaW5jdDogZmFsc2UsCiAgICB2b2lkIG9uRmFpbHVyZShTdHJpbmcgbWVzc2FnZSl9KSBhc3luYyB7CiAgSWREYXRhPFQ+IGRhdGEgPSBuZXcgSWREYXRhPFQ+KGNvZGUsIGV4cGVjdGVkTWFwcywgY29tcGlsZWREYXRhKTsKICBib29sIGhhc0ZhaWx1cmUgPSBmYWxzZTsKICBTZXQ8VXJpPiBuZWVkZWREaWZmcyA9IG5ldyBTZXQ8VXJpPigpOwoKICB2b2lkIGNoZWNrQWN0dWFsTWFwKAogICAgICBNYXA8SWQsIEFjdHVhbERhdGE8VD4+IGFjdHVhbE1hcCwgTWFwPElkLCBJZFZhbHVlPiBleHBlY3RlZE1hcCwKICAgICAgW1VyaSB1cmldKSB7CiAgICBib29sIGhhc0xvY2FsRmFpbHVyZSA9IGZhbHNlOwogICAgYWN0dWFsTWFwLmZvckVhY2goKElkIGlkLCBBY3R1YWxEYXRhPFQ+IGFjdHVhbERhdGEpIHsKICAgICAgVCBhY3R1YWwgPSBhY3R1YWxEYXRhLnZhbHVlOwogICAgICBTdHJpbmcgYWN0dWFsVGV4dCA9IGRhdGFWYWxpZGF0b3IuZ2V0VGV4dChhY3R1YWwpOwoKICAgICAgaWYgKCFleHBlY3RlZE1hcC5jb250YWluc0tleShpZCkpIHsKICAgICAgICBpZiAoIWRhdGFWYWxpZGF0b3IuaXNFbXB0eShhY3R1YWwpKSB7CiAgICAgICAgICBTdHJpbmcgYWN0dWFsVmFsdWVUZXh0ID0gSWRWYWx1ZS5pZFRvU3RyaW5nKGlkLCBhY3R1YWxUZXh0KTsKICAgICAgICAgIGNvbXBpbGVkRGF0YS5yZXBvcnRFcnJvcigKICAgICAgICAgICAgICBhY3R1YWxEYXRhLnVyaSwKICAgICAgICAgICAgICBhY3R1YWxEYXRhLm9mZnNldCwKICAgICAgICAgICAgICBzdWNjaW5jdAogICAgICAgICAgICAgICAgICA/ICdFWFRSQSAkbW9kZU5hbWUgREFUQSBmb3IgJHtpZC5kZXNjcmlwdG9yfScKICAgICAgICAgICAgICAgICAgOiAnRVhUUkEgJG1vZGVOYW1lIERBVEEgZm9yICR7aWQuZGVzY3JpcHRvcn06XG4gJwogICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCAgIDogJHthY3R1YWxEYXRhLm9iamVjdFRleHR9XG4gJwogICAgICAgICAgICAgICAgICAgICAgJ2FjdHVhbCAgIDogJHtjb2xvcml6ZUFjdHVhbChhY3R1YWxWYWx1ZVRleHQpfVxuICcKICAgICAgICAgICAgICAgICAgICAgICdEYXRhIHdhcyBleHBlY3RlZCBmb3IgdGhlc2UgaWRzOiAke2V4cGVjdGVkTWFwLmtleXN9JywKICAgICAgICAgICAgICBzdWNjaW5jdDogc3VjY2luY3QpOwogICAgICAgICAgaWYgKGZpbHRlckFjdHVhbERhdGEgPT0gbnVsbCB8fCBmaWx0ZXJBY3R1YWxEYXRhKG51bGwsIGFjdHVhbERhdGEpKSB7CiAgICAgICAgICAgIGhhc0xvY2FsRmFpbHVyZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIElkVmFsdWUgZXhwZWN0ZWQgPSBleHBlY3RlZE1hcFtpZF07CiAgICAgICAgU3RyaW5nIHVuZXhwZWN0ZWRNZXNzYWdlID0KICAgICAgICAgICAgZGF0YVZhbGlkYXRvci5pc0FzRXhwZWN0ZWQoYWN0dWFsLCBleHBlY3RlZC52YWx1ZSk7CiAgICAgICAgaWYgKHVuZXhwZWN0ZWRNZXNzYWdlICE9IG51bGwpIHsKICAgICAgICAgIFN0cmluZyBhY3R1YWxWYWx1ZVRleHQgPSBJZFZhbHVlLmlkVG9TdHJpbmcoaWQsIGFjdHVhbFRleHQpOwogICAgICAgICAgY29tcGlsZWREYXRhLnJlcG9ydEVycm9yKAogICAgICAgICAgICAgIGFjdHVhbERhdGEudXJpLAogICAgICAgICAgICAgIGFjdHVhbERhdGEub2Zmc2V0LAogICAgICAgICAgICAgIHN1Y2NpbmN0CiAgICAgICAgICAgICAgICAgID8gJ1VORVhQRUNURUQgJG1vZGVOYW1lIERBVEEgZm9yICR7aWQuZGVzY3JpcHRvcn0nCiAgICAgICAgICAgICAgICAgIDogJ1VORVhQRUNURUQgJG1vZGVOYW1lIERBVEEgZm9yICR7aWQuZGVzY3JpcHRvcn06XG4gJwogICAgICAgICAgICAgICAgICAgICAgJ2RldGFpbCAgOiAke2NvbG9yaXplTWVzc2FnZSh1bmV4cGVjdGVkTWVzc2FnZSl9XG4gJwogICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCAgOiAke2FjdHVhbERhdGEub2JqZWN0VGV4dH1cbiAnCiAgICAgICAgICAgICAgICAgICAgICAnZXhwZWN0ZWQ6ICR7Y29sb3JpemVFeHBlY3RlZCgnJGV4cGVjdGVkJyl9XG4gJwogICAgICAgICAgICAgICAgICAgICAgJ2FjdHVhbCAgOiAke2NvbG9yaXplQWN0dWFsKGFjdHVhbFZhbHVlVGV4dCl9JywKICAgICAgICAgICAgICBzdWNjaW5jdDogc3VjY2luY3QpOwogICAgICAgICAgaWYgKGZpbHRlckFjdHVhbERhdGEgPT0gbnVsbCB8fAogICAgICAgICAgICAgIGZpbHRlckFjdHVhbERhdGEoZXhwZWN0ZWQsIGFjdHVhbERhdGEpKSB7CiAgICAgICAgICAgIGhhc0xvY2FsRmFpbHVyZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIGlmIChoYXNMb2NhbEZhaWx1cmUpIHsKICAgICAgaGFzRmFpbHVyZSA9IHRydWU7CiAgICAgIGlmICh1cmkgIT0gbnVsbCkgewogICAgICAgIG5lZWRlZERpZmZzLmFkZCh1cmkpOwogICAgICB9CiAgICB9CiAgfQoKICBkYXRhLmFjdHVhbE1hcHMuZm9yRWFjaCgoVXJpIHVyaSwgTWFwPElkLCBBY3R1YWxEYXRhPFQ+PiBhY3R1YWxNYXApIHsKICAgIGNoZWNrQWN0dWFsTWFwKGFjdHVhbE1hcCwgZGF0YS5leHBlY3RlZE1hcHNbdXJpXSwgdXJpKTsKICB9KTsKICBjaGVja0FjdHVhbE1hcChkYXRhLmFjdHVhbE1hcHMuZ2xvYmFsRGF0YSwgZGF0YS5leHBlY3RlZE1hcHMuZ2xvYmFsRGF0YSk7CgogIFNldDxJZD4gbWlzc2luZ0lkcyA9IG5ldyBTZXQ8SWQ+KCk7CiAgdm9pZCBjaGVja01pc3NpbmcoCiAgICAgIE1hcDxJZCwgSWRWYWx1ZT4gZXhwZWN0ZWRNYXAsIE1hcDxJZCwgQWN0dWFsRGF0YTxUPj4gYWN0dWFsTWFwLAogICAgICBbVXJpIHVyaV0pIHsKICAgIGV4cGVjdGVkTWFwLmZvckVhY2goKElkIGlkLCBJZFZhbHVlIGV4cGVjdGVkKSB7CiAgICAgIGlmICghYWN0dWFsTWFwLmNvbnRhaW5zS2V5KGlkKSkgewogICAgICAgIG1pc3NpbmdJZHMuYWRkKGlkKTsKICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICdNSVNTSU5HICRtb2RlTmFtZSBEQVRBIGZvciAke2lkLmRlc2NyaXB0b3J9OiAnCiAgICAgICAgICAgICdFeHBlY3RlZCAke2NvbG9yaXplRXhwZWN0ZWQoJyRleHBlY3RlZCcpfSc7CiAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7CiAgICAgICAgICBjb21waWxlZERhdGEucmVwb3J0RXJyb3IoCiAgICAgICAgICAgICAgdXJpLCBjb21waWxlZERhdGEuZ2V0T2Zmc2V0RnJvbUlkKGlkLCB1cmkpLCBtZXNzYWdlLAogICAgICAgICAgICAgIHN1Y2NpbmN0OiBzdWNjaW5jdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByaW50KG1lc3NhZ2UpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBpZiAobWlzc2luZ0lkcy5pc05vdEVtcHR5ICYmIHVyaSAhPSBudWxsKSB7CiAgICAgIG5lZWRlZERpZmZzLmFkZCh1cmkpOwogICAgfQogIH0KCiAgZGF0YS5leHBlY3RlZE1hcHMuZm9yRWFjaCgoVXJpIHVyaSwgTWFwPElkLCBJZFZhbHVlPiBleHBlY3RlZE1hcCkgewogICAgY2hlY2tNaXNzaW5nKGV4cGVjdGVkTWFwLCBkYXRhLmFjdHVhbE1hcHNbdXJpXSwgdXJpKTsKICB9KTsKICBjaGVja01pc3NpbmcoZGF0YS5leHBlY3RlZE1hcHMuZ2xvYmFsRGF0YSwgZGF0YS5hY3R1YWxNYXBzLmdsb2JhbERhdGEpOwogIGlmICghc3VjY2luY3QpIHsKICAgIGZvciAoVXJpIHVyaSBpbiBuZWVkZWREaWZmcykgewogICAgICBwcmludCgnLS1hbm5vdGF0aW9ucyBkaWZmIFske3VyaS5wYXRoU2VnbWVudHMubGFzdH1dLS0tLS0tLS0tLS0tLScpOwogICAgICBwcmludChkYXRhLmRpZmZDb2RlKHVyaSwgZGF0YVZhbGlkYXRvcikpOwogICAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpOwogICAgfQogIH0KICBpZiAobWlzc2luZ0lkcy5pc05vdEVtcHR5KSB7CiAgICBwcmludCgiTUlTU0lORyBpZHM6ICR7bWlzc2luZ0lkc30uIik7CiAgICBoYXNGYWlsdXJlID0gdHJ1ZTsKICB9CiAgaWYgKGhhc0ZhaWx1cmUgJiYgZmF0YWxFcnJvcnMpIHsKICAgIG9uRmFpbHVyZSgnRXJyb3JzIGZvdW5kLicpOwogIH0KICByZXR1cm4gaGFzRmFpbHVyZTsKfQoKdHlwZWRlZiBGdXR1cmU8Ym9vbD4gUnVuVGVzdEZ1bmN0aW9uKFRlc3REYXRhIHRlc3REYXRhLAogICAge2Jvb2wgdGVzdEFmdGVyRmFpbHVyZXMsIGJvb2wgdmVyYm9zZSwgYm9vbCBzdWNjaW5jdCwgYm9vbCBwcmludENvZGV9KTsKCi8vLyBDaGVjayBjb2RlIGZvciBhbGwgdGVzdCBmaWxlcyBpbnQgW2RhdGFdIHVzaW5nIFtjb21wdXRlRnJvbUFzdF0gYW5kCi8vLyBbY29tcHV0ZUZyb21LZXJuZWxdIGZyb20gdGhlIHJlc3BlY3RpdmUgZnJvbnQgZW5kcy4gSWYgW3NraXBGb3JLZXJuZWxdCi8vLyBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBmaWxlIGl0IGlzbid0IHRlc3RlZCBmb3Iga2VybmVsLgovLy8KLy8vIFtsaWJEaXJlY3RvcnldIGNvbnRhaW5zIHRoZSBkaXJlY3RvcnkgZm9yIGFueSBzdXBwb3J0aW5nIGxpYnJhcmllcyB0aGF0IG5lZWQKLy8vIHRvIGJlIGxvYWRlZC4gV2UgZXhwZWN0IHN1cHBvcnRpbmcgbGlicmFyaWVzIHRvIGhhdmUgdGhlIHNhbWUgcHJlZml4IGFzIHRoZQovLy8gb3JpZ2luYWwgdGVzdCBpbiBbZGF0YURpcl0uIFNvLCBmb3IgZXhhbXBsZSwgaWYgdGVzdGluZyBgZm9vLmRhcnRgIGluCi8vLyBbZGF0YURpcl0sIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnNpZGVyIGFueSBmaWxlcyBuYW1lZCBgZm9vLipcLmRhcnRgLAovLy8gc3VjaCBhcyBgZm9vMi5kYXJ0YCwgYGZvb18yLmRhcnRgLCBhbmQgYGZvb19ibGFoX2JsYWhfYmxhaC5kYXJ0YCBpbgovLy8gW2xpYkRpcmVjdG9yeV0gdG8gYmUgc3VwcG9ydGluZyBsaWJyYXJ5IGZpbGVzIGZvciBgZm9vLmRhcnRgLgpGdXR1cmUgcnVuVGVzdHMoRGlyZWN0b3J5IGRhdGFEaXIsCiAgICB7TGlzdDxTdHJpbmc+IGFyZ3M6IGNvbnN0IDxTdHJpbmc+W10sCiAgICBEaXJlY3RvcnkgbGliRGlyZWN0b3J5OiBudWxsLAogICAgaW50IHNoYXJkczogMSwKICAgIGludCBzaGFyZEluZGV4OiAwLAogICAgdm9pZCBvblRlc3QoVXJpIHVyaSksCiAgICBJdGVyYWJsZTxTdHJpbmc+IHN1cHBvcnRlZE1hcmtlcnMsCiAgICBVcmkgY3JlYXRlVXJpRm9yRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lLCB7Ym9vbCBpc0xpYn0pLAogICAgdm9pZCBvbkZhaWx1cmUoU3RyaW5nIG1lc3NhZ2UpLAogICAgUnVuVGVzdEZ1bmN0aW9uIHJ1blRlc3R9KSBhc3luYyB7CiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCAtLXNob3cgdG8gc2hvdyBhY3R1YWwgZGF0YSBmb3IgYW4gaW5wdXQuCiAgYXJncyA9IGFyZ3MudG9MaXN0KCk7CiAgYm9vbCB2ZXJib3NlID0gYXJncy5yZW1vdmUoJy12Jyk7CiAgYm9vbCBzdWNjaW5jdCA9IGFyZ3MucmVtb3ZlKCctcycpOwogIGJvb2wgc2hvdWxkQ29udGludWUgPSBhcmdzLnJlbW92ZSgnLWMnKTsKICBib29sIHRlc3RBZnRlckZhaWx1cmVzID0gYXJncy5yZW1vdmUoJy1hJyk7CiAgYm9vbCBwcmludENvZGUgPSBhcmdzLnJlbW92ZSgnLXAnKTsKICBib29sIGNvbnRpbnVlZCA9IGZhbHNlOwogIGJvb2wgaGFzRmFpbHVyZXMgPSBmYWxzZTsKCiAgdmFyIHJlbGF0aXZlRGlyID0gZGF0YURpci51cmkucGF0aC5yZXBsYWNlQWxsKFVyaS5iYXNlLnBhdGgsICcnKTsKICBwcmludCgnRGF0YSBkaXI6ICR7cmVsYXRpdmVEaXJ9Jyk7CiAgTGlzdDxGaWxlU3lzdGVtRW50aXR5PiBlbnRpdGllcyA9IGRhdGFEaXIubGlzdFN5bmMoKTsKICBpZiAoc2hhcmRzID4gMSkgewogICAgaW50IHN0YXJ0ID0gZW50aXRpZXMubGVuZ3RoICogc2hhcmRJbmRleCB+LyBzaGFyZHM7CiAgICBpbnQgZW5kID0gZW50aXRpZXMubGVuZ3RoICogKHNoYXJkSW5kZXggKyAxKSB+LyBzaGFyZHM7CiAgICBlbnRpdGllcyA9IGVudGl0aWVzLnN1Ymxpc3Qoc3RhcnQsIGVuZCk7CiAgfQogIGludCB0ZXN0Q291bnQgPSAwOwogIGZvciAoRmlsZVN5c3RlbUVudGl0eSBlbnRpdHkgaW4gZW50aXRpZXMpIHsKICAgIFN0cmluZyBuYW1lID0gZW50aXR5LnVyaS5wYXRoU2VnbWVudHMubGFzdDsKICAgIGlmIChhcmdzLmlzTm90RW1wdHkgJiYgIWFyZ3MuY29udGFpbnMobmFtZSkgJiYgIWNvbnRpbnVlZCkgY29udGludWU7CiAgICBpZiAoc2hvdWxkQ29udGludWUpIGNvbnRpbnVlZCA9IHRydWU7CiAgICB0ZXN0Q291bnQrKzsKCiAgICBpZiAob25UZXN0ICE9IG51bGwpIHsKICAgICAgb25UZXN0KGVudGl0eS51cmkpOwogICAgfQogICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKCiAgICBUZXN0RGF0YSB0ZXN0RGF0YSA9IGNvbXB1dGVUZXN0RGF0YSgKICAgICAgICBlbnRpdHksIGVudGl0eSBpcyBGaWxlID8gbGliRGlyZWN0b3J5IDogbnVsbCwKICAgICAgICBzdXBwb3J0ZWRNYXJrZXJzOiBzdXBwb3J0ZWRNYXJrZXJzLAogICAgICAgIGNyZWF0ZVVyaUZvckZpbGVOYW1lOiBjcmVhdGVVcmlGb3JGaWxlTmFtZSwKICAgICAgICBvbkZhaWx1cmU6IG9uRmFpbHVyZSk7CiAgICBwcmludCgnVGVzdCBmaWxlOiAke3Rlc3REYXRhLnRlc3RGaWxlVXJpfScpOwogICAgaWYgKCFzdWNjaW5jdCAmJiB0ZXN0RGF0YS5saWJGaWxlTmFtZXMgIT0gbnVsbCkgewogICAgICBwcmludCgnU3VwcG9ydGluZyBsaWJyYXJpZXM6Jyk7CiAgICAgIGZvciAoU3RyaW5nIGxpYkZpbGVOYW1lIGluIHRlc3REYXRhLmxpYkZpbGVOYW1lcykgewogICAgICAgIHByaW50KCcgICAgLSBsaWJzLyRsaWJGaWxlTmFtZScpOwogICAgICB9CiAgICB9CgogICAgaWYgKGF3YWl0IHJ1blRlc3QodGVzdERhdGEsCiAgICAgICAgdGVzdEFmdGVyRmFpbHVyZXM6IHRlc3RBZnRlckZhaWx1cmVzLAogICAgICAgIHZlcmJvc2U6IHZlcmJvc2UsCiAgICAgICAgc3VjY2luY3Q6IHN1Y2NpbmN0LAogICAgICAgIHByaW50Q29kZTogcHJpbnRDb2RlKSkgewogICAgICBoYXNGYWlsdXJlcyA9IHRydWU7CiAgICB9CiAgfQogIGlmIChoYXNGYWlsdXJlcykgewogICAgb25GYWlsdXJlKCdFcnJvcnMgZm91bmQuJyk7CiAgfQogIGlmICh0ZXN0Q291bnQgPT0gMCkgewogICAgb25GYWlsdXJlKCJObyBmaWxlcyB3ZXJlIHRlc3RlZC4iKTsKICB9Cn0KgqQATk48ARIlEikBICgqAUglDRESAwEzLQE9JhNDCxEEAgFJJBNBCxEEAgFHJRNCCxEEAgFJJRNACxEEAgFKJxNCCxEEAgE9KBNDCxEEAgFPD0gpQgIBTB9DRgIBTEtPTyRHIT8pAU05AUAzBAFDKQQBLDc5BisEAQwWKiQXLzBCGksZGxgVChUGIRcbHAYTGgQCAU8pBEdHFDVMMigtRQE2P0xCNiVMIUIyRUwKOg82MkVACi4IBgYCAUYETCIETi5QKD0nRAEVJRodJi9JJDgeD04TCAYEAVAjEEwFPTBBBEEmHSwxBQEdAUYZI0YzJUdGKVAfBAEiMkJGPDA5CAYEIVEZRAYEAUkjAgEgERkYLyY+IwFRLQE0AgE2IRUBTSM1AUtGFCsBQAE3OEA0JxIuKAgYBAE4UCZANi4uMDwUND4jFDQsCAg4JiIyFDU+CAgYBAEnAVECATEkTkkWOgFAHgE4IAIBLkEhAQxAFxkmOgYRBAEMJB0EAQwmFwQCAVAoDzonFxwGGDMGNTwGEgQhKQQYAgFQMRImMSdQAT0hUQY9BAEsQgEfQDpLCD8EAT9AOjUiIUknOzwvHik/Fi05CggIOi4vHikhFi05CggIPwQBKDMEAgFOERsVFSItIiZIHBotRBspARdGEyI6IzkBKi5HJB4hF0BEP0lOI1AkDAoPLCNAKUckHiEXRUlLPkZGIyo4JAwKCAgbGRkeCAYEAUg8BkwBJhVGEzQoHEk5GyRDIxEaCggIMBwGBAFGOgZKEyNLMEsGBB8qFwQjIAQVAgE4TAFIS0MEUVBKT0hCIyoiExcaJz0kJksYJCUrLiYaHAFEJTgUODwtBBUuMEkqEQEaGgZPASk2LDQfMTYmOioIBgEgLhocIRoGBBUgBBgoBAIBLXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy90ZXN0aW5nL2lkX3Rlc3RpbmcuZGFydC9zZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY3J5cHRvL2xpYi9jcnlwdG8uZGFydIFsLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmV4cG9ydCAnc3JjL2RpZ2VzdC5kYXJ0JzsKZXhwb3J0ICdzcmMvaGFzaC5kYXJ0JzsKZXhwb3J0ICdzcmMvaG1hYy5kYXJ0JzsKZXhwb3J0ICdzcmMvbWQ1LmRhcnQnOwpleHBvcnQgJ3NyYy9zaGExLmRhcnQnOwpleHBvcnQgJ3NyYy9zaGEyNTYuZGFydCc7CgwATk48ARoYGBcYGgEacGFja2FnZTpjcnlwdG8vY3J5cHRvLmRhcnRBc2Rrcm9vdDovcGtnL2Zyb250X2VuZC9saWIvc3JjL3Rlc3RpbmcvYW5ub3RhdGVkX2NvZGVfaGVscGVyLmRhcnSa6C8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpjb25zdCBpbnQgX0xGID0gMHgwQTsKY29uc3QgaW50IF9DUiA9IDB4MEQ7Cgpjb25zdCBQYXR0ZXJuIGF0QnJhY2VTdGFydCA9ICdAeyc7CmNvbnN0IFBhdHRlcm4gYnJhY2VFbmQgPSAnfSc7CgpmaW5hbCBQYXR0ZXJuIGNvbW1lbnRTdGFydCA9IG5ldyBSZWdFeHAocicvXConKTsKZmluYWwgUGF0dGVybiBjb21tZW50RW5kID0gbmV3IFJlZ0V4cChyJ1wqL1xzKicpOwoKY2xhc3MgQW5ub3RhdGlvbiB7CiAgLy8vIDEtYmFzZWQgbGluZSBudW1iZXIgb2YgdGhlIGFubm90YXRpb24uCiAgZmluYWwgaW50IGxpbmVObzsKCiAgLy8vIDEtYmFzZWQgY29sdW1uIG51bWJlciBvZiB0aGUgYW5ub3RhdGlvbi4KICBmaW5hbCBpbnQgY29sdW1uTm87CgogIC8vLyAwLWJhc2VkIGNoYXJhY3RlciBvZmZzZXQgIG9mIHRoZSBhbm5vdGF0aW9uIHdpdGhpbiB0aGUgc291cmNlIHRleHQuCiAgZmluYWwgaW50IG9mZnNldDsKCiAgLy8vIFRoZSB0ZXh0IGluIHRoZSBhbm5vdGF0aW9uLgogIGZpbmFsIFN0cmluZyB0ZXh0OwoKICBBbm5vdGF0aW9uKHRoaXMubGluZU5vLCB0aGlzLmNvbHVtbk5vLCB0aGlzLm9mZnNldCwgdGhpcy50ZXh0KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJ0Fubm90YXRpb24obGluZU5vPSRsaW5lTm8sY29sdW1uTm89JGNvbHVtbk5vLG9mZnNldD0kb2Zmc2V0LHRleHQ9JHRleHQpJzsKfQoKLy8vIEEgc291cmNlIGNvZGUgdGV4dCB3aXRoIGFubm90YXRlZCBwb3NpdGlvbnMuCi8vLwovLy8gQW4gW0Fubm90YXRlZENvZGVdIGNhbiBiZSBjcmVhdGVkIGZyb20gYSBbU3RyaW5nXSBvZiBzb3VyY2UgY29kZSB3aGVyZQovLy8gYW5ub3RhdGVkIHBvc2l0aW9ucyBhcmUgZW1iZWRkZWQsIGJ5IGRlZmF1bHQgdXNpbmcgdGhlIHN5bnRheCBgQHt0ZXh0fWAuCi8vLyBGb3IgaW5zdGFuY2UKLy8vCi8vLyAgICAgbWFpbigpIHsKLy8vICAgICAgIEB7Zm9vLWNhbGx9Zm9vKCk7Ci8vLyAgICAgICBiYXJAe2Jhci1hcmdzfSgpOwovLy8gICAgIH0KLy8vCi8vLyAgdGhlIHBvc2l0aW9uIG9mIGBmb29gIGNhbGwgd2lsbCBob2xkIGFuIGFubm90YXRpb24gd2l0aCB0ZXh0ICdmb28tY2FsbCcgYW5kCi8vLyAgdGhlIHBvc2l0aW9uIG9mIGBiYXJgIGFyZ3VtZW50cyB3aWxsIGhvbGQgYW4gYW5ub3RhdGlvbiB3aXRoIHRleHQKLy8vICAnYmFyLWFyZ3MnLgovLy8KLy8vICBBbm5vdGF0aW9uIHRleHQgY2Fubm90IHNwYW4gbXVsdGlwbGUgbGluZXMgYW5kIGNhbm5vdCBjb250YWluICd9Jy4KY2xhc3MgQW5ub3RhdGVkQ29kZSB7CiAgLy8vIFRoZSBzb3VyY2UgY29kZSB3aXRob3V0IGFubm90YXRpb25zLgogIGZpbmFsIFN0cmluZyBzb3VyY2VDb2RlOwoKICAvLy8gVGhlIGFubm90YXRpb25zIGZvciB0aGUgc291cmNlIGNvZGUuCiAgZmluYWwgTGlzdDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uczsKCiAgTGlzdDxpbnQ+IF9saW5lU3RhcnRzOwoKICBBbm5vdGF0ZWRDb2RlKHRoaXMuc291cmNlQ29kZSwgdGhpcy5hbm5vdGF0aW9ucyk7CgogIEFubm90YXRlZENvZGUuaW50ZXJuYWwodGhpcy5zb3VyY2VDb2RlLCB0aGlzLmFubm90YXRpb25zLCB0aGlzLl9saW5lU3RhcnRzKTsKCiAgLy8vIENyZWF0ZXMgYW4gW0Fubm90YXRlZENvZGVdIGJ5IHByb2Nlc3NpbmcgW2Fubm90YXRlZENvZGVdLiBBbm5vdGF0aW9uCiAgLy8vIGRlbGltaXRlZCBieSBbc3RhcnRdIGFuZCBbZW5kXSBhcmUgY29udmVydGVkIGludG8gW0Fubm90YXRpb25dcyBhbmQKICAvLy8gcmVtb3ZlZCBmcm9tIHRoZSBbYW5ub3RhdGVkQ29kZV0gdG8gcHJvZHVjZSB0aGUgc291cmNlIGNvZGUuCiAgZmFjdG9yeSBBbm5vdGF0ZWRDb2RlLmZyb21UZXh0KFN0cmluZyBhbm5vdGF0ZWRDb2RlLAogICAgICBbUGF0dGVybiBzdGFydCA9IGF0QnJhY2VTdGFydCwgUGF0dGVybiBlbmQgPSBicmFjZUVuZF0pIHsKICAgIFN0cmluZ0J1ZmZlciBjb2RlQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgTGlzdDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IDxBbm5vdGF0aW9uPltdOwogICAgaW50IGluZGV4ID0gMDsKICAgIGludCBvZmZzZXQgPSAwOwogICAgaW50IGxpbmVObyA9IDE7CiAgICBpbnQgY29sdW1uTm8gPSAxOwogICAgTGlzdDxpbnQ+IGxpbmVTdGFydHMgPSA8aW50PltdOwogICAgbGluZVN0YXJ0cy5hZGQob2Zmc2V0KTsKICAgIHdoaWxlIChpbmRleCA8IGFubm90YXRlZENvZGUubGVuZ3RoKSB7CiAgICAgIE1hdGNoIHN0YXJ0TWF0Y2ggPSBzdGFydC5tYXRjaEFzUHJlZml4KGFubm90YXRlZENvZGUsIGluZGV4KTsKICAgICAgaWYgKHN0YXJ0TWF0Y2ggIT0gbnVsbCkgewogICAgICAgIGludCBzdGFydEluZGV4ID0gc3RhcnRNYXRjaC5lbmQ7CiAgICAgICAgSXRlcmFibGU8TWF0Y2g+IGVuZE1hdGNoZXMgPQogICAgICAgICAgICBlbmQuYWxsTWF0Y2hlcyhhbm5vdGF0ZWRDb2RlLCBzdGFydE1hdGNoLmVuZCk7CiAgICAgICAgaWYgKCFlbmRNYXRjaGVzLmlzRW1wdHkpIHsKICAgICAgICAgIE1hdGNoIGVuZE1hdGNoID0gZW5kTWF0Y2hlcy5maXJzdDsKICAgICAgICAgIGFubm90YXRlZENvZGUuaW5kZXhPZihlbmQsIHN0YXJ0SW5kZXgpOwogICAgICAgICAgU3RyaW5nIHRleHQgPSBhbm5vdGF0ZWRDb2RlLnN1YnN0cmluZyhzdGFydE1hdGNoLmVuZCwgZW5kTWF0Y2guc3RhcnQpOwogICAgICAgICAgYW5ub3RhdGlvbnMuYWRkKG5ldyBBbm5vdGF0aW9uKGxpbmVObywgY29sdW1uTm8sIG9mZnNldCwgdGV4dCkpOwogICAgICAgICAgaW5kZXggPSBlbmRNYXRjaC5lbmQ7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGludCBjaGFyQ29kZSA9IGFubm90YXRlZENvZGUuY29kZVVuaXRBdChpbmRleCk7CiAgICAgIHN3aXRjaCAoY2hhckNvZGUpIHsKICAgICAgICBjYXNlIF9MRjoKICAgICAgICAgIGNvZGVCdWZmZXIud3JpdGUoJ1xuJyk7CiAgICAgICAgICBvZmZzZXQrKzsKICAgICAgICAgIGxpbmVTdGFydHMuYWRkKG9mZnNldCk7CiAgICAgICAgICBsaW5lTm8rKzsKICAgICAgICAgIGNvbHVtbk5vID0gMTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgX0NSOgogICAgICAgICAgaWYgKGluZGV4ICsgMSA8IGFubm90YXRlZENvZGUubGVuZ3RoICYmCiAgICAgICAgICAgICAgYW5ub3RhdGVkQ29kZS5jb2RlVW5pdEF0KGluZGV4ICsgMSkgPT0gX0xGKSB7CiAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICB9CiAgICAgICAgICBjb2RlQnVmZmVyLndyaXRlKCdcbicpOwogICAgICAgICAgb2Zmc2V0Kys7CiAgICAgICAgICBsaW5lU3RhcnRzLmFkZChvZmZzZXQpOwogICAgICAgICAgbGluZU5vKys7CiAgICAgICAgICBjb2x1bW5ObyA9IDE7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgY29kZUJ1ZmZlci53cml0ZUNoYXJDb2RlKGNoYXJDb2RlKTsKICAgICAgICAgIG9mZnNldCsrOwogICAgICAgICAgY29sdW1uTm8rKzsKICAgICAgfQogICAgICBpbmRleCsrOwogICAgfQogICAgbGluZVN0YXJ0cy5hZGQob2Zmc2V0KTsKICAgIHJldHVybiBuZXcgQW5ub3RhdGVkQ29kZS5pbnRlcm5hbCgKICAgICAgICBjb2RlQnVmZmVyLnRvU3RyaW5nKCksIGFubm90YXRpb25zLCBsaW5lU3RhcnRzKTsKICB9CgogIHZvaWQgX2Vuc3VyZUxpbmVTdGFydHMoKSB7CiAgICBpZiAoX2xpbmVTdGFydHMgPT0gbnVsbCkgewogICAgICBpbnQgaW5kZXggPSAwOwogICAgICBpbnQgb2Zmc2V0ID0gMDsKICAgICAgX2xpbmVTdGFydHMgPSA8aW50PltdOwogICAgICBfbGluZVN0YXJ0cy5hZGQob2Zmc2V0KTsKICAgICAgd2hpbGUgKGluZGV4IDwgc291cmNlQ29kZS5sZW5ndGgpIHsKICAgICAgICBpbnQgY2hhckNvZGUgPSBzb3VyY2VDb2RlLmNvZGVVbml0QXQoaW5kZXgpOwogICAgICAgIHN3aXRjaCAoY2hhckNvZGUpIHsKICAgICAgICAgIGNhc2UgX0xGOgogICAgICAgICAgICBvZmZzZXQrKzsKICAgICAgICAgICAgX2xpbmVTdGFydHMuYWRkKG9mZnNldCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfQ1I6CiAgICAgICAgICAgIGlmIChpbmRleCArIDEgPCBzb3VyY2VDb2RlLmxlbmd0aCAmJgogICAgICAgICAgICAgICAgc291cmNlQ29kZS5jb2RlVW5pdEF0KGluZGV4ICsgMSkgPT0gX0xGKSB7CiAgICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBvZmZzZXQrKzsKICAgICAgICAgICAgX2xpbmVTdGFydHMuYWRkKG9mZnNldCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgb2Zmc2V0Kys7CiAgICAgICAgfQogICAgICAgIGluZGV4Kys7CiAgICAgIH0KICAgICAgX2xpbmVTdGFydHMuYWRkKG9mZnNldCk7CiAgICB9CiAgfQoKICB2b2lkIGFkZEFubm90YXRpb24oaW50IGxpbmVObywgaW50IGNvbHVtbk5vLCBTdHJpbmcgdGV4dCkgewogICAgX2Vuc3VyZUxpbmVTdGFydHMoKTsKICAgIGludCBvZmZzZXQgPSBfbGluZVN0YXJ0c1tsaW5lTm8gLSAxXSArIChjb2x1bW5ObyAtIDEpOwogICAgYW5ub3RhdGlvbnMuYWRkKG5ldyBBbm5vdGF0aW9uKGxpbmVObywgY29sdW1uTm8sIG9mZnNldCwgdGV4dCkpOwogIH0KCiAgU3RyaW5nIHRvVGV4dCgpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIExpc3Q8QW5ub3RhdGlvbj4gbGlzdCA9IGFubm90YXRpb25zLnRvTGlzdCgpCiAgICAgIC4uc29ydCgoYSwgYikgPT4gYS5vZmZzZXQuY29tcGFyZVRvKGIub2Zmc2V0KSk7CiAgICBpbnQgb2Zmc2V0ID0gMDsKICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIGluIGxpc3QpIHsKICAgICAgc2Iud3JpdGUoc291cmNlQ29kZS5zdWJzdHJpbmcob2Zmc2V0LCBhbm5vdGF0aW9uLm9mZnNldCkpOwogICAgICBzYi53cml0ZSgnQHske2Fubm90YXRpb24udGV4dH19Jyk7CiAgICAgIG9mZnNldCA9IGFubm90YXRpb24ub2Zmc2V0OwogICAgfQogICAgc2Iud3JpdGUoc291cmNlQ29kZS5zdWJzdHJpbmcob2Zmc2V0KSk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBTcGxpdCB0aGUgYW5ub3RhdGlvbnMgaW4gW2Fubm90YXRlZENvZGVdIGJ5IFtwcmVmaXhlc10uCi8vLwovLy8gUmV0dXJucyBhIG1hcCBjb250YWluaW5nIGFuIFtBbm5vdGF0ZWRDb2RlXSBvYmplY3QgZm9yIGVhY2ggcHJlZml4LAovLy8gY29udGFpbmluZyBvbmx5IHRoZSBhbm5vdGF0aW9ucyB3aG9zZSB0ZXh0IHN0YXJ0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LgovLy8gSWYgbm8gcHJlZml4IG1hdGNoIHRoZSBhbm5vdGF0aW9uIHRleHQsIHRoZSBhbm5vdGF0aW9uIGlzIGFkZGVkIHRvIGFsbAovLy8gW0Fubm90YXRlZENvZGVdIG9iamVjdHMuCi8vLwovLy8gVGhlIHByZWZpeGVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGFubm90YXRpb24gdGV4dHMgaW4gdGhlIHJldHVybmVkCi8vLyBbQW5ub3RhdGVkQ29kZV0gb2JqZWN0cy4KTWFwPFN0cmluZywgQW5ub3RhdGVkQ29kZT4gc3BsaXRCeVByZWZpeGVzKAogICAgQW5ub3RhdGVkQ29kZSBhbm5vdGF0ZWRDb2RlLCBJdGVyYWJsZTxTdHJpbmc+IHByZWZpeGVzKSB7CiAgU2V0PFN0cmluZz4gcHJlZml4U2V0ID0gcHJlZml4ZXMudG9TZXQoKTsKICBNYXA8U3RyaW5nLCBMaXN0PEFubm90YXRpb24+PiBtYXAgPSA8U3RyaW5nLCBMaXN0PEFubm90YXRpb24+Pnt9OwogIGZvciAoU3RyaW5nIHByZWZpeCBpbiBwcmVmaXhTZXQpIHsKICAgIG1hcFtwcmVmaXhdID0gPEFubm90YXRpb24+W107CiAgfQogIG91dGVyOgogIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIGluIGFubm90YXRlZENvZGUuYW5ub3RhdGlvbnMpIHsKICAgIGludCBkb3RQb3MgPSBhbm5vdGF0aW9uLnRleHQuaW5kZXhPZignLicpOwogICAgaWYgKGRvdFBvcyAhPSAtMSkgewogICAgICBTdHJpbmcgYW5ub3RhdGlvblByZWZpeCA9IGFubm90YXRpb24udGV4dC5zdWJzdHJpbmcoMCwgZG90UG9zKTsKICAgICAgU3RyaW5nIGFubm90YXRpb25UZXh0ID0gYW5ub3RhdGlvbi50ZXh0LnN1YnN0cmluZyhkb3RQb3MgKyAxKTsKICAgICAgTGlzdDxTdHJpbmc+IG1hcmtlcnMgPSBhbm5vdGF0aW9uUHJlZml4LnNwbGl0KCd8JykudG9MaXN0KCk7CiAgICAgIGlmIChwcmVmaXhTZXQuY29udGFpbnNBbGwobWFya2VycykpIHsKICAgICAgICBmb3IgKFN0cmluZyBwYXJ0IGluIG1hcmtlcnMpIHsKICAgICAgICAgIG1hcFtwYXJ0XS5hZGQobmV3IEFubm90YXRpb24oYW5ub3RhdGlvbi5saW5lTm8sIGFubm90YXRpb24uY29sdW1uTm8sCiAgICAgICAgICAgICAgYW5ub3RhdGlvbi5vZmZzZXQsIGFubm90YXRpb25UZXh0KSk7CiAgICAgICAgfQogICAgICAgIGNvbnRpbnVlIG91dGVyOwogICAgICB9CiAgICB9CiAgICBmb3IgKFN0cmluZyBwcmVmaXggaW4gcHJlZml4U2V0KSB7CiAgICAgIG1hcFtwcmVmaXhdLmFkZChhbm5vdGF0aW9uKTsKICAgIH0KICB9CiAgTWFwPFN0cmluZywgQW5ub3RhdGVkQ29kZT4gc3BsaXQgPSA8U3RyaW5nLCBBbm5vdGF0ZWRDb2RlPnt9OwogIG1hcC5mb3JFYWNoKChTdHJpbmcgcHJlZml4LCBMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zKSB7CiAgICBzcGxpdFtwcmVmaXhdID0gbmV3IEFubm90YXRlZENvZGUoYW5ub3RhdGVkQ29kZS5zb3VyY2VDb2RlLCBhbm5vdGF0aW9ucyk7CiAgfSk7CiAgcmV0dXJuIHNwbGl0Owp9CoDYAE5OPAEWFgEjHgExMgETLRQBLxYBShQBIhUBQgEXUQIBMQRLTREEERwcCgRRRxEESBYrGwErJgEZATQBTwFLSkM3QDIzExQUFiQcK0QgKSU7Iy0yUUsgFAoIATYaEiIUIhQYERIyPBUMIhQiFBgRES4UFggPBhwnOQQBHR8VFh0fKjUcFBYlExQxOxcOFiUTExYKEQgfBgQBPhk7RQQBFCoxNhQqQSkiBiwaBAIBPARITksdBEcdLD4sRCUiBAk9LxhGRUMsJ08zChgIBicjBgRAPk4GEAIBOHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy90ZXN0aW5nL2Fubm90YXRlZF9jb2RlX2hlbHBlci5kYXJ0LnNka3Jvb3Q6L3BrZy9mcm9udF9lbmQvbGliL3NyYy90ZXN0aW5nL2lkLmRhcnSosS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgplbnVtIElkS2luZCB7CiAgLy8vIElkIHVzZWQgZm9yIHRvcCBsZXZlbCBvciBjbGFzcyBtZW1iZXJzLiBUaGlzIGlzIHVzZWQgaW4gW01lbWJlcklkXS4KICBtZW1iZXIsCgogIC8vLyBJZCB1c2VkIGZvciBjbGFzc2VzLiBUaGlzIGlzIHVzZWQgaW4gW0NsYXNzSWRdLgogIGNscywKCiAgLy8vIElkIHVzZWQgZm9yIGxpYnJhcmllcy4gVGhpcyBpcyB1c2VkIGluIFtMaWJyYXJ5SWRdLgogIGxpYnJhcnksCgogIC8vLyBJZCB1c2VkIGZvciBhIGNvZGUgcG9pbnQgYXQgY2VydGFpbiBvZmZzZXQuIFRoZSBpZCByZXByZXNlbnRzIHRoZSBkZWZhdWx0CiAgLy8vIHVzZSBvZiB0aGUgY29kZSBwb2ludCwgb2Z0ZW4gYSByZWFkIGFjY2Vzcy4gVGhpcyBpcyB1c2VkIGluIFtOb2RlSWRdLgogIG5vZGUsCgogIC8vLyBJZCB1c2VkIGZvciBhbiBpbnZvY2F0aW9uIGF0IGNlcnRhaW4gb2Zmc2V0LiBUaGlzIGlzIHVzZWQgaW4gW05vZGVJZF0uCiAgaW52b2tlLAoKICAvLy8gSWQgdXNlZCBmb3IgYW4gYXNzaWdubWVudCBhdCBjZXJ0YWluIG9mZnNldC4gVGhpcyBpcyB1c2VkIGluIFtOb2RlSWRdLgogIHVwZGF0ZSwKCiAgLy8vIElkIHVzZWQgZm9yIHRoZSBpdGVyYXRvciBleHByZXNzaW9uIG9mIGEgZm9yLWluIGF0IGNlcnRhaW4gb2Zmc2V0LiBUaGlzIGlzCiAgLy8vIHVzZWQgaW4gW05vZGVJZF0uCiAgaXRlcmF0b3IsCgogIC8vLyBJZCB1c2VkIGZvciB0aGUgaW1wbGljaXQgY2FsbCB0byBgSXRlcmF0b3IuY3VycmVudGAgaW4gYSBmb3ItaW4gYXQgY2VydGFpbgogIC8vLyBvZmZzZXQuIFRoaXMgaXMgdXNlZCBpbiBbTm9kZUlkXS4KICBjdXJyZW50LAoKICAvLy8gSWQgdXNlZCBmb3IgdGhlIGltcGxpY2l0IGNhbGwgdG8gYEl0ZXJhdG9yLm1vdmVOZXh0YCBpbiBhIGZvci1pbiBhdAogIC8vLyBjZXJ0YWluIG9mZnNldC4gVGhpcyBpcyB1c2VkIGluIFtOb2RlSWRdLgogIG1vdmVOZXh0LAoKICAvLy8gSWQgdXNlZCBmb3IgdGhlIHN0YXRlbWVudCBhdCBjZXJ0YWluIG9mZnNldC4gVGhpcyBpcyB1c2VkIGluIFtOb2RlSWRdLgogIHN0bXQsCgogIC8vLyBJZCB1c2VkIGZvciB0aGUgZXJyb3IgcmVwb3J0ZWQgYXQgY2VydGFpbiBvZmZzZXQuIFRoaXMgaXMgdXNlZCBpbgogIC8vLyBbTm9kZUlkXS4KICBlcnJvciwKfQoKLy8vIElkIGZvciBhIGNvZGUgcG9pbnQgb3IgZWxlbWVudC4KYWJzdHJhY3QgY2xhc3MgSWQgewogIElkS2luZCBnZXQga2luZDsKCiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpZCByZWZlcnMgdG8gYW4gZWxlbWVudCBkZWZpbmVkIG91dHNpZGUgb2YgdGhlIHRlc3QKICAvLy8gY2FzZSBpdHNlbGYgKGUuZy4gc29tZSB0ZXN0cyBtYXkgbmVlZCB0byByZWZlciB0byBwcm9wZXJ0aWVzIG9mIGVsZW1lbnRzCiAgLy8vIGluIGBkYXJ0OmNvcmVgKS4KICBib29sIGdldCBpc0dsb2JhbDsKCiAgLy8vIERpc3BsYXkgbmFtZSBmb3IgdGhpcyBpZC4KICBTdHJpbmcgZ2V0IGRlc2NyaXB0b3I7Cn0KCmNsYXNzIElkVmFsdWUgewogIGZpbmFsIElkIGlkOwogIGZpbmFsIFN0cmluZyB2YWx1ZTsKCiAgY29uc3QgSWRWYWx1ZSh0aGlzLmlkLCB0aGlzLnZhbHVlKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBpZC5oYXNoQ29kZSAqIDEzICsgdmFsdWUuaGFzaENvZGUgKiAxNzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBJZFZhbHVlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gaWQgPT0gb3RoZXIuaWQgJiYgdmFsdWUgPT0gb3RoZXIudmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBpZFRvU3RyaW5nKGlkLCB2YWx1ZSk7CgogIHN0YXRpYyBTdHJpbmcgaWRUb1N0cmluZyhJZCBpZCwgU3RyaW5nIHZhbHVlKSB7CiAgICBzd2l0Y2ggKGlkLmtpbmQpIHsKICAgICAgY2FzZSBJZEtpbmQubWVtYmVyOgogICAgICAgIE1lbWJlcklkIGVsZW1lbnRJZCA9IGlkOwogICAgICAgIHJldHVybiAnJG1lbWJlclByZWZpeCR7ZWxlbWVudElkLm5hbWV9OiR2YWx1ZSc7CiAgICAgIGNhc2UgSWRLaW5kLmNsczoKICAgICAgICBDbGFzc0lkIGNsYXNzSWQgPSBpZDsKICAgICAgICByZXR1cm4gJyRjbGFzc1ByZWZpeCR7Y2xhc3NJZC5uYW1lfTokdmFsdWUnOwogICAgICBjYXNlIElkS2luZC5saWJyYXJ5OgogICAgICAgIHJldHVybiAnJGxpYnJhcnlQcmVmaXgkdmFsdWUnOwogICAgICBjYXNlIElkS2luZC5ub2RlOgogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgY2FzZSBJZEtpbmQuaW52b2tlOgogICAgICAgIHJldHVybiAnJGludm9rZVByZWZpeCR2YWx1ZSc7CiAgICAgIGNhc2UgSWRLaW5kLnVwZGF0ZToKICAgICAgICByZXR1cm4gJyR1cGRhdGVQcmVmaXgkdmFsdWUnOwogICAgICBjYXNlIElkS2luZC5pdGVyYXRvcjoKICAgICAgICByZXR1cm4gJyRpdGVyYXRvclByZWZpeCR2YWx1ZSc7CiAgICAgIGNhc2UgSWRLaW5kLmN1cnJlbnQ6CiAgICAgICAgcmV0dXJuICckY3VycmVudFByZWZpeCR2YWx1ZSc7CiAgICAgIGNhc2UgSWRLaW5kLm1vdmVOZXh0OgogICAgICAgIHJldHVybiAnJG1vdmVOZXh0UHJlZml4JHZhbHVlJzsKICAgICAgY2FzZSBJZEtpbmQuc3RtdDoKICAgICAgICByZXR1cm4gJyRzdG10UHJlZml4JHZhbHVlJzsKICAgICAgY2FzZSBJZEtpbmQuZXJyb3I6CiAgICAgICAgcmV0dXJuICckZXJyb3JQcmVmaXgkdmFsdWUnOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuZXhwZWN0ZWQgaWQga2luZDogJHtpZC5raW5kfSIpOwogIH0KCiAgc3RhdGljIGNvbnN0IFN0cmluZyBnbG9iYWxQcmVmaXggPSAiZ2xvYmFsIyI7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBtZW1iZXJQcmVmaXggPSAibWVtYmVyOiAiOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgY2xhc3NQcmVmaXggPSAiY2xhc3M6ICI7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBsaWJyYXJ5UHJlZml4ID0gImxpYnJhcnk6ICI7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBpbnZva2VQcmVmaXggPSAiaW52b2tlOiAiOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgdXBkYXRlUHJlZml4ID0gInVwZGF0ZTogIjsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGl0ZXJhdG9yUHJlZml4ID0gIml0ZXJhdG9yOiAiOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgY3VycmVudFByZWZpeCA9ICJjdXJyZW50OiAiOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgbW92ZU5leHRQcmVmaXggPSAibW92ZU5leHQ6ICI7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBzdG10UHJlZml4ID0gInN0bXQ6ICI7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBlcnJvclByZWZpeCA9ICJlcnJvcjogIjsKCiAgc3RhdGljIElkVmFsdWUgZGVjb2RlKFVyaSBzb3VyY2VVcmksIGludCBvZmZzZXQsIFN0cmluZyB0ZXh0KSB7CiAgICBJZCBpZDsKICAgIFN0cmluZyBleHBlY3RlZDsKICAgIGlmICh0ZXh0LnN0YXJ0c1dpdGgobWVtYmVyUHJlZml4KSkgewogICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcobWVtYmVyUHJlZml4Lmxlbmd0aCk7CiAgICAgIGludCBjb2xvblBvcyA9IHRleHQuaW5kZXhPZignOicpOwogICAgICBpZiAoY29sb25Qb3MgPT0gLTEpIHRocm93ICJJbnZhbGlkIG1lbWJlciBpZDogJyR0ZXh0JyI7CiAgICAgIFN0cmluZyBuYW1lID0gdGV4dC5zdWJzdHJpbmcoMCwgY29sb25Qb3MpOwogICAgICBib29sIGlzR2xvYmFsID0gbmFtZS5zdGFydHNXaXRoKGdsb2JhbFByZWZpeCk7CiAgICAgIGlmIChpc0dsb2JhbCkgewogICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhnbG9iYWxQcmVmaXgubGVuZ3RoKTsKICAgICAgfQogICAgICBpZCA9IG5ldyBNZW1iZXJJZChuYW1lLCBpc0dsb2JhbDogaXNHbG9iYWwpOwogICAgICBleHBlY3RlZCA9IHRleHQuc3Vic3RyaW5nKGNvbG9uUG9zICsgMSk7CiAgICB9IGVsc2UgaWYgKHRleHQuc3RhcnRzV2l0aChjbGFzc1ByZWZpeCkpIHsKICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKGNsYXNzUHJlZml4Lmxlbmd0aCk7CiAgICAgIGludCBjb2xvblBvcyA9IHRleHQuaW5kZXhPZignOicpOwogICAgICBpZiAoY29sb25Qb3MgPT0gLTEpIHRocm93ICJJbnZhbGlkIGNsYXNzIGlkOiAnJHRleHQnIjsKICAgICAgU3RyaW5nIG5hbWUgPSB0ZXh0LnN1YnN0cmluZygwLCBjb2xvblBvcyk7CiAgICAgIGJvb2wgaXNHbG9iYWwgPSBuYW1lLnN0YXJ0c1dpdGgoZ2xvYmFsUHJlZml4KTsKICAgICAgaWYgKGlzR2xvYmFsKSB7CiAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGdsb2JhbFByZWZpeC5sZW5ndGgpOwogICAgICB9CiAgICAgIGlkID0gbmV3IENsYXNzSWQobmFtZSwgaXNHbG9iYWw6IGlzR2xvYmFsKTsKICAgICAgZXhwZWN0ZWQgPSB0ZXh0LnN1YnN0cmluZyhjb2xvblBvcyArIDEpOwogICAgfSBlbHNlIGlmICh0ZXh0LnN0YXJ0c1dpdGgobGlicmFyeVByZWZpeCkpIHsKICAgICAgaWQgPSBuZXcgTGlicmFyeUlkKHNvdXJjZVVyaSk7CiAgICAgIGV4cGVjdGVkID0gdGV4dC5zdWJzdHJpbmcobGlicmFyeVByZWZpeC5sZW5ndGgpOwogICAgfSBlbHNlIGlmICh0ZXh0LnN0YXJ0c1dpdGgoaW52b2tlUHJlZml4KSkgewogICAgICBpZCA9IG5ldyBOb2RlSWQob2Zmc2V0LCBJZEtpbmQuaW52b2tlKTsKICAgICAgZXhwZWN0ZWQgPSB0ZXh0LnN1YnN0cmluZyhpbnZva2VQcmVmaXgubGVuZ3RoKTsKICAgIH0gZWxzZSBpZiAodGV4dC5zdGFydHNXaXRoKHVwZGF0ZVByZWZpeCkpIHsKICAgICAgaWQgPSBuZXcgTm9kZUlkKG9mZnNldCwgSWRLaW5kLnVwZGF0ZSk7CiAgICAgIGV4cGVjdGVkID0gdGV4dC5zdWJzdHJpbmcodXBkYXRlUHJlZml4Lmxlbmd0aCk7CiAgICB9IGVsc2UgaWYgKHRleHQuc3RhcnRzV2l0aChpdGVyYXRvclByZWZpeCkpIHsKICAgICAgaWQgPSBuZXcgTm9kZUlkKG9mZnNldCwgSWRLaW5kLml0ZXJhdG9yKTsKICAgICAgZXhwZWN0ZWQgPSB0ZXh0LnN1YnN0cmluZyhpdGVyYXRvclByZWZpeC5sZW5ndGgpOwogICAgfSBlbHNlIGlmICh0ZXh0LnN0YXJ0c1dpdGgoY3VycmVudFByZWZpeCkpIHsKICAgICAgaWQgPSBuZXcgTm9kZUlkKG9mZnNldCwgSWRLaW5kLmN1cnJlbnQpOwogICAgICBleHBlY3RlZCA9IHRleHQuc3Vic3RyaW5nKGN1cnJlbnRQcmVmaXgubGVuZ3RoKTsKICAgIH0gZWxzZSBpZiAodGV4dC5zdGFydHNXaXRoKG1vdmVOZXh0UHJlZml4KSkgewogICAgICBpZCA9IG5ldyBOb2RlSWQob2Zmc2V0LCBJZEtpbmQubW92ZU5leHQpOwogICAgICBleHBlY3RlZCA9IHRleHQuc3Vic3RyaW5nKG1vdmVOZXh0UHJlZml4Lmxlbmd0aCk7CiAgICB9IGVsc2UgaWYgKHRleHQuc3RhcnRzV2l0aChzdG10UHJlZml4KSkgewogICAgICBpZCA9IG5ldyBOb2RlSWQob2Zmc2V0LCBJZEtpbmQuc3RtdCk7CiAgICAgIGV4cGVjdGVkID0gdGV4dC5zdWJzdHJpbmcoc3RtdFByZWZpeC5sZW5ndGgpOwogICAgfSBlbHNlIGlmICh0ZXh0LnN0YXJ0c1dpdGgoZXJyb3JQcmVmaXgpKSB7CiAgICAgIGlkID0gbmV3IE5vZGVJZChvZmZzZXQsIElkS2luZC5lcnJvcik7CiAgICAgIGV4cGVjdGVkID0gdGV4dC5zdWJzdHJpbmcoZXJyb3JQcmVmaXgubGVuZ3RoKTsKICAgIH0gZWxzZSB7CiAgICAgIGlkID0gbmV3IE5vZGVJZChvZmZzZXQsIElkS2luZC5ub2RlKTsKICAgICAgZXhwZWN0ZWQgPSB0ZXh0OwogICAgfQogICAgLy8gUmVtb3ZlIG5ld2xpbmVzLgogICAgZXhwZWN0ZWQgPSBleHBlY3RlZC5yZXBsYWNlQWxsKG5ldyBSZWdFeHAocidccyooXG5ccyopK1xzKicpLCAnJyk7CiAgICByZXR1cm4gbmV3IElkVmFsdWUoaWQsIGV4cGVjdGVkKTsKICB9Cn0KCi8vLyBJZCBmb3IgYW4gbWVtYmVyIGVsZW1lbnQuCmNsYXNzIE1lbWJlcklkIGltcGxlbWVudHMgSWQgewogIGZpbmFsIFN0cmluZyBjbGFzc05hbWU7CiAgZmluYWwgU3RyaW5nIG1lbWJlck5hbWU7CiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc0dsb2JhbDsKCiAgZmFjdG9yeSBNZW1iZXJJZChTdHJpbmcgdGV4dCwge2Jvb2wgaXNHbG9iYWw6IGZhbHNlfSkgewogICAgaW50IGRvdFBvcyA9IHRleHQuaW5kZXhPZignLicpOwogICAgaWYgKGRvdFBvcyAhPSAtMSkgewogICAgICByZXR1cm4gbmV3IE1lbWJlcklkLmludGVybmFsKHRleHQuc3Vic3RyaW5nKGRvdFBvcyArIDEpLAogICAgICAgICAgY2xhc3NOYW1lOiB0ZXh0LnN1YnN0cmluZygwLCBkb3RQb3MpLCBpc0dsb2JhbDogaXNHbG9iYWwpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBNZW1iZXJJZC5pbnRlcm5hbCh0ZXh0LCBpc0dsb2JhbDogaXNHbG9iYWwpOwogICAgfQogIH0KCiAgTWVtYmVySWQuaW50ZXJuYWwodGhpcy5tZW1iZXJOYW1lLCB7dGhpcy5jbGFzc05hbWUsIHRoaXMuaXNHbG9iYWw6IGZhbHNlfSk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gY2xhc3NOYW1lLmhhc2hDb2RlICogMTMgKyBtZW1iZXJOYW1lLmhhc2hDb2RlICogMTc7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgTWVtYmVySWQpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBjbGFzc05hbWUgPT0gb3RoZXIuY2xhc3NOYW1lICYmIG1lbWJlck5hbWUgPT0gb3RoZXIubWVtYmVyTmFtZTsKICB9CgogIEBvdmVycmlkZQogIElkS2luZCBnZXQga2luZCA9PiBJZEtpbmQubWVtYmVyOwoKICBTdHJpbmcgZ2V0IG5hbWUgPT4gY2xhc3NOYW1lICE9IG51bGwgPyAnJGNsYXNzTmFtZS4kbWVtYmVyTmFtZScgOiBtZW1iZXJOYW1lOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGRlc2NyaXB0b3IgPT4gJ21lbWJlciAkbmFtZSc7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdtZW1iZXI6JG5hbWUnOwp9CgovLy8gSWQgZm9yIGEgY2xhc3MuCmNsYXNzIENsYXNzSWQgaW1wbGVtZW50cyBJZCB7CiAgZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzR2xvYmFsOwoKICBDbGFzc0lkKHRoaXMuY2xhc3NOYW1lLCB7dGhpcy5pc0dsb2JhbDogZmFsc2V9KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBjbGFzc05hbWUuaGFzaENvZGUgKiAxMzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzISBDbGFzc0lkKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gY2xhc3NOYW1lID09IG90aGVyLmNsYXNzTmFtZTsKICB9CgogIEBvdmVycmlkZQogIElkS2luZCBnZXQga2luZCA9PiBJZEtpbmQuY2xzOwoKICBTdHJpbmcgZ2V0IG5hbWUgPT4gY2xhc3NOYW1lOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGRlc2NyaXB0b3IgPT4gJ2NsYXNzICRuYW1lJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ2NsYXNzOiRuYW1lJzsKfQoKLy8vIElkIGZvciBhIGxpYnJhcnkuCmNsYXNzIExpYnJhcnlJZCBpbXBsZW1lbnRzIElkIHsKICBmaW5hbCBVcmkgdXJpOwoKICBMaWJyYXJ5SWQodGhpcy51cmkpOwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwb3J0IGdsb2JhbCBsaWJyYXJ5IGFubm90YXRpb25zLgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzR2xvYmFsID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHVyaS5oYXNoQ29kZSAqIDEzOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMhIExpYnJhcnlJZCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHVyaSA9PSBvdGhlci51cmk7CiAgfQoKICBAb3ZlcnJpZGUKICBJZEtpbmQgZ2V0IGtpbmQgPT4gSWRLaW5kLmxpYnJhcnk7CgogIFN0cmluZyBnZXQgbmFtZSA9PiB1cmkudG9TdHJpbmcoKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBkZXNjcmlwdG9yID0+ICdsaWJyYXJ5ICRuYW1lJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ2xpYnJhcnk6JG5hbWUnOwp9CgovLy8gSWQgZm9yIGEgY29kZSBwb2ludCBkZWZpbmVkIGJ5IGEga2luZCBhbmQgYSBjb2RlIG9mZnNldC4KY2xhc3MgTm9kZUlkIGltcGxlbWVudHMgSWQgewogIGZpbmFsIGludCB2YWx1ZTsKICBAb3ZlcnJpZGUKICBmaW5hbCBJZEtpbmQga2luZDsKCiAgY29uc3QgTm9kZUlkKHRoaXMudmFsdWUsIHRoaXMua2luZCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzR2xvYmFsID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHZhbHVlLmhhc2hDb2RlICogMTMgKyBraW5kLmhhc2hDb2RlICogMTc7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyEgTm9kZUlkKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdmFsdWUgPT0gb3RoZXIudmFsdWUgJiYga2luZCA9PSBvdGhlci5raW5kOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBkZXNjcmlwdG9yID0+ICdvZmZzZXQgJHZhbHVlICgka2luZCknOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJGtpbmQ6JHZhbHVlJzsKfQoKY2xhc3MgQWN0dWFsRGF0YTxUPiB7CiAgZmluYWwgSWQgaWQ7CiAgZmluYWwgVCB2YWx1ZTsKICBmaW5hbCBVcmkgdXJpOwogIGZpbmFsIGludCBfb2Zmc2V0OwogIGZpbmFsIE9iamVjdCBvYmplY3Q7CgogIEFjdHVhbERhdGEodGhpcy5pZCwgdGhpcy52YWx1ZSwgdGhpcy51cmksIHRoaXMuX29mZnNldCwgdGhpcy5vYmplY3QpOwoKICBpbnQgZ2V0IG9mZnNldCB7CiAgICBpZiAoaWQgaXMgTm9kZUlkKSB7CiAgICAgIE5vZGVJZCBub2RlSWQgPSBpZDsKICAgICAgcmV0dXJuIG5vZGVJZC52YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfb2Zmc2V0OwogICAgfQogIH0KCiAgU3RyaW5nIGdldCBvYmplY3RUZXh0IHsKICAgIHJldHVybiAnb2JqZWN0IGAkeyckb2JqZWN0Jy5yZXBsYWNlQWxsKCdcbicsICcnKX1gICgke29iamVjdC5ydW50aW1lVHlwZX0pJzsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdBY3R1YWxEYXRhKGlkPSRpZCx2YWx1ZT0kdmFsdWUsdXJpPSR1cmksJwogICAgICAnb2Zmc2V0PSRvZmZzZXQsb2JqZWN0PSRvYmplY3RUZXh0KSc7Cn0KCmFic3RyYWN0IGNsYXNzIERhdGFSZWdpc3RyeTxUPiB7CiAgTWFwPElkLCBBY3R1YWxEYXRhPFQ+PiBnZXQgYWN0dWFsTWFwOwoKICAvLy8gUmVnaXN0ZXJzIFt2YWx1ZV0gd2l0aCBbaWRdIGluIFthY3R1YWxNYXBdLgogIC8vLwogIC8vLyBDaGVja3MgZm9yIGR1cGxpY2F0ZSBkYXRhIGZvciBbaWRdLgogIHZvaWQgcmVnaXN0ZXJWYWx1ZShVcmkgdXJpLCBpbnQgb2Zmc2V0LCBJZCBpZCwgVCB2YWx1ZSwgT2JqZWN0IG9iamVjdCkgewogICAgaWYgKGFjdHVhbE1hcC5jb250YWluc0tleShpZCkpIHsKICAgICAgQWN0dWFsRGF0YTxUPiBleGlzdGluZ0RhdGEgPSBhY3R1YWxNYXBbaWRdOwogICAgICByZXBvcnQodXJpLCBvZmZzZXQsICJEdXBsaWNhdGUgaWQgJHtpZH0sIHZhbHVlPSR2YWx1ZSwgb2JqZWN0PSRvYmplY3QiKTsKICAgICAgcmVwb3J0KAogICAgICAgICAgdXJpLAogICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgIkR1cGxpY2F0ZSBpZCAke2lkfSwgdmFsdWU9JHtleGlzdGluZ0RhdGEudmFsdWV9LCAiCiAgICAgICAgICAib2JqZWN0PSR7ZXhpc3RpbmdEYXRhLm9iamVjdH0iKTsKICAgICAgZmFpbCgiRHVwbGljYXRlIGlkICRpZC4iKTsKICAgIH0KICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIGFjdHVhbE1hcFtpZF0gPSBuZXcgQWN0dWFsRGF0YTxUPihpZCwgdmFsdWUsIHVyaSwgb2Zmc2V0LCBvYmplY3QpOwogICAgfQogIH0KCiAgLy8vIENhbGxlZCB0byByZXBvcnQgZHVwbGljYXRlIGVycm9ycy4KICB2b2lkIHJlcG9ydChVcmkgdXJpLCBpbnQgb2Zmc2V0LCBTdHJpbmcgbWVzc2FnZSk7CgogIC8vLyBDYWxsZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIG9uIGR1cGxpY2F0ZSBlcnJvcnMuCiAgdm9pZCBmYWlsKFN0cmluZyBtZXNzYWdlKTsKfQqBbQBOTjwBDkoKATYHAToLAVBMCAFNCgFNCgFRGAwBUSgLAUowDAFNCAFIEAkCASQUEwFQTxcVASAZAgEQDxYBJgEMPgEMHC0pMwQBDC4BMhcaITgXHjUbJxgWGiYaJhwoGyccKBgkGSUGQgQBMDEvMzExNTM1LS8BQgsVKTIoPjE1FjQIMy8vMSg9MTUWNAgyLzElNzAuNjAuNjIwODEvNzIwOC4sNC8tNQ0sFwYYRyYEAgEeHxobDBcBOiQYP0UNPgYEAU4BDEoBDBwtKksEAQwkAVABDCsBDCcCARQeGgwXATMBDC8BDBwtKSkEAQwhASABDCoBDCYCARYgEQEXAT4MHgEMKQEMHC0rHQQBDCUBJQEMLAEMKAIBPR0TDBUBJwEMHgEMQAEMHC0oNwQBDDQBDCcCARYPEREVFwFIARMYGhsNFgYEARpRBAEMQiwCASEoATIGKkslMk8ODxI+LCEGGUkGBAEpNAE4HQIBJXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy90ZXN0aW5nL2lkLmRhcnQzc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NyeXB0by9saWIvc3JjL2RpZ2VzdC5kYXJ0g7YvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmNvbGxlY3Rpb24vY29sbGVjdGlvbi5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmNvbnZlcnQvY29udmVydC5kYXJ0JzsKCi8vLyBBIG1lc3NhZ2UgZGlnZXN0IGFzIGNvbXB1dGVkIGJ5IGEgYEhhc2hgIG9yIGBITUFDYCBmdW5jdGlvbi4KY2xhc3MgRGlnZXN0IHsKICAvLy8gVGhlIG1lc3NhZ2UgZGlnZXN0IGFzIGFuIGFycmF5IG9mIGJ5dGVzLgogIGZpbmFsIExpc3Q8aW50PiBieXRlczsKCiAgRGlnZXN0KHRoaXMuYnl0ZXMpOwoKICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgZXF1YWwgdG8gYW5vdGhlciBkaWdlc3QuCiAgLy8vCiAgLy8vIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBtYW51YWwgY29tcGFyaXNvbnMgdG8gYXZvaWQgbGVha2luZwogIC8vLyBpbmZvcm1hdGlvbiB2aWEgdGltaW5nLgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICBvdGhlciBpcyBEaWdlc3QgJiYgY29uc3QgTGlzdEVxdWFsaXR5KCkuZXF1YWxzKGJ5dGVzLCBvdGhlci5ieXRlcyk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gY29uc3QgTGlzdEVxdWFsaXR5KCkuaGFzaChieXRlcyk7CgogIC8vLyBUaGUgbWVzc2FnZSBkaWdlc3QgYXMgYSBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXRzLgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IGhleC5lbmNvZGUoYnl0ZXMpOwp9Ch8ATk48AS0nAUEPLxkBFgE3BkkeDCRKAQw4ATwMKgIBHnBhY2thZ2U6Y3J5cHRvL3NyYy9kaWdlc3QuZGFydDFzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY3J5cHRvL2xpYi9zcmMvaGFzaC5kYXJ0hEMvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwoKaW1wb3J0ICdkaWdlc3QuZGFydCc7CmltcG9ydCAnZGlnZXN0X3NpbmsuZGFydCc7CgovLy8gQW4gaW50ZXJmYWNlIGZvciBjcnlwdG9ncmFwaGljIGhhc2ggZnVuY3Rpb25zLgovLy8KLy8vIEV2ZXJ5IGhhc2ggaXMgYSBjb252ZXJ0ZXIgdGhhdCB0YWtlcyBhIGxpc3Qgb2YgaW50cyBhbmQgcmV0dXJucyBhIHNpbmdsZQovLy8gZGlnZXN0LiBXaGVuIHVzZWQgaW4gY2h1bmtlZCBtb2RlLCBpdCB3aWxsIG9ubHkgZXZlciBhZGQgb25lIGRpZ2VzdCB0byB0aGUKLy8vIGlubmVyIFtTaW5rXS4KYWJzdHJhY3QgY2xhc3MgSGFzaCBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIERpZ2VzdD4gewogIC8vLyBUaGUgaW50ZXJuYWwgYmxvY2sgc2l6ZSBvZiB0aGUgaGFzaCBpbiBieXRlcy4KICAvLy8KICAvLy8gVGhpcyBpcyBleHBvc2VkIGZvciB1c2UgYnkgdGhlIGBIbWFjYCBjbGFzcywgd2hpY2ggbmVlZHMgdG8ga25vdyB0aGUgYmxvY2sKICAvLy8gc2l6ZSBmb3IgdGhlIFtIYXNoXSBpdCB1c2VzLgogIGludCBnZXQgYmxvY2tTaXplOwoKICBjb25zdCBIYXNoKCk7CgogIEBvdmVycmlkZQogIERpZ2VzdCBjb252ZXJ0KExpc3Q8aW50PiBkYXRhKSB7CiAgICB2YXIgaW5uZXJTaW5rID0gbmV3IERpZ2VzdFNpbmsoKTsKICAgIHZhciBvdXRlclNpbmsgPSBzdGFydENodW5rZWRDb252ZXJzaW9uKGlubmVyU2luayk7CiAgICBvdXRlclNpbmsuYWRkKGRhdGEpOwogICAgb3V0ZXJTaW5rLmNsb3NlKCk7CiAgICByZXR1cm4gaW5uZXJTaW5rLnZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxEaWdlc3Q+IHNpbmspOwp9CiUATk48ARcBFhsBMwRNTxI7NAZRIxUBEAEMIyY3GRccBAEMQAIBHHBhY2thZ2U6Y3J5cHRvL3NyYy9oYXNoLmRhcnQxc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NyeXB0by9saWIvc3JjL2htYWMuZGFydIxlLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwoKaW1wb3J0ICdkaWdlc3QuZGFydCc7CmltcG9ydCAnZGlnZXN0X3NpbmsuZGFydCc7CmltcG9ydCAnaGFzaC5kYXJ0JzsKCi8vLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiBba2V5ZWQtaGFzaCBtZXRob2QgYXV0aGVudGljYXRpb24gY29kZXNdW3JmY10uCi8vLwovLy8gW3JmY106IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMTA0Ci8vLwovLy8gSE1BQyBhbGxvd3MgbWVzc2FnZXMgdG8gYmUgY3J5cHRvZ3JhcGhpY2FsbHkgYXV0aGVudGljYXRlZCB1c2luZyBhbnkKLy8vIGl0ZXJhdGVkIGNyeXB0b2dyYXBoaWMgaGFzaCBmdW5jdGlvbi4KY2xhc3MgSG1hYyBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIERpZ2VzdD4gewogIC8vLyBUaGUgaGFzaCBmdW5jdGlvbiB1c2VkIHRvIGNvbXB1dGUgdGhlIGF1dGhlbnRpY2F0aW9uIGRpZ2VzdC4KICBmaW5hbCBIYXNoIF9oYXNoOwoKICAvLy8gVGhlIHNlY3JldCBrZXkgc2hhcmVkIGJ5IHRoZSBzZW5kZXIgYW5kIHRoZSByZWNlaXZlci4KICBmaW5hbCBVaW50OExpc3QgX2tleTsKCiAgLy8vIENyZWF0ZSBhbiBbSG1hY10gb2JqZWN0IGZyb20gYSBbSGFzaF0gYW5kIGEgYmluYXJ5IGtleS4KICAvLy8KICAvLy8gVGhlIGtleSBzaG91bGQgYmUgYSBzZWNyZXQgc2hhcmVkIGJldHdlZW4gdGhlIHNlbmRlciBhbmQgcmVjZWl2ZXIgb2YgdGhlCiAgLy8vIG1lc3NhZ2UuCiAgSG1hYyhIYXNoIGhhc2gsIExpc3Q8aW50PiBrZXkpCiAgICAgIDogX2hhc2ggPSBoYXNoLAogICAgICAgIF9rZXkgPSBuZXcgVWludDhMaXN0KGhhc2guYmxvY2tTaXplKSB7CiAgICAvLyBIYXNoIHRoZSBrZXkgaWYgaXQncyBsb25nZXIgdGhhbiB0aGUgYmxvY2sgc2l6ZSBvZiB0aGUgaGFzaC4KICAgIGlmIChrZXkubGVuZ3RoID4gX2hhc2guYmxvY2tTaXplKSBrZXkgPSBfaGFzaC5jb252ZXJ0KGtleSkuYnl0ZXM7CgogICAgLy8gSWYgW2tleV0gaXMgc2hvcnRlciB0aGFuIHRoZSBibG9jayBzaXplLCB0aGUgcmVzdCBvZiBbX2tleV0gd2lsbCBiZQogICAgLy8gMC1wYWRkZWQuCiAgICBfa2V5LnNldFJhbmdlKDAsIGtleS5sZW5ndGgsIGtleSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEaWdlc3QgY29udmVydChMaXN0PGludD4gZGF0YSkgewogICAgdmFyIGlubmVyU2luayA9IG5ldyBEaWdlc3RTaW5rKCk7CiAgICB2YXIgb3V0ZXJTaW5rID0gc3RhcnRDaHVua2VkQ29udmVyc2lvbihpbm5lclNpbmspOwogICAgb3V0ZXJTaW5rLmFkZChkYXRhKTsKICAgIG91dGVyU2luay5jbG9zZSgpOwogICAgcmV0dXJuIGlubmVyU2luay52YWx1ZTsKICB9CgogIEBvdmVycmlkZQogIEJ5dGVDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8RGlnZXN0PiBzaW5rKSA9PgogICAgICBuZXcgX0htYWNTaW5rKHNpbmssIF9oYXNoLCBfa2V5KTsKfQoKLy8vIFRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSE1BQyBhbGdvcml0aG0uCmNsYXNzIF9IbWFjU2luayBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2luayB7CiAgLy8vIFRoZSBzaW5rIGZvciB0aGUgb3V0ZXIgaGFzaCBjb21wdXRhdGlvbi4KICBmaW5hbCBCeXRlQ29udmVyc2lvblNpbmsgX291dGVyU2luazsKCiAgLy8vIFRoZSBzaW5rIHRoYXQgW19pbm5lclNpbmtdJ3MgcmVzdWx0IHdpbGwgYmUgYWRkZWQgdG8gd2hlbiBpdCdzIGF2YWlsYWJsZS4KICBmaW5hbCBfaW5uZXJSZXN1bHRTaW5rID0gbmV3IERpZ2VzdFNpbmsoKTsKCiAgLy8vIFRoZSBzaW5rIGZvciB0aGUgaW5uZXIgaGFzaCBjb21wdXRhdGlvbi4KICBCeXRlQ29udmVyc2lvblNpbmsgX2lubmVyU2luazsKCiAgLy8vIFdoZXRoZXIgW2Nsb3NlXSBoYXMgYmVlbiBjYWxsZWQuCiAgYm9vbCBfaXNDbG9zZWQgPSBmYWxzZTsKCiAgX0htYWNTaW5rKFNpbms8RGlnZXN0PiBzaW5rLCBIYXNoIGhhc2gsIExpc3Q8aW50PiBrZXkpCiAgICAgIDogX291dGVyU2luayA9IGhhc2guc3RhcnRDaHVua2VkQ29udmVyc2lvbihzaW5rKSB7CiAgICBfaW5uZXJTaW5rID0gaGFzaC5zdGFydENodW5rZWRDb252ZXJzaW9uKF9pbm5lclJlc3VsdFNpbmspOwoKICAgIC8vIENvbXB1dGUgb3V0ZXIgcGFkZGluZy4KICAgIHZhciBwYWRkaW5nID0gbmV3IFVpbnQ4TGlzdChrZXkubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFkZGluZy5sZW5ndGg7IGkrKykgewogICAgICBwYWRkaW5nW2ldID0gMHg1YyBeIGtleVtpXTsKICAgIH0KICAgIF9vdXRlclNpbmsuYWRkKHBhZGRpbmcpOwoKICAgIC8vIENvbXB1dGUgaW5uZXIgcGFkZGluZy4KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFkZGluZy5sZW5ndGg7IGkrKykgewogICAgICBwYWRkaW5nW2ldID0gMHgzNiBeIGtleVtpXTsKICAgIH0KICAgIF9pbm5lclNpbmsuYWRkKHBhZGRpbmcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGRhdGEpIHsKICAgIGlmIChfaXNDbG9zZWQpIHRocm93IG5ldyBTdGF0ZUVycm9yKCdITUFDIGlzIGNsb3NlZCcpOwogICAgX2lubmVyU2luay5hZGQoZGF0YSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFNsaWNlKExpc3Q8aW50PiBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB0aHJvdyBuZXcgU3RhdGVFcnJvcignSE1BQyBpcyBjbG9zZWQnKTsKICAgIF9pbm5lclNpbmsuYWRkU2xpY2UoZGF0YSwgc3RhcnQsIGVuZCwgaXNMYXN0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSB7CiAgICBpZiAoX2lzQ2xvc2VkKSByZXR1cm47CiAgICBfaXNDbG9zZWQgPSB0cnVlOwoKICAgIF9pbm5lclNpbmsuY2xvc2UoKTsKICAgIF9vdXRlclNpbmsuYWRkKF9pbm5lclJlc3VsdFNpbmsudmFsdWUuYnl0ZXMpOwogICAgX291dGVyU2luay5jbG9zZSgpOwogIH0KfQptAE5OPAEXGgEWGxQBSAQvBEkqMkMUATwYAT4GTw8hFi9ERgFLEScEAQwjJjcZFxwEAQxCKAIBNy0vJwFQLQEvIQEnGgE5OUABHi0vIgYdAR4vIgYdBAEMHTsaBAEMQzszBAEMERsWARgyGAQCARxwYWNrYWdlOmNyeXB0by9zcmMvaG1hYy5kYXJ0MHNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jcnlwdG8vbGliL3NyYy9tZDUuZGFydI7aLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwoKaW1wb3J0ICdkaWdlc3QuZGFydCc7CmltcG9ydCAnaGFzaC5kYXJ0JzsKaW1wb3J0ICdoYXNoX3NpbmsuZGFydCc7CmltcG9ydCAndXRpbHMuZGFydCc7CgovLy8gQW4gaW5zdGFuY2Ugb2YgW01ENV0uCi8vLwovLy8gVGhpcyBpbnN0YW5jZSBwcm92aWRlcyBjb252ZW5pZW50IGFjY2VzcyB0byB0aGUgW01ENV1bcmZjXSBoYXNoIGZ1bmN0aW9uLgovLy8KLy8vIFtyZmNdOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTMyMQovLy8KLy8vICoqV2FybmluZyoqOiBNRDUgaGFzIGtub3duIGNvbGxpc2lvbnMgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiByZXF1aXJlZAovLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgpmaW5hbCBtZDUgPSBuZXcgTUQ1Ll8oKTsKCi8vLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW01ENV1bcmZjXSBoYXNoIGZ1bmN0aW9uLgovLy8KLy8vIFtyZmNdOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTMyMQovLy8KLy8vICoqV2FybmluZyoqOiBNRDUgaGFzIGtub3duIGNvbGxpc2lvbnMgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiByZXF1aXJlZAovLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgovLy8KLy8vIE5vdGUgdGhhdCBpdCdzIGFsbW9zdCBhbHdheXMgZWFzaWVyIHRvIHVzZSBbbWQ1XSByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldwovLy8gaW5zdGFuY2UuCmNsYXNzIE1ENSBleHRlbmRzIEhhc2ggewogIEBvdmVycmlkZQogIGZpbmFsIGludCBibG9ja1NpemUgPSAxNiAqIGJ5dGVzUGVyV29yZDsKCiAgTUQ1Ll8oKTsKCiAgQG92ZXJyaWRlCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxEaWdlc3Q+IHNpbmspID0+CiAgICAgIG5ldyBCeXRlQ29udmVyc2lvblNpbmsuZnJvbShuZXcgX01ENVNpbmsoc2luaykpOwp9CgovLy8gRGF0YSBmcm9tIGEgbm9uLWxpbmVhciBtYXRoZW1hdGljYWwgZnVuY3Rpb24gdGhhdCBmdW5jdGlvbnMgYXMKLy8vIHJlcHJvZHVjaWJsZSBub2lzZS4KY29uc3QgX25vaXNlID0gY29uc3QgWwogIDB4ZDc2YWE0NzgsIDB4ZThjN2I3NTYsIDB4MjQyMDcwZGIsIDB4YzFiZGNlZWUsIDB4ZjU3YzBmYWYsIDB4NDc4N2M2MmEsIC8vCiAgMHhhODMwNDYxMywgMHhmZDQ2OTUwMSwgMHg2OTgwOThkOCwgMHg4YjQ0ZjdhZiwgMHhmZmZmNWJiMSwgMHg4OTVjZDdiZSwKICAweDZiOTAxMTIyLCAweGZkOTg3MTkzLCAweGE2Nzk0MzhlLCAweDQ5YjQwODIxLCAweGY2MWUyNTYyLCAweGMwNDBiMzQwLAogIDB4MjY1ZTVhNTEsIDB4ZTliNmM3YWEsIDB4ZDYyZjEwNWQsIDB4MDI0NDE0NTMsIDB4ZDhhMWU2ODEsIDB4ZTdkM2ZiYzgsCiAgMHgyMWUxY2RlNiwgMHhjMzM3MDdkNiwgMHhmNGQ1MGQ4NywgMHg0NTVhMTRlZCwgMHhhOWUzZTkwNSwgMHhmY2VmYTNmOCwKICAweDY3NmYwMmQ5LCAweDhkMmE0YzhhLCAweGZmZmEzOTQyLCAweDg3NzFmNjgxLCAweDZkOWQ2MTIyLCAweGZkZTUzODBjLAogIDB4YTRiZWVhNDQsIDB4NGJkZWNmYTksIDB4ZjZiYjRiNjAsIDB4YmViZmJjNzAsIDB4Mjg5YjdlYzYsIDB4ZWFhMTI3ZmEsCiAgMHhkNGVmMzA4NSwgMHgwNDg4MWQwNSwgMHhkOWQ0ZDAzOSwgMHhlNmRiOTllNSwgMHgxZmEyN2NmOCwgMHhjNGFjNTY2NSwKICAweGY0MjkyMjQ0LCAweDQzMmFmZjk3LCAweGFiOTQyM2E3LCAweGZjOTNhMDM5LCAweDY1NWI1OWMzLCAweDhmMGNjYzkyLAogIDB4ZmZlZmY0N2QsIDB4ODU4NDVkZDEsIDB4NmZhODdlNGYsIDB4ZmUyY2U2ZTAsIDB4YTMwMTQzMTQsIDB4NGUwODExYTEsCiAgMHhmNzUzN2U4MiwgMHhiZDNhZjIzNSwgMHgyYWQ3ZDJiYiwgMHhlYjg2ZDM5MQpdOwoKLy8vIFBlci1yb3VuZCBzaGlmdCBhbW91bnRzLgpjb25zdCBfc2hpZnRBbW91bnRzID0gY29uc3QgWwogIDA3LCAxMiwgMTcsIDIyLCAwNywgMTIsIDE3LCAyMiwgMDcsIDEyLCAxNywgMjIsIDA3LCAxMiwgMTcsIDIyLCAwNSwgMDksIDE0LCAvLwogIDIwLCAwNSwgMDksIDE0LCAyMCwgMDUsIDA5LCAxNCwgMjAsIDA1LCAwOSwgMTQsIDIwLCAwNCwgMTEsIDE2LCAyMywgMDQsIDExLAogIDE2LCAyMywgMDQsIDExLCAxNiwgMjMsIDA0LCAxMSwgMTYsIDIzLCAwNiwgMTAsIDE1LCAyMSwgMDYsIDEwLCAxNSwgMjEsIDA2LAogIDEwLCAxNSwgMjEsIDA2LCAxMCwgMTUsIDIxCl07CgovLy8gVGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFtNRDVdLgovLy8KLy8vIFRoaXMgaXMgc2VwYXJhdGUgc28gdGhhdCBpdCBjYW4gZXh0ZW5kIFtIYXNoU2lua10gd2l0aG91dCBsZWFraW5nIGFkZGl0aW9uYWwKLy8vIHB1YmxpYyBtZW1iZXJzLgpjbGFzcyBfTUQ1U2luayBleHRlbmRzIEhhc2hTaW5rIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBkaWdlc3QgPSBuZXcgVWludDMyTGlzdCg0KTsKCiAgX01ENVNpbmsoU2luazxEaWdlc3Q+IHNpbmspIDogc3VwZXIoc2luaywgMTYsIGVuZGlhbjogRW5kaWFuLmxpdHRsZSkgewogICAgZGlnZXN0WzBdID0gMHg2NzQ1MjMwMTsKICAgIGRpZ2VzdFsxXSA9IDB4ZWZjZGFiODk7CiAgICBkaWdlc3RbMl0gPSAweDk4YmFkY2ZlOwogICAgZGlnZXN0WzNdID0gMHgxMDMyNTQ3NjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdXBkYXRlSGFzaChVaW50MzJMaXN0IGNodW5rKSB7CiAgICBhc3NlcnQoY2h1bmsubGVuZ3RoID09IDE2KTsKCiAgICB2YXIgYSA9IGRpZ2VzdFswXTsKICAgIHZhciBiID0gZGlnZXN0WzFdOwogICAgdmFyIGMgPSBkaWdlc3RbMl07CiAgICB2YXIgZCA9IGRpZ2VzdFszXTsKCiAgICBpbnQgZTsKICAgIGludCBmOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNjQ7IGkrKykgewogICAgICBpZiAoaSA8IDE2KSB7CiAgICAgICAgZSA9IChiICYgYykgfCAoKH5iICYgbWFzazMyKSAmIGQpOwogICAgICAgIGYgPSBpOwogICAgICB9IGVsc2UgaWYgKGkgPCAzMikgewogICAgICAgIGUgPSAoZCAmIGIpIHwgKCh+ZCAmIG1hc2szMikgJiBjKTsKICAgICAgICBmID0gKCg1ICogaSkgKyAxKSAlIDE2OwogICAgICB9IGVsc2UgaWYgKGkgPCA0OCkgewogICAgICAgIGUgPSBiIF4gYyBeIGQ7CiAgICAgICAgZiA9ICgoMyAqIGkpICsgNSkgJSAxNjsKICAgICAgfSBlbHNlIHsKICAgICAgICBlID0gYyBeIChiIHwgKH5kICYgbWFzazMyKSk7CiAgICAgICAgZiA9ICg3ICogaSkgJSAxNjsKICAgICAgfQoKICAgICAgdmFyIHRlbXAgPSBkOwogICAgICBkID0gYzsKICAgICAgYyA9IGI7CiAgICAgIGIgPSBhZGQzMigKICAgICAgICAgIGIsCiAgICAgICAgICByb3RsMzIoYWRkMzIoYWRkMzIoYSwgZSksIGFkZDMyKF9ub2lzZVtpXSwgY2h1bmtbZl0pKSwKICAgICAgICAgICAgICBfc2hpZnRBbW91bnRzW2ldKSk7CiAgICAgIGEgPSB0ZW1wOwogICAgfQoKICAgIGRpZ2VzdFswXSA9IGFkZDMyKGEsIGRpZ2VzdFswXSk7CiAgICBkaWdlc3RbMV0gPSBhZGQzMihiLCBkaWdlc3RbMV0pOwogICAgZGlnZXN0WzJdID0gYWRkMzIoYywgZGlnZXN0WzJdKTsKICAgIGRpZ2VzdFszXSA9IGFkZDMyKGQsIGRpZ2VzdFszXSk7CiAgfQp9Cn4ATk48ARcaARYUGRUBGgROBC8EUCEZATcELwRQIQRQDhkMKwELAQxCNwIBQxgXTUpKSkpKSkpKSjEDAR0eUU5OHQMBKgRRFCIMJAFJHBwcHAQBDCYgARcXFxcBCwsBIxQrDxsrIBsXIA8lGggBFA0NEQ1BIhAGASUlJSUEAgEbcGFja2FnZTpjcnlwdG8vc3JjL21kNS5kYXJ0MXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jcnlwdG8vbGliL3NyYy9zaGExLmRhcnSK6y8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCmltcG9ydCAnZGlnZXN0LmRhcnQnOwppbXBvcnQgJ2hhc2guZGFydCc7CmltcG9ydCAnaGFzaF9zaW5rLmRhcnQnOwppbXBvcnQgJ3V0aWxzLmRhcnQnOwoKLy8vIEFuIGluc3RhbmNlIG9mIFtTaGExXS4KLy8vCi8vLyBUaGlzIGluc3RhbmNlIHByb3ZpZGVzIGNvbnZlbmllbnQgYWNjZXNzIHRvIHRoZSBbU0hBLTFdW3JmY10gaGFzaCBmdW5jdGlvbi4KLy8vCi8vLyBbcmZjXTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzE3NApmaW5hbCBzaGExID0gbmV3IFNoYTEuXygpOwoKLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBbU0hBLTFdW3JmY10gaGFzaCBmdW5jdGlvbi4KLy8vCi8vLyBbcmZjXTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzE3NApjbGFzcyBTaGExIGV4dGVuZHMgSGFzaCB7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGJsb2NrU2l6ZSA9IDE2ICogYnl0ZXNQZXJXb3JkOwoKICBTaGExLl8oKTsKCiAgQG92ZXJyaWRlCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxEaWdlc3Q+IHNpbmspID0+CiAgICAgIG5ldyBCeXRlQ29udmVyc2lvblNpbmsuZnJvbShuZXcgX1NoYTFTaW5rKHNpbmspKTsKfQoKLy8vIFRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBbU2hhMV0uCi8vLwovLy8gVGhpcyBpcyBzZXBhcmF0ZSBzbyB0aGF0IGl0IGNhbiBleHRlbmQgW0hhc2hTaW5rXSB3aXRob3V0IGxlYWtpbmcgYWRkaXRpb25hbAovLy8gcHVibGljIG1lbWViZXJzLgpjbGFzcyBfU2hhMVNpbmsgZXh0ZW5kcyBIYXNoU2luayB7CiAgQG92ZXJyaWRlCiAgZmluYWwgZGlnZXN0ID0gbmV3IFVpbnQzMkxpc3QoNSk7CgogIC8vLyBUaGUgc2l4dGVlbiB3b3JkcyBmcm9tIHRoZSBvcmlnaW5hbCBjaHVuaywgZXh0ZW5kZWQgdG8gODAgd29yZHMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYW4gaW5zdGFuY2UgdmFyaWFibGUgdG8gYXZvaWQgcmUtYWxsb2NhdGluZywgYnV0IGl0cyBkYXRhIGlzbid0CiAgLy8vIHVzZWQgYWNyb3NzIGludm9jYXRpb25zIG9mIFt1cGRhdGVIYXNoXS4KICBmaW5hbCBVaW50MzJMaXN0IF9leHRlbmRlZDsKCiAgX1NoYTFTaW5rKFNpbms8RGlnZXN0PiBzaW5rKQogICAgICA6IF9leHRlbmRlZCA9IG5ldyBVaW50MzJMaXN0KDgwKSwKICAgICAgICBzdXBlcihzaW5rLCAxNikgewogICAgZGlnZXN0WzBdID0gMHg2NzQ1MjMwMTsKICAgIGRpZ2VzdFsxXSA9IDB4RUZDREFCODk7CiAgICBkaWdlc3RbMl0gPSAweDk4QkFEQ0ZFOwogICAgZGlnZXN0WzNdID0gMHgxMDMyNTQ3NjsKICAgIGRpZ2VzdFs0XSA9IDB4QzNEMkUxRjA7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHVwZGF0ZUhhc2goVWludDMyTGlzdCBjaHVuaykgewogICAgYXNzZXJ0KGNodW5rLmxlbmd0aCA9PSAxNik7CgogICAgdmFyIGEgPSBkaWdlc3RbMF07CiAgICB2YXIgYiA9IGRpZ2VzdFsxXTsKICAgIHZhciBjID0gZGlnZXN0WzJdOwogICAgdmFyIGQgPSBkaWdlc3RbM107CiAgICB2YXIgZSA9IGRpZ2VzdFs0XTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDgwOyBpKyspIHsKICAgICAgaWYgKGkgPCAxNikgewogICAgICAgIF9leHRlbmRlZFtpXSA9IGNodW5rW2ldOwogICAgICB9IGVsc2UgewogICAgICAgIF9leHRlbmRlZFtpXSA9IHJvdGwzMigKICAgICAgICAgICAgX2V4dGVuZGVkW2kgLSAzXSBeCiAgICAgICAgICAgICAgICBfZXh0ZW5kZWRbaSAtIDhdIF4KICAgICAgICAgICAgICAgIF9leHRlbmRlZFtpIC0gMTRdIF4KICAgICAgICAgICAgICAgIF9leHRlbmRlZFtpIC0gMTZdLAogICAgICAgICAgICAxKTsKICAgICAgfQoKICAgICAgdmFyIG5ld0EgPSBhZGQzMihhZGQzMihyb3RsMzIoYSwgNSksIGUpLCBfZXh0ZW5kZWRbaV0pOwogICAgICBpZiAoaSA8IDIwKSB7CiAgICAgICAgbmV3QSA9IGFkZDMyKGFkZDMyKG5ld0EsIChiICYgYykgfCAofmIgJiBkKSksIDB4NUE4Mjc5OTkpOwogICAgICB9IGVsc2UgaWYgKGkgPCA0MCkgewogICAgICAgIG5ld0EgPSBhZGQzMihhZGQzMihuZXdBLCAoYiBeIGMgXiBkKSksIDB4NkVEOUVCQTEpOwogICAgICB9IGVsc2UgaWYgKGkgPCA2MCkgewogICAgICAgIG5ld0EgPSBhZGQzMihhZGQzMihuZXdBLCAoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZCkpLCAweDhGMUJCQ0RDKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuZXdBID0gYWRkMzIoYWRkMzIobmV3QSwgYiBeIGMgXiBkKSwgMHhDQTYyQzFENik7CiAgICAgIH0KCiAgICAgIGUgPSBkOwogICAgICBkID0gYzsKICAgICAgYyA9IHJvdGwzMihiLCAzMCk7CiAgICAgIGIgPSBhOwogICAgICBhID0gbmV3QSAmIG1hc2szMjsKICAgIH0KCiAgICBkaWdlc3RbMF0gPSBhZGQzMihhLCBkaWdlc3RbMF0pOwogICAgZGlnZXN0WzFdID0gYWRkMzIoYiwgZGlnZXN0WzFdKTsKICAgIGRpZ2VzdFsyXSA9IGFkZDMyKGMsIGRpZ2VzdFsyXSk7CiAgICBkaWdlc3RbM10gPSBhZGQzMihkLCBkaWdlc3RbM10pOwogICAgZGlnZXN0WzRdID0gYWRkMzIoZSwgZGlnZXN0WzRdKTsKICB9Cn0KagBOTjwBFxoBFhQZFQEbBFAELhsBOQQuGgwrAQwBDEI4AgErBFEVIwwkAUcGTi8eAR8oGhwcHBwcBAEMJiABFxcXFxcBIxQhDx8fIyQjEAgBPhRDGzwbTA86CAENDRkNGQYBJSUlJSUEAgEccGFja2FnZTpjcnlwdG8vc3JjL3NoYTEuZGFydDNzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY3J5cHRvL2xpYi9zcmMvc2hhMjU2LmRhcnSSey8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCmltcG9ydCAnZGlnZXN0LmRhcnQnOwppbXBvcnQgJ2hhc2guZGFydCc7CmltcG9ydCAnaGFzaF9zaW5rLmRhcnQnOwppbXBvcnQgJ3V0aWxzLmRhcnQnOwoKLy8vIEFuIGluc3RhbmNlIG9mIFtTaGEyNTZdLgovLy8KLy8vIFRoaXMgaW5zdGFuY2UgcHJvdmlkZXMgY29udmVuaWVudCBhY2Nlc3MgdG8gdGhlIFtTaGEyNTZdW3JmY10gaGFzaCBmdW5jdGlvbi4KLy8vCi8vLyBbcmZjXTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjIzNApmaW5hbCBzaGEyNTYgPSBuZXcgU2hhMjU2Ll8oKTsKCi8vLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW1NIQS0yNTZdW3JmY10gaGFzaCBmdW5jdGlvbi4KLy8vCi8vLyBbcmZjXTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjIzNAovLy8KLy8vIE5vdGUgdGhhdCBpdCdzIGFsbW9zdCBhbHdheXMgZWFzaWVyIHRvIHVzZSBbc2hhMjU2XSByYXRoZXIgdGhhbiBjcmVhdGluZyBhCi8vLyBuZXcgaW5zdGFuY2UuCmNsYXNzIFNoYTI1NiBleHRlbmRzIEhhc2ggewogIEBvdmVycmlkZQogIGZpbmFsIGludCBibG9ja1NpemUgPSAxNiAqIGJ5dGVzUGVyV29yZDsKCiAgU2hhMjU2Ll8oKTsKCiAgU2hhMjU2IG5ld0luc3RhbmNlKCkgPT4gbmV3IFNoYTI1Ni5fKCk7CgogIEBvdmVycmlkZQogIEJ5dGVDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8RGlnZXN0PiBzaW5rKSA9PgogICAgICBuZXcgQnl0ZUNvbnZlcnNpb25TaW5rLmZyb20obmV3IF9TaGEyNTZTaW5rKHNpbmspKTsKfQoKLy8vIERhdGEgZnJvbSBhIG5vbi1saW5lYXIgZnVuY3Rpb24gdGhhdCBmdW5jdGlvbnMgYXMgcmVwcm9kdWNpYmxlIG5vaXNlLgpjb25zdCBMaXN0PGludD4gX25vaXNlID0gY29uc3QgWwogIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIC8vCiAgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSwgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMywKICAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0LCAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LAogIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsCiAgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNywgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywKICAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LCAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLAogIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsCiAgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMywgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCwKICAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LCAweDM5MWMwY2IzLCAweDRlZDhhYTRhLAogIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsCiAgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMgpdOwoKLy8vIFRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBbU2hhMjU2XS4KLy8vCi8vLyBUaGlzIGlzIHNlcGFyYXRlIHNvIHRoYXQgaXQgY2FuIGV4dGVuZCBbSGFzaFNpbmtdIHdpdGhvdXQgbGVha2luZyBhZGRpdGlvbmFsCi8vLyBwdWJsaWMgbWVtYmVycy4KY2xhc3MgX1NoYTI1NlNpbmsgZXh0ZW5kcyBIYXNoU2luayB7CiAgQG92ZXJyaWRlCiAgZmluYWwgZGlnZXN0ID0gbmV3IFVpbnQzMkxpc3QoOCk7CgogIC8vLyBUaGUgc2l4dGVlbiB3b3JkcyBmcm9tIHRoZSBvcmlnaW5hbCBjaHVuaywgZXh0ZW5kZWQgdG8gNjQgd29yZHMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYW4gaW5zdGFuY2UgdmFyaWFibGUgdG8gYXZvaWQgcmUtYWxsb2NhdGluZywgYnV0IGl0cyBkYXRhIGlzbid0CiAgLy8vIHVzZWQgYWNyb3NzIGludm9jYXRpb25zIG9mIFt1cGRhdGVIYXNoXS4KICBmaW5hbCBVaW50MzJMaXN0IF9leHRlbmRlZDsKCiAgX1NoYTI1NlNpbmsoU2luazxEaWdlc3Q+IHNpbmspCiAgICAgIDogX2V4dGVuZGVkID0gbmV3IFVpbnQzMkxpc3QoNjQpLAogICAgICAgIHN1cGVyKHNpbmssIDE2KSB7CiAgICAvLyBJbml0aWFsIHZhbHVlIG9mIHRoZSBoYXNoIHBhcnRzLiBGaXJzdCAzMiBiaXRzIG9mIHRoZSBmcmFjdGlvbmFsIHBhcnRzCiAgICAvLyBvZiB0aGUgc3F1YXJlIHJvb3RzIG9mIHRoZSBmaXJzdCA4IHByaW1lIG51bWJlcnMuCiAgICBkaWdlc3RbMF0gPSAweDZhMDllNjY3OwogICAgZGlnZXN0WzFdID0gMHhiYjY3YWU4NTsKICAgIGRpZ2VzdFsyXSA9IDB4M2M2ZWYzNzI7CiAgICBkaWdlc3RbM10gPSAweGE1NGZmNTNhOwogICAgZGlnZXN0WzRdID0gMHg1MTBlNTI3ZjsKICAgIGRpZ2VzdFs1XSA9IDB4OWIwNTY4OGM7CiAgICBkaWdlc3RbNl0gPSAweDFmODNkOWFiOwogICAgZGlnZXN0WzddID0gMHg1YmUwY2QxOTsKICB9CgogIC8vIFRoZSBmb2xsb3dpbmcgaGVscGVyIGZ1bmN0aW9ucyBhcmUgdGFrZW4gZGlyZWN0bHkgZnJvbQogIC8vIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyMzQuCgogIGludCBfcm90cjMyKGludCBuLCBpbnQgeCkgPT4gKHggPj4gbikgfCAoKHggPDwgKDMyIC0gbikpICYgbWFzazMyKTsKICBpbnQgX2NoKGludCB4LCBpbnQgeSwgaW50IHopID0+ICh4ICYgeSkgXiAoKH54ICYgbWFzazMyKSAmIHopOwogIGludCBfbWFqKGludCB4LCBpbnQgeSwgaW50IHopID0+ICh4ICYgeSkgXiAoeCAmIHopIF4gKHkgJiB6KTsKICBpbnQgX2JzaWcwKGludCB4KSA9PiBfcm90cjMyKDIsIHgpIF4gX3JvdHIzMigxMywgeCkgXiBfcm90cjMyKDIyLCB4KTsKICBpbnQgX2JzaWcxKGludCB4KSA9PiBfcm90cjMyKDYsIHgpIF4gX3JvdHIzMigxMSwgeCkgXiBfcm90cjMyKDI1LCB4KTsKICBpbnQgX3NzaWcwKGludCB4KSA9PiBfcm90cjMyKDcsIHgpIF4gX3JvdHIzMigxOCwgeCkgXiAoeCA+PiAzKTsKICBpbnQgX3NzaWcxKGludCB4KSA9PiBfcm90cjMyKDE3LCB4KSBeIF9yb3RyMzIoMTksIHgpIF4gKHggPj4gMTApOwoKICBAb3ZlcnJpZGUKICB2b2lkIHVwZGF0ZUhhc2goVWludDMyTGlzdCBjaHVuaykgewogICAgYXNzZXJ0KGNodW5rLmxlbmd0aCA9PSAxNik7CgogICAgLy8gUHJlcGFyZSBtZXNzYWdlIHNjaGVkdWxlLgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAgICAgIF9leHRlbmRlZFtpXSA9IGNodW5rW2ldOwogICAgfQogICAgZm9yICh2YXIgaSA9IDE2OyBpIDwgNjQ7IGkrKykgewogICAgICBfZXh0ZW5kZWRbaV0gPSBhZGQzMihhZGQzMihfc3NpZzEoX2V4dGVuZGVkW2kgLSAyXSksIF9leHRlbmRlZFtpIC0gN10pLAogICAgICAgICAgYWRkMzIoX3NzaWcwKF9leHRlbmRlZFtpIC0gMTVdKSwgX2V4dGVuZGVkW2kgLSAxNl0pKTsKICAgIH0KCiAgICAvLyBTaHVmZmxlIGFyb3VuZCB0aGUgYml0cy4KICAgIHZhciBhID0gZGlnZXN0WzBdOwogICAgdmFyIGIgPSBkaWdlc3RbMV07CiAgICB2YXIgYyA9IGRpZ2VzdFsyXTsKICAgIHZhciBkID0gZGlnZXN0WzNdOwogICAgdmFyIGUgPSBkaWdlc3RbNF07CiAgICB2YXIgZiA9IGRpZ2VzdFs1XTsKICAgIHZhciBnID0gZGlnZXN0WzZdOwogICAgdmFyIGggPSBkaWdlc3RbN107CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2NDsgaSsrKSB7CiAgICAgIHZhciB0ZW1wMSA9IGFkZDMyKGFkZDMyKGgsIF9ic2lnMShlKSksCiAgICAgICAgICBhZGQzMihfY2goZSwgZiwgZyksIGFkZDMyKF9ub2lzZVtpXSwgX2V4dGVuZGVkW2ldKSkpOwogICAgICB2YXIgdGVtcDIgPSBhZGQzMihfYnNpZzAoYSksIF9tYWooYSwgYiwgYykpOwogICAgICBoID0gZzsKICAgICAgZyA9IGY7CiAgICAgIGYgPSBlOwogICAgICBlID0gYWRkMzIoZCwgdGVtcDEpOwogICAgICBkID0gYzsKICAgICAgYyA9IGI7CiAgICAgIGIgPSBhOwogICAgICBhID0gYWRkMzIodGVtcDEsIHRlbXAyKTsKICAgIH0KCiAgICAvLyBVcGRhdGUgaGFzaCB2YWx1ZXMgYWZ0ZXIgaXRlcmF0aW9uLgogICAgZGlnZXN0WzBdID0gYWRkMzIoYSwgZGlnZXN0WzBdKTsKICAgIGRpZ2VzdFsxXSA9IGFkZDMyKGIsIGRpZ2VzdFsxXSk7CiAgICBkaWdlc3RbMl0gPSBhZGQzMihjLCBkaWdlc3RbMl0pOwogICAgZGlnZXN0WzNdID0gYWRkMzIoZCwgZGlnZXN0WzNdKTsKICAgIGRpZ2VzdFs0XSA9IGFkZDMyKGUsIGRpZ2VzdFs0XSk7CiAgICBkaWdlc3RbNV0gPSBhZGQzMihmLCBkaWdlc3RbNV0pOwogICAgZGlnZXN0WzZdID0gYWRkMzIoZywgZGlnZXN0WzZdKTsKICAgIGRpZ2VzdFs3XSA9IGFkZDMyKGgsIGRpZ2VzdFs3XSk7CiAgfQp9CoCPAE5OPAEXGgEWFBkVAR0EUQQuHwE7BC4ETxIcDCsBDgEqAQxCOgIBSiFNSkpKSkpKSkpKMQMBLQRRFCUMJAFHBk4vHgEhKBpOORwcHBwcHBwcBAE8KQFGQUBISEJEAQwmIAEhIx8GJE5ABgEgFxcXFxcXFxcBIy1AMw0NDRsNDQ0fBgErJSUlJSUlJSUEAgEecGFja2FnZTpjcnlwdG8vc3JjL3NoYTI1Ni5kYXJ0MXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb252ZXJ0L2xpYi9jb252ZXJ0LmRhcnSBlS8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGNvbnZlcnQ7CgpleHBvcnQgJ3NyYy9hY2N1bXVsYXRvcl9zaW5rLmRhcnQnOwpleHBvcnQgJ3NyYy9ieXRlX2FjY3VtdWxhdG9yX3NpbmsuZGFydCc7CmV4cG9ydCAnc3JjL2hleC5kYXJ0JzsKZXhwb3J0ICdzcmMvcGVyY2VudC5kYXJ0JzsKZXhwb3J0ICdzcmMvc3RyaW5nX2FjY3VtdWxhdG9yX3NpbmsuZGFydCc7Cg0ATk48AREBJCkXGysBHHBhY2thZ2U6Y29udmVydC9jb252ZXJ0LmRhcnQ4c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NyeXB0by9saWIvc3JjL2RpZ2VzdF9zaW5rLmRhcnSC4i8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RpZ2VzdC5kYXJ0JzsKCi8vLyBBIHNpbmsgdXNlZCB0byBnZXQgYSBkaWdlc3QgdmFsdWUgb3V0IG9mIGBIYXNoLnN0YXJ0Q2h1bmtlZENvbnZlcnNpb25gLgpjbGFzcyBEaWdlc3RTaW5rIGV4dGVuZHMgU2luazxEaWdlc3Q+IHsKICAvLy8gVGhlIHZhbHVlIGFkZGVkIHRvIHRoZSBzaW5rLCBpZiBhbnkuCiAgRGlnZXN0IGdldCB2YWx1ZSB7CiAgICBhc3NlcnQoX3ZhbHVlICE9IG51bGwpOwogICAgcmV0dXJuIF92YWx1ZTsKICB9CgogIERpZ2VzdCBfdmFsdWU7CgogIC8vLyBBZGRzIFt2YWx1ZV0gdG8gdGhlIHNpbmsuCiAgLy8vCiAgLy8vIFVubGlrZSBtb3N0IHNpbmtzLCB0aGlzIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlLgogIEBvdmVycmlkZQogIHZvaWQgYWRkKERpZ2VzdCB2YWx1ZSkgewogICAgYXNzZXJ0KF92YWx1ZSA9PSBudWxsKTsKICAgIF92YWx1ZSA9IHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHsKICAgIGFzc2VydChfdmFsdWUgIT0gbnVsbCk7CiAgfQp9CiAATk48ARYBTCgrFRwTBAERASAGNwwbHBQEAQwRHAQCASNwYWNrYWdlOmNyeXB0by9zcmMvZGlnZXN0X3NpbmsuZGFydDZzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY3J5cHRvL2xpYi9zcmMvaGFzaF9zaW5rLmRhcnSVEC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJ3BhY2thZ2U6dHlwZWRfZGF0YS90eXBlZF9kYXRhLmRhcnQnOwoKaW1wb3J0ICdkaWdlc3QuZGFydCc7CmltcG9ydCAndXRpbHMuZGFydCc7CgovLy8gQSBiYXNlIGNsYXNzIGZvciBbU2lua10gaW1wbGVtZW50YXRpb25zIGZvciBoYXNoIGFsZ29yaXRobXMuCi8vLwovLy8gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgW3VwZGF0ZUhhc2hdIGFuZCBbZGlnZXN0XS4KYWJzdHJhY3QgY2xhc3MgSGFzaFNpbmsgaW1wbGVtZW50cyBTaW5rPExpc3Q8aW50Pj4gewogIC8vLyBUaGUgaW5uZXIgc2luayB0aGF0IHRoaXMgc2hvdWxkIGZvcndhcmQgdG8uCiAgZmluYWwgU2luazxEaWdlc3Q+IF9zaW5rOwoKICAvLy8gV2hldGhlciB0aGUgaGFzaCBmdW5jdGlvbiBvcGVyYXRlcyBvbiBiaWctZW5kaWFuIHdvcmRzLgogIGZpbmFsIEVuZGlhbiBfZW5kaWFuOwoKICAvLy8gVGhlIHdvcmRzIGluIHRoZSBjdXJyZW50IGNodW5rLgogIC8vLwogIC8vLyBUaGlzIGlzIGFuIGluc3RhbmNlIHZhcmlhYmxlIHRvIGF2b2lkIHJlLWFsbG9jYXRpbmcsIGJ1dCBpdHMgZGF0YSBpc24ndAogIC8vLyB1c2VkIGFjcm9zcyBpbnZvY2F0aW9ucyBvZiBbX2l0ZXJhdGVdLgogIGZpbmFsIFVpbnQzMkxpc3QgX2N1cnJlbnRDaHVuazsKCiAgLy8vIE1lc3NhZ2VzIHdpdGggbW9yZSB0aGFuIDJeNTMtMSBiaXRzIGFyZSBub3Qgc3VwcG9ydGVkLiAoVGhpcyBpcyB0aGUKICAvLy8gbGFyZ2VzdCB2YWx1ZSB0aGF0IGlzIHJlcHJlc2VudGFibGUgb24gYm90aCBKUyBhbmQgdGhlIERhcnQgVk0uKQogIC8vLyBTbyB0aGUgbWF4aW11bSBsZW5ndGggaW4gYnl0ZXMgaXMgKDJeNTMtMSkvOC4KICBzdGF0aWMgY29uc3QgX21heE1lc3NhZ2VMZW5ndGhJbkJ5dGVzID0gMHgwMDAzZmZmZmZmZmZmZmZmOwoKICAvLy8gVGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YSBzbyBmYXIsIGluIGJ5dGVzLgogIGludCBfbGVuZ3RoSW5CeXRlcyA9IDA7CgogIC8vLyBEYXRhIHRoYXQgaGFzIHlldCB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIGhhc2ggZnVuY3Rpb24uCiAgZmluYWwgX3BlbmRpbmdEYXRhID0gbmV3IFVpbnQ4QnVmZmVyKCk7CgogIC8vLyBXaGV0aGVyIFtjbG9zZV0gaGFzIGJlZW4gY2FsbGVkLgogIGJvb2wgX2lzQ2xvc2VkID0gZmFsc2U7CgogIC8vLyBUaGUgd29yZHMgaW4gdGhlIGN1cnJlbnQgZGlnZXN0LgogIC8vLwogIC8vLyBUaGlzIHNob3VsZCBiZSB1cGRhdGVkIGVhY2ggdGltZSBbdXBkYXRlSGFzaF0gaXMgY2FsbGVkLgogIFVpbnQzMkxpc3QgZ2V0IGRpZ2VzdDsKCiAgLy8vIENyZWF0ZXMgYSBuZXcgaGFzaC4KICAvLy8KICAvLy8gW2NodW5rU2l6ZUluV29yZHNdIHJlcHJlc2VudHMgdGhlIHNpemUgb2YgdGhlIGlucHV0IGNodW5rcyBwcm9jZXNzZWQgYnkKICAvLy8gdGhlIGFsZ29yaXRobSwgaW4gdGVybXMgb2YgMzItYml0IHdvcmRzLgogIEhhc2hTaW5rKHRoaXMuX3NpbmssIGludCBjaHVua1NpemVJbldvcmRzLCB7RW5kaWFuIGVuZGlhbjogRW5kaWFuLmJpZ30pCiAgICAgIDogX2VuZGlhbiA9IGVuZGlhbiwKICAgICAgICBfY3VycmVudENodW5rID0gbmV3IFVpbnQzMkxpc3QoY2h1bmtTaXplSW5Xb3Jkcyk7CgogIC8vLyBSdW5zIGEgc2luZ2xlIGl0ZXJhdGlvbiBvZiB0aGUgaGFzaCBjb21wdXRhdGlvbiwgdXBkYXRpbmcgW2RpZ2VzdF0gd2l0aAogIC8vLyB0aGUgcmVzdWx0LgogIC8vLwogIC8vLyBbY2h1bmtdIGlzIHRoZSBjdXJyZW50IGNodW5rLCB3aG9zZSBzaXplIGlzIGdpdmVuIGJ5IHRoZQogIC8vLyBgY2h1bmtTaXplSW5Xb3Jkc2AgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCiAgdm9pZCB1cGRhdGVIYXNoKFVpbnQzMkxpc3QgY2h1bmspOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZChMaXN0PGludD4gZGF0YSkgewogICAgaWYgKF9pc0Nsb3NlZCkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ0hhc2guYWRkKCkgY2FsbGVkIGFmdGVyIGNsb3NlKCkuJyk7CiAgICBfbGVuZ3RoSW5CeXRlcyArPSBkYXRhLmxlbmd0aDsKICAgIF9wZW5kaW5nRGF0YS5hZGRBbGwoZGF0YSk7CiAgICBfaXRlcmF0ZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHsKICAgIGlmIChfaXNDbG9zZWQpIHJldHVybjsKICAgIF9pc0Nsb3NlZCA9IHRydWU7CgogICAgX2ZpbmFsaXplRGF0YSgpOwogICAgX2l0ZXJhdGUoKTsKICAgIGFzc2VydChfcGVuZGluZ0RhdGEuaXNFbXB0eSk7CiAgICBfc2luay5hZGQobmV3IERpZ2VzdChfYnl0ZURpZ2VzdCgpKSk7CiAgICBfc2luay5jbG9zZSgpOwogIH0KCiAgVWludDhMaXN0IF9ieXRlRGlnZXN0KCkgewogICAgaWYgKF9lbmRpYW4gPT0gRW5kaWFuLmhvc3QpIHJldHVybiBkaWdlc3QuYnVmZmVyLmFzVWludDhMaXN0KCk7CgogICAgdmFyIGJ5dGVEaWdlc3QgPSBuZXcgVWludDhMaXN0KGRpZ2VzdC5sZW5ndGhJbkJ5dGVzKTsKICAgIHZhciBieXRlRGF0YSA9IGJ5dGVEaWdlc3QuYnVmZmVyLmFzQnl0ZURhdGEoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlnZXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGJ5dGVEYXRhLnNldFVpbnQzMihpICogYnl0ZXNQZXJXb3JkLCBkaWdlc3RbaV0pOwogICAgfQogICAgcmV0dXJuIGJ5dGVEaWdlc3Q7CiAgfQoKICAvLy8gSXRlcmF0ZXMgdGhyb3VnaCBbX3BlbmRpbmdEYXRhXSwgdXBkYXRpbmcgdGhlIGhhc2ggY29tcHV0YXRpb24gZm9yIGVhY2gKICAvLy8gY2h1bmsuCiAgdm9pZCBfaXRlcmF0ZSgpIHsKICAgIHZhciBwZW5kaW5nRGF0YUJ5dGVzID0gX3BlbmRpbmdEYXRhLmJ1ZmZlci5hc0J5dGVEYXRhKCk7CiAgICB2YXIgcGVuZGluZ0RhdGFDaHVua3MgPSBfcGVuZGluZ0RhdGEubGVuZ3RoIH4vIF9jdXJyZW50Q2h1bmsubGVuZ3RoSW5CeXRlczsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGVuZGluZ0RhdGFDaHVua3M7IGkrKykgewogICAgICAvLyBDb3B5IHdvcmRzIGZyb20gdGhlIHBlbmRpbmcgZGF0YSBidWZmZXIgaW50byB0aGUgY3VycmVudCBjaHVuayBidWZmZXIuCiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgX2N1cnJlbnRDaHVuay5sZW5ndGg7IGorKykgewogICAgICAgIF9jdXJyZW50Q2h1bmtbal0gPSBwZW5kaW5nRGF0YUJ5dGVzLmdldFVpbnQzMigKICAgICAgICAgICAgaSAqIF9jdXJyZW50Q2h1bmsubGVuZ3RoSW5CeXRlcyArIGogKiBieXRlc1BlcldvcmQsIF9lbmRpYW4pOwogICAgICB9CgogICAgICAvLyBSdW4gdGhlIGhhc2ggZnVuY3Rpb24gb24gdGhlIGN1cnJlbnQgY2h1bmsuCiAgICAgIHVwZGF0ZUhhc2goX2N1cnJlbnRDaHVuayk7CiAgICB9CgogICAgLy8gUmVtb3ZlIGFsbCBwZW5kaW5nIGRhdGEgdXAgdG8gdGhlIGxhc3QgY2xlYW4gY2h1bmsgYnJlYWsuCiAgICBfcGVuZGluZ0RhdGEucmVtb3ZlUmFuZ2UoCiAgICAgICAgMCwgcGVuZGluZ0RhdGFDaHVua3MgKiBfY3VycmVudENodW5rLmxlbmd0aEluQnl0ZXMpOwogIH0KCiAgLy8vIEZpbmFsaXplcyBbX3BlbmRpbmdEYXRhXS4KICAvLy8KICAvLy8gVGhpcyBhZGRzIGEgMSBiaXQgdG8gdGhlIGVuZCBvZiB0aGUgbWVzc2FnZSwgYW5kIGV4cGFuZHMgaXQgd2l0aCAwIGJpdHMgdG8KICAvLy8gcGFkIGl0IG91dC4KICB2b2lkIF9maW5hbGl6ZURhdGEoKSB7CiAgICAvLyBQYWQgb3V0IHRoZSBkYXRhIHdpdGggMHg4MCwgZWlnaHQgMHMsIGFuZCBhcyBtYW55IG1vcmUgMHMgYXMgd2UgbmVlZCB0bwogICAgLy8gbGFuZCBjbGVhbmx5IG9uIGEgY2h1bmsgYm91bmRhcnkuCiAgICBfcGVuZGluZ0RhdGEuYWRkKDB4ODApOwogICAgdmFyIGNvbnRlbnRzTGVuZ3RoID0gX2xlbmd0aEluQnl0ZXMgKyA5OwogICAgdmFyIGZpbmFsaXplZExlbmd0aCA9IF9yb3VuZFVwKGNvbnRlbnRzTGVuZ3RoLCBfY3VycmVudENodW5rLmxlbmd0aEluQnl0ZXMpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaW5hbGl6ZWRMZW5ndGggLSBjb250ZW50c0xlbmd0aDsgaSsrKSB7CiAgICAgIF9wZW5kaW5nRGF0YS5hZGQoMCk7CiAgICB9CgogICAgaWYgKF9sZW5ndGhJbkJ5dGVzID4gX21heE1lc3NhZ2VMZW5ndGhJbkJ5dGVzKSB7CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgJ0hhc2hpbmcgaXMgdW5zdXBwb3J0ZWQgZm9yIG1lc3NhZ2VzIHdpdGggbW9yZSB0aGFuIDJeNTMgYml0cy4nKTsKICAgIH0KCiAgICB2YXIgbGVuZ3RoSW5CaXRzID0gX2xlbmd0aEluQnl0ZXMgKiBiaXRzUGVyQnl0ZTsKCiAgICAvLyBBZGQgdGhlIGZ1bGwgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhIGFzIGEgNjQtYml0IHZhbHVlIGF0IHRoZSBlbmQgb2YgdGhlCiAgICAvLyBoYXNoLgogICAgdmFyIG9mZnNldCA9IF9wZW5kaW5nRGF0YS5sZW5ndGg7CiAgICBfcGVuZGluZ0RhdGEuYWRkQWxsKG5ldyBVaW50OExpc3QoOCkpOwogICAgdmFyIGJ5dGVEYXRhID0gX3BlbmRpbmdEYXRhLmJ1ZmZlci5hc0J5dGVEYXRhKCk7CgogICAgLy8gV2UncmUgZXNzZW50aWFsbHkgZG9pbmcgYnl0ZURhdGEuc2V0VWludDY0KG9mZnNldCwgbGVuZ3RoSW5CaXRzLCBfZW5kaWFuKQogICAgLy8gaGVyZSwgYnV0IHRoYXQgbWV0aG9kIGlzbid0IHN1cHBvcnRlZCBvbiBkYXJ0MmpzIHNvIHdlIGltcGxlbWVudCBpdAogICAgLy8gbWFudWFsbHkgaW5zdGVhZC4KICAgIHZhciBoaWdoQml0cyA9IGxlbmd0aEluQml0cyA+PiAzMjsKICAgIHZhciBsb3dCaXRzID0gbGVuZ3RoSW5CaXRzICYgbWFzazMyOwogICAgaWYgKF9lbmRpYW4gPT0gRW5kaWFuLmJpZykgewogICAgICBieXRlRGF0YS5zZXRVaW50MzIob2Zmc2V0LCBoaWdoQml0cywgX2VuZGlhbik7CiAgICAgIGJ5dGVEYXRhLnNldFVpbnQzMihvZmZzZXQgKyBieXRlc1BlcldvcmQsIGxvd0JpdHMsIF9lbmRpYW4pOwogICAgfSBlbHNlIHsKICAgICAgYnl0ZURhdGEuc2V0VWludDMyKG9mZnNldCwgbG93Qml0cywgX2VuZGlhbik7CiAgICAgIGJ5dGVEYXRhLnNldFVpbnQzMihvZmZzZXQgKyBieXRlc1BlcldvcmQsIGhpZ2hCaXRzLCBfZW5kaWFuKTsKICAgIH0KICB9CgogIC8vLyBSb3VuZHMgW3ZhbF0gdXAgdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YgW25dLCBhcyBsb25nIGFzIFtuXSBpcyBhIHBvd2VyIG9mCiAgLy8vIHR3by4KICBpbnQgX3JvdW5kVXAoaW50IHZhbCwgaW50IG4pID0+ICh2YWwgKyBuIC0gMSkgJiAtbjsKfQqAoABOTjwBGgEtARYVAUEEOjUyHAE+GAEmBk4tIgFKRzQ+ATUaAT4qAScaAScGPxkBGgZOL0oaOgFOEgY/PiUBDB1NIx8QBAEMERsWARUQIioTBAEcRAE6My43BhcEAU4NFD1QMlA3N0oIATUhBgFBHj0EASAGURIZTykcLVFBGwYBNSJMBgE1AVENJis1AVFLGScpITVDDTREBgQBUAs2AgEhcGFja2FnZTpjcnlwdG8vc3JjL2hhc2hfc2luay5kYXJ0MnNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jcnlwdG8vbGliL3NyYy91dGlscy5kYXJ0guwvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEEgYml0bWFzayB0aGF0IGxpbWl0cyBhbiBpbnRlZ2VyIHRvIDMyIGJpdHMuCmNvbnN0IG1hc2szMiA9IDB4RkZGRkZGRkY7CgovLy8gVGhlIG51bWJlciBvZiBiaXRzIGluIGEgYnl0ZS4KY29uc3QgYml0c1BlckJ5dGUgPSA4OwoKLy8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSAzMi1iaXQgd29yZC4KY29uc3QgYnl0ZXNQZXJXb3JkID0gNDsKCi8vLyBBZGRzIFt4XSBhbmQgW3ldIHdpdGggMzItYml0IG92ZXJmbG93IHNlbWFudGljcy4KaW50IGFkZDMyKGludCB4LCBpbnQgeSkgPT4gKHggKyB5KSAmIG1hc2szMjsKCi8vLyBCaXR3aXNlIHJvdGF0ZXMgW3ZhbF0gdG8gdGhlIGxlZnQgYnkgW3NoaWZ0XSwgb2JleWluZyAzMi1iaXQgb3ZlcmZsb3cKLy8vIHNlbWFudGljcy4KaW50IHJvdGwzMihpbnQgdmFsLCBpbnQgc2hpZnQpIHsKICB2YXIgbW9kU2hpZnQgPSBzaGlmdCAmIDMxOwogIHJldHVybiAoKHZhbCA8PCBtb2RTaGlmdCkgJiBtYXNrMzIpIHwgKCh2YWwgJiBtYXNrMzIpID4+ICgzMiAtIG1vZFNoaWZ0KSk7Cn0KGABOTjwBMRsBIhcBKhgBNS0BSg8hHU0CAR1wYWNrYWdlOmNyeXB0by9zcmMvdXRpbHMuZGFydD5zZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29udmVydC9saWIvc3JjL2FjY3VtdWxhdG9yX3NpbmsuZGFydIPtLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCi8vLyBBIHNpbmsgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gYWxsIHRoZSBbZXZlbnRzXSB0aGF0IGhhdmUgYmVlbiBwYXNzZWQgdG8gaXQuCi8vLwovLy8gU2VlIGFsc28gW0NodW5rZWRDb252ZXJzaW9uU2luay53aXRoQ2FsbGJhY2tdLgpjbGFzcyBBY2N1bXVsYXRvclNpbms8VD4gaW1wbGVtZW50cyBTaW5rPFQ+IHsKICAvLy8gQW4gdW5tb2RpZmlhYmxlIGxpc3Qgb2YgZXZlbnRzIHBhc3NlZCB0byB0aGlzIHNpbmsgc28gZmFyLgogIExpc3Q8VD4gZ2V0IGV2ZW50cyA9PiBuZXcgVW5tb2RpZmlhYmxlTGlzdFZpZXcoX2V2ZW50cyk7CiAgZmluYWwgX2V2ZW50cyA9IDxUPltdOwoKICAvLy8gV2hldGhlciBbY2xvc2VdIGhhcyBiZWVuIGNhbGxlZC4KICBib29sIGdldCBpc0Nsb3NlZCA9PiBfaXNDbG9zZWQ7CiAgdmFyIF9pc0Nsb3NlZCA9IGZhbHNlOwoKICAvLy8gUmVtb3ZlcyBhbGwgZXZlbnRzIGZyb20gW2V2ZW50c10uCiAgLy8vCiAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQgZG91YmxlLXByb2Nlc3NpbmcgZXZlbnRzLgogIHZvaWQgY2xlYXIoKSB7CiAgICBfZXZlbnRzLmNsZWFyKCk7CiAgfQoKICB2b2lkIGFkZChUIGV2ZW50KSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJDYW4ndCBhZGQgdG8gYSBjbG9zZWQgc2luay4iKTsKICAgIH0KCiAgICBfZXZlbnRzLmFkZChldmVudCk7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgX2lzQ2xvc2VkID0gdHJ1ZTsKICB9Cn0KJwBOTjwBGgFRBDMuQTsZASciGQEoBjoRFQQBFhU7BgEYBAERFgQCASlwYWNrYWdlOmNvbnZlcnQvc3JjL2FjY3VtdWxhdG9yX3NpbmsuZGFydENzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29udmVydC9saWIvc3JjL2J5dGVfYWNjdW11bGF0b3Jfc2luay5kYXJ0hcIvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJ3BhY2thZ2U6dHlwZWRfZGF0YS90eXBlZF9kYXRhLmRhcnQnOwoKLy8vIEEgc2luayB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY29uY2F0ZW5hdGVkIGJ5dGVzIHBhc3NlZCB0byBpdC4KLy8vCi8vLyBTZWUgYWxzbyBbQnl0ZUNvbnZlcnNpb25TaW5rLndpdGhDYWxsYmFja10uCmNsYXNzIEJ5dGVBY2N1bXVsYXRvclNpbmsgZXh0ZW5kcyBCeXRlQ29udmVyc2lvblNpbmtCYXNlIHsKICAvLy8gVGhlIGJ5dGVzIGFjY3VtdWxhdGVkIHNvIGZhci4KICAvLy8KICAvLy8gVGhlIHJldHVybmVkIFtVaW50OExpc3RdIGlzIHZpZXdpbmcgYSBzaGFyZWQgYnVmZmVyLCBzbyBpdCBzaG91bGQgbm90IGJlCiAgLy8vIGNoYW5nZWQgYW5kIGFueSBieXRlcyBvdXRzaWRlIHRoZSB2aWV3IHNob3VsZCBub3QgYmUgYWNjZXNzZWQuCiAgVWludDhMaXN0IGdldCBieXRlcyA9PiBuZXcgVWludDhMaXN0LnZpZXcoX2J1ZmZlci5idWZmZXIsIDAsIF9idWZmZXIubGVuZ3RoKTsKCiAgZmluYWwgX2J1ZmZlciA9IG5ldyBVaW50OEJ1ZmZlcigpOwoKICAvLy8gV2hldGhlciBbY2xvc2VdIGhhcyBiZWVuIGNhbGxlZC4KICBib29sIGdldCBpc0Nsb3NlZCA9PiBfaXNDbG9zZWQ7CiAgdmFyIF9pc0Nsb3NlZCA9IGZhbHNlOwoKICAvLy8gUmVtb3ZlcyBhbGwgYnl0ZXMgZnJvbSBbYnl0ZXNdLgogIC8vLwogIC8vLyBUaGlzIGNhbiBiZSB1c2VkIHRvIGF2b2lkIGRvdWJsZS1wcm9jZXNzaW5nIGRhdGEuCiAgdm9pZCBjbGVhcigpIHsKICAgIF9idWZmZXIuY2xlYXIoKTsKICB9CgogIHZvaWQgYWRkKExpc3Q8aW50PiBieXRlcykgewogICAgaWYgKF9pc0Nsb3NlZCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiQ2FuJ3QgYWRkIHRvIGEgY2xvc2VkIHNpbmsuIik7CiAgICB9CgogICAgX2J1ZmZlci5hZGRBbGwoYnl0ZXMpOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIkNhbid0IGFkZCB0byBhIGNsb3NlZCBzaW5rLiIpOwogICAgfQoKICAgIF9idWZmZXIuYWRkQWxsKGNodW5rLCBzdGFydCwgZW5kKTsKICAgIGlmIChpc0xhc3QpIF9pc0Nsb3NlZCA9IHRydWU7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgX2lzQ2xvc2VkID0gdHJ1ZTsKICB9Cn0KNwBOTjwBFxoBLQFIBDA7JAZPRVABJQEnIhkBJgY4ERUEAR4VOwYBGwQBRBU7BgEnIgQBERYEAgEucGFja2FnZTpjb252ZXJ0L3NyYy9ieXRlX2FjY3VtdWxhdG9yX3NpbmsuZGFydDFzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29udmVydC9saWIvc3JjL2hleC5kYXJ0g1YvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBjb252ZXJ0LmhleDsKCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKCmltcG9ydCAnaGV4L2VuY29kZXIuZGFydCc7CmltcG9ydCAnaGV4L2RlY29kZXIuZGFydCc7CgpleHBvcnQgJ2hleC9lbmNvZGVyLmRhcnQnIGhpZGUgaGV4RW5jb2RlcjsKZXhwb3J0ICdoZXgvZGVjb2Rlci5kYXJ0JyBoaWRlIGhleERlY29kZXI7CgovLy8gVGhlIGNhbm9uaWNhbCBpbnN0YW5jZSBvZiBbSGV4Q29kZWNdLgpjb25zdCBoZXggPSBjb25zdCBIZXhDb2RlYy5fKCk7CgovLy8gQSBjb2RlYyB0aGF0IGNvbnZlcnRzIGJ5dGUgYXJyYXlzIHRvIGFuZCBmcm9tIGhleGFkZWNpbWFsIHN0cmluZ3MsIGZvbGxvd2luZwovLy8gW3RoZSBCYXNlMTYgc3BlY11bcmZjXS4KLy8vCi8vLyBbcmZjXTogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgjc2VjdGlvbi04Ci8vLwovLy8gVGhpcyBzaG91bGQgYmUgdXNlZCB2aWEgdGhlIFtoZXhdIGZpZWxkLgpjbGFzcyBIZXhDb2RlYyBleHRlbmRzIENvZGVjPExpc3Q8aW50PiwgU3RyaW5nPiB7CiAgSGV4RW5jb2RlciBnZXQgZW5jb2RlciA9PiBoZXhFbmNvZGVyOwogIEhleERlY29kZXIgZ2V0IGRlY29kZXIgPT4gaGV4RGVjb2RlcjsKCiAgY29uc3QgSGV4Q29kZWMuXygpOwp9Ch8ATk48ARUBFwEbGwErKwEqIAFRHAQ5BC0yKCgBFgIBHHBhY2thZ2U6Y29udmVydC9zcmMvaGV4LmRhcnQ1c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbnZlcnQvbGliL3NyYy9wZXJjZW50LmRhcnSF/C8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGNvbnZlcnQucGVyY2VudDsKCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKCmltcG9ydCAncGVyY2VudC9lbmNvZGVyLmRhcnQnOwppbXBvcnQgJ3BlcmNlbnQvZGVjb2Rlci5kYXJ0JzsKCmV4cG9ydCAncGVyY2VudC9lbmNvZGVyLmRhcnQnIGhpZGUgcGVyY2VudEVuY29kZXI7CmV4cG9ydCAncGVyY2VudC9kZWNvZGVyLmRhcnQnIGhpZGUgcGVyY2VudERlY29kZXI7CgovLy8gVGhlIGNhbm9uaWNhbCBpbnN0YW5jZSBvZiBbUGVyY2VudENvZGVjXS4KY29uc3QgcGVyY2VudCA9IGNvbnN0IFBlcmNlbnRDb2RlYy5fKCk7CgovLyBUT0RPKG53ZWl6KTogQWRkIGZsYWdzIHRvIHN1cHBvcnQgZ2VuZXJhdGluZyBhbmQgaW50ZXJwcmV0aW5nICIrIiBhcyBhIHNwYWNlCi8vIGNoYXJhY3Rlci4gQWxzbyBhZGQgYW4gb3B0aW9uIGZvciBjdXN0b20gc2V0cyBvZiB1bnJlc2VydmVkIGNoYXJhY3RlcnMuCi8vLyBBIGNvZGVjIHRoYXQgY29udmVydHMgYnl0ZSBhcnJheXMgdG8gYW5kIGZyb20gcGVyY2VudC1lbmNvZGVkIChhbHNvIGtub3duIGFzCi8vLyBVUkwtZW5jb2RlZCkgc3RyaW5ncyBhY2NvcmRpbmcgdG8gW1JGQyAzOTg2XVtyZmNdLgovLy8KLy8vIFtyZmNdOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTIuMQovLy8KLy8vIFtlbmNvZGVyXSBlbmNvZGVzIGFsbCBieXRlcyBvdGhlciB0aGFuIEFTQ0lJIGxldHRlcnMsIGRlY2ltYWwgZGlnaXRzLCBvciBvbmUKLy8vIG9mIGAtLl9+YC4gVGhpcyBtYXRjaGVzIHRoZSBiZWhhdmlvciBvZiBbVXJpLmVuY29kZVF1ZXJ5Q29tcG9uZW50XSBleGNlcHQKLy8vIHRoYXQgaXQgZG9lc24ndCBlbmNvZGUgYDB4MjBgIGJ5dGVzIHRvIHRoZSBgK2AgY2hhcmFjdGVyLgovLy8KLy8vIFRvIGJlIG1heGltYWxseSBmbGV4aWJsZSwgW2RlY29kZXJdIHdpbGwgZGVjb2RlIGFueSBwZXJjZW50LWVuY29kZWQgYnl0ZSBhbmQKLy8vIHdpbGwgYWxsb3cgYW55IG5vbi1wZXJjZW50LWVuY29kZWQgYnl0ZSBvdGhlciB0aGFuIGAlYC4gQnkgZGVmYXVsdCwgaXQKLy8vIGludGVycHJldHMgYCtgIGFzIGAweDJCYCByYXRoZXIgdGhhbiBgMHgyMGAgYXMgZW1pdHRlZCBieQovLy8gW1VyaS5lbmNvZGVRdWVyeUNvbXBvbmVudF0uCmNsYXNzIFBlcmNlbnRDb2RlYyBleHRlbmRzIENvZGVjPExpc3Q8aW50PiwgU3RyaW5nPiB7CiAgUGVyY2VudEVuY29kZXIgZ2V0IGVuY29kZXIgPT4gcGVyY2VudEVuY29kZXI7CiAgUGVyY2VudERlY29kZXIgZ2V0IGRlY29kZXIgPT4gcGVyY2VudERlY29kZXI7CgogIGNvbnN0IFBlcmNlbnRDb2RlYy5fKCk7Cn0KKABOTjwBGQEXAR8fATMzAS4oAVBLUTcEOwRRTj4EUUs+IDYwMAEaAgEgcGFja2FnZTpjb252ZXJ0L3NyYy9wZXJjZW50LmRhcnRFc2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbnZlcnQvbGliL3NyYy9zdHJpbmdfYWNjdW11bGF0b3Jfc2luay5kYXJ0hLgvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwoKLy8vIEEgc2luayB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY29uY2F0ZW5hdGVkIHN0cmluZ3MgcGFzc2VkIHRvIGl0LgovLy8KLy8vIFNlZSBhbHNvIFtTdHJpbmdDb252ZXJzaW9uU2luay53aXRoQ2FsbGJhY2tdLgpjbGFzcyBTdHJpbmdBY2N1bXVsYXRvclNpbmsgZXh0ZW5kcyBTdHJpbmdDb252ZXJzaW9uU2lua0Jhc2UgewogIC8vLyBUaGUgc3RyaW5nIGFjY3VtdWxhdGVkIHNvIGZhci4KICBTdHJpbmcgZ2V0IHN0cmluZyA9PiBfYnVmZmVyLnRvU3RyaW5nKCk7CiAgZmluYWwgX2J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKCiAgLy8vIFdoZXRoZXIgW2Nsb3NlXSBoYXMgYmVlbiBjYWxsZWQuCiAgYm9vbCBnZXQgaXNDbG9zZWQgPT4gX2lzQ2xvc2VkOwogIHZhciBfaXNDbG9zZWQgPSBmYWxzZTsKCiAgLy8vIEVtcHRpZXMgW3N0cmluZ10uCiAgLy8vCiAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQgZG91YmxlLXByb2Nlc3NpbmcgZGF0YS4KICB2b2lkIGNsZWFyKCkgewogICAgX2J1ZmZlci5jbGVhcigpOwogIH0KCiAgdm9pZCBhZGQoU3RyaW5nIGNodW5rKSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJDYW4ndCBhZGQgdG8gYSBjbG9zZWQgc2luay4iKTsKICAgIH0KCiAgICBfYnVmZmVyLndyaXRlKGNodW5rKTsKICB9CgogIHZvaWQgYWRkU2xpY2UoU3RyaW5nIGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJDYW4ndCBhZGQgdG8gYSBjbG9zZWQgc2luay4iKTsKICAgIH0KCiAgICBfYnVmZmVyLndyaXRlKGNodW5rLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7CiAgICBpZiAoaXNMYXN0KSBfaXNDbG9zZWQgPSB0cnVlOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9pc0Nsb3NlZCA9IHRydWU7CiAgfQp9CjAATk48ARcBSgQyPyUrJgEnIhkBGAY4ERUEARsVOwYBGgQBQRU7BgEwIgQBERYEAgEwcGFja2FnZTpjb252ZXJ0L3NyYy9zdHJpbmdfYWNjdW11bGF0b3Jfc2luay5kYXJ0N3Nka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy90eXBlZF9kYXRhL2xpYi90eXBlZF9kYXRhLmRhcnSBaC8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gVXRpbGl0aWVzIGFuZCBmdW5jdGlvbmFsaXR5IHJlbGF0ZWQgdG8gdGhlICJkYXJ0OnR5cGVkX2RhdGEiIGxpYnJhcnkuCmxpYnJhcnkgdHlwZWRfZGF0YTsKCmV4cG9ydCAicGFja2FnZTp0eXBlZF9kYXRhL3R5cGVkX2J1ZmZlcnMuZGFydCI7CgoATk48AUoUATABInBhY2thZ2U6dHlwZWRfZGF0YS90eXBlZF9kYXRhLmRhcnQ5c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbnZlcnQvbGliL3NyYy9oZXgvZW5jb2Rlci5kYXJ0i4kvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBjb252ZXJ0LmhleC5lbmNvZGVyOwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJ3BhY2thZ2U6Y2hhcmNvZGUvYXNjaWkuZGFydCc7CgovLy8gVGhlIGNhbm9uaWNhbCBpbnN0YW5jZSBvZiBbSGV4RW5jb2Rlcl0uCmNvbnN0IGhleEVuY29kZXIgPSBjb25zdCBIZXhFbmNvZGVyLl8oKTsKCi8vLyBBIGNvbnZlcnRlciB0aGF0IGVuY29kZXMgYnl0ZSBhcnJheXMgaW50byBoZXhhZGVjaW1hbCBzdHJpbmdzLgovLy8KLy8vIFRoaXMgd2lsbCB0aHJvdyBhIFtSYW5nZUVycm9yXSBpZiB0aGUgYnl0ZSBhcnJheSBoYXMgYW55IGRpZ2l0cyB0aGF0IGRvbid0Ci8vLyBmaXQgaW4gdGhlIGdhbXV0IG9mIGEgYnl0ZS4KY2xhc3MgSGV4RW5jb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gewogIGNvbnN0IEhleEVuY29kZXIuXygpOwoKICBTdHJpbmcgY29udmVydChMaXN0PGludD4gYnl0ZXMpID0+IF9jb252ZXJ0KGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwoKICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFN0cmluZz4gc2luaykgPT4KICAgICAgbmV3IF9IZXhFbmNvZGVyU2luayhzaW5rKTsKfQoKLy8vIEEgY29udmVyc2lvbiBzaW5rIGZvciBjaHVua2VkIGhleGFkZWNpbWFsIGVuY29kaW5nLgpjbGFzcyBfSGV4RW5jb2RlclNpbmsgZXh0ZW5kcyBCeXRlQ29udmVyc2lvblNpbmtCYXNlIHsKICAvLy8gVGhlIHVuZGVybHlpbmcgc2luayB0byB3aGljaCBkZWNvZGVkIGJ5dGUgYXJyYXlzIHdpbGwgYmUgcGFzc2VkLgogIGZpbmFsIFNpbms8U3RyaW5nPiBfc2luazsKCiAgX0hleEVuY29kZXJTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZChMaXN0PGludD4gY2h1bmspIHsKICAgIF9zaW5rLmFkZChfY29udmVydChjaHVuaywgMCwgY2h1bmsubGVuZ3RoKSk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKExpc3Q8aW50PiBjaHVuaywgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgY2h1bmsubGVuZ3RoKTsKICAgIF9zaW5rLmFkZChfY29udmVydChjaHVuaywgc3RhcnQsIGVuZCkpOwogICAgaWYgKGlzTGFzdCkgX3NpbmsuY2xvc2UoKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfc2luay5jbG9zZSgpOwogIH0KfQoKU3RyaW5nIF9jb252ZXJ0KExpc3Q8aW50PiBieXRlcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgLy8gQSBVaW50OExpc3QgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBhIFN0cmluZ0J1ZmZlciBnaXZlbiB0aGF0IHdlIGtub3cgdGhhdAogIC8vIHdlJ3JlIG9ubHkgZW1pdHRpbmcgQVNDSUktY29tcGF0aWJsZSBjaGFyYWN0ZXJzLCBhbmQgdGhhdCB3ZSBrbm93IHRoZQogIC8vIGxlbmd0aCBhaGVhZCBvZiB0aW1lLgogIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KChlbmQgLSBzdGFydCkgKiAyKTsKICB2YXIgYnVmZmVySW5kZXggPSAwOwoKICAvLyBBIGJpdHdpc2UgT1Igb2YgYWxsIGJ5dGVzIGluIFtieXRlc10uIFRoaXMgYWxsb3dzIHVzIHRvIGNoZWNrIGZvcgogIC8vIG91dC1vZi1yYW5nZSBieXRlcyB3aXRob3V0IGFkZGluZyBtb3JlIGJyYW5jaGVzIHRoYW4gbmVjZXNzYXJ5IHRvIHRoZQogIC8vIGNvcmUgbG9vcC4KICB2YXIgYnl0ZU9yID0gMDsKICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgdmFyIGJ5dGUgPSBieXRlc1tpXTsKICAgIGJ5dGVPciB8PSBieXRlOwoKICAgIC8vIFRoZSBiaXR3aXNlIGFyaXRobWV0aWMgaGVyZSBpcyBlcXVpdmFsZW50IHRvIGBieXRlIH4vIDE2YCBhbmQgYGJ5dGUgJSAxNmAKICAgIC8vIGZvciB2YWxpZCBieXRlIHZhbHVlcywgYnV0IGlzIGVhc2llciBmb3IgZGFydDJqcyB0byBvcHRpbWl6ZSBnaXZlbiB0aGF0CiAgICAvLyBpdCBjYW4ndCBwcm92ZSB0aGF0IFtieXRlXSB3aWxsIGFsd2F5cyBiZSBwb3NpdGl2ZS4KICAgIGJ1ZmZlcltidWZmZXJJbmRleCsrXSA9IF9jb2RlVW5pdEZvckRpZ2l0KChieXRlICYgMHhGMCkgPj4gNCk7CiAgICBidWZmZXJbYnVmZmVySW5kZXgrK10gPSBfY29kZVVuaXRGb3JEaWdpdChieXRlICYgMHgwRik7CiAgfQoKICBpZiAoYnl0ZU9yID49IDAgJiYgYnl0ZU9yIDw9IDI1NSkgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhidWZmZXIpOwoKICAvLyBJZiB0aGVyZSB3YXMgYW4gaW52YWxpZCBieXRlLCBmaW5kIGl0IGFuZCB0aHJvdyBhbiBleGNlcHRpb24uCiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgIHZhciBieXRlID0gYnl0ZXNbaV07CiAgICBpZiAoYnl0ZSA+PSAwICYmIGJ5dGUgPD0gMHhmZikgY29udGludWU7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICJJbnZhbGlkIGJ5dGUgJHtieXRlIDwgMCA/ICItIiA6ICIifTB4JHtieXRlLmFicygpLnRvUmFkaXhTdHJpbmcoMTYpfS4iLAogICAgICAgIGJ5dGVzLAogICAgICAgIGkpOwogIH0KCiAgdGhyb3cgJ3VucmVhY2hhYmxlJzsKfQoKLy8vIFJldHVybnMgdGhlIEFTQ0lJL1VuaWNvZGUgY29kZSB1bml0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGhleGFkZWNpbWFsIGRpZ2l0Ci8vLyBbZGlnaXRdLgppbnQgX2NvZGVVbml0Rm9yRGlnaXQoaW50IGRpZ2l0KSA9PiBkaWdpdCA8IDEwID8gZGlnaXQgKyAkMCA6IGRpZ2l0ICsgJGEgLSAxMDsKWwBOTjwBHQEXGgEmASwpAUMETyA4GAFHAUIhAgE4N0ccAR8BHjEEAUQ6LB8EARETBAIBN09LGzEXAUdLEBImGRQBUU87QzwEAU0BQyYZLR9RDwwEARcCAU8NTwEkcGFja2FnZTpjb252ZXJ0L3NyYy9oZXgvZW5jb2Rlci5kYXJ0OXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb252ZXJ0L2xpYi9zcmMvaGV4L2RlY29kZXIuZGFydJT9Ly8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgY29udmVydC5oZXguZGVjb2RlcjsKCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwoKaW1wb3J0ICcuLi91dGlscy5kYXJ0JzsKCi8vLyBUaGUgY2Fub25pY2FsIGluc3RhbmNlIG9mIFtIZXhEZWNvZGVyXS4KY29uc3QgaGV4RGVjb2RlciA9IGNvbnN0IEhleERlY29kZXIuXygpOwoKLy8vIEEgY29udmVydGVyIHRoYXQgZGVjb2RlcyBoZXhhZGVjaW1hbCBzdHJpbmdzIGludG8gYnl0ZSBhcnJheXMuCi8vLwovLy8gQmVjYXVzZSB0d28gaGV4YWRlY2ltYWwgZGlnaXRzIGNvcnJlc3BvbmQgdG8gYSBzaW5nbGUgYnl0ZSwgdGhpcyB3aWxsIHRocm93Ci8vLyBhIFtGb3JtYXRFeGNlcHRpb25dIGlmIGdpdmVuIGFuIG9kZC1sZW5ndGggc3RyaW5nLiBJdCB3aWxsIGFsc28gdGhyb3cgYQovLy8gW0Zvcm1hdEV4Y2VwdGlvbl0gaWYgZ2l2ZW4gYSBzdHJpbmcgY29udGFpbmluZyBub24taGV4YWRlY2ltYWwgY29kZSB1bml0cy4KY2xhc3MgSGV4RGVjb2RlciBleHRlbmRzIENvbnZlcnRlcjxTdHJpbmcsIExpc3Q8aW50Pj4gewogIGNvbnN0IEhleERlY29kZXIuXygpOwoKICBMaXN0PGludD4gY29udmVydChTdHJpbmcgc3RyaW5nKSB7CiAgICBpZiAoIXN0cmluZy5sZW5ndGguaXNFdmVuKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW52YWxpZCBpbnB1dCBsZW5ndGgsIG11c3QgYmUgZXZlbi4iLCBzdHJpbmcsIHN0cmluZy5sZW5ndGgpOwogICAgfQoKICAgIHZhciBieXRlcyA9IG5ldyBVaW50OExpc3Qoc3RyaW5nLmxlbmd0aCB+LyAyKTsKICAgIF9kZWNvZGUoc3RyaW5nLmNvZGVVbml0cywgMCwgc3RyaW5nLmxlbmd0aCwgYnl0ZXMsIDApOwogICAgcmV0dXJuIGJ5dGVzOwogIH0KCiAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgPT4KICAgICAgbmV3IF9IZXhEZWNvZGVyU2luayhzaW5rKTsKfQoKLy8vIEEgY29udmVyc2lvbiBzaW5rIGZvciBjaHVua2VkIGhleGFkZWNpbWFsIGRlY29kaW5nLgpjbGFzcyBfSGV4RGVjb2RlclNpbmsgZXh0ZW5kcyBTdHJpbmdDb252ZXJzaW9uU2lua0Jhc2UgewogIC8vLyBUaGUgdW5kZXJseWluZyBzaW5rIHRvIHdoaWNoIGRlY29kZWQgYnl0ZSBhcnJheXMgd2lsbCBiZSBwYXNzZWQuCiAgZmluYWwgU2luazxMaXN0PGludD4+IF9zaW5rOwoKICAvLy8gVGhlIHRyYWlsaW5nIGRpZ2l0IGZyb20gdGhlIHByZXZpb3VzIHN0cmluZy4KICAvLy8KICAvLy8gVGhpcyB3aWxsIGJlIG5vbi1gbnVsbGAgaWYgdGhlIG1vc3QgcmVjZW50IHN0cmluZyBoYWQgYW4gb2RkIG51bWJlciBvZgogIC8vLyBoZXhhZGVjaW1hbCBkaWdpdHMuIFNpbmNlIGl0J3MgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXQsIGl0J3MgYWx3YXlzIGEKICAvLy8gbXVsdGlwbGUgb2YgMTYuCiAgaW50IF9sYXN0RGlnaXQ7CgogIF9IZXhEZWNvZGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBhZGRTbGljZShTdHJpbmcgc3RyaW5nLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBzdHJpbmcubGVuZ3RoKTsKCiAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CiAgICAgIGlmIChpc0xhc3QpIF9jbG9zZShzdHJpbmcsIGVuZCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgY29kZVVuaXRzID0gc3RyaW5nLmNvZGVVbml0czsKICAgIFVpbnQ4TGlzdCBieXRlczsKICAgIGludCBieXRlc1N0YXJ0OwogICAgaWYgKF9sYXN0RGlnaXQgPT0gbnVsbCkgewogICAgICBieXRlcyA9IG5ldyBVaW50OExpc3QoKGVuZCAtIHN0YXJ0KSB+LyAyKTsKICAgICAgYnl0ZXNTdGFydCA9IDA7CiAgICB9IGVsc2UgewogICAgICB2YXIgaGV4UGFpcnMgPSAoZW5kIC0gc3RhcnQgLSAxKSB+LyAyOwogICAgICBieXRlcyA9IG5ldyBVaW50OExpc3QoMSArIGhleFBhaXJzKTsKICAgICAgYnl0ZXNbMF0gPSBfbGFzdERpZ2l0ICsgZGlnaXRGb3JDb2RlVW5pdChjb2RlVW5pdHMsIHN0YXJ0KTsKICAgICAgc3RhcnQrKzsKICAgICAgYnl0ZXNTdGFydCA9IDE7CiAgICB9CgogICAgX2xhc3REaWdpdCA9IF9kZWNvZGUoY29kZVVuaXRzLCBzdGFydCwgZW5kLCBieXRlcywgYnl0ZXNTdGFydCk7CgogICAgX3NpbmsuYWRkKGJ5dGVzKTsKICAgIGlmIChpc0xhc3QpIF9jbG9zZShzdHJpbmcsIGVuZCk7CiAgfQoKICBCeXRlQ29udmVyc2lvblNpbmsgYXNVdGY4U2luayhib29sIGFsbG93TWFsZm9ybWVkKSA9PgogICAgICBuZXcgX0hleERlY29kZXJCeXRlU2luayhfc2luayk7CgogIHZvaWQgY2xvc2UoKSA9PiBfY2xvc2UoKTsKCiAgLy8vIExpa2UgW2Nsb3NlXSwgYnV0IGluY2x1ZGVzIFtzdHJpbmddIGFuZCBbaW5kZXhdIGluIHRoZSBbRm9ybWF0RXhjZXB0aW9uXQogIC8vLyBpZiBvbmUgaXMgdGhyb3duLgogIHZvaWQgX2Nsb3NlKFtTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXhdKSB7CiAgICBpZiAoX2xhc3REaWdpdCAhPSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW5wdXQgZW5kZWQgd2l0aCBpbmNvbXBsZXRlIGVuY29kZWQgYnl0ZS4iLCBzdHJpbmcsIGluZGV4KTsKICAgIH0KCiAgICBfc2luay5jbG9zZSgpOwogIH0KfQoKLy8vIEEgY29udmVyc2lvbiBzaW5rIGZvciBjaHVua2VkIGhleGFkZWNpbWFsIGRlY29kaW5nIGZyb20gVVRGLTggYnl0ZXMuCmNsYXNzIF9IZXhEZWNvZGVyQnl0ZVNpbmsgZXh0ZW5kcyBCeXRlQ29udmVyc2lvblNpbmtCYXNlIHsKICAvLy8gVGhlIHVuZGVybHlpbmcgc2luayB0byB3aGljaCBkZWNvZGVkIGJ5dGUgYXJyYXlzIHdpbGwgYmUgcGFzc2VkLgogIGZpbmFsIFNpbms8TGlzdDxpbnQ+PiBfc2luazsKCiAgLy8vIFRoZSB0cmFpbGluZyBkaWdpdCBmcm9tIHRoZSBwcmV2aW91cyBzdHJpbmcuCiAgLy8vCiAgLy8vIFRoaXMgd2lsbCBiZSBub24tYG51bGxgIGlmIHRoZSBtb3N0IHJlY2VudCBzdHJpbmcgaGFkIGFuIG9kZCBudW1iZXIgb2YKICAvLy8gaGV4YWRlY2ltYWwgZGlnaXRzLiBTaW5jZSBpdCdzIHRoZSBtb3N0IHNpZ25pZmljYW50IGRpZ2l0LCBpdCdzIGFsd2F5cyBhCiAgLy8vIG11bHRpcGxlIG9mIDE2LgogIGludCBfbGFzdERpZ2l0OwoKICBfSGV4RGVjb2RlckJ5dGVTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZChMaXN0PGludD4gY2h1bmspID0+IGFkZFNsaWNlKGNodW5rLCAwLCBjaHVuay5sZW5ndGgsIGZhbHNlKTsKCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGNodW5rLmxlbmd0aCk7CgogICAgaWYgKHN0YXJ0ID09IGVuZCkgewogICAgICBpZiAoaXNMYXN0KSBfY2xvc2UoY2h1bmssIGVuZCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBVaW50OExpc3QgYnl0ZXM7CiAgICBpbnQgYnl0ZXNTdGFydDsKICAgIGlmIChfbGFzdERpZ2l0ID09IG51bGwpIHsKICAgICAgYnl0ZXMgPSBuZXcgVWludDhMaXN0KChlbmQgLSBzdGFydCkgfi8gMik7CiAgICAgIGJ5dGVzU3RhcnQgPSAwOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGhleFBhaXJzID0gKGVuZCAtIHN0YXJ0IC0gMSkgfi8gMjsKICAgICAgYnl0ZXMgPSBuZXcgVWludDhMaXN0KDEgKyBoZXhQYWlycyk7CiAgICAgIGJ5dGVzWzBdID0gX2xhc3REaWdpdCArIGRpZ2l0Rm9yQ29kZVVuaXQoY2h1bmssIHN0YXJ0KTsKICAgICAgc3RhcnQrKzsKICAgICAgYnl0ZXNTdGFydCA9IDE7CiAgICB9CgogICAgX2xhc3REaWdpdCA9IF9kZWNvZGUoY2h1bmssIHN0YXJ0LCBlbmQsIGJ5dGVzLCBieXRlc1N0YXJ0KTsKCiAgICBfc2luay5hZGQoYnl0ZXMpOwogICAgaWYgKGlzTGFzdCkgX2Nsb3NlKGNodW5rLCBlbmQpOwogIH0KCiAgdm9pZCBjbG9zZSgpID0+IF9jbG9zZSgpOwoKICAvLy8gTGlrZSBbY2xvc2VdLCBidXQgaW5jbHVkZXMgW2NodW5rXSBhbmQgW2luZGV4XSBpbiB0aGUgW0Zvcm1hdEV4Y2VwdGlvbl0KICAvLy8gaWYgb25lIGlzIHRocm93bi4KICB2b2lkIF9jbG9zZShbTGlzdDxpbnQ+IGNodW5rLCBpbnQgaW5kZXhdKSB7CiAgICBpZiAoX2xhc3REaWdpdCAhPSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW5wdXQgZW5kZWQgd2l0aCBpbmNvbXBsZXRlIGVuY29kZWQgYnl0ZS4iLCBjaHVuaywgaW5kZXgpOwogICAgfQoKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQp9CgovLy8gRGVjb2RlcyBbY29kZVVuaXRzXSBhbmQgd3JpdGVzIHRoZSByZXN1bHQgaW50byBbZGVzdGluYXRpb25dLgovLy8KLy8vIFRoaXMgcmVhZHMgZnJvbSBbY29kZVVuaXRzXSBiZXR3ZWVuIFtzb3VyY2VTdGFydF0gYW5kIFtzb3VyY2VFbmRdLiBJdCB3cml0ZXMKLy8vIHRoZSByZXN1bHQgaW50byBbZGVzdGluYXRpb25dIHN0YXJ0aW5nIGF0IFtkZXN0aW5hdGlvblN0YXJ0XS4KLy8vCi8vLyBJZiB0aGVyZSdzIGEgbGVmdG92ZXIgZGlnaXQgYXQgdGhlIGVuZCBvZiB0aGUgZGVjb2RpbmcsIHRoaXMgcmV0dXJucyB0aGF0Ci8vLyBkaWdpdC4gT3RoZXJ3aXNlIGl0IHJldHVybnMgYG51bGxgLgppbnQgX2RlY29kZShMaXN0PGludD4gY29kZVVuaXRzLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQsCiAgICBMaXN0PGludD4gZGVzdGluYXRpb24sIGludCBkZXN0aW5hdGlvblN0YXJ0KSB7CiAgdmFyIGRlc3RpbmF0aW9uSW5kZXggPSBkZXN0aW5hdGlvblN0YXJ0OwogIGZvciAodmFyIGkgPSBzb3VyY2VTdGFydDsgaSA8IHNvdXJjZUVuZCAtIDE7IGkgKz0gMikgewogICAgdmFyIGZpcnN0RGlnaXQgPSBkaWdpdEZvckNvZGVVbml0KGNvZGVVbml0cywgaSk7CiAgICB2YXIgc2Vjb25kRGlnaXQgPSBkaWdpdEZvckNvZGVVbml0KGNvZGVVbml0cywgaSArIDEpOwogICAgZGVzdGluYXRpb25bZGVzdGluYXRpb25JbmRleCsrXSA9IDE2ICogZmlyc3REaWdpdCArIHNlY29uZERpZ2l0OwogIH0KCiAgaWYgKChzb3VyY2VFbmQgLSBzb3VyY2VTdGFydCkuaXNFdmVuKSByZXR1cm4gbnVsbDsKICByZXR1cm4gMTYgKiBkaWdpdEZvckNvZGVVbml0KGNvZGVVbml0cywgc291cmNlRW5kIC0gMSk7Cn0KgK4ATk48AR0BFxoBGAEsKQFDBFBMTzgYASUhIUkGATM7EgQBRyECATg5Rx8BMwZNTxYSAR8BQjsBGCcOBgEmFRQeMRYNLStCDxYGAUQBFiUEATgmARwBTxgsHiFHBgETBAIBSTtHHwEzBk1PFhIBIwFIAUQ6ARgmDgYBFRQeMRYNLSs+DxYGAUABFiQEARwBThguHiFGBgETBAIBQgRRQgROKEEzKzk1OkUEATU6AgEkcGFja2FnZTpjb252ZXJ0L3NyYy9oZXgvZGVjb2Rlci5kYXJ0PXNka3Jvb3Q6L3RoaXJkX3BhcnR5L3BrZy9jb252ZXJ0L2xpYi9zcmMvcGVyY2VudC9lbmNvZGVyLmRhcnSOJi8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGNvbnZlcnQucGVyY2VudC5lbmNvZGVyOwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwoKaW1wb3J0ICdwYWNrYWdlOmNoYXJjb2RlL2FzY2lpLmRhcnQnOwoKLy8vIFRoZSBjYW5vbmljYWwgaW5zdGFuY2Ugb2YgW1BlcmNlbnRFbmNvZGVyXS4KY29uc3QgcGVyY2VudEVuY29kZXIgPSBjb25zdCBQZXJjZW50RW5jb2Rlci5fKCk7CgovLy8gQSBjb252ZXJ0ZXIgdGhhdCBlbmNvZGVzIGJ5dGUgYXJyYXlzIGludG8gcGVyY2VudC1lbmNvZGVkIHN0cmluZ3MuCi8vLwovLy8gW2VuY29kZXJdIGVuY29kZXMgYWxsIGJ5dGVzIG90aGVyIHRoYW4gQVNDSUkgbGV0dGVycywgZGVjaW1hbCBkaWdpdHMsIG9yIG9uZQovLy8gb2YgYC0uX35gLiBUaGlzIG1hdGNoZXMgdGhlIGJlaGF2aW9yIG9mIFtVcmkuZW5jb2RlUXVlcnlDb21wb25lbnRdIGV4Y2VwdAovLy8gdGhhdCBpdCBkb2Vzbid0IGVuY29kZSBgMHgyMGAgYnl0ZXMgdG8gdGhlIGArYCBjaGFyYWN0ZXIuCi8vLwovLy8gVGhpcyB3aWxsIHRocm93IGEgW1JhbmdlRXJyb3JdIGlmIHRoZSBieXRlIGFycmF5IGhhcyBhbnkgZGlnaXRzIHRoYXQgZG9uJ3QKLy8vIGZpdCBpbiB0aGUgZ2FtdXQgb2YgYSBieXRlLgpjbGFzcyBQZXJjZW50RW5jb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gewogIGNvbnN0IFBlcmNlbnRFbmNvZGVyLl8oKTsKCiAgU3RyaW5nIGNvbnZlcnQoTGlzdDxpbnQ+IGJ5dGVzKSA9PiBfY29udmVydChieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxTdHJpbmc+IHNpbmspID0+CiAgICAgIG5ldyBfUGVyY2VudEVuY29kZXJTaW5rKHNpbmspOwp9CgovLy8gQSBjb252ZXJzaW9uIHNpbmsgZm9yIGNodW5rZWQgcGVyY2VudGFkZWNpbWFsIGVuY29kaW5nLgpjbGFzcyBfUGVyY2VudEVuY29kZXJTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgLy8vIFRoZSB1bmRlcmx5aW5nIHNpbmsgdG8gd2hpY2ggZGVjb2RlZCBieXRlIGFycmF5cyB3aWxsIGJlIHBhc3NlZC4KICBmaW5hbCBTaW5rPFN0cmluZz4gX3Npbms7CgogIF9QZXJjZW50RW5jb2RlclNpbmsodGhpcy5fc2luayk7CgogIHZvaWQgYWRkKExpc3Q8aW50PiBjaHVuaykgewogICAgX3NpbmsuYWRkKF9jb252ZXJ0KGNodW5rLCAwLCBjaHVuay5sZW5ndGgpKTsKICB9CgogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBjaHVuay5sZW5ndGgpOwogICAgX3NpbmsuYWRkKF9jb252ZXJ0KGNodW5rLCBzdGFydCwgZW5kKSk7CiAgICBpZiAoaXNMYXN0KSBfc2luay5jbG9zZSgpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQp9CgpTdHJpbmcgX2NvbnZlcnQoTGlzdDxpbnQ+IGJ5dGVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICB2YXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoKICAvLyBBIGJpdHdpc2UgT1Igb2YgYWxsIGJ5dGVzIGluIFtieXRlc10uIFRoaXMgYWxsb3dzIHVzIHRvIGNoZWNrIGZvcgogIC8vIG91dC1vZi1yYW5nZSBieXRlcyB3aXRob3V0IGFkZGluZyBtb3JlIGJyYW5jaGVzIHRoYW4gbmVjZXNzYXJ5IHRvIHRoZQogIC8vIGNvcmUgbG9vcC4KICB2YXIgYnl0ZU9yID0gMDsKICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgdmFyIGJ5dGUgPSBieXRlc1tpXTsKICAgIGJ5dGVPciB8PSBieXRlOwoKICAgIC8vIElmIHRoZSBieXRlIGlzIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIGNvbnZlcnQgaXQgdG8gbG93ZXJjYXNlIHRvIGNoZWNrIGlmCiAgICAvLyBpdCdzIHVucmVzZXJ2ZWQuIFRoaXMgd29ya3MgYmVjYXVzZSB1cHBlcmNhc2UgbGV0dGVycyBpbiBBU0NJSSBhcmUKICAgIC8vIGV4YWN0bHkgYDBiMTAwMDAwID0gMHgyMGAgbGVzcyB0aGFuIGxvd2VyY2FzZSBsZXR0ZXJzLCBzbyBpZiB3ZSBlbnN1cmUKICAgIC8vIHRoYXQgdGhhdCBiaXQgaXMgMSB3ZSBlbnN1cmUgdGhhdCB0aGUgbGV0dGVyIGlzIGxvd2VyY2FzZS4KICAgIHZhciBsZXR0ZXIgPSAweDIwIHwgYnl0ZTsKICAgIGlmICgobGV0dGVyID49ICRhICYmIGxldHRlciA8PSAkeikgfHwKICAgICAgICAoYnl0ZSA+PSAkMCAmJiBieXRlIDw9ICQ5KSB8fAogICAgICAgIGJ5dGUgPT0gJGRhc2ggfHwKICAgICAgICBieXRlID09ICRkb3QgfHwKICAgICAgICBieXRlID09ICR1bmRlcnNjb3JlIHx8CiAgICAgICAgYnl0ZSA9PSAkdGlsZGUpIHsKICAgICAgLy8gVW5yZXNlcnZlZCBjaGFyYWN0ZXJzIGFyZSBzYWZlIHRvIHdyaXRlIGFzLWlzLgogICAgICBidWZmZXIud3JpdGVDaGFyQ29kZShieXRlKTsKICAgICAgY29udGludWU7CiAgICB9CgogICAgYnVmZmVyLndyaXRlQ2hhckNvZGUoJHBlcmNlbnQpOwoKICAgIC8vIFRoZSBiaXR3aXNlIGFyaXRobWV0aWMgaGVyZSBpcyBlcXVpdmFsZW50IHRvIGBieXRlIH4vIDE2YCBhbmQgYGJ5dGUgJSAxNmAKICAgIC8vIGZvciB2YWxpZCBieXRlIHZhbHVlcywgYnV0IGlzIGVhc2llciBmb3IgZGFydDJqcyB0byBvcHRpbWl6ZSBnaXZlbiB0aGF0CiAgICAvLyBpdCBjYW4ndCBwcm92ZSB0aGF0IFtieXRlXSB3aWxsIGFsd2F5cyBiZSBwb3NpdGl2ZS4KICAgIGJ1ZmZlci53cml0ZUNoYXJDb2RlKF9jb2RlVW5pdEZvckRpZ2l0KChieXRlICYgMHhGMCkgPj4gNCkpOwogICAgYnVmZmVyLndyaXRlQ2hhckNvZGUoX2NvZGVVbml0Rm9yRGlnaXQoYnl0ZSAmIDB4MEYpKTsKICB9CgogIGlmIChieXRlT3IgPj0gMCAmJiBieXRlT3IgPD0gMjU1KSByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CgogIC8vIElmIHRoZXJlIHdhcyBhbiBpbnZhbGlkIGJ5dGUsIGZpbmQgaXQgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4KICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgdmFyIGJ5dGUgPSBieXRlc1tpXTsKICAgIGlmIChieXRlID49IDAgJiYgYnl0ZSA8PSAweGZmKSBjb250aW51ZTsKICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgIkludmFsaWQgYnl0ZSAke2J5dGUgPCAwID8gIi0iIDogIiJ9MHgke2J5dGUuYWJzKCkudG9SYWRpeFN0cmluZygxNil9LiIsCiAgICAgICAgYnl0ZXMsCiAgICAgICAgaSk7CiAgfQoKICB0aHJvdyAndW5yZWFjaGFibGUnOwp9CgovLy8gUmV0dXJucyB0aGUgQVNDSUkvVW5pY29kZSBjb2RlIHVuaXQgY29ycmVzcG9uZGluZyB0byB0aGUgaGV4YWRlY2ltYWwgZGlnaXQKLy8vIFtkaWdpdF0uCmludCBfY29kZVVuaXRGb3JEaWdpdChpbnQgZGlnaXQpID0+IGRpZ2l0IDwgMTAgPyBkaWdpdCArICQwIDogZGlnaXQgKyAkQSAtIDEwOwpsAE5OPAEhARcBJgEwMQFHBFFOPgRPIDwcAUcBQiUCATw7RxwBIwEeMQQBRDosHwQBERMEAgE3IwFHSxASJhkUAU9KTkIeKiYZGB8aOCIQBgEkAVFPO0E6BAE+AUMmGS0fUQ8MBAEXAgFPDU8BKHBhY2thZ2U6Y29udmVydC9zcmMvcGVyY2VudC9lbmNvZGVyLmRhcnQ9c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL2NvbnZlcnQvbGliL3NyYy9wZXJjZW50L2RlY29kZXIuZGFydJ3sLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgY29udmVydC5wZXJjZW50LmRlY29kZXI7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CgppbXBvcnQgJ3BhY2thZ2U6Y2hhcmNvZGUvYXNjaWkuZGFydCc7CmltcG9ydCAncGFja2FnZTp0eXBlZF9kYXRhL3R5cGVkX2RhdGEuZGFydCc7CgppbXBvcnQgJy4uL3V0aWxzLmRhcnQnOwoKLy8vIFRoZSBjYW5vbmljYWwgaW5zdGFuY2Ugb2YgW1BlcmNlbnREZWNvZGVyXS4KY29uc3QgcGVyY2VudERlY29kZXIgPSBjb25zdCBQZXJjZW50RGVjb2Rlci5fKCk7Cgpjb25zdCBfbGFzdFBlcmNlbnQgPSAtMTsKCi8vLyBBIGNvbnZlcnRlciB0aGF0IGRlY29kZXMgcGVyY2VudC1lbmNvZGVkIHN0cmluZ3MgaW50byBieXRlIGFycmF5cy4KLy8vCi8vLyBUbyBiZSBtYXhpbWFsbHkgZmxleGlibGUsIHRoaXMgd2lsbCBkZWNvZGUgYW55IHBlcmNlbnQtZW5jb2RlZCBieXRlIGFuZAovLy8gd2lsbCBhbGxvdyBhbnkgbm9uLXBlcmNlbnQtZW5jb2RlZCBieXRlIG90aGVyIHRoYW4gYCVgLiBCeSBkZWZhdWx0LCBpdAovLy8gaW50ZXJwcmV0cyBgK2AgYXMgYDB4MkJgIHJhdGhlciB0aGFuIGAweDIwYCBhcyBlbWl0dGVkIGJ5Ci8vLyBbVXJpLmVuY29kZVF1ZXJ5Q29tcG9uZW50XS4KLy8vCi8vLyBUaGlzIHdpbGwgdGhyb3cgYSBbRm9ybWF0RXhjZXB0aW9uXSBpZiB0aGUgaW5wdXQgc3RyaW5nIGhhcyBhbiBpbmNvbXBsZXRlCi8vLyBwZXJjZW50LWVuY29kaW5nLCBvciBpZiBpdCBjb250YWlucyBub24tQVNDSUkgY29kZSB1bml0cy4KY2xhc3MgUGVyY2VudERlY29kZXIgZXh0ZW5kcyBDb252ZXJ0ZXI8U3RyaW5nLCBMaXN0PGludD4+IHsKICBjb25zdCBQZXJjZW50RGVjb2Rlci5fKCk7CgogIExpc3Q8aW50PiBjb252ZXJ0KFN0cmluZyBzdHJpbmcpIHsKICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhCdWZmZXIoKTsKICAgIHZhciBsYXN0RGlnaXQgPSBfZGVjb2RlKHN0cmluZy5jb2RlVW5pdHMsIDAsIHN0cmluZy5sZW5ndGgsIGJ1ZmZlcik7CgogICAgaWYgKGxhc3REaWdpdCAhPSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW5wdXQgZW5kZWQgd2l0aCBpbmNvbXBsZXRlIGVuY29kZWQgYnl0ZS4iLCBzdHJpbmcsIHN0cmluZy5sZW5ndGgpOwogICAgfQoKICAgIHJldHVybiBidWZmZXIuYnVmZmVyLmFzVWludDhMaXN0KDAsIGJ1ZmZlci5sZW5ndGgpOwogIH0KCiAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgPT4KICAgICAgbmV3IF9QZXJjZW50RGVjb2RlclNpbmsoc2luayk7Cn0KCi8vLyBBIGNvbnZlcnNpb24gc2luayBmb3IgY2h1bmtlZCBwZXJjZW50LWVuY29kZWQgZGVjb2RpbmcuCmNsYXNzIF9QZXJjZW50RGVjb2RlclNpbmsgZXh0ZW5kcyBTdHJpbmdDb252ZXJzaW9uU2lua0Jhc2UgewogIC8vLyBUaGUgdW5kZXJseWluZyBzaW5rIHRvIHdoaWNoIGRlY29kZWQgYnl0ZSBhcnJheXMgd2lsbCBiZSBwYXNzZWQuCiAgZmluYWwgU2luazxMaXN0PGludD4+IF9zaW5rOwoKICAvLy8gVGhlIHRyYWlsaW5nIGRpZ2l0IGZyb20gdGhlIHByZXZpb3VzIHN0cmluZy4KICAvLy8KICAvLy8gVGhpcyBpcyBgbnVsbGAgaWYgdGhlIHByZXZpb3VzIHN0cmluZyBlbmRlZCB3aXRoIGEgY29tcGxldGUKICAvLy8gcGVyY2VudC1lbmNvZGVkIGJ5dGUgb3IgYSBsaXRlcmFsIGNoYXJhY3Rlci4gSXQncyBbX2xhc3RQZXJjZW50XSBpZiB0aGUKICAvLy8gbW9zdCByZWNlbnQgc3RyaW5nIGVuZGVkIHdpdGggYCVgLiBPdGhlcndpc2UsIHRoZSBtb3N0IHJlY2VudCBzdHJpbmcgZW5kZWQKICAvLy8gd2l0aCBhIGAlYCBmb2xsb3dlZCBieSBhIGhleGFkZWNpbWFsIGRpZ2l0LCBhbmQgdGhpcyBpcyB0aGF0IGRpZ2l0LiBTaW5jZQogIC8vLyBpdCdzIHRoZSBtb3N0IHNpZ25pZmljYW50IGRpZ2l0LCBpdCdzIGFsd2F5cyBhIG11bHRpcGxlIG9mIDE2LgogIGludCBfbGFzdERpZ2l0OwoKICBfUGVyY2VudERlY29kZXJTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZFNsaWNlKFN0cmluZyBzdHJpbmcsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHN0cmluZy5sZW5ndGgpOwoKICAgIGlmIChzdGFydCA9PSBlbmQpIHsKICAgICAgaWYgKGlzTGFzdCkgX2Nsb3NlKHN0cmluZywgZW5kKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhCdWZmZXIoKTsKICAgIHZhciBjb2RlVW5pdHMgPSBzdHJpbmcuY29kZVVuaXRzOwogICAgaWYgKF9sYXN0RGlnaXQgPT0gX2xhc3RQZXJjZW50KSB7CiAgICAgIF9sYXN0RGlnaXQgPSAxNiAqIGRpZ2l0Rm9yQ29kZVVuaXQoY29kZVVuaXRzLCBzdGFydCk7CiAgICAgIHN0YXJ0Kys7CgogICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CiAgICAgICAgaWYgKGlzTGFzdCkgX2Nsb3NlKHN0cmluZywgZW5kKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBpZiAoX2xhc3REaWdpdCAhPSBudWxsKSB7CiAgICAgIGJ1ZmZlci5hZGQoX2xhc3REaWdpdCArIGRpZ2l0Rm9yQ29kZVVuaXQoY29kZVVuaXRzLCBzdGFydCkpOwogICAgICBzdGFydCsrOwogICAgfQoKICAgIF9sYXN0RGlnaXQgPSBfZGVjb2RlKGNvZGVVbml0cywgc3RhcnQsIGVuZCwgYnVmZmVyKTsKCiAgICBfc2luay5hZGQoYnVmZmVyLmJ1ZmZlci5hc1VpbnQ4TGlzdCgwLCBidWZmZXIubGVuZ3RoKSk7CiAgICBpZiAoaXNMYXN0KSBfY2xvc2Uoc3RyaW5nLCBlbmQpOwogIH0KCiAgQnl0ZUNvbnZlcnNpb25TaW5rIGFzVXRmOFNpbmsoYm9vbCBhbGxvd01hbGZvcm1lZCkgPT4KICAgICAgbmV3IF9QZXJjZW50RGVjb2RlckJ5dGVTaW5rKF9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpID0+IF9jbG9zZSgpOwoKICAvLy8gTGlrZSBbY2xvc2VdLCBidXQgaW5jbHVkZXMgW3N0cmluZ10gYW5kIFtpbmRleF0gaW4gdGhlIFtGb3JtYXRFeGNlcHRpb25dCiAgLy8vIGlmIG9uZSBpcyB0aHJvd24uCiAgdm9pZCBfY2xvc2UoW1N0cmluZyBzdHJpbmcsIGludCBpbmRleF0pIHsKICAgIGlmIChfbGFzdERpZ2l0ICE9IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICJJbnB1dCBlbmRlZCB3aXRoIGluY29tcGxldGUgZW5jb2RlZCBieXRlLiIsIHN0cmluZywgaW5kZXgpOwogICAgfQoKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQp9CgovLy8gQSBjb252ZXJzaW9uIHNpbmsgZm9yIGNodW5rZWQgcGVyY2VudC1lbmNvZGVkIGRlY29kaW5nIGZyb20gVVRGLTggYnl0ZXMuCmNsYXNzIF9QZXJjZW50RGVjb2RlckJ5dGVTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgLy8vIFRoZSB1bmRlcmx5aW5nIHNpbmsgdG8gd2hpY2ggZGVjb2RlZCBieXRlIGFycmF5cyB3aWxsIGJlIHBhc3NlZC4KICBmaW5hbCBTaW5rPExpc3Q8aW50Pj4gX3Npbms7CgogIC8vLyBUaGUgdHJhaWxpbmcgZGlnaXQgZnJvbSB0aGUgcHJldmlvdXMgc3RyaW5nLgogIC8vLwogIC8vLyBUaGlzIGlzIGBudWxsYCBpZiB0aGUgcHJldmlvdXMgc3RyaW5nIGVuZGVkIHdpdGggYSBjb21wbGV0ZQogIC8vLyBwZXJjZW50LWVuY29kZWQgYnl0ZSBvciBhIGxpdGVyYWwgY2hhcmFjdGVyLiBJdCdzIFtfbGFzdFBlcmNlbnRdIGlmIHRoZQogIC8vLyBtb3N0IHJlY2VudCBzdHJpbmcgZW5kZWQgd2l0aCBgJWAuIE90aGVyd2lzZSwgdGhlIG1vc3QgcmVjZW50IHN0cmluZyBlbmRlZAogIC8vLyB3aXRoIGEgYCVgIGZvbGxvd2VkIGJ5IGEgaGV4YWRlY2ltYWwgZGlnaXQsIGFuZCB0aGlzIGlzIHRoYXQgZGlnaXQuIFNpbmNlCiAgLy8vIGl0J3MgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXQsIGl0J3MgYWx3YXlzIGEgbXVsdGlwbGUgb2YgMTYuCiAgaW50IF9sYXN0RGlnaXQ7CgogIF9QZXJjZW50RGVjb2RlckJ5dGVTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZChMaXN0PGludD4gY2h1bmspID0+IGFkZFNsaWNlKGNodW5rLCAwLCBjaHVuay5sZW5ndGgsIGZhbHNlKTsKCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGNodW5rLmxlbmd0aCk7CgogICAgaWYgKHN0YXJ0ID09IGVuZCkgewogICAgICBpZiAoaXNMYXN0KSBfY2xvc2UoY2h1bmssIGVuZCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QnVmZmVyKCk7CiAgICBpZiAoX2xhc3REaWdpdCA9PSBfbGFzdFBlcmNlbnQpIHsKICAgICAgX2xhc3REaWdpdCA9IDE2ICogZGlnaXRGb3JDb2RlVW5pdChjaHVuaywgc3RhcnQpOwogICAgICBzdGFydCsrOwoKICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewogICAgICAgIGlmIChpc0xhc3QpIF9jbG9zZShjaHVuaywgZW5kKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBpZiAoX2xhc3REaWdpdCAhPSBudWxsKSB7CiAgICAgIGJ1ZmZlci5hZGQoX2xhc3REaWdpdCArIGRpZ2l0Rm9yQ29kZVVuaXQoY2h1bmssIHN0YXJ0KSk7CiAgICAgIHN0YXJ0Kys7CiAgICB9CgogICAgX2xhc3REaWdpdCA9IF9kZWNvZGUoY2h1bmssIHN0YXJ0LCBlbmQsIGJ1ZmZlcik7CgogICAgX3NpbmsuYWRkKGJ1ZmZlci5idWZmZXIuYXNVaW50OExpc3QoMCwgYnVmZmVyLmxlbmd0aCkpOwogICAgaWYgKGlzTGFzdCkgX2Nsb3NlKGNodW5rLCBlbmQpOwogIH0KCiAgdm9pZCBjbG9zZSgpID0+IF9jbG9zZSgpOwoKICAvLy8gTGlrZSBbY2xvc2VdLCBidXQgaW5jbHVkZXMgW2NodW5rXSBhbmQgW2luZGV4XSBpbiB0aGUgW0Zvcm1hdEV4Y2VwdGlvbl0KICAvLy8gaWYgb25lIGlzIHRocm93bi4KICB2b2lkIF9jbG9zZShbTGlzdDxpbnQ+IGNodW5rLCBpbnQgaW5kZXhdKSB7CiAgICBpZiAoX2xhc3REaWdpdCAhPSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW5wdXQgZW5kZWQgd2l0aCBpbmNvbXBsZXRlIGVuY29kZWQgYnl0ZS4iLCBjaHVuaywgaW5kZXgpOwogICAgfQoKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQp9CgovLy8gRGVjb2RlcyBbY29kZVVuaXRzXSBhbmQgd3JpdGVzIHRoZSByZXN1bHQgaW50byBbZGVzdGluYXRpb25dLgovLy8KLy8vIFRoaXMgcmVhZHMgZnJvbSBbY29kZVVuaXRzXSBiZXR3ZWVuIFtzb3VyY2VTdGFydF0gYW5kIFtzb3VyY2VFbmRdLiBJdCB3cml0ZXMKLy8vIHRoZSByZXN1bHQgaW50byBbZGVzdGluYXRpb25dIHN0YXJ0aW5nIGF0IFtkZXN0aW5hdGlvblN0YXJ0XS4KLy8vCi8vLyBJZiB0aGVyZSdzIGEgbGVmdG92ZXIgZGlnaXQgYXQgdGhlIGVuZCBvZiB0aGUgZGVjb2RpbmcsIHRoaXMgcmV0dXJucyB0aGF0Ci8vLyBkaWdpdC4gT3RoZXJ3aXNlIGl0IHJldHVybnMgYG51bGxgLgppbnQgX2RlY29kZShMaXN0PGludD4gY29kZVVuaXRzLCBpbnQgc3RhcnQsIGludCBlbmQsIFVpbnQ4QnVmZmVyIGJ1ZmZlcikgewogIC8vIEEgYml0d2lzZSBPUiBvZiBhbGwgY29kZSB1bml0cyBpbiBbY29kZVVuaXRzXS4gVGhpcyBhbGxvd3MgdXMgdG8gY2hlY2sgZm9yCiAgLy8gb3V0LW9mLXJhbmdlIGNvZGUgdW5pdHMgd2l0aG91dCBhZGRpbmcgbW9yZSBicmFuY2hlcyB0aGFuIG5lY2Vzc2FyeSB0byB0aGUKICAvLyBjb3JlIGxvb3AuCiAgdmFyIGNvZGVVbml0T3IgPSAwOwoKICAvLyBUaGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IHNsaWNlIG9mIGFkamFjZW50IG5vbi0lIGNoYXJhY3RlcnMuIFdlIGNhbiBhZGQKICAvLyBhbGwgb2YgdGhlc2UgdG8gdGhlIGJ1ZmZlciBhdCBvbmNlLgogIHZhciBzbGljZVN0YXJ0ID0gc3RhcnQ7CiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgIC8vIEZpcnN0LCBsb29wIHRocm91Z2ggbm9uLSUgY2hhcmFjdGVycy4KICAgIHZhciBjb2RlVW5pdCA9IGNvZGVVbml0c1tpXTsKICAgIGlmIChjb2RlVW5pdHNbaV0gIT0gJHBlcmNlbnQpIHsKICAgICAgY29kZVVuaXRPciB8PSBjb2RlVW5pdDsKICAgICAgY29udGludWU7CiAgICB9CgogICAgLy8gV2UgZm91bmQgYSAlLiBUaGUgc2xpY2UgZnJvbSBgc2xpY2VTdGFydGAgdG8gYGlgIHJlcHJlc2VudHMgY2hhcmFjdGVycwogICAgLy8gdGhhbiBjYW4gYmUgY29waWVkIHRvIHRoZSBidWZmZXIgYXMtaXMuCiAgICBpZiAoaSA+IHNsaWNlU3RhcnQpIHsKICAgICAgX2NoZWNrRm9ySW52YWxpZENvZGVVbml0KGNvZGVVbml0T3IsIGNvZGVVbml0cywgc2xpY2VTdGFydCwgaSk7CiAgICAgIGJ1ZmZlci5hZGRBbGwoY29kZVVuaXRzLCBzbGljZVN0YXJ0LCBpKTsKICAgIH0KCiAgICAvLyBOb3cgZGVjb2RlIHRoZSBwZXJjZW50LWVuY29kZWQgYnl0ZSBhbmQgYWRkIGl0IGFzIHdlbGwuCiAgICBpKys7CiAgICBpZiAoaSA+PSBlbmQpIHJldHVybiBfbGFzdFBlcmNlbnQ7CgogICAgdmFyIGZpcnN0RGlnaXQgPSBkaWdpdEZvckNvZGVVbml0KGNvZGVVbml0cywgaSk7CiAgICBpKys7CiAgICBpZiAoaSA+PSBlbmQpIHJldHVybiAxNiAqIGZpcnN0RGlnaXQ7CgogICAgdmFyIHNlY29uZERpZ2l0ID0gZGlnaXRGb3JDb2RlVW5pdChjb2RlVW5pdHMsIGkpOwogICAgYnVmZmVyLmFkZCgxNiAqIGZpcnN0RGlnaXQgKyBzZWNvbmREaWdpdCk7CgogICAgLy8gVGhlIG5leHQgaXRlcmF0aW9uIHdpbGwgbG9vayBmb3Igbm9uLSUgY2hhcmFjdGVycyBhZ2Fpbi4KICAgIHNsaWNlU3RhcnQgPSBpICsgMTsKICB9CgogIGlmIChlbmQgPiBzbGljZVN0YXJ0KSB7CiAgICBfY2hlY2tGb3JJbnZhbGlkQ29kZVVuaXQoY29kZVVuaXRPciwgY29kZVVuaXRzLCBzbGljZVN0YXJ0LCBlbmQpOwogICAgaWYgKHN0YXJ0ID09IHNsaWNlU3RhcnQpIHsKICAgICAgYnVmZmVyLmFkZEFsbChjb2RlVW5pdHMpOwogICAgfSBlbHNlIHsKICAgICAgYnVmZmVyLmFkZEFsbChjb2RlVW5pdHMsIHNsaWNlU3RhcnQsIGVuZCk7CiAgICB9CiAgfQoKICByZXR1cm4gbnVsbDsKfQoKdm9pZCBfY2hlY2tGb3JJbnZhbGlkQ29kZVVuaXQoCiAgICBpbnQgY29kZVVuaXRPciwgTGlzdDxpbnQ+IGNvZGVVbml0cywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgaWYgKGNvZGVVbml0T3IgPj0gMCAmJiBjb2RlVW5pdE9yIDw9IDB4N2YpIHJldHVybjsKCiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgIHZhciBjb2RlVW5pdCA9IGNvZGVVbml0c1tpXTsKICAgIGlmIChjb2RlVW5pdCA+PSAwICYmIGNvZGVVbml0IDw9IDB4N2YpIGNvbnRpbnVlOwogICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAiTm9uLUFTQ0lJIGNvZGUgdW5pdCAiCiAgICAgICAgIlUrJHtjb2RlVW5pdC50b1JhZGl4U3RyaW5nKDE2KS5wYWRMZWZ0KDQsICcwJyl9IiwKICAgICAgICBjb2RlVW5pdHMsCiAgICAgICAgaSk7CiAgfQp9CoD2AE5OPAEhARcBJi0BGAEwMQEZAUcETEs+IAROPjwcASUkSQEdIU8GATgEAUclAgE8PUcfATMGQk5RUEUSASMBQjsBGCcOBgEkJiY8DwEaKRAIBgEeQw8GATkBPCUEATgqARwBTxgsHiFHBgETBAIBTT9HHwEzBkJOUVBFEgEnAUgBRDoBGCYOBgEkJjgPARooEAgGAR4/DwYBNQE8JAQBHAFOGC4eIUYGARMEAgFCBFFCBE4oS1BQEBYBUSkaJi0hJB4QBgFOLxpGLwYBPwknATUJKgE2LwFAGAQBGkYfIA0xBgQBDwIBHz81ASYhNR8fOxMMBAIBKHBhY2thZ2U6Y29udmVydC9zcmMvcGVyY2VudC9kZWNvZGVyLmRhcnQ6c2Rrcm9vdDovdGhpcmRfcGFydHkvcGtnL3R5cGVkX2RhdGEvbGliL3R5cGVkX2J1ZmZlcnMuZGFydLPPLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBHcm93YWJsZSB0eXBlZC1kYXRhIGxpc3RzLgovLy8KLy8vIFRoZXNlIGxpc3RzIHdvcmtzIGp1c3QgYXMgYSB0eXBlZC1kYXRhIGxpc3QsIGV4Y2VwdCB0aGF0IHRoZXkgYXJlIGdyb3dhYmxlLgovLy8gVGhleSB1c2UgYW4gdW5kZXJseWluZyBidWZmZXIsIGFuZCB3aGVuIHRoYXQgYnVmZmVyIGJlY29tZXMgdG9vIHNtYWxsLCBpdAovLy8gaXMgcmVwbGFjZWQgYnkgYSBuZXcgYnVmZmVyLgovLy8KLy8vIFRoYXQgbWVhbnMgdGhhdCB1c2luZyB0aGUgW1R5cGVkRGF0YVZpZXcuYnVmZmVyXSBnZXR0ZXIgaXMgbm90IGd1YXJhbnRlZWQKLy8vIHRvIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZWFjaCB0aW1lIGl0IGlzIHVzZWQsIGFuZCB0aGF0IHRoZSBidWZmZXIgbWF5Ci8vLyBiZSBsYXJnZXIgdGhhbiB3aGF0IHRoZSBsaXN0IGlzIHVzaW5nLgpsaWJyYXJ5IHR5cGVkX2RhdGEudHlwZWRfYnVmZmVyczsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIiBzaG93IExpc3RCYXNlOwppbXBvcnQgImRhcnQ6dHlwZWRfZGF0YSI7CgphYnN0cmFjdCBjbGFzcyBfVHlwZWREYXRhQnVmZmVyPEU+IGV4dGVuZHMgTGlzdEJhc2U8RT4gewogIHN0YXRpYyBjb25zdCBpbnQgSU5JVElBTF9MRU5HVEggPSA4OwoKICAvLy8gVGhlIHVuZGVybHlpbmcgZGF0YSBidWZmZXIuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYWx3YXlzIGJvdGggYSBMaXN0PEU+IGFuZCBhIFR5cGVkRGF0YSwgd2hpY2ggd2UgZG9uJ3QgaGF2ZSBhIHR5cGUKICAvLy8gZm9yIGhlcmUuIEZvciBleGFtcGxlLCBmb3IgYSBgVWludDhCdWZmZXJgLCB0aGlzIGlzIGEgYFVpbnQ4TGlzdGAuCiAgTGlzdDxFPiBfYnVmZmVyOwoKICAvLy8gUmV0dXJucyBhIHZpZXcgb2YgW19idWZmZXJdIGFzIGEgW1R5cGVkRGF0YV0uCiAgVHlwZWREYXRhIGdldCBfdHlwZWRCdWZmZXIgPT4gX2J1ZmZlciBhcyBUeXBlZERhdGE7CgogIC8vLyBUaGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGJlaW5nIGJ1aWx0LgogIGludCBfbGVuZ3RoOwoKICBfVHlwZWREYXRhQnVmZmVyKExpc3Q8RT4gYnVmZmVyKQogICAgICA6IHRoaXMuX2J1ZmZlciA9IGJ1ZmZlciwKICAgICAgICB0aGlzLl9sZW5ndGggPSBidWZmZXIubGVuZ3RoOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbGVuZ3RoOwogIEUgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPj0gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcyk7CiAgICByZXR1cm4gX2J1ZmZlcltpbmRleF07CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEUgdmFsdWUpIHsKICAgIGlmIChpbmRleCA+PSBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzKTsKICAgIF9idWZmZXJbaW5kZXhdID0gdmFsdWU7CiAgfQoKICB2b2lkIHNldCBsZW5ndGgoaW50IG5ld0xlbmd0aCkgewogICAgaWYgKG5ld0xlbmd0aCA8IF9sZW5ndGgpIHsKICAgICAgRSBkZWZhdWx0VmFsdWUgPSBfZGVmYXVsdFZhbHVlOwogICAgICBmb3IgKGludCBpID0gbmV3TGVuZ3RoOyBpIDwgX2xlbmd0aDsgaSsrKSB7CiAgICAgICAgX2J1ZmZlcltpXSA9IGRlZmF1bHRWYWx1ZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChuZXdMZW5ndGggPiBfYnVmZmVyLmxlbmd0aCkgewogICAgICBMaXN0PEU+IG5ld0J1ZmZlcjsKICAgICAgaWYgKF9idWZmZXIubGVuZ3RoID09IDApIHsKICAgICAgICBuZXdCdWZmZXIgPSBfY3JlYXRlQnVmZmVyKG5ld0xlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmV3QnVmZmVyID0gX2NyZWF0ZUJpZ2dlckJ1ZmZlcihuZXdMZW5ndGgpOwogICAgICB9CiAgICAgIG5ld0J1ZmZlci5zZXRSYW5nZSgwLCBfbGVuZ3RoLCBfYnVmZmVyKTsKICAgICAgX2J1ZmZlciA9IG5ld0J1ZmZlcjsKICAgIH0KICAgIF9sZW5ndGggPSBuZXdMZW5ndGg7CiAgfQoKICB2b2lkIF9hZGQoRSB2YWx1ZSkgewogICAgaWYgKF9sZW5ndGggPT0gX2J1ZmZlci5sZW5ndGgpIF9ncm93KF9sZW5ndGgpOwogICAgX2J1ZmZlcltfbGVuZ3RoKytdID0gdmFsdWU7CiAgfQoKICAvLyBXZSBvdmVycmlkZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgYWRkYCBiZWNhdXNlIGl0IGdyb3dzIHRoZSBsaXN0CiAgLy8gYnkgc2V0dGluZyB0aGUgbGVuZ3RoIGluIGluY3JlbWVudHMgb2Ygb25lLiBXZSB3YW50IHRvIGdyb3cgYnkgZG91YmxpbmcKICAvLyBjYXBhY2l0eSBpbiBtb3N0IGNhc2VzLgogIHZvaWQgYWRkKEUgdmFsdWUpIHsKICAgIF9hZGQodmFsdWUpOwogIH0KCiAgLy8vIEFwcGVuZHMgYWxsIG9iamVjdHMgb2YgW3ZhbHVlc10gdG8gdGhlIGVuZCBvZiB0aGlzIGJ1ZmZlci4KICAvLy8KICAvLy8gVGhpcyBhZGRzIHZhbHVlcyBmcm9tIFtzdGFydF0gKGluY2x1c2l2ZSkgdG8gW2VuZF0gKGV4Y2x1c2l2ZSkgaW4KICAvLy8gW3ZhbHVlc10uIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGFkZGluZyBhbGwgZWxlbWVudHMgb2YKICAvLy8gW3ZhbHVlc10gYWZ0ZXIgW3N0YXJ0XS4KICAvLy8KICAvLy8gVGhlIFtzdGFydF0gdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUuIFRoZSBbdmFsdWVzXSBpdGVyYWJsZSBtdXN0IGhhdmUgYXQKICAvLy8gbGVhc3QgW3N0YXJ0XSBlbGVtZW50cywgYW5kIGlmIFtlbmRdIGlzIHNwZWNpZmllZCwgaXQgbXVzdCBiZSBncmVhdGVyIHRoYW4KICAvLy8gb3IgZXF1YWwgdG8gW3N0YXJ0XSBhbmQgW3ZhbHVlc10gbXVzdCBoYXZlIGF0IGxlYXN0IFtlbmRdIGVsZW1lbnRzLgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IHZhbHVlcywgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUoc3RhcnQsICJzdGFydCIpOwogICAgaWYgKGVuZCAhPSBudWxsICYmIHN0YXJ0ID4gZW5kKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGVuZCwgc3RhcnQsIG51bGwsICJlbmQiKTsKICAgIH0KCiAgICBfYWRkQWxsKHZhbHVlcywgc3RhcnQsIGVuZCk7CiAgfQoKICAvLy8gSW5zZXJ0cyBhbGwgb2JqZWN0cyBvZiBbdmFsdWVzXSBhdCBwb3NpdGlvbiBbaW5kZXhdIGluIHRoaXMgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBhZGRzIHZhbHVlcyBmcm9tIFtzdGFydF0gKGluY2x1c2l2ZSkgdG8gW2VuZF0gKGV4Y2x1c2l2ZSkgaW4KICAvLy8gW3ZhbHVlc10uIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGFkZGluZyBhbGwgZWxlbWVudHMgb2YKICAvLy8gW3ZhbHVlc10gYWZ0ZXIgW3N0YXJ0XS4KICAvLy8KICAvLy8gVGhlIFtzdGFydF0gdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUuIFRoZSBbdmFsdWVzXSBpdGVyYWJsZSBtdXN0IGhhdmUgYXQKICAvLy8gbGVhc3QgW3N0YXJ0XSBlbGVtZW50cywgYW5kIGlmIFtlbmRdIGlzIHNwZWNpZmllZCwgaXQgbXVzdCBiZSBncmVhdGVyIHRoYW4KICAvLy8gb3IgZXF1YWwgdG8gW3N0YXJ0XSBhbmQgW3ZhbHVlc10gbXVzdCBoYXZlIGF0IGxlYXN0IFtlbmRdIGVsZW1lbnRzLgogIHZvaWQgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8RT4gdmFsdWVzLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZEluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiLCBfbGVuZ3RoICsgMSk7CiAgICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUoc3RhcnQsICJzdGFydCIpOwogICAgaWYgKGVuZCAhPSBudWxsKSB7CiAgICAgIGlmIChzdGFydCA+IGVuZCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGVuZCwgc3RhcnQsIG51bGwsICJlbmQiKTsKICAgICAgfQogICAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm47CiAgICB9CgogICAgLy8gSWYgd2UncmUgYWRkaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgYW55d2F5LCB1c2UgW19hZGRBbGxdLiBUaGlzIGxldHMKICAgIC8vIHVzIGF2b2lkIGNvbnZlcnRpbmcgW3ZhbHVlc10gaW50byBhIGxpc3QgZXZlbiBpZiBbZW5kXSBpcyBudWxsLCBzaW5jZSB3ZQogICAgLy8gY2FuIGFkZCB2YWx1ZXMgaXRlcmF0aXZlbHkgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gV2UgY2FuJ3QgZG8gc28gaW4gdGhlCiAgICAvLyBjZW50ZXIgYmVjYXVzZSBjb3B5aW5nIHRoZSB0cmFpbGluZyBlbGVtZW50cyBldmVyeSB0aW1lIGlzIG5vbi1saW5lYXIuCiAgICBpZiAoaW5kZXggPT0gX2xlbmd0aCkgewogICAgICBfYWRkQWxsKHZhbHVlcywgc3RhcnQsIGVuZCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoZW5kID09IG51bGwgJiYgdmFsdWVzIGlzIExpc3QpIHsKICAgICAgZW5kID0gdmFsdWVzLmxlbmd0aDsKICAgIH0KICAgIGlmIChlbmQgIT0gbnVsbCkgewogICAgICBfaW5zZXJ0S25vd25MZW5ndGgoaW5kZXgsIHZhbHVlcywgc3RhcnQsIGVuZCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBBZGQgZWxlbWVudHMgYXQgZW5kLCBncm93aW5nIGFzIGFwcHJvcHJpYXRlLCB0aGVuIHB1dCB0aGVtIGJhY2sgYXQKICAgIC8vIHBvc2l0aW9uIFtpbmRleF0gdXNpbmcgZmxpcC1ieS1kb3VibGUtcmV2ZXJzZS4KICAgIHZhciB3cml0ZUluZGV4ID0gX2xlbmd0aDsKICAgIHZhciBza2lwQ291bnQgPSBzdGFydDsKICAgIGZvciAodmFyIHZhbHVlIGluIHZhbHVlcykgewogICAgICBpZiAoc2tpcENvdW50ID4gMCkgewogICAgICAgIHNraXBDb3VudC0tOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICh3cml0ZUluZGV4ID09IF9idWZmZXIubGVuZ3RoKSB7CiAgICAgICAgX2dyb3cod3JpdGVJbmRleCk7CiAgICAgIH0KICAgICAgX2J1ZmZlclt3cml0ZUluZGV4KytdID0gdmFsdWU7CiAgICB9CgogICAgaWYgKHNraXBDb3VudCA+IDApIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlRvbyBmZXcgZWxlbWVudHMiKTsKICAgIH0KICAgIGlmIChlbmQgIT0gbnVsbCAmJiB3cml0ZUluZGV4IDwgZW5kKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGVuZCwgc3RhcnQsIHdyaXRlSW5kZXgsICJlbmQiKTsKICAgIH0KCiAgICAvLyBTd2FwIFtpbmRleC4uX2xlbmd0aCkgYW5kIFtfbGVuZ3RoLi53cml0ZUluZGV4KSBieSBkb3VibGUtcmV2ZXJzaW5nLgogICAgX3JldmVyc2UoX2J1ZmZlciwgaW5kZXgsIF9sZW5ndGgpOwogICAgX3JldmVyc2UoX2J1ZmZlciwgX2xlbmd0aCwgd3JpdGVJbmRleCk7CiAgICBfcmV2ZXJzZShfYnVmZmVyLCBpbmRleCwgd3JpdGVJbmRleCk7CiAgICBfbGVuZ3RoID0gd3JpdGVJbmRleDsKICAgIHJldHVybjsKICB9CgogIC8vIFJldmVyc2VzIHRoZSByYW5nZSBbc3RhcnQuLmVuZCkgb2YgYnVmZmVyLgogIHN0YXRpYyB2b2lkIF9yZXZlcnNlKExpc3QgYnVmZmVyLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGVuZC0tOyAvLyBQb2ludCB0byBsYXN0IGVsZW1lbnQsIG5vdCBhZnRlciBsYXN0IGVsZW1lbnQuCiAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHsKICAgICAgdmFyIGZpcnN0ID0gYnVmZmVyW3N0YXJ0XTsKICAgICAgdmFyIGxhc3QgPSBidWZmZXJbZW5kXTsKICAgICAgYnVmZmVyW2VuZF0gPSBmaXJzdDsKICAgICAgYnVmZmVyW3N0YXJ0XSA9IGxhc3Q7CiAgICAgIHN0YXJ0Kys7CiAgICAgIGVuZC0tOwogICAgfQogIH0KCiAgLy8vIERvZXMgdGhlIHNhbWUgdGhpbmcgYXMgW2FkZEFsbF0uCiAgLy8vCiAgLy8vIFRoaXMgYWxsb3dzIFthZGRBbGxdIGFuZCBbaW5zZXJ0QWxsXSB0byBzaGFyZSBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IGEKICAvLy8gc3ViY2xhc3MgdW5leHBlY3RlZGx5IG92ZXJyaWRpbmcgYm90aCB3aGVuIGl0IGludGVuZGVkIHRvIG9ubHkgb3ZlcnJpZGUKICAvLy8gW2FkZEFsbF0uCiAgdm9pZCBfYWRkQWxsKEl0ZXJhYmxlPEU+IHZhbHVlcywgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICBpZiAodmFsdWVzIGlzIExpc3QpIGVuZCA/Pz0gdmFsdWVzLmxlbmd0aDsKCiAgICAvLyBJZiB3ZSBrbm93IHRoZSBsZW5ndGggb2YgdGhlIHNlZ21lbnQgdG8gYWRkLCBkbyBzbyB3aXRoIFthZGRSYW5nZV0uIFRoaXMKICAgIC8vIHdheSB3ZSBrbm93IGhvdyBtdWNoIHRvIGdyb3cgdGhlIGJ1ZmZlciBpbiBhZHZhbmNlLCBhbmQgaXQgbWF5IGJlIGV2ZW4KICAgIC8vIG1vcmUgZWZmaWNpZW50IGZvciB0eXBlZCBkYXRhIGlucHV0LgogICAgaWYgKGVuZCAhPSBudWxsKSB7CiAgICAgIF9pbnNlcnRLbm93bkxlbmd0aChfbGVuZ3RoLCB2YWx1ZXMsIHN0YXJ0LCBlbmQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gT3RoZXJ3aXNlLCBqdXN0IGFkZCB2YWx1ZXMgb25lIGF0IGEgdGltZS4KICAgIHZhciBpID0gMDsKICAgIGZvciAodmFyIHZhbHVlIGluIHZhbHVlcykgewogICAgICBpZiAoaSA+PSBzdGFydCkgYWRkKHZhbHVlKTsKICAgICAgaSsrOwogICAgfQogICAgaWYgKGkgPCBzdGFydCkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlRvbyBmZXcgZWxlbWVudHMiKTsKICB9CgogIC8vLyBMaWtlIFtpbnNlcnRBbGxdLCBidXQgd2l0aCBhIGd1YXJhbnRlZWQgbm9uLWBudWxsYCBbc3RhcnRdIGFuZCBbZW5kXS4KICB2b2lkIF9pbnNlcnRLbm93bkxlbmd0aChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IHZhbHVlcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBpZiAodmFsdWVzIGlzIExpc3QpIHsKICAgICAgZW5kID8/PSB2YWx1ZXMubGVuZ3RoOwogICAgICBpZiAoc3RhcnQgPiB2YWx1ZXMubGVuZ3RoIHx8IGVuZCA+IHZhbHVlcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiVG9vIGZldyBlbGVtZW50cyIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoZW5kICE9IG51bGwpOwogICAgfQoKICAgIHZhciB2YWx1ZXNMZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIHZhciBuZXdMZW5ndGggPSBfbGVuZ3RoICsgdmFsdWVzTGVuZ3RoOwogICAgX2Vuc3VyZUNhcGFjaXR5KG5ld0xlbmd0aCk7CgogICAgX2J1ZmZlci5zZXRSYW5nZSgKICAgICAgICBpbmRleCArIHZhbHVlc0xlbmd0aCwgX2xlbmd0aCArIHZhbHVlc0xlbmd0aCwgX2J1ZmZlciwgaW5kZXgpOwogICAgX2J1ZmZlci5zZXRSYW5nZShpbmRleCwgaW5kZXggKyB2YWx1ZXNMZW5ndGgsIHZhbHVlcywgc3RhcnQpOwogICAgX2xlbmd0aCA9IG5ld0xlbmd0aDsKICB9CgogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRSBlbGVtZW50KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gX2xlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShpbmRleCwgMCwgX2xlbmd0aCk7CiAgICB9CiAgICBpZiAoX2xlbmd0aCA8IF9idWZmZXIubGVuZ3RoKSB7CiAgICAgIF9idWZmZXIuc2V0UmFuZ2UoaW5kZXggKyAxLCBfbGVuZ3RoICsgMSwgX2J1ZmZlciwgaW5kZXgpOwogICAgICBfYnVmZmVyW2luZGV4XSA9IGVsZW1lbnQ7CiAgICAgIF9sZW5ndGgrKzsKICAgICAgcmV0dXJuOwogICAgfQogICAgTGlzdDxFPiBuZXdCdWZmZXIgPSBfY3JlYXRlQmlnZ2VyQnVmZmVyKG51bGwpOwogICAgbmV3QnVmZmVyLnNldFJhbmdlKDAsIGluZGV4LCBfYnVmZmVyKTsKICAgIG5ld0J1ZmZlci5zZXRSYW5nZShpbmRleCArIDEsIF9sZW5ndGggKyAxLCBfYnVmZmVyLCBpbmRleCk7CiAgICBuZXdCdWZmZXJbaW5kZXhdID0gZWxlbWVudDsKICAgIF9sZW5ndGgrKzsKICAgIF9idWZmZXIgPSBuZXdCdWZmZXI7CiAgfQoKICAvLy8gRW5zdXJlcyB0aGF0IFtfYnVmZmVyXSBpcyBhdCBsZWFzdCBbcmVxdWlyZWRDYXBhY2l0eV0gbG9uZywKICAvLy8KICAvLy8gR3Jvd3MgdGhlIGJ1ZmZlciBpZiBuZWNlc3NhcnksIHByZXNlcnZpbmcgZXhpc3RpbmcgZGF0YS4KICB2b2lkIF9lbnN1cmVDYXBhY2l0eShpbnQgcmVxdWlyZWRDYXBhY2l0eSkgewogICAgaWYgKHJlcXVpcmVkQ2FwYWNpdHkgPD0gX2J1ZmZlci5sZW5ndGgpIHJldHVybjsKICAgIHZhciBuZXdCdWZmZXIgPSBfY3JlYXRlQmlnZ2VyQnVmZmVyKHJlcXVpcmVkQ2FwYWNpdHkpOwogICAgbmV3QnVmZmVyLnNldFJhbmdlKDAsIF9sZW5ndGgsIF9idWZmZXIpOwogICAgX2J1ZmZlciA9IG5ld0J1ZmZlcjsKICB9CgogIC8vLyBDcmVhdGUgYSBiaWdnZXIgYnVmZmVyLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIGhvdyBtdWNoIGJpZ2dlciBhIGJpZ2dlciBidWZmZXIgc2hvdWxkCiAgLy8vIGJlLiBJZiBbcmVxdWlyZWRDYXBhY2l0eV0gaXMgbm90IG51bGwsIGl0IHdpbGwgYmUgYXQgbGVhc3QgdGhhdAogIC8vLyBzaXplLiBJdCB3aWxsIGFsd2F5cyBoYXZlIGF0IGxlYXN0IGhhdmUgZG91YmxlIHRoZSBjYXBhY2l0eSBvZgogIC8vLyB0aGUgY3VycmVudCBidWZmZXIuCiAgTGlzdDxFPiBfY3JlYXRlQmlnZ2VyQnVmZmVyKGludCByZXF1aXJlZENhcGFjaXR5KSB7CiAgICBpbnQgbmV3TGVuZ3RoID0gX2J1ZmZlci5sZW5ndGggKiAyOwogICAgaWYgKHJlcXVpcmVkQ2FwYWNpdHkgIT0gbnVsbCAmJiBuZXdMZW5ndGggPCByZXF1aXJlZENhcGFjaXR5KSB7CiAgICAgIG5ld0xlbmd0aCA9IHJlcXVpcmVkQ2FwYWNpdHk7CiAgICB9IGVsc2UgaWYgKG5ld0xlbmd0aCA8IElOSVRJQUxfTEVOR1RIKSB7CiAgICAgIG5ld0xlbmd0aCA9IElOSVRJQUxfTEVOR1RIOwogICAgfQogICAgcmV0dXJuIF9jcmVhdGVCdWZmZXIobmV3TGVuZ3RoKTsKICB9CgogIC8vLyBHcm93cyB0aGUgYnVmZmVyLgogIC8vLwogIC8vLyBUaGlzIGNvcGllcyB0aGUgZmlyc3QgW2xlbmd0aF0gZWxlbWVudHMgaW50byB0aGUgbmV3IGJ1ZmZlci4KICB2b2lkIF9ncm93KGludCBsZW5ndGgpIHsKICAgIF9idWZmZXIgPSBfY3JlYXRlQmlnZ2VyQnVmZmVyKG51bGwpLi5zZXRSYW5nZSgwLCBsZW5ndGgsIF9idWZmZXIpOwogIH0KCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IHNvdXJjZSwgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgaWYgKGVuZCA+IF9sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGVuZCwgMCwgX2xlbmd0aCk7CiAgICBfc2V0UmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLCBza2lwQ291bnQpOwogIH0KCiAgLy8vIExpa2UgW3NldFJhbmdlXSwgYnV0IHdpdGggbm8gYm91bmRzIGNoZWNraW5nLgogIHZvaWQgX3NldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RT4gc291cmNlLCBpbnQgc2tpcENvdW50KSB7CiAgICBpZiAoc291cmNlIGlzIF9UeXBlZERhdGFCdWZmZXI8RT4pIHsKICAgICAgX2J1ZmZlci5zZXRSYW5nZShzdGFydCwgZW5kLCBzb3VyY2UuX2J1ZmZlciwgc2tpcENvdW50KTsKICAgIH0gZWxzZSB7CiAgICAgIF9idWZmZXIuc2V0UmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLCBza2lwQ291bnQpOwogICAgfQogIH0KCiAgLy8gVHlwZWREYXRhLgoKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyA9PiBfdHlwZWRCdWZmZXIuZWxlbWVudFNpemVJbkJ5dGVzOwoKICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXMgPT4gX2xlbmd0aCAqIF90eXBlZEJ1ZmZlci5lbGVtZW50U2l6ZUluQnl0ZXM7CgogIGludCBnZXQgb2Zmc2V0SW5CeXRlcyA9PiBfdHlwZWRCdWZmZXIub2Zmc2V0SW5CeXRlczsKCiAgLy8vIFJldHVybnMgdGhlIHVuZGVybHlpbmcgW0J5dGVCdWZmZXJdLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgYnVmZmVyIG1heSBiZSByZXBsYWNlZCBieSBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBbbGVuZ3RoXQogIC8vLyBvZiB0aGlzIGxpc3QuCiAgLy8vCiAgLy8vIFRoZSBidWZmZXIgbWF5IGJlIGxhcmdlciB0aGFuIFtsZW5ndGhJbkJ5dGVzXSBieXRlcywgYnV0IG5ldmVyIHNtYWxsZXIuCiAgQnl0ZUJ1ZmZlciBnZXQgYnVmZmVyID0+IF90eXBlZEJ1ZmZlci5idWZmZXI7CgogIC8vIFNwZWNpYWxpemF0aW9uIGZvciB0aGUgc3BlY2lmaWMgdHlwZS4KCiAgLy8gUmV0dXJuIHplcm8gZm9yIGludGVnZXJzLCAwLjAgZm9yIGZsb2F0cywgZXRjLgogIC8vIFVzZWQgdG8gZmlsbCBidWZmZXIgd2hlbiBjaGFuZ2luZyBsZW5ndGguCiAgRSBnZXQgX2RlZmF1bHRWYWx1ZTsKCiAgLy8gQ3JlYXRlIGEgbmV3IHR5cGVkIGxpc3QgdG8gdXNlIGFzIGJ1ZmZlci4KICBMaXN0PEU+IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpOwp9CgphYnN0cmFjdCBjbGFzcyBfSW50QnVmZmVyIGV4dGVuZHMgX1R5cGVkRGF0YUJ1ZmZlcjxpbnQ+IHsKICBfSW50QnVmZmVyKExpc3Q8aW50PiBidWZmZXIpIDogc3VwZXIoYnVmZmVyKTsKCiAgaW50IGdldCBfZGVmYXVsdFZhbHVlID0+IDA7Cn0KCmFic3RyYWN0IGNsYXNzIF9GbG9hdEJ1ZmZlciBleHRlbmRzIF9UeXBlZERhdGFCdWZmZXI8ZG91YmxlPiB7CiAgX0Zsb2F0QnVmZmVyKExpc3Q8ZG91YmxlPiBidWZmZXIpIDogc3VwZXIoYnVmZmVyKTsKCiAgZG91YmxlIGdldCBfZGVmYXVsdFZhbHVlID0+IDAuMDsKfQoKY2xhc3MgVWludDhCdWZmZXIgZXh0ZW5kcyBfSW50QnVmZmVyIHsKICBVaW50OEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkgOiBzdXBlcihuZXcgVWludDhMaXN0KGluaXRpYWxMZW5ndGgpKTsKICBVaW50OExpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gbmV3IFVpbnQ4TGlzdChzaXplKTsKfQoKY2xhc3MgSW50OEJ1ZmZlciBleHRlbmRzIF9JbnRCdWZmZXIgewogIEludDhCdWZmZXIoW2ludCBpbml0aWFsTGVuZ3RoID0gMF0pIDogc3VwZXIobmV3IEludDhMaXN0KGluaXRpYWxMZW5ndGgpKTsKICBJbnQ4TGlzdCBfY3JlYXRlQnVmZmVyKGludCBzaXplKSA9PiBuZXcgSW50OExpc3Qoc2l6ZSk7Cn0KCmNsYXNzIFVpbnQ4Q2xhbXBlZEJ1ZmZlciBleHRlbmRzIF9JbnRCdWZmZXIgewogIFVpbnQ4Q2xhbXBlZEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkKICAgICAgOiBzdXBlcihuZXcgVWludDhDbGFtcGVkTGlzdChpbml0aWFsTGVuZ3RoKSk7CiAgVWludDhDbGFtcGVkTGlzdCBfY3JlYXRlQnVmZmVyKGludCBzaXplKSA9PiBuZXcgVWludDhDbGFtcGVkTGlzdChzaXplKTsKfQoKY2xhc3MgVWludDE2QnVmZmVyIGV4dGVuZHMgX0ludEJ1ZmZlciB7CiAgVWludDE2QnVmZmVyKFtpbnQgaW5pdGlhbExlbmd0aCA9IDBdKSA6IHN1cGVyKG5ldyBVaW50MTZMaXN0KGluaXRpYWxMZW5ndGgpKTsKICBVaW50MTZMaXN0IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpID0+IG5ldyBVaW50MTZMaXN0KHNpemUpOwp9CgpjbGFzcyBJbnQxNkJ1ZmZlciBleHRlbmRzIF9JbnRCdWZmZXIgewogIEludDE2QnVmZmVyKFtpbnQgaW5pdGlhbExlbmd0aCA9IDBdKSA6IHN1cGVyKG5ldyBJbnQxNkxpc3QoaW5pdGlhbExlbmd0aCkpOwogIEludDE2TGlzdCBfY3JlYXRlQnVmZmVyKGludCBzaXplKSA9PiBuZXcgSW50MTZMaXN0KHNpemUpOwp9CgpjbGFzcyBVaW50MzJCdWZmZXIgZXh0ZW5kcyBfSW50QnVmZmVyIHsKICBVaW50MzJCdWZmZXIoW2ludCBpbml0aWFsTGVuZ3RoID0gMF0pIDogc3VwZXIobmV3IFVpbnQzMkxpc3QoaW5pdGlhbExlbmd0aCkpOwogIFVpbnQzMkxpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gbmV3IFVpbnQzMkxpc3Qoc2l6ZSk7Cn0KCmNsYXNzIEludDMyQnVmZmVyIGV4dGVuZHMgX0ludEJ1ZmZlciB7CiAgSW50MzJCdWZmZXIoW2ludCBpbml0aWFsTGVuZ3RoID0gMF0pIDogc3VwZXIobmV3IEludDMyTGlzdChpbml0aWFsTGVuZ3RoKSk7CiAgSW50MzJMaXN0IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpID0+IG5ldyBJbnQzMkxpc3Qoc2l6ZSk7Cn0KCmNsYXNzIFVpbnQ2NEJ1ZmZlciBleHRlbmRzIF9JbnRCdWZmZXIgewogIFVpbnQ2NEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkgOiBzdXBlcihuZXcgVWludDY0TGlzdChpbml0aWFsTGVuZ3RoKSk7CiAgVWludDY0TGlzdCBfY3JlYXRlQnVmZmVyKGludCBzaXplKSA9PiBuZXcgVWludDY0TGlzdChzaXplKTsKfQoKY2xhc3MgSW50NjRCdWZmZXIgZXh0ZW5kcyBfSW50QnVmZmVyIHsKICBJbnQ2NEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkgOiBzdXBlcihuZXcgSW50NjRMaXN0KGluaXRpYWxMZW5ndGgpKTsKICBJbnQ2NExpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gbmV3IEludDY0TGlzdChzaXplKTsKfQoKY2xhc3MgRmxvYXQzMkJ1ZmZlciBleHRlbmRzIF9GbG9hdEJ1ZmZlciB7CiAgRmxvYXQzMkJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkKICAgICAgOiBzdXBlcihuZXcgRmxvYXQzMkxpc3QoaW5pdGlhbExlbmd0aCkpOwogIEZsb2F0MzJMaXN0IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpID0+IG5ldyBGbG9hdDMyTGlzdChzaXplKTsKfQoKY2xhc3MgRmxvYXQ2NEJ1ZmZlciBleHRlbmRzIF9GbG9hdEJ1ZmZlciB7CiAgRmxvYXQ2NEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkKICAgICAgOiBzdXBlcihuZXcgRmxvYXQ2NExpc3QoaW5pdGlhbExlbmd0aCkpOwogIEZsb2F0NjRMaXN0IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpID0+IG5ldyBGbG9hdDY0TGlzdChzaXplKTsKfQoKY2xhc3MgSW50MzJ4NEJ1ZmZlciBleHRlbmRzIF9UeXBlZERhdGFCdWZmZXI8SW50MzJ4ND4gewogIHN0YXRpYyBJbnQzMng0IF96ZXJvID0gbmV3IEludDMyeDQoMCwgMCwgMCwgMCk7CiAgSW50MzJ4NEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkKICAgICAgOiBzdXBlcihuZXcgSW50MzJ4NExpc3QoaW5pdGlhbExlbmd0aCkpOwogIEludDMyeDQgZ2V0IF9kZWZhdWx0VmFsdWUgPT4gX3plcm87CiAgSW50MzJ4NExpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gbmV3IEludDMyeDRMaXN0KHNpemUpOwp9CgpjbGFzcyBGbG9hdDMyeDRCdWZmZXIgZXh0ZW5kcyBfVHlwZWREYXRhQnVmZmVyPEZsb2F0MzJ4ND4gewogIEZsb2F0MzJ4NEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkKICAgICAgOiBzdXBlcihuZXcgRmxvYXQzMng0TGlzdChpbml0aWFsTGVuZ3RoKSk7CiAgRmxvYXQzMng0IGdldCBfZGVmYXVsdFZhbHVlID0+IG5ldyBGbG9hdDMyeDQuemVybygpOwogIEZsb2F0MzJ4NExpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gbmV3IEZsb2F0MzJ4NExpc3Qoc2l6ZSk7Cn0KgY8ATk48AR8EUE4hBE5MKyIBKBoBOScBIgZQSRMBNDYBKg8BIx8mAR0dQhsEASpCHAQBIx8mMiMILRkhLg80CC8bBhkEARczIAQBT00dFhEEAUEGSEseBlFRSj4xJjsGASEEAUgGSEseBlFRSkxDMRcZPQggBgFPUFBOHCMOBgEpGwYXNQ4GAUo2HhsgGxUSCCobCCUGARkwBitBBgFMJywqGgwEATA6PRohHhscDw0GBAEnBk1OED8vAVBOLBc3DgYBMQ8gIgsGPQQBTE8aHToyCA0bBgEkLCABFkdCGQQBJig1BiRAIBEOBjMrQCAPGQQBQgY/LzQ7LRkEAR4GREZFGjYoRCQtIgYlBAEYBkMbRwQBT0QuBAE0Sik/DTcGBAEQAUEBRgE3ASsGURQGTjABKwE0LxcBLyMCATowAR4CAT81ASMCASdOPAIBJkw6AgEuLjRKAgEoUD4CASdOPAIBKFA+AgEnTjwCAShQPgIBJ048AgErKS9AAgErKS9AAgE4MikvJkACATwrMTdEAgElcGFja2FnZTp0eXBlZF9kYXRhL3R5cGVkX2J1ZmZlcnMuZGFydDNzZGtyb290Oi90aGlyZF9wYXJ0eS9wa2cvY29udmVydC9saWIvc3JjL3V0aWxzLmRhcnSGWC8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGNvbnZlcnQudXRpbHM7CgppbXBvcnQgJ3BhY2thZ2U6Y2hhcmNvZGUvYXNjaWkuZGFydCc7CgovLy8gUmV0dXJucyB0aGUgZGlnaXQgKDAgdGhyb3VnaCAxNSkgY29ycmVzcG9uZGluZyB0byB0aGUgaGV4YWRlY2ltYWwgY29kZSB1bml0Ci8vLyBhdCBpbmRleCBbaV0gaW4gW2NvZGVVbml0c10uCi8vLwovLy8gSWYgdGhlIGdpdmVuIGNvZGUgdW5pdCBpc24ndCB2YWxpZCBoZXhhZGVjaW1hbCwgdGhyb3dzIGEgW0Zvcm1hdEV4Y2VwdGlvbl0uCmludCBkaWdpdEZvckNvZGVVbml0KExpc3Q8aW50PiBjb2RlVW5pdHMsIGludCBpbmRleCkgewogIC8vIElmIHRoZSBjb2RlIHVuaXQgaXMgYSBudW1lcmFsLCBnZXQgaXRzIHZhbHVlLiBYT1Igd29ya3MgYmVjYXVzZSAwIGluIEFTQ0lJCiAgLy8gaXMgYDBiMTEwMDAwYCBhbmQgdGhlIG90aGVyIG51bWVyYWxzIGNvbWUgYWZ0ZXIgaXQgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZAogIC8vIHRha2UgdXAgYXQgbW9zdCBmb3VyIGJpdHMuCiAgLy8KICAvLyBXZSBjaGVjayBmb3IgZGlnaXRzIGZpcnN0IGJlY2F1c2UgaXQgZW5zdXJlcyB0aGVyZSdzIG9ubHkgYSBzaW5nbGUgYnJhbmNoCiAgLy8gZm9yIDEwIG91dCBvZiAxNiBvZiB0aGUgZXhwZWN0ZWQgY2FzZXMuIFdlIGRvbid0IGNvdW50IHRoZSBgZGlnaXQgPj0gMGAKICAvLyBjaGVjayBiZWNhdXNlIGJyYW5jaCBwcmVkaWN0aW9uIHdpbGwgYWx3YXlzIHdvcmsgb24gaXQgZm9yIHZhbGlkIGRhdGEuCiAgdmFyIGNvZGVVbml0ID0gY29kZVVuaXRzW2luZGV4XTsKICB2YXIgZGlnaXQgPSAkMCBeIGNvZGVVbml0OwogIGlmIChkaWdpdCA8PSA5KSB7CiAgICBpZiAoZGlnaXQgPj0gMCkgcmV0dXJuIGRpZ2l0OwogIH0gZWxzZSB7CiAgICAvLyBJZiB0aGUgY29kZSB1bml0IGlzIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIGNvbnZlcnQgaXQgdG8gbG93ZXJjYXNlLiBUaGlzCiAgICAvLyB3b3JrcyBiZWNhdXNlIHVwcGVyY2FzZSBsZXR0ZXJzIGluIEFTQ0lJIGFyZSBleGFjdGx5IGAwYjEwMDAwMCA9IDB4MjBgCiAgICAvLyBsZXNzIHRoYW4gbG93ZXJjYXNlIGxldHRlcnMsIHNvIGlmIHdlIGVuc3VyZSB0aGF0IHRoYXQgYml0IGlzIDEgd2UgZW5zdXJlCiAgICAvLyB0aGF0IHRoZSBsZXR0ZXIgaXMgbG93ZXJjYXNlLgogICAgdmFyIGxldHRlciA9IDB4MjAgfCBjb2RlVW5pdDsKICAgIGlmICgkYSA8PSBsZXR0ZXIgJiYgbGV0dGVyIDw9ICRmKSByZXR1cm4gbGV0dGVyIC0gJGEgKyAxMDsKICB9CgogIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICJJbnZhbGlkIGhleGFkZWNpbWFsIGNvZGUgdW5pdCAiCiAgICAgICJVKyR7Y29kZVVuaXQudG9SYWRpeFN0cmluZygxNikucGFkTGVmdCg0LCAnMCcpfS4iLAogICAgICBjb2RlVW5pdHMsCiAgICAgIGluZGV4KTsKfQopAE5OPAEXASYBUCEEUDdQTyAFT01MIx0UIgtOTlElIj8EAR0nOhEOAgEecGFja2FnZTpjb252ZXJ0L3NyYy91dGlscy5kYXJ0LG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9hc3luYy9hc3luYy5kYXJ0kV8vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLyoqCiAqIFN1cHBvcnQgZm9yIGFzeW5jaHJvbm91cyBwcm9ncmFtbWluZywKICogd2l0aCBjbGFzc2VzIHN1Y2ggYXMgRnV0dXJlIGFuZCBTdHJlYW0uCiAqCiAqIFVuZGVyc3RhbmRpbmcgW0Z1dHVyZV1zIGFuZCBbU3RyZWFtXXMgaXMgYSBwcmVyZXF1aXNpdGUgZm9yCiAqIHdyaXRpbmcganVzdCBhYm91dCBhbnkgRGFydCBwcm9ncmFtLgogKgogKiBUbyB1c2UgdGhpcyBsaWJyYXJ5IGluIHlvdXIgY29kZToKICoKICogICAgIGltcG9ydCAnZGFydDphc3luYyc7CiAqCiAqICMjIEZ1dHVyZQogKgogKiBBIEZ1dHVyZSBvYmplY3QgcmVwcmVzZW50cyBhIGNvbXB1dGF0aW9uIHdob3NlIHJldHVybiB2YWx1ZQogKiBtaWdodCBub3QgeWV0IGJlIGF2YWlsYWJsZS4KICogVGhlIEZ1dHVyZSByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgY29tcHV0YXRpb24KICogd2hlbiBpdCBjb21wbGV0ZXMgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuCiAqIEZ1dHVyZXMgYXJlIG9mdGVuIHVzZWQgZm9yIHBvdGVudGlhbGx5IGxlbmd0aHkgY29tcHV0YXRpb25zCiAqIHN1Y2ggYXMgSS9PIGFuZCBpbnRlcmFjdGlvbiB3aXRoIHVzZXJzLgogKgogKiBNYW55IG1ldGhvZHMgaW4gdGhlIERhcnQgbGlicmFyaWVzIHJldHVybiBGdXR1cmVzIHdoZW4KICogcGVyZm9ybWluZyB0YXNrcy4gRm9yIGV4YW1wbGUsIHdoZW4gYmluZGluZyBhbiBIdHRwU2VydmVyCiAqIHRvIGEgaG9zdCBhbmQgcG9ydCwgdGhlIGBiaW5kKClgIG1ldGhvZCByZXR1cm5zIGEgRnV0dXJlLgogKgogKiAgICAgIEh0dHBTZXJ2ZXIuYmluZCgnMTI3LjAuMC4xJywgNDQ0NCkKICogICAgICAgICAgLnRoZW4oKHNlcnZlcikgPT4gcHJpbnQoJyR7c2VydmVyLmlzQnJvYWRjYXN0fScpKQogKiAgICAgICAgICAuY2F0Y2hFcnJvcihwcmludCk7CiAqCiAqIFtGdXR1cmUudGhlbl0gcmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBydW5zCiAqIHdoZW4gdGhlIEZ1dHVyZSdzIG9wZXJhdGlvbiwgaW4gdGhpcyBjYXNlIHRoZSBgYmluZCgpYCBtZXRob2QsCiAqIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkuCiAqIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgb3BlcmF0aW9uCiAqIGlzIHBhc3NlZCBpbnRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KICogSW4gdGhpcyBleGFtcGxlLCB0aGUgYGJpbmQoKWAgbWV0aG9kIHJldHVybnMgdGhlIEh0dHBTZXJ2ZXIKICogb2JqZWN0LiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gcHJpbnRzIG9uZSBvZiBpdHMgcHJvcGVydGllcy4KICogW0Z1dHVyZS5jYXRjaEVycm9yXSByZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0CiAqIHJ1bnMgaWYgYW4gZXJyb3Igb2NjdXJzIHdpdGhpbiB0aGUgRnV0dXJlLgogKgogKiAjIyBTdHJlYW0KICoKICogQSBTdHJlYW0gcHJvdmlkZXMgYW4gYXN5bmNocm9ub3VzIHNlcXVlbmNlIG9mIGRhdGEuCiAqIEV4YW1wbGVzIG9mIGRhdGEgc2VxdWVuY2VzIGluY2x1ZGUgaW5kaXZpZHVhbCBldmVudHMsIGxpa2UgbW91c2UgY2xpY2tzLAogKiBvciBzZXF1ZW50aWFsIGNodW5rcyBvZiBsYXJnZXIgZGF0YSwgbGlrZSBtdWx0aXBsZSBieXRlIGxpc3RzIHdpdGggdGhlCiAqIGNvbnRlbnRzIG9mIGEgZmlsZQogKiBzdWNoIGFzIG1vdXNlIGNsaWNrcywgYW5kIGEgc3RyZWFtIG9mIGJ5dGUgbGlzdHMgcmVhZCBmcm9tIGEgZmlsZS4KICogVGhlIGZvbGxvd2luZyBleGFtcGxlIG9wZW5zIGEgZmlsZSBmb3IgcmVhZGluZy4KICogW1N0cmVhbS5saXN0ZW5dIHJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgcnVucwogKiBlYWNoIHRpbWUgbW9yZSBkYXRhIGlzIGF2YWlsYWJsZS4KICoKICogICAgIFN0cmVhbTxMaXN0PGludD4+IHN0cmVhbSA9IG5ldyBGaWxlKCdxdW90ZXMudHh0Jykub3BlblJlYWQoKTsKICogICAgIHN0cmVhbS50cmFuc2Zvcm0odXRmOC5kZWNvZGVyKS5saXN0ZW4ocHJpbnQpOwogKgogKiBUaGUgc3RyZWFtIGVtaXRzIGEgc2VxdWVuY2Ugb2YgYSBsaXN0IG9mIGJ5dGVzLgogKiBUaGUgcHJvZ3JhbSBtdXN0IGludGVycHJldCB0aGUgYnl0ZXMgb3IgaGFuZGxlIHRoZSByYXcgYnl0ZSBkYXRhLgogKiBIZXJlLCB0aGUgY29kZSB1c2VzIGEgVVRGLTggZGVjb2RlciAocHJvdmlkZWQgaW4gdGhlIGBkYXJ0OmNvbnZlcnRgIGxpYnJhcnkpCiAqIHRvIGNvbnZlcnQgdGhlIHNlcXVlbmNlIG9mIGJ5dGVzIGludG8gYSBzZXF1ZW5jZQogKiBvZiBEYXJ0IHN0cmluZ3MuCiAqCiAqIEFub3RoZXIgY29tbW9uIHVzZSBvZiBzdHJlYW1zIGlzIGZvciB1c2VyLWdlbmVyYXRlZCBldmVudHMKICogaW4gYSB3ZWIgYXBwOiBUaGUgZm9sbG93aW5nIGNvZGUgbGlzdGVucyBmb3IgbW91c2UgY2xpY2tzIG9uIGEgYnV0dG9uLgogKgogKiAgICAgcXVlcnlTZWxlY3RvcignI215QnV0dG9uJykub25DbGljay5saXN0ZW4oKF8pID0+IHByaW50KCdDbGljay4nKSk7CiAqCiAqICMjIE90aGVyIHJlc291cmNlcwogKgogKiAqIFRoZSBbZGFydDphc3luYyBzZWN0aW9uIG9mIHRoZSBsaWJyYXJ5IHRvdXJdW2FzeW5jaHJvbm91cy1wcm9ncmFtbWluZ106CiAqICAgQSBicmllZiBvdmVydmlldyBvZiBhc3luY2hyb25vdXMgcHJvZ3JhbW1pbmcuCiAqCiAqICogW1VzZSBGdXR1cmUtQmFzZWQgQVBJc11bZnV0dXJlcy10dXRvcmlhbF06IEEgY2xvc2VyIGxvb2sgYXQgRnV0dXJlcyBhbmQKICogICBob3cgdG8gdXNlIHRoZW0gdG8gd3JpdGUgYXN5bmNocm9ub3VzIERhcnQgY29kZS4KICoKICogKiBbRnV0dXJlcyBhbmQgRXJyb3IgSGFuZGxpbmddW2Z1dHVyZXMtZXJyb3ItaGFuZGxpbmddOiBFdmVyeXRoaW5nIHlvdQogKiAgIHdhbnRlZCB0byBrbm93IGFib3V0IGhhbmRsaW5nIGVycm9ycyBhbmQgZXhjZXB0aW9ucyB3aGVuIHdvcmtpbmcgd2l0aAogKiAgIEZ1dHVyZXMgKGJ1dCB3ZXJlIGFmcmFpZCB0byBhc2spLgogKgogKiAqIFtUaGUgRXZlbnQgTG9vcCBhbmQgRGFydF0oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2FydGljbGVzL2V2ZW50LWxvb3AvKToKICogICBMZWFybiBob3cgRGFydCBoYW5kbGVzIHRoZSBldmVudCBxdWV1ZSBhbmQgbWljcm90YXNrIHF1ZXVlLCBzbyB5b3UgY2FuCiAqICAgd3JpdGUgYmV0dGVyIGFzeW5jaHJvbm91cyBjb2RlIHdpdGggZmV3ZXIgc3VycHJpc2VzLgogKgogKiAqIFt0ZXN0IHBhY2thZ2U6IEFzeW5jaHJvbm91cyBUZXN0c11bdGVzdC1yZWFkbWVdOiBIb3cgdG8gdGVzdCBhc3luY2hyb25vdXMKICogICBjb2RlLgogKgogKiBbYXN5bmNocm9ub3VzLXByb2dyYW1taW5nXTogaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RvY3MvZGFydC11cC1hbmQtcnVubmluZy9jaDAzLmh0bWwjZGFydGFzeW5jLS0tYXN5bmNocm9ub3VzLXByb2dyYW1taW5nCiAqIFtmdXR1cmVzLXR1dG9yaWFsXTogaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RvY3MvdHV0b3JpYWxzL2Z1dHVyZXMvCiAqIFtmdXR1cmVzLWVycm9yLWhhbmRsaW5nXTogaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2FydGljbGVzL2Z1dHVyZXMtYW5kLWVycm9yLWhhbmRsaW5nLwogKiBbdGVzdC1yZWFkbWVdOiBodHRwczovL3B1Yi5kYXJ0bGFuZy5vcmcvcGFja2FnZXMvdGVzdAogKgogKiB7QGNhdGVnb3J5IENvcmV9CiAqLwpsaWJyYXJ5IGRhcnQuYXN5bmM7CgppbXBvcnQgImRhcnQ6Y29sbGVjdGlvbiIgc2hvdyBIYXNoTWFwLCBJdGVyYWJsZUJhc2U7CmltcG9ydCAiZGFydDpfaW50ZXJuYWwiCiAgICBzaG93CiAgICAgICAgQ2FzdFN0cmVhbSwKICAgICAgICBDYXN0U3RyZWFtVHJhbnNmb3JtZXIsCiAgICAgICAgRW1wdHlJdGVyYXRvciwKICAgICAgICBJdGVyYWJsZUVsZW1lbnRFcnJvciwKICAgICAgICBwcmludFRvWm9uZSwKICAgICAgICBwcmludFRvQ29uc29sZSwKICAgICAgICBTaW5jZTsKCnBhcnQgJ2FzeW5jX2Vycm9yLmRhcnQnOwpwYXJ0ICdicm9hZGNhc3Rfc3RyZWFtX2NvbnRyb2xsZXIuZGFydCc7CnBhcnQgJ2RlZmVycmVkX2xvYWQuZGFydCc7CnBhcnQgJ2Z1dHVyZS5kYXJ0JzsKcGFydCAnZnV0dXJlX2ltcGwuZGFydCc7CnBhcnQgJ3NjaGVkdWxlX21pY3JvdGFzay5kYXJ0JzsKcGFydCAnc3RyZWFtLmRhcnQnOwpwYXJ0ICdzdHJlYW1fY29udHJvbGxlci5kYXJ0JzsKcGFydCAnc3RyZWFtX2ltcGwuZGFydCc7CnBhcnQgJ3N0cmVhbV9waXBlLmRhcnQnOwpwYXJ0ICdzdHJlYW1fdHJhbnNmb3JtZXJzLmRhcnQnOwpwYXJ0ICd0aW1lci5kYXJ0JzsKcGFydCAnem9uZS5kYXJ0JzsKeQBOTjwBBCkrAz8oAyUDHAMNAz8fMzE/KwM6PT0DKz4gAzlCGycpPz86LgMNAzdMShZGMzslA0U1AzNFUDQUAz5KA0oDFgNNMwNNNgNKSycDT0w6A08LA4CASFs5AxQEFAE1GAkUHxceFRgPARkpGxQZIBQfGRkhExIBCmRhcnQ6YXN5bmMyb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2FzeW5jL2Z1dHVyZV9pbXBsLmRhcnTAAGenLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5hc3luYzsKCi8qKiBUaGUgb25WYWx1ZSBhbmQgb25FcnJvciBoYW5kbGVycyByZXR1cm4gZWl0aGVyIGEgdmFsdWUgb3IgYSBmdXR1cmUgKi8KdHlwZWRlZiBGdXR1cmVPcjxUPiBfRnV0dXJlT25WYWx1ZTxTLCBUPihTIHZhbHVlKTsKLyoqIFRlc3QgdXNlZCBieSBbRnV0dXJlLmNhdGNoRXJyb3JdIHRvIGhhbmRsZSBza2lwIHNvbWUgZXJyb3JzLiAqLwp0eXBlZGVmIGJvb2wgX0Z1dHVyZUVycm9yVGVzdChPYmplY3QgZXJyb3IpOwovKiogVXNlZCBieSBbV2hlbkZ1dHVyZV0uICovCnR5cGVkZWYgZHluYW1pYyBfRnV0dXJlQWN0aW9uKCk7CgphYnN0cmFjdCBjbGFzcyBfQ29tcGxldGVyPFQ+IGltcGxlbWVudHMgQ29tcGxldGVyPFQ+IHsKICBmaW5hbCBfRnV0dXJlPFQ+IGZ1dHVyZSA9IG5ldyBfRnV0dXJlPFQ+KCk7CgogIHZvaWQgY29tcGxldGUoW0Z1dHVyZU9yPFQ+IHZhbHVlXSk7CgogIHZvaWQgY29tcGxldGVFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBlcnJvciA9IF9ub25OdWxsRXJyb3IoZXJyb3IpOwogICAgaWYgKCFmdXR1cmUuX21heUNvbXBsZXRlKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIik7CiAgICBBc3luY0Vycm9yIHJlcGxhY2VtZW50ID0gWm9uZS5jdXJyZW50LmVycm9yQ2FsbGJhY2soZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgICAgZXJyb3IgPSBfbm9uTnVsbEVycm9yKHJlcGxhY2VtZW50LmVycm9yKTsKICAgICAgc3RhY2tUcmFjZSA9IHJlcGxhY2VtZW50LnN0YWNrVHJhY2U7CiAgICB9CiAgICBfY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICB2b2lkIF9jb21wbGV0ZUVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKTsKCiAgLy8gVGhlIGZ1dHVyZSdzIF9pc0NvbXBsZXRlIGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgcGVuZGluZyBjb21wbGV0aW9ucy4KICAvLyBXZSB0aGVyZWZvcmUgdXNlIF9tYXlDb21wbGV0ZS4KICBib29sIGdldCBpc0NvbXBsZXRlZCA9PiAhZnV0dXJlLl9tYXlDb21wbGV0ZTsKfQoKY2xhc3MgX0FzeW5jQ29tcGxldGVyPFQ+IGV4dGVuZHMgX0NvbXBsZXRlcjxUPiB7CiAgdm9pZCBjb21wbGV0ZShbRnV0dXJlT3I8VD4gdmFsdWVdKSB7CiAgICBpZiAoIWZ1dHVyZS5fbWF5Q29tcGxldGUpIHRocm93IG5ldyBTdGF0ZUVycm9yKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKTsKICAgIGZ1dHVyZS5fYXN5bmNDb21wbGV0ZSh2YWx1ZSk7CiAgfQoKICB2b2lkIF9jb21wbGV0ZUVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBmdXR1cmUuX2FzeW5jQ29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQp9CgpjbGFzcyBfU3luY0NvbXBsZXRlcjxUPiBleHRlbmRzIF9Db21wbGV0ZXI8VD4gewogIHZvaWQgY29tcGxldGUoW0Z1dHVyZU9yPFQ+IHZhbHVlXSkgewogICAgaWYgKCFmdXR1cmUuX21heUNvbXBsZXRlKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIik7CiAgICBmdXR1cmUuX2NvbXBsZXRlKHZhbHVlKTsKICB9CgogIHZvaWQgX2NvbXBsZXRlRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIGZ1dHVyZS5fY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQp9CgpjbGFzcyBfRnV0dXJlTGlzdGVuZXI8UywgVD4gewogIHN0YXRpYyBjb25zdCBpbnQgbWFza1ZhbHVlID0gMTsKICBzdGF0aWMgY29uc3QgaW50IG1hc2tFcnJvciA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBtYXNrVGVzdEVycm9yID0gNDsKICBzdGF0aWMgY29uc3QgaW50IG1hc2tXaGVuY29tcGxldGUgPSA4OwogIHN0YXRpYyBjb25zdCBpbnQgc3RhdGVDaGFpbiA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBzdGF0ZVRoZW4gPSBtYXNrVmFsdWU7CiAgc3RhdGljIGNvbnN0IGludCBzdGF0ZVRoZW5PbmVycm9yID0gbWFza1ZhbHVlIHwgbWFza0Vycm9yOwogIHN0YXRpYyBjb25zdCBpbnQgc3RhdGVDYXRjaGVycm9yID0gbWFza0Vycm9yOwogIHN0YXRpYyBjb25zdCBpbnQgc3RhdGVDYXRjaGVycm9yVGVzdCA9IG1hc2tFcnJvciB8IG1hc2tUZXN0RXJyb3I7CiAgc3RhdGljIGNvbnN0IGludCBzdGF0ZVdoZW5jb21wbGV0ZSA9IG1hc2tXaGVuY29tcGxldGU7CiAgLy8gTGlzdGVuZXJzIG9uIHRoZSBzYW1lIGZ1dHVyZSBhcmUgbGlua2VkIHRocm91Z2ggdGhpcyBsaW5rLgogIF9GdXR1cmVMaXN0ZW5lciBfbmV4dExpc3RlbmVyOwogIC8vIFRoZSBmdXR1cmUgdG8gY29tcGxldGUgd2hlbiB0aGlzIGxpc3RlbmVyIGlzIGFjdGl2YXRlZC4KICBmaW5hbCBfRnV0dXJlPFQ+IHJlc3VsdDsKICAvLyBXaGljaCBmaWVsZHMgbWVhbnMgd2hhdC4KICBmaW5hbCBpbnQgc3RhdGU7CiAgLy8gVXNlZCBmb3IgdGhlbi93aGVuRG9uZSBjYWxsYmFjayBhbmQgZXJyb3IgdGVzdAogIGZpbmFsIEZ1bmN0aW9uIGNhbGxiYWNrOwogIC8vIFVzZWQgZm9yIGVycm9yIGNhbGxiYWNrcy4KICBmaW5hbCBGdW5jdGlvbiBlcnJvckNhbGxiYWNrOwoKICBfRnV0dXJlTGlzdGVuZXIudGhlbigKICAgICAgdGhpcy5yZXN1bHQsIF9GdXR1cmVPblZhbHVlPFMsIFQ+IG9uVmFsdWUsIEZ1bmN0aW9uIGVycm9yQ2FsbGJhY2spCiAgICAgIDogY2FsbGJhY2sgPSBvblZhbHVlLAogICAgICAgIGVycm9yQ2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrLAogICAgICAgIHN0YXRlID0gKGVycm9yQ2FsbGJhY2sgPT0gbnVsbCkgPyBzdGF0ZVRoZW4gOiBzdGF0ZVRoZW5PbmVycm9yOwoKICBfRnV0dXJlTGlzdGVuZXIuY2F0Y2hFcnJvcih0aGlzLnJlc3VsdCwgdGhpcy5lcnJvckNhbGxiYWNrLCB0aGlzLmNhbGxiYWNrKQogICAgICA6IHN0YXRlID0gKGNhbGxiYWNrID09IG51bGwpID8gc3RhdGVDYXRjaGVycm9yIDogc3RhdGVDYXRjaGVycm9yVGVzdDsKCiAgX0Z1dHVyZUxpc3RlbmVyLndoZW5Db21wbGV0ZSh0aGlzLnJlc3VsdCwgdGhpcy5jYWxsYmFjaykKICAgICAgOiBlcnJvckNhbGxiYWNrID0gbnVsbCwKICAgICAgICBzdGF0ZSA9IHN0YXRlV2hlbmNvbXBsZXRlOwoKICBab25lIGdldCBfem9uZSA9PiByZXN1bHQuX3pvbmU7CgogIGJvb2wgZ2V0IGhhbmRsZXNWYWx1ZSA9PiAoc3RhdGUgJiBtYXNrVmFsdWUgIT0gMCk7CiAgYm9vbCBnZXQgaGFuZGxlc0Vycm9yID0+IChzdGF0ZSAmIG1hc2tFcnJvciAhPSAwKTsKICBib29sIGdldCBoYXNFcnJvclRlc3QgPT4gKHN0YXRlID09IHN0YXRlQ2F0Y2hlcnJvclRlc3QpOwogIGJvb2wgZ2V0IGhhbmRsZXNDb21wbGV0ZSA9PiAoc3RhdGUgPT0gc3RhdGVXaGVuY29tcGxldGUpOwoKICBfRnV0dXJlT25WYWx1ZTxTLCBUPiBnZXQgX29uVmFsdWUgewogICAgYXNzZXJ0KGhhbmRsZXNWYWx1ZSk7CiAgICByZXR1cm4gY2FsbGJhY2s7CiAgfQoKICBGdW5jdGlvbiBnZXQgX29uRXJyb3IgPT4gZXJyb3JDYWxsYmFjazsKICBfRnV0dXJlRXJyb3JUZXN0IGdldCBfZXJyb3JUZXN0IHsKICAgIGFzc2VydChoYXNFcnJvclRlc3QpOwogICAgcmV0dXJuIGNhbGxiYWNrOwogIH0KCiAgX0Z1dHVyZUFjdGlvbiBnZXQgX3doZW5Db21wbGV0ZUFjdGlvbiB7CiAgICBhc3NlcnQoaGFuZGxlc0NvbXBsZXRlKTsKICAgIHJldHVybiBjYWxsYmFjazsKICB9CgogIC8vLyBXaGV0aGVyIHRoaXMgbGlzdGVuZXIgaGFzIGFuIGVycm9yIGNhbGxiYWNrLgogIC8vLwogIC8vLyBUaGlzIGZ1bmN0aW9uIG11c3Qgb25seSBiZSBjYWxsZWQgaWYgdGhlIGxpc3RlbmVyIFtoYW5kbGVzRXJyb3JdLgogIGJvb2wgZ2V0IGhhc0Vycm9yQ2FsbGJhY2sgewogICAgYXNzZXJ0KGhhbmRsZXNFcnJvcik7CiAgICByZXR1cm4gX29uRXJyb3IgIT0gbnVsbDsKICB9CgogIEZ1dHVyZU9yPFQ+IGhhbmRsZVZhbHVlKFMgc291cmNlUmVzdWx0KSB7CiAgICByZXR1cm4gX3pvbmUucnVuVW5hcnk8RnV0dXJlT3I8VD4sIFM+KF9vblZhbHVlLCBzb3VyY2VSZXN1bHQpOwogIH0KCiAgYm9vbCBtYXRjaGVzRXJyb3JUZXN0KEFzeW5jRXJyb3IgYXN5bmNFcnJvcikgewogICAgaWYgKCFoYXNFcnJvclRlc3QpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIF96b25lLnJ1blVuYXJ5PGJvb2wsIE9iamVjdD4oX2Vycm9yVGVzdCwgYXN5bmNFcnJvci5lcnJvcik7CiAgfQoKICBGdXR1cmVPcjxUPiBoYW5kbGVFcnJvcihBc3luY0Vycm9yIGFzeW5jRXJyb3IpIHsKICAgIGFzc2VydChoYW5kbGVzRXJyb3IgJiYgaGFzRXJyb3JDYWxsYmFjayk7CiAgICB2YXIgZXJyb3JDYWxsYmFjayA9IHRoaXMuZXJyb3JDYWxsYmFjazsgLy8gVG8gZW5hYmxlIHByb21vdGlvbi4KICAgIC8vIElmIHRoZSBlcnJvckNhbGxiYWNrIHJldHVybnMgc29tZXRoaW5nIHdoaWNoIGlzIG5vdCBhIEZ1dHVyZU9yPFQ+LAogICAgLy8gdGhpcyByZXR1cm4gc3RhdGVtZW50IHRocm93cywgYW5kIHRoZSBjYWxsZXIgaGFuZGxlcyB0aGUgZXJyb3IuCiAgICBpZiAoZXJyb3JDYWxsYmFjayBpcyBkeW5hbWljIEZ1bmN0aW9uKE9iamVjdCwgU3RhY2tUcmFjZSkpIHsKICAgICAgcmV0dXJuIF96b25lLnJ1bkJpbmFyeTxkeW5hbWljLCBPYmplY3QsIFN0YWNrVHJhY2U+KAogICAgICAgICAgZXJyb3JDYWxsYmFjaywgYXN5bmNFcnJvci5lcnJvciwgYXN5bmNFcnJvci5zdGFja1RyYWNlKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChlcnJvckNhbGxiYWNrIGlzIGR5bmFtaWMgRnVuY3Rpb24oT2JqZWN0KSk7CiAgICAgIHJldHVybiBfem9uZS5ydW5VbmFyeTxkeW5hbWljLCBPYmplY3Q+KGVycm9yQ2FsbGJhY2ssIGFzeW5jRXJyb3IuZXJyb3IpOwogICAgfQogIH0KCiAgZHluYW1pYyBoYW5kbGVXaGVuQ29tcGxldGUoKSB7CiAgICBhc3NlcnQoIWhhbmRsZXNFcnJvcik7CiAgICByZXR1cm4gX3pvbmUucnVuKF93aGVuQ29tcGxldGVBY3Rpb24pOwogIH0KfQoKY2xhc3MgX0Z1dHVyZTxUPiBpbXBsZW1lbnRzIEZ1dHVyZTxUPiB7CiAgLy8vIEluaXRpYWwgc3RhdGUsIHdhaXRpbmcgZm9yIGEgcmVzdWx0LiBJbiB0aGlzIHN0YXRlLCB0aGUKICAvLy8gW3Jlc3VsdE9yTGlzdGVuZXJzXSBmaWVsZCBob2xkcyBhIHNpbmdsZS1saW5rZWQgbGlzdCBvZgogIC8vLyBbX0Z1dHVyZUxpc3RlbmVyXSBsaXN0ZW5lcnMuCiAgc3RhdGljIGNvbnN0IGludCBfc3RhdGVJbmNvbXBsZXRlID0gMDsKCiAgLy8vIFBlbmRpbmcgY29tcGxldGlvbi4gU2V0IHdoZW4gY29tcGxldGVkIHVzaW5nIFtfYXN5bmNDb21wbGV0ZV0gb3IKICAvLy8gW19hc3luY0NvbXBsZXRlRXJyb3JdLiBJdCBpcyBhbiBlcnJvciB0byB0cnkgdG8gY29tcGxldGUgaXQgYWdhaW4uCiAgLy8vIFtyZXN1bHRPckxpc3RlbmVyc10gaG9sZHMgbGlzdGVuZXJzLgogIHN0YXRpYyBjb25zdCBpbnQgX3N0YXRlUGVuZGluZ0NvbXBsZXRlID0gMTsKCiAgLy8vIFRoZSBmdXR1cmUgaGFzIGJlZW4gY2hhaW5lZCB0byBhbm90aGVyIGZ1dHVyZS4gVGhlIHJlc3VsdCBvZiB0aGF0CiAgLy8vIG90aGVyIGZ1dHVyZSBiZWNvbWVzIHRoZSByZXN1bHQgb2YgdGhpcyBmdXR1cmUgYXMgd2VsbC4KICAvLy8gW3Jlc3VsdE9yTGlzdGVuZXJzXSBjb250YWlucyB0aGUgc291cmNlIGZ1dHVyZS4KICBzdGF0aWMgY29uc3QgaW50IF9zdGF0ZUNoYWluZWQgPSAyOwoKICAvLy8gVGhlIGZ1dHVyZSBoYXMgYmVlbiBjb21wbGV0ZWQgd2l0aCBhIHZhbHVlIHJlc3VsdC4KICBzdGF0aWMgY29uc3QgaW50IF9zdGF0ZVZhbHVlID0gNDsKCiAgLy8vIFRoZSBmdXR1cmUgaGFzIGJlZW4gY29tcGxldGVkIHdpdGggYW4gZXJyb3IgcmVzdWx0LgogIHN0YXRpYyBjb25zdCBpbnQgX3N0YXRlRXJyb3IgPSA4OwoKICAvKiogV2hldGhlciB0aGUgZnV0dXJlIGlzIGNvbXBsZXRlLCBhbmQgYXMgd2hhdC4gKi8KICBpbnQgX3N0YXRlID0gX3N0YXRlSW5jb21wbGV0ZTsKCiAgLyoqCiAgICogWm9uZSB0aGF0IHRoZSBmdXR1cmUgd2FzIGNvbXBsZXRlZCBmcm9tLgogICAqIFRoaXMgaXMgdGhlIHpvbmUgdGhhdCBhbiBlcnJvciByZXN1bHQgYmVsb25ncyB0by4KICAgKgogICAqIFVudGlsIHRoZSBmdXR1cmUgaXMgY29tcGxldGVkLCB0aGUgZmllbGQgbWF5IGhvbGQgdGhlIHpvbmUgdGhhdAogICAqIGxpc3RlbmVyIGNhbGxiYWNrcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIGZ1dHVyZSBzaG91bGQgYmUgcnVuIGluLgogICAqLwogIGZpbmFsIFpvbmUgX3pvbmU7CgogIC8qKgogICAqIEVpdGhlciB0aGUgcmVzdWx0LCBhIGxpc3Qgb2YgbGlzdGVuZXJzIG9yIGFub3RoZXIgZnV0dXJlLgogICAqCiAgICogVGhlIHJlc3VsdCBvZiB0aGUgZnV0dXJlIGlzIGVpdGhlciBhIHZhbHVlIG9yIGFuIGVycm9yLgogICAqIEEgcmVzdWx0IGlzIG9ubHkgc3RvcmVkIHdoZW4gdGhlIGZ1dHVyZSBoYXMgY29tcGxldGVkLgogICAqCiAgICogVGhlIGxpc3RlbmVycyBpcyBhbiBpbnRlcm5hbGx5IGxpbmtlZCBsaXN0IG9mIFtfRnV0dXJlTGlzdGVuZXJdcy4KICAgKiBMaXN0ZW5lcnMgYXJlIG9ubHkgcmVtZW1iZXJlZCB3aGlsZSB0aGUgZnV0dXJlIGlzIG5vdCB5ZXQgY29tcGxldGUsCiAgICogYW5kIGl0IGlzIG5vdCBjaGFpbmVkIHRvIGFub3RoZXIgZnV0dXJlLgogICAqCiAgICogVGhlIGZ1dHVyZSBpcyBhbm90aGVyIGZ1dHVyZSB0aGF0IGhpcyBmdXR1cmUgaXMgY2hhaW5lZCB0by4gVGhpcyBmdXR1cmUKICAgKiBpcyB3YWl0aW5nIGZvciB0aGUgb3RoZXIgZnV0dXJlIHRvIGNvbXBsZXRlLCBhbmQgd2hlbiBpdCBkb2VzLCB0aGlzIGZ1dHVyZQogICAqIHdpbGwgY29tcGxldGUgd2l0aCB0aGUgc2FtZSByZXN1bHQuCiAgICogQWxsIGxpc3RlbmVycyBhcmUgZm9yd2FyZGVkIHRvIHRoZSBvdGhlciBmdXR1cmUuCiAgICovCiAgdmFyIF9yZXN1bHRPckxpc3RlbmVyczsKCiAgLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IGFzeW5jL2F3YWl0LgogIF9GdXR1cmUoKSA6IF96b25lID0gWm9uZS5jdXJyZW50OwoKICBfRnV0dXJlLmltbWVkaWF0ZShGdXR1cmVPcjxUPiByZXN1bHQpIDogX3pvbmUgPSBab25lLmN1cnJlbnQgewogICAgX2FzeW5jQ29tcGxldGUocmVzdWx0KTsKICB9CgogIC8qKiBDcmVhdGVzIGEgZnV0dXJlIHdpdGggdGhlIHZhbHVlIGFuZCB0aGUgc3BlY2lmaWVkIHpvbmUuICovCiAgX0Z1dHVyZS56b25lVmFsdWUoVCB2YWx1ZSwgdGhpcy5fem9uZSkgewogICAgX3NldFZhbHVlKHZhbHVlKTsKICB9CgogIF9GdXR1cmUuaW1tZWRpYXRlRXJyb3IodmFyIGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkKICAgICAgOiBfem9uZSA9IFpvbmUuY3VycmVudCB7CiAgICBfYXN5bmNDb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIC8qKiBDcmVhdGVzIGEgZnV0dXJlIHRoYXQgaXMgYWxyZWFkeSBjb21wbGV0ZWQgd2l0aCB0aGUgdmFsdWUuICovCiAgX0Z1dHVyZS52YWx1ZShUIHZhbHVlKSA6IHRoaXMuem9uZVZhbHVlKHZhbHVlLCBab25lLmN1cnJlbnQpOwoKICBib29sIGdldCBfbWF5Q29tcGxldGUgPT4gX3N0YXRlID09IF9zdGF0ZUluY29tcGxldGU7CiAgYm9vbCBnZXQgX2lzUGVuZGluZ0NvbXBsZXRlID0+IF9zdGF0ZSA9PSBfc3RhdGVQZW5kaW5nQ29tcGxldGU7CiAgYm9vbCBnZXQgX21heUFkZExpc3RlbmVyID0+IF9zdGF0ZSA8PSBfc3RhdGVQZW5kaW5nQ29tcGxldGU7CiAgYm9vbCBnZXQgX2lzQ2hhaW5lZCA9PiBfc3RhdGUgPT0gX3N0YXRlQ2hhaW5lZDsKICBib29sIGdldCBfaXNDb21wbGV0ZSA9PiBfc3RhdGUgPj0gX3N0YXRlVmFsdWU7CiAgYm9vbCBnZXQgX2hhc0Vycm9yID0+IF9zdGF0ZSA9PSBfc3RhdGVFcnJvcjsKCiAgdm9pZCBfc2V0Q2hhaW5lZChfRnV0dXJlIHNvdXJjZSkgewogICAgYXNzZXJ0KF9tYXlBZGRMaXN0ZW5lcik7CiAgICBfc3RhdGUgPSBfc3RhdGVDaGFpbmVkOwogICAgX3Jlc3VsdE9yTGlzdGVuZXJzID0gc291cmNlOwogIH0KCiAgRnV0dXJlPFI+IHRoZW48Uj4oRnV0dXJlT3I8Uj4gZihUIHZhbHVlKSwge0Z1bmN0aW9uIG9uRXJyb3J9KSB7CiAgICBab25lIGN1cnJlbnRab25lID0gWm9uZS5jdXJyZW50OwogICAgaWYgKCFpZGVudGljYWwoY3VycmVudFpvbmUsIF9yb290Wm9uZSkpIHsKICAgICAgZiA9IGN1cnJlbnRab25lLnJlZ2lzdGVyVW5hcnlDYWxsYmFjazxGdXR1cmVPcjxSPiwgVD4oZik7CiAgICAgIGlmIChvbkVycm9yICE9IG51bGwpIHsKICAgICAgICAvLyBJbiBjaGVja2VkIG1vZGUsIHRoaXMgY2hlY2tzIHRoYXQgb25FcnJvciBpcyBhc3NpZ25hYmxlIHRvIG9uZSBvZjoKICAgICAgICAvLyAgIGR5bmFtaWMgRnVuY3Rpb24oT2JqZWN0KQogICAgICAgIC8vICAgZHluYW1pYyBGdW5jdGlvbihPYmplY3QsIFN0YWNrVHJhY2UpCiAgICAgICAgb25FcnJvciA9IF9yZWdpc3RlckVycm9ySGFuZGxlcihvbkVycm9yLCBjdXJyZW50Wm9uZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfdGhlbk5vWm9uZVJlZ2lzdHJhdGlvbjxSPihmLCBvbkVycm9yKTsKICB9CgogIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgYXN5bmMvYXdhaXQuCiAgRnV0dXJlPEU+IF90aGVuTm9ab25lUmVnaXN0cmF0aW9uPEU+KAogICAgICBGdXR1cmVPcjxFPiBmKFQgdmFsdWUpLCBGdW5jdGlvbiBvbkVycm9yKSB7CiAgICBfRnV0dXJlPEU+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPEU+KCk7CiAgICBfYWRkTGlzdGVuZXIobmV3IF9GdXR1cmVMaXN0ZW5lcjxULCBFPi50aGVuKHJlc3VsdCwgZiwgb25FcnJvcikpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEZ1dHVyZTxUPiBjYXRjaEVycm9yKEZ1bmN0aW9uIG9uRXJyb3IsIHtib29sIHRlc3QoZXJyb3IpfSkgewogICAgX0Z1dHVyZTxUPiByZXN1bHQgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgaWYgKCFpZGVudGljYWwocmVzdWx0Ll96b25lLCBfcm9vdFpvbmUpKSB7CiAgICAgIG9uRXJyb3IgPSBfcmVnaXN0ZXJFcnJvckhhbmRsZXIob25FcnJvciwgcmVzdWx0Ll96b25lKTsKICAgICAgaWYgKHRlc3QgIT0gbnVsbCkgdGVzdCA9IHJlc3VsdC5fem9uZS5yZWdpc3RlclVuYXJ5Q2FsbGJhY2sodGVzdCk7CiAgICB9CiAgICBfYWRkTGlzdGVuZXIobmV3IF9GdXR1cmVMaXN0ZW5lcjxULCBUPi5jYXRjaEVycm9yKHJlc3VsdCwgb25FcnJvciwgdGVzdCkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEZ1dHVyZTxUPiB3aGVuQ29tcGxldGUoZHluYW1pYyBhY3Rpb24oKSkgewogICAgX0Z1dHVyZTxUPiByZXN1bHQgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgaWYgKCFpZGVudGljYWwocmVzdWx0Ll96b25lLCBfcm9vdFpvbmUpKSB7CiAgICAgIGFjdGlvbiA9IHJlc3VsdC5fem9uZS5yZWdpc3RlckNhbGxiYWNrPGR5bmFtaWM+KGFjdGlvbik7CiAgICB9CiAgICBfYWRkTGlzdGVuZXIobmV3IF9GdXR1cmVMaXN0ZW5lcjxULCBUPi53aGVuQ29tcGxldGUocmVzdWx0LCBhY3Rpb24pKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTdHJlYW08VD4gYXNTdHJlYW0oKSA9PiBuZXcgU3RyZWFtPFQ+LmZyb21GdXR1cmUodGhpcyk7CgogIHZvaWQgX3NldFBlbmRpbmdDb21wbGV0ZSgpIHsKICAgIGFzc2VydChfbWF5Q29tcGxldGUpOwogICAgX3N0YXRlID0gX3N0YXRlUGVuZGluZ0NvbXBsZXRlOwogIH0KCiAgdm9pZCBfY2xlYXJQZW5kaW5nQ29tcGxldGUoKSB7CiAgICBhc3NlcnQoX2lzUGVuZGluZ0NvbXBsZXRlKTsKICAgIF9zdGF0ZSA9IF9zdGF0ZUluY29tcGxldGU7CiAgfQoKICBBc3luY0Vycm9yIGdldCBfZXJyb3IgewogICAgYXNzZXJ0KF9oYXNFcnJvcik7CiAgICByZXR1cm4gX3Jlc3VsdE9yTGlzdGVuZXJzOwogIH0KCiAgX0Z1dHVyZSBnZXQgX2NoYWluU291cmNlIHsKICAgIGFzc2VydChfaXNDaGFpbmVkKTsKICAgIHJldHVybiBfcmVzdWx0T3JMaXN0ZW5lcnM7CiAgfQoKICAvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGFzeW5jL2F3YWl0LgogIHZvaWQgX3NldFZhbHVlKFQgdmFsdWUpIHsKICAgIGFzc2VydCghX2lzQ29tcGxldGUpOyAvLyBCdXQgbWF5IGhhdmUgYSBjb21wbGV0aW9uIHBlbmRpbmcuCiAgICBfc3RhdGUgPSBfc3RhdGVWYWx1ZTsKICAgIF9yZXN1bHRPckxpc3RlbmVycyA9IHZhbHVlOwogIH0KCiAgdm9pZCBfc2V0RXJyb3JPYmplY3QoQXN5bmNFcnJvciBlcnJvcikgewogICAgYXNzZXJ0KCFfaXNDb21wbGV0ZSk7IC8vIEJ1dCBtYXkgaGF2ZSBhIGNvbXBsZXRpb24gcGVuZGluZy4KICAgIF9zdGF0ZSA9IF9zdGF0ZUVycm9yOwogICAgX3Jlc3VsdE9yTGlzdGVuZXJzID0gZXJyb3I7CiAgfQoKICB2b2lkIF9zZXRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgX3NldEVycm9yT2JqZWN0KG5ldyBBc3luY0Vycm9yKGVycm9yLCBzdGFja1RyYWNlKSk7CiAgfQoKICAvLy8gQ29weSB0aGUgY29tcGxldGlvbiByZXN1bHQgb2YgW3NvdXJjZV0gaW50byB0aGlzIGZ1dHVyZS4KICAvLy8KICAvLy8gVXNlZCB3aGVuIGEgY2hhaW5lZCBmdXR1cmUgbm90aWNlcyB0aGF0IGl0cyBzb3VyY2UgaXMgY29tcGxldGVkLgogIHZvaWQgX2Nsb25lUmVzdWx0KF9GdXR1cmUgc291cmNlKSB7CiAgICBhc3NlcnQoIV9pc0NvbXBsZXRlKTsKICAgIGFzc2VydChzb3VyY2UuX2lzQ29tcGxldGUpOwogICAgX3N0YXRlID0gc291cmNlLl9zdGF0ZTsKICAgIF9yZXN1bHRPckxpc3RlbmVycyA9IHNvdXJjZS5fcmVzdWx0T3JMaXN0ZW5lcnM7CiAgfQoKICB2b2lkIF9hZGRMaXN0ZW5lcihfRnV0dXJlTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgIGFzc2VydChsaXN0ZW5lci5fbmV4dExpc3RlbmVyID09IG51bGwpOwogICAgaWYgKF9tYXlBZGRMaXN0ZW5lcikgewogICAgICBsaXN0ZW5lci5fbmV4dExpc3RlbmVyID0gX3Jlc3VsdE9yTGlzdGVuZXJzOwogICAgICBfcmVzdWx0T3JMaXN0ZW5lcnMgPSBsaXN0ZW5lcjsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChfaXNDaGFpbmVkKSB7CiAgICAgICAgLy8gRGVsZWdhdGUgbGlzdGVuZXJzIHRvIGNoYWluZWQgc291cmNlIGZ1dHVyZS4KICAgICAgICAvLyBJZiB0aGUgc291cmNlIGlzIGNvbXBsZXRlLCBpbnN0ZWFkIGNvcHkgaXRzIHZhbHVlcyBhbmQKICAgICAgICAvLyBkcm9wIHRoZSBjaGFpbmluZy4KICAgICAgICBfRnV0dXJlIHNvdXJjZSA9IF9jaGFpblNvdXJjZTsKICAgICAgICBpZiAoIXNvdXJjZS5faXNDb21wbGV0ZSkgewogICAgICAgICAgc291cmNlLl9hZGRMaXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIF9jbG9uZVJlc3VsdChzb3VyY2UpOwogICAgICB9CiAgICAgIGFzc2VydChfaXNDb21wbGV0ZSk7CiAgICAgIC8vIEhhbmRsZSBsYXRlIGxpc3RlbmVycyBhc3luY2hyb25vdXNseS4KICAgICAgX3pvbmUuc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAgICAgIF9wcm9wYWdhdGVUb0xpc3RlbmVycyh0aGlzLCBsaXN0ZW5lcik7CiAgICAgIH0pOwogICAgfQogIH0KCiAgdm9pZCBfcHJlcGVuZExpc3RlbmVycyhfRnV0dXJlTGlzdGVuZXIgbGlzdGVuZXJzKSB7CiAgICBpZiAobGlzdGVuZXJzID09IG51bGwpIHJldHVybjsKICAgIGlmIChfbWF5QWRkTGlzdGVuZXIpIHsKICAgICAgX0Z1dHVyZUxpc3RlbmVyIGV4aXN0aW5nTGlzdGVuZXJzID0gX3Jlc3VsdE9yTGlzdGVuZXJzOwogICAgICBfcmVzdWx0T3JMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7CiAgICAgIGlmIChleGlzdGluZ0xpc3RlbmVycyAhPSBudWxsKSB7CiAgICAgICAgX0Z1dHVyZUxpc3RlbmVyIGN1cnNvciA9IGxpc3RlbmVyczsKICAgICAgICB3aGlsZSAoY3Vyc29yLl9uZXh0TGlzdGVuZXIgIT0gbnVsbCkgewogICAgICAgICAgY3Vyc29yID0gY3Vyc29yLl9uZXh0TGlzdGVuZXI7CiAgICAgICAgfQogICAgICAgIGN1cnNvci5fbmV4dExpc3RlbmVyID0gZXhpc3RpbmdMaXN0ZW5lcnM7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChfaXNDaGFpbmVkKSB7CiAgICAgICAgLy8gRGVsZWdhdGUgbGlzdGVuZXJzIHRvIGNoYWluZWQgc291cmNlIGZ1dHVyZS4KICAgICAgICAvLyBJZiB0aGUgc291cmNlIGlzIGNvbXBsZXRlLCBpbnN0ZWFkIGNvcHkgaXRzIHZhbHVlcyBhbmQKICAgICAgICAvLyBkcm9wIHRoZSBjaGFpbmluZy4KICAgICAgICBfRnV0dXJlIHNvdXJjZSA9IF9jaGFpblNvdXJjZTsKICAgICAgICBpZiAoIXNvdXJjZS5faXNDb21wbGV0ZSkgewogICAgICAgICAgc291cmNlLl9wcmVwZW5kTGlzdGVuZXJzKGxpc3RlbmVycyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIF9jbG9uZVJlc3VsdChzb3VyY2UpOwogICAgICB9CiAgICAgIGFzc2VydChfaXNDb21wbGV0ZSk7CiAgICAgIGxpc3RlbmVycyA9IF9yZXZlcnNlTGlzdGVuZXJzKGxpc3RlbmVycyk7CiAgICAgIF96b25lLnNjaGVkdWxlTWljcm90YXNrKCgpIHsKICAgICAgICBfcHJvcGFnYXRlVG9MaXN0ZW5lcnModGhpcywgbGlzdGVuZXJzKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBfRnV0dXJlTGlzdGVuZXIgX3JlbW92ZUxpc3RlbmVycygpIHsKICAgIC8vIFJldmVyc2UgbGlzdGVuZXJzIGJlZm9yZSByZXR1cm5pbmcgdGhlbSwgc28gdGhlIHJlc3VsdGluZyBsaXN0IGlzIGluCiAgICAvLyBzdWJzY3JpcHRpb24gb3JkZXIuCiAgICBhc3NlcnQoIV9pc0NvbXBsZXRlKTsKICAgIF9GdXR1cmVMaXN0ZW5lciBjdXJyZW50ID0gX3Jlc3VsdE9yTGlzdGVuZXJzOwogICAgX3Jlc3VsdE9yTGlzdGVuZXJzID0gbnVsbDsKICAgIHJldHVybiBfcmV2ZXJzZUxpc3RlbmVycyhjdXJyZW50KTsKICB9CgogIF9GdXR1cmVMaXN0ZW5lciBfcmV2ZXJzZUxpc3RlbmVycyhfRnV0dXJlTGlzdGVuZXIgbGlzdGVuZXJzKSB7CiAgICBfRnV0dXJlTGlzdGVuZXIgcHJldjsKICAgIF9GdXR1cmVMaXN0ZW5lciBjdXJyZW50ID0gbGlzdGVuZXJzOwogICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgewogICAgICBfRnV0dXJlTGlzdGVuZXIgbmV4dCA9IGN1cnJlbnQuX25leHRMaXN0ZW5lcjsKICAgICAgY3VycmVudC5fbmV4dExpc3RlbmVyID0gcHJldjsKICAgICAgcHJldiA9IGN1cnJlbnQ7CiAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgfQogICAgcmV0dXJuIHByZXY7CiAgfQoKICAvLyBUYWtlIHRoZSB2YWx1ZSAod2hlbiBjb21wbGV0ZWQpIG9mIHNvdXJjZSBhbmQgY29tcGxldGUgdGFyZ2V0IHdpdGggdGhhdAogIC8vIHZhbHVlIChvciBlcnJvcikuIFRoaXMgZnVuY3Rpb24gY291bGQgY2hhaW4gYWxsIEZ1dHVyZXMsIGJ1dCBpcyBzbG93ZXIKICAvLyBmb3IgX0Z1dHVyZSB0aGFuIF9jaGFpbkNvcmVGdXR1cmUsIHNvIHlvdSBtdXN0IHVzZSBfY2hhaW5Db3JlRnV0dXJlCiAgLy8gaW4gdGhhdCBjYXNlLgogIHN0YXRpYyB2b2lkIF9jaGFpbkZvcmVpZ25GdXR1cmUoRnV0dXJlIHNvdXJjZSwgX0Z1dHVyZSB0YXJnZXQpIHsKICAgIGFzc2VydCghdGFyZ2V0Ll9pc0NvbXBsZXRlKTsKICAgIGFzc2VydChzb3VyY2UgaXMhIF9GdXR1cmUpOwoKICAgIC8vIE1hcmsgdGhlIHRhcmdldCBhcyBjaGFpbmVkIChhbmQgYXMgc3VjaCBoYWxmLWNvbXBsZXRlZCkuCiAgICB0YXJnZXQuX3NldFBlbmRpbmdDb21wbGV0ZSgpOwogICAgdHJ5IHsKICAgICAgc291cmNlLnRoZW4oKHZhbHVlKSB7CiAgICAgICAgYXNzZXJ0KHRhcmdldC5faXNQZW5kaW5nQ29tcGxldGUpOwogICAgICAgIC8vIFRoZSAidmFsdWUiIG1heSBiZSBhbm90aGVyIGZ1dHVyZSBpZiB0aGUgZm9yZWlnbiBmdXR1cmUKICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBpcyBtaXMtYmVoYXZpbmcsCiAgICAgICAgLy8gc28gdXNlIF9jb21wbGV0ZSBpbnN0ZWFkIG9mIF9jb21wbGV0ZVdpdGhWYWx1ZS4KICAgICAgICB0YXJnZXQuX2NsZWFyUGVuZGluZ0NvbXBsZXRlKCk7IC8vIENsZWFyIHRoaXMgZmlyc3QsIGl0J3Mgc2V0IGFnYWluLgogICAgICAgIHRhcmdldC5fY29tcGxldGUodmFsdWUpOwogICAgICB9LAogICAgICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IGV2ZW50dWFsbHkgd2Ugd291bGQgbGlrZSB0byBtYWtlIHRoaXMgbm9uLW9wdGlvbmFsCiAgICAgICAgICAvLyBhbmQgZGVwZW5kZW50IG9uIHRoZSBsaXN0ZW5lcnMgb2YgdGhlIHRhcmdldCBmdXR1cmUuIElmIG5vbmUgb2YKICAgICAgICAgIC8vIHRoZSB0YXJnZXQgZnV0dXJlJ3MgbGlzdGVuZXJzIHdhbnQgdG8gaGF2ZSB0aGUgc3RhY2sgdHJhY2Ugd2UgZG9uJ3QKICAgICAgICAgIC8vIG5lZWQgYSB0cmFjZS4KICAgICAgICAgIG9uRXJyb3I6IChlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgICAgICBhc3NlcnQodGFyZ2V0Ll9pc1BlbmRpbmdDb21wbGV0ZSk7CiAgICAgICAgdGFyZ2V0Ll9jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgfSk7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIC8vIFRoaXMgb25seSBoYXBwZW5zIGlmIHRoZSBgdGhlbmAgY2FsbCB0aHJldyBzeW5jaHJvbm91c2x5IHdoZW4gZ2l2ZW4KICAgICAgLy8gdmFsaWQgYXJndW1lbnRzLgogICAgICAvLyBUaGF0IHJlcXVpcmVzIGEgbm9uLWNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIEZ1dHVyZSBpbnRlcmZhY2UsCiAgICAgIC8vIHdoaWNoIHNob3VsZCwgaG9wZWZ1bGx5LCBuZXZlciBoYXBwZW4uCiAgICAgIHNjaGVkdWxlTWljcm90YXNrKCgpIHsKICAgICAgICB0YXJnZXQuX2NvbXBsZXRlRXJyb3IoZSwgcyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gVGFrZSB0aGUgdmFsdWUgKHdoZW4gY29tcGxldGVkKSBvZiBzb3VyY2UgYW5kIGNvbXBsZXRlIHRhcmdldCB3aXRoIHRoYXQKICAvLyB2YWx1ZSAob3IgZXJyb3IpLiBUaGlzIGZ1bmN0aW9uIGV4cGVjdHMgdGhhdCBzb3VyY2UgaXMgYSBfRnV0dXJlLgogIHN0YXRpYyB2b2lkIF9jaGFpbkNvcmVGdXR1cmUoX0Z1dHVyZSBzb3VyY2UsIF9GdXR1cmUgdGFyZ2V0KSB7CiAgICBhc3NlcnQodGFyZ2V0Ll9tYXlBZGRMaXN0ZW5lcik7IC8vIE5vdCBjb21wbGV0ZWQsIG5vdCBhbHJlYWR5IGNoYWluZWQuCiAgICB3aGlsZSAoc291cmNlLl9pc0NoYWluZWQpIHsKICAgICAgc291cmNlID0gc291cmNlLl9jaGFpblNvdXJjZTsKICAgIH0KICAgIGlmIChzb3VyY2UuX2lzQ29tcGxldGUpIHsKICAgICAgX0Z1dHVyZUxpc3RlbmVyIGxpc3RlbmVycyA9IHRhcmdldC5fcmVtb3ZlTGlzdGVuZXJzKCk7CiAgICAgIHRhcmdldC5fY2xvbmVSZXN1bHQoc291cmNlKTsKICAgICAgX3Byb3BhZ2F0ZVRvTGlzdGVuZXJzKHRhcmdldCwgbGlzdGVuZXJzKTsKICAgIH0gZWxzZSB7CiAgICAgIF9GdXR1cmVMaXN0ZW5lciBsaXN0ZW5lcnMgPSB0YXJnZXQuX3Jlc3VsdE9yTGlzdGVuZXJzOwogICAgICB0YXJnZXQuX3NldENoYWluZWQoc291cmNlKTsKICAgICAgc291cmNlLl9wcmVwZW5kTGlzdGVuZXJzKGxpc3RlbmVycyk7CiAgICB9CiAgfQoKICB2b2lkIF9jb21wbGV0ZShGdXR1cmVPcjxUPiB2YWx1ZSkgewogICAgYXNzZXJ0KCFfaXNDb21wbGV0ZSk7CiAgICBpZiAodmFsdWUgaXMgRnV0dXJlPFQ+KSB7CiAgICAgIGlmICh2YWx1ZSBpcyBfRnV0dXJlPFQ+KSB7CiAgICAgICAgX2NoYWluQ29yZUZ1dHVyZSh2YWx1ZSwgdGhpcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2NoYWluRm9yZWlnbkZ1dHVyZSh2YWx1ZSwgdGhpcyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIF9GdXR1cmVMaXN0ZW5lciBsaXN0ZW5lcnMgPSBfcmVtb3ZlTGlzdGVuZXJzKCk7CiAgICAgIF9zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgIF9wcm9wYWdhdGVUb0xpc3RlbmVycyh0aGlzLCBsaXN0ZW5lcnMpOwogICAgfQogIH0KCiAgdm9pZCBfY29tcGxldGVXaXRoVmFsdWUoVCB2YWx1ZSkgewogICAgYXNzZXJ0KCFfaXNDb21wbGV0ZSk7CiAgICBhc3NlcnQodmFsdWUgaXMhIEZ1dHVyZTxUPik7CgogICAgX0Z1dHVyZUxpc3RlbmVyIGxpc3RlbmVycyA9IF9yZW1vdmVMaXN0ZW5lcnMoKTsKICAgIF9zZXRWYWx1ZSh2YWx1ZSk7CiAgICBfcHJvcGFnYXRlVG9MaXN0ZW5lcnModGhpcywgbGlzdGVuZXJzKTsKICB9CgogIHZvaWQgX2NvbXBsZXRlRXJyb3IoT2JqZWN0IGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgYXNzZXJ0KCFfaXNDb21wbGV0ZSk7CgogICAgX0Z1dHVyZUxpc3RlbmVyIGxpc3RlbmVycyA9IF9yZW1vdmVMaXN0ZW5lcnMoKTsKICAgIF9zZXRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICBfcHJvcGFnYXRlVG9MaXN0ZW5lcnModGhpcywgbGlzdGVuZXJzKTsKICB9CgogIHZvaWQgX2FzeW5jQ29tcGxldGUoRnV0dXJlT3I8VD4gdmFsdWUpIHsKICAgIGFzc2VydCghX2lzQ29tcGxldGUpOwogICAgLy8gVHdvIGNvcm5lciBjYXNlcyBpZiB0aGUgdmFsdWUgaXMgYSBmdXR1cmU6CiAgICAvLyAgIDEuIHRoZSBmdXR1cmUgaXMgYWxyZWFkeSBjb21wbGV0ZWQgYW5kIGFuIGVycm9yLgogICAgLy8gICAyLiB0aGUgZnV0dXJlIGlzIG5vdCB5ZXQgY29tcGxldGVkIGJ1dCBtaWdodCBiZWNvbWUgYW4gZXJyb3IuCiAgICAvLyBUaGUgZmlyc3QgY2FzZSBtZWFucyB0aGF0IHdlIG11c3Qgbm90IGltbWVkaWF0ZWx5IGNvbXBsZXRlIHRoZSBGdXR1cmUsCiAgICAvLyBhcyBvdXIgY29kZSB3b3VsZCBpbW1lZGlhdGVseSBzdGFydCBwcm9wYWdhdGluZyB0aGUgZXJyb3Igd2l0aG91dAogICAgLy8gZ2l2aW5nIHRoZSB0aW1lIHRvIGluc3RhbGwgZXJyb3ItaGFuZGxlcnMuCiAgICAvLyBIb3dldmVyIHRoZSBzZWNvbmQgY2FzZSByZXF1aXJlcyB1cyB0byBkZWFsIHdpdGggdGhlIHZhbHVlIGltbWVkaWF0ZWx5LgogICAgLy8gT3RoZXJ3aXNlIHRoZSB2YWx1ZSBjb3VsZCBjb21wbGV0ZSB3aXRoIGFuIGVycm9yIGFuZCByZXBvcnQgYW4KICAgIC8vIHVuaGFuZGxlZCBlcnJvciwgZXZlbiB0aG91Z2ggd2Uga25vdyB3ZSBhcmUgYWxyZWFkeSBnb2luZyB0byBsaXN0ZW4gdG8KICAgIC8vIGl0LgoKICAgIGlmICh2YWx1ZSBpcyBGdXR1cmU8VD4pIHsKICAgICAgX2NoYWluRnV0dXJlKHZhbHVlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgX3NldFBlbmRpbmdDb21wbGV0ZSgpOwogICAgX3pvbmUuc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAgICBfY29tcGxldGVXaXRoVmFsdWUodmFsdWUpOwogICAgfSk7CiAgfQoKICB2b2lkIF9jaGFpbkZ1dHVyZShGdXR1cmU8VD4gdmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpcyBfRnV0dXJlPFQ+KSB7CiAgICAgIGlmICh2YWx1ZS5faGFzRXJyb3IpIHsKICAgICAgICAvLyBEZWxheSBjb21wbGV0aW9uIHRvIGFsbG93IHRoZSB1c2VyIHRvIHJlZ2lzdGVyIGNhbGxiYWNrcy4KICAgICAgICBfc2V0UGVuZGluZ0NvbXBsZXRlKCk7CiAgICAgICAgX3pvbmUuc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAgICAgICAgX2NoYWluQ29yZUZ1dHVyZSh2YWx1ZSwgdGhpcyk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2NoYWluQ29yZUZ1dHVyZSh2YWx1ZSwgdGhpcyk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gSnVzdCBsaXN0ZW4gb24gdGhlIGZvcmVpZ24gZnV0dXJlLiBUaGlzIGd1YXJhbnRlZXMgYW4gYXN5bmMgZGVsYXkuCiAgICBfY2hhaW5Gb3JlaWduRnV0dXJlKHZhbHVlLCB0aGlzKTsKICB9CgogIHZvaWQgX2FzeW5jQ29tcGxldGVFcnJvcihlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBhc3NlcnQoIV9pc0NvbXBsZXRlKTsKCiAgICBfc2V0UGVuZGluZ0NvbXBsZXRlKCk7CiAgICBfem9uZS5zY2hlZHVsZU1pY3JvdGFzaygoKSB7CiAgICAgIF9jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIH0pOwogIH0KCiAgLyoqCiAgICogUHJvcGFnYXRlcyB0aGUgdmFsdWUvZXJyb3Igb2YgW3NvdXJjZV0gdG8gaXRzIFtsaXN0ZW5lcnNdLCBleGVjdXRpbmcgdGhlCiAgICogbGlzdGVuZXJzJyBjYWxsYmFja3MuCiAgICovCiAgc3RhdGljIHZvaWQgX3Byb3BhZ2F0ZVRvTGlzdGVuZXJzKF9GdXR1cmUgc291cmNlLCBfRnV0dXJlTGlzdGVuZXIgbGlzdGVuZXJzKSB7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBhc3NlcnQoc291cmNlLl9pc0NvbXBsZXRlKTsKICAgICAgYm9vbCBoYXNFcnJvciA9IHNvdXJjZS5faGFzRXJyb3I7CiAgICAgIGlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewogICAgICAgIGlmIChoYXNFcnJvcikgewogICAgICAgICAgQXN5bmNFcnJvciBhc3luY0Vycm9yID0gc291cmNlLl9lcnJvcjsKICAgICAgICAgIHNvdXJjZS5fem9uZQogICAgICAgICAgICAgIC5oYW5kbGVVbmNhdWdodEVycm9yKGFzeW5jRXJyb3IuZXJyb3IsIGFzeW5jRXJyb3Iuc3RhY2tUcmFjZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBVc3VhbGx5IGZ1dHVyZXMgb25seSBoYXZlIG9uZSBsaXN0ZW5lci4gSWYgdGhleSBoYXZlIHNldmVyYWwsIHdlCiAgICAgIC8vIGNhbGwgaGFuZGxlIHRoZW0gc2VwYXJhdGVseSBpbiByZWN1cnNpdmUgY2FsbHMsIGNvbnRpbnVpbmcKICAgICAgLy8gaGVyZSBvbmx5IHdoZW4gdGhlcmUgaXMgb25seSBvbmUgbGlzdGVuZXIgbGVmdC4KICAgICAgd2hpbGUgKGxpc3RlbmVycy5fbmV4dExpc3RlbmVyICE9IG51bGwpIHsKICAgICAgICBfRnV0dXJlTGlzdGVuZXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnM7CiAgICAgICAgbGlzdGVuZXJzID0gbGlzdGVuZXIuX25leHRMaXN0ZW5lcjsKICAgICAgICBsaXN0ZW5lci5fbmV4dExpc3RlbmVyID0gbnVsbDsKICAgICAgICBfcHJvcGFnYXRlVG9MaXN0ZW5lcnMoc291cmNlLCBsaXN0ZW5lcik7CiAgICAgIH0KICAgICAgX0Z1dHVyZUxpc3RlbmVyIGxpc3RlbmVyID0gbGlzdGVuZXJzOwogICAgICBmaW5hbCBzb3VyY2VSZXN1bHQgPSBzb3VyY2UuX3Jlc3VsdE9yTGlzdGVuZXJzOwogICAgICAvLyBEbyB0aGUgYWN0dWFsIHByb3BhZ2F0aW9uLgogICAgICAvLyBTZXQgaW5pdGlhbCBzdGF0ZSBvZiBsaXN0ZW5lckhhc0Vycm9yIGFuZCBsaXN0ZW5lclZhbHVlT3JFcnJvci4gVGhlc2UKICAgICAgLy8gdmFyaWFibGVzIGFyZSB1cGRhdGVkIHdpdGggdGhlIG91dGNvbWUgb2YgcG90ZW50aWFsIGNhbGxiYWNrcy4KICAgICAgLy8gTm9uLWVycm9yIHJlc3VsdHMsIGluY2x1ZGluZyBmdXR1cmVzLCBhcmUgc3RvcmVkIGluCiAgICAgIC8vIGxpc3RlbmVyVmFsdWVPckVycm9yIGFuZCBsaXN0ZW5lckhhc0Vycm9yIGlzIHNldCB0byBmYWxzZS4gRXJyb3JzCiAgICAgIC8vIGFyZSBzdG9yZWQgaW4gbGlzdGVuZXJWYWx1ZU9yRXJyb3IgYXMgYW4gW0FzeW5jRXJyb3JdIGFuZAogICAgICAvLyBsaXN0ZW5lckhhc0Vycm9yIGlzIHNldCB0byB0cnVlLgogICAgICBib29sIGxpc3RlbmVySGFzRXJyb3IgPSBoYXNFcnJvcjsKICAgICAgdmFyIGxpc3RlbmVyVmFsdWVPckVycm9yID0gc291cmNlUmVzdWx0OwoKICAgICAgLy8gT25seSBpZiB3ZSBlaXRoZXIgaGF2ZSBhbiBlcnJvciBvciBjYWxsYmFja3MsIGdvIGludG8gdGhpcywgc29tZXdoYXQKICAgICAgLy8gZXhwZW5zaXZlLCBicmFuY2guIEhlcmUgd2UnbGwgZW50ZXIvbGVhdmUgdGhlIHpvbmUuIE1hbnkgZnV0dXJlcwogICAgICAvLyBkb24ndCBoYXZlIGNhbGxiYWNrcywgc28gdGhpcyBpcyBhIHNpZ25pZmljYW50IG9wdGltaXphdGlvbi4KICAgICAgaWYgKGhhc0Vycm9yIHx8IGxpc3RlbmVyLmhhbmRsZXNWYWx1ZSB8fCBsaXN0ZW5lci5oYW5kbGVzQ29tcGxldGUpIHsKICAgICAgICBab25lIHpvbmUgPSBsaXN0ZW5lci5fem9uZTsKICAgICAgICBpZiAoaGFzRXJyb3IgJiYgIXNvdXJjZS5fem9uZS5pblNhbWVFcnJvclpvbmUoem9uZSkpIHsKICAgICAgICAgIC8vIERvbid0IGNyb3NzIHpvbmUgYm91bmRhcmllcyB3aXRoIGVycm9ycy4KICAgICAgICAgIEFzeW5jRXJyb3IgYXN5bmNFcnJvciA9IHNvdXJjZS5fZXJyb3I7CiAgICAgICAgICBzb3VyY2UuX3pvbmUKICAgICAgICAgICAgICAuaGFuZGxlVW5jYXVnaHRFcnJvcihhc3luY0Vycm9yLmVycm9yLCBhc3luY0Vycm9yLnN0YWNrVHJhY2UpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgWm9uZSBvbGRab25lOwogICAgICAgIGlmICghaWRlbnRpY2FsKFpvbmUuY3VycmVudCwgem9uZSkpIHsKICAgICAgICAgIC8vIENoYW5nZSB6b25lIGlmIGl0J3Mgbm90IGN1cnJlbnQuCiAgICAgICAgICBvbGRab25lID0gWm9uZS5fZW50ZXIoem9uZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBUaGVzZSBjYWxsYmFja3MgYXJlIGFic3RyYWN0ZWQgdG8gaXNvbGF0ZSB0aGUgdHJ5L2NhdGNoIGJsb2NrcwogICAgICAgIC8vIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGNvZGUgdG8gd29yayBhcm91bmQgYSBWOCBnbGFzcyBqYXcuCiAgICAgICAgdm9pZCBoYW5kbGVXaGVuQ29tcGxldGVDYWxsYmFjaygpIHsKICAgICAgICAgIC8vIFRoZSB3aGVuQ29tcGxldGUtaGFuZGxlciBpcyBub3QgY29tYmluZWQgd2l0aCBub3JtYWwgdmFsdWUvZXJyb3IKICAgICAgICAgIC8vIGhhbmRsaW5nLiBUaGlzIG1lYW5zIGF0IG1vc3Qgb25lIGhhbmRsZVggbWV0aG9kIGlzIGNhbGxlZCBwZXIKICAgICAgICAgIC8vIGxpc3RlbmVyLgogICAgICAgICAgYXNzZXJ0KCFsaXN0ZW5lci5oYW5kbGVzVmFsdWUpOwogICAgICAgICAgYXNzZXJ0KCFsaXN0ZW5lci5oYW5kbGVzRXJyb3IpOwogICAgICAgICAgdmFyIGNvbXBsZXRlUmVzdWx0OwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29tcGxldGVSZXN1bHQgPSBsaXN0ZW5lci5oYW5kbGVXaGVuQ29tcGxldGUoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgICAgaWYgKGhhc0Vycm9yICYmIGlkZW50aWNhbChzb3VyY2UuX2Vycm9yLmVycm9yLCBlKSkgewogICAgICAgICAgICAgIGxpc3RlbmVyVmFsdWVPckVycm9yID0gc291cmNlLl9lcnJvcjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsaXN0ZW5lclZhbHVlT3JFcnJvciA9IG5ldyBBc3luY0Vycm9yKGUsIHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxpc3RlbmVySGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY29tcGxldGVSZXN1bHQgaXMgRnV0dXJlKSB7CiAgICAgICAgICAgIGlmIChjb21wbGV0ZVJlc3VsdCBpcyBfRnV0dXJlICYmIGNvbXBsZXRlUmVzdWx0Ll9pc0NvbXBsZXRlKSB7CiAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlUmVzdWx0Ll9oYXNFcnJvcikgewogICAgICAgICAgICAgICAgbGlzdGVuZXJWYWx1ZU9yRXJyb3IgPSBjb21wbGV0ZVJlc3VsdC5fZXJyb3I7CiAgICAgICAgICAgICAgICBsaXN0ZW5lckhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUgZXhpc3RpbmcgcmVzdWx0IG9mIHNvdXJjZS4KICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgY29tcGxldGVSZXN1bHQgZnV0dXJlIHRvIGNvbXBsZXRlCiAgICAgICAgICAgIC8vIGJlZm9yZSBrbm93aW5nIGlmIGl0J3MgYW4gZXJyb3Igb3Igd2Ugc2hvdWxkIHVzZSB0aGUgcmVzdWx0CiAgICAgICAgICAgIC8vIG9mIHNvdXJjZS4KICAgICAgICAgICAgdmFyIG9yaWdpbmFsU291cmNlID0gc291cmNlOwogICAgICAgICAgICBsaXN0ZW5lclZhbHVlT3JFcnJvciA9IGNvbXBsZXRlUmVzdWx0LnRoZW4oKF8pID0+IG9yaWdpbmFsU291cmNlKTsKICAgICAgICAgICAgbGlzdGVuZXJIYXNFcnJvciA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdm9pZCBoYW5kbGVWYWx1ZUNhbGxiYWNrKCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbGlzdGVuZXJWYWx1ZU9yRXJyb3IgPSBsaXN0ZW5lci5oYW5kbGVWYWx1ZShzb3VyY2VSZXN1bHQpOwogICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICBsaXN0ZW5lclZhbHVlT3JFcnJvciA9IG5ldyBBc3luY0Vycm9yKGUsIHMpOwogICAgICAgICAgICBsaXN0ZW5lckhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZvaWQgaGFuZGxlRXJyb3IoKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBBc3luY0Vycm9yIGFzeW5jRXJyb3IgPSBzb3VyY2UuX2Vycm9yOwogICAgICAgICAgICBpZiAobGlzdGVuZXIubWF0Y2hlc0Vycm9yVGVzdChhc3luY0Vycm9yKSAmJgogICAgICAgICAgICAgICAgbGlzdGVuZXIuaGFzRXJyb3JDYWxsYmFjaykgewogICAgICAgICAgICAgIGxpc3RlbmVyVmFsdWVPckVycm9yID0gbGlzdGVuZXIuaGFuZGxlRXJyb3IoYXN5bmNFcnJvcik7CiAgICAgICAgICAgICAgbGlzdGVuZXJIYXNFcnJvciA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgIGlmIChpZGVudGljYWwoc291cmNlLl9lcnJvci5lcnJvciwgZSkpIHsKICAgICAgICAgICAgICBsaXN0ZW5lclZhbHVlT3JFcnJvciA9IHNvdXJjZS5fZXJyb3I7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbGlzdGVuZXJWYWx1ZU9yRXJyb3IgPSBuZXcgQXN5bmNFcnJvcihlLCBzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsaXN0ZW5lckhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChsaXN0ZW5lci5oYW5kbGVzQ29tcGxldGUpIHsKICAgICAgICAgIGhhbmRsZVdoZW5Db21wbGV0ZUNhbGxiYWNrKCk7CiAgICAgICAgfSBlbHNlIGlmICghaGFzRXJyb3IpIHsKICAgICAgICAgIGlmIChsaXN0ZW5lci5oYW5kbGVzVmFsdWUpIHsKICAgICAgICAgICAgaGFuZGxlVmFsdWVDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAobGlzdGVuZXIuaGFuZGxlc0Vycm9yKSB7CiAgICAgICAgICAgIGhhbmRsZUVycm9yKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBJZiB3ZSBjaGFuZ2VkIHpvbmUsIG9sZFpvbmUgd2lsbCBub3QgYmUgbnVsbC4KICAgICAgICBpZiAob2xkWm9uZSAhPSBudWxsKSBab25lLl9sZWF2ZShvbGRab25lKTsKCiAgICAgICAgLy8gSWYgdGhlIGxpc3RlbmVyJ3MgdmFsdWUgaXMgYSBmdXR1cmUgd2UgbmVlZCB0byBjaGFpbiBpdC4gTm90ZSB0aGF0CiAgICAgICAgLy8gdGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlcmUgaXMgYSBjYWxsYmFjay4KICAgICAgICBpZiAobGlzdGVuZXJWYWx1ZU9yRXJyb3IgaXMgRnV0dXJlKSB7CiAgICAgICAgICBGdXR1cmUgY2hhaW5Tb3VyY2UgPSBsaXN0ZW5lclZhbHVlT3JFcnJvcjsKICAgICAgICAgIC8vIFNob3J0Y3V0IGlmIHRoZSBjaGFpbi1zb3VyY2UgaXMgYWxyZWFkeSBjb21wbGV0ZWQuIEp1c3QgY29udGludWUKICAgICAgICAgIC8vIHRoZSBsb29wLgogICAgICAgICAgX0Z1dHVyZSByZXN1bHQgPSBsaXN0ZW5lci5yZXN1bHQ7CiAgICAgICAgICBpZiAoY2hhaW5Tb3VyY2UgaXMgX0Z1dHVyZSkgewogICAgICAgICAgICBpZiAoY2hhaW5Tb3VyY2UuX2lzQ29tcGxldGUpIHsKICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSByZXN1bHQuX3JlbW92ZUxpc3RlbmVycygpOwogICAgICAgICAgICAgIHJlc3VsdC5fY2xvbmVSZXN1bHQoY2hhaW5Tb3VyY2UpOwogICAgICAgICAgICAgIHNvdXJjZSA9IGNoYWluU291cmNlOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIF9jaGFpbkNvcmVGdXR1cmUoY2hhaW5Tb3VyY2UsIHJlc3VsdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9jaGFpbkZvcmVpZ25GdXR1cmUoY2hhaW5Tb3VyY2UsIHJlc3VsdCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIF9GdXR1cmUgcmVzdWx0ID0gbGlzdGVuZXIucmVzdWx0OwogICAgICBsaXN0ZW5lcnMgPSByZXN1bHQuX3JlbW92ZUxpc3RlbmVycygpOwogICAgICBpZiAoIWxpc3RlbmVySGFzRXJyb3IpIHsKICAgICAgICByZXN1bHQuX3NldFZhbHVlKGxpc3RlbmVyVmFsdWVPckVycm9yKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBBc3luY0Vycm9yIGFzeW5jRXJyb3IgPSBsaXN0ZW5lclZhbHVlT3JFcnJvcjsKICAgICAgICByZXN1bHQuX3NldEVycm9yT2JqZWN0KGFzeW5jRXJyb3IpOwogICAgICB9CiAgICAgIC8vIFByZXBhcmUgZm9yIG5leHQgcm91bmQuCiAgICAgIHNvdXJjZSA9IHJlc3VsdDsKICAgIH0KICB9CgogIEZ1dHVyZTxUPiB0aW1lb3V0KER1cmF0aW9uIHRpbWVMaW1pdCwge0Z1dHVyZU9yPFQ+IG9uVGltZW91dCgpfSkgewogICAgaWYgKF9pc0NvbXBsZXRlKSByZXR1cm4gbmV3IF9GdXR1cmUuaW1tZWRpYXRlKHRoaXMpOwogICAgX0Z1dHVyZTxUPiByZXN1bHQgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgVGltZXIgdGltZXI7CiAgICBpZiAob25UaW1lb3V0ID09IG51bGwpIHsKICAgICAgdGltZXIgPSBuZXcgVGltZXIodGltZUxpbWl0LCAoKSB7CiAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZUVycm9yKAogICAgICAgICAgICBuZXcgVGltZW91dEV4Y2VwdGlvbigiRnV0dXJlIG5vdCBjb21wbGV0ZWQiLCB0aW1lTGltaXQpKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBab25lIHpvbmUgPSBab25lLmN1cnJlbnQ7CiAgICAgIG9uVGltZW91dCA9IHpvbmUucmVnaXN0ZXJDYWxsYmFjayhvblRpbWVvdXQpOwogICAgICB0aW1lciA9IG5ldyBUaW1lcih0aW1lTGltaXQsICgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZSh6b25lLnJ1bihvblRpbWVvdXQpKTsKICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICByZXN1bHQuX2NvbXBsZXRlRXJyb3IoZSwgcyk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIHRoaXMudGhlbigoVCB2KSB7CiAgICAgIGlmICh0aW1lci5pc0FjdGl2ZSkgewogICAgICAgIHRpbWVyLmNhbmNlbCgpOwogICAgICAgIHJlc3VsdC5fY29tcGxldGVXaXRoVmFsdWUodik7CiAgICAgIH0KICAgIH0sIG9uRXJyb3I6IChlLCBTdGFja1RyYWNlIHMpIHsKICAgICAgaWYgKHRpbWVyLmlzQWN0aXZlKSB7CiAgICAgICAgdGltZXIuY2FuY2VsKCk7CiAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZUVycm9yKGUsIHMpOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgovLy8gUmVnaXN0ZXJzIGVycm9ySGFuZGxlciBpbiB6b25lIGlmIGl0IGhhcyB0aGUgY29ycmVjdCB0eXBlLgovLy8KLy8vIENoZWNrcyB0aGF0IHRoZSBmdW5jdGlvbiBhY2NlcHRzIGVpdGhlciBhbiBbT2JqZWN0XSBhbmQgYSBbU3RhY2tUcmFjZV0KLy8vIG9yIGp1c3Qgb25lIFtPYmplY3RdLiBEb2VzIG5vdCBjaGVjayB0aGUgcmV0dXJuIHR5cGUuCi8vLyBUaGUgYWN0dWFsbHkgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBgRnV0dXJlT3I8Uj5gIHdoZXJlIGBSYCBpcyB0aGUKLy8vIHZhbHVlIHR5cGUgb2YgdGhlIGZ1dHVyZSB0aGF0IHRoZSBjYWxsIHdpbGwgY29tcGxldGUgKGVpdGhlciByZXR1cm5lZAovLy8gYnkgW0Z1dHVyZS50aGVuXSBvciBbRnV0dXJlLmNhdGNoRXJyb3JdKS4gV2UgY2hlY2sgdGhlIHJldHVybmVkIHZhbHVlCi8vLyBkeW5hbWljYWxseSBiZWNhdXNlIHRoZSBmdW5jdGlvbnMgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgaW4gcG9zaXRpb25zCi8vLyB3aXRob3V0IGluZmVyZW5jZSwgc28gYSBmdW5jdGlvbiBleHByZXNzaW9uIHdvbid0IGluZmVyIHRoZSByZXR1cm4gdHlwZS4KLy8vCi8vLyBUaHJvd3MgaWYgdGhlIHR5cGUgaXMgbm90IHZhbGlkLgpGdW5jdGlvbiBfcmVnaXN0ZXJFcnJvckhhbmRsZXIoRnVuY3Rpb24gZXJyb3JIYW5kbGVyLCBab25lIHpvbmUpIHsKICBpZiAoZXJyb3JIYW5kbGVyIGlzIGR5bmFtaWMgRnVuY3Rpb24oT2JqZWN0LCBTdGFja1RyYWNlKSkgewogICAgcmV0dXJuIHpvbmUKICAgICAgICAucmVnaXN0ZXJCaW5hcnlDYWxsYmFjazxkeW5hbWljLCBPYmplY3QsIFN0YWNrVHJhY2U+KGVycm9ySGFuZGxlcik7CiAgfQogIGlmIChlcnJvckhhbmRsZXIgaXMgZHluYW1pYyBGdW5jdGlvbihPYmplY3QpKSB7CiAgICByZXR1cm4gem9uZS5yZWdpc3RlclVuYXJ5Q2FsbGJhY2s8ZHluYW1pYywgT2JqZWN0PihlcnJvckhhbmRsZXIpOwogIH0KICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgZXJyb3JIYW5kbGVyLAogICAgICAib25FcnJvciIsCiAgICAgICJFcnJvciBoYW5kbGVyIG11c3QgYWNjZXB0IG9uZSBPYmplY3Qgb3Igb25lIE9iamVjdCBhbmQgYSBTdGFja1RyYWNlIgogICAgICAiIGFzIGFyZ3VtZW50cywgYW5kIHJldHVybiBhIGEgdmFsaWQgcmVzdWx0Iik7Cn0KgwcATk48ARQBSjNELR0hATcuASYBPiJQTB8wKwYnBAE8AU0kMAIBMSdQIgQBPTMEAgEwJ1AdBAE9LgQCAR4iIiYpIyo9MEQ5QCE9Gx4TNBsfIAEYSRwnSAFNTAE7HiMBIgE1NTs8ASYaFQQBKiQaFQQBKh0VBAEzBkgeGh0EASxDBAExJEcEATMuREpHQTtDDTlPBgQBIRsrBAIBKD4+IykBR0krLgFIPjYmATkkATokATYhAQYuNwVFRQYUAQY/BT08BUdJLgVNUCk2BhoBLiQBQRwEAUErFgQBPR8sBAFEQAE3Qj8yMS8BJR0cIQQBQiUuQB1OJjI/CAYzBAEpKDIqRhMEAT8qLz5JBk8TBAEtKi8/BkoTBAE6AR8aJAQBISAfBAEaFx8EAR0YHwQBKRxAGiAEAStAGiAEATg4BAE/BkcmGiAcNAQBMCwbMyUNGDhCHicjKRIKHggbLyMvCgYEATYjGz4mJywvKQoyCA0YOEIeJyMvEgoeCBswIzAKBgQBJ0wbGjIfJwQBQRopHjQkFhYGEQQBTUxJE0MhIAFAIgocK0MrO00hCVBNURs2KzIKFU0aUDAdJQoGBAFNR0FLICQGHj0jMA09IisGBAEmGh4hJw8qCA02GC4GBAElGiEBNBYsBAE/GgE0IiwEASsaMjpHTkkyT0ZOCwEeGw4GGyEhCAQBJx8dRR8lKQwPJwgOBkomBAE7GgEbISkIBAEGThsGURMiKB8YMRdNChAISkQ5MC4sJzEILDYkT0g9S0MqKC8BTkpGSyQ/NjEXTRIKARYuLicKAUpELE5LFyoqHhA8G0E0FTsOJRQMKksuPikQPhYOSUsaKU8mDAoBJRBHGzklDAoBHRAzOS1HKA4bNTQVOw4lDAoBKCggJyMMEScbDAoBOTMBTjguNU4XLCgrNTAkGBU1DhM2DBIKCCgtHzAPNiwIIRcGBAFFOSoRHSgfRgoNIDQoDjEZJwoKBhYcGCYIJBwYJQgIEwQCAT8ESzpHSkpLTQQlQz4QTAQyRgQhFBFMNQIBG2RhcnQ6YXN5bmMvZnV0dXJlX2ltcGwuZGFydDlvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvYXN5bmMvc2NoZWR1bGVfbWljcm90YXNrLmRhcnSTDi8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuYXN5bmM7Cgp0eXBlZGVmIHZvaWQgX0FzeW5jQ2FsbGJhY2soKTsKCmNsYXNzIF9Bc3luY0NhbGxiYWNrRW50cnkgewogIGZpbmFsIF9Bc3luY0NhbGxiYWNrIGNhbGxiYWNrOwogIF9Bc3luY0NhbGxiYWNrRW50cnkgbmV4dDsKICBfQXN5bmNDYWxsYmFja0VudHJ5KHRoaXMuY2FsbGJhY2spOwp9CgovKiogSGVhZCBvZiBzaW5nbGUgbGlua2VkIGxpc3Qgb2YgcGVuZGluZyBjYWxsYmFja3MuICovCl9Bc3luY0NhbGxiYWNrRW50cnkgX25leHRDYWxsYmFjazsKLyoqIFRhaWwgb2Ygc2luZ2xlIGxpbmtlZCBsaXN0IG9mIHBlbmRpbmcgY2FsbGJhY2tzLiAqLwpfQXN5bmNDYWxsYmFja0VudHJ5IF9sYXN0Q2FsbGJhY2s7Ci8qKgogKiBUYWlsIG9mIHByaW9yaXR5IGNhbGxiYWNrcyBhZGRlZCBieSB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBjYWxsYmFjay4KICoKICogUHJpb3JpdHkgY2FsbGJhY2tzIGFyZSBwdXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKICogY2FsbGJhY2sgcXVldWUsIHNvIHRoYXQgaWYgb25lIGNhbGxiYWNrIHNjaGVkdWxlcyBtb3JlIHRoYW4gb25lCiAqIHByaW9yaXR5IGNhbGxiYWNrLCB0aGV5IGFyZSBzdGlsbCBlbnF1ZXVlZCBpbiBzY2hlZHVsaW5nIG9yZGVyLgogKi8KX0FzeW5jQ2FsbGJhY2tFbnRyeSBfbGFzdFByaW9yaXR5Q2FsbGJhY2s7Ci8qKgogKiBXaGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgaW5zaWRlIHRoZSBjYWxsYmFjayBsb29wLgogKgogKiBJZiB3ZSBhcmUgaW5zaWRlIHRoZSBsb29wLCB3ZSBuZXZlciBuZWVkIHRvIHNjaGVkdWxlIHRoZSBsb29wLAogKiBldmVuIGlmIGFkZGluZyBhIGZpcnN0IGVsZW1lbnQuCiAqLwpib29sIF9pc0luQ2FsbGJhY2tMb29wID0gZmFsc2U7Cgp2b2lkIF9taWNyb3Rhc2tMb29wKCkgewogIHdoaWxlIChfbmV4dENhbGxiYWNrICE9IG51bGwpIHsKICAgIF9sYXN0UHJpb3JpdHlDYWxsYmFjayA9IG51bGw7CiAgICBfQXN5bmNDYWxsYmFja0VudHJ5IGVudHJ5ID0gX25leHRDYWxsYmFjazsKICAgIF9uZXh0Q2FsbGJhY2sgPSBlbnRyeS5uZXh0OwogICAgaWYgKF9uZXh0Q2FsbGJhY2sgPT0gbnVsbCkgX2xhc3RDYWxsYmFjayA9IG51bGw7CiAgICAoZW50cnkuY2FsbGJhY2spKCk7CiAgfQp9Cgp2b2lkIF9zdGFydE1pY3JvdGFza0xvb3AoKSB7CiAgX2lzSW5DYWxsYmFja0xvb3AgPSB0cnVlOwogIHRyeSB7CiAgICAvLyBNb3ZlZCB0byBzZXBhcmF0ZSBmdW5jdGlvbiBiZWNhdXNlIHRyeS1maW5hbGx5IHByZXZlbnRzCiAgICAvLyBnb29kIG9wdGltaXphdGlvbi4KICAgIF9taWNyb3Rhc2tMb29wKCk7CiAgfSBmaW5hbGx5IHsKICAgIF9sYXN0UHJpb3JpdHlDYWxsYmFjayA9IG51bGw7CiAgICBfaXNJbkNhbGxiYWNrTG9vcCA9IGZhbHNlOwogICAgaWYgKF9uZXh0Q2FsbGJhY2sgIT0gbnVsbCkgewogICAgICBfQXN5bmNSdW4uX3NjaGVkdWxlSW1tZWRpYXRlKF9zdGFydE1pY3JvdGFza0xvb3ApOwogICAgfQogIH0KfQoKLyoqCiAqIFNjaGVkdWxlcyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBhcyBhIG1pY3JvdGFzay4KICoKICogVGhlIG1pY3JvdGFzayBpcyBjYWxsZWQgYWZ0ZXIgYWxsIG90aGVyIGN1cnJlbnRseSBzY2hlZHVsZWQKICogbWljcm90YXNrcywgYnV0IGFzIHBhcnQgb2YgdGhlIGN1cnJlbnQgc3lzdGVtIGV2ZW50LgogKi8Kdm9pZCBfc2NoZWR1bGVBc3luY0NhbGxiYWNrKF9Bc3luY0NhbGxiYWNrIGNhbGxiYWNrKSB7CiAgX0FzeW5jQ2FsbGJhY2tFbnRyeSBuZXdFbnRyeSA9IG5ldyBfQXN5bmNDYWxsYmFja0VudHJ5KGNhbGxiYWNrKTsKICBpZiAoX25leHRDYWxsYmFjayA9PSBudWxsKSB7CiAgICBfbmV4dENhbGxiYWNrID0gX2xhc3RDYWxsYmFjayA9IG5ld0VudHJ5OwogICAgaWYgKCFfaXNJbkNhbGxiYWNrTG9vcCkgewogICAgICBfQXN5bmNSdW4uX3NjaGVkdWxlSW1tZWRpYXRlKF9zdGFydE1pY3JvdGFza0xvb3ApOwogICAgfQogIH0gZWxzZSB7CiAgICBfbGFzdENhbGxiYWNrLm5leHQgPSBuZXdFbnRyeTsKICAgIF9sYXN0Q2FsbGJhY2sgPSBuZXdFbnRyeTsKICB9Cn0KCi8qKgogKiBTY2hlZHVsZXMgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIGFsbCBvdGhlciBjdXJyZW50bHkgc2NoZWR1bGVkIG9uZXMuCiAqCiAqIFRoaXMgY2FsbGJhY2sgdGFrZXMgcHJpb3JpdHkgb3ZlciBleGlzdGluZyBzY2hlZHVsZWQgY2FsbGJhY2tzLgogKiBJdCBpcyBvbmx5IHVzZWQgaW50ZXJuYWxseSB0byBnaXZlIGhpZ2hlciBwcmlvcml0eSB0byBlcnJvciByZXBvcnRpbmcuCiAqCiAqIElzIGFsd2F5cyBydW4gaW4gdGhlIHJvb3Qgem9uZS4KICovCnZvaWQgX3NjaGVkdWxlUHJpb3JpdHlBc3luY0NhbGxiYWNrKF9Bc3luY0NhbGxiYWNrIGNhbGxiYWNrKSB7CiAgaWYgKF9uZXh0Q2FsbGJhY2sgPT0gbnVsbCkgewogICAgX3NjaGVkdWxlQXN5bmNDYWxsYmFjayhjYWxsYmFjayk7CiAgICBfbGFzdFByaW9yaXR5Q2FsbGJhY2sgPSBfbGFzdENhbGxiYWNrOwogICAgcmV0dXJuOwogIH0KICBfQXN5bmNDYWxsYmFja0VudHJ5IGVudHJ5ID0gbmV3IF9Bc3luY0NhbGxiYWNrRW50cnkoY2FsbGJhY2spOwogIGlmIChfbGFzdFByaW9yaXR5Q2FsbGJhY2sgPT0gbnVsbCkgewogICAgZW50cnkubmV4dCA9IF9uZXh0Q2FsbGJhY2s7CiAgICBfbmV4dENhbGxiYWNrID0gX2xhc3RQcmlvcml0eUNhbGxiYWNrID0gZW50cnk7CiAgfSBlbHNlIHsKICAgIGVudHJ5Lm5leHQgPSBfbGFzdFByaW9yaXR5Q2FsbGJhY2submV4dDsKICAgIF9sYXN0UHJpb3JpdHlDYWxsYmFjay5uZXh0ID0gZW50cnk7CiAgICBfbGFzdFByaW9yaXR5Q2FsbGJhY2sgPSBlbnRyeTsKICAgIGlmIChlbnRyeS5uZXh0ID09IG51bGwpIHsKICAgICAgX2xhc3RDYWxsYmFjayA9IGVudHJ5OwogICAgfQogIH0KfQoKLyoqCiAqIFJ1bnMgYSBmdW5jdGlvbiBhc3luY2hyb25vdXNseS4KICoKICogQ2FsbGJhY2tzIHJlZ2lzdGVyZWQgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIGFyZSBhbHdheXMgZXhlY3V0ZWQgaW4gb3JkZXIgYW5kCiAqIGFyZSBndWFyYW50ZWVkIHRvIHJ1biBiZWZvcmUgb3RoZXIgYXN5bmNocm9ub3VzIGV2ZW50cyAobGlrZSBbVGltZXJdIGV2ZW50cywKICogb3IgRE9NIGV2ZW50cykuCiAqCiAqICoqV2FybmluZzoqKiBpdCBpcyBwb3NzaWJsZSB0byBzdGFydmUgdGhlIERPTSBieSByZWdpc3RlcmluZyBhc3luY2hyb25vdXMKICogY2FsbGJhY2tzIHRocm91Z2ggdGhpcyBtZXRob2QuIEZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBydW5zCiAqIHRoZSBjYWxsYmFja3Mgd2l0aG91dCBldmVyIGdpdmluZyB0aGUgVGltZXIgY2FsbGJhY2sgYSBjaGFuY2UgdG8gZXhlY3V0ZToKICoKICogICAgIG1haW4oKSB7CiAqICAgICAgIFRpbWVyLnJ1bigoKSB7IHByaW50KCJleGVjdXRlZCIpOyB9KTsgIC8vIFdpbGwgbmV2ZXIgYmUgZXhlY3V0ZWQuCiAqICAgICAgIGZvbygpIHsKICogICAgICAgICBzY2hlZHVsZU1pY3JvdGFzayhmb28pOyAgLy8gU2NoZWR1bGVzIFtmb29dIGluIGZyb250IG9mIG90aGVyIGV2ZW50cy4KICogICAgICAgfQogKiAgICAgICBmb28oKTsKICogICAgIH0KICoKICogIyMgT3RoZXIgcmVzb3VyY2VzCiAqCiAqICogW1RoZSBFdmVudCBMb29wIGFuZCBEYXJ0XShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvYXJ0aWNsZXMvZXZlbnQtbG9vcC8pOgogKiBMZWFybiBob3cgRGFydCBoYW5kbGVzIHRoZSBldmVudCBxdWV1ZSBhbmQgbWljcm90YXNrIHF1ZXVlLCBzbyB5b3UgY2FuIHdyaXRlCiAqIGJldHRlciBhc3luY2hyb25vdXMgY29kZSB3aXRoIGZld2VyIHN1cnByaXNlcy4KICovCnZvaWQgc2NoZWR1bGVNaWNyb3Rhc2sodm9pZCBjYWxsYmFjaygpKSB7CiAgX1pvbmUgY3VycmVudFpvbmUgPSBab25lLmN1cnJlbnQ7CiAgaWYgKGlkZW50aWNhbChfcm9vdFpvbmUsIGN1cnJlbnRab25lKSkgewogICAgLy8gTm8gbmVlZCB0byBiaW5kIHRoZSBjYWxsYmFjay4gV2Uga25vdyB0aGF0IHRoZSByb290J3Mgc2NoZWR1bGVNaWNyb3Rhc2sKICAgIC8vIHdpbGwgYmUgaW52b2tlZCBpbiB0aGUgcm9vdCB6b25lLgogICAgX3Jvb3RTY2hlZHVsZU1pY3JvdGFzayhudWxsLCBudWxsLCBfcm9vdFpvbmUsIGNhbGxiYWNrKTsKICAgIHJldHVybjsKICB9CiAgX1pvbmVGdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiA9IGN1cnJlbnRab25lLl9zY2hlZHVsZU1pY3JvdGFzazsKICBpZiAoaWRlbnRpY2FsKF9yb290Wm9uZSwgaW1wbGVtZW50YXRpb24uem9uZSkgJiYKICAgICAgX3Jvb3Rab25lLmluU2FtZUVycm9yWm9uZShjdXJyZW50Wm9uZSkpIHsKICAgIF9yb290U2NoZWR1bGVNaWNyb3Rhc2soCiAgICAgICAgbnVsbCwgbnVsbCwgY3VycmVudFpvbmUsIGN1cnJlbnRab25lLnJlZ2lzdGVyQ2FsbGJhY2soY2FsbGJhY2spKTsKICAgIHJldHVybjsKICB9CiAgWm9uZS5jdXJyZW50LnNjaGVkdWxlTWljcm90YXNrKFpvbmUuY3VycmVudC5iaW5kQ2FsbGJhY2tHdWFyZGVkKGNhbGxiYWNrKSk7Cn0KCmNsYXNzIF9Bc3luY1J1biB7CiAgLyoqIFNjaGVkdWxlIHRoZSBnaXZlbiBjYWxsYmFjayBiZWZvcmUgYW55IG90aGVyIGV2ZW50IGluIHRoZSBldmVudC1sb29wLiAqLwogIGV4dGVybmFsIHN0YXRpYyB2b2lkIF9zY2hlZHVsZUltbWVkaWF0ZSh2b2lkIGNhbGxiYWNrKCkpOwp9CoCbAE5OPAEUAR8BHCEcJgIBOCM4IwRJAzZDQwQrBDYDQiMEIAEYIiIvIDUYBAIBHRwIPxoWDiIfITkGBAIBBDUDPzgEN0QfLh45BgsjHgQCAQRQA0NKAyMEPx8mKwwEQScgMwstKCMeHQYEAgEEIwNPUBMDTUlNAxBLEVELEAkDFgNPUDIEKiQrTyk9DARBMzAcSgwETgIBEk88AgEiZGFydDphc3luYy9zY2hlZHVsZV9taWNyb3Rhc2suZGFydC1vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvYXN5bmMvc3RyZWFtLmRhcnTAAT/RLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5hc3luYzsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQ29yZSBTdHJlYW0gdHlwZXMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdHlwZWRlZiB2b2lkIF9UaW1lckNhbGxiYWNrKCk7CgovKioKICogQSBzb3VyY2Ugb2YgYXN5bmNocm9ub3VzIGRhdGEgZXZlbnRzLgogKgogKiBBIFN0cmVhbSBwcm92aWRlcyBhIHdheSB0byByZWNlaXZlIGEgc2VxdWVuY2Ugb2YgZXZlbnRzLgogKiBFYWNoIGV2ZW50IGlzIGVpdGhlciBhIGRhdGEgZXZlbnQsIGFsc28gY2FsbGVkIGFuICplbGVtZW50KiBvZiB0aGUgc3RyZWFtLAogKiBvciBhbiBlcnJvciBldmVudCwgd2hpY2ggaXMgYSBub3RpZmljYXRpb24gdGhhdCBzb21ldGhpbmcgaGFzIGZhaWxlZC4KICogV2hlbiBhIHN0cmVhbSBoYXMgZW1pdHRlZCBhbGwgaXRzIGV2ZW50LAogKiBhIHNpbmdsZSAiZG9uZSIgZXZlbnQgd2lsbCBub3RpZnkgdGhlIGxpc3RlbmVyIHRoYXQgdGhlIGVuZCBoYXMgYmVlbiByZWFjaGVkLgogKgogKiBZb3UgW2xpc3Rlbl0gb24gYSBzdHJlYW0gdG8gbWFrZSBpdCBzdGFydCBnZW5lcmF0aW5nIGV2ZW50cywKICogYW5kIHRvIHNldCB1cCBsaXN0ZW5lcnMgdGhhdCByZWNlaXZlIHRoZSBldmVudHMuCiAqIFdoZW4geW91IGxpc3RlbiwgeW91IHJlY2VpdmUgYSBbU3RyZWFtU3Vic2NyaXB0aW9uXSBvYmplY3QKICogd2hpY2ggaXMgdGhlIGFjdGl2ZSBvYmplY3QgcHJvdmlkaW5nIHRoZSBldmVudHMsCiAqIGFuZCB3aGljaCBjYW4gYmUgdXNlZCB0byBzdG9wIGxpc3RlbmluZyBhZ2FpbiwKICogb3IgdG8gdGVtcG9yYXJpbHkgcGF1c2UgZXZlbnRzIGZyb20gdGhlIHN1YnNjcmlwdGlvbi4KICoKICogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBzdHJlYW1zOiAiU2luZ2xlLXN1YnNjcmlwdGlvbiIgc3RyZWFtcyBhbmQKICogImJyb2FkY2FzdCIgc3RyZWFtcy4KICoKICogKkEgc2luZ2xlLXN1YnNjcmlwdGlvbiBzdHJlYW0qIGFsbG93cyBvbmx5IGEgc2luZ2xlIGxpc3RlbmVyIGR1cmluZyB0aGUgd2hvbGUKICogbGlmZXRpbWUgb2YgdGhlIHN0cmVhbS4KICogSXQgZG9lc24ndCBzdGFydCBnZW5lcmF0aW5nIGV2ZW50cyB1bnRpbCBpdCBoYXMgYSBsaXN0ZW5lciwKICogYW5kIGl0IHN0b3BzIHNlbmRpbmcgZXZlbnRzIHdoZW4gdGhlIGxpc3RlbmVyIGlzIHVuc3Vic2NyaWJlZCwKICogZXZlbiBpZiB0aGUgc291cmNlIG9mIGV2ZW50cyBjb3VsZCBzdGlsbCBwcm92aWRlIG1vcmUuCiAqCiAqIExpc3RlbmluZyB0d2ljZSBvbiBhIHNpbmdsZS1zdWJzY3JpcHRpb24gc3RyZWFtIGlzIG5vdCBhbGxvd2VkLCBldmVuIGFmdGVyCiAqIHRoZSBmaXJzdCBzdWJzY3JpcHRpb24gaGFzIGJlZW4gY2FuY2VsZWQuCiAqCiAqIFNpbmdsZS1zdWJzY3JpcHRpb24gc3RyZWFtcyBhcmUgZ2VuZXJhbGx5IHVzZWQgZm9yIHN0cmVhbWluZyBjaHVua3Mgb2YKICogbGFyZ2VyIGNvbnRpZ3VvdXMgZGF0YSBsaWtlIGZpbGUgSS9PLgogKgogKiAqQSBicm9hZGNhc3Qgc3RyZWFtKiBhbGxvd3MgYW55IG51bWJlciBvZiBsaXN0ZW5lcnMsIGFuZCBpdCBmaXJlcwogKiBpdHMgZXZlbnRzIHdoZW4gdGhleSBhcmUgcmVhZHksIHdoZXRoZXIgdGhlcmUgYXJlIGxpc3RlbmVycyBvciBub3QuCiAqCiAqIEJyb2FkY2FzdCBzdHJlYW1zIGFyZSB1c2VkIGZvciBpbmRlcGVuZGVudCBldmVudHMvb2JzZXJ2ZXJzLgogKgogKiBJZiBzZXZlcmFsIGxpc3RlbmVycyB3YW50IHRvIGxpc3RlbiB0byBhIHNpbmdsZSBzdWJzY3JpcHRpb24gc3RyZWFtLAogKiB1c2UgW2FzQnJvYWRjYXN0U3RyZWFtXSB0byBjcmVhdGUgYSBicm9hZGNhc3Qgc3RyZWFtIG9uIHRvcCBvZiB0aGUKICogbm9uLWJyb2FkY2FzdCBzdHJlYW0uCiAqCiAqIE9uIGVpdGhlciBraW5kIG9mIHN0cmVhbSwgc3RyZWFtIHRyYW5zZm9ybWF0aW9ucywgc3VjaCBhcyBbd2hlcmVdIGFuZAogKiBbc2tpcF0sIHJldHVybiB0aGUgc2FtZSB0eXBlIG9mIHN0cmVhbSBhcyB0aGUgb25lIHRoZSBtZXRob2Qgd2FzIGNhbGxlZCBvbiwKICogdW5sZXNzIG90aGVyd2lzZSBub3RlZC4KICoKICogV2hlbiBhbiBldmVudCBpcyBmaXJlZCwgdGhlIGxpc3RlbmVyKHMpIGF0IHRoYXQgdGltZSB3aWxsIHJlY2VpdmUgdGhlIGV2ZW50LgogKiBJZiBhIGxpc3RlbmVyIGlzIGFkZGVkIHRvIGEgYnJvYWRjYXN0IHN0cmVhbSB3aGlsZSBhbiBldmVudCBpcyBiZWluZyBmaXJlZCwKICogdGhhdCBsaXN0ZW5lciB3aWxsIG5vdCByZWNlaXZlIHRoZSBldmVudCBjdXJyZW50bHkgYmVpbmcgZmlyZWQuCiAqIElmIGEgbGlzdGVuZXIgaXMgY2FuY2VsZWQsIGl0IGltbWVkaWF0ZWx5IHN0b3BzIHJlY2VpdmluZyBldmVudHMuCiAqIExpc3RlbmluZyBvbiBhIGJyb2FkY2FzdCBzdHJlYW0gY2FuIGJlIHRyZWF0ZWQgYXMgbGlzdGVuaW5nIG9uIGEgbmV3IHN0cmVhbQogKiBjb250YWluaW5nIG9ubHkgdGhlIGV2ZW50cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGVtaXR0ZWQgd2hlbiB0aGUgW2xpc3Rlbl0KICogY2FsbCBvY2N1cnMuCiAqIEZvciBleGFtcGxlLCB0aGUgW2ZpcnN0XSBnZXR0ZXIgbGlzdGVucyB0byB0aGUgc3RyZWFtLCB0aGVuIHJldHVybnMgdGhlIGZpcnN0CiAqIGV2ZW50IHRoYXQgbGlzdGVuZXIgcmVjZWl2ZXMuCiAqIFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBmaXJzdCBldmVuIGVtaXR0ZWQgYnkgdGhlIHN0cmVhbSwgYnV0IHRoZSBmaXJzdAogKiBvZiB0aGUgKnJlbWFpbmluZyogZXZlbnRzIG9mIHRoZSBicm9hZGNhc3Qgc3RyZWFtLgogKgogKiBXaGVuIHRoZSAiZG9uZSIgZXZlbnQgaXMgZmlyZWQsIHN1YnNjcmliZXJzIGFyZSB1bnN1YnNjcmliZWQgYmVmb3JlCiAqIHJlY2VpdmluZyB0aGUgZXZlbnQuIEFmdGVyIHRoZSBldmVudCBoYXMgYmVlbiBzZW50LCB0aGUgc3RyZWFtIGhhcyBubwogKiBzdWJzY3JpYmVycy4gQWRkaW5nIG5ldyBzdWJzY3JpYmVycyB0byBhIGJyb2FkY2FzdCBzdHJlYW0gYWZ0ZXIgdGhpcyBwb2ludAogKiBpcyBhbGxvd2VkLCBidXQgdGhleSB3aWxsIGp1c3QgcmVjZWl2ZSBhIG5ldyAiZG9uZSIgZXZlbnQgYXMgc29vbgogKiBhcyBwb3NzaWJsZS4KICoKICogU3RyZWFtIHN1YnNjcmlwdGlvbnMgYWx3YXlzIHJlc3BlY3QgInBhdXNlIiByZXF1ZXN0cy4gSWYgbmVjZXNzYXJ5IHRoZXkgbmVlZAogKiB0byBidWZmZXIgdGhlaXIgaW5wdXQsIGJ1dCBvZnRlbiwgYW5kIHByZWZlcmFibHksIHRoZXkgY2FuIHNpbXBseSByZXF1ZXN0CiAqIHRoZWlyIGlucHV0IHRvIHBhdXNlIHRvby4KICoKICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgW2lzQnJvYWRjYXN0XSByZXR1cm5zIGZhbHNlLgogKiBBIGJyb2FkY2FzdCBzdHJlYW0gaW5oZXJpdGluZyBmcm9tIFtTdHJlYW1dIG11c3Qgb3ZlcnJpZGUgW2lzQnJvYWRjYXN0XQogKiB0byByZXR1cm4gYHRydWVgLgogKi8KYWJzdHJhY3QgY2xhc3MgU3RyZWFtPFQ+IHsKICBTdHJlYW0oKTsKCiAgLyoqCiAgICogSW50ZXJuYWwgdXNlIG9ubHkuIFdlIGRvIG5vdCB3YW50IHRvIHByb21pc2UgdGhhdCBTdHJlYW0gc3RheXMgY29uc3QuCiAgICoKICAgKiBJZiBtaXhpbnMgYmVjb21lIGNvbXBhdGlibGUgd2l0aCBjb25zdCBjb25zdHJ1Y3RvcnMsIHdlIG1heSB1c2UgYQogICAqIHN0cmVhbSBtaXhpbiBpbnN0ZWFkIG9mIGV4dGVuZGluZyBTdHJlYW0gZnJvbSBhIGNvbnN0IGNsYXNzLgogICAqLwogIGNvbnN0IFN0cmVhbS5faW50ZXJuYWwoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBlbXB0eSBicm9hZGNhc3Qgc3RyZWFtLgogICAqCiAgICogVGhpcyBpcyBhIHN0cmVhbSB3aGljaCBkb2VzIG5vdGhpbmcgZXhjZXB0IHNlbmRpbmcgYSBkb25lIGV2ZW50CiAgICogd2hlbiBpdCdzIGxpc3RlbmVkIHRvLgogICAqLwogIGNvbnN0IGZhY3RvcnkgU3RyZWFtLmVtcHR5KCkgPSBfRW1wdHlTdHJlYW08VD47CgogIC8qKgogICAqIENyZWF0ZXMgYSBzdHJlYW0gd2hpY2ggZW1pdHMgYSBzaW5nbGUgZGF0YSBldmVudCBiZWZvcmUgY29tcGxldGluZy4KICAgKgogICAqIFRoaXMgc3RyZWFtIGVtaXRzIGEgc2luZ2xlIGRhdGEgZXZlbnQgb2YgW3ZhbHVlXQogICAqIGFuZCB0aGVuIGNvbXBsZXRlcyB3aXRoIGEgZG9uZSBldmVudC4KICAgKgogICAqIEV4YW1wbGU6CiAgICogYGBgZGFydAogICAqIEZ1dHVyZTx2b2lkPiBwcmludFRoaW5ncyhTdHJlYW08U3RyaW5nPiBkYXRhKSBhc3luYyB7CiAgICogICBhd2FpdCBmb3IgKHZhciB4IGluIGRhdGEpIHsKICAgKiAgICAgcHJpbnQoeCk7CiAgICogICB9CiAgICogfQogICAqIHByaW50VGhpbmdzKFN0cmVhbTxTdHJpbmc+LnZhbHVlKCJvayIpKTsgLy8gcHJpbnRzICJvayIuCiAgICogYGBgCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIGlzIGVmZmVjdGl2ZWx5IGVxdWl2YWxlbnQgdG8gb25lIGNyZWF0ZWQgYnkKICAgKiBgKCgpIGFzeW5jKiB7IHlpZWxkIHZhbHVlOyB9ICgpKWAgb3IgYEZ1dHVyZTxUPi52YWx1ZSh2YWx1ZSkuYXNTdHJlYW0oKWAuCiAgICovCiAgQFNpbmNlKCIyLjUiKQogIGZhY3RvcnkgU3RyZWFtLnZhbHVlKFQgdmFsdWUpID0+CiAgICAgIChfQXN5bmNTdHJlYW1Db250cm9sbGVyPFQ+KG51bGwsIG51bGwsIG51bGwsIG51bGwpCiAgICAgICAgICAgIC4uX2FkZCh2YWx1ZSkKICAgICAgICAgICAgLi5fY2xvc2VVbmNoZWNrZWQoKSkKICAgICAgICAgIC5zdHJlYW07CgogIC8qKgogICAqIENyZWF0ZXMgYSBzdHJlYW0gd2hpY2ggZW1pdHMgYSBzaW5nbGUgZXJyb3IgZXZlbnQgYmVmb3JlIGNvbXBsZXRpbmcuCiAgICoKICAgKiBUaGlzIHN0cmVhbSBlbWl0cyBhIHNpbmdsZSBlcnJvciBldmVudCBvZiBbZXJyb3JdIGFuZCBbc3RhY2tUcmFjZV0KICAgKiBhbmQgdGhlbiBjb21wbGV0ZXMgd2l0aCBhIGRvbmUgZXZlbnQuCiAgICoKICAgKiBFeGFtcGxlOgogICAqIGBgYGRhcnQKICAgKiBGdXR1cmU8dm9pZD4gdHJ5VGhpbmdzKFN0cmVhbTxpbnQ+IGRhdGEpIGFzeW5jIHsKICAgKiAgIHRyeSB7CiAgICogICAgIGF3YWl0IGZvciAodmFyIHggaW4gZGF0YSkgewogICAqICAgICAgIHByaW50KCJEYXRhOiAkeCIpOwogICAqICAgICB9CiAgICogICB9IGNhdGNoIChlKSB7CiAgICogICAgIHByaW50KGUpOwogICAqICAgfQogICAqIH0KICAgKiB0cnlUaGluZ3MoU3RyZWFtPGludD4uZXJyb3IoIkVycm9yIikpOyAvLyBwcmludHMgIkVycm9yIi4KICAgKiBgYGAKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIGlzIGVmZmVjdGl2ZWx5IGVxdWl2YWxlbnQgdG8gb25lIGNyZWF0ZWQgYnkKICAgKiBgRnV0dXJlPFQ+LmVycm9yKGVycm9yLCBzdGFja1RyYWNlKS5hc1N0cmVhbSgpYCwgYnkgb3IKICAgKiBgKCgpIGFzeW5jKiB7IHRocm93IGVycm9yOyB9ICgpKWAsIGV4Y2VwdCB0aGF0IHlvdSBjYW4gY29udHJvbCB0aGUKICAgKiBzdGFjayB0cmFjZSBhcyB3ZWxsLgogICAqLwogIEBTaW5jZSgiMi41IikKICBmYWN0b3J5IFN0cmVhbS5lcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSA9PgogICAgICAoX0FzeW5jU3RyZWFtQ29udHJvbGxlcjxUPihudWxsLCBudWxsLCBudWxsLCBudWxsKQogICAgICAgICAgICAuLl9hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSkKICAgICAgICAgICAgLi5fY2xvc2VVbmNoZWNrZWQoKSkKICAgICAgICAgIC5zdHJlYW07CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgc2luZ2xlLXN1YnNjcmlwdGlvbiBzdHJlYW0gZnJvbSB0aGUgZnV0dXJlLgogICAqCiAgICogV2hlbiB0aGUgZnV0dXJlIGNvbXBsZXRlcywgdGhlIHN0cmVhbSB3aWxsIGZpcmUgb25lIGV2ZW50LCBlaXRoZXIKICAgKiBkYXRhIG9yIGVycm9yLCBhbmQgdGhlbiBjbG9zZSB3aXRoIGEgZG9uZS1ldmVudC4KICAgKi8KICBmYWN0b3J5IFN0cmVhbS5mcm9tRnV0dXJlKEZ1dHVyZTxUPiBmdXR1cmUpIHsKICAgIC8vIFVzZSB0aGUgY29udHJvbGxlcidzIGJ1ZmZlcmluZyB0byBmaWxsIGluIHRoZSB2YWx1ZSBldmVuIGJlZm9yZQogICAgLy8gdGhlIHN0cmVhbSBoYXMgYSBsaXN0ZW5lci4gRm9yIGEgc2luZ2xlIHZhbHVlLCBpdCdzIG5vdCB3b3J0aCBpdAogICAgLy8gdG8gd2FpdCBmb3IgYSBsaXN0ZW5lciBiZWZvcmUgZG9pbmcgdGhlIGB0aGVuYCBvbiB0aGUgZnV0dXJlLgogICAgX1N0cmVhbUNvbnRyb2xsZXI8VD4gY29udHJvbGxlciA9CiAgICAgICAgbmV3IF9TeW5jU3RyZWFtQ29udHJvbGxlcjxUPihudWxsLCBudWxsLCBudWxsLCBudWxsKTsKICAgIGZ1dHVyZS50aGVuKCh2YWx1ZSkgewogICAgICBjb250cm9sbGVyLl9hZGQodmFsdWUpOwogICAgICBjb250cm9sbGVyLl9jbG9zZVVuY2hlY2tlZCgpOwogICAgfSwgb25FcnJvcjogKGVycm9yLCBzdGFja1RyYWNlKSB7CiAgICAgIGNvbnRyb2xsZXIuX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgY29udHJvbGxlci5fY2xvc2VVbmNoZWNrZWQoKTsKICAgIH0pOwogICAgcmV0dXJuIGNvbnRyb2xsZXIuc3RyZWFtOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIGEgc3RyZWFtIGZyb20gYSBncm91cCBvZiBmdXR1cmVzLgogICAqCiAgICogVGhlIHN0cmVhbSByZXBvcnRzIHRoZSByZXN1bHRzIG9mIHRoZSBmdXR1cmVzIG9uIHRoZSBzdHJlYW0gaW4gdGhlIG9yZGVyCiAgICogaW4gd2hpY2ggdGhlIGZ1dHVyZXMgY29tcGxldGUuCiAgICogRWFjaCBmdXR1cmUgcHJvdmlkZXMgZWl0aGVyIGEgZGF0YSBldmVudCBvciBhbiBlcnJvciBldmVudCwKICAgKiBkZXBlbmRpbmcgb24gaG93IHRoZSBmdXR1cmUgY29tcGxldGVzLgogICAqCiAgICogSWYgc29tZSBmdXR1cmVzIGhhdmUgYWxyZWFkeSBjb21wbGV0ZWQgd2hlbiBgU3RyZWFtLmZyb21GdXR1cmVzYCBpcyBjYWxsZWQsCiAgICogdGhlaXIgcmVzdWx0cyB3aWxsIGJlIGVtaXR0ZWQgaW4gc29tZSB1bnNwZWNpZmllZCBvcmRlci4KICAgKgogICAqIFdoZW4gYWxsIGZ1dHVyZXMgaGF2ZSBjb21wbGV0ZWQsIHRoZSBzdHJlYW0gaXMgY2xvc2VkLgogICAqCiAgICogSWYgW2Z1dHVyZXNdIGlzIGVtcHR5LCB0aGUgc3RyZWFtIGNsb3NlcyBhcyBzb29uIGFzIHBvc3NpYmxlLgogICAqLwogIGZhY3RvcnkgU3RyZWFtLmZyb21GdXR1cmVzKEl0ZXJhYmxlPEZ1dHVyZTxUPj4gZnV0dXJlcykgewogICAgX1N0cmVhbUNvbnRyb2xsZXI8VD4gY29udHJvbGxlciA9CiAgICAgICAgbmV3IF9TeW5jU3RyZWFtQ29udHJvbGxlcjxUPihudWxsLCBudWxsLCBudWxsLCBudWxsKTsKICAgIGludCBjb3VudCA9IDA7CiAgICAvLyBEZWNsYXJlIHRoZXNlIGFzIHZhcmlhYmxlcyBob2xkaW5nIGNsb3N1cmVzIGluc3RlYWQgb2YgYXMKICAgIC8vIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KICAgIC8vIFRoaXMgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IGNsb3N1cmUgZnJvbSB0aGUgZnVuY3Rpb25zIGZvciBlYWNoIGZ1dHVyZS4KICAgIHZhciBvblZhbHVlID0gKFQgdmFsdWUpIHsKICAgICAgaWYgKCFjb250cm9sbGVyLmlzQ2xvc2VkKSB7CiAgICAgICAgY29udHJvbGxlci5fYWRkKHZhbHVlKTsKICAgICAgICBpZiAoLS1jb3VudCA9PSAwKSBjb250cm9sbGVyLl9jbG9zZVVuY2hlY2tlZCgpOwogICAgICB9CiAgICB9OwogICAgdmFyIG9uRXJyb3IgPSAoZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2spIHsKICAgICAgaWYgKCFjb250cm9sbGVyLmlzQ2xvc2VkKSB7CiAgICAgICAgY29udHJvbGxlci5fYWRkRXJyb3IoZXJyb3IsIHN0YWNrKTsKICAgICAgICBpZiAoLS1jb3VudCA9PSAwKSBjb250cm9sbGVyLl9jbG9zZVVuY2hlY2tlZCgpOwogICAgICB9CiAgICB9OwogICAgLy8gVGhlIGZ1dHVyZXMgYXJlIGFscmVhZHkgcnVubmluZywgc28gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZW0gaW1tZWRpYXRlbHkKICAgIC8vIChpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBzdHJlYW0gdG8gYmUgbGlzdGVuZWQgb24pLgogICAgLy8gSWYgd2Ugd2FpdCwgd2UgbWlnaHQgbm90IGNhdGNoIGVycm9ycyBpbiB0aGUgZnV0dXJlcyBpbiB0aW1lLgogICAgZm9yICh2YXIgZnV0dXJlIGluIGZ1dHVyZXMpIHsKICAgICAgY291bnQrKzsKICAgICAgZnV0dXJlLnRoZW4ob25WYWx1ZSwgb25FcnJvcjogb25FcnJvcik7CiAgICB9CiAgICAvLyBVc2Ugc2NoZWR1bGUgbWljcm90YXNrIHNpbmNlIGNvbnRyb2xsZXIgaXMgc3luYy4KICAgIGlmIChjb3VudCA9PSAwKSBzY2hlZHVsZU1pY3JvdGFzayhjb250cm9sbGVyLmNsb3NlKTsKICAgIHJldHVybiBjb250cm9sbGVyLnN0cmVhbTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBzaW5nbGUtc3Vic2NyaXB0aW9uIHN0cmVhbSB0aGF0IGdldHMgaXRzIGRhdGEgZnJvbSBbZWxlbWVudHNdLgogICAqCiAgICogVGhlIGl0ZXJhYmxlIGlzIGl0ZXJhdGVkIHdoZW4gdGhlIHN0cmVhbSByZWNlaXZlcyBhIGxpc3RlbmVyLCBhbmQgc3RvcHMKICAgKiBpdGVyYXRpbmcgaWYgdGhlIGxpc3RlbmVyIGNhbmNlbHMgdGhlIHN1YnNjcmlwdGlvbiwgb3IgaWYgdGhlCiAgICogW0l0ZXJhdG9yLm1vdmVOZXh0XSBtZXRob2QgcmV0dXJucyBgZmFsc2VgIG9yIHRocm93cy4KICAgKiBJdGVyYXRpb24gaXMgc3VzcGVuZGVkIHdoaWxlIHRoZSBzdHJlYW0gc3Vic2NyaXB0aW9uIGlzIHBhdXNlZC4KICAgKgogICAqIElmIGNhbGxpbmcgW0l0ZXJhdG9yLm1vdmVOZXh0XSBvbiBgZWxlbWVudHMuaXRlcmF0b3JgIHRocm93cywKICAgKiB0aGUgc3RyZWFtIGVtaXRzIHRoYXQgZXJyb3IgYW5kIHRoZW4gaXQgY2xvc2VzLgogICAqIElmIHJlYWRpbmcgW0l0ZXJhdG9yLmN1cnJlbnRdIG9uIGBlbGVtZW50cy5pdGVyYXRvcmAgdGhyb3dzLAogICAqIHRoZSBzdHJlYW0gZW1pdHMgdGhhdCBlcnJvciwgYnV0IGtlZXBzIGl0ZXJhdGluZy4KICAgKi8KICBmYWN0b3J5IFN0cmVhbS5mcm9tSXRlcmFibGUoSXRlcmFibGU8VD4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgX0dlbmVyYXRlZFN0cmVhbUltcGw8VD4oCiAgICAgICAgKCkgPT4gbmV3IF9JdGVyYWJsZVBlbmRpbmdFdmVudHM8VD4oZWxlbWVudHMpKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCByZXBlYXRlZGx5IGVtaXRzIGV2ZW50cyBhdCBbcGVyaW9kXSBpbnRlcnZhbHMuCiAgICoKICAgKiBUaGUgZXZlbnQgdmFsdWVzIGFyZSBjb21wdXRlZCBieSBpbnZva2luZyBbY29tcHV0YXRpb25dLiBUaGUgYXJndW1lbnQgdG8KICAgKiB0aGlzIGNhbGxiYWNrIGlzIGFuIGludGVnZXIgdGhhdCBzdGFydHMgd2l0aCAwIGFuZCBpcyBpbmNyZW1lbnRlZCBmb3IKICAgKiBldmVyeSBldmVudC4KICAgKgogICAqIElmIFtjb21wdXRhdGlvbl0gaXMgb21pdHRlZCB0aGUgZXZlbnQgdmFsdWVzIHdpbGwgYWxsIGJlIGBudWxsYC4KICAgKi8KICBmYWN0b3J5IFN0cmVhbS5wZXJpb2RpYyhEdXJhdGlvbiBwZXJpb2QsCiAgICAgIFtUIGNvbXB1dGF0aW9uKGludCBjb21wdXRhdGlvbkNvdW50KV0pIHsKICAgIFRpbWVyIHRpbWVyOwogICAgaW50IGNvbXB1dGF0aW9uQ291bnQgPSAwOwogICAgU3RyZWFtQ29udHJvbGxlcjxUPiBjb250cm9sbGVyOwogICAgLy8gQ291bnRzIHRoZSB0aW1lIHRoYXQgdGhlIFN0cmVhbSB3YXMgcnVubmluZyAoYW5kIG5vdCBwYXVzZWQpLgogICAgU3RvcHdhdGNoIHdhdGNoID0gbmV3IFN0b3B3YXRjaCgpOwoKICAgIHZvaWQgc2VuZEV2ZW50KCkgewogICAgICB3YXRjaC5yZXNldCgpOwogICAgICBUIGRhdGE7CiAgICAgIGlmIChjb21wdXRhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGRhdGEgPSBjb21wdXRhdGlvbihjb21wdXRhdGlvbkNvdW50KyspOwogICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoZSwgcyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnRyb2xsZXIuYWRkKGRhdGEpOwogICAgfQoKICAgIHZvaWQgc3RhcnRQZXJpb2RpY1RpbWVyKCkgewogICAgICBhc3NlcnQodGltZXIgPT0gbnVsbCk7CiAgICAgIHRpbWVyID0gbmV3IFRpbWVyLnBlcmlvZGljKHBlcmlvZCwgKFRpbWVyIHRpbWVyKSB7CiAgICAgICAgc2VuZEV2ZW50KCk7CiAgICAgIH0pOwogICAgfQoKICAgIGNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxUPigKICAgICAgICBzeW5jOiB0cnVlLAogICAgICAgIG9uTGlzdGVuOiAoKSB7CiAgICAgICAgICB3YXRjaC5zdGFydCgpOwogICAgICAgICAgc3RhcnRQZXJpb2RpY1RpbWVyKCk7CiAgICAgICAgfSwKICAgICAgICBvblBhdXNlOiAoKSB7CiAgICAgICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgICAgIHRpbWVyID0gbnVsbDsKICAgICAgICAgIHdhdGNoLnN0b3AoKTsKICAgICAgICB9LAogICAgICAgIG9uUmVzdW1lOiAoKSB7CiAgICAgICAgICBhc3NlcnQodGltZXIgPT0gbnVsbCk7CiAgICAgICAgICBEdXJhdGlvbiBlbGFwc2VkID0gd2F0Y2guZWxhcHNlZDsKICAgICAgICAgIHdhdGNoLnN0YXJ0KCk7CiAgICAgICAgICB0aW1lciA9IG5ldyBUaW1lcihwZXJpb2QgLSBlbGFwc2VkLCAoKSB7CiAgICAgICAgICAgIHRpbWVyID0gbnVsbDsKICAgICAgICAgICAgc3RhcnRQZXJpb2RpY1RpbWVyKCk7CiAgICAgICAgICAgIHNlbmRFdmVudCgpOwogICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICBvbkNhbmNlbDogKCkgewogICAgICAgICAgaWYgKHRpbWVyICE9IG51bGwpIHRpbWVyLmNhbmNlbCgpOwogICAgICAgICAgdGltZXIgPSBudWxsOwogICAgICAgICAgcmV0dXJuIEZ1dHVyZS5fbnVsbEZ1dHVyZTsKICAgICAgICB9KTsKICAgIHJldHVybiBjb250cm9sbGVyLnN0cmVhbTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBzdHJlYW0gd2hlcmUgYWxsIGV2ZW50cyBvZiBhbiBleGlzdGluZyBzdHJlYW0gYXJlIHBpcGVkIHRocm91Z2gKICAgKiBhIHNpbmstdHJhbnNmb3JtYXRpb24uCiAgICoKICAgKiBUaGUgZ2l2ZW4gW21hcFNpbmtdIGNsb3N1cmUgaXMgaW52b2tlZCB3aGVuIHRoZSByZXR1cm5lZCBzdHJlYW0gaXMKICAgKiBsaXN0ZW5lZCB0by4gQWxsIGV2ZW50cyBmcm9tIHRoZSBbc291cmNlXSBhcmUgYWRkZWQgaW50byB0aGUgZXZlbnQgc2luawogICAqIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSB0aGUgaW52b2NhdGlvbi4gVGhlIHRyYW5zZm9ybWF0aW9uIHB1dHMgYWxsCiAgICogdHJhbnNmb3JtZWQgZXZlbnRzIGludG8gdGhlIHNpbmsgdGhlIFttYXBTaW5rXSBjbG9zdXJlIHJlY2VpdmVkIGR1cmluZwogICAqIGl0cyBpbnZvY2F0aW9uLiBDb25jZXB0dWFsbHkgdGhlIFttYXBTaW5rXSBjcmVhdGVzIGEgdHJhbnNmb3JtYXRpb24gcGlwZQogICAqIHdpdGggdGhlIGlucHV0IHNpbmsgYmVpbmcgdGhlIHJldHVybmVkIFtFdmVudFNpbmtdIGFuZCB0aGUgb3V0cHV0IHNpbmsKICAgKiBiZWluZyB0aGUgc2luayBpdCByZWNlaXZlZC4KICAgKgogICAqIFRoaXMgY29uc3RydWN0b3IgaXMgZnJlcXVlbnRseSB1c2VkIHRvIGJ1aWxkIHRyYW5zZm9ybWVycy4KICAgKgogICAqIEV4YW1wbGUgdXNlIGZvciBhIGR1cGxpY2F0aW5nIHRyYW5zZm9ybWVyOgogICAqCiAgICogICAgIGNsYXNzIER1cGxpY2F0aW9uU2luayBpbXBsZW1lbnRzIEV2ZW50U2luazxTdHJpbmc+IHsKICAgKiAgICAgICBmaW5hbCBFdmVudFNpbms8U3RyaW5nPiBfb3V0cHV0U2luazsKICAgKiAgICAgICBEdXBsaWNhdGlvblNpbmsodGhpcy5fb3V0cHV0U2luayk7CiAgICoKICAgKiAgICAgICB2b2lkIGFkZChTdHJpbmcgZGF0YSkgewogICAqICAgICAgICAgX291dHB1dFNpbmsuYWRkKGRhdGEpOwogICAqICAgICAgICAgX291dHB1dFNpbmsuYWRkKGRhdGEpOwogICAqICAgICAgIH0KICAgKgogICAqICAgICAgIHZvaWQgYWRkRXJyb3IoZSwgW3N0XSkgeyBfb3V0cHV0U2luay5hZGRFcnJvcihlLCBzdCk7IH0KICAgKiAgICAgICB2b2lkIGNsb3NlKCkgeyBfb3V0cHV0U2luay5jbG9zZSgpOyB9CiAgICogICAgIH0KICAgKgogICAqICAgICBjbGFzcyBEdXBsaWNhdGlvblRyYW5zZm9ybWVyIGV4dGVuZHMgU3RyZWFtVHJhbnNmb3JtZXJCYXNlPFN0cmluZywgU3RyaW5nPiB7CiAgICogICAgICAgLy8gU29tZSBnZW5lcmljIHR5cGVzIG9taXR0ZWQgZm9yIGJyZXZpdHkuCiAgICogICAgICAgU3RyZWFtIGJpbmQoU3RyZWFtIHN0cmVhbSkgPT4gbmV3IFN0cmVhbTxTdHJpbmc+LmV2ZW50VHJhbnNmb3JtZWQoCiAgICogICAgICAgICAgIHN0cmVhbSwKICAgKiAgICAgICAgICAgKEV2ZW50U2luayBzaW5rKSA9PiBuZXcgRHVwbGljYXRpb25TaW5rKHNpbmspKTsKICAgKiAgICAgfQogICAqCiAgICogICAgIHN0cmluZ1N0cmVhbS50cmFuc2Zvcm0obmV3IER1cGxpY2F0aW9uVHJhbnNmb3JtZXIoKSk7CiAgICoKICAgKiBUaGUgcmVzdWx0aW5nIHN0cmVhbSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0gaWYgW3NvdXJjZV0gaXMuCiAgICovCiAgZmFjdG9yeSBTdHJlYW0uZXZlbnRUcmFuc2Zvcm1lZCgKICAgICAgU3RyZWFtIHNvdXJjZSwgRXZlbnRTaW5rIG1hcFNpbmsoRXZlbnRTaW5rPFQ+IHNpbmspKSB7CiAgICByZXR1cm4gbmV3IF9Cb3VuZFNpbmtTdHJlYW0oc291cmNlLCBtYXBTaW5rKTsKICB9CgogIC8qKgogICAqIEFkYXB0cyBbc291cmNlXSB0byBiZSBhIGBTdHJlYW08VD5gLgogICAqCiAgICogVGhpcyBhbGxvd3MgW3NvdXJjZV0gdG8gYmUgdXNlZCBhdCB0aGUgbmV3IHR5cGUsIGJ1dCBhdCBydW4tdGltZSBpdAogICAqIG11c3Qgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9mIGJvdGggdGhlIG5ldyB0eXBlIGFuZCBpdHMgb3JpZ2luYWwgdHlwZS4KICAgKgogICAqIERhdGEgZXZlbnRzIGNyZWF0ZWQgYnkgdGhlIHNvdXJjZSBzdHJlYW0gbXVzdCBhbHNvIGJlIGluc3RhbmNlcyBvZiBbVF0uCiAgICovCiAgc3RhdGljIFN0cmVhbTxUPiBjYXN0RnJvbTxTLCBUPihTdHJlYW08Uz4gc291cmNlKSA9PgogICAgICBuZXcgQ2FzdFN0cmVhbTxTLCBUPihzb3VyY2UpOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbS4KICAgKi8KICBib29sIGdldCBpc0Jyb2FkY2FzdCA9PiBmYWxzZTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG11bHRpLXN1YnNjcmlwdGlvbiBzdHJlYW0gdGhhdCBwcm9kdWNlcyB0aGUgc2FtZSBldmVudHMgYXMgdGhpcy4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gd2lsbCBzdWJzY3JpYmUgdG8gdGhpcyBzdHJlYW0gd2hlbiBpdHMgZmlyc3QKICAgKiBzdWJzY3JpYmVyIGlzIGFkZGVkLCBhbmQgd2lsbCBzdGF5IHN1YnNjcmliZWQgdW50aWwgdGhpcyBzdHJlYW0gZW5kcywKICAgKiBvciBhIGNhbGxiYWNrIGNhbmNlbHMgdGhlIHN1YnNjcmlwdGlvbi4KICAgKgogICAqIElmIFtvbkxpc3Rlbl0gaXMgcHJvdmlkZWQsIGl0IGlzIGNhbGxlZCB3aXRoIGEgc3Vic2NyaXB0aW9uLWxpa2Ugb2JqZWN0CiAgICogdGhhdCByZXByZXNlbnRzIHRoZSB1bmRlcmx5aW5nIHN1YnNjcmlwdGlvbiB0byB0aGlzIHN0cmVhbS4gSXQgaXMKICAgKiBwb3NzaWJsZSB0byBwYXVzZSwgcmVzdW1lIG9yIGNhbmNlbCB0aGUgc3Vic2NyaXB0aW9uIGR1cmluZyB0aGUgY2FsbAogICAqIHRvIFtvbkxpc3Rlbl0uIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIGV2ZW50IGhhbmRsZXJzLCBpbmNsdWRpbmcKICAgKiB1c2luZyBbU3RyZWFtU3Vic2NyaXB0aW9uLmFzRnV0dXJlXS4KICAgKgogICAqIElmIFtvbkNhbmNlbF0gaXMgcHJvdmlkZWQsIGl0IGlzIGNhbGxlZCBpbiBhIHNpbWlsYXIgd2F5IHRvIFtvbkxpc3Rlbl0KICAgKiB3aGVuIHRoZSByZXR1cm5lZCBzdHJlYW0gc3RvcHMgaGF2aW5nIGxpc3RlbmVyLiBJZiBpdCBsYXRlciBnZXRzCiAgICogYSBuZXcgbGlzdGVuZXIsIHRoZSBbb25MaXN0ZW5dIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZ2Fpbi4KICAgKgogICAqIFVzZSB0aGUgY2FsbGJhY2tzLCBmb3IgZXhhbXBsZSwgZm9yIHBhdXNpbmcgdGhlIHVuZGVybHlpbmcgc3Vic2NyaXB0aW9uCiAgICogd2hpbGUgaGF2aW5nIG5vIHN1YnNjcmliZXJzIHRvIHByZXZlbnQgbG9zaW5nIGV2ZW50cywgb3IgY2FuY2VsaW5nIHRoZQogICAqIHN1YnNjcmlwdGlvbiB3aGVuIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMuCiAgICovCiAgU3RyZWFtPFQ+IGFzQnJvYWRjYXN0U3RyZWFtKAogICAgICB7dm9pZCBvbkxpc3RlbihTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSwKICAgICAgdm9pZCBvbkNhbmNlbChTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKX0pIHsKICAgIHJldHVybiBuZXcgX0FzQnJvYWRjYXN0U3RyZWFtPFQ+KHRoaXMsIG9uTGlzdGVuLCBvbkNhbmNlbCk7CiAgfQoKICAvKioKICAgKiBBZGRzIGEgc3Vic2NyaXB0aW9uIHRvIHRoaXMgc3RyZWFtLgogICAqCiAgICogUmV0dXJucyBhIFtTdHJlYW1TdWJzY3JpcHRpb25dIHdoaWNoIGhhbmRsZXMgZXZlbnRzIGZyb20gdGhpcyBzdHJlYW0gdXNpbmcKICAgKiB0aGUgcHJvdmlkZWQgW29uRGF0YV0sIFtvbkVycm9yXSBhbmQgW29uRG9uZV0gaGFuZGxlcnMuCiAgICogVGhlIGhhbmRsZXJzIGNhbiBiZSBjaGFuZ2VkIG9uIHRoZSBzdWJzY3JpcHRpb24sIGJ1dCB0aGV5IHN0YXJ0IG91dAogICAqIGFzIHRoZSBwcm92aWRlZCBmdW5jdGlvbnMuCiAgICoKICAgKiBPbiBlYWNoIGRhdGEgZXZlbnQgZnJvbSB0aGlzIHN0cmVhbSwgdGhlIHN1YnNjcmliZXIncyBbb25EYXRhXSBoYW5kbGVyCiAgICogaXMgY2FsbGVkLiBJZiBbb25EYXRhXSBpcyBgbnVsbGAsIG5vdGhpbmcgaGFwcGVucy4KICAgKgogICAqIE9uIGVycm9ycyBmcm9tIHRoaXMgc3RyZWFtLCB0aGUgW29uRXJyb3JdIGhhbmRsZXIgaXMgY2FsbGVkIHdpdGggdGhlCiAgICogZXJyb3Igb2JqZWN0IGFuZCBwb3NzaWJseSBhIHN0YWNrIHRyYWNlLgogICAqCiAgICogVGhlIFtvbkVycm9yXSBjYWxsYmFjayBtdXN0IGJlIG9mIHR5cGUgYHZvaWQgb25FcnJvcihlcnJvcilgIG9yCiAgICogYHZvaWQgb25FcnJvcihlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKWAuIElmIFtvbkVycm9yXSBhY2NlcHRzCiAgICogdHdvIGFyZ3VtZW50cyBpdCBpcyBjYWxsZWQgd2l0aCB0aGUgZXJyb3Igb2JqZWN0IGFuZCB0aGUgc3RhY2sgdHJhY2UKICAgKiAod2hpY2ggY291bGQgYmUgYG51bGxgIGlmIHRoaXMgc3RyZWFtIGl0c2VsZiByZWNlaXZlZCBhbiBlcnJvciB3aXRob3V0CiAgICogc3RhY2sgdHJhY2UpLgogICAqIE90aGVyd2lzZSBpdCBpcyBjYWxsZWQgd2l0aCBqdXN0IHRoZSBlcnJvciBvYmplY3QuCiAgICogSWYgW29uRXJyb3JdIGlzIG9taXR0ZWQsIGFueSBlcnJvcnMgb24gdGhpcyBzdHJlYW0gYXJlIGNvbnNpZGVyZWQgdW5oYW5kbGVkLAogICAqIGFuZCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY3VycmVudCBbWm9uZV0ncyBlcnJvciBoYW5kbGVyLgogICAqIEJ5IGRlZmF1bHQgdW5oYW5kbGVkIGFzeW5jIGVycm9ycyBhcmUgdHJlYXRlZAogICAqIGFzIGlmIHRoZXkgd2VyZSB1bmNhdWdodCB0b3AtbGV2ZWwgZXJyb3JzLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gY2xvc2VzIGFuZCBzZW5kcyBhIGRvbmUgZXZlbnQsIHRoZSBbb25Eb25lXSBoYW5kbGVyIGlzCiAgICogY2FsbGVkLiBJZiBbb25Eb25lXSBpcyBgbnVsbGAsIG5vdGhpbmcgaGFwcGVucy4KICAgKgogICAqIElmIFtjYW5jZWxPbkVycm9yXSBpcyB0cnVlLCB0aGUgc3Vic2NyaXB0aW9uIGlzIGF1dG9tYXRpY2FsbHkgY2FuY2VsZWQKICAgKiB3aGVuIHRoZSBmaXJzdCBlcnJvciBldmVudCBpcyBkZWxpdmVyZWQuIFRoZSBkZWZhdWx0IGlzIGBmYWxzZWAuCiAgICoKICAgKiBXaGlsZSBhIHN1YnNjcmlwdGlvbiBpcyBwYXVzZWQsIG9yIHdoZW4gaXQgaGFzIGJlZW4gY2FuY2VsZWQsCiAgICogdGhlIHN1YnNjcmlwdGlvbiBkb2Vzbid0IHJlY2VpdmUgZXZlbnRzIGFuZCBub25lIG9mIHRoZQogICAqIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGFyZSBjYWxsZWQuCiAgICovCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IGxpc3Rlbih2b2lkIG9uRGF0YShUIGV2ZW50KSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHN0cmVhbSBmcm9tIHRoaXMgc3RyZWFtIHRoYXQgZGlzY2FyZHMgc29tZSBlbGVtZW50cy4KICAgKgogICAqIFRoZSBuZXcgc3RyZWFtIHNlbmRzIHRoZSBzYW1lIGVycm9yIGFuZCBkb25lIGV2ZW50cyBhcyB0aGlzIHN0cmVhbSwKICAgKiBidXQgaXQgb25seSBzZW5kcyB0aGUgZGF0YSBldmVudHMgdGhhdCBzYXRpc2Z5IHRoZSBbdGVzdF0uCiAgICoKICAgKiBJZiB0aGUgW3Rlc3RdIGZ1bmN0aW9uIHRocm93cywgdGhlIGRhdGEgZXZlbnQgaXMgZHJvcHBlZCBhbmQgdGhlCiAgICogZXJyb3IgaXMgZW1pdHRlZCBvbiB0aGUgcmV0dXJuZWQgc3RyZWFtIGluc3RlYWQuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSBpZiB0aGlzIHN0cmVhbSBpcy4KICAgKiBJZiBhIGJyb2FkY2FzdCBzdHJlYW0gaXMgbGlzdGVuZWQgdG8gbW9yZSB0aGFuIG9uY2UsIGVhY2ggc3Vic2NyaXB0aW9uCiAgICogd2lsbCBpbmRpdmlkdWFsbHkgcGVyZm9ybSB0aGUgYHRlc3RgLgogICAqLwogIFN0cmVhbTxUPiB3aGVyZShib29sIHRlc3QoVCBldmVudCkpIHsKICAgIHJldHVybiBuZXcgX1doZXJlU3RyZWFtPFQ+KHRoaXMsIHRlc3QpOwogIH0KCiAgLyoqCiAgICogVHJhbnNmb3JtcyBlYWNoIGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0gaW50byBhIG5ldyBzdHJlYW0gZXZlbnQuCiAgICoKICAgKiBDcmVhdGVzIGEgbmV3IHN0cmVhbSB0aGF0IGNvbnZlcnRzIGVhY2ggZWxlbWVudCBvZiB0aGlzIHN0cmVhbQogICAqIHRvIGEgbmV3IHZhbHVlIHVzaW5nIHRoZSBbY29udmVydF0gZnVuY3Rpb24sIGFuZCBlbWl0cyB0aGUgcmVzdWx0LgogICAqCiAgICogRm9yIGVhY2ggZGF0YSBldmVudCwgYG9gLCBpbiB0aGlzIHN0cmVhbSwgdGhlIHJldHVybmVkIHN0cmVhbQogICAqIHByb3ZpZGVzIGEgZGF0YSBldmVudCB3aXRoIHRoZSB2YWx1ZSBgY29udmVydChvKWAuCiAgICogSWYgW2NvbnZlcnRdIHRocm93cywgdGhlIHJldHVybmVkIHN0cmVhbSByZXBvcnRzIGl0IGFzIGFuIGVycm9yCiAgICogZXZlbnQgaW5zdGVhZC4KICAgKgogICAqIEVycm9yIGFuZCBkb25lIGV2ZW50cyBhcmUgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkIHRvIHRoZSByZXR1cm5lZCBzdHJlYW0uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSBpZiB0aGlzIHN0cmVhbSBpcy4KICAgKiBUaGUgW2NvbnZlcnRdIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIHBlciBkYXRhIGV2ZW50IHBlciBsaXN0ZW5lci4KICAgKiBJZiBhIGJyb2FkY2FzdCBzdHJlYW0gaXMgbGlzdGVuZWQgdG8gbW9yZSB0aGFuIG9uY2UsIGVhY2ggc3Vic2NyaXB0aW9uCiAgICogd2lsbCBpbmRpdmlkdWFsbHkgY2FsbCBbY29udmVydF0gb24gZWFjaCBkYXRhIGV2ZW50LgogICAqCiAgICogVW5saWtlIFt0cmFuc2Zvcm1dLCB0aGlzIG1ldGhvZCBkb2VzIG5vdCB0cmVhdCB0aGUgc3RyZWFtIGFzCiAgICogY2h1bmtzIG9mIGEgc2luZ2xlIHZhbHVlLiBJbnN0ZWFkIGVhY2ggZXZlbnQgaXMgY29udmVydGVkIGluZGVwZW5kZW50bHkKICAgKiBvZiB0aGUgcHJldmlvdXMgYW5kIGZvbGxvd2luZyBldmVudHMsIHdoaWNoIG1heSBub3QgYWx3YXlzIGJlIGNvcnJlY3QuCiAgICogRm9yIGV4YW1wbGUsIFVURi04IGVuY29kaW5nLCBvciBkZWNvZGluZywgd2lsbCBnaXZlIHdyb25nIHJlc3VsdHMKICAgKiBpZiBhIHN1cnJvZ2F0ZSBwYWlyLCBvciBhIG11bHRpYnl0ZSBVVEYtOCBlbmNvZGluZywgaXMgc3BsaXQgaW50bwogICAqIHNlcGFyYXRlIGV2ZW50cywgYW5kIHRob3NlIGV2ZW50cyBhcmUgYXR0ZW1wdGVkIGVuY29kZWQgb3IgZGVjb2RlZAogICAqIGluZGVwZW5kZW50bHkuCiAgICovCiAgU3RyZWFtPFM+IG1hcDxTPihTIGNvbnZlcnQoVCBldmVudCkpIHsKICAgIHJldHVybiBuZXcgX01hcFN0cmVhbTxULCBTPih0aGlzLCBjb252ZXJ0KTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgc3RyZWFtIHdpdGggZWFjaCBkYXRhIGV2ZW50IG9mIHRoaXMgc3RyZWFtIGFzeW5jaHJvbm91c2x5CiAgICogbWFwcGVkIHRvIGEgbmV3IGV2ZW50LgogICAqCiAgICogVGhpcyBhY3RzIGxpa2UgW21hcF0sIGV4Y2VwdCB0aGF0IFtjb252ZXJ0XSBtYXkgcmV0dXJuIGEgW0Z1dHVyZV0sCiAgICogYW5kIGluIHRoYXQgY2FzZSwgdGhpcyBzdHJlYW0gd2FpdHMgZm9yIHRoYXQgZnV0dXJlIHRvIGNvbXBsZXRlIGJlZm9yZQogICAqIGNvbnRpbnVpbmcgd2l0aCBpdHMgcmVzdWx0LgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0gaWYgdGhpcyBzdHJlYW0gaXMuCiAgICovCiAgU3RyZWFtPEU+IGFzeW5jTWFwPEU+KEZ1dHVyZU9yPEU+IGNvbnZlcnQoVCBldmVudCkpIHsKICAgIF9TdHJlYW1Db250cm9sbGVyQmFzZTxFPiBjb250cm9sbGVyOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbjsKCiAgICB2b2lkIG9uTGlzdGVuKCkgewogICAgICBmaW5hbCBhZGQgPSBjb250cm9sbGVyLmFkZDsKICAgICAgYXNzZXJ0KGNvbnRyb2xsZXIgaXMgX1N0cmVhbUNvbnRyb2xsZXI8RT4gfHwKICAgICAgICAgIGNvbnRyb2xsZXIgaXMgX0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXIpOwogICAgICBmaW5hbCBhZGRFcnJvciA9IGNvbnRyb2xsZXIuX2FkZEVycm9yOwogICAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbigoVCBldmVudCkgewogICAgICAgIEZ1dHVyZU9yPEU+IG5ld1ZhbHVlOwogICAgICAgIHRyeSB7CiAgICAgICAgICBuZXdWYWx1ZSA9IGNvbnZlcnQoZXZlbnQpOwogICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoZSwgcyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChuZXdWYWx1ZSBpcyBGdXR1cmU8RT4pIHsKICAgICAgICAgIHN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgICAgICAgbmV3VmFsdWUKICAgICAgICAgICAgICAudGhlbihhZGQsIG9uRXJyb3I6IGFkZEVycm9yKQogICAgICAgICAgICAgIC53aGVuQ29tcGxldGUoc3Vic2NyaXB0aW9uLnJlc3VtZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnRyb2xsZXIuYWRkKG5ld1ZhbHVlKTsKICAgICAgICB9CiAgICAgIH0sIG9uRXJyb3I6IGFkZEVycm9yLCBvbkRvbmU6IGNvbnRyb2xsZXIuY2xvc2UpOwogICAgfQoKICAgIGlmICh0aGlzLmlzQnJvYWRjYXN0KSB7CiAgICAgIGNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxFPi5icm9hZGNhc3QoCiAgICAgICAgICBvbkxpc3Rlbjogb25MaXN0ZW4sCiAgICAgICAgICBvbkNhbmNlbDogKCkgewogICAgICAgICAgICBzdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICAgICAgICB9LAogICAgICAgICAgc3luYzogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8RT4oCiAgICAgICAgICBvbkxpc3Rlbjogb25MaXN0ZW4sCiAgICAgICAgICBvblBhdXNlOiAoKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgICAgICAgfSwKICAgICAgICAgIG9uUmVzdW1lOiAoKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5yZXN1bWUoKTsKICAgICAgICAgIH0sCiAgICAgICAgICBvbkNhbmNlbDogKCkgPT4gc3Vic2NyaXB0aW9uLmNhbmNlbCgpLAogICAgICAgICAgc3luYzogdHJ1ZSk7CiAgICB9CiAgICByZXR1cm4gY29udHJvbGxlci5zdHJlYW07CiAgfQoKICAvKioKICAgKiBUcmFuc2Zvcm1zIGVhY2ggZWxlbWVudCBpbnRvIGEgc2VxdWVuY2Ugb2YgYXN5bmNocm9ub3VzIGV2ZW50cy4KICAgKgogICAqIFJldHVybnMgYSBuZXcgc3RyZWFtIGFuZCBmb3IgZWFjaCBldmVudCBvZiB0aGlzIHN0cmVhbSwgZG8gdGhlIGZvbGxvd2luZzoKICAgKgogICAqICogSWYgdGhlIGV2ZW50IGlzIGFuIGVycm9yIGV2ZW50IG9yIGEgZG9uZSBldmVudCwgaXQgaXMgZW1pdHRlZCBkaXJlY3RseQogICAqIGJ5IHRoZSByZXR1cm5lZCBzdHJlYW0uCiAgICogKiBPdGhlcndpc2UgaXQgaXMgYW4gZWxlbWVudC4gVGhlbiB0aGUgW2NvbnZlcnRdIGZ1bmN0aW9uIGlzIGNhbGxlZAogICAqIHdpdGggdGhlIGVsZW1lbnQgYXMgYXJndW1lbnQgdG8gcHJvZHVjZSBhIGNvbnZlcnQtc3RyZWFtIGZvciB0aGUgZWxlbWVudC4KICAgKiAqIElmIHRoYXQgY2FsbCB0aHJvd3MsIHRoZSBlcnJvciBpcyBlbWl0dGVkIG9uIHRoZSByZXR1cm5lZCBzdHJlYW0uCiAgICogKiBJZiB0aGUgY2FsbCByZXR1cm5zIGBudWxsYCwgbm8gZnVydGhlciBhY3Rpb24gaXMgdGFrZW4gZm9yIHRoZSBlbGVtZW50cy4KICAgKiAqIE90aGVyd2lzZSwgdGhpcyBzdHJlYW0gaXMgcGF1c2VkIGFuZCBjb252ZXJ0LXN0cmVhbSBpcyBsaXN0ZW5lZCB0by4KICAgKiBFdmVyeSBkYXRhIGFuZCBlcnJvciBldmVudCBvZiB0aGUgY29udmVydC1zdHJlYW0gaXMgZW1pdHRlZCBvbiB0aGUgcmV0dXJuZWQKICAgKiBzdHJlYW0gaW4gdGhlIG9yZGVyIGl0IGlzIHByb2R1Y2VkLgogICAqIFdoZW4gdGhlIGNvbnZlcnQtc3RyZWFtIGVuZHMsIHRoaXMgc3RyZWFtIGlzIHJlc3VtZWQuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSBpZiB0aGlzIHN0cmVhbSBpcy4KICAgKi8KICBTdHJlYW08RT4gYXN5bmNFeHBhbmQ8RT4oU3RyZWFtPEU+IGNvbnZlcnQoVCBldmVudCkpIHsKICAgIF9TdHJlYW1Db250cm9sbGVyQmFzZTxFPiBjb250cm9sbGVyOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbjsKICAgIHZvaWQgb25MaXN0ZW4oKSB7CiAgICAgIGFzc2VydChjb250cm9sbGVyIGlzIF9TdHJlYW1Db250cm9sbGVyIHx8CiAgICAgICAgICBjb250cm9sbGVyIGlzIF9Ccm9hZGNhc3RTdHJlYW1Db250cm9sbGVyKTsKICAgICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oKFQgZXZlbnQpIHsKICAgICAgICBTdHJlYW08RT4gbmV3U3RyZWFtOwogICAgICAgIHRyeSB7CiAgICAgICAgICBuZXdTdHJlYW0gPSBjb252ZXJ0KGV2ZW50KTsKICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKGUsIHMpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAobmV3U3RyZWFtICE9IG51bGwpIHsKICAgICAgICAgIHN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgICAgICAgY29udHJvbGxlci5hZGRTdHJlYW0obmV3U3RyZWFtKS53aGVuQ29tcGxldGUoc3Vic2NyaXB0aW9uLnJlc3VtZSk7CiAgICAgICAgfQogICAgICB9LAogICAgICAgICAgb25FcnJvcjogY29udHJvbGxlci5fYWRkRXJyb3IsIC8vIEF2b2lkIFpvbmUgZXJyb3IgcmVwbGFjZW1lbnQuCiAgICAgICAgICBvbkRvbmU6IGNvbnRyb2xsZXIuY2xvc2UpOwogICAgfQoKICAgIGlmICh0aGlzLmlzQnJvYWRjYXN0KSB7CiAgICAgIGNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxFPi5icm9hZGNhc3QoCiAgICAgICAgICBvbkxpc3Rlbjogb25MaXN0ZW4sCiAgICAgICAgICBvbkNhbmNlbDogKCkgewogICAgICAgICAgICBzdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICAgICAgICB9LAogICAgICAgICAgc3luYzogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8RT4oCiAgICAgICAgICBvbkxpc3Rlbjogb25MaXN0ZW4sCiAgICAgICAgICBvblBhdXNlOiAoKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgICAgICAgfSwKICAgICAgICAgIG9uUmVzdW1lOiAoKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5yZXN1bWUoKTsKICAgICAgICAgIH0sCiAgICAgICAgICBvbkNhbmNlbDogKCkgPT4gc3Vic2NyaXB0aW9uLmNhbmNlbCgpLAogICAgICAgICAgc3luYzogdHJ1ZSk7CiAgICB9CiAgICByZXR1cm4gY29udHJvbGxlci5zdHJlYW07CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgd3JhcHBlciBTdHJlYW0gdGhhdCBpbnRlcmNlcHRzIHNvbWUgZXJyb3JzIGZyb20gdGhpcyBzdHJlYW0uCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBzZW5kcyBhbiBlcnJvciB0aGF0IG1hdGNoZXMgW3Rlc3RdLCB0aGVuIGl0IGlzIGludGVyY2VwdGVkCiAgICogYnkgdGhlIFtvbkVycm9yXSBmdW5jdGlvbi4KICAgKgogICAqIFRoZSBbb25FcnJvcl0gY2FsbGJhY2sgbXVzdCBiZSBvZiB0eXBlIGB2b2lkIG9uRXJyb3IoZXJyb3IpYCBvcgogICAqIGB2b2lkIG9uRXJyb3IoZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSlgLgogICAqIFRoZSBmdW5jdGlvbiB0eXBlIGRldGVybWluZXMgd2hldGhlciBbb25FcnJvcl0gaXMgaW52b2tlZCB3aXRoIGEgc3RhY2sKICAgKiB0cmFjZSBhcmd1bWVudC4KICAgKiBUaGUgc3RhY2sgdHJhY2UgYXJndW1lbnQgbWF5IGJlIGBudWxsYCBpZiB0aGlzIHN0cmVhbSByZWNlaXZlZCBhbiBlcnJvcgogICAqIHdpdGhvdXQgYSBzdGFjayB0cmFjZS4KICAgKgogICAqIEFuIGFzeW5jaHJvbm91cyBlcnJvciBgZXJyb3JgIGlzIG1hdGNoZWQgYnkgYSB0ZXN0IGZ1bmN0aW9uIGlmCiAgICpgdGVzdChlcnJvcilgIHJldHVybnMgdHJ1ZS4gSWYgW3Rlc3RdIGlzIG9taXR0ZWQsIGV2ZXJ5IGVycm9yIGlzIGNvbnNpZGVyZWQKICAgKiBtYXRjaGluZy4KICAgKgogICAqIElmIHRoZSBlcnJvciBpcyBpbnRlcmNlcHRlZCwgdGhlIFtvbkVycm9yXSBmdW5jdGlvbiBjYW4gZGVjaWRlIHdoYXQgdG8gZG8KICAgKiB3aXRoIGl0LiBJdCBjYW4gdGhyb3cgaWYgaXQgd2FudHMgdG8gcmFpc2UgYSBuZXcgKG9yIHRoZSBzYW1lKSBlcnJvciwKICAgKiBvciBzaW1wbHkgcmV0dXJuIHRvIG1ha2UgdGhpcyBzdHJlYW0gZm9yZ2V0IHRoZSBlcnJvci4KICAgKiBJZiB0aGUgcmVjZWl2ZWQgYGVycm9yYCB2YWx1ZSBpcyB0aHJvd24gYWdhaW4gYnkgdGhlIFtvbkVycm9yXSBmdW5jdGlvbiwKICAgKiBpdCBhY3RzIGxpa2UgYSBgcmV0aHJvd2AgYW5kIGl0IGlzIGVtaXR0ZWQgYWxvbmcgd2l0aCBpdHMgb3JpZ2luYWwKICAgKiBzdGFjayB0cmFjZSwgbm90IHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgYHRocm93YCBpbnNpZGUgW29uRXJyb3JdLgogICAqCiAgICogSWYgeW91IG5lZWQgdG8gdHJhbnNmb3JtIGFuIGVycm9yIGludG8gYSBkYXRhIGV2ZW50LCB1c2UgdGhlIG1vcmUgZ2VuZXJpYwogICAqIFtTdHJlYW0udHJhbnNmb3JtXSB0byBoYW5kbGUgdGhlIGV2ZW50IGJ5IHdyaXRpbmcgYSBkYXRhIGV2ZW50IHRvCiAgICogdGhlIG91dHB1dCBzaW5rLgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0gaWYgdGhpcyBzdHJlYW0gaXMuCiAgICogSWYgYSBicm9hZGNhc3Qgc3RyZWFtIGlzIGxpc3RlbmVkIHRvIG1vcmUgdGhhbiBvbmNlLCBlYWNoIHN1YnNjcmlwdGlvbgogICAqIHdpbGwgaW5kaXZpZHVhbGx5IHBlcmZvcm0gdGhlIGB0ZXN0YCBhbmQgaGFuZGxlIHRoZSBlcnJvci4KICAgKi8KICBTdHJlYW08VD4gaGFuZGxlRXJyb3IoRnVuY3Rpb24gb25FcnJvciwge2Jvb2wgdGVzdChlcnJvcil9KSB7CiAgICByZXR1cm4gbmV3IF9IYW5kbGVFcnJvclN0cmVhbTxUPih0aGlzLCBvbkVycm9yLCB0ZXN0KTsKICB9CgogIC8qKgogICAqIFRyYW5zZm9ybXMgZWFjaCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtIGludG8gYSBzZXF1ZW5jZSBvZiBlbGVtZW50cy4KICAgKgogICAqIFJldHVybnMgYSBuZXcgc3RyZWFtIHdoZXJlIGVhY2ggZWxlbWVudCBvZiB0aGlzIHN0cmVhbSBpcyByZXBsYWNlZAogICAqIGJ5IHplcm8gb3IgbW9yZSBkYXRhIGV2ZW50cy4KICAgKiBUaGUgZXZlbnQgdmFsdWVzIGFyZSBwcm92aWRlZCBhcyBhbiBbSXRlcmFibGVdIGJ5IGEgY2FsbCB0byBbY29udmVydF0KICAgKiB3aXRoIHRoZSBlbGVtZW50IGFzIGFyZ3VtZW50LCBhbmQgdGhlIGVsZW1lbnRzIG9mIHRoYXQgaXRlcmFibGUgaXMKICAgKiBlbWl0dGVkIGluIGl0ZXJhdGlvbiBvcmRlci4KICAgKiBJZiBjYWxsaW5nIFtjb252ZXJ0XSB0aHJvd3MsIG9yIGlmIHRoZSBpdGVyYXRpb24gb2YgdGhlIHJldHVybmVkIHZhbHVlcwogICAqIHRocm93cywgdGhlIGVycm9yIGlzIGVtaXR0ZWQgb24gdGhlIHJldHVybmVkIHN0cmVhbSBhbmQgaXRlcmF0aW9uIGVuZHMKICAgKiBmb3IgdGhhdCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtLgogICAqCiAgICogRXJyb3IgZXZlbnRzIGFuZCB0aGUgZG9uZSBldmVudCBvZiB0aGlzIHN0cmVhbSBhcmUgZm9yd2FyZGVkIGRpcmVjdGx5CiAgICogdG8gdGhlIHJldHVybmVkIHN0cmVhbS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIGlmIHRoaXMgc3RyZWFtIGlzLgogICAqIElmIGEgYnJvYWRjYXN0IHN0cmVhbSBpcyBsaXN0ZW5lZCB0byBtb3JlIHRoYW4gb25jZSwgZWFjaCBzdWJzY3JpcHRpb24KICAgKiB3aWxsIGluZGl2aWR1YWxseSBjYWxsIGBjb252ZXJ0YCBhbmQgZXhwYW5kIHRoZSBldmVudHMuCiAgICovCiAgU3RyZWFtPFM+IGV4cGFuZDxTPihJdGVyYWJsZTxTPiBjb252ZXJ0KFQgZWxlbWVudCkpIHsKICAgIHJldHVybiBuZXcgX0V4cGFuZFN0cmVhbTxULCBTPih0aGlzLCBjb252ZXJ0KTsKICB9CgogIC8qKgogICAqIFBpcGVzIHRoZSBldmVudHMgb2YgdGhpcyBzdHJlYW0gaW50byBbc3RyZWFtQ29uc3VtZXJdLgogICAqCiAgICogQWxsIGV2ZW50cyBvZiB0aGlzIHN0cmVhbSBhcmUgYWRkZWQgdG8gYHN0cmVhbUNvbnN1bWVyYCB1c2luZwogICAqIFtTdHJlYW1Db25zdW1lci5hZGRTdHJlYW1dLgogICAqIFRoZSBgc3RyZWFtQ29uc3VtZXJgIGlzIGNsb3NlZCB3aGVuIHRoaXMgc3RyZWFtIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhZGRlZAogICAqIHRvIGl0IC0gd2hlbiB0aGUgZnV0dXJlIHJldHVybmVkIGJ5IGBhZGRTdHJlYW1gIGNvbXBsZXRlcyB3aXRob3V0IGFuIGVycm9yLgogICAqCiAgICogUmV0dXJucyBhIGZ1dHVyZSB3aGljaCBjb21wbGV0ZXMgd2hlbiB0aGlzIHN0cmVhbSBoYXMgYmVlbiBjb25zdW1lZAogICAqIGFuZCB0aGUgY29uc3VtZXIgaGFzIGJlZW4gY2xvc2VkLgogICAqCiAgICogVGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCB0aGUgc2FtZSByZXN1bHQgYXMgdGhlIGZ1dHVyZSByZXR1cm5lZAogICAqIGJ5IFtTdHJlYW1Db25zdW1lci5jbG9zZV0uCiAgICogSWYgdGhlIGNhbGwgdG8gW1N0cmVhbUNvbnN1bWVyLmFkZFN0cmVhbV0gZmFpbHMgaW4gc29tZSB3YXksIHRoaXMKICAgKiBtZXRob2QgZmFpbHMgaW4gdGhlIHNhbWUgd2F5LgogICAqLwogIEZ1dHVyZSBwaXBlKFN0cmVhbUNvbnN1bWVyPFQ+IHN0cmVhbUNvbnN1bWVyKSB7CiAgICByZXR1cm4gc3RyZWFtQ29uc3VtZXIuYWRkU3RyZWFtKHRoaXMpLnRoZW4oKF8pID0+IHN0cmVhbUNvbnN1bWVyLmNsb3NlKCkpOwogIH0KCiAgLyoqCiAgICogQXBwbGllcyAgW3N0cmVhbVRyYW5zZm9ybWVyXSB0byB0aGlzIHN0cmVhbS4KICAgKgogICAqIFJldHVybnMgdGhlIHRyYW5zZm9ybWVkIHN0cmVhbSwKICAgKiB0aGF0IGlzLCB0aGUgcmVzdWx0IG9mIGBzdHJlYW1UcmFuc2Zvcm1lci5iaW5kKHRoaXMpYC4KICAgKiBUaGlzIG1ldGhvZCBzaW1wbHkgYWxsb3dzIHdyaXRpbmcgdGhlIGNhbGwgdG8gYHN0cmVhbVRyYW5zZm9ybWVyLmJpbmRgCiAgICogaW4gYSBjaGFpbmVkIGZhc2hpb24sIGxpa2UKICAgKiBgYGAKICAgKiBzdHJlYW0ubWFwKG1hcHBpbmcpLnRyYW5zZm9ybSh0cmFuc2Zvcm1hdGlvbikudG9MaXN0KCkKICAgKiBgYGAKICAgKiB3aGljaCBjYW4gYmUgbW9yZSBjb252ZW5pZW50IHRoYW4gY2FsbGluZyBgYmluZGAgZGlyZWN0bHkuCiAgICoKICAgKiBUaGUgW3N0cmVhbVRyYW5zZm9ybWVyXSBjYW4gcmV0dXJuIGFueSBzdHJlYW0uCiAgICogV2hldGhlciB0aGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSBvciBub3QsCiAgICogYW5kIHdoaWNoIGVsZW1lbnRzIGl0IHdpbGwgY29udGFpbiwKICAgKiBpcyBlbnRpcmVseSB1cCB0byB0aGUgdHJhbnNmb3JtYXRpb24uCiAgICoKICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIGJlIHVzZWQgZm9yIHRyYW5zZm9ybWF0aW9ucyB3aGljaCB0cmVhdAogICAqIHRoZSBlbnRpcmUgc3RyZWFtIGFzIHJlcHJlc2VudGluZyBhIHNpbmdsZSB2YWx1ZQogICAqIHdoaWNoIGhhcyBwZXJoYXBzIGJlZW4gc3BsaXQgaW50byBzZXZlcmFsIHBhcnRzIGZvciB0cmFuc3BvcnQsCiAgICogbGlrZSBhIGZpbGUgYmVpbmcgcmVhZCBmcm9tIGRpc2sgb3IgYmVpbmcgZmV0Y2hlZCBvdmVyIGEgbmV0d29yay4KICAgKiBUaGUgdHJhbnNmb3JtYXRpb24gd2lsbCB0aGVuIHByb2R1Y2UgYSBuZXcgc3RyZWFtIHdoaWNoCiAgICogdHJhbnNmb3JtcyB0aGUgc3RyZWFtJ3MgdmFsdWUgaW5jcmVtZW50YWxseSAocGVyaGFwcyB1c2luZwogICAqIFtDb252ZXJ0ZXIuc3RhcnRDaHVua2VkQ29udmVyc2lvbl0pLiBUaGUgcmVzdWx0aW5nIHN0cmVhbQogICAqIG1heSBhZ2FpbiBiZSBjaHVua3Mgb2YgdGhlIHJlc3VsdCwgYnV0IGRvZXMgbm90IGhhdmUgdG8KICAgKiBjb3JyZXNwb25kIHRvIHNwZWNpZmljIGV2ZW50cyBmcm9tIHRoZSBzb3VyY2Ugc3RyaW5nLgogICAqLwogIFN0cmVhbTxTPiB0cmFuc2Zvcm08Uz4oU3RyZWFtVHJhbnNmb3JtZXI8VCwgUz4gc3RyZWFtVHJhbnNmb3JtZXIpIHsKICAgIHJldHVybiBzdHJlYW1UcmFuc2Zvcm1lci5iaW5kKHRoaXMpOwogIH0KCiAgLyoqCiAgICogQ29tYmluZXMgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMgYnkgcmVwZWF0ZWRseSBhcHBseWluZyBbY29tYmluZV0uCiAgICoKICAgKiBTaW1pbGFyIHRvIFtJdGVyYWJsZS5yZWR1Y2VdLCB0aGlzIGZ1bmN0aW9uIG1haW50YWlucyBhIHZhbHVlLAogICAqIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0KICAgKiBhbmQgdXBkYXRlZCBmb3IgZWFjaCBmdXJ0aGVyIGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0uCiAgICogRm9yIGVhY2ggZWxlbWVudCBhZnRlciB0aGUgZmlyc3QsCiAgICogdGhlIHZhbHVlIGlzIHVwZGF0ZWQgdG8gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFtjb21iaW5lXQogICAqIHdpdGggdGhlIHByZXZpb3VzIHZhbHVlIGFuZCB0aGUgZWxlbWVudC4KICAgKgogICAqIFdoZW4gdGhpcyBzdHJlYW0gaXMgZG9uZSwgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aAogICAqIHRoZSB2YWx1ZSBhdCB0aGF0IHRpbWUuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBpcyBlbXB0eSwgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aAogICAqIGFuIGVycm9yLgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yLCBvciB0aGUgY2FsbCB0byBbY29tYmluZV0gdGhyb3dzLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvciwKICAgKiBhbmQgcHJvY2Vzc2luZyBpcyBzdG9wcGVkLgogICAqLwogIEZ1dHVyZTxUPiByZWR1Y2UoVCBjb21iaW5lKFQgcHJldmlvdXMsIFQgZWxlbWVudCkpIHsKICAgIF9GdXR1cmU8VD4gcmVzdWx0ID0gbmV3IF9GdXR1cmU8VD4oKTsKICAgIGJvb2wgc2VlbkZpcnN0ID0gZmFsc2U7CiAgICBUIHZhbHVlOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChUIGVsZW1lbnQpIHsKICAgICAgICAgIGlmIChzZWVuRmlyc3QpIHsKICAgICAgICAgICAgX3J1blVzZXJDb2RlKCgpID0+IGNvbWJpbmUodmFsdWUsIGVsZW1lbnQpLCAoVCBuZXdWYWx1ZSkgewogICAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7CiAgICAgICAgICAgIH0sIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCByZXN1bHQpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlID0gZWxlbWVudDsKICAgICAgICAgICAgc2VlbkZpcnN0ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IHJlc3VsdC5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGlmICghc2VlbkZpcnN0KSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgLy8gVGhyb3cgYW5kIHJlY2F0Y2gsIGluc3RlYWQgb2YganVzdCBkb2luZwogICAgICAgICAgICAgIC8vICBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjaywgZSwgdGhlRXJyb3IsIFN0YWNrVHJhY2UuY3VycmVudCksCiAgICAgICAgICAgICAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIHN0YWNrVHJhY2UgaXMgc2V0IG9uIHRoZSBlcnJvci4KICAgICAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICAgIF9jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrKHJlc3VsdCwgZSwgcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdC5fY29tcGxldGUodmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogQ29tYmluZXMgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMgYnkgcmVwZWF0ZWRseSBhcHBseWluZyBbY29tYmluZV0uCiAgICoKICAgKiBTaW1pbGFyIHRvIFtJdGVyYWJsZS5mb2xkXSwgdGhpcyBmdW5jdGlvbiBtYWludGFpbnMgYSB2YWx1ZSwKICAgKiBzdGFydGluZyB3aXRoIFtpbml0aWFsVmFsdWVdIGFuZCB1cGRhdGVkIGZvciBlYWNoIGVsZW1lbnQgb2YKICAgKiB0aGlzIHN0cmVhbS4KICAgKiBGb3IgZWFjaCBlbGVtZW50LCB0aGUgdmFsdWUgaXMgdXBkYXRlZCB0byB0aGUgcmVzdWx0IG9mIGNhbGxpbmcKICAgKiBbY29tYmluZV0gd2l0aCB0aGUgcHJldmlvdXMgdmFsdWUgYW5kIHRoZSBlbGVtZW50LgogICAqCiAgICogV2hlbiB0aGlzIHN0cmVhbSBpcyBkb25lLCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoCiAgICogdGhlIHZhbHVlIGF0IHRoYXQgdGltZS4KICAgKiBGb3IgYW4gZW1wdHkgc3RyZWFtLCB0aGUgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIFtpbml0aWFsVmFsdWVdLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgYW4gZXJyb3IsIG9yIHRoZSBjYWxsIHRvIFtjb21iaW5lXSB0aHJvd3MsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLAogICAqIGFuZCBwcm9jZXNzaW5nIGlzIHN0b3BwZWQuCiAgICovCiAgRnV0dXJlPFM+IGZvbGQ8Uz4oUyBpbml0aWFsVmFsdWUsIFMgY29tYmluZShTIHByZXZpb3VzLCBUIGVsZW1lbnQpKSB7CiAgICBfRnV0dXJlPFM+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPFM+KCk7CiAgICBTIHZhbHVlID0gaW5pdGlhbFZhbHVlOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChUIGVsZW1lbnQpIHsKICAgICAgICAgIF9ydW5Vc2VyQ29kZSgoKSA9PiBjb21iaW5lKHZhbHVlLCBlbGVtZW50KSwgKFMgbmV3VmFsdWUpIHsKICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgICAgIH0sIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCByZXN1bHQpKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IHJlc3VsdC5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIHJlc3VsdC5fY29tcGxldGUodmFsdWUpOwogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogQ29tYmluZXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBlbGVtZW50cyBpbnRvIGEgc2luZ2xlIHN0cmluZy4KICAgKgogICAqIEVhY2ggZWxlbWVudCBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdXNpbmcgaXRzIFtPYmplY3QudG9TdHJpbmddIG1ldGhvZC4KICAgKiBJZiBbc2VwYXJhdG9yXSBpcyBwcm92aWRlZCwgaXQgaXMgaW5zZXJ0ZWQgYmV0d2VlbiBlbGVtZW50IHN0cmluZwogICAqIHJlcHJlc2VudGF0aW9ucy4KICAgKgogICAqIFRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhlIGNvbWJpbmVkIHN0cmluZyB3aGVuIHRoaXMgc3RyZWFtCiAgICogaXMgZG9uZS4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yLCBvciB0aGUgY2FsbCB0byBbT2JqZWN0LnRvU3RyaW5nXSB0aHJvd3MsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLAogICAqIGFuZCBwcm9jZXNzaW5nIHN0b3BzLgogICAqLwogIEZ1dHVyZTxTdHJpbmc+IGpvaW4oW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pIHsKICAgIF9GdXR1cmU8U3RyaW5nPiByZXN1bHQgPSBuZXcgX0Z1dHVyZTxTdHJpbmc+KCk7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgZWxlbWVudCkgewogICAgICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgICAgICBidWZmZXIud3JpdGUoc2VwYXJhdG9yKTsKICAgICAgICAgIH0KICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBidWZmZXIud3JpdGUoZWxlbWVudCk7CiAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgIF9jYW5jZWxBbmRFcnJvcldpdGhSZXBsYWNlbWVudChzdWJzY3JpcHRpb24sIHJlc3VsdCwgZSwgcyk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBvbkVycm9yOiByZXN1bHQuX2NvbXBsZXRlRXJyb3IsCiAgICAgICAgb25Eb25lOiAoKSB7CiAgICAgICAgICByZXN1bHQuX2NvbXBsZXRlKGJ1ZmZlci50b1N0cmluZygpKTsKICAgICAgICB9LAogICAgICAgIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIFJldHVybnMgd2hldGhlciBbbmVlZGxlXSBvY2N1cnMgaW4gdGhlIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IHRoaXMgc3RyZWFtLgogICAqCiAgICogQ29tcGFyZXMgZWFjaCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtIHRvIFtuZWVkbGVdIHVzaW5nIFtPYmplY3QuPT1dLgogICAqIElmIGFuIGVxdWFsIGVsZW1lbnQgaXMgZm91bmQsIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggYHRydWVgLgogICAqIElmIHRoaXMgc3RyZWFtIGVuZHMgd2l0aG91dCBmaW5kaW5nIGEgbWF0Y2gsIHRoZSBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGgKICAgKiBgZmFsc2VgLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgYW4gZXJyb3IsIG9yIHRoZSBjYWxsIHRvIFtPYmplY3QuPT1dIHRocm93cywKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgZXJyb3IsCiAgICogYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICovCiAgRnV0dXJlPGJvb2w+IGNvbnRhaW5zKE9iamVjdCBuZWVkbGUpIHsKICAgIF9GdXR1cmU8Ym9vbD4gZnV0dXJlID0gbmV3IF9GdXR1cmU8Ym9vbD4oKTsKICAgIFN0cmVhbVN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb247CiAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbigKICAgICAgICAoVCBlbGVtZW50KSB7CiAgICAgICAgICBfcnVuVXNlckNvZGUoKCkgPT4gKGVsZW1lbnQgPT0gbmVlZGxlKSwgKGJvb2wgaXNNYXRjaCkgewogICAgICAgICAgICBpZiAoaXNNYXRjaCkgewogICAgICAgICAgICAgIF9jYW5jZWxBbmRWYWx1ZShzdWJzY3JpcHRpb24sIGZ1dHVyZSwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCBmdXR1cmUpKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUoZmFsc2UpOwogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogRXhlY3V0ZXMgW2FjdGlvbl0gb24gZWFjaCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtLgogICAqCiAgICogQ29tcGxldGVzIHRoZSByZXR1cm5lZCBbRnV0dXJlXSB3aGVuIGFsbCBlbGVtZW50cyBvZiB0aGlzIHN0cmVhbQogICAqIGhhdmUgYmVlbiBwcm9jZXNzZWQuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBhbiBlcnJvciwgb3IgaWYgdGhlIGNhbGwgdG8gW2FjdGlvbl0gdGhyb3dzLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdpdGggdGhhdCBlcnJvciwKICAgKiBhbmQgcHJvY2Vzc2luZyBzdG9wcy4KICAgKi8KICBGdXR1cmUgZm9yRWFjaCh2b2lkIGFjdGlvbihUIGVsZW1lbnQpKSB7CiAgICBfRnV0dXJlIGZ1dHVyZSA9IG5ldyBfRnV0dXJlKCk7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgZWxlbWVudCkgewogICAgICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoZSB0eXBlIHNob3VsZCBiZSAndm9pZCcgYW5kIGluZmVycmVkLgogICAgICAgICAgX3J1blVzZXJDb2RlPGR5bmFtaWM+KCgpID0+IGFjdGlvbihlbGVtZW50KSwgKF8pIHt9LAogICAgICAgICAgICAgIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCBmdXR1cmUpKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUobnVsbCk7CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBDaGVja3Mgd2hldGhlciBbdGVzdF0gYWNjZXB0cyBhbGwgZWxlbWVudHMgcHJvdmlkZWQgYnkgdGhpcyBzdHJlYW0uCiAgICoKICAgKiBDYWxscyBbdGVzdF0gb24gZWFjaCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtLgogICAqIElmIHRoZSBjYWxsIHJldHVybnMgYGZhbHNlYCwgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCBgZmFsc2VgCiAgICogYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbmRzIHdpdGhvdXQgZmluZGluZyBhbiBlbGVtZW50IHRoYXQgW3Rlc3RdIHJlamVjdHMsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCBgdHJ1ZWAuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBhbiBlcnJvciwgb3IgaWYgdGhlIGNhbGwgdG8gW3Rlc3RdIHRocm93cywKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgZXJyb3IsCiAgICogYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICovCiAgRnV0dXJlPGJvb2w+IGV2ZXJ5KGJvb2wgdGVzdChUIGVsZW1lbnQpKSB7CiAgICBfRnV0dXJlPGJvb2w+IGZ1dHVyZSA9IG5ldyBfRnV0dXJlPGJvb2w+KCk7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgZWxlbWVudCkgewogICAgICAgICAgX3J1blVzZXJDb2RlKCgpID0+IHRlc3QoZWxlbWVudCksIChib29sIGlzTWF0Y2gpIHsKICAgICAgICAgICAgaWYgKCFpc01hdGNoKSB7CiAgICAgICAgICAgICAgX2NhbmNlbEFuZFZhbHVlKHN1YnNjcmlwdGlvbiwgZnV0dXJlLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCBmdXR1cmUpKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUodHJ1ZSk7CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBDaGVja3Mgd2hldGhlciBbdGVzdF0gYWNjZXB0cyBhbnkgZWxlbWVudCBwcm92aWRlZCBieSB0aGlzIHN0cmVhbS4KICAgKgogICAqIENhbGxzIFt0ZXN0XSBvbiBlYWNoIGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0uCiAgICogSWYgdGhlIGNhbGwgcmV0dXJucyBgdHJ1ZWAsIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggYHRydWVgCiAgICogYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbmRzIHdpdGhvdXQgZmluZGluZyBhbiBlbGVtZW50IHRoYXQgW3Rlc3RdIGFjY2VwdHMsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCBgZmFsc2VgLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgYW4gZXJyb3IsIG9yIGlmIHRoZSBjYWxsIHRvIFt0ZXN0XSB0aHJvd3MsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLAogICAqIGFuZCBwcm9jZXNzaW5nIHN0b3BzLgogICAqLwogIEZ1dHVyZTxib29sPiBhbnkoYm9vbCB0ZXN0KFQgZWxlbWVudCkpIHsKICAgIF9GdXR1cmU8Ym9vbD4gZnV0dXJlID0gbmV3IF9GdXR1cmU8Ym9vbD4oKTsKICAgIFN0cmVhbVN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb247CiAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbigKICAgICAgICAoVCBlbGVtZW50KSB7CiAgICAgICAgICBfcnVuVXNlckNvZGUoKCkgPT4gdGVzdChlbGVtZW50KSwgKGJvb2wgaXNNYXRjaCkgewogICAgICAgICAgICBpZiAoaXNNYXRjaCkgewogICAgICAgICAgICAgIF9jYW5jZWxBbmRWYWx1ZShzdWJzY3JpcHRpb24sIGZ1dHVyZSwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCBmdXR1cmUpKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUoZmFsc2UpOwogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIHN0cmVhbS4KICAgKgogICAqIFdhaXRzIGZvciBhbGwgZWxlbWVudHMgb2YgdGhpcyBzdHJlYW0uIFdoZW4gdGhpcyBzdHJlYW0gZW5kcywKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBhbiBlcnJvciwKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgZXJyb3IsCiAgICogYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICoKICAgKiBUaGlzIG9wZXJhdGlvbiBsaXN0ZW5zIHRvIHRoaXMgc3RyZWFtLCBhbmQgYSBub24tYnJvYWRjYXN0IHN0cmVhbSBjYW5ub3QKICAgKiBiZSByZXVzZWQgYWZ0ZXIgZmluZGluZyBpdHMgbGVuZ3RoLgogICAqLwogIEZ1dHVyZTxpbnQ+IGdldCBsZW5ndGggewogICAgX0Z1dHVyZTxpbnQ+IGZ1dHVyZSA9IG5ldyBfRnV0dXJlPGludD4oKTsKICAgIGludCBjb3VudCA9IDA7CiAgICB0aGlzLmxpc3RlbigKICAgICAgICAoXykgewogICAgICAgICAgY291bnQrKzsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUoY291bnQpOwogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogV2hldGhlciB0aGlzIHN0cmVhbSBjb250YWlucyBhbnkgZWxlbWVudHMuCiAgICoKICAgKiBXYWl0cyBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0sIHRoZW4gY29tcGxldGVzIHRoZSByZXR1cm5lZAogICAqIGZ1dHVyZSB3aXRoIGB0cnVlYC4KICAgKiBJZiB0aGlzIHN0cmVhbSBlbmRzIHdpdGhvdXQgZW1pdHRpbmcgYW55IGVsZW1lbnRzLCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzCiAgICogY29tcGxldGVkIHdpdGggYGZhbHNlYC4KICAgKgogICAqIElmIHRoZSBmaXJzdCBldmVudCBpcyBhbiBlcnJvciwgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0CiAgICogZXJyb3IuCiAgICoKICAgKiBUaGlzIG9wZXJhdGlvbiBsaXN0ZW5zIHRvIHRoaXMgc3RyZWFtLCBhbmQgYSBub24tYnJvYWRjYXN0IHN0cmVhbSBjYW5ub3QKICAgKiBiZSByZXVzZWQgYWZ0ZXIgY2hlY2tpbmcgd2hldGhlciBpdCBpcyBlbXB0eS4KICAgKi8KICBGdXR1cmU8Ym9vbD4gZ2V0IGlzRW1wdHkgewogICAgX0Z1dHVyZTxib29sPiBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxib29sPigpOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChfKSB7CiAgICAgICAgICBfY2FuY2VsQW5kVmFsdWUoc3Vic2NyaXB0aW9uLCBmdXR1cmUsIGZhbHNlKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUodHJ1ZSk7CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBBZGFwdCB0aGlzIHN0cmVhbSB0byBiZSBhIGBTdHJlYW08Uj5gLgogICAqCiAgICogVGhpcyBzdHJlYW0gaXMgd3JhcHBlZCBhcyBhIGBTdHJlYW08Uj5gIHdoaWNoIGNoZWNrcyBhdCBydW4tdGltZSB0aGF0CiAgICogZWFjaCBkYXRhIGV2ZW50IGVtaXR0ZWQgYnkgdGhpcyBzdHJlYW0gaXMgYWxzbyBhbiBpbnN0YW5jZSBvZiBbUl0uCiAgICovCiAgU3RyZWFtPFI+IGNhc3Q8Uj4oKSA9PiBTdHJlYW0uY2FzdEZyb208VCwgUj4odGhpcyk7CiAgLyoqCiAgICogQ29sbGVjdHMgYWxsIGVsZW1lbnRzIG9mIHRoaXMgc3RyZWFtIGluIGEgW0xpc3RdLgogICAqCiAgICogQ3JlYXRlcyBhIGBMaXN0PFQ+YCBhbmQgYWRkcyBhbGwgZWxlbWVudHMgb2YgdGhpcyBzdHJlYW0gdG8gdGhlIGxpc3QKICAgKiBpbiB0aGUgb3JkZXIgdGhleSBhcnJpdmUuCiAgICogV2hlbiB0aGlzIHN0cmVhbSBlbmRzLCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgbGlzdC4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvciwKICAgKiBhbmQgcHJvY2Vzc2luZyBzdG9wcy4KICAgKi8KICBGdXR1cmU8TGlzdDxUPj4gdG9MaXN0KCkgewogICAgTGlzdDxUPiByZXN1bHQgPSA8VD5bXTsKICAgIF9GdXR1cmU8TGlzdDxUPj4gZnV0dXJlID0gbmV3IF9GdXR1cmU8TGlzdDxUPj4oKTsKICAgIHRoaXMubGlzdGVuKAogICAgICAgIChUIGRhdGEpIHsKICAgICAgICAgIHJlc3VsdC5hZGQoZGF0YSk7CiAgICAgICAgfSwKICAgICAgICBvbkVycm9yOiBmdXR1cmUuX2NvbXBsZXRlRXJyb3IsCiAgICAgICAgb25Eb25lOiAoKSB7CiAgICAgICAgICBmdXR1cmUuX2NvbXBsZXRlKHJlc3VsdCk7CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBDb2xsZWN0cyB0aGUgZGF0YSBvZiB0aGlzIHN0cmVhbSBpbiBhIFtTZXRdLgogICAqCiAgICogQ3JlYXRlcyBhIGBTZXQ8VD5gIGFuZCBhZGRzIGFsbCBlbGVtZW50cyBvZiB0aGlzIHN0cmVhbSB0byB0aGUgc2V0LgogICAqIGluIHRoZSBvcmRlciB0aGV5IGFycml2ZS4KICAgKiBXaGVuIHRoaXMgc3RyZWFtIGVuZHMsIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBzZXQuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc2V0IGlzIHRoZSBzYW1lIHR5cGUgYXMgcmV0dXJuZWQgYnkgYG5ldyBTZXQ8VD4oKWAuCiAgICogSWYgYW5vdGhlciB0eXBlIG9mIHNldCBpcyBuZWVkZWQsIGVpdGhlciB1c2UgW2ZvckVhY2hdIHRvIGFkZCBlYWNoCiAgICogZWxlbWVudCB0byB0aGUgc2V0LCBvciB1c2UKICAgKiBgdG9MaXN0KCkudGhlbigobGlzdCkgPT4gbmV3IFNvbWVPdGhlclNldC5mcm9tKGxpc3QpKWAKICAgKiB0byBjcmVhdGUgdGhlIHNldC4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvciwKICAgKiBhbmQgcHJvY2Vzc2luZyBzdG9wcy4KICAgKi8KICBGdXR1cmU8U2V0PFQ+PiB0b1NldCgpIHsKICAgIFNldDxUPiByZXN1bHQgPSBuZXcgU2V0PFQ+KCk7CiAgICBfRnV0dXJlPFNldDxUPj4gZnV0dXJlID0gbmV3IF9GdXR1cmU8U2V0PFQ+PigpOwogICAgdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgZGF0YSkgewogICAgICAgICAgcmVzdWx0LmFkZChkYXRhKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUocmVzdWx0KTsKICAgICAgICB9LAogICAgICAgIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgcmV0dXJuIGZ1dHVyZTsKICB9CgogIC8qKgogICAqIERpc2NhcmRzIGFsbCBkYXRhIG9uIHRoaXMgc3RyZWFtLCBidXQgc2lnbmFscyB3aGVuIGl0IGlzIGRvbmUgb3IgYW4gZXJyb3IKICAgKiBvY2N1cnJlZC4KICAgKgogICAqIFdoZW4gc3Vic2NyaWJpbmcgdXNpbmcgW2RyYWluXSwgY2FuY2VsT25FcnJvciB3aWxsIGJlIHRydWUuIFRoaXMgbWVhbnMKICAgKiB0aGF0IHRoZSBmdXR1cmUgd2lsbCBjb21wbGV0ZSB3aXRoIHRoZSBmaXJzdCBlcnJvciBvbiB0aGlzIHN0cmVhbSBhbmQgdGhlbgogICAqIGNhbmNlbCB0aGUgc3Vic2NyaXB0aW9uLgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yLCBvciB0aGUgY2FsbCB0byBbY29tYmluZV0gdGhyb3dzLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvciwKICAgKiBhbmQgcHJvY2Vzc2luZyBpcyBzdG9wcGVkLgogICAqCiAgICogSW4gY2FzZSBvZiBhIGBkb25lYCBldmVudCB0aGUgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIHRoZSBnaXZlbgogICAqIFtmdXR1cmVWYWx1ZV0uCiAgICovCiAgRnV0dXJlPEU+IGRyYWluPEU+KFtFIGZ1dHVyZVZhbHVlXSkgPT4KICAgICAgbGlzdGVuKG51bGwsIGNhbmNlbE9uRXJyb3I6IHRydWUpLmFzRnV0dXJlPEU+KGZ1dHVyZVZhbHVlKTsKCiAgLyoqCiAgICogUHJvdmlkZXMgYXQgbW9zdCB0aGUgZmlyc3QgW2NvdW50XSBkYXRhIGV2ZW50cyBvZiB0aGlzIHN0cmVhbS4KICAgKgogICAqIFJldHVybnMgYSBzdHJlYW0gdGhhdCBlbWl0cyB0aGUgc2FtZSBldmVudHMgdGhhdCB0aGlzIHN0cmVhbSB3b3VsZAogICAqIGlmIGxpc3RlbmVkIHRvIGF0IHRoZSBzYW1lIHRpbWUsCiAgICogdW50aWwgZWl0aGVyIHRoaXMgc3RyZWFtIGVuZHMgb3IgaXQgaGFzIGVtaXR0ZWQgW2NvdW50XSBkYXRhIGV2ZW50cywKICAgKiBhdCB3aGljaCBwb2ludCB0aGUgcmV0dXJuZWQgc3RyZWFtIGlzIGRvbmUuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBwcm9kdWNlcyBmZXdlciB0aGFuIFtjb3VudF0gZGF0YSBldmVudHMgYmVmb3JlIGl0J3MgZG9uZSwKICAgKiBzbyB3aWxsIHRoZSByZXR1cm5lZCBzdHJlYW0uCiAgICoKICAgKiBTdGFydHMgbGlzdGVuaW5nIHRvIHRoaXMgc3RyZWFtIHdoZW4gdGhlIHJldHVybmVkIHN0cmVhbSBpcyBsaXN0ZW5lZCB0bwogICAqIGFuZCBzdG9wcyBsaXN0ZW5pbmcgd2hlbiB0aGUgZmlyc3QgW2NvdW50XSBkYXRhIGV2ZW50cyBoYXZlIGJlZW4gcmVjZWl2ZWQuCiAgICoKICAgKiBUaGlzIG1lYW5zIHRoYXQgaWYgdGhpcyBpcyBhIHNpbmdsZS1zdWJzY3JpcHRpb24gKG5vbi1icm9hZGNhc3QpIHN0cmVhbXMKICAgKiBpdCBjYW5ub3QgYmUgcmV1c2VkIGFmdGVyIHRoZSByZXR1cm5lZCBzdHJlYW0gaGFzIGJlZW4gbGlzdGVuZWQgdG8uCiAgICoKICAgKiBJZiB0aGlzIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSwgdGhlIHJldHVybmVkIHN0cmVhbSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0uCiAgICogSW4gdGhhdCBjYXNlLCB0aGUgZXZlbnRzIGFyZSBvbmx5IGNvdW50ZWQgZnJvbSB0aGUgdGltZQogICAqIHRoZSByZXR1cm5lZCBzdHJlYW0gaXMgbGlzdGVuZWQgdG8uCiAgICovCiAgU3RyZWFtPFQ+IHRha2UoaW50IGNvdW50KSB7CiAgICByZXR1cm4gbmV3IF9UYWtlU3RyZWFtPFQ+KHRoaXMsIGNvdW50KTsKICB9CgogIC8qKgogICAqIEZvcndhcmRzIGRhdGEgZXZlbnRzIHdoaWxlIFt0ZXN0XSBpcyBzdWNjZXNzZnVsLgogICAqCiAgICogUmV0dXJucyBhIHN0cmVhbSB0aGF0IHByb3ZpZGVzIHRoZSBzYW1lIGV2ZW50cyBhcyB0aGlzIHN0cmVhbQogICAqIHVudGlsIFt0ZXN0XSBmYWlscyBmb3IgYSBkYXRhIGV2ZW50LgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgZG9uZSB3aGVuIGVpdGhlciB0aGlzIHN0cmVhbSBpcyBkb25lLAogICAqIG9yIHdoZW4gdGhpcyBzdHJlYW0gZmlyc3QgZW1pdHMgYSBkYXRhIGV2ZW50IHRoYXQgZmFpbHMgW3Rlc3RdLgogICAqCiAgICogVGhlIGB0ZXN0YCBjYWxsIGlzIGNvbnNpZGVyZWQgZmFpbGluZyBpZiBpdCByZXR1cm5zIGEgbm9uLWB0cnVlYCB2YWx1ZQogICAqIG9yIGlmIGl0IHRocm93cy4gSWYgdGhlIGB0ZXN0YCBjYWxsIHRocm93cywgdGhlIGVycm9yIGlzIGVtaXR0ZWQgYXMgdGhlCiAgICogbGFzdCBldmVudCBvbiB0aGUgcmV0dXJuZWQgc3RyZWFtcy4KICAgKgogICAqIFN0b3BzIGxpc3RlbmluZyB0byB0aGlzIHN0cmVhbSBhZnRlciB0aGUgYWNjZXB0ZWQgZWxlbWVudHMuCiAgICoKICAgKiBJbnRlcm5hbGx5IHRoZSBtZXRob2QgY2FuY2VscyBpdHMgc3Vic2NyaXB0aW9uIGFmdGVyIHRoZXNlIGVsZW1lbnRzLiBUaGlzCiAgICogbWVhbnMgdGhhdCBzaW5nbGUtc3Vic2NyaXB0aW9uIChub24tYnJvYWRjYXN0KSBzdHJlYW1zIGFyZSBjbG9zZWQgYW5kCiAgICogY2Fubm90IGJlIHJldXNlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBtZXRob2QuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSBpZiB0aGlzIHN0cmVhbSBpcy4KICAgKiBGb3IgYSBicm9hZGNhc3Qgc3RyZWFtLCB0aGUgZXZlbnRzIGFyZSBvbmx5IHRlc3RlZCBmcm9tIHRoZSB0aW1lCiAgICogdGhlIHJldHVybmVkIHN0cmVhbSBpcyBsaXN0ZW5lZCB0by4KICAgKi8KICBTdHJlYW08VD4gdGFrZVdoaWxlKGJvb2wgdGVzdChUIGVsZW1lbnQpKSB7CiAgICByZXR1cm4gbmV3IF9UYWtlV2hpbGVTdHJlYW08VD4odGhpcywgdGVzdCk7CiAgfQoKICAvKioKICAgKiBTa2lwcyB0aGUgZmlyc3QgW2NvdW50XSBkYXRhIGV2ZW50cyBmcm9tIHRoaXMgc3RyZWFtLgogICAqCiAgICogUmV0dXJucyBhIHN0cmVhbSB0aGF0IGVtaXRzIHRoZSBzYW1lIGV2ZW50cyBhcyB0aGlzIHN0cmVhbSB3b3VsZAogICAqIGlmIGxpc3RlbmVkIHRvIGF0IHRoZSBzYW1lIHRpbWUsIGV4Y2VwdCB0aGF0IHRoZSBmaXJzdCBbY291bnRdCiAgICogZGF0YSBldmVudHMgYXJlIG5vdCBlbWl0dGVkLgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgZG9uZSB3aGVuIHRoaXMgc3RyZWFtIGlzLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgZmV3ZXIgdGhhbiBbY291bnRdIGRhdGEgZXZlbnRzCiAgICogYmVmb3JlIGJlaW5nIGRvbmUsIHRoZSByZXR1cm5lZCBzdHJlYW0gZW1pdHMgbm8gZGF0YSBldmVudHMuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSBpZiB0aGlzIHN0cmVhbSBpcy4KICAgKiBGb3IgYSBicm9hZGNhc3Qgc3RyZWFtLCB0aGUgZXZlbnRzIGFyZSBvbmx5IGNvdW50ZWQgZnJvbSB0aGUgdGltZQogICAqIHRoZSByZXR1cm5lZCBzdHJlYW0gaXMgbGlzdGVuZWQgdG8uCiAgICovCiAgU3RyZWFtPFQ+IHNraXAoaW50IGNvdW50KSB7CiAgICByZXR1cm4gbmV3IF9Ta2lwU3RyZWFtPFQ+KHRoaXMsIGNvdW50KTsKICB9CgogIC8qKgogICAqIFNraXAgZGF0YSBldmVudHMgZnJvbSB0aGlzIHN0cmVhbSB3aGlsZSB0aGV5IGFyZSBtYXRjaGVkIGJ5IFt0ZXN0XS4KICAgKgogICAqIFJldHVybnMgYSBzdHJlYW0gdGhhdCBlbWl0cyB0aGUgc2FtZSBldmVudHMgYXMgdGhpcyBzdHJlYW0sCiAgICogZXhjZXB0IHRoYXQgZGF0YSBldmVudHMgYXJlIG5vdCBlbWl0dGVkIHVudGlsIGEgZGF0YSBldmVudCBmYWlscyBgdGVzdGAuCiAgICogVGhlIHRlc3QgZmFpbHMgd2hlbiBjYWxsZWQgd2l0aCBhIGRhdGEgZXZlbnQKICAgKiBpZiBpdCByZXR1cm5zIGEgbm9uLWB0cnVlYCB2YWx1ZSBvciBpZiB0aGUgY2FsbCB0byBgdGVzdGAgdGhyb3dzLgogICAqIElmIHRoZSBjYWxsIHRocm93cywgdGhlIGVycm9yIGlzIGVtaXR0ZWQgYXMgYW4gZXJyb3IgZXZlbnQKICAgKiBvbiB0aGUgcmV0dXJuZWQgc3RyZWFtIGluc3RlYWQgb2YgdGhlIGRhdGEgZXZlbnQsCiAgICogb3RoZXJ3aXNlIHRoZSBldmVudCB0aGF0IG1hZGUgYHRlc3RgIHJldHVybiBub24tdHJ1ZSBpcyBlbWl0dGVkIGFzIHRoZQogICAqIGZpcnN0IGRhdGEgZXZlbnQuCiAgICoKICAgKiBFcnJvciBhbmQgZG9uZSBldmVudHMgYXJlIHByb3ZpZGVkIGJ5IHRoZSByZXR1cm5lZCBzdHJlYW0gdW5tb2RpZmllZC4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIGlmIHRoaXMgc3RyZWFtIGlzLgogICAqIEZvciBhIGJyb2FkY2FzdCBzdHJlYW0sIHRoZSBldmVudHMgYXJlIG9ubHkgdGVzdGVkIGZyb20gdGhlIHRpbWUKICAgKiB0aGUgcmV0dXJuZWQgc3RyZWFtIGlzIGxpc3RlbmVkIHRvLgogICAqLwogIFN0cmVhbTxUPiBza2lwV2hpbGUoYm9vbCB0ZXN0KFQgZWxlbWVudCkpIHsKICAgIHJldHVybiBuZXcgX1NraXBXaGlsZVN0cmVhbTxUPih0aGlzLCB0ZXN0KTsKICB9CgogIC8qKgogICAqIFNraXBzIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGVxdWFsIHRvIHRoZSBwcmV2aW91cyBkYXRhIGV2ZW50LgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSBwcm92aWRlcyB0aGUgc2FtZSBldmVudHMgYXMgdGhpcyBzdHJlYW0sIGV4Y2VwdAogICAqIHRoYXQgaXQgbmV2ZXIgcHJvdmlkZXMgdHdvIGNvbnNlY3V0aXZlIGRhdGEgZXZlbnRzIHRoYXQgYXJlIGVxdWFsLgogICAqIFRoYXQgaXMsIGVycm9ycyBhcmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHJldHVybmVkIHN0cmVhbSwgYW5kCiAgICogZGF0YSBldmVudHMgYXJlIHBhc3NlZCB0aHJvdWdoIGlmIHRoZXkgYXJlIGRpc3RpbmN0IGZyb20gdGhlIG1vc3QKICAgKiByZWNlbnRseSBlbWl0dGVkIGRhdGEgZXZlbnQuCiAgICoKICAgKiBFcXVhbGl0eSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBwcm92aWRlZCBbZXF1YWxzXSBtZXRob2QuIElmIHRoYXQgaXMKICAgKiBvbWl0dGVkLCB0aGUgJz09JyBvcGVyYXRvciBvbiB0aGUgbGFzdCBwcm92aWRlZCBkYXRhIGVsZW1lbnQgaXMgdXNlZC4KICAgKgogICAqIElmIFtlcXVhbHNdIHRocm93cywgdGhlIGRhdGEgZXZlbnQgaXMgcmVwbGFjZWQgYnkgYW4gZXJyb3IgZXZlbnQKICAgKiBjb250YWluaW5nIHRoZSB0aHJvd24gZXJyb3IuIFRoZSBiZWhhdmlvciBpcyBlcXVpdmFsZW50IHRvIHRoZQogICAqIG9yaWdpbmFsIHN0cmVhbSBlbWl0dGluZyB0aGUgZXJyb3IgZXZlbnQsIGFuZCBpdCBkb2Vzbid0IGNoYW5nZQogICAqIHRoZSB3aGF0IHRoZSBtb3N0IHJlY2VudGx5IGVtaXR0ZWQgZGF0YSBldmVudCBpcy4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIGlmIHRoaXMgc3RyZWFtIGlzLgogICAqIElmIGEgYnJvYWRjYXN0IHN0cmVhbSBpcyBsaXN0ZW5lZCB0byBtb3JlIHRoYW4gb25jZSwgZWFjaCBzdWJzY3JpcHRpb24KICAgKiB3aWxsIGluZGl2aWR1YWxseSBwZXJmb3JtIHRoZSBgZXF1YWxzYCB0ZXN0LgogICAqLwogIFN0cmVhbTxUPiBkaXN0aW5jdChbYm9vbCBlcXVhbHMoVCBwcmV2aW91cywgVCBuZXh0KV0pIHsKICAgIHJldHVybiBuZXcgX0Rpc3RpbmN0U3RyZWFtPFQ+KHRoaXMsIGVxdWFscyk7CiAgfQoKICAvKioKICAgKiBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzIHN0cmVhbS4KICAgKgogICAqIFN0b3BzIGxpc3RlbmluZyB0byB0aGlzIHN0cmVhbSBhZnRlciB0aGUgZmlyc3QgZWxlbWVudCBoYXMgYmVlbiByZWNlaXZlZC4KICAgKgogICAqIEludGVybmFsbHkgdGhlIG1ldGhvZCBjYW5jZWxzIGl0cyBzdWJzY3JpcHRpb24gYWZ0ZXIgdGhlIGZpcnN0IGVsZW1lbnQuCiAgICogVGhpcyBtZWFucyB0aGF0IHNpbmdsZS1zdWJzY3JpcHRpb24gKG5vbi1icm9hZGNhc3QpIHN0cmVhbXMgYXJlIGNsb3NlZAogICAqIGFuZCBjYW5ub3QgYmUgcmV1c2VkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGdldHRlci4KICAgKgogICAqIElmIGFuIGVycm9yIGV2ZW50IG9jY3VycyBiZWZvcmUgdGhlIGZpcnN0IGRhdGEgZXZlbnQsIHRoZSByZXR1cm5lZCBmdXR1cmUKICAgKiBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gaXMgZW1wdHkgKGEgZG9uZSBldmVudCBvY2N1cnMgYmVmb3JlIHRoZSBmaXJzdCBkYXRhIGV2ZW50KSwKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGVycm9yLgogICAqCiAgICogRXhjZXB0IGZvciB0aGUgdHlwZSBvZiB0aGUgZXJyb3IsIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8KICAgKiBgdGhpcy5lbGVtZW50QXQoMClgLgogICAqLwogIEZ1dHVyZTxUPiBnZXQgZmlyc3QgewogICAgX0Z1dHVyZTxUPiBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChUIHZhbHVlKSB7CiAgICAgICAgICBfY2FuY2VsQW5kVmFsdWUoc3Vic2NyaXB0aW9uLCBmdXR1cmUsIHZhbHVlKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayhmdXR1cmUsIGUsIHMpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogVGhlIGxhc3QgZWxlbWVudCBvZiB0aGlzIHN0cmVhbS4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yIGV2ZW50LAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvcgogICAqIGFuZCBwcm9jZXNzaW5nIHN0b3BzLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gaXMgZW1wdHkgKHRoZSBkb25lIGV2ZW50IGlzIHRoZSBmaXJzdCBldmVudCksCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBlcnJvci4KICAgKi8KICBGdXR1cmU8VD4gZ2V0IGxhc3QgewogICAgX0Z1dHVyZTxUPiBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgVCByZXN1bHQ7CiAgICBib29sIGZvdW5kUmVzdWx0ID0gZmFsc2U7CiAgICBsaXN0ZW4oCiAgICAgICAgKFQgdmFsdWUpIHsKICAgICAgICAgIGZvdW5kUmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgIHJlc3VsdCA9IHZhbHVlOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgaWYgKGZvdW5kUmVzdWx0KSB7CiAgICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUocmVzdWx0KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgIF9jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrKGZ1dHVyZSwgZSwgcyk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBUaGUgc2luZ2xlIGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0uCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBhbiBlcnJvciBldmVudCwKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgZXJyb3IKICAgKiBhbmQgcHJvY2Vzc2luZyBzdG9wcy4KICAgKgogICAqIElmIFt0aGlzXSBpcyBlbXB0eSBvciBoYXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50LAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXJyb3IuCiAgICovCiAgRnV0dXJlPFQ+IGdldCBzaW5nbGUgewogICAgX0Z1dHVyZTxUPiBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgVCByZXN1bHQ7CiAgICBib29sIGZvdW5kUmVzdWx0ID0gZmFsc2U7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgdmFsdWUpIHsKICAgICAgICAgIGlmIChmb3VuZFJlc3VsdCkgewogICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgZWxlbWVudCB3ZSBnZXQuCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgICAgX2NhbmNlbEFuZEVycm9yV2l0aFJlcGxhY2VtZW50KHN1YnNjcmlwdGlvbiwgZnV0dXJlLCBlLCBzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBmb3VuZFJlc3VsdCA9IHRydWU7CiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGlmIChmb3VuZFJlc3VsdCkgewogICAgICAgICAgICBmdXR1cmUuX2NvbXBsZXRlKHJlc3VsdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayhmdXR1cmUsIGUsIHMpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0gbWF0Y2hpbmcgW3Rlc3RdLgogICAqCiAgICogUmV0dXJucyBhIGZ1dHVyZSB0aGF0IGlzIGNvbXBsZXRlZCB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtCiAgICogdGhhdCBbdGVzdF0gcmV0dXJucyBgdHJ1ZWAgZm9yLgogICAqCiAgICogSWYgbm8gc3VjaCBlbGVtZW50IGlzIGZvdW5kIGJlZm9yZSB0aGlzIHN0cmVhbSBpcyBkb25lLCBhbmQgYQogICAqIFtvckVsc2VdIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgW29yRWxzZV0KICAgKiBiZWNvbWVzIHRoZSB2YWx1ZSBvZiB0aGUgZnV0dXJlLiBJZiBbb3JFbHNlXSB0aHJvd3MsIHRoZSByZXR1cm5lZAogICAqIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgYW4gZXJyb3IgYmVmb3JlIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50LAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvciwgYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICoKICAgKiBTdG9wcyBsaXN0ZW5pbmcgdG8gdGhpcyBzdHJlYW0gYWZ0ZXIgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgb3IgZXJyb3IKICAgKiBoYXMgYmVlbiByZWNlaXZlZC4KICAgKgogICAqIEludGVybmFsbHkgdGhlIG1ldGhvZCBjYW5jZWxzIGl0cyBzdWJzY3JpcHRpb24gYWZ0ZXIgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdAogICAqIG1hdGNoZXMgdGhlIHByZWRpY2F0ZS4gVGhpcyBtZWFucyB0aGF0IHNpbmdsZS1zdWJzY3JpcHRpb24gKG5vbi1icm9hZGNhc3QpCiAgICogc3RyZWFtcyBhcmUgY2xvc2VkIGFuZCBjYW5ub3QgYmUgcmV1c2VkIGFmdGVyIGEgY2FsbCB0byB0aGlzIG1ldGhvZC4KICAgKgogICAqIElmIGFuIGVycm9yIG9jY3Vycywgb3IgaWYgdGhpcyBzdHJlYW0gZW5kcyB3aXRob3V0IGZpbmRpbmcgYSBtYXRjaCBhbmQKICAgKiB3aXRoIG5vIFtvckVsc2VdIGZ1bmN0aW9uIHByb3ZpZGVkLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggYW4gZXJyb3IuCiAgICovCiAgRnV0dXJlPFQ+IGZpcnN0V2hlcmUoYm9vbCB0ZXN0KFQgZWxlbWVudCksIHtUIG9yRWxzZSgpfSkgewogICAgX0Z1dHVyZTxUPiBmdXR1cmUgPSBuZXcgX0Z1dHVyZSgpOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChUIHZhbHVlKSB7CiAgICAgICAgICBfcnVuVXNlckNvZGUoKCkgPT4gdGVzdCh2YWx1ZSksIChib29sIGlzTWF0Y2gpIHsKICAgICAgICAgICAgaWYgKGlzTWF0Y2gpIHsKICAgICAgICAgICAgICBfY2FuY2VsQW5kVmFsdWUoc3Vic2NyaXB0aW9uLCBmdXR1cmUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbmNlbEFuZEVycm9yQ2xvc3VyZShzdWJzY3JpcHRpb24sIGZ1dHVyZSkpOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgaWYgKG9yRWxzZSAhPSBudWxsKSB7CiAgICAgICAgICAgIF9ydW5Vc2VyQ29kZShvckVsc2UsIGZ1dHVyZS5fY29tcGxldGUsIGZ1dHVyZS5fY29tcGxldGVFcnJvcik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayhmdXR1cmUsIGUsIHMpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogRmluZHMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGlzIHN0cmVhbSBtYXRjaGluZyBbdGVzdF0uCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBhbiBlcnJvciwgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0CiAgICogZXJyb3IsIGFuZCBwcm9jZXNzaW5nIHN0b3BzLgogICAqCiAgICogT3RoZXJ3aXNlIGFzIFtmaXJzdFdoZXJlXSwgZXhjZXB0IHRoYXQgdGhlIGxhc3QgbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZAogICAqIGluc3RlYWQgb2YgdGhlIGZpcnN0LgogICAqIFRoYXQgbWVhbnMgdGhhdCBhIG5vbi1lcnJvciByZXN1bHQgY2Fubm90IGJlIHByb3ZpZGVkIGJlZm9yZSB0aGlzIHN0cmVhbQogICAqIGlzIGRvbmUuCiAgICovCiAgRnV0dXJlPFQ+IGxhc3RXaGVyZShib29sIHRlc3QoVCBlbGVtZW50KSwge1Qgb3JFbHNlKCl9KSB7CiAgICBfRnV0dXJlPFQ+IGZ1dHVyZSA9IG5ldyBfRnV0dXJlKCk7CiAgICBUIHJlc3VsdDsKICAgIGJvb2wgZm91bmRSZXN1bHQgPSBmYWxzZTsKICAgIFN0cmVhbVN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb247CiAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbigKICAgICAgICAoVCB2YWx1ZSkgewogICAgICAgICAgX3J1blVzZXJDb2RlKCgpID0+IHRydWUgPT0gdGVzdCh2YWx1ZSksIChib29sIGlzTWF0Y2gpIHsKICAgICAgICAgICAgaWYgKGlzTWF0Y2gpIHsKICAgICAgICAgICAgICBmb3VuZFJlc3VsdCA9IHRydWU7CiAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCBmdXR1cmUpKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGlmIChmb3VuZFJlc3VsdCkgewogICAgICAgICAgICBmdXR1cmUuX2NvbXBsZXRlKHJlc3VsdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChvckVsc2UgIT0gbnVsbCkgewogICAgICAgICAgICBfcnVuVXNlckNvZGUob3JFbHNlLCBmdXR1cmUuX2NvbXBsZXRlLCBmdXR1cmUuX2NvbXBsZXRlRXJyb3IpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgICAgX2NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2soZnV0dXJlLCBlLCBzKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgcmV0dXJuIGZ1dHVyZTsKICB9CgogIC8qKgogICAqIEZpbmRzIHRoZSBzaW5nbGUgZWxlbWVudCBpbiB0aGlzIHN0cmVhbSBtYXRjaGluZyBbdGVzdF0uCiAgICoKICAgKiBMaWtlIFtsYXN0V2hlcmVdLCBleGNlcHQgdGhhdCBpdCBpcyBhbiBlcnJvciBpZiBtb3JlIHRoYW4gb25lCiAgICogbWF0Y2hpbmcgZWxlbWVudCBvY2N1cnMgaW4gdGhpcyBzdHJlYW0uCiAgICovCiAgRnV0dXJlPFQ+IHNpbmdsZVdoZXJlKGJvb2wgdGVzdChUIGVsZW1lbnQpLCB7VCBvckVsc2UoKX0pIHsKICAgIF9GdXR1cmU8VD4gZnV0dXJlID0gbmV3IF9GdXR1cmU8VD4oKTsKICAgIFQgcmVzdWx0OwogICAgYm9vbCBmb3VuZFJlc3VsdCA9IGZhbHNlOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChUIHZhbHVlKSB7CiAgICAgICAgICBfcnVuVXNlckNvZGUoKCkgPT4gdHJ1ZSA9PSB0ZXN0KHZhbHVlKSwgKGJvb2wgaXNNYXRjaCkgewogICAgICAgICAgICBpZiAoaXNNYXRjaCkgewogICAgICAgICAgICAgIGlmIChmb3VuZFJlc3VsdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICAgICAgICBfY2FuY2VsQW5kRXJyb3JXaXRoUmVwbGFjZW1lbnQoc3Vic2NyaXB0aW9uLCBmdXR1cmUsIGUsIHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmb3VuZFJlc3VsdCA9IHRydWU7CiAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYW5jZWxBbmRFcnJvckNsb3N1cmUoc3Vic2NyaXB0aW9uLCBmdXR1cmUpKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGlmIChmb3VuZFJlc3VsdCkgewogICAgICAgICAgICBmdXR1cmUuX2NvbXBsZXRlKHJlc3VsdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChvckVsc2UgIT0gbnVsbCkgewogICAgICAgICAgICAgIF9ydW5Vc2VyQ29kZShvckVsc2UsIGZ1dHVyZS5fY29tcGxldGUsIGZ1dHVyZS5fY29tcGxldGVFcnJvcik7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayhmdXR1cmUsIGUsIHMpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFtpbmRleF10aCBkYXRhIGV2ZW50IG9mIHRoaXMgc3RyZWFtLgogICAqCiAgICogU3RvcHMgbGlzdGVuaW5nIHRvIHRoaXMgc3RyZWFtIGFmdGVyIHRoZSBbaW5kZXhddGggZGF0YSBldmVudCBoYXMgYmVlbgogICAqIHJlY2VpdmVkLgogICAqCiAgICogSW50ZXJuYWxseSB0aGUgbWV0aG9kIGNhbmNlbHMgaXRzIHN1YnNjcmlwdGlvbiBhZnRlciB0aGVzZSBlbGVtZW50cy4gVGhpcwogICAqIG1lYW5zIHRoYXQgc2luZ2xlLXN1YnNjcmlwdGlvbiAobm9uLWJyb2FkY2FzdCkgc3RyZWFtcyBhcmUgY2xvc2VkIGFuZAogICAqIGNhbm5vdCBiZSByZXVzZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgbWV0aG9kLgogICAqCiAgICogSWYgYW4gZXJyb3IgZXZlbnQgb2NjdXJzIGJlZm9yZSB0aGUgdmFsdWUgaXMgZm91bmQsIHRoZSBmdXR1cmUgY29tcGxldGVzCiAgICogd2l0aCB0aGlzIGVycm9yLgogICAqCiAgICogSWYgYSBkb25lIGV2ZW50IG9jY3VycyBiZWZvcmUgdGhlIHZhbHVlIGlzIGZvdW5kLCB0aGUgZnV0dXJlIGNvbXBsZXRlcwogICAqIHdpdGggYSBbUmFuZ2VFcnJvcl0uCiAgICovCiAgRnV0dXJlPFQ+IGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGluZGV4LCAiaW5kZXgiKTsKICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShpbmRleCwgImluZGV4Iik7CiAgICBfRnV0dXJlPFQ+IGZ1dHVyZSA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgaW50IGVsZW1lbnRJbmRleCA9IDA7CiAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbigKICAgICAgICAoVCB2YWx1ZSkgewogICAgICAgICAgaWYgKGluZGV4ID09IGVsZW1lbnRJbmRleCkgewogICAgICAgICAgICBfY2FuY2VsQW5kVmFsdWUoc3Vic2NyaXB0aW9uLCBmdXR1cmUsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgZWxlbWVudEluZGV4ICs9IDE7CiAgICAgICAgfSwKICAgICAgICBvbkVycm9yOiBmdXR1cmUuX2NvbXBsZXRlRXJyb3IsCiAgICAgICAgb25Eb25lOiAoKSB7CiAgICAgICAgICBmdXR1cmUuX2NvbXBsZXRlRXJyb3IoCiAgICAgICAgICAgICAgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIsIG51bGwsIGVsZW1lbnRJbmRleCkpOwogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBzdHJlYW0gd2l0aCB0aGUgc2FtZSBldmVudHMgYXMgdGhpcyBzdHJlYW0uCiAgICoKICAgKiBXaGVuZXZlciBtb3JlIHRoYW4gW3RpbWVMaW1pdF0gcGFzc2VzIGJldHdlZW4gdHdvIGV2ZW50cyBmcm9tIHRoaXMgc3RyZWFtLAogICAqIHRoZSBbb25UaW1lb3V0XSBmdW5jdGlvbiBpcyBjYWxsZWQsIHdoaWNoIGNhbiBlbWl0IGZ1cnRoZXIgZXZlbnRzIG9uCiAgICogdGhlIHJldHVybmVkIHN0cmVhbS4KICAgKgogICAqIFRoZSBjb3VudGRvd24gZG9lc24ndCBzdGFydCB1bnRpbCB0aGUgcmV0dXJuZWQgc3RyZWFtIGlzIGxpc3RlbmVkIHRvLgogICAqIFRoZSBjb3VudGRvd24gaXMgcmVzZXQgZXZlcnkgdGltZSBhbiBldmVudCBpcyBmb3J3YXJkZWQgZnJvbSB0aGlzIHN0cmVhbSwKICAgKiBvciB3aGVuIHRoaXMgc3RyZWFtIGlzIHBhdXNlZCBhbmQgcmVzdW1lZC4KICAgKgogICAqIFRoZSBbb25UaW1lb3V0XSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBvbmUgYXJndW1lbnQ6IGFuCiAgICogW0V2ZW50U2lua10gdGhhdCBhbGxvd3MgcHV0dGluZyBldmVudHMgaW50byB0aGUgcmV0dXJuZWQgc3RyZWFtLgogICAqIFRoaXMgYEV2ZW50U2lua2AgaXMgb25seSB2YWxpZCBkdXJpbmcgdGhlIGNhbGwgdG8gW29uVGltZW91dF0uCiAgICogQ2FsbGluZyBbRXZlbnRTaW5rLmNsb3NlXSBvbiB0aGUgc2luayBwYXNzZWQgdG8gW29uVGltZW91dF0gY2xvc2VzIHRoZQogICAqIHJldHVybmVkIHN0cmVhbSwgYW5kIG5vIGZ1cnRoZXIgZXZlbnRzIGFyZSBwcm9jZXNzZWQuCiAgICoKICAgKiBJZiBbb25UaW1lb3V0XSBpcyBvbWl0dGVkLCBhIHRpbWVvdXQgd2lsbCBqdXN0IHB1dCBhIFtUaW1lb3V0RXhjZXB0aW9uXQogICAqIGludG8gdGhlIGVycm9yIGNoYW5uZWwgb2YgdGhlIHJldHVybmVkIHN0cmVhbS4KICAgKiBJZiB0aGUgY2FsbCB0byBbb25UaW1lb3V0XSB0aHJvd3MsIHRoZSBlcnJvciBpcyBlbWl0dGVkIG9uIHRoZSByZXR1cm5lZAogICAqIHN0cmVhbS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIGlmIHRoaXMgc3RyZWFtIGlzLgogICAqIElmIGEgYnJvYWRjYXN0IHN0cmVhbSBpcyBsaXN0ZW5lZCB0byBtb3JlIHRoYW4gb25jZSwgZWFjaCBzdWJzY3JpcHRpb24KICAgKiB3aWxsIGhhdmUgaXRzIGluZGl2aWR1YWxseSB0aW1lciB0aGF0IHN0YXJ0cyBjb3VudGluZyBvbiBsaXN0ZW4sCiAgICogYW5kIHRoZSBzdWJzY3JpcHRpb25zJyB0aW1lcnMgY2FuIGJlIHBhdXNlZCBpbmRpdmlkdWFsbHkuCiAgICovCiAgU3RyZWFtPFQ+IHRpbWVvdXQoRHVyYXRpb24gdGltZUxpbWl0LCB7dm9pZCBvblRpbWVvdXQoRXZlbnRTaW5rPFQ+IHNpbmspfSkgewogICAgX1N0cmVhbUNvbnRyb2xsZXJCYXNlPFQ+IGNvbnRyb2xsZXI7CiAgICAvLyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgc2V0IG9uIGxpc3Rlbi4KICAgIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb247CiAgICBUaW1lciB0aW1lcjsKICAgIFpvbmUgem9uZTsKICAgIF9UaW1lckNhbGxiYWNrIHRpbWVvdXQ7CgogICAgdm9pZCBvbkRhdGEoVCBldmVudCkgewogICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgdGltZXIgPSB6b25lLmNyZWF0ZVRpbWVyKHRpbWVMaW1pdCwgdGltZW91dCk7CiAgICAgIC8vIEl0IG1pZ2h0IGNsb3NlIHRoZSBzdHJlYW0gYW5kIGNhbmNlbCB0aW1lciwgc28gY3JlYXRlIHJlY3VyaW5nIFRpbWVyCiAgICAgIC8vIGJlZm9yZSBjYWxsaW5nIGludG8gYWRkKCk7CiAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzc1NjUKICAgICAgY29udHJvbGxlci5hZGQoZXZlbnQpOwogICAgfQoKICAgIHZvaWQgb25FcnJvcihlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICAgIHRpbWVyLmNhbmNlbCgpOwogICAgICBhc3NlcnQoY29udHJvbGxlciBpcyBfU3RyZWFtQ29udHJvbGxlciB8fAogICAgICAgICAgY29udHJvbGxlciBpcyBfQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcik7CiAgICAgIGNvbnRyb2xsZXIuX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsgLy8gQXZvaWQgWm9uZSBlcnJvciByZXBsYWNlbWVudC4KICAgICAgdGltZXIgPSB6b25lLmNyZWF0ZVRpbWVyKHRpbWVMaW1pdCwgdGltZW91dCk7CiAgICB9CgogICAgdm9pZCBvbkRvbmUoKSB7CiAgICAgIHRpbWVyLmNhbmNlbCgpOwogICAgICBjb250cm9sbGVyLmNsb3NlKCk7CiAgICB9CgogICAgdm9pZCBvbkxpc3RlbigpIHsKICAgICAgLy8gVGhpcyBpcyB0aGUgb25MaXN0ZW4gY2FsbGJhY2sgZm9yIG9mIGNvbnRyb2xsZXIuCiAgICAgIC8vIEl0IHJ1bnMgaW4gdGhlIHNhbWUgem9uZSB0aGF0IHRoZSBzdWJzY3JpcHRpb24gd2FzIGNyZWF0ZWQgaW4uCiAgICAgIC8vIFVzZSB0aGF0IHpvbmUgZm9yIGNyZWF0aW5nIHRpbWVycyBhbmQgcnVubmluZyB0aGUgb25UaW1lb3V0CiAgICAgIC8vIGNhbGxiYWNrLgogICAgICB6b25lID0gWm9uZS5jdXJyZW50OwogICAgICBpZiAob25UaW1lb3V0ID09IG51bGwpIHsKICAgICAgICB0aW1lb3V0ID0gKCkgewogICAgICAgICAgY29udHJvbGxlci5hZGRFcnJvcigKICAgICAgICAgICAgICBuZXcgVGltZW91dEV4Y2VwdGlvbigiTm8gc3RyZWFtIGV2ZW50IiwgdGltZUxpbWl0KSwgbnVsbCk7CiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUT0RPKGZsb2l0c2NoKTogdGhlIHJldHVybiB0eXBlIHNob3VsZCBiZSAndm9pZCcsIGFuZCB0aGUgdHlwZQogICAgICAgIC8vIHNob3VsZCBiZSBpbmZlcnJlZC4KICAgICAgICB2YXIgcmVnaXN0ZXJlZE9uVGltZW91dCA9CiAgICAgICAgICAgIHpvbmUucmVnaXN0ZXJVbmFyeUNhbGxiYWNrPGR5bmFtaWMsIEV2ZW50U2luazxUPj4ob25UaW1lb3V0KTsKICAgICAgICB2YXIgd3JhcHBlciA9IG5ldyBfQ29udHJvbGxlckV2ZW50U2lua1dyYXBwZXI8VD4obnVsbCk7CiAgICAgICAgdGltZW91dCA9ICgpIHsKICAgICAgICAgIHdyYXBwZXIuX3NpbmsgPSBjb250cm9sbGVyOyAvLyBPbmx5IHZhbGlkIGR1cmluZyBjYWxsLgogICAgICAgICAgem9uZS5ydW5VbmFyeUd1YXJkZWQocmVnaXN0ZXJlZE9uVGltZW91dCwgd3JhcHBlcik7CiAgICAgICAgICB3cmFwcGVyLl9zaW5rID0gbnVsbDsKICAgICAgICB9OwogICAgICB9CgogICAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbihvbkRhdGEsIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lKTsKICAgICAgdGltZXIgPSB6b25lLmNyZWF0ZVRpbWVyKHRpbWVMaW1pdCwgdGltZW91dCk7CiAgICB9CgogICAgRnV0dXJlIG9uQ2FuY2VsKCkgewogICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgRnV0dXJlIHJlc3VsdCA9IHN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgICAgc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBjb250cm9sbGVyID0gaXNCcm9hZGNhc3QKICAgICAgICA/IG5ldyBfU3luY0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXI8VD4ob25MaXN0ZW4sIG9uQ2FuY2VsKQogICAgICAgIDogbmV3IF9TeW5jU3RyZWFtQ29udHJvbGxlcjxUPihvbkxpc3RlbiwgKCkgewogICAgICAgICAgICAvLyBEb24ndCBudWxsIHRoZSB0aW1lciwgb25DYW5jZWwgbWF5IGNhbGwgY2FuY2VsIGFnYWluLgogICAgICAgICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICAgICAgICB9LCAoKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5yZXN1bWUoKTsKICAgICAgICAgICAgdGltZXIgPSB6b25lLmNyZWF0ZVRpbWVyKHRpbWVMaW1pdCwgdGltZW91dCk7CiAgICAgICAgICB9LCBvbkNhbmNlbCk7CiAgICByZXR1cm4gY29udHJvbGxlci5zdHJlYW07CiAgfQp9CgovKioKICogQSBzdWJzY3JpcHRpb24gb24gZXZlbnRzIGZyb20gYSBbU3RyZWFtXS4KICoKICogV2hlbiB5b3UgbGlzdGVuIG9uIGEgW1N0cmVhbV0gdXNpbmcgW1N0cmVhbS5saXN0ZW5dLAogKiBhIFtTdHJlYW1TdWJzY3JpcHRpb25dIG9iamVjdCBpcyByZXR1cm5lZC4KICoKICogVGhlIHN1YnNjcmlwdGlvbiBwcm92aWRlcyBldmVudHMgdG8gdGhlIGxpc3RlbmVyLAogKiBhbmQgaG9sZHMgdGhlIGNhbGxiYWNrcyB1c2VkIHRvIGhhbmRsZSB0aGUgZXZlbnRzLgogKiBUaGUgc3Vic2NyaXB0aW9uIGNhbiBhbHNvIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgZnJvbSB0aGUgZXZlbnRzLAogKiBvciB0byB0ZW1wb3JhcmlseSBwYXVzZSB0aGUgZXZlbnRzIGZyb20gdGhlIHN0cmVhbS4KICovCmFic3RyYWN0IGNsYXNzIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiB7CiAgLyoqCiAgICogQ2FuY2VscyB0aGlzIHN1YnNjcmlwdGlvbi4KICAgKgogICAqIEFmdGVyIHRoaXMgY2FsbCwgdGhlIHN1YnNjcmlwdGlvbiBubyBsb25nZXIgcmVjZWl2ZXMgZXZlbnRzLgogICAqCiAgICogVGhlIHN0cmVhbSBtYXkgbmVlZCB0byBzaHV0IGRvd24gdGhlIHNvdXJjZSBvZiBldmVudHMgYW5kIGNsZWFuIHVwIGFmdGVyCiAgICogdGhlIHN1YnNjcmlwdGlvbiBpcyBjYW5jZWxlZC4KICAgKgogICAqIFJldHVybnMgYSBmdXR1cmUgdGhhdCBpcyBjb21wbGV0ZWQgb25jZSB0aGUgc3RyZWFtIGhhcyBmaW5pc2hlZAogICAqIGl0cyBjbGVhbnVwLgogICAqCiAgICogRm9yIGhpc3RvcmljYWwgcmVhc29ucywgbWF5IGFsc28gcmV0dXJuIGBudWxsYCBpZiBubyBjbGVhbnVwIHdhcyBuZWNlc3NhcnkuCiAgICogUmV0dXJuaW5nIGBudWxsYCBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgYmUgYXZvaWRlZC4KICAgKgogICAqIFR5cGljYWxseSwgZnV0dXJlcyBhcmUgcmV0dXJuZWQgd2hlbiB0aGUgc3RyZWFtIG5lZWRzIHRvIHJlbGVhc2UgcmVzb3VyY2VzLgogICAqIEZvciBleGFtcGxlLCBhIHN0cmVhbSBtaWdodCBuZWVkIHRvIGNsb3NlIGFuIG9wZW4gZmlsZSAoYXMgYW4gYXN5bmNocm9ub3VzCiAgICogb3BlcmF0aW9uKS4gSWYgdGhlIGxpc3RlbmVyIHdhbnRzIHRvIGRlbGV0ZSB0aGUgZmlsZSBhZnRlciBoYXZpbmcKICAgKiBjYW5jZWxlZCB0aGUgc3Vic2NyaXB0aW9uLCBpdCBtdXN0IHdhaXQgZm9yIHRoZSBjbGVhbnVwIGZ1dHVyZSB0byBjb21wbGV0ZS4KICAgKgogICAqIEEgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGEgYG51bGxgIHZhbHVlLgogICAqIElmIHRoZSBjbGVhbnVwIHRocm93cywgd2hpY2ggaXQgcmVhbGx5IHNob3VsZG4ndCwgdGhlIHJldHVybmVkIGZ1dHVyZQogICAqIGNvbXBsZXRlcyB3aXRoIHRoYXQgZXJyb3IuCiAgICovCiAgRnV0dXJlIGNhbmNlbCgpOwoKICAvKioKICAgKiBSZXBsYWNlcyB0aGUgZGF0YSBldmVudCBoYW5kbGVyIG9mIHRoaXMgc3Vic2NyaXB0aW9uLgogICAqCiAgICogVGhlIFtoYW5kbGVEYXRhXSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgc3RyZWFtCiAgICogYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCiAgICogSWYgW2hhbmRsZURhdGFdIGlzIGBudWxsYCwgZnVydGhlciBlbGVtZW50cyBhcmUgaWdub3JlZC4KICAgKgogICAqIFRoaXMgbWV0aG9kIHJlcGxhY2VzIHRoZSBjdXJyZW50IGhhbmRsZXIgc2V0IGJ5IHRoZSBpbnZvY2F0aW9uIG9mCiAgICogW1N0cmVhbS5saXN0ZW5dIG9yIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBbb25EYXRhXS4KICAgKi8KICB2b2lkIG9uRGF0YSh2b2lkIGhhbmRsZURhdGEoVCBkYXRhKSk7CgogIC8qKgogICAqIFJlcGxhY2VzIHRoZSBlcnJvciBldmVudCBoYW5kbGVyIG9mIHRoaXMgc3Vic2NyaXB0aW9uLgogICAqCiAgICogVGhlIFtoYW5kbGVFcnJvcl0gZnVuY3Rpb24gbXVzdCBiZSBhYmxlIHRvIGJlIGNhbGxlZCB3aXRoIGVpdGhlcgogICAqIG9uZSBwb3NpdGlvbmFsIGFyZ3VtZW50LCBvciB3aXRoIHR3byBwb3NpdGlvbmFsIGFyZ3VtZW50cwogICAqIHdoZXJlIHRoZSBzZWNvbmRzIGlzIGFsd2F5cyBhIFtTdGFja1RyYWNlXS4KICAgKgogICAqIFRoZSBbaGFuZGxlRXJyb3JdIGFyZ3VtZW50IG1heSBiZSBgbnVsbGAsIGluIHdoaWNoIGNhc2UgZnVydGhlcgogICAqIGVycm9yIGV2ZW50cyBhcmUgY29uc2lkZXJlZCB1bmhhbmRsZWQsIGFuZCB3aWxsIGJlIHJlcG9ydGVkIHRvCiAgICogW1pvbmUuaGFuZGxlVW5jYXVnaHRFcnJvcl0uCiAgICoKICAgKiBUaGUgcHJvdmlkZWQgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBhbGwgZXJyb3IgZXZlbnRzIGZyb20gdGhlCiAgICogc3RyZWFtIHN1YnNjcmlwdGlvbi4KICAgKgogICAqIFRoaXMgbWV0aG9kIHJlcGxhY2VzIHRoZSBjdXJyZW50IGhhbmRsZXIgc2V0IGJ5IHRoZSBpbnZvY2F0aW9uIG9mCiAgICogW1N0cmVhbS5saXN0ZW5dLCBieSBjYWxsaW5nIFthc0Z1dHVyZV0sIG9yIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBbb25FcnJvcl0uCiAgICovCiAgdm9pZCBvbkVycm9yKEZ1bmN0aW9uIGhhbmRsZUVycm9yKTsKCiAgLyoqCiAgICogUmVwbGFjZXMgdGhlIGRvbmUgZXZlbnQgaGFuZGxlciBvZiB0aGlzIHN1YnNjcmlwdGlvbi4KICAgKgogICAqIFRoZSBbaGFuZGxlRG9uZV0gZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBjbG9zZXMuCiAgICogVGhlIHZhbHVlIG1heSBiZSBgbnVsbGAsIGluIHdoaWNoIGNhc2Ugbm8gZnVuY3Rpb24gaXMgY2FsbGVkLgogICAqCiAgICogVGhpcyBtZXRob2QgcmVwbGFjZXMgdGhlIGN1cnJlbnQgaGFuZGxlciBzZXQgYnkgdGhlIGludm9jYXRpb24gb2YKICAgKiBbU3RyZWFtLmxpc3Rlbl0sIGJ5IGNhbGxpbmcgW2FzRnV0dXJlXSwgb3IgYnkgYSBwcmV2aW91cyBjYWxsIHRvIFtvbkRvbmVdLgogICAqLwogIHZvaWQgb25Eb25lKHZvaWQgaGFuZGxlRG9uZSgpKTsKCiAgLyoqCiAgICogUmVxdWVzdCB0aGF0IHRoZSBzdHJlYW0gcGF1c2VzIGV2ZW50cyB1bnRpbCBmdXJ0aGVyIG5vdGljZS4KICAgKgogICAqIFdoaWxlIHBhdXNlZCwgdGhlIHN1YnNjcmlwdGlvbiB3aWxsIG5vdCBmaXJlIGFueSBldmVudHMuCiAgICogSWYgaXQgcmVjZWl2ZXMgZXZlbnRzIGZyb20gaXRzIHNvdXJjZSwgdGhleSB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsCiAgICogdGhlIHN1YnNjcmlwdGlvbiBpcyByZXN1bWVkLgogICAqIEZvciBub24tYnJvYWRjYXN0IHN0cmVhbXMsIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSBpcyB1c3VhbGx5IGluZm9ybWVkCiAgICogYWJvdXQgdGhlIHBhdXNlLAogICAqIHNvIGl0IGNhbiBzdG9wIGdlbmVyYXRpbmcgZXZlbnRzIHVudGlsIHRoZSBzdWJzY3JpcHRpb24gaXMgcmVzdW1lZC4KICAgKgogICAqIFRvIGF2b2lkIGJ1ZmZlcmluZyBldmVudHMgb24gYSBicm9hZGNhc3Qgc3RyZWFtLCBpdCBpcyBiZXR0ZXIgdG8KICAgKiBjYW5jZWwgdGhpcyBzdWJzY3JpcHRpb24sIGFuZCBzdGFydCB0byBsaXN0ZW4gYWdhaW4gd2hlbiBldmVudHMKICAgKiBhcmUgbmVlZGVkLCBpZiB0aGUgaW50ZXJtZWRpYXRlIGV2ZW50cyBhcmUgbm90IGltcG9ydGFudC4KICAgKgogICAqIElmIFtyZXN1bWVTaWduYWxdIGlzIHByb3ZpZGVkLCB0aGUgc3RyZWFtIHN1YnNjcmlwdGlvbiB3aWxsIHVuZG8gdGhlIHBhdXNlCiAgICogd2hlbiB0aGUgZnV0dXJlIGNvbXBsZXRlcywgYXMgaWYgYnkgYSBjYWxsIHRvIFtyZXN1bWVdLgogICAqIElmIHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXJyb3IsCiAgICogdGhlIHN0cmVhbSB3aWxsIHN0aWxsIHJlc3VtZSwgYnV0IHRoZSBlcnJvciB3aWxsIGJlIGNvbnNpZGVyZWQgdW5oYW5kbGVkCiAgICogYW5kIGlzIHBhc3NlZCB0byBbWm9uZS5oYW5kbGVVbmNhdWdodEVycm9yXS4KICAgKgogICAqIEEgY2FsbCB0byBbcmVzdW1lXSB3aWxsIGFsc28gdW5kbyBhIHBhdXNlLgogICAqCiAgICogSWYgdGhlIHN1YnNjcmlwdGlvbiBpcyBwYXVzZWQgbW9yZSB0aGFuIG9uY2UsIGFuIGVxdWFsIG51bWJlcgogICAqIG9mIHJlc3VtZXMgbXVzdCBiZSBwZXJmb3JtZWQgdG8gcmVzdW1lIHRoZSBzdHJlYW0uCiAgICogQ2FsbHMgdG8gW3Jlc3VtZV0gYW5kIHRoZSBjb21wbGV0aW9uIG9mIGEgW3Jlc3VtZVNpZ25hbF0gYXJlCiAgICogaW50ZXJjaGFuZ2VhYmxlIC0gdGhlIFtwYXVzZV0gd2hpY2ggd2FzIHBhc3NlZCBhIFtyZXN1bWVTaWduYWxdIG1heSBiZQogICAqIGVuZGVkIGJ5IGEgY2FsbCB0byBbcmVzdW1lXSwgYW5kIGNvbXBsZXRpbmcgdGhlIFtyZXN1bWVTaWduYWxdIG1heSBlbmQgYQogICAqIGRpZmZlcmVudCBbcGF1c2VdLgogICAqCiAgICogSXQgaXMgc2FmZSB0byBbcmVzdW1lXSBvciBjb21wbGV0ZSBhIFtyZXN1bWVTaWduYWxdIGV2ZW4gd2hlbiB0aGUKICAgKiBzdWJzY3JpcHRpb24gaXMgbm90IHBhdXNlZCwgYW5kIHRoZSByZXN1bWUgd2lsbCBoYXZlIG5vIGVmZmVjdC4KICAgKgogICAqIEN1cnJlbnRseSBET00gc3RyZWFtcyBzaWxlbnRseSBkcm9wIGV2ZW50cyB3aGVuIHRoZSBzdHJlYW0gaXMgcGF1c2VkLiBUaGlzCiAgICogaXMgYSBidWcgYW5kIHdpbGwgYmUgZml4ZWQuCiAgICovCiAgdm9pZCBwYXVzZShbRnV0dXJlIHJlc3VtZVNpZ25hbF0pOwoKICAvKioKICAgKiBSZXN1bWUgYWZ0ZXIgYSBwYXVzZS4KICAgKgogICAqIFRoaXMgdW5kb2VzIG9uZSBwcmV2aW91cyBjYWxsIHRvIFtwYXVzZV0uCiAgICogV2hlbiBhbGwgcHJldmlvdXNseSBjYWxscyB0byBbcGF1c2VdIGhhdmUgYmVlbiBtYXRjaGVkIGJ5IGEgY2FsbHMgdG8KICAgKiBbcmVzdW1lXSwgcG9zc2libHkgdGhyb3VnaCBhIGByZXN1bWVTaWduYWxgIHBhc3NlZCB0byBbcGF1c2VdLAogICAqIHRoZSBzdHJlYW0gc3Vic2NyaXB0aW9uIG1heSBlbWl0IGV2ZW50cyBhZ2Fpbi4KICAgKgogICAqIEl0IGlzIHNhZmUgdG8gW3Jlc3VtZV0gZXZlbiB3aGVuIHRoZSBzdWJzY3JpcHRpb24gaXMgbm90IHBhdXNlZCwgYW5kIHRoZQogICAqIHJlc3VtZSB3aWxsIGhhdmUgbm8gZWZmZWN0LgogICAqLwogIHZvaWQgcmVzdW1lKCk7CgogIC8qKgogICAqIFdoZXRoZXIgdGhlIFtTdHJlYW1TdWJzY3JpcHRpb25dIGlzIGN1cnJlbnRseSBwYXVzZWQuCiAgICoKICAgKiBJZiB0aGVyZSBoYXZlIGJlZW4gbW9yZSBjYWxscyB0byBbcGF1c2VdIHRoYW4gdG8gW3Jlc3VtZV0gb24gdGhpcwogICAqIHN0cmVhbSBzdWJzY3JpcHRpb24sIHRoZSBzdWJzY3JpcHRpb24gaXMgcGF1c2VkLCBhbmQgdGhpcyBnZXR0ZXIKICAgKiByZXR1cm5zIGB0cnVlYC4KICAgKgogICAqIFJldHVybnMgYGZhbHNlYCBpZiB0aGUgc3RyZWFtIGNhbiBjdXJyZW50bHkgZW1pdCBldmVudHMsIG9yIGlmCiAgICogdGhlIHN1YnNjcmlwdGlvbiBoYXMgY29tcGxldGVkIG9yIGJlZW4gY2FuY2VsbGVkLgogICAqLwogIGJvb2wgZ2V0IGlzUGF1c2VkOwoKICAvKioKICAgKiBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgaGFuZGxlcyB0aGUgW29uRG9uZV0gYW5kIFtvbkVycm9yXSBjYWxsYmFja3MuCiAgICoKICAgKiBUaGlzIG1ldGhvZCAqb3ZlcndyaXRlcyogdGhlIGV4aXN0aW5nIFtvbkRvbmVdIGFuZCBbb25FcnJvcl0gY2FsbGJhY2tzCiAgICogd2l0aCBuZXcgb25lcyB0aGF0IGNvbXBsZXRlIHRoZSByZXR1cm5lZCBmdXR1cmUuCiAgICoKICAgKiBJbiBjYXNlIG9mIGFuIGVycm9yIHRoZSBzdWJzY3JpcHRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGNhbmNlbCAoZXZlbgogICAqIHdoZW4gaXQgd2FzIGxpc3RlbmluZyB3aXRoIGBjYW5jZWxPbkVycm9yYCBzZXQgdG8gYGZhbHNlYCkuCiAgICoKICAgKiBJbiBjYXNlIG9mIGEgYGRvbmVgIGV2ZW50IHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGggdGhlIGdpdmVuCiAgICogW2Z1dHVyZVZhbHVlXS4KICAgKi8KICBGdXR1cmU8RT4gYXNGdXR1cmU8RT4oW0UgZnV0dXJlVmFsdWVdKTsKfQoKLyoqCiAqIEEgW1NpbmtdIHRoYXQgc3VwcG9ydHMgYWRkaW5nIGVycm9ycy4KICoKICogVGhpcyBtYWtlcyBpdCBzdWl0YWJsZSBmb3IgY2FwdHVyaW5nIHRoZSByZXN1bHRzIG9mIGFzeW5jaHJvbm91cwogKiBjb21wdXRhdGlvbnMsIHdoaWNoIGNhbiBjb21wbGV0ZSB3aXRoIGEgdmFsdWUgb3IgYW4gZXJyb3IuCiAqCiAqIFRoZSBbRXZlbnRTaW5rXSBoYXMgYmVlbiBkZXNpZ25lZCB0byBoYW5kbGUgYXN5bmNocm9ub3VzIGV2ZW50cyBmcm9tCiAqIFtTdHJlYW1dcy4gU2VlLCBmb3IgZXhhbXBsZSwgW1N0cmVhbS5ldmVudFRyYW5zZm9ybWVkXSB3aGljaCB1c2VzCiAqIGBFdmVudFNpbmtgcyB0byB0cmFuc2Zvcm0gZXZlbnRzLgogKi8KYWJzdHJhY3QgY2xhc3MgRXZlbnRTaW5rPFQ+IGltcGxlbWVudHMgU2luazxUPiB7CiAgLyoqCiAgICogQWRkcyBhIGRhdGEgW2V2ZW50XSB0byB0aGUgc2luay4KICAgKgogICAqIE11c3Qgbm90IGJlIGNhbGxlZCBvbiBhIGNsb3NlZCBzaW5rLgogICAqLwogIHZvaWQgYWRkKFQgZXZlbnQpOwoKICAvKioKICAgKiBBZGRzIGFuIFtlcnJvcl0gdG8gdGhlIHNpbmsuCiAgICoKICAgKiBNdXN0IG5vdCBiZSBjYWxsZWQgb24gYSBjbG9zZWQgc2luay4KICAgKi8KICB2b2lkIGFkZEVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pOwoKICAvKioKICAgKiBDbG9zZXMgdGhlIHNpbmsuCiAgICoKICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIG1vcmUgdGhhbiBvbmNlIGlzIGFsbG93ZWQsIGJ1dCBkb2VzIG5vdGhpbmcuCiAgICoKICAgKiBOZWl0aGVyIFthZGRdIG5vciBbYWRkRXJyb3JdIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoaXMgbWV0aG9kLgogICAqLwogIHZvaWQgY2xvc2UoKTsKfQoKLyoqIFtTdHJlYW1dIHdyYXBwZXIgdGhhdCBvbmx5IGV4cG9zZXMgdGhlIFtTdHJlYW1dIGludGVyZmFjZS4gKi8KY2xhc3MgU3RyZWFtVmlldzxUPiBleHRlbmRzIFN0cmVhbTxUPiB7CiAgZmluYWwgU3RyZWFtPFQ+IF9zdHJlYW07CgogIGNvbnN0IFN0cmVhbVZpZXcoU3RyZWFtPFQ+IHN0cmVhbSkKICAgICAgOiBfc3RyZWFtID0gc3RyZWFtLAogICAgICAgIHN1cGVyLl9pbnRlcm5hbCgpOwoKICBib29sIGdldCBpc0Jyb2FkY2FzdCA9PiBfc3RyZWFtLmlzQnJvYWRjYXN0OwoKICBTdHJlYW08VD4gYXNCcm9hZGNhc3RTdHJlYW0oCiAgICAgICAgICB7dm9pZCBvbkxpc3RlbihTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSwKICAgICAgICAgIHZvaWQgb25DYW5jZWwoU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbil9KSA9PgogICAgICBfc3RyZWFtLmFzQnJvYWRjYXN0U3RyZWFtKG9uTGlzdGVuOiBvbkxpc3Rlbiwgb25DYW5jZWw6IG9uQ2FuY2VsKTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IGxpc3Rlbih2b2lkIG9uRGF0YShUIHZhbHVlKSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIHJldHVybiBfc3RyZWFtLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KfQoKLyoqCiAqIEFic3RyYWN0IGludGVyZmFjZSBmb3IgYSAic2luayIgYWNjZXB0aW5nIG11bHRpcGxlIGVudGlyZSBzdHJlYW1zLgogKgogKiBBIGNvbnN1bWVyIGNhbiBhY2NlcHQgYSBudW1iZXIgb2YgY29uc2VjdXRpdmUgc3RyZWFtcyB1c2luZyBbYWRkU3RyZWFtXSwKICogYW5kIHdoZW4gbm8gZnVydGhlciBkYXRhIG5lZWQgdG8gYmUgYWRkZWQsIHRoZSBbY2xvc2VdIG1ldGhvZCB0ZWxscyB0aGUKICogY29uc3VtZXIgdG8gY29tcGxldGUgaXRzIHdvcmsgYW5kIHNodXQgZG93bi4KICoKICogVGhlIFtTdHJlYW0ucGlwZV0gYWNjZXB0cyBhIGBTdHJlYW1Db25zdW1lcmAgYW5kIHdpbGwgcGFzcyB0aGUgc3RyZWFtCiAqIHRvIHRoZSBjb25zdW1lcidzIFthZGRTdHJlYW1dIG1ldGhvZC4gV2hlbiB0aGF0IGNvbXBsZXRlcywgaXQgd2lsbAogKiBjYWxsIFtjbG9zZV0gYW5kIHRoZW4gY29tcGxldGUgaXRzIG93biByZXR1cm5lZCBmdXR1cmUuCiAqLwphYnN0cmFjdCBjbGFzcyBTdHJlYW1Db25zdW1lcjxTPiB7CiAgLyoqCiAgICogQ29uc3VtZXMgdGhlIGVsZW1lbnRzIG9mIFtzdHJlYW1dLgogICAqCiAgICogTGlzdGVucyBvbiBbc3RyZWFtXSBhbmQgZG9lcyBzb21ldGhpbmcgZm9yIGVhY2ggZXZlbnQuCiAgICoKICAgKiBSZXR1cm5zIGEgZnV0dXJlIHdoaWNoIGlzIGNvbXBsZXRlZCB3aGVuIHRoZSBzdHJlYW0gaXMgZG9uZSBiZWluZyBhZGRlZCwKICAgKiBhbmQgdGhlIGNvbnN1bWVyIGlzIHJlYWR5IHRvIGFjY2VwdCBhIG5ldyBzdHJlYW0uCiAgICogTm8gZnVydGhlciBjYWxscyB0byBbYWRkU3RyZWFtXSBvciBbY2xvc2VdIHNob3VsZCBoYXBwZW4gYmVmb3JlIHRoZQogICAqIHJldHVybmVkIGZ1dHVyZSBoYXMgY29tcGxldGVkLgogICAqCiAgICogVGhlIGNvbnN1bWVyIG1heSBzdG9wIGxpc3RlbmluZyB0byB0aGUgc3RyZWFtIGFmdGVyIGFuIGVycm9yLAogICAqIGl0IG1heSBjb25zdW1lIGFsbCB0aGUgZXJyb3JzIGFuZCBvbmx5IHN0b3AgYXQgYSBkb25lIGV2ZW50LAogICAqIG9yIGl0IG1heSBiZSBjYW5jZWxlZCBlYXJseSBpZiB0aGUgcmVjZWl2ZXIgZG9uJ3Qgd2FudCBhbnkgZnVydGhlciBldmVudHMuCiAgICoKICAgKiBJZiB0aGUgY29uc3VtZXIgc3RvcHMgbGlzdGVuaW5nIGJlY2F1c2Ugb2Ygc29tZSBlcnJvciBwcmV2ZW50aW5nIGl0CiAgICogZnJvbSBjb250aW51aW5nLCBpdCBtYXkgcmVwb3J0IHRoaXMgZXJyb3IgaW4gdGhlIHJldHVybmVkIGZ1dHVyZSwKICAgKiBvdGhlcndpc2UgaXQgd2lsbCBqdXN0IGNvbXBsZXRlIHRoZSBmdXR1cmUgd2l0aCBgbnVsbGAuCiAgICovCiAgRnV0dXJlIGFkZFN0cmVhbShTdHJlYW08Uz4gc3RyZWFtKTsKCiAgLyoqCiAgICogVGVsbHMgdGhlIGNvbnN1bWVyIHRoYXQgbm8gZnVydGhlciBzdHJlYW1zIHdpbGwgYmUgYWRkZWQuCiAgICoKICAgKiBUaGlzIGFsbG93cyB0aGUgY29uc3VtZXIgdG8gY29tcGxldGUgYW55IHJlbWFpbmluZyB3b3JrIGFuZCByZWxlYXNlCiAgICogcmVzb3VyY2VzIHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQKICAgKgogICAqIFJldHVybnMgYSBmdXR1cmUgd2hpY2ggaXMgY29tcGxldGVkIHdoZW4gdGhlIGNvbnN1bWVyIGhhcyBzaHV0IGRvd24uCiAgICogSWYgY2xlYW5pbmcgdXAgY2FuIGZhaWwsIHRoZSBlcnJvciBtYXkgYmUgcmVwb3J0ZWQgaW4gdGhlIHJldHVybmVkIGZ1dHVyZSwKICAgKiBvdGhlcndpc2UgaXQgY29tcGxldGVzIHdpdGggYG51bGxgLgogICAqLwogIEZ1dHVyZSBjbG9zZSgpOwp9CgovKioKICogQSBvYmplY3QgdGhhdCBhY2NlcHRzIHN0cmVhbSBldmVudHMgYm90aCBzeW5jaHJvbm91c2x5IGFuZCBhc3luY2hyb25vdXNseS4KICoKICogQSBbU3RyZWFtU2lua10gY29tYmluZXMgdGhlIG1ldGhvZHMgZnJvbSBbU3RyZWFtQ29uc3VtZXJdIGFuZCBbRXZlbnRTaW5rXS4KICoKICogVGhlIFtFdmVudFNpbmtdIG1ldGhvZHMgY2FuJ3QgYmUgdXNlZCB3aGlsZSB0aGUgW2FkZFN0cmVhbV0gaXMgY2FsbGVkLgogKiBBcyBzb29uIGFzIHRoZSBbYWRkU3RyZWFtXSdzIFtGdXR1cmVdIGNvbXBsZXRlcyB3aXRoIGEgdmFsdWUsIHRoZQogKiBbRXZlbnRTaW5rXSBtZXRob2RzIGNhbiBiZSB1c2VkIGFnYWluLgogKgogKiBJZiBbYWRkU3RyZWFtXSBpcyBjYWxsZWQgYWZ0ZXIgYW55IG9mIHRoZSBbRXZlbnRTaW5rXSBtZXRob2RzLCBpdCdsbAogKiBiZSBkZWxheWVkIHVudGlsIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBoYXMgY29uc3VtZWQgdGhlIGRhdGEgYWRkZWQgYnkgdGhlCiAqIFtFdmVudFNpbmtdIG1ldGhvZHMuCiAqCiAqIFdoZW4gW0V2ZW50U2lua10gbWV0aG9kcyBhcmUgdXNlZCwgdGhlIFtkb25lXSBbRnV0dXJlXSBjYW4gYmUgdXNlZCB0bwogKiBjYXRjaCBhbnkgZXJyb3JzLgogKgogKiBXaGVuIFtjbG9zZV0gaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiB0aGUgW2RvbmVdIFtGdXR1cmVdLgogKi8KYWJzdHJhY3QgY2xhc3MgU3RyZWFtU2luazxTPiBpbXBsZW1lbnRzIEV2ZW50U2luazxTPiwgU3RyZWFtQ29uc3VtZXI8Uz4gewogIC8qKgogICAqIFRlbGxzIHRoZSBzdHJlYW0gc2luayB0aGF0IG5vIGZ1cnRoZXIgc3RyZWFtcyB3aWxsIGJlIGFkZGVkLgogICAqCiAgICogVGhpcyBhbGxvd3MgdGhlIHN0cmVhbSBzaW5rIHRvIGNvbXBsZXRlIGFueSByZW1haW5pbmcgd29yayBhbmQgcmVsZWFzZQogICAqIHJlc291cmNlcyB0aGF0IGFyZSBubyBsb25nZXIgbmVlZGVkCiAgICoKICAgKiBSZXR1cm5zIGEgZnV0dXJlIHdoaWNoIGlzIGNvbXBsZXRlZCB3aGVuIHRoZSBzdHJlYW0gc2luayBoYXMgc2h1dCBkb3duLgogICAqIElmIGNsZWFuaW5nIHVwIGNhbiBmYWlsLCB0aGUgZXJyb3IgbWF5IGJlIHJlcG9ydGVkIGluIHRoZSByZXR1cm5lZCBmdXR1cmUsCiAgICogb3RoZXJ3aXNlIGl0IGNvbXBsZXRlcyB3aXRoIGBudWxsYC4KICAgKgogICAqIFJldHVybnMgdGhlIHNhbWUgZnV0dXJlIGFzIFtkb25lXS4KICAgKgogICAqIFRoZSBzdHJlYW0gc2luayBtYXkgY2xvc2UgYmVmb3JlIHRoZSBbY2xvc2VdIG1ldGhvZCBpcyBjYWxsZWQsIGVpdGhlciBkdWUKICAgKiB0byBhbiBlcnJvciBvciBiZWNhdXNlIGl0IGlzIGl0c2VsZiBwcm92aWRpbmcgZXZlbnRzIHRvIHNvbWVvbmUgd2hvIGhhcwogICAqIHN0b3BwZWQgbGlzdGVuaW5nLiBJbiB0aGF0IGNhc2UsIHRoZSBbZG9uZV0gZnV0dXJlIGlzIGNvbXBsZXRlZCBmaXJzdCwKICAgKiBhbmQgdGhlIGBjbG9zZWAgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBgZG9uZWAgZnV0dXJlIHdoZW4gY2FsbGVkLgogICAqCiAgICogVW5pZmllcyBbU3RyZWFtQ29uc3VtZXIuY2xvc2VdIGFuZCBbRXZlbnRTaW5rLmNsb3NlXSB3aGljaCBib3RoIG1hcmsgdGhlaXIKICAgKiBvYmplY3QgYXMgbm90IGV4cGVjdGluZyBhbnkgZnVydGhlciBldmVudHMuCiAgICovCiAgRnV0dXJlIGNsb3NlKCk7CgogIC8qKgogICAqIFJldHVybiBhIGZ1dHVyZSB3aGljaCBpcyBjb21wbGV0ZWQgd2hlbiB0aGUgW1N0cmVhbVNpbmtdIGlzIGZpbmlzaGVkLgogICAqCiAgICogSWYgdGhlIGBTdHJlYW1TaW5rYCBmYWlscyB3aXRoIGFuIGVycm9yLAogICAqIHBlcmhhcHMgaW4gcmVzcG9uc2UgdG8gYWRkaW5nIGV2ZW50cyB1c2luZyBbYWRkXSwgW2FkZEVycm9yXSBvciBbY2xvc2VdLAogICAqIHRoZSBbZG9uZV0gZnV0dXJlIHdpbGwgY29tcGxldGUgd2l0aCB0aGF0IGVycm9yLgogICAqCiAgICogT3RoZXJ3aXNlLCB0aGUgcmV0dXJuZWQgZnV0dXJlIHdpbGwgY29tcGxldGUgd2hlbiBlaXRoZXI6CiAgICoKICAgKiAqIGFsbCBldmVudHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBhbmQgdGhlIHNpbmsgaGFzIGJlZW4gY2xvc2VkLCBvcgogICAqICogdGhlIHNpbmsgaGFzIG90aGVyd2lzZSBiZWVuIHN0b3BwZWQgZnJvbSBoYW5kbGluZyBtb3JlIGV2ZW50cwogICAqICAgKGZvciBleGFtcGxlIGJ5IGNhbmNlbGluZyBhIHN0cmVhbSBzdWJzY3JpcHRpb24pLgogICAqLwogIEZ1dHVyZSBnZXQgZG9uZTsKfQoKLyoqCiAqIFRyYW5zZm9ybXMgYSBTdHJlYW0uCiAqCiAqIFdoZW4gYSBzdHJlYW0ncyBbU3RyZWFtLnRyYW5zZm9ybV0gbWV0aG9kIGlzIGludm9rZWQgd2l0aCBhCiAqIFtTdHJlYW1UcmFuc2Zvcm1lcl0sIHRoZSBzdHJlYW0gY2FsbHMgdGhlIFtiaW5kXSBtZXRob2Qgb24gdGhlIHByb3ZpZGVkCiAqIHRyYW5zZm9ybWVyLiBUaGUgcmVzdWx0aW5nIHN0cmVhbSBpcyB0aGVuIHJldHVybmVkIGZyb20gdGhlCiAqIFtTdHJlYW0udHJhbnNmb3JtXSBtZXRob2QuCiAqCiAqIENvbmNlcHR1YWxseSwgYSB0cmFuc2Zvcm1lciBpcyBzaW1wbHkgYSBmdW5jdGlvbiBmcm9tIFtTdHJlYW1dIHRvIFtTdHJlYW1dCiAqIHRoYXQgaXMgZW5jYXBzdWxhdGVkIGludG8gYSBjbGFzcy4KICoKICogSXQgaXMgZ29vZCBwcmFjdGljZSB0byB3cml0ZSB0cmFuc2Zvcm1lcnMgdGhhdCBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcy4KICoKICogQWxsIG90aGVyIHRyYW5zZm9ybWluZyBtZXRob2RzIG9uIFtTdHJlYW1dLCBzdWNoIGFzIFtTdHJlYW0ubWFwXSwKICogW1N0cmVhbS53aGVyZV0gb3IgW1N0cmVhbS5leHBhbmRdIGNhbiBiZSBpbXBsZW1lbnRlZCB1c2luZwogKiBbU3RyZWFtLnRyYW5zZm9ybV0uIEEgW1N0cmVhbVRyYW5zZm9ybWVyXSBpcyB0aHVzIHZlcnkgcG93ZXJmdWwgYnV0IG9mdGVuCiAqIGFsc28gYSBiaXQgbW9yZSBjb21wbGljYXRlZCB0byB1c2UuCiAqLwphYnN0cmFjdCBjbGFzcyBTdHJlYW1UcmFuc2Zvcm1lcjxTLCBUPiB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIFtTdHJlYW1UcmFuc2Zvcm1lcl0gYmFzZWQgb24gdGhlIGdpdmVuIFtvbkxpc3Rlbl0gY2FsbGJhY2suCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIHRyYW5zZm9ybWVyIHVzZXMgdGhlIHByb3ZpZGVkIFtvbkxpc3Rlbl0gY2FsbGJhY2sKICAgKiB3aGVuIGEgdHJhbnNmb3JtZWQgc3RyZWFtIGlzIGxpc3RlbmVkIHRvLiBBdCB0aGF0IHRpbWUsIHRoZSBjYWxsYmFjawogICAqIHJlY2VpdmVzIHRoZSBpbnB1dCBzdHJlYW0gKHRoZSBvbmUgcGFzc2VkIHRvIFtiaW5kXSkgYW5kIGEKICAgKiBib29sZWFuIGZsYWcgYGNhbmNlbE9uRXJyb3JgIHRvIGNyZWF0ZSBhIFtTdHJlYW1TdWJzY3JpcHRpb25dLgogICAqCiAgICogSWYgdGhlIHRyYW5zZm9ybWVkIHN0cmVhbSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0sIHNvIGlzIHRoZSBzdHJlYW0KICAgKiByZXR1cm5lZCBieSB0aGUgW1N0cmVhbVRyYW5zZm9ybWVyLmJpbmRdIG1ldGhvZCBieSB0aGlzIHRyYW5zZm9ybWVyLgogICAqCiAgICogSWYgdGhlIHRyYW5zZm9ybWVkIHN0cmVhbSBpcyBsaXN0ZW5lZCB0byBtdWx0aXBsZSB0aW1lcywgdGhlIFtvbkxpc3Rlbl0KICAgKiBjYWxsYmFjayBpcyBjYWxsZWQgYWdhaW4gZm9yIGVhY2ggbmV3IFtTdHJlYW0ubGlzdGVuXSBjYWxsLgogICAqIFRoaXMgaGFwcGVucyB3aGV0aGVyIHRoZSBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIG9yIG5vdCwKICAgKiBidXQgdGhlIGNhbGwgd2lsbCB1c3VhbGx5IGZhaWwgZm9yIG5vbi1icm9hZGNhc3Qgc3RyZWFtcy4KICAgKgogICAqIFRoZSBbb25MaXN0ZW5dIGNhbGxiYWNrIGRvZXMgKm5vdCogcmVjZWl2ZSB0aGUgaGFuZGxlcnMgdGhhdCB3ZXJlIHBhc3NlZAogICAqIHRvIFtTdHJlYW0ubGlzdGVuXS4gVGhlc2UgYXJlIGF1dG9tYXRpY2FsbHkgc2V0IGFmdGVyIHRoZSBjYWxsIHRvIHRoZQogICAqIFtvbkxpc3Rlbl0gY2FsbGJhY2sgKHVzaW5nIFtTdHJlYW1TdWJzY3JpcHRpb24ub25EYXRhXSwKICAgKiBbU3RyZWFtU3Vic2NyaXB0aW9uLm9uRXJyb3JdIGFuZCBbU3RyZWFtU3Vic2NyaXB0aW9uLm9uRG9uZV0pLgogICAqCiAgICogTW9zdCBjb21tb25seSwgYW4gW29uTGlzdGVuXSBjYWxsYmFjayB3aWxsIGZpcnN0IGNhbGwgW1N0cmVhbS5saXN0ZW5dIG9uCiAgICogdGhlIHByb3ZpZGVkIHN0cmVhbSAod2l0aCB0aGUgY29ycmVzcG9uZGluZyBgY2FuY2VsT25FcnJvcmAgZmxhZyksIGFuZCB0aGVuCiAgICogcmV0dXJuIGEgbmV3IFtTdHJlYW1TdWJzY3JpcHRpb25dLgogICAqCiAgICogVGhlcmUgYXJlIHR3byBjb21tb24gd2F5cyB0byBjcmVhdGUgYSBTdHJlYW1TdWJzY3JpcHRpb246CiAgICoKICAgKiAxLiBieSBhbGxvY2F0aW5nIGEgW1N0cmVhbUNvbnRyb2xsZXJdIGFuZCB0byByZXR1cm4gdGhlIHJlc3VsdCBvZgogICAqICAgIGxpc3RlbmluZyB0byBpdHMgc3RyZWFtLiBJdCdzIGltcG9ydGFudCB0byBmb3J3YXJkIHBhdXNlLCByZXN1bWUgYW5kCiAgICogICAgY2FuY2VsIGV2ZW50cyAodW5sZXNzIHRoZSB0cmFuc2Zvcm1lciBpbnRlbnRpb25hbGx5IHdhbnRzIHRvIGNoYW5nZQogICAqICAgIHRoaXMgYmVoYXZpb3IpLgogICAqIDIuIGJ5IGNyZWF0aW5nIGEgbmV3IGNsYXNzIHRoYXQgaW1wbGVtZW50cyBbU3RyZWFtU3Vic2NyaXB0aW9uXS4KICAgKiAgICBOb3RlIHRoYXQgdGhlIHN1YnNjcmlwdGlvbiBzaG91bGQgcnVuIGNhbGxiYWNrcyBpbiB0aGUgW1pvbmVdIHRoZQogICAqICAgIHN0cmVhbSB3YXMgbGlzdGVuZWQgdG8gKHNlZSBbWm9uZV0gYW5kIFtab25lLmJpbmRDYWxsYmFja10pLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYAogICAqIC8vLyBTdGFydHMgbGlzdGVuaW5nIHRvIFtpbnB1dF0gYW5kIGR1cGxpY2F0ZXMgYWxsIG5vbi1lcnJvciBldmVudHMuCiAgICogU3RyZWFtU3Vic2NyaXB0aW9uPGludD4gX29uTGlzdGVuKFN0cmVhbTxpbnQ+IGlucHV0LCBib29sIGNhbmNlbE9uRXJyb3IpIHsKICAgKiAgIFN0cmVhbVN1YnNjcmlwdGlvbjxTdHJpbmc+IHN1YnNjcmlwdGlvbjsKICAgKiAgIC8vIENyZWF0ZSBjb250cm9sbGVyIHRoYXQgZm9yd2FyZHMgcGF1c2UsIHJlc3VtZSBhbmQgY2FuY2VsIGV2ZW50cy4KICAgKiAgIHZhciBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8U3RyaW5nPigKICAgKiAgICAgICBvblBhdXNlOiAoKSB7CiAgICogICAgICAgICBzdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgKiAgICAgICB9LAogICAqICAgICAgIG9uUmVzdW1lOiAoKSB7CiAgICogICAgICAgICBzdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICogICAgICAgfSwKICAgKiAgICAgICBvbkNhbmNlbDogKCkgPT4gc3Vic2NyaXB0aW9uLmNhbmNlbCgpLAogICAqICAgICAgIHN5bmM6IHRydWUpOyAvLyAic3luYyIgaXMgY29ycmVjdCBoZXJlLCBzaW5jZSBldmVudHMgYXJlIGZvcndhcmRlZC4KICAgKgogICAqICAgLy8gTGlzdGVuIHRvIHRoZSBwcm92aWRlZCBzdHJlYW0gdXNpbmcgYGNhbmNlbE9uRXJyb3JgLgogICAqICAgc3Vic2NyaXB0aW9uID0gaW5wdXQubGlzdGVuKChkYXRhKSB7CiAgICogICAgIC8vIER1cGxpY2F0ZSB0aGUgZGF0YS4KICAgKiAgICAgY29udHJvbGxlci5hZGQoZGF0YSk7CiAgICogICAgIGNvbnRyb2xsZXIuYWRkKGRhdGEpOwogICAqICAgfSwKICAgKiAgICAgICBvbkVycm9yOiBjb250cm9sbGVyLmFkZEVycm9yLAogICAqICAgICAgIG9uRG9uZTogY29udHJvbGxlci5jbG9zZSwKICAgKiAgICAgICBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICAgKgogICAqICAgLy8gUmV0dXJuIGEgbmV3IFtTdHJlYW1TdWJzY3JpcHRpb25dIGJ5IGxpc3RlbmluZyB0byB0aGUgY29udHJvbGxlcidzCiAgICogICAvLyBzdHJlYW0uCiAgICogICByZXR1cm4gY29udHJvbGxlci5zdHJlYW0ubGlzdGVuKG51bGwpOwogICAqIH0KICAgKgogICAqIC8vIEluc3RhbnRpYXRlIGEgdHJhbnNmb3JtZXI6CiAgICogdmFyIGR1cGxpY2F0b3IgPSBjb25zdCBTdHJlYW1UcmFuc2Zvcm1lcjxpbnQsIGludD4oX29uTGlzdGVuKTsKICAgKgogICAqIC8vIFVzZSBhcyBmb2xsb3dzOgogICAqIGludFN0cmVhbS50cmFuc2Zvcm0oZHVwbGljYXRvcik7CiAgICogYGBgCiAgICovCiAgY29uc3QgZmFjdG9yeSBTdHJlYW1UcmFuc2Zvcm1lcigKICAgICAgICAgIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBvbkxpc3RlbigKICAgICAgICAgICAgICBTdHJlYW08Uz4gc3RyZWFtLCBib29sIGNhbmNlbE9uRXJyb3IpKSA9CiAgICAgIF9TdHJlYW1TdWJzY3JpcHRpb25UcmFuc2Zvcm1lcjxTLCBUPjsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtTdHJlYW1UcmFuc2Zvcm1lcl0gdGhhdCBkZWxlZ2F0ZXMgZXZlbnRzIHRvIHRoZSBnaXZlbiBmdW5jdGlvbnMuCiAgICoKICAgKiBFeGFtcGxlIHVzZSBvZiBhIGR1cGxpY2F0aW5nIHRyYW5zZm9ybWVyOgogICAqCiAgICogYGBgCiAgICogc3RyaW5nU3RyZWFtLnRyYW5zZm9ybShuZXcgU3RyZWFtVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+LmZyb21IYW5kbGVycygKICAgKiAgICAgaGFuZGxlRGF0YTogKFN0cmluZyB2YWx1ZSwgRXZlbnRTaW5rPFN0cmluZz4gc2luaykgewogICAqICAgICAgIHNpbmsuYWRkKHZhbHVlKTsKICAgKiAgICAgICBzaW5rLmFkZCh2YWx1ZSk7ICAvLyBEdXBsaWNhdGUgdGhlIGluY29taW5nIGV2ZW50cy4KICAgKiAgICAgfSkpOwogICAqIGBgYAogICAqCiAgICogVHJhbnNmb3JtZXJzIHRoYXQgYXJlIGNvbnN0cnVjdGVkIHRoaXMgd2F5IGNhbm5vdCB1c2UgY2FwdHVyZWQgc3RhdGUgaWYKICAgKiB0aGV5IGFyZSB1c2VkIGluIHN0cmVhbXMgdGhhdCBjYW4gYmUgbGlzdGVuZWQgdG8gbXVsdGlwbGUgdGltZXMuCiAgICogYGBgCiAgICogU3RyZWFtQ29udHJvbGxlcjxTdHJpbmc+IGNvbnRyb2xsZXI7CiAgICogY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdChvbkxpc3RlbjogKCkgewogICAqICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAqICAgICBjb250cm9sbGVyLmFkZEVycm9yKCJCYWQiKTsKICAgKiAgICAgY29udHJvbGxlci5hZGRFcnJvcigiV29yc2UiKTsKICAgKiAgICAgY29udHJvbGxlci5hZGRFcnJvcigiV29yc3QiKTsKICAgKiAgIH0pOwogICAqIH0pOwogICAqIHZhciBzaGFyZWRTdGF0ZSA9IDA7CiAgICogdmFyIHRyYW5zZm9ybWVkU3RyZWFtID0gY29udHJvbGxlci5zdHJlYW0udHJhbnNmb3JtKAogICAqICAgICBuZXcgU3RyZWFtVHJhbnNmb3JtZXI8U3RyaW5nPi5mcm9tSGFuZGxlcnMoCiAgICogICAgICAgICBoYW5kbGVFcnJvcjogKGVycm9yLCBzdGFja1RyYWNlLCBzaW5rKSB7CiAgICogICBzaGFyZWRTdGF0ZSsrOyAvLyBJbmNyZW1lbnQgc2hhcmVkIGVycm9yLWNvdW50ZXIuCiAgICogICBzaW5rLmFkZCgiRXJyb3IgJHNoYXJlZFN0YXRlOiAkZXJyb3IiKTsKICAgKiB9KSk7CiAgICoKICAgKiB0cmFuc2Zvcm1lZFN0cmVhbS5saXN0ZW4ocHJpbnQpOwogICAqIHRyYW5zZm9ybWVkU3RyZWFtLmxpc3RlbihwcmludCk7IC8vIExpc3RlbiB0d2ljZS4KICAgKiAvLyBMaXN0ZW5pbmcgdHdpY2UgdG8gdGhlIHNhbWUgc3RyZWFtIG1ha2VzIHRoZSB0cmFuc2Zvcm1lciBzaGFyZSB0aGUgc2FtZQogICAqIC8vIHN0YXRlLiBJbnN0ZWFkIG9mIGhhdmluZyAiRXJyb3IgMTogQmFkIiwgIkVycm9yIDI6IFdvcnNlIiwKICAgKiAvLyAiRXJyb3IgMzogV29yc3QiIGFzIG91dHB1dCAoZWFjaCB0d2ljZSBmb3IgdGhlIHNlcGFyYXRlIHN1YnNjcmlwdGlvbnMpLAogICAqIC8vIHRoaXMgcHJvZ3JhbSBlbWl0czoKICAgKiAvLyBFcnJvciAxOiBCYWQKICAgKiAvLyBFcnJvciAyOiBCYWQKICAgKiAvLyBFcnJvciAzOiBXb3JzZQogICAqIC8vIEVycm9yIDQ6IFdvcnNlCiAgICogLy8gRXJyb3IgNTogV29yc3QKICAgKiAvLyBFcnJvciA2OiBXb3JzdAogICAqIGBgYAogICAqLwogIGZhY3RvcnkgU3RyZWFtVHJhbnNmb3JtZXIuZnJvbUhhbmRsZXJzKAogICAgICB7dm9pZCBoYW5kbGVEYXRhKFMgZGF0YSwgRXZlbnRTaW5rPFQ+IHNpbmspLAogICAgICB2b2lkIGhhbmRsZUVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlLCBFdmVudFNpbms8VD4gc2luayksCiAgICAgIHZvaWQgaGFuZGxlRG9uZShFdmVudFNpbms8VD4gc2luayl9KSA9IF9TdHJlYW1IYW5kbGVyVHJhbnNmb3JtZXI8UywgVD47CgogIC8qKgogICAqIENyZWF0ZXMgYSBbU3RyZWFtVHJhbnNmb3JtZXJdIGJhc2VkIG9uIGEgW2JpbmRdIGNhbGxiYWNrLgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSB0cmFuc2Zvcm1lciB1c2VzIHRoZSBbYmluZF0gYXJndW1lbnQgdG8gaW1wbGVtZW50IHRoZQogICAqIFtTdHJlYW1UcmFuc2Zvcm1lci5iaW5kXSBBUEkgYW5kIGNhbiBiZSB1c2VkIHdoZW4gdGhlIHRyYW5zZm9ybWF0aW9uIGlzCiAgICogYXZhaWxhYmxlIGFzIGEgc3RyZWFtLXRvLXN0cmVhbSBmdW5jdGlvbi4KICAgKgogICAqIGBgYGRhcnQKICAgKiBmaW5hbCBzcGxpdERlY29kZWQgPSBTdHJlYW1UcmFuc2Zvcm1lcjxMaXN0PGludD4sIFN0cmluZz4uZnJvbUJpbmQoCiAgICogICAgIChzdHJlYW0pID0+IHN0cmVhbS50cmFuc2Zvcm0odXRmOC5kZWNvZGVyKS50cmFuc2Zvcm0oTGluZVNwbGl0dGVyKCkpKTsKICAgKiBgYGAKICAgKi8KICBAU2luY2UoIjIuMSIpCiAgZmFjdG9yeSBTdHJlYW1UcmFuc2Zvcm1lci5mcm9tQmluZChTdHJlYW08VD4gRnVuY3Rpb24oU3RyZWFtPFM+KSBiaW5kKSA9CiAgICAgIF9TdHJlYW1CaW5kVHJhbnNmb3JtZXI8UywgVD47CgogIC8qKgogICAqIEFkYXB0cyBbc291cmNlXSB0byBiZSBhIGBTdHJlYW1UcmFuc2Zvcm1lcjxUUywgVFQ+YC4KICAgKgogICAqIFRoaXMgYWxsb3dzIFtzb3VyY2VdIHRvIGJlIHVzZWQgYXQgdGhlIG5ldyB0eXBlLCBidXQgYXQgcnVuLXRpbWUgaXQKICAgKiBtdXN0IHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvZiBib3RoIHRoZSBuZXcgdHlwZSBhbmQgaXRzIG9yaWdpbmFsIHR5cGUuCiAgICoKICAgKiBEYXRhIGV2ZW50cyBwYXNzZWQgaW50byB0aGUgcmV0dXJuZWQgdHJhbnNmb3JtZXIgbXVzdCBhbHNvIGJlIGluc3RhbmNlcwogICAqIG9mIFtTU10sIGFuZCBkYXRhIGV2ZW50cyBwcm9kdWNlZCBieSBbc291cmNlXSBmb3IgdGhvc2UgZXZlbnRzIG11c3QKICAgKiBhbHNvIGJlIGluc3RhbmNlcyBvZiBbVFRdLgogICAqLwogIHN0YXRpYyBTdHJlYW1UcmFuc2Zvcm1lcjxUUywgVFQ+IGNhc3RGcm9tPFNTLCBTVCwgVFMsIFRUPigKICAgICAgU3RyZWFtVHJhbnNmb3JtZXI8U1MsIFNUPiBzb3VyY2UpIHsKICAgIHJldHVybiBuZXcgQ2FzdFN0cmVhbVRyYW5zZm9ybWVyPFNTLCBTVCwgVFMsIFRUPihzb3VyY2UpOwogIH0KCiAgLyoqCiAgICogVHJhbnNmb3JtcyB0aGUgcHJvdmlkZWQgW3N0cmVhbV0uCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IHN0cmVhbSB3aXRoIGV2ZW50cyB0aGF0IGFyZSBjb21wdXRlZCBmcm9tIGV2ZW50cyBvZiB0aGUKICAgKiBwcm92aWRlZCBbc3RyZWFtXS4KICAgKgogICAqIFRoZSBbU3RyZWFtVHJhbnNmb3JtZXJdIGludGVyZmFjZSBpcyBjb21wbGV0ZWx5IGdlbmVyaWMsCiAgICogc28gaXQgY2Fubm90IHNheSB3aGF0IHN1YmNsYXNzZXMgZG8uCiAgICogRWFjaCBbU3RyZWFtVHJhbnNmb3JtZXJdIHNob3VsZCBkb2N1bWVudCBjbGVhcmx5IGhvdyBpdCB0cmFuc2Zvcm1zIHRoZQogICAqIHN0cmVhbSAob24gdGhlIGNsYXNzIG9yIHZhcmlhYmxlIHVzZWQgdG8gYWNjZXNzIHRoZSB0cmFuc2Zvcm1lciksCiAgICogYXMgd2VsbCBhcyBhbnkgZGlmZmVyZW5jZXMgZnJvbSB0aGUgZm9sbG93aW5nIHR5cGljYWwgYmVoYXZpb3I6CiAgICoKICAgKiAqIFdoZW4gdGhlIHJldHVybmVkIHN0cmVhbSBpcyBsaXN0ZW5lZCB0bywgaXQgc3RhcnRzIGxpc3RlbmluZyB0byB0aGUKICAgKiAgIGlucHV0IFtzdHJlYW1dLgogICAqICogU3Vic2NyaXB0aW9ucyBvZiB0aGUgcmV0dXJuZWQgc3RyZWFtIGZvcndhcmQgKGluIGEgcmVhc29uYWJsZSB0aW1lKQogICAqICAgYSBbU3RyZWFtU3Vic2NyaXB0aW9uLnBhdXNlXSBjYWxsIHRvIHRoZSBzdWJzY3JpcHRpb24gb2YgdGhlIGlucHV0CiAgICogICBbc3RyZWFtXS4KICAgKiAqIFNpbWlsYXJseSwgY2FuY2VsaW5nIGEgc3Vic2NyaXB0aW9uIG9mIHRoZSByZXR1cm5lZCBzdHJlYW0gZXZlbnR1YWxseQogICAqICAgKGluIHJlYXNvbmFibGUgdGltZSkgY2FuY2VscyB0aGUgc3Vic2NyaXB0aW9uIG9mIHRoZSBpbnB1dCBbc3RyZWFtXS4KICAgKgogICAqICJSZWFzb25hYmxlIHRpbWUiIGRlcGVuZHMgb24gdGhlIHRyYW5zZm9ybWVyIGFuZCBzdHJlYW0uIFNvbWUgdHJhbnNmb3JtZXJzLAogICAqIGxpa2UgYSAidGltZW91dCIgdHJhbnNmb3JtZXIsIG1pZ2h0IG1ha2UgdGhlc2Ugb3BlcmF0aW9ucyBkZXBlbmQgb24gYQogICAqIGR1cmF0aW9uLiBPdGhlcnMgbWlnaHQgbm90IGRlbGF5IHRoZW0gYXQgYWxsLCBvciBqdXN0IGJ5IGEgbWljcm90YXNrLgogICAqCiAgICogVHJhbnNmb3JtZXJzIGFyZSBmcmVlIHRvIGhhbmRsZSBlcnJvcnMgaW4gYW55IHdheS4KICAgKiBBIHRyYW5zZm9ybWVyIGltcGxlbWVudGF0aW9uIG1heSBjaG9vc2UgdG8gcHJvcGFnYXRlIGVycm9ycywKICAgKiBvciBjb252ZXJ0IHRoZW0gdG8gb3RoZXIgZXZlbnRzLCBvciBpZ25vcmUgdGhlbSBjb21wbGV0ZWx5LAogICAqIGJ1dCBpZiBlcnJvcnMgYXJlIGlnbm9yZWQsIGl0IHNob3VsZCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCiAgICovCiAgU3RyZWFtPFQ+IGJpbmQoU3RyZWFtPFM+IHN0cmVhbSk7CgogIC8qKgogICAqIFByb3ZpZGVzIGEgYFN0cmVhbVRyYW5zZm9ybWVyPFJTLCBSVD5gIHZpZXcgb2YgdGhpcyBzdHJlYW0gdHJhbnNmb3JtZXIuCiAgICoKICAgKiBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVyIHdpbGwgY2hlY2sgYXQgcnVuLXRpbWUgdGhhdCBhbGwgZGF0YSBldmVudHMKICAgKiBvZiB0aGUgc3RyZWFtIGl0IHRyYW5zZm9ybXMgYXJlIGFjdHVhbGx5IGluc3RhbmNlcyBvZiBbU10sCiAgICogYW5kIGl0IHdpbGwgY2hlY2sgdGhhdCBhbGwgZGF0YSBldmVudHMgcHJvZHVjZWQgYnkgdGhpcyB0cmFuc2Zvcm1lcgogICAqIGFyZSBhY3R1YWxseSBpbnN0YW5jZXMgb2YgW1JUXS4KICAgKi8KICBTdHJlYW1UcmFuc2Zvcm1lcjxSUywgUlQ+IGNhc3Q8UlMsIFJUPigpOwp9CgovKioKICogQmFzZSBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIFtTdHJlYW1UcmFuc2Zvcm1lcl0uCiAqCiAqIENvbnRhaW5zIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIGV2ZXJ5IG1ldGhvZCBleGNlcHQgW2JpbmRdLgogKi8KYWJzdHJhY3QgY2xhc3MgU3RyZWFtVHJhbnNmb3JtZXJCYXNlPFMsIFQ+IGltcGxlbWVudHMgU3RyZWFtVHJhbnNmb3JtZXI8UywgVD4gewogIGNvbnN0IFN0cmVhbVRyYW5zZm9ybWVyQmFzZSgpOwoKICBTdHJlYW1UcmFuc2Zvcm1lcjxSUywgUlQ+IGNhc3Q8UlMsIFJUPigpID0+CiAgICAgIFN0cmVhbVRyYW5zZm9ybWVyLmNhc3RGcm9tPFMsIFQsIFJTLCBSVD4odGhpcyk7Cn0KCi8qKgogKiBBbiBbSXRlcmF0b3JdIGxpa2UgaW50ZXJmYWNlIGZvciB0aGUgdmFsdWVzIG9mIGEgW1N0cmVhbV0uCiAqCiAqIFRoaXMgd3JhcHMgYSBbU3RyZWFtXSBhbmQgYSBzdWJzY3JpcHRpb24gb24gdGhlIHN0cmVhbS4gSXQgbGlzdGVucwogKiBvbiB0aGUgc3RyZWFtLCBhbmQgY29tcGxldGVzIHRoZSBmdXR1cmUgcmV0dXJuZWQgYnkgW21vdmVOZXh0XSB3aGVuIHRoZQogKiBuZXh0IHZhbHVlIGJlY29tZXMgYXZhaWxhYmxlLgogKgogKiBUaGUgc3RyZWFtIG1heSBiZSBwYXVzZWQgYmV0d2VlbiBjYWxscyB0byBbbW92ZU5leHRdLgogKi8KYWJzdHJhY3QgY2xhc3MgU3RyZWFtSXRlcmF0b3I8VD4gewogIC8qKiBDcmVhdGUgYSBbU3RyZWFtSXRlcmF0b3JdIG9uIFtzdHJlYW1dLiAqLwogIGZhY3RvcnkgU3RyZWFtSXRlcmF0b3IoU3RyZWFtPFQ+IHN0cmVhbSkKICAgICAgLy8gVE9ETyhscm4pOiB1c2UgcmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvciB3aGVuIHR5cGUKICAgICAgLy8gYXJndW1lbnRzIGFyZSBzdXBwb3J0ZWQuCiAgICAgID0+CiAgICAgIG5ldyBfU3RyZWFtSXRlcmF0b3I8VD4oc3RyZWFtKTsKCiAgLyoqCiAgICogV2FpdCBmb3IgdGhlIG5leHQgc3RyZWFtIHZhbHVlIHRvIGJlIGF2YWlsYWJsZS4KICAgKgogICAqIFJldHVybnMgYSBmdXR1cmUgd2hpY2ggd2lsbCBjb21wbGV0ZSB3aXRoIGVpdGhlciBgdHJ1ZWAgb3IgYGZhbHNlYC4KICAgKiBDb21wbGV0aW5nIHdpdGggYHRydWVgIG1lYW5zIHRoYXQgYW5vdGhlciBldmVudCBoYXMgYmVlbiByZWNlaXZlZCBhbmQKICAgKiBjYW4gYmUgcmVhZCBhcyBbY3VycmVudF0uCiAgICogQ29tcGxldGluZyB3aXRoIGBmYWxzZWAgbWVhbnMgdGhhdCB0aGUgc3RyZWFtIGl0ZXJhdGlvbiBpcyBkb25lIGFuZAogICAqIG5vIGZ1cnRoZXIgZXZlbnRzIHdpbGwgZXZlciBiZSBhdmFpbGFibGUuCiAgICogVGhlIGZ1dHVyZSBtYXkgY29tcGxldGUgd2l0aCBhbiBlcnJvciwgaWYgdGhlIHN0cmVhbSBwcm9kdWNlcyBhbiBlcnJvciwKICAgKiB3aGljaCBhbHNvIGVuZHMgaXRlcmF0aW9uLgogICAqCiAgICogVGhlIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCBhZ2FpbiB1bnRpbCB0aGUgZnV0dXJlIHJldHVybmVkIGJ5IGEKICAgKiBwcmV2aW91cyBjYWxsIGlzIGNvbXBsZXRlZC4KICAgKi8KICBGdXR1cmU8Ym9vbD4gbW92ZU5leHQoKTsKCiAgLyoqCiAgICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0cmVhbS4KICAgKgogICAqIElzIGBudWxsYCBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gW21vdmVOZXh0XSBhbmQgYWZ0ZXIgYSBjYWxsIHRvCiAgICogYG1vdmVOZXh0YCBjb21wbGV0ZXMgd2l0aCBhIGBmYWxzZWAgcmVzdWx0IG9yIGFuIGVycm9yLgogICAqCiAgICogV2hlbiBhIGBtb3ZlTmV4dGAgY2FsbCBjb21wbGV0ZXMgd2l0aCBgdHJ1ZWAsIHRoZSBgY3VycmVudGAgZmllbGQgaG9sZHMKICAgKiB0aGUgbW9zdCByZWNlbnQgZXZlbnQgb2YgdGhlIHN0cmVhbSwgYW5kIGl0IHN0YXlzIGxpa2UgdGhhdCB1bnRpbCB0aGUgbmV4dAogICAqIGNhbGwgdG8gYG1vdmVOZXh0YC4KICAgKiBCZXR3ZWVuIGEgY2FsbCB0byBgbW92ZU5leHRgIGFuZCB3aGVuIGl0cyByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzLAogICAqIHRoZSB2YWx1ZSBpcyB1bnNwZWNpZmllZC4KICAgKi8KICBUIGdldCBjdXJyZW50OwoKICAvKioKICAgKiBDYW5jZWxzIHRoZSBzdHJlYW0gaXRlcmF0b3IgKGFuZCB0aGUgdW5kZXJseWluZyBzdHJlYW0gc3Vic2NyaXB0aW9uKSBlYXJseS4KICAgKgogICAqIFRoZSBzdHJlYW0gaXRlcmF0b3IgaXMgYXV0b21hdGljYWxseSBjYW5jZWxlZCBpZiB0aGUgW21vdmVOZXh0XSBmdXR1cmUKICAgKiBjb21wbGV0ZXMgd2l0aCBlaXRoZXIgYGZhbHNlYCBvciBhbiBlcnJvci4KICAgKgogICAqIElmIHlvdSBuZWVkIHRvIHN0b3AgbGlzdGVuaW5nIGZvciB2YWx1ZXMgYmVmb3JlIHRoZSBzdHJlYW0gaXRlcmF0b3IgaXMKICAgKiBhdXRvbWF0aWNhbGx5IGNsb3NlZCwgeW91IG11c3QgY2FsbCBbY2FuY2VsXSB0byBlbnN1cmUgdGhhdCB0aGUgc3RyZWFtCiAgICogaXMgcHJvcGVybHkgY2xvc2VkLgogICAqCiAgICogSWYgW21vdmVOZXh0XSBoYXMgYmVlbiBjYWxsZWQgd2hlbiB0aGUgaXRlcmF0b3IgaXMgY2FuY2VsZWQsCiAgICogaXRzIHJldHVybmVkIGZ1dHVyZSB3aWxsIGNvbXBsZXRlIHdpdGggYGZhbHNlYCBhcyB2YWx1ZSwKICAgKiBhcyB3aWxsIGFsbCBmdXJ0aGVyIGNhbGxzIHRvIFttb3ZlTmV4dF0uCiAgICoKICAgKiBSZXR1cm5zIGEgZnV0dXJlIGlmIHRoZSBjYW5jZWwtb3BlcmF0aW9uIGlzIG5vdCBjb21wbGV0ZWQgc3luY2hyb25v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BhMCAQRHBD8TKwEVFQQBMicEARETBAIBFmRhcnQ6YXN5bmMvc3RyZWFtLmRhcnQ4b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2FzeW5jL3N0cmVhbV9jb250cm9sbGVyLmRhcnTAAH+vLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5hc3luYzsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQ29udHJvbGxlciBmb3IgY3JlYXRpbmcgYW5kIGFkZGluZyBldmVudHMgdG8gYSBzdHJlYW0uCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8qKgogKiBUeXBlIG9mIGEgc3RyZWFtIGNvbnRyb2xsZXIncyBgb25MaXN0ZW5gLCBgb25QYXVzZWAgYW5kIGBvblJlc3VtZWAgY2FsbGJhY2tzLgogKi8KdHlwZWRlZiB2b2lkIENvbnRyb2xsZXJDYWxsYmFjaygpOwoKLyoqCiAqIFR5cGUgb2Ygc3RyZWFtIGNvbnRyb2xsZXIgYG9uQ2FuY2VsYCBjYWxsYmFja3MuCiAqCiAqIFRoZSBjYWxsYmFjayBtYXkgcmV0dXJuIGVpdGhlciBgdm9pZGAgb3IgYSBmdXR1cmUuCiAqLwp0eXBlZGVmIENvbnRyb2xsZXJDYW5jZWxDYWxsYmFjaygpOwoKLyoqCiAqIEEgY29udHJvbGxlciB3aXRoIHRoZSBzdHJlYW0gaXQgY29udHJvbHMuCiAqCiAqIFRoaXMgY29udHJvbGxlciBhbGxvd3Mgc2VuZGluZyBkYXRhLCBlcnJvciBhbmQgZG9uZSBldmVudHMgb24KICogaXRzIFtzdHJlYW1dLgogKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIHNpbXBsZSBzdHJlYW0gdGhhdCBvdGhlcnMKICogY2FuIGxpc3RlbiBvbiwgYW5kIHRvIHB1c2ggZXZlbnRzIHRvIHRoYXQgc3RyZWFtLgogKgogKiBJdCdzIHBvc3NpYmxlIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHN0cmVhbSBpcyBwYXVzZWQgb3Igbm90LCBhbmQgd2hldGhlcgogKiBpdCBoYXMgc3Vic2NyaWJlcnMgb3Igbm90LCBhcyB3ZWxsIGFzIGdldHRpbmcgYSBjYWxsYmFjayB3aGVuIGVpdGhlciBvZgogKiB0aGVzZSBjaGFuZ2UuCiAqLwphYnN0cmFjdCBjbGFzcyBTdHJlYW1Db250cm9sbGVyPFQ+IGltcGxlbWVudHMgU3RyZWFtU2luazxUPiB7CiAgLyoqIFRoZSBzdHJlYW0gdGhhdCB0aGlzIGNvbnRyb2xsZXIgaXMgY29udHJvbGxpbmcuICovCiAgU3RyZWFtPFQ+IGdldCBzdHJlYW07CgogIC8qKgogICAqIEEgY29udHJvbGxlciB3aXRoIGEgW3N0cmVhbV0gdGhhdCBzdXBwb3J0cyBvbmx5IG9uZSBzaW5nbGUgc3Vic2NyaWJlci4KICAgKgogICAqIElmIFtzeW5jXSBpcyB0cnVlLCB0aGUgcmV0dXJuZWQgc3RyZWFtIGNvbnRyb2xsZXIgaXMgYQogICAqIFtTeW5jaHJvbm91c1N0cmVhbUNvbnRyb2xsZXJdLCBhbmQgbXVzdCBiZSB1c2VkIHdpdGggdGhlIGNhcmUKICAgKiBhbmQgYXR0ZW50aW9uIG5lY2Vzc2FyeSB0byBub3QgYnJlYWsgdGhlIFtTdHJlYW1dIGNvbnRyYWN0LiBJZiBpbiBkb3VidCwKICAgKiB1c2UgdGhlIG5vbi1zeW5jIHZlcnNpb24uCiAgICoKICAgKiBVc2luZyBhbiBhc3luY2hyb25vdXMgY29udHJvbGxlciB3aWxsIG5ldmVyIGdpdmUgdGhlIHdyb25nCiAgICogYmVoYXZpb3IsIGJ1dCB1c2luZyBhIHN5bmNocm9ub3VzIGNvbnRyb2xsZXIgaW5jb3JyZWN0bHkgY2FuIGNhdXNlCiAgICogb3RoZXJ3aXNlIGNvcnJlY3QgcHJvZ3JhbXMgdG8gYnJlYWsuCiAgICoKICAgKiBBIHN5bmNocm9ub3VzIGNvbnRyb2xsZXIgaXMgb25seSBpbnRlbmRlZCBmb3Igb3B0aW1pemluZyBldmVudAogICAqIHByb3BhZ2F0aW9uIHdoZW4gb25lIGFzeW5jaHJvbm91cyBldmVudCBpbW1lZGlhdGVseSB0cmlnZ2VycyBhbm90aGVyLgogICAqIEl0IHNob3VsZCBub3QgYmUgdXNlZCB1bmxlc3MgdGhlIGNhbGxzIHRvIFthZGRdIG9yIFthZGRFcnJvcl0KICAgKiBhcmUgZ3VhcmFudGVlZCB0byBvY2N1ciBpbiBwbGFjZXMgd2hlcmUgaXQgd29uJ3QgYnJlYWsgYFN0cmVhbWAgaW52YXJpYW50cy4KICAgKgogICAqIFVzZSBzeW5jaHJvbm91cyBjb250cm9sbGVycyBvbmx5IHRvIGZvcndhcmQgKHBvdGVudGlhbGx5IHRyYW5zZm9ybWVkKQogICAqIGV2ZW50cyBmcm9tIGFub3RoZXIgc3RyZWFtIG9yIGEgZnV0dXJlLgogICAqCiAgICogQSBTdHJlYW0gc2hvdWxkIGJlIGluZXJ0IHVudGlsIGEgc3Vic2NyaWJlciBzdGFydHMgbGlzdGVuaW5nIG9uIGl0ICh1c2luZwogICAqIHRoZSBbb25MaXN0ZW5dIGNhbGxiYWNrIHRvIHN0YXJ0IHByb2R1Y2luZyBldmVudHMpLiBTdHJlYW1zIHNob3VsZCBub3QKICAgKiBsZWFrIHJlc291cmNlcyAobGlrZSB3ZWJzb2NrZXRzKSB3aGVuIG5vIHVzZXIgZXZlciBsaXN0ZW5zIG9uIHRoZSBzdHJlYW0uCiAgICoKICAgKiBUaGUgY29udHJvbGxlciBidWZmZXJzIGFsbCBpbmNvbWluZyBldmVudHMgdW50aWwgYSBzdWJzY3JpYmVyIGlzCiAgICogcmVnaXN0ZXJlZCwgYnV0IHRoaXMgZmVhdHVyZSBzaG91bGQgb25seSBiZSB1c2VkIGluIHJhcmUgY2lyY3Vtc3RhbmNlcy4KICAgKgogICAqIFRoZSBbb25QYXVzZV0gZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBiZWNvbWVzCiAgICogcGF1c2VkLiBbb25SZXN1bWVdIGlzIGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gcmVzdW1lZC4KICAgKgogICAqIFRoZSBbb25MaXN0ZW5dIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0KICAgKiByZWNlaXZlcyBpdHMgbGlzdGVuZXIgYW5kIFtvbkNhbmNlbF0gd2hlbiB0aGUgbGlzdGVuZXIgZW5kcwogICAqIGl0cyBzdWJzY3JpcHRpb24uIElmIFtvbkNhbmNlbF0gbmVlZHMgdG8gcGVyZm9ybSBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLAogICAqIFtvbkNhbmNlbF0gc2hvdWxkIHJldHVybiBhIGZ1dHVyZSB0aGF0IGNvbXBsZXRlcyB3aGVuIHRoZSBjYW5jZWwgb3BlcmF0aW9uCiAgICogaXMgZG9uZS4KICAgKgogICAqIElmIHRoZSBzdHJlYW0gaXMgY2FuY2VsZWQgYmVmb3JlIHRoZSBjb250cm9sbGVyIG5lZWRzIG5ldyBkYXRhIHRoZQogICAqIFtvblJlc3VtZV0gY2FsbCBtaWdodCBub3QgYmUgZXhlY3V0ZWQuCiAgICovCiAgZmFjdG9yeSBTdHJlYW1Db250cm9sbGVyKAogICAgICB7dm9pZCBvbkxpc3RlbigpLAogICAgICB2b2lkIG9uUGF1c2UoKSwKICAgICAgdm9pZCBvblJlc3VtZSgpLAogICAgICBvbkNhbmNlbCgpLAogICAgICBib29sIHN5bmM6IGZhbHNlfSkgewogICAgcmV0dXJuIHN5bmMKICAgICAgICA/IG5ldyBfU3luY1N0cmVhbUNvbnRyb2xsZXI8VD4ob25MaXN0ZW4sIG9uUGF1c2UsIG9uUmVzdW1lLCBvbkNhbmNlbCkKICAgICAgICA6IG5ldyBfQXN5bmNTdHJlYW1Db250cm9sbGVyPFQ+KG9uTGlzdGVuLCBvblBhdXNlLCBvblJlc3VtZSwgb25DYW5jZWwpOwogIH0KCiAgLyoqCiAgICogQSBjb250cm9sbGVyIHdoZXJlIFtzdHJlYW1dIGNhbiBiZSBsaXN0ZW5lZCB0byBtb3JlIHRoYW4gb25jZS4KICAgKgogICAqIFRoZSBbU3RyZWFtXSByZXR1cm5lZCBieSBbc3RyZWFtXSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0uCiAgICogSXQgY2FuIGJlIGxpc3RlbmVkIHRvIG1vcmUgdGhhbiBvbmNlLgogICAqCiAgICogQSBTdHJlYW0gc2hvdWxkIGJlIGluZXJ0IHVudGlsIGEgc3Vic2NyaWJlciBzdGFydHMgbGlzdGVuaW5nIG9uIGl0ICh1c2luZwogICAqIHRoZSBbb25MaXN0ZW5dIGNhbGxiYWNrIHRvIHN0YXJ0IHByb2R1Y2luZyBldmVudHMpLiBTdHJlYW1zIHNob3VsZCBub3QKICAgKiBsZWFrIHJlc291cmNlcyAobGlrZSB3ZWJzb2NrZXRzKSB3aGVuIG5vIHVzZXIgZXZlciBsaXN0ZW5zIG9uIHRoZSBzdHJlYW0uCiAgICoKICAgKiBCcm9hZGNhc3Qgc3RyZWFtcyBkbyBub3QgYnVmZmVyIGV2ZW50cyB3aGVuIHRoZXJlIGlzIG5vIGxpc3RlbmVyLgogICAqCiAgICogVGhlIGNvbnRyb2xsZXIgZGlzdHJpYnV0ZXMgYW55IGV2ZW50cyB0byBhbGwgY3VycmVudGx5IHN1YnNjcmliZWQKICAgKiBsaXN0ZW5lcnMgYXQgdGhlIHRpbWUgd2hlbiBbYWRkXSwgW2FkZEVycm9yXSBvciBbY2xvc2VdIGlzIGNhbGxlZC4KICAgKiBJdCBpcyBub3QgYWxsb3dlZCB0byBjYWxsIGBhZGRgLCBgYWRkRXJyb3JgLCBvciBgY2xvc2VgIGJlZm9yZSBhIHByZXZpb3VzCiAgICogY2FsbCBoYXMgcmV0dXJuZWQuIFRoZSBjb250cm9sbGVyIGRvZXMgbm90IGhhdmUgYW55IGludGVybmFsIHF1ZXVlIG9mCiAgICogZXZlbnRzLCBhbmQgaWYgdGhlcmUgYXJlIG5vIGxpc3RlbmVycyBhdCB0aGUgdGltZSB0aGUgZXZlbnQgaXMgYWRkZWQsCiAgICogaXQgd2lsbCBqdXN0IGJlIGRyb3BwZWQsIG9yLCBpZiBpdCBpcyBhbiBlcnJvciwgYmUgcmVwb3J0ZWQgYXMgdW5jYXVnaHQuCiAgICoKICAgKiBFYWNoIGxpc3RlbmVyIHN1YnNjcmlwdGlvbiBpcyBoYW5kbGVkIGluZGVwZW5kZW50bHksCiAgICogYW5kIGlmIG9uZSBwYXVzZXMsIG9ubHkgdGhlIHBhdXNpbmcgbGlzdGVuZXIgaXMgYWZmZWN0ZWQuCiAgICogQSBwYXVzZWQgbGlzdGVuZXIgd2lsbCBidWZmZXIgZXZlbnRzIGludGVybmFsbHkgdW50aWwgdW5wYXVzZWQgb3IgY2FuY2VsZWQuCiAgICoKICAgKiBJZiBbc3luY10gaXMgdHJ1ZSwgZXZlbnRzIG1heSBiZSBmaXJlZCBkaXJlY3RseSBieSB0aGUgc3RyZWFtJ3MKICAgKiBzdWJzY3JpcHRpb25zIGR1cmluZyBhbiBbYWRkXSwgW2FkZEVycm9yXSBvciBbY2xvc2VdIGNhbGwuCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSBjb250cm9sbGVyIGlzIGEgW1N5bmNocm9ub3VzU3RyZWFtQ29udHJvbGxlcl0sCiAgICogYW5kIG11c3QgYmUgdXNlZCB3aXRoIHRoZSBjYXJlIGFuZCBhdHRlbnRpb24gbmVjZXNzYXJ5IHRvIG5vdCBicmVhawogICAqIHRoZSBbU3RyZWFtXSBjb250cmFjdC4KICAgKiBTZWUgW0NvbXBsZXRlci5zeW5jXSBmb3Igc29tZSBleHBsYW5hdGlvbnMgb24gd2hlbiBhIHN5bmNocm9ub3VzCiAgICogZGlzcGF0Y2hpbmcgY2FuIGJlIHVzZWQuCiAgICogSWYgaW4gZG91YnQsIGtlZXAgdGhlIGNvbnRyb2xsZXIgbm9uLXN5bmMuCiAgICoKICAgKiBJZiBbc3luY10gaXMgZmFsc2UsIHRoZSBldmVudCB3aWxsIGFsd2F5cyBiZSBmaXJlZCBhdCBhIGxhdGVyIHRpbWUsCiAgICogYWZ0ZXIgdGhlIGNvZGUgYWRkaW5nIHRoZSBldmVudCBoYXMgY29tcGxldGVkLgogICAqIEluIHRoYXQgY2FzZSwgbm8gZ3VhcmFudGVlcyBhcmUgZ2l2ZW4gd2l0aCByZWdhcmQgdG8gd2hlbgogICAqIG11bHRpcGxlIGxpc3RlbmVycyBnZXQgdGhlIGV2ZW50cywgZXhjZXB0IHRoYXQgZWFjaCBsaXN0ZW5lciB3aWxsIGdldAogICAqIGFsbCBldmVudHMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIEVhY2ggc3Vic2NyaXB0aW9uIGhhbmRsZXMgdGhlIGV2ZW50cwogICAqIGluZGl2aWR1YWxseS4KICAgKiBJZiB0d28gZXZlbnRzIGFyZSBzZW50IG9uIGFuIGFzeW5jIGNvbnRyb2xsZXIgd2l0aCB0d28gbGlzdGVuZXJzLAogICAqIG9uZSBvZiB0aGUgbGlzdGVuZXJzIG1heSBnZXQgYm90aCBldmVudHMKICAgKiBiZWZvcmUgdGhlIG90aGVyIGxpc3RlbmVyIGdldHMgYW55LgogICAqIEEgbGlzdGVuZXIgbXVzdCBiZSBzdWJzY3JpYmVkIGJvdGggd2hlbiB0aGUgZXZlbnQgaXMgaW5pdGlhdGVkCiAgICogKHRoYXQgaXMsIHdoZW4gW2FkZF0gaXMgY2FsbGVkKQogICAqIGFuZCB3aGVuIHRoZSBldmVudCBpcyBsYXRlciBkZWxpdmVyZWQsCiAgICogaW4gb3JkZXIgdG8gcmVjZWl2ZSB0aGUgZXZlbnQuCiAgICoKICAgKiBUaGUgW29uTGlzdGVuXSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgZmlyc3QgbGlzdGVuZXIgaXMgc3Vic2NyaWJlZCwKICAgKiBhbmQgdGhlIFtvbkNhbmNlbF0gaXMgY2FsbGVkIHdoZW4gdGhlcmUgYXJlIG5vIGxvbmdlciBhbnkgYWN0aXZlIGxpc3RlbmVycy4KICAgKiBJZiBhIGxpc3RlbmVyIGlzIGFkZGVkIGFnYWluIGxhdGVyLCBhZnRlciB0aGUgW29uQ2FuY2VsXSB3YXMgY2FsbGVkLAogICAqIHRoZSBbb25MaXN0ZW5dIHdpbGwgYmUgY2FsbGVkIGFnYWluLgogICAqLwogIGZhY3RvcnkgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoCiAgICAgIHt2b2lkIG9uTGlzdGVuKCksIHZvaWQgb25DYW5jZWwoKSwgYm9vbCBzeW5jOiBmYWxzZX0pIHsKICAgIHJldHVybiBzeW5jCiAgICAgICAgPyBuZXcgX1N5bmNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyPFQ+KG9uTGlzdGVuLCBvbkNhbmNlbCkKICAgICAgICA6IG5ldyBfQXN5bmNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyPFQ+KG9uTGlzdGVuLCBvbkNhbmNlbCk7CiAgfQoKICAvKioKICAgKiBUaGUgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBsaXN0ZW5lZCB0by4KICAgKgogICAqIE1heSBiZSBzZXQgdG8gYG51bGxgLCBpbiB3aGljaCBjYXNlIG5vIGNhbGxiYWNrIHdpbGwgaGFwcGVuLgogICAqLwogIENvbnRyb2xsZXJDYWxsYmFjayBnZXQgb25MaXN0ZW47CgogIHZvaWQgc2V0IG9uTGlzdGVuKHZvaWQgb25MaXN0ZW5IYW5kbGVyKCkpOwoKICAvKioKICAgKiBUaGUgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBwYXVzZWQuCiAgICoKICAgKiBNYXkgYmUgc2V0IHRvIGBudWxsYCwgaW4gd2hpY2ggY2FzZSBubyBjYWxsYmFjayB3aWxsIGhhcHBlbi4KICAgKgogICAqIFBhdXNlIHJlbGF0ZWQgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIGJyb2FkY2FzdCBzdHJlYW0gY29udHJvbGxlcnMuCiAgICovCiAgQ29udHJvbGxlckNhbGxiYWNrIGdldCBvblBhdXNlOwoKICB2b2lkIHNldCBvblBhdXNlKHZvaWQgb25QYXVzZUhhbmRsZXIoKSk7CgogIC8qKgogICAqIFRoZSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIHJlc3VtZWQuCiAgICoKICAgKiBNYXkgYmUgc2V0IHRvIGBudWxsYCwgaW4gd2hpY2ggY2FzZSBubyBjYWxsYmFjayB3aWxsIGhhcHBlbi4KICAgKgogICAqIFBhdXNlIHJlbGF0ZWQgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIGJyb2FkY2FzdCBzdHJlYW0gY29udHJvbGxlcnMuCiAgICovCiAgQ29udHJvbGxlckNhbGxiYWNrIGdldCBvblJlc3VtZTsKCiAgdm9pZCBzZXQgb25SZXN1bWUodm9pZCBvblJlc3VtZUhhbmRsZXIoKSk7CgogIC8qKgogICAqIFRoZSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGNhbmNlbGVkLgogICAqCiAgICogTWF5IGJlIHNldCB0byBgbnVsbGAsIGluIHdoaWNoIGNhc2Ugbm8gY2FsbGJhY2sgd2lsbCBoYXBwZW4uCiAgICovCiAgQ29udHJvbGxlckNhbmNlbENhbGxiYWNrIGdldCBvbkNhbmNlbDsKCiAgdm9pZCBzZXQgb25DYW5jZWwob25DYW5jZWxIYW5kbGVyKCkpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgdmlldyBvZiB0aGlzIG9iamVjdCB0aGF0IG9ubHkgZXhwb3NlcyB0aGUgW1N0cmVhbVNpbmtdIGludGVyZmFjZS4KICAgKi8KICBTdHJlYW1TaW5rPFQ+IGdldCBzaW5rOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBzdHJlYW0gY29udHJvbGxlciBpcyBjbG9zZWQgZm9yIGFkZGluZyBtb3JlIGV2ZW50cy4KICAgKgogICAqIFRoZSBjb250cm9sbGVyIGJlY29tZXMgY2xvc2VkIGJ5IGNhbGxpbmcgdGhlIFtjbG9zZV0gbWV0aG9kLgogICAqIE5ldyBldmVudHMgY2Fubm90IGJlIGFkZGVkLCBieSBjYWxsaW5nIFthZGRdIG9yIFthZGRFcnJvcl0sCiAgICogdG8gYSBjbG9zZWQgY29udHJvbGxlci4KICAgKgogICAqIElmIHRoZSBjb250cm9sbGVyIGlzIGNsb3NlZCwKICAgKiB0aGUgImRvbmUiIGV2ZW50IG1pZ2h0IG5vdCBoYXZlIGJlZW4gZGVsaXZlcmVkIHlldCwKICAgKiBidXQgaXQgaGFzIGJlZW4gc2NoZWR1bGVkLCBhbmQgaXQgaXMgdG9vIGxhdGUgdG8gYWRkIG1vcmUgZXZlbnRzLgogICAqLwogIGJvb2wgZ2V0IGlzQ2xvc2VkOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBzdWJzY3JpcHRpb24gd291bGQgbmVlZCB0byBidWZmZXIgZXZlbnRzLgogICAqCiAgICogVGhpcyBpcyB0aGUgY2FzZSBpZiB0aGUgY29udHJvbGxlcidzIHN0cmVhbSBoYXMgYSBsaXN0ZW5lciBhbmQgaXQgaXMKICAgKiBwYXVzZWQsIG9yIGlmIGl0IGhhcyBub3QgcmVjZWl2ZWQgYSBsaXN0ZW5lciB5ZXQuIEluIHRoYXQgY2FzZSwgdGhlCiAgICogY29udHJvbGxlciBpcyBjb25zaWRlcmVkIHBhdXNlZCBhcyB3ZWxsLgogICAqCiAgICogQSBicm9hZGNhc3Qgc3RyZWFtIGNvbnRyb2xsZXIgaXMgbmV2ZXIgY29uc2lkZXJlZCBwYXVzZWQuIEl0IGFsd2F5cwogICAqIGZvcndhcmRzIGl0cyBldmVudHMgdG8gYWxsIHVuY2FuY2VsZWQgc3Vic2NyaXB0aW9ucywgaWYgYW55LAogICAqIGFuZCBsZXQgdGhlIHN1YnNjcmlwdGlvbnMgaGFuZGxlIHRoZWlyIG93biBwYXVzaW5nIGFuZCBidWZmZXJpbmcuCiAgICovCiAgYm9vbCBnZXQgaXNQYXVzZWQ7CgogIC8qKiBXaGV0aGVyIHRoZXJlIGlzIGEgc3Vic2NyaWJlciBvbiB0aGUgW1N0cmVhbV0uICovCiAgYm9vbCBnZXQgaGFzTGlzdGVuZXI7CgogIC8qKgogICAqIFNlbmRzIGEgZGF0YSBbZXZlbnRdLgogICAqCiAgICogTGlzdGVuZXJzIHJlY2VpdmUgdGhpcyBldmVudCBpbiBhIGxhdGVyIG1pY3JvdGFzay4KICAgKgogICAqIE5vdGUgdGhhdCBhIHN5bmNocm9ub3VzIGNvbnRyb2xsZXIgKGNyZWF0ZWQgYnkgcGFzc2luZyB0cnVlIHRvIHRoZSBgc3luY2AKICAgKiBwYXJhbWV0ZXIgb2YgdGhlIGBTdHJlYW1Db250cm9sbGVyYCBjb25zdHJ1Y3RvcikgZGVsaXZlcnMgZXZlbnRzCiAgICogaW1tZWRpYXRlbHkuIFNpbmNlIHRoaXMgYmVoYXZpb3IgdmlvbGF0ZXMgdGhlIGNvbnRyYWN0IG1lbnRpb25lZCBoZXJlLAogICAqIHN5bmNocm9ub3VzIGNvbnRyb2xsZXJzIHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgZGVzY3JpYmVkIGluIHRoZQogICAqIGRvY3VtZW50YXRpb24gdG8gZW5zdXJlIHRoYXQgdGhlIGRlbGl2ZXJlZCBldmVudHMgYWx3YXlzICphcHBlYXIqIGFzIGlmCiAgICogdGhleSB3ZXJlIGRlbGl2ZXJlZCBpbiBhIHNlcGFyYXRlIG1pY3JvdGFzay4KICAgKi8KICB2b2lkIGFkZChUIGV2ZW50KTsKCiAgLyoqCiAgICogU2VuZHMgb3IgZW5xdWV1ZXMgYW4gZXJyb3IgZXZlbnQuCiAgICoKICAgKiBJZiBbZXJyb3JdIGlzIGBudWxsYCwgaXQgaXMgcmVwbGFjZWQgYnkgYSBbTnVsbFRocm93bkVycm9yXS4KICAgKgogICAqIExpc3RlbmVycyByZWNlaXZlIHRoaXMgZXZlbnQgYXQgYSBsYXRlciBtaWNyb3Rhc2suIFRoaXMgYmVoYXZpb3IgY2FuIGJlCiAgICogb3ZlcnJpZGRlbiBieSB1c2luZyBgc3luY2AgY29udHJvbGxlcnMuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgc3luYwogICAqIGNvbnRyb2xsZXJzIGhhdmUgdG8gc2F0aXNmeSB0aGUgcHJlY29uZGl0aW9ucyBtZW50aW9uZWQgaW4gdGhlCiAgICogZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29uc3RydWN0b3JzLgogICAqLwogIHZvaWQgYWRkRXJyb3IoT2JqZWN0IGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSk7CgogIC8qKgogICAqIENsb3NlcyB0aGUgc3RyZWFtLgogICAqCiAgICogTGlzdGVuZXJzIHJlY2VpdmUgdGhlIGRvbmUgZXZlbnQgYXQgYSBsYXRlciBtaWNyb3Rhc2suIFRoaXMgYmVoYXZpb3IgY2FuIGJlCiAgICogb3ZlcnJpZGRlbiBieSB1c2luZyBgc3luY2AgY29udHJvbGxlcnMuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgc3luYwogICAqIGNvbnRyb2xsZXJzIGhhdmUgdG8gc2F0aXNmeSB0aGUgcHJlY29uZGl0aW9ucyBtZW50aW9uZWQgaW4gdGhlCiAgICogZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29uc3RydWN0b3JzLgogICAqLwogIEZ1dHVyZSBjbG9zZSgpOwoKICAvKioKICAgKiBSZWNlaXZlcyBldmVudHMgZnJvbSBbc291cmNlXSBhbmQgcHV0cyB0aGVtIGludG8gdGhpcyBjb250cm9sbGVyJ3Mgc3RyZWFtLgogICAqCiAgICogUmV0dXJucyBhIGZ1dHVyZSB3aGljaCBjb21wbGV0ZXMgd2hlbiB0aGUgc291cmNlIHN0cmVhbSBpcyBkb25lLgogICAqCiAgICogRXZlbnRzIG11c3Qgbm90IGJlIGFkZGVkIGRpcmVjdGx5IHRvIHRoaXMgY29udHJvbGxlciB1c2luZyBbYWRkXSwKICAgKiBbYWRkRXJyb3JdLCBbY2xvc2VdIG9yIFthZGRTdHJlYW1dLCB1bnRpbCB0aGUgcmV0dXJuZWQgZnV0dXJlCiAgICogaXMgY29tcGxldGUuCiAgICoKICAgKiBEYXRhIGFuZCBlcnJvciBldmVudHMgYXJlIGZvcndhcmRlZCB0byB0aGlzIGNvbnRyb2xsZXIncyBzdHJlYW0uIEEgZG9uZQogICAqIGV2ZW50IG9uIHRoZSBzb3VyY2Ugd2lsbCBlbmQgdGhlIGBhZGRTdHJlYW1gIG9wZXJhdGlvbiBhbmQgY29tcGxldGUgdGhlCiAgICogcmV0dXJuZWQgZnV0dXJlLgogICAqCiAgICogSWYgW2NhbmNlbE9uRXJyb3JdIGlzIHRydWUsIG9ubHkgdGhlIGZpcnN0IGVycm9yIG9uIFtzb3VyY2VdIGlzCiAgICogZm9yd2FyZGVkIHRvIHRoZSBjb250cm9sbGVyJ3Mgc3RyZWFtLCBhbmQgdGhlIGBhZGRTdHJlYW1gIGVuZHMKICAgKiBhZnRlciB0aGlzLiBJZiBbY2FuY2VsT25FcnJvcl0gaXMgZmFsc2UsIGFsbCBlcnJvcnMgYXJlIGZvcndhcmRlZAogICAqIGFuZCBvbmx5IGEgZG9uZSBldmVudCB3aWxsIGVuZCB0aGUgYGFkZFN0cmVhbWAuCiAgICogSWYgW2NhbmNlbE9uRXJyb3JdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGZhbHNlLgogICAqLwogIEZ1dHVyZSBhZGRTdHJlYW0oU3RyZWFtPFQ+IHNvdXJjZSwge2Jvb2wgY2FuY2VsT25FcnJvcn0pOwp9CgovKioKICogQSBzdHJlYW0gY29udHJvbGxlciB0aGF0IGRlbGl2ZXJzIGl0cyBldmVudHMgc3luY2hyb25vdXNseS4KICoKICogQSBzeW5jaHJvbm91cyBzdHJlYW0gY29udHJvbGxlciBpcyBpbnRlbmRlZCBmb3IgY2FzZXMgd2hlcmUKICogYW4gYWxyZWFkeSBhc3luY2hyb25vdXMgZXZlbnQgdHJpZ2dlcnMgYW4gZXZlbnQgb24gYSBzdHJlYW0uCiAqCiAqIEluc3RlYWQgb2YgYWRkaW5nIHRoZSBldmVudCB0byB0aGUgc3RyZWFtIGluIGEgbGF0ZXIgbWljcm90YXNrLAogKiBjYXVzaW5nIGV4dHJhIGxhdGVuY3ksIHRoZSBldmVudCBpcyBpbnN0ZWFkIGZpcmVkIGltbWVkaWF0ZWx5IGJ5IHRoZQogKiBzeW5jaHJvbm91cyBzdHJlYW0gY29udHJvbGxlciwgYXMgaWYgdGhlIHN0cmVhbSBldmVudCB3YXMKICogdGhlIGN1cnJlbnQgZXZlbnQgb3IgbWljcm90YXNrLgogKgogKiBUaGUgc3luY2hyb25vdXMgc3RyZWFtIGNvbnRyb2xsZXIgY2FuIGJlIHVzZWQgdG8gYnJlYWsgdGhlIGNvbnRyYWN0CiAqIG9uIFtTdHJlYW1dLCBhbmQgaXQgbXVzdCBiZSB1c2VkIGNhcmVmdWxseSB0byBhdm9pZCBkb2luZyBzby4KICoKICogVGhlIG9ubHkgYWR2YW50YWdlIHRvIHVzaW5nIGEgW1N5bmNocm9ub3VzU3RyZWFtQ29udHJvbGxlcl0gb3ZlciBhCiAqIG5vcm1hbCBbU3RyZWFtQ29udHJvbGxlcl0gaXMgdGhlIGltcHJvdmVkIGxhdGVuY3kuCiAqIE9ubHkgdXNlIHRoZSBzeW5jaHJvbm91cyB2ZXJzaW9uIGlmIHRoZSBpbXByb3ZlbWVudCBpcyBzaWduaWZpY2FudCwKICogYW5kIGlmIGl0cyB1c2UgaXMgc2FmZS4gT3RoZXJ3aXNlIGp1c3QgdXNlIGEgbm9ybWFsIHN0cmVhbSBjb250cm9sbGVyLAogKiB3aGljaCB3aWxsIGFsd2F5cyBoYXZlIHRoZSBjb3JyZWN0IGJlaGF2aW9yIGZvciBhIFtTdHJlYW1dLCBhbmQgd29uJ3QKICogYWNjaWRlbnRhbGx5IGJyZWFrIG90aGVyIGNvZGUuCiAqCiAqIEFkZGluZyBldmVudHMgdG8gYSBzeW5jaHJvbm91cyBjb250cm9sbGVyIHNob3VsZCBvbmx5IGhhcHBlbiBhcyB0aGUKICogdmVyeSBsYXN0IHBhcnQgb2YgdGhlIGhhbmRsaW5nIG9mIHRoZSBvcmlnaW5hbCBldmVudC4KICogQXQgdGhhdCBwb2ludCwgYWRkaW5nIGFuIGV2ZW50IHRvIHRoZSBzdHJlYW0gaXMgZXF1aXZhbGVudCB0bwogKiByZXR1cm5pbmcgdG8gdGhlIGV2ZW50IGxvb3AgYW5kIGFkZGluZyB0aGUgZXZlbnQgaW4gdGhlIG5leHQgbWljcm90YXNrLgogKgogKiBFYWNoIGxpc3RlbmVyIGNhbGxiYWNrIHdpbGwgYmUgcnVuIGFzIGlmIGl0IHdhcyBhIHRvcC1sZXZlbCBldmVudAogKiBvciBtaWNyb3Rhc2suIFRoaXMgbWVhbnMgdGhhdCBpZiBpdCB0aHJvd3MsIHRoZSBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGFzCiAqIHVuY2F1Z2h0IGFzIHNvb24gYXMgcG9zc2libGUuCiAqIFRoaXMgaXMgb25lIHJlYXNvbiB0byBhZGQgdGhlIGV2ZW50IGFzIHRoZSBsYXN0IHRoaW5nIGluIHRoZSBvcmlnaW5hbCBldmVudAogKiBoYW5kbGVyIC0gYW55IGFjdGlvbiBkb25lIGFmdGVyIGFkZGluZyB0aGUgZXZlbnQgd2lsbCBkZWxheSB0aGUgcmVwb3J0IG9mCiAqIGVycm9ycyBpbiB0aGUgZXZlbnQgbGlzdGVuZXIgY2FsbGJhY2tzLgogKgogKiBJZiBhbiBldmVudCBpcyBhZGRlZCBpbiBhIHNldHRpbmcgdGhhdCBpc24ndCBrbm93biB0byBiZSBhbm90aGVyIGV2ZW50LAogKiBpdCBtYXkgY2F1c2UgdGhlIHN0cmVhbSdzIGxpc3RlbmVyIHRvIGdldCB0aGF0IGV2ZW50IGJlZm9yZSB0aGUgbGlzdGVuZXIKICogaXMgcmVhZHkgdG8gaGFuZGxlIGl0LiBXZSBwcm9taXNlIHRoYXQgYWZ0ZXIgY2FsbGluZyBbU3RyZWFtLmxpc3Rlbl0sCiAqIHlvdSB3b24ndCBnZXQgYW55IGV2ZW50cyB1bnRpbCB0aGUgY29kZSBkb2luZyB0aGUgbGlzdGVuIGhhcyBjb21wbGV0ZWQuCiAqIENhbGxpbmcgW2FkZF0gaW4gcmVzcG9uc2UgdG8gYSBmdW5jdGlvbiBjYWxsIG9mIHVua25vd24gb3JpZ2luIG1heSBicmVhawogKiB0aGF0IHByb21pc2UuCiAqCiAqIEFuIFtvbkxpc3Rlbl0gY2FsbGJhY2sgZnJvbSB0aGUgY29udHJvbGxlciBpcyAqbm90KiBhbiBhc3luY2hyb25vdXMgZXZlbnQsCiAqIGFuZCBhZGRpbmcgZXZlbnRzIHRvIHRoZSBjb250cm9sbGVyIGluIHRoZSBgb25MaXN0ZW5gIGNhbGxiYWNrIGlzIGFsd2F5cwogKiB3cm9uZy4gVGhlIGV2ZW50cyB3aWxsIGJlIGRlbGl2ZXJlZCBiZWZvcmUgdGhlIGxpc3RlbmVyIGhhcyBldmVuIHJlY2VpdmVkCiAqIHRoZSBzdWJzY3JpcHRpb24geWV0LgogKgogKiBUaGUgc3luY2hyb25vdXMgYnJvYWRjYXN0IHN0cmVhbSBjb250cm9sbGVyIGFsc28gaGFzIGEgcmVzdHJpY3Rpb25zIHRoYXQgYQogKiBub3JtYWwgc3RyZWFtIGNvbnRyb2xsZXIgZG9lcyBub3Q6CiAqIFRoZSBbYWRkXSwgW2FkZEVycm9yXSwgW2Nsb3NlXSBhbmQgW2FkZFN0cmVhbV0gbWV0aG9kcyAqbXVzdCBub3QqIGJlCiAqIGNhbGxlZCB3aGlsZSBhbiBldmVudCBpcyBiZWluZyBkZWxpdmVyZWQuCiAqIFRoYXQgaXMsIGlmIGEgY2FsbGJhY2sgb24gYSBzdWJzY3JpcHRpb24gb24gdGhlIGNvbnRyb2xsZXIncyBzdHJlYW0gY2F1c2VzCiAqIGEgY2FsbCB0byBhbnkgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSwgdGhlIGNhbGwgd2lsbCBmYWlsLgogKiBBIGJyb2FkY2FzdCBzdHJlYW0gbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBsaXN0ZW5lciwgYW5kIGlmIGFuCiAqIGV2ZW50IGlzIGFkZGVkIHN5bmNocm9ub3VzbHkgd2hpbGUgYW5vdGhlciBpcyBiZWluZyBhbHNvIGluIHRoZSBwcm9jZXNzCiAqIG9mIGJlaW5nIGFkZGVkLCB0aGUgbGF0dGVyIGV2ZW50IG1pZ2h0IHJlYWNoIHNvbWUgbGlzdGVuZXJzIGJlZm9yZQogKiB0aGUgZm9ybWVyLiBUbyBwcmV2ZW50IHRoYXQsIGFuIGV2ZW50IGNhbm5vdCBiZSBhZGRlZCB3aGlsZSBhIHByZXZpb3VzCiAqIGV2ZW50IGlzIGJlaW5nIGZpcmVkLgogKiBUaGlzIGd1YXJhbnRlZXMgdGhhdCBhbiBldmVudCBpcyBmdWxseSBkZWxpdmVyZWQgd2hlbiB0aGUKICogZmlyc3QgW2FkZF0sIFthZGRFcnJvcl0gb3IgW2Nsb3NlXSByZXR1cm5zLAogKiBhbmQgZnVydGhlciBldmVudHMgd2lsbCBiZSBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCiAqCiAqIFRoaXMgc3RpbGwgb25seSBndWFyYW50ZWVzIHRoYXQgdGhlIGV2ZW50IGlzIGRlbGl2ZXJlZCB0byB0aGUgc3Vic2NyaXB0aW9uLgogKiBJZiB0aGUgc3Vic2NyaXB0aW9uIGlzIHBhdXNlZCwgdGhlIGFjdHVhbCBjYWxsYmFjayBtYXkgc3RpbGwgaGFwcGVuIGxhdGVyLAogKiBhbmQgdGhlIGV2ZW50IHdpbGwgaW5zdGVhZCBiZSBidWZmZXJlZCBieSB0aGUgc3Vic2NyaXB0aW9uLgogKiBCYXJyaW5nIHBhdXNpbmcsIGFuZCB0aGUgZm9sbG93aW5nIGJ1ZmZlcmVkIGV2ZW50cyB0aGF0IGhhdmVuJ3QgYmVlbgogKiBkZWxpdmVyZWQgeWV0LCBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQgc3luY2hyb25vdXNseSB3aGVuIGFuIGV2ZW50IGlzIGFkZGVkLgogKgogKiBBZGRpbmcgYW4gZXZlbnQgdG8gYSBzeW5jaHJvbm91cyBub24tYnJvYWRjYXN0IHN0cmVhbSBjb250cm9sbGVyIHdoaWxlCiAqIGFub3RoZXIgZXZlbnQgaXMgaW4gcHJvZ3Jlc3MgbWF5IGNhdXNlIHRoZSBzZWNvbmQgZXZlbnQgdG8gYmUgZGVsYXllZAogKiBhbmQgbm90IGJlIGRlbGl2ZXJlZCBzeW5jaHJvbm91c2x5LCBhbmQgdW50aWwgdGhhdCBldmVudCBpcyBkZWxpdmVyZWQsCiAqIHRoZSBjb250cm9sbGVyIHdpbGwgbm90IGFjdCBzeW5jaHJvbm91c2x5LgogKi8KYWJzdHJhY3QgY2xhc3MgU3luY2hyb25vdXNTdHJlYW1Db250cm9sbGVyPFQ+IGltcGxlbWVudHMgU3RyZWFtQ29udHJvbGxlcjxUPiB7CiAgLyoqCiAgICogQWRkcyBldmVudCB0byB0aGUgY29udHJvbGxlcidzIHN0cmVhbS4KICAgKgogICAqIEFzIFtTdHJlYW1Db250cm9sbGVyLmFkZF0sIGJ1dCBtdXN0IG5vdCBiZSBjYWxsZWQgd2hpbGUgYW4gZXZlbnQgaXMKICAgKiBiZWluZyBhZGRlZCBieSBbYWRkXSwgW2FkZEVycm9yXSBvciBbY2xvc2VdLgogICAqLwogIHZvaWQgYWRkKFQgZGF0YSk7CgogIC8qKgogICAqIEFkZHMgZXJyb3IgdG8gdGhlIGNvbnRyb2xsZXIncyBzdHJlYW0uCiAgICoKICAgKiBBcyBbU3RyZWFtQ29udHJvbGxlci5hZGRFcnJvcl0sIGJ1dCBtdXN0IG5vdCBiZSBjYWxsZWQgd2hpbGUgYW4gZXZlbnQgaXMKICAgKiBiZWluZyBhZGRlZCBieSBbYWRkXSwgW2FkZEVycm9yXSBvciBbY2xvc2VdLgogICAqLwogIHZvaWQgYWRkRXJyb3IoT2JqZWN0IGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSk7CgogIC8qKgogICAqIENsb3NlcyB0aGUgY29udHJvbGxlcidzIHN0cmVhbS4KICAgKgogICAqIEFzIFtTdHJlYW1Db250cm9sbGVyLmNsb3NlXSwgYnV0IG11c3Qgbm90IGJlIGNhbGxlZCB3aGlsZSBhbiBldmVudCBpcwogICAqIGJlaW5nIGFkZGVkIGJ5IFthZGRdLCBbYWRkRXJyb3JdIG9yIFtjbG9zZV0uCiAgICovCiAgRnV0dXJlIGNsb3NlKCk7Cn0KCmFic3RyYWN0IGNsYXNzIF9TdHJlYW1Db250cm9sbGVyTGlmZWN5Y2xlPFQ+IHsKICBTdHJlYW1TdWJzY3JpcHRpb248VD4gX3N1YnNjcmliZSgKICAgICAgdm9pZCBvbkRhdGEoVCBkYXRhKSwgRnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKTsKICB2b2lkIF9yZWNvcmRQYXVzZShTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSB7fQogIHZvaWQgX3JlY29yZFJlc3VtZShTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSB7fQogIEZ1dHVyZSBfcmVjb3JkQ2FuY2VsKFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pID0+IG51bGw7Cn0KCi8vIEJhc2UgdHlwZSBmb3IgaW1wbGVtZW50YXRpb25zIG9mIHN0cmVhbSBjb250cm9sbGVycy4KYWJzdHJhY3QgY2xhc3MgX1N0cmVhbUNvbnRyb2xsZXJCYXNlPFQ+CiAgICBpbXBsZW1lbnRzCiAgICAgICAgU3RyZWFtQ29udHJvbGxlcjxUPiwKICAgICAgICBfU3RyZWFtQ29udHJvbGxlckxpZmVjeWNsZTxUPiwKICAgICAgICBfRXZlbnRTaW5rPFQ+LAogICAgICAgIF9FdmVudERpc3BhdGNoPFQ+IHt9CgovKioKICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBbU3RyZWFtQ29udHJvbGxlcl0uCiAqCiAqIENvbnRyb2xzIGEgc3RyZWFtIHRoYXQgb25seSBzdXBwb3J0cyBhIHNpbmdsZSBjb250cm9sbGVyLgogKi8KYWJzdHJhY3QgY2xhc3MgX1N0cmVhbUNvbnRyb2xsZXI8VD4gaW1wbGVtZW50cyBfU3RyZWFtQ29udHJvbGxlckJhc2U8VD4gewogIC8vIFRoZSBzdGF0ZXMgYXJlIGJpdC1mbGFncy4gTW9yZSB0aGFuIG9uZSBjYW4gYmUgc2V0IGF0IGEgdGltZS4KICAvLwogIC8vIFRoZSAic3Vic2NyaXB0aW9uIHN0YXRlIiBnb2VzIHRocm91Z2ggdGhlIHN0YXRlczoKICAvLyAgIGluaXRpYWwgLT4gc3Vic2NyaWJlZCAtPiBjYW5jZWxlZC4KICAvLyBUaGVzZSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgogIC8vIFRoZSAiY2xvc2VkIiBzdGF0ZSByZWNvcmRzIHdoZXRoZXIgdGhlIFtjbG9zZV0gbWV0aG9kIGhhcyBiZWVuIGNhbGxlZAogIC8vIG9uIHRoZSBjb250cm9sbGVyLiBUaGlzIGNhbiBiZSBkb25lIGF0IGFueSB0aW1lLiBJZiBkb25lIGJlZm9yZQogIC8vIHN1YnNjcmlwdGlvbiwgdGhlIGRvbmUgZXZlbnQgaXMgcXVldWVkLiBJZiBkb25lIGFmdGVyIGNhbmNlbCwgdGhlIGRvbmUKICAvLyBldmVudCBpcyBpZ25vcmVkIChqdXN0IGFzIGFueSBvdGhlciBldmVudCBhZnRlciBhIGNhbmNlbCkuCgogIC8qKiBUaGUgY29udHJvbGxlciBpcyBpbiBpdHMgaW5pdGlhbCBzdGF0ZSB3aXRoIG5vIHN1YnNjcmlwdGlvbi4gKi8KICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9JTklUSUFMID0gMDsKICAvKiogVGhlIGNvbnRyb2xsZXIgaGFzIGEgc3Vic2NyaXB0aW9uLCBidXQgaGFzbid0IGJlZW4gY2xvc2VkIG9yIGNhbmNlbGVkLiAqLwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX1NVQlNDUklCRUQgPSAxOwogIC8qKiBUaGUgc3Vic2NyaXB0aW9uIGlzIGNhbmNlbGVkLiAqLwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0NBTkNFTEVEID0gMjsKICAvKiogTWFzayBmb3IgdGhlIHN1YnNjcmlwdGlvbiBzdGF0ZS4gKi8KICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9TVUJTQ1JJUFRJT05fTUFTSyA9IDM7CgogIC8vIFRoZSBmb2xsb3dpbmcgc3RhdGUgcmVsYXRlIHRvIHRoZSBjb250cm9sbGVyLCBub3QgdGhlIHN1YnNjcmlwdGlvbi4KICAvLyBJZiBjbG9zZWQsIGFkZGluZyBtb3JlIGV2ZW50cyBpcyBub3QgYWxsb3dlZC4KICAvLyBJZiBleGVjdXRpbmcgYW4gW2FkZFN0cmVhbV0sIG5ldyBldmVudHMgYXJlIG5vdCBhbGxvd2VkIGVpdGhlciwgYnV0IHdpbGwKICAvLyBiZSBhZGRlZCBieSB0aGUgc3RyZWFtLgoKICAvKioKICAgKiBUaGUgY29udHJvbGxlciBpcyBjbG9zZWQgZHVlIHRvIGNhbGxpbmcgW2Nsb3NlXS4KICAgKgogICAqIFdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQsIHlvdSBjYW4gbmVpdGhlciBhZGQgbmV3IGV2ZW50cyBub3IgYWRkIG5ldwogICAqIGxpc3RlbmVycy4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9DTE9TRUQgPSA0OwogIC8qKgogICAqIFRoZSBjb250cm9sbGVyIGlzIGluIHRoZSBtaWRkbGUgb2YgYW4gW2FkZFN0cmVhbV0gb3BlcmF0aW9uLgogICAqCiAgICogV2hpbGUgYWRkaW5nIGV2ZW50cyBmcm9tIGEgc3RyZWFtLCBubyBuZXcgZXZlbnRzIGNhbiBiZSBhZGRlZCBkaXJlY3RseQogICAqIG9uIHRoZSBjb250cm9sbGVyLgogICAqLwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0FERFNUUkVBTSA9IDg7CgogIC8qKgogICAqIEZpZWxkIGNvbnRhaW5pbmcgZGlmZmVyZW50IGRhdGEgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHN1YnNjcmlwdGlvbgogICAqIHN0YXRlLgogICAqCiAgICogSWYgW19zdGF0ZV0gaXMgW19TVEFURV9JTklUSUFMXSwgdGhlIGZpZWxkIG1heSBjb250YWluIGEgW19QZW5kaW5nRXZlbnRzXQogICAqIGZvciBldmVudHMgYWRkZWQgdG8gdGhlIGNvbnRyb2xsZXIgYmVmb3JlIGEgc3Vic2NyaXB0aW9uLgogICAqCiAgICogV2hpbGUgW19zdGF0ZV0gaXMgW19TVEFURV9TVUJTQ1JJQkVEXSwgdGhlIGZpZWxkIGNvbnRhaW5zIHRoZSBzdWJzY3JpcHRpb24uCiAgICoKICAgKiBXaGVuIFtfc3RhdGVdIGlzIFtfU1RBVEVfQ0FOQ0VMRURdIHRoZSBmaWVsZCBpcyBjdXJyZW50bHkgbm90IHVzZWQuCiAgICovCiAgdmFyIF92YXJEYXRhOwoKICAvKiogQ3VycmVudCBzdGF0ZSBvZiB0aGUgY29udHJvbGxlci4gKi8KICBpbnQgX3N0YXRlID0gX1NUQVRFX0lOSVRJQUw7CgogIC8qKgogICAqIEZ1dHVyZSBjb21wbGV0ZWQgd2hlbiB0aGUgc3RyZWFtIHNlbmRzIGl0cyBsYXN0IGV2ZW50LgogICAqCiAgICogVGhpcyBpcyBhbHNvIHRoZSBmdXR1cmUgcmV0dXJuZWQgYnkgW2Nsb3NlXS4KICAgKi8KICAvLyBUT0RPKGxybik6IENvdWxkIHRoaXMgYmUgc3RvcmVkIGluIHRoZSB2YXJEYXRhIGZpZWxkIHRvbywgaWYgaXQncyBub3QKICAvLyBhY2Nlc3NlZCB1bnRpbCB0aGUgY2FsbCB0byAiY2xvc2UiPyBUaGVuIHdlIG5lZWQgdG8gc3BlY2lhbCBjYXNlIGlmIGl0J3MKICAvLyBhY2Nlc3NlZCBlYXJsaWVyLCBvciBpZiBjbG9zZSBpcyBjYWxsZWQgYmVmb3JlIHN1YnNjcmliaW5nLgogIF9GdXR1cmUgX2RvbmVGdXR1cmU7CgogIENvbnRyb2xsZXJDYWxsYmFjayBvbkxpc3RlbjsKICBDb250cm9sbGVyQ2FsbGJhY2sgb25QYXVzZTsKICBDb250cm9sbGVyQ2FsbGJhY2sgb25SZXN1bWU7CiAgQ29udHJvbGxlckNhbmNlbENhbGxiYWNrIG9uQ2FuY2VsOwoKICBfU3RyZWFtQ29udHJvbGxlcih0aGlzLm9uTGlzdGVuLCB0aGlzLm9uUGF1c2UsIHRoaXMub25SZXN1bWUsIHRoaXMub25DYW5jZWwpOwoKICAvLyBSZXR1cm4gYSBuZXcgc3RyZWFtIGV2ZXJ5IHRpbWUuIFRoZSBzdHJlYW1zIGFyZSBlcXVhbCwgYnV0IG5vdCBpZGVudGljYWwuCiAgU3RyZWFtPFQ+IGdldCBzdHJlYW0gPT4gbmV3IF9Db250cm9sbGVyU3RyZWFtPFQ+KHRoaXMpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgdmlldyBvZiB0aGlzIG9iamVjdCB0aGF0IG9ubHkgZXhwb3NlcyB0aGUgW1N0cmVhbVNpbmtdIGludGVyZmFjZS4KICAgKi8KICBTdHJlYW1TaW5rPFQ+IGdldCBzaW5rID0+IG5ldyBfU3RyZWFtU2lua1dyYXBwZXI8VD4odGhpcyk7CgogIC8qKgogICAqIFdoZXRoZXIgYSBsaXN0ZW5lciBoYXMgZXhpc3RlZCBhbmQgYmVlbiBjYW5jZWxlZC4KICAgKgogICAqIEFmdGVyIHRoaXMsIGFkZGluZyBtb3JlIGV2ZW50cyB3aWxsIGJlIGlnbm9yZWQuCiAgICovCiAgYm9vbCBnZXQgX2lzQ2FuY2VsZWQgPT4gKF9zdGF0ZSAmIF9TVEFURV9DQU5DRUxFRCkgIT0gMDsKCiAgLyoqIFdoZXRoZXIgdGhlcmUgaXMgYW4gYWN0aXZlIGxpc3RlbmVyLiAqLwogIGJvb2wgZ2V0IGhhc0xpc3RlbmVyID0+IChfc3RhdGUgJiBfU1RBVEVfU1VCU0NSSUJFRCkgIT0gMDsKCiAgLyoqIFdoZXRoZXIgdGhlcmUgaGFzIG5vdCBiZWVuIGEgbGlzdGVuZXIgeWV0LiAqLwogIGJvb2wgZ2V0IF9pc0luaXRpYWxTdGF0ZSA9PgogICAgICAoX3N0YXRlICYgX1NUQVRFX1NVQlNDUklQVElPTl9NQVNLKSA9PSBfU1RBVEVfSU5JVElBTDsKCiAgYm9vbCBnZXQgaXNDbG9zZWQgPT4gKF9zdGF0ZSAmIF9TVEFURV9DTE9TRUQpICE9IDA7CgogIGJvb2wgZ2V0IGlzUGF1c2VkID0+CiAgICAgIGhhc0xpc3RlbmVyID8gX3N1YnNjcmlwdGlvbi5faXNJbnB1dFBhdXNlZCA6ICFfaXNDYW5jZWxlZDsKCiAgYm9vbCBnZXQgX2lzQWRkaW5nU3RyZWFtID0+IChfc3RhdGUgJiBfU1RBVEVfQUREU1RSRUFNKSAhPSAwOwoKICAvKiogTmV3IGV2ZW50cyBtYXkgbm90IGJlIGFkZGVkIGFmdGVyIGNsb3NlLCBvciBkdXJpbmcgYWRkU3RyZWFtLiAqLwogIGJvb2wgZ2V0IF9tYXlBZGRFdmVudCA9PiAoX3N0YXRlIDwgX1NUQVRFX0NMT1NFRCk7CgogIC8vIFJldHVybnMgdGhlIHBlbmRpbmcgZXZlbnRzLgogIC8vIFBlbmRpbmcgZXZlbnRzIGFyZSBldmVudHMgYWRkZWQgYmVmb3JlIGEgc3Vic2NyaXB0aW9uIGV4aXN0cy4KICAvLyBUaGV5IGFyZSBhZGRlZCB0byB0aGUgc3Vic2NyaXB0aW9uIHdoZW4gaXQgaXMgY3JlYXRlZC4KICAvLyBQZW5kaW5nIGV2ZW50cywgaWYgYW55LCBhcmUga2VwdCBpbiB0aGUgX3ZhckRhdGEgZmllbGQgdW50aWwgdGhlCiAgLy8gc3RyZWFtIGlzIGxpc3RlbmVkIHRvLgogIC8vIFdoaWxlIGFkZGluZyBhIHN0cmVhbSwgcGVuZGluZyBldmVudHMgYXJlIG1vdmVkIGludG8gdGhlCiAgLy8gc3RhdGUgb2JqZWN0IHRvIGFsbG93IHRoZSBzdGF0ZSBvYmplY3QgdG8gdXNlIHRoZSBfdmFyRGF0YSBmaWVsZC4KICBfUGVuZGluZ0V2ZW50czxUPiBnZXQgX3BlbmRpbmdFdmVudHMgewogICAgYXNzZXJ0KF9pc0luaXRpYWxTdGF0ZSk7CiAgICBpZiAoIV9pc0FkZGluZ1N0cmVhbSkgewogICAgICByZXR1cm4gX3ZhckRhdGE7CiAgICB9CiAgICBfU3RyZWFtQ29udHJvbGxlckFkZFN0cmVhbVN0YXRlPFQ+IHN0YXRlID0gX3ZhckRhdGE7CiAgICByZXR1cm4gc3RhdGUudmFyRGF0YTsKICB9CgogIC8vIFJldHVybnMgdGhlIHBlbmRpbmcgZXZlbnRzLCBhbmQgY3JlYXRlcyB0aGUgb2JqZWN0IGlmIG5lY2Vzc2FyeS4KICBfU3RyZWFtSW1wbEV2ZW50czxUPiBfZW5zdXJlUGVuZGluZ0V2ZW50cygpIHsKICAgIGFzc2VydChfaXNJbml0aWFsU3RhdGUpOwogICAgaWYgKCFfaXNBZGRpbmdTdHJlYW0pIHsKICAgICAgX3ZhckRhdGEgPz89IG5ldyBfU3RyZWFtSW1wbEV2ZW50czxUPigpOwogICAgICByZXR1cm4gX3ZhckRhdGE7CiAgICB9CiAgICBfU3RyZWFtQ29udHJvbGxlckFkZFN0cmVhbVN0YXRlPFQ+IHN0YXRlID0gX3ZhckRhdGE7CiAgICBpZiAoc3RhdGUudmFyRGF0YSA9PSBudWxsKSBzdGF0ZS52YXJEYXRhID0gbmV3IF9TdHJlYW1JbXBsRXZlbnRzPFQ+KCk7CiAgICByZXR1cm4gc3RhdGUudmFyRGF0YTsKICB9CgogIC8vIEdldCB0aGUgY3VycmVudCBzdWJzY3JpcHRpb24uCiAgLy8gSWYgd2UgYXJlIGFkZGluZyBhIHN0cmVhbSwgdGhlIHN1YnNjcmlwdGlvbiBpcyBtb3ZlZCBpbnRvIHRoZSBzdGF0ZQogIC8vIG9iamVjdCB0byBhbGxvdyB0aGUgc3RhdGUgb2JqZWN0IHRvIHVzZSB0aGUgX3ZhckRhdGEgZmllbGQuCiAgX0NvbnRyb2xsZXJTdWJzY3JpcHRpb248VD4gZ2V0IF9zdWJzY3JpcHRpb24gewogICAgYXNzZXJ0KGhhc0xpc3RlbmVyKTsKICAgIGlmIChfaXNBZGRpbmdTdHJlYW0pIHsKICAgICAgX1N0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW1TdGF0ZTxUPiBhZGRTdGF0ZSA9IF92YXJEYXRhOwogICAgICByZXR1cm4gYWRkU3RhdGUudmFyRGF0YTsKICAgIH0KICAgIHJldHVybiBfdmFyRGF0YTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYW4gZXJyb3IgZGVzY3JpYmluZyB3aHkgYW4gZXZlbnQgY2Fubm90IGJlIGFkZGVkLgogICAqCiAgICogVGhlIHJlYXNvbiwgYW5kIHRoZXJlZm9yZSB0aGUgZXJyb3IgbWVzc2FnZSwgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBzdGF0ZS4KICAgKi8KICBFcnJvciBfYmFkRXZlbnRTdGF0ZSgpIHsKICAgIGlmIChpc0Nsb3NlZCkgewogICAgICByZXR1cm4gbmV3IFN0YXRlRXJyb3IoIkNhbm5vdCBhZGQgZXZlbnQgYWZ0ZXIgY2xvc2luZyIpOwogICAgfQogICAgYXNzZXJ0KF9pc0FkZGluZ1N0cmVhbSk7CiAgICByZXR1cm4gbmV3IFN0YXRlRXJyb3IoIkNhbm5vdCBhZGQgZXZlbnQgd2hpbGUgYWRkaW5nIGEgc3RyZWFtIik7CiAgfQoKICAvLyBTdHJlYW1TaW5rIGludGVyZmFjZS4KICBGdXR1cmUgYWRkU3RyZWFtKFN0cmVhbTxUPiBzb3VyY2UsIHtib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICBpZiAoIV9tYXlBZGRFdmVudCkgdGhyb3cgX2JhZEV2ZW50U3RhdGUoKTsKICAgIGlmIChfaXNDYW5jZWxlZCkgcmV0dXJuIG5ldyBfRnV0dXJlLmltbWVkaWF0ZShudWxsKTsKICAgIF9TdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtU3RhdGU8VD4gYWRkU3RhdGUgPQogICAgICAgIG5ldyBfU3RyZWFtQ29udHJvbGxlckFkZFN0cmVhbVN0YXRlPFQ+KAogICAgICAgICAgICB0aGlzLCBfdmFyRGF0YSwgc291cmNlLCBjYW5jZWxPbkVycm9yID8/IGZhbHNlKTsKICAgIF92YXJEYXRhID0gYWRkU3RhdGU7CiAgICBfc3RhdGUgfD0gX1NUQVRFX0FERFNUUkVBTTsKICAgIHJldHVybiBhZGRTdGF0ZS5hZGRTdHJlYW1GdXR1cmU7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgaXMgY29tcGxldGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBkb25lCiAgICogcHJvY2Vzc2luZyBldmVudHMuCiAgICoKICAgKiBUaGlzIGhhcHBlbnMgZWl0aGVyIHdoZW4gdGhlIGRvbmUgZXZlbnQgaGFzIGJlZW4gc2VudCwgb3IgaWYgdGhlCiAgICogc3Vic2NyaWJlciBvZiBhIHNpbmdsZS1zdWJzY3JpcHRpb24gc3RyZWFtIGlzIGNhbmNlbGxlZC4KICAgKi8KICBGdXR1cmUgZ2V0IGRvbmUgPT4gX2Vuc3VyZURvbmVGdXR1cmUoKTsKCiAgRnV0dXJlIF9lbnN1cmVEb25lRnV0dXJlKCkgewogICAgX2RvbmVGdXR1cmUgPz89IF9pc0NhbmNlbGVkID8gRnV0dXJlLl9udWxsRnV0dXJlIDogbmV3IF9GdXR1cmUoKTsKICAgIHJldHVybiBfZG9uZUZ1dHVyZTsKICB9CgogIC8qKgogICAqIFNlbmQgb3IgZW5xdWV1ZSBhIGRhdGEgZXZlbnQuCiAgICovCiAgdm9pZCBhZGQoVCB2YWx1ZSkgewogICAgaWYgKCFfbWF5QWRkRXZlbnQpIHRocm93IF9iYWRFdmVudFN0YXRlKCk7CiAgICBfYWRkKHZhbHVlKTsKICB9CgogIC8qKgogICAqIFNlbmQgb3IgZW5xdWV1ZSBhbiBlcnJvciBldmVudC4KICAgKi8KICB2b2lkIGFkZEVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIGlmICghX21heUFkZEV2ZW50KSB0aHJvdyBfYmFkRXZlbnRTdGF0ZSgpOwogICAgZXJyb3IgPSBfbm9uTnVsbEVycm9yKGVycm9yKTsKICAgIEFzeW5jRXJyb3IgcmVwbGFjZW1lbnQgPSBab25lLmN1cnJlbnQuZXJyb3JDYWxsYmFjayhlcnJvciwgc3RhY2tUcmFjZSk7CiAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewogICAgICBlcnJvciA9IF9ub25OdWxsRXJyb3IocmVwbGFjZW1lbnQuZXJyb3IpOwogICAgICBzdGFja1RyYWNlID0gcmVwbGFjZW1lbnQuc3RhY2tUcmFjZTsKICAgIH0KICAgIF9hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICAvKioKICAgKiBDbG9zZXMgdGhpcyBjb250cm9sbGVyIGFuZCBzZW5kcyBhIGRvbmUgZXZlbnQgb24gdGhlIHN0cmVhbS4KICAgKgogICAqIFRoZSBmaXJzdCB0aW1lIGEgY29udHJvbGxlciBpcyBjbG9zZWQsIGEgImRvbmUiIGV2ZW50IGlzIGFkZGVkIHRvIGl0cwogICAqIHN0cmVhbS4KICAgKgogICAqIFlvdSBhcmUgYWxsb3dlZCB0byBjbG9zZSB0aGUgY29udHJvbGxlciBtb3JlIHRoYW4gb25jZSwgYnV0IG9ubHkgdGhlIGZpcnN0CiAgICogY2FsbCBoYXMgYW55IGVmZmVjdC4KICAgKgogICAqIEFmdGVyIGNsb3NpbmcsIG5vIGZ1cnRoZXIgZXZlbnRzIG1heSBiZSBhZGRlZCB1c2luZyBbYWRkXSwgW2FkZEVycm9yXQogICAqIG9yIFthZGRTdHJlYW1dLgogICAqCiAgICogVGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2hlbiB0aGUgZG9uZSBldmVudCBoYXMgYmVlbiBkZWxpdmVyZWQuCiAgICovCiAgRnV0dXJlIGNsb3NlKCkgewogICAgaWYgKGlzQ2xvc2VkKSB7CiAgICAgIHJldHVybiBfZW5zdXJlRG9uZUZ1dHVyZSgpOwogICAgfQogICAgaWYgKCFfbWF5QWRkRXZlbnQpIHRocm93IF9iYWRFdmVudFN0YXRlKCk7CiAgICBfY2xvc2VVbmNoZWNrZWQoKTsKICAgIHJldHVybiBfZW5zdXJlRG9uZUZ1dHVyZSgpOwogIH0KCiAgdm9pZCBfY2xvc2VVbmNoZWNrZWQoKSB7CiAgICBfc3RhdGUgfD0gX1NUQVRFX0NMT1NFRDsKICAgIGlmIChoYXNMaXN0ZW5lcikgewogICAgICBfc2VuZERvbmUoKTsKICAgIH0gZWxzZSBpZiAoX2lzSW5pdGlhbFN0YXRlKSB7CiAgICAgIF9lbnN1cmVQZW5kaW5nRXZlbnRzKCkuYWRkKGNvbnN0IF9EZWxheWVkRG9uZSgpKTsKICAgIH0KICB9CgogIC8vIEV2ZW50U2luayBpbnRlcmZhY2UuIFVzZWQgYnkgdGhlIFthZGRTdHJlYW1dIGV2ZW50cy4KCiAgLy8gQWRkIGRhdGEgZXZlbnQsIHVzZWQgYm90aCBieSB0aGUgW2FkZFN0cmVhbV0gZXZlbnRzIGFuZCBieSBbYWRkXS4KICB2b2lkIF9hZGQoVCB2YWx1ZSkgewogICAgaWYgKGhhc0xpc3RlbmVyKSB7CiAgICAgIF9zZW5kRGF0YSh2YWx1ZSk7CiAgICB9IGVsc2UgaWYgKF9pc0luaXRpYWxTdGF0ZSkgewogICAgICBfZW5zdXJlUGVuZGluZ0V2ZW50cygpLmFkZChuZXcgX0RlbGF5ZWREYXRhPFQ+KHZhbHVlKSk7CiAgICB9CiAgfQoKICB2b2lkIF9hZGRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgaWYgKGhhc0xpc3RlbmVyKSB7CiAgICAgIF9zZW5kRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgfSBlbHNlIGlmIChfaXNJbml0aWFsU3RhdGUpIHsKICAgICAgX2Vuc3VyZVBlbmRpbmdFdmVudHMoKS5hZGQobmV3IF9EZWxheWVkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpKTsKICAgIH0KICB9CgogIHZvaWQgX2Nsb3NlKCkgewogICAgLy8gRW5kIG9mIGFkZFN0cmVhbSBzdHJlYW0uCiAgICBhc3NlcnQoX2lzQWRkaW5nU3RyZWFtKTsKICAgIF9TdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtU3RhdGU8VD4gYWRkU3RhdGUgPSBfdmFyRGF0YTsKICAgIF92YXJEYXRhID0gYWRkU3RhdGUudmFyRGF0YTsKICAgIF9zdGF0ZSAmPSB+X1NUQVRFX0FERFNUUkVBTTsKICAgIGFkZFN0YXRlLmNvbXBsZXRlKCk7CiAgfQoKICAvLyBfU3RyZWFtQ29udHJvbGxlckxpZmVDeWNsZSBpbnRlcmZhY2UKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IF9zdWJzY3JpYmUodm9pZCBvbkRhdGEoVCBkYXRhKSwgRnVuY3Rpb24gb25FcnJvciwKICAgICAgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKSB7CiAgICBpZiAoIV9pc0luaXRpYWxTdGF0ZSkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiU3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gbGlzdGVuZWQgdG8uIik7CiAgICB9CiAgICBfQ29udHJvbGxlclN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24gPSBuZXcgX0NvbnRyb2xsZXJTdWJzY3JpcHRpb248VD4oCiAgICAgICAgdGhpcywgb25EYXRhLCBvbkVycm9yLCBvbkRvbmUsIGNhbmNlbE9uRXJyb3IpOwoKICAgIF9QZW5kaW5nRXZlbnRzPFQ+IHBlbmRpbmdFdmVudHMgPSBfcGVuZGluZ0V2ZW50czsKICAgIF9zdGF0ZSB8PSBfU1RBVEVfU1VCU0NSSUJFRDsKICAgIGlmIChfaXNBZGRpbmdTdHJlYW0pIHsKICAgICAgX1N0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW1TdGF0ZTxUPiBhZGRTdGF0ZSA9IF92YXJEYXRhOwogICAgICBhZGRTdGF0ZS52YXJEYXRhID0gc3Vic2NyaXB0aW9uOwogICAgICBhZGRTdGF0ZS5yZXN1bWUoKTsKICAgIH0gZWxzZSB7CiAgICAgIF92YXJEYXRhID0gc3Vic2NyaXB0aW9uOwogICAgfQogICAgc3Vic2NyaXB0aW9uLl9zZXRQZW5kaW5nRXZlbnRzKHBlbmRpbmdFdmVudHMpOwogICAgc3Vic2NyaXB0aW9uLl9ndWFyZENhbGxiYWNrKCgpIHsKICAgICAgX3J1bkd1YXJkZWQob25MaXN0ZW4pOwogICAgfSk7CgogICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICB9CgogIEZ1dHVyZSBfcmVjb3JkQ2FuY2VsKFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pIHsKICAgIC8vIFdoZW4gd2UgY2FuY2VsLCB3ZSBmaXJzdCBjYW5jZWwgYW55IHN0cmVhbSBiZWluZyBhZGRlZCwKICAgIC8vIFRoZW4gd2UgY2FsbCBgb25DYW5jZWxgLCBhbmQgZmluYWxseSB0aGUgX2RvbmVGdXR1cmUgaXMgY29tcGxldGVkLgogICAgLy8gSWYgZWl0aGVyIG9mIGFkZFN0cmVhbSdzIGNhbmNlbCBvciBgb25DYW5jZWxgIHJldHVybnMgYSBmdXR1cmUsCiAgICAvLyB3ZSB3YWl0IGZvciBpdCBiZWZvcmUgY29udGludWluZy4KICAgIC8vIEFueSBlcnJvciBkdXJpbmcgdGhpcyBwcm9jZXNzIGVuZHMgdXAgaW4gdGhlIHJldHVybmVkIGZ1dHVyZS4KICAgIC8vIElmIG1vcmUgZXJyb3JzIGhhcHBlbiwgd2UgYWN0IGFzIGlmIGl0IGhhcHBlbnMgaW5zaWRlIG5lc3RlZCB0cnkvZmluYWxseXMKICAgIC8vIG9yIHdoZW5Db21wbGV0ZSBjYWxscywgYW5kIG9ubHkgdGhlIGxhc3QgZXJyb3IgZW5kcyB1cCBpbiB0aGUKICAgIC8vIHJldHVybmVkIGZ1dHVyZS4KICAgIEZ1dHVyZSByZXN1bHQ7CiAgICBpZiAoX2lzQWRkaW5nU3RyZWFtKSB7CiAgICAgIF9TdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtU3RhdGU8VD4gYWRkU3RhdGUgPSBfdmFyRGF0YTsKICAgICAgcmVzdWx0ID0gYWRkU3RhdGUuY2FuY2VsKCk7CiAgICB9CiAgICBfdmFyRGF0YSA9IG51bGw7CiAgICBfc3RhdGUgPQogICAgICAgIChfc3RhdGUgJiB+KF9TVEFURV9TVUJTQ1JJQkVEIHwgX1NUQVRFX0FERFNUUkVBTSkpIHwgX1NUQVRFX0NBTkNFTEVEOwoKICAgIGlmIChvbkNhbmNlbCAhPSBudWxsKSB7CiAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewogICAgICAgIC8vIE9ubHkgaW50cm9kdWNlIGEgZnV0dXJlIGlmIG9uZSBpcyBuZWVkZWQuCiAgICAgICAgLy8gSWYgX29uQ2FuY2VsIHJldHVybnMgbnVsbCwgbm8gZnV0dXJlIGlzIG5lZWRlZC4KICAgICAgICB0cnkgewogICAgICAgICAgcmVzdWx0ID0gb25DYW5jZWwoKTsKICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAvLyBSZXR1cm4gdGhlIGVycm9yIGluIHRoZSByZXR1cm5lZCBmdXR1cmUuCiAgICAgICAgICAvLyBDb21wbGV0ZSBpdCBhc3luY2hyb25vdXNseSwgc28gdGhlcmUgaXMgdGltZSBmb3IgYSBsaXN0ZW5lcgogICAgICAgICAgLy8gdG8gaGFuZGxlIHRoZSBlcnJvci4KICAgICAgICAgIHJlc3VsdCA9IG5ldyBfRnV0dXJlKCkuLl9hc3luY0NvbXBsZXRlRXJyb3IoZSwgcyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNpbXBsZXIgY2FzZSB3aGVuIHdlIGFscmVhZHkga25vdyB0aGF0IHdlIHdpbGwgcmV0dXJuIGEgZnV0dXJlLgogICAgICAgIHJlc3VsdCA9IHJlc3VsdC53aGVuQ29tcGxldGUob25DYW5jZWwpOwogICAgICB9CiAgICB9CgogICAgdm9pZCBjb21wbGV0ZSgpIHsKICAgICAgaWYgKF9kb25lRnV0dXJlICE9IG51bGwgJiYgX2RvbmVGdXR1cmUuX21heUNvbXBsZXRlKSB7CiAgICAgICAgX2RvbmVGdXR1cmUuX2FzeW5jQ29tcGxldGUobnVsbCk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgcmVzdWx0ID0gcmVzdWx0LndoZW5Db21wbGV0ZShjb21wbGV0ZSk7CiAgICB9IGVsc2UgewogICAgICBjb21wbGV0ZSgpOwogICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIF9yZWNvcmRQYXVzZShTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSB7CiAgICBpZiAoX2lzQWRkaW5nU3RyZWFtKSB7CiAgICAgIF9TdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtU3RhdGU8VD4gYWRkU3RhdGUgPSBfdmFyRGF0YTsKICAgICAgYWRkU3RhdGUucGF1c2UoKTsKICAgIH0KICAgIF9ydW5HdWFyZGVkKG9uUGF1c2UpOwogIH0KCiAgdm9pZCBfcmVjb3JkUmVzdW1lKFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pIHsKICAgIGlmIChfaXNBZGRpbmdTdHJlYW0pIHsKICAgICAgX1N0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW1TdGF0ZTxUPiBhZGRTdGF0ZSA9IF92YXJEYXRhOwogICAgICBhZGRTdGF0ZS5yZXN1bWUoKTsKICAgIH0KICAgIF9ydW5HdWFyZGVkKG9uUmVzdW1lKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9TeW5jU3RyZWFtQ29udHJvbGxlckRpc3BhdGNoPFQ+CiAgICBpbXBsZW1lbnRzIF9TdHJlYW1Db250cm9sbGVyPFQ+LCBTeW5jaHJvbm91c1N0cmVhbUNvbnRyb2xsZXI8VD4gewogIGludCBnZXQgX3N0YXRlOwogIHZvaWQgc2V0IF9zdGF0ZShpbnQgc3RhdGUpOwoKICB2b2lkIF9zZW5kRGF0YShUIGRhdGEpIHsKICAgIF9zdWJzY3JpcHRpb24uX2FkZChkYXRhKTsKICB9CgogIHZvaWQgX3NlbmRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgX3N1YnNjcmlwdGlvbi5fYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgdm9pZCBfc2VuZERvbmUoKSB7CiAgICBfc3Vic2NyaXB0aW9uLl9jbG9zZSgpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX0FzeW5jU3RyZWFtQ29udHJvbGxlckRpc3BhdGNoPFQ+CiAgICBpbXBsZW1lbnRzIF9TdHJlYW1Db250cm9sbGVyPFQ+IHsKICB2b2lkIF9zZW5kRGF0YShUIGRhdGEpIHsKICAgIF9zdWJzY3JpcHRpb24uX2FkZFBlbmRpbmcobmV3IF9EZWxheWVkRGF0YTxUPihkYXRhKSk7CiAgfQoKICB2b2lkIF9zZW5kRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIF9zdWJzY3JpcHRpb24uX2FkZFBlbmRpbmcobmV3IF9EZWxheWVkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpKTsKICB9CgogIHZvaWQgX3NlbmREb25lKCkgewogICAgX3N1YnNjcmlwdGlvbi5fYWRkUGVuZGluZyhjb25zdCBfRGVsYXllZERvbmUoKSk7CiAgfQp9CgovLyBUT0RPKGxybik6IFVzZSBjb21tb24gc3VwZXJjbGFzcyBmb3IgY2FsbGJhY2stY29udHJvbGxlcnMgd2hlbiBWTSBzdXBwb3J0cwovLyBjb25zdHJ1Y3RvcnMgaW4gbWl4aW4gc3VwZXJjbGFzc2VzLgoKY2xhc3MgX0FzeW5jU3RyZWFtQ29udHJvbGxlcjxUPiA9IF9TdHJlYW1Db250cm9sbGVyPFQ+CiAgICB3aXRoIF9Bc3luY1N0cmVhbUNvbnRyb2xsZXJEaXNwYXRjaDxUPjsKCmNsYXNzIF9TeW5jU3RyZWFtQ29udHJvbGxlcjxUPiA9IF9TdHJlYW1Db250cm9sbGVyPFQ+CiAgICB3aXRoIF9TeW5jU3RyZWFtQ29udHJvbGxlckRpc3BhdGNoPFQ+OwoKdHlwZWRlZiBfTm90aWZpY2F0aW9uSGFuZGxlcigpOwoKdm9pZCBfcnVuR3VhcmRlZChfTm90aWZpY2F0aW9uSGFuZGxlciBub3RpZmljYXRpb25IYW5kbGVyKSB7CiAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuOwogIHRyeSB7CiAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7CiAgfSBjYXRjaCAoZSwgcykgewogICAgWm9uZS5jdXJyZW50LmhhbmRsZVVuY2F1Z2h0RXJyb3IoZSwgcyk7CiAgfQp9CgpjbGFzcyBfQ29udHJvbGxlclN0cmVhbTxUPiBleHRlbmRzIF9TdHJlYW1JbXBsPFQ+IHsKICBfU3RyZWFtQ29udHJvbGxlckxpZmVjeWNsZTxUPiBfY29udHJvbGxlcjsKCiAgX0NvbnRyb2xsZXJTdHJlYW0odGhpcy5fY29udHJvbGxlcik7CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBfY3JlYXRlU3Vic2NyaXB0aW9uKHZvaWQgb25EYXRhKFQgZGF0YSksCiAgICAgICAgICBGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3IpID0+CiAgICAgIF9jb250cm9sbGVyLl9zdWJzY3JpYmUob25EYXRhLCBvbkVycm9yLCBvbkRvbmUsIGNhbmNlbE9uRXJyb3IpOwoKICAvLyBPdmVycmlkZSA9PSBhbmQgaGFzaENvZGUgc28gdGhhdCBuZXcgc3RyZWFtcyByZXR1cm5lZCBieSB0aGUgc2FtZQogIC8vIGNvbnRyb2xsZXIgYXJlIGNvbnNpZGVyZWQgZXF1YWwuIFRoZSBjb250cm9sbGVyIHJldHVybnMgYSBuZXcgc3RyZWFtCiAgLy8gZWFjaCB0aW1lIGl0J3MgcXVlcmllZCwgYnV0IGRvZXNuJ3QgaGF2ZSB0byBjYWNoZSB0aGUgcmVzdWx0LgoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9jb250cm9sbGVyLmhhc2hDb2RlIF4gMHgzNTMyMzUzMjsKCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBvdGhlciBpcyBfQ29udHJvbGxlclN0cmVhbSAmJgogICAgICAgIGlkZW50aWNhbChvdGhlci5fY29udHJvbGxlciwgdGhpcy5fY29udHJvbGxlcik7CiAgfQp9CgpjbGFzcyBfQ29udHJvbGxlclN1YnNjcmlwdGlvbjxUPiBleHRlbmRzIF9CdWZmZXJpbmdTdHJlYW1TdWJzY3JpcHRpb248VD4gewogIGZpbmFsIF9TdHJlYW1Db250cm9sbGVyTGlmZWN5Y2xlPFQ+IF9jb250cm9sbGVyOwoKICBfQ29udHJvbGxlclN1YnNjcmlwdGlvbih0aGlzLl9jb250cm9sbGVyLCB2b2lkIG9uRGF0YShUIGRhdGEpLAogICAgICBGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3IpCiAgICAgIDogc3VwZXIob25EYXRhLCBvbkVycm9yLCBvbkRvbmUsIGNhbmNlbE9uRXJyb3IpOwoKICBGdXR1cmUgX29uQ2FuY2VsKCkgewogICAgcmV0dXJuIF9jb250cm9sbGVyLl9yZWNvcmRDYW5jZWwodGhpcyk7CiAgfQoKICB2b2lkIF9vblBhdXNlKCkgewogICAgX2NvbnRyb2xsZXIuX3JlY29yZFBhdXNlKHRoaXMpOwogIH0KCiAgdm9pZCBfb25SZXN1bWUoKSB7CiAgICBfY29udHJvbGxlci5fcmVjb3JkUmVzdW1lKHRoaXMpOwogIH0KfQoKLyoqIEEgY2xhc3MgdGhhdCBleHBvc2VzIG9ubHkgdGhlIFtTdHJlYW1TaW5rXSBpbnRlcmZhY2Ugb2YgYW4gb2JqZWN0LiAqLwpjbGFzcyBfU3RyZWFtU2lua1dyYXBwZXI8VD4gaW1wbGVtZW50cyBTdHJlYW1TaW5rPFQ+IHsKICBmaW5hbCBTdHJlYW1Db250cm9sbGVyIF90YXJnZXQ7CiAgX1N0cmVhbVNpbmtXcmFwcGVyKHRoaXMuX3RhcmdldCk7CiAgdm9pZCBhZGQoVCBkYXRhKSB7CiAgICBfdGFyZ2V0LmFkZChkYXRhKTsKICB9CgogIHZvaWQgYWRkRXJyb3IoT2JqZWN0IGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgX3RhcmdldC5hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICBGdXR1cmUgY2xvc2UoKSA9PiBfdGFyZ2V0LmNsb3NlKCk7CgogIEZ1dHVyZSBhZGRTdHJlYW0oU3RyZWFtPFQ+IHNvdXJjZSkgPT4gX3RhcmdldC5hZGRTdHJlYW0oc291cmNlKTsKCiAgRnV0dXJlIGdldCBkb25lID0+IF90YXJnZXQuZG9uZTsKfQoKLyoqCiAqIE9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSB1c2VkIHRvIGhhbmRsZSBbU3RyZWFtQ29udHJvbGxlci5hZGRTdHJlYW1dLgogKi8KY2xhc3MgX0FkZFN0cmVhbVN0YXRlPFQ+IHsKICAvLyBbX0Z1dHVyZV0gcmV0dXJuZWQgYnkgY2FsbCB0byBhZGRTdHJlYW0uCiAgZmluYWwgX0Z1dHVyZSBhZGRTdHJlYW1GdXR1cmU7CgogIC8vIFN1YnNjcmlwdGlvbiBvbiBzdHJlYW0gYXJndW1lbnQgdG8gYWRkU3RyZWFtLgogIGZpbmFsIFN0cmVhbVN1YnNjcmlwdGlvbiBhZGRTdWJzY3JpcHRpb247CgogIF9BZGRTdHJlYW1TdGF0ZSgKICAgICAgX0V2ZW50U2luazxUPiBjb250cm9sbGVyLCBTdHJlYW08VD4gc291cmNlLCBib29sIGNhbmNlbE9uRXJyb3IpCiAgICAgIDogYWRkU3RyZWFtRnV0dXJlID0gbmV3IF9GdXR1cmUoKSwKICAgICAgICBhZGRTdWJzY3JpcHRpb24gPSBzb3VyY2UubGlzdGVuKGNvbnRyb2xsZXIuX2FkZCwKICAgICAgICAgICAgb25FcnJvcjogY2FuY2VsT25FcnJvcgogICAgICAgICAgICAgICAgPyBtYWtlRXJyb3JIYW5kbGVyKGNvbnRyb2xsZXIpCiAgICAgICAgICAgICAgICA6IGNvbnRyb2xsZXIuX2FkZEVycm9yLAogICAgICAgICAgICBvbkRvbmU6IGNvbnRyb2xsZXIuX2Nsb3NlLAogICAgICAgICAgICBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKCiAgc3RhdGljIG1ha2VFcnJvckhhbmRsZXIoX0V2ZW50U2luayBjb250cm9sbGVyKSA9PiAoZSwgU3RhY2tUcmFjZSBzKSB7CiAgICAgICAgY29udHJvbGxlci5fYWRkRXJyb3IoZSwgcyk7CiAgICAgICAgY29udHJvbGxlci5fY2xvc2UoKTsKICAgICAgfTsKCiAgdm9pZCBwYXVzZSgpIHsKICAgIGFkZFN1YnNjcmlwdGlvbi5wYXVzZSgpOwogIH0KCiAgdm9pZCByZXN1bWUoKSB7CiAgICBhZGRTdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgfQoKICAvKioKICAgKiBTdG9wIGFkZGluZyB0aGUgc3RyZWFtLgogICAqCiAgICogQ29tcGxldGUgdGhlIGZ1dHVyZSByZXR1cm5lZCBieSBgU3RyZWFtQ29udHJvbGxlci5hZGRTdHJlYW1gIHdoZW4KICAgKiB0aGUgY2FuY2VsIGlzIGNvbXBsZXRlLgogICAqCiAgICogUmV0dXJuIGEgZnV0dXJlIGlmIHRoZSBjYW5jZWwgdGFrZXMgdGltZSwgb3RoZXJ3aXNlIHJldHVybiBgbnVsbGAuCiAgICovCiAgRnV0dXJlIGNhbmNlbCgpIHsKICAgIHZhciBjYW5jZWwgPSBhZGRTdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICBpZiAoY2FuY2VsID09IG51bGwpIHsKICAgICAgYWRkU3RyZWFtRnV0dXJlLl9hc3luY0NvbXBsZXRlKG51bGwpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBjYW5jZWwud2hlbkNvbXBsZXRlKCgpIHsKICAgICAgYWRkU3RyZWFtRnV0dXJlLl9hc3luY0NvbXBsZXRlKG51bGwpOwogICAgfSk7CiAgfQoKICB2b2lkIGNvbXBsZXRlKCkgewogICAgYWRkU3RyZWFtRnV0dXJlLl9hc3luY0NvbXBsZXRlKG51bGwpOwogIH0KfQoKY2xhc3MgX1N0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW1TdGF0ZTxUPiBleHRlbmRzIF9BZGRTdHJlYW1TdGF0ZTxUPiB7CiAgLy8gVGhlIHN1YnNjcmlwdGlvbiBvciBwZW5kaW5nIGRhdGEgb2YgYSBfU3Ry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cihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSk7CiAgdm9pZCBfY2xvc2UoKTsKfQoKLyoqCiAqIEFic3RyYWN0IGFuZCBwcml2YXRlIGludGVyZmFjZSBmb3IgYSBwbGFjZSB0byBzZW5kIGV2ZW50cy4KICoKICogVXNlZCBieSBldmVudCBidWZmZXJpbmcgdG8gZmluYWxseSBkaXNwYXRjaCB0aGUgcGVuZGluZyBldmVudCwgd2hlcmUKICogW19FdmVudFNpbmtdIGlzIHdoZXJlIHRoZSBldmVudCBmaXJzdCBlbnRlcnMgdGhlIHN0cmVhbSBzdWJzY3JpcHRpb24sCiAqIGFuZCBtYXkgeWV0IGJlIGJ1ZmZlcmVkLgogKi8KYWJzdHJhY3QgY2xhc3MgX0V2ZW50RGlzcGF0Y2g8VD4gewogIHZvaWQgX3NlbmREYXRhKFQgZGF0YSk7CiAgdm9pZCBfc2VuZEVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKTsKICB2b2lkIF9zZW5kRG9uZSgpOwp9CgovKioKICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBzdHJlYW0gc3Vic2NyaXB0aW9uIG9mIGJ1ZmZlcmluZyBldmVudHMuCiAqCiAqIFRoZSBvbmx5IHB1YmxpYyBtZXRob2RzIGFyZSB0aG9zZSBvZiBbU3RyZWFtU3Vic2NyaXB0aW9uXSwgc28gaW5zdGFuY2VzIG9mCiAqIFtfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uXSBjYW4gYmUgcmV0dXJuZWQgZGlyZWN0bHkgYXMgYQogKiBbU3RyZWFtU3Vic2NyaXB0aW9uXSB3aXRob3V0IGV4cG9zaW5nIGludGVybmFsIGZ1bmN0aW9uYWxpdHkuCiAqCiAqIFRoZSBbU3RyZWFtQ29udHJvbGxlcl0gaXMgYSBwdWJsaWMgZmFjaW5nIHZlcnNpb24gb2YgW1N0cmVhbV0gYW5kIHRoaXMgY2xhc3MsCiAqIHdpdGggc29tZSBtZXRob2RzIG1hZGUgcHVibGljLgogKgogKiBUaGUgdXNlciBpbnRlcmZhY2Ugb2YgW19CdWZmZXJpbmdTdHJlYW1TdWJzY3JpcHRpb25dIGFyZSB0aGUgZm9sbG93aW5nCiAqIG1ldGhvZHM6CiAqCiAqICogW19hZGRdOiBBZGQgYSBkYXRhIGV2ZW50IHRvIHRoZSBzdHJlYW0uCiAqICogW19hZGRFcnJvcl06IEFkZCBhbiBlcnJvciBldmVudCB0byB0aGUgc3RyZWFtLgogKiAqIFtfY2xvc2VdOiBSZXF1ZXN0IHRvIGNsb3NlIHRoZSBzdHJlYW0uCiAqICogW19vbkNhbmNlbF06IENhbGxlZCB3aGVuIHRoZSBzdWJzY3JpcHRpb24gd2lsbCBwcm92aWRlIG5vIG1vcmUgZXZlbnRzLAogKiAgICAgZWl0aGVyIGR1ZSB0byBiZWluZyBhY3RpdmVseSBjYW5jZWxlZCwgb3IgYWZ0ZXIgc2VuZGluZyBhIGRvbmUgZXZlbnQuCiAqICogW19vblBhdXNlXTogQ2FsbGVkIHdoZW4gdGhlIHN1YnNjcmlwdGlvbiB3YW50cyB0aGUgZXZlbnQgc291cmNlIHRvIHBhdXNlLgogKiAqIFtfb25SZXN1bWVdOiBDYWxsZWQgd2hlbiBhbGxvd2luZyBuZXcgZXZlbnRzIGFmdGVyIGEgcGF1c2UuCiAqCiAqIFRoZSB1c2VyIHNob3VsZCBub3QgYWRkIG5ldyBldmVudHMgd2hlbiB0aGUgc3Vic2NyaXB0aW9uIHJlcXVlc3RzIGEgcGF1c2VkLAogKiBidXQgaWYgaXQgaGFwcGVucyBhbnl3YXksIHRoZSBzdWJzY3JpcHRpb24gd2lsbCBlbnF1ZXVlIHRoZSBldmVudHMganVzdCBhcwogKiB3aGVuIG5ldyBldmVudHMgYXJyaXZlIHdoaWxlIHN0aWxsIGZpcmluZyBhbiBvbGQgZXZlbnQuCiAqLwpjbGFzcyBfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uPFQ+CiAgICBpbXBsZW1lbnRzIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiwgX0V2ZW50U2luazxUPiwgX0V2ZW50RGlzcGF0Y2g8VD4gewogIC8qKiBUaGUgYGNhbmNlbE9uRXJyb3JgIGZsYWcgZnJvbSB0aGUgYGxpc3RlbmAgY2FsbC4gKi8KICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9DQU5DRUxfT05fRVJST1IgPSAxOwogIC8qKgogICAqIFdoZXRoZXIgdGhlICJkb25lIiBldmVudCBoYXMgYmVlbiByZWNlaXZlZC4KICAgKiBObyBmdXJ0aGVyIGV2ZW50cyBhcmUgYWNjZXB0ZWQgYWZ0ZXIgdGhpcy4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9DTE9TRUQgPSAyOwogIC8qKgogICAqIFNldCBpZiB0aGUgaW5wdXQgaGFzIGJlZW4gYXNrZWQgbm90IHRvIHNlbmQgZXZlbnRzLgogICAqCiAgICogVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgYmVpbmcgcGF1c2VkLCBzaW5jZSB0aGUgaW5wdXQgd2lsbCByZW1haW4gcGF1c2VkCiAgICogYWZ0ZXIgYSBjYWxsIHRvIFtyZXN1bWVdIGlmIHRoZXJlIGFyZSBwZW5kaW5nIGV2ZW50cy4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9JTlBVVF9QQVVTRUQgPSA0OwogIC8qKgogICAqIFdoZXRoZXIgdGhlIHN1YnNjcmlwdGlvbiBoYXMgYmVlbiBjYW5jZWxlZC4KICAgKgogICAqIFNldCBieSBjYWxsaW5nIFtjYW5jZWxdLCBvciBieSBoYW5kbGluZyBhICJkb25lIiBldmVudCwgb3IgYW4gImVycm9yIiBldmVudAogICAqIHdoZW4gYGNhbmNlbE9uRXJyb3JgIGlzIHRydWUuCiAgICovCiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfQ0FOQ0VMRUQgPSA4OwogIC8qKgogICAqIFNldCB3aGVuIGVpdGhlcjoKICAgKgogICAqICAgKiBhbiBlcnJvciBpcyBzZW50LCBhbmQgW2NhbmNlbE9uRXJyb3JdIGlzIHRydWUsIG9yCiAgICogICAqIGEgZG9uZSBldmVudCBpcyBzZW50LgogICAqCiAgICogSWYgdGhlIHN1YnNjcmlwdGlvbiBpcyBjYW5jZWxlZCB3aGlsZSBfU1RBVEVfV0FJVF9GT1JfQ0FOQ0VMIGlzIHNldCwgdGhlCiAgICogc3RhdGUgaXMgdW5zZXQsIGFuZCBubyBmdXJ0aGVyIGV2ZW50cyBtdXN0IGJlIGRlbGl2ZXJlZC4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9XQUlUX0ZPUl9DQU5DRUwgPSAxNjsKICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9JTl9DQUxMQkFDSyA9IDMyOwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0hBU19QRU5ESU5HID0gNjQ7CiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfUEFVU0VfQ09VTlQgPSAxMjg7CgogIC8qIEV2ZW50IGhhbmRsZXJzIHByb3ZpZGVkIGluIGNvbnN0cnVjdG9yLiAqLwogIF9EYXRhSGFuZGxlcjxUPiBfb25EYXRhOwogIEZ1bmN0aW9uIF9vbkVycm9yOwogIF9Eb25lSGFuZGxlciBfb25Eb25lOwogIGZpbmFsIFpvbmUgX3pvbmUgPSBab25lLmN1cnJlbnQ7CgogIC8qKiBCaXQgdmVjdG9yIGJhc2VkIG9uIHN0YXRlLWNvbnN0YW50cyBhYm92ZS4gKi8KICBpbnQgX3N0YXRlOwoKICAvLyBUT0RPKGZsb2l0c2NoKTogcmV1c2UgYW5vdGhlciBmaWVsZAogIC8qKiBUaGUgZnV0dXJlIFtfb25DYW5jZWxdIG1heSByZXR1cm4uICovCiAgRnV0dXJlIF9jYW5jZWxGdXR1cmU7CgogIC8qKgogICAqIFF1ZXVlIG9mIHBlbmRpbmcgZXZlbnRzLgogICAqCiAgICogSXMgY3JlYXRlZCB3aGVuIG5lY2Vzc2FyeSwgb3Igc2V0IGluIGNvbnN0cnVjdG9yIGZvciBwcmVjb25maWd1cmVkIGV2ZW50cy4KICAgKi8KICBfUGVuZGluZ0V2ZW50czxUPiBfcGVuZGluZzsKCiAgX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbigKICAgICAgdm9pZCBvbkRhdGEoVCBkYXRhKSwgRnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKQogICAgICA6IF9zdGF0ZSA9IChjYW5jZWxPbkVycm9yID8gX1NUQVRFX0NBTkNFTF9PTl9FUlJPUiA6IDApIHsKICAgIHRoaXMub25EYXRhKG9uRGF0YSk7CiAgICB0aGlzLm9uRXJyb3Iob25FcnJvcik7CiAgICB0aGlzLm9uRG9uZShvbkRvbmUpOwogIH0KCiAgLyoqCiAgICogU2V0cyB0aGUgc3Vic2NyaXB0aW9uJ3MgcGVuZGluZyBldmVudHMgb2JqZWN0LgogICAqCiAgICogVGhpcyBjYW4gb25seSBiZSBkb25lIG9uY2UuIFRoZSBwZW5kaW5nIGV2ZW50cyBvYmplY3QgaXMgdXNlZCBmb3IgdGhlCiAgICogcmVzdCBvZiB0aGUgc3Vic2NyaXB0aW9uJ3MgbGlmZSBjeWNsZS4KICAgKi8KICB2b2lkIF9zZXRQZW5kaW5nRXZlbnRzKF9QZW5kaW5nRXZlbnRzPFQ+IHBlbmRpbmdFdmVudHMpIHsKICAgIGFzc2VydChfcGVuZGluZyA9PSBudWxsKTsKICAgIGlmIChwZW5kaW5nRXZlbnRzID09IG51bGwpIHJldHVybjsKICAgIF9wZW5kaW5nID0gcGVuZGluZ0V2ZW50czsKICAgIGlmICghcGVuZGluZ0V2ZW50cy5pc0VtcHR5KSB7CiAgICAgIF9zdGF0ZSB8PSBfU1RBVEVfSEFTX1BFTkRJTkc7CiAgICAgIF9wZW5kaW5nLnNjaGVkdWxlKHRoaXMpOwogICAgfQogIH0KCiAgLy8gU3RyZWFtU3Vic2NyaXB0aW9uIGludGVyZmFjZS4KCiAgdm9pZCBvbkRhdGEodm9pZCBoYW5kbGVEYXRhKFQgZXZlbnQpKSB7CiAgICBoYW5kbGVEYXRhID8/PSBfbnVsbERhdGFIYW5kbGVyOwogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoZSByZXR1cm4gdHlwZSBzaG91bGQgYmUgJ3ZvaWQnLCBhbmQgdGhlIHR5cGUKICAgIC8vIHNob3VsZCBiZSBpbmZlcnJlZC4KICAgIF9vbkRhdGEgPSBfem9uZS5yZWdpc3RlclVuYXJ5Q2FsbGJhY2s8ZHluYW1pYywgVD4oaGFuZGxlRGF0YSk7CiAgfQoKICB2b2lkIG9uRXJyb3IoRnVuY3Rpb24gaGFuZGxlRXJyb3IpIHsKICAgIGhhbmRsZUVycm9yID8/PSBfbnVsbEVycm9ySGFuZGxlcjsKICAgIGlmIChoYW5kbGVFcnJvciBpcyB2b2lkIEZ1bmN0aW9uKE9iamVjdCwgU3RhY2tUcmFjZSkpIHsKICAgICAgX29uRXJyb3IgPSBfem9uZQogICAgICAgICAgLnJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s8ZHluYW1pYywgT2JqZWN0LCBTdGFja1RyYWNlPihoYW5kbGVFcnJvcik7CiAgICB9IGVsc2UgaWYgKGhhbmRsZUVycm9yIGlzIHZvaWQgRnVuY3Rpb24oT2JqZWN0KSkgewogICAgICBfb25FcnJvciA9IF96b25lLnJlZ2lzdGVyVW5hcnlDYWxsYmFjazxkeW5hbWljLCBPYmplY3Q+KGhhbmRsZUVycm9yKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJoYW5kbGVFcnJvciBjYWxsYmFjayBtdXN0IHRha2UgZWl0aGVyIGFuIE9iamVjdCAiCiAgICAgICAgICAiKHRoZSBlcnJvciksIG9yIGJvdGggYW4gT2JqZWN0ICh0aGUgZXJyb3IpIGFuZCBhIFN0YWNrVHJhY2UuIik7CiAgICB9CiAgfQoKICB2b2lkIG9uRG9uZSh2b2lkIGhhbmRsZURvbmUoKSkgewogICAgaGFuZGxlRG9uZSA/Pz0gX251bGxEb25lSGFuZGxlcjsKICAgIF9vbkRvbmUgPSBfem9uZS5yZWdpc3RlckNhbGxiYWNrKGhhbmRsZURvbmUpOwogIH0KCiAgdm9pZCBwYXVzZShbRnV0dXJlIHJlc3VtZVNpZ25hbF0pIHsKICAgIGlmIChfaXNDYW5jZWxlZCkgcmV0dXJuOwogICAgYm9vbCB3YXNQYXVzZWQgPSBfaXNQYXVzZWQ7CiAgICBib29sIHdhc0lucHV0UGF1c2VkID0gX2lzSW5wdXRQYXVzZWQ7CiAgICAvLyBJbmNyZW1lbnQgcGF1c2UgY291bnQgYW5kIG1hcmsgaW5wdXQgcGF1c2VkIChpZiBpdCBpc24ndCBhbHJlYWR5KS4KICAgIF9zdGF0ZSA9IChfc3RhdGUgKyBfU1RBVEVfUEFVU0VfQ09VTlQpIHwgX1NUQVRFX0lOUFVUX1BBVVNFRDsKICAgIGlmIChyZXN1bWVTaWduYWwgIT0gbnVsbCkgcmVzdW1lU2lnbmFsLndoZW5Db21wbGV0ZShyZXN1bWUpOwogICAgaWYgKCF3YXNQYXVzZWQgJiYgX3BlbmRpbmcgIT0gbnVsbCkgX3BlbmRpbmcuY2FuY2VsU2NoZWR1bGUoKTsKICAgIGlmICghd2FzSW5wdXRQYXVzZWQgJiYgIV9pbkNhbGxiYWNrKSBfZ3VhcmRDYWxsYmFjayhfb25QYXVzZSk7CiAgfQoKICB2b2lkIHJlc3VtZSgpIHsKICAgIGlmIChfaXNDYW5jZWxlZCkgcmV0dXJuOwogICAgaWYgKF9pc1BhdXNlZCkgewogICAgICBfZGVjcmVtZW50UGF1c2VDb3VudCgpOwogICAgICBpZiAoIV9pc1BhdXNlZCkgewogICAgICAgIGlmIChfaGFzUGVuZGluZyAmJiAhX3BlbmRpbmcuaXNFbXB0eSkgewogICAgICAgICAgLy8gSW5wdXQgaXMgc3RpbGwgcGF1c2VkLgogICAgICAgICAgX3BlbmRpbmcuc2NoZWR1bGUodGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFzc2VydChfbWF5UmVzdW1lSW5wdXQpOwogICAgICAgICAgX3N0YXRlICY9IH5fU1RBVEVfSU5QVVRfUEFVU0VEOwogICAgICAgICAgaWYgKCFfaW5DYWxsYmFjaykgX2d1YXJkQ2FsbGJhY2soX29uUmVzdW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIEZ1dHVyZSBjYW5jZWwoKSB7CiAgICAvLyBUaGUgdXNlciBkb2Vzbid0IHdhbnQgdG8gcmVjZWl2ZSBhbnkgZnVydGhlciBldmVudHMuIElmIHRoZXJlIGlzIGFuCiAgICAvLyBlcnJvciBvciBkb25lIGV2ZW50IHBlbmRpbmcgKHdhaXRpbmcgZm9yIHRoZSBjYW5jZWwgdG8gYmUgZG9uZSkgZGlzY2FyZAogICAgLy8gdGhhdCBldmVudC4KICAgIF9zdGF0ZSAmPSB+X1NUQVRFX1dBSVRfRk9SX0NBTkNFTDsKICAgIGlmICghX2lzQ2FuY2VsZWQpIHsKICAgICAgX2NhbmNlbCgpOwogICAgfQogICAgcmV0dXJuIF9jYW5jZWxGdXR1cmUgPz8gRnV0dXJlLl9udWxsRnV0dXJlOwogIH0KCiAgRnV0dXJlPEU+IGFzRnV0dXJlPEU+KFtFIGZ1dHVyZVZhbHVlXSkgewogICAgX0Z1dHVyZTxFPiByZXN1bHQgPSBuZXcgX0Z1dHVyZTxFPigpOwoKICAgIC8vIE92ZXJ3cml0ZSB0aGUgb25Eb25lIGFuZCBvbkVycm9yIGhhbmRsZXJzLgogICAgX29uRG9uZSA9ICgpIHsKICAgICAgcmVzdWx0Ll9jb21wbGV0ZShmdXR1cmVWYWx1ZSk7CiAgICB9OwogICAgX29uRXJyb3IgPSAoZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgICBGdXR1cmUgY2FuY2VsRnV0dXJlID0gY2FuY2VsKCk7CiAgICAgIGlmICghaWRlbnRpY2FsKGNhbmNlbEZ1dHVyZSwgRnV0dXJlLl9udWxsRnV0dXJlKSkgewogICAgICAgIGNhbmNlbEZ1dHVyZS53aGVuQ29tcGxldGUoKCkgewogICAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHQuX2NvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9CiAgICB9OwoKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBTdGF0ZSBtYW5hZ2VtZW50LgoKICBib29sIGdldCBfaXNJbnB1dFBhdXNlZCA9PiAoX3N0YXRlICYgX1NUQVRFX0lOUFVUX1BBVVNFRCkgIT0gMDsKICBib29sIGdldCBfaXNDbG9zZWQgPT4gKF9zdGF0ZSAmIF9TVEFURV9DTE9TRUQpICE9IDA7CiAgYm9vbCBnZXQgX2lzQ2FuY2VsZWQgPT4gKF9zdGF0ZSAmIF9TVEFURV9DQU5DRUxFRCkgIT0gMDsKICBib29sIGdldCBfd2FpdHNGb3JDYW5jZWwgPT4gKF9zdGF0ZSAmIF9TVEFURV9XQUlUX0ZPUl9DQU5DRUwpICE9IDA7CiAgYm9vbCBnZXQgX2luQ2FsbGJhY2sgPT4gKF9zdGF0ZSAmIF9TVEFURV9JTl9DQUxMQkFDSykgIT0gMDsKICBib29sIGdldCBfaGFzUGVuZGluZyA9PiAoX3N0YXRlICYgX1NUQVRFX0hBU19QRU5ESU5HKSAhPSAwOwogIGJvb2wgZ2V0IF9pc1BhdXNlZCA9PiBfc3RhdGUgPj0gX1NUQVRFX1BBVVNFX0NPVU5UOwogIGJvb2wgZ2V0IF9jYW5GaXJlID0+IF9zdGF0ZSA8IF9TVEFURV9JTl9DQUxMQkFDSzsKICBib29sIGdldCBfbWF5UmVzdW1lSW5wdXQgPT4KICAgICAgIV9pc1BhdXNlZCAmJiAoX3BlbmRpbmcgPT0gbnVsbCB8fCBfcGVuZGluZy5pc0VtcHR5KTsKICBib29sIGdldCBfY2FuY2VsT25FcnJvciA9PiAoX3N0YXRlICYgX1NUQVRFX0NBTkNFTF9PTl9FUlJPUikgIT0gMDsKCiAgYm9vbCBnZXQgaXNQYXVzZWQgPT4gX2lzUGF1c2VkOwoKICB2b2lkIF9jYW5jZWwoKSB7CiAgICBfc3RhdGUgfD0gX1NUQVRFX0NBTkNFTEVEOwogICAgaWYgKF9oYXNQZW5kaW5nKSB7CiAgICAgIF9wZW5kaW5nLmNhbmNlbFNjaGVkdWxlKCk7CiAgICB9CiAgICBpZiAoIV9pbkNhbGxiYWNrKSBfcGVuZGluZyA9IG51bGw7CiAgICBfY2FuY2VsRnV0dXJlID0gX29uQ2FuY2VsKCk7CiAgfQoKICAvKioKICAgKiBEZWNyZW1lbnRzIHRoZSBwYXVzZSBjb3VudC4KICAgKgogICAqIERvZXMgbm90IGF1dG9tYXRpY2FsbHkgdW5wYXVzZSB0aGUgaW5wdXQgKGNhbGwgW19vblJlc3VtZV0pIHdoZW4KICAgKiB0aGUgcGF1c2UgY291bnQgcmVhY2hlcyB6ZXJvLiBUaGlzIGlzIGhhbmRsZWQgZWxzZXdoZXJlLCBhbmQgb25seQogICAqIGlmIHRoZXJlIGFyZSBubyBwZW5kaW5nIGV2ZW50cyBidWZmZXJlZC4KICAgKi8KICB2b2lkIF9kZWNyZW1lbnRQYXVzZUNvdW50KCkgewogICAgYXNzZXJ0KF9pc1BhdXNlZCk7CiAgICBfc3RhdGUgLT0gX1NUQVRFX1BBVVNFX0NPVU5UOwogIH0KCiAgLy8gX0V2ZW50U2luayBpbnRlcmZhY2UuCgogIHZvaWQgX2FkZChUIGRhdGEpIHsKICAgIGFzc2VydCghX2lzQ2xvc2VkKTsKICAgIGlmIChfaXNDYW5jZWxlZCkgcmV0dXJuOwogICAgaWYgKF9jYW5GaXJlKSB7CiAgICAgIF9zZW5kRGF0YShkYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgIF9hZGRQZW5kaW5nKG5ldyBfRGVsYXllZERhdGE8VD4oZGF0YSkpOwogICAgfQogIH0KCiAgdm9pZCBfYWRkRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIGlmIChfaXNDYW5jZWxlZCkgcmV0dXJuOwogICAgaWYgKF9jYW5GaXJlKSB7CiAgICAgIF9zZW5kRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOyAvLyBSZXBvcnRzIGNhbmNlbCBhZnRlciBzZW5kaW5nLgogICAgfSBlbHNlIHsKICAgICAgX2FkZFBlbmRpbmcobmV3IF9EZWxheWVkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpKTsKICAgIH0KICB9CgogIHZvaWQgX2Nsb3NlKCkgewogICAgYXNzZXJ0KCFfaXNDbG9zZWQpOwogICAgaWYgKF9pc0NhbmNlbGVkKSByZXR1cm47CiAgICBfc3RhdGUgfD0gX1NUQVRFX0NMT1NFRDsKICAgIGlmIChfY2FuRmlyZSkgewogICAgICBfc2VuZERvbmUoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9hZGRQZW5kaW5nKGNvbnN0IF9EZWxheWVkRG9uZSgpKTsKICAgIH0KICB9CgogIC8vIEhvb2tzIGNhbGxlZCB3aGVuIHRoZSBpbnB1dCBpcyBwYXVzZWQsIHVucGF1c2VkIG9yIGNhbmNlbGVkLgogIC8vIFRoZXNlIG11c3Qgbm90IHRocm93LiBJZiBvdmVyd3JpdHRlbiB0byBjYWxsIHVzZXIgY29kZSwgaW5jbHVkZSBzdWl0YWJsZQogIC8vIHRyeS9jYXRjaCB3cmFwcGluZyBhbmQgc2VuZCBhbnkgZXJyb3JzIHRvCiAgLy8gW19ab25lLmN1cnJlbnQuaGFuZGxlVW5jYXVnaHRFcnJvcl0uCiAgdm9pZCBfb25QYXVzZSgpIHsKICAgIGFzc2VydChfaXNJbnB1dFBhdXNlZCk7CiAgfQoKICB2b2lkIF9vblJlc3VtZSgpIHsKICAgIGFzc2VydCghX2lzSW5wdXRQYXVzZWQpOwogIH0KCiAgRnV0dXJlIF9vbkNhbmNlbCgpIHsKICAgIGFzc2VydChfaXNDYW5jZWxlZCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vIEhhbmRsZSBwZW5kaW5nIGV2ZW50cy4KCiAgLyoqCiAgICogQWRkIGEgcGVuZGluZyBldmVudC4KICAgKgogICAqIElmIHRoZSBzdWJzY3JpcHRpb24gaXMgbm90IHBhdXNlZCwgdGhpcyBhbHNvIHNjaGVkdWxlcyBhIGZpcmluZwogICAqIG9mIHBlbmRpbmcgZXZlbnRzIGxhdGVyIChpZiBuZWNlc3NhcnkpLgogICAqLwogIHZvaWQgX2FkZFBlbmRpbmcoX0RlbGF5ZWRFdmVudCBldmVudCkgewogICAgX1N0cmVhbUltcGxFdmVudHM8VD4gcGVuZGluZyA9IF9wZW5kaW5nOwogICAgaWYgKF9wZW5kaW5nID09IG51bGwpIHsKICAgICAgcGVuZGluZyA9IF9wZW5kaW5nID0gbmV3IF9TdHJlYW1JbXBsRXZlbnRzPFQ+KCk7CiAgICB9CiAgICBwZW5kaW5nLmFkZChldmVudCk7CiAgICBpZiAoIV9oYXNQZW5kaW5nKSB7CiAgICAgIF9zdGF0ZSB8PSBfU1RBVEVfSEFTX1BFTkRJTkc7CiAgICAgIGlmICghX2lzUGF1c2VkKSB7CiAgICAgICAgX3BlbmRpbmcuc2NoZWR1bGUodGhpcyk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qIF9FdmVudERpc3BhdGNoIGludGVyZmFjZS4gKi8KCiAgdm9pZCBfc2VuZERhdGEoVCBkYXRhKSB7CiAgICBhc3NlcnQoIV9pc0NhbmNlbGVkKTsKICAgIGFzc2VydCghX2lzUGF1c2VkKTsKICAgIGFzc2VydCghX2luQ2FsbGJhY2spOwogICAgYm9vbCB3YXNJbnB1dFBhdXNlZCA9IF9pc0lucHV0UGF1c2VkOwogICAgX3N0YXRlIHw9IF9TVEFURV9JTl9DQUxMQkFDSzsKICAgIF96b25lLnJ1blVuYXJ5R3VhcmRlZChfb25EYXRhLCBkYXRhKTsKICAgIF9zdGF0ZSAmPSB+X1NUQVRFX0lOX0NBTExCQUNLOwogICAgX2NoZWNrU3RhdGUod2FzSW5wdXRQYXVzZWQpOwogIH0KCiAgdm9pZCBfc2VuZEVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBhc3NlcnQoIV9pc0NhbmNlbGVkKTsKICAgIGFzc2VydCghX2lzUGF1c2VkKTsKICAgIGFzc2VydCghX2luQ2FsbGJhY2spOwogICAgYm9vbCB3YXNJbnB1dFBhdXNlZCA9IF9pc0lucHV0UGF1c2VkOwoKICAgIHZvaWQgc2VuZEVycm9yKCkgewogICAgICAvLyBJZiB0aGUgc3Vic2NyaXB0aW9uIGhhcyBiZWVuIGNhbmNlbGVkIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBjYW5jZWwKICAgICAgLy8gZnV0dXJlIHRvIGZpbmlzaCB3ZSBtdXN0IG5vdCByZXBvcnQgdGhlIGVycm9yLgogICAgICBpZiAoX2lzQ2FuY2VsZWQgJiYgIV93YWl0c0ZvckNhbmNlbCkgcmV0dXJuOwogICAgICBfc3RhdGUgfD0gX1NUQVRFX0lOX0NBTExCQUNLOwogICAgICAvLyBUT0RPKGZsb2l0c2NoKTogdGhpcyBkeW5hbWljIHNob3VsZCBiZSAndm9pZCcuCiAgICAgIHZhciBvbkVycm9yID0gX29uRXJyb3I7CiAgICAgIGlmIChvbkVycm9yIGlzIHZvaWQgRnVuY3Rpb24oT2JqZWN0LCBTdGFja1RyYWNlKSkgewogICAgICAgIF96b25lLnJ1bkJpbmFyeUd1YXJkZWQ8T2JqZWN0LCBTdGFja1RyYWNlPihvbkVycm9yLCBlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KF9vbkVycm9yIGlzIHZvaWQgRnVuY3Rpb24oT2JqZWN0KSk7CiAgICAgICAgX3pvbmUucnVuVW5hcnlHdWFyZGVkPE9iamVjdD4oX29uRXJyb3IsIGVycm9yKTsKICAgICAgfQogICAgICBfc3RhdGUgJj0gfl9TVEFURV9JTl9DQUxMQkFDSzsKICAgIH0KCiAgICBpZiAoX2NhbmNlbE9uRXJyb3IpIHsKICAgICAgX3N0YXRlIHw9IF9TVEFURV9XQUlUX0ZPUl9DQU5DRUw7CiAgICAgIF9jYW5jZWwoKTsKICAgICAgaWYgKF9jYW5jZWxGdXR1cmUgIT0gbnVsbCAmJgogICAgICAgICAgIWlkZW50aWNhbChfY2FuY2VsRnV0dXJlLCBGdXR1cmUuX251bGxGdXR1cmUpKSB7CiAgICAgICAgX2NhbmNlbEZ1dHVyZS53aGVuQ29tcGxldGUoc2VuZEVycm9yKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZW5kRXJyb3IoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgc2VuZEVycm9yKCk7CiAgICAgIC8vIE9ubHkgY2hlY2sgc3RhdGUgaWYgbm90IGNhbmNlbE9uRXJyb3IuCiAgICAgIF9jaGVja1N0YXRlKHdhc0lucHV0UGF1c2VkKTsKICAgIH0KICB9CgogIHZvaWQgX3NlbmREb25lKCkgewogICAgYXNzZXJ0KCFfaXNDYW5jZWxlZCk7CiAgICBhc3NlcnQoIV9pc1BhdXNlZCk7CiAgICBhc3NlcnQoIV9pbkNhbGxiYWNrKTsKCiAgICB2b2lkIHNlbmREb25lKCkgewogICAgICAvLyBJZiB0aGUgc3Vic2NyaXB0aW9uIGhhcyBiZWVuIGNhbmNlbGVkIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBjYW5jZWwKICAgICAgLy8gZnV0dXJlIHRvIGZpbmlzaCB3ZSBtdXN0IG5vdCByZXBvcnQgdGhlIGRvbmUgZXZlbnQuCiAgICAgIGlmICghX3dhaXRzRm9yQ2FuY2VsKSByZXR1cm47CiAgICAgIF9zdGF0ZSB8PSAoX1NUQVRFX0NBTkNFTEVEIHwgX1NUQVRFX0NMT1NFRCB8IF9TVEFURV9JTl9DQUxMQkFDSyk7CiAgICAgIF96b25lLnJ1bkd1YXJkZWQoX29uRG9uZSk7CiAgICAgIF9zdGF0ZSAmPSB+X1NUQVRFX0lOX0NBTExCQUNLOwogICAgfQoKICAgIF9jYW5jZWwoKTsKICAgIF9zdGF0ZSB8PSBfU1RBVEVfV0FJVF9GT1JfQ0FOQ0VMOwogICAgaWYgKF9jYW5jZWxGdXR1cmUgIT0gbnVsbCAmJgogICAgICAgICFpZGVudGljYWwoX2NhbmNlbEZ1dHVyZSwgRnV0dXJlLl9udWxsRnV0dXJlKSkgewogICAgICBfY2FuY2VsRnV0dXJlLndoZW5Db21wbGV0ZShzZW5kRG9uZSk7CiAgICB9IGVsc2UgewogICAgICBzZW5kRG9uZSgpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ2FsbCBhIGhvb2sgZnVuY3Rpb24uCiAgICoKICAgKiBUaGUgY2FsbCBpcyBwcm9wZXJseSB3cmFwcGVkIGluIGNvZGUgdG8gYXZvaWQgb3RoZXIgY2FsbGJhY2tzCiAgICogZHVyaW5nIHRoZSBjYWxsLCBhbmQgaXQgY2hlY2tzIGZvciBzdGF0ZSBjaGFuZ2VzIGFmdGVyIHRoZSBjYWxsCiAgICogdGhhdCBzaG91bGQgY2F1c2UgZnVydGhlciBjYWxsYmFja3MuCiAgICovCiAgdm9pZCBfZ3VhcmRDYWxsYmFjayh2b2lkIGNhbGxiYWNrKCkpIHsKICAgIGFzc2VydCghX2luQ2FsbGJhY2spOwogICAgYm9vbCB3YXNJbnB1dFBhdXNlZCA9IF9pc0lucHV0UGF1c2VkOwogICAgX3N0YXRlIHw9IF9TVEFURV9JTl9DQUxMQkFDSzsKICAgIGNhbGxiYWNrKCk7CiAgICBfc3RhdGUgJj0gfl9TVEFURV9JTl9DQUxMQkFDSzsKICAgIF9jaGVja1N0YXRlKHdhc0lucHV0UGF1c2VkKTsKICB9CgogIC8qKgogICAqIENoZWNrIGlmIHRoZSBpbnB1dCBuZWVkcyB0byBiZSBpbmZvcm1lZCBvZiBzdGF0ZSBjaGFuZ2VzLgogICAqCiAgICogU3RhdGUgY2hhbmdlcyBhcmUgcGF1c2luZywgcmVzdW1pbmcgYW5kIGNhbmNlbGluZy4KICAgKgogICAqIEFmdGVyIGNhbmNlbGluZywgbm8gZnVydGhlciBjYWxsYmFja3Mgd2lsbCBoYXBwZW4uCiAgICoKICAgKiBUaGUgY2FuY2VsIGNhbGxiYWNrIGlzIGNhbGxlZCBhZnRlciBhIHVzZXIgY2FuY2VsLCBvciBhZnRlcgogICAqIHRoZSBmaW5hbCBkb25lIGV2ZW50IGlzIHNlbnQuCiAgICovCiAgdm9pZCBfY2hlY2tTdGF0ZShib29sIHdhc0lucHV0UGF1c2VkKSB7CiAgICBhc3NlcnQoIV9pbkNhbGxiYWNrKTsKICAgIGlmIChfaGFzUGVuZGluZyAmJiBfcGVuZGluZy5pc0VtcHR5KSB7CiAgICAgIF9zdGF0ZSAmPSB+X1NUQVRFX0hBU19QRU5ESU5HOwogICAgICBpZiAoX2lzSW5wdXRQYXVzZWQgJiYgX21heVJlc3VtZUlucHV0KSB7CiAgICAgICAgX3N0YXRlICY9IH5fU1RBVEVfSU5QVVRfUEFVU0VEOwogICAgICB9CiAgICB9CiAgICAvLyBJZiB0aGUgc3RhdGUgY2hhbmdlcyBkdXJpbmcgYSBjYWxsYmFjaywgd2UgaW1tZWRpYXRlbHkKICAgIC8vIG1ha2UgYSBuZXcgc3RhdGUtY2hhbmdlIGNhbGxiYWNrLiBMb29wIHVudGlsIHRoZSBzdGF0ZSBkaWRuJ3QgY2hhbmdlLgogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKF9pc0NhbmNlbGVkKSB7CiAgICAgICAgX3BlbmRpbmcgPSBudWxsOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBib29sIGlzSW5wdXRQYXVzZWQgPSBfaXNJbnB1dFBhdXNlZDsKICAgICAgaWYgKHdhc0lucHV0UGF1c2VkID09IGlzSW5wdXRQYXVzZWQpIGJyZWFrOwogICAgICBfc3RhdGUgXj0gX1NUQVRFX0lOX0NBTExCQUNLOwogICAgICBpZiAoaXNJbnB1dFBhdXNlZCkgewogICAgICAgIF9vblBhdXNlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX29uUmVzdW1lKCk7CiAgICAgIH0KICAgICAgX3N0YXRlICY9IH5fU1RBVEVfSU5fQ0FMTEJBQ0s7CiAgICAgIHdhc0lucHV0UGF1c2VkID0gaXNJbnB1dFBhdXNlZDsKICAgIH0KICAgIGlmIChfaGFzUGVuZGluZyAmJiAhX2lzUGF1c2VkKSB7CiAgICAgIF9wZW5kaW5nLnNjaGVkdWxlKHRoaXMpOwogICAgfQogIH0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBDb21tb24gYmFzZSBjbGFzcyBmb3Igc2luZ2xlIGFuZCBtdWx0aS1zdWJzY3JpcHRpb24gc3RyZWFtcy4KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQphYnN0cmFjdCBjbGFzcyBfU3RyZWFtSW1wbDxUPiBleHRlbmRzIFN0cmVhbTxUPiB7CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gU3RyZWFtIGludGVyZmFjZS4KCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IGxpc3Rlbih2b2lkIG9uRGF0YShUIGRhdGEpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgY2FuY2VsT25FcnJvciA9IGlkZW50aWNhbCh0cnVlLCBjYW5jZWxPbkVycm9yKTsKICAgIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24gPQogICAgICAgIF9jcmVhdGVTdWJzY3JpcHRpb24ob25EYXRhLCBvbkVycm9yLCBvbkRvbmUsIGNhbmNlbE9uRXJyb3IpOwogICAgX29uTGlzdGVuKHN1YnNjcmlwdGlvbik7CiAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8qKiBDcmVhdGUgYSBzdWJzY3JpcHRpb24gb2JqZWN0LiBDYWxsZWQgYnkgW3N1YmNyaWJlXS4gKi8KICBTdHJlYW1TdWJzY3JpcHRpb248VD4gX2NyZWF0ZVN1YnNjcmlwdGlvbih2b2lkIG9uRGF0YShUIGRhdGEpLAogICAgICBGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3IpIHsKICAgIHJldHVybiBuZXcgX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbjxUPigKICAgICAgICBvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvcik7CiAgfQoKICAvKiogSG9vayBjYWxsZWQgd2hlbiB0aGUgc3Vic2NyaXB0aW9uIGhhcyBiZWVuIGNyZWF0ZWQuICovCiAgdm9pZCBfb25MaXN0ZW4oU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbikge30KfQoKdHlwZWRlZiBfUGVuZGluZ0V2ZW50czxUPiBfRXZlbnRHZW5lcmF0b3I8VD4oKTsKCi8qKiBTdHJlYW0gdGhhdCBnZW5lcmF0ZXMgaXRzIG93biBldmVudHMuICovCmNsYXNzIF9HZW5lcmF0ZWRTdHJlYW1JbXBsPFQ+IGV4dGVuZHMgX1N0cmVhbUltcGw8VD4gewogIGZpbmFsIF9FdmVudEdlbmVyYXRvcjxUPiBfcGVuZGluZzsKICBib29sIF9pc1VzZWQgPSBmYWxzZTsKICAvKioKICAgKiBJbml0aWFsaXplcyB0aGUgc3RyZWFtIHRvIGhhdmUgb25seSB0aGUgZXZlbnRzIHByb3ZpZGVkIGJ5IGEKICAgKiBbX1BlbmRpbmdFdmVudHNdLgogICAqCiAgICogQSBuZXcgW19QZW5kaW5nRXZlbnRzXSBtdXN0IGJlIGdlbmVyYXRlZCBmb3IgZWFjaCBsaXN0ZW4uCiAgICovCiAgX0dlbmVyYXRlZFN0cmVhbUltcGwodGhpcy5fcGVuZGluZyk7CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBfY3JlYXRlU3Vic2NyaXB0aW9uKHZvaWQgb25EYXRhKFQgZGF0YSksCiAgICAgIEZ1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcikgewogICAgaWYgKF9pc1VzZWQpIHRocm93IG5ldyBTdGF0ZUVycm9yKCJTdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBsaXN0ZW5lZCB0by4iKTsKICAgIF9pc1VzZWQgPSB0cnVlOwogICAgcmV0dXJuIG5ldyBfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uPFQ+KAogICAgICAgIG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKQogICAgICAuLl9zZXRQZW5kaW5nRXZlbnRzKF9wZW5kaW5nKCkpOwogIH0KfQoKLyoqIFBlbmRpbmcgZXZlbnRzIG9iamVjdCB0aGF0IGdldHMgaXRzIGV2ZW50cyBmcm9tIGFuIFtJdGVyYWJsZV0uICovCmNsYXNzIF9JdGVyYWJsZVBlbmRpbmdFdmVudHM8VD4gZXh0ZW5kcyBfUGVuZGluZ0V2ZW50czxUPiB7CiAgLy8gVGhlIGl0ZXJhdG9yIHByb3ZpZGluZyBkYXRhIGZvciBkYXRhIGV2ZW50cy4KICAvLyBTZXQgdG8gbnVsbCB3aGVuIGl0ZXJhdGlvbiBoYXMgY29tcGxldGVkLgogIEl0ZXJhdG9yPFQ+IF9pdGVyYXRvcjsKCiAgX0l0ZXJhYmxlUGVuZGluZ0V2ZW50cyhJdGVyYWJsZTxUPiBkYXRhKSA6IF9pdGVyYXRvciA9IGRhdGEuaXRlcmF0b3I7CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2l0ZXJhdG9yID09IG51bGw7CgogIHZvaWQgaGFuZGxlTmV4dChfRXZlbnREaXNwYXRjaDxUPiBkaXNwYXRjaCkgewogICAgaWYgKF9pdGVyYXRvciA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJObyBldmVudHMgcGVuZGluZy4iKTsKICAgIH0KICAgIC8vIFNlbmQgb25lIGV2ZW50IHBlciBjYWxsIHRvIG1vdmVOZXh0LgogICAgLy8gSWYgbW92ZU5leHQgcmV0dXJucyB0cnVlLCBzZW5kIHRoZSBjdXJyZW50IGVsZW1lbnQgYXMgZGF0YS4KICAgIC8vIElmIGN1cnJlbnQgdGhyb3dzLCBzZW5kIHRoYXQgZXJyb3IsIGJ1dCBrZWVwIGl0ZXJhdGluZy4KICAgIC8vIElmIG1vdmVOZXh0IHJldHVybnMgZmFsc2UsIHNlbmQgYSBkb25lIGV2ZW50IGFuZCBjbGVhciB0aGUgX2l0ZXJhdG9yLgogICAgLy8gSWYgbW92ZU5leHQgdGhyb3dzIGFuIGVycm9yLCBzZW5kIGFuIGVycm9yIGFuZCBwcmVwYXJlIHRvIHNlbmQgYSBkb25lCiAgICAvLyBldmVudCBhZnRlcndhcmRzLgogICAgYm9vbCBoYXNNb3JlOwogICAgdHJ5IHsKICAgICAgaGFzTW9yZSA9IF9pdGVyYXRvci5tb3ZlTmV4dCgpOwogICAgICBpZiAoaGFzTW9yZSkgewogICAgICAgIGRpc3BhdGNoLl9zZW5kRGF0YShfaXRlcmF0b3IuY3VycmVudCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2l0ZXJhdG9yID0gbnVsbDsKICAgICAgICBkaXNwYXRjaC5fc2VuZERvbmUoKTsKICAgICAgfQogICAgfSBjYXRjaCAoZSwgcykgewogICAgICBpZiAoaGFzTW9yZSA9PSBudWxsKSB7CiAgICAgICAgLy8gVGhyZXcgaW4gLm1vdmVOZXh0KCkuCiAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2Ugc2VuZCBhIGRvbmUgYWZ0ZXJ3YXJkcy4KICAgICAgICBfaXRlcmF0b3IgPSBjb25zdCBFbXB0eUl0ZXJhdG9yPE51bGw+KCk7CiAgICAgICAgZGlzcGF0Y2guX3NlbmRFcnJvcihlLCBzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaHJldyBpbiAuY3VycmVudC4KICAgICAgICBkaXNwYXRjaC5fc2VuZEVycm9yKGUsIHMpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgaWYgKGlzU2NoZWR1bGVkKSBjYW5jZWxTY2hlZHVsZSgpOwogICAgX2l0ZXJhdG9yID0gbnVsbDsKICB9Cn0KCi8vIEludGVybmFsIGhlbHBlcnMuCgovLyBUeXBlcyBvZiB0aGUgZGlmZmVyZW50IGhhbmRsZXJzIG9uIGEgc3RyZWFtLiBUeXBlcyB1c2VkIHRvIHR5cGUgZmllbGRzLgp0eXBlZGVmIHZvaWQgX0RhdGFIYW5kbGVyPFQ+KFQgdmFsdWUpOwp0eXBlZGVmIHZvaWQgX0RvbmVIYW5kbGVyKCk7CgovKiogRGVmYXVsdCBkYXRhIGhhbmRsZXIsIGRvZXMgbm90aGluZy4gKi8Kdm9pZCBfbnVsbERhdGFIYW5kbGVyKE9iamVjdCB2YWx1ZSkge30KCi8qKiBEZWZhdWx0IGVycm9yIGhhbmRsZXIsIHJlcG9ydHMgdGhlIGVycm9yIHRvIHRoZSBjdXJyZW50IHpvbmUncyBoYW5kbGVyLiAqLwp2b2lkIF9udWxsRXJyb3JIYW5kbGVyKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICBab25lLmN1cnJlbnQuaGFuZGxlVW5jYXVnaHRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7Cn0KCi8qKiBEZWZhdWx0IGRvbmUgaGFuZGxlciwgZG9lcyBub3RoaW5nLiAqLwp2b2lkIF9udWxsRG9uZUhhbmRsZXIoKSB7fQoKLyoqIEEgZGVsYXllZCBldmVudCBvbiBhIGJ1ZmZlcmluZyBzdHJlYW0gc3Vic2NyaXB0aW9uLiAqLwphYnN0cmFjdCBjbGFzcyBfRGVsYXllZEV2ZW50PFQ+IHsKICAvKiogQWRkZWQgYXMgYSBsaW5rZWQgbGlzdCBvbiB0aGUgW1N0cmVhbUNvbnRyb2xsZXJdLiAqLwogIF9EZWxheWVkRXZlbnQgbmV4dDsKICAvKiogRXhlY3V0ZSB0aGUgZGVsYXllZCBldmVudCBvbiB0aGUgW1N0cmVhbUNvbnRyb2xsZXJdLiAqLwogIHZvaWQgcGVyZm9ybShfRXZlbnREaXNwYXRjaDxUPiBkaXNwYXRjaCk7Cn0KCi8qKiBBIGRlbGF5ZWQgZGF0YSBldmVudC4gKi8KY2xhc3MgX0RlbGF5ZWREYXRhPFQ+IGV4dGVuZHMgX0RlbGF5ZWRFdmVudDxUPiB7CiAgZmluYWwgVCB2YWx1ZTsKICBfRGVsYXllZERhdGEodGhpcy52YWx1ZSk7CiAgdm9pZCBwZXJmb3JtKF9FdmVudERpc3BhdGNoPFQ+IGRpc3BhdGNoKSB7CiAgICBkaXNwYXRjaC5fc2VuZERhdGEodmFsdWUpOwogIH0KfQoKLyoqIEEgZGVsYXllZCBlcnJvciBldmVudC4gKi8KY2xhc3MgX0RlbGF5ZWRFcnJvciBleHRlbmRzIF9EZWxheWVkRXZlbnQgewogIGZpbmFsIGVycm9yOwogIGZpbmFsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZTsKCiAgX0RlbGF5ZWRFcnJvcih0aGlzLmVycm9yLCB0aGlzLnN0YWNrVHJhY2UpOwogIHZvaWQgcGVyZm9ybShfRXZlbnREaXNwYXRjaCBkaXNwYXRjaCkgewogICAgZGlzcGF0Y2guX3NlbmRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQp9CgovKiogQSBkZWxheWVkIGRvbmUgZXZlbnQuICovCmNsYXNzIF9EZWxheWVkRG9uZSBpbXBsZW1lbnRzIF9EZWxheWVkRXZlbnQgewogIGNvbnN0IF9EZWxheWVkRG9uZSgpOwogIHZvaWQgcGVyZm9ybShfRXZlbnREaXNwYXRjaCBkaXNwYXRjaCkgewogICAgZGlzcGF0Y2guX3NlbmREb25lKCk7CiAgfQoKICBfRGVsYXllZEV2ZW50IGdldCBuZXh0ID0+IG51bGw7CgogIHZvaWQgc2V0IG5leHQoX0RlbGF5ZWRFdmVudCBfKSB7CiAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiTm8gZXZlbnRzIGFmdGVyIGEgZG9uZS4iKTsKICB9Cn0KCi8qKiBTdXBlcmNsYXNzIGZvciBwcm92aWRlciBvZiBwZW5kaW5nIGV2ZW50cy4gKi8KYWJzdHJhY3QgY2xhc3MgX1BlbmRpbmdFdmVudHM8VD4gewogIC8vIE5vIGFzeW5jIGV2ZW50IGhhcyBiZWVuIHNjaGVkdWxlZC4KICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9VTlNDSEVEVUxFRCA9IDA7CiAgLy8gQW4gYXN5bmMgZXZlbnQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHJ1biBhIGZ1bmN0aW9uLgogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX1NDSEVEVUxFRCA9IDE7CiAgLy8gQW4gYXN5bmMgZXZlbnQgaGFzIGJlZW4gc2NoZWR1bGVkLCBidXQgaXQgd2lsbCBkbyBub3RoaW5nIHdoZW4gaXQgcnVucy4KICAvLyBBc3luYyBldmVudHMgY2FuJ3QgYmUgcHJlZW1wdGVkLgogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0NBTkNFTEVEID0gMzsKCiAgLyoqCiAgICogU3RhdGUgb2YgYmVpbmcgc2NoZWR1bGVkLgogICAqCiAgICogU2V0IHRvIFtfU1RBVEVfU0NIRURVTEVEXSB3aGVuIHBlbmRpbmcgZXZlbnRzIGFyZSBzY2hlZHVsZWQgZm9yCiAgICogYXN5bmMgZGlzcGF0Y2guIFNpbmNlIHdlIGNhbid0IGNhbmNlbCBhIFtzY2hlZHVsZU1pY3JvdGFza10gY2FsbCwgaWYKICAgKiBzY2hlZHVsaW5nIGlzICJjYW5jZWxlZCIsIHRoZSBfc3RhdGUgaXMgc2ltcGx5IHNldCB0byBbX1NUQVRFX0NBTkNFTEVEXQogICAqIHdoaWNoIHdpbGwgbWFrZSB0aGUgYXN5bmMgY29kZSBkbyBub3RoaW5nIGV4Y2VwdCByZXNldHRpbmcgW19zdGF0ZV0uCiAgICoKICAgKiBJZiBldmVudHMgYXJlIHNjaGVkdWxlZCB3aGlsZSB0aGUgc3RhdGUgaXMgW19TVEFURV9DQU5DRUxFRF0sIGl0IGlzCiAgICogbWVyZWx5IHN3aXRjaGVkIGJhY2sgdG8gW19TVEFURV9TQ0hFRFVMRURdLCBidXQgbm8gbmV3IGNhbGwgdG8KICAgKiBbc2NoZWR1bGVNaWNyb3Rhc2tdIGlzIHBlcmZvcm1lZC4KICAgKi8KICBpbnQgX3N0YXRlID0gX1NUQVRFX1VOU0NIRURVTEVEOwoKICBib29sIGdldCBpc0VtcHR5OwoKICBib29sIGdldCBpc1NjaGVkdWxlZCA9PiBfc3RhdGUgPT0gX1NUQVRFX1NDSEVEVUxFRDsKICBib29sIGdldCBfZXZlbnRTY2hlZHVsZWQgPT4gX3N0YXRlID49IF9TVEFURV9TQ0hFRFVMRUQ7CgogIC8qKgogICAqIFNjaGVkdWxlIGFuIGV2ZW50IHRvIHJ1biBsYXRlci4KICAgKgogICAqIElmIGNhbGxlZCBtb3JlIHRoYW4gb25jZSwgaXQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBzYW1lIGRpc3BhdGNoIGFzCiAgICogYXJndW1lbnQgZWFjaCB0aW1lLiBJdCBtYXkgcmV1c2UgYW4gZWFybGllciBhcmd1bWVudCBpbiBzb21lIGNhc2VzLgogICAqLwogIHZvaWQgc2NoZWR1bGUoX0V2ZW50RGlzcGF0Y2g8VD4gZGlzcGF0Y2gpIHsKICAgIGlmIChpc1NjaGVkdWxlZCkgcmV0dXJuOwogICAgYXNzZXJ0KCFpc0VtcHR5KTsKICAgIGlmIChfZXZlbnRTY2hlZHVsZWQpIHsKICAgICAgYXNzZXJ0KF9zdGF0ZSA9PSBfU1RBVEVfQ0FOQ0VMRUQpOwogICAgICBfc3RhdGUgPSBfU1RBVEVfU0NIRURVTEVEOwogICAgICByZXR1cm47CiAgICB9CiAgICBzY2hlZHVsZU1pY3JvdGFzaygoKSB7CiAgICAgIGludCBvbGRTdGF0ZSA9IF9zdGF0ZTsKICAgICAgX3N0YXRlID0gX1NUQVRFX1VOU0NIRURVTEVEOwogICAgICBpZiAob2xkU3RhdGUgPT0gX1NUQVRFX0NBTkNFTEVEKSByZXR1cm47CiAgICAgIGhhbmRsZU5leHQoZGlzcGF0Y2gpOwogICAgfSk7CiAgICBfc3RhdGUgPSBfU1RBVEVfU0NIRURVTEVEOwogIH0KCiAgdm9pZCBjYW5jZWxTY2hlZHVsZSgpIHsKICAgIGlmIChpc1NjaGVkdWxlZCkgX3N0YXRlID0gX1NUQVRFX0NBTkNFTEVEOwogIH0KCiAgdm9pZCBoYW5kbGVOZXh0KF9FdmVudERpc3BhdGNoPFQ+IGRpc3BhdGNoKTsKCiAgLyoqIFRocm93IGF3YXkgYW55IHBlbmRpbmcgZXZlbnRzIGFuZCBjYW5jZWwgc2NoZWR1bGVkIGV2ZW50cy4gKi8KICB2b2lkIGNsZWFyKCk7Cn0KCi8qKiBDbGFzcyBob2xkaW5nIHBlbmRpbmcgZXZlbnRzIGZvciBhIFtfU3RyZWFtSW1wbF0uICovCmNsYXNzIF9TdHJlYW1JbXBsRXZlbnRzPFQ+IGV4dGVuZHMgX1BlbmRpbmdFdmVudHM8VD4gewogIC8vLyBTaW5nbGUgbGlua2VkIGxpc3Qgb2YgW19EZWxheWVkRXZlbnRdIG9iamVjdHMuCiAgX0RlbGF5ZWRFdmVudCBmaXJzdFBlbmRpbmdFdmVudDsKCiAgLy8vIExhc3QgZWxlbWVudCBpbiB0aGUgbGlzdCBvZiBwZW5kaW5nIGV2ZW50cy4gTmV3IGV2ZW50cyBhcmUgYWRkZWQgYWZ0ZXIgaXQuCiAgX0RlbGF5ZWRFdmVudCBsYXN0UGVuZGluZ0V2ZW50OwoKICBib29sIGdldCBpc0VtcHR5ID0+IGxhc3RQZW5kaW5nRXZlbnQgPT0gbnVsbDsKCiAgdm9pZCBhZGQoX0RlbGF5ZWRFdmVudCBldmVudCkgewogICAgaWYgKGxhc3RQZW5kaW5nRXZlbnQgPT0gbnVsbCkgewogICAgICBmaXJzdFBlbmRpbmdFdmVudCA9IGxhc3RQZW5kaW5nRXZlbnQgPSBldmVudDsKICAgIH0gZWxzZSB7CiAgICAgIGxhc3RQZW5kaW5nRXZlbnQgPSBsYXN0UGVuZGluZ0V2ZW50Lm5leHQgPSBldmVudDsKICAgIH0KICB9CgogIHZvaWQgaGFuZGxlTmV4dChfRXZlbnREaXNwYXRjaDxUPiBkaXNwYXRjaCkgewogICAgYXNzZXJ0KCFpc1NjaGVkdWxlZCk7CiAgICBfRGVsYXllZEV2ZW50IGV2ZW50ID0gZmlyc3RQZW5kaW5nRXZlbnQ7CiAgICBmaXJzdFBlbmRpbmdFdmVudCA9IGV2ZW50Lm5leHQ7CiAgICBpZiAoZmlyc3RQZW5kaW5nRXZlbnQgPT0gbnVsbCkgewogICAgICBsYXN0UGVuZGluZ0V2ZW50ID0gbnVsbDsKICAgIH0KICAgIGV2ZW50LnBlcmZvcm0oZGlzcGF0Y2gpOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIGlmIChpc1NjaGVkdWxlZCkgY2FuY2VsU2NoZWR1bGUoKTsKICAgIGZpcnN0UGVuZGluZ0V2ZW50ID0gbGFzdFBlbmRpbmdFdmVudCA9IG51bGw7CiAgfQp9Cgp0eXBlZGVmIHZvaWQgX0Jyb2FkY2FzdENhbGxiYWNrPFQ+KFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pOwoKLyoqCiAqIERvbmUgc3Vic2NyaXB0aW9uIHRoYXQgd2lsbCBzZW5kIG9uZSBkb25lIGV2ZW50IGFzIHNvb24gYXMgcG9zc2libGUuCiAqLwpjbGFzcyBfRG9uZVN0cmVhbVN1YnNjcmlwdGlvbjxUPiBpbXBsZW1lbnRzIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiB7CiAgc3RhdGljIGNvbnN0IGludCBfRE9ORV9TRU5UID0gMTsKICBzdGF0aWMgY29uc3QgaW50IF9TQ0hFRFVMRUQgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgX1BBVVNFRCA9IDQ7CgogIGZpbmFsIFpvbmUgX3pvbmU7CiAgaW50IF9zdGF0ZSA9IDA7CiAgX0RvbmVIYW5kbGVyIF9vbkRvbmU7CgogIF9Eb25lU3RyZWFtU3Vic2NyaXB0aW9uKHRoaXMuX29uRG9uZSkgOiBfem9uZSA9IFpvbmUuY3VycmVudCB7CiAgICBfc2NoZWR1bGUoKTsKICB9CgogIGJvb2wgZ2V0IF9pc1NlbnQgPT4gKF9zdGF0ZSAmIF9ET05FX1NFTlQpICE9IDA7CiAgYm9vbCBnZXQgX2lzU2NoZWR1bGVkID0+IChfc3RhdGUgJiBfU0NIRURVTEVEKSAhPSAwOwogIGJvb2wgZ2V0IGlzUGF1c2VkID0+IF9zdGF0ZSA+PSBfUEFVU0VEOwoKICB2b2lkIF9zY2hlZHVsZSgpIHsKICAgIGlmIChfaXNTY2hlZHVsZWQpIHJldHVybjsKICAgIF96b25lLnNjaGVkdWxlTWljcm90YXNrKF9zZW5kRG9uZSk7CiAgICBfc3RhdGUgfD0gX1NDSEVEVUxFRDsKICB9CgogIHZvaWQgb25EYXRhKHZvaWQgaGFuZGxlRGF0YShUIGRhdGEpKSB7fQogIHZvaWQgb25FcnJvcihGdW5jdGlvbiBoYW5kbGVFcnJvcikge30KICB2b2lkIG9uRG9uZSh2b2lkIGhhbmRsZURvbmUoKSkgewogICAgX29uRG9uZSA9IGhhbmRsZURvbmU7CiAgfQoKICB2b2lkIHBhdXNlKFtGdXR1cmUgcmVzdW1lU2lnbmFsXSkgewogICAgX3N0YXRlICs9IF9QQVVTRUQ7CiAgICBpZiAocmVzdW1lU2lnbmFsICE9IG51bGwpIHJlc3VtZVNpZ25hbC53aGVuQ29tcGxldGUocmVzdW1lKTsKICB9CgogIHZvaWQgcmVzdW1lKCkgewogICAgaWYgKGlzUGF1c2VkKSB7CiAgICAgIF9zdGF0ZSAtPSBfUEFVU0VEOwogICAgICBpZiAoIWlzUGF1c2VkICYmICFfaXNTZW50KSB7CiAgICAgICAgX3NjaGVkdWxlKCk7CiAgICAgIH0KICAgIH0KICB9CgogIEZ1dHVyZSBjYW5jZWwoKSA9PiBGdXR1cmUuX251bGxGdXR1cmU7CgogIEZ1dHVyZTxFPiBhc0Z1dHVyZTxFPihbRSBmdXR1cmVWYWx1ZV0pIHsKICAgIF9GdXR1cmU8RT4gcmVzdWx0ID0gbmV3IF9GdXR1cmU8RT4oKTsKICAgIF9vbkRvbmUgPSAoKSB7CiAgICAgIHJlc3VsdC5fY29tcGxldGVXaXRoVmFsdWUoZnV0dXJlVmFsdWUpOwogICAgfTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIF9zZW5kRG9uZSgpIHsKICAgIF9zdGF0ZSAmPSB+X1NDSEVEVUxFRDsKICAgIGlmIChpc1BhdXNlZCkgcmV0dXJuOwogICAgX3N0YXRlIHw9IF9ET05FX1NFTlQ7CiAgICBpZiAoX29uRG9uZSAhPSBudWxsKSBfem9uZS5ydW5HdWFyZGVkKF9vbkRvbmUpOwogIH0KfQoKY2xhc3MgX0FzQnJvYWRjYXN0U3RyZWFtPFQ+IGV4dGVuZHMgU3RyZWFtPFQ+IHsKICBmaW5hbCBTdHJlYW08VD4gX3NvdXJjZTsKICBmaW5hbCBfQnJvYWRjYXN0Q2FsbGJhY2s8VD4gX29uTGlzdGVuSGFuZGxlcjsKICBmaW5hbCBfQnJvYWRjYXN0Q2FsbGJhY2s8VD4gX29uQ2FuY2VsSGFuZGxlcjsKICBmaW5hbCBab25lIF96b25lOwoKICBfQXNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyPFQ+IF9jb250cm9sbGVyOwogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBfc3Vic2NyaXB0aW9uOwoKICBfQXNCcm9hZGNhc3RTdHJlYW0oCiAgICAgIHRoaXMuX3NvdXJjZSwKICAgICAgdm9pZCBvbkxpc3RlbkhhbmRsZXIoU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiksCiAgICAgIHZvaWQgb25DYW5jZWxIYW5kbGVyKFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pKQogICAgICAvLyBUT0RPKGZsb2l0c2NoKTogdGhlIHJldHVybiB0eXBlIHNob3VsZCBiZSB2b2lkIGFuZCBzaG91bGQgYmUKICAgICAgLy8gaW5mZXJyZWQuCiAgICAgIDogX29uTGlzdGVuSGFuZGxlciA9IFpvbmUuY3VycmVudAogICAgICAgICAgICAucmVnaXN0ZXJVbmFyeUNhbGxiYWNrPGR5bmFtaWMsIFN0cmVhbVN1YnNjcmlwdGlvbjxUPj4oCiAgICAgICAgICAgICAgICBvbkxpc3RlbkhhbmRsZXIpLAogICAgICAgIF9vbkNhbmNlbEhhbmRsZXIgPSBab25lLmN1cnJlbnQKICAgICAgICAgICAgLnJlZ2lzdGVyVW5hcnlDYWxsYmFjazxkeW5hbWljLCBTdHJlYW1TdWJzY3JpcHRpb248VD4+KAogICAgICAgICAgICAgICAgb25DYW5jZWxIYW5kbGVyKSwKICAgICAgICBfem9uZSA9IFpvbmUuY3VycmVudCB7CiAgICBfY29udHJvbGxlciA9IG5ldyBfQXNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyPFQ+KF9vbkxpc3RlbiwgX29uQ2FuY2VsKTsKICB9CgogIGJvb2wgZ2V0IGlzQnJvYWRjYXN0ID0+IHRydWU7CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBsaXN0ZW4odm9pZCBvbkRhdGEoVCBkYXRhKSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIGlmIChfY29udHJvbGxlciA9PSBudWxsIHx8IF9jb250cm9sbGVyLmlzQ2xvc2VkKSB7CiAgICAgIC8vIFJldHVybiBhIGR1bW15IHN1YnNjcmlwdGlvbiBiYWNrZWQgYnkgbm90aGluZywgc2luY2UKICAgICAgLy8gaXQgd2lsbCBvbmx5IGV2ZXIgc2VuZCBvbmUgZG9uZSBldmVudC4KICAgICAgcmV0dXJuIG5ldyBfRG9uZVN0cmVhbVN1YnNjcmlwdGlvbjxUPihvbkRvbmUpOwogICAgfQogICAgX3N1YnNjcmlwdGlvbiA/Pz0gX3NvdXJjZS5saXN0ZW4oX2NvbnRyb2xsZXIuYWRkLAogICAgICAgIG9uRXJyb3I6IF9jb250cm9sbGVyLmFkZEVycm9yLCBvbkRvbmU6IF9jb250cm9sbGVyLmNsb3NlKTsKICAgIGNhbmNlbE9uRXJyb3IgPSBpZGVudGljYWwodHJ1ZSwgY2FuY2VsT25FcnJvcik7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuX3N1YnNjcmliZShvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvcik7CiAgfQoKICB2b2lkIF9vbkNhbmNlbCgpIHsKICAgIGJvb2wgc2h1dGRvd24gPSAoX2NvbnRyb2xsZXIgPT0gbnVsbCkgfHwgX2NvbnRyb2xsZXIuaXNDbG9zZWQ7CiAgICBpZiAoX29uQ2FuY2VsSGFuZGxlciAhPSBudWxsKSB7CiAgICAgIF96b25lLnJ1blVuYXJ5KAogICAgICAgICAgX29uQ2FuY2VsSGFuZGxlciwgbmV3IF9Ccm9hZGNhc3RTdWJzY3JpcHRpb25XcmFwcGVyPFQ+KHRoaXMpKTsKICAgIH0KICAgIGlmIChzaHV0ZG93bikgewogICAgICBpZiAoX3N1YnNjcmlwdGlvbiAhPSBudWxsKSB7CiAgICAgICAgX3N1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgICAgICBfc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfb25MaXN0ZW4oKSB7CiAgICBpZiAoX29uTGlzdGVuSGFuZGxlciAhPSBudWxsKSB7CiAgICAgIF96b25lLnJ1blVuYXJ5KAogICAgICAgICAgX29uTGlzdGVuSGFuZGxlciwgbmV3IF9Ccm9hZGNhc3RTdWJzY3JpcHRpb25XcmFwcGVyPFQ+KHRoaXMpKTsKICAgIH0KICB9CgogIC8vIE1ldGhvZHMgY2FsbGVkIGZyb20gX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbldyYXBwZXIuCiAgdm9pZCBfY2FuY2VsU3Vic2NyaXB0aW9uKCkgewogICAgaWYgKF9zdWJzY3JpcHRpb24gPT0gbnVsbCkgcmV0dXJuOwogICAgLy8gQ2FsbGVkIGJ5IFtfY29udHJvbGxlcl0gd2hlbiBpdCBoYXMgbm8gc3Vic2NyaWJlcnMgbGVmdC4KICAgIFN0cmVhbVN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb24gPSBfc3Vic2NyaXB0aW9uOwogICAgX3N1YnNjcmlwdGlvbiA9IG51bGw7CiAgICBfY29udHJvbGxlciA9IG51bGw7IC8vIE1hcmtzIHRoZSBzdHJlYW0gYXMgbm8gbG9uZ2VyIGxpc3RlbmFibGUuCiAgICBzdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgfQoKICB2b2lkIF9wYXVzZVN1YnNjcmlwdGlvbihGdXR1cmUgcmVzdW1lU2lnbmFsKSB7CiAgICBpZiAoX3N1YnNjcmlwdGlvbiA9PSBudWxsKSByZXR1cm47CiAgICBfc3Vic2NyaXB0aW9uLnBhdXNlKHJlc3VtZVNpZ25hbCk7CiAgfQoKICB2b2lkIF9yZXN1bWVTdWJzY3JpcHRpb24oKSB7CiAgICBpZiAoX3N1YnNjcmlwdGlvbiA9PSBudWxsKSByZXR1cm47CiAgICBfc3Vic2NyaXB0aW9uLnJlc3VtZSgpOwogIH0KCiAgYm9vbCBnZXQgX2lzU3Vic2NyaXB0aW9uUGF1c2VkIHsKICAgIGlmIChfc3Vic2NyaXB0aW9uID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfc3Vic2NyaXB0aW9uLmlzUGF1c2VkOwogIH0KfQoKLyoqCiAqIFdyYXBwZXIgZm9yIHN1YnNjcmlwdGlvbiB0aGF0IGRpc2FsbG93cyBjaGFuZ2luZyBoYW5kbGVycy4KICovCmNsYXNzIF9Ccm9hZGNhc3RTdWJzY3JpcHRpb25XcmFwcGVyPFQ+IGltcGxlbWVudHMgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHsKICBmaW5hbCBfQXNCcm9hZGNhc3RTdHJlYW0gX3N0cmVhbTsKCiAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbldyYXBwZXIodGhpcy5fc3RyZWFtKTsKCiAgdm9pZCBvbkRhdGEodm9pZCBoYW5kbGVEYXRhKFQgZGF0YSkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJDYW5ub3QgY2hhbmdlIGhhbmRsZXJzIG9mIGFzQnJvYWRjYXN0U3RyZWFtIHNvdXJjZSBzdWJzY3JpcHRpb24uIik7CiAgfQoKICB2b2lkIG9uRXJyb3IoRnVuY3Rpb24gaGFuZGxlRXJyb3IpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJDYW5ub3QgY2hhbmdlIGhhbmRsZXJzIG9mIGFzQnJvYWRjYXN0U3RyZWFtIHNvdXJjZSBzdWJzY3JpcHRpb24uIik7CiAgfQoKICB2b2lkIG9uRG9uZSh2b2lkIGhhbmRsZURvbmUoKSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkNhbm5vdCBjaGFuZ2UgaGFuZGxlcnMgb2YgYXNCcm9hZGNhc3RTdHJlYW0gc291cmNlIHN1YnNjcmlwdGlvbi4iKTsKICB9CgogIHZvaWQgcGF1c2UoW0Z1dHVyZSByZXN1bWVTaWduYWxdKSB7CiAgICBfc3RyZWFtLl9wYXVzZVN1YnNjcmlwdGlvbihyZXN1bWVTaWduYWwpOwogIH0KCiAgdm9pZCByZXN1bWUoKSB7CiAgICBfc3RyZWFtLl9yZXN1bWVTdWJzY3JpcHRpb24oKTsKICB9CgogIEZ1dHVyZSBjYW5jZWwoKSB7CiAgICBfc3RyZWFtLl9jYW5jZWxTdWJzY3JpcHRpb24oKTsKICAgIHJldHVybiBGdXR1cmUuX251bGxGdXR1cmU7CiAgfQoKICBib29sIGdldCBpc1BhdXNlZCB7CiAgICByZXR1cm4gX3N0cmVhbS5faXNTdWJzY3JpcHRpb25QYXVzZWQ7CiAgfQoKICBGdXR1cmU8RT4gYXNGdXR1cmU8RT4oW0UgZnV0dXJlVmFsdWVdKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQ2Fubm90IGNoYW5nZSBoYW5kbGVycyBvZiBhc0Jyb2FkY2FzdFN0cmVhbSBzb3VyY2Ugc3Vic2NyaXB0aW9uLiIpOwogIH0KfQoKLyoqCiAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBbU3RyZWFtSXRlcmF0b3JdLgogKgogKiBQYXVzZXMgdGhlIHN0cmVhbSBiZXR3ZWVuIGNhbGxzIHRvIFttb3ZlTmV4dF0uCiAqLwpjbGFzcyBfU3RyZWFtSXRlcmF0b3I8VD4gaW1wbGVtZW50cyBTdHJlYW1JdGVyYXRvcjxUPiB7CiAgLy8gVGhlIHN0cmVhbSBpdGVyYXRvciBpcyBhbHdheXMgaW4gb25lIG9mIGZvdXIgc3RhdGVzLgogIC8vIFRoZSB2YWx1ZSBvZiB0aGUgW19zdGF0ZURhdGFdIGZpZWxkIGRlcGVuZHMgb24gdGhlIHN0YXRlLgogIC8vCiAgLy8gV2hlbiBgX3N1YnNjcmlwdGlvbiA9PSBudWxsYCBhbmQgYF9zdGF0ZURhdGEgIT0gbnVsbGA6CiAgLy8gVGhlIHN0cmVhbSBpdGVyYXRvciBoYXMgYmVlbiBjcmVhdGVkLCBidXQgW21vdmVOZXh0XSBoYXMgbm90IGJlZW4gY2FsbGVkCiAgLy8geWV0LiBUaGUgW19zdGF0ZURhdGFdIGZpZWxkIGNvbnRhaW5zIHRoZSBzdHJlYW0gdG8gbGlzdGVuIHRvIG9uIHRoZSBmaXJzdAogIC8vIGNhbGwgdG8gW21vdmVOZXh0XSBhbmQgW2N1cnJlbnRdIHJldHVybnMgYG51bGxgLgogIC8vCiAgLy8gV2hlbiBgX3N1YnNjcmlwdGlvbiAhPSBudWxsYCBhbmQgYCFfaXNQYXVzZWRgOgogIC8vIFRoZSB1c2VyIGhhcyBjYWxsZWQgW21vdmVOZXh0XSBhbmQgdGhlIGl0ZXJhdG9yIGlzIHdhaXRpbmcgZm9yIHRoZSBuZXh0CiAgLy8gZXZlbnQuIFRoZSBbX3N0YXRlRGF0YV0gZmllbGQgY29udGFpbnMgdGhlIFtfRnV0dXJlXSByZXR1cm5lZCBieSB0aGUKICAvLyBbX21vdmVOZXh0XSBjYWxsIGFuZCBbY3VycmVudF0gcmV0dXJucyBgbnVsbC5gCiAgLy8KICAvLyBXaGVuIGBfc3Vic2NyaXB0aW9uICE9IG51bGxgIGFuZCBgX2lzUGF1c2VkYDoKICAvLyBUaGUgbW9zdCByZWNlbnQgY2FsbCB0byBbbW92ZU5leHRdIGhhcyBjb21wbGV0ZWQgd2l0aCBhIGB0cnVlYCB2YWx1ZQogIC8vIGFuZCBbY3VycmVudF0gcHJvdmlkZXMgdGhlIHZhbHVlIG9mIHRoZSBkYXRhIGV2ZW50LgogIC8vIFRoZSBbX3N0YXRlRGF0YV0gZmllbGQgY29udGFpbnMgdGhlIFtjdXJyZW50XSB2YWx1ZS4KICAvLwogIC8vIFdoZW4gYF9zdWJzY3JpcHRpb24gPT0gbnVsbGAgYW5kIGBfc3RhdGVEYXRhID09IG51bGxgOgogIC8vIFRoZSBzdHJlYW0gaGFzIGNvbXBsZXRlZCBvciBiZWVuIGNhbmNlbGVkIHVzaW5nIFtjYW5jZWxdLgogIC8vIFRoZSBzdHJlYW0gY29tcGxldGVzIG9uIGVpdGhlciBhIGRvbmUgZXZlbnQgb3IgYW4gZXJyb3IgZXZlbnQuCiAgLy8gVGhlIGxhc3QgY2FsbCB0byBbbW92ZU5leHRdIGhhcyBjb21wbGV0ZWQgd2l0aCBgZmFsc2VgIGFuZCBbY3VycmVudF0KICAvLyByZXR1cm5zIGBudWxsYC4KCiAgLy8vIFN1YnNjcmlwdGlvbiBiZWluZyBsaXN0ZW5lZCB0by4KICAvLy8KICAvLy8gU2V0IHRvIGBudWxsYCB3aGVuIHRoZSBzdHJlYW0gc3Vic2NyaXB0aW9uIGlzIGRvbmUgb3IgY2FuY2VsZWQuCiAgU3RyZWFtU3Vic2NyaXB0aW9uIF9zdWJzY3JpcHRpb247CgogIC8vLyBEYXRhIHZhbHVlIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzdGF0ZS4KICAvLy8KICAvLy8gQmVmb3JlIGZpcnN0IGNhbGwgdG8gW21vdmVOZXh0XTogVGhlIHN0cmVhbSB0byBsaXN0ZW4gdG8uCiAgLy8vCiAgLy8vIEFmdGVyIGNhbGxpbmcgW21vdmVOZXh0XSBidXQgYmVmb3JlIHRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzOgogIC8vLyBUaGUgcmV0dXJuZWQgZnV0dXJlLgogIC8vLwogIC8vLyBBZnRlciBjYWxsaW5nIFttb3ZlTmV4dF0gYW5kIHRoZSByZXR1cm5lZCBmdXR1cmUgaGFzIGNvbXBsZXRlZAogIC8vLyB3aXRoIGB0cnVlYDogVGhlIHZhbHVlIG9mIFtjdXJyZW50XS4KICAvLy8KICAvLy8gQWZ0ZXIgY2FsbGluZyBbbW92ZU5leHRdIGFuZCB0aGUgcmV0dXJuZWQgZnV0dXJlIGhhcyBjb21wbGV0ZWQKICAvLy8gd2l0aCBgZmFsc2VgLCBvciBhZnRlciBjYWxsaW5nIFtjYW5jZWxdOiBgbnVsbGAuCiAgT2JqZWN0IF9zdGF0ZURhdGE7CgogIC8vLyBXaGV0aGVyIHRoZSBpdGVyYXRvciBpcyBiZXR3ZWVuIGNhbGxzIHRvIGBtb3ZlTmV4dGAuCiAgLy8vIFRoaXMgd2lsbCB1c3VhbGx5IGNhdXNlIHRoZSBbX3N1YnNjcmlwdGlvbl0gdG8gYmUgcGF1c2VkLCBidXQgYXMgYW4KICAvLy8gb3B0aW1pemF0aW9uLCB3ZSBvbmx5IHBhdXNlIGFmdGVyIHRoZSBbbW92ZU5leHRdIGZ1dHVyZSBoYXMgYmVlbgogIC8vLyBjb21wbGV0ZWQuCiAgYm9vbCBfaXNQYXVzZWQgPSBmYWxzZTsKCiAgX1N0cmVhbUl0ZXJhdG9yKGZpbmFsIFN0cmVhbTxUPiBzdHJlYW0pCiAgICAgIDogX3N0YXRlRGF0YSA9IHN0cmVhbSA/PyAodGhyb3cgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJzdHJlYW0iKSk7CgogIFQgZ2V0IGN1cnJlbnQgewogICAgaWYgKF9zdWJzY3JpcHRpb24gIT0gbnVsbCAmJiBfaXNQYXVzZWQpIHsKICAgICAgcmV0dXJuIF9zdGF0ZURhdGE7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEZ1dHVyZTxib29sPiBtb3ZlTmV4dCgpIHsKICAgIGlmIChfc3Vic2NyaXB0aW9uICE9IG51bGwpIHsKICAgICAgaWYgKF9pc1BhdXNlZCkgewogICAgICAgIHZhciBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxib29sPigpOwogICAgICAgIF9zdGF0ZURhdGEgPSBmdXR1cmU7CiAgICAgICAgX2lzUGF1c2VkID0gZmFsc2U7CiAgICAgICAgX3N1YnNjcmlwdGlvbi5yZXN1bWUoKTsKICAgICAgICByZXR1cm4gZnV0dXJlOwogICAgICB9CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJBbHJlYWR5IHdhaXRpbmcgZm9yIG5leHQuIik7CiAgICB9CiAgICByZXR1cm4gX2luaXRpYWxpemVPckRvbmUoKTsKICB9CgogIC8vLyBDYWxsZWQgaWYgdGhlcmUgaXMgbm8gYWN0aXZlIHN1YnNjcmlwdGlvbiB3aGVuIFttb3ZlTmV4dF0gaXMgY2FsbGVkLgogIC8vLwogIC8vLyBFaXRoZXIgc3RhcnRzIGxpc3RlbmluZyBvbiB0aGUgc3RyZWFtIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgdG8KICAvLy8gW21vdmVOZXh0XSwgb3IgcmV0dXJucyBhIGBmYWxzZWAgZnV0dXJlIGJlY2F1c2UgdGhlIHN0cmVhbSBoYXMgYWxyZWFkeQogIC8vLyBlbmRlZC4KICBGdXR1cmU8Ym9vbD4gX2luaXRpYWxpemVPckRvbmUoKSB7CiAgICBhc3NlcnQoX3N1YnNjcmlwdGlvbiA9PSBudWxsKTsKICAgIHZhciBzdGF0ZURhdGEgPSBfc3RhdGVEYXRhOwogICAgaWYgKHN0YXRlRGF0YSAhPSBudWxsKSB7CiAgICAgIFN0cmVhbTxUPiBzdHJlYW0gPSBzdGF0ZURhdGE7CiAgICAgIF9zdWJzY3JpcHRpb24gPSBzdHJlYW0ubGlzdGVuKF9vbkRhdGEsCiAgICAgICAgICBvbkVycm9yOiBfb25FcnJvciwgb25Eb25lOiBfb25Eb25lLCBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgICAgdmFyIGZ1dHVyZSA9IG5ldyBfRnV0dXJlPGJvb2w+KCk7CiAgICAgIF9zdGF0ZURhdGEgPSBmdXR1cmU7CiAgICAgIHJldHVybiBmdXR1cmU7CiAgICB9CiAgICByZXR1cm4gRnV0dXJlLl9mYWxzZUZ1dHVyZTsKICB9CgogIEZ1dHVyZSBjYW5jZWwoKSB7CiAgICBTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0gX3N1YnNjcmlwdGlvbjsKICAgIE9iamVjdCBzdGF0ZURhdGEgPSBfc3RhdGVEYXRhOwogICAgX3N0YXRlRGF0YSA9IG51bGw7CiAgICBpZiAoc3Vic2NyaXB0aW9uICE9IG51bGwpIHsKICAgICAgX3N1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgIGlmICghX2lzUGF1c2VkKSB7CiAgICAgICAgX0Z1dHVyZTxib29sPiBmdXR1cmUgPSBzdGF0ZURhdGE7CiAgICAgICAgZnV0dXJlLl9hc3luY0NvbXBsZXRlKGZhbHNlKTsKICAgICAgfQogICAgICByZXR1cm4gc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgfQogICAgcmV0dXJuIEZ1dHVyZS5fbnVsbEZ1dHVyZTsKICB9CgogIHZvaWQgX29uRGF0YShUIGRhdGEpIHsKICAgIGFzc2VydChfc3Vic2NyaXB0aW9uICE9IG51bGwgJiYgIV9pc1BhdXNlZCk7CiAgICBfRnV0dXJlPGJvb2w+IG1vdmVOZXh0RnV0dXJlID0gX3N0YXRlRGF0YTsKICAgIF9zdGF0ZURhdGEgPSBkYXRhOwogICAgX2lzUGF1c2VkID0gdHJ1ZTsKICAgIG1vdmVOZXh0RnV0dXJlLl9jb21wbGV0ZSh0cnVlKTsKICAgIGlmIChfc3Vic2NyaXB0aW9uICE9IG51bGwgJiYgX2lzUGF1c2VkKSBfc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgfQoKICB2b2lkIF9vbkVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIGFzc2VydChfc3Vic2NyaXB0aW9uICE9IG51bGwgJiYgIV9pc1BhdXNlZCk7CiAgICBfRnV0dXJlPGJvb2w+IG1vdmVOZXh0RnV0dXJlID0gX3N0YXRlRGF0YTsKICAgIF9zdWJzY3JpcHRpb24gPSBudWxsOwogICAgX3N0YXRlRGF0YSA9IG51bGw7CiAgICBtb3ZlTmV4dEZ1dHVyZS5fY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICB2b2lkIF9vbkRvbmUoKSB7CiAgICBhc3NlcnQoX3N1YnNjcmlwdGlvbiAhPSBudWxsICYmICFfaXNQYXVzZWQpOwogICAgX0Z1dHVyZTxib29sPiBtb3ZlTmV4dEZ1dHVyZSA9IF9zdGF0ZURhdGE7CiAgICBfc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgIF9zdGF0ZURhdGEgPSBudWxsOwogICAgbW92ZU5leHRGdXR1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ZCB0YWtlcyBhY3Rpb25zIGRlcGVuZGluZyBvbiBzdWNjZXNzIG9yIGZhaWx1cmUuICovCl9ydW5Vc2VyQ29kZTxUPigKICAgIFQgdXNlckNvZGUoKSwgb25TdWNjZXNzKFQgdmFsdWUpLCBvbkVycm9yKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpKSB7CiAgdHJ5IHsKICAgIG9uU3VjY2Vzcyh1c2VyQ29kZSgpKTsKICB9IGNhdGNoIChlLCBzKSB7CiAgICBBc3luY0Vycm9yIHJlcGxhY2VtZW50ID0gWm9uZS5jdXJyZW50LmVycm9yQ2FsbGJhY2soZSwgcyk7CiAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCkgewogICAgICBvbkVycm9yKGUsIHMpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGVycm9yID0gX25vbk51bGxFcnJvcihyZXBsYWNlbWVudC5lcnJvcik7CiAgICAgIHZhciBzdGFja1RyYWNlID0gcmVwbGFjZW1lbnQuc3RhY2tUcmFjZTsKICAgICAgb25FcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICB9CiAgfQp9CgovKiogSGVscGVyIGZ1bmN0aW9uIHRvIGNhbmNlbCBhIHN1YnNjcmlwdGlvbiBhbmQgd2FpdCBmb3IgdGhlIHBvdGVudGlhbCBmdXR1cmUsCiAgYmVmb3JlIGNvbXBsZXRpbmcgd2l0aCBhbiBlcnJvci4gKi8Kdm9pZCBfY2FuY2VsQW5kRXJyb3IoU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbiwgX0Z1dHVyZSBmdXR1cmUsIGVycm9yLAogICAgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgdmFyIGNhbmNlbEZ1dHVyZSA9IHN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICBpZiAoY2FuY2VsRnV0dXJlICE9IG51bGwgJiYgIWlkZW50aWNhbChjYW5jZWxGdXR1cmUsIEZ1dHVyZS5fbnVsbEZ1dHVyZSkpIHsKICAgIGNhbmNlbEZ1dHVyZS53aGVuQ29tcGxldGUoKCkgPT4gZnV0dXJlLl9jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKSk7CiAgfSBlbHNlIHsKICAgIGZ1dHVyZS5fY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQp9Cgp2b2lkIF9jYW5jZWxBbmRFcnJvcldpdGhSZXBsYWNlbWVudChTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uLAogICAgX0Z1dHVyZSBmdXR1cmUsIGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICBBc3luY0Vycm9yIHJlcGxhY2VtZW50ID0gWm9uZS5jdXJyZW50LmVycm9yQ2FsbGJhY2soZXJyb3IsIHN0YWNrVHJhY2UpOwogIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CiAgICBlcnJvciA9IF9ub25OdWxsRXJyb3IocmVwbGFjZW1lbnQuZXJyb3IpOwogICAgc3RhY2tUcmFjZSA9IHJlcGxhY2VtZW50LnN0YWNrVHJhY2U7CiAgfQogIF9jYW5jZWxBbmRFcnJvcihzdWJzY3JpcHRpb24sIGZ1dHVyZSwgZXJyb3IsIHN0YWNrVHJhY2UpOwp9Cgp0eXBlZGVmIHZvaWQgX0Vycm9yQ2FsbGJhY2soZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSk7CgovKiogSGVscGVyIGZ1bmN0aW9uIHRvIG1ha2UgYW4gb25FcnJvciBhcmd1bWVudCB0byBbX3J1blVzZXJDb2RlXS4gKi8KX0Vycm9yQ2FsbGJhY2sgX2NhbmNlbEFuZEVycm9yQ2xvc3VyZSgKICAgIFN0cmVhbVN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb24sIF9GdXR1cmUgZnV0dXJlKSB7CiAgcmV0dXJuIChlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBfY2FuY2VsQW5kRXJyb3Ioc3Vic2NyaXB0aW9uLCBmdXR1cmUsIGVycm9yLCBzdGFja1RyYWNlKTsKICB9Owp9CgovKiogSGVscGVyIGZ1bmN0aW9uIHRvIGNhbmNlbCBhIHN1YnNjcmlwdGlvbiBhbmQgd2FpdCBmb3IgdGhlIHBvdGVudGlhbCBmdXR1cmUsCiAgYmVmb3JlIGNvbXBsZXRpbmcgd2l0aCBhIHZhbHVlLiAqLwp2b2lkIF9jYW5jZWxBbmRWYWx1ZShTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uLCBfRnV0dXJlIGZ1dHVyZSwgdmFsdWUpIHsKICB2YXIgY2FuY2VsRnV0dXJlID0gc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogIGlmIChjYW5jZWxGdXR1cmUgIT0gbnVsbCAmJiAhaWRlbnRpY2FsKGNhbmNlbEZ1dHVyZSwgRnV0dXJlLl9udWxsRnV0dXJlKSkgewogICAgY2FuY2VsRnV0dXJlLndoZW5Db21wbGV0ZSgoKSA9PiBmdXR1cmUuX2NvbXBsZXRlKHZhbHVlKSk7CiAgfSBlbHNlIHsKICAgIGZ1dHVyZS5fY29tcGxldGUodmFsdWUpOwogIH0KfQoKLyoqCiAqIEEgW1N0cmVhbV0gdGhhdCBmb3J3YXJkcyBzdWJzY3JpcHRpb25zIHRvIGFub3RoZXIgc3RyZWFtLgogKgogKiBUaGlzIHN0cmVhbSBpbXBsZW1lbnRzIFtTdHJlYW1dLCBidXQgZm9yd2FyZHMgYWxsIHN1YnNjcmlwdGlvbnMKICogdG8gYW4gdW5kZXJseWluZyBzdHJlYW0sIGFuZCB3cmFwcyB0aGUgcmV0dXJuZWQgc3Vic2NyaXB0aW9uIHRvCiAqIG1vZGlmeSB0aGUgZXZlbnRzIG9uIHRoZSB3YXkuCiAqCiAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LgogKi8KYWJzdHJhY3QgY2xhc3MgX0ZvcndhcmRpbmdTdHJlYW08UywgVD4gZXh0ZW5kcyBTdHJlYW08VD4gewogIGZpbmFsIFN0cmVhbTxTPiBfc291cmNlOwoKICBfRm9yd2FyZGluZ1N0cmVhbSh0aGlzLl9zb3VyY2UpOwoKICBib29sIGdldCBpc0Jyb2FkY2FzdCA9PiBfc291cmNlLmlzQnJvYWRjYXN0OwoKICBTdHJlYW1TdWJzY3JpcHRpb248VD4gbGlzdGVuKHZvaWQgb25EYXRhKFQgdmFsdWUpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgY2FuY2VsT25FcnJvciA9IGlkZW50aWNhbCh0cnVlLCBjYW5jZWxPbkVycm9yKTsKICAgIHJldHVybiBfY3JlYXRlU3Vic2NyaXB0aW9uKG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKTsKICB9CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBfY3JlYXRlU3Vic2NyaXB0aW9uKHZvaWQgb25EYXRhKFQgZGF0YSksCiAgICAgIEZ1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcikgewogICAgcmV0dXJuIG5ldyBfRm9yd2FyZGluZ1N0cmVhbVN1YnNjcmlwdGlvbjxTLCBUPigKICAgICAgICB0aGlzLCBvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvcik7CiAgfQoKICAvLyBPdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgaW4gc3ViY2xhc3NlcyB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yLgoKICB2b2lkIF9oYW5kbGVEYXRhKFMgZGF0YSwgX0V2ZW50U2luazxUPiBzaW5rKSB7CiAgICBzaW5rLl9hZGQoZGF0YSBhcyBPYmplY3QpOwogIH0KCiAgdm9pZCBfaGFuZGxlRXJyb3IoZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSwgX0V2ZW50U2luazxUPiBzaW5rKSB7CiAgICBzaW5rLl9hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICB2b2lkIF9oYW5kbGVEb25lKF9FdmVudFNpbms8VD4gc2luaykgewogICAgc2luay5fY2xvc2UoKTsKICB9Cn0KCi8qKgogKiBBYnN0cmFjdCBzdXBlcmNsYXNzIGZvciBzdWJzY3JpcHRpb25zIHRoYXQgZm9yd2FyZCB0byBvdGhlciBzdWJzY3JpcHRpb25zLgogKi8KY2xhc3MgX0ZvcndhcmRpbmdTdHJlYW1TdWJzY3JpcHRpb248UywgVD4KICAgIGV4dGVuZHMgX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbjxUPiB7CiAgZmluYWwgX0ZvcndhcmRpbmdTdHJlYW08UywgVD4gX3N0cmVhbTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFM+IF9zdWJzY3JpcHRpb247CgogIF9Gb3J3YXJkaW5nU3RyZWFtU3Vic2NyaXB0aW9uKHRoaXMuX3N0cmVhbSwgdm9pZCBvbkRhdGEoVCBkYXRhKSwKICAgICAgRnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKQogICAgICA6IHN1cGVyKG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKSB7CiAgICBfc3Vic2NyaXB0aW9uID0gX3N0cmVhbS5fc291cmNlCiAgICAgICAgLmxpc3RlbihfaGFuZGxlRGF0YSwgb25FcnJvcjogX2hhbmRsZUVycm9yLCBvbkRvbmU6IF9oYW5kbGVEb25lKTsKICB9CgogIC8vIF9TdHJlYW1TaW5rIGludGVyZmFjZS4KICAvLyBUcmFuc2Zvcm1lcnMgc2VuZGluZyBtb3JlIHRoYW4gb25lIGV2ZW50IGhhdmUgbm8gd2F5IHRvIGtub3cgaWYgdGhlIHN0cmVhbQogIC8vIGlzIGNhbmNlbGVkIG9yIGNsb3NlZCBhZnRlciB0aGUgZmlyc3QsIHNvIHdlIGp1c3QgaWdub3JlIHJlbWFpbmluZyBldmVudHMuCgogIHZvaWQgX2FkZChUIGRhdGEpIHsKICAgIGlmIChfaXNDbG9zZWQpIHJldHVybjsKICAgIHN1cGVyLl9hZGQoZGF0YSk7CiAgfQoKICB2b2lkIF9hZGRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgaWYgKF9pc0Nsb3NlZCkgcmV0dXJuOwogICAgc3VwZXIuX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIC8vIFN0cmVhbVN1YnNjcmlwdGlvbiBjYWxsYmFja3MuCgogIHZvaWQgX29uUGF1c2UoKSB7CiAgICBpZiAoX3N1YnNjcmlwdGlvbiA9PSBudWxsKSByZXR1cm47CiAgICBfc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgfQoKICB2b2lkIF9vblJlc3VtZSgpIHsKICAgIGlmIChfc3Vic2NyaXB0aW9uID09IG51bGwpIHJldHVybjsKICAgIF9zdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgfQoKICBGdXR1cmUgX29uQ2FuY2VsKCkgewogICAgaWYgKF9zdWJzY3JpcHRpb24gIT0gbnVsbCkgewogICAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uID0gX3N1YnNjcmlwdGlvbjsKICAgICAgX3N1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgIHJldHVybiBzdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vIE1ldGhvZHMgdXNlZCBhcyBsaXN0ZW5lciBvbiBzb3VyY2Ugc3Vic2NyaXB0aW9uLgoKICB2b2lkIF9oYW5kbGVEYXRhKFMgZGF0YSkgewogICAgX3N0cmVhbS5faGFuZGxlRGF0YShkYXRhLCB0aGlzKTsKICB9CgogIHZvaWQgX2hhbmRsZUVycm9yKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIF9zdHJlYW0uX2hhbmRsZUVycm9yKGVycm9yLCBzdGFja1RyYWNlLCB0aGlzKTsKICB9CgogIHZvaWQgX2hhbmRsZURvbmUoKSB7CiAgICBfc3RyZWFtLl9oYW5kbGVEb25lKHRoaXMpOwogIH0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTdHJlYW0gdHJhbnNmb3JtZXJzIHVzZWQgYnkgdGhlIGRlZmF1bHQgU3RyZWFtIGltcGxlbWVudGF0aW9uLgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp0eXBlZGVmIGJvb2wgX1ByZWRpY2F0ZTxUPihUIHZhbHVlKTsKCnZvaWQgX2FkZEVycm9yV2l0aFJlcGxhY2VtZW50KF9FdmVudFNpbmsgc2luaywgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogIEFzeW5jRXJyb3IgcmVwbGFjZW1lbnQgPSBab25lLmN1cnJlbnQuZXJyb3JDYWxsYmFjayhlcnJvciwgc3RhY2tUcmFjZSk7CiAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgIGVycm9yID0gX25vbk51bGxFcnJvcihyZXBsYWNlbWVudC5lcnJvcik7CiAgICBzdGFja1RyYWNlID0gcmVwbGFjZW1lbnQuc3RhY2tUcmFjZTsKICB9CiAgc2luay5fYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwp9CgpjbGFzcyBfV2hlcmVTdHJlYW08VD4gZXh0ZW5kcyBfRm9yd2FyZGluZ1N0cmVhbTxULCBUPiB7CiAgZmluYWwgX1ByZWRpY2F0ZTxUPiBfdGVzdDsKCiAgX1doZXJlU3RyZWFtKFN0cmVhbTxUPiBzb3VyY2UsIGJvb2wgdGVzdChUIHZhbHVlKSkKICAgICAgOiBfdGVzdCA9IHRlc3QsCiAgICAgICAgc3VwZXIoc291cmNlKTsKCiAgdm9pZCBfaGFuZGxlRGF0YShUIGlucHV0RXZlbnQsIF9FdmVudFNpbms8VD4gc2luaykgewogICAgYm9vbCBzYXRpc2ZpZXM7CiAgICB0cnkgewogICAgICBzYXRpc2ZpZXMgPSBfdGVzdChpbnB1dEV2ZW50KTsKICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgX2FkZEVycm9yV2l0aFJlcGxhY2VtZW50KHNpbmssIGUsIHMpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoc2F0aXNmaWVzKSB7CiAgICAgIHNpbmsuX2FkZChpbnB1dEV2ZW50KTsKICAgIH0KICB9Cn0KCnR5cGVkZWYgVCBfVHJhbnNmb3JtYXRpb248UywgVD4oUyB2YWx1ZSk7CgovKioKICogQSBzdHJlYW0gcGlwZSB0aGF0IGNvbnZlcnRzIGRhdGEgZXZlbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gb24uCiAqLwpjbGFzcyBfTWFwU3RyZWFtPFMsIFQ+IGV4dGVuZHMgX0ZvcndhcmRpbmdTdHJlYW08UywgVD4gewogIGZpbmFsIF9UcmFuc2Zvcm1hdGlvbjxTLCBUPiBfdHJhbnNmb3JtOwoKICBfTWFwU3RyZWFtKFN0cmVhbTxTPiBzb3VyY2UsIFQgdHJhbnNmb3JtKFMgZXZlbnQpKQogICAgICA6IHRoaXMuX3RyYW5zZm9ybSA9IHRyYW5zZm9ybSwKICAgICAgICBzdXBlcihzb3VyY2UpOwoKICB2b2lkIF9oYW5kbGVEYXRhKFMgaW5wdXRFdmVudCwgX0V2ZW50U2luazxUPiBzaW5rKSB7CiAgICBUIG91dHB1dEV2ZW50OwogICAgdHJ5IHsKICAgICAgb3V0cHV0RXZlbnQgPSBfdHJhbnNmb3JtKGlucHV0RXZlbnQpOwogICAgfSBjYXRjaCAoZSwgcykgewogICAgICBfYWRkRXJyb3JXaXRoUmVwbGFjZW1lbnQoc2luaywgZSwgcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHNpbmsuX2FkZChvdXRwdXRFdmVudCk7CiAgfQp9CgovKioKICogQSBzdHJlYW0gcGlwZSB0aGF0IGNvbnZlcnRzIGRhdGEgZXZlbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gb24uCiAqLwpjbGFzcyBfRXhwYW5kU3RyZWFtPFMsIFQ+IGV4dGVuZHMgX0ZvcndhcmRpbmdTdHJlYW08UywgVD4gewogIGZpbmFsIF9UcmFuc2Zvcm1hdGlvbjxTLCBJdGVyYWJsZTxUPj4gX2V4cGFuZDsKCiAgX0V4cGFuZFN0cmVhbShTdHJlYW08Uz4gc291cmNlLCBJdGVyYWJsZTxUPiBleHBhbmQoUyBldmVudCkpCiAgICAgIDogdGhpcy5fZXhwYW5kID0gZXhwYW5kLAogICAgICAgIHN1cGVyKHNvdXJjZSk7CgogIHZvaWQgX2hhbmRsZURhdGEoUyBpbnB1dEV2ZW50LCBfRXZlbnRTaW5rPFQ+IHNpbmspIHsKICAgIHRyeSB7CiAgICAgIGZvciAoVCB2YWx1ZSBpbiBfZXhwYW5kKGlucHV0RXZlbnQpKSB7CiAgICAgICAgc2luay5fYWRkKHZhbHVlKTsKICAgICAgfQogICAgfSBjYXRjaCAoZSwgcykgewogICAgICAvLyBJZiBlaXRoZXIgX2V4cGFuZCBvciBpdGVyYXRpbmcgdGhlIGdlbmVyYXRlZCBpdGVyYXRvciB0aHJvd3MsCiAgICAgIC8vIHdlIGFib3J0IHRoZSBpdGVyYXRpb24uCiAgICAgIF9hZGRFcnJvcldpdGhSZXBsYWNlbWVudChzaW5rLCBlLCBzKTsKICAgIH0KICB9Cn0KCnR5cGVkZWYgYm9vbCBfRXJyb3JUZXN0KGVycm9yKTsKCi8qKgogKiBBIHN0cmVhbSBwaXBlIHRoYXQgY29udmVydHMgb3IgZGlzcG9zZXMgZXJyb3IgZXZlbnRzCiAqIGJlZm9yZSBwYXNzaW5nIHRoZW0gb24uCiAqLwpjbGFzcyBfSGFuZGxlRXJyb3JTdHJlYW08VD4gZXh0ZW5kcyBfRm9yd2FyZGluZ1N0cmVhbTxULCBUPiB7CiAgZmluYWwgRnVuY3Rpb24gX3RyYW5zZm9ybTsKICBmaW5hbCBfRXJyb3JUZXN0IF90ZXN0OwoKICBfSGFuZGxlRXJyb3JTdHJlYW0oU3RyZWFtPFQ+IHNvdXJjZSwgRnVuY3Rpb24gb25FcnJvciwgYm9vbCB0ZXN0KGVycm9yKSkKICAgICAgOiB0aGlzLl90cmFuc2Zvcm0gPSBvbkVycm9yLAogICAgICAgIHRoaXMuX3Rlc3QgPSB0ZXN0LAogICAgICAgIHN1cGVyKHNvdXJjZSk7CgogIHZvaWQgX2hhbmRsZUVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlLCBfRXZlbnRTaW5rPFQ+IHNpbmspIHsKICAgIGJvb2wgbWF0Y2hlcyA9IHRydWU7CiAgICBpZiAoX3Rlc3QgIT0gbnVsbCkgewogICAgICB0cnkgewogICAgICAgIG1hdGNoZXMgPSBfdGVzdChlcnJvcik7CiAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICBfYWRkRXJyb3JXaXRoUmVwbGFjZW1lbnQoc2luaywgZSwgcyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBpZiAobWF0Y2hlcykgewogICAgICB0cnkgewogICAgICAgIF9pbnZva2VFcnJvckhhbmRsZXIoX3RyYW5zZm9ybSwgZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgaWYgKGlkZW50aWNhbChlLCBlcnJvcikpIHsKICAgICAgICAgIHNpbmsuX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX2FkZEVycm9yV2l0aFJlcGxhY2VtZW50KHNpbmssIGUsIHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHNpbmsuX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIH0KICB9Cn0KCmNsYXNzIF9UYWtlU3RyZWFtPFQ+IGV4dGVuZHMgX0ZvcndhcmRpbmdTdHJlYW08VCwgVD4gewogIGZpbmFsIGludCBfY291bnQ7CgogIF9UYWtlU3RyZWFtKFN0cmVhbTxUPiBzb3VyY2UsIGludCBjb3VudCkKICAgICAgOiB0aGlzLl9jb3VudCA9IGNvdW50LAogICAgICAgIHN1cGVyKHNvdXJjZSkgewogICAgLy8gVGhpcyB0ZXN0IGlzIGRvbmUgZWFybHkgdG8gYXZvaWQgaGFuZGxpbmcgYW4gYXN5bmMgZXJyb3IKICAgIC8vIGluIHRoZSBfaGFuZGxlRGF0YSBtZXRob2QuCiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChjb3VudCwgImNvdW50Iik7CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb248VD4gX2NyZWF0ZVN1YnNjcmlwdGlvbih2b2lkIG9uRGF0YShUIGRhdGEpLAogICAgICBGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3IpIHsKICAgIGlmIChfY291bnQgPT0gMCkgewogICAgICBfc291cmNlLmxpc3RlbihudWxsKS5jYW5jZWwoKTsKICAgICAgcmV0dXJuIG5ldyBfRG9uZVN0cmVhbVN1YnNjcmlwdGlvbjxUPihvbkRvbmUpOwogICAgfQogICAgcmV0dXJuIG5ldyBfU3RhdGVTdHJlYW1TdWJzY3JpcHRpb248VD4oCiAgICAgICAgdGhpcywgb25EYXRhLCBvbkVycm9yLCBvbkRvbmUsIGNhbmNlbE9uRXJyb3IsIF9jb3VudCk7CiAgfQoKICB2b2lkIF9oYW5kbGVEYXRhKFQgaW5wdXRFdmVudCwgX0V2ZW50U2luazxUPiBzaW5rKSB7CiAgICBfU3RhdGVTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0gc2luazsKICAgIGludCBjb3VudCA9IHN1YnNjcmlwdGlvbi5fY291bnQ7CiAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgIHNpbmsuX2FkZChpbnB1dEV2ZW50KTsKICAgICAgY291bnQgLT0gMTsKICAgICAgc3Vic2NyaXB0aW9uLl9jb3VudCA9IGNvdW50OwogICAgICBpZiAoY291bnQgPT0gMCkgewogICAgICAgIC8vIENsb3NpbmcgYWxzbyB1bnN1YnNjcmliZXMgYWxsIHN1YnNjcmliZXJzLCB3aGljaCB1bnN1YnNjcmliZXMKICAgICAgICAvLyB0aGlzIGZyb20gc291cmNlLgogICAgICAgIHNpbmsuX2Nsb3NlKCk7CiAgICAgIH0KICAgIH0KICB9Cn0KCi8qKgogKiBBIFtfRm9yd2FyZGluZ1N0cmVhbVN1YnNjcmlwdGlvbl0gd2l0aCBvbmUgZXh0cmEgc3RhdGUgZmllbGQuCiAqCiAqIFVzZSBieSBzZXZlcmFsIGRpZmZlcmVudCBjbGFzc2VzLCBzdG9yaW5nIGFuIGludGVnZXIsIGJvb2wgb3IgZ2VuZXJhbC4KICovCmNsYXNzIF9TdGF0ZVN0cmVhbVN1YnNjcmlwdGlvbjxUPiBleHRlbmRzIF9Gb3J3YXJkaW5nU3RyZWFtU3Vic2NyaXB0aW9uPFQsIFQ+IHsKICAvLyBSYXcgc3RhdGUgZmllbGQuIFR5cGVkIGFjY2VzcyBwcm92aWRlZCBieSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGJlbG93LgogIHZhciBfc2hhcmVkU3RhdGU7CgogIF9TdGF0ZVN0cmVhbVN1YnNjcmlwdGlvbihfRm9yd2FyZGluZ1N0cmVhbTxULCBUPiBzdHJlYW0sIHZvaWQgb25EYXRhKFQgZGF0YSksCiAgICAgIEZ1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvciwgdGhpcy5fc2hhcmVkU3RhdGUpCiAgICAgIDogc3VwZXIoc3RyZWFtLCBvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvcik7CgogIGJvb2wgZ2V0IF9mbGFnID0+IF9zaGFyZWRTdGF0ZTsKICB2b2lkIHNldCBfZmxhZyhib29sIGZsYWcpIHsKICAgIF9zaGFyZWRTdGF0ZSA9IGZsYWc7CiAgfQoKICBpbnQgZ2V0IF9jb3VudCA9PiBfc2hhcmVkU3RhdGU7CiAgdm9pZCBzZXQgX2NvdW50KGludCBjb3VudCkgewogICAgX3NoYXJlZFN0YXRlID0gY291bnQ7CiAgfQoKICBPYmplY3QgZ2V0IF92YWx1ZSA9PiBfc2hhcmVkU3RhdGU7CiAgdm9pZCBzZXQgX3ZhbHVlKE9iamVjdCB2YWx1ZSkgewogICAgX3NoYXJlZFN0YXRlID0gdmFsdWU7CiAgfQp9CgpjbGFzcyBfVGFrZVdoaWxlU3RyZWFtPFQ+IGV4dGVuZHMgX0ZvcndhcmRpbmdTdHJlYW08VCwgVD4gewogIGZpbmFsIF9QcmVkaWNhdGU8VD4gX3Rlc3Q7CgogIF9UYWtlV2hpbGVTdHJlYW0oU3RyZWFtPFQ+IHNvdXJjZSwgYm9vbCB0ZXN0KFQgdmFsdWUpKQogICAgICA6IHRoaXMuX3Rlc3QgPSB0ZXN0LAogICAgICAgIHN1cGVyKHNvdXJjZSk7CgogIHZvaWQgX2hhbmRsZURhdGEoVCBpbnB1dEV2ZW50LCBfRXZlbnRTaW5rPFQ+IHNpbmspIHsKICAgIGJvb2wgc2F0aXNmaWVzOwogICAgdHJ5IHsKICAgICAgc2F0aXNmaWVzID0gX3Rlc3QoaW5wdXRFdmVudCk7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIF9hZGRFcnJvcldpdGhSZXBsYWNlbWVudChzaW5rLCBlLCBzKTsKICAgICAgLy8gVGhlIHRlc3QgZGlkbid0IHNheSB0cnVlLiBEaWRuJ3Qgc2F5IGZhbHNlIGVpdGhlciwgYnV0IHdlIHN0b3AgYW55d2F5LgogICAgICBzaW5rLl9jbG9zZSgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoc2F0aXNmaWVzKSB7CiAgICAgIHNpbmsuX2FkZChpbnB1dEV2ZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHNpbmsuX2Nsb3NlKCk7CiAgICB9CiAgfQp9CgpjbGFzcyBfU2tpcFN0cmVhbTxUPiBleHRlbmRzIF9Gb3J3YXJkaW5nU3RyZWFtPFQsIFQ+IHsKICBmaW5hbCBpbnQgX2NvdW50OwoKICBfU2tpcFN0cmVhbShTdHJlYW08VD4gc291cmNlLCBpbnQgY291bnQpCiAgICAgIDogdGhpcy5fY291bnQgPSBjb3VudCwKICAgICAgICBzdXBlcihzb3VyY2UpIHsKICAgIC8vIFRoaXMgdGVzdCBpcyBkb25lIGVhcmx5IHRvIGF2b2lkIGhhbmRsaW5nIGFuIGFzeW5jIGVycm9yCiAgICAvLyBpbiB0aGUgX2hhbmRsZURhdGEgbWV0aG9kLgogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoY291bnQsICJjb3VudCIpOwogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKGNvdW50LCAiY291bnQiKTsKICB9CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBfY3JlYXRlU3Vic2NyaXB0aW9uKHZvaWQgb25EYXRhKFQgZGF0YSksCiAgICAgIEZ1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcikgewogICAgcmV0dXJuIG5ldyBfU3RhdGVTdHJlYW1TdWJzY3JpcHRpb248VD4oCiAgICAgICAgdGhpcywgb25EYXRhLCBvbkVycm9yLCBvbkRvbmUsIGNhbmNlbE9uRXJyb3IsIF9jb3VudCk7CiAgfQoKICB2b2lkIF9oYW5kbGVEYXRhKFQgaW5wdXRFdmVudCwgX0V2ZW50U2luazxUPiBzaW5rKSB7CiAgICBfU3RhdGVTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0gc2luazsKICAgIGludCBjb3VudCA9IHN1YnNjcmlwdGlvbi5fY291bnQ7CiAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgIHN1YnNjcmlwdGlvbi5fY291bnQgPSBjb3VudCAtIDE7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHNpbmsuX2FkZChpbnB1dEV2ZW50KTsKICB9Cn0KCmNsYXNzIF9Ta2lwV2hpbGVTdHJlYW08VD4gZXh0ZW5kcyBfRm9yd2FyZGluZ1N0cmVhbTxULCBUPiB7CiAgZmluYWwgX1ByZWRpY2F0ZTxUPiBfdGVzdDsKCiAgX1NraXBXaGlsZVN0cmVhbShTdHJlYW08VD4gc291cmNlLCBib29sIHRlc3QoVCB2YWx1ZSkpCiAgICAgIDogdGhpcy5fdGVzdCA9IHRlc3QsCiAgICAgICAgc3VwZXIoc291cmNlKTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IF9jcmVhdGVTdWJzY3JpcHRpb24odm9pZCBvbkRhdGEoVCBkYXRhKSwKICAgICAgRnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKSB7CiAgICByZXR1cm4gbmV3IF9TdGF0ZVN0cmVhbVN1YnNjcmlwdGlvbjxUPigKICAgICAgICB0aGlzLCBvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvciwgZmFsc2UpOwogIH0KCiAgdm9pZCBfaGFuZGxlRGF0YShUIGlucHV0RXZlbnQsIF9FdmVudFNpbms8VD4gc2luaykgewogICAgX1N0YXRlU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9IHNpbms7CiAgICBib29sIGhhc0ZhaWxlZCA9IHN1YnNjcmlwdGlvbi5fZmxhZzsKICAgIGlmIChoYXNGYWlsZWQpIHsKICAgICAgc2luay5fYWRkKGlucHV0RXZlbnQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBib29sIHNhdGlzZmllczsKICAgIHRyeSB7CiAgICAgIHNhdGlzZmllcyA9IF90ZXN0KGlucHV0RXZlbnQpOwogICAgfSBjYXRjaCAoZSwgcykgewogICAgICBfYWRkRXJyb3JXaXRoUmVwbGFjZW1lbnQoc2luaywgZSwgcyk7CiAgICAgIC8vIEEgZmFpbHVyZSB0byByZXR1cm4gYSBib29sZWFuIGlzIGNvbnNpZGVyZWQgIm5vdCBtYXRjaGluZyIuCiAgICAgIHN1YnNjcmlwdGlvbi5fZmxhZyA9IHRydWU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghc2F0aXNmaWVzKSB7CiAgICAgIHN1YnNjcmlwdGlvbi5fZmxhZyA9IHRydWU7CiAgICAgIHNpbmsuX2FkZChpbnB1dEV2ZW50KTsKICAgIH0KICB9Cn0KCnR5cGVkZWYgYm9vbCBfRXF1YWxpdHk8VD4oVCBhLCBUIGIpOwoKY2xhc3MgX0Rpc3RpbmN0U3RyZWFtPFQ+IGV4dGVuZHMgX0ZvcndhcmRpbmdTdHJlYW08VCwgVD4gewogIHN0YXRpYyBmaW5hbCBfU0VOVElORUwgPSBuZXcgT2JqZWN0KCk7CgogIGZpbmFsIF9FcXVhbGl0eTxUPiBfZXF1YWxzOwoKICBfRGlzdGluY3RTdHJlYW0oU3RyZWFtPFQ+IHNvdXJjZSwgYm9vbCBlcXVhbHMoVCBhLCBUIGIpKQogICAgICA6IF9lcXVhbHMgPSBlcXVhbHMsCiAgICAgICAgc3VwZXIoc291cmNlKTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IF9jcmVhdGVTdWJzY3JpcHRpb24odm9pZCBvbkRhdGEoVCBkYXRhKSwKICAgICAgRnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKSB7CiAgICByZXR1cm4gbmV3IF9TdGF0ZVN0cmVhbVN1YnNjcmlwdGlvbjxUPigKICAgICAgICB0aGlzLCBvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvciwgX1NFTlRJTkVMKTsKICB9CgogIHZvaWQgX2hhbmRsZURhdGEoVCBpbnB1dEV2ZW50LCBfRXZlbnRTaW5rPFQ+IHNpbmspIHsKICAgIF9TdGF0ZVN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24gPSBzaW5rOwogICAgdmFyIHByZXZpb3VzID0gc3Vic2NyaXB0aW9uLl92YWx1ZTsKICAgIGlmIChpZGVudGljYWwocHJldmlvdXMsIF9TRU5USU5FTCkpIHsKICAgICAgLy8gRmlyc3QgZXZlbnQuCiAgICAgIHN1YnNjcmlwdGlvbi5fdmFsdWUgPSBpbnB1dEV2ZW50OwogICAgICBzaW5rLl9hZGQoaW5wdXRFdmVudCk7CiAgICB9IGVsc2UgewogICAgICBUIHByZXZpb3VzRXZlbnQgPSBwcmV2aW91czsKICAgICAgYm9vbCBpc0VxdWFsOwogICAgICB0cnkgewogICAgICAgIGlmIChfZXF1YWxzID09IG51bGwpIHsKICAgICAgICAgIGlzRXF1YWwgPSAocHJldmlvdXNFdmVudCA9PSBpbnB1dEV2ZW50KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaXNFcXVhbCA9IF9lcXVhbHMocHJldmlvdXNFdmVudCwgaW5wdXRFdmVudCk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgX2FkZEVycm9yV2l0aFJlcGxhY2VtZW50KHNpbmssIGUsIHMpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWlzRXF1YWwpIHsKICAgICAgICBzaW5rLl9hZGQoaW5wdXRFdmVudCk7CiAgICAgICAgc3Vic2NyaXB0aW9uLl92YWx1ZSA9IGlucHV0RXZlbnQ7CiAgICAgIH0KICAgIH0KICB9Cn0KgfYATk48ARQBSRFPCBsTPx8VDTQvIgYEAgFQJk0dLE5PCy4EAgFFNEodLikEPAIBOwFGJzcqPgUCAVAlTyxOPgsdBAIBBD0DQ0MhAzEEOxsBIwEvATU/NEgEAUE9NDcEAUoBMR8EAUgnBAEpEwQCAQROBCouKQEnAUM7OCRKBAEcUFABFhsWBAE4GygEASMBFCcbBAEVJxwEARchNxwkBhEEATYBHSUEATQzBAEXHwQCAUdCRwElAU9KHS4pBCUCATgdATUWFwE3FAolFSwOBhUdBgQCASoBBEMEOSoBNSUXATcTCiwVLA4GHAQCAQRDBDwxAT8fFwE3Ci0aCBVHISwGBAIBIAEEOBsEPh0aAUsjGxcBTxkZDCAXLhAIBhMMPBcjLREwChAIDSkGBAIBNxQBKx0YQCIwBAFBPRclNQYsPwQBNzUlFR0SIxhJHRcIBgQCAQRBA0oEUEoUAVBOPwEiHhkEASIfGgQBJSIaBAIBPB0BORsXATcUCiUVLFAVDgYVHQ0VBgQCATcUASsdGEAiMDEEAUE9LD8EATc1JRUnDgYbBAIBPB0BORsXAUE9LD4EATc1KRUdDgYUCiUVLEUhDgYWIR0GBAIBJQE7KQEeATsaFwFBPSxCBAE3NSgqFigdDSIUDB8zETgKFy4QCBYfKggGBAIBG2RhcnQ6YXN5bmMvc3RyZWFtX3BpcGUuZGFydDpvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvYXN5bmMvc3RyZWFtX3RyYW5zZm9ybWVycy5kYXJ0pjgvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmFzeW5jOwoKLyoqCiAqIFdyYXBzIGFuIFtfRXZlbnRTaW5rXSBzbyBpdCBleHBvc2VzIG9ubHkgdGhlIFtFdmVudFNpbmtdIGludGVyZmFjZS4KICovCmNsYXNzIF9FdmVudFNpbmtXcmFwcGVyPFQ+IGltcGxlbWVudHMgRXZlbnRTaW5rPFQ+IHsKICBfRXZlbnRTaW5rIF9zaW5rOwogIF9FdmVudFNpbmtXcmFwcGVyKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZChUIGRhdGEpIHsKICAgIF9zaW5rLl9hZGQoZGF0YSk7CiAgfQoKICB2b2lkIGFkZEVycm9yKGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgX3NpbmsuX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfc2luay5fY2xvc2UoKTsKICB9Cn0KCi8qKgogKiBBIFN0cmVhbVN1YnNjcmlwdGlvbiB0aGF0IHBpcGVzIGRhdGEgdGhyb3VnaCBhIHNpbmsuCiAqCiAqIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGlzIGNsYXNzIHRha2VzIGEgW19TaW5rTWFwcGVyXSB3aGljaCBtYXBzIGZyb20KICogW0V2ZW50U2lua10gdG8gW0V2ZW50U2lua10uIFRoZSBpbnB1dCB0byB0aGUgbWFwcGVyIGlzIHRoZSBvdXRwdXQgb2YKICogdGhlIHRyYW5zZm9ybWF0aW9uLiBUaGUgcmV0dXJuZWQgc2luayBpcyB0aGUgdHJhbnNmb3JtYXRpb24ncyBpbnB1dC4KICovCmNsYXNzIF9TaW5rVHJhbnNmb3JtZXJTdHJlYW1TdWJzY3JpcHRpb248UywgVD4KICAgIGV4dGVuZHMgX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbjxUPiB7CiAgLy8vIFRoZSB0cmFuc2Zvcm1lcidzIGlucHV0IHNpbmsuCiAgRXZlbnRTaW5rPFM+IF90cmFuc2Zvcm1lclNpbms7CgogIC8vLyBUaGUgc3Vic2NyaXB0aW9uIHRvIHRoZSBpbnB1dCBzdHJlYW0uCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFM+IF9zdWJzY3JpcHRpb247CgogIF9TaW5rVHJhbnNmb3JtZXJTdHJlYW1TdWJzY3JpcHRpb24oU3RyZWFtPFM+IHNvdXJjZSwgX1NpbmtNYXBwZXI8UywgVD4gbWFwcGVyLAogICAgICB2b2lkIG9uRGF0YShUIGRhdGEpLCBGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3IpCiAgICAgIC8vIFdlIHNldCB0aGUgYWRhcHRlcidzIHRhcmdldCBvbmx5IHdoZW4gdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBzZW5kIGRhdGEuCiAgICAgIDogc3VwZXIob25EYXRhLCBvbkVycm9yLCBvbkRvbmUsIGNhbmNlbE9uRXJyb3IpIHsKICAgIF9FdmVudFNpbmtXcmFwcGVyPFQ+IGV2ZW50U2luayA9IG5ldyBfRXZlbnRTaW5rV3JhcHBlcjxUPih0aGlzKTsKICAgIF90cmFuc2Zvcm1lclNpbmsgPSBtYXBwZXIoZXZlbnRTaW5rKTsKICAgIF9zdWJzY3JpcHRpb24gPQogICAgICAgIHNvdXJjZS5saXN0ZW4oX2hhbmRsZURhdGEsIG9uRXJyb3I6IF9oYW5kbGVFcnJvciwgb25Eb25lOiBfaGFuZGxlRG9uZSk7CiAgfQoKICAvKiogV2hldGhlciB0aGlzIHN1YnNjcmlwdGlvbiBpcyBzdGlsbCBzdWJzY3JpYmVkIHRvIGl0cyBzb3VyY2UuICovCiAgYm9vbCBnZXQgX2lzU3Vic2NyaWJlZCA9PiBfc3Vic2NyaXB0aW9uICE9IG51bGw7CgogIC8vIF9FdmVudFNpbmsgaW50ZXJmYWNlLgoKICAvKioKICAgKiBBZGRzIGFuIGV2ZW50IHRvIHRoaXMgc3Vic2NyaXB0aW9ucy4KICAgKgogICAqIENvbnRyYXJ5IHRvIG5vcm1hbCBbX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbl1zIHdlIG1heSByZWNlaXZlCiAgICogZXZlbnRzIHdoZW4gdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZC4gUmVwb3J0IHRoZW0gYXMgc3RhdGUKICAgKiBlcnJvci4KICAgKi8KICB2b2lkIF9hZGQoVCBkYXRhKSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJTdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWQiKTsKICAgIH0KICAgIHN1cGVyLl9hZGQoZGF0YSk7CiAgfQoKICAvKioKICAgKiBBZGRzIGFuIGVycm9yIGV2ZW50IHRvIHRoaXMgc3Vic2NyaXB0aW9ucy4KICAgKgogICAqIENvbnRyYXJ5IHRvIG5vcm1hbCBbX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbl1zIHdlIG1heSByZWNlaXZlCiAgICogZXZlbnRzIHdoZW4gdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZC4gUmVwb3J0IHRoZW0gYXMgc3RhdGUKICAgKiBlcnJvci4KICAgKi8KICB2b2lkIF9hZGRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgaWYgKF9pc0Nsb3NlZCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiU3RyZWFtIGlzIGFscmVhZHkgY2xvc2VkIik7CiAgICB9CiAgICBzdXBlci5fYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgLyoqCiAgICogQWRkcyBhIGNsb3NlIGV2ZW50IHRvIHRoaXMgc3Vic2NyaXB0aW9ucy4KICAgKgogICAqIENvbnRyYXJ5IHRvIG5vcm1hbCBbX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbl1zIHdlIG1heSByZWNlaXZlCiAgICogZXZlbnRzIHdoZW4gdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZC4gUmVwb3J0IHRoZW0gYXMgc3RhdGUKICAgKiBlcnJvci4KICAgKi8KICB2b2lkIF9jbG9zZSgpIHsKICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCIpOwogICAgfQogICAgc3VwZXIuX2Nsb3NlKCk7CiAgfQoKICAvLyBfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uIGhvb2tzLgoKICB2b2lkIF9vblBhdXNlKCkgewogICAgaWYgKF9pc1N1YnNjcmliZWQpIF9zdWJzY3JpcHRpb24ucGF1c2UoKTsKICB9CgogIHZvaWQgX29uUmVzdW1lKCkgewogICAgaWYgKF9pc1N1YnNjcmliZWQpIF9zdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgfQoKICBGdXR1cmUgX29uQ2FuY2VsKCkgewogICAgaWYgKF9pc1N1YnNjcmliZWQpIHsKICAgICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbiA9IF9zdWJzY3JpcHRpb247CiAgICAgIF9zdWJzY3JpcHRpb24gPSBudWxsOwogICAgICByZXR1cm4gc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIF9oYW5kbGVEYXRhKFMgZGF0YSkgewogICAgdHJ5IHsKICAgICAgX3RyYW5zZm9ybWVyU2luay5hZGQoZGF0YSk7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIF9hZGRFcnJvcihlLCBzKTsKICAgIH0KICB9CgogIHZvaWQgX2hhbmRsZUVycm9yKGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgdHJ5IHsKICAgICAgX3RyYW5zZm9ybWVyU2luay5hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGlmIChpZGVudGljYWwoZSwgZXJyb3IpKSB7CiAgICAgICAgX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfYWRkRXJyb3IoZSwgcyk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX2hhbmRsZURvbmUoKSB7CiAgICB0cnkgewogICAgICBfc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgX3RyYW5zZm9ybWVyU2luay5jbG9zZSgpOwogICAgfSBjYXRjaCAoZSwgcykgewogICAgICBfYWRkRXJyb3IoZSwgcyk7CiAgICB9CiAgfQp9Cgp0eXBlZGVmIEV2ZW50U2luazxTPiBfU2lua01hcHBlcjxTLCBUPihFdmVudFNpbms8VD4gb3V0cHV0KTsKCi8qKgogKiBBIFN0cmVhbVRyYW5zZm9ybWVyIGZvciBTaW5rLW1hcHBlcnMuCiAqCiAqIEEgU2luay1tYXBwZXIgdGFrZXMgYW4gW0V2ZW50U2lua10gKGl0cyBvdXRwdXQpIGFuZCByZXR1cm5zIGFub3RoZXIKICogRXZlbnRTaW5rIChpdHMgaW5wdXQpLgogKgogKiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBjYW4gYmUgYGNvbnN0YC4KICovCmNsYXNzIF9TdHJlYW1TaW5rVHJhbnNmb3JtZXI8UywgVD4gZXh0ZW5kcyBTdHJlYW1UcmFuc2Zvcm1lckJhc2U8UywgVD4gewogIGZpbmFsIF9TaW5rTWFwcGVyPFMsIFQ+IF9zaW5rTWFwcGVyOwogIGNvbnN0IF9TdHJlYW1TaW5rVHJhbnNmb3JtZXIodGhpcy5fc2lua01hcHBlcik7CgogIFN0cmVhbTxUPiBiaW5kKFN0cmVhbTxTPiBzdHJlYW0pID0+CiAgICAgIG5ldyBfQm91bmRTaW5rU3RyZWFtPFMsIFQ+KHN0cmVhbSwgX3NpbmtNYXBwZXIpOwp9CgovKioKICogVGhlIHJlc3VsdCBvZiBiaW5kaW5nIGEgU3RyZWFtVHJhbnNmb3JtZXIgZm9yIFNpbmstbWFwcGVycy4KICoKICogSXQgY29udGFpbnMgdGhlIGJvdW5kIFN0cmVhbSBhbmQgdGhlIHNpbmstbWFwcGVyLiBPbmx5IHdoZW4gdGhlIHVzZXIgc3RhcnRzCiAqIGxpc3RlbmluZyB0byB0aGlzIHN0cmVhbSBpcyB0aGUgc2luay1tYXBwZXIgaW52b2tlZC4gVGhlIHJlc3VsdCBpcyB1c2VkCiAqIHRvIGNyZWF0ZSBhIFN0cmVhbVN1YnNjcmlwdGlvbiB0aGF0IHRyYW5zZm9ybXMgZXZlbnRzLgogKi8KY2xhc3MgX0JvdW5kU2lua1N0cmVhbTxTLCBUPiBleHRlbmRzIFN0cmVhbTxUPiB7CiAgZmluYWwgX1NpbmtNYXBwZXI8UywgVD4gX3NpbmtNYXBwZXI7CiAgZmluYWwgU3RyZWFtPFM+IF9zdHJlYW07CgogIGJvb2wgZ2V0IGlzQnJvYWRjYXN0ID0+IF9zdHJlYW0uaXNCcm9hZGNhc3Q7CgogIF9Cb3VuZFNpbmtTdHJlYW0odGhpcy5fc3RyZWFtLCB0aGlzLl9zaW5rTWFwcGVyKTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IGxpc3Rlbih2b2lkIG9uRGF0YShUIGV2ZW50KSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIGNhbmNlbE9uRXJyb3IgPSBpZGVudGljYWwodHJ1ZSwgY2FuY2VsT25FcnJvcik7CiAgICBTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0KICAgICAgICBuZXcgX1NpbmtUcmFuc2Zvcm1lclN0cmVhbVN1YnNjcmlwdGlvbjxTLCBUPigKICAgICAgICAgICAgX3N0cmVhbSwgX3NpbmtNYXBwZXIsIG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKTsKICAgIHJldHVybiBzdWJzY3JpcHRpb247CiAgfQp9CgovLy8gRGF0YS1oYW5kbGVyIGNvbWluZyBmcm9tIFtTdHJlYW1UcmFuc2Zvcm1lci5mcm9tSGFuZGxlcnNdLgp0eXBlZGVmIHZvaWQgX1RyYW5zZm9ybURhdGFIYW5kbGVyPFMsIFQ+KFMgZGF0YSwgRXZlbnRTaW5rPFQ+IHNpbmspOwoKLy8vIEVycm9yLWhhbmRsZXIgY29taW5nIGZyb20gW1N0cmVhbVRyYW5zZm9ybWVyLmZyb21IYW5kbGVyc10uCnR5cGVkZWYgdm9pZCBfVHJhbnNmb3JtRXJyb3JIYW5kbGVyPFQ+KAogICAgT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UsIEV2ZW50U2luazxUPiBzaW5rKTsKCi8vLyBEb25lLWhhbmRsZXIgY29taW5nIGZyb20gW1N0cmVhbVRyYW5zZm9ybWVyLmZyb21IYW5kbGVyc10uCnR5cGVkZWYgdm9pZCBfVHJhbnNmb3JtRG9uZUhhbmRsZXI8VD4oRXZlbnRTaW5rPFQ+IHNpbmspOwoKLyoqCiAqIFdyYXBzIGhhbmRsZXJzIChmcm9tIFtTdHJlYW1UcmFuc2Zvcm1lci5mcm9tSGFuZGxlcnNdKSBpbnRvIGFuIGBFdmVudFNpbmtgLgogKgogKiBUaGlzIHdheSB3ZSBjYW4gcmV1c2UgdGhlIGNvZGUgZnJvbSBbX1N0cmVhbVNpbmtUcmFuc2Zvcm1lcl0uCiAqLwpjbGFzcyBfSGFuZGxlckV2ZW50U2luazxTLCBUPiBpbXBsZW1lbnRzIEV2ZW50U2luazxTPiB7CiAgZmluYWwgX1RyYW5zZm9ybURhdGFIYW5kbGVyPFMsIFQ+IF9oYW5kbGVEYXRhOwogIGZpbmFsIF9UcmFuc2Zvcm1FcnJvckhhbmRsZXI8VD4gX2hhbmRsZUVycm9yOwogIGZpbmFsIF9UcmFuc2Zvcm1Eb25lSGFuZGxlcjxUPiBfaGFuZGxlRG9uZTsKCiAgLy8vIFRoZSBvdXRwdXQgc2luayB3aGVyZSB0aGUgaGFuZGxlcnMgc2hvdWxkIHNlbmQgdGhlaXIgZGF0YSBpbnRvLgogIEV2ZW50U2luazxUPiBfc2luazsKCiAgX0hhbmRsZXJFdmVudFNpbmsoCiAgICAgIHRoaXMuX2hhbmRsZURhdGEsIHRoaXMuX2hhbmRsZUVycm9yLCB0aGlzLl9oYW5kbGVEb25lLCB0aGlzLl9zaW5rKSB7CiAgICBpZiAoX3NpbmsgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiVGhlIHByb3ZpZGVkIHNpbmsgbXVzdCBub3QgYmUgbnVsbC4iKTsKICAgIH0KICB9CgogIGJvb2wgZ2V0IF9pc0Nsb3NlZCA9PiBfc2luayA9PSBudWxsOwoKICB2b2lkIGFkZChTIGRhdGEpIHsKICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigiU2luayBpcyBjbG9zZWQiKTsKICAgIH0KICAgIGlmIChfaGFuZGxlRGF0YSAhPSBudWxsKSB7CiAgICAgIF9oYW5kbGVEYXRhKGRhdGEsIF9zaW5rKTsKICAgIH0gZWxzZSB7CiAgICAgIF9zaW5rLmFkZChkYXRhIGFzIFQpOwogICAgfQogIH0KCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoIlNpbmsgaXMgY2xvc2VkIik7CiAgICB9CiAgICBpZiAoX2hhbmRsZUVycm9yICE9IG51bGwpIHsKICAgICAgX2hhbmRsZUVycm9yKGVycm9yLCBzdGFja1RyYWNlLCBfc2luayk7CiAgICB9IGVsc2UgewogICAgICBfc2luay5hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICB9CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgaWYgKF9pc0Nsb3NlZCkgcmV0dXJuOwogICAgdmFyIHNpbmsgPSBfc2luazsKICAgIF9zaW5rID0gbnVsbDsKICAgIGlmIChfaGFuZGxlRG9uZSAhPSBudWxsKSB7CiAgICAgIF9oYW5kbGVEb25lKHNpbmspOwogICAgfSBlbHNlIHsKICAgICAgc2luay5jbG9zZSgpOwogICAgfQogIH0KfQoKLyoqCiAqIEEgU3RyZWFtVHJhbnNmb3JtZXIgdGhhdCB0cmFuc2Zvcm1lcnMgZXZlbnRzIHdpdGggdGhlIGdpdmVuIGhhbmRsZXJzLgogKgogKiBOb3RlIHRoYXQgdGhpcyB0cmFuc2Zvcm1lciBjYW4gb25seSBiZSB1c2VkIG9uY2UuCiAqLwpjbGFzcyBfU3RyZWFtSGFuZGxlclRyYW5zZm9ybWVyPFMsIFQ+IGV4dGVuZHMgX1N0cmVhbVNpbmtUcmFuc2Zvcm1lcjxTLCBUPiB7CiAgX1N0cmVhbUhhbmRsZXJUcmFuc2Zvcm1lcigKICAgICAge3ZvaWQgaGFuZGxlRGF0YShTIGRhdGEsIEV2ZW50U2luazxUPiBzaW5rKSwKICAgICAgdm9pZCBoYW5kbGVFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSwgRXZlbnRTaW5rPFQ+IHNpbmspLAogICAgICB2b2lkIGhhbmRsZURvbmUoRXZlbnRTaW5rPFQ+IHNpbmspfSkKICAgICAgOiBzdXBlcigoRXZlbnRTaW5rPFQ+IG91dHB1dFNpbmspIHsKICAgICAgICAgIHJldHVybiBuZXcgX0hhbmRsZXJFdmVudFNpbms8UywgVD4oCiAgICAgICAgICAgICAgaGFuZGxlRGF0YSwgaGFuZGxlRXJyb3IsIGhhbmRsZURvbmUsIG91dHB1dFNpbmspOwogICAgICAgIH0pOwoKICBTdHJlYW08VD4gYmluZChTdHJlYW08Uz4gc3RyZWFtKSB7CiAgICByZXR1cm4gc3VwZXIuYmluZChzdHJlYW0pOwogIH0KfQoKLyoqCiAqIEEgU3RyZWFtVHJhbnNmb3JtZXIgdGhhdCBvdmVycmlkZXMgW1N0cmVhbVRyYW5zZm9ybWVyLmJpbmRdIHdpdGggYSBjYWxsYmFjay4KICovCmNsYXNzIF9TdHJlYW1CaW5kVHJhbnNmb3JtZXI8UywgVD4gZXh0ZW5kcyBTdHJlYW1UcmFuc2Zvcm1lckJhc2U8UywgVD4gewogIGZpbmFsIFN0cmVhbTxUPiBGdW5jdGlvbihTdHJlYW08Uz4pIF9iaW5kOwogIF9TdHJlYW1CaW5kVHJhbnNmb3JtZXIodGhpcy5fYmluZCk7CgogIFN0cmVhbTxUPiBiaW5kKFN0cmVhbTxTPiBzdHJlYW0pID0+IF9iaW5kKHN0cmVhbSk7Cn0KCi8vLyBBIGNsb3N1cmUgbWFwcGluZyBhIHN0cmVhbSBhbmQgY2FuY2VsT25FcnJvciB0byBhIFN0cmVhbVN1YnNjcmlwdGlvbi4KdHlwZWRlZiBTdHJlYW1TdWJzY3JpcHRpb248VD4gX1N1YnNjcmlwdGlvblRyYW5zZm9ybWVyPFMsIFQ+KAogICAgU3RyZWFtPFM+IHN0cmVhbSwgYm9vbCBjYW5jZWxPbkVycm9yKTsKCi8qKgogKiBBIFtTdHJlYW1UcmFuc2Zvcm1lcl0gdGhhdCBtaW5pbWl6ZXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGNsYXNzZXMuCiAqCiAqIEluc3RlYWQgb2YgaW1wbGVtZW50aW5nIHRocmVlIGNsYXNzZXM6IGEgW1N0cmVhbVRyYW5zZm9ybWVyXSwgYSBbU3RyZWFtXQogKiAoYXMgdGhlIHJlc3VsdCBvZiBhIGBiaW5kYCBjYWxsKSBhbmQgYSBbU3RyZWFtU3Vic2NyaXB0aW9uXSAod2hpY2ggZG9lcyB0aGUKICogYWN0dWFsIHdvcmspLCB0aGlzIGNsYXNzIG9ubHkgcmVxdWlyZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUKICogbGFzdCBiaXQgKHRoZSBzdWJzY3JpcHRpb24pIG9mIHRoZSB0cmFuc2Zvcm1lci13b3JrZmxvdyBpcyBuZWVkZWQuCiAqCiAqIFRoZSBnaXZlbiB0cmFuc2Zvcm1lciBmdW5jdGlvbiBtYXBzIGZyb20gU3RyZWFtIGFuZCBjYW5jZWxPbkVycm9yIHRvIGEKICogYFN0cmVhbVN1YnNjcmlwdGlvbmAuIEFzIHN1Y2ggaXQgY2FuIGFsc28gYWN0IG9uIGBjYW5jZWxgIGV2ZW50cywgbWFraW5nIGl0CiAqIGZ1bGx5IGdlbmVyYWwuCiAqLwpjbGFzcyBfU3RyZWFtU3Vic2NyaXB0aW9uVHJhbnNmb3JtZXI8UywgVD4gZXh0ZW5kcyBTdHJlYW1UcmFuc2Zvcm1lckJhc2U8UywgVD4gewogIGZpbmFsIF9TdWJzY3JpcHRpb25UcmFuc2Zvcm1lcjxTLCBUPiBfb25MaXN0ZW47CgogIGNvbnN0IF9TdHJlYW1TdWJzY3JpcHRpb25UcmFuc2Zvcm1lcih0aGlzLl9vbkxpc3Rlbik7CgogIFN0cmVhbTxUPiBiaW5kKFN0cmVhbTxTPiBzdHJlYW0pID0+CiAgICAgIG5ldyBfQm91bmRTdWJzY3JpcHRpb25TdHJlYW08UywgVD4oc3RyZWFtLCBfb25MaXN0ZW4pOwp9CgovKioKICogQSBzdHJlYW0gdHJhbnNmb3JtZWQgYnkgYSBbX1N0cmVhbVN1YnNjcmlwdGlvblRyYW5zZm9ybWVyXS4KICoKICogV2hlbiB0aGlzIHN0cmVhbSBpcyBsaXN0ZW5lZCB0byBpdCBpbnZva2VzIHRoZSBbX29uTGlzdGVuXSBmdW5jdGlvbiB3aXRoCiAqIHRoZSBzdG9yZWQgW19zdHJlYW1dLiBVc3VhbGx5IHRoZSB0cmFuc2Zvcm1lciBzdGFydHMgbGlzdGVuaW5nIGF0IHRoaXMKICogbW9tZW50LgogKi8KY2xhc3MgX0JvdW5kU3Vic2NyaXB0aW9uU3RyZWFtPFMsIFQ+IGV4dGVuZHMgU3RyZWFtPFQ+IHsKICBmaW5hbCBfU3Vic2NyaXB0aW9uVHJhbnNmb3JtZXI8UywgVD4gX29uTGlzdGVuOwogIGZpbmFsIFN0cmVhbTxTPiBfc3RyZWFtOwoKICBib29sIGdldCBpc0Jyb2FkY2FzdCA9PiBfc3RyZWFtLmlzQnJvYWRjYXN0OwoKICBfQm91bmRTdWJzY3JpcHRpb25TdHJlYW0odGhpcy5fc3RyZWFtLCB0aGlzLl9vbkxpc3Rlbik7CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBsaXN0ZW4odm9pZCBvbkRhdGEoVCBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICBjYW5jZWxPbkVycm9yID0gaWRlbnRpY2FsKHRydWUsIGNhbmNlbE9uRXJyb3IpOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHJlc3VsdCA9IF9vbkxpc3Rlbihfc3RyZWFtLCBjYW5jZWxPbkVycm9yKTsKICAgIHJlc3VsdC5vbkRhdGEob25EYXRhKTsKICAgIHJlc3VsdC5vbkVycm9yKG9uRXJyb3IpOwogICAgcmVzdWx0Lm9uRG9uZShvbkRvbmUpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KgVIATk48ARQBBEcENRQhARUWBAEyKAQBERQEAgEEOANHSEgELy4kIQEsJwFRUFE4RSoUUAQBRjMBGwEGKgVHRAwGFhU4BhYEAQYwBUdEDAY4FTgGKAQBBi8FR0QMBhIVOAYUBAEpARQuBAEVLwQBFxk3HCQGEQQBHQoiFRcGBAE2CjQVISYPGQgGBAEXChwgFRcGBAIBPQEEKQNHGgMoBEknMgEmNwIBBD8DT0s6BDEnGwEvATQBNT80KTZLGQQCAT9FAUAoPQE/OgEETwNBBDgxMC4BRhYBFUsZRgYEAScBFRUqBh8gDRwGBAE5FSoGIC4NKQYEAREbFhIfGQ0UBgQCAQRJAzUETR0zUCsqLkAMASUfBAIBBFAESS0mATUCAUo+KwEESgNMT05GA0pPEgRRMgE4ASY9AgEEPwNMSgsEOTIbAS8BOgE1PzRGGx0bEwQCASNkYXJ0OmFzeW5jL3N0cmVhbV90cmFuc2Zvcm1lcnMuZGFydCtvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvYXN5bmMvem9uZS5kYXJ0wADWni8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuYXN5bmM7Cgp0eXBlZGVmIFIgWm9uZUNhbGxiYWNrPFI+KCk7CnR5cGVkZWYgUiBab25lVW5hcnlDYWxsYmFjazxSLCBUPihUIGFyZyk7CnR5cGVkZWYgUiBab25lQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPihUMSBhcmcxLCBUMiBhcmcyKTsKCnR5cGVkZWYgSGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXIgPSB2b2lkIEZ1bmN0aW9uKFpvbmUgc2VsZiwKICAgIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwgT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpOwp0eXBlZGVmIFJ1bkhhbmRsZXIgPSBSIEZ1bmN0aW9uPFI+KAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFIgRnVuY3Rpb24oKSBmKTsKdHlwZWRlZiBSdW5VbmFyeUhhbmRsZXIgPSBSIEZ1bmN0aW9uPFIsIFQ+KAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFIgRnVuY3Rpb24oVCBhcmcpIGYsIFQgYXJnKTsKdHlwZWRlZiBSdW5CaW5hcnlIYW5kbGVyID0gUiBGdW5jdGlvbjxSLCBUMSwgVDI+KFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwKICAgIFpvbmUgem9uZSwgUiBGdW5jdGlvbihUMSBhcmcxLCBUMiBhcmcyKSBmLCBUMSBhcmcxLCBUMiBhcmcyKTsKdHlwZWRlZiBSZWdpc3RlckNhbGxiYWNrSGFuZGxlciA9IFpvbmVDYWxsYmFjazxSPiBGdW5jdGlvbjxSPigKICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBSIEZ1bmN0aW9uKCkgZik7CnR5cGVkZWYgUmVnaXN0ZXJVbmFyeUNhbGxiYWNrSGFuZGxlciA9IFpvbmVVbmFyeUNhbGxiYWNrPFIsIFQ+IEZ1bmN0aW9uPFIsIFQ+KAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFIgRnVuY3Rpb24oVCBhcmcpIGYpOwp0eXBlZGVmIFJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2tIYW5kbGVyCiAgICA9IFpvbmVCaW5hcnlDYWxsYmFjazxSLCBUMSwgVDI+IEZ1bmN0aW9uPFIsIFQxLCBUMj4oWm9uZSBzZWxmLAogICAgICAgIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwgUiBGdW5jdGlvbihUMSBhcmcxLCBUMiBhcmcyKSBmKTsKdHlwZWRlZiBBc3luY0Vycm9yIEVycm9yQ2FsbGJhY2tIYW5kbGVyKFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwKICAgIFpvbmUgem9uZSwgT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpOwp0eXBlZGVmIHZvaWQgU2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyKAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIHZvaWQgZigpKTsKdHlwZWRlZiBUaW1lciBDcmVhdGVUaW1lckhhbmRsZXIoCiAgICBab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwgRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgZigpKTsKdHlwZWRlZiBUaW1lciBDcmVhdGVQZXJpb2RpY1RpbWVySGFuZGxlcihab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsCiAgICBab25lIHpvbmUsIER1cmF0aW9uIHBlcmlvZCwgdm9pZCBmKFRpbWVyIHRpbWVyKSk7CnR5cGVkZWYgdm9pZCBQcmludEhhbmRsZXIoCiAgICBab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwgU3RyaW5nIGxpbmUpOwp0eXBlZGVmIFpvbmUgRm9ya0hhbmRsZXIoWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsCiAgICBab25lU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uLCBNYXAgem9uZVZhbHVlcyk7CgovKiogUGFpciBvZiBlcnJvciBhbmQgc3RhY2sgdHJhY2UuIFJldHVybmVkIGJ5IFtab25lLmVycm9yQ2FsbGJhY2tdLiAqLwpjbGFzcyBBc3luY0Vycm9yIGltcGxlbWVudHMgRXJyb3IgewogIGZpbmFsIE9iamVjdCBlcnJvcjsKICBmaW5hbCBTdGFja1RyYWNlIHN0YWNrVHJhY2U7CgogIEFzeW5jRXJyb3IodGhpcy5lcnJvciwgdGhpcy5zdGFja1RyYWNlKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRlcnJvcic7Cn0KCmNsYXNzIF9ab25lRnVuY3Rpb248VCBleHRlbmRzIEZ1bmN0aW9uPiB7CiAgZmluYWwgX1pvbmUgem9uZTsKICBmaW5hbCBUIGZ1bmN0aW9uOwogIGNvbnN0IF9ab25lRnVuY3Rpb24odGhpcy56b25lLCB0aGlzLmZ1bmN0aW9uKTsKfQoKLyoqCiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIHNwZWNpZmljYXRpb24gZm9yIGEgZm9ya2VkIHpvbmUuCiAqCiAqIFdoZW4gZm9ya2luZyBhIG5ldyB6b25lIChzZWUgW1pvbmUuZm9ya10pIG9uZSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQKICogYmVoYXZpb3Igb2YgdGhlIHpvbmUgYnkgcHJvdmlkaW5nIGNhbGxiYWNrcy4gVGhlc2UgY2FsbGJhY2tzIG11c3QgYmUKICogZ2l2ZW4gaW4gYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICoKICogSGFuZGxlcnMgaGF2ZSB0aGUgc2FtZSBzaWduYXR1cmUgYXMgdGhlIHNhbWUtbmFtZWQgbWV0aG9kcyBvbiBbWm9uZV0gYnV0CiAqIHJlY2VpdmUgdGhyZWUgYWRkaXRpb25hbCBhcmd1bWVudHM6CiAqCiAqICAgMS4gdGhlIHpvbmUgdGhlIGhhbmRsZXJzIGFyZSBhdHRhY2hlZCB0byAodGhlICJzZWxmIiB6b25lKS4KICogICAyLiBhIFtab25lRGVsZWdhdGVdIHRvIHRoZSBwYXJlbnQgem9uZS4KICogICAzLiB0aGUgem9uZSB0aGF0IGZpcnN0IHJlY2VpdmVkIHRoZSByZXF1ZXN0IChiZWZvcmUgdGhlIHJlcXVlc3Qgd2FzCiAqICAgICBidWJibGVkIHVwKS4KICoKICogSGFuZGxlcnMgY2FuIGVpdGhlciBzdG9wIHByb3BhZ2F0aW9uIHRoZSByZXF1ZXN0IChieSBzaW1wbHkgbm90IGNhbGxpbmcgdGhlCiAqIHBhcmVudCBoYW5kbGVyKSwgb3IgZm9yd2FyZCB0byB0aGUgcGFyZW50IHpvbmUsIHBvdGVudGlhbGx5IG1vZGlmeWluZyB0aGUKICogYXJndW1lbnRzIG9uIHRoZSB3YXkuCiAqLwphYnN0cmFjdCBjbGFzcyBab25lU3BlY2lmaWNhdGlvbiB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIHNwZWNpZmljYXRpb24gd2l0aCB0aGUgcHJvdmlkZWQgaGFuZGxlcnMuCiAgICovCiAgY29uc3QgZmFjdG9yeSBab25lU3BlY2lmaWNhdGlvbigKICAgICAge0hhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyIGhhbmRsZVVuY2F1Z2h0RXJyb3IsCiAgICAgIFJ1bkhhbmRsZXIgcnVuLAogICAgICBSdW5VbmFyeUhhbmRsZXIgcnVuVW5hcnksCiAgICAgIFJ1bkJpbmFyeUhhbmRsZXIgcnVuQmluYXJ5LAogICAgICBSZWdpc3RlckNhbGxiYWNrSGFuZGxlciByZWdpc3RlckNhbGxiYWNrLAogICAgICBSZWdpc3RlclVuYXJ5Q2FsbGJhY2tIYW5kbGVyIHJlZ2lzdGVyVW5hcnlDYWxsYmFjaywKICAgICAgUmVnaXN0ZXJCaW5hcnlDYWxsYmFja0hhbmRsZXIgcmVnaXN0ZXJCaW5hcnlDYWxsYmFjaywKICAgICAgRXJyb3JDYWxsYmFja0hhbmRsZXIgZXJyb3JDYWxsYmFjaywKICAgICAgU2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyIHNjaGVkdWxlTWljcm90YXNrLAogICAgICBDcmVhdGVUaW1lckhhbmRsZXIgY3JlYXRlVGltZXIsCiAgICAgIENyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyIGNyZWF0ZVBlcmlvZGljVGltZXIsCiAgICAgIFByaW50SGFuZGxlciBwcmludCwKICAgICAgRm9ya0hhbmRsZXIgZm9ya30pID0gX1pvbmVTcGVjaWZpY2F0aW9uOwoKICAvKioKICAgKiBDcmVhdGVzIGEgc3BlY2lmaWNhdGlvbiBmcm9tIFtvdGhlcl0gd2l0aCB0aGUgcHJvdmlkZWQgaGFuZGxlcnMgb3ZlcnJpZGluZwogICAqIHRoZSBvbmVzIGluIFtvdGhlcl0uCiAgICovCiAgZmFjdG9yeSBab25lU3BlY2lmaWNhdGlvbi5mcm9tKFpvbmVTcGVjaWZpY2F0aW9uIG90aGVyLAogICAgICB7SGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXIgaGFuZGxlVW5jYXVnaHRFcnJvciwKICAgICAgUnVuSGFuZGxlciBydW4sCiAgICAgIFJ1blVuYXJ5SGFuZGxlciBydW5VbmFyeSwKICAgICAgUnVuQmluYXJ5SGFuZGxlciBydW5CaW5hcnksCiAgICAgIFJlZ2lzdGVyQ2FsbGJhY2tIYW5kbGVyIHJlZ2lzdGVyQ2FsbGJhY2ssCiAgICAgIFJlZ2lzdGVyVW5hcnlDYWxsYmFja0hhbmRsZXIgcmVnaXN0ZXJVbmFyeUNhbGxiYWNrLAogICAgICBSZWdpc3RlckJpbmFyeUNhbGxiYWNrSGFuZGxlciByZWdpc3RlckJpbmFyeUNhbGxiYWNrLAogICAgICBFcnJvckNhbGxiYWNrSGFuZGxlciBlcnJvckNhbGxiYWNrLAogICAgICBTY2hlZHVsZU1pY3JvdGFza0hhbmRsZXIgc2NoZWR1bGVNaWNyb3Rhc2ssCiAgICAgIENyZWF0ZVRpbWVySGFuZGxlciBjcmVhdGVUaW1lciwKICAgICAgQ3JlYXRlUGVyaW9kaWNUaW1lckhhbmRsZXIgY3JlYXRlUGVyaW9kaWNUaW1lciwKICAgICAgUHJpbnRIYW5kbGVyIHByaW50LAogICAgICBGb3JrSGFuZGxlciBmb3JrfSkgewogICAgcmV0dXJuIG5ldyBab25lU3BlY2lmaWNhdGlvbigKICAgICAgICBoYW5kbGVVbmNhdWdodEVycm9yOiBoYW5kbGVVbmNhdWdodEVycm9yID8/IG90aGVyLmhhbmRsZVVuY2F1Z2h0RXJyb3IsCiAgICAgICAgcnVuOiBydW4gPz8gb3RoZXIucnVuLAogICAgICAgIHJ1blVuYXJ5OiBydW5VbmFyeSA/PyBvdGhlci5ydW5VbmFyeSwKICAgICAgICBydW5CaW5hcnk6IHJ1bkJpbmFyeSA/PyBvdGhlci5ydW5CaW5hcnksCiAgICAgICAgcmVnaXN0ZXJDYWxsYmFjazogcmVnaXN0ZXJDYWxsYmFjayA/PyBvdGhlci5yZWdpc3RlckNhbGxiYWNrLAogICAgICAgIHJlZ2lzdGVyVW5hcnlDYWxsYmFjazoKICAgICAgICAgICAgcmVnaXN0ZXJVbmFyeUNhbGxiYWNrID8/IG90aGVyLnJlZ2lzdGVyVW5hcnlDYWxsYmFjaywKICAgICAgICByZWdpc3RlckJpbmFyeUNhbGxiYWNrOgogICAgICAgICAgICByZWdpc3RlckJpbmFyeUNhbGxiYWNrID8/IG90aGVyLnJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2ssCiAgICAgICAgZXJyb3JDYWxsYmFjazogZXJyb3JDYWxsYmFjayA/PyBvdGhlci5lcnJvckNhbGxiYWNrLAogICAgICAgIHNjaGVkdWxlTWljcm90YXNrOiBzY2hlZHVsZU1pY3JvdGFzayA/PyBvdGhlci5zY2hlZHVsZU1pY3JvdGFzaywKICAgICAgICBjcmVhdGVUaW1lcjogY3JlYXRlVGltZXIgPz8gb3RoZXIuY3JlYXRlVGltZXIsCiAgICAgICAgY3JlYXRlUGVyaW9kaWNUaW1lcjogY3JlYXRlUGVyaW9kaWNUaW1lciA/PyBvdGhlci5jcmVhdGVQZXJpb2RpY1RpbWVyLAogICAgICAgIHByaW50OiBwcmludCA/PyBvdGhlci5wcmludCwKICAgICAgICBmb3JrOiBmb3JrID8/IG90aGVyLmZvcmspOwogIH0KCiAgSGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXIgZ2V0IGhhbmRsZVVuY2F1Z2h0RXJyb3I7CiAgUnVuSGFuZGxlciBnZXQgcnVuOwogIFJ1blVuYXJ5SGFuZGxlciBnZXQgcnVuVW5hcnk7CiAgUnVuQmluYXJ5SGFuZGxlciBnZXQgcnVuQmluYXJ5OwogIFJlZ2lzdGVyQ2FsbGJhY2tIYW5kbGVyIGdldCByZWdpc3RlckNhbGxiYWNrOwogIFJlZ2lzdGVyVW5hcnlDYWxsYmFja0hhbmRsZXIgZ2V0IHJlZ2lzdGVyVW5hcnlDYWxsYmFjazsKICBSZWdpc3RlckJpbmFyeUNhbGxiYWNrSGFuZGxlciBnZXQgcmVnaXN0ZXJCaW5hcnlDYWxsYmFjazsKICBFcnJvckNhbGxiYWNrSGFuZGxlciBnZXQgZXJyb3JDYWxsYmFjazsKICBTY2hlZHVsZU1pY3JvdGFza0hhbmRsZXIgZ2V0IHNjaGVkdWxlTWljcm90YXNrOwogIENyZWF0ZVRpbWVySGFuZGxlciBnZXQgY3JlYXRlVGltZXI7CiAgQ3JlYXRlUGVyaW9kaWNUaW1lckhhbmRsZXIgZ2V0IGNyZWF0ZVBlcmlvZGljVGltZXI7CiAgUHJpbnRIYW5kbGVyIGdldCBwcmludDsKICBGb3JrSGFuZGxlciBnZXQgZm9yazsKfQoKLyoqCiAqIEludGVybmFsIFtab25lU3BlY2lmaWNhdGlvbl0gY2xhc3MuCiAqCiAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YW50cyB0byByZWx5IG9uIHRoZSBmYWN0IHRoYXQgdGhlIGdldHRlcnMgY2Fubm90IGNoYW5nZQogKiBkeW5hbWljYWxseS4gV2UgdGh1cyByZXF1aXJlIHVzZXJzIHRvIGdvIHRocm91Z2ggdGhlIHJlZGlyZWN0aW5nCiAqIFtab25lU3BlY2lmaWNhdGlvbl0gY29uc3RydWN0b3Igd2hpY2ggaW5zdGFudGlhdGVzIHRoaXMgY2xhc3MuCiAqLwpjbGFzcyBfWm9uZVNwZWNpZmljYXRpb24gaW1wbGVtZW50cyBab25lU3BlY2lmaWNhdGlvbiB7CiAgY29uc3QgX1pvbmVTcGVjaWZpY2F0aW9uKAogICAgICB7dGhpcy5oYW5kbGVVbmNhdWdodEVycm9yLAogICAgICB0aGlzLnJ1biwKICAgICAgdGhpcy5ydW5VbmFyeSwKICAgICAgdGhpcy5ydW5CaW5hcnksCiAgICAgIHRoaXMucmVnaXN0ZXJDYWxsYmFjaywKICAgICAgdGhpcy5yZWdpc3RlclVuYXJ5Q2FsbGJhY2ssCiAgICAgIHRoaXMucmVnaXN0ZXJCaW5hcnlDYWxsYmFjaywKICAgICAgdGhpcy5lcnJvckNhbGxiYWNrLAogICAgICB0aGlzLnNjaGVkdWxlTWljcm90YXNrLAogICAgICB0aGlzLmNyZWF0ZVRpbWVyLAogICAgICB0aGlzLmNyZWF0ZVBlcmlvZGljVGltZXIsCiAgICAgIHRoaXMucHJpbnQsCiAgICAgIHRoaXMuZm9ya30pOwoKICBmaW5hbCBIYW5kbGVVbmNhdWdodEVycm9ySGFuZGxlciBoYW5kbGVVbmNhdWdodEVycm9yOwogIGZpbmFsIFJ1bkhhbmRsZXIgcnVuOwogIGZpbmFsIFJ1blVuYXJ5SGFuZGxlciBydW5VbmFyeTsKICBmaW5hbCBSdW5CaW5hcnlIYW5kbGVyIHJ1bkJpbmFyeTsKICBmaW5hbCBSZWdpc3RlckNhbGxiYWNrSGFuZGxlciByZWdpc3RlckNhbGxiYWNrOwogIGZpbmFsIFJlZ2lzdGVyVW5hcnlDYWxsYmFja0hhbmRsZXIgcmVnaXN0ZXJVbmFyeUNhbGxiYWNrOwogIGZpbmFsIFJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2tIYW5kbGVyIHJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s7CiAgZmluYWwgRXJyb3JDYWxsYmFja0hhbmRsZXIgZXJyb3JDYWxsYmFjazsKICBmaW5hbCBTY2hlZHVsZU1pY3JvdGFza0hhbmRsZXIgc2NoZWR1bGVNaWNyb3Rhc2s7CiAgZmluYWwgQ3JlYXRlVGltZXJIYW5kbGVyIGNyZWF0ZVRpbWVyOwogIGZpbmFsIENyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyIGNyZWF0ZVBlcmlvZGljVGltZXI7CiAgZmluYWwgUHJpbnRIYW5kbGVyIHByaW50OwogIGZpbmFsIEZvcmtIYW5kbGVyIGZvcms7Cn0KCi8qKgogKiBBbiBhZGFwdGVkIHZpZXcgb2YgdGhlIHBhcmVudCB6b25lLgogKgogKiBUaGlzIGNsYXNzIGFsbG93cyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSB6b25lIG1ldGhvZCB0byBpbnZva2UgbWV0aG9kcyBvbgogKiB0aGUgcGFyZW50IHpvbmUgd2hpbGUgcmV0YWluaW5nIGtub3dsZWRnZSBvZiB0aGUgb3JpZ2luYXRpbmcgem9uZS4KICoKICogQ3VzdG9tIHpvbmVzIChjcmVhdGVkIHRocm91Z2ggW1pvbmUuZm9ya10gb3IgW3J1blpvbmVkXSkgY2FuIHByb3ZpZGUKICogaW1wbGVtZW50YXRpb25zIG9mIG1vc3QgbWV0aG9kcyBvZiB6b25lcy4gVGhpcyBpcyBzaW1pbGFyIHRvIG92ZXJyaWRpbmcKICogbWV0aG9kcyBvbiBbWm9uZV0sIGV4Y2VwdCB0aGF0IHRoaXMgbWVjaGFuaXNtIGRvZXNuJ3QgcmVxdWlyZSBzdWJjbGFzc2luZy4KICoKICogQSBjdXN0b20gem9uZSBmdW5jdGlvbiAocHJvdmlkZWQgdGhyb3VnaCBhIFtab25lU3BlY2lmaWNhdGlvbl0pIHR5cGljYWxseQogKiByZWNvcmRzIG9yIHdyYXBzIGl0cyBwYXJhbWV0ZXJzIGFuZCB0aGVuIGRlbGVnYXRlcyB0aGUgb3BlcmF0aW9uIHRvIGl0cwogKiBwYXJlbnQgem9uZSB1c2luZyB0aGUgcHJvdmlkZWQgW1pvbmVEZWxlZ2F0ZV0uCiAqCiAqIFdoaWxlIHpvbmVzIGhhdmUgYWNjZXNzIHRvIHRoZWlyIHBhcmVudCB6b25lICh0aHJvdWdoIFtab25lLnBhcmVudF0pIGl0IGlzCiAqIHJlY29tbWVuZGVkIHRvIGNhbGwgdGhlIG1ldGhvZHMgb24gdGhlIHByb3ZpZGVkIHBhcmVudCBkZWxlZ2F0ZSBmb3IgdHdvCiAqIHJlYXNvbnM6CiAqIDEuIHRoZSBkZWxlZ2F0ZSBtZXRob2RzIHRha2UgYW4gYWRkaXRpb25hbCBgem9uZWAgYXJndW1lbnQgd2hpY2ggaXMgdGhlCiAqICAgem9uZSB0aGUgYWN0aW9uIGhhcyBiZWVuIGluaXRpYXRlZCBpbi4KICogMi4gZGVsZWdhdGUgY2FsbHMgYXJlIG1vcmUgZWZmaWNpZW50LCBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24ga25vd3MgaG93CiAqICAgdG8gc2tpcCB6b25lcyB0aGF0IHdvdWxkIGp1c3QgZGVsZWdhdGUgdG8gdGhlaXIgcGFyZW50cy4KICovCmFic3RyYWN0IGNsYXNzIFpvbmVEZWxlZ2F0ZSB7CiAgdm9pZCBoYW5kbGVVbmNhdWdodEVycm9yKFpvbmUgem9uZSwgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSk7CiAgUiBydW48Uj4oWm9uZSB6b25lLCBSIGYoKSk7CiAgUiBydW5VbmFyeTxSLCBUPihab25lIHpvbmUsIFIgZihUIGFyZyksIFQgYXJnKTsKICBSIHJ1bkJpbmFyeTxSLCBUMSwgVDI+KFpvbmUgem9uZSwgUiBmKFQxIGFyZzEsIFQyIGFyZzIpLCBUMSBhcmcxLCBUMiBhcmcyKTsKICBab25lQ2FsbGJhY2s8Uj4gcmVnaXN0ZXJDYWxsYmFjazxSPihab25lIHpvbmUsIFIgZigpKTsKICBab25lVW5hcnlDYWxsYmFjazxSLCBUPiByZWdpc3RlclVuYXJ5Q2FsbGJhY2s8UiwgVD4oWm9uZSB6b25lLCBSIGYoVCBhcmcpKTsKICBab25lQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPiByZWdpc3RlckJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oCiAgICAgIFpvbmUgem9uZSwgUiBmKFQxIGFyZzEsIFQyIGFyZzIpKTsKICBBc3luY0Vycm9yIGVycm9yQ2FsbGJhY2soWm9uZSB6b25lLCBPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSk7CiAgdm9pZCBzY2hlZHVsZU1pY3JvdGFzayhab25lIHpvbmUsIHZvaWQgZigpKTsKICBUaW1lciBjcmVhdGVUaW1lcihab25lIHpvbmUsIER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGYoKSk7CiAgVGltZXIgY3JlYXRlUGVyaW9kaWNUaW1lcihab25lIHpvbmUsIER1cmF0aW9uIHBlcmlvZCwgdm9pZCBmKFRpbWVyIHRpbWVyKSk7CiAgdm9pZCBwcmludChab25lIHpvbmUsIFN0cmluZyBsaW5lKTsKICBab25lIGZvcmsoWm9uZSB6b25lLCBab25lU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uLCBNYXAgem9uZVZhbHVlcyk7Cn0KCi8qKgogKiBBIHpvbmUgcmVwcmVzZW50cyBhbiBlbnZpcm9ubWVudCB0aGF0IHJlbWFpbnMgc3RhYmxlIGFjcm9zcyBhc3luY2hyb25vdXMKICogY2FsbHMuCiAqCiAqIENvZGUgaXMgYWx3YXlzIGV4ZWN1dGVkIGluIHRoZSBjb250ZXh0IG9mIGEgem9uZSwgYXZhaWxhYmxlIGFzCiAqIFtab25lLmN1cnJlbnRdLiBUaGUgaW5pdGlhbCBgbWFpbmAgZnVuY3Rpb24gcnVucyBpbiB0aGUgY29udGV4dCBvZiB0aGUKICogZGVmYXVsdCB6b25lIChbWm9uZS5yb290XSkuIENvZGUgY2FuIGJlIHJ1biBpbiBhIGRpZmZlcmVudCB6b25lIHVzaW5nIGVpdGhlcgogKiBbcnVuWm9uZWRdLCB0byBjcmVhdGUgYSBuZXcgem9uZSwgb3IgW1pvbmUucnVuXSB0byBydW4gY29kZSBpbiB0aGUgY29udGV4dCBvZgogKiBhbiBleGlzdGluZyB6b25lIGxpa2VseSBjcmVhdGVkIHVzaW5nIFtab25lLmZvcmtdLgogKgogKiBEZXZlbG9wZXJzIGNhbiBjcmVhdGUgYSBuZXcgem9uZSB0aGF0IG92ZXJyaWRlcyBzb21lIG9mIHRoZSBmdW5jdGlvbmFsaXR5IG9mCiAqIGFuIGV4aXN0aW5nIHpvbmUuIEZvciBleGFtcGxlLCBjdXN0b20gem9uZXMgY2FuIHJlcGxhY2Ugb2YgbW9kaWZ5IHRoZQogKiBiZWhhdmlvciBvZiBgcHJpbnRgLCB0aW1lcnMsIG1pY3JvdGFza3Mgb3IgaG93IHVuY2F1Z2h0IGVycm9ycyBhcmUgaGFuZGxlZC4KICoKICogVGhlIFtab25lXSBjbGFzcyBpcyBub3Qgc3ViY2xhc3NhYmxlLCBidXQgdXNlcnMgY2FuIHByb3ZpZGUgY3VzdG9tIHpvbmVzIGJ5CiAqIGZvcmtpbmcgYW4gZXhpc3Rpbmcgem9uZSAodXN1YWxseSBbWm9uZS5jdXJyZW50XSkgd2l0aCBhIFtab25lU3BlY2lmaWNhdGlvbl0uCiAqIFRoaXMgaXMgc2ltaWxhciB0byBjcmVhdGluZyBhIG5ldyBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIGJhc2UgYFpvbmVgIGNsYXNzCiAqIGFuZCB0aGF0IG92ZXJyaWRlcyBzb21lIG1ldGhvZHMsIGV4Y2VwdCB3aXRob3V0IGFjdHVhbGx5IGNyZWF0aW5nIGEgbmV3CiAqIGNsYXNzLiBJbnN0ZWFkIHRoZSBvdmVycmlkaW5nIG1ldGhvZHMgYXJlIHByb3ZpZGVkIGFzIGZ1bmN0aW9ucyB0aGF0CiAqIGV4cGxpY2l0bHkgdGFrZSB0aGUgZXF1aXZhbGVudCBvZiB0aGVpciBvd24gY2xhc3MsIHRoZSAic3VwZXIiIGNsYXNzIGFuZCB0aGUKICogYHRoaXNgIG9iamVjdCBhcyBwYXJhbWV0ZXJzLgogKgogKiBBc3luY2hyb25vdXMgY2FsbGJhY2tzIGFsd2F5cyBydW4gaW4gdGhlIGNvbnRleHQgb2YgdGhlIHpvbmUgd2hlcmUgdGhleSB3ZXJlCiAqIHNjaGVkdWxlZC4gVGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyB0d28gc3RlcHM6CiAqIDEuIHRoZSBjYWxsYmFjayBpcyBmaXJzdCByZWdpc3RlcmVkIHVzaW5nIG9uZSBvZiBbcmVnaXN0ZXJDYWxsYmFja10sCiAqICAgW3JlZ2lzdGVyVW5hcnlDYWxsYmFja10sIG9yIFtyZWdpc3RlckJpbmFyeUNhbGxiYWNrXS4gVGhpcyBhbGxvd3MgdGhlIHpvbmUKICogICB0byByZWNvcmQgdGhhdCBhIGNhbGxiYWNrIGV4aXN0cyBhbmQgcG90ZW50aWFsbHkgbW9kaWZ5IGl0IChieSByZXR1cm5pbmcgYQogKiAgIGRpZmZlcmVudCBjYWxsYmFjaykuIFRoZSBjb2RlIGRvaW5nIHRoZSByZWdpc3RyYXRpb24gKGUuZy4sIGBGdXR1cmUudGhlbmApCiAqICAgYWxzbyByZW1lbWJlcnMgdGhlIGN1cnJlbnQgem9uZSBzbyB0aGF0IGl0IGNhbiBsYXRlciBydW4gdGhlIGNhbGxiYWNrIGluCiAqICAgdGhhdCB6b25lLgogKiAyLiBBdCBhIGxhdGVyIHBvaW50IHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGlzIHJ1biBpbiB0aGUgcmVtZW1iZXJlZCB6b25lLgogKgogKiBUaGlzIGlzIGFsbCBoYW5kbGVkIGludGVybmFsbHkgYnkgdGhlIHBsYXRmb3JtIGNvZGUgYW5kIG1vc3QgdXNlcnMgZG9uJ3QgbmVlZAogKiB0byB3b3JyeSBhYm91dCBpdC4gSG93ZXZlciwgZGV2ZWxvcGVycyBvZiBuZXcgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMsCiAqIHByb3ZpZGVkIGJ5IHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBvciB0aHJvdWdoIG5hdGl2ZSBleHRlbnNpb25zLCBtdXN0IGZvbGxvdwogKiB0aGUgcHJvdG9jb2wgdG8gYmUgem9uZSBjb21wYXRpYmxlLgogKgogKiBGb3IgY29udmVuaWVuY2UsIHpvbmVzIHByb3ZpZGUgW2JpbmRDYWxsYmFja10gKGFuZCB0aGUgY29ycmVzcG9uZGluZwogKiBbYmluZFVuYXJ5Q2FsbGJhY2tdIGFuZCBbYmluZEJpbmFyeUNhbGxiYWNrXSkgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVzcGVjdAogKiB0aGUgem9uZSBjb250cmFjdDogdGhlc2UgZnVuY3Rpb25zIGZpcnN0IGludm9rZSB0aGUgY29ycmVzcG9uZGluZyBgcmVnaXN0ZXJgCiAqIGZ1bmN0aW9ucyBhbmQgdGhlbiB3cmFwIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBzbyB0aGF0IGl0IHJ1bnMgaW4gdGhlIGN1cnJlbnQKICogem9uZSB3aGVuIGl0IGlzIGxhdGVyIGFzeW5jaHJvbm91c2x5IGludm9rZWQuCiAqCiAqIFNpbWlsYXJseSwgem9uZXMgcHJvdmlkZSBbYmluZENhbGxiYWNrR3VhcmRlZF0gKGFuZCB0aGUgY29ycmVzcG9uZGluZwogKiBbYmluZFVuYXJ5Q2FsbGJhY2tHdWFyZGVkXSBhbmQgW2JpbmRCaW5hcnlDYWxsYmFja0d1YXJkZWRdKSwgd2hlbiB0aGUKICogY2FsbGJhY2sgc2hvdWxkIGJlIGludm9rZWQgdGhyb3VnaCBbWm9uZS5ydW5HdWFyZGVkXS4KICovCmFic3RyYWN0IGNsYXNzIFpvbmUgewogIC8vIFByaXZhdGUgY29uc3RydWN0b3Igc28gdGhhdCBpdCBpcyBub3QgcG9zc2libGUgaW5zdGFudGlhdGUgYSBab25lIGNsYXNzLgogIFpvbmUuXygpOwoKICAvKioKICAgKiBUaGUgcm9vdCB6b25lLgogICAqCiAgICogQWxsIGlzb2xhdGUgZW50cnkgZnVuY3Rpb25zIChgbWFpbmAgb3Igc3Bhd25lZCBmdW5jdGlvbnMpIHN0YXJ0IHJ1bm5pbmcgaW4KICAgKiB0aGUgcm9vdCB6b25lICh0aGF0IGlzLCBbWm9uZS5jdXJyZW50XSBpcyBpZGVudGljYWwgdG8gW1pvbmUucm9vdF0gd2hlbiB0aGUKICAgKiBlbnRyeSBmdW5jdGlvbiBpcyBjYWxsZWQpLiBJZiBubyBjdXN0b20gem9uZSBpcyBjcmVhdGVkLCB0aGUgcmVzdCBvZiB0aGUKICAgKiBwcm9ncmFtIGFsd2F5cyBydW5zIGluIHRoZSByb290IHpvbmUuCiAgICoKICAgKiBUaGUgcm9vdCB6b25lIGltcGxlbWVudHMgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgYWxsIHpvbmUgb3BlcmF0aW9ucy4KICAgKiBNYW55IG1ldGhvZHMsIGxpa2UgW3JlZ2lzdGVyQ2FsbGJhY2tdIGRvIHRoZSBiYXJlIG1pbmltdW0gcmVxdWlyZWQgb2YgdGhlCiAgICogZnVuY3Rpb24sIGFuZCBhcmUgb25seSBwcm92aWRlZCBhcyBhIGhvb2sgZm9yIGN1c3RvbSB6b25lcy4gT3RoZXJzLCBsaWtlCiAgICogW3NjaGVkdWxlTWljcm90YXNrXSwgaW50ZXJhY3Qgd2l0aCB0aGUgdW5kZXJseWluZyBzeXN0ZW0gdG8gaW1wbGVtZW50IHRoZQogICAqIGRlc2lyZWQgYmVoYXZpb3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFpvbmUgcm9vdCA9IF9yb290Wm9uZTsKCiAgLyoqIFRoZSBjdXJyZW50bHkgcnVubmluZyB6b25lLiAqLwogIHN0YXRpYyBab25lIF9jdXJyZW50ID0gX3Jvb3Rab25lOwoKICAvKiogVGhlIHpvbmUgdGhhdCBpcyBjdXJyZW50bHkgYWN0aXZlLiAqLwogIHN0YXRpYyBab25lIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICAvKioKICAgKiBIYW5kbGVzIHVuY2F1Z2h0IGFzeW5jaHJvbm91cyBlcnJvcnMuCiAgICoKICAgKiBUaGVyZSBhcmUgdHdvIGtpbmQgb2YgYXN5bmNocm9ub3VzIGVycm9ycyB0aGF0IGFyZSBoYW5kbGVkIGJ5IHRoaXMKICAgKiBmdW5jdGlvbjoKICAgKiAxLiBVbmNhdWdodCBlcnJvcnMgdGhhdCB3ZXJlIHRocm93biBpbiBhc3luY2hyb25vdXMgY2FsbGJhY2tzLCBmb3IgZXhhbXBsZSwKICAgKiAgIGEgYHRocm93YCBpbiB0aGUgZnVuY3Rpb24gcGFzc2VkIHRvIFtUaW1lci5ydW5dLgogICAqIDIuIEFzeW5jaHJvbm91cyBlcnJvcnMgdGhhdCBhcmUgcHVzaGVkIHRocm91Z2ggW0Z1dHVyZV0gYW5kIFtTdHJlYW1dCiAgICogICBjaGFpbnMsIGJ1dCBmb3Igd2hpY2ggbm8gY2hpbGQgcmVnaXN0ZXJlZCBhbiBlcnJvciBoYW5kbGVyLgogICAqICAgTW9zdCBhc3luY2hyb25vdXMgY2xhc3NlcywgbGlrZSBbRnV0dXJlXSBvciBbU3RyZWFtXSBwdXNoIGVycm9ycyB0byB0aGVpcgogICAqICAgbGlzdGVuZXJzLiBFcnJvcnMgYXJlIHByb3BhZ2F0ZWQgdGhpcyB3YXkgdW50aWwgZWl0aGVyIGEgbGlzdGVuZXIgaGFuZGxlcwogICAqICAgdGhlIGVycm9yIChmb3IgZXhhbXBsZSB3aXRoIFtGdXR1cmUuY2F0Y2hFcnJvcl0pLCBvciBubyBsaXN0ZW5lciBpcwogICAqICAgYXZhaWxhYmxlIGFueW1vcmUuIEluIHRoZSBsYXR0ZXIgY2FzZSwgZnV0dXJlcyBhbmQgc3RyZWFtcyBpbnZva2UgdGhlCiAgICogICB6b25lJ3MgW2hhbmRsZVVuY2F1Z2h0RXJyb3JdLgogICAqCiAgICogQnkgZGVmYXVsdCwgd2hlbiBoYW5kbGVkIGJ5IHRoZSByb290IHpvbmUsIHVuY2F1Z2h0IGFzeW5jaHJvbm91cyBlcnJvcnMgYXJlCiAgICogdHJlYXRlZCBsaWtlIHVuY2F1Z2h0IHN5bmNocm9ub3VzIGV4Y2VwdGlvbnMuCiAgICovCiAgdm9pZCBoYW5kbGVVbmNhdWdodEVycm9yKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpOwoKICAvKioKICAgKiBUaGUgcGFyZW50IHpvbmUgb2YgdGhlIHRoaXMgem9uZS4KICAgKgogICAqIElzIGBudWxsYCBpZiBgdGhpc2AgaXMgdGhlIFtyb290XSB6b25lLgogICAqCiAgICogWm9uZXMgYXJlIGNyZWF0ZWQgYnkgW2ZvcmtdIG9uIGFuIGV4aXN0aW5nIHpvbmUsIG9yIGJ5IFtydW5ab25lZF0gd2hpY2gKICAgKiBmb3JrcyB0aGUgW2N1cnJlbnRdIHpvbmUuIFRoZSBuZXcgem9uZSdzIHBhcmVudCB6b25lIGlzIHRoZSB6b25lIGl0IHdhcwogICAqIGZvcmtlZCBmcm9tLgogICAqLwogIFpvbmUgZ2V0IHBhcmVudDsKCiAgLyoqCiAgICogVGhlIGVycm9yIHpvbmUgaXMgdGhlIG9uZSB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBkZWFsaW5nIHdpdGggdW5jYXVnaHQKICAgKiBlcnJvcnMuCiAgICoKICAgKiBUaGlzIGlzIHRoZSBjbG9zZXN0IHBhcmVudCB6b25lIG9mIHRoaXMgem9uZSB0aGF0IHByb3ZpZGVzIGEKICAgKiBbaGFuZGxlVW5jYXVnaHRFcnJvcl0gbWV0aG9kLgogICAqCiAgICogQXN5bmNocm9ub3VzIGVycm9ycyBuZXZlciBjcm9zcyB6b25lIGJvdW5kYXJpZXMgYmV0d2VlbiB6b25lcyB3aXRoCiAgICogZGlmZmVyZW50IGVycm9yIGhhbmRsZXJzLgogICAqCiAgICogRXhhbXBsZToKICAgKiBgYGAKICAgKiBpbXBvcnQgJ2RhcnQ6YXN5bmMnOwogICAqCiAgICogbWFpbigpIHsKICAgKiAgIHZhciBmdXR1cmU7CiAgICogICBydW5ab25lZCgoKSB7CiAgICogICAgIC8vIFRoZSBhc3luY2hyb25vdXMgZXJyb3IgaXMgY2F1Z2h0IGJ5IHRoZSBjdXN0b20gem9uZSB3aGljaCBwcmludHMKICAgKiAgICAgLy8gJ2FzeW5jaHJvbm91cyBlcnJvcicuCiAgICogICAgIGZ1dHVyZSA9IG5ldyBGdXR1cmUuZXJyb3IoImFzeW5jaHJvbm91cyBlcnJvciIpOwogICAqICAgfSwgb25FcnJvcjogKGUpIHsgcHJpbnQoZSk7IH0pOyAgLy8gQ3JlYXRlcyBhIHpvbmUgd2l0aCBhbiBlcnJvciBoYW5kbGVyLgogICAqICAgLy8gVGhlIGZvbGxvd2luZyBgY2F0Y2hFcnJvcmAgaGFuZGxlciBpcyBuZXZlciBpbnZva2VkLCBiZWNhdXNlIHRoZQogICAqICAgLy8gY3VzdG9tIHpvbmUgY3JlYXRlZCBieSB0aGUgY2FsbCB0byBgcnVuWm9uZWRgIHByb3ZpZGVzIGFuCiAgICogICAvLyBlcnJvciBoYW5kbGVyLgogICAqICAgZnV0dXJlLmNhdGNoRXJyb3IoKGUpIHsgdGhyb3cgImlzIG5ldmVyIHJlYWNoZWQiOyB9KTsKICAgKiB9CiAgICogYGBgCiAgICoKICAgKiBOb3RlIHRoYXQgZXJyb3JzIGNhbm5vdCBlbnRlciBhIGNoaWxkIHpvbmUgd2l0aCBhIGRpZmZlcmVudCBlcnJvciBoYW5kbGVyCiAgICogZWl0aGVyOgogICAqIGBgYAogICAqIGltcG9ydCAnZGFydDphc3luYyc7CiAgICoKICAgKiBtYWluKCkgewogICAqICAgcnVuWm9uZWQoKCkgewogICAqICAgICAvLyBUaGUgZm9sbG93aW5nIGFzeW5jaHJvbm91cyBlcnJvciBpcyAqbm90KiBjYXVnaHQgYnkgdGhlIGBjYXRjaEVycm9yYAogICAqICAgICAvLyBpbiB0aGUgbmVzdGVkIHpvbmUsIHNpbmNlIGVycm9ycyBhcmUgbm90IHRvIGNyb3NzIHpvbmUgYm91bmRhcmllcwogICAqICAgICAvLyB3aXRoIGRpZmZlcmVudCBlcnJvciBoYW5kbGVycy4KICAgKiAgICAgLy8gSW5zdGVhZCB0aGUgZXJyb3IgaXMgaGFuZGxlZCBieSB0aGUgY3VycmVudCBlcnJvciBoYW5kbGVyLAogICAqICAgICAvLyBwcmludGluZyAiQ2F1Z2h0IGJ5IG91dGVyIHpvbmU6IGFzeW5jaHJvbm91cyBlcnJvciIuCiAgICogICAgIHZhciBmdXR1cmUgPSBuZXcgRnV0dXJlLmVycm9yKCJhc3luY2hyb25vdXMgZXJyb3IiKTsKICAgKiAgICAgcnVuWm9uZWQoKCkgewogICAqICAgICAgIGZ1dHVyZS5jYXRjaEVycm9yKChlKSB7IHRocm93ICJpcyBuZXZlciByZWFjaGVkIjsgfSk7CiAgICogICAgIH0sIG9uRXJyb3I6IChlKSB7IHRocm93ICJpcyBuZXZlciByZWFjaGVkIjsgfSk7CiAgICogICB9LCBvbkVycm9yOiAoZSkgeyBwcmludCgiQ2F1Z2h0IGJ5IG91dGVyIHpvbmU6ICRlIik7IH0pOwogICAqIH0KICAgKiBgYGAKICAgKi8KICBab25lIGdldCBlcnJvclpvbmU7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiBgdGhpc2AgYW5kIFtvdGhlclpvbmVdIGFyZSBpbiB0aGUgc2FtZSBlcnJvciB6b25lLgogICAqCiAgICogVHdvIHpvbmVzIGFyZSBpbiB0aGUgc2FtZSBlcnJvciB6b25lIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBbZXJyb3Jab25lXS4KICAgKi8KICBib29sIGluU2FtZUVycm9yWm9uZShab25lIG90aGVyWm9uZSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgem9uZSBhcyBhIGNoaWxkIG9mIGB0aGlzYC4KICAgKgogICAqIFRoZSBuZXcgem9uZSB1c2VzIHRoZSBjbG9zdXJlcyBpbiB0aGUgZ2l2ZW4gW3NwZWNpZmljYXRpb25dIHRvIG92ZXJyaWRlCiAgICogdGhlIGN1cnJlbnQncyB6b25lIGJlaGF2aW9yLiBBbGwgc3BlY2lmaWNhdGlvbiBlbnRyaWVzIHRoYXQgYXJlIGBudWxsYAogICAqIGluaGVyaXQgdGhlIGJlaGF2aW9yIGZyb20gdGhlIHBhcmVudCB6b25lIChgdGhpc2ApLgogICAqCiAgICogVGhlIG5ldyB6b25lIGluaGVyaXRzIHRoZSBzdG9yZWQgdmFsdWVzIChhY2Nlc3NlZCB0aHJvdWdoIFtvcGVyYXRvciBbXV0pCiAgICogb2YgdGhpcyB6b25lIGFuZCB1cGRhdGVzIHRoZW0gd2l0aCB2YWx1ZXMgZnJvbSBbem9uZVZhbHVlc10sIHdoaWNoIGVpdGhlcgogICAqIGFkZHMgbmV3IHZhbHVlcyBvciBvdmVycmlkZXMgZXhpc3Rpbmcgb25lcy4KICAgKgogICAqIE5vdGUgdGhhdCB0aGUgZm9yayBvcGVyYXRpb24gaXMgaW50ZXJjZXB0aWJsZS4gQSB6b25lIGNhbiB0aHVzIGNoYW5nZQogICAqIHRoZSB6b25lIHNwZWNpZmljYXRpb24gKG9yIHpvbmUgdmFsdWVzKSwgZ2l2aW5nIHRoZSBmb3JraW5nIHpvbmUgZnVsbAogICAqIGNvbnRyb2wgb3ZlciB0aGUgY2hpbGQgem9uZS4KICAgKi8KICBab25lIGZvcmsoe1pvbmVTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24sIE1hcCB6b25lVmFsdWVzfSk7CgogIC8qKgogICAqIEV4ZWN1dGVzIFthY3Rpb25dIGluIHRoaXMgem9uZS4KICAgKgogICAqIEJ5IGRlZmF1bHQgKGFzIGltcGxlbWVudGVkIGluIHRoZSBbcm9vdF0gem9uZSksIHJ1bnMgW2FjdGlvbl0KICAgKiB3aXRoIFtjdXJyZW50XSBzZXQgdG8gdGhpcyB6b25lLgogICAqCiAgICogSWYgW2FjdGlvbl0gdGhyb3dzLCB0aGUgc3luY2hyb25vdXMgZXhjZXB0aW9uIGlzIG5vdCBjYXVnaHQgYnkgdGhlIHpvbmUncwogICAqIGVycm9yIGhhbmRsZXIuIFVzZSBbcnVuR3VhcmRlZF0gdG8gYWNoaWV2ZSB0aGF0LgogICAqCiAgICogU2luY2UgdGhlIHJvb3Qgem9uZSBpcyB0aGUgb25seSB6b25lIHRoYXQgY2FuIG1vZGlmeSB0aGUgdmFsdWUgb2YKICAgKiBbY3VycmVudF0sIGN1c3RvbSB6b25lcyBpbnRlcmNlcHRpbmcgcnVuIHNob3VsZCBhbHdheXMgZGVsZWdhdGUgdG8gdGhlaXIKICAgKiBwYXJlbnQgem9uZS4gVGhleSBtYXkgdGFrZSBhY3Rpb25zIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGNhbGwuCiAgICovCiAgUiBydW48Uj4oUiBhY3Rpb24oKSk7CgogIC8qKgogICAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBbYWN0aW9uXSB3aXRoIFthcmd1bWVudF0gaW4gdGhpcyB6b25lLgogICAqCiAgICogQXMgW3J1bl0gZXhjZXB0IHRoYXQgW2FjdGlvbl0gaXMgY2FsbGVkIHdpdGggb25lIFthcmd1bWVudF0gaW5zdGVhZCBvZgogICAqIG5vbmUuCiAgICovCiAgUiBydW5VbmFyeTxSLCBUPihSIGFjdGlvbihUIGFyZ3VtZW50KSwgVCBhcmd1bWVudCk7CgogIC8qKgogICAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBbYWN0aW9uXSB3aXRoIFthcmd1bWVudDFdIGFuZCBbYXJndW1lbnQyXSBpbiB0aGlzCiAgICogem9uZS4KICAgKgogICAqIEFzIFtydW5dIGV4Y2VwdCB0aGF0IFthY3Rpb25dIGlzIGNhbGxlZCB3aXRoIHR3byBhcmd1bWVudHMgaW5zdGVhZCBvZiBub25lLgogICAqLwogIFIgcnVuQmluYXJ5PFIsIFQxLCBUMj4oCiAgICAgIFIgYWN0aW9uKFQxIGFyZ3VtZW50MSwgVDIgYXJndW1lbnQyKSwgVDEgYXJndW1lbnQxLCBUMiBhcmd1bWVudDIpOwoKICAvKioKICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gW2FjdGlvbl0gaW4gdGhpcyB6b25lIGFuZCBjYXRjaGVzIHN5bmNocm9ub3VzCiAgICogZXJyb3JzLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvOgogICAqIGBgYAogICAqIHRyeSB7CiAgICogICB0aGlzLnJ1bihhY3Rpb24pOwogICAqIH0gY2F0Y2ggKGUsIHMpIHsKICAgKiAgIHRoaXMuaGFuZGxlVW5jYXVnaHRFcnJvcihlLCBzKTsKICAgKiB9CiAgICogYGBgCiAgICoKICAgKiBTZWUgW3J1bl0uCiAgICovCiAgdm9pZCBydW5HdWFyZGVkKHZvaWQgYWN0aW9uKCkpOwoKICAvKioKICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gW2FjdGlvbl0gd2l0aCBbYXJndW1lbnRdIGluIHRoaXMgem9uZSBhbmQKICAgKiBjYXRjaGVzIHN5bmNocm9ub3VzIGVycm9ycy4KICAgKgogICAqIFNlZSBbcnVuR3VhcmRlZF0uCiAgICovCiAgdm9pZCBydW5VbmFyeUd1YXJkZWQ8VD4odm9pZCBhY3Rpb24oVCBhcmd1bWVudCksIFQgYXJndW1lbnQpOwoKICAvKioKICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gW2FjdGlvbl0gd2l0aCBbYXJndW1lbnQxXSBhbmQgW2FyZ3VtZW50Ml0gaW4gdGhpcwogICAqIHpvbmUgYW5kIGNhdGNoZXMgc3luY2hyb25vdXMgZXJyb3JzLgogICAqCiAgICogU2VlIFtydW5HdWFyZGVkXS4KICAgKi8KICB2b2lkIHJ1bkJpbmFyeUd1YXJkZWQ8VDEsIFQyPigKICAgICAgdm9pZCBhY3Rpb24oVDEgYXJndW1lbnQxLCBUMiBhcmd1bWVudDIpLCBUMSBhcmd1bWVudDEsIFQyIGFyZ3VtZW50Mik7CgogIC8qKgogICAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gY2FsbGJhY2sgaW4gdGhpcyB6b25lLgogICAqCiAgICogV2hlbiBpbXBsZW1lbnRpbmcgYW4gYXN5bmNocm9ub3VzIHByaW1pdGl2ZSB0aGF0IHVzZXMgY2FsbGJhY2tzLCB0aGUKICAgKiBjYWxsYmFjayBtdXN0IGJlIHJlZ2lzdGVyZWQgdXNpbmcgW3JlZ2lzdGVyQ2FsbGJhY2tdIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUKICAgKiB1c2VyIHByb3ZpZGVzIHRoZSBjYWxsYmFjay4gVGhpcyBhbGxvd3Mgem9uZXMgdG8gcmVjb3JkIG90aGVyIGluZm9ybWF0aW9uCiAgICogdGhhdCB0aGV5IG5lZWQgYXQgdGhlIHNhbWUgdGltZSwgcGVyaGFwcyBldmVuIHdyYXBwaW5nIHRoZSBjYWxsYmFjaywgc28KICAgKiB0aGF0IHRoZSBjYWxsYmFjayBpcyBwcmVwYXJlZCB3aGVuIGl0IGlzIGxhdGVyIHJ1biBpbiB0aGUgc2FtZSB6b25lcwogICAqICh1c2luZyBbcnVuXSkuIEZvciBleGFtcGxlLCBhIHpvbmUgbWF5IGRlY2lkZQogICAqIHRvIHN0b3JlIHRoZSBzdGFjayB0cmFjZSAoYXQgdGhlIHRpbWUgb2YgdGhlIHJlZ2lzdHJhdGlvbikgd2l0aCB0aGUKICAgKiBjYWxsYmFjay4KICAgKgogICAqIFJldHVybnMgdGhlIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIHByb3ZpZGVkCiAgICogW2NhbGxiYWNrXS4gRnJlcXVlbnRseSB6b25lcyBzaW1wbHkgcmV0dXJuIHRoZSBvcmlnaW5hbCBjYWxsYmFjay4KICAgKgogICAqIEN1c3RvbSB6b25lcyBtYXkgaW50ZXJjZXB0IHRoaXMgb3BlcmF0aW9uLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpbgogICAqIFtab25lLnJvb3RdIHJldHVybnMgdGhlIG9yaWdpbmFsIGNhbGxiYWNrIHVuY2hhbmdlZC4KICAgKi8KICBab25lQ2FsbGJhY2s8Uj4gcmVnaXN0ZXJDYWxsYmFjazxSPihSIGNhbGxiYWNrKCkpOwoKICAvKioKICAgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGNhbGxiYWNrIGluIHRoaXMgem9uZS4KICAgKgogICAqIFNpbWlsYXIgdG8gW3JlZ2lzdGVyQ2FsbGJhY2tdIGJ1dCB3aXRoIGEgdW5hcnkgY2FsbGJhY2suCiAgICovCiAgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4gcmVnaXN0ZXJVbmFyeUNhbGxiYWNrPFIsIFQ+KFIgY2FsbGJhY2soVCBhcmcpKTsKCiAgLyoqCiAgICogUmVnaXN0ZXJzIHRoZSBnaXZlbiBjYWxsYmFjayBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiBTaW1pbGFyIHRvIFtyZWdpc3RlckNhbGxiYWNrXSBidXQgd2l0aCBhIHVuYXJ5IGNhbGxiYWNrLgogICAqLwogIFpvbmVCaW5hcnlDYWxsYmFjazxSLCBUMSwgVDI+IHJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPigKICAgICAgUiBjYWxsYmFjayhUMSBhcmcxLCBUMiBhcmcyKSk7CgogIC8qKgogICAqICBSZWdpc3RlcnMgdGhlIHByb3ZpZGVkIFtjYWxsYmFja10gYW5kIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwKICAgKiAgZXhlY3V0ZSBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiAgRXF1aXZhbGVudCB0bzoKICAgKgogICAqICAgICAgWm9uZUNhbGxiYWNrIHJlZ2lzdGVyZWQgPSB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2soY2FsbGJhY2spOwogICAqICAgICAgcmV0dXJuICgpID0+IHRoaXMucnVuKHJlZ2lzdGVyZWQpOwogICAqCiAgICovCiAgWm9uZUNhbGxiYWNrPFI+IGJpbmRDYWxsYmFjazxSPihSIGNhbGxiYWNrKCkpOwoKICAvKioKICAgKiAgUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCBbY2FsbGJhY2tdIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsCiAgICogIGV4ZWN1dGUgaW4gdGhpcyB6b25lLgogICAqCiAgICogIEVxdWl2YWxlbnQgdG86CiAgICoKICAgKiAgICAgIFpvbmVDYWxsYmFjayByZWdpc3RlcmVkID0gdGhpcy5yZWdpc3RlclVuYXJ5Q2FsbGJhY2soY2FsbGJhY2spOwogICAqICAgICAgcmV0dXJuIChhcmcpID0+IHRoaW4ucnVuVW5hcnkocmVnaXN0ZXJlZCwgYXJnKTsKICAgKi8KICBab25lVW5hcnlDYWxsYmFjazxSLCBUPiBiaW5kVW5hcnlDYWxsYmFjazxSLCBUPihSIGNhbGxiYWNrKFQgYXJndW1lbnQpKTsKCiAgLyoqCiAgICogIFJlZ2lzdGVycyB0aGUgcHJvdmlkZWQgW2NhbGxiYWNrXSBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbAogICAqICBleGVjdXRlIGluIHRoaXMgem9uZS4KICAgKgogICAqICBFcXVpdmFsZW50IHRvOgogICAqCiAgICogICAgICBab25lQ2FsbGJhY2sgcmVnaXN0ZXJlZCA9IHJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2soY2FsbGJhY2spOwogICAqICAgICAgcmV0dXJuIChhcmcxLCBhcmcyKSA9PiB0aGluLnJ1bkJpbmFyeShyZWdpc3RlcmVkLCBhcmcxLCBhcmcyKTsKICAgKi8KICBab25lQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPiBiaW5kQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPigKICAgICAgUiBjYWxsYmFjayhUMSBhcmd1bWVudDEsIFQyIGFyZ3VtZW50MikpOwoKICAvKioKICAgKiBSZWdpc3RlcnMgdGhlIHByb3ZpZGVkIFtjYWxsYmFja10gYW5kIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwKICAgKiBleGVjdXRlIGluIHRoaXMgem9uZS4KICAgKgogICAqIFdoZW4gdGhlIGZ1bmN0aW9uIGV4ZWN1dGVzLCBlcnJvcnMgYXJlIGNhdWdodCBhbmQgdHJlYXRlZCBhcyB1bmNhdWdodAogICAqIGVycm9ycy4KICAgKgogICAqIEVxdWl2YWxlbnQgdG86CiAgICoKICAgKiAgICAgWm9uZUNhbGxiYWNrIHJlZ2lzdGVyZWQgPSB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2soY2FsbGJhY2spOwogICAqICAgICByZXR1cm4gKCkgPT4gdGhpcy5ydW5HdWFyZGVkKHJlZ2lzdGVyZWQpOwogICAqCiAgICovCiAgdm9pZCBGdW5jdGlvbigpIGJpbmRDYWxsYmFja0d1YXJkZWQodm9pZCBjYWxsYmFjaygpKTsKCiAgLyoqCiAgICogUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCBbY2FsbGJhY2tdIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsCiAgICogZXhlY3V0ZSBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiBXaGVuIHRoZSBmdW5jdGlvbiBleGVjdXRlcywgZXJyb3JzIGFyZSBjYXVnaHQgYW5kIHRyZWF0ZWQgYXMgdW5jYXVnaHQKICAgKiBlcnJvcnMuCiAgICoKICAgKiBFcXVpdmFsZW50IHRvOgogICAqCiAgICogICAgIFpvbmVDYWxsYmFjayByZWdpc3RlcmVkID0gdGhpcy5yZWdpc3RlclVuYXJ5Q2FsbGJhY2soY2FsbGJhY2spOwogICAqICAgICByZXR1cm4gKGFyZykgPT4gdGhpcy5ydW5VbmFyeUd1YXJkZWQocmVnaXN0ZXJlZCwgYXJnKTsKICAgKi8KICB2b2lkIEZ1bmN0aW9uKFQpIGJpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZDxUPih2b2lkIGNhbGxiYWNrKFQgYXJndW1lbnQpKTsKCiAgLyoqCiAgICogIFJlZ2lzdGVycyB0aGUgcHJvdmlkZWQgW2NhbGxiYWNrXSBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbAogICAqICBleGVjdXRlIGluIHRoaXMgem9uZS4KICAgKgogICAqICBFcXVpdmFsZW50IHRvOgogICAqCiAgICogICAgICBab25lQ2FsbGJhY2sgcmVnaXN0ZXJlZCA9IHJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2soY2FsbGJhY2spOwogICAqICAgICAgcmV0dXJuIChhcmcxLCBhcmcyKSA9PiB0aGlzLnJ1bkJpbmFyeUd1YXJkZWQocmVnaXN0ZXJlZCwgYXJnMSwgYXJnMik7CiAgICovCiAgdm9pZCBGdW5jdGlvbihUMSwgVDIpIGJpbmRCaW5hcnlDYWxsYmFja0d1YXJkZWQ8VDEsIFQyPigKICAgICAgdm9pZCBjYWxsYmFjayhUMSBhcmd1bWVudDEsIFQyIGFyZ3VtZW50MikpOwoKICAvKioKICAgKiBJbnRlcmNlcHRzIGVycm9ycyB3aGVuIGFkZGVkIHByb2dyYW1tYXRpY2FsbHkgdG8gYSBgRnV0dXJlYCBvciBgU3RyZWFtYC4KICAgKgogICAqIFdoZW4gY2FsbGluZyBbQ29tcGxldGVyLmNvbXBsZXRlRXJyb3JdLCBbU3RyZWFtQ29udHJvbGxlci5hZGRFcnJvcl0sCiAgICogb3Igc29tZSBbRnV0dXJlXSBjb25zdHJ1Y3RvcnMsIHRoZSBjdXJyZW50IHpvbmUgaXMgYWxsb3dlZCB0byBpbnRlcmNlcHQKICAgKiBhbmQgcmVwbGFjZSB0aGUgZXJyb3IuCiAgICoKICAgKiBGdXR1cmUgY29uc3RydWN0b3JzIGludm9rZSB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIGVycm9yIGlzIHJlY2VpdmVkCiAgICogZGlyZWN0bHksIGZvciBleGFtcGxlIHdpdGggW0Z1dHVyZS5lcnJvcl0sIG9yIHdoZW4gdGhlIGVycm9yIGlzIGNhdWdodAogICAqIHN5bmNocm9ub3VzbHksIGZvciBleGFtcGxlIHdpdGggW0Z1dHVyZS5zeW5jXS4KICAgKgogICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGFuIGVycm9yIGlzIG9ubHkgc2VudCB0aHJvdWdoIFtlcnJvckNhbGxiYWNrXQogICAqIG9uY2UuIExpYnJhcmllcyB0aGF0IHVzZSBpbnRlcm1lZGlhdGUgY29udHJvbGxlcnMgb3IgY29tcGxldGVycyBtaWdodAogICAqIGVuZCB1cCBpbnZva2luZyBbZXJyb3JDYWxsYmFja10gbXVsdGlwbGUgdGltZXMuCiAgICoKICAgKiBSZXR1cm5zIGBudWxsYCBpZiBubyByZXBsYWNlbWVudCBpcyBkZXNpcmVkLiBPdGhlcndpc2UgcmV0dXJucyBhbiBpbnN0YW5jZQogICAqIG9mIFtBc3luY0Vycm9yXSBob2xkaW5nIHRoZSBuZXcgcGFpciBvZiBlcnJvciBhbmQgc3RhY2sgdHJhY2UuCiAgICoKICAgKiBBbHRob3VnaCBub3QgcmVjb21tZW5kZWQsIHRoZSByZXR1cm5lZCBpbnN0YW5jZSBtYXkgaGF2ZSBpdHMgYGVycm9yYCBtZW1iZXIKICAgKiAoW0FzeW5jRXJyb3IuZXJyb3JdKSBiZSBlcXVhbCB0byBgbnVsbGAgaW4gd2hpY2ggY2FzZSB0aGUgZXJyb3Igc2hvdWxkIGJlCiAgICogcmVwbGFjZWQgYnkgYSBbTnVsbFRocm93bkVycm9yXS4KICAgKgogICAqIEN1c3RvbSB6b25lcyBtYXkgaW50ZXJjZXB0IHRoaXMgb3BlcmF0aW9uLgogICAqCiAgICogSW1wbGVtZW50YXRpb25zIG9mIGEgbmV3IGFzeW5jaHJvbm91cyBwcmltaXRpdmUgdGhhdCBjb252ZXJ0cyBzeW5jaHJvbm91cwogICAqIGVycm9ycyB0byBhc3luY2hyb25vdXMgZXJyb3JzIHJhcmVseSBuZWVkIHRvIGludm9rZSBbZXJyb3JDYWxsYmFja10sIHNpbmNlCiAgICogZXJyb3JzIGFyZSB1c3VhbGx5IHJlcG9ydGVkIHRocm91Z2ggZnV0dXJlIGNvbXBsZXRlcnMgb3Igc3RyZWFtCiAgICogY29udHJvbGxlcnMuCiAgICovCiAgQXN5bmNFcnJvciBlcnJvckNhbGxiYWNrKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKTsKCiAgLyoqCiAgICogUnVucyBbY2FsbGJhY2tdIGFzeW5jaHJvbm91c2x5IGluIHRoaXMgem9uZS4KICAgKgogICAqIFRoZSBnbG9iYWwgYHNjaGVkdWxlTWljcm90YXNrYCBkZWxlZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgem9uZSdzCiAgICogW3NjaGVkdWxlTWljcm90YXNrXS4gVGhlIHJvb3Qgem9uZSdzIGltcGxlbWVudGF0aW9uIGludGVyYWN0cyB3aXRoIHRoZQogICAqIHVuZGVybHlpbmcgc3lzdGVtIHRvIHNjaGVkdWxlIHRoZSBnaXZlbiBjYWxsYmFjayBhcyBhIG1pY3JvdGFzay4KICAgKgogICAqIEN1c3RvbSB6b25lcyBtYXkgaW50ZXJjZXB0IHRoaXMgb3BlcmF0aW9uIChmb3IgZXhhbXBsZSB0byB3cmFwIHRoZSBnaXZlbgogICAqIFtjYWxsYmFja10pLgogICAqLwogIHZvaWQgc2NoZWR1bGVNaWNyb3Rhc2sodm9pZCBjYWxsYmFjaygpKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFRpbWVyIHdoZXJlIHRoZSBjYWxsYmFjayBpcyBleGVjdXRlZCBpbiB0aGlzIHpvbmUuCiAgICovCiAgVGltZXIgY3JlYXRlVGltZXIoRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgY2FsbGJhY2soKSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBwZXJpb2RpYyBUaW1lciB3aGVyZSB0aGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgaW4gdGhpcyB6b25lLgogICAqLwogIFRpbWVyIGNyZWF0ZVBlcmlvZGljVGltZXIoRHVyYXRpb24gcGVyaW9kLCB2b2lkIGNhbGxiYWNrKFRpbWVyIHRpbWVyKSk7CgogIC8qKgogICAqIFByaW50cyB0aGUgZ2l2ZW4gW2xpbmVdLgogICAqCiAgICogVGhlIGdsb2JhbCBgcHJpbnRgIGZ1bmN0aW9uIGRlbGVnYXRlcyB0byB0aGUgY3VycmVudCB6b25lJ3MgW3ByaW50XQogICAqIGZ1bmN0aW9uIHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGludGVyY2VwdCBwcmludGluZy4KICAgKgogICAqIEV4YW1wbGU6CiAgICogYGBgCiAgICogaW1wb3J0ICdkYXJ0OmFzeW5jJzsKICAgKgogICAqIG1haW4oKSB7CiAgICogICBydW5ab25lZCgoKSB7CiAgICogICAgIC8vIEVuZHMgdXAgcHJpbnRpbmc6ICJJbnRlcmNlcHRlZDogaW4gem9uZSIuCiAgICogICAgIHByaW50KCJpbiB6b25lIik7CiAgICogICB9LCB6b25lU3BlY2lmaWNhdGlvbjogbmV3IFpvbmVTcGVjaWZpY2F0aW9uKAogICAqICAgICAgIHByaW50OiAoWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFN0cmluZyBsaW5lKSB7CiAgICogICAgIHBhcmVudC5wcmludCh6b25lLCAiSW50ZXJjZXB0ZWQ6ICRsaW5lIik7CiAgICogICB9KSk7CiAgICogfQogICAqIGBgYAogICAqLwogIHZvaWQgcHJpbnQoU3RyaW5nIGxpbmUpOwoKICAvKioKICAgKiBDYWxsIHRvIGVudGVyIHRoZSBab25lLgogICAqCiAgICogVGhlIHByZXZpb3VzIGN1cnJlbnQgem9uZSBpcyByZXR1cm5lZC4KICAgKi8KICBzdGF0aWMgWm9uZSBfZW50ZXIoWm9uZSB6b25lKSB7CiAgICBhc3NlcnQoem9uZSAhPSBudWxsKTsKICAgIGFzc2VydCghaWRlbnRpY2FsKHpvbmUsIF9jdXJyZW50KSk7CiAgICBab25lIHByZXZpb3VzID0gX2N1cnJlbnQ7CiAgICBfY3VycmVudCA9IHpvbmU7CiAgICByZXR1cm4gcHJldmlvdXM7CiAgfQoKICAvKioKICAgKiBDYWxsIHRvIGxlYXZlIHRoZSBab25lLgogICAqCiAgICogVGhlIHByZXZpb3VzIFpvbmUgbXVzdCBiZSBwcm92aWRlZCBhcyBgcHJldmlvdXNgLgogICAqLwogIHN0YXRpYyB2b2lkIF9sZWF2ZShab25lIHByZXZpb3VzKSB7CiAgICBhc3NlcnQocHJldmlvdXMgIT0gbnVsbCk7CiAgICBab25lLl9jdXJyZW50ID0gcHJldmlvdXM7CiAgfQoKICAvKioKICAgKiBSZXRyaWV2ZXMgdGhlIHpvbmUtdmFsdWUgYXNzb2NpYXRlZCB3aXRoIFtrZXldLgogICAqCiAgICogSWYgdGhpcyB6b25lIGRvZXMgbm90IGNvbnRhaW4gdGhlIHZhbHVlIGxvb2tzIHVwIHRoZSBzYW1lIGtleSBpbiB0aGUKICAgKiBwYXJlbnQgem9uZS4gSWYgdGhlIFtrZXldIGlzIG5vdCBmb3VuZCByZXR1cm5zIGBudWxsYC4KICAgKgogICAqIEFueSBvYmplY3QgY2FuIGJlIHVzZWQgYXMga2V5LCBhcyBsb25nIGFzIGl0IGhhcyBjb21wYXRpYmxlIGBvcGVyYXRvciA9PWAKICAgKiBhbmQgYGhhc2hDb2RlYCBpbXBsZW1lbnRhdGlvbnMuCiAgICogQnkgY29udHJvbGxpbmcgYWNjZXNzIHRvIHRoZSBrZXksIGEgem9uZSBjYW4gZ3JhbnQgb3IgZGVueSBhY2Nlc3MgdG8gdGhlCiAgICogem9uZSB2YWx1ZS4KICAgKi8KICBvcGVyYXRvciBbXShPYmplY3Qga2V5KTsKfQoKWm9uZURlbGVnYXRlIF9wYXJlbnREZWxlZ2F0ZShfWm9uZSB6b25lKSB7CiAgaWYgKHpvbmUucGFyZW50ID09IG51bGwpIHJldHVybiBudWxsOwogIHJldHVybiB6b25lLnBhcmVudC5fZGVsZWdhdGU7Cn0KCmNsYXNzIF9ab25lRGVsZWdhdGUgaW1wbGVtZW50cyBab25lRGVsZWdhdGUgewogIGZpbmFsIF9ab25lIF9kZWxlZ2F0aW9uVGFyZ2V0OwoKICBfWm9uZURlbGVnYXRlKHRoaXMuX2RlbGVnYXRpb25UYXJnZXQpOwoKICB2b2lkIGhhbmRsZVVuY2F1Z2h0RXJyb3IoWm9uZSB6b25lLCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSBfZGVsZWdhdGlvblRhcmdldC5faGFuZGxlVW5jYXVnaHRFcnJvcjsKICAgIF9ab25lIGltcGxab25lID0gaW1wbGVtZW50YXRpb24uem9uZTsKICAgIEhhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKAogICAgICAgIGltcGxab25lLCBfcGFyZW50RGVsZWdhdGUoaW1wbFpvbmUpLCB6b25lLCBlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICBSIHJ1bjxSPihab25lIHpvbmUsIFIgZigpKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSBfZGVsZWdhdGlvblRhcmdldC5fcnVuOwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgUnVuSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgZik7CiAgfQoKICBSIHJ1blVuYXJ5PFIsIFQ+KFpvbmUgem9uZSwgUiBmKFQgYXJnKSwgVCBhcmcpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IF9kZWxlZ2F0aW9uVGFyZ2V0Ll9ydW5VbmFyeTsKICAgIF9ab25lIGltcGxab25lID0gaW1wbGVtZW50YXRpb24uem9uZTsKICAgIFJ1blVuYXJ5SGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgZiwgYXJnKTsKICB9CgogIFIgcnVuQmluYXJ5PFIsIFQxLCBUMj4oWm9uZSB6b25lLCBSIGYoVDEgYXJnMSwgVDIgYXJnMiksIFQxIGFyZzEsIFQyIGFyZzIpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IF9kZWxlZ2F0aW9uVGFyZ2V0Ll9ydW5CaW5hcnk7CiAgICBfWm9uZSBpbXBsWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBSdW5CaW5hcnlIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxab25lLCBfcGFyZW50RGVsZWdhdGUoaW1wbFpvbmUpLCB6b25lLCBmLCBhcmcxLCBhcmcyKTsKICB9CgogIFpvbmVDYWxsYmFjazxSPiByZWdpc3RlckNhbGxiYWNrPFI+KFpvbmUgem9uZSwgUiBmKCkpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IF9kZWxlZ2F0aW9uVGFyZ2V0Ll9yZWdpc3RlckNhbGxiYWNrOwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgUmVnaXN0ZXJDYWxsYmFja0hhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbFpvbmUsIF9wYXJlbnREZWxlZ2F0ZShpbXBsWm9uZSksIHpvbmUsIGYpOwogIH0KCiAgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4gcmVnaXN0ZXJVbmFyeUNhbGxiYWNrPFIsIFQ+KFpvbmUgem9uZSwgUiBmKFQgYXJnKSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX3JlZ2lzdGVyVW5hcnlDYWxsYmFjazsKICAgIF9ab25lIGltcGxab25lID0gaW1wbGVtZW50YXRpb24uem9uZTsKICAgIFJlZ2lzdGVyVW5hcnlDYWxsYmFja0hhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbFpvbmUsIF9wYXJlbnREZWxlZ2F0ZShpbXBsWm9uZSksIHpvbmUsIGYpOwogIH0KCiAgWm9uZUJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4gcmVnaXN0ZXJCaW5hcnlDYWxsYmFjazxSLCBUMSwgVDI+KAogICAgICBab25lIHpvbmUsIFIgZihUMSBhcmcxLCBUMiBhcmcyKSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX3JlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s7CiAgICBfWm9uZSBpbXBsWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBSZWdpc3RlckJpbmFyeUNhbGxiYWNrSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgZik7CiAgfQoKICBBc3luY0Vycm9yIGVycm9yQ2FsbGJhY2soWm9uZSB6b25lLCBPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX2Vycm9yQ2FsbGJhY2s7CiAgICBfWm9uZSBpbXBsWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBpZiAoaWRlbnRpY2FsKGltcGxab25lLCBfcm9vdFpvbmUpKSByZXR1cm4gbnVsbDsKICAgIEVycm9yQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKAogICAgICAgIGltcGxab25lLCBfcGFyZW50RGVsZWdhdGUoaW1wbFpvbmUpLCB6b25lLCBlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICB2b2lkIHNjaGVkdWxlTWljcm90YXNrKFpvbmUgem9uZSwgZigpKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSBfZGVsZWdhdGlvblRhcmdldC5fc2NoZWR1bGVNaWNyb3Rhc2s7CiAgICBfWm9uZSBpbXBsWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBTY2hlZHVsZU1pY3JvdGFza0hhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgaGFuZGxlcihpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgZik7CiAgfQoKICBUaW1lciBjcmVhdGVUaW1lcihab25lIHpvbmUsIER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGYoKSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX2NyZWF0ZVRpbWVyOwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgQ3JlYXRlVGltZXJIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxab25lLCBfcGFyZW50RGVsZWdhdGUoaW1wbFpvbmUpLCB6b25lLCBkdXJhdGlvbiwgZik7CiAgfQoKICBUaW1lciBjcmVhdGVQZXJpb2RpY1RpbWVyKFpvbmUgem9uZSwgRHVyYXRpb24gcGVyaW9kLCB2b2lkIGYoVGltZXIgdGltZXIpKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSBfZGVsZWdhdGlvblRhcmdldC5fY3JlYXRlUGVyaW9kaWNUaW1lcjsKICAgIF9ab25lIGltcGxab25lID0gaW1wbGVtZW50YXRpb24uem9uZTsKICAgIENyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxab25lLCBfcGFyZW50RGVsZWdhdGUoaW1wbFpvbmUpLCB6b25lLCBwZXJpb2QsIGYpOwogIH0KCiAgdm9pZCBwcmludChab25lIHpvbmUsIFN0cmluZyBsaW5lKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSBfZGVsZWdhdGlvblRhcmdldC5fcHJpbnQ7CiAgICBfWm9uZSBpbXBsWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBQcmludEhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgaGFuZGxlcihpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgbGluZSk7CiAgfQoKICBab25lIGZvcmsoWm9uZSB6b25lLCBab25lU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uLCBNYXAgem9uZVZhbHVlcykgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX2Zvcms7CiAgICBfWm9uZSBpbXBsWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBGb3JrSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcigKICAgICAgICBpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgc3BlY2lmaWNhdGlvbiwgem9uZVZhbHVlcyk7CiAgfQp9CgovKioKICogQmFzZSBjbGFzcyBmb3IgWm9uZSBpbXBsZW1lbnRhdGlvbnMuCiAqLwphYnN0cmFjdCBjbGFzcyBfWm9uZSBpbXBsZW1lbnRzIFpvbmUgewogIGNvbnN0IF9ab25lKCk7CgogIC8vIFRPRE8oZmxvaXRzY2gpOiB0aGUgdHlwZXMgb2YgdGhlIGBfWm9uZUZ1bmN0aW9uYHMgc2hvdWxkIGhhdmUgYSB0eXBlIGZvcgogIC8vIGFsbCBmaWVsZHMuCiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gZ2V0IF9ydW47CiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gZ2V0IF9ydW5VbmFyeTsKICBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPiBnZXQgX3J1bkJpbmFyeTsKICBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPiBnZXQgX3JlZ2lzdGVyQ2FsbGJhY2s7CiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gZ2V0IF9yZWdpc3RlclVuYXJ5Q2FsbGJhY2s7CiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gZ2V0IF9yZWdpc3RlckJpbmFyeUNhbGxiYWNrOwogIF9ab25lRnVuY3Rpb248RXJyb3JDYWxsYmFja0hhbmRsZXI+IGdldCBfZXJyb3JDYWxsYmFjazsKICBfWm9uZUZ1bmN0aW9uPFNjaGVkdWxlTWljcm90YXNrSGFuZGxlcj4gZ2V0IF9zY2hlZHVsZU1pY3JvdGFzazsKICBfWm9uZUZ1bmN0aW9uPENyZWF0ZVRpbWVySGFuZGxlcj4gZ2V0IF9jcmVhdGVUaW1lcjsKICBfWm9uZUZ1bmN0aW9uPENyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyPiBnZXQgX2NyZWF0ZVBlcmlvZGljVGltZXI7CiAgX1pvbmVGdW5jdGlvbjxQcmludEhhbmRsZXI+IGdldCBfcHJpbnQ7CiAgX1pvbmVGdW5jdGlvbjxGb3JrSGFuZGxlcj4gZ2V0IF9mb3JrOwogIF9ab25lRnVuY3Rpb248SGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXI+IGdldCBfaGFuZGxlVW5jYXVnaHRFcnJvcjsKICBfWm9uZSBnZXQgcGFyZW50OwogIFpvbmVEZWxlZ2F0ZSBnZXQgX2RlbGVnYXRlOwogIE1hcCBnZXQgX21hcDsKCiAgYm9vbCBpblNhbWVFcnJvclpvbmUoWm9uZSBvdGhlclpvbmUpIHsKICAgIHJldHVybiBpZGVudGljYWwodGhpcywgb3RoZXJab25lKSB8fAogICAgICAgIGlkZW50aWNhbChlcnJvclpvbmUsIG90aGVyWm9uZS5lcnJvclpvbmUpOwogIH0KfQoKY2xhc3MgX0N1c3RvbVpvbmUgZXh0ZW5kcyBfWm9uZSB7CiAgLy8gVGhlIGFjdHVhbCB6b25lIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiBlYWNoIG9mIHRoZXNlCiAgLy8gaW5oZXJpdGFibGUgem9uZSBmdW5jdGlvbnMuCiAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoZSB0eXBlcyBvZiB0aGUgYF9ab25lRnVuY3Rpb25gcyBzaG91bGQgaGF2ZSBhIHR5cGUgZm9yCiAgLy8gYWxsIGZpZWxkcy4KICBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPiBfcnVuOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IF9ydW5VbmFyeTsKICBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPiBfcnVuQmluYXJ5OwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IF9yZWdpc3RlckNhbGxiYWNrOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IF9yZWdpc3RlclVuYXJ5Q2FsbGJhY2s7CiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gX3JlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s7CiAgX1pvbmVGdW5jdGlvbjxFcnJvckNhbGxiYWNrSGFuZGxlcj4gX2Vycm9yQ2FsbGJhY2s7CiAgX1pvbmVGdW5jdGlvbjxTY2hlZHVsZU1pY3JvdGFza0hhbmRsZXI+IF9zY2hlZHVsZU1pY3JvdGFzazsKICBfWm9uZUZ1bmN0aW9uPENyZWF0ZVRpbWVySGFuZGxlcj4gX2NyZWF0ZVRpbWVyOwogIF9ab25lRnVuY3Rpb248Q3JlYXRlUGVyaW9kaWNUaW1lckhhbmRsZXI+IF9jcmVhdGVQZXJpb2RpY1RpbWVyOwogIF9ab25lRnVuY3Rpb248UHJpbnRIYW5kbGVyPiBfcHJpbnQ7CiAgX1pvbmVGdW5jdGlvbjxGb3JrSGFuZGxlcj4gX2Zvcms7CiAgX1pvbmVGdW5jdGlvbjxIYW5kbGVVbmNhdWdodEVycm9ySGFuZGxlcj4gX2hhbmRsZVVuY2F1Z2h0RXJyb3I7CgogIC8vIEEgY2FjaGVkIGRlbGVnYXRlIHRvIHRoaXMgem9uZS4KICBab25lRGVsZWdhdGUgX2RlbGVnYXRlQ2FjaGU7CgogIC8vLyBUaGUgcGFyZW50IHpvbmUuCiAgZmluYWwgX1pvbmUgcGFyZW50OwoKICAvLy8gVGhlIHpvbmUncyBzY29wZWQgdmFsdWUgZGVjbGFyYXRpb24gbWFwLgogIC8vLwogIC8vLyBUaGlzIGlzIGFsd2F5cyBhIFtIYXNoTWFwXS4KICBmaW5hbCBNYXAgX21hcDsKCiAgWm9uZURlbGVnYXRlIGdldCBfZGVsZWdhdGUgewogICAgaWYgKF9kZWxlZ2F0ZUNhY2hlICE9IG51bGwpIHJldHVybiBfZGVsZWdhdGVDYWNoZTsKICAgIF9kZWxlZ2F0ZUNhY2hlID0gbmV3IF9ab25lRGVsZWdhdGUodGhpcyk7CiAgICByZXR1cm4gX2RlbGVnYXRlQ2FjaGU7CiAgfQoKICBfQ3VzdG9tWm9uZSh0aGlzLnBhcmVudCwgWm9uZVNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiwgdGhpcy5fbWFwKSB7CiAgICAvLyBUaGUgcm9vdCB6b25lIHdpbGwgaGF2ZSBpbXBsZW1lbnRhdGlvbnMgb2YgYWxsIHBhcnRzIG9mIHRoZQogICAgLy8gc3BlY2lmaWNhdGlvbiwgc28gaXQgd2lsbCBuZXZlciB0cnkgdG8gYWNjZXNzIHRoZSAobnVsbCkgcGFyZW50LgogICAgLy8gQWxsIG90aGVyIHpvbmVzIGhhdmUgYSBub24tbnVsbCBwYXJlbnQuCiAgICBfcnVuID0gKHNwZWNpZmljYXRpb24ucnVuICE9IG51bGwpCiAgICAgICAgPyBuZXcgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4odGhpcywgc3BlY2lmaWNhdGlvbi5ydW4pCiAgICAgICAgOiBwYXJlbnQuX3J1bjsKICAgIF9ydW5VbmFyeSA9IChzcGVjaWZpY2F0aW9uLnJ1blVuYXJ5ICE9IG51bGwpCiAgICAgICAgPyBuZXcgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4odGhpcywgc3BlY2lmaWNhdGlvbi5ydW5VbmFyeSkKICAgICAgICA6IHBhcmVudC5fcnVuVW5hcnk7CiAgICBfcnVuQmluYXJ5ID0gKHNwZWNpZmljYXRpb24ucnVuQmluYXJ5ICE9IG51bGwpCiAgICAgICAgPyBuZXcgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4odGhpcywgc3BlY2lmaWNhdGlvbi5ydW5CaW5hcnkpCiAgICAgICAgOiBwYXJlbnQuX3J1bkJpbmFyeTsKICAgIF9yZWdpc3RlckNhbGxiYWNrID0gKHNwZWNpZmljYXRpb24ucmVnaXN0ZXJDYWxsYmFjayAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KHRoaXMsIHNwZWNpZmljYXRpb24ucmVnaXN0ZXJDYWxsYmFjaykKICAgICAgICA6IHBhcmVudC5fcmVnaXN0ZXJDYWxsYmFjazsKICAgIF9yZWdpc3RlclVuYXJ5Q2FsbGJhY2sgPSAoc3BlY2lmaWNhdGlvbi5yZWdpc3RlclVuYXJ5Q2FsbGJhY2sgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPih0aGlzLCBzcGVjaWZpY2F0aW9uLnJlZ2lzdGVyVW5hcnlDYWxsYmFjaykKICAgICAgICA6IHBhcmVudC5fcmVnaXN0ZXJVbmFyeUNhbGxiYWNrOwogICAgX3JlZ2lzdGVyQmluYXJ5Q2FsbGJhY2sgPSAoc3BlY2lmaWNhdGlvbi5yZWdpc3RlckJpbmFyeUNhbGxiYWNrICE9IG51bGwpCiAgICAgICAgPyBuZXcgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4oCiAgICAgICAgICAgIHRoaXMsIHNwZWNpZmljYXRpb24ucmVnaXN0ZXJCaW5hcnlDYWxsYmFjaykKICAgICAgICA6IHBhcmVudC5fcmVnaXN0ZXJCaW5hcnlDYWxsYmFjazsKICAgIF9lcnJvckNhbGxiYWNrID0gKHNwZWNpZmljYXRpb24uZXJyb3JDYWxsYmFjayAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248RXJyb3JDYWxsYmFja0hhbmRsZXI+KAogICAgICAgICAgICB0aGlzLCBzcGVjaWZpY2F0aW9uLmVycm9yQ2FsbGJhY2spCiAgICAgICAgOiBwYXJlbnQuX2Vycm9yQ2FsbGJhY2s7CiAgICBfc2NoZWR1bGVNaWNyb3Rhc2sgPSAoc3BlY2lmaWNhdGlvbi5zY2hlZHVsZU1pY3JvdGFzayAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248U2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyPigKICAgICAgICAgICAgdGhpcywgc3BlY2lmaWNhdGlvbi5zY2hlZHVsZU1pY3JvdGFzaykKICAgICAgICA6IHBhcmVudC5fc2NoZWR1bGVNaWNyb3Rhc2s7CiAgICBfY3JlYXRlVGltZXIgPSAoc3BlY2lmaWNhdGlvbi5jcmVhdGVUaW1lciAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248Q3JlYXRlVGltZXJIYW5kbGVyPih0aGlzLCBzcGVjaWZpY2F0aW9uLmNyZWF0ZVRpbWVyKQogICAgICAgIDogcGFyZW50Ll9jcmVhdGVUaW1lcjsKICAgIF9jcmVhdGVQZXJpb2RpY1RpbWVyID0gKHNwZWNpZmljYXRpb24uY3JlYXRlUGVyaW9kaWNUaW1lciAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248Q3JlYXRlUGVyaW9kaWNUaW1lckhhbmRsZXI+KAogICAgICAgICAgICB0aGlzLCBzcGVjaWZpY2F0aW9uLmNyZWF0ZVBlcmlvZGljVGltZXIpCiAgICAgICAgOiBwYXJlbnQuX2NyZWF0ZVBlcmlvZGljVGltZXI7CiAgICBfcHJpbnQgPSAoc3BlY2lmaWNhdGlvbi5wcmludCAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248UHJpbnRIYW5kbGVyPih0aGlzLCBzcGVjaWZpY2F0aW9uLnByaW50KQogICAgICAgIDogcGFyZW50Ll9wcmludDsKICAgIF9mb3JrID0gKHNwZWNpZmljYXRpb24uZm9yayAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248Rm9ya0hhbmRsZXI+KHRoaXMsIHNwZWNpZmljYXRpb24uZm9yaykKICAgICAgICA6IHBhcmVudC5fZm9yazsKICAgIF9oYW5kbGVVbmNhdWdodEVycm9yID0gKHNwZWNpZmljYXRpb24uaGFuZGxlVW5jYXVnaHRFcnJvciAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248SGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXI+KAogICAgICAgICAgICB0aGlzLCBzcGVjaWZpY2F0aW9uLmhhbmRsZVVuY2F1Z2h0RXJyb3IpCiAgICAgICAgOiBwYXJlbnQuX2hhbmRsZVVuY2F1Z2h0RXJyb3I7CiAgfQoKICAvKioKICAgKiBUaGUgY2xvc2VzdCBlcnJvci1oYW5kbGluZyB6b25lLgogICAqCiAgICogUmV0dXJucyBgdGhpc2AgaWYgYHRoaXNgIGhhcyBhbiBlcnJvci1oYW5kbGVyLiBPdGhlcndpc2UgcmV0dXJucyB0aGUKICAgKiBwYXJlbnQncyBlcnJvci16b25lLgogICAqLwogIFpvbmUgZ2V0IGVycm9yWm9uZSA9PiBfaGFuZGxlVW5jYXVnaHRFcnJvci56b25lOwoKICB2b2lkIHJ1bkd1YXJkZWQodm9pZCBmKCkpIHsKICAgIHRyeSB7CiAgICAgIHJ1bihmKTsKICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgaGFuZGxlVW5jYXVnaHRFcnJvcihlLCBzKTsKICAgIH0KICB9CgogIHZvaWQgcnVuVW5hcnlHdWFyZGVkPFQ+KHZvaWQgZihUIGFyZyksIFQgYXJnKSB7CiAgICB0cnkgewogICAgICBydW5VbmFyeShmLCBhcmcpOwogICAgfSBjYXRjaCAoZSwgcykgewogICAgICBoYW5kbGVVbmNhdWdodEVycm9yKGUsIHMpOwogICAgfQogIH0KCiAgdm9pZCBydW5CaW5hcnlHdWFyZGVkPFQxLCBUMj4odm9pZCBmKFQxIGFyZzEsIFQyIGFyZzIpLCBUMSBhcmcxLCBUMiBhcmcyKSB7CiAgICB0cnkgewogICAgICBydW5CaW5hcnkoZiwgYXJnMSwgYXJnMik7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGhhbmRsZVVuY2F1Z2h0RXJyb3IoZSwgcyk7CiAgICB9CiAgfQoKICBab25lQ2FsbGJhY2s8Uj4gYmluZENhbGxiYWNrPFI+KFIgZigpKSB7CiAgICB2YXIgcmVnaXN0ZXJlZCA9IHJlZ2lzdGVyQ2FsbGJhY2soZik7CiAgICByZXR1cm4gKCkgPT4gdGhpcy5ydW4ocmVnaXN0ZXJlZCk7CiAgfQoKICBab25lVW5hcnlDYWxsYmFjazxSLCBUPiBiaW5kVW5hcnlDYWxsYmFjazxSLCBUPihSIGYoVCBhcmcpKSB7CiAgICB2YXIgcmVnaXN0ZXJlZCA9IHJlZ2lzdGVyVW5hcnlDYWxsYmFjayhmKTsKICAgIHJldHVybiAoYXJnKSA9PiB0aGlzLnJ1blVuYXJ5KHJlZ2lzdGVyZWQsIGFyZyk7CiAgfQoKICBab25lQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPiBiaW5kQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPigKICAgICAgUiBmKFQxIGFyZzEsIFQyIGFyZzIpKSB7CiAgICB2YXIgcmVnaXN0ZXJlZCA9IHJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2soZik7CiAgICByZXR1cm4gKGFyZzEsIGFyZzIpID0+IHRoaXMucnVuQmluYXJ5KHJlZ2lzdGVyZWQsIGFyZzEsIGFyZzIpOwogIH0KCiAgdm9pZCBGdW5jdGlvbigpIGJpbmRDYWxsYmFja0d1YXJkZWQodm9pZCBmKCkpIHsKICAgIHZhciByZWdpc3RlcmVkID0gcmVnaXN0ZXJDYWxsYmFjayhmKTsKICAgIHJldHVybiAoKSA9PiB0aGlzLnJ1bkd1YXJkZWQocmVnaXN0ZXJlZCk7CiAgfQoKICB2b2lkIEZ1bmN0aW9uKFQpIGJpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZDxUPih2b2lkIGYoVCBhcmcpKSB7CiAgICB2YXIgcmVnaXN0ZXJlZCA9IHJlZ2lzdGVyVW5hcnlDYWxsYmFjayhmKTsKICAgIHJldHVybiAoYXJnKSA9PiB0aGlzLnJ1blVuYXJ5R3VhcmRlZChyZWdpc3RlcmVkLCBhcmcpOwogIH0KCiAgdm9pZCBGdW5jdGlvbihUMSwgVDIpIGJpbmRCaW5hcnlDYWxsYmFja0d1YXJkZWQ8VDEsIFQyPigKICAgICAgdm9pZCBmKFQxIGFyZzEsIFQyIGFyZzIpKSB7CiAgICB2YXIgcmVnaXN0ZXJlZCA9IHJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2soZik7CiAgICByZXR1cm4gKGFyZzEsIGFyZzIpID0+IHRoaXMucnVuQmluYXJ5R3VhcmRlZChyZWdpc3RlcmVkLCBhcmcxLCBhcmcyKTsKICB9CgogIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpIHsKICAgIHZhciByZXN1bHQgPSBfbWFwW2tleV07CiAgICBpZiAocmVzdWx0ICE9IG51bGwgfHwgX21hcC5jb250YWluc0tleShrZXkpKSByZXR1cm4gcmVzdWx0OwogICAgLy8gSWYgd2UgYXJlIG5vdCB0aGUgcm9vdCB6b25lLCBsb29rIHVwIGluIHRoZSBwYXJlbnQgem9uZS4KICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewogICAgICAvLyBXZSBkbyBub3Qgb3B0aW1pemUgZm9yIHJlcGVhdGVkbHkgbG9va2luZyB1cCBhIGtleSB3aGljaCBpc24ndAogICAgICAvLyB0aGVyZS4gVGhhdCB3b3VsZCByZXF1aXJlIHN0b3JpbmcgdGhlIGtleSBhbmQga2VlcGluZyBpdCBhbGl2ZS4KICAgICAgLy8gQ29weWluZyB0aGUga2V5L3ZhbHVlIGZyb20gdGhlIHBhcmVudCBkb2VzIG5vdCBrZWVwIGFueSBuZXcgdmFsdWVzCiAgICAgIC8vIGFsaXZlLgogICAgICB2YXIgdmFsdWUgPSBwYXJlbnRba2V5XTsKICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICBfbWFwW2tleV0gPSB2YWx1ZTsKICAgICAgfQogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgICBhc3NlcnQodGhpcyA9PSBfcm9vdFpvbmUpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLyBNZXRob2RzIHRoYXQgY2FuIGJlIGN1c3RvbWl6ZWQgYnkgdGhlIHpvbmUgc3BlY2lmaWNhdGlvbi4KCiAgdm9pZCBoYW5kbGVVbmNhdWdodEVycm9yKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX2hhbmRsZVVuY2F1Z2h0RXJyb3I7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb24uem9uZSk7CiAgICBIYW5kbGVVbmNhdWdodEVycm9ySGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcigKICAgICAgICBpbXBsZW1lbnRhdGlvbi56b25lLCBwYXJlbnREZWxlZ2F0ZSwgdGhpcywgZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgWm9uZSBmb3JrKHtab25lU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uLCBNYXAgem9uZVZhbHVlc30pIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX2Zvcms7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb24uem9uZSk7CiAgICBGb3JrSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcigKICAgICAgICBpbXBsZW1lbnRhdGlvbi56b25lLCBwYXJlbnREZWxlZ2F0ZSwgdGhpcywgc3BlY2lmaWNhdGlvbiwgem9uZVZhbHVlcyk7CiAgfQoKICBSIHJ1bjxSPihSIGYoKSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gdGhpcy5fcnVuOwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uLnpvbmUpOwogICAgUnVuSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsZW1lbnRhdGlvbi56b25lLCBwYXJlbnREZWxlZ2F0ZSwgdGhpcywgZik7CiAgfQoKICBSIHJ1blVuYXJ5PFIsIFQ+KFIgZihUIGFyZyksIFQgYXJnKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSB0aGlzLl9ydW5VbmFyeTsKICAgIGFzc2VydChpbXBsZW1lbnRhdGlvbiAhPSBudWxsKTsKICAgIFpvbmVEZWxlZ2F0ZSBwYXJlbnREZWxlZ2F0ZSA9IF9wYXJlbnREZWxlZ2F0ZShpbXBsZW1lbnRhdGlvbi56b25lKTsKICAgIFJ1blVuYXJ5SGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsZW1lbnRhdGlvbi56b25lLCBwYXJlbnREZWxlZ2F0ZSwgdGhpcywgZiwgYXJnKTsKICB9CgogIFIgcnVuQmluYXJ5PFIsIFQxLCBUMj4oUiBmKFQxIGFyZzEsIFQyIGFyZzIpLCBUMSBhcmcxLCBUMiBhcmcyKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSB0aGlzLl9ydW5CaW5hcnk7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb24uem9uZSk7CiAgICBSdW5CaW5hcnlIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxlbWVudGF0aW9uLnpvbmUsIHBhcmVudERlbGVnYXRlLCB0aGlzLCBmLCBhcmcxLCBhcmcyKTsKICB9CgogIFpvbmVDYWxsYmFjazxSPiByZWdpc3RlckNhbGxiYWNrPFI+KFIgY2FsbGJhY2soKSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gdGhpcy5fcmVnaXN0ZXJDYWxsYmFjazsKICAgIGFzc2VydChpbXBsZW1lbnRhdGlvbiAhPSBudWxsKTsKICAgIFpvbmVEZWxlZ2F0ZSBwYXJlbnREZWxlZ2F0ZSA9IF9wYXJlbnREZWxlZ2F0ZShpbXBsZW1lbnRhdGlvbi56b25lKTsKICAgIFJlZ2lzdGVyQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxlbWVudGF0aW9uLnpvbmUsIHBhcmVudERlbGVnYXRlLCB0aGlzLCBjYWxsYmFjayk7CiAgfQoKICBab25lVW5hcnlDYWxsYmFjazxSLCBUPiByZWdpc3RlclVuYXJ5Q2FsbGJhY2s8UiwgVD4oUiBjYWxsYmFjayhUIGFyZykpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX3JlZ2lzdGVyVW5hcnlDYWxsYmFjazsKICAgIGFzc2VydChpbXBsZW1lbnRhdGlvbiAhPSBudWxsKTsKICAgIFpvbmVEZWxlZ2F0ZSBwYXJlbnREZWxlZ2F0ZSA9IF9wYXJlbnREZWxlZ2F0ZShpbXBsZW1lbnRhdGlvbi56b25lKTsKICAgIFJlZ2lzdGVyVW5hcnlDYWxsYmFja0hhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbGVtZW50YXRpb24uem9uZSwgcGFyZW50RGVsZWdhdGUsIHRoaXMsIGNhbGxiYWNrKTsKICB9CgogIFpvbmVCaW5hcnlDYWxsYmFjazxSLCBUMSwgVDI+IHJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPigKICAgICAgUiBjYWxsYmFjayhUMSBhcmcxLCBUMiBhcmcyKSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gdGhpcy5fcmVnaXN0ZXJCaW5hcnlDYWxsYmFjazsKICAgIGFzc2VydChpbXBsZW1lbnRhdGlvbiAhPSBudWxsKTsKICAgIFpvbmVEZWxlZ2F0ZSBwYXJlbnREZWxlZ2F0ZSA9IF9wYXJlbnREZWxlZ2F0ZShpbXBsZW1lbnRhdGlvbi56b25lKTsKICAgIFJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxlbWVudGF0aW9uLnpvbmUsIHBhcmVudERlbGVnYXRlLCB0aGlzLCBjYWxsYmFjayk7CiAgfQoKICBBc3luY0Vycm9yIGVycm9yQ2FsbGJhY2soT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX2Vycm9yQ2FsbGJhY2s7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBmaW5hbCBab25lIGltcGxlbWVudGF0aW9uWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBpZiAoaWRlbnRpY2FsKGltcGxlbWVudGF0aW9uWm9uZSwgX3Jvb3Rab25lKSkgcmV0dXJuIG51bGw7CiAgICBmaW5hbCBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb25ab25lKTsKICAgIEVycm9yQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxlbWVudGF0aW9uWm9uZSwgcGFyZW50RGVsZWdhdGUsIHRoaXMsIGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIHZvaWQgc2NoZWR1bGVNaWNyb3Rhc2sodm9pZCBmKCkpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX3NjaGVkdWxlTWljcm90YXNrOwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uLnpvbmUpOwogICAgU2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxlbWVudGF0aW9uLnpvbmUsIHBhcmVudERlbGVnYXRlLCB0aGlzLCBmKTsKICB9CgogIFRpbWVyIGNyZWF0ZVRpbWVyKER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGYoKSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gdGhpcy5fY3JlYXRlVGltZXI7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb24uem9uZSk7CiAgICBDcmVhdGVUaW1lckhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbGVtZW50YXRpb24uem9uZSwgcGFyZW50RGVsZWdhdGUsIHRoaXMsIGR1cmF0aW9uLCBmKTsKICB9CgogIFRpbWVyIGNyZWF0ZVBlcmlvZGljVGltZXIoRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgZihUaW1lciB0aW1lcikpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX2NyZWF0ZVBlcmlvZGljVGltZXI7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb24uem9uZSk7CiAgICBDcmVhdGVQZXJpb2RpY1RpbWVySGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsZW1lbnRhdGlvbi56b25lLCBwYXJlbnREZWxlZ2F0ZSwgdGhpcywgZHVyYXRpb24sIGYpOwogIH0KCiAgdm9pZCBwcmludChTdHJpbmcgbGluZSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gdGhpcy5fcHJpbnQ7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb24uem9uZSk7CiAgICBQcmludEhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbGVtZW50YXRpb24uem9uZSwgcGFyZW50RGVsZWdhdGUsIHRoaXMsIGxpbmUpOwogIH0KfQoKdm9pZCBfcm9vdEhhbmRsZVVuY2F1Z2h0RXJyb3IoCiAgICBab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogIF9zY2hlZHVsZVByaW9yaXR5QXN5bmNDYWxsYmFjaygoKSB7CiAgICBlcnJvciA/Pz0gbmV3IE51bGxUaHJvd25FcnJvcigpOwogICAgaWYgKHN0YWNrVHJhY2UgPT0gbnVsbCkgdGhyb3cgZXJyb3I7CiAgICBfcmV0aHJvdyhlcnJvciwgc3RhY2tUcmFjZSk7CiAgfSk7Cn0KCmV4dGVybmFsIHZvaWQgX3JldGhyb3coT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpOwoKUiBfcm9vdFJ1bjxSPihab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwgUiBmKCkpIHsKICBpZiAoWm9uZS5fY3VycmVudCA9PSB6b25lKSByZXR1cm4gZigpOwoKICBab25lIG9sZCA9IFpvbmUuX2VudGVyKHpvbmUpOwogIHRyeSB7CiAgICByZXR1cm4gZigpOwogIH0gZmluYWxseSB7CiAgICBab25lLl9sZWF2ZShvbGQpOwogIH0KfQoKUiBfcm9vdFJ1blVuYXJ5PFIsIFQ+KAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFIgZihUIGFyZyksIFQgYXJnKSB7CiAgaWYgKFpvbmUuX2N1cnJlbnQgPT0gem9uZSkgcmV0dXJuIGYoYXJnKTsKCiAgWm9uZSBvbGQgPSBab25lLl9lbnRlcih6b25lKTsKICB0cnkgewogICAgcmV0dXJuIGYoYXJnKTsKICB9IGZpbmFsbHkgewogICAgWm9uZS5fbGVhdmUob2xkKTsKICB9Cn0KClIgX3Jvb3RSdW5CaW5hcnk8UiwgVDEsIFQyPihab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwKICAgIFIgZihUMSBhcmcxLCBUMiBhcmcyKSwgVDEgYXJnMSwgVDIgYXJnMikgewogIGlmIChab25lLl9jdXJyZW50ID09IHpvbmUpIHJldHVybiBmKGFyZzEsIGFyZzIpOwoKICBab25lIG9sZCA9IFpvbmUuX2VudGVyKHpvbmUpOwogIHRyeSB7CiAgICByZXR1cm4gZihhcmcxLCBhcmcyKTsKICB9IGZpbmFsbHkgewogICAgWm9uZS5fbGVhdmUob2xkKTsKICB9Cn0KClpvbmVDYWxsYmFjazxSPiBfcm9vdFJlZ2lzdGVyQ2FsbGJhY2s8Uj4oCiAgICBab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwgUiBmKCkpIHsKICByZXR1cm4gZjsKfQoKWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4gX3Jvb3RSZWdpc3RlclVuYXJ5Q2FsbGJhY2s8UiwgVD4oCiAgICBab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwgUiBmKFQgYXJnKSkgewogIHJldHVybiBmOwp9Cgpab25lQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPiBfcm9vdFJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPigKICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBSIGYoVDEgYXJnMSwgVDIgYXJnMikpIHsKICByZXR1cm4gZjsKfQoKQXN5bmNFcnJvciBfcm9vdEVycm9yQ2FsbGJhY2soWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsCiAgICAgICAgT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpID0+CiAgICBudWxsOwoKdm9pZCBfcm9vdFNjaGVkdWxlTWljcm90YXNrKAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIHZvaWQgZigpKSB7CiAgaWYgKCFpZGVudGljYWwoX3Jvb3Rab25lLCB6b25lKSkgewogICAgYm9vbCBoYXNFcnJvckhhbmRsZXIgPSAhX3Jvb3Rab25lLmluU2FtZUVycm9yWm9uZSh6b25lKTsKICAgIGlmIChoYXNFcnJvckhhbmRsZXIpIHsKICAgICAgZiA9IHpvbmUuYmluZENhbGxiYWNrR3VhcmRlZChmKTsKICAgIH0gZWxzZSB7CiAgICAgIGYgPSB6b25lLmJpbmRDYWxsYmFjayhmKTsKICAgIH0KICAgIC8vIFVzZSByb290IHpvbmUgYXMgZXZlbnQgem9uZSBpZiB0aGUgZnVuY3Rpb24gaXMgYWxyZWFkeSBib3VuZC4KICAgIHpvbmUgPSBfcm9vdFpvbmU7CiAgfQogIF9zY2hlZHVsZUFzeW5jQ2FsbGJhY2soZik7Cn0KClRpbWVyIF9yb290Q3JlYXRlVGltZXIoWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsCiAgICBEdXJhdGlvbiBkdXJhdGlvbiwgdm9pZCBjYWxsYmFjaygpKSB7CiAgaWYgKCFpZGVudGljYWwoX3Jvb3Rab25lLCB6b25lKSkgewogICAgY2FsbGJhY2sgPSB6b25lLmJpbmRDYWxsYmFjayhjYWxsYmFjayk7CiAgfQogIHJldHVybiBUaW1lci5fY3JlYXRlVGltZXIoZHVyYXRpb24sIGNhbGxiYWNrKTsKfQoKVGltZXIgX3Jvb3RDcmVhdGVQZXJpb2RpY1RpbWVyKFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLAogICAgRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgY2FsbGJhY2soVGltZXIgdGltZXIpKSB7CiAgaWYgKCFpZGVudGljYWwoX3Jvb3Rab25lLCB6b25lKSkgewogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoZSByZXR1cm4gdHlwZSBzaG91bGQgYmUgJ3ZvaWQnLgogICAgY2FsbGJhY2sgPSB6b25lLmJpbmRVbmFyeUNhbGxiYWNrPGR5bmFtaWMsIFRpbWVyPihjYWxsYmFjayk7CiAgfQogIHJldHVybiBUaW1lci5fY3JlYXRlUGVyaW9kaWNUaW1lcihkdXJhdGlvbiwgY2FsbGJhY2spOwp9Cgp2b2lkIF9yb290UHJpbnQoWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFN0cmluZyBsaW5lKSB7CiAgcHJpbnRUb0NvbnNvbGUobGluZSk7Cn0KCnZvaWQgX3ByaW50VG9ab25lKFN0cmluZyBsaW5lKSB7CiAgWm9uZS5jdXJyZW50LnByaW50KGxpbmUpOwp9Cgpab25lIF9yb290Rm9yayhab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwKICAgIFpvbmVTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24sIE1hcCB6b25lVmFsdWVzKSB7CiAgLy8gVE9ETyhmbG9pdHNjaCk6IGl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgZ2V0IHJpZCBvZiB0aGlzIGhhY2suCiAgLy8gQ2hhbmdlIHRoZSBzdGF0aWMgem9uZU9yRGlyZWN0UHJpbnQgZnVuY3Rpb24gdG8gZ28gdGhyb3VnaCB6b25lcwogIC8vIGZyb20gbm93IG9uLgogIHByaW50VG9ab25lID0gX3ByaW50VG9ab25lOwoKICBpZiAoc3BlY2lmaWNhdGlvbiA9PSBudWxsKSB7CiAgICBzcGVjaWZpY2F0aW9uID0gY29uc3QgWm9uZVNwZWNpZmljYXRpb24oKTsKICB9IGVsc2UgaWYgKHNwZWNpZmljYXRpb24gaXMhIF9ab25lU3BlY2lmaWNhdGlvbikgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlpvbmVTcGVjaWZpY2F0aW9ucyBtdXN0IGJlIGluc3RhbnRpYXRlZCIKICAgICAgICAiIHdpdGggdGhlIHByb3ZpZGVkIGNvbnN0cnVjdG9yLiIpOwogIH0KICBNYXAgdmFsdWVNYXA7CiAgaWYgKHpvbmVWYWx1ZXMgPT0gbnVsbCkgewogICAgaWYgKHpvbmUgaXMgX1pvbmUpIHsKICAgICAgdmFsdWVNYXAgPSB6b25lLl9tYXA7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZU1hcCA9IG5ldyBIYXNoTWFwKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHZhbHVlTWFwID0gbmV3IEhhc2hNYXAuZnJvbSh6b25lVmFsdWVzKTsKICB9CiAgcmV0dXJuIG5ldyBfQ3VzdG9tWm9uZSh6b25lLCBzcGVjaWZpY2F0aW9uLCB2YWx1ZU1hcCk7Cn0KCmNsYXNzIF9Sb290Wm9uZSBleHRlbmRzIF9ab25lIHsKICBjb25zdCBfUm9vdFpvbmUoKTsKCiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gZ2V0IF9ydW4gPT4KICAgICAgY29uc3QgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4oX3Jvb3Rab25lLCBfcm9vdFJ1bik7CiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gZ2V0IF9ydW5VbmFyeSA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPihfcm9vdFpvbmUsIF9yb290UnVuVW5hcnkpOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcnVuQmluYXJ5ID0+CiAgICAgIGNvbnN0IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KF9yb290Wm9uZSwgX3Jvb3RSdW5CaW5hcnkpOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcmVnaXN0ZXJDYWxsYmFjayA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPihfcm9vdFpvbmUsIF9yb290UmVnaXN0ZXJDYWxsYmFjayk7CiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gZ2V0IF9yZWdpc3RlclVuYXJ5Q2FsbGJhY2sgPT4KICAgICAgY29uc3QgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4oX3Jvb3Rab25lLCBfcm9vdFJlZ2lzdGVyVW5hcnlDYWxsYmFjayk7CiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gZ2V0IF9yZWdpc3RlckJpbmFyeUNhbGxiYWNrID0+CiAgICAgIGNvbnN0IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KF9yb290Wm9uZSwgX3Jvb3RSZWdpc3RlckJpbmFyeUNhbGxiYWNrKTsKICBfWm9uZUZ1bmN0aW9uPEVycm9yQ2FsbGJhY2tIYW5kbGVyPiBnZXQgX2Vycm9yQ2FsbGJhY2sgPT4KICAgICAgY29uc3QgX1pvbmVGdW5jdGlvbjxFcnJvckNhbGxiYWNrSGFuZGxlcj4oX3Jvb3Rab25lLCBfcm9vdEVycm9yQ2FsbGJhY2spOwogIF9ab25lRnVuY3Rpb248U2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyPiBnZXQgX3NjaGVkdWxlTWljcm90YXNrID0+CiAgICAgIGNvbnN0IF9ab25lRnVuY3Rpb248U2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyPigKICAgICAgICAgIF9yb290Wm9uZSwgX3Jvb3RTY2hlZHVsZU1pY3JvdGFzayk7CiAgX1pvbmVGdW5jdGlvbjxDcmVhdGVUaW1lckhhbmRsZXI+IGdldCBfY3JlYXRlVGltZXIgPT4KICAgICAgY29uc3QgX1pvbmVGdW5jdGlvbjxDcmVhdGVUaW1lckhhbmRsZXI+KF9yb290Wm9uZSwgX3Jvb3RDcmVhdGVUaW1lcik7CiAgX1pvbmVGdW5jdGlvbjxDcmVhdGVQZXJpb2RpY1RpbWVySGFuZGxlcj4gZ2V0IF9jcmVhdGVQZXJpb2RpY1RpbWVyID0+CiAgICAgIGNvbnN0IF9ab25lRnVuY3Rpb248Q3JlYXRlUGVyaW9kaWNUaW1lckhhbmRsZXI+KAogICAgICAgICAgX3Jvb3Rab25lLCBfcm9vdENyZWF0ZVBlcmlvZGljVGltZXIpOwogIF9ab25lRnVuY3Rpb248UHJpbnRIYW5kbGVyPiBnZXQgX3ByaW50ID0+CiAgICAgIGNvbnN0IF9ab25lRnVuY3Rpb248UHJpbnRIYW5kbGVyPihfcm9vdFpvbmUsIF9yb290UHJpbnQpOwogIF9ab25lRnVuY3Rpb248Rm9ya0hhbmRsZXI+IGdldCBfZm9yayA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPEZvcmtIYW5kbGVyPihfcm9vdFpvbmUsIF9yb290Rm9yayk7CiAgX1pvbmVGdW5jdGlvbjxIYW5kbGVVbmNhdWdodEVycm9ySGFuZGxlcj4gZ2V0IF9oYW5kbGVVbmNhdWdodEVycm9yID0+CiAgICAgIGNvbnN0IF9ab25lRnVuY3Rpb248SGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXI+KAogICAgICAgICAgX3Jvb3Rab25lLCBfcm9vdEhhbmRsZVVuY2F1Z2h0RXJyb3IpOwoKICAvLyBUaGUgcGFyZW50IHpvbmUuCiAgX1pvbmUgZ2V0IHBhcmVudCA9PiBudWxsOwoKICAvLy8gVGhlIHpvbmUncyBzY29wZWQgdmFsdWUgZGVjbGFyYXRpb24gbWFwLgogIC8vLwogIC8vLyBUaGlzIGlzIGFsd2F5cyBhIFtIYXNoTWFwXS4KICBNYXAgZ2V0IF9tYXAgPT4gX3Jvb3RNYXA7CgogIHN0YXRpYyBmaW5hbCBfcm9vdE1hcCA9IG5ldyBIYXNoTWFwKCk7CgogIHN0YXRpYyBab25lRGVsZWdhdGUgX3Jvb3REZWxlZ2F0ZTsKCiAgWm9uZURlbGVnYXRlIGdldCBfZGVsZWdhdGUgewogICAgaWYgKF9yb290RGVsZWdhdGUgIT0gbnVsbCkgcmV0dXJuIF9yb290RGVsZWdhdGU7CiAgICByZXR1cm4gX3Jvb3REZWxlZ2F0ZSA9IG5ldyBfWm9uZURlbGVnYXRlKHRoaXMpOwogIH0KCiAgLyoqCiAgICogVGhlIGNsb3Nlc3QgZXJyb3ItaGFuZGxpbmcgem9uZS4KICAgKgogICAqIFJldHVybnMgYHRoaXNgIGlmIGB0aGlzYCBoYXMgYW4gZXJyb3ItaGFuZGxlci4gT3RoZXJ3aXNlIHJldHVybnMgdGhlCiAgICogcGFyZW50J3MgZXJyb3Item9uZS4KICAgKi8KICBab25lIGdldCBlcnJvclpvbmUgPT4gdGhpczsKCiAgLy8gWm9uZSBpbnRlcmZhY2UuCgogIHZvaWQgcnVuR3VhcmRlZCh2b2lkIGYoKSkgewogICAgdHJ5IHsKICAgICAgaWYgKGlkZW50aWNhbChfcm9vdFpvbmUsIFpvbmUuX2N1cnJlbnQpKSB7CiAgICAgICAgZigpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBfcm9vdFJ1bihudWxsLCBudWxsLCB0aGlzLCBmKTsKICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgaGFuZGxlVW5jYXVnaHRFcnJvcihlLCBzKTsKICAgIH0KICB9CgogIHZvaWQgcnVuVW5hcnlHdWFyZGVkPFQ+KHZvaWQgZihUIGFyZyksIFQgYXJnKSB7CiAgICB0cnkgewogICAgICBpZiAoaWRlbnRpY2FsKF9yb290Wm9uZSwgWm9uZS5fY3VycmVudCkpIHsKICAgICAgICBmKGFyZyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9yb290UnVuVW5hcnkobnVsbCwgbnVsbCwgdGhpcywgZiwgYXJnKTsKICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgaGFuZGxlVW5jYXVnaHRFcnJvcihlLCBzKTsKICAgIH0KICB9CgogIHZvaWQgcnVuQmluYXJ5R3VhcmRlZDxUMSwgVDI+KHZvaWQgZihUMSBhcmcxLCBUMiBhcmcyKSwgVDEgYXJnMSwgVDIgYXJnMikgewogICAgdHJ5IHsKICAgICAgaWYgKGlkZW50aWNhbChfcm9vdFpvbmUsIFpvbmUuX2N1cnJlbnQpKSB7CiAgICAgICAgZihhcmcxLCBhcmcyKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgX3Jvb3RSdW5CaW5hcnkobnVsbCwgbnVsbCwgdGhpcywgZiwgYXJnMSwgYXJnMik7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGhhbmRsZVVuY2F1Z2h0RXJyb3IoZSwgcyk7CiAgICB9CiAgfQoKICBab25lQ2FsbGJhY2s8Uj4gYmluZENhbGxiYWNrPFI+KFIgZigpKSB7CiAgICByZXR1cm4gKCkgPT4gdGhpcy5ydW48Uj4oZik7CiAgfQoKICBab25lVW5hcnlDYWxsYmFjazxSLCBUPiBiaW5kVW5hcnlDYWxsYmFjazxSLCBUPihSIGYoVCBhcmcpKSB7CiAgICByZXR1cm4gKGFyZykgPT4gdGhpcy5ydW5VbmFyeTxSLCBUPihmLCBhcmcpOwogIH0KCiAgWm9uZUJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4gYmluZEJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oCiAgICAgIFIgZihUMSBhcmcxLCBUMiBhcmcyKSkgewogICAgcmV0dXJuIChhcmcxLCBhcmcyKSA9PiB0aGlzLnJ1bkJpbmFyeTxSLCBUMSwgVDI+KGYsIGFyZzEsIGFyZzIpOwogIH0KCiAgdm9pZCBGdW5jdGlvbigpIGJpbmRDYWxsYmFja0d1YXJkZWQodm9pZCBmKCkpIHsKICAgIHJldHVybiAoKSA9PiB0aGlzLnJ1bkd1YXJkZWQoZik7CiAgfQoKICB2b2lkIEZ1bmN0aW9uKFQpIGJpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZDxUPih2b2lkIGYoVCBhcmcpKSB7CiAgICByZXR1cm4gKGFyZykgPT4gdGhpcy5ydW5VbmFyeUd1YXJkZWQoZiwgYXJnKTsKICB9CgogIHZvaWQgRnVuY3Rpb24oVDEsIFQyKSBiaW5kQmluYXJ5Q2FsbGJhY2tHdWFyZGVkPFQxLCBUMj4oCiAgICAgIHZvaWQgZihUMSBhcmcxLCBUMiBhcmcyKSkgewogICAgcmV0dXJuIChhcmcxLCBhcmcyKSA9PiB0aGlzLnJ1bkJpbmFyeUd1YXJkZWQoZiwgYXJnMSwgYXJnMik7CiAgfQoKICBvcGVyYXRvciBbXShPYmplY3Qga2V5KSA9PiBudWxsOwoKICAvLyBNZXRob2RzIHRoYXQgY2FuIGJlIGN1c3RvbWl6ZWQgYnkgdGhlIHpvbmUgc3BlY2lmaWNhdGlvbi4KCiAgdm9pZCBoYW5kbGVVbmNhdWdodEVycm9yKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIF9yb290SGFuZGxlVW5jYXVnaHRFcnJvcihudWxsLCBudWxsLCB0aGlzLCBlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICBab25lIGZvcmsoe1pvbmVTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24sIE1hcCB6b25lVmFsdWVzfSkgewogICAgcmV0dXJuIF9yb290Rm9yayhudWxsLCBudWxsLCB0aGlzLCBzcGVjaWZpY2F0aW9uLCB6b25lVmFsdWVzKTsKICB9CgogIFIgcnVuPFI+KFIgZigpKSB7CiAgICBpZiAoaWRlbnRpY2FsKFpvbmUuX2N1cnJlbnQsIF9yb290Wm9uZSkpIHJldHVybiBmKCk7CiAgICByZXR1cm4gX3Jvb3RSdW4obnVsbCwgbnVsbCwgdGhpcywgZik7CiAgfQoKICBSIHJ1blVuYXJ5PFIsIFQ+KFIgZihUIGFyZyksIFQgYXJnKSB7CiAgICBpZiAoaWRlbnRpY2FsKFpvbmUuX2N1cnJlbnQsIF9yb290Wm9uZSkpIHJldHVybiBmKGFyZyk7CiAgICByZXR1cm4gX3Jvb3RSdW5VbmFyeShudWxsLCBudWxsLCB0aGlzLCBmLCBhcmcpOwogIH0KCiAgUiBydW5CaW5hcnk8UiwgVDEsIFQyPihSIGYoVDEgYXJnMSwgVDIgYXJnMiksIFQxIGFyZzEsIFQyIGFyZzIpIHsKICAgIGlmIChpZGVudGljYWwoWm9uZS5fY3VycmVudCwgX3Jvb3Rab25lKSkgcmV0dXJuIGYoYXJnMSwgYXJnMik7CiAgICByZXR1cm4gX3Jvb3RSdW5CaW5hcnkobnVsbCwgbnVsbCwgdGhpcywgZiwgYXJnMSwgYXJnMik7CiAgfQoKICBab25lQ2FsbGJhY2s8Uj4gcmVnaXN0ZXJDYWxsYmFjazxSPihSIGYoKSkgPT4gZjsKCiAgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4gcmVnaXN0ZXJVbmFyeUNhbGxiYWNrPFIsIFQ+KFIgZihUIGFyZykpID0+IGY7CgogIFpvbmVCaW5hcnlDYWxsYmFjazxSLCBUMSwgVDI+IHJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPigKICAgICAgICAgIFIgZihUMSBhcmcxLCBUMiBhcmcyKSkgPT4KICAgICAgZjsKCiAgQXN5bmNFcnJvciBlcnJvckNhbGxiYWNrKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSA9PiBudWxsOwoKICB2b2lkIHNjaGVkdWxlTWljcm90YXNrKHZvaWQgZigpKSB7CiAgICBfcm9vdFNjaGVkdWxlTWljcm90YXNrKG51bGwsIG51bGwsIHRoaXMsIGYpOwogIH0KCiAgVGltZXIgY3JlYXRlVGltZXIoRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgZigpKSB7CiAgICByZXR1cm4gVGltZXIuX2NyZWF0ZVRpbWVyKGR1cmF0aW9uLCBmKTsKICB9CgogIFRpbWVyIGNyZWF0ZVBlcmlvZGljVGltZXIoRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgZihUaW1lciB0aW1lcikpIHsKICAgIHJldHVybiBUaW1lci5fY3JlYXRlUGVyaW9kaWNUaW1lcihkdXJhdGlvbiwgZik7CiAgfQoKICB2b2lkIHByaW50KFN0cmluZyBsaW5lKSB7CiAgICBwcmludFRvQ29uc29sZShsaW5lKTsKICB9Cn0KCmNvbnN0IF9yb290Wm9uZSA9IGNvbnN0IF9Sb290Wm9uZSgpOwoKLyoqCiAqIFJ1bnMgW2JvZHldIGluIGl0cyBvd24gem9uZS4KICoKICogQ3JlYXRlcyBhIG5ldyB6b25lIHVzaW5nIFtab25lLmZvcmtdIGJhc2VkIG9uIFt6b25lU3BlY2lmaWNhdGlvbl0gYW5kCiAqIFt6b25lVmFsdWVzXSwgdGhlbiBydW5zIFtib2R5XSBpbiB0aGF0IHpvbmUgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KICoKICogSWYgW29uRXJyb3JdIGlzIHByb3ZpZGVkLCBpdCBtdXN0IGhhdmUgb25lIG9mIHRoZSB0eXBlcwogKiAqIGB2b2lkIEZ1bmN0aW9uKE9iamVjdClgCiAqICogYHZvaWQgRnVuY3Rpb24oT2JqZWN0LCBTdGFja1RyYWNlKWAKICogYW5kIHRoZSBbb25FcnJvcl0gaGFuZGxlciBpcyB1c2VkICpib3RoKiB0byBoYW5kbGUgYXN5bmNocm9ub3VzIGVycm9ycwogKiBieSBvdmVycmlkaW5nIFtab25lU3BlY2lmaWNhdGlvbi5oYW5kbGVVbmNhdWdodEVycm9yXSBpbiBbem9uZVNwZWNpZmljYXRpb25dLAogKiBpZiBhbnksICphbmQqIHRvIGhhbmRsZSBlcnJvcnMgdGhyb3duIHN5bmNocm9ub3VzbHkgYnkgdGhlIGNhbGwgdG8gW2JvZHldLgogKgogKiBJZiBhbiBlcnJvciBvY2N1cnMgc3luY2hyb25vdXNseSBpbiBbYm9keV0sCiAqIHRoZW4gdGhyb3dpbmcgaW4gdGhlIFtvbkVycm9yXSBoYW5kbGVyCiAqIG1ha2VzIHRoZSBjYWxsIHRvIGBydW5ab25lYCB0aHJvdyB0aGF0IGVycm9yLAogKiBhbmQgb3RoZXJ3aXNlIHRoZSBjYWxsIHRvIGBydW5ab25lZGAgcmV0dXJucyBgbnVsbGAuCiAqCiAqIElmIHRoZSB6b25lIHNwZWNpZmljYXRpb24gaGFzIGEgYGhhbmRsZVVuY2F1Z2h0RXJyb3JgIHZhbHVlIG9yIHRoZSBbb25FcnJvcl0KICogcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCB0aGUgem9uZSBiZWNvbWVzIGFuIGVycm9yLXpvbmUuCiAqCiAqIEVycm9ycyB3aWxsIG5ldmVyIGNyb3NzIGVycm9yLXpvbmUgYm91bmRhcmllcyBieSB0aGVtc2VsdmVzLgogKiBFcnJvcnMgdGhhdCB0cnkgdG8gY3Jvc3MgZXJyb3Item9uZSBib3VuZGFyaWVzIGFyZSBjb25zaWRlcmVkIHVuY2F1Z2h0IGluCiAqIHRoZWlyIG9yaWdpbmF0aW5nIGVycm9yIHpvbmUuCiAqCiAqICAgICB2YXIgZnV0dXJlID0gbmV3IEZ1dHVyZS52YWx1ZSg0OTkpOwogKiAgICAgcnVuWm9uZWQoKCkgewogKiAgICAgICB2YXIgZnV0dXJlMiA9IGZ1dHVyZS50aGVuKChfKSB7IHRocm93ICJlcnJvciBpbiBmaXJzdCBlcnJvci16b25lIjsgfSk7CiAqICAgICAgIHJ1blpvbmVkKCgpIHsKICogICAgICAgICB2YXIgZnV0dXJlMyA9IGZ1dHVyZTIuY2F0Y2hFcnJvcigoZSkgeyBwcmludCgiTmV2ZXIgcmVhY2hlZCEiKTsgfSk7CiAqICAgICAgIH0sIG9uRXJyb3I6IChlKSB7IHByaW50KCJ1bnVzZWQgZXJyb3IgaGFuZGxlciIpOyB9KTsKICogICAgIH0sIG9uRXJyb3I6IChlKSB7IHByaW50KCJjYXRjaGVzIGVycm9yIG9mIGZpcnN0IGVycm9yLXpvbmUuIik7IH0pOwogKgogKiBFeGFtcGxlOgogKgogKiAgICAgcnVuWm9uZWQoKCkgewogKiAgICAgICBuZXcgRnV0dXJlKCgpIHsgdGhyb3cgImFzeW5jaHJvbm91cyBlcnJvciI7IH0pOwogKiAgICAgfSwgb25FcnJvcjogcHJpbnQpOyAgLy8gV2lsbCBwcmludCAiYXN5bmNocm9ub3VzIGVycm9yIi4KICoKICogSXQgaXMgcG9zc2libGUgdG8gbWFudWFsbHkgcGFzcyBhbiBlcnJvciBmcm9tIG9uZSBlcnJvciB6b25lIHRvIGFub3RoZXIKICogYnkgcmUtdGhyb3dpbmcgaXQgaW4gdGhlIG5ldyB6b25lLiBJZiBbb25FcnJvcl0gdGhyb3dzLCB0aGF0IGVycm9yIHdpbGwKICogb2NjdXIgaW4gdGhlIG9yaWdpbmFsIHpvbmUgd2hlcmUgW3J1blpvbmVkXSB3YXMgY2FsbGVkLgogKi8KUiBydW5ab25lZDxSPihSIGJvZHkoKSwKICAgIHtNYXAgem9uZVZhbHVlcywgWm9uZVNwZWNpZmljYXRpb24gem9uZVNwZWNpZmljYXRpb24sIEZ1bmN0aW9uIG9uRXJyb3J9KSB7CiAgaWYgKG9uRXJyb3IgPT0gbnVsbCkgewogICAgcmV0dXJuIF9ydW5ab25lZDxSPihib2R5LCB6b25lVmFsdWVzLCB6b25lU3BlY2lmaWNhdGlvbik7CiAgfQogIHZvaWQgRnVuY3Rpb24oT2JqZWN0KSB1bmFyeU9uRXJyb3I7CiAgdm9pZCBGdW5jdGlvbihPYmplY3QsIFN0YWNrVHJhY2UpIGJpbmFyeU9uRXJyb3I7CiAgaWYgKG9uRXJyb3IgaXMgdm9pZCBGdW5jdGlvbihPYmplY3QsIFN0YWNrVHJhY2UpKSB7CiAgICBiaW5hcnlPbkVycm9yID0gb25FcnJvcjsKICB9IGVsc2UgaWYgKG9uRXJyb3IgaXMgdm9pZCBGdW5jdGlvbihPYmplY3QpKSB7CiAgICB1bmFyeU9uRXJyb3IgPSBvbkVycm9yOwogIH0gZWxzZSB7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigib25FcnJvciBjYWxsYmFjayBtdXN0IHRha2UgZWl0aGVyIGFuIE9iamVjdCAiCiAgICAgICAgIih0aGUgZXJyb3IpLCBvciBib3RoIGFuIE9iamVjdCAodGhlIGVycm9yKSBhbmQgYSBTdGFja1RyYWNlLiIpOwogIH0KICBIYW5kbGVVbmNhdWdodEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIgPSAoWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LAogICAgICBab25lIHpvbmUsIGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIHRyeSB7CiAgICAgIGlmIChiaW5hcnlPbkVycm9yICE9IG51bGwpIHsKICAgICAgICBzZWxmLnBhcmVudC5ydW5CaW5hcnkoYmluYXJ5T25FcnJvciwgZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydCh1bmFyeU9uRXJyb3IgIT0gbnVsbCk7CiAgICAgICAgc2VsZi5wYXJlbnQucnVuVW5hcnkodW5hcnlPbkVycm9yLCBlcnJvcik7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgaWYgKGlkZW50aWNhbChlLCBlcnJvcikpIHsKICAgICAgICBwYXJlbnQuaGFuZGxlVW5jYXVnaHRFcnJvcih6b25lLCBlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGFyZW50LmhhbmRsZVVuY2F1Z2h0RXJyb3Ioem9uZSwgZSwgcyk7CiAgICAgIH0KICAgIH0KICB9OwogIGlmICh6b25lU3BlY2lmaWNhdGlvbiA9PSBudWxsKSB7CiAgICB6b25lU3BlY2lmaWNhdGlvbiA9CiAgICAgICAgbmV3IFpvbmVTcGVjaWZpY2F0aW9uKGhhbmRsZVVuY2F1Z2h0RXJyb3I6IGVycm9ySGFuZGxlcik7CiAgfSBlbHNlIHsKICAgIHpvbmVTcGVjaWZpY2F0aW9uID0gbmV3IFpvbmVTcGVjaWZpY2F0aW9uLmZyb20oem9uZVNwZWNpZmljYXRpb24sCiAgICAgICAgaGFuZGxlVW5jYXVnaHRFcnJvcjogZXJyb3JIYW5kbGVyKTsK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dGhpcyBwYXRjaCBsaWJyYXJ5OgovLyBwYXJ0ICJkZWZlcnJlZF9sb2FkX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJzY2hlZHVsZV9taWNyb3Rhc2tfcGF0Y2guZGFydCI7Ci8vIHBhcnQgInRpbWVyX3BhdGNoLmRhcnQiOwoKLy8gRXF1aXZhbGVudCBvZiBjYWxsaW5nIEZBVEFMIGZyb20gQysrIGNvZGUuCl9mYXRhbChtc2cpIG5hdGl2ZSAiRGFydEFzeW5jX2ZhdGFsIjsKCmNsYXNzIF9Bc3luY0F3YWl0Q29tcGxldGVyPFQ+IGltcGxlbWVudHMgQ29tcGxldGVyPFQ+IHsKICBmaW5hbCBfY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxUPi5zeW5jKCk7CiAgYm9vbCBpc1N5bmM7CgogIF9Bc3luY0F3YWl0Q29tcGxldGVyKCkgOiBpc1N5bmMgPSBmYWxzZTsKCiAgdm9pZCBjb21wbGV0ZShbRnV0dXJlT3I8VD4gdmFsdWVdKSB7CiAgICBpZiAoaXNTeW5jKSB7CiAgICAgIF9jb21wbGV0ZXIuY29tcGxldGUodmFsdWUpOwogICAgfSBlbHNlIGlmICh2YWx1ZSBpcyBGdXR1cmU8VD4pIHsKICAgICAgdmFsdWUudGhlbihfY29tcGxldGVyLmNvbXBsZXRlLCBvbkVycm9yOiBfY29tcGxldGVyLmNvbXBsZXRlRXJyb3IpOwogICAgfSBlbHNlIHsKICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAgICAgIF9jb21wbGV0ZXIuY29tcGxldGUodmFsdWUpOwogICAgICB9KTsKICAgIH0KICB9CgogIHZvaWQgY29tcGxldGVFcnJvcihlLCBbc3RdKSB7CiAgICBpZiAoaXNTeW5jKSB7CiAgICAgIF9jb21wbGV0ZXIuY29tcGxldGVFcnJvcihlLCBzdCk7CiAgICB9IGVsc2UgewogICAgICBzY2hlZHVsZU1pY3JvdGFzaygoKSB7CiAgICAgICAgX2NvbXBsZXRlci5jb21wbGV0ZUVycm9yKGUsIHN0KTsKICAgICAgfSk7CiAgICB9CiAgfQoKICB2b2lkIHN0YXJ0KGYpIHsKICAgIGYoKTsKICAgIGlzU3luYyA9IHRydWU7CiAgfQoKICBGdXR1cmU8VD4gZ2V0IGZ1dHVyZSA9PiBfY29tcGxldGVyLmZ1dHVyZTsKICBib29sIGdldCBpc0NvbXBsZXRlZCA9PiBfY29tcGxldGVyLmlzQ29tcGxldGVkOwp9CgovLyBXZSBuZWVkIHRvIHBhc3MgdGhlIHZhbHVlIGFzIGZpcnN0IGFyZ3VtZW50IGFuZCBsZWF2ZSB0aGUgc2Vjb25kIGFuZCB0aGlyZAovLyBhcmd1bWVudHMgZW1wdHkgKHVzZWQgZm9yIGVycm9yIGhhbmRsaW5nKS4KLy8gU2VlIHZtL2FzdF90cmFuc2Zvcm1lci5jYyBmb3IgdXNhZ2UuCkZ1bmN0aW9uIF9hc3luY1RoZW5XcmFwcGVySGVscGVyKGNvbnRpbnVhdGlvbikgewogIC8vIEFueSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgYXMgYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrIG11c3QgYmUgcmVnaXN0ZXJlZAogIC8vIGluIHRoZSBjdXJyZW50IFpvbmUuIE5vcm1hbGx5LCB0aGlzIGlzIGRvbmUgYnkgdGhlIGZ1dHVyZSB3aGVuIGEKICAvLyBjYWxsYmFjayBpcyByZWdpc3RlcmVkIChmb3IgZXhhbXBsZSB3aXRoIGAudGhlbmAgb3IgYC5jYXRjaEVycm9yYCkuIEluIG91cgogIC8vIGNhc2Ugd2Ugd2FudCB0byByZXVzZSB0aGUgc2FtZSBjYWxsYmFjayBtdWx0aXBsZSB0aW1lcyBhbmQgdGhlcmVmb3JlIGF2b2lkCiAgLy8gdGhlIG11bHRpcGxlIHJlZ2lzdHJhdGlvbnMuIEZvciBvdXIgaW50ZXJuYWwgZnV0dXJlcyAoYF9GdXR1cmVgKSB3ZSBjYW4KICAvLyB1c2UgdGhlIHNob3J0Y3V0LXZlcnNpb24gb2YgYC50aGVuYCwgYW5kIHNraXAgdGhlIHJlZ2lzdHJhdGlvbi4gSG93ZXZlciwKICAvLyB0aGF0IG1lYW5zIHRoYXQgdGhlIGNvbnRpbnVhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgYnkgdXMuCiAgLy8KICAvLyBGdXJ0aGVybW9yZSwgd2Uga25vdyB0aGF0IHRoZSByb290LXpvbmUgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyBhbmQKICAvLyB3ZSBjYW4gdGhlcmVmb3JlIHNraXAgdGhlIHJlZ2lzdHJhdGlvbiBjYWxsIGZvciBpdC4KICAvLwogIC8vIE5vdGUsIHRoYXQgdGhlIGNvbnRpbnVhdGlvbiBhY2NlcHRzIHVwIHRvIHRocmVlIGFyZ3VtZW50cy4gSWYgdGhlIGN1cnJlbnQKICAvLyB6b25lIGlzIHRoZSByb290IHpvbmUsIHdlIGRvbid0IHdyYXAgdGhlIGNvbnRpbnVhdGlvbiwgYW5kIGEgYmFkCiAgLy8gYEZ1dHVyZWAgaW1wbGVtZW50YXRpb24gY291bGQgcG90ZW50aWFsbHkgaW52b2tlIHRoZSBjYWxsYmFjayB3aXRoIHRoZQogIC8vIHdyb25nIG51bWJlciBvZiBhcmd1bWVudHMuCiAgaWYgKFpvbmUuY3VycmVudCA9PSBab25lLnJvb3QpIHJldHVybiBjb250aW51YXRpb247CiAgcmV0dXJuIFpvbmUuY3VycmVudC5yZWdpc3RlclVuYXJ5Q2FsbGJhY2soKHgpID0+IGNvbnRpbnVhdGlvbih4LCBudWxsLCBudWxsKSk7Cn0KCi8vIFdlIG5lZWQgdG8gcGFzcyB0aGUgZXhjZXB0aW9uIGFuZCBzdGFjayB0cmFjZSBvYmplY3RzIGFzIHNlY29uZCBhbmQgdGhpcmQKLy8gcGFyYW1ldGVyIHRvIHRoZSBjb250aW51YXRpb24uICBTZWUgdm0vYXN0X3RyYW5zZm9ybWVyLmNjIGZvciB1c2FnZS4KRnVuY3Rpb24gX2FzeW5jRXJyb3JXcmFwcGVySGVscGVyKGNvbnRpbnVhdGlvbikgewogIC8vIFNlZSBjb21tZW50cyBvZiBgX2FzeW5jVGhlbldyYXBwZXJIZWxwZXJgLgogIHZhciBlcnJvckNhbGxiYWNrID0gKGUsIHMpID0+IGNvbnRpbnVhdGlvbihudWxsLCBlLCBzKTsKICBpZiAoWm9uZS5jdXJyZW50ID09IFpvbmUucm9vdCkgcmV0dXJuIGVycm9yQ2FsbGJhY2s7CiAgcmV0dXJuIFpvbmUuY3VycmVudC5yZWdpc3RlckJpbmFyeUNhbGxiYWNrKGVycm9yQ2FsbGJhY2spOwp9CgovLy8gUmVnaXN0ZXJzIHRoZSBbdGhlbkNhbGxiYWNrXSBhbmQgW2Vycm9yQ2FsbGJhY2tdIG9uIHRoZSBnaXZlbiBbb2JqZWN0XS4KLy8vCi8vLyBJZiBbb2JqZWN0XSBpcyBub3QgYSBmdXR1cmUsIHRoZW4gaXQgaXMgd3JhcHBlZCBpbnRvIG9uZS4KLy8vCi8vLyBSZXR1cm5zIHRoZSByZXN1bHQgb2YgcmVnaXN0ZXJpbmcgd2l0aCBgLnRoZW5gLgpGdXR1cmUgX2F3YWl0SGVscGVyKAogICAgdmFyIG9iamVjdCwgRnVuY3Rpb24gdGhlbkNhbGxiYWNrLCBGdW5jdGlvbiBlcnJvckNhbGxiYWNrLCB2YXIgYXdhaXRlcikgewogIGlmIChvYmplY3QgaXMhIEZ1dHVyZSkgewogICAgb2JqZWN0ID0gbmV3IF9GdXR1cmUoKS4uX3NldFZhbHVlKG9iamVjdCk7CiAgfSBlbHNlIGlmIChvYmplY3QgaXMhIF9GdXR1cmUpIHsKICAgIHJldHVybiBvYmplY3QudGhlbih0aGVuQ2FsbGJhY2ssIG9uRXJyb3I6IGVycm9yQ2FsbGJhY2spOwogIH0KICAvLyBgb2JqZWN0YCBpcyBhIGBfRnV0dXJlYC4KICAvLwogIC8vIFNpbmNlIHRoZSBjYWxsYmFja3MgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgaW4gdGhlIGN1cnJlbnQgem9uZSAoc2VlCiAgLy8gW19hc3luY1RoZW5XcmFwcGVySGVscGVyXSBhbmQgW19hc3luY0Vycm9yV3JhcHBlckhlbHBlcl0pLCB3ZSBjYW4gYXZvaWQKICAvLyBhbm90aGVyIHJlZ2lzdHJhdGlvbiBhbmQgZGlyZWN0bHkgaW52b2tlIHRoZSBuby16b25lLXJlZ2lzdHJhdGlvbiBgLnRoZW5gLgogIC8vCiAgLy8gV2UgY2FuIG9ubHkgZG8gdGhpcyBmb3Igb3VyIGludGVybmFsIGZ1dHVyZXMgKHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mCiAgLy8gYWxsIGZ1dHVyZXMgdGhhdCBhcmUgY29uc3RydWN0ZWQgYnkgdGhlIGBkYXJ0OmFzeW5jYCBsaWJyYXJ5KS4KICBvYmplY3QuX2F3YWl0ZXIgPSBhd2FpdGVyOwogIHJldHVybiBvYmplY3QuX3RoZW5Ob1pvbmVSZWdpc3RyYXRpb24odGhlbkNhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKfQoKLy8gQ2FsbGVkIGFzIHBhcnQgb2YgdGhlICdhd2FpdCBmb3IgKC4uLiknIGNvbnN0cnVjdC4gUmVnaXN0ZXJzIHRoZQovLyBhd2FpdGVyIG9uIHRoZSBzdHJlYW0uCnZvaWQgX2FzeW5jU3Rhckxpc3RlbkhlbHBlcih2YXIgb2JqZWN0LCB2YXIgYXdhaXRlcikgewogIGlmIChvYmplY3QgaXMhIF9TdHJlYW1JbXBsKSB7CiAgICByZXR1cm47CiAgfQogIC8vIGBvYmplY3RgIGlzIGEgYF9TdHJlYW1JbXBsYC4KICBvYmplY3QuX2F3YWl0ZXIgPSBhd2FpdGVyOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKdm9pZCBfYXN5bmNTdGFyTW92ZU5leHRIZWxwZXIodmFyIHN0cmVhbSkgewogIGlmIChzdHJlYW0gaXMhIF9TdHJlYW1JbXBsKSB7CiAgICByZXR1cm47CiAgfQogIC8vIHN0cmVhbSBpcyBhIF9TdHJlYW1JbXBsLgogIGlmIChzdHJlYW0uX2dlbmVyYXRvciA9PSBudWxsKSB7CiAgICAvLyBObyBnZW5lcmF0b3IgcmVnaXN0ZXJlZCwgdGhpcyBpc24ndCBhbiBhc3luYyogU3RyZWFtLgogICAgcmV0dXJuOwogIH0KICBfbW92ZU5leHREZWJ1Z2dlclN0ZXBDaGVjayhzdHJlYW0uX2dlbmVyYXRvcik7Cn0KCi8vIF9Bc3luY1N0YXJTdHJlYW1Db250cm9sbGVyIGlzIHVzZWQgYnkgdGhlIGNvbXBpbGVyIHRvIGltcGxlbWVudAovLyBhc3luYyogZ2VuZXJhdG9yIGZ1bmN0aW9ucy4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcjxUPiB7CiAgU3RyZWFtQ29udHJvbGxlcjxUPiBjb250cm9sbGVyOwogIEZ1bmN0aW9uIGFzeW5jU3RhckJvZHk7CiAgYm9vbCBpc0FkZGluZyA9IGZhbHNlOwogIGJvb2wgb25MaXN0ZW5SZWNlaXZlZCA9IGZhbHNlOwogIGJvb2wgaXNTY2hlZHVsZWQgPSBmYWxzZTsKICBib29sIGlzU3VzcGVuZGVkQXRZaWVsZCA9IGZhbHNlOwogIENvbXBsZXRlciBjYW5jZWxsYXRpb25Db21wbGV0ZXIgPSBudWxsOwoKICBTdHJlYW08VD4gZ2V0IHN0cmVhbSB7CiAgICBmaW5hbCBTdHJlYW08VD4gbG9jYWwgPSBjb250cm9sbGVyLnN0cmVhbTsKICAgIGlmIChsb2NhbCBpcyBfU3RyZWFtSW1wbDxUPikgewogICAgICBsb2NhbC5fZ2VuZXJhdG9yID0gYXN5bmNTdGFyQm9keTsKICAgIH0KICAgIHJldHVybiBsb2NhbDsKICB9CgogIHZvaWQgcnVuQm9keSgpIHsKICAgIGlzU2NoZWR1bGVkID0gZmFsc2U7CiAgICBpc1N1c3BlbmRlZEF0WWllbGQgPSBmYWxzZTsKICAgIGFzeW5jU3RhckJvZHkoKTsKICB9CgogIHZvaWQgc2NoZWR1bGVHZW5lcmF0b3IoKSB7CiAgICBpZiAoaXNTY2hlZHVsZWQgfHwgY29udHJvbGxlci5pc1BhdXNlZCB8fCBpc0FkZGluZykgewogICAgICByZXR1cm47CiAgICB9CiAgICBpc1NjaGVkdWxlZCA9IHRydWU7CiAgICBzY2hlZHVsZU1pY3JvdGFzayhydW5Cb2R5KTsKICB9CgogIC8vIEFkZHMgZWxlbWVudCB0byBzdHJlYW0sIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbGVyIHNob3VsZCB0ZXJtaW5hdGUKICAvLyBleGVjdXRpb24gb2YgdGhlIGdlbmVyYXRvci4KICAvLwogIC8vIFRPRE8oaGF1c25lcik6IFBlciBzcGVjLCB0aGUgZ2VuZXJhdG9yIHNob3VsZCBiZSBzdXNwZW5kZWQgYmVmb3JlCiAgLy8gZXhpdGluZyB3aGVuIHRoZSBzdHJlYW0gaXMgY2xvc2VkLiBXZSBjb3VsZCBhZGQgYSBnZXR0ZXIgbGlrZSB0aGlzOgogIC8vIGdldCBpc0NhbmNlbGxlZCA9PiBjb250cm9sbGVyLmhhc0xpc3RlbmVyOwogIC8vIFRoZSBnZW5lcmF0b3Igd291bGQgdHJhbnNsYXRlIGEgJ3lpZWxkIGUnIHN0YXRlbWVudCB0bwogIC8vIGNvbnRyb2xsZXIuYWRkKGUpOwogIC8vIHN1c3BlbmQ7CiAgLy8gaWYgKGNvbnRyb2xsZXIuaXNDYW5jZWxsZWQpIHJldHVybjsKICBib29sIGFkZChUIGV2ZW50KSB7CiAgICBpZiAoIW9uTGlzdGVuUmVjZWl2ZWQpIF9mYXRhbCgieWllbGQgYmVmb3JlIHN0cmVhbSBpcyBsaXN0ZW5lZCB0byIpOwogICAgaWYgKGlzU3VzcGVuZGVkQXRZaWVsZCkgX2ZhdGFsKCJ1bmV4cGVjdGVkIHlpZWxkIik7CiAgICAvLyBJZiBzdHJlYW0gaXMgY2FuY2VsbGVkLCB0ZWxsIGNhbGxlciB0byBleGl0IHRoZSBhc3luYyBnZW5lcmF0b3IuCiAgICBpZiAoIWNvbnRyb2xsZXIuaGFzTGlzdGVuZXIpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjb250cm9sbGVyLmFkZChldmVudCk7CiAgICBzY2hlZHVsZUdlbmVyYXRvcigpOwogICAgaXNTdXNwZW5kZWRBdFlpZWxkID0gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vIEFkZHMgdGhlIGVsZW1lbnRzIG9mIHN0cmVhbSBpbnRvIHRoaXMgY29udHJvbGxlcidzIHN0cmVhbS4KICAvLyBUaGUgZ2VuZXJhdG9yIHdpbGwgYmUgc2NoZWR1bGVkIGFnYWluIHdoZW4gYWxsIG9mIHRoZQogIC8vIGVsZW1lbnRzIG9mIHRoZSBhZGRlZCBzdHJlYW0gaGF2ZSBiZWVuIGNvbnN1bWVkLgogIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbGVyIHNob3VsZCB0ZXJtaW5hdGUKICAvLyBleGVjdXRpb24gb2YgdGhlIGdlbmVyYXRvci4KICBib29sIGFkZFN0cmVhbShTdHJlYW08VD4gc3RyZWFtKSB7CiAgICBpZiAoIW9uTGlzdGVuUmVjZWl2ZWQpIF9mYXRhbCgieWllbGQgYmVmb3JlIHN0cmVhbSBpcyBsaXN0ZW5lZCB0byIpOwogICAgLy8gSWYgc3RyZWFtIGlzIGNhbmNlbGxlZCwgdGVsbCBjYWxsZXIgdG8gZXhpdCB0aGUgYXN5bmMgZ2VuZXJhdG9yLgogICAgaWYgKCFjb250cm9sbGVyLmhhc0xpc3RlbmVyKSByZXR1cm4gdHJ1ZTsKICAgIGlzQWRkaW5nID0gdHJ1ZTsKICAgIHZhciB3aGVuRG9uZUFkZGluZyA9IGNvbnRyb2xsZXIuYWRkU3RyZWFtKHN0cmVhbSwgY2FuY2VsT25FcnJvcjogZmFsc2UpOwogICAgd2hlbkRvbmVBZGRpbmcudGhlbigoXykgewogICAgICBpc0FkZGluZyA9IGZhbHNlOwogICAgICBzY2hlZHVsZUdlbmVyYXRvcigpOwogICAgICBpZiAoIWlzU2NoZWR1bGVkKSBpc1N1c3BlbmRlZEF0WWllbGQgPSB0cnVlOwogICAgfSk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIGFkZEVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBpZiAoKGNhbmNlbGxhdGlvbkNvbXBsZXRlciAhPSBudWxsKSAmJiAhY2FuY2VsbGF0aW9uQ29tcGxldGVyLmlzQ29tcGxldGVkKSB7CiAgICAgIC8vIElmIHRoZSBzdHJlYW0gaGFzIGJlZW4gY2FuY2VsbGVkLCBjb21wbGV0ZSB0aGUgY2FuY2VsbGF0aW9uIGZ1dHVyZQogICAgICAvLyB3aXRoIHRoZSBlcnJvci4KICAgICAgY2FuY2VsbGF0aW9uQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBJZiBzdHJlYW0gaXMgY2FuY2VsbGVkLCB0ZWxsIGNhbGxlciB0byBleGl0IHRoZSBhc3luYyBnZW5lcmF0b3IuCiAgICBpZiAoIWNvbnRyb2xsZXIuaGFzTGlzdGVuZXIpIHJldHVybjsKICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgLy8gTm8gbmVlZCB0byBzY2hlZHVsZSB0aGUgZ2VuZXJhdG9yIGJvZHkgaGVyZS4gVGhpcyBjb2RlIGlzIG9ubHkKICAgIC8vIGNhbGxlZCBmcm9tIHRoZSBjYXRjaCBjbGF1c2Ugb2YgdGhlIGltcGxpY2l0IHRyeS1jYXRjaC1maW5hbGx5CiAgICAvLyBhcm91bmQgdGhlIGdlbmVyYXRvciBib2R5LiBUaGF0IGlzLCB3ZSBhcmUgb24gdGhlIGVycm9yIHBhdGggb3V0CiAgICAvLyBvZiB0aGUgZ2VuZXJhdG9yIGFuZCBkbyBub3QgbmVlZCB0byBydW4gdGhlIGdlbmVyYXRvciBhZ2Fpbi4KICB9CgogIGNsb3NlKCkgewogICAgaWYgKChjYW5jZWxsYXRpb25Db21wbGV0ZXIgIT0gbnVsbCkgJiYgIWNhbmNlbGxhdGlvbkNvbXBsZXRlci5pc0NvbXBsZXRlZCkgewogICAgICAvLyBJZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGNhbmNlbGxlZCwgY29tcGxldGUgdGhlIGNhbmNlbGxhdGlvbiBmdXR1cmUKICAgICAgLy8gd2l0aCB0aGUgZXJyb3IuCiAgICAgIGNhbmNlbGxhdGlvbkNvbXBsZXRlci5jb21wbGV0ZSgpOwogICAgfQogICAgY29udHJvbGxlci5jbG9zZSgpOwogIH0KCiAgX0FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXIodGhpcy5hc3luY1N0YXJCb2R5KSB7CiAgICBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIoCiAgICAgICAgb25MaXN0ZW46IHRoaXMub25MaXN0ZW4sCiAgICAgICAgb25SZXN1bWU6IHRoaXMub25SZXN1bWUsCiAgICAgICAgb25DYW5jZWw6IHRoaXMub25DYW5jZWwpOwogIH0KCiAgb25MaXN0ZW4oKSB7CiAgICBhc3NlcnQoIW9uTGlzdGVuUmVjZWl2ZWQpOwogICAgb25MaXN0ZW5SZWNlaXZlZCA9IHRydWU7CiAgICBzY2hlZHVsZUdlbmVyYXRvcigpOwogIH0KCiAgb25SZXN1bWUoKSB7CiAgICBpZiAoaXNTdXNwZW5kZWRBdFlpZWxkKSB7CiAgICAgIHNjaGVkdWxlR2VuZXJhdG9yKCk7CiAgICB9CiAgfQoKICBvbkNhbmNlbCgpIHsKICAgIGlmIChjb250cm9sbGVyLmlzQ2xvc2VkKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGNhbmNlbGxhdGlvbkNvbXBsZXRlciA9PSBudWxsKSB7CiAgICAgIGNhbmNlbGxhdGlvbkNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKICAgICAgLy8gT25seSByZXN1bWUgdGhlIGdlbmVyYXRvciBpZiBpdCBpcyBzdXNwZW5kZWQgYXQgYSB5aWVsZC4KICAgICAgLy8gQ2FuY2VsbGF0aW9uIGRvZXMgbm90IGFmZmVjdCBhbiBhc3luYyBnZW5lcmF0b3IgdGhhdCBpcwogICAgICAvLyBzdXNwZW5kZWQgYXQgYW4gYXdhaXQuCiAgICAgIGlmIChpc1N1c3BlbmRlZEF0WWllbGQpIHsKICAgICAgICBzY2hlZHVsZUdlbmVyYXRvcigpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY2FuY2VsbGF0aW9uQ29tcGxldGVyLmZ1dHVyZTsKICB9Cn0KCkBwYXRjaAp2b2lkIF9yZXRocm93KE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSBuYXRpdmUgIkFzeW5jX3JldGhyb3ciOwoKQHBhdGNoCmNsYXNzIF9GdXR1cmU8VD4gewogIC8vLyBUaGUgY2xvc3VyZSBpbXBsZW1lbnRpbmcgdGhlIGFzeW5jWypdLWJvZHkgdGhhdCBpcyBgYXdhaXRgaW5nIHRoaXMgZnV0dXJlLgogIEZ1bmN0aW9uIF9hd2FpdGVyOwp9CgpAcGF0Y2gKY2xhc3MgX1N0cmVhbUltcGw8VD4gewogIC8vLyBUaGUgY2xvc3VyZSBpbXBsZW1lbnRpbmcgdGhlIGFzeW5jWypdLWJvZHkgdGhhdCBpcyBgYXdhaXRgaW5nIHRoaXMgZnV0dXJlLgogIEZ1bmN0aW9uIF9hd2FpdGVyOwoKICAvLy8gVGhlIGNsb3N1cmUgaW1wbGVtZW50aW5nIHRoZSBhc3luYy1nZW5lcmF0b3IgYm9keSB0aGF0IGlzIGNyZWF0aW5nIGV2ZW50cwogIC8vLyBmb3IgdGhpcyBzdHJlYW0uCiAgRnVuY3Rpb24gX2dlbmVyYXRvcjsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCnZvaWQgX2NvbXBsZXRlT25Bc3luY1JldHVybihDb21wbGV0ZXIgY29tcGxldGVyLCBPYmplY3QgdmFsdWUpIHsKICBjb21wbGV0ZXIuY29tcGxldGUodmFsdWUpOwp9CgovLy8gUmV0dXJucyBhIFtTdGFja1RyYWNlXSBvYmplY3QgY29udGFpbmluZyB0aGUgc3luY2hyb25vdXMgcHJlZml4IGZvciB0aGlzCi8vLyBhc3luY2hyb25vdXMgbWV0aG9kLgovLwovLyBUaGlzIG1ldGhvZCBpcyByZWNvZ25pemVkLiBJdCBwZXJmb3JtcyBhIHJ1bnRpbWUgY2FsbCBpZgovLyBGTEFHX2NhdXNhbF9hc3luY19zdGFja3MgaXMgZW5hYmxlZCBvciByZXR1cm5zIGBudWxsYCBvdGhlcndpc2UuCkBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQpPYmplY3QgX2FzeW5jU3RhY2tUcmFjZUhlbHBlcihGdW5jdGlvbiBhc3luY19vcCkKICAgIG5hdGl2ZSAiU3RhY2tUcmFjZV9hc3luY1N0YWNrVHJhY2VIZWxwZXIiOwoKLy8gVGhpcyBtZXRob2QgaXMgYXNtIGludHJpbnNpZmllZC4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCnZvaWQgX2NsZWFyQXN5bmNUaHJlYWRTdGFja1RyYWNlKCkKICAgIG5hdGl2ZSAiU3RhY2tUcmFjZV9jbGVhckFzeW5jVGhyZWFkU3RhY2tUcmFjZSI7CgovLyBUaGlzIG1ldGhvZCBpcyBhc20gaW50cmluc2lmaWVkLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKdm9pZCBfc2V0QXN5bmNUaHJlYWRTdGFja1RyYWNlKFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkKICAgIG5hdGl2ZSAiU3RhY2tUcmFjZV9zZXRBc3luY1RocmVhZFN0YWNrVHJhY2UiOwoKdm9pZCBfbW92ZU5leHREZWJ1Z2dlclN0ZXBDaGVjayhGdW5jdGlvbiBhc3luY19vcCkKICAgIG5hdGl2ZSAiQXN5bmNTdGFyTW92ZU5leHRfZGVidWdnZXJTdGVwQ2hlY2siOwqBPwBOTjwBTVBNJAE0ATokKRwBLiYBOC4PASsBJxIiJUoNHSQKBgQBIBInDR0pCgYEARIJEwQBLTICAU4uKDFORlBQTU5ABU45BU9GTCA2UQIBTUgyMDo3PQIBTAQ+BDQVThsvIz4EHgVHTVAFUUQdRgIBRBo3IAwEIh0CASIsIAwEHiM9DAQxAgFDHxomIhoZIRwjKgEZLyMoBhIEARMZIBUEAR06DgYYIAQBSSEFR0kwPBgOKRZJOEgjEwYbGR8SBAFAOzYxISVJSC4VTR4YGzMIEgQBN1FMGT4OBkgpLEZGSEQEAQxRTBkoBhgEATMnISEiBAEPHx0ZBAEPHhsGBAEPHxMGKS9CQSAgHQgGKQQCAQdLAQcTURUCAQcXURUBUBcXAgEiQR0CAU0ZAzxEHDEvASQiIzQBJCI2MgEzMgEhZGFydDphc3luYy1wYXRjaC9hc3luY19wYXRjaC5kYXJ0PW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvc2NoZWR1bGVfbWljcm90YXNrX3BhdGNoLmRhcnSDjS8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJhc3luY19wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBfQXN5bmNSdW4gewogIEBwYXRjaAogIHN0YXRpYyB2b2lkIF9zY2hlZHVsZUltbWVkaWF0ZSh2b2lkIGNhbGxiYWNrKCkpIHsKICAgIGlmIChfU2NoZWR1bGVJbW1lZGlhdGUuX2Nsb3N1cmUgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiTWljcm90YXNrcyBhcmUgbm90IHN1cHBvcnRlZCIpOwogICAgfQogICAgX1NjaGVkdWxlSW1tZWRpYXRlLl9jbG9zdXJlKGNhbGxiYWNrKTsKICB9Cn0KCnR5cGVkZWYgdm9pZCBfU2NoZWR1bGVJbW1lZGlhdGVDbG9zdXJlKHZvaWQgY2FsbGJhY2soKSk7CgpjbGFzcyBfU2NoZWR1bGVJbW1lZGlhdGUgewogIHN0YXRpYyBfU2NoZWR1bGVJbW1lZGlhdGVDbG9zdXJlIF9jbG9zdXJlOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKdm9pZCBfc2V0U2NoZWR1bGVJbW1lZGlhdGVDbG9zdXJlKF9TY2hlZHVsZUltbWVkaWF0ZUNsb3N1cmUgY2xvc3VyZSkgewogIF9TY2hlZHVsZUltbWVkaWF0ZS5fY2xvc3VyZSA9IGNsb3N1cmU7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQp2b2lkIF9lbnN1cmVTY2hlZHVsZUltbWVkaWF0ZSgpIHsKICBfQXN5bmNSdW4uX3NjaGVkdWxlSW1tZWRpYXRlKF9zdGFydE1pY3JvdGFza0xvb3ApOwp9CiIATk48AR8BBxIJNC9CBisEAgE5ARstAgEiRykCASIiNQIBLmRhcnQ6YXN5bmMtcGF0Y2gvc2NoZWR1bGVfbWljcm90YXNrX3BhdGNoLmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi90aW1lcl9wYXRjaC5kYXJ0he4vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiYXN5bmNfcGF0Y2guZGFydCI7CgpAcGF0Y2gKY2xhc3MgVGltZXIgewogIEBwYXRjaAogIHN0YXRpYyBUaW1lciBfY3JlYXRlVGltZXIoRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgY2FsbGJhY2soKSkgewogICAgLy8gVE9ETyhpcG9zdmEpOiBSZW1vdmUgX1RpbWVyRmFjdG9yeSBhbmQgdXNlIFZNTGlicmFyeUhvb2tzIGV4Y2x1c2l2ZWx5LgogICAgaWYgKF9UaW1lckZhY3RvcnkuX2ZhY3RvcnkgPT0gbnVsbCkgewogICAgICBfVGltZXJGYWN0b3J5Ll9mYWN0b3J5ID0gVk1MaWJyYXJ5SG9va3MudGltZXJGYWN0b3J5OwogICAgfQogICAgaWYgKF9UaW1lckZhY3RvcnkuX2ZhY3RvcnkgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVGltZXIgaW50ZXJmYWNlIG5vdCBzdXBwb3J0ZWQuIik7CiAgICB9CiAgICBpbnQgbWlsbGlzZWNvbmRzID0gZHVyYXRpb24uaW5NaWxsaXNlY29uZHM7CiAgICBpZiAobWlsbGlzZWNvbmRzIDwgMCkgbWlsbGlzZWNvbmRzID0gMDsKICAgIHJldHVybiBfVGltZXJGYWN0b3J5Ll9mYWN0b3J5KG1pbGxpc2Vjb25kcywgKF8pIHsKICAgICAgY2FsbGJhY2soKTsKICAgIH0sIGZhbHNlKTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBUaW1lciBfY3JlYXRlUGVyaW9kaWNUaW1lcigKICAgICAgRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgY2FsbGJhY2soVGltZXIgdGltZXIpKSB7CiAgICAvLyBUT0RPKGlwb3N2YSk6IFJlbW92ZSBfVGltZXJGYWN0b3J5IGFuZCB1c2UgVk1MaWJyYXJ5SG9va3MgZXhjbHVzaXZlbHkuCiAgICBfVGltZXJGYWN0b3J5Ll9mYWN0b3J5ID8/PSBWTUxpYnJhcnlIb29rcy50aW1lckZhY3Rvcnk7CiAgICBpZiAoX1RpbWVyRmFjdG9yeS5fZmFjdG9yeSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJUaW1lciBpbnRlcmZhY2Ugbm90IHN1cHBvcnRlZC4iKTsKICAgIH0KICAgIGludCBtaWxsaXNlY29uZHMgPSBkdXJhdGlvbi5pbk1pbGxpc2Vjb25kczsKICAgIGlmIChtaWxsaXNlY29uZHMgPCAwKSBtaWxsaXNlY29uZHMgPSAwOwogICAgcmV0dXJuIF9UaW1lckZhY3RvcnkuX2ZhY3RvcnkobWlsbGlzZWNvbmRzLCBjYWxsYmFjaywgdHJ1ZSk7CiAgfQp9Cgp0eXBlZGVmIFRpbWVyIF9UaW1lckZhY3RvcnlDbG9zdXJlKAogICAgaW50IG1pbGxpc2Vjb25kcywgdm9pZCBjYWxsYmFjayhUaW1lciB0aW1lciksIGJvb2wgcmVwZWF0aW5nKTsKCmNsYXNzIF9UaW1lckZhY3RvcnkgewogIHN0YXRpYyBfVGltZXJGYWN0b3J5Q2xvc3VyZSBfZmFjdG9yeTsKfQouAE5OPAEfAQcOCUJOKjwGKkQGMCw2Eg8EAQklN048KkQGMCxBBAIBJEMBFigCASFkYXJ0OmFzeW5jLXBhdGNoL3RpbWVyX3BhdGNoLmRhcnRCb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2FzeW5jL2Jyb2FkY2FzdF9zdHJlYW1fY29udHJvbGxlci5kYXJ0vI4vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmFzeW5jOwoKY2xhc3MgX0Jyb2FkY2FzdFN0cmVhbTxUPiBleHRlbmRzIF9Db250cm9sbGVyU3RyZWFtPFQ+IHsKICBfQnJvYWRjYXN0U3RyZWFtKF9TdHJlYW1Db250cm9sbGVyTGlmZWN5Y2xlPFQ+IGNvbnRyb2xsZXIpCiAgICAgIDogc3VwZXIoY29udHJvbGxlcik7CgogIGJvb2wgZ2V0IGlzQnJvYWRjYXN0ID0+IHRydWU7Cn0KCmNsYXNzIF9Ccm9hZGNhc3RTdWJzY3JpcHRpb248VD4gZXh0ZW5kcyBfQ29udHJvbGxlclN1YnNjcmlwdGlvbjxUPiB7CiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfRVZFTlRfSUQgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0ZJUklORyA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfUkVNT1ZFX0FGVEVSX0ZJUklORyA9IDQ7CiAgLy8gVE9ETyhscm4pOiBVc2UgdGhlIF9zdGF0ZSBmaWVsZCBvbiBfQ29udHJvbGxlclN1YnNjcmlwdGlvbiB0bwogIC8vIGFsc28gc3RvcmUgdGhpcyBzdGF0ZS4gUmVxdWlyZXMgdGhhdCB0aGUgc3Vic2NyaXB0aW9uIGltcGxlbWVudGF0aW9uCiAgLy8gZG9lcyBub3QgYXNzdW1lIHRoYXQgaXQncyB1c2Ugb2YgdGhlIHN0YXRlIGludGVnZXIgaXMgdGhlIG9ubHkgdXNlLgogIGludCBfZXZlbnRTdGF0ZSA9IDA7IC8vIEluaXRpYWxpemVkIHRvIGhlbHAgZGFydDJqcyB0eXBlIGluZmVyZW5jZS4KCiAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBfbmV4dDsKICBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IF9wcmV2aW91czsKCiAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbihfU3RyZWFtQ29udHJvbGxlckxpZmVjeWNsZTxUPiBjb250cm9sbGVyLAogICAgICB2b2lkIG9uRGF0YShUIGRhdGEpLCBGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3IpCiAgICAgIDogc3VwZXIoY29udHJvbGxlciwgb25EYXRhLCBvbkVycm9yLCBvbkRvbmUsIGNhbmNlbE9uRXJyb3IpIHsKICAgIF9uZXh0ID0gX3ByZXZpb3VzID0gdGhpczsKICB9CgogIGJvb2wgX2V4cGVjdHNFdmVudChpbnQgZXZlbnRJZCkgPT4gKF9ldmVudFN0YXRlICYgX1NUQVRFX0VWRU5UX0lEKSA9PSBldmVudElkOwoKICB2b2lkIF90b2dnbGVFdmVudElkKCkgewogICAgX2V2ZW50U3RhdGUgXj0gX1NUQVRFX0VWRU5UX0lEOwogIH0KCiAgYm9vbCBnZXQgX2lzRmlyaW5nID0+IChfZXZlbnRTdGF0ZSAmIF9TVEFURV9GSVJJTkcpICE9IDA7CgogIHZvaWQgX3NldFJlbW92ZUFmdGVyRmlyaW5nKCkgewogICAgYXNzZXJ0KF9pc0ZpcmluZyk7CiAgICBfZXZlbnRTdGF0ZSB8PSBfU1RBVEVfUkVNT1ZFX0FGVEVSX0ZJUklORzsKICB9CgogIGJvb2wgZ2V0IF9yZW1vdmVBZnRlckZpcmluZyA9PgogICAgICAoX2V2ZW50U3RhdGUgJiBfU1RBVEVfUkVNT1ZFX0FGVEVSX0ZJUklORykgIT0gMDsKCiAgLy8gVGhlIGNvbnRyb2xsZXIuX3JlY29yZFBhdXNlIGRvZXNuJ3QgZG8gYW55dGhpbmcgZm9yIGEgYnJvYWRjYXN0IGNvbnRyb2xsZXIsCiAgLy8gc28gd2UgZG9uJ3QgYm90aGVyIGNhbGxpbmcgaXQuCiAgdm9pZCBfb25QYXVzZSgpIHt9CgogIC8vIFRoZSBjb250cm9sbGVyLl9yZWNvcmRSZXN1bWUgZG9lc24ndCBkbyBhbnl0aGluZyBmb3IgYSBicm9hZGNhc3QKICAvLyBjb250cm9sbGVyLCBzbyB3ZSBkb24ndCBib3RoZXIgY2FsbGluZyBpdC4KICB2b2lkIF9vblJlc3VtZSgpIHt9CgogIC8vIF9vbkNhbmNlbCBpcyBpbmhlcml0ZWQuCn0KCmFic3RyYWN0IGNsYXNzIF9Ccm9hZGNhc3RTdHJlYW1Db250cm9sbGVyPFQ+CiAgICBpbXBsZW1lbnRzIF9TdHJlYW1Db250cm9sbGVyQmFzZTxUPiB7CiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfSU5JVElBTCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfRVZFTlRfSUQgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0ZJUklORyA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfQ0xPU0VEID0gNDsKICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9BRERTVFJFQU0gPSA4OwoKICBDb250cm9sbGVyQ2FsbGJhY2sgb25MaXN0ZW47CiAgQ29udHJvbGxlckNhbmNlbENhbGxiYWNrIG9uQ2FuY2VsOwoKICAvLyBTdGF0ZSBvZiB0aGUgY29udHJvbGxlci4KICBpbnQgX3N0YXRlOwoKICAvLyBEb3VibGUtbGlua2VkIGxpc3Qgb2YgYWN0aXZlIGxpc3RlbmVycy4KICBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IF9maXJzdFN1YnNjcmlwdGlvbjsKICBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IF9sYXN0U3Vic2NyaXB0aW9uOwoKICAvLyBFeHRyYSBzdGF0ZSB1c2VkIGR1cmluZyBhbiBbYWRkU3RyZWFtXSBjYWxsLgogIF9BZGRTdHJlYW1TdGF0ZTxUPiBfYWRkU3RyZWFtU3RhdGU7CgogIC8qKgogICAqIEZ1dHVyZSByZXR1cm5lZCBieSBbY2xvc2VdIGFuZCBbZG9uZV0uCiAgICoKICAgKiBUaGUgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aGVuZXZlciB0aGUgZG9uZSBldmVudCBoYXMgYmVlbiBzZW50IHRvIGFsbAogICAqIHJlbGV2YW50IGxpc3RlbmVycy4KICAgKiBUaGUgcmVsZXZhbnQgbGlzdGVuZXJzIGFyZSB0aGUgb25lcyB0aGF0IHdlcmUgbGlzdGVuaW5nIHdoZW4gW2Nsb3NlXSB3YXMKICAgKiBjYWxsZWQuIFdoZW4gYWxsIG9mIHRoZXNlIGhhdmUgYmVlbiBjYW5jZWxlZCAoc2VuZGluZyB0aGUgZG9uZSBldmVudCBtYWtlcwogICAqIHRoZW0gY2FuY2VsLCBidXQgdGhleSBjYW4gYWxzbyBiZSBjYW5jZWxlZCBiZWZvcmUgc2VuZGluZyB0aGUgZXZlbnQpLAogICAqIHRoaXMgZnV0dXJlIGNvbXBsZXRlcy4KICAgKgogICAqIEFueSBhdHRlbXB0IHRvIGxpc3RlbiBhZnRlciBjYWxsaW5nIFtjbG9zZV0gd2lsbCB0aHJvdywgc28gdGhlcmUgd29uJ3QKICAgKiBiZSBhbnkgZnVydGhlciBsaXN0ZW5lcnMuCiAgICovCiAgX0Z1dHVyZSBfZG9uZUZ1dHVyZTsKCiAgX0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXIodGhpcy5vbkxpc3RlbiwgdGhpcy5vbkNhbmNlbCkKICAgICAgOiBfc3RhdGUgPSBfU1RBVEVfSU5JVElBTDsKCiAgQ29udHJvbGxlckNhbGxiYWNrIGdldCBvblBhdXNlIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJCcm9hZGNhc3Qgc3RyZWFtIGNvbnRyb2xsZXJzIGRvIG5vdCBzdXBwb3J0IHBhdXNlIGNhbGxiYWNrcyIpOwogIH0KCiAgdm9pZCBzZXQgb25QYXVzZSh2b2lkIG9uUGF1c2VIYW5kbGVyKCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJCcm9hZGNhc3Qgc3RyZWFtIGNvbnRyb2xsZXJzIGRvIG5vdCBzdXBwb3J0IHBhdXNlIGNhbGxiYWNrcyIpOwogIH0KCiAgQ29udHJvbGxlckNhbGxiYWNrIGdldCBvblJlc3VtZSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQnJvYWRjYXN0IHN0cmVhbSBjb250cm9sbGVycyBkbyBub3Qgc3VwcG9ydCBwYXVzZSBjYWxsYmFja3MiKTsKICB9CgogIHZvaWQgc2V0IG9uUmVzdW1lKHZvaWQgb25SZXN1bWVIYW5kbGVyKCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJCcm9hZGNhc3Qgc3RyZWFtIGNvbnRyb2xsZXJzIGRvIG5vdCBzdXBwb3J0IHBhdXNlIGNhbGxiYWNrcyIpOwogIH0KCiAgLy8gU3RyZWFtQ29udHJvbGxlciBpbnRlcmZhY2UuCgogIFN0cmVhbTxUPiBnZXQgc3RyZWFtID0+IG5ldyBfQnJvYWRjYXN0U3RyZWFtPFQ+KHRoaXMpOwoKICBTdHJlYW1TaW5rPFQ+IGdldCBzaW5rID0+IG5ldyBfU3RyZWFtU2lua1dyYXBwZXI8VD4odGhpcyk7CgogIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IChfc3RhdGUgJiBfU1RBVEVfQ0xPU0VEKSAhPSAwOwoKICAvKioKICAgKiBBIGJyb2FkY2FzdCBjb250cm9sbGVyIGlzIG5ldmVyIHBhdXNlZC4KICAgKgogICAqIEVhY2ggcmVjZWl2aW5nIHN0cmVhbSBtYXkgYmUgcGF1c2VkIGluZGl2aWR1YWxseSwgYW5kIHRoZXkgaGFuZGxlIHRoZWlyCiAgICogb3duIGJ1ZmZlcmluZy4KICAgKi8KICBib29sIGdldCBpc1BhdXNlZCA9PiBmYWxzZTsKCiAgLyoqIFdoZXRoZXIgdGhlcmUgYXJlIGN1cnJlbnRseSBvbmUgb3IgbW9yZSBzdWJzY3JpYmVycy4gKi8KICBib29sIGdldCBoYXNMaXN0ZW5lciA9PiAhX2lzRW1wdHk7CgogIC8qKgogICAqIFRlc3Qgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBleGFjdGx5IG9uZSBsaXN0ZW5lci4KICAgKgogICAqIEFzc3VtZXMgdGhhdCB0aGUgc3RyZWFtIGhhcyBhIGxpc3RlbmVyIChub3QgW19pc0VtcHR5XSkuCiAgICovCiAgYm9vbCBnZXQgX2hhc09uZUxpc3RlbmVyIHsKICAgIGFzc2VydCghX2lzRW1wdHkpOwogICAgcmV0dXJuIGlkZW50aWNhbChfZmlyc3RTdWJzY3JpcHRpb24sIF9sYXN0U3Vic2NyaXB0aW9uKTsKICB9CgogIC8qKiBXaGV0aGVyIGFuIGV2ZW50IGlzIGJlaW5nIGZpcmVkIChzZW50IHRvIHNvbWUsIGJ1dCBub3QgYWxsLCBsaXN0ZW5lcnMpLiAqLwogIGJvb2wgZ2V0IF9pc0ZpcmluZyA9PiAoX3N0YXRlICYgX1NUQVRFX0ZJUklORykgIT0gMDsKCiAgYm9vbCBnZXQgX2lzQWRkaW5nU3RyZWFtID0+IChfc3RhdGUgJiBfU1RBVEVfQUREU1RSRUFNKSAhPSAwOwoKICBib29sIGdldCBfbWF5QWRkRXZlbnQgPT4gKF9zdGF0ZSA8IF9TVEFURV9DTE9TRUQpOwoKICBfRnV0dXJlIF9lbnN1cmVEb25lRnV0dXJlKCkgewogICAgaWYgKF9kb25lRnV0dXJlICE9IG51bGwpIHJldHVybiBfZG9uZUZ1dHVyZTsKICAgIHJldHVybiBfZG9uZUZ1dHVyZSA9IG5ldyBfRnV0dXJlKCk7CiAgfQoKICAvLyBMaW5rZWQgbGlzdCBoZWxwZXJzCgogIGJvb2wgZ2V0IF9pc0VtcHR5ID0+IF9maXJzdFN1YnNjcmlwdGlvbiA9PSBudWxsOwoKICAvKiogQWRkcyBzdWJzY3JpcHRpb24gdG8gbGlua2VkIGxpc3Qgb2YgYWN0aXZlIGxpc3RlbmVycy4gKi8KICB2b2lkIF9hZGRMaXN0ZW5lcihfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbikgewogICAgYXNzZXJ0KGlkZW50aWNhbChzdWJzY3JpcHRpb24uX25leHQsIHN1YnNjcmlwdGlvbikpOwogICAgc3Vic2NyaXB0aW9uLl9ldmVudFN0YXRlID0gKF9zdGF0ZSAmIF9TVEFURV9FVkVOVF9JRCk7CiAgICAvLyBJbnNlcnQgaW4gbGlua2VkIGxpc3QgYXMgbGFzdCBzdWJzY3JpcHRpb24uCiAgICBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IG9sZExhc3QgPSBfbGFzdFN1YnNjcmlwdGlvbjsKICAgIF9sYXN0U3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uOwogICAgc3Vic2NyaXB0aW9uLl9uZXh0ID0gbnVsbDsKICAgIHN1YnNjcmlwdGlvbi5fcHJldmlvdXMgPSBvbGRMYXN0OwogICAgaWYgKG9sZExhc3QgPT0gbnVsbCkgewogICAgICBfZmlyc3RTdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb247CiAgICB9IGVsc2UgewogICAgICBvbGRMYXN0Ll9uZXh0ID0gc3Vic2NyaXB0aW9uOwogICAgfQogIH0KCiAgdm9pZCBfcmVtb3ZlTGlzdGVuZXIoX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pIHsKICAgIGFzc2VydChpZGVudGljYWwoc3Vic2NyaXB0aW9uLl9jb250cm9sbGVyLCB0aGlzKSk7CiAgICBhc3NlcnQoIWlkZW50aWNhbChzdWJzY3JpcHRpb24uX25leHQsIHN1YnNjcmlwdGlvbikpOwogICAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBwcmV2aW91cyA9IHN1YnNjcmlwdGlvbi5fcHJldmlvdXM7CiAgICBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IG5leHQgPSBzdWJzY3JpcHRpb24uX25leHQ7CiAgICBpZiAocHJldmlvdXMgPT0gbnVsbCkgewogICAgICAvLyBUaGlzIHdhcyB0aGUgZmlyc3Qgc3Vic2NyaXB0aW9uLgogICAgICBfZmlyc3RTdWJzY3JpcHRpb24gPSBuZXh0OwogICAgfSBlbHNlIHsKICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0OwogICAgfQogICAgaWYgKG5leHQgPT0gbnVsbCkgewogICAgICAvLyBUaGlzIHdhcyB0aGUgbGFzdCBzdWJzY3JpcHRpb24uCiAgICAgIF9sYXN0U3Vic2NyaXB0aW9uID0gcHJldmlvdXM7CiAgICB9IGVsc2UgewogICAgICBuZXh0Ll9wcmV2aW91cyA9IHByZXZpb3VzOwogICAgfQoKICAgIHN1YnNjcmlwdGlvbi5fbmV4dCA9IHN1YnNjcmlwdGlvbi5fcHJldmlvdXMgPSBzdWJzY3JpcHRpb247CiAgfQoKICAvLyBfU3RyZWFtQ29udHJvbGxlckxpZmVjeWNsZSBpbnRlcmZhY2UuCgogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBfc3Vic2NyaWJlKHZvaWQgb25EYXRhKFQgZGF0YSksIEZ1bmN0aW9uIG9uRXJyb3IsCiAgICAgIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcikgewogICAgaWYgKGlzQ2xvc2VkKSB7CiAgICAgIG9uRG9uZSA/Pz0gX251bGxEb25lSGFuZGxlcjsKICAgICAgcmV0dXJuIG5ldyBfRG9uZVN0cmVhbVN1YnNjcmlwdGlvbjxUPihvbkRvbmUpOwogICAgfQogICAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9IG5ldyBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+KAogICAgICAgIHRoaXMsIG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKTsKICAgIF9hZGRMaXN0ZW5lcihzdWJzY3JpcHRpb24pOwogICAgaWYgKGlkZW50aWNhbChfZmlyc3RTdWJzY3JpcHRpb24sIF9sYXN0U3Vic2NyaXB0aW9uKSkgewogICAgICAvLyBPbmx5IG9uZSBsaXN0ZW5lciwgc28gaXQgbXVzdCBiZSB0aGUgZmlyc3QgbGlzdGVuZXIuCiAgICAgIF9ydW5HdWFyZGVkKG9uTGlzdGVuKTsKICAgIH0KICAgIHJldHVybiBzdWJzY3JpcHRpb247CiAgfQoKICBGdXR1cmUgX3JlY29yZENhbmNlbChTdHJlYW1TdWJzY3JpcHRpb248VD4gc3ViKSB7CiAgICBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9IHN1YjsKICAgIC8vIElmIGFscmVhZHkgcmVtb3ZlZCBieSB0aGUgc3RyZWFtLCBkb24ndCByZW1vdmUgaXQgYWdhaW4uCiAgICBpZiAoaWRlbnRpY2FsKHN1YnNjcmlwdGlvbi5fbmV4dCwgc3Vic2NyaXB0aW9uKSkgcmV0dXJuIG51bGw7CiAgICBpZiAoc3Vic2NyaXB0aW9uLl9pc0ZpcmluZykgewogICAgICBzdWJzY3JpcHRpb24uX3NldFJlbW92ZUFmdGVyRmlyaW5nKCk7CiAgICB9IGVsc2UgewogICAgICBfcmVtb3ZlTGlzdGVuZXIoc3Vic2NyaXB0aW9uKTsKICAgICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBmaXJpbmcgYW4gZXZlbnQsIHRoZSBlbXB0eS1jaGVjayBpcyBwZXJmb3JtZWQgYXQKICAgICAgLy8gdGhlIGVuZCBvZiB0aGUgbGlzdGVuZXIgbG9vcCBpbnN0ZWFkIG9mIGhlcmUuCiAgICAgIGlmICghX2lzRmlyaW5nICYmIF9pc0VtcHR5KSB7CiAgICAgICAgX2NhbGxPbkNhbmNlbCgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgX3JlY29yZFBhdXNlKFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pIHt9CiAgdm9pZCBfcmVjb3JkUmVzdW1lKFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pIHt9CgogIC8vIEV2ZW50U2luayBpbnRlcmZhY2UuCgogIEVycm9yIF9hZGRFdmVudEVycm9yKCkgewogICAgaWYgKGlzQ2xvc2VkKSB7CiAgICAgIHJldHVybiBuZXcgU3RhdGVFcnJvcigiQ2Fubm90IGFkZCBuZXcgZXZlbnRzIGFmdGVyIGNhbGxpbmcgY2xvc2UiKTsKICAgIH0KICAgIGFzc2VydChfaXNBZGRpbmdTdHJlYW0pOwogICAgcmV0dXJuIG5ldyBTdGF0ZUVycm9yKCJDYW5ub3QgYWRkIG5ldyBldmVudHMgd2hpbGUgZG9pbmcgYW4gYWRkU3RyZWFtIik7CiAgfQoKICB2b2lkIGFkZChUIGRhdGEpIHsKICAgIGlmICghX21heUFkZEV2ZW50KSB0aHJvdyBfYWRkRXZlbnRFcnJvcigpOwogICAgX3NlbmREYXRhKGRhdGEpOwogIH0KCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBlcnJvciA9IF9ub25OdWxsRXJyb3IoZXJyb3IpOwogICAgaWYgKCFfbWF5QWRkRXZlbnQpIHRocm93IF9hZGRFdmVudEVycm9yKCk7CiAgICBBc3luY0Vycm9yIHJlcGxhY2VtZW50ID0gWm9uZS5jdXJyZW50LmVycm9yQ2FsbGJhY2soZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgICAgZXJyb3IgPSBfbm9uTnVsbEVycm9yKHJlcGxhY2VtZW50LmVycm9yKTsKICAgICAgc3RhY2tUcmFjZSA9IHJlcGxhY2VtZW50LnN0YWNrVHJhY2U7CiAgICB9CiAgICBfc2VuZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIEZ1dHVyZSBjbG9zZSgpIHsKICAgIGlmIChpc0Nsb3NlZCkgewogICAgICBhc3NlcnQoX2RvbmVGdXR1cmUgIT0gbnVsbCk7CiAgICAgIHJldHVybiBfZG9uZUZ1dHVyZTsKICAgIH0KICAgIGlmICghX21heUFkZEV2ZW50KSB0aHJvdyBfYWRkRXZlbnRFcnJvcigpOwogICAgX3N0YXRlIHw9IF9TVEFURV9DTE9TRUQ7CiAgICBGdXR1cmUgZG9uZUZ1dHVyZSA9IF9lbnN1cmVEb25lRnV0dXJlKCk7CiAgICBfc2VuZERvbmUoKTsKICAgIHJldHVybiBkb25lRnV0dXJlOwogIH0KCiAgRnV0dXJlIGdldCBkb25lID0+IF9lbnN1cmVEb25lRnV0dXJlKCk7CgogIEZ1dHVyZSBhZGRTdHJlYW0oU3RyZWFtPFQ+IHN0cmVhbSwge2Jvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIGlmICghX21heUFkZEV2ZW50KSB0aHJvdyBfYWRkRXZlbnRFcnJvcigpOwogICAgX3N0YXRlIHw9IF9TVEFURV9BRERTVFJFQU07CiAgICBfYWRkU3RyZWFtU3RhdGUgPSBuZXcgX0FkZFN0cmVhbVN0YXRlKHRoaXMsIHN0cmVhbSwgY2FuY2VsT25FcnJvciA/PyBmYWxzZSk7CiAgICByZXR1cm4gX2FkZFN0cmVhbVN0YXRlLmFkZFN0cmVhbUZ1dHVyZTsKICB9CgogIC8vIF9FdmVudFNpbmsgaW50ZXJmYWNlLCBjYWxsZWQgZnJvbSBBZGRTdHJlYW1TdGF0ZS4KICB2b2lkIF9hZGQoVCBkYXRhKSB7CiAgICBfc2VuZERhdGEoZGF0YSk7CiAgfQoKICB2b2lkIF9hZGRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgX3NlbmRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICB2b2lkIF9jbG9zZSgpIHsKICAgIGFzc2VydChfaXNBZGRpbmdTdHJlYW0pOwogICAgX0FkZFN0cmVhbVN0YXRlIGFkZFN0YXRlID0gX2FkZFN0cmVhbVN0YXRlOwogICAgX2FkZFN0cmVhbVN0YXRlID0gbnVsbDsKICAgIF9zdGF0ZSAmPSB+X1NUQVRFX0FERFNUUkVBTTsKICAgIGFkZFN0YXRlLmNvbXBsZXRlKCk7CiAgfQoKICAvLyBFdmVudCBoYW5kbGluZy4KICB2b2lkIF9mb3JFYWNoTGlzdGVuZXIoCiAgICAgIHZvaWQgYWN0aW9uKF9CdWZmZXJpbmdTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSkgewogICAgaWYgKF9pc0ZpcmluZykgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICJDYW5ub3QgZmlyZSBuZXcgZXZlbnQuIENvbnRyb2xsZXIgaXMgYWxyZWFkeSBmaXJpbmcgYW4gZXZlbnQiKTsKICAgIH0KICAgIGlmIChfaXNFbXB0eSkgcmV0dXJuOwoKICAgIC8vIEdldCBldmVudCBpZCBvZiB0aGlzIGV2ZW50LgogICAgaW50IGlkID0gKF9zdGF0ZSAmIF9TVEFURV9FVkVOVF9JRCk7CiAgICAvLyBTdGFydCBmaXJpbmcgKHNldCB0aGUgX1NUQVRFX0ZJUklORyBiaXQpLiBXZSBkb24ndCBkbyBbb25DYW5jZWxdCiAgICAvLyBjYWxsYmFja3Mgd2hpbGUgZmlyaW5nLCBhbmQgd2UgcHJldmVudCByZWVudHJhbmN5IG9mIHRoaXMgZnVuY3Rpb24uCiAgICAvLwogICAgLy8gU2V0IFtfc3RhdGVdJ3MgZXZlbnQgaWQgdG8gdGhlIG5leHQgZXZlbnQncyBpZC4KICAgIC8vIEFueSBsaXN0ZW5lcnMgYWRkZWQgd2hpbGUgZmlyaW5nIHRoaXMgZXZlbnQgd2lsbCBleHBlY3QgdGhlIG5leHQgZXZlbnQsCiAgICAvLyBub3QgdGhpcyBvbmUsIGFuZCB3b24ndCBnZXQgbm90aWZpZWQuCiAgICBfc3RhdGUgXj0gX1NUQVRFX0VWRU5UX0lEIHwgX1NUQVRFX0ZJUklORzsKICAgIF9Ccm9hZGNhc3RTdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0gX2ZpcnN0U3Vic2NyaXB0aW9uOwogICAgd2hpbGUgKHN1YnNjcmlwdGlvbiAhPSBudWxsKSB7CiAgICAgIGlmIChzdWJzY3JpcHRpb24uX2V4cGVjdHNFdmVudChpZCkpIHsKICAgICAgICBzdWJzY3JpcHRpb24uX2V2ZW50U3RhdGUgfD0gX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbi5fU1RBVEVfRklSSU5HOwogICAgICAgIGFjdGlvbihzdWJzY3JpcHRpb24pOwogICAgICAgIHN1YnNjcmlwdGlvbi5fdG9nZ2xlRXZlbnRJZCgpOwogICAgICAgIF9Ccm9hZGNhc3RTdWJzY3JpcHRpb248VD4gbmV4dCA9IHN1YnNjcmlwdGlvbi5fbmV4dDsKICAgICAgICBpZiAoc3Vic2NyaXB0aW9uLl9yZW1vdmVBZnRlckZpcmluZykgewogICAgICAgICAgX3JlbW92ZUxpc3RlbmVyKHN1YnNjcmlwdGlvbik7CiAgICAgICAgfQogICAgICAgIHN1YnNjcmlwdGlvbi5fZXZlbnRTdGF0ZSAmPSB+X0Jyb2FkY2FzdFN1YnNjcmlwdGlvbi5fU1RBVEVfRklSSU5HOwogICAgICAgIHN1YnNjcmlwdGlvbiA9IG5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uLl9uZXh0OwogICAgICB9CiAgICB9CiAgICBfc3RhdGUgJj0gfl9TVEFURV9GSVJJTkc7CgogICAgaWYgKF9pc0VtcHR5KSB7CiAgICAgIF9jYWxsT25DYW5jZWwoKTsKICAgIH0KICB9CgogIHZvaWQgX2NhbGxPbkNhbmNlbCgpIHsKICAgIGFzc2VydChfaXNFbXB0eSk7CiAgICBpZiAoaXNDbG9zZWQgJiYgX2RvbmVGdXR1cmUuX21heUNvbXBsZXRlKSB7CiAgICAgIC8vIFdoZW4gY2xvc2VkLCBfZG9uZUZ1dHVyZSBpcyBub3QgbnVsbC4KICAgICAgX2RvbmVGdXR1cmUuX2FzeW5jQ29tcGxldGUobnVsbCk7CiAgICB9CiAgICBfcnVuR3VhcmRlZChvbkNhbmNlbCk7CiAgfQp9CgpjbGFzcyBfU3luY0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXI8VD4gZXh0ZW5kcyBfQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcjxUPgogICAgaW1wbGVtZW50cyBTeW5jaHJvbm91c1N0cmVhbUNvbnRyb2xsZXI8VD4gewogIF9TeW5jQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcih2b2lkIG9uTGlzdGVuKCksIHZvaWQgb25DYW5jZWwoKSkKICAgICAgOiBzdXBlcihvbkxpc3Rlbiwgb25DYW5jZWwpOwoKICAvLyBFdmVudERpc3BhdGNoIGludGVyZmFjZS4KCiAgYm9vbCBnZXQgX21heUFkZEV2ZW50ID0+IHN1cGVyLl9tYXlBZGRFdmVudCAmJiAhX2lzRmlyaW5nOwoKICBfYWRkRXZlbnRFcnJvcigpIHsKICAgIGlmIChfaXNGaXJpbmcpIHsKICAgICAgcmV0dXJuIG5ldyBTdGF0ZUVycm9yKAogICAgICAgICAgIkNhbm5vdCBmaXJlIG5ldyBldmVudC4gQ29udHJvbGxlciBpcyBhbHJlYWR5IGZpcmluZyBhbiBldmVudCIpOwogICAgfQogICAgcmV0dXJuIHN1cGVyLl9hZGRFdmVudEVycm9yKCk7CiAgfQoKICB2b2lkIF9zZW5kRGF0YShUIGRhdGEpIHsKICAgIGlmIChfaXNFbXB0eSkgcmV0dXJuOwogICAgaWYgKF9oYXNPbmVMaXN0ZW5lcikgewogICAgICBfc3RhdGUgfD0gX0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXIuX1NUQVRFX0ZJUklORzsKICAgICAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24gPSBfZmlyc3RTdWJzY3JpcHRpb247CiAgICAgIHN1YnNjcmlwdGlvbi5fYWRkKGRhdGEpOwogICAgICBfc3RhdGUgJj0gfl9Ccm9hZGNhc3RTdHJlYW1Db250cm9sbGVyLl9TVEFURV9GSVJJTkc7CiAgICAgIGlmIChfaXNFbXB0eSkgewogICAgICAgIF9jYWxsT25DYW5jZWwoKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBfZm9yRWFjaExpc3RlbmVyKChfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbikgewogICAgICBzdWJzY3JpcHRpb24uX2FkZChkYXRhKTsKICAgIH0pOwogIH0KCiAgdm9pZCBfc2VuZEVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBpZiAoX2lzRW1wdHkpIHJldHVybjsKICAgIF9mb3JFYWNoTGlzdGVuZXIoKF9CdWZmZXJpbmdTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSB7CiAgICAgIHN1YnNjcmlwdGlvbi5fYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgfSk7CiAgfQoKICB2b2lkIF9zZW5kRG9uZSgpIHsKICAgIGlmICghX2lzRW1wdHkpIHsKICAgICAgX2ZvckVhY2hMaXN0ZW5lcigoX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pIHsKICAgICAgICBzdWJzY3JpcHRpb24uX2Nsb3NlKCk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KF9kb25lRnV0dXJlICE9IG51bGwpOwogICAgICBhc3NlcnQoX2RvbmVGdXR1cmUuX21heUNvbXBsZXRlKTsKICAgICAgX2RvbmVGdXR1cmUuX2FzeW5jQ29tcGxldGUobnVsbCk7CiAgICB9CiAgfQp9CgpjbGFzcyBfQXN5bmNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyPFQ+IGV4dGVuZHMgX0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXI8VD4gewogIF9Bc3luY0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXIodm9pZCBvbkxpc3RlbigpLCB2b2lkIG9uQ2FuY2VsKCkpCiAgICAgIDogc3VwZXIob25MaXN0ZW4sIG9uQ2FuY2VsKTsKCiAgLy8gRXZlbnREaXNwYXRjaCBpbnRlcmZhY2UuCgogIHZvaWQgX3NlbmREYXRhKFQgZGF0YSkgewogICAgZm9yIChfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9IF9maXJzdFN1YnNjcmlwdGlvbjsKICAgICAgICBzdWJzY3JpcHRpb24gIT0gbnVsbDsKICAgICAgICBzdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb24uX25leHQpIHsKICAgICAgc3Vic2NyaXB0aW9uLl9hZGRQZW5kaW5nKG5ldyBfRGVsYXllZERhdGE8VD4oZGF0YSkpOwogICAgfQogIH0KCiAgdm9pZCBfc2VuZEVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBmb3IgKF9Ccm9hZGNhc3RTdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0gX2ZpcnN0U3Vic2NyaXB0aW9uOwogICAgICAgIHN1YnNjcmlwdGlvbiAhPSBudWxsOwogICAgICAgIHN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbi5fbmV4dCkgewogICAgICBzdWJzY3JpcHRpb24uX2FkZFBlbmRpbmcobmV3IF9EZWxheWVkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpKTsKICAgIH0KICB9CgogIHZvaWQgX3NlbmREb25lKCkgewogICAgaWYgKCFfaXNFbXB0eSkgewogICAgICBmb3IgKF9Ccm9hZGNhc3RTdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0gX2ZpcnN0U3Vic2NyaXB0aW9uOwogICAgICAgICAgc3Vic2NyaXB0aW9uICE9IG51bGw7CiAgICAgICAgICBzdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb24uX25leHQpIHsKICAgICAgICBzdWJzY3JpcHRpb24uX2FkZFBlbmRpbmcoY29uc3QgX0RlbGF5ZWREb25lKCkpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoX2RvbmVGdXR1cmUgIT0gbnVsbCk7CiAgICAgIGFzc2VydChfZG9uZUZ1dHVyZS5fbWF5Q29tcGxldGUpOwogICAgICBfZG9uZUZ1dHVyZS5fYXN5bmNDb21wbGV0ZShudWxsKTsKICAgIH0KICB9Cn0KCi8qKgogKiBTdHJlYW0gY29udHJvbGxlciB0aGF0IGlzIHVzZWQgYnkgW1N0cmVhbS5hc0Jyb2FkY2FzdFN0cmVhbV0uCiAqCiAqIFRoaXMgc3RyZWFtIGNvbnRyb2xsZXIgYWxsb3dzIGluY29taW5nIGV2ZW50cyB3aGlsZSBpdCBpcyBmaXJpbmcKICogb3RoZXIgZXZlbnRzLiBUaGlzIGlzIGhhbmRsZWQgYnkgZGVsYXlpbmcgdGhlIGV2ZW50cyB1bnRpbCB0aGUKICogY3VycmVudCBldmVudCBpcyBkb25lIGZpcmluZywgYW5kIHRoZW4gZmlyZSB0aGUgcGVuZGluZyBldmVudHMuCiAqCiAqIFRoaXMgY2xhc3MgZXh0ZW5kcyBbX1N5bmNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyXS4gRXZlbnRzIG9mCiAqIGFuICJhc0Jyb2FkY2FzdFN0cmVhbSIgc3RyZWFtIGFyZSBhbHdheXMgaW5pdGlhdGVkIGJ5IGV2ZW50cwogKiBvbiBhbm90aGVyIHN0cmVhbSwgYW5kIGl0IGlzIGZpbmUgdG8gZm9yd2FyZCB0aGVtIHN5bmNocm9ub3VzbHkuCiAqLwpjbGFzcyBfQXNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyPFQ+IGV4dGVuZHMgX1N5bmNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyPFQ+CiAgICBpbXBsZW1lbnRzIF9FdmVudERpc3BhdGNoPFQ+IHsKICBfU3RyZWFtSW1wbEV2ZW50czxUPiBfcGVuZGluZzsKCiAgX0FzQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcih2b2lkIG9uTGlzdGVuKCksIHZvaWQgb25DYW5jZWwoKSkKICAgICAgOiBzdXBlcihvbkxpc3Rlbiwgb25DYW5jZWwpOwoKICBib29sIGdldCBfaGFzUGVuZGluZyA9PiBfcGVuZGluZyAhPSBudWxsICYmICFfcGVuZGluZy5pc0VtcHR5OwoKICB2b2lkIF9hZGRQZW5kaW5nRXZlbnQoX0RlbGF5ZWRFdmVudCBldmVudCkgewogICAgX3BlbmRpbmcgPz89IG5ldyBfU3RyZWFtSW1wbEV2ZW50czxUPigpOwogICAgX3BlbmRpbmcuYWRkKGV2ZW50KTsKICB9CgogIHZvaWQgYWRkKFQgZGF0YSkgewogICAgaWYgKCFpc0Nsb3NlZCAmJiBfaXNGaXJpbmcpIHsKICAgICAgX2FkZFBlbmRpbmdFdmVudChuZXcgX0RlbGF5ZWREYXRhPFQ+KGRhdGEpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3VwZXIuYWRkKGRhdGEpOwogICAgd2hpbGUgKF9oYXNQZW5kaW5nKSB7CiAgICAgIF9wZW5kaW5nLmhhbmRsZU5leHQodGhpcyk7CiAgICB9CiAgfQoKICB2b2lkIGFkZEVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJh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cmluZyB1cmk7CgogIGNvbnN0IERlZmVycmVkTGlicmFyeSh0aGlzLmxpYnJhcnlOYW1lLCB7dGhpcy51cml9KTsKCiAgLyoqCiAgICogRW5zdXJlIHRoYXQgW2xpYnJhcnlOYW1lXSBoYXMgYmVlbiBsb2FkZWQuCiAgICoKICAgKiBJZiB0aGUgbGlicmFyeSBmYWlscyB0byBsb2FkLCB0aGUgRnV0dXJlIHdpbGwgY29tcGxldGUgd2l0aCBhCiAgICogRGVmZXJyZWRMb2FkRXhjZXB0aW9uLgogICAqLwogIGV4dGVybmFsIEZ1dHVyZTxOdWxsPiBsb2FkKCk7Cn0KCi8qKgogKiBUaHJvd24gd2hlbiBhIGRlZmVycmVkIGxpYnJhcnkgZmFpbHMgdG8gbG9hZC4KICovCmNsYXNzIERlZmVycmVkTG9hZEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbiB7CiAgRGVmZXJyZWRMb2FkRXhjZXB0aW9uKHRoaXMuX3MpOwogIFN0cmluZyB0b1N0cmluZygpID0+ICJEZWZlcnJlZExvYWRFeGNlcHRpb246ICckX3MnIjsKICBmaW5hbCBTdHJpbmcgX3M7Cn0KJgBOTjwBFAEEOAMzLQQfGBwUATcBBjAFQxwGIAIBBDEEMyI3EwIBHWRhcnQ6YXN5bmMvZGVmZXJyZWRfbG9hZC5kYXJ0OG9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvZGVmZXJyZWRfbG9hZF9wYXRjaC5kYXJ0gkIvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiYXN5bmNfcGF0Y2guZGFydCI7CgpmaW5hbCBTZXQ8U3RyaW5nPiBfbG9hZGVkTGlicmFyaWVzID0gbmV3IFNldDxTdHJpbmc+KCk7CgpAcGF0Y2gKY2xhc3MgRGVmZXJyZWRMaWJyYXJ5IHsKICBAcGF0Y2gKICBGdXR1cmU8TnVsbD4gbG9hZCgpIHsKICAgIC8vIER1bW15IGltcGxlbWVudGF0aW9uIHRoYXQgc2hvdWxkIGV2ZW50dWFsbHkgYmUgcmVwbGFjZWQgYnkgcmVhbAogICAgLy8gaW1wbGVtZW50YXRpb24uCiAgICBGdXR1cmUgZnV0dXJlID0gbmV3IEZ1dHVyZTxOdWxsPi52YWx1ZShudWxsKTsKICAgIF9sb2FkZWRMaWJyYXJpZXMuYWRkKGxpYnJhcnlOYW1lKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQp9ChUATk48AR8BOAEHGAkYRxcyJxMEAgEpZGFydDphc3luYy1wYXRjaC9kZWZlcnJlZF9sb2FkX3BhdGNoLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2FzeW5jL2Z1dHVyZS5kYXJ0wACI5y8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuYXN5bmM7CgovLy8gQSB0eXBlIHJlcHJlc2VudGluZyB2YWx1ZXMgdGhhdCBhcmUgZWl0aGVyIGBGdXR1cmU8VD5gIG9yIGBUYC4KLy8vCi8vLyBUaGlzIGNsYXNzIGRlY2xhcmF0aW9uIGlzIGEgcHVibGljIHN0YW5kLWluIGZvciBhbiBpbnRlcm5hbAovLy8gZnV0dXJlLW9yLXZhbHVlIGdlbmVyaWMgdHlwZS4gUmVmZXJlbmNlcyB0byB0aGlzIGNsYXNzIGFyZSByZXNvbHZlZCB0byB0aGUKLy8vIGludGVybmFsIHR5cGUuCi8vLwovLy8gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgZm9yIGFueSBjbGFzcyB0byBleHRlbmQsIG1peCBpbiBvciBpbXBsZW1lbnQKLy8vIGBGdXR1cmVPcmAuCi8vLwovLy8gTm90ZTogdGhlIGBGdXR1cmVPcjxUPmAgdHlwZSBpcyBpbnRlcnByZXRlZCBhcyBgZHluYW1pY2AgaW4gbm9uIHN0cm9uZy1tb2RlLgovLy8KLy8vICMgRXhhbXBsZXMKLy8vIGBgYCBkYXJ0Ci8vLyAvLyBUaGUgYEZ1dHVyZTxUPi50aGVuYCBmdW5jdGlvbiB0YWtlcyBhIGNhbGxiYWNrIFtmXSB0aGF0IHJldHVybnMgZWl0aGVyCi8vLyAvLyBhbiBgU2Agb3IgYSBgRnV0dXJlPFM+YC4KLy8vIEZ1dHVyZTxTPiB0aGVuPFM+KEZ1dHVyZU9yPFM+IGYoVCB4KSwgLi4uKTsKLy8vCi8vLyAvLyBgQ29tcGxldGVyPFQ+LmNvbXBsZXRlYCB0YWtlcyBlaXRoZXIgYSBgVGAgb3IgYEZ1dHVyZTxUPmAuCi8vLyB2b2lkIGNvbXBsZXRlKEZ1dHVyZU9yPFQ+IHZhbHVlKTsKLy8vIGBgYAovLy8KLy8vICMgQWR2YW5jZWQKLy8vIFRoZSBgRnV0dXJlT3I8aW50PmAgdHlwZSBpcyBhY3R1YWxseSB0aGUgInR5cGUgdW5pb24iIG9mIHRoZSB0eXBlcyBgaW50YCBhbmQKLy8vIGBGdXR1cmU8aW50PmAuIFRoaXMgdHlwZSB1bmlvbiBpcyBkZWZpbmVkIGluIHN1Y2ggYSB3YXkgdGhhdAovLy8gYEZ1dHVyZU9yPE9iamVjdD5gIGlzIGJvdGggYSBzdXBlci0gYW5kIHN1Yi10eXBlIG9mIGBPYmplY3RgIChzdWItdHlwZQovLy8gYmVjYXVzZSBgT2JqZWN0YCBpcyBvbmUgb2YgdGhlIHR5cGVzIG9mIHRoZSB1bmlvbiwgc3VwZXItdHlwZSBiZWNhdXNlCi8vLyBgT2JqZWN0YCBpcyBhIHN1cGVyLXR5cGUgb2YgYm90aCBvZiB0aGUgdHlwZXMgb2YgdGhlIHVuaW9uKS4gVG9nZXRoZXIgaXQKLy8vIG1lYW5zIHRoYXQgYEZ1dHVyZU9yPE9iamVjdD5gIGlzIGVxdWl2YWxlbnQgdG8gYE9iamVjdGAuCi8vLwovLy8gQXMgYSBjb3JvbGxhcnksIGBGdXR1cmVPcjxPYmplY3Q+YCBpcyBlcXVpdmFsZW50IHRvCi8vLyBgRnV0dXJlT3I8RnV0dXJlT3I8T2JqZWN0Pj5gLCBgRnV0dXJlT3I8RnV0dXJlPE9iamVjdD4+YCBpcyBlcXVpdmFsZW50IHRvCi8vLyBgRnV0dXJlPE9iamVjdD5gLgphYnN0cmFjdCBjbGFzcyBGdXR1cmVPcjxUPiB7CiAgLy8gUHJpdmF0ZSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yLCBzbyB0aGF0IGl0IGlzIG5vdCBzdWJjbGFzc2FibGUsIG1peGFibGUsIG9yCiAgLy8gaW5zdGFudGlhYmxlLgogIEZ1dHVyZU9yLl8oKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiRnV0dXJlT3IgY2FuJ3QgYmUgaW5zdGFudGlhdGVkIik7CiAgfQp9CgovKioKICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGRlbGF5ZWQgY29tcHV0YXRpb24uCiAqCiAqIEEgW0Z1dHVyZV0gaXMgdXNlZCB0byByZXByZXNlbnQgYSBwb3RlbnRpYWwgdmFsdWUsIG9yIGVycm9yLAogKiB0aGF0IHdpbGwgYmUgYXZhaWxhYmxlIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLgogKiBSZWNlaXZlcnMgb2YgYSBbRnV0dXJlXSBjYW4gcmVnaXN0ZXIgY2FsbGJhY2tzCiAqIHRoYXQgaGFuZGxlIHRoZSB2YWx1ZSBvciBlcnJvciBvbmNlIGl0IGlzIGF2YWlsYWJsZS4KICogRm9yIGV4YW1wbGU6CiAqCiAqICAgICBGdXR1cmU8aW50PiBmdXR1cmUgPSBnZXRGdXR1cmUoKTsKICogICAgIGZ1dHVyZS50aGVuKCh2YWx1ZSkgPT4gaGFuZGxlVmFsdWUodmFsdWUpKQogKiAgICAgICAgICAgLmNhdGNoRXJyb3IoKGVycm9yKSA9PiBoYW5kbGVFcnJvcihlcnJvcikpOwogKgogKiBBIFtGdXR1cmVdIGNhbiBiZSBjb21wbGV0ZWQgaW4gdHdvIHdheXM6CiAqIHdpdGggYSB2YWx1ZSAoInRoZSBmdXR1cmUgc3VjY2VlZHMiKQogKiBvciB3aXRoIGFuIGVycm9yICgidGhlIGZ1dHVyZSBmYWlscyIpLgogKiBVc2VycyBjYW4gaW5zdGFsbCBjYWxsYmFja3MgZm9yIGVhY2ggY2FzZS4KICoKICogSW4gc29tZSBjYXNlcyB3ZSBzYXkgdGhhdCBhIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCBhbm90aGVyIGZ1dHVyZS4KICogVGhpcyBpcyBhIHNob3J0IHdheSBvZiBzdGF0aW5nIHRoYXQgdGhlIGZ1dHVyZSBpcyBjb21wbGV0ZWQgaW4gdGhlIHNhbWUgd2F5LAogKiB3aXRoIHRoZSBzYW1lIHZhbHVlIG9yIGVycm9yLAogKiBhcyB0aGUgb3RoZXIgZnV0dXJlIG9uY2UgdGhhdCBjb21wbGV0ZXMuCiAqIFdoZW5ldmVyIGEgZnVuY3Rpb24gaW4gdGhlIGNvcmUgbGlicmFyeSBtYXkgY29tcGxldGUgYSBmdXR1cmUKICogKGZvciBleGFtcGxlIFtDb21wbGV0ZXIuY29tcGxldGVdIG9yIFtuZXcgRnV0dXJlLnZhbHVlXSksCiAqIHRoZW4gaXQgYWxzbyBhY2NlcHRzIGFub3RoZXIgZnV0dXJlIGFuZCBkb2VzIHRoaXMgd29yayBmb3IgdGhlIGRldmVsb3Blci4KICoKICogVGhlIHJlc3VsdCBvZiByZWdpc3RlcmluZyBhIHBhaXIgb2YgY2FsbGJhY2tzIGlzIGEgbmV3IEZ1dHVyZSAodGhlCiAqICJzdWNjZXNzb3IiKSB3aGljaCBpbiB0dXJuIGlzIGNvbXBsZXRlZCB3aXRoIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlCiAqIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2suCiAqIFRoZSBzdWNjZXNzb3IgaXMgY29tcGxldGVkIHdpdGggYW4gZXJyb3IgaWYgdGhlIGludm9rZWQgY2FsbGJhY2sgdGhyb3dzLgogKiBGb3IgZXhhbXBsZToKICogYGBgCiAqIEZ1dHVyZTxpbnQ+IHN1Y2Nlc3NvciA9IGZ1dHVyZS50aGVuKChpbnQgdmFsdWUpIHsKICogICAgIC8vIEludm9rZWQgd2hlbiB0aGUgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIGEgdmFsdWUuCiAqICAgICByZXR1cm4gNDI7ICAvLyBUaGUgc3VjY2Vzc29yIGlzIGNvbXBsZXRlZCB3aXRoIHRoZSB2YWx1ZSA0Mi4KICogICB9LAogKiAgIG9uRXJyb3I6IChlKSB7CiAqICAgICAvLyBJbnZva2VkIHdoZW4gdGhlIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCBhbiBlcnJvci4KICogICAgIGlmIChjYW5IYW5kbGUoZSkpIHsKICogICAgICAgcmV0dXJuIDQ5OTsgIC8vIFRoZSBzdWNjZXNzb3IgaXMgY29tcGxldGVkIHdpdGggdGhlIHZhbHVlIDQ5OS4KICogICAgIH0gZWxzZSB7CiAqICAgICAgIHRocm93IGU7ICAvLyBUaGUgc3VjY2Vzc29yIGlzIGNvbXBsZXRlZCB3aXRoIHRoZSBlcnJvciBlLgogKiAgICAgfQogKiAgIH0pOwogKiBgYGAKICoKICogSWYgYSBmdXR1cmUgZG9lcyBub3QgaGF2ZSBhIHN1Y2Nlc3NvciB3aGVuIGl0IGNvbXBsZXRlcyB3aXRoIGFuIGVycm9yLAogKiBpdCBmb3J3YXJkcyB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgZ2xvYmFsIGVycm9yLWhhbmRsZXIuCiAqIFRoaXMgYmVoYXZpb3IgbWFrZXMgc3VyZSB0aGF0IG5vIGVycm9yIGlzIHNpbGVudGx5IGRyb3BwZWQuCiAqIEhvd2V2ZXIsIGl0IGFsc28gbWVhbnMgdGhhdCBlcnJvciBoYW5kbGVycyBzaG91bGQgYmUgaW5zdGFsbGVkIGVhcmx5LAogKiBzbyB0aGF0IHRoZXkgYXJlIHByZXNlbnQgYXMgc29vbiBhcyBhIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCBhbiBlcnJvci4KICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGlzIHBvdGVudGlhbCBidWc6CiAqIGBgYAogKiB2YXIgZnV0dXJlID0gZ2V0RnV0dXJlKCk7CiAqIG5ldyBUaW1lcihuZXcgRHVyYXRpb24obWlsbGlzZWNvbmRzOiA1KSwgKCkgewogKiAgIC8vIFRoZSBlcnJvci1oYW5kbGVyIGlzIG5vdCBhdHRhY2hlZCB1bnRpbCA1IG1zIGFmdGVyIHRoZSBmdXR1cmUgaGFzCiAqICAgLy8gYmVlbiByZWNlaXZlZC4gSWYgdGhlIGZ1dHVyZSBmYWlscyBiZWZvcmUgdGhhdCwgdGhlIGVycm9yIGlzCiAqICAgLy8gZm9yd2FyZGVkIHRvIHRoZSBnbG9iYWwgZXJyb3ItaGFuZGxlciwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgY29kZQogKiAgIC8vIChqdXN0IGJlbG93KSB0byBldmVudHVhbGx5IGhhbmRsZSB0aGUgZXJyb3IuCiAqICAgZnV0dXJlLnRoZW4oKHZhbHVlKSB7IHVzZVZhbHVlKHZhbHVlKTsgfSwKICogICAgICAgICAgICAgICBvbkVycm9yOiAoZSkgeyBoYW5kbGVFcnJvcihlKTsgfSk7CiAqIH0pOwogKiBgYGAKICoKICogV2hlbiByZWdpc3RlcmluZyBjYWxsYmFja3MsIGl0J3Mgb2Z0ZW4gbW9yZSByZWFkYWJsZSB0byByZWdpc3RlciB0aGUgdHdvCiAqIGNhbGxiYWNrcyBzZXBhcmF0ZWx5LCBieSBmaXJzdCB1c2luZyBbdGhlbl0gd2l0aCBvbmUgYXJndW1lbnQKICogKHRoZSB2YWx1ZSBoYW5kbGVyKSBhbmQgdXNpbmcgYSBzZWNvbmQgW2NhdGNoRXJyb3JdIGZvciBoYW5kbGluZyBlcnJvcnMuCiAqIEVhY2ggb2YgdGhlc2Ugd2lsbCBmb3J3YXJkIHRoZSByZXN1bHQgdGhhdCB0aGV5IGRvbid0IGhhbmRsZQogKiB0byB0aGVpciBzdWNjZXNzb3JzLCBhbmQgdG9nZXRoZXIgdGhleSBoYW5kbGUgYm90aCB2YWx1ZSBhbmQgZXJyb3IgcmVzdWx0LgogKiBJdCBhbHNvIGhhcyB0aGUgYWRkaXRpb25hbCBiZW5lZml0IG9mIHRoZSBbY2F0Y2hFcnJvcl0gaGFuZGxpbmcgZXJyb3JzIGluIHRoZQogKiBbdGhlbl0gdmFsdWUgY2FsbGJhY2sgdG9vLgogKiBVc2luZyBzZXF1ZW50aWFsIGhhbmRsZXJzIGluc3RlYWQgb2YgcGFyYWxsZWwgb25lcyBvZnRlbiBsZWFkcyB0byBjb2RlIHRoYXQKICogaXMgZWFzaWVyIHRvIHJlYXNvbiBhYm91dC4KICogSXQgYWxzbyBtYWtlcyBhc3luY2hyb25vdXMgY29kZSB2ZXJ5IHNpbWlsYXIgdG8gc3luY2hyb25vdXMgY29kZToKICogYGBgCiAqIC8vIFN5bmNocm9ub3VzIGNvZGUuCiAqIHRyeSB7CiAqICAgaW50IHZhbHVlID0gZm9vKCk7CiAqICAgcmV0dXJuIGJhcih2YWx1ZSk7CiAqIH0gY2F0Y2ggKGUpIHsKICogICByZXR1cm4gNDk5OwogKiB9CiAqIGBgYAogKgogKiBFcXVpdmFsZW50IGFzeW5jaHJvbm91cyBjb2RlLCBiYXNlZCBvbiBmdXR1cmVzOgogKiBgYGAKICogRnV0dXJlPGludD4gZnV0dXJlID0gbmV3IEZ1dHVyZShmb28pOyAgLy8gUmVzdWx0IG9mIGZvbygpIGFzIGEgZnV0dXJlLgogKiBmdXR1cmUudGhlbigoaW50IHZhbHVlKSA9PiBiYXIodmFsdWUpKQogKiAgICAgICAuY2F0Y2hFcnJvcigoZSkgPT4gNDk5KTsKICogYGBgCiAqCiAqIFNpbWlsYXIgdG8gdGhlIHN5bmNocm9ub3VzIGNvZGUsIHRoZSBlcnJvciBoYW5kbGVyIChyZWdpc3RlcmVkIHdpdGgKICogW2NhdGNoRXJyb3JdKSBpcyBoYW5kbGluZyBhbnkgZXJyb3JzIHRocm93biBieSBlaXRoZXIgYGZvb2Agb3IgYGJhcmAuCiAqIElmIHRoZSBlcnJvci1oYW5kbGVyIGhhZCBiZWVuIHJlZ2lzdGVyZWQgYXMgdGhlIGBvbkVycm9yYCBwYXJhbWV0ZXIgb2YKICogdGhlIGB0aGVuYCBjYWxsLCBpdCB3b3VsZCBub3QgY2F0Y2ggZXJyb3JzIGZyb20gdGhlIGBiYXJgIGNhbGwuCiAqCiAqIEZ1dHVyZXMgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBjYWxsYmFjay1wYWlyIHJlZ2lzdGVyZWQuIEVhY2ggc3VjY2Vzc29yIGlzCiAqIHRyZWF0ZWQgaW5kZXBlbmRlbnRseSBhbmQgaXMgaGFuZGxlZCBhcyBpZiBpdCB3YXMgdGhlIG9ubHkgc3VjY2Vzc29yLgogKgogKiBBIGZ1dHVyZSBtYXkgYWxzbyBmYWlsIHRvIGV2ZXIgY29tcGxldGUuIEluIHRoYXQgY2FzZSwgbm8gY2FsbGJhY2tzIGFyZQogKiBjYWxsZWQuCiAqLwphYnN0cmFjdCBjbGFzcyBGdXR1cmU8VD4gewogIC8vLyBBIGBGdXR1cmU8TnVsbD5gIGNvbXBsZXRlZCB3aXRoIGBudWxsYC4KICBzdGF0aWMgZmluYWwgX0Z1dHVyZTxOdWxsPiBfbnVsbEZ1dHVyZSA9CiAgICAgIG5ldyBfRnV0dXJlPE51bGw+LnpvbmVWYWx1ZShudWxsLCBab25lLnJvb3QpOwoKICAvLy8gQSBgRnV0dXJlPGJvb2w+YCBjb21wbGV0ZWQgd2l0aCBgZmFsc2VgLgogIHN0YXRpYyBmaW5hbCBfRnV0dXJlPGJvb2w+IF9mYWxzZUZ1dHVyZSA9CiAgICAgIG5ldyBfRnV0dXJlPGJvb2w+LnpvbmVWYWx1ZShmYWxzZSwgWm9uZS5yb290KTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGZ1dHVyZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgY2FsbGluZyBbY29tcHV0YXRpb25dCiAgICogYXN5bmNocm9ub3VzbHkgd2l0aCBbVGltZXIucnVuXS4KICAgKgogICAqIElmIHRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIFtjb21wdXRhdGlvbl0gdGhyb3dzLCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzCiAgICogY29tcGxldGVkIHdpdGggdGhlIGVycm9yLgogICAqCiAgICogSWYgdGhlIHJldHVybmVkIHZhbHVlIGlzIGl0c2VsZiBhIFtGdXR1cmVdLCBjb21wbGV0aW9uIG9mCiAgICogdGhlIGNyZWF0ZWQgZnV0dXJlIHdpbGwgd2FpdCB1bnRpbCB0aGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcywKICAgKiBhbmQgd2lsbCB0aGVuIGNvbXBsZXRlIHdpdGggdGhlIHNhbWUgcmVzdWx0LgogICAqCiAgICogSWYgYSBub24tZnV0dXJlIHZhbHVlIGlzIHJldHVybmVkLCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZAogICAqIHdpdGggdGhhdCB2YWx1ZS4KICAgKi8KICBmYWN0b3J5IEZ1dHVyZShGdXR1cmVPcjxUPiBjb21wdXRhdGlvbigpKSB7CiAgICBfRnV0dXJlPFQ+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICBUaW1lci5ydW4oKCkgewogICAgICB0cnkgewogICAgICAgIHJlc3VsdC5fY29tcGxldGUoY29tcHV0YXRpb24oKSk7CiAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayhyZXN1bHQsIGUsIHMpOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgZnV0dXJlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFtjb21wdXRhdGlvbl0KICAgKiBhc3luY2hyb25vdXNseSB3aXRoIFtzY2hlZHVsZU1pY3JvdGFza10uCiAgICoKICAgKiBJZiBleGVjdXRpbmcgW2NvbXB1dGF0aW9uXSB0aHJvd3MsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGUgdGhyb3duIGVycm9yLgogICAqCiAgICogSWYgY2FsbGluZyBbY29tcHV0YXRpb25dIHJldHVybnMgYSBbRnV0dXJlXSwgY29tcGxldGlvbiBvZgogICAqIHRoZSBjcmVhdGVkIGZ1dHVyZSB3aWxsIHdhaXQgdW50aWwgdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMsCiAgICogYW5kIHdpbGwgdGhlbiBjb21wbGV0ZSB3aXRoIHRoZSBzYW1lIHJlc3VsdC4KICAgKgogICAqIElmIGNhbGxpbmcgW2NvbXB1dGF0aW9uXSByZXR1cm5zIGEgbm9uLWZ1dHVyZSB2YWx1ZSwKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgdmFsdWUuCiAgICovCiAgZmFjdG9yeSBGdXR1cmUubWljcm90YXNrKEZ1dHVyZU9yPFQ+IGNvbXB1dGF0aW9uKCkpIHsKICAgIF9GdXR1cmU8VD4gcmVzdWx0ID0gbmV3IF9GdXR1cmU8VD4oKTsKICAgIHNjaGVkdWxlTWljcm90YXNrKCgpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXN1bHQuX2NvbXBsZXRlKGNvbXB1dGF0aW9uKCkpOwogICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgX2NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2socmVzdWx0LCBlLCBzKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIGZ1dHVyZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgaW1tZWRpYXRlbHkgY2FsbGluZwogICAqIFtjb21wdXRhdGlvbl0uCiAgICoKICAgKiBJZiBjYWxsaW5nIFtjb21wdXRhdGlvbl0gdGhyb3dzLCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoZQogICAqIGVycm9yLgogICAqCiAgICogSWYgY2FsbGluZyBbY29tcHV0YXRpb25dIHJldHVybnMgYSBgRnV0dXJlPFQ+YCwgdGhhdCBmdXR1cmUgaXMgcmV0dXJuZWQuCiAgICoKICAgKiBJZiBjYWxsaW5nIFtjb21wdXRhdGlvbl0gcmV0dXJucyBhIG5vbi1mdXR1cmUgdmFsdWUsCiAgICogYSBmdXR1cmUgaXMgcmV0dXJuZWQgd2hpY2ggaGFzIGJlZW4gY29tcGxldGVkIHdpdGggdGhhdCB2YWx1ZS4KICAgKi8KICBmYWN0b3J5IEZ1dHVyZS5zeW5jKEZ1dHVyZU9yPFQ+IGNvbXB1dGF0aW9uKCkpIHsKICAgIHRyeSB7CiAgICAgIHZhciByZXN1bHQgPSBjb21wdXRhdGlvbigpOwogICAgICBpZiAocmVzdWx0IGlzIEZ1dHVyZTxUPikgewogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG5ldyBfRnV0dXJlPFQ+LnZhbHVlKHJlc3VsdCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycm9yLCBzdGFja1RyYWNlKSB7CiAgICAgIHZhciBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgICBBc3luY0Vycm9yIHJlcGxhY2VtZW50ID0gWm9uZS5jdXJyZW50LmVycm9yQ2FsbGJhY2soZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewogICAgICAgIGZ1dHVyZS5fYXN5bmNDb21wbGV0ZUVycm9yKAogICAgICAgICAgICBfbm9uTnVsbEVycm9yKHJlcGxhY2VtZW50LmVycm9yKSwgcmVwbGFjZW1lbnQuc3RhY2tUcmFjZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZnV0dXJlLl9hc3luY0NvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9CiAgICAgIHJldHVybiBmdXR1cmU7CiAgICB9CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgZnV0dXJlIGNvbXBsZXRlZCB3aXRoIFt2YWx1ZV0uCiAgICoKICAgKiBJZiBbdmFsdWVdIGlzIGEgZnV0dXJlLCB0aGUgY3JlYXRlZCBmdXR1cmUgd2FpdHMgZm9yIHRoZQogICAqIFt2YWx1ZV0gZnV0dXJlIHRvIGNvbXBsZXRlLCBhbmQgdGhlbiBjb21wbGV0ZXMgd2l0aCB0aGUgc2FtZSByZXN1bHQuCiAgICogU2luY2UgYSBbdmFsdWVdIGZ1dHVyZSBjYW4gY29tcGxldGUgd2l0aCBhbiBlcnJvciwgc28gY2FuIHRoZSBmdXR1cmUKICAgKiBjcmVhdGVkIGJ5IFtGdXR1cmUudmFsdWVdLCBldmVuIGlmIHRoZSBuYW1lIHN1Z2dlc3RzIG90aGVyd2lzZS4KICAgKgogICAqIElmIFt2YWx1ZV0gaXMgbm90IGEgW0Z1dHVyZV0sIHRoZSBjcmVhdGVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQKICAgKiB3aXRoIHRoZSBbdmFsdWVdIHZhbHVlLAogICAqIGVxdWl2YWxlbnRseSB0byBgbmV3IEZ1dHVyZTxUPi5zeW5jKCgpID0+IHZhbHVlKWAuCiAgICoKICAgKiBVc2UgW0NvbXBsZXRlcl0gdG8gY3JlYXRlIGEgZnV0dXJlIGFuZCBjb21wbGV0ZSBpdCBsYXRlci4KICAgKi8KICBmYWN0b3J5IEZ1dHVyZS52YWx1ZShbRnV0dXJlT3I8VD4gdmFsdWVdKSB7CiAgICByZXR1cm4gbmV3IF9GdXR1cmU8VD4uaW1tZWRpYXRlKHZhbHVlKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBmdXR1cmUgdGhhdCBjb21wbGV0ZXMgd2l0aCBhbiBlcnJvci4KICAgKgogICAqIFRoZSBjcmVhdGVkIGZ1dHVyZSB3aWxsIGJlIGNvbXBsZXRlZCB3aXRoIGFuIGVycm9yIGluIGEgZnV0dXJlIG1pY3JvdGFzay4KICAgKiBUaGlzIGFsbG93cyBlbm91Z2ggdGltZSBmb3Igc29tZW9uZSB0byBhZGQgYW4gZXJyb3IgaGFuZGxlciBvbiB0aGUgZnV0dXJlLgogICAqIElmIGFuIGVycm9yIGhhbmRsZXIgaXNuJ3QgYWRkZWQgYmVmb3JlIHRoZSBmdXR1cmUgY29tcGxldGVzLCB0aGUgZXJyb3IKICAgKiB3aWxsIGJlIGNvbnNpZGVyZWQgdW5oYW5kbGVkLgogICAqCiAgICogSWYgW2Vycm9yXSBpcyBgbnVsbGAsIGl0IGlzIHJlcGxhY2VkIGJ5IGEgW051bGxUaHJvd25FcnJvcl0uCiAgICoKICAgKiBVc2UgW0NvbXBsZXRlcl0gdG8gY3JlYXRlIGEgZnV0dXJlIGFuZCBjb21wbGV0ZSBpdCBsYXRlci4KICAgKi8KICBmYWN0b3J5IEZ1dHVyZS5lcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBlcnJvciA9IF9ub25OdWxsRXJyb3IoZXJyb3IpOwogICAgaWYgKCFpZGVudGljYWwoWm9uZS5jdXJyZW50LCBfcm9vdFpvbmUpKSB7CiAgICAgIEFzeW5jRXJyb3IgcmVwbGFjZW1lbnQgPSBab25lLmN1cnJlbnQuZXJyb3JDYWxsYmFjayhlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CiAgICAgICAgZXJyb3IgPSBfbm9uTnVsbEVycm9yKHJlcGxhY2VtZW50LmVycm9yKTsKICAgICAgICBzdGFja1RyYWNlID0gcmVwbGFjZW1lbnQuc3RhY2tUcmFjZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBfRnV0dXJlPFQ+LmltbWVkaWF0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBmdXR1cmUgdGhhdCBydW5zIGl0cyBjb21wdXRhdGlvbiBhZnRlciBhIGRlbGF5LgogICAqCiAgICogVGhlIFtjb21wdXRhdGlvbl0gd2lsbCBiZSBleGVjdXRlZCBhZnRlciB0aGUgZ2l2ZW4gW2R1cmF0aW9uXSBoYXMgcGFzc2VkLAogICAqIGFuZCB0aGUgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uLgogICAqCiAgICogSWYgW2NvbXB1dGF0aW9uXSByZXR1cm5zIGEgZnV0dXJlLAogICAqIHRoZSBmdXR1cmUgcmV0dXJuZWQgYnkgdGhpcyBjb25zdHJ1Y3RvciB3aWxsIGNvbXBsZXRlIHdpdGggdGhlIHZhbHVlIG9yCiAgICogZXJyb3Igb2YgdGhhdCBmdXR1cmUuCiAgICoKICAgKiBJZiB0aGUgZHVyYXRpb24gaXMgMCBvciBsZXNzLAogICAqIGl0IGNvbXBsZXRlcyBubyBzb29uZXIgdGhhbiBpbiB0aGUgbmV4dCBldmVudC1sb29wIGl0ZXJhdGlvbiwKICAgKiBhZnRlciBhbGwgbWljcm90YXNrcyBoYXZlIHJ1bi4KICAgKgogICAqIElmIFtjb21wdXRhdGlvbl0gaXMgb21pdHRlZCwKICAgKiBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgW2NvbXB1dGF0aW9uXSB3YXMgYCgpID0+IG51bGxgLAogICAqIGFuZCB0aGUgZnV0dXJlIHdpbGwgZXZlbnR1YWxseSBjb21wbGV0ZSB3aXRoIHRoZSBgbnVsbGAgdmFsdWUuCiAgICoKICAgKiBJZiBjYWxsaW5nIFtjb21wdXRhdGlvbl0gdGhyb3dzLCB0aGUgY3JlYXRlZCBmdXR1cmUgd2lsbCBjb21wbGV0ZSB3aXRoIHRoZQogICAqIGVycm9yLgogICAqCiAgICogU2VlIGFsc28gW0NvbXBsZXRlcl0gZm9yIGEgd2F5IHRvIGNyZWF0ZSBhbmQgY29tcGxldGUgYSBmdXR1cmUgYXQgYQogICAqIGxhdGVyIHRpbWUgdGhhdCBpc24ndCBuZWNlc3NhcmlseSBhZnRlciBhIGtub3duIGZpeGVkIGR1cmF0aW9uLgogICAqLwogIGZhY3RvcnkgRnV0dXJlLmRlbGF5ZWQoRHVyYXRpb24gZHVyYXRpb24sIFtGdXR1cmVPcjxUPiBjb21wdXRhdGlvbigpXSkgewogICAgX0Z1dHVyZTxUPiByZXN1bHQgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgbmV3IFRpbWVyKGR1cmF0aW9uLCAoKSB7CiAgICAgIGlmIChjb21wdXRhdGlvbiA9PSBudWxsKSB7CiAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZShudWxsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZShjb21wdXRhdGlvbigpKTsKICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayhyZXN1bHQsIGUsIHMpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogV2FpdHMgZm9yIG11bHRpcGxlIGZ1dHVyZXMgdG8gY29tcGxldGUgYW5kIGNvbGxlY3RzIHRoZWlyIHJlc3VsdHMuCiAgICoKICAgKiBSZXR1cm5zIGEgZnV0dXJlIHdoaWNoIHdpbGwgY29tcGxldGUgb25jZSBhbGwgdGhlIHByb3ZpZGVkIGZ1dHVyZXMKICAgKiBoYXZlIGNvbXBsZXRlZCwgZWl0aGVyIHdpdGggdGhlaXIgcmVzdWx0cywgb3Igd2l0aCBhbiBlcnJvciBpZiBhbnkKICAgKiBvZiB0aGUgcHJvdmlkZWQgZnV0dXJlcyBmYWlsLgogICAqCiAgICogVGhlIHZhbHVlIG9mIHRoZSByZXR1cm5lZCBmdXR1cmUgd2lsbCBiZSBhIGxpc3Qgb2YgYWxsIHRoZSB2YWx1ZXMgdGhhdAogICAqIHdlcmUgcHJvZHVjZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhlIGZ1dHVyZXMgYXJlIHByb3ZpZGVkIGJ5IGl0ZXJhdGluZwogICAqIFtmdXR1cmVzXS4KICAgKgogICAqIElmIGFueSBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXJyb3IsCiAgICogdGhlbiB0aGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIHRoYXQgZXJyb3IuCiAgICogSWYgZnVydGhlciBmdXR1cmVzIGFsc28gY29tcGxldGUgd2l0aCBlcnJvcnMsIHRob3NlIGVycm9ycyBhcmUgZGlzY2FyZGVkLgogICAqCiAgICogSWYgYGVhZ2VyRXJyb3JgIGlzIHRydWUsIHRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXJyb3IKICAgKiBpbW1lZGlhdGVseSBvbiB0aGUgZmlyc3QgZXJyb3IgZnJvbSBvbmUgb2YgdGhlIGZ1dHVyZXMuIE90aGVyd2lzZSBhbGwKICAgKiBmdXR1cmVzIG11c3QgY29tcGxldGUgYmVmb3JlIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIChzdGlsbCB3aXRoCiAgICogdGhlIGZpcnN0IGVycm9yOyB0aGUgcmVtYWluaW5nIGVycm9ycyBhcmUgc2lsZW50bHkgZHJvcHBlZCkuCiAgICoKICAgKiBJbiB0aGUgY2FzZSBvZiBhbiBlcnJvciwgW2NsZWFuVXBdIChpZiBwcm92aWRlZCksIGlzIGludm9rZWQgb24gYW55CiAgICogbm9uLW51bGwgcmVzdWx0IG9mIHN1Y2Nlc3NmdWwgZnV0dXJlcy4KICAgKiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGBjbGVhblVwYCByZXNvdXJjZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUKICAgKiBsb3N0IChzaW5jZSB0aGUgcmV0dXJuZWQgZnV0dXJlIGRvZXMgbm90IHByb3ZpZGUgYWNjZXNzIHRvIHRoZXNlIHZhbHVlcykuCiAgICogVGhlIFtjbGVhblVwXSBmdW5jdGlvbiBpcyB1bnVzZWQgaWYgdGhlcmUgaXMgbm8gZXJyb3IuCiAgICoKICAgKiBUaGUgY2FsbCB0byBbY2xlYW5VcF0gc2hvdWxkIG5vdCB0aHJvdy4gSWYgaXQgZG9lcywgdGhlIGVycm9yIHdpbGwgYmUgYW4KICAgKiB1bmNhdWdodCBhc3luY2hyb25vdXMgZXJyb3IuCiAgICovCiAgc3RhdGljIEZ1dHVyZTxMaXN0PFQ+PiB3YWl0PFQ+KEl0ZXJhYmxlPEZ1dHVyZTxUPj4gZnV0dXJlcywKICAgICAge2Jvb2wgZWFnZXJFcnJvcjogZmFsc2UsIHZvaWQgY2xlYW5VcChUIHN1Y2Nlc3NWYWx1ZSl9KSB7CiAgICBmaW5hbCBfRnV0dXJlPExpc3Q8VD4+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPExpc3Q8VD4+KCk7CiAgICBMaXN0PFQ+IHZhbHVlczsgLy8gQ29sbGVjdHMgdGhlIHZhbHVlcy4gU2V0IHRvIG51bGwgb24gZXJyb3IuCiAgICBpbnQgcmVtYWluaW5nID0gMDsgLy8gSG93IG1hbnkgZnV0dXJlcyBhcmUgd2Ugd2FpdGluZyBmb3IuCiAgICB2YXIgZXJyb3I7IC8vIFRoZSBmaXJzdCBlcnJvciBmcm9tIGEgZnV0dXJlLgogICAgU3RhY2tUcmFjZSBzdGFja1RyYWNlOyAvLyBUaGUgc3RhY2tUcmFjZSB0aGF0IGNhbWUgd2l0aCB0aGUgZXJyb3IuCgogICAgLy8gSGFuZGxlIGFuIGVycm9yIGZyb20gYW55IG9mIHRoZSBmdXR1cmVzLgogICAgLy8gVE9ETyhqbWVzc2VybHkpOiB1c2UgYHZvaWRgIHJldHVybiB0eXBlIG9uY2UgaXQgY2FuIGJlIGluZmVycmVkIGZvciB0aGUKICAgIC8vIGB0aGVuYCBjYWxsIGJlbG93LgogICAgaGFuZGxlRXJyb3IodGhlRXJyb3IsIFN0YWNrVHJhY2UgdGhlU3RhY2tUcmFjZSkgewogICAgICByZW1haW5pbmctLTsKICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNsZWFuVXAgIT0gbnVsbCkgewogICAgICAgICAgZm9yICh2YXIgdmFsdWUgaW4gdmFsdWVzKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgLy8gRW5zdXJlIGVycm9ycyBmcm9tIGNsZWFuVXAgYXJlIHVuY2F1Z2h0LgogICAgICAgICAgICAgIG5ldyBGdXR1cmUuc3luYygoKSB7CiAgICAgICAgICAgICAgICBjbGVhblVwKHZhbHVlKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YWx1ZXMgPSBudWxsOwogICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCB8fCBlYWdlckVycm9yKSB7CiAgICAgICAgICByZXN1bHQuX2NvbXBsZXRlRXJyb3IodGhlRXJyb3IsIHRoZVN0YWNrVHJhY2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlcnJvciA9IHRoZUVycm9yOwogICAgICAgICAgc3RhY2tUcmFjZSA9IHRoZVN0YWNrVHJhY2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZyA9PSAwICYmICFlYWdlckVycm9yKSB7CiAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgfQogICAgfQoKICAgIHRyeSB7CiAgICAgIC8vIEFzIGVhY2ggZnV0dXJlIGNvbXBsZXRlcywgcHV0IGl0cyB2YWx1ZSBpbnRvIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgIC8vIHBvc2l0aW9uIGluIHRoZSBsaXN0IG9mIHZhbHVlcy4KICAgICAgZm9yICh2YXIgZnV0dXJlIGluIGZ1dHVyZXMpIHsKICAgICAgICBpbnQgcG9zID0gcmVtYWluaW5nOwogICAgICAgIGZ1dHVyZS50aGVuKChUIHZhbHVlKSB7CiAgICAgICAgICByZW1haW5pbmctLTsKICAgICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgewogICAgICAgICAgICB2YWx1ZXNbcG9zXSA9IHZhbHVlOwogICAgICAgICAgICBpZiAocmVtYWluaW5nID09IDApIHsKICAgICAgICAgICAgICByZXN1bHQuX2NvbXBsZXRlV2l0aFZhbHVlKHZhbHVlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChjbGVhblVwICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgIC8vIEVuc3VyZSBlcnJvcnMgZnJvbSBjbGVhblVwIGFyZSB1bmNhdWdodC4KICAgICAgICAgICAgICBuZXcgRnV0dXJlLnN5bmMoKCkgewogICAgICAgICAgICAgICAgY2xlYW5VcCh2YWx1ZSk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwICYmICFlYWdlckVycm9yKSB7CiAgICAgICAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIG9uRXJyb3I6IGhhbmRsZUVycm9yKTsKICAgICAgICAvLyBJbmNyZW1lbnQgdGhlICdyZW1haW5pbmcnIGFmdGVyIHRoZSBjYWxsIHRvICd0aGVuJy4KICAgICAgICAvLyBJZiB0aGF0IGNhbGwgdGhyb3dzLCB3ZSBkb24ndCBleHBlY3QgYW55IGZ1dHVyZSBjYWxsYmFjayBmcm9tCiAgICAgICAgLy8gdGhlIGZ1dHVyZSwgYW5kIHdlIGFsc28gZG9uJ3QgaW5jcmVtZW50IHJlbWFpbmluZy4KICAgICAgICByZW1haW5pbmcrKzsKICAgICAgfQogICAgICBpZiAocmVtYWluaW5nID09IDApIHsKICAgICAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShjb25zdCBbXSk7CiAgICAgIH0KICAgICAgdmFsdWVzID0gbmV3IExpc3Q8VD4ocmVtYWluaW5nKTsKICAgIH0gY2F0Y2ggKGUsIHN0KSB7CiAgICAgIC8vIFRoZSBlcnJvciBtdXN0IGhhdmUgYmVlbiB0aHJvd24gd2hpbGUgaXRlcmF0aW5nIG92ZXIgdGhlIGZ1dHVyZXMKICAgICAgLy8gbGlzdCwgb3Igd2hpbGUgaW5zdGFsbGluZyBhIGNhbGxiYWNrIGhhbmRsZXIgb24gdGhlIGZ1dHVyZS4KICAgICAgaWYgKHJlbWFpbmluZyA9PSAwIHx8IGVhZ2VyRXJyb3IpIHsKICAgICAgICAvLyBUaHJvdyBhIG5ldyBGdXR1cmUuZXJyb3IuCiAgICAgICAgLy8gRG9uJ3QganVzdCBjYWxsIGByZXN1bHQuX2NvbXBsZXRlRXJyb3JgIHNpbmNlIHRoYXQgd291bGQgcHJvcGFnYXRlCiAgICAgICAgLy8gdGhlIGVycm9yIHRvbyBlYWdlcmx5LCBub3QgZ2l2aW5nIHRoZSBjYWxsZXJzIHRpbWUgdG8gaW5zdGFsbAogICAgICAgIC8vIGVycm9yIGhhbmRsZXJzLgogICAgICAgIC8vIEFsc28sIGRvbid0IHVzZSBgX2FzeW5jQ29tcGxldGVFcnJvcmAgc2luY2UgdGhhdCBvbmUgZG9lc24ndCBnaXZlCiAgICAgICAgLy8gem9uZXMgdGhlIGNoYW5jZSB0byBpbnRlcmNlcHQgdGhlIGVycm9yLgogICAgICAgIHJldHVybiBuZXcgRnV0dXJlLmVycm9yKGUsIHN0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBEb24ndCBhbGxvY2F0ZSBhIGxpc3QgZm9yIHZhbHVlcywgdGh1cyBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgd2FzIGFuCiAgICAgICAgLy8gZXJyb3IuCiAgICAgICAgLy8gU2V0IGVycm9yIHRvIHRoZSBjYXVnaHQgZXhjZXB0aW9uLgogICAgICAgIGVycm9yID0gZTsKICAgICAgICBzdGFja1RyYWNlID0gc3Q7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGZpcnN0IGZ1dHVyZSBpbiBbZnV0dXJlc10gdG8gY29tcGxldGUuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGZpcnN0CiAgICogZnV0dXJlIGluIFtmdXR1cmVzXSB0byByZXBvcnQgdGhhdCBpdCBpcyBjb21wbGV0ZSwKICAgKiB3aGV0aGVyIGl0J3Mgd2l0aCBhIHZhbHVlIG9yIGFuIGVycm9yLgogICAqIFRoZSByZXN1bHRzIG9mIGFsbCB0aGUgb3RoZXIgZnV0dXJlcyBhcmUgZGlzY2FyZGVkLgogICAqCiAgICogSWYgW2Z1dHVyZXNdIGlzIGVtcHR5LCBvciBpZiBub25lIG9mIGl0cyBmdXR1cmVzIGNvbXBsZXRlLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgbmV2ZXIgY29tcGxldGVzLgogICAqLwogIHN0YXRpYyBGdXR1cmU8VD4gYW55PFQ+KEl0ZXJhYmxlPEZ1dHVyZTxUPj4gZnV0dXJlcykgewogICAgdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8VD4uc3luYygpOwogICAgdmFyIG9uVmFsdWUgPSAoVCB2YWx1ZSkgewogICAgICBpZiAoIWNvbXBsZXRlci5pc0NvbXBsZXRlZCkgY29tcGxldGVyLmNvbXBsZXRlKHZhbHVlKTsKICAgIH07CiAgICB2YXIgb25FcnJvciA9IChlcnJvciwgU3RhY2tUcmFjZSBzdGFjaykgewogICAgICBpZiAoIWNvbXBsZXRlci5pc0NvbXBsZXRlZCkgY29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrKTsKICAgIH07CiAgICBmb3IgKHZhciBmdXR1cmUgaW4gZnV0dXJlcykgewogICAgICBmdXR1cmUudGhlbihvblZhbHVlLCBvbkVycm9yOiBvbkVycm9yKTsKICAgIH0KICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgLyoqCiAgICogUGVyZm9ybXMgYW4gYWN0aW9uIGZvciBlYWNoIGVsZW1lbnQgb2YgdGhlIGl0ZXJhYmxlLCBpbiB0dXJuLgogICAqCiAgICogVGhlIFthY3Rpb25dIG1heSBiZSBlaXRoZXIgc3luY2hyb25vdXMgb3IgYXN5bmNocm9ub3VzLgogICAqCiAgICogQ2FsbHMgW2FjdGlvbl0gd2l0aCBlYWNoIGVsZW1lbnQgaW4gW2VsZW1lbnRzXSBpbiBvcmRlci4KICAgKiBJZiB0aGUgY2FsbCB0byBbYWN0aW9uXSByZXR1cm5zIGEgYEZ1dHVyZTxUPmAsIHRoZSBpdGVyYXRpb24gd2FpdHMKICAgKiB1bnRpbCB0aGUgZnV0dXJlIGlzIGNvbXBsZXRlZCBiZWZvcmUgY29udGludWluZyB3aXRoIHRoZSBuZXh0IGVsZW1lbnQuCiAgICoKICAgKiBSZXR1cm5zIGEgW0Z1dHVyZV0gdGhhdCBjb21wbGV0ZXMgd2l0aCBgbnVsbGAgd2hlbiBhbGwgZWxlbWVudHMgaGF2ZSBiZWVuCiAgICogcHJvY2Vzc2VkLgogICAqCiAgICogTm9uLVtGdXR1cmVdIHJldHVybiB2YWx1ZXMsIGFuZCBjb21wbGV0aW9uLXZhbHVlcyBvZiByZXR1cm5lZCBbRnV0dXJlXXMsCiAgICogYXJlIGRpc2NhcmRlZC4KICAgKgogICAqIEFueSBlcnJvciBmcm9tIFthY3Rpb25dLCBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMsCiAgICogd2lsbCBzdG9wIHRoZSBpdGVyYXRpb24gYW5kIGJlIHJlcG9ydGVkIGluIHRoZSByZXR1cm5lZCBbRnV0dXJlXS4KICAgKi8KICBzdGF0aWMgRnV0dXJlIGZvckVhY2g8VD4oSXRlcmFibGU8VD4gZWxlbWVudHMsIEZ1dHVyZU9yIGFjdGlvbihUIGVsZW1lbnQpKSB7CiAgICB2YXIgaXRlcmF0b3IgPSBlbGVtZW50cy5pdGVyYXRvcjsKICAgIHJldHVybiBkb1doaWxlKCgpIHsKICAgICAgaWYgKCFpdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm4gZmFsc2U7CiAgICAgIHZhciByZXN1bHQgPSBhY3Rpb24oaXRlcmF0b3IuY3VycmVudCk7CiAgICAgIGlmIChyZXN1bHQgaXMgRnV0dXJlKSByZXR1cm4gcmVzdWx0LnRoZW4oX2tUcnVlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KTsKICB9CgogIC8vIENvbnN0YW50IGB0cnVlYCBmdW5jdGlvbiwgdXNlZCBhcyBjYWxsYmFjayBieSBbZm9yRWFjaF0uCiAgc3RhdGljIGJvb2wgX2tUcnVlKF8pID0+IHRydWU7CgogIC8qKgogICAqIFBlcmZvcm1zIGFuIG9wZXJhdGlvbiByZXBlYXRlZGx5IHVudGlsIGl0IHJldHVybnMgYGZhbHNlYC4KICAgKgogICAqIFRoZSBvcGVyYXRpb24sIFthY3Rpb25dLCBtYXkgYmUgZWl0aGVyIHN5bmNocm9ub3VzIG9yIGFzeW5jaHJvbm91cy4KICAgKgogICAqIFRoZSBvcGVyYXRpb24gaXMgY2FsbGVkIHJlcGVhdGVkbHkgYXMgbG9uZyBhcyBpdCByZXR1cm5zIGVpdGhlciB0aGUgW2Jvb2xdCiAgICogdmFsdWUgYHRydWVgIG9yIGEgYEZ1dHVyZTxib29sPmAgd2hpY2ggY29tcGxldGVzIHdpdGggdGhlIHZhbHVlIGB0cnVlYC4KICAgKgogICAqIElmIGEgY2FsbCB0byBbYWN0aW9uXSByZXR1cm5zIGBmYWxzZWAgb3IgYSBbRnV0dXJlXSB0aGF0IGNvbXBsZXRlcyB0bwogICAqIGBmYWxzZWAsIGl0ZXJhdGlvbiBlbmRzIGFuZCB0aGUgZnV0dXJlIHJldHVybmVkIGJ5IFtkb1doaWxlXSBpcyBjb21wbGV0ZWQKICAgKiB3aXRoIGEgYG51bGxgIHZhbHVlLgogICAqCiAgICogSWYgYSBjYWxsIHRvIFthY3Rpb25dIHRocm93cyBvciBhIGZ1dHVyZSByZXR1cm5lZCBieSBbYWN0aW9uXSBjb21wbGV0ZXMKICAgKiB3aXRoIGFuIGVycm9yLCBpdGVyYXRpb24gZW5kcyBhbmQgdGhlIGZ1dHVyZSByZXR1cm5lZCBieSBbZG9XaGlsZV0KICAgKiBjb21wbGV0ZXMgd2l0aCB0aGUgc2FtZSBlcnJvci4KICAgKgogICAqIENhbGxzIHRvIFthY3Rpb25dIG1heSBoYXBwZW4gYXQgYW55IHRpbWUsCiAgICogaW5jbHVkaW5nIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYGRvV2hpbGVgLgogICAqIFRoZSBvbmx5IHJlc3RyaWN0aW9uIGlzIGEgbmV3IGNhbGwgdG8gW2FjdGlvbl0gd29uJ3QgaGFwcGVuIGJlZm9yZQogICAqIHRoZSBwcmV2aW91cyBjYWxsIGhhcyByZXR1cm5lZCwgYW5kIGlmIGl0IHJldHVybmVkIGEgYEZ1dHVyZTxib29sPmAsIG5vdAogICAqIHVudGlsIHRoYXQgZnV0dXJlIGhhcyBjb21wbGV0ZWQuCiAgICovCiAgc3RhdGljIEZ1dHVyZSBkb1doaWxlKEZ1dHVyZU9yPGJvb2w+IGFjdGlvbigpKSB7CiAgICBfRnV0dXJlIGRvbmVTaWduYWwgPSBuZXcgX0Z1dHVyZSgpOwogICAgdm9pZCBGdW5jdGlvbihib29sKSBuZXh0SXRlcmF0aW9uOwogICAgLy8gQmluZCB0aGlzIGNhbGxiYWNrIGV4cGxpY2l0bHkgc28gdGhhdCBlYWNoIGl0ZXJhdGlvbiBpc24ndCBib3VuZCBpbiB0aGUKICAgIC8vIGNvbnRleHQgb2YgYWxsIHRoZSBwcmV2aW91cyBpdGVyYXRpb25zJyBjYWxsYmFja3MuCiAgICAvLyBUaGlzIGF2b2lkcywgZS5nLiwgZGVlcGx5IG5lc3RlZCBzdGFjayB0cmFjZXMgZnJvbSB0aGUgc3RhY2sgdHJhY2UKICAgIC8vIHBhY2thZ2UuCiAgICBuZXh0SXRlcmF0aW9uID0gWm9uZS5jdXJyZW50LmJpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZCgoYm9vbCBrZWVwR29pbmcpIHsKICAgICAgd2hpbGUgKGtlZXBHb2luZykgewogICAgICAgIEZ1dHVyZU9yPGJvb2w+IHJlc3VsdDsKICAgICAgICB0cnkgewogICAgICAgICAgcmVzdWx0ID0gYWN0aW9uKCk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IsIHN0YWNrVHJhY2UpIHsKICAgICAgICAgIC8vIENhbm5vdCB1c2UgX2NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2sgYmVjYXVzZSBpdCBjb21wbGV0ZXMKICAgICAgICAgIC8vIHRoZSBmdXR1cmUgc3luY2hyb25vdXNseS4KICAgICAgICAgIF9hc3luY0NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2soZG9uZVNpZ25hbCwgZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAocmVzdWx0IGlzIEZ1dHVyZTxib29sPikgewogICAgICAgICAgcmVzdWx0LnRoZW4obmV4dEl0ZXJhdGlvbiwgb25FcnJvcjogZG9uZVNpZ25hbC5fY29tcGxldGVFcnJvcik7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGtlZXBHb2luZyA9IHJlc3VsdDsKICAgICAgfQogICAgICBkb25lU2lnbmFsLl9jb21wbGV0ZShudWxsKTsKICAgIH0pOwogICAgbmV4dEl0ZXJhdGlvbih0cnVlKTsKICAgIHJldHVybiBkb25lU2lnbmFsOwogIH0KCiAgLyoqCiAgICogUmVnaXN0ZXIgY2FsbGJhY2tzIHRvIGJlIGNhbGxlZCB3aGVuIHRoaXMgZnV0dXJlIGNvbXBsZXRlcy4KICAgKgogICAqIFdoZW4gdGhpcyBmdXR1cmUgY29tcGxldGVzIHdpdGggYSB2YWx1ZSwKICAgKiB0aGUgW29uVmFsdWVdIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhhdCB2YWx1ZS4KICAgKiBJZiB0aGlzIGZ1dHVyZSBpcyBhbHJlYWR5IGNvbXBsZXRlZCwgdGhlIGNhbGxiYWNrIHdpbGwgbm90IGJlIGNhbGxlZAogICAqIGltbWVkaWF0ZWx5LCBidXQgd2lsbCBiZSBzY2hlZHVsZWQgaW4gYSBsYXRlciBtaWNyb3Rhc2suCiAgICoKICAgKiBJZiBbb25FcnJvcl0gaXMgcHJvdmlkZWQsIGFuZCB0aGlzIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBlcnJvciwKICAgKiB0aGUgYG9uRXJyb3JgIGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIHRoYXQgZXJyb3IgYW5kIGl0cyBzdGFjayB0cmFjZS4KICAgKiBUaGUgYG9uRXJyb3JgIGNhbGxiYWNrIG11c3QgYWNjZXB0IGVpdGhlciBvbmUgYXJndW1lbnQgb3IgdHdvIGFyZ3VtZW50cwogICAqIHdoZXJlIHRoZSBsYXR0ZXIgaXMgYSBbU3RhY2tUcmFjZV0uCiAgICogSWYgYG9uRXJyb3JgIGFjY2VwdHMgdHdvIGFyZ3VtZW50cywKICAgKiBpdCBpcyBjYWxsZWQgd2l0aCBib3RoIHRoZSBlcnJvciBhbmQgdGhlIHN0YWNrIHRyYWNlLAogICAqIG90aGVyd2lzZSBpdCBpcyBjYWxsZWQgd2l0aCBqdXN0IHRoZSBlcnJvciBvYmplY3QuCiAgICogVGhlIGBvbkVycm9yYCBjYWxsYmFjayBtdXN0IHJldHVybiBhIHZhbHVlIG9yIGZ1dHVyZSB0aGF0IGNhbiBiZSB1c2VkCiAgICogdG8gY29tcGxldGUgdGhlIHJldHVybmVkIGZ1dHVyZSwgc28gaXQgbXVzdCBiZSBzb21ldGhpbmcgYXNzaWduYWJsZSB0bwogICAqIGBGdXR1cmVPcjxSPmAuCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IFtGdXR1cmVdCiAgICogd2hpY2ggaXMgY29tcGxldGVkIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCB0byBgb25WYWx1ZWAKICAgKiAoaWYgdGhpcyBmdXR1cmUgY29tcGxldGVzIHdpdGggYSB2YWx1ZSkKICAgKiBvciB0byBgb25FcnJvcmAgKGlmIHRoaXMgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGVycm9yKS4KICAgKgogICAqIElmIHRoZSBpbnZva2VkIGNhbGxiYWNrIHRocm93cywKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoZSB0aHJvd24gZXJyb3IKICAgKiBhbmQgYSBzdGFjayB0cmFjZSBmb3IgdGhlIGVycm9yLgogICAqIEluIHRoZSBjYXNlIG9mIGBvbkVycm9yYCwKICAgKiBpZiB0aGUgZXhjZXB0aW9uIHRocm93biBpcyBgaWRlbnRpY2FsYCB0byB0aGUgZXJyb3IgYXJndW1lbnQgdG8gYG9uRXJyb3JgLAogICAqIHRoZSB0aHJvdyBpcyBjb25zaWRlcmVkIGEgcmV0aHJvdywKICAgKiBhbmQgdGhlIG9yaWdpbmFsIHN0YWNrIHRyYWNlIGlzIHVzZWQgaW5zdGVhZC4KICAgKgogICAqIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgW0Z1dHVyZV0sCiAgICogdGhlIGZ1dHVyZSByZXR1cm5lZCBieSBgdGhlbmAgd2lsbCBiZSBjb21wbGV0ZWQgd2l0aAogICAqIHRoZSBzYW1lIHJlc3VsdCBhcyB0aGUgZnV0dXJlIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjay4KICAgKgogICAqIElmIFtvbkVycm9yXSBpcyBub3QgZ2l2ZW4sIGFuZCB0aGlzIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBlcnJvciwKICAgKiB0aGUgZXJyb3IgaXMgZm9yd2FyZGVkIGRpcmVjdGx5IHRvIHRoZSByZXR1cm5lZCBmdXR1cmUuCiAgICoKICAgKiBJbiBtb3N0IGNhc2VzLCBpdCBpcyBtb3JlIHJlYWRhYmxlIHRvIHVzZSBbY2F0Y2hFcnJvcl0gc2VwYXJhdGVseSwgcG9zc2libHkKICAgKiB3aXRoIGEgYHRlc3RgIHBhcmFtZXRlciwgaW5zdGVhZCBvZiBoYW5kbGluZyBib3RoIHZhbHVlIGFuZCBlcnJvciBpbiBhCiAgICogc2luZ2xlIFt0aGVuXSBjYWxsLgogICAqCiAgICogTm90ZSB0aGF0IGZ1dHVyZXMgZG9uJ3QgZGVsYXkgcmVwb3J0aW5nIG9mIGVycm9ycyB1bnRpbCBsaXN0ZW5lcnMgYXJlCiAgICogYWRkZWQuIElmIHRoZSBmaXJzdCBgdGhlbmAgb3IgYGNhdGNoRXJyb3JgIGNhbGwgaGFwcGVucyBhZnRlciB0aGlzIGZ1dHVyZQogICAqIGhhcyBjb21wbGV0ZWQgd2l0aCBhbiBlcnJvciB0aGVuIHRoZSBlcnJvciBpcyByZXBvcnRlZCBhcyB1bmhhbmRsZWQgZXJyb3IuCiAgICogU2VlIHRoZSBkZXNjcmlwdGlvbiBvbiBbRnV0dXJlXS4KICAgKi8KICBGdXR1cmU8Uj4gdGhlbjxSPihGdXR1cmVPcjxSPiBvblZhbHVlKFQgdmFsdWUpLCB7RnVuY3Rpb24gb25FcnJvcn0pOwoKICAvKioKICAgKiBIYW5kbGVzIGVycm9ycyBlbWl0dGVkIGJ5IHRoaXMgW0Z1dHVyZV0uCiAgICoKICAgKiBUaGlzIGlzIHRoZSBhc3luY2hyb25vdXMgZXF1aXZhbGVudCBvZiBhICJjYXRjaCIgYmxvY2suCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IFtGdXR1cmVdIHRoYXQgd2lsbCBiZSBjb21wbGV0ZWQgd2l0aCBlaXRoZXIgdGhlIHJlc3VsdCBvZgogICAqIHRoaXMgZnV0dXJlIG9yIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgYG9uRXJyb3JgIGNhbGxiYWNrLgogICAqCiAgICogSWYgdGhpcyBmdXR1cmUgY29tcGxldGVzIHdpdGggYSB2YWx1ZSwKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIHRoZSBzYW1lIHZhbHVlLgogICAqCiAgICogSWYgdGhpcyBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXJyb3IsCiAgICogdGhlbiBbdGVzdF0gaXMgZmlyc3QgY2FsbGVkIHdpdGggdGhlIGVycm9yIHZhbHVlLgogICAqCiAgICogSWYgYHRlc3RgIHJldHVybnMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQgYnkgdGhpcyBgY2F0Y2hFcnJvcmAsCiAgICogYW5kIHRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdpdGggdGhlIHNhbWUgZXJyb3IgYW5kIHN0YWNrIHRyYWNlCiAgICogYXMgdGhpcyBmdXR1cmUuCiAgICoKICAgKiBJZiBgdGVzdGAgcmV0dXJucyBgdHJ1ZWAsCiAgICogW29uRXJyb3JdIGlzIGNhbGxlZCB3aXRoIHRoZSBlcnJvciBhbmQgcG9zc2libHkgc3RhY2sgdHJhY2UsCiAgICogYW5kIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwKICAgKiBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyBmb3IgW3RoZW5dJ3MgYG9uRXJyb3JgLgogICAqCiAgICogSWYgYHRlc3RgIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGEgZnVuY3Rpb24gdGhhdCBhbHdheXMgcmV0dXJucyB0cnVlLgogICAqIFRoZSBgdGVzdGAgZnVuY3Rpb24gc2hvdWxkIG5vdCB0aHJvdywgYnV0IGlmIGl0IGRvZXMsIGl0IGlzIGhhbmRsZWQgYXMKICAgKiBpZiB0aGUgYG9uRXJyb3JgIGZ1bmN0aW9uIGhhZCB0aHJvd24uCiAgICoKICAgKiBOb3RlIHRoYXQgZnV0dXJlcyBkb24ndCBkZWxheSByZXBvcnRpbmcgb2YgZXJyb3JzIHVudGlsIGxpc3RlbmVycyBhcmUKICAgKiBhZGRlZC4gSWYgdGhlIGZpcnN0IGBjYXRjaEVycm9yYCAob3IgYHRoZW5gKSBjYWxsIGhhcHBlbnMgYWZ0ZXIgdGhpcyBmdXR1cmUKICAgKiBoYXMgY29tcGxldGVkIHdpdGggYW4gZXJyb3IgdGhlbiB0aGUgZXJyb3IgaXMgcmVwb3J0ZWQgYXMgdW5oYW5kbGVkIGVycm9yLgogICAqIFNlZSB0aGUgZGVzY3JpcHRpb24gb24gW0Z1dHVyZV0uCiAgICovCiAgLy8gVGhlIGBGdW5jdGlvbmAgYmVsb3cgc3RhbmRzIGZvciBvbmUgb2YgdHdvIHR5cGVzOgogIC8vIC0gKGR5bmFtaWMpIC0+IEZ1dHVyZU9yPFQ+CiAgLy8gLSAoZHluYW1pYywgU3RhY2tUcmFjZSkgLT4gRnV0dXJlT3I8VD4KICAvLyBHaXZlbiB0aGF0IHRoZXJlIGlzIGEgYHRlc3RgIGZ1bmN0aW9uIHRoYXQgaXMgdXN1YWxseSB1c2VkIHRvIGRvIGFuCiAgLy8gYGlzQ2hlY2tgIHdlIHNob3VsZCBhbHNvIGV4cGVjdCBmdW5jdGlvbnMgdGhhdCB0YWtlIGEgc3BlY2lmaWMgYXJndW1lbnQuCiAgLy8gTm90ZTogbWFraW5nIGBjYXRjaEVycm9yYCByZXR1cm4gYSBgRnV0dXJlPFQ+YCBpbiBub24tc3Ryb25nIG1vZGUgY291bGQgYmUKICAvLyBhIGJyZWFraW5nIGNoYW5nZS4KICBGdXR1cmU8VD4gY2F0Y2hFcnJvcihGdW5jdGlvbiBvbkVycm9yLCB7Ym9vbCB0ZXN0KE9iamVjdCBlcnJvcil9KTsKCiAgLyoqCiAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhpcyBmdXR1cmUgY29tcGxldGVzLgogICAqCiAgICogVGhlIFthY3Rpb25dIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoaXMgZnV0dXJlIGNvbXBsZXRlcywgd2hldGhlciBpdAogICAqIGRvZXMgc28gd2l0aCBhIHZhbHVlIG9yIHdpdGggYW4gZXJyb3IuCiAgICoKICAgKiBUaGlzIGlzIHRoZSBhc3luY2hyb25vdXMgZXF1aXZhbGVudCBvZiBhICJmaW5hbGx5IiBibG9jay4KICAgKgogICAqIFRoZSBmdXR1cmUgcmV0dXJuZWQgYnkgdGhpcyBjYWxsLCBgZmAsIHdpbGwgY29tcGxldGUgdGhlIHNhbWUgd2F5CiAgICogYXMgdGhpcyBmdXR1cmUgdW5sZXNzIGFuIGVycm9yIG9jY3VycyBpbiB0aGUgW2FjdGlvbl0gY2FsbCwgb3IgaW4KICAgKiBhIFtGdXR1cmVdIHJldHVybmVkIGJ5IHRoZSBbYWN0aW9uXSBjYWxsLiBJZiB0aGUgY2FsbCB0byBbYWN0aW9uXQogICAqIGRvZXMgbm90IHJldHVybiBhIGZ1dHVyZSwgaXRzIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLgogICAqCiAgICogSWYgdGhlIGNhbGwgdG8gW2FjdGlvbl0gdGhyb3dzLCB0aGVuIGBmYCBpcyBjb21wbGV0ZWQgd2l0aCB0aGUKICAgKiB0aHJvd24gZXJyb3IuCiAgICoKICAgKiBJZiB0aGUgY2FsbCB0byBbYWN0aW9uXSByZXR1cm5zIGEgW0Z1dHVyZV0sIGBmMmAsIHRoZW4gY29tcGxldGlvbiBvZgogICAqIGBmYCBpcyBkZWxheWVkIHVudGlsIGBmMmAgY29tcGxldGVzLiBJZiBgZjJgIGNvbXBsZXRlcyB3aXRoCiAgICogYW4gZXJyb3IsIHRoYXQgd2lsbCBiZSB0aGUgcmVzdWx0IG9mIGBmYCB0b28uIFRoZSB2YWx1ZSBvZiBgZjJgIGlzIGFsd2F5cwogICAqIGlnbm9yZWQuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvOgogICAqCiAgICogICAgIEZ1dHVyZTxUPiB3aGVuQ29tcGxldGUoYWN0aW9uKCkpIHsKICAgKiAgICAgICByZXR1cm4gdGhpcy50aGVuKCh2KSB7CiAgICogICAgICAgICB2YXIgZjIgPSBhY3Rpb24oKTsKICAgKiAgICAgICAgIGlmIChmMiBpcyBGdXR1cmUpIHJldHVybiBmMi50aGVuKChfKSA9PiB2KTsKICAgKiAgICAgICAgIHJldHVybiB2CiAgICogICAgICAgfSwgb25FcnJvcjogKGUpIHsKICAgKiAgICAgICAgIHZhciBmMiA9IGFjdGlvbigpOwogICAqICAgICAgICAgaWYgKGYyIGlzIEZ1dHVyZSkgcmV0dXJuIGYyLnRoZW4oKF8pIHsgdGhyb3cgZTsgfSk7CiAgICogICAgICAgICB0aHJvdyBlOwogICAqICAgICAgIH0pOwogICAqICAgICB9CiAgICovCiAgRnV0dXJlPFQ+IHdoZW5Db21wbGV0ZShGdXR1cmVPciBhY3Rpb24oKSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbU3RyZWFtXSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgdGhpcyBmdXR1cmUuCiAgICoKICAgKiBUaGUgc3RyZWFtIHdpbGwgcHJvZHVjZSBzaW5nbGUgZGF0YSBvciBlcnJvciBldmVudCBjb250YWluaW5nIHRoZQogICAqIGNvbXBsZXRpb24gcmVzdWx0IG9mIHRoaXMgZnV0dXJlLCBhbmQgdGhlbiBpdCB3aWxsIGNsb3NlIHdpdGggYQogICAqIGRvbmUgZXZlbnQuCiAgICoKICAgKiBJZiB0aGUgZnV0dXJlIG5ldmVyIGNvbXBsZXRlcywgdGhlIHN0cmVhbSB3aWxsIG5vdCBwcm9kdWNlIGFueSBldmVudHMuCiAgICovCiAgU3RyZWFtPFQ+IGFzU3RyZWFtKCk7CgogIC8qKgogICAqIFRpbWUtb3V0IHRoZSBmdXR1cmUgY29tcHV0YXRpb24gYWZ0ZXIgW3RpbWVMaW1pdF0gaGFzIHBhc3NlZC4KICAgKgogICAqIFJldHVybnMgYSBuZXcgZnV0dXJlIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgdGhpcyBmdXR1cmUsCiAgICogaWYgdGhpcyBmdXR1cmUgY29tcGxldGVzIGluIHRpbWUuCiAgICoKICAgKiBJZiB0aGlzIGZ1dHVyZSBkb2VzIG5vdCBjb21wbGV0ZSBiZWZvcmUgYHRpbWVMaW1pdGAgaGFzIHBhc3NlZCwKICAgKiB0aGUgW29uVGltZW91dF0gYWN0aW9uIGlzIGV4ZWN1dGVkIGluc3RlYWQsIGFuZCBpdHMgcmVzdWx0ICh3aGV0aGVyIGl0CiAgICogcmV0dXJucyBvciB0aHJvd3MpIGlzIHVzZWQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgcmV0dXJuZWQgZnV0dXJlLgogICAqIFRoZSBbb25UaW1lb3V0XSBmdW5jdGlvbiBtdXN0IHJldHVybiBhIFtUXSBvciBhIGBGdXR1cmU8VD5gLgogICAqCiAgICogSWYgYG9uVGltZW91dGAgaXMgb21pdHRlZCwgYSB0aW1lb3V0IHdpbGwgY2F1c2UgdGhlIHJldHVybmVkIGZ1dHVyZSB0bwogICAqIGNvbXBsZXRlIHdpdGggYSBbVGltZW91dEV4Y2VwdGlvbl0uCiAgICovCiAgRnV0dXJlPFQ+IHRpbWVvdXQoRHVyYXRpb24gdGltZUxpbWl0LCB7RnV0dXJlT3I8VD4gb25UaW1lb3V0KCl9KTsKfQoKLyoqCiAqIFRocm93biB3aGVuIGEgc2NoZWR1bGVkIHRpbWVvdXQgaGFwcGVucyB3aGlsZSB3YWl0aW5nIGZvciBhbiBhc3luYyByZXN1bHQuCiAqLwpjbGFzcyBUaW1lb3V0RXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uIHsKICAvKiogRGVzY3JpcHRpb24gb2YgdGhlIGNhdXNlIG9mIHRoZSB0aW1lb3V0LiAqLwogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIC8qKiBUaGUgZHVyYXRpb24gdGhhdCB3YXMgZXhjZWVkZWQuICovCiAgZmluYWwgRHVyYXRpb24gZHVyYXRpb247CgogIFRpbWVvdXRFeGNlcHRpb24odGhpcy5tZXNzYWdlLCBbdGhpcy5kdXJhdGlvbl0pOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmcgcmVzdWx0ID0gIlRpbWVvdXRFeGNlcHRpb24iOwogICAgaWYgKGR1cmF0aW9uICE9IG51bGwpIHJlc3VsdCA9ICJUaW1lb3V0RXhjZXB0aW9uIGFmdGVyICRkdXJhdGlvbiI7CiAgICBpZiAobWVzc2FnZSAhPSBudWxsKSByZXN1bHQgPSAiJHJlc3VsdDogJG1lc3NhZ2UiOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCi8qKgogKiBBIHdheSB0byBwcm9kdWNlIEZ1dHVyZSBvYmplY3RzIGFuZCB0byBjb21wbGV0ZSB0aGVtIGxhdGVyCiAqIHdpdGggYSB2YWx1ZSBvciBlcnJvci4KICoKICogTW9zdCBvZiB0aGUgdGltZSwgdGhlIHNpbXBsZXN0IHdheSB0byBjcmVhdGUgYSBmdXR1cmUgaXMgdG8ganVzdCB1c2UKICogb25lIG9mIHRoZSBbRnV0dXJlXSBjb25zdHJ1Y3RvcnMgdG8gY2FwdHVyZSB0aGUgcmVzdWx0IG9mIGEgc2luZ2xlCiAqIGFzeW5jaHJvbm91cyBjb21wdXRhdGlvbjoKICogYGBgCiAqIG5ldyBGdXR1cmUoKCkgeyBkb1NvbWV0aGluZygpOyByZXR1cm4gcmVzdWx0OyB9KTsKICogYGBgCiAqIG9yLCBpZiB0aGUgZnV0dXJlIHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhIHNlcXVlbmNlIG9mIGFzeW5jaHJvbm91cwogKiBjb21wdXRhdGlvbnMsIHRoZXkgY2FuIGJlIGNoYWluZWQgdXNpbmcgW0Z1dHVyZS50aGVuXSBvciBzaW1pbGFyIGZ1bmN0aW9ucwogKiBvbiBbRnV0dXJlXToKICogYGBgCiAqIEZ1dHVyZSBkb1N0dWZmKCl7CiAqICAgcmV0dXJuIHNvbWVBc3luY09wZXJhdGlvbigpLnRoZW4oKHJlc3VsdCkgewogKiAgICAgcmV0dXJuIHNvbWVPdGhlckFzeW5jT3BlcmF0aW9uKHJlc3VsdCk7CiAqICAgfSk7CiAqIH0KICogYGBgCiAqIElmIHlvdSBkbyBuZWVkIHRvIGNyZWF0ZSBhIEZ1dHVyZSBmcm9tIHNjcmF0Y2gg4oCUIGZvciBleGFtcGxlLAogKiB3aGVuIHlvdSdyZSBjb252ZXJ0aW5nIGEgY2FsbGJhY2stYmFzZWQgQVBJIGludG8gYSBGdXR1cmUtYmFzZWQKICogb25lIOKAlCB5b3UgY2FuIHVzZSBhIENvbXBsZXRlciBhcyBmb2xsb3dzOgogKiBgYGAKICogY2xhc3MgQXN5bmNPcGVyYXRpb24gewogKiAgIENvbXBsZXRlciBfY29tcGxldGVyID0gbmV3IENvbXBsZXRlcigpOwogKgogKiAgIEZ1dHVyZTxUPiBkb09wZXJhdGlvbigpIHsKICogICAgIF9zdGFydE9wZXJhdGlvbigpOwogKiAgICAgcmV0dXJuIF9jb21wbGV0ZXIuZnV0dXJlOyAvLyBTZW5kIGZ1dHVyZSBvYmplY3QgYmFjayB0byBjbGllbnQuCiAqICAgfQogKgogKiAgIC8vIFNvbWV0aGluZyBjYWxscyB0aGlzIHdoZW4gdGhlIHZhbHVlIGlzIHJlYWR5LgogKiAgIHZvaWQgX2ZpbmlzaE9wZXJhdGlvbihUIHJlc3VsdCkgewogKiAgICAgX2NvbXBsZXRlci5jb21wbGV0ZShyZXN1bHQpOwogKiAgIH0KICoKICogICAvLyBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZywgY2FsbCB0aGlzLgogKiAgIHZvaWQgX2Vycm9ySGFwcGVuZWQoZXJyb3IpIHsKICogICAgIF9jb21wbGV0ZXIuY29tcGxldGVFcnJvcihlcnJvcik7CiAqICAgfQogKiB9CiAqIGBgYAogKi8KYWJzdHJhY3QgY2xhc3MgQ29tcGxldGVyPFQ+IHsKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IGNvbXBsZXRlci4KICAgKgogICAqIFRoZSBnZW5lcmFsIHdvcmtmbG93IGZvciBjcmVhdGluZyBhIG5ldyBmdXR1cmUgaXMgdG8gMSkgY3JlYXRlIGEKICAgKiBuZXcgY29tcGxldGVyLCAyKSBoYW5kIG91dCBpdHMgZnV0dXJlLCBhbmQsIGF0IGEgbGF0ZXIgcG9pbnQsIDMpIGludm9rZQogICAqIGVpdGhlciBbY29tcGxldGVdIG9yIFtjb21wbGV0ZUVycm9yXS4KICAgKgogICAqIFRoZSBjb21wbGV0ZXIgY29tcGxldGVzIHRoZSBmdXR1cmUgYXN5bmNocm9ub3VzbHkuIFRoYXQgbWVhbnMgdGhhdAogICAqIGNhbGxiYWNrcyByZWdpc3RlcmVkIG9uIHRoZSBmdXR1cmUgYXJlIG5vdCBjYWxsZWQgaW1tZWRpYXRlbHkgd2hlbgogICAqIFtjb21wbGV0ZV0gb3IgW2NvbXBsZXRlRXJyb3JdIGlzIGNhbGxlZC4gSW5zdGVhZCB0aGUgY2FsbGJhY2tzIGFyZQogICAqIGRlbGF5ZWQgdW50aWwgYSBsYXRlciBtaWNyb3Rhc2suCiAgICoKICAgKiBFeGFtcGxlOgogICAqIGBgYAogICAqIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CiAgICogaGFuZE91dChjb21wbGV0ZXIuZnV0dXJlKTsKICAgKiBsYXRlcjogewogICAqICAgY29tcGxldGVyLmNvbXBsZXRlKCdjb21wbGV0aW9uIHZhbHVlJyk7CiAgICogfQogICAqIGBgYAogICAqLwogIGZhY3RvcnkgQ29tcGxldGVyKCkgPT4gbmV3IF9Bc3luY0NvbXBsZXRlcjxUPigpOwoKICAvKioKICAgKiBDb21wbGV0ZXMgdGhlIGZ1dHVyZSBzeW5jaHJvbm91c2x5LgogICAqCiAgICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgYXZvaWRlZCB1bmxlc3MgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGZ1dHVyZSBpcwogICAqIGtub3duIHRvIGJlIHRoZSBmaW5hbCByZXN1bHQgb2YgYW5vdGhlciBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBJZiBpbiBkb3VidAogICAqIHVzZSB0aGUgZGVmYXVsdCBbQ29tcGxldGVyXSBjb25zdHJ1Y3Rvci4KICAgKgogICAqIFVzaW5nIGFuIG5vcm1hbCwgYXN5bmNocm9ub3VzLCBjb21wbGV0ZXIgd2lsbCBuZXZlciBnaXZlIHRoZSB3cm9uZwogICAqIGJlaGF2aW9yLCBidXQgdXNpbmcgYSBzeW5jaHJvbm91cyBjb21wbGV0ZXIgaW5jb3JyZWN0bHkgY2FuIGNhdXNlCiAgICogb3RoZXJ3aXNlIGNvcnJlY3QgcHJvZ3JhbXMgdG8gYnJlYWsuCiAgICoKICAgKiBBIHN5bmNocm9ub3VzIGNvbXBsZXRlciBpcyBvbmx5IGludGVuZGVkIGZvciBvcHRpbWl6aW5nIGV2ZW50CiAgICogcHJvcGFnYXRpb24gd2hlbiBvbmUgYXN5bmNocm9ub3VzIGV2ZW50IGltbWVkaWF0ZWx5IHRyaWdnZXJzIGFub3RoZXIuCiAgICogSXQgc2hvdWxkIG5vdCBiZSB1c2VkIHVubGVzcyB0aGUgY2FsbHMgdG8gW2NvbXBsZXRlXSBhbmQgW2NvbXBsZXRlRXJyb3JdCiAgICogYXJlIGd1YXJhbnRlZWQgdG8gb2NjdXIgaW4gcGxhY2VzIHdoZXJlIGl0IHdvbid0IGJyZWFrIGBGdXR1cmVgIGludmFyaWFudHMuCiAgICoKICAgKiBDb21wbGV0aW5nIHN5bmNocm9ub3VzbHkgbWVhbnMgdGhhdCB0aGUgY29tcGxldGVyJ3MgZnV0dXJlIHdpbGwgYmUKICAgKiBjb21wbGV0ZWQgaW1tZWRpYXRlbHkgd2hlbiBjYWxsaW5nIHRoZSBbY29tcGxldGVdIG9yIFtjb21wbGV0ZUVycm9yXQogICAqIG1ldGhvZCBvbiBhIHN5bmNocm9ub3VzIGNvbXBsZXRlciwgd2hpY2ggYWxzbyBjYWxscyBhbnkgY2FsbGJhY2tzCiAgICogcmVnaXN0ZXJlZCBvbiB0aGF0IGZ1dHVyZS4KICAgKgogICAqIENvbXBsZXRpbmcgc3luY2hyb25vdXNseSBtdXN0IG5vdCBicmVhayB0aGUgcnVsZSB0aGF0IHdoZW4geW91IGFkZCBhCiAgICogY2FsbGJhY2sgb24gYSBmdXR1cmUsIHRoYXQgY2FsbGJhY2sgbXVzdCBub3QgYmUgY2FsbGVkIHVudGlsIHRoZSBjb2RlCiAgICogdGhhdCBhZGRlZCB0aGUgY2FsbGJhY2sgaGFzIGNvbXBsZXRlZC4KICAgKiBGb3IgdGhhdCByZWFzb24sIGEgc3luY2hyb25vdXMgY29tcGxldGlvbiBtdXN0IG9ubHkgb2NjdXIgYXQgdGhlIHZlcnkgZW5kCiAgICogKGluICJ0YWlsIHBvc2l0aW9uIikgb2YgYW5vdGhlciBzeW5jaHJvbm91cyBldmVudCwKICAgKiBiZWNhdXNlIGF0IHRoYXQgcG9pbnQsIGNvbXBsZXRpbmcgdGhlIGZ1dHVyZSBpbW1lZGlhdGVseSBpcyBiZSBlcXVpdmFsZW50CiAgICogdG8gcmV0dXJuaW5nIHRvIHRoZSBldmVudCBsb29wIGFuZCBjb21wbGV0aW5nIHRoZSBmdXR1cmUgaW4gdGhlIG5leHQKICAgKiBtaWNyb3Rhc2suCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyLnN5bmMoKTsKICAgKiAgICAgLy8gVGhlIGNvbXBsZXRpb24gaXMgdGhlIHJlc3VsdCBvZiB0aGUgYXN5bmNocm9ub3VzIG9uRG9uZSBldmVudC4KICAgKiAgICAgLy8gTm8gb3RoZXIgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBhZnRlciB0aGUgY29tcGxldGlvbi4gSXQgaXMgc2FmZQogICAqICAgICAvLyB0byB1c2UgdGhlIENvbXBsZXRlci5zeW5jIGNvbnN0cnVjdG9yLgogICAqICAgICBzdHJlYW0ubGlzdGVuKHByaW50LCBvbkRvbmU6ICgpIHsgY29tcGxldGVyLmNvbXBsZXRlKCJkb25lIik7IH0pOwogICAqCiAgICogQmFkIGV4YW1wbGUuIERvIG5vdCB1c2UgdGhpcyBjb2RlLiBPbmx5IGZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXM6CiAgICoKICAgKiAgICAgdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIuc3luYygpOwogICAqICAgICBjb21wbGV0ZXIuZnV0dXJlLnRoZW4oKF8pIHsgYmFyKCk7IH0pOwogICAqICAgICAvLyBUaGUgY29tcGxldGlvbiBpcyB0aGUgcmVzdWx0IG9mIHRoZSBhc3luY2hyb25vdXMgb25Eb25lIGV2ZW50LgogICAqICAgICAvLyBIb3dldmVyLCB0aGVyZSBpcyBzdGlsbCBjb2RlIGV4ZWN1dGVkIGFmdGVyIHRoZSBjb21wbGV0aW9uLiBUaGlzCiAgICogICAgIC8vIG9wZXJhdGlvbiBpcyAqbm90KiBzYWZlLgogICAqICAgICBzdHJlYW0ubGlzdGVuKHByaW50LCBvbkRvbmU6ICgpIHsKICAgKiAgICAgICBjb21wbGV0ZXIuY29tcGxldGUoImRvbmUiKTsKICAgKiAgICAgICBmb28oKTsgIC8vIEluIHRoaXMgY2FzZSwgZm9vKCkgcnVucyBhZnRlciBiYXIoKS4KICAgKiAgICAgfSk7CiAgICovCiAgZmFjdG9yeSBDb21wbGV0ZXIuc3luYygpID0+IG5ldyBfU3luY0NvbXBsZXRlcjxUPigpOwoKICAvKioKICAgKiBUaGUgZnV0dXJlIHRoYXQgaXMgY29tcGxldGVkIGJ5IHRoaXMgY29tcGxldGVyLgogICAqCiAgICogVGhlIGZ1dHVyZSB0aGF0IGlzIGNvbXBsZXRlZCB3aGVuIFtjb21wbGV0ZV0gb3IgW2NvbXBsZXRlRXJyb3JdIGlzIGNhbGxlZC4KICAgKi8KICBGdXR1cmU8VD4gZ2V0IGZ1dHVyZTsKCiAgLyoqCiAgICogQ29tcGxldGVzIFtmdXR1cmVdIHdpdGggdGhlIHN1cHBsaWVkIHZhbHVlcy4KICAgKgogICAqIFRoZSB2YWx1ZSBtdXN0IGJlIGVpdGhlciBhIHZhbHVlIG9mIHR5cGUgW1RdCiAgICogb3IgYSBmdXR1cmUgb2YgdHlwZSBgRnV0dXJlPFQ+YC4KICAgKgogICAqIElmIHRoZSB2YWx1ZSBpcyBpdHNlbGYgYSBmdXR1cmUsIHRoZSBjb21wbGV0ZXIgd2lsbCB3YWl0IGZvciB0aGF0IGZ1dHVyZQogICAqIHRvIGNvbXBsZXRlLCBhbmQgY29tcGxldGUgd2l0aCB0aGUgc2FtZSByZXN1bHQsIHdoZXRoZXIgaXQgaXMgYSBzdWNjZXNzCiAgICogb3IgYW4gZXJyb3IuCiAgICoKICAgKiBDYWxsaW5nIFtjb21wbGV0ZV0gb3IgW2NvbXBsZXRlRXJyb3JdIG11c3QgYmUgZG9uZSBhdCBtb3N0IG9uY2UuCiAgICoKICAgKiBBbGwgbGlzdGVuZXJzIG9uIHRoZSBmdXR1cmUgYXJlIGluZm9ybWVkIGFib3V0IHRoZSB2YWx1ZS4KICAgKi8KICB2b2lkIGNvbXBsZXRlKFtGdXR1cmVPcjxUPiB2YWx1ZV0pOwoKICAvKioKICAgKiBDb21wbGV0ZSBbZnV0dXJlXSB3aXRoIGFuIGVycm9yLgogICAqCiAgICogQ2FsbGluZyBbY29tcGxldGVdIG9yIFtjb21wbGV0ZUVycm9yXSBtdXN0IGJlIGRvbmUgYXQgbW9zdCBvbmNlLgogICAqCiAgICogQ29tcGxldGluZyBhIGZ1dHVyZSB3aXRoIGFuIGVycm9yIGluZGljYXRlcyB0aGF0IGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duCiAgICogd2hpbGUgdHJ5aW5nIHRvIHByb2R1Y2UgYSB2YWx1ZS4KICAgKgogICAqIElmIFtlcnJvcl0gaXMgYG51bGxgLCBpdCBpcyByZXBsYWNlZCBieSBhIFtOdWxsVGhyb3duRXJyb3JdLgogICAqCiAgICogSWYgYGVycm9yYCBpcyBhIGBGdXR1cmVgLCB0aGUgZnV0dXJlIGl0c2VsZiBpcyB1c2VkIGFzIHRoZSBlcnJvciB2YWx1ZS4KICAgKiBJZiB5b3Ugd2FudCB0byBjb21wbGV0ZSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGZ1dHVyZSwgeW91IGNhbiB1c2U6CiAgICogYGBgCiAgICogdGhpc0NvbXBsZXRlci5jb21wbGV0ZSh0aGVGdXR1cmUpCiAgICogYGBgCiAgICogb3IgaWYgeW91IG9ubHkgd2FudCB0byBoYW5kbGUgYW4gZXJyb3IgZnJvbSB0aGUgZnV0dXJlOgogICAqIGBgYAogICAqIHRoZUZ1dHVyZS5jYXRjaEVycm9yKHRoaXNDb21wbGV0ZXIuY29tcGxldGVFcnJvcik7CiAgICogYGBgCiAgICovCiAgdm9pZCBjb21wbGV0ZUVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBbZnV0dXJlXSBoYXMgYmVlbiBjb21wbGV0ZWQuCiAgICoKICAgKiBSZWZsZWN0cyB3aGV0aGVyIFtjb21wbGV0ZV0gb3IgW2NvbXBsZXRlRXJyb3JdIGhhcyBiZWVuIGNhbGxlZC4KICAgKiBBIGB0cnVlYCB2YWx1ZSBkb2Vzbid0IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCBsaXN0ZW5lcnMgb2YgdGhpcyBmdXR1cmUKICAgKiBoYXZlIGJlZW4gaW52b2tlZCB5ZXQsIGVpdGhlciBiZWNhdXNlIHRoZSBjb21wbGV0ZXIgdXN1YWxseSB3YWl0cyB1bnRpbAogICAqIGEgbGF0ZXIgbWljcm90YXNrIHRvIHByb3BhZ2F0ZSB0aGUgcmVzdWx0LCBvciBiZWNhdXNlIFtjb21wbGV0ZV0KICAgKiB3YXMgY2FsbGVkIHdpdGggYSBmdXR1cmUgdGhhdCBoYXNuJ3QgY29tcGxldGVkIHlldC4KICAgKgogICAqIFdoZW4gdGhpcyB2YWx1ZSBpcyBgdHJ1ZWAsIFtjb21wbGV0ZV0gYW5kIFtjb21wbGV0ZUVycm9yXSBtdXN0IG5vdCBiZQogICAqIGNhbGxlZCBhZ2Fpbi4KICAgKi8KICBib29sIGdldCBpc0NvbXBsZXRlZDsKfQoKLy8gSGVscGVyIGZ1bmN0aW9uIGNvbXBsZXRpbmcgYSBfRnV0dXJlIHdpdGggZXJyb3IsIGJ1dCBjaGVja2luZyB0aGUgem9uZQovLyBmb3IgZXJyb3IgcmVwbGFjZW1lbnQgZmlyc3QuCnZvaWQgX2NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2soX0Z1dHVyZSByZXN1bHQsIGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICBBc3luY0Vycm9yIHJlcGxhY2VtZW50ID0gWm9uZS5jdXJyZW50LmVycm9yQ2FsbGJhY2soZXJyb3IsIHN0YWNrVHJhY2UpOwogIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CiAgICBlcnJvciA9IF9ub25OdWxsRXJyb3IocmVwbGFjZW1lbnQuZXJyb3IpOwogICAgc3RhY2tUcmFjZSA9IHJlcGxhY2VtZW50LnN0YWNrVHJhY2U7CiAgfQogIHJlc3VsdC5fY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7Cn0KCi8vIExpa2UgW19jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrXSBidXQgY29tcGxldGVzIGFzeW5jaHJvbm91c2x5Lgp2b2lkIF9hc3luY0NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2soCiAgICBfRnV0dXJlIHJlc3VsdCwgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogIEFzeW5jRXJyb3IgcmVwbGFjZW1lbnQgPSBab25lLmN1cnJlbnQuZXJyb3JDYWxsYmFjayhlcnJvciwgc3RhY2tUcmFjZSk7CiAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgIGVycm9yID0gX25vbk51bGxFcnJvcihyZXBsYWNlbWVudC5lcnJvcik7CiAgICBzdGFja1RyYWNlID0gcmVwbGFjZW1lbnQuc3RhY2tUcmFjZTsKICB9CiAgcmVzdWx0Ll9hc3luY0NvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwp9CgovKiogSGVscGVyIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYG51bGxgIHRvIGEgW051bGxUaHJvd25FcnJvcl0uICovCk9iamVjdCBfbm9uTnVsbEVycm9yKE9iamVjdCBlcnJvcikgPT4gZXJyb3IgPz8gbmV3IE51bGxUaHJvd25FcnJvcigpOwqDpQBOTjwBFAFDBEBPEwRMEARRBA8NTiAwBEImCAQPUUFLSk09BDhOFh1RExFCBAIBBDEDQDYyOBADKTI5AywoKi4DSFAhLEE9TQNGSxtMEAc1PUQIFD4bSBBDCQkHA0o+P0lMOgcdMUpFSTUvNAcHA0xBTEBOUR5PHkUHGAkYGBERBQcDMwdKKiIHA0dJSkMDTkkDSwsEGy4rNAEvLDUBBkUmBU0fBT9HMgVJFgYuKhMMKRcyCAgTBAEGRS4FKD0FQEcyBTo3BjgqGwwpFzIICBMEAQZDFAVQDAVOBTpEBjMKIiEXDy0IIiVOISRHDzcIFQYEAQYuBT5KSkUFQx04BT8GLiwEAQY0BU9QTCMFQgU/BkAiL04hMi0IBj0EAQY/BU9FBShNGwUjQyQFIj5EBVAMBUlFBksqHSEgDw4rGTQKCAgTBAEGSAVISCMFTEsQBSw5TwVKS09CBUksS088BU4iBj5APEI/MUcBME8aNhMcHyYhOiMgEg4MChcsOhEcJgoyMggGAQpIKSQdIBcgISIxDhM0OiMgEg4xOA4MIj9JPhUIHCsIJxZKRSolTkkbTTQoD08SLhMZCAYTBAEGRgVDOCw5BUAqBjktHj0HLkkHIi4GHQQBBkMFPQU+SEwFTxAFThQFO0cGTyYYLi04EwgEAT4hAQZABUkFUE0FS08aBU1IJAUvNEhOJgYzKCdPOkoQTRofDh0mSCdKEgomShIKHAgiCBkXBAEGQQUuPEo+BUhLTSkpOzhLTBQFHEEtPwUlPCYfUCgzBSk6PQVJPQVRTBkFS09QJgZHAQYuBT0FTUIFLDgFLTcFUUsVBR9CRzgFT0wrBUtRUCYGNyAsSU5QGEUBBkMFTCwFPwVHR0c8BUQTBUpBTw4FIwUsIiA5Fh0gQRYPCwYtAQY+BUdFEQVMBhgBBkMFTScFRUxGQgVMKQZEAgEETgQuMhgpGwEzARYoRzcTBAIBBD4aA0hGHQc1B0lOEAcVMS8JBQdBQy0HGi0DHxpHBwM2JyQHAywiKAcFBwQeBh4FRk0rBUhISCYFDgkmIA4vBwkGMwEGKQVPUS4FSEcqBUNLTlEFSEpHIAVKSyxPOE9KEAUOBS9LTTNLBUgFLzBLTSUrJzwNBjcBBjUFUAYYAQYyBTImBU5NEgVGBT8GJgEGJgVGBU4mBUIFTUkJJwk9CTgJBj0BBi4FRUtNRjkFSxMGGAIBSiBQSh0uKQQsAgFDJjRKHS4pBDECAURGARZkYXJ0OmFzeW5jL2Z1dHVyZS5kYXJ0LG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9hc3luYy90aW1lci5kYXJ0keovLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmFzeW5jOwoKLyoqCiAqIEEgY291bnQtZG93biB0aW1lciB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHRvIGZpcmUgb25jZSBvciByZXBlYXRlZGx5LgogKgogKiBUaGUgdGltZXIgY291bnRzIGRvd24gZnJvbSB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uIHRvIDAuCiAqIFdoZW4gdGhlIHRpbWVyIHJlYWNoZXMgMCwgdGhlIHRpbWVyIGludm9rZXMgdGhlIHNwZWNpZmllZCBjYWxsYmFjayBmdW5jdGlvbi4KICogVXNlIGEgcGVyaW9kaWMgdGltZXIgdG8gcmVwZWF0ZWRseSBjb3VudCBkb3duIHRoZSBzYW1lIGludGVydmFsLgogKgogKiBBIG5lZ2F0aXZlIGR1cmF0aW9uIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYSBkdXJhdGlvbiBvZiAwLgogKiBJZiB0aGUgZHVyYXRpb24gaXMgc3RhdGljYWxseSBrbm93biB0byBiZSAwLCBjb25zaWRlciB1c2luZyBbcnVuXS4KICoKICogRnJlcXVlbnRseSB0aGUgZHVyYXRpb24gaXMgZWl0aGVyIGEgY29uc3RhbnQgb3IgY29tcHV0ZWQgYXMgaW4gdGhlCiAqIGZvbGxvd2luZyBleGFtcGxlICh0YWtpbmcgYWR2YW50YWdlIG9mIHRoZSBtdWx0aXBsaWNhdGlvbiBvcGVyYXRvciBvZgogKiB0aGUgW0R1cmF0aW9uXSBjbGFzcyk6CiAqIGBgYGRhcnQKICogY29uc3QgdGltZW91dCA9IGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDMpOwogKiBjb25zdCBtcyA9IGNvbnN0IER1cmF0aW9uKG1pbGxpc2Vjb25kczogMSk7CiAqCiAqIHN0YXJ0VGltZW91dChbaW50IG1pbGxpc2Vjb25kc10pIHsKICogICB2YXIgZHVyYXRpb24gPSBtaWxsaXNlY29uZHMgPT0gbnVsbCA/IHRpbWVvdXQgOiBtcyAqIG1pbGxpc2Vjb25kczsKICogICByZXR1cm4gbmV3IFRpbWVyKGR1cmF0aW9uLCBoYW5kbGVUaW1lb3V0KTsKICogfQogKiAuLi4KICogdm9pZCBoYW5kbGVUaW1lb3V0KCkgeyAgLy8gY2FsbGJhY2sgZnVuY3Rpb24KICogICAuLi4KICogfQogKiBgYGAKICogTm90ZTogSWYgRGFydCBjb2RlIHVzaW5nIFRpbWVyIGlzIGNvbXBpbGVkIHRvIEphdmFTY3JpcHQsIHRoZSBmaW5lc3QKICogZ3JhbnVsYXJpdHkgYXZhaWxhYmxlIGluIHRoZSBicm93c2VyIGlzIDQgbWlsbGlzZWNvbmRzLgogKgogKiBTZWUgW1N0b3B3YXRjaF0gZm9yIG1lYXN1cmluZyBlbGFwc2VkIHRpbWUuCiAqLwphYnN0cmFjdCBjbGFzcyBUaW1lciB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyB0aW1lci4KICAgKgogICAqIFRoZSBbY2FsbGJhY2tdIGZ1bmN0aW9uIGlzIGludm9rZWQgYWZ0ZXIgdGhlIGdpdmVuIFtkdXJhdGlvbl0uCiAgICoKICAgKi8KICBmYWN0b3J5IFRpbWVyKER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGNhbGxiYWNrKCkpIHsKICAgIGlmIChab25lLmN1cnJlbnQgPT0gWm9uZS5yb290KSB7CiAgICAgIC8vIE5vIG5lZWQgdG8gYmluZCB0aGUgY2FsbGJhY2suIFdlIGtub3cgdGhhdCB0aGUgcm9vdCdzIHRpbWVyIHdpbGwKICAgICAgLy8gYmUgaW52b2tlZCBpbiB0aGUgcm9vdCB6b25lLgogICAgICByZXR1cm4gWm9uZS5jdXJyZW50LmNyZWF0ZVRpbWVyKGR1cmF0aW9uLCBjYWxsYmFjayk7CiAgICB9CiAgICByZXR1cm4gWm9uZS5jdXJyZW50CiAgICAgICAgLmNyZWF0ZVRpbWVyKGR1cmF0aW9uLCBab25lLmN1cnJlbnQuYmluZENhbGxiYWNrR3VhcmRlZChjYWxsYmFjaykpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyByZXBlYXRpbmcgdGltZXIuCiAgICoKICAgKiBUaGUgW2NhbGxiYWNrXSBpcyBpbnZva2VkIHJlcGVhdGVkbHkgd2l0aCBbZHVyYXRpb25dIGludGVydmFscyB1bnRpbAogICAqIGNhbmNlbGVkIHdpdGggdGhlIFtjYW5jZWxdIGZ1bmN0aW9uLgogICAqCiAgICogVGhlIGV4YWN0IHRpbWluZyBkZXBlbmRzIG9uIHRoZSB1bmRlcmx5aW5nIHRpbWVyIGltcGxlbWVudGF0aW9uLgogICAqIE5vIG1vcmUgdGhhbiBgbmAgY2FsbGJhY2tzIHdpbGwgYmUgbWFkZSBpbiBgZHVyYXRpb24gKiBuYCB0aW1lLAogICAqIGJ1dCB0aGUgdGltZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBjYWxsYmFja3MKICAgKiBjYW4gYmUgc2hvcnRlciBhbmQgbG9uZ2VyIHRoYW4gYGR1cmF0aW9uYC4KICAgKgogICAqIEluIHBhcnRpY3VsYXIsIGFuIGltcGxlbWVudGF0aW9uIG1heSBzY2hlZHVsZSB0aGUgbmV4dCBjYWxsYmFjaywgZS5nLiwKICAgKiBhIGBkdXJhdGlvbmAgYWZ0ZXIgZWl0aGVyIHdoZW4gdGhlIHByZXZpb3VzIGNhbGxiYWNrIGVuZGVkLAogICAqIHdoZW4gdGhlIHByZXZpb3VzIGNhbGxiYWNrIHN0YXJ0ZWQsIG9yIHdoZW4gdGhlIHByZXZpb3VzIGNhbGxiYWNrIHdhcwogICAqIHNjaGVkdWxlZCBmb3IgLSBldmVuIGlmIHRoZSBhY3R1YWwgY2FsbGJhY2sgd2FzIGRlbGF5ZWQuCiAgICovCiAgZmFjdG9yeSBUaW1lci5wZXJpb2RpYyhEdXJhdGlvbiBkdXJhdGlvbiwgdm9pZCBjYWxsYmFjayhUaW1lciB0aW1lcikpIHsKICAgIGlmIChab25lLmN1cnJlbnQgPT0gWm9uZS5yb290KSB7CiAgICAgIC8vIE5vIG5lZWQgdG8gYmluZCB0aGUgY2FsbGJhY2suIFdlIGtub3cgdGhhdCB0aGUgcm9vdCdzIHRpbWVyIHdpbGwKICAgICAgLy8gYmUgaW52b2tlZCBpbiB0aGUgcm9vdCB6b25lLgogICAgICByZXR1cm4gWm9uZS5jdXJyZW50LmNyZWF0ZVBlcmlvZGljVGltZXIoZHVyYXRpb24sIGNhbGxiYWNrKTsKICAgIH0KICAgIHZhciBib3VuZENhbGxiYWNrID0gWm9uZS5jdXJyZW50LmJpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZDxUaW1lcj4oY2FsbGJhY2spOwogICAgcmV0dXJuIFpvbmUuY3VycmVudC5jcmVhdGVQZXJpb2RpY1RpbWVyKGR1cmF0aW9uLCBib3VuZENhbGxiYWNrKTsKICB9CgogIC8qKgogICAqIFJ1bnMgdGhlIGdpdmVuIFtjYWxsYmFja10gYXN5bmNocm9ub3VzbHkgYXMgc29vbiBhcyBwb3NzaWJsZS4KICAgKgogICAqIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgbmV3IFRpbWVyKER1cmF0aW9uLnplcm8sIGNhbGxiYWNrKWAuCiAgICovCiAgc3RhdGljIHZvaWQgcnVuKHZvaWQgY2FsbGJhY2soKSkgewogICAgbmV3IFRpbWVyKER1cmF0aW9uLnplcm8sIGNhbGxiYWNrKTsKICB9CgogIC8qKgogICAqIENhbmNlbHMgdGhlIHRpbWVyLgogICAqCiAgICogT25jZSBhIFtUaW1lcl0gaGFzIGJlZW4gY2FuY2VsZWQsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIG5vdCBiZSBjYWxsZWQKICAgKiBieSB0aGUgdGltZXIuIENhbGxpbmcgW2NhbmNlbF0gbW9yZSB0aGFuIG9uY2Ugb24gYSBbVGltZXJdIGlzIGFsbG93ZWQsIGFuZAogICAqIHdpbGwgaGF2ZSBubyBmdXJ0aGVyIGVmZmVjdC4KICAgKi8KICB2b2lkIGNhbmNlbCgpOwoKICAvKioKICAgKiBUaGUgbnVtYmVyIG9mIGR1cmF0aW9ucyBwcmVjZWRpbmcgdGhlIG1vc3QgcmVjZW50IHRpbWVyIGV2ZW50LgogICAqCiAgICogVGhlIHZhbHVlIHN0YXJ0cyBhdCB6ZXJvIGFuZCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYSB0aW1lciBldmVudAogICAqIG9jY3Vycywgc28gZWFjaCBjYWxsYmFjayB3aWxsIHNlZSBhIGxhcmdlciB2YWx1ZSB0aGFuIHRoZSBwcmV2aW91cyBvbmUuCiAgICoKICAgKiBJZiBhIHBlcmlvZGljIHRpbWVyIHdpdGggYSBub24temVybyBkdXJhdGlvbiBpcyBkZWxheWVkIHRvbyBtdWNoLAogICAqIHNvIG1vcmUgdGhhbiBvbmUgdGljayBzaG91bGQgaGF2ZSBoYXBwZW5lZCwKICAgKiBhbGwgYnV0IHRoZSBsYXN0IHRpY2sgaW4gdGhlIHBhc3QgYXJlIGNvbnNpZGVyZWQgIm1pc3NlZCIsCiAgICogYW5kIG5vIGNhbGxiYWNrIGlzIGludm9rZWQgZm9yIHRoZW0uCiAgICogVGhlIFt0aWNrXSBjb3VudCByZWZsZWN0cyB0aGUgbnVtYmVyIG9mIGR1cmF0aW9ucyB0aGF0IGhhdmUgcGFzc2VkIGFuZAogICAqIG5vdCB0aGUgbnVtYmVyIG9mIGNhbGxiYWNrIGludm9jYXRpb25zIHRoYXQgaGF2ZSBoYXBwZW5lZC4KICAgKi8KICBpbnQgZ2V0IHRpY2s7CgogIC8qKgogICAqIFJldHVybnMgd2hldGhlciB0aGUgdGltZXIgaXMgc3RpbGwgYWN0aXZlLgogICAqCiAgICogQSBub24tcGVyaW9kaWMgdGltZXIgaXMgYWN0aXZlIGlmIHRoZSBjYWxsYmFjayBoYXMgbm90IGJlZW4gZXhlY3V0ZWQsCiAgICogYW5kIHRoZSB0aW1lciBoYXMgbm90IGJlZW4gY2FuY2VsZWQuCiAgICoKICAgKiBBIHBlcmlvZGljIHRpbWVyIGlzIGFjdGl2ZSBpZiBpdCBoYXMgbm90IGJlZW4gY2FuY2VsZWQuCiAgICovCiAgYm9vbCBnZXQgaXNBY3RpdmU7CgogIGV4dGVybmFsIHN0YXRpYyBUaW1lciBfY3JlYXRlVGltZXIoRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgY2FsbGJhY2soKSk7CiAgZXh0ZXJuYWwgc3RhdGljIFRpbWVyIF9jcmVhdGVQZXJpb2RpY1RpbWVyKAogICAgICBEdXJhdGlvbiBkdXJhdGlvbiwgdm9pZCBjYWxsYmFjayhUaW1lciB0aW1lcikpOwp9CoCBAE5OPAEUAQRJAztQRAM/RgNGSRoLLy8DJkgwBQcwCQUHSDsDLwQXBhoFRAUGNiVKJjsGGEwEAQYkBUoqBUZFNDAFTEFLPgZKJUomQwZQRgQBBkMFSgYlKAQBBhgFUFAiBhEBBkQFSU0FRzFAKkxABhABBjAFSyoFPQYVAUouNgIBFWRhcnQ6YXN5bmMvdGltZXIuZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2Vycm9yc19wYXRjaC5kYXJ0wABMgS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIEVycm9yIHsKICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIF9vYmplY3RUb1N0cmluZyhPYmplY3Qgb2JqZWN0KSB7CiAgICByZXR1cm4gT2JqZWN0Ll90b1N0cmluZyhvYmplY3QpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBfc3RyaW5nVG9TYWZlU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKICAgIHJldHVybiBqc29uLmVuY29kZShzdHJpbmcpOwogIH0KCiAgQHBhdGNoCiAgU3RhY2tUcmFjZSBnZXQgc3RhY2tUcmFjZSA9PiBfc3RhY2tUcmFjZTsKCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIFN0YWNrVHJhY2UgX3N0YWNrVHJhY2U7Cn0KCmNsYXNzIF9Bc3NlcnRpb25FcnJvciBleHRlbmRzIEVycm9yIGltcGxlbWVudHMgQXNzZXJ0aW9uRXJyb3IgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBfQXNzZXJ0aW9uRXJyb3IuX2NyZWF0ZSgKICAgICAgdGhpcy5fZmFpbGVkQXNzZXJ0aW9uLCB0aGlzLl91cmwsIHRoaXMuX2xpbmUsIHRoaXMuX2NvbHVtbiwgdGhpcy5tZXNzYWdlKTsKCiAgLy8gQXNzZXJ0aW9uRXJyb3JfdGhyb3dOZXcgaW4gZXJyb3JzLmNjIGZpc2hlcyB0aGUgYXNzZXJ0aW9uIHNvdXJjZSBjb2RlCiAgLy8gb3V0IG9mIHRoZSBzY3JpcHQuIEl0IGV4cGVjdHMgYSBEYXJ0IHN0YWNrIGZyYW1lIGZyb20gY2xhc3MKICAvLyBfQXNzZXJ0aW9uRXJyb3IuIFRodXMgd2UgbmVlZCBhIERhcnQgc3R1YiB0aGF0IGNhbGxzIHRoZSBuYXRpdmUgY29kZS4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBzdGF0aWMgX3Rocm93TmV3KGludCBhc3NlcnRpb25TdGFydCwgaW50IGFzc2VydGlvbkVuZCwgT2JqZWN0IG1lc3NhZ2UpIHsKICAgIF9kb1Rocm93TmV3KGFzc2VydGlvblN0YXJ0LCBhc3NlcnRpb25FbmQsIG1lc3NhZ2UpOwogIH0KCiAgc3RhdGljIF9kb1Rocm93TmV3KGludCBhc3NlcnRpb25TdGFydCwgaW50IGFzc2VydGlvbkVuZCwgT2JqZWN0IG1lc3NhZ2UpCiAgICAgIG5hdGl2ZSAiQXNzZXJ0aW9uRXJyb3JfdGhyb3dOZXciOwoKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBzdGF0aWMgX2V2YWx1YXRlQXNzZXJ0aW9uKGNvbmRpdGlvbikgewogICAgaWYgKGlkZW50aWNhbChjb25kaXRpb24sIHRydWUpIHx8IGlkZW50aWNhbChjb25kaXRpb24sIGZhbHNlKSkgewogICAgICByZXR1cm4gY29uZGl0aW9uOwogICAgfQogICAgaWYgKGNvbmRpdGlvbiBpcyBfQ2xvc3VyZSkgewogICAgICByZXR1cm4gKGNvbmRpdGlvbiBhcyBkeW5hbWljKSgpOwogICAgfQogICAgaWYgKGNvbmRpdGlvbiBpcyBGdW5jdGlvbikgewogICAgICBjb25kaXRpb24gPSBjb25kaXRpb24oKTsKICAgIH0KICAgIHJldHVybiBjb25kaXRpb247CiAgfQoKICBTdHJpbmcgZ2V0IF9tZXNzYWdlU3RyaW5nIHsKICAgIGlmIChtZXNzYWdlID09IG51bGwpIHJldHVybiAiaXMgbm90IHRydWUuIjsKICAgIGlmIChtZXNzYWdlIGlzIFN0cmluZykgcmV0dXJuIG1lc3NhZ2U7CiAgICByZXR1cm4gRXJyb3Iuc2FmZVRvU3RyaW5nKG1lc3NhZ2UpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgaWYgKF91cmwgPT0gbnVsbCkgewogICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSByZXR1cm4gX2ZhaWxlZEFzc2VydGlvbj8udHJpbSgpOwogICAgICByZXR1cm4gIicke19mYWlsZWRBc3NlcnRpb24/LnRyaW0oKX0nOiAkX21lc3NhZ2VTdHJpbmciOwogICAgfQogICAgdmFyIGNvbHVtbkluZm8gPSAiIjsKICAgIGlmIChfY29sdW1uID4gMCkgewogICAgICAvLyBPbmx5IGFkZCBjb2x1bW4gaW5mb3JtYXRpb24gaWYgaXQgaXMgdmFsaWQuCiAgICAgIGNvbHVtbkluZm8gPSAiIHBvcyAkX2NvbHVtbiI7CiAgICB9CiAgICByZXR1cm4gIickX3VybCc6IEZhaWxlZCBhc3NlcnRpb246IGxpbmUgJF9saW5lJGNvbHVtbkluZm86ICIKICAgICAgICAiJyRfZmFpbGVkQXNzZXJ0aW9uJzogJF9tZXNzYWdlU3RyaW5nIjsKICB9CgogIGZpbmFsIFN0cmluZyBfZmFpbGVkQXNzZXJ0aW9uOwogIGZpbmFsIFN0cmluZyBfdXJsOwogIGZpbmFsIGludCBfbGluZTsKICBmaW5hbCBpbnQgX2NvbHVtbjsKICBmaW5hbCBPYmplY3QgbWVzc2FnZTsKfQoKY2xhc3MgX1R5cGVFcnJvciBleHRlbmRzIF9Bc3NlcnRpb25FcnJvciBpbXBsZW1lbnRzIFR5cGVFcnJvciB7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIF9UeXBlRXJyb3IuX2NyZWF0ZShTdHJpbmcgdXJsLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIGVycm9yTXNnKQogICAgICA6IHN1cGVyLl9jcmVhdGUoImlzIGFzc2lnbmFibGUiLCB1cmwsIGxpbmUsIGNvbHVtbiwgZXJyb3JNc2cpOwoKICBzdGF0aWMgX3Rocm93TmV3KGludCBsb2NhdGlvbiwgT2JqZWN0IHNyY192YWx1ZSwgX1R5cGUgZHN0X3R5cGUsCiAgICAgIFN0cmluZyBkc3RfbmFtZSkgbmF0aXZlICJUeXBlRXJyb3JfdGhyb3dOZXciOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBzdXBlci5tZXNzYWdlOwp9CgpjbGFzcyBfQ2FzdEVycm9yIGV4dGVuZHMgRXJyb3IgaW1wbGVtZW50cyBDYXN0RXJyb3IgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBfQ2FzdEVycm9yLl9jcmVhdGUodGhpcy5fdXJsLCB0aGlzLl9saW5lLCB0aGlzLl9jb2x1bW4sIHRoaXMuX2Vycm9yTXNnKTsKCiAgLy8gQSBDYXN0RXJyb3IgaXMgYWxsb2NhdGVkIGJ5IFR5cGVFcnJvci5fdGhyb3dOZXcoKSB3aGVuIGRzdF9uYW1lIGVxdWFscwogIC8vIFN5bWJvbHM6OkluVHlwZUNhc3QoKS4KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX2Vycm9yTXNnOwoKICAvLyBGaWVsZHMgX3VybCwgX2xpbmUsIGFuZCBfY29sdW1uIGFyZSBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KICBmaW5hbCBTdHJpbmcgX3VybDsKICBmaW5hbCBpbnQgX2xpbmU7CiAgZmluYWwgaW50IF9jb2x1bW47CiAgZmluYWwgU3RyaW5nIF9lcnJvck1zZzsKfQoKQHBhdGNoCmNsYXNzIEZhbGxUaHJvdWdoRXJyb3IgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBGYWxsVGhyb3VnaEVycm9yLl9jcmVhdGUoU3RyaW5nIHVybCwgaW50IGxpbmUpCiAgICAgIDogX3VybCA9IHVybCwKICAgICAgICBfbGluZSA9IGxpbmU7CgogIHN0YXRpYyBfdGhyb3dOZXcoaW50IGNhc2VfY2xhdXNlX3BvcykgbmF0aXZlICJGYWxsVGhyb3VnaEVycm9yX3Rocm93TmV3IjsKCiAgQHBhdGNoCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICInJF91cmwnOiBTd2l0Y2ggY2FzZSBmYWxsLXRocm91Z2ggYXQgbGluZSAkX2xpbmUuIjsKICB9CgogIC8vIFRoZXNlIG5ldyBmaWVsZHMgY2Fubm90IGJlIGRlY2xhcmVkIGZpbmFsLCBiZWNhdXNlIGEgY29uc3RydWN0b3IgZXhpc3RzCiAgLy8gaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBwYXRjaGVkIGNsYXNzLgogIFN0cmluZyBfdXJsOwogIGludCBfbGluZTsKfQoKY2xhc3MgX0ludGVybmFsRXJyb3IgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBjb25zdCBfSW50ZXJuYWxFcnJvcih0aGlzLl9tc2cpOwogIFN0cmluZyB0b1N0cmluZygpID0+ICJJbnRlcm5hbEVycm9yOiAnJHtfbXNnfSciOwogIGZpbmFsIFN0cmluZyBfbXNnOwp9CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBVbnN1cHBvcnRlZEVycm9yIHsKICBzdGF0aWMgX3Rocm93TmV3KFN0cmluZyBtc2cpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKG1zZyk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgQ3ljbGljSW5pdGlhbGl6YXRpb25FcnJvciB7CiAgc3RhdGljIF90aHJvd05ldyhTdHJpbmcgdmFyaWFibGVOYW1lKSB7CiAgICB0aHJvdyBuZXcgQ3ljbGljSW5pdGlhbGl6YXRpb25FcnJvcih2YXJpYWJsZU5hbWUpOwogIH0KfQoKQHBhdGNoCmNsYXNzIEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yLl9jcmVhdGUoCiAgICAgIHRoaXMuX2NsYXNzTmFtZSwgdGhpcy5fdXJsLCB0aGlzLl9saW5lKTsKCiAgc3RhdGljIF90aHJvd05ldyhpbnQgY2FzZV9jbGF1c2VfcG9zLCBTdHJpbmcgY2xhc3NOYW1lKQogICAgICBuYXRpdmUgIkFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3JfdGhyb3dOZXciOwoKICBAcGF0Y2gKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIkNhbm5vdCBpbnN0YW50aWF0ZSBhYnN0cmFjdCBjbGFzcyAkX2NsYXNzTmFtZTogIgogICAgICAgICJfdXJsICckX3VybCcgbGluZSAkX2xpbmUiOwogIH0KCiAgLy8gVGhlc2UgbmV3IGZpZWxkcyBjYW5ub3QgYmUgZGVjbGFyZWQgZmluYWwsIGJlY2F1c2UgYSBjb25zdHJ1Y3RvciBleGlzdHMKICAvLyBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzIHBhdGNoZWQgY2xhc3MuCiAgU3RyaW5nIF91cmw7CiAgaW50IF9saW5lOwp9CgpAcGF0Y2gKY2xhc3MgTm9TdWNoTWV0aG9kRXJyb3IgewogIC8vIERlcHJlY2F0ZWQgbWVtYmVycyB0byBiZSByZW1vdmVkLgogIFN5bWJvbCBfbWVtYmVyTmFtZTsKICBMaXN0IF9hcmd1bWVudHM7CiAgTWFwPFN5bWJvbCwgZHluYW1pYz4gX25hbWVkQXJndW1lbnRzOwogIExpc3QgX2V4aXN0aW5nQXJndW1lbnROYW1lczsKCiAgZmluYWwgT2JqZWN0IF9yZWNlaXZlcjsKICBmaW5hbCBfSW52b2NhdGlvbk1pcnJvciBfaW52b2NhdGlvbjsKCiAgQHBhdGNoCiAgTm9TdWNoTWV0aG9kRXJyb3Iud2l0aEludm9jYXRpb24oT2JqZWN0IHJlY2VpdmVyLCBJbnZvY2F0aW9uIGludm9jYXRpb24pCiAgICAgIDogX3JlY2VpdmVyID0gcmVjZWl2ZXIsCiAgICAgICAgX2ludm9jYXRpb24gPSBpbnZvY2F0aW9uIGFzIF9JbnZvY2F0aW9uTWlycm9yOwoKICBzdGF0aWMgdm9pZCBfdGhyb3dOZXdJbnZvY2F0aW9uKE9iamVjdCByZWNlaXZlciwgSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICB0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXJyb3Iud2l0aEludm9jYXRpb24ocmVjZWl2ZXIsIGludm9jYXRpb24pOwogIH0KCiAgLy8gVGhlIGNvbXBpbGVyIGVtaXRzIGEgY2FsbCB0byBfdGhyb3dOZXcgd2hlbiBpdCBjYW5ub3QgcmVzb2x2ZSBhIHN0YXRpYwogIC8vIG1ldGhvZCBhdCBjb21waWxlIHRpbWUuIFRoZSByZWNlaXZlciBpcyBhY3R1YWxseSB0aGUgbGl0ZXJhbCBjbGFzcyBvZiB0aGUKICAvLyB1bnJlc29sdmVkIG1ldGhvZC4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBzdGF0aWMgdm9pZCBfdGhyb3dOZXcoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVtYmVyTmFtZSwgaW50IGludm9jYXRpb25fdHlwZSwKICAgICAgT2JqZWN0IHR5cGVBcmd1bWVudHMsIExpc3QgYXJndW1lbnRzLCBMaXN0IGFyZ3VtZW50TmFtZXMpIHsKICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFcnJvci5fd2l0aFR5cGUocmVjZWl2ZXIsIG1lbWJlck5hbWUsIGludm9jYXRpb25fdHlwZSwKICAgICAgICB0eXBlQXJndW1lbnRzLCBhcmd1bWVudHMsIGFyZ3VtZW50TmFtZXMpOwogIH0KCiAgc3RhdGljIHZvaWQgX3Rocm93TmV3SWZOb3RMb2FkZWQoCiAgICAgIF9MaWJyYXJ5UHJlZml4IHByZWZpeCwKICAgICAgT2JqZWN0IHJlY2VpdmVyLAogICAgICBTdHJpbmcgbWVtYmVyTmFtZSwKICAgICAgaW50IGludm9jYXRpb25fdHlwZSwKICAgICAgT2JqZWN0IHR5cGVBcmd1bWVudHMsCiAgICAgIExpc3QgYXJndW1lbnRzLAogICAgICBMaXN0IGFyZ3VtZW50TmFtZXMpIHsKICAgIGlmICghcHJlZml4LmlzTG9hZGVkKCkpIHsKICAgICAgX3Rocm93TmV3KHJlY2VpdmVyLCBtZW1iZXJOYW1lLCBpbnZvY2F0aW9uX3R5cGUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50cywKICAgICAgICAgIGFyZ3VtZW50TmFtZXMpOwogICAgfQogIH0KCiAgLy8gVE9ETyhyZWdpcyk6IERlcHJlY2F0ZWQgbWVtYmVyIHN0aWxsIHVzZWQgYnkgZGFydDJqcyB0byBiZSByZW1vdmVkLgogIC8vIFJlbWVtYmVyIHRoZSB0eXBlIGZyb20gdGhlIGludm9jYXRpb24gbWlycm9yIG9yIHN0YXRpYyBjb21waWxhdGlvbgogIC8vIGFuYWx5c2lzIHdoZW4gdGhyb3duIGRpcmVjdGx5IHdpdGggX3Rocm93TmV3LiBBIG5lZ2F0aXZlIHZhbHVlIG1lYW5zCiAgLy8gdGhhdCBubyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuCiAgaW50IF9pbnZvY2F0aW9uX3R5cGU7CgogIC8vIFRPRE8ocmVnaXMpOiBEZXByZWNhdGVkIGNvbnN0cnVjdG9yIHN0aWxsIHVzZWQgYnkgZGFydDJqcyB0byBiZSByZW1vdmVkLgogIEBwYXRjaAogIE5vU3VjaE1ldGhvZEVycm9yKE9iamVjdCByZWNlaXZlciwgU3ltYm9sIG1lbWJlck5hbWUsCiAgICAgIExpc3QgcG9zaXRpb25hbEFyZ3VtZW50cywgTWFwPFN5bWJvbCwgZHluYW1pYz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIFtMaXN0IGV4aXN0aW5nQXJndW1lbnROYW1lcyA9IG51bGxdKQogICAgICA6IF9yZWNlaXZlciA9IHJlY2VpdmVyLAogICAgICAgIF9pbnZvY2F0aW9uID0gbnVsbCwKICAgICAgICBfbWVtYmVyTmFtZSA9IG1lbWJlck5hbWUsCiAgICAgICAgX2FyZ3VtZW50cyA9IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgX25hbWVkQXJndW1lbnRzID0gbmFtZWRBcmd1bWVudHMsCiAgICAgICAgX2V4aXN0aW5nQXJndW1lbnROYW1lcyA9IGV4aXN0aW5nQXJndW1lbnROYW1lcywKICAgICAgICBfaW52b2NhdGlvbl90eXBlID0gLTE7CgogIC8vIEhlbHBlciB0byBidWlsZCBhIG1hcCBvZiBuYW1lZCBhcmd1bWVudHMuCiAgc3RhdGljIE1hcDxTeW1ib2wsIGR5bmFtaWM+IF9OYW1lZEFyZ3VtZW50c01hcCgKICAgICAgTGlzdCBhcmd1bWVudHMsIExpc3QgYXJndW1lbnROYW1lcykgewogICAgTWFwPFN5bWJvbCwgZHluYW1pYz4gbmFtZWRBcmd1bWVudHMgPSBuZXcgTWFwPFN5bWJvbCwgZHluYW1pYz4oKTsKICAgIGludCBudW1Qb3NpdGlvbmFsQXJndW1lbnRzID0gYXJndW1lbnRzLmxlbmd0aCAtIGFyZ3VtZW50TmFtZXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudE5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBhcmdfdmFsdWUgPSBhcmd1bWVudHNbbnVtUG9zaXRpb25hbEFyZ3VtZW50cyArIGldOwogICAgICBuYW1lZEFyZ3VtZW50c1tuZXcgU3ltYm9sKGFyZ3VtZW50TmFtZXNbaV0pXSA9IGFyZ192YWx1ZTsKICAgIH0KICAgIHJldHVybiBuYW1lZEFyZ3VtZW50czsKICB9CgogIC8vIENvbnN0cnVjdG9yIGNhbGxlZCBmcm9tIEV4Y2VwdGlvbnM6OlRocm93QnlUeXBlKGtOb1N1Y2hNZXRob2QpIGFuZCBmcm9tCiAgLy8gX3Rocm93TmV3IGFib3ZlLCB0YWtpbmcgYSBUeXBlQXJndW1lbnRzIG9iamVjdCByYXRoZXIgdGhhbiBhbiB1bnBhY2tlZCBsaXN0CiAgLy8gb2YgdHlwZXMsIGFzIHdlbGwgYXMgYSBsaXN0IG9mIGFsbCBhcmd1bWVudHMgYW5kIGEgbGlzdCBvZiBuYW1lcywgcmF0aGVyCiAgLy8gdGhhbiBhIHNlcGFyYXRlIGxpc3Qgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMgYW5kIGEgbWFwIG9mIG5hbWVkIGFyZ3VtZW50cy4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgTm9TdWNoTWV0aG9kRXJyb3IuX3dpdGhUeXBlKAogICAgICB0aGlzLl9yZWNlaXZlciwKICAgICAgU3RyaW5nIG1lbWJlck5hbWUsCiAgICAgIGludCBpbnZvY2F0aW9uX3R5cGUsCiAgICAgIE9iamVjdCB0eXBlQXJndW1lbnRzLAogICAgICBMaXN0IGFyZ3VtZW50cywKICAgICAgTGlzdCBhcmd1bWVudE5hbWVzKQogICAgICA6IHRoaXMuX2ludm9jYXRpb24gPSBuZXcgX0ludm9jYXRpb25NaXJyb3IuX3dpdGhUeXBlKAogICAgICAgICAgICBuZXcgU3ltYm9sKG1lbWJlck5hbWUpLAogICAgICAgICAgICBpbnZvY2F0aW9uX3R5cGUsCiAgICAgICAgICAgIHR5cGVBcmd1bWVudHMgIT0gbnVsbAogICAgICAgICAgICAgICAgLy8gVE9ETygzMzA3Myk6IFVzZSBhY3R1YWwgY291bnQgb2YgdHlwZSBhcmd1bWVudHMgaW4gcGxhY2Ugb2YgMC4KICAgICAgICAgICAgICAgID8gX0ludm9jYXRpb25NaXJyb3IuX3VucGFja1R5cGVBcmd1bWVudHModHlwZUFyZ3VtZW50cywgMCkKICAgICAgICAgICAgICAgIDogbnVsbCwKICAgICAgICAgICAgYXJndW1lbnROYW1lcyAhPSBudWxsCiAgICAgICAgICAgICAgICA/IGFyZ3VtZW50cy5zdWJsaXN0KDAsIGFyZ3VtZW50cy5sZW5ndGggLSBhcmd1bWVudE5hbWVzLmxlbmd0aCkKICAgICAgICAgICAgICAgIDogYXJndW1lbnRzLAogICAgICAgICAgICBhcmd1bWVudE5hbWVzICE9IG51bGwKICAgICAgICAgICAgICAgID8gX05hbWVkQXJndW1lbnRzTWFwKGFyZ3VtZW50cywgYXJndW1lbnROYW1lcykKICAgICAgICAgICAgICAgIDogbnVsbCk7CgogIHN0YXRpYyBTdHJpbmcgX2V4aXN0aW5nTWV0aG9kU2lnbmF0dXJlKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsCiAgICAgIGludCBpbnZvY2F0aW9uVHlwZSkgbmF0aXZlICJOb1N1Y2hNZXRob2RFcnJvcl9leGlzdGluZ01ldGhvZFNpZ25hdHVyZSI7CgogIEBwYXRjaAogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIC8vIFRPRE8ocmVnaXMpOiBSZW1vdmUgdGhpcyBudWxsIGNoZWNrIG9uY2UgZGFydDJqcyBpcyB1cGRhdGVkLgogICAgaWYgKF9pbnZvY2F0aW9uID09IG51bGwpIHsKICAgICAgLy8gVXNlIGRlcHJlY2F0ZWQgdmVyc2lvbiBvZiB0b1N0cmluZy4KICAgICAgcmV0dXJuIF90b1N0cmluZ0RlcHJlY2F0ZWQoKTsKICAgIH0KICAgIFN0cmluZyBtZW1iZXJOYW1lID0KICAgICAgICBpbnRlcm5hbC5TeW1ib2wuY29tcHV0ZVVubWFuZ2xlZE5hbWUoX2ludm9jYXRpb24ubWVtYmVyTmFtZSk7CiAgICB2YXIgbGV2ZWwgPSAoX2ludm9jYXRpb24uX3R5cGUgPj4gX0ludm9jYXRpb25NaXJyb3IuX0xFVkVMX1NISUZUKSAmCiAgICAgICAgX0ludm9jYXRpb25NaXJyb3IuX0xFVkVMX01BU0s7CiAgICB2YXIga2luZCA9IF9pbnZvY2F0aW9uLl90eXBlICYgX0ludm9jYXRpb25NaXJyb3IuX0tJTkRfTUFTSzsKICAgIGlmIChraW5kID09IF9JbnZvY2F0aW9uTWlycm9yLl9MT0NBTF9WQVIpIHsKICAgICAgcmV0dXJuICJOb1N1Y2hNZXRob2RFcnJvcjogQ2Fubm90IGFzc2lnbiB0byBmaW5hbCB2YXJpYWJsZSAnJG1lbWJlck5hbWUnIjsKICAgIH0KCiAgICBTdHJpbmdCdWZmZXIgdHlwZUFyZ3VtZW50c0J1ZiA9IG51bGw7CiAgICB2YXIgdHlwZUFyZ3VtZW50cyA9IF9pbnZvY2F0aW9uLnR5cGVBcmd1bWVudHM7CiAgICBpZiAoKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgJiYgKHR5cGVBcmd1bWVudHMubGVuZ3RoID4gMCkpIHsKICAgICAgdHlwZUFyZ3VtZW50c0J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgdHlwZUFyZ3VtZW50c0J1Zi53cml0ZSgiPCIpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgIHR5cGVBcmd1bWVudHNCdWYud3JpdGUoIiwgIik7CiAgICAgICAgfQogICAgICAgIHR5cGVBcmd1bWVudHNCdWYud3JpdGUoRXJyb3Iuc2FmZVRvU3RyaW5nKHR5cGVBcmd1bWVudHNbaV0pKTsKICAgICAgfQogICAgICB0eXBlQXJndW1lbnRzQnVmLndyaXRlKCI+Iik7CiAgICB9CiAgICBTdHJpbmdCdWZmZXIgYXJndW1lbnRzQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgdmFyIHBvc2l0aW9uYWxBcmd1bWVudHMgPSBfaW52b2NhdGlvbi5wb3NpdGlvbmFsQXJndW1lbnRzOwogICAgaW50IGFyZ3VtZW50Q291bnQgPSAwOwogICAgaWYgKHBvc2l0aW9uYWxBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBmb3IgKDsgYXJndW1lbnRDb3VudCA8IHBvc2l0aW9uYWxBcmd1bWVudHMubGVuZ3RoOyBhcmd1bWVudENvdW50KyspIHsKICAgICAgICBpZiAoYXJndW1lbnRDb3VudCA+IDApIHsKICAgICAgICAgIGFyZ3VtZW50c0J1Zi53cml0ZSgiLCAiKTsKICAgICAgICB9CiAgICAgICAgYXJndW1lbnRzQnVmCiAgICAgICAgICAgIC53cml0ZShFcnJvci5zYWZlVG9TdHJpbmcocG9zaXRpb25hbEFyZ3VtZW50c1thcmd1bWVudENvdW50XSkpOwogICAgICB9CiAgICB9CiAgICB2YXIgbmFtZWRBcmd1bWVudHMgPSBfaW52b2NhdGlvbi5uYW1lZEFyZ3VtZW50czsKICAgIGlmIChuYW1lZEFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIG5hbWVkQXJndW1lbnRzLmZvckVhY2goKFN5bWJvbCBrZXksIHZhciB2YWx1ZSkgewogICAgICAgIGlmIChhcmd1bWVudENvdW50ID4gMCkgewogICAgICAgICAgYXJndW1lbnRzQnVmLndyaXRlKCIsICIpOwogICAgICAgIH0KICAgICAgICBhcmd1bWVudHNCdWYud3JpdGUoaW50ZXJuYWwuU3ltYm9sLmNvbXB1dGVVbm1hbmdsZWROYW1lKGtleSkpOwogICAgICAgIGFyZ3VtZW50c0J1Zi53cml0ZSgiOiAiKTsKICAgICAgICBhcmd1bWVudHNCdWYud3JpdGUoRXJyb3Iuc2FmZVRvU3RyaW5nKHZhbHVlKSk7CiAgICAgICAgYXJndW1lbnRDb3VudCsrOwogICAgICB9KTsKICAgIH0KICAgIFN0cmluZyBleGlzdGluZ1NpZyA9CiAgICAgICAgX2V4aXN0aW5nTWV0aG9kU2lnbmF0dXJlKF9yZWNlaXZlciwgbWVtYmVyTmFtZSwgX2ludm9jYXRpb24uX3R5cGUpOwogICAgU3RyaW5nIGFyZ3NNc2cgPSBleGlzdGluZ1NpZyAhPSBudWxsID8gIiB3aXRoIG1hdGNoaW5nIGFyZ3VtZW50cyIgOiAiIjsKCiAgICBTdHJpbmcga2luZEJ1ZjsKICAgIGlmIChraW5kID49IDAgJiYga2luZCA8IDUpIHsKICAgICAga2luZEJ1ZiA9IChjb25zdCBbCiAgICAgICAgIm1ldGhvZCIsCiAgICAgICAgImdldHRlciIsCiAgICAgICAgInNldHRlciIsCiAgICAgICAgImdldHRlciBvciBzZXR0ZXIiLAogICAgICAgICJ2YXJpYWJsZSIKICAgICAgXSlba2luZF07CiAgICB9CgogICAgU3RyaW5nQnVmZmVyIG1zZ0J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIk5vU3VjaE1ldGhvZEVycm9yOiAiKTsKICAgIGJvb2wgaXNfdHlwZV9jYWxsID0gZmFsc2U7CiAgICBzd2l0Y2ggKGxldmVsKSB7CiAgICAgIGNhc2UgX0ludm9jYXRpb25NaXJyb3IuX0RZTkFNSUM6CiAgICAgICAgewogICAgICAgICAgaWYgKF9yZWNlaXZlciA9PSBudWxsKSB7CiAgICAgICAgICAgIGlmIChleGlzdGluZ1NpZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgbXNnQnVmLndyaXRlbG4oIlRoZSBudWxsIG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgJGtpbmRCdWYgIgogICAgICAgICAgICAgICAgICAiJyRtZW1iZXJOYW1lJyRhcmdzTXNnLiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG1zZ0J1Zi53cml0ZWxuKCJUaGUgJGtpbmRCdWYgJyRtZW1iZXJOYW1lJyB3YXMgY2FsbGVkIG9uIG51bGwuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChfcmVjZWl2ZXIgaXMgX0Nsb3N1cmUpIHsKICAgICAgICAgICAgICBtc2dCdWYud3JpdGVsbigiQ2xvc3VyZSBjYWxsIHdpdGggbWlzbWF0Y2hlZCBhcmd1bWVudHM6ICIKICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uICckbWVtYmVyTmFtZSciKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChfcmVjZWl2ZXIgaXMgX1R5cGUgJiYgbWVtYmVyTmFtZSA9PSAiY2FsbCIpIHsKICAgICAgICAgICAgICBpc190eXBlX2NhbGwgPSB0cnVlOwogICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gX3JlY2VpdmVyLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgbXNnQnVmLndyaXRlbG4oIkF0dGVtcHRlZCB0byB1c2UgdHlwZSAnJG5hbWUnIGFzIGEgZnVuY3Rpb24uICIKICAgICAgICAgICAgICAgICAgIlNpbmNlIHR5cGVzIGRvIG5vdCBkZWZpbmUgYSBtZXRob2QgJ2NhbGwnLCB0aGlzIGlzIG5vdCAiCiAgICAgICAgICAgICAgICAgICJwb3NzaWJsZS4gRGlkIHlvdSBpbnRlbmQgdG8gY2FsbCB0aGUgJG5hbWUgY29uc3RydWN0b3IgYW5kICIKICAgICAgICAgICAgICAgICAgImZvcmdldCB0aGUgJ25ldycgb3BlcmF0b3I/Iik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbXNnQnVmLndyaXRlbG4oIkNsYXNzICcke19yZWNlaXZlci5ydW50aW1lVHlwZX0nIGhhcyBubyBpbnN0YW5jZSAiCiAgICAgICAgICAgICAgICAgICIka2luZEJ1ZiAnJG1lbWJlck5hbWUnJGFyZ3NNc2cuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBfSW52b2NhdGlvbk1pcnJvci5fU1VQRVI6CiAgICAgICAgewogICAgICAgICAgbXNnQnVmLndyaXRlbG4oIlN1cGVyIGNsYXNzIG9mIGNsYXNzICcke19yZWNlaXZlci5ydW50aW1lVHlwZX0nIGhhcyAiCiAgICAgICAgICAgICAgIm5vIGluc3RhbmNlICRraW5kQnVmICckbWVtYmVyTmFtZSckYXJnc01zZy4iKTsKICAgICAgICAgIG1lbWJlck5hbWUgPSAic3VwZXIuJG1lbWJlck5hbWUiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIF9JbnZvY2F0aW9uTWlycm9yLl9TVEFUSUM6CiAgICAgICAgewogICAgICAgICAgbXNnQnVmLndyaXRlbG4oIk5vIHN0YXRpYyAka2luZEJ1ZiAnJG1lbWJlck5hbWUnJGFyZ3NNc2cgIgogICAgICAgICAgICAgICJkZWNsYXJlZCBpbiBjbGFzcyAnJF9yZWNlaXZlcicuIik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgX0ludm9jYXRpb25NaXJyb3IuX0NPTlNUUlVDVE9SOgogICAgICAgIHsKICAgICAgICAgIG1zZ0J1Zi53cml0ZWxuKCJObyBjb25zdHJ1Y3RvciAnJG1lbWJlck5hbWUnJGFyZ3NNc2cgZGVjbGFyZWQgIgogICAgICAgICAgICAgICJpbiBjbGFzcyAnJF9yZWNlaXZlcicuIik7CiAgICAgICAgICBtZW1iZXJOYW1lID0gIm5ldyAkbWVtYmVyTmFtZSI7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgX0ludm9jYXRpb25NaXJyb3IuX1RPUF9MRVZFTDoKICAgICAgICB7CiAgICAgICAgICBtc2dCdWYud3JpdGVsbigiTm8gdG9wLWxldmVsICRraW5kQnVmICckbWVtYmVyTmFtZSckYXJnc01zZyAiCiAgICAgICAgICAgICAgImRlY2xhcmVkLiIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChsZXZlbCA9PSBfSW52b2NhdGlvbk1pcnJvci5fVE9QX0xFVkVMKSB7CiAgICAgIG1zZ0J1Zi53cml0ZWxuKCJSZWNlaXZlcjogdG9wLWxldmVsIik7CiAgICB9IGVsc2UgewogICAgICBtc2dCdWYud3JpdGVsbigiUmVjZWl2ZXI6ICR7RXJyb3Iuc2FmZVRvU3RyaW5nKF9yZWNlaXZlcil9Iik7CiAgICB9CgogICAgaWYgKGtpbmQgPT0gX0ludm9jYXRpb25NaXJyb3IuX01FVEhPRCkgewogICAgICBTdHJpbmcgbSA9IGlzX3R5cGVfY2FsbCA/ICIkX3JlY2VpdmVyIiA6ICIkbWVtYmVyTmFtZSI7CiAgICAgIG1zZ0J1Zi53cml0ZSgiVHJpZWQgY2FsbGluZzogJG0iKTsKICAgICAgaWYgKHR5cGVBcmd1bWVudHNCdWYgIT0gbnVsbCkgewogICAgICAgIG1zZ0J1Zi53cml0ZSh0eXBlQXJndW1lbnRzQnVmKTsKICAgICAgfQogICAgICBtc2dCdWYud3JpdGUoIigkYXJndW1lbnRzQnVmKSIpOwogICAgfSBlbHNlIGlmIChhcmd1bWVudENvdW50ID09IDApIHsKICAgICAgbXNnQnVmLndyaXRlKCJUcmllZCBjYWxsaW5nOiAkbWVtYmVyTmFtZSIpOwogICAgfSBlbHNlIGlmIChraW5kID09IF9JbnZvY2F0aW9uTWlycm9yLl9TRVRURVIpIHsKICAgICAgbXNnQnVmLndyaXRlKCJUcmllZCBjYWxsaW5nOiAkbWVtYmVyTmFtZSRhcmd1bWVudHNCdWYiKTsKICAgIH0gZWxzZSB7CiAgICAgIG1zZ0J1Zi53cml0ZSgiVHJpZWQgY2FsbGluZzogJG1lbWJlck5hbWUgPSAkYXJndW1lbnRzQnVmIik7CiAgICB9CgogICAgaWYgKGV4aXN0aW5nU2lnICE9IG51bGwpIHsKICAgICAgbXNnQnVmLndyaXRlKCJcbkZvdW5kOiAkbWVtYmVyTmFtZSRleGlzdGluZ1NpZyIpOwogICAgfQoKICAgIHJldHVybiBtc2dCdWYudG9TdHJpbmcoKTsKICB9CgogIC8vIFRPRE8ocmVnaXMpOiBSZW1vdmUgdGhpcyBmdW5jdGlvbiBvbmNlIGRhcnQyanMgaXMgdXBkYXRlZC4KICBTdHJpbmcgX3RvU3RyaW5nRGVwcmVjYXRlZCgpIHsKICAgIHZhciBsZXZlbCA9IChfaW52b2NhdGlvbl90eXBlID4+IF9JbnZvY2F0aW9uTWlycm9yLl9MRVZFTF9TSElGVCkgJgogICAgICAgIF9JbnZvY2F0aW9uTWlycm9yLl9MRVZFTF9NQVNLOwogICAgdmFyIHR5cGUgPSBfaW52b2NhdGlvbl90eXBlICYgX0ludm9jYXRpb25NaXJyb3IuX0tJTkRfTUFTSzsKICAgIFN0cmluZyBtZW1iZXJOYW1lID0gKF9tZW1iZXJOYW1lID09IG51bGwpCiAgICAgICAgPyAiIgogICAgICAgIDogaW50ZXJuYWwuU3ltYm9sLmNvbXB1dGVVbm1hbmdsZWROYW1lKF9tZW1iZXJOYW1lKTsKCiAgICBpZiAodHlwZSA9PSBfSW52b2NhdGlvbk1pcnJvci5fTE9DQUxfVkFSKSB7CiAgICAgIHJldHVybiAiTm9TdWNoTWV0aG9kRXJyb3I6IENhbm5vdCBhc3NpZ24gdG8gZmluYWwgdmFyaWFibGUgJyRtZW1iZXJOYW1lJyI7CiAgICB9CgogICAgU3RyaW5nQnVmZmVyIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGludCBhcmd1bWVudENvdW50ID0gMDsKICAgIGlmIChfYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgZm9yICg7IGFyZ3VtZW50Q291bnQgPCBfYXJndW1lbnRzLmxlbmd0aDsgYXJndW1lbnRDb3VudCsrKSB7CiAgICAgICAgaWYgKGFyZ3VtZW50Q291bnQgPiAwKSB7CiAgICAgICAgICBhcmd1bWVudHMud3JpdGUoIiwgIik7CiAgICAgICAgfQogICAgICAgIGFyZ3VtZW50cy53cml0ZShFcnJvci5zYWZlVG9TdHJpbmcoX2FyZ3VtZW50c1thcmd1bWVudENvdW50XSkpOwogICAgICB9CiAgICB9CiAgICBpZiAoX25hbWVkQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgX25hbWVkQXJndW1lbnRzLmZvckVhY2goKFN5bWJvbCBrZXksIHZhciB2YWx1ZSkgewogICAgICAgIGlmIChhcmd1bWVudENvdW50ID4gMCkgewogICAgICAgICAgYXJndW1lbnRzLndyaXRlKCIsICIpOwogICAgICAgIH0KICAgICAgICBhcmd1bWVudHMud3JpdGUoaW50ZXJuYWwuU3ltYm9sLmNvbXB1dGVVbm1hbmdsZWROYW1lKGtleSkpOwogICAgICAgIGFyZ3VtZW50cy53cml0ZSgiOiAiKTsKICAgICAgICBhcmd1bWVudHMud3JpdGUoRXJyb3Iuc2FmZVRvU3RyaW5nKHZhbHVlKSk7CiAgICAgICAgYXJndW1lbnRDb3VudCsrOwogICAgICB9KTsKICAgIH0KICAgIGJvb2wgYXJnc19taXNtYXRjaCA9IF9leGlzdGluZ0FyZ3VtZW50TmFtZXMgIT0gbnVsbDsKICAgIFN0cmluZyBhcmdzX21lc3NhZ2UgPSBhcmdzX21pc21hdGNoID8gIiB3aXRoIG1hdGNoaW5nIGFyZ3VtZW50cyIgOiAiIjsKCiAgICBTdHJpbmcgdHlwZV9zdHI7CiAgICBpZiAodHlwZSA+PSAwICYmIHR5cGUgPCA1KSB7CiAgICAgIHR5cGVfc3RyID0gKGNvbnN0IFsKICAgICAgICAibWV0aG9kIiwKICAgICAgICAiZ2V0dGVyIiwKICAgICAgICAic2V0dGVyIiwKICAgICAgICAiZ2V0dGVyIG9yIHNldHRlciIsCiAgICAgICAgInZhcmlhYmxlIgogICAgICBdKVt0eXBlXTsKICAgIH0KCiAgICBTdHJpbmdCdWZmZXIgbXNnX2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIk5vU3VjaE1ldGhvZEVycm9yOiAiKTsKICAgIGJvb2wgaXNfdHlwZV9jYWxsID0gZmFsc2U7CiAgICBzd2l0Y2ggKGxldmVsKSB7CiAgICAgIGNhc2UgX0ludm9jYXRpb25NaXJyb3IuX0RZTkFNSUM6CiAgICAgICAgewogICAgICAgICAgaWYgKF9yZWNlaXZlciA9PSBudWxsKSB7CiAgICAgICAgICAgIGlmIChhcmdzX21pc21hdGNoKSB7CiAgICAgICAgICAgICAgbXNnX2J1Zi53cml0ZWxuKCJUaGUgbnVsbCBvYmplY3QgZG9lcyBub3QgaGF2ZSBhICR0eXBlX3N0ciAiCiAgICAgICAgICAgICAgICAgICInJG1lbWJlck5hbWUnJGFyZ3NfbWVzc2FnZS4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBtc2dfYnVmCiAgICAgICAgICAgICAgICAgIC53cml0ZWxuKCJUaGUgJHR5cGVfc3RyICckbWVtYmVyTmFtZScgd2FzIGNhbGxlZCBvbiBudWxsLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoX3JlY2VpdmVyIGlzIF9DbG9zdXJlKSB7CiAgICAgICAgICAgICAgbXNnX2J1Zi53cml0ZWxuKCJDbG9zdXJlIGNhbGwgd2l0aCBtaXNtYXRjaGVkIGFyZ3VtZW50czogIgogICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gJyRtZW1iZXJOYW1lJyIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKF9yZWNlaXZlciBpcyBfVHlwZSAmJiBtZW1iZXJOYW1lID09ICJjYWxsIikgewogICAgICAgICAgICAgIGlzX3R5cGVfY2FsbCA9IHRydWU7CiAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBfcmVjZWl2ZXIudG9TdHJpbmcoKTsKICAgICAgICAgICAgICBtc2dfYnVmLndyaXRlbG4oIkF0dGVtcHRlZCB0byB1c2UgdHlwZSAnJG5hbWUnIGFzIGEgZnVuY3Rpb24uICIKICAgICAgICAgICAgICAgICAgIlNpbmNlIHR5cGVzIGRvIG5vdCBkZWZpbmUgYSBtZXRob2QgJ2NhbGwnLCB0aGlzIGlzIG5vdCAiCiAgICAgICAgICAgICAgICAgICJwb3NzaWJsZS4gRGlkIHlvdSBpbnRlbmQgdG8gY2FsbCB0aGUgJG5hbWUgY29uc3RydWN0b3IgYW5kICIKICAgICAgICAgICAgICAgICAgImZvcmdldCB0aGUgJ25ldycgb3BlcmF0b3I/Iik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbXNnX2J1ZgogICAgICAgICAgICAgICAgICAud3JpdGVsbigiQ2xhc3MgJyR7X3JlY2VpdmVyLnJ1bnRpbWVUeXBlfScgaGFzIG5vIGluc3RhbmNlICIKICAgICAgICAgICAgICAgICAgICAgICIkdHlwZV9zdHIgJyRtZW1iZXJOYW1lJyRhcmdzX21lc3NhZ2UuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBfSW52b2NhdGlvbk1pcnJvci5fU1VQRVI6CiAgICAgICAgewogICAgICAgICAgbXNnX2J1Zi53cml0ZWxuKCJTdXBlciBjbGFzcyBvZiBjbGFzcyAnJHtfcmVjZWl2ZXIucnVudGltZVR5cGV9JyBoYXMgIgogICAgICAgICAgICAgICJubyBpbnN0YW5jZSAkdHlwZV9zdHIgJyRtZW1iZXJOYW1lJyRhcmdzX21lc3NhZ2UuIik7CiAgICAgICAgICBtZW1iZXJOYW1lID0gInN1cGVyLiRtZW1iZXJOYW1lIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBfSW52b2NhdGlvbk1pcnJvci5fU1RBVElDOgogICAgICAgIHsKICAgICAgICAgIG1zZ19idWYud3JpdGVsbigiTm8gc3RhdGljICR0eXBlX3N0ciAnJG1lbWJlck5hbWUnJGFyZ3NfbWVzc2FnZSAiCiAgICAgICAgICAgICAgImRlY2xhcmVkIGluIGNsYXNzICckX3JlY2VpdmVyJy4iKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBfSW52b2NhdGlvbk1pcnJvci5fQ09OU1RSVUNUT1I6CiAgICAgICAgewogICAgICAgICAgbXNnX2J1Zi53cml0ZWxuKCJObyBjb25zdHJ1Y3RvciAnJG1lbWJlck5hbWUnJGFyZ3NfbWVzc2FnZSBkZWNsYXJlZCAiCiAgICAgICAgICAgICAgImluIGNsYXNzICckX3JlY2VpdmVyJy4iKTsKICAgICAgICAgIG1lbWJlck5hbWUgPSAibmV3ICRtZW1iZXJOYW1lIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBfSW52b2NhdGlvbk1pcnJvci5fVE9QX0xFVkVMOgogICAgICAgIHsKICAgICAgICAgIG1zZ19idWYud3JpdGVsbigiTm8gdG9wLWxldmVsICR0eXBlX3N0ciAnJG1lbWJlck5hbWUnJGFyZ3NfbWVzc2FnZSAiCiAgICAgICAgICAgICAgImRlY2xhcmVkLiIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChsZXZlbCA9PSBfSW52b2NhdGlvbk1pcnJvci5fVE9QX0xFVkVMKSB7CiAgICAgIG1zZ19idWYud3JpdGVsbigiUmVjZWl2ZXI6IHRvcC1sZXZlbCIpOwogICAgfSBlbHNlIHsKICAgICAgbXNnX2J1Zi53cml0ZWxuKCJSZWNlaXZlcjogJHtFcnJvci5zYWZlVG9TdHJpbmcoX3JlY2VpdmVyKX0iKTsKICAgIH0KCiAgICBpZiAodHlwZSA9PSBfSW52b2NhdGlvbk1pcnJvci5fTUVUSE9EKSB7CiAgICAgIFN0cmluZyBtID0gaXNfdHlwZV9jYWxsID8gIiRfcmVjZWl2ZXIiIDogIiRtZW1iZXJOYW1lIjsKICAgICAgbXNnX2J1Zi53cml0ZSgiVHJpZWQgY2FsbGluZzogJG0oJGFyZ3VtZW50cykiKTsKICAgIH0gZWxzZSBpZiAoYXJndW1lbnRDb3VudCA9PSAwKSB7CiAgICAgIG1zZ19idWYud3JpdGUoIlRyaWVkIGNhbGxpbmc6ICRtZW1iZXJOYW1lIik7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gX0ludm9jYXRpb25NaXJyb3IuX1NFVFRFUikgewogICAgICBtc2dfYnVmLndyaXRlKCJUcmllZCBjYWxsaW5nOiAkbWVtYmVyTmFtZSRhcmd1bWVudHMiKTsKICAgIH0gZWxzZSB7CiAgICAgIG1zZ19idWYud3JpdGUoIlRyaWVkIGNhbGxpbmc6ICRtZW1iZXJOYW1lID0gJGFyZ3VtZW50cyIpOwogICAgfQoKICAgIGlmIChhcmdzX21pc21hdGNoKSB7CiAgICAgIFN0cmluZ0J1ZmZlciBmb3JtYWxQYXJhbWV0ZXJzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9leGlzdGluZ0FyZ3VtZW50TmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgIGZvcm1hbFBhcmFtZXRlcnMud3JpdGUoIiwgIik7CiAgICAgICAgfQogICAgICAgIGZvcm1hbFBhcmFtZXRlcnMud3JpdGUoX2V4aXN0aW5nQXJndW1lbnROYW1lc1tpXSk7CiAgICAgIH0KICAgICAgbXNnX2J1Zi53cml0ZSgiXG5Gb3VuZDogJG1lbWJlck5hbWUoJGZvcm1hbFBhcmFtZXRlcnMpIik7CiAgICB9CgogICAgcmV0dXJuIG1zZ19idWYudG9TdHJpbmcoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0NvbXBpbGVUaW1lRXJyb3IgZXh0ZW5kcyBFcnJv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OiBTaG91bGQgd2U/IFdoeSBub3QgdGhlIHNhbWUgYmVsb3cgZm9yIHRoZSB1bmFyeSBjYXNlPwogICAgcmV0dXJuIChlcnJvckhhbmRsZXIgYXMgZHluYW1pYykoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0gZWxzZSB7CiAgICBab25lVW5hcnlDYWxsYmFjayB1bmFyeUVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjsKICAgIHJldHVybiB1bmFyeUVycm9ySGFuZGxlcihlcnJvcik7CiAgfQp9ChUATk48ARQBFUJBR0slSDkLOCUEAgEbZGFydDphc3luYy9hc3luY19lcnJvci5kYXJ0Nm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb2xsZWN0aW9uL2NvbGxlY3Rpb24uZGFydIMzLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBDbGFzc2VzIGFuZCB1dGlsaXRpZXMgdGhhdCBzdXBwbGVtZW50IHRoZSBjb2xsZWN0aW9uIHN1cHBvcnQgaW4gZGFydDpjb3JlLgovLy8KLy8vIFRvIHVzZSB0aGlzIGxpYnJhcnkgaW4geW91ciBjb2RlOgovLy8KLy8vICAgICBpbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7Ci8vLwovLy8ge0BjYXRlZ29yeSBDb3JlfQpsaWJyYXJ5IGRhcnQuY29sbGVjdGlvbjsKCmltcG9ydCAnZGFydDpfaW50ZXJuYWwnIGhpZGUgU3ltYm9sOwppbXBvcnQgJ2RhcnQ6bWF0aCcgc2hvdyBSYW5kb207IC8vIFVzZWQgYnkgTGlzdE1peGluLnNodWZmbGUuCgpwYXJ0ICdjb2xsZWN0aW9ucy5kYXJ0JzsKcGFydCAnaGFzaF9tYXAuZGFydCc7CnBhcnQgJ2hhc2hfc2V0LmRhcnQnOwpwYXJ0ICdpdGVyYWJsZS5kYXJ0JzsKcGFydCAnaXRlcmF0b3IuZGFydCc7CnBhcnQgJ2xpbmtlZF9oYXNoX21hcC5kYXJ0JzsKcGFydCAnbGlua2VkX2hhc2hfc2V0LmRhcnQnOwpwYXJ0ICdsaW5rZWRfbGlzdC5kYXJ0JzsKcGFydCAnbGlzdC5kYXJ0JzsKcGFydCAnbWFwcy5kYXJ0JzsKcGFydCAncXVldWUuZGFydCc7CnBhcnQgJ3NldC5kYXJ0JzsKcGFydCAnc3BsYXlfdHJlZS5kYXJ0JzsKHwBOTjwBTwQmBCIEFRkBJT4BGRYWFhYdHRkSEhMRGAEPZGFydDpjb2xsZWN0aW9uNG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb2xsZWN0aW9uL2hhc2hfbWFwLmRhcnSZMy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29sbGVjdGlvbjsKCi8vLyBEZWZhdWx0IGZ1bmN0aW9uIGZvciBlcXVhbGl0eSBjb21wYXJpc29uIGluIGN1c3RvbWl6ZWQgSGFzaE1hcHMKYm9vbCBfZGVmYXVsdEVxdWFscyhhLCBiKSA9PiBhID09IGI7CgovLy8gRGVmYXVsdCBmdW5jdGlvbiBmb3IgaGFzaC1jb2RlIGNvbXB1dGF0aW9uIGluIGN1c3RvbWl6ZWQgSGFzaE1hcHMKaW50IF9kZWZhdWx0SGFzaENvZGUoYSkgPT4gYS5oYXNoQ29kZTsKCi8vLyBUeXBlIG9mIGN1c3RvbSBlcXVhbGl0eSBmdW5jdGlvbgp0eXBlZGVmIF9FcXVhbGl0eTxLPiA9IGJvb2wgRnVuY3Rpb24oSyBhLCBLIGIpOwoKLy8vIFR5cGUgb2YgY3VzdG9tIGhhc2ggY29kZSBmdW5jdGlvbi4KdHlwZWRlZiBfSGFzaGVyPEs+ID0gaW50IEZ1bmN0aW9uKEsgb2JqZWN0KTsKCi8vLyBBIGhhc2gtdGFibGUgYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgW01hcF0uCi8vLwovLy8gVGhlIGtleXMgb2YgYSBgSGFzaE1hcGAgbXVzdCBoYXZlIGNvbnNpc3RlbnQgW09iamVjdC49PV0KLy8vIGFuZCBbT2JqZWN0Lmhhc2hDb2RlXSBpbXBsZW1lbnRhdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYD09YCBvcGVyYXRvcgovLy8gbXVzdCBkZWZpbmUgYSBzdGFibGUgZXF1aXZhbGVuY2UgcmVsYXRpb24gb24gdGhlIGtleXMgKHJlZmxleGl2ZSwKLy8vIHN5bW1ldHJpYywgdHJhbnNpdGl2ZSwgYW5kIGNvbnNpc3RlbnQgb3ZlciB0aW1lKSwgYW5kIHRoYXQgYGhhc2hDb2RlYAovLy8gbXVzdCBiZSB0aGUgc2FtZSBmb3Igb2JqZWN0cyB0aGF0IGFyZSBjb25zaWRlcmVkIGVxdWFsIGJ5IGA9PWAuCi8vLwovLy8gVGhlIG1hcCBhbGxvd3MgYG51bGxgIGFzIGEga2V5LgovLy8KLy8vIEl0ZXJhdGluZyB0aGUgbWFwJ3Mga2V5cywgdmFsdWVzIG9yIGVudHJpZXMgKHRocm91Z2ggW2ZvckVhY2hdKQovLy8gbWF5IGhhcHBlbiBpbiBhbnkgb3JkZXIuCi8vLyBUaGUgaXRlcmF0aW9uIG9yZGVyIG9ubHkgY2hhbmdlcyB3aGVuIHRoZSBtYXAgaXMgbW9kaWZpZWQuCi8vLyBWYWx1ZXMgYXJlIGl0ZXJhdGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZWlyIGFzc29jaWF0ZWQga2V5cywKLy8vIHNvIGl0ZXJhdGluZyB0aGUgW2tleXNdIGFuZCBbdmFsdWVzXSBpbiBwYXJhbGxlbAovLy8gd2lsbCBnaXZlIG1hdGNoaW5nIGtleSBhbmQgdmFsdWUgcGFpcnMuCmFic3RyYWN0IGNsYXNzIEhhc2hNYXA8SywgVj4gaW1wbGVtZW50cyBNYXA8SywgVj4gewogIC8vLyBDcmVhdGVzIGFuIHVub3JkZXJlZCBoYXNoLXRhYmxlIGJhc2VkIFtNYXBdLgogIC8vLwogIC8vLyBUaGUgY3JlYXRlZCBtYXAgaXMgbm90IG9yZGVyZWQgaW4gYW55IHdheS4gV2hlbiBpdGVyYXRpbmcgdGhlIGtleXMgb3IKICAvLy8gdmFsdWVzLCB0aGUgaXRlcmF0aW9uIG9yZGVyIGlzIHVuc3BlY2lmaWVkIGV4Y2VwdCB0aGF0IGl0IHdpbGwgc3RheSB0aGUKICAvLy8gc2FtZSBhcyBsb25nIGFzIHRoZSBtYXAgaXNuJ3QgY2hhbmdlZC4KICAvLy8KICAvLy8gSWYgW2VxdWFsc10gaXMgcHJvdmlkZWQsIGl0IGlzIHVzZWQgdG8gY29tcGFyZSB0aGUga2V5cyBpbiB0aGUgdGFibGUgd2l0aAogIC8vLyBuZXcga2V5cy4gSWYgW2VxdWFsc10gaXMgb21pdHRlZCwgdGhlIGtleSdzIG93biBbT2JqZWN0Lj09XSBpcyB1c2VkCiAgLy8vIGluc3RlYWQuCiAgLy8vCiAgLy8vIFNpbWlsYXIsIGlmIFtoYXNoQ29kZV0gaXMgcHJvdmlkZWQsIGl0IGlzIHVzZWQgdG8gcHJvZHVjZSBhIGhhc2ggdmFsdWUKICAvLy8gZm9yIGtleXMgaW4gb3JkZXIgdG8gcGxhY2UgdGhlbSBpbiB0aGUgaGFzaCB0YWJsZS4gSWYgaXQgaXMgb21pdHRlZCwgdGhlCiAgLy8vIGtleSdzIG93biBbT2JqZWN0Lmhhc2hDb2RlXSBpcyB1c2VkLgogIC8vLwogIC8vLyBJZiB1c2luZyBtZXRob2RzIGxpa2UgW29wZXJhdG9yIFtdXSwgW3JlbW92ZV0gYW5kIFtjb250YWluc0tleV0gdG9nZXRoZXIKICAvLy8gd2l0aCBhIGN1c3RvbSBlcXVhbGl0eSBhbmQgaGFzaGNvZGUsIGFuIGV4dHJhIGBpc1ZhbGlkS2V5YCBmdW5jdGlvbgogIC8vLyBjYW4gYmUgc3VwcGxpZWQuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIFtlcXVhbHNdIG9yCiAgLy8vIFtoYXNoQ29kZV0gd2l0aCBhbiBhcmd1bWVudCB0aGF0IG1heSBub3QgYmUgYSBbS10gaW5zdGFuY2UsIGFuZCBpZiB0aGUKICAvLy8gY2FsbCByZXR1cm5zIGZhbHNlLCB0aGUga2V5IGlzIGFzc3VtZWQgdG8gbm90IGJlIGluIHRoZSBzZXQuCiAgLy8vIFRoZSBbaXNWYWxpZEtleV0gZnVuY3Rpb24gZGVmYXVsdHMgdG8ganVzdCB0ZXN0aW5nIGlmIHRoZSBvYmplY3QgaXMgYQogIC8vLyBbS10gaW5zdGFuY2UuCiAgLy8vCiAgLy8vIEV4YW1wbGU6CiAgLy8vCiAgLy8vICAgICBuZXcgSGFzaE1hcDxpbnQsaW50PihlcXVhbHM6IChpbnQgYSwgaW50IGIpID0+IChiIC0gYSkgJSA1ID09IDAsCiAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogKGludCBlKSA9PiBlICUgNSkKICAvLy8KICAvLy8gVGhpcyBleGFtcGxlIG1hcCBkb2VzIG5vdCBuZWVkIGFuIGBpc1ZhbGlkS2V5YCBmdW5jdGlvbiB0byBiZSBwYXNzZWQuCiAgLy8vIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIGFjY2VwdHMgb25seSBgaW50YCB2YWx1ZXMsIHdoaWNoIGNhbiBzYWZlbHkgYmUKICAvLy8gcGFzc2VkIHRvIGJvdGggdGhlIGBlcXVhbHNgIGFuZCBgaGFzaENvZGVgIGZ1bmN0aW9ucy4KICAvLy8KICAvLy8gSWYgbmVpdGhlciBgZXF1YWxzYCwgYGhhc2hDb2RlYCwgbm9yIGBpc1ZhbGlkS2V5YCBpcyBwcm92aWRlZCwKICAvLy8gdGhlIGRlZmF1bHQgYGlzVmFsaWRLZXlgIGluc3RlYWQgYWNjZXB0cyBhbGwga2V5cy4KICAvLy8gVGhlIGRlZmF1bHQgZXF1YWxpdHkgYW5kIGhhc2hjb2RlIG9wZXJhdGlvbnMgYXJlIGFzc3VtZWQgdG8gd29yayBvbiBhbGwKICAvLy8gb2JqZWN0cy4KICAvLy8KICAvLy8gTGlrZXdpc2UsIGlmIGBlcXVhbHNgIGlzIFtpZGVudGljYWxdLCBgaGFzaENvZGVgIGlzIFtpZGVudGl0eUhhc2hDb2RlXQogIC8vLyBhbmQgYGlzVmFsaWRLZXlgIGlzIG9taXR0ZWQsIHRoZSByZXN1bHRpbmcgbWFwIGlzIGlkZW50aXR5IGJhc2VkLAogIC8vLyBhbmQgdGhlIGBpc1ZhbGlkS2V5YCBkZWZhdWx0cyB0byBhY2NlcHRpbmcgYWxsIGtleXMuCiAgLy8vIFN1Y2ggYSBtYXAgY2FuIGJlIGNyZWF0ZWQgZGlyZWN0bHkgdXNpbmcgW0hhc2hNYXAuaWRlbnRpdHldLgogIC8vLwogIC8vLyBUaGUgdXNlZCBgZXF1YWxzYCBhbmQgYGhhc2hDb2RlYCBtZXRob2Qgc2hvdWxkIGFsd2F5cyBiZSBjb25zaXN0ZW50LAogIC8vLyBzbyB0aGF0IGlmIGBlcXVhbHMoYSwgYilgIHRoZW4gYGhhc2hDb2RlKGEpID09IGhhc2hDb2RlKGIpYC4gVGhlIGhhc2gKICAvLy8gb2YgYW4gb2JqZWN0LCBvciB3aGF0IGl0IGNvbXBhcmVzIGVxdWFsIHRvLCBzaG91bGQgbm90IGNoYW5nZSB3aGlsZSB0aGUKICAvLy8gb2JqZWN0IGlzIGEga2V5IGluIHRoZSBtYXAuIElmIGl0IGRvZXMgY2hhbmdlLCB0aGUgcmVzdWx0IGlzCiAgLy8vIHVucHJlZGljdGFibGUuCiAgLy8vCiAgLy8vIElmIHlvdSBzdXBwbHkgb25lIG9mIFtlcXVhbHNdIGFuZCBbaGFzaENvZGVdLAogIC8vLyB5b3Ugc2hvdWxkIGdlbmVyYWxseSBhbHNvIHRvIHN1cHBseSB0aGUgb3RoZXIuCiAgZXh0ZXJuYWwgZmFjdG9yeSBIYXNoTWFwKAogICAgICB7Ym9vbCBlcXVhbHMoSyBrZXkxLCBLIGtleTIpLAogICAgICBpbnQgaGFzaENvZGUoSyBrZXkpLAogICAgICBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KX0pOwoKICAvLy8gQ3JlYXRlcyBhbiB1bm9yZGVyZWQgaWRlbnRpdHktYmFzZWQgbWFwLgogIC8vLwogIC8vLyBFZmZlY3RpdmVseSBhIHNob3J0aGFuZCBmb3I6CiAgLy8vCiAgLy8vICAgICBuZXcgSGFzaE1hcDxLLCBWPihlcXVhbHM6IGlkZW50aWNhbCwKICAvLy8gICAgICAgICAgICAgICAgICAgICAgIGhhc2hDb2RlOiBpZGVudGl0eUhhc2hDb2RlKQogIGV4dGVybmFsIGZhY3RvcnkgSGFzaE1hcC5pZGVudGl0eSgpOwoKICAvLy8gQ3JlYXRlcyBhIFtIYXNoTWFwXSB0aGF0IGNvbnRhaW5zIGFsbCBrZXkvdmFsdWUgcGFpcnMgb2YgW290aGVyXS4KICAvLy8KICAvLy8gVGhlIGtleXMgbXVzdCBhbGwgYmUgaW5zdGFuY2VzIG9mIFtLXSBhbmQgdGhlIHZhbHVlcyBvZiBbVl0uCiAgLy8vIFRoZSBbb3RoZXJdIG1hcCBpdHNlbGYgY2FuIGhhdmUgYW55IHR5cGUuCiAgZmFjdG9yeSBIYXNoTWFwLmZyb20oTWFwIG90aGVyKSB7CiAgICBNYXA8SywgVj4gcmVzdWx0ID0gSGFzaE1hcDxLLCBWPigpOwogICAgb3RoZXIuZm9yRWFjaCgoaywgdikgewogICAgICByZXN1bHRba10gPSB2OwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENyZWF0ZXMgYSBbSGFzaE1hcF0gdGhhdCBjb250YWlucyBhbGwga2V5L3ZhbHVlIHBhaXJzIG9mIFtvdGhlcl0uCiAgZmFjdG9yeSBIYXNoTWFwLm9mKE1hcDxLLCBWPiBvdGhlcikgPT4gSGFzaE1hcDxLLCBWPigpLi5hZGRBbGwob3RoZXIpOwoKICAvLy8gQ3JlYXRlcyBhIFtIYXNoTWFwXSB3aGVyZSB0aGUga2V5cyBhbmQgdmFsdWVzIGFyZSBjb21wdXRlZCBmcm9tIHRoZQogIC8vLyBbaXRlcmFibGVdLgogIC8vLwogIC8vLyBGb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBbaXRlcmFibGVdIHRoaXMgY29uc3RydWN0b3IgY29tcHV0ZXMgYSBrZXkvdmFsdWUKICAvLy8gcGFpciwgYnkgYXBwbHlpbmcgW2tleV0gYW5kIFt2YWx1ZV0gcmVzcGVjdGl2ZWx5LgogIC8vLwogIC8vLyBUaGUga2V5cyBvZiB0aGUga2V5L3ZhbHVlIHBhaXJzIGRvIG5vdCBuZWVkIHRvIGJlIHVuaXF1ZS4gVGhlIGxhc3QKICAvLy8gb2NjdXJyZW5jZSBvZiBhIGtleSB3aWxsIHNpbXBseSBvdmVyd3JpdGUgYW55IHByZXZpb3VzIHZhbHVlLgogIC8vLwogIC8vLyBJZiBubyB2YWx1ZXMgYXJlIHNwZWNpZmllZCBmb3IgW2tleV0gYW5kIFt2YWx1ZV0gdGhlIGRlZmF1bHQgaXMgdGhlCiAgLy8vIGlkZW50aXR5IGZ1bmN0aW9uLgogIGZhY3RvcnkgSGFzaE1hcC5mcm9tSXRlcmFibGUoSXRlcmFibGUgaXRlcmFibGUsCiAgICAgIHtLIGtleShlbGVtZW50KSwgViB2YWx1ZShlbGVtZW50KX0pIHsKICAgIE1hcDxLLCBWPiBtYXAgPSBIYXNoTWFwPEssIFY+KCk7CiAgICBNYXBCYXNlLl9maWxsTWFwV2l0aE1hcHBlZEl0ZXJhYmxlKG1hcCwgaXRlcmFibGUsIGtleSwgdmFsdWUpOwogICAgcmV0dXJuIG1hcDsKICB9CgogIC8vLyBDcmVhdGVzIGEgW0hhc2hNYXBdIGFzc29jaWF0aW5nIHRoZSBnaXZlbiBba2V5c10gdG8gW3ZhbHVlc10uCiAgLy8vCiAgLy8vIFRoaXMgY29uc3RydWN0b3IgaXRlcmF0ZXMgb3ZlciBba2V5c10gYW5kIFt2YWx1ZXNdIGFuZCBtYXBzIGVhY2ggZWxlbWVudAogIC8vLyBvZiBba2V5c10gdG8gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBbdmFsdWVzXS4KICAvLy8KICAvLy8gSWYgW2tleXNdIGNvbnRhaW5zIHRoZSBzYW1lIG9iamVjdCBtdWx0aXBsZSB0aW1lcywgdGhlIGxhc3Qgb2NjdXJyZW5jZQogIC8vLyBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyB2YWx1ZS4KICAvLy8KICAvLy8gSXQgaXMgYW4gZXJyb3IgaWYgdGhlIHR3byBbSXRlcmFibGVdcyBkb24ndCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4KICBmYWN0b3J5IEhhc2hNYXAuZnJvbUl0ZXJhYmxlcyhJdGVyYWJsZTxLPiBrZXlzLCBJdGVyYWJsZTxWPiB2YWx1ZXMpIHsKICAgIE1hcDxLLCBWPiBtYXAgPSBIYXNoTWFwPEssIFY+KCk7CiAgICBNYXBCYXNlLl9maWxsTWFwV2l0aEl0ZXJhYmxlcyhtYXAsIGtleXMsIHZhbHVlcyk7CiAgICByZXR1cm4gbWFwOwogIH0KCiAgLy8vIENyZWF0ZXMgYSBbSGFzaE1hcF0gY29udGFpbmluZyB0aGUgZW50cmllcyBvZiBbZW50cmllc10uCiAgLy8vCiAgLy8vIFJldHVybnMgYSBuZXcgYEhhc2hNYXA8SywgVj5gIHdoZXJlIGFsbCBlbnRyaWVzIG9mIFtlbnRyaWVzXQogIC8vLyBoYXZlIGJlZW4gYWRkZWQgaW4gaXRlcmF0aW9uIG9yZGVyLgogIC8vLwogIC8vLyBJZiBtdWx0aXBsZSBbZW50cmllc10gaGF2ZSB0aGUgc2FtZSBrZXksCiAgLy8vIGxhdGVyIG9jY3VycmVuY2VzIG92ZXJ3cml0ZSB0aGUgZWFybGllciBvbmVzLgogIEBTaW5jZSgiMi4xIikKICBmYWN0b3J5IEhhc2hNYXAuZnJvbUVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGVudHJpZXMpID0+CiAgICAgIEhhc2hNYXA8SywgVj4oKS4uYWRkRW50cmllcyhlbnRyaWVzKTsKfQqAngBOTjwBGQFEJQFGJwElMAEnLQEwBD1NRkpEBCQERB0/RDUsNDMGTE4tBlBKDwZNTysGT0pKTUNMFAYPBks7BkxKPAZFOU4PBk1IO0MGS0xOQxUGNDUcJBsnAS8GIwYvOCcBSAZDMCQoGxUIEwQBSEkBShIGTzgGSUQGShkyLCVDEAQBRAZPOgZNJQZISCU2EAQBPwZDKgYvNBBDLAIBHWRhcnQ6Y29sbGVjdGlvbi9oYXNoX21hcC5kYXJ0Nm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb2xsZWN0aW9uL3NwbGF5X3RyZWUuZGFydMAAZ2QvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbGxlY3Rpb247Cgp0eXBlZGVmIF9QcmVkaWNhdGU8VD4gPSBib29sIEZ1bmN0aW9uKFQgdmFsdWUpOwoKLy8vIEEgbm9kZSBpbiBhIHNwbGF5IHRyZWUuIEl0IGhvbGRzIHRoZSBzb3J0aW5nIGtleSBhbmQgdGhlIGxlZnQKLy8vIGFuZCByaWdodCBjaGlsZHJlbiBpbiB0aGUgdHJlZS4KY2xhc3MgX1NwbGF5VHJlZU5vZGU8Sz4gewogIGZpbmFsIEsga2V5OwogIF9TcGxheVRyZWVOb2RlPEs+IGxlZnQ7CiAgX1NwbGF5VHJlZU5vZGU8Sz4gcmlnaHQ7CgogIF9TcGxheVRyZWVOb2RlKHRoaXMua2V5KTsKfQoKLy8vIEEgbm9kZSBpbiBhIHNwbGF5IHRyZWUgYmFzZWQgbWFwLgovLy8KLy8vIEEgW19TcGxheVRyZWVOb2RlXSB0aGF0IGFsc28gY29udGFpbnMgYSB2YWx1ZQpjbGFzcyBfU3BsYXlUcmVlTWFwTm9kZTxLLCBWPiBleHRlbmRzIF9TcGxheVRyZWVOb2RlPEs+IHsKICBWIHZhbHVlOwogIF9TcGxheVRyZWVNYXBOb2RlKEsga2V5LCB0aGlzLnZhbHVlKSA6IHN1cGVyKGtleSk7Cn0KCi8vLyBBIHNwbGF5IHRyZWUgaXMgYSBzZWxmLWJhbGFuY2luZyBiaW5hcnkgc2VhcmNoIHRyZWUuCi8vLwovLy8gSXQgaGFzIHRoZSBhZGRpdGlvbmFsIHByb3BlcnR5IHRoYXQgcmVjZW50bHkgYWNjZXNzZWQgZWxlbWVudHMKLy8vIGFyZSBxdWljayB0byBhY2Nlc3MgYWdhaW4uCi8vLyBJdCBwZXJmb3JtcyBiYXNpYyBvcGVyYXRpb25zIHN1Y2ggYXMgaW5zZXJ0aW9uLCBsb29rLXVwIGFuZAovLy8gcmVtb3ZhbCwgaW4gTyhsb2cobikpIGFtb3J0aXplZCB0aW1lLgphYnN0cmFjdCBjbGFzcyBfU3BsYXlUcmVlPEssIE5vZGUgZXh0ZW5kcyBfU3BsYXlUcmVlTm9kZTxLPj4gewogIC8vIFRoZSByb290IG5vZGUgb2YgdGhlIHNwbGF5IHRyZWUuIEl0IHdpbGwgY29udGFpbiBlaXRoZXIgdGhlIGxhc3QKICAvLyBlbGVtZW50IGluc2VydGVkIG9yIHRoZSBsYXN0IGVsZW1lbnQgbG9va2VkIHVwLgogIE5vZGUgZ2V0IF9yb290OwogIHNldCBfcm9vdChOb2RlIG5ld1ZhbHVlKTsKCiAgLy8gVGhlIGR1bW15IG5vZGUgdXNlZCB3aGVuIHBlcmZvcm1pbmcgYSBzcGxheSBvbiB0aGUgdHJlZS4gUmV1c2luZyBpdAogIC8vIGF2b2lkcyBhbGxvY2F0aW5nIGEgbm9kZSBlYWNoIHRpbWUgYSBzcGxheSBpcyBwZXJmb3JtZWQuCiAgTm9kZSBnZXQgX2R1bW15OwoKICAvLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNwbGF5IHRyZWUuCiAgaW50IF9jb3VudCA9IDA7CgogIC8vLyBDb3VudGVyIGluY3JlbWVudGVkIHdoZW5ldmVyIHRoZSBrZXlzIGluIHRoZSBtYXAgY2hhbmdlcy4KICAvLy8KICAvLy8gVXNlZCB0byBkZXRlY3QgY29uY3VycmVudCBtb2RpZmljYXRpb25zLgogIGludCBfbW9kaWZpY2F0aW9uQ291bnQgPSAwOwoKICAvLy8gQ291bnRlciBpbmNyZW1lbnRlZCB3aGVuZXZlciB0aGUgdHJlZSBzdHJ1Y3R1cmUgY2hhbmdlcy4KICAvLy8KICAvLy8gVXNlZCB0byBkZXRlY3QgdGhhdCBhbiBpbi1wbGFjZSB0cmF2ZXJzYWwgY2Fubm90IHVzZQogIC8vLyBjYWNoZWQgaW5mb3JtYXRpb24gdGhhdCByZWxpZXMgb24gdGhlIHRyZWUgc3RydWN0dXJlLgogIGludCBfc3BsYXlDb3VudCA9IDA7CgogIC8vLyBUaGUgY29tcGFyYXRvciB0aGF0IGlzIHVzZWQgZm9yIHRoaXMgc3BsYXkgdHJlZS4KICBDb21wYXJhdG9yPEs+IGdldCBfY29tcGFyYXRvcjsKCiAgLy8vIFRoZSBwcmVkaWNhdGUgdG8gZGV0ZXJtaW5lIHRoYXQgYSBnaXZlbiBvYmplY3QgaXMgYSB2YWxpZCBrZXkuCiAgX1ByZWRpY2F0ZSBnZXQgX3ZhbGlkS2V5OwoKICAvLy8gQ29tcGFyaXNvbiB1c2VkIHRvIGNvbXBhcmUga2V5cy4KICBpbnQgX2NvbXBhcmUoSyBrZXkxLCBLIGtleTIpOwoKICAvLy8gUGVyZm9ybSB0aGUgc3BsYXkgb3BlcmF0aW9uIGZvciB0aGUgZ2l2ZW4ga2V5LiBNb3ZlcyB0aGUgbm9kZSB3aXRoCiAgLy8vIHRoZSBnaXZlbiBrZXkgdG8gdGhlIHRvcCBvZiB0aGUgdHJlZS4gIElmIG5vIG5vZGUgaGFzIHRoZSBnaXZlbgogIC8vLyBrZXksIHRoZSBsYXN0IG5vZGUgb24gdGhlIHNlYXJjaCBwYXRoIGlzIG1vdmVkIHRvIHRoZSB0b3Agb2YgdGhlCiAgLy8vIHRyZWUuIFRoaXMgaXMgdGhlIHNpbXBsaWZpZWQgdG9wLWRvd24gc3BsYXlpbmcgYWxnb3JpdGhtIGZyb206CiAgLy8vICJTZWxmLWFkanVzdGluZyBCaW5hcnkgU2VhcmNoIFRyZWVzIiBieSBTbGVhdG9yIGFuZCBUYXJqYW4uCiAgLy8vCiAgLy8vIFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgdGhlIG5ldyByb290IG9mIHRoZSB0cmVlIHRvIFtrZXldLgogIC8vLyBSZXR1cm5zIC0xIGlmIHRoZSB0YWJsZSBpcyBlbXB0eS4KICBpbnQgX3NwbGF5KEsga2V5KSB7CiAgICBpZiAoX3Jvb3QgPT0gbnVsbCkgcmV0dXJuIC0xOwoKICAgIC8vIFRoZSByaWdodCBjaGlsZCBvZiB0aGUgZHVtbXkgbm9kZSB3aWxsIGhvbGQKICAgIC8vIHRoZSBMIHRyZWUgb2YgdGhlIGFsZ29yaXRobS4gIFRoZSBsZWZ0IGNoaWxkIG9mIHRoZSBkdW1teSBub2RlCiAgICAvLyB3aWxsIGhvbGQgdGhlIFIgdHJlZSBvZiB0aGUgYWxnb3JpdGhtLiAgVXNpbmcgYSBkdW1teSBub2RlLCBsZWZ0CiAgICAvLyBhbmQgcmlnaHQgd2lsbCBhbHdheXMgYmUgbm9kZXMgYW5kIHdlIGF2b2lkIHNwZWNpYWwgY2FzZXMuCiAgICBOb2RlIGxlZnQgPSBfZHVtbXk7CiAgICBOb2RlIHJpZ2h0ID0gX2R1bW15OwogICAgTm9kZSBjdXJyZW50ID0gX3Jvb3Q7CiAgICBpbnQgY29tcDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGNvbXAgPSBfY29tcGFyZShjdXJyZW50LmtleSwga2V5KTsKICAgICAgaWYgKGNvbXAgPiAwKSB7CiAgICAgICAgaWYgKGN1cnJlbnQubGVmdCA9PSBudWxsKSBicmVhazsKICAgICAgICBjb21wID0gX2NvbXBhcmUoY3VycmVudC5sZWZ0LmtleSwga2V5KTsKICAgICAgICBpZiAoY29tcCA+IDApIHsKICAgICAgICAgIC8vIFJvdGF0ZSByaWdodC4KICAgICAgICAgIF9TcGxheVRyZWVOb2RlPEs+IHRtcCA9IGN1cnJlbnQubGVmdDsKICAgICAgICAgIGN1cnJlbnQubGVmdCA9IHRtcC5yaWdodDsKICAgICAgICAgIHRtcC5yaWdodCA9IGN1cnJlbnQ7CiAgICAgICAgICBjdXJyZW50ID0gdG1wOwogICAgICAgICAgaWYgKGN1cnJlbnQubGVmdCA9PSBudWxsKSBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gTGluayByaWdodC4KICAgICAgICByaWdodC5sZWZ0ID0gY3VycmVudDsKICAgICAgICByaWdodCA9IGN1cnJlbnQ7CiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubGVmdDsKICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkgewogICAgICAgIGlmIChjdXJyZW50LnJpZ2h0ID09IG51bGwpIGJyZWFrOwogICAgICAgIGNvbXAgPSBfY29tcGFyZShjdXJyZW50LnJpZ2h0LmtleSwga2V5KTsKICAgICAgICBpZiAoY29tcCA8IDApIHsKICAgICAgICAgIC8vIFJvdGF0ZSBsZWZ0LgogICAgICAgICAgTm9kZSB0bXAgPSBjdXJyZW50LnJpZ2h0OwogICAgICAgICAgY3VycmVudC5yaWdodCA9IHRtcC5sZWZ0OwogICAgICAgICAgdG1wLmxlZnQgPSBjdXJyZW50OwogICAgICAgICAgY3VycmVudCA9IHRtcDsKICAgICAgICAgIGlmIChjdXJyZW50LnJpZ2h0ID09IG51bGwpIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvLyBMaW5rIGxlZnQuCiAgICAgICAgbGVmdC5yaWdodCA9IGN1cnJlbnQ7CiAgICAgICAgbGVmdCA9IGN1cnJlbnQ7CiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucmlnaHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIC8vIEFzc2VtYmxlLgogICAgbGVmdC5yaWdodCA9IGN1cnJlbnQubGVmdDsKICAgIHJpZ2h0LmxlZnQgPSBjdXJyZW50LnJpZ2h0OwogICAgY3VycmVudC5sZWZ0ID0gX2R1bW15LnJpZ2h0OwogICAgY3VycmVudC5yaWdodCA9IF9kdW1teS5sZWZ0OwogICAgX3Jvb3QgPSBjdXJyZW50OwoKICAgIF9kdW1teS5yaWdodCA9IG51bGw7CiAgICBfZHVtbXkubGVmdCA9IG51bGw7CiAgICBfc3BsYXlDb3VudCsrOwogICAgcmV0dXJuIGNvbXA7CiAgfQoKICAvLyBFbXVsYXRlcyBzcGxheWluZyB3aXRoIGEga2V5IHRoYXQgaXMgc21hbGxlciB0aGFuIGFueSBpbiB0aGUgc3VidHJlZQogIC8vIGFuY2hvcmVkIGF0IFtub2RlXS4KICAvLyBhbmQgdGhhdCBub2RlIGlzIHJldHVybmVkLiBJdCBzaG91bGQgcmVwbGFjZSB0aGUgcmVmZXJlbmNlIHRvIFtub2RlXQogIC8vIGluIGFueSBwYXJlbnQgdHJlZSBvciByb290IHBvaW50ZXIuCiAgZXh0ZXJuYWwgTm9kZSBfc3BsYXlNaW4oTm9kZSBub2RlKTsKCiAgLy8gRW11bGF0ZXMgc3BsYXlpbmcgd2l0aCBhIGtleSB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBhbnkgaW4gdGhlIHN1YnRyZWUKICAvLyBhbmNob3JlZCBhdCBbbm9kZV0uCiAgLy8gQWZ0ZXIgdGhpcywgdGhlIGxhcmdlc3QgZWxlbWVudCBpbiB0aGUgdHJlZSBpcyB0aGUgcm9vdCBvZiB0aGUgc3VidHJlZSwKICAvLyBhbmQgdGhhdCBub2RlIGlzIHJldHVybmVkLiBJdCBzaG91bGQgcmVwbGFjZSB0aGUgcmVmZXJlbmNlIHRvIFtub2RlXQogIC8vIGluIGFueSBwYXJlbnQgdHJlZSBvciByb290IHBvaW50ZXIuCiAgZXh0ZXJuYWwgTm9kZSBfc3BsYXlNYXgoTm9kZSBub2RlKTsKCiAgTm9kZSBfcmVtb3ZlKEsga2V5KSB7CiAgICBpZiAoX3Jvb3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpbnQgY29tcCA9IF9zcGxheShrZXkpOwogICAgaWYgKGNvbXAgIT0gMCkgcmV0dXJuIG51bGw7CiAgICBOb2RlIHJlc3VsdCA9IF9yb290OwogICAgX2NvdW50LS07CiAgICAvLyBhc3NlcnQoX2NvdW50ID49IDApOwogICAgaWYgKF9yb290LmxlZnQgPT0gbnVsbCkgewogICAgICBfcm9vdCA9IF9yb290LnJpZ2h0OwogICAgfSBlbHNlIHsKICAgICAgTm9kZSByaWdodCA9IF9yb290LnJpZ2h0OwogICAgICAvLyBTcGxheSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbmV3IHJvb3QgaGFzIGFuIGVtcHR5IHJpZ2h0IGNoaWxkLgogICAgICBfcm9vdCA9IF9zcGxheU1heChfcm9vdC5sZWZ0KTsKICAgICAgLy8gSW5zZXJ0IHRoZSBvcmlnaW5hbCByaWdodCBjaGlsZCBhcyB0aGUgcmlnaHQgY2hpbGQgb2YgdGhlIG5ldwogICAgICAvLyByb290LgogICAgICBfcm9vdC5yaWdodCA9IHJpZ2h0OwogICAgfQogICAgX21vZGlmaWNhdGlvbkNvdW50Kys7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIEFkZHMgYSBuZXcgcm9vdCBub2RlIHdpdGggdGhlIGdpdmVuIFtrZXldIG9yIFt2YWx1ZV0uCiAgLy8vCiAgLy8vIFRoZSBbY29tcF0gdmFsdWUgaXMgdGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgdGhlIGV4aXN0aW5nIHJvb3QncyBrZXkKICAvLy8gd2l0aCBrZXkuCiAgdm9pZCBfYWRkTmV3Um9vdChOb2RlIG5vZGUsIGludCBjb21wKSB7CiAgICBfY291bnQrKzsKICAgIF9tb2RpZmljYXRpb25Db3VudCsrOwogICAgaWYgKF9yb290ID09IG51bGwpIHsKICAgICAgX3Jvb3QgPSBub2RlOwogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBhc3NlcnQoX2NvdW50ID49IDApOwogICAgaWYgKGNvbXAgPCAwKSB7CiAgICAgIG5vZGUubGVmdCA9IF9yb290OwogICAgICBub2RlLnJpZ2h0ID0gX3Jvb3QucmlnaHQ7CiAgICAgIF9yb290LnJpZ2h0ID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIG5vZGUucmlnaHQgPSBfcm9vdDsKICAgICAgbm9kZS5sZWZ0ID0gX3Jvb3QubGVmdDsKICAgICAgX3Jvb3QubGVmdCA9IG51bGw7CiAgICB9CiAgICBfcm9vdCA9IG5vZGU7CiAgfQoKICBOb2RlIGdldCBfZmlyc3QgewogICAgaWYgKF9yb290ID09IG51bGwpIHJldHVybiBudWxsOwogICAgX3Jvb3QgPSBfc3BsYXlNaW4oX3Jvb3QpOwogICAgcmV0dXJuIF9yb290OwogIH0KCiAgTm9kZSBnZXQgX2xhc3QgewogICAgaWYgKF9yb290ID09IG51bGwpIHJldHVybiBudWxsOwogICAgX3Jvb3QgPSBfc3BsYXlNYXgoX3Jvb3QpOwogICAgcmV0dXJuIF9yb290OwogIH0KCiAgdm9pZCBfY2xlYXIoKSB7CiAgICBfcm9vdCA9IG51bGw7CiAgICBfY291bnQgPSAwOwogICAgX21vZGlmaWNhdGlvbkNvdW50Kys7CiAgfQp9CgpjbGFzcyBfVHlwZVRlc3Q8VD4gewogIGJvb2wgdGVzdCh2KSA9PiB2IGlzIFQ7Cn0KCmludCBfZHluYW1pY0NvbXBhcmUoZHluYW1pYyBhLCBkeW5hbWljIGIpID0+IENvbXBhcmFibGUuY29tcGFyZShhLCBiKTsKCkNvbXBhcmF0b3I8Sz4gX2RlZmF1bHRDb21wYXJlPEs+KCkgewogIC8vIElmIEsgPDogQ29tcGFyYWJsZSwgdGhlbiB3ZSBjYW4ganVzdCB1c2UgQ29tcGFyYWJsZS5jb21wYXJlCiAgLy8gd2l0aCBubyBjYXN0cy4KICBPYmplY3QgY29tcGFyZSA9IENvbXBhcmFibGUuY29tcGFyZTsKICBpZiAoY29tcGFyZSBpcyBDb21wYXJhdG9yPEs+KSB7CiAgICByZXR1cm4gY29tcGFyZTsKICB9CiAgLy8gT3RoZXJ3aXNlIHdyYXAgYW5kIGNhc3QgdGhlIGFyZ3VtZW50cyBvbiBlYWNoIGNhbGwuCiAgcmV0dXJuIF9keW5hbWljQ29tcGFyZTsKfQoKLy8vIEEgW01hcF0gb2Ygb2JqZWN0cyB0aGF0IGNhbiBiZSBvcmRlcmVkIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuCi8vLwovLy8gVGhlIG1hcCBpcyBiYXNlZCBvbiBhIHNlbGYtYmFsYW5jaW5nIGJpbmFyeSB0cmVlLiBJdCBhbGxvd3MgbW9zdCBvcGVyYXRpb25zCi8vLyBpbiBhbW9ydGl6ZWQgbG9nYXJpdGhtaWMgdGltZS4KLy8vCi8vLyBLZXlzIG9mIHRoZSBtYXAgYXJlIGNvbXBhcmVkIHVzaW5nIHRoZSBgY29tcGFyZWAgZnVuY3Rpb24gcGFzc2VkIGluCi8vLyB0aGUgY29uc3RydWN0b3IsIGJvdGggZm9yIG9yZGVyaW5nIGFuZCBmb3IgZXF1YWxpdHkuCi8vLyBJZiB0aGUgbWFwIGNvbnRhaW5zIG9ubHkgdGhlIGtleSBgYWAsIHRoZW4gYG1hcC5jb250YWluc0tleShiKWAKLy8vIHdpbGwgcmV0dXJuIGB0cnVlYCBpZiBhbmQgb25seSBpZiBgY29tcGFyZShhLCBiKSA9PSAwYCwKLy8vIGFuZCB0aGUgdmFsdWUgb2YgYGEgPT0gYmAgaXMgbm90IGV2ZW4gY2hlY2tlZC4KLy8vIElmIHRoZSBjb21wYXJlIGZ1bmN0aW9uIGlzIG9taXR0ZWQsIHRoZSBvYmplY3RzIGFyZSBhc3N1bWVkIHRvIGJlCi8vLyBbQ29tcGFyYWJsZV0sIGFuZCBhcmUgY29tcGFyZWQgdXNpbmcgdGhlaXIgW0NvbXBhcmFibGUuY29tcGFyZVRvXSBtZXRob2QuCi8vLyBOb24tY29tcGFyYWJsZSBvYmplY3RzIChpbmNsdWRpbmcgYG51bGxgKSB3aWxsIG5vdCB3b3JrIGFzIGtleXMKLy8vIGluIHRoYXQgY2FzZS4KLy8vCi8vLyBUbyBhbGxvdyBjYWxsaW5nIFtvcGVyYXRvciBbXV0sIFtyZW1vdmVdIG9yIFtjb250YWluc0tleV0gd2l0aCBvYmplY3RzCi8vLyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgY29tcGFyZWAgZnVuY3Rpb24sIGFuIGV4dHJhIGBpc1ZhbGlkS2V5YAovLy8gcHJlZGljYXRlIGZ1bmN0aW9uIGNhbiBiZSBzdXBwbGllZC4gVGhpcyBmdW5jdGlvbiBpcyB0ZXN0ZWQgYmVmb3JlCi8vLyB1c2luZyB0aGUgYGNvbXBhcmVgIGZ1bmN0aW9uIG9uIGFuIGFyZ3VtZW50IHZhbHVlIHRoYXQgbWF5IG5vdCBiZSBhIFtLXQovLy8gdmFsdWUuIElmIG9taXR0ZWQsIHRoZSBgaXNWYWxpZEtleWAgZnVuY3Rpb24gZGVmYXVsdHMgdG8gdGVzdGluZyBpZiB0aGUKLy8vIHZhbHVlIGlzIGEgW0tdLgpjbGFzcyBTcGxheVRyZWVNYXA8SywgVj4gZXh0ZW5kcyBfU3BsYXlUcmVlPEssIF9TcGxheVRyZWVNYXBOb2RlPEssIFY+PgogICAgd2l0aCBNYXBNaXhpbjxLLCBWPiB7CiAgX1NwbGF5VHJlZU1hcE5vZGU8SywgVj4gX3Jvb3Q7CiAgZmluYWwgX1NwbGF5VHJlZU1hcE5vZGU8SywgVj4gX2R1bW15ID0gX1NwbGF5VHJlZU1hcE5vZGU8SywgVj4obnVsbCwgbnVsbCk7CgogIENvbXBhcmF0b3I8Sz4gX2NvbXBhcmF0b3I7CiAgX1ByZWRpY2F0ZSBfdmFsaWRLZXk7CgogIFNwbGF5VHJlZU1hcChbaW50IGNvbXBhcmUoSyBrZXkxLCBLIGtleTIpLCBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KV0pCiAgICAgIDogX2NvbXBhcmF0b3IgPSBjb21wYXJlID8/IF9kZWZhdWx0Q29tcGFyZTxLPigpLAogICAgICAgIF92YWxpZEtleSA9IGlzVmFsaWRLZXkgPz8gKCh2KSA9PiB2IGlzIEspOwoKICAvLy8gQ3JlYXRlcyBhIFtTcGxheVRyZWVNYXBdIHRoYXQgY29udGFpbnMgYWxsIGtleS92YWx1ZSBwYWlycyBvZiBbb3RoZXJdLgogIC8vLwogIC8vLyBUaGUga2V5cyBtdXN0IGFsbCBiZSBpbnN0YW5jZXMgb2YgW0tdIGFuZCB0aGUgdmFsdWVzIG9mIFtWXS4KICAvLy8gVGhlIFtvdGhlcl0gbWFwIGl0c2VsZiBjYW4gaGF2ZSBhbnkgdHlwZS4KICBmYWN0b3J5IFNwbGF5VHJlZU1hcC5mcm9tKE1hcCBvdGhlciwKICAgICAgW2ludCBjb21wYXJlKEsga2V5MSwgSyBrZXkyKSwgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSldKSB7CiAgICBTcGxheVRyZWVNYXA8SywgVj4gcmVzdWx0ID0gU3BsYXlUcmVlTWFwPEssIFY+KGNvbXBhcmUsIGlzVmFsaWRLZXkpOwogICAgb3RoZXIuZm9yRWFjaCgoaywgdikgewogICAgICByZXN1bHRba10gPSB2OwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENyZWF0ZXMgYSBbU3BsYXlUcmVlTWFwXSB0aGF0IGNvbnRhaW5zIGFsbCBrZXkvdmFsdWUgcGFpcnMgb2YgW290aGVyXS4KICBmYWN0b3J5IFNwbGF5VHJlZU1hcC5vZihNYXA8SywgVj4gb3RoZXIsCiAgICAgICAgICBbaW50IGNvbXBhcmUoSyBrZXkxLCBLIGtleTIpLCBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KV0pID0+CiAgICAgIFNwbGF5VHJlZU1hcDxLLCBWPihjb21wYXJlLCBpc1ZhbGlkS2V5KS4uYWRkQWxsKG90aGVyKTsKCiAgLy8vIENyZWF0ZXMgYSBbU3BsYXlUcmVlTWFwXSB3aGVyZSB0aGUga2V5cyBhbmQgdmFsdWVzIGFyZSBjb21wdXRlZCBmcm9tIHRoZQogIC8vLyBbaXRlcmFibGVdLgogIC8vLwogIC8vLyBGb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBbaXRlcmFibGVdIHRoaXMgY29uc3RydWN0b3IgY29tcHV0ZXMgYSBrZXkvdmFsdWUKICAvLy8gcGFpciwgYnkgYXBwbHlpbmcgW2tleV0gYW5kIFt2YWx1ZV0gcmVzcGVjdGl2ZWx5LgogIC8vLwogIC8vLyBUaGUga2V5cyBvZiB0aGUga2V5L3ZhbHVlIHBhaXJzIGRvIG5vdCBuZWVkIHRvIGJlIHVuaXF1ZS4gVGhlIGxhc3QKICAvLy8gb2NjdXJyZW5jZSBvZiBhIGtleSB3aWxsIHNpbXBseSBvdmVyd3JpdGUgYW55IHByZXZpb3VzIHZhbHVlLgogIC8vLwogIC8vLyBJZiBubyBmdW5jdGlvbnMgYXJlIHNwZWNpZmllZCBmb3IgW2tleV0gYW5kIFt2YWx1ZV0gdGhlIGRlZmF1bHQgaXMgdG8KICAvLy8gdXNlIHRoZSBpdGVyYWJsZSB2YWx1ZSBpdHNlbGYuCiAgZmFjdG9yeSBTcGxheVRyZWVNYXAuZnJvbUl0ZXJhYmxlKEl0ZXJhYmxlIGl0ZXJhYmxlLAogICAgICB7SyBrZXkoZWxlbWVudCksCiAgICAgIFYgdmFsdWUoZWxlbWVudCksCiAgICAgIGludCBjb21wYXJlKEsga2V5MSwgSyBrZXkyKSwKICAgICAgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSl9KSB7CiAgICBTcGxheVRyZWVNYXA8SywgVj4gbWFwID0gU3BsYXlUcmVlTWFwPEssIFY+KGNvbXBhcmUsIGlzVmFsaWRLZXkpOwogICAgTWFwQmFzZS5fZmlsbE1hcFdpdGhNYXBwZWRJdGVyYWJsZShtYXAsIGl0ZXJhYmxlLCBrZXksIHZhbHVlKTsKICAgIHJldHVybiBtYXA7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIFtTcGxheVRyZWVNYXBdIGFzc29jaWF0aW5nIHRoZSBnaXZlbiBba2V5c10gdG8gW3ZhbHVlc10uCiAgLy8vCiAgLy8vIFRoaXMgY29uc3RydWN0b3IgaXRlcmF0ZXMgb3ZlciBba2V5c10gYW5kIFt2YWx1ZXNdIGFuZCBtYXBzIGVhY2ggZWxlbWVudAogIC8vLyBvZiBba2V5c10gdG8gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBbdmFsdWVzXS4KICAvLy8KICAvLy8gSWYgW2tleXNdIGNvbnRhaW5zIHRoZSBzYW1lIG9iamVjdCBtdWx0aXBsZSB0aW1lcywgdGhlIGxhc3Qgb2NjdXJyZW5jZQogIC8vLyBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyB2YWx1ZS4KICAvLy8KICAvLy8gSXQgaXMgYW4gZXJyb3IgaWYgdGhlIHR3byBbSXRlcmFibGVdcyBkb24ndCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4KICBmYWN0b3J5IFNwbGF5VHJlZU1hcC5mcm9tSXRlcmFibGVzKEl0ZXJhYmxlPEs+IGtleXMsIEl0ZXJhYmxlPFY+IHZhbHVlcywKICAgICAgW2ludCBjb21wYXJlKEsga2V5MSwgSyBrZXkyKSwgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSldKSB7CiAgICBTcGxheVRyZWVNYXA8SywgVj4gbWFwID0gU3BsYXlUcmVlTWFwPEssIFY+KGNvbXBhcmUsIGlzVmFsaWRLZXkpOwogICAgTWFwQmFzZS5fZmlsbE1hcFdpdGhJdGVyYWJsZXMobWFwLCBrZXlzLCB2YWx1ZXMpOwogICAgcmV0dXJuIG1hcDsKICB9CgogIGludCBfY29tcGFyZShLIGtleTEsIEsga2V5MikgPT4gX2NvbXBhcmF0b3Ioa2V5MSwga2V5Mik7CgogIFNwbGF5VHJlZU1hcC5faW50ZXJuYWwoKTsKCiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KSB7CiAgICBpZiAoIV92YWxpZEtleShrZXkpKSByZXR1cm4gbnVsbDsKICAgIGlmIChfcm9vdCAhPSBudWxsKSB7CiAgICAgIGludCBjb21wID0gX3NwbGF5KGtleSk7CiAgICAgIGlmIChjb21wID09IDApIHsKICAgICAgICByZXR1cm4gX3Jvb3QudmFsdWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgaWYgKCFfdmFsaWRLZXkoa2V5KSkgcmV0dXJuIG51bGw7CiAgICBfU3BsYXlUcmVlTWFwTm9kZTxLLCBWPiBtYXBSb290ID0gX3JlbW92ZShrZXkpOwogICAgaWYgKG1hcFJvb3QgIT0gbnVsbCkgcmV0dXJuIG1hcFJvb3QudmFsdWU7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBpZiAoa2V5ID09IG51bGwpIHRocm93IEFyZ3VtZW50RXJyb3Ioa2V5KTsKICAgIC8vIFNwbGF5IG9uIHRoZSBrZXkgdG8gbW92ZSB0aGUgbGFzdCBub2RlIG9uIHRoZSBzZWFyY2ggcGF0aCBmb3IKICAgIC8vIHRoZSBrZXkgdG8gdGhlIHJvb3Qgb2YgdGhlIHRyZWUuCiAgICBpbnQgY29tcCA9IF9zcGxheShrZXkpOwogICAgaWYgKGNvbXAgPT0gMCkgewogICAgICBfcm9vdC52YWx1ZSA9IHZhbHVlOwogICAgICByZXR1cm47CiAgICB9CiAgICBfYWRkTmV3Um9vdChfU3BsYXlUcmVlTWFwTm9kZShrZXksIHZhbHVlKSwgY29tcCk7CiAgfQoKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIGlmIChrZXkgPT0gbnVsbCkgdGhyb3cgQXJndW1lbnRFcnJvcihrZXkpOwogICAgaW50IGNvbXAgPSBfc3BsYXkoa2V5KTsKICAgIGlmIChjb21wID09IDApIHsKICAgICAgcmV0dXJuIF9yb290LnZhbHVlOwogICAgfQogICAgaW50IG1vZGlmaWNhdGlvbkNvdW50ID0gX21vZGlmaWNhdGlvbkNvdW50OwogICAgaW50IHNwbGF5Q291bnQgPSBfc3BsYXlDb3VudDsKICAgIFYgdmFsdWUgPSBpZkFic2VudCgpOwogICAgaWYgKG1vZGlmaWNhdGlvbkNvdW50ICE9IF9tb2RpZmljYXRpb25Db3VudCkgewogICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICB9CiAgICBpZiAoc3BsYXlDb3VudCAhPSBfc3BsYXlDb3VudCkgewogICAgICBjb21wID0gX3NwbGF5KGtleSk7CiAgICAgIC8vIEtleSBpcyBzdGlsbCBub3QgdGhlcmUsIG90aGVyd2lzZSBfbW9kaWZpY2F0aW9uQ291bnQgd291bGQgYmUgY2hhbmdlZC4KICAgICAgYXNzZXJ0KGNvbXAgIT0gMCk7CiAgICB9CiAgICBfYWRkTmV3Um9vdChfU3BsYXlUcmVlTWFwTm9kZShrZXksIHZhbHVlKSwgY29tcCk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIG90aGVyLmZvckVhY2goKEsga2V5LCBWIHZhbHVlKSB7CiAgICAgIHRoaXNba2V5XSA9IHZhbHVlOwogICAgfSk7CiAgfQoKICBib29sIGdldCBpc0VtcHR5IHsKICAgIHJldHVybiAoX3Jvb3QgPT0gbnVsbCk7CiAgfQoKICBib29sIGdldCBpc05vdEVtcHR5ID0+ICFpc0VtcHR5OwoKICB2b2lkIGZvckVhY2godm9pZCBmKEsga2V5LCBWIHZhbHVlKSkgewogICAgSXRlcmF0b3I8X1NwbGF5VHJlZU5vZGU8Sz4+IG5vZGVzID0gX1NwbGF5VHJlZU5vZGVJdGVyYXRvcjxLPih0aGlzKTsKICAgIHdoaWxlIChub2Rlcy5tb3ZlTmV4dCgpKSB7CiAgICAgIF9TcGxheVRyZWVNYXBOb2RlPEssIFY+IG5vZGUgPSBub2Rlcy5jdXJyZW50OwogICAgICBmKG5vZGUua2V5LCBub2RlLnZhbHVlKTsKICAgIH0KICB9CgogIGludCBnZXQgbGVuZ3RoIHsKICAgIHJldHVybiBfY291bnQ7CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgX2NsZWFyKCk7CiAgfQoKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKICAgIHJldHVybiBfdmFsaWRLZXkoa2V5KSAmJiBfc3BsYXkoa2V5KSA9PSAwOwogIH0KCiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewogICAgaW50IGluaXRpYWxTcGxheUNvdW50ID0gX3NwbGF5Q291bnQ7CiAgICBib29sIHZpc2l0KF9TcGxheVRyZWVNYXBOb2RlIG5vZGUpIHsKICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewogICAgICAgIGlmIChub2RlLnZhbHVlID09IHZhbHVlKSByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAoaW5pdGlhbFNwbGF5Q291bnQgIT0gX3NwbGF5Q291bnQpIHsKICAgICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgICB9CiAgICAgICAgaWYgKG5vZGUucmlnaHQgIT0gbnVsbCAmJiB2aXNpdChub2RlLnJpZ2h0KSkgcmV0dXJuIHRydWU7CiAgICAgICAgbm9kZSA9IG5vZGUubGVmdDsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIHZpc2l0KF9yb290KTsKICB9CgogIEl0ZXJhYmxlPEs+IGdldCBrZXlzID0+IF9TcGxheVRyZWVLZXlJdGVyYWJsZTxLPih0aGlzKTsKCiAgSXRlcmFibGU8Vj4gZ2V0IHZhbHVlcyA9PiBfU3BsYXlUcmVlVmFsdWVJdGVyYWJsZTxLLCBWPih0aGlzKTsKCiAgLy8vIEdldCB0aGUgZmlyc3Qga2V5IGluIHRoZSBtYXAuIFJldHVybnMgWzpudWxsOl0gaWYgdGhlIG1hcCBpcyBlbXB0eS4KICBLIGZpcnN0S2V5KCkgewogICAgaWYgKF9yb290ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9maXJzdC5rZXk7CiAgfQoKICAvLy8gR2V0IHRoZSBsYXN0IGtleSBpbiB0aGUgbWFwLiBSZXR1cm5zIFs6bnVsbDpdIGlmIHRoZSBtYXAgaXMgZW1wdHkuCiAgSyBsYXN0S2V5KCkgewogICAgaWYgKF9yb290ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9sYXN0LmtleTsKICB9CgogIC8vLyBHZXQgdGhlIGxhc3Qga2V5IGluIHRoZSBtYXAgdGhhdCBpcyBzdHJpY3RseSBzbWFsbGVyIHRoYW4gW2tleV0uIFJldHVybnMKICAvLy8gWzpudWxsOl0gaWYgbm8ga2V5IHdhcyBub3QgZm91bmQuCiAgSyBsYXN0S2V5QmVmb3JlKEsga2V5KSB7CiAgICBpZiAoa2V5ID09IG51bGwpIHRocm93IEFyZ3VtZW50RXJyb3Ioa2V5KTsKICAgIGlmIChfcm9vdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGludCBjb21wID0gX3NwbGF5KGtleSk7CiAgICBpZiAoY29tcCA8IDApIHJldHVybiBfcm9vdC5rZXk7CiAgICBfU3BsYXlUcmVlTm9kZTxLPiBub2RlID0gX3Jvb3QubGVmdDsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiBudWxsOwogICAgd2hpbGUgKG5vZGUucmlnaHQgIT0gbnVsbCkgewogICAgICBub2RlID0gbm9kZS5yaWdodDsKICAgIH0KICAgIHJldHVybiBub2RlLmtleTsKICB9CgogIC8vLyBHZXQgdGhlIGZpcnN0IGtleSBpbiB0aGUgbWFwIHRoYXQgaXMgc3RyaWN0bHkgbGFyZ2VyIHRoYW4gW2tleV0uIFJldHVybnMKICAvLy8gWzpudWxsOl0gaWYgbm8ga2V5IHdhcyBub3QgZm91bmQuCiAgSyBmaXJzdEtleUFmdGVyKEsga2V5KSB7CiAgICBpZiAoa2V5ID09IG51bGwpIHRocm93IEFyZ3VtZW50RXJyb3Ioa2V5KTsKICAgIGlmIChfcm9vdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGludCBjb21wID0gX3NwbGF5KGtleSk7CiAgICBpZiAoY29tcCA+IDApIHJldHVybiBfcm9vdC5rZXk7CiAgICBfU3BsYXlUcmVlTm9kZTxLPiBub2RlID0gX3Jvb3QucmlnaHQ7CiAgICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHdoaWxlIChub2RlLmxlZnQgIT0gbnVsbCkgewogICAgICBub2RlID0gbm9kZS5sZWZ0OwogICAgfQogICAgcmV0dXJuIG5vZGUua2V5OwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX1NwbGF5VHJlZUl0ZXJhdG9yPEssIFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4gewogIGZpbmFsIF9TcGxheVRyZWU8SywgX1NwbGF5VHJlZU5vZGU8Sz4+IF90cmVlOwoKICAvLy8gV29ya2xpc3Qgb2Ygbm9kZXMgdG8gdmlzaXQuCiAgLy8vCiAgLy8vIFRoZXNlIG5vZGVzIGhhdmUgYmVlbiBwYXNzZWQgb3ZlciBvbiB0aGUgd2F5IGRvd24gaW4gYQogIC8vLyBkZXB0aC1maXJzdCBsZWZ0LXRvLXJpZ2h0IHRyYXZlcnNhbC4gVmlzaXRpbmcgZWFjaCBub2RlLAogIC8vLyBhbmQgdGhlaXIgcmlnaHQgc3VidHJlZXMgd2lsbCB2aXNpdCB0aGUgcmVtYWluZGVyIG9mCiAgLy8vIHRoZSBub2RlcyBvZiBhIGZ1bGwgdHJhdmVyc2FsLgogIC8vLwogIC8vLyBPbmx5IHZhbGlkIGFzIGxvbmcgYXMgdGhlIG9yaWdpbmFsIHRyZWUgaXNuJ3QgcmVvcmRlcmVkLgogIGZpbmFsIExpc3Q8X1NwbGF5VHJlZU5vZGU8Sz4+IF93b3JrTGlzdCA9IDxfU3BsYXlUcmVlTm9kZTxLPj5bXTsKCiAgLy8vIE9yaWdpbmFsIG1vZGlmaWNhdGlvbiBjb3VudGVyIG9mIFtfdHJlZV0uCiAgLy8vCiAgLy8vIEluY3JlbWVudGVkIG9uIFtfdHJlZV0gd2hlbiBhIGtleSBpcyBhZGRlZCBvciByZW1vdmVkLgogIC8vLyBJZiBpdCBjaGFuZ2VzLCBpdGVyYXRpb24gaXMgYWJvcnRlZC4KICAvLy8KICAvLy8gTm90IGZpbmFsIGJlY2F1c2Ugc29tZSBpdGVyYXRvcnMgbWF5IG1vZGlmeSB0aGUgdHJlZSBrbm93aW5nbHksCiAgLy8vIGFuZCB0aGV5IHVwZGF0ZSB0aGUgbW9kaWZpY2F0aW9uIGNvdW50IGluIHRoYXQgY2FzZS4KICBpbnQgX21vZGlmaWNhdGlvbkNvdW50OwoKICAvLy8gQ291bnQgb2Ygc3BsYXkgb3BlcmF0aW9ucyBvbiBbX3RyZWVdIHdoZW4gW193b3JrTGlzdF0gd2FzIGJ1aWx0LgogIC8vLwogIC8vLyBJZiB0aGUgc3BsYXkgY291bnQgb24gW190cmVlXSBpbmNyZWFzZXMsIFtfd29ya0xpc3RdIGJlY29tZXMgaW52YWxpZC4KICBpbnQgX3NwbGF5Q291bnQ7CgogIC8vLyBDdXJyZW50IG5vZGUuCiAgX1NwbGF5VHJlZU5vZGU8Sz4gX2N1cnJlbnROb2RlOwoKICBfU3BsYXlUcmVlSXRlcmF0b3IoX1NwbGF5VHJlZTxLLCBfU3BsYXlUcmVlTm9kZTxLPj4gdHJlZSkKICAgICAgOiBfdHJlZSA9IHRyZWUsCiAgICAgICAgX21vZGlmaWNhdGlvbkNvdW50ID0gdHJlZS5fbW9kaWZpY2F0aW9uQ291bnQsCiAgICAgICAgX3NwbGF5Q291bnQgPSB0cmVlLl9zcGxheUNvdW50IHsKICAgIF9maW5kTGVmdE1vc3REZXNjZW5kZW50KHRyZWUuX3Jvb3QpOwogIH0KCiAgX1NwbGF5VHJlZUl0ZXJhdG9yLnN0YXJ0QXQoX1NwbGF5VHJlZTxLLCBfU3BsYXlUcmVlTm9kZTxLPj4gdHJlZSwgSyBzdGFydEtleSkKICAgICAgOiBfdHJlZSA9IHRyZWUsCiAgICAgICAgX21vZGlmaWNhdGlvbkNvdW50ID0gdHJlZS5fbW9kaWZpY2F0aW9uQ291bnQgewogICAgaWYgKHRyZWUuX3Jvb3QgPT0gbnVsbCkgcmV0dXJuOwogICAgaW50IGNvbXBhcmUgPSB0cmVlLl9zcGxheShzdGFydEtleSk7CiAgICBfc3BsYXlDb3VudCA9IHRyZWUuX3NwbGF5Q291bnQ7CiAgICBpZiAoY29tcGFyZSA8IDApIHsKICAgICAgLy8gRG9uJ3QgaW5jbHVkZSB0aGUgcm9vdCwgc3RhcnQgYXQgdGhlIG5leHQgZWxlbWVudCBhZnRlciB0aGUgcm9vdC4KICAgICAgX2ZpbmRMZWZ0TW9zdERlc2NlbmRlbnQodHJlZS5fcm9vdC5yaWdodCk7CiAgICB9IGVsc2UgewogICAgICBfd29ya0xpc3QuYWRkKHRyZWUuX3Jvb3QpOwogICAgfQogIH0KCiAgVCBnZXQgY3VycmVudCB7CiAgICBpZiAoX2N1cnJlbnROb2RlID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9nZXRWYWx1ZShfY3VycmVudE5vZGUpOwogIH0KCiAgdm9pZCBfZmluZExlZnRNb3N0RGVzY2VuZGVudChfU3BsYXlUcmVlTm9kZTxLPiBub2RlKSB7CiAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7CiAgICAgIF93b3JrTGlzdC5hZGQobm9kZSk7CiAgICAgIG5vZGUgPSBub2RlLmxlZnQ7CiAgICB9CiAgfQoKICAvLy8gQ2FsbGVkIHdoZW4gdGhlIHRyZWUgc3RydWN0dXJlIG9mIHRoZSB0cmVlIGhhcyBjaGFuZ2VkLgogIC8vLwogIC8vLyBUaGlzIGNhbiBiZSBjYXVzZWQgYnkgYSBzcGxheSBvcGVyYXRpb24uCiAgLy8vIElmIHRoZSBrZXktc2V0IGNoYW5nZXMsIGl0ZXJhdGlvbiBpcyBhYm9ydGVkIGJlZm9yZSBnZXR0aW5nCiAgLy8vIGhlcmUsIHNvIHdlIGtub3cgdGhhdCB0aGUga2V5cyBhcmUgdGhlIHNhbWUgYXMgYmVmb3JlLCBpdCdzCiAgLy8vIG9ubHkgdGhlIHRyZWUgdGhhdCBoYXMgYmVlbiByZW9yZGVyZWQuCiAgdm9pZCBfcmVidWlsZFdvcmtMaXN0KF9TcGxheVRyZWVOb2RlPEs+IGN1cnJlbnROb2RlKSB7CiAgICBhc3NlcnQoX3dvcmtMaXN0LmlzTm90RW1wdHkpOwogICAgX3dvcmtMaXN0LmNsZWFyKCk7CiAgICBpZiAoY3VycmVudE5vZGUgPT0gbnVsbCkgewogICAgICBfZmluZExlZnRNb3N0RGVzY2VuZGVudChfdHJlZS5fcm9vdCk7CiAgICB9IGVsc2UgewogICAgICBfdHJlZS5fc3BsYXkoY3VycmVudE5vZGUua2V5KTsKICAgICAgX2ZpbmRMZWZ0TW9zdERlc2NlbmRlbnQoX3RyZWUuX3Jvb3QucmlnaHQpOwogICAgICBhc3NlcnQoX3dvcmtMaXN0LmlzTm90RW1wdHkpOwogICAgfQogIH0KCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfbW9kaWZpY2F0aW9uQ291bnQgIT0gX3RyZWUuX21vZGlmaWNhdGlvbkNvdW50KSB7CiAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcihfdHJlZSk7CiAgICB9CiAgICAvLyBQaWNrcyB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSB3b3JrbGlzdCBhcyBjdXJyZW50LgogICAgLy8gVXBkYXRlcyB0aGUgd29ya2xpc3Qgd2l0aCB0aGUgbGVmdC1tb3N0IHBhdGggb2YgdGhlIGN1cnJlbnQgbm9kZSdzCiAgICAvLyByaWdodC1oYW5kIGNoaWxkLgogICAgLy8gSWYgdGhlIHdvcmtsaXN0IGlzIG5vIGxvbmdlciB2YWxpZCAoYWZ0ZXIgYSBzcGxheSksIGl0IGlzIHJlYnVpbGQKICAgIC8vIGZyb20gc2NyYXRjaC4KICAgIGlmIChfd29ya0xpc3QuaXNFbXB0eSkgewogICAgICBfY3VycmVudE5vZGUgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoX3RyZWUuX3NwbGF5Q291bnQgIT0gX3NwbGF5Q291bnQgJiYgX2N1cnJlbnROb2RlICE9IG51bGwpIHsKICAgICAgX3JlYnVpbGRXb3JrTGlzdChfY3VycmVudE5vZGUpOwogICAgfQogICAgX2N1cnJlbnROb2RlID0gX3dvcmtMaXN0LnJlbW92ZUxhc3QoKTsKICAgIF9maW5kTGVmdE1vc3REZXNjZW5kZW50KF9jdXJyZW50Tm9kZS5yaWdodCk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIFQgX2dldFZhbHVlKF9TcGxheVRyZWVOb2RlPEs+IG5vZGUpOwp9CgpjbGFzcyBfU3BsYXlUcmVlS2V5SXRlcmFibGU8Sz4gZXh0ZW5kcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxLPiB7CiAgX1NwbGF5VHJlZTxLLCBfU3BsYXlUcmVlTm9kZTxLPj4gX3RyZWU7CiAgX1NwbGF5VHJlZUtleUl0ZXJhYmxlKHRoaXMuX3RyZWUpOwogIGludCBnZXQgbGVuZ3RoID0+IF90cmVlLl9jb3VudDsKICBib29sIGdldCBpc0VtcHR5ID0+IF90cmVlLl9jb3VudCA9PSAwOwogIEl0ZXJhdG9yPEs+IGdldCBpdGVyYXRvciA9PiBfU3BsYXlUcmVlS2V5SXRlcmF0b3I8Sz4oX3RyZWUpOwoKICBTZXQ8Sz4gdG9TZXQoKSB7CiAgICBTcGxheVRyZWVTZXQ8Sz4gc2V0ID0gU3BsYXlUcmVlU2V0PEs+KF90cmVlLl9jb21wYXJhdG9yLCBfdHJlZS5fdmFsaWRLZXkpOwogICAgc2V0Ll9jb3VudCA9IF90cmVlLl9jb3VudDsKICAgIHNldC5fcm9vdCA9IHNldC5fY29weU5vZGUoX3RyZWUuX3Jvb3QpOwogICAgcmV0dXJuIHNldDsKICB9Cn0KCmNsYXNzIF9TcGxheVRyZWVWYWx1ZUl0ZXJhYmxlPEssIFY+IGV4dGVuZHMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8Vj4gewogIFNwbGF5VHJlZU1hcDxLLCBWPiBfbWFwOwogIF9TcGxheVRyZWVWYWx1ZUl0ZXJhYmxlKHRoaXMuX21hcCk7CiAgaW50IGdldCBsZW5ndGggPT4gX21hcC5fY291bnQ7CiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfbWFwLl9jb3VudCA9PSAwOwogIEl0ZXJhdG9yPFY+IGdldCBpdGVyYXRvciA9PiBfU3BsYXlUcmVlVmFsdWVJdGVyYXRvcjxLLCBWPihfbWFwKTsKfQoKY2xhc3MgX1NwbGF5VHJlZUtleUl0ZXJhdG9yPEs+IGV4dGVuZHMgX1NwbGF5VHJlZUl0ZXJhdG9yPEssIEs+IHsKICBfU3BsYXlUcmVlS2V5SXRlcmF0b3IoX1NwbGF5VHJlZTxLLCBfU3BsYXlUcmVlTm9kZTxLPj4gbWFwKSA6IHN1cGVyKG1hcCk7CiAgSyBfZ2V0VmFsdWUoX1NwbGF5VHJlZU5vZGU8Sz4gbm9kZSkgPT4gbm9kZS5rZXk7Cn0KCmNsYXNzIF9TcGxheVRyZWVWYWx1ZUl0ZXJhdG9yPEssIFY+IGV4dGVuZHMgX1NwbGF5VHJlZUl0ZXJhdG9yPEssIFY+IHsKICBfU3BsYXlUcmVlVmFsdWVJdGVyYXRvcihTcGxheVRyZWVNYXA8SywgVj4gbWFwKSA6IHN1cGVyKG1hcCk7CiAgViBfZ2V0VmFsdWUoX1NwbGF5VHJlZU5vZGU8Sz4gbm9kZSkgewogICAgX1NwbGF5VHJlZU1hcE5vZGU8SywgVj4gbWFwTm9kZSA9IG5vZGU7CiAgICByZXR1cm4gbWFwTm9kZS52YWx1ZTsKICB9Cn0KCmNsYXNzIF9TcGxheVRyZWVOb2RlSXRlcmF0b3I8Sz4KICAgIGV4dGVuZHMgX1NwbGF5VHJlZUl0ZXJhdG9yPEssIF9TcGxheVRyZWVOb2RlPEs+PiB7CiAgX1NwbGF5VHJlZU5vZGVJdGVyYXRvcihfU3BsYXlUcmVlPEssIF9TcGxheVRyZWVOb2RlPEs+PiB0cmVlKSA6IHN1cGVyKHRyZWUpOwogIF9TcGxheVRyZWVOb2RlSXRlcmF0b3Iuc3RhcnRBdCgKICAgICAgX1NwbGF5VHJlZTxLLCBfU3BsYXlUcmVlTm9kZTxLPj4gdHJlZSwgSyBzdGFydEtleSkKICAgICAgOiBzdXBlci5zdGFydEF0KHRyZWUsIHN0YXJ0S2V5KTsKICBfU3BsYXlUcmVlTm9kZTxLPiBfZ2V0VmFsdWUoX1NwbGF5VHJlZU5vZGU8Sz4gbm9kZSkgPT4gbm9kZTsKfQoKLy8vIEEgW1NldF0gb2Ygb2JqZWN0cyB0aGF0IGNhbiBiZSBvcmRlcmVkIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuCi8vLwovLy8gVGhlIHNldCBpcyBiYXNlZCBvbiBhIHNlbGYtYmFsYW5jaW5nIGJpbmFyeSB0cmVlLiBJdCBhbGxvd3MgbW9zdCBvcGVyYXRpb25zCi8vLyBpbiBhbW9ydGl6ZWQgbG9nYXJpdGhtaWMgdGltZS4KLy8vCi8vLyBFbGVtZW50cyBvZiB0aGUgc2V0IGFyZSBjb21wYXJlZCB1c2luZyB0aGUgYGNvbXBhcmVgIGZ1bmN0aW9uIHBhc3NlZCBpbgovLy8gdGhlIGNvbnN0cnVjdG9yLCBib3RoIGZvciBvcmRlcmluZyBhbmQgZm9yIGVxdWFsaXR5LgovLy8gSWYgdGhlIHNldCBjb250YWlucyBvbmx5IGFuIG9iamVjdCBgYWAsIHRoZW4gYHNldC5jb250YWlucyhiKWAKLy8vIHdpbGwgcmV0dXJuIGB0cnVlYCBpZiBhbmQgb25seSBpZiBgY29tcGFyZShhLCBiKSA9PSAwYCwKLy8vIGFuZCB0aGUgdmFsdWUgb2YgYGEgPT0gYmAgaXMgbm90IGV2ZW4gY2hlY2tlZC4KLy8vIElmIHRoZSBjb21wYXJlIGZ1bmN0aW9uIGlzIG9taXR0ZWQsIHRoZSBvYmplY3RzIGFyZSBhc3N1bWVkIHRvIGJlCi8vLyBbQ29tcGFyYWJsZV0sIGFuZCBhcmUgY29tcGFyZWQgdXNpbmcgdGhlaXIgW0NvbXBhcmFibGUuY29tcGFyZVRvXSBtZXRob2QuCi8vLyBOb24tY29tcGFyYWJsZSBvYmplY3RzIChpbmNsdWRpbmcgYG51bGxgKSB3aWxsIG5vdCB3b3JrIGFzIGFuIGVsZW1lbnQKLy8vIGluIHRoYXQgY2FzZS4KY2xhc3MgU3BsYXlUcmVlU2V0PEU+IGV4dGVuZHMgX1NwbGF5VHJlZTxFLCBfU3BsYXlUcmVlTm9kZTxFPj4KICAgIHdpdGggSXRlcmFibGVNaXhpbjxFPiwgU2V0TWl4aW48RT4gewogIF9TcGxheVRyZWVOb2RlPEU+IF9yb290OwogIGZpbmFsIF9TcGxheVRyZWVOb2RlPEU+IF9kdW1teSA9IF9TcGxheVRyZWVOb2RlPEU+KG51bGwpOwoKICBDb21wYXJhdG9yPEU+IF9jb21wYXJhdG9yOwogIF9QcmVkaWNhdGUgX3ZhbGlkS2V5OwoKICAvLy8gQ3JlYXRlIGEgbmV3IFtTcGxheVRyZWVTZXRdIHdpdGggdGhlIGdpdmVuIGNvbXBhcmUgZnVuY3Rpb24uCiAgLy8vCiAgLy8vIElmIHRoZSBbY29tcGFyZV0gZnVuY3Rpb24gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gW0NvbXBhcmFibGUuY29tcGFyZV0sCiAgLy8vIGFuZCB0aGUgZWxlbWVudHMgbXVzdCBiZSBjb21wYXJhYmxlLgogIC8vLwogIC8vLyBBIHByb3ZpZGVkIGBjb21wYXJlYCBmdW5jdGlvbiBtYXkgbm90IHdvcmsgb24gYWxsIG9iamVjdHMuIEl0IG1heSBub3QgZXZlbgogIC8vLyB3b3JrIG9uIGFsbCBgRWAgaW5zdGFuY2VzLgogIC8vLwogIC8vLyBGb3Igb3BlcmF0aW9ucyB0aGF0IGFkZCBlbGVtZW50cyB0byB0aGUgc2V0LCB0aGUgdXNlciBpcyBzdXBwb3NlZCB0byBub3QKICAvLy8gcGFzcyBpbiBvYmplY3RzIHRoYXQgZG9lc24ndCB3b3JrIHdpdGggdGhlIGNvbXBhcmUgZnVuY3Rpb24uCiAgLy8vCiAgLy8vIFRoZSBtZXRob2RzIFtjb250YWluc10sIFtyZW1vdmVdLCBbbG9va3VwXSwgW3JlbW92ZUFsbF0gb3IgW3JldGFpbkFsbF0KICAvLy8gYXJlIHR5cGVkIHRvIGFjY2VwdCBhbnkgb2JqZWN0KHMpLCBhbmQgdGhlIFtpc1ZhbGlkS2V5XSB0ZXN0IGNhbiB1c2VkIHRvCiAgLy8vIGZpbHRlciB0aG9zZSBvYmplY3RzIGJlZm9yZSBoYW5kaW5nIHRoZW0gdG8gdGhlIGBjb21wYXJlYCBmdW5jdGlvbi4KICAvLy8KICAvLy8gSWYgW2lzVmFsaWRLZXldIGlzIHByb3ZpZGVkLCBvbmx5IHZhbHVlcyBzYXRpc2Z5aW5nIGBpc1ZhbGlkS2V5KG90aGVyKWAKICAvLy8gYXJlIGNvbXBhcmVkIHVzaW5nIHRoZSBgY29tcGFyZWAgbWV0aG9kIGluIHRoZSBtZXRob2RzIG1lbnRpb25lZCBhYm92ZS4KICAvLy8gSWYgdGhlIGBpc1ZhbGlkS2V5YCBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIGZvciBhbiBvYmplY3QsIGl0IGlzIGFzc3VtZWQgdG8KICAvLy8gbm90IGJlIGluIHRoZSBzZXQuCiAgLy8vCiAgLy8vIElmIG9taXR0ZWQsIHRoZSBgaXNWYWxpZEtleWAgZnVuY3Rpb24gZGVmYXVsdHMgdG8gY2hlY2tpbmcgYWdhaW5zdCB0aGUKICAvLy8gdHlwZSBwYXJhbWV0ZXI6IGBvdGhlciBpcyBFYC4KICBTcGxheVRyZWVTZXQoW2ludCBjb21wYXJlKEUga2V5MSwgRSBrZXkyKSwgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSldKQogICAgICA6IF9jb21wYXJhdG9yID0gY29tcGFyZSA/PyBfZGVmYXVsdENvbXBhcmU8RT4oKSwKICAgICAgICBfdmFsaWRLZXkgPSBpc1ZhbGlkS2V5ID8/ICgodikgPT4gdiBpcyBFKTsKCiAgLy8vIENyZWF0ZXMgYSBbU3BsYXlUcmVlU2V0XSB0aGF0IGNvbnRhaW5zIGFsbCBbZWxlbWVudHNdLgogIC8vLwogIC8vLyBUaGUgc2V0IHdvcmtzIGFzIGlmIGNyZWF0ZWQgYnkgYG5ldyBTcGxheVRyZWVTZXQ8RT4oY29tcGFyZSwgaXNWYWxpZEtleSlgLgogIC8vLwogIC8vLyBBbGwgdGhlIFtlbGVtZW50c10gc2hvdWxkIGJlIGluc3RhbmNlcyBvZiBbRV0gYW5kIHZhbGlkIGFyZ3VtZW50cyB0bwogIC8vLyBbY29tcGFyZV0uCiAgLy8vIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBtYXkgaGF2ZSBhbnkgZWxlbWVudCB0eXBlLCBzbyB0aGlzCiAgLy8vIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGRvd24tY2FzdCBhIGBTZXRgLCBmb3IgZXhhbXBsZSBhczoKICAvLy8gYGBgZGFydAogIC8vLyBTZXQ8U3VwZXJUeXBlPiBzdXBlclNldCA9IC4uLjsKICAvLy8gU2V0PFN1YlR5cGU+IHN1YlNldCA9CiAgLy8vICAgICBuZXcgU3BsYXlUcmVlU2V0PFN1YlR5cGU+LmZyb20oc3VwZXJTZXQud2hlcmVUeXBlPFN1YlR5cGU+KCkpOwogIC8vLyBgYGAKICBmYWN0b3J5IFNwbGF5VHJlZVNldC5mcm9tKEl0ZXJhYmxlIGVsZW1lbnRzLAogICAgICBbaW50IGNvbXBhcmUoRSBrZXkxLCBFIGtleTIpLCBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KV0pIHsKICAgIFNwbGF5VHJlZVNldDxFPiByZXN1bHQgPSBTcGxheVRyZWVTZXQ8RT4oY29tcGFyZSwgaXNWYWxpZEtleSk7CiAgICBmb3IgKGZpbmFsIGVsZW1lbnQgaW4gZWxlbWVudHMpIHsKICAgICAgRSBlID0gZWxlbWVudDsKICAgICAgcmVzdWx0LmFkZChlKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIFtTcGxheVRyZWVTZXRdIGZyb20gW2VsZW1lbnRzXS4KICAvLy8KICAvLy8gVGhlIHNldCB3b3JrcyBhcyBpZiBjcmVhdGVkIGJ5IGBuZXcgU3BsYXlUcmVlU2V0PEU+KGNvbXBhcmUsIGlzVmFsaWRLZXkpYC4KICAvLy8KICAvLy8gQWxsIHRoZSBbZWxlbWVudHNdIHNob3VsZCBiZSB2YWxpZCBhcyBhcmd1bWVudHMgdG8gdGhlIFtjb21wYXJlXSBmdW5jdGlvbi4KICBmYWN0b3J5IFNwbGF5VHJlZVNldC5vZihJdGVyYWJsZTxFPiBlbGVtZW50cywKICAgICAgICAgIFtpbnQgY29tcGFyZShFIGtleTEsIEUga2V5MiksIGJvb2wgaXNWYWxpZEtleShwb3RlbnRpYWxLZXkpXSkgPT4KICAgICAgU3BsYXlUcmVlU2V0KGNvbXBhcmUsIGlzVmFsaWRLZXkpLi5hZGRBbGwoZWxlbWVudHMpOwoKICBTZXQ8VD4gX25ld1NldDxUPigpID0+CiAgICAgIFNwbGF5VHJlZVNldDxUPigoVCBhLCBUIGIpID0+IF9jb21wYXJhdG9yKGEgYXMgRSwgYiBhcyBFKSwgX3ZhbGlkS2V5KTsKCiAgU2V0PFI+IGNhc3Q8Uj4oKSA9PiBTZXQuY2FzdEZyb208RSwgUj4odGhpcywgbmV3U2V0OiBfbmV3U2V0KTsKICBpbnQgX2NvbXBhcmUoRSBlMSwgRSBlMikgPT4gX2NvbXBhcmF0b3IoZTEsIGUyKTsKCiAgLy8gRnJvbSBJdGVyYWJsZS4KCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+IF9TcGxheVRyZWVLZXlJdGVyYXRvcjxFPih0aGlzKTsKCiAgaW50IGdldCBsZW5ndGggPT4gX2NvdW50OwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX3Jvb3QgPT0gbnVsbDsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9yb290ICE9IG51bGw7CgogIEUgZ2V0IGZpcnN0IHsKICAgIGlmIChfY291bnQgPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICByZXR1cm4gX2ZpcnN0LmtleTsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgaWYgKF9jb3VudCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHJldHVybiBfbGFzdC5rZXk7CiAgfQoKICBFIGdldCBzaW5nbGUgewogICAgaWYgKF9jb3VudCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIGlmIChfY291bnQgPiAxKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICByZXR1cm4gX3Jvb3Qua2V5OwogIH0KCiAgLy8gRnJvbSBTZXQuCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgcmV0dXJuIF92YWxpZEtleShlbGVtZW50KSAmJiBfc3BsYXkoZWxlbWVudCkgPT0gMDsKICB9CgogIGJvb2wgYWRkKEUgZWxlbWVudCkgewogICAgaW50IGNvbXBhcmUgPSBfc3BsYXkoZWxlbWVudCk7CiAgICBpZiAoY29tcGFyZSA9PSAwKSByZXR1cm4gZmFsc2U7CiAgICBfYWRkTmV3Um9vdChfU3BsYXlUcmVlTm9kZShlbGVtZW50KSwgY29tcGFyZSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgcmVtb3ZlKE9iamVjdCBvYmplY3QpIHsKICAgIGlmICghX3ZhbGlkS2V5KG9iamVjdCkpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfcmVtb3ZlKG9iamVjdCkgIT0gbnVsbDsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGVsZW1lbnRzKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICBpbnQgY29tcGFyZSA9IF9zcGxheShlbGVtZW50KTsKICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgewogICAgICAgIF9hZGROZXdSb290KF9TcGxheVRyZWVOb2RlKGVsZW1lbnQpLCBjb21wYXJlKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCByZW1vdmVBbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgZm9yIChPYmplY3QgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICBpZiAoX3ZhbGlkS2V5KGVsZW1lbnQpKSBfcmVtb3ZlKGVsZW1lbnQpOwogICAgfQogIH0KCiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgLy8gQnVpbGQgYSBzZXQgd2l0aCB0aGUgc2FtZSBzZW5zZSBvZiBlcXVhbGl0eSBhcyB0aGlzIHNldC4KICAgIFNwbGF5VHJlZVNldDxFPiByZXRhaW5TZXQgPSBTcGxheVRyZWVTZXQ8RT4oX2NvbXBhcmF0b3IsIF92YWxpZEtleSk7CiAgICBpbnQgbW9kaWZpY2F0aW9uQ291bnQgPSBfbW9kaWZpY2F0aW9uQ291bnQ7CiAgICBmb3IgKE9iamVjdCBvYmplY3QgaW4gZWxlbWVudHMpIHsKICAgICAgaWYgKG1vZGlmaWNhdGlvbkNvdW50ICE9IF9tb2RpZmljYXRpb25Db3VudCkgewogICAgICAgIC8vIFRoZSBpdGVyYXRvciBzaG91bGQgbm90IGhhdmUgc2lkZSBlZmZlY3RzLgogICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgICAvLyBFcXVpdmFsZW50IHRvIHRoaXMuY29udGFpbnMob2JqZWN0KS4KICAgICAgaWYgKF92YWxpZEtleShvYmplY3QpICYmIF9zcGxheShvYmplY3QpID09IDApIHsKICAgICAgICByZXRhaW5TZXQuYWRkKF9yb290LmtleSk7CiAgICAgIH0KICAgIH0KICAgIC8vIFRha2Ugb3ZlciB0aGUgZWxlbWVudHMgZnJvbSB0aGUgcmV0YWluZWQgc2V0LCBpZiBpdCBkaWZmZXJzLgogICAgaWYgKHJldGFpblNldC5fY291bnQgIT0gX2NvdW50KSB7CiAgICAgIF9yb290ID0gcmV0YWluU2V0Ll9yb290OwogICAgICBfY291bnQgPSByZXRhaW5TZXQuX2NvdW50OwogICAgICBfbW9kaWZpY2F0aW9uQ291bnQrKzsKICAgIH0KICB9CgogIEUgbG9va3VwKE9iamVjdCBvYmplY3QpIHsKICAgIGlmICghX3ZhbGlkS2V5KG9iamVjdCkpIHJldHVybiBudWxsOwogICAgaW50IGNvbXAgPSBfc3BsYXkob2JqZWN0KTsKICAgIGlmIChjb21wICE9IDApIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9yb290LmtleTsKICB9CgogIFNldDxFPiBpbnRlcnNlY3Rpb24oU2V0PE9iamVjdD4gb3RoZXIpIHsKICAgIFNldDxFPiByZXN1bHQgPSBTcGxheVRyZWVTZXQ8RT4oX2NvbXBhcmF0b3IsIF92YWxpZEtleSk7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmIChvdGhlci5jb250YWlucyhlbGVtZW50KSkgcmVzdWx0LmFkZChlbGVtZW50KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTZXQ8RT4gZGlmZmVyZW5jZShTZXQ8T2JqZWN0PiBvdGhlcikgewogICAgU2V0PEU+IHJlc3VsdCA9IFNwbGF5VHJlZVNldDxFPihfY29tcGFyYXRvciwgX3ZhbGlkS2V5KTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKCFvdGhlci5jb250YWlucyhlbGVtZW50KSkgcmVzdWx0LmFkZChlbGVtZW50KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTZXQ8RT4gdW5pb24oU2V0PEU+IG90aGVyKSB7CiAgICByZXR1cm4gX2Nsb25lKCkuLmFkZEFsbChvdGhlcik7CiAgfQoKICBTcGxheVRyZWVTZXQ8RT4gX2Nsb25lKCkgewogICAgdmFyIHNldCA9IFNwbGF5VHJlZVNldDxFPihfY29tcGFyYXRvciwgX3ZhbGlkS2V5KTsKICAgIHNldC5fY291bnQgPSBfY291bnQ7CiAgICBzZXQuX3Jvb3QgPSBfY29weU5vZGUoX3Jvb3QpOwogICAgcmV0dXJuIHNldDsKICB9CgogIC8vIENvcGllcyB0aGUgc3RydWN0dXJlIG9mIGEgU3BsYXlUcmVlIGludG8gYSBuZXcgc2ltaWxhciBzdHJ1Y3R1cmUuCiAgLy8gV29ya3Mgb24gX1NwbGF5VHJlZU1hcE5vZGUgYXMgd2VsbCwgYnV0IG9ubHkgY29waWVzIHRoZSBrZXlzLAogIF9TcGxheVRyZWVOb2RlPEU+IF9jb3B5Tm9kZShfU3BsYXlUcmVlTm9kZTxFPiBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfU3BsYXlUcmVlTm9kZTxFPihub2RlLmtleSkKICAgICAgLi5sZWZ0ID0gX2NvcHlOb2RlKG5vZGUubGVmdCkKICAgICAgLi5yaWdodCA9IF9jb3B5Tm9kZShub2RlLnJpZ2h0KTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfY2xlYXIoKTsKICB9CgogIFNldDxFPiB0b1NldCgpID0+IF9jbG9uZSgpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBJdGVyYWJsZUJhc2UuaXRlcmFibGVUb0Z1bGxTdHJpbmcodGhpcywgJ3snLCAnfScpOwp9CoNBAE5OPAEZATABQiQaDxobARwCASYEMjoLNQIBOQRDH0AqP0Y1EhwBST4TASsSAUAGLx4BPwY7PBcBNyEBRRwBJyABSUZHRUIGSSgWIgEzRkhCGBkaDhMpFikwGBswJB8ZKwoXHhkgHSoxGBokJB4ZLAoWHhghDw8IBhEfICEhFQEZGBMRBAFKGUopJgFKGU1KKSYBGCQcIBkOHB4bDSBIJUcPGwYaEwQBPAZKECoOGhkUDgYcFBkgGg0aHhkGEgQBFCQeEgQBEyQeEgQBEhIQGgQCARUaAgFHASVBFCciFAQ5GgIBQwRQIwRIOUQ8M0ZORBIES0xHTEwUSBohTgEdGAFNNzMBTQZDMCdGSRsVCBMEAU0rSz4BTxIGTzgGSUQGTCU3FxgjKEZDEAQBSQZPOgZNJQZIS0ZGNhAEATsBHAEeJhkeFxwIBhEEARkmNC8RBAEmL0UoHBUbDgY2BAEnLxwVGgYwIhozLwYlGlAZBjYSBAEhJRkIBAEVHAQBIwEpSR80HwYEARMTBAERDgQBIS8EASUpKR0uMDMKQhoIFAYBGQQBOgFBAUoRJBcEAUkQJBYEAU8oGy8kHCQpIyEZBhUEAU8oGy8kHCQqIyAYBhUEAgFBMAEiBj0/OyUGP0MBMAY9KwZGOxoBRwZMEwEUIgE8FjYpKQQBUBY3JCkkF0sxDSEGBAESKyQEATkbGxgGBAE+Bi9CQi05IhcfLA0lMiQGBAEUOjAGOkoZSRUdGxQGRCYGKzERBAEnAgFEKiUiKT8BE08fLBAEAgFJGyYhKEMCAUJMMwIBR0AoLBoEAgEgN08iOSc/AgFDBFAjBEw5QzwzRk5KEj8pGzwBHRgBQwZRKwZRIQZPQwZNT0oGTk5RGQZNJE03MwE9BlEGSxFIRA4lHEkKL0ZDJhUVBhMEATAGUQZRMEs7ARlNAUEzARQBPgEcJSgBED0XBAEPPRYEARE9OhYEAQ8iNwQBGCMkMxEEAR8qJAQBJiIlGjcIBgQBLicwBgQBLkBJMCY1NjEILjYiCAZEJh8hHAYEARwpHyAWBAErPR44BhMEASk9HjkGEwQBHyQEAR03GSIQBAFHQzgjJyQnBAERDgQBHgFKAgEfZGFydDpjb2xsZWN0aW9uL3NwbGF5X3RyZWUuZGFydDVvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2NvbGxlY3Rpb25fcGF0Y2guZGFydMAAZhQvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIE5vdGU6IHRoZSBWTSBjb25jYXRlbmF0ZXMgYWxsIHBhdGNoIGZpbGVzIGludG8gYSBzaW5nbGUgcGF0Y2ggZmlsZS4gVGhpcwovLy8gZmlsZSBpcyB0aGUgZmlyc3QgcGF0Y2ggaW4gImRhcnQ6Y29sbGVjdGlvbiIgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbXBvcnRzCi8vLyB1c2VkIGJ5IHBhdGNoZXMgb2YgdGhhdCBsaWJyYXJ5LiBXZSBwbGFuIHRvIGNoYW5nZSB0aGlzIHdoZW4gd2UgaGF2ZSBhCi8vLyBzaGFyZWQgZnJvbnQgZW5kIGFuZCBzaW1wbHkgdXNlIHBhcnRzLgoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgYXMgaW50ZXJuYWw7CgppbXBvcnQgImRhcnQ6X2ludGVybmFsIiBzaG93IHBhdGNoLCBJdGVyYWJsZUVsZW1lbnRFcnJvcjsKCmltcG9ydCAiZGFydDp0eXBlZF9kYXRhIiBzaG93IFVpbnQzMkxpc3Q7CgovLy8gVGhlc2UgYXJlIHRoZSBhZGRpdGlvbmFsIHBhcnRzIG9mIHRoaXMgcGF0Y2ggbGlicmFyeToKLy8gcGFydCAiY29tcGFjdF9oYXNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIEhhc2hNYXA8SywgVj4gewogIEBwYXRjaAogIGZhY3RvcnkgSGFzaE1hcCgKICAgICAge2Jvb2wgZXF1YWxzKEsga2V5MSwgSyBrZXkyKSwKICAgICAgaW50IGhhc2hDb2RlKEsga2V5KSwKICAgICAgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSl9KSB7CiAgICBpZiAoaXNWYWxpZEtleSA9PSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBudWxsKSB7CiAgICAgICAgaWYgKGVxdWFscyA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gbmV3IF9IYXNoTWFwPEssIFY+KCk7CiAgICAgICAgfQogICAgICAgIGhhc2hDb2RlID0gX2RlZmF1bHRIYXNoQ29kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaWRlbnRpY2FsKGlkZW50aXR5SGFzaENvZGUsIGhhc2hDb2RlKSAmJgogICAgICAgICAgICBpZGVudGljYWwoaWRlbnRpY2FsLCBlcXVhbHMpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IF9JZGVudGl0eUhhc2hNYXA8SywgVj4oKTsKICAgICAgICB9CiAgICAgICAgZXF1YWxzID8/PSBfZGVmYXVsdEVxdWFsczsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaGFzaENvZGUgPz89IF9kZWZhdWx0SGFzaENvZGU7CiAgICAgIGVxdWFscyA/Pz0gX2RlZmF1bHRFcXVhbHM7CiAgICB9CiAgICByZXR1cm4gbmV3IF9DdXN0b21IYXNoTWFwPEssIFY+KGVxdWFscywgaGFzaENvZGUsIGlzVmFsaWRLZXkpOwogIH0KCiAgQHBhdGNoCiAgZmFjdG9yeSBIYXNoTWFwLmlkZW50aXR5KCkgPT4gbmV3IF9JZGVudGl0eUhhc2hNYXA8SywgVj4oKTsKCiAgU2V0PEs+IF9uZXdLZXlTZXQoKTsKfQoKY29uc3QgaW50IF9NT0RJRklDQVRJT05fQ09VTlRfTUFTSyA9IDB4M2ZmZmZmZmY7CgpjbGFzcyBfSGFzaE1hcDxLLCBWPiBleHRlbmRzIE1hcEJhc2U8SywgVj4gaW1wbGVtZW50cyBIYXNoTWFwPEssIFY+IHsKICBzdGF0aWMgY29uc3QgaW50IF9JTklUSUFMX0NBUEFDSVRZID0gODsKCiAgaW50IF9lbGVtZW50Q291bnQgPSAwOwogIExpc3Q8X0hhc2hNYXBFbnRyeTxLLCBWPj4gX2J1Y2tldHMgPQogICAgICBuZXcgTGlzdDxfSGFzaE1hcEVudHJ5PEssIFY+PihfSU5JVElBTF9DQVBBQ0lUWSk7CiAgaW50IF9tb2RpZmljYXRpb25Db3VudCA9IDA7CgogIGludCBnZXQgbGVuZ3RoID0+IF9lbGVtZW50Q291bnQ7CiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfZWxlbWVudENvdW50ID09IDA7CiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfZWxlbWVudENvdW50ICE9IDA7CgogIEl0ZXJhYmxlPEs+IGdldCBrZXlzID0+IG5ldyBfSGFzaE1hcEtleUl0ZXJhYmxlPEssIFY+KHRoaXMpOwogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgPT4gbmV3IF9IYXNoTWFwVmFsdWVJdGVyYWJsZTxLLCBWPih0aGlzKTsKCiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IGtleS5oYXNoQ29kZTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAoYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIGVudHJ5LmtleSA9PSBrZXkpIHJldHVybiB0cnVlOwogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBsZW5ndGggPSBidWNrZXRzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGVudHJ5ID0gYnVja2V0c1tpXTsKICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgICBpZiAoZW50cnkudmFsdWUgPT0gdmFsdWUpIHJldHVybiB0cnVlOwogICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IGtleS5oYXNoQ29kZTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAoYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIGVudHJ5LmtleSA9PSBrZXkpIHsKICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7CiAgICAgIH0KICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShLIGtleSwgViB2YWx1ZSkgewogICAgZmluYWwgaGFzaENvZGUgPSBrZXkuaGFzaENvZGU7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBsZW5ndGggPSBidWNrZXRzLmxlbmd0aDsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAobGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBlbnRyeS5rZXkgPT0ga2V5KSB7CiAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgX2FkZEVudHJ5KGJ1Y2tldHMsIGluZGV4LCBsZW5ndGgsIGtleSwgdmFsdWUsIGhhc2hDb2RlKTsKICB9CgogIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgaWZBYnNlbnQoKSkgewogICAgZmluYWwgaGFzaENvZGUgPSBrZXkuaGFzaENvZGU7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBsZW5ndGggPSBidWNrZXRzLmxlbmd0aDsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAobGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBlbnRyeS5rZXkgPT0ga2V5KSB7CiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlOwogICAgICB9CiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgIH0KICAgIGZpbmFsIHN0YW1wID0gX21vZGlmaWNhdGlvbkNvdW50OwogICAgZmluYWwgViB2YWx1ZSA9IGlmQWJzZW50KCk7CiAgICBpZiAoc3RhbXAgPT0gX21vZGlmaWNhdGlvbkNvdW50KSB7CiAgICAgIF9hZGRFbnRyeShidWNrZXRzLCBpbmRleCwgbGVuZ3RoLCBrZXksIHZhbHVlLCBoYXNoQ29kZSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzW2tleV0gPSB2YWx1ZTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIHZvaWQgYWRkQWxsKE1hcDxLLCBWPiBvdGhlcikgewogICAgb3RoZXIuZm9yRWFjaCgoSyBrZXksIFYgdmFsdWUpIHsKICAgICAgdGhpc1trZXldID0gdmFsdWU7CiAgICB9KTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGFjdGlvbihLIGtleSwgViB2YWx1ZSkpIHsKICAgIGZpbmFsIHN0YW1wID0gX21vZGlmaWNhdGlvbkNvdW50OwogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgbGVuZ3RoID0gYnVja2V0cy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaV07CiAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgYWN0aW9uKGVudHJ5LmtleSwgZW50cnkudmFsdWUpOwogICAgICAgIGlmIChzdGFtcCAhPSBfbW9kaWZpY2F0aW9uQ291bnQpIHsKICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgICAgfQogICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgICAgfQogICAgfQogIH0KCiAgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgZmluYWwgaGFzaENvZGUgPSBrZXkuaGFzaENvZGU7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKGJ1Y2tldHMubGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIF9IYXNoTWFwRW50cnk8SywgVj4gcHJldmlvdXMgPSBudWxsOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgZmluYWwgbmV4dCA9IGVudHJ5Lm5leHQ7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBlbnRyeS5rZXkgPT0ga2V5KSB7CiAgICAgICAgX3JlbW92ZUVudHJ5KGVudHJ5LCBwcmV2aW91cywgaW5kZXgpOwogICAgICAgIF9lbGVtZW50Q291bnQtLTsKICAgICAgICBfbW9kaWZpY2F0aW9uQ291bnQgPQogICAgICAgICAgICAoX21vZGlmaWNhdGlvbkNvdW50ICsgMSkgJiBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0s7CiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlOwogICAgICB9CiAgICAgIHByZXZpb3VzID0gZW50cnk7CiAgICAgIGVudHJ5ID0gbmV4dDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIF9idWNrZXRzID0gbmV3IExpc3QoX0lOSVRJQUxfQ0FQQUNJVFkpOwogICAgaWYgKF9lbGVtZW50Q291bnQgPiAwKSB7CiAgICAgIF9lbGVtZW50Q291bnQgPSAwOwogICAgICBfbW9kaWZpY2F0aW9uQ291bnQgPSAoX21vZGlmaWNhdGlvbkNvdW50ICsgMSkgJiBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0s7CiAgICB9CiAgfQoKICB2b2lkIF9yZW1vdmVFbnRyeShfSGFzaE1hcEVudHJ5PEssIFY+IGVudHJ5LAogICAgICBfSGFzaE1hcEVudHJ5PEssIFY+IHByZXZpb3VzSW5CdWNrZXQsIGludCBidWNrZXRJbmRleCkgewogICAgaWYgKHByZXZpb3VzSW5CdWNrZXQgPT0gbnVsbCkgewogICAgICBfYnVja2V0c1tidWNrZXRJbmRleF0gPSBlbnRyeS5uZXh0OwogICAgfSBlbHNlIHsKICAgICAgcHJldmlvdXNJbkJ1Y2tldC5uZXh0ID0gZW50cnkubmV4dDsKICAgIH0KICB9CgogIHZvaWQgX2FkZEVudHJ5KExpc3Q8X0hhc2hNYXBFbnRyeTxLLCBWPj4gYnVja2V0cywgaW50IGluZGV4LCBpbnQgbGVuZ3RoLAogICAgICBLIGtleSwgViB2YWx1ZSwgaW50IGhhc2hDb2RlKSB7CiAgICBmaW5hbCBlbnRyeSA9IG5ldyBfSGFzaE1hcEVudHJ5PEssIFY+KGtleSwgdmFsdWUsIGhhc2hDb2RlLCBidWNrZXRzW2luZGV4XSk7CiAgICBidWNrZXRzW2luZGV4XSA9IGVudHJ5OwogICAgZmluYWwgbmV3RWxlbWVudHMgPSBfZWxlbWVudENvdW50ICsgMTsKICAgIF9lbGVtZW50Q291bnQgPSBuZXdFbGVtZW50czsKICAgIC8vIElmIHdlIGVuZCB1cCB3aXRoIG1vcmUgdGhhbiA3NSUgbm9uLWVtcHR5IGVudHJpZXMsIHdlCiAgICAvLyByZXNpemUgdGhlIGJhY2tpbmcgc3RvcmUuCiAgICBpZiAoKG5ld0VsZW1lbnRzIDw8IDIpID4gKChsZW5ndGggPDwgMSkgKyBsZW5ndGgpKSBfcmVzaXplKCk7CiAgICBfbW9kaWZpY2F0aW9uQ291bnQgPSAoX21vZGlmaWNhdGlvbkNvdW50ICsgMSkgJiBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0s7CiAgfQoKICB2b2lkIF9yZXNpemUoKSB7CiAgICBmaW5hbCBvbGRCdWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBvbGRMZW5ndGggPSBvbGRCdWNrZXRzLmxlbmd0aDsKICAgIGZpbmFsIG5ld0xlbmd0aCA9IG9sZExlbmd0aCA8PCAxOwogICAgZmluYWwgbmV3QnVja2V0cyA9IG5ldyBMaXN0PF9IYXNoTWFwRW50cnk8SywgVj4+KG5ld0xlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG9sZExlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbnRyeSA9IG9sZEJ1Y2tldHNbaV07CiAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgZmluYWwgbmV4dCA9IGVudHJ5Lm5leHQ7CiAgICAgICAgZmluYWwgaGFzaENvZGUgPSBlbnRyeS5oYXNoQ29kZTsKICAgICAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKG5ld0xlbmd0aCAtIDEpOwogICAgICAgIGVudHJ5Lm5leHQgPSBuZXdCdWNrZXRzW2luZGV4XTsKICAgICAgICBuZXdCdWNrZXRzW2luZGV4XSA9IGVudHJ5OwogICAgICAgIGVudHJ5ID0gbmV4dDsKICAgICAgfQogICAgfQogICAgX2J1Y2tldHMgPSBuZXdCdWNrZXRzOwogIH0KCiAgU2V0PEs+IF9uZXdLZXlTZXQoKSA9PiBuZXcgX0hhc2hTZXQ8Sz4oKTsKfQoKY2xhc3MgX0N1c3RvbUhhc2hNYXA8SywgVj4gZXh0ZW5kcyBfSGFzaE1hcDxLLCBWPiB7CiAgZmluYWwgX0VxdWFsaXR5PEs+IF9lcXVhbHM7CiAgZmluYWwgX0hhc2hlcjxLPiBfaGFzaENvZGU7CiAgZmluYWwgX1ByZWRpY2F0ZSBfdmFsaWRLZXk7CiAgX0N1c3RvbUhhc2hNYXAodGhpcy5fZXF1YWxzLCB0aGlzLl9oYXNoQ29kZSwgdmFsaWRLZXkpCiAgICAgIDogX3ZhbGlkS2V5ID0gKHZhbGlkS2V5ICE9IG51bGwpID8gdmFsaWRLZXkgOiBuZXcgX1R5cGVUZXN0PEs+KCkudGVzdDsKCiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSB7CiAgICBpZiAoIV92YWxpZEtleShrZXkpKSByZXR1cm4gZmFsc2U7CiAgICBmaW5hbCBoYXNoQ29kZSA9IF9oYXNoQ29kZShrZXkpOwogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChidWNrZXRzLmxlbmd0aCAtIDEpOwogICAgdmFyIGVudHJ5ID0gYnVja2V0c1tpbmRleF07CiAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICBpZiAoaGFzaENvZGUgPT0gZW50cnkuaGFzaENvZGUgJiYgX2VxdWFscyhlbnRyeS5rZXksIGtleSkpIHJldHVybiB0cnVlOwogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpIHsKICAgIGlmICghX3ZhbGlkS2V5KGtleSkpIHJldHVybiBudWxsOwogICAgZmluYWwgaGFzaENvZGUgPSBfaGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAoYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIF9lcXVhbHMoZW50cnkua2V5LCBrZXkpKSB7CiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlOwogICAgICB9CiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpIHsKICAgIGZpbmFsIGhhc2hDb2RlID0gX2hhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBsZW5ndGggPSBidWNrZXRzLmxlbmd0aDsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAobGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBfZXF1YWxzKGVudHJ5LmtleSwga2V5KSkgewogICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgIH0KICAgIF9hZGRFbnRyeShidWNrZXRzLCBpbmRleCwgbGVuZ3RoLCBrZXksIHZhbHVlLCBoYXNoQ29kZSk7CiAgfQoKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIGZpbmFsIGhhc2hDb2RlID0gX2hhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBsZW5ndGggPSBidWNrZXRzLmxlbmd0aDsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAobGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBfZXF1YWxzKGVudHJ5LmtleSwga2V5KSkgewogICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTsKICAgICAgfQogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICBpbnQgc3RhbXAgPSBfbW9kaWZpY2F0aW9uQ291bnQ7CiAgICBWIHZhbHVlID0gaWZBYnNlbnQoKTsKICAgIGlmIChzdGFtcCA9PSBfbW9kaWZpY2F0aW9uQ291bnQpIHsKICAgICAgX2FkZEVudHJ5KGJ1Y2tldHMsIGluZGV4LCBsZW5ndGgsIGtleSwgdmFsdWUsIGhhc2hDb2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXNba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgaWYgKCFfdmFsaWRLZXkoa2V5KSkgcmV0dXJuIG51bGw7CiAgICBmaW5hbCBoYXNoQ29kZSA9IF9oYXNoQ29kZShrZXkpOwogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChidWNrZXRzLmxlbmd0aCAtIDEpOwogICAgdmFyIGVudHJ5ID0gYnVja2V0c1tpbmRleF07CiAgICBfSGFzaE1hcEVudHJ5PEssIFY+IHByZXZpb3VzID0gbnVsbDsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGZpbmFsIG5leHQgPSBlbnRyeS5uZXh0OwogICAgICBpZiAoaGFzaENvZGUgPT0gZW50cnkuaGFzaENvZGUgJiYgX2VxdWFscyhlbnRyeS5rZXksIGtleSkpIHsKICAgICAgICBfcmVtb3ZlRW50cnkoZW50cnksIHByZXZpb3VzLCBpbmRleCk7CiAgICAgICAgX2VsZW1lbnRDb3VudC0tOwogICAgICAgIF9tb2RpZmljYXRpb25Db3VudCA9CiAgICAgICAgICAgIChfbW9kaWZpY2F0aW9uQ291bnQgKyAxKSAmIF9NT0RJRklDQVRJT05fQ09VTlRfTUFTSzsKICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7CiAgICAgIH0KICAgICAgcHJldmlvdXMgPSBlbnRyeTsKICAgICAgZW50cnkgPSBuZXh0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBTZXQ8Sz4gX25ld0tleVNldCgpID0+IG5ldyBfQ3VzdG9tSGFzaFNldDxLPihfZXF1YWxzLCBfaGFzaENvZGUsIF92YWxpZEtleSk7Cn0KCmNsYXNzIF9JZGVudGl0eUhhc2hNYXA8SywgVj4gZXh0ZW5kcyBfSGFzaE1hcDxLLCBWPiB7CiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IGlkZW50aXR5SGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAoYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIGlkZW50aWNhbChlbnRyeS5rZXksIGtleSkpIHJldHVybiB0cnVlOwogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpIHsKICAgIGZpbmFsIGhhc2hDb2RlID0gaWRlbnRpdHlIYXNoQ29kZShrZXkpOwogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChidWNrZXRzLmxlbmd0aCAtIDEpOwogICAgdmFyIGVudHJ5ID0gYnVja2V0c1tpbmRleF07CiAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICBpZiAoaGFzaENvZGUgPT0gZW50cnkuaGFzaENvZGUgJiYgaWRlbnRpY2FsKGVudHJ5LmtleSwga2V5KSkgewogICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTsKICAgICAgfQogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IGlkZW50aXR5SGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGxlbmd0aCA9IGJ1Y2tldHMubGVuZ3RoOwogICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChsZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIGlkZW50aWNhbChlbnRyeS5rZXksIGtleSkpIHsKICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICBfYWRkRW50cnkoYnVja2V0cywgaW5kZXgsIGxlbmd0aCwga2V5LCB2YWx1ZSwgaGFzaENvZGUpOwogIH0KCiAgViBwdXRJZkFic2VudChLIGtleSwgViBpZkFic2VudCgpKSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IGlkZW50aXR5SGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGxlbmd0aCA9IGJ1Y2tldHMubGVuZ3RoOwogICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChsZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIGlkZW50aWNhbChlbnRyeS5rZXksIGtleSkpIHsKICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7CiAgICAgIH0KICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgZmluYWwgc3RhbXAgPSBfbW9kaWZpY2F0aW9uQ291bnQ7CiAgICBWIHZhbHVlID0gaWZBYnNlbnQoKTsKICAgIGlmIChzdGFtcCA9PSBfbW9kaWZpY2F0aW9uQ291bnQpIHsKICAgICAgX2FkZEVudHJ5KGJ1Y2tldHMsIGluZGV4LCBsZW5ndGgsIGtleSwgdmFsdWUsIGhhc2hDb2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXNba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgZmluYWwgaGFzaENvZGUgPSBpZGVudGl0eUhhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKGJ1Y2tldHMubGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIF9IYXNoTWFwRW50cnk8SywgVj4gcHJldmlvdXMgPSBudWxsOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgZmluYWwgbmV4dCA9IGVudHJ5Lm5leHQ7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBpZGVudGljYWwoZW50cnkua2V5LCBrZXkpKSB7CiAgICAgICAgX3JlbW92ZUVudHJ5KGVudHJ5LCBwcmV2aW91cywgaW5kZXgpOwogICAgICAgIF9lbGVtZW50Q291bnQtLTsKICAgICAgICBfbW9kaWZpY2F0aW9uQ291bnQgPQogICAgICAgICAgICAoX21vZGlmaWNhdGlvbkNvdW50ICsgMSkgJiBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0s7CiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlOwogICAgICB9CiAgICAgIHByZXZpb3VzID0gZW50cnk7CiAgICAgIGVudHJ5ID0gbmV4dDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgU2V0PEs+IF9uZXdLZXlTZXQoKSA9PiBuZXcgX0lkZW50aXR5SGFzaFNldDxLPigpOwp9CgpjbGFzcyBfSGFzaE1hcEVudHJ5PEssIFY+IHsKICBmaW5hbCBLIGtleTsKICBWIHZhbHVlOwogIGZpbmFsIGludCBoYXNoQ29kZTsKICBfSGFzaE1hcEVudHJ5PEssIFY+IG5leHQ7CiAgX0hhc2hNYXBFbnRyeSh0aGlzLmtleSwgdGhpcy52YWx1ZSwgdGhpcy5oYXNoQ29kZSwgdGhpcy5uZXh0KTsKfQoKYWJzdHJhY3QgY2xhc3MgX0hhc2hNYXBJdGVyYWJsZTxLLCBWLCBFPgogICAgZXh0ZW5kcyBpbnRlcm5hbC5FZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPiB7CiAgZmluYWwgX0hhc2hNYXA8SywgVj4gX21hcDsKICBfSGFzaE1hcEl0ZXJhYmxlKHRoaXMuX21hcCk7CiAgaW50IGdldCBsZW5ndGggPT4gX21hcC5sZW5ndGg7CiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfbWFwLmlzRW1wdHk7CiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfbWFwLmlzTm90RW1wdHk7Cn0KCmNsYXNzIF9IYXNoTWFwS2V5SXRlcmFibGU8SywgVj4gZXh0ZW5kcyBfSGFzaE1hcEl0ZXJhYmxlPEssIFYsIEs+IHsKICBfSGFzaE1hcEtleUl0ZXJhYmxlKF9IYXNoTWFwPEssIFY+IG1hcCkgOiBzdXBlcihtYXApOwogIEl0ZXJhdG9yPEs+IGdldCBpdGVyYXRvciA9PiBuZXcgX0hhc2hNYXBLZXlJdGVyYXRvcjxLLCBWPihfbWFwKTsKICBib29sIGNvbnRhaW5zKE9iamVjdCBrZXkpID0+IF9tYXAuY29udGFpbnNLZXkoa2V5KTsKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oSyBrZXkpKSB7CiAgICBfbWFwLmZvckVhY2goKEsga2V5LCBfKSB7CiAgICAgIGFjdGlvbihrZXkpOwogICAgfSk7CiAgfQoKICBTZXQ8Sz4gdG9TZXQoKSA9PiBfbWFwLl9uZXdLZXlTZXQoKS4uYWRkQWxsKHRoaXMpOwp9CgpjbGFzcyBfSGFzaE1hcFZhbHVlSXRlcmFibGU8SywgVj4gZXh0ZW5kcyBfSGFzaE1hcEl0ZXJhYmxlPEssIFYsIFY+IHsKICBfSGFzaE1hcFZhbHVlSXRlcmFibGUoX0hhc2hNYXA8SywgVj4gbWFwKSA6IHN1cGVyKG1hcCk7CiAgSXRlcmF0b3I8Vj4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBfSGFzaE1hcFZhbHVlSXRlcmF0b3I8SywgVj4oX21hcCk7CiAgYm9vbCBjb250YWlucyhPYmplY3QgdmFsdWUpID0+IF9tYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CiAgdm9pZCBmb3JFYWNoKHZvaWQgYWN0aW9uKFYgdmFsdWUpKSB7CiAgICBfbWFwLmZvckVhY2goKF8sIFYgdmFsdWUpIHsKICAgICAgYWN0aW9uKHZhbHVlKTsKICAgIH0pOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX0hhc2hNYXBJdGVyYXRvcjxLLCBWLCBFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBfSGFzaE1hcDxLLCBWPiBfbWFwOwogIGZpbmFsIGludCBfc3RhbXA7CgogIGludCBfaW5kZXggPSAwOwogIF9IYXNoTWFwRW50cnk8SywgVj4gX2VudHJ5OwoKICBfSGFzaE1hcEl0ZXJhdG9yKHRoaXMuX21hcCkgOiBfc3RhbXAgPSBfbWFwLl9tb2RpZmljYXRpb25Db3VudDsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfc3RhbXAgIT0gX21hcC5fbW9kaWZpY2F0aW9uQ291bnQpIHsKICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcihfbWFwKTsKICAgIH0KICAgIHZhciBlbnRyeSA9IF9lbnRyeTsKICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGZpbmFsIG5leHQgPSBlbnRyeS5uZXh0OwogICAgICBpZiAobmV4dCAhPSBudWxsKSB7CiAgICAgICAgX2VudHJ5ID0gbmV4dDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBfZW50cnkgPSBudWxsOwogICAgfQogICAgZmluYWwgYnVja2V0cyA9IF9tYXAuX2J1Y2tldHM7CiAgICBmaW5hbCBsZW5ndGggPSBidWNrZXRzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSBfaW5kZXg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBlbnRyeSA9IGJ1Y2tldHNbaV07CiAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgX2luZGV4ID0gaSArIDE7CiAgICAgICAgX2VudHJ5ID0gZW50cnk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIF9pbmRleCA9IGxlbmd0aDsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KCmNsYXNzIF9IYXNoTWFwS2V5SXRlcmF0b3I8SywgVj4gZXh0ZW5kcyBfSGFzaE1hcEl0ZXJhdG9yPEssIFYsIEs+IHsKICBfSGFzaE1hcEtleUl0ZXJhdG9yKF9IYXNoTWFwPEssIFY+IG1hcCkgOiBzdXBlcihtYXApOwogIEsgZ2V0IGN1cnJlbnQgPT4gX2VudHJ5Py5rZXk7Cn0KCmNsYXNzIF9IYXNoTWFwVmFsdWVJdGVyYXRvcjxLLCBWPiBleHRlbmRzIF9IYXNoTWFwSXRlcmF0b3I8SywgViwgVj4gewogIF9IYXNoTWFwVmFsdWVJdGVyYXRvcihfSGFzaE1hcDxLLCBWPiBtYXApIDogc3VwZXIobWFwKTsKICBWIGdldCBjdXJyZW50ID0+IF9lbnRyeT8udmFsdWU7Cn0KCkBwYXRjaApjbGFzcyBIYXNoU2V0PEU+IHsKICBAcGF0Y2gKICBmYWN0b3J5IEhhc2hTZXQoCiAgICAgIHtib29sIGVxdWFscyhFIGUxLCBFIGUyKSwKICAgICAgaW50IGhhc2hDb2RlKEUgZSksCiAgICAgIGJvb2wgaXNWYWxpZEtleShwb3RlbnRpYWxLZXkpfSkgewogICAgaWYgKGlzVmFsaWRLZXkgPT0gbnVsbCkgewogICAgICBpZiAoaGFzaENvZGUgPT0gbnVsbCkgewogICAgICAgIGlmIChlcXVhbHMgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIG5ldyBfSGFzaFNldDxFPigpOwogICAgICAgIH0KICAgICAgICBoYXNoQ29kZSA9IF9kZWZhdWx0SGFzaENvZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlkZW50aWNhbChpZGVudGl0eUhhc2hDb2RlLCBoYXNoQ29kZSkgJiYKICAgICAgICAgICAgaWRlbnRpY2FsKGlkZW50aWNhbCwgZXF1YWxzKSkgewogICAgICAgICAgcmV0dXJuIG5ldyBfSWRlbnRpdHlIYXNoU2V0PEU+KCk7CiAgICAgICAgfQogICAgICAgIGVxdWFscyA/Pz0gX2RlZmF1bHRFcXVhbHM7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGhhc2hDb2RlID8/PSBfZGVmYXVsdEhhc2hDb2RlOwogICAgICBlcXVhbHMgPz89IF9kZWZhdWx0RXF1YWxzOwogICAgfQogICAgcmV0dXJuIG5ldyBfQ3VzdG9tSGFzaFNldDxFPihlcXVhbHMsIGhhc2hDb2RlLCBpc1ZhbGlkS2V5KTsKICB9CgogIEBwYXRjaAogIGZhY3RvcnkgSGFzaFNldC5pZGVudGl0eSgpID0+IG5ldyBfSWRlbnRpdHlIYXNoU2V0PEU+KCk7Cn0KCmNsYXNzIF9IYXNoU2V0PEU+IGV4dGVuZHMgX1NldEJhc2U8RT4gaW1wbGVtZW50cyBIYXNoU2V0PEU+IHsKICBzdGF0aWMgY29uc3QgaW50IF9JTklUSUFMX0NBUEFDSVRZID0gODsKCiAgTGlzdDxfSGFzaFNldEVudHJ5PEU+PiBfYnVja2V0cyA9CiAgICAgIG5ldyBMaXN0PF9IYXNoU2V0RW50cnk8RT4+KF9JTklUSUFMX0NBUEFDSVRZKTsKICBpbnQgX2VsZW1lbnRDb3VudCA9IDA7CiAgaW50IF9tb2RpZmljYXRpb25Db3VudCA9IDA7CgogIGJvb2wgX2VxdWFscyhlMSwgZTIpID0+IGUxID09IGUyOwogIGludCBfaGFzaENvZGUoZSkgPT4gZS5oYXNoQ29kZTsKCiAgc3RhdGljIFNldDxSPiBfbmV3RW1wdHk8Uj4oKSA9PiBuZXcgX0hhc2hTZXQ8Uj4oKTsKCiAgLy8gSXRlcmFibGUuCgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBuZXcgX0hhc2hTZXRJdGVyYXRvcjxFPih0aGlzKTsKCiAgaW50IGdldCBsZW5ndGggPT4gX2VsZW1lbnRDb3VudDsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfZWxlbWVudENvdW50ID09IDA7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX2VsZW1lbnRDb3VudCAhPSAwOwoKICBib29sIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpIHsKICAgIGludCBpbmRleCA9IF9oYXNoQ29kZShvYmplY3QpICYgKF9idWNrZXRzLmxlbmd0aCAtIDEpOwogICAgX0hhc2hTZXRFbnRyeTxFPiBlbnRyeSA9IF9idWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChfZXF1YWxzKGVudHJ5LmtleSwgb2JqZWN0KSkgcmV0dXJuIHRydWU7CiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEUgbG9va3VwKE9iamVjdCBvYmplY3QpIHsKICAgIGludCBpbmRleCA9IF9oYXNoQ29kZShvYmplY3QpICYgKF9idWNrZXRzLmxlbmd0aCAtIDEpOwogICAgX0hhc2hTZXRFbnRyeTxFPiBlbnRyeSA9IF9idWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIHZhciBrZXkgPSBlbnRyeS5rZXk7CiAgICAgIGlmIChfZXF1YWxzKGtleSwgb2JqZWN0KSkgcmV0dXJuIGtleTsKICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBFIGdldCBmaXJzdCB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9idWNrZXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbnRyeSA9IF9idWNrZXRzW2ldOwogICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewogICAgICAgIHJldHVybiBlbnRyeS5rZXk7CiAgICAgIH0KICAgIH0KICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBnZXQgbGFzdCB7CiAgICBmb3IgKGludCBpID0gX2J1Y2tldHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgdmFyIGVudHJ5ID0gX2J1Y2tldHNbaV07CiAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgd2hpbGUgKGVudHJ5Lm5leHQgIT0gbnVsbCkgewogICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gZW50cnkua2V5OwogICAgICB9CiAgICB9CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIC8vIFNldC4KCiAgYm9vbCBhZGQoRSBlbGVtZW50KSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IF9oYXNoQ29kZShlbGVtZW50KTsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAoX2J1Y2tldHMubGVuZ3RoIC0gMSk7CiAgICBfSGFzaFNldEVudHJ5PEU+IGVudHJ5ID0gX2J1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKF9lcXVhbHMoZW50cnkua2V5LCBlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICBfYWRkRW50cnkoZWxlbWVudCwgaGFzaENvZGUsIGluZGV4KTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gb2JqZWN0cykgewogICAgZm9yIChFIG9iamVjdCBpbiBvYmplY3RzKSB7CiAgICAgIGFkZChvYmplY3QpOwogICAgfQogIH0KCiAgYm9vbCBfcmVtb3ZlKE9iamVjdCBvYmplY3QsIGludCBoYXNoQ29kZSkgewogICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChfYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIF9IYXNoU2V0RW50cnk8RT4gZW50cnkgPSBfYnVja2V0c1tpbmRleF07CiAgICBfSGFzaFNldEVudHJ5PEU+IHByZXZpb3VzID0gbnVsbDsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChfZXF1YWxzKGVudHJ5LmtleSwgb2JqZWN0KSkgewogICAgICAgIF9IYXNoU2V0RW50cnk8RT4gbmV4dCA9IGVudHJ5LnJlbW92ZSgpOwogICAgICAgIGlmIChwcmV2aW91cyA9PSBudWxsKSB7CiAgICAgICAgICBfYnVja2V0c1tpbmRleF0gPSBuZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDsKICAgICAgICB9CiAgICAgICAgX2VsZW1lbnRDb3VudC0tOwogICAgICAgIF9tb2RpZmljYXRpb25Db3VudCA9CiAgICAgICAgICAgIChfbW9kaWZpY2F0aW9uQ291bnQgKyAxKSAmIF9NT0RJRklDQVRJT05fQ09VTlRfTUFTSzsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBwcmV2aW91cyA9IGVudHJ5OwogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIHJlbW92ZShPYmplY3Qgb2JqZWN0KSA9PiBfcmVtb3ZlKG9iamVjdCwgX2hhc2hDb2RlKG9iamVjdCkpOwoKICB2b2lkIHJlbW92ZUFsbChJdGVyYWJsZTxPYmplY3Q+IG9iamVjdHNUb1JlbW92ZSkgewogICAgZm9yIChPYmplY3Qgb2JqZWN0IGluIG9iamVjdHNUb1JlbW92ZSkgewogICAgICBfcmVtb3ZlKG9iamVjdCwgX2hhc2hDb2RlKG9iamVjdCkpOwogICAgfQogIH0KCiAgdm9pZCBfZmlsdGVyV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIGJvb2wgcmVtb3ZlTWF0Y2hpbmcpIHsKICAgIGludCBsZW5ndGggPSBfYnVja2V0cy5sZW5ndGg7CiAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgIF9IYXNoU2V0RW50cnk8RT4gZW50cnkgPSBfYnVja2V0c1tpbmRleF07CiAgICAgIF9IYXNoU2V0RW50cnk8RT4gcHJldmlvdXMgPSBudWxsOwogICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICAgIGludCBtb2RpZmljYXRpb25Db3VudCA9IF9tb2RpZmljYXRpb25Db3VudDsKICAgICAgICBib29sIHRlc3RSZXN1bHQgPSB0ZXN0KGVudHJ5LmtleSk7CiAgICAgICAgaWYgKG1vZGlmaWNhdGlvbkNvdW50ICE9IF9tb2RpZmljYXRpb25Db3VudCkgewogICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRlc3RSZXN1bHQgPT0gcmVtb3ZlTWF0Y2hpbmcpIHsKICAgICAgICAgIF9IYXNoU2V0RW50cnk8RT4gbmV4dCA9IGVudHJ5LnJlbW92ZSgpOwogICAgICAgICAgaWYgKHByZXZpb3VzID09IG51bGwpIHsKICAgICAgICAgICAgX2J1Y2tldHNbaW5kZXhdID0gbmV4dDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0OwogICAgICAgICAgfQogICAgICAgICAgX2VsZW1lbnRDb3VudC0tOwogICAgICAgICAgX21vZGlmaWNhdGlvbkNvdW50ID0KICAgICAgICAgICAgICAoX21vZGlmaWNhdGlvbkNvdW50ICsgMSkgJiBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0s7CiAgICAgICAgICBlbnRyeSA9IG5leHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByZXZpb3VzID0gZW50cnk7CiAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBfZmlsdGVyV2hlcmUodGVzdCwgdHJ1ZSk7CiAgfQoKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBfZmlsdGVyV2hlcmUodGVzdCwgZmFsc2UpOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIF9idWNrZXRzID0gbmV3IExpc3QoX0lOSVRJQUxfQ0FQQUNJVFkpOwogICAgaWYgKF9lbGVtZW50Q291bnQgPiAwKSB7CiAgICAgIF9lbGVtZW50Q291bnQgPSAwOwogICAgICBfbW9kaWZpY2F0aW9uQ291bnQgPSAoX21vZGlmaWNhdGlvbkNvdW50ICsgMSkgJiBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0s7CiAgICB9CiAgfQoKICB2b2lkIF9hZGRFbnRyeShFIGtleSwgaW50IGhhc2hDb2RlLCBpbnQgaW5kZXgpIHsKICAgIF9idWNrZXRzW2luZGV4XSA9IG5ldyBfSGFzaFNldEVudHJ5PEU+KGtleSwgaGFzaENvZGUsIF9idWNrZXRzW2luZGV4XSk7CiAgICBpbnQgbmV3RWxlbWVudHMgPSBfZWxlbWVudENvdW50ICsgMTsKICAgIF9lbGVtZW50Q291bnQgPSBuZXdFbGVtZW50czsKICAgIGludCBsZW5ndGggPSBfYnVja2V0cy5sZW5ndGg7CiAgICAvLyBJZiB3ZSBlbmQgdXAgd2l0aCBtb3JlIHRoYW4gNzUlIG5vbi1lbXB0eSBlbnRyaWVzLCB3ZQogICAgLy8gcmVzaXplIHRoZSBiYWNraW5nIHN0b3JlLgogICAgaWYgKChuZXdFbGVtZW50cyA8PCAyKSA+ICgobGVuZ3RoIDw8IDEpICsgbGVuZ3RoKSkgX3Jlc2l6ZSgpOwogICAgX21vZGlmaWNhdGlvbkNvdW50ID0gKF9tb2RpZmljYXRpb25Db3VudCArIDEpICYgX01PRElGSUNBVElPTl9DT1VOVF9NQVNLOwogIH0KCiAgdm9pZCBfcmVzaXplKCkgewogICAgaW50IG9sZExlbmd0aCA9IF9idWNrZXRzLmxlbmd0aDsKICAgIGludCBuZXdMZW5ndGggPSBvbGRMZW5ndGggPDwgMTsKICAgIExpc3Qgb2xkQnVja2V0cyA9IF9idWNrZXRzOwogICAgTGlzdCBuZXdCdWNrZXRzID0gbmV3IExpc3Q8X0hhc2hTZXRFbnRyeTxFPj4obmV3TGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2xkTGVuZ3RoOyBpKyspIHsKICAgICAgX0hhc2hTZXRFbnRyeTxFPiBlbnRyeSA9IG9sZEJ1Y2tldHNbaV07CiAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgX0hhc2hTZXRFbnRyeTxFPiBuZXh0ID0gZW50cnkubmV4dDsKICAgICAgICBpbnQgbmV3SW5kZXggPSBlbnRyeS5oYXNoQ29kZSAmIChuZXdMZW5ndGggLSAxKTsKICAgICAgICBlbnRyeS5uZXh0ID0gbmV3QnVja2V0c1tuZXdJbmRleF07CiAgICAgICAgbmV3QnVja2V0c1tuZXdJbmRleF0gPSBlbnRyeTsKICAgICAgICBlbnRyeSA9IG5leHQ7CiAgICAgIH0KICAgIH0KICAgIF9idWNrZXRzID0gbmV3QnVja2V0czsKICB9CgogIEhhc2hTZXQ8RT4gX25ld1NldCgpID0+IG5ldyBfSGFzaFNldDxFPigpOwogIEhhc2hTZXQ8Uj4gX25ld1NpbWlsYXJTZXQ8Uj4oKSA9PiBuZXcgX0hhc2hTZXQ8Uj4oKTsKfQoKY2xhc3MgX0lkZW50aXR5SGFzaFNldDxFPiBleHRlbmRzIF9IYXNoU2V0PEU+IHsKICBpbnQgX2hhc2hDb2RlKGUpID0+IGlkZW50aXR5SGFzaENvZGUoZSk7CiAgYm9vbCBfZXF1YWxzKGUxLCBlMikgPT4gaWRlbnRpY2FsKGUxLCBlMik7CgogIEhhc2hTZXQ8RT4gX25ld1NldCgpID0+IG5ldyBfSWRlbnRpdHlIYXNoU2V0PEU+KCk7CiAgSGFzaFNldDxSPiBfbmV3U2ltaWxhclNldDxSPigpID0+IG5ldyBfSWRlbnRpdHlIYXNoU2V0PFI+KCk7Cn0KCmNsYXNzIF9DdXN0b21IYXNoU2V0PEU+IGV4dGVuZHMgX0hhc2hTZXQ8RT4gewogIGZpbmFsIF9FcXVhbGl0eTxFPiBfZXF1YWxpdHk7CiAgZmluYWwgX0hhc2hlcjxFPiBfaGFzaGVyOwogIGZpbmFsIF9QcmVkaWNhdGUgX3ZhbGlkS2V5OwogIF9DdXN0b21IYXNoU2V0KHRoaXMuX2VxdWFsaXR5LCB0aGlzLl9oYXNoZXIsIGJvb2wgdmFsaWRLZXkoT2JqZWN0IG8pKQogICAgICA6IF92YWxpZEtleSA9ICh2YWxpZEtleSAhPSBudWxsKSA/IHZhbGlkS2V5IDogbmV3IF9UeXBlVGVzdDxFPigpLnRlc3Q7CgogIGJvb2wgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSB7CiAgICBpZiAoIV92YWxpZEtleShlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHN1cGVyLnJlbW92ZShlbGVtZW50KTsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGlmICghX3ZhbGlkS2V5KGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gc3VwZXIuY29udGFpbnMoZWxlbWVudCk7CiAgfQoKICBFIGxvb2t1cChPYmplY3QgZWxlbWVudCkgewogICAgaWYgKCFfdmFsaWRLZXkoZWxlbWVudCkpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHN1cGVyLmxvb2t1cChlbGVtZW50KTsKICB9CgogIGJvb2wgY29udGFpbnNBbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgZm9yIChPYmplY3QgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICBpZiAoIV92YWxpZEtleShlbGVtZW50KSB8fCAhdGhpcy5jb250YWlucyhlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICB2b2lkIHJlbW92ZUFsbChJdGVyYWJsZTxPYmplY3Q+IGVsZW1lbnRzKSB7CiAgICBmb3IgKE9iamVjdCBlbGVtZW50IGluIGVsZW1lbnRzKSB7CiAgICAgIGlmIChfdmFsaWRLZXkoZWxlbWVudCkpIHsKICAgICAgICBzdXBlci5fcmVtb3ZlKGVsZW1lbnQsIF9oYXNoZXIoZWxlbWVudCkpOwogICAgICB9CiAgICB9CiAgfQoKICBib29sIF9lcXVhbHMoZTEsIGUyKSA9PiBfZXF1YWxpdHkoZTEsIGUyKTsKICBpbnQgX2hhc2hDb2RlKGUpID0+IF9oYXNoZXIoZSk7CgogIEhhc2hTZXQ8RT4gX25ld1NldCgpID0+IG5ldyBfQ3VzdG9tSGFzaFNldDxFPihfZXF1YWxpdHksIF9oYXNoZXIsIF92YWxpZEtleSk7CiAgSGFzaFNldDxSPiBfbmV3U2ltaWxhclNldDxSPigpID0+IG5ldyBfSGFzaFNldDxSPigpOwp9CgpjbGFzcyBfSGFzaFNldEVudHJ5PEU+IHsKICBmaW5hbCBFIGtleTsKICBmaW5hbCBpbnQgaGFzaENvZGU7CiAgX0hhc2hTZXRFbnRyeTxFPiBuZXh0OwogIF9IYXNoU2V0RW50cnkodGhpcy5rZXksIHRoaXMuaGFzaENvZGUsIHRoaXMubmV4dCk7CgogIF9IYXNoU2V0RW50cnk8RT4gcmVtb3ZlKCkgewogICAgZmluYWwgcmVzdWx0ID0gbmV4dDsKICAgIG5leHQgPSBudWxsOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCmNsYXNzIF9IYXNoU2V0SXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgZmluYWwgX0hhc2hTZXQ8RT4gX3NldDsKICBmaW5hbCBpbnQgX21vZGlmaWNhdGlvbkNvdW50OwogIGludCBfaW5kZXggPSAwOwogIF9IYXNoU2V0RW50cnk8RT4gX25leHQ7CiAgRSBfY3VycmVudDsKCiAgX0hhc2hTZXRJdGVyYXRvcih0aGlzLl9zZXQpIDogX21vZGlmaWNhdGlvbkNvdW50ID0gX3NldC5fbW9kaWZpY2F0aW9uQ291bnQ7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX21vZGlmaWNhdGlvbkNvdW50ICE9IF9zZXQuX21vZGlmaWNhdGlvbkNvdW50KSB7CiAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IoX3NldCk7CiAgICB9CiAgICBpZiAoX25leHQgIT0gbnVsbCkgewogICAgICBfY3VycmVudCA9IF9uZXh0LmtleTsKICAgICAgX25leHQgPSBfbmV4dC5uZXh0OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIExpc3Q8X0hhc2hTZXRFbnRyeTxFPj4gYnVja2V0cyA9IF9zZXQuX2J1Y2tldHM7CiAgICB3aGlsZSAoX2luZGV4IDwgYnVja2V0cy5sZW5ndGgpIHsKICAgICAgX25leHQgPSBidWNrZXRzW19pbmRleF07CiAgICAgIF9pbmRleCA9IF9pbmRleCArIDE7CiAgICAgIGlmIChfbmV4dCAhPSBudWxsKSB7CiAgICAgICAgX2N1cnJlbnQgPSBfbmV4dC5rZXk7CiAgICAgICAgX25leHQgPSBfbmV4dC5uZXh0OwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICBfY3VycmVudCA9IG51bGw7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBFIGdldCBjdXJyZW50ID0+IF9jdXJyZW50Owp9CgovKioKICogQSBoYXNoLWJhc2VkIG1hcCB0aGF0IGl0ZXJhdGVzIGtleXMgYW5kIHZhbHVlcyBpbiBrZXkgaW5zZXJ0aW9uIG9yZGVyLgogKiBUaGlzIGlzIG5ldmVyIGFjdHVhbGx5IGluc3RhbnRpYXRlZCBhbnkgbW9yZSAtIHRoZSBjb25zdHJ1Y3RvciBhbHdheXMKICogcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBfQ29tcGFjdExpbmtlZEhhc2hNYXAgb3IgX0ludGVybmFsTGlua2VkSGFzaE1hcCwKICogd2hpY2ggZGVzcGl0ZSB0aGUgbmFtZXMgZG8gbm90IHVzZSBsaW5rcyAoYnV0IGFyZSBpbnNlcnRpb24tb3JkZXJlZCBhcyBpZgogKiB0aGV5IGRpZCkuCiAqLwpAcGF0Y2gKY2xhc3MgTGlua2VkSGFzaE1hcDxLLCBWPiB7CiAgQHBhdGNoCiAgZmFjdG9yeSBMaW5rZWRIYXNoTWFwKAogICAgICB7Ym9vbCBlcXVhbHMoSyBrZXkxLCBLIGtleTIpLAogICAgICBpbnQgaGFzaENvZGUoSyBrZXkpLAogICAgICBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KX0pIHsKICAgIGlmIChpc1ZhbGlkS2V5ID09IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IG51bGwpIHsKICAgICAgICBpZiAoZXF1YWxzID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBuZXcgX0ludGVybmFsTGlua2VkSGFzaE1hcDxLLCBWPigpOwogICAgICAgIH0KICAgICAgICBoYXNoQ29kZSA9IF9kZWZhdWx0SGFzaENvZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlkZW50aWNhbChpZGVudGl0eUhhc2hDb2RlLCBoYXNoQ29kZSkgJiYKICAgICAgICAgICAgaWRlbnRpY2FsKGlkZW50aWNhbCwgZXF1YWxzKSkgewogICAgICAgICAgcmV0dXJuIG5ldyBfQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaE1hcDxLLCBWPigpOwogICAgICAgIH0KICAgICAgICBlcXVhbHMgPz89IF9kZWZhdWx0RXF1YWxzOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBoYXNoQ29kZSA/Pz0gX2RlZmF1bHRIYXNoQ29kZTsKICAgICAgZXF1YWxzID8/PSBfZGVmYXVsdEVxdWFsczsKICAgIH0KICAgIHJldHVybiBuZXcgX0NvbXBhY3RMaW5rZWRDdXN0b21IYXNoTWFwPEssIFY+KGVxdWFscywgaGFzaENvZGUsIGlzVmFsaWRLZXkpOwogIH0KCiAgQHBhdGNoCiAgZmFjdG9yeSBMaW5rZWRIYXNoTWFwLmlkZW50aXR5KCkgPT4gbmV3IF9Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoTWFwPEssIFY+KCk7Cn0KCkBwYXRjaApjbGFzcyBMaW5rZWRIYXNoU2V0PEU+IHsKICBAcGF0Y2gKICBmYWN0b3J5IExpbmtlZEhhc2hTZXQoCiAgICAgIHtib29sIGVxdWFscyhFIGUxLCBFIGUyKSwKICAgICAgaW50IGhhc2hDb2RlKEUgZSksCiAgICAgIGJvb2wgaXNWYWxpZEtleShwb3RlbnRpYWxLZXkpfSkgewogICAgaWYgKGlzVmFsaWRLZXkgPT0gbnVsbCkgewogICAgICBpZiAoaGFzaENvZGUgPT0gbnVsbCkgewogICAgICAgIGlmIChlcXVhbHMgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIG5ldyBfQ29tcGFjdExpbmtlZEhhc2hTZXQ8RT4oKTsKICAgICAgICB9CiAgICAgICAgaGFzaENvZGUgPSBfZGVmYXVsdEhhc2hDb2RlOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChpZGVudGljYWwoaWRlbnRpdHlIYXNoQ29kZSwgaGFzaENvZGUpICYmCiAgICAgICAgICAgIGlkZW50aWNhbChpZGVudGljYWwsIGVxdWFscykpIHsKICAgICAgICAgIHJldHVybiBuZXcgX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hTZXQ8RT4oKTsKICAgICAgICB9CiAgICAgICAgZXF1YWxzID8/PSBfZGVmYXVsdEVxdWFsczsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaGFzaENvZGUgPz89IF9kZWZhdWx0SGFzaENvZGU7CiAgICAgIGVxdWFscyA/Pz0gX2RlZmF1bHRFcXVhbHM7CiAgICB9CiAgICByZXR1cm4gbmV3IF9Db21wYWN0TGlua2VkQ3VzdG9tSGFzaFNldDxFPihlcXVhbHMsIGhhc2hDb2RlLCBpc1ZhbGlkS2V5KTsKICB9CgogIEBwYXRjaAogIGZhY3RvcnkgTGlua2VkSGFzaFNldC5pZGVudGl0eSgpID0+IG5ldyBfQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaFNldDxFPigpOwp9CgpAcGF0Y2gKYWJzdHJhY3QgY2xhc3MgX1NwbGF5VHJlZTxLLCBOb2RlIGV4dGVuZHMgX1NwbGF5VHJlZU5vZGU8Sz4+IHsKICAvLyBXZSBvdmVycmlkZSBfc3BsYXlNaW4gYW5kIF9zcGxheU1heCB0byBvcHRpbWl6ZSB0eXBlLWNoZWNrcy4KICBAcGF0Y2gKICBOb2RlIF9zcGxheU1pbihOb2RlIG5vZGUpIHsKICAgIE5vZGUgY3VycmVudCA9IG5vZGU7CiAgICB3aGlsZSAoY3VycmVudC5sZWZ0ICE9IG51bGwpIHsKICAgICAgTm9kZSBsZWZ0ID0gaW50ZXJuYWwudW5zYWZlQ2FzdDxOb2RlPihjdXJyZW50LmxlZnQpOwogICAgICBjdXJyZW50LmxlZnQgPSBsZWZ0LnJpZ2h0OwogICAgICBsZWZ0LnJpZ2h0ID0gY3VycmVudDsKICAgICAgY3VycmVudCA9IGxlZnQ7CiAgICB9CiAgICByZXR1cm4gY3VycmVudDsKICB9Cgog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cG9pbnQiLCAiY2FsbCIpCnZvaWQgX3JlaGFzaE9iamVjdHMoTGlzdCBvYmplY3RzKSB7CiAgZmluYWwgaW50IGxlbmd0aCA9IG9iamVjdHMubGVuZ3RoOwogIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgIG9iamVjdHNbaV0uX3JlZ2VuZXJhdGVJbmRleCgpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX0hhc2hGaWVsZEJhc2UgewogIC8vIEVhY2ggb2NjdXBpZWQgZW50cnkgaW4gX2luZGV4IGlzIGEgZml4ZWQtc2l6ZSBpbnRlZ2VyIHRoYXQgZW5jb2RlcyBhIHBhaXI6CiAgLy8gICBbIGhhc2ggcGF0dGVybiBmb3Iga2V5IHwgaW5kZXggb2YgZW50cnkgaW4gX2RhdGEgXQogIC8vIFRoZSBoYXNoIHBhdHRlcm4gaXMgYmFzZWQgb24gaGFzaENvZGUsIGJ1dCBpcyBndWFyYW50ZWVkIHRvIGJlIG5vbi16ZXJvLgogIC8vIFRoZSBsZW5ndGggb2YgX2luZGV4IGlzIGFsd2F5cyBhIHBvd2VyIG9mIHR3bywgYW5kIHRoZXJlIGlzIGFsd2F5cyBhdAogIC8vIGxlYXN0IG9uZSB1bm9jY3VwaWVkIGVudHJ5LgogIC8vIE5PVEU6IFdoZW4gbWFwcyBhcmUgZGVzZXJpYWxpemVkLCB0aGVpciBfaW5kZXggYW5kIF9oYXNoTWFzayBpcyByZWdlbmVyYXRlZAogIC8vIGVhZ2VybHkgYnkgX3JlZ2VuZXJhdGVJbmRleC4KICBVaW50MzJMaXN0IF9pbmRleCA9IG5ldyBVaW50MzJMaXN0KF9IYXNoQmFzZS5fSU5JVElBTF9JTkRFWF9TSVpFKTsKCiAgLy8gQ2FjaGVkIGluLXBsYWNlIG1hc2sgZm9yIHRoZSBoYXNoIHBhdHRlcm4gY29tcG9uZW50LgogIGludCBfaGFzaE1hc2sgPSBfSGFzaEJhc2UuX2luZGV4U2l6ZVRvSGFzaE1hc2soX0hhc2hCYXNlLl9JTklUSUFMX0lOREVYX1NJWkUpOwoKICAvLyBGaXhlZC1sZW5ndGggbGlzdCBvZiBrZXlzIChzZXQpIG9yIGtleS92YWx1ZSBhdCBldmVuL29kZCBpbmRpY2VzIChtYXApLgogIExpc3QgX2RhdGE7CgogIC8vIExlbmd0aCBvZiBfZGF0YSB0aGF0IGlzIHVzZWQgKGkuZS4sIGtleXMgKyB2YWx1ZXMgZm9yIGEgbWFwKS4KICBpbnQgX3VzZWREYXRhID0gMDsKCiAgLy8gTnVtYmVyIG9mIGRlbGV0ZWQga2V5cy4KICBpbnQgX2RlbGV0ZWRLZXlzID0gMDsKCiAgLy8gTm90ZTogQWxsIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgaW4gYSBzaW5nbGUgY29uc3RydWN0b3Igc28gdGhhdCB0aGUgVk0KICAvLyByZWNvZ25pemVzIHRoZXkgY2Fubm90IGhvbGQgbnVsbCB2YWx1ZXMuIFRoaXMgbWFrZXMgYSBiaWcgKDIwJSkgcGVyZm9ybWFuY2UKICAvLyBkaWZmZXJlbmNlIG9uIHNvbWUgb3BlcmF0aW9ucy4KICBfSGFzaEZpZWxkQmFzZShpbnQgZGF0YVNpemUpIDogdGhpcy5fZGF0YSA9IG5ldyBMaXN0KGRhdGFTaXplKTsKfQoKLy8gQmFzZSBjbGFzcyBmb3IgVk0taW50ZXJuYWwgY2xhc3Nlczsga2VlcCBpbiBzeW5jIHdpdGggX0hhc2hGaWVsZEJhc2UuCmFic3RyYWN0IGNsYXNzIF9IYXNoVk1CYXNlIHsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OnR5cGVkX2RhdGEjX1VpbnQzMkxpc3QiKQogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIFVpbnQzMkxpc3QgZ2V0IF9pbmRleCBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfZ2V0SW5kZXgiOwogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIHZvaWQgc2V0IF9pbmRleChVaW50MzJMaXN0IHZhbHVlKSBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfc2V0SW5kZXgiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgaW50IGdldCBfaGFzaE1hc2sgbmF0aXZlICJMaW5rZWRIYXNoTWFwX2dldEhhc2hNYXNrIjsKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICB2b2lkIHNldCBfaGFzaE1hc2soaW50IHZhbHVlKSBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfc2V0SGFzaE1hc2siOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0xpc3QiKQogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIExpc3QgZ2V0IF9kYXRhIG5hdGl2ZSAiTGlua2VkSGFzaE1hcF9nZXREYXRhIjsKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICB2b2lkIHNldCBfZGF0YShMaXN0IHZhbHVlKSBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfc2V0RGF0YSI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBpbnQgZ2V0IF91c2VkRGF0YSBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfZ2V0VXNlZERhdGEiOwogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIHZvaWQgc2V0IF91c2VkRGF0YShpbnQgdmFsdWUpIG5hdGl2ZSAiTGlua2VkSGFzaE1hcF9zZXRVc2VkRGF0YSI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBpbnQgZ2V0IF9kZWxldGVkS2V5cyBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfZ2V0RGVsZXRlZEtleXMiOwogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIHZvaWQgc2V0IF9kZWxldGVkS2V5cyhpbnQgdmFsdWUpIG5hdGl2ZSAiTGlua2VkSGFzaE1hcF9zZXREZWxldGVkS2V5cyI7Cn0KCi8vIFRoaXMgbWl4aW4gY2FuIGJlIGFwcGxpZWQgdG8gX0hhc2hGaWVsZEJhc2Ugb3IgX0hhc2hWTUJhc2UgKGZvcgovLyBub3JtYWwgYW5kIFZNLWludGVybmFsaXplZCBjbGFzc2VzLCByZXNwZWN0aXZlbGV5KSwgd2hpY2ggcHJvdmlkZSB0aGUKLy8gYWN0dWFsIGZpZWxkcy9hY2Nlc3NvcnMgdGhhdCB0aGlzIG1peGluIGFzc3VtZXMuCi8vIFRPRE8oa29kYSk6IENvbnNpZGVyIG1vdmluZyBmaWVsZCBjb21tZW50cyB0byBfSGFzaEZpZWxkQmFzZS4KYWJzdHJhY3QgY2xhc3MgX0hhc2hCYXNlIGltcGxlbWVudHMgX0hhc2hWTUJhc2UgewogIC8vIFRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGZvciBlYWNoIGNvbXBvbmVudCBpcyBkZXRlcm1pbmVkIGJ5IHRhYmxlIHNpemUuCiAgLy8gVGhlIGxlbmd0aCBvZiBfaW5kZXggaXMgdHdpY2UgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIF9kYXRhLCBhbmQgYm90aAogIC8vIGFyZSBkb3VibGVkIHdoZW4gX2RhdGEgaXMgZnVsbC4gVGh1cywgX2luZGV4IHdpbGwgaGF2ZSBhIG1heCBsb2FkIGZhY3RvcgogIC8vIG9mIDEvMiwgd2hpY2ggZW5hYmxlcyBvbmUgbW9yZSBiaXQgdG8gYmUgdXNlZCBmb3IgdGhlIGhhc2guCiAgLy8gVE9ETyhrb2RhKTogQ29uc2lkZXIgZ3Jvd2luZyBfZGF0YSBieSBmYWN0b3Igc3FydCgyKSwgdHdpY2UgYXMgb2Z0ZW4uCiAgc3RhdGljIGNvbnN0IGludCBfSU5JVElBTF9JTkRFWF9CSVRTID0gMzsKICBzdGF0aWMgY29uc3QgaW50IF9JTklUSUFMX0lOREVYX1NJWkUgPSAxIDw8IChfSU5JVElBTF9JTkRFWF9CSVRTICsgMSk7CgogIC8vIFVudXNlZCBhbmQgZGVsZXRlZCBlbnRyaWVzIGFyZSBtYXJrZWQgYnkgMCBhbmQgMSwgcmVzcGVjdGl2ZWx5LgogIHN0YXRpYyBjb25zdCBpbnQgX1VOVVNFRF9QQUlSID0gMDsKICBzdGF0aWMgY29uc3QgaW50IF9ERUxFVEVEX1BBSVIgPSAxOwoKICAvLyBPbiAzMi1iaXQsIHRoZSB0b3AgYml0cyBhcmUgd2FzdGVkIHRvIGF2b2lkIE1pbnQgYWxsb2NhdGlvbi4KICAvLyBUT0RPKGtvZGEpOiBSZWNsYWltIHRoZSBiaXRzIGJ5IG1ha2luZyB0aGUgY29tcGlsZXIgdHJlYXQgaGFzaCBwYXR0ZXJucwogIC8vIGFzIHVuc2lnbmVkIHdvcmRzLgogIHN0YXRpYyBpbnQgX2luZGV4U2l6ZVRvSGFzaE1hc2soaW50IGluZGV4U2l6ZSkgewogICAgaW50IGluZGV4Qml0cyA9IGluZGV4U2l6ZS5iaXRMZW5ndGggLSAyOwogICAgcmV0dXJuIGludGVybmFsLmlzNjRCaXQKICAgICAgICA/ICgxIDw8ICgzMiAtIGluZGV4Qml0cykpIC0gMQogICAgICAgIDogKDEgPDwgKDMwIC0gaW5kZXhCaXRzKSkgLSAxOwogIH0KCiAgc3RhdGljIGludCBfaGFzaFBhdHRlcm4oaW50IGZ1bGxIYXNoLCBpbnQgaGFzaE1hc2ssIGludCBzaXplKSB7CiAgICBmaW5hbCBpbnQgbWFza2VkSGFzaCA9IGZ1bGxIYXNoICYgaGFzaE1hc2s7CiAgICAvLyBUT0RPKGtvZGEpOiBDb25zaWRlciBrZWVwaW5nIGJpdCBsZW5ndGggYW5kIHVzZSBsZWZ0IHNoaWZ0LgogICAgcmV0dXJuIChtYXNrZWRIYXNoID09IDApID8gKHNpemUgPj4gMSkgOiBtYXNrZWRIYXNoICogKHNpemUgPj4gMSk7CiAgfQoKICAvLyBMaW5lYXIgcHJvYmluZy4KICBzdGF0aWMgaW50IF9maXJzdFByb2JlKGludCBmdWxsSGFzaCwgaW50IHNpemVNYXNrKSB7CiAgICBmaW5hbCBpbnQgaSA9IGZ1bGxIYXNoICYgc2l6ZU1hc2s7CiAgICAvLyBMaWdodCwgZmFzdCBzaHVmZmxlIHRvIG1pdGlnYXRlIGJhZCBoYXNoQ29kZSAoZS5nLiwgc2VxdWVudGlhbCkuCiAgICByZXR1cm4gKChpIDw8IDEpICsgaSkgJiBzaXplTWFzazsKICB9CgogIHN0YXRpYyBpbnQgX25leHRQcm9iZShpbnQgaSwgaW50IHNpemVNYXNrKSA9PiAoaSArIDEpICYgc2l6ZU1hc2s7CgogIC8vIEEgc2VsZi1sb29wIGlzIHVzZWQgdG8gbWFyayBhIGRlbGV0ZWQga2V5IG9yIHZhbHVlLgogIHN0YXRpYyBib29sIF9pc0RlbGV0ZWQoTGlzdCBkYXRhLCBPYmplY3Qga2V5T3JWYWx1ZSkgPT4KICAgICAgaWRlbnRpY2FsKGtleU9yVmFsdWUsIGRhdGEpOwogIHN0YXRpYyB2b2lkIF9zZXREZWxldGVkQXQoTGlzdCBkYXRhLCBpbnQgZCkgewogICAgZGF0YVtkXSA9IGRhdGE7CiAgfQoKICAvLyBDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkZXRlY3Rpb24gcmVsaWVzIG9uIHRoaXMgY2hlY2tzdW0gbW9ub3RvbmljYWxseQogIC8vIGluY3JlYXNpbmcgYmV0d2VlbiByZWFsbG9jYXRpb25zIG9mIF9kYXRhLgogIGludCBnZXQgX2NoZWNrU3VtID0+IF91c2VkRGF0YSArIF9kZWxldGVkS2V5czsKICBib29sIF9pc01vZGlmaWVkU2luY2UoTGlzdCBvbGREYXRhLCBpbnQgb2xkQ2hlY2tTdW0pID0+CiAgICAgICFpZGVudGljYWwoX2RhdGEsIG9sZERhdGEpIHx8IChfY2hlY2tTdW0gIT0gb2xkQ2hlY2tTdW0pOwoKICBpbnQgZ2V0IGxlbmd0aDsKfQoKY2xhc3MgX09wZXJhdG9yRXF1YWxzQW5kSGFzaENvZGUgewogIGludCBfaGFzaENvZGUoZSkgPT4gZS5oYXNoQ29kZTsKICBib29sIF9lcXVhbHMoZTEsIGUyKSA9PiBlMSA9PSBlMjsKfQoKY2xhc3MgX0lkZW50aWNhbEFuZElkZW50aXR5SGFzaENvZGUgewogIGludCBfaGFzaENvZGUoZSkgPT4gaWRlbnRpdHlIYXNoQ29kZShlKTsKICBib29sIF9lcXVhbHMoZTEsIGUyKSA9PiBpZGVudGljYWwoZTEsIGUyKTsKfQoKLy8gVk0taW50ZXJuYWxpemVkIGltcGxlbWVudGF0aW9uIG9mIGEgZGVmYXVsdC1jb25zdHJ1Y3RlZCBMaW5rZWRIYXNoTWFwLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9JbnRlcm5hbExpbmtlZEhhc2hNYXA8SywgVj4gZXh0ZW5kcyBfSGFzaFZNQmFzZQogICAgd2l0aAogICAgICAgIE1hcE1peGluPEssIFY+LAogICAgICAgIF9MaW5rZWRIYXNoTWFwTWl4aW48SywgVj4sCiAgICAgICAgX0hhc2hCYXNlLAogICAgICAgIF9PcGVyYXRvckVxdWFsc0FuZEhhc2hDb2RlCiAgICBpbXBsZW1lbnRzIExpbmtlZEhhc2hNYXA8SywgVj4gewogIF9JbnRlcm5hbExpbmtlZEhhc2hNYXAoKSB7CiAgICBfaW5kZXggPSBuZXcgVWludDMyTGlzdChfSGFzaEJhc2UuX0lOSVRJQUxfSU5ERVhfU0laRSk7CiAgICBfaGFzaE1hc2sgPSBfSGFzaEJhc2UuX2luZGV4U2l6ZVRvSGFzaE1hc2soX0hhc2hCYXNlLl9JTklUSUFMX0lOREVYX1NJWkUpOwogICAgX2RhdGEgPSBuZXcgTGlzdChfSGFzaEJhc2UuX0lOSVRJQUxfSU5ERVhfU0laRSk7CiAgICBfdXNlZERhdGEgPSAwOwogICAgX2RlbGV0ZWRLZXlzID0gMDsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9MaW5rZWRIYXNoTWFwTWl4aW48SywgVj4gaW1wbGVtZW50cyBfSGFzaEJhc2UgewogIGludCBfaGFzaENvZGUoZSk7CiAgYm9vbCBfZXF1YWxzKGUxLCBlMik7CiAgaW50IGdldCBfY2hlY2tTdW07CiAgYm9vbCBfaXNNb2RpZmllZFNpbmNlKExpc3Qgb2xkRGF0YSwgaW50IG9sZENoZWNrU3VtKTsKCiAgaW50IGdldCBsZW5ndGggPT4gKF91c2VkRGF0YSA+PiAxKSAtIF9kZWxldGVkS2V5czsKICBib29sIGdldCBpc0VtcHR5ID0+IGxlbmd0aCA9PSAwOwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CgogIHZvaWQgX3JlaGFzaCgpIHsKICAgIGlmICgoX2RlbGV0ZWRLZXlzIDw8IDIpID4gX3VzZWREYXRhKSB7CiAgICAgIC8vIFRPRE8oa29kYSk6IENvbnNpZGVyIHNocmlua2luZy4KICAgICAgLy8gVE9ETyhrb2RhKTogQ29uc2lkZXIgaW4tcGxhY2UgY29tcGFjdGlvbiBhbmQgbW9yZSBjb3N0bHkgQ01FIGNoZWNrLgogICAgICBfaW5pdChfaW5kZXgubGVuZ3RoLCBfaGFzaE1hc2ssIF9kYXRhLCBfdXNlZERhdGEpOwogICAgfSBlbHNlIHsKICAgICAgLy8gVE9ETyhrb2RhKTogU3VwcG9ydCAzMi0+NjQgYml0IHRyYW5zaXRpb24gKGFuZCBhZGp1c3QgX2hhc2hNYXNrKS4KICAgICAgX2luaXQoX2luZGV4Lmxlbmd0aCA8PCAxLCBfaGFzaE1hc2sgPj4gMSwgX2RhdGEsIF91c2VkRGF0YSk7CiAgICB9CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgaWYgKCFpc0VtcHR5KSB7CiAgICAgIF9pbml0KF9IYXNoQmFzZS5fSU5JVElBTF9JTkRFWF9TSVpFLCBfaGFzaE1hc2ssIG51bGwsIDApOwogICAgfQogIH0KCiAgLy8gQWxsb2NhdGUgbmV3IF9pbmRleCBhbmQgX2RhdGEsIGFuZCBvcHRpb25hbGx5IGNvcHkgZXhpc3RpbmcgY29udGVudHMuCiAgdm9pZCBfaW5pdChpbnQgc2l6ZSwgaW50IGhhc2hNYXNrLCBMaXN0IG9sZERhdGEsIGludCBvbGRVc2VkKSB7CiAgICBhc3NlcnQoc2l6ZSAmIChzaXplIC0gMSkgPT0gMCk7CiAgICBhc3NlcnQoX0hhc2hCYXNlLl9VTlVTRURfUEFJUiA9PSAwKTsKICAgIF9pbmRleCA9IG5ldyBVaW50MzJMaXN0KHNpemUpOwogICAgX2hhc2hNYXNrID0gaGFzaE1hc2s7CiAgICBfZGF0YSA9IG5ldyBMaXN0KHNpemUpOwogICAgX3VzZWREYXRhID0gMDsKICAgIF9kZWxldGVkS2V5cyA9IDA7CiAgICBpZiAob2xkRGF0YSAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2xkVXNlZDsgaSArPSAyKSB7CiAgICAgICAgdmFyIGtleSA9IG9sZERhdGFbaV07CiAgICAgICAgaWYgKCFfSGFzaEJhc2UuX2lzRGVsZXRlZChvbGREYXRhLCBrZXkpKSB7CiAgICAgICAgICAvLyBUT0RPKGtvZGEpOiBXaGlsZSB0aGVyZSBhcmUgZW5vdWdoIGhhc2ggYml0cywgYXZvaWQgaGFzaENvZGUgY2FsbHMuCiAgICAgICAgICB0aGlzW2tleV0gPSBvbGREYXRhW2kgKyAxXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBbX3JlaGFzaE9iamVjdHNdIChzZWUgYWJvdmUpLgogIHZvaWQgX3JlZ2VuZXJhdGVJbmRleCgpIHsKICAgIF9pbmRleCA9IG5ldyBVaW50MzJMaXN0KF9kYXRhLmxlbmd0aCk7CiAgICBhc3NlcnQoX2hhc2hNYXNrID09IDApOwogICAgX2hhc2hNYXNrID0gX0hhc2hCYXNlLl9pbmRleFNpemVUb0hhc2hNYXNrKF9pbmRleC5sZW5ndGgpOwogICAgZmluYWwgaW50IHRtcFVzZWQgPSBfdXNlZERhdGE7CiAgICBfdXNlZERhdGEgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0bXBVc2VkOyBpICs9IDIpIHsKICAgICAgdGhpc1tfZGF0YVtpXV0gPSBfZGF0YVtpICsgMV07CiAgICB9CiAgfQoKICB2b2lkIF9pbnNlcnQoSyBrZXksIFYgdmFsdWUsIGludCBoYXNoUGF0dGVybiwgaW50IGkpIHsKICAgIGlmIChfdXNlZERhdGEgPT0gX2RhdGEubGVuZ3RoKSB7CiAgICAgIF9yZWhhc2goKTsKICAgICAgdGhpc1trZXldID0gdmFsdWU7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoMSA8PSBoYXNoUGF0dGVybiAmJiBoYXNoUGF0dGVybiA8ICgxIDw8IDMyKSk7CiAgICAgIGZpbmFsIGludCBpbmRleCA9IF91c2VkRGF0YSA+PiAxOwogICAgICBhc3NlcnQoKGluZGV4ICYgaGFzaFBhdHRlcm4pID09IDApOwogICAgICBfaW5kZXhbaV0gPSBoYXNoUGF0dGVybiB8IGluZGV4OwogICAgICBfZGF0YVtfdXNlZERhdGErK10gPSBrZXk7CiAgICAgIF9kYXRhW191c2VkRGF0YSsrXSA9IHZhbHVlOwogICAgfQogIH0KCiAgLy8gSWYga2V5IGlzIHByZXNlbnQsIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSB2YWx1ZSBpbiBfZGF0YSwgZWxzZSByZXR1cm5zCiAgLy8gdGhlIG5lZ2F0ZWQgaW5zZXJ0aW9uIHBvaW50IGluIF9pbmRleC4KICBpbnQgX2ZpbmRWYWx1ZU9ySW5zZXJ0UG9pbnQoSyBrZXksIGludCBmdWxsSGFzaCwgaW50IGhhc2hQYXR0ZXJuLCBpbnQgc2l6ZSkgewogICAgZmluYWwgaW50IHNpemVNYXNrID0gc2l6ZSAtIDE7CiAgICBmaW5hbCBpbnQgbWF4RW50cmllcyA9IHNpemUgPj4gMTsKICAgIGludCBpID0gX0hhc2hCYXNlLl9maXJzdFByb2JlKGZ1bGxIYXNoLCBzaXplTWFzayk7CiAgICBpbnQgZmlyc3REZWxldGVkID0gLTE7CiAgICBpbnQgcGFpciA9IF9pbmRleFtpXTsKICAgIHdoaWxlIChwYWlyICE9IF9IYXNoQmFzZS5fVU5VU0VEX1BBSVIpIHsKICAgICAgaWYgKHBhaXIgPT0gX0hhc2hCYXNlLl9ERUxFVEVEX1BBSVIpIHsKICAgICAgICBpZiAoZmlyc3REZWxldGVkIDwgMCkgewogICAgICAgICAgZmlyc3REZWxldGVkID0gaTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmluYWwgaW50IGVudHJ5ID0gaGFzaFBhdHRlcm4gXiBwYWlyOwogICAgICAgIGlmIChlbnRyeSA8IG1heEVudHJpZXMpIHsKICAgICAgICAgIGZpbmFsIGludCBkID0gZW50cnkgPDwgMTsKICAgICAgICAgIGlmIChfZXF1YWxzKGtleSwgX2RhdGFbZF0pKSB7CiAgICAgICAgICAgIHJldHVybiBkICsgMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaSA9IF9IYXNoQmFzZS5fbmV4dFByb2JlKGksIHNpemVNYXNrKTsKICAgICAgcGFpciA9IF9pbmRleFtpXTsKICAgIH0KICAgIHJldHVybiBmaXJzdERlbGV0ZWQgPj0gMCA/IC1maXJzdERlbGV0ZWQgOiAtaTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBmaW5hbCBpbnQgc2l6ZSA9IF9pbmRleC5sZW5ndGg7CiAgICBmaW5hbCBpbnQgZnVsbEhhc2ggPSBfaGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGludCBoYXNoUGF0dGVybiA9IF9IYXNoQmFzZS5faGFzaFBhdHRlcm4oZnVsbEhhc2gsIF9oYXNoTWFzaywgc2l6ZSk7CiAgICBmaW5hbCBpbnQgZCA9IF9maW5kVmFsdWVPckluc2VydFBvaW50KGtleSwgZnVsbEhhc2gsIGhhc2hQYXR0ZXJuLCBzaXplKTsKICAgIGlmIChkID4gMCkgewogICAgICBfZGF0YVtkXSA9IHZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgZmluYWwgaW50IGkgPSAtZDsKICAgICAgX2luc2VydChrZXksIHZhbHVlLCBoYXNoUGF0dGVybiwgaSk7CiAgICB9CiAgfQoKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIGZpbmFsIGludCBzaXplID0gX2luZGV4Lmxlbmd0aDsKICAgIGZpbmFsIGludCBmdWxsSGFzaCA9IF9oYXNoQ29kZShrZXkpOwogICAgZmluYWwgaW50IGhhc2hQYXR0ZXJuID0gX0hhc2hCYXNlLl9oYXNoUGF0dGVybihmdWxsSGFzaCwgX2hhc2hNYXNrLCBzaXplKTsKICAgIGZpbmFsIGludCBkID0gX2ZpbmRWYWx1ZU9ySW5zZXJ0UG9pbnQoa2V5LCBmdWxsSGFzaCwgaGFzaFBhdHRlcm4sIHNpemUpOwogICAgaWYgKGQgPiAwKSB7CiAgICAgIHJldHVybiBfZGF0YVtkXTsKICAgIH0KICAgIC8vICdpZkFic2VudCcgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIG1hcC4KICAgIExpc3Qgb2xkRGF0YSA9IF9kYXRhOwogICAgaW50IG9sZENoZWNrU3VtID0gX2NoZWNrU3VtOwogICAgViB2YWx1ZSA9IGlmQWJzZW50KCk7CiAgICBpZiAoX2lzTW9kaWZpZWRTaW5jZShvbGREYXRhLCBvbGRDaGVja1N1bSkpIHsKICAgICAgdGhpc1trZXldID0gdmFsdWU7CiAgICB9IGVsc2UgewogICAgICBmaW5hbCBpbnQgaSA9IC1kOwogICAgICBfaW5zZXJ0KGtleSwgdmFsdWUsIGhhc2hQYXR0ZXJuLCBpKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIGZpbmFsIGludCBzaXplID0gX2luZGV4Lmxlbmd0aDsKICAgIGZpbmFsIGludCBzaXplTWFzayA9IHNpemUgLSAxOwogICAgZmluYWwgaW50IG1heEVudHJpZXMgPSBzaXplID4+IDE7CiAgICBmaW5hbCBpbnQgZnVsbEhhc2ggPSBfaGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGludCBoYXNoUGF0dGVybiA9IF9IYXNoQmFzZS5faGFzaFBhdHRlcm4oZnVsbEhhc2gsIF9oYXNoTWFzaywgc2l6ZSk7CiAgICBpbnQgaSA9IF9IYXNoQmFzZS5fZmlyc3RQcm9iZShmdWxsSGFzaCwgc2l6ZU1hc2spOwogICAgaW50IHBhaXIgPSBfaW5kZXhbaV07CiAgICB3aGlsZSAocGFpciAhPSBfSGFzaEJhc2UuX1VOVVNFRF9QQUlSKSB7CiAgICAgIGlmIChwYWlyICE9IF9IYXNoQmFzZS5fREVMRVRFRF9QQUlSKSB7CiAgICAgICAgZmluYWwgaW50IGVudHJ5ID0gaGFzaFBhdHRlcm4gXiBwYWlyOwogICAgICAgIGlmIChlbnRyeSA8IG1heEVudHJpZXMpIHsKICAgICAgICAgIGZpbmFsIGludCBkID0gZW50cnkgPDwgMTsKICAgICAgICAgIGlmIChfZXF1YWxzKGtleSwgX2RhdGFbZF0pKSB7CiAgICAgICAgICAgIF9pbmRleFtpXSA9IF9IYXNoQmFzZS5fREVMRVRFRF9QQUlSOwogICAgICAgICAgICBfSGFzaEJhc2UuX3NldERlbGV0ZWRBdChfZGF0YSwgZCk7CiAgICAgICAgICAgIFYgdmFsdWUgPSBfZGF0YVtkICsgMV07CiAgICAgICAgICAgIF9IYXNoQmFzZS5fc2V0RGVsZXRlZEF0KF9kYXRhLCBkICsgMSk7CiAgICAgICAgICAgICsrX2RlbGV0ZWRLZXlzOwogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGkgPSBfSGFzaEJhc2UuX25leHRQcm9iZShpLCBzaXplTWFzayk7CiAgICAgIHBhaXIgPSBfaW5kZXhbaV07CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vIElmIGtleSBpcyBhYnNlbnQsIHJldHVybiBfZGF0YSAod2hpY2ggaXMgbmV2ZXIgYSB2YWx1ZSkuCiAgT2JqZWN0IF9nZXRWYWx1ZU9yRGF0YShPYmplY3Qga2V5KSB7CiAgICBmaW5hbCBpbnQgc2l6ZSA9IF9pbmRleC5sZW5ndGg7CiAgICBmaW5hbCBpbnQgc2l6ZU1hc2sgPSBzaXplIC0gMTsKICAgIGZpbmFsIGludCBtYXhFbnRyaWVzID0gc2l6ZSA+PiAxOwogICAgZmluYWwgaW50IGZ1bGxIYXNoID0gX2hhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBpbnQgaGFzaFBhdHRlcm4gPSBfSGFzaEJhc2UuX2hhc2hQYXR0ZXJuKGZ1bGxIYXNoLCBfaGFzaE1hc2ssIHNpemUpOwogICAgaW50IGkgPSBfSGFzaEJhc2UuX2ZpcnN0UHJvYmUoZnVsbEhhc2gsIHNpemVNYXNrKTsKICAgIGludCBwYWlyID0gX2luZGV4W2ldOwogICAgd2hpbGUgKHBhaXIgIT0gX0hhc2hCYXNlLl9VTlVTRURfUEFJUikgewogICAgICBpZiAocGFpciAhPSBfSGFzaEJhc2UuX0RFTEVURURfUEFJUikgewogICAgICAgIGZpbmFsIGludCBlbnRyeSA9IGhhc2hQYXR0ZXJuIF4gcGFpcjsKICAgICAgICBpZiAoZW50cnkgPCBtYXhFbnRyaWVzKSB7CiAgICAgICAgICBmaW5hbCBpbnQgZCA9IGVudHJ5IDw8IDE7CiAgICAgICAgICBpZiAoX2VxdWFscyhrZXksIF9kYXRhW2RdKSkgewogICAgICAgICAgICByZXR1cm4gX2RhdGFbZCArIDFdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpID0gX0hhc2hCYXNlLl9uZXh0UHJvYmUoaSwgc2l6ZU1hc2spOwogICAgICBwYWlyID0gX2luZGV4W2ldOwogICAgfQogICAgcmV0dXJuIF9kYXRhOwogIH0KCiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSA9PiAhaWRlbnRpY2FsKF9kYXRhLCBfZ2V0VmFsdWVPckRhdGEoa2V5KSk7CgogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgewogICAgdmFyIHYgPSBfZ2V0VmFsdWVPckRhdGEoa2V5KTsKICAgIHJldHVybiBpZGVudGljYWwoX2RhdGEsIHYpID8gbnVsbCA6IGludGVybmFsLnVuc2FmZUNhc3Q8Vj4odik7CiAgfQoKICBib29sIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CiAgICBmb3IgKHZhciB2IGluIHZhbHVlcykgewogICAgICAvLyBTcGVjLiBzYXlzIHRoaXMgc2hvdWxkIGFsd2F5cyB1c2UgIj09IiwgYWxzbyBmb3IgaWRlbnRpdHkgbWFwcywgZXRjLgogICAgICBpZiAodiA9PSB2YWx1ZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIGZvckVhY2godm9pZCBmKEsga2V5LCBWIHZhbHVlKSkgewogICAgdmFyIGtpID0ga2V5cy5pdGVyYXRvcjsKICAgIHZhciB2aSA9IHZhbHVlcy5pdGVyYXRvcjsKICAgIHdoaWxlIChraS5tb3ZlTmV4dCgpKSB7CiAgICAgIHZpLm1vdmVOZXh0KCk7CiAgICAgIGYoa2kuY3VycmVudCwgdmkuY3VycmVudCk7CiAgICB9CiAgfQoKICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PgogICAgICBuZXcgX0NvbXBhY3RJdGVyYWJsZTxLPih0aGlzLCBfZGF0YSwgX3VzZWREYXRhLCAtMiwgMik7CiAgSXRlcmFibGU8Vj4gZ2V0IHZhbHVlcyA9PgogICAgICBuZXcgX0NvbXBhY3RJdGVyYWJsZTxWPih0aGlzLCBfZGF0YSwgX3VzZWREYXRhLCAtMSwgMik7Cn0KCmNsYXNzIF9Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoTWFwPEssIFY+IGV4dGVuZHMgX0hhc2hGaWVsZEJhc2UKICAgIHdpdGgKICAgICAgICBNYXBNaXhpbjxLLCBWPiwKICAgICAgICBfTGlua2VkSGFzaE1hcE1peGluPEssIFY+LAogICAgICAgIF9IYXNoQmFzZSwKICAgICAgICBfSWRlbnRpY2FsQW5kSWRlbnRpdHlIYXNoQ29kZQogICAgaW1wbGVtZW50cyBMaW5rZWRIYXNoTWFwPEssIFY+IHsKICBfQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaE1hcCgpIDogc3VwZXIoX0hhc2hCYXNlLl9JTklUSUFMX0lOREVYX1NJWkUpOwp9CgpjbGFzcyBfQ29tcGFjdExpbmtlZEN1c3RvbUhhc2hNYXA8SywgVj4gZXh0ZW5kcyBfSGFzaEZpZWxkQmFzZQogICAgd2l0aCBNYXBNaXhpbjxLLCBWPiwgX0xpbmtlZEhhc2hNYXBNaXhpbjxLLCBWPiwgX0hhc2hCYXNlCiAgICBpbXBsZW1lbnRzIExpbmtlZEhhc2hNYXA8SywgVj4gewogIGZpbmFsIF9lcXVhbGl0eTsKICBmaW5hbCBfaGFzaGVyOwogIGZpbmFsIF92YWxpZEtleTsKCiAgLy8gVE9ETyhrb2RhKTogQXNrIGdicmFjaGEgd2h5IEkgY2Fubm90IGhhdmUgZmllbGRzIF9lcXVhbHMvX2hhc2hDb2RlLgogIGludCBfaGFzaENvZGUoZSkgPT4gX2hhc2hlcihlKTsKICBib29sIF9lcXVhbHMoZTEsIGUyKSA9PiBfZXF1YWxpdHkoZTEsIGUyKTsKCiAgYm9vbCBjb250YWluc0tleShPYmplY3QgbykgPT4gX3ZhbGlkS2V5KG8pID8gc3VwZXIuY29udGFpbnNLZXkobykgOiBmYWxzZTsKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBvKSA9PiBfdmFsaWRLZXkobykgPyBzdXBlcltvXSA6IG51bGw7CiAgViByZW1vdmUoT2JqZWN0IG8pID0+IF92YWxpZEtleShvKSA/IHN1cGVyLnJlbW92ZShvKSA6IG51bGw7CgogIF9Db21wYWN0TGlua2VkQ3VzdG9tSGFzaE1hcCh0aGlzLl9lcXVhbGl0eSwgdGhpcy5faGFzaGVyLCB2YWxpZEtleSkKICAgICAgOiBfdmFsaWRLZXkgPSAodmFsaWRLZXkgIT0gbnVsbCkgPyB2YWxpZEtleSA6IG5ldyBfVHlwZVRlc3Q8Sz4oKS50ZXN0LAogICAgICAgIHN1cGVyKF9IYXNoQmFzZS5fSU5JVElBTF9JTkRFWF9TSVpFKTsKfQoKLy8gSXRlcmF0ZXMgdGhyb3VnaCBfZGF0YVtfb2Zmc2V0ICsgX3N0ZXBdLCBfZGF0YVtfb2Zmc2V0ICsgMipfc3RlcF0sIC4uLgovLyBhbmQgY2hlY2tzIGZvciBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4KY2xhc3MgX0NvbXBhY3RJdGVyYWJsZTxFPiBleHRlbmRzIEl0ZXJhYmxlPEU+IHsKICBmaW5hbCBfSGFzaEJhc2UgX3RhYmxlOwogIGZpbmFsIExpc3QgX2RhdGE7CiAgZmluYWwgaW50IF9sZW47CiAgZmluYWwgaW50IF9vZmZzZXQ7CiAgZmluYWwgaW50IF9zdGVwOwoKICBfQ29tcGFjdEl0ZXJhYmxlKAogICAgICB0aGlzLl90YWJsZSwgdGhpcy5fZGF0YSwgdGhpcy5fbGVuLCB0aGlzLl9vZmZzZXQsIHRoaXMuX3N0ZXApOwoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4KICAgICAgbmV3IF9Db21wYWN0SXRlcmF0b3I8RT4oX3RhYmxlLCBfZGF0YSwgX2xlbiwgX29mZnNldCwgX3N0ZXApOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfdGFibGUubGVuZ3RoOwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gbGVuZ3RoID09IDA7CiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKfQoKY2xhc3MgX0NvbXBhY3RJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBfSGFzaEJhc2UgX3RhYmxlOwogIGZpbmFsIExpc3QgX2RhdGE7CiAgZmluYWwgaW50IF9sZW47CiAgaW50IF9vZmZzZXQ7CiAgZmluYWwgaW50IF9zdGVwOwogIGZpbmFsIGludCBfY2hlY2tTdW07CiAgRSBjdXJyZW50OwoKICBfQ29tcGFjdEl0ZXJhdG9yKAogICAgICBfSGFzaEJhc2UgdGFibGUsIHRoaXMuX2RhdGEsIHRoaXMuX2xlbiwgdGhpcy5fb2Zmc2V0LCB0aGlzLl9zdGVwKQogICAgICA6IF90YWJsZSA9IHRhYmxlLAogICAgICAgIF9jaGVja1N1bSA9IHRhYmxlLl9jaGVja1N1bTsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfdGFibGUuX2lzTW9kaWZpZWRTaW5jZShfZGF0YSwgX2NoZWNrU3VtKSkgewogICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKF90YWJsZSk7CiAgICB9CiAgICBkbyB7CiAgICAgIF9vZmZzZXQgKz0gX3N0ZXA7CiAgICB9IHdoaWxlIChfb2Zmc2V0IDwgX2xlbiAmJiBfSGFzaEJhc2UuX2lzRGVsZXRlZChfZGF0YSwgX2RhdGFbX29mZnNldF0pKTsKICAgIGlmIChfb2Zmc2V0IDwgX2xlbikgewogICAgICBjdXJyZW50ID0gaW50ZXJuYWwudW5zYWZlQ2FzdDxFPihfZGF0YVtfb2Zmc2V0XSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9Cn0KCi8vIFNldCBpbXBsZW1lbnRhdGlvbiwgYW5hbG9nb3VzIHRvIF9Db21wYWN0TGlua2VkSGFzaE1hcC4KY2xhc3MgX0NvbXBhY3RMaW5rZWRIYXNoU2V0PEU+IGV4dGVuZHMgX0hhc2hGaWVsZEJhc2UKICAgIHdpdGggX0hhc2hCYXNlLCBfT3BlcmF0b3JFcXVhbHNBbmRIYXNoQ29kZSwgU2V0TWl4aW48RT4KICAgIGltcGxlbWVudHMgTGlua2VkSGFzaFNldDxFPiB7CiAgX0NvbXBhY3RMaW5rZWRIYXNoU2V0KCkgOiBzdXBlcihfSGFzaEJhc2UuX0lOSVRJQUxfSU5ERVhfU0laRSA+PiAxKSB7CiAgICBhc3NlcnQoX0hhc2hCYXNlLl9VTlVTRURfUEFJUiA9PSAwKTsKICB9CgogIHN0YXRpYyBTZXQ8Uj4gX25ld0VtcHR5PFI+KCkgPT4gbmV3IF9Db21wYWN0TGlua2VkSGFzaFNldDxSPigpOwoKICBTZXQ8Uj4gY2FzdDxSPigpID0+IFNldC5jYXN0RnJvbTxFLCBSPih0aGlzLCBuZXdTZXQ6IF9uZXdFbXB0eSk7CiAgaW50IGdldCBsZW5ndGggPT4gX3VzZWREYXRhIC0gX2RlbGV0ZWRLZXlzOwoKICBFIGdldCBmaXJzdCB7CiAgICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBfdXNlZERhdGE7IG9mZnNldCsrKSB7CiAgICAgIE9iamVjdCBjdXJyZW50ID0gX2RhdGFbb2Zmc2V0XTsKICAgICAgaWYgKCFfSGFzaEJhc2UuX2lzRGVsZXRlZChfZGF0YSwgY3VycmVudCkpIHsKICAgICAgICByZXR1cm4gY3VycmVudDsKICAgICAgfQogICAgfQogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGdldCBsYXN0IHsKICAgIGZvciAoaW50IG9mZnNldCA9IF91c2VkRGF0YSAtIDE7IG9mZnNldCA+PSAwOyBvZmZzZXQtLSkgewogICAgICBPYmplY3QgY3VycmVudCA9IF9kYXRhW29mZnNldF07CiAgICAgIGlmICghX0hhc2hCYXNlLl9pc0RlbGV0ZWQoX2RhdGEsIGN1cnJlbnQpKSB7CiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CiAgICAgIH0KICAgIH0KICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgdm9pZCBfcmVoYXNoKCkgewogICAgaWYgKChfZGVsZXRlZEtleXMgPDwgMSkgPiBfdXNlZERhdGEpIHsKICAgICAgX2luaXQoX2luZGV4Lmxlbmd0aCwgX2hhc2hNYXNrLCBfZGF0YSwgX3VzZWREYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgIF9pbml0KF9pbmRleC5sZW5ndGggPDwgMSwgX2hhc2hNYXNrID4+IDEsIF9kYXRhLCBfdXNlZERhdGEpOwogICAgfQogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIGlmICghaXNFbXB0eSkgewogICAgICBfaW5pdChfSGFzaEJhc2UuX0lOSVRJQUxfSU5ERVhfU0laRSwgX2hhc2hNYXNrLCBudWxsLCAwKTsKICAgIH0KICB9CgogIHZvaWQgX2luaXQoaW50IHNpemUsIGludCBoYXNoTWFzaywgTGlzdCBvbGREYXRhLCBpbnQgb2xkVXNlZCkgewogICAgX2luZGV4ID0gbmV3IFVpbnQzMkxpc3Qoc2l6ZSk7CiAgICBfaGFzaE1hc2sgPSBoYXNoTWFzazsKICAgIF9kYXRhID0gbmV3IExpc3Qoc2l6ZSA+PiAxKTsKICAgIF91c2VkRGF0YSA9IDA7CiAgICBfZGVsZXRlZEtleXMgPSAwOwogICAgaWYgKG9sZERhdGEgIT0gbnVsbCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9sZFVzZWQ7IGkgKz0gMSkgewogICAgICAgIHZhciBrZXkgPSBvbGREYXRhW2ldOwogICAgICAgIGlmICghX0hhc2hCYXNlLl9pc0RlbGV0ZWQob2xkRGF0YSwga2V5KSkgewogICAgICAgICAgYWRkKGtleSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBib29sIGFkZChFIGtleSkgewogICAgZmluYWwgaW50IHNpemUgPSBfaW5kZXgubGVuZ3RoOwogICAgZmluYWwgaW50IHNpemVNYXNrID0gc2l6ZSAtIDE7CiAgICBmaW5hbCBpbnQgbWF4RW50cmllcyA9IHNpemUgPj4gMTsKICAgIGZpbmFsIGludCBmdWxsSGFzaCA9IF9oYXNoQ29kZShrZXkpOwogICAgZmluYWwgaW50IGhhc2hQYXR0ZXJuID0gX0hhc2hCYXNlLl9oYXNoUGF0dGVybihmdWxsSGFzaCwgX2hhc2hNYXNrLCBzaXplKTsKICAgIGludCBpID0gX0hhc2hCYXNlLl9maXJzdFByb2JlKGZ1bGxIYXNoLCBzaXplTWFzayk7CiAgICBpbnQgZmlyc3REZWxldGVkID0gLTE7CiAgICBpbnQgcGFpciA9IF9pbmRleFtpXTsKICAgIHdoaWxlIChwYWlyICE9IF9IYXNoQmFzZS5fVU5VU0VEX1BBSVIpIHsKICAgICAgaWYgKHBhaXIgPT0gX0hhc2hCYXNlLl9ERUxFVEVEX1BBSVIpIHsKICAgICAgICBpZiAoZmlyc3REZWxldGVkIDwgMCkgewogICAgICAgICAgZmlyc3REZWxldGVkID0gaTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmluYWwgaW50IGQgPSBoYXNoUGF0dGVybiBeIHBhaXI7CiAgICAgICAgaWYgKGQgPCBtYXhFbnRyaWVzICYmIF9lcXVhbHMoa2V5LCBfZGF0YVtkXSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaSA9IF9IYXNoQmFzZS5fbmV4dFByb2JlKGksIHNpemVNYXNrKTsKICAgICAgcGFpciA9IF9pbmRleFtpXTsKICAgIH0KICAgIGlmIChfdXNlZERhdGEgPT0gX2RhdGEubGVuZ3RoKSB7CiAgICAgIF9yZWhhc2goKTsKICAgICAgYWRkKGtleSk7CiAgICB9IGVsc2UgewogICAgICBmaW5hbCBpbnQgaW5zZXJ0aW9uUG9pbnQgPSAoZmlyc3REZWxldGVkID49IDApID8gZmlyc3REZWxldGVkIDogaTsKICAgICAgYXNzZXJ0KDEgPD0gaGFzaFBhdHRlcm4gJiYgaGFzaFBhdHRlcm4gPCAoMSA8PCAzMikpOwogICAgICBhc3NlcnQoKGhhc2hQYXR0ZXJuICYgX3VzZWREYXRhKSA9PSAwKTsKICAgICAgX2luZGV4W2luc2VydGlvblBvaW50XSA9IGhhc2hQYXR0ZXJuIHwgX3VzZWREYXRhOwogICAgICBfZGF0YVtfdXNlZERhdGErK10gPSBrZXk7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vIElmIGtleSBpcyBhYnNlbnQsIHJldHVybiBfZGF0YSAod2hpY2ggaXMgbmV2ZXIgYSB2YWx1ZSkuCiAgT2JqZWN0IF9nZXRLZXlPckRhdGEoT2JqZWN0IGtleSkgewogICAgZmluYWwgaW50IHNpemUgPSBfaW5kZXgubGVuZ3RoOwogICAgZmluYWwgaW50IHNpemVNYXNrID0gc2l6ZSAtIDE7CiAgICBmaW5hbCBpbnQgbWF4RW50cmllcyA9IHNpemUgPj4gMTsKICAgIGZpbmFsIGludCBmdWxsSGFzaCA9IF9oYXNoQ29kZShrZXkpOwogICAgZmluYWwgaW50IGhhc2hQYXR0ZXJuID0gX0hhc2hCYXNlLl9oYXNoUGF0dGVybihmdWxsSGFzaCwgX2hhc2hNYXNrLCBzaXplKTsKICAgIGludCBpID0gX0hhc2hCYXNlLl9maXJzdFByb2JlKGZ1bGxIYXNoLCBzaXplTWFzayk7CiAgICBpbnQgcGFpciA9IF9pbmRleFtpXTsKICAgIHdoaWxlIChwYWlyICE9IF9IYXNoQmFzZS5fVU5VU0VEX1BBSVIpIHsKICAgICAgaWYgKHBhaXIgIT0gX0hhc2hCYXNlLl9ERUxFVEVEX1BBSVIpIHsKICAgICAgICBmaW5hbCBpbnQgZCA9IGhhc2hQYXR0ZXJuIF4gcGFpcjsKICAgICAgICBpZiAoZCA8IG1heEVudHJpZXMgJiYgX2VxdWFscyhrZXksIF9kYXRhW2RdKSkgewogICAgICAgICAgcmV0dXJuIF9kYXRhW2RdOyAvLyBOb3RlOiBNdXN0IHJldHVybiB0aGUgZXhpc3Rpbmcga2V5LgogICAgICAgIH0KICAgICAgfQogICAgICBpID0gX0hhc2hCYXNlLl9uZXh0UHJvYmUoaSwgc2l6ZU1hc2spOwogICAgICBwYWlyID0gX2luZGV4W2ldOwogICAgfQogICAgcmV0dXJuIF9kYXRhOwogIH0KCiAgRSBsb29rdXAoT2JqZWN0IGtleSkgewogICAgdmFyIGsgPSBfZ2V0S2V5T3JEYXRhKGtleSk7CiAgICByZXR1cm4gaWRlbnRpY2FsKF9kYXRhLCBrKSA/IG51bGwgOiBrOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3Qga2V5KSA9PiAhaWRlbnRpY2FsKF9kYXRhLCBfZ2V0S2V5T3JEYXRhKGtleSkpOwoKICBib29sIHJlbW92ZShPYmplY3Qga2V5KSB7CiAgICBmaW5hbCBpbnQgc2l6ZSA9IF9pbmRleC5sZW5ndGg7CiAgICBmaW5hbCBpbnQgc2l6ZU1hc2sgPSBzaXplIC0gMTsKICAgIGZpbmFsIGludCBtYXhFbnRyaWVzID0gc2l6ZSA+PiAxOwogICAgZmluYWwgaW50IGZ1bGxIYXNoID0gX2hhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBpbnQgaGFzaFBhdHRlcm4gPSBfSGFzaEJhc2UuX2hhc2hQYXR0ZXJuKGZ1bGxIYXNoLCBfaGFzaE1hc2ssIHNpemUpOwogICAgaW50IGkgPSBfSGFzaEJhc2UuX2ZpcnN0UHJvYmUoZnVsbEhhc2gsIHNpemVNYXNrKTsKICAgIGludCBwYWlyID0gX2luZGV4W2ldOwogICAgd2hpbGUgKHBhaXIgIT0gX0hhc2hCYXNlLl9VTlVTRURfUEFJUikgewogICAgICBpZiAocGFpciAhPSBfSGFzaEJhc2UuX0RFTEVURURfUEFJUikgewogICAgICAgIGZpbmFsIGludCBkID0gaGFzaFBhdHRlcm4gXiBwYWlyOwogICAgICAgIGlmIChkIDwgbWF4RW50cmllcyAmJiBfZXF1YWxzKGtleSwgX2RhdGFbZF0pKSB7CiAgICAgICAgICBfaW5kZXhbaV0gPSBfSGFzaEJhc2UuX0RFTEVURURfUEFJUjsKICAgICAgICAgIF9IYXNoQmFzZS5fc2V0RGVsZXRlZEF0KF9kYXRhLCBkKTsKICAgICAgICAgICsrX2RlbGV0ZWRLZXlzOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGkgPSBfSGFzaEJhc2UuX25leHRQcm9iZShpLCBzaXplTWFzayk7CiAgICAgIHBhaXIgPSBfaW5kZXhbaV07CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4KICAgICAgbmV3IF9Db21wYWN0SXRlcmF0b3I8RT4odGhpcywgX2RhdGEsIF91c2VkRGF0YSwgLTEsIDEpOwoKICAvLyBSZXR1cm5zIGEgc2V0IG9mIHRoZSBzYW1lIHR5cGUsIGFsdGhvdWdoIHRoaXMKICAvLyBpcyBub3QgcmVxdWlyZWQgYnkgdGhlIHNwZWMuIChGb3IgaW5zdGFuY2UsIGFsd2F5cyB1c2luZyBhbiBpZGVudGl0eSBzZXQKICAvLyB3b3VsZCBiZSB0ZWNobmljYWxseSBjb3JyZWN0LCBhbGJlaXQgc3VycHJpc2luZy4pCiAgU2V0PEU+IHRvU2V0KCkgPT4gbmV3IF9Db21wYWN0TGlua2VkSGFzaFNldDxFPigpLi5hZGRBbGwodGhpcyk7CgogIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBbX3JlaGFzaE9iamVjdHNdIChzZWUgYWJvdmUpLgogIHZvaWQgX3JlZ2VuZXJhdGVJbmRleCgpIHsKICAgIF9yZWhhc2goKTsKICB9Cn0KCmNsYXNzIF9Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoU2V0PEU+IGV4dGVuZHMgX0NvbXBhY3RMaW5rZWRIYXNoU2V0PEU+CiAgICB3aXRoIF9JZGVudGljYWxBbmRJZGVudGl0eUhhc2hDb2RlIHsKICBTZXQ8RT4gdG9TZXQoKSA9PiBuZXcgX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hTZXQ8RT4oKS4uYWRkQWxsKHRoaXMpOwoKICBzdGF0aWMgU2V0PFI+IF9uZXdFbXB0eTxSPigpID0+IG5ldyBfQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaFNldDxSPigpOwoKICBTZXQ8Uj4gY2FzdDxSPigpID0+IFNldC5jYXN0RnJvbTxFLCBSPih0aGlzLCBuZXdTZXQ6IF9uZXdFbXB0eSk7Cn0KCmNsYXNzIF9Db21wYWN0TGlua2VkQ3VzdG9tSGFzaFNldDxFPiBleHRlbmRzIF9Db21wYWN0TGlua2VkSGFzaFNldDxFPiB7CiAgZmluYWwgX2VxdWFsaXR5OwogIGZpbmFsIF9oYXNoZXI7CiAgZmluYWwgX3ZhbGlkS2V5OwoKICBpbnQgX2hhc2hDb2RlKGUpID0+IF9oYXNoZXIoZSk7CiAgYm9vbCBfZXF1YWxzKGUxLCBlMikgPT4gX2VxdWFsaXR5KGUxLCBlMik7CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IG8pID0+IF92YWxpZEtleShvKSA/IHN1cGVyLmNvbnRhaW5zKG8pIDogZmFsc2U7CiAgRSBsb29r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eXNgIGl0ZXJhYmxlIHNob3VsZCBoYXZlIGVmZmljaWVudCBbSXRlcmFibGUubGVuZ3RoXSBhbmQKLy8vIFtJdGVyYWJsZS5jb250YWluc10gb3BlcmF0aW9ucywgYW5kIGl0IHNob3VsZCBjYXRjaCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbnMKLy8vIG9mIHRoZSBrZXlzIHdoaWxlIGl0ZXJhdGluZy4KLy8vCi8vLyBBIG1vcmUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIGlzIHVzdWFsbHkgcG9zc2libGUgYnkgb3ZlcnJpZGluZwovLy8gc29tZSBvZiB0aGUgb3RoZXIgbWVtYmVycyBhcyB3ZWxsLgphYnN0cmFjdCBjbGFzcyBNYXBCYXNlPEssIFY+IGV4dGVuZHMgTWFwTWl4aW48SywgVj4gewogIHN0YXRpYyBTdHJpbmcgbWFwVG9TdHJpbmcoTWFwIG0pIHsKICAgIC8vIFJldXNlcyB0aGUgbGlzdCBpbiBJdGVyYWJsZUJhc2UgZm9yIGRldGVjdGluZyB0b1N0cmluZyBjeWNsZXMuCiAgICBpZiAoX2lzVG9TdHJpbmdWaXNpdGluZyhtKSkgewogICAgICByZXR1cm4gJ3suLi59JzsKICAgIH0KCiAgICB2YXIgcmVzdWx0ID0gU3RyaW5nQnVmZmVyKCk7CiAgICB0cnkgewogICAgICBfdG9TdHJpbmdWaXNpdGluZy5hZGQobSk7CiAgICAgIHJlc3VsdC53cml0ZSgneycpOwogICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICAgbS5mb3JFYWNoKChrLCB2KSB7CiAgICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgICAgcmVzdWx0LndyaXRlKCcsICcpOwogICAgICAgIH0KICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgIHJlc3VsdC53cml0ZShrKTsKICAgICAgICByZXN1bHQud3JpdGUoJzogJyk7CiAgICAgICAgcmVzdWx0LndyaXRlKHYpOwogICAgICB9KTsKICAgICAgcmVzdWx0LndyaXRlKCd9Jyk7CiAgICB9IGZpbmFsbHkgewogICAgICBhc3NlcnQoaWRlbnRpY2FsKF90b1N0cmluZ1Zpc2l0aW5nLmxhc3QsIG0pKTsKICAgICAgX3RvU3RyaW5nVmlzaXRpbmcucmVtb3ZlTGFzdCgpOwogICAgfQoKICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICB9CgogIHN0YXRpYyBfaWQoeCkgPT4geDsKCiAgLy8vIEZpbGxzIGEgW01hcF0gd2l0aCBrZXkvdmFsdWUgcGFpcnMgY29tcHV0ZWQgZnJvbSBbaXRlcmFibGVdLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IFtNYXBdIGNsYXNzZXMgaW4gdGhlIG5hbWVkIGNvbnN0cnVjdG9yCiAgLy8vIGBmcm9tSXRlcmFibGVgLgogIHN0YXRpYyB2b2lkIF9maWxsTWFwV2l0aE1hcHBlZEl0ZXJhYmxlKAogICAgICBNYXAgbWFwLCBJdGVyYWJsZSBpdGVyYWJsZSwga2V5KGVsZW1lbnQpLCB2YWx1ZShlbGVtZW50KSkgewogICAga2V5ID8/PSBfaWQ7CiAgICB2YWx1ZSA/Pz0gX2lkOwoKICAgIGZvciAodmFyIGVsZW1lbnQgaW4gaXRlcmFibGUpIHsKICAgICAgbWFwW2tleShlbGVtZW50KV0gPSB2YWx1ZShlbGVtZW50KTsKICAgIH0KICB9CgogIC8vLyBGaWxscyBhIG1hcCBieSBhc3NvY2lhdGluZyB0aGUgW2tleXNdIHRvIFt2YWx1ZXNdLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IFtNYXBdIGNsYXNzZXMgaW4gdGhlIG5hbWVkIGNvbnN0cnVjdG9yCiAgLy8vIGBmcm9tSXRlcmFibGVzYC4KICBzdGF0aWMgdm9pZCBfZmlsbE1hcFdpdGhJdGVyYWJsZXMoTWFwIG1hcCwgSXRlcmFibGUga2V5cywgSXRlcmFibGUgdmFsdWVzKSB7CiAgICBJdGVyYXRvciBrZXlJdGVyYXRvciA9IGtleXMuaXRlcmF0b3I7CiAgICBJdGVyYXRvciB2YWx1ZUl0ZXJhdG9yID0gdmFsdWVzLml0ZXJhdG9yOwoKICAgIGJvb2wgaGFzTmV4dEtleSA9IGtleUl0ZXJhdG9yLm1vdmVOZXh0KCk7CiAgICBib29sIGhhc05leHRWYWx1ZSA9IHZhbHVlSXRlcmF0b3IubW92ZU5leHQoKTsKCiAgICB3aGlsZSAoaGFzTmV4dEtleSAmJiBoYXNOZXh0VmFsdWUpIHsKICAgICAgbWFwW2tleUl0ZXJhdG9yLmN1cnJlbnRdID0gdmFsdWVJdGVyYXRvci5jdXJyZW50OwogICAgICBoYXNOZXh0S2V5ID0ga2V5SXRlcmF0b3IubW92ZU5leHQoKTsKICAgICAgaGFzTmV4dFZhbHVlID0gdmFsdWVJdGVyYXRvci5tb3ZlTmV4dCgpOwogICAgfQoKICAgIGlmIChoYXNOZXh0S2V5IHx8IGhhc05leHRWYWx1ZSkgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCJJdGVyYWJsZXMgZG8gbm90IGhhdmUgc2FtZSBsZW5ndGguIik7CiAgICB9CiAgfQp9CgovLy8gTWl4aW4gaW1wbGVtZW50aW5nIGEgW01hcF0uCi8vLwovLy8gVGhpcyBtaXhpbiBoYXMgYSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgYnV0IGZpdmUgb2YgdGhlIG1lbWJlcnMgb2YKLy8vIFtNYXBdLgovLy8gQSBiYXNpYyBgTWFwYCBjbGFzcyBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgbWl4aW4gaW4gdGhpcyBjbGFzcyBhbmQKLy8vIGltcGxlbWVudGluZyBga2V5c2AsIGBvcGVyYXRvcltdYCwgYG9wZXJhdG9yW109YCwgYHJlbW92ZWAgYW5kIGBjbGVhcmAuCi8vLyBUaGUgcmVtYWluaW5nIG9wZXJhdGlvbnMgYXJlIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHRoZXNlIGZpdmUuCi8vLwovLy8gVGhlIGBrZXlzYCBpdGVyYWJsZSBzaG91bGQgaGF2ZSBlZmZpY2llbnQgW0l0ZXJhYmxlLmxlbmd0aF0gYW5kCi8vLyBbSXRlcmFibGUuY29udGFpbnNdIG9wZXJhdGlvbnMsIGFuZCBpdCBzaG91bGQgY2F0Y2ggY29uY3VycmVudCBtb2RpZmljYXRpb25zCi8vLyBvZiB0aGUga2V5cyB3aGlsZSBpdGVyYXRpbmcuCi8vLwovLy8gQSBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBpcyB1c3VhbGx5IHBvc3NpYmxlIGJ5IG92ZXJyaWRpbmcKLy8vIHNvbWUgb2YgdGhlIG90aGVyIG1lbWJlcnMgYXMgd2VsbC4KYWJzdHJhY3QgY2xhc3MgTWFwTWl4aW48SywgVj4gaW1wbGVtZW50cyBNYXA8SywgVj4gewogIEl0ZXJhYmxlPEs+IGdldCBrZXlzOwogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSk7CiAgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKTsKICBWIHJlbW92ZShPYmplY3Qga2V5KTsKICAvLyBUaGUgYGNsZWFyYCBvcGVyYXRpb24gc2hvdWxkIG5vdCBiZSBiYXNlZCBvbiBgcmVtb3ZlYC4KICAvLyBJdCBzaG91bGQgY2xlYXIgdGhlIG1hcCBldmVuIGlmIHNvbWUga2V5cyBhcmUgbm90IGVxdWFsIHRvIHRoZW1zZWx2ZXMuCiAgdm9pZCBjbGVhcigpOwoKICBNYXA8UkssIFJWPiBjYXN0PFJLLCBSVj4oKSA9PiBNYXAuY2FzdEZyb208SywgViwgUkssIFJWPih0aGlzKTsKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oSyBrZXksIFYgdmFsdWUpKSB7CiAgICBmb3IgKEsga2V5IGluIGtleXMpIHsKICAgICAgYWN0aW9uKGtleSwgdGhpc1trZXldKTsKICAgIH0KICB9CgogIHZvaWQgYWRkQWxsKE1hcDxLLCBWPiBvdGhlcikgewogICAgZm9yIChLIGtleSBpbiBvdGhlci5rZXlzKSB7CiAgICAgIHRoaXNba2V5XSA9IG90aGVyW2tleV07CiAgICB9CiAgfQoKICBib29sIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CiAgICBmb3IgKEsga2V5IGluIGtleXMpIHsKICAgICAgaWYgKHRoaXNba2V5XSA9PSB2YWx1ZSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIGlmIChjb250YWluc0tleShrZXkpKSB7CiAgICAgIHJldHVybiB0aGlzW2tleV07CiAgICB9CiAgICByZXR1cm4gdGhpc1trZXldID0gaWZBYnNlbnQoKTsKICB9CgogIFYgdXBkYXRlKEsga2V5LCBWIHVwZGF0ZShWIHZhbHVlKSwge1YgaWZBYnNlbnQoKX0pIHsKICAgIGlmICh0aGlzLmNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgcmV0dXJuIHRoaXNba2V5XSA9IHVwZGF0ZSh0aGlzW2tleV0pOwogICAgfQogICAgaWYgKGlmQWJzZW50ICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHRoaXNba2V5XSA9IGlmQWJzZW50KCk7CiAgICB9CiAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKGtleSwgImtleSIsICJLZXkgbm90IGluIG1hcC4iKTsKICB9CgogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSkgewogICAgZm9yICh2YXIga2V5IGluIHRoaXMua2V5cykgewogICAgICB0aGlzW2tleV0gPSB1cGRhdGUoa2V5LCB0aGlzW2tleV0pOwogICAgfQogIH0KCiAgSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGdldCBlbnRyaWVzIHsKICAgIHJldHVybiBrZXlzLm1hcCgoSyBrZXkpID0+IE1hcEVudHJ5PEssIFY+KGtleSwgdGhpc1trZXldKSk7CiAgfQoKICBNYXA8SzIsIFYyPiBtYXA8SzIsIFYyPihNYXBFbnRyeTxLMiwgVjI+IHRyYW5zZm9ybShLIGtleSwgViB2YWx1ZSkpIHsKICAgIHZhciByZXN1bHQgPSA8SzIsIFYyPnt9OwogICAgZm9yICh2YXIga2V5IGluIHRoaXMua2V5cykgewogICAgICB2YXIgZW50cnkgPSB0cmFuc2Zvcm0oa2V5LCB0aGlzW2tleV0pOwogICAgICByZXN1bHRbZW50cnkua2V5XSA9IGVudHJ5LnZhbHVlOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgYWRkRW50cmllcyhJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gbmV3RW50cmllcykgewogICAgZm9yICh2YXIgZW50cnkgaW4gbmV3RW50cmllcykgewogICAgICB0aGlzW2VudHJ5LmtleV0gPSBlbnRyeS52YWx1ZTsKICAgIH0KICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEsga2V5LCBWIHZhbHVlKSkgewogICAgdmFyIGtleXNUb1JlbW92ZSA9IDxLPltdOwogICAgZm9yICh2YXIga2V5IGluIGtleXMpIHsKICAgICAgaWYgKHRlc3Qoa2V5LCB0aGlzW2tleV0pKSBrZXlzVG9SZW1vdmUuYWRkKGtleSk7CiAgICB9CiAgICBmb3IgKHZhciBrZXkgaW4ga2V5c1RvUmVtb3ZlKSB7CiAgICAgIHRoaXMucmVtb3ZlKGtleSk7CiAgICB9CiAgfQoKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpID0+IGtleXMuY29udGFpbnMoa2V5KTsKICBpbnQgZ2V0IGxlbmd0aCA9PiBrZXlzLmxlbmd0aDsKICBib29sIGdldCBpc0VtcHR5ID0+IGtleXMuaXNFbXB0eTsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IGtleXMuaXNOb3RFbXB0eTsKICBJdGVyYWJsZTxWPiBnZXQgdmFsdWVzID0+IF9NYXBCYXNlVmFsdWVJdGVyYWJsZTxLLCBWPih0aGlzKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBNYXBCYXNlLm1hcFRvU3RyaW5nKHRoaXMpOwp9CgovLy8gQmFzaWMgaW1wbGVtZW50YXRpb24gb2YgYW4gdW5tb2RpZmlhYmxlIFtNYXBdLgovLy8KLy8vIFRoaXMgY2xhc3MgaGFzIGEgYmFzaWMgaW1wbGVtZW50YXRpb24gb2YgYWxsIGJ1dCB0d28gb2YgdGhlIG1lbWJlcnMgb2YKLy8vIGFuIHVtb2RpZmlhYmxlIFtNYXBdLgovLy8gQSBzaW1wbGUgdW5tb2RpZmlhYmxlIGBNYXBgIGNsYXNzIGNhbiBiZSBpbXBsZW1lbnRlZCBieSBleHRlbmRpbmcgdGhpcwovLy8gY2xhc3MgYW5kIGltcGxlbWVudGluZyBga2V5c2AgYW5kIGBvcGVyYXRvcltdYC4KLy8vCi8vLyBNb2RpZnlpbmcgb3BlcmF0aW9ucyB0aHJvdyB3aGVuIHVzZWQuCi8vLyBUaGUgcmVtYWluaW5nIG5vbi1tb2RpZnlpbmcgb3BlcmF0aW9ucyBhcmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgYGtleXNgCi8vLyBhbmQgYG9wZXJhdG9yW11gLgovLy8KLy8vIFRoZSBga2V5c2AgaXRlcmFibGUgc2hvdWxkIGhhdmUgZWZmaWNpZW50IFtJdGVyYWJsZS5sZW5ndGhdIGFuZAovLy8gW0l0ZXJhYmxlLmNvbnRhaW5zXSBvcGVyYXRpb25zLCBhbmQgaXQgc2hvdWxkIGNhdGNoIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9ucwovLy8gb2YgdGhlIGtleXMgd2hpbGUgaXRlcmF0aW5nLgovLy8KLy8vIEEgbW9yZSBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gaXMgdXN1YWxseSBwb3NzaWJsZSBieSBvdmVycmlkaW5nCi8vLyBzb21lIG9mIHRoZSBvdGhlciBtZW1iZXJzIGFzIHdlbGwuCmFic3RyYWN0IGNsYXNzIFVubW9kaWZpYWJsZU1hcEJhc2U8SywgVj4gPSBNYXBCYXNlPEssIFY+CiAgICB3aXRoIF9Vbm1vZGlmaWFibGVNYXBNaXhpbjxLLCBWPjsKCi8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbTWFwLnZhbHVlc10gYmFzZWQgb24gdGhlIG1hcCBhbmQgaXRzIFtNYXAua2V5c10gaXRlcmFibGUuCi8vLwovLy8gSXRlcmFibGUgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSB2YWx1ZXMgb2YgYSBgTWFwYC4KLy8vIEl0IGFjY2Vzc2VzIHRoZSB2YWx1ZXMgYnkgaXRlcmF0aW5nIG92ZXIgdGhlIGtleXMgb2YgdGhlIG1hcCwgYW5kIHVzaW5nIHRoZQovLy8gbWFwJ3MgYG9wZXJhdG9yW11gIHRvIGxvb2t1cCB0aGUga2V5cy4KY2xhc3MgX01hcEJhc2VWYWx1ZUl0ZXJhYmxlPEssIFY+IGV4dGVuZHMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8Vj4gewogIGZpbmFsIE1hcDxLLCBWPiBfbWFwOwogIF9NYXBCYXNlVmFsdWVJdGVyYWJsZSh0aGlzLl9tYXApOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbWFwLmxlbmd0aDsKICBib29sIGdldCBpc0VtcHR5ID0+IF9tYXAuaXNFbXB0eTsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9tYXAuaXNOb3RFbXB0eTsKICBWIGdldCBmaXJzdCA9PiBfbWFwW19tYXAua2V5cy5maXJzdF07CiAgViBnZXQgc2luZ2xlID0+IF9tYXBbX21hcC5rZXlzLnNpbmdsZV07CiAgViBnZXQgbGFzdCA9PiBfbWFwW19tYXAua2V5cy5sYXN0XTsKCiAgSXRlcmF0b3I8Vj4gZ2V0IGl0ZXJhdG9yID0+IF9NYXBCYXNlVmFsdWVJdGVyYXRvcjxLLCBWPihfbWFwKTsKfQoKLy8vIEl0ZXJhdG9yIGNyZWF0ZWQgYnkgW19NYXBCYXNlVmFsdWVJdGVyYWJsZV0uCi8vLwovLy8gSXRlcmF0ZXMgb3ZlciB0aGUgdmFsdWVzIG9mIGEgbWFwIGJ5IGl0ZXJhdGluZyBpdHMga2V5cyBhbmQgbG9va3VwIHVwIHRoZQovLy8gdmFsdWVzLgpjbGFzcyBfTWFwQmFzZVZhbHVlSXRlcmF0b3I8SywgVj4gaW1wbGVtZW50cyBJdGVyYXRvcjxWPiB7CiAgZmluYWwgSXRlcmF0b3I8Sz4gX2tleXM7CiAgZmluYWwgTWFwPEssIFY+IF9tYXA7CiAgViBfY3VycmVudDsKCiAgX01hcEJhc2VWYWx1ZUl0ZXJhdG9yKE1hcDxLLCBWPiBtYXApCiAgICAgIDogX21hcCA9IG1hcCwKICAgICAgICBfa2V5cyA9IG1hcC5rZXlzLml0ZXJhdG9yOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9rZXlzLm1vdmVOZXh0KCkpIHsKICAgICAgX2N1cnJlbnQgPSBfbWFwW19rZXlzLmN1cnJlbnRdOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9jdXJyZW50ID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIFYgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7Cn0KCi8vLyBNaXhpbiB0aGF0IG92ZXJyaWRlcyBtdXRhdGluZyBtYXAgb3BlcmF0aW9ucyB3aXRoIGltcGxlbWVudGF0aW9ucyB0aGF0Ci8vLyB0aHJvdy4KYWJzdHJhY3QgY2xhc3MgX1VubW9kaWZpYWJsZU1hcE1peGluPEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+IHsKICAvLy8gVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbWFwLgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKTsKICB9CgogIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBtYXAuCiAgdm9pZCBhZGRBbGwoTWFwPEssIFY+IG90aGVyKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKTsKICB9CgogIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBtYXAuCiAgdm9pZCBhZGRFbnRyaWVzKEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBlbnRyaWVzKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKTsKICB9CgogIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBtYXAuCiAgdm9pZCBjbGVhcigpIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1hcCIpOwogIH0KCiAgLy8vIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIG1hcC4KICBWIHJlbW92ZShPYmplY3Qga2V5KSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKTsKICB9CgogIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBtYXAuCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoSyBrZXksIFYgdmFsdWUpKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKTsKICB9CgogIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBtYXAuCiAgViBwdXRJZkFic2VudChLIGtleSwgViBpZkFic2VudCgpKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKTsKICB9CgogIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBtYXAuCiAgViB1cGRhdGUoSyBrZXksIFYgdXBkYXRlKFYgdmFsdWUpLCB7ViBpZkFic2VudCgpfSkgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUgbWFwIik7CiAgfQoKICAvLy8gVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbWFwLgogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSkgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUgbWFwIik7CiAgfQp9CgovLy8gV3JhcHBlciBhcm91bmQgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgW01hcF0gdGhhdCBvbmx5IGV4cG9zZXMgYE1hcGAKLy8vIG1lbWJlcnMuCi8vLwovLy8gQSBzaW1wbGUgd3JhcHBlciB0aGF0IGRlbGVnYXRlcyBhbGwgYE1hcGAgbWVtYmVycyB0byB0aGUgbWFwIHByb3ZpZGVkIGluIHRoZQovLy8gY29uc3RydWN0b3IuCi8vLwovLy8gQmFzZSBmb3IgZGVsZWdhdGluZyBtYXAgaW1wbGVtZW50YXRpb25zIGxpa2UgW1VubW9kaWZpYWJsZU1hcFZpZXddLgpjbGFzcyBNYXBWaWV3PEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+IHsKICBmaW5hbCBNYXA8SywgVj4gX21hcDsKICBjb25zdCBNYXBWaWV3KE1hcDxLLCBWPiBtYXApIDogX21hcCA9IG1hcDsKCiAgTWFwPFJLLCBSVj4gY2FzdDxSSywgUlY+KCkgPT4gX21hcC5jYXN0PFJLLCBSVj4oKTsKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpID0+IF9tYXBba2V5XTsKICB2b2lkIG9wZXJhdG9yIFtdPShLIGtleSwgViB2YWx1ZSkgewogICAgX21hcFtrZXldID0gdmFsdWU7CiAgfQoKICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIF9tYXAuYWRkQWxsKG90aGVyKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfbWFwLmNsZWFyKCk7CiAgfQoKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpID0+IF9tYXAucHV0SWZBYnNlbnQoa2V5LCBpZkFic2VudCk7CiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSA9PiBfbWFwLmNvbnRhaW5zS2V5KGtleSk7CiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgPT4gX21hcC5jb250YWluc1ZhbHVlKHZhbHVlKTsKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oSyBrZXksIFYgdmFsdWUpKSB7CiAgICBfbWFwLmZvckVhY2goYWN0aW9uKTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX21hcC5pc0VtcHR5OwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX21hcC5pc05vdEVtcHR5OwogIGludCBnZXQgbGVuZ3RoID0+IF9tYXAubGVuZ3RoOwogIEl0ZXJhYmxlPEs+IGdldCBrZXlzID0+IF9tYXAua2V5czsKICBWIHJlbW92ZShPYmplY3Qga2V5KSA9PiBfbWFwLnJlbW92ZShrZXkpOwogIFN0cmluZyB0b1N0cmluZygpID0+IF9tYXAudG9TdHJpbmcoKTsKICBJdGVyYWJsZTxWPiBnZXQgdmFsdWVzID0+IF9tYXAudmFsdWVzOwoKICBJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZ2V0IGVudHJpZXMgPT4gX21hcC5lbnRyaWVzOwoKICB2b2lkIGFkZEVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGVudHJpZXMpIHsKICAgIF9tYXAuYWRkRW50cmllcyhlbnRyaWVzKTsKICB9CgogIE1hcDxLMiwgVjI+IG1hcDxLMiwgVjI+KE1hcEVudHJ5PEsyLCBWMj4gdHJhbnNmb3JtKEsga2V5LCBWIHZhbHVlKSkgPT4KICAgICAgX21hcC5tYXA8SzIsIFYyPih0cmFuc2Zvcm0pOwoKICBWIHVwZGF0ZShLIGtleSwgViB1cGRhdGUoViB2YWx1ZSksIHtWIGlmQWJzZW50KCl9KSA9PgogICAgICBfbWFwLnVwZGF0ZShrZXksIHVwZGF0ZSwgaWZBYnNlbnQ6IGlmQWJzZW50KTsKCiAgdm9pZCB1cGRhdGVBbGwoViB1cGRhdGUoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBfbWFwLnVwZGF0ZUFsbCh1cGRhdGUpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBfbWFwLnJlbW92ZVdoZXJlKHRlc3QpOwogIH0KfQoKLy8vIFZpZXcgb2YgYSBbTWFwXSB0aGF0IGRpc2FsbG93IG1vZGlmeWluZyB0aGUgbWFwLgovLy8KLy8vIEEgd3JhcHBlciBhcm91bmQgYSBgTWFwYCB0aGF0IGZvcndhcmRzIGFsbCBtZW1iZXJzIHRvIHRoZSBtYXAgcHJvdmlkZWQgaW4KLy8vIHRoZSBjb25zdHJ1Y3RvciwgZXhjZXB0IGZvciBvcGVyYXRpb25zIHRoYXQgbW9kaWZ5IHRoZSBtYXAuCi8vLyBNb2RpZnlpbmcgb3BlcmF0aW9ucyB0aHJvdyBpbnN0ZWFkLgpjbGFzcyBVbm1vZGlmaWFibGVNYXBWaWV3PEssIFY+IGV4dGVuZHMgTWFwVmlldzxLLCBWPgogICAgd2l0aCBfVW5tb2RpZmlhYmxlTWFwTWl4aW48SywgVj4gewogIFVubW9kaWZpYWJsZU1hcFZpZXcoTWFwPEssIFY+IG1hcCkgOiBzdXBlcihtYXApOwoKICBNYXA8UkssIFJWPiBjYXN0PFJLLCBSVj4oKSA9PgogICAgICBVbm1vZGlmaWFibGVNYXBWaWV3PFJLLCBSVj4oX21hcC5jYXN0PFJLLCBSVj4oKSk7Cn0KgXwATk48ARkBKQRMC0dMRQREUSEERic2JUYiFgYBIQogGRkZFh4KFxkcGQoZEDQmBgEeBAEWAUMGRBYqQhETASQqBgQBOQZEF08qLgEuMgEpOCsvBgEmQQYEAgEgBEwLRkxFBERRIQRGJzUYHSAYPEwQAUIuGh4GBAEhIB4GBAElGisGEgQBJxwYBiMEATchLAYcJQY+BAEtISoGBAEpQAQBSB0hLScGEwQBOSQlBgQBMB4cNwYkGAYEATYhJCo/MgIBMwRLGks0BCpOFgREUSEERic5JgFRBDdQK0cYJAEhJCooKiYBQQIBMQRODDsbGA4BJxQjARQcJhMGFRIEAR0CAUsLQj4mPgQBPiE+BAE+Nj4EAT4RPgQBPhk+BAE+MD4EAT4nPgQBPjc+BAE+LT4EAgFJDQRREQRIKxgtATUqJhcEASEYBAEREgQBSTlBLhoEASQqISUsKCkBOAE2HgQBSSMBODQBLRwEATAcBAIBNQROQCg2JzMBIDgCARlkYXJ0OmNvbGxlY3Rpb24vbWFwcy5kYXJ0L29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb2xsZWN0aW9uL3NldC5kYXJ0wABA5S8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gQmFzZSBpbXBsZW1lbnRhdGlvbnMgb2YgW1NldF0uCnBhcnQgb2YgZGFydC5jb2xsZWN0aW9uOwoKLy8vIE1peGluIGltcGxlbWVudGF0aW9uIG9mIFtTZXRdLgovLy8KLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGEgYFNldGAgdGhhdCBkZXBlbmRzIG9ubHkKLy8vIG9uIHRoZSBhYnN0cmFjdCBtZW1iZXJzOiBbYWRkXSwgW2NvbnRhaW5zXSwgW2xvb2t1cF0sIFtyZW1vdmVdLAovLy8gW2l0ZXJhdG9yXSwgW2xlbmd0aF0gYW5kIFt0b1NldF0uCi8vLwovLy8gU29tZSBvZiB0aGUgbWV0aG9kcyBhc3N1bWUgdGhhdCBgdG9TZXRgIGNyZWF0ZXMgYSBtb2RpZmlhYmxlIHNldC4KLy8vIElmIHVzaW5nIHRoaXMgbWl4aW4gZm9yIGFuIHVubW9kaWZpYWJsZSBzZXQsCi8vLyB3aGVyZSBgdG9TZXRgIHNob3VsZCByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIHNldCwKLy8vIGl0J3MgbmVjZXNzYXJ5IHRvIHJlaW1wbGVtZW50Ci8vLyBbcmV0YWluQWxsXSwgW3VuaW9uXSwgW2ludGVyc2VjdGlvbl0gYW5kIFtkaWZmZXJlbmNlXS4KLy8vCi8vLyBJbXBsZW1lbnRhdGlvbnMgb2YgYFNldGAgdXNpbmcgdGhpcyBtaXhpbiBzaG91bGQgY29uc2lkZXIgYWxzbyBpbXBsZW1lbnRpbmcKLy8vIGBjbGVhcmAgaW4gY29uc3RhbnQgdGltZS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd29ya3MgYnkgcmVtb3ZpbmcgZXZlcnkKLy8vIGVsZW1lbnQuCmFic3RyYWN0IGNsYXNzIFNldE1peGluPEU+IGltcGxlbWVudHMgU2V0PEU+IHsKICAvLyBUaGlzIGNsYXNzIHJlaW1wbGVtZW50cyBhbGwgb2YgW0l0ZXJhYmxlTWl4aW5dLgogIC8vIElmL3doZW4gRGFydCBtaXhpbnMgZ2V0IG1vcmUgcG93ZXJmdWwsIHdlIHNob3VsZCBqdXN0IGNyZWF0ZSBhIHNpbmdsZQogIC8vIE1peGluIGNsYXNzIGZyb20gSXRlcmFibGVNaXhpbiBhbmQgdGhlIG5ldyBtZXRob2RzIG9mIHRoaXMgY2xhc3MuCgogIGJvb2wgYWRkKEUgdmFsdWUpOwoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KTsKCiAgRSBsb29rdXAoT2JqZWN0IGVsZW1lbnQpOwoKICBib29sIHJlbW92ZShPYmplY3QgdmFsdWUpOwoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3I7CgogIFNldDxFPiB0b1NldCgpOwoKICBpbnQgZ2V0IGxlbmd0aDsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBsZW5ndGggPT0gMDsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBsZW5ndGggIT0gMDsKCiAgU2V0PFI+IGNhc3Q8Uj4oKSA9PiBTZXQuY2FzdEZyb208RSwgUj4odGhpcyk7CiAgSXRlcmFibGU8RT4gZm9sbG93ZWRCeShJdGVyYWJsZTxFPiBvdGhlcikgPT4KICAgICAgRm9sbG93ZWRCeUl0ZXJhYmxlPEU+LmZpcnN0RWZmaWNpZW50KHRoaXMsIG90aGVyKTsKCiAgSXRlcmFibGU8VD4gd2hlcmVUeXBlPFQ+KCkgPT4gV2hlcmVUeXBlSXRlcmFibGU8VD4odGhpcyk7CgogIHZvaWQgY2xlYXIoKSB7CiAgICByZW1vdmVBbGwodG9MaXN0KCkpOwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpIHsKICAgIGZvciAoRSBlbGVtZW50IGluIGVsZW1lbnRzKSBhZGQoZWxlbWVudCk7CiAgfQoKICB2b2lkIHJlbW92ZUFsbChJdGVyYWJsZTxPYmplY3Q+IGVsZW1lbnRzKSB7CiAgICBmb3IgKE9iamVjdCBlbGVtZW50IGluIGVsZW1lbnRzKSByZW1vdmUoZWxlbWVudCk7CiAgfQoKICB2b2lkIHJldGFpbkFsbChJdGVyYWJsZTxPYmplY3Q+IGVsZW1lbnRzKSB7CiAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBzZXQsIHJlbW92ZSBhbGwgb2YgZWxlbWVudHMgZnJvbSB0aGUgY29weSwKICAgIC8vIHRoZW4gcmVtb3ZlIGFsbCByZW1haW5pbmcgZWxlbWVudHMgaW4gY29weSBmcm9tIHRoaXMuCiAgICBTZXQ8RT4gdG9SZW1vdmUgPSB0b1NldCgpOwogICAgZm9yIChPYmplY3QgbyBpbiBlbGVtZW50cykgewogICAgICB0b1JlbW92ZS5yZW1vdmUobyk7CiAgICB9CiAgICByZW1vdmVBbGwodG9SZW1vdmUpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgTGlzdCB0b1JlbW92ZSA9IFtdOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgdG9SZW1vdmUuYWRkKGVsZW1lbnQpOwogICAgfQogICAgcmVtb3ZlQWxsKHRvUmVtb3ZlKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIExpc3QgdG9SZW1vdmUgPSBbXTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKCF0ZXN0KGVsZW1lbnQpKSB0b1JlbW92ZS5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZW1vdmVBbGwodG9SZW1vdmUpOwogIH0KCiAgYm9vbCBjb250YWluc0FsbChJdGVyYWJsZTxPYmplY3Q+IG90aGVyKSB7CiAgICBmb3IgKE9iamVjdCBvIGluIG90aGVyKSB7CiAgICAgIGlmICghY29udGFpbnMobykpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgU2V0PEU+IHVuaW9uKFNldDxFPiBvdGhlcikgewogICAgcmV0dXJuIHRvU2V0KCkuLmFkZEFsbChvdGhlcik7CiAgfQoKICBTZXQ8RT4gaW50ZXJzZWN0aW9uKFNldDxPYmplY3Q+IG90aGVyKSB7CiAgICBTZXQ8RT4gcmVzdWx0ID0gdG9TZXQoKTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKCFvdGhlci5jb250YWlucyhlbGVtZW50KSkgcmVzdWx0LnJlbW92ZShlbGVtZW50KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTZXQ8RT4gZGlmZmVyZW5jZShTZXQ8T2JqZWN0PiBvdGhlcikgewogICAgU2V0PEU+IHJlc3VsdCA9IHRvU2V0KCk7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmIChvdGhlci5jb250YWlucyhlbGVtZW50KSkgcmVzdWx0LnJlbW92ZShlbGVtZW50KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaXN0PEU+IHRvTGlzdCh7Ym9vbCBncm93YWJsZSA9IHRydWV9KSB7CiAgICBMaXN0PEU+IHJlc3VsdCA9IGdyb3dhYmxlID8gKDxFPltdLi5sZW5ndGggPSBsZW5ndGgpIDogTGlzdDxFPihsZW5ndGgpOwogICAgaW50IGkgPSAwOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgcmVzdWx0W2krK10gPSBlbGVtZW50OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoRSBlbGVtZW50KSkgPT4KICAgICAgRWZmaWNpZW50TGVuZ3RoTWFwcGVkSXRlcmFibGU8RSwgVD4odGhpcywgZik7CgogIEUgZ2V0IHNpbmdsZSB7CiAgICBpZiAobGVuZ3RoID4gMSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICBFIHJlc3VsdCA9IGl0LmN1cnJlbnQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gSXRlcmFibGVCYXNlLml0ZXJhYmxlVG9GdWxsU3RyaW5nKHRoaXMsICd7JywgJ30nKTsKCiAgLy8gQ29waWVkIGZyb20gSXRlcmFibGVNaXhpbi4KICAvLyBTaG91bGQgYmUgaW5oZXJpdGVkIGlmIHdlIGhhZCBtdWx0aS1sZXZlbCBtaXhpbnMuCgogIEl0ZXJhYmxlPEU+IHdoZXJlKGJvb2wgZihFIGVsZW1lbnQpKSA9PiBXaGVyZUl0ZXJhYmxlPEU+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihFIGVsZW1lbnQpKSA9PgogICAgICBFeHBhbmRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihFIGVsZW1lbnQpKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSBmKGVsZW1lbnQpOwogIH0KCiAgRSByZWR1Y2UoRSBjb21iaW5lKEUgdmFsdWUsIEUgZWxlbWVudCkpIHsKICAgIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcjsKICAgIGlmICghaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIH0KICAgIEUgdmFsdWUgPSBpdGVyYXRvci5jdXJyZW50OwogICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCBpdGVyYXRvci5jdXJyZW50KTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgcHJldmlvdXNWYWx1ZSwgRSBlbGVtZW50KSkgewogICAgdmFyIHZhbHVlID0gaW5pdGlhbFZhbHVlOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCBlbGVtZW50KTsKICAgIHJldHVybiB2YWx1ZTsKICB9CgogIGJvb2wgZXZlcnkoYm9vbCBmKEUgZWxlbWVudCkpIHsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKCFmKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIFN0cmluZyBqb2luKFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSB7CiAgICBJdGVyYXRvcjxFPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHJldHVybiAiIjsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBTdHJpbmdCdWZmZXIoKTsKICAgIGlmIChzZXBhcmF0b3IgPT0gbnVsbCB8fCBzZXBhcmF0b3IgPT0gIiIpIHsKICAgICAgZG8gewogICAgICAgIGJ1ZmZlci53cml0ZShpdGVyYXRvci5jdXJyZW50KTsKICAgICAgfSB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSk7CiAgICB9IGVsc2UgewogICAgICBidWZmZXIud3JpdGUoaXRlcmF0b3IuY3VycmVudCk7CiAgICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgICAgYnVmZmVyLndyaXRlKHNlcGFyYXRvcik7CiAgICAgICAgYnVmZmVyLndyaXRlKGl0ZXJhdG9yLmN1cnJlbnQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICBib29sIGFueShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBJdGVyYWJsZTxFPiB0YWtlKGludCBuKSB7CiAgICByZXR1cm4gVGFrZUl0ZXJhYmxlPEU+KHRoaXMsIG4pOwogIH0KCiAgSXRlcmFibGU8RT4gdGFrZVdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgewogICAgcmV0dXJuIFRha2VXaGlsZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwogIH0KCiAgSXRlcmFibGU8RT4gc2tpcChpbnQgbikgewogICAgcmV0dXJuIFNraXBJdGVyYWJsZTxFPih0aGlzLCBuKTsKICB9CgogIEl0ZXJhYmxlPEU+IHNraXBXaGlsZShib29sIHRlc3QoRSB2YWx1ZSkpIHsKICAgIHJldHVybiBTa2lwV2hpbGVJdGVyYWJsZTxFPih0aGlzLCB0ZXN0KTsKICB9CgogIEUgZ2V0IGZpcnN0IHsKICAgIEl0ZXJhdG9yPEU+IGl0ID0gaXRlcmF0b3I7CiAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICByZXR1cm4gaXQuY3VycmVudDsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIH0KICAgIEUgcmVzdWx0OwogICAgZG8gewogICAgICByZXN1bHQgPSBpdC5jdXJyZW50OwogICAgfSB3aGlsZSAoaXQubW92ZU5leHQoKSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRSBmaXJzdFdoZXJlKGJvb2wgdGVzdChFIHZhbHVlKSwge0Ugb3JFbHNlKCl9KSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDsKICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGxhc3RXaGVyZShib29sIHRlc3QoRSB2YWx1ZSksIHtFIG9yRWxzZSgpfSkgewogICAgRSByZXN1bHQ7CiAgICBib29sIGZvdW5kTWF0Y2hpbmcgPSBmYWxzZTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICByZXN1bHQgPSBlbGVtZW50OwogICAgICAgIGZvdW5kTWF0Y2hpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoZm91bmRNYXRjaGluZykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIHNpbmdsZVdoZXJlKGJvb2wgdGVzdChFIHZhbHVlKSwge0Ugb3JFbHNlKCl9KSB7CiAgICBFIHJlc3VsdDsKICAgIGJvb2wgZm91bmRNYXRjaGluZyA9IGZhbHNlOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIGlmIChmb3VuZE1hdGNoaW5nKSB7CiAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CiAgICAgICAgZm91bmRNYXRjaGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3VuZE1hdGNoaW5nKSByZXR1cm4gcmVzdWx0OwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoaW5kZXgsICJpbmRleCIpOwogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKGluZGV4LCAiaW5kZXgiKTsKICAgIGludCBlbGVtZW50SW5kZXggPSAwOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAoaW5kZXggPT0gZWxlbWVudEluZGV4KSByZXR1cm4gZWxlbWVudDsKICAgICAgZWxlbWVudEluZGV4Kys7CiAgICB9CiAgICB0aHJvdyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiLCBudWxsLCBlbGVtZW50SW5kZXgpOwogIH0KfQoKLy8vIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgW1NldF0uCi8vLwovLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYSBgU2V0YCB0aGF0IGRlcGVuZHMgb25seQovLy8gb24gdGhlIGFic3RyYWN0IG1lbWJlcnM6IFthZGRdLCBbY29udGFpbnNdLCBbbG9va3VwXSwgW3JlbW92ZV0sCi8vLyBbaXRlcmF0b3JdLCBbbGVuZ3RoXSBhbmQgW3RvU2V0XS4KLy8vCi8vLyBTb21lIG9mIHRoZSBtZXRob2RzIGFzc3VtZSB0aGF0IGB0b1NldGAgY3JlYXRlcyBhIG1vZGlmaWFibGUgc2V0LgovLy8gSWYgdXNpbmcgdGhpcyBiYXNlIGNsYXNzIGZvciBhbiB1bm1vZGlmaWFibGUgc2V0LAovLy8gd2hlcmUgYHRvU2V0YCBzaG91bGQgcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBzZXQsCi8vLyBpdCdzIG5lY2Vzc2FyeSB0byByZWltcGxlbWVudAovLy8gW3JldGFpbkFsbF0sIFt1bmlvbl0sIFtpbnRlcnNlY3Rpb25dIGFuZCBbZGlmZmVyZW5jZV0uCi8vLwovLy8gSW1wbGVtZW50YXRpb25zIG9mIGBTZXRgIHVzaW5nIHRoaXMgYmFzZSBzaG91bGQgY29uc2lkZXIgYWxzbyBpbXBsZW1lbnRpbmcKLy8vIGBjbGVhcmAgaW4gY29uc3RhbnQgdGltZS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd29ya3MgYnkgcmVtb3ZpbmcgZXZlcnkKLy8vIGVsZW1lbnQuCmFic3RyYWN0IGNsYXNzIFNldEJhc2U8RT4gZXh0ZW5kcyBPYmplY3Qgd2l0aCBTZXRNaXhpbjxFPiB7CiAgLy8vIENvbnZlcnQgYSBgU2V0YCB0byBhIHN0cmluZyBhcyBge2VhY2gsIGVsZW1lbnQsIGFzLCBzdHJpbmd9YC4KICAvLy8KICAvLy8gSGFuZGxlcyBjaXJjdWxhciByZWZlcmVuY2VzIHdoZXJlIGNvbnZlcnRpbmcgb25lIG9mIHRoZSBlbGVtZW50cwogIC8vLyB0byBhIHN0cmluZyBlbmRzIHVwIGNvbnZlcnRpbmcgW3NldF0gdG8gYSBzdHJpbmcgYWdhaW4uCiAgc3RhdGljIFN0cmluZyBzZXRUb1N0cmluZyhTZXQgc2V0KSA9PgogICAgICBJdGVyYWJsZUJhc2UuaXRlcmFibGVUb0Z1bGxTdHJpbmcoc2V0LCAneycsICd9Jyk7Cn0KCi8vLyBDb21tb24gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2Ygc29tZSBbU2V0XSBtZXRob2RzLgovLyBUT0RPKDM1NTQ4KTogTWFrZSB0aGlzIG1peC1pbiBTZXRNaXhpbiwgYnkgYWRkaW5nIGB3aXRoIFNldE1peGluPEU+YAovLyBhbmQgcmVtb3ZpbmcgdGhlIGNvcGllZCBtZW1iZXJzIGJlbG93LAovLyB3aGVuIGFuYWx5emVyIHN1cHBvcnRzIGNvbnN0IGNvbnN0cnVjdG9ycyBmb3IgbWl4aW4gYXBwbGljYXRpb25zLgphYnN0cmFjdCBjbGFzcyBfU2V0QmFzZTxFPiBpbXBsZW1lbnRzIFNldDxFPiB7CiAgLy8gVGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBvdmVycmlkZSB0aGUgb25lcyBpbiBTZXRCYXNlLgogIC8vIEl0J3MgcG9zc2libGUgdG8gYmUgbW9yZSBlZmZpY2llbnQgaWYgd2UgaGF2ZSBhIHdheSB0byBjcmVhdGUgYW4gZW1wdHkKICAvLyBzZXQgb2YgdGhlIGNvcnJlY3QgdHlwZS4KICBjb25zdCBfU2V0QmFzZSgpOwoKICBTZXQ8RT4gX25ld1NldCgpOwoKICBTZXQ8Uj4gX25ld1NpbWlsYXJTZXQ8Uj4oKTsKCiAgU2V0PFI+IGNhc3Q8Uj4oKSA9PiBTZXQuY2FzdEZyb208RSwgUj4odGhpcywgbmV3U2V0OiBfbmV3U2ltaWxhclNldCk7CgogIFNldDxFPiBkaWZmZXJlbmNlKFNldDxPYmplY3Q+IG90aGVyKSB7CiAgICBTZXQ8RT4gcmVzdWx0ID0gX25ld1NldCgpOwogICAgZm9yICh2YXIgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICghb3RoZXIuY29udGFpbnMoZWxlbWVudCkpIHJlc3VsdC5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU2V0PEU+IGludGVyc2VjdGlvbihTZXQ8T2JqZWN0PiBvdGhlcikgewogICAgU2V0PEU+IHJlc3VsdCA9IF9uZXdTZXQoKTsKICAgIGZvciAodmFyIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAob3RoZXIuY29udGFpbnMoZWxlbWVudCkpIHJlc3VsdC5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gU3ViY2xhc3NlcyBjYW4gb3B0aW1pemUgdGhpcyBmdXJ0aGVyLgogIFNldDxFPiB0b1NldCgpID0+IF9uZXdTZXQoKS4uYWRkQWxsKHRoaXMpOwoKICAvLy8gVE9ETygzNTU0OCk6IFJlbW92ZSB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9ucyBhZ2FpbiB3aGVuIHRoZSBhbmFseXplcgogIC8vLyBzdXBwb3J0cyBtaXhpbnMgd2l0aCBjb25zdCBjb25zdHJ1Y3RvcnMsIGFuZCBtaXggaW4gYFNldE1peGluYCBpbnN0ZWFkLgoKICBib29sIGdldCBpc0VtcHR5ID0+IGxlbmd0aCA9PSAwOwoKICBib29sIGdldCBpc05vdEVtcHR5ID0+IGxlbmd0aCAhPSAwOwoKICBJdGVyYWJsZTxFPiBmb2xsb3dlZEJ5KEl0ZXJhYmxlPEU+IG90aGVyKSA9PgogICAgICBGb2xsb3dlZEJ5SXRlcmFibGU8RT4uZmlyc3RFZmZpY2llbnQodGhpcywgb3RoZXIpOwoKICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBXaGVyZVR5cGVJdGVyYWJsZTxUPih0aGlzKTsKCiAgdm9pZCBjbGVhcigpIHsKICAgIHJlbW92ZUFsbCh0b0xpc3QoKSk7CiAgfQoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBlbGVtZW50cykgewogICAgZm9yIChFIGVsZW1lbnQgaW4gZWxlbWVudHMpIGFkZChlbGVtZW50KTsKICB9CgogIHZvaWQgcmVtb3ZlQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpIHsKICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgaW4gZWxlbWVudHMpIHJlbW92ZShlbGVtZW50KTsKICB9CgogIHZvaWQgcmV0YWluQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpIHsKICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIHNldCwgcmVtb3ZlIGFsbCBvZiBlbGVtZW50cyBmcm9tIHRoZSBjb3B5LAogICAgLy8gdGhlbiByZW1vdmUgYWxsIHJlbWFpbmluZyBlbGVtZW50cyBpbiBjb3B5IGZyb20gdGhpcy4KICAgIFNldDxFPiB0b1JlbW92ZSA9IHRvU2V0KCk7CiAgICBmb3IgKE9iamVjdCBvIGluIGVsZW1lbnRzKSB7CiAgICAgIHRvUmVtb3ZlLnJlbW92ZShvKTsKICAgIH0KICAgIHJlbW92ZUFsbCh0b1JlbW92ZSk7CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBMaXN0IHRvUmVtb3ZlID0gW107CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB0b1JlbW92ZS5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZW1vdmVBbGwodG9SZW1vdmUpOwogIH0KCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgTGlzdCB0b1JlbW92ZSA9IFtdOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAoIXRlc3QoZWxlbWVudCkpIHRvUmVtb3ZlLmFkZChlbGVtZW50KTsKICAgIH0KICAgIHJlbW92ZUFsbCh0b1JlbW92ZSk7CiAgfQoKICBib29sIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPE9iamVjdD4gb3RoZXIpIHsKICAgIGZvciAoT2JqZWN0IG8gaW4gb3RoZXIpIHsKICAgICAgaWYgKCFjb250YWlucyhvKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBTZXQ8RT4gdW5pb24oU2V0PEU+IG90aGVyKSB7CiAgICByZXR1cm4gdG9TZXQoKS4uYWRkQWxsKG90aGVyKTsKICB9CgogIExpc3Q8RT4gdG9MaXN0KHtib29sIGdyb3dhYmxlID0gdHJ1ZX0pIHsKICAgIExpc3Q8RT4gcmVzdWx0ID0gZ3Jvd2FibGUgPyAoPEU+W10uLmxlbmd0aCA9IGxlbmd0aCkgOiBMaXN0PEU+KGxlbmd0aCk7CiAgICBpbnQgaSA9IDA7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSByZXN1bHRbaSsrXSA9IGVsZW1lbnQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihFIGVsZW1lbnQpKSA9PgogICAgICBFZmZpY2llbnRMZW5ndGhNYXBwZWRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgRSBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPiAxKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICBJdGVyYXRvcjxFPiBpdCA9IGl0ZXJhdG9yOwogICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIEUgcmVzdWx0ID0gaXQuY3VycmVudDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBJdGVyYWJsZUJhc2UuaXRlcmFibGVUb0Z1bGxTdHJpbmcodGhpcywgJ3snLCAnfScpOwoKICBJdGVyYWJsZTxFPiB3aGVyZShib29sIGYoRSBlbGVtZW50KSkgPT4gV2hlcmVJdGVyYWJsZTxFPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8VD4gZXhwYW5kPFQ+KEl0ZXJhYmxlPFQ+IGYoRSBlbGVtZW50KSkgPT4KICAgICAgRXhwYW5kSXRlcmFibGU8RSwgVD4odGhpcywgZik7CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoRSBlbGVtZW50KSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgZihlbGVtZW50KTsKICB9CgogIEUgcmVkdWNlKEUgY29tYmluZShFIHZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICBJdGVyYXRvcjxFPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICBFIHZhbHVlID0gaXRlcmF0b3IuY3VycmVudDsKICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgaXRlcmF0b3IuY3VycmVudCk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBUIGZvbGQ8VD4oVCBpbml0aWFsVmFsdWUsIFQgY29tYmluZShUIHByZXZpb3VzVmFsdWUsIEUgZWxlbWVudCkpIHsKICAgIHZhciB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgZWxlbWVudCk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBib29sIGV2ZXJ5KGJvb2wgZihFIGVsZW1lbnQpKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICghZihlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBTdHJpbmcgam9pbihbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgewogICAgSXRlcmF0b3I8RT4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogICAgaWYgKCFpdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm4gIiI7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gU3RyaW5nQnVmZmVyKCk7CiAgICBpZiAoc2VwYXJhdG9yID09IG51bGwgfHwgc2VwYXJhdG9yID09ICIiKSB7CiAgICAgIGRvIHsKICAgICAgICBidWZmZXIud3JpdGUoaXRlcmF0b3IuY3VycmVudCk7CiAgICAgIH0gd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpOwogICAgfSBlbHNlIHsKICAgICAgYnVmZmVyLndyaXRlKGl0ZXJhdG9yLmN1cnJlbnQpOwogICAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgIGJ1ZmZlci53cml0ZShzZXBhcmF0b3IpOwogICAgICAgIGJ1ZmZlci53cml0ZShpdGVyYXRvci5jdXJyZW50KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgYm9vbCBhbnkoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgSXRlcmFibGU8RT4gdGFrZShpbnQgbikgewogICAgcmV0dXJuIFRha2VJdGVyYWJsZTxFPih0aGlzLCBuKTsKICB9CgogIEl0ZXJhYmxlPEU+IHRha2VXaGlsZShib29sIHRlc3QoRSB2YWx1ZSkpIHsKICAgIHJldHVybiBUYWtlV2hpbGVJdGVyYWJsZTxFPih0aGlzLCB0ZXN0KTsKICB9CgogIEl0ZXJhYmxlPEU+IHNraXAoaW50IG4pIHsKICAgIHJldHVybiBTa2lwSXRlcmFibGU8RT4odGhpcywgbik7CiAgfQoKICBJdGVyYWJsZTxFPiBza2lwV2hpbGUoYm9vbCB0ZXN0KEUgdmFsdWUpKSB7CiAgICByZXR1cm4gU2tpcFdoaWxlSXRlcmFibGU8RT4odGhpcywgdGVzdCk7CiAgfQoKICBFIGdldCBmaXJzdCB7CiAgICBJdGVyYXRvcjxFPiBpdCA9IGl0ZXJhdG9yOwogICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgfQogICAgcmV0dXJuIGl0LmN1cnJlbnQ7CiAgfQoKICBFIGdldCBsYXN0IHsKICAgIEl0ZXJhdG9yPEU+IGl0ID0gaXRlcmF0b3I7CiAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICBFIHJlc3VsdDsKICAgIGRvIHsKICAgICAgcmVzdWx0ID0gaXQuY3VycmVudDsKICAgIH0gd2hpbGUgKGl0Lm1vdmVOZXh0KCkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSB2YWx1ZSksIHtFIG9yRWxzZSgpfSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBsYXN0V2hlcmUoYm9vbCB0ZXN0KEUgdmFsdWUpLCB7RSBvckVsc2UoKX0pIHsKICAgIEUgcmVzdWx0OwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmVzdWx0ID0gZWxlbWVudDsKICAgICAgICBmb3VuZE1hdGNoaW5nID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgaWYgKGZvdW5kTWF0Y2hpbmcpIHJldHVybiByZXN1bHQ7CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBzaW5nbGVXaGVyZShib29sIHRlc3QoRSB2YWx1ZSksIHtFIG9yRWxzZSgpfSkgewogICAgRSByZXN1bHQ7CiAgICBib29sIGZvdW5kTWF0Y2hpbmcgPSBmYWxzZTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICBpZiAoZm91bmRNYXRjaGluZykgewogICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSBlbGVtZW50OwogICAgICAgIGZvdW5kTWF0Y2hpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoZm91bmRNYXRjaGluZykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGluZGV4LCAiaW5kZXgiKTsKICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShpbmRleCwgImluZGV4Iik7CiAgICBpbnQgZWxlbWVudEluZGV4ID0gMDsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKGluZGV4ID09IGVsZW1lbnRJbmRleCkgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIGVsZW1lbnRJbmRleCsrOwogICAgfQogICAgdGhyb3cgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4IiwgbnVsbCwgZWxlbWVudEluZGV4KTsKICB9Cn0KCi8vLyBDbGFzcyB1c2VkIHRvIGltcGxlbWVudCBjb25zdCBzZXRzLgpjbGFzcyBfVW5tb2RpZmlhYmxlU2V0PEU+IGV4dGVuZHMgX1NldEJhc2U8RT4gewogIGZpbmFsIE1hcDxFLCBOdWxsPiBfbWFwOwoKICBjb25zdCBfVW5tb2RpZmlhYmxlU2V0KHRoaXMuX21hcCk7CgogIFNldDxFPiBfbmV3U2V0KCkgPT4gTGlua2VkSGFzaFNldDxFPigpOwoKICBTZXQ8Uj4gX25ld1NpbWlsYXJTZXQ8Uj4oKSA9PiBMaW5rZWRIYXNoU2V0PFI+KCk7CgogIC8vIExvb2t1cHMgdXNlIG1hcCBtZXRob2RzLgoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSA9PiBfbWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQpOwoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gX21hcC5rZXlzLml0ZXJhdG9yOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbWFwLmxlbmd0aDsKCiAgRSBsb29rdXAoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGZvciAodmFyIGtleSBpbiBfbWFwLmtleXMpIHsKICAgICAgaWYgKGtleSA9PSBlbGVtZW50KSByZXR1cm4ga2V5OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLyBNdXRhdGluZyBtZXRob2RzIHRocm93LgoKICBib29sIGFkZChFIHZhbHVlKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2hhbmdlIHVubW9kaWZpYWJsZSBzZXQiKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2hhbmdlIHVubW9kaWZpYWJsZSBzZXQiKTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGVsZW1lbnRzKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2hhbmdlIHVubW9kaWZpYWJsZSBzZXQiKTsKICB9CgogIHZvaWQgcmVtb3ZlQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBjaGFuZ2UgdW5tb2RpZmlhYmxlIHNldCIpOwogIH0KCiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGNoYW5nZSB1bm1vZGlmaWFibGUgc2V0Iik7CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2hhbmdlIHVubW9kaWZpYWJsZSBzZXQiKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBjaGFuZ2UgdW5tb2RpZmlhYmxlIHNldCIpOwogIH0KCiAgYm9vbCByZW1vdmUoT2JqZWN0IHZhbHVlKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2hhbmdlIHVubW9kaWZpYWJsZSBzZXQiKTsKICB9Cn0KgngATk48ASMZASMES0QmBEYxNSI7BFBRDS81S0cBFQEhARwBHQEcARIBEgEjASYBMC85ATwBERkEASYuBAEuNgQBLkc9HyEaBhkEASsYHjAGGQQBKxgeMQYZBAEtHiYGEQQBHyMEASsdHjwGEwQBKR0eOwYTBAErTA8zEwQBKDQBETofQBsTBAFKASA3AUUBNSUBJCgEASwqIC4GICIwBhIEAUUePRIEASIeJQYRBAEpKikqMAsoJQ0mJCEoCAYeBAEjHiYGEgQBHCUEAS4tBAEcJQQBLi0EARAfGi4GFwQBDx8aLgYOCRsdEwQBMx4pBiksBAEyDiAeGxoeCAYmKSwEATQOIB4bHTAKGh4IBiYpLAQBGzAxGh4xFgZGBAIBIgRLRCYERjY1IjsET1ENPEQGRz4oOAIBOkgqRS89TB4UARQBHgFIASkfIDkGEwQBKx8gOAYTBAErLQFNTgEjASYBLzkBPAERGQQBJi4EAS42BAEuRz0fIRoGGQQBKxgeMAYZBAErGB4xBhkEAS0eJgYRBAEfIwQBK0wPMxMEASg0ARE6H0AbEwQBSgFFATUlASQoBAEsKiAuBiAiMAYSBAFFHj0SBAEiHiUGEQQBKSopKjALKCUNJiQhKAgGHgQBIx4mBhIEARwlBAEuLQQBHCUEAS4tBAEQHxouBhcEAQ8fGi4GDgkbHRMEATMeKQYpLAQBMg4gHhsaHggGJiksBAE0DiAeGx0wChoeCAYmKSwEARswMRoeMRYGRgQCASgwGwElASoBNAEeAT4BMgEhAR0hJgYRBAEdARY+BAERPgQBJj4EAS4+BAEuPgQBKz4EASs+BAEePgQCARhkYXJ0OmNvbGxlY3Rpb24vc2V0LmRhcnQ0b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbGxlY3Rpb24vaGFzaF9zZXQuZGFydJN7Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb2xsZWN0aW9uOwoKLy8vIEFuIHVub3JkZXJlZCBoYXNoLXRhYmxlIGJhc2VkIFtTZXRdIGltcGxlbWVudGF0aW9uLgovLy8KLy8vIFRoZSBlbGVtZW50cyBvZiBhIGBIYXNoU2V0YCBtdXN0IGhhdmUgY29uc2lzdGVudCBlcXVhbGl0eQovLy8gYW5kIGhhc2hDb2RlIGltcGxlbWVudGF0aW9ucy4gVGhpcyBtZWFucyB0aGF0IHRoZSBlcXVhbHMgb3BlcmF0aW9uCi8vLyBtdXN0IGRlZmluZSBhIHN0YWJsZSBlcXVpdmFsZW5jZSByZWxhdGlvbiBvbiB0aGUgZWxlbWVudHMgKHJlZmxleGl2ZSwKLy8vIHN5bW1ldHJpYywgdHJhbnNpdGl2ZSwgYW5kIGNvbnNpc3RlbnQgb3ZlciB0aW1lKSwgYW5kIHRoYXQgdGhlIGhhc2hDb2RlCi8vLyBtdXN0IGNvbnNpc3RlbnQgd2l0aCBlcXVhbGl0eSwgc28gdGhhdCB0aGUgc2FtZSBmb3Igb2JqZWN0cyB0aGF0IGFyZQovLy8gY29uc2lkZXJlZCBlcXVhbC4KLy8vCi8vLyBUaGUgc2V0IGFsbG93cyBgbnVsbGAgYXMgYW4gZWxlbWVudC4KLy8vCi8vLyBNb3N0IHNpbXBsZSBvcGVyYXRpb25zIG9uIGBIYXNoU2V0YCBhcmUgZG9uZSBpbiAocG90ZW50aWFsbHkgYW1vcnRpemVkKQovLy8gY29uc3RhbnQgdGltZTogW2FkZF0sIFtjb250YWluc10sIFtyZW1vdmVdLCBhbmQgW2xlbmd0aF0sIHByb3ZpZGVkIHRoZSBoYXNoCi8vLyBjb2RlcyBvZiBvYmplY3RzIGFyZSB3ZWxsIGRpc3RyaWJ1dGVkLgovLy8KLy8vIFRoZSBpdGVyYXRpb24gb3JkZXIgb2YgdGhlIHNldCBpcyBub3Qgc3BlY2lmaWVkIGFuZCBkZXBlbmRzIG9uCi8vLyB0aGUgaGFzaGNvZGVzIG9mIHRoZSBwcm92aWRlZCBlbGVtZW50cy4gSG93ZXZlciwgdGhlIG9yZGVyIGlzIHN0YWJsZToKLy8vIG11bHRpcGxlIGl0ZXJhdGlvbnMgb3ZlciB0aGUgc2FtZSBzZXQgcHJvZHVjZSB0aGUgc2FtZSBvcmRlciwgYXMgbG9uZyBhcwovLy8gdGhlIHNldCBpcyBub3QgbW9kaWZpZWQuCmFic3RyYWN0IGNsYXNzIEhhc2hTZXQ8RT4gaW1wbGVtZW50cyBTZXQ8RT4gewogIC8vLyBDcmVhdGUgYSBoYXNoIHNldCB1c2luZyB0aGUgcHJvdmlkZWQgW2VxdWFsc10gYXMgZXF1YWxpdHkuCiAgLy8vCiAgLy8vIFRoZSBwcm92aWRlZCBbZXF1YWxzXSBtdXN0IGRlZmluZSBhIHN0YWJsZSBlcXVpdmFsZW5jZSByZWxhdGlvbiwgYW5kCiAgLy8vIFtoYXNoQ29kZV0gbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggW2VxdWFsc10uIElmIHRoZSBbZXF1YWxzXSBvciBbaGFzaENvZGVdCiAgLy8vIG1ldGhvZHMgd29uJ3Qgd29yayBvbiBhbGwgb2JqZWN0cywgYnV0IG9ubHkgb24gc29tZSBpbnN0YW5jZXMgb2YgRSwgdGhlCiAgLy8vIFtpc1ZhbGlkS2V5XSBwcmVkaWNhdGUgY2FuIGJlIHVzZWQgdG8gcmVzdHJpY3QgdGhlIGtleXMgdGhhdCB0aGUgZnVuY3Rpb25zCiAgLy8vIGFyZSBhcHBsaWVkIHRvLgogIC8vLyBBbnkga2V5IGZvciB3aGljaCBbaXNWYWxpZEtleV0gcmV0dXJucyBmYWxzZSBpcyBhdXRvbWF0aWNhbGx5IGFzc3VtZWQKICAvLy8gdG8gbm90IGJlIGluIHRoZSBzZXQgd2hlbiBhc2tpbmcgYGNvbnRhaW5zYC4KICAvLy8KICAvLy8gSWYgW2VxdWFsc10gb3IgW2hhc2hDb2RlXSBhcmUgb21pdHRlZCwgdGhlIHNldCB1c2VzCiAgLy8vIHRoZSBlbGVtZW50cycgaW50cmluc2ljIFtPYmplY3QuPT1dIGFuZCBbT2JqZWN0Lmhhc2hDb2RlXS4KICAvLy8KICAvLy8gSWYgeW91IHN1cHBseSBvbmUgb2YgW2VxdWFsc10gYW5kIFtoYXNoQ29kZV0sCiAgLy8vIHlvdSBzaG91bGQgZ2VuZXJhbGx5IGFsc28gdG8gc3VwcGx5IHRoZSBvdGhlci4KICAvLy8KICAvLy8gSWYgdGhlIHN1cHBsaWVkIGBlcXVhbHNgIG9yIGBoYXNoQ29kZWAgZnVuY3Rpb25zIHdvbid0IHdvcmsgb24gYWxsIFtFXQogIC8vLyBvYmplY3RzLCBhbmQgdGhlIG1hcCB3aWxsIGJlIHVzZWQgaW4gYSBzZXR0aW5nIHdoZXJlIGEgbm9uLWBFYCBvYmplY3QKICAvLy8gaXMgcGFzc2VkIHRvLCBlLmcuLCBgY29udGFpbnNgLCB0aGVuIHRoZSBbaXNWYWxpZEtleV0gZnVuY3Rpb24gc2hvdWxkCiAgLy8vIGFsc28gYmUgc3VwcGxpZWQuCiAgLy8vCiAgLy8vIElmIFtpc1ZhbGlkS2V5XSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byB0ZXN0aW5nIGlmIHRoZSBvYmplY3QgaXMgYW4KICAvLy8gW0VdIGluc3RhbmNlLiBUaGF0IG1lYW5zIHRoYXQ6CiAgLy8vCiAgLy8vICAgICBuZXcgSGFzaFNldDxpbnQ+KGVxdWFsczogKGludCBlMSwgaW50IGUyKSA9PiAoZTEgLSBlMikgJSA1ID09IDAsCiAgLy8vICAgICAgICAgICAgICAgICAgICAgIGhhc2hDb2RlOiAoaW50IGUpID0+IGUgJSA1KQogIC8vLwogIC8vLyBkb2VzIG5vdCBuZWVkIGFuIGBpc1ZhbGlkS2V5YCBhcmd1bWVudCwgYmVjYXVzZSBpdCBkZWZhdWx0cyB0byBvbmx5CiAgLy8vIGFjY2VwdGluZyBgaW50YCB2YWx1ZXMgd2hpY2ggYXJlIGFjY2VwdGVkIGJ5IGJvdGggYGVxdWFsc2AgYW5kIGBoYXNoQ29kZWAuCiAgLy8vCiAgLy8vIElmIG5laXRoZXIgYGVxdWFsc2AsIGBoYXNoQ29kZWAsIG5vciBgaXNWYWxpZEtleWAgaXMgcHJvdmlkZWQsCiAgLy8vIHRoZSBkZWZhdWx0IGBpc1ZhbGlkS2V5YCBpbnN0ZWFkIGFjY2VwdHMgYWxsIHZhbHVlcy4KICAvLy8gVGhlIGRlZmF1bHQgZXF1YWxpdHkgYW5kIGhhc2hjb2RlIG9wZXJhdGlvbnMgYXJlIGFzc3VtZWQgdG8gd29yayBvbiBhbGwKICAvLy8gb2JqZWN0cy4KICAvLy8KICAvLy8gTGlrZXdpc2UsIGlmIGBlcXVhbHNgIGlzIFtpZGVudGljYWxdLCBgaGFzaENvZGVgIGlzIFtpZGVudGl0eUhhc2hDb2RlXQogIC8vLyBhbmQgYGlzVmFsaWRLZXlgIGlzIG9taXR0ZWQsIHRoZSByZXN1bHRpbmcgc2V0IGlzIGlkZW50aXR5IGJhc2VkLAogIC8vLyBhbmQgdGhlIGBpc1ZhbGlkS2V5YCBkZWZhdWx0cyB0byBhY2NlcHRpbmcgYWxsIGtleXMuCiAgLy8vIFN1Y2ggYSBtYXAgY2FuIGJlIGNyZWF0ZWQgZGlyZWN0bHkgdXNpbmcgW0hhc2hTZXQuaWRlbnRpdHldLgogIGV4dGVybmFsIGZhY3RvcnkgSGFzaFNldCgKICAgICAge2Jvb2wgZXF1YWxzKEUgZTEsIEUgZTIpLAogICAgICBpbnQgaGFzaENvZGUoRSBlKSwKICAgICAgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSl9KTsKCiAgLy8vIENyZWF0ZXMgYW4gdW5vcmRlcmVkIGlkZW50aXR5LWJhc2VkIHNldC4KICAvLy8KICAvLy8gRWZmZWN0aXZlbHkgYSBzaG9ydGhhbmQgZm9yOgogIC8vLwogIC8vLyAgICAgbmV3IEhhc2hTZXQ8RT4oZXF1YWxzOiBpZGVudGljYWwsCiAgLy8vICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogaWRlbnRpdHlIYXNoQ29kZSkKICBleHRlcm5hbCBmYWN0b3J5IEhhc2hTZXQuaWRlbnRpdHkoKTsKCiAgLy8vIENyZWF0ZSBhIGhhc2ggc2V0IGNvbnRhaW5pbmcgYWxsIFtlbGVtZW50c10uCiAgLy8vCiAgLy8vIENyZWF0ZXMgYSBoYXNoIHNldCBhcyBieSBgbmV3IEhhc2hTZXQ8RT4oKWAgYW5kIGFkZHMgYWxsIGdpdmVuIFtlbGVtZW50c10KICAvLy8gdG8gdGhlIHNldC4gVGhlIGVsZW1lbnRzIGFyZSBhZGRlZCBpbiBvcmRlci4gSWYgW2VsZW1lbnRzXSBjb250YWlucwogIC8vLyB0d28gZW50cmllcyB0aGF0IGFyZSBlcXVhbCwgYnV0IG5vdCBpZGVudGljYWwsIHRoZW4gdGhlIGZpcnN0IG9uZSBpcwogIC8vLyB0aGUgb25lIGluIHRoZSByZXN1bHRpbmcgc2V0LgogIC8vLwogIC8vLyBBbGwgdGhlIFtlbGVtZW50c10gc2hvdWxkIGJlIGluc3RhbmNlcyBvZiBbRV0uCiAgLy8vIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBtYXkgaGF2ZSBhbnkgZWxlbWVudCB0eXBlLCBzbyB0aGlzCiAgLy8vIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGRvd24tY2FzdCBhIGBTZXRgLCBmb3IgZXhhbXBsZSBhczoKICAvLy8gYGBgZGFydAogIC8vLyBTZXQ8U3VwZXJUeXBlPiBzdXBlclNldCA9IC4uLjsKICAvLy8gU2V0PFN1YlR5cGU+IHN1YlNldCA9CiAgLy8vICAgICBuZXcgSGFzaFNldDxTdWJUeXBlPi5mcm9tKHN1cGVyU2V0LndoZXJlVHlwZTxTdWJUeXBlPigpKTsKICAvLy8gYGBgCiAgZmFjdG9yeSBIYXNoU2V0LmZyb20oSXRlcmFibGUgZWxlbWVudHMpIHsKICAgIEhhc2hTZXQ8RT4gcmVzdWx0ID0gSGFzaFNldDxFPigpOwogICAgZm9yIChmaW5hbCBlIGluIGVsZW1lbnRzKSB7CiAgICAgIHJlc3VsdC5hZGQoZSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENyZWF0ZSBhIGhhc2ggc2V0IGNvbnRhaW5pbmcgYWxsIFtlbGVtZW50c10uCiAgLy8vCiAgLy8vIENyZWF0ZXMgYSBoYXNoIHNldCBhcyBieSBgbmV3IEhhc2hTZXQ8RT4oKWAgYW5kIGFkZHMgYWxsIGdpdmVuIFtlbGVtZW50c10KICAvLy8gdG8gdGhlIHNldC4gVGhlIGVsZW1lbnRzIGFyZSBhZGRlZCBpbiBvcmRlci4gSWYgW2VsZW1lbnRzXSBjb250YWlucwogIC8vLyB0d28gZW50cmllcyB0aGF0IGFyZSBlcXVhbCwgYnV0IG5vdCBpZGVudGljYWwsIHRoZW4gdGhlIGZpcnN0IG9uZSBpcwogIC8vLyB0aGUgb25lIGluIHRoZSByZXN1bHRpbmcgc2V0LgogIGZhY3RvcnkgSGFzaFNldC5vZihJdGVyYWJsZTxFPiBlbGVtZW50cykgPT4gSGFzaFNldDxFPigpLi5hZGRBbGwoZWxlbWVudHMpOwoKICAvLy8gUHJvdmlkZXMgYW4gaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSBlbGVtZW50cyBvZiB0aGlzIHNldC4KICAvLy8KICAvLy8gVGhlIG9yZGVyIG9mIGl0ZXJhdGlvbiBpcyB1bnNwZWNpZmllZCwKICAvLy8gYnV0IGNvbnNpc3RlbnQgYmV0d2VlbiBjaGFuZ2VzIHRvIHRoZSBzZXQuCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yOwp9CnUATk48ARkBOAQ+R0pMSRYEKQRMUCsEQ0pNHS5BBktRTlEWTDMGOkEGNDUGTUxMGAZNJQZLNwZKUQZFO04PBk1IO0McIBknAS8GIwYsNScBMwZQSkskBjVIRA4lHEQKLCYgFQYTBAEzBlBKSyROAUgGLTEcAgEdZGFydDpjb2xsZWN0aW9uL2hhc2hfc2V0LmRhcnQ0b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbGxlY3Rpb24vaXRlcmFibGUuZGFydK7MLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb2xsZWN0aW9uOwoKLy8vIFRoaXMgW0l0ZXJhYmxlXSBtaXhpbiBpbXBsZW1lbnRzIGFsbCBbSXRlcmFibGVdIG1lbWJlcnMgZXhjZXB0IGBpdGVyYXRvcmAuCi8vLwovLy8gQWxsIG90aGVyIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIGBpdGVyYXRvcmAuCmFic3RyYWN0IGNsYXNzIEl0ZXJhYmxlTWl4aW48RT4gaW1wbGVtZW50cyBJdGVyYWJsZTxFPiB7CiAgLy8gVGhpcyBjbGFzcyBoYXMgbWV0aG9kcyBjb3BpZWQgdmVyYmF0aW0gaW50bzoKICAvLyAtIEl0ZXJhYmxlQmFzZQogIC8vIC0gU2V0TWl4aW4KICAvLyBJZiBjaGFuZ2luZyBhIG1ldGhvZCBoZXJlLCBhbHNvIGNoYW5nZSB0aGUgb3RoZXIgY29waWVzLgoKICBJdGVyYWJsZTxSPiBjYXN0PFI+KCkgPT4gSXRlcmFibGUuY2FzdEZyb208RSwgUj4odGhpcyk7CiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihFIGVsZW1lbnQpKSA9PiBNYXBwZWRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8RT4gd2hlcmUoYm9vbCBmKEUgZWxlbWVudCkpID0+IFdoZXJlSXRlcmFibGU8RT4odGhpcywgZik7CgogIEl0ZXJhYmxlPFQ+IHdoZXJlVHlwZTxUPigpID0+IFdoZXJlVHlwZUl0ZXJhYmxlPFQ+KHRoaXMpOwoKICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihFIGVsZW1lbnQpKSA9PgogICAgICBFeHBhbmRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8RT4gZm9sbG93ZWRCeShJdGVyYWJsZTxFPiBvdGhlcikgewogICAgLy8gVHlwZSB3b3JrYXJvdW5kIGJlY2F1c2UgSXRlcmFibGVNaXhpbjxFPiBkb2Vzbid0IHByb21vdGUKICAgIC8vIHRvIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+LgogICAgSXRlcmFibGU8RT4gc2VsZiA9IHRoaXM7CiAgICBpZiAoc2VsZiBpcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPikgewogICAgICByZXR1cm4gRm9sbG93ZWRCeUl0ZXJhYmxlPEU+LmZpcnN0RWZmaWNpZW50KHNlbGYsIG90aGVyKTsKICAgIH0KICAgIHJldHVybiBGb2xsb3dlZEJ5SXRlcmFibGU8RT4odGhpcywgb3RoZXIpOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgZm9yIChFIGUgaW4gdGhpcykgewogICAgICBpZiAoZSA9PSBlbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoRSBlbGVtZW50KSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgZihlbGVtZW50KTsKICB9CgogIEUgcmVkdWNlKEUgY29tYmluZShFIHZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICBJdGVyYXRvcjxFPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICBFIHZhbHVlID0gaXRlcmF0b3IuY3VycmVudDsKICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgaXRlcmF0b3IuY3VycmVudCk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBUIGZvbGQ8VD4oVCBpbml0aWFsVmFsdWUsIFQgY29tYmluZShUIHByZXZpb3VzVmFsdWUsIEUgZWxlbWVudCkpIHsKICAgIHZhciB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgZWxlbWVudCk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBib29sIGV2ZXJ5KGJvb2wgZihFIGVsZW1lbnQpKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICghZihlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBTdHJpbmcgam9pbihbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgewogICAgSXRlcmF0b3I8RT4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogICAgaWYgKCFpdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm4gIiI7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gU3RyaW5nQnVmZmVyKCk7CiAgICBpZiAoc2VwYXJhdG9yID09IG51bGwgfHwgc2VwYXJhdG9yID09ICIiKSB7CiAgICAgIGRvIHsKICAgICAgICBidWZmZXIud3JpdGUoIiR7aXRlcmF0b3IuY3VycmVudH0iKTsKICAgICAgfSB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSk7CiAgICB9IGVsc2UgewogICAgICBidWZmZXIud3JpdGUoIiR7aXRlcmF0b3IuY3VycmVudH0iKTsKICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICBidWZmZXIud3JpdGUoc2VwYXJhdG9yKTsKICAgICAgICBidWZmZXIud3JpdGUoIiR7aXRlcmF0b3IuY3VycmVudH0iKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgYm9vbCBhbnkoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgTGlzdDxFPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGUgPSB0cnVlfSkgPT4KICAgICAgTGlzdDxFPi5mcm9tKHRoaXMsIGdyb3dhYmxlOiBncm93YWJsZSk7CgogIFNldDxFPiB0b1NldCgpID0+IFNldDxFPi5mcm9tKHRoaXMpOwoKICBpbnQgZ2V0IGxlbmd0aCB7CiAgICBhc3NlcnQodGhpcyBpcyEgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUpOwogICAgaW50IGNvdW50ID0gMDsKICAgIEl0ZXJhdG9yIGl0ID0gaXRlcmF0b3I7CiAgICB3aGlsZSAoaXQubW92ZU5leHQoKSkgewogICAgICBjb3VudCsrOwogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiAhaXRlcmF0b3IubW92ZU5leHQoKTsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKCiAgSXRlcmFibGU8RT4gdGFrZShpbnQgY291bnQpIHsKICAgIHJldHVybiBUYWtlSXRlcmFibGU8RT4odGhpcywgY291bnQpOwogIH0KCiAgSXRlcmFibGU8RT4gdGFrZVdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgewogICAgcmV0dXJuIFRha2VXaGlsZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwogIH0KCiAgSXRlcmFibGU8RT4gc2tpcChpbnQgY291bnQpIHsKICAgIHJldHVybiBTa2lwSXRlcmFibGU8RT4odGhpcywgY291bnQpOwogIH0KCiAgSXRlcmFibGU8RT4gc2tpcFdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgewogICAgcmV0dXJuIFNraXBXaGlsZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwogIH0KCiAgRSBnZXQgZmlyc3QgewogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIH0KICAgIHJldHVybiBpdC5jdXJyZW50OwogIH0KCiAgRSBnZXQgbGFzdCB7CiAgICBJdGVyYXRvcjxFPiBpdCA9IGl0ZXJhdG9yOwogICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgfQogICAgRSByZXN1bHQ7CiAgICBkbyB7CiAgICAgIHJlc3VsdCA9IGl0LmN1cnJlbnQ7CiAgICB9IHdoaWxlIChpdC5tb3ZlTmV4dCgpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBFIGdldCBzaW5nbGUgewogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICBFIHJlc3VsdCA9IGl0LmN1cnJlbnQ7CiAgICBpZiAoaXQubW92ZU5leHQoKSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSB2YWx1ZSksIHtFIG9yRWxzZSgpfSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBsYXN0V2hlcmUoYm9vbCB0ZXN0KEUgdmFsdWUpLCB7RSBvckVsc2UoKX0pIHsKICAgIEUgcmVzdWx0OwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmVzdWx0ID0gZWxlbWVudDsKICAgICAgICBmb3VuZE1hdGNoaW5nID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgaWYgKGZvdW5kTWF0Y2hpbmcpIHJldHVybiByZXN1bHQ7CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBzaW5nbGVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBFIHJlc3VsdDsKICAgIGJvb2wgZm91bmRNYXRjaGluZyA9IGZhbHNlOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIGlmIChmb3VuZE1hdGNoaW5nKSB7CiAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CiAgICAgICAgZm91bmRNYXRjaGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3VuZE1hdGNoaW5nKSByZXR1cm4gcmVzdWx0OwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoaW5kZXgsICJpbmRleCIpOwogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKGluZGV4LCAiaW5kZXgiKTsKICAgIGludCBlbGVtZW50SW5kZXggPSAwOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAoaW5kZXggPT0gZWxlbWVudEluZGV4KSByZXR1cm4gZWxlbWVudDsKICAgICAgZWxlbWVudEluZGV4Kys7CiAgICB9CiAgICB0aHJvdyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiLCBudWxsLCBlbGVtZW50SW5kZXgpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gSXRlcmFibGVCYXNlLml0ZXJhYmxlVG9TaG9ydFN0cmluZyh0aGlzLCAnKCcsICcpJyk7Cn0KCi8vLyBCYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgW0l0ZXJhYmxlXS4KLy8vCi8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgYWxsIG1ldGhvZHMgb2YgW0l0ZXJhYmxlXSwgZXhjZXB0IFtJdGVyYWJsZS5pdGVyYXRvcl0sCi8vLyBpbiB0ZXJtcyBvZiBgaXRlcmF0b3JgLgphYnN0cmFjdCBjbGFzcyBJdGVyYWJsZUJhc2U8RT4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgY29uc3QgSXRlcmFibGVCYXNlKCk7CgogIC8vLyBDb252ZXJ0IGFuIGBJdGVyYWJsZWAgdG8gYSBzdHJpbmcgbGlrZSBbSXRlcmFibGVCYXNlLnRvU3RyaW5nXS4KICAvLy8KICAvLy8gQWxsb3dzIHVzaW5nIG90aGVyIGRlbGltaXRlcnMgdGhhbiAnKCcgYW5kICcpJy4KICAvLy8KICAvLy8gSGFuZGxlcyBjaXJjdWxhciByZWZlcmVuY2VzIHdoZXJlIGNvbnZlcnRpbmcgb25lIG9mIHRoZSBlbGVtZW50cwogIC8vLyB0byBhIHN0cmluZyBlbmRzIHVwIGNvbnZlcnRpbmcgW2l0ZXJhYmxlXSB0byBhIHN0cmluZyBhZ2Fpbi4KICBzdGF0aWMgU3RyaW5nIGl0ZXJhYmxlVG9TaG9ydFN0cmluZyhJdGVyYWJsZSBpdGVyYWJsZSwKICAgICAgW1N0cmluZyBsZWZ0RGVsaW1pdGVyID0gJygnLCBTdHJpbmcgcmlnaHREZWxpbWl0ZXIgPSAnKSddKSB7CiAgICBpZiAoX2lzVG9TdHJpbmdWaXNpdGluZyhpdGVyYWJsZSkpIHsKICAgICAgaWYgKGxlZnREZWxpbWl0ZXIgPT0gIigiICYmIHJpZ2h0RGVsaW1pdGVyID09ICIpIikgewogICAgICAgIC8vIEF2b2lkIGNyZWF0aW5nIGEgbmV3IHN0cmluZyBpbiB0aGUgImNvbW1vbiIgY2FzZS4KICAgICAgICByZXR1cm4gIiguLi4pIjsKICAgICAgfQogICAgICByZXR1cm4gIiRsZWZ0RGVsaW1pdGVyLi4uJHJpZ2h0RGVsaW1pdGVyIjsKICAgIH0KICAgIExpc3Q8U3RyaW5nPiBwYXJ0cyA9IDxTdHJpbmc+W107CiAgICBfdG9TdHJpbmdWaXNpdGluZy5hZGQoaXRlcmFibGUpOwogICAgdHJ5IHsKICAgICAgX2l0ZXJhYmxlUGFydHNUb1N0cmluZ3MoaXRlcmFibGUsIHBhcnRzKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGFzc2VydChpZGVudGljYWwoX3RvU3RyaW5nVmlzaXRpbmcubGFzdCwgaXRlcmFibGUpKTsKICAgICAgX3RvU3RyaW5nVmlzaXRpbmcucmVtb3ZlTGFzdCgpOwogICAgfQogICAgcmV0dXJuIChTdHJpbmdCdWZmZXIobGVmdERlbGltaXRlcikKICAgICAgICAgIC4ud3JpdGVBbGwocGFydHMsICIsICIpCiAgICAgICAgICAuLndyaXRlKHJpZ2h0RGVsaW1pdGVyKSkKICAgICAgICAudG9TdHJpbmcoKTsKICB9CgogIC8vLyBDb252ZXJ0cyBhbiBgSXRlcmFibGVgIHRvIGEgc3RyaW5nLgogIC8vLwogIC8vLyBDb252ZXJ0cyBlYWNoIGVsZW1lbnRzIHRvIGEgc3RyaW5nLCBhbmQgc2VwYXJhdGVzIHRoZSByZXN1bHRzIGJ5ICIsICIuCiAgLy8vIFRoZW4gd3JhcHMgdGhlIHJlc3VsdCBpbiBbbGVmdERlbGltaXRlcl0gYW5kIFtyaWdodERlbGltaXRlcl0uCiAgLy8vCiAgLy8vIFVubGlrZSBbaXRlcmFibGVUb1Nob3J0U3RyaW5nXSwgdGhpcyBjb252ZXJzaW9uIGRvZXNuJ3Qgb21pdCBhbnkKICAvLy8gZWxlbWVudHMgb3IgcHV0cyBhbnkgbGltaXQgb24gdGhlIHNpemUgb2YgdGhlIHJlc3VsdC4KICAvLy8KICAvLy8gSGFuZGxlcyBjaXJjdWxhciByZWZlcmVuY2VzIHdoZXJlIGNvbnZlcnRpbmcgb25lIG9mIHRoZSBlbGVtZW50cwogIC8vLyB0byBhIHN0cmluZyBlbmRzIHVwIGNvbnZlcnRpbmcgW2l0ZXJhYmxlXSB0byBhIHN0cmluZyBhZ2Fpbi4KICBzdGF0aWMgU3RyaW5nIGl0ZXJhYmxlVG9GdWxsU3RyaW5nKEl0ZXJhYmxlIGl0ZXJhYmxlLAogICAgICBbU3RyaW5nIGxlZnREZWxpbWl0ZXIgPSAnKCcsIFN0cmluZyByaWdodERlbGltaXRlciA9ICcpJ10pIHsKICAgIGlmIChfaXNUb1N0cmluZ1Zpc2l0aW5nKGl0ZXJhYmxlKSkgewogICAgICByZXR1cm4gIiRsZWZ0RGVsaW1pdGVyLi4uJHJpZ2h0RGVsaW1pdGVyIjsKICAgIH0KICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBTdHJpbmdCdWZmZXIobGVmdERlbGltaXRlcik7CiAgICBfdG9TdHJpbmdWaXNpdGluZy5hZGQoaXRlcmFibGUpOwogICAgdHJ5IHsKICAgICAgYnVmZmVyLndyaXRlQWxsKGl0ZXJhYmxlLCAiLCAiKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGFzc2VydChpZGVudGljYWwoX3RvU3RyaW5nVmlzaXRpbmcubGFzdCwgaXRlcmFibGUpKTsKICAgICAgX3RvU3RyaW5nVmlzaXRpbmcucmVtb3ZlTGFzdCgpOwogICAgfQogICAgYnVmZmVyLndyaXRlKHJpZ2h0RGVsaW1pdGVyKTsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBBIGNvbGxlY3Rpb24gdXNlZCB0byBpZGVudGlmeSBjeWNsaWMgbGlzdHMgZHVyaW5nIHRvU3RyaW5nKCkgY2FsbHMuCmZpbmFsIExpc3QgX3RvU3RyaW5nVmlzaXRpbmcgPSBbXTsKCi8vLyBDaGVjayBpZiB3ZSBhcmUgY3VycmVudGx5IHZpc2l0aW5nIGBvYCBpbiBhIHRvU3RyaW5nIGNhbGwuCmJvb2wgX2lzVG9TdHJpbmdWaXNpdGluZyhPYmplY3QgbykgewogIGZvciAoaW50IGkgPSAwOyBpIDwgX3RvU3RyaW5nVmlzaXRpbmcubGVuZ3RoOyBpKyspIHsKICAgIGlmIChpZGVudGljYWwobywgX3RvU3RyaW5nVmlzaXRpbmdbaV0pKSByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLy8gQ29udmVydCBlbGVtZW50cyBvZiBbaXRlcmFibGVdIHRvIHN0cmluZ3MgYW5kIHN0b3JlIHRoZW0gaW4gW3BhcnRzXS4Kdm9pZCBfaXRlcmFibGVQYXJ0c1RvU3RyaW5ncyhJdGVyYWJsZSBpdGVyYWJsZSwgTGlzdDxTdHJpbmc+IHBhcnRzKSB7CiAgLyoKICAgKiBUaGlzIGlzIHRoZSBjb21wbGljYXRlZCBwYXJ0IG9mIFtpdGVyYWJsZVRvU2hvcnRTdHJpbmddLgogICAqIEl0IGlzIGV4dHJhY3RlZCBhcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGF2b2lkIGhhdmluZyB0b28gbXVjaCBjb2RlCiAgICogaW5zaWRlIHRoZSB0cnkvZmluYWxseS4KICAgKi8KICAvLy8gVHJ5IHRvIHN0YXkgYmVsb3cgdGhpcyBtYW55IGNoYXJhY3RlcnMuCiAgY29uc3QgaW50IGxlbmd0aExpbWl0ID0gODA7CgogIC8vLyBBbHdheXMgYXQgbGVhc3QgdGhpcyBtYW55IGVsZW1lbnRzIGF0IHRoZSBzdGFydC4KICBjb25zdCBpbnQgaGVhZENvdW50ID0gMzsKCiAgLy8vIEFsd2F5cyBhdCBsZWFzdCB0aGlzIG1hbnkgZWxlbWVudHMgYXQgdGhlIGVuZC4KICBjb25zdCBpbnQgdGFpbENvdW50ID0gMjsKCiAgLy8vIFN0b3AgaXRlcmF0aW5nIGFmdGVyIHRoaXMgbWFueSBlbGVtZW50cy4gSXRlcmFibGVzIGNhbiBiZSBpbmZpbml0ZS4KICBjb25zdCBpbnQgbWF4Q291bnQgPSAxMDA7CiAgLy8gUGVyIGVudHJ5IGxlbmd0aCBvdmVyaGVhZC4gSXQncyBmb3IgIiwgIiBmb3IgYWxsIGFmdGVyIHRoZSBmaXJzdCBlbnRyeSwKICAvLyBhbmQgZm9yICIoIiBhbmQgIikiIGZvciB0aGUgaW5pdGlhbCBlbnRyeS4gQnkgcHVyZSBsdWNrLCB0aGF0J3MgdGhlIHNhbWUKICAvLyBudW1iZXIuCiAgY29uc3QgaW50IG92ZXJoZWFkID0gMjsKICBjb25zdCBpbnQgZWxsaXBzaXNTaXplID0gMzsgLy8gIi4uLiIubGVuZ3RoLgoKICBpbnQgbGVuZ3RoID0gMDsKICBpbnQgY291bnQgPSAwOwogIEl0ZXJhdG9yIGl0ID0gaXRlcmFibGUuaXRlcmF0b3I7CiAgLy8gSW5pdGlhbCBydW4gb2YgZWxlbWVudHMsIGF0IGxlYXN0IGhlYWRDb3VudCwgYW5kIHRoZW4gY29udGludWUgdW50aWwKICAvLyBwYXNzaW5nIGF0IG1vc3QgbGVuZ3RoTGltaXQgY2hhcmFjdGVycy4KICB3aGlsZSAobGVuZ3RoIDwgbGVuZ3RoTGltaXQgfHwgY291bnQgPCBoZWFkQ291bnQpIHsKICAgIGlmICghaXQubW92ZU5leHQoKSkgcmV0dXJuOwogICAgU3RyaW5nIG5leHQgPSAiJHtpdC5jdXJyZW50fSI7CiAgICBwYXJ0cy5hZGQobmV4dCk7CiAgICBsZW5ndGggKz0gbmV4dC5sZW5ndGggKyBvdmVyaGVhZDsKICAgIGNvdW50Kys7CiAgfQoKICBTdHJpbmcgcGVudWx0aW1hdGVTdHJpbmc7CiAgU3RyaW5nIHVsdGltYXRlU3RyaW5nOwoKICAvLyBGaW5kIGxhc3QgdHdvIGVsZW1lbnRzLiBPbmUgb3IgbW9yZSBvZiB0aGVtIG1heSBhbHJlYWR5IGJlIGluIHRoZQogIC8vIHBhcnRzIGFycmF5LiBJbmNsdWRlIHRoZWlyIGxlbmd0aCBpbiBgbGVuZ3RoYC4KICBPYmplY3QgcGVudWx0aW1hdGU7CiAgT2JqZWN0IHVsdGltYXRlOwogIGlmICghaXQubW92ZU5leHQoKSkgewogICAgaWYgKGNvdW50IDw9IGhlYWRDb3VudCArIHRhaWxDb3VudCkgcmV0dXJuOwogICAgdWx0aW1hdGVTdHJpbmcgPSBwYXJ0cy5yZW1vdmVMYXN0KCk7CiAgICBwZW51bHRpbWF0ZVN0cmluZyA9IHBhcnRzLnJlbW92ZUxhc3QoKTsKICB9IGVsc2UgewogICAgcGVudWx0aW1hdGUgPSBpdC5jdXJyZW50OwogICAgY291bnQrKzsKICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICBpZiAoY291bnQgPD0gaGVhZENvdW50ICsgMSkgewogICAgICAgIHBhcnRzLmFkZCgiJHBlbnVsdGltYXRlIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHVsdGltYXRlU3RyaW5nID0gIiRwZW51bHRpbWF0ZSI7CiAgICAgIHBlbnVsdGltYXRlU3RyaW5nID0gcGFydHMucmVtb3ZlTGFzdCgpOwogICAgICBsZW5ndGggKz0gdWx0aW1hdGVTdHJpbmcubGVuZ3RoICsgb3ZlcmhlYWQ7CiAgICB9IGVsc2UgewogICAgICB1bHRpbWF0ZSA9IGl0LmN1cnJlbnQ7CiAgICAgIGNvdW50Kys7CiAgICAgIC8vIFRoZW4ga2VlcCBsb29waW5nLCBrZWVwaW5nIHRoZSBsYXN0IHR3byBlbGVtZW50cyBpbiB2YXJpYWJsZXMuCiAgICAgIGFzc2VydChjb3VudCA8IG1heENvdW50KTsKICAgICAgd2hpbGUgKGl0Lm1vdmVOZXh0KCkpIHsKICAgICAgICBwZW51bHRpbWF0ZSA9IHVsdGltYXRlOwogICAgICAgIHVsdGltYXRlID0gaXQuY3VycmVudDsKICAgICAgICBjb3VudCsrOwogICAgICAgIGlmIChjb3VudCA+IG1heENvdW50KSB7CiAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGZvdW5kIHRoZSBlbmQgYmVmb3JlIG1heENvdW50LCBnaXZlIHVwLgogICAgICAgICAgLy8gVGhpcyBjYW5ub3QgaGFwcGVuIGluIHRoZSBjb2RlIGFib3ZlIGJlY2F1c2UgZWFjaCBlbnRyeQogICAgICAgICAgLy8gaW5jcmVhc2VzIGxlbmd0aCBieSBhdCBsZWFzdCB0d28sIHNvIHRoZXJlIGlzIG5vIHdheSB0bwogICAgICAgICAgLy8gdmlzaXQgbW9yZSB0aGFuIH40MCBlbGVtZW50cyBiZWZvcmUgdGhpcyBsb29wLgoKICAgICAgICAgIC8vIFJlbW92ZSBhbnkgc3VycGx1cyBlbGVtZW50cyB1bnRpbCBsZW5ndGgsIGluY2x1ZGluZyAiLCAuLi4pIiwKICAgICAgICAgIC8vIGlzIGF0IG1vc3QgbGVuZ3RoTGltaXQuCiAgICAgICAgICB3aGlsZSAobGVuZ3RoID4gbGVuZ3RoTGltaXQgLSBlbGxpcHNpc1NpemUgLSBvdmVyaGVhZCAmJgogICAgICAgICAgICAgIGNvdW50ID4gaGVhZENvdW50KSB7CiAgICAgICAgICAgIGxlbmd0aCAtPSBwYXJ0cy5yZW1vdmVMYXN0KCkubGVuZ3RoICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgIGNvdW50LS07CiAgICAgICAgICB9CiAgICAgICAgICBwYXJ0cy5hZGQoIi4uLiIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBwZW51bHRpbWF0ZVN0cmluZyA9ICIkcGVudWx0aW1hdGUiOwogICAgICB1bHRpbWF0ZVN0cmluZyA9ICIkdWx0aW1hdGUiOwogICAgICBsZW5ndGggKz0gdWx0aW1hdGVTdHJpbmcubGVuZ3RoICsgcGVudWx0aW1hdGVTdHJpbmcubGVuZ3RoICsgMiAqIG92ZXJoZWFkOwogICAgfQogIH0KCiAgLy8gSWYgdGhlcmUgaXMgYSBnYXAgYmV0d2VlbiB0aGUgaW5pdGlhbCBydW4gYW5kIHRoZSBsYXN0IHR3bywKICAvLyBwcmVwYXJlIHRvIGFkZCBhbiBlbGxpcHNpcy4KICBTdHJpbmcgZWxpc2lvbjsKICBpZiAoY291bnQgPiBwYXJ0cy5sZW5ndGggKyB0YWlsQ291bnQpIHsKICAgIGVsaXNpb24gPSAiLi4uIjsKICAgIGxlbmd0aCArPSBlbGxpcHNpc1NpemUgKyBvdmVyaGVhZDsKICB9CgogIC8vIElmIHRoZSBsYXN0IHR3byBlbGVtZW50cyB3ZXJlIHZlcnkgbG9uZywgYW5kIHdlIGhhdmUgbW9yZSB0aGFuCiAgLy8gaGVhZENvdW50IGVsZW1lbnRzIGluIHRoZSBpbml0aWFsIHJ1biwgZHJvcCBzb21lIHRvIG1ha2Ugcm9vbSBmb3IKICAvLyB0aGUgbGFzdCB0d28uCiAgd2hpbGUgKGxlbmd0aCA+IGxlbmd0aExpbWl0ICYmIHBhcnRzLmxlbmd0aCA+IGhlYWRDb3VudCkgewogICAgbGVuZ3RoIC09IHBhcnRzLnJlbW92ZUxhc3QoKS5sZW5ndGggKyBvdmVyaGVhZDsKICAgIGlmIChlbGlzaW9uID09IG51bGwpIHsKICAgICAgZWxpc2lvbiA9ICIuLi4iOwogICAgICBsZW5ndGggKz0gZWxsaXBzaXNTaXplICsgb3ZlcmhlYWQ7CiAgICB9CiAgfQogIGlmIChlbGlzaW9uICE9IG51bGwpIHsKICAgIHBhcnRzLmFkZChlbGlzaW9uKTsKICB9CiAgcGFydHMuYWRkKHBlbnVsdGltYXRlU3RyaW5nKTsKICBwYXJ0cy5hZGQodWx0aW1hdGVTdHJpbmcpOwp9CoGUAE5OPAEZAU8EPjkyFBA+ATpHAUUBPAE1JQEuQCYdLkAGLwQBIhglBhIEASQoBAEsKiAuBiAiMAYSBAFFHj0SBAEiHiUGEQQBKSopKjALLSUNKyQhLQgGHgQBIx4mBhIEASwuAScBEy4THBwPBhIEASwBIwEgKQQBLi0EASApBAEuLQQBEB8aLgYXBAEPHxouBg4JGx0TBAERH0AbPRMEATMeKQYpLAQBMg4gHhsaHggGJiksBAE2DiAeGx0wChoeCAYmKSwEARswMRoeMRYGRgQBSwIBLARRHDUYAUYGNgZHQzlDKTs9GAgxBiUlCjAQOyYGKCIjFQQBKgZNRQZHPAZHQzhDKTEGNyUKJxA7JgYiHgQCAUgjAT8lNzkEEAIBSUYFPkodBi4eATcbATUbAUocTU4NGi8BEhEjSi02ICMVJg0EARwZAUc0FhMYMCksCx4NGiQjEAgnLjINHQ9IIB4gHxEgQ0VFPAFLJUMjPBUMHBIKCCokUQYEAUEhEioVJwQBREcTPTQbFykGBBkYBCAdAgEdZGFydDpjb2xsZWN0aW9uL2l0ZXJhYmxlLmRhcnQ0b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbGxlY3Rpb24vaXRlcmF0b3IuZGFydIT6Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb2xsZWN0aW9uOwoKLy8vIFRoZSBbSGFzTmV4dEl0ZXJhdG9yXSBjbGFzcyB3cmFwcyBhbiBbSXRlcmF0b3JdIGFuZCBwcm92aWRlcyBtZXRob2RzIHRvCi8vLyBpdGVyYXRlIG92ZXIgYW4gb2JqZWN0IHVzaW5nIGBoYXNOZXh0YCBhbmQgYG5leHRgLgovLy8KLy8vIEFuIFtIYXNOZXh0SXRlcmF0b3JdIGRvZXMgbm90IGltcGxlbWVudCB0aGUgW0l0ZXJhdG9yXSBpbnRlcmZhY2UuCmNsYXNzIEhhc05leHRJdGVyYXRvcjxFPiB7CiAgc3RhdGljIGNvbnN0IGludCBfSEFTX05FWFRfQU5EX05FWFRfSU5fQ1VSUkVOVCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBfTk9fTkVYVCA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBfTk9UX01PVkVEX1lFVCA9IDI7CgogIEl0ZXJhdG9yPEU+IF9pdGVyYXRvcjsKICBpbnQgX3N0YXRlID0gX05PVF9NT1ZFRF9ZRVQ7CgogIEhhc05leHRJdGVyYXRvcih0aGlzLl9pdGVyYXRvcik7CgogIGJvb2wgZ2V0IGhhc05leHQgewogICAgaWYgKF9zdGF0ZSA9PSBfTk9UX01PVkVEX1lFVCkgX21vdmUoKTsKICAgIHJldHVybiBfc3RhdGUgPT0gX0hBU19ORVhUX0FORF9ORVhUX0lOX0NVUlJFTlQ7CiAgfQoKICBFIG5leHQoKSB7CiAgICAvLyBDYWxsIHRvIGhhc05leHQgaXMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSB3ZSBhcmUgcG9zaXRpb25lZCBhdCB0aGUgZmlyc3QKICAgIC8vIGVsZW1lbnQgd2hlbiB3ZSBzdGFydCBpdGVyYXRpbmcuCiAgICBpZiAoIWhhc05leHQpIHRocm93IFN0YXRlRXJyb3IoIk5vIG1vcmUgZWxlbWVudHMiKTsKICAgIGFzc2VydChfc3RhdGUgPT0gX0hBU19ORVhUX0FORF9ORVhUX0lOX0NVUlJFTlQpOwogICAgRSByZXN1bHQgPSBfaXRlcmF0b3IuY3VycmVudDsKICAgIF9tb3ZlKCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBfbW92ZSgpIHsKICAgIGlmIChfaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICBfc3RhdGUgPSBfSEFTX05FWFRfQU5EX05FWFRfSU5fQ1VSUkVOVDsKICAgIH0gZWxzZSB7CiAgICAgIF9zdGF0ZSA9IF9OT19ORVhUOwogICAgfQogIH0KfQotAE5OPAEZAUw3BEYbNiEnARkfASMBFSs0BAENUCg4NSINEwQBESAuDRkGBAIBHWRhcnQ6Y29sbGVjdGlvbi9pdGVyYXRvci5kYXJ0O29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb2xsZWN0aW9uL2xpbmtlZF9oYXNoX21hcC5kYXJ0l8svLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbGxlY3Rpb247CgovLy8gQSBoYXNoLXRhYmxlIGJhc2VkIGltcGxlbWVudGF0aW9uIG9mIFtNYXBdLgovLy8KLy8vIFRoZSBpbnNlcnRpb24gb3JkZXIgb2Yga2V5cyBpcyByZW1lbWJlcmVkLAovLy8gYW5kIGtleXMgYXJlIGl0ZXJhdGVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgaW5zZXJ0ZWQgaW50byB0aGUgbWFwLgovLy8gVmFsdWVzIGFyZSBpdGVyYXRlZCBpbiB0aGVpciBjb3JyZXNwb25kaW5nIGtleSdzIG9yZGVyLgovLy8gQ2hhbmdpbmcgYSBrZXkncyB2YWx1ZSwgd2hlbiB0aGUga2V5IGlzIGFscmVhZHkgaW4gdGhlIG1hcCwKLy8vIGRvZXMgbm90IGNoYW5nZSB0aGUgaXRlcmF0aW9uIG9yZGVyLAovLy8gYnV0IHJlbW92aW5nIHRoZSBrZXkgYW5kIGFkZGluZyBpdCBhZ2FpbgovLy8gd2lsbCBtYWtlIGl0IGJlIGxhc3QgaW4gdGhlIGl0ZXJhdGlvbiBvcmRlci4KLy8vCi8vLyBUaGUga2V5cyBvZiBhIGBMaW5rZWRIYXNoTWFwYCBtdXN0IGhhdmUgY29uc2lzdGVudCBbT2JqZWN0Lj09XQovLy8gYW5kIFtPYmplY3QuaGFzaENvZGVdIGltcGxlbWVudGF0aW9ucy4gVGhpcyBtZWFucyB0aGF0IHRoZSBgPT1gIG9wZXJhdG9yCi8vLyBtdXN0IGRlZmluZSBhIHN0YWJsZSBlcXVpdmFsZW5jZSByZWxhdGlvbiBvbiB0aGUga2V5cyAocmVmbGV4aXZlLAovLy8gc3ltbWV0cmljLCB0cmFuc2l0aXZlLCBhbmQgY29uc2lzdGVudCBvdmVyIHRpbWUpLCBhbmQgdGhhdCBgaGFzaENvZGVgCi8vLyBtdXN0IGJlIHRoZSBzYW1lIGZvciBvYmplY3RzIHRoYXQgYXJlIGNvbnNpZGVyZWQgZXF1YWwgYnkgYD09YC4KLy8vCi8vLyBUaGUgbWFwIGFsbG93cyBgbnVsbGAgYXMgYSBrZXkuCmFic3RyYWN0IGNsYXNzIExpbmtlZEhhc2hNYXA8SywgVj4gaW1wbGVtZW50cyBNYXA8SywgVj4gewogIC8vLyBDcmVhdGVzIGFuIGluc2VydGlvbi1vcmRlcmVkIGhhc2gtdGFibGUgYmFzZWQgW01hcF0uCiAgLy8vCiAgLy8vIElmIFtlcXVhbHNdIGlzIHByb3ZpZGVkLCBpdCBpcyB1c2VkIHRvIGNvbXBhcmUgdGhlIGtleXMgaW4gdGhlIHRhYmxlIHdpdGgKICAvLy8gbmV3IGtleXMuIElmIFtlcXVhbHNdIGlzIG9taXR0ZWQsIHRoZSBrZXkncyBvd24gW09iamVjdC49PV0gaXMgdXNlZAogIC8vLyBpbnN0ZWFkLgogIC8vLwogIC8vLyBTaW1pbGFyLCBpZiBbaGFzaENvZGVdIGlzIHByb3ZpZGVkLCBpdCBpcyB1c2VkIHRvIHByb2R1Y2UgYSBoYXNoIHZhbHVlCiAgLy8vIGZvciBrZXlzIGluIG9yZGVyIHRvIHBsYWNlIHRoZW0gaW4gdGhlIGhhc2ggdGFibGUuIElmIGl0IGlzIG9taXR0ZWQsIHRoZQogIC8vLyBrZXkncyBvd24gW09iamVjdC5oYXNoQ29kZV0gaXMgdXNlZC4KICAvLy8KICAvLy8gSWYgdXNpbmcgbWV0aG9kcyBsaWtlIFtvcGVyYXRvciBbXV0sIFtyZW1vdmVdIGFuZCBbY29udGFpbnNLZXldIHRvZ2V0aGVyCiAgLy8vIHdpdGggYSBjdXN0b20gZXF1YWxpdHkgYW5kIGhhc2hjb2RlLCBhbiBleHRyYSBgaXNWYWxpZEtleWAgZnVuY3Rpb24KICAvLy8gY2FuIGJlIHN1cHBsaWVkLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBbZXF1YWxzXSBvcgogIC8vLyBbaGFzaENvZGVdIHdpdGggYW4gYXJndW1lbnQgdGhhdCBtYXkgbm90IGJlIGEgW0tdIGluc3RhbmNlLCBhbmQgaWYgdGhlCiAgLy8vIGNhbGwgcmV0dXJucyBmYWxzZSwgdGhlIGtleSBpcyBhc3N1bWVkIHRvIG5vdCBiZSBpbiB0aGUgc2V0LgogIC8vLyBUaGUgW2lzVmFsaWRLZXldIGZ1bmN0aW9uIGRlZmF1bHRzIHRvIGp1c3QgdGVzdGluZyBpZiB0aGUgb2JqZWN0IGlzIGEKICAvLy8gW0tdIGluc3RhbmNlLgogIC8vLwogIC8vLyBFeGFtcGxlOgogIC8vLwogIC8vLyAgICAgbmV3IExpbmtlZEhhc2hNYXA8aW50LGludD4oZXF1YWxzOiAoaW50IGEsIGludCBiKSA9PiAoYiAtIGEpICUgNSA9PSAwLAogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6IChpbnQgZSkgPT4gZSAlIDUpCiAgLy8vCiAgLy8vIFRoaXMgZXhhbXBsZSBtYXAgZG9lcyBub3QgbmVlZCBhbiBgaXNWYWxpZEtleWAgZnVuY3Rpb24gdG8gYmUgcGFzc2VkLgogIC8vLyBUaGUgZGVmYXVsdCBmdW5jdGlvbiBhY2NlcHRzIG9ubHkgYGludGAgdmFsdWVzLCB3aGljaCBjYW4gc2FmZWx5IGJlCiAgLy8vIHBhc3NlZCB0byBib3RoIHRoZSBgZXF1YWxzYCBhbmQgYGhhc2hDb2RlYCBmdW5jdGlvbnMuCiAgLy8vCiAgLy8vIElmIG5laXRoZXIgYGVxdWFsc2AsIGBoYXNoQ29kZWAsIG5vciBgaXNWYWxpZEtleWAgaXMgcHJvdmlkZWQsCiAgLy8vIHRoZSBkZWZhdWx0IGBpc1ZhbGlkS2V5YCBpbnN0ZWFkIGFjY2VwdHMgYWxsIGtleXMuCiAgLy8vIFRoZSBkZWZhdWx0IGVxdWFsaXR5IGFuZCBoYXNoY29kZSBvcGVyYXRpb25zIGFyZSBhc3N1bWVkIHRvIHdvcmsgb24gYWxsCiAgLy8vIG9iamVjdHMuCiAgLy8vCiAgLy8vIExpa2V3aXNlLCBpZiBgZXF1YWxzYCBpcyBbaWRlbnRpY2FsXSwgYGhhc2hDb2RlYCBpcyBbaWRlbnRpdHlIYXNoQ29kZV0KICAvLy8gYW5kIGBpc1ZhbGlkS2V5YCBpcyBvbWl0dGVkLCB0aGUgcmVzdWx0aW5nIG1hcCBpcyBpZGVudGl0eSBiYXNlZCwKICAvLy8gYW5kIHRoZSBgaXNWYWxpZEtleWAgZGVmYXVsdHMgdG8gYWNjZXB0aW5nIGFsbCBrZXlzLgogIC8vLyBTdWNoIGEgbWFwIGNhbiBiZSBjcmVhdGVkIGRpcmVjdGx5IHVzaW5nIFtMaW5rZWRIYXNoTWFwLmlkZW50aXR5XS4KICAvLy8KICAvLy8gVGhlIHVzZWQgYGVxdWFsc2AgYW5kIGBoYXNoQ29kZWAgbWV0aG9kIHNob3VsZCBhbHdheXMgYmUgY29uc2lzdGVudCwKICAvLy8gc28gdGhhdCBpZiBgZXF1YWxzKGEsIGIpYCB0aGVuIGBoYXNoQ29kZShhKSA9PSBoYXNoQ29kZShiKWAuIFRoZSBoYXNoCiAgLy8vIG9mIGFuIG9iamVjdCwgb3Igd2hhdCBpdCBjb21wYXJlcyBlcXVhbCB0bywgc2hvdWxkIG5vdCBjaGFuZ2Ugd2hpbGUgdGhlCiAgLy8vIG9iamVjdCBpcyBpbiB0aGUgdGFibGUuIElmIGl0IGRvZXMgY2hhbmdlLCB0aGUgcmVzdWx0IGlzIHVucHJlZGljdGFibGUuCiAgLy8vCiAgLy8vIElmIHlvdSBzdXBwbHkgb25lIG9mIFtlcXVhbHNdIGFuZCBbaGFzaENvZGVdLAogIC8vLyB5b3Ugc2hvdWxkIGdlbmVyYWxseSBhbHNvIHRvIHN1cHBseSB0aGUgb3RoZXIuCiAgZXh0ZXJuYWwgZmFjdG9yeSBMaW5rZWRIYXNoTWFwKAogICAgICB7Ym9vbCBlcXVhbHMoSyBrZXkxLCBLIGtleTIpLAogICAgICBpbnQgaGFzaENvZGUoSyBrZXkpLAogICAgICBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KX0pOwoKICAvLy8gQ3JlYXRlcyBhbiBpbnNlcnRpb24tb3JkZXJlZCBpZGVudGl0eS1iYXNlZCBtYXAuCiAgLy8vCiAgLy8vIEVmZmVjdGl2ZWx5IGEgc2hvcnRoYW5kIGZvcjoKICAvLy8KICAvLy8gICAgIG5ldyBMaW5rZWRIYXNoTWFwPEssIFY+KGVxdWFsczogaWRlbnRpY2FsLAogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6IGlkZW50aXR5SGFzaENvZGUpCiAgZXh0ZXJuYWwgZmFjdG9yeSBMaW5rZWRIYXNoTWFwLmlkZW50aXR5KCk7CgogIC8vLyBDcmVhdGVzIGEgW0xpbmtlZEhhc2hNYXBdIHRoYXQgY29udGFpbnMgYWxsIGtleSB2YWx1ZSBwYWlycyBvZiBbb3RoZXJdLgogIC8vLwogIC8vLyBUaGUga2V5cyBtdXN0IGFsbCBiZSBpbnN0YW5jZXMgb2YgW0tdIGFuZCB0aGUgdmFsdWVzIHRvIFtWXS4KICAvLy8gVGhlIFtvdGhlcl0gbWFwIGl0c2VsZiBjYW4gaGF2ZSBhbnkgdHlwZS4KICBmYWN0b3J5IExpbmtlZEhhc2hNYXAuZnJvbShNYXAgb3RoZXIpIHsKICAgIExpbmtlZEhhc2hNYXA8SywgVj4gcmVzdWx0ID0gTGlua2VkSGFzaE1hcDxLLCBWPigpOwogICAgb3RoZXIuZm9yRWFjaCgoaywgdikgewogICAgICByZXN1bHRba10gPSB2OwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENyZWF0ZXMgYSBbTGlua2VkSGFzaE1hcF0gdGhhdCBjb250YWlucyBhbGwga2V5IHZhbHVlIHBhaXJzIG9mIFtvdGhlcl0uCiAgZmFjdG9yeSBMaW5rZWRIYXNoTWFwLm9mKE1hcDxLLCBWPiBvdGhlcikgPT4KICAgICAgTGlua2VkSGFzaE1hcDxLLCBWPigpLi5hZGRBbGwob3RoZXIpOwoKICAvLy8gQ3JlYXRlcyBhIFtMaW5rZWRIYXNoTWFwXSB3aGVyZSB0aGUga2V5cyBhbmQgdmFsdWVzIGFyZSBjb21wdXRlZCBmcm9tIHRoZQogIC8vLyBbaXRlcmFibGVdLgogIC8vLwogIC8vLyBGb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBbaXRlcmFibGVdIHRoaXMgY29uc3RydWN0b3IgY29tcHV0ZXMgYSBrZXkvdmFsdWUKICAvLy8gcGFpciwgYnkgYXBwbHlpbmcgW2tleV0gYW5kIFt2YWx1ZV0gcmVzcGVjdGl2ZWx5LgogIC8vLwogIC8vLyBUaGUga2V5cyBvZiB0aGUga2V5L3ZhbHVlIHBhaXJzIGRvIG5vdCBuZWVkIHRvIGJlIHVuaXF1ZS4gVGhlIGxhc3QKICAvLy8gb2NjdXJyZW5jZSBvZiBhIGtleSB3aWxsIHNpbXBseSBvdmVyd3JpdGUgYW55IHByZXZpb3VzIHZhbHVlLgogIC8vLwogIC8vLyBJZiBubyB2YWx1ZXMgYXJlIHNwZWNpZmllZCBmb3IgW2tleV0gYW5kIFt2YWx1ZV0gdGhlIGRlZmF1bHQgaXMgdGhlCiAgLy8vIGlkZW50aXR5IGZ1bmN0aW9uLgogIGZhY3RvcnkgTGlua2VkSGFzaE1hcC5mcm9tSXRlcmFibGUoSXRlcmFibGUgaXRlcmFibGUsCiAgICAgIHtLIGtleShlbGVtZW50KSwgViB2YWx1ZShlbGVtZW50KX0pIHsKICAgIExpbmtlZEhhc2hNYXA8SywgVj4gbWFwID0gTGlua2VkSGFzaE1hcDxLLCBWPigpOwogICAgTWFwQmFzZS5fZmlsbE1hcFdpdGhNYXBwZWRJdGVyYWJsZShtYXAsIGl0ZXJhYmxlLCBrZXksIHZhbHVlKTsKICAgIHJldHVybiBtYXA7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIFtMaW5rZWRIYXNoTWFwXSBhc3NvY2lhdGluZyB0aGUgZ2l2ZW4gW2tleXNdIHRvIFt2YWx1ZXNdLgogIC8vLwogIC8vLyBUaGlzIGNvbnN0cnVjdG9yIGl0ZXJhdGVzIG92ZXIgW2tleXNdIGFuZCBbdmFsdWVzXSBhbmQgbWFwcyBlYWNoIGVsZW1lbnQgb2YKICAvLy8gW2tleXNdIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgW3ZhbHVlc10uCiAgLy8vCiAgLy8vIElmIFtrZXlzXSBjb250YWlucyB0aGUgc2FtZSBvYmplY3QgbXVsdGlwbGUgdGltZXMsIHRoZSBsYXN0IG9jY3VycmVuY2UKICAvLy8gb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgdmFsdWUuCiAgLy8vCiAgLy8vIEl0IGlzIGFuIGVycm9yIGlmIHRoZSB0d28gW0l0ZXJhYmxlXXMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguCiAgZmFjdG9yeSBMaW5rZWRIYXNoTWFwLmZyb21JdGVyYWJsZXMoSXRlcmFibGU8Sz4ga2V5cywgSXRlcmFibGU8Vj4gdmFsdWVzKSB7CiAgICBMaW5rZWRIYXNoTWFwPEssIFY+IG1hcCA9IExpbmtlZEhhc2hNYXA8SywgVj4oKTsKICAgIE1hcEJhc2UuX2ZpbGxNYXBXaXRoSXRlcmFibGVzKG1hcCwga2V5cywgdmFsdWVzKTsKICAgIHJldHVybiBtYXA7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIFtMaW5rZWRIYXNoTWFwXSBjb250YWluaW5nIHRoZSBlbnRyaWVzIG9mIFtlbnRyaWVzXS4KICAvLy8KICAvLy8gUmV0dXJucyBhIG5ldyBgTGlua2VkSGFzaE1hcDxLLCBWPmAgd2hlcmUgYWxsIGVudHJpZXMgb2YgW2VudHJpZXNdCiAgLy8vIGhhdmUgYmVlbiBhZGRlZCBpbiBpdGVyYXRpb24gb3JkZXIuCiAgLy8vCiAgLy8vIElmIG11bHRpcGxlIFtlbnRyaWVzXSBoYXZlIHRoZSBzYW1lIGtleSwKICAvLy8gbGF0ZXIgb2NjdXJyZW5jZXMgb3ZlcndyaXRlIHRoZSBlYXJsaWVyIG9uZXMuCiAgQFNpbmNlKCIyLjEiKQogIGZhY3RvcnkgTGlua2VkSGFzaE1hcC5mcm9tRW50cmllcyhJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZW50cmllcykgPT4KICAgICAgPEssIFY+e30uLmFkZEVudHJpZXMoZW50cmllcyk7Cn0KgI8ATk48ARkBMAQvSDxAKS0xBENNRkpEBCQ6OwZQSg8GTU8rBk9KSk1DTBQGDwZRQQZMSjwGRTlODwZNSDtJBktMTk4GNDUiJBsnATcGIwY1Pi0BTgZDMCo4GxUIEwQBTi8sAVASBk84BklEBkoZOCw1QxAEAUoGUjcGTSUGSE41NhAEAUUGSSoGLzQQSSUCASRkYXJ0OmNvbGxlY3Rpb24vbGlua2VkX2hhc2hfbWFwLmRhcnQ7b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbGxlY3Rpb24vbGlua2VkX2hhc2hfc2V0LmRhcnSU0S8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29sbGVjdGlvbjsKCi8vLyBBIFtMaW5rZWRIYXNoU2V0XSBpcyBhIGhhc2gtdGFibGUgYmFzZWQgW1NldF0gaW1wbGVtZW50YXRpb24uCi8vLwovLy8gVGhlIGBMaW5rZWRIYXNoU2V0YCBhbHNvIGtlZXAgdHJhY2sgb2YgdGhlIG9yZGVyIHRoYXQgZWxlbWVudHMgd2VyZSBpbnNlcnRlZAovLy8gaW4sIGFuZCBpdGVyYXRpb24gaGFwcGVucyBpbiBmaXJzdC10by1sYXN0IGluc2VydGlvbiBvcmRlci4KLy8vCi8vLyBUaGUgZWxlbWVudHMgb2YgYSBgTGlua2VkSGFzaFNldGAgbXVzdCBoYXZlIGNvbnNpc3RlbnQgW09iamVjdC49PV0KLy8vIGFuZCBbT2JqZWN0Lmhhc2hDb2RlXSBpbXBsZW1lbnRhdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYD09YCBvcGVyYXRvcgovLy8gbXVzdCBkZWZpbmUgYSBzdGFibGUgZXF1aXZhbGVuY2UgcmVsYXRpb24gb24gdGhlIGVsZW1lbnRzIChyZWZsZXhpdmUsCi8vLyBzeW1tZXRyaWMsIHRyYW5zaXRpdmUsIGFuZCBjb25zaXN0ZW50IG92ZXIgdGltZSksIGFuZCB0aGF0IGBoYXNoQ29kZWAKLy8vIG11c3QgYmUgdGhlIHNhbWUgZm9yIG9iamVjdHMgdGhhdCBhcmUgY29uc2lkZXJlZCBlcXVhbCBieSBgPT1gLgovLy8KLy8vIFRoZSBzZXQgYWxsb3dzIGBudWxsYCBhcyBhbiBlbGVtZW50LgovLy8KLy8vIEl0ZXJhdGlvbiBvZiBlbGVtZW50cyBpcyBkb25lIGluIGVsZW1lbnQgaW5zZXJ0aW9uIG9yZGVyLgovLy8gQW4gZWxlbWVudCB0aGF0IHdhcyBhZGRlZCBhZnRlciBhbm90aGVyIHdpbGwgb2NjdXIgbGF0ZXIgaW4gdGhlIGl0ZXJhdGlvbi4KLy8vIEFkZGluZyBhbiBlbGVtZW50IHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUgc2V0Ci8vLyBkb2VzIG5vdCBjaGFuZ2UgaXRzIHBvc2l0aW9uIGluIHRoZSBpdGVyYXRpb24gb3JkZXIsCi8vLyBidXQgcmVtb3ZpbmcgYW4gZWxlbWVudCBhbmQgYWRkaW5nIGl0IGFnYWluLAovLy8gd2lsbCBtYWtlIGl0IHRoZSBsYXN0IGVsZW1lbnQgb2YgYW4gaXRlcmF0aW9uLgovLy8KLy8vIE1vc3Qgc2ltcGxlIG9wZXJhdGlvbnMgb24gYEhhc2hTZXRgIGFyZSBkb25lIGluIChwb3RlbnRpYWxseSBhbW9ydGl6ZWQpCi8vLyBjb25zdGFudCB0aW1lOiBbYWRkXSwgW2NvbnRhaW5zXSwgW3JlbW92ZV0sIGFuZCBbbGVuZ3RoXSwgcHJvdmlkZWQgdGhlIGhhc2gKLy8vIGNvZGVzIG9mIG9iamVjdHMgYXJlIHdlbGwgZGlzdHJpYnV0ZWQuLgphYnN0cmFjdCBjbGFzcyBMaW5rZWRIYXNoU2V0PEU+IGltcGxlbWVudHMgU2V0PEU+IHsKICAvLy8gQ3JlYXRlIGFuIGluc2VydGlvbi1vcmRlcmVkIGhhc2ggc2V0IHVzaW5nIHRoZSBwcm92aWRlZAogIC8vLyBbZXF1YWxzXSBhbmQgW2hhc2hDb2RlXS4KICAvLy8KICAvLy8gVGhlIHByb3ZpZGVkIFtlcXVhbHNdIG11c3QgZGVmaW5lIGEgc3RhYmxlIGVxdWl2YWxlbmNlIHJlbGF0aW9uLCBhbmQKICAvLy8gW2hhc2hDb2RlXSBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBbZXF1YWxzXS4gSWYgdGhlIFtlcXVhbHNdIG9yIFtoYXNoQ29kZV0KICAvLy8gbWV0aG9kcyB3b24ndCB3b3JrIG9uIGFsbCBvYmplY3RzLCBidXQgb25seSBvbiBzb21lIGluc3RhbmNlcyBvZiBFLCB0aGUKICAvLy8gW2lzVmFsaWRLZXldIHByZWRpY2F0ZSBjYW4gYmUgdXNlZCB0byByZXN0cmljdCB0aGUga2V5cyB0aGF0IHRoZSBmdW5jdGlvbnMKICAvLy8gYXJlIGFwcGxpZWQgdG8uCiAgLy8vIEFueSBrZXkgZm9yIHdoaWNoIFtpc1ZhbGlkS2V5XSByZXR1cm5zIGZhbHNlIGlzIGF1dG9tYXRpY2FsbHkgYXNzdW1lZAogIC8vLyB0byBub3QgYmUgaW4gdGhlIHNldCB3aGVuIGFza2luZyBgY29udGFpbnNgLgogIC8vLwogIC8vLyBJZiBbZXF1YWxzXSBvciBbaGFzaENvZGVdIGFyZSBvbWl0dGVkLCB0aGUgc2V0IHVzZXMKICAvLy8gdGhlIGVsZW1lbnRzJyBpbnRyaW5zaWMgW09iamVjdC49PV0gYW5kIFtPYmplY3QuaGFzaENvZGVdLAogIC8vLyBhbmQgW2lzVmFsaWRLZXldIGlzIGlnbm9yZWQgc2luY2UgdGhlc2Ugb3BlcmF0aW9ucyBhcmUgYXNzdW1lZAogIC8vLyB0byB3b3JrIG9uIGFsbCBvYmplY3RzLgogIC8vLwogIC8vLyBJZiB5b3Ugc3VwcGx5IG9uZSBvZiBbZXF1YWxzXSBhbmQgW2hhc2hDb2RlXSwKICAvLy8geW91IHNob3VsZCBnZW5lcmFsbHkgYWxzbyB0byBzdXBwbHkgdGhlIG90aGVyLgogIC8vLwogIC8vLyBJZiB0aGUgc3VwcGxpZWQgYGVxdWFsc2Agb3IgYGhhc2hDb2RlYCBmdW5jdGlvbnMgd29uJ3Qgd29yayBvbiBhbGwgW0VdCiAgLy8vIG9iamVjdHMsIGFuZCB0aGUgbWFwIHdpbGwgYmUgdXNlZCBpbiBhIHNldHRpbmcgd2hlcmUgYSBub24tYEVgIG9iamVjdAogIC8vLyBpcyBwYXNzZWQgdG8sIGUuZy4sIGBjb250YWluc2AsIHRoZW4gdGhlIFtpc1ZhbGlkS2V5XSBmdW5jdGlvbiBzaG91bGQKICAvLy8gYWxzbyBiZSBzdXBwbGllZC4KICAvLy8KICAvLy8gSWYgW2lzVmFsaWRLZXldIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRlc3RpbmcgaWYgdGhlIG9iamVjdCBpcyBhbgogIC8vLyBbRV0gaW5zdGFuY2UuIFRoYXQgbWVhbnMgdGhhdDoKICAvLy8KICAvLy8gICAgIG5ldyBMaW5rZWRIYXNoU2V0PGludD4oZXF1YWxzOiAoaW50IGUxLCBpbnQgZTIpID0+IChlMSAtIGUyKSAlIDUgPT0gMCwKICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6IChpbnQgZSkgPT4gZSAlIDUpCiAgLy8vCiAgLy8vIGRvZXMgbm90IG5lZWQgYW4gYGlzVmFsaWRLZXlgIGFyZ3VtZW50LCBiZWNhdXNlIGl0IGRlZmF1bHRzIHRvIG9ubHkKICAvLy8gYWNjZXB0aW5nIGBpbnRgIHZhbHVlcyB3aGljaCBhcmUgYWNjZXB0ZWQgYnkgYm90aCBgZXF1YWxzYCBhbmQgYGhhc2hDb2RlYC4KICAvLy8KICAvLy8gSWYgbmVpdGhlciBgZXF1YWxzYCwgYGhhc2hDb2RlYCwgbm9yIGBpc1ZhbGlkS2V5YCBpcyBwcm92aWRlZCwKICAvLy8gdGhlIGRlZmF1bHQgYGlzVmFsaWRLZXlgIGluc3RlYWQgYWNjZXB0cyBhbGwgdmFsdWVzLgogIC8vLyBUaGUgZGVmYXVsdCBlcXVhbGl0eSBhbmQgaGFzaGNvZGUgb3BlcmF0aW9ucyBhcmUgYXNzdW1lZCB0byB3b3JrIG9uIGFsbAogIC8vLyBvYmplY3RzLgogIC8vLwogIC8vLyBMaWtld2lzZSwgaWYgYGVxdWFsc2AgaXMgW2lkZW50aWNhbF0sIGBoYXNoQ29kZWAgaXMgW2lkZW50aXR5SGFzaENvZGVdCiAgLy8vIGFuZCBgaXNWYWxpZEtleWAgaXMgb21pdHRlZCwgdGhlIHJlc3VsdGluZyBzZXQgaXMgaWRlbnRpdHkgYmFzZWQsCiAgLy8vIGFuZCB0aGUgYGlzVmFsaWRLZXlgIGRlZmF1bHRzIHRvIGFjY2VwdGluZyBhbGwga2V5cy4KICAvLy8gU3VjaCBhIG1hcCBjYW4gYmUgY3JlYXRlZCBkaXJlY3RseSB1c2luZyBbTGlua2VkSGFzaFNldC5pZGVudGl0eV0uCiAgZXh0ZXJuYWwgZmFjdG9yeSBMaW5rZWRIYXNoU2V0KAogICAgICB7Ym9vbCBlcXVhbHMoRSBlMSwgRSBlMiksCiAgICAgIGludCBoYXNoQ29kZShFIGUpLAogICAgICBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KX0pOwoKICAvLy8gQ3JlYXRlcyBhbiBpbnNlcnRpb24tb3JkZXJlZCBpZGVudGl0eS1iYXNlZCBzZXQuCiAgLy8vCiAgLy8vIEVmZmVjdGl2ZWx5IGEgc2hvcnRoYW5kIGZvcjoKICAvLy8KICAvLy8gICAgIG5ldyBMaW5rZWRIYXNoU2V0PEU+KGVxdWFsczogaWRlbnRpY2FsLAogIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6IGlkZW50aXR5SGFzaENvZGUpCiAgZXh0ZXJuYWwgZmFjdG9yeSBMaW5rZWRIYXNoU2V0LmlkZW50aXR5KCk7CgogIC8vLyBDcmVhdGUgYSBsaW5rZWQgaGFzaCBzZXQgY29udGFpbmluZyBhbGwgW2VsZW1lbnRzXS4KICAvLy8KICAvLy8gQ3JlYXRlcyBhIGxpbmtlZCBoYXNoIHNldCBhcyBieSBgbmV3IExpbmtlZEhhc2hTZXQ8RT4oKWAgYW5kIGFkZHMgZWFjaAogIC8vLyBlbGVtZW50IG9mIGBlbGVtZW50c2AgdG8gdGhpcyBzZXQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGl0ZXJhdGVkLgogIC8vLwogIC8vLyBBbGwgdGhlIFtlbGVtZW50c10gc2hvdWxkIGJlIGluc3RhbmNlcyBvZiBbRV0uCiAgLy8vIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBtYXkgaGF2ZSBhbnkgZWxlbWVudCB0eXBlLAogIC8vLyBzbyB0aGlzIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGRvd24tY2FzdCBhIGBTZXRgLCBmb3IgZXhhbXBsZSBhczoKICAvLy8KICAvLy8gICAgIFNldDxTdXBlclR5cGU+IHN1cGVyU2V0ID0gLi4uOwogIC8vLyAgICAgSXRlcmFibGU8U3VwZXJUeXBlPiB0bXAgPSBzdXBlclNldC53aGVyZSgoZSkgPT4gZSBpcyBTdWJUeXBlKTsKICAvLy8gICAgIFNldDxTdWJUeXBlPiBzdWJTZXQgPSBuZXcgTGlua2VkSGFzaFNldDxTdWJUeXBlPi5mcm9tKHRtcCk7CiAgZmFjdG9yeSBMaW5rZWRIYXNoU2V0LmZyb20oSXRlcmFibGUgZWxlbWVudHMpIHsKICAgIExpbmtlZEhhc2hTZXQ8RT4gcmVzdWx0ID0gTGlua2VkSGFzaFNldDxFPigpOwogICAgZm9yIChmaW5hbCBlbGVtZW50IGluIGVsZW1lbnRzKSB7CiAgICAgIHJlc3VsdC5hZGQoZWxlbWVudCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENyZWF0ZSBhIGxpbmtlZCBoYXNoIHNldCBmcm9tIFtlbGVtZW50c10uCiAgLy8vCiAgLy8vIENyZWF0ZXMgYSBsaW5rZWQgaGFzaCBzZXQgYXMgYnkgYG5ldyBMaW5rZWRIYXNoU2V0PEU+KClgIGFuZCBhZGRzIGVhY2gKICAvLy8gZWxlbWVudCBvZiBgZWxlbWVudHNgIHRvIHRoaXMgc2V0IGluIHRoZSBvcmRlciB0aGV5IGFyZSBpdGVyYXRlZC4KICBmYWN0b3J5IExpbmtlZEhhc2hTZXQub2YoSXRlcmFibGU8RT4gZWxlbWVudHMpID0+CiAgICAgIExpbmtlZEhhc2hTZXQ8RT4oKS4uYWRkQWxsKGVsZW1lbnRzKTsKCiAgLy8vIEV4ZWN1dGVzIGEgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50IG9mIHRoZSBzZXQuCiAgLy8vCiAgLy8vIFRoZSBlbGVtZW50cyBhcmUgaXRlcmF0ZWQgaW4gaW5zZXJ0aW9uIG9yZGVyLgogIHZvaWQgZm9yRWFjaCh2b2lkIGFjdGlvbihFIGVsZW1lbnQpKTsKCiAgLy8vIFByb3ZpZGVzIGFuIGl0ZXJhdG9yIHRoYXQgaXRlcmF0ZXMgb3ZlciB0aGUgZWxlbWVudHMgaW4gaW5zZXJ0aW9uIG9yZGVyLgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvcjsKfQp6AE5OPAEZAUIEUUAER01KSkQEKQQ+TzE5MTMETFAsND4fBktRTlEWTDMGOkFFHgY0NQZNTEwYBk0lBlE9BkpRBkU7Tg8GTUg7SSIgGScBNwYjBjI7LQE6Bk1IBjVATAYpSUYyMiYbBhMEATAGTUg0LAE2BjQoAU8cAgEkZGFydDpjb2xsZWN0aW9uL2xpbmtlZF9oYXNoX3NldC5kYXJ0N29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb2xsZWN0aW9uL2xpbmtlZF9saXN0LmRhcnSevS8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29sbGVjdGlvbjsKCi8vLyBBIHNwZWNpYWxpemVkIGRvdWJsZS1saW5rZWQgbGlzdCBvZiBlbGVtZW50cyB0aGF0IGV4dGVuZHMgW0xpbmtlZExpc3RFbnRyeV0uCi8vLwovLy8gVGhpcyBpcyBub3QgYSBnZW5lcmljIGRhdGEgc3RydWN0dXJlLiBJdCBvbmx5IGFjY2VwdHMgZWxlbWVudHMgdGhhdCBleHRlbmQKLy8vIHRoZSBbTGlua2VkTGlzdEVudHJ5XSBjbGFzcy4gU2VlIHRoZSBbUXVldWVdIGltcGxlbWVudGF0aW9ucyBmb3IgZ2VuZXJpYwovLy8gY29sbGVjdGlvbnMgdGhhdCBhbGxvdyBjb25zdGFudCB0aW1lIGFkZGluZyBhbmQgcmVtb3ZpbmcgYXQgdGhlIGVuZHMuCi8vLwovLy8gVGhpcyBpcyBub3QgYSBbTGlzdF0gaW1wbGVtZW50YXRpb24uIERlc3BpdGUgaXRzIG5hbWUsIHRoaXMgY2xhc3MgZG9lcyBub3QKLy8vIGltcGxlbWVudCB0aGUgW0xpc3RdIGludGVyZmFjZS4gSXQgZG9lcyBub3QgYWxsb3cgY29uc3RhbnQgdGltZSBsb29rdXAgYnkKLy8vIGluZGV4LgovLy8KLy8vIEJlY2F1c2UgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgY29udGFpbiB0aGUgbGlua3Mgb2YgdGhpcyBsaW5rZWQgbGlzdCwKLy8vIGVhY2ggZWxlbWVudCBjYW4gYmUgaW4gb25seSBvbmUgbGlzdCBhdCBhIHRpbWUuIFRvIGFkZCBhbiBlbGVtZW50IHRvIGFub3RoZXIKLy8vIGxpc3QsIGl0IG11c3QgZmlyc3QgYmUgcmVtb3ZlZCBmcm9tIGl0cyBjdXJyZW50IGxpc3QgKGlmIGFueSkuCi8vLwovLy8gSW4gcmV0dXJuLCBlYWNoIGVsZW1lbnQga25vd3MgaXRzIG93biBwbGFjZSBpbiB0aGUgbGlua2VkIGxpc3QsIGFzIHdlbGwgYXMKLy8vIHdoaWNoIGxpc3QgaXQgaXMgaW4uIFRoaXMgYWxsb3dzIGNvbnN0YW50IHRpbWUKLy8vIFtMaW5rZWRMaXN0RW50cnkuaW5zZXJ0QWZ0ZXJdLCBbTGlua2VkTGlzdEVudHJ5Lmluc2VydEJlZm9yZV0gYW5kCi8vLyBbTGlua2VkTGlzdEVudHJ5LnVubGlua10gb3BlcmF0aW9ucyB3aGVuIGFsbCB5b3UgaGF2ZSBpcyB0aGUgZWxlbWVudC4KLy8vCi8vLyBBIGBMaW5rZWRMaXN0YCBhbHNvIGFsbG93cyBjb25zdGFudCB0aW1lIGFkZGluZyBhbmQgcmVtb3ZpbmcgYXQgZWl0aGVyIGVuZCwKLy8vIGFuZCBhIGNvbnN0YW50IHRpbWUgbGVuZ3RoIGdldHRlci4KY2xhc3MgTGlua2VkTGlzdDxFIGV4dGVuZHMgTGlua2VkTGlzdEVudHJ5PEU+PiBleHRlbmRzIEl0ZXJhYmxlPEU+IHsKICBpbnQgX21vZGlmaWNhdGlvbkNvdW50ID0gMDsKICBpbnQgX2xlbmd0aCA9IDA7CiAgRSBfZmlyc3Q7CgogIC8vLyBDb25zdHJ1Y3QgYSBuZXcgZW1wdHkgbGlua2VkIGxpc3QuCiAgTGlua2VkTGlzdCgpOwoKICAvLy8gQWRkIFtlbnRyeV0gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlua2VkIGxpc3QuCiAgdm9pZCBhZGRGaXJzdChFIGVudHJ5KSB7CiAgICBfaW5zZXJ0QmVmb3JlKF9maXJzdCwgZW50cnksIHVwZGF0ZUZpcnN0OiB0cnVlKTsKICAgIF9maXJzdCA9IGVudHJ5OwogIH0KCiAgLy8vIEFkZCBbZW50cnldIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmtlZCBsaXN0LgogIHZvaWQgYWRkKEUgZW50cnkpIHsKICAgIF9pbnNlcnRCZWZvcmUoX2ZpcnN0LCBlbnRyeSwgdXBkYXRlRmlyc3Q6IGZhbHNlKTsKICB9CgogIC8vLyBBZGQgW2VudHJpZXNdIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmtlZCBsaXN0LgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGVudHJpZXMpIHsKICAgIGVudHJpZXMuZm9yRWFjaChhZGQpOwogIH0KCiAgLy8vIFJlbW92ZSBbZW50cnldIGZyb20gdGhlIGxpbmtlZCBsaXN0LgogIC8vLwogIC8vLyBSZXR1cm5zIGZhbHNlIGFuZCBkb2VzIG5vdGhpbmcgaWYgW2VudHJ5XSBpcyBub3QgaW4gdGhpcyBsaW5rZWQgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgYGVudHJ5LnVubGluaygpYCBpZiB0aGUgZW50cnkgaXMgaW4gdGhpcwogIC8vLyBsaXN0LgogIGJvb2wgcmVtb3ZlKEUgZW50cnkpIHsKICAgIGlmIChlbnRyeS5fbGlzdCAhPSB0aGlzKSByZXR1cm4gZmFsc2U7CiAgICBfdW5saW5rKGVudHJ5KTsgLy8gVW5saW5rIHdpbGwgZGVjcmVtZW50IGxlbmd0aC4KICAgIHJldHVybiB0cnVlOwogIH0KCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+IF9MaW5rZWRMaXN0SXRlcmF0b3I8RT4odGhpcyk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9sZW5ndGg7CgogIC8vLyBSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBsaW5rZWQgbGlzdC4KICB2b2lkIGNsZWFyKCkgewogICAgX21vZGlmaWNhdGlvbkNvdW50Kys7CiAgICBpZiAoaXNFbXB0eSkgcmV0dXJuOwoKICAgIEUgbmV4dCA9IF9maXJzdDsKICAgIGRvIHsKICAgICAgRSBlbnRyeSA9IG5leHQ7CiAgICAgIG5leHQgPSBlbnRyeS5fbmV4dDsKICAgICAgZW50cnkuX25leHQgPSBlbnRyeS5fcHJldmlvdXMgPSBlbnRyeS5fbGlzdCA9IG51bGw7CiAgICB9IHdoaWxlICghaWRlbnRpY2FsKG5leHQsIF9maXJzdCkpOwoKICAgIF9maXJzdCA9IG51bGw7CiAgICBfbGVuZ3RoID0gMDsKICB9CgogIEUgZ2V0IGZpcnN0IHsKICAgIGlmIChpc0VtcHR5KSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoJ05vIHN1Y2ggZWxlbWVudCcpOwogICAgfQogICAgcmV0dXJuIF9maXJzdDsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgaWYgKGlzRW1wdHkpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcignTm8gc3VjaCBlbGVtZW50Jyk7CiAgICB9CiAgICByZXR1cm4gX2ZpcnN0Ll9wcmV2aW91czsKICB9CgogIEUgZ2V0IHNpbmdsZSB7CiAgICBpZiAoaXNFbXB0eSkgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCdObyBzdWNoIGVsZW1lbnQnKTsKICAgIH0KICAgIGlmIChfbGVuZ3RoID4gMSkgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCdUb28gbWFueSBlbGVtZW50cycpOwogICAgfQogICAgcmV0dXJuIF9maXJzdDsKICB9CgogIC8vLyBDYWxsIFthY3Rpb25dIHdpdGggZWFjaCBlbnRyeSBpbiB0aGlzIGxpbmtlZCBsaXN0LgogIC8vLwogIC8vLyBJdCdzIGFuIGVycm9yIGlmIFthY3Rpb25dIG1vZGlmeSB0aGUgbGlua2VkIGxpc3QuCiAgdm9pZCBmb3JFYWNoKHZvaWQgYWN0aW9uKEUgZW50cnkpKSB7CiAgICBpbnQgbW9kaWZpY2F0aW9uQ291bnQgPSBfbW9kaWZpY2F0aW9uQ291bnQ7CiAgICBpZiAoaXNFbXB0eSkgcmV0dXJuOwoKICAgIEUgY3VycmVudCA9IF9maXJzdDsKICAgIGRvIHsKICAgICAgYWN0aW9uKGN1cnJlbnQpOwogICAgICBpZiAobW9kaWZpY2F0aW9uQ291bnQgIT0gX21vZGlmaWNhdGlvbkNvdW50KSB7CiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Ll9uZXh0OwogICAgfSB3aGlsZSAoIWlkZW50aWNhbChjdXJyZW50LCBfZmlyc3QpKTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2xlbmd0aCA9PSAwOwoKICAvLy8gSW5zZXJ0cyBbbmV3RW50cnldIGFzIGxhc3QgZW50cnkgb2YgdGhlIGxpc3QuCiAgLy8vCiAgLy8vIElmIFt1cGRhdGVGaXJzdF0gaXMgdHJ1ZSBhbmQgW2VudHJ5XSBpcyB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGxpc3QsCiAgLy8vIHVwZGF0ZXMgdGhlIFtfZmlyc3RdIGZpZWxkIHRvIHBvaW50IHRvIHRoZSBbbmV3RW50cnldIGFzIGZpcnN0IGVudHJ5LgogIHZvaWQgX2luc2VydEJlZm9yZShFIGVudHJ5LCBFIG5ld0VudHJ5LCB7Ym9vbCB1cGRhdGVGaXJzdH0pIHsKICAgIGlmIChuZXdFbnRyeS5saXN0ICE9IG51bGwpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcignTGlua2VkTGlzdEVudHJ5IGlzIGFscmVhZHkgaW4gYSBMaW5rZWRMaXN0Jyk7CiAgICB9CiAgICBfbW9kaWZpY2F0aW9uQ291bnQrKzsKCiAgICBuZXdFbnRyeS5fbGlzdCA9IHRoaXM7CiAgICBpZiAoaXNFbXB0eSkgewogICAgICBhc3NlcnQoZW50cnkgPT0gbnVsbCk7CiAgICAgIG5ld0VudHJ5Ll9wcmV2aW91cyA9IG5ld0VudHJ5Ll9uZXh0ID0gbmV3RW50cnk7CiAgICAgIF9maXJzdCA9IG5ld0VudHJ5OwogICAgICBfbGVuZ3RoKys7CiAgICAgIHJldHVybjsKICAgIH0KICAgIEUgcHJlZGVjZXNzb3IgPSBlbnRyeS5fcHJldmlvdXM7CiAgICBFIHN1Y2Nlc3NvciA9IGVudHJ5OwogICAgbmV3RW50cnkuX3ByZXZpb3VzID0gcHJlZGVjZXNzb3I7CiAgICBuZXdFbnRyeS5fbmV4dCA9IHN1Y2Nlc3NvcjsKICAgIHByZWRlY2Vzc29yLl9uZXh0ID0gbmV3RW50cnk7CiAgICBzdWNjZXNzb3IuX3ByZXZpb3VzID0gbmV3RW50cnk7CiAgICBpZiAodXBkYXRlRmlyc3QgJiYgaWRlbnRpY2FsKGVudHJ5LCBfZmlyc3QpKSB7CiAgICAgIF9maXJzdCA9IG5ld0VudHJ5OwogICAgfQogICAgX2xlbmd0aCsrOwogIH0KCiAgdm9pZCBfdW5saW5rKEUgZW50cnkpIHsKICAgIF9tb2RpZmljYXRpb25Db3VudCsrOwogICAgZW50cnkuX25leHQuX3ByZXZpb3VzID0gZW50cnkuX3ByZXZpb3VzOwogICAgRSBuZXh0ID0gZW50cnkuX3ByZXZpb3VzLl9uZXh0ID0gZW50cnkuX25leHQ7CiAgICBfbGVuZ3RoLS07CiAgICBlbnRyeS5fbGlzdCA9IGVudHJ5Ll9uZXh0ID0gZW50cnkuX3ByZXZpb3VzID0gbnVsbDsKICAgIGlmIChpc0VtcHR5KSB7CiAgICAgIF9maXJzdCA9IG51bGw7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChlbnRyeSwgX2ZpcnN0KSkgewogICAgICBfZmlyc3QgPSBuZXh0OwogICAgfQogIH0KfQoKY2xhc3MgX0xpbmtlZExpc3RJdGVyYXRvcjxFIGV4dGVuZHMgTGlua2VkTGlzdEVudHJ5PEU+PiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBMaW5rZWRMaXN0PEU+IF9saXN0OwogIGZpbmFsIGludCBfbW9kaWZpY2F0aW9uQ291bnQ7CiAgRSBfY3VycmVudDsKICBMaW5rZWRMaXN0RW50cnk8RT4gX25leHQ7CiAgYm9vbCBfdmlzaXRlZEZpcnN0OwoKICBfTGlua2VkTGlzdEl0ZXJhdG9yKExpbmtlZExpc3Q8RT4gbGlzdCkKICAgICAgOiBfbGlzdCA9IGxpc3QsCiAgICAgICAgX21vZGlmaWNhdGlvbkNvdW50ID0gbGlzdC5fbW9kaWZpY2F0aW9uQ291bnQsCiAgICAgICAgX25leHQgPSBsaXN0Ll9maXJzdCwKICAgICAgICBfdmlzaXRlZEZpcnN0ID0gZmFsc2U7CgogIEUgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX21vZGlmaWNhdGlvbkNvdW50ICE9IF9saXN0Ll9tb2RpZmljYXRpb25Db3VudCkgewogICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICB9CiAgICBpZiAoX2xpc3QuaXNFbXB0eSB8fCAoX3Zpc2l0ZWRGaXJzdCAmJiBpZGVudGljYWwoX25leHQsIF9saXN0LmZpcnN0KSkpIHsKICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfdmlzaXRlZEZpcnN0ID0gdHJ1ZTsKICAgIF9jdXJyZW50ID0gX25leHQ7CiAgICBfbmV4dCA9IF9uZXh0Ll9uZXh0OwogICAgcmV0dXJuIHRydWU7CiAgfQp9CgovLy8gQW4gb2JqZWN0IHRoYXQgY2FuIGJlIGFuIGVsZW1lbnQgaW4gYSBbTGlua2VkTGlzdF0uCi8vLwovLy8gQWxsIGVsZW1lbnRzIG9mIGEgYExpbmtlZExpc3RgIG11c3QgZXh0ZW5kIHRoaXMgY2xhc3MuCi8vLyBUaGUgY2xhc3MgcHJvdmlkZXMgdGhlIGludGVybmFsIGxpbmtzIHRoYXQgbGluayBlbGVtZW50cyB0b2dldGhlcgovLy8gaW4gdGhlIGBMaW5rZWRMaXN0YCwgYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBsaW5rZWQgbGlzdCBpdHNlbGYKLy8vIHRoYXQgYW4gZWxlbWVudCBpcyBjdXJyZW50bHkgcGFydCBvZi4KLy8vCi8vLyBBbiBlbnRyeSBjYW4gYmUgaW4gYXQgbW9zdCBvbmUgbGlua2VkIGxpc3QgYXQgYSB0aW1lLgovLy8gV2hpbGUgYW4gZW50cnkgaXMgaW4gYSBsaW5rZWQgbGlzdCwgdGhlIFtsaXN0XSBwcm9wZXJ0eSBwb2ludHMgdG8gdGhhdAovLy8gbGlua2VkIGxpc3QsIGFuZCBvdGhlcndpc2UgdGhlIGBsaXN0YCBwcm9wZXJ0eSBpcyBgbnVsbGAuCi8vLwovLy8gV2hlbiBjcmVhdGVkLCBhbiBlbnRyeSBpcyBub3QgaW4gYW55IGxpbmtlZCBsaXN0LgphYnN0cmFjdCBjbGFzcyBMaW5rZWRMaXN0RW50cnk8RSBleHRlbmRzIExpbmtlZExpc3RFbnRyeTxFPj4gewogIExpbmtlZExpc3Q8RT4gX2xpc3Q7CiAgRSBfbmV4dDsKICBFIF9wcmV2aW91czsKCiAgLy8vIEdldCB0aGUgbGlua2VkIGxpc3QgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuCiAgLy8vCiAgLy8vIFJldHVybnMgYG51bGxgIGlmIHRoaXMgZW50cnkgaXMgbm90IGN1cnJlbnRseSBpbiBhbnkgbGlzdC4KICBMaW5rZWRMaXN0PEU+IGdldCBsaXN0ID0+IF9saXN0OwoKICAvLy8gVW5saW5rIHRoZSBlbGVtZW50IGZyb20gaXRzIGxpbmtlZCBsaXN0LgogIC8vLwogIC8vLyBUaGUgZW50cnkgbXVzdCBjdXJyZW50bHkgYmUgaW4gYSBsaW5rZWQgbGlzdCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KICB2b2lkIHVubGluaygpIHsKICAgIF9saXN0Ll91bmxpbmsodGhpcyk7CiAgfQoKICAvLy8gUmV0dXJuIHRoZSBzdWNjZXNzb3Igb2YgdGhpcyBlbGVtZW50IGluIGl0cyBsaW5rZWQgbGlzdC4KICAvLy8KICAvLy8gUmV0dXJucyBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gc3VjY2Vzc29yIGluIHRoZSBsaW5rZWQgbGlzdCwgb3IgaWYgdGhpcwogIC8vLyBlbnRyeSBpcyBub3QgY3VycmVudGx5IGluIGFueSBsaXN0LgogIEUgZ2V0IG5leHQgewogICAgaWYgKF9saXN0ID09IG51bGwgfHwgaWRlbnRpY2FsKF9saXN0LmZpcnN0LCBfbmV4dCkpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9uZXh0OwogIH0KCiAgLy8vIFJldHVybiB0aGUgcHJlZGVjZXNzb3Igb2YgdGhpcyBlbGVtZW50IGluIGl0cyBsaW5rZWQgbGlzdC4KICAvLy8KICAvLy8gUmV0dXJucyBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gcHJlZGVjZXNzb3IgaW4gdGhlIGxpbmtlZCBsaXN0LCBvciBpZiB0aGlzCiAgLy8vIGVudHJ5IGlzIG5vdCBjdXJyZW50bHkgaW4gYW55IGxpc3QuCiAgRSBnZXQgcHJldmlvdXMgewogICAgaWYgKF9saXN0ID09IG51bGwgfHwgaWRlbnRpY2FsKHRoaXMsIF9saXN0LmZpcnN0KSkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX3ByZXZpb3VzOwogIH0KCiAgLy8vIEluc2VydCBhbiBlbGVtZW50IGFmdGVyIHRoaXMgZWxlbWVudCBpbiB0aGlzIGVsZW1lbnQncyBsaW5rZWQgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBlbnRyeSBtdXN0IGJlIGluIGEgbGlua2VkIGxpc3Qgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCiAgLy8vIFRoZSBbZW50cnldIG11c3Qgbm90IGJlIGluIGEgbGlua2VkIGxpc3QuCiAgdm9pZCBpbnNlcnRBZnRlcihFIGVudHJ5KSB7CiAgICBfbGlzdC5faW5zZXJ0QmVmb3JlKF9uZXh0LCBlbnRyeSwgdXBkYXRlRmlyc3Q6IGZhbHNlKTsKICB9CgogIC8vLyBJbnNlcnQgYW4gZWxlbWVudCBiZWZvcmUgdGhpcyBlbGVtZW50IGluIHRoaXMgZWxlbWVudCdzIGxpbmtlZCBsaXN0LgogIC8vLwogIC8vLyBUaGlzIGVudHJ5IG11c3QgYmUgaW4gYSBsaW5rZWQgbGlzdCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KICAvLy8gVGhlIFtlbnRyeV0gbXVzdCBub3QgYmUgaW4gYSBsaW5rZWQgbGlzdC4KICB2b2lkIGluc2VydEJlZm9yZShFIGVudHJ5KSB7CiAgICBfbGlzdC5faW5zZXJ0QmVmb3JlKHRoaXMsIGVudHJ5LCB1cGRhdGVGaXJzdDogdHJ1ZSk7CiAgfQp9CoEJAE5OPAEZAVEET01KBE9OCwRLUUMETzNGSgRQJ0UeEwwBKRABNxs1FAQBMRY2BAEzJRoEASsGTAZNDBkrNREEATwBHQExERoZARUJFho6KAETEQQBEBMrBhMEAQ8TKwYdBAEREysGFy0GEwQBOQY4JzAZARgJFzUxCB8rBAEkATQGS0xAIUYGGgEbEx02GREOBiUZJiAiJDMZBg8EARoaLTIPOBMVKxUGBAIBUR0gDhwWASoWNh0fAR0BFDovBk0XFAYaFhkRBAIBOAQ7RkMqBDpLPgQ2PxcLDwEzBkEjAS8GTxIZBAE/Bk0qD0USBAFBBk8qE0QWBAFKBkYwHjsEAUsGRjAfOQQCASBkYXJ0OmNvbGxlY3Rpb24vbGlua2VkX2xpc3QuZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29sbGVjdGlvbi9xdWV1ZS5kYXJ0wABqhS8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29sbGVjdGlvbjsKCi8vLyBBIFtRdWV1ZV0gaXMgYSBjb2xsZWN0aW9uIHRoYXQgY2FuIGJlIG1hbmlwdWxhdGVkIGF0IGJvdGggZW5kcy4gT25lCi8vLyBjYW4gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBvZiBhIHF1ZXVlIHRocm91Z2ggW2ZvckVhY2hdIG9yIHdpdGgKLy8vIGFuIFtJdGVyYXRvcl0uCi8vLwovLy8gSXQgaXMgZ2VuZXJhbGx5IG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgcXVldWUgKGFkZCBvciByZW1vdmUgZW50cmllcykKLy8vIHdoaWxlIGFuIG9wZXJhdGlvbiBvbiB0aGUgcXVldWUgaXMgYmVpbmcgcGVyZm9ybWVkLCBmb3IgZXhhbXBsZSBkdXJpbmcgYQovLy8gY2FsbCB0byBbZm9yRWFjaF0uCi8vLyBNb2RpZnlpbmcgdGhlIHF1ZXVlIHdoaWxlIGl0IGlzIGJlaW5nIGl0ZXJhdGVkIHdpbGwgbW9zdCBsaWtlbHkgYnJlYWsgdGhlCi8vLyBpdGVyYXRpb24uCi8vLyBUaGlzIGdvZXMgYm90aCBmb3IgdXNpbmcgdGhlIFtpdGVyYXRvcl0gZGlyZWN0bHksIG9yIGZvciBpdGVyYXRpbmcgYW4KLy8vIGBJdGVyYWJsZWAgcmV0dXJuZWQgYnkgYSBtZXRob2QgbGlrZSBbbWFwXSBvciBbd2hlcmVdLgphYnN0cmFjdCBjbGFzcyBRdWV1ZTxFPiBpbXBsZW1lbnRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHsKICAvLy8gQ3JlYXRlcyBhIHF1ZXVlLgogIGZhY3RvcnkgUXVldWUoKSA9IExpc3RRdWV1ZTxFPjsKCiAgLy8vIENyZWF0ZXMgYSBxdWV1ZSBjb250YWluaW5nIGFsbCBbZWxlbWVudHNdLgogIC8vLwogIC8vLyBUaGUgZWxlbWVudCBvcmRlciBpbiB0aGUgcXVldWUgaXMgYXMgaWYgdGhlIGVsZW1lbnRzIHdlcmUgYWRkZWQgdXNpbmcKICAvLy8gW2FkZExhc3RdIGluIHRoZSBvcmRlciBwcm92aWRlZCBieSBbZWxlbWVudHMuaXRlcmF0b3JdLgogIC8vLwogIC8vLyBBbGwgdGhlIFtlbGVtZW50c10gc2hvdWxkIGJlIGluc3RhbmNlcyBvZiBbRV0uCiAgLy8vIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBtYXkgaGF2ZSBhbnkgZWxlbWVudCB0eXBlLCBzbyB0aGlzCiAgLy8vIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGRvd24tY2FzdCBhIGBRdWV1ZWAsIGZvciBleGFtcGxlIGFzOgogIC8vLyBgYGBkYXJ0CiAgLy8vIFF1ZXVlPFN1cGVyVHlwZT4gc3VwZXJRdWV1ZSA9IC4uLjsKICAvLy8gUXVldWU8U3ViVHlwZT4gc3ViUXVldWUgPQogIC8vLyAgICAgbmV3IFF1ZXVlPFN1YlR5cGU+LmZyb20oc3VwZXJTZXQud2hlcmVUeXBlPFN1YlR5cGU+KCkpOwogIC8vLyBgYGAKICBmYWN0b3J5IFF1ZXVlLmZyb20oSXRlcmFibGUgZWxlbWVudHMpID0gTGlzdFF1ZXVlPEU+LmZyb207CgogIC8vLyBDcmVhdGVzIGEgcXVldWUgZnJvbSBbZWxlbWVudHNdLgogIC8vLwogIC8vLyBUaGUgZWxlbWVudCBvcmRlciBpbiB0aGUgcXVldWUgaXMgYXMgaWYgdGhlIGVsZW1lbnRzIHdlcmUgYWRkZWQgdXNpbmcKICAvLy8gW2FkZExhc3RdIGluIHRoZSBvcmRlciBwcm92aWRlZCBieSBbZWxlbWVudHMuaXRlcmF0b3JdLgogIGZhY3RvcnkgUXVldWUub2YoSXRlcmFibGU8RT4gZWxlbWVudHMpID0gTGlzdFF1ZXVlPEU+Lm9mOwoKICAvLy8gQWRhcHRzIFtzb3VyY2VdIHRvIGJlIGEgYFF1ZXVlPFQ+YC4KICAvLy8KICAvLy8gQW55IHRpbWUgdGhlIHF1ZXVlIHdvdWxkIHByb2R1Y2UgYW4gZWxlbWVudCB0aGF0IGlzIG5vdCBhIFtUXSwKICAvLy8gdGhlIGVsZW1lbnQgYWNjZXNzIHdpbGwgdGhyb3cuCiAgLy8vCiAgLy8vIEFueSB0aW1lIGEgW1RdIHZhbHVlIGlzIGF0dGVtcHRlZCBzdG9yZWQgaW50byB0aGUgYWRhcHRlZCBxdWV1ZSwKICAvLy8gdGhlIHN0b3JlIHdpbGwgdGhyb3cgdW5sZXNzIHRoZSB2YWx1ZSBpcyBhbHNvIGFuIGluc3RhbmNlIG9mIFtTXS4KICAvLy8KICAvLy8gSWYgYWxsIGFjY2Vzc2VkIGVsZW1lbnRzIG9mIFtzb3VyY2VdIGFyZSBhY3R1YWxseSBpbnN0YW5jZXMgb2YgW1RdLAogIC8vLyBhbmQgaWYgYWxsIGVsZW1lbnRzIHN0b3JlZCBpbnRvIHRoZSByZXR1cm5lZCBxdWV1ZSBhcmUgYWN0dWFsbHkgaW5zdGFuY2UKICAvLy8gb2YgW1NdLAogIC8vLyB0aGVuIHRoZSByZXR1cm5lZCBxdWV1ZSBjYW4gYmUgdXNlZCBhcyBhIGBRdWV1ZTxUPmAuCiAgc3RhdGljIFF1ZXVlPFQ+IGNhc3RGcm9tPFMsIFQ+KFF1ZXVlPFM+IHNvdXJjZSkgPT4gQ2FzdFF1ZXVlPFMsIFQ+KHNvdXJjZSk7CgogIC8vLyBQcm92aWRlcyBhIHZpZXcgb2YgdGhpcyBxdWV1ZSBhcyBhIHF1ZXVlIG9mIFtSXSBpbnN0YW5jZXMsIGlmIG5lY2Vzc2FyeS4KICAvLy8KICAvLy8gSWYgdGhpcyBxdWV1ZSBjb250YWlucyBvbmx5IGluc3RhbmNlcyBvZiBbUl0sIGFsbCByZWFkIG9wZXJhdGlvbnMKICAvLy8gd2lsbCB3b3JrIGNvcnJlY3RseS4gSWYgYW55IG9wZXJhdGlvbiB0cmllcyB0byBhY2Nlc3MgYW4gZWxlbWVudAogIC8vLyB0aGF0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBbUl0sIHRoZSBhY2Nlc3Mgd2lsbCB0aHJvdyBpbnN0ZWFkLgogIC8vLwogIC8vLyBFbGVtZW50cyBhZGRlZCB0byB0aGUgcXVldWUgKGUuZy4sIGJ5IHVzaW5nIFthZGRGaXJzdF0gb3IgW2FkZEFsbF0pCiAgLy8vIG11c3QgYmUgaW5zdGFuY2Ugb2YgW1JdIHRvIGJlIHZhbGlkIGFyZ3VtZW50cyB0byB0aGUgYWRkaW5nIGZ1bmN0aW9uLAogIC8vLyBhbmQgdGhleSBtdXN0IGJlIGluc3RhbmNlcyBvZiBbRV0gYXMgd2VsbCB0byBiZSBhY2NlcHRlZCBieQogIC8vLyB0aGlzIHF1ZXVlIGFzIHdlbGwuCiAgUXVldWU8Uj4gY2FzdDxSPigpOwoKICAvLy8gUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzIHF1ZXVlLgogIC8vLwogIC8vLyBUaGUgcXVldWUgbXVzdCBub3QgYmUgZW1wdHkgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCiAgRSByZW1vdmVGaXJzdCgpOwoKICAvLy8gUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBxdWV1ZS4KICAvLy8KICAvLy8gVGhlIHF1ZXVlIG11c3Qgbm90IGJlIGVtcHR5IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgogIEUgcmVtb3ZlTGFzdCgpOwoKICAvLy8gQWRkcyBbdmFsdWVdIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHF1ZXVlLgogIHZvaWQgYWRkRmlyc3QoRSB2YWx1ZSk7CgogIC8vLyBBZGRzIFt2YWx1ZV0gYXQgdGhlIGVuZCBvZiB0aGUgcXVldWUuCiAgdm9pZCBhZGRMYXN0KEUgdmFsdWUpOwoKICAvLy8gQWRkcyBbdmFsdWVdIGF0IHRoZSBlbmQgb2YgdGhlIHF1ZXVlLgogIHZvaWQgYWRkKEUgdmFsdWUpOwoKICAvLy8gUmVtb3ZlIGEgc2luZ2xlIGluc3RhbmNlIG9mIFt2YWx1ZV0gZnJvbSB0aGUgcXVldWUuCiAgLy8vCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGEgdmFsdWUgd2FzIHJlbW92ZWQsIG9yIGBmYWxzZWAgaWYgdGhlIHF1ZXVlCiAgLy8vIGNvbnRhaW5lZCBubyBlbGVtZW50IGVxdWFsIHRvIFt2YWx1ZV0uCiAgYm9vbCByZW1vdmUoT2JqZWN0IHZhbHVlKTsKCiAgLy8vIEFkZHMgYWxsIGVsZW1lbnRzIG9mIFtpdGVyYWJsZV0gYXQgdGhlIGVuZCBvZiB0aGUgcXVldWUuIFRoZQogIC8vLyBsZW5ndGggb2YgdGhlIHF1ZXVlIGlzIGV4dGVuZGVkIGJ5IHRoZSBsZW5ndGggb2YgW2l0ZXJhYmxlXS4KICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBpdGVyYWJsZSk7CgogIC8vLyBSZW1vdmVzIGFsbCBlbGVtZW50cyBtYXRjaGVkIGJ5IFt0ZXN0XSBmcm9tIHRoZSBxdWV1ZS4KICAvLy8KICAvLy8gVGhlIGB0ZXN0YCBmdW5jdGlvbiBtdXN0IG5vdCB0aHJvdyBvciBtb2RpZnkgdGhlIHF1ZXVlLgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpOwoKICAvLy8gUmVtb3ZlcyBhbGwgZWxlbWVudHMgbm90IG1hdGNoZWQgYnkgW3Rlc3RdIGZyb20gdGhlIHF1ZXVlLgogIC8vLwogIC8vLyBUaGUgYHRlc3RgIGZ1bmN0aW9uIG11c3Qgbm90IHRocm93IG9yIG1vZGlmeSB0aGUgcXVldWUuCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSk7CgogIC8vLyBSZW1vdmVzIGFsbCBlbGVtZW50cyBpbiB0aGUgcXVldWUuIFRoZSBzaXplIG9mIHRoZSBxdWV1ZSBiZWNvbWVzIHplcm8uCiAgdm9pZCBjbGVhcigpOwp9CgpjbGFzcyBfRG91YmxlTGluazxMaW5rIGV4dGVuZHMgX0RvdWJsZUxpbms8TGluaz4+IHsKICBMaW5rIF9wcmV2aW91c0xpbms7CiAgTGluayBfbmV4dExpbms7CgogIHZvaWQgX2xpbmsoTGluayBwcmV2aW91cywgTGluayBuZXh0KSB7CiAgICBfbmV4dExpbmsgPSBuZXh0OwogICAgX3ByZXZpb3VzTGluayA9IHByZXZpb3VzOwogICAgaWYgKHByZXZpb3VzICE9IG51bGwpIHByZXZpb3VzLl9uZXh0TGluayA9IHRoaXM7CiAgICBpZiAobmV4dCAhPSBudWxsKSBuZXh0Ll9wcmV2aW91c0xpbmsgPSB0aGlzOwogIH0KCiAgdm9pZCBfdW5saW5rKCkgewogICAgaWYgKF9wcmV2aW91c0xpbmsgIT0gbnVsbCkgX3ByZXZpb3VzTGluay5fbmV4dExpbmsgPSBfbmV4dExpbms7CiAgICBpZiAoX25leHRMaW5rICE9IG51bGwpIF9uZXh0TGluay5fcHJldmlvdXNMaW5rID0gX3ByZXZpb3VzTGluazsKICAgIF9uZXh0TGluayA9IG51bGw7CiAgICBfcHJldmlvdXNMaW5rID0gbnVsbDsKICB9Cn0KCi8vLyBBbiBlbnRyeSBpbiBhIGRvdWJseSBsaW5rZWQgbGlzdC4gSXQgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0Ci8vLyBlbnRyeSwgdGhlIHByZXZpb3VzIGVudHJ5LCBhbmQgdGhlIGJveGVkIGVsZW1lbnQuCmNsYXNzIERvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gZXh0ZW5kcyBfRG91YmxlTGluazxEb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+PiB7CiAgLy8vIFRoZSBlbGVtZW50IGluIHRoZSBxdWV1ZS4KICBFIGVsZW1lbnQ7CgogIERvdWJsZUxpbmtlZFF1ZXVlRW50cnkodGhpcy5lbGVtZW50KTsKCiAgLy8vIEFwcGVuZHMgdGhlIGdpdmVuIFtlXSBhcyBlbnRyeSBqdXN0IGFmdGVyIHRoaXMgZW50cnkuCiAgdm9pZCBhcHBlbmQoRSBlKSB7CiAgICBEb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+KGUpLl9saW5rKHRoaXMsIF9uZXh0TGluayk7CiAgfQoKICAvLy8gUHJlcGVuZHMgdGhlIGdpdmVuIFtlXSBhcyBlbnRyeSBqdXN0IGJlZm9yZSB0aGlzIGVudHJ5LgogIHZvaWQgcHJlcGVuZChFIGUpIHsKICAgIERvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4oZSkuX2xpbmsoX3ByZXZpb3VzTGluaywgdGhpcyk7CiAgfQoKICBFIHJlbW92ZSgpIHsKICAgIF91bmxpbmsoKTsKICAgIHJldHVybiBlbGVtZW50OwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHByZXZpb3VzIGVudHJ5IG9yIGBudWxsYCBpZiB0aGVyZSBpcyBub25lLgogIERvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gcHJldmlvdXNFbnRyeSgpID0+IF9wcmV2aW91c0xpbms7CgogIC8vLyBSZXR1cm5zIHRoZSBuZXh0IGVudHJ5IG9yIGBudWxsYCBpZiB0aGVyZSBpcyBub25lLgogIERvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gbmV4dEVudHJ5KCkgPT4gX25leHRMaW5rOwp9CgovLy8gSW50ZXJmYWNlIGZvciB0aGUgbGluayBjbGFzc2VzIHVzZWQgYnkgW0RvdWJsZUxpbmtlZFF1ZXVlXS4KLy8vCi8vLyBCb3RoIHRoZSBbX0RvdWJsZUxpbmtlZFF1ZXVlRWxlbWVudF0gYW5kIFtfRG91YmxlTGlua2VkUXVldWVTZW50aW5lbF0KLy8vIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLy8vIFRoZSBlbnRyeSBjb250YWlucyBhIGxpbmsgYmFjayB0byB0aGUgcXVldWUsIHNvIGNhbGxpbmcgYGFwcGVuZGAKLy8vIG9yIGBwcmVwZW5kYCBjYW4gY29ycmVjdGx5IHVwZGF0ZSB0aGUgZWxlbWVudCBjb3VudC4KYWJzdHJhY3QgY2xhc3MgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gZXh0ZW5kcyBEb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IHsKICBEb3VibGVMaW5rZWRRdWV1ZTxFPiBfcXVldWU7CiAgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnkoRSBlbGVtZW50LCB0aGlzLl9xdWV1ZSkgOiBzdXBlcihlbGVtZW50KTsKCiAgRG91YmxlTGlua2VkUXVldWVFbnRyeTxFPiBfYXNOb25TZW50aW5lbEVudHJ5KCk7CgogIHZvaWQgX2FwcGVuZChFIGUpIHsKICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVsZW1lbnQ8RT4oZSwgX3F1ZXVlKS5fbGluayh0aGlzLCBfbmV4dExpbmspOwogIH0KCiAgdm9pZCBfcHJlcGVuZChFIGUpIHsKICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVsZW1lbnQ8RT4oZSwgX3F1ZXVlKS5fbGluayhfcHJldmlvdXNMaW5rLCB0aGlzKTsKICB9CgogIEUgX3JlbW92ZSgpOwoKICBFIGdldCBfZWxlbWVudCA9PiBlbGVtZW50OwoKICBEb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IG5leHRFbnRyeSgpIHsKICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IGVudHJ5ID0gX25leHRMaW5rOwogICAgcmV0dXJuIGVudHJ5Ll9hc05vblNlbnRpbmVsRW50cnkoKTsKICB9CgogIERvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gcHJldmlvdXNFbnRyeSgpIHsKICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IGVudHJ5ID0gX3ByZXZpb3VzTGluazsKICAgIHJldHVybiBlbnRyeS5fYXNOb25TZW50aW5lbEVudHJ5KCk7CiAgfQp9CgovLy8gVGhlIGFjdHVhbCBlbnRyeSB0eXBlIHVzZWQgYnkgdGhlIFtEb3VibGVMaW5rZWRRdWV1ZV0uCi8vLwovLy8gVGhlIGVudHJ5IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBxdWV1ZSwgYWxsb3dpbmcKLy8vIFthcHBlbmRdL1twcmVwZW5kXSB0byB1cGRhdGUgdGhlIGxpc3QgbGVuZ3RoLgpjbGFzcyBfRG91YmxlTGlua2VkUXVldWVFbGVtZW50PEU+IGV4dGVuZHMgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gewogIF9Eb3VibGVMaW5rZWRRdWV1ZUVsZW1lbnQoRSBlbGVtZW50LCBEb3VibGVMaW5rZWRRdWV1ZTxFPiBxdWV1ZSkKICAgICAgOiBzdXBlcihlbGVtZW50LCBxdWV1ZSk7CgogIHZvaWQgYXBwZW5kKEUgZSkgewogICAgX2FwcGVuZChlKTsKICAgIGlmIChfcXVldWUgIT0gbnVsbCkgX3F1ZXVlLl9lbGVtZW50Q291bnQrKzsKICB9CgogIHZvaWQgcHJlcGVuZChFIGUpIHsKICAgIF9wcmVwZW5kKGUpOwogICAgaWYgKF9xdWV1ZSAhPSBudWxsKSBfcXVldWUuX2VsZW1lbnRDb3VudCsrOwogIH0KCiAgRSBfcmVtb3ZlKCkgewogICAgX3F1ZXVlID0gbnVsbDsKICAgIF91bmxpbmsoKTsKICAgIHJldHVybiBlbGVtZW50OwogIH0KCiAgRSByZW1vdmUoKSB7CiAgICBpZiAoX3F1ZXVlICE9IG51bGwpIF9xdWV1ZS5fZWxlbWVudENvdW50LS07CiAgICByZXR1cm4gX3JlbW92ZSgpOwogIH0KCiAgX0RvdWJsZUxpbmtlZFF1ZXVlRWxlbWVudDxFPiBfYXNOb25TZW50aW5lbEVudHJ5KCkgewogICAgcmV0dXJuIHRoaXM7CiAgfQp9CgovLy8gQSBzZW50aW5lbCBpbiBhIGRvdWJsZSBsaW5rZWQgbGlzdCBpcyB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGxpc3QKLy8vIGF0IGJvdGggZW5kcy4KLy8vIEEgZG91YmxlIGxpbmtlZCBsaXN0IGhhcyBleGFjdGx5IG9uZSBzZW50aW5lbCwKLy8vIHdoaWNoIGlzIHRoZSBvbmx5IGVudHJ5IHdoZW4gdGhlIGxpc3QgaXMgY29uc3RydWN0ZWQuCi8vLyBJbml0aWFsbHksIGEgc2VudGluZWwgaGFzIGl0cyBuZXh0IGFuZCBwcmV2aW91cyBlbnRyeSBwb2ludCB0byBpdHNlbGYuCi8vLyBBIHNlbnRpbmVsIGRvZXMgbm90IGJveCBhbnkgdXNlciBlbGVtZW50LgpjbGFzcyBfRG91YmxlTGlua2VkUXVldWVTZW50aW5lbDxFPiBleHRlbmRzIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IHsKICBfRG91YmxlTGlua2VkUXVldWVTZW50aW5lbChEb3VibGVMaW5rZWRRdWV1ZTxFPiBxdWV1ZSkgOiBzdXBlcihudWxsLCBxdWV1ZSkgewogICAgX3ByZXZpb3VzTGluayA9IHRoaXM7CiAgICBfbmV4dExpbmsgPSB0aGlzOwogIH0KCiAgRG91YmxlTGlua2VkUXVldWVFbnRyeTxFPiBfYXNOb25TZW50aW5lbEVudHJ5KCkgewogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8gSGl0IGJ5LCBlLmcuLCBbRG91YmxlTGlua2VkUXVldWUucmVtb3ZlRmlyc3RdIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS4KICBFIF9yZW1vdmUoKSB7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIC8vLyBIaXQgYnksIGUuZy4sIFtEb3VibGVMaW5rZWRRdWV1ZS5maXJzdF0gaWYgdGhlIHF1ZXVlIGlzIGVtcHR5LgogIEUgZ2V0IF9lbGVtZW50IHsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KfQoKLy8vIEEgW1F1ZXVlXSBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBhIGRvdWJsZS1saW5rZWQgbGlzdC4KLy8vCi8vLyBBbGxvd3MgY29uc3RhbnQgdGltZSBhZGQsIHJlbW92ZS1hdC1lbmRzIGFuZCBwZWVrIG9wZXJhdGlvbnMuCmNsYXNzIERvdWJsZUxpbmtlZFF1ZXVlPEU+IGV4dGVuZHMgSXRlcmFibGU8RT4gaW1wbGVtZW50cyBRdWV1ZTxFPiB7CiAgX0RvdWJsZUxpbmtlZFF1ZXVlU2VudGluZWw8RT4gX3NlbnRpbmVsOwogIGludCBfZWxlbWVudENvdW50ID0gMDsKCiAgRG91YmxlTGlua2VkUXVldWUoKSB7CiAgICBfc2VudGluZWwgPSBfRG91YmxlTGlua2VkUXVldWVTZW50aW5lbDxFPih0aGlzKTsKICB9CgogIC8vLyBDcmVhdGVzIGEgZG91YmxlLWxpbmtlZCBxdWV1ZSBjb250YWluaW5nIGFsbCBbZWxlbWVudHNdLgogIC8vLwogIC8vLyBUaGUgZWxlbWVudCBvcmRlciBpbiB0aGUgcXVldWUgaXMgYXMgaWYgdGhlIGVsZW1lbnRzIHdlcmUgYWRkZWQgdXNpbmcKICAvLy8gW2FkZExhc3RdIGluIHRoZSBvcmRlciBwcm92aWRlZCBieSBbZWxlbWVudHMuaXRlcmF0b3JdLgogIC8vLwogIC8vLyBBbGwgdGhlIFtlbGVtZW50c10gc2hvdWxkIGJlIGluc3RhbmNlcyBvZiBbRV0uCiAgLy8vIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBtYXkgaGF2ZSBhbnkgZWxlbWVudCB0eXBlLCBzbyB0aGlzCiAgLy8vIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGRvd24tY2FzdCBhIGBRdWV1ZWAsIGZvciBleGFtcGxlIGFzOgogIC8vLyBgYGBkYXJ0CiAgLy8vIFF1ZXVlPFN1cGVyVHlwZT4gc3VwZXJRdWV1ZSA9IC4uLjsKICAvLy8gUXVldWU8U3ViVHlwZT4gc3ViUXVldWUgPQogIC8vLyAgICAgbmV3IERvdWJsZUxpbmtlZFF1ZXVlPFN1YlR5cGU+LmZyb20oc3VwZXJRdWV1ZS53aGVyZVR5cGU8U3ViVHlwZT4oKSk7CiAgLy8vIGBgYAogIGZhY3RvcnkgRG91YmxlTGlua2VkUXVldWUuZnJvbShJdGVyYWJsZSBlbGVtZW50cykgewogICAgUXVldWU8RT4gbGlzdCA9IERvdWJsZUxpbmtlZFF1ZXVlPEU+KCk7CiAgICBmb3IgKGZpbmFsIGUgaW4gZWxlbWVudHMpIHsKICAgICAgbGlzdC5hZGRMYXN0KGUpOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIGRvdWJsZS1saW5rZWQgcXVldWUgZnJvbSBbZWxlbWVudHNdLgogIC8vLwogIC8vLyBUaGUgZWxlbWVudCBvcmRlciBpbiB0aGUgcXVldWUgaXMgYXMgaWYgdGhlIGVsZW1lbnRzIHdlcmUgYWRkZWQgdXNpbmcKICAvLy8gW2FkZExhc3RdIGluIHRoZSBvcmRlciBwcm92aWRlZCBieSBbZWxlbWVudHMuaXRlcmF0b3JdLgogIGZhY3RvcnkgRG91YmxlTGlua2VkUXVldWUub2YoSXRlcmFibGU8RT4gZWxlbWVudHMpID0+CiAgICAgIERvdWJsZUxpbmtlZFF1ZXVlPEU+KCkuLmFkZEFsbChlbGVtZW50cyk7CgogIFF1ZXVlPFI+IGNhc3Q8Uj4oKSA9PiBRdWV1ZS5jYXN0RnJvbTxFLCBSPih0aGlzKTsKICBpbnQgZ2V0IGxlbmd0aCA9PiBfZWxlbWVudENvdW50OwoKICB2b2lkIGFkZExhc3QoRSB2YWx1ZSkgewogICAgX3NlbnRpbmVsLl9wcmVwZW5kKHZhbHVlKTsKICAgIF9lbGVtZW50Q291bnQrKzsKICB9CgogIHZvaWQgYWRkRmlyc3QoRSB2YWx1ZSkgewogICAgX3NlbnRpbmVsLl9hcHBlbmQodmFsdWUpOwogICAgX2VsZW1lbnRDb3VudCsrOwogIH0KCiAgdm9pZCBhZGQoRSB2YWx1ZSkgewogICAgX3NlbnRpbmVsLl9wcmVwZW5kKHZhbHVlKTsKICAgIF9lbGVtZW50Q291bnQrKzsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBmb3IgKGZpbmFsIEUgdmFsdWUgaW4gaXRlcmFibGUpIHsKICAgICAgX3NlbnRpbmVsLl9wcmVwZW5kKHZhbHVlKTsKICAgICAgX2VsZW1lbnRDb3VudCsrOwogICAgfQogIH0KCiAgRSByZW1vdmVMYXN0KCkgewogICAgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gbGFzdEVudHJ5ID0gX3NlbnRpbmVsLl9wcmV2aW91c0xpbms7CiAgICBFIHJlc3VsdCA9IGxhc3RFbnRyeS5fcmVtb3ZlKCk7CiAgICBfZWxlbWVudENvdW50LS07CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRSByZW1vdmVGaXJzdCgpIHsKICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IGZpcnN0RW50cnkgPSBfc2VudGluZWwuX25leHRMaW5rOwogICAgRSByZXN1bHQgPSBmaXJzdEVudHJ5Ll9yZW1vdmUoKTsKICAgIF9lbGVtZW50Q291bnQtLTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBib29sIHJlbW92ZShPYmplY3QgbykgewogICAgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gZW50cnkgPSBfc2VudGluZWwuX25leHRMaW5rOwogICAgd2hpbGUgKCFpZGVudGljYWwoZW50cnksIF9zZW50aW5lbCkpIHsKICAgICAgYm9vbCBlcXVhbHMgPSAoZW50cnkuX2VsZW1lbnQgPT0gbyk7CiAgICAgIGlmICghaWRlbnRpY2FsKHRoaXMsIGVudHJ5Ll9xdWV1ZSkpIHsKICAgICAgICAvLyBFbnRyeSBtdXN0IHN0aWxsIGJlIGluIHRoZSBxdWV1ZS4KICAgICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgICAgaWYgKGVxdWFscykgewogICAgICAgIGVudHJ5Ll9yZW1vdmUoKTsKICAgICAgICBfZWxlbWVudENvdW50LS07CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgZW50cnkgPSBlbnRyeS5fbmV4dExpbms7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIF9maWx0ZXIoYm9vbCB0ZXN0KEUgZWxlbWVudCksIGJvb2wgcmVtb3ZlTWF0Y2hpbmcpIHsKICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IGVudHJ5ID0gX3NlbnRpbmVsLl9uZXh0TGluazsKICAgIHdoaWxlICghaWRlbnRpY2FsKGVudHJ5LCBfc2VudGluZWwpKSB7CiAgICAgIGJvb2wgbWF0Y2hlcyA9IHRlc3QoZW50cnkuX2VsZW1lbnQpOwogICAgICBpZiAoIWlkZW50aWNhbCh0aGlzLCBlbnRyeS5fcXVldWUpKSB7CiAgICAgICAgLy8gRW50cnkgbXVzdCBzdGlsbCBiZSBpbiB0aGUgcXVldWUuCiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IG5leHQgPSBlbnRyeS5fbmV4dExpbms7IC8vIENhbm5vdCBiZSBudWxsLgogICAgICBpZiAoaWRlbnRpY2FsKHJlbW92ZU1hdGNoaW5nLCBtYXRjaGVzKSkgewogICAgICAgIGVudHJ5Ll9yZW1vdmUoKTsKICAgICAgICBfZWxlbWVudENvdW50LS07CiAgICAgIH0KICAgICAgZW50cnkgPSBuZXh0OwogICAgfQogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgX2ZpbHRlcih0ZXN0LCB0cnVlKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIF9maWx0ZXIodGVzdCwgZmFsc2UpOwogIH0KCiAgRSBnZXQgZmlyc3QgewogICAgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gZmlyc3RFbnRyeSA9IF9zZW50aW5lbC5fbmV4dExpbms7CiAgICByZXR1cm4gZmlyc3RFbnRyeS5fZWxlbWVudDsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gbGFzdEVudHJ5ID0gX3NlbnRpbmVsLl9wcmV2aW91c0xpbms7CiAgICByZXR1cm4gbGFzdEVudHJ5Ll9lbGVtZW50OwogIH0KCiAgRSBnZXQgc2luZ2xlIHsKICAgIC8vIE5vdGUgdGhhdCB0aGlzIHRocm93cyBjb3JyZWN0bHkgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5CiAgICAvLyBiZWNhdXNlIHJlYWRpbmcgdGhlIGVsZW1lbnQgb2YgdGhlIHNlbnRpbmVsIHRocm93cy4KICAgIGlmIChpZGVudGljYWwoX3NlbnRpbmVsLl9uZXh0TGluaywgX3NlbnRpbmVsLl9wcmV2aW91c0xpbmspKSB7CiAgICAgIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IGVudHJ5ID0gX3NlbnRpbmVsLl9uZXh0TGluazsKICAgICAgcmV0dXJuIGVudHJ5Ll9lbGVtZW50OwogICAgfQogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogIH0KCiAgLy8vIFRoZSBlbnRyeSBvYmplY3Qgb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHF1ZXVlLgogIC8vLwogIC8vLyBFYWNoIGVsZW1lbnQgb2YgdGhlIHF1ZXVlIGhhcyBhbiBhc3NvY2lhdGVkIFtEb3VibGVMaW5rZWRRdWV1ZUVudHJ5XS4KICAvLy8gUmV0dXJucyB0aGUgZW50cnkgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHF1ZXVlLgogIC8vLwogIC8vLyBUaGUgZW50cnkgb2JqZWN0cyBjYW4gYWxzbyBiZSBhY2Nlc3NlZCB1c2luZyBbbGFzdEVudHJ5XSwKICAvLy8gYW5kIHRoZXkgY2FuIGJlIGl0ZXJhdGVkIHVzaW5nIFtEb3VibGVMaW5rZWRRdWV1ZUVudHJ5Lm5leHRFbnRyeSgpXSBhbmQKICAvLy8gW0RvdWJsZUxpbmtlZFF1ZXVlRW50cnkucHJldmlvdXNFbnRyeSgpXS4KICBEb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IGZpcnN0RW50cnkoKSB7CiAgICByZXR1cm4gX3NlbnRpbmVsLm5leHRFbnRyeSgpOwogIH0KCiAgLy8vIFRoZSBlbnRyeSBvYmplY3Qgb2YgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgcXVldWUuCiAgLy8vCiAgLy8vIEVhY2ggZWxlbWVudCBvZiB0aGUgcXVldWUgaGFzIGFuIGFzc29jaWF0ZWQgW0RvdWJsZUxpbmtlZFF1ZXVlRW50cnldLgogIC8vLyBSZXR1cm5zIHRoZSBlbnRyeSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBxdWV1ZS4KICAvLy8KICAvLy8gVGhlIGVudHJ5IG9iamVjdHMgY2FuIGFsc28gYmUgYWNjZXNzZWQgdXNpbmcgW2ZpcnN0RW50cnldLAogIC8vLyBhbmQgdGhleSBjYW4gYmUgaXRlcmF0ZWQgdXNpbmcgW0RvdWJsZUxpbmtlZFF1ZXVlRW50cnkubmV4dEVudHJ5KCldIGFuZAogIC8vLyBbRG91YmxlTGlua2VkUXVldWVFbnRyeS5wcmV2aW91c0VudHJ5KCldLgogIERvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gbGFzdEVudHJ5KCkgewogICAgcmV0dXJuIF9zZW50aW5lbC5wcmV2aW91c0VudHJ5KCk7CiAgfQoKICBib29sIGdldCBpc0VtcHR5IHsKICAgIHJldHVybiAoaWRlbnRpY2FsKF9zZW50aW5lbC5fbmV4dExpbmssIF9zZW50aW5lbCkpOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIF9zZW50aW5lbC5fbmV4dExpbmsgPSBfc2VudGluZWw7CiAgICBfc2VudGluZWwuX3ByZXZpb3VzTGluayA9IF9zZW50aW5lbDsKICAgIF9lbGVtZW50Q291bnQgPSAwOwogIH0KCiAgLy8vIENhbGxzIFthY3Rpb25dIGZvciBlYWNoIGVudHJ5IG9iamVjdCBvZiB0aGlzIGRvdWJsZS1saW5rZWQgcXVldWUuCiAgLy8vCiAgLy8vIEVhY2ggZWxlbWVudCBvZiB0aGUgcXVldWUgaGFzIGFuIGFzc29jaWF0ZWQgW0RvdWJsZUxpbmtlZFF1ZXVlRW50cnldLgogIC8vLyBUaGlzIG1ldGhvZCBpdGVyYXRlcyB0aGUgZW50cnkgb2JqZWN0cyBmcm9tIGZpcnN0IHRvIGxhc3QgYW5kIGNhbGxzCiAgLy8vIFthY3Rpb25dIHdpdGggZWFjaCBvYmplY3QgaW4gdHVybi4KICAvLy8KICAvLy8gVGhlIGVudHJ5IG9iamVjdHMgY2FuIGFsc28gYmUgYWNjZXNzZWQgdXNpbmcgW2ZpcnN0RW50cnldIGFuZCBbbGFzdEVudHJ5XSwKICAvLy8gYW5kIGl0ZXJhdGVkIHVzaW5nIFtEb3VibGVMaW5rZWRRdWV1ZUVudHJ5Lm5leHRFbnRyeSgpXSBhbmQKICAvLy8gW0RvdWJsZUxpbmtlZFF1ZXVlRW50cnkucHJldmlvdXNFbnRyeSgpXS4KICAvLy8KICAvLy8gVGhlIFthY3Rpb25dIGZ1bmN0aW9uIGNhbiB1c2UgbWV0aG9kcyBvbiBbRG91YmxlTGlua2VkUXVldWVFbnRyeV0gdG8KICAvLy8gcmVtb3ZlIHRoZSBlbnRyeSBvciBpdCBjYW4gaW5zZXJ0IGVsZW1lbnRzIGJlZm9yZSBvciBhZnRlciB0aGVuIGVudHJ5LgogIC8vLyBJZiB0aGUgY3VycmVudCBlbnRyeSBpcyByZW1vdmVkLCBpdGVyYXRpb24gY29udGludWVzIHdpdGggdGhlIGVudHJ5IHRoYXQKICAvLy8gd2FzIGZvbGxvd2luZyB0aGUgY3VycmVudCBlbnRyeSB3aGVuIFthY3Rpb25dIHdhcyBjYWxsZWQuIEFueSBlbGVtZW50cwogIC8vLyBpbnNlcnRlZCBhZnRlciB0aGUgY3VycmVudCBlbGVtZW50IGJlZm9yZSBpdCBpcyByZW1vdmVkIHdpbGwgbm90IGJlCiAgLy8vIHZpc2l0ZWQgYnkgdGhlIGl0ZXJhdGlvbi4KICB2b2lkIGZvckVhY2hFbnRyeSh2b2lkIGFjdGlvbihEb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IGVsZW1lbnQpKSB7CiAgICBfRG91YmxlTGlua2VkUXVldWVFbnRyeTxFPiBlbnRyeSA9IF9zZW50aW5lbC5fbmV4dExpbms7CiAgICB3aGlsZSAoIWlkZW50aWNhbChlbnRyeSwgX3NlbnRpbmVsKSkgewogICAgICBfRG91YmxlTGlua2VkUXVldWVFbGVtZW50PEU+IGVsZW1lbnQgPSBlbnRyeTsKICAgICAgX0RvdWJsZUxpbmtlZFF1ZXVlRW50cnk8RT4gbmV4dCA9IGVsZW1lbnQuX25leHRMaW5rOwogICAgICAvLyBSZW1lbWJlciBib3RoIGVudHJ5IGFuZCBlbnRyeS5fbmV4dExpbmsuCiAgICAgIC8vIElmIHNvbWVvbmUgY2FsbHMgYGVsZW1lbnQucmVtb3ZlKClgIHdlIGNvbnRpbnVlIGZyb20gYG5leHRgLgogICAgICAvLyBPdGhlcndpc2Ugd2UgdXNlIHRoZSB2YWx1ZSBvZiBlbnRyeS5fbmV4dExpbmsgd2hpY2ggbWF5IGhhdmUgYmVlbgogICAgICAvLyB1cGRhdGVkLgogICAgICBhY3Rpb24oZWxlbWVudCk7CiAgICAgIGlmIChpZGVudGljYWwodGhpcywgZW50cnkuX3F1ZXVlKSkgewogICAgICAgIG5leHQgPSBlbnRyeS5fbmV4dExpbms7CiAgICAgIH0gZWxzZSBpZiAoIWlkZW50aWNhbCh0aGlzLCBuZXh0Ll9xdWV1ZSkpIHsKICAgICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgICAgZW50cnkgPSBuZXh0OwogICAgfQogIH0KCiAgX0RvdWJsZUxpbmtlZFF1ZXVlSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBfRG91YmxlTGlua2VkUXVldWVJdGVyYXRvcjxFPihfc2VudGluZWwpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gSXRlcmFibGVCYXNlLml0ZXJhYmxlVG9GdWxsU3RyaW5nKHRoaXMsICd7JywgJ30nKTsKfQoKY2xhc3MgX0RvdWJsZUxpbmtlZFF1ZXVlSXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgX0RvdWJsZUxpbmtlZFF1ZXVlU2VudGluZWw8RT4gX3NlbnRpbmVsOwogIF9Eb3VibGVMaW5rZWRRdWV1ZUVudHJ5PEU+IF9uZXh0RW50cnk7CiAgRSBfY3VycmVudDsKCiAgX0RvdWJsZUxpbmtlZFF1ZXVlSXRlcmF0b3IoX0RvdWJsZUxpbmtlZFF1ZXVlU2VudGluZWw8RT4gc2VudGluZWwpCiAgICAgIDogX3NlbnRpbmVsID0gc2VudGluZWwsCiAgICAgICAgX25leHRFbnRyeSA9IHNlbnRpbmVsLl9uZXh0TGluazsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChpZGVudGljYWwoX25leHRFbnRyeSwgX3NlbnRpbmVsKSkgewogICAgICBfY3VycmVudCA9IG51bGw7CiAgICAgIF9uZXh0RW50cnkgPSBudWxsOwogICAgICBfc2VudGluZWwgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfRG91YmxlTGlua2VkUXVldWVFbGVtZW50PEU+IGVsZW1lbnRFbnRyeSA9IF9uZXh0RW50cnk7CiAgICBpZiAoIWlkZW50aWNhbChfc2VudGluZWwuX3F1ZXVlLCBlbGVtZW50RW50cnkuX3F1ZXVlKSkgewogICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IoX3NlbnRpbmVsLl9xdWV1ZSk7CiAgICB9CiAgICBfY3VycmVudCA9IGVsZW1lbnRFbnRyeS5fZWxlbWVudDsKICAgIF9uZXh0RW50cnkgPSBlbGVtZW50RW50cnkuX25leHRMaW5rOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBFIGdldCBjdXJyZW50ID0+IF9jdXJyZW50Owp9CgovLy8gTGlzdCBiYXNlZCBbUXVldWVdLgovLy8KLy8vIEtlZXBzIGEgY3ljbGljIGJ1ZmZlciBvZiBlbGVtZW50cywgYW5kIGdyb3dzIHRvIGEgbGFyZ2VyIGJ1ZmZlciB3aGVuCi8vLyBpdCBmaWxscyB1cC4gVGhpcyBndWFyYW50ZWVzIGNvbnN0YW50IHRpbWUgcGVlayBhbmQgcmVtb3ZlIG9wZXJhdGlvbnMsIGFuZAovLy8gYW1vcnRpemVkIGNvbnN0YW50IHRpbWUgYWRkIG9wZXJhdGlvbnMuCi8vLwovLy8gVGhlIHN0cnVjdHVyZSBpcyBlZmZpY2llbnQgZm9yIGFueSBxdWV1ZSBvciBzdGFjayB1c2FnZS4KY2xhc3MgTGlzdFF1ZXVlPEU+IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPEU+IGltcGxlbWVudHMgUXVldWU8RT4gewogIHN0YXRpYyBjb25zdCBpbnQgX0lOSVRJQUxfQ0FQQUNJVFkgPSA4OwogIExpc3Q8RT4gX3RhYmxlOwogIGludCBfaGVhZDsKICBpbnQgX3RhaWw7CiAgaW50IF9tb2RpZmljYXRpb25Db3VudCA9IDA7CgogIC8vLyBDcmVhdGUgYW4gZW1wdHkgcXVldWUuCiAgLy8vCiAgLy8vIElmIFtpbml0aWFsQ2FwYWNpdHldIGlzIGdpdmVuLCBwcmVwYXJlIHRoZSBxdWV1ZSBmb3IgYXQgbGVhc3QgdGhhdCBtYW55CiAgLy8vIGVsZW1lbnRzLgogIExpc3RRdWV1ZShbaW50IGluaXRpYWxDYXBhY2l0eV0pCiAgICAgIDogX2hlYWQgPSAwLAogICAgICAgIF90YWlsID0gMCB7CiAgICBpZiAoaW5pdGlhbENhcGFjaXR5ID09IG51bGwgfHwgaW5pdGlhbENhcGFjaXR5IDwgX0lOSVRJQUxfQ0FQQUNJVFkpIHsKICAgICAgaW5pdGlhbENhcGFjaXR5ID0gX0lOSVRJQUxfQ0FQQUNJVFk7CiAgICB9IGVsc2UgaWYgKCFfaXNQb3dlck9mMihpbml0aWFsQ2FwYWNpdHkpKSB7CiAgICAgIGluaXRpYWxDYXBhY2l0eSA9IF9uZXh0UG93ZXJPZjIoaW5pdGlhbENhcGFjaXR5KTsKICAgIH0KICAgIGFzc2VydChfaXNQb3dlck9mMihpbml0aWFsQ2FwYWNpdHkpKTsKICAgIF90YWJsZSA9IExpc3Q8RT4oaW5pdGlhbENhcGFjaXR5KTsKICB9CgogIC8vLyBDcmVhdGUgYSBgTGlzdFF1ZXVlYCBjb250YWluaW5nIGFsbCBbZWxlbWVudHNdLgogIC8vLwogIC8vLyBUaGUgZWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZSBxdWV1ZSwgYXMgYnkgW2FkZExhc3RdLCBpbiB0aGUgb3JkZXIgZ2l2ZW4KICAvLy8gYnkgYGVsZW1lbnRzLml0ZXJhdG9yYC4KICAvLy8KICAvLy8gQWxsIHRoZSBbZWxlbWVudHNdIHNob3VsZCBiZSBpbnN0YW5jZXMgb2YgW0VdLgogIC8vLyBUaGUgYGVsZW1lbnRzYCBpdGVyYWJsZSBpdHNlbGYgbWF5IGhhdmUgYW55IGVsZW1lbnQgdHlwZSwgc28gdGhpcwogIC8vLyBjb25zdHJ1Y3RvciBjYW4gYmUgdXNlZCB0byBkb3duLWNhc3QgYSBgUXVldWVgLCBmb3IgZXhhbXBsZSBhczoKICAvLy8gYGBgZGFydAogIC8vLyBRdWV1ZTxTdXBlclR5cGU+IHN1cGVyUXVldWUgPSAuLi47CiAgLy8vIFF1ZXVlPFN1YlR5cGU+IHN1YlF1ZXVlID0KICAvLy8gICAgIG5ldyBMaXN0UXVldWU8U3ViVHlwZT4uZnJvbShzdXBlclF1ZXVlLndoZXJlVHlwZTxTdWJUeXBlPigpKTsKICAvLy8gYGBgCiAgZmFjdG9yeSBMaXN0UXVldWUuZnJvbShJdGVyYWJsZSBlbGVtZW50cykgewogICAgaWYgKGVsZW1lbnRzIGlzIExpc3QpIHsKICAgICAgaW50IGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsKICAgICAgTGlzdFF1ZXVlPEU+IHF1ZXVlID0gTGlzdFF1ZXVlPEU+KGxlbmd0aCArIDEpOwogICAgICBhc3NlcnQocXVldWUuX3RhYmxlLmxlbmd0aCA+IGxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICBxdWV1ZS5fdGFibGVbaV0gPSBlbGVtZW50c1tpXTsKICAgICAgfQogICAgICBxdWV1ZS5fdGFpbCA9IGxlbmd0aDsKICAgICAgcmV0dXJuIHF1ZXVlOwogICAgfSBlbHNlIHsKICAgICAgaW50IGNhcGFjaXR5ID0gX0lOSVRJQUxfQ0FQQUNJVFk7CiAgICAgIGlmIChlbGVtZW50cyBpcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSkgewogICAgICAgIGNhcGFjaXR5ID0gZWxlbWVudHMubGVuZ3RoOwogICAgICB9CiAgICAgIExpc3RRdWV1ZTxFPiByZXN1bHQgPSBMaXN0UXVldWU8RT4oY2FwYWNpdHkpOwogICAgICBmb3IgKGZpbmFsIGVsZW1lbnQgaW4gZWxlbWVudHMpIHsKICAgICAgICByZXN1bHQuYWRkTGFzdChlbGVtZW50KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogIH0KCiAgLy8vIENyZWF0ZSBhIGBMaXN0UXVldWVgIGZyb20gW2VsZW1lbnRzXS4KICAvLy8KICAvLy8gVGhlIGVsZW1lbnRzIGFyZSBhZGRlZCB0byB0aGUgcXVldWUsIGFzIGJ5IFthZGRMYXN0XSwgaW4gdGhlIG9yZGVyIGdpdmVuCiAgLy8vIGJ5IGBlbGVtZW50cy5pdGVyYXRvcmAuCiAgZmFjdG9yeSBMaXN0UXVldWUub2YoSXRlcmFibGU8RT4gZWxlbWVudHMpID0+CiAgICAgIExpc3RRdWV1ZTxFPigpLi5hZGRBbGwoZWxlbWVudHMpOwoKICAvLyBJdGVyYWJsZSBpbnRlcmZhY2UuCgogIFF1ZXVlPFI+IGNhc3Q8Uj4oKSA9PiBRdWV1ZS5jYXN0RnJvbTxFLCBSPih0aGlzKTsKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gX0xpc3RRdWV1ZUl0ZXJhdG9yPEU+KHRoaXMpOwoKICB2b2lkIGZvckVhY2godm9pZCBmKEUgZWxlbWVudCkpIHsKICAgIGludCBtb2RpZmljYXRpb25Db3VudCA9IF9tb2RpZmljYXRpb25Db3VudDsKICAgIGZvciAoaW50IGkgPSBfaGVhZDsgaSAhPSBfdGFpbDsgaSA9IChpICsgMSkgJiAoX3RhYmxlLmxlbmd0aCAtIDEpKSB7CiAgICAgIGYoX3RhYmxlW2ldKTsKICAgICAgX2NoZWNrTW9kaWZpY2F0aW9uKG1vZGlmaWNhdGlvbkNvdW50KTsKICAgIH0KICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2hlYWQgPT0gX3RhaWw7CgogIGludCBnZXQgbGVuZ3RoID0+IChfdGFpbCAtIF9oZWFkKSAmIChfdGFibGUubGVuZ3RoIC0gMSk7CgogIEUgZ2V0IGZpcnN0IHsKICAgIGlmIChfaGVhZCA9PSBfdGFpbCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICByZXR1cm4gX3RhYmxlW19oZWFkXTsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgaWYgKF9oZWFkID09IF90YWlsKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHJldHVybiBfdGFibGVbKF90YWlsIC0gMSkgJiAoX3RhYmxlLmxlbmd0aCAtIDEpXTsKICB9CgogIEUgZ2V0IHNpbmdsZSB7CiAgICBpZiAoX2hlYWQgPT0gX3RhaWwpIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgaWYgKGxlbmd0aCA+IDEpIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb01hbnkoKTsKICAgIHJldHVybiBfdGFibGVbX2hlYWRdOwogIH0KCiAgRSBlbGVtZW50QXQoaW50IGluZGV4KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRJbmRleChpbmRleCwgdGhpcyk7CiAgICByZXR1cm4gX3RhYmxlWyhfaGVhZCArIGluZGV4KSAmIChfdGFibGUubGVuZ3RoIC0gMSldOwogIH0KCiAgTGlzdDxFPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGUgPSB0cnVlfSkgewogICAgTGlzdDxFPiBsaXN0OwogICAgaWYgKGdyb3dhYmxlKSB7CiAgICAgIGxpc3QgPSA8RT5bXS4ubGVuZ3RoID0gbGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgbGlzdCA9IExpc3Q8RT4obGVuZ3RoKTsKICAgIH0KICAgIF93cml0ZVRvTGlzdChsaXN0KTsKICAgIHJldHVybiBsaXN0OwogIH0KCiAgLy8gQ29sbGVjdGlvbiBpbnRlcmZhY2UuCgogIHZvaWQgYWRkKEUgdmFsdWUpIHsKICAgIF9hZGQodmFsdWUpOwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpIHsKICAgIGlmIChlbGVtZW50cyBpcyBMaXN0PEU+KSB7CiAgICAgIExpc3Q8RT4gbGlzdCA9IGVsZW1lbnRzOwogICAgICBpbnQgYWRkQ291bnQgPSBsaXN0Lmxlbmd0aDsKICAgICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAobGVuZ3RoICsgYWRkQ291bnQgPj0gX3RhYmxlLmxlbmd0aCkgewogICAgICAgIF9wcmVHcm93KGxlbmd0aCArIGFkZENvdW50KTsKICAgICAgICAvLyBBZnRlciBwcmVHcm93LCBhbGwgZWxlbWVudHMgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgbGlzdC4KICAgICAgICBfdGFibGUuc2V0UmFuZ2UobGVuZ3RoLCBsZW5ndGggKyBhZGRDb3VudCwgbGlzdCwgMCk7CiAgICAgICAgX3RhaWwgKz0gYWRkQ291bnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQWRkaW5nIGFkZENvdW50IGVsZW1lbnRzIHdvbid0IHJlYWNoIF9oZWFkLgogICAgICAgIGludCBlbmRTcGFjZSA9IF90YWJsZS5sZW5ndGggLSBfdGFpbDsKICAgICAgICBpZiAoYWRkQ291bnQgPCBlbmRTcGFjZSkgewogICAgICAgICAgX3RhYmxlLnNldFJhbmdlKF90YWlsLCBfdGFpbCArIGFkZENvdW50LCBsaXN0LCAwKTsKICAgICAgICAgIF90YWlsICs9IGFkZENvdW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbnQgcHJlU3BhY2UgPSBhZGRDb3VudCAtIGVuZFNwYWNlOwogICAgICAgICAgX3RhYmxlLnNldFJhbmdlKF90YWlsLCBfdGFpbCArIGVuZFNwYWNlLCBsaXN0LCAwKTsKICAgICAgICAgIF90YWJsZS5zZXRSYW5nZSgwLCBwcmVTcGFjZSwgbGlzdCwgZW5kU3BhY2UpOwogICAgICAgICAgX3RhaWwgPSBwcmVTcGFjZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgX21vZGlmaWNhdGlvbkNvdW50Kys7CiAgICB9IGVsc2UgewogICAgICBmb3IgKEUgZWxlbWVudCBpbiBlbGVtZW50cykgX2FkZChlbGVtZW50KTsKICAgIH0KICB9CgogIGJvb2wgcmVtb3ZlKE9iamVjdCB2YWx1ZSkgewogICAgZm9yIChpbnQgaSA9IF9oZWFkOyBpICE9IF90YWlsOyBpID0gKGkgKyAxKSAmIChfdGFibGUubGVuZ3RoIC0gMSkpIHsKICAgICAgRSBlbGVtZW50ID0gX3RhYmxlW2ldOwogICAgICBpZiAoZWxlbWVudCA9PSB2YWx1ZSkgewogICAgICAgIF9yZW1vdmUoaSk7CiAgICAgICAgX21vZGlmaWNhdGlvbkNvdW50Kys7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgX2ZpbHRlcldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCBib29sIHJlbW92ZU1hdGNoaW5nKSB7CiAgICBpbnQgbW9kaWZpY2F0aW9uQ291bnQgPSBfbW9kaWZpY2F0aW9uQ291bnQ7CiAgICBpbnQgaSA9IF9oZWFkOwogICAgd2hpbGUgKGkgIT0gX3RhaWwpIHsKICAgICAgRSBlbGVtZW50ID0gX3RhYmxlW2ldOwogICAgICBib29sIHJlbW92ZSA9IGlkZW50aWNhbChyZW1vdmVNYXRjaGluZywgdGVzdChlbGVtZW50KSk7CiAgICAgIF9jaGVja01vZGlmaWNhdGlvbihtb2RpZmljYXRpb25Db3VudCk7CiAgICAgIGlmIChyZW1vdmUpIHsKICAgICAgICBpID0gX3JlbW92ZShpKTsKICAgICAgICBtb2RpZmljYXRpb25Db3VudCA9ICsrX21vZGlmaWNhdGlvbkNvdW50OwogICAgICB9IGVsc2UgewogICAgICAgIGkgPSAoaSArIDEpICYgKF90YWJsZS5sZW5ndGggLSAxKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIFJlbW92ZSBhbGwgZWxlbWVudHMgbWF0Y2hlZCBieSBbdGVzdF0uCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIGluZWZmaWNpZW50IHNpbmNlIGl0IHdvcmtzIGJ5IHJlcGVhdGVkbHkgcmVtb3Zpbmcgc2luZ2xlCiAgLy8vIGVsZW1lbnRzLCBlYWNoIG9mIHdoaWNoIGNhbiB0YWtlIGxpbmVhciB0aW1lLgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIF9maWx0ZXJXaGVyZSh0ZXN0LCB0cnVlKTsKICB9CgogIC8vLyBSZW1vdmUgYWxsIGVsZW1lbnRzIG5vdCBtYXRjaGVkIGJ5IFt0ZXN0XS4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgaXMgaW5lZmZpY2llbnQgc2luY2UgaXQgd29ya3MgYnkgcmVwZWF0ZWRseSByZW1vdmluZyBzaW5nbGUKICAvLy8gZWxlbWVudHMsIGVhY2ggb2Ygd2hpY2ggY2FuIHRha2UgbGluZWFyIHRpbWUuCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgX2ZpbHRlcldoZXJlKHRlc3QsIGZhbHNlKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBpZiAoX2hlYWQgIT0gX3RhaWwpIHsKICAgICAgZm9yIChpbnQgaSA9IF9oZWFkOyBpICE9IF90YWlsOyBpID0gKGkgKyAxKSAmIChfdGFibGUubGVuZ3RoIC0gMSkpIHsKICAgICAgICBfdGFibGVbaV0gPSBudWxsOwogICAgICB9CiAgICAgIF9oZWFkID0gX3RhaWwgPSAwOwogICAgICBfbW9kaWZpY2F0aW9uQ291bnQrKzsKICAgIH0KICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+IEl0ZXJhYmxlQmFzZS5pdGVyYWJsZVRvRnVsbFN0cmluZyh0aGlzLCAieyIsICJ9Iik7CgogIC8vIFF1ZXVlIGludGVyZmFjZS4KCiAgdm9pZCBhZGRMYXN0KEUgdmFsdWUpIHsKICAgIF9hZGQodmFsdWUpOwogIH0KCiAgdm9pZCBhZGRGaXJzdChFIHZhbHVlKSB7CiAgICBfaGVhZCA9IChfaGVhZCAtIDEpICYgKF90YWJsZS5sZW5ndGggLSAxKTsKICAgIF90YWJsZVtfaGVhZF0gPSB2YWx1ZTsKICAgIGlmIChfaGVhZCA9PSBfdGFpbCkgX2dyb3coKTsKICAgIF9tb2RpZmljYXRpb25Db3VudCsrOwogIH0KCiAgRSByZW1vdmVGaXJzdCgpIHsKICAgIGlmIChfaGVhZCA9PSBfdGFpbCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICBfbW9kaWZpY2F0aW9uQ291bnQrKzsKICAgIEUgcmVzdWx0ID0gX3RhYmxlW19oZWFkXTsKICAgIF90YWJsZVtfaGVhZF0gPSBudWxsOwogICAgX2hlYWQgPSAoX2hlYWQgKyAxKSAmIChfdGFibGUubGVuZ3RoIC0gMSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRSByZW1vdmVMYXN0KCkgewogICAgaWYgKF9oZWFkID09IF90YWlsKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIF9tb2RpZmljYXRpb25Db3VudCsrOwogICAgX3RhaWwgPSAoX3RhaWwgLSAxKSAmIChfdGFibGUubGVuZ3RoIC0gMSk7CiAgICBFIHJlc3VsdCA9IF90YWJsZVtfdGFpbF07CiAgICBfdGFibGVbX3RhaWxdID0gbnVsbDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zLgoKICAvLy8gV2hldGhlciBbbnVtYmVyXSBpcyBhIHBvd2VyIG9mIHR3by4KICAvLy8KICAvLy8gT25seSB3b3JrcyBmb3IgcG9zaXRpdmUgbnVtYmVycy4KICBzdGF0aWMgYm9vbCBfaXNQb3dlck9mMihpbnQgbnVtYmVyKSA9PiAobnVtYmVyICYgKG51bWJlciAtIDEpKSA9PSAwOwoKICAvLy8gUm91bmRzIFtudW1iZXJdIHVwIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIuCiAgLy8vCiAgLy8vIElmIFtudW1iZXJdIGlzIGEgcG93ZXIgb2YgMiBhbHJlYWR5LCBpdCBpcyByZXR1cm5lZC4KICAvLy8KICAvLy8gT25seSB3b3JrcyBmb3IgcG9zaXRpdmUgbnVtYmVycy4KICBzdGF0aWMgaW50IF9uZXh0UG93ZXJPZjIoaW50IG51bWJlcikgewogICAgYXNzZXJ0KG51bWJlciA+IDApOwogICAgbnVtYmVyID0gKG51bWJlciA8PCAxKSAtIDE7CiAgICBmb3IgKDs7KSB7CiAgICAgIGludCBuZXh0TnVtYmVyID0gbnVtYmVyICYgKG51bWJlciAtIDEpOwogICAgICBpZiAobmV4dE51bWJlciA9PSAwKSByZXR1cm4gbnVtYmVyOwogICAgICBudW1iZXIgPSBuZXh0TnVtYmVyOwogICAgfQogIH0KCiAgLy8vIENoZWNrIGlmIHRoZSBxdWV1ZSBoYXMgYmVlbiBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLgogIHZvaWQgX2NoZWNrTW9kaWZpY2F0aW9uKGludCBleHBlY3RlZE1vZGlmaWNhdGlvbkNvdW50KSB7CiAgICBpZiAoZXhwZWN0ZWRNb2RpZmljYXRpb25Db3VudCAhPSBfbW9kaWZpY2F0aW9uQ291bnQpIHsKICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgfQogIH0KCiAgLy8vIEFkZHMgZWxlbWVudCBhdCBlbmQgb2YgcXVldWUuIFVzZWQgYnkgYm90aCBbYWRkXSBhbmQgW2FkZEFsbF0uCiAgdm9pZCBfYWRkKEUgZWxlbWVudCkgewogICAgX3RhYmxlW190YWlsXSA9IGVsZW1lbnQ7CiAgICBfdGFpbCA9IChfdGFpbCArIDEpICYgKF90YWJsZS5sZW5ndGggLSAxKTsKICAgIGlmIChfaGVhZCA9PSBfdGFpbCkgX2dyb3coKTsKICAgIF9tb2RpZmljYXRpb25Db3VudCsrOwogIH0KCiAgLy8vIFJlbW92ZXMgdGhlIGVsZW1lbnQgYXQgW29mZnNldF0gaW50byBbX3RhYmxlXS4KICAvLy8KICAvLy8gUmVtb3ZhbCBpcyBwZXJmb3JtZWQgYnkgbGluZWFybHkgbW92aW5nIGVsZW1lbnRzIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIKICAvLy8gW29mZnNldF0gYnkgb25lIHBvc2l0aW9uLgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSBuZXcgb2Zmc2V0IG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudC4gVGhpcyBtYXkgYmUgdGhlIHNhbWUKICAvLy8gb2Zmc2V0IG9yIHRoZSBmb2xsb3dpbmcgb2Zmc2V0IGRlcGVuZGluZyBvbiBob3cgZWxlbWVudHMgYXJlIG1vdmVkCiAgLy8vIHRvIGZpbGwgdGhlIGhvbGUuCiAgaW50IF9yZW1vdmUoaW50IG9mZnNldCkgewogICAgaW50IG1hc2sgPSBfdGFibGUubGVuZ3RoIC0gMTsKICAgIGludCBzdGFydERpc3RhbmNlID0gKG9mZnNldCAtIF9oZWFkKSAmIG1hc2s7CiAgICBpbnQgZW5kRGlzdGFuY2UgPSAoX3RhaWwgLSBvZmZzZXQpICYgbWFzazsKICAgIGlmIChzdGFydERpc3RhbmNlIDwgZW5kRGlzdGFuY2UpIHsKICAgICAgLy8gQ2xvc2VzdCB0byBzdGFydC4KICAgICAgaW50IGkgPSBvZmZzZXQ7CiAgICAgIHdoaWxlIChpICE9IF9oZWFkKSB7CiAgICAgICAgaW50IHByZXZPZmZzZXQgPSAoaSAtIDEpICYgbWFzazsKICAgICAgICBfdGFibGVbaV0gPSBfdGFibGVbcHJldk9mZnNldF07CiAgICAgICAgaSA9IHByZXZPZmZzZXQ7CiAgICAgIH0KICAgICAgX3RhYmxlW19oZWFkXSA9IG51bGw7CiAgICAgIF9oZWFkID0gKF9oZWFkICsgMSkgJiBtYXNrOwogICAgICByZXR1cm4gKG9mZnNldCArIDEpICYgbWFzazsKICAgIH0gZWxzZSB7CiAgICAgIF90YWlsID0gKF90YWlsIC0gMSkgJiBtYXNrOwogICAgICBpbnQgaSA9IG9mZnNldDsKICAgICAgd2hpbGUgKGkgIT0gX3RhaWwpIHsKICAgICAgICBpbnQgbmV4dE9mZnNldCA9IChpICsgMSkgJiBtYXNrOwogICAgICAgIF90YWJsZVtpXSA9IF90YWJsZVtuZXh0T2Zmc2V0XTsKICAgICAgICBpID0gbmV4dE9mZnNldDsKICAgICAgfQogICAgICBfdGFibGVbX3RhaWxdID0gbnVsbDsKICAgICAgcmV0dXJuIG9mZnNldDsKICAgIH0KICB9CgogIC8vLyBHcm93IHRoZSB0YWJsZSB3aGVuIGZ1bGwuCiAgdm9pZCBfZ3JvdygpIHsKICAgIExpc3Q8RT4gbmV3VGFibGUgPSBMaXN0PEU+KF90YWJsZS5sZW5ndGggKiAyKTsKICAgIGludCBzcGxpdCA9IF90YWJsZS5sZW5ndGggLSBfaGVhZDsKICAgIG5ld1RhYmxlLnNldFJhbmdlKDAsIHNwbGl0LCBfdGFibGUsIF9oZWFkKTsKICAgIG5ld1RhYmxlLnNldFJhbmdlKHNwbGl0LCBzcGxpdCArIF9oZWFkLCBfdGFibGUsIDApOwogICAgX2hlYWQgPSAwOwogICAgX3RhaWwgPSBfdGFibGUubGVuZ3RoOwogICAgX3RhYmxlID0gbmV3VGFibGU7CiAgfQoKICBpbnQgX3dyaXRlVG9MaXN0KExpc3Q8RT4gdGFyZ2V0KSB7CiAgICBhc3NlcnQodGFyZ2V0Lmxlbmd0aCA+PSBsZW5ndGgpOwogICAgaWYgKF9oZWFkIDw9IF90YWlsKSB7CiAgICAgIGludCBsZW5ndGggPSBfdGFpbCAtIF9oZWFkOwogICAgICB0YXJnZXQuc2V0UmFuZ2UoMCwgbGVuZ3RoLCBfdGFibGUsIF9oZWFkKTsKICAgICAgcmV0dXJuIGxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGludCBmaXJzdFBhcnRTaXplID0gX3RhYmxlLmxlbmd0aCAtIF9oZWFkOwogICAgICB0YXJnZXQuc2V0UmFuZ2UoMCwgZmlyc3RQYXJ0U2l6ZSwgX3RhYmxlLCBfaGVhZCk7CiAgICAgIHRhcmdldC5zZXRSYW5nZShmaXJzdFBhcnRTaXplLCBmaXJzdFBhcnRTaXplICsgX3RhaWwsIF90YWJsZSwgMCk7CiAgICAgIHJldHVybiBfdGFpbCArIGZpcnN0UGFydFNpemU7CiAgICB9CiAgfQoKICAvLy8gR3Jvd3MgdGhlIHRhYmxlIGV2ZW4gaWYgaXQgaXMgbm90IGZ1bGwuCiAgdm9pZCBfcHJlR3JvdyhpbnQgbmV3RWxlbWVudENvdW50KSB7CiAgICBhc3NlcnQobmV3RWxlbWVudENvdW50ID49IGxlbmd0aCk7CgogICAgLy8gQWRkIHNvbWUgZXh0cmEgcm9vbSB0byBlbnN1cmUgdGhhdCB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZWxlbWVudHMgYWZ0ZXIKICAgIC8vIGV4cGFuc2lvbi4KICAgIG5ld0VsZW1lbnRDb3VudCArPSBuZXdFbGVtZW50Q291bnQgPj4gMTsKICAgIGludCBuZXdDYXBhY2l0eSA9IF9uZXh0UG93ZXJPZjIobmV3RWxlbWVudENvdW50KTsKICAgIExpc3Q8RT4gbmV3VGFibGUgPSBMaXN0PEU+KG5ld0NhcGFjaXR5KTsKICAgIF90YWlsID0gX3dyaXRlVG9MaXN0KG5ld1RhYmxlKTsKICAgIF90YWJsZSA9IG5ld1RhYmxlOwogICAgX2hlYWQgPSAwOwogIH0KfQoKLy8vIEl0ZXJhdG9yIGZvciBhIFtMaXN0UXVldWVdLgovLy8KLy8vIENvbnNpZGVycyBhbnkgYWRkIG9yIHJlbW92ZSBvcGVyYXRpb24gYSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4KY2xhc3MgX0xpc3RRdWV1ZUl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogIGZpbmFsIExpc3RRdWV1ZTxFPiBfcXVldWU7CiAgZmluYWwgaW50IF9lbmQ7CiAgZmluYWwgaW50IF9tb2RpZmljYXRpb25Db3VudDsKICBpbnQgX3Bvc2l0aW9uOwogIEUgX2N1cnJlbnQ7CgogIF9MaXN0UXVldWVJdGVyYXRvcihMaXN0UXVldWU8RT4gcXVldWUpCiAgICAgIDogX3F1ZXVlID0gcXVldWUsCiAgICAgICAgX2VuZCA9IHF1ZXVlLl90YWlsLAogICAgICAgIF9tb2RpZmljYXRpb25Db3VudCA9IHF1ZXVlLl9tb2RpZmljYXRpb25Db3VudCwKICAgICAgICBfcG9zaXRpb24gPSBxdWV1ZS5faGVhZDsKCiAgRSBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIF9xdWV1ZS5fY2hlY2tNb2RpZmljYXRpb24oX21vZGlmaWNhdGlvbkNvdW50KTsKICAgIGlmIChfcG9zaXRpb24gPT0gX2VuZCkgewogICAgICBfY3VycmVudCA9IG51bGw7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIF9jdXJyZW50ID0gX3F1ZXVlLl90YWJsZVtfcG9zaXRpb25dOwogICAgX3Bvc2l0aW9uID0gKF9wb3NpdGlvbiArIDEpICYgKF9xdWV1ZS5fdGFibGUubGVuZ3RoIC0gMSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0Kg3kATk48ARkBSEcTBExNF04PSjtAFyIBMQZMPgY1SEYOKSBCCj0BJwZMPjwBKgZFJQZHSAZKTw47TgFPBkhHRQZKTEIaFgE7Bj4TATkGPhIBMhoBLBkBLBUBOgZFLR0BQ0MlAT0GPioBQQY+KgFNEAIBNBYSASkWHjUxBAETREQWGgQCAUg2USANASgBPBU5BAE+Fj0EAQ8PFAQBPT4BOTYCAUAESh5FOU4fRAEzARZEBAEXSAQBDwEdASoyKAQBLjYoBAIBOwQ6MkhDHwEVEDAEARYRMAQBEBMPFAQBDzAWBAE3EQQCAUYSMzpLLklQGhYEATQRBAFLECwEAUUTLAQCATwEQkUrGQEYNQQBPwZMPgY1SEYOKSBQCjYsIBcGEQQBNQZMPjgwATQjARofFQQBGx4VBAEWHxUEASYmIRcGBAETRCQVEwQBFEElFRMEARo8KyssLTEIFBkZFQgfBhIEATw8KyssLTEITDAZGQgUBgQBKxkEASsaBAEQQSAEAQ9EHwQBET07Qz4dBioEAToGTFAGQE4wKyIEATkGTE8GQU4wKiYEARU4BAERJSkXBAFIBkxKKQZRQjAGS01PTUogRjwrNDsyRksSFysgMjEIFAYEAS81BAFKAgE9KykOAUUeKQEULBcZGBQGPD07BiYpEQQBHQIBGARJTywEPUEqEg0NHgEdBk4QIxMUSiswOAYqJwQBNgZPHgY1SEYOKSBICi4cJDUsKScIHBQNKDEkCDQoIQgVBgQBLAZPHjAoARkBNDsBJDBJFC0GBAEmATsBEEAaBAEPQDYEARFAOhoEARstOgQBKxIUJQ0eBhgRBAEbARYRBAEmHx8iIDAlRT0bDzcuIz0dES49OBwKCBwNMQYEAR5JHR4UHhUIBhIEAUEwExkdPi0UGDIPKwgGBAEtBk40Kx4EATEGTjQrHwQBERpLGggZHAYEAUoBFgEaEQQBGy8bIRoEARRAGh4aLxMEARNAGi8eGhMEASABKgYnRwE0BjsGJykYIA8uKhsGBAE9OzsvBgQBRRkdLyEaBAE1Bk4gBkxJGBwiMS8nGxYbKSgYCBwiIg0iFhspKBgIHBUGBAEgETMnMDgPGxcEASUlGiIxFQ0xOEgkBgQBLicnAU8SLTYtJBcPBAIBIARFNR0SIBEOASkYHDchAR0BFDMdFxQGKT4RBAIBGmRhcnQ6Y29sbGVjdGlvbi9xdWV1ZS5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb252ZXJ0L2NvbnZlcnQuZGFydIm8Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLwovLy8gRW5jb2RlcnMgYW5kIGRlY29kZXJzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gZGlmZmVyZW50IGRhdGEgcmVwcmVzZW50YXRpb25zLAovLy8gaW5jbHVkaW5nIEpTT04gYW5kIFVURi04LgovLy8KLy8vIEluIGFkZGl0aW9uIHRvIGNvbnZlcnRlcnMgZm9yIGNvbW1vbiBkYXRhIHJlcHJlc2VudGF0aW9ucywgdGhpcyBsaWJyYXJ5Ci8vLyBwcm92aWRlcyBzdXBwb3J0IGZvciBpbXBsZW1lbnRpbmcgY29udmVydGVycyBpbiBhIHdheSB3aGljaCBtYWtlcyB0aGVtIGVhc3kgdG8KLy8vIGNoYWluIGFuZCB0byB1c2Ugd2l0aCBzdHJlYW1zLgovLy8KLy8vIFRvIHVzZSB0aGlzIGxpYnJhcnkgaW4geW91ciBjb2RlOgovLy8KLy8vICAgICBpbXBvcnQgJ2RhcnQ6Y29udmVydCc7Ci8vLwovLy8gVHdvIGNvbW1vbmx5IHVzZWQgY29udmVydGVycyBhcmUgdGhlIHRvcC1sZXZlbCBpbnN0YW5jZXMgb2YKLy8vIFtKc29uQ29kZWNdIGFuZCBbVXRmOENvZGVjXSwgbmFtZWQgW2pzb25dIGFuZCBbdXRmOF0sIHJlc3BlY3RpdmVseS4KLy8vCi8vLyBKU09OIGlzIGEgc2ltcGxlIHRleHQgZm9ybWF0IGZvciByZXByZXNlbnRpbmcKLy8vIHN0cnVjdHVyZWQgb2JqZWN0cyBhbmQgY29sbGVjdGlvbnMuCi8vLyBUaGUgSlNPTiBlbmNvZGVyL2RlY29kZXIgdHJhbnNmb3JtcyBiZXR3ZWVuIHN0cmluZ3MgYW5kCi8vLyBvYmplY3Qgc3RydWN0dXJlcywgc3VjaCBhcyBsaXN0cyBhbmQgbWFwcywgdXNpbmcgdGhlIEpTT04gZm9ybWF0LgovLy8KLy8vIFVURi04IGlzIGEgY29tbW9uIHZhcmlhYmxlLXdpZHRoIGVuY29kaW5nIHRoYXQgY2FuIHJlcHJlc2VudAovLy8gZXZlcnkgY2hhcmFjdGVyIGluIHRoZSBVbmljb2RlIGNoYXJhY3RlciBzZXQuCi8vLyBUaGUgVVRGLTggZW5jb2Rlci9kZWNvZGVyIHRyYW5zZm9ybXMgYmV0d2VlbiBTdHJpbmdzIGFuZCBieXRlcy4KLy8vCi8vLyBDb252ZXJ0ZXJzIGFyZSBvZnRlbiB1c2VkIHdpdGggc3RyZWFtcwovLy8gdG8gdHJhbnNmb3JtIHRoZSBkYXRhIHRoYXQgY29tZXMgdGhyb3VnaCB0aGUgc3RyZWFtCi8vLyBhcyBpdCBiZWNvbWVzIGF2YWlsYWJsZS4KLy8vIFRoZSBmb2xsb3dpbmcgY29kZSB1c2VzIHR3byBjb252ZXJ0ZXJzLgovLy8gVGhlIGZpcnN0IGlzIGEgVVRGLTggZGVjb2Rlciwgd2hpY2ggY29udmVydHMgdGhlIGRhdGEgZnJvbSBieXRlcyB0byBVVEYtOAovLy8gYXMgaXQncyByZWFkIGZyb20gYSBmaWxlLAovLy8gVGhlIHNlY29uZCBpcyBhbiBpbnN0YW5jZSBvZiBbTGluZVNwbGl0dGVyXSwKLy8vIHdoaWNoIHNwbGl0cyB0aGUgZGF0YSBvbiBuZXdsaW5lIGJvdW5kYXJpZXMuCi8vLwovLy8gICAgIHZhciBsaW5lTnVtYmVyID0gMTsKLy8vICAgICB2YXIgc3RyZWFtID0gRmlsZSgncXVvdGVzLnR4dCcpLm9wZW5SZWFkKCk7Ci8vLwovLy8gICAgIHN0cmVhbS50cmFuc2Zvcm0odXRmOC5kZWNvZGVyKQovLy8gICAgICAgICAgIC50cmFuc2Zvcm0oY29uc3QgTGluZVNwbGl0dGVyKCkpCi8vLyAgICAgICAgICAgLmxpc3RlbigobGluZSkgewovLy8gICAgICAgICAgICAgaWYgKHNob3dMaW5lTnVtYmVycykgewovLy8gICAgICAgICAgICAgICBzdGRvdXQud3JpdGUoJyR7bGluZU51bWJlcisrfSAnKTsKLy8vICAgICAgICAgICAgIH0KLy8vICAgICAgICAgICAgIHN0ZG91dC53cml0ZWxuKGxpbmUpOwovLy8gICAgICAgICAgIH0pOwovLy8KLy8vIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFtDb2RlY10gYW5kIFtDb252ZXJ0ZXJdIGNsYXNzZXMKLy8vIGZvciBpbmZvcm1hdGlvbiBhYm91dCBjcmVhdGluZyB5b3VyIG93biBjb252ZXJ0ZXJzLgovLy8KLy8vIHtAY2F0ZWdvcnkgQ29yZX0KbGlicmFyeSBkYXJ0LmNvbnZlcnQ7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CmltcG9ydCAnZGFydDpfaW50ZXJuYWwnIHNob3cgQ2FzdENvbnZlcnRlciwgcGFyc2VIZXhCeXRlOwoKcGFydCAnYXNjaWkuZGFydCc7CnBhcnQgJ2Jhc2U2NC5kYXJ0JzsKcGFydCAnYnl0ZV9jb252ZXJzaW9uLmRhcnQnOwpwYXJ0ICdjaHVua2VkX2NvbnZlcnNpb24uZGFydCc7CnBhcnQgJ2NvZGVjLmRhcnQnOwpwYXJ0ICdjb252ZXJ0ZXIuZGFydCc7CnBhcnQgJ2VuY29kaW5nLmRhcnQnOwpwYXJ0ICdodG1sX2VzY2FwZS5kYXJ0JzsKcGFydCAnanNvbi5kYXJ0JzsKcGFydCAnbGF0aW4xLmRhcnQnOwpwYXJ0ICdsaW5lX3NwbGl0dGVyLmRhcnQnOwpwYXJ0ICdzdHJpbmdfY29udmVyc2lvbi5kYXJ0JzsKcGFydCAndXRmLmRhcnQnOwpKAE5OPAEEUR4ETFMjBCYEHwRASAQyKDxGBEEyRAQrOB0sTh4xMQQcNAQnLx8nNBImEgRCOAQVFgEVGjoBExQdIBMXFhkSFBsfEQEMZGFydDpjb252ZXJ0Mm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvY29udmVydF9wYXRjaC5kYXJ0wADnsi8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gTm90ZTogdGhlIFZNIGNvbmNhdGVuYXRlcyBhbGwgcGF0Y2ggZmlsZXMgaW50byBhIHNpbmdsZSBwYXRjaCBmaWxlLiBUaGlzCi8vLyBmaWxlIGlzIHRoZSBmaXJzdCBwYXRjaCBpbiAiZGFydDpjb252ZXJ0IiB3aGljaCBjb250YWlucyBhbGwgdGhlIGltcG9ydHMKLy8vIHVzZWQgYnkgcGF0Y2hlcyBvZiB0aGF0IGxpYnJhcnkuIFdlIHBsYW4gdG8gY2hhbmdlIHRoaXMgd2hlbiB3ZSBoYXZlIGEKLy8vIHNoYXJlZCBmcm9udCBlbmQgYW5kIHNpbXBseSB1c2UgcGFydHMuCgppbXBvcnQgImRhcnQ6X2ludGVybmFsIiBzaG93IFBPV0VSU19PRl9URU4sIHBhdGNoLCBDbGFzc0lEOwoKaW1wb3J0ICJkYXJ0OnR5cGVkX2RhdGEiIHNob3cgVWludDhMaXN0LCBVaW50MTZMaXN0OwoKLy8vIFRoaXMgcGF0Y2ggbGlicmFyeSBoYXMgbm8gYWRkaXRpb25hbCBwYXJ0cy4KCi8vIEpTT04gY29udmVyc2lvbi4KCkBwYXRjaApfcGFyc2VKc29uKFN0cmluZyBzb3VyY2UsIHJldml2ZXIoa2V5LCB2YWx1ZSkpIHsKICBfQnVpbGRKc29uTGlzdGVuZXIgbGlzdGVuZXI7CiAgaWYgKHJldml2ZXIgPT0gbnVsbCkgewogICAgbGlzdGVuZXIgPSBuZXcgX0J1aWxkSnNvbkxpc3RlbmVyKCk7CiAgfSBlbHNlIHsKICAgIGxpc3RlbmVyID0gbmV3IF9SZXZpdmVySnNvbkxpc3RlbmVyKHJldml2ZXIpOwogIH0KICB2YXIgcGFyc2VyID0gbmV3IF9Kc29uU3RyaW5nUGFyc2VyKGxpc3RlbmVyKTsKICBwYXJzZXIuY2h1bmsgPSBzb3VyY2U7CiAgcGFyc2VyLmNodW5rRW5kID0gc291cmNlLmxlbmd0aDsKICBwYXJzZXIucGFyc2UoMCk7CiAgcGFyc2VyLmNsb3NlKCk7CiAgcmV0dXJuIGxpc3RlbmVyLnJlc3VsdDsKfQoKQHBhdGNoCmNsYXNzIFV0ZjhEZWNvZGVyIHsKICBAcGF0Y2gKICBDb252ZXJ0ZXI8TGlzdDxpbnQ+LCBUPiBmdXNlPFQ+KENvbnZlcnRlcjxTdHJpbmcsIFQ+IG5leHQpIHsKICAgIGlmIChuZXh0IGlzIEpzb25EZWNvZGVyKSB7CiAgICAgIHJldHVybiBuZXcgX0pzb25VdGY4RGVjb2RlcigKICAgICAgICAgICAgICAobmV4dCBhcyBKc29uRGVjb2RlcikuX3Jldml2ZXIsIHRoaXMuX2FsbG93TWFsZm9ybWVkKQogICAgICAgICAgYXMgZHluYW1pYy8qPUNvbnZlcnRlcjxMaXN0PGludD4sIFQ+Ki87CiAgICB9CiAgICAvLyBUT0RPKGxybik6IFJlY29nbml6ZSBhIGZ1c2VkIGRlY29kZXIgd2hlcmUgdGhlIG5leHQgc3RlcCBpcyBKc29uRGVjb2Rlci4KICAgIHJldHVybiBzdXBlci5mdXNlPFQ+KG5leHQpOwogIH0KCiAgLy8gQWxsb3cgaW50ZXJjZXB0aW5nIG9mIFVURi04IGRlY29kaW5nIHdoZW4gYnVpbHQtaW4gbGlzdHMgYXJlIHBhc3NlZC4KICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIF9jb252ZXJ0SW50ZXJjZXB0ZWQoCiAgICAgIGJvb2wgYWxsb3dNYWxmb3JtZWQsIExpc3Q8aW50PiBjb2RlVW5pdHMsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgcmV0dXJuIG51bGw7IC8vIFRoaXMgY2FsbCB3YXMgbm90IGludGVyY2VwdGVkLgogIH0KfQoKY2xhc3MgX0pzb25VdGY4RGVjb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIE9iamVjdD4gewogIGZpbmFsIEZ1bmN0aW9uKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgX3Jldml2ZXI7CiAgZmluYWwgYm9vbCBfYWxsb3dNYWxmb3JtZWQ7CgogIF9Kc29uVXRmOERlY29kZXIodGhpcy5fcmV2aXZlciwgdGhpcy5fYWxsb3dNYWxmb3JtZWQpOwoKICBPYmplY3QgY29udmVydChMaXN0PGludD4gaW5wdXQpIHsKICAgIHZhciBwYXJzZXIgPSBfSnNvblV0ZjhEZWNvZGVyU2luay5fY3JlYXRlUGFyc2VyKF9yZXZpdmVyLCBfYWxsb3dNYWxmb3JtZWQpOwogICAgcGFyc2VyLmNodW5rID0gaW5wdXQ7CiAgICBwYXJzZXIuY2h1bmtFbmQgPSBpbnB1dC5sZW5ndGg7CiAgICBwYXJzZXIucGFyc2UoMCk7CiAgICBwYXJzZXIuY2xvc2UoKTsKICAgIHJldHVybiBwYXJzZXIucmVzdWx0OwogIH0KCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxPYmplY3Q+IHNpbmspIHsKICAgIHJldHVybiBuZXcgX0pzb25VdGY4RGVjb2RlclNpbmsoX3Jldml2ZXIsIHNpbmssIF9hbGxvd01hbGZvcm1lZCk7CiAgfQp9CgovLy8vIEltcGxlbWVudGF0aW9uIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovLyBTaW1wbGUgQVBJIGZvciBKU09OIHBhcnNpbmcuCgovKioKICogTGlzdGVuZXIgZm9yIHBhcnNpbmcgZXZlbnRzIGZyb20gW19DaHVua2VkSnNvblBhcnNlcl0uCiAqLwphYnN0cmFjdCBjbGFzcyBfSnNvbkxpc3RlbmVyIHsKICB2b2lkIGhhbmRsZVN0cmluZyhTdHJpbmcgdmFsdWUpIHt9CiAgdm9pZCBoYW5kbGVOdW1iZXIobnVtIHZhbHVlKSB7fQogIHZvaWQgaGFuZGxlQm9vbChib29sIHZhbHVlKSB7fQogIHZvaWQgaGFuZGxlTnVsbCgpIHt9CiAgdm9pZCBiZWdpbk9iamVjdCgpIHt9CiAgdm9pZCBwcm9wZXJ0eU5hbWUoKSB7fQogIHZvaWQgcHJvcGVydHlWYWx1ZSgpIHt9CiAgdm9pZCBlbmRPYmplY3QoKSB7fQogIHZvaWQgYmVnaW5BcnJheSgpIHt9CiAgdm9pZCBhcnJheUVsZW1lbnQoKSB7fQogIHZvaWQgZW5kQXJyYXkoKSB7fQoKICAvKioKICAgKiBSZWFkIG91dCB0aGUgZmluYWwgcmVzdWx0IG9mIHBhcnNpbmcgYSBKU09OIHN0cmluZy4KICAgKgogICAqIE11c3Qgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgZW50aXJlIGlucHV0IGhhcyBiZWVuIHBhcnNlZC4KICAgKi8KICBnZXQgcmVzdWx0Owp9CgovKioKICogQSBbX0pzb25MaXN0ZW5lcl0gdGhhdCBidWlsZHMgZGF0YSBvYmplY3RzIGZyb20gdGhlIHBhcnNlciBldmVudHMuCiAqCiAqIFRoaXMgaXMgYSBzaW1wbGUgc3RhY2stYmFzZWQgb2JqZWN0IGJ1aWxkZXIuIEl0IGtlZXBzIHRoZSBtb3N0IHJlY2VudGx5CiAqIHNlZW4gdmFsdWUgaW4gYSB2YXJpYWJsZSwgYW5kIHVzZXMgaXQgZGVwZW5kaW5nIG9uIHRoZSBmb2xsb3dpbmcgZXZlbnQuCiAqLwpjbGFzcyBfQnVpbGRKc29uTGlzdGVuZXIgZXh0ZW5kcyBfSnNvbkxpc3RlbmVyIHsKICAvKioKICAgKiBTdGFjayB1c2VkIHRvIGhhbmRsZSBuZXN0ZWQgY29udGFpbmVycy4KICAgKgogICAqIFRoZSBjdXJyZW50IGNvbnRhaW5lciBpcyBwdXNoZWQgb24gdGhlIHN0YWNrIHdoZW4gYSBuZXcgb25lIGlzCiAgICogc3RhcnRlZC4gSWYgdGhlIGNvbnRhaW5lciBpcyBhIFtNYXBdLCB0aGVyZSBpcyBhbHNvIGEgY3VycmVudCBba2V5XQogICAqIHdoaWNoIGlzIGFsc28gc3RvcmVkIG9uIHRoZSBzdGFjay4KICAgKi8KICBMaXN0IHN0YWNrID0gW107CiAgLyoqIFRoZSBjdXJyZW50IFtNYXBdIG9yIFtMaXN0XSBiZWluZyBidWlsdC4gKi8KICB2YXIgY3VycmVudENvbnRhaW5lcjsKICAvKiogVGhlIG1vc3QgcmVjZW50bHkgcmVhZCBwcm9wZXJ0eSBrZXkuICovCiAgU3RyaW5nIGtleTsKICAvKiogVGhlIG1vc3QgcmVjZW50bHkgcmVhZCB2YWx1ZS4gKi8KICB2YXIgdmFsdWU7CgogIC8qKiBQdXNoZXMgdGhlIGN1cnJlbnRseSBhY3RpdmUgY29udGFpbmVyIChhbmQga2V5LCBpZiBhIFtNYXBdKS4gKi8KICB2b2lkIHB1c2hDb250YWluZXIoKSB7CiAgICBpZiAoY3VycmVudENvbnRhaW5lciBpcyBNYXApIHN0YWNrLmFkZChrZXkpOwogICAgc3RhY2suYWRkKGN1cnJlbnRDb250YWluZXIpOwogIH0KCiAgLyoqIFBvcHMgdGhlIHRvcCBjb250YWluZXIgZnJvbSB0aGUgW3N0YWNrXSwgaW5jbHVkaW5nIGEga2V5IGlmIGFwcGxpY2FibGUuICovCiAgdm9pZCBwb3BDb250YWluZXIoKSB7CiAgICB2YWx1ZSA9IGN1cnJlbnRDb250YWluZXI7CiAgICBjdXJyZW50Q29udGFpbmVyID0gc3RhY2sucmVtb3ZlTGFzdCgpOwogICAgaWYgKGN1cnJlbnRDb250YWluZXIgaXMgTWFwKSBrZXkgPSBzdGFjay5yZW1vdmVMYXN0KCk7CiAgfQoKICB2b2lkIGhhbmRsZVN0cmluZyhTdHJpbmcgdmFsdWUpIHsKICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICB9CgogIHZvaWQgaGFuZGxlTnVtYmVyKG51bSB2YWx1ZSkgewogICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogIH0KCiAgdm9pZCBoYW5kbGVCb29sKGJvb2wgdmFsdWUpIHsKICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICB9CgogIHZvaWQgaGFuZGxlTnVsbCgpIHsKICAgIHRoaXMudmFsdWUgPSBudWxsOwogIH0KCiAgdm9pZCBiZWdpbk9iamVjdCgpIHsKICAgIHB1c2hDb250YWluZXIoKTsKICAgIGN1cnJlbnRDb250YWluZXIgPSA8U3RyaW5nLCBkeW5hbWljPnt9OwogIH0KCiAgdm9pZCBwcm9wZXJ0eU5hbWUoKSB7CiAgICBrZXkgPSB2YWx1ZTsKICAgIHZhbHVlID0gbnVsbDsKICB9CgogIHZvaWQgcHJvcGVydHlWYWx1ZSgpIHsKICAgIE1hcCBtYXAgPSBjdXJyZW50Q29udGFpbmVyOwogICAgbWFwW2tleV0gPSB2YWx1ZTsKICAgIGtleSA9IHZhbHVlID0gbnVsbDsKICB9CgogIHZvaWQgZW5kT2JqZWN0KCkgewogICAgcG9wQ29udGFpbmVyKCk7CiAgfQoKICB2b2lkIGJlZ2luQXJyYXkoKSB7CiAgICBwdXNoQ29udGFpbmVyKCk7CiAgICBjdXJyZW50Q29udGFpbmVyID0gW107CiAgfQoKICB2b2lkIGFycmF5RWxlbWVudCgpIHsKICAgIGN1cnJlbnRDb250YWluZXIuYWRkKHZhbHVlKTsKICAgIHZhbHVlID0gbnVsbDsKICB9CgogIHZvaWQgZW5kQXJyYXkoKSB7CiAgICBwb3BDb250YWluZXIoKTsKICB9CgogIC8qKiBSZWFkIG91dCB0aGUgZmluYWwgcmVzdWx0IG9mIHBhcnNpbmcgYSBKU09OIHN0cmluZy4gKi8KICBnZXQgcmVzdWx0IHsKICAgIGFzc2VydChjdXJyZW50Q29udGFpbmVyID09IG51bGwpOwogICAgcmV0dXJuIHZhbHVlOwogIH0KfQoKY2xhc3MgX1Jldml2ZXJKc29uTGlzdGVuZXIgZXh0ZW5kcyBfQnVpbGRKc29uTGlzdGVuZXIgewogIGZpbmFsIEZ1bmN0aW9uKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgcmV2aXZlcjsKICBfUmV2aXZlckpzb25MaXN0ZW5lcih0aGlzLnJldml2ZXIpOwoKICB2b2lkIGFycmF5RWxlbWVudCgpIHsKICAgIExpc3QgbGlzdCA9IGN1cnJlbnRDb250YWluZXI7CiAgICB2YWx1ZSA9IHJldml2ZXIobGlzdC5sZW5ndGgsIHZhbHVlKTsKICAgIHN1cGVyLmFycmF5RWxlbWVudCgpOwogIH0KCiAgdm9pZCBwcm9wZXJ0eVZhbHVlKCkgewogICAgdmFsdWUgPSByZXZpdmVyKGtleSwgdmFsdWUpOwogICAgc3VwZXIucHJvcGVydHlWYWx1ZSgpOwogIH0KCiAgZ2V0IHJlc3VsdCB7CiAgICByZXR1cm4gcmV2aXZlcihudWxsLCB2YWx1ZSk7CiAgfQp9CgovKioKICogQnVmZmVyIGhvbGRpbmcgcGFydHMgb2YgYSBudW1lcmFsLgogKgogKiBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSBjaGFyYWN0ZXJzIG9mIGEgSlNPTiBudW1iZXIuCiAqIFRoZXNlIGFyZSBhbGwgQVNDSUksIHNvIGFuIFtVaW50OExpc3RdIGlzIHVzZWQgYXMgYmFja2luZyBzdG9yZS4KICoKICogVGhpcyBidWZmZXIgaXMgdXNlZCB3aGVuIGEgSlNPTiBudW1iZXIgaXMgc3BsaXQgYmV0d2VlbiBzZXBhcmF0ZSBjaHVua3MuCiAqCiAqLwpjbGFzcyBfTnVtYmVyQnVmZmVyIHsKICBzdGF0aWMgY29uc3QgaW50IG1pbkNhcGFjaXR5ID0gMTY7CiAgc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdE92ZXJoZWFkID0gNTsKICBVaW50OExpc3QgbGlzdDsKICBpbnQgbGVuZ3RoID0gMDsKICBfTnVtYmVyQnVmZmVyKGludCBpbml0aWFsQ2FwYWNpdHkpCiAgICAgIDogbGlzdCA9IG5ldyBVaW50OExpc3QoX2luaXRpYWxDYXBhY2l0eShpbml0aWFsQ2FwYWNpdHkpKTsKCiAgaW50IGdldCBjYXBhY2l0eSA9PiBsaXN0Lmxlbmd0aDsKCiAgLy8gUGljayBhbiBpbml0aWFsIGNhcGFjaXR5IGdyZWF0ZXIgdGhhbiB0aGUgZmlyc3QgcGFydCdzIHNpemUuCiAgLy8gVGhlIHR5cGljYWwgdXNlIGNhc2UgaGFzIHR3byBwYXJ0cywgdGhpcyBpcyB0aGUgYXR0ZW1wdCBhdAogIC8vIGd1ZXNzaW5nIHRoZSBzaXplIG9mIHRoZSBzZWNvbmQgcGFydCB3aXRob3V0IG92ZXJkb2luZyBpdC4KICAvLyBUaGUgZGVmYXVsdCBlc3RpbWF0ZSBvZiB0aGUgc2Vjb25kIHBhcnQgaXMgW2tEZWZhdWx0T3ZlcmhlYWRdLAogIC8vIHRoZW4gcm91bmQgdG8gbXVsdGlwbHVtIG9mIGZvdXIsIGFuZCByZXR1cm4gdGhlIHJlc3VsdCwKICAvLyBvciBbbWluQ2FwYWNpdHldIGlmIHRoYXQgaXMgZ3JlYXRlci4KICBzdGF0aWMgaW50IF9pbml0aWFsQ2FwYWNpdHkoaW50IG1pbkNhcGFjaXR5KSB7CiAgICBtaW5DYXBhY2l0eSArPSBrRGVmYXVsdE92ZXJoZWFkOwogICAgaWYgKG1pbkNhcGFjaXR5IDwgbWluQ2FwYWNpdHkpIHJldHVybiBtaW5DYXBhY2l0eTsKICAgIG1pbkNhcGFjaXR5ID0gKG1pbkNhcGFjaXR5ICsgMykgJiB+MzsgLy8gUm91bmQgdG8gbXVsdGlwbGUgb2YgZm91ci4KICAgIHJldHVybiBtaW5DYXBhY2l0eTsKICB9CgogIC8vIEdyb3dzIHRvIHRoZSBleGFjdCBzaXplIGFza2VkIGZvci4KICB2b2lkIGVuc3VyZUNhcGFjaXR5KGludCBuZXdDYXBhY2l0eSkgewogICAgVWludDhMaXN0IGxpc3QgPSB0aGlzLmxpc3Q7CiAgICBpZiAobmV3Q2FwYWNpdHkgPD0gbGlzdC5sZW5ndGgpIHJldHVybjsKICAgIFVpbnQ4TGlzdCBuZXdMaXN0ID0gbmV3IFVpbnQ4TGlzdChuZXdDYXBhY2l0eSk7CiAgICBuZXdMaXN0LnNldFJhbmdlKDAsIGxpc3QubGVuZ3RoLCBsaXN0LCAwKTsKICAgIHRoaXMubGlzdCA9IG5ld0xpc3Q7CiAgfQoKICBTdHJpbmcgZ2V0U3RyaW5nKCkgewogICAgU3RyaW5nIHJlc3VsdCA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhsaXN0LCAwLCBsZW5ndGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIFRPRE8obHJuKTogU2VlIGlmIHBhcnNpbmcgb2YgbnVtYmVycyBjYW4gYmUgYWJzdHJhY3RlZCB0byBzb21ldGhpbmcKICAvLyBub3Qgb25seSB3b3JraW5nIG9uIHN0cmluZ3MsIGJ1dCBhbHNvIG9uIGNoYXItY29kZSBsaXN0cywgd2l0aG91dCBsb3NzaW5nCiAgLy8gcGVyZm9ybWFuY2UuCiAgbnVtIHBhcnNlTnVtKCkgPT4gbnVtLnBhcnNlKGdldFN0cmluZygpKTsKICBkb3VibGUgcGFyc2VEb3VibGUoKSA9PiBkb3VibGUucGFyc2UoZ2V0U3RyaW5nKCkpOwp9CgovKioKICogQ2h1bmtlZCBKU09OIHBhcnNlci4KICoKICogUmVjZWl2ZXMgaW5wdXRzIGluIGNodW5rcywgZ2l2ZXMgYWNjZXNzIHRvIGluZGl2aWR1YWwgcGFydHMgb2YgdGhlIGlucHV0LAogKiBhbmQgc3RvcmVzIGlucHV0IHN0YXRlIGJldHdlZW4gY2h1bmtzLgogKgogKiBJbXBsZW1lbnRhdGlvbnMgaW5jbHVkZSBbU3RyaW5nXSBhbmQgVVRGLTggcGFyc2Vycy4KICovCmFic3RyYWN0IGNsYXNzIF9DaHVua2VkSnNvblBhcnNlcjxUPiB7CiAgLy8gQSBzaW1wbGUgbm9uLXJlY3Vyc2l2ZSBzdGF0ZS1iYXNlZCBwYXJzZXIgZm9yIEpTT04uCiAgLy8KICAvLyBMaXRlcmFsIHZhbHVlcyBhY2NlcHRlZCBpbiBzdGF0ZXMgQVJSQVlfRU1QVFksIEFSUkFZX0NPTU1BLCBPQkpFQ1RfQ09MT04KICAvLyBhbmQgc3RyaW5ncyBhbHNvIGluIE9CSkVDVF9FTVBUWSwgT0JKRUNUX0NPTU1BLgogIC8vICAgICAgICAgICAgICAgVkFMVUUgIFNUUklORyAgOiAgLCAgfSAgXSAgICAgICAgVHJhbnNpdGlvbnMgdG8KICAvLyBFTVBUWSAgICAgICAgICAgIFggICAgICBYICAgICAgICAgICAgICAgICAgIC0+IEVORAogIC8vIEFSUkFZX0VNUFRZICAgICAgWCAgICAgIFggICAgICAgICAgICAgQCAgICAgLT4gQVJSQVlfVkFMVUUgLyBwb3AKICAvLyBBUlJBWV9WQUxVRSAgICAgICAgICAgICAgICAgICAgIEAgICAgIEAgICAgIC0+IEFSUkFZX0NPTU1BIC8gcG9wCiAgLy8gQVJSQVlfQ09NTUEgICAgICBYICAgICAgWCAgICAgICAgICAgICAgICAgICAtPiBBUlJBWV9WQUxVRQogIC8vIE9CSkVDVF9FTVBUWSAgICAgICAgICAgIFggICAgICAgICAgQCAgICAgICAgLT4gT0JKRUNUX0tFWSAvIHBvcAogIC8vIE9CSkVDVF9LRVkgICAgICAgICAgICAgICAgICAgQCAgICAgICAgICAgICAgLT4gT0JKRUNUX0NPTE9OCiAgLy8gT0JKRUNUX0NPTE9OICAgICBYICAgICAgWCAgICAgICAgICAgICAgICAgICAtPiBPQkpFQ1RfVkFMVUUKICAvLyBPQkpFQ1RfVkFMVUUgICAgICAgICAgICAgICAgICAgIEAgIEAgICAgICAgIC0+IE9CSkVDVF9DT01NQSAvIHBvcAogIC8vIE9CSkVDVF9DT01NQSAgICAgICAgICAgIFggICAgICAgICAgICAgICAgICAgLT4gT0JKRUNUX0tFWQogIC8vIEVORAogIC8vIFN0YXJ0aW5nIGEgbmV3IGFycmF5IG9yIG9iamVjdCB3aWxsIHB1c2ggdGhlIGN1cnJlbnQgc3RhdGUuIFRoZSAicG9wIgogIC8vIGFib3ZlIG1lYW5zIHJlc3RvcmluZyB0aGlzIHN0YXRlIGFuZCB0aGVuIG1hcmtpbmcgaXQgYXMgYW4gZW5kZWQgdmFsdWUuCiAgLy8gWCBtZWFucyBnZW5lcmljIGhhbmRsaW5nLCBAIG1lYW5zIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGp1c3QgdGhhdAogIC8vIHN0YXRlIC0gdGhhdCBpcywgdmFsdWVzIGFyZSBoYW5kbGVkIGdlbmVyaWNhbGx5LCBvbmx5IHB1bmN0dWF0aW9uCiAgLy8gY2FyZXMgYWJvdXQgdGhlIGN1cnJlbnQgc3RhdGUuCiAgLy8gVmFsdWVzIGZvciBzdGF0ZXMgYXJlIGNob3NlbiBzbyBiaXRzIDAgYW5kIDEgdGVsbCB3aGV0aGVyCiAgLy8gYSBzdHJpbmcvdmFsdWUgaXMgYWxsb3dlZCwgYW5kIHNldHRpbmcgYml0cyAwIHRocm91Z2ggMiBhZnRlciBhIHZhbHVlCiAgLy8gZ2V0cyB0byB0aGUgbmV4dCBzdGF0ZSAobm90IGVtcHR5LCBkb2Vzbid0IGFsbG93IGEgdmFsdWUpLgoKICAvLyBTdGF0ZSBidWlsZGluZy1ibG9jayBjb25zdGFudHMuCiAgc3RhdGljIGNvbnN0IGludCBUT1BfTEVWRUwgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgSU5TSURFX0FSUkFZID0gMTsKICBzdGF0aWMgY29uc3QgaW50IElOU0lERV9PQkpFQ1QgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgQUZURVJfQ09MT04gPSAzOyAvLyBBbHdheXMgaW5zaWRlIG9iamVjdC4KCiAgc3RhdGljIGNvbnN0IGludCBBTExPV19TVFJJTkdfTUFTSyA9IDg7IC8vIEFsbG93ZWQgaWYgemVyby4KICBzdGF0aWMgY29uc3QgaW50IEFMTE9XX1ZBTFVFX01BU0sgPSA0OyAvLyBBbGxvd2VkIGlmIHplcm8uCiAgc3RhdGljIGNvbnN0IGludCBBTExPV19WQUxVRSA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBTVFJJTkdfT05MWSA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBOT19WQUxVRVMgPSAxMjsKCiAgLy8gT2JqZWN0cyBhbmQgYXJyYXlzIGFyZSAiZW1wdHkiIHVudGlsIHRoZWlyIGZpcnN0IHByb3BlcnR5L2VsZW1lbnQuCiAgLy8gQXQgdGhpcyBwb3NpdGlvbiwgdGhleSBtYXkgZWl0aGVyIGhhdmUgYW4gZW50cnkgb3IgYSBjbG9zZS1icmFja2V0LgogIHN0YXRpYyBjb25zdCBpbnQgRU1QVFkgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgTk9OX0VNUFRZID0gMTY7CiAgc3RhdGljIGNvbnN0IGludCBFTVBUWV9NQVNLID0gMTY7IC8vIEVtcHR5IGlmIHplcm8uCgogIC8vIEFjdHVhbCBzdGF0ZXMgICAgICAgICAgICAgICA6IENvbnRleHQgfCBJcyBlbXB0eT8gfCBOZXh0PwogIHN0YXRpYyBjb25zdCBpbnQgU1RBVEVfSU5JVElBTCA9IFRPUF9MRVZFTCB8IEVNUFRZIHwgQUxMT1dfVkFMVUU7CiAgc3RhdGljIGNvbnN0IGludCBTVEFURV9FTkQgPSBUT1BfTEVWRUwgfCBOT05fRU1QVFkgfCBOT19WQUxVRVM7CgogIHN0YXRpYyBjb25zdCBpbnQgU1RBVEVfQVJSQVlfRU1QVFkgPSBJTlNJREVfQVJSQVkgfCBFTVBUWSB8IEFMTE9XX1ZBTFVFOwogIHN0YXRpYyBjb25zdCBpbnQgU1RBVEVfQVJSQVlfVkFMVUUgPSBJTlNJREVfQVJSQVkgfCBOT05fRU1QVFkgfCBOT19WQUxVRVM7CiAgc3RhdGljIGNvbnN0IGludCBTVEFURV9BUlJBWV9DT01NQSA9IElOU0lERV9BUlJBWSB8IE5PTl9FTVBUWSB8IEFMTE9XX1ZBTFVFOwoKICBzdGF0aWMgY29uc3QgaW50IFNUQVRFX09CSkVDVF9FTVBUWSA9IElOU0lERV9PQkpFQ1QgfCBFTVBUWSB8IFNUUklOR19PTkxZOwogIHN0YXRpYyBjb25zdCBpbnQgU1RBVEVfT0JKRUNUX0tFWSA9IElOU0lERV9PQkpFQ1QgfCBOT05fRU1QVFkgfCBOT19WQUxVRVM7CiAgc3RhdGljIGNvbnN0IGludCBTVEFURV9PQkpFQ1RfQ09MT04gPSBBRlRFUl9DT0xPTiB8IE5PTl9FTVBUWSB8IEFMTE9XX1ZBTFVFOwogIHN0YXRpYyBjb25zdCBpbnQgU1RBVEVfT0JKRUNUX1ZBTFVFID0gQUZURVJfQ09MT04gfCBOT05fRU1QVFkgfCBOT19WQUxVRVM7CiAgc3RhdGljIGNvbnN0IGludCBTVEFURV9PQkpFQ1RfQ09NTUEgPSBJTlNJREVfT0JKRUNUIHwgTk9OX0VNUFRZIHwgU1RSSU5HX09OTFk7CgogIC8vIEJpdHMgc2V0IGluIHN0YXRlIGFmdGVyIHN1Y2Nlc3NmdWxseSByZWFkaW5nIGEgdmFsdWUuCiAgLy8gVGhpcyB0cmFuc2l0aW9ucyB0aGUgc3RhdGUgdG8gZXhwZWN0IHRoZSBuZXh0IHB1bmN0dWF0aW9uLgogIHN0YXRpYyBjb25zdCBpbnQgVkFMVUVfUkVBRF9CSVRTID0gTk9OX0VNUFRZIHwgTk9fVkFMVUVTOwoKICAvLyBDaGFyYWN0ZXIgY29kZSBjb25zdGFudHMuCiAgc3RhdGljIGNvbnN0IGludCBCQUNLU1BBQ0UgPSAweDA4OwogIHN0YXRpYyBjb25zdCBpbnQgVEFCID0gMHgwOTsKICBzdGF0aWMgY29uc3QgaW50IE5FV0xJTkUgPSAweDBhOwogIHN0YXRpYyBjb25zdCBpbnQgQ0FSUklBR0VfUkVUVVJOID0gMHgwZDsKICBzdGF0aWMgY29uc3QgaW50IEZPUk1fRkVFRCA9IDB4MGM7CiAgc3RhdGljIGNvbnN0IGludCBTUEFDRSA9IDB4MjA7CiAgc3RhdGljIGNvbnN0IGludCBRVU9URSA9IDB4MjI7CiAgc3RhdGljIGNvbnN0IGludCBQTFVTID0gMHgyYjsKICBzdGF0aWMgY29uc3QgaW50IENPTU1BID0gMHgyYzsKICBzdGF0aWMgY29uc3QgaW50IE1JTlVTID0gMHgyZDsKICBzdGF0aWMgY29uc3QgaW50IERFQ0lNQUxQT0lOVCA9IDB4MmU7CiAgc3RhdGljIGNvbnN0IGludCBTTEFTSCA9IDB4MmY7CiAgc3RhdGljIGNvbnN0IGludCBDSEFSXzAgPSAweDMwOwogIHN0YXRpYyBjb25zdCBpbnQgQ0hBUl85ID0gMHgzOTsKICBzdGF0aWMgY29uc3QgaW50IENPTE9OID0gMHgzYTsKICBzdGF0aWMgY29uc3QgaW50IENIQVJfRSA9IDB4NDU7CiAgc3RhdGljIGNvbnN0IGludCBMQlJBQ0tFVCA9IDB4NWI7CiAgc3RhdGljIGNvbnN0IGludCBCQUNLU0xBU0ggPSAweDVjOwogIHN0YXRpYyBjb25zdCBpbnQgUkJSQUNLRVQgPSAweDVkOwogIHN0YXRpYyBjb25zdCBpbnQgQ0hBUl9hID0gMHg2MTsKICBzdGF0aWMgY29uc3QgaW50IENIQVJfYiA9IDB4NjI7CiAgc3RhdGljIGNvbnN0IGludCBDSEFSX2UgPSAweDY1OwogIHN0YXRpYyBjb25zdCBpbnQgQ0hBUl9mID0gMHg2NjsKICBzdGF0aWMgY29uc3QgaW50IENIQVJfbCA9IDB4NmM7CiAgc3RhdGljIGNvbnN0IGludCBDSEFSX24gPSAweDZlOwogIHN0YXRpYyBjb25zdCBpbnQgQ0hBUl9yID0gMHg3MjsKICBzdGF0aWMgY29uc3QgaW50IENIQVJfcyA9IDB4NzM7CiAgc3RhdGljIGNvbnN0IGludCBDSEFSX3QgPSAweDc0OwogIHN0YXRpYyBjb25zdCBpbnQgQ0hBUl91ID0gMHg3NTsKICBzdGF0aWMgY29uc3QgaW50IExCUkFDRSA9IDB4N2I7CiAgc3RhdGljIGNvbnN0IGludCBSQlJBQ0UgPSAweDdkOwoKICAvLyBTdGF0ZSBvZiBwYXJ0aWFsIHZhbHVlIGF0IGNodW5rIHNwbGl0LgogIHN0YXRpYyBjb25zdCBpbnQgTk9fUEFSVElBTCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBQQVJUSUFMX1NUUklORyA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBQQVJUSUFMX05VTUVSQUwgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgUEFSVElBTF9LRVlXT1JEID0gMzsKICBzdGF0aWMgY29uc3QgaW50IE1BU0tfUEFSVElBTCA9IDM7CgogIC8vIFBhcnRpYWwgc3RhdGVzIGZvciBudW1lcmFscy4gVmFsdWVzIGNhbiBiZSB8J2VkIHdpdGggUEFSVElBTF9OVU1FUkFMLgogIHN0YXRpYyBjb25zdCBpbnQgTlVNX1NJR04gPSAwOyAvLyBBZnRlciBpbml0aWFsICctJy4KICBzdGF0aWMgY29uc3QgaW50IE5VTV9aRVJPID0gNDsgLy8gQWZ0ZXIgJzAnIGFzIGZpcnN0IGRpZ2l0LgogIHN0YXRpYyBjb25zdCBpbnQgTlVNX0RJR0lUID0gODsgLy8gQWZ0ZXIgZGlnaXQsIG5vICcuJyBvciAnZScgc2Vlbi4KICBzdGF0aWMgY29uc3QgaW50IE5VTV9ET1QgPSAxMjsgLy8gQWZ0ZXIgJy4nLgogIHN0YXRpYyBjb25zdCBpbnQgTlVNX0RPVF9ESUdJVCA9IDE2OyAvLyBBZnRlciBhIGRlY2ltYWwgZGlnaXQgKGFmdGVyICcuJykuCiAgc3RhdGljIGNvbnN0IGludCBOVU1fRSA9IDIwOyAvLyBBZnRlciAnZScgb3IgJ0UnLgogIHN0YXRpYyBjb25zdCBpbnQgTlVNX0VfU0lHTiA9IDI0OyAvLyBBZnRlciAnLScgb3IgJysnIGFmdGVyICdlJyBvciAnRScuCiAgc3RhdGljIGNvbnN0IGludCBOVU1fRV9ESUdJVCA9IDI4OyAvLyBBZnRlciBleHBvbmVudCBkaWdpdC4KICBzdGF0aWMgY29uc3QgaW50IE5VTV9TVUNDRVNTID0gMzI7IC8vIE5ldmVyIHN0b3JlZCBhcyBwYXJ0aWFsIHN0YXRlLgoKICAvLyBQYXJ0aWFsIHN0YXRlcyBmb3Igc3RyaW5ncy4KICBzdGF0aWMgY29uc3QgaW50IFNUUl9QTEFJTiA9IDA7IC8vIEluc2lkZSBzdHJpbmcsIGJ1dCBub3QgZXNjYXBlLgogIHN0YXRpYyBjb25zdCBpbnQgU1RSX0VTQ0FQRSA9IDQ7IC8vIEFmdGVyICdcJy4KICBzdGF0aWMgY29uc3QgaW50IFNUUl9VID0gMTY7IC8vIEFmdGVyICdcdScgYW5kIDAtMyBoZXggZGlnaXRzLgogIHN0YXRpYyBjb25zdCBpbnQgU1RSX1VfQ09VTlRfU0hJRlQgPSAyOyAvLyBIZXggZGlnaXQgY291bnQgaW4gYml0cyAyLTMuCiAgc3RhdGljIGNvbnN0IGludCBTVFJfVV9WQUxVRV9TSElGVCA9IDU7IC8vIEhleCBkaWdpdCB2YWx1ZSBpbiBiaXRzIDUrLgoKICAvLyBQYXJ0aWFsIHN0YXRlcyBmb3Iga2V5d29yZHMuCiAgc3RhdGljIGNvbnN0IGludCBLV0RfVFlQRV9NQVNLID0gMTI7CiAgc3RhdGljIGNvbnN0IGludCBLV0RfVFlQRV9TSElGVCA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBLV0RfTlVMTCA9IDA7IC8vIFByZWZpeCBvZiAibnVsbCIgc2Vlbi4KICBzdGF0aWMgY29uc3QgaW50IEtXRF9UUlVFID0gNDsgLy8gUHJlZml4IG9mICJ0cnVlIiBzZWVuLgogIHN0YXRpYyBjb25zdCBpbnQgS1dEX0ZBTFNFID0gODsgLy8gUHJlZml4IG9mICJmYWxzZSIgc2Vlbi4KICBzdGF0aWMgY29uc3QgaW50IEtXRF9CT00gPSAxMjsgLy8gUHJlZml4IG9mIEJPTSBzZWVuLgogIHN0YXRpYyBjb25zdCBpbnQgS1dEX0NPVU5UX1NISUZUID0gNDsgLy8gUHJlZml4IGxlbmd0aCBpbiBiaXRzIDQrLgoKICAvLyBNYXNrIHVzZWQgdG8gbWFzayBvZmYgdHdvIGxvd2VyIGJpdHMuCiAgc3RhdGljIGNvbnN0IGludCBUV09fQklUX01BU0sgPSAzOwoKICBmaW5hbCBfSnNvbkxpc3RlbmVyIGxpc3RlbmVyOwoKICAvLyBUaGUgY3VycmVudCBwYXJzaW5nIHN0YXRlLgogIGludCBzdGF0ZSA9IFNUQVRFX0lOSVRJQUw7CiAgTGlzdDxpbnQ+IHN0YXRlcyA9IDxpbnQ+W107CgogIC8qKgogICAqIFN0b3JlcyB0b2tlbml6ZXIgc3RhdGUgYmV0d2VlbiBjaHVua3MuCiAgICoKICAgKiBUaGlzIHN0YXRlIGlzIHN0b3JlZCB3aGVuIGEgY2h1bmsgc3RvcHMgaW4gdGhlIG1pZGRsZSBvZiBhCiAgICogdG9rZW4gKHN0cmluZywgbnVtZXJhbCwgYm9vbGVhbiBvciBudWxsKS4KICAgKgogICAqIFRoZSBwYXJ0aWFsIHN0YXRlIGlzIHVzZWQgdG8gY29udGludWUgcGFyc2luZyBvbiB0aGUgbmV4dCBjaHVuay4KICAgKiBUaGUgcHJldmlvdXMgY2h1bmsgaXMgbm90IHJldGFpbmVkLCBhbnkgZGF0YSBuZWVkZWQgYXJlIHN0b3JlZCBpbgogICAqIHRoaXMgaW50ZWdlciwgb3IgaW4gdGhlIFtidWZmZXJdIGZpZWxkIGFzIGEgc3RyaW5nLWJ1aWxkaW5nIGJ1ZmZlcgogICAqIG9yIGEgW19OdW1iZXJCdWZmZXJdLgogICAqCiAgICogUHJlZml4IHN0YXRlIHN0b3JlZCBpbiBbcHJlZml4U3RhdGVdIGFzIGJpdHMuCiAgICoKICAgKiAgICAgICAgICAgIC4uMDAgOiBObyBwYXJ0aWFsIHZhbHVlIChOT19QQVJUSUFMKS4KICAgKgogICAqICAgICAgICAgLi4wMDAwMSA6IFBhcnRpYWwgc3RyaW5nLCBub3QgaW5zaWRlIGVzY2FwZS4KICAgKiAgICAgICAgIC4uMDAxMDEgOiBQYXJ0aWFsIHN0cmluZywgYWZ0ZXIgJ1wnLgogICAqICAgICAuLnZ2dnYxZGQwMSA6IFBhcnRpYWwgXHUgZXNjYXBlLgogICAqICAgICAgICAgICAgICAgICAgIFRoZSAnZGQnIGJpdHMgKDItMykgZW5jb2RlIHRoZSBudW1iZXIgb2YgaGV4IGRpZ2l0cyBzZWVuLgogICAqICAgICAgICAgICAgICAgICAgIEJpdHMgNS0xNiBlbmNvZGUgdGhlIHZhbHVlIG9mIHRoZSBoZXggZGlnaXRzIHNlZW4gc28gZmFyLgogICAqCiAgICogICAgICAgIC4uMGRkZDEwIDogUGFydGlhbCBudW1lcmFsLgogICAqICAgICAgICAgICAgICAgICAgIFRoZSBgZGRkYCBiaXRzIHN0b3JlIHRoZSBwYXJ0cyBvZiBpbiB0aGUgbnVtZXJhbCBzZWVuIHNvCiAgICogICAgICAgICAgICAgICAgICAgZmFyLCBhcyB0aGUgY29uc3RhbnRzIGBOVU1fKmAgZGVmaW5lZCBhYm92ZS4KICAgKiAgICAgICAgICAgICAgICAgICBUaGUgY2hhcmFjdGVycyBvZiB0aGUgbnVtZXJhbCBhcmUgc3RvcmVkIGluIFtidWZmZXJdCiAgICogICAgICAgICAgICAgICAgICAgYXMgYSBbX051bWJlckJ1ZmZlcl0uCiAgICoKICAgKiAgICAgIC4uMGRkZDAwMTEgOiBQYXJ0aWFsICdudWxsJyBrZXl3b3JkLgogICAqICAgICAgLi4wZGRkMDExMSA6IFBhcnRpYWwgJ3RydWUnIGtleXdvcmQuCiAgICogICAgICAuLjBkZGQxMDExIDogUGFydGlhbCAnZmFsc2UnIGtleXdvcmQuCiAgICogICAgICAuLjBkZGQxMTExIDogUGFydGlhbCBVVEYtOCBCT00gYnl0ZSBzZXFldWVuY2UgKCJceEVGXHhCQlx4QkYiKS4KICAgKiAgICAgICAgICAgICAgICAgICBGb3IgYWxsIGtleXdvcmRzLCB0aGUgYGRkZGAgYml0cyBlbmNvZGUgdGhlIG51bWJlcgogICAqICAgICAgICAgICAgICAgICAgIG9mIGxldHRlcnMgc2Vlbi4KICAgKiAgICAgICAgICAgICAgICAgICBUaGUgQk9NIGJ5dGUgc2VxdWVuY2UgaXMgb25seSB1c2VkIGJ5IFtfSnNvblV0ZjhQYXJzZXJdLAogICAqICAgICAgICAgICAgICAgICAgIGFuZCBvbmx5IGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiBpbnB1dC4KICAgKi8KICBpbnQgcGFydGlhbFN0YXRlID0gTk9fUEFSVElBTDsKCiAgLyoqCiAgICogRXh0cmEgZGF0YSBzdG9yZWQgd2hpbGUgcGFyc2luZyBhIHByaW1pdGl2ZSB2YWx1ZS4KICAgKiBNYXkgYmUgc2V0IGR1cmluZyBwYXJzaW5nLCBhbHdheXMgc2V0IGF0IGNodW5rIGVuZCBpZiBhIHZhbHVlIGlzIHBhcnRpYWwuCiAgICoKICAgKiBNYXkgY29udGFpbiBhIHN0cmluZyBidWZmZXIgd2hpbGUgcGFyc2luZyBzdHJpbmdzLgogICAqLwogIHZhciBidWZmZXIgPSBudWxsOwoKICBfQ2h1bmtlZEpzb25QYXJzZXIodGhpcy5saXN0ZW5lcik7CgogIC8qKgogICAqIFB1c2ggdGhlIGN1cnJlbnQgcGFyc2UgW3N0YXRlXSBvbiBhIHN0YWNrLgogICAqCiAgICogU3RhdGUgaXMgcHVzaGVkIHdoZW4gYSBuZXcgYXJyYXkgb3Igb2JqZWN0IGxpdGVyYWwgc3RhcnRzLAogICAqIHNvIHRoZSBwYXJzZXIgY2FuIGdvIGJhY2sgdG8gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiB0aGUgbGl0ZXJhbCBlbmRzLgogICAqLwogIHZvaWQgc2F2ZVN0YXRlKGludCBzdGF0ZSkgewogICAgc3RhdGVzLmFkZChzdGF0ZSk7CiAgfQoKICAvKioKICAgKiBSZXN0b3JlIGEgc3RhdGUgcHVzaGVkIHdpdGggW3NhdmVTdGF0ZV0uCiAgICovCiAgaW50IHJlc3RvcmVTdGF0ZSgpIHsKICAgIHJldHVybiBzdGF0ZXMucmVtb3ZlTGFzdCgpOyAvLyBUaHJvd3MgaWYgZW1wdHkuCiAgfQoKICAvKioKICAgKiBGaW5hbGl6ZXMgdGhlIHBhcnNpbmcuCiAgICoKICAgKiBUaHJvd3MgaWYgdGhlIHNvdXJjZSByZWFkIHNvIGZhciBkb2Vzbid0IGVuZCB1cCB3aXRoIGEgY29tcGxldGUKICAgKiBwYXJzZWQgdmFsdWUuIFRoYXQgbWVhbnMgaXQgbXVzdCBub3QgYmUgaW5zaWRlIGEgbGlzdCBvciBvYmplY3QKICAgKiBsaXRlcmFsLCBhbmQgYW55IHBhcnRpYWwgdmFsdWUgcmVhZCBzaG91bGQgYWxzbyBiZSBhIHZhbGlkIGNvbXBsZXRlCiAgICogdmFsdWUuCiAgICoKICAgKiBUaGUgb25seSB2YWxpZCBwYXJ0aWFsIHN0YXRlIGlzIGEgbnVtYmVyIHRoYXQgZW5kcyBpbiBhIGRpZ2l0LCBhbmQKICAgKiBvbmx5IGlmIHRoZSBudW1iZXIgaXMgdGhlIGVudGlyZSBKU09OIHZhbHVlIGJlaW5nIHBhcnNlZAogICAqIChvdGhlcndpc2UgaXQgd291bGQgYmUgaW5zaWRlIGEgbGlzdCBvciBvYmplY3QpLgogICAqIFN1Y2ggYSBudW1iZXIgd2lsbCBiZSBjb21wbGV0ZWQuIEFueSBvdGhlciBwYXJ0aWFsIHN0YXRlIGlzIGFuIGVycm9yLgogICAqLwogIHZvaWQgY2xvc2UoKSB7CiAgICBpZiAocGFydGlhbFN0YXRlICE9IE5PX1BBUlRJQUwpIHsKICAgICAgaW50IHBhcnRpYWxUeXBlID0gcGFydGlhbFN0YXRlICYgTUFTS19QQVJUSUFMOwogICAgICBpZiAocGFydGlhbFR5cGUgPT0gUEFSVElBTF9OVU1FUkFMKSB7CiAgICAgICAgaW50IG51bVN0YXRlID0gcGFydGlhbFN0YXRlICYgfk1BU0tfUEFSVElBTDsKICAgICAgICAvLyBBIHBhcnRpYWwgbnVtYmVyIG1pZ2h0IGJlIGEgdmFsaWQgbnVtYmVyIGlmIHdlIGtub3cgaXQncyBkb25lLgogICAgICAgIC8vIFRoZXJlIGlzIGFuIHVubmVjZXNzYXJ5IG92ZXJoZWFkIGlmIGlucHV0IGlzIGEgc2luZ2xlIG51bWJlciwKICAgICAgICAvLyBidXQgdGhpcyBpcyBhc3N1bWVkIHRvIGJlIHJhcmUuCiAgICAgICAgX051bWJlckJ1ZmZlciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7CiAgICAgICAgZmluaXNoQ2h1bmtOdW1iZXIobnVtU3RhdGUsIDAsIDAsIGJ1ZmZlcik7CiAgICAgIH0gZWxzZSBpZiAocGFydGlhbFR5cGUgPT0gUEFSVElBTF9TVFJJTkcpIHsKICAgICAgICBmYWlsKGNodW5rRW5kLCAiVW50ZXJtaW5hdGVkIHN0cmluZyIpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChwYXJ0aWFsVHlwZSA9PSBQQVJUSUFMX0tFWVdPUkQpOwogICAgICAgIGZhaWwoY2h1bmtFbmQpOyAvLyBJbmNvbXBsZXRlIGxpdGVyYWwuCiAgICAgIH0KICAgIH0KICAgIGlmIChzdGF0ZSAhPSBTVEFURV9FTkQpIHsKICAgICAgZmFpbChjaHVua0VuZCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBSZWFkIG91dCB0aGUgcmVzdWx0IGFmdGVyIHN1Y2Nlc3NmdWxseSBjbG9zaW5nIHRoZSBwYXJzZXIuCiAgICoKICAgKiBUaGUgcGFyc2VyIGlzIGNsb3NlZCBieSBjYWxsaW5nIFtjbG9zZV0gb3IgY2FsbGluZyBbYWRkU291cmNlQ2h1bmtdIHdpdGgKICAgKiBgdHJ1ZWAgYXMgc2Vjb25kIChgaXNMYXN0YCkgYXJndW1lbnQuCiAgICovCiAgT2JqZWN0IGdldCByZXN1bHQgewogICAgcmV0dXJuIGxpc3RlbmVyLnJlc3VsdDsKICB9CgogIC8qKiBTZXRzIHRoZSBjdXJyZW50IHNvdXJjZSBjaHVuay4gKi8KICB2b2lkIHNldCBjaHVuayhUIHNvdXJjZSk7CgogIC8qKgogICAqIExlbmd0aCBvZiBjdXJyZW50IGNodW5rLgogICAqCiAgICogVGhlIHZhbGlkIGFyZ3VtZW50cyB0byBbZ2V0Q2hhcl0gYXJlIDAgLi4gYGNodW5rRW5kIC0gMWAuCiAgICovCiAgaW50IGdldCBjaHVua0VuZDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgY2h1bmsgaXRzZWxmLgogICAqCiAgICogT25seSB1c2VkIGJ5IFtmYWlsXSB0byBpbmNsdWRlIHRoZSBjaHVuayBpbiB0aGUgdGhyb3duIFtGb3JtYXRFeGNlcHRpb25dLgogICAqLwogIFQgZ2V0IGNodW5rOwoKICAvKioKICAgKiBHZXQgY2hhcmNhY3Rlci9jb2RlIHVuaXQgb2YgY3VycmVudCBjaHVuay4KICAgKgogICAqIFRoZSBbaW5kZXhdIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCBsZXNzIHRoYW4gYGNodW5rRW5kYC4KICAgKiBJbiBwcmFjdGl2ZSwgW2luZGV4XSB3aWxsIGJlIG5vIHNtYWxsZXIgdGhhbiB0aGUgYHN0YXJ0YCBhcmd1bWVudCBwYXNzZWQKICAgKiB0byBbcGFyc2VdLgogICAqLwogIGludCBnZXRDaGFyKGludCBpbmRleCk7CgogIC8qKgogICAqIENvcHkgQVNDSUkgY2hhcmFjdGVycyBmcm9tIHN0YXJ0IHRvIGVuZCBvZiBjaHVuayBpbnRvIGEgbGlzdC4KICAgKgogICAqIFVzZWQgZm9yIG51bWJlciBidWZmZXIgKGFsd2F5cyBjb3BpZXMgQVNDSUksIHNvIGVuY29kaW5nIGlzIG5vdCBpbXBvcnRhbnQpLgogICAqLwogIHZvaWQgY29weUNoYXJzVG9MaXN0KGludCBzdGFydCwgaW50IGVuZCwgTGlzdDxpbnQ+IHRhcmdldCwgaW50IG9mZnNldCk7CgogIC8qKgogICAqIEJ1aWxkIGEgc3RyaW5nIHVzaW5nIGlucHV0IGNvZGUgdW5pdHMuCiAgICoKICAgKiBDcmVhdGVzIGEgc3RyaW5nIGJ1ZmZlciBhbmQgZW5hYmxlcyBhZGRpbmcgY2hhcmFjdGVycyBhbmQgc2xpY2VzCiAgICogdG8gdGhhdCBidWZmZXIuCiAgICogVGhlIGJ1ZmZlciBpcyBzdG9yZWQgaW4gdGhlIFtidWZmZXJdIGZpZWxkLiBJZiB0aGUgc3RyaW5nIGlzIHVudGVybWluYXRlZCwKICAgKiB0aGUgc2FtZSBidWZmZXIgaXMgdXNlZCB0byBjb250aW51ZSBwYXJzaW5nIGluIHRoZSBuZXh0IGNodW5rLgogICAqLwogIHZvaWQgYmVnaW5TdHJpbmcoKTsKICAvKioKICAgKiBBZGQgc2luZ2xlIGNoYXJhY3RlciBjb2RlIHRvIHN0cmluZyBiZWluZyBidWlsdC4KICAgKgogICAqIFVzZWQgZm9yIHVucGFyc2VkIGVzY2FwZSBzZXF1ZW5jZXMuCiAgICovCiAgdm9pZCBhZGRDaGFyVG9TdHJpbmcoaW50IGNoYXJDb2RlKTsKCiAgLyoqCiAgICogQWRkcyBzbGljZSBvZiBjdXJyZW50IGNodW5rIHRvIHN0cmluZyBiZWluZyBidWlsdC4KICAgKgogICAqIFRoZSBbc3RhcnRdIHBvc2l0aW9ucyBpcyBpbmNsdXNpdmUsIFtlbmRdIGlzIGV4Y2x1c2l2ZS4KICAgKi8KICB2b2lkIGFkZFNsaWNlVG9TdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kKTsKCiAgLyoqIEZpbmFsaXplcyB0aGUgc3RyaW5nIGJlaW5nIGJ1aWx0IGFuZCByZXR1cm5zIGl0IGFzIGEgU3RyaW5nLiAqLwogIFN0cmluZyBlbmRTdHJpbmcoKTsKCiAgLyoqCiAgICogRXh0cmFjdHMgYSBsaXRlcmFsIHN0cmluZyBmcm9tIGEgc2xpY2Ugb2YgdGhlIGN1cnJlbnQgY2h1bmsuCiAgICoKICAgKiBObyBpbnRlcnByZXRhdGlvbiBvZiB0aGUgY29udGVudCBpcyBwZXJmb3JtZWQsIGV4Y2VwdCBmb3IgY29udmVydGluZwogICAqIHRoZSBzb3VyY2UgZm9ybWF0IHRvIHN0cmluZy4KICAgKiBUaGlzIGNhbiBiZSBpbXBsZW1lbnRlZCBtb3JlIG9yIGxlc3MgZWZmaWNpZW50bHkgZGVwZW5kaW5nIG9uIHRoZQogICAqIHVuZGVybHlpbmcgc291cmNlLgogICAqCiAgICogVGhpcyBpcyB1c2VkIGZvciBzdHJpbmcgbGl0ZXJhbHMgdGhhdCBjb250YWluIG5vIGVzY2FwZXMuCiAgICoKICAgKiBUaGUgW2JpdHNdIGludGVnZXIgaXMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvZGUgcG9pbnQgaW4gdGhlIHJhbmdlCiAgICogZnJvbSBgc3RhcnRgIHRvIGBlbmRgLgogICAqIFVzdWFsbHkgZm91bmQgYnkgZG9pbmcgYml0d2lzZSBvciBvZiBhbGwgdGhlIHZhbHVlcy4KICAgKiBUaGUgZnVuY3Rpb24gbWF5IGNob29zZSB0byBvcHRpbWl6ZSBkZXBlbmRpbmcgb24gdGhlIHZhbHVlLgogICAqLwogIFN0cmluZyBnZXRTdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgYml0cyk7CgogIC8qKgogICAqIFBhcnNlIGEgc2xpY2Ugb2YgdGhlIGN1cnJlbnQgY2h1bmsgYXMgYSBudW1iZXIuCiAgICoKICAgKiBTaW5jZSBpbnRlZ2VycyBoYXZlIGEgbWF4aW1hbCB2YWx1ZSwgYW5kIHdlIGRvbid0IHRyYWNrIHRoZSB2YWx1ZQogICAqIGluIHRoZSBidWZmZXIsIGEgc2VxdWVuY2Ugb2YgZGlnaXRzIGNhbiBiZSBlaXRoZXIgYW4gaW50IG9yIGEgZG91YmxlLgogICAqIFRoZSBgbnVtLnBhcnNlYCBmdW5jdGlvbiBkb2VzIHRoZSByaWdodCB0aGluZy4KICAgKgogICAqIFRoZSBmb3JtYXQgaXMgZXhwZWN0ZWQgdG8gYmUgY29ycmVjdC4KICAgKi8KICBudW0gcGFyc2VOdW0oaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBjb25zdCBpbnQgYXNjaWlCaXRzID0gMHg3ZjsgLy8gTnVtYmVyIGxpdGVyYWxzIGFyZSBBU0NJSSBvbmx5LgogICAgcmV0dXJuIG51bS5wYXJzZShnZXRTdHJpbmcoc3RhcnQsIGVuZCwgYXNjaWlCaXRzKSk7CiAgfQoKICAvKioKICAgKiBQYXJzZSBhIHNsaWNlIG9mIHRoZSBjdXJyZW50IGNodW5rIGFzIGEgZG91YmxlLgogICAqCiAgICogVGhlIGZvcm1hdCBpcyBleHBlY3RlZCB0byBiZSBjb3JyZWN0LgogICAqIFRoaXMgaXMgdXNlZCBieSBbcGFyc2VOdW1iZXJdIHdoZW4gdGhlIGRvdWJsZSB2YWx1ZSBjYW5ub3QgYmUKICAgKiBidWlsdCBleGFjdGx5IGR1cmluZyBwYXJzaW5nLgogICAqLwogIGRvdWJsZSBwYXJzZURvdWJsZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGNvbnN0IGludCBhc2NpaUJpdHMgPSAweDdmOyAvLyBEb3VibGUgbGl0ZXJhbHMgYXJlIEFTQ0lJIG9ubHkuCiAgICByZXR1cm4gZG91YmxlLnBhcnNlKGdldFN0cmluZyhzdGFydCwgZW5kLCBhc2NpaUJpdHMpKTsKICB9CgogIC8qKgogICAqIENvbnRpbnVlcyBwYXJzaW5nIGEgcGFydGlhbCB2YWx1ZS4KICAgKi8KICBpbnQgcGFyc2VQYXJ0aWFsKGludCBwb3NpdGlvbikgewogICAgaWYgKHBvc2l0aW9uID09IGNodW5rRW5kKSByZXR1cm4gcG9zaXRpb247CiAgICBpbnQgcGFydGlhbFN0YXRlID0gdGhpcy5wYXJ0aWFsU3RhdGU7CiAgICBhc3NlcnQocGFydGlhbFN0YXRlICE9IE5PX1BBUlRJQUwpOwogICAgaW50IHBhcnRpYWxUeXBlID0gcGFydGlhbFN0YXRlICYgTUFTS19QQVJUSUFMOwogICAgdGhpcy5wYXJ0aWFsU3RhdGUgPSBOT19QQVJUSUFMOwogICAgcGFydGlhbFN0YXRlID0gcGFydGlhbFN0YXRlICYgfk1BU0tfUEFSVElBTDsKICAgIGFzc2VydChwYXJ0aWFsVHlwZSAhPSAwKTsKICAgIGlmIChwYXJ0aWFsVHlwZSA9PSBQQVJUSUFMX1NUUklORykgewogICAgICBwb3NpdGlvbiA9IHBhcnNlUGFydGlhbFN0cmluZyhwb3NpdGlvbiwgcGFydGlhbFN0YXRlKTsKICAgIH0gZWxzZSBpZiAocGFydGlhbFR5cGUgPT0gUEFSVElBTF9OVU1FUkFMKSB7CiAgICAgIHBvc2l0aW9uID0gcGFyc2VQYXJ0aWFsTnVtYmVyKHBvc2l0aW9uLCBwYXJ0aWFsU3RhdGUpOwogICAgfSBlbHNlIGlmIChwYXJ0aWFsVHlwZSA9PSBQQVJUSUFMX0tFWVdPUkQpIHsKICAgICAgcG9zaXRpb24gPSBwYXJzZVBhcnRpYWxLZXl3b3JkKHBvc2l0aW9uLCBwYXJ0aWFsU3RhdGUpOwogICAgfQogICAgcmV0dXJuIHBvc2l0aW9uOwogIH0KCiAgLyoqCiAgICogUGFyc2VzIHRoZSByZW1haW5kZXIgb2YgYSBudW1iZXIgaW50byB0aGUgbnVtYmVyIGJ1ZmZlci4KICAgKgogICAqIFN5bnRheCBpcyBjaGVja2VkIHdoaWxlIHBhc2luZy4KICAgKiBTdGFydHMgYXQgcG9zaXRpb24sIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGJlIHRoZSBzdGFydCBvZiB0aGUgY2h1bmssCiAgICogYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24tbnVtYmVyLWxpdGVyYWwgY2hhcmFjdGVyIGZvdW5kLAogICAqIG9yIGNodW5rRW5kIGlmIHRoZSBlbnRpcmUgY2h1bmsgaXMgYSB2YWxpZCBudW1iZXIgY29udGludWF0aW9uLgogICAqIFRocm93cyBpZiBhIHN5bnRheCBlcnJvciBpcyBkZXRlY3RlZC4KICAgKi8KICBpbnQgcGFyc2VQYXJ0aWFsTnVtYmVyKGludCBwb3NpdGlvbiwgaW50IHN0YXRlKSB7CiAgICBpbnQgc3RhcnQgPSBwb3NpdGlvbjsKICAgIC8vIFByaW1pdGl2ZSBpbXBsZW1lbnRhdGlvbiwgY2FuIGJlIG9wdGltaXplZC4KICAgIF9OdW1iZXJCdWZmZXIgYnVmZmVyID0gdGhpcy5idWZmZXI7CiAgICB0aGlzLmJ1ZmZlciA9IG51bGw7CiAgICBpbnQgZW5kID0gY2h1bmtFbmQ7CiAgICB0b0JhaWxvdXQ6CiAgICB7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBlbmQpIGJyZWFrIHRvQmFpbG91dDsKICAgICAgaW50IGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgaW50IGRpZ2l0ID0gY2hhciBeIENIQVJfMDsKICAgICAgaWYgKHN0YXRlID09IE5VTV9TSUdOKSB7CiAgICAgICAgaWYgKGRpZ2l0IDw9IDkpIHsKICAgICAgICAgIGlmIChkaWdpdCA9PSAwKSB7CiAgICAgICAgICAgIHN0YXRlID0gTlVNX1pFUk87CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZSA9IE5VTV9ESUdJVDsKICAgICAgICAgIH0KICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgICBpZiAocG9zaXRpb24gPT0gZW5kKSBicmVhayB0b0JhaWxvdXQ7CiAgICAgICAgICBjaGFyID0gZ2V0Q2hhcihwb3NpdGlvbik7CiAgICAgICAgICBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHN0YXRlID09IE5VTV9aRVJPKSB7CiAgICAgICAgLy8gSlNPTiBkb2VzIG5vdCBhbGxvdyBpbnNpZ25pZmljYW50IGxlYWRpbmcgemVyb3MgKGUuZy4sICIwOSIpLgogICAgICAgIGlmIChkaWdpdCA8PSA5KSByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgc3RhdGUgPSBOVU1fRElHSVQ7CiAgICAgIH0KICAgICAgd2hpbGUgKHN0YXRlID09IE5VTV9ESUdJVCkgewogICAgICAgIGlmIChkaWdpdCA+IDkpIHsKICAgICAgICAgIGlmIChjaGFyID09IERFQ0lNQUxQT0lOVCkgewogICAgICAgICAgICBzdGF0ZSA9IE5VTV9ET1Q7CiAgICAgICAgICB9IGVsc2UgaWYgKChjaGFyIHwgMHgyMCkgPT0gQ0hBUl9lKSB7CiAgICAgICAgICAgIHN0YXRlID0gTlVNX0U7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmaW5pc2hDaHVua051bWJlcihzdGF0ZSwgc3RhcnQsIHBvc2l0aW9uLCBidWZmZXIpOwogICAgICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgaWYgKHBvc2l0aW9uID09IGVuZCkgYnJlYWsgdG9CYWlsb3V0OwogICAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgICBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlID09IE5VTV9ET1QpIHsKICAgICAgICBpZiAoZGlnaXQgPiA5KSByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgc3RhdGUgPSBOVU1fRE9UX0RJR0lUOwogICAgICB9CiAgICAgIHdoaWxlIChzdGF0ZSA9PSBOVU1fRE9UX0RJR0lUKSB7CiAgICAgICAgaWYgKGRpZ2l0ID4gOSkgewogICAgICAgICAgaWYgKChjaGFyIHwgMHgyMCkgPT0gQ0hBUl9lKSB7CiAgICAgICAgICAgIHN0YXRlID0gTlVNX0U7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmaW5pc2hDaHVua051bWJlcihzdGF0ZSwgc3RhcnQsIHBvc2l0aW9uLCBidWZmZXIpOwogICAgICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgaWYgKHBvc2l0aW9uID09IGVuZCkgYnJlYWsgdG9CYWlsb3V0OwogICAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgICBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlID09IE5VTV9FKSB7CiAgICAgICAgaWYgKGNoYXIgPT0gUExVUyB8fCBjaGFyID09IE1JTlVTKSB7CiAgICAgICAgICBzdGF0ZSA9IE5VTV9FX1NJR047CiAgICAgICAgICBwb3NpdGlvbisrOwogICAgICAgICAgaWYgKHBvc2l0aW9uID09IGVuZCkgYnJlYWsgdG9CYWlsb3V0OwogICAgICAgICAgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgICAgICAgZGlnaXQgPSBjaGFyIF4gQ0hBUl8wOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3NlcnQoc3RhdGUgPj0gTlVNX0UpOwogICAgICB3aGlsZSAoZGlnaXQgPD0gOSkgewogICAgICAgIHN0YXRlID0gTlVNX0VfRElHSVQ7CiAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICBpZiAocG9zaXRpb24gPT0gZW5kKSBicmVhayB0b0JhaWxvdXQ7CiAgICAgICAgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgICAgIGRpZ2l0ID0gY2hhciBeIENIQVJfMDsKICAgICAgfQogICAgICBmaW5pc2hDaHVua051bWJlcihzdGF0ZSwgc3RhcnQsIHBvc2l0aW9uLCBidWZmZXIpOwogICAgICByZXR1cm4gcG9zaXRpb247CiAgICB9CiAgICAvLyBCYWlsb3V0IGNvZGUgaW4gY2FzZSB0aGUgY3VycmVudCBjaHVuayBlbmRzIHdoaWxlIHBhcnNpbmcgdGhlIG51bWVyYWwuCiAgICBhc3NlcnQocG9zaXRpb24gPT0gZW5kKTsKICAgIGNvbnRpbnVlQ2h1bmtOdW1iZXIoc3RhdGUsIHN0YXJ0LCBidWZmZXIpOwogICAgcmV0dXJuIGNodW5rRW5kOwogIH0KCiAgLyoqCiAgICogQ29udGludWVzIHBhcnNpbmcgYSBwYXJ0aWFsIHN0cmluZyBsaXRlcmFsLgogICAqCiAgICogSGFuZGxlcyBwYXJ0aWFsIGVzY2FwZXMgYW5kIHRoZW4gaGFuZHMgdGhlIHBhcnNpbmcgb2ZmIHRvCiAgICogW3BhcnNlU3RyaW5nVG9CdWZmZXJdLgogICAqLwogIGludCBwYXJzZVBhcnRpYWxTdHJpbmcoaW50IHBvc2l0aW9uLCBpbnQgcGFydGlhbFN0YXRlKSB7CiAgICBpZiAocGFydGlhbFN0YXRlID09IFNUUl9QTEFJTikgewogICAgICByZXR1cm4gcGFyc2VTdHJpbmdUb0J1ZmZlcihwb3NpdGlvbik7CiAgICB9CiAgICBpZiAocGFydGlhbFN0YXRlID09IFNUUl9FU0NBUEUpIHsKICAgICAgcG9zaXRpb24gPSBwYXJzZVN0cmluZ0VzY2FwZShwb3NpdGlvbik7CiAgICAgIC8vIHBhcnNlU3RyaW5nRXNjYXBlIHNldHMgcGFydGlhbFN0YXRlIGlmIGl0IHNlZXMgdGhlIGVuZC4KICAgICAgaWYgKHBvc2l0aW9uID09IGNodW5rRW5kKSByZXR1cm4gcG9zaXRpb247CiAgICAgIHJldHVybiBwYXJzZVN0cmluZ1RvQnVmZmVyKHBvc2l0aW9uKTsKICAgIH0KICAgIGFzc2VydCgocGFydGlhbFN0YXRlICYgU1RSX1UpICE9IDApOwogICAgaW50IHZhbHVlID0gcGFydGlhbFN0YXRlID4+IFNUUl9VX1ZBTFVFX1NISUZUOwogICAgaW50IGNvdW50ID0gKHBhcnRpYWxTdGF0ZSA+PiBTVFJfVV9DT1VOVF9TSElGVCkgJiBUV09fQklUX01BU0s7CiAgICBmb3IgKGludCBpID0gY291bnQ7IGkgPCA0OyBpKyssIHBvc2l0aW9uKyspIHsKICAgICAgaWYgKHBvc2l0aW9uID09IGNodW5rRW5kKSByZXR1cm4gY2h1bmtTdHJpbmdFc2NhcGVVKGksIHZhbHVlKTsKICAgICAgaW50IGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgaW50IGRpZ2l0ID0gcGFyc2VIZXhEaWdpdChjaGFyKTsKICAgICAgaWYgKGRpZ2l0IDwgMCkgZmFpbChwb3NpdGlvbiwgIkludmFsaWQgaGV4IGRpZ2l0Iik7CiAgICAgIHZhbHVlID0gMTYgKiB2YWx1ZSArIGRpZ2l0OwogICAgfQogICAgYWRkQ2hhclRvU3RyaW5nKHZhbHVlKTsKICAgIHJldHVybiBwYXJzZVN0cmluZ1RvQnVmZmVyKHBvc2l0aW9uKTsKICB9CgogIC8qKgogICAqIENvbnRpbnVlcyBwYXJzaW5nIGEgcGFydGlhbCBrZXl3b3JkLgogICAqLwogIGludCBwYXJzZVBhcnRpYWxLZXl3b3JkKGludCBwb3NpdGlvbiwgaW50IHBhcnRpYWxTdGF0ZSkgewogICAgaW50IGtleXdvcmRUeXBlID0gcGFydGlhbFN0YXRlICYgS1dEX1RZUEVfTUFTSzsKICAgIGludCBjb3VudCA9IHBhcnRpYWxTdGF0ZSA+PiBLV0RfQ09VTlRfU0hJRlQ7CiAgICBpbnQga2V5d29yZFR5cGVJbmRleCA9IGtleXdvcmRUeXBlID4+IEtXRF9UWVBFX1NISUZUOwogICAgU3RyaW5nIGtleXdvcmQgPQogICAgICAgIGNvbnN0IFsibnVsbCIsICJ0cnVlIiwgImZhbHNlIiwgIlx4RUZceEJCXHhCRiJdW2tleXdvcmRUeXBlSW5kZXhdOwogICAgYXNzZXJ0KGNvdW50IDwga2V5d29yZC5sZW5ndGgpOwogICAgZG8gewogICAgICBpZiAocG9zaXRpb24gPT0gY2h1bmtFbmQpIHsKICAgICAgICB0aGlzLnBhcnRpYWxTdGF0ZSA9CiAgICAgICAgICAgIFBBUlRJQUxfS0VZV09SRCB8IGtleXdvcmRUeXBlIHwgKGNvdW50IDw8IEtXRF9DT1VOVF9TSElGVCk7CiAgICAgICAgcmV0dXJuIGNodW5rRW5kOwogICAgICB9CiAgICAgIGludCBleHBlY3RlZENoYXIgPSBrZXl3b3JkLmNvZGVVbml0QXQoY291bnQpOwogICAgICBpZiAoZ2V0Q2hhcihwb3NpdGlvbikgIT0gZXhwZWN0ZWRDaGFyKSB7CiAgICAgICAgaWYgKGNvdW50ID09IDApIHsKICAgICAgICAgIGFzc2VydChrZXl3b3JkVHlwZSA9PSBLV0RfQk9NKTsKICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgICB9CiAgICAgIHBvc2l0aW9uKys7CiAgICAgIGNvdW50Kys7CiAgICB9IHdoaWxlIChjb3VudCA8IGtleXdvcmQubGVuZ3RoKTsKICAgIGlmIChrZXl3b3JkVHlwZSA9PSBLV0RfTlVMTCkgewogICAgICBsaXN0ZW5lci5oYW5kbGVOdWxsKCk7CiAgICB9IGVsc2UgaWYgKGtleXdvcmRUeXBlICE9IEtXRF9CT00pIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlQm9vbChrZXl3b3JkVHlwZSA9PSBLV0RfVFJVRSk7CiAgICB9CiAgICByZXR1cm4gcG9zaXRpb247CiAgfQoKICAvKiogQ29udmVydCBoZXgtZGlnaXQgdG8gaXRzIHZhbHVlLiBSZXR1cm5zIC0xIGlmIGNoYXIgaXMgbm90IGEgaGV4IGRpZ2l0LiAqLwogIGludCBwYXJzZUhleERpZ2l0KGludCBjaGFyKSB7CiAgICBpbnQgZGlnaXQgPSBjaGFyIF4gMHgzMDsKICAgIGlmIChkaWdpdCA8PSA5KSByZXR1cm4gZGlnaXQ7CiAgICBpbnQgbGV0dGVyID0gKGNoYXIgfCAweDIwKSBeIDB4NjA7CiAgICAvLyB2YWx1ZXMgMSAuLiA2IGFyZSAnYScgdGhyb3VnaCAnZicKICAgIGlmIChsZXR0ZXIgPD0gNiAmJiBsZXR0ZXIgPiAwKSByZXR1cm4gbGV0dGVyICsgOTsKICAgIHJldHVybiAtMTsKICB9CgogIC8qKgogICAqIFBhcnNlcyB0aGUgY3VycmVudCBjaHVuayBhcyBhIGNodW5rIG9mIEpTT04uCiAgICoKICAgKiBTdGFydHMgcGFyc2luZyBhdCBbcG9zaXRpb25dIGFuZCBjb250aW51ZXMgdW50aWwgW2NodW5rRW5kXS4KICAgKiBDb250aW51ZXMgcGFyc2luZyB3aGVyZSB0aGUgcHJldmlvdXMgY2h1bmsgKGlmIGFueSkgZW5kZWQuCiAgICovCiAgdm9pZCBwYXJzZShpbnQgcG9zaXRpb24pIHsKICAgIGludCBsZW5ndGggPSBjaHVua0VuZDsKICAgIGlmIChwYXJ0aWFsU3RhdGUgIT0gTk9fUEFSVElBTCkgewogICAgICBwb3NpdGlvbiA9IHBhcnNlUGFydGlhbChwb3NpdGlvbik7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybjsKICAgIH0KICAgIGludCBzdGF0ZSA9IHRoaXMuc3RhdGU7CiAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHsKICAgICAgaW50IGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgc3dpdGNoIChjaGFyKSB7CiAgICAgICAgY2FzZSBTUEFDRToKICAgICAgICBjYXNlIENBUlJJQUdFX1JFVFVSTjoKICAgICAgICBjYXNlIE5FV0xJTkU6CiAgICAgICAgY2FzZSBUQUI6CiAgICAgICAgICBwb3NpdGlvbisrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBRVU9URToKICAgICAgICAgIGlmICgoc3RhdGUgJiBBTExPV19TVFJJTkdfTUFTSykgIT0gMCkgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgICAgICAgc3RhdGUgfD0gVkFMVUVfUkVBRF9CSVRTOwogICAgICAgICAgcG9zaXRpb24gPSBwYXJzZVN0cmluZyhwb3NpdGlvbiArIDEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBMQlJBQ0tFVDoKICAgICAgICAgIGlmICgoc3RhdGUgJiBBTExPV19WQUxVRV9NQVNLKSAhPSAwKSByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgICBsaXN0ZW5lci5iZWdpbkFycmF5KCk7CiAgICAgICAgICBzYXZlU3RhdGUoc3RhdGUpOwogICAgICAgICAgc3RhdGUgPSBTVEFURV9BUlJBWV9FTVBUWTsKICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIExCUkFDRToKICAgICAgICAgIGlmICgoc3RhdGUgJiBBTExPV19WQUxVRV9NQVNLKSAhPSAwKSByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgICBsaXN0ZW5lci5iZWdpbk9iamVjdCgpOwogICAgICAgICAgc2F2ZVN0YXRlKHN0YXRlKTsKICAgICAgICAgIHN0YXRlID0gU1RBVEVfT0JKRUNUX0VNUFRZOwogICAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ0hBUl9uOgogICAgICAgICAgaWYgKChzdGF0ZSAmIEFMTE9XX1ZBTFVFX01BU0spICE9IDApIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgICAgICAgIHN0YXRlIHw9IFZBTFVFX1JFQURfQklUUzsKICAgICAgICAgIHBvc2l0aW9uID0gcGFyc2VOdWxsKHBvc2l0aW9uKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ0hBUl9mOgogICAgICAgICAgaWYgKChzdGF0ZSAmIEFMTE9XX1ZBTFVFX01BU0spICE9IDApIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgICAgICAgIHN0YXRlIHw9IFZBTFVFX1JFQURfQklUUzsKICAgICAgICAgIHBvc2l0aW9uID0gcGFyc2VGYWxzZShwb3NpdGlvbik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENIQVJfdDoKICAgICAgICAgIGlmICgoc3RhdGUgJiBBTExPV19WQUxVRV9NQVNLKSAhPSAwKSByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgICBzdGF0ZSB8PSBWQUxVRV9SRUFEX0JJVFM7CiAgICAgICAgICBwb3NpdGlvbiA9IHBhcnNlVHJ1ZShwb3NpdGlvbik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENPTE9OOgogICAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX09CSkVDVF9LRVkpIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgICAgICAgIGxpc3RlbmVyLnByb3BlcnR5TmFtZSgpOwogICAgICAgICAgc3RhdGUgPSBTVEFURV9PQkpFQ1RfQ09MT047CiAgICAgICAgICBwb3NpdGlvbisrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDT01NQToKICAgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9PQkpFQ1RfVkFMVUUpIHsKICAgICAgICAgICAgbGlzdGVuZXIucHJvcGVydHlWYWx1ZSgpOwogICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX09CSkVDVF9DT01NQTsKICAgICAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gU1RBVEVfQVJSQVlfVkFMVUUpIHsKICAgICAgICAgICAgbGlzdGVuZXIuYXJyYXlFbGVtZW50KCk7CiAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfQVJSQVlfQ09NTUE7CiAgICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFJCUkFDS0VUOgogICAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX0FSUkFZX0VNUFRZKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmVuZEFycmF5KCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFNUQVRFX0FSUkFZX1ZBTFVFKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmFycmF5RWxlbWVudCgpOwogICAgICAgICAgICBsaXN0ZW5lci5lbmRBcnJheSgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgICAgICAgfQogICAgICAgICAgc3RhdGUgPSByZXN0b3JlU3RhdGUoKSB8IFZBTFVFX1JFQURfQklUUzsKICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFJCUkFDRToKICAgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9PQkpFQ1RfRU1QVFkpIHsKICAgICAgICAgICAgbGlzdGVuZXIuZW5kT2JqZWN0KCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFNUQVRFX09CSkVDVF9WQUxVRSkgewogICAgICAgICAgICBsaXN0ZW5lci5wcm9wZXJ0eVZhbHVlKCk7CiAgICAgICAgICAgIGxpc3RlbmVyLmVuZE9iamVjdCgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgICAgICAgfQogICAgICAgICAgc3RhdGUgPSByZXN0b3JlU3RhdGUoKSB8IFZBTFVFX1JFQURfQklUUzsKICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKChzdGF0ZSAmIEFMTE9XX1ZBTFVFX01BU0spICE9IDApIGZhaWwocG9zaXRpb24pOwogICAgICAgICAgc3RhdGUgfD0gVkFMVUVfUkVBRF9CSVRTOwogICAgICAgICAgcG9zaXRpb24gPSBwYXJzZU51bWJlcihjaGFyLCBwb3NpdGlvbik7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwogIH0KCiAgLyoqCiAgICogUGFyc2VzIGEgInRydWUiIGxpdGVyYWwgc3RhcnRpbmcgYXQgW3Bvc2l0aW9uXS4KICAgKgogICAqIFRoZSBjaGFyYWN0ZXIgYHNvdXJjZVtwb3NpdGlvbl1gIG11c3QgYmUgInQiLgogICAqLwogIGludCBwYXJzZVRydWUoaW50IHBvc2l0aW9uKSB7CiAgICBhc3NlcnQoZ2V0Q2hhcihwb3NpdGlvbikgPT0gQ0hBUl90KTsKICAgIGlmIChjaHVua0VuZCA8IHBvc2l0aW9uICsgNCkgewogICAgICByZXR1cm4gcGFyc2VLZXl3b3JkUHJlZml4KHBvc2l0aW9uLCAidHJ1ZSIsIEtXRF9UUlVFKTsKICAgIH0KICAgIGlmIChnZXRDaGFyKHBvc2l0aW9uICsgMSkgIT0gQ0hBUl9yIHx8CiAgICAgICAgZ2V0Q2hhcihwb3NpdGlvbiArIDIpICE9IENIQVJfdSB8fAogICAgICAgIGdldENoYXIocG9zaXRpb24gKyAzKSAhPSBDSEFSX2UpIHsKICAgICAgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlQm9vbCh0cnVlKTsKICAgIHJldHVybiBwb3NpdGlvbiArIDQ7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYSAiZmFsc2UiIGxpdGVyYWwgc3RhcnRpbmcgYXQgW3Bvc2l0aW9uXS4KICAgKgogICAqIFRoZSBjaGFyYWN0ZXIgYHNvdXJjZVtwb3NpdGlvbl1gIG11c3QgYmUgImYiLgogICAqLwogIGludCBwYXJzZUZhbHNlKGludCBwb3NpdGlvbikgewogICAgYXNzZXJ0KGdldENoYXIocG9zaXRpb24pID09IENIQVJfZik7CiAgICBpZiAoY2h1bmtFbmQgPCBwb3NpdGlvbiArIDUpIHsKICAgICAgcmV0dXJuIHBhcnNlS2V5d29yZFByZWZpeChwb3NpdGlvbiwgImZhbHNlIiwgS1dEX0ZBTFNFKTsKICAgIH0KICAgIGlmIChnZXRDaGFyKHBvc2l0aW9uICsgMSkgIT0gQ0hBUl9hIHx8CiAgICAgICAgZ2V0Q2hhcihwb3NpdGlvbiArIDIpICE9IENIQVJfbCB8fAogICAgICAgIGdldENoYXIocG9zaXRpb24gKyAzKSAhPSBDSEFSX3MgfHwKICAgICAgICBnZXRDaGFyKHBvc2l0aW9uICsgNCkgIT0gQ0hBUl9lKSB7CiAgICAgIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgIH0KICAgIGxpc3RlbmVyLmhhbmRsZUJvb2woZmFsc2UpOwogICAgcmV0dXJuIHBvc2l0aW9uICsgNTsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhICJudWxsIiBsaXRlcmFsIHN0YXJ0aW5nIGF0IFtwb3NpdGlvbl0uCiAgICoKICAgKiBUaGUgY2hhcmFjdGVyIGBzb3VyY2VbcG9zaXRpb25dYCBtdXN0IGJlICJuIi4KICAgKi8KICBpbnQgcGFyc2VOdWxsKGludCBwb3NpdGlvbikgewogICAgYXNzZXJ0KGdldENoYXIocG9zaXRpb24pID09IENIQVJfbik7CiAgICBpZiAoY2h1bmtFbmQgPCBwb3NpdGlvbiArIDQpIHsKICAgICAgcmV0dXJuIHBhcnNlS2V5d29yZFByZWZpeChwb3NpdGlvbiwgIm51bGwiLCBLV0RfTlVMTCk7CiAgICB9CiAgICBpZiAoZ2V0Q2hhcihwb3NpdGlvbiArIDEpICE9IENIQVJfdSB8fAogICAgICAgIGdldENoYXIocG9zaXRpb24gKyAyKSAhPSBDSEFSX2wgfHwKICAgICAgICBnZXRDaGFyKHBvc2l0aW9uICsgMykgIT0gQ0hBUl9sKSB7CiAgICAgIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgIH0KICAgIGxpc3RlbmVyLmhhbmRsZU51bGwoKTsKICAgIHJldHVybiBwb3NpdGlvbiArIDQ7CiAgfQoKICBpbnQgcGFyc2VLZXl3b3JkUHJlZml4KGludCBwb3NpdGlvbiwgU3RyaW5nIGNoYXJzLCBpbnQgdHlwZSkgewogICAgYXNzZXJ0KGdldENoYXIocG9zaXRpb24pID09IGNoYXJzLmNvZGVVbml0QXQoMCkpOwogICAgaW50IGxlbmd0aCA9IGNodW5rRW5kOwogICAgaW50IHN0YXJ0ID0gcG9zaXRpb247CiAgICBpbnQgY291bnQgPSAxOwogICAgd2hpbGUgKCsrcG9zaXRpb24gPCBsZW5ndGgpIHsKICAgICAgaW50IGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgaWYgKGNoYXIgIT0gY2hhcnMuY29kZVVuaXRBdChjb3VudCkpIHJldHVybiBmYWlsKHN0YXJ0KTsKICAgICAgY291bnQrKzsKICAgIH0KICAgIHRoaXMucGFydGlhbFN0YXRlID0gUEFSVElBTF9LRVlXT1JEIHwgdHlwZSB8IChjb3VudCA8PCBLV0RfQ09VTlRfU0hJRlQpOwogICAgcmV0dXJuIGxlbmd0aDsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhIHN0cmluZyB2YWx1ZS4KICAgKgogICAqIEluaXRpYWwgW3Bvc2l0aW9uXSBpcyByaWdodCBhZnRlciB0aGUgaW5pdGlhbCBxdW90ZS4KICAgKiBSZXR1cm5lZCBwb3NpdGlvbiByaWdodCBhZnRlciB0aGUgZmluYWwgcXVvdGUuCiAgICovCiAgaW50IHBhcnNlU3RyaW5nKGludCBwb3NpdGlvbikgewogICAgLy8gRm9ybWF0OiAnIicoW15ceDAwLVx4MWZcXFwiXXwnXFwnW2JmbnJ0L1xcIl0pKiciJwogICAgLy8gSW5pdGlhbCBwb3NpdGlvbiBpcyByaWdodCBhZnRlciBmaXJzdCAnIicuCiAgICBpbnQgc3RhcnQgPSBwb3NpdGlvbjsKICAgIGludCBlbmQgPSBjaHVua0VuZDsKICAgIGludCBiaXRzID0gMDsKICAgIHdoaWxlIChwb3NpdGlvbiA8IGVuZCkgewogICAgICBpbnQgY2hhciA9IGdldENoYXIocG9zaXRpb24rKyk7CiAgICAgIGJpdHMgfD0gY2hhcjsgLy8gSW5jbHVkZXMgZmluYWwgJyInLCBidXQgdGhhdCBuZXZlciBtYXR0ZXJzLgogICAgICAvLyBCQUNLU0xBU0ggaXMgbGFyZ2VyIHRoYW4gUVVPVEUgYW5kIFNQQUNFLgogICAgICBpZiAoY2hhciA+IEJBQ0tTTEFTSCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChjaGFyID09IEJBQ0tTTEFTSCkgewogICAgICAgIGJlZ2luU3RyaW5nKCk7CiAgICAgICAgaW50IHNsaWNlRW5kID0gcG9zaXRpb24gLSAxOwogICAgICAgIGlmIChzdGFydCA8IHNsaWNlRW5kKSBhZGRTbGljZVRvU3RyaW5nKHN0YXJ0LCBzbGljZUVuZCk7CiAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nVG9CdWZmZXIoc2xpY2VFbmQpOwogICAgICB9CiAgICAgIGlmIChjaGFyID09IFFVT1RFKSB7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlU3RyaW5nKGdldFN0cmluZyhzdGFydCwgcG9zaXRpb24gLSAxLCBiaXRzKSk7CiAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgICB9CiAgICAgIGlmIChjaGFyIDwgU1BBQ0UpIHsKICAgICAgICByZXR1cm4gZmFpbChwb3NpdGlvbiAtIDEsICJDb250cm9sIGNoYXJhY3RlciBpbiBzdHJpbmciKTsKICAgICAgfQogICAgfQogICAgYmVnaW5TdHJpbmcoKTsKICAgIGlmIChzdGFydCA8IGVuZCkgYWRkU2xpY2VUb1N0cmluZyhzdGFydCwgZW5kKTsKICAgIHJldHVybiBjaHVua1N0cmluZyhTVFJfUExBSU4pOwogIH0KCiAgLyoqCiAgICogU2V0cyB1cCBhIHBhcnRpYWwgc3RyaW5nIHN0YXRlLgogICAqCiAgICogVGhlIHN0YXRlIGlzIGVpdGhlciBub3QgaW5zaWRlIGFuIGVzY2FwZSwgb3IgcmlnaHQgYWZ0ZXIgYSBiYWNrc2xhc2guCiAgICogRm9yIHBhcnRpYWwgc3RyaW5ncyBlbmRpbmcgaW5zaWRlIGEgVW5pY29kZSBlc2NhcGUsIHVzZQogICAqIFtjaHVua1N0cmluZ0VzY2FwZVVdLgogICAqLwogIGludCBjaHVua1N0cmluZyhpbnQgc3RyaW5nU3RhdGUpIHsKICAgIHBhcnRpYWxTdGF0ZSA9IFBBUlRJQUxfU1RSSU5HIHwgc3RyaW5nU3RhdGU7CiAgICByZXR1cm4gY2h1bmtFbmQ7CiAgfQoKICAvKioKICAgKiBTZXRzIHVwIGEgcGFydGlhbCBzdHJpbmcgc3RhdGUgZm9yIGEgcGFydGlhbGx5IHBhcnNlZCBVbmljb2RlIGVzY2FwZS4KICAgKgogICAqIFRoZSBwYXJ0aWFsIHN0cmluZyBzdGF0ZSBpbmNsdWRlcyB0aGUgY3VycmVudCBbYnVmZmVyXSBhbmQgdGhlCiAgICogbnVtYmVyIG9mIGhleCBkaWdpdHMgb2YgdGhlIFVuaWNvZGUgc2VlbiBzbyBmYXIgKGUuZy4sIGZvciBgIlx1MzAnKQogICAqIHRoZSBzdGF0ZSBrbm93cyB0aGF0IHR3byBkaWdpdHMgaGF2ZSBiZWVuIHNlZW4sIGFuZCB3aGF0IHRoZWlyIHZhbHVlIGlzLgogICAqCiAgICogUmV0dXJucyBbY2h1bmtFbmRdIHNvIGl0IGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgYSByZXR1cm4gc3RhdGVtZW50LgogICAqLwogIGludCBjaHVua1N0cmluZ0VzY2FwZVUoaW50IGNvdW50LCBpbnQgdmFsdWUpIHsKICAgIHBhcnRpYWxTdGF0ZSA9IFBBUlRJQUxfU1RSSU5HIHwKICAgICAgICBTVFJfVSB8CiAgICAgICAgKGNvdW50IDw8IFNUUl9VX0NPVU5UX1NISUZUKSB8CiAgICAgICAgKHZhbHVlIDw8IFNUUl9VX1ZBTFVFX1NISUZUKTsKICAgIHJldHVybiBjaHVua0VuZDsKICB9CgogIC8qKgogICAqIFBhcnNlcyB0aGUgcmVtYWluZGVyIG9mIGEgc3RyaW5nIGxpdGVyYWwgaW50byBhIGJ1ZmZlci4KICAgKgogICAqIFRoZSBidWZmZXIgaXMgc3RvcmVkIGluIFtidWZmZXJdIGFuZCBpdHMgdW5kZXJseWluZyBmb3JtYXQgZGVwZW5kcyBvbgogICAqIHRoZSBpbnB1dCBjaHVuayB0eXBlLiBGb3IgZXhhbXBsZSBVVEYtOCBkZWNvZGluZyBoYXBwZW5zIGluIHRoZQogICAqIGJ1ZmZlciwgbm90IGluIHRoZSBwYXJzZXIsIHNpbmNlIGFsbCBzaWduaWZpY2FudCBKU09OIGNoYXJhY3RlcnMgYXJlIEFTQ0lJLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBzY2FucyB0aHJvdWdoIHRoZSBzdHJpbmcgbGl0ZXJhbCBmb3IgZXNjYXBlcywgYW5kIGNvcGllcwogICAqIHNsaWNlcyBvZiBub24tZXNjYXBlIGNoYXJhY3RlcnMgdXNpbmcgW2FkZFNsaWNlVG9TdHJpbmddLgogICAqLwogIGludCBwYXJzZVN0cmluZ1RvQnVmZmVyKGludCBwb3NpdGlvbikgewogICAgaW50IGVuZCA9IGNodW5rRW5kOwogICAgaW50IHN0YXJ0ID0gcG9zaXRpb247CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAocG9zaXRpb24gPT0gZW5kKSB7CiAgICAgICAgaWYgKHBvc2l0aW9uID4gc3RhcnQpIHsKICAgICAgICAgIGFkZFNsaWNlVG9TdHJpbmcoc3RhcnQsIHBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNodW5rU3RyaW5nKFNUUl9QTEFJTik7CiAgICAgIH0KICAgICAgaW50IGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKyspOwogICAgICBpZiAoY2hhciA+IEJBQ0tTTEFTSCkgY29udGludWU7CiAgICAgIGlmIChjaGFyIDwgU1BBQ0UpIHsKICAgICAgICByZXR1cm4gZmFpbChwb3NpdGlvbiAtIDEpOyAvLyBDb250cm9sIGNoYXJhY3RlciBpbiBzdHJpbmcuCiAgICAgIH0KICAgICAgaWYgKGNoYXIgPT0gUVVPVEUpIHsKICAgICAgICBpbnQgcXVvdGVQb3NpdGlvbiA9IHBvc2l0aW9uIC0gMTsKICAgICAgICBpZiAocXVvdGVQb3NpdGlvbiA+IHN0YXJ0KSB7CiAgICAgICAgICBhZGRTbGljZVRvU3RyaW5nKHN0YXJ0LCBxdW90ZVBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlU3RyaW5nKGVuZFN0cmluZygpKTsKICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICAgIH0KICAgICAgaWYgKGNoYXIgIT0gQkFDS1NMQVNIKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgLy8gSGFuZGxlIGVzY2FwZS4KICAgICAgaWYgKHBvc2l0aW9uIC0gMSA+IHN0YXJ0KSB7CiAgICAgICAgYWRkU2xpY2VUb1N0cmluZyhzdGFydCwgcG9zaXRpb24gLSAxKTsKICAgICAgfQogICAgICBpZiAocG9zaXRpb24gPT0gZW5kKSByZXR1cm4gY2h1bmtTdHJpbmcoU1RSX0VTQ0FQRSk7CiAgICAgIHBvc2l0aW9uID0gcGFyc2VTdHJpbmdFc2NhcGUocG9zaXRpb24pOwogICAgICBpZiAocG9zaXRpb24gPT0gZW5kKSByZXR1cm4gcG9zaXRpb247CiAgICAgIHN0YXJ0ID0gcG9zaXRpb247CiAgICB9CiAgICByZXR1cm4gLTE7IC8vIFVOUkVBQ0hBQkxFLgogIH0KCiAgLyoqCiAgICogUGFyc2UgYSBzdHJpbmcgZXNjYXBlLgogICAqCiAgICogUG9zaXRpb24gaXMgcmlnaHQgYWZ0ZXIgdGhlIGluaXRpYWwgYmFja3NsYXNoLgogICAqIFRoZSBmb2xsb3dpbmcgZXNjYXBlIGlzIHBhcnNlZCBpbnRvIGEgY2hhcmFjdGVyIGNvZGUgd2hpY2ggaXMgYWRkZWQgdG8KICAgKiB0aGUgY3VycmVudCBzdHJpbmcgYnVmZmVyIHVzaW5nIFthZGRDaGFyVG9TdHJpbmddLgogICAqCiAgICogUmV0dXJucyBwb3NpdGlvbiBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIGVzY2FwZS4KICAgKi8KICBpbnQgcGFyc2VTdHJpbmdFc2NhcGUoaW50IHBvc2l0aW9uKSB7CiAgICBpbnQgY2hhciA9IGdldENoYXIocG9zaXRpb24rKyk7CiAgICBpbnQgbGVuZ3RoID0gY2h1bmtFbmQ7CiAgICBzd2l0Y2ggKGNoYXIpIHsKICAgICAgY2FzZSBDSEFSX2I6CiAgICAgICAgY2hhciA9IEJBQ0tTUEFDRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDSEFSX2Y6CiAgICAgICAgY2hhciA9IEZPUk1fRkVFRDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDSEFSX246CiAgICAgICAgY2hhciA9IE5FV0xJTkU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ0hBUl9yOgogICAgICAgIGNoYXIgPSBDQVJSSUFHRV9SRVRVUk47CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ0hBUl90OgogICAgICAgIGNoYXIgPSBUQUI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU0xBU0g6CiAgICAgIGNhc2UgQkFDS1NMQVNIOgogICAgICBjYXNlIFFVT1RFOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENIQVJfdToKICAgICAgICBpbnQgaGV4U3RhcnQgPSBwb3NpdGlvbiAtIDE7CiAgICAgICAgaW50IHZhbHVlID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgaWYgKHBvc2l0aW9uID09IGxlbmd0aCkgcmV0dXJuIGNodW5rU3RyaW5nRXNjYXBlVShpLCB2YWx1ZSk7CiAgICAgICAgICBjaGFyID0gZ2V0Q2hhcihwb3NpdGlvbisrKTsKICAgICAgICAgIGludCBkaWdpdCA9IGNoYXIgXiAweDMwOwogICAgICAgICAgdmFsdWUgKj0gMTY7CiAgICAgICAgICBpZiAoZGlnaXQgPD0gOSkgewogICAgICAgICAgICB2YWx1ZSArPSBkaWdpdDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRpZ2l0ID0gKGNoYXIgfCAweDIwKSAtIENIQVJfYTsKICAgICAgICAgICAgaWYgKGRpZ2l0IDwgMCB8fCBkaWdpdCA+IDUpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFpbChoZXhTdGFydCwgIkludmFsaWQgdW5pY29kZSBlc2NhcGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YWx1ZSArPSBkaWdpdCArIDEwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjaGFyID0gdmFsdWU7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgaWYgKGNoYXIgPCBTUEFDRSkgcmV0dXJuIGZhaWwocG9zaXRpb24sICJDb250cm9sIGNoYXJhY3RlciBpbiBzdHJpbmciKTsKICAgICAgICByZXR1cm4gZmFpbChwb3NpdGlvbiwgIlVucmVjb2duaXplZCBzdHJpbmcgZXNjYXBlIik7CiAgICB9CiAgICBhZGRDaGFyVG9TdHJpbmcoY2hhcik7CiAgICBpZiAocG9zaXRpb24gPT0gbGVuZ3RoKSByZXR1cm4gY2h1bmtTdHJpbmcoU1RSX1BMQUlOKTsKICAgIHJldHVybiBwb3NpdGlvbjsKICB9CgogIC8vLyBTZXRzIHVwIGEgcGFydGlhbCBudW1lcmFsIHN0YXRlLgogIC8vLyBSZXR1cm5zIGNodW5rRW5kIHRvIGFsbG93IGVhc3kgb25lLWxpbmUgYmFpbG91dCB0ZXN0cy4KICBpbnQgYmVnaW5DaHVua051bWJlcihpbnQgc3RhdGUsIGludCBzdGFydCkgewogICAgaW50IGVuZCA9IGNodW5rRW5kOwogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgdmFyIGJ1ZmZlciA9IG5ldyBfTnVtYmVyQnVmZmVyKGxlbmd0aCk7CiAgICBjb3B5Q2hhcnNUb0xpc3Qoc3RhcnQsIGVuZCwgYnVmZmVyLmxpc3QsIDApOwogICAgYnVmZmVyLmxlbmd0aCA9IGxlbmd0aDsKICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogICAgdGhpcy5wYXJ0aWFsU3RhdGUgPSBQQVJUSUFMX05VTUVSQUwgfCBzdGF0ZTsKICAgIHJldHVybiBlbmQ7CiAgfQoKICB2b2lkIGFkZE51bWJlckNodW5rKF9OdW1iZXJCdWZmZXIgYnVmZmVyLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBvdmVyaGVhZCkgewogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaW50IGNvdW50ID0gYnVmZmVyLmxlbmd0aDsKICAgIGludCBuZXdDb3VudCA9IGNvdW50ICsgbGVuZ3RoOwogICAgaW50IG5ld0NhcGFjaXR5ID0gbmV3Q291bnQgKyBvdmVyaGVhZDsKICAgIGJ1ZmZlci5lbnN1cmVDYXBhY2l0eShuZXdDYXBhY2l0eSk7CiAgICBjb3B5Q2hhcnNUb0xpc3Qoc3RhcnQsIGVuZCwgYnVmZmVyLmxpc3QsIGNvdW50KTsKICAgIGJ1ZmZlci5sZW5ndGggPSBuZXdDb3VudDsKICB9CgogIC8vIENvbnRpbnVlcyBhbiBhbHJlYWR5IGNodW5rZWQgbnVtYmVyIGFjcm9zcyBhbiBlbnRpcmUgY2h1bmsuCiAgaW50IGNvbnRpbnVlQ2h1bmtOdW1iZXIoaW50IHN0YXRlLCBpbnQgc3RhcnQsIF9OdW1iZXJCdWZmZXIgYnVmZmVyKSB7CiAgICBpbnQgZW5kID0gY2h1bmtFbmQ7CiAgICBhZGROdW1iZXJDaHVuayhidWZmZXIsIHN0YXJ0LCBlbmQsIF9OdW1iZXJCdWZmZXIua0RlZmF1bHRPdmVyaGVhZCk7CiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKICAgIHRoaXMucGFydGlhbFN0YXRlID0gUEFSVElBTF9OVU1FUkFMIHwgc3RhdGU7CiAgICByZXR1cm4gZW5kOwogIH0KCiAgaW50IGZpbmlzaENodW5rTnVtYmVyKGludCBzdGF0ZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBfTnVtYmVyQnVmZmVyIGJ1ZmZlcikgewogICAgaWYgKHN0YXRlID09IE5VTV9aRVJPKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU51bWJlcigwKTsKICAgICAgcmV0dXJuIGVuZDsKICAgIH0KICAgIGlmIChlbmQgPiBzdGFydCkgewogICAgICBhZGROdW1iZXJDaHVuayhidWZmZXIsIHN0YXJ0LCBlbmQsIDApOwogICAgfQogICAgaWYgKHN0YXRlID09IE5VTV9ESUdJVCkgewogICAgICBudW0gdmFsdWUgPSBidWZmZXIucGFyc2VOdW0oKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlTnVtYmVyKHZhbHVlKTsKICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gTlVNX0RPVF9ESUdJVCB8fCBzdGF0ZSA9PSBOVU1fRV9ESUdJVCkgewogICAgICBsaXN0ZW5lci5oYW5kbGVOdW1iZXIoYnVmZmVyLnBhcnNlRG91YmxlKCkpOwogICAgfSBlbHNlIHsKICAgICAgZmFpbChjaHVua0VuZCwgIlVudGVybWluYXRlZCBudW1iZXIgbGl0ZXJhbCIpOwogICAgfQogICAgcmV0dXJuIGVuZDsKICB9CgogIGludCBwYXJzZU51bWJlcihpbnQgY2hhciwgaW50IHBvc2l0aW9uKSB7CiAgICAvLyBBbHNvIGNhbGxlZCBvbiBhbnkgdW5leHBlY3RlZCBjaGFyYWN0ZXIuCiAgICAvLyBGb3JtYXQ6CiAgICAvLyAgJy0nPygnMCd8WzEtOV1bMC05XSopKCcuJ1swLTldKyk/KFtlRV1bKy1dP1swLTldKyk/CiAgICBpbnQgc3RhcnQgPSBwb3NpdGlvbjsKICAgIGludCBsZW5ndGggPSBjaHVua0VuZDsKICAgIC8vIENvbGxlY3RzIGFuIGludCB2YWx1ZSB3aGlsZSBwYXJzaW5nLiBVc2VkIGZvciBib3RoIGFuIGludGVnZXIgbGl0ZXJhbCwKICAgIC8vIGFuZCB0aGUgZXhwb25lbnQgcGFydCBvZiBhIGRvdWJsZSBsaXRlcmFsLgogICAgLy8gU3RvcmVkIGFzIG5lZ2F0aXZlIHRvIGVuc3VyZSB3ZSBjYW4gcmVwcmVzZW50IC0yXjYzLgogICAgaW50IGludFZhbHVlID0gMDsKICAgIGRvdWJsZSBkb3VibGVWYWx1ZSA9IDAuMDsgLy8gQ29sbGVjdCBkb3VibGUgdmFsdWUgd2hpbGUgcGFyc2luZy4KICAgIC8vIDEgaWYgdGhlcmUgaXMgbm8gbGVhZGluZyAtLCAtMSBpZiB0aGVyZSBpcy4KICAgIGludCBzaWduID0gMTsKICAgIGJvb2wgaXNEb3VibGUgPSBmYWxzZTsKICAgIC8vIEJyZWFrIHRoaXMgYmxvY2sgd2hlbiB0aGUgZW5kIG9mIHRoZSBudW1iZXIgbGl0ZXJhbCBpcyByZWFjaGVkLgogICAgLy8gQXQgdGhhdCB0aW1lLCBwb3NpdGlvbiBwb2ludHMgdG8gdGhlIG5leHQgY2hhcmFjdGVyLCBhbmQgaXNEb3VibGUKICAgIC8vIGlzIHNldCBpZiB0aGUgbGl0ZXJhbCBjb250YWlucyBhIGRlY2ltYWwgcG9pbnQgb3IgYW4gZXhwb25lbnRpYWwuCiAgICBpZiAoY2hhciA9PSBNSU5VUykgewogICAgICBzaWduID0gLTE7CiAgICAgIHBvc2l0aW9uKys7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybiBiZWdpbkNodW5rTnVtYmVyKE5VTV9TSUdOLCBzdGFydCk7CiAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgIH0KICAgIGludCBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICBpZiAoZGlnaXQgPiA5KSB7CiAgICAgIGlmIChzaWduIDwgMCkgewogICAgICAgIGZhaWwocG9zaXRpb24sICJNaXNzaW5nIGV4cGVjdGVkIGRpZ2l0Iik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gSWYgaXQgZG9lc24ndCBldmVuIHN0YXJ0IG91dCBhcyBhIG51bWVyYWwuCiAgICAgICAgZmFpbChwb3NpdGlvbik7CiAgICAgIH0KICAgIH0KICAgIGlmIChkaWdpdCA9PSAwKSB7CiAgICAgIHBvc2l0aW9uKys7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybiBiZWdpbkNodW5rTnVtYmVyKE5VTV9aRVJPLCBzdGFydCk7CiAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgZGlnaXQgPSBjaGFyIF4gQ0hBUl8wOwogICAgICAvLyBJZiBzdGFydGluZyB3aXRoIHplcm8sIG5leHQgY2hhcmFjdGVyIG11c3Qgbm90IGJlIGRpZ2l0LgogICAgICBpZiAoZGlnaXQgPD0gOSkgZmFpbChwb3NpdGlvbik7CiAgICB9IGVsc2UgewogICAgICBpbnQgZGlnaXRDb3VudCA9IDA7CiAgICAgIGRvIHsKICAgICAgICBpZiAoZGlnaXRDb3VudCA+PSAxOCkgewogICAgICAgICAgLy8gQ2hlY2sgZm9yIG92ZXJmbG93LgogICAgICAgICAgLy8gSXMgMSBpZiBkaWdpdCBpcyA4IG9yIDkgYW5kIHNpZ24gPT0gMCwgb3IgZGlnaXQgaXMgOSBhbmQgc2lnbiA8IDA7CiAgICAgICAgICBpbnQgaGlnaERpZ2l0ID0gZGlnaXQgPj4gMzsKICAgICAgICAgIGlmIChzaWduIDwgMCkgaGlnaERpZ2l0ICY9IGRpZ2l0OwogICAgICAgICAgaWYgKGRpZ2l0Q291bnQgPT0gMTkgfHwgaW50VmFsdWUgLSBoaWdoRGlnaXQgPCAtOTIyMzM3MjAzNjg1NDc3NTgwKSB7CiAgICAgICAgICAgIGlzRG91YmxlID0gdHJ1ZTsKICAgICAgICAgICAgLy8gQmlnIHZhbHVlIHRoYXQgd2Uga25vdyBpcyBub3QgdHJ1c3RlZCB0byBiZSBleGFjdCBsYXRlciwKICAgICAgICAgICAgLy8gZm9yY2luZyByZXBhcnNpbmcgdXNpbmcgYGRvdWJsZS5wYXJzZWAuCiAgICAgICAgICAgIGRvdWJsZVZhbHVlID0gOTIyMzM3MjAzNjg1NDc3NTgwOC4wOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbnRWYWx1ZSA9IDEwICogaW50VmFsdWUgLSBkaWdpdDsKICAgICAgICBkaWdpdENvdW50Kys7CiAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICBpZiAocG9zaXRpb24gPT0gbGVuZ3RoKSByZXR1cm4gYmVnaW5DaHVua051bWJlcihOVU1fRElHSVQsIHN0YXJ0KTsKICAgICAgICBjaGFyID0gZ2V0Q2hhcihwb3NpdGlvbik7CiAgICAgICAgZGlnaXQgPSBjaGFyIF4gQ0hBUl8wOwogICAgICB9IHdoaWxlIChkaWdpdCA8PSA5KTsKICAgIH0KICAgIGlmIChjaGFyID09IERFQ0lNQUxQT0lOVCkgewogICAgICBpZiAoIWlzRG91YmxlKSB7CiAgICAgICAgaXNEb3VibGUgPSB0cnVlOwogICAgICAgIGRvdWJsZVZhbHVlID0gKGludFZhbHVlID09IDApID8gMC4wIDogLWludFZhbHVlLnRvRG91YmxlKCk7CiAgICAgIH0KICAgICAgaW50VmFsdWUgPSAwOwogICAgICBwb3NpdGlvbisrOwogICAgICBpZiAocG9zaXRpb24gPT0gbGVuZ3RoKSByZXR1cm4gYmVnaW5DaHVua051bWJlcihOVU1fRE9ULCBzdGFydCk7CiAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgZGlnaXQgPSBjaGFyIF4gQ0hBUl8wOwogICAgICBpZiAoZGlnaXQgPiA5KSBmYWlsKHBvc2l0aW9uKTsKICAgICAgZG8gewogICAgICAgIGRvdWJsZVZhbHVlID0gMTAuMCAqIGRvdWJsZVZhbHVlICsgZGlnaXQ7CiAgICAgICAgaW50VmFsdWUgLT0gMTsKICAgICAgICBwb3NpdGlvbisrOwogICAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybiBiZWdpbkNodW5rTnVtYmVyKE5VTV9ET1RfRElHSVQsIHN0YXJ0KTsKICAgICAgICBjaGFyID0gZ2V0Q2hhcihwb3NpdGlvbik7CiAgICAgICAgZGlnaXQgPSBjaGFyIF4gQ0hBUl8wOwogICAgICB9IHdoaWxlIChkaWdpdCA8PSA5KTsKICAgIH0KICAgIGlmICgoY2hhciB8IDB4MjApID09IENIQVJfZSkgewogICAgICBpZiAoIWlzRG91YmxlKSB7CiAgICAgICAgaXNEb3VibGUgPSB0cnVlOwogICAgICAgIGRvdWJsZVZhbHVlID0gKGludFZhbHVlID09IDApID8gMC4wIDogLWludFZhbHVlLnRvRG91YmxlKCk7CiAgICAgICAgaW50VmFsdWUgPSAwOwogICAgICB9CiAgICAgIHBvc2l0aW9uKys7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybiBiZWdpbkNodW5rTnVtYmVyKE5VTV9FLCBzdGFydCk7CiAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgaW50IGV4cFNpZ24gPSAxOwogICAgICBpbnQgZXhwb25lbnQgPSAwOwogICAgICBpZiAoKChjaGFyICsgMSkgfCAyKSA9PSAweDJlIC8qKyBvciAtKi8pIHsKICAgICAgICBleHBTaWduID0gMHgyQyAtIGNoYXI7IC8vIC0xIGZvciBNSU5VUywgKzEgZm9yIFBMVVMKICAgICAgICBwb3NpdGlvbisrOwogICAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybiBiZWdpbkNodW5rTnVtYmVyKE5VTV9FX1NJR04sIHN0YXJ0KTsKICAgICAgICBjaGFyID0gZ2V0Q2hhcihwb3NpdGlvbik7CiAgICAgIH0KICAgICAgZGlnaXQgPSBjaGFyIF4gQ0hBUl8wOwogICAgICBpZiAoZGlnaXQgPiA5KSB7CiAgICAgICAgZmFpbChwb3NpdGlvbiwgIk1pc3NpbmcgZXhwZWN0ZWQgZGlnaXQiKTsKICAgICAgfQogICAgICBib29sIGV4cG9uZW50T3ZlcmZsb3cgPSBmYWxzZTsKICAgICAgZG8gewogICAgICAgIGV4cG9uZW50ID0gMTAgKiBleHBvbmVudCArIGRpZ2l0OwogICAgICAgIGlmIChleHBvbmVudCA+IDQwMCkgZXhwb25lbnRPdmVyZmxvdyA9IHRydWU7CiAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICBpZiAocG9zaXRpb24gPT0gbGVuZ3RoKSByZXR1cm4gYmVnaW5DaHVua051bWJlcihOVU1fRV9ESUdJVCwgc3RhcnQpOwogICAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgICBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICAgIH0gd2hpbGUgKGRpZ2l0IDw9IDkpOwogICAgICBpZiAoZXhwb25lbnRPdmVyZmxvdykgewogICAgICAgIGlmIChkb3VibGVWYWx1ZSA9PSAwLjAgfHwgZXhwU2lnbiA8IDApIHsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZU51bWJlcihzaWduIDwgMCA/IC0wLjAgOiAwLjApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVOdW1iZXIoCiAgICAgICAgICAgICAgc2lnbiA8IDAgPyBkb3VibGUubmVnYXRpdmVJbmZpbml0eSA6IGRvdWJsZS5pbmZpbml0eSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgfQogICAgICBpbnRWYWx1ZSArPSBleHBTaWduICogZXhwb25lbnQ7CiAgICB9CiAgICBpZiAoIWlzRG91YmxlKSB7CiAgICAgIGludCBiaXRGbGFnID0gLShzaWduICsgMSkgPj4gMTsgLy8gMCBpZiBzaWduID09IC0xLCAtMSBpZiBzaWduID09IDEKICAgICAgLy8gTmVnYXRlIGlmIGJpdEZsYWcgaXMgLTEgYnkgZG9pbmcgfmludFZhbHVlICsgMQogICAgICBsaXN0ZW5lci5oYW5kbGVOdW1iZXIoKGludFZhbHVlIF4gYml0RmxhZykgLSBiaXRGbGFnKTsKICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgfQogICAgLy8gRG91YmxlIHZhbHVlcyBhdCBvciBhYm92ZSB0aGlzIHZhbHVlICgyICoqIDUzKSBtYXkgaGF2ZSBsb3N0IHByZWNpc2lvbi4KICAgIC8vIE9ubHkgdHJ1c3QgcmVzdWx0cyB0aGF0IGFyZSBiZWxvdyB0aGlzIHZhbHVlLgogICAgY29uc3QgZG91YmxlIG1heEV4YWN0RG91YmxlID0gOTAwNzE5OTI1NDc0MDk5Mi4wOwogICAgaWYgKGRvdWJsZVZhbHVlIDwgbWF4RXhhY3REb3VibGUpIHsKICAgICAgaW50IGV4cG9uZW50ID0gaW50VmFsdWU7CiAgICAgIGRvdWJsZSBzaWduZWRNYW50aXNzYSA9IGRvdWJsZVZhbHVlICogc2lnbjsKICAgICAgaWYgKGV4cG9uZW50ID49IC0yMikgewogICAgICAgIGlmIChleHBvbmVudCA8IDApIHsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZU51bWJlcihzaWduZWRNYW50aXNzYSAvIFBPV0VSU19PRl9URU5bLWV4cG9uZW50XSk7CiAgICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICAgICAgfQogICAgICAgIGlmIChleHBvbmVudCA9PSAwKSB7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVOdW1iZXIoc2lnbmVkTWFudGlzc2EpOwogICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgICAgIH0KICAgICAgICBpZiAoZXhwb25lbnQgPD0gMjIpIHsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZU51bWJlcihzaWduZWRNYW50aXNzYSAqIFBPV0VSU19PRl9URU5bZXhwb25lbnRdKTsKICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBvdXRzaWRlIHRoZSByYW5nZSArLy1tYXhFeGFjdERvdWJsZSBvcgogICAgLy8gZXhwb25lbnQgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgKy8tMjIsIHRoZW4gd2UgY2FuJ3QgdHJ1c3Qgc2ltcGxlIGRvdWJsZQogICAgLy8gYXJpdGhtZXRpYyB0byBnZXQgdGhlIGV4YWN0IHJlc3VsdCwgc28gd2UgdXNlIHRoZSBzeXN0ZW0gZG91YmxlIHBhcnNpbmcuCiAgICBsaXN0ZW5lci5oYW5kbGVOdW1iZXIocGFyc2VEb3VibGUoc3RhcnQsIHBvc2l0aW9uKSk7CiAgICByZXR1cm4gcG9zaXRpb247CiAgfQoKICBmYWlsKGludCBwb3NpdGlvbiwgW1N0cmluZyBtZXNzYWdlXSkgewogICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewogICAgICBtZXNzYWdlID0gIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIjsKICAgICAgaWYgKHBvc2l0aW9uID09IGNodW5rRW5kKSBtZXNzYWdlID0gIlVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IjsKICAgIH0KICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24obWVzc2FnZSwgY2h1bmssIHBvc2l0aW9uKTsKICB9Cn0KCi8qKgogKiBDaHVua2VkIEpTT04gcGFyc2VyIHRoYXQgcGFyc2VzIFtTdHJpbmddIGNodW5rcy4KICovCmNsYXNzIF9Kc29uU3RyaW5nUGFyc2VyIGV4dGVuZHMgX0NodW5rZWRKc29uUGFyc2VyPFN0cmluZz4gewogIFN0cmluZyBjaHVuazsKICBpbnQgY2h1bmtFbmQ7CgogIF9Kc29uU3RyaW5nUGFyc2VyKF9Kc29uTGlzdGVuZXIgbGlzdGVuZXIpIDogc3VwZXIobGlzdGVuZXIpOwoKICBpbnQgZ2V0Q2hhcihpbnQgcG9zaXRpb24pID0+IGNodW5rLmNvZGVVbml0QXQocG9zaXRpb24pOwoKICBTdHJpbmcgZ2V0U3RyaW5nKGludCBzdGFydCwgaW50IGVuZCwgaW50IGJpdHMpIHsKICAgIHJldHVybiBjaHVuay5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgfQoKICB2b2lkIGJlZ2luU3RyaW5nKCkgewogICAgdGhpcy5idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgfQoKICB2b2lkIGFkZFNsaWNlVG9TdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gdGhpcy5idWZmZXI7CiAgICBidWZmZXIud3JpdGUoY2h1bmsuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKTsKICB9CgogIHZvaWQgYWRkQ2hhclRvU3RyaW5nKGludCBjaGFyQ29kZSkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgYnVmZmVyLndyaXRlQ2hhckNvZGUoY2hhckNvZGUpOwogIH0KCiAgU3RyaW5nIGVuZFN0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIHRoaXMuYnVmZmVyID0gbnVsbDsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIHZvaWQgY29weUNoYXJzVG9MaXN0KGludCBzdGFydCwgaW50IGVuZCwgTGlzdCB0YXJnZXQsIGludCBvZmZzZXQpIHsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgdGFyZ2V0W29mZnNldCArIGldID0gY2h1bmsuY29kZVVuaXRBdChzdGFydCArIGkpOwogICAgfQogIH0KCiAgZG91YmxlIHBhcnNlRG91YmxlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgcmV0dXJuIF9wYXJzZURvdWJsZShjaHVuaywgc3RhcnQsIGVuZCk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgSnNvbkRlY29kZXIgewogIEBwYXRjaAogIFN0cmluZ0NvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxPYmplY3Q+IHNpbmspIHsKICAgIHJldHVybiBuZXcgX0pzb25TdHJpbmdEZWNvZGVyU2luayh0aGlzLl9yZXZpdmVyLCBzaW5rKTsKICB9Cn0KCi8qKgogKiBJbXBsZW1lbnRzIHRoZSBjaHVua2VkIGNvbnZlcnNpb24gZnJvbSBhIEpTT04gc3RyaW5nIHRvIGl0cyBjb3JyZXNwb25kaW5nCiAqIG9iamVjdC4KICoKICogVGhlIHNpbmsgb25seSBjcmVhdGVzIG9uZSBvYmplY3QsIGJ1dCBpdHMgaW5wdXQgY2FuIGJlIGNodW5rZWQuCiAqLwpjbGFzcyBfSnNvblN0cmluZ0RlY29kZXJTaW5rIGV4dGVuZHMgU3RyaW5nQ29udmVyc2lvblNpbmtCYXNlIHsKICBfSnNvblN0cmluZ1BhcnNlciBfcGFyc2VyOwogIGZpbmFsIEZ1bmN0aW9uKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgX3Jldml2ZXI7CiAgZmluYWwgU2luazxPYmplY3Q+IF9zaW5rOwoKICBfSnNvblN0cmluZ0RlY29kZXJTaW5rKHRoaXMuX3Jldml2ZXIsIHRoaXMuX3NpbmspCiAgICAgIDogX3BhcnNlciA9IF9jcmVhdGVQYXJzZXIoX3Jldml2ZXIpOwoKICBzdGF0aWMgX0pzb25TdHJpbmdQYXJzZXIgX2NyZWF0ZVBhcnNlcihyZXZpdmVyKSB7CiAgICBfQnVpbGRKc29uTGlzdGVuZXIgbGlzdGVuZXI7CiAgICBpZiAocmV2aXZlciA9PSBudWxsKSB7CiAgICAgIGxpc3RlbmVyID0gbmV3IF9CdWlsZEpzb25MaXN0ZW5lcigpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIgPSBuZXcgX1Jldml2ZXJKc29uTGlzdGVuZXIocmV2aXZlcik7CiAgICB9CiAgICByZXR1cm4gbmV3IF9Kc29uU3RyaW5nUGFyc2VyKGxpc3RlbmVyKTsKICB9CgogIHZvaWQgYWRkU2xpY2UoU3RyaW5nIGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBfcGFyc2VyLmNodW5rID0gY2h1bms7CiAgICBfcGFyc2VyLmNodW5rRW5kID0gZW5kOwogICAgX3BhcnNlci5wYXJzZShzdGFydCk7CiAgICBpZiAoaXNMYXN0KSBfcGFyc2VyLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChTdHJpbmcgY2h1bmspIHsKICAgIGFkZFNsaWNlKGNodW5rLCAwLCBjaHVuay5sZW5ndGgsIGZhbHNlKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfcGFyc2VyLmNsb3NlKCk7CiAgICB2YXIgZGVjb2RlZCA9IF9wYXJzZXIucmVzdWx0OwogICAgX3NpbmsuYWRkKGRlY29kZWQpOwogICAgX3NpbmsuY2xvc2UoKTsKICB9CgogIEJ5dGVDb252ZXJzaW9uU2luayBhc1V0ZjhTaW5rKGJvb2wgYWxsb3dNYWxmb3JtZWQpIHsKICAgIF9wYXJzZXIgPSBudWxsOwogICAgcmV0dXJuIG5ldyBfSnNvblV0ZjhEZWNvZGVyU2luayhfcmV2aXZlciwgX3NpbmssIGFsbG93TWFsZm9ybWVkKTsKICB9Cn0KCmNsYXNzIF9VdGY4U3RyaW5nQnVmZmVyIHsKICBzdGF0aWMgY29uc3QgaW50IElOSVRJQUxfQ0FQQUNJVFkgPSAzMjsKICAvLyBQYXJ0aWFsIHN0YXRlIGVuY29kaW5nLgogIHN0YXRpYyBjb25zdCBpbnQgTUFTS19UV09fQklUID0gMHgwMzsKICBzdGF0aWMgY29uc3QgaW50IE1BU0tfU0laRSA9IE1BU0tfVFdPX0JJVDsKICBzdGF0aWMgY29uc3QgaW50IFNISUZUX01JU1NJTkcgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgU0hJRlRfVkFMVUUgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgTk9fUEFSVElBTCA9IDA7CgogIC8vIFVURi04IGVuY29kaW5nIGFuZCBsaW1pdHMuCiAgc3RhdGljIGNvbnN0IGludCBNQVhfQVNDSUkgPSAxMjc7CiAgc3RhdGljIGNvbnN0IGludCBNQVhfVFdPX0JZVEUgPSAweDdmZjsKICBzdGF0aWMgY29uc3QgaW50IE1BWF9USFJFRV9CWVRFID0gMHhmZmZmOwogIHN0YXRpYyBjb25zdCBpbnQgTUFYX1VOSUNPREUgPSAwWDEwZmZmZjsKICBzdGF0aWMgY29uc3QgaW50IE1BU0tfVFdPX0JZVEUgPSAweDFmOwogIHN0YXRpYyBjb25zdCBpbnQgTUFTS19USFJFRV9CWVRFID0gMHgwZjsKICBzdGF0aWMgY29uc3QgaW50IE1BU0tfRk9VUl9CWVRFID0gMHgwNzsKICBzdGF0aWMgY29uc3QgaW50IE1BU0tfQ09OVElOVUVfVEFHID0gMHhDMDsKICBzdGF0aWMgY29uc3QgaW50IE1BU0tfQ09OVElOVUVfVkFMVUUgPSAweDNmOwogIHN0YXRpYyBjb25zdCBpbnQgQ09OVElOVUVfVEFHID0gMHg4MDsKCiAgLy8gVVRGLTE2IHN1cnJvZ2F0ZSBlbmNvZGluZy4KICBzdGF0aWMgY29uc3QgaW50IExFQURfU1VSUk9HQVRFID0gMHhEODAwOwogIHN0YXRpYyBjb25zdCBpbnQgVEFJTF9TVVJST0dBVEUgPSAweERDMDA7CiAgc3RhdGljIGNvbnN0IGludCBTSElGVF9ISUdIX1NVUlJPR0FURSA9IDEwOwogIHN0YXRpYyBjb25zdCBpbnQgTUFTS19MT1dfU1VSUk9HQVRFID0gMHgzZmY7CgogIC8vIFRoZSBpbnRlcm5hbCBidWZmZXIgc3RhcnRzIGFzIFVpbnQ4TGlzdCwgYnV0IG1heSBjaGFuZ2UgdG8gVWludDE2TGlzdAogIC8vIGlmIHRoZSBzdHJpbmcgY29udGFpbnMgbm9uLUxhdGluLTEgY2hhcmFjdGVycy4KICBMaXN0PGludD4gYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChJTklUSUFMX0NBUEFDSVRZKTsKICAvLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gYnVmZmVyLgogIGludCBsZW5ndGggPSAwOwogIC8vIFBhcnRpYWwgZGVjb2Rpbmcgc3RhdGUsIGZvciBjYXNlcyB3aGVyZSBhbiBVVEYtOCBzZXF1ZW5jZXMgaXMgc3BsaXQKICAvLyBiZXR3ZWVuIGNodW5rcy4KICBpbnQgcGFydGlhbFN0YXRlID0gTk9fUEFSVElBTDsKICAvLyBXaGV0aGVyIGFsbCBjaGFyYWN0ZXJzIHNvIGZhciBoYXZlIGJlZW4gTGF0aW4tMSAoYW5kIHRoZSBidWZmZXIgaXMKICAvLyBzdGlsbCBhIFVpbnQ4TGlzdCkuIFNldCB0byBmYWxzZSB3aGVuIHRoZSBmaXJzdCBub24tTGF0aW4tMSBjaGFyYWN0ZXIKICAvLyBpcyBlbmNvdW50ZXJlZCwgYW5kIHRoZSBidWZmZXIgaXMgdGhlbiBhbHNvIGNvbnZlcnRlZCB0byBhIFVpbnQxNkxpc3QuCiAgYm9vbCBpc0xhdGluMSA9IHRydWU7CiAgLy8gSWYgYWxsb3dpbmcgbWFsZm9ybWVkLCBpbnZhbGlkIFVURi04IHNlcXVlbmNlcyBhcmUgY29udmVydGVkIHRvCiAgLy8gVStGRkZELgogIGJvb2wgYWxsb3dNYWxmb3JtZWQ7CgogIF9VdGY4U3RyaW5nQnVmZmVyKHRoaXMuYWxsb3dNYWxmb3JtZWQpOwoKICAvKioKICAgKiBQYXJzZSB0aGUgY29udGludWF0aW9uIG9mIGEgbXVsdGktYnl0ZSBVVEYtOCBzZXF1ZW5jZS4KICAgKgogICAqIFBhcnNlIFt1dGY4XSBmcm9tIFtwb3NpdGlvbl0gdG8gW2VuZF0uIElmIHRoZSBzZXF1ZW5jZSBleHRlbmRzIGJleW9uZAogICAqIGBlbmRgLCBzdG9yZSB0aGUgcGFydGlhbCBzdGF0ZSBpbiBbcGFydGlhbFN0YXRlXSwgYW5kIGNvbnRpbnVlIGZyb20gdGhlcmUKICAgKiBvbiB0aGUgbmV4dCBhZGRlZCBzbGljZS4KICAgKgogICAqIFRoZSBbc2l6ZV0gaXMgdGhlIG51bWJlciBvZiBleHBlY3RlZCBjb250aW51YXRpb24gYnl0ZXMgdG90YWwsCiAgICogYW5kIFttaXNzaW5nXSBpcyB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBjb250aW51YXRpb24gYnl0ZXMuCiAgICogVGhlIFtzaXplXSBpcyB1c2VkIHRvIGRldGVjdCBvdmVybG9uZyBlbmNvZGluZ3MuCiAgICogVGhlIFt2YWx1ZV0gaXMgdGhlIHZhbHVlIGNvbGxlY3RlZCBzbyBmYXIuCiAgICoKICAgKiBXaGVuIGNhbGxlZCBhZnRlciBzZWVpbmcgdGhlIGZpcnN0IG11bHRpLWJ5dGUgbWFya2VyLCB0aGUgW3NpemVdIGFuZAogICAqIFttaXNzaW5nXSB2YWx1ZXMgYXJlIGFsd2F5cyB0aGUgc2FtZSwgYnV0IHRoZXkgbWF5IGRpZmZlciBpZiBjb250aW51aW5nCiAgICogYWZ0ZXIgYSBwYXJ0aWFsIHNlcXVlbmNlLgogICAqLwogIGludCBhZGRDb250aW51YXRpb24oCiAgICAgIExpc3Q8aW50PiB1dGY4LCBpbnQgcG9zaXRpb24sIGludCBlbmQsIGludCBzaXplLCBpbnQgbWlzc2luZywgaW50IHZhbHVlKSB7CiAgICBpbnQgY29kZUVuZCA9IHBvc2l0aW9uICsgbWlzc2luZzsKICAgIGRvIHsKICAgICAgaWYgKHBvc2l0aW9uID09IGVuZCkgewogICAgICAgIG1pc3NpbmcgPSBjb2RlRW5kIC0gcG9zaXRpb247CiAgICAgICAgcGFydGlhbFN0YXRlID0KICAgICAgICAgICAgc2l6ZSB8IChtaXNzaW5nIDw8IFNISUZUX01JU1NJTkcpIHwgKHZhbHVlIDw8IFNISUZUX1ZBTFVFKTsKICAgICAgICByZXR1cm4gZW5kOwogICAgICB9CiAgICAgIGludCBjaGFyID0gdXRmOFtwb3NpdGlvbl07CiAgICAgIGlmICgoY2hhciAmIE1BU0tfQ09OVElOVUVfVEFHKSAhPSBDT05USU5VRV9UQUcpIHsKICAgICAgICBpZiAoYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICAgIGFkZENoYXJDb2RlKDB4RkZGRCk7CiAgICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICJFeHBlY3RlZCBVVEYtOCBjb250aW51YXRpb24gYnl0ZSwgIgogICAgICAgICAgICAiZm91bmQgJGNoYXIiLAogICAgICAgICAgICB1dGY4LAogICAgICAgICAgICBwb3NpdGlvbik7CiAgICAgIH0KICAgICAgdmFsdWUgPSA2NCAqIHZhbHVlICsgKGNoYXIgJiBNQVNLX0NPTlRJTlVFX1ZBTFVFKTsKICAgICAgcG9zaXRpb24rKzsKICAgIH0gd2hpbGUgKHBvc2l0aW9uIDwgY29kZUVuZCk7CiAgICBpZiAodmFsdWUgPD0gY29uc3QgWzAsIE1BWF9BU0NJSSwgTUFYX1RXT19CWVRFLCBNQVhfVEhSRUVfQllURV1bc2l6ZV0pIHsKICAgICAgLy8gT3Zlci1sb25nIGVuY29kaW5nLgogICAgICBpZiAoYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICB2YWx1ZSA9IDB4RkZGRDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAiSW52YWxpZCBlbmNvZGluZzogVSske3ZhbHVlLnRvUmFkaXhTdHJpbmcoMTYpLnBhZExlZnQoNCwgJzAnKX0iCiAgICAgICAgICAgICIgZW5jb2RlZCBpbiAke3NpemUgKyAxfSBieXRlcy4iLAogICAgICAgICAgICB1dGY4LAogICAgICAgICAgICBwb3NpdGlvbiAtIDEpOwogICAgICB9CiAgICB9CiAgICBhZGRDaGFyQ29kZSh2YWx1ZSk7CiAgICByZXR1cm4gcG9zaXRpb247CiAgfQoKICB2b2lkIGFkZENoYXJDb2RlKGludCBjaGFyKSB7CiAgICBhc3NlcnQoY2hhciA+PSAwKTsKICAgIGFzc2VydChjaGFyIDw9IE1BWF9VTklDT0RFKTsKICAgIGlmIChwYXJ0aWFsU3RhdGUgIT0gTk9fUEFSVElBTCkgewogICAgICBpZiAoYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICBwYXJ0aWFsU3RhdGUgPSBOT19QQVJUSUFMOwogICAgICAgIGFkZENoYXJDb2RlKDB4RkZGRCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiSW5jb21wbGV0ZSBVVEYtOCBzZXF1ZW5jZSIpOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNMYXRpbjEgJiYgY2hhciA+IDB4ZmYpIHsKICAgICAgX3RvMTZCaXQoKTsgLy8gQWxzbyBncm93cyBhIGxpdHRsZSBpZiBjbG9zZSB0byBmdWxsLgogICAgfQogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgaWYgKGNoYXIgPD0gTUFYX1RIUkVFX0JZVEUpIHsKICAgICAgaWYgKGxlbmd0aCA9PSBidWZmZXIubGVuZ3RoKSBfZ3JvdygpOwogICAgICBidWZmZXJbbGVuZ3RoXSA9IGNoYXI7CiAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoICsgMTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGxlbmd0aCArIDIgPiBidWZmZXIubGVuZ3RoKSBfZ3JvdygpOwogICAgaW50IGJpdHMgPSBjaGFyIC0gMHgxMDAwMDsKICAgIGJ1ZmZlcltsZW5ndGhdID0gTEVBRF9TVVJST0dBVEUgfCAoYml0cyA+PiBTSElGVF9ISUdIX1NVUlJPR0FURSk7CiAgICBidWZmZXJbbGVuZ3RoICsgMV0gPSBUQUlMX1NVUlJPR0FURSB8IChiaXRzICYgTUFTS19MT1dfU1VSUk9HQVRFKTsKICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoICsgMjsKICB9CgogIHZvaWQgX3RvMTZCaXQoKSB7CiAgICBhc3NlcnQoaXNMYXRpbjEpOwogICAgVWludDE2TGlzdCBuZXdCdWZmZXI7CiAgICBpZiAoKGxlbmd0aCArIElOSVRJQUxfQ0FQQUNJVFkpICogMiA8PSBidWZmZXIubGVuZ3RoKSB7CiAgICAgIC8vIFJldXNlIGV4aXN0aW5nIGJ1ZmZlciBpZiBpdCdzIGJpZyBlbm91Z2guCiAgICAgIG5ld0J1ZmZlciA9IG5ldyBVaW50MTZMaXN0LnZpZXcoKGJ1ZmZlciBhcyBVaW50OExpc3QpLmJ1ZmZlcik7CiAgICB9IGVsc2UgewogICAgICBpbnQgbmV3Q2FwYWNpdHkgPSBidWZmZXIubGVuZ3RoOwogICAgICBpZiAobmV3Q2FwYWNpdHkgLSBsZW5ndGggPCBJTklUSUFMX0NBUEFDSVRZKSB7CiAgICAgICAgbmV3Q2FwYWNpdHkgPSBsZW5ndGggKyBJTklUSUFMX0NBUEFDSVRZOwogICAgICB9CiAgICAgIG5ld0J1ZmZlciA9IG5ldyBVaW50MTZMaXN0KG5ld0NhcGFjaXR5KTsKICAgIH0KICAgIG5ld0J1ZmZlci5zZXRSYW5nZSgwLCBsZW5ndGgsIGJ1ZmZlcik7CiAgICBidWZmZXIgPSBuZXdCdWZmZXI7CiAgICBpc0xhdGluMSA9IGZhbHNlOwogIH0KCiAgdm9pZCBfZ3JvdygpIHsKICAgIGludCBuZXdDYXBhY2l0eSA9IGJ1ZmZlci5sZW5ndGggKiAyOwogICAgTGlzdCBuZXdCdWZmZXI7CiAgICBpZiAoaXNMYXRpbjEpIHsKICAgICAgbmV3QnVmZmVyID0gbmV3IFVpbnQ4TGlzdChuZXdDYXBhY2l0eSk7CiAgICB9IGVsc2UgewogICAgICBuZXdCdWZmZXIgPSBuZXcgVWludDE2TGlzdChuZXdDYXBhY2l0eSk7CiAgICB9CiAgICBuZXdCdWZmZXIuc2V0UmFuZ2UoMCwgbGVuZ3RoLCBidWZmZXIpOwogICAgYnVmZmVyID0gbmV3QnVmZmVyOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gdXRmOCwgaW50IHBvc2l0aW9uLCBpbnQgZW5kKSB7CiAgICBhc3NlcnQocG9zaXRpb24gPCBlbmQpOwogICAgaWYgKHBhcnRpYWxTdGF0ZSA+IDApIHsKICAgICAgaW50IGNvbnRpbnVlQnl0ZUNvdW50ID0gKHBhcnRpYWxTdGF0ZSAmIE1BU0tfVFdPX0JJVCk7CiAgICAgIGludCBtaXNzaW5nID0gKHBhcnRpYWxTdGF0ZSA+PiBTSElGVF9NSVNTSU5HKSAmIE1BU0tfVFdPX0JJVDsKICAgICAgaW50IHZhbHVlID0gcGFydGlhbFN0YXRlID4+IFNISUZUX1ZBTFVFOwogICAgICBwYXJ0aWFsU3RhdGUgPSBOT19QQVJUSUFMOwogICAgICBwb3NpdGlvbiA9IGFkZENvbnRpbnVhdGlvbigKICAgICAgICAgIHV0ZjgsIHBvc2l0aW9uLCBlbmQsIGNvbnRpbnVlQnl0ZUNvdW50LCBtaXNzaW5nLCB2YWx1ZSk7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBlbmQpIHJldHVybjsKICAgIH0KICAgIC8vIEtlZXAgaW5kZXggYW5kIGNhcGFjaXR5IGluIGxvY2FsIHZhcmlhYmxlcyB3aGlsZSBsb29waW5nIG92ZXIKICAgIC8vIEFTQ0lJIGNoYXJhY3RlcnMuCiAgICBpbnQgaW5kZXggPSBsZW5ndGg7CiAgICBpbnQgY2FwYWNpdHkgPSBidWZmZXIubGVuZ3RoOwogICAgd2hpbGUgKHBvc2l0aW9uIDwgZW5kKSB7CiAgICAgIGludCBjaGFyID0gdXRmOFtwb3NpdGlvbl07CiAgICAgIGlmIChjaGFyIDw9IE1BWF9BU0NJSSkgewogICAgICAgIGlmIChpbmRleCA9PSBjYXBhY2l0eSkgewogICAgICAgICAgbGVuZ3RoID0gaW5kZXg7CiAgICAgICAgICBfZ3JvdygpOwogICAgICAgICAgY2FwYWNpdHkgPSBidWZmZXIubGVuZ3RoOwogICAgICAgIH0KICAgICAgICBidWZmZXJbaW5kZXgrK10gPSBjaGFyOwogICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgbGVuZ3RoID0gaW5kZXg7CiAgICAgIGlmICgoY2hhciAmIE1BU0tfQ09OVElOVUVfVEFHKSA9PSBDT05USU5VRV9UQUcpIHsKICAgICAgICBpZiAoYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICAgIGFkZENoYXJDb2RlKDB4RkZGRCk7CiAgICAgICAgICBwb3NpdGlvbisrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAgICJVbmV4cGVjdGVkIFVURi04IGNvbnRpbnVhdGlvbiBieXRlIiwgdXRmOCwgcG9zaXRpb24pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaGFyIDwgMHhFMCkgewogICAgICAgIC8vIEMwLURGCiAgICAgICAgLy8gVHdvLWJ5dGUuCiAgICAgICAgcG9zaXRpb24gPSBhZGRDb250aW51YXRpb24oCiAgICAgICAgICAgIHV0ZjgsIHBvc2l0aW9uICsgMSwgZW5kLCAxLCAxLCBjaGFyICYgTUFTS19UV09fQllURSk7CiAgICAgIH0gZWxzZSBpZiAoY2hhciA8IDB4RjApIHsKICAgICAgICAvLyBFMC1FRgogICAgICAgIC8vIFRocmVlLWJ5dGUuCiAgICAgICAgcG9zaXRpb24gPSBhZGRDb250aW51YXRpb24oCiAgICAgICAgICAgIHV0ZjgsIHBvc2l0aW9uICsgMSwgZW5kLCAyLCAyLCBjaGFyICYgTUFTS19USFJFRV9CWVRFKTsKICAgICAgfSBlbHNlIGlmIChjaGFyIDwgMHhGOCkgewogICAgICAgIC8vIEYwLUY3CiAgICAgICAgLy8gRm91ci1ieXRlLgogICAgICAgIHBvc2l0aW9uID0gYWRkQ29udGludWF0aW9uKAogICAgICAgICAgICB1dGY4LCBwb3NpdGlvbiArIDEsIGVuZCwgMywgMywgY2hhciAmIE1BU0tfRk9VUl9CWVRFKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICAgIGFkZENoYXJDb2RlKDB4RkZGRCk7CiAgICAgICAgICBwb3NpdGlvbisrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAgICJJbnZhbGlkIFVURi04IGJ5dGU6ICRjaGFyIiwgdXRmOCwgcG9zaXRpb24pOwogICAgICAgIH0KICAgICAgfQogICAgICBpbmRleCA9IGxlbmd0aDsKICAgICAgY2FwYWNpdHkgPSBidWZmZXIubGVuZ3RoOwogICAgfQogICAgbGVuZ3RoID0gaW5kZXg7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBpZiAocGFydGlhbFN0YXRlICE9IE5PX1BBUlRJQUwpIHsKICAgICAgaWYgKGFsbG93TWFsZm9ybWVkKSB7CiAgICAgICAgcGFydGlhbFN0YXRlID0gTk9fUEFSVElBTDsKICAgICAgICBhZGRDaGFyQ29kZSgweEZGRkQpOwogICAgICB9IGVsc2UgewogICAgICAgIGludCBjb250aW51ZUJ5dGVDb3VudCA9IChwYXJ0aWFsU3RhdGUgJiBNQVNLX1RXT19CSVQpOwogICAgICAgIGludCBtaXNzaW5nID0gKHBhcnRpYWxTdGF0ZSA+PiBTSElGVF9NSVNTSU5HKSAmIE1BU0tfVFdPX0JJVDsKICAgICAgICBpbnQgdmFsdWUgPSBwYXJ0aWFsU3RhdGUgPj4gU0hJRlRfVkFMVUU7CiAgICAgICAgaW50IHNlZW5CeXRlQ291bnQgPSBjb250aW51ZUJ5dGVDb3VudCAtIG1pc3NpbmcgKyAxOwogICAgICAgIExpc3Qgc291cmNlID0gbmV3IFVpbnQ4TGlzdChzZWVuQnl0ZUNvdW50KTsKICAgICAgICB3aGlsZSAoc2VlbkJ5dGVDb3VudCA+IDEpIHsKICAgICAgICAgIHNlZW5CeXRlQ291bnQtLTsKICAgICAgICAgIHNvdXJjZVtzZWVuQnl0ZUNvdW50XSA9IENPTlRJTlVFX1RBRyB8ICh2YWx1ZSAmIE1BU0tfQ09OVElOVUVfVkFMVUUpOwogICAgICAgICAgdmFsdWUgPj49IDY7CiAgICAgICAgfQogICAgICAgIHNvdXJjZVswXSA9IHZhbHVlIHwgKDB4M2MwID4+IChjb250aW51ZUJ5dGVDb3VudCAtIDEpKTsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAiSW5jb21wbGV0ZSBVVEYtOCBzZXF1ZW5jZSIsIHNvdXJjZSwgc291cmNlLmxlbmd0aCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoYnVmZmVyLCAwLCBsZW5ndGgpOwogIH0KfQoKLyoqCiAqIENodW5rZWQgSlNPTiBwYXJzZXIgdGhhdCBwYXJzZXMgVVRGLTggY2h1bmtzLgogKi8KY2xhc3MgX0pzb25VdGY4UGFyc2VyIGV4dGVuZHMgX0NodW5rZWRKc29uUGFyc2VyPExpc3Q8aW50Pj4gewogIGZpbmFsIGJvb2wgYWxsb3dNYWxmb3JtZWQ7CiAgTGlzdDxpbnQ+IGNodW5rOwogIGludCBjaHVua0VuZDsKCiAgX0pzb25VdGY4UGFyc2VyKF9Kc29uTGlzdGVuZXIgbGlzdGVuZXIsIHRoaXMuYWxsb3dNYWxmb3JtZWQpCiAgICAgIDogc3VwZXIobGlzdGVuZXIpIHsKICAgIC8vIFN0YXJ0cyBvdXQgY2hlY2tpbmcgZm9yIGFuIG9wdGlvbmFsIEJPTSAoS1dEX0JPTSwgY291bnQgPSAwKS4KICAgIHBhcnRpYWxTdGF0ZSA9CiAgICAgICAgX0NodW5rZWRKc29uUGFyc2VyLlBBUlRJQUxfS0VZV09SRCB8IF9DaHVua2VkSnNvblBhcnNlci5LV0RfQk9NOwogIH0KCiAgaW50IGdldENoYXIoaW50IHBvc2l0aW9uKSA9PiBjaHVua1twb3NpdGlvbl07CgogIFN0cmluZyBnZXRTdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgYml0cykgewogICAgY29uc3QgaW50IG1heEFzY2lpQ2hhciA9IDB4N2Y7CiAgICBpZiAoYml0cyA8PSBtYXhBc2NpaUNoYXIpIHsKICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhjaHVuaywgc3RhcnQsIGVuZCk7CiAgICB9CiAgICBiZWdpblN0cmluZygpOwogICAgaWYgKHN0YXJ0IDwgZW5kKSBhZGRTbGljZVRvU3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgU3RyaW5nIHJlc3VsdCA9IGVuZFN0cmluZygpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgYmVnaW5TdHJpbmcoKSB7CiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBfVXRmOFN0cmluZ0J1ZmZlcihhbGxvd01hbGZvcm1lZCk7CiAgfQoKICB2b2lkIGFkZFNsaWNlVG9TdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBfVXRmOFN0cmluZ0J1ZmZlciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIGJ1ZmZlci5hZGRTbGljZShjaHVuaywgc3RhcnQsIGVuZCk7CiAgfQoKICB2b2lkIGFkZENoYXJUb1N0cmluZyhpbnQgY2hhckNvZGUpIHsKICAgIF9VdGY4U3RyaW5nQnVmZmVyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgYnVmZmVyLmFkZENoYXJDb2RlKGNoYXJDb2RlKTsKICB9CgogIFN0cmluZyBlbmRTdHJpbmcoKSB7CiAgICBfVXRmOFN0cmluZ0J1ZmZlciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIHRoaXMuYnVmZmVyID0gbnVsbDsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIHZvaWQgY29weUNoYXJzVG9MaXN0KGludCBzdGFydCwgaW50IGVuZCwgTGlzdCB0YXJnZXQsIGludCBvZmZzZXQpIHsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIHRhcmdldC5zZXRSYW5nZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCwgY2h1bmssIHN0YXJ0KTsKICB9CgogIGRvdWJsZSBwYXJzZURvdWJsZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIFN0cmluZyBzdHJpbmcgPSBnZXRTdHJpbmcoc3RhcnQsIGVuZCwgMHg3Zik7CiAgICByZXR1cm4gX3BhcnNlRG91YmxlKHN0cmluZywgMCwgc3RyaW5nLmxlbmd0aCk7CiAgfQp9Cgpkb3VibGUgX3BhcnNlRG91YmxlKFN0cmluZyBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCkgbmF0aXZlICJEb3VibGVfcGFyc2UiOwoKLyoqCiAqIEltcGxlbWVudHMgdGhlIGNodW5rZWQgY29udmVyc2lvbiBmcm9tIGEgVVRGLTggZW5jb2Rpbmcgb2YgSlNPTgogKiB0byBpdHMgY29ycmVzcG9uZGluZyBvYmplY3QuCiAqLwpjbGFzcyBfSnNvblV0ZjhEZWNvZGVyU2luayBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2lua0Jhc2UgewogIGZpbmFsIF9Kc29uVXRmOFBhcnNlciBfcGFyc2VyOwogIGZpbmFsIFNpbms8T2JqZWN0PiBfc2luazsKCiAgX0pzb25VdGY4RGVjb2RlclNpbmsocmV2aXZlciwgdGhpcy5fc2luaywgYm9vbCBhbGxvd01hbGZvcm1lZCkKICAgICAgOiBfcGFyc2VyID0gX2NyZWF0ZVBhcnNlcihyZXZpdmVyLCBhbGxvd01hbGZvcm1lZCk7CgogIHN0YXRpYyBfSnNvblV0ZjhQYXJzZXIgX2NyZWF0ZVBhcnNlcihyZXZpdmVyLCBib29sIGFsbG93TWFsZm9ybWVkKSB7CiAgICBfQnVpbGRKc29uTGlzdGVuZXIgbGlzdGVuZXI7CiAgICBpZiAocmV2aXZlciA9PSBudWxsKSB7CiAgICAgIGxpc3RlbmVyID0gbmV3IF9CdWlsZEpzb25MaXN0ZW5lcigpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIgPSBuZXcgX1Jldml2ZXJKc29uTGlzdGVuZXIocmV2aXZlcik7CiAgICB9CiAgICByZXR1cm4gbmV3IF9Kc29uVXRmOFBhcnNlcihsaXN0ZW5lciwgYWxsb3dNYWxmb3JtZWQpOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIF9hZGRDaHVuayhjaHVuaywgc3RhcnQsIGVuZCk7CiAgICBpZiAoaXNMYXN0KSBjbG9zZSgpOwogIH0KCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGNodW5rKSB7CiAgICBfYWRkQ2h1bmsoY2h1bmssIDAsIGNodW5rLmxlbmd0aCk7CiAgfQoKICB2b2lkIF9hZGRDaHVuayhMaXN0PGludD4gY2h1bmssIGludCBzdGFydCwgaW50IGVuZCkgewogICAgX3BhcnNlci5jaHVuayA9IGNodW5rOwogICAgX3BhcnNlci5jaHVua0VuZCA9IGVuZDsKICAgIF9wYXJzZXIucGFyc2Uoc3RhcnQpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9wYXJzZXIuY2xvc2UoKTsKICAg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UyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29udmVydDsKCi8vLyBBbiBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW0FzY2lpQ29kZWNdLgovLy8KLy8vIFRoaXMgaW5zdGFuY2UgcHJvdmlkZXMgYSBjb252ZW5pZW50IGFjY2VzcyB0byB0aGUgbW9zdCBjb21tb24gQVNDSUkKLy8vIHVzZSBjYXNlcy4KLy8vCi8vLyBFeGFtcGxlczoKLy8vIGBgYGRhcnQKLy8vIHZhciBlbmNvZGVkID0gYXNjaWkuZW5jb2RlKCJUaGlzIGlzIEFTQ0lJISIpOwovLy8gdmFyIGRlY29kZWQgPSBhc2NpaS5kZWNvZGUoWzB4NTQsIDB4NjgsIDB4NjksIDB4NzMsIDB4MjAsIDB4NjksIDB4NzMsCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMCwgMHg0MSwgMHg1MywgMHg0MywgMHg0OSwgMHg0OSwgMHgyMV0pOwovLy8gYGBgCmNvbnN0IEFzY2lpQ29kZWMgYXNjaWkgPSBBc2NpaUNvZGVjKCk7Cgpjb25zdCBpbnQgX2FzY2lpTWFzayA9IDB4N0Y7CgovLy8gQW4gW0FzY2lpQ29kZWNdIGFsbG93cyBlbmNvZGluZyBzdHJpbmdzIGFzIEFTQ0lJIGJ5dGVzCi8vLyBhbmQgZGVjb2RpbmcgQVNDSUkgYnl0ZXMgdG8gc3RyaW5ncy4KY2xhc3MgQXNjaWlDb2RlYyBleHRlbmRzIEVuY29kaW5nIHsKICBmaW5hbCBib29sIF9hbGxvd0ludmFsaWQ7CgogIC8vLyBJbnN0YW50aWF0ZXMgYSBuZXcgW0FzY2lpQ29kZWNdLgogIC8vLwogIC8vLyBJZiBbYWxsb3dJbnZhbGlkXSBpcyB0cnVlLCB0aGUgW2RlY29kZV0gbWV0aG9kIGFuZCB0aGUgY29udmVydGVyCiAgLy8vIHJldHVybmVkIGJ5IFtkZWNvZGVyXSB3aWxsIGRlZmF1bHQgdG8gYWxsb3dpbmcgaW52YWxpZCB2YWx1ZXMuCiAgLy8vIElmIGFsbG93aW5nIGludmFsaWQgdmFsdWVzLCB0aGUgdmFsdWVzIHdpbGwgYmUgZGVjb2RlZCBpbnRvIHRoZSBVbmljb2RlCiAgLy8vIFJlcGxhY2VtZW50IGNoYXJhY3RlciAoVStGRkZEKS4gSWYgbm90LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCiAgLy8vIENhbGxzIHRvIHRoZSBbZGVjb2RlXSBtZXRob2QgY2FuIGNob29zZSB0byBvdmVycmlkZSB0aGlzIGRlZmF1bHQuCiAgLy8vCiAgLy8vIEVuY29kZXJzIHdpbGwgbm90IGFjY2VwdCBpbnZhbGlkIChub24gQVNDSUkpIGNoYXJhY3RlcnMuCiAgY29uc3QgQXNjaWlDb2RlYyh7Ym9vbCBhbGxvd0ludmFsaWQgPSBmYWxzZX0pIDogX2FsbG93SW52YWxpZCA9IGFsbG93SW52YWxpZDsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoaXMgY29kZWMsICJ1cy1hc2NpaSIuCiAgU3RyaW5nIGdldCBuYW1lID0+ICJ1cy1hc2NpaSI7CgogIFVpbnQ4TGlzdCBlbmNvZGUoU3RyaW5nIHNvdXJjZSkgPT4gZW5jb2Rlci5jb252ZXJ0KHNvdXJjZSk7CgogIC8vLyBEZWNvZGVzIHRoZSBBU0NJSSBbYnl0ZXNdIChhIGxpc3Qgb2YgdW5zaWduZWQgNy1iaXQgaW50ZWdlcnMpIHRvIHRoZQogIC8vLyBjb3JyZXNwb25kaW5nIHN0cmluZy4KICAvLy8KICAvLy8gSWYgW2J5dGVzXSBjb250YWlucyB2YWx1ZXMgdGhhdCBhcmUgbm90IGluIHRoZSByYW5nZSAwIC4uIDEyNywgdGhlIGRlY29kZXIKICAvLy8gd2lsbCBldmVudHVhbGx5IHRocm93IGEgW0Zvcm1hdEV4Y2VwdGlvbl0uCiAgLy8vCiAgLy8vIElmIFthbGxvd0ludmFsaWRdIGlzIG5vdCBwcm92aWRlZCwgaXQgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIHVzZWQgdG8gY3JlYXRlCiAgLy8vIHRoaXMgW0FzY2lpQ29kZWNdLgogIFN0cmluZyBkZWNvZGUoTGlzdDxpbnQ+IGJ5dGVzLCB7Ym9vbCBhbGxvd0ludmFsaWR9KSB7CiAgICBhbGxvd0ludmFsaWQgPz89IF9hbGxvd0ludmFsaWQ7CiAgICBpZiAoYWxsb3dJbnZhbGlkKSB7CiAgICAgIHJldHVybiBjb25zdCBBc2NpaURlY29kZXIoYWxsb3dJbnZhbGlkOiB0cnVlKS5jb252ZXJ0KGJ5dGVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBjb25zdCBBc2NpaURlY29kZXIoYWxsb3dJbnZhbGlkOiBmYWxzZSkuY29udmVydChieXRlcyk7CiAgICB9CiAgfQoKICBBc2NpaUVuY29kZXIgZ2V0IGVuY29kZXIgPT4gY29uc3QgQXNjaWlFbmNvZGVyKCk7CgogIEFzY2lpRGVjb2RlciBnZXQgZGVjb2RlciA9PiBfYWxsb3dJbnZhbGlkCiAgICAgID8gY29uc3QgQXNjaWlEZWNvZGVyKGFsbG93SW52YWxpZDogdHJ1ZSkKICAgICAgOiBjb25zdCBBc2NpaURlY29kZXIoYWxsb3dJbnZhbGlkOiBmYWxzZSk7Cn0KCi8vIFN1cGVyY2xhc3MgZm9yIFtBc2NpaUVuY29kZXJdIGFuZCBbTGF0aW4xRW5jb2Rlcl0uCi8vIEdlbmVyYWxpemVzIGNvbW1vbiBvcGVyYXRpb25zIHRoYXQgb25seSBkaWZmZXIgYnkgYSBtYXNrOwpjbGFzcyBfVW5pY29kZVN1YnNldEVuY29kZXIgZXh0ZW5kcyBDb252ZXJ0ZXI8U3RyaW5nLCBMaXN0PGludD4+IHsKICBmaW5hbCBpbnQgX3N1YnNldE1hc2s7CgogIGNvbnN0IF9Vbmljb2RlU3Vic2V0RW5jb2Rlcih0aGlzLl9zdWJzZXRNYXNrKTsKCiAgLy8vIENvbnZlcnRzIHRoZSBbU3RyaW5nXSBpbnRvIGEgbGlzdCBvZiBpdHMgY29kZSB1bml0cy4KICAvLy8KICAvLy8gSWYgW3N0YXJ0XSBhbmQgW2VuZF0gYXJlIHByb3ZpZGVkLCBvbmx5IHRoZSBzdWJzdHJpbmcKICAvLy8gYHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZClgIGlzIHVzZWQgYXMgaW5wdXQgdG8gdGhlIGNvbnZlcnNpb24uCiAgVWludDhMaXN0IGNvbnZlcnQoU3RyaW5nIHN0cmluZywgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICB2YXIgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHN0cmluZ0xlbmd0aCk7CiAgICB2YXIgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICB2YXIgcmVzdWx0ID0gVWludDhMaXN0KGxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjb2RlVW5pdCA9IHN0cmluZy5jb2RlVW5pdEF0KHN0YXJ0ICsgaSk7CiAgICAgIGlmICgoY29kZVVuaXQgJiB+X3N1YnNldE1hc2spICE9IDApIHsKICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgICAgICBzdHJpbmcsICJzdHJpbmciLCAiQ29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzLiIpOwogICAgICB9CiAgICAgIHJlc3VsdFtpXSA9IGNvZGVVbml0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBTdGFydHMgYSBjaHVua2VkIGNvbnZlcnNpb24uCiAgLy8vCiAgLy8vIFRoZSBjb252ZXJ0ZXIgd29ya3MgbW9yZSBlZmZpY2llbnRseSBpZiB0aGUgZ2l2ZW4gW3NpbmtdIGlzIGEKICAvLy8gW0J5dGVDb252ZXJzaW9uU2lua10uCiAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgewogICAgcmV0dXJuIF9Vbmljb2RlU3Vic2V0RW5jb2RlclNpbmsoX3N1YnNldE1hc2ssCiAgICAgICAgc2luayBpcyBCeXRlQ29udmVyc2lvblNpbmsgPyBzaW5rIDogQnl0ZUNvbnZlcnNpb25TaW5rLmZyb20oc2luaykpOwogIH0KCiAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UtY2xhc3MnIGJpbmQsIHRvIHByb3ZpZGUgYSBiZXR0ZXIgdHlwZS4KICBTdHJlYW08TGlzdDxpbnQ+PiBiaW5kKFN0cmVhbTxTdHJpbmc+IHN0cmVhbSkgPT4gc3VwZXIuYmluZChzdHJlYW0pOwp9CgovLy8gVGhpcyBjbGFzcyBjb252ZXJ0cyBzdHJpbmdzIG9mIG9ubHkgQVNDSUkgY2hhcmFjdGVycyB0byBieXRlcy4KY2xhc3MgQXNjaWlFbmNvZGVyIGV4dGVuZHMgX1VuaWNvZGVTdWJzZXRFbmNvZGVyIHsKICBjb25zdCBBc2NpaUVuY29kZXIoKSA6IHN1cGVyKF9hc2NpaU1hc2spOwp9CgovLy8gVGhpcyBjbGFzcyBlbmNvZGVzIGNodW5rZWQgc3RyaW5ncyB0byBieXRlcyAodW5zaWduZWQgOC1iaXQKLy8vIGludGVnZXJzKS4KY2xhc3MgX1VuaWNvZGVTdWJzZXRFbmNvZGVyU2luayBleHRlbmRzIFN0cmluZ0NvbnZlcnNpb25TaW5rQmFzZSB7CiAgZmluYWwgQnl0ZUNvbnZlcnNpb25TaW5rIF9zaW5rOwogIGZpbmFsIGludCBfc3Vic2V0TWFzazsKCiAgX1VuaWNvZGVTdWJzZXRFbmNvZGVyU2luayh0aGlzLl9zdWJzZXRNYXNrLCB0aGlzLl9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKFN0cmluZyBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHNvdXJjZS5sZW5ndGgpOwogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGNvZGVVbml0ID0gc291cmNlLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmICgoY29kZVVuaXQgJiB+X3N1YnNldE1hc2spICE9IDApIHsKICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKAogICAgICAgICAgICAiU291cmNlIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyIHdpdGggY29kZSBwb2ludDogJGNvZGVVbml0LiIpOwogICAgICB9CiAgICB9CiAgICBfc2luay5hZGQoc291cmNlLmNvZGVVbml0cy5zdWJsaXN0KHN0YXJ0LCBlbmQpKTsKICAgIGlmIChpc0xhc3QpIHsKICAgICAgY2xvc2UoKTsKICAgIH0KICB9Cn0KCi8vLyBUaGlzIGNsYXNzIGNvbnZlcnRzIExhdGluLTEgYnl0ZXMgKGxpc3RzIG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzKQovLy8gdG8gYSBzdHJpbmcuCmFic3RyYWN0IGNsYXNzIF9Vbmljb2RlU3Vic2V0RGVjb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gewogIGZpbmFsIGJvb2wgX2FsbG93SW52YWxpZDsKICBmaW5hbCBpbnQgX3N1YnNldE1hc2s7CgogIC8vLyBJbnN0YW50aWF0ZXMgYSBuZXcgZGVjb2Rlci4KICAvLy8KICAvLy8gVGhlIFtfYWxsb3dJbnZhbGlkXSBhcmd1bWVudCBkZWZpbmVzIGhvdyBbY29udmVydF0gZGVhbHMKICAvLy8gd2l0aCBpbnZhbGlkIGJ5dGVzLgogIC8vLwogIC8vLyBUaGUgW19zdWJzZXRNYXNrXSBhcmd1bWVudCBpcyBhIGJpdCBtYXNrIHVzZWQgdG8gZGVmaW5lIHRoZSBzdWJzZXQKICAvLy8gb2YgVW5pY29kZSBiZWluZyBkZWNvZGVkLiBVc2UgW19MQVRJTjFfTUFTS10gZm9yIExhdGluLTEgKDgtYml0KSBvcgogIC8vLyBbX2FzY2lpTWFza10gZm9yIEFTQ0lJICg3LWJpdCkuCiAgLy8vCiAgLy8vIElmIFtfYWxsb3dJbnZhbGlkXSBpcyBgdHJ1ZWAsIFtjb252ZXJ0XSByZXBsYWNlcyBpbnZhbGlkIGJ5dGVzIHdpdGggdGhlCiAgLy8vIFVuaWNvZGUgUmVwbGFjZW1lbnQgY2hhcmFjdGVyIGBVK0ZGRkRgICjvv70pLgogIC8vLyBPdGhlcndpc2UgaXQgdGhyb3dzIGEgW0Zvcm1hdEV4Y2VwdGlvbl0uCiAgY29uc3QgX1VuaWNvZGVTdWJzZXREZWNvZGVyKHRoaXMuX2FsbG93SW52YWxpZCwgdGhpcy5fc3Vic2V0TWFzayk7CgogIC8vLyBDb252ZXJ0cyB0aGUgW2J5dGVzXSAoYSBsaXN0IG9mIHVuc2lnbmVkIDctIG9yIDgtYml0IGludGVnZXJzKSB0byB0aGUKICAvLy8gY29ycmVzcG9uZGluZyBzdHJpbmcuCiAgLy8vCiAgLy8vIElmIFtzdGFydF0gYW5kIFtlbmRdIGFyZSBwcm92aWRlZCwgb25seSB0aGUgc3ViLWxpc3Qgb2YgYnl0ZXMgZnJvbQogIC8vLyBgc3RhcnRgIHRvIGBlbmRgIChgZW5kYCBub3QgaW5jbHVzaXZlKSBpcyB1c2VkIGFzIGlucHV0IHRvIHRoZSBjb252ZXJzaW9uLgogIFN0cmluZyBjb252ZXJ0KExpc3Q8aW50PiBieXRlcywgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICB2YXIgYnl0ZUNvdW50ID0gYnl0ZXMubGVuZ3RoOwogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgYnl0ZUNvdW50KTsKICAgIGVuZCA/Pz0gYnl0ZUNvdW50OwoKICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHZhciBieXRlID0gYnl0ZXNbaV07CiAgICAgIGlmICgoYnl0ZSAmIH5fc3Vic2V0TWFzaykgIT0gMCkgewogICAgICAgIGlmICghX2FsbG93SW52YWxpZCkgewogICAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIHZhbHVlIGluIGlucHV0OiAkYnl0ZSIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX2NvbnZlcnRJbnZhbGlkKGJ5dGVzLCBzdGFydCwgZW5kKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGVzKGJ5dGVzLCBzdGFydCwgZW5kKTsKICB9CgogIFN0cmluZyBfY29udmVydEludmFsaWQoTGlzdDxpbnQ+IGJ5dGVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIHZhciBidWZmZXIgPSBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHZhciB2YWx1ZSA9IGJ5dGVzW2ldOwogICAgICBpZiAoKHZhbHVlICYgfl9zdWJzZXRNYXNrKSAhPSAwKSB2YWx1ZSA9IDB4RkZGRDsKICAgICAgYnVmZmVyLndyaXRlQ2hhckNvZGUodmFsdWUpOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgLy8vIFN0YXJ0cyBhIGNodW5rZWQgY29udmVyc2lvbi4KICAvLy8KICAvLy8gVGhlIGNvbnZlcnRlciB3b3JrcyBtb3JlIGVmZmljaWVudGx5IGlmIHRoZSBnaXZlbiBbc2lua10gaXMgYQogIC8vLyBbU3RyaW5nQ29udmVyc2lvblNpbmtdLgogIEJ5dGVDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8U3RyaW5nPiBzaW5rKTsKCiAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UtY2xhc3MncyBiaW5kLCB0byBwcm92aWRlIGEgYmV0dGVyIHR5cGUuCiAgU3RyZWFtPFN0cmluZz4gYmluZChTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0pID0+IHN1cGVyLmJpbmQoc3RyZWFtKTsKfQoKY2xhc3MgQXNjaWlEZWNvZGVyIGV4dGVuZHMgX1VuaWNvZGVTdWJzZXREZWNvZGVyIHsKICBjb25zdCBBc2NpaURlY29kZXIoe2Jvb2wgYWxsb3dJbnZhbGlkID0gZmFsc2V9KQogICAgICA6IHN1cGVyKGFsbG93SW52YWxpZCwgX2FzY2lpTWFzayk7CgogIC8vLyBTdGFydHMgYSBjaHVua2VkIGNvbnZlcnNpb24uCiAgLy8vCiAgLy8vIFRoZSBjb252ZXJ0ZXIgd29ya3MgbW9yZSBlZmZpY2llbnRseSBpZiB0aGUgZ2l2ZW4gW3NpbmtdIGlzIGEKICAvLy8gW1N0cmluZ0NvbnZlcnNpb25TaW5rXS4KICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFN0cmluZz4gc2luaykgewogICAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RyaW5nU2luazsKICAgIGlmIChzaW5rIGlzIFN0cmluZ0NvbnZlcnNpb25TaW5rKSB7CiAgICAgIHN0cmluZ1NpbmsgPSBzaW5rOwogICAgfSBlbHNlIHsKICAgICAgc3RyaW5nU2luayA9IFN0cmluZ0NvbnZlcnNpb25TaW5rLmZyb20oc2luayk7CiAgICB9CiAgICAvLyBUT0RPKGxybik6IFVzZSBhc1V0ZjE2U2luayB3aGVuIGl0IGJlY29tZXMgYXZhaWxhYmxlLiBJdAogICAgLy8gd29ya3MganVzdCBhcyB3ZWxsLCBpcyBsaWtlbHkgdG8gaGF2ZSBsZXNzIGRlY29kaW5nIG92ZXJoZWFkLAogICAgLy8gYW5kIG1ha2UgYWRkaW5nIFUrRkZGRCBlYXNpZXIuCiAgICAvLyBBdCB0aGF0IHRpbWUsIG1lcmdlIHRoaXMgd2l0aCBfTGF0aW4xRGVjb2RlclNpbms7CiAgICBpZiAoX2FsbG93SW52YWxpZCkgewogICAgICByZXR1cm4gX0Vycm9ySGFuZGxpbmdBc2NpaURlY29kZXJTaW5rKHN0cmluZ1NpbmsuYXNVdGY4U2luayhmYWxzZSkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9TaW1wbGVBc2NpaURlY29kZXJTaW5rKHN0cmluZ1NpbmspOwogICAgfQogIH0KfQoKY2xhc3MgX0Vycm9ySGFuZGxpbmdBc2NpaURlY29kZXJTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgQnl0ZUNvbnZlcnNpb25TaW5rIF91dGY4U2luazsKICBfRXJyb3JIYW5kbGluZ0FzY2lpRGVjb2RlclNpbmsodGhpcy5fdXRmOFNpbmspOwoKICB2b2lkIGNsb3NlKCkgewogICAgX3V0ZjhTaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChMaXN0PGludD4gc291cmNlKSB7CiAgICBhZGRTbGljZShzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgsIGZhbHNlKTsKICB9CgogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICBpZiAoKHNvdXJjZVtpXSAmIH5fYXNjaWlNYXNrKSAhPSAwKSB7CiAgICAgICAgaWYgKGkgPiBzdGFydCkgX3V0ZjhTaW5rLmFkZFNsaWNlKHNvdXJjZSwgc3RhcnQsIGksIGZhbHNlKTsKICAgICAgICAvLyBBZGQgVVRGLTggZW5jb2Rpbmcgb2YgVStGRkZELgogICAgICAgIF91dGY4U2luay5hZGQoY29uc3QgPGludD5bMHhFRiwgMHhCRiwgMHhCRF0pOwogICAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICAgIH0KICAgIH0KICAgIGlmIChzdGFydCA8IGVuZCkgewogICAgICBfdXRmOFNpbmsuYWRkU2xpY2Uoc291cmNlLCBzdGFydCwgZW5kLCBpc0xhc3QpOwogICAgfSBlbHNlIGlmIChpc0xhc3QpIHsKICAgICAgY2xvc2UoKTsKICAgIH0KICB9Cn0KCmNsYXNzIF9TaW1wbGVBc2NpaURlY29kZXJTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgU2luayBfc2luazsKICBfU2ltcGxlQXNjaWlEZWNvZGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChMaXN0PGludD4gc291cmNlKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgewogICAgICBpZiAoKHNvdXJjZVtpXSAmIH5fYXNjaWlNYXNrKSAhPSAwKSB7CiAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJTb3VyY2UgY29udGFpbnMgbm9uLUFTQ0lJIGJ5dGVzLiIpOwogICAgICB9CiAgICB9CiAgICBfc2luay5hZGQoU3RyaW5nLmZyb21DaGFyQ29kZXMoc291cmNlKSk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKExpc3Q8aW50PiBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGZpbmFsIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsZW5ndGgpOwogICAgaWYgKHN0YXJ0IDwgZW5kKSB7CiAgICAgIGlmIChzdGFydCAhPSAwIHx8IGVuZCAhPSBsZW5ndGgpIHsKICAgICAgICBzb3VyY2UgPSBzb3VyY2Uuc3VibGlzdChzdGFydCwgZW5kKTsKICAgICAgfQogICAgICBhZGQoc291cmNlKTsKICAgIH0KICAgIGlmIChpc0xhc3QpIGNsb3NlKCk7CiAgfQp9CoEhAE5OPAEWAUMESA8EDgwySkwIJwEdATspJBwBJwZHRU5LSAY/UAEqIQE+AUscBlExBlEZOCQYRA1FBgQBNAEsLzECATY9QxkBMQE7BjxJPyZAHiQnMywjPwgcBhMEASMGRBxGMkwEAT5HAgFDMywCAUAPQyIZATsBERMEAUI7KCssHU4IBjUSDwYEAgFJEUwcGQEiBj8aBklKJgZOMi9FAUwcBklRPiI3FwEoGygeQgozCAY0BAFAISgcNyMGHgQBIwZEHkABP0cCATMyKQEjBkQeQSUoGQ00BkBFJjkZSw0yBgQCAUYgMgERFwQBHy8EAUU7KCxEKTYXCAYXNhkPBgQCAT8OJwEREwQBHy4sQwgGLQQBRSI0FyktCBMGGQQCARdkYXJ0OmNvbnZlcnQvYXNjaWkuZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29udmVydC9iYXNlNjQuZGFydMAAet0vLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbnZlcnQ7CgovLy8gQSBbYmFzZTY0XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDY0OCkgZW5jb2RlciBhbmQgZGVjb2Rlci4KLy8vCi8vLyBJdCBlbmNvZGVzIHVzaW5nIHRoZSBkZWZhdWx0IGJhc2U2NCBhbHBoYWJldCwKLy8vIGRlY29kZXMgdXNpbmcgYm90aCB0aGUgYmFzZTY0IGFuZCBiYXNlNjR1cmwgYWxwaGFiZXRzLAovLy8gZG9lcyBub3QgYWxsb3cgaW52YWxpZCBjaGFyYWN0ZXJzIGFuZCByZXF1aXJlcyBwYWRkaW5nLgovLy8KLy8vIEV4YW1wbGVzOgovLy8KLy8vICAgICB2YXIgZW5jb2RlZCA9IGJhc2U2NC5lbmNvZGUoWzB4NjIsIDB4NmMsIDB4YzMsIDB4YTUsIDB4NjIsIDB4YzMsIDB4YTYsCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcyLCAweDY3LCAweDcyLCAweGMzLCAweGI4LCAweDY0XSk7Ci8vLyAgICAgdmFyIGRlY29kZWQgPSBiYXNlNjQuZGVjb2RlKCJZbXpEcFdMRHBuSm5jc080WkFvPSIpOwovLy8KLy8vIFRoZSB0b3AtbGV2ZWwgW2Jhc2U2NEVuY29kZV0gYW5kIFtiYXNlNjREZWNvZGVdIGZ1bmN0aW9ucyBtYXkgYmUgdXNlZAovLy8gaW5zdGVhZCBpZiBhIGxvY2FsIHZhcmlhYmxlIHNoYWRvd3MgdGhlIFtiYXNlNjRdIGNvbnN0YW50Lgpjb25zdCBCYXNlNjRDb2RlYyBiYXNlNjQgPSBCYXNlNjRDb2RlYygpOwoKLy8vIEEgW2Jhc2U2NHVybF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgpIGVuY29kZXIgYW5kIGRlY29kZXIuCi8vLwovLy8gSXQgZW5jb2RlcyBhbmQgZGVjb2RlcyB1c2luZyB0aGUgYmFzZTY0dXJsIGFscGhhYmV0LAovLy8gZGVjb2RlcyB1c2luZyBib3RoIHRoZSBiYXNlNjQgYW5kIGJhc2U2NHVybCBhbHBoYWJldHMsCi8vLyBkb2VzIG5vdCBhbGxvdyBpbnZhbGlkIGNoYXJhY3RlcnMgYW5kIHJlcXVpcmVzIHBhZGRpbmcuCi8vLwovLy8gRXhhbXBsZXM6Ci8vLwovLy8gICAgIHZhciBlbmNvZGVkID0gYmFzZTY0VXJsLmVuY29kZShbMHg2MiwgMHg2YywgMHhjMywgMHhhNSwgMHg2MiwgMHhjMywgMHhhNiwKLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzIsIDB4NjcsIDB4NzIsIDB4YzMsIDB4YjgsIDB4NjRdKTsKLy8vICAgICB2YXIgZGVjb2RlZCA9IGJhc2U2NFVybC5kZWNvZGUoIlltekRwV0xEcG5KbmNzTzRaQW89Iik7CmNvbnN0IEJhc2U2NENvZGVjIGJhc2U2NFVybCA9IEJhc2U2NENvZGVjLnVybFNhZmUoKTsKCi8vLyBFbmNvZGVzIFtieXRlc10gdXNpbmcgW2Jhc2U2NF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgpIGVuY29kaW5nLgovLy8KLy8vIFNob3J0aGFuZCBmb3IgW2Jhc2U2NC5lbmNvZGVdLiBVc2VmdWwgaWYgYSBsb2NhbCB2YXJpYWJsZSBzaGFkb3dzIHRoZSBnbG9iYWwKLy8vIFtiYXNlNjRdIGNvbnN0YW50LgpTdHJpbmcgYmFzZTY0RW5jb2RlKExpc3Q8aW50PiBieXRlcykgPT4gYmFzZTY0LmVuY29kZShieXRlcyk7CgovLy8gRW5jb2RlcyBbYnl0ZXNdIHVzaW5nIFtiYXNlNjR1cmxdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ4KSBlbmNvZGluZy4KLy8vCi8vLyBTaG9ydGhhbmQgZm9yIFtiYXNlNjR1cmwuZW5jb2RlXS4KU3RyaW5nIGJhc2U2NFVybEVuY29kZShMaXN0PGludD4gYnl0ZXMpID0+IGJhc2U2NFVybC5lbmNvZGUoYnl0ZXMpOwoKLy8vIERlY29kZXMgW2Jhc2U2NF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgpIG9yIFtiYXNlNjR1cmxdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ4KSBlbmNvZGVkIGJ5dGVzLgovLy8KLy8vIFNob3J0aGFuZCBmb3IgW2Jhc2U2NC5kZWNvZGVdLiBVc2VmdWwgaWYgYSBsb2NhbCB2YXJpYWJsZSBzaGFkb3dzIHRoZQovLy8gZ2xvYmFsIFtiYXNlNjRdIGNvbnN0YW50LgpVaW50OExpc3QgYmFzZTY0RGVjb2RlKFN0cmluZyBzb3VyY2UpID0+IGJhc2U2NC5kZWNvZGUoc291cmNlKTsKCi8vIENvbnN0YW50cyB1c2VkIGluIG1vcmUgdGhhbiBvbmUgY2xhc3MuCmNvbnN0IGludCBfcGFkZGluZ0NoYXIgPSAweDNkOyAvLyAnPScuCgovLy8gQSBbYmFzZTY0XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDY0OCkgZW5jb2RlciBhbmQgZGVjb2Rlci4KLy8vCi8vLyBBIFtCYXNlNjRDb2RlY10gYWxsb3dzIGJhc2U2NCBlbmNvZGluZyBieXRlcyBpbnRvIEFTQ0lJIHN0cmluZ3MgYW5kCi8vLyBkZWNvZGluZyB2YWxpZCBlbmNvZGluZ3MgYmFjayB0byBieXRlcy4KLy8vCi8vLyBUaGlzIGltcGxlbWVudGF0aW9uIG9ubHkgaGFuZGxlcyB0aGUgc2ltcGxlc3QgUkZDIDQ2NDggYmFzZTY0IGFuZCBiYXNlNjR1cmwKLy8vIGVuY29kaW5ncy4KLy8vIEl0IGRvZXMgbm90IGFsbG93IGludmFsaWQgY2hhcmFjdGVycyB3aGVuIGRlY29kaW5nIGFuZCBpdCByZXF1aXJlcywKLy8vIGFuZCBnZW5lcmF0ZXMsIHBhZGRpbmcgc28gdGhhdCB0aGUgaW5wdXQgaXMgYWx3YXlzIGEgbXVsdGlwbGUgb2YgZm91cgovLy8gY2hhcmFjdGVycy4KY2xhc3MgQmFzZTY0Q29kZWMgZXh0ZW5kcyBDb2RlYzxMaXN0PGludD4sIFN0cmluZz4gewogIGZpbmFsIEJhc2U2NEVuY29kZXIgX2VuY29kZXI7CiAgY29uc3QgQmFzZTY0Q29kZWMoKSA6IF9lbmNvZGVyID0gY29uc3QgQmFzZTY0RW5jb2RlcigpOwogIGNvbnN0IEJhc2U2NENvZGVjLnVybFNhZmUoKSA6IF9lbmNvZGVyID0gY29uc3QgQmFzZTY0RW5jb2Rlci51cmxTYWZlKCk7CgogIEJhc2U2NEVuY29kZXIgZ2V0IGVuY29kZXIgPT4gX2VuY29kZXI7CgogIEJhc2U2NERlY29kZXIgZ2V0IGRlY29kZXIgPT4gY29uc3QgQmFzZTY0RGVjb2RlcigpOwoKICAvLy8gRGVjb2RlcyBbZW5jb2RlZF0uCiAgLy8vCiAgLy8vIFRoZSBpbnB1dCBpcyBkZWNvZGVkIGFzIGlmIGJ5IGBkZWNvZGVyLmNvbnZlcnRgLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgW1VpbnQ4TGlzdF0gY29udGFpbnMgZXhhY3RseSB0aGUgZGVjb2RlZCBieXRlcywKICAvLy8gc28gdGhlIFtVaW50OExpc3QubGVuZ3RoXSBpcyBwcmVjaXNlbHkgdGhlIG51bWJlciBvZiBkZWNvZGVkIGJ5dGVzLgogIC8vLyBUaGUgW1VpbnQ4TGlzdC5idWZmZXJdIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgZGVjb2RlZCBieXRlcy4KICBVaW50OExpc3QgZGVjb2RlKFN0cmluZyBlbmNvZGVkKSA9PiBkZWNvZGVyLmNvbnZlcnQoZW5jb2RlZCk7CgogIC8vLyBWYWxpZGF0ZXMgYW5kIG5vcm1hbGl6ZXMgdGhlIGJhc2U2NCBlbmNvZGVkIGRhdGEgaW4gW3NvdXJjZV0uCiAgLy8vCiAgLy8vIE9ubHkgYWN0cyBvbiB0aGUgc3Vic3RyaW5nIGZyb20gW3N0YXJ0XSB0byBbZW5kXSwgd2l0aCBbZW5kXQogIC8vLyBkZWZhdWx0aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KICAvLy8KICAvLy8gTm9ybWFsaXphdGlvbiB3aWxsOgogIC8vLyAqIFVuZXNjYXBlIGFueSBgJWAtZXNjYXBlcy4KICAvLy8gKiBPbmx5IGFsbG93IHZhbGlkIGNoYXJhY3RlcnMgKGBBYC1gWmAsIGBhYC1gemAsIGAwYC1gOWAsIGAvYCBhbmQgYCtgKS4KICAvLy8gKiBOb3JtYWxpemUgYSBgX2Agb3IgYC1gIGNoYXJhY3RlciB0byBgL2Agb3IgYCtgLgogIC8vLyAqIFZhbGlkYXRlIHRoYXQgZXhpc3RpbmcgcGFkZGluZyAodHJhaWxpbmcgYD1gIGNoYXJhY3RlcnMpIGlzIGNvcnJlY3QuCiAgLy8vICogSWYgbm8gcGFkZGluZyBleGlzdHMsIGFkZCBjb3JyZWN0IHBhZGRpbmcgaWYgbmVjZXNzYXJ5IGFuZCBwb3NzaWJsZS4KICAvLy8gKiBWYWxpZGF0ZSB0aGF0IHRoZSBsZW5ndGggaXMgY29ycmVjdCAoYSBtdWx0aXBsZSBvZiBmb3VyKS4KICBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyBzb3VyY2UsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLmxlbmd0aCk7CiAgICBjb25zdCBwZXJjZW50ID0gMHgyNTsKICAgIGNvbnN0IGVxdWFscyA9IDB4M2Q7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyOwogICAgdmFyIHNsaWNlU3RhcnQgPSBzdGFydDsKICAgIHZhciBhbHBoYWJldCA9IF9CYXNlNjRFbmNvZGVyLl9iYXNlNjRBbHBoYWJldDsKICAgIHZhciBpbnZlcnNlQWxwaGFiZXQgPSBfQmFzZTY0RGVjb2Rlci5faW52ZXJzZUFscGhhYmV0OwogICAgdmFyIGZpcnN0UGFkZGluZyA9IC0xOwogICAgdmFyIGZpcnN0UGFkZGluZ1NvdXJjZUluZGV4ID0gLTE7CiAgICB2YXIgcGFkZGluZ0NvdW50ID0gMDsKICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDspIHsKICAgICAgdmFyIHNsaWNlRW5kID0gaTsKICAgICAgdmFyIGNoYXIgPSBzb3VyY2UuY29kZVVuaXRBdChpKyspOwogICAgICB2YXIgb3JpZ2luYWxDaGFyID0gY2hhcjsKICAgICAgLy8gTm9ybWFsaXplIGNoYXIsIGtlZXAgb3JpZ2luYWxDaGFyIHRvIHNlZSBpZiBpdCBtYXRjaGVzIHRoZSBzb3VyY2UuCiAgICAgIGlmIChjaGFyID09IHBlcmNlbnQpIHsKICAgICAgICBpZiAoaSArIDIgPD0gZW5kKSB7CiAgICAgICAgICBjaGFyID0gcGFyc2VIZXhCeXRlKHNvdXJjZSwgaSk7IC8vIE1heSBiZSBuZWdhdGl2ZS4KICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgIC8vIFdlIGtub3cgdGhhdCAlMjUgaXNuJ3QgdmFsaWQsIGJ1dCBvdXIgdGFibGUgY29uc2lkZXJzIGl0CiAgICAgICAgICAvLyBhIHBvdGVudGlhbCBwYWRkaW5nIHN0YXJ0LCBzbyBza2lwIHRoZSBjaGVja3MuCiAgICAgICAgICBpZiAoY2hhciA9PSBwZXJjZW50KSBjaGFyID0gLTE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIEFuIGludmFsaWQgSEVYIGVzY2FwZSAodG9vIHNob3J0KS4KICAgICAgICAgIC8vIEp1c3Qgc2tpcCBwYXN0IHRoZSBoYW5kbGluZyBhbmQgcmVhY2ggdGhlIHRocm93IGJlbG93LgogICAgICAgICAgY2hhciA9IC0xOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBJZiBjaGFyIGlzIG5lZ2F0aXZlIGhlcmUsIGhleC1kZWNvZGluZyBmYWlsZWQgaW4gc29tZSB3YXkuCiAgICAgIGlmICgwIDw9IGNoYXIgJiYgY2hhciA8PSAxMjcpIHsKICAgICAgICB2YXIgdmFsdWUgPSBpbnZlcnNlQWxwaGFiZXRbY2hhcl07CiAgICAgICAgaWYgKHZhbHVlID49IDApIHsKICAgICAgICAgIGNoYXIgPSBhbHBoYWJldC5jb2RlVW5pdEF0KHZhbHVlKTsKICAgICAgICAgIGlmIChjaGFyID09IG9yaWdpbmFsQ2hhcikgY29udGludWU7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBfQmFzZTY0RGVjb2Rlci5fcGFkZGluZykgewogICAgICAgICAgLy8gV2UgaGF2ZSBydWxlZCBvdXQgcGVyY2VudCwgc28gY2hhciBpcyAnPScuCiAgICAgICAgICBpZiAoZmlyc3RQYWRkaW5nIDwgMCkgewogICAgICAgICAgICAvLyBNYXJrIHBvc2l0aW9uIGluIG5vcm1hbGl6ZWQgb3V0cHV0IHdoZXJlIHBhZGRpbmcgb2NjdXJzLgogICAgICAgICAgICBmaXJzdFBhZGRpbmcgPSAoYnVmZmVyPy5sZW5ndGggPz8gMCkgKyAoc2xpY2VFbmQgLSBzbGljZVN0YXJ0KTsKICAgICAgICAgICAgZmlyc3RQYWRkaW5nU291cmNlSW5kZXggPSBzbGljZUVuZDsKICAgICAgICAgIH0KICAgICAgICAgIHBhZGRpbmdDb3VudCsrOwogICAgICAgICAgLy8gSXQgY291bGQgaGF2ZSBiZWVuIGFuIGVzY2FwZWQgZXF1YWxzICglM0QpLgogICAgICAgICAgaWYgKG9yaWdpbmFsQ2hhciA9PSBlcXVhbHMpIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgIT0gX0Jhc2U2NERlY29kZXIuX2ludmFsaWQpIHsKICAgICAgICAgIGJ1ZmZlciA/Pz0gU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICBidWZmZXIud3JpdGUoc291cmNlLnN1YnN0cmluZyhzbGljZVN0YXJ0LCBzbGljZUVuZCkpOwogICAgICAgICAgYnVmZmVyLndyaXRlQ2hhckNvZGUoY2hhcik7CiAgICAgICAgICBzbGljZVN0YXJ0ID0gaTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgYmFzZTY0IGRhdGEiLCBzb3VyY2UsIHNsaWNlRW5kKTsKICAgIH0KICAgIGlmIChidWZmZXIgIT0gbnVsbCkgewogICAgICBidWZmZXIud3JpdGUoc291cmNlLnN1YnN0cmluZyhzbGljZVN0YXJ0LCBlbmQpKTsKICAgICAgaWYgKGZpcnN0UGFkZGluZyA+PSAwKSB7CiAgICAgICAgLy8gVGhlcmUgd2FzIHBhZGRpbmcgaW4gdGhlIHNvdXJjZS4gQ2hlY2sgdGhhdCBpdCBpcyB2YWxpZDoKICAgICAgICAvLyAqIHJlc3VsdCBsZW5ndGggYSBtdWx0aXBsZSBvZiBmb3VyCiAgICAgICAgLy8gKiBvbmUgb3IgdHdvIHBhZGRpbmcgY2hhcmFjdGVycyBhdCB0aGUgZW5kLgogICAgICAgIF9jaGVja1BhZGRpbmcoc291cmNlLCBmaXJzdFBhZGRpbmdTb3VyY2VJbmRleCwgZW5kLCBmaXJzdFBhZGRpbmcsCiAgICAgICAgICAgIHBhZGRpbmdDb3VudCwgYnVmZmVyLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTGVuZ3RoIG9mIGxhc3QgY2h1bmsgKDEtNCBjaGFycykgaW4gdGhlIGVuY29kaW5nLgogICAgICAgIHZhciBlbmRMZW5ndGggPSAoKGJ1ZmZlci5sZW5ndGggLSAxKSAlIDQpICsgMTsKICAgICAgICBpZiAoZW5kTGVuZ3RoID09IDEpIHsKICAgICAgICAgIC8vIFRoZSBkYXRhIG11c3QgaGF2ZSBsZW5ndGggMCwgMiBvciAzIG1vZHVsbyA0LgogICAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIGJhc2U2NCBlbmNvZGluZyBsZW5ndGggIiwgc291cmNlLCBlbmQpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoZW5kTGVuZ3RoIDwgNCkgewogICAgICAgICAgYnVmZmVyLndyaXRlKCI9Iik7CiAgICAgICAgICBlbmRMZW5ndGgrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlUmFuZ2Uoc3RhcnQsIGVuZCwgYnVmZmVyLnRvU3RyaW5nKCkpOwogICAgfQogICAgLy8gT3JpZ2luYWwgd2FzIGFscmVhZHkgbm9ybWFsaXplZCwgb25seSBjaGVjayBwYWRkaW5nLgogICAgdmFyIGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGZpcnN0UGFkZGluZyA+PSAwKSB7CiAgICAgIF9jaGVja1BhZGRpbmcoc291cmNlLCBmaXJzdFBhZGRpbmdTb3VyY2VJbmRleCwgZW5kLCBmaXJzdFBhZGRpbmcsCiAgICAgICAgICBwYWRkaW5nQ291bnQsIGxlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICAvLyBObyBwYWRkaW5nIGdpdmVuLCBzbyBhZGQgc29tZSBpZiBuZWVkZWQgaXQuCiAgICAgIHZhciBlbmRMZW5ndGggPSBsZW5ndGggJSA0OwogICAgICBpZiAoZW5kTGVuZ3RoID09IDEpIHsKICAgICAgICAvLyBUaGUgZGF0YSBtdXN0IGhhdmUgbGVuZ3RoIDAsIDIgb3IgMyBtb2R1bG8gNC4KICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgYmFzZTY0IGVuY29kaW5nIGxlbmd0aCAiLCBzb3VyY2UsIGVuZCk7CiAgICAgIH0KICAgICAgaWYgKGVuZExlbmd0aCA+IDEpIHsKICAgICAgICAvLyBUaGVyZSBpcyBubyAiaW5zZXJ0QXQiIG9uIFN0cmluZywgYnV0IHRoaXMgd29ya3MgYXMgd2VsbC4KICAgICAgICBzb3VyY2UgPSBzb3VyY2UucmVwbGFjZVJhbmdlKGVuZCwgZW5kLCAoZW5kTGVuZ3RoID09IDIpID8gIj09IiA6ICI9Iik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzb3VyY2U7CiAgfQoKICBzdGF0aWMgdm9pZCBfY2hlY2tQYWRkaW5nKFN0cmluZyBzb3VyY2UsIGludCBzb3VyY2VJbmRleCwgaW50IHNvdXJjZUVuZCwKICAgICAgaW50IGZpcnN0UGFkZGluZywgaW50IHBhZGRpbmdDb3VudCwgaW50IGxlbmd0aCkgewogICAgaWYgKGxlbmd0aCAlIDQgIT0gMCkgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgcGFkZGVkIGxlbmd0aCBtdXN0IGJlIG11bHRpcGxlIG9mIGZvdXIsICIKICAgICAgICAgICJpcyAkbGVuZ3RoIiwKICAgICAgICAgIHNvdXJjZSwKICAgICAgICAgIHNvdXJjZUVuZCk7CiAgICB9CiAgICBpZiAoZmlyc3RQYWRkaW5nICsgcGFkZGluZ0NvdW50ICE9IGxlbmd0aCkgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgJz0nIG5vdCBhdCB0aGUgZW5kIiwgc291cmNlLCBzb3VyY2VJbmRleCk7CiAgICB9CiAgICBpZiAocGFkZGluZ0NvdW50ID4gMikgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgbW9yZSB0aGFuIHR3byAnPScgY2hhcmFjdGVycyIsCiAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICBzb3VyY2VJbmRleCk7CiAgICB9CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRW5jb2RlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBCYXNlNjQgYW5kIGJhc2U2NHVybCBlbmNvZGluZyBjb252ZXJ0ZXIuCi8vLwovLy8gRW5jb2RlcyBsaXN0cyBvZiBieXRlcyB1c2luZyBiYXNlNjQgb3IgYmFzZTY0dXJsIGVuY29kaW5nLgovLy8KLy8vIFRoZSByZXN1bHRzIGFyZSBBU0NJSSBzdHJpbmdzIHVzaW5nIGEgcmVzdHJpY3RlZCBhbHBoYWJldC4KY2xhc3MgQmFzZTY0RW5jb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gewogIGZpbmFsIGJvb2wgX3VybFNhZmU7CgogIGNvbnN0IEJhc2U2NEVuY29kZXIoKSA6IF91cmxTYWZlID0gZmFsc2U7CiAgY29uc3QgQmFzZTY0RW5jb2Rlci51cmxTYWZlKCkgOiBfdXJsU2FmZSA9IHRydWU7CgogIFN0cmluZyBjb252ZXJ0KExpc3Q8aW50PiBpbnB1dCkgewogICAgaWYgKGlucHV0LmlzRW1wdHkpIHJldHVybiAiIjsKICAgIHZhciBlbmNvZGVyID0gX0Jhc2U2NEVuY29kZXIoX3VybFNhZmUpOwogICAgdmFyIGJ1ZmZlciA9IGVuY29kZXIuZW5jb2RlKGlucHV0LCAwLCBpbnB1dC5sZW5ndGgsIHRydWUpOwogICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGVzKGJ1ZmZlcik7CiAgfQoKICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFN0cmluZz4gc2luaykgewogICAgaWYgKHNpbmsgaXMgU3RyaW5nQ29udmVyc2lvblNpbmspIHsKICAgICAgcmV0dXJuIF9VdGY4QmFzZTY0RW5jb2RlclNpbmsoc2luay5hc1V0ZjhTaW5rKGZhbHNlKSwgX3VybFNhZmUpOwogICAgfQogICAgcmV0dXJuIF9Bc2NpaUJhc2U2NEVuY29kZXJTaW5rKHNpbmssIF91cmxTYWZlKTsKICB9Cn0KCi8vLyBIZWxwZXIgY2xhc3MgZm9yIGVuY29kaW5nIGJ5dGVzIHRvIGJhc2U2NC4KY2xhc3MgX0Jhc2U2NEVuY29kZXIgewogIC8vLyBUaGUgUkZDIDQ2NDggYmFzZTY0IGVuY29kaW5nIGFscGhhYmV0LgogIHN0YXRpYyBjb25zdCBTdHJpbmcgX2Jhc2U2NEFscGhhYmV0ID0KICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwoKICAvLy8gVGhlIFJGQyA0NjQ4IGJhc2U2NHVybCBlbmNvZGluZyBhbHBoYWJldC4KICBzdGF0aWMgY29uc3QgU3RyaW5nIF9iYXNlNjRVcmxBbHBoYWJldCA9CiAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIjsKCiAgLy8vIFNoaWZ0LWNvdW50IHRvIGV4dHJhY3QgdGhlIHZhbHVlcyBzdG9yZWQgaW4gW19zdGF0ZV0uCiAgc3RhdGljIGNvbnN0IGludCBfdmFsdWVTaGlmdCA9IDI7CgogIC8vLyBNYXNrIHRvIGV4dHJhY3QgdGhlIGNvdW50IHZhbHVlIHN0b3JlZCBpbiBbX3N0YXRlXS4KICBzdGF0aWMgY29uc3QgaW50IF9jb3VudE1hc2sgPSAzOwoKICBzdGF0aWMgY29uc3QgaW50IF9zaXhCaXRNYXNrID0gMHgzRjsKCiAgLy8vIEludGVybWVkaWF0ZSBzdGF0ZSBiZXR3ZWVuIGNodW5rcy4KICAvLy8KICAvLy8gRW5jb2RpbmcgaGFuZGxlcyB0aHJlZSBieXRlcyBhdCBhIHRpbWUuCiAgLy8vIElmIGZld2VyIHRoYW4gdGhyZWUgYnl0ZXMgaGFzIGJlZW4gc2VlbiwgdGhpcyB2YWx1ZSBlbmNvZGVzCiAgLy8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VlbiAoMCwgMSBvciAyKSBhbmQgdGhlaXIgdmFsdWVzLgogIGludCBfc3RhdGUgPSAwOwoKICAvLy8gQWxwaGFiZXQgdXNlZCBmb3IgZW5jb2RpbmcuCiAgZmluYWwgU3RyaW5nIF9hbHBoYWJldDsKCiAgX0Jhc2U2NEVuY29kZXIoYm9vbCB1cmxTYWZlKQogICAgICA6IF9hbHBoYWJldCA9IHVybFNhZmUgPyBfYmFzZTY0VXJsQWxwaGFiZXQgOiBfYmFzZTY0QWxwaGFiZXQ7CgogIC8vLyBFbmNvZGUgY291bnQgYW5kIGJpdHMgaW50byBhIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiBbX3N0YXRlXS4KICBzdGF0aWMgaW50IF9lbmNvZGVTdGF0ZShpbnQgY291bnQsIGludCBiaXRzKSB7CiAgICBhc3NlcnQoY291bnQgPD0gX2NvdW50TWFzayk7CiAgICByZXR1cm4gYml0cyA8PCBfdmFsdWVTaGlmdCB8IGNvdW50OwogIH0KCiAgLy8vIEV4dHJhY3QgYml0cyBmcm9tIGVuY29kZWQgc3RhdGUuCiAgc3RhdGljIGludCBfc3RhdGVCaXRzKGludCBzdGF0ZSkgPT4gc3RhdGUgPj4gX3ZhbHVlU2hpZnQ7CgogIC8vLyBFeHRyYWN0IGNvdW50IGZyb20gZW5jb2RlZCBzdGF0ZS4KICBzdGF0aWMgaW50IF9zdGF0ZUNvdW50KGludCBzdGF0ZSkgPT4gc3RhdGUgJiBfY291bnRNYXNrOwoKICAvLy8gQ3JlYXRlIGEgW1VpbnQ4TGlzdF0gd2l0aCB0aGUgcHJvdmlkZWQgbGVuZ3RoLgogIFVpbnQ4TGlzdCBjcmVhdGVCdWZmZXIoaW50IGJ1ZmZlckxlbmd0aCkgPT4gVWludDhMaXN0KGJ1ZmZlckxlbmd0aCk7CgogIC8vLyBFbmNvZGUgW2J5dGVzXSBmcm9tIFtzdGFydF0gdG8gW2VuZF0gYW5kIHRoZSBiaXRzIGluIFtfc3RhdGVdLgogIC8vLwogIC8vLyBSZXR1cm5zIGEgW1VpbnQ4TGlzdF0gb2YgdGhlIEFTQ0lJIGNvZGVzIG9mIHRoZSBlbmNvZGVkIGRhdGEuCiAgLy8vCiAgLy8vIElmIHRoZSBpbnB1dCwgaW5jbHVkaW5nIGxlZnQgb3ZlciBbX3N0YXRlXSBmcm9tIGVhcmxpZXIgZW5jb2RpbmdzLAogIC8vLyBhcmUgbm90IGEgbXVsdGlwbGUgb2YgdGhyZWUgYnl0ZXMsIHRoZW4gdGhlIHBhcnRpYWwgc3RhdGUgaXMgc3RvcmVkCiAgLy8vIGJhY2sgaW50byBbX3N0YXRlXS4KICAvLy8gSWYgW2lzTGFzdF0gaXMgdHJ1ZSwgcGFydGlhbCBzdGF0ZSBpcyBlbmNvZGVkIGluIHRoZSBvdXRwdXQgaW5zdGVhZCwKICAvLy8gd2l0aCB0aGUgbmVjZXNzYXJ5IHBhZGRpbmcuCiAgLy8vCiAgLy8vIFJldHVybnMgYG51bGxgIGlmIHRoZXJlIGlzIG5vIG91dHB1dC4KICBVaW50OExpc3QgZW5jb2RlKExpc3Q8aW50PiBieXRlcywgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgYXNzZXJ0KDAgPD0gc3RhcnQpOwogICAgYXNzZXJ0KHN0YXJ0IDw9IGVuZCk7CiAgICBhc3NlcnQoYnl0ZXMgPT0gbnVsbCB8fCBlbmQgPD0gYnl0ZXMubGVuZ3RoKTsKICAgIHZhciBsZW5ndGggPSBlbmQgLSBzdGFydDsKCiAgICB2YXIgY291bnQgPSBfc3RhdGVDb3VudChfc3RhdGUpOwogICAgdmFyIGJ5dGVDb3VudCA9IChjb3VudCArIGxlbmd0aCk7CiAgICB2YXIgZnVsbENodW5rcyA9IGJ5dGVDb3VudCB+LyAzOwogICAgdmFyIHBhcnRpYWxDaHVua0xlbmd0aCA9IGJ5dGVDb3VudCAtIGZ1bGxDaHVua3MgKiAzOwogICAgdmFyIGJ1ZmZlckxlbmd0aCA9IGZ1bGxDaHVua3MgKiA0OwogICAgaWYgKGlzTGFzdCAmJiBwYXJ0aWFsQ2h1bmtMZW5ndGggPiAwKSB7CiAgICAgIGJ1ZmZlckxlbmd0aCArPSA0OyAvLyBSb29tIGZvciBwYWRkaW5nLgogICAgfQogICAgdmFyIG91dHB1dCA9IGNyZWF0ZUJ1ZmZlcihidWZmZXJMZW5ndGgpOwogICAgX3N0YXRlID0KICAgICAgICBlbmNvZGVDaHVuayhfYWxwaGFiZXQsIGJ5dGVzLCBzdGFydCwgZW5kLCBpc0xhc3QsIG91dHB1dCwgMCwgX3N0YXRlKTsKICAgIGlmIChidWZmZXJMZW5ndGggPiAwKSByZXR1cm4gb3V0cHV0OwogICAgLy8gSWYgdGhlIGlucHV0IHBsdXMgdGhlIGRhdGEgaW4gc3RhdGUgaXMgc3RpbGwgbGVzcyB0aGFuIHRocmVlIGJ5dGVzLAogICAgLy8gdGhlcmUgbWF5IG5vdCBiZSBhbnkgb3V0cHV0LgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBzdGF0aWMgaW50IGVuY29kZUNodW5rKFN0cmluZyBhbHBoYWJldCwgTGlzdDxpbnQ+IGJ5dGVzLCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgIGJvb2wgaXNMYXN0LCBVaW50OExpc3Qgb3V0cHV0LCBpbnQgb3V0cHV0SW5kZXgsIGludCBzdGF0ZSkgewogICAgdmFyIGJpdHMgPSBfc3RhdGVCaXRzKHN0YXRlKTsKICAgIC8vIENvdW50IG51bWJlciBvZiBtaXNzaW5nIGJ5dGVzIGluIHRocmVlLWJ5dGUgY2h1bmsuCiAgICB2YXIgZXhwZWN0ZWRDaGFycyA9IDMgLSBfc3RhdGVDb3VudChzdGF0ZSk7CgogICAgLy8gVGhlIGlucHV0IG11c3QgYmUgYSBsaXN0IG9mIGJ5dGVzIChpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMC4uMjU1KS4KICAgIC8vIFRoZSB2YWx1ZSBvZiBgYnl0ZU9yYCB3aWxsIGJlIHRoZSBiaXR3aXNlIG9yIG9mIGFsbCB0aGUgdmFsdWVzIGluCiAgICAvLyBgYnl0ZXNgIGFuZCBhIGxhdGVyIGNoZWNrIHdpbGwgdmFsaWRhdGUgdGhhdCB0aGV5IHdlcmUgYWxsIHZhbGlkIGJ5dGVzLgogICAgdmFyIGJ5dGVPciA9IDA7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgYnl0ZSA9IGJ5dGVzW2ldOwogICAgICBieXRlT3IgfD0gYnl0ZTsKICAgICAgYml0cyA9ICgoYml0cyA8PCA4KSB8IGJ5dGUpICYgMHhGRkZGRkY7IC8vIE5ldmVyIHN0b3JlIG1vcmUgdGhhbiAyNCBiaXRzLgogICAgICBleHBlY3RlZENoYXJzLS07CiAgICAgIGlmIChleHBlY3RlZENoYXJzID09IDApIHsKICAgICAgICBvdXRwdXRbb3V0cHV0SW5kZXgrK10gPSBhbHBoYWJldC5jb2RlVW5pdEF0KChiaXRzID4+IDE4KSAmIF9zaXhCaXRNYXNrKTsKICAgICAgICBvdXRwdXRbb3V0cHV0SW5kZXgrK10gPSBhbHBoYWJldC5jb2RlVW5pdEF0KChiaXRzID4+IDEyKSAmIF9zaXhCaXRNYXNrKTsKICAgICAgICBvdXRwdXRbb3V0cHV0SW5kZXgrK10gPSBhbHBoYWJldC5jb2RlVW5pdEF0KChiaXRzID4+IDYpICYgX3NpeEJpdE1hc2spOwogICAgICAgIG91dHB1dFtvdXRwdXRJbmRleCsrXSA9IGFscGhhYmV0LmNvZGVVbml0QXQoYml0cyAmIF9zaXhCaXRNYXNrKTsKICAgICAgICBleHBlY3RlZENoYXJzID0gMzsKICAgICAgICBiaXRzID0gMDsKICAgICAgfQogICAgfQogICAgaWYgKGJ5dGVPciA+PSAwICYmIGJ5dGVPciA8PSAyNTUpIHsKICAgICAgaWYgKGlzTGFzdCAmJiBleHBlY3RlZENoYXJzIDwgMykgewogICAgICAgIHdyaXRlRmluYWxDaHVuayhhbHBoYWJldCwgb3V0cHV0LCBvdXRwdXRJbmRleCwgMyAtIGV4cGVjdGVkQ2hhcnMsIGJpdHMpOwogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHJldHVybiBfZW5jb2RlU3RhdGUoMyAtIGV4cGVjdGVkQ2hhcnMsIGJpdHMpOwogICAgfQoKICAgIC8vIFRoZXJlIHdhcyBhbiBpbnZhbGlkIGJ5dGUgdmFsdWUgc29tZXdoZXJlIGluIHRoZSBpbnB1dCAtIGZpbmQgaXQhCiAgICB2YXIgaSA9IHN0YXJ0OwogICAgd2hpbGUgKGkgPCBlbmQpIHsKICAgICAgdmFyIGJ5dGUgPSBieXRlc1tpXTsKICAgICAgaWYgKGJ5dGUgPCAwIHx8IGJ5dGUgPiAyNTUpIGJyZWFrOwogICAgICBpKys7CiAgICB9CiAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgIGJ5dGVzLCAiTm90IGEgYnl0ZSB2YWx1ZSBhdCBpbmRleCAkaTogMHgke2J5dGVzW2ldLnRvUmFkaXhTdHJpbmcoMTYpfSIpOwogIH0KCiAgLy8vIFdyaXRlcyBhIGZpbmFsIGVuY29kZWQgZm91ci1jaGFyYWN0ZXIgY2h1bmsuCiAgLy8vCiAgLy8vIE9ubHkgdXNlZCB3aGVuIHRoZSBbX3N0YXRlXSBjb250YWlucyBhIHBhcnRpYWwgKDEgb3IgMiBieXRlKQogIC8vLyBpbnB1dC4KICBzdGF0aWMgdm9pZCB3cml0ZUZpbmFsQ2h1bmsoCiAgICAgIFN0cmluZyBhbHBoYWJldCwgVWludDhMaXN0IG91dHB1dCwgaW50IG91dHB1dEluZGV4LCBpbnQgY291bnQsIGludCBiaXRzKSB7CiAgICBhc3NlcnQoY291bnQgPiAwKTsKICAgIGlmIChjb3VudCA9PSAxKSB7CiAgICAgIG91dHB1dFtvdXRwdXRJbmRleCsrXSA9IGFscGhhYmV0LmNvZGVVbml0QXQoKGJpdHMgPj4gMikgJiBfc2l4Qml0TWFzayk7CiAgICAgIG91dHB1dFtvdXRwdXRJbmRleCsrXSA9IGFscGhhYmV0LmNvZGVVbml0QXQoKGJpdHMgPDwgNCkgJiBfc2l4Qml0TWFzayk7CiAgICAgIG91dHB1dFtvdXRwdXRJbmRleCsrXSA9IF9wYWRkaW5nQ2hhcjsKICAgICAgb3V0cHV0W291dHB1dEluZGV4KytdID0gX3BhZGRpbmdDaGFyOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGNvdW50ID09IDIpOwogICAgICBvdXRwdXRbb3V0cHV0SW5kZXgrK10gPSBhbHBoYWJldC5jb2RlVW5pdEF0KChiaXRzID4+IDEwKSAmIF9zaXhCaXRNYXNrKTsKICAgICAgb3V0cHV0W291dHB1dEluZGV4KytdID0gYWxwaGFiZXQuY29kZVVuaXRBdCgoYml0cyA+PiA0KSAmIF9zaXhCaXRNYXNrKTsKICAgICAgb3V0cHV0W291dHB1dEluZGV4KytdID0gYWxwaGFiZXQuY29kZVVuaXRBdCgoYml0cyA8PCAyKSAmIF9zaXhCaXRNYXNrKTsKICAgICAgb3V0cHV0W291dHB1dEluZGV4KytdID0gX3BhZGRpbmdDaGFyOwogICAgfQogIH0KfQoKY2xhc3MgX0J1ZmZlckNhY2hpbmdCYXNlNjRFbmNvZGVyIGV4dGVuZHMgX0Jhc2U2NEVuY29kZXIgewogIC8vLyBSZXVzZWQgYnVmZmVyLgogIC8vLwogIC8vLyBXaGVuIHRoZSBidWZmZXIgaXNuJ3QgcmVsZWFzZWQgdG8gdGhlIHNpbmssIG9ubHkgdXNlZCB0byBjcmVhdGUgYW5vdGhlcgogIC8vLyB2YWx1ZSAoYSBzdHJpbmcpLCB0aGUgYnVmZmVyIGNhbiBiZSByZXVzZWQgYmV0d2VlbiBjaHVua3MuCiAgVWludDhMaXN0IGJ1ZmZlckNhY2hlOwoKICBfQnVmZmVyQ2FjaGluZ0Jhc2U2NEVuY29kZXIoYm9vbCB1cmxTYWZlKSA6IHN1cGVyKHVybFNhZmUpOwoKICBVaW50OExpc3QgY3JlYXRlQnVmZmVyKGludCBidWZmZXJMZW5ndGgpIHsKICAgIGlmIChidWZmZXJDYWNoZSA9PSBudWxsIHx8IGJ1ZmZlckNhY2hlLmxlbmd0aCA8IGJ1ZmZlckxlbmd0aCkgewogICAgICBidWZmZXJDYWNoZSA9IFVpbnQ4TGlzdChidWZmZXJMZW5ndGgpOwogICAgfQogICAgLy8gUmV0dXJuIGEgdmlldyBvZiB0aGUgYnVmZmVyLCBzbyBpdCBoYXMgdGhlIHJlcXVlc3RlZCBsZW5ndGguCiAgICByZXR1cm4gVWludDhMaXN0LnZpZXcoYnVmZmVyQ2FjaGUuYnVmZmVyLCAwLCBidWZmZXJMZW5ndGgpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX0Jhc2U2NEVuY29kZXJTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgdm9pZCBhZGQoTGlzdDxpbnQ+IHNvdXJjZSkgewogICAgX2FkZChzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgsIGZhbHNlKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfYWRkKG51bGwsIDAsIDAsIHRydWUpOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBpZiAoZW5kID09IG51bGwpIHRocm93IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgiZW5kIik7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBzb3VyY2UubGVuZ3RoKTsKICAgIF9hZGQoc291cmNlLCBzdGFydCwgZW5kLCBpc0xhc3QpOwogIH0KCiAgdm9pZCBfYWRkKExpc3Q8aW50PiBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpOwp9CgpjbGFzcyBfQXNjaWlCYXNlNjRFbmNvZGVyU2luayBleHRlbmRzIF9CYXNlNjRFbmNvZGVyU2luayB7CiAgZmluYWwgU2luazxTdHJpbmc+IF9zaW5rOwogIGZpbmFsIF9CYXNlNjRFbmNvZGVyIF9lbmNvZGVyOwoKICBfQXNjaWlCYXNlNjRFbmNvZGVyU2luayh0aGlzLl9zaW5rLCBib29sIHVybFNhZmUpCiAgICAgIDogX2VuY29kZXIgPSBfQnVmZmVyQ2FjaGluZ0Jhc2U2NEVuY29kZXIodXJsU2FmZSk7CgogIHZvaWQgX2FkZChMaXN0PGludD4gc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICB2YXIgYnVmZmVyID0gX2VuY29kZXIuZW5jb2RlKHNvdXJjZSwgc3RhcnQsIGVuZCwgaXNMYXN0KTsKICAgIGlmIChidWZmZXIgIT0gbnVsbCkgewogICAgICB2YXIgc3RyaW5nID0gU3RyaW5nLmZyb21DaGFyQ29kZXMoYnVmZmVyKTsKICAgICAgX3NpbmsuYWRkKHN0cmluZyk7CiAgICB9CiAgICBpZiAoaXNMYXN0KSB7CiAgICAgIF9zaW5rLmNsb3NlKCk7CiAgICB9CiAgfQp9CgpjbGFzcyBfVXRmOEJhc2U2NEVuY29kZXJTaW5rIGV4dGVuZHMgX0Jhc2U2NEVuY29kZXJTaW5rIHsKICBmaW5hbCBCeXRlQ29udmVyc2lvblNpbmsgX3Npbms7CiAgZmluYWwgX0Jhc2U2NEVuY29kZXIgX2VuY29kZXI7CgogIF9VdGY4QmFzZTY0RW5jb2RlclNpbmsodGhpcy5fc2luaywgYm9vbCB1cmxTYWZlKQogICAgICA6IF9lbmNvZGVyID0gX0Jhc2U2NEVuY29kZXIodXJsU2FmZSk7CgogIHZvaWQgX2FkZChMaXN0PGludD4gc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICB2YXIgYnVmZmVyID0gX2VuY29kZXIuZW5jb2RlKHNvdXJjZSwgc3RhcnQsIGVuZCwgaXNMYXN0KTsKICAgIGlmIChidWZmZXIgIT0gbnVsbCkgewogICAgICBfc2luay5hZGRTbGljZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIGlzTGFzdCk7CiAgICB9CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRGVjb2RlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBEZWNvZGVyIGZvciBiYXNlNjQgZW5jb2RlZCBkYXRhLgovLy8KLy8vIFRoaXMgZGVjb2RlciBhY2NlcHRzIGJvdGggYmFzZTY0IGFuZCBiYXNlNjR1cmwgKCJ1cmwtc2FmZSIpIGVuY29kaW5ncy4KLy8vCi8vLyBUaGUgZW5jb2RpbmcgaXMgcmVxdWlyZWQgdG8gYmUgcHJvcGVybHkgcGFkZGVkLgpjbGFzcyBCYXNlNjREZWNvZGVyIGV4dGVuZHMgQ29udmVydGVyPFN0cmluZywgTGlzdDxpbnQ+PiB7CiAgY29uc3QgQmFzZTY0RGVjb2RlcigpOwoKICAvLy8gRGVjb2RlcyB0aGUgY2hhcmFjdGVycyBvZiBbaW5wdXRdIGZyb20gW3N0YXJ0XSB0byBbZW5kXSBhcyBiYXNlNjQuCiAgLy8vCiAgLy8vIElmIFtzdGFydF0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gdGhlIHN0YXJ0IG9mIFtpbnB1dF0uCiAgLy8vIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBlbmQgb2YgW2lucHV0XS4KICAvLy8KICAvLy8gVGhlIHJldHVybmVkIFtVaW50OExpc3RdIGNvbnRhaW5zIGV4YWN0bHkgdGhlIGRlY29kZWQgYnl0ZXMsCiAgLy8vIHNvIHRoZSBbVWludDhMaXN0Lmxlbmd0aF0gaXMgcHJlY2lzZWx5IHRoZSBudW1iZXIgb2YgZGVjb2RlZCBieXRlcy4KICAvLy8gVGhlIFtVaW50OExpc3QuYnVmZmVyXSBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGRlY29kZWQgYnl0ZXMuCiAgVWludDhMaXN0IGNvbnZlcnQoU3RyaW5nIGlucHV0LCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGlucHV0Lmxlbmd0aCk7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gVWludDhMaXN0KDApOwogICAgdmFyIGRlY29kZXIgPSBfQmFzZTY0RGVjb2RlcigpOwogICAgdmFyIGJ1ZmZlciA9IGRlY29kZXIuZGVjb2RlKGlucHV0LCBzdGFydCwgZW5kKTsKICAgIGRlY29kZXIuY2xvc2UoaW5wdXQsIGVuZCk7CiAgICByZXR1cm4gYnVmZmVyOwogIH0KCiAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgewogICAgcmV0dXJuIF9CYXNlNjREZWNvZGVyU2luayhzaW5rKTsKICB9Cn0KCi8vLyBIZWxwZXIgY2xhc3MgaW1wbGVtZW50aW5nIGJhc2U2NCBkZWNvZGluZyB3aXRoIGludGVybWVkaWF0ZSBzdGF0ZS4KY2xhc3MgX0Jhc2U2NERlY29kZXIgewogIC8vLyBTaGlmdC1jb3VudCB0byBleHRyYWN0IHRoZSB2YWx1ZXMgc3RvcmVkIGluIFtfc3RhdGVdLgogIHN0YXRpYyBjb25zdCBpbnQgX3ZhbHVlU2hpZnQgPSAyOwoKICAvLy8gTWFzayB0byBleHRyYWN0IHRoZSBjb3VudCB2YWx1ZSBzdG9yZWQgaW4gW19zdGF0ZV0uCiAgc3RhdGljIGNvbnN0IGludCBfY291bnRNYXNrID0gMzsKCiAgLy8vIEludmFsaWQgY2hhcmFjdGVyIGluIGRlY29kaW5nIHRhYmxlLgogIHN0YXRpYyBjb25zdCBpbnQgX2ludmFsaWQgPSAtMjsKCiAgLy8vIFBhZGRpbmcgY2hhcmFjdGVyIGluIGRlY29kaW5nIHRhYmxlLgogIHN0YXRpYyBjb25zdCBpbnQgX3BhZGRpbmcgPSAtMTsKCiAgLy8gU2hvcnRoYW5kcyB0byBtYWtlIHRoZSB0YWJsZSBtb3JlIHJlYWRhYmxlLgogIHN0YXRpYyBjb25zdCBpbnQgX18gPSBfaW52YWxpZDsKICBzdGF0aWMgY29uc3QgaW50IF9wID0gX3BhZGRpbmc7CgogIC8vLyBNYXBwaW5nIGZyb20gQVNDSUkgY2hhcmFjdGVycyB0byB0aGVpciBpbmRleCBpbiB0aGUgYmFzZTY0IGFscGhhYmV0LgogIC8vLwogIC8vLyBVc2VzIFtfaW52YWxpZF0gZm9yIGludmFsaWQgaW5kaWNlcyBhbmQgW19wYWRkaW5nXSBmb3IgdGhlIHBhZGRpbmcKICAvLy8gY2hhcmFjdGVyLgogIC8vLwogIC8vLyBBY2NlcHRzIHRoZSAiVVJMLXNhZmUiIGFscGhhYmV0IGFzIHdlbGwgKGAtYCBhbmQgYF9gIGFyZSB0aGUKICAvLy8gNjJuZCBhbmQgNjNyZCBhbHBoYWJldCBjaGFyYWN0ZXJzKSwgYW5kIGNvbnNpZGVycyBgJWAgYSBwYWRkaW5nCiAgLy8vIGNoYXJhY3Rlciwgd2hpY2ggbXVzdCB0aGVuIGJlIGZvbGxvd2VkIGJ5IGAzRGAsIHRoZSBwZXJjZW50LWVzY2FwZQogIC8vLyBmb3IgYD1gLgogIHN0YXRpYyBmaW5hbCBMaXN0PGludD4gX2ludmVyc2VBbHBoYWJldCA9IEludDhMaXN0LmZyb21MaXN0KFsKICAgIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCAvLwogICAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIC8vCiAgICBfXywgX18sIF9fLCBfXywgX18sIF9wLCBfXywgX18sIF9fLCBfXywgX18sIDYyLCBfXywgNjIsIF9fLCA2MywgLy8KICAgIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCBfXywgX18sIF9fLCBfcCwgX18sIF9fLCAvLwogICAgX18sIDAwLCAwMSwgMDIsIDAzLCAwNCwgMDUsIDA2LCAwNywgMDgsIDA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIC8vCiAgICAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIF9fLCBfXywgX18sIF9fLCA2MywgLy8KICAgIF9fLCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCAvLwogICAgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCBfXywgX18sIF9fLCBfXywgX18sIC8vCiAgXSk7CgogIC8vIENoYXJhY3RlciBjb25zdGFudHMuCiAgc3RhdGljIGNvbnN0IGludCBfY2hhcl9wZXJjZW50ID0gMHgyNTsgLy8gJyUnLgogIHN0YXRpYyBjb25zdCBpbnQgX2NoYXJfMyA9IDB4MzM7IC8vICczJy4KICBzdGF0aWMgY29uc3QgaW50IF9jaGFyX2QgPSAweDY0OyAvLyAnZCcuCgogIC8vLyBNYWludGFpbnMgdGhlIGludGVybWVkaWF0ZSBzdGF0ZSBvZiBhIHBhcnRseS1kZWNvZGVkIGlucHV0LgogIC8vLwogIC8vLyBCYXNlNjQgaXMgZGVjb2RlZCBpbiBjaHVua3Mgb2YgZm91ciBjaGFyYWN0ZXJzLiBJZiBhIGNodW5rIGRvZXMgbm90CiAgLy8vIGNvbnRhaW4gYSBmdWxsIGJsb2NrLCB0aGUgZGVjb2RlZCBiaXRzIChzaXggcGVyIGNoYXJhY3Rlcikgb2YgdGhlCiAgLy8vIGF2YWlsYWJsZSBjaGFyYWN0ZXJzIGFyZSBzdG9yZWQgaW4gW19zdGF0ZV0gdW50aWwgdGhlIG5leHQgY2FsbCB0bwogIC8vLyBbX2RlY29kZV0gb3IgW19jbG9zZV0uCiAgLy8vCiAgLy8vIElmIG5vIHBhZGRpbmcgaGFzIGJlZW4gc2VlbiwgdGhlIHZhbHVlIGlzCiAgLy8vICAgYG51bWJlck9mQ2hhcmFjdGVyc1NlZW4gfCAoZGVjb2RlZEJpdHMgPDwgMilgCiAgLy8vIHdoZXJlIGBudW1iZXJPZkNoYXJhY3RlcnNTZWVuYCBpcyBiZXR3ZWVuIDAgYW5kIDMgYW5kIGRlY29kZWQgYml0cwogIC8vLyBjb250YWlucyBzaXggYml0cyBwZXIgc2VlbiBjaGFyYWN0ZXIuCiAgLy8vCiAgLy8vIElmIHBhZGRpbmcgaGFzIGJlZW4gc2VlbiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUuIEl0J3MgdGhlIGJpdHdpc2UgbmVnYXRpb24KICAvLy8gb2YgdGhlIG51bWJlciBvZiByZW1haW5pbmcgYWxsb3dlZCBwYWRkaW5nIGNoYXJhY3RlcnMgKGFsd2F5cyB+MCBvciB+MSkuCiAgLy8vCiAgLy8vIEEgc3RhdGUgb2YgYDBgIG9yIGB+MGAgYXJlIHZhbGlkIHBsYWNlcyB0byBlbmQgZGVjb2RpbmcsIGFsbCBvdGhlciB2YWx1ZXMKICAvLy8gbWVhbiB0aGF0IGEgZm91ci1jaGFyYWN0ZXIgYmxvY2sgaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC4KICBpbnQgX3N0YXRlID0gMDsKCiAgLy8vIEVuY29kZXMgW2NvdW50XSBhbmQgW2JpdHNdIGFzIGEgdmFsdWUgdG8gYmUgc3RvcmVkIGluIFtfc3RhdGVdLgogIHN0YXRpYyBpbnQgX2VuY29kZUNoYXJhY3RlclN0YXRlKGludCBjb3VudCwgaW50IGJpdHMpIHsKICAgIGFzc2VydChjb3VudCA9PSAoY291bnQgJiBfY291bnRNYXNrKSk7CiAgICByZXR1cm4gKGJpdHMgPDwgX3ZhbHVlU2hpZnQgfCBjb3VudCk7CiAgfQoKICAvLy8gRXh0cmFjdHMgY291bnQgZnJvbSBhIFtfc3RhdGVdIHZhbHVlLgogIHN0YXRpYyBpbnQgX3N0YXRlQ291bnQoaW50IHN0YXRlKSB7CiAgICBhc3NlcnQoc3RhdGUgPj0gMCk7CiAgICByZXR1cm4gc3RhdGUgJiBfY291bnRNYXNrOwogIH0KCiAgLy8vIEV4dHJhY3RzIHZhbHVlIGJpdHMgZnJvbSBhIFtfc3RhdGVdIHZhbHVlLgogIHN0YXRpYyBpbnQgX3N0YXRlQml0cyhpbnQgc3RhdGUpIHsKICAgIGFzc2VydChzdGF0ZSA+PSAwKTsKICAgIHJldHVybiBzdGF0ZSA+PiBfdmFsdWVTaGlmdDsKICB9CgogIC8vLyBFbmNvZGVzIGEgbnVtYmVyIG9mIGV4cGVjdGVkIHBhZGRpbmcgY2hhcmFjdGVycyB0byBiZSBzdG9yZWQgaW4gW19zdGF0ZV0uCiAgc3RhdGljIGludCBfZW5jb2RlUGFkZGluZ1N0YXRlKGludCBleHBlY3RlZFBhZGRpbmcpIHsKICAgIGFzc2VydChleHBlY3RlZFBhZGRpbmcgPj0gMCk7CiAgICBhc3NlcnQoZXhwZWN0ZWRQYWRkaW5nIDw9IDUpOwogICAgcmV0dXJuIC1leHBlY3RlZFBhZGRpbmcgLSAxOyAvLyB+ZXhwZWN0ZWRQYWRkaW5nIGFkYXB0ZWQgdG8gZGFydDJqcy4KICB9CgogIC8vLyBFeHRyYWN0cyBleHBlY3RlZCBwYWRkaW5nIGNoYXJhY3RlciBjb3VudCBmcm9tIGEgW19zdGF0ZV0gdmFsdWUuCiAgc3RhdGljIGludCBfc3RhdGVQYWRkaW5nKGludCBzdGF0ZSkgewogICAgYXNzZXJ0KHN0YXRlIDwgMCk7CiAgICByZXR1cm4gLXN0YXRlIC0gMTsgLy8gfnN0YXRlIGFkYXB0ZWQgdG8gZGFydDJqcy4KICB9CgogIHN0YXRpYyBib29sIF9oYXNTZWVuUGFkZGluZyhpbnQgc3RhdGUpID0+IHN0YXRlIDwgMDsKCiAgLy8vIERlY29kZXMgW2lucHV0XSBmcm9tIFtzdGFydF0gdG8gW2VuZF0uCiAgLy8vCiAgLy8vIFJldHVybnMgYSBbVWludDhMaXN0XSB3aXRoIHRoZSBkZWNvZGVkIGJ5dGVzLgogIC8vLyBJZiBhIHByZXZpb3VzIGNhbGwgaGFkIGFuIGluY29tcGxldGUgZm91ci1jaGFyYWN0ZXIgYmxvY2ssIHRoZSBiaXRzIGZyb20KICAvLy8gdGhvc2UgYXJlIGluY2x1ZGVkIGluIGRlY29kaW5nCiAgVWludDhMaXN0IGRlY29kZShTdHJpbmcgaW5wdXQsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgYXNzZXJ0KDAgPD0gc3RhcnQpOwogICAgYXNzZXJ0KHN0YXJ0IDw9IGVuZCk7CiAgICBhc3NlcnQoZW5kIDw9IGlucHV0Lmxlbmd0aCk7CiAgICBpZiAoX2hhc1NlZW5QYWRkaW5nKF9zdGF0ZSkpIHsKICAgICAgX3N0YXRlID0gX2NoZWNrUGFkZGluZyhpbnB1dCwgc3RhcnQsIGVuZCwgX3N0YXRlKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gVWludDhMaXN0KDApOwogICAgdmFyIGJ1ZmZlciA9IF9hbGxvY2F0ZUJ1ZmZlcihpbnB1dCwgc3RhcnQsIGVuZCwgX3N0YXRlKTsKICAgIF9zdGF0ZSA9IGRlY29kZUNodW5rKGlucHV0LCBzdGFydCwgZW5kLCBidWZmZXIsIDAsIF9zdGF0ZSk7CiAgICByZXR1cm4gYnVmZmVyOwogIH0KCiAgLy8vIENoZWNrcyB0aGF0IFtfc3RhdGVdIHJlcHJlc2VudHMgYSB2YWxpZCBkZWNvZGluZy4KICB2b2lkIGNsb3NlKFN0cmluZyBpbnB1dCwgaW50IGVuZCkgewogICAgaWYgKF9zdGF0ZSA8IF9lbmNvZGVQYWRkaW5nU3RhdGUoMCkpIHsKICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJNaXNzaW5nIHBhZGRpbmcgY2hhcmFjdGVyIiwgaW5wdXQsIGVuZCk7CiAgICB9CiAgICBpZiAoX3N0YXRlID4gMCkgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW52YWxpZCBsZW5ndGgsIG11c3QgYmUgbXVsdGlwbGUgb2YgZm91ciIsIGlucHV0LCBlbmQpOwogICAgfQogICAgX3N0YXRlID0gX2VuY29kZVBhZGRpbmdTdGF0ZSgwKTsKICB9CgogIC8vLyBEZWNvZGVzIFtpbnB1dF0gZnJvbSBbc3RhcnRdIHRvIFtlbmRdLgogIC8vLwogIC8vLyBJbmNsdWRlcyB0aGUgc3RhdGUgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIGluIHRoZSBkZWNvZGluZy4KICAvLy8gV3JpdGVzIHRoZSBkZWNvZGluZyB0byBbb3V0cHV0XSBhdCBbb3V0SW5kZXhdLCBhbmQgdGhlcmUgbXVzdAogIC8vLyBiZSByb29tIGluIHRoZSBvdXRwdXQuCiAgc3RhdGljIGludCBkZWNvZGVDaHVuayhTdHJpbmcgaW5wdXQsIGludCBzdGFydCwgaW50IGVuZCwgVWludDhMaXN0IG91dHB1dCwKICAgICAgaW50IG91dEluZGV4LCBpbnQgc3RhdGUpIHsKICAgIGFzc2VydCghX2hhc1NlZW5QYWRkaW5nKHN0YXRlKSk7CiAgICBjb25zdCBhc2NpaU1hc2sgPSAxMjc7CiAgICBjb25zdCBhc2NpaU1heCA9IDEyNzsKICAgIGNvbnN0IGVpZ2h0Qml0TWFzayA9IDB4RkY7CiAgICBjb25zdCBiaXRzUGVyQ2hhcmFjdGVyID0gNjsKCiAgICB2YXIgYml0cyA9IF9zdGF0ZUJpdHMoc3RhdGUpOwogICAgdmFyIGNvdW50ID0gX3N0YXRlQ291bnQoc3RhdGUpOwogICAgLy8gU3RyaW5nIGNvbnRlbnRzIHNob3VsZCBiZSBhbGwgQVNDSUkuCiAgICAvLyBJbnN0ZWFkIG9mIGNoZWNraW5nIGZvciBlYWNoIGNoYXJhY3Rlciwgd2UgY29sbGVjdCB0aGUgYml0d2lzZS1vciBvZgogICAgLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIGluIGBjaGFyT3JgIGFuZCBsYXRlciB2YWxpZGF0ZSB0aGF0IGFsbCBjaGFyYWN0ZXJzCiAgICAvLyB3ZXJlIEFTQ0lJLgogICAgdmFyIGNoYXJPciA9IDA7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgY2hhciA9IGlucHV0LmNvZGVVbml0QXQoaSk7CiAgICAgIGNoYXJPciB8PSBjaGFyOwogICAgICB2YXIgY29kZSA9IF9pbnZlcnNlQWxwaGFiZXRbY2hhciAmIGFzY2lpTWFza107CiAgICAgIGlmIChjb2RlID49IDApIHsKICAgICAgICBiaXRzID0gKChiaXRzIDw8IGJpdHNQZXJDaGFyYWN0ZXIpIHwgY29kZSkgJiAweEZGRkZGRjsKICAgICAgICBjb3VudCA9IChjb3VudCArIDEpICYgMzsKICAgICAgICBpZiAoY291bnQgPT0gMCkgewogICAgICAgICAgYXNzZXJ0KG91dEluZGV4ICsgMyA8PSBvdXRwdXQubGVuZ3RoKTsKICAgICAgICAgIG91dHB1dFtvdXRJbmRleCsrXSA9IChiaXRzID4+IDE2KSAmIGVpZ2h0Qml0TWFzazsKICAgICAgICAgIG91dHB1dFtvdXRJbmRleCsrXSA9IChiaXRzID4+IDgpICYgZWlnaHRCaXRNYXNrOwogICAgICAgICAgb3V0cHV0W291dEluZGV4KytdID0gYml0cyAmIGVpZ2h0Qml0TWFzazsKICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmIChjb2RlID09IF9wYWRkaW5nICYmIGNvdW50ID4gMSkgewogICAgICAgIGlmIChjaGFyT3IgPCAwIHx8IGNoYXJPciA+IGFzY2lpTWF4KSBicmVhazsKICAgICAgICBpZiAoY291bnQgPT0gMykgewogICAgICAgICAgaWYgKChiaXRzICYgMHgwMykgIT0gMCkgewogICAgICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgZW5jb2RpbmcgYmVmb3JlIHBhZGRpbmciLCBpbnB1dCwgaSk7CiAgICAgICAgICB9CiAgICAgICAgICBvdXRwdXRbb3V0SW5kZXgrK10gPSBiaXRzID4+IDEwOwogICAgICAgICAgb3V0cHV0W291dEluZGV4KytdID0gYml0cyA+PiAyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoKGJpdHMgJiAweDBGKSAhPSAwKSB7CiAgICAgICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBlbmNvZGluZyBiZWZvcmUgcGFkZGluZyIsIGlucHV0LCBpKTsKICAgICAgICAgIH0KICAgICAgICAgIG91dHB1dFtvdXRJbmRleCsrXSA9IGJpdHMgPj4gNDsKICAgICAgICB9CiAgICAgICAgLy8gRXhwZWN0ZWQgcGFkZGluZyBpcyB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIHBhZGRpbmcgY2hhcmFjdGVycywKICAgICAgICAvLyB3aGVyZSBgPWAgY291bnRzIGFzIHRocmVlIGFuZCBgJTNEYCBjb3VudHMgYXMgb25lIHBlciBjaGFyYWN0ZXIuCiAgICAgICAgLy8KICAgICAgICAvLyBFeHBlY3QgZWl0aGVyIHplcm8gb3Igb25lIHBhZGRpbmcgZGVwZW5kaW5nIG9uIGNvdW50ICgyIG9yIDMpLAogICAgICAgIC8vIHBsdXMgdHdvIG1vcmUgY2hhcmFjdGVycyBpZiB0aGUgY29kZSB3YXMgYCVgIChhIHBhcnRpYWwgcGFkZGluZykuCiAgICAgICAgdmFyIGV4cGVjdGVkUGFkZGluZyA9ICgzIC0gY291bnQpICogMzsKICAgICAgICBpZiAoY2hhciA9PSBfY2hhcl9wZXJjZW50KSBleHBlY3RlZFBhZGRpbmcgKz0gMjsKICAgICAgICBzdGF0ZSA9IF9lbmNvZGVQYWRkaW5nU3RhdGUoZXhwZWN0ZWRQYWRkaW5nKTsKICAgICAgICByZXR1cm4gX2NoZWNrUGFkZGluZyhpbnB1dCwgaSArIDEsIGVuZCwgc3RhdGUpOwogICAgICB9CiAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBjaGFyYWN0ZXIiLCBpbnB1dCwgaSk7CiAgICB9CiAgICBpZiAoY2hhck9yID49IDAgJiYgY2hhck9yIDw9IGFzY2lpTWF4KSB7CiAgICAgIHJldHVybiBfZW5jb2RlQ2hhcmFjdGVyU3RhdGUoY291bnQsIGJpdHMpOwogICAgfQogICAgLy8gVGhlcmUgaXMgYW4gaW52YWxpZCAobm9uLUFTQ0lJKSBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0LgogICAgaW50IGk7CiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHZhciBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNoYXIgPCAwIHx8IGNoYXIgPiBhc2NpaU1heCkgYnJlYWs7CiAgICB9CiAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgY2hhcmFjdGVyIiwgaW5wdXQsIGkpOwogIH0KCiAgLy8vIEFsbG9jYXRlcyBhIGJ1ZmZlciB3aXRoIHJvb20gZm9yIHRoZSBkZWNvZGluZyBvZiBhIHN1YnN0cmluZyBvZiBbaW5wdXRdLgogIC8vLwogIC8vLyBJbmNsdWRlcyByb29tIGZvciB0aGUgY2hhcmFjdGVycyBpbiBbc3RhdGVdLCBhbmQgaGFuZGxlcyBwYWRkaW5nIGNvcnJlY3RseS4KICBzdGF0aWMgVWludDhMaXN0IF9hbGxvY2F0ZUJ1ZmZlcigKICAgICAgU3RyaW5nIGlucHV0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBzdGF0ZSkgewogICAgYXNzZXJ0KHN0YXRlID49IDApOwogICAgdmFyIHBhZGRpbmdTdGFydCA9IF90cmltUGFkZGluZ0NoYXJzKGlucHV0LCBzdGFydCwgZW5kKTsKICAgIHZhciBsZW5ndGggPSBfc3RhdGVDb3VudChzdGF0ZSkgKyAocGFkZGluZ1N0YXJ0IC0gc3RhcnQpOwogICAgLy8gVGhyZWUgYnl0ZXMgcGVyIGZ1bGwgZm91ciBieXRlcyBpbiB0aGUgaW5wdXQuCiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gKGxlbmd0aCA+PiAyKSAqIDM7CiAgICAvLyBJZiBwYWRkaW5nIHdhcyBzZWVuLCB0aGVuIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmssIGFuZCB0aGUgZmluYWwgcGFydGlhbAogICAgLy8gY2h1bmsgc2hvdWxkIGJlIGRlY29kZWQgdG9vLgogICAgdmFyIHJlbWFpbmRlckxlbmd0aCA9IGxlbmd0aCAmIDM7CiAgICBpZiAocmVtYWluZGVyTGVuZ3RoICE9IDAgJiYgcGFkZGluZ1N0YXJ0IDwgZW5kKSB7CiAgICAgIGJ1ZmZlckxlbmd0aCArPSByZW1haW5kZXJMZW5ndGggLSAxOwogICAgfQogICAgaWYgKGJ1ZmZlckxlbmd0aCA+IDApIHJldHVybiBVaW50OExpc3QoYnVmZmVyTGVuZ3RoKTsKICAgIC8vIElmIHRoZSBpbnB1dCBwbHVzIHN0YXRlIGlzIGxlc3MgdGhhbiBmb3VyIGNoYXJhY3RlcnMsIGFuZCBpdCdzIG5vdAogICAgLy8gYXQgdGhlIGVuZCBvZiBpbnB1dCwgbm8gYnVmZmVyIGlzIG5lZWRlZC4KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBzdGFydCBvZiBwYWRkaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0LgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSBlbmQgb2YgaW5wdXQgaWYgdGhlcmUgaXMgbm8gcGFkZGluZy4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBkZWNvZGluZyBidWZmZXIgaGFzIHRoZSBleGFjdCBzaXplCiAgLy8vIGl0IG5lZWRzIHdoZW4gaW5wdXQgaXMgdmFsaWQsIGFuZCBhdCBsZWFzdCBlbm91Z2ggYnl0ZXMgdG8gcmVhY2ggdGhlIGVycm9yCiAgLy8vIHdoZW4gaW5wdXQgaXMgaW52YWxpZC4KICAvLy8KICAvLy8gTmV2ZXIgY291bnQgbW9yZSB0aGFuIHR3byBwYWRkaW5nIHNlcXVlbmNlcyBzaW5jZSBhbnkgbW9yZSB0aGFuIHRoYXQKICAvLy8gd2lsbCByYWlzZSBhbiBlcnJvciBhbnl3YXksIGFuZCB3ZSBvbmx5IGNhcmUgYWJvdXQgYmVpbmcgcHJlY2lzZSBmb3IKICAvLy8gc3VjY2Vzc2Z1bCBjb252ZXJzaW9ucy4KICBzdGF0aWMgaW50IF90cmltUGFkZGluZ0NoYXJzKFN0cmluZyBpbnB1dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAvLyBUaGlzIG1heSBjb3VudCAnJT0nIGFzIHR3byBwYWRkaW5ncy4gVGhhdCdzIG9rLCBpdCB3aWxsIGVyciBsYXRlciwKICAgIC8vIGJ1dCB0aGUgYnVmZmVyIHdpbGwgYmUgbGFyZ2UgZW5vdWdoIHRvIHJlYWNoIHRoZSBlcnJvci4KICAgIHZhciBwYWRkaW5nID0gMDsKICAgIHZhciBpbmRleCA9IGVuZDsKICAgIHZhciBuZXdFbmQgPSBlbmQ7CiAgICB3aGlsZSAoaW5kZXggPiBzdGFydCAmJiBwYWRkaW5nIDwgMikgewogICAgICBpbmRleC0tOwogICAgICB2YXIgY2hhciA9IGlucHV0LmNvZGVVbml0QXQoaW5kZXgpOwogICAgICBpZiAoY2hhciA9PSBfcGFkZGluZ0NoYXIpIHsKICAgICAgICBwYWRkaW5nKys7CiAgICAgICAgbmV3RW5kID0gaW5kZXg7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKChjaGFyIHwgMHgyMCkgPT0gX2NoYXJfZCkgewogICAgICAgIGlmIChpbmRleCA9PSBzdGFydCkgYnJlYWs7CiAgICAgICAgaW5kZXgtLTsKICAgICAgICBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChpbmRleCk7CiAgICAgIH0KICAgICAgaWYgKGNoYXIgPT0gX2NoYXJfMykgewogICAgICAgIGlmIChpbmRleCA9PSBzdGFydCkgYnJlYWs7CiAgICAgICAgaW5kZXgtLTsKICAgICAgICBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChpbmRleCk7CiAgICAgIH0KICAgICAgaWYgKGNoYXIgPT0gX2NoYXJfcGVyY2VudCkgewogICAgICAgIHBhZGRpbmcrKzsKICAgICAgICBuZXdFbmQgPSBpbmRleDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBuZXdFbmQ7CiAgfQoKICAvLy8gQ2hlY2sgdGhhdCB0aGUgcmVtYWluZGVyIG9mIHRoZSBzdHJpbmcgaXMgdmFsaWQgcGFkZGluZy4KICAvLy8KICAvLy8gVmFsaWQgcGFkZGluZyBpcyBhIGNvcnJlY3QgbnVtYmVyICgwLCAxIG9yIDIpIG9mIGA9YCBjaGFyYWN0ZXJzCiAgLy8vIG9yIGAlM0RgIHNlcXVlbmNlcyBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBwcmVjZWRpbmcgYmFzZTY0IGNoYXJhY3RlcnMuCiAgLy8vIFRoZSBbc3RhdGVdIHBhcmFtZXRlciBlbmNvZGVzIHdoaWNoIHBhZGRpbmcgY29udGludWF0aW9ucyBhcmUgYWxsb3dlZAogIC8vLyBhcyB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGNoYXJhY3RlcnMuIFRoYXQgbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YKICAvLy8gZXhwZWN0ZWQgcGFkZGluZyBjaGFyYWN0ZXJzIHRpbWVzIDMgbWludXMgdGhlIG51bWJlciBvZiBwYWRkaW5nIGNoYXJhY3RlcnMKICAvLy8gc2VlbiBzbyBmYXIsIHdoZXJlIGA9YCBjb3VudHMgYXMgMyBjb3VudHMgYXMgdGhyZWUgY2hhcmFjdGVycywKICAvLy8gYW5kIHRoZSBwYWRkaW5nIHNlcXVlbmNlIGAlM0RgIGNvdW50cyBhcyBvbmUgY2hhcmFjdGVyIHBlciBjaGFyYWN0ZXIuCiAgLy8vCiAgLy8vIFRoZSBudW1iZXIgb2YgbWlzc2luZyBjaGFyYWN0ZXJzIGlzIGFsd2F5cyBiZXR3ZWVuIDAgYW5kIDUgYmVjYXVzZSB3ZQogIC8vLyBvbmx5IGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBoYXZpbmcgc2VlbiBhdCBsZWFzdCBvbmUgYD1gIG9yIGAlYAogIC8vLyBjaGFyYWN0ZXIuCiAgLy8vIElmIHRoZSBudW1iZXIgb2YgbWlzc2luZyBjaGFyYWN0ZXJzIGlzIG5vdCAzIG9yIDAsIHdlIGhhdmUgc2VlbiAoYXQgbGVhc3QpCiAgLy8vIGEgYCVgIGNoYXJhY3RlciBhbmQgZXhwZWN0cyB0aGUgcmVzdCBvZiB0aGUgYCUzRGAgc2VxdWVuY2UsIGFuZCBhIGA9YCBpcwogIC8vLyBub3QgYWxsb3dlZC4gV2hlbiBtaXNzaW5nIDMgY2hhcmFjdGVycywgZWl0aGVyIGA9YCBvciBgJWAgaXMgYWxsb3dlZC4KICAvLy8KICAvLy8gV2hlbiB0aGUgdmFsdWUgaXMgMCwgbm8gbW9yZSBwYWRkaW5nIChvciBhbnkgb3RoZXIgY2hhcmFjdGVyKSBpcyBhbGxvd2VkLgogIHN0YXRpYyBpbnQgX2NoZWNrUGFkZGluZyhTdHJpbmcgaW5wdXQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IHN0YXRlKSB7CiAgICBhc3NlcnQoX2hhc1NlZW5QYWRkaW5nKHN0YXRlKSk7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gc3RhdGU7CiAgICB2YXIgZXhwZWN0ZWRQYWRkaW5nID0gX3N0YXRlUGFkZGluZyhzdGF0ZSk7CiAgICBhc3NlcnQoZXhwZWN0ZWRQYWRkaW5nID49IDApOwogICAgYXNzZXJ0KGV4cGVjdGVkUGFkZGluZyA8IDYpOwogICAgd2hpbGUgKGV4cGVjdGVkUGFkZGluZyA+IDApIHsKICAgICAgdmFyIGNoYXIgPSBpbnB1dC5jb2RlVW5pdEF0KHN0YXJ0KTsKICAgICAgaWYgKGV4cGVjdGVkUGFkZGluZyA9PSAzKSB7CiAgICAgICAgaWYgKGNoYXIgPT0gX3BhZGRpbmdDaGFyKSB7CiAgICAgICAgICBleHBlY3RlZFBhZGRpbmcgLT0gMzsKICAgICAgICAgIHN0YXJ0Kys7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGNoYXIgPT0gX2NoYXJfcGVyY2VudCkgewogICAgICAgICAgZXhwZWN0ZWRQYWRkaW5nLS07CiAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgYnJlYWs7CiAgICAgICAgICBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChzdGFydCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBQYXJ0aWFsIHBhZGRpbmcgbWVhbnMgd2UgaGF2ZSBzZWVuIHBhcnQgb2YgYSAiJTNEIiBlc2NhcGUuCiAgICAgIHZhciBleHBlY3RlZFBhcnRpYWxQYWRkaW5nID0gZXhwZWN0ZWRQYWRkaW5nOwogICAgICBpZiAoZXhwZWN0ZWRQYXJ0aWFsUGFkZGluZyA+IDMpIGV4cGVjdGVkUGFydGlhbFBhZGRpbmcgLT0gMzsKICAgICAgaWYgKGV4cGVjdGVkUGFydGlhbFBhZGRpbmcgPT0gMikgewogICAgICAgIC8vIEV4cGVjdHMgJzMnCiAgICAgICAgaWYgKGNoYXIgIT0gX2NoYXJfMykgYnJlYWs7CiAgICAgICAgc3RhcnQrKzsKICAgICAgICBleHBlY3RlZFBhZGRpbmctLTsKICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSBicmVhazsKICAgICAgICBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChzdGFydCk7CiAgICAgIH0KICAgICAgLy8gRXhwZWN0cyAnRCcgb3IgJ2QnLgogICAgICBpZiAoKGNoYXIgfCAweDIwKSAhPSBfY2hhcl9kKSBicmVhazsKICAgICAgc3RhcnQrKzsKICAgICAgZXhwZWN0ZWRQYWRkaW5nLS07CiAgICAgIGlmIChzdGFydCA9PSBlbmQpIGJyZWFrOwogICAgfQogICAgaWYgKHN0YXJ0ICE9IGVuZCkgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgcGFkZGluZyBjaGFyYWN0ZXIiLCBpbnB1dCwgc3RhcnQpOwogICAgfQogICAgcmV0dXJuIF9lbmNvZGVQYWRkaW5nU3RhdGUoZXhwZWN0ZWRQYWRkaW5nKTsKICB9Cn0KCmNsYXNzIF9CYXNlNjREZWNvZGVyU2luayBleHRlbmRzIFN0cmluZ0NvbnZlcnNp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aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb252ZXJ0OwoKLy8vIFRoZSBbQnl0ZUNvbnZlcnNpb25TaW5rXSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGNvbnZlcnRlcnMgdG8KLy8vIGVmZmljaWVudGx5IHRyYW5zbWl0IGJ5dGUgZGF0YS4KLy8vCi8vLyBJbnN0ZWFkIG9mIGxpbWl0aW5nIHRoZSBpbnRlcmZhY2UgdG8gb25lIG5vbi1jaHVua2VkIGxpc3Qgb2YgYnl0ZXMgaXQKLy8vIGFjY2VwdHMgaXRzIGlucHV0IGluIGNodW5rcyAodGhlbXNlbHZlcyBiZWluZyBsaXN0cyBvZiBieXRlcykuCi8vLwovLy8gVGhpcyBhYnN0cmFjdCBjbGFzcyB3aWxsIGxpa2VseSBnZXQgbW9yZSBtZXRob2RzIG92ZXIgdGltZS4gSW1wbGVtZW50ZXJzIGFyZQovLy8gdXJnZWQgdG8gZXh0ZW5kIG9yIG1peCBpbiBbQnl0ZUNvbnZlcnNpb25TaW5rQmFzZV0gdG8gZW5zdXJlIHRoYXQgdGhlaXIKLy8vIGNsYXNzIGNvdmVycyB0aGUgbmV3bHkgYWRkZWQgbWV0aG9kcy4KYWJzdHJhY3QgY2xhc3MgQnl0ZUNvbnZlcnNpb25TaW5rIGV4dGVuZHMgQ2h1bmtlZENvbnZlcnNpb25TaW5rPExpc3Q8aW50Pj4gewogIEJ5dGVDb252ZXJzaW9uU2luaygpOwogIGZhY3RvcnkgQnl0ZUNvbnZlcnNpb25TaW5rLndpdGhDYWxsYmFjaygKICAgICAgdm9pZCBjYWxsYmFjayhMaXN0PGludD4gYWNjdW11bGF0ZWQpKSA9IF9CeXRlQ2FsbGJhY2tTaW5rOwogIGZhY3RvcnkgQnl0ZUNvbnZlcnNpb25TaW5rLmZyb20oU2luazxMaXN0PGludD4+IHNpbmspID0gX0J5dGVBZGFwdGVyU2luazsKCiAgLy8vIEFkZHMgdGhlIG5leHQgW2NodW5rXSB0byBgdGhpc2AuCiAgLy8vCiAgLy8vIEFkZHMgdGhlIGJ5dGVzIGRlZmluZWQgYnkgW3N0YXJ0XSBhbmQgW2VuZF0tZXhjbHVzaXZlIHRvIGB0aGlzYC4KICAvLy8KICAvLy8gSWYgW2lzTGFzdF0gaXMgYHRydWVgIGNsb3NlcyBgdGhpc2AuCiAgLy8vCiAgLy8vIENvbnRyYXJ5IHRvIGBhZGRgIHRoZSBnaXZlbiBbY2h1bmtdIG11c3Qgbm90IGJlIGhlbGQgb250by4gT25jZSB0aGUgbWV0aG9kCiAgLy8vIHJldHVybnMsIGl0IGlzIHNhZmUgdG8gb3ZlcndyaXRlIHRoZSBkYXRhIGluIGl0LgogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KTsKCiAgLy8gVE9ETyhmbG9pdHNjaCk6IGFkZCBtb3JlIG1ldGhvZHM6CiAgLy8gLSBpdGVyYXRlQnl0ZXMuCn0KCi8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgYmFzZS1jbGFzcyBmb3IgY29udmVydGVycyB0aGF0IG5lZWQgdG8gYWNjZXB0IGJ5dGUKLy8vIGlucHV0cy4KYWJzdHJhY3QgY2xhc3MgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2luayB7CiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGNodW5rKTsKICB2b2lkIGNsb3NlKCk7CgogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBhZGQoY2h1bmsuc3VibGlzdChzdGFydCwgZW5kKSk7CiAgICBpZiAoaXNMYXN0KSBjbG9zZSgpOwogIH0KfQoKLy8vIFRoaXMgY2xhc3MgYWRhcHRzIGEgc2ltcGxlIFtTaW5rXSB0byBhIFtCeXRlQ29udmVyc2lvblNpbmtdLgovLy8KLy8vIEFsbCBhZGRpdGlvbmFsIG1ldGhvZHMgb2YgdGhlIFtCeXRlQ29udmVyc2lvblNpbmtdIChjb21wYXJlZCB0byB0aGUKLy8vIENodW5rZWRDb252ZXJzaW9uU2luaykgYXJlIHJlZGlyZWN0ZWQgdG8gdGhlIGBhZGRgIG1ldGhvZC4KY2xhc3MgX0J5dGVBZGFwdGVyU2luayBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2lua0Jhc2UgewogIGZpbmFsIFNpbms8TGlzdDxpbnQ+PiBfc2luazsKCiAgX0J5dGVBZGFwdGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGNodW5rKSB7CiAgICBfc2luay5hZGQoY2h1bmspOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQp9CgovLy8gVGhpcyBjbGFzcyBhY2N1bXVsYXRlcyBhbGwgY2h1bmtzIGludG8gb25lIGxpc3Qgb2YgYnl0ZXMKLy8vIGFuZCBpbnZva2VzIGEgY2FsbGJhY2sgd2hlbiB0aGUgc2luayBpcyBjbG9zZWQuCi8vLwovLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byB0ZXJtaW5hdGUgYSBjaHVua2VkIGNvbnZlcnNpb24uCmNsYXNzIF9CeXRlQ2FsbGJhY2tTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgc3RhdGljIGNvbnN0IF9JTklUSUFMX0JVRkZFUl9TSVpFID0gMTAyNDsKCiAgZmluYWwgdm9pZCBGdW5jdGlvbihMaXN0PGludD4pIF9jYWxsYmFjazsKICBMaXN0PGludD4gX2J1ZmZlciA9IFVpbnQ4TGlzdChfSU5JVElBTF9CVUZGRVJfU0laRSk7CiAgaW50IF9idWZmZXJJbmRleCA9IDA7CgogIF9CeXRlQ2FsbGJhY2tTaW5rKHZvaWQgY2FsbGJhY2soTGlzdDxpbnQ+IGFjY3VtdWxhdGVkKSkKICAgICAgOiBfY2FsbGJhY2sgPSBjYWxsYmFjazsKCiAgdm9pZCBhZGQoSXRlcmFibGU8aW50PiBjaHVuaykgewogICAgdmFyIGZyZWVDb3VudCA9IF9idWZmZXIubGVuZ3RoIC0gX2J1ZmZlckluZGV4OwogICAgaWYgKGNodW5rLmxlbmd0aCA+IGZyZWVDb3VudCkgewogICAgICAvLyBHcm93IHRoZSBidWZmZXIuCiAgICAgIHZhciBvbGRMZW5ndGggPSBfYnVmZmVyLmxlbmd0aDsKICAgICAgdmFyIG5ld0xlbmd0aCA9IF9yb3VuZFRvUG93ZXJPZjIoY2h1bmsubGVuZ3RoICsgb2xkTGVuZ3RoKSAqIDI7CiAgICAgIHZhciBncm93biA9IFVpbnQ4TGlzdChuZXdMZW5ndGgpOwogICAgICBncm93bi5zZXRSYW5nZSgwLCBfYnVmZmVyLmxlbmd0aCwgX2J1ZmZlcik7CiAgICAgIF9idWZmZXIgPSBncm93bjsKICAgIH0KICAgIF9idWZmZXIuc2V0UmFuZ2UoX2J1ZmZlckluZGV4LCBfYnVmZmVySW5kZXggKyBjaHVuay5sZW5ndGgsIGNodW5rKTsKICAgIF9idWZmZXJJbmRleCArPSBjaHVuay5sZW5ndGg7CiAgfQoKICBzdGF0aWMgaW50IF9yb3VuZFRvUG93ZXJPZjIoaW50IHYpIHsKICAgIGFzc2VydCh2ID4gMCk7CiAgICB2LS07CiAgICB2IHw9IHYgPj4gMTsKICAgIHYgfD0gdiA+PiAyOwogICAgdiB8PSB2ID4+IDQ7CiAgICB2IHw9IHYgPj4gODsKICAgIHYgfD0gdiA+PiAxNjsKICAgIHYrKzsKICAgIHJldHVybiB2OwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9jYWxsYmFjayhfYnVmZmVyLnN1Ymxpc3QoMCwgX2J1ZmZlckluZGV4KSk7CiAgfQp9Cm8ATk48ARYBRSQESkMEUUwqTRgrQUwBJwZHBisGUTdDAScVAgFNDEMdEAFEJBkEAgFBBEg/OB8BIAEeFgQBERMEAgE9NAQ+OSwBLDcYAToeASIzJBomRigyFwZIIgQBJxMJERERERIJDgQBETEEAgEhZGFydDpjb252ZXJ0L2J5dGVfY29udmVyc2lvbi5kYXJ0O29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb252ZXJ0L2NodW5rZWRfY29udmVyc2lvbi5kYXJ0im8vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbnZlcnQ7CgovLy8gQSBbQ2h1bmtlZENvbnZlcnNpb25TaW5rXSBpcyB1c2VkIHRvIHRyYW5zbWl0IGRhdGEgbW9yZSBlZmZpY2llbnRseSBiZXR3ZWVuCi8vLyB0d28gY29udmVydGVycyBkdXJpbmcgY2h1bmtlZCBjb252ZXJzaW9ucy4KLy8vCi8vLyBUaGUgYmFzaWMgYENodW5rZWRDb252ZXJzaW9uU2lua2AgaXMganVzdCBhIFtTaW5rXSwgYW5kIGNvbnZlcnRlcnMgc2hvdWxkCi8vLyB3b3JrIHdpdGggYSBwbGFpbiBgU2lua2AsIGJ1dCBtYXkgd29yayBtb3JlIGVmZmljaWVudGx5IHdpdGggY2VydGFpbgovLy8gc3BlY2lhbGl6ZWQgdHlwZXMgb2YgYENodW5rZWRDb252ZXJzaW9uU2lua2AuCi8vLwovLy8gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YgYENodW5rZWRDb252ZXJzaW9uU2lua2AgZXh0ZW5kCi8vLyB0aGlzIGNsYXNzLCB0byBpbmhlcml0IGFueSBmdXJ0aGVyIG1ldGhvZHMgdGhhdCBtYXkgYmUgYWRkZWQgdG8gdGhlIGNsYXNzLgphYnN0cmFjdCBjbGFzcyBDaHVua2VkQ29udmVyc2lvblNpbms8VD4gaW1wbGVtZW50cyBTaW5rPFQ+IHsKICBDaHVua2VkQ29udmVyc2lvblNpbmsoKTsKICBmYWN0b3J5IENodW5rZWRDb252ZXJzaW9uU2luay53aXRoQ2FsbGJhY2soCiAgICAgIHZvaWQgY2FsbGJhY2soTGlzdDxUPiBhY2N1bXVsYXRlZCkpID0gX1NpbXBsZUNhbGxiYWNrU2luazxUPjsKCiAgLy8vIEFkZHMgY2h1bmtlZCBkYXRhIHRvIHRoaXMgc2luay4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgaXMgYWxzbyB1c2VkIHdoZW4gY29udmVydGVycyBhcmUgdXNlZCBhcyBbU3RyZWFtVHJhbnNmb3JtZXJdcy4KICB2b2lkIGFkZChUIGNodW5rKTsKCiAgLy8vIENsb3NlcyB0aGUgc2luay4KICAvLy8KICAvLy8gVGhpcyBzaWduYWxzIHRoZSBlbmQgb2YgdGhlIGNodW5rZWQgY29udmVyc2lvbi4gVGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgLy8vIHdoZW4gY29udmVydGVycyBhcmUgdXNlZCBhcyBbU3RyZWFtVHJhbnNmb3JtZXJdJ3MuCiAgdm9pZCBjbG9zZSgpOwp9CgovLy8gVGhpcyBjbGFzcyBhY2N1bXVsYXRlcyBhbGwgY2h1bmtzIGFuZCBpbnZva2VzIGEgY2FsbGJhY2sgd2l0aCBhIGxpc3Qgb2YKLy8vIHRoZSBjaHVua3Mgd2hlbiB0aGUgc2luayBpcyBjbG9zZWQuCi8vLwovLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byB0ZXJtaW5hdGUgYSBjaHVua2VkIGNvbnZlcnNpb24uCmNsYXNzIF9TaW1wbGVDYWxsYmFja1Npbms8VD4gZXh0ZW5kcyBDaHVua2VkQ29udmVyc2lvblNpbms8VD4gewogIGZpbmFsIHZvaWQgRnVuY3Rpb24oTGlzdDxUPikgX2NhbGxiYWNrOwogIGZpbmFsIExpc3Q8VD4gX2FjY3VtdWxhdGVkID0gPFQ+W107CgogIF9TaW1wbGVDYWxsYmFja1NpbmsodGhpcy5fY2FsbGJhY2spOwoKICB2b2lkIGFkZChUIGNodW5rKSB7CiAgICBfYWNjdW11bGF0ZWQuYWRkKGNodW5rKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfY2FsbGJhY2soX2FjY3VtdWxhdGVkKTsKICB9Cn0KCi8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGxvZ2ljIGZvciBhIGNodW5rZWQgY29udmVyc2lvbiBhcyBhCi8vLyBzdHJlYW0gdHJhbnNmb3JtZXIuCi8vLwovLy8gSXQgaXMgdXNlZCBhcyBzdHJhdGVneSBpbiB0aGUgW0V2ZW50VHJhbnNmb3JtU3RyZWFtXS4KLy8vCi8vLyBJdCBhbHNvIGltcGxlbWVudHMgdGhlIFtDaHVua2VkQ29udmVyc2lvblNpbmtdIGludGVyZmFjZSBzbyB0aGF0IGl0Ci8vLyBjYW4gYmUgdXNlZCBhcyBvdXRwdXQgc2luayBpbiBhIGNodW5rZWQgY29udmVyc2lvbi4KY2xhc3MgX0NvbnZlcnRlclN0cmVhbUV2ZW50U2luazxTLCBUPiBpbXBsZW1lbnRzIEV2ZW50U2luazxTPiB7CiAgLy8vIFRoZSBvdXRwdXQgc2luayBmb3IgdGhlIGNvbnZlcnRlci4KICBmaW5hbCBFdmVudFNpbms8VD4gX2V2ZW50U2luazsKCiAgLy8vIFRoZSBpbnB1dCBzaW5rIGZvciBuZXcgZGF0YS4gQWxsIGRhdGEgdGhhdCBpcyByZWNlaXZlZCB3aXRoCiAgLy8vIFtoYW5kbGVEYXRhXSBpcyBhZGRlZCBpbnRvIHRoaXMgc2luay4KICBmaW5hbCBTaW5rPFM+IF9jaHVua2VkU2luazsKCiAgX0NvbnZlcnRlclN0cmVhbUV2ZW50U2luayhDb252ZXJ0ZXI8UywgVD4gY29udmVydGVyLCBFdmVudFNpbms8VD4gc2luaykKICAgICAgOiBfZXZlbnRTaW5rID0gc2luaywKICAgICAgICBfY2h1bmtlZFNpbmsgPSBjb252ZXJ0ZXIuc3RhcnRDaHVua2VkQ29udmVyc2lvbihzaW5rKTsKCiAgdm9pZCBhZGQoUyBvKSB7CiAgICBfY2h1bmtlZFNpbmsuYWRkKG8pOwogIH0KCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBfZXZlbnRTaW5rLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfY2h1bmtlZFNpbmsuY2xvc2UoKTsKICB9Cn0KVABOTjwBFgFQLwROSTIETU89Gy5EASYGURUBFwZMORACAUwoBD5AKiYBJwEWHQQBER0EAgFCGAQ6BEg4QCkhAUIsHgFKGz8BEhkEATksBAERGgQCASRkYXJ0OmNvbnZlcnQvY2h1bmtlZF9jb252ZXJzaW9uLmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbnZlcnQvY29kZWMuZGFydIyKLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb252ZXJ0OwoKLy8vIEEgW0NvZGVjXSBlbmNvZGVzIGFuZCAoaWYgc3VwcG9ydGVkKSBkZWNvZGVzIGRhdGEuCi8vLwovLy8gQ29kZWNzIGNhbiBiZSBmdXNlZC4gRm9yIGV4YW1wbGUgZnVzaW5nIFtqc29uXSBhbmQgW3V0ZjhdIHByb2R1Y2VzCi8vLyBhbiBlbmNvZGVyIHRoYXQgY2FuIGNvbnZlcnQgSnNvbiBvYmplY3RzIGRpcmVjdGx5IHRvIGJ5dGVzLCBvciBjYW4gZGVjb2RlCi8vLyBieXRlcyBkaXJlY3RseSB0byBqc29uIG9iamVjdHMuCi8vLwovLy8gRnVzZWQgY29kZWNzIGdlbmVyYWxseSBhdHRlbXB0IHRvIG9wdGltaXplIHRoZSBvcGVyYXRpb25zIGFuZCBjYW4gYmUgZmFzdGVyCi8vLyB0aGFuIGV4ZWN1dGluZyBlYWNoIHN0ZXAgb2YgYW4gZW5jb2Rpbmcgc2VwYXJhdGVseS4KYWJzdHJhY3QgY2xhc3MgQ29kZWM8UywgVD4gewogIGNvbnN0IENvZGVjKCk7CgogIC8vLyBFbmNvZGVzIFtpbnB1dF0uCiAgLy8vCiAgLy8vIFRoZSBpbnB1dCBpcyBlbmNvZGVkIGFzIGlmIGJ5IGBlbmNvZGVyLmNvbnZlcnRgLgogIFQgZW5jb2RlKFMgaW5wdXQpID0+IGVuY29kZXIuY29udmVydChpbnB1dCk7CgogIC8vLyBEZWNvZGVzIFtlbmNvZGVkXSBkYXRhLgogIC8vLwogIC8vLyBUaGUgaW5wdXQgaXMgZGVjb2RlZCBhcyBpZiBieSBgZGVjb2Rlci5jb252ZXJ0YC4KICBTIGRlY29kZShUIGVuY29kZWQpID0+IGRlY29kZXIuY29udmVydChlbmNvZGVkKTsKCiAgLy8vIFJldHVybnMgdGhlIGVuY29kZXIgZnJvbSBbU10gdG8gW1RdLgogIC8vLwogIC8vLyBJdCBtYXkgYmUgc3RhdGVmdWwgYW5kIHNob3VsZCBub3QgYmUgcmV1c2VkLgogIENvbnZlcnRlcjxTLCBUPiBnZXQgZW5jb2RlcjsKCiAgLy8vIFJldHVybnMgdGhlIGRlY29kZXIgb2YgYHRoaXNgLCBjb252ZXJ0aW5nIGZyb20gW1RdIHRvIFtTXS4KICAvLy8KICAvLy8gSXQgbWF5IGJlIHN0YXRlZnVsIGFuZCBzaG91bGQgbm90IGJlIHJldXNlZC4KICBDb252ZXJ0ZXI8VCwgUz4gZ2V0IGRlY29kZXI7CgogIC8vLyBGdXNlcyBgdGhpc2Agd2l0aCBgb3RoZXJgLgogIC8vLwogIC8vLyBXaGVuIGVuY29kaW5nLCB0aGUgcmVzdWx0aW5nIGNvZGVjIGVuY29kZXMgd2l0aCBgdGhpc2AgYmVmb3JlCiAgLy8vIGVuY29kaW5nIHdpdGggW290aGVyXS4KICAvLy8KICAvLy8gV2hlbiBkZWNvZGluZywgdGhlIHJlc3VsdGluZyBjb2RlYyBkZWNvZGVzIHdpdGggW290aGVyXSBiZWZvcmUgZGVjb2RpbmcKICAvLy8gd2l0aCBgdGhpc2AuCiAgLy8vCiAgLy8vIEluIHNvbWUgY2FzZXMgb25lIG5lZWRzIHRvIHVzZSB0aGUgW2ludmVydGVkXSBjb2RlY3MgdG8gYmUgYWJsZSB0byBmdXNlCiAgLy8vIHRoZW0gY29ycmVjdGx5LiBUaGF0IGlzLCB0aGUgb3V0cHV0IHR5cGUgb2YgYHRoaXNgIChbVF0pIG11c3QgbWF0Y2ggdGhlCiAgLy8vIGlucHV0IHR5cGUgb2YgdGhlIHNlY29uZCBjb2RlYyBbb3RoZXJdLgogIC8vLwogIC8vLyBFeGFtcGxlczoKICAvLy8gYGBgZGFydAogIC8vLyBmaW5hbCBqc29uVG9CeXRlcyA9IGpzb24uZnVzZSh1dGY4KTsKICAvLy8gTGlzdDxpbnQ+IGJ5dGVzID0ganNvblRvQnl0ZXMuZW5jb2RlKFsianNvbi1vYmplY3QiXSk7CiAgLy8vIHZhciBkZWNvZGVkID0ganNvblRvQnl0ZXMuZGVjb2RlKGJ5dGVzKTsKICAvLy8gYXNzZXJ0KGRlY29kZWQgaXMgTGlzdCAmJiBkZWNvZGVkWzBdID09ICJqc29uLW9iamVjdCIpOwogIC8vLwogIC8vLyB2YXIgaW52ZXJ0ZWQgPSBqc29uLmludmVydGVkOwogIC8vLyB2YXIganNvbklkZW50aXR5ID0ganNvbi5mdXNlKGludmVydGVkKTsKICAvLy8gdmFyIGpzb25PYmplY3QgPSBqc29uSWRlbnRpdHkuZW5jb2RlKFsiMSIsIDJdKTsKICAvLy8gYXNzZXJ0KGpzb25PYmplY3QgaXMgTGlzdCAmJiBqc29uT2JqZWN0WzBdID09ICIxIiAmJiBqc29uT2JqZWN0WzFdID09IDIpOwogIC8vLyBgYGAKICAvLyBUT0RPKGZsb2l0c2NoKTogdXNlIGJldHRlciBleGFtcGxlIHdpdGggbGluZS1zcGxpdHRlciBvbmNlIHRoYXQgb25lIGlzCiAgLy8gaW4gdGhpcyBsaWJyYXJ5LgogIENvZGVjPFMsIFI+IGZ1c2U8Uj4oQ29kZWM8VCwgUj4gb3RoZXIpIHsKICAgIHJldHVybiBfRnVzZWRDb2RlYzxTLCBULCBSPih0aGlzLCBvdGhlcik7CiAgfQoKICAvLy8gSW52ZXJ0cyBgdGhpc2AuCiAgLy8vCiAgLy8vIFRoZSBbZW5jb2Rlcl0gYW5kIFtkZWNvZGVyXSBvZiB0aGUgcmVzdWx0aW5nIGNvZGVjIGFyZSBzd2FwcGVkLgogIENvZGVjPFQsIFM+IGdldCBpbnZlcnRlZCA9PiBfSW52ZXJ0ZWRDb2RlYzxULCBTPih0aGlzKTsKfQoKLy8vIEZ1c2VzIHRoZSBnaXZlbiBjb2RlY3MuCi8vLwovLy8gSW4gdGhlIG5vbi1jaHVua2VkIGNvbnZlcnNpb24gc2ltcGx5IGludm9rZXMgdGhlIG5vbi1jaHVua2VkIGNvbnZlcnNpb25zIGluCi8vLyBzZXF1ZW5jZS4KY2xhc3MgX0Z1c2VkQ29kZWM8UywgTSwgVD4gZXh0ZW5kcyBDb2RlYzxTLCBUPiB7CiAgZmluYWwgQ29kZWM8UywgTT4gX2ZpcnN0OwogIGZpbmFsIENvZGVjPE0sIFQ+IF9zZWNvbmQ7CgogIENvbnZlcnRlcjxTLCBUPiBnZXQgZW5jb2RlciA9PiBfZmlyc3QuZW5jb2Rlci5mdXNlPFQ+KF9zZWNvbmQuZW5jb2Rlcik7CiAgQ29udmVydGVyPFQsIFM+IGdldCBkZWNvZGVyID0+IF9zZWNvbmQuZGVjb2Rlci5mdXNlPFM+KF9maXJzdC5kZWNvZGVyKTsKCiAgX0Z1c2VkQ29kZWModGhpcy5fZmlyc3QsIHRoaXMuX3NlY29uZCk7Cn0KCmNsYXNzIF9JbnZlcnRlZENvZGVjPFQsIFM+IGV4dGVuZHMgQ29kZWM8VCwgUz4gewogIGZpbmFsIENvZGVjPFMsIFQ+IF9jb2RlYzsKCiAgX0ludmVydGVkQ29kZWMoQ29kZWM8UywgVD4gY29kZWMpIDogX2NvZGVjID0gY29kZWM7CgogIENvbnZlcnRlcjxULCBTPiBnZXQgZW5jb2RlciA9PiBfY29kZWMuZGVjb2RlcjsKICBDb252ZXJ0ZXI8UywgVD4gZ2V0IGRlY29kZXIgPT4gX2NvZGVjLmVuY29kZXI7CgogIENvZGVjPFMsIFQ+IGdldCBpbnZlcnRlZCA9PiBfY29kZWM7Cn0KYwBOTjwBFgE3BEdOJARQOB0RARcGNy8BHgY3MwErBjMfAUEGMx8BIQZEHQZOEwZOTi4GEA4rPS8+BiQuNlAKTBYrLgQBFgZGOgIBHARQDjEcHQFKSgEqAgExHAE2ATExASYCARdkYXJ0OmNvbnZlcnQvY29kZWMuZGFydDJvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29udmVydC9jb252ZXJ0ZXIuZGFydIqVLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb252ZXJ0OwoKLy8vIEEgW0NvbnZlcnRlcl0gY29udmVydHMgZGF0YSBmcm9tIG9uZSByZXByZXNlbnRhdGlvbiBpbnRvIGFub3RoZXIuCi8vLwovLy8gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YgYENvbnZlcnRlcmAgZXh0ZW5kIHRoaXMgY2xhc3MsCi8vLyB0byBpbmhlcml0IGFueSBmdXJ0aGVyIG1ldGhvZHMgdGhhdCBtYXkgYmUgYWRkZWQgdG8gdGhlIGNsYXNzLgphYnN0cmFjdCBjbGFzcyBDb252ZXJ0ZXI8UywgVD4gZXh0ZW5kcyBTdHJlYW1UcmFuc2Zvcm1lckJhc2U8UywgVD4gewogIGNvbnN0IENvbnZlcnRlcigpOwoKICAvLy8gQWRhcHRzIFtzb3VyY2VdIHRvIGJlIGEgYENvbnZlcnRlcjxUUywgVFQ+YC4KICAvLy8KICAvLy8gVGhpcyBhbGxvd3MgW3NvdXJjZV0gdG8gYmUgdXNlZCBhdCB0aGUgbmV3IHR5cGUsIGJ1dCBhdCBydW4tdGltZSBpdAogIC8vLyBtdXN0IHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvZiBib3RoIHRoZSBuZXcgdHlwZSBhbmQgaXRzIG9yaWdpbmFsIHR5cGUuCiAgLy8vCiAgLy8vIENvbnZlcnNpb24gaW5wdXQgbXVzdCBiZSBib3RoIFtTU10gYW5kIFtUU10gYW5kIHRoZSBvdXRwdXQgY3JlYXRlZCBieQogIC8vLyBbc291cmNlXSBmb3IgdGhvc2UgaW5wdXQgbXVzdCBiZSBib3RoIFtTVF0gYW5kIFtUVF0uCiAgc3RhdGljIENvbnZlcnRlcjxUUywgVFQ+IGNhc3RGcm9tPFNTLCBTVCwgVFMsIFRUPihDb252ZXJ0ZXI8U1MsIFNUPiBzb3VyY2UpID0+CiAgICAgIENhc3RDb252ZXJ0ZXI8U1MsIFNULCBUUywgVFQ+KHNvdXJjZSk7CgogIC8vLyBDb252ZXJ0cyBbaW5wdXRdIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24uCiAgVCBjb252ZXJ0KFMgaW5wdXQpOwoKICAvLy8gRnVzZXMgYHRoaXNgIHdpdGggW290aGVyXS4KICAvLy8KICAvLy8gRW5jb2Rpbmcgd2l0aCB0aGUgcmVzdWx0aW5nIGNvbnZlcnRlciBpcyBlcXVpdmFsZW50IHRvIGNvbnZlcnRpbmcgd2l0aAogIC8vLyBgdGhpc2AgYmVmb3JlIGNvbnZlcnRpbmcgd2l0aCBgb3RoZXJgLgogIENvbnZlcnRlcjxTLCBUVD4gZnVzZTxUVD4oQ29udmVydGVyPFQsIFRUPiBvdGhlcikgewogICAgcmV0dXJuIF9GdXNlZENvbnZlcnRlcjxTLCBULCBUVD4odGhpcywgb3RoZXIpOwogIH0KCiAgLy8vIFN0YXJ0cyBhIGNodW5rZWQgY29udmVyc2lvbi4KICAvLy8KICAvLy8gVGhlIHJldHVybmVkIHNpbmsgc2VydmVzIGFzIGlucHV0IGZvciB0aGUgbG9uZy1ydW5uaW5nIGNvbnZlcnNpb24uIFRoZQogIC8vLyBnaXZlbiBbc2lua10gc2VydmVzIGFzIG91dHB1dC4KICBTaW5rPFM+IHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxUPiBzaW5rKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJUaGlzIGNvbnZlcnRlciBkb2VzIG5vdCBzdXBwb3J0IGNodW5rZWQgY29udmVyc2lvbnM6ICR0aGlzIik7CiAgfQoKICBTdHJlYW08VD4gYmluZChTdHJlYW08Uz4gc3RyZWFtKSB7CiAgICByZXR1cm4gU3RyZWFtPFQ+LmV2ZW50VHJhbnNmb3JtZWQoCiAgICAgICAgc3RyZWFtLCAoRXZlbnRTaW5rIHNpbmspID0+IF9Db252ZXJ0ZXJTdHJlYW1FdmVudFNpbmsodGhpcywgc2luaykpOwogIH0KCiAgLy8vIFByb3ZpZGVzIGEgYENvbnZlcnRlcjxSUywgUlQ+YCB2aWV3IG9mIHRoaXMgc3RyZWFtIHRyYW5zZm9ybWVyLgogIC8vLwogIC8vLyBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVyIHdpbGwgY2hlY2sgYXQgcnVuLXRpbWUgdGhhdCBhbGwgY29udmVyc2lvbgogIC8vLyBpbnB1dHMgYXJlIGFjdHVhbGx5IGluc3RhbmNlcyBvZiBbU10sCiAgLy8vIGFuZCBpdCB3aWxsIGNoZWNrIHRoYXQgYWxsIGNvbnZlcnNpb24gb3V0cHV0IHByb2R1Y2VkIGJ5IHRoaXMgY29udmVydGVyCiAgLy8vIGFyZSBhY3R1YWxseSBpbnN0YW5jZXMgb2YgW1JUXS4KICBDb252ZXJ0ZXI8UlMsIFJUPiBjYXN0PFJTLCBSVD4oKSA9PiBDb252ZXJ0ZXIuY2FzdEZyb208UywgVCwgUlMsIFJUPih0aGlzKTsKfQoKLy8vIEZ1c2VzIHR3byBjb252ZXJ0ZXJzLgovLy8KLy8vIEZvciBhIG5vbi1jaHVua2VkIGNvbnZlcnNpb24gY29udmVydHMgdGhlIGlucHV0IGluIHNlcXVlbmNlLgpjbGFzcyBfRnVzZWRDb252ZXJ0ZXI8UywgTSwgVD4gZXh0ZW5kcyBDb252ZXJ0ZXI8UywgVD4gewogIGZpbmFsIENvbnZlcnRlcjxTLCBNPiBfZmlyc3Q7CiAgZmluYWwgQ29udmVydGVyPE0sIFQ+IF9zZWNvbmQ7CgogIF9GdXNlZENvbnZlcnRlcih0aGlzLl9maXJzdCwgdGhpcy5fc2Vjb25kKTsKCiAgVCBjb252ZXJ0KFMgaW5wdXQpID0+IF9zZWNvbmQuY29udmVydChfZmlyc3QuY29udmVydChpbnB1dCkpOwoKICBTaW5rPFM+IHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxUPiBzaW5rKSB7CiAgICByZXR1cm4gX2ZpcnN0LnN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oX3NlY29uZC5zdGFydENodW5rZWRDb252ZXJzaW9uKHNpbmspKTsKICB9Cn0KSgBOTjwBFgFGBE1DRRUBMwZKUAZMO1EtAUEWASEGTS02MwQBIwZNJTEcRwQBJSdMBAFGBkssTiZOAgEaBEE5ICEBLgFAATFQBAIBG2RhcnQ6Y29udmVydC9jb252ZXJ0ZXIuZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29udmVydC9lbmNvZGluZy5kYXJ0ifkvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbnZlcnQ7CgovLy8gT3Blbi1lbmRlZCBFbmNvZGluZyBlbnVtLgphYnN0cmFjdCBjbGFzcyBFbmNvZGluZyBleHRlbmRzIENvZGVjPFN0cmluZywgTGlzdDxpbnQ+PiB7CiAgY29uc3QgRW5jb2RpbmcoKTsKCiAgLy8vIFJldHVybnMgdGhlIGVuY29kZXIgZnJvbSBgU3RyaW5nYCB0byBgTGlzdDxpbnQ+YC4KICAvLy8KICAvLy8gSXQgbWF5IGJlIHN0YXRlZnVsIGFuZCBzaG91bGQgbm90IGJlIHJldXNlZC4KICBDb252ZXJ0ZXI8U3RyaW5nLCBMaXN0PGludD4+IGdldCBlbmNvZGVyOwoKICAvLy8gUmV0dXJucyB0aGUgZGVjb2RlciBvZiBgdGhpc2AsIGNvbnZlcnRpbmcgZnJvbSBgTGlzdDxpbnQ+YCB0byBgU3RyaW5nYC4KICAvLy8KICAvLy8gSXQgbWF5IGJlIHN0YXRlZnVsIGFuZCBzaG91bGQgbm90IGJlIHJldXNlZC4KICBDb252ZXJ0ZXI8TGlzdDxpbnQ+LCBTdHJpbmc+IGdldCBkZWNvZGVyOwoKICBGdXR1cmU8U3RyaW5nPiBkZWNvZGVTdHJlYW0oU3RyZWFtPExpc3Q8aW50Pj4gYnl0ZVN0cmVhbSkgewogICAgcmV0dXJuIGRlY29kZXIKICAgICAgICAuYmluZChieXRlU3RyZWFtKQogICAgICAgIC5mb2xkKFN0cmluZ0J1ZmZlcigpLAogICAgICAgICAgICAoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHN0cmluZykgPT4gYnVmZmVyLi53cml0ZShzdHJpbmcpKQogICAgICAgIC50aGVuKChTdHJpbmdCdWZmZXIgYnVmZmVyKSA9PiBidWZmZXIudG9TdHJpbmcoKSk7CiAgfQoKICAvLy8gTmFtZSBvZiB0aGUgZW5jb2RpbmcuCiAgLy8vCiAgLy8vIElmIHRoZSBlbmNvZGluZyBpcyBzdGFuZGFyZGl6ZWQsIHRoaXMgaXMgdGhlIGxvd2VyLWNhc2UgdmVyc2lvbiBvZiBvbmUgb2YKICAvLy8gdGhlIElBTkEgb2ZmaWNpYWwgbmFtZXMgZm9yIHRoZSBjaGFyYWN0ZXIgc2V0IChzZWUKICAvLy8gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9jaGFyYWN0ZXItc2V0cy9jaGFyYWN0ZXItc2V0cy54bWwpCiAgU3RyaW5nIGdldCBuYW1lOwoKICAvLyBBbGwgYWxpYXNlcyAoaW4gbG93ZXJjYXNlKSBvZiBzdXBwb3J0ZWQgZW5jb2RpbmcgZnJvbQogIC8vIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvY2hhcmFjdGVyLXNldHMvY2hhcmFjdGVyLXNldHMueG1sLgogIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBFbmNvZGluZz4gX25hbWVUb0VuY29kaW5nID0gPFN0cmluZywgRW5jb2Rpbmc+ewogICAgLy8gSVNPXzg4NTktMToxOTg3LgogICAgImlzb184ODU5LTE6MTk4NyI6IGxhdGluMSwKICAgICJpc28taXItMTAwIjogbGF0aW4xLAogICAgImlzb184ODU5LTEiOiBsYXRpbjEsCiAgICAiaXNvLTg4NTktMSI6IGxhdGluMSwKICAgICJsYXRpbjEiOiBsYXRpbjEsCiAgICAibDEiOiBsYXRpbjEsCiAgICAiaWJtODE5IjogbGF0aW4xLAogICAgImNwODE5IjogbGF0aW4xLAogICAgImNzaXNvbGF0aW4xIjogbGF0aW4xLAoKICAgIC8vIFVTLUFTQ0lJLgogICAgImlzby1pci02IjogYXNjaWksCiAgICAiYW5zaV94My40LTE5NjgiOiBhc2NpaSwKICAgICJhbnNpX3gzLjQtMTk4NiI6IGFzY2lpLAogICAgImlzb182NDYuaXJ2OjE5OTEiOiBhc2NpaSwKICAgICJpc282NDYtdXMiOiBhc2NpaSwKICAgICJ1cy1hc2NpaSI6IGFzY2lpLAogICAgInVzIjogYXNjaWksCiAgICAiaWJtMzY3IjogYXNjaWksCiAgICAiY3AzNjciOiBhc2NpaSwKICAgICJjc2FzY2lpIjogYXNjaWksCiAgICAiYXNjaWkiOiBhc2NpaSwgLy8gVGhpcyBpcyBub3QgaW4gdGhlIElBTkEgb2ZmaWNpYWwgbmFtZXMuCgogICAgLy8gVVRGLTguCiAgICAiY3N1dGY4IjogdXRmOCwKICAgICJ1dGYtOCI6IHV0ZjgKICB9OwoKICAvLy8gR2V0cyBhbiBbRW5jb2RpbmddIG9iamVjdCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgc2V0CiAgLy8vIG5hbWUuIFRoZSBuYW1lcyB1c2VkIGFyZSB0aGUgSUFOQSBvZmZpY2lhbCBuYW1lcyBmb3IgdGhlCiAgLy8vIGNoYXJhY3RlciBzZXQgKHNlZQogIC8vLyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzL2NoYXJhY3Rlci1zZXRzLnhtbCkuCiAgLy8vCiAgLy8vIFRoZSBbbmFtZV0gcGFzc2VkIGlzIGNhc2UgaW5zZW5zaXRpdmUuCiAgLy8vCiAgLy8vIElmIGNoYXJhY3RlciBzZXQgaXMgbm90IHN1cHBvcnRlZCBbOm51bGw6XSBpcyByZXR1cm5lZC4KICBzdGF0aWMgRW5jb2RpbmcgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CiAgICBpZiAobmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICByZXR1cm4gX25hbWVUb0VuY29kaW5nW25hbWVdOwogIH0KfQpTAE5OPAEWAR47FAE4BjMsAU4GMywBPhMaHks7BAEcBlA5SRMBO0hLGB8aGhoWEhYVGwERFx0dHxgXERUUFj8BDhQSBQFDPxlKBi0GPisjHyIEAgEaZGFydDpjb252ZXJ0L2VuY29kaW5nLmRhcnQ0b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbnZlcnQvaHRtbF9lc2NhcGUuZGFydJ/HLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb252ZXJ0OwoKLy8vIEEgYFN0cmluZ2AgY29udmVydGVyIHRoYXQgY29udmVydHMgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLgovLy8KLy8vIFRoaXMgaXMgaW50ZW5kZWQgdG8gc2FuaXRpemUgdGV4dCBiZWZvcmUgaW5zZXJ0aW5nIHRoZSB0ZXh0IGludG8gYW4gSFRNTAovLy8gZG9jdW1lbnQuIENoYXJhY3RlcnMgdGhhdCBhcmUgbWVhbmluZ2Z1bCBpbiBIVE1MIGFyZSBjb252ZXJ0ZWQgdG8KLy8vIEhUTUwgZW50aXRpZXMgKGxpa2UgYCZhbXA7YCBmb3IgYCZgKS4KLy8vCi8vLyBUaGUgZ2VuZXJhbCBjb252ZXJ0ZXIgZXNjYXBlcyBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBtZWFuaW5nZnVsIGluIEhUTUwKLy8vIGF0dHJpYnV0ZXMgb3Igbm9ybWFsIGVsZW1lbnQgY29udGV4dC4gRWxlbWVudHMgd2l0aCBzcGVjaWFsIGNvbnRlbnQgdHlwZXMKLy8vIChsaWtlIENTUyBvciBKYXZhU2NyaXB0KSBtYXkgbmVlZCBhIG1vcmUgc3BlY2lhbGl6ZWQgZXNjYXBpbmcgdGhhdAovLy8gdW5kZXJzdGFuZHMgdGhhdCBjb250ZW50IHR5cGUuCi8vLwovLy8gSWYgdGhlIGNvbnRleHQgd2hlcmUgdGhlIHRleHQgd2lsbCBiZSBpbnNlcnRlZCBpcyBrbm93biBpbiBtb3JlIGRldGFpbCwKLy8vIGl0J3MgcG9zc2libGUgdG8gb21pdCBlc2NhcGluZyBzb21lIGNoYXJhY3RlcnMgKGxpa2UgcXVvdGVzIHdoZW4gbm90Ci8vLyBpbnNpZGUgYW4gYXR0cmlidXRlIHZhbHVlKS4KLy8vCi8vLyBUaGUgZXNjYXBlZCB0ZXh0IHNob3VsZCBvbmx5IGJlIHVzZWQgaW5zaWRlIHF1b3RlZCBIVE1MIGF0dHJpYnV0ZXMgdmFsdWVzCi8vLyBvciBhcyB0ZXh0IGNvbnRlbnQgb2YgYSBub3JtYWwgZWxlbWVudC4gVXNpbmcgdGhlIGVzY2FwZWQgdGV4dCBpbnNpZGUgYQovLy8gdGFnLCBidXQgbm90IGluc2lkZSBhIHF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUsIGlzIHN0aWxsIGRhbmdlcm91cy4KY29uc3QgSHRtbEVzY2FwZSBodG1sRXNjYXBlID0gSHRtbEVzY2FwZSgpOwoKLy8vIEhUTUwgZXNjYXBlIG1vZGVzLgovLy8KLy8vIEFsbG93cyBzcGVjaWZ5aW5nIGEgbW9kZSBmb3IgSFRNTCBlc2NhcGluZyB0aGF0IGRlcGVuZCBvbiB0aGUgY29udGV4dAovLy8gd2hlcmUgdGhlIGVzY2FwZWQgcmVzdWx0IGlzIGdvaW5nIHRvIGJlIHVzZWQuCi8vLyBUaGUgcmVsZXZhbnQgY29udGV4dHMgYXJlOgovLy8KLy8vICogYXMgdGV4dCBjb250ZW50IG9mIGFuIEhUTUwgZWxlbWVudC4KLy8vICogYXMgdmFsdWUgb2YgYSAoc2luZ2xlLSBvciBkb3VibGUtKSBxdW90ZWQgYXR0cmlidXRlIHZhbHVlLgovLy8KLy8vIEFsbCBtb2RlcyByZXF1aXJlIGVzY2FwaW5nIG9mIGAmYCAoYW1wZXJzYW5kKSBjaGFyYWN0ZXJzLCBhbmQgbWF5Ci8vLyBlbmFibGUgZXNjYXBpbmcgb2YgbW9yZSBjaGFyYWN0ZXJzLgovLy8KLy8vIEN1c3RvbSBlc2NhcGUgbW9kZXMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIFtIdG1sRXNjYXBlTW9kZS5IdG1sRXNjYXBlTW9kZV0KLy8vIGNvbnN0cnVjdG9yLgpjbGFzcyBIdG1sRXNjYXBlTW9kZSB7CiAgZmluYWwgU3RyaW5nIF9uYW1lOwoKICAvLy8gV2hldGhlciB0byBlc2NhcGUgJzwnIGFuZCAnPicuCiAgZmluYWwgYm9vbCBlc2NhcGVMdEd0OwoKICAvLy8gV2hldGhlciB0byBlc2NhcGUgJyInIChxdW90ZSkuCiAgZmluYWwgYm9vbCBlc2NhcGVRdW90OwoKICAvLy8gV2hldGhlciB0byBlc2NhcGUgIiciIChhcG9zdHJvcGhlKS4KICBmaW5hbCBib29sIGVzY2FwZUFwb3M7CgogIC8vLyBXaGV0aGVyIHRvIGVzY2FwZSAiLyIgKGZvcndhcmQgc2xhc2gsIHNvbGlkdXMpLgogIC8vLwogIC8vLyBFc2NhcGluZyBhIHNsYXNoIGlzIHJlY29tbWVuZGVkIHRvIGF2b2lkIGNyb3NzLXNpdGUgc2NyaXB0aW5nIGF0dGFja3MgYnkKICAvLy8gW3RoZSBPcGVuIFdlYiBBcHBsaWNhdGlvbiBTZWN1cml0eSBQcm9qZWN0XShodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1hTU18oQ3Jvc3NfU2l0ZV9TY3JpcHRpbmcpX1ByZXZlbnRpb25fQ2hlYXRfU2hlZXQjUlVMRV8uMjMxXy1fSFRNTF9Fc2NhcGVfQmVmb3JlX0luc2VydGluZ19VbnRydXN0ZWRfRGF0YV9pbnRvX0hUTUxfRWxlbWVudF9Db250ZW50KQogIGZpbmFsIGJvb2wgZXNjYXBlU2xhc2g7CgogIC8vLyBEZWZhdWx0IGVzY2FwaW5nIG1vZGUgd2hpY2ggZXNjYXBlIGFsbCBjaGFyYWN0ZXJzLgogIC8vLwogIC8vLyBUaGUgcmVzdWx0IG9mIHN1Y2ggYW4gZXNjYXBpbmcgaXMgdXNhYmxlIGJvdGggaW4gZWxlbWVudCBjb250ZW50IGFuZAogIC8vLyBpbiBhbnkgYXR0cmlidXRlIHZhbHVlLgogIC8vLwogIC8vLyBUaGUgZXNjYXBpbmcgb25seSB3b3JrcyBmb3IgZWxlbWVudHMgd2l0aCBub3JtYWwgSFRNTCBjb250ZW50LAogIC8vLyBhbmQgbm90IGZvciwgZm9yIGV4YW1wbGUsIHNjcmlwdCBvciBzdHlsZSBlbGVtZW50IGNvbnRlbnQsCiAgLy8vIHdoaWNoIHJlcXVpcmUgZXNjYXBlcyBtYXRjaGluZyB0aGVpciBwYXJ0aWN1bGFyIGNvbnRlbnQgc3ludGF4LgogIHN0YXRpYyBjb25zdCBIdG1sRXNjYXBlTW9kZSB1bmtub3duID0KICAgICAgSHRtbEVzY2FwZU1vZGUuXygndW5rbm93bicsIHRydWUsIHRydWUsIHRydWUsIHRydWUpOwoKICAvLy8gRXNjYXBpbmcgbW9kZSBmb3IgdGV4dCBnb2luZyBpbnRvIGRvdWJsZS1xdW90ZWQgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzLgogIC8vLwogIC8vLyBUaGUgcmVzdWx0IHNob3VsZCBub3QgYmUgdXNlZCBhcyB0aGUgY29udGVudCBvZiBhbiB1bnF1b3RlZAogIC8vLyBvciBzaW5nbGUtcXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS4KICAvLy8KICAvLy8gRXNjYXBlcyBkb3VibGUgcXVvdGVzIChgImApIGJ1dCBub3Qgc2luZ2xlIHF1b3RlcyAoYCdgKSwKICAvLy8gYW5kIGVzY2FwZXMgYDxgIGFuZCBgPmAgY2hhcmFjdGVycyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBhbGxvd2VkCiAgLy8vIGluIHN0cmljdCBYSFRNTCBhdHRyaWJ1dGVzCiAgc3RhdGljIGNvbnN0IEh0bWxFc2NhcGVNb2RlIGF0dHJpYnV0ZSA9CiAgICAgIEh0bWxFc2NhcGVNb2RlLl8oJ2F0dHJpYnV0ZScsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSk7CgogIC8vLyBFc2NhcGluZyBtb2RlIGZvciB0ZXh0IGdvaW5nIGludG8gc2luZ2xlLXF1b3RlZCBIVE1MIGF0dHJpYnV0ZSB2YWx1ZXMuCiAgLy8vCiAgLy8vIFRoZSByZXN1bHQgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIHRoZSBjb250ZW50IG9mIGFuIHVucXVvdGVkCiAgLy8vIG9yIGRvdWJsZS1xdW90ZWQgYXR0cmlidXRlIHZhbHVlLgogIC8vLwogIC8vLyBFc2NhcGVzIHNpbmdsZSBxdW90ZXMgKGAnYCkgYnV0IG5vdCBkb3VibGUgcXVvdGVzIChgImApLAogIC8vLyBhbmQgZXNjYXBlcyBgPGAgYW5kIGA+YCBjaGFyYWN0ZXJzIGJlY2F1c2UgdGhleSBhcmUgbm90IGFsbG93ZWQKICAvLy8gaW4gc3RyaWN0IFhIVE1MIGF0dHJpYnV0ZXMKICBzdGF0aWMgY29uc3QgSHRtbEVzY2FwZU1vZGUgc3FBdHRyaWJ1dGUgPQogICAgICBIdG1sRXNjYXBlTW9kZS5fKCdhdHRyaWJ1dGUnLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwoKICAvLy8gRXNjYXBpbmcgbW9kZSBmb3IgdGV4dCBnb2luZyBpbnRvIEhUTUwgZWxlbWVudCBjb250ZW50LgogIC8vLwogIC8vLyBUaGUgZXNjYXBpbmcgb25seSB3b3JrcyBmb3IgZWxlbWVudHMgd2l0aCBub3JtYWwgSFRNTCBjb250ZW50LAogIC8vLyBhbmQgbm90IGZvciwgZm9yIGV4YW1wbGUsIHNjcmlwdCBvciBzdHlsZSBlbGVtZW50IGNvbnRlbnQsCiAgLy8vIHdoaWNoIHJlcXVpcmUgZXNjYXBlcyBtYXRjaGluZyB0aGVpciBwYXJ0aWN1bGFyIGNvbnRlbnQgc3ludGF4LgogIC8vLwogIC8vLyBFc2NhcGVzIGA8YCBhbmQgYD5gIGNoYXJhY3RlcnMuCiAgc3RhdGljIGNvbnN0IEh0bWxFc2NhcGVNb2RlIGVsZW1lbnQgPQogICAgICBIdG1sRXNjYXBlTW9kZS5fKCdlbGVtZW50JywgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CgogIGNvbnN0IEh0bWxFc2NhcGVNb2RlLl8odGhpcy5fbmFtZSwgdGhpcy5lc2NhcGVMdEd0LCB0aGlzLmVzY2FwZVF1b3QsCiAgICAgIHRoaXMuZXNjYXBlQXBvcywgdGhpcy5lc2NhcGVTbGFzaCk7CgogIC8vLyBDcmVhdGUgYSBjdXN0b20gZXNjYXBpbmcgbW9kZS4KICAvLy8KICAvLy8gQWxsIG1vZGVzIGVzY2FwZSBgJmAuCiAgLy8vIFRoZSBtb2RlIGNhbiBmdXJ0aGVyIGJlIHNldCB0byBlc2NhcGUgYDxgIGFuZCBgPmAgKFtlc2NhcGVMdEd0XSksCiAgLy8vIGAiYCAoW2VzY2FwZVF1b3RdKSwgYCdgIChbZXNjYXBlQXBvc10pLCBhbmQvb3IgYC9gIChbZXNjYXBlU2xhc2hdKS4KICBjb25zdCBIdG1sRXNjYXBlTW9kZSgKICAgICAge1N0cmluZyBuYW1lID0gImN1c3RvbSIsCiAgICAgIHRoaXMuZXNjYXBlTHRHdCA9IGZhbHNlLAogICAgICB0aGlzLmVzY2FwZVF1b3QgPSBmYWxzZSwKICAgICAgdGhpcy5lc2NhcGVBcG9zID0gZmFsc2UsCiAgICAgIHRoaXMuZXNjYXBlU2xhc2ggPSBmYWxzZX0pCiAgICAgIDogX25hbWUgPSBuYW1lOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfbmFtZTsKfQoKLy8vIENvbnZlcnRlciB3aGljaCBlc2NhcGVzIGNoYXJhY3RlcnMgd2l0aCBzcGVjaWFsIG1lYW5pbmcgaW4gSFRNTC4KLy8vCi8vLyBUaGUgY29udmVydGVyIGZpbmRzIGNoYXJhY3RlcnMgdGhhdCBhcmUgc2lnbmlmaWNhbnQgaW4gSFRNTCBzb3VyY2UgYW5kCi8vLyByZXBsYWNlcyB0aGVtIHdpdGggY29ycmVzcG9uZGluZyBIVE1MIGVudGl0aWVzLgovLy8KLy8vIFRoZSBjaGFyYWN0ZXJzIHRoYXQgbmVlZCBlc2NhcGluZyBpbiBIVE1MIGFyZToKLy8vCi8vLyAqIGAmYCAoYW1wZXJzYW5kKSBhbHdheXMgbmVlZCB0byBiZSBlc2NhcGVkLgovLy8gKiBgPGAgKGxlc3MgdGhhbikgYW5kICc+JyAoZ3JlYXRlciB0aGFuKSB3aGVuIGluc2lkZSBhbiBlbGVtZW50LgovLy8gKiBgImAgKHF1b3RlKSB3aGVuIGluc2lkZSBhIGRvdWJsZS1xdW90ZWQgYXR0cmlidXRlIHZhbHVlLgovLy8gKiBgJ2AgKGFwb3N0cm9waGUpIHdoZW4gaW5zaWRlIGEgc2luZ2xlLXF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuCi8vLyAgICAgICBBcG9zdHJvcGhlIGlzIGVzY2FwZWQgYXMgYCYjMzk7YCBpbnN0ZWFkIG9mIGAmYXBvcztgIHNpbmNlCi8vLyAgICAgICBub3QgYWxsIGJyb3dzZXJzIHVuZGVyc3RhbmQgYCZhcG9zO2AuCi8vLyAqIGAvYCAoc2xhc2gpIGlzIHJlY29tbWVuZGVkIHRvIGJlIGVzY2FwZWQgYmVjYXVzZSBpdCBtYXkgYmUgdXNlZAovLy8gICAgICAgdG8gdGVybWluYXRlIGFuIGVsZW1lbnQgaW4gc29tZSBIVE1MIGRpYWxlY3RzLgovLy8KLy8vIEVzY2FwaW5nIGA+YCAoZ3JlYXRlciB0aGFuKSBpc24ndCBuZWNlc3NhcnksIGJ1dCB0aGUgcmVzdWx0IGlzIG9mdGVuCi8vLyBmb3VuZCB0byBiZSBlYXNpZXIgdG8gcmVhZCBpZiBncmVhdGVyLXRoYW4gaXMgYWxzbyBlc2NhcGVkIHdoZW5ldmVyCi8vLyBsZXNzLXRoYW4gaXMuCmNsYXNzIEh0bWxFc2NhcGUgZXh0ZW5kcyBDb252ZXJ0ZXI8U3RyaW5nLCBTdHJpbmc+IHsKICAvLy8gVGhlIFtIdG1sRXNjYXBlTW9kZV0gdXNlZCBieSB0aGUgY29udmVydGVyLgogIGZpbmFsIEh0bWxFc2NhcGVNb2RlIG1vZGU7CgogIC8vLyBDcmVhdGUgY29udmVydGVyIHRoYXQgZXNjYXBlcyBIVE1MIGNoYXJhY3RlcnMuCiAgLy8vCiAgLy8vIElmIFttb2RlXSBpcyBwcm92aWRlZCBhcyBlaXRoZXIgW0h0bWxFc2NhcGVNb2RlLmF0dHJpYnV0ZV0gb3IKICAvLy8gW0h0bWxFc2NhcGVNb2RlLmVsZW1lbnRdLCBvbmx5IHRoZSBjb3JyZXNwb25kaW5nIHN1YnNldCBvZiBIVE1MCiAgLy8vIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQuCiAgLy8vIFRoZSBkZWZhdWx0IGlzIHRvIGVzY2FwZSBhbGwgSFRNTCBjaGFyYWN0ZXJzLgogIGNvbnN0IEh0bWxFc2NhcGUoW3RoaXMubW9kZSA9IEh0bWxFc2NhcGVNb2RlLnVua25vd25dKTsKCiAgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIHRleHQpIHsKICAgIHZhciB2YWwgPSBfY29udmVydCh0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCk7CiAgICByZXR1cm4gdmFsID09IG51bGwgPyB0ZXh0IDogdmFsOwogIH0KCiAgLy8vIENvbnZlcnRzIHRoZSBzdWJzdHJpbmcgb2YgdGV4dCBmcm9tIHN0YXJ0IHRvIGVuZC4KICAvLy8KICAvLy8gUmV0dXJucyBgbnVsbGAgaWYgbm8gY2hhbmdlcyB3ZXJlIG5lY2Vzc2FyeSwgb3RoZXJ3aXNlIHJldHVybnMKICAvLy8gdGhlIGNvbnZlcnRlZCBzdHJpbmcuCiAgU3RyaW5nIF9jb252ZXJ0KFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIFN0cmluZ0J1ZmZlciByZXN1bHQ7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgY2ggPSB0ZXh0W2ldOwogICAgICBTdHJpbmcgcmVwbGFjZW1lbnQ7CiAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICBjYXNlICcmJzoKICAgICAgICAgIHJlcGxhY2VtZW50ID0gJyZhbXA7JzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJyInOgogICAgICAgICAgaWYgKG1vZGUuZXNjYXBlUXVvdCkgcmVwbGFjZW1lbnQgPSAnJnF1b3Q7JzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIiciOgogICAgICAgICAgaWYgKG1vZGUuZXNjYXBlQXBvcykgcmVwbGFjZW1lbnQgPSAnJiMzOTsnOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnPCc6CiAgICAgICAgICBpZiAobW9kZS5lc2NhcGVMdEd0KSByZXBsYWNlbWVudCA9ICcmbHQ7JzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJz4nOgogICAgICAgICAgaWYgKG1vZGUuZXNjYXBlTHRHdCkgcmVwbGFjZW1lbnQgPSAnJmd0Oyc7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICcvJzoKICAgICAgICAgIGlmIChtb2RlLmVzY2FwZVNsYXNoKSByZXBsYWNlbWVudCA9ICcmIzQ3Oyc7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewogICAgICAgIHJlc3VsdCA/Pz0gU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgaWYgKGkgPiBzdGFydCkgcmVzdWx0LndyaXRlKHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7CiAgICAgICAgcmVzdWx0LndyaXRlKHJlcGxhY2VtZW50KTsKICAgICAgICBzdGFydCA9IGkgKyAxOwogICAgICB9CiAgICB9CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHJldHVybiBudWxsOwogICAgaWYgKGVuZCA+IHN0YXJ0KSByZXN1bHQud3JpdGUodGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOwogICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogIH0KCiAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFN0cmluZz4gc2luaykgewogICAgcmV0dXJuIF9IdG1sRXNjYXBlU2luayh0aGlzLAogICAgICAgIHNpbmsgaXMgU3RyaW5nQ29udmVyc2lvblNpbmsgPyBzaW5rIDogU3RyaW5nQ29udmVyc2lvblNpbmsuZnJvbShzaW5rKSk7CiAgfQp9CgpjbGFzcyBfSHRtbEVzY2FwZVNpbmsgZXh0ZW5kcyBTdHJpbmdDb252ZXJzaW9uU2lua0Jhc2UgewogIGZpbmFsIEh0bWxFc2NhcGUgX2VzY2FwZTsKICBmaW5hbCBTdHJpbmdDb252ZXJzaW9uU2luayBfc2luazsKCiAgX0h0bWxFc2NhcGVTaW5rKHRoaXMuX2VzY2FwZSwgdGhpcy5fc2luayk7CgogIHZvaWQgYWRkU2xpY2UoU3RyaW5nIGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICB2YXIgdmFsID0gX2VzY2FwZS5fY29udmVydChjaHVuaywgc3RhcnQsIGVuZCk7CiAgICBpZiAodmFsID09IG51bGwpIHsKICAgICAgX3NpbmsuYWRkU2xpY2UoY2h1bmssIHN0YXJ0LCBlbmQsIGlzTGFzdCk7CiAgICB9IGVsc2UgewogICAgICBfc2luay5hZGQodmFsKTsKICAgICAgaWYgKGlzTGFzdCkgX3NpbmsuY2xvc2UoKTsKICAgIH0KICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfc2luay5jbG9zZSgpOwogIH0KfQqA4QBOTjwBFgFEBE1GKgRNTkcjBExJIAROTEYsARcESjIfBCpBBEYoBFERFxYBJRkBJRkBKhkBNgZPgNcaATkGSx4GRUFGKDsBTQZCKAY/RiEqPwFNBkIoBj9GISw/AT4GRUFGBiYoPgFHKgElBhxIShgfHx8fIRYBHgIBRQRLNAQzBDFFP0RFMEY5BElIEjUyHQE1BkRGHjQ6ASAuJQQBOAZFHDUZKBgaFBIhERI3ERI2ERI1ERI1ERI3EQghIz8jFwgGJT8eBAFDIVAEAgE5HCQBLQFBMxcxDRYhBgQBERMEAgEdZGFydDpjb252ZXJ0L2h0bWxfZXNjYXBlLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbnZlcnQvanNvbi5kYXJ0wACKjC8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29udmVydDsKCi8vLyBFcnJvciB0aHJvd24gYnkgSlNPTiBzZXJpYWxpemF0aW9uIGlmIGFuIG9iamVjdCBjYW5ub3QgYmUgc2VyaWFsaXplZC4KLy8vCi8vLyBUaGUgW3Vuc3VwcG9ydGVkT2JqZWN0XSBmaWVsZCBob2xkcyB0aGF0IG9iamVjdCB0aGF0IGZhaWxlZCB0byBiZSBzZXJpYWxpemVkLgovLy8KLy8vIElmIGFuIG9iamVjdCBpc24ndCBkaXJlY3RseSBzZXJpYWxpemFibGUsIHRoZSBzZXJpYWxpemVyIGNhbGxzIHRoZSBgdG9Kc29uYAovLy8gbWV0aG9kIG9uIHRoZSBvYmplY3QuIElmIHRoYXQgY2FsbCBmYWlscywgdGhlIGVycm9yIHdpbGwgYmUgc3RvcmVkIGluIHRoZQovLy8gW2NhdXNlXSBmaWVsZC4gSWYgdGhlIGNhbGwgcmV0dXJucyBhbiBvYmplY3QgdGhhdCBpc24ndCBkaXJlY3RseQovLy8gc2VyaWFsaXphYmxlLCB0aGUgW2NhdXNlXSBpcyBudWxsLgpjbGFzcyBKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvciBleHRlbmRzIEVycm9yIHsKICAvLy8gVGhlIG9iamVjdCB0aGF0IGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkLgogIGZpbmFsIE9iamVjdCB1bnN1cHBvcnRlZE9iamVjdDsKCiAgLy8vIFRoZSBleGNlcHRpb24gdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGNvbnZlcnQgdGhlIG9iamVjdC4KICBmaW5hbCBPYmplY3QgY2F1c2U7CgogIC8vLyBUaGUgcGFydGlhbCByZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24sIHVwIHVudGlsIHRoZSBlcnJvciBoYXBwZW5lZC4KICAvLy8KICAvLy8gTWF5IGJlIG51bGwuCiAgZmluYWwgU3RyaW5nIHBhcnRpYWxSZXN1bHQ7CgogIEpzb25VbnN1cHBvcnRlZE9iamVjdEVycm9yKHRoaXMudW5zdXBwb3J0ZWRPYmplY3QsCiAgICAgIHt0aGlzLmNhdXNlLCB0aGlzLnBhcnRpYWxSZXN1bHR9KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgdmFyIHNhZmVTdHJpbmcgPSBFcnJvci5zYWZlVG9TdHJpbmcodW5zdXBwb3J0ZWRPYmplY3QpOwogICAgU3RyaW5nIHByZWZpeDsKICAgIGlmIChjYXVzZSAhPSBudWxsKSB7CiAgICAgIHByZWZpeCA9ICJDb252ZXJ0aW5nIG9iamVjdCB0byBhbiBlbmNvZGFibGUgb2JqZWN0IGZhaWxlZDoiOwogICAgfSBlbHNlIHsKICAgICAgcHJlZml4ID0gIkNvbnZlcnRpbmcgb2JqZWN0IGRpZCBub3QgcmV0dXJuIGFuIGVuY29kYWJsZSBvYmplY3Q6IjsKICAgIH0KICAgIHJldHVybiAiJHByZWZpeCAkc2FmZVN0cmluZyI7CiAgfQp9CgovLy8gUmVwb3J0cyB0aGF0IGFuIG9iamVjdCBjb3VsZCBub3QgYmUgc3RyaW5naWZpZWQgZHVlIHRvIGN5Y2xpYyByZWZlcmVuY2VzLgovLy8KLy8vIEFuIG9iamVjdCB0aGF0IHJlZmVyZW5jZXMgaXRzZWxmIGNhbm5vdCBiZSBzZXJpYWxpemVkIGJ5Ci8vLyBbSnNvbkNvZGVjLmVuY29kZV0vW0pzb25FbmNvZGVyLmNvbnZlcnRdLgovLy8gV2hlbiB0aGUgY3ljbGUgaXMgZGV0ZWN0ZWQsIGEgW0pzb25DeWNsaWNFcnJvcl0gaXMgdGhyb3duLgpjbGFzcyBKc29uQ3ljbGljRXJyb3IgZXh0ZW5kcyBKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvciB7CiAgLy8vIFRoZSBmaXJzdCBvYmplY3QgdGhhdCB3YXMgZGV0ZWN0ZWQgYXMgcGFydCBvZiBhIGN5Y2xlLgogIEpzb25DeWNsaWNFcnJvcihPYmplY3Qgb2JqZWN0KSA6IHN1cGVyKG9iamVjdCk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkN5Y2xpYyBlcnJvciBpbiBKU09OIHN0cmluZ2lmeSI7Cn0KCi8vLyBBbiBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW0pzb25Db2RlY10uCi8vLwovLy8gVGhpcyBpbnN0YW5jZSBwcm92aWRlcyBhIGNvbnZlbmllbnQgYWNjZXNzIHRvIHRoZSBtb3N0IGNvbW1vbiBKU09OCi8vLyB1c2UgY2FzZXMuCi8vLwovLy8gRXhhbXBsZXM6Ci8vLwovLy8gICAgIHZhciBlbmNvZGVkID0ganNvbi5lbmNvZGUoWzEsIDIsIHsgImEiOiBudWxsIH1dKTsKLy8vICAgICB2YXIgZGVjb2RlZCA9IGpzb24uZGVjb2RlKCdbImZvbyIsIHsgImJhciI6IDQ5OSB9XScpOwovLy8KLy8vIFRoZSB0b3AtbGV2ZWwgW2pzb25FbmNvZGVdIGFuZCBbanNvbkRlY29kZV0gZnVuY3Rpb25zIG1heSBiZSB1c2VkIGluc3RlYWQgaWYKLy8vIGEgbG9jYWwgdmFyaWFibGUgc2hhZG93cyB0aGUgW2pzb25dIGNvbnN0YW50Lgpjb25zdCBKc29uQ29kZWMganNvbiA9IEpzb25Db2RlYygpOwoKLy8vIENvbnZlcnRzIFt2YWx1ZV0gdG8gYSBKU09OIHN0cmluZy4KLy8vCi8vLyBJZiB2YWx1ZSBjb250YWlucyBvYmplY3RzIHRoYXQgYXJlIG5vdCBkaXJlY3RseSBlbmNvZGFibGUgdG8gYSBKU09OCi8vLyBzdHJpbmcgKGEgdmFsdWUgdGhhdCBpcyBub3QgYSBudW1iZXIsIGJvb2xlYW4sIHN0cmluZywgbnVsbCwgbGlzdCBvciBhIG1hcAovLy8gd2l0aCBzdHJpbmcga2V5cyksIHRoZSBbdG9FbmNvZGFibGVdIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydCBpdCB0byBhbgovLy8gb2JqZWN0IHRoYXQgbXVzdCBiZSBkaXJlY3RseSBlbmNvZGFibGUuCi8vLwovLy8gSWYgW3RvRW5jb2RhYmxlXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUKLy8vIHJlc3VsdCBvZiBjYWxsaW5nIGAudG9Kc29uKClgIG9uIHRoZSB1bmVuY29kYWJsZSBvYmplY3QuCi8vLwovLy8gU2hvcnRoYW5kIGZvciBbanNvbi5lbmNvZGVdLiBVc2VmdWwgaWYgYSBsb2NhbCB2YXJpYWJsZSBzaGFkb3dzIHRoZSBnbG9iYWwKLy8vIFtqc29uXSBjb25zdGFudC4KU3RyaW5nIGpzb25FbmNvZGUoT2JqZWN0IG9iamVjdCwge09iamVjdCB0b0VuY29kYWJsZShPYmplY3Qgbm9uRW5jb2RhYmxlKX0pID0+CiAgICBqc29uLmVuY29kZShvYmplY3QsIHRvRW5jb2RhYmxlOiB0b0VuY29kYWJsZSk7CgovLy8gUGFyc2VzIHRoZSBzdHJpbmcgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBKc29uIG9iamVjdC4KLy8vCi8vLyBUaGUgb3B0aW9uYWwgW3Jldml2ZXJdIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIG9iamVjdCBvciBsaXN0Ci8vLyBwcm9wZXJ0eSB0aGF0IGhhcyBiZWVuIHBhcnNlZCBkdXJpbmcgZGVjb2RpbmcuIFRoZSBga2V5YCBhcmd1bWVudCBpcyBlaXRoZXIKLy8vIHRoZSBpbnRlZ2VyIGxpc3QgaW5kZXggZm9yIGEgbGlzdCBwcm9wZXJ0eSwgdGhlIHN0cmluZyBtYXAga2V5IGZvciBvYmplY3QKLy8vIHByb3BlcnRpZXMsIG9yIGBudWxsYCBmb3IgdGhlIGZpbmFsIHJlc3VsdC4KLy8vCi8vLyBUaGUgZGVmYXVsdCBbcmV2aXZlcl0gKHdoZW4gbm90IHByb3ZpZGVkKSBpcyB0aGUgaWRlbnRpdHkgZnVuY3Rpb24uCi8vLwovLy8gU2hvcnRoYW5kIGZvciBbanNvbi5kZWNvZGVdLiBVc2VmdWwgaWYgYSBsb2NhbCB2YXJpYWJsZSBzaGFkb3dzIHRoZSBnbG9iYWwKLy8vIFtqc29uXSBjb25zdGFudC4KZHluYW1pYyBqc29uRGVjb2RlKFN0cmluZyBzb3VyY2UsIHtPYmplY3QgcmV2aXZlcihPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpfSkgPT4KICAgIGpzb24uZGVjb2RlKHNvdXJjZSwgcmV2aXZlcjogcmV2aXZlcik7CgovLy8gQSBbSnNvbkNvZGVjXSBlbmNvZGVzIEpTT04gb2JqZWN0cyB0byBzdHJpbmdzIGFuZCBkZWNvZGVzIHN0cmluZ3MgdG8KLy8vIEpTT04gb2JqZWN0cy4KLy8vCi8vLyBFeGFtcGxlczoKLy8vCi8vLyAgICAgdmFyIGVuY29kZWQgPSBqc29uLmVuY29kZShbMSwgMiwgeyAiYSI6IG51bGwgfV0pOwovLy8gICAgIHZhciBkZWNvZGVkID0ganNvbi5kZWNvZGUoJ1siZm9vIiwgeyAiYmFyIjogNDk5IH1dJyk7CmNsYXNzIEpzb25Db2RlYyBleHRlbmRzIENvZGVjPE9iamVjdCwgU3RyaW5nPiB7CiAgZmluYWwgRnVuY3Rpb24oT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSBfcmV2aXZlcjsKICBmaW5hbCBGdW5jdGlvbihkeW5hbWljKSBfdG9FbmNvZGFibGU7CgogIC8vLyBDcmVhdGVzIGEgYEpzb25Db2RlY2Agd2l0aCB0aGUgZ2l2ZW4gcmV2aXZlciBhbmQgZW5jb2RpbmcgZnVuY3Rpb24uCiAgLy8vCiAgLy8vIFRoZSBbcmV2aXZlcl0gZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBkZWNvZGluZy4gSXQgaXMgaW52b2tlZCBvbmNlIGZvcgogIC8vLyBlYWNoIG9iamVjdCBvciBsaXN0IHByb3BlcnR5IHRoYXQgaGFzIGJlZW4gcGFyc2VkLgogIC8vLyBUaGUgYGtleWAgYXJndW1lbnQgaXMgZWl0aGVyIHRoZSBpbnRlZ2VyIGxpc3QgaW5kZXggZm9yIGEgbGlzdCBwcm9wZXJ0eSwKICAvLy8gdGhlIHN0cmluZyBtYXAga2V5IGZvciBvYmplY3QgcHJvcGVydGllcywgb3IgYG51bGxgIGZvciB0aGUgZmluYWwgcmVzdWx0LgogIC8vLwogIC8vLyBJZiBbcmV2aXZlcl0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSB2YWx1ZSBhcmd1bWVudC4KICAvLy8KICAvLy8gVGhlIFt0b0VuY29kYWJsZV0gZnVuY3Rpb24gaXMgdXNlZCBkdXJpbmcgZW5jb2RpbmcuIEl0IGlzIGludm9rZWQgZm9yCiAgLy8vIHZhbHVlcyB0aGF0IGFyZSBub3QgZGlyZWN0bHkgZW5jb2RhYmxlIHRvIGEgc3RyaW5nIChhIHZhbHVlIHRoYXQgaXMgbm90IGEKICAvLy8gbnVtYmVyLCBib29sZWFuLCBzdHJpbmcsIG51bGwsIGxpc3Qgb3IgYSBtYXAgd2l0aCBzdHJpbmcga2V5cykuIFRoZQogIC8vLyBmdW5jdGlvbiBtdXN0IHJldHVybiBhbiBvYmplY3QgdGhhdCBpcyBkaXJlY3RseSBlbmNvZGFibGUuIFRoZSBlbGVtZW50cyBvZgogIC8vLyBhIHJldHVybmVkIGxpc3QgYW5kIHZhbHVlcyBvZiBhIHJldHVybmVkIG1hcCBkbyBub3QgbmVlZCB0byBiZSBkaXJlY3RseQogIC8vLyBlbmNvZGFibGUsIGFuZCBpZiB0aGV5IGFyZW4ndCwgYHRvRW5jb2RhYmxlYCB3aWxsIGJlIHVzZWQgb24gdGhlbSBhcyB3ZWxsLgogIC8vLyBQbGVhc2Ugbm90aWNlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gY2F1c2UgYW4gaW5maW5pdGUgcmVjdXJzaXZlIHJlZ3Jlc3MKICAvLy8gaW4gdGhpcyB3YXksIGJ5IGVmZmVjdGl2ZWx5IGNyZWF0aW5nIGFuIGluZmluaXRlIGRhdGEgc3RydWN0dXJlIHRocm91Z2gKICAvLy8gcmVwZWF0ZWQgY2FsbCB0byBgdG9FbmNvZGFibGVgLgogIC8vLwogIC8vLyBJZiBbdG9FbmNvZGFibGVdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZQogIC8vLyByZXN1bHQgb2YgY2FsbGluZyBgLnRvSnNvbigpYCBvbiB0aGUgdW5lbmNvZGFibGUgb2JqZWN0LgogIGNvbnN0IEpzb25Db2RlYyh7cmV2aXZlcihPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpLCB0b0VuY29kYWJsZSh2YXIgb2JqZWN0KX0pCiAgICAgIDogX3Jldml2ZXIgPSByZXZpdmVyLAogICAgICAgIF90b0VuY29kYWJsZSA9IHRvRW5jb2RhYmxlOwoKICAvLy8gQ3JlYXRlcyBhIGBKc29uQ29kZWNgIHdpdGggdGhlIGdpdmVuIHJldml2ZXIuCiAgLy8vCiAgLy8vIFRoZSBbcmV2aXZlcl0gZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggb2JqZWN0IG9yIGxpc3QgcHJvcGVydHkKICAvLy8gdGhhdCBoYXMgYmVlbiBwYXJzZWQgZHVyaW5nIGRlY29kaW5nLiBUaGUgYGtleWAgYXJndW1lbnQgaXMgZWl0aGVyIHRoZQogIC8vLyBpbnRlZ2VyIGxpc3QgaW5kZXggZm9yIGEgbGlzdCBwcm9wZXJ0eSwgdGhlIHN0cmluZyBtYXAga2V5IGZvciBvYmplY3QKICAvLy8gcHJvcGVydGllcywgb3IgYG51bGxgIGZvciB0aGUgZmluYWwgcmVzdWx0LgogIEpzb25Db2RlYy53aXRoUmV2aXZlcihyZXZpdmVyKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkpCiAgICAgIDogdGhpcyhyZXZpdmVyOiByZXZpdmVyKTsKCiAgLy8vIFBhcnNlcyB0aGUgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgSnNvbiBvYmplY3QuCiAgLy8vCiAgLy8vIFRoZSBvcHRpb25hbCBbcmV2aXZlcl0gZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggb2JqZWN0IG9yIGxpc3QKICAvLy8gcHJvcGVydHkgdGhhdCBoYXMgYmVlbiBwYXJzZWQgZHVyaW5nIGRlY29kaW5nLiBUaGUgYGtleWAgYXJndW1lbnQgaXMgZWl0aGVyCiAgLy8vIHRoZSBpbnRlZ2VyIGxpc3QgaW5kZXggZm9yIGEgbGlzdCBwcm9wZXJ0eSwgdGhlIHN0cmluZyBtYXAga2V5IGZvciBvYmplY3QKICAvLy8gcHJvcGVydGllcywgb3IgYG51bGxgIGZvciB0aGUgZmluYWwgcmVzdWx0LgogIC8vLwogIC8vLyBUaGUgZGVmYXVsdCBbcmV2aXZlcl0gKHdoZW4gbm90IHByb3ZpZGVkKSBpcyB0aGUgaWRlbnRpdHkgZnVuY3Rpb24uCiAgZHluYW1pYyBkZWNvZGUoU3RyaW5nIHNvdXJjZSwge3Jldml2ZXIoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKX0pIHsKICAgIHJldml2ZXIgPz89IF9yZXZpdmVyOwogICAgaWYgKHJldml2ZXIgPT0gbnVsbCkgcmV0dXJuIGRlY29kZXIuY29udmVydChzb3VyY2UpOwogICAgcmV0dXJuIEpzb25EZWNvZGVyKHJldml2ZXIpLmNvbnZlcnQoc291cmNlKTsKICB9CgogIC8vLyBDb252ZXJ0cyBbdmFsdWVdIHRvIGEgSlNPTiBzdHJpbmcuCiAgLy8vCiAgLy8vIElmIHZhbHVlIGNvbnRhaW5zIG9iamVjdHMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IGVuY29kYWJsZSB0byBhIEpTT04KICAvLy8gc3RyaW5nIChhIHZhbHVlIHRoYXQgaXMgbm90IGEgbnVtYmVyLCBib29sZWFuLCBzdHJpbmcsIG51bGwsIGxpc3Qgb3IgYSBtYXAKICAvLy8gd2l0aCBzdHJpbmcga2V5cyksIHRoZSBbdG9FbmNvZGFibGVdIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydCBpdCB0byBhbgogIC8vLyBvYmplY3QgdGhhdCBtdXN0IGJlIGRpcmVjdGx5IGVuY29kYWJsZS4KICAvLy8KICAvLy8gSWYgW3RvRW5jb2RhYmxlXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUKICAvLy8gcmVzdWx0IG9mIGNhbGxpbmcgYC50b0pzb24oKWAgb24gdGhlIHVuZW5jb2RhYmxlIG9iamVjdC4KICBTdHJpbmcgZW5jb2RlKE9iamVjdCB2YWx1ZSwge3RvRW5jb2RhYmxlKG9iamVjdCl9KSB7CiAgICB0b0VuY29kYWJsZSA/Pz0gX3RvRW5jb2RhYmxlOwogICAgaWYgKHRvRW5jb2RhYmxlID09IG51bGwpIHJldHVybiBlbmNvZGVyLmNvbnZlcnQodmFsdWUpOwogICAgcmV0dXJuIEpzb25FbmNvZGVyKHRvRW5jb2RhYmxlKS5jb252ZXJ0KHZhbHVlKTsKICB9CgogIEpzb25FbmNvZGVyIGdldCBlbmNvZGVyIHsKICAgIGlmIChfdG9FbmNvZGFibGUgPT0gbnVsbCkgcmV0dXJuIGNvbnN0IEpzb25FbmNvZGVyKCk7CiAgICByZXR1cm4gSnNvbkVuY29kZXIoX3RvRW5jb2RhYmxlKTsKICB9CgogIEpzb25EZWNvZGVyIGdldCBkZWNvZGVyIHsKICAgIGlmIChfcmV2aXZlciA9PSBudWxsKSByZXR1cm4gY29uc3QgSnNvbkRlY29kZXIoKTsKICAgIHJldHVybiBKc29uRGVjb2RlcihfcmV2aXZlcik7CiAgfQp9CgovLy8gVGhpcyBjbGFzcyBjb252ZXJ0cyBKU09OIG9iamVjdHMgdG8gc3RyaW5ncy4KY2xhc3MgSnNvbkVuY29kZXIgZXh0ZW5kcyBDb252ZXJ0ZXI8T2JqZWN0LCBTdHJpbmc+IHsKICAvLy8gVGhlIHN0cmluZyB1c2VkIGZvciBpbmRlbnRpb24uCiAgLy8vCiAgLy8vIFdoZW4gZ2VuZXJhdGluZyBtdWx0aS1saW5lIG91dHB1dCwgdGhpcyBzdHJpbmcgaXMgaW5zZXJ0ZWQgb25jZSBhdCB0aGUKICAvLy8gYmVnaW5uaW5nIG9mIGVhY2ggaW5kZW50ZWQgbGluZSBmb3IgZWFjaCBsZXZlbCBvZiBpbmRlbnRhdGlvbi4KICAvLy8KICAvLy8gSWYgYG51bGxgLCB0aGUgb3V0cHV0IGlzIGVuY29kZWQgYXMgYSBzaW5nbGUgbGluZS4KICBmaW5hbCBTdHJpbmcgaW5kZW50OwoKICAvLy8gRnVuY3Rpb24gY2FsbGVkIG9uIG5vbi1lbmNvZGFibGUgb2JqZWN0cyB0byByZXR1cm4gYSByZXBsYWNlbWVudAogIC8vLyBlbmNvZGFibGUgb2JqZWN0IHRoYXQgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSBvcmlnbmFsJ3MgcGxhY2UuCiAgZmluYWwgRnVuY3Rpb24oZHluYW1pYykgX3RvRW5jb2RhYmxlOwoKICAvLy8gQ3JlYXRlcyBhIEpTT04gZW5jb2Rlci4KICAvLy8KICAvLy8gVGhlIEpTT04gZW5jb2RlciBoYW5kbGVzIG51bWJlcnMsIHN0cmluZ3MsIGJvb2xlYW5zLCBudWxsLCBsaXN0cyBhbmQKICAvLy8gbWFwcyB3aXRoIHN0cmluZyBrZXlzIGRpcmVjdGx5LgogIC8vLwogIC8vLyBBbnkgb3RoZXIgb2JqZWN0IGlzIGF0dGVtcHRlZCBjb252ZXJ0ZWQgYnkgW3RvRW5jb2RhYmxlXSB0byBhbgogIC8vLyBvYmplY3QgdGhhdCBpcyBvZiBvbmUgb2YgdGhlIGNvbnZlcnRpYmxlIHR5cGVzLgogIC8vLwogIC8vLyBJZiBbdG9FbmNvZGFibGVdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGNhbGxpbmcgYC50b0pzb24oKWAgb24KICAvLy8gdGhlIG9iamVjdC4KICBjb25zdCBKc29uRW5jb2RlcihbdG9FbmNvZGFibGUob2JqZWN0KV0pCiAgICAgIDogaW5kZW50ID0gbnVsbCwKICAgICAgICBfdG9FbmNvZGFibGUgPSB0b0VuY29kYWJsZTsKCiAgLy8vIENyZWF0ZXMgYSBKU09OIGVuY29kZXIgdGhhdCBjcmVhdGVzIG11bHRpLWxpbmUgSlNPTi4KICAvLy8KICAvLy8gVGhlIGVuY29kaW5nIG9mIGVsZW1lbnRzIG9mIGxpc3RzIGFuZCBtYXBzIGFyZSBpbmRlbnRlZCBhbmQgcHV0IG9uIHNlcGFyYXRlCiAgLy8vIGxpbmVzLiBUaGUgW2luZGVudF0gc3RyaW5nIGlzIHByZXBlbmRlZCB0byB0aGVzZSBlbGVtZW50cywgb25jZSBmb3IgZWFjaAogIC8vLyBsZXZlbCBvZiBpbmRlbnRhdGlvbi4KICAvLy8KICAvLy8gSWYgW2luZGVudF0gaXMgYG51bGxgLCB0aGUgb3V0cHV0IGlzIGVuY29kZWQgYXMgYSBzaW5nbGUgbGluZS4KICAvLy8KICAvLy8gVGhlIEpTT04gZW5jb2RlciBoYW5kbGVzIG51bWJlcnMsIHN0cmluZ3MsIGJvb2xlYW5zLCBudWxsLCBsaXN0cyBhbmQKICAvLy8gbWFwcyB3aXRoIHN0cmluZyBrZXlzIGRpcmVjdGx5LgogIC8vLwogIC8vLyBBbnkgb3RoZXIgb2JqZWN0IGlzIGF0dGVtcHRlZCBjb252ZXJ0ZWQgYnkgW3RvRW5jb2RhYmxlXSB0byBhbgogIC8vLyBvYmplY3QgdGhhdCBpcyBvZiBvbmUgb2YgdGhlIGNvbnZlcnRpYmxlIHR5cGVzLgogIC8vLwogIC8vLyBJZiBbdG9FbmNvZGFibGVdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGNhbGxpbmcgYC50b0pzb24oKWAgb24KICAvLy8gdGhlIG9iamVjdC4KICBjb25zdCBKc29uRW5jb2Rlci53aXRoSW5kZW50KHRoaXMuaW5kZW50LCBbdG9FbmNvZGFibGUob2JqZWN0KV0pCiAgICAgIDogX3RvRW5jb2RhYmxlID0gdG9FbmNvZGFibGU7CgogIC8vLyBDb252ZXJ0cyBbb2JqZWN0XSB0byBhIEpTT04gW1N0cmluZ10uCiAgLy8vCiAgLy8vIERpcmVjdGx5IHNlcmlhbGl6YWJsZSB2YWx1ZXMgYXJlIFtudW1dLCBbU3RyaW5nXSwgW2Jvb2xdLCBhbmQgW051bGxdLCBhcwogIC8vLyB3ZWxsIGFzIHNvbWUgW0xpc3RdIGFuZCBbTWFwXSB2YWx1ZXMuIEZvciBbTGlzdF0sIHRoZSBlbGVtZW50cyBtdXN0IGFsbCBiZQogIC8vLyBzZXJpYWxpemFibGUuIEZvciBbTWFwXSwgdGhlIGtleXMgbXVzdCBiZSBbU3RyaW5nXSBhbmQgdGhlIHZhbHVlcyBtdXN0IGJlCiAgLy8vIHNlcmlhbGl6YWJsZS4KICAvLy8KICAvLy8gSWYgYSB2YWx1ZSBvZiBhbnkgb3RoZXIgdHlwZSBpcyBhdHRlbXB0ZWQgdG8gYmUgc2VyaWFsaXplZCwgdGhlCiAgLy8vIGB0b0VuY29kYWJsZWAgZnVuY3Rpb24gcHJvdmlkZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCB3aXRoIHRoZSB2YWx1ZQogIC8vLyBhcyBhcmd1bWVudC4gVGhlIHJlc3VsdCwgd2hpY2ggbXVzdCBiZSBhIGRpcmVjdGx5IHNlcmlhbGl6YWJsZSB2YWx1ZSwgaXMKICAvLy8gc2VyaWFsaXplZCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZS4KICAvLy8KICAvLy8gSWYgdGhlIGNvbnZlcnNpb24gdGhyb3dzLCBvciByZXR1cm5zIGEgdmFsdWUgdGhhdCBpcyBub3QgZGlyZWN0bHkKICAvLy8gc2VyaWFsaXphYmxlLCBhIFtKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvcl0gZXhjZXB0aW9uIGlzIHRocm93bi4KICAvLy8gSWYgdGhlIGNhbGwgdGhyb3dzLCB0aGUgZXJyb3IgaXMgY2F1Z2h0IGFuZCBzdG9yZWQgaW4gdGhlCiAgLy8vIFtKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvcl0ncyBbOmNhdXNlOl0gZmllbGQuCiAgLy8vCiAgLy8vIElmIGEgW0xpc3RdIG9yIFtNYXBdIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGl0c2VsZiwgZGlyZWN0bHkgb3IgdGhyb3VnaAogIC8vLyBvdGhlciBsaXN0cyBvciBtYXBzLCBpdCBjYW5ub3QgYmUgc2VyaWFsaXplZCBhbmQgYSBbSnNvbkN5Y2xpY0Vycm9yXSBpcwogIC8vLyB0aHJvd24uCiAgLy8vCiAgLy8vIFtvYmplY3RdIHNob3VsZCBub3QgY2hhbmdlIGR1cmluZyBzZXJpYWxpemF0aW9uLgogIC8vLwogIC8vLyBJZiBhbiBvYmplY3QgaXMgc2VyaWFsaXplZCBtb3JlIHRoYW4gb25jZSwgW2NvbnZlcnRdIG1heSBjYWNoZSB0aGUgdGV4dAogIC8vLyBmb3IgaXQuIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgY29udGVudCBvZiBhbiBvYmplY3QgY2hhbmdlcyBhZnRlciBpdCBpcwogIC8vLyBmaXJzdCBzZXJpYWxpemVkLCB0aGUgbmV3IHZhbHVlcyBtYXkgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGUgcmVzdWx0LgogIFN0cmluZyBjb252ZXJ0KE9iamVjdCBvYmplY3QpID0+CiAgICAgIF9Kc29uU3RyaW5nU3RyaW5naWZpZXIuc3RyaW5naWZ5KG9iamVjdCwgX3RvRW5jb2RhYmxlLCBpbmRlbnQpOwoKICAvLy8gU3RhcnRzIGEgY2h1bmtlZCBjb252ZXJzaW9uLgogIC8vLwogIC8vLyBUaGUgY29udmVydGVyIHdvcmtzIG1vcmUgZWZmaWNpZW50bHkgaWYgdGhlIGdpdmVuIFtzaW5rXSBpcyBhCiAgLy8vIFtTdHJpbmdDb252ZXJzaW9uU2lua10uCiAgLy8vCiAgLy8vIFJldHVybnMgYSBjaHVua2VkLWNvbnZlcnNpb24gc2luayB0aGF0IGFjY2VwdHMgYXQgbW9zdCBvbmUgb2JqZWN0LiBJdCBpcwogIC8vLyBhbiBlcnJvciB0byBpbnZva2UgYGFkZGAgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHJldHVybmVkIHNpbmsuCiAgQ2h1bmtlZENvbnZlcnNpb25TaW5rPE9iamVjdD4gc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFN0cmluZz4gc2luaykgewogICAgaWYgKHNpbmsgaXMgX1V0ZjhFbmNvZGVyU2luaykgewogICAgICByZXR1cm4gX0pzb25VdGY4RW5jb2RlclNpbmsoCiAgICAgICAgICBzaW5rLl9zaW5rLAogICAgICAgICAgX3RvRW5jb2RhYmxlLAogICAgICAgICAgSnNvblV0ZjhFbmNvZGVyLl91dGY4RW5jb2RlKGluZGVudCksCiAgICAgICAgICBKc29uVXRmOEVuY29kZXIuX2RlZmF1bHRCdWZmZXJTaXplKTsKICAgIH0KICAgIHJldHVybiBfSnNvbkVuY29kZXJTaW5rKAogICAgICAgIHNpbmsgaXMgU3RyaW5nQ29udmVyc2lvblNpbmsgPyBzaW5rIDogU3RyaW5nQ29udmVyc2lvblNpbmsuZnJvbShzaW5rKSwKICAgICAgICBfdG9FbmNvZGFibGUsCiAgICAgICAgaW5kZW50KTsKICB9CgogIC8vIE92ZXJyaWRlIHRoZSBiYXNlIGNsYXNzJ3MgYmluZCwgdG8gcHJvdmlkZSBhIGJldHRlciB0eXBlLgogIFN0cmVhbTxTdHJpbmc+IGJpbmQoU3RyZWFtPE9iamVjdD4gc3RyZWFtKSA9PiBzdXBlci5iaW5kKHN0cmVhbSk7CgogIENvbnZlcnRlcjxPYmplY3QsIFQ+IGZ1c2U8VD4oQ29udmVydGVyPFN0cmluZywgVD4gb3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyBVdGY4RW5jb2RlciAmJiBUIGlzIExpc3Q8aW50PikgewogICAgICAvLyBUaGUgaW5zdGFuY2UgY2hlY2sgZ3VhcmFudGVlcyB0aGF0IGBUYCBpcyAoYSBzdWJ0eXBlIG9mKSBMaXN0PGludD4sCiAgICAgIC8vIGJ1dCB0aGUgc3RhdGljIHR5cGUgc3lzdGVtIGRvZXNuJ3Qga25vdyB0aGF0LCBhbmQgc28gd2UgY2FzdC4KICAgICAgLy8gQ2FzdCB0aHJvdWdoIGR5bmFtaWMgdG8ga2VlcCB0aGUgY2FzdCBpbXBsaWNpdCBmb3IgYnVpbGRzIHVzaW5nCiAgICAgIC8vIHVuY2hlY2tlZCBpbXBsaWNpdCBjYXN0cy4KICAgICAgcmV0dXJuIEpzb25VdGY4RW5jb2RlcihpbmRlbnQsIF90b0VuY29kYWJsZSkgYXMgZHluYW1pYzsKICAgIH0KICAgIHJldHVybiBzdXBlci5mdXNlPFQ+KG90aGVyKTsKICB9Cn0KCi8vLyBFbmNvZGVyIHRoYXQgZW5jb2RlcyBhIHNpbmdsZSBvYmplY3QgYXMgYSBVVEYtOCBlbmNvZGVkIEpTT04gc3RyaW5nLgovLy8KLy8vIFRoaXMgZW5jb2RlciB3b3JrcyBlcXVpdmFsZW50bHkgdG8gZmlyc3QgY29udmVydGluZyB0aGUgb2JqZWN0IHRvCi8vLyBhIEpTT04gc3RyaW5nLCBhbmQgdGhlbiBVVEYtOCBlbmNvZGluZyB0aGUgc3RyaW5nLCBidXQgd2l0aG91dAovLy8gY3JlYXRpbmcgYW4gaW50ZXJtZWRpYXRlIHN0cmluZy4KY2xhc3MgSnNvblV0ZjhFbmNvZGVyIGV4dGVuZHMgQ29udmVydGVyPE9iamVjdCwgTGlzdDxpbnQ+PiB7CiAgLy8vIERlZmF1bHQgYnVmZmVyIHNpemUgdXNlZCBieSB0aGUgSlNPTi10by1VVEYtOCBlbmNvZGVyLgogIHN0YXRpYyBjb25zdCBpbnQgX2RlZmF1bHRCdWZmZXJTaXplID0gMjU2OwogIEBkZXByZWNhdGVkCiAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gX2RlZmF1bHRCdWZmZXJTaXplOwoKICAvLy8gSW5kZW50YXRpb24gdXNlZCBpbiBwcmV0dHktcHJpbnQgbW9kZSwgYG51bGxgIGlmIG5vdCBwcmV0dHkuCiAgZmluYWwgTGlzdDxpbnQ+IF9pbmRlbnQ7CgogIC8vLyBGdW5jdGlvbiBjYWxsZWQgd2l0aCBlYWNoIHVuLWVuY29kYWJsZSBvYmplY3QgZW5jb3VudGVyZWQuCiAgZmluYWwgRnVuY3Rpb24oZHluYW1pYykgX3RvRW5jb2RhYmxlOwoKICAvLy8gVVRGLTggYnVmZmVyIHNpemUuCiAgZmluYWwgaW50IF9idWZmZXJTaXplOwoKICAvLy8gQ3JlYXRlIGNvbnZlcnRlci4KICAvLy8KICAvLy8gSWYgW2luZGVudF0gaXMgbm9uLWBudWxsYCwgdGhlIGNvbnZlcnRlciBhdHRlbXB0cyB0byAicHJldHR5LXByaW50IiB0aGUKICAvLy8gSlNPTiwgYW5kIHVzZXMgYGluZGVudGAgYXMgdGhlIGluZGVudGF0aW9uLiBPdGhlcndpc2UgdGhlIHJlc3VsdCBoYXMgbm8KICAvLy8gd2hpdGVzcGFjZSBvdXRzaWRlIG9mIHN0cmluZyBsaXRlcmFscy4KICAvLy8gSWYgYGluZGVudGAgY29udGFpbnMgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgdmFsaWQgSlNPTiB3aGl0ZXNwYWNlCiAgLy8vIGNoYXJhY3RlcnMsIHRoZSByZXN1bHQgd2lsbCBub3QgYmUgdmFsaWQgSlNPTi4gSlNPTiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKICAvLy8gYXJlIHNwYWNlIChVKzAwMjApLCB0YWIgKFUrMDAwOSksIGxpbmUgZmVlZCAoVSswMDBhKSBhbmQgY2FycmlhZ2UgcmV0dXJuCiAgLy8vIChVKzAwMGQpIChbRUNNQQogIC8vLyA0MDRdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvc3RhbmRhcmRzL0VjbWEtNDA0Lmh0bSkpLgogIC8vLwogIC8vLyBUaGUgW2J1ZmZlclNpemVdIGlzIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBidWZmZXJzIHVzZWQgdG8gY29sbGVjdAogIC8vLyBVVEYtOCBjb2RlIHVuaXRzLgogIC8vLyBJZiB1c2luZyBbc3RhcnRDaHVua2VkQ29udmVyc2lvbl0sIGl0IHdpbGwgYmUgdGhlIHNpemUgb2YgdGhlIGNodW5rcy4KICAvLy8KICAvLy8gVGhlIEpTT04gZW5jb2RlciBoYW5kbGVzIG51bWJlcnMsIHN0cmluZ3MsIGJvb2xlYW5zLCBudWxsLCBsaXN0cyBhbmQgbWFwcwogIC8vLyBkaXJlY3RseS4KICAvLy8KICAvLy8gQW55IG90aGVyIG9iamVjdCBpcyBhdHRlbXB0ZWQgY29udmVydGVkIGJ5IFt0b0VuY29kYWJsZV0gdG8gYW4gb2JqZWN0IHRoYXQKICAvLy8gaXMgb2Ygb25lIG9mIHRoZSBjb252ZXJ0aWJsZSB0eXBlcy4KICAvLy8KICAvLy8gSWYgW3RvRW5jb2RhYmxlXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBjYWxsaW5nIGAudG9Kc29uKClgIG9uIHRoZQogIC8vLyBvYmplY3QuCiAgSnNvblV0ZjhFbmNvZGVyKAogICAgICBbU3RyaW5nIGluZGVudCwgdG9FbmNvZGFibGUob2JqZWN0KSwgaW50IGJ1ZmZlclNpemUgPSBfZGVmYXVsdEJ1ZmZlclNpemVdKQogICAgICA6IF9pbmRlbnQgPSBfdXRmOEVuY29kZShpbmRlbnQpLAogICAgICAgIF90b0VuY29kYWJsZSA9IHRvRW5jb2RhYmxlLAogICAgICAgIF9idWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKCiAgc3RhdGljIExpc3Q8aW50PiBfdXRmOEVuY29kZShTdHJpbmcgc3RyaW5nKSB7CiAgICBpZiAoc3RyaW5nID09IG51bGwpIHJldHVybiBudWxsOwogICAgaWYgKHN0cmluZy5pc0VtcHR5KSByZXR1cm4gVWludDhMaXN0KDApOwogICAgY2hlY2tBc2NpaToKICAgIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoc3RyaW5nLmNvZGVVbml0QXQoaSkgPj0gMHg4MCkgYnJlYWsgY2hlY2tBc2NpaTsKICAgICAgfQogICAgICByZXR1cm4gc3RyaW5nLmNvZGVVbml0czsKICAgIH0KICAgIHJldHVybiB1dGY4LmVuY29kZShzdHJpbmcpOwogIH0KCiAgLy8vIENvbnZlcnQgW29iamVjdF0gaW50byBVVEYtOCBlbmNvZGVkIEpTT04uCiAgTGlzdDxpbnQ+IGNvbnZlcnQoT2JqZWN0IG9iamVjdCkgewogICAgdmFyIGJ5dGVzID0gPExpc3Q8aW50Pj5bXTsKICAgIC8vIFRoZSBgc3RyaW5naWZ5YCBmdW5jdGlvbiBhbHdheXMgY29udmVydHMgaW50byBjaHVua3MuCiAgICAvLyBDb2xsZWN0IHRoZSBjaHVua3MgaW50byB0aGUgYGJ5dGVzYCBsaXN0LCB0aGVuIGNvbWJpbmUgdGhlbSBhZnRlcndhcmRzLgogICAgdm9pZCBhZGRDaHVuayhVaW50OExpc3QgY2h1bmssIGludCBzdGFydCwgaW50IGVuZCkgewogICAgICBpZiAoc3RhcnQgPiAwIHx8IGVuZCA8IGNodW5rLmxlbmd0aCkgewogICAgICAgIHZhciBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgICAgICBjaHVuayA9CiAgICAgICAgICAgIFVpbnQ4TGlzdC52aWV3KGNodW5rLmJ1ZmZlciwgY2h1bmsub2Zmc2V0SW5CeXRlcyArIHN0YXJ0LCBsZW5ndGgpOwogICAgICB9CiAgICAgIGJ5dGVzLmFkZChjaHVuayk7CiAgICB9CgogICAgX0pzb25VdGY4U3RyaW5naWZpZXIuc3RyaW5naWZ5KAogICAgICAgIG9iamVjdCwgX2luZGVudCwgX3RvRW5jb2RhYmxlLCBfYnVmZmVyU2l6ZSwgYWRkQ2h1bmspOwogICAgaWYgKGJ5dGVzLmxlbmd0aCA9PSAxKSByZXR1cm4gYnl0ZXNbMF07CiAgICB2YXIgbGVuZ3RoID0gMDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGVuZ3RoICs9IGJ5dGVzW2ldLmxlbmd0aDsKICAgIH0KICAgIHZhciByZXN1bHQgPSBVaW50OExpc3QobGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwLCBvZmZzZXQgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGJ5dGVMaXN0ID0gYnl0ZXNbaV07CiAgICAgIGludCBlbmQgPSBvZmZzZXQgKyBieXRlTGlzdC5sZW5ndGg7CiAgICAgIHJlc3VsdC5zZXRSYW5nZShvZmZzZXQsIGVuZCwgYnl0ZUxpc3QpOwogICAgICBvZmZzZXQgPSBlbmQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFN0YXJ0IGEgY2h1bmtlZCBjb252ZXJzaW9uLgogIC8vLwogIC8vLyBPbmx5IG9uZSBvYmplY3QgY2FuIGJlIHBhc3NlZCBpbnRvIHRoZSByZXR1cm5lZCBzaW5rLgogIC8vLwogIC8vLyBUaGUgYXJndW1lbnQgW3NpbmtdIHdpbGwgcmVjZWl2ZSBieXRlIGxpc3RzIGluIHNpemVzIGRlcGVuZGluZyBvbiB0aGUKICAvLy8gYGJ1ZmZlclNpemVgIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igd2hlbiBjcmVhdGluZyB0aGlzIGVuY29kZXIuCiAgQ2h1bmtlZENvbnZlcnNpb25TaW5rPE9iamVjdD4gc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgewogICAgQnl0ZUNvbnZlcnNpb25TaW5rIGJ5dGVTaW5rOwogICAgaWYgKHNpbmsgaXMgQnl0ZUNvbnZlcnNpb25TaW5rKSB7CiAgICAgIGJ5dGVTaW5rID0gc2luazsKICAgIH0gZWxzZSB7CiAgICAgIGJ5dGVTaW5rID0gQnl0ZUNvbnZlcnNpb25TaW5rLmZyb20oc2luayk7CiAgICB9CiAgICByZXR1cm4gX0pzb25VdGY4RW5jb2RlclNpbmsoYnl0ZVNpbmssIF90b0VuY29kYWJsZSwgX2luZGVudCwgX2J1ZmZlclNpemUpOwogIH0KCiAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgY2xhc3MncyBiaW5kLCB0byBwcm92aWRlIGEgYmV0dGVyIHR5cGUuCiAgU3RyZWFtPExpc3Q8aW50Pj4gYmluZChTdHJlYW08T2JqZWN0PiBzdHJlYW0pIHsKICAgIHJldHVybiBzdXBlci5iaW5kKHN0cmVhbSk7CiAgfQp9CgovLy8gSW1wbGVtZW50cyB0aGUgY2h1bmtlZCBjb252ZXJzaW9uIGZyb20gb2JqZWN0IHRvIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLgovLy8KLy8vIFRoZSBzaW5rIG9ubHkgYWNjZXB0cyBvbmUgdmFsdWUsIGJ1dCB3aWxsIHByb2R1Y2Ugb3V0cHV0IGluIGEgY2h1bmtlZCB3YXkuCmNsYXNzIF9Kc29uRW5jb2RlclNpbmsgZXh0ZW5kcyBDaHVua2VkQ29udmVyc2lvblNpbms8T2JqZWN0PiB7CiAgZmluYWwgU3RyaW5nIF9pbmRlbnQ7CiAgZmluYWwgRnVuY3Rpb24oZHluYW1pYykgX3RvRW5jb2RhYmxlOwogIGZpbmFsIFN0cmluZ0NvbnZlcnNpb25TaW5rIF9zaW5rOwogIGJvb2wgX2lzRG9uZSA9IGZhbHNlOwoKICBfSnNvbkVuY29kZXJTaW5rKHRoaXMuX3NpbmssIHRoaXMuX3RvRW5jb2RhYmxlLCB0aGlzLl9pbmRlbnQpOwoKICAvLy8gRW5jb2RlcyB0aGUgZ2l2ZW4gb2JqZWN0IFtvXS4KICAvLy8KICAvLy8gSXQgaXMgYW4gZXJyb3IgdG8gaW52b2tlIHRoaXMgbWV0aG9kIG1vcmUgdGhhbiBvbmNlIG9uIGFueSBpbnN0YW5jZS4gV2hpbGUKICAvLy8gdGhpcyBtYWtlcyB0aGUgaW5wdXQgZWZmZWN0aXZlbHkgbm9uLWNodW5rZWQgdGhlIG91dHB1dCB3aWxsIGJlIGdlbmVyYXRlZAogIC8vLyBpbiBhIGNodW5rZWQgd2F5LgogIHZvaWQgYWRkKE9iamVjdCBvKSB7CiAgICBpZiAoX2lzRG9uZSkgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCJPbmx5IG9uZSBjYWxsIHRvIGFkZCBhbGxvd2VkIik7CiAgICB9CiAgICBfaXNEb25lID0gdHJ1ZTsKICAgIHZhciBzdHJpbmdTaW5rID0gX3NpbmsuYXNTdHJpbmdTaW5rKCk7CiAgICBfSnNvblN0cmluZ1N0cmluZ2lmaWVyLnByaW50T24obywgc3RyaW5nU2luaywgX3RvRW5jb2RhYmxlLCBfaW5kZW50KTsKICAgIHN0cmluZ1NpbmsuY2xvc2UoKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7LyogZG8gbm90aGluZyAqL30KfQoKLy8vIFNpbmsgcmV0dXJuZWQgd2hlbiBzdGFydGluZyBhIGNodW5rZWQgY29udmVyc2lvbiBmcm9tIG9iamVjdCB0byBieXRlcy4KY2xhc3MgX0pzb25VdGY4RW5jb2RlclNpbmsgZXh0ZW5kcyBDaHVua2VkQ29udmVyc2lvblNpbms8T2JqZWN0PiB7CiAgLy8vIFRoZSBieXRlIHNpbmsgcmVjZWl2ZWluZyB0aGUgZW5jb2RlZCBjaHVua3MuCiAgZmluYWwgQnl0ZUNvbnZlcnNpb25TaW5rIF9zaW5rOwogIGZpbmFsIExpc3Q8aW50PiBfaW5kZW50OwogIGZpbmFsIEZ1bmN0aW9uKGR5bmFtaWMpIF90b0VuY29kYWJsZTsKICBmaW5hbCBpbnQgX2J1ZmZlclNpemU7CiAgYm9vbCBfaXNEb25lID0gZmFsc2U7CiAgX0pzb25VdGY4RW5jb2RlclNpbmsoCiAgICAgIHRoaXMuX3NpbmssIHRoaXMuX3RvRW5jb2RhYmxlLCB0aGlzLl9pbmRlbnQsIHRoaXMuX2J1ZmZlclNpemUpOwoKICAvLy8gQ2FsbGJhY2sgY2FsbGVkIGZvciBlYWNoIHNsaWNlIG9mIHJlc3VsdCBieXRlcy4KICB2b2lkIF9hZGRDaHVuayhVaW50OExpc3QgY2h1bmssIGludCBzdGFydCwgaW50IGVuZCkgewogICAgX3NpbmsuYWRkU2xpY2UoY2h1bmssIHN0YXJ0LCBlbmQsIGZhbHNlKTsKICB9CgogIHZvaWQgYWRkKE9iamVjdCBvYmplY3QpIHsKICAgIGlmIChfaXNEb25lKSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoIk9ubHkgb25lIGNhbGwgdG8gYWRkIGFsbG93ZWQiKTsKICAgIH0KICAgIF9pc0RvbmUgPSB0cnVlOwogICAgX0pzb25VdGY4U3RyaW5naWZpZXIuc3RyaW5naWZ5KAogICAgICAgIG9iamVjdCwgX2luZGVudCwgX3RvRW5jb2RhYmxlLCBfYnVmZmVyU2l6ZSwgX2FkZENodW5rKTsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgaWYgKCFfaXNEb25lKSB7CiAgICAgIF9pc0RvbmUgPSB0cnVlOwogICAgICBfc2luay5jbG9zZSgpOwogICAgfQogIH0KfQoKLy8vIFRoaXMgY2xhc3MgcGFyc2VzIEpTT04gc3RyaW5ncyBhbmQgYnVpbGRzIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdHMuCmNsYXNzIEpzb25EZWNvZGVyIGV4dGVuZHMgQ29udmVydGVyPFN0cmluZywgT2JqZWN0PiB7CiAgZmluYWwgRnVuY3Rpb24oT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSBfcmV2aXZlcjsKCiAgLy8vIENvbnN0cnVjdHMgYSBuZXcgSnNvbkRlY29kZXIuCiAgLy8vCiAgLy8vIFRoZSBbcmV2aXZlcl0gbWF5IGJlIGBudWxsYC4KICBjb25zdCBKc29uRGVjb2RlcihbcmV2aXZlcihPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpXSkgOiBfcmV2aXZlciA9IHJldml2ZXI7CgogIC8vLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gSlNPTi1zdHJpbmcgW2lucHV0XSB0byBpdHMgY29ycmVzcG9uZGluZyBvYmplY3QuCiAgLy8vCiAgLy8vIFBhcnNlZCBKU09OIHZhbHVlcyBhcmUgb2YgdGhlIHR5cGVzIFtudW1dLCBbU3RyaW5nXSwgW2Jvb2xdLCBbTnVsbF0sCiAgLy8vIFtMaXN0XXMgb2YgcGFyc2VkIEpTT04gdmFsdWVzIG9yIFtNYXBdcyBmcm9tIFtTdHJpbmddIHRvIHBhcnNlZCBKU09OCiAgLy8vIHZhbHVlcy4KICAvLy8KICAvLy8gSWYgYHRoaXNgIHdhcyBpbml0aWFsaXplZCB3aXRoIGEgcmV2aXZlciwgdGhlbiB0aGUgcGFyc2luZyBvcGVyYXRpb24KICAvLy8gaW52b2tlcyB0aGUgcmV2aXZlciBvbiBldmVyeSBvYmplY3Qgb3IgbGlzdCBwcm9wZXJ0eSB0aGF0IGhhcyBiZWVuIHBhcnNlZC4KICAvLy8gVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHByb3BlcnR5IG5hbWUgKFtTdHJpbmddKSBvciBsaXN0IGluZGV4IChbaW50XSksIGFuZAogIC8vLyB0aGUgdmFsdWUgaXMgdGhlIHBhcnNlZCB2YWx1ZS4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcmV2aXZlciBpcyB1c2VkIGFzCiAgLy8vIHRoZSB2YWx1ZSBvZiB0aGF0IHByb3BlcnR5IGluc3RlYWQgdGhlIHBhcnNlZCB2YWx1ZS4KICAvLy8KICAvLy8gVGhyb3dzIFtGb3JtYXRFeGNlcHRpb25dIGlmIHRoZSBpbnB1dCBpcyBub3QgdmFsaWQgSlNPTiB0ZXh0LgogIGR5bmFtaWMgY29udmVydChTdHJpbmcgaW5wdXQpID0+IF9wYXJzZUpzb24oaW5wdXQsIF9yZXZpdmVyKTsKCiAgLy8vIFN0YXJ0cyBhIGNvbnZlcnNpb24gZnJvbSBhIGNodW5rZWQgSlNPTiBzdHJpbmcgdG8gaXRzIGNvcnJlc3BvbmRpbmcgb2JqZWN0LgogIC8vLwogIC8vLyBUaGUgb3V0cHV0IFtzaW5rXSByZWNlaXZlcyBleGFjdGx5IG9uZSBkZWNvZGVkIGVsZW1lbnQgdGhyb3VnaCBgYWRkYC4KICBleHRlcm5hbCBTdHJpbmdDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8T2JqZWN0PiBzaW5rKTsKCiAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgY2xhc3MncyBiaW5kLCB0byBwcm92aWRlIGEgYmV0dGVyIHR5cGUuCiAgU3RyZWFtPE9iamVjdD4gYmluZChTdHJlYW08U3RyaW5nPiBzdHJlYW0pID0+IHN1cGVyLmJpbmQoc3RyZWFtKTsKfQoKLy8gSW50ZXJuYWwgb3B0aW1pemVkIEpTT04gcGFyc2luZyBpbXBsZW1lbnRhdGlvbi4KZXh0ZXJuYWwgX3BhcnNlSnNvbihTdHJpbmcgc291cmNlLCByZXZpdmVyKGtleSwgdmFsdWUpKTsKCi8vIEltcGxlbWVudGF0aW9uIG9mIGVuY29kZXIvc3RyaW5naWZpZXIuCgpkeW5hbWljIF9kZWZhdWx0VG9FbmNvZGFibGUoZHluYW1pYyBvYmplY3QpID0+IG9iamVjdC50b0pzb24oKTsKCi8vLyBKU09OIGVuY29kZXIgdGhhdCB0cmF2ZXJzZXMgYW4gb2JqZWN0IHN0cnVjdHVyZSBhbmQgd3JpdGVzIEpTT04gc291cmNlLgovLy8KLy8vIFRoaXMgaXMgYW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gdGhhdCBkb2Vzbid0IGRlY2lkZSBvbiB0aGUgb3V0cHV0Ci8vLyBmb3JtYXQsIGJ1dCB3cml0ZXMgdGhlIEpTT04gdGhyb3VnaCBhYnN0cmFjdCBtZXRob2RzIGxpa2UgW3dyaXRlU3RyaW5nXS4KYWJzdHJhY3QgY2xhc3MgX0pzb25TdHJpbmdpZmllciB7CiAgLy8gQ2hhcmFjdGVyIGNvZGUgY29uc3RhbnRzLgogIHN0YXRpYyBjb25zdCBpbnQgYmFja3NwYWNlID0gMHgwODsKICBzdGF0aWMgY29uc3QgaW50IHRhYiA9IDB4MDk7CiAgc3RhdGljIGNvbnN0IGludCBuZXdsaW5lID0gMHgwYTsKICBzdGF0aWMgY29uc3QgaW50IGNhcnJpYWdlUmV0dXJuID0gMHgwZDsKICBzdGF0aWMgY29uc3QgaW50IGZvcm1GZWVkID0gMHgwYzsKICBzdGF0aWMgY29uc3QgaW50IHF1b3RlID0gMHgyMjsKICBzdGF0aWMgY29uc3QgaW50IGNoYXJfMCA9IDB4MzA7CiAgc3RhdGljIGNvbnN0IGludCBiYWNrc2xhc2ggPSAweDVjOwogIHN0YXRpYyBjb25zdCBpbnQgY2hhcl9iID0gMHg2MjsKICBzdGF0aWMgY29uc3QgaW50IGNoYXJfZiA9IDB4NjY7CiAgc3RhdGljIGNvbnN0IGludCBjaGFyX24gPSAweDZlOwogIHN0YXRpYyBjb25zdCBpbnQgY2hhcl9yID0gMHg3MjsKICBzdGF0aWMgY29uc3QgaW50IGNoYXJfdCA9IDB4NzQ7CiAgc3RhdGljIGNvbnN0IGludCBjaGFyX3UgPSAweDc1OwoKICAvLy8gTGlzdCBvZiBvYmplY3RzIGN1cnJlbnRseSBiZWluZyB0cmF2ZXJzZWQuIFVzZWQgdG8gZGV0ZWN0IGN5Y2xlcy4KICBmaW5hbCBMaXN0IF9zZWVuID0gW107CgogIC8vLyBGdW5jdGlvbiBjYWxsZWQgZm9yIGVhY2ggdW4tZW5jb2RhYmxlIG9iamVjdCBlbmNvdW50ZXJlZC4KICBmaW5hbCBGdW5jdGlvbihkeW5hbWljKSBfdG9FbmNvZGFibGU7CgogIF9Kc29uU3RyaW5naWZpZXIodG9FbmNvZGFibGUobykpCiAgICAgIDogX3RvRW5jb2RhYmxlID0gdG9FbmNvZGFibGUgPz8gX2RlZmF1bHRUb0VuY29kYWJsZTsKCiAgU3RyaW5nIGdldCBfcGFydGlhbFJlc3VsdDsKCiAgLy8vIEFwcGVuZCBhIHN0cmluZyB0byB0aGUgSlNPTiBvdXRwdXQuCiAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgY2hhcmFjdGVycyk7CgogIC8vLyBBcHBlbmQgcGFydCBvZiBhIHN0cmluZyB0byB0aGUgSlNPTiBvdXRwdXQuCiAgdm9pZCB3cml0ZVN0cmluZ1NsaWNlKFN0cmluZyBjaGFyYWN0ZXJzLCBpbnQgc3RhcnQsIGludCBlbmQpOwoKICAvLy8gQXBwZW5kIGEgc2luZ2xlIGNoYXJhY3RlciwgZ2l2ZW4gYnkgaXRzIGNvZGUgcG9pbnQsIHRvIHRoZSBKU09OIG91dHB1dC4KICB2b2lkIHdyaXRlQ2hhckNvZGUoaW50IGNoYXJDb2RlKTsKCiAgLy8vIFdyaXRlIGEgbnVtYmVyIHRvIHRoZSBKU09OIG91dHB1dC4KICB2b2lkIHdyaXRlTnVtYmVyKG51bSBudW1iZXIpOwoKICAvLyAoJzAnICsgeCkgb3IgKCdhJyArIHggLSAxMCkKICBzdGF0aWMgaW50IGhleERpZ2l0KGludCB4KSA9PiB4IDwgMTAgPyA0OCArIHggOiA4NyArIHg7CgogIC8vLyBXcml0ZSwgYW5kIHN1aXRhYmx5IGVzY2FwZSwgYSBzdHJpbmcncyBjb250ZW50IGFzIGEgSlNPTiBzdHJpbmcgbGl0ZXJhbC4KICB2b2lkIHdyaXRlU3RyaW5nQ29udGVudChTdHJpbmcgcykgewogICAgdmFyIG9mZnNldCA9IDA7CiAgICBmaW5hbCBsZW5ndGggPSBzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGNoYXJDb2RlID0gcy5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhckNvZGUgPiBiYWNrc2xhc2gpIGNvbnRpbnVlOwogICAgICBpZiAoY2hhckNvZGUgPCAzMikgewogICAgICAgIGlmIChpID4gb2Zmc2V0KSB3cml0ZVN0cmluZ1NsaWNlKHMsIG9mZnNldCwgaSk7CiAgICAgICAgb2Zmc2V0ID0gaSArIDE7CiAgICAgICAgd3JpdGVDaGFyQ29kZShiYWNrc2xhc2gpOwogICAgICAgIHN3aXRjaCAoY2hhckNvZGUpIHsKICAgICAgICAgIGNhc2UgYmFja3NwYWNlOgogICAgICAgICAgICB3cml0ZUNoYXJDb2RlKGNoYXJfYik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSB0YWI6CiAgICAgICAgICAgIHdyaXRlQ2hhckNvZGUoY2hhcl90KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIG5ld2xpbmU6CiAgICAgICAgICAgIHdyaXRlQ2hhckNvZGUoY2hhcl9uKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIGZvcm1GZWVkOgogICAgICAgICAgICB3cml0ZUNoYXJDb2RlKGNoYXJfZik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBjYXJyaWFnZVJldHVybjoKICAgICAgICAgICAgd3JpdGVDaGFyQ29kZShjaGFyX3IpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdyaXRlQ2hhckNvZGUoY2hhcl91KTsKICAgICAgICAgICAgd3JpdGVDaGFyQ29kZShjaGFyXzApOwogICAgICAgICAgICB3cml0ZUNoYXJDb2RlKGNoYXJfMCk7CiAgICAgICAgICAgIHdyaXRlQ2hhckNvZGUoaGV4RGlnaXQoKGNoYXJDb2RlID4+IDQpICYgMHhmKSk7CiAgICAgICAgICAgIHdyaXRlQ2hhckNvZGUoaGV4RGlnaXQoY2hhckNvZGUgJiAweGYpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoYXJDb2RlID09IHF1b3RlIHx8IGNoYXJDb2RlID09IGJhY2tzbGFzaCkgewogICAgICAgIGlmIChpID4gb2Zmc2V0KSB3cml0ZVN0cmluZ1NsaWNlKHMsIG9mZnNldCwgaSk7CiAgICAgICAgb2Zmc2V0ID0gaSArIDE7CiAgICAgICAgd3JpdGVDaGFyQ29kZShiYWNrc2xhc2gpOwogICAgICAgIHdyaXRlQ2hhckNvZGUoY2hhckNvZGUpOwogICAgICB9CiAgICB9CiAgICBpZiAob2Zmc2V0ID09IDApIHsKICAgICAgd3JpdGVTdHJpbmcocyk7CiAgICB9IGVsc2UgaWYgKG9mZnNldCA8IGxlbmd0aCkgewogICAgICB3cml0ZVN0cmluZ1NsaWNlKHMsIG9mZnNldCwgbGVuZ3RoKTsKICAgIH0KICB9CgogIC8vLyBDaGVjayBpZiBhbiBlbmNvdW50ZXJlZCBvYmplY3QgaXMgYWxyZWFkeSBiZWluZyB0cmF2ZXJzZWQuCiAgLy8vCiAgLy8vIFJlY29yZHMgdGhlIG9iamVjdCBpZiBpdCBpc24ndCBhbHJlYWR5IHNlZW4uIFNob3VsZCBoYXZlIGEgbWF0Y2hpbmcgY2FsbCB0bwogIC8vLyBbX3JlbW92ZVNlZW5dIHdoZW4gdGhlIG9iamVjdCBpcyBubyBsb25nZXIgYmVpbmcgdHJhdmVyc2VkLgogIHZvaWQgX2NoZWNrQ3ljbGUob2JqZWN0KSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9zZWVuLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChpZGVudGljYWwob2JqZWN0LCBfc2VlbltpXSkpIHsKICAgICAgICB0aHJvdyBKc29uQ3ljbGljRXJyb3Iob2JqZWN0KTsKICAgICAgfQogICAgfQogICAgX3NlZW4uYWRkKG9iamVjdCk7CiAgfQoKICAvLy8gUmVtb3ZlIFtvYmplY3RdIGZyb20gdGhlIGxpc3Qgb2YgY3VycmVudGx5IHRyYXZlcnNlZCBvYmplY3RzLgogIC8vLwogIC8vLyBTaG91bGQgYmUgY2FsbGVkIGluIHRoZSBvcHBvc2l0ZSBvcmRlciBvZiB0aGUgbWF0Y2hpbmcgW19jaGVja0N5Y2xlXQogIC8vLyBjYWxscy4KICB2b2lkIF9yZW1vdmVTZWVuKG9iamVjdCkgewogICAgYXNzZXJ0KF9zZWVuLmlzTm90RW1wdHkpOwogICAgYXNzZXJ0KGlkZW50aWNhbChfc2Vlbi5sYXN0LCBvYmplY3QpKTsKICAgIF9zZWVuLnJlbW92ZUxhc3QoKTsKICB9CgogIC8vLyBXcml0ZSBhbiBvYmplY3QuCiAgLy8vCiAgLy8vIElmIFtvYmplY3RdIGlzbid0IGRpcmVjdGx5IGVuY29kYWJsZSwgdGhlIFtfdG9FbmNvZGFibGVdIGZ1bmN0aW9uIGdldHMgb25lCiAgLy8vIGNoYW5jZSB0byByZXR1cm4gYSByZXBsYWNlbWVudCB3aGljaCBpcyBlbmNvZGFibGUuCiAgdm9pZCB3cml0ZU9iamVjdChvYmplY3QpIHsKICAgIC8vIFRyaWVzIHN0cmluZ2lmeWluZyBvYmplY3QgZGlyZWN0bHkuIElmIGl0J3Mgbm90IGEgc2ltcGxlIHZhbHVlLCBMaXN0IG9yCiAgICAvLyBNYXAsIGNhbGwgdG9Kc29uKCkgdG8gZ2V0IGEgY3VzdG9tIHJlcHJlc2VudGF0aW9uIGFuZCB0cnkgc2VyaWFsaXppbmcKICAgIC8vIHRoYXQuCiAgICBpZiAod3JpdGVKc29uVmFsdWUob2JqZWN0KSkgcmV0dXJuOwogICAgX2NoZWNrQ3ljbGUob2JqZWN0KTsKICAgIHRyeSB7CiAgICAgIHZhciBjdXN0b21Kc29uID0gX3RvRW5jb2RhYmxlKG9iamVjdCk7CiAgICAgIGlmICghd3JpdGVKc29uVmFsdWUoY3VzdG9tSnNvbikpIHsKICAgICAgICB0aHJvdyBKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvcihvYmplY3QsIHBhcnRpYWxSZXN1bHQ6IF9wYXJ0aWFsUmVzdWx0KTsKICAgICAgfQogICAgICBfcmVtb3ZlU2VlbihvYmplY3QpOwogICAgfSBjYXRjaCAoZSkgewogICAgICB0aHJvdyBKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvcihvYmplY3QsCiAgICAgICAgICBjYXVzZTogZSwgcGFydGlhbFJlc3VsdDogX3BhcnRpYWxSZXN1bHQpOwogICAgfQogIH0KCiAgLy8vIFNlcmlhbGl6ZSBhIFtudW1dLCBbU3RyaW5nXSwgW2Jvb2xdLCBbTnVsbF0sIFtMaXN0XSBvciBbTWFwXSB2YWx1ZS4KICAvLy8KICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBvbmUgb2YgdGhlc2UgdHlwZXMsIGFuZCBmYWxzZSBpZiBub3QuCiAgLy8vIElmIGEgdmFsdWUgaXMgYm90aCBhIFtMaXN0XSBhbmQgYSBbTWFwXSwgaXQncyBzZXJpYWxpemVkIGFzIGEgW0xpc3RdLgogIGJvb2wgd3JpdGVKc29uVmFsdWUob2JqZWN0KSB7CiAgICBpZiAob2JqZWN0IGlzIG51bSkgewogICAgICBpZiAoIW9iamVjdC5pc0Zpbml0ZSkgcmV0dXJuIGZhbHNlOwogICAgICB3cml0ZU51bWJlcihvYmplY3QpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKG9iamVjdCwgdHJ1ZSkpIHsKICAgICAgd3JpdGVTdHJpbmcoJ3RydWUnKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChvYmplY3QsIGZhbHNlKSkgewogICAgICB3cml0ZVN0cmluZygnZmFsc2UnKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKG9iamVjdCA9PSBudWxsKSB7CiAgICAgIHdyaXRlU3RyaW5nKCdudWxsJyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChvYmplY3QgaXMgU3RyaW5nKSB7CiAgICAgIHdyaXRlU3RyaW5nKCciJyk7CiAgICAgIHdyaXRlU3RyaW5nQ29udGVudChvYmplY3QpOwogICAgICB3cml0ZVN0cmluZygnIicpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAob2JqZWN0IGlzIExpc3QpIHsKICAgICAgX2NoZWNrQ3ljbGUob2JqZWN0KTsKICAgICAgd3JpdGVMaXN0KG9iamVjdCk7CiAgICAgIF9yZW1vdmVTZWVuKG9iamVjdCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChvYmplY3QgaXMgTWFwKSB7CiAgICAgIF9jaGVja0N5Y2xlKG9iamVjdCk7CiAgICAgIC8vIHdyaXRlTWFwIGNhbiBmYWlsIGlmIGtleXMgYXJlIG5vdCBhbGwgc3RyaW5ncy4KICAgICAgdmFyIHN1Y2Nlc3MgPSB3cml0ZU1hcChvYmplY3QpOwogICAgICBfcmVtb3ZlU2VlbihvYmplY3QpOwogICAgICByZXR1cm4gc3VjY2VzczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vLyBTZXJpYWxpemUgYSBbTGlzdF0uCiAgdm9pZCB3cml0ZUxpc3QoTGlzdCBsaXN0KSB7CiAgICB3cml0ZVN0cmluZygnWycpOwogICAgaWYgKGxpc3QuaXNOb3RFbXB0eSkgewogICAgICB3cml0ZU9iamVjdChsaXN0WzBdKTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgd3JpdGVTdHJpbmcoJywnKTsKICAgICAgICB3cml0ZU9iamVjdChsaXN0W2ldKTsKICAgICAgfQogICAgfQogICAgd3JpdGVTdHJpbmcoJ10nKTsKICB9CgogIC8vLyBTZXJpYWxpemUgYSBbTWFwXS4KICBib29sIHdyaXRlTWFwKE1hcCBtYXApIHsKICAgIGlmIChtYXAuaXNFbXB0eSkgewogICAgICB3cml0ZVN0cmluZygie30iKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB2YXIga2V5VmFsdWVMaXN0ID0gTGlzdChtYXAubGVuZ3RoICogMik7CiAgICB2YXIgaSA9IDA7CiAgICB2YXIgYWxsU3RyaW5nS2V5cyA9IHRydWU7CiAgICBtYXAuZm9yRWFjaCgoa2V5LCB2YWx1ZSkgewogICAgICBpZiAoa2V5IGlzISBTdHJpbmcpIHsKICAgICAgICBhbGxTdHJpbmdLZXlzID0gZmFsc2U7CiAgICAgIH0KICAgICAga2V5VmFsdWVMaXN0W2krK10gPSBrZXk7CiAgICAgIGtleVZhbHVlTGlzdFtpKytdID0gdmFsdWU7CiAgICB9KTsKICAgIGlmICghYWxsU3RyaW5nS2V5cykgcmV0dXJuIGZhbHNlOwogICAgd3JpdGVTdHJpbmcoJ3snKTsKICAgIHZhciBzZXBhcmF0b3IgPSAnIic7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleVZhbHVlTGlzdC5sZW5ndGg7IGkgKz0gMikgewogICAgICB3cml0ZVN0cmluZyhzZXBhcmF0b3IpOwogICAgICBzZXBhcmF0b3IgPSAnLCInOwogICAgICB3cml0ZVN0cmluZ0NvbnRlbnQoa2V5VmFsdWVMaXN0W2ldKTsKICAgICAgd3JpdGVTdHJpbmcoJyI6Jyk7CiAgICAgIHdyaXRlT2JqZWN0KGtleVZhbHVlTGlzdFtpICsgMV0pOwogICAgfQogICAgd3JpdGVTdHJpbmcoJ30nKTsKICAgIHJldHVybiB0cnVlOwogIH0KfQoKLy8vIEEgbW9kaWZpY2F0aW9uIG9mIFtfSnNvblN0cmluZ2lmaWVyXSB3aGljaCBpbmRlbnRzIHRoZSBjb250ZW50cyBvZiBbTGlzdF0gYW5kCi8vLyBbTWFwXSBvYmplY3RzIHVzaW5nIHRoZSBzcGVjaWZpZWQgaW5kZW50IHZhbHVlLgovLy8KLy8vIFN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCBbd3JpdGVJbmRlbnRhdGlvbl0uCmFic3RyYWN0IGNsYXNzIF9Kc29uUHJldHR5UHJpbnRNaXhpbiBpbXBsZW1lbnRzIF9Kc29uU3RyaW5naWZpZXIgewogIGludCBfaW5kZW50TGV2ZWwgPSAwOwoKICAvLy8gQWRkIFtpbmRlbnRMZXZlbF0gaW5kZW50YXRpb25zIHRvIHRoZSBKU09OIG91dHB1dC4KICB2b2lkIHdyaXRlSW5kZW50YXRpb24oaW50IGluZGVudExldmVsKTsKCiAgdm9pZCB3cml0ZUxpc3QoTGlzdCBsaXN0KSB7CiAgICBpZiAobGlzdC5pc0VtcHR5KSB7CiAgICAgIHdyaXRlU3RyaW5nKCdbXScpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVTdHJpbmcoJ1tcbicpOwogICAgICBfaW5kZW50TGV2ZWwrKzsKICAgICAgd3JpdGVJbmRlbnRhdGlvbihfaW5kZW50TGV2ZWwpOwogICAgICB3cml0ZU9iamVjdChsaXN0WzBdKTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgd3JpdGVTdHJpbmcoJyxcbicpOwogICAgICAgIHdyaXRlSW5kZW50YXRpb24oX2luZGVudExldmVsKTsKICAgICAgICB3cml0ZU9iamVjdChsaXN0W2ldKTsKICAgICAgfQogICAgICB3cml0ZVN0cmluZygnXG4nKTsKICAgICAgX2luZGVudExldmVsLS07CiAgICAgIHdyaXRlSW5kZW50YXRpb24oX2luZGVudExldmVsKTsKICAgICAgd3JpdGVTdHJpbmcoJ10nKTsKICAgIH0KICB9CgogIGJvb2wgd3JpdGVNYXAoTWFwIG1hcCkgewogICAgaWYgKG1hcC5pc0VtcHR5KSB7CiAgICAgIHdyaXRlU3RyaW5nKCJ7fSIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHZhciBrZXlWYWx1ZUxpc3QgPSBMaXN0KG1hcC5sZW5ndGggKiAyKTsKICAgIHZhciBpID0gMDsKICAgIHZhciBhbGxTdHJpbmdLZXlzID0gdHJ1ZTsKICAgIG1hcC5mb3JFYWNoKChrZXksIHZhbHVlKSB7CiAgICAgIGlmIChrZXkgaXMhIFN0cmluZykgewogICAgICAgIGFsbFN0cmluZ0tleXMgPSBmYWxzZTsKICAgICAgfQogICAgICBrZXlWYWx1ZUxpc3RbaSsrXSA9IGtleTsKICAgICAga2V5VmFsdWVMaXN0W2krK10gPSB2YWx1ZTsKICAgIH0pOwogICAgaWYgKCFhbGxTdHJpbmdLZXlzKSByZXR1cm4gZmFsc2U7CiAgICB3cml0ZVN0cmluZygne1xuJyk7CiAgICBfaW5kZW50TGV2ZWwrKzsKICAgIHZhciBzZXBhcmF0b3IgPSAiIjsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5VmFsdWVMaXN0Lmxlbmd0aDsgaSArPSAyKSB7CiAgICAgIHdyaXRlU3RyaW5nKHNlcGFyYXRvcik7CiAgICAgIHNlcGFyYXRvciA9ICIsXG4iOwogICAgICB3cml0ZUluZGVudGF0aW9uKF9pbmRlbnRMZXZlbCk7CiAgICAgIHdyaXRlU3RyaW5nKCciJyk7CiAgICAgIHdyaXRlU3RyaW5nQ29udGVudChrZXlWYWx1ZUxpc3RbaV0pOwogICAgICB3cml0ZVN0cmluZygnIjogJyk7CiAgICAgIHdyaXRlT2JqZWN0KGtleVZhbHVlTGlzdFtpICsgMV0pOwogICAgfQogICAgd3JpdGVTdHJpbmcoJ1xuJyk7CiAgICBfaW5kZW50TGV2ZWwtLTsKICAgIHdyaXRlSW5kZW50YXRpb24oX2luZGVudExldmVsKTsKICAgIHdyaXRlU3RyaW5nKCd9Jyk7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KCi8vLyBBIHNwZWNpYWxpemF0aW9uIG9mIFtfSnNvblN0cmluZ2lmaWVyXSB0aGF0IHdyaXRlcyBpdHMgSlNPTiB0byBhIHN0cmluZy4KY2xhc3MgX0pzb25TdHJpbmdTdHJpbmdpZmllciBleHRlbmRzIF9Kc29uU3RyaW5naWZpZXIgewogIGZpbmFsIFN0cmluZ1NpbmsgX3Npbms7CgogIF9Kc29uU3RyaW5nU3RyaW5naWZpZXIodGhpcy5fc2luaywgZHluYW1pYyBGdW5jdGlvbihkeW5hbWljKSBfdG9FbmNvZGFibGUpCiAgICAgIDogc3VwZXIoX3RvRW5jb2RhYmxlKTsKCiAgLy8vIENvbnZlcnQgb2JqZWN0IHRvIGEgc3RyaW5nLgogIC8vLwogIC8vLyBUaGUgW3RvRW5jb2RhYmxlXSBmdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnQgbm9uLWVuY29kYWJsZSBvYmplY3RzCiAgLy8vIHRvIGVuY29kYWJsZSBvbmVzLgogIC8vLwogIC8vLyBJZiBbaW5kZW50XSBpcyBub3QgYG51bGxgLCB0aGUgcmVzdWx0aW5nIEpTT04gd2lsbCBiZSAicHJldHR5LXByaW50ZWQiCiAgLy8vIHdpdGggbmV3bGluZXMgYW5kIGluZGVudGF0aW9uLiBUaGUgYGluZGVudGAgc3RyaW5nIGlzIGFkZGVkIGFzIGluZGVudGF0aW9uCiAgLy8vIGZvciBlYWNoIGluZGVudGF0aW9uIGxldmVsLiBJdCBzaG91bGQgb25seSBjb250YWluIHZhbGlkIEpTT04gd2hpdGVzcGFjZQogIC8vLyBjaGFyYWN0ZXJzIChzcGFjZSwgdGFiLCBjYXJyaWFnZSByZXR1cm4gb3IgbGluZSBmZWVkKS4KICBzdGF0aWMgU3RyaW5nIHN0cmluZ2lmeShvYmplY3QsIHRvRW5jb2RhYmxlKG8pLCBTdHJpbmcgaW5kZW50KSB7CiAgICB2YXIgb3V0cHV0ID0gU3RyaW5nQnVmZmVyKCk7CiAgICBwcmludE9uKG9iamVjdCwgb3V0cHV0LCB0b0VuY29kYWJsZSwgaW5kZW50KTsKICAgIHJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKICB9CgogIC8vLyBDb252ZXJ0IG9iamVjdCB0byBhIHN0cmluZywgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIFtvdXRwdXRdIHNpbmsuCiAgLy8vCiAgLy8vIFRoZSByZXN1bHQgaXMgd3JpdHRlbiBwaWVjZW1hbGx5IHRvIHRoZSBzaW5rLgogIHN0YXRpYyB2b2lkIHByaW50T24oCiAgICAgIG9iamVjdCwgU3RyaW5nU2luayBvdXRwdXQsIHRvRW5jb2RhYmxlKG8pLCBTdHJpbmcgaW5kZW50KSB7CiAgICBfSnNvblN0cmluZ2lmaWVyIHN0cmluZ2lmaWVyOwogICAgaWYgKGluZGVudCA9PSBudWxsKSB7CiAgICAgIHN0cmluZ2lmaWVyID0gX0pzb25TdHJpbmdTdHJpbmdpZmllcihvdXRwdXQsIHRvRW5jb2RhYmxlKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0cmluZ2lmaWVyID0gX0pzb25TdHJpbmdTdHJpbmdpZmllclByZXR0eShvdXRwdXQsIHRvRW5jb2RhYmxlLCBpbmRlbnQpOwogICAgfQogICAgc3RyaW5naWZpZXIud3JpdGVPYmplY3Qob2JqZWN0KTsKICB9CgogIFN0cmluZyBnZXQgX3BhcnRpYWxSZXN1bHQgPT4gX3NpbmsgaXMgU3RyaW5nQnVmZmVyID8gX3NpbmsudG9TdHJpbmcoKSA6IG51bGw7CgogIHZvaWQgd3JpdGVOdW1iZXIobnVtIG51bWJlcikgewogICAgX3Npbmsud3JpdGUobnVtYmVyLnRvU3RyaW5nKCkpOwogIH0KCiAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CiAgICBfc2luay53cml0ZShzdHJpbmcpOwogIH0KCiAgdm9pZCB3cml0ZVN0cmluZ1NsaWNlKFN0cmluZyBzdHJpbmcsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgX3Npbmsud3JpdGUoc3RyaW5nLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7CiAgfQoKICB2b2lkIHdyaXRlQ2hhckNvZGUoaW50IGNoYXJDb2RlKSB7CiAgICBfc2luay53cml0ZUNoYXJDb2RlKGNoYXJDb2RlKTsKICB9Cn0KCmNsYXNzIF9Kc29uU3RyaW5nU3RyaW5naWZpZXJQcmV0dHkgZXh0ZW5kcyBfSnNvblN0cmluZ1N0cmluZ2lmaWVyCiAgICB3aXRoIF9Kc29uUHJldHR5UHJpbnRNaXhpbiB7CiAgZmluYWwgU3RyaW5nIF9pbmRlbnQ7CgogIF9Kc29uU3RyaW5nU3RyaW5naWZpZXJQcmV0dHkoU3RyaW5nU2luayBzaW5rLCB0b0VuY29kYWJsZShvKSwgdGhpcy5faW5kZW50KQogICAgICA6IHN1cGVyKHNpbmssIHRvRW5jb2RhYmxlKTsKCiAgdm9pZCB3cml0ZUluZGVudGF0aW9uKGludCBjb3VudCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB3cml0ZVN0cmluZyhfaW5kZW50KTsKICB9Cn0KCi8vLyBTcGVjaWFsaXphdGlvbiBvZiBbX0pzb25TdHJpbmdpZmllcl0gdGhhdCB3cml0ZXMgdGhlIEpTT04gYXMgVVRGLTguCi8vLwovLy8gVGhlIEpTT04gdGV4dCBpcyBVVEYtOCBlbmNvZGVkIGFuZCB3cml0dGVuIHRvIFtVaW50OExpc3RdIGJ1ZmZlcnMuCi8vLyBUaGUgYnVmZmVycyBhcmUgdGhlbiBwYXNzZWQgYmFjayB0byBhIHVzZXIgcHJvdmlkZWQgY2FsbGJhY2sgbWV0aG9kLgpjbGFzcyBfSnNvblV0ZjhTdHJpbmdpZmllciBleHRlbmRzIF9Kc29uU3RyaW5naWZpZXIgewogIGZpbmFsIGludCBidWZmZXJTaXplOwogIGZpbmFsIHZvaWQgRnVuY3Rpb24oVWludDhMaXN0IGxpc3QsIGludCBzdGFydCwgaW50IGVuZCkgYWRkQ2h1bms7CiAgVWludDhMaXN0IGJ1ZmZlcjsKICBpbnQgaW5kZXggPSAwOwoKICBfSnNvblV0ZjhTdHJpbmdpZmllcih0b0VuY29kYWJsZShvKSwgdGhpcy5idWZmZXJTaXplLCB0aGlzLmFkZENodW5rKQogICAgICA6IGJ1ZmZlciA9IFVpbnQ4TGlzdChidWZmZXJTaXplKSwKICAgICAgICBzdXBlcih0b0VuY29kYWJsZSk7CgogIC8vLyBDb252ZXJ0IFtvYmplY3RdIHRvIFVURi04IGVuY29kZWQgSlNPTi4KICAvLy8KICAvLy8gQ2FsbHMgW2FkZENodW5rXSB3aXRoIHNsaWNlcyBvZiBVVEYtOCBjb2RlIHVuaXRzLgogIC8vLyBUaGVzZSB3aWxsIHR5cGljYWxseSBoYXZlIHNpemUgW2J1ZmZlclNpemVdLCBidXQgbWF5IGJlIHNob3J0ZXIuCiAgLy8vIFRoZSBidWZmZXJzIGFyZSBub3QgcmV1c2VkLCBzbyB0aGUgW2FkZENodW5rXSBjYWxsIG1heSBrZWVwIGFuZCByZXVzZSB0aGUKICAvLy8gY2h1bmtzLgogIC8vLwogIC8vLyBJZiBbaW5kZW50XSBpcyBub24tYG51bGxgLCB0aGUgcmVzdWx0IHdpbGwgYmUgInByZXR0eS1wcmludGVkIiB3aXRoIGV4dHJhCiAgLy8vIG5ld2xpbmVzIGFuZCBpbmRlbnRhdGlvbiwgdXNpbmcgW2luZGVudF0gYXMgdGhlIGluZGVudGF0aW9uLgogIHN0YXRpYyB2b2lkIHN0cmluZ2lmeShPYmplY3Qgb2JqZWN0LCBMaXN0PGludD4gaW5kZW50LCB0b0VuY29kYWJsZShvKSwKICAgICAgaW50IGJ1ZmZlclNpemUsIHZvaWQgYWRkQ2h1bmsoVWludDhMaXN0IGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQpKSB7CiAgICBfSnNvblV0ZjhTdHJpbmdpZmllciBzdHJpbmdpZmllcjsKICAgIGlmIChpbmRlbnQgIT0gbnVsbCkgewogICAgICBzdHJpbmdpZmllciA9CiAgICAgICAgICBfSnNvblV0ZjhTdHJpbmdpZmllclByZXR0eSh0b0VuY29kYWJsZSwgaW5kZW50LCBidWZmZXJTaXplLCBhZGRDaHVuayk7CiAgICB9IGVsc2UgewogICAgICBzdHJpbmdpZmllciA9IF9Kc29uVXRmOFN0cmluZ2lmaWVyKHRvRW5jb2RhYmxlLCBidWZmZXJTaXplLCBhZGRDaHVuayk7CiAgICB9CiAgICBzdHJpbmdpZmllci53cml0ZU9iamVjdChvYmplY3QpOwogICAgc3RyaW5naWZpZXIuZmx1c2goKTsKICB9CgogIC8vLyBNdXN0IGJlIGNhbGxlZCBhdCB0aGUgZW5kIHRvIHB1c2ggdGhlIGxhc3QgY2h1bmsgdG8gdGhlIFthZGRDaHVua10KICAvLy8gY2FsbGJhY2suCiAgdm9pZCBmbHVzaCgpIHsKICAgIGlmIChpbmRleCA+IDApIHsKICAgICAgYWRkQ2h1bmsoYnVmZmVyLCAwLCBpbmRleCk7CiAgICB9CiAgICBidWZmZXIgPSBudWxsOwogICAgaW5kZXggPSAwOwogIH0KCiAgU3RyaW5nIGdldCBfcGFydGlhbFJlc3VsdCA9PiBudWxsOwoKICB2b2lkIHdyaXRlTnVtYmVyKG51bSBudW1iZXIpIHsKICAgIHdyaXRlQXNjaWlTdHJpbmcobnVtYmVyLnRvU3RyaW5nKCkpOwogIH0KCiAgLy8vIFdyaXRlIGEgc3RyaW5nIHRoYXQgaXMga25vd24gdG8gbm90IGhhdmUgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuCiAgdm9pZCB3cml0ZUFzY2lpU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKICAgIC8vIFRPRE8obHJuKTogT3B0aW1pemUgYnkgY29weWluZyBkaXJlY3RseSBpbnRvIGJ1ZmZlciBpbnN0ZWFkIG9mIGdvaW5nCiAgICAvLyB0aHJvdWdoIHdyaXRlQ2hhckNvZGU7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY2hhciA9IHN0cmluZy5jb2RlVW5pdEF0KGkpOwogICAgICBhc3NlcnQoY2hhciA8PSAweDdmKTsKICAgICAgd3JpdGVCeXRlKGNoYXIpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CiAgICB3cml0ZVN0cmluZ1NsaWNlKHN0cmluZywgMCwgc3RyaW5nLmxlbmd0aCk7CiAgfQoKICB2b2lkIHdyaXRlU3RyaW5nU2xpY2UoU3RyaW5nIHN0cmluZywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAvLyBUT0RPKGxybik6IE9wdGltaXplIGJ5IGNvcHlpbmcgZGlyZWN0bHkgaW50byBidWZmZXIgaW5zdGVhZCBvZiBnb2luZwogICAgLy8gdGhyb3VnaCB3cml0ZUNoYXJDb2RlL3dyaXRlQnl0ZS4gQXNzdW1wdGlvbiBpcyB0aGUgbW9zdCBjaGFyYWN0ZXJzCiAgICAvLyBpbiBzdGFyaW5ncyBhcmUgcGxhaW4gQVNDSUkuCiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgY2hhciA9IHN0cmluZy5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciA8PSAweDdmKSB7CiAgICAgICAgd3JpdGVCeXRlKGNoYXIpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICgoY2hhciAmIDB4RkMwMCkgPT0gMHhEODAwICYmIGkgKyAxIDwgZW5kKSB7CiAgICAgICAgICAvLyBMZWFkIHN1cnJvZ2F0ZS4KICAgICAgICAgIHZhciBuZXh0Q2hhciA9IHN0cmluZy5jb2RlVW5pdEF0KGkgKyAxKTsKICAgICAgICAgIGlmICgobmV4dENoYXIgJiAweEZDMDApID09IDB4REMwMCkgewogICAgICAgICAgICAvLyBUYWlsIHN1cnJvZ2F0ZS4KICAgICAgICAgICAgY2hhciA9IDB4MTAwMDAgKyAoKGNoYXIgJiAweDNmZikgPDwgMTApICsgKG5leHRDaGFyICYgMHgzZmYpOwogICAgICAgICAgICB3cml0ZUZvdXJCeXRlQ2hhckNvZGUoY2hhcik7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHdyaXRlTXVsdGlCeXRlQ2hhckNvZGUoY2hhcik7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgd3JpdGVDaGFyQ29kZShpbnQgY2hhckNvZGUpIHsKICAgIGlmIChjaGFyQ29kZSA8PSAweDdmKSB7CiAgICAgIHdyaXRlQnl0ZShjaGFyQ29kZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHdyaXRlTXVsdGlCeXRlQ2hhckNvZGUoY2hhckNvZGUpOwogIH0KCiAgdm9pZCB3cml0ZU11bHRpQnl0ZUNoYXJDb2RlKGludCBjaGFyQ29kZSkgewogICAgaWYgKGNoYXJDb2RlIDw9IDB4N2ZmKSB7CiAgICAgIHdyaXRlQnl0ZSgweEMwIHwgKGNoYXJDb2RlID4+IDYpKTsKICAgICAgd3JpdGVCeXRlKDB4ODAgfCAoY2hhckNvZGUgJiAweDNmKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChjaGFyQ29kZSA8PSAweGZmZmYpIHsKICAgICAgd3JpdGVCeXRlKDB4RTAgfCAoY2hhckNvZGUgPj4gMTIpKTsKICAgICAgd3JpdGVCeXRlKDB4ODAgfCAoKGNoYXJDb2RlID4+IDYpICYgMHgzZikpOwogICAgICB3cml0ZUJ5dGUoMHg4MCB8IChjaGFyQ29kZSAmIDB4M2YpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgd3JpdGVGb3VyQnl0ZUNoYXJDb2RlKGNoYXJDb2RlKTsKICB9CgogIHZvaWQgd3JpdGVGb3VyQnl0ZUNoYXJDb2RlKGludCBjaGFyQ29kZSkgewogICAgYXNzZXJ0KGNoYXJDb2RlIDw9IDB4MTBmZmZmKTsKICAgIHdyaXRlQnl0ZSgweEYwIHwgKGNoYXJDb2RlID4+IDE4KSk7CiAgICB3cml0ZUJ5dGUoMHg4MCB8ICgoY2hhckNvZGUgPj4gMTIpICYgMHgzZikpOwogICAgd3JpdGVCeXRlKDB4ODAgfCAoKGNoYXJDb2RlID4+IDYpICYgMHgzZikpOwogICAgd3JpdGVCeXRlKDB4ODAgfCAoY2hhckNvZGUgJiAweDNmKSk7CiAgfQoKICB2b2lkIHdyaXRlQnl0ZShpbnQgYnl0ZSkgewogICAgYXNzZXJ0KGJ5dGUgPD0gMHhmZik7CiAgICBpZiAoaW5kZXggPT0gYnVmZmVyLmxlbmd0aCkgewogICAgICBhZGRDaHVuayhidWZmZXIsIDAsIGluZGV4KTsKICAgICAgYnVmZmVyID0gVWludDhMaXN0KGJ1ZmZlclNpemUpOwogICAgICBpbmRleCA9IDA7CiAgICB9CiAgICBidWZmZXJbaW5kZXgrK10gPSBieXRlOwogIH0KfQoKLy8vIFByZXR0eS1wcmludGluZyB2ZXJzaW9uIG9mIFtfSnNvblV0ZjhTdHJpbmdpZmllcl0uCmNsYXNzIF9Kc29uVXRmOFN0cmluZ2lmaWVyUHJldHR5IGV4dGVuZHMgX0pzb25VdGY4U3RyaW5naWZpZXIKICAgIHdpdGggX0pzb25QcmV0dHlQcmludE1peGluIHsKICBmaW5hbCBMaXN0PGludD4gaW5kZW50OwogIF9Kc29uVXRmOFN0cmluZ2lmaWVyUHJldHR5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Ly9zZGsvbGliL2NvbnZlcnQvbGF0aW4xLmRhcnSYWS8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29udmVydDsKCi8vLyBBbiBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW0xhdGluMUNvZGVjXS4KLy8vCi8vLyBUaGlzIGluc3RhbmNlIHByb3ZpZGVzIGEgY29udmVuaWVudCBhY2Nlc3MgdG8gdGhlIG1vc3QgY29tbW9uIElTTyBMYXRpbiAxCi8vLyB1c2UgY2FzZXMuCi8vLwovLy8gRXhhbXBsZXM6Ci8vLyBgYGBkYXJ0Ci8vLyB2YXIgZW5jb2RlZCA9IGxhdGluMS5lbmNvZGUoImJsw6Viw6ZyZ3LDuGQiKTsKLy8vIHZhciBkZWNvZGVkID0gbGF0aW4xLmRlY29kZShbMHg2MiwgMHg2YywgMHhlNSwgMHg2MiwgMHhlNiwKLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MiwgMHg2NywgMHg3MiwgMHhmOCwgMHg2NF0pOwovLy8gYGBgCmNvbnN0IExhdGluMUNvZGVjIGxhdGluMSA9IExhdGluMUNvZGVjKCk7Cgpjb25zdCBpbnQgX2xhdGluMU1hc2sgPSAweEZGOwoKLy8vIEEgW0xhdGluMUNvZGVjXSBlbmNvZGVzIHN0cmluZ3MgdG8gSVNPIExhdGluLTEgKGFrYSBJU08tODg1OS0xKSBieXRlcwovLy8gYW5kIGRlY29kZXMgTGF0aW4tMSBieXRlcyB0byBzdHJpbmdzLgpjbGFzcyBMYXRpbjFDb2RlYyBleHRlbmRzIEVuY29kaW5nIHsKICBmaW5hbCBib29sIF9hbGxvd0ludmFsaWQ7CgogIC8vLyBJbnN0YW50aWF0ZXMgYSBuZXcgW0xhdGluMUNvZGVjXS4KICAvLy8KICAvLy8gSWYgW2FsbG93SW52YWxpZF0gaXMgdHJ1ZSwgdGhlIFtkZWNvZGVdIG1ldGhvZCBhbmQgdGhlIGNvbnZlcnRlcgogIC8vLyByZXR1cm5lZCBieSBbZGVjb2Rlcl0gd2lsbCBkZWZhdWx0IHRvIGFsbG93aW5nIGludmFsaWQgdmFsdWVzLiBJbnZhbGlkCiAgLy8vIHZhbHVlcyBhcmUgZGVjb2RlZCBpbnRvIHRoZSBVbmljb2RlIFJlcGxhY2VtZW50IGNoYXJhY3RlciAoVStGRkZEKS4KICAvLy8gQ2FsbHMgdG8gdGhlIFtkZWNvZGVdIG1ldGhvZCBjYW4gb3ZlcnJpZGUgdGhpcyBkZWZhdWx0LgogIC8vLwogIC8vLyBFbmNvZGVycyB3aWxsIG5vdCBhY2NlcHQgaW52YWxpZCAobm9uIExhdGluLTEpIGNoYXJhY3RlcnMuCiAgY29uc3QgTGF0aW4xQ29kZWMoe2Jvb2wgYWxsb3dJbnZhbGlkID0gZmFsc2V9KSA6IF9hbGxvd0ludmFsaWQgPSBhbGxvd0ludmFsaWQ7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGlzIGNvZGVjLCAiaXNvLTg4NTktMSIuCiAgU3RyaW5nIGdldCBuYW1lID0+ICJpc28tODg1OS0xIjsKCiAgVWludDhMaXN0IGVuY29kZShTdHJpbmcgc291cmNlKSA9PiBlbmNvZGVyLmNvbnZlcnQoc291cmNlKTsKCiAgLy8vIERlY29kZXMgdGhlIExhdGluLTEgW2J5dGVzXSAoYSBsaXN0IG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzKSB0byB0aGUKICAvLy8gY29ycmVzcG9uZGluZyBzdHJpbmcuCiAgLy8vCiAgLy8vIElmIFtieXRlc10gY29udGFpbnMgdmFsdWVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgcmFuZ2UgMCAuLiAyNTUsIHRoZSBkZWNvZGVyCiAgLy8vIHdpbGwgZXZlbnR1YWxseSB0aHJvdyBhIFtGb3JtYXRFeGNlcHRpb25dLgogIC8vLwogIC8vLyBJZiBbYWxsb3dJbnZhbGlkXSBpcyBub3QgcHJvdmlkZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSB1c2VkIHRvIGNyZWF0ZQogIC8vLyB0aGlzIFtMYXRpbjFDb2RlY10uCiAgU3RyaW5nIGRlY29kZShMaXN0PGludD4gYnl0ZXMsIHtib29sIGFsbG93SW52YWxpZH0pIHsKICAgIGFsbG93SW52YWxpZCA/Pz0gX2FsbG93SW52YWxpZDsKICAgIGlmIChhbGxvd0ludmFsaWQpIHsKICAgICAgcmV0dXJuIGNvbnN0IExhdGluMURlY29kZXIoYWxsb3dJbnZhbGlkOiB0cnVlKS5jb252ZXJ0KGJ5dGVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBjb25zdCBMYXRpbjFEZWNvZGVyKGFsbG93SW52YWxpZDogZmFsc2UpLmNvbnZlcnQoYnl0ZXMpOwogICAgfQogIH0KCiAgTGF0aW4xRW5jb2RlciBnZXQgZW5jb2RlciA9PiBjb25zdCBMYXRpbjFFbmNvZGVyKCk7CgogIExhdGluMURlY29kZXIgZ2V0IGRlY29kZXIgPT4gX2FsbG93SW52YWxpZAogICAgICA/IGNvbnN0IExhdGluMURlY29kZXIoYWxsb3dJbnZhbGlkOiB0cnVlKQogICAgICA6IGNvbnN0IExhdGluMURlY29kZXIoYWxsb3dJbnZhbGlkOiBmYWxzZSk7Cn0KCi8vLyBUaGlzIGNsYXNzIGNvbnZlcnRzIHN0cmluZ3Mgb2Ygb25seSBJU08gTGF0aW4tMSBjaGFyYWN0ZXJzIHRvIGJ5dGVzLgpjbGFzcyBMYXRpbjFFbmNvZGVyIGV4dGVuZHMgX1VuaWNvZGVTdWJzZXRFbmNvZGVyIHsKICBjb25zdCBMYXRpbjFFbmNvZGVyKCkgOiBzdXBlcihfbGF0aW4xTWFzayk7Cn0KCi8vLyBUaGlzIGNsYXNzIGNvbnZlcnRzIExhdGluLTEgYnl0ZXMgKGxpc3RzIG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzKQovLy8gdG8gYSBzdHJpbmcuCmNsYXNzIExhdGluMURlY29kZXIgZXh0ZW5kcyBfVW5pY29kZVN1YnNldERlY29kZXIgewogIC8vLyBJbnN0YW50aWF0ZXMgYSBuZXcgW0xhdGluMURlY29kZXJdLgogIC8vLwogIC8vLyBUaGUgb3B0aW9uYWwgW2FsbG93SW52YWxpZF0gYXJndW1lbnQgZGVmaW5lcyBob3cgW2NvbnZlcnRdIGRlYWxzCiAgLy8vIHdpdGggaW52YWxpZCBieXRlcy4KICAvLy8KICAvLy8gSWYgaXQgaXMgYHRydWVgLCBbY29udmVydF0gcmVwbGFjZXMgaW52YWxpZCBieXRlcyB3aXRoIHRoZSBVbmljb2RlCiAgLy8vIFJlcGxhY2VtZW50IGNoYXJhY3RlciBgVStGRkZEYCAo77+9KS4KICAvLy8gT3RoZXJ3aXNlIGl0IHRocm93cyBhIFtGb3JtYXRFeGNlcHRpb25dLgogIGNvbnN0IExhdGluMURlY29kZXIoe2Jvb2wgYWxsb3dJbnZhbGlkID0gZmFsc2V9KQogICAgICA6IHN1cGVyKGFsbG93SW52YWxpZCwgX2xhdGluMU1hc2spOwoKICAvLy8gU3RhcnRzIGEgY2h1bmtlZCBjb252ZXJzaW9uLgogIC8vLwogIC8vLyBUaGUgY29udmVydGVyIHdvcmtzIG1vcmUgZWZmaWNpZW50bHkgaWYgdGhlIGdpdmVuIFtzaW5rXSBpcyBhCiAgLy8vIFtTdHJpbmdDb252ZXJzaW9uU2lua10uCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxTdHJpbmc+IHNpbmspIHsKICAgIFN0cmluZ0NvbnZlcnNpb25TaW5rIHN0cmluZ1Npbms7CiAgICBpZiAoc2luayBpcyBTdHJpbmdDb252ZXJzaW9uU2luaykgewogICAgICBzdHJpbmdTaW5rID0gc2luazsKICAgIH0gZWxzZSB7CiAgICAgIHN0cmluZ1NpbmsgPSBTdHJpbmdDb252ZXJzaW9uU2luay5mcm9tKHNpbmspOwogICAgfQogICAgLy8gVE9ETyhscm4pOiBVc2Ugc3RyaW5nU2luay5hc1V0ZjE2U2luaygpIGlmIGl0IGJlY29tZXMgYXZhaWxhYmxlLgogICAgaWYgKCFfYWxsb3dJbnZhbGlkKSByZXR1cm4gX0xhdGluMURlY29kZXJTaW5rKHN0cmluZ1NpbmspOwogICAgcmV0dXJuIF9MYXRpbjFBbGxvd0ludmFsaWREZWNvZGVyU2luayhzdHJpbmdTaW5rKTsKICB9Cn0KCmNsYXNzIF9MYXRpbjFEZWNvZGVyU2luayBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2lua0Jhc2UgewogIFN0cmluZ0NvbnZlcnNpb25TaW5rIF9zaW5rOwogIF9MYXRpbjFEZWNvZGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgICBfc2luayA9IG51bGw7CiAgfQoKICB2b2lkIGFkZChMaXN0PGludD4gc291cmNlKSB7CiAgICBhZGRTbGljZShzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgsIGZhbHNlKTsKICB9CgogIHZvaWQgX2FkZFNsaWNlVG9TaW5rKExpc3Q8aW50PiBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIC8vIElmIF9zaW5rIHdhcyBhIFVURi0xNiBjb252ZXJzaW9uIHNpbmssIGp1c3QgYWRkIHRoZSBzbGljZSBkaXJlY3RseSB3aXRoCiAgICAvLyBfc2luay5hZGRTbGljZShzb3VyY2UsIHN0YXJ0LCBlbmQsIGlzTGFzdCkuCiAgICAvLyBUaGUgY29kZSBiZWxvdyBpcyBhbiBtb2RlcmF0ZWx5IHN0dXBpZCB3b3JrYXJvdW5kIHVudGlsIGEgcmVhbAogICAgLy8gc29sdXRpb24gY2FuIGJlIG1hZGUuCiAgICBfc2luay5hZGQoU3RyaW5nLmZyb21DaGFyQ29kZXMoc291cmNlLCBzdGFydCwgZW5kKSk7CiAgICBpZiAoaXNMYXN0KSBjbG9zZSgpOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBzb3VyY2UubGVuZ3RoKTsKICAgIGlmIChzdGFydCA9PSBlbmQpIHJldHVybjsKICAgIGlmIChzb3VyY2UgaXMhIFVpbnQ4TGlzdCkgewogICAgICAvLyBMaXN0IG1heSBjb250YWluIHZhbHVlIG91dHNpZGUgb2YgdGhlIDAuLjI1NSByYW5nZS4gSWYgc28sIHRocm93LgogICAgICAvLyBUZWNobmljYWxseSwgd2UgY291bGQgZXhjdXNlIFVpbnQ4Q2xhbXBlZExpc3QgYXMgd2VsbCwgYnV0IGl0IHVubGlrZWx5CiAgICAgIC8vIHRvIGJlIHJlbGV2YW50LgogICAgICBfY2hlY2tWYWxpZExhdGluMShzb3VyY2UsIHN0YXJ0LCBlbmQpOwogICAgfQogICAgX2FkZFNsaWNlVG9TaW5rKHNvdXJjZSwgc3RhcnQsIGVuZCwgaXNMYXN0KTsKICB9CgogIHN0YXRpYyB2b2lkIF9jaGVja1ZhbGlkTGF0aW4xKExpc3Q8aW50PiBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgdmFyIG1hc2sgPSAwOwogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgbWFzayB8PSBzb3VyY2VbaV07CiAgICB9CiAgICBpZiAobWFzayA+PSAwICYmIG1hc2sgPD0gX2xhdGluMU1hc2spIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgX3JlcG9ydEludmFsaWRMYXRpbjEoc291cmNlLCBzdGFydCwgZW5kKTsgLy8gQWx3YXlzIHRocm93cy4KICB9CgogIHN0YXRpYyB2b2lkIF9yZXBvcnRJbnZhbGlkTGF0aW4xKExpc3Q8aW50PiBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vbi1MYXRpbi0xIGNoYXJhY3RlciBjb2RlLgogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGNoYXIgPSBzb3VyY2VbaV07CiAgICAgIGlmIChjaGFyIDwgMCB8fCBjaGFyID4gX2xhdGluMU1hc2spIHsKICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICJTb3VyY2UgY29udGFpbnMgbm9uLUxhdGluLTEgY2hhcmFjdGVycy4iLCBzb3VyY2UsIGkpOwogICAgICB9CiAgICB9CiAgICAvLyBVbnJlYWNoYWJsZSAtIHdlIG9ubHkgY2FsbCB0aGUgZnVuY3Rpb24gaWYgdGhlIGxvb3AgYWJvdmUgdGhyb3dzLgogICAgYXNzZXJ0KGZhbHNlKTsKICB9Cn0KCmNsYXNzIF9MYXRpbjFBbGxvd0ludmFsaWREZWNvZGVyU2luayBleHRlbmRzIF9MYXRpbjFEZWNvZGVyU2luayB7CiAgX0xhdGluMUFsbG93SW52YWxpZERlY29kZXJTaW5rKFN0cmluZ0NvbnZlcnNpb25TaW5rIHNpbmspIDogc3VwZXIoc2luayk7CgogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgY2hhciA9IHNvdXJjZVtpXTsKICAgICAgaWYgKGNoYXIgPiBfbGF0aW4xTWFzayB8fCBjaGFyIDwgMCkgewogICAgICAgIGlmIChpID4gc3RhcnQpIF9hZGRTbGljZVRvU2luayhzb3VyY2UsIHN0YXJ0LCBpLCBmYWxzZSk7CiAgICAgICAgLy8gQWRkIFVURi04IGVuY29kaW5nIG9mIFUrRkZGRC4KICAgICAgICBfYWRkU2xpY2VUb1NpbmsoY29uc3QgWzB4RkZGRF0sIDAsIDEsIGZhbHNlKTsKICAgICAgICBzdGFydCA9IGkgKyAxOwogICAgICB9CiAgICB9CiAgICBpZiAoc3RhcnQgPCBlbmQpIHsKICAgICAgX2FkZFNsaWNlVG9TaW5rKHNvdXJjZSwgc3RhcnQsIGVuZCwgaXNMYXN0KTsKICAgIH0KICAgIGlmIChpc0xhc3QpIHsKICAgICAgY2xvc2UoKTsKICAgIH0KICB9Cn0KgLgATk48ARYBRARODwQODC8/QQgqAR4BSiolHAEoBkdNSj4GQVEBLCMBPgFNHAZRMQZRGjgkGEUNRgYEATYBLTAyAgFJNC4CAUkRNCoGRxoGSSovMyoBIwZEHkElKBkNNAZIPzcEAgE6HiIBERMSBAEfLwQBTE8zRh05GQQBRUEeIEtQGS0GMQQBSBIoGQYsDgZABAFLPygcLB9DCAZJEwQCAUJLAUU7KBwsQSk2FwgGFzMGEg8GBAIBGGRhcnQ6Y29udmVydC9sYXRpbjEuZGFydDZvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29udmVydC9saW5lX3NwbGl0dGVyLmRhcnSTfC8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29udmVydDsKCi8vIENoYXJhY3RlciBjb25zdGFudHMuCmNvbnN0IGludCBfTEYgPSAxMDsKY29uc3QgaW50IF9DUiA9IDEzOwoKLy8vIEEgW1N0cmVhbVRyYW5zZm9ybWVyXSB0aGF0IHNwbGl0cyBhIFtTdHJpbmddIGludG8gaW5kaXZpZHVhbCBsaW5lcy4KLy8vCi8vLyBBIGxpbmUgaXMgdGVybWluYXRlZCBieSBlaXRoZXIgYSBDUiAoVSswMDBEKSwgYSBMRiAoVSswMDBBKSwgYQovLy8gQ1IrTEYgc2VxdWVuY2UgKERPUyBsaW5lIGVuZGluZyksCi8vLyBhbmQgYSBmaW5hbCBub24tZW1wdHkgbGluZSBjYW4gYmUgZW5kZWQgYnkgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgovLy8KLy8vIFRoZSByZXR1cm5lZCBsaW5lcyBkbyBub3QgY29udGFpbiB0aGUgbGluZSB0ZXJtaW5hdG9ycy4KCmNsYXNzIExpbmVTcGxpdHRlciBleHRlbmRzIFN0cmVhbVRyYW5zZm9ybWVyQmFzZTxTdHJpbmcsIFN0cmluZz4gewogIGNvbnN0IExpbmVTcGxpdHRlcigpOwoKICAvLy8gU3BsaXQgW2xpbmVzXSBpbnRvIGluZGl2aWR1YWwgbGluZXMuCiAgLy8vCiAgLy8vIElmIFtzdGFydF0gYW5kIFtlbmRdIGFyZSBwcm92aWRlZCwgb25seSBzcGxpdCB0aGUgY29udGVudHMgb2YKICAvLy8gYGxpbmVzLnN1YnN0cmluZyhzdGFydCwgZW5kKWAuIFRoZSBbc3RhcnRdIGFuZCBbZW5kXSB2YWx1ZXMgbXVzdAogIC8vLyBzcGVjaWZ5IGEgdmFsaWQgc3ViLXJhbmdlIG9mIFtsaW5lc10KICAvLy8gKGAwIDw9IHN0YXJ0IDw9IGVuZCA8PSBsaW5lcy5sZW5ndGhgKS4KICBzdGF0aWMgSXRlcmFibGU8U3RyaW5nPiBzcGxpdChTdHJpbmcgbGluZXMsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgc3luYyogewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgbGluZXMubGVuZ3RoKTsKICAgIHZhciBzbGljZVN0YXJ0ID0gc3RhcnQ7CiAgICB2YXIgY2hhciA9IDA7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgcHJldmlvdXNDaGFyID0gY2hhcjsKICAgICAgY2hhciA9IGxpbmVzLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjaGFyICE9IF9DUikgewogICAgICAgIGlmIChjaGFyICE9IF9MRikgY29udGludWU7CiAgICAgICAgaWYgKHByZXZpb3VzQ2hhciA9PSBfQ1IpIHsKICAgICAgICAgIHNsaWNlU3RhcnQgPSBpICsgMTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgICB5aWVsZCBsaW5lcy5zdWJzdHJpbmcoc2xpY2VTdGFydCwgaSk7CiAgICAgIHNsaWNlU3RhcnQgPSBpICsgMTsKICAgIH0KICAgIGlmIChzbGljZVN0YXJ0IDwgZW5kKSB7CiAgICAgIHlpZWxkIGxpbmVzLnN1YnN0cmluZyhzbGljZVN0YXJ0LCBlbmQpOwogICAgfQogIH0KCiAgTGlzdDxTdHJpbmc+IGNvbnZlcnQoU3RyaW5nIGRhdGEpIHsKICAgIHZhciBsaW5lcyA9IDxTdHJpbmc+W107CiAgICB2YXIgZW5kID0gZGF0YS5sZW5ndGg7CiAgICB2YXIgc2xpY2VTdGFydCA9IDA7CiAgICB2YXIgY2hhciA9IDA7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHZhciBwcmV2aW91c0NoYXIgPSBjaGFyOwogICAgICBjaGFyID0gZGF0YS5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciAhPSBfQ1IpIHsKICAgICAgICBpZiAoY2hhciAhPSBfTEYpIGNvbnRpbnVlOwogICAgICAgIGlmIChwcmV2aW91c0NoYXIgPT0gX0NSKSB7CiAgICAgICAgICBzbGljZVN0YXJ0ID0gaSArIDE7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbGluZXMuYWRkKGRhdGEuc3Vic3RyaW5nKHNsaWNlU3RhcnQsIGkpKTsKICAgICAgc2xpY2VTdGFydCA9IGkgKyAxOwogICAgfQogICAgaWYgKHNsaWNlU3RhcnQgPCBlbmQpIHsKICAgICAgbGluZXMuYWRkKGRhdGEuc3Vic3RyaW5nKHNsaWNlU3RhcnQsIGVuZCkpOwogICAgfQogICAgcmV0dXJuIGxpbmVzOwogIH0KCiAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFN0cmluZz4gc2luaykgewogICAgcmV0dXJuIF9MaW5lU3BsaXR0ZXJTaW5rKAogICAgICAgIHNpbmsgaXMgU3RyaW5nQ29udmVyc2lvblNpbmsgPyBzaW5rIDogU3RyaW5nQ29udmVyc2lvblNpbmsuZnJvbShzaW5rKSk7CiAgfQoKICBTdHJlYW08U3RyaW5nPiBiaW5kKFN0cmVhbTxTdHJpbmc+IHN0cmVhbSkgewogICAgcmV0dXJuIFN0cmVhbTxTdHJpbmc+LmV2ZW50VHJhbnNmb3JtZWQoCiAgICAgICAgc3RyZWFtLCAoRXZlbnRTaW5rPFN0cmluZz4gc2luaykgPT4gX0xpbmVTcGxpdHRlckV2ZW50U2luayhzaW5rKSk7CiAgfQp9CgovLyBUT0RPKGZsb2l0c2NoKTogZGVhbCB3aXRoIHV0ZjguCmNsYXNzIF9MaW5lU3BsaXR0ZXJTaW5rIGV4dGVuZHMgU3RyaW5nQ29udmVyc2lvblNpbmtCYXNlIHsKICBmaW5hbCBTdHJpbmdDb252ZXJzaW9uU2luayBfc2luazsKCiAgLy8vIFRoZSBjYXJyeS1vdmVyIGZyb20gdGhlIHByZXZpb3VzIGNodW5rLgogIC8vLwogIC8vLyBJZiB0aGUgcHJldmlvdXMgc2xpY2UgZW5kZWQgaW4gYSBsaW5lIHdpdGhvdXQgYSBsaW5lIHRlcm1pbmF0b3IsCiAgLy8vIHRoZW4gdGhlIG5leHQgc2xpY2UgbWF5IGNvbnRpbnVlIHRoZSBsaW5lLgogIFN0cmluZyBfY2Fycnk7CgogIC8vLyBXaGV0aGVyIHRvIHNraXAgYSBsZWFkaW5nIExGIGNoYXJhY3RlciBmcm9tIHRoZSBuZXh0IHNsaWNlLgogIC8vLwogIC8vLyBJZiB0aGUgcHJldmlvdXMgc2xpY2UgZW5kZWQgb24gYSBDUiBjaGFyYWN0ZXIsIGEgZm9sbG93aW5nIExGCiAgLy8vIHdvdWxkIGJlIHBhcnQgb2YgdGhlIHNhbWUgbGluZSB0ZXJtaW5hdGlvbiwgYW5kIHNob3VsZCBiZSBpZ25vcmVkLgogIC8vLwogIC8vLyBPbmx5IGB0cnVlYCB3aGVuIFtfY2FycnldIGlzIGBudWxsYC4KICBib29sIF9za2lwTGVhZGluZ0xGID0gZmFsc2U7CgogIF9MaW5lU3BsaXR0ZXJTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZFNsaWNlKFN0cmluZyBjaHVuaywgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgY2h1bmsubGVuZ3RoKTsKICAgIC8vIElmIHRoZSBjaHVuayBpcyBlbXB0eSwgaXQncyBwcm9iYWJseSBiZWNhdXNlIGl0J3MgdGhlIGxhc3Qgb25lLgogICAgLy8gSGFuZGxlIHRoYXQgaGVyZSwgc28gd2Uga25vdyB0aGUgcmFuZ2UgaXMgbm9uLWVtcHR5IGJlbG93LgogICAgaWYgKHN0YXJ0ID49IGVuZCkgewogICAgICBpZiAoaXNMYXN0KSBjbG9zZSgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoX2NhcnJ5ICE9IG51bGwpIHsKICAgICAgYXNzZXJ0KCFfc2tpcExlYWRpbmdMRik7CiAgICAgIGNodW5rID0gX2NhcnJ5ICsgY2h1bmsuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgICBzdGFydCA9IDA7CiAgICAgIGVuZCA9IGNodW5rLmxlbmd0aDsKICAgICAgX2NhcnJ5ID0gbnVsbDsKICAgIH0gZWxzZSBpZiAoX3NraXBMZWFkaW5nTEYpIHsKICAgICAgaWYgKGNodW5rLmNvZGVVbml0QXQoc3RhcnQpID09IF9MRikgewogICAgICAgIHN0YXJ0ICs9IDE7CiAgICAgIH0KICAgICAgX3NraXBMZWFkaW5nTEYgPSBmYWxzZTsKICAgIH0KICAgIF9hZGRMaW5lcyhjaHVuaywgc3RhcnQsIGVuZCk7CiAgICBpZiAoaXNMYXN0KSBjbG9zZSgpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIGlmIChfY2FycnkgIT0gbnVsbCkgewogICAgICBfc2luay5hZGQoX2NhcnJ5KTsKICAgICAgX2NhcnJ5ID0gbnVsbDsKICAgIH0KICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIF9hZGRMaW5lcyhTdHJpbmcgbGluZXMsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgdmFyIHNsaWNlU3RhcnQgPSBzdGFydDsKICAgIHZhciBjaGFyID0gMDsKICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHZhciBwcmV2aW91c0NoYXIgPSBjaGFyOwogICAgICBjaGFyID0gbGluZXMuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNoYXIgIT0gX0NSKSB7CiAgICAgICAgaWYgKGNoYXIgIT0gX0xGKSBjb250aW51ZTsKICAgICAgICBpZiAocHJldmlvdXNDaGFyID09IF9DUikgewogICAgICAgICAgc2xpY2VTdGFydCA9IGkgKyAxOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIF9zaW5rLmFkZChsaW5lcy5zdWJzdHJpbmcoc2xpY2VTdGFydCwgaSkpOwogICAgICBzbGljZVN0YXJ0ID0gaSArIDE7CiAgICB9CiAgICBpZiAoc2xpY2VTdGFydCA8IGVuZCkgewogICAgICBfY2FycnkgPSBsaW5lcy5zdWJzdHJpbmcoc2xpY2VTdGFydCwgZW5kKTsKICAgIH0gZWxzZSB7CiAgICAgIF9za2lwTGVhZGluZ0xGID0gKGNoYXIgPT0gX0NSKTsKICAgIH0KICB9Cn0KCmNsYXNzIF9MaW5lU3BsaXR0ZXJFdmVudFNpbmsgZXh0ZW5kcyBfTGluZVNwbGl0dGVyU2luawogICAgaW1wbGVtZW50cyBFdmVudFNpbms8U3RyaW5nPiB7CiAgZmluYWwgRXZlbnRTaW5rPFN0cmluZz4gX2V2ZW50U2luazsKCiAgX0xpbmVTcGxpdHRlckV2ZW50U2luayhFdmVudFNpbms8U3RyaW5nPiBldmVudFNpbmspCiAgICAgIDogX2V2ZW50U2luayA9IGV2ZW50U2luaywKICAgICAgICBzdXBlcihTdHJpbmdDb252ZXJzaW9uU2luay5mcm9tKGV2ZW50U2luaykpOwoKICB2b2lkIGFkZEVycm9yKE9iamVjdCBvLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgX2V2ZW50U2luay5hZGRFcnJvcihvLCBzdGFja1RyYWNlKTsKICB9Cn0KgK4ATk48ARYBGBQUAUgEQyZGBDwBQxgBKwZERystUEAcEigfIhkjIx4UCggsGgYcLgYEASYcGxgSJB8hGSMjHhQKCDAaBhwyBhIEAUMeUAQBLyxLBAIBIzskAS4GRzERAUIGREkGKx8BIQFBQEdCGBsOBhofNBEaFSEsFAgeBiIZBAERGhkVBhMEATUcEigfIhkjIx4UCggxGgYcMQ0mBgQCATcjJgE2IDUBNSgEAgEfZGFydDpjb252ZXJ0L2xpbmVfc3BsaXR0ZXIuZGFydDpvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29udmVydC9zdHJpbmdfY29udmVyc2lvbi5kYXJ0pYIvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbnZlcnQ7CgovLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGNvbnZlcnRlcnMgdG8KLy8vIGVmZmljaWVudGx5IHRyYW5zbWl0IFN0cmluZyBkYXRhLgovLy8KLy8vIEluc3RlYWQgb2YgbGltaXRpbmcgdGhlIGludGVyZmFjZSB0byBvbmUgbm9uLWNodW5rZWQgU3RyaW5nIGl0IGFjY2VwdHMKLy8vIHBhcnRpYWwgc3RyaW5ncyBvciBjYW4gYmUgdHJhbnNmb3JtZWQgaW50byBhIGJ5dGUgc2luayB0aGF0Ci8vLyBhY2NlcHRzIFVURi04IGNvZGUgdW5pdHMuCi8vLwovLy8gVGhpcyBhYnN0cmFjdCBjbGFzcyB3aWxsIGxpa2VseSBnZXQgbW9yZSBtZXRob2RzIG92ZXIgdGltZS4gSW1wbGVtZW50ZXJzIGFyZQovLy8gdXJnZWQgdG8gZXh0ZW5kIFtTdHJpbmdDb252ZXJzaW9uU2lua0Jhc2VdIG9yIHRvIG1peCBpbgovLy8gW1N0cmluZ0NvbnZlcnNpb25TaW5rTWl4aW5dLCB0byBlbnN1cmUgdGhhdCB0aGVpciBjbGFzcyBjb3ZlcnMgdGhlIG5ld2x5Ci8vLyBhZGRlZCBtZXRob2RzLgphYnN0cmFjdCBjbGFzcyBTdHJpbmdDb252ZXJzaW9uU2luayBleHRlbmRzIENodW5rZWRDb252ZXJzaW9uU2luazxTdHJpbmc+IHsKICBTdHJpbmdDb252ZXJzaW9uU2luaygpOwogIGZhY3RvcnkgU3RyaW5nQ29udmVyc2lvblNpbmsud2l0aENhbGxiYWNrKHZvaWQgY2FsbGJhY2soU3RyaW5nIGFjY3VtdWxhdGVkKSkgPQogICAgICBfU3RyaW5nQ2FsbGJhY2tTaW5rOwogIGZhY3RvcnkgU3RyaW5nQ29udmVyc2lvblNpbmsuZnJvbShTaW5rPFN0cmluZz4gc2luaykgPSBfU3RyaW5nQWRhcHRlclNpbms7CgogIC8vLyBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIHdyYXBwaW5nIHRoZSBnaXZlbiBbc2lua10uCiAgLy8vCiAgLy8vIEV2ZXJ5IHN0cmluZyB0aGF0IGlzIGFkZGVkIHRvIHRoZSByZXR1cm5lZCBpbnN0YW5jZSBpcyBmb3J3YXJkZWQgdG8KICAvLy8gdGhlIFtzaW5rXS4gVGhlIGluc3RhbmNlIGlzIGFsbG93ZWQgdG8gYnVmZmVyIGFuZCBpcyBub3QgcmVxdWlyZWQgdG8KICAvLy8gZm9yd2FyZCBpbW1lZGlhdGVseS4KICBmYWN0b3J5IFN0cmluZ0NvbnZlcnNpb25TaW5rLmZyb21TdHJpbmdTaW5rKFN0cmluZ1Npbmsgc2luaykgPQogICAgICBfU3RyaW5nU2lua0NvbnZlcnNpb25TaW5rPFN0cmluZ1Npbms+OwoKICAvLy8gQWRkcyB0aGUgbmV4dCBbY2h1bmtdIHRvIGB0aGlzYC4KICAvLy8KICAvLy8gQWRkcyB0aGUgc3Vic3RyaW5nIGRlZmluZWQgYnkgW3N0YXJ0XSBhbmQgW2VuZF0tZXhjbHVzaXZlIHRvIGB0aGlzYC4KICAvLy8KICAvLy8gSWYgW2lzTGFzdF0gaXMgYHRydWVgIGNsb3NlcyBgdGhpc2AuCiAgdm9pZCBhZGRTbGljZShTdHJpbmcgY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpOwoKICAvLy8gUmV0dXJucyBgdGhpc2AgYXMgYSBzaW5rIHRoYXQgYWNjZXB0cyBVVEYtOCBpbnB1dC4KICAvLy8KICAvLy8gSWYgdXNlZCwgdGhpcyBtZXRob2QgbXVzdCBiZSB0aGUgZmlyc3QgYW5kIG9ubHkgY2FsbCB0byBgdGhpc2AuIEl0CiAgLy8vIGludmFsaWRhdGVzIGB0aGlzYC4gQWxsIGZ1cnRoZXIgb3BlcmF0aW9ucyBtdXN0IGJlIHBlcmZvcm1lZCBvbiB0aGUgcmVzdWx0LgogIEJ5dGVDb252ZXJzaW9uU2luayBhc1V0ZjhTaW5rKGJvb2wgYWxsb3dNYWxmb3JtZWQpOwogIC8vIC0gYXNSdW5lU2luawogIC8vIC0gYXNDb2RlVW5pdHNTaW5rCgogIC8vLyBSZXR1cm5zIGB0aGlzYCBhcyBhIFtDbG9zYWJsZVN0cmluZ1NpbmtdLgogIC8vLwogIC8vLyBJZiB1c2VkLCB0aGlzIG1ldGhvZCBtdXN0IGJlIHRoZSBmaXJzdCBhbmQgb25seSBjYWxsIHRvIGB0aGlzYC4gSXQKICAvLy8gaW52YWxpZGF0ZXMgYHRoaXNgLiBBbGwgZnVydGhlciBvcGVyYXRpb25zIG11c3QgYmUgcGVyZm9ybWVkIG9uIHRoZSByZXN1bHQuCiAgQ2xvc2FibGVTdHJpbmdTaW5rIGFzU3RyaW5nU2luaygpOwp9CgovLy8gQSBbQ2xvc2FibGVTdHJpbmdTaW5rXSBleHRlbmRzIHRoZSBbU3RyaW5nU2lua10gaW50ZXJmYWNlIGJ5IGFkZGluZyBhCi8vLyBgY2xvc2VgIG1ldGhvZC4KYWJzdHJhY3QgY2xhc3MgQ2xvc2FibGVTdHJpbmdTaW5rIGV4dGVuZHMgU3RyaW5nU2luayB7CiAgLy8vIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgY29tYmluaW5nIGEgW1N0cmluZ1NpbmtdIFtzaW5rXSBhbmQgYSBjYWxsYmFjawogIC8vLyBbb25DbG9zZV0gd2hpY2ggaXMgaW52b2tlZCB3aGVuIHRoZSByZXR1cm5lZCBpbnN0YW5jZSBpcyBjbG9zZWQuCiAgZmFjdG9yeSBDbG9zYWJsZVN0cmluZ1NpbmsuZnJvbVN0cmluZ1NpbmsoU3RyaW5nU2luayBzaW5rLCB2b2lkIG9uQ2xvc2UoKSkgPQogICAgICBfQ2xvc2FibGVTdHJpbmdTaW5rOwoKICAvLy8gQ2xvc2VzIGB0aGlzYCBhbmQgZmx1c2hlcyBhbnkgb3V0c3RhbmRpbmcgZGF0YS4KICB2b2lkIGNsb3NlKCk7Cn0KCi8vLyBUaGlzIGNsYXNzIHdyYXBzIGFuIGV4aXN0aW5nIFtTdHJpbmdTaW5rXSBhbmQgaW52b2tlcyBhCi8vLyBjbG9zdXJlIHdoZW4gW2Nsb3NlXSBpcyBpbnZva2VkLgpjbGFzcyBfQ2xvc2FibGVTdHJpbmdTaW5rIGltcGxlbWVudHMgQ2xvc2FibGVTdHJpbmdTaW5rIHsKICBmaW5hbCB2b2lkIEZ1bmN0aW9uKCkgX2NhbGxiYWNrOwogIGZpbmFsIFN0cmluZ1NpbmsgX3Npbms7CgogIF9DbG9zYWJsZVN0cmluZ1NpbmsodGhpcy5fc2luaywgdGhpcy5fY2FsbGJhY2spOwoKICB2b2lkIGNsb3NlKCkgewogICAgX2NhbGxiYWNrKCk7CiAgfQoKICB2b2lkIHdyaXRlQ2hhckNvZGUoaW50IGNoYXJDb2RlKSB7CiAgICBfc2luay53cml0ZUNoYXJDb2RlKGNoYXJDb2RlKTsKICB9CgogIHZvaWQgd3JpdGUoT2JqZWN0IG8pIHsKICAgIF9zaW5rLndyaXRlKG8pOwogIH0KCiAgdm9pZCB3cml0ZWxuKFtPYmplY3QgbyA9ICIiXSkgewogICAgX3Npbmsud3JpdGVsbihvKTsKICB9CgogIHZvaWQgd3JpdGVBbGwoSXRlcmFibGUgb2JqZWN0cywgW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pIHsKICAgIF9zaW5rLndyaXRlQWxsKG9iamVjdHMsIHNlcGFyYXRvcik7CiAgfQp9CgovLy8gVGhpcyBjbGFzcyB3cmFwcyBhbiBleGlzdGluZyBbU3RyaW5nQ29udmVyc2lvblNpbmtdIGFuZCBleHBvc2VzIGEKLy8vIFtDbG9zYWJsZVN0cmluZ1NpbmtdIGludGVyZmFjZS4gVGhlIHdyYXBwZWQgc2luayBvbmx5IG5lZWRzIHRvIGltcGxlbWVudAovLy8gYGFkZGAgYW5kIGBjbG9zZWAuCi8vIFRPRE8oZmxvaXRzY2gpOiBtYWtlIHRoaXMgY2xhc3MgcHVibGljPwpjbGFzcyBfU3RyaW5nQ29udmVyc2lvblNpbmtBc1N0cmluZ1NpbmtBZGFwdGVyIGltcGxlbWVudHMgQ2xvc2FibGVTdHJpbmdTaW5rIHsKICBzdGF0aWMgY29uc3QgX01JTl9TVFJJTkdfU0laRSA9IDE2OwoKICBTdHJpbmdCdWZmZXIgX2J1ZmZlcjsKICBTdHJpbmdDb252ZXJzaW9uU2luayBfY2h1bmtlZFNpbms7CgogIF9TdHJpbmdDb252ZXJzaW9uU2lua0FzU3RyaW5nU2lua0FkYXB0ZXIodGhpcy5fY2h1bmtlZFNpbmspCiAgICAgIDogX2J1ZmZlciA9IFN0cmluZ0J1ZmZlcigpOwoKICB2b2lkIGNsb3NlKCkgewogICAgaWYgKF9idWZmZXIuaXNOb3RFbXB0eSkgX2ZsdXNoKCk7CiAgICBfY2h1bmtlZFNpbmsuY2xvc2UoKTsKICB9CgogIHZvaWQgd3JpdGVDaGFyQ29kZShpbnQgY2hhckNvZGUpIHsKICAgIF9idWZmZXIud3JpdGVDaGFyQ29kZShjaGFyQ29kZSk7CiAgICBpZiAoX2J1ZmZlci5sZW5ndGggPiBfTUlOX1NUUklOR19TSVpFKSBfZmx1c2goKTsKICB9CgogIHZvaWQgd3JpdGUoT2JqZWN0IG8pIHsKICAgIGlmIChfYnVmZmVyLmlzTm90RW1wdHkpIF9mbHVzaCgpOwogICAgX2NodW5rZWRTaW5rLmFkZChvLnRvU3RyaW5nKCkpOwogIH0KCiAgdm9pZCB3cml0ZWxuKFtPYmplY3QgbyA9ICIiXSkgewogICAgX2J1ZmZlci53cml0ZWxuKG8pOwogICAgaWYgKF9idWZmZXIubGVuZ3RoID4gX01JTl9TVFJJTkdfU0laRSkgX2ZsdXNoKCk7CiAgfQoKICB2b2lkIHdyaXRlQWxsKEl0ZXJhYmxlIG9iamVjdHMsIFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSB7CiAgICBpZiAoX2J1ZmZlci5pc05vdEVtcHR5KSBfZmx1c2goKTsKICAgIHZhciBpdGVyYXRvciA9IG9iamVjdHMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHJldHVybjsKICAgIGlmIChzZXBhcmF0b3IuaXNFbXB0eSkgewogICAgICBkbyB7CiAgICAgICAgX2NodW5rZWRTaW5rLmFkZChpdGVyYXRvci5jdXJyZW50LnRvU3RyaW5nKCkpOwogICAgICB9IHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIF9jaHVua2VkU2luay5hZGQoaXRlcmF0b3IuY3VycmVudC50b1N0cmluZygpKTsKICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICB3cml0ZShzZXBhcmF0b3IpOwogICAgICAgIF9jaHVua2VkU2luay5hZGQoaXRlcmF0b3IuY3VycmVudC50b1N0cmluZygpKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfZmx1c2goKSB7CiAgICB2YXIgYWNjdW11bGF0ZWQgPSBfYnVmZmVyLnRvU3RyaW5nKCk7CiAgICBfYnVmZmVyLmNsZWFyKCk7CiAgICBfY2h1bmtlZFNpbmsuYWRkKGFjY3VtdWxhdGVkKTsKICB9Cn0KCi8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgYmFzZS1jbGFzcyBmb3IgY29udmVydGVycyB0aGF0IG5lZWQgdG8gYWNjZXB0IFN0cmluZwovLy8gaW5wdXRzLgphYnN0cmFjdCBjbGFzcyBTdHJpbmdDb252ZXJzaW9uU2lua0Jhc2UgZXh0ZW5kcyBTdHJpbmdDb252ZXJzaW9uU2lua01peGluIHt9CgovLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhIG1peGluIGZvciBjb252ZXJ0ZXJzIHRoYXQgbmVlZCB0byBhY2NlcHQgU3RyaW5nCi8vLyBpbnB1dHMuCmFic3RyYWN0IGNsYXNzIFN0cmluZ0NvbnZlcnNpb25TaW5rTWl4aW4gaW1wbGVtZW50cyBTdHJpbmdDb252ZXJzaW9uU2luayB7CiAgdm9pZCBhZGRTbGljZShTdHJpbmcgc3RyLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KTsKICB2b2lkIGNsb3NlKCk7CgogIHZvaWQgYWRkKFN0cmluZyBzdHIpIHsKICAgIGFkZFNsaWNlKHN0ciwgMCwgc3RyLmxlbmd0aCwgZmFsc2UpOwogIH0KCiAgQnl0ZUNvbnZlcnNpb25TaW5rIGFzVXRmOFNpbmsoYm9vbCBhbGxvd01hbGZvcm1lZCkgewogICAgcmV0dXJuIF9VdGY4Q29udmVyc2lvblNpbmsodGhpcywgYWxsb3dNYWxmb3JtZWQpOwogIH0KCiAgQ2xvc2FibGVTdHJpbmdTaW5rIGFzU3RyaW5nU2luaygpIHsKICAgIHJldHVybiBfU3RyaW5nQ29udmVyc2lvblNpbmtBc1N0cmluZ1NpbmtBZGFwdGVyKHRoaXMpOwogIH0KfQoKLy8vIFRoaXMgY2xhc3MgaXMgYSBbU3RyaW5nQ29udmVyc2lvblNpbmtdIHRoYXQgd3JhcHMgYSBbU3RyaW5nU2lua10uCmNsYXNzIF9TdHJpbmdTaW5rQ29udmVyc2lvblNpbms8VFN0cmluZ1NpbmsgZXh0ZW5kcyBTdHJpbmdTaW5rPgogICAgZXh0ZW5kcyBTdHJpbmdDb252ZXJzaW9uU2lua0Jhc2UgewogIFRTdHJpbmdTaW5rIF9zdHJpbmdTaW5rOwogIF9TdHJpbmdTaW5rQ29udmVyc2lvblNpbmsodGhpcy5fc3RyaW5nU2luayk7CgogIHZvaWQgY2xvc2UoKSB7fQogIHZvaWQgYWRkU2xpY2UoU3RyaW5nIHN0ciwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgaWYgKHN0YXJ0ICE9IDAgfHwgZW5kICE9IHN0ci5sZW5ndGgpIHsKICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICBfc3RyaW5nU2luay53cml0ZUNoYXJDb2RlKHN0ci5jb2RlVW5pdEF0KGkpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgX3N0cmluZ1Npbmsud3JpdGUoc3RyKTsKICAgIH0KICAgIGlmIChpc0xhc3QpIGNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChTdHJpbmcgc3RyKSB7CiAgICBfc3RyaW5nU2luay53cml0ZShzdHIpOwogIH0KCiAgQnl0ZUNvbnZlcnNpb25TaW5rIGFzVXRmOFNpbmsoYm9vbCBhbGxvd01hbGZvcm1lZCkgewogICAgcmV0dXJuIF9VdGY4U3RyaW5nU2lua0FkYXB0ZXIodGhpcywgX3N0cmluZ1NpbmssIGFsbG93TWFsZm9ybWVkKTsKICB9CgogIENsb3NhYmxlU3RyaW5nU2luayBhc1N0cmluZ1NpbmsoKSB7CiAgICByZXR1cm4gQ2xvc2FibGVTdHJpbmdTaW5rLmZyb21TdHJpbmdTaW5rKF9zdHJpbmdTaW5rLCBjbG9zZSk7CiAgfQp9CgovLy8gVGhpcyBjbGFzcyBhY2N1bXVsYXRlcyBhbGwgY2h1bmtzIGludG8gb25lIHN0cmluZwovLy8gYW5kIGludm9rZXMgYSBjYWxsYmFjayB3aGVuIHRoZSBzaW5rIGlzIGNsb3NlZC4KLy8vCi8vLyBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHRlcm1pbmF0ZSBhIGNodW5rZWQgY29udmVyc2lvbi4KY2xhc3MgX1N0cmluZ0NhbGxiYWNrU2luayBleHRlbmRzIF9TdHJpbmdTaW5rQ29udmVyc2lvblNpbms8U3RyaW5nQnVmZmVyPiB7CiAgZmluYWwgdm9pZCBGdW5jdGlvbihTdHJpbmcpIF9jYWxsYmFjazsKICBfU3RyaW5nQ2FsbGJhY2tTaW5rKHRoaXMuX2NhbGxiYWNrKSA6IHN1cGVyKFN0cmluZ0J1ZmZlcigpKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIHZhciBhY2N1bXVsYXRlZCA9IF9zdHJpbmdTaW5rLnRvU3RyaW5nKCk7CiAgICBfc3RyaW5nU2luay5jbGVhcigpOwogICAgX2NhbGxiYWNrKGFjY3VtdWxhdGVkKTsKICB9CgogIEJ5dGVDb252ZXJzaW9uU2luayBhc1V0ZjhTaW5rKGJvb2wgYWxsb3dNYWxmb3JtZWQpIHsKICAgIHJldHVybiBfVXRmOFN0cmluZ1NpbmtBZGFwdGVyKHRoaXMsIF9zdHJpbmdTaW5rLCBhbGxvd01hbGZvcm1lZCk7CiAgfQp9CgovLy8gVGhpcyBjbGFzcyBhZGFwdHMgYSBzaW1wbGUgW0NodW5rZWRDb252ZXJzaW9uU2lua10gdG8gYQovLy8gW1N0cmluZ0NvbnZlcnNpb25TaW5rXS4KLy8vCi8vLyBBbGwgYWRkaXRpb25hbCBtZXRob2RzIG9mIHRoZSBbU3RyaW5nQ29udmVyc2lvblNpbmtdIChjb21wYXJlZCB0byB0aGUKLy8vIENodW5rZWRDb252ZXJzaW9uU2luaykgYXJlIHJlZGlyZWN0ZWQgdG8gdGhlIGBhZGRgIG1ldGhvZC4KY2xhc3MgX1N0cmluZ0FkYXB0ZXJTaW5rIGV4dGVuZHMgU3RyaW5nQ29udmVyc2lvblNpbmtCYXNlIHsKICBmaW5hbCBTaW5rPFN0cmluZz4gX3Npbms7CgogIF9TdHJpbmdBZGFwdGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBhZGQoU3RyaW5nIHN0cikgewogICAgX3NpbmsuYWRkKHN0cik7CiAgfQoKICB2b2lkIGFkZFNsaWNlKFN0cmluZyBzdHIsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGlmIChzdGFydCA9PSAwICYmIGVuZCA9PSBzdHIubGVuZ3RoKSB7CiAgICAgIGFkZChzdHIpOwogICAgfSBlbHNlIHsKICAgICAgYWRkKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOwogICAgfQogICAgaWYgKGlzTGFzdCkgY2xvc2UoKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfc2luay5jbG9zZSgpOwogIH0KfQoKLy8vIERlY29kZXMgVVRGLTggY29kZSB1bml0cyBhbmQgc3RvcmVzIHRoZW0gaW4gYSBbU3RyaW5nU2lua10uCmNsYXNzIF9VdGY4U3RyaW5nU2lua0FkYXB0ZXIgZXh0ZW5kcyBCeXRlQ29udmVyc2lvblNpbmsgewogIGZpbmFsIF9VdGY4RGVjb2RlciBfZGVjb2RlcjsKICBmaW5hbCBTaW5rIF9zaW5rOwoKICBfVXRmOFN0cmluZ1NpbmtBZGFwdGVyKHRoaXMuX3NpbmssIFN0cmluZ1Npbmsgc3RyaW5nU2luaywgYm9vbCBhbGxvd01hbGZvcm1lZCkKICAgICAgOiBfZGVjb2RlciA9IF9VdGY4RGVjb2RlcihzdHJpbmdTaW5rLCBhbGxvd01hbGZvcm1lZCk7CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfZGVjb2Rlci5jbG9zZSgpOwogICAgaWYgKF9zaW5rICE9IG51bGwpIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChMaXN0PGludD4gY2h1bmspIHsKICAgIGFkZFNsaWNlKGNodW5rLCAwLCBjaHVuay5sZW5ndGgsIGZhbHNlKTsKICB9CgogIHZvaWQgYWRkU2xpY2UoCiAgICAgIExpc3Q8aW50PiBjb2RlVW5pdHMsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIGJvb2wgaXNMYXN0KSB7CiAgICBfZGVjb2Rlci5jb252ZXJ0KGNvZGVVbml0cywgc3RhcnRJbmRleCwgZW5kSW5kZXgpOwogICAgaWYgKGlzTGFzdCkgY2xvc2UoKTsKICB9Cn0KCi8vLyBEZWNvZGVzIFVURi04IGNvZGUgdW5pdHMuCi8vLwovLy8gRm9yd2FyZHMgdGhlIGRlY29kZWQgc3RyaW5ncyB0byB0aGUgZ2l2ZW4gW1N0cmluZ0NvbnZlcnNpb25TaW5rXS4KLy8gVE9ETyhmbG9pdHNjaCk6IG1ha2UgdGhpcyBjbGFzcyBwdWJsaWM/CmNsYXNzIF9VdGY4Q29udmVyc2lvblNpbmsgZXh0ZW5kcyBCeXRlQ29udmVyc2lvblNpbmsgewogIGZpbmFsIF9VdGY4RGVjb2RlciBfZGVjb2RlcjsKICBmaW5hbCBTdHJpbmdDb252ZXJzaW9uU2luayBfY2h1bmtlZFNpbms7CiAgZmluYWwgU3RyaW5nQnVmZmVyIF9idWZmZXI7CiAgX1V0ZjhDb252ZXJzaW9uU2luayhTdHJpbmdDb252ZXJzaW9uU2luayBzaW5rLCBib29sIGFsbG93TWFsZm9ybWVkKQogICAgICA6IHRoaXMuXyhzaW5rLCBTdHJpbmdCdWZmZXIoKSwgYWxsb3dNYWxmb3JtZWQpOwoKICBfVXRmOENvbnZlcnNpb25TaW5rLl8oCiAgICAgIHRoaXMuX2NodW5rZWRTaW5rLCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyLCBib29sIGFsbG93TWFsZm9ybWVkKQogICAgICA6IF9kZWNvZGVyID0gX1V0ZjhEZWNvZGVyKHN0cmluZ0J1ZmZlciwgYWxsb3dNYWxmb3JtZWQpLAogICAgICAgIF9idWZmZXIgPSBzdHJpbmdCdWZmZXI7CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfZGVjb2Rlci5jbG9zZSgpOwogICAgaWYgKF9idWZmZXIuaXNOb3RFbXB0eSkgewogICAgICB2YXIgYWNjdW11bGF0ZWQgPSBfYnVmZmVyLnRvU3RyaW5nKCk7CiAgICAgIF9idWZmZXIuY2xlYXIoKTsKICAgICAgX2NodW5rZWRTaW5rLmFkZFNsaWNlKGFjY3VtdWxhdGVkLCAwLCBhY2N1bXVsYXRlZC5sZW5ndGgsIHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgX2NodW5rZWRTaW5rLmNsb3NlKCk7CiAgICB9CiAgfQoKICB2b2lkIGFkZChMaXN0PGludD4gY2h1bmspIHsKICAgIGFkZFNsaWNlKGNodW5rLCAwLCBjaHVuay5sZW5ndGgsIGZhbHNlKTsKICB9CgogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IGNodW5rLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBib29sIGlzTGFzdCkgewogICAgX2RlY29kZXIuY29udmVydChjaHVuaywgc3RhcnRJbmRleCwgZW5kSW5kZXgpOwogICAgaWYgKF9idWZmZXIuaXNOb3RFbXB0eSkgewogICAgICB2YXIgYWNjdW11bGF0ZWQgPSBfYnVmZmVyLnRvU3RyaW5nKCk7CiAgICAgIF9jaHVua2VkU2luay5hZGRTbGljZShhY2N1bXVsYXRlZCwgMCwgYWNjdW11bGF0ZWQubGVuZ3RoLCBpc0xhc3QpOwogICAgICBfYnVmZmVyLmNsZWFyKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpc0xhc3QpIGNsb3NlKCk7CiAgfQp9CoFAAE5OPAEWATcmBEtAHgRRPE0TTBpRG00BOAZKSxtBLQEnBksGK0ABOQZJUjYSFwEwBklSJQIBShQ3TEdPGwE2EAIBPCU6IxoBMwEREQQBJSMEARkUBAEiFgQBPSgEAgFGTRcrTyYBGCUBPiIBESYaBAElJTUEARkmJAQBIhg1BAE9JiUmHQs3JQ01JBo3CAYEARIqFSMEAgFPDE0BSgxLPhABGSkEATc2BAEmOwQCAUZAJxsvARI/Kyo2CA0eBhkEARkcBAE3RgQBJkIEAgE2NAQ+TCk/AREuGRwEATdGBAIBPBwESj88HAEiARkUBAE/KxANJgYZBAEREwQCAUA6HxQBUT0BERYmBAEeLQQBEUg3GQQCAR4ERis3HyseRjYBGUk/IAERFh4sF0cNHAYEAR4tBAFOMx4sSRcOBhkEAgEjZGFydDpjb252ZXJ0L3N0cmluZ19jb252ZXJzaW9uLmRhcnQsb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbnZlcnQvdXRmLmRhcnTAAE6HLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb252ZXJ0OwoKLy8vIFRoZSBVbmljb2RlIFJlcGxhY2VtZW50IGNoYXJhY3RlciBgVStGRkZEYCAo77+9KS4KY29uc3QgaW50IHVuaWNvZGVSZXBsYWNlbWVudENoYXJhY3RlclJ1bmUgPSAweEZGRkQ7CgovLy8gVGhlIFVuaWNvZGUgQnl0ZSBPcmRlciBNYXJrZXIgKEJPTSkgY2hhcmFjdGVyIGBVK0ZFRkZgLgpjb25zdCBpbnQgdW5pY29kZUJvbUNoYXJhY3RlclJ1bmUgPSAweEZFRkY7CgovLy8gQW4gaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFtVdGY4Q29kZWNdLgovLy8KLy8vIFRoaXMgaW5zdGFuY2UgcHJvdmlkZXMgYSBjb252ZW5pZW50IGFjY2VzcyB0byB0aGUgbW9zdCBjb21tb24gVVRGLTgKLy8vIHVzZSBjYXNlcy4KLy8vCi8vLyBFeGFtcGxlczoKLy8vCi8vLyAgICAgdmFyIGVuY29kZWQgPSB1dGY4LmVuY29kZSgiw47DscWjw6lyw7HDpcWjw67DtsOxw6XEvMOuxb7DpcWjw67hu53DsSIpOwovLy8gICAgIHZhciBkZWNvZGVkID0gdXRmOC5kZWNvZGUoWzB4NjIsIDB4NmMsIDB4YzMsIDB4YTUsIDB4NjIsIDB4YzMsIDB4YTYsCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MiwgMHg2NywgMHg3MiwgMHhjMywgMHhiOCwgMHg2NF0pOwpjb25zdCBVdGY4Q29kZWMgdXRmOCA9IFV0ZjhDb2RlYygpOwoKLy8vIEEgW1V0ZjhDb2RlY10gZW5jb2RlcyBzdHJpbmdzIHRvIHV0Zi04IGNvZGUgdW5pdHMgKGJ5dGVzKSBhbmQgZGVjb2RlcwovLy8gVVRGLTggY29kZSB1bml0cyB0byBzdHJpbmdzLgpjbGFzcyBVdGY4Q29kZWMgZXh0ZW5kcyBFbmNvZGluZyB7CiAgZmluYWwgYm9vbCBfYWxsb3dNYWxmb3JtZWQ7CgogIC8vLyBJbnN0YW50aWF0ZXMgYSBuZXcgW1V0ZjhDb2RlY10uCiAgLy8vCiAgLy8vIFRoZSBvcHRpb25hbCBbYWxsb3dNYWxmb3JtZWRdIGFyZ3VtZW50IGRlZmluZXMgaG93IFtkZWNvZGVyXSAoYW5kIFtkZWNvZGVdKQogIC8vLyBkZWFsIHdpdGggaW52YWxpZCBvciB1bnRlcm1pbmF0ZWQgY2hhcmFjdGVyIHNlcXVlbmNlcy4KICAvLy8KICAvLy8gSWYgaXQgaXMgYHRydWVgIChhbmQgbm90IG92ZXJyaWRkZW4gYXQgdGhlIG1ldGhvZCBpbnZvY2F0aW9uKSBbZGVjb2RlXSBhbmQKICAvLy8gdGhlIFtkZWNvZGVyXSByZXBsYWNlIGludmFsaWQgKG9yIHVudGVybWluYXRlZCkgb2N0ZXQKICAvLy8gc2VxdWVuY2VzIHdpdGggdGhlIFVuaWNvZGUgUmVwbGFjZW1lbnQgY2hhcmFjdGVyIGBVK0ZGRkRgICjvv70pLiBPdGhlcndpc2UKICAvLy8gdGhleSB0aHJvdyBhIFtGb3JtYXRFeGNlcHRpb25dLgogIGNvbnN0IFV0ZjhDb2RlYyh7Ym9vbCBhbGxvd01hbGZvcm1lZCA9IGZhbHNlfSkKICAgICAgOiBfYWxsb3dNYWxmb3JtZWQgPSBhbGxvd01hbGZvcm1lZDsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoaXMgY29kZWMsICJ1dGYtOCIuCiAgU3RyaW5nIGdldCBuYW1lID0+ICJ1dGYtOCI7CgogIC8vLyBEZWNvZGVzIHRoZSBVVEYtOCBbY29kZVVuaXRzXSAoYSBsaXN0IG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzKSB0byB0aGUKICAvLy8gY29ycmVzcG9uZGluZyBzdHJpbmcuCiAgLy8vCiAgLy8vIElmIHRoZSBbY29kZVVuaXRzXSBzdGFydCB3aXRoIHRoZSBlbmNvZGluZyBvZiBhCiAgLy8vIFt1bmljb2RlQm9tQ2hhcmFjdGVyUnVuZV0sIHRoYXQgY2hhcmFjdGVyIGlzIGRpc2NhcmRlZC4KICAvLy8KICAvLy8gSWYgW2FsbG93TWFsZm9ybWVkXSBpcyBgdHJ1ZWAgdGhlIGRlY29kZXIgcmVwbGFjZXMgaW52YWxpZCAob3IKICAvLy8gdW50ZXJtaW5hdGVkKSBjaGFyYWN0ZXIgc2VxdWVuY2VzIHdpdGggdGhlIFVuaWNvZGUgUmVwbGFjZW1lbnQgY2hhcmFjdGVyCiAgLy8vIGBVK0ZGRkRgICjvv70pLiBPdGhlcndpc2UgaXQgdGhyb3dzIGEgW0Zvcm1hdEV4Y2VwdGlvbl0uCiAgLy8vCiAgLy8vIElmIFthbGxvd01hbGZvcm1lZF0gaXMgbm90IGdpdmVuLCBpdCBkZWZhdWx0cyB0byB0aGUgYGFsbG93TWFsZm9ybWVkYCB0aGF0CiAgLy8vIHdhcyB1c2VkIHRvIGluc3RhbnRpYXRlIGB0aGlzYC4KICBTdHJpbmcgZGVjb2RlKExpc3Q8aW50PiBjb2RlVW5pdHMsIHtib29sIGFsbG93TWFsZm9ybWVkfSkgewogICAgYWxsb3dNYWxmb3JtZWQgPz89IF9hbGxvd01hbGZvcm1lZDsKICAgIHJldHVybiBVdGY4RGVjb2RlcihhbGxvd01hbGZvcm1lZDogYWxsb3dNYWxmb3JtZWQpLmNvbnZlcnQoY29kZVVuaXRzKTsKICB9CgogIFV0ZjhFbmNvZGVyIGdldCBlbmNvZGVyID0+IGNvbnN0IFV0ZjhFbmNvZGVyKCk7CiAgVXRmOERlY29kZXIgZ2V0IGRlY29kZXIgewogICAgcmV0dXJuIFV0ZjhEZWNvZGVyKGFsbG93TWFsZm9ybWVkOiBfYWxsb3dNYWxmb3JtZWQpOwogIH0KfQoKLy8vIFRoaXMgY2xhc3MgY29udmVydHMgc3RyaW5ncyB0byB0aGVpciBVVEYtOCBjb2RlIHVuaXRzIChhIGxpc3Qgb2YKLy8vIHVuc2lnbmVkIDgtYml0IGludGVnZXJzKS4KY2xhc3MgVXRmOEVuY29kZXIgZXh0ZW5kcyBDb252ZXJ0ZXI8U3RyaW5nLCBMaXN0PGludD4+IHsKICBjb25zdCBVdGY4RW5jb2RlcigpOwoKICAvLy8gQ29udmVydHMgW3N0cmluZ10gdG8gaXRzIFVURi04IGNvZGUgdW5pdHMgKGEgbGlzdCBvZgogIC8vLyB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VycykuCiAgLy8vCiAgLy8vIElmIFtzdGFydF0gYW5kIFtlbmRdIGFyZSBwcm92aWRlZCwgb25seSB0aGUgc3Vic3RyaW5nCiAgLy8vIGBzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpYCBpcyBjb252ZXJ0ZWQuCiAgVWludDhMaXN0IGNvbnZlcnQoU3RyaW5nIHN0cmluZywgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICB2YXIgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHN0cmluZ0xlbmd0aCk7CiAgICB2YXIgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBVaW50OExpc3QoMCk7CiAgICAvLyBDcmVhdGUgYSBuZXcgZW5jb2RlciB3aXRoIGEgbGVuZ3RoIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBiaWcgZW5vdWdoLgogICAgLy8gQSBzaW5nbGUgY29kZSB1bml0IHVzZXMgYXQgbW9zdCAzIGJ5dGVzLCBhIHN1cnJvZ2F0ZSBwYWlyIGF0IG1vc3QgNC4KICAgIHZhciBlbmNvZGVyID0gX1V0ZjhFbmNvZGVyLndpdGhCdWZmZXJTaXplKGxlbmd0aCAqIDMpOwogICAgdmFyIGVuZFBvc2l0aW9uID0gZW5jb2Rlci5fZmlsbEJ1ZmZlcihzdHJpbmcsIHN0YXJ0LCBlbmQpOwogICAgYXNzZXJ0KGVuZFBvc2l0aW9uID49IGVuZCAtIDEpOwogICAgaWYgKGVuZFBvc2l0aW9uICE9IGVuZCkgewogICAgICAvLyBFbmNvZGluZyBza2lwcGVkIHRoZSBsYXN0IGNvZGUgdW5pdC4KICAgICAgLy8gVGhhdCBjYW4gb25seSBoYXBwZW4gaWYgdGhlIGxhc3QgY29kZSB1bml0IGlzIGEgbGVhZHN1cnJvZ2F0ZS4KICAgICAgLy8gRm9yY2UgZW5jb2Rpbmcgb2YgdGhlIGxlYWQgc3Vycm9nYXRlIGJ5IGl0c2VsZi4KICAgICAgdmFyIGxhc3RDb2RlVW5pdCA9IHN0cmluZy5jb2RlVW5pdEF0KGVuZCAtIDEpOwogICAgICBhc3NlcnQoX2lzTGVhZFN1cnJvZ2F0ZShsYXN0Q29kZVVuaXQpKTsKICAgICAgLy8gV2UgdXNlIGEgbm9uLXN1cnJvZ2F0ZSBhcyBgbmV4dFVuaXRgIHNvIHRoYXQgX3dyaXRlU3Vycm9nYXRlIGp1c3QKICAgICAgLy8gd3JpdGVzIHRoZSBsZWFkLXN1cnJvZ2F0ZS4KICAgICAgdmFyIHdhc0NvbWJpbmVkID0gZW5jb2Rlci5fd3JpdGVTdXJyb2dhdGUobGFzdENvZGVVbml0LCAwKTsKICAgICAgYXNzZXJ0KCF3YXNDb21iaW5lZCk7CiAgICB9CiAgICByZXR1cm4gZW5jb2Rlci5fYnVmZmVyLnN1Ymxpc3QoMCwgZW5jb2Rlci5fYnVmZmVySW5kZXgpOwogIH0KCiAgLy8vIFN0YXJ0cyBhIGNodW5rZWQgY29udmVyc2lvbi4KICAvLy8KICAvLy8gVGhlIGNvbnZlcnRlciB3b3JrcyBtb3JlIGVmZmljaWVudGx5IGlmIHRoZSBnaXZlbiBbc2lua10gaXMgYQogIC8vLyBbQnl0ZUNvbnZlcnNpb25TaW5rXS4KICBTdHJpbmdDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8TGlzdDxpbnQ+PiBzaW5rKSB7CiAgICByZXR1cm4gX1V0ZjhFbmNvZGVyU2luaygKICAgICAgICBzaW5rIGlzIEJ5dGVDb252ZXJzaW9uU2luayA/IHNpbmsgOiBCeXRlQ29udmVyc2lvblNpbmsuZnJvbShzaW5rKSk7CiAgfQoKICAvLyBPdmVycmlkZSB0aGUgYmFzZS1jbGFzc2VzIGJpbmQsIHRvIHByb3ZpZGUgYSBiZXR0ZXIgdHlwZS4KICBTdHJlYW08TGlzdDxpbnQ+PiBiaW5kKFN0cmVhbTxTdHJpbmc+IHN0cmVhbSkgPT4gc3VwZXIuYmluZChzdHJlYW0pOwp9CgovLy8gVGhpcyBjbGFzcyBlbmNvZGVzIFN0cmluZ3MgdG8gVVRGLTggY29kZSB1bml0cyAodW5zaWduZWQgOCBiaXQgaW50ZWdlcnMpLgovLyBUT0RPKGZsb2l0c2NoKTogbWFrZSB0aGlzIGNsYXNzIHB1YmxpYy4KY2xhc3MgX1V0ZjhFbmNvZGVyIHsKICBpbnQgX2NhcnJ5ID0gMDsKICBpbnQgX2J1ZmZlckluZGV4ID0gMDsKICBmaW5hbCBVaW50OExpc3QgX2J1ZmZlcjsKCiAgc3RhdGljIGNvbnN0IF9ERUZBVUxUX0JZVEVfQlVGRkVSX1NJWkUgPSAxMDI0OwoKICBfVXRmOEVuY29kZXIoKSA6IHRoaXMud2l0aEJ1ZmZlclNpemUoX0RFRkFVTFRfQllURV9CVUZGRVJfU0laRSk7CgogIF9VdGY4RW5jb2Rlci53aXRoQnVmZmVyU2l6ZShpbnQgYnVmZmVyU2l6ZSkKICAgICAgOiBfYnVmZmVyID0gX2NyZWF0ZUJ1ZmZlcihidWZmZXJTaXplKTsKCiAgLy8vIEFsbG93IGFuIGltcGxlbWVudGF0aW9uIHRvIHBpY2sgdGhlIG1vc3QgZWZmaWNpZW50IHdheSBvZiBzdG9yaW5nIGJ5dGVzLgogIHN0YXRpYyBVaW50OExpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gVWludDhMaXN0KHNpemUpOwoKICAvLy8gVHJpZXMgdG8gY29tYmluZSB0aGUgZ2l2ZW4gW2xlYWRpbmdTdXJyb2dhdGVdIHdpdGggdGhlIFtuZXh0Q29kZVVuaXRdIGFuZAogIC8vLyB3cml0ZXMgaXQgdG8gW19idWZmZXJdLgogIC8vLwogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIFtuZXh0Q29kZVVuaXRdIHdhcyBjb21iaW5lZCB3aXRoIHRoZQogIC8vLyBbbGVhZGluZ1N1cnJvZ2F0ZV0uIElmIGl0IHdhc24ndCB0aGVuIG5leHRDb2RlVW5pdCB3YXMgbm90IGEgdHJhaWxpbmcKICAvLy8gc3Vycm9nYXRlIGFuZCBoYXMgbm90IGJlZW4gd3JpdHRlbiB5ZXQuCiAgLy8vCiAgLy8vIEl0IGlzIHNhZmUgdG8gcGFzcyAwIGZvciBbbmV4dENvZGVVbml0XSBpbiB3aGljaCBjYXNlIG9ubHkgdGhlIGxlYWRpbmcKICAvLy8gc3Vycm9nYXRlIGlzIHdyaXR0ZW4uCiAgYm9vbCBfd3JpdGVTdXJyb2dhdGUoaW50IGxlYWRpbmdTdXJyb2dhdGUsIGludCBuZXh0Q29kZVVuaXQpIHsKICAgIGlmIChfaXNUYWlsU3Vycm9nYXRlKG5leHRDb2RlVW5pdCkpIHsKICAgICAgdmFyIHJ1bmUgPSBfY29tYmluZVN1cnJvZ2F0ZVBhaXIobGVhZGluZ1N1cnJvZ2F0ZSwgbmV4dENvZGVVbml0KTsKICAgICAgLy8gSWYgdGhlIHJ1bmUgaXMgZW5jb2RlZCB3aXRoIDIgY29kZS11bml0cyB0aGVuIGl0IG11c3QgYmUgZW5jb2RlZAogICAgICAvLyB3aXRoIDQgYnl0ZXMgaW4gVVRGLTguCiAgICAgIGFzc2VydChydW5lID4gX1RIUkVFX0JZVEVfTElNSVQpOwogICAgICBhc3NlcnQocnVuZSA8PSBfRk9VUl9CWVRFX0xJTUlUKTsKICAgICAgX2J1ZmZlcltfYnVmZmVySW5kZXgrK10gPSAweEYwIHwgKHJ1bmUgPj4gMTgpOwogICAgICBfYnVmZmVyW19idWZmZXJJbmRleCsrXSA9IDB4ODAgfCAoKHJ1bmUgPj4gMTIpICYgMHgzZik7CiAgICAgIF9idWZmZXJbX2J1ZmZlckluZGV4KytdID0gMHg4MCB8ICgocnVuZSA+PiA2KSAmIDB4M2YpOwogICAgICBfYnVmZmVyW19idWZmZXJJbmRleCsrXSA9IDB4ODAgfCAocnVuZSAmIDB4M2YpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBhbGxvdyB0byB0aHJvdyBvbiBtYWxmb3JtZWQgc3RyaW5ncy4KICAgICAgLy8gRW5jb2RlIHRoZSBoYWxmLXN1cnJvZ2F0ZSBkaXJlY3RseSBpbnRvIFVURi04LiBUaGlzIHlpZWxkcwogICAgICAvLyBpbnZhbGlkIFVURi04LCBidXQgd2Ugc3RhcnRlZCBvdXQgd2l0aCBpbnZhbGlkIFVURi0xNi4KCiAgICAgIC8vIFN1cnJvZ2F0ZXMgYXJlIGFsd2F5cyBlbmNvZGVkIGluIDMgYnl0ZXMgaW4gVVRGLTguCiAgICAgIF9idWZmZXJbX2J1ZmZlckluZGV4KytdID0gMHhFMCB8IChsZWFkaW5nU3Vycm9nYXRlID4+IDEyKTsKICAgICAgX2J1ZmZlcltfYnVmZmVySW5kZXgrK10gPSAweDgwIHwgKChsZWFkaW5nU3Vycm9nYXRlID4+IDYpICYgMHgzZik7CiAgICAgIF9idWZmZXJbX2J1ZmZlckluZGV4KytdID0gMHg4MCB8IChsZWFkaW5nU3Vycm9nYXRlICYgMHgzZik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vLyBGaWxscyB0aGUgW19idWZmZXJdIHdpdGggYXMgbWFueSBjaGFyYWN0ZXJzIGFzIHBvc3NpYmxlLgogIC8vLwogIC8vLyBEb2VzIG5vdCBlbmNvZGUgYW55IHRyYWlsaW5nIGxlYWQtc3Vycm9nYXRlLiBUaGlzIG11c3QgYmUgZG9uZSBieSB0aGUKICAvLy8gY2FsbGVyLgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nLiBUaGUgcmV0dXJuZWQgaW5kZXggcG9pbnRzIHRvIHRoZQogIC8vLyBmaXJzdCBjb2RlIHVuaXQgdGhhdCBoYXNuJ3QgYmVlbiBlbmNvZGVkLgogIGludCBfZmlsbEJ1ZmZlcihTdHJpbmcgc3RyLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGlmIChzdGFydCAhPSBlbmQgJiYgX2lzTGVhZFN1cnJvZ2F0ZShzdHIuY29kZVVuaXRBdChlbmQgLSAxKSkpIHsKICAgICAgLy8gRG9uJ3QgaGFuZGxlIGEgdHJhaWxpbmcgbGVhZC1zdXJyb2dhdGUgaW4gdGhpcyBsb29wLiBUaGUgY2FsbGVyIGhhcwogICAgICAvLyB0byBkZWFsIHdpdGggdGhvc2UuCiAgICAgIGVuZC0tOwogICAgfQogICAgaW50IHN0cmluZ0luZGV4OwogICAgZm9yIChzdHJpbmdJbmRleCA9IHN0YXJ0OyBzdHJpbmdJbmRleCA8IGVuZDsgc3RyaW5nSW5kZXgrKykgewogICAgICB2YXIgY29kZVVuaXQgPSBzdHIuY29kZVVuaXRBdChzdHJpbmdJbmRleCk7CiAgICAgIC8vIEFTQ0lJIGhhcyB0aGUgc2FtZSByZXByZXNlbnRhdGlvbiBpbiBVVEYtOCBhbmQgVVRGLTE2LgogICAgICBpZiAoY29kZVVuaXQgPD0gX09ORV9CWVRFX0xJTUlUKSB7CiAgICAgICAgaWYgKF9idWZmZXJJbmRleCA+PSBfYnVmZmVyLmxlbmd0aCkgYnJlYWs7CiAgICAgICAgX2J1ZmZlcltfYnVmZmVySW5kZXgrK10gPSBjb2RlVW5pdDsKICAgICAgfSBlbHNlIGlmIChfaXNMZWFkU3Vycm9nYXRlKGNvZGVVbml0KSkgewogICAgICAgIGlmIChfYnVmZmVySW5kZXggKyAzID49IF9idWZmZXIubGVuZ3RoKSBicmVhazsKICAgICAgICAvLyBOb3RlIHRoYXQgaXQgaXMgc2FmZSB0byByZWFkIHRoZSBuZXh0IGNvZGUgdW5pdC4gV2UgZGVjcmVtZW50ZWQKICAgICAgICAvLyBbZW5kXSBhYm92ZSB3aGVuIHRoZSBsYXN0IHZhbGlkIGNvZGUgdW5pdCB3YXMgYSBsZWFkaW5nIHN1cnJvZ2F0ZS4KICAgICAgICB2YXIgbmV4dENvZGVVbml0ID0gc3RyLmNvZGVVbml0QXQoc3RyaW5nSW5kZXggKyAxKTsKICAgICAgICB2YXIgd2FzQ29tYmluZWQgPSBfd3JpdGVTdXJyb2dhdGUoY29kZVVuaXQsIG5leHRDb2RlVW5pdCk7CiAgICAgICAgaWYgKHdhc0NvbWJpbmVkKSBzdHJpbmdJbmRleCsrOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBydW5lID0gY29kZVVuaXQ7CiAgICAgICAgaWYgKHJ1bmUgPD0gX1RXT19CWVRFX0xJTUlUKSB7CiAgICAgICAgICBpZiAoX2J1ZmZlckluZGV4ICsgMSA+PSBfYnVmZmVyLmxlbmd0aCkgYnJlYWs7CiAgICAgICAgICBfYnVmZmVyW19idWZmZXJJbmRleCsrXSA9IDB4QzAgfCAocnVuZSA+PiA2KTsKICAgICAgICAgIF9idWZmZXJbX2J1ZmZlckluZGV4KytdID0gMHg4MCB8IChydW5lICYgMHgzZik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFzc2VydChydW5lIDw9IF9USFJFRV9CWVRFX0xJTUlUKTsKICAgICAgICAgIGlmIChfYnVmZmVySW5kZXggKyAyID49IF9idWZmZXIubGVuZ3RoKSBicmVhazsKICAgICAgICAgIF9idWZmZXJbX2J1ZmZlckluZGV4KytdID0gMHhFMCB8IChydW5lID4+IDEyKTsKICAgICAgICAgIF9idWZmZXJbX2J1ZmZlckluZGV4KytdID0gMHg4MCB8ICgocnVuZSA+PiA2KSAmIDB4M2YpOwogICAgICAgICAgX2J1ZmZlcltfYnVmZmVySW5kZXgrK10gPSAweDgwIHwgKHJ1bmUgJiAweDNmKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdHJpbmdJbmRleDsKICB9Cn0KCi8vLyBUaGlzIGNsYXNzIGVuY29kZXMgY2h1bmtlZCBzdHJpbmdzIHRvIFVURi04IGNvZGUgdW5pdHMgKHVuc2lnbmVkIDgtYml0Ci8vLyBpbnRlZ2VycykuCmNsYXNzIF9VdGY4RW5jb2RlclNpbmsgZXh0ZW5kcyBfVXRmOEVuY29kZXIgd2l0aCBTdHJpbmdDb252ZXJzaW9uU2lua01peGluIHsKICBmaW5hbCBCeXRlQ29udmVyc2lvblNpbmsgX3Npbms7CgogIF9VdGY4RW5jb2RlclNpbmsodGhpcy5fc2luayk7CgogIHZvaWQgY2xvc2UoKSB7CiAgICBpZiAoX2NhcnJ5ICE9IDApIHsKICAgICAgLy8gYWRkU2xpY2Ugd2lsbCBjYWxsIGNsb3NlIGFnYWluLCBidXQgdGhlbiB0aGUgY2FycnkgbXVzdCBiZSBlcXVhbCB0byAwLgogICAgICBhZGRTbGljZSgiIiwgMCwgMCwgdHJ1ZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKFN0cmluZyBzdHIsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIF9idWZmZXJJbmRleCA9IDA7CgogICAgaWYgKHN0YXJ0ID09IGVuZCAmJiAhaXNMYXN0KSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoX2NhcnJ5ICE9IDApIHsKICAgICAgdmFyIG5leHRDb2RlVW5pdCA9IDA7CiAgICAgIGlmIChzdGFydCAhPSBlbmQpIHsKICAgICAgICBuZXh0Q29kZVVuaXQgPSBzdHIuY29kZVVuaXRBdChzdGFydCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KGlzTGFzdCk7CiAgICAgIH0KICAgICAgdmFyIHdhc0NvbWJpbmVkID0gX3dyaXRlU3Vycm9nYXRlKF9jYXJyeSwgbmV4dENvZGVVbml0KTsKICAgICAgLy8gRWl0aGVyIHdlIGdvdCBhIG5vbi1lbXB0eSBzdHJpbmcsIG9yIHdlIG11c3Qgbm90IGhhdmUgYmVlbiBjb21iaW5lZC4KICAgICAgYXNzZXJ0KCF3YXNDb21iaW5lZCB8fCBzdGFydCAhPSBlbmQpOwogICAgICBpZiAod2FzQ29tYmluZWQpIHN0YXJ0Kys7CiAgICAgIF9jYXJyeSA9IDA7CiAgICB9CiAgICBkbyB7CiAgICAgIHN0YXJ0ID0gX2ZpbGxCdWZmZXIoc3RyLCBzdGFydCwgZW5kKTsKICAgICAgdmFyIGlzTGFzdFNsaWNlID0gaXNMYXN0ICYmIChzdGFydCA9PSBlbmQpOwogICAgICBpZiAoc3RhcnQgPT0gZW5kIC0gMSAmJiBfaXNMZWFkU3Vycm9nYXRlKHN0ci5jb2RlVW5pdEF0KHN0YXJ0KSkpIHsKICAgICAgICBpZiAoaXNMYXN0ICYmIF9idWZmZXJJbmRleCA8IF9idWZmZXIubGVuZ3RoIC0gMykgewogICAgICAgICAgLy8gVGhlcmUgaXMgc3RpbGwgc3BhY2UgZm9yIHRoZSBsYXN0IGluY29tcGxldGUgc3Vycm9nYXRlLgogICAgICAgICAgLy8gV2UgdXNlIGEgbm9uLXN1cnJvZ2F0ZSBhcyBzZWNvbmQgYXJndW1lbnQuIFRoaXMgd2F5IHRoZQogICAgICAgICAgLy8gZnVuY3Rpb24gd2lsbCBqdXN0IGFkZCB0aGUgc3Vycm9nYXRlLWhhbGYgdG8gdGhlIGJ1ZmZlci4KICAgICAgICAgIHZhciBoYXNCZWVuQ29tYmluZWQgPSBfd3JpdGVTdXJyb2dhdGUoc3RyLmNvZGVVbml0QXQoc3RhcnQpLCAwKTsKICAgICAgICAgIGFzc2VydCghaGFzQmVlbkNvbWJpbmVkKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gT3RoZXJ3aXNlIHN0b3JlIGl0IGluIHRoZSBjYXJyeS4gSWYgaXNMYXN0IGlzIHRydWUsIHRoZW4KICAgICAgICAgIC8vIGNsb3NlIHdpbGwgZmx1c2ggdGhlIGxhc3QgY2FycnkuCiAgICAgICAgICBfY2FycnkgPSBzdHIuY29kZVVuaXRBdChzdGFydCk7CiAgICAgICAgfQogICAgICAgIHN0YXJ0Kys7CiAgICAgIH0KICAgICAgX3NpbmsuYWRkU2xpY2UoX2J1ZmZlciwgMCwgX2J1ZmZlckluZGV4LCBpc0xhc3RTbGljZSk7CiAgICAgIF9idWZmZXJJbmRleCA9IDA7CiAgICB9IHdoaWxlIChzdGFydCA8IGVuZCk7CiAgICBpZiAoaXNMYXN0KSBjbG9zZSgpOwogIH0KCiAgLy8gVE9ETyhmbG9pdHNjaCk6IGltcGxlbWVudCBhc1V0ZjhTaW5rLiBTbGlndGhseSBjb21wbGljYXRlZCBiZWNhdXNlIGl0CiAgLy8gbmVlZHMgdG8gZGVhbCB3aXRoIG1hbGZvcm1lZCBpbnB1dC4KfQoKLy8vIFRoaXMgY2xhc3MgY29udmVydHMgVVRGLTggY29kZSB1bml0cyAobGlzdHMgb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlcnMpCi8vLyB0byBhIHN0cmluZy4KY2xhc3MgVXRmOERlY29kZXIgZXh0ZW5kcyBDb252ZXJ0ZXI8TGlzdDxpbnQ+LCBTdHJpbmc+IHsKICBmaW5hbCBib29sIF9hbGxvd01hbGZvcm1lZDsKCiAgLy8vIEluc3RhbnRpYXRlcyBhIG5ldyBbVXRmOERlY29kZXJdLgogIC8vLwogIC8vLyBUaGUgb3B0aW9uYWwgW2FsbG93TWFsZm9ybWVkXSBhcmd1bWVudCBkZWZpbmVzIGhvdyBbY29udmVydF0gZGVhbHMKICAvLy8gd2l0aCBpbnZhbGlkIG9yIHVudGVybWluYXRlZCBjaGFyYWN0ZXIgc2VxdWVuY2VzLgogIC8vLwogIC8vLyBJZiBpdCBpcyBgdHJ1ZWAgW2NvbnZlcnRdIHJlcGxhY2VzIGludmFsaWQgKG9yIHVudGVybWluYXRlZCkgY2hhcmFjdGVyCiAgLy8vIHNlcXVlbmNlcyB3aXRoIHRoZSBVbmljb2RlIFJlcGxhY2VtZW50IGNoYXJhY3RlciBgVStGRkZEYCAo77+9KS4gT3RoZXJ3aXNlCiAgLy8vIGl0IHRocm93cyBhIFtGb3JtYXRFeGNlcHRpb25dLgogIGNvbnN0IFV0ZjhEZWNvZGVyKHtib29sIGFsbG93TWFsZm9ybWVkID0gZmFsc2V9KQogICAgICA6IF9hbGxvd01hbGZvcm1lZCA9IGFsbG93TWFsZm9ybWVkOwoKICAvLy8gQ29udmVydHMgdGhlIFVURi04IFtjb2RlVW5pdHNdIChhIGxpc3Qgb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlcnMpIHRvIHRoZQogIC8vLyBjb3JyZXNwb25kaW5nIHN0cmluZy4KICAvLy8KICAvLy8gVXNlcyB0aGUgY29kZSB1bml0cyBmcm9tIFtzdGFydF0gdG8sIGJ1dCBubyBpbmNsdWRpbmcsIFtlbmRdLgogIC8vLyBJZiBbZW5kXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgY29kZVVuaXRzLmxlbmd0aGAuCiAgLy8vCiAgLy8vIElmIHRoZSBbY29kZVVuaXRzXSBzdGFydCB3aXRoIHRoZSBlbmNvZGluZyBvZiBhCiAgLy8vIFt1bmljb2RlQm9tQ2hhcmFjdGVyUnVuZV0sIHRoYXQgY2hhcmFjdGVyIGlzIGRpc2NhcmRlZC4KICBTdHJpbmcgY29udmVydChMaXN0PGludD4gY29kZVVuaXRzLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIC8vIEFsbG93IHRoZSBpbXBsZW1lbnRhdGlvbiB0byBpbnRlcmNlcHQgYW5kIHNwZWNpYWxpemUgYmFzZWQgb24gdGhlIHR5cGUKICAgIC8vIG9mIGNvZGVVbml0cy4KICAgIHZhciByZXN1bHQgPSBfY29udmVydEludGVyY2VwdGVkKF9hbGxvd01hbGZvcm1lZCwgY29kZVVuaXRzLCBzdGFydCwgZW5kKTsKICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBsZW5ndGggPSBjb2RlVW5pdHMubGVuZ3RoOwogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgbGVuZ3RoKTsKCiAgICAvLyBGYXN0IGNhc2UgZm9yIEFTQ0lJIHN0cmluZ3MgYXZvaWRzIFN0cmluZ0J1ZmZlci9fVXRmOERlY29kZXIuCiAgICBpbnQgb25lQnl0ZXMgPSBfc2Nhbk9uZUJ5dGVDaGFyYWN0ZXJzKGNvZGVVbml0cywgc3RhcnQsIGVuZCk7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyOwogICAgYm9vbCBpc0ZpcnN0Q2hhcmFjdGVyID0gdHJ1ZTsKICAgIGlmIChvbmVCeXRlcyA+IDApIHsKICAgICAgdmFyIGZpcnN0UGFydCA9IFN0cmluZy5mcm9tQ2hhckNvZGVzKGNvZGVVbml0cywgc3RhcnQsIHN0YXJ0ICsgb25lQnl0ZXMpOwogICAgICBzdGFydCArPSBvbmVCeXRlczsKICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewogICAgICAgIHJldHVybiBmaXJzdFBhcnQ7CiAgICAgIH0KICAgICAgYnVmZmVyID0gU3RyaW5nQnVmZmVyKGZpcnN0UGFydCk7CiAgICAgIGlzRmlyc3RDaGFyYWN0ZXIgPSBmYWxzZTsKICAgIH0KCiAgICBidWZmZXIgPz89IFN0cmluZ0J1ZmZlcigpOwogICAgdmFyIGRlY29kZXIgPSBfVXRmOERlY29kZXIoYnVmZmVyLCBfYWxsb3dNYWxmb3JtZWQpOwogICAgZGVjb2Rlci5faXNGaXJzdENoYXJhY3RlciA9IGlzRmlyc3RDaGFyYWN0ZXI7CiAgICBkZWNvZGVyLmNvbnZlcnQoY29kZVVuaXRzLCBzdGFydCwgZW5kKTsKICAgIGRlY29kZXIuZmx1c2goY29kZVVuaXRzLCBlbmQpOwogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgLy8vIFN0YXJ0cyBhIGNodW5rZWQgY29udmVyc2lvbi4KICAvLy8KICAvLy8gVGhlIGNvbnZlcnRlciB3b3JrcyBtb3JlIGVmZmljaWVudGx5IGlmIHRoZSBnaXZlbiBbc2lua10gaXMgYQogIC8vLyBbU3RyaW5nQ29udmVyc2lvblNpbmtdLgogIEJ5dGVDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8U3RyaW5nPiBzaW5rKSB7CiAgICBTdHJpbmdDb252ZXJzaW9uU2luayBzdHJpbmdTaW5rOwogICAgaWYgKHNpbmsgaXMgU3RyaW5nQ29udmVyc2lvblNpbmspIHsKICAgICAgc3RyaW5nU2luayA9IHNpbms7CiAgICB9IGVsc2UgewogICAgICBzdHJpbmdTaW5rID0gU3RyaW5nQ29udmVyc2lvblNpbmsuZnJvbShzaW5rKTsKICAgIH0KICAgIHJldHVybiBzdHJpbmdTaW5rLmFzVXRmOFNpbmsoX2FsbG93TWFsZm9ybWVkKTsKICB9CgogIC8vIE92ZXJyaWRlIHRoZSBiYXNlLWNsYXNzZXMgYmluZCwgdG8gcHJvdmlkZSBhIGJldHRlciB0eXBlLgogIFN0cmVhbTxTdHJpbmc+IGJpbmQoU3RyZWFtPExpc3Q8aW50Pj4gc3RyZWFtKSA9PiBzdXBlci5iaW5kKHN0cmVhbSk7CgogIGV4dGVybmFsIENvbnZlcnRlcjxMaXN0PGludD4sIFQ+IGZ1c2U8VD4oQ29udmVydGVyPFN0cmluZywgVD4gbmV4dCk7CgogIGV4dGVybmFsIHN0YXRpYyBTdHJpbmcgX2NvbnZlcnRJbnRlcmNlcHRlZCgKICAgICAgYm9vbCBhbGxvd01hbGZvcm1lZCwgTGlzdDxpbnQ+IGNvZGVVbml0cywgaW50IHN0YXJ0LCBpbnQgZW5kKTsKfQoKLy8gVVRGLTggY29uc3RhbnRzLgpjb25zdCBpbnQgX09ORV9CWVRFX0xJTUlUID0gMHg3ZjsgLy8gNyBiaXRzCmNvbnN0IGludCBfVFdPX0JZVEVfTElNSVQgPSAweDdmZjsgLy8gMTEgYml0cwpjb25zdCBpbnQgX1RIUkVFX0JZVEVfTElNSVQgPSAweGZmZmY7IC8vIDE2IGJpdHMKY29uc3QgaW50IF9GT1VSX0JZVEVfTElNSVQgPSAweDEwZmZmZjsgLy8gMjEgYml0cywgdHJ1bmNhdGVkIHRvIFVuaWNvZGUgbWF4LgoKLy8gVVRGLTE2IGNvbnN0YW50cy4KY29uc3QgaW50IF9TVVJST0dBVEVfVEFHX01BU0sgPSAweEZDMDA7CmNvbnN0IGludCBfU1VSUk9HQVRFX1ZBTFVFX01BU0sgPSAweDNGRjsKY29uc3QgaW50IF9MRUFEX1NVUlJPR0FURV9NSU4gPSAweEQ4MDA7CmNvbnN0IGludCBfVEFJTF9TVVJST0dBVEVfTUlOID0gMHhEQzAwOwoKYm9vbCBfaXNMZWFkU3Vycm9nYXRlKGludCBjb2RlVW5pdCkgPT4KICAgIChjb2RlVW5pdCAmIF9TVVJST0dBVEVfVEFHX01BU0spID09IF9MRUFEX1NVUlJPR0FURV9NSU47CmJvb2wgX2lzVGFpbFN1cnJvZ2F0ZShpbnQgY29kZVVuaXQpID0+CiAgICAoY29kZVVuaXQgJiBfU1VSUk9HQVRFX1RBR19NQVNLKSA9PSBfVEFJTF9TVVJST0dBVEVfTUlOOwppbnQgX2NvbWJpbmVTdXJyb2dhdGVQYWlyKGludCBsZWFkLCBpbnQgdGFpbCkgPT4KICAgIDB4MTAwMDAgKyAoKGxlYWQgJiBfU1VSUk9HQVRFX1ZBTFVFX01BU0spIDw8IDEwKSB8CiAgICAodGFpbCAmIF9TVVJST0dBVEVfVkFMVUVfTUFTSyk7CgovLy8gRGVjb2RlcyBVVEYtOC4KLy8vCi8vLyBUaGUgZGVjb2RlciBoYW5kbGVzIGNodW5rZWQgaW5wdXQuCi8vIFRPRE8oZmxvaXRzY2gpOiBtYWtlIHRoaXMgY2xhc3MgcHVibGljLgpjbGFzcyBfVXRmOERlY29kZXIgewogIGZpbmFsIGJvb2wgX2FsbG93TWFsZm9ybWVkOwogIGZpbmFsIFN0cmluZ1NpbmsgX3N0cmluZ1Npbms7CiAgYm9vbCBfaXNGaXJzdENoYXJhY3RlciA9IHRydWU7CiAgaW50IF92YWx1ZSA9IDA7CiAgaW50IF9leHBlY3RlZFVuaXRzID0gMDsKICBpbnQgX2V4dHJhVW5pdHMgPSAwOwoKICBfVXRmOERlY29kZXIodGhpcy5fc3RyaW5nU2luaywgdGhpcy5fYWxsb3dNYWxmb3JtZWQpOwoKICBib29sIGdldCBoYXNQYXJ0aWFsSW5wdXQgPT4gX2V4cGVjdGVkVW5pdHMgPiAwOwoKICAvLyBMaW1pdHMgb2Ygb25lIHRocm91Z2ggZm91ciBieXRlIGVuY29kaW5ncy4KICBzdGF0aWMgY29uc3QgTGlzdDxpbnQ+IF9MSU1JVFMgPSA8aW50PlsKICAgIF9PTkVfQllURV9MSU1JVCwKICAgIF9UV09fQllURV9MSU1JVCwKICAgIF9USFJFRV9CWVRFX0xJTUlULAogICAgX0ZPVVJfQllURV9MSU1JVAogIF07CgogIHZvaWQgY2xvc2UoKSB7CiAgICBmbHVzaCgpOwogIH0KCiAgLy8vIEZsdXNoZXMgdGhpcyBkZWNvZGVyIGFzIGlmIGNsb3NlZC4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgdGhyb3dzIGlmIHRoZSBpbnB1dCB3YXMgcGFydGlhbCBhbmQgdGhlIGRlY29kZXIgd2FzCiAgLy8vIGNvbnN0cnVjdGVkIHdpdGggYGFsbG93TWFsZm9ybWVkYCBzZXQgdG8gYGZhbHNlYC4KICAvLy8KICAvLy8gVGhlIFtzb3VyY2VdIGFuZCBbb2Zmc2V0XSBvZiB0aGUgY3VycmVudCBwb3NpdGlvbiBtYXkgYmUgcHJvdmlkZWQsCiAgLy8vIGFuZCBhcmUgaW5jbHVkZWQgaW4gdGhlIGV4Y2VwdGlvbiBpZiBvbmUgaXMgdGhyb3duLgogIHZvaWQgZmx1c2goW0xpc3Q8aW50PiBzb3VyY2UsIGludCBvZmZzZXRdKSB7CiAgICBpZiAoaGFzUGFydGlhbElucHV0KSB7CiAgICAgIGlmICghX2FsbG93TWFsZm9ybWVkKSB7CiAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAiVW5maW5pc2hlZCBVVEYtOCBvY3RldCBzZXF1ZW5jZSIsIHNvdXJjZSwgb2Zmc2V0KTsKICAgICAgfQogICAgICBfc3RyaW5nU2luay53cml0ZUNoYXJDb2RlKHVuaWNvZGVSZXBsYWNlbWVudENoYXJhY3RlclJ1bmUpOwogICAgICBfdmFsdWUgPSAwOwogICAgICBfZXhwZWN0ZWRVbml0cyA9IDA7CiAgICAgIF9leHRyYVVuaXRzID0gMDsKICAgIH0KICB9CgogIHZvaWQgY29udmVydChMaXN0PGludD4gY29kZVVuaXRzLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7CiAgICB2YXIgdmFsdWUgPSBfdmFsdWU7CiAgICB2YXIgZXhwZWN0ZWRVbml0cyA9IF9leHBlY3RlZFVuaXRzOwogICAgdmFyIGV4dHJhVW5pdHMgPSBfZXh0cmFVbml0czsKICAgIF92YWx1ZSA9IDA7CiAgICBfZXhwZWN0ZWRVbml0cyA9IDA7CiAgICBfZXh0cmFVbml0cyA9IDA7CgogICAgdmFyIGkgPSBzdGFydEluZGV4OwogICAgbG9vcDoKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIG11bHRpYnl0ZToKICAgICAgaWYgKGV4cGVjdGVkVW5pdHMgPiAwKSB7CiAgICAgICAgZG8gewogICAgICAgICAgaWYgKGkgPT0gZW5kSW5kZXgpIHsKICAgICAgICAgICAgYnJlYWsgbG9vcDsKICAgICAgICAgIH0KICAgICAgICAgIHZhciB1bml0ID0gY29kZVVuaXRzW2ldOwogICAgICAgICAgaWYgKCh1bml0ICYgMHhDMCkgIT0gMHg4MCkgewogICAgICAgICAgICBleHBlY3RlZFVuaXRzID0gMDsKICAgICAgICAgICAgaWYgKCFfYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICJCYWQgVVRGLTggZW5jb2RpbmcgMHgke3VuaXQudG9SYWRpeFN0cmluZygxNil9IiwKICAgICAgICAgICAgICAgICAgY29kZVVuaXRzLAogICAgICAgICAgICAgICAgICBpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfaXNGaXJzdENoYXJhY3RlciA9IGZhbHNlOwogICAgICAgICAgICBfc3RyaW5nU2luay53cml0ZUNoYXJDb2RlKHVuaWNvZGVSZXBsYWNlbWVudENoYXJhY3RlclJ1bmUpOwogICAgICAgICAgICBicmVhayBtdWx0aWJ5dGU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA2KSB8ICh1bml0ICYgMHgzZik7CiAgICAgICAgICAgIGV4cGVjdGVkVW5pdHMtLTsKICAgICAgICAgICAgaSsrOwogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKGV4cGVjdGVkVW5pdHMgPiAwKTsKICAgICAgICBpZiAodmFsdWUgPD0gX0xJTUlUU1tleHRyYVVuaXRzIC0gMV0pIHsKICAgICAgICAgIC8vIE92ZXJseSBsb25nIGVuY29kaW5nLiBUaGUgdmFsdWUgY291bGQgYmUgZW5jb2RlZCB3aXRoIGEgc2hvcnRlcgogICAgICAgICAgLy8gZW5jb2RpbmcuCiAgICAgICAgICBpZiAoIV9hbGxvd01hbGZvcm1lZCkgewogICAgICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAiT3ZlcmxvbmcgZW5jb2Rpbmcgb2YgMHgke3ZhbHVlLnRvUmFkaXhTdHJpbmcoMTYpfSIsCiAgICAgICAgICAgICAgICBjb2RlVW5pdHMsCiAgICAgICAgICAgICAgICBpIC0gZXh0cmFVbml0cyAtIDEpOwogICAgICAgICAgfQogICAgICAgICAgZXhwZWN0ZWRVbml0cyA9IGV4dHJhVW5pdHMgPSAwOwogICAgICAgICAgdmFsdWUgPSB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJSdW5lOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgPiBfRk9VUl9CWVRFX0xJTUlUKSB7CiAgICAgICAgICBpZiAoIV9hbGxvd01hbGZvcm1lZCkgewogICAgICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAiQ2hhcmFjdGVyIG91dHNpZGUgdmFsaWQgVW5pY29kZSByYW5nZTogIgogICAgICAgICAgICAgICAgIjB4JHt2YWx1ZS50b1JhZGl4U3RyaW5nKDE2KX0iLAogICAgICAgICAgICAgICAgY29kZVVuaXRzLAogICAgICAgICAgICAgICAgaSAtIGV4dHJhVW5pdHMgLSAxKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhbHVlID0gdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyUnVuZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFfaXNGaXJzdENoYXJhY3RlciB8fCB2YWx1ZSAhPSB1bmljb2RlQm9tQ2hhcmFjdGVyUnVuZSkgewogICAgICAgICAgX3N0cmluZ1Npbmsud3JpdGVDaGFyQ29kZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIF9pc0ZpcnN0Q2hhcmFjdGVyID0gZmFsc2U7CiAgICAgIH0KCiAgICAgIHdoaWxlIChpIDwgZW5kSW5kZXgpIHsKICAgICAgICB2YXIgb25lQnl0ZXMgPSBfc2Nhbk9uZUJ5dGVDaGFyYWN0ZXJzKGNvZGVVbml0cywgaSwgZW5kSW5kZXgpOwogICAgICAgIGlmIChvbmVCeXRlcyA+IDApIHsKICAgICAgICAgIF9pc0ZpcnN0Q2hhcmFjdGVyID0gZmFsc2U7CiAgICAgICAgICBhc3NlcnQoaSArIG9uZUJ5dGVzIDw9IGVuZEluZGV4KTsKICAgICAgICAgIF9zdHJpbmdTaW5rLndyaXRlKFN0cmluZy5mcm9tQ2hhckNvZGVzKGNvZGVVbml0cywgaSwgaSArIG9uZUJ5dGVzKSk7CgogICAgICAgICAgaSArPSBvbmVCeXRlczsKICAgICAgICAgIGlmIChpID09IGVuZEluZGV4KSBicmVhazsKICAgICAgICB9CiAgICAgICAgdmFyIHVuaXQgPSBjb2RlVW5pdHNbaSsrXTsKICAgICAgICAvLyBUT0RPKGZsb2l0c2NoKTogdGhlIHdheSB3ZSB0ZXN0IHdlIGNvdWxkIHBvdGVudGlhbGx5IGFsbG93CiAgICAgICAgLy8gdW5pdHMgdGhhdCBhcmUgdG9vIGxhcmdlLCBpZiB0aGV5IGhhcHBlbiB0byBoYXZlIHRoZQogICAgICAgIC8vIHJpZ2h0IGJpdC1wYXR0ZXJuLiAoU2FtZSBpcyB0cnVlIGZvciB0aGUgbXVsdGlieXRlIGxvb3AgYWJvdmUpLgogICAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBvcHRpbWl6ZSB0aGlzIGxvb3AuIFNlZToKICAgICAgICAvLyBodHRwczovL2NvZGVyZXZpZXcuY2hyb21pdW0ub3JnLzIyOTI5MDIyL2RpZmYvMS9zZGsvbGliL2NvbnZlcnQvdXRmLmRhcnQ/Y29sdW1uX3dpZHRoPTgwCiAgICAgICAgaWYgKHVuaXQgPCAwKSB7CiAgICAgICAgICAvLyBUT0RPKGZsb2l0c2NoKTogc2hvdWxkIHRoaXMgYmUgdW5pdCA8PSAwID8KICAgICAgICAgIGlmICghX2FsbG93TWFsZm9ybWVkKSB7CiAgICAgICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJOZWdhdGl2ZSBVVEYtOCBjb2RlIHVuaXQ6IC0weCR7KC11bml0KS50b1JhZGl4U3RyaW5nKDE2KX0iLAogICAgICAgICAgICAgICAgY29kZVVuaXRzLAogICAgICAgICAgICAgICAgaSAtIDEpOwogICAgICAgICAgfQogICAgICAgICAgX3N0cmluZ1Npbmsud3JpdGVDaGFyQ29kZSh1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJSdW5lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXNzZXJ0KHVuaXQgPiBfT05FX0JZVEVfTElNSVQpOwogICAgICAgICAgaWYgKCh1bml0ICYgMHhFMCkgPT0gMHhDMCkgewogICAgICAgICAgICB2YWx1ZSA9IHVuaXQgJiAweDFGOwogICAgICAgICAgICBleHBlY3RlZFVuaXRzID0gZXh0cmFVbml0cyA9IDE7CiAgICAgICAgICAgIGNvbnRpbnVlIGxvb3A7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoKHVuaXQgJiAweEYwKSA9PSAweEUwKSB7CiAgICAgICAgICAgIHZhbHVlID0gdW5pdCAmIDB4MEY7CiAgICAgICAgICAgIGV4cGVjdGVkVW5pdHMgPSBleHRyYVVuaXRzID0gMjsKICAgICAgICAgICAgY29udGludWUgbG9vcDsKICAgICAgICAgIH0KICAgICAgICAgIC8vIDB4RjUsIDB4RjYgLi4uIDB4RkYgbmV2ZXIgYXBwZWFyIGluIHZhbGlkIFVURi04IHNlcXVlbmNlcy4KICAgICAgICAgIGlmICgodW5pdCAmIDB4RjgpID09IDB4RjAgJiYgdW5pdCA8IDB4RjUpIHsKICAgICAgICAgICAgdmFsdWUgPSB1bml0ICYgMHgwNzsKICAgICAgICAgICAgZXhwZWN0ZWRVbml0cyA9IGV4dHJhVW5pdHMgPSAzOwogICAgICAgICAgICBjb250aW51ZSBsb29wOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFfYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIkJhZCBVVEYtOCBlbmNvZGluZyAweCR7dW5pdC50b1JhZGl4U3RyaW5nKDE2KX0iLAogICAgICAgICAgICAgICAgY29kZVVuaXRzLAogICAgICAgICAgICAgICAgaSAtIDEpOwogICAgICAgICAgfQogICAgICAgICAgdmFsdWUgPSB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJSdW5lOwogICAgICAgICAgZXhwZWN0ZWRVbml0cyA9IGV4dHJhVW5pdHMgPSAwOwogICAgICAgICAgX2lzRmlyc3RDaGFyYWN0ZXIgPSBmYWxzZTsKICAgICAgICAgIF9zdHJpbmdTaW5rLndyaXRlQ2hhckNvZGUodmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgICBicmVhayBsb29wOwogICAgfQogICAgaWYgKGV4cGVjdGVkVW5pdHMgPiAwKSB7CiAgICAgIF92YWx1ZSA9IHZhbHVlOwogICAgICBfZXhwZWN0ZWRVbml0cyA9IGV4cGVjdGVkVW5pdHM7CiAgICAgIF9leHRyYVVuaXRzID0gZXh0cmFVbml0czsKICAgIH0KICB9Cn0KCi8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiBbdW5pdHNdIHN0YXJ0aW5nIGF0IG9mZnNldCBbZnJvbV0gd2hpY2ggaGF2ZQovLyB0aGUgbGVmdG1vc3QgYml0IHNldCB0byAwLgovLwovLyBUbyBpbmNyZWFzZSBwZXJmb3JtYW5jZSBvZiB0aGlzIGNyaXRpY2FsIG1ldGhvZCB3ZSBoYXZlIGEgc3BlY2lhbCB2YXJpYW50IG9mCi8vIGl0IGltcGxlbWVudGVkIGluIHRoZSBWTSdzIHBhdGNoIGZpbGVzLCB3aGljaCBpcyB3aHkgd2UgbWFrZSBpdCBleHRlcm5hbC4KZXh0ZXJuYWwgaW50IF9zY2FuT25lQnl0ZUNoYXJhY3RlcnMoTGlzdDxpbnQ+IHVuaXRzLCBpbnQgZnJvbSwgaW50IGVuZEluZGV4KTsKgi4ATk48ARYBNDQBPCwBQgRIDwQOBDtNSSQBSiEjHgEmBlI9BlE8TyYxKgEnHgFPHAY2PgZFTz0GUSY+KEsEATIcOQQCAUUeORcBOyAGPDM/JkAeKk9MOz8kHi5IOTUuSyRCHAY9BAEjBkQcRh1MBAE/RwIBTisVEhgbATEBQwEuLQFPPwFQHgY/TC4GTRxBKkhKICgoNT49NhMNPkRAATxBSUIUBgQBPwZMDgZLMDRFTR0NBhVCMkApMywvN0tOPEMoDx0nOTg6ES05OUE6CggGGAQCAUsPTSIBIAERF1AgDgYTBAE/FgEjDgYBFxwaLg8YCD9OLCASBgksMkk7RUVGSyQRRi4qChEIPRgbGQQBSykCAUwROR4BKAZJOAZNTyUzKgFQHAZEPgY2PkJOFU4aFQYBIzoBRUIZIhhQGRoaCCggBgEfOTIsIx4EASMGRB5BJSgZDTQGMwQBP0cBRwEuRQIBFCwuMU0BFSgpKCgBJz0nPTE3JAETBCcrFR4gIRIaFwE4ATIBMCoVFRcVBQERDQQBKQZGOAZJOi8bHh9ACEISGhcGBAFEGCgiEBgVARgKExEfDR8YDCMnHyQlRB0WDidIHRMyHREMJTBNFyIjRRslDCozCigiIzowGyUMMwpGLAojCAEdRxwlLE8BGSQKI0ZASzRkGDgiI00bGAxGESonISwbDCchLBsMSDYhLBsMIiNCGxgMMyolLAoIEgYdFiYgBgQCAU8eA1BNTgEVZGFydDpjb252ZXJ0L3V0Zi5kYXJ0NG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9kZXZlbG9wZXIvZGV2ZWxvcGVyLmRhcnSJbC8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gSW50ZXJhY3Qgd2l0aCBkZXZlbG9wZXIgdG9vbHMgc3VjaCBhcyB0aGUgZGVidWdnZXIgYW5kIGluc3BlY3Rvci4KLy8vCi8vLyBUaGlzIGxpYnJhcnkgaXMgcGxhdGZvcm0gZGVwZW5kZW50IGFuZCBoYXMgc2VwYXJhdGUgaW1wbGVtZW50YXRpb25zIGZvcgovLy8gYm90aCB3ZWIgYW5kIHRoZSBEYXJ0IFZNLiBBIHNwZWNpZmljIHBsYXRmb3JtIG1heSBub3Qgc3VwcG9ydCBhbGwKLy8vIG9wZXJhdGlvbnMuCi8vLwovLy8gVG8gdXNlIHRoaXMgbGlicmFyeSBpbiB5b3VyIGNvZGU6Ci8vLwovLy8gICAgIGltcG9ydCAnZGFydDpkZXZlbG9wZXInOwovLy8KLy8vIHtAY2F0ZWdvcnkgQ29yZX0KbGlicmFyeSBkYXJ0LmRldmVsb3BlcjsKCmltcG9ydCAnZGFydDphc3luYyc7CmltcG9ydCAnZGFydDpjb252ZXJ0JzsKaW1wb3J0ICdkYXJ0Omlzb2xhdGUnIHNob3cgSXNvbGF0ZSwgUmF3UmVjZWl2ZVBvcnQsIFNlbmRQb3J0OwoKcGFydCAnZXh0ZW5zaW9uLmRhcnQnOwpwYXJ0ICdwcm9maWxlci5kYXJ0JzsKcGFydCAnc2VydmljZS5kYXJ0JzsKcGFydCAndGltZWxpbmUuZGFydCc7CgovLy8gSWYgW3doZW5dIGlzIHRydWUsIHN0b3AgdGhlIHByb2dyYW0gYXMgaWYgYSBicmVha3BvaW50IHdlcmUgaGl0IGF0IHRoZQovLy8gZm9sbG93aW5nIHN0YXRlbWVudC4KLy8vCi8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBbd2hlbl0uIFNvbWUgZGVidWdnZXJzIG1heSBkaXNwbGF5IFttZXNzYWdlXS4KLy8vCi8vLyBOT1RFOiBXaGVuIGludm9rZWQsIHRoZSBpc29sYXRlIHdpbGwgbm90IHJldHVybiB1bnRpbCBhIGRlYnVnZ2VyCi8vLyBjb250aW51ZXMgZXhlY3V0aW9uLiBXaGVuIHJ1bm5pbmcgaW4gdGhlIERhcnQgVk0sIHRoZSBiZWhhdmlvdXIgaXMgdGhlIHNhbWUKLy8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgYSBkZWJ1Z2dlciBpcyBjb25uZWN0ZWQuIFdoZW4gY29tcGlsZWQgdG8KLy8vIEphdmFTY3JpcHQsIHRoaXMgdXNlcyB0aGUgImRlYnVnZ2VyIiBzdGF0ZW1lbnQsIGFuZCBiZWhhdmVzIGV4YWN0bHkgYXMKLy8vIHRoYXQgZG9lcy4KZXh0ZXJuYWwgYm9vbCBkZWJ1Z2dlcih7Ym9vbCB3aGVuOiB0cnVlLCBTdHJpbmcgbWVzc2FnZX0pOwoKLy8vIFNlbmQgYSByZWZlcmVuY2UgdG8gW29iamVjdF0gdG8gYW55IGF0dGFjaGVkIGRlYnVnZ2Vycy4KLy8vCi8vLyBEZWJ1Z2dlcnMgbWF5IG9wZW4gYW4gaW5zcGVjdG9yIG9uIHRoZSBvYmplY3QuIFJldHVybnMgdGhlIGFyZ3VtZW50LgpleHRlcm5hbCBPYmplY3QgaW5zcGVjdChPYmplY3Qgb2JqZWN0KTsKCi8vLyBFbWl0IGEgbG9nIGV2ZW50LgovLy8KLy8vIFRoaXMgZnVuY3Rpb24gd2FzIGRlc2lnbmVkIHRvIG1hcCBjbG9zZWx5IHRvIHRoZSBsb2dnaW5nIGluZm9ybWF0aW9uCi8vLyBjb2xsZWN0ZWQgYnkgYHBhY2thZ2U6bG9nZ2luZ2AuCi8vLwovLy8gLSBbbWVzc2FnZV0gaXMgdGhlIGxvZyBtZXNzYWdlCi8vLyAtIFt0aW1lXSAob3B0aW9uYWwpIGlzIHRoZSB0aW1lc3RhbXAKLy8vIC0gW3NlcXVlbmNlTnVtYmVyXSAob3B0aW9uYWwpIGlzIGEgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHNlcXVlbmNlIG51bWJlcgovLy8gLSBbbGV2ZWxdIChvcHRpb25hbCkgaXMgdGhlIHNldmVyaXR5IGxldmVsIChhIHZhbHVlIGJldHdlZW4gMCBhbmQgMjAwMCk7IHNlZQovLy8gICB0aGUgYHBhY2thZ2U6bG9nZ2luZ2AgYExldmVsYCBjbGFzcyBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIHBvc3NpYmxlIHZhbHVlcwovLy8gLSBbbmFtZV0gKG9wdGlvbmFsKSBpcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIG9mIHRoZSBsb2cgbWVzc2FnZQovLy8gLSBbem9uZV0gKG9wdGlvbmFsKSB0aGUgem9uZSB3aGVyZSB0aGUgbG9nIHdhcyBlbWl0dGVkCi8vLyAtIFtlcnJvcl0gKG9wdGlvbmFsKSBhbiBlcnJvciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9nIGV2ZW50Ci8vLyAtIFtzdGFja1RyYWNlXSAob3B0aW9uYWwpIGEgc3RhY2sgdHJhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9nIGV2ZW50CmV4dGVybmFsIHZvaWQgbG9nKAogIFN0cmluZyBtZXNzYWdlLCB7CiAgRGF0ZVRpbWUgdGltZSwKICBpbnQgc2VxdWVuY2VOdW1iZXIsCiAgaW50IGxldmVsOiAwLAogIFN0cmluZyBuYW1lOiAnJywKICBab25lIHpvbmUsCiAgT2JqZWN0IGVycm9yLAogIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSwKfSk7CkUATk48AUYETEYQBCYEIQQVGAEVFz4BFxYVFgFLGQRHBEVQS0sPOwE8BEkoARYESSQEIylQUVFFO0hLExQRFhATDRAZBAEOZGFydDpkZXZlbG9wZXI0b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2RldmVsb3Blci9leHRlbnNpb24uZGFydJepLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5kZXZlbG9wZXI7CgovLy8gQSByZXNwb25zZSB0byBhIHNlcnZpY2UgcHJvdG9jb2wgZXh0ZW5zaW9uIFJQQy4KLy8vCi8vLyBJZiB0aGUgUlBDIHdhcyBzdWNjZXNzZnVsLCB1c2UgW1NlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5yZXN1bHRdLCBvdGhlcndpc2UKLy8vIHVzZSBbU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLmVycm9yXS4KY2xhc3MgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlIHsKICAvLy8gVGhlIHJlc3VsdCBvZiBhIHN1Y2Nlc3NmdWwgc2VydmljZSBwcm90b2NvbCBleHRlbnNpb24gUlBDLgogIGZpbmFsIFN0cmluZyByZXN1bHQ7CgogIC8vLyBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggYSBmYWlsZWQgc2VydmljZSBwcm90b2NvbCBleHRlbnNpb24gUlBDLgogIGZpbmFsIGludCBlcnJvckNvZGU7CgogIC8vLyBUaGUgZGV0YWlscyBvZiBhIGZhaWxlZCBzZXJ2aWNlIHByb3RvY29sIGV4dGVuc2lvbiBSUEMuCiAgZmluYWwgU3RyaW5nIGVycm9yRGV0YWlsOwoKICAvLy8gQ3JlYXRlcyBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgdG8gYSBzZXJ2aWNlIHByb3RvY29sIGV4dGVuc2lvbiBSUEMuCiAgLy8vCiAgLy8vIFJlcXVpcmVzIFtyZXN1bHRdIHRvIGJlIGEgSlNPTiBvYmplY3QgZW5jb2RlZCBhcyBhIHN0cmluZy4gV2hlbiBmb3JtaW5nCiAgLy8vIHRoZSBKU09OLVJQQyBtZXNzYWdlIFtyZXN1bHRdIHdpbGwgYmUgaW5saW5lZCBkaXJlY3RseS4KICBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UucmVzdWx0KFN0cmluZyByZXN1bHQpCiAgICAgIDogcmVzdWx0ID0gcmVzdWx0LAogICAgICAgIGVycm9yQ29kZSA9IG51bGwsCiAgICAgICAgZXJyb3JEZXRhaWwgPSBudWxsIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKHJlc3VsdCwgInJlc3VsdCIpOwogIH0KCiAgLy8vIENyZWF0ZXMgYW4gZXJyb3IgcmVzcG9uc2UgdG8gYSBzZXJ2aWNlIHByb3RvY29sIGV4dGVuc2lvbiBSUEMuCiAgLy8vCiAgLy8vIFJlcXVpcmVzIFtlcnJvckNvZGVdIHRvIGJlIFtpbnZhbGlkUGFyYW1zXSBvciBiZXR3ZWVuIFtleHRlbnNpb25FcnJvck1pbl0KICAvLy8gYW5kIFtleHRlbnNpb25FcnJvck1heF0uIFJlcXVpcmVzIFtlcnJvckRldGFpbF0gdG8gYmUgYSBKU09OIG9iamVjdAogIC8vLyBlbmNvZGVkIGFzIGEgc3RyaW5nLiBXaGVuIGZvcm1pbmcgdGhlIEpTT04tUlBDIG1lc3NhZ2UgW2Vycm9yRGV0YWlsXSB3aWxsCiAgLy8vIGJlIGlubGluZWQgZGlyZWN0bHkuCiAgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLmVycm9yKGludCBlcnJvckNvZGUsIFN0cmluZyBlcnJvckRldGFpbCkKICAgICAgOiByZXN1bHQgPSBudWxsLAogICAgICAgIGVycm9yQ29kZSA9IGVycm9yQ29kZSwKICAgICAgICBlcnJvckRldGFpbCA9IGVycm9yRGV0YWlsIHsKICAgIF92YWxpZGF0ZUVycm9yQ29kZShlcnJvckNvZGUpOwogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoZXJyb3JEZXRhaWwsICJlcnJvckRldGFpbCIpOwogIH0KCiAgLy8vIEludmFsaWQgbWV0aG9kIHBhcmFtZXRlcihzKSBlcnJvciBjb2RlLgogIEBkZXByZWNhdGVkCiAgc3RhdGljIGNvbnN0IGtJbnZhbGlkUGFyYW1zID0gaW52YWxpZFBhcmFtczsKCiAgLy8vIEdlbmVyaWMgZXh0ZW5zaW9uIGVycm9yIGNvZGUuCiAgQGRlcHJlY2F0ZWQKICBzdGF0aWMgY29uc3Qga0V4dGVuc2lvbkVycm9yID0gZXh0ZW5zaW9uRXJyb3I7CgogIC8vLyBNYXhpbXVtIGV4dGVuc2lvbiBwcm92aWRlZCBlcnJvciBjb2RlLgogIEBkZXByZWNhdGVkCiAgc3RhdGljIGNvbnN0IGtFeHRlbnNpb25FcnJvck1heCA9IGV4dGVuc2lvbkVycm9yTWF4OwoKICAvLy8gTWluaW11bSBleHRlbnNpb24gcHJvdmlkZWQgZXJyb3IgY29kZS4KICBAZGVwcmVjYXRlZAogIHN0YXRpYyBjb25zdCBrRXh0ZW5zaW9uRXJyb3JNaW4gPSBleHRlbnNpb25FcnJvck1pbjsKCiAgLy8vIEludmFsaWQgbWV0aG9kIHBhcmFtZXRlcihzKSBlcnJvciBjb2RlLgogIHN0YXRpYyBjb25zdCBpbnZhbGlkUGFyYW1zID0gLTMyNjAyOwoKICAvLy8gR2VuZXJpYyBleHRlbnNpb24gZXJyb3IgY29kZS4KICBzdGF0aWMgY29uc3QgZXh0ZW5zaW9uRXJyb3IgPSAtMzIwMDA7CgogIC8vLyBNYXhpbXVtIGV4dGVuc2lvbiBwcm92aWRlZCBlcnJvciBjb2RlLgogIHN0YXRpYyBjb25zdCBleHRlbnNpb25FcnJvck1heCA9IC0zMjAwMDsKCiAgLy8vIE1pbmltdW0gZXh0ZW5zaW9uIHByb3ZpZGVkIGVycm9yIGNvZGUuCiAgc3RhdGljIGNvbnN0IGV4dGVuc2lvbkVycm9yTWluID0gLTMyMDE2OwoKICBzdGF0aWMgU3RyaW5nIF9lcnJvckNvZGVNZXNzYWdlKGludCBlcnJvckNvZGUpIHsKICAgIF92YWxpZGF0ZUVycm9yQ29kZShlcnJvckNvZGUpOwogICAgaWYgKGVycm9yQ29kZSA9PSBpbnZhbGlkUGFyYW1zKSB7CiAgICAgIHJldHVybiAiSW52YWxpZCBwYXJhbXMiOwogICAgfQogICAgcmV0dXJuICJTZXJ2ZXIgZXJyb3IiOwogIH0KCiAgc3RhdGljIF92YWxpZGF0ZUVycm9yQ29kZShpbnQgZXJyb3JDb2RlKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChlcnJvckNvZGUsICJlcnJvckNvZGUiKTsKICAgIGlmIChlcnJvckNvZGUgPT0gaW52YWxpZFBhcmFtcykgcmV0dXJuOwogICAgaWYgKChlcnJvckNvZGUgPj0gZXh0ZW5zaW9uRXJyb3JNaW4pICYmIChlcnJvckNvZGUgPD0gZXh0ZW5zaW9uRXJyb3JNYXgpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKGVycm9yQ29kZSwgImVycm9yQ29kZSIsICJPdXQgb2YgcmFuZ2UiKTsKICB9CgogIC8vLyBEZXRlcm1pbmVzIGlmIHRoaXMgcmVzcG9uc2UgcmVwcmVzZW50cyBhbiBlcnJvci4KICBib29sIGlzRXJyb3IoKSA9PiAoZXJyb3JDb2RlICE9IG51bGwpICYmIChlcnJvckRldGFpbCAhPSBudWxsKTsKCiAgLy8gaWdub3JlOiB1bnVzZWRfZWxlbWVudCwgY2FsbGVkIGZyb20gcnVudGltZS9saWIvZGV2ZWxvcGVyLmRhcnQKICBTdHJpbmcgX3RvU3RyaW5nKCkgewogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoZXJyb3JDb2RlICE9IG51bGwpOwogICAgICBhc3NlcnQoZXJyb3JEZXRhaWwgIT0gbnVsbCk7CiAgICAgIHJldHVybiBqc29uLmVuY29kZSh7CiAgICAgICAgJ2NvZGUnOiBlcnJvckNvZGUsCiAgICAgICAgJ21lc3NhZ2UnOiBfZXJyb3JDb2RlTWVzc2FnZShlcnJvckNvZGUpLAogICAgICAgICdkYXRhJzogeydkZXRhaWxzJzogZXJyb3JEZXRhaWx9CiAgICAgIH0pOwogICAgfQogIH0KfQoKLy8vIEEgc2VydmljZSBwcm90b2NvbCBleHRlbnNpb24gaGFuZGxlci4gUmVnaXN0ZXJlZCB3aXRoIFtyZWdpc3RlckV4dGVuc2lvbl0uCi8vLwovLy8gTXVzdCBjb21wbGV0ZSB0byBhIFtTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2VdLiBbbWV0aG9kXSBpcyB0aGUgbWV0aG9kIG5hbWUKLy8vIG9mIHRoZSBzZXJ2aWNlIHByb3RvY29sIHJlcXVlc3QsIGFuZCBbcGFyYW1ldGVyc10gaXMgYSBtYXAgaG9sZGluZyB0aGUKLy8vIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZpY2UgcHJvdG9jb2wgcmVxdWVzdC4KLy8vCi8vLyAqTk9URSo6IGFsbCBwYXJhbWV0ZXIgbmFtZXMgYW5kIHZhbHVlcyBhcmUgZW5jb2RlZCBhcyBzdHJpbmdzLgp0eXBlZGVmIEZ1dHVyZTxTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2U+IFNlcnZpY2VFeHRlbnNpb25IYW5kbGVyKAogICAgU3RyaW5nIG1ldGhvZCwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKTsKCi8vLyBSZWdpc3RlciBhIFtTZXJ2aWNlRXh0ZW5zaW9uSGFuZGxlcl0gdGhhdCB3aWxsIGJlIGludm9rZWQgaW4gdGhpcyBpc29sYXRlCi8vLyBmb3IgW21ldGhvZF0uICpOT1RFKjogU2VydmljZSBwcm90b2NvbCBleHRlbnNpb25zIG11c3QgYmUgcmVnaXN0ZXJlZAovLy8gaW4gZWFjaCBpc29sYXRlLgovLy8KLy8vICpOT1RFKjogW21ldGhvZF0gbXVzdCBiZWdpbiB3aXRoICdleHQuJyBhbmQgeW91IHNob3VsZCB1c2UgdGhlIGZvbGxvd2luZwovLy8gc3RydWN0dXJlIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIHBhY2thZ2VzOiAnZXh0LnBhY2thZ2UuY29tbWFuZCcuCi8vLyBUaGF0IGlzLCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlICdleHQuJyBwcmVmaXgsIHNob3VsZCBiZSB0aGUgcmVnaXN0ZXJpbmcKLy8vIHBhY2thZ2UgbmFtZSBmb2xsb3dlZCBieSBhbm90aGVyIHBlcmlvZCAoJy4nKSBhbmQgdGhlbiB0aGUgY29tbWFuZCBuYW1lLgovLy8gRm9yIGV4YW1wbGU6ICdleHQuZGFydC5pby5nZXRPcGVuRmlsZXMnLgovLy8KLy8vIEJlY2F1c2Ugc2VydmljZSBleHRlbnNpb25zIGFyZSBpc29sYXRlIHNwZWNpZmljLCBjbGllbnRzIHVzaW5nIGV4dGVuc2lvbnMKLy8vIG11c3QgYWx3YXlzIGluY2x1ZGUgYW4gJ2lzb2xhdGVJZCcgcGFyYW1ldGVyIHdpdGggZWFjaCBSUEMuCnZvaWQgcmVnaXN0ZXJFeHRlbnNpb24oU3RyaW5nIG1ldGhvZCwgU2VydmljZUV4dGVuc2lvbkhhbmRsZXIgaGFuZGxlcikgewogIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKG1ldGhvZCwgJ21ldGhvZCcpOwogIGlmICghbWV0aG9kLnN0YXJ0c1dpdGgoJ2V4dC4nKSkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUobWV0aG9kLCAnbWV0aG9kJywgJ011c3QgYmVnaW4gd2l0aCBleHQuJyk7CiAgfQogIGlmIChfbG9va3VwRXh0ZW5zaW9uKG1ldGhvZCkgIT0gbnVsbCkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ0V4dGVuc2lvbiBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICRtZXRob2QnKTsKICB9CiAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoaGFuZGxlciwgJ2hhbmRsZXInKTsKICBfcmVnaXN0ZXJFeHRlbnNpb24obWV0aG9kLCBoYW5kbGVyKTsKfQoKLy8vIFBvc3QgYW4gZXZlbnQgb2YgW2V2ZW50S2luZF0gd2l0aCBwYXlsb2FkIG9mIFtldmVudERhdGFdIHRvIHRoZSBgRXh0ZW5zaW9uYAovLy8gZXZlbnQgc3RyZWFtLgp2b2lkIHBvc3RFdmVudChTdHJpbmcgZXZlbnRLaW5kLCBNYXAgZXZlbnREYXRhKSB7CiAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoZXZlbnRLaW5kLCAnZXZlbnRLaW5kJyk7CiAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoZXZlbnREYXRhLCAnZXZlbnREYXRhJyk7CiAgU3RyaW5nIGV2ZW50RGF0YUFzU3RyaW5nID0ganNvbi5lbmNvZGUoZXZlbnREYXRhKTsKICBfcG9zdEV2ZW50KGV2ZW50S2luZCwgZXZlbnREYXRhQXNTdHJpbmcpOwp9CgpleHRlcm5hbCB2b2lkIF9wb3N0RXZlbnQoU3RyaW5nIGV2ZW50S2luZCwgU3RyaW5nIGV2ZW50RGF0YSk7CgovLyBCb3RoIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgd3JpdHRlbiBpbnNpZGUgQysrIHRvIGF2b2lkIHVwZGF0aW5nIHRoZSBkYXRhCi8vIHN0cnVjdHVyZXMgaW4gRGFydCwgZ2V0dGluZyBhbiBPT0IsIGFuZCBvYnNlcnZpbmcgc3RhbGUgc3RhdGUuIERvIG5vdCBtb3ZlCi8vIHRoZXNlIGludG8gRGFydCBjb2RlIHVubGVzcyB5b3UgY2FuIGVuc3VyZSB0aGF0IHRoZSBvcGVyYXRpb25zIHdpbGwgY2FuIGJlCi8vIGRvbmUgYXRvbWljYWxseS4gTmF0aXZlIGNvZGUgbGl2ZXMgaW4gdm0vaXNvbGF0ZS5jYy0KLy8gTG9va3VwU2VydmljZUV4dGVuc2lvbkhhbmRsZXIgYW5kIFJlZ2lzdGVyU2VydmljZUV4dGVuc2lvbkhhbmRsZXIuCmV4dGVybmFsIFNlcnZpY2VFeHRlbnNpb25IYW5kbGVyIF9sb29rdXBFeHRlbnNpb24oU3RyaW5nIG1ldGhvZCk7CmV4dGVybmFsIF9yZWdpc3RlckV4dGVuc2lvbihTdHJpbmcgbWV0aG9kLCBTZXJ2aWNlRXh0ZW5zaW9uSGFuZGxlciBoYW5kbGVyKTsKgKMATk48ARgBNARQKiFBFwFOFwE+HAFJBk4+MRkaHTIEAUUGUEpQG0QXHyQjPAQBLg4vASQOMQEtDjcBLQ43AS4nASQoAS0rAS0rATMjJh8GGwQBLTgsUA4GSwQBN0IBRBcaFQ0hIxsbMSkKBgQCAU8ET0swBENCNAFOSRUETU1QTS0ETkBJMCRNBCpGBDInAgFQEjI2NjUsAgE+AU1OTjhGQk0BHWRhcnQ6ZGV2ZWxvcGVyL2V4dGVuc2lvbi5kYXJ0M29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9kZXZlbG9wZXIvdGltZWxpbmUuZGFydKp4Ly8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5kZXZlbG9wZXI7Cgpjb25zdCBib29sIF9oYXNUaW1lbGluZSA9CiAgICBjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgiZGFydC5kZXZlbG9wZXIudGltZWxpbmUiLCBkZWZhdWx0VmFsdWU6IHRydWUpOwoKLy8vIEEgdHlwZWRlZiBmb3IgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IHRvIFtUaW1lbGluZS50aW1lU3luY10uCnR5cGVkZWYgVGltZWxpbmVTeW5jRnVuY3Rpb248VD4gPSBUIEZ1bmN0aW9uKCk7CgovLyBUT0RPOiBUaGlzIHR5cGVkZWYgaXMgbm90IHVzZWQuCnR5cGVkZWYgRnV0dXJlIFRpbWVsaW5lQXN5bmNGdW5jdGlvbigpOwoKLy8vIEEgY2xhc3MgdG8gcmVwcmVzZW50IEZsb3cgZXZlbnRzLgovLy8KLy8vIFtGbG93XSBvYmplY3RzIGFyZSB1c2VkIHRvIHRocmVhZCBmbG93IGV2ZW50cyBiZXR3ZWVuIHRpbWVsaW5lIHNsaWNlcywKLy8vIGZvciBleGFtcGxlLCB0aG9zZSBjcmVhdGVkIHdpdGggdGhlIFtUaW1lbGluZV0gY2xhc3MgYmVsb3cuIEFkZGluZwovLy8gW0Zsb3ddIG9iamVjdHMgY2F1c2UgYXJyb3dzIHRvIGJlIGRyYXduIGJldHdlZW4gc2xpY2VzIGluIENocm9tZSdzIHRyYWNlCi8vLyB2aWV3ZXIuIFRoZSBhcnJvd3Mgc3RhcnQgYXQgZS5nIFtUaW1lbGluZV0gZXZlbnRzIHRoYXQgYXJlIHBhc3NlZCBhCi8vLyBbRmxvdy5iZWdpbl0gb2JqZWN0LCBnbyB0aHJvdWdoIFtUaW1lbGluZV0gZXZlbnRzIHRoYXQgYXJlIHBhc3NlZCBhCi8vLyBbRmxvdy5zdGVwXSBvYmplY3QsIGFuZCBlbmQgYXQgW1RpbWVsaW5lXSBldmVudHMgdGhhdCBhcmUgcGFzc2VkIGEKLy8vIFtGbG93LmVuZF0gb2JqZWN0LCBhbGwgaGF2aW5nIHRoZSBzYW1lIFtGbG93LmlkXS4gRm9yIGV4YW1wbGU6Ci8vLwovLy8gYGBgZGFydAovLy8gdmFyIGZsb3cgPSBGbG93LmJlZ2luKCk7Ci8vLyBUaW1lbGluZS50aW1lU3luYygnZmxvd190ZXN0JywgKCkgewovLy8gICBkb1NvbWV0aGluZygpOwovLy8gfSwgZmxvdzogZmxvdyk7Ci8vLwovLy8gVGltZWxpbmUudGltZVN5bmMoJ2Zsb3dfdGVzdCcsICgpIHsKLy8vICAgZG9Tb21ldGhpbmcoKTsKLy8vIH0sIGZsb3c6IEZsb3cuc3RlcChmbG93LmlkKSk7Ci8vLwovLy8gVGltZWxpbmUudGltZVN5bmMoJ2Zsb3dfdGVzdCcsICgpIHsKLy8vICAgZG9Tb21ldGhpbmcoKTsKLy8vIH0sIGZsb3c6IEZsb3cuZW5kKGZsb3cuaWQpKTsKLy8vIGBgYApjbGFzcyBGbG93IHsKICAvLyBUaGVzZSB2YWx1ZXMgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgZW51bSAiRXZlbnRUeXBlIiBpbgogIC8vIHJ1bnRpbWUvdm0vdGltZWxpbmUuaC4KICBzdGF0aWMgY29uc3QgaW50IF9iZWdpbiA9IDk7CiAgc3RhdGljIGNvbnN0IGludCBfc3RlcCA9IDEwOwogIHN0YXRpYyBjb25zdCBpbnQgX2VuZCA9IDExOwoKICBmaW5hbCBpbnQgX3R5cGU7CgogIC8vLyBUaGUgZmxvdyBpZCBvZiB0aGUgZmxvdyBldmVudC4KICBmaW5hbCBpbnQgaWQ7CgogIEZsb3cuXyh0aGlzLl90eXBlLCB0aGlzLmlkKTsKCiAgLy8vIEEgImJlZ2luIiBGbG93IGV2ZW50LgogIC8vLwogIC8vLyBXaGVuIHBhc3NlZCB0byBhIFtUaW1lbGluZV0gbWV0aG9kLCBnZW5lcmF0ZXMgYSAiYmVnaW4iIEZsb3cgZXZlbnQuCiAgLy8vIElmIFtpZF0gaXMgbm90IHByb3ZpZGVkLCBhbiBpZCB0aGF0IGNvbmZsaWN0cyB3aXRoIG5vIG90aGVyIERhcnQtZ2VuZXJhdGVkCiAgLy8vIGZsb3cgaWQncyB3aWxsIGJlIGdlbmVyYXRlZC4KICBzdGF0aWMgRmxvdyBiZWdpbih7aW50IGlkfSkgewogICAgcmV0dXJuIG5ldyBGbG93Ll8oX2JlZ2luLCBpZCA/PyBfZ2V0TmV4dEFzeW5jSWQoKSk7CiAgfQoKICAvLy8gQSAic3RlcCIgRmxvdyBldmVudC4KICAvLy8KICAvLy8gV2hlbiBwYXNzZWQgdG8gYSBbVGltZWxpbmVdIG1ldGhvZCwgZ2VuZXJhdGVzIGEgInN0ZXAiIEZsb3cgZXZlbnQuCiAgLy8vIFRoZSBbaWRdIGFyZ3VtZW50IGlzIHJlcXVpcmVkLiBJdCBjYW4gY29tZSBlaXRoZXIgZnJvbSBhbm90aGVyIFtGbG93XQogIC8vLyBldmVudCwgb3Igc29tZSBpZCB0aGF0IGNvbWVzIGZyb20gdGhlIGVudmlyb25tZW50LgogIHN0YXRpYyBGbG93IHN0ZXAoaW50IGlkKSA9PiBuZXcgRmxvdy5fKF9zdGVwLCBpZCk7CgogIC8vLyBBbiAiZW5kIiBGbG93IGV2ZW50LgogIC8vLwogIC8vLyBXaGVuIHBhc3NlZCB0byBhIFtUaW1lbGluZV0gbWV0aG9kLCBnZW5lcmF0ZXMgYSAiZW5kIiBGbG93IGV2ZW50LgogIC8vLyBUaGUgW2lkXSBhcmd1bWVudCBpcyByZXF1aXJlZC4gSXQgY2FuIGNvbWUgZWl0aGVyIGZyb20gYW5vdGhlciBbRmxvd10KICAvLy8gZXZlbnQsIG9yIHNvbWUgaWQgdGhhdCBjb21lcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4KICBzdGF0aWMgRmxvdyBlbmQoaW50IGlkKSA9PiBuZXcgRmxvdy5fKF9lbmQsIGlkKTsKfQoKLy8vIEFkZCB0byB0aGUgdGltZWxpbmUuCi8vLwovLy8gW1RpbWVsaW5lXSdzIG1ldGhvZHMgYWRkIHN5bmNocm9ub3VzIGV2ZW50cyB0byB0aGUgdGltZWxpbmUuIFdoZW4KLy8vIGdlbmVyYXRpbmcgYSB0aW1lbGluZSBpbiBDaHJvbWUncyB0cmFjaW5nIGZvcm1hdCwgdXNpbmcgW1RpbWVsaW5lXSBnZW5lcmF0ZXMKLy8vICJDb21wbGV0ZSIgZXZlbnRzLiBbVGltZWxpbmVdJ3MgW3N0YXJ0U3luY10gYW5kIFtmaW5pc2hTeW5jXSBjYW4gYmUgdXNlZAovLy8gZXhwbGljaXRseSwgb3IgaW1wbGljaXRseSBieSB3cmFwcGluZyBhIGNsb3N1cmUgaW4gW3RpbWVTeW5jXS4gRm9yIGV4YW1wbGU6Ci8vLwovLy8gYGBgZGFydAovLy8gVGltZWxpbmUuc3RhcnRTeW5jKCJEb2luZyBTb21ldGhpbmciKTsKLy8vIGRvU29tZXRoaW5nKCk7Ci8vLyBUaW1lbGluZS5maW5pc2hTeW5jKCk7Ci8vLyBgYGAKLy8vCi8vLyBPcjoKLy8vCi8vLyBgYGBkYXJ0Ci8vLyBUaW1lbGluZS50aW1lU3luYygiRG9pbmcgU29tZXRoaW5nIiwgKCkgewovLy8gICBkb1NvbWV0aGluZygpOwovLy8gfSk7Ci8vLyBgYGAKY2xhc3MgVGltZWxpbmUgewogIC8vLyBTdGFydCBhIHN5bmNocm9ub3VzIG9wZXJhdGlvbiBsYWJlbGVkIFtuYW1lXS4gT3B0aW9uYWxseSB0YWtlcwogIC8vLyBhIFtNYXBdIG9mIFthcmd1bWVudHNdLiBUaGlzIHNsaWNlIG1heSBhbHNvIG9wdGlvbmFsbHkgYmUgYXNzb2NpYXRlZCB3aXRoCiAgLy8vIGEgW0Zsb3ddIGV2ZW50LiBUaGlzIG9wZXJhdGlvbiBtdXN0IGJlIGZpbmlzaGVkIGJlZm9yZQogIC8vLyByZXR1cm5pbmcgdG8gdGhlIGV2ZW50IHF1ZXVlLgogIHN0YXRpYyB2b2lkIHN0YXJ0U3luYyhTdHJpbmcgbmFtZSwge01hcCBhcmd1bWVudHMsIEZsb3cgZmxvd30pIHsKICAgIGlmICghX2hhc1RpbWVsaW5lKSByZXR1cm47CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChuYW1lLCAnbmFtZScpOwogICAgaWYgKCFfaXNEYXJ0U3RyZWFtRW5hYmxlZCgpKSB7CiAgICAgIC8vIFB1c2ggYSBudWxsIG9udG8gdGhlIHN0YWNrIGFuZCByZXR1cm4uCiAgICAgIF9zdGFjay5hZGQobnVsbCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBibG9jayA9IG5ldyBfU3luY0Jsb2NrLl8obmFtZSwgX2dldFRyYWNlQ2xvY2soKSwgX2dldFRocmVhZENwdUNsb2NrKCkpOwogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGJsb2NrLl9hcmd1bWVudHMgPSBhcmd1bWVudHM7CiAgICB9CiAgICBpZiAoZmxvdyAhPSBudWxsKSB7CiAgICAgIGJsb2NrLmZsb3cgPSBmbG93OwogICAgfQogICAgX3N0YWNrLmFkZChibG9jayk7CiAgfQoKICAvLy8gRmluaXNoIHRoZSBsYXN0IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB0aGF0IHdhcyBzdGFydGVkLgogIHN0YXRpYyB2b2lkIGZpbmlzaFN5bmMoKSB7CiAgICBpZiAoIV9oYXNUaW1lbGluZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoX3N0YWNrLmxlbmd0aCA9PSAwKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCdVbmV2ZW4gY2FsbHMgdG8gc3RhcnRTeW5jIGFuZCBmaW5pc2hTeW5jJyk7CiAgICB9CiAgICAvLyBQb3AgdG9wIGl0ZW0gb2ZmIG9mIHN0YWNrLgogICAgdmFyIGJsb2NrID0gX3N0YWNrLnJlbW92ZUxhc3QoKTsKICAgIGlmIChibG9jayA9PSBudWxsKSB7CiAgICAgIC8vIERhcnQgc3RyZWFtIHdhcyBkaXNhYmxlZCB3aGVuIHN0YXJ0U3luYyB3YXMgY2FsbGVkLgogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBGaW5pc2ggaXQuCiAgICBibG9jay5maW5pc2goKTsKICB9CgogIC8vLyBFbWl0IGFuIGluc3RhbnQgZXZlbnQuCiAgc3RhdGljIHZvaWQgaW5zdGFudFN5bmMoU3RyaW5nIG5hbWUsIHtNYXAgYXJndW1lbnRzfSkgewogICAgaWYgKCFfaGFzVGltZWxpbmUpIHJldHVybjsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKG5hbWUsICduYW1lJyk7CiAgICBpZiAoIV9pc0RhcnRTdHJlYW1FbmFibGVkKCkpIHsKICAgICAgLy8gU3RyZWFtIGlzIGRpc2FibGVkLgogICAgICByZXR1cm47CiAgICB9CiAgICBNYXAgaW5zdGFudEFyZ3VtZW50czsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBpbnN0YW50QXJndW1lbnRzID0gbmV3IE1hcC5mcm9tKGFyZ3VtZW50cyk7CiAgICB9CiAgICBfcmVwb3J0SW5zdGFudEV2ZW50KAogICAgICAgIF9nZXRUcmFjZUNsb2NrKCksICdEYXJ0JywgbmFtZSwgX2FyZ3VtZW50c0FzSnNvbihpbnN0YW50QXJndW1lbnRzKSk7CiAgfQoKICAvLy8gQSB1dGlsaXR5IG1ldGhvZCB0byB0aW1lIGEgc3luY2hyb25vdXMgW2Z1bmN0aW9uXS4gSW50ZXJuYWxseSBjYWxscwogIC8vLyBbZnVuY3Rpb25dIGJyYWNrZXRlZCBieSBjYWxscyB0byBbc3RhcnRTeW5jXSBhbmQgW2ZpbmlzaFN5bmNdLgogIHN0YXRpYyBUIHRpbWVTeW5jPFQ+KFN0cmluZyBuYW1lLCBUaW1lbGluZVN5bmNGdW5jdGlvbjxUPiBmdW5jdGlvbiwKICAgICAge01hcCBhcmd1bWVudHMsIEZsb3cgZmxvd30pIHsKICAgIHN0YXJ0U3luYyhuYW1lLCBhcmd1bWVudHM6IGFyZ3VtZW50cywgZmxvdzogZmxvdyk7CiAgICB0cnkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGZpbmlzaFN5bmMoKTsKICAgIH0KICB9CgogIC8vLyBUaGUgY3VycmVudCB0aW1lIHN0YW1wIGZyb20gdGhlIGNsb2NrIHVzZWQgYnkgdGhlIHRpbWVsaW5lLiBVbml0cyBhcmUKICAvLy8gbWljcm9zZWNvbmRzLgogIC8vLwogIC8vLyBXaGVuIHJ1biBvbiB0aGUgRGFydCBWTSwgdXNlcyB0aGUgc2FtZSBtb25vdG9uaWMgY2xvY2sgYXMgdGhlIGVtYmVkZGluZwogIC8vLyBBUEkncyBgRGFydF9UaW1lbGluZUdldE1pY3Jvc2AuCiAgc3RhdGljIGludCBnZXQgbm93ID0+IF9nZXRUcmFjZUNsb2NrKCk7CiAgc3RhdGljIGZpbmFsIExpc3Q8X1N5bmNCbG9jaz4gX3N0YWNrID0gbmV3IExpc3Q8X1N5bmNCbG9jaz4oKTsKfQoKLy8vIEFuIGFzeW5jaHJvbm91cyB0YXNrIG9uIHRoZSB0aW1lbGluZS4gQW4gYXN5bmNocm9ub3VzIHRhc2sgY2FuIGhhdmUgbWFueQovLy8gKG5lc3RlZCkgc3luY2hyb25vdXMgb3BlcmF0aW9ucy4gU3luY2hyb25vdXMgb3BlcmF0aW9ucyBjYW4gbGl2ZSBsb25nZXIgdGhhbgovLy8gdGhlIGN1cnJlbnQgaXNvbGF0ZSBldmVudC4gVG8gcGFzcyBhIFtUaW1lbGluZVRhc2tdIHRvIGFub3RoZXIgaXNvbGF0ZSwKLy8vIHlvdSBtdXN0IGZpcnN0IGNhbGwgW3Bhc3NdIHRvIGdldCB0aGUgdGFzayBpZCBhbmQgdGhlbiBjb25zdHJ1Y3QgYSBuZXcKLy8vIFtUaW1lbGluZVRhc2tdIGluIHRoZSBvdGhlciBpc29sYXRlLgpjbGFzcyBUaW1lbGluZVRhc2sgewogIC8vLyBDcmVhdGUgYSB0YXNrLiBUaGUgdGFzayBJRCB3aWxsIGJlIHNldCBieSB0aGUgc3lzdGVtLgogIFRpbWVsaW5lVGFzaygpIDogX3Rhc2tJZCA9IF9nZXROZXh0QXN5bmNJZCgpIHt9CgogIC8vLyBDcmVhdGUgYSB0YXNrIHdpdGggYW4gZXhwbGljaXQgW3Rhc2tJZF0uIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBhcmUKICAvLy8gcGFzc2luZyBhIHRhc2sgZnJvbSBvbmUgaXNvbGF0ZSB0byBhbm90aGVyLgogIFRpbWVsaW5lVGFzay53aXRoVGFza0lkKGludCB0YXNrSWQpIDogX3Rhc2tJZCA9IHRhc2tJZCB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbCh0YXNrSWQsICd0YXNrSWQnKTsKICB9CgogIC8vLyBTdGFydCBhIHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aXRoaW4gdGhpcyB0YXNrIG5hbWVkIFtuYW1lXS4KICAvLy8gT3B0aW9uYWxseSB0YWtlcyBhIFtNYXBdIG9mIFthcmd1bWVudHNdLgogIHZvaWQgc3RhcnQoU3RyaW5nIG5hbWUsIHtNYXAgYXJndW1lbnRzfSkgewogICAgaWYgKCFfaGFzVGltZWxpbmUpIHJldHVybjsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKG5hbWUsICduYW1lJyk7CiAgICB2YXIgYmxvY2sgPSBuZXcgX0FzeW5jQmxvY2suXyhuYW1lLCBfdGFza0lkKTsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBibG9jay5fYXJndW1lbnRzID0gYXJndW1lbnRzOwogICAgfQogICAgX3N0YWNrLmFkZChibG9jayk7CiAgICBibG9jay5fc3RhcnQoKTsKICB9CgogIC8vLyBFbWl0IGFuIGluc3RhbnQgZXZlbnQgZm9yIHRoaXMgdGFzay4KICB2b2lkIGluc3RhbnQoU3RyaW5nIG5hbWUsIHtNYXAgYXJndW1lbnRzfSkgewogICAgaWYgKCFfaGFzVGltZWxpbmUpIHJldHVybjsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKG5hbWUsICduYW1lJyk7CiAgICBNYXAgaW5zdGFudEFyZ3VtZW50czsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBpbnN0YW50QXJndW1lbnRzID0gbmV3IE1hcC5mcm9tKGFyZ3VtZW50cyk7CiAgICB9CiAgICBfcmVwb3J0VGFza0V2ZW50KF9nZXRUcmFjZUNsb2NrKCksIF90YXNrSWQsICduJywgJ0RhcnQnLCBuYW1lLAogICAgICAgIF9hcmd1bWVudHNBc0pzb24oaW5zdGFudEFyZ3VtZW50cykpOwogIH0KCiAgLy8vIEZpbmlzaCB0aGUgbGFzdCBzeW5jaHJvbm91cyBvcGVyYXRpb24gdGhhdCB3YXMgc3RhcnRlZC4KICB2b2lkIGZpbmlzaCgpIHsKICAgIGlmICghX2hhc1RpbWVsaW5lKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChfc3RhY2subGVuZ3RoID09IDApIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ1VuZXZlbiBjYWxscyB0byBzdGFydCBhbmQgZmluaXNoJyk7CiAgICB9CiAgICAvLyBQb3AgdG9wIGl0ZW0gb2ZmIG9mIHN0YWNrLgogICAgdmFyIGJsb2NrID0gX3N0YWNrLnJlbW92ZUxhc3QoKTsKICAgIGJsb2NrLl9maW5pc2goKTsKICB9CgogIC8vLyBSZXRyaWV2ZSB0aGUgW1RpbWVsaW5lVGFza10ncyB0YXNrIGlkLiBXaWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUKICAvLy8gc3RhY2sgaXMgbm90IGVtcHR5LgogIGludCBwYXNzKCkgewogICAgaWYgKF9zdGFjay5sZW5ndGggPiAwKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKAogICAgICAgICAgJ1lvdSBjYW5ub3QgcGFzcyBhIFRpbWVsaW5lVGFzayB3aXRob3V0IGZpbmlzaGluZyBhbGwgc3RhcnRlZCAnCiAgICAgICAgICAnb3BlcmF0aW9ucycpOwogICAgfQogICAgaW50IHIgPSBfdGFza0lkOwogICAgcmV0dXJuIHI7CiAgfQoKICBmaW5hbCBpbnQgX3Rhc2tJZDsKICBmaW5hbCBMaXN0PF9Bc3luY0Jsb2NrPiBfc3RhY2sgPSBbXTsKfQoKLy8vIEFuIGFzeW5jaHJvbm91cyBibG9jayBvZiB0aW1lIG9uIHRoZSB0aW1lbGluZS4gVGhpcyBibG9jayBjYW4gYmUga2VwdAovLy8gb3BlbiBhY3Jvc3MgaXNvbGF0ZSBtZXNzYWdlcy4KY2xhc3MgX0FzeW5jQmxvY2sgewogIC8vLyBUaGUgY2F0ZWdvcnkgdGhpcyBibG9jayBiZWxvbmdzIHRvLgogIGZpbmFsIFN0cmluZyBjYXRlZ29yeSA9ICdEYXJ0JzsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoaXMgYmxvY2suCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8vLyBUaGUgYXN5bmNocm9ub3VzIHRhc2sgaWQuCiAgZmluYWwgaW50IF90YXNrSWQ7CgogIC8vLyBBbiAob3B0aW9uYWwpIHNldCBvZiBhcmd1bWVudHMgd2hpY2ggd2lsbCBiZSBzZXJpYWxpemVkIHRvIEpTT04gYW5kCiAgLy8vIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJsb2NrLgogIE1hcCBfYXJndW1lbnRzOwoKICBfQXN5bmNCbG9jay5fKHRoaXMubmFtZSwgdGhpcy5fdGFza0lkKTsKCiAgLy8gRW1pdCB0aGUgc3RhcnQgZXZlbnQuCiAgdm9pZCBfc3RhcnQoKSB7CiAgICBfcmVwb3J0VGFza0V2ZW50KAogICAgICAgIF9nZXRUcmFjZUNsb2NrKCksIF90YXNrSWQsICdiJywgY2F0ZWdvcnksIG5hbWUsIF9hcmd1bWVudHNBc0pzb24obnVsbCkpOwogIH0KCiAgLy8gRW1pdCB0aGUgZmluaXNoIGV2ZW50LgogIHZvaWQgX2ZpbmlzaCgpIHsKICAgIF9yZXBvcnRUYXNrRXZlbnQoX2dldFRyYWNlQ2xvY2soKSwgX3Rhc2tJZCwgJ2UnLCBjYXRlZ29yeSwgbmFtZSwKICAgICAgICBfYXJndW1lbnRzQXNKc29uKF9hcmd1bWVudHMpKTsKICB9Cn0KCi8vLyBBIHN5bmNocm9ub3VzIGJsb2NrIG9mIHRpbWUgb24gdGhlIHRpbWVsaW5lLiBUaGlzIGJsb2NrIHNob3VsZCBub3QgYmUKLy8vIGtlcHQgb3BlbiBhY3Jvc3MgaXNvbGF0ZSBtZXNzYWdlcy4KY2xhc3MgX1N5bmNCbG9jayB7CiAgLy8vIFRoZSBjYXRlZ29yeSB0aGlzIGJsb2NrIGJlbG9uZ3MgdG8uCiAgZmluYWwgU3RyaW5nIGNhdGVnb3J5ID0gJ0RhcnQnOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhpcyBibG9jay4KICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgLy8vIEFuIChvcHRpb25hbCkgc2V0IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gSlNPTiBhbmQKICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmxvY2suCiAgTWFwIF9hcmd1bWVudHM7CiAgLy8gVGhlIHN0YXJ0IHRpbWUgc3RhbXAuCiAgZmluYWwgaW50IF9zdGFydDsKICAvLyBUaGUgc3RhcnQgdGltZSBzdGFtcCBvZiB0aGUgdGhyZWFkIGNwdSBjbG9jay4KICBmaW5hbCBpbnQgX3N0YXJ0Q3B1OwoKICAvLy8gQW4gKG9wdGlvbmFsKSBmbG93IGV2ZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJsb2NrLgogIEZsb3cgX2Zsb3c7CgogIF9TeW5jQmxvY2suXyh0aGlzLm5hbWUsIHRoaXMuX3N0YXJ0LCB0aGlzLl9zdGFydENwdSk7CgogIC8vLyBGaW5pc2ggdGhpcyBibG9jayBvZiB0aW1lLiBBdCB0aGlzIHBvaW50LCB0aGlzIGJsb2NrIGNhbiBubyBsb25nZXIgYmUKICAvLy8gdXNlZC4KICB2b2lkIGZpbmlzaCgpIHsKICAgIC8vIFJlcG9ydCBldmVudCB0byBydW50aW1lLgogICAgX3JlcG9ydENvbXBsZXRlRXZlbnQoCiAgICAgICAgX3N0YXJ0LCBfc3RhcnRDcHUsIGNhdGVnb3J5LCBuYW1lLCBfYXJndW1lbnRzQXNKc29uKF9hcmd1bWVudHMpKTsKICAgIGlmIChfZmxvdyAhPSBudWxsKSB7CiAgICAgIF9yZXBvcnRGbG93RXZlbnQoX3N0YXJ0LCBfc3RhcnRDcHUsIGNhdGVnb3J5LCBuYW1lLCBfZmxvdy5fdHlwZSwgX2Zsb3cuaWQsCiAgICAgICAgICBfYXJndW1lbnRzQXNKc29uKG51bGwpKTsKICAgIH0KICB9CgogIHZvaWQgc2V0IGZsb3coRmxvdyBmKSB7CiAgICBfZmxvdyA9IGY7CiAgfQp9CgpTdHJpbmcgX2FyZ3VtZW50c0FzSnNvbihNYXAgYXJndW1lbnRzKSB7CiAgaWYgKChhcmd1bWVudHMgPT0gbnVsbCkgfHwgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkpIHsKICAgIC8vIEZhc3QgcGF0aCBubyBhcmd1bWVudHMuIEF2b2lkIGNhbGxpbmcganNvbkVuY29kZS4KICAgIHJldHVybiAne30nOwogIH0KICByZXR1cm4ganNvbi5lbmNvZGUoYXJndW1lbnRzKTsKfQoKLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgRGFydCBUaW1lbGluZSBzdHJlYW0gaXMgZW5hYmxlZC4KZXh0ZXJuYWwgYm9vbCBfaXNEYXJ0U3RyZWFtRW5hYmxlZCgpOwoKLy8vIFJldHVybnMgdGhlIG5leHQgYXN5bmMgdGFzayBpZC4KZXh0ZXJuYWwgaW50IF9nZXROZXh0QXN5bmNJZCgpOwoKLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgdHJhY2UgY2xvY2suCmV4dGVybmFsIGludCBfZ2V0VHJhY2VDbG9jaygpOwoKLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgdGhyZWFkIENQVSB1c2FnZSBjbG9jay4KZXh0ZXJuYWwgaW50IF9nZXRUaHJlYWRDcHVDbG9jaygpOwoKLy8vIFJlcG9ydHMgYW4gZXZlbnQgZm9yIGEgdGFzay4KZXh0ZXJuYWwgdm9pZCBfcmVwb3J0VGFza0V2ZW50KGludCBzdGFydCwgaW50IHRhc2tJZCwgU3RyaW5nIHBoYXNlLAogICAgU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGFyZ3VtZW50c0FzSnNvbik7CgovLy8gUmVwb3J0cyBhIGNvbXBsZXRlIHN5bmNocm9ub3VzIGV2ZW50LgpleHRlcm5hbCB2b2lkIF9yZXBvcnRDb21wbGV0ZUV2ZW50KGludCBzdGFydCwgaW50IHN0YXJ0Q3B1LCBTdHJpbmcgY2F0ZWdvcnksCiAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIGFyZ3VtZW50c0FzSnNvbik7CgovLy8gUmVwb3J0cyBhIGZsb3cgZXZlbnQuCmV4dGVybmFsIHZvaWQgX3JlcG9ydEZsb3dFdmVudChpbnQgc3RhcnQsIGludCBzdGFydENwdSwgU3RyaW5nIGNhdGVnb3J5LAogICAgU3RyaW5nIG5hbWUsIGludCB0eXBlLCBpbnQgaWQsIFN0cmluZyBhcmd1bWVudHNBc0pzb24pOwoKLy8vIFJlcG9ydHMgYW4gaW5zdGFudCBldmVudC4KZXh0ZXJuYWwgdm9pZCBfcmVwb3J0SW5zdGFudEV2ZW50KAogICAgaW50IHN0YXJ0LCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBuYW1lLCBTdHJpbmcgYXJndW1lbnRzQXNKc29uKTsKgV8ATk48ARgBGk8BQDABIygBJgRLR01ISEdDBAwdKBUUBCgVIgQoFSEIDUQcHx8eARMBJRABHwEcBkpRIyA4BAEbBklMOTUBGwZITDkzAgEZBEZRTVAEDCsTGwgECAQMLhUICBFFUD0kQx8uIzAYDgZQHSQGGBkGFwQBPh0ZDgYeSAYiJRk9DgYSFAQBHTofLiMdDgYaHTIGGU0EAUpFRiQ3ChkQFAYEAUwUBk4mKkECAU1RTEspFTwyAUkyOzIEAUMvLR8uMh0kBhcUBAErLx8uGh0yBkMtBAE+EhkOBh5ABiIlFQQBTBoPHRxKGQYVDgQBFScCAUoiFCoiAR4VASAVAUoiEgEqARsSFlEEARwTRScEAgFKJxMqIgEeFQFKIhIbFDMXATsOATgBTAwSIBpKGVEjBgQBGg8EAgEpODkRBCECATkmASQgATQfAT8jASFEOwEqTSoBGkk8AR4jRgEcZGFydDpkZXZlbG9wZXIvdGltZWxpbmUuZGFydC1vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3Byb2ZpbGVyLmRhcnSDHC8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJkZXZlbG9wZXIuZGFydCI7CgpAcGF0Y2gKY2xhc3MgVXNlclRhZyB7CiAgQHBhdGNoCiAgZmFjdG9yeSBVc2VyVGFnKFN0cmluZyBsYWJlbCkgewogICAgcmV0dXJuIG5ldyBfVXNlclRhZyhsYWJlbCk7CiAgfQogIEBwYXRjaAogIHN0YXRpYyBVc2VyVGFnIGdldCBkZWZhdWx0VGFnID0+IF9nZXREZWZhdWx0VGFnKCk7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1VzZXJUYWcgaW1wbGVtZW50cyBVc2VyVGFnIHsKICBmYWN0b3J5IF9Vc2VyVGFnKFN0cmluZyBsYWJlbCkgbmF0aXZlICJVc2VyVGFnX25ldyI7CiAgU3RyaW5nIGdldCBsYWJlbCBuYXRpdmUgIlVzZXJUYWdfbGFiZWwiOwogIFVzZXJUYWcgbWFrZUN1cnJlbnQoKSBuYXRpdmUgIlVzZXJUYWdfbWFrZUN1cnJlbnQiOwp9CgpAcGF0Y2gKVXNlclRhZyBnZXRDdXJyZW50VGFnKCkgPT4gX2dldEN1cnJlbnRUYWcoKTsKVXNlclRhZyBfZ2V0Q3VycmVudFRhZygpIG5hdGl2ZSAiUHJvZmlsZXJfZ2V0Q3VycmVudFRhZyI7CgpVc2VyVGFnIF9nZXREZWZhdWx0VGFnKCkgbmF0aXZlICJVc2VyVGFnX2RlZmF1bHRUYWciOwoeAE5OPAEdAQcQCSIgBAk1AgEaJDcrNgIBBy06ATYBImRhcnQ6ZGV2ZWxvcGVyLXBhdGNoL3Byb2ZpbGVyLmRhcnQzb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2RldmVsb3Blci9wcm9maWxlci5kYXJ0j2EvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmRldmVsb3BlcjsKCi8vLyBBIFVzZXJUYWcgY2FuIGJlIHVzZWQgdG8gZ3JvdXAgc2FtcGxlcyBpbiB0aGUgT2JzZXJ2YXRvcnkgcHJvZmlsZXIuCmFic3RyYWN0IGNsYXNzIFVzZXJUYWcgewogIC8vLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgVXNlclRhZyBpbnN0YW5jZXMgdGhhdCBjYW4gYmUgY3JlYXRlZCBieSBhIHByb2dyYW0uCiAgc3RhdGljIGNvbnN0IE1BWF9VU0VSX1RBR1MgPSA2NDsKCiAgZXh0ZXJuYWwgZmFjdG9yeSBVc2VyVGFnKFN0cmluZyBsYWJlbCk7CgogIC8vLyBMYWJlbCBvZiBbdGhpc10uCiAgU3RyaW5nIGdldCBsYWJlbDsKCiAgLy8vIE1ha2UgW3RoaXNdIHRoZSBjdXJyZW50IHRhZyBmb3IgdGhlIGlzb2xhdGUuIFJldHVybnMgdGhlIGN1cnJlbnQgdGFnCiAgLy8vIGJlZm9yZSBzZXR0aW5nLgogIFVzZXJUYWcgbWFrZUN1cnJlbnQoKTsKCiAgLy8vIFRoZSBkZWZhdWx0IFtVc2VyVGFnXSB3aXRoIGxhYmVsICdEZWZhdWx0Jy4KICBleHRlcm5hbCBzdGF0aWMgVXNlclRhZyBnZXQgZGVmYXVsdFRhZzsKfQoKLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgW1VzZXJUYWddIGZvciB0aGUgaXNvbGF0ZS4KZXh0ZXJuYWwgVXNlclRhZyBnZXRDdXJyZW50VGFnKCk7CgovLy8gQWJzdHJhY3QgW01ldHJpY10gY2xhc3MuIE1ldHJpYyBuYW1lcyBtdXN0IGJlIHVuaXF1ZSwgYXJlIGhpZXJhcmNoaWNhbCwKLy8vIGFuZCB1c2UgcGVyaW9kcyBhcyBzZXBhcmF0b3JzLiBGb3IgZXhhbXBsZSwgJ2EuYi5jJy4gVW5pcXVlbmVzcyBpcyBvbmx5Ci8vLyBlbmZvcmNlZCB3aGVuIGEgTWV0cmljIGlzIHJlZ2lzdGVyZWQuIFRoZSBuYW1lIG9mIGEgbWV0cmljIGNhbm5vdCBjb250YWluCi8vLyB0aGUgc2xhc2ggKCcvJykgY2hhcmFjdGVyLgphYnN0cmFjdCBjbGFzcyBNZXRyaWMgewogIC8vLyBbbmFtZV0gb2YgdGhpcyBtZXRyaWMuCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8vLyBbZGVzY3JpcHRpb25dIG9mIHRoaXMgbWV0cmljLgogIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKCiAgTWV0cmljKHRoaXMubmFtZSwgdGhpcy5kZXNjcmlwdGlvbikgewogICAgaWYgKChuYW1lID09ICd2bScpIHx8IG5hbWUuY29udGFpbnMoJy8nKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignSW52YWxpZCBNZXRyaWMgbmFtZS4nKTsKICAgIH0KICB9CgogIE1hcCBfdG9KU09OKCk7Cn0KCi8vLyBBIG1lYXN1cmVkIHZhbHVlIHdpdGggYSBtaW4gYW5kIG1heC4gSW5pdGlhbCB2YWx1ZSBpcyBtaW4uIFZhbHVlIHdpbGwKLy8vIGJlIGNsYW1wZWQgdG8gdGhlIGludGVydmFsIFttaW4sIG1heF0uCmNsYXNzIEdhdWdlIGV4dGVuZHMgTWV0cmljIHsKICBmaW5hbCBkb3VibGUgbWluOwogIGZpbmFsIGRvdWJsZSBtYXg7CgogIGRvdWJsZSBfdmFsdWU7CiAgZG91YmxlIGdldCB2YWx1ZSA9PiBfdmFsdWU7CiAgc2V0IHZhbHVlKGRvdWJsZSB2KSB7CiAgICBpZiAodiA8IG1pbikgewogICAgICB2ID0gbWluOwogICAgfSBlbHNlIGlmICh2ID4gbWF4KSB7CiAgICAgIHYgPSBtYXg7CiAgICB9CiAgICBfdmFsdWUgPSB2OwogIH0KCiAgR2F1Z2UoU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwgdGhpcy5taW4sIHRoaXMubWF4KQogICAgICA6IHN1cGVyKG5hbWUsIGRlc2NyaXB0aW9uKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChtaW4sICdtaW4nKTsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKG1heCwgJ21heCcpOwogICAgaWYgKCEobWluIDwgbWF4KSkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ21pbiBtdXN0IGJlIGxlc3MgdGhhbiBtYXgnKTsKICAgIF92YWx1ZSA9IG1pbjsKICB9CgogIE1hcCBfdG9KU09OKCkgewogICAgdmFyIG1hcCA9IHsKICAgICAgJ3R5cGUnOiAnR2F1Z2UnLAogICAgICAnaWQnOiAnbWV0cmljcy8kbmFtZScsCiAgICAgICduYW1lJzogbmFtZSwKICAgICAgJ2Rlc2NyaXB0aW9uJzogZGVzY3JpcHRpb24sCiAgICAgICd2YWx1ZSc6IHZhbHVlLAogICAgICAnbWluJzogbWluLAogICAgICAnbWF4JzogbWF4LAogICAgfTsKICAgIHJldHVybiBtYXA7CiAgfQp9CgovLy8gQSBjaGFuZ2luZyB2YWx1ZS4gSW5pdGlhbCB2YWx1ZSBpcyAwLjAuCmNsYXNzIENvdW50ZXIgZXh0ZW5kcyBNZXRyaWMgewogIENvdW50ZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgOiBzdXBlcihuYW1lLCBkZXNjcmlwdGlvbik7CgogIGRvdWJsZSBfdmFsdWUgPSAwLjA7CiAgZG91YmxlIGdldCB2YWx1ZSA9PiBfdmFsdWU7CiAgc2V0IHZhbHVlKGRvdWJsZSB2KSB7CiAgICBfdmFsdWUgPSB2OwogIH0KCiAgTWFwIF90b0pTT04oKSB7CiAgICB2YXIgbWFwID0gewogICAgICAndHlwZSc6ICdDb3VudGVyJywKICAgICAgJ2lkJzogJ21ldHJpY3MvJG5hbWUnLAogICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICdkZXNjcmlwdGlvbic6IGRlc2NyaXB0aW9uLAogICAgICAndmFsdWUnOiB2YWx1ZSwKICAgIH07CiAgICByZXR1cm4gbWFwOwogIH0KfQoKY2xhc3MgTWV0cmljcyB7CiAgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIE1ldHJpYz4gX21ldHJpY3MgPSBuZXcgTWFwPFN0cmluZywgTWV0cmljPigpOwoKICAvLy8gUmVnaXN0ZXIgW01ldHJpY11zIHRvIG1ha2UgdGhlbSB2aXNpYmxlIHRvIE9ic2VydmF0b3J5LgogIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKE1ldHJpYyBtZXRyaWMpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKG1ldHJpYywgJ21ldHJpYycpOwogICAgaWYgKF9tZXRyaWNzW21ldHJpYy5uYW1lXSAhPSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdSZWdpc3RlcmVkIG1ldHJpY3MgaGF2ZSB1bmlxdWUgbmFtZXMnKTsKICAgIH0KICAgIF9tZXRyaWNzW21ldHJpYy5uYW1lXSA9IG1ldHJpYzsKICB9CgogIC8vLyBEZXJlZ2lzdGVyIFtNZXRyaWNdcyB0byBtYWtlIHRoZW0gbm90IHZpc2libGUgdG8gT2JzZXJ2YXRvcnkuCiAgc3RhdGljIHZvaWQgZGVyZWdpc3RlcihNZXRyaWMgbWV0cmljKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChtZXRyaWMsICdtZXRyaWMnKTsKICAgIF9tZXRyaWNzLnJlbW92ZShtZXRyaWMubmFtZSk7CiAgfQoKICAvLyBpZ25vcmU6IHVudXNlZF9lbGVtZW50LCBjYWxsZWQgZnJvbSBuYXRpdmUgY29kZQogIHN0YXRpYyBTdHJpbmcgX3ByaW50TWV0cmljKFN0cmluZyBpZCkgewogICAgdmFyIG1ldHJpYyA9IF9tZXRyaWNzW2lkXTsKICAgIGlmIChtZXRyaWMgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBqc29uLmVuY29kZShtZXRyaWMuX3RvSlNPTigpKTsKICB9CgogIC8vIGlnbm9yZTogdW51c2VkX2VsZW1lbnQsIGNhbGxlZCBmcm9tIG5hdGl2ZSBjb2RlCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAhY29uc3QgYm9vbC5mcm9tRW52aXJvbm1lbnQoImRhcnQudm0ucHJvZHVjdCIpKQogIHN0YXRpYyBTdHJpbmcgX3ByaW50TWV0cmljcygpIHsKICAgIHZhciBtZXRyaWNzID0gW107CiAgICBmb3IgKHZhciBtZXRyaWMgaW4gX21ldHJpY3MudmFsdWVzKSB7CiAgICAgIG1ldHJpY3MuYWRkKG1ldHJpYy5fdG9KU09OKCkpOwogICAgfQogICAgdmFyIG1hcCA9IHsKICAgICAgJ3R5cGUnOiAnTWV0cmljTGlzdCcsCiAgICAgICdtZXRyaWNzJzogbWV0cmljcywKICAgIH07CiAgICByZXR1cm4ganNvbi5lbmNvZGUobWFwKTsKICB9Cn0KgJcATk48ARgBSBlQIwEqARcUAUsWGQEyKgIBMyIBTExOHxgdFQEkHAEoMDcGBAERAgFKKx0UFAERHhgTDxoPBhAEAT0jLCxMEgQBEhAXHRQiFhISBxAEAgEsH0cBFx4YEAQBEhAZHRQiFgcQBAIBEEkBPigyKUcGJAQBRCoyIgQBNSofGhMGKgQBNUwiFiolBhAcGgcdBAIBHGRhcnQ6ZGV2ZWxvcGVyL3Byb2ZpbGVyLmRhcnQyb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2RldmVsb3Blci9zZXJ2aWNlLmRhcnSPgS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuZGV2ZWxvcGVyOwoKLy8vIFNlcnZpY2UgcHJvdG9jb2wgaXMgdGhlIHByb3RvY29sIHRoYXQgYSBjbGllbnQgbGlrZSB0aGUgT2JzZXJ2YXRvcnkKLy8vIGNvdWxkIHVzZSB0byBhY2Nlc3MgdGhlIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IHRoZSBEYXJ0IFZNIGZvcgovLy8gZGVidWdnaW5nIGFuZCBpbnNwZWN0aW5nIERhcnQgcHJvZ3JhbXMuIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZQovLy8gdmVyc2lvbiBudW1iZXIgYW5kIFVyaSBmb3IgYWNjZXNzaW5nIHRoaXMgc2VydmljZS4KY2xhc3MgU2VydmljZVByb3RvY29sSW5mbyB7CiAgLy8vIFRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBwcm90b2NvbC4gSWYgdGhlIHJ1bm5pbmcgRGFydCBlbnZpcm9ubWVudCBkb2VzCiAgLy8vIG5vdCBzdXBwb3J0IHRoZSBzZXJ2aWNlIHByb3RvY29sLCB0aGlzIGlzIDAuCiAgZmluYWwgaW50IG1ham9yVmVyc2lvbiA9IF9nZXRTZXJ2aWNlTWFqb3JWZXJzaW9uKCk7CgogIC8vLyBUaGUgbWlub3IgdmVyc2lvbiBvZiB0aGUgcHJvdG9jb2wuIElmIHRoZSBydW5uaW5nIERhcnQgZW52aXJvbm1lbnQgZG9lcwogIC8vLyBub3Qgc3VwcG9ydCB0aGUgc2VydmljZSBwcm90b2NvbCwgdGhpcyBpcyAwLgogIGZpbmFsIGludCBtaW5vclZlcnNpb24gPSBfZ2V0U2VydmljZU1pbm9yVmVyc2lvbigpOwoKICAvLy8gVGhlIFVyaSB0byBhY2Nlc3MgdGhlIHNlcnZpY2UuIElmIHRoZSB3ZWIgc2VydmVyIGlzIG5vdCBydW5uaW5nLCB0aGlzCiAgLy8vIHdpbGwgYmUgbnVsbC4KICBmaW5hbCBVcmkgc2VydmVyVXJpOwoKICBTZXJ2aWNlUHJvdG9jb2xJbmZvKHRoaXMuc2VydmVyVXJpKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgaWYgKHNlcnZlclVyaSAhPSBudWxsKSB7CiAgICAgIHJldHVybiAnRGFydCBWTSBTZXJ2aWNlIFByb3RvY29sIHYkbWFqb3JWZXJzaW9uLiRtaW5vclZlcnNpb24gJwogICAgICAgICAgJ2xpc3RlbmluZyBvbiAkc2VydmVyVXJpJzsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAnRGFydCBWTSBTZXJ2aWNlIFByb3RvY29sIHYkbWFqb3JWZXJzaW9uLiRtaW5vclZlcnNpb24nOwogICAgfQogIH0KfQoKLy8vIEFjY2VzcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmljZSBwcm90b2NvbCBhbmQgY29udHJvbCB0aGUgd2ViIHNlcnZlcgovLy8gdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IHRoZSBEYXJ0IFZNIGZvcgovLy8gZGVidWdnaW5nIGFuZCBpbnNwZWN0aW5nIERhcnQgcHJvZ3JhbXMuCmNsYXNzIFNlcnZpY2UgewogIC8vLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZpY2UgcHJvdG9jb2wgKHZlcnNpb24gbnVtYmVyIGFuZAogIC8vLyBVcmkgdG8gYWNjZXNzIHRoZSBzZXJ2aWNlKS4KICBzdGF0aWMgRnV0dXJlPFNlcnZpY2VQcm90b2NvbEluZm8+IGdldEluZm8oKSBhc3luYyB7CiAgICAvLyBQb3J0IHRvIHJlY2VpdmUgcmVzcG9uc2UgZnJvbSBzZXJ2aWNlIGlzb2xhdGUuCiAgICBmaW5hbCBSYXdSZWNlaXZlUG9ydCByZWNlaXZlUG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOwogICAgZmluYWwgQ29tcGxldGVyPFVyaT4gdXJpQ29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxVcmk+KCk7CiAgICByZWNlaXZlUG9ydC5oYW5kbGVyID0gKFVyaSB1cmkpID0+IHVyaUNvbXBsZXRlci5jb21wbGV0ZSh1cmkpOwogICAgLy8gUmVxdWVzdCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VydmljZSBpc29sYXRlLgogICAgX2dldFNlcnZlckluZm8ocmVjZWl2ZVBvcnQuc2VuZFBvcnQpOwogICAgLy8gQXdhaXQgdGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UgaXNvbGF0ZS4KICAgIFVyaSB1cmkgPSBhd2FpdCB1cmlDb21wbGV0ZXIuZnV0dXJlOwogICAgLy8gQ2xvc2UgdGhlIHBvcnQuCiAgICByZWNlaXZlUG9ydC5jbG9zZSgpOwogICAgcmV0dXJuIG5ldyBTZXJ2aWNlUHJvdG9jb2xJbmZvKHVyaSk7CiAgfQoKICAvLy8gQ29udHJvbCB0aGUgd2ViIHNlcnZlciB0aGF0IHRoZSBzZXJ2aWNlIHByb3RvY29sIGlzIGFjY2Vzc2VkIHRocm91Z2guCiAgLy8vIFRoZSBbZW5hYmxlXSBhcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbiBhbmQgaXMgdXNlZCBhcyBhIHRvZ2dsZSB0bwogIC8vLyBlbmFibGUgKHRydWUpIG9yIGRpc2FibGUgKGZhbHNlKSB0aGUgd2ViIHNlcnZlciBzZXJ2aWNpbmcgcmVxdWVzdHMuCiAgc3RhdGljIEZ1dHVyZTxTZXJ2aWNlUHJvdG9jb2xJbmZvPiBjb250cm9sV2ViU2VydmVyKAogICAgICB7Ym9vbCBlbmFibGU6IGZhbHNlfSkgYXN5bmMgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoZW5hYmxlLCAnZW5hYmxlJyk7CiAgICAvLyBQb3J0IHRvIHJlY2VpdmUgcmVzcG9uc2UgZnJvbSBzZXJ2aWNlIGlzb2xhdGUuCiAgICBmaW5hbCBSYXdSZWNlaXZlUG9ydCByZWNlaXZlUG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOwogICAgZmluYWwgQ29tcGxldGVyPFVyaT4gdXJpQ29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxVcmk+KCk7CiAgICByZWNlaXZlUG9ydC5oYW5kbGVyID0gKFVyaSB1cmkpID0+IHVyaUNvbXBsZXRlci5jb21wbGV0ZSh1cmkpOwogICAgLy8gUmVxdWVzdCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VydmljZSBpc29sYXRlLgogICAgX3dlYlNlcnZlckNvbnRyb2wocmVjZWl2ZVBvcnQuc2VuZFBvcnQsIGVuYWJsZSk7CiAgICAvLyBBd2FpdCB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZSBpc29sYXRlLgogICAgVXJpIHVyaSA9IGF3YWl0IHVyaUNvbXBsZXRlci5mdXR1cmU7CiAgICAvLyBDbG9zZSB0aGUgcG9ydC4KICAgIHJlY2VpdmVQb3J0LmNsb3NlKCk7CiAgICByZXR1cm4gbmV3IFNlcnZpY2VQcm90b2NvbEluZm8odXJpKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgW1N0cmluZ10gdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBJRCBvZiBbaXNvbGF0ZV0uCiAgLy8vCiAgLy8vIFJldHVybnMgbnVsbCBpZiB0aGUgcnVubmluZyBEYXJ0IGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIHNlcnZpY2UKICAvLy8gcHJvdG9jb2wuCiAgc3RhdGljIFN0cmluZyBnZXRJc29sYXRlSUQoSXNvbGF0ZSBpc29sYXRlKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChpc29sYXRlLCAnaXNvbGF0ZScpOwogICAgcmV0dXJuIF9nZXRJc29sYXRlSURGcm9tU2VuZFBvcnQoaXNvbGF0ZS5jb250cm9sUG9ydCk7CiAgfQp9CgovLy8gW3NlbmRQb3J0XSB3aWxsIHJlY2VpdmUgYSBVcmkgb3IgbnVsbC4KZXh0ZXJuYWwgdm9pZCBfZ2V0U2VydmVySW5mbyhTZW5kUG9ydCBzZW5kUG9ydCk7CgovLy8gW3NlbmRQb3J0XSB3aWxsIHJlY2VpdmUgYSBVcmkgb3IgbnVsbC4KZXh0ZXJuYWwgdm9pZCBfd2ViU2VydmVyQ29udHJvbChTZW5kUG9ydCBzZW5kUG9ydCwgYm9vbCBlbmFibGUpOwoKLy8vIFJldHVybnMgdGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIHNlcnZpY2UgcHJvdG9jb2wuCmV4dGVybmFsIGludCBfZ2V0U2VydmljZU1ham9yVmVyc2lvbigpOwoKLy8vIFJldHVybnMgdGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIHNlcnZpY2UgcHJvdG9jb2wuCmV4dGVybmFsIGludCBfZ2V0U2VydmljZU1pbm9yVmVyc2lvbigpOwoKLy8vIFJldHVybnMgdGhlIHNlcnZpY2UgaWQgZm9yIHRoZSBpc29sYXRlIHRoYXQgb3ducyBbc2VuZFBvcnRdLgpleHRlcm5hbCBTdHJpbmcgX2dldElzb2xhdGVJREZyb21TZW5kUG9ydChTZW5kUG9ydCBzZW5kUG9ydCk7CmQATk48ARgBSEFINxxOMzYBTjM2AUwUFwEnARYdRiUNRgYEAgFNRSwQRSI3Nj0+QzkqNCkXGSkEAUxJSjckMjY9PkM5NTQpFxkpBAFBBlAQMDQ7BAIBKzEBK0EBNygBNygBQT4BG2RhcnQ6ZGV2ZWxvcGVyL3NlcnZpY2UuZGFydC5vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2RldmVsb3Blci5kYXJ0lPYvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIE5vdGU6IHRoZSBWTSBjb25jYXRlbmF0ZXMgYWxsIHBhdGNoIGZpbGVzIGludG8gYSBzaW5nbGUgcGF0Y2ggZmlsZS4gVGhpcwovLy8gZmlsZSBpcyB0aGUgZmlyc3QgcGF0Y2ggaW4gImRhcnQ6ZGV2ZWxvcGVyIiB3aGljaCBjb250YWlucyBhbGwgdGhlIGltcG9ydHMKLy8vIHVzZWQgYnkgcGF0Y2hlcyBvZiB0aGF0IGxpYnJhcnkuIFdlIHBsYW4gdG8gY2hhbmdlIHRoaXMgd2hlbiB3ZSBoYXZlIGEKLy8vIHNoYXJlZCBmcm9udCBlbmQgYW5kIHNpbXBseSB1c2UgcGFydHMuCgppbXBvcnQgImRhcnQ6X2ludGVybmFsIiBzaG93IHBhdGNoOwoKaW1wb3J0ICJkYXJ0OmFzeW5jIiBzaG93IEZ1dHVyZSwgWm9uZTsKCmltcG9ydCAiZGFydDppc29sYXRlIiBzaG93IFNlbmRQb3J0OwoKLy8vIFRoZXNlIGFyZSB0aGUgYWRkaXRpb25hbCBwYXJ0cyBvZiB0aGlzIHBhdGNoIGxpYnJhcnk6Ci8vIHBhcnQgInByb2ZpbGVyLmRhcnQiCi8vIHBhcnQgInRpbWVsaW5lLmRhcnQiCgpAcGF0Y2gKYm9vbCBkZWJ1Z2dlcih7Ym9vbCB3aGVuOiB0cnVlLCBTdHJpbmcgbWVzc2FnZX0pIG5hdGl2ZSAiRGV2ZWxvcGVyX2RlYnVnZ2VyIjsKCkBwYXRjaApPYmplY3QgaW5zcGVjdChPYmplY3Qgb2JqZWN0KSBuYXRpdmUgIkRldmVsb3Blcl9pbnNwZWN0IjsKCkBwYXRjaAp2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwKICAgIHtEYXRlVGltZSB0aW1lLAogICAgaW50IHNlcXVlbmNlTnVtYmVyLAogICAgaW50IGxldmVsOiAwLAogICAgU3RyaW5nIG5hbWU6ICcnLAogICAgWm9uZSB6b25lLAogICAgT2JqZWN0IGVycm9yLAogICAgU3RhY2tUcmFjZSBzdGFja1RyYWNlfSkgewogIGlmIChtZXNzYWdlIGlzISBTdHJpbmcpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKG1lc3NhZ2UsICJtZXNzYWdlIiwgIk11c3QgYmUgYSBTdHJpbmciKTsKICB9CiAgdGltZSA/Pz0gbmV3IERhdGVUaW1lLm5vdygpOwogIGlmICh0aW1lIGlzISBEYXRlVGltZSkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUodGltZSwgInRpbWUiLCAiTXVzdCBiZSBhIERhdGVUaW1lIik7CiAgfQogIGlmIChzZXF1ZW5jZU51bWJlciA9PSBudWxsKSB7CiAgICBzZXF1ZW5jZU51bWJlciA9IF9uZXh0U2VxdWVuY2VOdW1iZXIrKzsKICB9IGVsc2UgewogICAgX25leHRTZXF1ZW5jZU51bWJlciA9IHNlcXVlbmNlTnVtYmVyICsgMTsKICB9CiAgX2xvZyhtZXNzYWdlLCB0aW1lLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2gsIHNlcXVlbmNlTnVtYmVyLCBsZXZlbCwgbmFtZSwgem9uZSwKICAgICAgZXJyb3IsIHN0YWNrVHJhY2UpOwp9CgppbnQgX25leHRTZXF1ZW5jZU51bWJlciA9IDA7CgpfbG9nKFN0cmluZyBtZXNzYWdlLCBpbnQgdGltZXN0YW1wLCBpbnQgc2VxdWVuY2VOdW1iZXIsIGludCBsZXZlbCwgU3RyaW5nIG5hbWUsCiAgICBab25lIHpvbmUsIE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSBuYXRpdmUgIkRldmVsb3Blcl9sb2ciOwoKQHBhdGNoCnZvaWQgX3Bvc3RFdmVudChTdHJpbmcgZXZlbnRLaW5kLCBTdHJpbmcgZXZlbnREYXRhKQogICAgbmF0aXZlICJEZXZlbG9wZXJfcG9zdEV2ZW50IjsKCkBwYXRjaApTZXJ2aWNlRXh0ZW5zaW9uSGFuZGxlciBfbG9va3VwRXh0ZW5zaW9uKFN0cmluZyBtZXRob2QpCiAgICBuYXRpdmUgIkRldmVsb3Blcl9sb29rdXBFeHRlbnNpb24iOwoKQHBhdGNoCl9yZWdpc3RlckV4dGVuc2lvbihTdHJpbmcgbWV0aG9kLCBTZXJ2aWNlRXh0ZW5zaW9uSGFuZGxlciBoYW5kbGVyKQogICAgbmF0aXZlICJEZXZlbG9wZXJfcmVnaXN0ZXJFeHRlbnNpb24iOwoKLy8gVGhpcyBjb2RlIGlzIG9ubHkgaW52b2tlZCB3aGVuIHRoZXJlIGlzIG5vIG90aGVyIERhcnQgY29kZSBvbiB0aGUgc3RhY2suCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgIWNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCJkYXJ0LnZtLnByb2R1Y3QiKSkKX3J1bkV4dGVuc2lvbigKICAgIFNlcnZpY2VFeHRlbnNpb25IYW5kbGVyIGhhbmRsZXIsCiAgICBTdHJpbmcgbWV0aG9kLAogICAgTGlzdDxTdHJpbmc+IHBhcmFtZXRlcktleXMsCiAgICBMaXN0PFN0cmluZz4gcGFyYW1ldGVyVmFsdWVzLAogICAgU2VuZFBvcnQgcmVwbHlQb3J0LAogICAgT2JqZWN0IGlkLAogICAgYm9vbCB0cmFjZV9zZXJ2aWNlKSB7CiAgdmFyIHBhcmFtZXRlcnMgPSA8U3RyaW5nLCBTdHJpbmc+e307CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbWV0ZXJLZXlzLmxlbmd0aDsgaSsrKSB7CiAgICBwYXJhbWV0ZXJzW3BhcmFtZXRlcktleXNbaV1dID0gcGFyYW1ldGVyVmFsdWVzW2ldOwogIH0KICB2YXIgcmVzcG9uc2U7CiAgdHJ5IHsKICAgIHJlc3BvbnNlID0gaGFuZGxlcihtZXRob2QsIHBhcmFtZXRlcnMpOwogIH0gY2F0Y2ggKGUsIHN0KSB7CiAgICB2YXIgZXJyb3JEZXRhaWxzID0gKHN0ID09IG51bGwpID8gJyRlJyA6ICckZVxuJHN0JzsKICAgIHJlc3BvbnNlID0gbmV3IFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5lcnJvcigKICAgICAgICBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2Uua0V4dGVuc2lvbkVycm9yLCBlcnJvckRldGFpbHMpOwogICAgX3Bvc3RSZXNwb25zZShyZXBseVBvcnQsIGlkLCByZXNwb25zZSwgdHJhY2Vfc2VydmljZSk7CiAgICByZXR1cm47CiAgfQogIGlmIChyZXNwb25zZSBpcyEgRnV0dXJlKSB7CiAgICByZXNwb25zZSA9IG5ldyBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UuZXJyb3IoCiAgICAgICAgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLmtFeHRlbnNpb25FcnJvciwKICAgICAgICAiRXh0ZW5zaW9uIGhhbmRsZXIgbXVzdCByZXR1cm4gYSBGdXR1cmUiKTsKICAgIF9wb3N0UmVzcG9uc2UocmVwbHlQb3J0LCBpZCwgcmVzcG9uc2UsIHRyYWNlX3NlcnZpY2UpOwogICAgcmV0dXJuOwogIH0KICByZXNwb25zZS5jYXRjaEVycm9yKChlLCBzdCkgewogICAgLy8gQ2F0Y2ggYW55IGVycm9ycyBlYWdlcmx5IGFuZCB3cmFwIHRoZW0gaW4gYSBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UuCiAgICB2YXIgZXJyb3JEZXRhaWxzID0gKHN0ID09IG51bGwpID8gJyRlJyA6ICckZVxuJHN0JzsKICAgIHJldHVybiBuZXcgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLmVycm9yKAogICAgICAgIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5rRXh0ZW5zaW9uRXJyb3IsIGVycm9yRGV0YWlscyk7CiAgfSkudGhlbigocmVzcG9uc2UpIHsKICAgIC8vIFBvc3QgdGhlIHZhbGlkIHJlc3BvbnNlIG9yIHRoZSB3cmFwcGVkIGVycm9yIGFmdGVyIHZlcmlmeWluZyB0aGF0CiAgICAvLyB0aGUgcmVzcG9uc2UgaXMgYSBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UuCiAgICBpZiAocmVzcG9uc2UgaXMhIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZSkgewogICAgICByZXNwb25zZSA9IG5ldyBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UuZXJyb3IoCiAgICAgICAgICBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2Uua0V4dGVuc2lvbkVycm9yLAogICAgICAgICAgIkV4dGVuc2lvbiBoYW5kbGVyIG11c3QgY29tcGxldGUgdG8gYSBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UiKTsKICAgIH0KICAgIF9wb3N0UmVzcG9uc2UocmVwbHlQb3J0LCBpZCwgcmVzcG9uc2UsIHRyYWNlX3NlcnZpY2UpOwogIH0pLmNhdGNoRXJyb3IoKGUsIHN0KSB7CiAgICAvLyBXZSBkbyBub3QgZXhwZWN0IGFueSBlcnJvcnMgdG8gb2NjdXIgaW4gdGhlIC50aGVuIG9yIC5jYXRjaEVycm9yIGJsb2NrcwogICAgLy8gYnV0LCBzdXBwcmVzcyB0aGVtIGp1c3QgaW4gY2FzZS4KICB9KTsKfQoKLy8gVGhpcyBjb2RlIGlzIG9ubHkgaW52b2tlZCBieSBfcnVuRXh0ZW5zaW9uLgpfcG9zdFJlc3BvbnNlKFNlbmRQb3J0IHJlcGx5UG9ydCwgT2JqZWN0IGlkLCBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UgcmVzcG9uc2UsCiAgICBib29sIHRyYWNlX3NlcnZpY2UpIHsKICBhc3NlcnQocmVwbHlQb3J0ICE9IG51bGwpOwogIGlmIChpZCA9PSBudWxsKSB7CiAgICBpZiAodHJhY2Vfc2VydmljZSkgewogICAgICBwcmludCgidm0tc2VydmljZTogcG9zdGluZyBubyByZXNwb25zZSBmb3IgcmVxdWVzdCIpOwogICAgfQogICAgLy8gTm8gaWQgLT4gbm8gcmVzcG9uc2UuCiAgICByZXBseVBvcnQuc2VuZChudWxsKTsKICAgIHJldHVybjsKICB9CiAgYXNzZXJ0KGlkICE9IG51bGwpOwogIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBzYi53cml0ZSgneyJqc29ucnBjIjoiMi4wIiwnKTsKICBpZiAocmVzcG9uc2UuaXNFcnJvcigpKSB7CiAgICBpZiAodHJhY2Vfc2VydmljZSkgewogICAgICBwcmludCgidm0tc2VydmljZTogcG9zdGluZyBlcnJvciByZXNwb25zZSBmb3IgcmVxdWVzdCAkaWQiKTsKICAgIH0KICAgIHNiLndyaXRlKCciZXJyb3IiOicpOwogIH0gZWxzZSB7CiAgICBpZiAodHJhY2Vfc2VydmljZSkgewogICAgICBwcmludCgidm0tc2VydmljZTogcG9zdGluZyByZXNwb25zZSBmb3IgcmVxdWVzdCAkaWQiKTsKICAgIH0KICAgIHNiLndyaXRlKCcicmVzdWx0IjonKTsKICB9CiAgc2Iud3JpdGUoJyR7cmVzcG9uc2UuX3RvU3RyaW5nKCl9LCcpOwogIGlmIChpZCBpcyBTdHJpbmcpIHsKICAgIHNiLndyaXRlKCciaWQiOiIkaWQifScpOwogIH0gZWxzZSB7CiAgICBzYi53cml0ZSgnImlkIjokaWR9Jyk7CiAgfQogIHJlcGx5UG9ydC5zZW5kKHNiLnRvU3RyaW5nKCkpOwp9CgpAcGF0Y2gKaW50IF9nZXRTZXJ2aWNlTWFqb3JWZXJzaW9uKCkgbmF0aXZlICJEZXZlbG9wZXJfZ2V0U2VydmljZU1ham9yVmVyc2lvbiI7CgpAcGF0Y2gKaW50IF9nZXRTZXJ2aWNlTWlub3JWZXJzaW9uKCkgbmF0aXZlICJEZXZlbG9wZXJfZ2V0U2VydmljZU1pbm9yVmVyc2lvbiI7CgpAcGF0Y2gKdm9pZCBfZ2V0U2VydmVySW5mbyhTZW5kUG9ydCBzZW5kUG9ydCkgbmF0aXZlICJEZXZlbG9wZXJfZ2V0U2VydmVySW5mbyI7CgpAcGF0Y2gKdm9pZCBfd2ViU2VydmVyQ29udHJvbChTZW5kUG9ydCBzZW5kUG9ydCwgYm9vbCBlbmFibGUpCiAgICBuYXRpdmUgIkRldmVsb3Blcl93ZWJTZXJ2ZXJDb250cm9sIjsKCkBwYXRjaApTdHJpbmcgX2dldElzb2xhdGVJREZyb21TZW5kUG9ydChTZW5kUG9ydCBzZW5kUG9ydCkKICAgIG5hdGl2ZSAiRGV2ZWxvcGVyX2dldElzb2xhdGVJREZyb21TZW5kUG9ydCI7CoCrAE5OPAFNT0srASQBJwElAToYGAEHTgEHOgEHGRQYEhUPEh4cSwQfG0cEICwLLgRQGgIBHQFQTAEHNCIBBzgoAQdDKgFMSg8lEyAiGA8aJzM3BBAILBQ4M0E7DAQdMzIzOwwEIE04L0EXSTMxNTRMBjsaTygGAgEvUBodFBk8Bh0aDAQWKCEcGUMGGgsZPQYbBCgWHQsbBCECAQdJAQdJAQdJAQc3KQEHNDEBI2RhcnQ6ZGV2ZWxvcGVyLXBhdGNoL2RldmVsb3Blci5kYXJ0LW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvdGltZWxpbmUuZGFydIRzLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImRldmVsb3Blci5kYXJ0IjsKCkBwYXRjaApib29sIF9pc0RhcnRTdHJlYW1FbmFibGVkKCkgbmF0aXZlICJUaW1lbGluZV9pc0RhcnRTdHJlYW1FbmFibGVkIjsKCkBwYXRjaAppbnQgX2dldFRyYWNlQ2xvY2soKSBuYXRpdmUgIlRpbWVsaW5lX2dldFRyYWNlQ2xvY2siOwoKQHBhdGNoCmludCBfZ2V0VGhyZWFkQ3B1Q2xvY2soKSBuYXRpdmUgIlRpbWVsaW5lX2dldFRocmVhZENwdUNsb2NrIjsKCkBwYXRjaAppbnQgX2dldE5leHRBc3luY0lkKCkgbmF0aXZlICJUaW1lbGluZV9nZXROZXh0QXN5bmNJZCI7CgpAcGF0Y2gKdm9pZCBfcmVwb3J0VGFza0V2ZW50KGludCBzdGFydCwgaW50IHRhc2tJZCwgU3RyaW5nIHBoYXNlLCBTdHJpbmcgY2F0ZWdvcnksCiAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIGFyZ3VtZW50c0FzSnNvbikgbmF0aXZlICJUaW1lbGluZV9yZXBvcnRUYXNrRXZlbnQiOwoKQHBhdGNoCnZvaWQgX3JlcG9ydENvbXBsZXRlRXZlbnQoaW50IHN0YXJ0LCBpbnQgc3RhcnRDcHUsIFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG5hbWUsCiAgICBTdHJpbmcgYXJndW1lbnRzQXNKc29uKSBuYXRpdmUgIlRpbWVsaW5lX3JlcG9ydENvbXBsZXRlRXZlbnQiOwoKQHBhdGNoCnZvaWQgX3JlcG9ydEZsb3dFdmVudChpbnQgc3RhcnQsIGludCBzdGFydENwdSwgU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbmFtZSwKICAgIGludCB0eXBlLCBpbnQgaWQsIFN0cmluZyBhcmd1bWVudHNBc0pzb24pIG5hdGl2ZSAiVGltZWxpbmVfcmVwb3J0Rmxvd0V2ZW50IjsKCkBwYXRjaAp2b2lkIF9yZXBvcnRJbnN0YW50RXZlbnQoaW50IHN0YXJ0LCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBuYW1lLAogICAgU3RyaW5nIGFyZ3VtZW50c0FzSnNvbikgbmF0aXZlICJUaW1lbGluZV9yZXBvcnRJbnN0YW50RXZlbnQiOwojAE5OPAEdAQdDAQc2AQc+AQc4AQdMTAEHUUMBB01RAQdCQgEiZGFydDpkZXZlbG9wZXItcGF0Y2gvdGltZWxpbmUuZGFydChvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvZmZpL2ZmaS5kYXJ0j2gvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlCgovLy8ge0BjYXRlZ29yeSBWTX0KLy8vIHtAbm9kb2N9CmxpYnJhcnkgZGFydC5mZmk7CgpwYXJ0ICJuYXRpdmVfdHlwZS5kYXJ0IjsKcGFydCAiYW5ub3RhdGlvbnMuZGFydCI7CnBhcnQgImR5bmFtaWNfbGlicmFyeS5kYXJ0IjsKcGFydCAic3RydWN0LmRhcnQiOwoKLy8vIE51bWJlciBvZiBieXRlcyB1c2VkIGJ5IG5hdGl2ZSB0eXBlIFQuCi8vLwovLy8gSW5jbHVkZXMgcGFkZGluZyBhbmQgYWxpZ25tZW50IG9mIHN0cnVjdHMuCmV4dGVybmFsIGludCBzaXplT2Y8VCBleHRlbmRzIE5hdGl2ZVR5cGU+KCk7CgovLy8gUmVwcmVzZW50cyBhIHBvaW50ZXIgaW50byB0aGUgbmF0aXZlIEMgbWVtb3J5LgpmaW5hbCBQb2ludGVyPFZvaWQ+IG51bGxwdHIgPSBQb2ludGVyLmZyb21BZGRyZXNzKDApOwoKLy8vIFJlcHJlc2VudHMgYSBwb2ludGVyIGludG8gdGhlIG5hdGl2ZSBDIG1lbW9yeS4gQ2Fubm90IGJlIGV4dGVuZGVkLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIFBvaW50ZXI8VCBleHRlbmRzIE5hdGl2ZVR5cGU+IGV4dGVuZHMgTmF0aXZlVHlwZSB7CiAgLy8vIEFsbG9jYXRlIFtjb3VudF0gZWxlbWVudHMgb2YgdHlwZSBbVF0gb24gdGhlIG5hdGl2ZSBoZWFwIHZpYSBtYWxsb2MoKSBhbmQKICAvLy8gcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIG1lbW9yeS4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoZSBtZW1vcnkgaXMgdW5pbml0aWFsaXplZC4KICBleHRlcm5hbCBmYWN0b3J5IFBvaW50ZXIuYWxsb2NhdGUoe2ludCBjb3VudDogMX0pOwoKICAvLy8gQ29uc3RydWN0aW9uIGZyb20gcmF3IGludGVnZXIuCiAgZXh0ZXJuYWwgZmFjdG9yeSBQb2ludGVyLmZyb21BZGRyZXNzKGludCBwdHIpOwoKICAvLy8gQ29udmVydCBEYXJ0IGZ1bmN0aW9uIHRvIGEgQyBmdW5jdGlvbiBwb2ludGVyLCBhdXRvbWF0aWNhbGx5IG1hcnNoYWxsaW5nCiAgLy8vIHRoZSBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZQogIC8vLwogIC8vLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIHdoaWxlIGNhbGxpbmcgYGYoKWAsIHRoZSBuYXRpdmUgZnVuY3Rpb24gd2lsbAogIC8vLyByZXR1cm4gYGV4Y2VwdGlvbmFsUmV0dXJuYCwgd2hpY2ggbXVzdCBiZSBhc3NpZ25hYmxlIHRvIHJldHVybiB0eXBlIG9mIGBmYC4KICAvLy8KICAvLy8gVGhlIHJldHVybmVkIGZ1bmN0aW9uIGFkZHJlc3MgY2FuIG9ubHkgYmUgaW52b2tlZCBvbiB0aGUgbXV0YXRvciAobWFpbikKICAvLy8gdGhyZWFkIG9mIHRoZSBjdXJyZW50IGlzb2xhdGUuIEl0IHdpbGwgYWJvcnQgdGhlIHByb2Nlc3MgaWYgaW52b2tlZCBvbiBhbnkKICAvLy8gb3RoZXIgdGhyZWFkLgogIC8vLwogIC8vLyBUaGUgcG9pbnRlciByZXR1cm5lZCB3aWxsIHJlbWFpbiBhbGl2ZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50CiAgLy8vIGlzb2xhdGUncyBsaWZldGltZS4gQWZ0ZXIgdGhlIGlzb2xhdGUgaXQgd2FzIGNyZWF0ZWQgaW4gaXMgdGVybWluYXRlZCwKICAvLy8gaW52b2tpbmcgaXQgZnJvbSBuYXRpdmUgY29kZSB3aWxsIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvci4KICAvLy8KICAvLy8gRG9lcyBub3QgYWNjZXB0IGR5bmFtaWMgaW52b2NhdGlvbnMgLS0gd2hlcmUgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGlzCiAgLy8vIFtkeW5hbWljXS4KICBleHRlcm5hbCBzdGF0aWMgUG9pbnRlcjxOYXRpdmVGdW5jdGlvbjxUPj4gZnJvbUZ1bmN0aW9uPFQgZXh0ZW5kcyBGdW5jdGlvbj4oCiAgICAgIEBEYXJ0UmVwcmVzZW50YXRpb25PZigiVCIpIEZ1bmN0aW9uIGYsIE9iamVjdCBleGNlcHRpb25hbFJldHVybik7CgogIC8vLyBTdG9yZSBhIERhcnQgdmFsdWUgaW50byB0aGlzIGxvY2F0aW9uLgogIC8vLwogIC8vLyBUaGUgW3ZhbHVlXSBpcyBhdXRvbWF0aWNhbGx5IG1hcnNoYWxsZWQgaW50byBpdHMgbmF0aXZlIHJlcHJlc2VudGF0aW9uLgogIC8vLyBOb3RlIHRoYXQgaW50cyB3aGljaCBkbyBub3QgZml0IGluIFtUXSBhcmUgdHJ1bmNhdGVkIGFuZCBzaWduIGV4dGVuZGVkLAogIC8vLyBhbmQgZG91YmxlcyBzdG9yZWQgaW50byBQb2ludGVyPFtGbG9hdF0+IGxvc2UgcHJlY2lzaW9uLgogIGV4dGVybmFsIHZvaWQgc3RvcmUoQERhcnRSZXByZXNlbnRhdGlvbk9mKCJUIikgT2JqZWN0IHZhbHVlKTsKCiAgLy8vIExvYWQgYSBEYXJ0IHZhbHVlIGZyb20gdGhpcyBsb2NhdGlvbi4KICAvLy8KICAvLy8gVGhlIHZhbHVlIGlzIGF1dG9tYXRpY2FsbHkgdW5tYXJzaGFsbGVkIGZyb20gaXRzIG5hdGl2ZSByZXByZXNlbnRhdGlvbi4KICAvLy8gTG9hZGluZyBhIFtTdHJ1Y3RdIHJlZmVyZW5jZSByZXR1cm5zIGEgcmVmZXJlbmNlIGJhY2tlZCBieSBuYXRpdmUgbWVtb3J5CiAgLy8vICh0aGUgc2FtZSBwb2ludGVyIGFzIGl0J3MgbG9hZGVkIGZyb20pLgogIGV4dGVybmFsIFIgbG9hZDxARGFydFJlcHJlc2VudGF0aW9uT2YoIlQiKSBSPigpOwoKICAvLy8gQWNjZXNzIHRvIHRoZSByYXcgcG9pbnRlciB2YWx1ZS4KICAvLy8gT24gMzItYml0IHN5c3RlbXMsIHRoZSB1cHBlciAzMi1iaXRzIG9mIHRoZSByZXN1bHQgYXJlIDAuCiAgZXh0ZXJuYWwgaW50IGdldCBhZGRyZXNzOwoKICAvLy8gUG9pbnRlciBhcml0aG1ldGljICh0YWtlcyBlbGVtZW50IHNpemUgaW50byBhY2NvdW50KS4KICBleHRlcm5hbCBQb2ludGVyPFQ+IGVsZW1lbnRBdChpbnQgaW5kZXgpOwoKICAvLy8gUG9pbnRlciBhcml0aG1ldGljIChieXRlIG9mZnNldCkuCiAgLy8gVE9ETyhkYWNvaGFya2VzKTogcmVtb3ZlIHRoaXM/CiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzM1ODgzCiAgZXh0ZXJuYWwgUG9pbnRlcjxUPiBvZmZzZXRCeShpbnQgb2Zmc2V0SW5CeXRlcyk7CgogIC8vLyBDYXN0IFBvaW50ZXI8VD4gdG8gYSBQb2ludGVyPFY+LgogIGV4dGVybmFsIFBvaW50ZXI8VT4gY2FzdDxVIGV4dGVuZHMgTmF0aXZlVHlwZT4oKTsKCiAgLy8vIENvbnZlcnQgdG8gRGFydCBmdW5jdGlvbiwgYXV0b21hdGljYWxseSBtYXJzaGFsbGluZyB0aGUgYXJndW1lbnRzCiAgLy8vIGFuZCByZXR1cm4gdmFsdWUuCiAgLy8vCiAgLy8vIENhbiBvbmx5IGJlIGNhbGxlZCBvbiBbUG9pbnRlcl08W05hdGl2ZUZ1bmN0aW9uXT4uIERvZXMgbm90IGFjY2VwdCBkeW5hbWljCiAgLy8vIGludm9jYXRpb25zIC0tIHdoZXJlIHRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBpcyBbZHluYW1pY10uCiAgZXh0ZXJuYWwgUiBhc0Z1bmN0aW9uPEBEYXJ0UmVwcmVzZW50YXRpb25PZigiVCIpIFIgZXh0ZW5kcyBGdW5jdGlvbj4oKTsKCiAgLy8vIEZyZWUgbWVtb3J5IG9uIHRoZSBDIGhlYXAgcG9pbnRlZCB0byBieSB0aGlzIHBvaW50ZXIgd2l0aCBmcmVlKCkuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGlzIHplcm9zIG91dCB0aGUgYWRkcmVzcy4KICBleHRlcm5hbCB2b2lkIGZyZWUoKTsKCiAgLy8vIEVxdWFsaXR5IGZvciBQb2ludGVycyBvbmx5IGRlcGVuZHMgb24gdGhlaXIgYWRkcmVzcy4KICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGFkZHJlc3MgPT0gb3RoZXIuYWRkcmVzczsKICB9CgogIC8vLyBUaGUgaGFzaCBjb2RlIGZvciBhIFBvaW50ZXIgb25seSBkZXBlbmRzIG9uIGl0cyBhZGRyZXNzLgogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIGFkZHJlc3MuaGFzaENvZGU7CiAgfQp9CmoATk47ARMNEgEZGR0UASsELy0BMzYBRxo5UDYGLTUBJTEBTyUGTlIGTlEUBk1NQgZPEU9IAS0GTk4/QAEsBk5PLjMBJ0AcATwsASgkMzMBJzQBSBgGUUJKAUgGLBgBOxwlJQQBPxUdBAIBCGRhcnQ6ZmZpLm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvZmZpX3BhdGNoLmRhcnSJHC8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgImRhcnQ6X2ludGVybmFsIiBzaG93IHBhdGNoOwoKQHBhdGNoCmludCBzaXplT2Y8VCBleHRlbmRzIE5hdGl2ZVR5cGU+KCkgbmF0aXZlICJGZmlfc2l6ZU9mIjsKClBvaW50ZXI8VD4gX2FsbG9jYXRlPFQgZXh0ZW5kcyBOYXRpdmVUeXBlPihpbnQgY291bnQpIG5hdGl2ZSAiRmZpX2FsbG9jYXRlIjsKClBvaW50ZXI8VD4gX2Zyb21BZGRyZXNzPFQgZXh0ZW5kcyBOYXRpdmVUeXBlPihpbnQgcHRyKSBuYXRpdmUgIkZmaV9mcm9tQWRkcmVzcyI7CgovLyBUaGUgcmVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIChmb3IgaW50ZXJmYWNlIGNhbGxzKSBsaXZlcyBpbgovLyBCdWlsZEZmaUFzRnVuY3Rpb25DYWxsIGluIHRoZSBLZXJuZWwgZnJvbnRlbmQuIE5vIGNhbGxzIGNhbiBhY3R1YWxseSByZWFjaAovLyB0aGlzIGZ1bmN0aW9uLgpEUyBfYXNGdW5jdGlvbkludGVybmFsPERTIGV4dGVuZHMgRnVuY3Rpb24sIE5TIGV4dGVuZHMgRnVuY3Rpb24+KAogICAgUG9pbnRlcjxOYXRpdmVGdW5jdGlvbjxOUz4+IHB0cikgbmF0aXZlICJGZmlfYXNGdW5jdGlvbkludGVybmFsIjsKCkBwYXRjaApAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIFBvaW50ZXI8VCBleHRlbmRzIE5hdGl2ZVR5cGU+IHsKICBAcGF0Y2gKICBmYWN0b3J5IFBvaW50ZXIuYWxsb2NhdGUoe2ludCBjb3VudDogMX0pID0+IF9hbGxvY2F0ZTxUPihjb3VudCk7CgogIEBwYXRjaAogIGZhY3RvcnkgUG9pbnRlci5mcm9tQWRkcmVzcyhpbnQgcHRyKSA9PiBfZnJvbUFkZHJlc3MocHRyKTsKCiAgQHBhdGNoCiAgc3RhdGljIFBvaW50ZXI8TmF0aXZlRnVuY3Rpb248VD4+IGZyb21GdW5jdGlvbjxUIGV4dGVuZHMgRnVuY3Rpb24+KAogICAgICBARGFydFJlcHJlc2VudGF0aW9uT2YoIlQiKSBGdW5jdGlvbiBmLAogICAgICBPYmplY3QgZXhjZXB0aW9uYWxSZXR1cm4pIG5hdGl2ZSAiRmZpX2Zyb21GdW5jdGlvbiI7CgogIC8vIFRPRE8oc2ppbmRlbCk6IFdoZW4gTk5CRCBpcyBhdmFpbGFibGUsIHdlIHNob3VsZCBjaGFuZ2UgYHZhbHVlYCB0byBiZQogIC8vIG5vbi1udWxsLgogIEBwYXRjaAogIHZvaWQgc3RvcmUoT2JqZWN0IHZhbHVlKSBuYXRpdmUgIkZmaV9zdG9yZSI7CgogIEBwYXRjaAogIFIgbG9hZDxSPigpIG5hdGl2ZSAiRmZpX2xvYWQiOwoKICBAcGF0Y2gKICBpbnQgZ2V0IGFkZHJlc3MgbmF0aXZlICJGZmlfYWRkcmVzcyI7CgogIC8vIE5vdGUgdGhpcyBjb3VsZCBhbHNvIGJlIGltcGxtZW50ZWQgd2l0aG91dCBhbiBleHRyYSBuYXRpdmUgYXMgb2Zmc2V0QnkKICAvLyAoZWxlbWVudFNpemUoKSppbmRleCkuIFRoaXMgd291bGQgYmUgMiBuYXRpdmUgY2FsbHMgcmF0aGVyIHRoYW4gb25lLiBXaGF0CiAgLy8gd291bGQgYmUgYmV0dGVyPwogIEBwYXRjaAogIFBvaW50ZXI8VD4gZWxlbWVudEF0KGludCBpbmRleCkgbmF0aXZlICJGZmlfZWxlbWVudEF0IjsKCiAgLy8gTm90ZSB0aGlzIGNvdWxkIGFsc28gYmUgaW1wbG1lbnRlZCB3aXRob3V0IGFuIGV4dHJhICBuYXRpdmUgYXMKICAvLyBmcm9tQWRkcmVzcyhhZGRyZXNzKS4gVGhpcyB3b3VsZCBiZSAyIG5hdGl2ZSBjYWxscyByYXRoZXIgdGhhbiBvbmUuCiAgLy8gV2hhdCB3b3VsZCBiZSBiZXR0ZXI/CiAgQHBhdGNoCiAgUG9pbnRlcjxUPiBvZmZzZXRCeShpbnQgb2Zmc2V0SW5CeXRlcykgbmF0aXZlICJGZmlfb2Zmc2V0QnkiOwoKICAvLyBOb3RlIHRoaXMgY291bGQgYWxzbyBiZSBpbXBsZW1lbnRlZCB3aXRob3V0IGFuIGV4dHJhIG5hdGl2ZSBhcwogIC8vIGZyb21BZGRyZXNzKGFkZHJlc3MpLiBUaGlzIHdvdWxkIGJlIDIgbmF0aXZlIGNhbGxzIHJhdGhlciB0aGFuIG9uZS4KICAvLyBXaGF0IHdvdWxkIGJlIGJldHRlcj8KICBAcGF0Y2gKICBQb2ludGVyPFU+IGNhc3Q8VSBleHRlbmRzIE5hdGl2ZVR5cGU+KCkgbmF0aXZlICJGZmlfY2FzdCI7CgogIEBwYXRjaAogIFIgYXNGdW5jdGlvbjxSIGV4dGVuZHMgRnVuY3Rpb24+KCkgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigiUG9pbnRlci5hc0Z1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgZHluYW1pY2FsbHkuIik7CiAgfQoKICBAcGF0Y2gKICB2b2lkIGZyZWUoKSBuYXRpdmUgIkZmaV9mcmVlIjsKfQpIAE5OPAEkAQc4AU0BUQFLThJCRgEHGiYJQwEJPQEJRi07AUsPCS8BCSEBCSgBTE8WCToBREkbCUABREkbCT0BCSdQBAEJIQIBHWRhcnQ6ZmZpLXBhdGNoL2ZmaV9wYXRjaC5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9mZmkvbmF0aXZlX3R5cGUuZGFydI7BLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5mZmk7CgovLy8gW05hdGl2ZVR5cGVdJ3Mgc3VidHlwZXMgcmVwcmVzZW50IGEgbmF0aXZlIHR5cGUgaW4gQy4KLy8vCi8vLyBbTmF0aXZlVHlwZV0ncyBzdWJ0eXBlcyBhcmUgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmUKLy8vIHB1cmVseSBhcyBtYXJrZXJzIGluIHR5cGUgc2lnbmF0dXJlcy4KY2xhc3MgTmF0aXZlVHlwZSB7CiAgY29uc3QgTmF0aXZlVHlwZSgpOwp9CgovLy8gW19OYXRpdmVJbnRlZ2VyXSdzIHN1YnR5cGVzIHJlcHJlc2VudCBhIG5hdGl2ZSBpbnRlZ2VyIGluIEMuCi8vLwovLy8gW19OYXRpdmVJbnRlZ2VyXSdzIHN1YnR5cGVzIGFyZSBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZQovLy8gcHVyZWx5IGFzIG1hcmtlcnMgaW4gdHlwZSBzaWduYXR1cmVzLgpjbGFzcyBfTmF0aXZlSW50ZWdlciBleHRlbmRzIE5hdGl2ZVR5cGUgewogIGNvbnN0IF9OYXRpdmVJbnRlZ2VyKCk7Cn0KCi8vLyBbX05hdGl2ZURvdWJsZV0ncyBzdWJ0eXBlcyByZXByZXNlbnQgYSBuYXRpdmUgZmxvYXQgb3IgZG91YmxlIGluIEMuCi8vLwovLy8gW19OYXRpdmVEb3VibGVdJ3Mgc3VidHlwZXMgYXJlIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlCi8vLyBwdXJlbHkgYXMgbWFya2VycyBpbiB0eXBlIHNpZ25hdHVyZXMuCmNsYXNzIF9OYXRpdmVEb3VibGUgZXh0ZW5kcyBOYXRpdmVUeXBlIHsKICBjb25zdCBfTmF0aXZlRG91YmxlKCk7Cn0KCi8vLyBSZXByZXNlbnRzIGEgbmF0aXZlIHNpZ25lZCA4IGJpdCBpbnRlZ2VyIGluIEMuCi8vLwovLy8gW0ludDhdIGlzIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlcyBwdXJlbHkgYXMgbWFya2VyIGluCi8vLyB0eXBlIHNpZ25hdHVyZXMuCmNsYXNzIEludDggZXh0ZW5kcyBfTmF0aXZlSW50ZWdlciB7CiAgY29uc3QgSW50OCgpOwp9CgovLy8gUmVwcmVzZW50cyBhIG5hdGl2ZSBzaWduZWQgMTYgYml0IGludGVnZXIgaW4gQy4KLy8vCi8vLyBbSW50MTZdIGlzIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlcyBwdXJlbHkgYXMgbWFya2VyIGluCi8vLyB0eXBlIHNpZ25hdHVyZXMuCmNsYXNzIEludDE2IGV4dGVuZHMgX05hdGl2ZUludGVnZXIgewogIGNvbnN0IEludDE2KCk7Cn0KCi8vLyBSZXByZXNlbnRzIGEgbmF0aXZlIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBpbiBDLgovLy8KLy8vIFtJbnQzMl0gaXMgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmVzIHB1cmVseSBhcyBtYXJrZXIgaW4KLy8vIHR5cGUgc2lnbmF0dXJlcy4KY2xhc3MgSW50MzIgZXh0ZW5kcyBfTmF0aXZlSW50ZWdlciB7CiAgY29uc3QgSW50MzIoKTsKfQoKLy8vIFJlcHJlc2VudHMgYSBuYXRpdmUgc2lnbmVkIDY0IGJpdCBpbnRlZ2VyIGluIEMuCi8vLwovLy8gW0ludDY0XSBpcyBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZXMgcHVyZWx5IGFzIG1hcmtlciBpbgovLy8gdHlwZSBzaWduYXR1cmVzLgpjbGFzcyBJbnQ2NCBleHRlbmRzIF9OYXRpdmVJbnRlZ2VyIHsKICBjb25zdCBJbnQ2NCgpOwp9CgovLy8gUmVwcmVzZW50cyBhIG5hdGl2ZSB1bnNpZ25lZCA4IGJpdCBpbnRlZ2VyIGluIEMuCi8vLwovLy8gW1VpbnQ4XSBpcyBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZXMgcHVyZWx5IGFzIG1hcmtlciBpbgovLy8gdHlwZSBzaWduYXR1cmVzLgpjbGFzcyBVaW50OCBleHRlbmRzIF9OYXRpdmVJbnRlZ2VyIHsKICBjb25zdCBVaW50OCgpOwp9CgovLy8gUmVwcmVzZW50cyBhIG5hdGl2ZSB1bnNpZ25lZCAxNiBiaXQgaW50ZWdlciBpbiBDLgovLy8KLy8vIFtVaW50MTZdIGlzIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlcyBwdXJlbHkgYXMgbWFya2VyCi8vLyBpbiB0eXBlIHNpZ25hdHVyZXMuCmNsYXNzIFVpbnQxNiBleHRlbmRzIF9OYXRpdmVJbnRlZ2VyIHsKICBjb25zdCBVaW50MTYoKTsKfQoKLy8vIFJlcHJlc2VudHMgYSBuYXRpdmUgdW5zaWduZWQgMzIgYml0IGludGVnZXIgaW4gQy4KLy8vCi8vLyBbVWludDMyXSBpcyBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZXMgcHVyZWx5IGFzIG1hcmtlcgovLy8gaW4gdHlwZSBzaWduYXR1cmVzLgpjbGFzcyBVaW50MzIgZXh0ZW5kcyBfTmF0aXZlSW50ZWdlciB7CiAgY29uc3QgVWludDMyKCk7Cn0KCi8vLyBSZXByZXNlbnRzIGEgbmF0aXZlIHVuc2lnbmVkIDY0IGJpdCBpbnRlZ2VyIGluIEMuCi8vLwovLy8gW1VpbnQ2NF0gaXMgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmVzIHB1cmVseSBhcyBtYXJrZXIKLy8vIGluIHR5cGUgc2lnbmF0dXJlcy4KY2xhc3MgVWludDY0IGV4dGVuZHMgX05hdGl2ZUludGVnZXIgewogIGNvbnN0IFVpbnQ2NCgpOwp9CgovLy8gUmVwcmVzZW50cyBhIG5hdGl2ZSBwb2ludGVyLXNpemVkIGludGVnZXIgaW4gQy4KLy8vCi8vLyBbSW50UHRyXSBpcyBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZXMgcHVyZWx5IGFzIG1hcmtlcgovLy8gaW4gdHlwZSBzaWduYXR1cmVzLgpjbGFzcyBJbnRQdHIgZXh0ZW5kcyBfTmF0aXZlSW50ZWdlciB7CiAgY29uc3QgSW50UHRyKCk7Cn0KCi8vLyBSZXByZXNlbnRzIGEgbmF0aXZlIDMyIGJpdCBmbG9hdCBpbiBDLgovLy8KLy8vIFtGbG9hdF0gaXMgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmVzIHB1cmVseSBhcyBtYXJrZXIKLy8vIGluIHR5cGUgc2lnbmF0dXJlcy4KY2xhc3MgRmxvYXQgZXh0ZW5kcyBfTmF0aXZlRG91YmxlIHsKICBjb25zdCBGbG9hdCgpOwp9CgovLy8gUmVwcmVzZW50cyBhIG5hdGl2ZSA2NCBiaXQgZG91YmxlIGluIEMuCi8vLwovLy8gW0RvdWJsZV0gaXMgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmVzIHB1cmVseSBhcyBtYXJrZXIKLy8vIGluIHR5cGUgc2lnbmF0dXJlcy4KY2xhc3MgRG91YmxlIGV4dGVuZHMgX05hdGl2ZURvdWJsZSB7CiAgY29uc3QgRG91YmxlKCk7Cn0KCi8vLyBSZXByZXNlbnRzIGEgdm9pZCB0eXBlIGluIEMuCi8vLwovLy8gW1ZvaWRdIGlzIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlcyBwdXJlbHkgYXMgbWFya2VyIGluCi8vLyB0eXBlIHNpZ25hdHVyZXMuCkB1bnNpemVkCmNsYXNzIFZvaWQgZXh0ZW5kcyBOYXRpdmVUeXBlIHsKICBjb25zdCBWb2lkKCk7Cn0KCi8vLyBSZXByZXNlbnRzIGEgZnVuY3Rpb24gdHlwZSBpbiBDLgovLy8KLy8vIFtOYXRpdmVGdW5jdGlvbl0gaXMgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmVzIHB1cmVseSBhcwovLy8gbWFya2VyIGluIHR5cGUgc2lnbmF0dXJlcy4KQHVuc2l6ZWQKY2xhc3MgTmF0aXZlRnVuY3Rpb248VCBleHRlbmRzIEZ1bmN0aW9uPiBleHRlbmRzIE5hdGl2ZVR5cGUge30KgIcATk48ARIBOgRNKhMWAgFBBFEqKhoCAUgEUCopGQIBMwRQFSQQAgE0BFEVJRECATQEURUlEQIBNARRFSURAgE1BFEVJRECATYETxgmEgIBNgRPGCYSAgE2BE8YJhICATQETxgmEgIBKwROGCQRAgEsBE8YJRICASEEUBUJIBACASUEUB8JPwEZZGFydDpmZmkvbmF0aXZlX3R5cGUuZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvZmZpL2Fubm90YXRpb25zLmRhcnSF3S8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuZmZpOwoKY2xhc3MgRGFydFJlcHJlc2VudGF0aW9uT2YgewogIC8vLyBSZXByZXNlbnRzIHRoZSBEYXJ0IHR5cGUgY29ycmVzcG9uZGluZyB0byBhIFtOYXRpdmVUeXBlXS4KICAvLy8KICAvLy8gW0ludDhdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtpbnRdCiAgLy8vIFtJbnQxNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbaW50XQogIC8vLyBbSW50MzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gW2ludF0KICAvLy8gW0ludDY0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtpbnRdCiAgLy8vIFtVaW50OF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbaW50XQogIC8vLyBbVWludDE2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gW2ludF0KICAvLy8gW1VpbnQzMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtpbnRdCiAgLy8vIFtVaW50NjRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbaW50XQogIC8vLyBbSW50UHRyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gW2ludF0KICAvLy8gW0RvdWJsZV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtkb3VibGVdCiAgLy8vIFtGbG9hdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbZG91YmxlXQogIC8vLyBbUG9pbnRlcl08VD4gICAgICAgICAgICAgICAgICAgICAgICAgLT4gW1BvaW50ZXJdPFQ+CiAgLy8vIFtOYXRpdmVGdW5jdGlvbl08VDEgRnVuY3Rpb24oVDIsIFQzKSAtPiBTMSBGdW5jdGlvbihTMiwgUzMpCiAgLy8vICAgIHdoZXJlIERhcnRSZXByZXNlbnRhdGlvbk9mKFRuKSAtPiBTbgogIC8vLyBUIGV4dGVuZHMgU3RydWN0PFQ+ICAgICAgICAgICAgICAgICAgLT4gVAogIGNvbnN0IERhcnRSZXByZXNlbnRhdGlvbk9mKFN0cmluZyBuYXRpdmVUeXBlKTsKfQoKY2xhc3MgVW5zaXplZCB7CiAgY29uc3QgVW5zaXplZCgpOwp9CgovLy8gVGhpcyBbTmF0aXZlVHlwZV0gZG9lcyBub3QgaGF2ZSBwcmVkZWZpbmVkIHNpemUuCi8vLwovLy8gVW5zaXplZCBOYXRpdmVUeXBlcyBkbyBub3Qgc3VwcG9ydCBbc2l6ZU9mXSBiZWNhdXNlIHRoZWlyIHNpemUgaXMgdW5rbm93bi4KLy8vIENvbnNlcXVlbnRseSwgW2FsbG9jYXRlXSwgW1BvaW50ZXIubG9hZF0sIFtQb2ludGVyLnN0b3JlXSwgYW5kCi8vLyBbUG9pbnRlci5lbGVtZW50QXRdIGFyZSBub3QgYXZhaWxhYmxlLgpjb25zdCB1bnNpemVkID0gY29uc3QgVW5zaXplZCgpOwonAE5OPAESAR1ABjQ0NDQ0NDQ0NDc3O0IuMDECARATAgE1BE9DKyEBGWRhcnQ6ZmZpL2Fubm90YXRpb25zLmRhcnQ0b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2ZmaS9keW5hbWljX2xpYnJhcnkuZGFydIUHLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5mZmk7CgovLy8gUmVwcmVzZW50cyBhIGR5bmFtaWNhbGx5IGxvYWRlZCBDIGxpYnJhcnkuCmNsYXNzIER5bmFtaWNMaWJyYXJ5IHsKICAvLy8gTG9hZHMgYSBkeW5hbWljIGxpYnJhcnkgZmlsZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBkbG9wZW4uCiAgLy8vCiAgLy8vIFRocm93cyBhbiBbQXJndW1lbnRFcnJvcl0gaWYgbG9hZGluZyB0aGUgZHluYW1pYyBsaWJyYXJ5IGZhaWxzLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgaXQgbG9hZHMgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgbGlicmFyeSBsYXppbHkgKFJUTERfTEFaWSkuCiAgZXh0ZXJuYWwgZmFjdG9yeSBEeW5hbWljTGlicmFyeS5vcGVuKFN0cmluZyBuYW1lKTsKCiAgLy8vIExvb2tzIHVwIGEgc3ltYm9sIGluIHRoZSBbRHluYW1pY0xpYnJhcnldIGFuZCByZXR1cm5zIGl0cyBhZGRyZXNzIGluCiAgLy8vIG1lbW9yeS4gRXF1aXZhbGVudCBvZiBkbHN5bS4KICAvLy8KICAvLy8gVGhyb3dzIGFuIFtBcmd1bWVudEVycm9yXSBpZiBpdCBmYWlscyB0byBsb29rdXAgdGhlIHN5bWJvbC4KICBleHRlcm5hbCBQb2ludGVyPFQ+IGxvb2t1cDxUIGV4dGVuZHMgTmF0aXZlVHlwZT4oU3RyaW5nIHN5bWJvbE5hbWUpOwoKICAvLy8gSGVscGVyIHRoYXQgY29tYmluZXMgbG9va3VwIGFuZCBjYXN0IHRvIGEgRGFydCBmdW5jdGlvbi4KICBleHRlcm5hbCBGIGxvb2t1cEZ1bmN0aW9uPFQgZXh0ZW5kcyBGdW5jdGlvbiwgRiBleHRlbmRzIEZ1bmN0aW9uPigKICAgICAgU3RyaW5nIHN5bWJvbE5hbWUpOwoKICAvLy8gRHluYW1pYyBsaWJyYXJpZXMgYXJlIGVxdWFsIGlmIHRoZXkgbG9hZCB0aGUgc2FtZSBsaWJyYXJ5LgogIGV4dGVybmFsIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpOwoKICAvLy8gVGhlIGhhc2ggY29kZSBmb3IgYSBEeW5hbWljTGlicmFyeSBvbmx5IGRlcGVuZHMgb24gdGhlIGxvYWRlZCBsaWJyYXJ5CiAgZXh0ZXJuYWwgaW50IGdldCBoYXNoQ29kZTsKCiAgLy8vIFRoZSBoYW5kbGUgdG8gdGhlIGR5bmFtaWMgbGlicmFyeS4KICBleHRlcm5hbCBQb2ludGVyPFZvaWQ+IGdldCBoYW5kbGU7Cn0KJABOTjwBEgEvF0YGRgZKNQFLIwZCRwE/RRoBQSQBTB0BKSUCAR1kYXJ0OmZmaS9keW5hbWljX2xpYnJhcnkuZGFydD5vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2ZmaV9keW5hbWljX2xpYnJhcnlfcGF0Y2guZGFydIU/Ly8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgcGF0Y2g7CgpEeW5hbWljTGlicmFyeSBfb3BlbihTdHJpbmcgbmFtZSkgbmF0aXZlICJGZmlfZGxfb3BlbiI7CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBEeW5hbWljTGlicmFyeSB7CiAgQHBhdGNoCiAgZmFjdG9yeSBEeW5hbWljTGlicmFyeS5vcGVuKFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gX29wZW4obmFtZSk7CiAgfQoKICBAcGF0Y2gKICBQb2ludGVyPFQ+IGxvb2t1cDxUIGV4dGVuZHMgTmF0aXZlVHlwZT4oU3RyaW5nIHN5bWJvbE5hbWUpCiAgICAgIG5hdGl2ZSAiRmZpX2RsX2xvb2t1cCI7CgogIC8vIFRoZSByZWFsIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gbGl2ZXMgaW4gRmZpVXNlU2l0ZXNUcmFuc2Zvcm1lcgogIC8vIGZvciBpbnRlcmZhY2UgY2FsbHMuIE9ubHkgZHluYW1pYyBjYWxscyAod2hpY2ggYXJlIGlsbGVnYWwpIHJlYWNoIHRoaXMKICAvLyBpbXBsZW1lbnRhdGlvbi4KICBAcGF0Y2gKICBGIGxvb2t1cEZ1bmN0aW9uPFQgZXh0ZW5kcyBGdW5jdGlvbiwgRiBleHRlbmRzIEZ1bmN0aW9uPihTdHJpbmcgc3ltYm9sTmFtZSkgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiRHluYW1pYyBpbnZvY2F0aW9uIG9mIGxvb2t1cEZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIik7CiAgfQoKICAvLyBUT0RPKGRhY29oYXJrZXMpOiBFeHBvc2UgdGhpcyB0byB1c2Vycywgb3IgZXh0ZW5kIFBvaW50ZXI/CiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzM1ODgxCiAgaW50IGdldEhhbmRsZSgpIG5hdGl2ZSAiRmZpX2RsX2dldEhhbmRsZSI7CgogIEBwYXRjaAogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gZ2V0SGFuZGxlKCkgPT0gb3RoZXIuZ2V0SGFuZGxlKCk7CiAgfQoKICBAcGF0Y2gKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBnZXRIYW5kbGUoKS5oYXNoQ29kZTsKICB9CgogIEBwYXRjaAogIFBvaW50ZXI8Vm9pZD4gZ2V0IGhhbmRsZSA9PiBQb2ludGVyLmZyb21BZGRyZXNzKGdldEhhbmRsZSgpKTsKfQoxAE5OPAEkATgBBxoXCS0YBAEJPR4BTkwVCVAcQwQBQDMtAQkcJS0EAQkVIQQBCUACAS1kYXJ0OmZmaS1wYXRjaC9mZmlfZHluYW1pY19saWJyYXJ5X3BhdGNoLmRhcnQrb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2ZmaS9zdHJ1Y3QuZGFydIQ0Ly8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5mZmk7CgovLy8gVGhpcyBjbGFzcyBpcyBleHRlbmRlZCB0byBkZWZpbmUgc3RydWN0cy4KLy8vCi8vLyBGaWVsZHMgaW4gYSBzdHJ1Y3QsIGFubm90YXRlZCB3aXRoIGEgc3VidHlwZSBvZiBbTmF0aXZlVHlwZV0sIGFyZQovLy8gYXV0b21hdGljYWxseSB0cmFuc2Zvcm1lZCBpbnRvIHdyYXBwZXJzIHRvIGFjY2VzcyB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKLy8vIGluIG5hdGl2ZSBtZW1vcnkuCi8vLwovLy8gQWxsIGZpZWxkcyBpbiBhIHN0cnVjdCBtdXN0IGVpdGhlciBoYXZlIGEgdHlwZSB3aGljaCBleHRlbmRzIFtOYXRpdmVUeXBlXSBvcgovLy8gZWxzZSBoYXZlIGFuIGFubm90YXRpb24gaW5kaWNhdGluZyB0aGUgY29ycmVzcG9uZGluZyBuYXRpdmUgdHlwZSAoZS5nLgovLy8gIkBJbnQzMigpIiBmb3IgImludCIpLgovLy8KLy8vIEluc3RhbmNlcyBvZiBhIHN1YmNsYXNzIG9mIFtTdHJ1Y3RdIGhhdmUgcmVmZXJlbmNlIHNlbWFudGljcyBhbmQgYXJlIGJhY2tlZAovLy8gYnkgbmF0aXZlIG1lbW9yeS4gVGhlIG1heSBhbGxvY2F0ZWQgdmlhIFtQb2ludGVyLmFsbG9jYXRlXSBvciBsb2FkZWQgZnJvbSBhCi8vLyBbUG9pbnRlcl0sIGJ1dCBub3QgYnkgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yLgphYnN0cmFjdCBjbGFzcyBTdHJ1Y3Q8UyBleHRlbmRzIE5hdGl2ZVR5cGU+IGV4dGVuZHMgTmF0aXZlVHlwZSB7CiAgLy8vIFJldHVybnMgdGhlIGFkZHJlc3MgYmFja2luZyB0aGUgcmVmZXJlbmNlLgogIGZpbmFsIFBvaW50ZXI8Uz4gYWRkcmVzc09mOwoKICBTdHJ1Y3QoKSA6IGFkZHJlc3NPZiA9IG51bGw7CiAgU3RydWN0LmZyb21Qb2ludGVyKHRoaXMuYWRkcmVzc09mKTsKfQocAE5OPAESAS4ERk8WBFFLGwRQUDRBMR4BHyYCARRkYXJ0OmZmaS9zdHJ1Y3QuZGFydDJvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW50ZXJuYWwvaW50ZXJuYWwuZGFydLWOLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydC5faW50ZXJuYWw7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnCiAgICBzaG93CiAgICAgICAgRnV0dXJlLAogICAgICAgIFN0cmVhbSwKICAgICAgICBTdHJlYW1TdWJzY3JpcHRpb24sCiAgICAgICAgU3RyZWFtVHJhbnNmb3JtZXIsCiAgICAgICAgU3RyZWFtVHJhbnNmb3JtZXJCYXNlLAogICAgICAgIFpvbmU7CmltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IENvbnZlcnRlcjsKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgU3ltYm9sOwppbXBvcnQgJ2RhcnQ6Y29yZScgYXMgY29yZTsKaW1wb3J0ICdkYXJ0Om1hdGgnIHNob3cgUmFuZG9tOwoKcGFydCAnYXN5bmNfY2FzdC5kYXJ0JzsKcGFydCAnY2FzdC5kYXJ0JzsKcGFydCAnaXRlcmFibGUuZGFydCc7CnBhcnQgJ2xpc3QuZGFydCc7CnBhcnQgJ3ByaW50LmRhcnQnOwpwYXJ0ICdzb3J0LmRhcnQnOwpwYXJ0ICdzeW1ib2wuZGFydCc7CnBhcnQgJ2xpbmtlZF9saXN0LmRhcnQnOwoKLy8gUG93ZXJzIG9mIDEwIHVwIHRvIDEwXjIyIGFyZSByZXByZXNlbnRhYmxlIGFzIGRvdWJsZXMuCi8vIFBvd2VycyBvZiAxMCBhYm92ZSB0aGF0IGFyZSBvbmx5IGFwcHJveGltYXRlIGR1ZSB0byBsYWNrIG9mIHByZWNpc3Npb24uCi8vIFVzZWQgYnkgZG91YmxlLXBhcnNpbmcuCmNvbnN0IFBPV0VSU19PRl9URU4gPSBjb25zdCBbCiAgMS4wLCAvLyAwCiAgMTAuMCwKICAxMDAuMCwKICAxMDAwLjAsCiAgMTAwMDAuMCwKICAxMDAwMDAuMCwgLy8gNQogIDEwMDAwMDAuMCwKICAxMDAwMDAwMC4wLAogIDEwMDAwMDAwMC4wLAogIDEwMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwMC4wLCAvLyAxMAogIDEwMDAwMDAwMDAwMC4wLAogIDEwMDAwMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwMDAwMC4wLAogIDEwMDAwMDAwMDAwMDAwMC4wLAogIDEwMDAwMDAwMDAwMDAwMDAuMCwgLy8gMTUKICAxMDAwMDAwMDAwMDAwMDAwMC4wLAogIDEwMDAwMDAwMDAwMDAwMDAwMC4wLAogIDEwMDAwMDAwMDAwMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwMDAwMDAwMDAwMC4wLAogIDEwMDAwMDAwMDAwMDAwMDAwMDAwMC4wLCAvLyAyMAogIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4wLApdOwoKLyoqCiAqIEFuIFtJdGVyYWJsZV0gb2YgdGhlIFVURi0xNiBjb2RlIHVuaXRzIG9mIGEgW1N0cmluZ10gaW4gaW5kZXggb3JkZXIuCiAqLwpjbGFzcyBDb2RlVW5pdHMgZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxpbnQ+IHsKICAvKiogVGhlIHN0cmluZyB0aGF0IHRoaXMgaXMgdGhlIGNvZGUgdW5pdHMgb2YuICovCiAgZmluYWwgU3RyaW5nIF9zdHJpbmc7CgogIENvZGVVbml0cyh0aGlzLl9zdHJpbmcpOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfc3RyaW5nLmxlbmd0aDsKICBpbnQgb3BlcmF0b3IgW10oaW50IGkpID0+IF9zdHJpbmcuY29kZVVuaXRBdChpKTsKCiAgc3RhdGljIFN0cmluZyBzdHJpbmdPZihDb2RlVW5pdHMgdSkgPT4gdS5fc3RyaW5nOwp9CgovLy8gTWFya3MgYSBmdW5jdGlvbiBvciBsaWJyYXJ5IGFzIGhhdmluZyBhbiBleHRlcm5hbCBpbXBsZW1lbnRhdGlvbiAoIm5hdGl2ZSIKLy8vIGluIHRoZSBEYXJ0IFZNKS4KLy8vCi8vLyBPbiBhIGZ1bmN0aW9uLCB0aGlzIHByb3ZpZGVzIGEgYmFja2VuZC1zcGVjaWZpYyBTdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0bwovLy8gaWRlbnRpZnkgdGhlIGZ1bmN0aW9uJ3MgaW1wbGVtZW50YXRpb24uCi8vLwovLy8gT24gYSBsaWJyYXJ5LCBpdCBwcm92aWRlcyBhIFVyaSB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvY2F0ZSB0aGUgbmF0aXZlCi8vLyBsaWJyYXJ5J3MgaW1wbGVtZW50YXRpb24uCmNsYXNzIEV4dGVybmFsTmFtZSB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgY29uc3QgRXh0ZXJuYWxOYW1lKHRoaXMubmFtZSk7Cn0KCi8vIFNoYXJlZCBoZXgtcGFyc2luZyB1dGlsaXRpZXMuCgovLy8gUGFyc2VzIGEgc2luZ2xlIGhleC1kaWdpdCBhcyBjb2RlIHVuaXQuCi8vLwovLy8gUmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IGEgdmFsaWQgaGV4LWRpZ2l0LgppbnQgaGV4RGlnaXRWYWx1ZShpbnQgY2hhcikgewogIGFzc2VydChjaGFyID49IDAgJiYgY2hhciA8PSAweEZGRkYpOwogIGNvbnN0IGludCBkaWdpdDAgPSAweDMwOwogIGNvbnN0IGludCBhID0gMHg2MTsKICBjb25zdCBpbnQgZiA9IDB4NjY7CiAgaW50IGRpZ2l0ID0gY2hhciBeIGRpZ2l0MDsKICBpZiAoZGlnaXQgPD0gOSkgcmV0dXJuIGRpZ2l0OwogIGludCBsZXR0ZXIgPSAoY2hhciB8IDB4MjApOwogIGlmIChhIDw9IGxldHRlciAmJiBsZXR0ZXIgPD0gZikgcmV0dXJuIGxldHRlciAtIChhIC0gMTApOwogIHJldHVybiAtMTsKfQoKLy8vIFBhcnNlcyB0d28gaGV4IGRpZ2l0cyBpbiBhIHN0cmluZy4KLy8vCi8vLyBSZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgaWYgZWl0aGVyIGRpZ2l0IGlzbid0IHZhbGlkLgppbnQgcGFyc2VIZXhCeXRlKFN0cmluZyBzb3VyY2UsIGludCBpbmRleCkgewogIGFzc2VydChpbmRleCArIDIgPD0gc291cmNlLmxlbmd0aCk7CiAgaW50IGRpZ2l0MSA9IGhleERpZ2l0VmFsdWUoc291cmNlLmNvZGVVbml0QXQoaW5kZXgpKTsKICBpbnQgZGlnaXQyID0gaGV4RGlnaXRWYWx1ZShzb3VyY2UuY29kZVVuaXRBdChpbmRleCArIDEpKTsKICByZXR1cm4gZGlnaXQxICogMTYgKyBkaWdpdDIgLSAoZGlnaXQyICYgMjU2KTsKfQoKLy8vIEdpdmVuIGFuIFtpbnN0YW5jZV0gb2Ygc29tZSBnZW5lcmljIHR5cGUgW1RdLCBhbmQgW2V4dHJhY3RdLCBhIGZpcnN0LWNsYXNzCi8vLyBnZW5lcmljIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIHNhbWUgbnVtYmVyIG9mIHR5cGUgcGFyYW1ldGVycyBhcyBbVF0sCi8vLyBpbnZva2VzIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHR5cGUgYXJndW1lbnRzIHRoYXQgd2VyZSBwYXNzZWQgdG8gVAovLy8gd2hlbiBbaW5zdGFuY2VdIHdhcyBjb25zdHJ1Y3RlZC4KLy8vCi8vLyBFeGFtcGxlOgovLy8KLy8vIGBgYGRhcnQKLy8vIGNsYXNzIFR3bzxBLCBCPiB7fQovLy8KLy8vIHByaW50KGV4dHJhY3RUeXBlQXJndW1lbnRzPExpc3Q+KDxpbnQ+W10sIDxUPigpID0+IG5ldyBTZXQ8VD4oKSkpOwovLy8gLy8gUHJpbnRzOiBJbnN0YW5jZSBvZiAnU2V0PGludD4nLgovLy8KLy8vIHByaW50KGV4dHJhY3RUeXBlQXJndW1lbnRzPE1hcD4oPFN0cmluZywgYm9vbD57fSwKLy8vICAgICA8VCwgUz4oKSA9PiBuZXcgVHdvPFQsIFM+KSk7Ci8vLyAvLyBQcmludHM6IEluc3RhbmNlIG9mICdUd288U3RyaW5nLCBib29sPicuCi8vLyBgYGAKLy8vCi8vLyBUaGUgdHlwZSBhcmd1bWVudCBUIGlzIGltcG9ydGFudCB0byBjaG9vc2Ugd2hpY2ggc3BlY2lmaWMgdHlwZSBwYXJhbWV0ZXIKLy8vIGxpc3QgaW4gW2luc3RhbmNlXSdzIHR5cGUgaGllcmFyY2h5IGlzIGJlaW5nIGV4dHJhY3RlZC4gQ29uc2lkZXI6Ci8vLwovLy8gYGBgZGFydAovLy8gY2xhc3MgQTxUPiB7fQovLy8gY2xhc3MgQjxUPiB7fQovLy8KLy8vIGNsYXNzIEMgaW1wbGVtZW50cyBBPGludD4sIEI8U3RyaW5nPiB7fQovLy8KLy8vIG1haW4oKSB7Ci8vLyAgIHZhciBjID0gbmV3IEMoKTsKLy8vICAgcHJpbnQoZXh0cmFjdFR5cGVBcmd1bWVudHM8QT4oYywgPFQ+KCkgPT4gPFQ+W10pKTsKLy8vICAgLy8gUHJpbnRzOiBJbnN0YW5jZSBvZiAnTGlzdDxpbnQ+Jy4KLy8vCi8vLyAgIHByaW50KGV4dHJhY3RUeXBlQXJndW1lbnRzPEI+KGMsIDxUPigpID0+IDxUPltdKSk7Ci8vLyAgIC8vIFByaW50czogSW5zdGFuY2Ugb2YgJ0xpc3Q8U3RyaW5nPicuCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBBIGNhbGxlciBtdXN0IG5vdDoKLy8vCi8vLyAqICAgUGFzcyBgbnVsbGAgZm9yIFtpbnN0YW5jZV0uCi8vLyAqICAgVXNlIGEgbm9uLWNsYXNzIHR5cGUgKGkuZS4gYSBmdW5jdGlvbiB0eXBlKSBmb3IgW1RdLgovLy8gKiAgIFVzZSBhIG5vbi1nZW5lcmljIHR5cGUgZm9yIFtUXS4KLy8vICogICBQYXNzIGFuIGluc3RhbmNlIG9mIGEgZ2VuZXJpYyB0eXBlIGFuZCBhIGZ1bmN0aW9uIHRoYXQgZG9uJ3QgYm90aCB0YWtlCi8vLyAgICAgdGhlIHNhbWUgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzOgovLy8KLy8vICAgICBgYGBkYXJ0Ci8vLyAgICAgZXh0cmFjdFR5cGVBcmd1bWVudHM8TGlzdD4oPGludD5bXSwgPFQsIFM+KCkgPT4gbnVsbCk7Ci8vLyAgICAgYGBgCi8vLwovLy8gU2VlIHRoaXMgaXNzdWUgZm9yIG1vcmUgY29udGV4dDoKLy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zMTM3MQpleHRlcm5hbCBPYmplY3QgZXh0cmFjdFR5cGVBcmd1bWVudHM8VD4oVCBpbnN0YW5jZSwgRnVuY3Rpb24gZXh0cmFjdCk7CgovLy8gQW5ub3RhdGlvbiBjbGFzcyBtYXJraW5nIHRoZSB2ZXJzaW9uIHdoZXJlIFNESyBBUEkgd2FzIGFkZGVkLgovLy8KLy8vIEEgYFNpbmNlYCBhbm5vdGF0aW9uIGNhbiBiZSBhcHBsaWVkIHRvIGEgbGlicmFyeSBkZWNsYXJhdGlvbiwKLy8vIGFueSBwdWJsaWMgZGVjbGFyYXRpb24gaW4gYSBsaWJyYXJ5LCBvciBpbiBhIGNsYXNzLCBvciB0bwovLy8gYW4gb3B0aW9uYWwgcGFyYW1ldGVyLgovLy8KLy8vIEl0IHNpZ25pZmllcyB0aGF0IHRoZSBleHBvcnQsIG1lbWJlciBvciBwYXJhbWV0ZXIgd2FzICphZGRlZCogaW4KLy8vIHRoYXQgdmVyc2lvbi4KLy8vCi8vLyBXaGVuIGFwcGxpZWQgdG8gYSBsaWJyYXJ5IGRlY2xhcmF0aW9uLCBpdCBhbHNvIGEgYXBwbGllcyB0bwovLy8gYWxsIG1lbWJlcnMgZGVjbGFyZWQgb3IgZXhwb3J0ZWQgYnkgdGhhdCBsaWJyYXJ5LgovLy8gSWYgYXBwbGllZCB0byBhIGNsYXNzLCBpdCBhbHNvIGFwcGxpZXMgdG8gYWxsIG1lbWJlcnMgYW5kIGNvbnN0cnVjdG9ycwovLy8gb2YgdGhhdCBjbGFzcy4KLy8vIElmIGFwcGxpZWQgdG8gYSBjbGFzcyBtZXRob2QsIG9yIHBhcmFtZXRlciBvZiBzdWNoLAovLy8gYW55IG1ldGhvZCBpbXBsZW1lbnRpbmcgdGhhdCBpbnRlcmZhY2UgbWV0aG9kIGlzIGFsc28gYW5ub3RhdGVkLgovLy8gSSBtdWx0aXBsZSBgU2luY2VgIGFubm90YXRpb25zIGFwcGx5IHRvIHRoZSBzYW1lIGRlY2xhcmF0aW9uIG9yCi8vLyBwYXJhbWV0ZXIsIHRoZSBsYXRlc3QgdmVyc2lvbiB0YWtlcyBwcmVjZW5kZW5jZS4KLy8vCi8vLyBBbnkgdXNlIG9mIGEgbWFya2VkIEFQSSBtYXkgdHJpZ2dlciBhIHdhcm5pbmcgaWYgdGhlIHVzaW5nIGNvZGUKLy8vIGRvZXMgbm90IHJlcXVpcmUgYW4gU0RLIHZlcnNpb24gZ3VhcmFudGVlaW5nIHRoYXQgdGhlIEFQSSBpcyBhdmFpbGFibGUsCi8vLyB1bmxlc3MgdGhlIEFQSSBmZWF0dXJlIGlzIGFsc28gcHJvdmlkZWQgYnkgc29tZXRoaW5nIGVsc2UuCi8vLyBJdCBpcyBvbmx5IGEgcHJvYmxlbSBpZiBhbiBhbm5vdGF0ZWQgZmVhdHVyZSBpcyB1c2VkLCBhbmQgdGhlIGFubm90YXRlZAovLy8gQVBJIGlzIHRoZSAqb25seSogdGhpbmcgcHJvdmlkaW5nIHRoZSBmdW5jdGlvbmFsaXR5LgovLy8gRm9yIGV4YW1wbGUsIHVzaW5nIGBGdXR1cmVgIGV4cG9ydGVkIGJ5IGBkYXJ0OmNvcmVgIGlzIG5vdCBhIHByb2JsZW0KLy8vIGlmIHRoZSBzYW1lIGxpYnJhcnkgYWxzbyBpbXBvcnRzIGBkYXJ0OmFzeW5jYCwgYW5kIHVzaW5nIGFuIG9wdGlvbmFsCi8vLyBwYXJhbWV0ZXIgb24gYW4gaW50ZXJmYWNlIGlzIG5vdCBhIHByb2JsZW0gaWYgdGhlIHNhbWUgdHlwZSBhbHNvCi8vLyBpbXBsZW1lbnRzIGFub3RoZXIgaW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgc2FtZSBwYXJhbWV0ZXIuCi8vLwovLy8gVGhlIHZlcnNpb24gbXVzdCBiZSBhIHNlbWFudGljIHZlcnNpb24gKGxpa2UgYDEuNC4yYCBvciBgMC45LjQtcmVjLjRgKSwKLy8vIG9yIHRoZSBmaXJzdCB0d28gbnVtYmVycyBvZiBhIHNlbWFudGljIHZlcnNpb24gKGxpa2UgYDEuMGAgb3IgYDIuMmApLAovLy8gcmVwcmVzZW50aW5nIGEgc3RhYmxlIHJlbGVhc2UsIGFuZCBlcXVpdmFsZW50IHRvIHRoZSBzZW1hbnRpYyB2ZXJzaW9uCi8vLyB5b3UgZ2V0IGJ5IGFwcGVuZGluZyBhIGAuMGAuCkBTaW5jZSgiMi4yIikKY2xhc3MgU2luY2UgewogIGZpbmFsIFN0cmluZyB2ZXJzaW9uOwogIGNvbnN0IFNpbmNlKHRoaXMudmVyc2lvbik7Cn0KCi8qKgogKiBIVFRQIHN0YXR1cyBjb2Rlcy4gIEV4cG9ydGVkIGluIGRhcnQ6aW8gYW5kIGRhcnQ6aHRtbC4KICovCmFic3RyYWN0IGNsYXNzIEh0dHBTdGF0dXMgewogIHN0YXRpYyBjb25zdCBpbnQgY29udGludWVfID0gMTAwOwogIHN0YXRpYyBjb25zdCBpbnQgc3dpdGNoaW5nUHJvdG9jb2xzID0gMTAxOwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IHByb2Nlc3NpbmcgPSAxMDI7CiAgc3RhdGljIGNvbnN0IGludCBvayA9IDIwMDsKICBzdGF0aWMgY29uc3QgaW50IGNyZWF0ZWQgPSAyMDE7CiAgc3RhdGljIGNvbnN0IGludCBhY2NlcHRlZCA9IDIwMjsKICBzdGF0aWMgY29uc3QgaW50IG5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbiA9IDIwMzsKICBzdGF0aWMgY29uc3QgaW50IG5vQ29udGVudCA9IDIwNDsKICBzdGF0aWMgY29uc3QgaW50IHJlc2V0Q29udGVudCA9IDIwNTsKICBzdGF0aWMgY29uc3QgaW50IHBhcnRpYWxDb250ZW50ID0gMjA2OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IG11bHRpU3RhdHVzID0gMjA3OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IGFscmVhZHlSZXBvcnRlZCA9IDIwODsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBpbVVzZWQgPSAyMjY7CiAgc3RhdGljIGNvbnN0IGludCBtdWx0aXBsZUNob2ljZXMgPSAzMDA7CiAgc3RhdGljIGNvbnN0IGludCBtb3ZlZFBlcm1hbmVudGx5ID0gMzAxOwogIHN0YXRpYyBjb25zdCBpbnQgZm91bmQgPSAzMDI7CiAgc3RhdGljIGNvbnN0IGludCBtb3ZlZFRlbXBvcmFyaWx5ID0gMzAyOyAvLyBDb21tb24gYWxpYXMgZm9yIGZvdW5kLgogIHN0YXRpYyBjb25zdCBpbnQgc2VlT3RoZXIgPSAzMDM7CiAgc3RhdGljIGNvbnN0IGludCBub3RNb2RpZmllZCA9IDMwNDsKICBzdGF0aWMgY29uc3QgaW50IHVzZVByb3h5ID0gMzA1OwogIHN0YXRpYyBjb25zdCBpbnQgdGVtcG9yYXJ5UmVkaXJlY3QgPSAzMDc7CiAgQFNpbmNlKCIyLjEiKQogIHN0YXRpYyBjb25zdCBpbnQgcGVybWFuZW50UmVkaXJlY3QgPSAzMDg7CiAgc3RhdGljIGNvbnN0IGludCBiYWRSZXF1ZXN0ID0gNDAwOwogIHN0YXRpYyBjb25zdCBpbnQgdW5hdXRob3JpemVkID0gNDAxOwogIHN0YXRpYyBjb25zdCBpbnQgcGF5bWVudFJlcXVpcmVkID0gNDAyOwogIHN0YXRpYyBjb25zdCBpbnQgZm9yYmlkZGVuID0gNDAzOwogIHN0YXRpYyBjb25zdCBpbnQgbm90Rm91bmQgPSA0MDQ7CiAgc3RhdGljIGNvbnN0IGludCBtZXRob2ROb3RBbGxvd2VkID0gNDA1OwogIHN0YXRpYyBjb25zdCBpbnQgbm90QWNjZXB0YWJsZSA9IDQwNjsKICBzdGF0aWMgY29uc3QgaW50IHByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZCA9IDQwNzsKICBzdGF0aWMgY29uc3QgaW50IHJlcXVlc3RUaW1lb3V0ID0gNDA4OwogIHN0YXRpYyBjb25zdCBpbnQgY29uZmxpY3QgPSA0MDk7CiAgc3RhdGljIGNvbnN0IGludCBnb25lID0gNDEwOwogIHN0YXRpYyBjb25zdCBpbnQgbGVuZ3RoUmVxdWlyZWQgPSA0MTE7CiAgc3RhdGljIGNvbnN0IGludCBwcmVjb25kaXRpb25GYWlsZWQgPSA0MTI7CiAgc3RhdGljIGNvbnN0IGludCByZXF1ZXN0RW50aXR5VG9vTGFyZ2UgPSA0MTM7CiAgc3RhdGljIGNvbnN0IGludCByZXF1ZXN0VXJpVG9vTG9uZyA9IDQxNDsKICBzdGF0aWMgY29uc3QgaW50IHVuc3VwcG9ydGVkTWVkaWFUeXBlID0gNDE1OwogIHN0YXRpYyBjb25zdCBpbnQgcmVxdWVzdGVkUmFuZ2VOb3RTYXRpc2ZpYWJsZSA9IDQxNjsKICBzdGF0aWMgY29uc3QgaW50IGV4cGVjdGF0aW9uRmFpbGVkID0gNDE3OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IG1pc2RpcmVjdGVkUmVxdWVzdCA9IDQyMTsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCB1bnByb2Nlc3NhYmxlRW50aXR5ID0gNDIyOwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IGxvY2tlZCA9IDQyMzsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBmYWlsZWREZXBlbmRlbmN5ID0gNDI0OwogIHN0YXRpYyBjb25zdCBpbnQgdXBncmFkZVJlcXVpcmVkID0gNDI2OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IHByZWNvbmRpdGlvblJlcXVpcmVkID0gNDI4OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IHRvb01hbnlSZXF1ZXN0cyA9IDQyOTsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCByZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2UgPSA0MzE7CiAgQFNpbmNlKCIyLjEiKQogIHN0YXRpYyBjb25zdCBpbnQgY29ubmVjdGlvbkNsb3NlZFdpdGhvdXRSZXNwb25zZSA9IDQ0NDsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCB1bmF2YWlsYWJsZUZvckxlZ2FsUmVhc29ucyA9IDQ1MTsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBjbGllbnRDbG9zZWRSZXF1ZXN0ID0gNDk5OwogIHN0YXRpYyBjb25zdCBpbnQgaW50ZXJuYWxTZXJ2ZXJFcnJvciA9IDUwMDsKICBzdGF0aWMgY29uc3QgaW50IG5vdEltcGxlbWVudGVkID0gNTAxOwogIHN0YXRpYyBjb25zdCBpbnQgYmFkR2F0ZXdheSA9IDUwMjsKICBzdGF0aWMgY29uc3QgaW50IHNlcnZpY2VVbmF2YWlsYWJsZSA9IDUwMzsKICBzdGF0aWMgY29uc3QgaW50IGdhdGV3YXlUaW1lb3V0ID0gNTA0OwogIHN0YXRpYyBjb25zdCBpbnQgaHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQgPSA1MDU7CiAgQFNpbmNlKCIyLjEiKQogIHN0YXRpYyBjb25zdCBpbnQgdmFyaWFudEFsc29OZWdvdGlhdGVzID0gNTA2OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IGluc3VmZmljaWVudFN0b3JhZ2UgPSA1MDc7CiAgQFNpbmNlKCIyLjEiKQogIHN0YXRpYyBjb25zdCBpbnQgbG9vcERldGVjdGVkID0gNTA4OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IG5vdEV4dGVuZGVkID0gNTEwOwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IG5ldHdvcmtBdXRoZW50aWNhdGlvblJlcXVpcmVkID0gNTExOwogIC8vIENsaWVudCBnZW5lcmF0ZWQgc3RhdHVzIGNvZGUuCiAgc3RhdGljIGNvbnN0IGludCBuZXR3b3JrQ29ubmVjdFRpbWVvdXRFcnJvciA9IDU5OTsKCiAgQERlcHJlY2F0ZWQoIlVzZSBjb250aW51ZV8gaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBDT05USU5VRSA9IGNvbnRpbnVlXzsKICBARGVwcmVjYXRlZCgiVXNlIHN3aXRjaGluZ1Byb3RvY29scyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFNXSVRDSElOR19QUk9UT0NPTFMgPSBzd2l0Y2hpbmdQcm90b2NvbHM7CiAgQERlcHJlY2F0ZWQoIlVzZSBvayBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE9LID0gb2s7CiAgQERlcHJlY2F0ZWQoIlVzZSBjcmVhdGVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgQ1JFQVRFRCA9IGNyZWF0ZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBhY2NlcHRlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IEFDQ0VQVEVEID0gYWNjZXB0ZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBub25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb24gaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTiA9IG5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjsKICBARGVwcmVjYXRlZCgiVXNlIG5vQ29udGVudCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE5PX0NPTlRFTlQgPSBub0NvbnRlbnQ7CiAgQERlcHJlY2F0ZWQoIlVzZSByZXNldENvbnRlbnQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBSRVNFVF9DT05URU5UID0gcmVzZXRDb250ZW50OwogIEBEZXByZWNhdGVkKCJVc2UgcGFydGlhbENvbnRlbnQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBQQVJUSUFMX0NPTlRFTlQgPSBwYXJ0aWFsQ29udGVudDsKICBARGVwcmVjYXRlZCgiVXNlIG11bHRpcGxlQ2hvaWNlcyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE1VTFRJUExFX0NIT0lDRVMgPSBtdWx0aXBsZUNob2ljZXM7CiAgQERlcHJlY2F0ZWQoIlVzZSBtb3ZlZFBlcm1hbmVudGx5IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTU9WRURfUEVSTUFORU5UTFkgPSBtb3ZlZFBlcm1hbmVudGx5OwogIEBEZXByZWNhdGVkKCJVc2UgZm91bmQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBGT1VORCA9IGZvdW5kOwogIEBEZXByZWNhdGVkKCJVc2UgbW92ZWRUZW1wb3JhcmlseSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE1PVkVEX1RFTVBPUkFSSUxZID0gbW92ZWRUZW1wb3JhcmlseTsKICBARGVwcmVjYXRlZCgiVXNlIHNlZU90aGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgU0VFX09USEVSID0gc2VlT3RoZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBub3RNb2RpZmllZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE5PVF9NT0RJRklFRCA9IG5vdE1vZGlmaWVkOwogIEBEZXByZWNhdGVkKCJVc2UgdXNlUHJveHkgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBVU0VfUFJPWFkgPSB1c2VQcm94eTsKICBARGVwcmVjYXRlZCgiVXNlIHRlbXBvcmFyeVJlZGlyZWN0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgVEVNUE9SQVJZX1JFRElSRUNUID0gdGVtcG9yYXJ5UmVkaXJlY3Q7CiAgQERlcHJlY2F0ZWQoIlVzZSBiYWRSZXF1ZXN0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgQkFEX1JFUVVFU1QgPSBiYWRSZXF1ZXN0OwogIEBEZXByZWNhdGVkKCJVc2UgdW5hdXRob3JpemVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgVU5BVVRIT1JJWkVEID0gdW5hdXRob3JpemVkOwogIEBEZXByZWNhdGVkKCJVc2UgcGF5bWVudFJlcXVpcmVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUEFZTUVOVF9SRVFVSVJFRCA9IHBheW1lbnRSZXF1aXJlZDsKICBARGVwcmVjYXRlZCgiVXNlIGZvcmJpZGRlbiBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IEZPUkJJRERFTiA9IGZvcmJpZGRlbjsKICBARGVwcmVjYXRlZCgiVXNlIG5vdEZvdW5kIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTk9UX0ZPVU5EID0gbm90Rm91bmQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBtZXRob2ROb3RBbGxvd2VkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTUVUSE9EX05PVF9BTExPV0VEID0gbWV0aG9kTm90QWxsb3dlZDsKICBARGVwcmVjYXRlZCgiVXNlIG5vdEFjY2VwdGFibGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBOT1RfQUNDRVBUQUJMRSA9IG5vdEFjY2VwdGFibGU7CiAgQERlcHJlY2F0ZWQoIlVzZSBwcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRCA9IHByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDsKICBARGVwcmVjYXRlZCgiVXNlIHJlcXVlc3RUaW1lb3V0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUkVRVUVTVF9USU1FT1VUID0gcmVxdWVzdFRpbWVvdXQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBjb25mbGljdCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IENPTkZMSUNUID0gY29uZmxpY3Q7CiAgQERlcHJlY2F0ZWQoIlVzZSBnb25lIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgR09ORSA9IGdvbmU7CiAgQERlcHJlY2F0ZWQoIlVzZSBsZW5ndGhSZXF1aXJlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IExFTkdUSF9SRVFVSVJFRCA9IGxlbmd0aFJlcXVpcmVkOwogIEBEZXByZWNhdGVkKCJVc2UgcHJlY29uZGl0aW9uRmFpbGVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUFJFQ09ORElUSU9OX0ZBSUxFRCA9IHByZWNvbmRpdGlvbkZhaWxlZDsKICBARGVwcmVjYXRlZCgiVXNlIHJlcXVlc3RFbnRpdHlUb29MYXJnZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFJFUVVFU1RfRU5USVRZX1RPT19MQVJHRSA9IHJlcXVlc3RFbnRpdHlUb29MYXJnZTsKICBARGVwcmVjYXRlZCgiVXNlIHJlcXVlc3RVcmlUb29Mb25nIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUkVRVUVTVF9VUklfVE9PX0xPTkcgPSByZXF1ZXN0VXJpVG9vTG9uZzsKICBARGVwcmVjYXRlZCgiVXNlIHVuc3VwcG9ydGVkTWVkaWFUeXBlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgVU5TVVBQT1JURURfTUVESUFfVFlQRSA9IHVuc3VwcG9ydGVkTWVkaWFUeXBlOwogIEBEZXByZWNhdGVkKCJVc2UgcmVxdWVzdGVkUmFuZ2VOb3RTYXRpc2ZpYWJsZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFJFUVVFU1RFRF9SQU5HRV9OT1RfU0FUSVNGSUFCTEUgPQogICAgICByZXF1ZXN0ZWRSYW5nZU5vdFNhdGlzZmlhYmxlOwogIEBEZXByZWNhdGVkKCJVc2UgZXhwZWN0YXRpb25GYWlsZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBFWFBFQ1RBVElPTl9GQUlMRUQgPSBleHBlY3RhdGlvbkZhaWxlZDsKICBARGVwcmVjYXRlZCgiVXNlIHVwZ3JhZGVSZXF1aXJlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFVQR1JBREVfUkVRVUlSRUQgPSB1cGdyYWRlUmVxdWlyZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBpbnRlcm5hbFNlcnZlckVycm9yIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgSU5URVJOQUxfU0VSVkVSX0VSUk9SID0gaW50ZXJuYWxTZXJ2ZXJFcnJvcjsKICBARGVwcmVjYXRlZCgiVXNlIG5vdEltcGxlbWVudGVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTk9UX0lNUExFTUVOVEVEID0gbm90SW1wbGVtZW50ZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBiYWRHYXRld2F5IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgQkFEX0dBVEVXQVkgPSBiYWRHYXRld2F5OwogIEBEZXByZWNhdGVkKCJVc2Ugc2VydmljZVVuYXZhaWxhYmxlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgU0VSVklDRV9VTkFWQUlMQUJMRSA9IHNlcnZpY2VVbmF2YWlsYWJsZTsKICBARGVwcmVjYXRlZCgiVXNlIGdhdGV3YXlUaW1lb3V0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgR0FURVdBWV9USU1FT1VUID0gZ2F0ZXdheVRpbWVvdXQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBodHRwVmVyc2lvbk5vdFN1cHBvcnRlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEID0gaHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBuZXR3b3JrQ29ubmVjdFRpbWVvdXRFcnJvciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE5FVFdPUktfQ09OTkVDVF9USU1FT1VUX0VSUk9SID0gbmV0d29ya0Nvbm5lY3RUaW1lb3V0RXJyb3I7Cn0KgYAATk48ARgBGgEUCRAQHBsfDiYgHCABGBIWEhMSFBkBOksbHgwICQoLEQ0ODxAXEhMUFRwXGBkaIRwdAwEESAQ0NBgBGwEkMwE0AgFPFQRPLARKHhUVIQIBIQEsBEgeJxsWFh0gHjwNAgEnBDotJjg8MAIBT0tMJQQNBAwXBEcnBDYlMAgETUYEDBISBCwEDRc5KgQ5LQYIBBcEJD0oTysEED8MBCUyRwFCBEI+GwRFEgRANksTOEVENQRETD9MOUlJRT8ETEpKIQ4OGB0CAQQ6BBwkLRAlHSIjNiQnKRAmECoQISorIEYjJiMsECwlJyokIysoNikjHyktMCwvNywQLRAuECEQKyoQLxAqEDYQOhA1EC4uKSUtKTIQMBAuECcQJhA4IzUBJykwPSAcJSYmKDlQJysqMSw1LTcuOSMiLjkmKSkvJikvOygtKjAtNycqJikuOiszOVAsNSYoIiAsNTA9M0UvPTJCOjUkLzstNzFALDUoLTA9LDU1SThPAgEOZGFydDpfaW50ZXJuYWwyb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2ludGVybmFsL2l0ZXJhYmxlLmRhcnTAAF5zLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5faW50ZXJuYWw7CgovKioKICogTWFya2VyIGludGVyZmFjZSBmb3IgW0l0ZXJhYmxlXSBzdWJjbGFzc2VzIHRoYXQgaGF2ZSBhbiBlZmZpY2llbnQKICogW2xlbmd0aF0gaW1wbGVtZW50YXRpb24uCiAqLwphYnN0cmFjdCBjbGFzcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxUPiBleHRlbmRzIEl0ZXJhYmxlPFQ+IHsKICBjb25zdCBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSgpOwogIC8qKgogICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmFibGUuCiAgICoKICAgKiBUaGlzIGlzIGFuIGVmZmljaWVudCBvcGVyYXRpb24gdGhhdCBkb2Vzbid0IHJlcXVpcmUgaXRlcmF0aW5nIHRocm91Z2gKICAgKiB0aGUgZWxlbWVudHMuCiAgICovCiAgaW50IGdldCBsZW5ndGg7Cn0KCi8qKgogKiBBbiBbSXRlcmFibGVdIGZvciBjbGFzc2VzIHRoYXQgaGF2ZSBlZmZpY2llbnQgW2xlbmd0aF0gYW5kIFtlbGVtZW50QXRdLgogKgogKiBBbGwgb3RoZXIgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgW2xlbmd0aF0gYW5kIFtlbGVtZW50QXRdLAogKiBpbmNsdWRpbmcgW2l0ZXJhdG9yXS4KICovCmFic3RyYWN0IGNsYXNzIExpc3RJdGVyYWJsZTxFPiBleHRlbmRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHsKICBpbnQgZ2V0IGxlbmd0aDsKICBFIGVsZW1lbnRBdChpbnQgaSk7CgogIGNvbnN0IExpc3RJdGVyYWJsZSgpOwoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gbmV3IExpc3RJdGVyYXRvcjxFPih0aGlzKTsKCiAgdm9pZCBmb3JFYWNoKHZvaWQgYWN0aW9uKEUgZWxlbWVudCkpIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgYWN0aW9uKGVsZW1lbnRBdChpKSk7CiAgICAgIGlmIChsZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICBib29sIGdldCBpc0VtcHR5ID0+IGxlbmd0aCA9PSAwOwoKICBFIGdldCBmaXJzdCB7CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgcmV0dXJuIGVsZW1lbnRBdCgwKTsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHJldHVybiBlbGVtZW50QXQobGVuZ3RoIC0gMSk7CiAgfQoKICBFIGdldCBzaW5nbGUgewogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIGlmIChsZW5ndGggPiAxKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICByZXR1cm4gZWxlbWVudEF0KDApOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAoZWxlbWVudEF0KGkpID09IGVsZW1lbnQpIHJldHVybiB0cnVlOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBldmVyeShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAoIXRlc3QoZWxlbWVudEF0KGkpKSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIGFueShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAodGVzdChlbGVtZW50QXQoaSkpKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIEUgZWxlbWVudCA9IGVsZW1lbnRBdChpKTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiBlbGVtZW50OwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgbGFzdFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSBsZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICBFIGVsZW1lbnQgPSBlbGVtZW50QXQoaSk7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIHNpbmdsZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIEUgbWF0Y2ggPSBudWxsOwogICAgYm9vbCBtYXRjaEZvdW5kID0gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIEUgZWxlbWVudCA9IGVsZW1lbnRBdChpKTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICBpZiAobWF0Y2hGb3VuZCkgewogICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgIH0KICAgICAgICBtYXRjaEZvdW5kID0gdHJ1ZTsKICAgICAgICBtYXRjaCA9IGVsZW1lbnQ7CiAgICAgIH0KICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChtYXRjaEZvdW5kKSByZXR1cm4gbWF0Y2g7CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgU3RyaW5nIGpvaW4oW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGlmICghc2VwYXJhdG9yLmlzRW1wdHkpIHsKICAgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gIiI7CiAgICAgIFN0cmluZyBmaXJzdCA9ICIke2VsZW1lbnRBdCgwKX0iOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmaXJzdCk7CiAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICBidWZmZXIud3JpdGUoc2VwYXJhdG9yKTsKICAgICAgICBidWZmZXIud3JpdGUoZWxlbWVudEF0KGkpKTsKICAgICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgICB9IGVsc2UgewogICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgYnVmZmVyLndyaXRlKGVsZW1lbnRBdChpKSk7CiAgICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogICAgfQogIH0KCiAgSXRlcmFibGU8RT4gd2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IHN1cGVyLndoZXJlKHRlc3QpOwoKICBJdGVyYWJsZTxUPiBtYXA8VD4oVCBmKEUgZWxlbWVudCkpID0+IG5ldyBNYXBwZWRMaXN0SXRlcmFibGU8RSwgVD4odGhpcywgZik7CgogIEUgcmVkdWNlKEUgY29tYmluZShFIHZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgRSB2YWx1ZSA9IGVsZW1lbnRBdCgwKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCBlbGVtZW50QXQoaSkpOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgVCBmb2xkPFQ+KFQgaW5pdGlhbFZhbHVlLCBUIGNvbWJpbmUoVCBwcmV2aW91c1ZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICB2YXIgdmFsdWUgPSBpbml0aWFsVmFsdWU7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgZWxlbWVudEF0KGkpKTsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIEl0ZXJhYmxlPEU+IHNraXAoaW50IGNvdW50KSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEU+KHRoaXMsIGNvdW50LCBudWxsKTsKCiAgSXRlcmFibGU8RT4gc2tpcFdoaWxlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBzdXBlci5za2lwV2hpbGUodGVzdCk7CgogIEl0ZXJhYmxlPEU+IHRha2UoaW50IGNvdW50KSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEU+KHRoaXMsIDAsIGNvdW50KTsKCiAgSXRlcmFibGU8RT4gdGFrZVdoaWxlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBzdXBlci50YWtlV2hpbGUodGVzdCk7CgogIExpc3Q8RT4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgTGlzdDxFPiByZXN1bHQ7CiAgICBpZiAoZ3Jvd2FibGUpIHsKICAgICAgcmVzdWx0ID0gPEU+W10uLmxlbmd0aCA9IGxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IG5ldyBMaXN0PEU+KGxlbmd0aCk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdFtpXSA9IGVsZW1lbnRBdChpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTZXQ8RT4gdG9TZXQoKSB7CiAgICBTZXQ8RT4gcmVzdWx0ID0gbmV3IFNldDxFPigpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICByZXN1bHQuYWRkKGVsZW1lbnRBdChpKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKY2xhc3MgU3ViTGlzdEl0ZXJhYmxlPEU+IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPEU+IHsKICBmaW5hbCBJdGVyYWJsZTxFPiBfaXRlcmFibGU7IC8vIEhhcyBlZmZpY2llbnQgbGVuZ3RoIGFuZCBlbGVtZW50QXQuCiAgZmluYWwgaW50IF9zdGFydDsKICAvKiogSWYgbnVsbCwgcmVwcmVzZW50cyB0aGUgbGVuZ3RoIG9mIHRoZSBpdGVyYWJsZS4gKi8KICBmaW5hbCBpbnQgX2VuZE9yTGVuZ3RoOwoKICBTdWJMaXN0SXRlcmFibGUodGhpcy5faXRlcmFibGUsIHRoaXMuX3N0YXJ0LCB0aGlzLl9lbmRPckxlbmd0aCkgewogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKF9zdGFydCwgInN0YXJ0Iik7CiAgICBpZiAoX2VuZE9yTGVuZ3RoICE9IG51bGwpIHsKICAgICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKF9lbmRPckxlbmd0aCwgImVuZCIpOwogICAgICBpZiAoX3N0YXJ0ID4gX2VuZE9yTGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoX3N0YXJ0LCAwLCBfZW5kT3JMZW5ndGgsICJzdGFydCIpOwogICAgICB9CiAgICB9CiAgfQoKICBpbnQgZ2V0IF9lbmRJbmRleCB7CiAgICBpbnQgbGVuZ3RoID0gX2l0ZXJhYmxlLmxlbmd0aDsKICAgIGlmIChfZW5kT3JMZW5ndGggPT0gbnVsbCB8fCBfZW5kT3JMZW5ndGggPiBsZW5ndGgpIHJldHVybiBsZW5ndGg7CiAgICByZXR1cm4gX2VuZE9yTGVuZ3RoOwogIH0KCiAgaW50IGdldCBfc3RhcnRJbmRleCB7CiAgICBpbnQgbGVuZ3RoID0gX2l0ZXJhYmxlLmxlbmd0aDsKICAgIGlmIChfc3RhcnQgPiBsZW5ndGgpIHJldHVybiBsZW5ndGg7CiAgICByZXR1cm4gX3N0YXJ0OwogIH0KCiAgaW50IGdldCBsZW5ndGggewogICAgaW50IGxlbmd0aCA9IF9pdGVyYWJsZS5sZW5ndGg7CiAgICBpZiAoX3N0YXJ0ID49IGxlbmd0aCkgcmV0dXJuIDA7CiAgICBpZiAoX2VuZE9yTGVuZ3RoID09IG51bGwgfHwgX2VuZE9yTGVuZ3RoID49IGxlbmd0aCkgewogICAgICByZXR1cm4gbGVuZ3RoIC0gX3N0YXJ0OwogICAgfQogICAgcmV0dXJuIF9lbmRPckxlbmd0aCAtIF9zdGFydDsKICB9CgogIEUgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgaW50IHJlYWxJbmRleCA9IF9zdGFydEluZGV4ICsgaW5kZXg7CiAgICBpZiAoaW5kZXggPCAwIHx8IHJlYWxJbmRleCA+PSBfZW5kSW5kZXgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9pdGVyYWJsZS5lbGVtZW50QXQocmVhbEluZGV4KTsKICB9CgogIEl0ZXJhYmxlPEU+IHNraXAoaW50IGNvdW50KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUoY291bnQsICJjb3VudCIpOwogICAgaW50IG5ld1N0YXJ0ID0gX3N0YXJ0ICsgY291bnQ7CiAgICBpZiAoX2VuZE9yTGVuZ3RoICE9IG51bGwgJiYgbmV3U3RhcnQgPj0gX2VuZE9yTGVuZ3RoKSB7CiAgICAgIHJldHVybiBuZXcgRW1wdHlJdGVyYWJsZTxFPigpOwogICAgfQogICAgcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGU8RT4oX2l0ZXJhYmxlLCBuZXdTdGFydCwgX2VuZE9yTGVuZ3RoKTsKICB9CgogIEl0ZXJhYmxlPEU+IHRha2UoaW50IGNvdW50KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUoY291bnQsICJjb3VudCIpOwogICAgaWYgKF9lbmRPckxlbmd0aCA9PSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEU+KF9pdGVyYWJsZSwgX3N0YXJ0LCBfc3RhcnQgKyBjb3VudCk7CiAgICB9IGVsc2UgewogICAgICBpbnQgbmV3RW5kID0gX3N0YXJ0ICsgY291bnQ7CiAgICAgIGlmIChfZW5kT3JMZW5ndGggPCBuZXdFbmQpIHJldHVybiB0aGlzOwogICAgICByZXR1cm4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxFPihfaXRlcmFibGUsIF9zdGFydCwgbmV3RW5kKTsKICAgIH0KICB9CgogIExpc3Q8RT4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgaW50IHN0YXJ0ID0gX3N0YXJ0OwogICAgaW50IGVuZCA9IF9pdGVyYWJsZS5sZW5ndGg7CiAgICBpZiAoX2VuZE9yTGVuZ3RoICE9IG51bGwgJiYgX2VuZE9yTGVuZ3RoIDwgZW5kKSBlbmQgPSBfZW5kT3JMZW5ndGg7CiAgICBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBpZiAobGVuZ3RoIDwgMCkgbGVuZ3RoID0gMDsKICAgIExpc3Q8RT4gcmVzdWx0ID0KICAgICAgICBncm93YWJsZSA/IChuZXcgTGlzdDxFPigpLi5sZW5ndGggPSBsZW5ndGgpIDogbmV3IExpc3Q8RT4obGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0W2ldID0gX2l0ZXJhYmxlLmVsZW1lbnRBdChzdGFydCArIGkpOwogICAgICBpZiAoX2l0ZXJhYmxlLmxlbmd0aCA8IGVuZCkgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgovKioKICogQW4gW0l0ZXJhdG9yXSB0aGF0IGl0ZXJhdGVzIGEgbGlzdC1saWtlIFtJdGVyYWJsZV0uCiAqCiAqIEFsbCBpdGVyYXRpb25zIGlzIGRvbmUgaW4gdGVybXMgb2YgW0l0ZXJhYmxlLmxlbmd0aF0gYW5kCiAqIFtJdGVyYWJsZS5lbGVtZW50QXRdLiBUaGVzZSBvcGVyYXRpb25zIGFyZSBmYXN0IGZvciBsaXN0LWxpa2UKICogaXRlcmFibGVzLgogKi8KY2xhc3MgTGlzdEl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogIGZpbmFsIEl0ZXJhYmxlPEU+IF9pdGVyYWJsZTsKICBmaW5hbCBpbnQgX2xlbmd0aDsKICBpbnQgX2luZGV4OwogIEUgX2N1cnJlbnQ7CgogIExpc3RJdGVyYXRvcihJdGVyYWJsZTxFPiBpdGVyYWJsZSkKICAgICAgOiBfaXRlcmFibGUgPSBpdGVyYWJsZSwKICAgICAgICBfbGVuZ3RoID0gaXRlcmFibGUubGVuZ3RoLAogICAgICAgIF9pbmRleCA9IDA7CgogIEUgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7CgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpbnQgbGVuZ3RoID0gX2l0ZXJhYmxlLmxlbmd0aDsKICAgIGlmIChfbGVuZ3RoICE9IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKF9pdGVyYWJsZSk7CiAgICB9CiAgICBpZiAoX2luZGV4ID49IGxlbmd0aCkgewogICAgICBfY3VycmVudCA9IG51bGw7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIF9jdXJyZW50ID0gX2l0ZXJhYmxlLmVsZW1lbnRBdChfaW5kZXgpOwogICAgX2luZGV4Kys7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KCnR5cGVkZWYgVCBfVHJhbnNmb3JtYXRpb248UywgVD4oUyB2YWx1ZSk7CgpjbGFzcyBNYXBwZWRJdGVyYWJsZTxTLCBUPiBleHRlbmRzIEl0ZXJhYmxlPFQ+IHsKICBmaW5hbCBJdGVyYWJsZTxTPiBfaXRlcmFibGU7CiAgZmluYWwgX1RyYW5zZm9ybWF0aW9uPFMsIFQ+IF9mOwoKICBmYWN0b3J5IE1hcHBlZEl0ZXJhYmxlKEl0ZXJhYmxlPFM+IGl0ZXJhYmxlLCBUIGZ1bmN0aW9uKFMgdmFsdWUpKSB7CiAgICBpZiAoaXRlcmFibGUgaXMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUpIHsKICAgICAgcmV0dXJuIG5ldyBFZmZpY2llbnRMZW5ndGhNYXBwZWRJdGVyYWJsZTxTLCBUPihpdGVyYWJsZSwgZnVuY3Rpb24pOwogICAgfQogICAgcmV0dXJuIG5ldyBNYXBwZWRJdGVyYWJsZTxTLCBUPi5fKGl0ZXJhYmxlLCBmdW5jdGlvbik7CiAgfQoKICBNYXBwZWRJdGVyYWJsZS5fKHRoaXMuX2l0ZXJhYmxlLCB0aGlzLl9mKTsKCiAgSXRlcmF0b3I8VD4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBNYXBwZWRJdGVyYXRvcjxTLCBUPihfaXRlcmFibGUuaXRlcmF0b3IsIF9mKTsKCiAgLy8gTGVuZ3RoIHJlbGF0ZWQgZnVuY3Rpb25zIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgbWFwcGluZy4KICBpbnQgZ2V0IGxlbmd0aCA9PiBfaXRlcmFibGUubGVuZ3RoOwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2l0ZXJhYmxlLmlzRW1wdHk7CgogIC8vIEluZGV4IGJhc2VkIGxvb2t1cCBjYW4gYmUgZG9uZSBiZWZvcmUgdHJhbnNmb3JtaW5nLgogIFQgZ2V0IGZpcnN0ID0+IF9mKF9pdGVyYWJsZS5maXJzdCk7CiAgVCBnZXQgbGFzdCA9PiBfZihfaXRlcmFibGUubGFzdCk7CiAgVCBnZXQgc2luZ2xlID0+IF9mKF9pdGVyYWJsZS5zaW5nbGUpOwogIFQgZWxlbWVudEF0KGludCBpbmRleCkgPT4gX2YoX2l0ZXJhYmxlLmVsZW1lbnRBdChpbmRleCkpOwp9CgpjbGFzcyBFZmZpY2llbnRMZW5ndGhNYXBwZWRJdGVyYWJsZTxTLCBUPiBleHRlbmRzIE1hcHBlZEl0ZXJhYmxlPFMsIFQ+CiAgICBpbXBsZW1lbnRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPFQ+IHsKICBFZmZpY2llbnRMZW5ndGhNYXBwZWRJdGVyYWJsZShJdGVyYWJsZTxTPiBpdGVyYWJsZSwgVCBmdW5jdGlvbihTIHZhbHVlKSkKICAgICAgOiBzdXBlci5fKGl0ZXJhYmxlLCBmdW5jdGlvbik7Cn0KCmNsYXNzIE1hcHBlZEl0ZXJhdG9yPFMsIFQ+IGV4dGVuZHMgSXRlcmF0b3I8VD4gewogIFQgX2N1cnJlbnQ7CiAgZmluYWwgSXRlcmF0b3I8Uz4gX2l0ZXJhdG9yOwogIGZpbmFsIF9UcmFuc2Zvcm1hdGlvbjxTLCBUPiBfZjsKCiAgTWFwcGVkSXRlcmF0b3IodGhpcy5faXRlcmF0b3IsIHRoaXMuX2YpOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9pdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIF9jdXJyZW50ID0gX2YoX2l0ZXJhdG9yLmN1cnJlbnQpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9jdXJyZW50ID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIFQgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7Cn0KCi8qKgogKiBTcGVjaWFsaXplZCBhbHRlcm5hdGl2ZSB0byBbTWFwcGVkSXRlcmFibGVdIGZvciBtYXBwZWQgW0xpc3Rdcy4KICoKICogRXhwZWN0cyBlZmZpY2llbnQgYGxlbmd0aGAgYW5kIGBlbGVtZW50QXRgIG9uIHRoZSBzb3VyY2UgaXRlcmFibGUuCiAqLwpjbGFzcyBNYXBwZWRMaXN0SXRlcmFibGU8UywgVD4gZXh0ZW5kcyBMaXN0SXRlcmFibGU8VD4gewogIGZpbmFsIEl0ZXJhYmxlPFM+IF9zb3VyY2U7CiAgZmluYWwgX1RyYW5zZm9ybWF0aW9uPFMsIFQ+IF9mOwoKICBNYXBwZWRMaXN0SXRlcmFibGUodGhpcy5fc291cmNlLCB0aGlzLl9mKTsKCiAgaW50IGdldCBsZW5ndGggPT4gX3NvdXJjZS5sZW5ndGg7CiAgVCBlbGVtZW50QXQoaW50IGluZGV4KSA9PiBfZihfc291cmNlLmVsZW1lbnRBdChpbmRleCkpOwp9Cgp0eXBlZGVmIGJvb2wgX0VsZW1lbnRQcmVkaWNhdGU8RT4oRSBlbGVtZW50KTsKCmNsYXNzIFdoZXJlSXRlcmFibGU8RT4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gX2l0ZXJhYmxlOwogIGZpbmFsIF9FbGVtZW50UHJlZGljYXRlPEU+IF9mOwoKICBXaGVyZUl0ZXJhYmxlKHRoaXMuX2l0ZXJhYmxlLCB0aGlzLl9mKTsKCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBXaGVyZUl0ZXJhdG9yPEU+KF9pdGVyYWJsZS5pdGVyYXRvciwgX2YpOwoKICAvLyBTcGVjaWFsaXphdGlvbiBvZiBbSXRlcmFibGUubWFwXSB0byBub24tRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUuCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihFIGVsZW1lbnQpKSA9PiBuZXcgTWFwcGVkSXRlcmFibGU8RSwgVD4uXyh0aGlzLCBmKTsKfQoKY2xhc3MgV2hlcmVJdGVyYXRvcjxFPiBleHRlbmRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBJdGVyYXRvcjxFPiBfaXRlcmF0b3I7CiAgZmluYWwgX0VsZW1lbnRQcmVkaWNhdGU8RT4gX2Y7CgogIFdoZXJlSXRlcmF0b3IodGhpcy5faXRlcmF0b3IsIHRoaXMuX2YpOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgd2hpbGUgKF9pdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIGlmIChfZihfaXRlcmF0b3IuY3VycmVudCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRSBnZXQgY3VycmVudCA9PiBfaXRlcmF0b3IuY3VycmVudDsKfQoKdHlwZWRlZiBJdGVyYWJsZTxUPiBfRXhwYW5kRnVuY3Rpb248UywgVD4oUyBzb3VyY2VFbGVtZW50KTsKCmNsYXNzIEV4cGFuZEl0ZXJhYmxlPFMsIFQ+IGV4dGVuZHMgSXRlcmFibGU8VD4gewogIGZpbmFsIEl0ZXJhYmxlPFM+IF9pdGVyYWJsZTsKICBmaW5hbCBfRXhwYW5kRnVuY3Rpb248UywgVD4gX2Y7CgogIEV4cGFuZEl0ZXJhYmxlKHRoaXMuX2l0ZXJhYmxlLCB0aGlzLl9mKTsKCiAgSXRlcmF0b3I8VD4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBFeHBhbmRJdGVyYXRvcjxTLCBUPihfaXRlcmFibGUuaXRlcmF0b3IsIF9mKTsKfQoKY2xhc3MgRXhwYW5kSXRlcmF0b3I8UywgVD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7CiAgZmluYWwgSXRlcmF0b3I8Uz4gX2l0ZXJhdG9yOwogIGZpbmFsIF9FeHBhbmRGdW5jdGlvbjxTLCBUPiBfZjsKICAvLyBJbml0aWFsaXplIF9jdXJyZW50RXhwYW5zaW9uIHRvIGFuIGVtcHR5IGl0ZXJhYmxlLiBBIG51bGwgdmFsdWUKICAvLyBtYXJrcyB0aGUgZW5kIG9mIGl0ZXJhdGlvbiwgYW5kIHdlIGRvbid0IHdhbnQgdG8gY2FsbCBfZiBiZWZvcmUKICAvLyB0aGUgZmlyc3QgbW92ZU5leHQgY2FsbC4KICBJdGVyYXRvcjxUPiBfY3VycmVudEV4cGFuc2lvbiA9IGNvbnN0IEVtcHR5SXRlcmF0b3IoKTsKICBUIF9jdXJyZW50OwoKICBFeHBhbmRJdGVyYXRvcih0aGlzLl9pdGVyYXRvciwgdGhpcy5fZik7CgogIFQgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX2N1cnJlbnRFeHBhbnNpb24gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgd2hpbGUgKCFfY3VycmVudEV4cGFuc2lvbi5tb3ZlTmV4dCgpKSB7CiAgICAgIF9jdXJyZW50ID0gbnVsbDsKICAgICAgaWYgKF9pdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgICAgLy8gSWYgX2YgdGhyb3dzLCB0aGlzIGVuZHMgaXRlcmF0aW9uLiBPdGhlcndpc2UgX2N1cnJlbnRFeHBhbnNpb24gYW5kCiAgICAgICAgLy8gX2N1cnJlbnQgd2lsbCBiZSBzZXQgYWdhaW4gYmVsb3cuCiAgICAgICAgX2N1cnJlbnRFeHBhbnNpb24gPSBudWxsOwogICAgICAgIF9jdXJyZW50RXhwYW5zaW9uID0gX2YoX2l0ZXJhdG9yLmN1cnJlbnQpLml0ZXJhdG9yOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgX2N1cnJlbnQgPSBfY3VycmVudEV4cGFuc2lvbi5jdXJyZW50OwogICAgcmV0dXJuIHRydWU7CiAgfQp9CgpjbGFzcyBUYWtlSXRlcmFibGU8RT4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gX2l0ZXJhYmxlOwogIGZpbmFsIGludCBfdGFrZUNvdW50OwoKICBmYWN0b3J5IFRha2VJdGVyYWJsZShJdGVyYWJsZTxFPiBpdGVyYWJsZSwgaW50IHRha2VDb3VudCkgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwodGFrZUNvdW50LCAidGFrZUNvdW50Iik7CiAgICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUodGFrZUNvdW50LCAidGFrZUNvdW50Iik7CiAgICBpZiAoaXRlcmFibGUgaXMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUpIHsKICAgICAgcmV0dXJuIG5ldyBFZmZpY2llbnRMZW5ndGhUYWtlSXRlcmFibGU8RT4oaXRlcmFibGUsIHRha2VDb3VudCk7CiAgICB9CiAgICByZXR1cm4gbmV3IFRha2VJdGVyYWJsZTxFPi5fKGl0ZXJhYmxlLCB0YWtlQ291bnQpOwogIH0KCiAgVGFrZUl0ZXJhYmxlLl8odGhpcy5faXRlcmFibGUsIHRoaXMuX3Rha2VDb3VudCk7CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IFRha2VJdGVyYXRvcjxFPihfaXRlcmFibGUuaXRlcmF0b3IsIF90YWtlQ291bnQpOwogIH0KfQoKY2xhc3MgRWZmaWNpZW50TGVuZ3RoVGFrZUl0ZXJhYmxlPEU+IGV4dGVuZHMgVGFrZUl0ZXJhYmxlPEU+CiAgICBpbXBsZW1lbnRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHsKICBFZmZpY2llbnRMZW5ndGhUYWtlSXRlcmFibGUoSXRlcmFibGU8RT4gaXRlcmFibGUsIGludCB0YWtlQ291bnQpCiAgICAgIDogc3VwZXIuXyhpdGVyYWJsZSwgdGFrZUNvdW50KTsKCiAgaW50IGdldCBsZW5ndGggewogICAgaW50IGl0ZXJhYmxlTGVuZ3RoID0gX2l0ZXJhYmxlLmxlbmd0aDsKICAgIGlmIChpdGVyYWJsZUxlbmd0aCA+IF90YWtlQ291bnQpIHJldHVybiBfdGFrZUNvdW50OwogICAgcmV0dXJuIGl0ZXJhYmxlTGVuZ3RoOwogIH0KfQoKY2xhc3MgVGFrZUl0ZXJhdG9yPEU+IGV4dGVuZHMgSXRlcmF0b3I8RT4gewogIGZpbmFsIEl0ZXJhdG9yPEU+IF9pdGVyYXRvcjsKICBpbnQgX3JlbWFpbmluZzsKCiAgVGFrZUl0ZXJhdG9yKHRoaXMuX2l0ZXJhdG9yLCB0aGlzLl9yZW1haW5pbmcpIHsKICAgIGFzc2VydChfcmVtYWluaW5nID49IDApOwogIH0KCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIF9yZW1haW5pbmctLTsKICAgIGlmIChfcmVtYWluaW5nID49IDApIHsKICAgICAgcmV0dXJuIF9pdGVyYXRvci5tb3ZlTmV4dCgpOwogICAgfQogICAgX3JlbWFpbmluZyA9IC0xOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRSBnZXQgY3VycmVudCB7CiAgICBpZiAoX3JlbWFpbmluZyA8IDApIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9pdGVyYXRvci5jdXJyZW50OwogIH0KfQoKY2xhc3MgVGFrZVdoaWxlSXRlcmFibGU8RT4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gX2l0ZXJhYmxlOwogIGZpbmFsIF9FbGVtZW50UHJlZGljYXRlPEU+IF9mOwoKICBUYWtlV2hpbGVJdGVyYWJsZSh0aGlzLl9pdGVyYWJsZSwgdGhpcy5fZik7CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IFRha2VXaGlsZUl0ZXJhdG9yPEU+KF9pdGVyYWJsZS5pdGVyYXRvciwgX2YpOwogIH0KfQoKY2xhc3MgVGFrZVdoaWxlSXRlcmF0b3I8RT4gZXh0ZW5kcyBJdGVyYXRvcjxFPiB7CiAgZmluYWwgSXRlcmF0b3I8RT4gX2l0ZXJhdG9yOwogIGZpbmFsIF9FbGVtZW50UHJlZGljYXRlPEU+IF9mOwogIGJvb2wgX2lzRmluaXNoZWQgPSBmYWxzZTsKCiAgVGFrZVdoaWxlSXRlcmF0b3IodGhpcy5faXRlcmF0b3IsIHRoaXMuX2YpOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9pc0ZpbmlzaGVkKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoIV9pdGVyYXRvci5tb3ZlTmV4dCgpIHx8ICFfZihfaXRlcmF0b3IuY3VycmVudCkpIHsKICAgICAgX2lzRmluaXNoZWQgPSB0cnVlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEUgZ2V0IGN1cnJlbnQgewogICAgaWYgKF9pc0ZpbmlzaGVkKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfaXRlcmF0b3IuY3VycmVudDsKICB9Cn0KCmNsYXNzIFNraXBJdGVyYWJsZTxFPiBleHRlbmRzIEl0ZXJhYmxlPEU+IHsKICBmaW5hbCBJdGVyYWJsZTxFPiBfaXRlcmFibGU7CiAgZmluYWwgaW50IF9za2lwQ291bnQ7CgogIGZhY3RvcnkgU2tpcEl0ZXJhYmxlKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBpbnQgY291bnQpIHsKICAgIGlmIChpdGVyYWJsZSBpcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSkgewogICAgICByZXR1cm4gbmV3IEVmZmljaWVudExlbmd0aFNraXBJdGVyYWJsZTxFPihpdGVyYWJsZSwgY291bnQpOwogICAgfQogICAgcmV0dXJuIG5ldyBTa2lwSXRlcmFibGU8RT4uXyhpdGVyYWJsZSwgX2NoZWNrQ291bnQoY291bnQpKTsKICB9CgogIFNraXBJdGVyYWJsZS5fKHRoaXMuX2l0ZXJhYmxlLCB0aGlzLl9za2lwQ291bnQpOwoKICBJdGVyYWJsZTxFPiBza2lwKGludCBjb3VudCkgewogICAgcmV0dXJuIG5ldyBTa2lwSXRlcmFibGU8RT4uXyhfaXRlcmFibGUsIF9za2lwQ291bnQgKyBfY2hlY2tDb3VudChjb3VudCkpOwogIH0KCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBuZXcgU2tpcEl0ZXJhdG9yPEU+KF9pdGVyYWJsZS5pdGVyYXRvciwgX3NraXBDb3VudCk7CiAgfQp9CgpjbGFzcyBFZmZpY2llbnRMZW5ndGhTa2lwSXRlcmFibGU8RT4gZXh0ZW5kcyBTa2lwSXRlcmFibGU8RT4KICAgIGltcGxlbWVudHMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8RT4gewogIGZhY3RvcnkgRWZmaWNpZW50TGVuZ3RoU2tpcEl0ZXJhYmxlKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBpbnQgY291bnQpIHsKICAgIHJldHVybiBuZXcgRWZmaWNpZW50TGVuZ3RoU2tpcEl0ZXJhYmxlPEU+Ll8oaXRlcmFibGUsIF9jaGVja0NvdW50KGNvdW50KSk7CiAgfQoKICBFZmZpY2llbnRMZW5ndGhTa2lwSXRlcmFibGUuXyhJdGVyYWJsZTxFPiBpdGVyYWJsZSwgaW50IGNvdW50KQogICAgICA6IHN1cGVyLl8oaXRlcmFibGUsIGNvdW50KTsKCiAgaW50IGdldCBsZW5ndGggewogICAgaW50IGxlbmd0aCA9IF9pdGVyYWJsZS5sZW5ndGggLSBfc2tpcENvdW50OwogICAgaWYgKGxlbmd0aCA+PSAwKSByZXR1cm4gbGVuZ3RoOwogICAgcmV0dXJuIDA7CiAgfQoKICBJdGVyYWJsZTxFPiBza2lwKGludCBjb3VudCkgewogICAgcmV0dXJuIG5ldyBFZmZpY2llbnRMZW5ndGhTa2lwSXRlcmFibGU8RT4uXygKICAgICAgICBfaXRlcmFibGUsIF9za2lwQ291bnQgKyBfY2hlY2tDb3VudChjb3VudCkpOwogIH0KfQoKaW50IF9jaGVja0NvdW50KGludCBjb3VudCkgewogIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGNvdW50LCAiY291bnQiKTsKICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUoY291bnQsICJjb3VudCIpOwogIHJldHVybiBjb3VudDsKfQoKY2xhc3MgU2tpcEl0ZXJhdG9yPEU+IGV4dGVuZHMgSXRlcmF0b3I8RT4gewogIGZpbmFsIEl0ZXJhdG9yPEU+IF9pdGVyYXRvcjsKICBpbnQgX3NraXBDb3VudDsKCiAgU2tpcEl0ZXJhdG9yKHRoaXMuX2l0ZXJhdG9yLCB0aGlzLl9za2lwQ291bnQpIHsKICAgIGFzc2VydChfc2tpcENvdW50ID49IDApOwogIH0KCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NraXBDb3VudDsgaSsrKSBfaXRlcmF0b3IubW92ZU5leHQoKTsKICAgIF9za2lwQ291bnQgPSAwOwogICAgcmV0dXJuIF9pdGVyYXRvci5tb3ZlTmV4dCgpOwogIH0KCiAgRSBnZXQgY3VycmVudCA9PiBfaXRlcmF0b3IuY3VycmVudDsKfQoKY2xhc3MgU2tpcFdoaWxlSXRlcmFibGU8RT4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gX2l0ZXJhYmxlOwogIGZpbmFsIF9FbGVtZW50UHJlZGljYXRlPEU+IF9mOwoKICBTa2lwV2hpbGVJdGVyYWJsZSh0aGlzLl9pdGVyYWJsZSwgdGhpcy5fZik7CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IFNraXBXaGlsZUl0ZXJhdG9yPEU+KF9pdGVyYWJsZS5pdGVyYXRvciwgX2YpOwogIH0KfQoKY2xhc3MgU2tpcFdoaWxlSXRlcmF0b3I8RT4gZXh0ZW5kcyBJdGVyYXRvcjxFPiB7CiAgZmluYWwgSXRlcmF0b3I8RT4gX2l0ZXJhdG9yOwogIGZpbmFsIF9FbGVtZW50UHJlZGljYXRlPEU+IF9mOwogIGJvb2wgX2hhc1NraXBwZWQgPSBmYWxzZTsKCiAgU2tpcFdoaWxlSXRlcmF0b3IodGhpcy5faXRlcmF0b3IsIHRoaXMuX2YpOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKCFfaGFzU2tpcHBlZCkgewogICAgICBfaGFzU2tpcHBlZCA9IHRydWU7CiAgICAgIHdoaWxlIChfaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgIGlmICghX2YoX2l0ZXJhdG9yLmN1cnJlbnQpKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9pdGVyYXRvci5tb3ZlTmV4dCgpOwogIH0KCiAgRSBnZXQgY3VycmVudCA9PiBfaXRlcmF0b3IuY3VycmVudDsKfQoKLyoqCiAqIFRoZSBhbHdheXMgZW1wdHkgW0l0ZXJhYmxlXS4KICovCmNsYXNzIEVtcHR5SXRlcmFibGU8RT4gZXh0ZW5kcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPiB7CiAgY29uc3QgRW1wdHlJdGVyYWJsZSgpOwoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gY29uc3QgRW1wdHlJdGVyYXRvcigpOwoKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oRSBlbGVtZW50KSkge30KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiB0cnVlOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiAwOwoKICBFIGdldCBmaXJzdCB7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGdldCBzaW5nbGUgewogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGluZGV4LCAwLCAwLCAiaW5kZXgiKTsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpID0+IGZhbHNlOwoKICBib29sIGV2ZXJ5KGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiB0cnVlOwoKICBib29sIGFueShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gZmFsc2U7CgogIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBsYXN0V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgewogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgewogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIFN0cmluZyBqb2luKFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSA9PiAiIjsKCiAgSXRlcmFibGU8RT4gd2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IHRoaXM7CgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoRSBlbGVtZW50KSkgPT4gbmV3IEVtcHR5SXRlcmFibGU8VD4oKTsKCiAgRSByZWR1Y2UoRSBjb21iaW5lKEUgdmFsdWUsIEUgZWxlbWVudCkpIHsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgVCBmb2xkPFQ+KFQgaW5pdGlhbFZhbHVlLCBUIGNvbWJpbmUoVCBwcmV2aW91c1ZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICByZXR1cm4gaW5pdGlhbFZhbHVlOwogIH0KCiAgSXRlcmFibGU8RT4gc2tpcChpbnQgY291bnQpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShjb3VudCwgImNvdW50Iik7CiAgICByZXR1cm4gdGhpczsKICB9CgogIEl0ZXJhYmxlPEU+IHNraXBXaGlsZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gdGhpczsKCiAgSXRlcmFibGU8RT4gdGFrZShpbnQgY291bnQpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShjb3VudCwgImNvdW50Iik7CiAgICByZXR1cm4gdGhpczsKICB9CgogIEl0ZXJhYmxlPEU+IHRha2VXaGlsZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gdGhpczsKCiAgTGlzdDxFPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSA9PiBncm93YWJsZSA/IDxFPltdIDogbmV3IExpc3Q8RT4oMCk7CgogIFNldDxFPiB0b1NldCgpID0+IG5ldyBTZXQ8RT4oKTsKfQoKLyoqIFRoZSBhbHdheXMgZW1wdHkgaXRlcmF0b3IuICovCmNsYXNzIEVtcHR5SXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgY29uc3QgRW1wdHlJdGVyYXRvcigpOwogIGJvb2wgbW92ZU5leHQoKSA9PiBmYWxzZTsKICBFIGdldCBjdXJyZW50ID0+IG51bGw7Cn0KCmNsYXNzIEZvbGxvd2VkQnlJdGVyYWJsZTxFPiBleHRlbmRzIEl0ZXJhYmxlPEU+IHsKICBmaW5hbCBJdGVyYWJsZTxFPiBfZmlyc3Q7CiAgZmluYWwgSXRlcmFibGU8RT4gX3NlY29uZDsKICBGb2xsb3dlZEJ5SXRlcmFibGUodGhpcy5fZmlyc3QsIHRoaXMuX3NlY29uZCk7CgogIGZhY3RvcnkgRm9sbG93ZWRCeUl0ZXJhYmxlLmZpcnN0RWZmaWNpZW50KAogICAgICBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPiBmaXJzdCwgSXRlcmFibGU8RT4gc2Vjb25kKSB7CiAgICBpZiAoc2Vjb25kIGlzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+KSB7CiAgICAgIHJldHVybiBuZXcgRWZmaWNpZW50TGVuZ3RoRm9sbG93ZWRCeUl0ZXJhYmxlPEU+KGZpcnN0LCBzZWNvbmQpOwogICAgfQogICAgcmV0dXJuIG5ldyBGb2xsb3dlZEJ5SXRlcmFibGU8RT4oZmlyc3QsIHNlY29uZCk7CiAgfQoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gbmV3IEZvbGxvd2VkQnlJdGVyYXRvcihfZmlyc3QsIF9zZWNvbmQpOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfZmlyc3QubGVuZ3RoICsgX3NlY29uZC5sZW5ndGg7CiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfZmlyc3QuaXNFbXB0eSAmJiBfc2Vjb25kLmlzRW1wdHk7CiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfZmlyc3QuaXNOb3RFbXB0eSB8fCBfc2Vjb25kLmlzTm90RW1wdHk7CgogIC8vIE1heSBiZSBtb3JlIGVmZmljaWVudCBpZiBlaXRoZXIgaXRlcmFibGUgaXMgYSBTZXQuCiAgYm9vbCBjb250YWlucyhPYmplY3QgdmFsdWUpID0+CiAgICAgIF9maXJzdC5jb250YWlucyh2YWx1ZSkgfHwgX3NlY29uZC5jb250YWlucyh2YWx1ZSk7CgogIEUgZ2V0IGZpcnN0IHsKICAgIHZhciBpdGVyYXRvciA9IF9maXJzdC5pdGVyYXRvcjsKICAgIGlmIChpdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm4gaXRlcmF0b3IuY3VycmVudDsKICAgIHJldHVybiBfc2Vjb25kLmZpcnN0OwogIH0KCiAgRSBnZXQgbGFzdCB7CiAgICB2YXIgaXRlcmF0b3IgPSBfc2Vjb25kLml0ZXJhdG9yOwogICAgaWYgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgRSBsYXN0ID0gaXRlcmF0b3IuY3VycmVudDsKICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIGxhc3QgPSBpdGVyYXRvci5jdXJyZW50OwogICAgICByZXR1cm4gbGFzdDsKICAgIH0KICAgIHJldHVybiBfZmlyc3QubGFzdDsKICB9CgogIC8vIElmIGxpbmVhciBzZXF1ZW5jZXMgb2YgYGZvbGxvd2VkQnlgIGJlY29tZXMgYW4gaXNzdWUsIHdlIGNhbiBmbGF0dGVuCiAgLy8gaW50byBhIGxpc3Qgb2YgaXRlcmFibGVzIGluc3RlYWQgb2YgYSB0cmVlIG9yIHNwaW5lLgp9CgpjbGFzcyBFZmZpY2llbnRMZW5ndGhGb2xsb3dlZEJ5SXRlcmFibGU8RT4gZXh0ZW5kcyBGb2xsb3dlZEJ5SXRlcmFibGU8RT4KICAgIGltcGxlbWVudHMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8RT4gewogIEVmZmljaWVudExlbmd0aEZvbGxvd2VkQnlJdGVyYWJsZSgKICAgICAgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8RT4gZmlyc3QsIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHNlY29uZCkKICAgICAgOiBzdXBlcihmaXJzdCwgc2Vjb25kKTsKCiAgSXRlcmFibGU8RT4gc2tpcChpbnQgY291bnQpIHsKICAgIGludCBmaXJzdExlbmd0aCA9IF9maXJzdC5sZW5ndGg7CiAgICBpZiAoY291bnQgPj0gZmlyc3RMZW5ndGgpIHJldHVybiBfc2Vjb25kLnNraXAoY291bnQgLSBmaXJzdExlbmd0aCk7CiAgICByZXR1cm4gbmV3IEVmZmljaWVudExlbmd0aEZvbGxvd2VkQnlJdGVyYWJsZTxFPigKICAgICAgICBfZmlyc3Quc2tpcChjb3VudCksIF9zZWNvbmQpOwogIH0KCiAgSXRlcmFibGU8RT4gdGFrZShpbnQgY291bnQpIHsKICAgIGludCBmaXJzdExlbmd0aCA9IF9maXJzdC5sZW5ndGg7CiAgICBpZiAoY291bnQgPD0gZmlyc3RMZW5ndGgpIHJldHVybiBfZmlyc3QudGFrZShjb3VudCk7CiAgICByZXR1cm4gbmV3IEVmZmljaWVudExlbmd0aEZvbGxvd2VkQnlJdGVyYWJsZTxFPigKICAgICAgICBfZmlyc3QsIF9zZWNvbmQudGFrZShjb3VudCAtIGZpcnN0TGVuZ3RoKSk7CiAgfQoKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIGludCBmaXJzdExlbmd0aCA9IF9maXJzdC5sZW5ndGg7CiAgICBpZiAoaW5kZXggPCBmaXJzdExlbmd0aCkgcmV0dXJuIF9maXJzdC5lbGVtZW50QXQoaW5kZXgpOwogICAgcmV0dXJuIF9zZWNvbmQuZWxlbWVudEF0KGluZGV4IC0gZmlyc3RMZW5ndGgpOwogIH0KCiAgRSBnZXQgZmlyc3QgewogICAgaWYgKF9maXJzdC5pc05vdEVtcHR5KSByZXR1cm4gX2ZpcnN0LmZpcnN0OwogICAgcmV0dXJuIF9zZWNvbmQuZmlyc3Q7CiAgfQoKICBFIGdldCBsYXN0IHsKICAgIGlmIChfc2Vjb25kLmlzTm90RW1wdHkpIHJldHVybiBfc2Vjb25kLmxhc3Q7CiAgICByZXR1cm4gX2ZpcnN0Lmxhc3Q7CiAgfQp9CgpjbGFzcyBGb2xsb3dlZEJ5SXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgSXRlcmF0b3I8RT4gX2N1cnJlbnRJdGVyYXRvcjsKICBJdGVyYWJsZTxFPiBfbmV4dEl0ZXJhYmxlOwoKICBGb2xsb3dlZEJ5SXRlcmF0b3IoSXRlcmFibGU8RT4gZmlyc3QsIHRoaXMuX25leHRJdGVyYWJsZSkKICAgICAgOiBfY3VycmVudEl0ZXJhdG9yID0gZmlyc3QuaXRlcmF0b3I7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX2N1cnJlbnRJdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChfbmV4dEl0ZXJhYmxlICE9IG51bGwpIHsKICAgICAgX2N1cnJlbnRJdGVyYXRvciA9IF9uZXh0SXRlcmFibGUuaXRlcmF0b3I7CiAgICAgIF9uZXh0SXRlcmFibGUgPSBudWxsOwogICAgICByZXR1cm4gX2N1cnJlbnRJdGVyYXRvci5tb3ZlTmV4dCgpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRSBnZXQgY3VycmVudCA9PiBfY3VycmVudEl0ZXJhdG9yLmN1cnJlbnQ7Cn0KCmNsYXNzIFdoZXJlVHlwZUl0ZXJhYmxlPFQ+IGV4dGVuZHMgSXRlcmFibGU8VD4gewogIGZpbmFsIEl0ZXJhYmxlPE9iamVjdD4gX3NvdXJjZTsKICBXaGVyZVR5cGVJdGVyYWJsZSh0aGlzLl9zb3VyY2UpOwogIEl0ZXJhdG9yPFQ+IGdldCBpdGVyYXRvciA9PiBuZXcgV2hlcmVUeXBlSXRlcmF0b3I8VD4oX3NvdXJjZS5pdGVyYXRvcik7Cn0KCmNsYXNzIFdoZXJlVHlwZUl0ZXJhdG9yPFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4gewogIGZpbmFsIEl0ZXJhdG9yPE9iamVjdD4gX3NvdXJjZTsKICBXaGVyZVR5cGVJdGVyYXRvcih0aGlzLl9zb3VyY2UpOwogIGJvb2wgbW92ZU5leHQoKSB7CiAgICB3aGlsZSAoX3NvdXJjZS5tb3ZlTmV4dCgpKSB7CiAgICAgIGlmIChfc291cmNlLmN1cnJlbnQgaXMgVCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBUIGdldCBjdXJyZW50ID0+IF9zb3VyY2UuY3VycmVudDsKfQoKLyoqCiAqIENyZWF0ZXMgZXJyb3JzIHRocm93IGJ5IFtJdGVyYWJsZV0gd2hlbiB0aGUgZWxlbWVudCBjb3VudCBpcyB3cm9uZy4KICovCmFic3RyYWN0IGNsYXNzIEl0ZXJhYmxlRWxlbWVudEVycm9yIHsKICAvKiogRXJyb3IgdGhyb3duIHRocm93biBieSwgZS5nLiwgW0l0ZXJhYmxlLmZpcnN0XSB3aGVuIHRoZXJlIGlzIG5vIHJlc3VsdC4gKi8KICBzdGF0aWMgU3RhdGVFcnJvciBub0VsZW1lbnQoKSA9PiBuZXcgU3RhdGVFcnJvcigiTm8gZWxlbWVudCIpOwogIC8qKiBFcnJvciB0aHJvd24gYnksIGUuZy4sIFtJdGVyYWJsZS5zaW5nbGVdIGlmIHRoZXJl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VGhlc2UgYXJlIHRoZSBhZGRpdGlvbmFsIHBhcnRzIG9mIHRoaXMgcGF0Y2ggbGlicmFyeToKLy8gcGFydCAiY2xhc3NfaWRfZmFzdGEuZGFydCI7Ci8vIHBhcnQgInByaW50X3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJzeW1ib2xfcGF0Y2guZGFydCI7CgpAcGF0Y2gKTGlzdDxUPiBtYWtlTGlzdEZpeGVkTGVuZ3RoPFQ+KExpc3Q8VD4gZ3Jvd2FibGVMaXN0KQogICAgbmF0aXZlICJJbnRlcm5hbF9tYWtlTGlzdEZpeGVkTGVuZ3RoIjsKCkBwYXRjaApMaXN0PFQ+IG1ha2VGaXhlZExpc3RVbm1vZGlmaWFibGU8VD4oTGlzdDxUPiBmaXhlZExlbmd0aExpc3QpCiAgICBuYXRpdmUgIkludGVybmFsX21ha2VGaXhlZExpc3RVbm1vZGlmaWFibGUiOwoKQHBhdGNoCk9iamVjdCBleHRyYWN0VHlwZUFyZ3VtZW50czxUPihUIGluc3RhbmNlLCBGdW5jdGlvbiBleHRyYWN0KQogICAgbmF0aXZlICJJbnRlcm5hbF9leHRyYWN0VHlwZUFyZ3VtZW50cyI7CgpjbGFzcyBWTUxpYnJhcnlIb29rcyB7CiAgLy8gRXhhbXBsZTogImRhcnQ6aXNvbGF0ZSBfVGltZXIuX2ZhY3RvcnkiCiAgc3RhdGljIHZhciB0aW1lckZhY3Rvcnk7CgogIC8vIEV4YW1wbGU6ICJkYXJ0OmlvIF9FdmVudEhhbmRsZXIuX3NlbmREYXRhIgogIHN0YXRpYyB2YXIgZXZlbnRIYW5kbGVyU2VuZERhdGE7CgogIC8vIEEgbnVsbGFyeSBjbG9zdXJlIHRoYXQgYW5zd2VycyB0aGUgY3VycmVudCBjbG9jayB2YWx1ZSBpbiBtaWxsaXNlY29uZHMuCiAgLy8gRXhhbXBsZTogImRhcnQ6aW8gX0V2ZW50SGFuZGxlci5fdGltZXJNaWxsaXNlY29uZENsb2NrIgogIHN0YXRpYyB2YXIgdGltZXJNaWxsaXNlY29uZENsb2NrOwoKICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBSZXNvdXJjZS5yZWFkQXNCeXRlcy4KICBzdGF0aWMgdmFyIHJlc291cmNlUmVhZEFzQnl0ZXM7CgogIC8vIEltcGxlbWVudGF0aW9uIG9mIHBhY2thZ2Ugcm9vdC9tYXAgcHJvdmlzaW9uLgogIHN0YXRpYyB2YXIgcGFja2FnZVJvb3RTdHJpbmc7CiAgc3RhdGljIHZhciBwYWNrYWdlQ29uZmlnU3RyaW5nOwogIHN0YXRpYyB2YXIgcGFja2FnZVJvb3RVcmlGdXR1cmU7CiAgc3RhdGljIHZhciBwYWNrYWdlQ29uZmlnVXJpRnV0dXJlOwogIHN0YXRpYyB2YXIgcmVzb2x2ZVBhY2thZ2VVcmlGdXR1cmU7CgogIHN0YXRpYyB2YXIgX2NvbXB1dGVTY3JpcHRVcmk7CiAgc3RhdGljIHZhciBfY2FjaGVkU2NyaXB0OwogIHN0YXRpYyBzZXQgcGxhdGZvcm1TY3JpcHQodmFyIGYpIHsKICAgIF9jb21wdXRlU2NyaXB0VXJpID0gZjsKICAgIF9jYWNoZWRTY3JpcHQgPSBudWxsOwogIH0KCiAgc3RhdGljIGdldCBwbGF0Zm9ybVNjcmlwdCB7CiAgICBpZiAoX2NhY2hlZFNjcmlwdCA9PSBudWxsICYmIF9jb21wdXRlU2NyaXB0VXJpICE9IG51bGwpIHsKICAgICAgX2NhY2hlZFNjcmlwdCA9IF9jb21wdXRlU2NyaXB0VXJpKCk7CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZFNjcmlwdDsKICB9Cn0KCmZpbmFsIGJvb2wgaXM2NEJpdCA9IF9pbnF1aXJlSXM2NEJpdCgpOwoKYm9vbCBfaW5xdWlyZUlzNjRCaXQoKSBuYXRpdmUgIkludGVybmFsX2lucXVpcmVJczY0Qml0IjsKCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCkBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQpib29sIF9jbGFzc1JhbmdlQ2hlY2soaW50IGNpZCwgaW50IGxvd2VyTGltaXQsIGludCB1cHBlckxpbWl0KSB7CiAgcmV0dXJuIGNpZCA+PSBsb3dlckxpbWl0ICYmIGNpZCA8PSB1cHBlckxpbWl0Owp9CgovLyBVdGlsaXR5IGNsYXNzIG5vdyBvbmx5IHVzZWQgYnkgdGhlIFZNLgpjbGFzcyBMaXN0cyB7CiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgc3RhdGljIHZvaWQgY29weShMaXN0IHNyYywgaW50IHNyY1N0YXJ0LCBMaXN0IGRzdCwgaW50IGRzdFN0YXJ0LCBpbnQgY291bnQpIHsKICAgIGlmIChzcmNTdGFydCA8IGRzdFN0YXJ0KSB7CiAgICAgIGZvciAoaW50IGkgPSBzcmNTdGFydCArIGNvdW50IC0gMSwgaiA9IGRzdFN0YXJ0ICsgY291bnQgLSAxOwogICAgICAgICAgaSA+PSBzcmNTdGFydDsKICAgICAgICAgIGktLSwgai0tKSB7CiAgICAgICAgZHN0W2pdID0gc3JjW2ldOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gc3JjU3RhcnQsIGogPSBkc3RTdGFydDsgaSA8IHNyY1N0YXJ0ICsgY291bnQ7IGkrKywgaisrKSB7CiAgICAgICAgZHN0W2pdID0gc3JjW2ldOwogICAgICB9CiAgICB9CiAgfQp9CgovLyBQcmVwZW5kIHRoZSBwYXJlbnQgdHlwZSBhcmd1bWVudHMgKG1heWJlIG51bGwpIG9mIGxlbmd0aCAncGFyZW50TGVuJyB0byB0aGUKLy8gZnVuY3Rpb24gdHlwZSBhcmd1bWVudHMgKG1heSBiZSBudWxsKS4gVGhlIHJlc3VsdCBpcyBudWxsIGlmIGJvdGggaW5wdXQKLy8gdmVjdG9ycyBhcmUgbnVsbCBvciBpcyBhIG5ld2x5IGFsbG9jYXRlZCBhbmQgY2Fub25pY2FsaXplZCB2ZWN0b3Igb2YgbGVuZ3RoCi8vICd0b3RhbExlbicuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpfcHJlcGVuZFR5cGVBcmd1bWVudHMoZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBwYXJlbnRUeXBlQXJndW1lbnRzLCBwYXJlbnRMZW4sCiAgICB0b3RhbExlbikgbmF0aXZlICJJbnRlcm5hbF9wcmVwZW5kVHlwZUFyZ3VtZW50cyI7CgovLyBDaGVjayB0aGF0IGEgc2V0IG9mIHR5cGUgYXJndW1lbnRzIHNhdGlzZnkgdGhlIHR5cGUgcGFyYW1ldGVyIGJvdW5kcyBvbiBhCi8vIGNsb3N1cmUuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpfYm91bmRzQ2hlY2tGb3JQYXJ0aWFsSW5zdGFudGlhdGlvbihjbG9zdXJlLCB0eXBlQXJncykKICAgIG5hdGl2ZSAiSW50ZXJuYWxfYm91bmRzQ2hlY2tGb3JQYXJ0aWFsSW5zdGFudGlhdGlvbiI7CgovLyBDYWxsZWQgYnkgSVJSZWdFeHBNYWNyb0Fzc2VtYmxlcjo6R3Jvd1N0YWNrLgpJbnQzMkxpc3QgX2dyb3dSZWdFeHBTdGFjayhJbnQzMkxpc3Qgc3RhY2spIHsKICBmaW5hbCBuZXdTdGFjayA9IG5ldyBJbnQzMkxpc3Qoc3RhY2subGVuZ3RoICogMik7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7IGkrKykgewogICAgbmV3U3RhY2tbaV0gPSBzdGFja1tpXTsKICB9CiAgcmV0dXJuIG5ld1N0YWNrOwp9CgovLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHNraXAgaW1wbGljaXQgb3IgZXhwbGljaXQgY2hlY2tlZCBkb3duIGNhc3RzIGluCi8vIHRoZSBwYXJ0cyBvZiB0aGUgY29yZSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIHdoZXJlIHdlIGtub3cgYnkgY29uc3RydWN0aW9uIHRoZQovLyB0eXBlIG9mIGEgdmFsdWUuCi8vCi8vIEltcG9ydGFudDogdGhpcyBpcyB1bnNhZmUgYW5kIG11c3QgYmUgdXNlZCB3aXRoIGNhcmUuClQgdW5zYWZlQ2FzdDxUPihPYmplY3QgdikgbmF0aXZlICJJbnRlcm5hbF91bnNhZmVDYXN0IjsKfgBOTjwBTU9LKwEgASkBOh8cHQEHNSsBBz4xAQc9LAEXLRsBMCMBTT0kAS0iATMgIiMlJgEgHCUbGgQBHj4rBhoEAgEoATkBIiYcQTECASoOHlAfQxkWGQgNTRkIBgQCAU9LTw8iTTYBTQwiNzoBMC40KxwEEwIBUFIUAzk4AShkYXJ0Ol9pbnRlcm5hbC1wYXRjaC9pbnRlcm5hbF9wYXRjaC5kYXJ0M29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvY2xhc3NfaWRfZmFzdGEuZGFydIOlLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImludGVybmFsX3BhdGNoLmRhcnQiOwoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBDbGFzc0lEIHsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgc3RhdGljIGludCBnZXRJRChPYmplY3QgdmFsdWUpIG5hdGl2ZSAiQ2xhc3NJRF9nZXRJRCI7CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBzdGF0aWMgZmluYWwgaW50IGNpZEFycmF5ID0gMDsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgc3RhdGljIGZpbmFsIGludCBjaWRFeHRlcm5hbE9uZUJ5dGVTdHJpbmcgPSAwOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBzdGF0aWMgZmluYWwgaW50IGNpZEdyb3dhYmxlT2JqZWN0QXJyYXkgPSAwOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBzdGF0aWMgZmluYWwgaW50IGNpZEltbXV0YWJsZUFycmF5ID0gMDsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgc3RhdGljIGZpbmFsIGludCBjaWRPbmVCeXRlU3RyaW5nID0gMDsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgc3RhdGljIGZpbmFsIGludCBjaWRUd29CeXRlU3RyaW5nID0gMDsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgc3RhdGljIGZpbmFsIGludCBjaWRVaW50OEFycmF5VmlldyA9IDA7Cn0KHQBOTjwBIgEaECQ0OQEcIRwxHC8cKhwpHCkcKgIBKGRhcnQ6X2ludGVybmFsLXBhdGNoL2NsYXNzX2lkX2Zhc3RhLmRhcnQvb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2ludGVybmFsL3BhdGNoLmRhcnSBPS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mICJkYXJ0Ol9pbnRlcm5hbCI7CgpjbGFzcyBfUGF0Y2ggewogIGNvbnN0IF9QYXRjaCgpOwp9Cgpjb25zdCBfUGF0Y2ggcGF0Y2ggPSBjb25zdCBfUGF0Y2goKTsKDQBOTjwBGgEPEgIBJQEfZGFydDpfaW50ZXJuYWwtcGF0Y2gvcGF0Y2guZGFydDRvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW50ZXJuYWwvYXN5bmNfY2FzdC5kYXJ0jWAvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll9pbnRlcm5hbDsKCi8vIENhc3Rpbmcgd3JhcHBlcnMgZm9yIGFzeW5jaHJvbm91cyBjbGFzc2VzLgoKY2xhc3MgQ2FzdFN0cmVhbTxTLCBUPiBleHRlbmRzIFN0cmVhbTxUPiB7CiAgZmluYWwgU3RyZWFtPFM+IF9zb3VyY2U7CiAgQ2FzdFN0cmVhbSh0aGlzLl9zb3VyY2UpOwogIGJvb2wgZ2V0IGlzQnJvYWRjYXN0ID0+IF9zb3VyY2UuaXNCcm9hZGNhc3Q7CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBsaXN0ZW4odm9pZCBvbkRhdGEoVCBkYXRhKSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIHJldHVybiBuZXcgQ2FzdFN0cmVhbVN1YnNjcmlwdGlvbjxTLCBUPigKICAgICAgICBfc291cmNlLmxpc3RlbihudWxsLCBvbkRvbmU6IG9uRG9uZSwgY2FuY2VsT25FcnJvcjogY2FuY2VsT25FcnJvcikpCiAgICAgIC4ub25EYXRhKG9uRGF0YSkKICAgICAgLi5vbkVycm9yKG9uRXJyb3IpOwogIH0KCiAgU3RyZWFtPFI+IGNhc3Q8Uj4oKSA9PiBuZXcgQ2FzdFN0cmVhbTxTLCBSPihfc291cmNlKTsKfQoKY2xhc3MgQ2FzdFN0cmVhbVN1YnNjcmlwdGlvbjxTLCBUPiBpbXBsZW1lbnRzIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiB7CiAgZmluYWwgU3RyZWFtU3Vic2NyaXB0aW9uPFM+IF9zb3VyY2U7CgogIC8vLyBab25lIHdoZXJlIGxpc3RlbiB3YXMgY2FsbGVkLgogIGZpbmFsIFpvbmUgX3pvbmUgPSBab25lLmN1cnJlbnQ7CgogIC8vLyBVc2VyJ3MgZGF0YSBoYW5kbGVyLiBNYXkgYmUgbnVsbC4KICB2b2lkIEZ1bmN0aW9uKFQpIF9oYW5kbGVEYXRhOwoKICAvLy8gQ29weSBvZiBfc291cmNlJ3MgaGFuZGxlRXJyb3Igc28gd2UgY2FuIHJlcG9ydCBlcnJvcnMgaW4gb25EYXRhLgogIC8vLyBNYXkgYmUgbnVsbC4KICBGdW5jdGlvbiBfaGFuZGxlRXJyb3I7CgogIENhc3RTdHJlYW1TdWJzY3JpcHRpb24odGhpcy5fc291cmNlKSB7CiAgICBfc291cmNlLm9uRGF0YShfb25EYXRhKTsKICB9CgogIEZ1dHVyZSBjYW5jZWwoKSA9PiBfc291cmNlLmNhbmNlbCgpOwoKICB2b2lkIG9uRGF0YSh2b2lkIGhhbmRsZURhdGEoVCBkYXRhKSkgewogICAgX2hhbmRsZURhdGEgPSBoYW5kbGVEYXRhID09IG51bGwKICAgICAgICA/IG51bGwKICAgICAgICA6IF96b25lLnJlZ2lzdGVyVW5hcnlDYWxsYmFjazxkeW5hbWljLCBUPihoYW5kbGVEYXRhKTsKICB9CgogIHZvaWQgb25FcnJvcihGdW5jdGlvbiBoYW5kbGVFcnJvcikgewogICAgX3NvdXJjZS5vbkVycm9yKGhhbmRsZUVycm9yKTsKICAgIGlmIChoYW5kbGVFcnJvciA9PSBudWxsKSB7CiAgICAgIF9oYW5kbGVFcnJvciA9IG51bGw7CiAgICB9IGVsc2UgaWYgKGhhbmRsZUVycm9yIGlzIEZ1bmN0aW9uKE51bGwsIE51bGwpKSB7CiAgICAgIF9oYW5kbGVFcnJvciA9IF96b25lCiAgICAgICAgICAucmVnaXN0ZXJCaW5hcnlDYWxsYmFjazxkeW5hbWljLCBPYmplY3QsIFN0YWNrVHJhY2U+KGhhbmRsZUVycm9yKTsKICAgIH0gZWxzZSB7CiAgICAgIF9oYW5kbGVFcnJvciA9IF96b25lLnJlZ2lzdGVyVW5hcnlDYWxsYmFjazxkeW5hbWljLCBPYmplY3Q+KGhhbmRsZUVycm9yKTsKICAgIH0KICB9CgogIHZvaWQgb25Eb25lKHZvaWQgaGFuZGxlRG9uZSgpKSB7CiAgICBfc291cmNlLm9uRG9uZShoYW5kbGVEb25lKTsKICB9CgogIHZvaWQgX29uRGF0YShTIGRhdGEpIHsKICAgIGlmIChfaGFuZGxlRGF0YSA9PSBudWxsKSByZXR1cm47CiAgICBUIHRhcmdldERhdGE7CiAgICB0cnkgewogICAgICB0YXJnZXREYXRhID0gZGF0YSBhcyBUOwogICAgfSBjYXRjaCAoZXJyb3IsIHN0YWNrKSB7CiAgICAgIGlmIChfaGFuZGxlRXJyb3IgPT0gbnVsbCkgewogICAgICAgIF96b25lLmhhbmRsZVVuY2F1Z2h0RXJyb3IoZXJyb3IsIHN0YWNrKTsKICAgICAgfSBlbHNlIGlmIChfaGFuZGxlRXJyb3IgaXMgRnVuY3Rpb24oTnVsbCwgTnVsbCkpIHsKICAgICAgICBfem9uZS5ydW5CaW5hcnlHdWFyZGVkKF9oYW5kbGVFcnJvciwgZXJyb3IsIHN0YWNrKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfem9uZS5ydW5VbmFyeUd1YXJkZWQoX2hhbmRsZUVycm9yLCBlcnJvcik7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgX3pvbmUucnVuVW5hcnlHdWFyZGVkKF9oYW5kbGVEYXRhLCB0YXJnZXREYXRhKTsKICB9CgogIHZvaWQgcGF1c2UoW0Z1dHVyZSByZXN1bWVTaWduYWxdKSB7CiAgICBfc291cmNlLnBhdXNlKHJlc3VtZVNpZ25hbCk7CiAgfQoKICB2b2lkIHJlc3VtZSgpIHsKICAgIF9zb3VyY2UucmVzdW1lKCk7CiAgfQoKICBib29sIGdldCBpc1BhdXNlZCA9PiBfc291cmNlLmlzUGF1c2VkOwoKICBGdXR1cmU8RT4gYXNGdXR1cmU8RT4oW0UgZnV0dXJlVmFsdWVdKSA9PiBfc291cmNlLmFzRnV0dXJlPEU+KGZ1dHVyZVZhbHVlKTsKfQoKY2xhc3MgQ2FzdFN0cmVhbVRyYW5zZm9ybWVyPFNTLCBTVCwgVFMsIFRUPgogICAgZXh0ZW5kcyBTdHJlYW1UcmFuc2Zvcm1lckJhc2U8VFMsIFRUPiB7CiAgZmluYWwgU3RyZWFtVHJhbnNmb3JtZXI8U1MsIFNUPiBfc291cmNlOwogIENhc3RTdHJlYW1UcmFuc2Zvcm1lcih0aGlzLl9zb3VyY2UpOwoKICBTdHJlYW1UcmFuc2Zvcm1lcjxSUywgUlQ+IGNhc3Q8UlMsIFJUPigpID0+CiAgICAgIG5ldyBDYXN0U3RyZWFtVHJhbnNmb3JtZXI8U1MsIFNULCBSUywgUlQ+KF9zb3VyY2UpOwogIFN0cmVhbTxUVD4gYmluZChTdHJlYW08VFM+IHN0cmVhbSkgPT4KICAgICAgX3NvdXJjZS5iaW5kKHN0cmVhbS5jYXN0PFNTPigpKS5jYXN0PFRUPigpOwp9CgpjbGFzcyBDYXN0Q29udmVydGVyPFNTLCBTVCwgVFMsIFRUPiBleHRlbmRzIENvbnZlcnRlcjxUUywgVFQ+IHsKICBmaW5hbCBDb252ZXJ0ZXI8U1MsIFNUPiBfc291cmNlOwogIENhc3RDb252ZXJ0ZXIodGhpcy5fc291cmNlKTsKCiAgVFQgY29udmVydChUUyBpbnB1dCkgPT4gX3NvdXJjZS5jb252ZXJ0KGlucHV0IGFzIFNTKSBhcyBUVDsKCiAgLy8gY2FzdCBpcyBpbmhlcml0ZWQgZnJvbSBDb252ZXJ0ZXIuCgogIFN0cmVhbTxUVD4gYmluZChTdHJlYW08VFM+IHN0cmVhbSkgPT4KICAgICAgX3NvdXJjZS5iaW5kKHN0cmVhbS5jYXN0PFNTPigpKS5jYXN0PFRUPigpOwoKICBDb252ZXJ0ZXI8UlMsIFJUPiBjYXN0PFJTLCBSVD4oKSA9PgogICAgICBuZXcgQ2FzdENvbnZlcnRlcjxTUywgU1QsIFJTLCBSVD4oX3NvdXJjZSk7Cn0KewBOTjwBGAEuASsbHC8BND8tTBcaBAE4AgFGJwEkIwEoIAFHExkBKR0EAScBKSUPPwQBJyIfGzYbTQ1QBgQBIyAEARklEgoeHSIxOTwPNAgOBjQEASYhBAESFgQBKQFOAgEsLCsnAS46KDICAUAjHwE+AScBKDIBJjICAR5kYXJ0Ol9pbnRlcm5hbC9hc3luY19jYXN0LmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2ludGVybmFsL2Nhc3QuZGFydKZKLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5faW50ZXJuYWw7CgovLyBDYXN0aW5nIHdyYXBwZXJzIGZvciBjb2xsZWN0aW9uIGNsYXNzZXMuCgphYnN0cmFjdCBjbGFzcyBfQ2FzdEl0ZXJhYmxlQmFzZTxTLCBUPiBleHRlbmRzIEl0ZXJhYmxlPFQ+IHsKICBJdGVyYWJsZTxTPiBnZXQgX3NvdXJjZTsKCiAgSXRlcmF0b3I8VD4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBDYXN0SXRlcmF0b3I8UywgVD4oX3NvdXJjZS5pdGVyYXRvcik7CgogIC8vIFRoZSBmb2xsb3dpbmcgbWVtYmVycyB1c2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb24gdGhlCiAgLy8gdGhyb3dpbmcgaXRlcmF0b3IuIFRoZXNlIGFyZSBhbGwgb3BlcmF0aW9ucyB0aGF0IGhhdmUgbm8gbW9yZSBlZmZpY2llbnQKICAvLyBpbXBsZW1lbnRhdGlvbiB0aGFuIHZpc2l0aW5nIGV2ZXJ5IGVsZW1lbnQgaW4gb3JkZXIsCiAgLy8gb3IgdGhhdCBoYXMgbm8gbW9yZSBlZmZpY2llbnQgd2F5IHRvIGdldCB0aGUgY29ycmVjdCB0eXBlICh0b0xpc3QsIHRvU2V0KS4KICAvLwogIC8vICogbWFwCiAgLy8gKiB3aGVyZQogIC8vICogZXhwYW5kCiAgLy8gKiBmb3JFYWNoCiAgLy8gKiByZWR1Y2UKICAvLyAqIGZvbGQKICAvLyAqIGV2ZXJ5CiAgLy8gKiBhbnkKICAvLyAqIGpvaW4KICAvLyAqIHRvTGlzdAogIC8vICogdG9TZXQKICAvLyAqIHNraXBXaGlsZQogIC8vICogdGFrZVdoaWxlCiAgLy8gKiBmaXJzdFdoZXJlCiAgLy8gKiBzaW5nbGVXaGVyZQoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfc291cmNlLmxlbmd0aDsKICBib29sIGdldCBpc0VtcHR5ID0+IF9zb3VyY2UuaXNFbXB0eTsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9zb3VyY2UuaXNOb3RFbXB0eTsKCiAgSXRlcmFibGU8VD4gc2tpcChpbnQgY291bnQpID0+IG5ldyBDYXN0SXRlcmFibGU8UywgVD4oX3NvdXJjZS5za2lwKGNvdW50KSk7CiAgSXRlcmFibGU8VD4gdGFrZShpbnQgY291bnQpID0+IG5ldyBDYXN0SXRlcmFibGU8UywgVD4oX3NvdXJjZS50YWtlKGNvdW50KSk7CgogIFQgZWxlbWVudEF0KGludCBpbmRleCkgPT4gX3NvdXJjZS5lbGVtZW50QXQoaW5kZXgpIGFzIFQ7CiAgVCBnZXQgZmlyc3QgPT4gX3NvdXJjZS5maXJzdCBhcyBUOwogIFQgZ2V0IGxhc3QgPT4gX3NvdXJjZS5sYXN0IGFzIFQ7CiAgVCBnZXQgc2luZ2xlID0+IF9zb3VyY2Uuc2luZ2xlIGFzIFQ7CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IG90aGVyKSA9PiBfc291cmNlLmNvbnRhaW5zKG90aGVyKTsKCiAgLy8gTWlnaHQgYmUgaW1wbGVtZW50ZWQgYnkgdGVzdGluZyBiYWNrd2FyZHMgZnJvbSB0aGUgZW5kLAogIC8vIHNvIHVzZSB0aGUgX3NvdXJjZSdzIGltcGxlbWVudGF0aW9uLgogIFQgbGFzdFdoZXJlKGJvb2wgdGVzdChUIGVsZW1lbnQpLCB7VCBvckVsc2UoKX0pID0+CiAgICAgIF9zb3VyY2UubGFzdFdoZXJlKChTIGVsZW1lbnQpID0+IHRlc3QoZWxlbWVudCBhcyBUKSwKICAgICAgICAgIG9yRWxzZTogKG9yRWxzZSA9PSBudWxsKSA/IG51bGwgOiAoKSA9PiBvckVsc2UoKSBhcyBTKSBhcyBUOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfc291cmNlLnRvU3RyaW5nKCk7Cn0KCmNsYXNzIENhc3RJdGVyYXRvcjxTLCBUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKICBJdGVyYXRvcjxTPiBfc291cmNlOwogIENhc3RJdGVyYXRvcih0aGlzLl9zb3VyY2UpOwogIGJvb2wgbW92ZU5leHQoKSA9PiBfc291cmNlLm1vdmVOZXh0KCk7CiAgVCBnZXQgY3VycmVudCA9PiBfc291cmNlLmN1cnJlbnQgYXMgVDsKfQoKY2xhc3MgQ2FzdEl0ZXJhYmxlPFMsIFQ+IGV4dGVuZHMgX0Nhc3RJdGVyYWJsZUJhc2U8UywgVD4gewogIGZpbmFsIEl0ZXJhYmxlPFM+IF9zb3VyY2U7CgogIENhc3RJdGVyYWJsZS5fKHRoaXMuX3NvdXJjZSk7CgogIGZhY3RvcnkgQ2FzdEl0ZXJhYmxlKEl0ZXJhYmxlPFM+IHNvdXJjZSkgewogICAgaWYgKHNvdXJjZSBpcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxTPikgewogICAgICByZXR1cm4gbmV3IF9FZmZpY2llbnRMZW5ndGhDYXN0SXRlcmFibGU8UywgVD4oc291cmNlKTsKICAgIH0KICAgIHJldHVybiBuZXcgQ2FzdEl0ZXJhYmxlPFMsIFQ+Ll8oc291cmNlKTsKICB9CgogIEl0ZXJhYmxlPFI+IGNhc3Q8Uj4oKSA9PiBuZXcgQ2FzdEl0ZXJhYmxlPFMsIFI+KF9zb3VyY2UpOwp9CgpjbGFzcyBfRWZmaWNpZW50TGVuZ3RoQ2FzdEl0ZXJhYmxlPFMsIFQ+IGV4dGVuZHMgQ2FzdEl0ZXJhYmxlPFMsIFQ+CiAgICBpbXBsZW1lbnRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPFQ+IHsKICBfRWZmaWNpZW50TGVuZ3RoQ2FzdEl0ZXJhYmxlKEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPFM+IHNvdXJjZSkKICAgICAgOiBzdXBlci5fKHNvdXJjZSk7Cn0KCmFic3RyYWN0IGNsYXNzIF9DYXN0TGlzdEJhc2U8UywgVD4gZXh0ZW5kcyBfQ2FzdEl0ZXJhYmxlQmFzZTxTLCBUPgogICAgd2l0aCBMaXN0TWl4aW48VD4gewogIExpc3Q8Uz4gZ2V0IF9zb3VyY2U7CgogIC8vIFVzaW5nIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZyb20gTGlzdE1peGluOgogIC8vICogcmV2ZXJzZWQKICAvLyAqIHNodWZmbGUKICAvLyAqIGluZGV4T2YKICAvLyAqIGxhc3RJbmRleE9mCiAgLy8gKiBjbGVhcgogIC8vICogc3VibGlzdAogIC8vICogYXNNYXAKCiAgVCBvcGVyYXRvciBbXShpbnQgaW5kZXgpID0+IF9zb3VyY2VbaW5kZXhdIGFzIFQ7CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgVCB2YWx1ZSkgewogICAgX3NvdXJjZVtpbmRleF0gPSB2YWx1ZSBhcyBTOwogIH0KCiAgdm9pZCBzZXQgbGVuZ3RoKGludCBsZW5ndGgpIHsKICAgIF9zb3VyY2UubGVuZ3RoID0gbGVuZ3RoOwogIH0KCiAgdm9pZCBhZGQoVCB2YWx1ZSkgewogICAgX3NvdXJjZS5hZGQodmFsdWUgYXMgUyk7CiAgfQoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxUPiB2YWx1ZXMpIHsKICAgIF9zb3VyY2UuYWRkQWxsKG5ldyBDYXN0SXRlcmFibGU8VCwgUz4odmFsdWVzKSk7CiAgfQoKICB2b2lkIHNvcnQoW2ludCBjb21wYXJlKFQgdjEsIFQgdjIpXSkgewogICAgX3NvdXJjZS5zb3J0KAogICAgICAgIGNvbXBhcmUgPT0gbnVsbCA/IG51bGwgOiAoUyB2MSwgUyB2MikgPT4gY29tcGFyZSh2MSBhcyBULCB2MiBhcyBUKSk7CiAgfQoKICB2b2lkIHNodWZmbGUoW1JhbmRvbSByYW5kb21dKSB7CiAgICBfc291cmNlLnNodWZmbGUocmFuZG9tKTsKICB9CgogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgVCBlbGVtZW50KSB7CiAgICBfc291cmNlLmluc2VydChpbmRleCwgZWxlbWVudCBhcyBTKTsKICB9CgogIHZvaWQgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8VD4gZWxlbWVudHMpIHsKICAgIF9zb3VyY2UuaW5zZXJ0QWxsKGluZGV4LCBuZXcgQ2FzdEl0ZXJhYmxlPFQsIFM+KGVsZW1lbnRzKSk7CiAgfQoKICB2b2lkIHNldEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPFQ+IGVsZW1lbnRzKSB7CiAgICBfc291cmNlLnNldEFsbChpbmRleCwgbmV3IENhc3RJdGVyYWJsZTxULCBTPihlbGVtZW50cykpOwogIH0KCiAgYm9vbCByZW1vdmUoT2JqZWN0IHZhbHVlKSA9PiBfc291cmNlLnJlbW92ZSh2YWx1ZSk7CgogIFQgcmVtb3ZlQXQoaW50IGluZGV4KSA9PiBfc291cmNlLnJlbW92ZUF0KGluZGV4KSBhcyBUOwoKICBUIHJlbW92ZUxhc3QoKSA9PiBfc291cmNlLnJlbW92ZUxhc3QoKSBhcyBUOwoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChUIGVsZW1lbnQpKSB7CiAgICBfc291cmNlLnJlbW92ZVdoZXJlKChTIGVsZW1lbnQpID0+IHRlc3QoZWxlbWVudCBhcyBUKSk7CiAgfQoKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChUIGVsZW1lbnQpKSB7CiAgICBfc291cmNlLnJldGFpbldoZXJlKChTIGVsZW1lbnQpID0+IHRlc3QoZWxlbWVudCBhcyBUKSk7CiAgfQoKICBJdGVyYWJsZTxUPiBnZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpID0+CiAgICAgIG5ldyBDYXN0SXRlcmFibGU8UywgVD4oX3NvdXJjZS5nZXRSYW5nZShzdGFydCwgZW5kKSk7CgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxUPiBpdGVyYWJsZSwgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgX3NvdXJjZS5zZXRSYW5nZShzdGFydCwgZW5kLCBuZXcgQ2FzdEl0ZXJhYmxlPFQsIFM+KGl0ZXJhYmxlKSwgc2tpcENvdW50KTsKICB9CgogIHZvaWQgcmVtb3ZlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBfc291cmNlLnJlbW92ZVJhbmdlKHN0YXJ0LCBlbmQpOwogIH0KCiAgdm9pZCBmaWxsUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBbVCBmaWxsVmFsdWVdKSB7CiAgICBfc291cmNlLmZpbGxSYW5nZShzdGFydCwgZW5kLCBmaWxsVmFsdWUgYXMgUyk7CiAgfQoKICB2b2lkIHJlcGxhY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPFQ+IHJlcGxhY2VtZW50KSB7CiAgICBfc291cmNlLnJlcGxhY2VSYW5nZShzdGFydCwgZW5kLCBuZXcgQ2FzdEl0ZXJhYmxlPFQsIFM+KHJlcGxhY2VtZW50KSk7CiAgfQp9CgpjbGFzcyBDYXN0TGlzdDxTLCBUPiBleHRlbmRzIF9DYXN0TGlzdEJhc2U8UywgVD4gewogIGZpbmFsIExpc3Q8Uz4gX3NvdXJjZTsKICBDYXN0TGlzdCh0aGlzLl9zb3VyY2UpOwoKICBMaXN0PFI+IGNhc3Q8Uj4oKSA9PiBuZXcgQ2FzdExpc3Q8UywgUj4oX3NvdXJjZSk7Cn0KCmNsYXNzIENhc3RTZXQ8UywgVD4gZXh0ZW5kcyBfQ2FzdEl0ZXJhYmxlQmFzZTxTLCBUPiBpbXBsZW1lbnRzIFNldDxUPiB7CiAgZmluYWwgU2V0PFM+IF9zb3VyY2U7CgogIC8vLyBDcmVhdGVzIGEgbmV3IGVtcHR5IHNldCBvZiB0aGUgc2FtZSAqa2luZCogYXMgW19zb3VyY2VdLAogIC8vLyBidXQgd2l0aCBgPFI+YCBhcyB0eXBlIGFyZ3VtZW50LgogIC8vLyBVc2VkIGJ5IFt0b1NldF0gYW5kIFt1bmlvbl0uCiAgZmluYWwgU2V0PFI+IEZ1bmN0aW9uPFI+KCkgX2VtcHR5U2V0OwoKICBDYXN0U2V0KHRoaXMuX3NvdXJjZSwgdGhpcy5fZW1wdHlTZXQpOwoKICBzdGF0aWMgU2V0PFI+IF9kZWZhdWx0RW1wdHlTZXQ8Uj4oKSA9PiBuZXcgU2V0PFI+KCk7CgogIFNldDxSPiBjYXN0PFI+KCkgPT4gbmV3IENhc3RTZXQ8UywgUj4oX3NvdXJjZSwgX2VtcHR5U2V0KTsKICBib29sIGFkZChUIHZhbHVlKSA9PiBfc291cmNlLmFkZCh2YWx1ZSBhcyBTKTsKCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8VD4gZWxlbWVudHMpIHsKICAgIF9zb3VyY2UuYWRkQWxsKG5ldyBDYXN0SXRlcmFibGU8VCwgUz4oZWxlbWVudHMpKTsKICB9CgogIGJvb2wgcmVtb3ZlKE9iamVjdCBvYmplY3QpID0+IF9zb3VyY2UucmVtb3ZlKG9iamVjdCk7CgogIHZvaWQgcmVtb3ZlQWxsKEl0ZXJhYmxlPE9iamVjdD4gb2JqZWN0cykgewogICAgX3NvdXJjZS5yZW1vdmVBbGwob2JqZWN0cyk7CiAgfQoKICB2b2lkIHJldGFpbkFsbChJdGVyYWJsZTxPYmplY3Q+IG9iamVjdHMpIHsKICAgIF9zb3VyY2UucmV0YWluQWxsKG9iamVjdHMpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoVCBlbGVtZW50KSkgewogICAgX3NvdXJjZS5yZW1vdmVXaGVyZSgoUyBlbGVtZW50KSA9PiB0ZXN0KGVsZW1lbnQgYXMgVCkpOwogIH0KCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoVCBlbGVtZW50KSkgewogICAgX3NvdXJjZS5yZXRhaW5XaGVyZSgoUyBlbGVtZW50KSA9PiB0ZXN0KGVsZW1lbnQgYXMgVCkpOwogIH0KCiAgYm9vbCBjb250YWluc0FsbChJdGVyYWJsZTxPYmplY3Q+IG9iamVjdHMpID0+IF9zb3VyY2UuY29udGFpbnNBbGwob2JqZWN0cyk7CgogIFNldDxUPiBpbnRlcnNlY3Rpb24oU2V0PE9iamVjdD4gb3RoZXIpIHsKICAgIGlmIChfZW1wdHlTZXQgIT0gbnVsbCkgcmV0dXJuIF9jb25kaXRpb25hbEFkZChvdGhlciwgdHJ1ZSk7CiAgICByZXR1cm4gbmV3IENhc3RTZXQ8UywgVD4oX3NvdXJjZS5pbnRlcnNlY3Rpb24ob3RoZXIpLCBudWxsKTsKICB9CgogIFNldDxUPiBkaWZmZXJlbmNlKFNldDxPYmplY3Q+IG90aGVyKSB7CiAgICBpZiAoX2VtcHR5U2V0ICE9IG51bGwpIHJldHVybiBfY29uZGl0aW9uYWxBZGQob3RoZXIsIGZhbHNlKTsKICAgIHJldHVybiBuZXcgQ2FzdFNldDxTLCBUPihfc291cmNlLmRpZmZlcmVuY2Uob3RoZXIpLCBudWxsKTsKICB9CgogIFNldDxUPiBfY29uZGl0aW9uYWxBZGQoU2V0PE9iamVjdD4gb3RoZXIsIGJvb2wgb3RoZXJDb250YWlucykgewogICAgU2V0PFQ+IHJlc3VsdCA9IChfZW1wdHlTZXQgPT0gbnVsbCkgPyBuZXcgU2V0PFQ+KCkgOiBfZW1wdHlTZXQ8VD4oKTsKICAgIGZvciAodmFyIGVsZW1lbnQgaW4gX3NvdXJjZSkgewogICAgICBUIGNhc3RFbGVtZW50ID0gZWxlbWVudCBhcyBUOwogICAgICBpZiAob3RoZXJDb250YWlucyA9PSBvdGhlci5jb250YWlucyhjYXN0RWxlbWVudCkpIHJlc3VsdC5hZGQoY2FzdEVsZW1lbnQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFNldDxUPiB1bmlvbihTZXQ8VD4gb3RoZXIpID0+IF9jbG9uZSgpLi5hZGRBbGwob3RoZXIpOwoKICB2b2lkIGNsZWFyKCkgewogICAgX3NvdXJjZS5jbGVhcigpOwogIH0KCiAgU2V0PFQ+IF9jbG9uZSgpIHsKICAgIFNldDxUPiByZXN1bHQgPSAoX2VtcHR5U2V0ID09IG51bGwpID8gbmV3IFNldDxUPigpIDogX2VtcHR5U2V0PFQ+KCk7CiAgICByZXN1bHQuYWRkQWxsKHRoaXMpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFNldDxUPiB0b1NldCgpID0+IF9jbG9uZSgpOwoKICBUIGxvb2t1cChPYmplY3Qga2V5KSA9PiBfc291cmNlLmxvb2t1cChrZXkpIGFzIFQ7Cn0KCmNsYXNzIENhc3RNYXA8U0ssIFNWLCBLLCBWPiBleHRlbmRzIE1hcEJhc2U8SywgVj4gewogIGZpbmFsIE1hcDxTSywgU1Y+IF9zb3VyY2U7CgogIENhc3RNYXAodGhpcy5fc291cmNlKTsKCiAgTWFwPFJLLCBSVj4gY2FzdDxSSywgUlY+KCkgPT4gbmV3IENhc3RNYXA8U0ssIFNWLCBSSywgUlY+KF9zb3VyY2UpOwoKICBib29sIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSA9PiBfc291cmNlLmNvbnRhaW5zVmFsdWUodmFsdWUpOwoKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpID0+IF9zb3VyY2UuY29udGFpbnNLZXkoa2V5KTsKCiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KSA9PiBfc291cmNlW2tleV0gYXMgVjsKCiAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpIHsKICAgIF9zb3VyY2Vba2V5IGFzIFNLXSA9IHZhbHVlIGFzIFNWOwogIH0KCiAgViBwdXRJZkFic2VudChLIGtleSwgViBpZkFic2VudCgpKSA9PiBfc291cmNlLnB1dElmQWJzZW50KAogICAgICBrZXkgYXMgU0ssIChpZkFic2VudCA9PSBudWxsKSA/IG51bGwgOiAoKSA9PiBpZkFic2VudCgpIGFzIFNWKSBhcyBWOwoKICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIF9zb3VyY2UuYWRkQWxsKG5ldyBDYXN0TWFwPEssIFYsIFNLLCBTVj4ob3RoZXIpKTsKICB9CgogIFYgcmVtb3ZlKE9iamVjdCBrZXkpID0+IF9zb3VyY2UucmVtb3ZlKGtleSkgYXMgVjsKCiAgdm9pZCBjbGVhcigpIHsKICAgIF9zb3VyY2UuY2xlYXIoKTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBfc291cmNlLmZvckVhY2goKFNLIGtleSwgU1YgdmFsdWUpIHsKICAgICAgZihrZXkgYXMgSywgdmFsdWUgYXMgVik7CiAgICB9KTsKICB9CgogIEl0ZXJhYmxlPEs+IGdldCBrZXlzID0+IG5ldyBDYXN0SXRlcmFibGU8U0ssIEs+KF9zb3VyY2Uua2V5cyk7CgogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgPT4gbmV3IENhc3RJdGVyYWJsZTxTViwgVj4oX3NvdXJjZS52YWx1ZXMpOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfc291cmNlLmxlbmd0aDsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfc291cmNlLmlzRW1wdHk7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX3NvdXJjZS5pc05vdEVtcHR5OwoKICBWIHVwZGF0ZShLIGtleSwgViB1cGRhdGUoViB2YWx1ZSksIHtWIGlmQWJzZW50KCl9KSB7CiAgICByZXR1cm4gX3NvdXJjZS51cGRhdGUoa2V5IGFzIFNLLCAoU1YgdmFsdWUpID0+IHVwZGF0ZSh2YWx1ZSBhcyBWKSBhcyBTViwKICAgICAgICBpZkFic2VudDogKGlmQWJzZW50ID09IG51bGwpID8gbnVsbCA6ICgpID0+IGlmQWJzZW50KCkgYXMgU1YpIGFzIFY7CiAgfQoKICB2b2lkIHVwZGF0ZUFsbChWIHVwZGF0ZShLIGtleSwgViB2YWx1ZSkpIHsKICAgIF9zb3VyY2UudXBkYXRlQWxsKChTSyBrZXksIFNWIHZhbHVlKSA9PiB1cGRhdGUoa2V5IGFzIEssIHZhbHVlIGFzIFYpIGFzIFNWKTsKICB9CgogIEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBnZXQgZW50cmllcyB7CiAgICByZXR1cm4gX3NvdXJjZS5lbnRyaWVzLm1hcDxNYXBFbnRyeTxLLCBWPj4oCiAgICAgICAgKE1hcEVudHJ5PFNLLCBTVj4gZSkgPT4gbmV3IE1hcEVudHJ5PEssIFY+KGUua2V5IGFzIEssIGUudmFsdWUgYXMgVikpOwogIH0KCiAgdm9pZCBhZGRFbnRyaWVzKEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBlbnRyaWVzKSB7CiAgICBmb3IgKHZhciBlbnRyeSBpbiBlbnRyaWVzKSB7CiAgICAgIF9zb3VyY2VbZW50cnkua2V5IGFzIFNLXSA9IGVudHJ5LnZhbHVlIGFzIFNWOwogICAgfQogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBfc291cmNlLnJlbW92ZVdoZXJlKChTSyBrZXksIFNWIHZhbHVlKSA9PiB0ZXN0KGtleSBhcyBLLCB2YWx1ZSBhcyBWKSk7CiAgfQp9CgpjbGFzcyBDYXN0UXVldWU8UywgVD4gZXh0ZW5kcyBfQ2FzdEl0ZXJhYmxlQmFzZTxTLCBUPiBpbXBsZW1lbnRzIFF1ZXVlPFQ+IHsKICBmaW5hbCBRdWV1ZTxTPiBfc291cmNlOwogIENhc3RRdWV1ZSh0aGlzLl9zb3VyY2UpOwogIFF1ZXVlPFI+IGNhc3Q8Uj4oKSA9PiBuZXcgQ2FzdFF1ZXVlPFMsIFI+KF9zb3VyY2UpOwoKICBUIHJlbW92ZUZpcnN0KCkgPT4gX3NvdXJjZS5yZW1vdmVGaXJzdCgpIGFzIFQ7CiAgVCByZW1vdmVMYXN0KCkgPT4gX3NvdXJjZS5yZW1vdmVMYXN0KCkgYXMgVDsKCiAgdm9pZCBhZGQoVCB2YWx1ZSkgewogICAgX3NvdXJjZS5hZGQodmFsdWUgYXMgUyk7CiAgfQoKICB2b2lkIGFkZEZpcnN0KFQgdmFsdWUpIHsKICAgIF9zb3VyY2UuYWRkRmlyc3QodmFsdWUgYXMgUyk7CiAgfQoKICB2b2lkIGFkZExhc3QoVCB2YWx1ZSkgewogICAgX3NvdXJjZS5hZGRMYXN0KHZhbHVlIGFzIFMpOwogIH0KCiAgYm9vbCByZW1vdmUoT2JqZWN0IG90aGVyKSA9PiBfc291cmNlLnJlbW92ZShvdGhlcik7CiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8VD4gZWxlbWVudHMpIHsKICAgIF9zb3VyY2UuYWRkQWxsKG5ldyBDYXN0SXRlcmFibGU8VCwgUz4oZWxlbWVudHMpKTsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KFQgZWxlbWVudCkpIHsKICAgIF9zb3VyY2UucmVtb3ZlV2hlcmUoKFMgZWxlbWVudCkgPT4gdGVzdChlbGVtZW50IGFzIFQpKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KFQgZWxlbWVudCkpIHsKICAgIF9zb3VyY2UucmV0YWluV2hlcmUoKFMgZWxlbWVudCkgPT4gdGVzdChlbGVtZW50IGFzIFQpKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfc291cmNlLmNsZWFyKCk7CiAgfQp9CoFrAE5OPAEYASwBPRsBSAFBTTpQBQsNDg8ODA0LDA4NERESEwEkJy0BTk4BOyUjJwE6AT0qNTtHASsCATIXHikpAgE7HQEgAS0wPQYtBAE8AgFELEIZAgFDGBcBNhAPDxMNDw0BMwEqIQQBIB0EARYdBAEkNAQBKRJNBAEiHQQBJikEATRABAExPQQBNgE5AS8BKzwEASs8BAEuPAFRTwQBKSUEATYzBAFDSwQCATMZGgE0AgFIGAE/JyMoASkBNwE9MAEmNgQBOAEtIAQBLSAEASs8BAErPAQBTgErQEEEASlBPwQBQkkjJFEGEwQBOQERFQQBFEkZEwQBHgE0AgE0HQEZAUYBRAE8ATIBJiYEAT1LASE2BAE0AREVBAEpKR8IBAFBAUUBJAEnAS0BN01MBAEtUQQBKTBPBAE2ITQGBAEwSwQCAUwaGzYBMS8BFh0EARsiBAEaIQQBNiY2BAErPAQBKzwEAREVBAIBGGRhcnQ6X2ludGVybmFsL2Nhc3QuZGFydC5vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW50ZXJuYWwvbGlzdC5kYXJ0rtEvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll9pbnRlcm5hbDsKCi8qKgogKiBNaXhpbiB0aGF0IHRocm93cyBvbiB0aGUgbGVuZ3RoIGNoYW5naW5nIG9wZXJhdGlvbnMgb2YgW0xpc3RdLgogKgogKiBJbnRlbmRlZCB0byBtaXgtaW4gb24gdG9wIG9mIFtMaXN0TWl4aW5dIGZvciBmaXhlZC1sZW5ndGggbGlzdHMuCiAqLwphYnN0cmFjdCBjbGFzcyBGaXhlZExlbmd0aExpc3RNaXhpbjxFPiB7CiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYSBmaXhlZCBsZW5ndGggbGlzdC4gKi8KICBzZXQgbGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJDYW5ub3QgY2hhbmdlIHRoZSBsZW5ndGggb2YgYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYSBmaXhlZCBsZW5ndGggbGlzdC4gKi8KICB2b2lkIGFkZChFIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhIGZpeGVkIGxlbmd0aCBsaXN0LiAqLwogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRSB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYSBmaXhlZCBsZW5ndGggbGlzdC4gKi8KICB2b2lkIGluc2VydEFsbChpbnQgYXQsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhIGZpeGVkIGxlbmd0aCBsaXN0LiAqLwogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhIGZpeGVkIGxlbmd0aCBsaXN0LiAqLwogIGJvb2wgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGEgZml4ZWQgbGVuZ3RoIGxpc3QuICovCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhIGZpeGVkIGxlbmd0aCBsaXN0LiAqLwogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYSBmaXhlZCBsZW5ndGggbGlzdC4gKi8KICB2b2lkIGNsZWFyKCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBjbGVhciBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhIGZpeGVkIGxlbmd0aCBsaXN0LiAqLwogIEUgcmVtb3ZlQXQoaW50IGluZGV4KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGEgZml4ZWQgbGVuZ3RoIGxpc3QuICovCiAgRSByZW1vdmVMYXN0KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhIGZpeGVkIGxlbmd0aCBsaXN0LiAqLwogIHZvaWQgcmVtb3ZlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGEgZml4ZWQgbGVuZ3RoIGxpc3QuICovCiAgdm9pZCByZXBsYWNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQp9CgovKioKICogTWl4aW4gZm9yIGFuIHVubW9kaWZpYWJsZSBbTGlzdF0gY2xhc3MuCiAqCiAqIFRoaXMgb3ZlcnJpZGVzIGFsbCBtdXRhdGluZyBtZXRob2RzIHdpdGggbWV0aG9kcyB0aGF0IHRocm93LgogKiBUaGlzIG1peGluIGlzIGludGVuZGVkIHRvIGJlIG1peGVkIGluIG9uIHRvcCBvZiBbTGlzdE1peGluXSBvbgogKiB1bm1vZGlmaWFibGUgbGlzdHMuCiAqLwphYnN0cmFjdCBjbGFzcyBVbm1vZGlmaWFibGVMaXN0TWl4aW48RT4gaW1wbGVtZW50cyBMaXN0PEU+IHsKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEUgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICBzZXQgbGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJDYW5ub3QgY2hhbmdlIHRoZSBsZW5ndGggb2YgYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIHNldCBmaXJzdChFIGVsZW1lbnQpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICBzZXQgbGFzdChFIGVsZW1lbnQpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIHNldEFsbChpbnQgYXQsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCBhZGQoRSB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRSBlbGVtZW50KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCBpbnNlcnRBbGwoaW50IGF0LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgYm9vbCByZW1vdmUoT2JqZWN0IGVsZW1lbnQpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgc29ydChbQ29tcGFyYXRvcjxFPiBjb21wYXJlXSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgc2h1ZmZsZShbUmFuZG9tIHJhbmRvbV0pIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIGNsZWFyKCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBjbGVhciBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgRSByZW1vdmVBdChpbnQgaW5kZXgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIEUgcmVtb3ZlTGFzdCgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiBpdGVyYWJsZSwgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgcmVtb3ZlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIHJlcGxhY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtFIGZpbGxWYWx1ZV0pIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQp9CgovKioKICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBmaXhlZC1sZW5ndGggbGlzdC4KICoKICogQWxsIG9wZXJhdGlvbnMgYXJlIGRlZmluZWQgaW4gdGVybXMgb2YgYGxlbmd0aGAsIGBvcGVyYXRvcltdYCBhbmQKICogYG9wZXJhdG9yW109YCwgd2hpY2ggbmVlZCB0byBiZSBpbXBsZW1lbnRlZC4KICovCmFic3RyYWN0IGNsYXNzIEZpeGVkTGVuZ3RoTGlzdEJhc2U8RT4gPSBMaXN0QmFzZTxFPgogICAgd2l0aCBGaXhlZExlbmd0aExpc3RNaXhpbjxFPjsKCi8qKgogKiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhbiB1bm1vZGlmaWFibGUgbGlzdC4KICoKICogQWxsIG9wZXJhdGlvbnMgYXJlIGRlZmluZWQgaW4gdGVybXMgb2YgYGxlbmd0aGAgYW5kIGBvcGVyYXRvcltdYCwKICogd2hpY2ggbmVlZCB0byBiZSBpbXBsZW1lbnRlZC4KICovCmFic3RyYWN0IGNsYXNzIFVubW9kaWZpYWJsZUxpc3RCYXNlPEU+ID0gTGlzdEJhc2U8RT4KICAgIHdpdGggVW5tb2RpZmlhYmxlTGlzdE1peGluPEU+OwoKY2xhc3MgX0xpc3RJbmRpY2VzSXRlcmFibGUgZXh0ZW5kcyBMaXN0SXRlcmFibGU8aW50PiB7CiAgTGlzdCBfYmFja2VkTGlzdDsKCiAgX0xpc3RJbmRpY2VzSXRlcmFibGUodGhpcy5fYmFja2VkTGlzdCk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9iYWNrZWRMaXN0Lmxlbmd0aDsKICBpbnQgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkSW5kZXgoaW5kZXgsIHRoaXMpOwogICAgcmV0dXJuIGluZGV4OwogIH0KfQoKY2xhc3MgTGlzdE1hcFZpZXc8RT4gZXh0ZW5kcyBVbm1vZGlmaWFibGVNYXBCYXNlPGludCwgRT4gewogIExpc3Q8RT4gX3ZhbHVlczsKCiAgTGlzdE1hcFZpZXcodGhpcy5fdmFsdWVzKTsKCiAgRSBvcGVyYXRvciBbXShPYmplY3Qga2V5KSA9PiBjb250YWluc0tleShrZXkpID8gX3ZhbHVlc1trZXldIDogbnVsbDsKICBpbnQgZ2V0IGxlbmd0aCA9PiBfdmFsdWVzLmxlbmd0aDsKCiAgSXRlcmFibGU8RT4gZ2V0IHZhbHVlcyA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEU+KF92YWx1ZXMsIDAsIG51bGwpOwogIEl0ZXJhYmxlPGludD4gZ2V0IGtleXMgPT4gbmV3IF9MaXN0SW5kaWNlc0l0ZXJhYmxlKF92YWx1ZXMpOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF92YWx1ZXMuaXNFbXB0eTsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF92YWx1ZXMuaXNOb3RFbXB0eTsKICBib29sIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSA9PiBfdmFsdWVzLmNvbnRhaW5zKHZhbHVlKTsKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpID0+IGtleSBpcyBpbnQgJiYga2V5ID49IDAgJiYga2V5IDwgbGVuZ3RoOwoKICB2b2lkIGZvckVhY2godm9pZCBmKGludCBrZXksIEUgdmFsdWUpKSB7CiAgICBpbnQgbGVuZ3RoID0gX3ZhbHVlcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGYoaSwgX3ZhbHVlc1tpXSk7CiAgICAgIGlmIChsZW5ndGggIT0gX3ZhbHVlcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKF92YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQp9CgpjbGFzcyBSZXZlcnNlZExpc3RJdGVyYWJsZTxFPiBleHRlbmRzIExpc3RJdGVyYWJsZTxFPiB7CiAgSXRlcmFibGU8RT4gX3NvdXJjZTsKICBSZXZlcnNlZExpc3RJdGVyYWJsZSh0aGlzLl9zb3VyY2UpOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfc291cmNlLmxlbmd0aDsKCiAgRSBlbGVtZW50QXQoaW50IGluZGV4KSA9PiBfc291cmNlLmVsZW1lbnRBdChfc291cmNlLmxlbmd0aCAtIDEgLSBpbmRleCk7Cn0KCi8qKgogKiBDcmVhdGVzIGVycm9ycyB0aHJvd24gYnkgdW5tb2RpZmlhYmxlIGxpc3RzIHdoZW4gdGhleSBhcmUgYXR0ZW1wdGVkIG1vZGlmaWVkLgogKgogKiBUaGlzIGNsYXNzIGNyZWF0ZXMgW1Vuc3VwcG9ydGVkRXJyb3JdcyB3aXRoIHNwZWNpYWxpemVkIG1lc3NhZ2VzLgogKi8KYWJzdHJhY3QgY2xhc3MgVW5tb2RpZmlhYmxlTGlzdEVycm9yIHsKICAvKiogRXJyb3IgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGFkZCBlbGVtZW50cyB0byBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICBzdGF0aWMgVW5zdXBwb3J0ZWRFcnJvciBhZGQoKSA9PgogICAgICBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byB1bm1vZGlmaWFibGUgTGlzdCIpOwoKICAvKiogRXJyb3IgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGFkZCBlbGVtZW50cyB0byBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICBzdGF0aWMgVW5zdXBwb3J0ZWRFcnJvciBjaGFuZ2UoKSA9PgogICAgICBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGNoYW5nZSB0aGUgY29udGVudCBvZiBhbiB1bm1vZGlmaWFibGUgTGlzdCIpOwoKICAvKiogRXJyb3IgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGNoYW5nZSB0aGUgbGVuZ3RoIG9mIGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHN0YXRpYyBVbnN1cHBvcnRlZEVycm9yIGxlbmd0aCgpID0+CiAgICAgIG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2hhbmdlIGxlbmd0aCBvZiB1bm1vZGlmaWFibGUgTGlzdCIpOwoKICAvKiogRXJyb3IgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHN0YXRpYyBVbnN1cHBvcnRlZEVycm9yIHJlbW92ZSgpID0+CiAgICAgIG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gdW5tb2RpZmlhYmxlIExpc3QiKTsKfQoKLyoqCiAqIENyZWF0ZXMgZXJyb3JzIHRocm93biBieSBub24tZ3Jvd2FibGUgbGlzdHMgd2hlbiB0aGV5IGFyZSBhdHRlbXB0ZWQgbW9kaWZpZWQuCiAqCiAqIFRoaXMgY2xhc3MgY3JlYXRlcyBbVW5zdXBwb3J0ZWRFcnJvcl1zIHdpdGggc3BlY2lhbGl6ZWQgbWVzc2FnZXMuCiAqLwphYnN0cmFjdCBjbGFzcyBOb25Hcm93YWJsZUxpc3RFcnJvciB7CiAgLyoqIEVycm9yIHRocm93biB3aGVuIHRyeWluZyB0byBhZGQgZWxlbWVudHMgdG8gYW4gbm9uLWdyb3dhYmxlIGxpc3QuICovCiAgc3RhdGljIFVuc3VwcG9ydGVkRXJyb3IgYWRkKCkgPT4KICAgICAgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gbm9uLWdyb3dhYmxlIExpc3QiKTsKCiAgLyoqIEVycm9yIHRocm93biB3aGVuIHRyeWluZyB0byBjaGFuZ2UgdGhlIGxlbmd0aCBvZiBhbiBub24tZ3Jvd2FibGUgbGlzdC4gKi8KICBzdGF0aWMgVW5zdXBwb3J0ZWRFcnJvciBsZW5ndGgoKSA9PgogICAgICBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGNoYW5nZSBsZW5ndGggb2Ygbm9uLWdyb3dhYmxlIExpc3QiKTsKCiAgLyoqIEVycm9yIHRocm93biB3aGVuIHRyeWluZyB0byByZW1vdmUgZWxlbWVudHMgZnJvbSBhbiBub24tZ3Jvd2FibGUgbGlzdC4gKi8KICBzdGF0aWMgVW5zdXBwb3J0ZWRFcnJvciByZW1vdmUoKSA9PgogICAgICBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIG5vbi1ncm93YWJsZSBMaXN0Iik7Cn0KCi8qKgogKiBDb252ZXJ0cyBhIGdyb3dhYmxlIGxpc3QgdG8gYSBmaXhlZCBsZW5ndGggbGlzdCB3aXRoIHRoZSBzYW1lIGVsZW1lbnRzLgogKgogKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCiAqIE9ubHkgd29ya3Mgb24gZ3Jvd2FibGUgbGlzdHMgYXMgY3JlYXRlZCBieSBgW11gIG9yIGBuZXcgTGlzdCgpYC4KICogTWF5IHRocm93IG9uIGFueSBvdGhlciBsaXN0LgogKgogKiBUaGUgb3BlcmF0aW9uIGlzIGVmZmljaWVudC4gSXQgZG9lc24ndCBjb3B5IHRoZSBlbGVtZW50cywgYnV0IGNvbnZlcnRzCiAqIHRoZSBleGlzdGluZyBsaXN0IGRpcmVjdGx5IHRvIGEgZml4ZWQgbGVuZ3RoIGxpc3QuCiAqIFRoYXQgbWVhbnMgdGhhdCBpdCBpcyBhIGRlc3RydWN0aXZlIGNvbnZlcnNpb24uCiAqIFRoZSBvcmlnaW5hbCBsaXN0IHNob3VsZCBub3QgYmUgdXNlZCBhZnRlcndhcmRzLgogKgogKiBUaGUgcmV0dXJuZWQgbGlzdCBtYXkgYmUgdGhlIHNhbWUgbGlzdCBhcyB0aGUgb3JpZ2luYWwsCiAqIG9yIGl0IG1heSBiZSBhIGRpZmZlcmVudCBsaXN0IChhY2NvcmRpbmcgdG8gW2lkZW50aWNhbF0pLgogKiBUaGUgb3JpZ2luYWwgbGlzdCBtYXkgaGF2ZSBjaGFuZ2VkIHR5cGUgdG8gYmUgYSBmaXhlZCBsaXN0LAogKiBvciBiZWNvbWUgZW1wdHkgb3IgYmVlbiBvdGhlcndpc2UgbW9kaWZpZWQuCiAqIEl0IHdpbGwgc3RpbGwgYmUgYSB2YWxpZCBvYmplY3QsIHNvIHJlZmVyZW5jZXMgdG8gaXQgd2lsbCBub3QsIGUuZy4sIGNyYXNoCiAqIHRoZSBydW50aW1lIGlmIGFjY2Vzc2VkLCBidXQgbm8gcHJvbWlzZXMgYXJlIG1hZGUgd3J0LiBpdHMgY29udGVudHMuCiAqCiAqIFRoaXMgdW5zcGVjaWZpZWQgYmVoYXZpb3IgaXMgdGhlIHJlYXNvbiB0aGUgZnVuY3Rpb24gaXMgbm90IGV4cG9zZWQgdG8KICogdXNlcnMuIFdlIGFsbG93IHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIHRvIG1ha2UgdGhlIG1vc3QgZWZmaWNpZW50CiAqIGNvbnZlcnNpb24sIGF0IHRoZSBjb3N0IG9mIGxlYXZpbmcgdGhlIG9yaWdpbmFsIGxpc3QgaW4gYW4gdW5zcGVjaWZpZWQKICogc3RhdGUuCiAqLwpleHRlcm5hbCBMaXN0PFQ+IG1ha2VMaXN0Rml4ZWRMZW5ndGg8VD4oTGlzdDxUPiBncm93YWJsZUxpc3QpOwoKLyoqCiAqIENvbnZlcnRzIGEgZml4ZWQtbGVuZ3RoIGxpc3QgdG8gYW4gdW5tb2RpZmlhYmxlIGxpc3QuCiAqCiAqIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICogT25seSB3b3JrcyBmb3IgY29yZSBmaXhlZC1sZW5ndGggbGlzdHMgYXMgY3JlYXRlZCBieSBgbmV3IExpc3QobGVuZ3RoKWAsCiAqIG9yIGFzIHJldHVybmVkIGJ5IFttYWtlTGlzdEZpeGVkTGVuZ3RoXS4KICoKICogVGhlIG9wZXJhdGlvbiBpcyBlZmZpY2llbnQuIEl0IGRvZXNuJ3QgY29weSB0aGUgZWxlbWVudHMsIGJ1dCBjb252ZXJ0cwogKiB0aGUgZXhpc3RpbmcgbGlzdCBkaXJlY3RseSB0byBhIGZpeGVkIGxlbmd0aCBsaXN0LgogKiBUaGF0IG1lYW5zIHRoYXQgaXQgaXMgYSBkZXN0cnVjdGl2ZSBjb252ZXJzaW9uLgogKiBUaGUgb3JpZ2luYWwgbGlzdCBzaG91bGQgbm90IGJlIHVzZWQgYWZ0ZXJ3YXJkcy4KICoKICogVGhlIHVubW9kaWZpYWJsZSBsaXN0IHR5cGUgaXMgc2ltaWxhciB0byB0aGUgb25lIHVzZWQgYnkgY29uc3QgbGlzdHMuCiAqLwpleHRlcm5hbCBMaXN0PFQ+IG1ha2VGaXhlZExpc3RVbm1vZGlmaWFibGU8VD4oTGlzdDxUPiBmaXhlZExlbmd0aExpc3QpOwqBVwBOTjwBGAEEQgNEBClBHiA8BAFBFkUEAUEkRQQBQTFFBAFBJkUEAUEgSgQBQStKBAFBK0oEAUERRAQBQRpKBAFBE0oEAUEpSgQBQUBKBAIBBCsDQEIXBD1CKkYEAUIeID0EARlGBAEYRgQBQi5GBAFCFkYEAUImRgQBQjFGBAFCJkYEAUIgSwQBQitLBAFCK0sEAUInRgQBQiJGBAFCEUUEAUIaSwQBQhNLBAFCUUYEAUIpSwQBQkBLBAFCNkYEAgEEMwNFMAQ0IgEENANFIQQ1IwE3FAEqASgdLRIEAgE7EwEdAUckAUY/ASctP0oBKyEnGCY4CAYEAgE4FyYBJAFLAgEEUQNFBCdLIz8BSyZRAVAmSQFQJkQCAQRRA0UEJksjPwFQJkkBUCZEAgEESwMaRCADSjYzNAM7PT8vTkgDSkxKCgQ/AQQ5AxpMLANKNjM0A0kESAEYZGFydDpfaW50ZXJuYWwvbGlzdC5kYXJ0Lm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pbnRlcm5hbC9zb3J0LmRhcnSvxS8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuX2ludGVybmFsOwoKLyoqCiAqIER1YWwtUGl2b3QgUXVpY2tzb3J0IGFsZ29yaXRobS4KICoKICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBkdWFsLXBpdm90IHF1aWNrc29ydCBhbGdvcml0aG0gYXMgcHJlc2VudGVkIGluCiAqIFZsYWRpbWlyIFlhcm9zbGF2c2tpeSdzIHBhcGVyLgogKgogKiBTb21lIGltcHJvdmVtZW50cyBoYXZlIGJlZW4gY29waWVkIGZyb20gQW5kcm9pZCdzIGltcGxlbWVudGF0aW9uLgogKi8KY2xhc3MgU29ydCB7CiAgLy8gV2hlbiBhIGxpc3QgaGFzIGxlc3MgdGhlbiBbOl9JTlNFUlRJT05fU09SVF9USFJFU0hPTEQ6XSBlbGVtZW50cyBpdCB3aWxsCiAgLy8gYmUgc29ydGVkIGJ5IGFuIGluc2VydGlvbiBzb3J0LgogIHN0YXRpYyBjb25zdCBpbnQgX0lOU0VSVElPTl9TT1JUX1RIUkVTSE9MRCA9IDMyOwoKICAvKioKICAgKiBTb3J0cyBhbGwgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGxpc3QgWzphOl0gYWNjb3JkaW5nIHRvIHRoZSBnaXZlbgogICAqIFs6Y29tcGFyZTpdIGZ1bmN0aW9uLgogICAqCiAgICogVGhlIFs6Y29tcGFyZTpdIGZ1bmN0aW9uIHRha2VzIHR3byBhcmd1bWVudHMgWzp4Ol0gYW5kIFs6eTpdIGFuZCByZXR1cm5zCiAgICogIC0xIGlmIFs6eCA8IHk6XSwKICAgKiAgIDAgaWYgWzp4ID09IHk6XSwgYW5kCiAgICogICAxIGlmIFs6eCA+IHk6XS4KICAgKgogICAqIFRoZSBmdW5jdGlvbidzIGJlaGF2aW9yIG11c3QgYmUgY29uc2lzdGVudC4gSXQgbXVzdCBub3QgcmV0dXJuIGRpZmZlcmVudAogICAqIHJlc3VsdHMgZm9yIHRoZSBzYW1lIHZhbHVlcy4KICAgKi8KICBzdGF0aWMgdm9pZCBzb3J0PEU+KExpc3Q8RT4gYSwgaW50IGNvbXBhcmUoRSBhLCBFIGIpKSB7CiAgICBfZG9Tb3J0KGEsIDAsIGEubGVuZ3RoIC0gMSwgY29tcGFyZSk7CiAgfQoKICAvKioKICAgKiBTb3J0cyBhbGwgZWxlbWVudHMgaW4gdGhlIHJhbmdlIFs6ZnJvbTpdIChpbmNsdXNpdmUpIHRvIFs6dG86XSAoZXhjbHVzaXZlKQogICAqIG9mIHRoZSBnaXZlbiBsaXN0IFs6YTpdLgogICAqCiAgICogSWYgdGhlIGdpdmVuIHJhbmdlIGlzIGludmFsaWQgYW4gIk91dE9mUmFuZ2UiIGVycm9yIGlzIHJhaXNlZC4KICAgKiBUT0RPKGZsb2l0c2NoKTogZG8gd2Ugd2FudCBhbiBlcnJvcj8KICAgKgogICAqIFNlZSBbOnNvcnQ6XSBmb3IgcmVxdWlyZW1lbnRzIG9mIHRoZSBbOmNvbXBhcmU6XSBmdW5jdGlvbi4KICAgKi8KICBzdGF0aWMgdm9pZCBzb3J0UmFuZ2U8RT4oTGlzdDxFPiBhLCBpbnQgZnJvbSwgaW50IHRvLCBpbnQgY29tcGFyZShFIGEsIEUgYikpIHsKICAgIGlmICgoZnJvbSA8IDApIHx8ICh0byA+IGEubGVuZ3RoKSB8fCAodG8gPCBmcm9tKSkgewogICAgICB0aHJvdyAiT3V0T2ZSYW5nZSI7CiAgICB9CiAgICBfZG9Tb3J0KGEsIGZyb20sIHRvIC0gMSwgY29tcGFyZSk7CiAgfQoKICAvKioKICAgKiBTb3J0cyB0aGUgbGlzdCBpbiB0aGUgaW50ZXJ2YWwgWzpsZWZ0Ol0gdG8gWzpyaWdodDpdIChib3RoIGluY2x1c2l2ZSkuCiAgICovCiAgc3RhdGljIHZvaWQgX2RvU29ydDxFPigKICAgICAgTGlzdDxFPiBhLCBpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnQgY29tcGFyZShFIGEsIEUgYikpIHsKICAgIGlmICgocmlnaHQgLSBsZWZ0KSA8PSBfSU5TRVJUSU9OX1NPUlRfVEhSRVNIT0xEKSB7CiAgICAgIF9pbnNlcnRpb25Tb3J0KGEsIGxlZnQsIHJpZ2h0LCBjb21wYXJlKTsKICAgIH0gZWxzZSB7CiAgICAgIF9kdWFsUGl2b3RRdWlja3NvcnQoYSwgbGVmdCwgcmlnaHQsIGNvbXBhcmUpOwogICAgfQogIH0KCiAgc3RhdGljIHZvaWQgX2luc2VydGlvblNvcnQ8RT4oCiAgICAgIExpc3Q8RT4gYSwgaW50IGxlZnQsIGludCByaWdodCwgaW50IGNvbXBhcmUoRSBhLCBFIGIpKSB7CiAgICBmb3IgKGludCBpID0gbGVmdCArIDE7IGkgPD0gcmlnaHQ7IGkrKykgewogICAgICB2YXIgZWwgPSBhW2ldOwogICAgICBpbnQgaiA9IGk7CiAgICAgIHdoaWxlICgoaiA+IGxlZnQpICYmIChjb21wYXJlKGFbaiAtIDFdLCBlbCkgPiAwKSkgewogICAgICAgIGFbal0gPSBhW2ogLSAxXTsKICAgICAgICBqLS07CiAgICAgIH0KICAgICAgYVtqXSA9IGVsOwogICAgfQogIH0KCiAgc3RhdGljIHZvaWQgX2R1YWxQaXZvdFF1aWNrc29ydDxFPigKICAgICAgTGlzdDxFPiBhLCBpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnQgY29tcGFyZShFIGEsIEUgYikpIHsKICAgIGFzc2VydChyaWdodCAtIGxlZnQgPiBfSU5TRVJUSU9OX1NPUlRfVEhSRVNIT0xEKTsKCiAgICAvLyBDb21wdXRlIHRoZSB0d28gcGl2b3RzIGJ5IGxvb2tpbmcgYXQgNSBlbGVtZW50cy4KICAgIGludCBzaXh0aCA9IChyaWdodCAtIGxlZnQgKyAxKSB+LyA2OwogICAgaW50IGluZGV4MSA9IGxlZnQgKyBzaXh0aDsKICAgIGludCBpbmRleDUgPSByaWdodCAtIHNpeHRoOwogICAgaW50IGluZGV4MyA9IChsZWZ0ICsgcmlnaHQpIH4vIDI7IC8vIFRoZSBtaWRwb2ludC4KICAgIGludCBpbmRleDIgPSBpbmRleDMgLSBzaXh0aDsKICAgIGludCBpbmRleDQgPSBpbmRleDMgKyBzaXh0aDsKCiAgICB2YXIgZWwxID0gYVtpbmRleDFdOwogICAgdmFyIGVsMiA9IGFbaW5kZXgyXTsKICAgIHZhciBlbDMgPSBhW2luZGV4M107CiAgICB2YXIgZWw0ID0gYVtpbmRleDRdOwogICAgdmFyIGVsNSA9IGFbaW5kZXg1XTsKCiAgICAvLyBTb3J0IHRoZSBzZWxlY3RlZCA1IGVsZW1lbnRzIHVzaW5nIGEgc29ydGluZyBuZXR3b3JrLgogICAgaWYgKGNvbXBhcmUoZWwxLCBlbDIpID4gMCkgewogICAgICB2YXIgdCA9IGVsMTsKICAgICAgZWwxID0gZWwyOwogICAgICBlbDIgPSB0OwogICAgfQogICAgaWYgKGNvbXBhcmUoZWw0LCBlbDUpID4gMCkgewogICAgICB2YXIgdCA9IGVsNDsKICAgICAgZWw0ID0gZWw1OwogICAgICBlbDUgPSB0OwogICAgfQogICAgaWYgKGNvbXBhcmUoZWwxLCBlbDMpID4gMCkgewogICAgICB2YXIgdCA9IGVsMTsKICAgICAgZWwxID0gZWwzOwogICAgICBlbDMgPSB0OwogICAgfQogICAgaWYgKGNvbXBhcmUoZWwyLCBlbDMpID4gMCkgewogICAgICB2YXIgdCA9IGVsMjsKICAgICAgZWwyID0gZWwzOwogICAgICBlbDMgPSB0OwogICAgfQogICAgaWYgKGNvbXBhcmUoZWwxLCBlbDQpID4gMCkgewogICAgICB2YXIgdCA9IGVsMTsKICAgICAgZWwxID0gZWw0OwogICAgICBlbDQgPSB0OwogICAgfQogICAgaWYgKGNvbXBhcmUoZWwzLCBlbDQpID4gMCkgewogICAgICB2YXIgdCA9IGVsMzsKICAgICAgZWwzID0gZWw0OwogICAgICBlbDQgPSB0OwogICAgfQogICAgaWYgKGNvbXBhcmUoZWwyLCBlbDUpID4gMCkgewogICAgICB2YXIgdCA9IGVsMjsKICAgICAgZWwyID0gZWw1OwogICAgICBlbDUgPSB0OwogICAgfQogICAgaWYgKGNvbXBhcmUoZWwyLCBlbDMpID4gMCkgewogICAgICB2YXIgdCA9IGVsMjsKICAgICAgZWwyID0gZWwzOwogICAgICBlbDMgPSB0OwogICAgfQogICAgaWYgKGNvbXBhcmUoZWw0LCBlbDUpID4gMCkgewogICAgICB2YXIgdCA9IGVsNDsKICAgICAgZWw0ID0gZWw1OwogICAgICBlbDUgPSB0OwogICAgfQoKICAgIHZhciBwaXZvdDEgPSBlbDI7CiAgICB2YXIgcGl2b3QyID0gZWw0OwoKICAgIC8vIGVsMiBhbmQgZWw0IGhhdmUgYmVlbiBzYXZlZCBpbiB0aGUgcGl2b3QgdmFyaWFibGVzLiBUaGV5IHdpbGwgYmUgd3JpdHRlbgogICAgLy8gYmFjaywgb25jZSB0aGUgcGFydGl0aW9uaW5nIGlzIGZpbmlzaGVkLgogICAgYVtpbmRleDFdID0gZWwxOwogICAgYVtpbmRleDNdID0gZWwzOwogICAgYVtpbmRleDVdID0gZWw1OwoKICAgIGFbaW5kZXgyXSA9IGFbbGVmdF07CiAgICBhW2luZGV4NF0gPSBhW3JpZ2h0XTsKCiAgICBpbnQgbGVzcyA9IGxlZnQgKyAxOyAvLyBGaXJzdCBlbGVtZW50IGluIHRoZSBtaWRkbGUgcGFydGl0aW9uLgogICAgaW50IGdyZWF0ID0gcmlnaHQgLSAxOyAvLyBMYXN0IGVsZW1lbnQgaW4gdGhlIG1pZGRsZSBwYXJ0aXRpb24uCgogICAgYm9vbCBwaXZvdHNfYXJlX2VxdWFsID0gKGNvbXBhcmUocGl2b3QxLCBwaXZvdDIpID09IDApOwogICAgaWYgKHBpdm90c19hcmVfZXF1YWwpIHsKICAgICAgdmFyIHBpdm90ID0gcGl2b3QxOwogICAgICAvLyBEZWdlbmVyYXRlZCBjYXNlIHdoZXJlIHRoZSBwYXJ0aXRpb25pbmcgYmVjb21lcyBhIER1dGNoIG5hdGlvbmFsIGZsYWcKICAgICAgLy8gcHJvYmxlbS4KICAgICAgLy8KICAgICAgLy8gWyB8ICA8IHBpdm90ICB8ID09IHBpdm90IHwgdW5wYXJ0aXRpb25lZCB8ID4gcGl2b3QgIHwgXQogICAgICAvLyAgXiAgICAgICAgICAgICBeICAgICAgICAgIF4gICAgICAgICAgICAgXiAgICAgICAgICAgIF4KICAgICAgLy8gbGVmdCAgICAgICAgIGxlc3MgICAgICAgICBrICAgICAgICAgICBncmVhdCAgICAgICAgIHJpZ2h0CiAgICAgIC8vCiAgICAgIC8vIGFbbGVmdF0gYW5kIGFbcmlnaHRdIGFyZSB1bmRlZmluZWQgYW5kIGFyZSBmaWxsZWQgYWZ0ZXIgdGhlCiAgICAgIC8vIHBhcnRpdGlvbmluZy4KICAgICAgLy8KICAgICAgLy8gSW52YXJpYW50czoKICAgICAgLy8gICAxKSBmb3IgeCBpbiBdbGVmdCwgbGVzc1sgOiB4IDwgcGl2b3QuCiAgICAgIC8vICAgMikgZm9yIHggaW4gW2xlc3MsIGtbIDogeCA9PSBwaXZvdC4KICAgICAgLy8gICAzKSBmb3IgeCBpbiBdZ3JlYXQsIHJpZ2h0WyA6IHggPiBwaXZvdC4KICAgICAgZm9yIChpbnQgayA9IGxlc3M7IGsgPD0gZ3JlYXQ7IGsrKykgewogICAgICAgIHZhciBhayA9IGFba107CiAgICAgICAgaW50IGNvbXAgPSBjb21wYXJlKGFrLCBwaXZvdCk7CiAgICAgICAgaWYgKGNvbXAgPT0gMCkgY29udGludWU7CiAgICAgICAgaWYgKGNvbXAgPCAwKSB7CiAgICAgICAgICBpZiAoayAhPSBsZXNzKSB7CiAgICAgICAgICAgIGFba10gPSBhW2xlc3NdOwogICAgICAgICAgICBhW2xlc3NdID0gYWs7CiAgICAgICAgICB9CiAgICAgICAgICBsZXNzKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIGNvbXAgPiAwLgogICAgICAgICAgLy8KICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGVsZW1lbnQgPD0gcGl2b3QgaW4gdGhlIHJhbmdlIFtrIC0gMSwgZ3JlYXRdIGFuZAogICAgICAgICAgLy8gcHV0IFs6YWs6XSB0aGVyZS4gV2Uga25vdyB0aGF0IHN1Y2ggYW4gZWxlbWVudCBtdXN0IGV4aXN0OgogICAgICAgICAgLy8gV2hlbiBrID09IGxlc3MsIHRoZW4gZWwzICh3aGljaCBpcyBlcXVhbCB0byBwaXZvdCkgbGllcyBpbiB0aGUKICAgICAgICAgIC8vIGludGVydmFsLiBPdGhlcndpc2UgYVtrIC0gMV0gPT0gcGl2b3QgYW5kIHRoZSBzZWFyY2ggc3RvcHMgYXQgay0xLgogICAgICAgICAgLy8gTm90ZSB0aGF0IGluIHRoZSBsYXR0ZXIgY2FzZSBpbnZhcmlhbnQgMiB3aWxsIGJlIHZpb2xhdGVkIGZvciBhCiAgICAgICAgICAvLyBzaG9ydCBhbW91bnQgb2YgdGltZS4gVGhlIGludmFyaWFudCB3aWxsIGJlIHJlc3RvcmVkIHdoZW4gdGhlCiAgICAgICAgICAvLyBwaXZvdHMgYXJlIHB1dCBpbnRvIHRoZWlyIGZpbmFsIHBvc2l0aW9ucy4KICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIGNvbXAgPSBjb21wYXJlKGFbZ3JlYXRdLCBwaXZvdCk7CiAgICAgICAgICAgIGlmIChjb21wID4gMCkgewogICAgICAgICAgICAgIGdyZWF0LS07CiAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgb25seSBsb2NhdGlvbiBpbiB0aGUgd2hpbGUtbG9vcCB3aGVyZSBhIG5ldwogICAgICAgICAgICAgIC8vIGl0ZXJhdGlvbiBpcyBzdGFydGVkLgogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7CiAgICAgICAgICAgICAgLy8gVHJpcGxlIGV4Y2hhbmdlLgogICAgICAgICAgICAgIGFba10gPSBhW2xlc3NdOwogICAgICAgICAgICAgIGFbbGVzcysrXSA9IGFbZ3JlYXRdOwogICAgICAgICAgICAgIGFbZ3JlYXQtLV0gPSBhazsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBjb21wID09IDA7CiAgICAgICAgICAgICAgYVtrXSA9IGFbZ3JlYXRdOwogICAgICAgICAgICAgIGFbZ3JlYXQtLV0gPSBhazsKICAgICAgICAgICAgICAvLyBOb3RlOiBpZiBncmVhdCA8IGsgdGhlbiB3ZSB3aWxsIGV4aXQgdGhlIG91dGVyIGxvb3AgYW5kIGZpeAogICAgICAgICAgICAgIC8vIGludmFyaWFudCAyICh3aGljaCB3ZSBqdXN0IHZpb2xhdGVkKS4KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gV2UgcGFydGl0aW9uIHRoZSBsaXN0IGludG8gdGhyZWUgcGFydHM6CiAgICAgIC8vICAxLiA8IHBpdm90MQogICAgICAvLyAgMi4gPj0gcGl2b3QxICYmIDw9IHBpdm90MgogICAgICAvLyAgMy4gPiBwaXZvdDIKICAgICAgLy8KICAgICAgLy8gRHVyaW5nIHRoZSBsb29wIHdlIGhhdmU6CiAgICAgIC8vIFsgfCA8IHBpdm90MSB8ID49IHBpdm90MSAmJiA8PSBwaXZvdDIgfCB1bnBhcnRpdGlvbmVkICB8ID4gcGl2b3QyICB8IF0KICAgICAgLy8gIF4gICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgXiAgICAgICAgICAgICBeCiAgICAgIC8vIGxlZnQgICAgICAgICBsZXNzICAgICAgICAgICAgICAgICAgICAgayAgICAgICAgICAgICAgZ3JlYXQgICAgICAgIHJpZ2h0CiAgICAgIC8vCiAgICAgIC8vIGFbbGVmdF0gYW5kIGFbcmlnaHRdIGFyZSB1bmRlZmluZWQgYW5kIGFyZSBmaWxsZWQgYWZ0ZXIgdGhlCiAgICAgIC8vIHBhcnRpdGlvbmluZy4KICAgICAgLy8KICAgICAgLy8gSW52YXJpYW50czoKICAgICAgLy8gICAxLiBmb3IgeCBpbiBdbGVmdCwgbGVzc1sgOiB4IDwgcGl2b3QxCiAgICAgIC8vICAgMi4gZm9yIHggaW4gW2xlc3MsIGtbIDogcGl2b3QxIDw9IHggJiYgeCA8PSBwaXZvdDIKICAgICAgLy8gICAzLiBmb3IgeCBpbiBdZ3JlYXQsIHJpZ2h0WyA6IHggPiBwaXZvdDIKICAgICAgZm9yIChpbnQgayA9IGxlc3M7IGsgPD0gZ3JlYXQ7IGsrKykgewogICAgICAgIHZhciBhayA9IGFba107CiAgICAgICAgaW50IGNvbXBfcGl2b3QxID0gY29tcGFyZShhaywgcGl2b3QxKTsKICAgICAgICBpZiAoY29tcF9waXZvdDEgPCAwKSB7CiAgICAgICAgICBpZiAoayAhPSBsZXNzKSB7CiAgICAgICAgICAgIGFba10gPSBhW2xlc3NdOwogICAgICAgICAgICBhW2xlc3NdID0gYWs7CiAgICAgICAgICB9CiAgICAgICAgICBsZXNzKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGludCBjb21wX3Bpdm90MiA9IGNvbXBhcmUoYWssIHBpdm90Mik7CiAgICAgICAgICBpZiAoY29tcF9waXZvdDIgPiAwKSB7CiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgaW50IGNvbXAgPSBjb21wYXJlKGFbZ3JlYXRdLCBwaXZvdDIpOwogICAgICAgICAgICAgIGlmIChjb21wID4gMCkgewogICAgICAgICAgICAgICAgZ3JlYXQtLTsKICAgICAgICAgICAgICAgIGlmIChncmVhdCA8IGspIGJyZWFrOwogICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgb25seSBsb2NhdGlvbiBpbnNpZGUgdGhlIGxvb3Agd2hlcmUgYSBuZXcKICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGlvbiBpcyBzdGFydGVkLgogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGFbZ3JlYXRdIDw9IHBpdm90Mi4KICAgICAgICAgICAgICAgIGNvbXAgPSBjb21wYXJlKGFbZ3JlYXRdLCBwaXZvdDEpOwogICAgICAgICAgICAgICAgaWYgKGNvbXAgPCAwKSB7CiAgICAgICAgICAgICAgICAgIC8vIFRyaXBsZSBleGNoYW5nZS4KICAgICAgICAgICAgICAgICAgYVtrXSA9IGFbbGVzc107CiAgICAgICAgICAgICAgICAgIGFbbGVzcysrXSA9IGFbZ3JlYXRdOwogICAgICAgICAgICAgICAgICBhW2dyZWF0LS1dID0gYWs7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAvLyBhW2dyZWF0XSA+PSBwaXZvdDEuCiAgICAgICAgICAgICAgICAgIGFba10gPSBhW2dyZWF0XTsKICAgICAgICAgICAgICAgICAgYVtncmVhdC0tXSA9IGFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gTW92ZSBwaXZvdHMgaW50byB0aGVpciBmaW5hbCBwb3NpdGlvbnMuCiAgICAvLyBXZSBzaHJ1bmsgdGhlIGxpc3QgZnJvbSBib3RoIHNpZGVzIChhW2xlZnRdIGFuZCBhW3JpZ2h0XSBoYXZlCiAgICAvLyBtZWFuaW5nbGVzcyB2YWx1ZXMgaW4gdGhlbSkgYW5kIG5vdyB3ZSBtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGZpcnN0CiAgICAvLyBhbmQgdGhpcmQgcGFydGl0aW9uIGludG8gdGhlc2UgbG9jYXRpb25zIHNvIHRoYXQgd2UgY2FuIHN0b3JlIHRoZQogICAgLy8gcGl2b3RzLgogICAgYVtsZWZ0XSA9IGFbbGVzcyAtIDFdOwogICAgYVtsZXNzIC0gMV0gPSBwaXZvdDE7CiAgICBhW3JpZ2h0XSA9IGFbZ3JlYXQgKyAxXTsKICAgIGFbZ3JlYXQgKyAxXSA9IHBpdm90MjsKCiAgICAvLyBUaGUgbGlzdCBpcyBub3cgcGFydGl0aW9uZWQgaW50byB0aHJlZSBwYXJ0aXRpb25zOgogICAgLy8gWyA8IHBpdm90MSAgIHwgPj0gcGl2b3QxICYmIDw9IHBpdm90MiAgIHwgID4gcGl2b3QyICAgXQogICAgLy8gIF4gICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICBeCiAgICAvLyBsZWZ0ICAgICAgICAgbGVzcyAgICAgICAgICAgICAgICAgICAgIGdyZWF0ICAgICAgICByaWdodAoKICAgIC8vIFJlY3Vyc2l2ZSBkZXNjZW50LiAoRG9uJ3QgaW5jbHVkZSB0aGUgcGl2b3QgdmFsdWVzLikKICAgIF9kb1NvcnQoYSwgbGVmdCwgbGVzcyAtIDIsIGNvbXBhcmUpOwogICAgX2RvU29ydChhLCBncmVhdCArIDIsIHJpZ2h0LCBjb21wYXJlKTsKCiAgICBpZiAocGl2b3RzX2FyZV9lcXVhbCkgewogICAgICAvLyBBbGwgZWxlbWVudHMgaW4gdGhlIHNlY29uZCBwYXJ0aXRpb24gYXJlIGVxdWFsIHRvIHRoZSBwaXZvdC4gTm8KICAgICAgLy8gbmVlZCB0byBzb3J0IHRoZW0uCiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBJbiB0aGVvcnkgaXQgc2hvdWxkIGJlIGVub3VnaCB0byBjYWxsIF9kb1NvcnQgcmVjdXJzaXZlbHkgb24gdGhlIHNlY29uZAogICAgLy8gcGFydGl0aW9uLgogICAgLy8gVGhlIEFuZHJvaWQgc291cmNlIGhvd2V2ZXIgcmVtb3ZlcyB0aGUgcGl2b3QgZWxlbWVudHMgZnJvbSB0aGUgcmVjdXJzaXZlCiAgICAvLyBjYWxsIGlmIHRoZSBzZWNvbmQgcGFydGl0aW9uIGlzIHRvbyBsYXJnZSAobW9yZSB0aGFuIDIvMyBvZiB0aGUgbGlzdCkuCiAgICBpZiAobGVzcyA8IGluZGV4MSAmJiBncmVhdCA+IGluZGV4NSkgewogICAgICB3aGlsZSAoY29tcGFyZShhW2xlc3NdLCBwaXZvdDEpID09IDApIHsKICAgICAgICBsZXNzKys7CiAgICAgIH0KICAgICAgd2hpbGUgKGNvbXBhcmUoYVtncmVhdF0sIHBpdm90MikgPT0gMCkgewogICAgICAgIGdyZWF0LS07CiAgICAgIH0KCiAgICAgIC8vIENvcHkgcGFzdGUgb2YgdGhlIHByZXZpb3VzIDMtd2F5IHBhcnRpdGlvbmluZyB3aXRoIGFkYXB0aW9ucy4KICAgICAgLy8KICAgICAgLy8gV2UgcGFydGl0aW9uIHRoZSBsaXN0IGludG8gdGhyZWUgcGFydHM6CiAgICAgIC8vICAxLiA9PSBwaXZvdDEKICAgICAgLy8gIDIuID4gcGl2b3QxICYmIDwgcGl2b3QyCiAgICAgIC8vICAzLiA9PSBwaXZvdDIKICAgICAgLy8KICAgICAgLy8gRHVyaW5nIHRoZSBsb29wIHdlIGhhdmU6CiAgICAgIC8vIFsgPT0gcGl2b3QxIHwgPiBwaXZvdDEgJiYgPCBwaXZvdDIgfCB1bnBhcnRpdGlvbmVkICB8ID09IHBpdm90MiBdCiAgICAgIC8vICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgIF4KICAgICAgLy8gICAgICAgICAgICBsZXNzICAgICAgICAgICAgICAgICAgICAgayAgICAgICAgICAgICAgZ3JlYXQKICAgICAgLy8KICAgICAgLy8gSW52YXJpYW50czoKICAgICAgLy8gICAxLiBmb3IgeCBpbiBbICosIGxlc3NbIDogeCA9PSBwaXZvdDEKICAgICAgLy8gICAyLiBmb3IgeCBpbiBbbGVzcywga1sgOiBwaXZvdDEgPCB4ICYmIHggPCBwaXZvdDIKICAgICAgLy8gICAzLiBmb3IgeCBpbiBdZ3JlYXQsICogXSA6IHggPT0gcGl2b3QyCiAgICAgIGZvciAoaW50IGsgPSBsZXNzOyBrIDw9IGdyZWF0OyBrKyspIHsKICAgICAgICB2YXIgYWsgPSBhW2tdOwogICAgICAgIGludCBjb21wX3Bpdm90MSA9IGNvbXBhcmUoYWssIHBpdm90MSk7CiAgICAgICAgaWYgKGNvbXBfcGl2b3QxID09IDApIHsKICAgICAgICAgIGlmIChrICE9IGxlc3MpIHsKICAgICAgICAgICAgYVtrXSA9IGFbbGVzc107CiAgICAgICAgICAgIGFbbGVzc10gPSBhazsKICAgICAgICAgIH0KICAgICAgICAgIGxlc3MrKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW50IGNvbXBfcGl2b3QyID0gY29tcGFyZShhaywgcGl2b3QyKTsKICAgICAgICAgIGlmIChjb21wX3Bpdm90MiA9PSAwKSB7CiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgaW50IGNvbXAgPSBjb21wYXJlKGFbZ3JlYXRdLCBwaXZvdDIpOwogICAgICAgICAgICAgIGlmIChjb21wID09IDApIHsKICAgICAgICAgICAgICAgIGdyZWF0LS07CiAgICAgICAgICAgICAgICBpZiAoZ3JlYXQgPCBrKSBicmVhazsKICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgbG9jYXRpb24gaW5zaWRlIHRoZSBsb29wIHdoZXJlIGEgbmV3CiAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24gaXMgc3RhcnRlZC4KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBhW2dyZWF0XSA8IHBpdm90Mi4KICAgICAgICAgICAgICAgIGNvbXAgPSBjb21wYXJlKGFbZ3JlYXRdLCBwaXZvdDEpOwogICAgICAgICAgICAgICAgaWYgKGNvbXAgPCAwKSB7CiAgICAgICAgICAgICAgICAgIC8vIFRyaXBsZSBleGNoYW5nZS4KICAgICAgICAgICAgICAgICAgYVtrXSA9IGFbbGVzc107CiAgICAgICAgICAgICAgICAgIGFbbGVzcysrXSA9IGFbZ3JlYXRdOwogICAgICAgICAgICAgICAgICBhW2dyZWF0LS1dID0gYWs7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAvLyBhW2dyZWF0XSA9PSBwaXZvdDEuCiAgICAgICAgICAgICAgICAgIGFba10gPSBhW2dyZWF0XTsKICAgICAgICAgICAgICAgICAgYVtncmVhdC0tXSA9IGFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFRoZSBzZWNvbmQgcGFydGl0aW9uIGhhcyBub3cgYmVlbiBjbGVhcmVkIG9mIHBpdm90IGVsZW1lbnRzIGFuZCBsb29rcwogICAgICAvLyBhcyBmb2xsb3dzOgogICAgICAvLyBbICAqICB8ICA+IHBpdm90MSAmJiA8IHBpdm90MiAgfCAqIF0KICAgICAgLy8gICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgXgogICAgICAvLyAgICAgICBsZXNzICAgICAgICAgICAgICAgICAgZ3JlYXQKICAgICAgLy8gU29ydCB0aGUgc2Vjb25kIHBhcnRpdGlvbiB1c2luZyByZWN1cnNpdmUgZGVzY2VudC4KICAgICAgX2RvU29ydChhLCBsZXNzLCBncmVhdCwgY29tcGFyZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBUaGUgc2Vjb25kIHBhcnRpdGlvbiBsb29rcyBhcyBmb2xsb3dzOgogICAgICAvLyBbICAqICB8ICA+PSBwaXZvdDEgJiYgPD0gcGl2b3QyICB8ICogXQogICAgICAvLyAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgIF4KICAgICAgLy8gICAgICAgbGVzcyAgICAgICAgICAgICAgICAgICAgZ3JlYXQKICAgICAgLy8gU2ltcGx5IHNvcnQgaXQgYnkgcmVjdXJzaXZlIGRlc2NlbnQuCiAgICAgIF9kb1NvcnQoYSwgbGVzcywgZ3JlYXQsIGNvbXBhcmUpOwogICAgfQogIH0KfQqBgwBOTjwBGAEEIwNMIgNFBA1OJTMBBkcbBU4XHBcFTiIGOioEAQZQHgVEKgVABlE4GgYnBAEGTAYaPzcvDTQGBAEhPy4VEToZDQgRBgQBJj82ATgpHyA3ISEBGRkZGRkBPSETEQ8GIRMRDwYhExEPBiETEQ8GIRMRDwYhExEPBiETEQ8GIRMRDwYhExEPBgEWFgFQMBUVFQEZGgFDRAE8HBpPEglBQEMJRRcJFTEvMywXJyEYGxwaDBIRFw1NSExQTUs4GS0cF0knGCMiHiQfFRUcHx9NNxUODAoIDTEWJBYJIlBPUQlFFwkVMT4zLBcvHxscGgwSETEhGzQeGSZJKRoXJzIgJiIoIxkpIyMSFxAODAoIBgEvRUtJDxsaHRsBOj8+QAE8KSsBHEkcDgYBTxJQTisuEAgvEQgBRwkxFyIXCSJLPkIJFTA8MSwXLyAbHBoMEhExIhs0HxkmSSkaFyYyICYiKCMZKSMjEhcQDgwKCE8VLikrPCgNMDArLS4oBgQCARhkYXJ0Ol9pbnRlcm5hbC9zb3J0LmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2ludGVybmFsL3N5bWJvbC5kYXJ0krcvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll9pbnRlcm5hbDsKCi8qKgogKiBJbXBsZW1lbnRhdGlvbiBvZiBbY29yZS5TeW1ib2xdLiAgVGhpcyBjbGFzcyB1c2VzIHRoZSBzYW1lIG5hbWUgYXMKICogYSBjb3JlIGNsYXNzIHNvIGEgdXNlciBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlLgogKgogKiBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIGhpZGUgW19uYW1lXSBmcm9tIHVzZXIgY29kZSwgYnV0CiAqIG1ha2UgaXQgYWNjZXNzaWJsZSB0byBEYXJ0IHBsYXRmb3JtIGNvZGUgdmlhIHRoZSBzdGF0aWMgbWV0aG9kCiAqIFtnZXROYW1lXS4KICovCmNsYXNzIFN5bWJvbCBpbXBsZW1lbnRzIGNvcmUuU3ltYm9sIHsKICBmaW5hbCBTdHJpbmcgX25hbWU7CgogIC8qKgogICAqIFNvdXJjZSBvZiBSZWdFeHAgbWF0Y2hpbmcgRGFydCByZXNlcnZlZCB3b3Jkcy4KICAgKgogICAqIFJlc2VydmVkIHdvcmRzIGFyZSBub3QgYWxsb3dlZCBhcyBpZGVudGlmaWVycy4KICAgKi8KICBzdGF0aWMgY29uc3QgU3RyaW5nIHJlc2VydmVkV29yZFJFID0KICAgICAgcicoPzphc3NlcnR8YnJlYWt8Yyg/OmEoPzpzZXx0Y2gpfGxhc3N8b24oPzpzdHx0aW51ZSkpfGQoPzplZmF1bHR8byl8JwogICAgICByJ2UoPzpsc2V8bnVtfHh0ZW5kcyl8Zig/OmFsc2V8aW5hbCg/Omx5KT98b3IpfGlbZm5zXXxuKD86ZXd8dWxsKXwnCiAgICAgIHIncmV0KD86aHJvd3x1cm4pfHMoPzp1cGVyfHdpdGNoKXx0KD86aCg/OmlzfHJvdyl8cig/OnVlfHkpKXwnCiAgICAgIHIndig/OmFyfG9pZCl8dyg/OmhpbGV8aXRoKSknOwogIC8qKgogICAqIFNvdXJjZSBvZiBSZWdFeHAgbWF0Y2hpbmcgYW55IHB1YmxpYyBpZGVudGlmaWVyLgogICAqCiAgICogQSBwdWJsaWMgaWRlbnRpZmllciBpcyBhIHZhbGlkIGlkZW50aWZpZXIgKG5vdCBhIHJlc2VydmVkIHdvcmQpCiAgICogdGhhdCBkb2Vzbid0IHN0YXJ0IHdpdGggJ18nLgogICAqLwogIHN0YXRpYyBjb25zdCBTdHJpbmcgcHVibGljSWRlbnRpZmllclJFID0KICAgICAgcicoPyEnICckcmVzZXJ2ZWRXb3JkUkUnIHInXGIoPyFcJCkpW2EtekEtWiRdW1x3JF0qJzsKICAvKioKICAgKiBTb3VyY2Ugb2YgUmVnRXhwIG1hdGNoaW5nIGFueSBpZGVudGlmaWVyLgogICAqCiAgICogSXQgbWF0Y2hlcyBpZGVudGlmaWVycyBidXQgbm90IHJlc2VydmVkIHdvcmRzLiBUaGUgaWRlbnRpZmllcnMKICAgKiBtYXkgc3RhcnQgd2l0aCAnXycuCiAgICovCiAgc3RhdGljIGNvbnN0IFN0cmluZyBpZGVudGlmaWVyUkUgPQogICAgICByJyg/IScgJyRyZXNlcnZlZFdvcmRSRScgcidcYig/IVwkKSlbYS16QS1aJF9dW1x3JF0qJzsKICAvKioKICAgKiBTb3VyY2Ugb2YgUmVnRXhwIG1hdGNoaW5nIGEgZGVjbGFyYWJsZSBvcGVyYXRvciBuYW1lcy4KICAgKgogICAqIFRoZSBvcGVyYXRvcnMgdGhhdCBjYW4gYmUgZGVjbGFyZWQgdXNpbmcgYG9wZXJhdG9yYCBkZWNsYXJhdGlvbnMgYXJlCiAgICogYWxzbyB0aGUgb25seSBvbmVzIGFsbG93ZWQgYXMgc3ltYm9scy4gVGhlIG5hbWUgb2YgdGhlIG9wZXJhdG9ycyBpcwogICAqIHRoZSBzYW1lIGFzIHRoZSBvcGVyYXRvciBpdHNlbGYgZXhjZXB0IGZvciB1bmFyeSBtaW51cywgd2hlcmUgdGhlIG5hbWUKICAgKiBpcyAidW5hcnktIi4KICAgKi8KICBzdGF0aWMgY29uc3QgU3RyaW5nIG9wZXJhdG9yUkUgPQogICAgICByJyg/OltcLSsqLyUmfF5dfFxbXF09P3w9PXx+Lz98PFs8PV0/fD5bPj1dP3x1bmFyeS0pJzsKCiAgLy8gR3JhbW1hciBpZiBzeW1ib2xzOgogIC8vICAgIHN5bWJvbCA6Oj0gcXVhbGlmaWVkTmFtZSB8IDxlbXB0eT4KICAvLyAgICBxdWFsaWZpZWROYW1lIDo6PSBwdWJsaWNJZGVudGlmaWVyICcuJyBxdWFsaWZpZWROYW1lIHwgbmFtZQogIC8vICAgIG5hbWUgOjo9IHB1YmxpY0lkZW50aWZpZXIKICAvLyAgICAgICAgICAgfCBwdWJsaWNJZGVudGlmaWVyICc9JwogIC8vICAgICAgICAgICB8IG9wZXJhdG9yCiAgLy8gd2hlcmUgcHVibGljSWRlbnRpZmllciBpcyBhbnkgdmFsaWQgaWRlbnRpZmllciAobm90IGEgcmVzZXJ2ZWQgd29yZCkKICAvLyB0aGF0IGlzbid0IHByaXZhdGUgKGRvZXNuJ3Qgc3RhcnQgd2l0aCAnXycpLgogIC8vCiAgLy8gUmFpbHJvYWQgZGlhZ3JhbSBvZiB0aGUgYWNjZXB0ZWQgZ3JhbW1hcjoKICAvLwogIC8vICAgIC8tLS0tLS0tLS0tLS0tLS0tXAogIC8vICAgIHwgICAgICAgICAgICAgICAgfAogIC8vICAgIHwgICAgICAgICAgLy1bLl0tLyAgICAgLy1bPV0tXAogIC8vICAgIFwgICAgICAgICAvICAgICAgICAgICAvICAgICAgIFwKICAvLyAgLS0tLS0tLVtpZF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgogIC8vICAgICAgIFwgICAgICAgICAgICAgICAgICAgICAvCiAgLy8gICAgICAgIFwtLS0tLS1bb3BlcmF0b3JdLS0tLwogIC8vICAgICAgICAgICAgXCAgICAgICAgICAgICAgLwogIC8vICAgICAgICAgICAgIFwtLS0tLS0tLS0tLS0vCiAgLy8KCiAgLyoqCiAgICogUmVnRXhwIHRoYXQgdmFsaWRhdGVzIGEgbm9uLWVtcHR5IG5vbi1wcml2YXRlIHN5bWJvbC4KICAgKgogICAqIFRoZSBlbXB0eSBzeW1ib2wgaXMgaGFuZGxlZCBiZWZvcmUgdGhpcyByZWdleHAgaXMgdXNlZCwgYW5kIGlzIG5vdAogICAqIGFjY2VwdGVkLgogICAqLwogIHN0YXRpYyBmaW5hbCBSZWdFeHAgcHVibGljU3ltYm9sUGF0dGVybiA9IG5ldyBSZWdFeHAoCiAgICAgICdeKD86JG9wZXJhdG9yUkVcJHwkcHVibGljSWRlbnRpZmllclJFKD86PT9cJHxbLl0oPyFcJCkpKSs/XCQnKTsKCiAgLy8gVGhlIGdyYW1tYXIgb2Ygc3ltYm9scyB0aGF0IG1heSBiZSBwcml2YXRlIGlzIHRoZSBzYW1lIGFzIGZvciBwdWJsaWMKICAvLyBzeW1ib2xzLCBleGNlcHQgdGhhdCAicHVibGljSWRlbnRpZmllciIgaXMgcmVwbGFjZWQgYnkgImlkZW50aWZpZXIiLAogIC8vIHdoaWNoIG1hdGNoZXMgYW55IGlkZW50aWZpZXIuCgogIC8qKgogICAqIFJlZ0V4cCB0aGF0IHZhbGlkYXRlcyBhIG5vbi1lbXB0eSBzeW1ib2wuCiAgICoKICAgKiBQcml2YXRlIHN5bWJvbHMgYXJlIGFjY2VwdGVkLgogICAqCiAgICogVGhlIGVtcHR5IHN5bWJvbCBpcyBoYW5kbGVkIGJlZm9yZSB0aGlzIHJlZ2V4cCBpcyB1c2VkLCBhbmQgaXMgbm90CiAgICogYWNjZXB0ZWQuCiAgICovCiAgc3RhdGljIGZpbmFsIFJlZ0V4cCBzeW1ib2xQYXR0ZXJuID0KICAgICAgbmV3IFJlZ0V4cCgnXig/OiRvcGVyYXRvclJFXCR8JGlkZW50aWZpZXJSRSg/Oj0/XCR8Wy5dKD8hXCQpKSkrP1wkJyk7CgogIGV4dGVybmFsIGNvbnN0IFN5bWJvbChTdHJpbmcgbmFtZSk7CgogIC8qKgogICAqIFBsYXRmb3JtLXByaXZhdGUgbWV0aG9kIHVzZWQgYnkgdGhlIG1pcnJvciBzeXN0ZW0gdG8gY3JlYXRlCiAgICogb3RoZXJ3aXNlIGludmFsaWQgbmFtZXMuCiAgICovCiAgY29uc3QgU3ltYm9sLnVudmFsaWRhdGVkKHRoaXMuX25hbWUpOwoKICAvLyBUaGlzIGlzIGNhbGxlZCBieSBkYXJ0MmpzLgogIFN5bWJvbC52YWxpZGF0ZWQoU3RyaW5nIG5hbWUpIDogdGhpcy5fbmFtZSA9IHZhbGlkYXRlUHVibGljU3ltYm9sKG5hbWUpOwoKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PiBvdGhlciBpcyBTeW1ib2wgJiYgX25hbWUgPT0gb3RoZXIuX25hbWU7CgogIGV4dGVybmFsIGludCBnZXQgaGFzaENvZGU7CgogIGV4dGVybmFsIHRvU3RyaW5nKCk7CgogIC8vLyBQbGF0Zm9ybS1wcml2YXRlIGFjY2Vzc29yIHdoaWNoIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSB1c2VyIGxpYnJhcmllcy4KICBzdGF0aWMgU3RyaW5nIGdldE5hbWUoU3ltYm9sIHN5bWJvbCkgPT4gc3ltYm9sLl9uYW1lOwoKICBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlUHVibGljU3ltYm9sKFN0cmluZyBuYW1lKSB7CiAgICBpZiAobmFtZS5pc0VtcHR5IHx8IHB1YmxpY1N5bWJvbFBhdHRlcm4uaGFzTWF0Y2gobmFtZSkpIHJldHVybiBuYW1lOwogICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnXycpKSB7CiAgICAgIC8vIFRoZXJlIG1heSBiZSBvdGhlciBwcml2YXRlIHBhcnRzIGluIGEgcXVhbGlmaWVkIG5hbWUgdGhhbiB0aGUgZmlyc3QKICAgICAgLy8gb25lLCBidXQgdGhpcyBpcyBhIGNvbW1vbiBjYXNlIHRoYXQgZGVzZXJ2ZXMgYSBzcGVjaWZpYyBlcnJvcgogICAgICAvLyBtZXNzYWdlLgogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignIiRuYW1lIiBpcyBhIHByaXZhdGUgaWRlbnRpZmllcicpOwogICAgfQogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJyIkbmFtZSIgaXMgbm90IGEgdmFsaWQgKHF1YWxpZmllZCkgc3ltYm9sIG5hbWUnKTsKICB9CgogIC8qKgogICAqIENoZWNrcyB3aGV0aGVyIG5hbWUgaXMgYSB2YWxpZCBzeW1ib2wgbmFtZS4KICAgKgogICAqIFRoaXMgdGVzdCBhbGxvd3MgYm90aCBwcml2YXRlIGFuZCBub24tcHJpdmF0ZSBzeW1ib2xzLgogICAqLwogIHN0YXRpYyBib29sIGlzVmFsaWRTeW1ib2woU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiAobmFtZS5pc0VtcHR5IHx8IHN5bWJvbFBhdHRlcm4uaGFzTWF0Y2gobmFtZSkpOwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBjb21wdXRlVW5tYW5nbGVkTmFtZShTeW1ib2wgc3ltYm9sKTsKfQqAkABOTjwBGAEERjUDREIOBCYWAQY0BTQGJ01KRSUGNgVFIgYrPAYvBUQZBiU9BjwFSklMEgYjPQEZK0QiJhpKMgUvBRsbJygsIyIhIAUBBjsFSA8GOEcBSkojAQYvBSMFSA8GJkwBJgEGQR4GKAEgSwFGAR0BFwFMOAE0SSBNRxJCBk8EAQYxBTwGKzsEAT4CARpkYXJ0Ol9pbnRlcm5hbC9zeW1ib2wuZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3N5bWJvbF9wYXRjaC5kYXJ0hoMvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiaW50ZXJuYWxfcGF0Y2guZGFydCI7CgpAcGF0Y2gKY2xhc3MgU3ltYm9sIHsKICBAcGF0Y2gKICBjb25zdCBTeW1ib2woU3RyaW5nIG5hbWUpIDogdGhpcy5fbmFtZSA9IG5hbWU7CgogIEBwYXRjaAogIHRvU3RyaW5nKCkgPT4gJ1N5bWJvbCgiJHtjb21wdXRlVW5tYW5nbGVkTmFtZSh0aGlzKX0iKSc7CgogIEBwYXRjaAogIHN0YXRpYyBTdHJpbmcgY29tcHV0ZVVubWFuZ2xlZE5hbWUoU3ltYm9sIHN5bWJvbCkgewogICAgU3RyaW5nIHN0cmluZyA9IFN5bWJvbC5nZXROYW1lKHN5bWJvbCk7CgogICAgLy8gZ2V0OmZvbyAtPiBmb28KICAgIC8vIHNldDpmb28gLT4gZm9vPQogICAgLy8gZ2V0Ol9mb29AeHh4IC0+IF9mb28KICAgIC8vIHNldDpfZm9vQHh4eCAtPiBfZm9vPQogICAgLy8gQ2xhc3MuX2NvbnN0cnVjdG9yQHh4eCAtPiBDbGFzcy5fY29uc3RydWN0b3IKICAgIC8vIF9DbGFzc0B4eHguX2NvbnN0cnVjdG9yQHh4eCAtPiBfQ2xhc3MuX2NvbnN0cnVjdG9yCiAgICAvLyBsaWIuX1NAeHh4IHdpdGggbGliLl9NMUB4eHgsIGxpYi5fTTJAeHh4IC0+IGxpYi5fUyB3aXRoIGxpYi5fTTEsIGxpYi5fTTIKICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBib29sIGFkZF9zZXR0ZXJfc3VmZml4ID0gZmFsc2U7CiAgICB2YXIgcG9zID0gMDsKICAgIGlmIChzdHJpbmcubGVuZ3RoID49IDQgJiYgc3RyaW5nWzNdID09ICc6JykgewogICAgICAvLyBEcm9wICdnZXQ6JyBvciAnc2V0OicgcHJlZml4LgogICAgICBwb3MgPSA0OwogICAgICBpZiAoc3RyaW5nWzBdID09ICdzJykgewogICAgICAgIGFkZF9zZXR0ZXJfc3VmZml4ID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgLy8gU2tpcCBldmVyeXRoaW5nIGJldHdlZW4gQVQgYW5kIFBFUklPRCwgU1BBQ0UsIENPTU1BIG9yIEVORAogICAgYm9vbCBza2lwID0gZmFsc2U7CiAgICBmb3IgKDsgcG9zIDwgc3RyaW5nLmxlbmd0aDsgcG9zKyspIHsKICAgICAgdmFyIGNoYXIgPSBzdHJpbmdbcG9zXTsKICAgICAgaWYgKGNoYXIgPT0gJ0AnKSB7CiAgICAgICAgc2tpcCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnLicgfHwgY2hhciA9PSAnICcgfHwgY2hhciA9PSAnLCcpIHsKICAgICAgICBza2lwID0gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKCFza2lwKSB7CiAgICAgICAgcmVzdWx0LndyaXRlKGNoYXIpOwogICAgICB9CiAgICB9CiAgICBpZiAoYWRkX3NldHRlcl9zdWZmaXgpIHsKICAgICAgcmVzdWx0LndyaXRlKCc9Jyk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAgfQoKICBAcGF0Y2gKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIGNvbnN0IGFyYml0cmFyeVByaW1lID0gNjY0NTk3OwogICAgcmV0dXJuIDB4MWZmZmZmZmYgJiAoYXJiaXRyYXJ5UHJpbWUgKiBfbmFtZS5oYXNoQ29kZSk7CiAgfQp9Cj4ATk48ASIBBw8JMQEJOwEJNiwBFhccHTQ6UC4kETInDx4iCAZCFykeGRU+FggTHAgGHRkGHgQBCRUjOwQCASZkYXJ0Ol9pbnRlcm5hbC1wYXRjaC9zeW1ib2xfcGF0Y2guZGFydDVvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW50ZXJuYWwvbGlua2VkX2xpc3QuZGFydIzFLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5faW50ZXJuYWw7CgovLy8gQSBydWRpbWVudGFyeSBsaW5rZWQgbGlzdC4KY2xhc3MgTGlua2VkTGlzdDxUIGV4dGVuZHMgTGlua2VkTGlzdEVudHJ5PFQ+PiBleHRlbmRzIEl0ZXJhYmxlQmFzZTxUPiB7CiAgVCBmaXJzdDsKICBUIGxhc3Q7CiAgaW50IGxlbmd0aCA9IDA7CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gbGVuZ3RoID09IDA7CgogIC8qKgogICAqIEFkZHMgW25ld0xhc3RdIHRvIHRoZSBlbmQgb2YgdGhpcyBsaW5rZWQgbGlzdC4KICAgKi8KICB2b2lkIGFkZChUIG5ld0xhc3QpIHsKICAgIGFzc2VydChuZXdMYXN0Ll9uZXh0ID09IG51bGwgJiYgbmV3TGFzdC5fcHJldmlvdXMgPT0gbnVsbCk7CiAgICBpZiAobGFzdCAhPSBudWxsKSB7CiAgICAgIGFzc2VydChsYXN0Ll9uZXh0ID09IG51bGwpOwogICAgICBsYXN0Ll9uZXh0ID0gbmV3TGFzdDsKICAgIH0gZWxzZSB7CiAgICAgIGZpcnN0ID0gbmV3TGFzdDsKICAgIH0KICAgIG5ld0xhc3QuX3ByZXZpb3VzID0gbGFzdDsKICAgIGxhc3QgPSBuZXdMYXN0OwogICAgbGFzdC5fbGlzdCA9IHRoaXM7CiAgICBsZW5ndGgrKzsKICB9CgogIC8qKgogICAqIEFkZHMgW25ld0ZpcnN0XSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgbGlua2VkIGxpc3QuCiAgICovCiAgdm9pZCBhZGRGaXJzdChUIG5ld0ZpcnN0KSB7CiAgICBpZiAoZmlyc3QgIT0gbnVsbCkgewogICAgICBhc3NlcnQoZmlyc3QuX3ByZXZpb3VzID09IG51bGwpOwogICAgICBmaXJzdC5fcHJldmlvdXMgPSBuZXdGaXJzdDsKICAgIH0gZWxzZSB7CiAgICAgIGxhc3QgPSBuZXdGaXJzdDsKICAgIH0KICAgIG5ld0ZpcnN0Ll9uZXh0ID0gZmlyc3Q7CiAgICBmaXJzdCA9IG5ld0ZpcnN0OwogICAgZmlyc3QuX2xpc3QgPSB0aGlzOwogICAgbGVuZ3RoKys7CiAgfQoKICAvKioKICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBbbm9kZV0gZnJvbSB0aGlzIGxpc3QuCiAgICoKICAgKiBJZiB0aGUgZW50cnkgaXMgbm90IGluIHRoaXMgbGlua2VkIGxpc3Qgbm90aGluZyBoYXBwZW5zLgogICAqCiAgICogQWxzbyBzZWUgW0xpbmtlZExpc3RFbnRyeS51bmxpbmtdLgogICAqLwogIHZvaWQgcmVtb3ZlKFQgbm9kZSkgewogICAgaWYgKG5vZGUuX2xpc3QgIT0gdGhpcykgcmV0dXJuOwogICAgbGVuZ3RoLS07CiAgICBpZiAobm9kZS5fcHJldmlvdXMgPT0gbnVsbCkgewogICAgICBhc3NlcnQoaWRlbnRpY2FsKG5vZGUsIGZpcnN0KSk7CiAgICAgIGZpcnN0ID0gbm9kZS5fbmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIG5vZGUuX3ByZXZpb3VzLl9uZXh0ID0gbm9kZS5fbmV4dDsKICAgIH0KICAgIGlmIChub2RlLl9uZXh0ID09IG51bGwpIHsKICAgICAgYXNzZXJ0KGlkZW50aWNhbChub2RlLCBsYXN0KSk7CiAgICAgIGxhc3QgPSBub2RlLl9wcmV2aW91czsKICAgIH0gZWxzZSB7CiAgICAgIG5vZGUuX25leHQuX3ByZXZpb3VzID0gbm9kZS5fcHJldmlvdXM7CiAgICB9CiAgICBub2RlLl9uZXh0ID0gbm9kZS5fcHJldmlvdXMgPSBudWxsOwogICAgbm9kZS5fbGlzdCA9IG51bGw7CiAgfQoKICBJdGVyYXRvcjxUPiBnZXQgaXRlcmF0b3IgPT4gbmV3IF9MaW5rZWRMaXN0SXRlcmF0b3I8VD4odGhpcyk7Cn0KCmNsYXNzIExpbmtlZExpc3RFbnRyeTxUIGV4dGVuZHMgTGlua2VkTGlzdEVudHJ5PFQ+PiB7CiAgVCBfbmV4dDsKICBUIF9wcmV2aW91czsKICBMaW5rZWRMaXN0PFQ+IF9saXN0OwoKICAvKioKICAgKiBVbmxpbmtzIHRoZSBlbGVtZW50IGZyb20gaXRzIGxpbmtlZCBsaXN0LgogICAqCiAgICogSWYgdGhlIGVudHJ5IGlzIG5vdCBpbiBhIGxpbmtlZCBsaXN0LCBkb2VzIG5vdGhpbmcuIE90aGVyd2lzZSwgdGhpcwogICAqIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBbTGlua2VkTGlzdC5yZW1vdmVdIG9uIHRoZSBsaXN0IHRoaXMgZW50cnkKICAgKiBpcyBjdXJyZW50bHkgaW4uCiAgICovCiAgdm9pZCB1bmxpbmsoKSB7CiAgICBpZiAoX2xpc3QgPT0gbnVsbCkgcmV0dXJuOwogICAgX2xpc3QucmVtb3ZlKHRoaXMpOwogIH0KfQoKY2xhc3MgX0xpbmtlZExpc3RJdGVyYXRvcjxUIGV4dGVuZHMgTGlua2VkTGlzdEVudHJ5PFQ+PiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKICAvLy8gVGhlIGN1cnJlbnQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IuCiAgLy8gVGhpcyBmaWVsZCBpcyB3cml0ZWFibGUsIGJ1dCBzaG91bGQgb25seSByZWFkIGJ5IHVzZXJzIG9mIHRoaXMgY2xhc3MuCiAgVCBjdXJyZW50OwoKICAvLy8gVGhlIGxpc3QgdGhlIGl0ZXJhdG9yIGl0ZXJhdGVzIG92ZXIuCiAgLy8vCiAgLy8vIFNldCB0byBbbnVsbF0gaWYgdGhlIHByb3ZpZGVkIGxpc3Qgd2FzIGVtcHR5IChpbmRpY2F0aW5nIHRoYXQgdGhlcmUgd2VyZQogIC8vLyBubyBlbnRyaWVzIHRvIGl0ZXJhdGUgb3ZlcikuCiAgLy8vCiAgLy8vIFNldCB0byBbbnVsbF0gYXMgc29vbiBhcyBbbW92ZU5leHRdIHdhcyBpbnZva2VkIChpbmRpY2F0aW5nIHRoYXQgdGhlCiAgLy8vIGl0ZXJhdG9yIGhhcyB0byB3b3JrIHdpdGggW2N1cnJlbnRdIGZyb20gbm93IG9uLgogIExpbmtlZExpc3Q8VD4gX2xpc3Q7CgogIF9MaW5rZWRMaXN0SXRlcmF0b3IodGhpcy5fbGlzdCkgewogICAgaWYgKF9saXN0Lmxlbmd0aCA9PSAwKSBfbGlzdCA9IG51bGw7CiAgfQoKICBib29sIG1vdmVOZXh0KCkgewogICAgLy8gY3VycmVudCBpcyBudWxsIGlmIHRoZSBpdGVyYXRvciBoYXNuJ3Qgc3RhcnRlZCBpdGVyYXRpbmcsIG9yIGlmIHRoZQogICAgLy8gaXRlcmF0aW9uIGlzIGZpbmlzaGVkLiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIFtfbGlzdF0gZmllbGQgaXMgbm90IG51bGwuCiAgICBpZiAoY3VycmVudCA9PSBudWxsKSB7CiAgICAgIGlmIChfbGlzdCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIGFzc2VydChfbGlzdC5sZW5ndGggPiAwKTsKICAgICAgY3VycmVudCA9IF9saXN0LmZpcnN0OwogICAgICBfbGlzdCA9IG51bGw7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgY3VycmVudCA9IGN1cnJlbnQuX25leHQ7CiAgICByZXR1cm4gY3VycmVudCAhPSBudWxsOwogIH0KfQqAgABOTjwBGAEfSQsKEgEjAQY0BhhAGCIcDRcGHhQXDgQBBjsGHhknIg0XBhwWGA4EAQYuBT4FKAYYJA4iJhoNKQYeJR0NLQYoFwQBQAIBNgsPFwEGLwVJSRYGEh8YBAIBUStLDQErBk8jBks3FwEkKQQBFEtQGycgHRQTBh0cBAIBH2RhcnQ6X2ludGVybmFsL2xpbmtlZF9saXN0LmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9wcmludF9wYXRjaC5kYXJ0gvwvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiaW50ZXJuYWxfcGF0Y2guZGFydCI7CgovLyBBIHByaW50LWNsb3N1cmUgZ2V0cyBhIFN0cmluZyB0aGF0IHNob3VsZCBiZSBwcmludGVkLiBJbiBnZW5lcmFsIHRoZQovLyBzdHJpbmcgaXMgYSBsaW5lLCBidXQgaXQgbWF5IGNvbnRhaW4gIlxuIiBjaGFyYWN0ZXJzLgp0eXBlZGVmIHZvaWQgX1ByaW50Q2xvc3VyZShTdHJpbmcgbGluZSk7CgpAcGF0Y2gKdm9pZCBwcmludFRvQ29uc29sZShTdHJpbmcgbGluZSkgewogIF9wcmludENsb3N1cmUobGluZSk7Cn0KCnZvaWQgX3Vuc3VwcG9ydGVkUHJpbnQoU3RyaW5nIGxpbmUpIHsKICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiJ3ByaW50JyBpcyBub3Qgc3VwcG9ydGVkIik7Cn0KCi8vIF9wcmludENsb3N1cmUgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBlbWJlZGRlciB0byBzdXBwbHkgYSBkaWZmZXJlbnQKLy8gcHJpbnQgaW1wbGVtZW50YXRpb24uCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKX1ByaW50Q2xvc3VyZSBfcHJpbnRDbG9zdXJlID0gX3Vuc3VwcG9ydGVkUHJpbnQ7ChkATk48ASIBSDkpAQcjFwIBJjoCAUoZGjEBJWRhcnQ6X2ludGVybmFsLXBhdGNoL3ByaW50X3BhdGNoLmRhcnQvb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2ludGVybmFsL3ByaW50LmRhcnSCNS8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuX2ludGVybmFsOwoKLyoqCiAqIFRoaXMgZnVuY3Rpb24gaXMgc2V0IGJ5IHRoZSBmaXJzdCBhbGxvY2F0aW9uIG9mIGEgWm9uZS4KICoKICogT25jZSB0aGUgZnVuY3Rpb24gaXMgc2V0IHRoZSBjb3JlIGBwcmludGAgZnVuY3Rpb24gY2FsbHMgdGhpcyBjbG9zdXJlIGluc3RlYWQKICogb2YgW3ByaW50VG9Db25zb2xlXS4KICoKICogVGhpcyBkZWNvdXBsZXMgdGhlIGNvcmUgbGlicmFyeSBmcm9tIHRoZSBhc3luYyBsaWJyYXJ5LgogKi8Kdm9pZCBGdW5jdGlvbihTdHJpbmcpIHByaW50VG9ab25lID0gbnVsbDsKCmV4dGVybmFsIHZvaWQgcHJpbnRUb0NvbnNvbGUoU3RyaW5nIGxpbmUpOwoTAE5OPAEYAQQ7A1EYAzsEKgErARlkYXJ0Ol9pbnRlcm5hbC9wcmludC5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pc29sYXRlL2lzb2xhdGUuZGFydMAAd3YvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLyoqCiAqIENvbmN1cnJlbnQgcHJvZ3JhbW1pbmcgdXNpbmcgX2lzb2xhdGVzXzoKICogaW5kZXBlbmRlbnQgd29ya2VycyB0aGF0IGFyZSBzaW1pbGFyIHRvIHRocmVhZHMKICogYnV0IGRvbid0IHNoYXJlIG1lbW9yeSwKICogY29tbXVuaWNhdGluZyBvbmx5IHZpYSBtZXNzYWdlcy4KICoKICogVG8gdXNlIHRoaXMgbGlicmFyeSBpbiB5b3VyIGNvZGU6CiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aXNvbGF0ZSc7CiAqCiAqIHtAY2F0ZWdvcnkgVk19CiAqLwpsaWJyYXJ5IGRhcnQuaXNvbGF0ZTsKCmltcG9ydCAiZGFydDphc3luYyI7CmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgU2luY2U7CmltcG9ydCAiZGFydDp0eXBlZF9kYXRhIiBzaG93IEJ5dGVCdWZmZXIsIFR5cGVkRGF0YSwgVWludDhMaXN0OwoKcGFydCAiY2FwYWJpbGl0eS5kYXJ0IjsKCi8qKgogKiBUaHJvd24gd2hlbiBhbiBpc29sYXRlIGNhbm5vdCBiZSBjcmVhdGVkLgogKi8KY2xhc3MgSXNvbGF0ZVNwYXduRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uIHsKICAvKiogRXJyb3IgbWVzc2FnZSByZXBvcnRlZCBieSB0aGUgc3Bhd24gb3BlcmF0aW9uLiAqLwogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBJc29sYXRlU3Bhd25FeGNlcHRpb24odGhpcy5tZXNzYWdlKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiSXNvbGF0ZVNwYXduRXhjZXB0aW9uOiAkbWVzc2FnZSI7Cn0KCi8qKgogKiBBbiBpc29sYXRlZCBEYXJ0IGV4ZWN1dGlvbiBjb250ZXh0LgogKgogKiBBbGwgRGFydCBjb2RlIHJ1bnMgaW4gYW4gaXNvbGF0ZSwgYW5kIGNvZGUgY2FuIGFjY2VzcyBjbGFzc2VzIGFuZCB2YWx1ZXMKICogb25seSBmcm9tIHRoZSBzYW1lIGlzb2xhdGUuIERpZmZlcmVudCBpc29sYXRlcyBjYW4gY29tbXVuaWNhdGUgYnkgc2VuZGluZwogKiB2YWx1ZXMgdGhyb3VnaCBwb3J0cyAoc2VlIFtSZWNlaXZlUG9ydF0sIFtTZW5kUG9ydF0pLgogKgogKiBBbiBgSXNvbGF0ZWAgb2JqZWN0IGlzIGEgcmVmZXJlbmNlIHRvIGFuIGlzb2xhdGUsIHVzdWFsbHkgZGlmZmVyZW50IGZyb20KICogdGhlIGN1cnJlbnQgaXNvbGF0ZS4KICogSXQgcmVwcmVzZW50cywgYW5kIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wsIHRoZSBvdGhlciBpc29sYXRlLgogKgogKiBXaGVuIHNwYXduaW5nIGEgbmV3IGlzb2xhdGUsIHRoZSBzcGF3bmluZyBpc29sYXRlIHJlY2VpdmVzIGFuIGBJc29sYXRlYAogKiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBuZXcgaXNvbGF0ZSB3aGVuIHRoZSBzcGF3biBvcGVyYXRpb24gc3VjY2VlZHMuCiAqCiAqIElzb2xhdGVzIHJ1biBjb2RlIGluIGl0cyBvd24gZXZlbnQgbG9vcCwgYW5kIGVhY2ggZXZlbnQgbWF5IHJ1biBzbWFsbGVyIHRhc2tzCiAqIGluIGEgbmVzdGVkIG1pY3JvdGFzayBxdWV1ZS4KICoKICogQW4gYElzb2xhdGVgIG9iamVjdCBhbGxvd3Mgb3RoZXIgaXNvbGF0ZXMgdG8gY29udHJvbCB0aGUgZXZlbnQgbG9vcAogKiBvZiB0aGUgaXNvbGF0ZSB0aGF0IGl0IHJlcHJlc2VudHMsIGFuZCB0byBpbnNwZWN0IHRoZSBpc29sYXRlLAogKiBmb3IgZXhhbXBsZSBieSBwYXVzaW5nIHRoZSBpc29sYXRlIG9yIGJ5IGdldHRpbmcgZXZlbnRzIHdoZW4gdGhlIGlzb2xhdGUKICogaGFzIGFuIHVuY2F1Z2h0IGVycm9yLgogKgogKiBUaGUgW2NvbnRyb2xQb3J0XSBpZGVudGlmaWVzIGFuZCBnaXZlcyBhY2Nlc3MgdG8gY29udHJvbGxpbmcgdGhlIGlzb2xhdGUsCiAqIGFuZCB0aGUgW3BhdXNlQ2FwYWJpbGl0eV0gYW5kIFt0ZXJtaW5hdGVDYXBhYmlsaXR5XSBndWFyZCBhY2Nlc3MKICogdG8gc29tZSBjb250cm9sIG9wZXJhdGlvbnMuCiAqIEZvciBleGFtcGxlLCBjYWxsaW5nIFtwYXVzZV0gb24gYW4gYElzb2xhdGVgIG9iamVjdCBjcmVhdGVkIHdpdGhvdXQgYQogKiBbcGF1c2VDYXBhYmlsaXR5XSwgaGFzIG5vIGVmZmVjdC4KICoKICogVGhlIGBJc29sYXRlYCBvYmplY3QgcHJvdmlkZWQgYnkgYSBzcGF3biBvcGVyYXRpb24gd2lsbCBoYXZlIHRoZQogKiBjb250cm9sIHBvcnQgYW5kIGNhcGFiaWxpdGllcyBuZWVkZWQgdG8gY29udHJvbCB0aGUgaXNvbGF0ZS4KICogTmV3IGlzb2xhdGUgb2JqZWN0cyBjYW4gYmUgY3JlYXRlZCB3aXRob3V0IHNvbWUgb2YgdGhlc2UgY2FwYWJpbGl0aWVzCiAqIGlmIG5lY2Vzc2FyeSwgdXNpbmcgdGhlIFtJc29sYXRlLklzb2xhdGVdIGNvbnN0cnVjdG9yLgogKgogKiBBbiBgSXNvbGF0ZWAgb2JqZWN0IGNhbm5vdCBiZSBzZW50IG92ZXIgYSBgU2VuZFBvcnRgLCBidXQgdGhlIGNvbnRyb2wgcG9ydAogKiBhbmQgY2FwYWJpbGl0aWVzIGNhbiBiZSBzZW50LCBhbmQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uaW5nCiAqIGBJc29sYXRlYCBvYmplY3QgaW4gdGhlIHJlY2VpdmluZyBwb3J0J3MgaXNvbGF0ZS4KICovCmNsYXNzIElzb2xhdGUgewogIC8qKiBBcmd1bWVudCB0byBgcGluZ2AgYW5kIGBraWxsYDogQXNrIGZvciBpbW1lZGlhdGUgYWN0aW9uLiAqLwogIHN0YXRpYyBjb25zdCBpbnQgaW1tZWRpYXRlID0gMDsKICAvKiogQXJndW1lbnQgdG8gYHBpbmdgIGFuZCBga2lsbGA6IEFzayBmb3IgYWN0aW9uIGJlZm9yZSB0aGUgbmV4dCBldmVudC4gKi8KICBzdGF0aWMgY29uc3QgaW50IGJlZm9yZU5leHRFdmVudCA9IDE7CgogIC8qKgogICAqIENvbnRyb2wgcG9ydCB1c2VkIHRvIHNlbmQgY29udHJvbCBtZXNzYWdlcyB0byB0aGUgaXNvbGF0ZS4KICAgKgogICAqIFRoZSBjb250cm9sIHBvcnQgaWRlbnRpZmllcyB0aGUgaXNvbGF0ZS4KICAgKgogICAqIEFuIGBJc29sYXRlYCBvYmplY3QgYWxsb3dzIHNlbmRpbmcgY29udHJvbCBtZXNzYWdlcwogICAqIHRocm91Z2ggdGhlIGNvbnRyb2wgcG9ydC4KICAgKgogICAqIFNvbWUgY29udHJvbCBtZXNzYWdlcyByZXF1aXJlIGEgc3BlY2lmaWMgY2FwYWJpbGl0eSB0byBiZSBwYXNzZWQgYWxvbmcKICAgKiB3aXRoIHRoZSBtZXNzYWdlIChzZWUgW3BhdXNlQ2FwYWJpbGl0eV0gYW5kIFt0ZXJtaW5hdGVDYXBhYmlsaXR5XSksCiAgICogb3RoZXJ3aXNlIHRoZSBtZXNzYWdlIGlzIGlnbm9yZWQgYnkgdGhlIGlzb2xhdGUuCiAgICovCiAgZmluYWwgU2VuZFBvcnQgY29udHJvbFBvcnQ7CgogIC8qKgogICAqIENhcGFiaWxpdHkgZ3JhbnRpbmcgdGhlIGFiaWxpdHkgdG8gcGF1c2UgdGhlIGlzb2xhdGUuCiAgICoKICAgKiBUaGlzIGNhcGFiaWxpdHkgaXMgcmVxdWlyZWQgYnkgW3BhdXNlXS4KICAgKiBJZiB0aGUgY2FwYWJpbGl0eSBpcyBgbnVsbGAsIG9yIGlmIGl0IGlzIG5vdCB0aGUgY29ycmVjdCBwYXVzZSBjYXBhYmlsaXR5CiAgICogb2YgdGhlIGlzb2xhdGUgaWRlbnRpZmllZCBieSBbY29udHJvbFBvcnRdLAogICAqIHRoZW4gY2FsbHMgdG8gW3BhdXNlXSB3aWxsIGhhdmUgbm8gZWZmZWN0LgogICAqCiAgICogSWYgdGhlIGlzb2xhdGUgaXMgc3Bhd25lZCBpbiBhIHBhdXNlZCBzdGF0ZSwgdXNlIHRoaXMgY2FwYWJpbGl0eSBhcwogICAqIGFyZ3VtZW50IHRvIHRoZSBbcmVzdW1lXSBtZXRob2QgaW4gb3JkZXIgdG8gcmVzdW1lIHRoZSBwYXVzZWQgaXNvbGF0ZS4KICAgKi8KICBmaW5hbCBDYXBhYmlsaXR5IHBhdXNlQ2FwYWJpbGl0eTsKCiAgLyoqCiAgICogQ2FwYWJpbGl0eSBncmFudGluZyB0aGUgYWJpbGl0eSB0byB0ZXJtaW5hdGUgdGhlIGlzb2xhdGUuCiAgICoKICAgKiBUaGlzIGNhcGFiaWxpdHkgaXMgcmVxdWlyZWQgYnkgW2tpbGxdIGFuZCBbc2V0RXJyb3JzRmF0YWxdLgogICAqIElmIHRoZSBjYXBhYmlsaXR5IGlzIGBudWxsYCwgb3IgaWYgaXQgaXMgbm90IHRoZSBjb3JyZWN0IHRlcm1pbmF0aW9uCiAgICogY2FwYWJpbGl0eSBvZiB0aGUgaXNvbGF0ZSBpZGVudGlmaWVkIGJ5IFtjb250cm9sUG9ydF0sCiAgICogdGhlbiBjYWxscyB0byB0aG9zZSBtZXRob2RzIHdpbGwgaGF2ZSBubyBlZmZlY3QuCiAgICovCiAgZmluYWwgQ2FwYWJpbGl0eSB0ZXJtaW5hdGVDYXBhYmlsaXR5OwoKICAvKioKICAgKiBUaGUgbmFtZSBvZiB0aGUgW0lzb2xhdGVdIGRpc3BsYXllZCBmb3IgZGVidWcgcHVycG9zZXMuCiAgICoKICAgKiBUaGlzIGNhbiBiZSBzZXQgdXNpbmcgdGhlIGBkZWJ1Z05hbWVgIHBhcmFtZXRlciBpbiBbc3Bhd25dIGFuZCBbc3Bhd25VcmldLgogICAqCiAgICogVGhpcyBuYW1lIGRvZXMgbm90IHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGlzb2xhdGUuIE11bHRpcGxlIGlzb2xhdGVzIGluIHRoZQogICAqIHNhbWUgcHJvY2VzcyBtYXkgaGF2ZSB0aGUgc2FtZSBgZGVidWdOYW1lYC4KICAgKgogICAqIEZvciBhIGdpdmVuIGlzb2xhdGUsIHRoaXMgdmFsdWUgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgdmFsdWVzIHJldHVybmVkIGJ5CiAgICogYERhcnRfRGVidWdOYW1lYCBpbiB0aGUgQyBlbWJlZGRpbmcgQVBJIGFuZCB0aGUgYGRlYnVnTmFtZWAgcHJvcGVydHkgaW4KICAgKiBbSXNvbGF0ZU1pcnJvcl0uCiAgICovCiAgQFNpbmNlKCIyLjMiKQogIGV4dGVybmFsIFN0cmluZyBnZXQgZGVidWdOYW1lOwoKICAvKioKICAgKiBDcmVhdGUgYSBuZXcgW0lzb2xhdGVdIG9iamVjdCB3aXRoIGEgcmVzdHJpY3RlZCBzZXQgb2YgY2FwYWJpbGl0aWVzLgogICAqCiAgICogVGhlIHBvcnQgc2hvdWxkIGJlIGEgY29udHJvbCBwb3J0IGZvciBhbiBpc29sYXRlLCBhcyB0YWtlbiBmcm9tCiAgICogYW5vdGhlciBgSXNvbGF0ZWAgb2JqZWN0LgogICAqCiAgICogVGhlIGNhcGFiaWxpdGllcyBzaG91bGQgYmUgdGhlIHN1YnNldCBvZiB0aGUgY2FwYWJpbGl0aWVzIHRoYXQgYXJlCiAgICogYXZhaWxhYmxlIHRvIHRoZSBvcmlnaW5hbCBpc29sYXRlLgogICAqIENhcGFiaWxpdGllcyBvZiBhbiBpc29sYXRlIGFyZSBsb2NrZWQgdG8gdGhhdCBpc29sYXRlLCBhbmQgaGF2ZSBubyBlZmZlY3QKICAgKiBhbnl3aGVyZSBlbHNlLCBzbyB0aGUgY2FwYWJpbGl0aWVzIHNob3VsZCBjb21lIGZyb20gdGhlIHNhbWUgaXNvbGF0ZSBhcwogICAqIHRoZSBjb250cm9sIHBvcnQuCiAgICoKICAgKiBDYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBbSXNvbGF0ZV0gb2JqZWN0IGZyb20gYSBjb250cm9sIHBvcnQsIGFuZAogICAqIGFueSBhdmFpbGFibGUgY2FwYWJpbGl0aWVzLCB0aGF0IGhhdmUgYmVlbiBzZW50IHRocm91Z2ggYSBbU2VuZFBvcnRdLgogICAqCiAgICogRXhhbXBsZToKICAgKiBgYGBkYXJ0CiAgICogSXNvbGF0ZSBpc29sYXRlID0gZmluZFNvbWVJc29sYXRlKCk7CiAgICogSXNvbGF0ZSByZXN0cmljdGVkSXNvbGF0ZSA9IG5ldyBJc29sYXRlKGlzb2xhdGUuY29udHJvbFBvcnQpOwogICAqIHVudHJ1c3RlZENvZGUocmVzdHJpY3RlZElzb2xhdGUpOwogICAqIGBgYAogICAqIFRoaXMgZXhhbXBsZSBjcmVhdGVzIGEgbmV3IGBJc29sYXRlYCBvYmplY3QgdGhhdCBjYW5ub3QgYmUgdXNlZCB0bwogICAqIHBhdXNlIG9yIHRlcm1pbmF0ZSB0aGUgaXNvbGF0ZS4gQWxsIHRoZSB1bnRydXN0ZWQgY29kZSBjYW4gZG8gaXMgdG8KICAgKiBpbnNwZWN0IHRoZSBpc29sYXRlIGFuZCBzZWUgdW5jYXVnaHQgZXJyb3JzIG9yIHdoZW4gaXQgdGVybWluYXRlcy4KICAgKi8KICBJc29sYXRlKHRoaXMuY29udHJvbFBvcnQsIHt0aGlzLnBhdXNlQ2FwYWJpbGl0eSwgdGhpcy50ZXJtaW5hdGVDYXBhYmlsaXR5fSk7CgogIC8qKgogICAqIFJldHVybiBhbiBbSXNvbGF0ZV0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBpc29sYXRlLgogICAqCiAgICogVGhlIGN1cnJlbnQgaXNvbGF0ZSBmb3IgY29kZSB1c2luZyBbY3VycmVudF0KICAgKiBpcyB0aGUgaXNvbGF0ZSBydW5uaW5nIHRoZSBjb2RlLgogICAqCiAgICogVGhlIGlzb2xhdGUgb2JqZWN0IHByb3ZpZGVzIHRoZSBjYXBhYmlsaXRpZXMgcmVxdWlyZWQgdG8gaW5zcGVjdCwKICAgKiBwYXVzZSBvciBraWxsIHRoZSBpc29sYXRlLCBhbmQgYWxsb3dzIGdyYW50aW5nIHRoZXNlIGNhcGFiaWxpdGllcwogICAqIHRvIG90aGVycy4KICAgKgogICAqIEl0IGlzIHBvc3NpYmxlIHRvIHBhdXNlIHRoZSBjdXJyZW50IGlzb2xhdGUsIGJ1dCBkb2luZyBzbyAqd2l0aG91dCoKICAgKiBmaXJzdCBwYXNzaW5nIHRoZSBhYmlsaXR5IHRvIHJlc3VtZSBpdCBhZ2FpbiB0byBhbm90aGVyIGlzb2xhdGUsCiAgICogaXMgYSBzdXJlIHdheSB0byBoYW5nIHlvdXIgcHJvZ3JhbS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgSXNvbGF0ZSBnZXQgY3VycmVudDsKCiAgLyoqCiAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBwYWNrYWdlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGN1cnJlbnQgaXNvbGF0ZSwgaWYgYW55LgogICAqCiAgICogVGhpcyBnZXR0ZXIgcmV0dXJucyBgbnVsbGAsIGFzIHRoZSBgcGFja2FnZXMvYCBkaXJlY3RvcnkgaXMgbm90IHN1cHBvcnRlZAogICAqIGluIERhcnQgMi4KICAgKi8KICBARGVwcmVjYXRlZCgncGFja2FnZXMvIGRpcmVjdG9yeSByZXNvbHV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gRGFydCAyLicpCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxVcmk+IGdldCBwYWNrYWdlUm9vdDsKCiAgLyoqCiAgICogVGhlIHBhY2thZ2Ugcm9vdCBvZiB0aGUgY3VycmVudCBpc29sYXRlLCBpZiBhbnkuCiAgICoKICAgKiBJZiB0aGUgaXNvbGF0ZSBpcyB1c2luZyBhIFtwYWNrYWdlUm9vdF0gb3IgdGhlIGlzb2xhdGUgaGFzIG5vdCBiZWVuCiAgICogc2V0dXAgZm9yIHBhY2thZ2UgcmVzb2x1dGlvbiwgdGhpcyBnZXR0ZXIgcmV0dXJucyBgbnVsbGAsIG90aGVyd2lzZSBpdAogICAqIHJldHVybnMgdGhlIHBhY2thZ2UgY29uZmlnIFVSSS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPFVyaT4gZ2V0IHBhY2thZ2VDb25maWc7CgogIC8qKgogICAqIE1hcHMgYSBwYWNrYWdlOiBVUkkgdG8gYSBub24tcGFja2FnZSBVcmkuCiAgICoKICAgKiBJZiB0aGVyZSBpcyBubyB2YWxpZCBtYXBwaW5nIGZyb20gdGhlIHBhY2thZ2U6IFVSSSBpbiB0aGUgY3VycmVudAogICAqIGlzb2xhdGUsIHRoZW4gdGhpcyBjYWxsIHJldHVybnMgYG51bGxgLiBOb24tcGFja2FnZTogVVJJcyBhcmUKICAgKiByZXR1cm5lZCB1bm1vZGlmaWVkLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8VXJpPiByZXNvbHZlUGFja2FnZVVyaShVcmkgcGFja2FnZVVyaSk7CgogIC8qKgogICAqIENyZWF0ZXMgYW5kIHNwYXducyBhbiBpc29sYXRlIHRoYXQgc2hhcmVzIHRoZSBzYW1lIGNvZGUgYXMgdGhlIGN1cnJlbnQKICAgKiBpc29sYXRlLgogICAqCiAgICogVGhlIGFyZ3VtZW50IFtlbnRyeVBvaW50XSBzcGVjaWZpZXMgdGhlIGluaXRpYWwgZnVuY3Rpb24gdG8gY2FsbAogICAqIGluIHRoZSBzcGF3bmVkIGlzb2xhdGUuCiAgICogVGhlIGVudHJ5LXBvaW50IGZ1bmN0aW9uIGlzIGludm9rZWQgaW4gdGhlIG5ldyBpc29sYXRlIHdpdGggW21lc3NhZ2VdCiAgICogYXMgdGhlIG9ubHkgYXJndW1lbnQuCiAgICoKICAgKiBUaGUgZnVuY3Rpb24gbXVzdCBiZSBhIHRvcC1sZXZlbCBmdW5jdGlvbiBvciBhIHN0YXRpYyBtZXRob2QKICAgKiB0aGF0IGNhbiBiZSBjYWxsZWQgd2l0aCBhIHNpbmdsZSBhcmd1bWVudCwKICAgKiB0aGF0IGlzLCBhIGNvbXBpbGUtdGltZSBjb25zdGFudCBmdW5jdGlvbiB2YWx1ZQogICAqIHdoaWNoIGFjY2VwdHMgYXQgbGVhc3Qgb25lIHBvc2l0aW9uYWwgcGFyYW1ldGVyCiAgICogYW5kIGhhcyBhdCBtb3N0IG9uZSByZXF1aXJlZCBwb3NpdGlvbmFsIHBhcmFtZXRlci4KICAgKiBUaGUgZnVuY3Rpb24gbWF5IGFjY2VwdCBhbnkgbnVtYmVyIG9mIG9wdGlvbmFsIHBhcmFtZXRlcnMsCiAgICogYXMgbG9uZyBhcyBpdCAqY2FuKiBiZSBjYWxsZWQgd2l0aCBqdXN0IGEgc2luZ2xlIGFyZ3VtZW50LgogICAqIFRoZSBmdW5jdGlvbiBtdXN0IG5vdCBiZSB0aGUgdmFsdWUgb2YgYSBmdW5jdGlvbiBleHByZXNzaW9uCiAgICogb3IgYW4gaW5zdGFuY2UgbWV0aG9kIHRlYXItb2ZmLgogICAqCiAgICogVXN1YWxseSB0aGUgaW5pdGlhbCBbbWVzc2FnZV0gY29udGFpbnMgYSBbU2VuZFBvcnRdIHNvCiAgICogdGhhdCB0aGUgc3Bhd25lciBhbmQgc3Bhd25lZSBjYW4gY29tbXVuaWNhdGUgd2l0aCBlYWNoIG90aGVyLgogICAqCiAgICogSWYgdGhlIFtwYXVzZWRdIHBhcmFtZXRlciBpcyBzZXQgdG8gYHRydWVgLAogICAqIHRoZSBpc29sYXRlIHdpbGwgc3RhcnQgdXAgaW4gYSBwYXVzZWQgc3RhdGUsCiAgICoganVzdCBiZWZvcmUgY2FsbGluZyB0aGUgW2VudHJ5UG9pbnRdIGZ1bmN0aW9uIHdpdGggdGhlIFttZXNzYWdlXSwKICAgKiBhcyBpZiBieSBhbiBpbml0aWFsIGNhbGwgb2YgYGlzb2xhdGUucGF1c2UoaXNvbGF0ZS5wYXVzZUNhcGFiaWxpdHkpYC4KICAgKiBUbyByZXN1bWUgdGhlIGlzb2xhdGUsIGNhbGwgYGlzb2xhdGUucmVzdW1lKGlzb2xhdGUucGF1c2VDYXBhYmlsaXR5KWAuCiAgICoKICAgKiBJZiB0aGUgW2Vycm9yc0FyZUZhdGFsXSwgW29uRXhpdF0gYW5kL29yIFtvbkVycm9yXSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZCwKICAgKiB0aGUgaXNvbGF0ZSB3aWxsIGFjdCBhcyBpZiwgcmVzcGVjdGl2ZWx5LCBbc2V0RXJyb3JzRmF0YWxdLAogICAqIFthZGRPbkV4aXRMaXN0ZW5lcl0gYW5kIFthZGRFcnJvckxpc3RlbmVyXSB3ZXJlIGNhbGxlZCB3aXRoIHRoZQogICAqIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIGFuZCB3YXMgcHJvY2Vzc2VkIGJlZm9yZSB0aGUgaXNvbGF0ZSBzdGFydHMKICAgKiBydW5uaW5nLgogICAqCiAgICogSWYgW2RlYnVnTmFtZV0gaXMgcHJvdmlkZWQsIHRoZSBzcGF3bmVkIFtJc29sYXRlXSB3aWxsIGJlIGlkZW50aWZpYWJsZSBieQogICAqIHRoaXMgbmFtZSBpbiBkZWJ1Z2dlcnMgYW5kIGxvZ2dpbmcuCiAgICoKICAgKiBJZiBbZXJyb3JzQXJlRmF0YWxdIGlzIG9taXR0ZWQsIHRoZSBwbGF0Zm9ybSBtYXkgY2hvb3NlIGEgZGVmYXVsdCBiZWhhdmlvcgogICAqIG9yIGluaGVyaXQgdGhlIGN1cnJlbnQgaXNvbGF0ZSdzIGJlaGF2aW9yLgogICAqCiAgICogWW91IGNhbiBhbHNvIGNhbGwgdGhlIFtzZXRFcnJvcnNGYXRhbF0sIFthZGRPbkV4aXRMaXN0ZW5lcl0gYW5kCiAgICogW2FkZEVycm9yTGlzdGVuZXJdIG1ldGhvZHMgb24gdGhlIHJldHVybmVkIGlzb2xhdGUsIGJ1dCB1bmxlc3MgdGhlCiAgICogaXNvbGF0ZSB3YXMgc3RhcnRlZCBhcyBbcGF1c2VkXSwgaXQgbWF5IGFscmVhZHkgaGF2ZSB0ZXJtaW5hdGVkCiAgICogYmVmb3JlIHRob3NlIG1ldGhvZHMgY2FuIGNvbXBsZXRlLgogICAqCiAgICogUmV0dXJucyBhIGZ1dHVyZSB3aGljaCB3aWxsIGNvbXBsZXRlIHdpdGggYW4gW0lzb2xhdGVdIGluc3RhbmNlIGlmIHRoZQogICAqIHNwYXduaW5nIHN1Y2NlZWRlZC4gSXQgd2lsbCBjb21wbGV0ZSB3aXRoIGFuIGVycm9yIG90aGVyd2lzZS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPElzb2xhdGU+IHNwYXduPFQ+KAogICAgICB2b2lkIGVudHJ5UG9pbnQoVCBtZXNzYWdlKSwgVCBtZXNzYWdlLAogICAgICB7Ym9vbCBwYXVzZWQ6IGZhbHNlLAogICAgICBib29sIGVycm9yc0FyZUZhdGFsLAogICAgICBTZW5kUG9ydCBvbkV4aXQsCiAgICAgIFNlbmRQb3J0IG9uRXJyb3IsCiAgICAgIEBTaW5jZSgiMi4zIikgU3RyaW5nIGRlYnVnTmFtZX0pOwoKICAvKioKICAgKiBDcmVhdGVzIGFuZCBzcGF3bnMgYW4gaXNvbGF0ZSB0aGF0IHJ1bnMgdGhlIGNvZGUgZnJvbSB0aGUgbGlicmFyeSB3aXRoCiAgICogdGhlIHNwZWNpZmllZCBVUkkuCiAgICoKICAgKiBUaGUgaXNvbGF0ZSBzdGFydHMgZXhlY3V0aW5nIHRoZSB0b3AtbGV2ZWwgYG1haW5gIGZ1bmN0aW9uIG9mIHRoZSBsaWJyYXJ5CiAgICogd2l0aCB0aGUgZ2l2ZW4gVVJJLgogICAqCiAgICogVGhlIHRhcmdldCBgbWFpbmAgbXVzdCBiZSBjYWxsYWJsZSB3aXRoIHplcm8sIG9uZSBvciB0d28gYXJndW1lbnRzLgogICAqIEV4YW1wbGVzOgogICAqCiAgICogKiBgbWFpbigpYAogICAqICogYG1haW4oYXJncylgCiAgICogKiBgbWFpbihhcmdzLCBtZXNzYWdlKWAKICAgKgogICAqIFdoZW4gcHJlc2VudCwgdGhlIHBhcmFtZXRlciBgYXJnc2AgaXMgc2V0IHRvIHRoZSBwcm92aWRlZCBbYXJnc10gbGlzdC4KICAgKiBXaGVuIHByZXNlbnQsIHRoZSBwYXJhbWV0ZXIgYG1lc3NhZ2VgIGlzIHNldCB0byB0aGUgaW5pdGlhbCBbbWVzc2FnZV0uCiAgICoKICAgKiBJZiB0aGUgW3BhdXNlZF0gcGFyYW1ldGVyIGlzIHNldCB0byBgdHJ1ZWAsCiAgICogdGhlIGlzb2xhdGUgd2lsbCBzdGFydCB1cCBpbiBhIHBhdXNlZCBzdGF0ZSwKICAgKiBhcyBpZiBieSBhbiBpbml0aWFsIGNhbGwgb2YgYGlzb2xhdGUucGF1c2UoaXNvbGF0ZS5wYXVzZUNhcGFiaWxpdHkpYC4KICAgKiBUbyByZXN1bWUgdGhlIGlzb2xhdGUsIGNhbGwgYGlzb2xhdGUucmVzdW1lKGlzb2xhdGUucGF1c2VDYXBhYmlsaXR5KWAuCiAgICoKICAgKiBJZiB0aGUgW2Vycm9yc0FyZUZhdGFsXSwgW29uRXhpdF0gYW5kL29yIFtvbkVycm9yXSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZCwKICAgKiB0aGUgaXNvbGF0ZSB3aWxsIGFjdCBhcyBpZiwgcmVzcGVjdGl2ZWx5LCBbc2V0RXJyb3JzRmF0YWxdLAogICAqIFthZGRPbkV4aXRMaXN0ZW5lcl0gYW5kIFthZGRFcnJvckxpc3RlbmVyXSB3ZXJlIGNhbGxlZCB3aXRoIHRoZQogICAqIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIGFuZCB3YXMgcHJvY2Vzc2VkIGJlZm9yZSB0aGUgaXNvbGF0ZSBzdGFydHMKICAgKiBydW5uaW5nLgogICAqCiAgICogWW91IGNhbiBhbHNvIGNhbGwgdGhlIFtzZXRFcnJvcnNGYXRhbF0sIFthZGRPbkV4aXRMaXN0ZW5lcl0gYW5kCiAgICogW2FkZEVycm9yTGlzdGVuZXJdIG1ldGhvZHMgb24gdGhlIHJldHVybmVkIGlzb2xhdGUsIGJ1dCB1bmxlc3MgdGhlCiAgICogaXNvbGF0ZSB3YXMgc3RhcnRlZCBhcyBbcGF1c2VkXSwgaXQgbWF5IGFscmVhZHkgaGF2ZSB0ZXJtaW5hdGVkCiAgICogYmVmb3JlIHRob3NlIG1ldGhvZHMgY2FuIGNvbXBsZXRlLgogICAqCiAgICogSWYgdGhlIFtjaGVja2VkXSBwYXJhbWV0ZXIgaXMgc2V0IHRvIGB0cnVlYCBvciBgZmFsc2VgLAogICAqIHRoZSBuZXcgaXNvbGF0ZSB3aWxsIHJ1biBjb2RlIGluIGNoZWNrZWQgbW9kZSAoZW5hYmxpbmcgYXNzZXJ0cyBhbmQgdHlwZQogICAqIGNoZWNrcyksIHJlc3BlY3RpdmVseSBpbiBwcm9kdWN0aW9uIG1vZGUgKGRpc2FibGluZyBhc3NlcnRzIGFuZCB0eXBlCiAgICogY2hlY2tzKSwgaWYgcG9zc2libGUuIElmIHRoZSBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdGhlIG5ldyBpc29sYXRlIHdpbGwKICAgKiBpbmhlcml0IHRoZSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IGlzb2xhdGUuCiAgICoKICAgKiBJbiBEYXJ0MiBzdHJvbmcgbW9kZSwgdGhlIGBjaGVja2VkYCBwYXJhbWV0ZXIgb25seSBjb250cm9scyBhc3NlcnRzLCBidXQKICAgKiBub3QgdHlwZSBjaGVja3MuCiAgICoKICAgKiBJdCBtYXkgbm90IGFsd2F5cyBiZSBwb3NzaWJsZSB0byBob25vciB0aGUgYGNoZWNrZWRgIHBhcmFtZXRlci4KICAgKiBJZiB0aGUgaXNvbGF0ZSBjb2RlIHdhcyBwcmUtY29tcGlsZWQsIGl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gY2hhbmdlCiAgICogdGhlIGNoZWNrZWQgbW9kZSBzZXR0aW5nIGR5bmFtaWNhbGx5LgogICAqIEluIHRoYXQgY2FzZSwgdGhlIGBjaGVja2VkYCBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KICAgKgogICAqIFdBUk5JTkc6IFRoZSBbY2hlY2tlZF0gcGFyYW1ldGVyIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBhbGwgcGxhdGZvcm1zIHlldC4KICAgKgogICAqIElmIHRoZSBbcGFja2FnZUNvbmZpZ10gcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCB0aGVuIGl0IGlzIHVzZWQgdG8gZmluZCB0aGUKICAgKiBsb2NhdGlvbiBvZiBhIHBhY2thZ2UgcmVzb2x1dGlvbiBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBzcGF3bmVkCiAgICogaXNvbGF0ZS4KICAgKgogICAqIElmIHRoZSBbYXV0b21hdGljUGFja2FnZVJlc29sdXRpb25dIHBhcmFtZXRlciBpcyBwcm92aWRlZCwgdGhlbiB0aGUKICAgKiBsb2NhdGlvbiBvZiB0aGUgcGFja2FnZSBzb3VyY2VzIGluIHRoZSBzcGF3bmVkIGlzb2xhdGUgaXMgYXV0b21hdGljYWxseQogICAqIGRldGVybWluZWQuCiAgICoKICAgKiBUaGUgW2Vudmlyb25tZW50XSBpcyBhIG1hcHBpbmcgZnJvbSBzdHJpbmdzIHRvIHN0cmluZ3Mgd2hpY2ggdGhlCiAgICogc3Bhd25lZCBpc29sYXRlIHVzZXMgd2hlbiBsb29raW5nIHVwIFtTdHJpbmcuZnJvbUVudmlyb25tZW50XSB2YWx1ZXMuCiAgICogVGhlIHN5c3RlbSBtYXkgYWRkIGl0cyBvd24gZW50cmllcyB0byBlbnZpcm9ubWVudCBhcyB3ZWxsLgogICAqIElmIGBlbnZpcm9ubWVudGAgaXMgb21pdHRlZCwgdGhlIHNwYXduZWQgaXNvbGF0ZSBoYXMgdGhlIHNhbWUgZW52aXJvbm1lbnQKICAgKiBkZWNsYXJhdGlvbnMgYXMgdGhlIHNwYXduaW5nIGlzb2xhdGUuCiAgICoKICAgKiBXQVJOSU5HOiBUaGUgW2Vudmlyb25tZW50XSBwYXJhbWV0ZXIgaXMgbm90IGltcGxlbWVudGVkIG9uIGFsbAogICAqIHBsYXRmb3JtcyB5ZXQuCiAgICoKICAgKiBJZiBbZGVidWdOYW1lXSBpcyBwcm92aWRlZCwgdGhlIHNwYXduZWQgW0lzb2xhdGVdIHdpbGwgYmUgaWRlbnRpZmlhYmxlIGJ5CiAgICogdGhpcyBuYW1lIGluIGRlYnVnZ2VycyBhbmQgbG9nZ2luZy4KICAgKgogICAqIFJldHVybnMgYSBmdXR1cmUgdGhhdCB3aWxsIGNvbXBsZXRlIHdpdGggYW4gW0lzb2xhdGVdIGluc3RhbmNlIGlmIHRoZQogICAqIHNwYXduaW5nIHN1Y2NlZWRlZC4gSXQgd2lsbCBjb21wbGV0ZSB3aXRoIGFuIGVycm9yIG90aGVyd2lzZS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPElzb2xhdGU+IHNwYXduVXJpKAogICAgICBVcmkgdXJpLAogICAgICBMaXN0PFN0cmluZz4gYXJncywKICAgICAgdmFyIG1lc3NhZ2UsCiAgICAgIHtib29sIHBhdXNlZDogZmFsc2UsCiAgICAgIFNlbmRQb3J0IG9uRXhpdCwKICAgICAgU2VuZFBvcnQgb25FcnJvciwKICAgICAgYm9vbCBlcnJvcnNBcmVGYXRhbCwKICAgICAgYm9vbCBjaGVja2VkLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50LAogICAgICBARGVwcmVjYXRlZCgnVGhlIHBhY2thZ2VzLyBkaXIgaXMgbm90IHN1cHBvcnRlZCBpbiBEYXJ0IDInKQogICAgICAgICAgVXJpIHBhY2thZ2VSb290LAogICAgICBVcmkgcGFja2FnZUNvbmZpZywKICAgICAgYm9vbCBhdXRvbWF0aWNQYWNrYWdlUmVzb2x1dGlvbjogZmFsc2UsCiAgICAgIEBTaW5jZSgiMi4zIikKICAgICAgICAgIFN0cmluZyBkZWJ1Z05hbWV9KTsKCiAgLyoqCiAgICogUmVxdWVzdHMgdGhlIGlzb2xhdGUgdG8gcGF1c2UuCiAgICoKICAgKiBXaGVuIHRoZSBpc29sYXRlIHJlY2VpdmVzIHRoZSBwYXVzZSBjb21tYW5kLCBpdCBzdG9wcwogICAqIHByb2Nlc3NpbmcgZXZlbnRzIGZyb20gdGhlIGV2ZW50IGxvb3AgcXVldWUuCiAgICogSXQgbWF5IHN0aWxsIGFkZCBuZXcgZXZlbnRzIHRvIHRoZSBxdWV1ZSBpbiByZXNwb25zZSB0bywgZS5nLiwgdGltZXJzCiAgICogb3IgcmVjZWl2ZS1wb3J0IG1lc3NhZ2VzLiBXaGVuIHRoZSBpc29sYXRlIGlzIHJlc3VtZWQsCiAgICogaXQgc3RhcnRzIGhhbmRsaW5nIHRoZSBhbHJlYWR5IGVucXVldWVkIGV2ZW50cy4KICAgKgogICAqIFRoZSBwYXVzZSByZXF1ZXN0IGlzIHNlbnQgdGhyb3VnaCB0aGUgaXNvbGF0ZSdzIGNvbW1hbmQgcG9ydCwKICAgKiB3aGljaCBieXBhc3NlcyB0aGUgcmVjZWl2aW5nIGlzb2xhdGUncyBldmVudCBsb29wLgogICAqIFRoZSBwYXVzZSB0YWtlcyBlZmZlY3Qgd2hlbiBpdCBpcyByZWNlaXZlZCwgcGF1c2luZyB0aGUgZXZlbnQgbG9vcAogICAqIGFzIGl0IGlzIGF0IHRoYXQgdGltZS4KICAgKgogICAqIFRoZSBbcmVzdW1lQ2FwYWJpbGl0eV0gaXMgdXNlZCB0byBpZGVudGl0eSB0aGUgcGF1c2UsCiAgICogYW5kIG11c3QgYmUgdXNlZCBhZ2FpbiB0byBlbmQgdGhlIHBhdXNlIHVzaW5nIFtyZXN1bWVdLgogICAqIElmIFtyZXN1bWVDYXBhYmlsaXR5XSBpcyBvbWl0dGVkLCBhIG5ldyBjYXBhYmlsaXR5IG9iamVjdCBpcyBjcmVhdGVkCiAgICogYW5kIHVzZWQgaW5zdGVhZC4KICAgKgogICAqIElmIGFuIGlzb2xhdGUgaXMgcGF1c2VkIG1vcmUgdGhhbiBvbmNlIHVzaW5nIHRoZSBzYW1lIGNhcGFiaWxpdHksCiAgICogb25seSBvbmUgcmVzdW1lIHdpdGggdGhhdCBjYXBhYmlsaXR5IGlzIG5lZWRlZCB0byBlbmQgdGhlIHBhdXNlLgogICAqCiAgICogSWYgYW4gaXNvbGF0ZSBpcyBwYXVzZWQgdXNpbmcgbW9yZSB0aGFuIG9uZSBjYXBhYmlsaXR5LAogICAqIGVhY2ggcGF1c2UgbXVzdCBiZSBpbmRpdmlkdWFsbHkgZW5kZWQgYmVmb3JlIHRoZSBpc29sYXRlIHJlc3VtZXMuCiAgICoKICAgKiBSZXR1cm5zIHRoZSBjYXBhYmlsaXR5IHRoYXQgbXVzdCBiZSB1c2VkIHRvIGVuZCB0aGUgcGF1c2UuCiAgICogVGhpcyBpcyBlaXRoZXIgW3Jlc3VtZUNhcGFiaWxpdHldLCBvciBhIG5ldyBjYXBhYmlsaXR5IHdoZW4KICAgKiBbcmVzdW1lQ2FwYWJpbGl0eV0gaXMgb21pdHRlZC4KICAgKgogICAqIElmIFtwYXVzZUNhcGFiaWxpdHldIGlzIGBudWxsYCwgb3IgaXQncyBub3QgdGhlIHBhdXNlIGNhcGFiaWxpdHkKICAgKiBvZiB0aGUgaXNvbGF0ZSBpZGVudGlmaWVkIGJ5IFtjb250cm9sUG9ydF0sCiAgICogdGhlIHBhdXNlIHJlcXVlc3QgaXMgaWdub3JlZCBieSB0aGUgcmVjZWl2aW5nIGlzb2xhdGUuCiAgICovCiAgQ2FwYWJpbGl0eSBwYXVzZShbQ2FwYWJpbGl0eSByZXN1bWVDYXBhYmlsaXR5XSkgewogICAgcmVzdW1lQ2FwYWJpbGl0eSA/Pz0gbmV3IENhcGFiaWxpdHkoKTsKICAgIF9wYXVzZShyZXN1bWVDYXBhYmlsaXR5KTsKICAgIHJldHVybiByZXN1bWVDYXBhYmlsaXR5OwogIH0KCiAgLyoqIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIFtwYXVzZV0uICovCiAgZXh0ZXJuYWwgdm9pZCBfcGF1c2UoQ2FwYWJpbGl0eSByZXN1bWVDYXBhYmlsaXR5KTsKCiAgLyoqCiAgICogUmVzdW1lcyBhIHBhdXNlZCBpc29sYXRlLgogICAqCiAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGFuIGlzb2xhdGUgcmVxdWVzdGluZyB0aGF0IGl0IGVuZHMgYSBwYXVzZQogICAqIHRoYXQgd2FzIHByZXZpb3VzbHkgcmVxdWVzdGVkLgogICAqCiAgICogV2hlbiBhbGwgYWN0aXZlIHBhdXNlIHJlcXVlc3RzIGhhdmUgYmVlbiBjYW5jZWxsZWQsIHRoZSBpc29sYXRlCiAgICogd2lsbCBjb250aW51ZSBwcm9jZXNzaW5nIGV2ZW50cyBhbmQgaGFuZGxpbmcgbm9ybWFsIG1lc3NhZ2VzLgogICAqCiAgICogSWYgdGhlIFtyZXN1bWVDYXBhYmlsaXR5XSBpcyBub3Qgb25lIHRoYXQgaGFzIHByZXZpb3VzbHkgYmVlbiB1c2VkCiAgICogdG8gcGF1c2UgdGhlIGlzb2xhdGUsIG9yIGl0IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCB0byByZXN1bWUgZnJvbQogICAqIHRoYXQgcGF1c2UsIHRoZSByZXN1bWUgY2FsbCBoYXMgbm8gZWZmZWN0LgogICAqLwogIGV4dGVybmFsIHZvaWQgcmVzdW1lKENhcGFiaWxpdHkgcmVzdW1lQ2FwYWJpbGl0eSk7CgogIC8qKgogICAqIFJlcXVlc3RzIGFuIGV4aXQgbWVzc2FnZSBvbiBbcmVzcG9uc2VQb3J0XSB3aGVuIHRoZSBpc29sYXRlIHRlcm1pbmF0ZXMuCiAgICoKICAgKiBUaGUgaXNvbGF0ZSB3aWxsIHNlbmQgW3Jlc3BvbnNlXSBhcyBhIG1lc3NhZ2Ugb24gW3Jlc3BvbnNlUG9ydF0gYXMgdGhlIGxhc3QKICAgKiB0aGluZyBiZWZvcmUgaXQgdGVybWluYXRlcy4gSXQgd2lsbCBydW4gbm8gZnVydGhlciBjb2RlIGFmdGVyIHRoZSBtZXNzYWdlCiAgICogaGFzIGJlZW4gc2VudC4KICAgKgogICAqIEFkZGluZyB0aGUgc2FtZSBwb3J0IG1vcmUgdGhhbiBvbmNlIHdpbGwgb25seSBjYXVzZSBpdCB0byByZWNlaXZlIG9uZSBleGl0CiAgICogbWVzc2FnZSwgdXNpbmcgdGhlIGxhc3QgcmVzcG9uc2UgdmFsdWUgdGhhdCB3YXMgYWRkZWQsCiAgICogYW5kIGl0IG9ubHkgbmVlZHMgdG8gYmUgcmVtb3ZlZCBvbmNlIHVzaW5nIFtyZW1vdmVPbkV4aXRMaXN0ZW5lcl0uCiAgICoKICAgKiBJZiB0aGUgaXNvbGF0ZSBoYXMgdGVybWluYXRlZCBiZWZvcmUgaXQgY2FuIHJlY2VpdmUgdGhpcyByZXF1ZXN0LAogICAqIG5vIGV4aXQgbWVzc2FnZSB3aWxsIGJlIHNlbnQuCiAgICoKICAgKiBUaGUgW3Jlc3BvbnNlXSBvYmplY3QgbXVzdCBmb2xsb3cgdGhlIHNhbWUgcmVzdHJpY3Rpb25zIGFzIGVuZm9yY2VkIGJ5CiAgICogW1NlbmRQb3J0LnNlbmRdLgogICAqIEl0IGlzIHJlY29tbWVuZGVkIHRvIG9ubHkgdXNlIHNpbXBsZSB2YWx1ZXMgdGhhdCBjYW4gYmUgc2VudCB0byBhbGwKICAgKiBpc29sYXRlcywgbGlrZSBgbnVsbGAsIGJvb2xlYW5zLCBudW1iZXJzIG9yIHN0cmluZ3MuCiAgICoKICAgKiBTaW5jZSBpc29sYXRlcyBydW4gY29uY3VycmVudGx5LCBpdCdzIHBvc3NpYmxlIGZvciBpdCB0byBleGl0IGJlZm9yZSB0aGUKICAgKiBleGl0IGxpc3RlbmVyIGlzIGVzdGFibGlzaGVkLCBhbmQgaW4gdGhhdCBjYXNlIG5vIHJlc3BvbnNlIHdpbGwgYmUKICAgKiBzZW50IG9uIFtyZXNwb25zZVBvcnRdLgogICAqIFRvIGF2b2lkIHRoaXMsIGVpdGhlciB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHRvIHRoZSBzcGF3bgogICAqIGZ1bmN0aW9uLCBvciBzdGFydCB0aGUgaXNvbGF0ZSBwYXVzZWQsIGFkZCB0aGUgbGlzdGVuZXIgYW5kCiAgICogdGhlbiByZXN1bWUgdGhlIGlzb2xhdGUuCiAgICovCiAgLyogVE9ETyhscm4pOiBDYW4gd2UgZG8gYmV0dGVyPyBDYW4gdGhlIHN5c3RlbSByZWNvZ25pemUgdGhpcyBtZXNzYWdlIGFuZAogICAqIHNlbmQgYSByZXBseSBpZiB0aGUgcmVjZWl2aW5nIGlzb2xhdGUgaXMgZGVhZD8KICAgKi8KICBleHRlcm5hbCB2b2lkIGFkZE9uRXhpdExpc3RlbmVyKFNlbmRQb3J0IHJlc3BvbnNlUG9ydCwge09iamVjdCByZXNwb25zZX0pOwoKICAvKioKICAgKiBTdG9wcyBsaXN0ZW5pbmcgZm9yIGV4aXQgbWVzc2FnZXMgZnJvbSB0aGUgaXNvbGF0ZS4KICAgKgogICAqIFJlcXVlc3RzIGZvciB0aGUgaXNvbGF0ZSB0byBub3Qgc2VuZCBleGl0IG1lc3NhZ2VzIG9uIFtyZXNwb25zZVBvcnRdLgogICAqIElmIHRoZSBpc29sYXRlIGlzbid0IGV4cGVjdGluZyB0byBzZW5kIGV4aXQgbWVzc2FnZXMgb24gW3Jlc3BvbnNlUG9ydF0sCiAgICogYmVjYXVzZSB0aGUgcG9ydCBoYXNuJ3QgYmVlbiBhZGRlZCB1c2luZyBbYWRkT25FeGl0TGlzdGVuZXJdLAogICAqIG9yIGJlY2F1c2UgaXQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkLCB0aGUgcmVxdWVzdCBpcyBpZ25vcmVkLgogICAqCiAgICogSWYgdGhlIHNhbWUgcG9ydCBoYXMgYmVlbiBwYXNzZWQgdmlhIFthZGRPbkV4aXRMaXN0ZW5lcl0gbW9yZSB0aGFuIG9uY2UsCiAgICogb25seSBvbmUgY2FsbCB0byBgcmVtb3ZlT25FeGl0TGlzdGVuZXJgIGlzIG5lZWRlZCB0byBzdG9wIGl0IGZyb20gcmVjZWl2aW5nCiAgICogZXhpdCBtZXNzYWdlcy4KICAgKgogICAqIENsb3NpbmcgdGhlIHJlY2VpdmUgcG9ydCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgW3Jlc3BvbnNlUG9ydF0gZG9lcwogICAqIG5vdCBzdG9wIHRoZSBpc29sYXRlIGZyb20gc2VuZGluZyB1bmNhdWdodCBlcnJvcnMsIHRoZXkgYXJlIGp1c3QgZ29pbmcgdG8KICAgKiBiZSBsb3N0LgogICAqCiAgICogQW4gZXhpdCBtZXNzYWdlIG1heSBzdGlsbCBiZSBzZW50IGlmIHRoZSBpc29sYXRlIHRlcm1pbmF0ZXMKICAgKiBiZWZvcmUgdGhpcyByZXF1ZXN0IGlzIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQuCiAgICovCiAgZXh0ZXJuYWwgdm9pZCByZW1vdmVPbkV4aXRMaXN0ZW5lcihTZW5kUG9ydCByZXNwb25zZVBvcnQpOwoKICAvKioKICAgKiBTZXRzIHdoZXRoZXIgdW5jYXVnaHQgZXJyb3JzIHdpbGwgdGVybWluYXRlIHRoZSBpc29sYXRlLgogICAqCiAgICogSWYgZXJyb3JzIGFyZSBmYXRhbCwgYW55IHVuY2F1Z2h0IGVycm9yIHdpbGwgdGVybWluYXRlIHRoZSBpc29sYXRlCiAgICogZXZlbnQgbG9vcCBhbmQgc2h1dCBkb3duIHRoZSBpc29sYXRlLgogICAqCiAgICogVGhpcyBjYWxsIHJlcXVpcmVzIHRoZSBbdGVybWluYXRlQ2FwYWJpbGl0eV0gZm9yIHRoZSBpc29sYXRlLgogICAqIElmIHRoZSBjYXBhYmlsaXR5IGlzIGFic2VudCBvciBpbmNvcnJlY3QsIG5vIGNoYW5nZSBpcyBtYWRlLgogICAqCiAgICogU2luY2UgaXNvbGF0ZXMgcnVuIGNvbmN1cnJlbnRseSwgaXQncyBwb3NzaWJsZSBmb3IgdGhlIHJlY2VpdmluZyBpc29sYXRlCiAgICogdG8gZXhpdCBkdWUgdG8gYW4gZXJyb3IsIGJlZm9yZSBhIHJlcXVlc3QsIHVzaW5nIHRoaXMgbWV0aG9kLCBoYXMgYmVlbgogICAqIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQuCiAgICogVG8gYXZvaWQgdGhpcywgZWl0aGVyIHVzZSB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIgdG8gdGhlIHNwYXduCiAgICogZnVuY3Rpb24sIG9yIHN0YXJ0IHRoZSBpc29sYXRlIHBhdXNlZCwgc2V0IGVycm9ycyBub24tZmF0YWwgYW5kCiAgICogdGhlbiByZXN1bWUgdGhlIGlzb2xhdGUuCiAgICovCiAgZXh0ZXJuYWwgdm9pZCBzZXRFcnJvcnNGYXRhbChib29sIGVycm9yc0FyZUZhdGFsKTsKCiAgLyoqCiAgICogUmVxdWVzdHMgdGhlIGlzb2xhdGUgdG8gc2h1dCBkb3duLgogICAqCiAgICogVGhlIGlzb2xhdGUgaXMgcmVxdWVzdGVkIHRvIHRlcm1pbmF0ZSBpdHNlbGYuCiAgICogVGhlIFtwcmlvcml0eV0gYXJndW1lbnQgc3BlY2lmaWVzIHdoZW4gdGhpcyBtdXN0IGhhcHBlbi4KICAgKgogICAqIFRoZSBbcHJpb3JpdHldLCB3aGVuIHByb3ZpZGVkLCBtdXN0IGJlIG9uZSBvZiBbaW1tZWRpYXRlXSBvcgogICAqIFtiZWZvcmVOZXh0RXZlbnRdICh0aGUgZGVmYXVsdCkuCiAgICogVGhlIHNodXRkb3duIGlzIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgdGltZXMgZGVwZW5kaW5nIG9uIHRoZSBwcmlvcml0eToKICAgKgogICAqICogYGltbWVkaWF0ZWA6IFRoZSBpc29sYXRlIHNodXRzIGRvd24gYXMgc29vbiBhcyBwb3NzaWJsZS4KICAgKiAgICAgQ29udHJvbCBtZXNzYWdlcyBhcmUgaGFuZGxlZCBpbiBvcmRlciwgc28gYWxsIHByZXZpb3VzbHkgc2VudCBjb250cm9sCiAgICogICAgIGV2ZW50cyBmcm9tIHRoaXMgaXNvbGF0ZSB3aWxsIGFsbCBoYXZlIGJlZW4gcHJvY2Vzc2VkLgogICAqICAgICBUaGUgc2h1dGRvd24gc2hvdWxkIGhhcHBlbiBubyBsYXRlciB0aGFuIGlmIHNlbnQgd2l0aAogICAqICAgICBgYmVmb3JlTmV4dEV2ZW50YC4KICAgKiAgICAgSXQgbWF5IGhhcHBlbiBlYXJsaWVyIGlmIHRoZSBzeXN0ZW0gaGFzIGEgd2F5IHRvIHNodXQgZG93biBjbGVhbmx5CiAgICogICAgIGF0IGFuIGVhcmxpZXIgdGltZSwgZXZlbiBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBhbm90aGVyIGV2ZW50LgogICAqICogYGJlZm9yZU5leHRFdmVudGA6IFRoZSBzaHV0ZG93biBpcyBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0IHRpbWUKICAgKiAgICAgY29udHJvbCByZXR1cm5zIHRvIHRoZSBldmVudCBsb29wIG9mIHRoZSByZWNlaXZpbmcgaXNvbGF0ZSwKICAgKiAgICAgYWZ0ZXIgdGhlIGN1cnJlbnQgZXZlbnQsIGFuZCBhbnkgYWxyZWFkeSBzY2hlZHVsZWQgY29udHJvbCBldmVudHMsCiAgICogICAgIGFyZSBjb21wbGV0ZWQuCiAgICoKICAgKiBJZiBbdGVybWluYXRlQ2FwYWJpbGl0eV0gaXMgYG51bGxgLCBvciBpdCdzIG5vdCB0aGUgdGVybWluYXRlIGNhcGFiaWxpdHkKICAgKiBvZiB0aGUgaXNvbGF0ZSBpZGVudGlmaWVkIGJ5IFtjb250cm9sUG9ydF0sCiAgICogdGhlIGtpbGwgcmVxdWVzdCBpcyBpZ25vcmVkIGJ5IHRoZSByZWNlaXZpbmcgaXNvbGF0ZS4KICAgKi8KICBleHRlcm5hbCB2b2lkIGtpbGwoe2ludCBwcmlvcml0eTogYmVmb3JlTmV4dEV2ZW50fSk7CgogIC8qKgogICAqIFJlcXVlc3RzIHRoYXQgdGhlIGlzb2xhdGUgc2VuZCBbcmVzcG9uc2VdIG9uIHRoZSBbcmVzcG9uc2VQb3J0XS4KICAgKgogICAqIFRoZSBbcmVzcG9uc2VdIG9iamVjdCBtdXN0IGZvbGxvdyB0aGUgc2FtZSByZXN0cmljdGlvbnMgYXMgZW5mb3JjZWQgYnkKICAgKiBbU2VuZFBvcnQuc2VuZF0uCiAgICogSXQgaXMgcmVjb21tZW5kZWQgdG8gb25seSB1c2Ugc2ltcGxlIHZhbHVlcyB0aGF0IGNhbiBiZSBzZW50IHRvIGFsbAogICAqIGlzb2xhdGVzLCBsaWtlIGBudWxsYCwgYm9vbGVhbnMsIG51bWJlcnMgb3Igc3RyaW5ncy4KICAgKgogICAqIElmIHRoZSBpc29sYXRlIGlzIGFsaXZlLCBpdCB3aWxsIGV2ZW50dWFsbHkgc2VuZCBgcmVzcG9uc2VgCiAgICogKGRlZmF1bHRpbmcgdG8gYG51bGxgKSBvbiB0aGUgcmVzcG9uc2UgcG9ydC4KICAgKgogICAqIFRoZSBbcHJpb3JpdHldIG11c3QgYmUgb25lIG9mIFtpbW1lZGlhdGVdIG9yIFtiZWZvcmVOZXh0RXZlbnRdLgogICAqIFRoZSByZXNwb25zZSBpcyBzZW50IGF0IGRpZmZlcmVudCB0aW1lcyBkZXBlbmRpbmcgb24gdGhlIHBpbmcgdHlwZToKICAgKgogICAqICogYGltbWVkaWF0ZWA6IFRoZSBpc29sYXRlIHJlc3BvbmRzIGFzIHNvb24gYXMgaXQgcmVjZWl2ZXMgdGhlCiAgICogICAgIGNvbnRyb2wgbWVzc2FnZS4gVGhpcyBpcyBhZnRlciBhbnkgcHJldmlvdXMgY29udHJvbCBtZXNzYWdlCiAgICogICAgIGZyb20gdGhlIHNhbWUgaXNvbGF0ZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcHJvY2Vzc2VkLAogICAqICAgICBidXQgbWF5IGJlIGR1cmluZyBleGVjdXRpb24gb2YgYW5vdGhlciBldmVudC4KICAgKiAqIGBiZWZvcmVOZXh0RXZlbnRgOiBUaGUgcmVzcG9uc2UgaXMgc2NoZWR1bGVkIGZvciB0aGUgbmV4dCB0aW1lCiAgICogICAgIGNvbnRyb2wgcmV0dXJucyB0byB0aGUgZXZlbnQgbG9vcCBvZiB0aGUgcmVjZWl2aW5nIGlzb2xhdGUsCiAgICogICAgIGFmdGVyIHRoZSBjdXJyZW50IGV2ZW50LCBhbmQgYW55IGFscmVhZHkgc2NoZWR1bGVkIGNvbnRyb2wgZXZlbnRzLAogICAqICAgICBhcmUgY29tcGxldGVkLgogICAqLwogIGV4dGVybmFsIHZvaWQgcGluZyhTZW5kUG9ydCByZXNwb25zZVBvcnQsCiAgICAgIHtPYmplY3QgcmVzcG9uc2UsIGludCBwcmlvcml0eTogaW1tZWRpYXRlfSk7CgogIC8qKgogICAqIFJlcXVlc3RzIHRoYXQgdW5jYXVnaHQgZXJyb3JzIG9mIHRoZSBpc29sYXRlIGFyZSBzZW50IGJhY2sgdG8gW3BvcnRdLgogICAqCiAgICogVGhlIGVycm9ycyBhcmUgc2VudCBiYWNrIGFzIHR3byBlbGVtZW50cyBsaXN0cy4KICAgKiBUaGUgZmlyc3QgZWxlbWVudCBpcyBhIGBTdHJpbmdgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciwgdXN1YWxseQogICAqIGNyZWF0ZWQgYnkgY2FsbGluZyBgdG9TdHJpbmdgIG9uIHRoZSBlcnJvci4KICAgKiBUaGUgc2Vjb25kIGVsZW1lbnQgaXMgYSBgU3RyaW5nYCByZXByZXNlbnRhdGlvbiBvZiBhbiBhY2NvbXBhbnlpbmcKICAgKiBzdGFjayB0cmFjZSwgb3IgYG51bGxgIGlmIG5vIHN0YWNrIHRyYWNlIHdhcyBwcm92aWRlZC4KICAgKiBUbyBjb252ZXJ0IHRoaXMgYmFjayB0byBhIFtTdGFja1RyYWNlXSBvYmplY3QsIHVzZSBbU3RhY2tUcmFjZS5mcm9tU3RyaW5nXS4KICAgKgogICAqIExpc3RlbmluZyB1c2luZyB0aGUgc2FtZSBwb3J0IG1vcmUgdGhhbiBvbmNlIGRvZXMgbm90aGluZy4KICAgKiBBIHBvcnQgd2lsbCBvbmx5IHJlY2VpdmUgZWFjaCBlcnJvciBvbmNlLAogICAqIGFuZCB3aWxsIG9ubHkgbmVlZCB0byBiZSByZW1vdmVkIG9uY2UgdXNpbmcgW3JlbW92ZUVycm9yTGlzdGVuZXJdLgoKICAgKiBDbG9zaW5nIHRoZSByZWNlaXZlIHBvcnQgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBvcnQgZG9lcyBub3Qgc3RvcAogICAqIHRoZSBpc29sYXRlIGZyb20gc2VuZGluZyB1bmNhdWdodCBlcnJvcnMsIHRoZXkgYXJlIGp1c3QgZ29pbmcgdG8gYmUgbG9zdC4KICAgKiBJbnN0ZWFkIHVzZSBbcmVtb3ZlRXJyb3JMaXN0ZW5lcl0gdG8gc3RvcCByZWNlaXZpbmcgZXJyb3JzIG9uIFtwb3J0XS4KICAgKgogICAqIFNpbmNlIGlzb2xhdGVzIHJ1biBjb25jdXJyZW50bHksIGl0J3MgcG9zc2libGUgZm9yIGl0IHRvIGV4aXQgYmVmb3JlIHRoZQogICAqIGVycm9yIGxpc3RlbmVyIGlzIGVzdGFibGlzaGVkLiBUbyBhdm9pZCB0aGlzLCBzdGFydCB0aGUgaXNvbGF0ZSBwYXVzZWQsCiAgICogYWRkIHRoZSBsaXN0ZW5lciBhbmQgdGhlbiByZXN1bWUgdGhlIGlzb2xhdGUuCiAgICovCiAgZXh0ZXJuYWwgdm9pZCBhZGRFcnJvckxpc3RlbmVyKFNlbmRQb3J0IHBvcnQpOwoKICAvKioKICAgKiBTdG9wcyBsaXN0ZW5pbmcgZm9yIHVuY2F1Z2h0IGVycm9ycyBmcm9tIHRoZSBpc29sYXRlLgogICAqCiAgICogUmVxdWVzdHMgZm9yIHRoZSBpc29sYXRlIHRvIG5vdCBzZW5kIHVuY2F1Z2h0IGVycm9ycyBvbiBbcG9ydF0uCiAgICogSWYgdGhlIGlzb2xhdGUgaXNuJ3QgZXhwZWN0aW5nIHRvIHNlbmQgdW5jYXVnaHQgZXJyb3JzIG9uIFtwb3J0XSwKICAgKiBiZWNhdXNlIHRoZSBwb3J0IGhhc24ndCBiZWVuIGFkZGVkIHVzaW5nIFthZGRFcnJvckxpc3RlbmVyXSwKICAgKiBvciBiZWNhdXNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgdGhlIHJlcXVlc3QgaXMgaWdub3JlZC4KICAgKgogICAqIElmIHRoZSBzYW1lIHBvcnQgaGFzIGJlZW4gcGFzc2VkIHZpYSBbYWRkRXJyb3JMaXN0ZW5lcl0gbW9yZSB0aGFuIG9uY2UsCiAgICogb25seSBvbmUgY2FsbCB0byBgcmVtb3ZlRXJyb3JMaXN0ZW5lcmAgaXMgbmVlZGVkIHRvIHN0b3AgaXQgZnJvbSByZWNlaXZpbmcKICAgKiB1bmNhdWdodCBlcnJvcnMuCiAgICoKICAgKiBVbmNhdWdodCBlcnJvcnMgbWVzc2FnZSBtYXkgc3RpbGwgYmUgc2VudCBieSB0aGUgaXNvbGF0ZQogICAqIHVudGlsIHRoaXMgcmVxdWVzdCBpcyByZWNlaXZlZCBhbmQgcHJvY2Vzc2VkLgogICAqLwogIGV4dGVybmFsIHZvaWQgcmVtb3ZlRXJyb3JMaXN0ZW5lcihTZW5kUG9ydCBwb3J0KTsKCiAgLyoqCiAgICogUmV0dXJucyBhIGJyb2FkY2FzdCBzdHJlYW0gb2YgdW5jYXVnaHQgZXJyb3JzIGZyb20gdGhlIGlzb2xhdGUuCiAgICoKICAgKiBFYWNoIGVycm9yIGlzIHByb3ZpZGVkIGFzIGFuIGVycm9yIGV2ZW50IG9uIHRoZSBzdHJlYW0uCiAgICoKICAgKiBUaGUgYWN0dWFsIGVycm9yIG9iamVjdCBhbmQgc3RhY2tUcmFjZXMgd2lsbCBub3QgbmVjZXNzYXJpbHkKICAgKiBiZSB0aGUgc2FtZSBvYmplY3QgdHlwZXMgYXMgaW4gdGhlIGFjdHVhbCBpc29sYXRlLCBidXQgdGhleSB3aWxsCiAgICogYWx3YXlzIGhhdmUgdGhlIHNhbWUgW09iamVjdC50b1N0cmluZ10gcmVzdWx0LgogICAqCiAgICogVGhpcyBzdHJlYW0gaXMgYmFzZWQgb24gW2FkZEVycm9yTGlzdGVuZXJdIGFuZCBbcmVtb3ZlRXJyb3JMaXN0ZW5lcl0uCiAgICovCiAgU3RyZWFtIGdldCBlcnJvcnMgewogICAgU3RyZWFtQ29udHJvbGxlciBjb250cm9sbGVyOwogICAgUmF3UmVjZWl2ZVBvcnQgcG9ydDsKICAgIHZvaWQgaGFuZGxlRXJyb3IobWVzc2FnZSkgewogICAgICBMaXN0IGxpc3RNZXNzYWdlID0gbWVzc2FnZTsKICAgICAgU3RyaW5nIGVycm9yRGVzY3JpcHRpb24gPSBsaXN0TWVzc2FnZVswXTsKICAgICAgU3RyaW5nIHN0YWNrRGVzY3JpcHRpb24gPSBsaXN0TWVzc2FnZVsxXTsKICAgICAgdmFyIGVycm9yID0gbmV3IFJlbW90ZUVycm9yKGVycm9yRGVzY3JpcHRpb24sIHN0YWNrRGVzY3JpcHRpb24pOwogICAgICBjb250cm9sbGVyLmFkZEVycm9yKGVycm9yLCBlcnJvci5zdGFja1RyYWNlKTsKICAgIH0KCiAgICBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46ICgpIHsKICAgICAgICAgIHBvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoaGFuZGxlRXJyb3IpOwogICAgICAgICAgdGhpcy5hZGRFcnJvckxpc3RlbmVyKHBvcnQuc2VuZFBvcnQpOwogICAgICAgIH0sCiAgICAgICAgb25DYW5jZWw6ICgpIHsKICAgICAgICAgIHRoaXMucmVtb3ZlRXJyb3JMaXN0ZW5lcihwb3J0LnNlbmRQb3J0KTsKICAgICAgICAgIHBvcnQuY2xvc2UoKTsKICAgICAgICAgIHBvcnQgPSBudWxsOwogICAgICAgIH0pOwogICAgcmV0dXJuIGNvbnRyb2xsZXIuc3RyZWFtOwogIH0KfQoKLyoqCiAqIFNlbmRzIG1lc3NhZ2VzIHRvIGl0cyBbUmVjZWl2ZVBvcnRdcy4KICoKICogW1NlbmRQb3J0XXMgYXJlIGNyZWF0ZWQgZnJvbSBbUmVjZWl2ZVBvcnRdcy4gQW55IG1lc3NhZ2Ugc2VudCB0aHJvdWdoCiAqIGEgW1NlbmRQb3J0XSBpcyBkZWxpdmVyZWQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgW1JlY2VpdmVQb3J0XS4gVGhlcmUgbWlnaHQgYmUKICogbWFueSBbU2VuZFBvcnRdcyBmb3IgdGhlIHNhbWUgW1JlY2VpdmVQb3J0XS4KICoKICogW1NlbmRQb3J0XXMgY2FuIGJlIHRyYW5zbWl0dGVkIHRvIG90aGVyIGlzb2xhdGVzLCBhbmQgdGhleSBwcmVzZXJ2ZSBlcXVhbGl0eQogKiB3aGVuIHNlbnQuCiAqLwphYnN0cmFjdCBjbGFzcyBTZW5kUG9ydCBpbXBsZW1lbnRzIENhcGFiaWxpdHkgewogIC8qKgogICAqIFNlbmRzIGFuIGFzeW5jaHJvbm91cyBbbWVzc2FnZV0gdGhyb3VnaCB0aGlzIHNlbmQgcG9ydCwgdG8gaXRzCiAgICogY29ycmVzcG9uZGluZyBgUmVjZWl2ZVBvcnRgLgogICAqCiAgICogVGhlIGNvbnRlbnQgb2YgW21lc3NhZ2VdIGNhbiBiZTogcHJpbWl0aXZlIHZhbHVlcyAobnVsbCwgbnVtLCBib29sLCBkb3VibGUsCiAgICogU3RyaW5nKSwgaW5zdGFuY2VzIG9mIFtTZW5kUG9ydF0sIGFuZCBsaXN0cyBhbmQgbWFwcyB3aG9zZSBlbGVtZW50cyBhcmUgYW55CiAgICogb2YgdGhlc2UuIExpc3QgYW5kIG1hcHMgYXJlIGFsc28gYWxsb3dlZCB0byBiZSBjeWNsaWMuCiAgICoKICAgKiBJbiB0aGUgc3BlY2lhbCBjaXJjdW1zdGFuY2VzIHdoZW4gdHdvIGlzb2xhdGVzIHNoYXJlIHRoZSBzYW1lIGNvZGUgYW5kIGFyZQogICAqIHJ1bm5pbmcgaW4gdGhlIHNhbWUgcHJvY2VzcyAoZS5nLiBpc29sYXRlcyBjcmVhdGVkIHZpYSBbSXNvbGF0ZS5zcGF3bl0pLCBpdAogICAqIGlzIGFsc28gcG9zc2libGUgdG8gc2VuZCBvYmplY3QgaW5zdGFuY2VzICh3aGljaCB3b3VsZCBiZSBjb3BpZWQgaW4gdGhlCiAgICogcHJvY2VzcykuIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGJ5IHRoZSBkYXJ0dm0uICBGb3Igbm93LCB0aGUKICAgKiBkYXJ0MmpzIGNvbXBpbGVyIG9ubHkgc3VwcG9ydHMgdGhlIHJlc3RyaWN0ZWQgbWVzc2FnZXMgZGVzY3JpYmVkIGFib3ZlLgogICAqCiAgICogVGhlIHNlbmQgaGFwcGVucyBpbW1lZGlhdGVseSBhbmQgZG9lc24ndCBibG9jay4gIFRoZSBjb3JyZXNwb25kaW5nIHJlY2VpdmUKICAgKiBwb3J0IGNhbiByZWNlaXZlIHRoZSBtZXNzYWdlIGFzIHNvb24gYXMgaXRzIGlzb2xhdGUncyBldmVudCBsb29wIGlzIHJlYWR5CiAgICogdG8gZGVsaXZlciBpdCwgaW5kZXBlbmRlbnRseSBvZiB3aGF0IHRoZSBzZW5kaW5nIGlzb2xhdGUgaXMgZG9pbmcuCiAgICovCiAgdm9pZCBzZW5kKHZhciBtZXNzYWdlKTsKCiAgLyoqCiAgICogVGVzdHMgd2hldGhlciBbb3RoZXJdIGlzIGEgW1NlbmRQb3J0XSBwb2ludGluZyB0byB0aGUgc2FtZQogICAqIFtSZWNlaXZlUG9ydF0gYXMgdGhpcyBvbmUuCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PSh2YXIgb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIGFuIGltbXV0YWJsZSBoYXNoIGNvZGUgZm9yIHRoaXMgc2VuZCBwb3J0IHRoYXQgaXMKICAgKiBjb25zaXN0ZW50IHdpdGggdGhlID09IG9wZXJhdG9yLgogICAqLwogIGludCBnZXQgaGFzaENvZGU7Cn0KCi8qKgogKiBUb2dldGhlciB3aXRoIFtTZW5kUG9ydF0sIHRoZSBvbmx5IG1lYW5zIG9mIGNvbW11bmljYXRpb24gYmV0d2VlbiBpc29sYXRlcy4KICoKICogW1JlY2VpdmVQb3J0XXMgaGF2ZSBhIGBzZW5kUG9ydGAgZ2V0dGVyIHdoaWNoIHJldHVybnMgYSBbU2VuZFBvcnRdLgogKiBBbnkgbWVzc2FnZSB0aGF0IGlzIHNlbnQgdGhyb3VnaCB0aGlzIFtTZW5kUG9ydF0KICogaXMgZGVsaXZlcmVkIHRvIHRoZSBbUmVjZWl2ZVBvcnRdIGl0IGhhcyBiZWVuIGNyZWF0ZWQgZnJvbS4gVGhlcmUsIHRoZQogKiBtZXNzYWdlIGlzIGRpc3BhdGNoZWQgdG8gdGhlIGBSZWNlaXZlUG9ydGAncyBsaXN0ZW5lci4KICoKICogQSBbUmVjZWl2ZVBvcnRdIGlzIGEgbm9uLWJyb2FkY2FzdCBzdHJlYW0uIFRoaXMgbWVhbnMgdGhhdCBpdCBidWZmZXJzCiAqIGluY29taW5nIG1lc3NhZ2VzIHVudGlsIGEgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZC4gT25seSBvbmUgbGlzdGVuZXIgY2FuCiAqIHJlY2VpdmUgbWVzc2FnZXMuIFNlZSBbU3RyZWFtLmFzQnJvYWRjYXN0U3RyZWFtXSBmb3IgdHJhbnNmb3JtaW5nIHRoZSBwb3J0CiAqIHRvIGEgYnJvYWRjYXN0IHN0cmVhbS4KICoKICogQSBbUmVjZWl2ZVBvcnRdIG1heSBoYXZlIG1hbnkgW1NlbmRQb3J0XXMuCiAqLwphYnN0cmFjdCBjbGFzcyBSZWNlaXZlUG9ydCBpbXBsZW1lbnRzIFN0cmVhbSB7CiAgLyoqCiAgICogT3BlbnMgYSBsb25nLWxpdmVkIHBvcnQgZm9yIHJlY2VpdmluZyBtZXNzYWdlcy4KICAgKgogICAqIEEgW1JlY2VpdmVQb3J0XSBpcyBhIG5vbi1icm9hZGNhc3Qgc3RyZWFtLiBUaGlzIG1lYW5zIHRoYXQgaXQgYnVmZmVycwogICAqIGluY29taW5nIG1lc3NhZ2VzIHVudGlsIGEgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZC4gT25seSBvbmUgbGlzdGVuZXIgY2FuCiAgICogcmVjZWl2ZSBtZXNzYWdlcy4gU2VlIFtTdHJlYW0uYXNCcm9hZGNhc3RTdHJlYW1dIGZvciB0cmFuc2Zvcm1pbmcgdGhlIHBvcnQKICAgKiB0byBhIGJyb2FkY2FzdCBzdHJlYW0uCiAgICoKICAgKiBBIHJlY2VpdmUgcG9ydCBpcyBjbG9zZWQgYnkgY2FuY2VsaW5nIGl0cyBzdWJzY3JpcHRpb24uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBSZWNlaXZlUG9ydCgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1JlY2VpdmVQb3J0XSBmcm9tIGEgW1Jhd1JlY2VpdmVQb3J0XS4KICAgKgogICAqIFRoZSBoYW5kbGVyIG9mIHRoZSBnaXZlbiBbcmF3UG9ydF0gaXMgb3ZlcndyaXR0ZW4gZHVyaW5nIHRoZSBjb25zdHJ1Y3Rpb24KICAgKiBvZiB0aGUgcmVzdWx0LgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgUmVjZWl2ZVBvcnQuZnJvbVJhd1JlY2VpdmVQb3J0KFJhd1JlY2VpdmVQb3J0IHJhd1BvcnQpOwoKICAvKioKICAgKiBJbmhlcml0ZWQgZnJvbSBbU3RyZWFtXS4KICAgKgogICAqIE5vdGUgdGhhdCBbb25FcnJvcl0gYW5kIFtjYW5jZWxPbkVycm9yXSBhcmUgaWdub3JlZCBzaW5jZSBhIFJlY2VpdmVQb3J0CiAgICogd2lsbCBuZXZlciByZWNlaXZlIGFuIGVycm9yLgogICAqCiAgICogVGhlIFtvbkRvbmVdIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGNsb3Nlcy4KICAgKiBUaGUgc3RyZWFtIGNsb3NlcyB3aGVuIFtjbG9zZV0gaXMgY2FsbGVkLgogICAqLwogIFN0cmVhbVN1YnNjcmlwdGlvbiBsaXN0ZW4odm9pZCBvbkRhdGEodmFyIG1lc3NhZ2UpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSk7CgogIC8qKgogICAqIENsb3NlcyBgdGhpc2AuCiAgICoKICAgKiBJZiB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBjYW5jZWxlZCB5ZXQsIGFkZHMgYSBjbG9zZS1ldmVudCB0byB0aGUgZXZlbnQKICAgKiBxdWV1ZSBhbmQgZGlzY2FyZHMgYW55IGZ1cnRoZXIgaW5jb21pbmcgbWVzc2FnZXMuCiAgICoKICAgKiBJZiB0aGUgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsZWQgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC4KICAgKi8KICB2b2lkIGNsb3NlKCk7CgogIC8qKgogICAqIFJldHVybnMgYSBbU2VuZFBvcnRdIHRoYXQgc2VuZHMgdG8gdGhpcyByZWNlaXZlIHBvcnQuCiAgICovCiAgU2VuZFBvcnQgZ2V0IHNlbmRQb3J0Owp9CgphYnN0cmFjdCBjbGFzcyBSYXdSZWNlaXZlUG9ydCB7CiAgLyoqCiAgICogT3BlbnMgYSBsb25nLWxpdmVkIHBvcnQgZm9yIHJlY2VpdmluZyBtZXNzYWdlcy4KICAgKgogICAqIEEgW1Jhd1JlY2VpdmVQb3J0XSBpcyBsb3cgbGV2ZWwgYW5kIGRvZXMgbm90IHdvcmsgd2l0aCBbWm9uZV1zLiBJdAogICAqIGNhbiBub3QgYmUgcGF1c2VkLiBUaGUgZGF0YS1oYW5kbGVyIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgZmlyc3QKICAgKiBldmVudCBpcyByZWNlaXZlZC4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFJhd1JlY2VpdmVQb3J0KFtGdW5jdGlvbiBoYW5kbGVyXSk7CgogIC8qKgogICAqIFNldHMgdGhlIGhhbmRsZXIgdGhhdCBpcyBpbnZva2VkIGZvciBldmVyeSBpbmNvbWluZyBtZXNzYWdlLgogICAqCiAgICogVGhlIGhhbmRsZXIgaXMgaW52b2tlZCBpbiB0aGUgcm9vdC16b25lIChbWm9uZS5yb290XSkuCiAgICovCiAgdm9pZCBzZXQgaGFuZGxlcihGdW5jdGlvbiBuZXdIYW5kbGVyKTsKCiAgLyoqCiAgICogQ2xvc2VzIHRoZSBwb3J0LgogICAqCiAgICogQWZ0ZXIgYSBjYWxsIHRvIHRoaXMgbWV0aG9kIGFueSBpbmNvbWluZyBtZXNzYWdlIGlzIHNpbGVudGx5IGRyb3BwZWQuCiAgICovCiAgdm9pZCBjbG9zZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgW1NlbmRQb3J0XSB0aGF0IHNlbmRzIHRvIHRoaXMgcmF3IHJlY2VpdmUgcG9ydC4KICAgKi8KICBTZW5kUG9ydCBnZXQgc2VuZFBvcnQ7Cn0KCi8qKgogKiBEZXNjcmlwdGlvbiBvZiBhbiBlcnJvciBmcm9tIGFub3RoZXIgaXNvbGF0ZS4KICoKICogVGhpcyBlcnJvciBoYXMgdGhlIHNhbWUgYHRvU3RyaW5nKClgIGFuZCBgc3RhY2tUcmFjZS50b1N0cmluZygpYCBiZWhhdmlvcgogKiBhcyB0aGUgb3JpZ2luYWwgZXJyb3IsIGJ1dCBoYXMgbm8gb3RoZXIgZmVhdHVyZXMgb2YgdGhlIG9yaWdpbmFsIGVycm9yLgogKi8KY2xhc3MgUmVtb3RlRXJyb3IgaW1wbGVtZW50cyBFcnJvciB7CiAgZmluYWwgU3RyaW5nIF9kZXNjcmlwdGlvbjsKICBmaW5hbCBTdGFja1RyYWNlIHN0YWNrVHJhY2U7CiAgUmVtb3RlRXJyb3IoU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmcgc3RhY2tEZXNjcmlwdGlvbikKICAgICAgOiBfZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiwKICAgICAgICBzdGFja1RyYWNlID0gbmV3IFN0YWNrVHJhY2UuZnJvbVN0cmluZyhzdGFja0Rlc2NyaXB0aW9uKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfZGVzY3JpcHRpb247Cn0KCi8qKgogKiBBbiBlZmZpY2llbnRseSB0cmFuc2ZlcmFibGUgc2VxdWVuY2Ugb2YgYnl0ZSB2YWx1ZXMuCiAqCiAqIEEgW1RyYW5zZmVyYWJsZVR5cGVkRGF0YV0gaXMgY3JlYXRlZCBmcm9tIGEgbnVtYmVyIG9mIGJ5dGVzLgogKiBUaGlzIHdpbGwgdGFrZSB0aW1lIHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzLgogKgogKiBUaGUgW1RyYW5zZmVyYWJsZVR5cGVkRGF0YV0gY2FuIGJlIG1vdmVkIGJldHdlZW4gaXNvbGF0ZXMsIHNvCiAqIHNlbmRpbmcgaXQgdGhyb3VnaCBhIHNlbmQgcG9ydCB3aWxsIG9ubHkgdGFrZSBjb25zdGFudCB0aW1lLgogKgogKiBXaGVuIHNlbnQgdGhpcyB3YXksIHRoZSBsb2NhbCB0cmFuc2ZlcmFibGUgY2FuIG5vIGxvbmdlciBiZSBtYXRlcmlhbGl6ZWQsCiAqIGFuZCB0aGUgcmVjZWl2ZWQgb2JqZWN0IGlzIG5vdyB0aGUgb25seSB3YXkgdG8gbWF0ZXJpYWxpemUgdGhlIGRhdGEuCiAqLwpAU2luY2UoIjIuMy4yIikKYWJzdHJhY3QgY2xhc3MgVHJhbnNmZXJhYmxlVHlwZWREYXRhIHsKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IFtUcmFuc2ZlcmFibGVUeXBlZERhdGFdIGNvbnRhaW5pbmcgdGhlIGJ5dGVzIG9mIFtsaXN0XS4KICAgKgogICAqIEl0IG11c3QgYmUgcG9zc2libGUgdG8gY3JlYXRlIGEgc2luZ2xlIFtVaW50OExpc3RdIGNvbnRhaW5pbmcgdGhlCiAgICogYnl0ZXMsIHNvIGlmIHRoZXJlIGFyZSBtb3JlIGJ5dGVzIHRoYW4gd2hhdCB0aGUgcGxhdGZvcm0gYWxsb3dzIGluCiAgICogYSBzaW5nbGUgW1VpbnQ4TGlzdF0sIHRoZW4gY3JlYXRpb24gZmFpbHMuCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBUcmFuc2ZlcmFibGVUeXBlZERhdGEuZnJvbUxpc3QoTGlzdDxUeXBlZERhdGE+IGxpc3QpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IFtCeXRlQnVmZmVyXSBjb250YWluaW5nIHRoZSBieXRlcyBzdG9yZWQgaW4gdGhpcyBbVHJhbnNmZXJhYmxlVHlwZWREYXRhXS4KICAgKgogICAqIFRoZSBbVHJhbnNmZXJhYmxlVHlwZWREYXRhXSBpcyBhIGNyb3NzLWlzb2xhdGUgc2luZ2xlLXVzZSByZXNvdXJjZS4KICAgKiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgdW5kZXJseWluZwogICAqIHRyYW5zZmVyYWJsZSBieXRlcywgZXZlbiBpZiB0aGUgY2FsbHMgb2NjdXIgaW4gZGlmZmVyZW50IGlzb2xhdGVzLgogICAqLwogIEJ5dGVCdWZmZXIgbWF0ZXJpYWxpemUoKTsKfQqDFwBOTjwBBCwzGyQDJQMeAxIEFgEVJEABGAEELQQzOBgcJzoCAQQnA0xNOQNMGEEDS0oDUSADR0JMGgNNRB9JJQNEQEk6A05NNQQQQiJOKAEGQAUuBTkfBUxJNgYeAQY7BS1PMTAFSUwGJAEGPwVBSjw2BigBBj0FUAVPMQVQTRYGECEBBkoFRR8FSChPTRcFTUsFDg0qQycJSElIBk8BBkIFMiYFR0cQBUlGKQYnAQZPBU8QBkwvAQY2BUlMJQYxAQYvBUdDGgZBAQZMDgVGHUsbBUIwNTU4QEBBJQU8QwUxMkdLTAVRQUVJDgVPKQVQMAVFSEUoBUxDBiwtGxsXGCgBBkwYBU8ZBUkPBRAUHQVMTAUxMktMBVFBRUkOBUVIRSgFPU5KTTEFThYFRUwrNwVPBU9JDgVJTREFRktATysFRBQFTykFS0MGLA8ZExsXGBsUJ0IbGS4UHgEGJAU7Mks8NQVDOEgcBTs9ShcFR0YFPUcFQEEkBUYxPAY0Kx4dBAEtNQEGHwVDJAVFQwVIRjAGNQEGTQVRTxQFUDxIBUcjBUwWSToFTkgdSEEeBkw0Bk0BBjkFS01DRQVOURQFTk8OBUE0Bj0BBj4FSCsFQ0IFTkwdSEUeBjUBBigFMz4FQiZNBUBPQD8cTElGRUwYBU4xOwY3AQZGBUwWSToFQTIFRUkFREVAN0ZFTBgGLDMBBksFNUoxSDxRBUAvSAFNT0sFTk0zBjEBBjsFRUdCRQVNUBYFPjMGNAEGRQU9BUJGNAVLBhYhGSAiMDBHNAYBMRQXMjALFzMYFwweBAIBBCkDSVAwA1AOBDAGRCIFUVE8BVBRTU1NBVBPSAYaAQZAIAYfAQY/JgYUAgEETwNHNEo6A0lLThoDLgQvBjUFS01QHAU9BiIBBjYFTxQGSwEGHgVNIgVBLwY2PgEGFAVONwVIBhABBjsGGQIBIAY1BUhGGAY3AQZCBTwGKQEGFgVLBhABBj8GGQIBBDEDTUsEJR0fOyRCJQIBBDgDQDwDQUADTUgEECcGSwVHSDAGSQEGXQVJSkgGHAIBDGRhcnQ6aXNvbGF0ZTJvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2lzb2xhdGVfcGF0Y2guZGFydMAAULEvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIE5vdGU6IHRoZSBWTSBjb25jYXRlbmF0ZXMgYWxsIHBhdGNoIGZpbGVzIGludG8gYSBzaW5nbGUgcGF0Y2ggZmlsZS4gVGhpcwovLy8gZmlsZSBpcyB0aGUgZmlyc3QgcGF0Y2ggaW4gImRhcnQ6aXNvbGF0ZSIgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbXBvcnRzCi8vLyB1c2VkIGJ5IHBhdGNoZXMgb2YgdGhhdCBsaWJyYXJ5LiBXZSBwbGFuIHRvIGNoYW5nZSB0aGlzIHdoZW4gd2UgaGF2ZSBhCi8vLyBzaGFyZWQgZnJvbnQgZW5kIGFuZCBzaW1wbHkgdXNlIHBhcnRzLgoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgc2hvdyBDbGFzc0lELCBWTUxpYnJhcnlIb29rcywgcGF0Y2g7CgppbXBvcnQgImRhcnQ6YXN5bmMiCiAgICBzaG93IENvbXBsZXRlciwgRnV0dXJlLCBTdHJlYW0sIFN0cmVhbUNvbnRyb2xsZXIsIFN0cmVhbVN1YnNjcmlwdGlvbiwgVGltZXI7CgppbXBvcnQgImRhcnQ6Y29sbGVjdGlvbiIgc2hvdyBIYXNoTWFwOwppbXBvcnQgImRhcnQ6dHlwZWRfZGF0YSIgc2hvdyBCeXRlQnVmZmVyLCBUeXBlZERhdGEsIFVpbnQ4TGlzdDsKCi8vLyBUaGVzZSBhcmUgdGhlIGFkZGl0aW9uYWwgcGFydHMgb2YgdGhpcyBwYXRjaCBsaWJyYXJ5OgovLyBwYXJ0ICJ0aW1lcl9pbXBsLmRhcnQiOwoKQHBhdGNoCmNsYXNzIFJlY2VpdmVQb3J0IHsKICBAcGF0Y2gKICBmYWN0b3J5IFJlY2VpdmVQb3J0KCkgPT4gbmV3IF9SZWNlaXZlUG9ydEltcGwoKTsKCiAgQHBhdGNoCiAgZmFjdG9yeSBSZWNlaXZlUG9ydC5mcm9tUmF3UmVjZWl2ZVBvcnQoUmF3UmVjZWl2ZVBvcnQgcmF3UG9ydCkgewogICAgcmV0dXJuIG5ldyBfUmVjZWl2ZVBvcnRJbXBsLmZyb21SYXdSZWNlaXZlUG9ydChyYXdQb3J0KTsKICB9Cn0KCkBwYXRjaApjbGFzcyBDYXBhYmlsaXR5IHsKICBAcGF0Y2gKICBmYWN0b3J5IENhcGFiaWxpdHkoKSA9PiBuZXcgX0NhcGFiaWxpdHlJbXBsKCk7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0NhcGFiaWxpdHlJbXBsIGltcGxlbWVudHMgQ2FwYWJpbGl0eSB7CiAgZmFjdG9yeSBfQ2FwYWJpbGl0eUltcGwoKSBuYXRpdmUgIkNhcGFiaWxpdHlJbXBsX2ZhY3RvcnkiOwoKICBib29sIG9wZXJhdG9yID09KHZhciBvdGhlcikgewogICAgcmV0dXJuIChvdGhlciBpcyBfQ2FwYWJpbGl0eUltcGwpICYmIF9lcXVhbHMob3RoZXIpOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gX2dldF9oYXNoY29kZSgpOwogIH0KCiAgX2VxdWFscyhvdGhlcikgbmF0aXZlICJDYXBhYmlsaXR5SW1wbF9lcXVhbHMiOwogIF9nZXRfaGFzaGNvZGUoKSBuYXRpdmUgIkNhcGFiaWxpdHlJbXBsX2dldF9oYXNoY29kZSI7Cn0KCkBwYXRjaApjbGFzcyBSYXdSZWNlaXZlUG9ydCB7CiAgLyoqCiAgICogT3BlbnMgYSBsb25nLWxpdmVkIHBvcnQgZm9yIHJlY2VpdmluZyBtZXNzYWdlcy4KICAgKgogICAqIEEgW1Jhd1JlY2VpdmVQb3J0XSBpcyBsb3cgbGV2ZWwgYW5kIGRvZXMgbm90IHdvcmsgd2l0aCBbWm9uZV1zLiBJdAogICAqIGNhbiBub3QgYmUgcGF1c2VkLiBUaGUgZGF0YS1oYW5kbGVyIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgZmlyc3QKICAgKiBldmVudCBpcyByZWNlaXZlZC4KICAgKi8KICBAcGF0Y2gKICBmYWN0b3J5IFJhd1JlY2VpdmVQb3J0KFtGdW5jdGlvbiBoYW5kbGVyXSkgewogICAgX1Jhd1JlY2VpdmVQb3J0SW1wbCByZXN1bHQgPSBuZXcgX1Jhd1JlY2VpdmVQb3J0SW1wbCgpOwogICAgcmVzdWx0LmhhbmRsZXIgPSBoYW5kbGVyOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCmNsYXNzIF9SZWNlaXZlUG9ydEltcGwgZXh0ZW5kcyBTdHJlYW0gaW1wbGVtZW50cyBSZWNlaXZlUG9ydCB7CiAgX1JlY2VpdmVQb3J0SW1wbCgpIDogdGhpcy5mcm9tUmF3UmVjZWl2ZVBvcnQobmV3IFJhd1JlY2VpdmVQb3J0KCkpOwoKICBfUmVjZWl2ZVBvcnRJbXBsLmZyb21SYXdSZWNlaXZlUG9ydCh0aGlzLl9yYXdQb3J0KSB7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyKG9uQ2FuY2VsOiBjbG9zZSwgc3luYzogdHJ1ZSk7CiAgICBfcmF3UG9ydC5oYW5kbGVyID0gX2NvbnRyb2xsZXIuYWRkOwogIH0KCiAgU2VuZFBvcnQgZ2V0IHNlbmRQb3J0IHsKICAgIHJldHVybiBfcmF3UG9ydC5zZW5kUG9ydDsKICB9CgogIFN0cmVhbVN1YnNjcmlwdGlvbiBsaXN0ZW4odm9pZCBvbkRhdGEodmFyIG1lc3NhZ2UpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgcmV0dXJuIF9jb250cm9sbGVyLnN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIGNsb3NlKCkgewogICAgX3Jhd1BvcnQuY2xvc2UoKTsKICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgfQoKICBmaW5hbCBSYXdSZWNlaXZlUG9ydCBfcmF3UG9ydDsKICBTdHJlYW1Db250cm9sbGVyIF9jb250cm9sbGVyOwp9Cgp0eXBlZGVmIHZvaWQgX0ltbWVkaWF0ZUNhbGxiYWNrKCk7CgovLy8gVGhlIGNhbGxiYWNrIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB0aHJvdWdoIGBzY2hlZHVsZUltbWVkaWF0ZWAuCl9JbW1lZGlhdGVDYWxsYmFjayBfcGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrOwoKLy8vIFRoZSBjbG9zdXJlIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgc2NoZWR1bGVJbW1lZGlhdGVDbG9zdXJlLCB3aGVuIHRoZSBWTQovLy8gaXMgcmVzcG9uc2libGUgZm9yIHRoZSBldmVudCBsb29wLgp2b2lkIF9pc29sYXRlU2NoZWR1bGVJbW1lZGlhdGUodm9pZCBjYWxsYmFjaygpKSB7CiAgYXNzZXJ0KChfcGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrID09IG51bGwpIHx8CiAgICAgIChfcGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrID09IGNhbGxiYWNrKSk7CiAgX3BlbmRpbmdJbW1lZGlhdGVDYWxsYmFjayA9IGNhbGxiYWNrOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKdm9pZCBfcnVuUGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrKCkgewogIGlmIChfcGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrICE9IG51bGwpIHsKICAgIHZhciBjYWxsYmFjayA9IF9wZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2s7CiAgICBfcGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrID0gbnVsbDsKICAgIGNhbGxiYWNrKCk7CiAgfQp9CgpfSW1tZWRpYXRlQ2FsbGJhY2sgX3JlbW92ZVBlbmRpbmdJbW1lZGlhdGVDYWxsYmFjaygpIHsKICB2YXIgY2FsbGJhY2sgPSBfcGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrOwogIF9wZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2sgPSBudWxsOwogIHJldHVybiBjYWxsYmFjazsKfQoKLy8vIFRoZSBlbWJlZGRlciBjYW4gZXhlY3V0ZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCBob2xkIG9mCi8vLyBbX2lzb2xhdGVTY2hlZHVsZUltbWVkaWF0ZV0gYWJvdmUuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpGdW5jdGlvbiBfZ2V0SXNvbGF0ZVNjaGVkdWxlSW1tZWRpYXRlQ2xvc3VyZSgpIHsKICByZXR1cm4gX2lzb2xhdGVTY2hlZHVsZUltbWVkaWF0ZTsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfUmF3UmVjZWl2ZVBvcnRJbXBsIGltcGxlbWVudHMgUmF3UmVjZWl2ZVBvcnQgewogIGZhY3RvcnkgX1Jhd1JlY2VpdmVQb3J0SW1wbCgpIG5hdGl2ZSAiUmF3UmVjZWl2ZVBvcnRJbXBsX2ZhY3RvcnkiOwoKICBjbG9zZSgpIHsKICAgIC8vIENsb3NlIHRoZSBwb3J0IGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgaGFuZGxlciBtYXAuCiAgICBfaGFuZGxlck1hcC5yZW1vdmUodGhpcy5fY2xvc2VJbnRlcm5hbCgpKTsKICB9CgogIFNlbmRQb3J0IGdldCBzZW5kUG9ydCB7CiAgICByZXR1cm4gX2dldF9zZW5kcG9ydCgpOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PSh2YXIgb3RoZXIpIHsKICAgIHJldHVybiAob3RoZXIgaXMgX1Jhd1JlY2VpdmVQb3J0SW1wbCkgJiYKICAgICAgICAodGhpcy5fZ2V0X2lkKCkgPT0gb3RoZXIuX2dldF9pZCgpKTsKICB9CgogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIHNlbmRQb3J0Lmhhc2hDb2RlOwogIH0KCiAgLyoqKiogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscyAqKioqLwogIF9nZXRfaWQoKSBuYXRpdmUgIlJhd1JlY2VpdmVQb3J0SW1wbF9nZXRfaWQiOwogIF9nZXRfc2VuZHBvcnQoKSBuYXRpdmUgIlJhd1JlY2VpdmVQb3J0SW1wbF9nZXRfc2VuZHBvcnQiOwoKICAvLyBDYWxsZWQgZnJvbSB0aGUgVk0gdG8gcmV0cmlldmUgdGhlIGhhbmRsZXIgZm9yIGEgbWVzc2FnZS4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBzdGF0aWMgX2xvb2t1cEhhbmRsZXIoaW50IGlkKSB7CiAgICB2YXIgcmVzdWx0ID0gX2hhbmRsZXJNYXBbaWRdOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIENhbGxlZCBmcm9tIHRoZSBWTSB0byBkaXNwYXRjaCB0byB0aGUgaGFuZGxlci4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBzdGF0aWMgdm9pZCBfaGFuZGxlTWVzc2FnZShGdW5jdGlvbiBoYW5kbGVyLCB2YXIgbWVzc2FnZSkgewogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgYW55IGV4Y2VwdGlvbiBhYm9ydHMgdGhlCiAgICAvLyBWTS4gT25jZSB3ZSBoYXZlIG5vbi1mYXRhbCBnbG9iYWwgZXhjZXB0aW9ucyB3ZSBuZWVkIHRvIGNhdGNoIGVycm9ycwogICAgLy8gc28gdGhhdCB3ZSBjYW4gcnVuIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzLgogICAgaGFuZGxlcihtZXNzYWdlKTsKICAgIF9ydW5QZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2soKTsKICB9CgogIC8vIENhbGwgaW50byB0aGUgVk0gdG8gY2xvc2UgdGhlIFZNIG1haW50YWluZWQgbWFwcGluZ3MuCiAgX2Nsb3NlSW50ZXJuYWwoKSBuYXRpdmUgIlJhd1JlY2VpdmVQb3J0SW1wbF9jbG9zZUludGVybmFsIjsKCiAgdm9pZCBzZXQgaGFuZGxlcihGdW5jdGlvbiB2YWx1ZSkgewogICAgX2hhbmRsZXJNYXBbdGhpcy5fZ2V0X2lkKCldID0gdmFsdWU7CiAgfQoKICAvLyBUT0RPKGlwb3N2YSk6IElkZWFsbHkga2VlcCB0aGlzIG1hcCBpbiB0aGUgVk0uCiAgLy8gaWQgdG8gaGFuZGxlciBtYXBwaW5nLgogIHN0YXRpYyBfaW5pdEhhbmRsZXJNYXAoKSB7CiAgICAvLyBUT0RPKDE4NTExKTogV29ya2Fyb3VuZCBiYWQgQ2hlY2tTbWkgaG9pc3RpbmcuCiAgICB2YXIgdGVtcE1hcCA9IG5ldyBIYXNoTWFwKCk7CiAgICAvLyBDb2xsZWN0IGZlZWRiYWNrIHRoYXQgbm90IGFsbCBrZXlzIGFyZSBTbWlzLgogICAgdGVtcE1hcFsiLiJdID0gMTsKICAgIHRlbXBNYXBbIi4iXSA9IDI7CgogICAgcmV0dXJuIG5ldyBIYXNoTWFwKCk7CiAgfQoKICBzdGF0aWMgZmluYWwgTWFwIF9oYW5kbGVyTWFwID0gX2luaXRIYW5kbGVyTWFwKCk7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1NlbmRQb3J0SW1wbCBpbXBsZW1lbnRzIFNlbmRQb3J0IHsKICBmYWN0b3J5IF9TZW5kUG9ydEltcGwuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgIlVucmVhY2hhYmxlIjsKICB9CgogIC8qLS0tIHB1YmxpYyBpbnRlcmZhY2UgLS0tKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICB2b2lkIHNlbmQodmFyIG1lc3NhZ2UpIHsKICAgIF9zZW5kSW50ZXJuYWwobWVzc2FnZSk7CiAgfQoKICBib29sIG9wZXJhdG9yID09KHZhciBvdGhlcikgewogICAgcmV0dXJuIChvdGhlciBpcyBfU2VuZFBvcnRJbXBsKSAmJiAodGhpcy5fZ2V0X2lkKCkgPT0gb3RoZXIuX2dldF9pZCgpKTsKICB9CgogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIF9nZXRfaGFzaGNvZGUoKTsKICB9CgogIC8qLS0tIHByaXZhdGUgaW1wbGVtZW50YXRpb24gLS0tKi8KICBfZ2V0X2lkKCkgbmF0aXZlICJTZW5kUG9ydEltcGxfZ2V0X2lkIjsKICBfZ2V0X2hhc2hjb2RlKCkgbmF0aXZlICJTZW5kUG9ydEltcGxfZ2V0X2hhc2hjb2RlIjsKCiAgLy8gRm9yd2FyZCB0aGUgaW1wbGVtZW50YXRpb24gb2Ygc2VuZGluZyBtZXNzYWdlcyB0byB0aGUgVk0uCiAgdm9pZCBfc2VuZEludGVybmFsKHZhciBtZXNzYWdlKSBuYXRpdmUgIlNlbmRQb3J0SW1wbF9zZW5kSW50ZXJuYWxfIjsKfQoKdHlwZWRlZiBfTnVsbGFyeUZ1bmN0aW9uKCk7CnR5cGVkZWYgX1VuYXJ5RnVuY3Rpb24oTnVsbCBhcmdzKTsKdHlwZWRlZiBfQmluYXJ5RnVuY3Rpb24oTnVsbCBhcmdzLCBOdWxsIG1lc3NhZ2UpOwoKLyoqCiAqIFRha2VzIHRoZSByZWFsIGVudHJ5IHBvaW50IGFzIGFyZ3VtZW50IGFuZCBpbnZva2VzIGl0IHdpdGggdGhlCiAqIGluaXRpYWwgbWVzc2FnZS4gIERlZmVycyBleGVjdXRpb24gb2YgdGhlIGVudHJ5IHBvaW50IHVudGlsIHRoZQogKiBpc29sYXRlIGlzIGluIHRoZSBtZXNzYWdlIGxvb3AuCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKdm9pZCBfc3RhcnRNYWluSXNvbGF0ZShGdW5jdGlvbiBlbnRyeVBvaW50LCBMaXN0PFN0cmluZz4gYXJncykgewogIF9zdGFydElzb2xhdGUoCiAgICAgIG51bGwsIC8vIG5vIHBhcmVudCBwb3J0CiAgICAgIGVudHJ5UG9pbnQsCiAgICAgIGFyZ3MsCiAgICAgIG51bGwsIC8vIG5vIG1lc3NhZ2UKICAgICAgdHJ1ZSwgLy8gaXNTcGF3blVyaQogICAgICBudWxsLCAvLyBubyBjb250cm9sIHBvcnQKICAgICAgbnVsbCk7IC8vIG5vIGNhcGFiaWxpdGllcwp9CgovKioKICogUmV0dXJucyB0aGUgX3N0YXJ0TWFpbklzb2xhdGUgZnVuY3Rpb24uIFRoaXMgY2xvc3VyaXphdGlvbiBhbGxvd3MgZW1iZWRkZXJzCiAqIHRvIHNldHVwIHRyYW1wb2xpbmVzIHRvIHRoZSBtYWluIGZ1bmN0aW9uLiBUaGlzIHdvcmthcm91bmQgY2FuIGJlIHJlbW92ZWQKICogb25jZSBzdXBwb3J0IGZvciBAcHJhZ21hKCJ2bTplbnRyeV9wb2ludCIsICJnZXQiKSBhcyBkb2N1bWVudGVkIGluCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zNTcyMCBsYW5kcy4KICovCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpGdW5jdGlvbiBfZ2V0U3RhcnRNYWluSXNvbGF0ZUZ1bmN0aW9uKCkgewogIHJldHVybiBfc3RhcnRNYWluSXNvbGF0ZTsKfQoKLyoqCiAqIFRha2VzIHRoZSByZWFsIGVudHJ5IHBvaW50IGFzIGFyZ3VtZW50IGFuZCBpbnZva2VzIGl0IHdpdGggdGhlIGluaXRpYWwKICogbWVzc2FnZS4KICovCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQp2b2lkIF9zdGFydElzb2xhdGUoCiAgICBTZW5kUG9ydCBwYXJlbnRQb3J0LAogICAgRnVuY3Rpb24gZW50cnlQb2ludCwKICAgIExpc3Q8U3RyaW5nPiBhcmdzLAogICAgdmFyIG1lc3NhZ2UsCiAgICBib29sIGlzU3Bhd25VcmksCiAgICBSYXdSZWNlaXZlUG9ydCBjb250cm9sUG9ydCwKICAgIExpc3QgY2FwYWJpbGl0aWVzKSB7CiAgLy8gVGhlIGNvbnRyb2wgcG9ydCAoYWthIHRoZSBtYWluIGlzb2xhdGUgcG9ydCkgZG9lcyBub3QgaGFuZGxlIGFueSBtZXNzYWdlcy4KICBpZiAoY29udHJvbFBvcnQgIT0gbnVsbCkgewogICAgY29udHJvbFBvcnQuaGFuZGxlciA9IChfKSB7fTsgLy8gTm9ib2R5IGhvbWUgb24gdGhlIGNvbnRyb2wgcG9ydC4KICB9CgogIGlmIChwYXJlbnRQb3J0ICE9IG51bGwpIHsKICAgIC8vIEJ1aWxkIGEgbWVzc2FnZSB0byBvdXIgcGFyZW50IGlzb2xhdGUgcHJvdmlkaW5nIGFjY2VzcyB0byB0aGUKICAgIC8vIGN1cnJlbnQgaXNvbGF0ZSdzIGNvbnRyb2wgcG9ydCBhbmQgY2FwYWJpbGl0aWVzLgogICAgLy8KICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBTZW5kIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3QgZmluZCB0aGUgZW50cnkgcG9pbnQuCiAgICB2YXIgcmVhZHlNZXNzYWdlID0gbmV3IExpc3QoMik7CiAgICByZWFkeU1lc3NhZ2VbMF0gPSBjb250cm9sUG9ydC5zZW5kUG9ydDsKICAgIHJlYWR5TWVzc2FnZVsxXSA9IGNhcGFiaWxpdGllczsKCiAgICAvLyBPdXQgb2YgYW4gZXhjZXNzIG9mIHBhcmFub2lhIHdlIGNsZWFyIHRoZSBjYXBhYmlsaXRpZXMgZnJvbSB0aGUKICAgIC8vIHN0YWNrLiAgTm90IHJlYWxseSBuZWNlc3NhcnkuCiAgICBjYXBhYmlsaXRpZXMgPSBudWxsOwogICAgcGFyZW50UG9ydC5zZW5kKHJlYWR5TWVzc2FnZSk7CiAgfQogIGFzc2VydChjYXBhYmlsaXRpZXMgPT0gbnVsbCk7CgogIC8vIERlbGF5IGFsbCB1c2VyIGNvZGUgaGFuZGxpbmcgdG8gdGhlIG5leHQgcnVuIG9mIHRoZSBtZXNzYWdlIGxvb3AuIFRoaXMKICAvLyBhbGxvd3MgdXMgdG8gaW50ZXJjZXB0IGNlcnRhaW4gY29uZGl0aW9ucyBpbiB0aGUgZXZlbnQgZGlzcGF0Y2gsIHN1Y2ggYXMKICAvLyBzdGFydGluZyBpbiBwYXVzZWQgc3RhdGUuCiAgUmF3UmVjZWl2ZVBvcnQgcG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOwogIHBvcnQuaGFuZGxlciA9IChfKSB7CiAgICBwb3J0LmNsb3NlKCk7CgogICAgaWYgKGlzU3Bhd25VcmkpIHsKICAgICAgaWYgKGVudHJ5UG9pbnQgaXMgX0JpbmFyeUZ1bmN0aW9uKSB7CiAgICAgICAgKGVudHJ5UG9pbnQgYXMgZHluYW1pYykoYXJncywgbWVzc2FnZSk7CiAgICAgIH0gZWxzZSBpZiAoZW50cnlQb2ludCBpcyBfVW5hcnlGdW5jdGlvbikgewogICAgICAgIChlbnRyeVBvaW50IGFzIGR5bmFtaWMpKGFyZ3MpOwogICAgICB9IGVsc2UgewogICAgICAgIGVudHJ5UG9pbnQoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZW50cnlQb2ludChtZXNzYWdlKTsKICAgIH0KICB9OwogIC8vIE1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBoYW5kbGVyIGlzIHRyaWdnZXJlZC4KICBwb3J0LnNlbmRQb3J0LnNlbmQobnVsbCk7Cn0KCkBwYXRjaApjbGFzcyBJc29sYXRlIHsKICBzdGF0aWMgZmluYWwgX2N1cnJlbnRJc29sYXRlID0gX2dldEN1cnJlbnRJc29sYXRlKCk7CiAgc3RhdGljIGZpbmFsIF9yb290VXJpID0gX2dldEN1cnJlbnRSb290VXJpKCk7CgogIEBwYXRjaAogIHN0YXRpYyBJc29sYXRlIGdldCBjdXJyZW50ID0+IF9jdXJyZW50SXNvbGF0ZTsKCiAgQHBhdGNoCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gX2dldERlYnVnTmFtZShjb250cm9sUG9ydCk7CgogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8VXJpPiBnZXQgcGFja2FnZVJvb3QgewogICAgdmFyIGhvb2sgPSBWTUxpYnJhcnlIb29rcy5wYWNrYWdlUm9vdFVyaUZ1dHVyZTsKICAgIGlmIChob29rID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIklzb2xhdGUucGFja2FnZVJvb3QiKTsKICAgIH0KICAgIHJldHVybiBob29rKCk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPFVyaT4gZ2V0IHBhY2thZ2VDb25maWcgewogICAgdmFyIGhvb2sgPSBWTUxpYnJhcnlIb29rcy5wYWNrYWdlQ29uZmlnVXJpRnV0dXJlOwogICAgaWYgKGhvb2sgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiSXNvbGF0ZS5wYWNrYWdlQ29uZmlnIik7CiAgICB9CiAgICByZXR1cm4gaG9vaygpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxVcmk+IHJlc29sdmVQYWNrYWdlVXJpKFVyaSBwYWNrYWdlVXJpKSB7CiAgICB2YXIgaG9vayA9IFZNTGlicmFyeUhvb2tzLnJlc29sdmVQYWNrYWdlVXJpRnV0dXJlOwogICAgaWYgKGhvb2sgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiSXNvbGF0ZS5yZXNvbHZlUGFja2FnZVVyaSIpOwogICAgfQogICAgcmV0dXJuIGhvb2socGFja2FnZVVyaSk7CiAgfQoKICBzdGF0aWMgYm9vbCBfcGFja2FnZVN1cHBvcnRlZCgpID0+CiAgICAgIChWTUxpYnJhcnlIb29rcy5wYWNrYWdlUm9vdFVyaUZ1dHVyZSAhPSBudWxsKSAmJgogICAgICAoVk1MaWJyYXJ5SG9va3MucGFja2FnZUNvbmZpZ1VyaUZ1dHVyZSAhPSBudWxsKSAmJgogICAgICAoVk1MaWJyYXJ5SG9va3MucmVzb2x2ZVBhY2thZ2VVcmlGdXR1cmUgIT0gbnVsbCk7CgogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8SXNvbGF0ZT4gc3Bhd248VD4odm9pZCBlbnRyeVBvaW50KFQgbWVzc2FnZSksIFQgbWVzc2FnZSwKICAgICAge2Jvb2wgcGF1c2VkOiBmYWxzZSwKICAgICAgYm9vbCBlcnJvcnNBcmVGYXRhbCwKICAgICAgU2VuZFBvcnQgb25FeGl0LAogICAgICBTZW5kUG9ydCBvbkVycm9yLAogICAgICBTdHJpbmcgZGVidWdOYW1lfSkgYXN5bmMgewogICAgLy8gYHBhdXNlZGAgaXNuJ3QgaGFuZGxlZCB5ZXQuCiAgICBSYXdSZWNlaXZlUG9ydCByZWFkeVBvcnQ7CiAgICB0cnkgewogICAgICAvLyBDaGVjayBmb3IgdGhlIHR5cGUgb2YgYGVudHJ5UG9pbnRgIG9uIHRoZSBzcGF3bmluZyBpc29sYXRlIHRvIG1ha2UKICAgICAgLy8gZXJyb3ItaGFuZGxpbmcgZWFzaWVyLgogICAgICBpZiAoZW50cnlQb2ludCBpcyEgX1VuYXJ5RnVuY3Rpb24pIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihlbnRyeVBvaW50KTsKICAgICAgfQogICAgICAvLyBUaGUgVk0gd2lsbCBpbnZva2UgW19zdGFydElzb2xhdGVdIHdpdGggZW50cnlQb2ludCBhcyBhcmd1bWVudC4KICAgICAgcmVhZHlQb3J0ID0gbmV3IFJhd1JlY2VpdmVQb3J0KCk7CgogICAgICAvLyBXZSBkbyBub3QgaW5oZXJpdCB0aGUgcGFja2FnZSBjb25maWcgc2V0dGluZ3MgZnJvbSB0aGUgcGFyZW50IGlzb2xhdGUsCiAgICAgIC8vIGluc3RlYWQgd2UgdXNlIHRoZSB2YWx1ZXMgdGhhdCB3ZXJlIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lLgogICAgICB2YXIgcGFja2FnZUNvbmZpZyA9IFZNTGlicmFyeUhvb2tzLnBhY2thZ2VDb25maWdTdHJpbmc7CiAgICAgIHZhciBzY3JpcHQgPSBWTUxpYnJhcnlIb29rcy5wbGF0Zm9ybVNjcmlwdDsKICAgICAgaWYgKHNjcmlwdCA9PSBudWxsKSB7CiAgICAgICAgLy8gV2UgZG8gbm90IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHN1cHBvcnQgc3Bhd25pbmcgdGhlIG5ldwogICAgICAgIC8vIGlzb2xhdGUuCiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIklzb2xhdGUuc3Bhd24iKTsKICAgICAgfQogICAgICBpZiAoc2NyaXB0LnNjaGVtZSA9PSAicGFja2FnZSIpIHsKICAgICAgICBzY3JpcHQgPSBhd2FpdCBJc29sYXRlLnJlc29sdmVQYWNrYWdlVXJpKHNjcmlwdCk7CiAgICAgIH0KCiAgICAgIF9zcGF3bkZ1bmN0aW9uKAogICAgICAgICAgcmVhZHlQb3J0LnNlbmRQb3J0LAogICAgICAgICAgc2NyaXB0LnRvU3RyaW5nKCksCiAgICAgICAgICBlbnRyeVBvaW50LAogICAgICAgICAgbWVzc2FnZSwKICAgICAgICAgIHBhdXNlZCwKICAgICAgICAgIGVycm9yc0FyZUZhdGFsLAogICAgICAgICAgb25FeGl0LAogICAgICAgICAgb25FcnJvciwKICAgICAgICAgIG51bGwsCiAgICAgICAgICBwYWNrYWdlQ29uZmlnLAogICAgICAgICAgZGVidWdOYW1lKTsKICAgICAgcmV0dXJuIGF3YWl0IF9zcGF3bkNvbW1vbihyZWFkeVBvcnQpOwogICAgfSBjYXRjaCAoZSwgc3QpIHsKICAgICAgaWYgKHJlYWR5UG9ydCAhPSBudWxsKSB7CiAgICAgICAgcmVhZHlQb3J0LmNsb3NlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGF3YWl0IG5ldyBGdXR1cmU8SXNvbGF0ZT4uZXJyb3IoZSwgc3QpOwogICAgfQogIH0KCiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxJc29sYXRlPiBzcGF3blVyaShVcmkgdXJpLCBMaXN0PFN0cmluZz4gYXJncywgdmFyIG1lc3NhZ2UsCiAgICAgIHtib29sIHBhdXNlZDogZmFsc2UsCiAgICAgIFNlbmRQb3J0IG9uRXhpdCwKICAgICAgU2VuZFBvcnQgb25FcnJvciwKICAgICAgYm9vbCBlcnJvcnNBcmVGYXRhbCwKICAgICAgYm9vbCBjaGVja2VkLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50LAogICAgICBVcmkgcGFja2FnZVJvb3QsCiAgICAgIFVyaSBwYWNrYWdlQ29uZmlnLAogICAgICBib29sIGF1dG9tYXRpY1BhY2thZ2VSZXNvbHV0aW9uOiBmYWxzZSwKICAgICAgU3RyaW5nIGRlYnVnTmFtZX0pIGFzeW5jIHsKICAgIFJhd1JlY2VpdmVQb3J0IHJlYWR5UG9ydDsKICAgIGlmIChlbnZpcm9ubWVudCAhPSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoImVudmlyb25tZW50Iik7CiAgICB9CgogICAgLy8gVmVyaWZ5IHRoYXQgbm8gbXV0dWFsbHkgZXhjbHVzaXZlIGFyZ3VtZW50cyBoYXZlIGJlZW4gcGFzc2VkLgogICAgaWYgKGF1dG9tYXRpY1BhY2thZ2VSZXNvbHV0aW9uKSB7CiAgICAgIGlmIChwYWNrYWdlUm9vdCAhPSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkNhbm5vdCBzaW11bHRhbmVvdXNseSByZXF1ZXN0ICIKICAgICAgICAgICAgImF1dG9tYXRpY1BhY2thZ2VSZXNvbHV0aW9uIGFuZCBzcGVjaWZ5IGEiCiAgICAgICAgICAgICJwYWNrYWdlUm9vdC4iKTsKICAgICAgfQogICAgICBpZiAocGFja2FnZUNvbmZpZyAhPSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkNhbm5vdCBzaW11bHRhbmVvdXNseSByZXF1ZXN0ICIKICAgICAgICAgICAgImF1dG9tYXRpY1BhY2thZ2VSZXNvbHV0aW9uIGFuZCBzcGVjaWZ5IGEiCiAgICAgICAgICAgICJwYWNrYWdlQ29uZmlnLiIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoKHBhY2thZ2VSb290ICE9IG51bGwpICYmIChwYWNrYWdlQ29uZmlnICE9IG51bGwpKSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkNhbm5vdCBzaW11bHRhbmVvdXNseSBzcGVjaWZ5IGEgIgogICAgICAgICAgICAicGFja2FnZVJvb3QgYW5kIGEgcGFja2FnZUNvbmZpZy4iKTsKICAgICAgfQogICAgfQogICAgdHJ5IHsKICAgICAgLy8gUmVzb2x2ZSB0aGUgdXJpIGFnYWluc3QgdGhlIGN1cnJlbnQgaXNvbGF0ZSdzIHJvb3QgVXJpIGZpcnN0LgogICAgICB2YXIgc3Bhd25lZFVyaSA9IF9yb290VXJpLnJlc29sdmVVcmkodXJpKTsKCiAgICAgIC8vIEluaGVyaXQgdGhpcyBpc29sYXRlJ3MgcGFja2FnZSByZXNvbHV0aW9uIHNldHVwIGlmIG5vdCBvdmVycmlkZGVuLgogICAgICBpZiAoIWF1dG9tYXRpY1BhY2thZ2VSZXNvbHV0aW9uICYmCiAgICAgICAgICAocGFja2FnZVJvb3QgPT0gbnVsbCkgJiYKICAgICAgICAgIChwYWNrYWdlQ29uZmlnID09IG51bGwpKSB7CiAgICAgICAgaWYgKElzb2xhdGUuX3BhY2thZ2VTdXBwb3J0ZWQoKSkgewogICAgICAgICAgcGFja2FnZVJvb3QgPSBhd2FpdCBJc29sYXRlLnBhY2thZ2VSb290OwogICAgICAgICAgcGFja2FnZUNvbmZpZyA9IGF3YWl0IElzb2xhdGUucGFja2FnZUNvbmZpZzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEVuc3VyZSB0byByZXNvbHZlIHBhY2thZ2U6IFVSSXMgYmVpbmcgaGFuZGVkIGluIGFzIHBhcmFtZXRlcnMuCiAgICAgIGlmIChwYWNrYWdlUm9vdCAhPSBudWxsKSB7CiAgICAgICAgLy8gYHBhY2thZ2VzL2AgZGlyZWN0b3J5IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIEZvcmNlIGl0IG51bGwuCiAgICAgICAgLy8gVE9ETyhtZmFpcmh1cnN0KSBTaG91bGQgdGhpcyB0aHJvdyBhbiBleGNlcHRpb24/CiAgICAgICAgcGFja2FnZVJvb3QgPSBudWxsOwogICAgICB9IGVsc2UgaWYgKHBhY2thZ2VDb25maWcgIT0gbnVsbCkgewogICAgICAgIC8vIEF2b2lkIGNhbGxpbmcgcmVzb2x2ZVBhY2thZ2VVcmkgaWYgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSBpbiBjYXNlCiAgICAgICAgLy8gdGhlIEFQSSBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAgIGlmIChwYWNrYWdlQ29uZmlnLnNjaGVtZSA9PSAicGFja2FnZSIpIHsKICAgICAgICAgIHBhY2thZ2VDb25maWcgPSBhd2FpdCBJc29sYXRlLnJlc29sdmVQYWNrYWdlVXJpKHBhY2thZ2VDb25maWcpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gVGhlIFZNIHdpbGwgaW52b2tlIFtfc3RhcnRJc29sYXRlXSBhbmQgbm90IGBtYWluYC4KICAgICAgcmVhZHlQb3J0ID0gbmV3IFJhd1JlY2VpdmVQb3J0KCk7CiAgICAgIHZhciBwYWNrYWdlUm9vdFN0cmluZyA9IHBhY2thZ2VSb290Py50b1N0cmluZygpOwogICAgICB2YXIgcGFja2FnZUNvbmZpZ1N0cmluZyA9IHBhY2thZ2VDb25maWc/LnRvU3RyaW5nKCk7CgogICAgICBfc3Bhd25VcmkoCiAgICAgICAgICByZWFkeVBvcnQuc2VuZFBvcnQsCiAgICAgICAgICBzcGF3bmVkVXJpLnRvU3RyaW5nKCksCiAgICAgICAgICBhcmdzLAogICAgICAgICAgbWVzc2FnZSwKICAgICAgICAgIHBhdXNlZCwKICAgICAgICAgIG9uRXhpdCwKICAgICAgICAgIG9uRXJyb3IsCiAgICAgICAgICBlcnJvcnNBcmVGYXRhbCwKICAgICAgICAgIGNoZWNrZWQsCiAgICAgICAgICBudWxsLAogICAgICAgICAgLyogZW52aXJvbm1lbnQgKi8KICAgICAgICAgIHBhY2thZ2VSb290U3RyaW5nLAogICAgICAgICAgcGFja2FnZUNvbmZpZ1N0cmluZywKICAgICAgICAgIGRlYnVnTmFtZSk7CiAgICAgIHJldHVybiBhd2FpdCBfc3Bhd25Db21tb24ocmVhZHlQb3J0KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaWYgKHJlYWR5UG9ydCAhPSBudWxsKSB7CiAgICAgICAgcmVhZHlQb3J0LmNsb3NlKCk7CiAgICAgIH0KICAgICAgcmV0aHJvdzsKICAgIH0KICB9CgogIHN0YXRpYyBGdXR1cmU8SXNvbGF0ZT4gX3NwYXduQ29tbW9uKFJhd1JlY2VpdmVQb3J0IHJlYWR5UG9ydCkgewogICAgQ29tcGxldGVyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8SXNvbGF0ZT4uc3luYygpOwogICAgcmVhZHlQb3J0LmhhbmRsZXIgPSAocmVhZHlNZXNzYWdlKSB7CiAgICAgIHJlYWR5UG9ydC5jbG9zZSgpOwogICAgICBpZiAocmVhZHlNZXNzYWdlIGlzIExpc3QgJiYgcmVhZHlNZXNzYWdlLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgU2VuZFBvcnQgY29udHJvbFBvcnQgPSByZWFkeU1lc3NhZ2VbMF07CiAgICAgICAgTGlzdCBjYXBhYmlsaXRpZXMgPSByZWFkeU1lc3NhZ2VbMV07CiAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlKG5ldyBJc29sYXRlKGNvbnRyb2xQb3J0LAogICAgICAgICAgICBwYXVzZUNhcGFiaWxpdHk6IGNhcGFiaWxpdGllc1swXSwKICAgICAgICAgICAgdGVybWluYXRlQ2FwYWJpbGl0eTogY2FwYWJpbGl0aWVzWzFdKSk7CiAgICAgIH0gZWxzZSBpZiAocmVhZHlNZXNzYWdlIGlzIFN0cmluZykgewogICAgICAgIC8vIFdlIGVuY291bnRlcmVkIGFuIGVycm9yIHdoaWxlIHN0YXJ0aW5nIHRoZSBuZXcgaXNvbGF0ZS4KICAgICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihuZXcgSXNvbGF0ZVNwYXduRXhjZXB0aW9uKAogICAgICAgICAgICAnVW5hYmxlIHRvIHNwYXduIGlzb2xhdGU6ICR7cmVhZHlNZXNzYWdlfScpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4uCiAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlRXJyb3IobmV3IElzb2xhdGVTcGF3bkV4Y2VwdGlvbigKICAgICAgICAgICAgIkludGVybmFsIGVycm9yOiB1bmV4cGVjdGVkIGZvcm1hdCBmb3IgcmVhZHkgbWVzc2FnZTogIgogICAgICAgICAgICAiJyR7cmVhZHlNZXNzYWdlfSciKSk7CiAgICAgIH0KICAgIH07CiAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKICB9CgogIC8vIFRPRE8oaXBvc3ZhKTogQ2xlYW51cCB0byBoYXZlIG9ubHkgb25lIGRlZmluaXRpb24uCiAgLy8gVGhlc2UgdmFsdWVzIG5lZWQgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGNsYXNzIElzb2xhdGVNZXNzYWdlSGFuZGxlcgogIC8vIGluIHZtL2lzb2xhdGUuY2MuCiAgc3RhdGljIGNvbnN0IF9QQVVTRSA9IDE7CiAgc3RhdGljIGNvbnN0IF9SRVNVTUUgPSAyOwogIHN0YXRpYyBjb25zdCBfUElORyA9IDM7CiAgc3RhdGljIGNvbnN0IF9LSUxMID0gNDsKICBzdGF0aWMgY29uc3QgX0FERF9FWElUID0gNTsKICBzdGF0aWMgY29uc3QgX0RFTF9FWElUID0gNjsKICBzdGF0aWMgY29uc3QgX0FERF9FUlJPUiA9IDc7CiAgc3RhdGljIGNvbnN0IF9ERUxfRVJST1IgPSA4OwogIHN0YXRpYyBjb25zdCBfRVJST1JfRkFUQUwgPSA5OwoKICBzdGF0aWMgdm9pZCBfc3Bhd25GdW5jdGlvbigKICAgICAgU2VuZFBvcnQgcmVhZHlQb3J0LAogICAgICBTdHJpbmcgdXJpLAogICAgICBGdW5jdGlvbiB0b3BMZXZlbEZ1bmN0aW9uLAogICAgICB2YXIgbWVzc2FnZSwKICAgICAgYm9vbCBwYXVzZWQsCiAgICAgIGJvb2wgZXJyb3JzQXJlRmF0YWwsCiAgICAgIFNlbmRQb3J0IG9uRXhpdCwKICAgICAgU2VuZFBvcnQgb25FcnJvciwKICAgICAgU3RyaW5nIHBhY2thZ2VSb290LAogICAgICBTdHJpbmcgcGFja2FnZUNvbmZpZywKICAgICAgU3RyaW5nIGRlYnVnTmFtZSkgbmF0aXZlICJJc29sYXRlX3NwYXduRnVuY3Rpb24iOwoKICBzdGF0aWMgdm9pZCBfc3Bhd25VcmkoCiAgICAgIFNlbmRQb3J0IHJlYWR5UG9ydCwKICAgICAgU3RyaW5nIHVyaSwKICAgICAgTGlzdDxTdHJpbmc+IGFyZ3MsCiAgICAgIHZhciBtZXNzYWdlLAogICAgICBib29sIHBhdXNlZCwKICAgICAgU2VuZFBvcnQgb25FeGl0LAogICAgICBTZW5kUG9ydCBvbkVycm9yLAogICAgICBib29sIGVycm9yc0FyZUZhdGFsLAogICAgICBib29sIGNoZWNrZWQsCiAgICAgIExpc3QgZW52aXJvbm1lbnQsCiAgICAgIFN0cmluZyBwYWNrYWdlUm9vdCwKICAgICAgU3RyaW5nIHBhY2thZ2VDb25maWcsCiAgICAgIFN0cmluZyBkZWJ1Z05hbWUpIG5hdGl2ZSAiSXNvbGF0ZV9zcGF3blVyaSI7CgogIHN0YXRpYyB2b2lkIF9zZW5kT09CKHBvcnQsIG1zZykgbmF0aXZlICJJc29sYXRlX3NlbmRPT0IiOwoKICBzdGF0aWMgU3RyaW5nIF9nZXREZWJ1Z05hbWUoU2VuZFBvcnQgY29udHJvbFBvcnQpCiAgICAgIG5hdGl2ZSAiSXNvbGF0ZV9nZXREZWJ1Z05hbWUiOwoKICBAcGF0Y2gKICB2b2lkIF9wYXVzZShDYXBhYmlsaXR5IHJlc3VtZUNhcGFiaWxpdHkpIHsKICAgIHZhciBtc2cgPSBuZXcgTGlzdCg0KQogICAgICAuLlswXSA9IDAgLy8gTWFrZSByb29tIGZvciBPT0IgbWVzc2FnZSB0eXBlLgogICAgICAuLlsxXSA9IF9QQVVTRQogICAgICAuLlsyXSA9IHBhdXNlQ2FwYWJpbGl0eQogICAgICAuLlszXSA9IHJlc3VtZUNhcGFiaWxpdHk7CiAgICBfc2VuZE9PQihjb250cm9sUG9ydCwgbXNnKTsKICB9CgogIEBwYXRjaAogIHZvaWQgcmVzdW1lKENhcGFiaWxpdHkgcmVzdW1lQ2FwYWJpbGl0eSkgewogICAgdmFyIG1zZyA9IG5ldyBMaXN0KDQpCiAgICAgIC4uWzBdID0gMCAvLyBNYWtlIHJvb20gZm9yIE9PQiBtZXNzYWdlIHR5cGUuCiAgICAgIC4uWzFdID0gX1JFU1VNRQogICAgICAuLlsyXSA9IHBhdXNlQ2FwYWJpbGl0eQogICAgICAuLlszXSA9IHJlc3VtZUNhcGFiaWxpdHk7CiAgICBfc2VuZE9PQihjb250cm9sUG9ydCwgbXNnKTsKICB9CgogIEBwYXRjaAogIHZvaWQgYWRkT25FeGl0TGlzdGVuZXIoU2VuZFBvcnQgcmVzcG9uc2VQb3J0LCB7T2JqZWN0IHJlc3BvbnNlfSkgewogICAgdmFyIG1zZyA9IG5ldyBMaXN0KDQpCiAgICAgIC4uWzBdID0gMCAvLyBNYWtlIHJvb20gZm9yIE9PQiBtZXNzYWdlIHR5cGUuCiAgICAgIC4uWzFdID0gX0FERF9FWElUCiAgICAgIC4uWzJdID0gcmVzcG9uc2VQb3J0CiAgICAgIC4uWzNdID0gcmVzcG9uc2U7CiAgICBfc2VuZE9PQihjb250cm9sUG9ydCwgbXNnKTsKICB9CgogIEBwYXRjaAogIHZvaWQgcmVtb3ZlT25FeGl0TGlzdGVuZXIoU2VuZFBvcnQgcmVzcG9uc2VQb3J0KSB7CiAgICB2YXIgbXNnID0gbmV3IExpc3QoMykKICAgICAgLi5bMF0gPSAwIC8vIE1ha2Ugcm9vbSBmb3IgT09CIG1lc3NhZ2UgdHlwZS4KICAgICAgLi5bMV0gPSBfREVMX0VYSVQKICAgICAgLi5bMl0gPSByZXNwb25zZVBvcnQ7CiAgICBfc2VuZE9PQihjb250cm9sUG9ydCwgbXNnKTsKICB9CgogIEBwYXRjaAogIHZvaWQgc2V0RXJyb3JzRmF0YWwoYm9vbCBlcnJvcnNBcmVGYXRhbCkgewogICAgdmFyIG1zZyA9IG5ldyBMaXN0KDQpCiAgICAgIC4uWzBdID0gMCAvLyBNYWtlIHJvb20gZm9yIE9PQiBtZXNzYWdlIHR5cGUuCiAgICAgIC4uWzFdID0gX0VSUk9SX0ZBVEFMCiAgICAgIC4uWzJdID0gdGVybWluYXRlQ2FwYWJpbGl0eQogICAgICAuLlszXSA9IGVycm9yc0FyZUZhdGFsOwogICAgX3NlbmRPT0IoY29udHJvbFBvcnQsIG1zZyk7CiAgfQoKICBAcGF0Y2gKICB2b2lkIGtpbGwoe2ludCBwcmlvcml0eTogYmVmb3JlTmV4dEV2ZW50fSkgewogICAgdmFyIG1zZyA9IG5ldyBMaXN0KDQpCiAgICAgIC4uWzBdID0gMCAvLyBNYWtlIHJvb20gZm9yIE9PQiBtZXNzYWdlIHR5cGUuCiAgICAgIC4uWzFdID0gX0tJTEwKICAgICAgLi5bMl0gPSB0ZXJtaW5hdGVDYXBhYmlsaXR5CiAgICAgIC4uWzNdID0gcHJpb3JpdHk7CiAgICBfc2VuZE9PQihjb250cm9sUG9ydCwgbXNnKTsKICB9CgogIEBwYXRjaAogIHZvaWQgcGluZyhTZW5kUG9ydCByZXNwb25zZVBvcnQsIHtPYmplY3QgcmVzcG9uc2UsIGludCBwcmlvcml0eTogaW1tZWRpYXRlfSkgewogICAgdmFyIG1zZyA9IG5ldyBMaXN0KDUpCiAgICAgIC4uWzBdID0gMCAvLyBNYWtlIHJvb20gZm9yIE9PTSBtZXNzYWdlIHR5cGUuCiAgICAgIC4uWzFdID0gX1BJTkcKICAgICAgLi5bMl0gPSByZXNwb25zZVBvcnQKICAgICAgLi5bM10gPSBwcmlvcml0eQogICAgICAuLls0XSA9IHJlc3BvbnNlOwogICAgX3NlbmRPT0IoY29udHJvbFBvcnQsIG1zZyk7CiAgfQoKICBAcGF0Y2gKICB2b2lkIGFkZEVycm9yTGlzdGVuZXIoU2VuZFBvcnQgcG9ydCkgewogICAgdmFyIG1zZyA9IG5ldyBMaXN0KDMpCiAgICAgIC4uWzBdID0gMCAvLyBNYWtlIHJvb20gZm9yIE9PQiBtZXNzYWdlIHR5cGUuCiAgICAgIC4uWzFdID0gX0FERF9FUlJPUgogICAgICAuLlsyXSA9IHBvcnQ7CiAgICBfc2VuZE9PQihjb250cm9sUG9ydCwgbXNnKTsKICB9CgogIEBwYXRjaAogIHZvaWQgcmVtb3ZlRXJyb3JMaXN0ZW5lcihTZW5kUG9ydCBwb3J0KSB7CiAgICB2YXIgbXNnID0gbmV3IExpc3QoMykKICAgICAgLi5bMF0gPSAwIC8vIE1ha2Ugcm9vbSBmb3IgT09CIG1lc3NhZ2UgdHlwZS4KICAgICAgLi5bMV0gPSBfREVMX0VSUk9SCiAgICAgIC4uWzJdID0gcG9ydDsKICAgIF9zZW5kT09CKGNvbnRyb2xQb3J0LCBtc2cpOwogIH0KCiAgc3RhdGljIElzb2xhdGUgX2dldEN1cnJlbnRJc29sYXRlKCkgewogICAgTGlzdCBwb3J0QW5kQ2FwYWJpbGl0aWVzID0gX2dldFBvcnRBbmRDYXBhYmlsaXRpZXNPZkN1cnJlbnRJc29sYXRlKCk7CiAgICByZXR1cm4gbmV3IElzb2xhdGUocG9ydEFuZENhcGFiaWxpdGllc1swXSwKICAgICAgICBwYXVzZUNhcGFiaWxpdHk6IHBvcnRBbmRDYXBhYmlsaXRpZXNbMV0sCiAgICAgICAgdGVybWluYXRlQ2FwYWJpbGl0eTogcG9ydEFuZENhcGFiaWxpdGllc1syXSk7CiAgfQoKICBzdGF0aWMgTGlzdCBfZ2V0UG9ydEFuZENhcGFiaWxpdGllc09mQ3VycmVudElzb2xhdGUoKQogICAgICBuYXRpdmUgIklzb2xhdGVfZ2V0UG9ydEFuZENhcGFiaWxpdGllc09mQ3VycmVudElzb2xhdGUiOwoKICBzdGF0aWMgVXJpIF9nZXRDdXJyZW50Um9vdFVyaSgpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiBVcmkucGFyc2UoX2dldEN1cnJlbnRSb290VXJpU3RyKCkpOwogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIHN0YXRpYyBTdHJpbmcgX2dldEN1cnJlbnRSb290VXJpU3RyKCkgbmF0aXZlICJJc29sYXRlX2dldEN1cnJlbnRSb290VXJpU3RyIjsKfQoKQHBhdGNoCmFic3RyYWN0IGNsYXNzIFRyYW5zZmVyYWJsZVR5cGVkRGF0YSB7CiAgQHBhdGNoCiAgZmFjdG9yeSBUcmFuc2ZlcmFibGVUeXBlZERhdGEuZnJvbUxpc3QoTGlzdDxUeXBlZERhdGE+IGNodW5rcykgewogICAgaWYgKGNodW5rcyA9PSBudWxsKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoY2h1bmtzKTsKICAgIH0KICAgIGZpbmFsIGludCBjaWQgPSBDbGFzc0lELmdldElEKGNodW5rcyk7CiAgICBpZiAoY2lkICE9IENsYXNzSUQuY2lkQXJyYXkgJiYKICAgICAgICBjaWQgIT0gQ2xhc3NJRC5jaWRHcm93YWJsZU9iamVjdEFycmF5ICYmCiAgICAgICAgY2lkICE9IENsYXNzSUQuY2lkSW1tdXRhYmxlQXJyYXkpIHsKICAgICAgY2h1bmtzID0gTGlzdC51bm1vZGlmaWFibGUoY2h1bmtzKTsKICAgIH0KICAgIHJldHVybiBfVHJhbnNmZXJhYmxlVHlwZWREYXRhSW1wbChjaHVua3MpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVHJhbnNmZXJhYmxlVHlwZWREYXRhSW1wbCBpbXBsZW1lbnRzIFRyYW5zZmVyYWJsZVR5cGVkRGF0YSB7CiAgZmFjdG9yeSBfVHJhbnNmZXJhYmxlVHlwZWREYXRhSW1wbChMaXN0PFR5cGVkRGF0YT4gbGlzdCkKICAgICAgbmF0aXZlICJUcmFuc2ZlcmFibGVUeXBlZERhdGFfZmFjdG9yeSI7CgogIEJ5dGVCdWZmZXIgbWF0ZXJpYWxpemUoKSB7CiAgICByZXR1cm4gX21hdGVyaWFsaXplSW50b1VpbnQ4TGlzdCgpLmJ1ZmZlcjsKICB9CgogIFVpbnQ4TGlzdCBfbWF0ZXJpYWxpemVJbnRvVWludDhMaXN0KCkKICAgICAgbmF0aXZlICJUcmFuc2ZlcmFibGVUeXBlZERhdGFfbWF0ZXJpYWxpemUiOwp9CoLGAE5OPAFNTUsrAT0BFFEBJ0ABOhsBBxQJMwEJQz0EAgEHEwkxAgEaLj0BIDkEARUcBAExOAIBBxcGNQVIRhgGCS88HhMEAgE/RgE3RSgEARoeBAE2Py1JBAEMFhkEASEgAgEjAUcuAU0nMjAwKAIBIiYrLiYQBAIBNywkEwIBOiciMSQCARo2RQEMOi8EARocBAEgLS0EARUeBAEuMDwBPyQiIhMEATQkPk1MMxYkBAE7PgElKQQBNBwdNiE0FhYBGgQBNAIBGiosGQQBHyQbHAQBIEwEARUcBAElKjYBP0cCARwjMgEEQkMjBCJBER4SDBoaHyACAQRPTUY4BCIqHAIBBEoMBCIUGRkXERUgGVAdRgQBHEU4B08kLCQBRyUZIwQgAUxOHy4XEgEWKzAxJw8WCA0bBgUxHAIBBxA3MAEJMQEJNgEJJzQYOQYTBAEJKTYYOwYTBAEJOTcYPwYdBAElNzk4AQlJGxsXGCEjHgpMICstCEkoAVBGPjIcSRQ1CCg6CAEWHh0WExIaEhMQGRYsFh8bCDUGBAEJSxsXGBsUJxcZLiEeHzMGAUUmIUE3HQgjQTcfCA0+QzEIBgpHMQFMKSMlKzM3CggBSCFIPBwqTSUxSgoIATwoNzsBER4hEBMSEhMaExAcHR8WLBIfGwgPBgQBQjkpGT4wLTQuNCtDOzoPIjtEIwgHHQQBOE8XGxwaGh4eHx8hAR4aEiETExsXGBocOAEZGhIZExMXGBsUGBocMwE8ATQlAQktGjMVHiAgBAEJLRozFh4gIAQBCUUaMxgbGCAEAQk1GjMYHCAEAQktGjMbIh4gBAEJLxozFCIYIAQBCVEaMxQbFxggBAEJKRozGRQgBAEJLBozGRQgBAEoSi8xNgQBOD8BJAoxEhMGBAFPAgEHJwlDGiMGKyMxLCoGLwQCARpEOy4BHS8EASgyAgElZGFydDppc29sYXRlLXBhdGNoL2lzb2xhdGVfcGF0Y2guZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3RpbWVyX2ltcGwuZGFydLpjLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImlzb2xhdGVfcGF0Y2guZGFydCI7CgovLyBUaW1lciBoZWFwIGltcGxlbWVudGVkIGFzIGEgYXJyYXktYmFzZWQgYmluYXJ5IGhlYXBbMF0uCi8vIFRoaXMgYWxsb3dzIGZvciBPKDEpIGBmaXJzdGAsIE8obG9nKG4pKSBgcmVtb3ZlYC9gcmVtb3ZlRmlyc3RgIGFuZCBPKGxvZyhuKSkKLy8gYGFkZGAuCi8vCi8vIFRvIGVuc3VyZSB0aGUgdGltZXJzIGFyZSBvcmRlcmVkIGJ5IGluc2VydGlvbiB0aW1lLCB0aGUgX1RpbWVyIGNsYXNzIGhhcyBhCi8vIGBfaWRgIGZpZWxkIHNldCB3aGVuIGFkZGVkIHRvIHRoZSBoZWFwLgovLwovLyBbMF0gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnlfaGVhcApjbGFzcyBfVGltZXJIZWFwIHsKICBMaXN0PF9UaW1lcj4gX2xpc3Q7CiAgaW50IF91c2VkID0gMDsKCiAgX1RpbWVySGVhcChbaW50IGluaXRTaXplID0gN10pIDogX2xpc3QgPSBuZXcgTGlzdDxfVGltZXI+KGluaXRTaXplKTsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfdXNlZCA9PSAwOwoKICBfVGltZXIgZ2V0IGZpcnN0ID0+IF9saXN0WzBdOwoKICBib29sIGlzRmlyc3QoX1RpbWVyIHRpbWVyKSA9PiB0aW1lci5faW5kZXhPck5leHQgPT0gMDsKCiAgdm9pZCBhZGQoX1RpbWVyIHRpbWVyKSB7CiAgICBpZiAoX3VzZWQgPT0gX2xpc3QubGVuZ3RoKSB7CiAgICAgIF9yZXNpemUoKTsKICAgIH0KICAgIHRpbWVyLl9pbmRleE9yTmV4dCA9IF91c2VkKys7CiAgICBfbGlzdFt0aW1lci5faW5kZXhPck5leHRdID0gdGltZXI7CiAgICBfYnViYmxlVXAodGltZXIpOwogIH0KCiAgX1RpbWVyIHJlbW92ZUZpcnN0KCkgewogICAgdmFyIGYgPSBmaXJzdDsKICAgIHJlbW92ZShmKTsKICAgIHJldHVybiBmOwogIH0KCiAgdm9pZCByZW1vdmUoX1RpbWVyIHRpbWVyKSB7CiAgICBfdXNlZC0tOwogICAgaWYgKGlzRW1wdHkpIHsKICAgICAgX2xpc3RbMF0gPSBudWxsOwogICAgICB0aW1lci5faW5kZXhPck5leHQgPSBudWxsOwogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgbGFzdCA9IF9saXN0W191c2VkXTsKICAgIGlmICghaWRlbnRpY2FsKGxhc3QsIHRpbWVyKSkgewogICAgICBsYXN0Ll9pbmRleE9yTmV4dCA9IHRpbWVyLl9pbmRleE9yTmV4dDsKICAgICAgX2xpc3RbbGFzdC5faW5kZXhPck5leHRdID0gbGFzdDsKICAgICAgaWYgKGxhc3QuX2NvbXBhcmVUbyh0aW1lcikgPCAwKSB7CiAgICAgICAgX2J1YmJsZVVwKGxhc3QpOwogICAgICB9IGVsc2UgewogICAgICAgIF9idWJibGVEb3duKGxhc3QpOwogICAgICB9CiAgICB9CiAgICBfbGlzdFtfdXNlZF0gPSBudWxsOwogICAgdGltZXIuX2luZGV4T3JOZXh0ID0gbnVsbDsKICB9CgogIHZvaWQgX3Jlc2l6ZSgpIHsKICAgIHZhciBuZXdMaXN0ID0gbmV3IExpc3Q8X1RpbWVyPihfbGlzdC5sZW5ndGggKiAyICsgMSk7CiAgICBuZXdMaXN0LnNldFJhbmdlKDAsIF91c2VkLCBfbGlzdCk7CiAgICBfbGlzdCA9IG5ld0xpc3Q7CiAgfQoKICB2b2lkIF9idWJibGVVcChfVGltZXIgdGltZXIpIHsKICAgIHdoaWxlICghaXNGaXJzdCh0aW1lcikpIHsKICAgICAgVGltZXIgcGFyZW50ID0gX3BhcmVudCh0aW1lcik7CiAgICAgIGlmICh0aW1lci5fY29tcGFyZVRvKHBhcmVudCkgPCAwKSB7CiAgICAgICAgX3N3YXAodGltZXIsIHBhcmVudCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX2J1YmJsZURvd24oX1RpbWVyIHRpbWVyKSB7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpbnQgbGVmdEluZGV4ID0gX2xlZnRDaGlsZEluZGV4KHRpbWVyLl9pbmRleE9yTmV4dCk7CiAgICAgIGludCByaWdodEluZGV4ID0gX3JpZ2h0Q2hpbGRJbmRleCh0aW1lci5faW5kZXhPck5leHQpOwogICAgICBfVGltZXIgbmV3ZXN0ID0gdGltZXI7CiAgICAgIGlmIChsZWZ0SW5kZXggPCBfdXNlZCAmJiBfbGlzdFtsZWZ0SW5kZXhdLl9jb21wYXJlVG8obmV3ZXN0KSA8IDApIHsKICAgICAgICBuZXdlc3QgPSBfbGlzdFtsZWZ0SW5kZXhdOwogICAgICB9CiAgICAgIGlmIChyaWdodEluZGV4IDwgX3VzZWQgJiYgX2xpc3RbcmlnaHRJbmRleF0uX2NvbXBhcmVUbyhuZXdlc3QpIDwgMCkgewogICAgICAgIG5ld2VzdCA9IF9saXN0W3JpZ2h0SW5kZXhdOwogICAgICB9CiAgICAgIGlmIChpZGVudGljYWwobmV3ZXN0LCB0aW1lcikpIHsKICAgICAgICAvLyBXZSBhcmUgd2hlcmUgd2Ugc2hvdWxkIGJlLCBicmVhay4KICAgICAgICBicmVhazsKICAgICAgfQogICAgICBfc3dhcChuZXdlc3QsIHRpbWVyKTsKICAgIH0KICB9CgogIHZvaWQgX3N3YXAoX1RpbWVyIGZpcnN0LCBfVGltZXIgc2Vjb25kKSB7CiAgICBpbnQgdG1wID0gZmlyc3QuX2luZGV4T3JOZXh0OwogICAgZmlyc3QuX2luZGV4T3JOZXh0ID0gc2Vjb25kLl9pbmRleE9yTmV4dDsKICAgIHNlY29uZC5faW5kZXhPck5leHQgPSB0bXA7CiAgICBfbGlzdFtmaXJzdC5faW5kZXhPck5leHRdID0gZmlyc3Q7CiAgICBfbGlzdFtzZWNvbmQuX2luZGV4T3JOZXh0XSA9IHNlY29uZDsKICB9CgogIFRpbWVyIF9wYXJlbnQoX1RpbWVyIHRpbWVyKSA9PiBfbGlzdFtfcGFyZW50SW5kZXgodGltZXIuX2luZGV4T3JOZXh0KV07CiAgVGltZXIgX2xlZnRDaGlsZChfVGltZXIgdGltZXIpID0+IF9saXN0W19sZWZ0Q2hpbGRJbmRleCh0aW1lci5faW5kZXhPck5leHQpXTsKICBUaW1lciBfcmlnaHRDaGlsZChfVGltZXIgdGltZXIpID0+CiAgICAgIF9saXN0W19yaWdodENoaWxkSW5kZXgodGltZXIuX2luZGV4T3JOZXh0KV07CgogIHN0YXRpYyBpbnQgX3BhcmVudEluZGV4KGludCBpbmRleCkgPT4gKGluZGV4IC0gMSkgfi8gMjsKICBzdGF0aWMgaW50IF9sZWZ0Q2hpbGRJbmRleChpbnQgaW5kZXgpID0+IDIgKiBpbmRleCArIDE7CiAgc3RhdGljIGludCBfcmlnaHRDaGlsZEluZGV4KGludCBpbmRleCkgPT4gMiAqIGluZGV4ICsgMjsKfQoKY2xhc3MgX1RpbWVyIGltcGxlbWVudHMgVGltZXIgewogIC8vIENhbmNlbHMgdGhlIHRpbWVyIGluIHRoZSBldmVudCBoYW5kbGVyLgogIHN0YXRpYyBjb25zdCBfTk9fVElNRVIgPSAtMTsKCiAgLy8gV2UgZGlzdGluZ3Vpc2ggd2hhdCBraW5kIG9mIG1lc3NhZ2UgYXJyaXZlZCBiYXNlZCBvbiB0aGUgdmFsdWUgYmVpbmcgc2VudC4KICBzdGF0aWMgY29uc3QgX1pFUk9fRVZFTlQgPSAxOwogIHN0YXRpYyBjb25zdCBfVElNRU9VVF9FVkVOVCA9IG51bGw7CgogIC8vIFRpbWVycyBhcmUgb3JkZXJlZCBieSB3YWtldXAgdGltZS4gVGltZXJzIHdpdGggYSB0aW1lb3V0IHZhbHVlIG9mID4gMCBkbwogIC8vIGVuZCB1cCBvbiB0aGUgVGltZXJIZWFwLiBUaW1lcnMgd2l0aCBhIHRpbWVvdXQgb2YgMCBhcmUgcXVldWVkIGluIGEgbGlzdC4KICBzdGF0aWMgZmluYWwgX2hlYXAgPSBuZXcgX1RpbWVySGVhcCgpOwogIHN0YXRpYyBfVGltZXIgX2ZpcnN0WmVyb1RpbWVyOwogIHN0YXRpYyBfVGltZXIgX2xhc3RaZXJvVGltZXI7CgogIC8vIFdlIHVzZSBhbiBpZCB0byBiZSBhYmxlIHRvIHNvcnQgdGltZXJzIHdpdGggdGhlIHNhbWUgZXhwaXJhdGlvbiB0aW1lLgogIC8vIGlkcyBhcmUgcmVjeWNsZWQgYWZ0ZXIgSURfTUFTSyBlbnF1ZXVlcyBvciB3aGVuIHRoZSB0aW1lciBxdWV1ZSBpcyBlbXB0eS4KICBzdGF0aWMgY29uc3QgX0lEX01BU0sgPSAweDFmZmZmZmZmOwogIHN0YXRpYyBpbnQgX2lkQ291bnQgPSAwOwoKICBzdGF0aWMgUmF3UmVjZWl2ZVBvcnQgX3JlY2VpdmVQb3J0OwogIHN0YXRpYyBTZW5kUG9ydCBfc2VuZFBvcnQ7CiAgc3RhdGljIGludCBfc2NoZWR1bGVkV2FrZXVwVGltZTsKCiAgc3RhdGljIGJvb2wgX2hhbmRsaW5nQ2FsbGJhY2tzID0gZmFsc2U7CgogIEZ1bmN0aW9uIF9jYWxsYmFjazsgLy8gQ2xvc3VyZSB0byBjYWxsIHdoZW4gdGltZXIgZmlyZXMuIG51bGwgaWYgY2FuY2VsZWQuCiAgaW50IF93YWtldXBUaW1lOyAvLyBFeHBpcmF0aW9uIHRpbWUuCiAgZmluYWwgaW50IF9taWxsaVNlY29uZHM7IC8vIER1cmF0aW9uIHNwZWNpZmllZCBhdCBjcmVhdGlvbi4KICBmaW5hbCBib29sIF9yZXBlYXRpbmc7IC8vIEluZGljYXRlcyBwZXJpb2RpYyB0aW1lcnMuCiAgdmFyIF9pbmRleE9yTmV4dDsgLy8gSW5kZXggaWYgcGFydCBvZiB0aGUgVGltZXJIZWFwLCBsaW5rIG90aGVyd2lzZS4KICBpbnQgX2lkOyAvLyBJbmNyZW1lbnRpbmcgaWQgdG8gZW5hYmxlIHNvcnRpbmcgb2YgdGltZXJzIHdpdGggc2FtZSBleHBpcnkuCgogIGludCBfdGljayA9IDA7IC8vIEJhY2tpbmcgZm9yIFt0aWNrXSwKCiAgLy8gR2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBpZC4gV2UgYWNjZXB0IGNvbGxpc2lvbnMgYW5kIHJlb3JkZXJpbmcgd2hlbiB0aGUKICAvLyBfaWRDb3VudCBvdmVyZmxvd3MgYW5kIHRoZSB0aW1lcnMgZXhwaXJlIGF0IHRoZSBzYW1lIG1pbGxpc2Vjb25kLgogIHN0YXRpYyBpbnQgX25leHRJZCgpIHsKICAgIHZhciByZXN1bHQgPSBfaWRDb3VudDsKICAgIF9pZENvdW50ID0gKF9pZENvdW50ICsgMSkgJiBfSURfTUFTSzsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBfVGltZXIuX2ludGVybmFsKAogICAgICB0aGlzLl9jYWxsYmFjaywgdGhpcy5fd2FrZXVwVGltZSwgdGhpcy5fbWlsbGlTZWNvbmRzLCB0aGlzLl9yZXBlYXRpbmcpCiAgICAgIDogX2lkID0gX25leHRJZCgpOwoKICBzdGF0aWMgVGltZXIgX2NyZWF0ZVRpbWVyKAogICAgICB2b2lkIGNhbGxiYWNrKFRpbWVyIHRpbWVyKSwgaW50IG1pbGxpU2Vjb25kcywgYm9vbCByZXBlYXRpbmcpIHsKICAgIC8vIE5lZ2F0aXZlIHRpbWVvdXRzIGFyZSB0cmVhdGVkIGFzIGlmIDAgdGltZW91dC4KICAgIGlmIChtaWxsaVNlY29uZHMgPCAwKSB7CiAgICAgIG1pbGxpU2Vjb25kcyA9IDA7CiAgICB9CiAgICAvLyBBZGQgb25lIGJlY2F1c2UgRGF0ZVRpbWUubm93KCkgaXMgYXNzdW1lZCB0byByb3VuZCBkb3duCiAgICAvLyB0byBuZWFyZXN0IG1pbGxpc2Vjb25kLCBub3QgdXAsIHNvIHRoYXQgdGltZSArIGR1cmF0aW9uIGlzIGJlZm9yZQogICAgLy8gZHVyYXRpb24gbWlsbGlzZWNvbmRzIGZyb20gbm93LiBVc2luZyBtaWNyb3NlY29uZCB0aW1lcnMgbGlrZQogICAgLy8gU3RvcHdhdGNoIGFsbG93cyBkZXRlY3RpbmcgdGhhdCB0aGUgdGltZXIgZmlyZXMgZWFybHkuCiAgICBpbnQgbm93ID0gVk1MaWJyYXJ5SG9va3MudGltZXJNaWxsaXNlY29uZENsb2NrKCk7CiAgICBpbnQgd2FrZXVwVGltZSA9IChtaWxsaVNlY29uZHMgPT0gMCkgPyBub3cgOiAobm93ICsgMSArIG1pbGxpU2Vjb25kcyk7CgogICAgX1RpbWVyIHRpbWVyID0KICAgICAgICBuZXcgX1RpbWVyLl9pbnRlcm5hbChjYWxsYmFjaywgd2FrZXVwVGltZSwgbWlsbGlTZWNvbmRzLCByZXBlYXRpbmcpOwogICAgLy8gRW5xdWV1ZSB0aGlzIG5ld2x5IGNyZWF0ZWQgdGltZXIgaW4gdGhlIGFwcHJvcHJpYXRlIHN0cnVjdHVyZSBhbmQKICAgIC8vIG5vdGlmeSBpZiBuZWNlc3NhcnkuCiAgICB0aW1lci5fZW5xdWV1ZSgpOwogICAgcmV0dXJuIHRpbWVyOwogIH0KCiAgZmFjdG9yeSBfVGltZXIoaW50IG1pbGxpU2Vjb25kcywgdm9pZCBjYWxsYmFjayhUaW1lciB0aW1lcikpIHsKICAgIHJldHVybiBfY3JlYXRlVGltZXIoY2FsbGJhY2ssIG1pbGxpU2Vjb25kcywgZmFsc2UpOwogIH0KCiAgZmFjdG9yeSBfVGltZXIucGVyaW9kaWMoaW50IG1pbGxpU2Vjb25kcywgdm9pZCBjYWxsYmFjayhUaW1lciB0aW1lcikpIHsKICAgIHJldHVybiBfY3JlYXRlVGltZXIoY2FsbGJhY2ssIG1pbGxpU2Vjb25kcywgdHJ1ZSk7CiAgfQoKICBib29sIGdldCBfaXNJbkhlYXAgPT4gX2luZGV4T3JOZXh0IGlzIGludDsKCiAgaW50IF9jb21wYXJlVG8oX1RpbWVyIG90aGVyKSB7CiAgICBpbnQgYyA9IF93YWtldXBUaW1lIC0gb3RoZXIuX3dha2V1cFRpbWU7CiAgICBpZiAoYyAhPSAwKSByZXR1cm4gYzsKICAgIHJldHVybiBfaWQgLSBvdGhlci5faWQ7CiAgfQoKICBib29sIGdldCBpc0FjdGl2ZSA9PiBfY2FsbGJhY2sgIT0gbnVsbDsKCiAgaW50IGdldCB0aWNrID0+IF90aWNrOwoKICAvLyBDYW5jZWxzIGEgc2V0IHRpbWVyLiBUaGUgdGltZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSB0aW1lciBoZWFwIGlmIGl0IGlzIGEKICAvLyBub24temVybyB0aW1lci4gWmVybyB0aW1lcnMgYXJlIGtlcHQgaW4gdGhlIGxpc3QgYXMgdGhleSBuZWVkIHRvIGNvbnN1bWUKICAvLyB0aGUgY29ycmVzcG9uZGluZyBwZW5kaW5nIG1lc3NhZ2UuCiAgdm9pZCBjYW5jZWwoKSB7CiAgICBfY2FsbGJhY2sgPSBudWxsOwogICAgLy8gT25seSBoZWFwIHRpbWVycyBhcmUgcmVhbGx5IHJlbW92ZWQuIFplcm8gdGltZXJzIG5lZWQgdG8gY29uc3VtZSB0aGVpcgogICAgLy8gY29ycmVzcG9uZGluZyB3YWtldXAgbWVzc2FnZSBzbyB0aGV5IGFyZSBsZWZ0IGluIHRoZSBxdWV1ZS4KICAgIGlmICghX2lzSW5IZWFwKSByZXR1cm47CiAgICBib29sIHVwZGF0ZSA9IF9oZWFwLmlzRmlyc3QodGhpcyk7CiAgICBfaGVhcC5yZW1vdmUodGhpcyk7CiAgICBpZiAodXBkYXRlKSB7CiAgICAgIF9ub3RpZnlFdmVudEhhbmRsZXIoKTsKICAgIH0KICB9CgogIHZvaWQgX2FkdmFuY2VXYWtldXBUaW1lKCkgewogICAgLy8gUmVjYWxjdWxhdGUgdGhlIG5leHQgd2FrZXVwIHRpbWUuIEZvciByZXBlYXRpbmcgdGltZXJzIHdpdGggYSAwIHRpbWVvdXQKICAgIC8vIHRoZSBuZXh0IHdha2V1cCB0aW1lIGlzIG5vdy4KICAgIF9pZCA9IF9uZXh0SWQoKTsKICAgIGlmIChfbWlsbGlTZWNvbmRzID4gMCkgewogICAgICBfd2FrZXVwVGltZSArPSBfbWlsbGlTZWNvbmRzOwogICAgfSBlbHNlIHsKICAgICAgX3dha2V1cFRpbWUgPSBWTUxpYnJhcnlIb29rcy50aW1lck1pbGxpc2Vjb25kQ2xvY2soKTsKICAgIH0KICB9CgogIC8vIEFkZHMgYSB0aW1lciB0byB0aGUgaGVhcCBvciB0aW1lciBsaXN0LiBUaW1lcnMgd2l0aCB0aGUgc2FtZSB3YWtldXAgdGltZQogIC8vIGFyZSBlbnF1ZXVlZCBpbiBvcmRlciBhbmQgbm90aWZpZWQgaW4gRklGTyBvcmRlci4KICB2b2lkIF9lbnF1ZXVlKCkgewogICAgaWYgKF9taWxsaVNlY29uZHMgPT0gMCkgewogICAgICBpZiAoX2ZpcnN0WmVyb1RpbWVyID09IG51bGwpIHsKICAgICAgICBfbGFzdFplcm9UaW1lciA9IHRoaXM7CiAgICAgICAgX2ZpcnN0WmVyb1RpbWVyID0gdGhpczsKICAgICAgfSBlbHNlIHsKICAgICAgICBfbGFzdFplcm9UaW1lci5faW5kZXhPck5leHQgPSB0aGlzOwogICAgICAgIF9sYXN0WmVyb1RpbWVyID0gdGhpczsKICAgICAgfQogICAgICAvLyBFdmVyeSB6ZXJvIHRpbWVyIGdldHMgaXRzIG93biBldmVudC4KICAgICAgX25vdGlmeVplcm9IYW5kbGVyKCk7CiAgICB9IGVsc2UgewogICAgICBfaGVhcC5hZGQodGhpcyk7CiAgICAgIGlmIChfaGVhcC5pc0ZpcnN0KHRoaXMpKSB7CiAgICAgICAgX25vdGlmeUV2ZW50SGFuZGxlcigpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBFbnF1ZXVlIG9uZSBtZXNzYWdlIGZvciBlYWNoIHplcm8gdGltZXIuIFRvIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggZnJvbQogIC8vIEV2ZW50SGFuZGxlciBtZXNzYWdlcyB3ZSBzZW5kIGEgX1pFUk9fRVZFTlQgaW5zdGVhZCBvZiBhIF9USU1FT1VUX0VWRU5ULgogIHN0YXRpYyB2b2lkIF9ub3RpZnlaZXJvSGFuZGxlcigpIHsKICAgIGlmIChfc2VuZFBvcnQgPT0gbnVsbCkgewogICAgICBfY3JlYXRlVGltZXJIYW5kbGVyKCk7CiAgICB9CiAgICBfc2VuZFBvcnQuc2VuZChfWkVST19FVkVOVCk7CiAgfQoKICAvLyBIYW5kbGUgdGhlIG5vdGlmaWNhdGlvbiBvZiBhIHplcm8gdGltZXIuIE1ha2Ugc3VyZSB0byBhbHNvIGV4ZWN1dGUgbm9uLXplcm8KICAvLyB0aW1lcnMgd2l0aCBhIGxvd2VyIGV4cGlyYXRpb24gdGltZS4KICBzdGF0aWMgTGlzdCBfcXVldWVGcm9tWmVyb0V2ZW50KCkgewogICAgdmFyIHBlbmRpbmdUaW1lcnMgPSBuZXcgTGlzdCgpOwogICAgYXNzZXJ0KF9maXJzdFplcm9UaW1lciAhPSBudWxsKTsKICAgIC8vIENvbGxlY3QgcGVuZGluZyB0aW1lcnMgZnJvbSB0aGUgdGltZXIgaGVhcCB0aGF0IGhhdmUgYW4gZXhwaXJhdGlvbiBwcmlvcgogICAgLy8gdG8gdGhlIGN1cnJlbnRseSBub3RpZmllZCB6ZXJvIHRpbWVyLgogICAgdmFyIHRpbWVyOwogICAgd2hpbGUgKCFfaGVhcC5pc0VtcHR5ICYmIChfaGVhcC5maXJzdC5fY29tcGFyZVRvKF9maXJzdFplcm9UaW1lcikgPCAwKSkgewogICAgICB0aW1lciA9IF9oZWFwLnJlbW92ZUZpcnN0KCk7CiAgICAgIHBlbmRpbmdUaW1lcnMuYWRkKHRpbWVyKTsKICAgIH0KICAgIC8vIEFwcGVuZCB0aGUgZmlyc3QgemVybyB0aW1lciB0byB0aGUgcGVuZGluZyB0aW1lcnMuCiAgICB0aW1lciA9IF9maXJzdFplcm9UaW1lcjsKICAgIF9maXJzdFplcm9UaW1lciA9IHRpbWVyLl9pbmRleE9yTmV4dDsKICAgIHRpbWVyLl9pbmRleE9yTmV4dCA9IG51bGw7CiAgICBwZW5kaW5nVGltZXJzLmFkZCh0aW1lcik7CiAgICByZXR1cm4gcGVuZGluZ1RpbWVyczsKICB9CgogIHN0YXRpYyB2b2lkIF9ub3RpZnlFdmVudEhhbmRsZXIoKSB7CiAgICBpZiAoX2hhbmRsaW5nQ2FsbGJhY2tzKSB7CiAgICAgIC8vIFdoaWxlIHdlIGFyZSBhbHJlYWR5IGhhbmRsaW5nIGNhbGxiYWNrcyB3ZSB3aWxsIG5vdCBub3RpZnkgdGhlIGV2ZW50CiAgICAgIC8vIGhhbmRsZXIuIF9oYW5kbGVUaW1lb3V0IHdpbGwgY2FsbCBfbm90aWZ5RXZlbnRIYW5kbGVyIG9uY2UgYWxsIHBlbmRpbmcKICAgICAgLy8gdGltZXJzIGFyZSBwcm9jZXNzZWQuCiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gcGVuZGluZyB0aW1lcnMuIENsb3NlIGRvd24gdGhlIHJlY2VpdmUgcG9ydC4KICAgIGlmICgoX2ZpcnN0WmVyb1RpbWVyID09IG51bGwpICYmIF9oZWFwLmlzRW1wdHkpIHsKICAgICAgLy8gTm8gcGVuZGluZyB0aW1lcnM6IENsb3NlIHRoZSByZWNlaXZlIHBvcnQgYW5kIGxldCB0aGUgZXZlbnQgaGFuZGxlcgogICAgICAvLyBrbm93LgogICAgICBpZiAoX3NlbmRQb3J0ICE9IG51bGwpIHsKICAgICAgICBfY2FuY2VsV2FrZXVwKCk7CiAgICAgICAgX3NodXRkb3duVGltZXJIYW5kbGVyKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmIChfaGVhcC5pc0VtcHR5KSB7CiAgICAgIC8vIE9ubHkgemVybyB0aW1lcnMgYXJlIGxlZnQuIENhbmNlbCBhbnkgc2NoZWR1bGVkIHdha2V1cHMuCiAgICAgIF9jYW5jZWxXYWtldXAoKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIE9ubHkgc2VuZCBhIG1lc3NhZ2UgaWYgdGhlIHJlcXVlc3RlZCB3YWtldXAgdGltZSBkaWZmZXJzIGZyb20gdGhlCiAgICAvLyBhbHJlYWR5IHNjaGVkdWxlZCB3YWtldXAgdGltZS4KICAgIHZhciB3YWtldXBUaW1lID0gX2hlYXAuZmlyc3QuX3dha2V1cFRpbWU7CiAgICBpZiAoKF9zY2hlZHVsZWRXYWtldXBUaW1lID09IG51bGwpIHx8CiAgICAgICAgKHdha2V1cFRpbWUgIT0gX3NjaGVkdWxlZFdha2V1cFRpbWUpKSB7CiAgICAgIF9zY2hlZHVsZVdha2V1cCh3YWtldXBUaW1lKTsKICAgIH0KICB9CgogIHN0YXRpYyBMaXN0IF9xdWV1ZUZyb21UaW1lb3V0RXZlbnQoKSB7CiAgICB2YXIgcGVuZGluZ1RpbWVycyA9IG5ldyBMaXN0KCk7CiAgICBpZiAoX2ZpcnN0WmVyb1RpbWVyICE9IG51bGwpIHsKICAgICAgLy8gQ29sbGVjdCBwZW5kaW5nIHRpbWVycyBmcm9tIHRoZSB0aW1lciBoZWFwIHRoYXQgaGF2ZSBhbiBleHBpcmF0aW9uCiAgICAgIC8vIHByaW9yIHRvIHRoZSBuZXh0IHplcm8gdGltZXIuCiAgICAgIC8vIEJ5IGRlZmluaXRpb24gdGhlIGZpcnN0IHplcm8gdGltZXIgaGFzIGJlZW4gc2NoZWR1bGVkIGJlZm9yZSB0aGUKICAgICAgLy8gY3VycmVudCB0aW1lLCBtZWFuaW5nIGFsbCB0aW1lcnMgd2hpY2ggYXJlICJsZXNzIHRoYW4iIHRoZSBmaXJzdCB6ZXJvCiAgICAgIC8vIHRpbWVyIGFyZSBleHBpcmVkLiBUaGUgZmlyc3QgemVybyB0aW1lciB3aWxsIGJlIGRpc3BhdGNoZWQgd2hlbiBpdHMKICAgICAgLy8gY29ycmVzcG9uZGluZyBtZXNzYWdlIGlzIGRlbGl2ZXJlZC4KICAgICAgdmFyIHRpbWVyOwogICAgICB3aGlsZSAoIV9oZWFwLmlzRW1wdHkgJiYgKF9oZWFwLmZpcnN0Ll9jb21wYXJlVG8oX2ZpcnN0WmVyb1RpbWVyKSA8IDApKSB7CiAgICAgICAgdGltZXIgPSBfaGVhcC5yZW1vdmVGaXJzdCgpOwogICAgICAgIHBlbmRpbmdUaW1lcnMuYWRkKHRpbWVyKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gQ29sbGVjdCBwZW5kaW5nIHRpbWVycyBmcm9tIHRoZSB0aW1lciBoZWFwIHdoaWNoIGhhdmUgZXhwaXJlZCBhdCB0aGlzCiAgICAgIC8vIHRpbWUuCiAgICAgIHZhciBjdXJyZW50VGltZSA9IFZNTGlicmFyeUhvb2tzLnRpbWVyTWlsbGlzZWNvbmRDbG9jaygpOwogICAgICB2YXIgdGltZXI7CiAgICAgIHdoaWxlICghX2hlYXAuaXNFbXB0eSAmJiAoX2hlYXAuZmlyc3QuX3dha2V1cFRpbWUgPD0gY3VycmVudFRpbWUpKSB7CiAgICAgICAgdGltZXIgPSBfaGVhcC5yZW1vdmVGaXJzdCgpOwogICAgICAgIHBlbmRpbmdUaW1lcnMuYWRkKHRpbWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBlbmRpbmdUaW1lcnM7CiAgfQoKICBzdGF0aWMgdm9pZCBfcnVuVGltZXJzKExpc3QgcGVuZGluZ1RpbWVycykgewogICAgLy8gSWYgdGhlcmUgYXJlIG5vIHBlbmRpbmcgdGltZXJzIGN1cnJlbnRseSByZXNldCB0aGUgaWQgc3BhY2UgYmVmb3JlIHdlCiAgICAvLyBoYXZlIGEgY2hhbmNlIHRvIGVucXVldWUgbmV3IHRpbWVycy4KICAgIGlmIChfaGVhcC5pc0VtcHR5ICYmIChfZmlyc3RaZXJvVGltZXIgPT0gbnVsbCkpIHsKICAgICAgX2lkQ291bnQgPSAwOwogICAgfQoKICAgIC8vIEZhc3QgZXhpdCBpZiBubyBwZW5kaW5nIHRpbWVycy4KICAgIGlmIChwZW5kaW5nVGltZXJzLmxlbmd0aCA9PSAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBUcmlnZ2VyIGFsbCBvZiB0aGUgcGVuZGluZyB0aW1lcnMuIE5ldyB0aW1lcnMgYWRkZWQgYXMgcGFydCBvZiB0aGUKICAgIC8vIGNhbGxiYWNrcyB3aWxsIGJlIGVucXVldWVkIG5vdyBhbmQgbm90aWZpZWQgaW4gdGhlIG5leHQgc3BpbiBhdCB0aGUKICAgIC8vIGVhcmxpZXN0LgogICAgX2hhbmRsaW5nQ2FsbGJhY2tzID0gdHJ1ZTsKICAgIHZhciBpID0gMDsKICAgIHRyeSB7CiAgICAgIGZvciAoOyBpIDwgcGVuZGluZ1RpbWVycy5sZW5ndGg7IGkrKykgewogICAgICAgIC8vIE5leHQgcGVuZGluZyB0aW1lci4KICAgICAgICB2YXIgdGltZXIgPSBwZW5kaW5nVGltZXJzW2ldOwogICAgICAgIHRpbWVyLl9pbmRleE9yTmV4dCA9IG51bGw7CgogICAgICAgIC8vIE9uZSBvZiB0aGUgdGltZXJzIGluIHRoZSBwZW5kaW5nX3RpbWVycyBsaXN0IGNhbiBjYW5jZWwKICAgICAgICAvLyBvbmUgb2YgdGhlIGxhdGVyIHRpbWVycyB3aGljaCB3aWxsIHNldCB0aGUgY2FsbGJhY2sgdG8KICAgICAgICAvLyBudWxsLiBPciB0aGUgcGVuZGluZyB6ZXJvIHRpbWVyIGhhcyBiZWVuIGNhbmNlbGVkIGVhcmxpZXIuCiAgICAgICAgaWYgKHRpbWVyLl9jYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSB0aW1lci5fY2FsbGJhY2s7CiAgICAgICAgICBpZiAoIXRpbWVyLl9yZXBlYXRpbmcpIHsKICAgICAgICAgICAgLy8gTWFyayB0aW1lciBhcyBpbmFjdGl2ZS4KICAgICAgICAgICAgdGltZXIuX2NhbGxiYWNrID0gbnVsbDsKICAgICAgICAgIH0gZWxzZSBpZiAodGltZXIuX21pbGxpU2Vjb25kcyA+IDApIHsKICAgICAgICAgICAgdmFyIG1zID0gdGltZXIuX21pbGxpU2Vjb25kczsKICAgICAgICAgICAgaW50IG92ZXJkdWUgPQogICAgICAgICAgICAgICAgVk1MaWJyYXJ5SG9va3MudGltZXJNaWxsaXNlY29uZENsb2NrKCkgLSB0aW1lci5fd2FrZXVwVGltZTsKICAgICAgICAgICAgaWYgKG92ZXJkdWUgPiBtcykgewogICAgICAgICAgICAgIGludCBtaXNzZWRUaWNrcyA9IG92ZXJkdWUgfi8gbXM7CiAgICAgICAgICAgICAgdGltZXIuX3dha2V1cFRpbWUgKz0gbWlzc2VkVGlja3MgKiBtczsKICAgICAgICAgICAgICB0aW1lci5fdGljayArPSBtaXNzZWRUaWNrczsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGltZXIuX3RpY2sgKz0gMTsKCiAgICAgICAgICBjYWxsYmFjayh0aW1lcik7CiAgICAgICAgICAvLyBSZS1pbnNlcnQgcmVwZWF0aW5nIHRpbWVyIGlmIG5vdCBjYW5jZWxlZC4KICAgICAgICAgIGlmICh0aW1lci5fcmVwZWF0aW5nICYmICh0aW1lci5fY2FsbGJhY2sgIT0gbnVsbCkpIHsKICAgICAgICAgICAgdGltZXIuX2FkdmFuY2VXYWtldXBUaW1lKCk7CiAgICAgICAgICAgIHRpbWVyLl9lbnF1ZXVlKCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBFeGVjdXRlIHBlbmRpbmcgbWljcm8gdGFza3MuCiAgICAgICAgICB2YXIgaW1tZWRpYXRlQ2FsbGJhY2sgPSBfcmVtb3ZlUGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrKCk7CiAgICAgICAgICBpZiAoaW1tZWRpYXRlQ2FsbGJhY2sgIT0gbnVsbCkgewogICAgICAgICAgICBpbW1lZGlhdGVDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBmaW5hbGx5IHsKICAgICAgX2hhbmRsaW5nQ2FsbGJhY2tzID0gZmFsc2U7CiAgICAgIC8vIFJlLXF1ZXVlIHRpbWVycyB3ZSBkaWRuJ3QgZ2V0IHRvLgogICAgICBmb3IgKGkrKzsgaSA8IHBlbmRpbmdUaW1lcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgdGltZXIgPSBwZW5kaW5nVGltZXJzW2ldOwogICAgICAgIHRpbWVyLl9lbnF1ZXVlKCk7CiAgICAgIH0KICAgICAgX25vdGlmeUV2ZW50SGFuZGxlcigpOwogICAgfQogIH0KCiAgc3RhdGljIHZvaWQgX2hhbmRsZU1lc3NhZ2UobXNnKSB7CiAgICB2YXIgcGVuZGluZ1RpbWVyczsKICAgIGlmIChtc2cgPT0gX1pFUk9fRVZFTlQpIHsKICAgICAgcGVuZGluZ1RpbWVycyA9IF9xdWV1ZUZyb21aZXJvRXZlbnQoKTsKICAgICAgYXNzZXJ0KHBlbmRpbmdUaW1lcnMubGVuZ3RoID4gMCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQobXNnID09IF9USU1FT1VUX0VWRU5UKTsKICAgICAgX3NjaGVkdWxlZFdha2V1cFRpbWUgPSBudWxsOyAvLyBDb25zdW1lZCB0aGUgbGFzdCBzY2hlZHVsZWQgd2FrZXVwIG5vdy4KICAgICAgcGVuZGluZ1RpbWVycyA9IF9xdWV1ZUZyb21UaW1lb3V0RXZlbnQoKTsKICAgIH0KICAgIF9ydW5UaW1lcnMocGVuZGluZ1RpbWVycyk7CiAgICAvLyBOb3RpZnkgdGhlIGV2ZW50IGhhbmRsZXIgb3Igc2h1dGRvd24gdGhlIHBvcnQgaWYgbm8gbW9yZSBwZW5kaW5nCiAgICAvLyB0aW1lcnMgYXJlIHByZXNlbnQuCiAgICBfbm90aWZ5RXZlbnRIYW5kbGVyKCk7CiAgfQoKICAvLyBUZWxsIHRoZSBldmVudCBoYW5kbGVyIHRvIHdha2UgdGhpcyBpc29sYXRlIGF0IGEgc3BlY2lmaWMgdGltZS4KICBzdGF0aWMgdm9pZCBfc2NoZWR1bGVXYWtldXAoaW50IHdha2V1cFRpbWUpIHsKICAgIGlmIChfc2VuZFBvcnQgPT0gbnVsbCkgewogICAgICBfY3JlYXRlVGltZXJIYW5kbGVyKCk7CiAgICB9CiAgICBWTUxpYnJhcnlIb29rcy5ldmVudEhhbmRsZXJTZW5kRGF0YShudWxsLCBfc2VuZFBvcnQsIHdha2V1cFRpbWUpOwogICAgX3NjaGVkdWxlZFdha2V1cFRpbWUgPSB3YWtldXBUaW1lOwogIH0KCiAgLy8gQ2FuY2VsIHBlbmRpbmcgd2FrZXVwcyBpbiB0aGUgZXZlbnQgaGFuZGxlci4KICBzdGF0aWMgdm9pZCBfY2FuY2VsV2FrZXVwKCkgewogICAgaWYgKF9zZW5kUG9ydCAhPSBudWxsKSB7CiAgICAgIFZNTGlicmFyeUhvb2tzLmV2ZW50SGFuZGxlclNlbmREYXRhKG51bGwsIF9zZW5kUG9ydCwgX05PX1RJTUVSKTsKICAgICAgX3NjaGVkdWxlZFdha2V1cFRpbWUgPSBudWxsOwogICAgfQogIH0KCiAgLy8gQ3JlYXRlIGEgcmVjZWl2ZSBwb3J0IGFuZCByZWdpc3RlciBhIG1lc3NhZ2UgaGFuZGxlciBmb3IgdGhlIHRpbWVyCiAgLy8gZXZlbnRzLgogIHN0YXRpYyB2b2lkIF9jcmVhdGVUaW1lckhhbmRsZXIoKSB7CiAgICBhc3NlcnQoX3JlY2VpdmVQb3J0ID09IG51bGwpOwogICAgYXNzZXJ0KF9zZW5kUG9ydCA9PSBudWxsKTsKICAgIF9yZWNlaXZlUG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydChfaGFuZGxlTWVzc2FnZSk7CiAgICBfc2VuZFBvcnQgPSBfcmVjZWl2ZVBvcnQuc2VuZFBvcnQ7CiAgICBfc2NoZWR1bGVkV2FrZXVwVGltZSA9IG51bGw7CiAgfQoKICBzdGF0aWMgdm9pZCBfc2h1dGRvd25UaW1lckhhbmRsZXIoKSB7CiAgICBfcmVjZWl2ZVBvcnQuY2xvc2UoKTsKICAgIF9yZWNlaXZlUG9ydCA9IG51bGw7CiAgICBfc2VuZFBvcnQgPSBudWxsOwogICAgX3NjaGVkdWxlZFdha2V1cFRpbWUgPSBudWxsOwogIH0KCiAgLy8gVGhlIFRpbWVyIGZhY3RvcnkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBkYXJ0OmFzeW5jIGxpYnJhcnkgYnkgdGhlIGVtYmVkZGVyLgogIHN0YXRpYyBUaW1lciBfZmFjdG9yeSgKICAgICAgaW50IG1pbGxpU2Vjb25kcywgdm9pZCBjYWxsYmFjayhUaW1lciB0aW1lciksIGJvb2wgcmVwZWF0aW5nKSB7CiAgICBpZiAocmVwZWF0aW5nKSB7CiAgICAgIHJldHVybiBuZXcgX1RpbWVyLnBlcmlvZGljKG1pbGxpU2Vjb25kcywgY2FsbGJhY2spOwogICAgfQogICAgcmV0dXJuIG5ldyBfVGltZXIobWlsbGlTZWNvbmRzLCBjYWxsYmFjayk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKX3NldHVwSG9va3MoKSB7CiAgVk1MaWJyYXJ5SG9va3MudGltZXJGYWN0b3J5ID0gX1RpbWVyLl9mYWN0b3J5Owp9CoHXAE5OPAEhATtQCgNOKwMwExYRAUcBIgEgATkBGyERBiInFgQBGRMPDgQBHg0TFyEOBh0jLicoGQ8bCAYZHwQBEzonFQQBIR4lKh4PDwgGBAEjEzs9HUojCEwkCCYtDwgcBgQBLCIuHycpBAFKUCUzATo6OwIBIC0fAVAgJgFOTykhIAFLTyYbASYdIwEqAU0nPjdHTAEoAU1HGRsqEwQBFE0ZAR1GNhwYBj9JRT42SwETTUkcFhIEAUE4BAFKNwQBLQEhLRocBAEqARkBTk4oEhZOQxwnGBIdBgQBHk8kFR0kDTwGBAFONxQeJR8gDywfCC4cDRchHwgGBAFNTiUdHQYhBAFRKiYkJVAtD04jIAY6HSofHhoEASYeTlAfDgYBRDZNDx8ZIQgOIEIXDgYBSSYuKjAjBgQBKSQjTCdKT00tEVAlIggNTw9AEUslIggGGgQBL00sNhQGASclDgYBSksRHw8KLh8mIwFDQkYnKiMnJDAqGkwgLzUqDgwcARs4PygeDCpFKyEMCggQIisxJhoIHQYEASQXHi0oDSVOMAYfSBsbBAFFMB0dBkYnBAEyIB1HIwYEAUgNJiIfNychBAEoGhkWIQQBTxlGFToGLwQCASIQMQIBImRhcnQ6aXNvbGF0ZS1wYXRjaC90aW1lcl9pbXBsLmRhcnQzb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lzb2xhdGUvY2FwYWJpbGl0eS5kYXJ0hOkvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Lmlzb2xhdGU7CgovKioKICogQW4gdW5mb3JnZWFibGUgb2JqZWN0IHRoYXQgY29tZXMgYmFjayBhcyBlcXVhbCB3aGVuIHBhc3NlZCB0aHJvdWdoIG90aGVyCiAqIGlzb2xhdGVzLgogKgogKiBTZW5kaW5nIGEgY2FwYWJpbGl0eSBvYmplY3QgdG8gYW5vdGhlciBpc29sYXRlLCBhbmQgZ2V0dGluZyBpdCBiYWNrLAogKiB3aWxsIHByb2R1Y2UgYW4gb2JqZWN0IHRoYXQgaXMgZXF1YWwgdG8gdGhlIG9yaWdpbmFsLgogKiBUaGVyZSBpcyBubyBvdGhlciB3YXkgdG8gY3JlYXRlIG9iamVjdHMgZXF1YWwgdG8gYSBjYXBhYmlsaXR5IG9iamVjdC4KICoKICogQ2FwYWJpbGl0aWVzIGNhbiBiZSB1c2VkIGFzIGFjY2VzcyBndWFyZHM6IEEgcmVtb3RlIGlzb2xhdGUgY2FuIHNlbmQKICogYSByZXF1ZXN0IGZvciBhbiBvcGVyYXRpb24sIGJ1dCBpdCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIHJlcXVlc3QgY29udGFpbnMKICogdGhlIGNvcnJlY3QgY2FwYWJpbGl0eSBvYmplY3QuCiAqCiAqIFRoaXMgYWxsb3dzIGV4cG9zaW5nIHRoZSBzYW1lIGludGVyZmFjZSB0byBtdWx0aXBsZSBjbGllbnRzLAogKiBidXQgcmVzdHJpY3Rpbmcgc29tZSBvcGVyYXRpb25zIHRvIG9ubHkgdGhvc2UgY2xpZW50cwogKiB0aGF0IGhhdmUgYWxzbyBiZWVuIGdpdmVuIHRoZSBjb3JyZXNwb25kaW5nIGNhcGFiaWxpdHkuCiAqCiAqIENhcGFiaWxpdGllcyBjYW4gYmUgdXNlZCBpbnNpZGUgYSBzaW5nbGUgaXNvbGF0ZSwKICogYnV0IHRoZXkgaGF2ZSBubyBhZHZhbnRhZ2Ugb3ZlcgogKiBqdXN0IHVzaW5nIGBuZXcgT2JqZWN0YCB0byBjcmVhdGUgYSB1bmlxdWUgb2JqZWN0LAogKiBhbmQgaXQgb2ZmZXJzIG5vIHJlYWwgc2VjdXJpdHkgYWdhaW5zdCBvdGhlciBjb2RlCiAqIHJ1bm5pbmcgaW4gdGhlIHNhbWUgaXNvbGF0ZS4KICovCmNsYXNzIENhcGFiaWxpdHkgewogIC8qKgogICAqIENyZWF0ZSBhIG5ldyB1bmZvcmdlYWJsZSBjYXBhYmlsaXR5IG9iamVjdC4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IENhcGFiaWxpdHkoKTsKfQokAE5OPAEWAQRMDQNIOUkDSE4iA0A5OwM1IzY1IAQTBjEGIQIBHGRhcnQ6aXNvbGF0ZS9jYXBhYmlsaXR5LmRhcnQqb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL21hdGgvbWF0aC5kYXJ0mUgvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIE1hdGhlbWF0aWNhbCBjb25zdGFudHMgYW5kIGZ1bmN0aW9ucywgcGx1cyBhIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgovLy8KLy8vIFRvIHVzZSB0aGlzIGxpYnJhcnkgaW4geW91ciBjb2RlOgovLy8KLy8vICAgICBpbXBvcnQgJ2RhcnQ6bWF0aCc7Ci8vLwovLy8ge0BjYXRlZ29yeSBDb3JlfQpsaWJyYXJ5IGRhcnQubWF0aDsKCnBhcnQgImplbmtpbnNfc21pX2hhc2guZGFydCI7CnBhcnQgInBvaW50LmRhcnQiOwpwYXJ0ICJyYW5kb20uZGFydCI7CnBhcnQgInJlY3RhbmdsZS5kYXJ0IjsKCi8vLyBCYXNlIG9mIHRoZSBuYXR1cmFsIGxvZ2FyaXRobXMuCi8vLwovLy8gVHlwaWNhbGx5IHdyaXR0ZW4gYXMgImUiLgpjb25zdCBkb3VibGUgZSA9IDIuNzE4MjgxODI4NDU5MDQ1OwoKLy8vIE5hdHVyYWwgbG9nYXJpdGhtIG9mIDEwLgovLy8KLy8vIFRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiAxMCBpcyB0aGUgbnVtYmVyIHN1Y2ggdGhhdCBgcG93KEUsIExOMTApID09IDEwYC4KLy8vIFRoaXMgdmFsdWUgaXMgbm90IGV4YWN0LCBidXQgaXQgaXMgdGhlIGNsb3Nlc3QgcmVwcmVzZW50YWJsZSBkb3VibGUgdG8gdGhlCi8vLyBleGFjdCBtYXRoZW1hdGljYWwgdmFsdWUuCmNvbnN0IGRvdWJsZSBsbjEwID0gMi4zMDI1ODUwOTI5OTQwNDY7CgovLy8gTmF0dXJhbCBsb2dhcml0aG0gb2YgMi4KLy8vCi8vLyBUaGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgMiBpcyB0aGUgbnVtYmVyIHN1Y2ggdGhhdCBgcG93KEUsIExOMikgPT0gMmAuCi8vLyBUaGlzIHZhbHVlIGlzIG5vdCBleGFjdCwgYnV0IGl0IGlzIHRoZSBjbG9zZXN0IHJlcHJlc2VudGFibGUgZG91YmxlIHRvIHRoZQovLy8gZXhhY3QgbWF0aGVtYXRpY2FsIHZhbHVlLgpjb25zdCBkb3VibGUgbG4yID0gMC42OTMxNDcxODA1NTk5NDUzOwoKLy8vIEJhc2UtMiBsb2dhcml0aG0gb2YgW2VdLgpjb25zdCBkb3VibGUgbG9nMmUgPSAxLjQ0MjY5NTA0MDg4ODk2MzQ7CgovLy8gQmFzZS0xMCBsb2dhcml0aG0gb2YgW2VdLgpjb25zdCBkb3VibGUgbG9nMTBlID0gMC40MzQyOTQ0ODE5MDMyNTE4OwoKLy8vIFRoZSBQSSBjb25zdGFudC4KY29uc3QgZG91YmxlIHBpID0gMy4xNDE1OTI2NTM1ODk3OTMyOwoKLy8vIFNxdWFyZSByb290IG9mIDEvMi4KY29uc3QgZG91YmxlIHNxcnQxXzIgPSAwLjcwNzEwNjc4MTE4NjU0NzY7CgovLy8gU3F1YXJlIHJvb3Qgb2YgMi4KY29uc3QgZG91YmxlIHNxcnQyID0gMS40MTQyMTM1NjIzNzMwOTUxOwoKLy8vIFJldHVybnMgdGhlIGxlc3NlciBvZiB0d28gbnVtYmVycy4KLy8vCi8vLyBSZXR1cm5zIE5hTiBpZiBlaXRoZXIgYXJndW1lbnQgaXMgTmFOLgovLy8gVGhlIGxlc3NlciBvZiBgLTAuMGAgYW5kIGAwLjBgIGlzIGAtMC4wYC4KLy8vIElmIHRoZSBhcmd1bWVudHMgYXJlIG90aGVyd2lzZSBlcXVhbCAoaW5jbHVkaW5nIGludCBhbmQgZG91YmxlcyB3aXRoIHRoZQovLy8gc2FtZSBtYXRoZW1hdGljYWwgdmFsdWUpIHRoZW4gaXQgaXMgdW5zcGVjaWZpZWQgd2hpY2ggb2YgdGhlIHR3byBhcmd1bWVudHMKLy8vIGlzIHJldHVybmVkLgpleHRlcm5hbCBUIG1pbjxUIGV4dGVuZHMgbnVtPihUIGEsIFQgYik7CgovLy8gUmV0dXJucyB0aGUgbGFyZ2VyIG9mIHR3byBudW1iZXJzLgovLy8KLy8vIFJldHVybnMgTmFOIGlmIGVpdGhlciBhcmd1bWVudCBpcyBOYU4uCi8vLyBUaGUgbGFyZ2VyIG9mIGAtMC4wYCBhbmQgYDAuMGAgaXMgYDAuMGAuIElmIHRoZSBhcmd1bWVudHMgYXJlCi8vLyBvdGhlcndpc2UgZXF1YWwgKGluY2x1ZGluZyBpbnQgYW5kIGRvdWJsZXMgd2l0aCB0aGUgc2FtZSBtYXRoZW1hdGljYWwgdmFsdWUpCi8vLyB0aGVuIGl0IGlzIHVuc3BlY2lmaWVkIHdoaWNoIG9mIHRoZSB0d28gYXJndW1lbnRzIGlzIHJldHVybmVkLgpleHRlcm5hbCBUIG1heDxUIGV4dGVuZHMgbnVtPihUIGEsIFQgYik7CgovLy8gQSB2YXJpYW50IG9mIFthdGFuXS4KLy8vCi8vLyBDb252ZXJ0cyBib3RoIGFyZ3VtZW50cyB0byBbZG91YmxlXXMuCi8vLwovLy8gUmV0dXJucyB0aGUgYW5nbGUgaW4gcmFkaWFucyBiZXR3ZWVuIHRoZSBwb3NpdGl2ZSB4LWF4aXMKLy8vIGFuZCB0aGUgdmVjdG9yIChbYl0sW2FdKS4KLy8vIFRoZSByZXN1bHQgaXMgaW4gdGhlIHJhbmdlIC1QSS4uUEkuCi8vLwovLy8gSWYgW2JdIGlzIHBvc2l0aXZlLCB0aGlzIGlzIHRoZSBzYW1lIGFzIGBhdGFuKGIvYSlgLgovLy8KLy8vIFRoZSByZXN1bHQgaXMgbmVnYXRpdmUgd2hlbiBbYV0gaXMgbmVnYXRpdmUgKGluY2x1ZGluZyB3aGVuIFthXSBpcyB0aGUKLy8vIGRvdWJsZSAtMC4wKS4KLy8vCi8vLyBJZiBbYV0gaXMgZXF1YWwgdG8gemVybywgdGhlIHZlY3RvciAoW2JdLFthXSkgaXMgY29uc2lkZXJlZCBwYXJhbGxlbCB0bwovLy8gdGhlIHgtYXhpcywgZXZlbiBpZiBbYl0gaXMgYWxzbyBlcXVhbCB0byB6ZXJvLiBUaGUgc2lnbiBvZiBbYl0gZGV0ZXJtaW5lcwovLy8gdGhlIGRpcmVjdGlvbiBvZiB0aGUgdmVjdG9yIGFsb25nIHRoZSB4LWF4aXMuCi8vLwovLy8gUmV0dXJucyBOYU4gaWYgZWl0aGVyIGFyZ3VtZW50IGlzIE5hTi4KZXh0ZXJuYWwgZG91YmxlIGF0YW4yKG51bSBhLCBudW0gYik7CgovLy8gUmV0dXJucyBbeF0gdG8gdGhlIHBvd2VyIG9mIFtleHBvbmVudF0uCi8vLwovLy8gSWYgW3hdIGlzIGFuIFtpbnRdIGFuZCBbZXhwb25lbnRdIGlzIGEgbm9uLW5lZ2F0aXZlIFtpbnRdLCB0aGUgcmVzdWx0IGlzCi8vLyBhbiBbaW50XSwgb3RoZXJ3aXNlIGJvdGggYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gZG91YmxlcyBmaXJzdCwgYW5kIHRoZQovLy8gcmVzdWx0IGlzIGEgW2RvdWJsZV0uCi8vLwovLy8gRm9yIGludGVnZXJzLCB0aGUgcG93ZXIgaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBtYXRoZW1hdGljYWwgcmVzdWx0IG9mIGB4YCB0bwovLy8gdGhlIHBvd2VyIGBleHBvbmVudGAsIG9ubHkgbGltaXRlZCBieSB0aGUgYXZhaWxhYmxlIG1lbW9yeS4KLy8vCi8vLyBGb3IgZG91YmxlcywgYHBvdyh4LCB5KWAgaGFuZGxlcyBlZGdlIGNhc2VzIGFzIGZvbGxvd3M6Ci8vLwovLy8gLSBpZiBgeWAgaXMgemVybyAoMC4wIG9yIC0wLjApLCB0aGUgcmVzdWx0IGlzIGFsd2F5cyAxLjAuCi8vLyAtIGlmIGB4YCBpcyAxLjAsIHRoZSByZXN1bHQgaXMgYWx3YXlzIDEuMC4KLy8vIC0gb3RoZXJ3aXNlLCBpZiBlaXRoZXIgYHhgIG9yIGB5YCBpcyBOYU4gdGhlbiB0aGUgcmVzdWx0IGlzIE5hTi4KLy8vIC0gaWYgYHhgIGlzIG5lZ2F0aXZlIChidXQgbm90IC0wLjApIGFuZCBgeWAgaXMgYSBmaW5pdGUgbm9uLWludGVnZXIsIHRoZQovLy8gICByZXN1bHQgaXMgTmFOLgovLy8gLSBpZiBgeGAgaXMgSW5maW5pdHkgYW5kIGB5YCBpcyBuZWdhdGl2ZSwgdGhlIHJlc3VsdCBpcyAwLjAuCi8vLyAtIGlmIGB4YCBpcyBJbmZpbml0eSBhbmQgYHlgIGlzIHBvc2l0aXZlLCB0aGUgcmVzdWx0IGlzIEluZmluaXR5LgovLy8gLSBpZiBgeGAgaXMgMC4wIGFuZCBgeWAgaXMgbmVnYXRpdmUsIHRoZSByZXN1bHQgaXMgSW5maW5pdHkuCi8vLyAtIGlmIGB4YCBpcyAwLjAgYW5kIGB5YCBpcyBwb3NpdGl2ZSwgdGhlIHJlc3VsdCBpcyAwLjAuCi8vLyAtIGlmIGB4YCBpcyAtSW5maW5pdHkgb3IgLTAuMCBhbmQgYHlgIGlzIGFuIG9kZCBpbnRlZ2VyLCB0aGVuIHRoZSByZXN1bHQgaXMKLy8vICAgYC1wb3coLXggLHkpYC4KLy8vIC0gaWYgYHhgIGlzIC1JbmZpbml0eSBvciAtMC4wIGFuZCBgeWAgaXMgbm90IGFuIG9kZCBpbnRlZ2VyLCB0aGVuIHRoZSByZXN1bHQKLy8vICAgaXMgdGhlIHNhbWUgYXMgYHBvdygteCAsIHkpYC4KLy8vIC0gaWYgYHlgIGlzIEluZmluaXR5IGFuZCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYHhgIGlzIGxlc3MgdGhhbiAxLCB0aGUKLy8vICAgcmVzdWx0IGlzIDAuMC4KLy8vIC0gaWYgYHlgIGlzIEluZmluaXR5IGFuZCBgeGAgaXMgLTEsIHRoZSByZXN1bHQgaXMgMS4wLgovLy8gLSBpZiBgeWAgaXMgSW5maW5pdHkgYW5kIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBgeGAgaXMgZ3JlYXRlciB0aGFuIDEsCi8vLyAgIHRoZSByZXN1bHQgaXMgSW5maW5pdHkuCi8vLyAtIGlmIGB5YCBpcyAtSW5maW5pdHksIHRoZSByZXN1bHQgaXMgYDEvcG93KHgsIEluZmluaXR5KWAuCi8vLwovLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYHBvd2AgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGUgSUVFRSBTdGFuZGFyZAovLy8gNzU0LTIwMDguCi8vLwovLy8gTm90aWNlIHRoYXQgdGhlIHJlc3VsdCBtYXkgb3ZlcmZsb3cuIElmIGludGVnZXJzIGFyZSByZXByZXNlbnRlZCBhcyA2NC1iaXQKLy8vIG51bWJlcnMsIGFuIGludGVnZXIgcmVzdWx0IG1heSBiZSB0cnVuY2F0ZWQsIGFuZCBhIGRvdWJsZSByZXN1bHQgbWF5Ci8vLyBvdmVyZmxvdyB0byBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBbZG91YmxlLmluZmluaXR5XS4KZXh0ZXJuYWwgbnVtIHBvdyhudW0geCwgbnVtIGV4cG9uZW50KTsKCi8vLyBDb252ZXJ0cyBbcmFkaWFuc10gdG8gYSBbZG91YmxlXSBhbmQgcmV0dXJucyB0aGUgc2luZSBvZiB0aGUgdmFsdWUuCi8vLwovLy8gSWYgW3JhZGlhbnNdIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIsIHRoZSByZXN1bHQgaXMgTmFOLgpleHRlcm5hbCBkb3VibGUgc2luKG51bSByYWRpYW5zKTsKCi8vLyBDb252ZXJ0cyBbcmFkaWFuc10gdG8gYSBbZG91YmxlXSBhbmQgcmV0dXJucyB0aGUgY29zaW5lIG9mIHRoZSB2YWx1ZS4KLy8vCi8vLyBJZiBbcmFkaWFuc10gaXMgbm90IGEgZmluaXRlIG51bWJlciwgdGhlIHJlc3VsdCBpcyBOYU4uCmV4dGVybmFsIGRvdWJsZSBjb3MobnVtIHJhZGlhbnMpOwoKLy8vIENvbnZlcnRzIFtyYWRpYW5zXSB0byBhIFtkb3VibGVdIGFuZCByZXR1cm5zIHRoZSB0YW5nZW50IG9mIHRoZSB2YWx1ZS4KLy8vCi8vLyBUaGUgdGFuZ2VudCBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGBzaW4ocmFkaWFucykvY29zKHJhZGlhbnMpYCBhbmQgbWF5IGJlCi8vLyBpbmZpbml0ZSAocG9zaXRpdmUgb3IgbmVnYXRpdmUpIHdoZW4gYGNvcyhyYWRpYW5zKWAgaXMgZXF1YWwgdG8gemVyby4KLy8vIElmIFtyYWRpYW5zXSBpcyBub3QgYSBmaW5pdGUgbnVtYmVyLCB0aGUgcmVzdWx0IGlzIE5hTi4KZXh0ZXJuYWwgZG91YmxlIHRhbihudW0gcmFkaWFucyk7CgovLy8gQ29udmVydHMgW3hdIHRvIGEgW2RvdWJsZV0gYW5kIHJldHVybnMgaXRzIGFyYyBjb3NpbmUgaW4gcmFkaWFucy4KLy8vCi8vLyBSZXR1cm5zIGEgdmFsdWUgaW4gdGhlIHJhbmdlIDAuLlBJLCBvciBOYU4gaWYgW3hdIGlzIG91dHNpZGUKLy8vIHRoZSByYW5nZSAtMS4uMS4KZXh0ZXJuYWwgZG91YmxlIGFjb3MobnVtIHgpOwoKLy8vIENvbnZlcnRzIFt4XSB0byBhIFtkb3VibGVdIGFuZCByZXR1cm5zIGl0cyBhcmMgc2luZSBpbiByYWRpYW5zLgovLy8KLy8vIFJldHVybnMgYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgLVBJLzIuLlBJLzIsIG9yIE5hTiBpZiBbeF0gaXMgb3V0c2lkZQovLy8gdGhlIHJhbmdlIC0xLi4xLgpleHRlcm5hbCBkb3VibGUgYXNpbihudW0geCk7CgovLy8gQ29udmVydHMgW3hdIHRvIGEgW2RvdWJsZV0gYW5kIHJldHVybnMgaXRzIGFyYyB0YW5nZW50IGluIHJhZGlhbnMuCi8vLwovLy8gUmV0dXJucyBhIHZhbHVlIGluIHRoZSByYW5nZSAtUEkvMi4uUEkvMiwgb3IgTmFOIGlmIFt4XSBpcyBOYU4uCmV4dGVybmFsIGRvdWJsZSBhdGFuKG51bSB4KTsKCi8vLyBDb252ZXJ0cyBbeF0gdG8gYSBbZG91YmxlXSBhbmQgcmV0dXJucyB0aGUgcG9zaXRpdmUgc3F1YXJlIHJvb3Qgb2YgdGhlCi8vLyB2YWx1ZS4KLy8vCi8vLyBSZXR1cm5zIC0wLjAgaWYgW3hdIGlzIC0wLjAsIGFuZCBOYU4gaWYgW3hdIGlzIG90aGVyd2lzZSBuZWdhdGl2ZSBvciBOYU4uCmV4dGVybmFsIGRvdWJsZSBzcXJ0KG51bSB4KTsKCi8vLyBDb252ZXJ0cyBbeF0gdG8gYSBbZG91YmxlXSBhbmQgcmV0dXJucyB0aGUgbmF0dXJhbCBleHBvbmVudCwgW2VdLAovLy8gdG8gdGhlIHBvd2VyIFt4XS4KLy8vCi8vLyBSZXR1cm5zIE5hTiBpZiBbeF0gaXMgTmFOLgpleHRlcm5hbCBkb3VibGUgZXhwKG51bSB4KTsKCi8vLyBDb252ZXJ0cyBbeF0gdG8gYSBbZG91YmxlXSBhbmQgcmV0dXJucyB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIHZhbHVlLgovLy8KLy8vIFJldHVybnMgbmVnYXRpdmUgaW5maW5pdHkgaWYgW3hdIGlzIGVxdWFsIHRvIHplcm8uCi8vLyBSZXR1cm5zIE5hTiBpZiBbeF0gaXMgTmFOIG9yIGxlc3MgdGhhbiB6ZXJvLgpleHRlcm5hbCBkb3VibGUgbG9nKG51bSB4KTsKgLUATk48AUoEJgQcBBUTAR4TFBcBJAQeJAEdBE5PHicBHARLTx4nAR0pAR4qARUmARgrARYpAScEKy5NTxEpAScEK0JRQykBGQQqBD0eKAQ5BEsSBExOMgQrJQEsBE1PGgRRQAQ8BD4vRU0VQUZBPFAVUSRLFTtKHj8ESA4ET0k4JwFIBDwiAUoEPCIBSwRRSjwiAUYEQRUdAUQERxUdAUcERB0BSwsETh0BRhYEHxwBTwQ3MRwBCWRhcnQ6bWF0aC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL21hdGhfcGF0Y2guZGFydKU0Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBOb3RlOiB0aGUgVk0gY29uY2F0ZW5hdGVzIGFsbCBwYXRjaCBmaWxlcyBpbnRvIGEgc2luZ2xlIHBhdGNoIGZpbGUuIFRoaXMKLy8vIGZpbGUgaXMgdGhlIGZpcnN0IHBhdGNoIGluICJkYXJ0Om1hdGgiIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW1wb3J0cyB1c2VkCi8vLyBieSBwYXRjaGVzIG9mIHRoYXQgbGlicmFyeS4gV2UgcGxhbiB0byBjaGFuZ2UgdGhpcyB3aGVuIHdlIGhhdmUgYSBzaGFyZWQKLy8vIGZyb250IGVuZCBhbmQgc2ltcGx5IHVzZSBwYXJ0cy4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgcGF0Y2g7CgppbXBvcnQgImRhcnQ6dHlwZWRfZGF0YSIgc2hvdyBVaW50MzJMaXN0OwoKLy8vIFRoZXJlIGFyZSBubyBwYXJ0cyBvZiB0aGlzIHBhdGNoIGxpYnJhcnkuCgpAcGF0Y2gKQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpClQgbWluPFQgZXh0ZW5kcyBudW0+KFQgYSwgVCBiKSB7CiAgLy8gVGhlc2UgcGFydGlhbGx5IHJlZHVuZGFudCB0eXBlIGNoZWNrcyBpbXByb3ZlIGNvZGUgcXVhbGl0eSBmb3IgZGFydDJqcy4KICAvLyBNb3N0IG9mIHRoZSBpbXByb3ZlbWVudCBpcyBhdCBjYWxsIHNpdGVzIGZyb20gdGhlIGluZmVycmVkIG5vbi1udWxsIG51bQogIC8vIHJldHVybiB0eXBlLgogIGlmIChhIGlzISBudW0pIHRocm93IG5ldyBBcmd1bWVudEVycm9yKGEpOwogIGlmIChiIGlzISBudW0pIHRocm93IG5ldyBBcmd1bWVudEVycm9yKGIpOwoKICBpZiAoYSA+IGIpIHJldHVybiBiOwogIGlmIChhIDwgYikgcmV0dXJuIGE7CiAgaWYgKGIgaXMgZG91YmxlKSB7CiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIE5hTiBhbmQgLTAuMC4gSWYgb25lIGFyZ3VtZW50IGlzIE5hTiByZXR1cm4gTmFOLgogICAgLy8gW21pbl0gbXVzdCBhbHNvIGRpc3Rpbmd1aXNoIGJldHdlZW4gLTAuMCBhbmQgMC4wLgogICAgaWYgKGEgaXMgZG91YmxlKSB7CiAgICAgIGlmIChhID09IDAuMCkgewogICAgICAgIC8vIGEgaXMgZWl0aGVyIDAuMCBvciAtMC4wLiBiIGlzIGVpdGhlciAwLjAsIC0wLjAgb3IgTmFOLgogICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgcmV0dXJucyAtMC4wIGlmIGVpdGhlciBhIG9yIGIgaXMgLTAuMCwgYW5kIGl0CiAgICAgICAgLy8gcmV0dXJucyBOYU4gaWYgYiBpcyBOYU4uCiAgICAgICAgbnVtIG4gPSAoYSArIGIpICogYSAqIGI7CiAgICAgICAgcmV0dXJuIG47CiAgICAgIH0KICAgIH0KICAgIC8vIENoZWNrIGZvciBOYU4gYW5kIGIgPT0gLTAuMC4KICAgIGlmIChhID09IDAgJiYgYi5pc05lZ2F0aXZlIHx8IGIuaXNOYU4pIHJldHVybiBiOwogICAgcmV0dXJuIGE7CiAgfQogIHJldHVybiBhOwp9CgpAcGF0Y2gKQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpClQgbWF4PFQgZXh0ZW5kcyBudW0+KFQgYSwgVCBiKSB7CiAgLy8gVGhlc2UgcGFydGlhbGx5IHJlZHVuZGFudCB0eXBlIGNoZWNrcyBpbXByb3ZlIGNvZGUgcXVhbGl0eSBmb3IgZGFydDJqcy4KICAvLyBNb3N0IG9mIHRoZSBpbXByb3ZlbWVudCBpcyBhdCBjYWxsIHNpdGVzIGZyb20gdGhlIGluZmVycmVkIG5vbi1udWxsIG51bQogIC8vIHJldHVybiB0eXBlLgogIGlmIChhIGlzISBudW0pIHRocm93IG5ldyBBcmd1bWVudEVycm9yKGEpOwogIGlmIChiIGlzISBudW0pIHRocm93IG5ldyBBcmd1bWVudEVycm9yKGIpOwoKICBpZiAoYSA+IGIpIHJldHVybiBhOwogIGlmIChhIDwgYikgcmV0dXJuIGI7CiAgaWYgKGIgaXMgZG91YmxlKSB7CiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIE5hTiBhbmQgLTAuMC4gSWYgb25lIGFyZ3VtZW50IGlzIE5hTiByZXR1cm4gTmFOLgogICAgLy8gW21heF0gbXVzdCBhbHNvIGRpc3Rpbmd1aXNoIGJldHdlZW4gLTAuMCBhbmQgMC4wLgogICAgaWYgKGEgaXMgZG91YmxlKSB7CiAgICAgIGlmIChhID09IDAuMCkgewogICAgICAgIC8vIGEgaXMgZWl0aGVyIDAuMCBvciAtMC4wLiBiIGlzIGVpdGhlciAwLjAsIC0wLjAsIG9yIE5hTi4KICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHJldHVybnMgMC4wIGlmIGVpdGhlciBhIG9yIGIgaXMgMC4wLCBhbmQgaXQKICAgICAgICAvLyByZXR1cm5zIE5hTiBpZiBiIGlzIE5hTi4KICAgICAgICBudW0gbiA9IGEgKyBiOwogICAgICAgIHJldHVybiBuOwogICAgICB9CiAgICB9CiAgICAvLyBDaGVjayBmb3IgTmFOLgogICAgaWYgKGIuaXNOYU4pIHJldHVybiBiOwogICAgcmV0dXJuIGE7CiAgfQogIC8vIG1heCgtMC4wLCAwKSBtdXN0IHJldHVybiAwLgogIGlmIChiID09IDAgJiYgYS5pc05lZ2F0aXZlKSByZXR1cm4gYjsKICByZXR1cm4gYTsKfQoKLy8gSWYgW3hdIGlzIGFuIFtpbnRdIGFuZCBbZXhwb25lbnRdIGlzIGEgbm9uLW5lZ2F0aXZlIFtpbnRdLCB0aGUgcmVzdWx0IGlzCi8vIGFuIFtpbnRdLCBvdGhlcndpc2UgdGhlIHJlc3VsdCBpcyBhIFtkb3VibGVdLgpAcGF0Y2gKQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCm51bSBwb3cobnVtIHgsIG51bSBleHBvbmVudCkgewogIGlmICgoeCBpcyBpbnQpICYmIChleHBvbmVudCBpcyBpbnQpICYmIChleHBvbmVudCA+PSAwKSkgewogICAgcmV0dXJuIF9pbnRQb3coeCwgZXhwb25lbnQpOwogIH0KICByZXR1cm4gX2RvdWJsZVBvdyh4LnRvRG91YmxlKCksIGV4cG9uZW50LnRvRG91YmxlKCkpOwp9CgpAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCmRvdWJsZSBfZG91YmxlUG93KGRvdWJsZSBiYXNlLCBkb3VibGUgZXhwb25lbnQpIHsKICBpZiAoZXhwb25lbnQgPT0gMC4wKSB7CiAgICByZXR1cm4gMS4wOyAvLyBFQ01BLTI2MiAxNS44LjIuMTMKICB9CiAgLy8gU3BlZWQgdXAgc2ltcGxlIGNhc2VzLgogIGlmIChleHBvbmVudCA9PSAxLjApIHJldHVybiBiYXNlOwogIGlmIChleHBvbmVudCA9PSAyLjApIHJldHVybiBiYXNlICogYmFzZTsKICBpZiAoZXhwb25lbnQgPT0gMy4wKSByZXR1cm4gYmFzZSAqIGJhc2UgKiBiYXNlOwoKICBpZiAoYmFzZSA9PSAxLjApIHJldHVybiAxLjA7CgogIGlmIChiYXNlLmlzTmFOIHx8IGV4cG9uZW50LmlzTmFOKSB7CiAgICByZXR1cm4gZG91YmxlLm5hbjsKICB9CiAgaWYgKChiYXNlICE9IC1kb3VibGUuaW5maW5pdHkpICYmIChleHBvbmVudCA9PSAwLjUpKSB7CiAgICBpZiAoYmFzZSA9PSAwLjApIHsKICAgICAgcmV0dXJuIDAuMDsKICAgIH0KICAgIHJldHVybiBzcXJ0KGJhc2UpOwogIH0KICByZXR1cm4gX3BvdyhiYXNlLnRvRG91YmxlKCksIGV4cG9uZW50LnRvRG91YmxlKCkpOwp9Cgpkb3VibGUgX3Bvdyhkb3VibGUgYmFzZSwgZG91YmxlIGV4cG9uZW50KSBuYXRpdmUgIk1hdGhfZG91YmxlUG93IjsKCmludCBfaW50UG93KGludCBiYXNlLCBpbnQgZXhwb25lbnQpIHsKICAvLyBFeHBvbmVudGlhdGlvbiBieSBzcXVhcmluZy4KICBpbnQgcmVzdWx0ID0gMTsKICB3aGlsZSAoZXhwb25lbnQgIT0gMCkgewogICAgaWYgKChleHBvbmVudCAmIDEpID09IDEpIHsKICAgICAgcmVzdWx0ICo9IGJhc2U7CiAgICB9CiAgICBleHBvbmVudCA+Pj0gMTsKICAgIC8vIFNraXAgdW5uZWNlc3Nhcnkgb3BlcmF0aW9uIChjYW4gb3ZlcmZsb3cgdG8gTWludCkuCiAgICBpZiAoZXhwb25lbnQgIT0gMCkgewogICAgICBiYXNlICo9IGJhc2U7CiAgICB9CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KCkBwYXRjaApAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCkBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCmRvdWJsZSBhdGFuMihudW0gYSwgbnVtIGIpID0+IF9hdGFuMihhLnRvRG91YmxlKCksIGIudG9Eb3VibGUoKSk7CkBwYXRjaApAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCkBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCmRvdWJsZSBzaW4obnVtIHJhZGlhbnMpID0+IF9zaW4ocmFkaWFucy50b0RvdWJsZSgpKTsKQHBhdGNoCkBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKQHByYWdtYSgidm06bmV2ZXItaW5saW5lIikKZG91YmxlIGNvcyhudW0gcmFkaWFucykgPT4gX2NvcyhyYWRpYW5zLnRvRG91YmxlKCkpOwpAcGF0Y2gKQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQpAcHJhZ21hKCJ2bTpuZXZlci1pbmxpbmUiKQpkb3VibGUgdGFuKG51bSByYWRpYW5zKSA9PiBfdGFuKHJhZGlhbnMudG9Eb3VibGUoKSk7CkBwYXRjaApAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCkBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCmRvdWJsZSBhY29zKG51bSB4KSA9PiBfYWNvcyh4LnRvRG91YmxlKCkpOwpAcGF0Y2gKQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQpAcHJhZ21hKCJ2bTpuZXZlci1pbmxpbmUiKQpkb3VibGUgYXNpbihudW0geCkgPT4gX2FzaW4oeC50b0RvdWJsZSgpKTsKQHBhdGNoCkBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKQHByYWdtYSgidm06bmV2ZXItaW5saW5lIikKZG91YmxlIGF0YW4obnVtIHgpID0+IF9hdGFuKHgudG9Eb3VibGUoKSk7CkBwYXRjaApAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCkBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCmRvdWJsZSBzcXJ0KG51bSB4KSA9PiBfc3FydCh4LnRvRG91YmxlKCkpOwpAcGF0Y2gKQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCmRvdWJsZSBleHAobnVtIHgpID0+IF9leHAoeC50b0RvdWJsZSgpKTsKQHBhdGNoCkBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQpkb3VibGUgbG9nKG51bSB4KSA9PiBfbG9nKHgudG9Eb3VibGUoKSk7Cgpkb3VibGUgX2F0YW4yKGRvdWJsZSBhLCBkb3VibGUgYikgbmF0aXZlICJNYXRoX2F0YW4yIjsKZG91YmxlIF9zaW4oZG91YmxlIHgpIG5hdGl2ZSAiTWF0aF9zaW4iOwpkb3VibGUgX2Nvcyhkb3VibGUgeCkgbmF0aXZlICJNYXRoX2NvcyI7CmRvdWJsZSBfdGFuKGRvdWJsZSB4KSBuYXRpdmUgIk1hdGhfdGFuIjsKZG91YmxlIF9hY29zKGRvdWJsZSB4KSBuYXRpdmUgIk1hdGhfYWNvcyI7CmRvdWJsZSBfYXNpbihkb3VibGUgeCkgbmF0aXZlICJNYXRoX2FzaW4iOwpkb3VibGUgX2F0YW4oZG91YmxlIHgpIG5hdGl2ZSAiTWF0aF9hdGFuIjsKZG91YmxlIF9zcXJ0KGRvdWJsZSB4KSBuYXRpdmUgIk1hdGhfc3FydCI7CmRvdWJsZSBfZXhwKGRvdWJsZSB4KSBuYXRpdmUgIk1hdGhfZXhwIjsKZG91YmxlIF9sb2coZG91YmxlIHgpIG5hdGl2ZSAiTWF0aF9sb2ciOwoKLy8gVE9ETyhpcG9zdmEpOiBIYW5kbGUgcGF0Y2ggbWV0aG9kcyB3aXRoaW4gYSBwYXRjaCBjbGFzcyBjb3JyZWN0bHkuCkBwYXRjaApjbGFzcyBSYW5kb20gewogIEBwYXRjaAogIGZhY3RvcnkgUmFuZG9tKFtpbnQgc2VlZF0pIHsKICAgIHZhciBzdGF0ZSA9IF9SYW5kb20uX3NldHVwU2VlZCgoc2VlZCA9PSBudWxsKSA/IF9SYW5kb20uX25leHRTZWVkKCkgOiBzZWVkKTsKICAgIC8vIENyYW5rIGEgY291cGxlIG9mIHRpbWVzIHRvIGRpc3RyaWJ1dGUgdGhlIHNlZWQgYml0cyBhIGJpdCBmdXJ0aGVyLgogICAgcmV0dXJuIG5ldyBfUmFuZG9tLl93aXRoU3RhdGUoc3RhdGUpCiAgICAgIC4uX25leHRTdGF0ZSgpCiAgICAgIC4uX25leHRTdGF0ZSgpCiAgICAgIC4uX25leHRTdGF0ZSgpCiAgICAgIC4uX25leHRTdGF0ZSgpOwogIH0KCiAgQHBhdGNoCiAgZmFjdG9yeSBSYW5kb20uc2VjdXJlKCkgewogICAgcmV0dXJuIG5ldyBfU2VjdXJlUmFuZG9tKCk7CiAgfQp9CgpjbGFzcyBfUmFuZG9tIGltcGxlbWVudHMgUmFuZG9tIHsKICAvLyBJbnRlcm5hbCBzdGF0ZSBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGZpbmFsIFVpbnQzMkxpc3QgX3N0YXRlOwogIHN0YXRpYyBjb25zdCBfa1NUQVRFX0xPID0gMDsKICBzdGF0aWMgY29uc3QgX2tTVEFURV9ISSA9IDE7IC8vIFVudXNlZCBpbiBEYXJ0IGNvZGUuCgogIF9SYW5kb20uX3dpdGhTdGF0ZSh0aGlzLl9zdGF0ZSk7CgogIC8vIFRoZSBhbGdvcml0aG0gdXNlZCBoZXJlIGlzIE11bHRpcGx5IHdpdGggQ2FycnkgKE1XQykgd2l0aCBhIEJhc2UgYiA9IDJeMzIuCiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NdWx0aXBseS13aXRoLWNhcnJ5CiAgLy8gVGhlIGNvbnN0YW50IEEgaXMgc2VsZWN0ZWQgZnJvbSAiTnVtZXJpY2FsIFJlY2lwZXMgM3JkIEVkaXRpb24iIHAuMzQ4IEIxLgoKICAvLyBJbXBsZW1lbnRzOgogIC8vICAgY29uc3QgX0EgPSAweGZmZmZkYTYxOwogIC8vICAgdmFyIHN0YXRlID0KICAvLyAgICAgICAoKF9BICogKF9zdGF0ZVtfa1NUQVRFX0xPXSkpICsgX3N0YXRlW19rU1RBVEVfSEldKSAmICgoMSA8PCA2NCkgLSAxKTsKICAvLyAgIF9zdGF0ZVtfa1NUQVRFX0xPXSA9IHN0YXRlICYgKCgxIDw8IDMyKSAtIDEpOwogIC8vICAgX3N0YXRlW19rU1RBVEVfSEldID0gc3RhdGUgPj4gMzI7CiAgLy8gVGhpcyBpcyBhIG5hdGl2ZSB0byBwcmV2ZW50IDY0LWJpdCBvcGVyYXRpb25zIGluIERhcnQsIHdoaWNoCiAgLy8gZmFpbCB3aXRoIC0tdGhyb3dfb25famF2YXNjcmlwdF9pbnRfb3ZlcmZsb3cuCiAgLy8gVE9ETyhyZWdpcyk6IEltcGxlbWVudCBpbiBEYXJ0IGFuZCByZW1vdmUgUmFuZG9tX25leHRTdGF0ZSBpbiBtYXRoLmNjLgogIHZvaWQgX25leHRTdGF0ZSgpIG5hdGl2ZSAiUmFuZG9tX25leHRTdGF0ZSI7CgogIGludCBuZXh0SW50KGludCBtYXgpIHsKICAgIGNvbnN0IGxpbWl0ID0gMHgzRkZGRkZGRjsKICAgIGlmICgobWF4IDw9IDApIHx8ICgobWF4ID4gbGltaXQpICYmIChtYXggPiBfUE9XMl8zMikpKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKAogICAgICAgICAgbWF4LCAxLCBfUE9XMl8zMiwgIm1heCIsICJNdXN0IGJlIHBvc2l0aXZlIGFuZCA8PSAyXjMyIik7CiAgICB9CiAgICBpZiAoKG1heCAmIC1tYXgpID09IG1heCkgewogICAgICAvLyBGYXN0IGNhc2UgZm9yIHBvd2VycyBvZiB0d28uCiAgICAgIF9uZXh0U3RhdGUoKTsKICAgICAgcmV0dXJuIF9zdGF0ZVtfa1NUQVRFX0xPXSAmIChtYXggLSAxKTsKICAgIH0KCiAgICB2YXIgcm5kMzI7CiAgICB2YXIgcmVzdWx0OwogICAgZG8gewogICAgICBfbmV4dFN0YXRlKCk7CiAgICAgIHJuZDMyID0gX3N0YXRlW19rU1RBVEVfTE9dOwogICAgICByZXN1bHQgPSBybmQzMiAlIG1heDsKICAgIH0gd2hpbGUgKChybmQzMiAtIHJlc3VsdCArIG1heCkgPiBfUE9XMl8zMik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZG91YmxlIG5leHREb3VibGUoKSB7CiAgICByZXR1cm4gKChuZXh0SW50KDEgPDwgMjYpICogX1BPVzJfMjdfRCkgKyBuZXh0SW50KDEgPDwgMjcpKSAvIF9QT1cyXzUzX0Q7CiAgfQoKICBib29sIG5leHRCb29sKCkgewogICAgcmV0dXJuIG5leHRJbnQoMikgPT0gMDsKICB9CgogIC8vIENvbnN0YW50cyB1c2VkIGJ5IHRoZSBhbGdvcml0aG0uCiAgc3RhdGljIGNvbnN0IF9QT1cyXzMyID0gMSA8PCAzMjsKICBzdGF0aWMgY29uc3QgX1BPVzJfNTNfRCA9IDEuMCAqICgxIDw8IDUzKTsKICBzdGF0aWMgY29uc3QgX1BPVzJfMjdfRCA9IDEuMCAqICgxIDw8IDI3KTsKCiAgLy8gVXNlIGEgc2luZ2xldG9uIFJhbmRvbSBvYmplY3QgdG8gZ2V0IGEgbmV3IHNlZWQgaWYgbm8gc2VlZCB3YXMgcGFzc2VkLgogIHN0YXRpYyBmaW5hbCBfcHJuZyA9IG5ldyBfUmFuZG9tLl93aXRoU3RhdGUoX2luaXRpYWxTZWVkKCkpOwoKICAvLyBUaGlzIGlzIGEgbmF0aXZlIHRvIHByZXZlbnQgNjQtYml0IG9wZXJhdGlvbnMgaW4gRGFydCwgd2hpY2gKICAvLyBmYWlsIHdpdGggLS10aHJvd19vbl9qYXZhc2NyaXB0X2ludF9vdmVyZmxvdy4KICAvLyBUT0RPKHJlZ2lzKTogSW1wbGVtZW50IGhlcmUgaW4gRGFydCBhbmQgcmVtb3ZlIG5hdGl2ZSBpbiBtYXRoLmNjLgogIHN0YXRpYyBVaW50MzJMaXN0IF9zZXR1cFNlZWQoaW50IHNlZWQpIG5hdGl2ZSAiUmFuZG9tX3NldHVwU2VlZCI7CiAgLy8gR2V0IGEgc2VlZCBmcm9tIHRoZSBWTSdzIHJhbmRvbSBudW1iZXIgcHJvdmlkZXIuCiAgc3RhdGljIFVpbnQzMkxpc3QgX2luaXRpYWxTZWVkKCkgbmF0aXZlICJSYW5kb21faW5pdGlhbFNlZWQiOwoKICBzdGF0aWMgaW50IF9uZXh0U2VlZCgpIHsKICAgIC8vIFRyaWdnZXIgdGhlIFBSTkcgb25jZSB0byBjaGFuZ2UgdGhlIGludGVybmFsIHN0YXRlLgogICAgX3BybmcuX25leHRTdGF0ZSgpOwogICAgcmV0dXJuIF9wcm5nLl9zdGF0ZVtfa1NUQVRFX0xPXTsKICB9Cn0KCmNsYXNzIF9TZWN1cmVSYW5kb20gaW1wbGVtZW50cyBSYW5kb20gewogIF9TZWN1cmVSYW5kb20oKSB7CiAgICAvLyBUaHJvdyBlYXJseSBpbiBjb25zdHJ1Y3RvciBpZiBlbnRyb3B5IHNvdXJjZSBpcyBub3QgaG9va2VkIHVwLgogICAgX2dldEJ5dGVzKDEpOwogIH0KCiAgLy8gUmV0dXJuIGNvdW50IGJ5dGVzIG9mIGVudHJvcHkgYXMgYSBwb3NpdGl2ZSBpbnRlZ2VyOyBjb3VudCA8PSA4LgogIHN0YXRpYyBpbnQgX2dldEJ5dGVzKGludCBjb3VudCkgbmF0aXZlICJTZWN1cmVSYW5kb21fZ2V0Qnl0ZXMiOwoKICBpbnQgbmV4dEludChpbnQgbWF4KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsdWVJbkludGVydmFsKAogICAgICAgIG1heCwgMSwgX1BPVzJfMzIsICJtYXgiLCAiTXVzdCBiZSBwb3NpdGl2ZSBhbmQgPD0gMl4zMiIpOwogICAgZmluYWwgYnl0ZUNvdW50ID0gKChtYXggLSAxKS5iaXRMZW5ndGggKyA3KSA+PiAzOwogICAgaWYgKGJ5dGVDb3VudCA9PSAwKSB7CiAgICAgIHJldHVybiAwOyAvLyBOb3QgcmFuZG9tIGlmIG1heCA9PSAxLgogICAgfQogICAgdmFyIHJuZDsKICAgIHZhciByZXN1bHQ7CiAgICBkbyB7CiAgICAgIHJuZCA9IF9nZXRCeXRlcyhieXRlQ291bnQpOwogICAgICByZXN1bHQgPSBybmQgJSBtYXg7CiAgICB9IHdoaWxlICgocm5kIC0gcmVzdWx0ICsgbWF4KSA+ICgxIDw8IChieXRlQ291bnQgPDwgMykpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBkb3VibGUgbmV4dERvdWJsZSgpIHsKICAgIHJldHVybiAoX2dldEJ5dGVzKDcpID4+IDMpIC8gX1BPVzJfNTNfRDsKICB9CgogIGJvb2wgbmV4dEJvb2woKSB7CiAgICByZXR1cm4gX2dldEJ5dGVzKDEpLmlzRXZlbjsKICB9CgogIC8vIENvbnN0YW50cyB1c2VkIGJ5IHRoZSBhbGdvcml0aG0uCiAgc3RhdGljIGNvbnN0IF9QT1cyXzMyID0gMSA8PCAzMjsKICBzdGF0aWMgY29uc3QgX1BPVzJfNTNfRCA9IDEuMCAqICgxIDw8IDUzKTsKfQqBOwBOTjwBTU9NJAEkASoBLgEHHCFNTRItLQEXFxVJORcWQkckIRIIBiQ1DgQMAgEHHCFNTRItLQEXFxVJORcWQ0UkFxIIBhYbDgQhKAwCAUwxBxwfPCEEOAIBNTIZJgQcJCsyAR8BJhcEORcSBhcENQIBQwEmIRIaHxYGFDoZFAYEEQIBBzUbQgc1GzUHNRs1BzUbNQc1GysHNRsrBzUbKwc1GysHHCkHHCkBNykpKSsrKyspKQFGBw8JH1FKKRUVFRYEAQkcIAQCASI0HBsfNwEjAVA2TwERHhNRNSlCM0wvARkePSJEBh8mFC0GAQ8QCRQiHDETBAEYTgQBFBwEASYjLS0BTD8BQjNHRDZAARs7GCUEAgEoFEYSBAFGQgEZJUI2GisGDRAJIho+EwQBGC0EARQgBAEmIy0CAR9kYXJ0Om1hdGgtcGF0Y2gvbWF0aF9wYXRjaC5kYXJ0Nm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9tYXRoL2plbmtpbnNfc21pX2hhc2guZGFydIUzLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KcGFydCBvZiBkYXJ0Lm1hdGg7CgovLy8gVGhpcyBpcyB0aGUgW0plbmtpbnMgaGFzaCBmdW5jdGlvbl1bMV0gYnV0IHVzaW5nIG1hc2tpbmcgdG8ga2VlcAovLy8gdmFsdWVzIGluIFNNSSByYW5nZS4KLy8vCi8vLyBbMV06IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSmVua2luc19oYXNoX2Z1bmN0aW9uCi8vLwovLy8gVXNlOgovLy8gSGFzaCBlYWNoIHZhbHVlIHdpdGggdGhlIGhhc2ggb2YgdGhlIHByZXZpb3VzIHZhbHVlLCB0aGVuIGdldCB0aGUgZmluYWwKLy8vIGhhc2ggYnkgY2FsbGluZyBmaW5pc2guCi8vLwovLy8gICAgIHZhciBoYXNoID0gMDsKLy8vICAgICBmb3IgKHZhciB2YWx1ZSBpbiB2YWx1ZXMpIHsKLy8vICAgICAgIGhhc2ggPSBKZW5raW5zU21pSGFzaC5jb21iaW5lKGhhc2gsIHZhbHVlLmhhc2hDb2RlKTsKLy8vICAgICB9Ci8vLyAgICAgaGFzaCA9IEplbmtpbnNTbWlIYXNoLmZpbmlzaChoYXNoKTsKY2xhc3MgX0plbmtpbnNTbWlIYXNoIHsKICAvLyBUT0RPKDExNjE3KTogVGhpcyBjbGFzcyBzaG91bGQgYmUgb3B0aW1pemVkIGFuZCBzdGFuZGFyZGl6ZWQgZWxzZXdoZXJlLgoKICBzdGF0aWMgaW50IGNvbWJpbmUoaW50IGhhc2gsIGludCB2YWx1ZSkgewogICAgaGFzaCA9IDB4MWZmZmZmZmYgJiAoaGFzaCArIHZhbHVlKTsKICAgIGhhc2ggPSAweDFmZmZmZmZmICYgKGhhc2ggKyAoKDB4MDAwN2ZmZmYgJiBoYXNoKSA8PCAxMCkpOwogICAgcmV0dXJuIGhhc2ggXiAoaGFzaCA+PiA2KTsKICB9CgogIHN0YXRpYyBpbnQgZmluaXNoKGludCBoYXNoKSB7CiAgICBoYXNoID0gMHgxZmZmZmZmZiAmIChoYXNoICsgKCgweDAzZmZmZmZmICYgaGFzaCkgPDwgMykpOwogICAgaGFzaCA9IGhhc2ggXiAoaGFzaCA+PiAxMSk7CiAgICByZXR1cm4gMHgxZmZmZmZmZiAmIChoYXNoICsgKCgweDAwMDAzZmZmICYgaGFzaCkgPDwgMTUpKTsKICB9CgogIHN0YXRpYyBpbnQgaGFzaDIoYSwgYikgPT4gZmluaXNoKGNvbWJpbmUoY29tYmluZSgwLCBhKSwgYikpOwoKICBzdGF0aWMgaW50IGhhc2g0KGEsIGIsIGMsIGQpID0+CiAgICAgIGZpbmlzaChjb21iaW5lKGNvbWJpbmUoY29tYmluZShjb21iaW5lKDAsIGEpLCBiKSwgYyksIGQpKTsKfQopAE5OPBMBRRkEPAQJTBwEFiQ/CiwYTQEsKD4fBAEgPSA+BAE/ASJBAgEfZGFydDptYXRoL2plbmtpbnNfc21pX2hhc2guZGFydCtvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvbWF0aC9wb2ludC5kYXJ0ifIvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgpwYXJ0IG9mIGRhcnQubWF0aDsKCi8vLyBBIHV0aWxpdHkgY2xhc3MgZm9yIHJlcHJlc2VudGluZyB0d28tZGltZW5zaW9uYWwgcG9zaXRpb25zLgpjbGFzcyBQb2ludDxUIGV4dGVuZHMgbnVtPiB7CiAgZmluYWwgVCB4OwogIGZpbmFsIFQgeTsKCiAgY29uc3QgUG9pbnQoVCB4LCBUIHkpCiAgICAgIDogdGhpcy54ID0geCwKICAgICAgICB0aGlzLnkgPSB5OwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnUG9pbnQoJHgsICR5KSc7CgogIC8vLyBBIGBQb2ludGAgaXMgb25seSBlcXVhbCB0byBhbm90aGVyIGBQb2ludGAgd2l0aCB0aGUgc2FtZSBjb29yZGluYXRlcy4KICAvLy8KICAvLy8gVGhpcyBwb2ludCBpcyBlcXVhbCB0byBgb3RoZXJgIGlmLCBhbmQgb25seSBpZiwKICAvLy8gYG90aGVyYCBpcyBhIGBQb2ludGAgd2l0aAogIC8vLyBbeF0gZXF1YWwgdG8gYG90aGVyLnhgIGFuZCBbeV0gZXF1YWwgdG8gYG90aGVyLnlgLgogIGJvb2wgb3BlcmF0b3IgPT0oZHluYW1pYyBvdGhlcikgPT4KICAgICAgLy8gQ2Fubm90IGNoYW5nZSBwYXJhbWV0ZXIgdHlwZSB0byBgT2JqZWN0YCBpbiBjYXNlIHNvbWUgY2xhc3MKICAgICAgLy8gaW5oZXJpdHMgdGhlIHR5cGUgYW5kIHVzZXMgdGhlaXIgYXJndW1lbnQgZHluYW1pY2FsbHkuCiAgICAgIG90aGVyIGlzIFBvaW50ICYmIHggPT0gb3RoZXIueCAmJiB5ID09IG90aGVyLnk7CgogIGludCBnZXQgaGFzaENvZGUgPT4gX0plbmtpbnNTbWlIYXNoLmhhc2gyKHguaGFzaENvZGUsIHkuaGFzaENvZGUpOwoKICAvLy8gQWRkIFtvdGhlcl0gdG8gYHRoaXNgLCBhcyBpZiBib3RoIHBvaW50cyB3ZXJlIHZlY3RvcnMuCiAgLy8vCiAgLy8vIFJldHVybnMgdGhlIHJlc3VsdGluZyAidmVjdG9yIiBhcyBhIFBvaW50LgogIFBvaW50PFQ+IG9wZXJhdG9yICsoUG9pbnQ8VD4gb3RoZXIpIHsKICAgIHJldHVybiBQb2ludDxUPih4ICsgb3RoZXIueCwgeSArIG90aGVyLnkpOwogIH0KCiAgLy8vIFN1YnRyYWN0IFtvdGhlcl0gZnJvbSBgdGhpc2AsIGFzIGlmIGJvdGggcG9pbnRzIHdlcmUgdmVjdG9ycy4KICAvLy8KICAvLy8gUmV0dXJucyB0aGUgcmVzdWx0aW5nICJ2ZWN0b3IiIGFzIGEgUG9pbnQuCiAgUG9pbnQ8VD4gb3BlcmF0b3IgLShQb2ludDxUPiBvdGhlcikgewogICAgcmV0dXJuIFBvaW50PFQ+KHggLSBvdGhlci54LCB5IC0gb3RoZXIueSk7CiAgfQoKICAvLy8gU2NhbGUgdGhpcyBwb2ludCBieSBbZmFjdG9yXSBhcyBpZiBpdCB3ZXJlIGEgdmVjdG9yLgogIC8vLwogIC8vLyAqSW1wb3J0YW50KiAqTm90ZSo6IFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhIGBudW1gIGFzIGl0cyBhcmd1bWVudCBvbmx5IHNvCiAgLy8vIHRoYXQgeW91IGNhbiBzY2FsZSBQb2ludDxkb3VibGU+IG9iamVjdHMgYnkgYW4gYGludGAgZmFjdG9yLiBCZWNhdXNlIHRoZQogIC8vLyBzdGFyIG9wZXJhdG9yIGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIHR5cGUgb2YgUG9pbnQgdGhhdCBvcmlnaW5hbGx5IGNhbGxlZAogIC8vLyBpdCwgcGFzc2luZyBpbiBhIGRvdWJsZSBbZmFjdG9yXSBvbiBhIGBQb2ludDxpbnQ+YCBfY2F1c2VzXyBfYV8KICAvLy8gX3J1bnRpbWVfIF9lcnJvcl8gaW4gY2hlY2tlZCBtb2RlLgogIFBvaW50PFQ+IG9wZXJhdG9yICoobnVtIC8qVHxpbnQqLyBmYWN0b3IpIHsKICAgIHJldHVybiBQb2ludDxUPigoeCAqIGZhY3RvciksICh5ICogZmFjdG9yKSk7CiAgfQoKICAvLy8gR2V0IHRoZSBzdHJhaWdodCBsaW5lIChFdWNsaWRlYW4pIGRpc3RhbmNlIGJldHdlZW4gdGhlIG9yaWdpbiAoMCwgMCkgYW5kCiAgLy8vIHRoaXMgcG9pbnQuCiAgZG91YmxlIGdldCBtYWduaXR1ZGUgPT4gc3FydCh4ICogeCArIHkgKiB5KTsKCiAgLy8vIFJldHVybnMgdGhlIGRpc3RhbmNlIGJldHdlZW4gYHRoaXNgIGFuZCBbb3RoZXJdLgogIGRvdWJsZSBkaXN0YW5jZVRvKFBvaW50PFQ+IG90aGVyKSB7CiAgICB2YXIgZHggPSB4IC0gb3RoZXIueDsKICAgIHZhciBkeSA9IHkgLSBvdGhlci55OwogICAgcmV0dXJuIHNxcnQoZHggKiBkeCArIGR5ICogZHkpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBgdGhpc2AgYW5kIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFNxdWFyZWQgZGlzdGFuY2VzIGNhbiBiZSB1c2VkIGZvciBjb21wYXJpc29ucyB3aGVuIHRoZSBhY3R1YWwgdmFsdWUgaXMgbm90CiAgLy8vIHJlcXVpcmVkLgogIFQgc3F1YXJlZERpc3RhbmNlVG8oUG9pbnQ8VD4gb3RoZXIpIHsKICAgIHZhciBkeCA9IHggLSBvdGhlci54OwogICAgdmFyIGR5ID0geSAtIG90aGVyLnk7CiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7CiAgfQp9CkwATk48EwFAHQ0NARgUFAEoAUwGNiA5JUVANgFFAT0GMSgvBAFEBjEoLwQBOwZQT1FGKS4xBAFPEi8BNyYaGiQEAT8GURAoGhoeBAIBFGRhcnQ6bWF0aC9wb2ludC5kYXJ0LG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9tYXRoL3JhbmRvbS5kYXJ0hfwvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Lm1hdGg7CgovLy8gQSBnZW5lcmF0b3Igb2YgcmFuZG9tIGJvb2wsIGludCwgb3IgZG91YmxlIHZhbHVlcy4KLy8vCi8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzdXBwbGllcyBhIHN0cmVhbSBvZiBwc2V1ZG8tcmFuZG9tIGJpdHMgdGhhdCBhcmUKLy8vIG5vdCBzdWl0YWJsZSBmb3IgY3J5cHRvZ3JhcGhpYyBwdXJwb3Nlcy4KLy8vCi8vLyBVc2UgdGhlIFtSYW5kb20uc2VjdXJlXSgpIGNvbnN0cnVjdG9yIGZvciBjcnlwdG9ncmFwaGljIHB1cnBvc2VzLgphYnN0cmFjdCBjbGFzcyBSYW5kb20gewogIC8vLyBDcmVhdGVzIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCiAgLy8vCiAgLy8vIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgW3NlZWRdIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUKICAvLy8gaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGdlbmVyYXRvci4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQogIC8vLyByYW5kb20gc3RyZWFtIGNhbiBjaGFuZ2UgYmV0d2VlbiByZWxlYXNlcyBvZiB0aGUgbGlicmFyeS4KICBleHRlcm5hbCBmYWN0b3J5IFJhbmRvbShbaW50IHNlZWRdKTsKCiAgLy8vIENyZWF0ZXMgYSBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCiAgLy8vCiAgLy8vIElmIHRoZSBwcm9ncmFtIGNhbm5vdCBwcm92aWRlIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlCiAgLy8vIHNvdXJjZSBvZiByYW5kb20gbnVtYmVycywgaXQgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICBleHRlcm5hbCBmYWN0b3J5IFJhbmRvbS5zZWN1cmUoKTsKCiAgLy8vIEdlbmVyYXRlcyBhIG5vbi1uZWdhdGl2ZSByYW5kb20gaW50ZWdlciB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgaW4gdGhlIHJhbmdlCiAgLy8vIGZyb20gMCwgaW5jbHVzaXZlLCB0byBbbWF4XSwgZXhjbHVzaXZlLgogIC8vLwogIC8vLyBJbXBsZW1lbnRhdGlvbiBub3RlOiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBbbWF4XSB2YWx1ZXMKICAvLy8gYmV0d2VlbiAxIGFuZCAoMTw8MzIpIGluY2x1c2l2ZS4KICBpbnQgbmV4dEludChpbnQgbWF4KTsKCiAgLy8vIEdlbmVyYXRlcyBhIG5vbi1uZWdhdGl2ZSByYW5kb20gZmxvYXRpbmcgcG9pbnQgdmFsdWUgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkCiAgLy8vIGluIHRoZSByYW5nZSBmcm9tIDAuMCwgaW5jbHVzaXZlLCB0byAxLjAsIGV4Y2x1c2l2ZS4KICBkb3VibGUgbmV4dERvdWJsZSgpOwoKICAvLy8gR2VuZXJhdGVzIGEgcmFuZG9tIGJvb2xlYW4gdmFsdWUuCiAgYm9vbCBuZXh0Qm9vbCgpOwp9CioATk48ARMBNwRQLQRGGCkGPkFAJwFCBj9BJAFRLgZMJxgBUTsXASgTAgEVZGFydDptYXRoL3JhbmRvbS5kYXJ0L29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9tYXRoL3JlY3RhbmdsZS5kYXJ0oVwvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgpwYXJ0IG9mIGRhcnQubWF0aDsKCi8vLyBBIGJhc2UgY2xhc3MgZm9yIHJlcHJlc2VudGluZyB0d28tZGltZW5zaW9uYWwgYXhpcy1hbGlnbmVkIHJlY3RhbmdsZXMuCi8vLwovLy8gVGhpcyByZWN0YW5nbGUgdXNlcyBhIGxlZnQtaGFuZGVkIENhcnRlc2lhbiBjb29yZGluYXRlIHN5c3RlbSwgd2l0aCB4Ci8vLyBkaXJlY3RlZCB0byB0aGUgcmlnaHQgYW5kIHkgZGlyZWN0ZWQgZG93biwgYXMgcGVyIHRoZSBjb252ZW50aW9uIGluIDJECi8vLyBjb21wdXRlciBncmFwaGljcy4KLy8vCi8vLyBTZWUgYWxzbzoKLy8vICAgIFtXM0MgQ29vcmRpbmF0ZSBTeXN0ZW1zIFNwZWNpZmljYXRpb25dKGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9jb29yZHMuaHRtbCNJbml0aWFsQ29vcmRpbmF0ZVN5c3RlbSkuCi8vLwovLy8gVGhlIHJlY3RhbmdsZSBpcyB0aGUgc2V0IG9mIHBvaW50cyB3aXRoIHJlcHJlc2VudGFibGUgY29vcmRpbmF0ZXMgZ3JlYXRlcgovLy8gdGhhbiBvciBlcXVhbCB0byBsZWZ0L3RvcCwgYW5kIHdpdGggZGlzdGFuY2UgdG8gbGVmdC90b3Agbm8gZ3JlYXRlciB0aGFuCi8vLyB3aWR0aC9oZWlnaHQgKHRvIHRoZSBsaW1pdCBvZiB0aGUgcHJlY2lzaW9uIG9mIHRoZSBjb29yZGluYXRlcykuCmFic3RyYWN0IGNsYXNzIF9SZWN0YW5nbGVCYXNlPFQgZXh0ZW5kcyBudW0+IHsKICBjb25zdCBfUmVjdGFuZ2xlQmFzZSgpOwoKICAvLy8gVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbGVmdCBlZGdlLgogIFQgZ2V0IGxlZnQ7CgogIC8vLyBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSB0b3AgZWRnZS4KICBUIGdldCB0b3A7CgogIC8vLyBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KICBUIGdldCB3aWR0aDsKCiAgLy8vIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KICBUIGdldCBoZWlnaHQ7CgogIC8vLyBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSByaWdodCBlZGdlLgogIFQgZ2V0IHJpZ2h0ID0+IGxlZnQgKyB3aWR0aDsKCiAgLy8vIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGJvdHRvbSBlZGdlLgogIFQgZ2V0IGJvdHRvbSA9PiB0b3AgKyBoZWlnaHQ7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnUmVjdGFuZ2xlICgkbGVmdCwgJHRvcCkgJHdpZHRoIHggJGhlaWdodCc7CiAgfQoKICBib29sIG9wZXJhdG9yID09KGR5bmFtaWMgb3RoZXIpID0+CiAgICAgIC8vIENhbid0IGNoYW5nZSBhcmd1bWVudCB0eXBlIHRvIGBPYmplY3RgIHNpbmNlIHN1YmNsYXNzZXMgaW5oZXJpdCBpdAogICAgICAvLyBhbmQgdXNlcyB0aGVpciBhcmd1bWVudCBkeW5hbWljYWxseS4KICAgICAgb3RoZXIgaXMgUmVjdGFuZ2xlICYmCiAgICAgIGxlZnQgPT0gb3RoZXIubGVmdCAmJgogICAgICB0b3AgPT0gb3RoZXIudG9wICYmCiAgICAgIHJpZ2h0ID09IG90aGVyLnJpZ2h0ICYmCiAgICAgIGJvdHRvbSA9PSBvdGhlci5ib3R0b207CgogIGludCBnZXQgaGFzaENvZGUgPT4gX0plbmtpbnNTbWlIYXNoLmhhc2g0KAogICAgICBsZWZ0Lmhhc2hDb2RlLCB0b3AuaGFzaENvZGUsIHJpZ2h0Lmhhc2hDb2RlLCBib3R0b20uaGFzaENvZGUpOwoKICAvLy8gQ29tcHV0ZXMgdGhlIGludGVyc2VjdGlvbiBvZiBgdGhpc2AgYW5kIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIGF4aXMtYWxpZ25lZCByZWN0YW5nbGVzLCBpZiBhbnksIGlzIGFsd2F5cyBhbm90aGVyCiAgLy8vIGF4aXMtYWxpZ25lZCByZWN0YW5nbGUuCiAgLy8vCiAgLy8vIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIGFuZCBgb3RoZXJgLCBvciBgbnVsbGAgaWYgdGhleSBkb24ndAogIC8vLyBpbnRlcnNlY3QuCiAgUmVjdGFuZ2xlPFQ+IGludGVyc2VjdGlvbihSZWN0YW5nbGU8VD4gb3RoZXIpIHsKICAgIHZhciB4MCA9IG1heChsZWZ0LCBvdGhlci5sZWZ0KTsKICAgIHZhciB4MSA9IG1pbihsZWZ0ICsgd2lkdGgsIG90aGVyLmxlZnQgKyBvdGhlci53aWR0aCk7CgogICAgaWYgKHgwIDw9IHgxKSB7CiAgICAgIHZhciB5MCA9IG1heCh0b3AsIG90aGVyLnRvcCk7CiAgICAgIHZhciB5MSA9IG1pbih0b3AgKyBoZWlnaHQsIG90aGVyLnRvcCArIG90aGVyLmhlaWdodCk7CgogICAgICBpZiAoeTAgPD0geTEpIHsKICAgICAgICByZXR1cm4gUmVjdGFuZ2xlPFQ+KHgwLCB5MCwgeDEgLSB4MCwgeTEgLSB5MCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBgdGhpc2AgaW50ZXJzZWN0cyBbb3RoZXJdLgogIGJvb2wgaW50ZXJzZWN0cyhSZWN0YW5nbGU8bnVtPiBvdGhlcikgewogICAgcmV0dXJuIChsZWZ0IDw9IG90aGVyLmxlZnQgKyBvdGhlci53aWR0aCAmJgogICAgICAgIG90aGVyLmxlZnQgPD0gbGVmdCArIHdpZHRoICYmCiAgICAgICAgdG9wIDw9IG90aGVyLnRvcCArIG90aGVyLmhlaWdodCAmJgogICAgICAgIG90aGVyLnRvcCA8PSB0b3AgKyBoZWlnaHQpOwogIH0KCiAgLy8vIFJldHVybnMgYSBuZXcgcmVjdGFuZ2xlIHdoaWNoIGNvbXBsZXRlbHkgY29udGFpbnMgYHRoaXNgIGFuZCBbb3RoZXJdLgogIFJlY3RhbmdsZTxUPiBib3VuZGluZ0JveChSZWN0YW5nbGU8VD4gb3RoZXIpIHsKICAgIHZhciByaWdodCA9IG1heCh0aGlzLmxlZnQgKyB0aGlzLndpZHRoLCBvdGhlci5sZWZ0ICsgb3RoZXIud2lkdGgpOwogICAgdmFyIGJvdHRvbSA9IG1heCh0aGlzLnRvcCArIHRoaXMuaGVpZ2h0LCBvdGhlci50b3AgKyBvdGhlci5oZWlnaHQpOwoKICAgIHZhciBsZWZ0ID0gbWluKHRoaXMubGVmdCwgb3RoZXIubGVmdCk7CiAgICB2YXIgdG9wID0gbWluKHRoaXMudG9wLCBvdGhlci50b3ApOwoKICAgIHJldHVybiBSZWN0YW5nbGU8VD4obGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7CiAgfQoKICAvLy8gVGVzdHMgd2hldGhlciBgdGhpc2AgZW50aXJlbHkgY29udGFpbnMgW2Fub3RoZXJdLgogIGJvb2wgY29udGFpbnNSZWN0YW5nbGUoUmVjdGFuZ2xlPG51bT4gYW5vdGhlcikgewogICAgcmV0dXJuIGxlZnQgPD0gYW5vdGhlci5sZWZ0ICYmCiAgICAgICAgbGVmdCArIHdpZHRoID49IGFub3RoZXIubGVmdCArIGFub3RoZXIud2lkdGggJiYKICAgICAgICB0b3AgPD0gYW5vdGhlci50b3AgJiYKICAgICAgICB0b3AgKyBoZWlnaHQgPj0gYW5vdGhlci50b3AgKyBhbm90aGVyLmhlaWdodDsKICB9CgogIC8vLyBUZXN0cyB3aGV0aGVyIFthbm90aGVyXSBpcyBpbnNpZGUgb3IgYWxvbmcgdGhlIGVkZ2VzIG9mIGB0aGlzYC4KICBib29sIGNvbnRhaW5zUG9pbnQoUG9pbnQ8bnVtPiBhbm90aGVyKSB7CiAgICByZXR1cm4gYW5vdGhlci54ID49IGxlZnQgJiYKICAgICAgICBhbm90aGVyLnggPD0gbGVmdCArIHdpZHRoICYmCiAgICAgICAgYW5vdGhlci55ID49IHRvcCAmJgogICAgICAgIGFub3RoZXIueSA8PSB0b3AgKyBoZWlnaHQ7CiAgfQoKICBQb2ludDxUPiBnZXQgdG9wTGVmdCA9PiBQb2ludDxUPih0aGlzLmxlZnQsIHRoaXMudG9wKTsKICBQb2ludDxUPiBnZXQgdG9wUmlnaHQgPT4gUG9pbnQ8VD4odGhpcy5sZWZ0ICsgdGhpcy53aWR0aCwgdGhpcy50b3ApOwogIFBvaW50PFQ+IGdldCBib3R0b21SaWdodCA9PgogICAgICBQb2ludDxUPih0aGlzLmxlZnQgKyB0aGlzLndpZHRoLCB0aGlzLnRvcCArIHRoaXMuaGVpZ2h0KTsKICBQb2ludDxUPiBnZXQgYm90dG9tTGVmdCA9PiBQb2ludDxUPih0aGlzLmxlZnQsIHRoaXMudG9wICsgdGhpcy5oZWlnaHQpOwp9CgovLy8gQSBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIHR3by1kaW1lbnNpb25hbCByZWN0YW5nbGVzIHdob3NlIHByb3BlcnRpZXMgYXJlCi8vLyBpbW11dGFibGUuCmNsYXNzIFJlY3RhbmdsZTxUIGV4dGVuZHMgbnVtPiBleHRlbmRzIF9SZWN0YW5nbGVCYXNlPFQ+IHsKICBmaW5hbCBUIGxlZnQ7CiAgZmluYWwgVCB0b3A7CiAgZmluYWwgVCB3aWR0aDsKICBmaW5hbCBUIGhlaWdodDsKCiAgLy8vIENyZWF0ZSBhIHJlY3RhbmdsZSBzcGFubmVkIGJ5IGAobGVmdCwgdG9wKWAgYW5kCiAgLy8vIGAobGVmdCt3aWR0aCwgdG9wK2hlaWdodClgLgogIC8vLwogIC8vLyBUaGUgcmVjdGFuZ2xlIGNvbnRhaW5zIHRoZSBwb2ludHMKICAvLy8gd2l0aCB4LWNvb3JkaW5hdGUgYmV0d2VlbiBgbGVmdGAgYW5kIGBsZWZ0ICsgd2lkdGhgLCBhbmQKICAvLy8gd2l0aCB5LWNvb3JkaW5hdGUgYmV0d2VlbiBgdG9wYCBhbmQgYHRvcCArIGhlaWdodGAsIGJvdGggaW5jbHVzaXZlLgogIC8vLwogIC8vLyBUaGUgYHdpZHRoYCBhbmQgYGhlaWdodGAgc2hvdWxkIGJlIG5vbi1uZWdhdGl2ZS4KICAvLy8gSWYgYHdpZHRoYCBvciBgaGVpZ2h0YCBhcmUgbmVnYXRpdmUsIHRoZXkgYXJlIGNsYW1wZWQgdG8gemVyby4KICAvLy8KICAvLy8gSWYgYHdpZHRoYCBhbmQgYGhlaWdodGAgYXJlIHplcm8sIHRoZSAicmVjdGFuZ2xlIiBjb21wcmlzZXMgb25seSB0aGUKICAvLy8gc2luZ2xlIHBvaW50IGAobGVmdCwgdG9wKWAuCiAgY29uc3QgUmVjdGFuZ2xlKHRoaXMubGVmdCwgdGhpcy50b3AsIFQgd2lkdGgsIFQgaGVpZ2h0KQogICAgICA6IHRoaXMud2lkdGggPSAod2lkdGggPCAwKSA/IC13aWR0aCAqIDAgOiB3aWR0aCwgLy8gSW5saW5lIF9jbGFtcFRvWmVyby4KICAgICAgICB0aGlzLmhlaWdodCA9IChoZWlnaHQgPCAwKSA/IC1oZWlnaHQgKiAwIDogaGVpZ2h0OwoKICAvLy8gQ3JlYXRlIGEgcmVjdGFuZ2xlIHNwYW5uZWQgYnkgdGhlIHBvaW50cyBbYV0gYW5kIFtiXTsKICAvLy8KICAvLy8gVGhlIHJlY3RhbmdsZSBjb250YWlucyB0aGUgcG9pbnRzCiAgLy8vIHdpdGggeC1jb29yZGluYXRlIGJldHdlZW4gYGEueGAgYW5kIGBiLnhgLCBhbmQKICAvLy8gd2l0aCB5LWNvb3JkaW5hdGUgYmV0d2VlbiBgYS55YCBhbmQgYGIueWAsIGJvdGggaW5jbHVzaXZlLgogIC8vLwogIC8vLyBJZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBgYS54YCBhbmQgYGIueGAgaXMgbm90IHJlcHJlc2VudGFibGUKICAvLy8gKHdoaWNoIGNhbiBoYXBwZW4gaWYgb25lIG9yIGJvdGggaXMgYSBkb3VibGUpLAogIC8vLyB0aGUgYWN0dWFsIHJpZ2h0IGVkZ2UgbWlnaHQgYmUgc2xpZ2h0bHkgb2ZmIGZyb20gYG1heChhLngsIGIueClgLgogIC8vLyBTaW1pbGFyIGZvciB0aGUgeS1jb29yZGluYXRlcyBhbmQgdGhlIGJvdHRvbSBlZGdlLgogIGZhY3RvcnkgUmVjdGFuZ2xlLmZyb21Qb2ludHMoUG9pbnQ8VD4gYSwgUG9pbnQ8VD4gYikgewogICAgVCBsZWZ0ID0gbWluKGEueCwgYi54KTsKICAgIFQgd2lkdGggPSBtYXgoYS54LCBiLngpIC0gbGVmdDsKICAgIFQgdG9wID0gbWluKGEueSwgYi55KTsKICAgIFQgaGVpZ2h0ID0gbWF4KGEueSwgYi55KSAtIHRvcDsKICAgIHJldHVybiBSZWN0YW5nbGU8VD4obGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KTsKICB9Cn0KCi8vLyBBIGNsYXNzIGZvciByZXByZXNlbnRpbmcgdHdvLWRpbWVuc2lvbmFsIGF4aXMtYWxpZ25lZCByZWN0YW5nbGVzIHdpdGgKLy8vIG11dGFibGUgcHJvcGVydGllcy4KY2xhc3MgTXV0YWJsZVJlY3RhbmdsZTxUIGV4dGVuZHMgbnVtPiBleHRlbmRzIF9SZWN0YW5nbGVCYXNlPFQ+CiAgICBpbXBsZW1lbnRzIFJlY3RhbmdsZTxUPiB7CiAgLy8vIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGxlZnQgZWRnZS4KICAvLy8KICAvLy8gU2V0dGluZyB0aGUgdmFsdWUgd2lsbCBtb3ZlIHRoZSByZWN0YW5nbGUgd2l0aG91dCBjaGFuZ2luZyBpdHMgd2lkdGguCiAgVCBsZWZ0OwoKICAvLy8gVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgbGVmdCBlZGdlLgogIC8vLwogIC8vLyBTZXR0aW5nIHRoZSB2YWx1ZSB3aWxsIG1vdmUgdGhlIHJlY3RhbmdsZSB3aXRob3V0IGNoYW5naW5nIGl0cyBoZWlnaHQuCiAgVCB0b3A7CiAgVCBfd2lkdGg7CiAgVCBfaGVpZ2h0OwoKICAvLy8gQ3JlYXRlIGEgbXV0YWJsZSByZWN0YW5nbGUgc3Bhbm5lZCBieSBgKGxlZnQsIHRvcClgIGFuZAogIC8vLyBgKGxlZnQrd2lkdGgsIHRvcCtoZWlnaHQpYC4KICAvLy8KICAvLy8gVGhlIHJlY3RhbmdsZSBjb250YWlucyB0aGUgcG9pbnRzCiAgLy8vIHdpdGggeC1jb29yZGluYXRlIGJldHdlZW4gYGxlZnRgIGFuZCBgbGVmdCArIHdpZHRoYCwgYW5kCiAgLy8vIHdpdGggeS1jb29yZGluYXRlIGJldHdlZW4gYHRvcGAgYW5kIGB0b3AgKyBoZWlnaHRgLCBib3RoIGluY2x1c2l2ZS4KICAvLy8KICAvLy8gVGhlIGB3aWR0aGAgYW5kIGBoZWlnaHRgIHNob3VsZCBiZSBub24tbmVnYXRpdmUuCiAgLy8vIElmIGB3aWR0aGAgb3IgYGhlaWdodGAgYXJlIG5lZ2F0aXZlLCB0aGV5IGFyZSBjbGFtcGVkIHRvIHplcm8uCiAgLy8vCiAgLy8vIElmIGB3aWR0aGAgYW5kIGBoZWlnaHRgIGFyZSB6ZXJvLCB0aGUgInJlY3RhbmdsZSIgY29tcHJpc2VzIG9ubHkgdGhlCiAgLy8vIHNpbmdsZSBwb2ludCBgKGxlZnQsIHRvcClgLgogIE11dGFibGVSZWN0YW5nbGUodGhpcy5sZWZ0LCB0aGlzLnRvcCwgVCB3aWR0aCwgVCBoZWlnaHQpCiAgICAgIDogdGhpcy5fd2lkdGggPSAod2lkdGggPCAwKSA/IF9jbGFtcFRvWmVybzxUPih3aWR0aCkgOiB3aWR0aCwKICAgICAgICB0aGlzLl9oZWlnaHQgPSAoaGVpZ2h0IDwgMCkgPyBfY2xhbXBUb1plcm88VD4oaGVpZ2h0KSA6IGhlaWdodDsKCiAgLy8vIENyZWF0ZSBhIG11dGFibGUgcmVjdGFuZ2xlIHNwYW5uZWQgYnkgdGhlIHBvaW50cyBbYV0gYW5kIFtiXTsKICAvLy8KICAvLy8gVGhlIHJlY3RhbmdsZSBjb250YWlucyB0aGUgcG9pbnRzCiAgLy8vIHdpdGggeC1jb29yZGluYXRlIGJldHdlZW4gYGEueGAgYW5kIGBiLnhgLCBhbmQKICAvLy8gd2l0aCB5LWNvb3JkaW5hdGUgYmV0d2VlbiBgYS55YCBhbmQgYGIueWAsIGJvdGggaW5jbHVzaXZlLgogIC8vLwogIC8vLyBJZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBgYS54YCBhbmQgYGIueGAgaXMgbm90IHJlcHJlc2VudGFibGUKICAvLy8gKHdoaWNoIGNhbiBoYXBwZW4gaWYgb25lIG9yIGJvdGggaXMgYSBkb3VibGUpLAogIC8vLyB0aGUgYWN0dWFsIHJpZ2h0IGVkZ2UgbWlnaHQgYmUgc2xpZ2h0bHkgb2ZmIGZyb20gYG1heChhLngsIGIueClgLgogIC8vLyBTaW1pbGFyIGZvciB0aGUgeS1jb29yZGluYXRlcyBhbmQgdGhlIGJvdHRvbSBlZGdlLgogIGZhY3RvcnkgTXV0YWJsZVJlY3RhbmdsZS5mcm9tUG9pbnRzKFBvaW50PFQ+IGEsIFBvaW50PFQ+IGIpIHsKICAgIFQgbGVmdCA9IG1pbihhLngsIGIueCk7CiAgICBUIHdpZHRoID0gbWF4KGEueCwgYi54KSAtIGxlZnQ7CiAgICBUIHRvcCA9IG1pbihhLnksIGIueSk7CiAgICBUIGhlaWdodCA9IG1heChhLnksIGIueSkgLSB0b3A7CiAgICByZXR1cm4gTXV0YWJsZVJlY3RhbmdsZTxUPihsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpOwogIH0KCiAgVCBnZXQgd2lkdGggPT4gX3dpZHRoOwoKICAvLy8gU2V0cyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KICAvLy8KICAvLy8gVGhlIHdpZHRoIG11c3QgYmUgbm9uLW5lZ2F0aXZlLgogIC8vLyBJZiBhIG5lZ2F0aXZlIHdpZHRoIGlzIHN1cHBsaWVkLCBpdCBpcyBjbGFtcGVkIHRvIHplcm8uCiAgLy8vCiAgLy8vIFNldHRpbmcgdGhlIHZhbHVlIHdpbGwgY2hhbmdlIHRoZSByaWdodCBlZGdlIG9mIHRoZSByZWN0YW5nbGUsCiAgLy8vIGJ1dCB3aWxsIG5vdCBjaGFuZ2UgW2xlZnRdLgogIHNldCB3aWR0aChUIHdpZHRoKSB7CiAgICBpZiAod2lkdGggPCAwKSB3aWR0aCA9IF9jbGFtcFRvWmVybzxUPih3aWR0aCk7CiAgICBfd2lkdGggPSB3aWR0aDsKICB9CgogIFQgZ2V0IGhlaWdodCA9PiBfaGVpZ2h0OwoKICAvLy8gU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCiAgLy8vCiAgLy8vIFRoZSBoZWlnaHQgbXVzdCBiZSBub24tbmVnYXRpdmUuCiAgLy8vIElmIGEgbmVnYXRpdmUgaGVpZ2h0IGlzIHN1cHBsaWVkLCBpdCBpcyBjbGFtcGVkIHRvIHplcm8uCiAgLy8vCiAgLy8vIFNldHRpbmcgdGhlIHZhbHVlIHdpbGwgY2hhbmdlIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgcmVjdGFuZ2xlLAogIC8vLyBidXQgd2lsbCBub3QgY2hhbmdlIFt0b3BdLgogIHNldCBoZWlnaHQoVCBoZWlnaHQpIHsKICAgIGlmIChoZWlnaHQgPCAwKSBoZWlnaHQgPSBfY2xhbXBUb1plcm88VD4oaGVpZ2h0KTsKICAgIF9oZWlnaHQgPSBoZWlnaHQ7CiAgfQp9CgovLy8gQ29udmVydHMgYSBuZWdhdGl2ZSBbaW50XSBvciBbZG91YmxlXSB0byBhIHplcm8tdmFsdWUgb2YgdGhlIHNhbWUgdHlwZS4KLy8vCi8vLyBSZXR1cm5zIGAwYCBpZiB2YWx1ZSBpcyBpbnQsIGAwLjBgIGlmIHZhbHVlIGlzIGRvdWJsZS4KVCBfY2xhbXBUb1plcm88VCBleHRlbmRzIG51bT4oVCB2YWx1ZSkgewogIGFzc2VydCh2YWx1ZSA8IDApOwogIHJldHVybiAtdmFsdWUgKiAwOwp9CoD5AE5OPBMBSwRKSxcEDm0ETk1FLxoBKQ4BKA0BIg8BIxABKh8BKyABFjcEASVMLhwcGh4eAS1FATcGUR4GTBEyJDoBFCQ8ARY3CAYRBAExKjAmKyQEAUwxR0gBKygBQAQBODMjOB42BAFGKyAlHCMEATlHHkBKAgFNDzsQDxESATYiBig/SgY3RQZLIjpPOwE8Big1QQZDNUg5ORwkGyQzBAIBShhAHikGTAoBKQZNCQwNAT4iBig/SgY3RQZLIjtESAFEBig1QQZDNUg5QBwkGyQ6BAEZAScGJj4GRSIXMxQEARsBKAYnPwZGIRk2FgQCAUwEOykVFQIBGGRhcnQ6bWF0aC9yZWN0YW5nbGUuZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvbWlycm9ycy9taXJyb3JzLmRhcnTAAMKXLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEZvciB0aGUgcHVycG9zZXMgb2YgdGhlIG1pcnJvcnMgbGlicmFyeSwgd2UgYWRvcHQgYSBuYW1pbmcKLy8gY29udmVudGlvbiB3aXRoIHJlc3BlY3QgdG8gZ2V0dGVycyBhbmQgc2V0dGVycy4gIFNwZWNpZmljYWxseSwgZm9yCi8vIHNvbWUgdmFyaWFibGUgb3IgZmllbGQuLi4KLy8KLy8gICB2YXIgbXlGaWVsZDsKLy8KLy8gLi4udGhlIGdldHRlciBpcyBuYW1lZCAnbXlGaWVsZCcgYW5kIHRoZSBzZXR0ZXIgaXMgbmFtZWQKLy8gJ215RmllbGQ9Jy4gIFRoaXMgYWxsb3dzIHVzIHRvIGFzc2lnbiB1bmlxdWUgbmFtZXMgdG8gZ2V0dGVycyBhbmQKLy8gc2V0dGVycyBmb3IgdGhlIHB1cnBvc2VzIG9mIG1lbWJlciBsb29rdXAuCgovKioKICogQmFzaWMgcmVmbGVjdGlvbiBpbiBEYXJ0LAogKiB3aXRoIHN1cHBvcnQgZm9yIGludHJvc3BlY3Rpb24gYW5kIGR5bmFtaWMgaW52b2NhdGlvbi4KICoKICogKkludHJvc3BlY3Rpb24qIGlzIHRoYXQgc3Vic2V0IG9mIHJlZmxlY3Rpb24gYnkgd2hpY2ggYSBydW5uaW5nCiAqIHByb2dyYW0gY2FuIGV4YW1pbmUgaXRzIG93biBzdHJ1Y3R1cmUuIEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uCiAqIHRoYXQgcHJpbnRzIG91dCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBtZW1iZXJzIG9mIGFuIGFyYml0cmFyeSBvYmplY3QuCiAqCiAqICpEeW5hbWljIGludm9jYXRpb24qIHJlZmVycyB0aGUgYWJpbGl0eSB0byBldmFsdWF0ZSBjb2RlIHRoYXQKICogaGFzIG5vdCBiZWVuIGxpdGVyYWxseSBzcGVjaWZpZWQgYXQgY29tcGlsZSB0aW1lLCBzdWNoIGFzIGNhbGxpbmcgYSBtZXRob2QKICogd2hvc2UgbmFtZSBpcyBwcm92aWRlZCBhcyBhbiBhcmd1bWVudCAoYmVjYXVzZSBpdCBpcyBsb29rZWQgdXAKICogaW4gYSBkYXRhYmFzZSwgb3IgcHJvdmlkZWQgaW50ZXJhY3RpdmVseSBieSB0aGUgdXNlcikuCiAqCiAqICMjIEhvdyB0byBpbnRlcnByZXQgdGhpcyBsaWJyYXJ5J3MgZG9jdW1lbnRhdGlvbgogKgogKiBBcyBhIHJ1bGUsIHRoZSBuYW1lcyBvZiBEYXJ0IGRlY2xhcmF0aW9ucyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcKICogaW5zdGFuY2VzIG9mIGNsYXNzIFtTeW1ib2xdLiBXaGVuZXZlciB0aGUgZG9jIHNwZWFrcyBvZiBhbiBvYmplY3QgKnMqCiAqIG9mIGNsYXNzIFtTeW1ib2xdIGRlbm90aW5nIGEgbmFtZSwgaXQgbWVhbnMgdGhlIHN0cmluZyB0aGF0CiAqIHdhcyB1c2VkIHRvIGNvbnN0cnVjdCAqcyouCiAqCiAqIFRoZSBkb2N1bWVudGF0aW9uIGZyZXF1ZW50bHkgYWJ1c2VzIG5vdGF0aW9uIHdpdGgKICogRGFydCBwc2V1ZG8tY29kZSBzdWNoIGFzIFs6by54KGEpOl0sIHdoZXJlCiAqIG8gYW5kIGEgYXJlIGRlZmluZWQgdG8gYmUgb2JqZWN0czsgd2hhdCBpcyBhY3R1YWxseSBtZWFudCBpbiB0aGVzZQogKiBjYXNlcyBpcyBbOm8nLngoYScpOl0gd2hlcmUgKm8nKiBhbmQgKmEnKiBhcmUgRGFydCB2YXJpYWJsZXMKICogYm91bmQgdG8gKm8qIGFuZCAqYSogcmVzcGVjdGl2ZWx5LiBGdXJ0aGVybW9yZSwgKm8nKiBhbmQgKmEnKgogKiBhcmUgYXNzdW1lZCB0byBiZSBmcmVzaCB2YXJpYWJsZXMgKG1lYW5pbmcgdGhhdCB0aGV5IGFyZQogKiBkaXN0aW5jdCBmcm9tIGFueSBvdGhlciB2YXJpYWJsZXMgaW4gdGhlIHByb2dyYW0pLgogKgogKiBTb21ldGltZXMgdGhlIGRvY3VtZW50YXRpb24gcmVmZXJzIHRvICpzZXJpYWxpemFibGUqIG9iamVjdHMuCiAqIEFuIG9iamVjdCBpcyBzZXJpYWxpemFibGUgYWNyb3NzIGlzb2xhdGVzIGlmIGFuZCBvbmx5IGlmIGl0IGlzIGFuIGluc3RhbmNlIG9mCiAqIG51bSwgYm9vbCwgU3RyaW5nLCBhIGxpc3Qgb2Ygb2JqZWN0cyB0aGF0IGFyZSBzZXJpYWxpemFibGUKICogYWNyb3NzIGlzb2xhdGVzLCBvciBhIG1hcCB3aXRoIGtleXMgYW5kIHZhbHVlcyB0aGF0IGFyZSBhbGwgc2VyaWFsaXphYmxlIGFjcm9zcwogKiBpc29sYXRlcy4KICoKICogIyMgU3RhdHVzOiBVbnN0YWJsZQogKgogKiBUaGUgZGFydDptaXJyb3JzIGxpYnJhcnkgaXMgdW5zdGFibGUgYW5kIGl0cyBBUEkgbWlnaHQgY2hhbmdlIHNsaWdodGx5IGFzIGEKICogcmVzdWx0IG9mIHVzZXIgZmVlZGJhY2suIFRoaXMgbGlicmFyeSBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQgYW5kIHRoZXJlZm9yZSBpdAogKiBoYXMgaW1wbGVtZW50YXRpb25zIGZvciBib3RoIGRhcnQyanMgYW5kIHRoZSBEYXJ0IFZNLiBCb3RoIGFyZSB1bmRlcgogKiBkZXZlbG9wbWVudCBhbmQgbWF5IG5vdCBzdXBwb3J0IGFsbCBvcGVyYXRpb25zIHlldC4KICoKICoge0BjYXRlZ29yeSBWTX0KICovCmxpYnJhcnkgZGFydC5taXJyb3JzOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZTsKCi8qKgogKiBBIFtNaXJyb3JTeXN0ZW1dIGlzIHRoZSBtYWluIGludGVyZmFjZSB1c2VkIHRvIHJlZmxlY3Qgb24gYSBzZXQgb2YKICogYXNzb2NpYXRlZCBsaWJyYXJpZXMuCiAqCiAqIEF0IHJ1bnRpbWUgZWFjaCBydW5uaW5nIGlzb2xhdGUgaGFzIGEgZGlzdGluY3QgW01pcnJvclN5c3RlbV0uCiAqCiAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFtNaXJyb3JTeXN0ZW1dIHdoaWNoIHJlcHJlc2VudHMgYSBzZXQKICogb2YgbGlicmFyaWVzIHdoaWNoIGFyZSBub3QgcnVubmluZyAtLSBwZXJoYXBzIGF0IGNvbXBpbGUtdGltZS4gIEluCiAqIHRoaXMgY2FzZSwgYWxsIGF2YWlsYWJsZSByZWZsZWN0aXZlIGZ1bmN0aW9uYWxpdHkgd291bGQgYmUKICogc3VwcG9ydGVkLCBidXQgcnVudGltZSBmdW5jdGlvbmFsaXR5IChzdWNoIGFzIGludm9raW5nIGEgZnVuY3Rpb24KICogb3IgaW5zcGVjdGluZyB0aGUgY29udGVudHMgb2YgYSB2YXJpYWJsZSkgd291bGQgZmFpbCBkeW5hbWljYWxseS4KICovCmFic3RyYWN0IGNsYXNzIE1pcnJvclN5c3RlbSB7CiAgLyoqCiAgICogQWxsIGxpYnJhcmllcyBrbm93biB0byB0aGUgbWlycm9yIHN5c3RlbSwgaW5kZXhlZCBieSB0aGVpciBVUkkuCiAgICoKICAgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSBtYXAgb2YgdGhlIGxpYnJhcmllcyB3aXRoIFtMaWJyYXJ5TWlycm9yLnVyaV0gYXMKICAgKiBrZXlzLgogICAqCiAgICogRm9yIGEgcnVudGltZSBtaXJyb3Igc3lzdGVtLCBvbmx5IGxpYnJhcmllcyB3aGljaCBhcmUgY3VycmVudGx5IGxvYWRlZAogICAqIGFyZSBpbmNsdWRlZCwgYW5kIHJlcGVhdGVkIGNhbGxzIG9mIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gZGlmZmVyZW50IG1hcHMKICAgKiBhcyBsaWJyYXJpZXMgYXJlIGxvYWRlZC4KICAgKi8KICBNYXA8VXJpLCBMaWJyYXJ5TWlycm9yPiBnZXQgbGlicmFyaWVzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSB1bmlxdWUgbGlicmFyeSBuYW1lZCBbbGlicmFyeU5hbWVdIGlmIGl0IGV4aXN0cy4KICAgKgogICAqIElmIG5vIHVuaXF1ZSBsaWJyYXJ5IGV4aXN0cywgYW4gZXJyb3IgaXMgdGhyb3duLgogICAqLwogIGV4dGVybmFsIExpYnJhcnlNaXJyb3IgZmluZExpYnJhcnkoU3ltYm9sIGxpYnJhcnlOYW1lKTsKCiAgLyoqCiAgICogQSBtaXJyb3Igb24gdGhlIGlzb2xhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgW01pcnJvclN5c3RlbV0uCiAgICoKICAgKiBUaGlzIG1heSBiZSBudWxsIGlmIHRoaXMgbWlycm9yIHN5c3RlbSBpcyBub3QgcnVubmluZy4KICAgKi8KICBJc29sYXRlTWlycm9yIGdldCBpc29sYXRlOwoKICAvKioKICAgKiBBIG1pcnJvciBvbiB0aGUgWzpkeW5hbWljOl0gdHlwZS4KICAgKi8KICBUeXBlTWlycm9yIGdldCBkeW5hbWljVHlwZTsKCiAgLyoqCiAgICogQSBtaXJyb3Igb24gdGhlIFs6dm9pZDpdIHR5cGUuCiAgICovCiAgVHlwZU1pcnJvciBnZXQgdm9pZFR5cGU7CgogIC8qKgogICAqIFJldHVybnMgdGhlIG5hbWUgb2YgW3N5bWJvbF0uCiAgICoKICAgKiBUaGUgZm9sbG93aW5nIHRleHQgaXMgbm9uLW5vcm1hdGl2ZToKICAgKgogICAqIFVzaW5nIHRoaXMgbWV0aG9kIG1heSByZXN1bHQgaW4gbGFyZ2VyIG91dHB1dC4gIElmIHBvc3NpYmxlLCB1c2UKICAgKiBbTWlycm9yc1VzZWRdIHRvIHNwZWNpZnkgd2hpY2ggc3ltYm9scyBtdXN0IGJlIHJldGFpbmVkIGluIGNsZWFyIHRleHQuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBnZXROYW1lKFN5bWJvbCBzeW1ib2wpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgc3ltYm9sIGZvciBbbmFtZV0uCiAgICoKICAgKiBJZiBbbGlicmFyeV0gaXMgbm90IGEgW0xpYnJhcnlNaXJyb3JdIG9yIGlmIFtuYW1lXSBpcyBhIHByaXZhdGUgaWRlbnRpZmllcgogICAqIGFuZCBbbGlicmFyeV0gaXMgYG51bGxgLCB0aHJvd3MgYW4gW0FyZ3VtZW50RXJyb3JdLiBJZiBbbmFtZV0gaXMgYSBwcml2YXRlCiAgICogaWRlbnRpZmllciwgdGhlIHN5bWJvbCByZXR1cm5lZCBpcyB3aXRoIHJlc3BlY3QgdG8gW2xpYnJhcnldLgogICAqCiAgICogVGhlIGZvbGxvd2luZyB0ZXh0IGlzIG5vbi1ub3JtYXRpdmU6CiAgICoKICAgKiBVc2luZyB0aGlzIG1ldGhvZCBtYXkgcmVzdWx0IGluIGxhcmdlciBvdXRwdXQuICBJZiBwb3NzaWJsZSwgdXNlCiAgICogdGhlIGNvbnN0IGNvbnN0cnVjdG9yIG9mIFtTeW1ib2xdIG9yIHN5bWJvbCBsaXRlcmFscy4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgU3ltYm9sIGdldFN5bWJvbChTdHJpbmcgbmFtZSwgW0xpYnJhcnlNaXJyb3IgbGlicmFyeV0pOwp9CgovKioKICogUmV0dXJucyBhIFtNaXJyb3JTeXN0ZW1dIGZvciB0aGUgY3VycmVudCBpc29sYXRlLgogKi8KZXh0ZXJuYWwgTWlycm9yU3lzdGVtIGN1cnJlbnRNaXJyb3JTeXN0ZW0oKTsKCi8qKgogKiBSZWZsZWN0cyBhbiBpbnN0YW5jZS4KICoKICogUmV0dXJucyBhbiBbSW5zdGFuY2VNaXJyb3JdIHJlZmxlY3RpbmcgW3JlZmxlY3RlZV0uIElmIFtyZWZsZWN0ZWVdIGlzIGEKICogZnVuY3Rpb24gb3IgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBhIFs6Y2FsbDpdIG1ldGhvZCwgdGhlIHJldHVybmVkCiAqIGluc3RhbmNlIG1pcnJvciB3aWxsIGJlIGEgW0Nsb3N1cmVNaXJyb3JdLgogKgogKiBOb3RlIHRoYXQgc2luY2Ugb25lIGNhbm5vdCBvYnRhaW4gYW4gb2JqZWN0IGZyb20gYW5vdGhlciBpc29sYXRlLCB0aGlzCiAqIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgdG8gb2J0YWluICBtaXJyb3JzIG9uIG9iamVjdHMgb2YgdGhlIGN1cnJlbnQKICogaXNvbGF0ZS4KICovCmV4dGVybmFsIEluc3RhbmNlTWlycm9yIHJlZmxlY3QoT2JqZWN0IHJlZmxlY3RlZSk7CgovKioKICogUmVmbGVjdHMgYSBjbGFzcyBkZWNsYXJhdGlvbi4KICoKICogTGV0ICpDKiBiZSB0aGUgb3JpZ2luYWwgY2xhc3MgZGVjbGFyYXRpb24gb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IFtrZXldLgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBbQ2xhc3NNaXJyb3JdIHJlZmxlY3RpbmcgKkMqLgogKgogKiBJZiBba2V5XSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgW1R5cGVdLCB0aGVuIHRoaXMgZnVuY3Rpb24gdGhyb3dzIGFuCiAqIFtBcmd1bWVudEVycm9yXS4gSWYgW2tleV0gaXMgdGhlIFR5cGUgZm9yIGR5bmFtaWMgb3IgYSBmdW5jdGlvbiB0eXBlZGVmLAogKiB0aHJvd3MgYW4gW0FyZ3VtZW50RXJyb3JdLgogKgogKiBOb3RlIHRoYXQgc2luY2Ugb25lIGNhbm5vdCBvYnRhaW4gYSBbVHlwZV0gb2JqZWN0IGZyb20gYW5vdGhlciBpc29sYXRlLCB0aGlzCiAqIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgdG8gb2J0YWluIGNsYXNzIG1pcnJvcnMgb24gY2xhc3NlcyBvZiB0aGUgY3VycmVudAogKiBpc29sYXRlLgogKi8KZXh0ZXJuYWwgQ2xhc3NNaXJyb3IgcmVmbGVjdENsYXNzKFR5cGUga2V5KTsKCi8qKgogKiBSZWZsZWN0cyB0aGUgdHlwZSByZXByZXNlbnRlZCBieSBba2V5XS4KICoKICogSWYgW2tleV0gaXMgbm90IGFuIGluc3RhbmNlIG9mIFtUeXBlXSwgdGhlbiB0aGlzIGZ1bmN0aW9uIHRocm93cyBhbgogKiBbQXJndW1lbnRFcnJvcl0uCiAqCiAqIE9wdGlvbmFsbHkgdGFrZXMgYSBsaXN0IG9mIFt0eXBlQXJndW1lbnRzXSBmb3IgZ2VuZXJpYyBjbGFzc2VzLiBJZiB0aGUgbGlzdAogKiBpcyBwcm92aWRlZCwgdGhlbiB0aGUgW2tleV0gbXVzdCBiZSBhIGdlbmVyaWMgY2xhc3MgdHlwZSwgYW5kIHRoZSBudW1iZXIgb2YKICogdGhlIHByb3ZpZGVkIHR5cGUgYXJndW1lbnRzIG11c3QgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiB0eXBlIHZhcmlhYmxlcwogKiBkZWNsYXJlZCBieSB0aGUgY2xhc3MuCiAqCiAqIE5vdGUgdGhhdCBzaW5jZSBvbmUgY2Fubm90IG9idGFpbiBhIFtUeXBlXSBvYmplY3QgZnJvbSBhbm90aGVyIGlzb2xhdGUsIHRoaXMKICogZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCB0byBvYnRhaW4gdHlwZSBtaXJyb3JzIG9uIHR5cGVzIG9mIHRoZSBjdXJyZW50CiAqIGlzb2xhdGUuCiAqLwpleHRlcm5hbCBUeXBlTWlycm9yIHJlZmxlY3RUeXBlKFR5cGUga2V5LCBbTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzXSk7CgovKioKICogQSBbTWlycm9yXSByZWZsZWN0cyBzb21lIERhcnQgbGFuZ3VhZ2UgZW50aXR5LgogKgogKiBFdmVyeSBbTWlycm9yXSBvcmlnaW5hdGVzIGZyb20gc29tZSBbTWlycm9yU3lzdGVtXS4KICovCmFic3RyYWN0IGNsYXNzIE1pcnJvciB7fQoKLyoqCiAqIEFuIFtJc29sYXRlTWlycm9yXSByZWZsZWN0cyBhbiBpc29sYXRlLgogKi8KYWJzdHJhY3QgY2xhc3MgSXNvbGF0ZU1pcnJvciBpbXBsZW1lbnRzIE1pcnJvciB7CiAgLyoqCiAgICogQSB1bmlxdWUgbmFtZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBpc29sYXRlIGluIGRlYnVnZ2luZyBtZXNzYWdlcy4KICAgKi8KICBTdHJpbmcgZ2V0IGRlYnVnTmFtZTsKCiAgLyoqCiAgICogV2hldGhlciB0aGlzIG1pcnJvciByZWZsZWN0cyB0aGUgY3VycmVudGx5IHJ1bm5pbmcgaXNvbGF0ZS4KICAgKi8KICBib29sIGdldCBpc0N1cnJlbnQ7CgogIC8qKgogICAqIFRoZSByb290IGxpYnJhcnkgZm9yIHRoZSByZWZsZWN0ZWQgaXNvbGF0ZS4KICAgKi8KICBMaWJyYXJ5TWlycm9yIGdldCByb290TGlicmFyeTsKCiAgLyoqCiAgICogV2hldGhlciBbb3RoZXJdIGlzIGFuIFtJc29sYXRlTWlycm9yXSBvbiB0aGUgc2FtZSBpc29sYXRlIGFzIHRoaXMgbWlycm9yLgogICAqCiAgICogVGhlIGVxdWFsaXR5IGhvbGRzIGlmIGFuZCBvbmx5IGlmCiAgICoKICAgKiAxLiBbb3RoZXJdIGlzIGEgbWlycm9yIG9mIHRoZSBzYW1lIGtpbmQsIGFuZAogICAqIDIuIHRoZSBpc29sYXRlIGJlaW5nIHJlZmxlY3RlZCBieSB0aGlzIG1pcnJvciBpcyB0aGUgc2FtZSBpc29sYXRlIGJlaW5nCiAgICogICAgcmVmbGVjdGVkIGJ5IFtvdGhlcl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7CgogIC8qKgogICAqIExvYWRzIHRoZSBsaWJyYXJ5IGF0IHRoZSBnaXZlbiB1cmkgaW50byB0aGlzIGlzb2xhdGUuCiAgICoKICAgKiBXQVJOSU5HOiBZb3UgYXJlIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gdXNlIElzb2xhdGUuc3Bhd25VcmkgaW5zdGVhZCB3aGVuCiAgICogcG9zc2libGUuIElzb2xhdGVNaXJyb3IubG9hZFVyaSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gc3luY2hyb25vdXMKICAgKiBjb21tdW5pY2F0aW9uIG9yIHNoYXJlZCBzdGF0ZSB3aXRoIGR5bmFtaWNhbGx5IGxvYWRlZCBjb2RlIGlzIG5lZWRlZC4KICAgKgogICAqIElmIGEgbGlicmFyeSB3aXRoIHRoZSBzYW1lIGNhbm9uaWNhbGl6ZWQgdXJpIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLAogICAqIHRoZSBleGlzdGluZyBsaWJyYXJ5IHdpbGwgYmUgcmV0dXJuZWQuIChUaGUgaXNvbGF0ZSB3aWxsIG5vdCBsb2FkIGEgbmV3CiAgICogY29weSBvZiB0aGUgbGlicmFyeS4pCiAgICoKICAgKiBUaGlzIGJlaGF2aW9yIGlzIHNpbWlsYXIgdG8gdGhlIGJlaGF2aW9yIG9mIGFuIGltcG9ydCBzdGF0ZW1lbnQgdGhhdAogICAqIGFwcGVhcnMgaW4gdGhlIHJvb3QgbGlicmFyeSwgZXhjZXB0IHRoYXQgdGhlIGltcG9ydCBzY29wZSBvZiB0aGUgcm9vdAogICAqIGxpYnJhcnkgaXMgbm90IGNoYW5nZWQuCiAgICovCiAgRnV0dXJlPExpYnJhcnlNaXJyb3I+IGxvYWRVcmkoVXJpIHVyaSk7Cn0KCi8qKgogKiBBIFtEZWNsYXJhdGlvbk1pcnJvcl0gcmVmbGVjdHMgc29tZSBlbnRpdHkgZGVjbGFyZWQgaW4gYSBEYXJ0IHByb2dyYW0uCiAqLwphYnN0cmFjdCBjbGFzcyBEZWNsYXJhdGlvbk1pcnJvciBpbXBsZW1lbnRzIE1pcnJvciB7CiAgLyoqCiAgICogVGhlIHNpbXBsZSBuYW1lIGZvciB0aGlzIERhcnQgbGFuZ3VhZ2UgZW50aXR5LgogICAqCiAgICogVGhlIHNpbXBsZSBuYW1lIGlzIGluIG1vc3QgY2FzZXMgdGhlIGlkZW50aWZpZXIgbmFtZSBvZiB0aGUgZW50aXR5LAogICAqIHN1Y2ggYXMgJ215TWV0aG9kJyBmb3IgYSBtZXRob2QsIFs6dm9pZCBteU1ldGhvZCgpIHsuLi59Ol0gb3IgJ215bGlicmFyeScKICAgKiBmb3IgYSBbOmxpYnJhcnkgJ215bGlicmFyeSc7Ol0gZGVjbGFyYXRpb24uCiAgICovCiAgU3ltYm9sIGdldCBzaW1wbGVOYW1lOwoKICAvKioKICAgKiBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgZm9yIHRoaXMgRGFydCBsYW5ndWFnZSBlbnRpdHkuCiAgICoKICAgKiBUaGlzIG5hbWUgaXMgcXVhbGlmaWVkIGJ5IHRoZSBuYW1lIG9mIHRoZSBvd25lci4gRm9yIGluc3RhbmNlLAogICAqIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiBhIG1ldGhvZCAnbWV0aG9kJyBpbiBjbGFzcyAnQ2xhc3MnIGluCiAgICogbGlicmFyeSAnbGlicmFyeScgaXMgJ2xpYnJhcnkuQ2xhc3MubWV0aG9kJy4KICAgKgogICAqIFJldHVybnMgYSBbU3ltYm9sXSBjb25zdHJ1Y3RlZCBmcm9tIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUKICAgKiBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcmVmbGVjdGVlLgogICAqIExldCAqbyogYmUgdGhlIFtvd25lcl0gb2YgdGhpcyBtaXJyb3IsIGxldCAqciogYmUgdGhlIHJlZmxlY3RlZSBvZgogICAqIHRoaXMgbWlycm9yLCBsZXQgKnAqIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQKICAgKiBuYW1lIG9mIHRoZSByZWZsZWN0ZWUgb2YgKm8qLCBhbmQgbGV0ICpzKiBiZSB0aGUgc2ltcGxlIG5hbWUgb2YgKnIqCiAgICogY29tcHV0ZWQgYnkgW3NpbXBsZU5hbWVdLgogICAqIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiAqciogaXMgdGhlCiAgICogY29uY2F0ZW5hdGlvbiBvZiAqcCosICcuJywgYW5kICpzKi4KICAgKgogICAqIEJlY2F1c2UgYW4gaXNvbGF0ZSBjYW4gY29udGFpbiBtb3JlIHRoYW4gb25lIGxpYnJhcnkgd2l0aCB0aGUgc2FtZSBuYW1lIChhdAogICAqIGRpZmZlcmVudCBVUklzKSwgYSBmdWxseS1xdWFsaWZpZWQgbmFtZSBkb2VzIG5vdCB1bmlxdWVseSBpZGVudGlmeSBhbnkKICAgKiBsYW5ndWFnZSBlbnRpdHkuCiAgICovCiAgU3ltYm9sIGdldCBxdWFsaWZpZWROYW1lOwoKICAvKioKICAgKiBBIG1pcnJvciBvbiB0aGUgb3duZXIgb2YgdGhpcyBEYXJ0IGxhbmd1YWdlIGVudGl0eS4KICAgKgogICAqIFRoZSBvd25lciBpcyB0aGUgZGVjbGFyYXRpb24gaW1tZWRpYXRlbHkgc3Vycm91bmRpbmcgdGhlIHJlZmxlY3RlZToKICAgKgogICAqICogRm9yIGEgbGlicmFyeSwgdGhlIG93bmVyIGlzIFs6bnVsbDpdLgogICAqICogRm9yIGEgY2xhc3MgZGVjbGFyYXRpb24sIHR5cGVkZWYgb3IgdG9wIGxldmVsIGZ1bmN0aW9uIG9yIHZhcmlhYmxlLCB0aGUKICAgKiAgIG93bmVyIGlzIHRoZSBlbmNsb3NpbmcgbGlicmFyeS4KICAgKiAqIEZvciBhIG1peGluIGFwcGxpY2F0aW9uIGBTIHdpdGggTWAsIHRoZSBvd25lciBpcyB0aGUgb3duZXIgb2YgYE1gLgogICAqICogRm9yIGEgY29uc3RydWN0b3IsIHRoZSBvd25lciBpcyB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLgogICAqICogRm9yIGEgbWV0aG9kLCBpbnN0YW5jZSB2YXJpYWJsZSBvciBhIHN0YXRpYyB2YXJpYWJsZSwgdGhlIG93bmVyIGlzIHRoZQogICAqICAgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLCB1bmxlc3MgdGhlIGNsYXNzIGlzIGEgbWl4aW4gYXBwbGljYXRpb24KICAgKiAgIGBTIHdpdGggTWAsIGluIHdoaWNoIGNhc2UgdGhlIG93bmVyIGlzIGBNYC4gTm90ZSB0aGF0IGBNYCBtYXkgYmUgYW4KICAgKiAgIGludm9jYXRpb24gb2YgYSBnZW5lcmljLgogICAqICogRm9yIGEgcGFyYW1ldGVyLCBsb2NhbCB2YXJpYWJsZSBvciBsb2NhbCBmdW5jdGlvbiB0aGUgb3duZXIgaXMgdGhlCiAgICogICBpbW1lZGlhdGVseSBlbmNsb3NpbmcgZnVuY3Rpb24uCiAgICovCiAgRGVjbGFyYXRpb25NaXJyb3IgZ2V0IG93bmVyOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gaXMgbGlicmFyeSBwcml2YXRlLgogICAqCiAgICogQWx3YXlzIHJldHVybnMgYGZhbHNlYCBmb3IgYSBsaWJyYXJ5IGRlY2xhcmF0aW9uLAogICAqIG90aGVyd2lzZSByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZGVjbGFyYXRpb24ncyBuYW1lIHN0YXJ0cyB3aXRoIGFuCiAgICogdW5kZXJzY29yZSBjaGFyYWN0ZXIgKGBfYCksIGFuZCBgZmFsc2VgIGlmIGl0IGRvZXNuJ3QuCiAgICovCiAgYm9vbCBnZXQgaXNQcml2YXRlOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgZGVjbGFyYXRpb24gaXMgdG9wLWxldmVsLgogICAqCiAgICogQSBkZWNsYXJhdGlvbiBpcyBjb25zaWRlcmVkIHRvcC1sZXZlbCBpZiBpdHMgW293bmVyXSBpcyBhIFtMaWJyYXJ5TWlycm9yXS4KICAgKi8KICBib29sIGdldCBpc1RvcExldmVsOwoKICAvKioKICAgKiBUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoaXMgRGFydCBsYW5ndWFnZSBlbnRpdHksIG9yIFs6bnVsbDpdIGlmIHRoZQogICAqIGVudGl0eSBpcyBzeW50aGV0aWMuCiAgICoKICAgKiBJZiB0aGUgcmVmbGVjdGVlIGlzIGEgdmFyaWFibGUsIHRoZSByZXR1cm5lZCBsb2NhdGlvbiBnaXZlcyB0aGUgcG9zaXRpb24KICAgKiBvZiB0aGUgdmFyaWFibGUgbmFtZSBhdCBpdHMgcG9pbnQgb2YgZGVjbGFyYXRpb24uCiAgICoKICAgKiBJZiB0aGUgcmVmbGVjdGVlIGlzIGEgbGlicmFyeSwgY2xhc3MsIHR5cGVkZWYsIGZ1bmN0aW9uIG9yIHR5cGUgdmFyaWFibGUKICAgKiB3aXRoIGFzc29jaWF0ZWQgbWV0YWRhdGEsIHRoZSByZXR1cm5lZCBsb2NhdGlvbiBnaXZlcyB0aGUgcG9zaXRpb24gb2YgdGhlCiAgICogZmlyc3QgbWV0YWRhdGEgZGVjbGFyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSByZWZsZWN0ZWUuCiAgICoKICAgKiBPdGhlcndpc2U6CiAgICoKICAgKiBJZiB0aGUgcmVmbGVjdGVlIGlzIGEgbGlicmFyeSwgdGhlIHJldHVybmVkIGxvY2F0aW9uIGdpdmVzIHRoZSBwb3NpdGlvbiBvZgogICAqIHRoZSBrZXl3b3JkICdsaWJyYXJ5JyBhdCB0aGUgcmVmbGVjdGVlJ3MgcG9pbnQgb2YgZGVjbGFyYXRpb24sIGlmIHRoZQogICAqIHJlZmxlY3RlZSBpcyBhIG5hbWVkIGxpYnJhcnksIG9yIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGZpcnN0IGxpbmUgaW4KICAgKiB0aGUgY29tcGlsYXRpb24gdW5pdCBkZWZpbmluZyB0aGUgcmVmbGVjdGVlIGlmIHRoZSByZWZsZWN0ZWUgaXMgYW5vbnltb3VzLgogICAqCiAgICogSWYgdGhlIHJlZmxlY3RlZSBpcyBhbiBhYnN0cmFjdCBjbGFzcywgdGhlIHJldHVybmVkIGxvY2F0aW9uIGdpdmVzIHRoZQogICAqIHBvc2l0aW9uIG9mIHRoZSBrZXl3b3JkICdhYnN0cmFjdCcgYXQgdGhlIHJlZmxlY3RlZSdzIHBvaW50IG9mIGRlY2xhcmF0aW9uLgogICAqIE90aGVyd2lzZSwgaWYgdGhlIHJlZmxlY3RlZSBpcyBhIGNsYXNzLCB0aGUgcmV0dXJuZWQgbG9jYXRpb24gZ2l2ZXMgdGhlCiAgICogcG9zaXRpb24gb2YgdGhlIGtleXdvcmQgJ2NsYXNzJyBhdCB0aGUgcmVmbGVjdGVlJ3MgcG9pbnQgb2YgZGVjbGFyYXRpb24uCiAgICoKICAgKiBJZiB0aGUgcmVmbGVjdGVlIGlzIGEgdHlwZWRlZiB0aGUgcmV0dXJuZWQgbG9jYXRpb24gZ2l2ZXMgdGhlIHBvc2l0aW9uIG9mCiAgICogdGhlIG9mIHRoZSBrZXl3b3JkICd0eXBlZGVmJyBhdCB0aGUgcmVmbGVjdGVlJ3MgcG9pbnQgb2YgZGVjbGFyYXRpb24uCiAgICoKICAgKiBJZiB0aGUgcmVmbGVjdGVlIGlzIGEgZnVuY3Rpb24gd2l0aCBhIGRlY2xhcmVkIHJldHVybiB0eXBlLCB0aGUgcmV0dXJuZWQKICAgKiBsb2NhdGlvbiBnaXZlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHR5cGUgYXQgdGhlCiAgICogcmVmbGVjdGVlJ3MgcG9pbnQgb2YgZGVjbGFyYXRpb24uIE90aGVyd2lzZS4gdGhlIHJldHVybmVkIGxvY2F0aW9uIGdpdmVzCiAgICogdGhlIHBvc2l0aW9uIG9mIHRoZSBmdW5jdGlvbidzIG5hbWUgYXQgdGhlIHJlZmxlY3RlZSdzIHBvaW50IG9mCiAgICogZGVjbGFyYXRpb24uCiAgICoKICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBvcHRpb25hbCBhbmQgbWF5IHRocm93IGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBTb3VyY2VMb2NhdGlvbiBnZXQgbG9jYXRpb247CgogIC8qKgogICAqIEEgbGlzdCBvZiB0aGUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGVjbGFyYXRpb24uCiAgICoKICAgKiBMZXQgKkQqIGJlIHRoZSBkZWNsYXJhdGlvbiB0aGlzIG1pcnJvciByZWZsZWN0cy4KICAgKiBJZiAqRCogaXMgZGVjb3JhdGVkIHdpdGggYW5ub3RhdGlvbnMgKkExLCAuLi4sIEFuKgogICAqIHdoZXJlICpuID4gMCosIHRoZW4gZm9yIGVhY2ggYW5ub3RhdGlvbiAqQWkqIGFzc29jaWF0ZWQKICAgKiB3aXRoICpELCAxIDw9IGkgPD0gbiosIGxldCAqY2kqIGJlIHRoZSBjb25zdGFudCBvYmplY3QKICAgKiBzcGVjaWZpZWQgYnkgKkFpKi4gVGhlbiB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCB3aG9zZQogICAqIG1lbWJlcnMgYXJlIGluc3RhbmNlIG1pcnJvcnMgb24gKmMxLCAuLi4sIGNuKi4KICAgKiBJZiBubyBhbm5vdGF0aW9ucyBhcmUgYXNzb2NpYXRlZCB3aXRoICpEKiwgdGhlbgogICAqIGFuIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQuCiAgICoKICAgKiBJZiBldmFsdWF0aW5nIGFueSBvZiAqYzEsIC4uLiwgY24qIHdvdWxkIGNhdXNlIGEKICAgKiBjb21waWxhdGlvbiBlcnJvcgogICAqIHRoZSBlZmZlY3QgaXMgdGhlIHNhbWUgYXMgaWYgYSBub24tcmVmbGVjdGl2ZSBjb21waWxhdGlvbiBlcnJvcgogICAqIGhhZCBiZWVuIGVuY291bnRlcmVkLgogICAqLwogIExpc3Q8SW5zdGFuY2VNaXJyb3I+IGdldCBtZXRhZGF0YTsKfQoKLyoqCiAqIEFuIFtPYmplY3RNaXJyb3JdIGlzIGEgY29tbW9uIHN1cGVyaW50ZXJmYWNlIG9mIFtJbnN0YW5jZU1pcnJvcl0sCiAqIFtDbGFzc01pcnJvcl0sIGFuZCBbTGlicmFyeU1pcnJvcl0gdGhhdCByZXByZXNlbnRzIHRoZWlyIHNoYXJlZAogKiBmdW5jdGlvbmFsaXR5LgogKgogKiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBtaXJyb3JzIGxpYnJhcnksIHRoZXNlIHR5cGVzIGFyZSBhbGwKICogb2JqZWN0LWxpa2UsIGluIHRoYXQgdGhleSBzdXBwb3J0IG1ldGhvZCBpbnZvY2F0aW9uIGFuZCBmaWVsZAogKiBhY2Nlc3MuICBSZWFsIERhcnQgb2JqZWN0cyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlIFtJbnN0YW5jZU1pcnJvcl0KICogdHlwZS4KICoKICogU2VlIFtJbnN0YW5jZU1pcnJvcl0sIFtDbGFzc01pcnJvcl0sIGFuZCBbTGlicmFyeU1pcnJvcl0uCiAqLwphYnN0cmFjdCBjbGFzcyBPYmplY3RNaXJyb3IgaW1wbGVtZW50cyBNaXJyb3IgewogIC8qKgogICAqIEludm9rZXMgdGhlIG5hbWVkIGZ1bmN0aW9uIGFuZCByZXR1cm5zIGEgbWlycm9yIG9uIHRoZSByZXN1bHQuCiAgICoKICAgKiBMZXQgKm8qIGJlIHRoZSBvYmplY3QgcmVmbGVjdGVkIGJ5IHRoaXMgbWlycm9yLCBsZXQgKmYqIGJlIHRoZSBzaW1wbGUgbmFtZQogICAqIG9mIHRoZSBtZW1iZXIgZGVub3RlZCBieSBbbWVtYmVyTmFtZV0sIGxldCAqYTEsIC4uLiwgYW4qIGJlIHRoZSBlbGVtZW50cwogICAqIG9mIFtwb3NpdGlvbmFsQXJndW1lbnRzXSwgbGV0ICprMSwgLi4uLCBrbSogYmUgdGhlIGlkZW50aWZpZXJzIGRlbm90ZWQgYnkKICAgKiB0aGUgZWxlbWVudHMgb2YgW25hbWVkQXJndW1lbnRzLmtleXNdLCBhbmQgbGV0ICp2MSwgLi4uLCB2bSogYmUgdGhlCiAgICogZWxlbWVudHMgb2YgW25hbWVkQXJndW1lbnRzLnZhbHVlc10uIFRoZW4gdGhpcyBtZXRob2Qgd2lsbCBwZXJmb3JtIHRoZQogICAqIG1ldGhvZCBpbnZvY2F0aW9uICpvLmYoYTEsIC4uLiwgYW4sIGsxOiB2MSwgLi4uLCBrbTogdm0pKiBpbiBhIHNjb3BlIHRoYXQKICAgKiBoYXMgYWNjZXNzIHRvIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgKm8qIChpZiAqbyogaXMgYSBjbGFzcyBvciBsaWJyYXJ5KSBvcgogICAqIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgdGhlIGNsYXNzIG9mICpvKiAob3RoZXJ3aXNlKS4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIHJldHVybnMgYSByZXN1bHQgKnIqLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKICAgKiBjYWxsaW5nIFtyZWZsZWN0XVwoKnIqXCkuCiAgICoKICAgKiBJZiB0aGUgaW52b2NhdGlvbiBjYXVzZXMgYSBjb21waWxhdGlvbiBlcnJvciB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGlmCiAgICogYSBub24tcmVmbGVjdGl2ZSBjb21waWxhdGlvbiBlcnJvciBoYWQgYmVlbiBlbmNvdW50ZXJlZC4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIHRocm93cyBhbiBleGNlcHRpb24gKmUqICh0aGF0IGl0IGRvZXMgbm90IGNhdGNoKSwgdGhpcwogICAqIG1ldGhvZCB0aHJvd3MgKmUqLgogICAqLwogIC8qCiAgICogVE9ETyh0dXJuaWRnZSk6IEhhbmRsZSBhbWJpZ3VvdXMgbmFtZXMuCiAgICogVE9ETyh0dXJuaWRnZSk6IEhhbmRsZSBvcHRpb25hbCAmIG5hbWVkIGFyZ3VtZW50cy4KICAgKi8KICBJbnN0YW5jZU1pcnJvciBpbnZva2UoU3ltYm9sIG1lbWJlck5hbWUsIExpc3QgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgW01hcDxTeW1ib2wsIGR5bmFtaWM+IG5hbWVkQXJndW1lbnRzXSk7CgogIC8qKgogICAqIEludm9rZXMgYSBnZXR0ZXIgYW5kIHJldHVybnMgYSBtaXJyb3Igb24gdGhlIHJlc3VsdC4KICAgKgogICAqIFRoZSBnZXR0ZXIgY2FuIGJlIHRoZSBpbXBsaWNpdCBnZXR0ZXIgZm9yIGEgZmllbGQgb3IgYSB1c2VyLWRlZmluZWQgZ2V0dGVyCiAgICogbWV0aG9kLgogICAqCiAgICogTGV0ICpvKiBiZSB0aGUgb2JqZWN0IHJlZmxlY3RlZCBieSB0aGlzIG1pcnJvciwKICAgKiBsZXQgKmYqIGJlIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgZ2V0dGVyIGRlbm90ZWQgYnkgW2ZpZWxkTmFtZV0uCiAgICoKICAgKiBUaGVuIHRoaXMgbWV0aG9kIHdpbGwgcGVyZm9ybSB0aGUgZ2V0dGVyIGludm9jYXRpb24gKm8uZiogaW4gYSBzY29wZSB0aGF0CiAgICogaGFzIGFjY2VzcyB0byB0aGUgcHJpdmF0ZSBtZW1iZXJzIG9mICpvKiAoaWYgKm8qIGlzIGEgY2xhc3Mgb3IgbGlicmFyeSkgb3IKICAgKiB0aGUgcHJpdmF0ZSBtZW1iZXJzIG9mIHRoZSBjbGFzcyBvZiAqbyogKG90aGVyd2lzZSkuCiAgICoKICAgKiBJZiB0aGlzIG1pcnJvciBpcyBhbiBbSW5zdGFuY2VNaXJyb3JdLCBhbmQgW2ZpZWxkTmFtZV0gZGVub3RlcyBhbiBpbnN0YW5jZQogICAqIG1ldGhvZCBvbiBpdHMgcmVmbGVjdGVlLCB0aGUgcmVzdWx0IG9mIHRoZSBpbnZvY2F0aW9uIGlzIGFuIGluc3RhbmNlCiAgICogbWlycm9yIG9uIGEgY2xvc3VyZSBjb3JyZXNwb25kaW5nIHRvIHRoYXQgbWV0aG9kLgogICAqCiAgICogSWYgdGhpcyBtaXJyb3IgaXMgYSBbTGlicmFyeU1pcnJvcl0sIGFuZCBbZmllbGROYW1lXSBkZW5vdGVzIGEgdG9wLWxldmVsCiAgICogbWV0aG9kIGluIHRoZSBjb3JyZXNwb25kaW5nIGxpYnJhcnksIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gaXMgYW4KICAgKiBpbnN0YW5jZSBtaXJyb3Igb24gYSBjbG9zdXJlIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBtZXRob2QuCiAgICoKICAgKiBJZiB0aGlzIG1pcnJvciBpcyBhIFtDbGFzc01pcnJvcl0sIGFuZCBbZmllbGROYW1lXSBkZW5vdGVzIGEgc3RhdGljIG1ldGhvZAogICAqIGluIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzLCB0aGUgcmVzdWx0IG9mIHRoZSBpbnZvY2F0aW9uIGlzIGFuIGluc3RhbmNlCiAgICogbWlycm9yIG9uIGEgY2xvc3VyZSBjb3JyZXNwb25kaW5nIHRvIHRoYXQgbWV0aG9kLgogICAqCiAgICogSWYgdGhlIGludm9jYXRpb24gcmV0dXJucyBhIHJlc3VsdCAqciosIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHJlc3VsdCBvZgogICAqIGNhbGxpbmcgW3JlZmxlY3RdXCgqcipcKS4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIGNhdXNlcyBhIGNvbXBpbGF0aW9uIGVycm9yLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGlmCiAgICogYSBub24tcmVmbGVjdGl2ZSBjb21waWxhdGlvbiBlcnJvciBoYWQgYmVlbiBlbmNvdW50ZXJlZC4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIHRocm93cyBhbiBleGNlcHRpb24gKmUqICh0aGF0IGl0IGRvZXMgbm90IGNhdGNoKSwgdGhpcwogICAqIG1ldGhvZCB0aHJvd3MgKmUqLgogICAqLwogIC8vIFRPRE8oYWhlKTogUmVtb3ZlIHN0dWZmIGFib3V0IHNjb3BlIGFuZCBwcml2YXRlIG1lbWJlcnMuIFtmaWVsZE5hbWVdIGlzIGEKICAvLyBjYXBhYmlsaXR5IGdpdmluZyBhY2Nlc3MgdG8gcHJpdmF0ZSBtZW1iZXJzLgogIEluc3RhbmNlTWlycm9yIGdldEZpZWxkKFN5bWJvbCBmaWVsZE5hbWUpOwoKICAvKioKICAgKiBJbnZva2VzIGEgc2V0dGVyIGFuZCByZXR1cm5zIGEgbWlycm9yIG9uIHRoZSByZXN1bHQuCiAgICoKICAgKiBUaGUgc2V0dGVyIG1heSBiZSBlaXRoZXIgdGhlIGltcGxpY2l0IHNldHRlciBmb3IgYSBub24tZmluYWwgZmllbGQgb3IgYQogICAqIHVzZXItZGVmaW5lZCBzZXR0ZXIgbWV0aG9kLgogICAqCiAgICogTGV0ICpvKiBiZSB0aGUgb2JqZWN0IHJlZmxlY3RlZCBieSB0aGlzIG1pcnJvciwKICAgKiBsZXQgKmYqIGJlIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgZ2V0dGVyIGRlbm90ZWQgYnkgW2ZpZWxkTmFtZV0sCiAgICogYW5kIGxldCAqYSogYmUgdGhlIG9iamVjdCBib3VuZCB0byBbdmFsdWVdLgogICAqCiAgICogVGhlbiB0aGlzIG1ldGhvZCB3aWxsIHBlcmZvcm0gdGhlIHNldHRlciBpbnZvY2F0aW9uICpvLmYgPSBhKiBpbiBhIHNjb3BlCiAgICogdGhhdCBoYXMgYWNjZXNzIHRvIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgKm8qIChpZiAqbyogaXMgYSBjbGFzcyBvcgogICAqIGxpYnJhcnkpIG9yIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgdGhlIGNsYXNzIG9mICpvKiAob3RoZXJ3aXNlKS4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIHJldHVybnMgYSByZXN1bHQgKnIqLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKICAgKiBjYWxsaW5nIFtyZWZsZWN0XVwoW3ZhbHVlXVwpLgogICAqCiAgICogSWYgdGhlIGludm9jYXRpb24gY2F1c2VzIGEgY29tcGlsYXRpb24gZXJyb3IsIHRoZSBlZmZlY3QgaXMgdGhlIHNhbWUgYXMgaWYKICAgKiBhIG5vbi1yZWZsZWN0aXZlIGNvbXBpbGF0aW9uIGVycm9yIGhhZCBiZWVuIGVuY291bnRlcmVkLgogICAqCiAgICogSWYgdGhlIGludm9jYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiAqZSogKHRoYXQgaXQgZG9lcyBub3QgY2F0Y2gpIHRoaXMKICAgKiBtZXRob2QgdGhyb3dzICplKi4KICAgKi8KICAvKiBUT0RPKHR1cm5pZGdlKTogSGFuZGxlIGFtYmlndW91cyBuYW1lcy4qLwogIEluc3RhbmNlTWlycm9yIHNldEZpZWxkKFN5bWJvbCBmaWVsZE5hbWUsIE9iamVjdCB2YWx1ZSk7CgogIC8qKgogICAqIFBlcmZvcm1zIFtpbnZvY2F0aW9uXSBvbiB0aGUgcmVmbGVjdGVlIG9mIHRoaXMgW09iamVjdE1pcnJvcl0uCiAgICoKICAgKiBFcXVpdmFsZW50IHRvCiAgICoKICAgKiAgICAgaWYgKGludm9jYXRpb24uaXNHZXR0ZXIpIHsKICAgKiAgICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZChpbnZvY2F0aW9uLm1lbWJlck5hbWUpLnJlZmxlY3RlZTsKICAgKiAgICAgfSBlbHNlIGlmIChpbnZvY2F0aW9uLmlzU2V0dGVyKSB7CiAgICogICAgICAgcmV0dXJuIHRoaXMuc2V0RmllbGQoaW52b2NhdGlvbi5tZW1iZXJOYW1lLAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb24ucG9zaXRpb25hbEFyZ3VtZW50c1swXSkucmVmbGVjdGVlOwogICAqICAgICB9IGVsc2UgewogICAqICAgICAgIHJldHVybiB0aGlzLmludm9rZShpbnZvY2F0aW9uLm1lbWJlck5hbWUsCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb24ucG9zaXRpb25hbEFyZ3VtZW50cywKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbi5uYW1lZEFyZ3VtZW50cykucmVmbGVjdGVlOwogICAqICAgICB9CiAgICovCiAgZGVsZWdhdGUoSW52b2NhdGlvbiBpbnZvY2F0aW9uKTsKfQoKLyoqCiAqIEFuIFtJbnN0YW5jZU1pcnJvcl0gcmVmbGVjdHMgYW4gaW5zdGFuY2Ugb2YgYSBEYXJ0IGxhbmd1YWdlIG9iamVjdC4KICovCmFic3RyYWN0IGNsYXNzIEluc3RhbmNlTWlycm9yIGltcGxlbWVudHMgT2JqZWN0TWlycm9yIHsKICAvKioKICAgKiBBIG1pcnJvciBvbiB0aGUgdHlwZSBvZiB0aGUgcmVmbGVjdGVlLgogICAqCiAgICogUmV0dXJucyBhIG1pcnJvciBvbiB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSByZWZsZWN0ZWUuCiAgICogVGhlIGNsYXNzIG9mIHRoZSByZWZsZWN0ZWUgbWF5IGRpZmZlciBmcm9tCiAgICogdGhlIG9iamVjdCByZXR1cm5lZCBieSBpbnZva2luZyBbcnVudGltZVR5cGVdIG9uCiAgICogdGhlIHJlZmxlY3RlZS4KICAgKi8KICBDbGFzc01pcnJvciBnZXQgdHlwZTsKCiAgLyoqCiAgICogV2hldGhlciBbcmVmbGVjdGVlXSB3aWxsIHJldHVybiB0aGUgaW5zdGFuY2UgcmVmbGVjdGVkIGJ5IHRoaXMgbWlycm9yLgogICAqCiAgICogVGhpcyB3aWxsIGFsd2F5cyBiZSB0cnVlIGluIHRoZSBsb2NhbCBjYXNlIChyZWZsZWN0aW5nIGluc3RhbmNlcyBpbiB0aGUKICAgKiBzYW1lIGlzb2xhdGUpLCBidXQgb25seSB0cnVlIGluIHRoZSByZW1vdGUgY2FzZSBpZiB0aGlzIG1pcnJvciByZWZsZWN0cyBhCiAgICogc2ltcGxlIHZhbHVlLgogICAqCiAgICogQSB2YWx1ZSBpcyBzaW1wbGUgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CiAgICoKICAgKiAqIHRoZSB2YWx1ZSBpcyBbOm51bGw6XQogICAqICogdGhlIHZhbHVlIGlzIG9mIHR5cGUgW251bV0KICAgKiAqIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIFtib29sXQogICAqICogdGhlIHZhbHVlIGlzIG9mIHR5cGUgW1N0cmluZ10KICAgKi8KICBib29sIGdldCBoYXNSZWZsZWN0ZWU7CgogIC8qKgogICAqIElmIHRoZSBbSW5zdGFuY2VNaXJyb3JdIHJlZmxlY3RzIGFuIGluc3RhbmNlIGl0IGlzIG1lYW5pbmdmdWwgdG8KICAgKiBoYXZlIGEgbG9jYWwgcmVmZXJlbmNlIHRvLCB3ZSBwcm92aWRlIGFjY2VzcyB0byB0aGUgYWN0dWFsCiAgICogaW5zdGFuY2UgaGVyZS4KICAgKgogICAqIElmIHlvdSBhY2Nlc3MgW3JlZmxlY3RlZV0gd2hlbiBbaGFzUmVmbGVjdGVlXSBpcyBmYWxzZSwgYW4KICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgogICAqLwogIGdldCByZWZsZWN0ZWU7CgogIC8qKgogICAqIFdoZXRoZXIgdGhpcyBtaXJyb3IgaXMgZXF1YWwgdG8gW290aGVyXS4KICAgKgogICAqIFRoZSBlcXVhbGl0eSBob2xkcyBpZiBhbmQgb25seSBpZgogICAqCiAgICogMS4gW290aGVyXSBpcyBhIG1pcnJvciBvZiB0aGUgc2FtZSBraW5kLCBhbmQKICAgKiAyLiBlaXRoZXIKICAgKgogICAqICAgIGEuIFtoYXNSZWZsZWN0ZWVdIGlzIHRydWUgYW5kIHNvIGlzCiAgICogICAgWzppZGVudGljYWwocmVmbGVjdGVlLCBvdGhlci5yZWZsZWN0ZWUpOl0sIG9yCiAgICoKICAgKiAgICBiLiB0aGUgcmVtb3RlIG9iamVjdHMgcmVmbGVjdGVkIGJ5IHRoaXMgbWlycm9yIGFuZCBieSBbb3RoZXJdIGFyZQogICAqICAgIGlkZW50aWNhbC4KICAgKi8KICBib29sIG9wZXJhdG9yID09KG90aGVyKTsKfQoKLyoqCiAqIEEgW0Nsb3N1cmVNaXJyb3JdIHJlZmxlY3RzIGEgY2xvc3VyZS4KICoKICogQSBbQ2xvc3VyZU1pcnJvcl0gcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBpdHMgcmVmbGVjdGVlIGFuZAogKiBpbnRyb3NwZWN0IGl0cyBmdW5jdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIENsb3N1cmVNaXJyb3IgaW1wbGVtZW50cyBJbnN0YW5jZU1pcnJvciB7CiAgLyoqCiAgICogQSBtaXJyb3Igb24gdGhlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsb3N1cmUuCiAgICoKICAgKiBUaGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGltcGxpY2l0IGNsb3N1cmUgb2YgYSBmdW5jdGlvbiBpcyB0aGF0CiAgICogZnVuY3Rpb24uCiAgICoKICAgKiBUaGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYSBbOmNhbGw6XQogICAqIG1ldGhvZCBpcyB0aGF0IFs6Y2FsbDpdIG1ldGhvZC4KICAgKgogICAqIEEgRGFydCBpbXBsZW1lbnRhdGlvbiBtaWdodCBjaG9vc2UgdG8gY3JlYXRlIGEgY2xhc3MgZm9yIGVhY2ggY2xvc3VyZQogICAqIGV4cHJlc3Npb24sIGluIHdoaWNoIGNhc2UgWzpmdW5jdGlvbjpdIHdvdWxkIGJlIHRoZSBzYW1lIGFzCiAgICogWzp0eXBlLmRlY2xhcmF0aW9uc1sjY2FsbF06XS4gQnV0IHRoZSBEYXJ0IGxhbmd1YWdlIG1vZGVsIGRvZXMgbm90IHJlcXVpcmUKICAgKiB0aGlzLiBBIG1vcmUgdHlwaWNhbCBpbXBsZW1lbnRhdGlvbiBpbnZvbHZlcyBhIHNpbmdsZSBjbG9zdXJlIGNsYXNzIGZvcgogICAqIGVhY2ggdHlwZSBzaWduYXR1cmUsIHdoZXJlIHRoZSBjYWxsIG1ldGhvZCBkaXNwYXRjaGVzIHRvIGEgZnVuY3Rpb24gaGVsZAogICAqIGluIHRoZSBjbG9zdXJlIHJhdGhlciB0aGUgY2FsbCBtZXRob2QKICAgKiBkaXJlY3RseSBpbXBsZW1lbnRpbmcgdGhlIGNsb3N1cmUgYm9keS4gU28gb25lIGNhbm5vdCByZWx5IG9uIGNsb3N1cmVzIGZyb20KICAgKiBkaXN0aW5jdCBjbG9zdXJlIGV4cHJlc3Npb25zIGhhdmluZyBkaXN0aW5jdCBjbGFzc2VzIChbOnR5cGU6XSksIGJ1dCBvbmUKICAgKiBjYW4gcmVseSBvbiB0aGVtIGhhdmluZyBkaXN0aW5jdCBmdW5jdGlvbnMgKFs6ZnVuY3Rpb246XSkuCiAgICovCiAgTWV0aG9kTWlycm9yIGdldCBmdW5jdGlvbjsKCiAgLyoqCiAgICogRXhlY3V0ZXMgdGhlIGNsb3N1cmUgYW5kIHJldHVybnMgYSBtaXJyb3Igb24gdGhlIHJlc3VsdC4KICAgKgogICAqIExldCAqZiogYmUgdGhlIGNsb3N1cmUgcmVmbGVjdGVkIGJ5IHRoaXMgbWlycm9yLAogICAqIGxldCAqYTEsIC4uLiwgYW4qIGJlIHRoZSBlbGVtZW50cyBvZiBbcG9zaXRpb25hbEFyZ3VtZW50c10sCiAgICogbGV0ICprMSwgLi4uLCBrbSogYmUgdGhlIGlkZW50aWZpZXJzIGRlbm90ZWQgYnkgdGhlIGVsZW1lbnRzIG9mCiAgICogW25hbWVkQXJndW1lbnRzLmtleXNdLAogICAqIGFuZCBsZXQgKnYxLCAuLi4sIHZtKiBiZSB0aGUgZWxlbWVudHMgb2YgW25hbWVkQXJndW1lbnRzLnZhbHVlc10uCiAgICoKICAgKiBUaGVuIHRoaXMgbWV0aG9kIHdpbGwgcGVyZm9ybSB0aGUgbWV0aG9kIGludm9jYXRpb24KICAgKiAqZihhMSwgLi4uLCBhbiwgazE6IHYxLCAuLi4sIGttOiB2bSkqLgogICAqCiAgICogSWYgdGhlIGludm9jYXRpb24gcmV0dXJucyBhIHJlc3VsdCAqciosIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHJlc3VsdCBvZgogICAqIGNhbGxpbmcgW3JlZmxlY3RdXCgqcipcKS4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIGNhdXNlcyBhIGNvbXBpbGF0aW9uIGVycm9yLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGlmCiAgICogYSBub24tcmVmbGVjdGl2ZSBjb21waWxhdGlvbiBlcnJvciBoYWQgYmVlbiBlbmNvdW50ZXJlZC4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIHRocm93cyBhbiBleGNlcHRpb24gKmUqICh0aGF0IGl0IGRvZXMgbm90IGNhdGNoKSwgdGhpcwogICAqIG1ldGhvZCB0aHJvd3MgKmUqLgogICAqLwogIEluc3RhbmNlTWlycm9yIGFwcGx5KExpc3QgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgW01hcDxTeW1ib2wsIGR5bmFtaWM+IG5hbWVkQXJndW1lbnRzXSk7Cn0KCi8qKgogKiBBIFtMaWJyYXJ5TWlycm9yXSByZWZsZWN0cyBhIERhcnQgbGFuZ3VhZ2UgbGlicmFyeSwgcHJvdmlkaW5nCiAqIGFjY2VzcyB0byB0aGUgdmFyaWFibGVzLCBmdW5jdGlvbnMsIGFuZCBjbGFzc2VzIG9mIHRoZQogKiBsaWJyYXJ5LgogKi8KYWJzdHJhY3QgY2xhc3MgTGlicmFyeU1pcnJvciBpbXBsZW1lbnRzIERlY2xhcmF0aW9uTWlycm9yLCBPYmplY3RNaXJyb3IgewogIC8qKgogICAqIFRoZSBhYnNvbHV0ZSB1cmkgb2YgdGhlIGxpYnJhcnkuCiAgICovCiAgVXJpIGdldCB1cmk7CgogIC8qKgogICAqIFJldHVybnMgYW4gaW1tdXRhYmxlIG1hcCBvZiB0aGUgZGVjbGFyYXRpb25zIGFjdHVhbGx5IGdpdmVuIGluIHRoZSBsaWJyYXJ5LgogICAqCiAgICogVGhpcyBtYXAgaW5jbHVkZXMgYWxsIHJlZ3VsYXIgbWV0aG9kcywgZ2V0dGVycywgc2V0dGVycywgZmllbGRzLCBjbGFzc2VzCiAgICogYW5kIHR5cGVkZWZzIGFjdHVhbGx5IGRlY2xhcmVkIGluIHRoZSBsaWJyYXJ5LiBUaGUgbWFwIGlzIGtleWVkIGJ5IHRoZQogICAqIHNpbXBsZSBuYW1lcyBvZiB0aGUgZGVjbGFyYXRpb25zLgogICAqLwogIE1hcDxTeW1ib2wsIERlY2xhcmF0aW9uTWlycm9yPiBnZXQgZGVjbGFyYXRpb25zOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgbWlycm9yIGlzIGVxdWFsIHRvIFtvdGhlcl0uCiAgICoKICAgKiBUaGUgZXF1YWxpdHkgaG9sZHMgaWYgYW5kIG9ubHkgaWYKICAgKgogICAqIDEuIFtvdGhlcl0gaXMgYSBtaXJyb3Igb2YgdGhlIHNhbWUga2luZCwgYW5kCiAgICogMi4gVGhlIGxpYnJhcnkgYmVpbmcgcmVmbGVjdGVkIGJ5IHRoaXMgbWlycm9yIGFuZCB0aGUgbGlicmFyeSBiZWluZwogICAqICAgIHJlZmxlY3RlZCBieSBbb3RoZXJdIGFyZSB0aGUgc2FtZSBsaWJyYXJ5IGluIHRoZSBzYW1lIGlzb2xhdGUuCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7CgogIC8qKgogICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBpbXBvcnRzIGFuZCBleHBvcnRzIGluIHRoaXMgbGlicmFyeTsKICAgKi8KICBMaXN0PExpYnJhcnlEZXBlbmRlbmN5TWlycm9yPiBnZXQgbGlicmFyeURlcGVuZGVuY2llczsKfQoKLy8vIEEgbWlycm9yIG9uIGFuIGltcG9ydCBvciBleHBvcnQgZGVjbGFyYXRpb24uCmFic3RyYWN0IGNsYXNzIExpYnJhcnlEZXBlbmRlbmN5TWlycm9yIGltcGxlbWVudHMgTWlycm9yIHsKICAvLy8gSXMgYHRydWVgIGlmIHRoaXMgZGVwZW5kZW5jeSBpcyBhbiBpbXBvcnQuCiAgYm9vbCBnZXQgaXNJbXBvcnQ7CgogIC8vLyBJcyBgdHJ1ZWAgaWYgdGhpcyBkZXBlbmRlbmN5IGlzIGFuIGV4cG9ydC4KICBib29sIGdldCBpc0V4cG9ydDsKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBkZXBlbmRlbmN5IGlzIGEgZGVmZXJyZWQgaW1wb3J0LiBPdGhlcndpc2UgcmV0dXJucwogIC8vLyBmYWxzZS4KICBib29sIGdldCBpc0RlZmVycmVkOwoKICAvLy8gUmV0dXJucyB0aGUgbGlicmFyeSBtaXJyb3Igb2YgdGhlIGxpYnJhcnkgdGhhdCBpbXBvcnRzIG9yIGV4cG9ydHMgdGhlCiAgLy8vIFt0YXJnZXRMaWJyYXJ5XS4KICBMaWJyYXJ5TWlycm9yIGdldCBzb3VyY2VMaWJyYXJ5OwoKICAvLy8gUmV0dXJucyB0aGUgbGlicmFyeSBtaXJyb3Igb2YgdGhlIGxpYnJhcnkgdGhhdCBpcyBpbXBvcnRlZCBvciBleHBvcnRlZCwKICAvLy8gb3IgbnVsbCBpZiB0aGUgbGlicmFyeSBpcyBub3QgbG9hZGVkLgogIExpYnJhcnlNaXJyb3IgZ2V0IHRhcmdldExpYnJhcnk7CgogIC8vLyBSZXR1cm5zIHRoZSBwcmVmaXggaWYgdGhpcyBpcyBhIHByZWZpeGVkIGltcG9ydCBhbmQgYG51bGxgIG90aGVyd2lzZS4KICBTeW1ib2wgZ2V0IHByZWZpeDsKCiAgLy8vIFJldHVybnMgdGhlIGxpc3Qgb2Ygc2hvdy9oaWRlIGNvbWJpbmF0b3JzIG9uIHRoZSBpbXBvcnQvZXhwb3J0CiAgLy8vIGRlY2xhcmF0aW9uLgogIExpc3Q8Q29tYmluYXRvck1pcnJvcj4gZ2V0IGNvbWJpbmF0b3JzOwoKICAvLy8gUmV0dXJucyB0aGUgc291cmNlIGxvY2F0aW9uIGZvciB0aGlzIGltcG9ydC9leHBvcnQgZGVjbGFyYXRpb24uCiAgU291cmNlTG9jYXRpb24gZ2V0IGxvY2F0aW9uOwoKICBMaXN0PEluc3RhbmNlTWlycm9yPiBnZXQgbWV0YWRhdGE7CgogIC8vLyBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgY29tcGxldGVzIHdpdGggYSBsaWJyYXJ5IG1pcnJvciBvbiB0aGUgbGlicmFyeSBiZWluZwogIC8vLyBpbXBvcnRlZCBvciBleHBvcnRlZCB3aGVuIGl0IGlzIGxvYWRlZCwgYW5kIGluaXRpYXRlcyBhIGxvYWQgb2YgdGhhdAogIC8vLyBsaWJyYXJ5IGlmIGl0IGlzIG5vdCBsb2FkZWQuCiAgRnV0dXJlPExpYnJhcnlNaXJyb3I+IGxvYWRMaWJyYXJ5KCk7Cn0KCi8vLyBBIG1pcnJvciBvbiBhIHNob3cvaGlkZSBjb21iaW5hdG9yIGRlY2xhcmVkIG9uIGEgbGlicmFyeSBkZXBlbmRlbmN5LgphYnN0cmFjdCBjbGFzcyBDb21iaW5hdG9yTWlycm9yIGltcGxlbWVudHMgTWlycm9yIHsKICAvLy8gVGhlIGxpc3Qgb2YgaWRlbnRpZmllcnMgb24gdGhlIGNvbWJpbmF0b3IuCiAgTGlzdDxTeW1ib2w+IGdldCBpZGVudGlmaWVyczsKCiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIGlzIGEgJ3Nob3cnIGNvbWJpbmF0b3IuCiAgYm9vbCBnZXQgaXNTaG93OwoKICAvLy8gSXMgYHRydWVgIGlmIHRoaXMgaXMgYSAnaGlkZScgY29tYmluYXRvci4KICBib29sIGdldCBpc0hpZGU7Cn0KCi8qKgogKiBBIFtUeXBlTWlycm9yXSByZWZsZWN0cyBhIERhcnQgbGFuZ3VhZ2UgY2xhc3MsIHR5cGVkZWYsCiAqIGZ1bmN0aW9uIHR5cGUgb3IgdHlwZSB2YXJpYWJsZS4KICovCmFic3RyYWN0IGNsYXNzIFR5cGVNaXJyb3IgaW1wbGVtZW50cyBEZWNsYXJhdGlvbk1pcnJvciB7CiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWlycm9yIHJlZmxlY3RzIGR5bmFtaWMsIGEgbm9uLWdlbmVyaWMgY2xhc3Mgb3IKICAgKiB0eXBlZGVmLCBvciBhbiBpbnN0YW50aWF0ZWQgZ2VuZXJpYyBjbGFzcyBvciB0eXBlZGVmIGluIHRoZSBjdXJyZW50CiAgICogaXNvbGF0ZS4gT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLgogICAqLwogIGJvb2wgZ2V0IGhhc1JlZmxlY3RlZFR5cGU7CgogIC8qKgogICAqIElmIFs6aGFzUmVmbGVjdGVkVHlwZTpdIHJldHVybnMgdHJ1ZSwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBbVHlwZV0uCiAgICogT3RoZXJ3aXNlLCBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaXMgdGhyb3duLgogICAqLwogIFR5cGUgZ2V0IHJlZmxlY3RlZFR5cGU7CgogIC8qKgogICAqIEFuIGltbXV0YWJsZSBsaXN0IHdpdGggbWlycm9ycyBmb3IgYWxsIHR5cGUgdmFyaWFibGVzIGZvciB0aGlzIHR5cGUuCiAgICoKICAgKiBJZiB0aGlzIHR5cGUgaXMgYSBnZW5lcmljIGRlY2xhcmF0aW9uIG9yIGFuIGludm9jYXRpb24gb2YgYSBnZW5lcmljCiAgICogZGVjbGFyYXRpb24sIHRoZSByZXR1cm5lZCBsaXN0IGNvbnRhaW5zIG1pcnJvcnMgb24gdGhlIHR5cGUgdmFyaWFibGVzCiAgICogZGVjbGFyZWQgaW4gdGhlIG9yaWdpbmFsIGRlY2xhcmF0aW9uLgogICAqIE90aGVyd2lzZSwgdGhlIHJldHVybmVkIGxpc3QgaXMgZW1wdHkuCiAgICoKICAgKiBUaGlzIGxpc3QgcHJlc2VydmVzIHRoZSBvcmRlciBvZiBkZWNsYXJhdGlvbiBvZiB0aGUgdHlwZSB2YXJpYWJsZXMuCiAgICovCiAgTGlzdDxUeXBlVmFyaWFibGVNaXJyb3I+IGdldCB0eXBlVmFyaWFibGVzOwoKICAvKioKICAgKiBBbiBpbW11dGFibGUgbGlzdCB3aXRoIG1pcnJvcnMgZm9yIGFsbCB0eXBlIGFyZ3VtZW50cyBmb3IKICAgKiB0aGlzIHR5cGUuCiAgICoKICAgKiBJZiB0aGUgcmVmbGVjdGVlIGlzIGFuIGludm9jYXRpb24gb2YgYSBnZW5lcmljIGNsYXNzLAogICAqIHRoZSB0eXBlIGFyZ3VtZW50cyBhcmUgdGhlIGJpbmRpbmdzIG9mIGl0cyB0eXBlIHBhcmFtZXRlcnMuCiAgICogSWYgdGhlIHJlZmxlY3RlZSBpcyB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24gb2YgYSBnZW5lcmljLAogICAqIGl0IGhhcyBubyB0eXBlIGFyZ3VtZW50cyBhbmQgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBsaXN0LgogICAqIElmIHRoZSByZWZsZWN0ZWUgaXMgbm90IGdlbmVyaWMsIHRoZW4KICAgKiBpdCBoYXMgbm8gdHlwZSBhcmd1bWVudHMgYW5kIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgbGlzdC4KICAgKgogICAqIFRoaXMgbGlzdCBwcmVzZXJ2ZXMgdGhlIG9yZGVyIG9mIGRlY2xhcmF0aW9uIG9mIHRoZSB0eXBlIHZhcmlhYmxlcy4KICAgKi8KICBMaXN0PFR5cGVNaXJyb3I+IGdldCB0eXBlQXJndW1lbnRzOwoKICAvKioKICAgKiBJcyB0aGlzIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBvZiB0aGlzIHR5cGU/CiAgICoKICAgKiBGb3IgbW9zdCBjbGFzc2VzLCB0aGV5IGFyZSB0aGVpciBvd24gb3JpZ2luYWwgZGVjbGFyYXRpb24uICBGb3IKICAgKiBnZW5lcmljIGNsYXNzZXMsIGhvd2V2ZXIsIHRoZXJlIGlzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUKICAgKiBvcmlnaW5hbCBjbGFzcyBkZWNsYXJhdGlvbiwgd2hpY2ggaGFzIHVuYm91bmQgdHlwZSB2YXJpYWJsZXMsIGFuZAogICAqIHRoZSBpbnN0YW50aWF0aW9ucyBvZiBnZW5lcmljIGNsYXNzZXMsIHdoaWNoIGhhdmUgYm91bmQgdHlwZQogICAqIHZhcmlhYmxlcy4KICAgKi8KICBib29sIGdldCBpc09yaWdpbmFsRGVjbGFyYXRpb247CgogIC8qKgogICAqIEEgbWlycm9yIG9uIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBvZiB0aGlzIHR5cGUuCiAgICoKICAgKiBGb3IgbW9zdCBjbGFzc2VzLCB0aGV5IGFyZSB0aGVpciBvd24gb3JpZ2luYWwgZGVjbGFyYXRpb24uICBGb3IKICAgKiBnZW5lcmljIGNsYXNzZXMsIGhvd2V2ZXIsIHRoZXJlIGlzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUKICAgKiBvcmlnaW5hbCBjbGFzcyBkZWNsYXJhdGlvbiwgd2hpY2ggaGFzIHVuYm91bmQgdHlwZSB2YXJpYWJsZXMsIGFuZAogICAqIHRoZSBpbnN0YW50aWF0aW9ucyBvZiBnZW5lcmljIGNsYXNzZXMsIHdoaWNoIGhhdmUgYm91bmQgdHlwZQogICAqIHZhcmlhYmxlcy4KICAgKi8KICBUeXBlTWlycm9yIGdldCBvcmlnaW5hbERlY2xhcmF0aW9uOwoKICAvKioKICAgKiBDaGVja3MgdGhlIHN1YnR5cGUgcmVsYXRpb25zaGlwLCBkZW5vdGVkIGJ5IGA8OmAgaW4gdGhlIGxhbmd1YWdlCiAgICogc3BlY2lmaWNhdGlvbi4KICAgKgogICAqIFRoaXMgaXMgdGhlIHR5cGUgcmVsYXRpb25zaGlwIHVzZWQgaW4gYGlzYCB0ZXN0IGNoZWNrcy4KICAgKi8KICBib29sIGlzU3VidHlwZU9mKFR5cGVNaXJyb3Igb3RoZXIpOwoKICAvKioKICAgKiBDaGVja3MgdGhlIGFzc2lnbmFiaWxpdHkgcmVsYXRpb25zaGlwLCBkZW5vdGVkIGJ5IGA8PT5gIGluIHRoZSBsYW5ndWFnZQogICAqIHNwZWNpZmljYXRpb24uCiAgICoKICAgKiBUaGlzIGlzIHRoZSB0eXBlIHJlbGF0aW9uc2hpcCB0ZXN0ZWQgb24gYXNzaWdubWVudCBpbiBjaGVja2VkIG1vZGUuCiAgICovCiAgYm9vbCBpc0Fzc2lnbmFibGVUbyhUeXBlTWlycm9yIG90aGVyKTsKfQoKLyoqCiAqIEEgW0NsYXNzTWlycm9yXSByZWZsZWN0cyBhIERhcnQgbGFuZ3VhZ2UgY2xhc3MuCiAqLwphYnN0cmFjdCBjbGFzcyBDbGFzc01pcnJvciBpbXBsZW1lbnRzIFR5cGVNaXJyb3IsIE9iamVjdE1pcnJvciB7CiAgLyoqCiAgICogQSBtaXJyb3Igb24gdGhlIHN1cGVyY2xhc3Mgb24gdGhlIHJlZmxlY3RlZS4KICAgKgogICAqIElmIHRoaXMgdHlwZSBpcyBbOk9iamVjdDpdLCB0aGUgc3VwZXJjbGFzcyB3aWxsIGJlIG51bGwuCiAgICovCiAgQ2xhc3NNaXJyb3IgZ2V0IHN1cGVyY2xhc3M7CgogIC8qKgogICAqIEEgbGlzdCBvZiBtaXJyb3JzIG9uIHRoZSBzdXBlcmludGVyZmFjZXMgb2YgdGhlIHJlZmxlY3RlZS4KICAgKi8KICBMaXN0PENsYXNzTWlycm9yPiBnZXQgc3VwZXJpbnRlcmZhY2VzOwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIGFic3RyYWN0PwogICAqLwogIGJvb2wgZ2V0IGlzQWJzdHJhY3Q7CgogIC8qKgogICAqIElzIHRoZSByZWZsZWN0ZWUgYW4gZW51bT8KICAgKi8KICBib29sIGdldCBpc0VudW07CgogIC8qKgogICAqIFJldHVybnMgYW4gaW1tdXRhYmxlIG1hcCBvZiB0aGUgZGVjbGFyYXRpb25zIGFjdHVhbGx5IGdpdmVuIGluIHRoZSBjbGFzcwogICAqIGRlY2xhcmF0aW9uLgogICAqCiAgICogVGhpcyBtYXAgaW5jbHVkZXMgYWxsIHJlZ3VsYXIgbWV0aG9kcywgZ2V0dGVycywgc2V0dGVycywgZmllbGRzLAogICAqIGNvbnN0cnVjdG9ycyBhbmQgdHlwZSB2YXJpYWJsZXMgYWN0dWFsbHkgZGVjbGFyZWQgaW4gdGhlIGNsYXNzLiBCb3RoCiAgICogc3RhdGljIGFuZCBpbnN0YW5jZSBtZW1iZXJzIGFyZSBpbmNsdWRlZCwgYnV0IG5vIGluaGVyaXRlZCBtZW1iZXJzIGFyZQogICAqIGluY2x1ZGVkLiBUaGUgbWFwIGlzIGtleWVkIGJ5IHRoZSBzaW1wbGUgbmFtZXMgb2YgdGhlIGRlY2xhcmF0aW9ucy4KICAgKgogICAqIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBpbmhlcml0ZWQgbWVtYmVycy4KICAgKi8KICBNYXA8U3ltYm9sLCBEZWNsYXJhdGlvbk1pcnJvcj4gZ2V0IGRlY2xhcmF0aW9uczsKCiAgLyoqCiAgICogUmV0dXJucyBhIG1hcCBvZiB0aGUgbWV0aG9kcywgZ2V0dGVycyBhbmQgc2V0dGVycyBvZiBhbiBpbnN0YW5jZSBvZiB0aGUKICAgKiBjbGFzcy4KICAgKgogICAqIFRoZSBpbnRlbnQgaXMgdG8gY2FwdHVyZSB0aG9zZSBtZW1iZXJzIHRoYXQgY29uc3RpdHV0ZSB0aGUgQVBJIG9mIGFuCiAgICogaW5zdGFuY2UuIEhlbmNlIGZpZWxkcyBhcmUgbm90IGluY2x1ZGVkLCBidXQgdGhlIGdldHRlcnMgYW5kIHNldHRlcnMKICAgKiBpbXBsaWNpdGx5IGludHJvZHVjZWQgYnkgZmllbGRzIGFyZSBpbmNsdWRlZC4gVGhlIG1hcCBpbmNsdWRlcyBtZXRob2RzLAogICAqIGdldHRlcnMgYW5kIHNldHRlcnMgdGhhdCBhcmUgaW5oZXJpdGVkIGFzIHdlbGwgYXMgdGhvc2UgaW50cm9kdWNlZCBieSB0aGUKICAgKiBjbGFzcyBpdHNlbGYuCiAgICoKICAgKiBUaGUgbWFwIGlzIGtleWVkIGJ5IHRoZSBzaW1wbGUgbmFtZXMgb2YgdGhlIG1lbWJlcnMuCiAgICovCiAgTWFwPFN5bWJvbCwgTWV0aG9kTWlycm9yPiBnZXQgaW5zdGFuY2VNZW1iZXJzOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbWFwIG9mIHRoZSBzdGF0aWMgbWV0aG9kcywgZ2V0dGVycyBhbmQgc2V0dGVycyBvZiB0aGUgY2xhc3MuCiAgICoKICAgKiBUaGUgaW50ZW50IGlzIHRvIGNhcHR1cmUgdGhvc2UgbWVtYmVycyB0aGF0IGNvbnN0aXR1dGUgdGhlIEFQSSBvZiBhIGNsYXNzLgogICAqIEhlbmNlIGZpZWxkcyBhcmUgbm90IGluY2x1ZGVkLCBidXQgdGhlIGdldHRlcnMgYW5kIHNldHRlcnMgaW1wbGljaXRseQogICAqIGludHJvZHVjZWQgYnkgZmllbGRzIGFyZSBpbmNsdWRlZC4KICAgKgogICAqIFRoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIHNpbXBsZSBuYW1lcyBvZiB0aGUgbWVtYmVycy4KICAgKi8KICBNYXA8U3ltYm9sLCBNZXRob2RNaXJyb3I+IGdldCBzdGF0aWNNZW1iZXJzOwoKICAvKioKICAgKiBUaGUgbWl4aW4gb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIElmIHRoaXMgY2xhc3MgaXMgdGhlIHJlc3VsdCBvZiBhIG1peGluIGFwcGxpY2F0aW9uIG9mIHRoZSBmb3JtIFMgd2l0aCBNLAogICAqIHJldHVybnMgYSBjbGFzcyBtaXJyb3Igb24gTS4gT3RoZXJ3aXNlIHJldHVybnMgYSBjbGFzcyBtaXJyb3Igb24KICAgKiB0aGUgcmVmbGVjdGVlLgogICAqLwogIENsYXNzTWlycm9yIGdldCBtaXhpbjsKCiAgLy8gVE9ETyhhaGUpOiBXaGF0IGFib3V0OgogIC8vIC8vLyBGaW5kcyB0aGUgaW5zdGFuY2UgbWVtYmVyIG5hbWVkIFtuYW1lXSBkZWNsYXJlZCBvciBpbmhlcml0ZWQgaW4gdGhlCiAgLy8gLy8vIHJlZmxlY3RlZCBjbGFzcy4KICAvLyBEZWNsYXJhdGlvbk1pcnJvciBpbnN0YW5jZUxvb2t1cChTeW1ib2wgbmFtZSk7CgogIC8qKgogICAqIEludm9rZXMgdGhlIG5hbWVkIGNvbnN0cnVjdG9yIGFuZCByZXR1cm5zIGEgbWlycm9yIG9uIHRoZSByZXN1bHQuCiAgICoKICAgKiBMZXQgKmMqIGJlIHRoZSBjbGFzcyByZWZsZWN0ZWQgYnkgdGhpcyBtaXJyb3IsCiAgICogbGV0ICphMSwgLi4uLCBhbiogYmUgdGhlIGVsZW1lbnRzIG9mIFtwb3NpdGlvbmFsQXJndW1lbnRzXSwKICAgKiBsZXQgKmsxLCAuLi4sIGttKiBiZSB0aGUgaWRlbnRpZmllcnMgZGVub3RlZCBieSB0aGUgZWxlbWVudHMgb2YKICAgKiBbbmFtZWRBcmd1bWVudHMua2V5c10sCiAgICogYW5kIGxldCAqdjEsIC4uLiwgdm0qIGJlIHRoZSBlbGVtZW50cyBvZiBbbmFtZWRBcmd1bWVudHMudmFsdWVzXS4KICAgKgogICAqIElmIFtjb25zdHJ1Y3Rvck5hbWVdIHdhcyBjcmVhdGVkIGZyb20gdGhlIGVtcHR5IHN0cmluZywgdGhlbiB0aGlzIG1ldGhvZAogICAqIHdpbGwgZXhlY3V0ZSB0aGUgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbgogICAqICpuZXcgYyhhMSwgLi4uLCBhbiwgazE6IHYxLCAuLi4sIGttOiB2bSkqIGluIGEgc2NvcGUgdGhhdCBoYXMgYWNjZXNzIHRvCiAgICogdGhlIHByaXZhdGUgbWVtYmVycyBvZiAqYyouCiAgICoKICAgKiBPdGhlcndpc2UsIGxldCAqZiogYmUgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBjb25zdHJ1Y3RvciBkZW5vdGVkIGJ5CiAgICogW2NvbnN0cnVjdG9yTmFtZV0uIFRoZW4gdGhpcyBtZXRob2Qgd2lsbCBleGVjdXRlIHRoZSBpbnN0YW5jZSBjcmVhdGlvbgogICAqIGV4cHJlc3Npb24gKm5ldyBjLmYoYTEsIC4uLiwgYW4sIGsxOiB2MSwgLi4uLCBrbTogdm0pKiBpbiBhIHNjb3BlIHRoYXQgaGFzCiAgICogYWNjZXNzIHRvIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgKmMqLgogICAqCiAgICogSW4gZWl0aGVyIGNhc2U6CiAgICoKICAgKiAqIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHJlc3VsdCAqciosIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlCiAgICogICByZXN1bHQgb2YgY2FsbGluZyBbcmVmbGVjdF1cKCpyKlwpLgogICAqICogSWYgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiBjYXVzZXMgYSBjb21waWxhdGlvbiBlcnJvciwgdGhlIGVmZmVjdCBpcwogICAqICAgdGhlIHNhbWUgYXMgaWYgYSBub24tcmVmbGVjdGl2ZSBjb21waWxhdGlvbiBlcnJvciBoYWQgYmVlbiBlbmNvdW50ZXJlZC4KICAgKiAqIElmIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiAqZSogKHRoYXQgaXQgZG9lcyBub3QKICAgKiAgIGNhdGNoKSwgdGhpcyBtZXRob2QgdGhyb3dzICplKi4KICAgKi8KICBJbnN0YW5jZU1pcnJvciBuZXdJbnN0YW5jZShTeW1ib2wgY29uc3RydWN0b3JOYW1lLCBMaXN0IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIFtNYXA8U3ltYm9sLCBkeW5hbWljPiBuYW1lZEFyZ3VtZW50c10pOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgbWlycm9yIGlzIGVxdWFsIHRvIFtvdGhlcl0uCiAgICoKICAgKiBUaGUgZXF1YWxpdHkgaG9sZHMgaWYgYW5kIG9ubHkgaWYKICAgKgogICAqIDEuIFtvdGhlcl0gaXMgYSBtaXJyb3Igb2YgdGhlIHNhbWUga2luZCwgYW5kCiAgICogMi4gVGhpcyBtaXJyb3IgYW5kIFtvdGhlcl0gcmVmbGVjdCB0aGUgc2FtZSBjbGFzcy4KICAgKgogICAqIE5vdGUgdGhhdCBpZiB0aGUgcmVmbGVjdGVkIGNsYXNzIGlzIGFuIGludm9jYXRpb24gb2YgYSBnZW5lcmljIGNsYXNzLCAyLgogICAqIGltcGxpZXMgdGhhdCB0aGUgcmVmbGVjdGVkIGNsYXNzIGFuZCBbb3RoZXJdIGhhdmUgZXF1YWwgdHlwZSBhcmd1bWVudHMuCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7CgogIC8qKgogICAqIFJldHVybnMgd2hldGhlciB0aGUgY2xhc3MgZGVub3RlZCBieSB0aGUgcmVjZWl2ZXIgaXMgYSBzdWJjbGFzcyBvZiB0aGUKICAgKiBjbGFzcyBkZW5vdGVkIGJ5IHRoZSBhcmd1bWVudC4KICAgKgogICAqIE5vdGUgdGhhdCB0aGUgc3ViY2xhc3MgcmVsYXRpb25zaGlwIGlzIHJlZmxleGl2ZS4KICAgKi8KICBib29sIGlzU3ViY2xhc3NPZihDbGFzc01pcnJvciBvdGhlcik7Cn0KCi8qKgogKiBBIFtGdW5jdGlvblR5cGVNaXJyb3JdIHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgYSBmdW5jdGlvbiBpbiB0aGUKICogRGFydCBsYW5ndWFnZS4KICovCmFic3RyYWN0IGNsYXNzIEZ1bmN0aW9uVHlwZU1pcnJvciBpbXBsZW1lbnRzIENsYXNzTWlycm9yIHsKICAvKioKICAgKiBSZXR1cm5zIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcmVmbGVjdGVlLgogICAqLwogIFR5cGVNaXJyb3IgZ2V0IHJldHVyblR5cGU7CgogIC8qKgogICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgdGhlIHJlZmxlY3RlZS4KICAgKi8KICBMaXN0PFBhcmFtZXRlck1pcnJvcj4gZ2V0IHBhcmFtZXRlcnM7CgogIC8qKgogICAqIEEgbWlycm9yIG9uIHRoZSBbOmNhbGw6XSBtZXRob2QgZm9yIHRoZSByZWZsZWN0ZWUuCiAgICovCiAgLy8gVGhpcyBpcyBvbmx5IGhlcmUgYmVjYXVzZSBpbiB0aGUgcGFzdCB0aGUgVk0gZGlkIG5vdCBpbXBsZW1lbnQgYSBjYWxsCiAgLy8gbWV0aG9kIG9uIGNsb3N1cmVzLgogIE1ldGhvZE1pcnJvciBnZXQgY2FsbE1ldGhvZDsKfQoKLyoqCiAqIEEgW1R5cGVWYXJpYWJsZU1pcnJvcl0gcmVwcmVzZW50cyBhIHR5cGUgcGFyYW1ldGVyIG9mIGEgZ2VuZXJpYyB0eXBlLgogKi8KYWJzdHJhY3QgY2xhc3MgVHlwZVZhcmlhYmxlTWlycm9yIGV4dGVuZHMgVHlwZU1pcnJvciB7CiAgLyoqCiAgICogQSBtaXJyb3Igb24gdGhlIHR5cGUgdGhhdCBpcyB0aGUgdXBwZXIgYm91bmQgb2YgdGhpcyB0eXBlIHZhcmlhYmxlLgogICAqLwogIFR5cGVNaXJyb3IgZ2V0IHVwcGVyQm91bmQ7CgogIC8qKgogICAqIElzIHRoZSByZWZsZWN0ZWUgc3RhdGljPwogICAqCiAgICogRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgbWlycm9ycyBsaWJyYXJ5LCB0eXBlIHZhcmlhYmxlcyBhcmUgY29uc2lkZXJlZAogICAqIG5vbi1zdGF0aWMuCiAgICovCiAgYm9vbCBnZXQgaXNTdGF0aWM7CgogIC8qKgogICAqIFdoZXRoZXIgW290aGVyXSBpcyBhIFtUeXBlVmFyaWFibGVNaXJyb3JdIG9uIHRoZSBzYW1lIHR5cGUgdmFyaWFibGUgYXMgdGhpcwogICAqIG1pcnJvci4KICAgKgogICAqIFRoZSBlcXVhbGl0eSBob2xkcyBpZiBhbmQgb25seSBpZgogICAqCiAgICogMS4gW290aGVyXSBpcyBhIG1pcnJvciBvZiB0aGUgc2FtZSBraW5kLCBhbmQKICAgKiAyLiBbOnNpbXBsZU5hbWUgPT0gb3RoZXIuc2ltcGxlTmFtZTpdIGFuZCBbOm93bmVyID09IG90aGVyLm93bmVyOl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7Cn0KCi8qKgogKiBBIFtUeXBlZGVmTWlycm9yXSByZXByZXNlbnRzIGEgdHlwZWRlZiBpbiBhIERhcnQgbGFuZ3VhZ2UgcHJvZ3JhbS4KICovCmFic3RyYWN0IGNsYXNzIFR5cGVkZWZNaXJyb3IgaW1wbGVtZW50cyBUeXBlTWlycm9yIHsKICAvKioKICAgKiBUaGUgZGVmaW5pbmcgdHlwZSBmb3IgdGhpcyB0eXBlZGVmLgogICAqCiAgICogSWYgdGhlIHR5cGUgcmVmZXJyZWQgdG8gYnkgdGhlIHJlZmxlY3RlZSBpcyBhIGZ1bmN0aW9uIHR5cGUgKkYqLCB0aGUKICAgKiByZXN1bHQgd2lsbCBiZSBbOkZ1bmN0aW9uVHlwZU1pcnJvcjpdIHJlZmxlY3RpbmcgKkYqIHdoaWNoIGlzIGFic3RyYWN0CiAgICogYW5kIGhhcyBhbiBhYnN0cmFjdCBtZXRob2QgWzpjYWxsOl0gd2hvc2Ugc2lnbmF0dXJlIGNvcnJlc3BvbmRzIHRvICpGKi4KICAgKiBGb3IgaW5zdGFuY2UgWzp2b2lkIGYoaW50KTpdIGlzIHRoZSByZWZlcmVudCBmb3IgWzp0eXBlZGVmIHZvaWQgZihpbnQpOl0uCiAgICovCiAgRnVuY3Rpb25UeXBlTWlycm9yIGdldCByZWZlcmVudDsKfQoKLyoqCiAqIEEgW01ldGhvZE1pcnJvcl0gcmVmbGVjdHMgYSBEYXJ0IGxhbmd1YWdlIGZ1bmN0aW9uLCBtZXRob2QsCiAqIGNvbnN0cnVjdG9yLCBnZXR0ZXIsIG9yIHNldHRlci4KICovCmFic3RyYWN0IGNsYXNzIE1ldGhvZE1pcnJvciBpbXBsZW1lbnRzIERlY2xhcmF0aW9uTWlycm9yIHsKICAvKioKICAgKiBBIG1pcnJvciBvbiB0aGUgcmV0dXJuIHR5cGUgZm9yIHRoZSByZWZsZWN0ZWUuCiAgICovCiAgVHlwZU1pcnJvciBnZXQgcmV0dXJuVHlwZTsKCiAgLyoqCiAgICogVGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgcmVmbGVjdGVlLCBpZiBhdmFpbGFibGUuIE90aGVyd2lzZSBudWxsLgogICAqLwogIFN0cmluZyBnZXQgc291cmNlOwoKICAvKioKICAgKiBBIGxpc3Qgb2YgbWlycm9ycyBvbiB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIHJlZmxlY3RlZS4KICAgKi8KICBMaXN0PFBhcmFtZXRlck1pcnJvcj4gZ2V0IHBhcmFtZXRlcnM7CgogIC8qKgogICAqIEEgZnVuY3Rpb24gaXMgY29uc2lkZXJlZCBub24tc3RhdGljIGlmZiBpdCBpcyBwZXJtaXRlZCB0byByZWZlciB0byAndGhpcycuCiAgICoKICAgKiBOb3RlIHRoYXQgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvcnMgYXJlIGNvbnNpZGVyZWQgbm9uLXN0YXRpYywgd2hlcmVhcwogICAqIGZhY3RvcnkgY29uc3RydWN0b3JzIGFyZSBjb25zaWRlcmVkIHN0YXRpYy4KICAgKi8KICBib29sIGdldCBpc1N0YXRpYzsKCiAgLyoqCiAgICogSXMgdGhlIHJlZmxlY3RlZSBhYnN0cmFjdD8KICAgKi8KICBib29sIGdldCBpc0Fic3RyYWN0OwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlZmxlY3RlZSBpcyBzeW50aGV0aWMsIGFuZCByZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KICAgKgogICAqIEEgcmVmbGVjdGVlIGlzIHN5bnRoZXRpYyBpZiBpdCBpcyBhIGdldHRlciBvciBzZXR0ZXIgaW1wbGljaXRseSBpbnRyb2R1Y2VkCiAgICogZm9yIGEgZmllbGQgb3IgVHlwZSwgb3IgaWYgaXQgaXMgYSBjb25zdHJ1Y3RvciB0aGF0IHdhcyBpbXBsaWNpdGx5CiAgICogaW50cm9kdWNlZCBhcyBhIGRlZmF1bHQgY29uc3RydWN0b3Igb3IgYXMgcGFydCBvZiBhIG1peGluIGFwcGxpY2F0aW9uLgogICAqLwogIGJvb2wgZ2V0IGlzU3ludGhldGljOwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIGEgcmVndWxhciBmdW5jdGlvbiBvciBtZXRob2Q/CiAgICoKICAgKiBBIGZ1bmN0aW9uIG9yIG1ldGhvZCBpcyByZWd1bGFyIGlmIGl0IGlzIG5vdCBhIGdldHRlciwgc2V0dGVyLCBvcgogICAqIGNvbnN0cnVjdG9yLiAgTm90ZSB0aGF0IG9wZXJhdG9ycywgYnkgdGhpcyBkZWZpbml0aW9uLCBhcmUKICAgKiByZWd1bGFyIG1ldGhvZHMuCiAgICovCiAgYm9vbCBnZXQgaXNSZWd1bGFyTWV0aG9kOwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIGFuIG9wZXJhdG9yPwogICAqLwogIGJvb2wgZ2V0IGlzT3BlcmF0b3I7CgogIC8qKgogICAqIElzIHRoZSByZWZsZWN0ZWUgYSBnZXR0ZXI/CiAgICovCiAgYm9vbCBnZXQgaXNHZXR0ZXI7CgogIC8qKgogICAqIElzIHRoZSByZWZsZWN0ZWUgYSBzZXR0ZXI/CiAgICovCiAgYm9vbCBnZXQgaXNTZXR0ZXI7CgogIC8qKgogICAqIElzIHRoZSByZWZsZWN0ZWUgYSBjb25zdHJ1Y3Rvcj8KICAgKi8KICBib29sIGdldCBpc0NvbnN0cnVjdG9yOwoKICAvKioKICAgKiBUaGUgY29uc3RydWN0b3IgbmFtZSBmb3IgbmFtZWQgY29uc3RydWN0b3JzIGFuZCBmYWN0b3J5IG1ldGhvZHMuCiAgICoKICAgKiBGb3IgdW5uYW1lZCBjb25zdHJ1Y3RvcnMsIHRoaXMgaXMgdGhlIGVtcHR5IHN0cmluZy4gIEZvcgogICAqIG5vbi1jb25zdHJ1Y3RvcnMsIHRoaXMgaXMgdGhlIGVtcHR5IHN0cmluZy4KICAgKgogICAqIEZvciBleGFtcGxlLCBbOidiYXInOl0gaXMgdGhlIGNvbnN0cnVjdG9yIG5hbWUgZm9yIGNvbnN0cnVjdG9yCiAgICogWzpGb28uYmFyOl0gb2YgdHlwZSBbOkZvbzpdLgogICAqLwogIFN5bWJvbCBnZXQgY29uc3RydWN0b3JOYW1lOwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIGEgY29uc3QgY29uc3RydWN0b3I/CiAgICovCiAgYm9vbCBnZXQgaXNDb25zdENvbnN0cnVjdG9yOwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3Rvcj8KICAgKi8KICBib29sIGdldCBpc0dlbmVyYXRpdmVDb25zdHJ1Y3RvcjsKCiAgLyoqCiAgICogSXMgdGhlIHJlZmxlY3RlZSBhIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yPwogICAqLwogIGJvb2wgZ2V0IGlzUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcjsKCiAgLyoqCiAgICogSXMgdGhlIHJlZmxlY3RlZSBhIGZhY3RvcnkgY29uc3RydWN0b3I/CiAgICovCiAgYm9vbCBnZXQgaXNGYWN0b3J5Q29uc3RydWN0b3I7CgogIC8qKgogICAqIFdoZXRoZXIgdGhpcyBtaXJyb3IgaXMgZXF1YWwgdG8gW290aGVyXS4KICAgKgogICAqIFRoZSBlcXVhbGl0eSBob2xkcyBpZiBhbmQgb25seSBpZgogICAqCiAgICogMS4gW290aGVyXSBpcyBhIG1pcnJvciBvZiB0aGUgc2FtZSBraW5kLCBhbmQKICAgKiAyLiBbOnNpbXBsZU5hbWUgPT0gb3RoZXIuc2ltcGxlTmFtZTpdIGFuZCBbOm93bmVyID09IG90aGVyLm93bmVyOl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7Cn0KCi8qKgogKiBBIFtWYXJpYWJsZU1pcnJvcl0gcmVmbGVjdHMgYSBEYXJ0IGxhbmd1YWdlIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgogKi8KYWJzdHJhY3QgY2xhc3MgVmFyaWFibGVNaXJyb3IgaW1wbGVtZW50cyBEZWNsYXJhdGlvbk1pcnJvciB7CiAgLyoqCiAgICogUmV0dXJucyBhIG1pcnJvciBvbiB0aGUgdHlwZSBvZiB0aGUgcmVmbGVjdGVlLgogICAqLwogIFR5cGVNaXJyb3IgZ2V0IHR5cGU7CgogIC8qKgogICAqIFJldHVybnMgWzp0cnVlOl0gaWYgdGhlIHJlZmxlY3RlZSBpcyBhIHN0YXRpYyB2YXJpYWJsZS4KICAgKiBPdGhlcndpc2UgcmV0dXJucyBbOmZhbHNlOl0uCiAgICoKICAgKiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBtaXJyb3IgbGlicmFyeSwgdG9wLWxldmVsIHZhcmlhYmxlcyBhcmUKICAgKiBpbXBsaWNpdGx5IGRlY2xhcmVkIHN0YXRpYy4KICAgKi8KICBib29sIGdldCBpc1N0YXRpYzsKCiAgLyoqCiAgICogUmV0dXJucyBbOnRydWU6XSBpZiB0aGUgcmVmbGVjdGVlIGlzIGEgZmluYWwgdmFyaWFibGUuCiAgICogT3RoZXJ3aXNlIHJldHVybnMgWzpmYWxzZTpdLgogICAqLwogIGJvb2wgZ2V0IGlzRmluYWw7CgogIC8qKgogICAqIFJldHVybnMgWzp0cnVlOl0gaWYgdGhlIHJlZmxlY3RlZSBpcyBkZWNsYXJlZCBbOmNvbnN0Ol0uCiAgICogT3RoZXJ3aXNlIHJldHVybnMgWzpmYWxzZTpdLgogICAqLwogIGJvb2wgZ2V0IGlzQ29uc3Q7CgogIC8qKgogICAqIFdoZXRoZXIgdGhpcyBtaXJyb3IgaXMgZXF1YWwgdG8gW290aGVyXS4KICAgKgogICAqIFRoZSBlcXVhbGl0eSBob2xkcyBpZiBhbmQgb25seSBpZgogICAqCiAgICogMS4gW290aGVyXSBpcyBhIG1pcnJvciBvZiB0aGUgc2FtZSBraW5kLCBhbmQKICAgKiAyLiBbOnNpbXBsZU5hbWUgPT0gb3RoZXIuc2ltcGxlTmFtZTpdIGFuZCBbOm93bmVyID09IG90aGVyLm93bmVyOl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7Cn0KCi8qKgogKiBBIFtQYXJhbWV0ZXJNaXJyb3JdIHJlZmxlY3RzIGEgRGFydCBmb3JtYWwgcGFyYW1ldGVyIGRlY2xhcmF0aW9uLgogKi8KYWJzdHJhY3QgY2xhc3MgUGFyYW1ldGVyTWlycm9yIGltcGxlbWVudHMgVmFyaWFibGVNaXJyb3IgewogIC8qKgogICAqIEEgbWlycm9yIG9uIHRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyLgogICAqLwogIFR5cGVNaXJyb3IgZ2V0IHR5cGU7CgogIC8qKgogICAqIFJldHVybnMgWzp0cnVlOl0gaWYgdGhlIHJlZmxlY3RlZSBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuCiAgICogT3RoZXJ3aXNlIHJldHVybnMgWzpmYWxzZTpdLgogICAqLwogIGJvb2wgZ2V0IGlzT3B0aW9uYWw7CgogIC8qKgogICAqIFJldHVybnMgWzp0cnVlOl0gaWYgdGhlIHJlZmxlY3RlZSBpcyBhIG5hbWVkIHBhcmFtZXRlci4KICAgKiBPdGhlcndpc2UgcmV0dXJucyBbOmZhbHNlOl0uCiAgICovCiAgYm9vbCBnZXQgaXNOYW1lZDsKCiAgLyoqCiAgICogUmV0dXJucyBbOnRydWU6XSBpZiB0aGUgcmVmbGVjdGVlIGhhcyBleHBsaWNpdGx5IGRlY2xhcmVkIGEgZGVmYXVsdCB2YWx1ZS4KICAgKiBPdGhlcndpc2UgcmV0dXJucyBbOmZhbHNlOl0uCiAgICovCiAgYm9vbCBnZXQgaGFzRGVmYXVsdFZhbHVlOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFuIG9wdGlvbmFsIHBhcmFtZXRlci4KICAgKgogICAqIFJldHVybnMgYW4gW0luc3RhbmNlTWlycm9yXSBvbiB0aGUgKGNvbXBpbGUtdGltZSBjb25zdGFudCkKICAgKiBkZWZhdWx0IHZhbHVlIGZvciBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuCiAgICogSWYgbm8gZGVmYXVsdCB2YWx1ZSBpcyBkZWNsYXJlZCwgaXQgZGVmYXVsdHMgdG8gYG51bGxgCiAgICogYW5kIGEgbWlycm9yIG9mIGBudWxsYCBpcyByZXR1cm5lZC4KICAgKgogICAqIFJldHVybnMgYG51bGxgIGZvciBhIHJlcXVpcmVkIHBhcmFtZXRlci4KICAgKi8KICBJbnN0YW5jZU1pcnJvciBnZXQgZGVmYXVsdFZhbHVlOwp9CgovKioKICogQSBbU291cmNlTG9jYXRpb25dIGRlc2NyaWJlcyB0aGUgc3BhbiBvZiBhbiBlbnRpdHkgaW4gRGFydCBzb3VyY2UgY29kZS4KICovCmFic3RyYWN0IGNsYXNzIFNvdXJjZUxvY2F0aW9uIHsKICAvKioKICAgKiBUaGUgMS1iYXNlZCBsaW5lIG51bWJlciBmb3IgdGhpcyBzb3VyY2UgbG9jYXRpb24uCiAgICoKICAgKiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhhdCB0aGUgbGluZSBudW1iZXIgaXMgdW5rbm93bi4KICAgKi8KICBpbnQgZ2V0IGxpbmU7CgogIC8qKgogICAqIFRoZSAxLWJhc2VkIGNvbHVtbiBudW1iZXIgZm9yIHRoaXMgc291cmNlIGxvY2F0aW9uLgogICAqCiAgICogQSB2YWx1ZSBvZiAwIG1lYW5zIHRoYXQgdGhlIGNvbHVtbiBudW1iZXIgaXMgdW5rbm93bi4KICAgKi8KICBpbnQgZ2V0IGNvbHVtbjsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgVVJJIHdoZXJlIHRoZSBzb3VyY2Ugb3JpZ2luYXRlZC4KICAgKi8KICBVcmkgZ2V0IHNvdXJjZVVyaTsKfQoKLyoqCiAqIENsYXNzIHVzZWQgZm9yIGVuY29kaW5nIGNvbW1lbnRzIGFzIG1ldGFkYXRhIGFubm90YXRpb25zLgogKi8KY2xhc3MgQ29tbWVudCB7CiAgLyoqCiAgICogVGhlIGNvbW1lbnQgdGV4dCBhcyB3cml0dGVuIGluIHRoZSBzb3VyY2UgdGV4dC4KICAgKi8KICBmaW5hbCBTdHJpbmcgdGV4dDsKCiAgLyoqCiAgICogVGhlIGNvbW1lbnQgdGV4dCB3aXRob3V0IHRoZSBzdGFydCwgZW5kLCBhbmQgcGFkZGluZyB0ZXh0LgogICAqCiAgICogRm9yIGV4YW1wbGUsIGlmIFt0ZXh0XSBpcyBbOiAvKiogQ29tbWVudCB0ZXh0LiAqLyA6XSB0aGVuIHRoZSBbdHJpbW1lZFRleHRdCiAgICogaXMgWzogQ29tbWVudCB0ZXh0LiA6XS4KICAgKi8KICBmaW5hbCBTdHJpbmcgdHJpbW1lZFRleHQ7CgogIC8qKgogICAqIElzIFs6dHJ1ZTpdIGlmIHRoaXMgY29tbWVudCBpcyBhIGRvY3VtZW50YXRpb24gY29tbWVudC4KICAgKgogICAqIFRoYXQgaXMsIHRoYXQgdGhlIGNvbW1lbnQgaXMgZWl0aGVyIGVuY2xvc2VkIGluIFs6IC8qKiAuLi4gKi8gOl0gb3Igc3RhcnRzCiAgICogd2l0aCBbOiAvLy8gOl0uCiAgICovCiAgZmluYWwgYm9vbCBpc0RvY0NvbW1lbnQ7CgogIGNvbnN0IENvbW1lbnQodGhpcy50ZXh0LCB0aGlzLnRyaW1tZWRUZXh0LCB0aGlzLmlzRG9jQ29tbWVudCk7Cn0KCi8qKgogKiBBbm5vdGF0aW9uIGRlc2NyaWJpbmcgaG93ICJkYXJ0Om1pcnJvcnMiIGlzIHVzZWQgKEVYUEVSSU1FTlRBTCkuCiAqCiAqIFdoZW4gdXNlZCBhcyBtZXRhZGF0YSBvbiBhbiBpbXBvcnQgb2YgImRhcnQ6bWlycm9ycyIgaW4gbGlicmFyeSAqTCosIHRoaXMKICogY2xhc3MgZGVzY3JpYmVzIGhvdyAiZGFydDptaXJyb3JzIiBpcyB1c2VkIGJ5IGxpYnJhcnkgKkwqIHVubGVzcyBvdmVycmlkZGVuLgogKiBTZWUgW292ZXJyaWRlXS4KICoKICogVGhlIGZvbGxvd2luZyB0ZXh0IGlzIG5vbi1ub3JtYXRpdmU6CiAqCiAqIEluIHNvbWUgc2NlbmFyaW9zLCBmb3IgZXhhbXBsZSwgd2hlbiBtaW5pZnlpbmcgRGFydCBjb2RlLCBvciB3aGVuIGdlbmVyYXRpbmcKICogSmF2YVNjcmlwdCBjb2RlIGZyb20gYSBEYXJ0IHByb2dyYW0sIHRoZSBzaXplIGFuZCBwZXJmb3JtYW5jZSBvZiB0aGUgb3V0cHV0CiAqIGNhbiBzdWZmZXIgZnJvbSB1c2Ugb2YgcmVmbGVjdGlvbi4gIEluIHRob3NlIGNhc2VzLCB0ZWxsaW5nIHRoZSBjb21waWxlcgogKiB3aGF0IGlzIHVzZWQsIGNhbiBoYXZlIGEgc2lnbmlmaWNhbnQgaW1wYWN0LgogKgogKiBFeGFtcGxlIHVzYWdlOgogKgogKiAgICAgQE1pcnJvcnNVc2VkKHN5bWJvbHM6ICdmb28nKQogKiAgICAgaW1wb3J0ICdkYXJ0Om1pcnJvcnMnOwogKgogKiAgICAgY2xhc3MgRm9vIHsKICogICAgICAgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgewogKiAgICAgICAgIHByaW50KE1pcnJvclN5c3RlbS5nZXROYW1lKGludm9jYXRpb24ubWVtYmVyTmFtZSkpOwogKiAgICAgICB9CiAqICAgICB9CiAqCiAqICAgICBtYWluKCkgewogKiAgICAgICBuZXcgRm9vKCkuZm9vKCk7IC8vIFByaW50cyAiZm9vIi4KICogICAgICAgbmV3IEZvbygpLmJhcigpOyAvLyBNaWdodCBwcmludCBhbiBhcmJpdHJhcnkgKG1hbmdsZWQpIG5hbWUsICJiYXIiLgogKiAgICAgfQogKgogKiBGb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVycyB0byB0aGUgW01pcnJvcnNVc2VkXSBjb25zdHJ1Y3RvcgogKiBzZWUgdGhlIGNvbW1lbnRzIGZvciBbc3ltYm9sc10sIFt0YXJnZXRzXSwgW21ldGFUYXJnZXRzXSBhbmQgW292ZXJyaWRlXS4KICoKICogQW4gaW1wb3J0IG9mIGBkYXJ0Om1pcnJvcnNgIG1heSBoYXZlIG11bHRpcGxlIFtNaXJyb3JzVXNlZF0gYW5ub3RhdGlvbnMuIFRoaXMKICogaXMgcGFydGljdWxhcmx5IGhlbHBmdWwgdG8gc3BlY2lmeSBvdmVycmlkZXMgZm9yIHNwZWNpZmljIGxpYnJhcmllcy4gRm9yCiAqIGV4YW1wbGU6CiAqCiAqICAgICBATWlycm9yc1VzZWQodGFyZ2V0czogJ2Zvby5CYXInLCBvdmVycmlkZTogJ2ZvbycpCiAqICAgICBATWlycm9yc1VzZWQodGFyZ2V0czogJ0JhcicpCiAqICAgICBpbXBvcnQgJ2RhcnQ6bWlycm9ycyc7CiAqCiAqIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHRhcmdldCBgQmFyYCBmcm9tIHRoZSBjdXJyZW50IGxpYnJhcnkgYW5kIGZyb20gbGlicmFyeQogKiBgZm9vYCBpcyBhdmFpbGFibGUgZm9yIHJlZmxlY3Rpb24uIFNlZSBhbHNvIFtvdmVycmlkZV0uCiAqLwpARGVwcmVjYXRlZCgiTm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiBXaWxsIGJlIHJlbW92ZWQgaW4gYSBsYXRlciByZWxlYXNlLiIpCmNsYXNzIE1pcnJvcnNVc2VkIHsKICAvLyBOb3RlOiB0aGUgZmllbGRzIG9mIHRoaXMgY2xhc3MgYXJlIHVudHlwZWQuICBUaGlzIGlzIGJlY2F1c2UgdGhlIG1vc3QKICAvLyBjb252ZW5pZW50IHdheSB0byBzcGVjaWZ5IHN5bWJvbHMgdG9kYXkgaXMgdXNpbmcgYSBzaW5nbGUgc3RyaW5nLiBJbgogIC8vIHNvbWUgY2FzZXMsIGEgY29uc3QgbGlzdCBvZiBjbGFzc2VzIG1pZ2h0IGJlIGNvbnZlbmllbnQuIFNvbWUKICAvLyBtaWdodCBwcmVmZXIgdG8gdXNlIGEgY29uc3QgbGlzdCBvZiBzeW1ib2xzLgoKICAvKioKICAgKiBUaGUgbGlzdCBvZiBzdHJpbmdzIHBhc3NlZCB0byBuZXcgW1N5bWJvbF0sIGFuZCBzeW1ib2xzIHRoYXQgbWlnaHQgYmUKICAgKiBwYXNzZWQgdG8gW01pcnJvclN5c3RlbS5nZXROYW1lXS4KICAgKgogICAqIENvbWJpbmVkIHdpdGggdGhlIG5hbWVzIG9mIFt0YXJnZXRzXSwgW21ldGFUYXJnZXRzXSBhbmQgdGhlaXIgbWVtYmVycywKICAgKiB0aGlzIGZvcm1zIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHN0cmluZ3MgcGFzc2VkIHRvIG5ldyBbU3ltYm9sXSwgYW5kCiAgICogc3ltYm9scyB0aGF0IG1pZ2h0IGJlIHBhc3NlZCB0byBbTWlycm9yU3lzdGVtLmdldE5hbWVdIGJ5IHRoZSBsaWJyYXJ5IHRvCiAgICogd2hpY2ggdGhpcyBtZXRhZGF0YSBhcHBsaWVzLgogICAqCiAgICogVGhlIGZvbGxvd2luZyB0ZXh0IGlzIG5vbi1ub3JtYXRpdmU6CiAgICoKICAgKiBEYXJ0MmpzIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGZvcm1hdHMgdG8gc3BlY2lmeSBzeW1ib2xzOgogICAqCiAgICogKiBBIGNvbnN0YW50IFtMaXN0XSBvZiBbU3RyaW5nXSBjb25zdGFudHMgcmVwcmVzZW50aW5nIHN5bWJvbCBuYW1lcywKICAgKiAgIGUuZy4sIGBjb25zdCBbJ2ZvbycsICdiYXInXWAuCiAgICogKiBBIHNpbmdsZSBbU3RyaW5nXSBjb25zdGFudCB3aG9zZSB2YWx1ZSBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mCiAgICogICBzeW1ib2wgbmFtZXMsIGUuZy4sIGAiZm9vLCBiYXIiYC4KICAgKgogICAqIFNwZWNpZnlpbmcgdGhlIGBzeW1ib2xzYCBmaWVsZCB0dXJucyBvZmYgdGhlIGZvbGxvd2luZyB3YXJuaW5ncyBlbWl0dGVkIGJ5CiAgICogZGFydDJqczoKICAgKgogICAqICogVXNpbmcgIk1pcnJvclN5c3RlbS5nZXROYW1lIiBtYXkgcmVzdWx0IGluIGxhcmdlciBvdXRwdXQuCiAgICogKiBVc2luZyAibmV3IFN5bWJvbCIgbWF5IHJlc3VsdCBpbiBsYXJnZXIgb3V0cHV0LgogICAqCiAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSdyZSB1c2luZyBbbm9TdWNoTWV0aG9kXSB0byBpbnRlcmFjdCB3aXRoIGEgZGF0YWJhc2UsCiAgICogZXh0cmFjdCBhbGwgdGhlIHBvc3NpYmxlIGNvbHVtbiBuYW1lcyBhbmQgaW5jbHVkZSB0aGVtIGluIHRoaXMgbGlzdC4KICAgKiBTaW1pbGFybHksIGlmIHlvdSdyZSB1c2luZyBbbm9TdWNoTWV0aG9kXSB0byBpbnRlcmFjdCB3aXRoIGFub3RoZXIKICAgKiBsYW5ndWFnZSAoSmF2YVNjcmlwdCwgZm9yIGV4YW1wbGUpIGV4dHJhY3QgYWxsIHRoZSBpZGVudGlmaWVycyBmcm9tIHRoZQogICAqIEFQSSB5b3UgdXNlIGFuZCBpbmNsdWRlIHRoZW0gaW4gdGhpcyBsaXN0LgogICAqCiAgICogTm90ZSB0aGF0IHNwZWNpZnlpbmcgYSBzeW1ib2wgb25seSBlbnN1cmVzIHRoYXQgdGhlIHN5bWJvbCB3aWxsIGJlCiAgICogYXZhaWxhYmxlIHVuZGVyIHRoYXQgbmFtZSBhdCBydW50aW1lLiBJdCBkb2VzIG5vdCBtYXJrIHRhcmdldHMgd2l0aAogICAqIHRoYXQgbmFtZSBhcyBhdmFpbGFibGUgZm9yIHJlZmxlY3Rpb24uIFNlZSBbdGFyZ2V0c10gYW5kIFttZXRhVGFyZ2V0c10KICAgKiBmb3IgdGhhdCBwdXJwb3NlLgogICAqLwogIGZpbmFsIHN5bWJvbHM7CgogIC8qKgogICAqIEEgbGlzdCBvZiByZWZsZWN0aXZlIHRhcmdldHMuCiAgICoKICAgKiBDb21iaW5lZCB3aXRoIFttZXRhVGFyZ2V0c10sIHRoaXMgcHJvdmlkZXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgcmVmbGVjdGl2ZQogICAqIHRhcmdldHMgdXNlZCBieSB0aGUgbGlicmFyeSB0byB3aGljaCB0aGlzIG1ldGFkYXRhIGFwcGxpZXMuCiAgICoKICAgKiBUaGUgZm9sbG93aW5nIHRleHQgaXMgbm9uLW5vcm1hdGl2ZToKICAgKgogICAqIEZvciBub3csIHRoZXJlIGlzIG5vIGZvcm1hbCBkZXNjcmlwdGlvbiBvZiB3aGF0IGEgcmVmbGVjdGl2ZSB0YXJnZXQgaXMuCiAgICogSW5mb3JtYWxseSwgYSB0YXJnZXQgaXMgYSBsaWJyYXJ5LCBhIGNsYXNzLCBhIG1ldGhvZCBvciBhIGZpZWxkLgogICAqCiAgICogRGFydDJqcyBjdXJyZW50bHkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBmb3JtYXRzIHRvIHNwZWNpZnkgdGFyZ2V0czoKICAgKgogICAqICogQSBjb25zdGFudCBbTGlzdF0gY29udGFpbmluZyBbU3RyaW5nXSBjb25zdGFudHMgcmVwcmVzZW50aW5nIChxdWFsaWZpZWQpCiAgICogICBuYW1lcyBvZiB0YXJnZXRzIGFuZCBEYXJ0IHR5cGVzLgogICAqICogQSBzaW5nbGUgW1N0cmluZ10gY29uc3RhbnQgd2hvc2UgdmFsdWUgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZgogICAqICAgKHF1YWxpZmllZCkgbmFtZXMuCiAgICogKiBBIHNpbmdsZSBEYXJ0IHR5cGUuCiAgICoKICAgKiBBIChxdWFsaWZpZWQpIG5hbWUgaXMgcmVzb2x2ZWQgdG8gYSB0YXJnZXQgYXMgZm9sbG93czoKICAgKgogICAqIDEuIElmIHRoZSBxdWFsaWZpZWQgbmFtZSBtYXRjaGVzIGEgbGlicmFyeSBuYW1lLCB0aGUgbWF0Y2hpbmcgbGlicmFyeSBpcwogICAqICAgIHRoZSB0YXJnZXQuCiAgICogMi4gRWxzZSwgZmluZCB0aGUgbG9uZ2VzdCBwcmVmaXggb2YgdGhlIG5hbWUgc3VjaCB0aGF0IHRoZSBwcmVmaXggZW5kcwogICAqICAgIGp1c3QgYmVmb3JlIGEgYC5gIGFuZCBpcyBhIGxpYnJhcnkgbmFtZS4KICAgKiAzLiBVc2UgdGhhdCBsaWJyYXJ5IGFzIGN1cnJlbnQgc2NvcGUuIElmIG5vIG1hdGNoaW5nIHByZWZpeCB3YXMgZm91bmQsIHVzZQogICAqICAgIHRoZSBjdXJyZW50IGxpYnJhcnksIGkuZS4sIHRoZSBsaWJyYXJ5IHdoZXJlIHRoZSBbTWlycm9yc1VzZWRdCiAgICogICAgYW5ub3RhdGlvbiB3YXMgcGxhY2VkLgogICAqIDQuIFNwbGl0IHRoZSByZW1haW5pbmcgc3VmZml4ICh0aGUgZW50aXJlIG5hbWUgaWYgbm8gbGlicmFyeSBuYW1lIHdhcwogICAqICAgIGZvdW5kIGluIHN0ZXAgMykgaW50byBhIGxpc3Qgb2YgW1N0cmluZ10gdXNpbmcgYC5gIGFzIGEKICAgKiAgICBzZXBhcmF0b3IuCiAgICogNS4gU2VsZWN0IGFsbCB0YXJnZXRzIGluIHRoZSBjdXJyZW50IHNjb3BlIHdob3NlIG5hbWUgbWF0Y2hlcyBhIFtTdHJpbmddCiAgICogICAgZnJvbSB0aGUgbGlzdC4KICAgKgogICAqIEZvciBleGFtcGxlOgogICAqCiAgICogICAgIGxpYnJhcnkgbXkubGlicmFyeS5vbmU7CiAgICoKICAgKiAgICAgY2xhc3MgQSB7CiAgICogICAgICAgdmFyIGFGaWVsZDsKICAgKiAgICAgfQogICAqCiAgICogICAgIGxpYnJhcnkgbWFpbjsKICAgKgogICAqICAgICBATWlycm9yc1VzZWQodGFyZ2V0czogIm15LmxpYnJhcnkub25lLkEuYUZpZWxkIikKICAgKiAgICAgaW1wb3J0ICJkYXJ0Om1pcnJvcnMiOwogICAqCiAgICogVGhlIFtNaXJyb3JzVXNlZF0gYW5ub3RhdGlvbiBzcGVjaWZpZXMgYEFgIGFuZCBgYUZpZWxkYCBmcm9tIGxpYnJhcnkKICAgKiBgbXkubGlicmFyeS5vbmVgIGFzIHRhcmdldHMuIFRoaXMgd2lsbCBtYXJrIHRoZSBjbGFzcyBgQWAgYXMgYSByZWZsZWN0aXZlCiAgICogdGFyZ2V0LiBUaGUgdGFyZ2V0IHNwZWNpZmljYXRpb24gZm9yIGBhRmllbGRgIGhhcyBubyBlZmZlY3QsIGFzIHRoZXJlIGlzCiAgICogbm8gdGFyZ2V0IGluIGBteS5saWJyYXJ5Lm9uZWAgd2l0aCB0aGF0IG5hbWUuCiAgICoKICAgKiBOb3RlIHRoYXQgZXZlcnl0aGluZyB3aXRoaW4gYSB0YXJnZXQgYWxzbyBpcyBhdmFpbGFibGUgZm9yIHJlZmxlY3Rpb24uCiAgICogU28sIGlmIGEgbGlicmFyeSBpcyBzcGVjaWZpZWQgYXMgdGFyZ2V0LCBhbGwgY2xhc3NlcyBpbiB0aGF0IGxpYnJhcnkKICAgKiBiZWNvbWUgdGFyZ2V0cyBmb3IgcmVmbGVjdGlvbi4gTGlrZXdpc2UsIGlmIGEgY2xhc3MgaXMgYSB0YXJnZXQsIGFsbAogICAqIGl0cyBtZXRob2RzIGFuZCBmaWVsZHMgYmVjb21lIHRhcmdldHMgZm9yIHJlZmxlY3Rpb24uIEFzIGEgY29uc2VxdWVuY2UsCiAgICogYGFGaWVsZGAgaW4gdGhlIGFib3ZlIGV4YW1wbGUgaXMgYWxzbyBhIHJlZmxlY3RpdmUgdGFyZ2V0LgogICAqCiAgICovCiAgZmluYWwgdGFyZ2V0czsKCiAgLyoqCiAgICogQSBsaXN0IG9mIGNsYXNzZXMgdGhhdCB3aGVuIHVzZWQgYXMgbWV0YWRhdGEgaW5kaWNhdGVzIGEgcmVmbGVjdGl2ZQogICAqIHRhcmdldC4gU2VlIGFsc28gW3RhcmdldHNdLgogICAqCiAgICogVGhlIGZvbGxvd2luZyB0ZXh0IGlzIG5vbi1ub3JtYXRpdmU6CiAgICoKICAgKiBUaGUgZm9ybWF0IGZvciBzcGVjaWZ5aW5nIHRoZSBsaXN0IG9mIGNsYXNzZXMgaXMgdGhlIHNhbWUgYXMgdXNlZCBmb3IKICAgKiBzcGVjaWZ5aW5nIFt0YXJnZXRzXS4gSG93ZXZlciwgYXMgYSBsaWJyYXJ5IGNhbm5vdCBiZSB1c2VkIGFzIGEgbWV0YWRhdGEKICAgKiBhbm5vdGF0aW9uIGluIERhcnQsIGFkZGluZyBhIGxpYnJhcnkgdG8gdGhlIGxpc3Qgb2YgW21ldGFUYXJnZXRzXSBoYXMgbm8KICAgKiBlZmZlY3QuIEluIHBhcnRpY3VsYXIsIGFkZGluZyBhIGxpYnJhcnkgdG8gW21ldGFUYXJnZXRzXSBkb2VzIG5vdCBtYWtlCiAgICogdGhlIGxpYnJhcnkncyBjbGFzc2VzIHZhbGlkIG1ldGFkYXRhIGFubm90YXRpb25zIHRvIGVuYWJsZSByZWZsZWN0aW9uLgogICAqCiAgICogSWYgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyBzcGVjaWZpZWQgaW4gW21ldGFUYXJnZXRzXSBpcyB1c2VkIGFzCiAgICogbWV0YWRhdGEgYW5ub3RhdGlvbiBvbiBhIGxpYnJhcnksIGNsYXNzLCBmaWVsZCBvciBtZXRob2QsIHRoYXQgbGlicmFyeSwKICAgKiBjbGFzcywgZmllbGQgb3IgIG1ldGhvZCBpcyBhZGRlZCB0byB0aGUgc2V0IG9mIHRhcmdldHMgZm9yIHJlZmxlY3Rpb24uCiAgICoKICAgKiBFeGFtcGxlIHVzYWdlOgogICAqCiAgICogICAgIGxpYnJhcnkgZXhhbXBsZTsKICAgKiAgICAgQE1pcnJvcnNVc2VkKG1ldGFUYXJnZXRzOiAiZXhhbXBsZS5SZWZsZWN0YWJsZSIpCiAgICogICAgIGltcG9ydCAiZGFydDptaXJyb3JzIjsKICAgKgogICAqICAgICBjbGFzcyBSZWZsZWN0YWJsZSB7CiAgICogICAgICAgY29uc3QgUmVmbGVjdGFibGUoKTsKICAgKiAgICAgfQogICAqCiAgICogICAgIGNsYXNzIEZvbyB7CiAgICogICAgICAgQFJlZmxlY3RhYmxlKCkKICAgKiAgICAgICByZWZsZWN0YWJsZU1ldGhvZCgpIHsgLi4uIH0KICAgKgogICAqICAgICAgIG5vblJlZmxlY3RhYmxlTWV0aG9kKCkgeyAuLi4gfQogICAqICAgICB9CiAgICoKICAgKiBJbiB0aGUgYWJvdmUgZXhhbXBsZS4gYHJlZmxlY3RhYmxlTWV0aG9kYCBpcyBtYXJrZWQgYXMgcmVmbGVjdGFibGUgYnkKICAgKiB1c2luZyB0aGUgYFJlZmxlY3RhYmxlYCBjbGFzcywgd2hpY2ggaW4gdHVybiBpcyBzcGVjaWZpZWQgaW4gdGhlCiAgICogW21ldGFUYXJnZXRzXSBhbm5vdGF0aW9uLgogICAqCiAgICogVGhlIG1ldGhvZCBgbm9uUmVmbGVjdGFibGVNZXRob2RgIGxhY2tzIGEgbWV0YWRhdGEgYW5ub3RhdGlvbiBhbmQgdGh1cwogICAqIHdpbGwgbm90IGJlIHJlZmxlY3RhYmxlIGF0IHJ1bnRpbWUuCiAgICovCiAgZmluYWwgbWV0YVRhcmdldHM7CgogIC8qKgogICAqIEEgbGlzdCBvZiBsaWJyYXJ5IG5hbWVzIG9yICIqIi4KICAgKgogICAqIFdoZW4gdXNlZCBhcyBtZXRhZGF0YSBvbiBhbiBpbXBvcnQgb2YgImRhcnQ6bWlycm9ycyIsIHRoaXMgbWV0YWRhdGEgZG9lcwogICAqIG5vdCBhcHBseSB0byB0aGUgbGlicmFyeSBpbiB3aGljaCB0aGUgYW5ub3RhdGlvbiBpcyB1c2VkLCBidXQgaW5zdGVhZAogICAqIGFwcGxpZXMgdG8gdGhlIG90aGVyIGxpYnJhcmllcyAoYWxsIGxpYnJhcmllcyBpZiAiKiIgaXMgdXNlZCkuCiAgICoKICAgKiBUaGUgZm9sbG93aW5nIHRleHQgaXMgbm9uLW5vcm1hdGl2ZToKICAgKgogICAqIERhcnQyanMgY3VycmVudGx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZm9ybWF0cyB0byBzcGVjaWZ5IGxpYnJhcmllczoKICAgKgogICAqICogQSBjb25zdGFudCBbTGlzdF0gY29udGFpbmluZyBbU3RyaW5nXSBjb25zdGFudHMgcmVwcmVzZW50aW5nIG5hbWVzIG9mCiAgICogICBsaWJyYXJpZXMuCiAgICogKiBBIHNpbmdsZSBbU3RyaW5nXSBjb25zdGFudCB3aG9zZSB2YWx1ZSBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mCiAgICogICBsaWJyYXJ5IG5hbWVzLgogICAqCiAgICogQ29uY2VwdHVhbGx5LCBhIFtNaXJyb3JzVXNlZF0gYW5ub3RhdGlvbiB3aXRoIFtvdmVycmlkZV0gaGFzIHRoZSBzYW1lCiAgICogZWZmZWN0IGFzIHBsYWNpbmcgdGhlIGFubm90YXRpb24gZGlyZWN0bHkgb24gdGhlIGltcG9ydCBvZiBgZGFydDptaXJyb3JzYAogICAqIGluIGVhY2ggb2YgdGhlIHJlZmVyZW5jZWQgbGlicmFyaWVzLiBUaHVzLCBpZiB0aGUgbGlicmFyeSBoYWQgbm8KICAgKiBbTWlycm9yc1VzZWRdIGFubm90YXRpb24gYmVmb3JlLCBpdHMgdW5jb25kaXRpb25hbCBpbXBvcnQgb2YKICAgKiBgZGFydDptaXJyb3JzYCBpcyBvdmVycmlkZGVuIGJ5IGFuIGFubm90YXRlZCBpbXBvcnQuCiAgICoKICAgKiBOb3RlIHRoYXQsIGxpa2UgbXVsdGlwbGUgZXhwbGljaXQgW01pcnJvcnNVc2VkXSBhbm5vdGF0aW9ucywgdXNpbmcKICAgKiBvdmVycmlkZSBvbiBhIGxpYnJhcnkgd2l0aCBhbiBleGlzdGluZyBbTWlycm9yc1VzZWRdIGFubm90YXRpb24gaXMKICAgKiBhZGRpdGl2ZS4gVGhhdCBpcywgdGhlIG92ZXJhbGwgc2V0IG9mIHJlZmxlY3RpdmUgdGFyZ2V0cyBpcyB0aGUgdW5pb24KICAgKiBvZiB0aGUgcmVmbGVjdGl2ZSB0YXJnZXRzIHRoYXQgYXJpc2UgZnJvbSB0aGUgb3JpZ2luYWwgYW5kIHRoZQogICAqIG92ZXJyaWRpbmcgW01pcnJvcnNVc2VkXSBhbm5vdGF0aW9ucy4KICAgKgogICAqIFRoZSB1c2Ugb2YgW292ZXJyaWRlXSBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIGxpYnJhcmllcyB0aGF0IGhhdmUgYW4KICAgKiBpbXBvcnQgb2YgYGRhcnQ6bWlycm9yc2Agd2l0aG91dCBhbm5vdGF0aW9uIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdvdWxkCiAgICogd29yayBleGFjdGx5IHRoZSBzYW1lIHdheSB3aXRob3V0IHRoZSBbb3ZlcnJpZGVdIHBhcmFtZXRlci4KICAgKgogICAqIFdoaWxlIHRoZSBhbm5vdGF0aW9uIHdpbGwgYXBwbHkgdG8gdGhlIGdpdmVuIHRhcmdldCBsaWJyYXJpZXMsIHRoZQogICAqIFtzeW1ib2xzXSwgW3RhcmdldHNdIGFuZCBbbWV0YVRhcmdldHNdIGFyZSBzdGlsbCBldmFsdWF0ZWQgaW4gdGhlCiAgICogc2NvcGUgb2YgdGhlIGFubm90YXRpb24uIFRodXMsIHRvIHNlbGVjdCBhIHRhcmdldCBmcm9tIGxpYnJhcnkgYGZvb2AsCiAgICogYSBxdWFsaWZpZWQgbmFtZSBoYXMgdG8gYmUgdXNlZCBvciwgaWYgdGhlIHRhcmdldCBpcyB2aXNpYmxlIGluIHRoZQogICAqIGN1cnJlbnQgc2NvcGUsIGl0cyB0eXBlIG1heSBiZSByZWZlcmVuY2VkLgogICAqCiAgICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSBtYXJrcyBhbGwgdGFyZ2V0cyBpbiB0aGUgbGlicmFyeSBgZm9vYAogICAqIGFzIHJlZmxlY3RhYmxlIHRoYXQgaGF2ZSBhIG1ldGFkYXRhIGFubm90YXRpb24gdXNpbmcgdGhlIGBSZWZsZWN0YWJsZWAKICAgKiBjbGFzcyBmcm9tIHRoZSBzYW1lIGxpYnJhcnkuCiAgICoKICAgKiAgICAgQE1pcnJvcnNVc2VkKG1ldGFUYXJnZXRzOiAiZm9vLlJlZmxlY3RhYmxlIiwgb3ZlcnJpZGU6ICJmb28iKQogICAqCiAgICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIHJlcXVpcmUgdGhlIHVzZSBvZiB0aGUgYFJlZmxlY3RhYmxlYAogICAqIGNsYXNzIGZyb20gdGhlIGN1cnJlbnQgbGlicmFyeSwgaW5zdGVhZC4KICAgKgogICAqICAgICBATWlycm9yc1VzZWQobWV0YVRhcmdldHM6ICJSZWZsZWN0YWJsZSIsIG92ZXJyaWRlOiAiZm9vIikKICAgKgogICAqLwogIGZpbmFsIG92ZXJyaWRlOwoKICAvKioKICAgKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFtNaXJyb3JzVXNlZC5zeW1ib2xzXSwgW01pcnJvcnNVc2VkLnRhcmdldHNdLAogICAqIFtNaXJyb3JzVXNlZC5tZXRhVGFyZ2V0c10gYW5kIFtNaXJyb3JzVXNlZC5vdmVycmlkZV0gZm9yIGRvY3VtZW50YXRpb24KICAgKiBvZiB0aGUgcGFyYW1ldGVycy4KICAgKi8KICBjb25zdCBNaXJyb3JzVXNlZCgKICAgICAge3RoaXMuc3ltYm9scywgdGhpcy50YXJnZXRzLCB0aGlzLm1ldGFUYXJnZXRzLCB0aGlzLm92ZXJyaWRlfSk7Cn0Khb0ATk48AT5GHQMSAzxFLgEEHToDQ0JIA0FOQjoDNANDST8eAzUuRkBBPDYDQVE+Uw0DFwNPUEg3AxIEFgEhAQRGGQNCA0dGPkVFBB4GRQVOCwVMTx4GKQEGQgU2BjoBBkIFPAYdAQYnBh4BBiQGGwEGIwUqBUZM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cmluZyBfbXNnOwogIF9JbnRlcm5hbE1pcnJvckVycm9yKHRoaXMuX21zZyk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX21zZzsKfQoKU3RyaW5nIF9uKFN5bWJvbCBzeW1ib2wpID0+IGludGVybmFsLlN5bWJvbC5nZXROYW1lKHN5bWJvbCk7CgpTeW1ib2wgX3MoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICByZXR1cm4gbmV3IGludGVybmFsLlN5bWJvbC51bnZhbGlkYXRlZChuYW1lKTsKfQoKU3ltYm9sIF9jb21wdXRlUXVhbGlmaWVkTmFtZShEZWNsYXJhdGlvbk1pcnJvciBvd25lciwgU3ltYm9sIHNpbXBsZU5hbWUpIHsKICBpZiAob3duZXIgPT0gbnVsbCkgcmV0dXJuIHNpbXBsZU5hbWU7CiAgcmV0dXJuIF9zKCcke19uKG93bmVyLnF1YWxpZmllZE5hbWUpfS4ke19uKHNpbXBsZU5hbWUpfScpOwp9CgpTdHJpbmcgX21ha2VTaWduYXR1cmVTdHJpbmcoCiAgICBUeXBlTWlycm9yIHJldHVyblR5cGUsIExpc3Q8UGFyYW1ldGVyTWlycm9yPiBwYXJhbWV0ZXJzKSB7CiAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBidWYud3JpdGUoJygnKTsKICBib29sIGZvdW5kX29wdGlvbmFsX3Bvc2l0aW9uYWwgPSBmYWxzZTsKICBib29sIGZvdW5kX29wdGlvbmFsX25hbWVkID0gZmFsc2U7CgogIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgdmFyIHBhcmFtID0gcGFyYW1ldGVyc1tpXTsKICAgIGlmIChwYXJhbS5pc09wdGlvbmFsICYmIHBhcmFtLmlzTmFtZWQgJiYgIWZvdW5kX29wdGlvbmFsX25hbWVkKSB7CiAgICAgIGJ1Zi53cml0ZSgneycpOwogICAgICBmb3VuZF9vcHRpb25hbF9uYW1lZCA9IHRydWU7CiAgICB9CiAgICBpZiAocGFyYW0uaXNPcHRpb25hbCAmJiAhcGFyYW0uaXNOYW1lZCAmJiAhZm91bmRfb3B0aW9uYWxfcG9zaXRpb25hbCkgewogICAgICBidWYud3JpdGUoJ1snKTsKICAgICAgZm91bmRfb3B0aW9uYWxfcG9zaXRpb25hbCA9IHRydWU7CiAgICB9CiAgICBpZiAocGFyYW0uaXNOYW1lZCkgewogICAgICBidWYud3JpdGUoX24ocGFyYW0uc2ltcGxlTmFtZSkpOwogICAgICBidWYud3JpdGUoJzogJyk7CiAgICB9CiAgICBidWYud3JpdGUoX24ocGFyYW0udHlwZS5xdWFsaWZpZWROYW1lKSk7CiAgICBpZiAoaSA8IChwYXJhbWV0ZXJzLmxlbmd0aCAtIDEpKSB7CiAgICAgIGJ1Zi53cml0ZSgnLCAnKTsKICAgIH0KICB9CiAgaWYgKGZvdW5kX29wdGlvbmFsX25hbWVkKSB7CiAgICBidWYud3JpdGUoJ30nKTsKICB9CiAgaWYgKGZvdW5kX29wdGlvbmFsX3Bvc2l0aW9uYWwpIHsKICAgIGJ1Zi53cml0ZSgnXScpOwogIH0KICBidWYud3JpdGUoJykgLT4gJyk7CiAgYnVmLndyaXRlKF9uKHJldHVyblR5cGUucXVhbGlmaWVkTmFtZSkpOwogIHJldHVybiBidWYudG9TdHJpbmcoKTsKfQoKU291cmNlTG9jYXRpb24gX2xvY2F0aW9uKHJlZmxlY3RlZSkgbmF0aXZlICJEZWNsYXJhdGlvbk1pcnJvcl9sb2NhdGlvbiI7CgpMaXN0PGR5bmFtaWM+IF9tZXRhZGF0YShyZWZsZWN0ZWUpIG5hdGl2ZSAnRGVjbGFyYXRpb25NaXJyb3JfbWV0YWRhdGEnOwoKYm9vbCBfc3VidHlwZVRlc3QoVHlwZSBhLCBUeXBlIGIpIG5hdGl2ZSAnVHlwZU1pcnJvcl9zdWJ0eXBlVGVzdCc7CgpjbGFzcyBfTG9jYWxNaXJyb3JTeXN0ZW0gZXh0ZW5kcyBNaXJyb3JTeXN0ZW0gewogIGZpbmFsIFR5cGVNaXJyb3IgZHluYW1pY1R5cGUgPSBuZXcgX1NwZWNpYWxUeXBlTWlycm9yLl8oJ2R5bmFtaWMnKTsKICBmaW5hbCBUeXBlTWlycm9yIHZvaWRUeXBlID0gbmV3IF9TcGVjaWFsVHlwZU1pcnJvci5fKCd2b2lkJyk7CgogIHZhciBfbGlicmFyaWVzOwogIE1hcDxVcmksIExpYnJhcnlNaXJyb3I+IGdldCBsaWJyYXJpZXMgewogICAgaWYgKChfbGlicmFyaWVzID09IG51bGwpIHx8IF9kaXJ0eSkgewogICAgICBfbGlicmFyaWVzID0gbmV3IE1hcDxVcmksIExpYnJhcnlNaXJyb3I+KCk7CiAgICAgIGZvciAoTGlicmFyeU1pcnJvciBsaWIgaW4gX2NvbXB1dGVMaWJyYXJpZXMoKSkgewogICAgICAgIF9saWJyYXJpZXNbbGliLnVyaV0gPSBsaWI7CiAgICAgIH0KICAgICAgX2xpYnJhcmllcyA9IG5ldyBVbm1vZGlmaWFibGVNYXBWaWV3PFVyaSwgTGlicmFyeU1pcnJvcj4oX2xpYnJhcmllcyk7CiAgICAgIF9kaXJ0eSA9IGZhbHNlOwogICAgfQogICAgcmV0dXJuIF9saWJyYXJpZXM7CiAgfQoKICBzdGF0aWMgTGlzdDxkeW5hbWljPiBfY29tcHV0ZUxpYnJhcmllcygpIG5hdGl2ZSAiTWlycm9yU3lzdGVtX2xpYnJhcmllcyI7CgogIElzb2xhdGVNaXJyb3IgX2lzb2xhdGU7CiAgSXNvbGF0ZU1pcnJvciBnZXQgaXNvbGF0ZSB7CiAgICBpZiAoX2lzb2xhdGUgPT0gbnVsbCkgewogICAgICBfaXNvbGF0ZSA9IF9jb21wdXRlSXNvbGF0ZSgpOwogICAgfQogICAgcmV0dXJuIF9pc29sYXRlOwogIH0KCiAgc3RhdGljIElzb2xhdGVNaXJyb3IgX2NvbXB1dGVJc29sYXRlKCkgbmF0aXZlICJNaXJyb3JTeXN0ZW1faXNvbGF0ZSI7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJNaXJyb3JTeXN0ZW0gZm9yIGlzb2xhdGUgJyR7aXNvbGF0ZS5kZWJ1Z05hbWV9JyI7Cn0KCmNsYXNzIF9Tb3VyY2VMb2NhdGlvbiBpbXBsZW1lbnRzIFNvdXJjZUxvY2F0aW9uIHsKICBfU291cmNlTG9jYXRpb24uXyh1cmlTdHJpbmcsIHRoaXMubGluZSwgdGhpcy5jb2x1bW4pCiAgICAgIDogdGhpcy5zb3VyY2VVcmkgPSBVcmkucGFyc2UodXJpU3RyaW5nKTsKCiAgLy8gTGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBhcmUgMS1vcmlnaW4sIG9yIDAgaWYgdW5rbm93bi4KICBmaW5hbCBpbnQgbGluZTsKICBmaW5hbCBpbnQgY29sdW1uOwoKICBmaW5hbCBVcmkgc291cmNlVXJpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gY29sdW1uID09IDAgPyAiJHNvdXJjZVVyaTokbGluZSIgOiAiJHNvdXJjZVVyaTokbGluZTokY29sdW1uIjsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9Mb2NhbE1pcnJvciBpbXBsZW1lbnRzIE1pcnJvciB7fQoKY2xhc3MgX0xvY2FsSXNvbGF0ZU1pcnJvciBleHRlbmRzIF9Mb2NhbE1pcnJvciBpbXBsZW1lbnRzIElzb2xhdGVNaXJyb3IgewogIGZpbmFsIFN0cmluZyBkZWJ1Z05hbWU7CiAgZmluYWwgTGlicmFyeU1pcnJvciByb290TGlicmFyeTsKCiAgX0xvY2FsSXNvbGF0ZU1pcnJvci5fKHRoaXMuZGVidWdOYW1lLCB0aGlzLnJvb3RMaWJyYXJ5KTsKCiAgYm9vbCBnZXQgaXNDdXJyZW50ID0+IHRydWU7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJJc29sYXRlTWlycm9yIG9uICckZGVidWdOYW1lJyI7CgogIEZ1dHVyZTxMaWJyYXJ5TWlycm9yPiBsb2FkVXJpKFVyaSB1cmkpIGFzeW5jIHsKICAgIHZhciByZXN1bHQgPSBfbG9hZFVyaSh1cmkudG9TdHJpbmcoKSk7CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgLy8gQ2Vuc29yZWQgbGlicmFyeS4KICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgJHVyaSIpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBMaWJyYXJ5TWlycm9yIF9sb2FkVXJpKFN0cmluZyB1cmkpIG5hdGl2ZSAiSXNvbGF0ZU1pcnJvcl9sb2FkVXJpIjsKfQoKY2xhc3MgX1N5bnRoZXRpY0FjY2Vzc29yIGltcGxlbWVudHMgTWV0aG9kTWlycm9yIHsKICBmaW5hbCBEZWNsYXJhdGlvbk1pcnJvciBvd25lcjsKICBmaW5hbCBTeW1ib2wgc2ltcGxlTmFtZTsKICBmaW5hbCBib29sIGlzR2V0dGVyOwogIGZpbmFsIGJvb2wgaXNTdGF0aWM7CiAgZmluYWwgYm9vbCBpc1RvcExldmVsOwogIGZpbmFsIF90YXJnZXQ7CgogIF9TeW50aGV0aWNBY2Nlc3Nvcih0aGlzLm93bmVyLCB0aGlzLnNpbXBsZU5hbWUsIHRoaXMuaXNHZXR0ZXIsIHRoaXMuaXNTdGF0aWMsCiAgICAgIHRoaXMuaXNUb3BMZXZlbCwgdGhpcy5fdGFyZ2V0KTsKCiAgYm9vbCBnZXQgaXNTeW50aGV0aWMgPT4gdHJ1ZTsKICBib29sIGdldCBpc1JlZ3VsYXJNZXRob2QgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNPcGVyYXRvciA9PiBmYWxzZTsKICBib29sIGdldCBpc0NvbnN0cnVjdG9yID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzQ29uc3RDb25zdHJ1Y3RvciA9PiBmYWxzZTsKICBib29sIGdldCBpc0dlbmVyYXRpdmVDb25zdHJ1Y3RvciA9PiBmYWxzZTsKICBib29sIGdldCBpc0ZhY3RvcnlDb25zdHJ1Y3RvciA9PiBmYWxzZTsKICBib29sIGdldCBpc0V4dGVybmFsID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzUmVkaXJlY3RpbmdDb25zdHJ1Y3RvciA9PiBmYWxzZTsKICBib29sIGdldCBpc0Fic3RyYWN0ID0+IGZhbHNlOwoKICBib29sIGdldCBpc1NldHRlciA9PiAhaXNHZXR0ZXI7CiAgYm9vbCBnZXQgaXNQcml2YXRlID0+IF9uKHNpbXBsZU5hbWUpLnN0YXJ0c1dpdGgoJ18nKTsKCiAgU3ltYm9sIGdldCBxdWFsaWZpZWROYW1lID0+IF9jb21wdXRlUXVhbGlmaWVkTmFtZShvd25lciwgc2ltcGxlTmFtZSk7CiAgU3ltYm9sIGdldCBjb25zdHJ1Y3Rvck5hbWUgPT4gU3ltYm9sLmVtcHR5OwoKICBUeXBlTWlycm9yIGdldCByZXR1cm5UeXBlID0+IF90YXJnZXQudHlwZTsKICBMaXN0PFBhcmFtZXRlck1pcnJvcj4gZ2V0IHBhcmFtZXRlcnMgewogICAgaWYgKGlzR2V0dGVyKSByZXR1cm4gY29uc3QgPFBhcmFtZXRlck1pcnJvcj5bXTsKICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlTGlzdFZpZXc8UGFyYW1ldGVyTWlycm9yPigKICAgICAgICA8UGFyYW1ldGVyTWlycm9yPltuZXcgX1N5bnRoZXRpY1NldHRlclBhcmFtZXRlcih0aGlzLCB0aGlzLl90YXJnZXQpXSk7CiAgfQoKICBTb3VyY2VMb2NhdGlvbiBnZXQgbG9jYXRpb24gPT4gbnVsbDsKICBMaXN0PEluc3RhbmNlTWlycm9yPiBnZXQgbWV0YWRhdGEgPT4gY29uc3QgPEluc3RhbmNlTWlycm9yPltdOwogIFN0cmluZyBnZXQgc291cmNlID0+IG51bGw7Cn0KCmNsYXNzIF9TeW50aGV0aWNTZXR0ZXJQYXJhbWV0ZXIgaW1wbGVtZW50cyBQYXJhbWV0ZXJNaXJyb3IgewogIGZpbmFsIERlY2xhcmF0aW9uTWlycm9yIG93bmVyOwogIGZpbmFsIFZhcmlhYmxlTWlycm9yIF90YXJnZXQ7CgogIF9TeW50aGV0aWNTZXR0ZXJQYXJhbWV0ZXIodGhpcy5vd25lciwgdGhpcy5fdGFyZ2V0KTsKCiAgU3ltYm9sIGdldCBzaW1wbGVOYW1lID0+IF90YXJnZXQuc2ltcGxlTmFtZTsKICBTeW1ib2wgZ2V0IHF1YWxpZmllZE5hbWUgPT4gX2NvbXB1dGVRdWFsaWZpZWROYW1lKG93bmVyLCBzaW1wbGVOYW1lKTsKICBUeXBlTWlycm9yIGdldCB0eXBlID0+IF90YXJnZXQudHlwZTsKCiAgYm9vbCBnZXQgaXNPcHRpb25hbCA9PiBmYWxzZTsKICBib29sIGdldCBpc05hbWVkID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzU3RhdGljID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzVG9wTGV2ZWwgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNDb25zdCA9PiBmYWxzZTsKICBib29sIGdldCBpc0ZpbmFsID0+IHRydWU7CiAgYm9vbCBnZXQgaXNQcml2YXRlID0+IGZhbHNlOwogIGJvb2wgZ2V0IGhhc0RlZmF1bHRWYWx1ZSA9PiBmYWxzZTsKICBJbnN0YW5jZU1pcnJvciBnZXQgZGVmYXVsdFZhbHVlID0+IG51bGw7CiAgU291cmNlTG9jYXRpb24gZ2V0IGxvY2F0aW9uID0+IG51bGw7CiAgTGlzdDxJbnN0YW5jZU1pcnJvcj4gZ2V0IG1ldGFkYXRhID0+IGNvbnN0IDxJbnN0YW5jZU1pcnJvcj5bXTsKfQoKYWJzdHJhY3QgY2xhc3MgX0xvY2FsT2JqZWN0TWlycm9yIGV4dGVuZHMgX0xvY2FsTWlycm9yIGltcGxlbWVudHMgT2JqZWN0TWlycm9yIHsKICBfaW52b2tlKHJlZmxlY3RlZSwgZnVuY3Rpb25OYW1lLCBhcmd1bWVudHMsIGFyZ3VtZW50TmFtZXMpOwogIF9pbnZva2VHZXR0ZXIocmVmbGVjdGVlLCBnZXR0ZXJOYW1lKTsKICBfaW52b2tlU2V0dGVyKHJlZmxlY3RlZSwgc2V0dGVyTmFtZSwgdmFsdWUpOwoKICBmaW5hbCBfcmVmbGVjdGVlOyAvLyBNYXkgYmUgYSBNaXJyb3JSZWZlcmVuY2Ugb3IgYW4gb3JkaW5hcnkgb2JqZWN0LgoKICBfTG9jYWxPYmplY3RNaXJyb3IuXyh0aGlzLl9yZWZsZWN0ZWUpOwoKICBJbnN0YW5jZU1pcnJvciBpbnZva2UoU3ltYm9sIG1lbWJlck5hbWUsIExpc3QgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgW01hcDxTeW1ib2wsIGR5bmFtaWM+IG5hbWVkQXJndW1lbnRzXSkgewogICAgaW50IG51bVBvc2l0aW9uYWxBcmd1bWVudHMgPSBwb3NpdGlvbmFsQXJndW1lbnRzLmxlbmd0aDsKICAgIGludCBudW1OYW1lZEFyZ3VtZW50cyA9IG5hbWVkQXJndW1lbnRzICE9IG51bGwgPyBuYW1lZEFyZ3VtZW50cy5sZW5ndGggOiAwOwogICAgaW50IG51bUFyZ3VtZW50cyA9IG51bVBvc2l0aW9uYWxBcmd1bWVudHMgKyBudW1OYW1lZEFyZ3VtZW50czsKICAgIExpc3QgYXJndW1lbnRzID0gbmV3IExpc3QobnVtQXJndW1lbnRzKTsKICAgIGFyZ3VtZW50cy5zZXRSYW5nZSgwLCBudW1Qb3NpdGlvbmFsQXJndW1lbnRzLCBwb3NpdGlvbmFsQXJndW1lbnRzKTsKICAgIExpc3QgbmFtZXMgPSBuZXcgTGlzdChudW1OYW1lZEFyZ3VtZW50cyk7CiAgICBpbnQgYXJndW1lbnRJbmRleCA9IG51bVBvc2l0aW9uYWxBcmd1bWVudHM7CiAgICBpbnQgbmFtZUluZGV4ID0gMDsKICAgIGlmIChudW1OYW1lZEFyZ3VtZW50cyA+IDApIHsKICAgICAgbmFtZWRBcmd1bWVudHMuZm9yRWFjaCgobmFtZSwgdmFsdWUpIHsKICAgICAgICBhcmd1bWVudHNbYXJndW1lbnRJbmRleCsrXSA9IHZhbHVlOwogICAgICAgIG5hbWVzW25hbWVJbmRleCsrXSA9IF9uKG5hbWUpOwogICAgICB9KTsKICAgIH0KCiAgICByZXR1cm4gcmVmbGVjdCh0aGlzLl9pbnZva2UoX3JlZmxlY3RlZSwgX24obWVtYmVyTmFtZSksIGFyZ3VtZW50cywgbmFtZXMpKTsKICB9CgogIEluc3RhbmNlTWlycm9yIGdldEZpZWxkKFN5bWJvbCBtZW1iZXJOYW1lKSB7CiAgICByZXR1cm4gcmVmbGVjdCh0aGlzLl9pbnZva2VHZXR0ZXIoX3JlZmxlY3RlZSwgX24obWVtYmVyTmFtZSkpKTsKICB9CgogIEluc3RhbmNlTWlycm9yIHNldEZpZWxkKFN5bWJvbCBtZW1iZXJOYW1lLCBPYmplY3QgdmFsdWUpIHsKICAgIHRoaXMuX2ludm9rZVNldHRlcihfcmVmbGVjdGVlLCBfbihtZW1iZXJOYW1lKSwgdmFsdWUpOwogICAgcmV0dXJuIHJlZmxlY3QodmFsdWUpOwogIH0KCiAgZGVsZWdhdGUoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICBpZiAoaW52b2NhdGlvbi5pc01ldGhvZCkgewogICAgICByZXR1cm4gdGhpcwogICAgICAgICAgLmludm9rZShpbnZvY2F0aW9uLm1lbWJlck5hbWUsIGludm9jYXRpb24ucG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgICAgICAgICBpbnZvY2F0aW9uLm5hbWVkQXJndW1lbnRzKQogICAgICAgICAgLnJlZmxlY3RlZTsKICAgIH0KICAgIGlmIChpbnZvY2F0aW9uLmlzR2V0dGVyKSB7CiAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkKGludm9jYXRpb24ubWVtYmVyTmFtZSkucmVmbGVjdGVlOwogICAgfQogICAgaWYgKGludm9jYXRpb24uaXNTZXR0ZXIpIHsKICAgICAgdmFyIHVud3JhcHBlZCA9IF9uKGludm9jYXRpb24ubWVtYmVyTmFtZSk7CiAgICAgIHZhciB3aXRob3V0RXF1YWwgPSBfcyh1bndyYXBwZWQuc3Vic3RyaW5nKDAsIHVud3JhcHBlZC5sZW5ndGggLSAxKSk7CiAgICAgIHZhciBhcmcgPSBpbnZvY2F0aW9uLnBvc2l0aW9uYWxBcmd1bWVudHNbMF07CiAgICAgIHRoaXMuc2V0RmllbGQod2l0aG91dEVxdWFsLCBhcmcpLnJlZmxlY3RlZTsKICAgICAgcmV0dXJuIGFyZzsKICAgIH0KICAgIHRocm93ICJVTlJFQUNIQUJMRSI7CiAgfQp9CgpjbGFzcyBfTG9jYWxJbnN0YW5jZU1pcnJvciBleHRlbmRzIF9Mb2NhbE9iamVjdE1pcnJvcgogICAgaW1wbGVtZW50cyBJbnN0YW5jZU1pcnJvciB7CiAgX0xvY2FsSW5zdGFuY2VNaXJyb3IuXyhyZWZsZWN0ZWUpIDogc3VwZXIuXyhyZWZsZWN0ZWUpOwoKICBDbGFzc01pcnJvciBfdHlwZTsKICBDbGFzc01pcnJvciBnZXQgdHlwZSB7CiAgICBpZiAoX3R5cGUgPT0gbnVsbCkgewogICAgICAvLyBOb3RlIGl0IG5vdCBzYWZlIHRvIHVzZSByZWZsZWN0ZWUucnVudGltZVR5cGUgYmVjYXVzZSBydW50aW1lVHlwZSBtYXkKICAgICAgLy8gYmUgb3ZlcnJpZGRlbi4KICAgICAgX3R5cGUgPSByZWZsZWN0VHlwZShfY29tcHV0ZVR5cGUocmVmbGVjdGVlKSk7CiAgICB9CiAgICByZXR1cm4gX3R5cGU7CiAgfQoKICAvLyBMb2NhbEluc3RhbmNlTWlycm9ycyBhbHdheXMgcmVmbGVjdCBsb2NhbCBpbnN0YW5jZXMKICBib29sIGdldCBoYXNSZWZsZWN0ZWUgPT4gdHJ1ZTsKCiAgZ2V0IHJlZmxlY3RlZSA9PiBfcmVmbGVjdGVlOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnSW5zdGFuY2VNaXJyb3Igb24gJHtFcnJvci5zYWZlVG9TdHJpbmcoX3JlZmxlY3RlZSl9JzsKCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIF9Mb2NhbEluc3RhbmNlTWlycm9yICYmCiAgICAgICAgaWRlbnRpY2FsKF9yZWZsZWN0ZWUsIG90aGVyLl9yZWZsZWN0ZWUpOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICAvLyBBdm9pZCBoYXNoIGNvbGxpc2lvbnMgd2l0aCB0aGUgcmVmbGVjdGVlLiBUaGlzIGNvbnN0YW50IGlzIGluIFNtaSByYW5nZQogICAgLy8gYW5kIGhhcHBlbnMgdG8gYmUgdGhlIGlubmVyIHBhZGRpbmcgZnJvbSBSRkMgMjEwNC4KICAgIHJldHVybiBpZGVudGl0eUhhc2hDb2RlKF9yZWZsZWN0ZWUpIF4gMHgzNjM2MzYzNjsKICB9CgogIEluc3RhbmNlTWlycm9yIGdldEZpZWxkKFN5bWJvbCBtZW1iZXJOYW1lKSB7CiAgICByZXR1cm4gcmVmbGVjdChfaW52b2tlR2V0dGVyKF9yZWZsZWN0ZWUsIF9uKG1lbWJlck5hbWUpKSk7CiAgfQoKICBJbnN0YW5jZU1pcnJvciBzZXRGaWVsZChTeW1ib2wgbWVtYmVyTmFtZSwgYXJnKSB7CiAgICBfaW52b2tlU2V0dGVyKF9yZWZsZWN0ZWUsIF9uKG1lbWJlck5hbWUpLCBhcmcpOwogICAgcmV0dXJuIHJlZmxlY3QoYXJnKTsKICB9CgogIC8vIE92ZXJyaWRlIHRvIGluY2x1ZGUgdGhlIHJlY2VpdmVyIGluIHRoZSBhcmd1bWVudHMuCiAgSW5zdGFuY2VNaXJyb3IgaW52b2tlKFN5bWJvbCBtZW1iZXJOYW1lLCBMaXN0IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIFtNYXA8U3ltYm9sLCBkeW5hbWljPiBuYW1lZEFyZ3VtZW50c10pIHsKICAgIGludCBudW1Qb3NpdGlvbmFsQXJndW1lbnRzID0gcG9zaXRpb25hbEFyZ3VtZW50cy5sZW5ndGggKyAxOyAvLyBSZWNlaXZlci4KICAgIGludCBudW1OYW1lZEFyZ3VtZW50cyA9IG5hbWVkQXJndW1lbnRzICE9IG51bGwgPyBuYW1lZEFyZ3VtZW50cy5sZW5ndGggOiAwOwogICAgaW50IG51bUFyZ3VtZW50cyA9IG51bVBvc2l0aW9uYWxBcmd1bWVudHMgKyBudW1OYW1lZEFyZ3VtZW50czsKICAgIExpc3QgYXJndW1lbnRzID0gbmV3IExpc3QobnVtQXJndW1lbnRzKTsKICAgIGFyZ3VtZW50c1swXSA9IF9yZWZsZWN0ZWU7IC8vIFJlY2VpdmVyLgogICAgYXJndW1lbnRzLnNldFJhbmdlKDEsIG51bVBvc2l0aW9uYWxBcmd1bWVudHMsIHBvc2l0aW9uYWxBcmd1bWVudHMpOwogICAgTGlzdCBuYW1lcyA9IG5ldyBMaXN0KG51bU5hbWVkQXJndW1lbnRzKTsKICAgIGludCBhcmd1bWVudEluZGV4ID0gbnVtUG9zaXRpb25hbEFyZ3VtZW50czsKICAgIGludCBuYW1lSW5kZXggPSAwOwogICAgaWYgKG51bU5hbWVkQXJndW1lbnRzID4gMCkgewogICAgICBuYW1lZEFyZ3VtZW50cy5mb3JFYWNoKChuYW1lLCB2YWx1ZSkgewogICAgICAgIGFyZ3VtZW50c1thcmd1bWVudEluZGV4KytdID0gdmFsdWU7CiAgICAgICAgbmFtZXNbbmFtZUluZGV4KytdID0gX24obmFtZSk7CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiByZWZsZWN0KHRoaXMuX2ludm9rZShfcmVmbGVjdGVlLCBfbihtZW1iZXJOYW1lKSwgYXJndW1lbnRzLCBuYW1lcykpOwogIH0KCiAgX2ludm9rZShyZWZsZWN0ZWUsIGZ1bmN0aW9uTmFtZSwgYXJndW1lbnRzLCBhcmd1bWVudE5hbWVzKQogICAgICBuYXRpdmUgJ0luc3RhbmNlTWlycm9yX2ludm9rZSc7CgogIF9pbnZva2VHZXR0ZXIocmVmbGVjdGVlLCBnZXR0ZXJOYW1lKSBuYXRpdmUgJ0luc3RhbmNlTWlycm9yX2ludm9rZUdldHRlcic7CgogIF9pbnZva2VTZXR0ZXIocmVmbGVjdGVlLCBzZXR0ZXJOYW1lLCB2YWx1ZSkKICAgICAgbmF0aXZlICdJbnN0YW5jZU1pcnJvcl9pbnZva2VTZXR0ZXInOwoKICBzdGF0aWMgX2NvbXB1dGVUeXBlKHJlZmxlY3RlZSkgbmF0aXZlICdJbnN0YW5jZU1pcnJvcl9jb21wdXRlVHlwZSc7Cn0KCmNsYXNzIF9Mb2NhbENsb3N1cmVNaXJyb3IgZXh0ZW5kcyBfTG9jYWxJbnN0YW5jZU1pcnJvcgogICAgaW1wbGVtZW50cyBDbG9zdXJlTWlycm9yIHsKICBfTG9jYWxDbG9zdXJlTWlycm9yLl8ocmVmbGVjdGVlKSA6IHN1cGVyLl8ocmVmbGVjdGVlKTsKCiAgTWV0aG9kTWlycm9yIF9mdW5jdGlvbjsKICBNZXRob2RNaXJyb3IgZ2V0IGZ1bmN0aW9uIHsKICAgIGlmIChfZnVuY3Rpb24gPT0gbnVsbCkgewogICAgICBfZnVuY3Rpb24gPSBfY29tcHV0ZUZ1bmN0aW9uKHJlZmxlY3RlZSk7CiAgICB9CiAgICByZXR1cm4gX2Z1bmN0aW9uOwogIH0KCiAgSW5zdGFuY2VNaXJyb3IgYXBwbHkoTGlzdDxPYmplY3Q+IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIFtNYXA8U3ltYm9sLCBPYmplY3Q+IG5hbWVkQXJndW1lbnRzXSkgewogICAgcmV0dXJuIHRoaXMuaW52b2tlKCNjYWxsLCBwb3NpdGlvbmFsQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cyk7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiQ2xvc3VyZU1pcnJvciBvbiAnJHtFcnJvci5zYWZlVG9TdHJpbmcoX3JlZmxlY3RlZSl9JyI7CgogIHN0YXRpYyBfY29tcHV0ZUZ1bmN0aW9uKHJlZmxlY3RlZSkgbmF0aXZlICdDbG9zdXJlTWlycm9yX2Z1bmN0aW9uJzsKfQoKYWJzdHJhY3QgY2xhc3MgX0xvY2FsVHlwZU1pcnJvciB7CiAgVHlwZSBnZXQgX3JlZmxlY3RlZFR5cGU7Cn0KCmNsYXNzIF9Mb2NhbENsYXNzTWlycm9yIGV4dGVuZHMgX0xvY2FsT2JqZWN0TWlycm9yCiAgICBpbXBsZW1lbnRzIENsYXNzTWlycm9yLCBfTG9jYWxUeXBlTWlycm9yIHsKICBmaW5hbCBUeXBlIF9yZWZsZWN0ZWRUeXBlOwogIFN5bWJvbCBfc2ltcGxlTmFtZTsKICBEZWNsYXJhdGlvbk1pcnJvciBfb3duZXI7CiAgZmluYWwgYm9vbCBpc0Fic3RyYWN0OwogIGZpbmFsIGJvb2wgX2lzR2VuZXJpYzsKCiAgLy8gU2luY2UgRGFydCAyLCBtaXhpbnMgYXJlIGVyYXNlZCBieSBrZXJuZWwgdHJhbnNmb3JtYXRpb24uCiAgLy8gUmVzdWx0aW5nIGNsYXNzZXMgaGF2ZSB0aGlzIGZsYWcgc2V0LCBhbmQgbWl4ZWQtaW4gdHlwZSBpcyBwdWxsZWQgaW50bwogIC8vIHRoZSBlbmQgb2YgaW50ZXJmYWNlcyBsaXN0LgogIGZpbmFsIGJvb2wgX2lzVHJhbnNmb3JtZWRNaXhpbkFwcGxpY2F0aW9uOwoKICBmaW5hbCBib29sIF9pc0dlbmVyaWNEZWNsYXJhdGlvbjsKICBmaW5hbCBib29sIGlzRW51bTsKICBUeXBlIF9pbnN0YW50aWF0b3I7CgogIF9Mb2NhbENsYXNzTWlycm9yLl8oCiAgICAgIHJlZmxlY3RlZSwKICAgICAgcmVmbGVjdGVkVHlwZSwKICAgICAgU3RyaW5nIHNpbXBsZU5hbWUsCiAgICAgIHRoaXMuX293bmVyLAogICAgICB0aGlzLmlzQWJzdHJhY3QsCiAgICAgIHRoaXMuX2lzR2VuZXJpYywKICAgICAgdGhpcy5faXNUcmFuc2Zvcm1lZE1peGluQXBwbGljYXRpb24sCiAgICAgIHRoaXMuX2lzR2VuZXJpY0RlY2xhcmF0aW9uLAogICAgICB0aGlzLmlzRW51bSkKICAgICAgOiB0aGlzLl9zaW1wbGVOYW1lID0gX3Moc2ltcGxlTmFtZSksCiAgICAgICAgdGhpcy5fcmVmbGVjdGVkVHlwZSA9IHJlZmxlY3RlZFR5cGUsCiAgICAgICAgdGhpcy5faW5zdGFudGlhdG9yID0gcmVmbGVjdGVkVHlwZSwKICAgICAgICBzdXBlci5fKHJlZmxlY3RlZSk7CgogIGJvb2wgZ2V0IGhhc1JlZmxlY3RlZFR5cGUgPT4gIV9pc0dlbmVyaWNEZWNsYXJhdGlvbjsKICBUeXBlIGdldCByZWZsZWN0ZWRUeXBlIHsKICAgIGlmICghaGFzUmVmbGVjdGVkVHlwZSkgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJEZWNsYXJhdGlvbnMgb2YgZ2VuZXJpY3MgaGF2ZSBubyByZWZsZWN0ZWQgdHlwZSIpOwogICAgfQogICAgcmV0dXJuIF9yZWZsZWN0ZWRUeXBlOwogIH0KCiAgU3ltYm9sIGdldCBzaW1wbGVOYW1lIHsKICAgIC8vIEFsbCBidXQgYW5vbnltb3VzIG1peGluIGFwcGxpY2F0aW9ucyBoYXZlIHRoZWlyIG5hbWUgc2V0IGF0IGNvbnN0cnVjdGlvbi4KICAgIGlmIChfc2ltcGxlTmFtZSA9PSBudWxsKSB7CiAgICAgIF9zaW1wbGVOYW1lID0gdGhpcy5fbWl4aW5BcHBsaWNhdGlvbk5hbWU7CiAgICB9CiAgICByZXR1cm4gX3NpbXBsZU5hbWU7CiAgfQoKICBTeW1ib2wgX3F1YWxpZmllZE5hbWU7CiAgU3ltYm9sIGdldCBxdWFsaWZpZWROYW1lIHsKICAgIGlmIChfcXVhbGlmaWVkTmFtZSA9PSBudWxsKSB7CiAgICAgIF9xdWFsaWZpZWROYW1lID0gX2NvbXB1dGVRdWFsaWZpZWROYW1lKG93bmVyLCBzaW1wbGVOYW1lKTsKICAgIH0KICAgIHJldHVybiBfcXVhbGlmaWVkTmFtZTsKICB9CgogIERlY2xhcmF0aW9uTWlycm9yIGdldCBvd25lciB7CiAgICBpZiAoX293bmVyID09IG51bGwpIHsKICAgICAgdmFyIHVyaSA9IF9Mb2NhbENsYXNzTWlycm9yLl9saWJyYXJ5VXJpKF9yZWZsZWN0ZWUpOwogICAgICBfb3duZXIgPSBjdXJyZW50TWlycm9yU3lzdGVtKCkubGlicmFyaWVzW1VyaS5wYXJzZSh1cmkpXTsKICAgIH0KICAgIHJldHVybiBfb3duZXI7CiAgfQoKICBib29sIGdldCBpc1ByaXZhdGUgPT4gX24oc2ltcGxlTmFtZSkuc3RhcnRzV2l0aCgnXycpOwoKICBib29sIGdldCBpc1RvcExldmVsID0+IHRydWU7CgogIFNvdXJjZUxvY2F0aW9uIGdldCBsb2NhdGlvbiB7CiAgICByZXR1cm4gX2xvY2F0aW9uKF9yZWZsZWN0ZWUpOwogIH0KCiAgX0xvY2FsQ2xhc3NNaXJyb3IgX3RydWVTdXBlcmNsYXNzRmllbGQ7CiAgX0xvY2FsQ2xhc3NNaXJyb3IgZ2V0IF90cnVlU3VwZXJjbGFzcyB7CiAgICBpZiAoX3RydWVTdXBlcmNsYXNzRmllbGQgPT0gbnVsbCkgewogICAgICBUeXBlIHN1cGVydHlwZSA9IGlzT3JpZ2luYWxEZWNsYXJhdGlvbgogICAgICAgICAgPyBfc3VwZXJ0eXBlKF9yZWZsZWN0ZWRUeXBlKQogICAgICAgICAgOiBfc3VwZXJ0eXBlSW5zdGFudGlhdGVkKF9yZWZsZWN0ZWRUeXBlKTsKICAgICAgaWYgKHN1cGVydHlwZSA9PSBudWxsKSB7CiAgICAgICAgLy8gT2JqZWN0IGhhcyBubyBzdXBlcmNsYXNzLgogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIF90cnVlU3VwZXJjbGFzc0ZpZWxkID0gcmVmbGVjdFR5cGUoc3VwZXJ0eXBlKTsKICAgICAgX3RydWVTdXBlcmNsYXNzRmllbGQuX2luc3RhbnRpYXRvciA9IF9pbnN0YW50aWF0b3I7CiAgICB9CiAgICByZXR1cm4gX3RydWVTdXBlcmNsYXNzRmllbGQ7CiAgfQoKICBDbGFzc01pcnJvciBnZXQgc3VwZXJjbGFzcyB7CiAgICByZXR1cm4gX3RydWVTdXBlcmNsYXNzOwogIH0KCiAgdmFyIF9zdXBlcmludGVyZmFjZXM7CiAgTGlzdDxDbGFzc01pcnJvcj4gZ2V0IHN1cGVyaW50ZXJmYWNlcyB7CiAgICBpZiAoX3N1cGVyaW50ZXJmYWNlcyA9PSBudWxsKSB7CiAgICAgIHZhciBpbnRlcmZhY2VUeXBlcyA9IGlzT3JpZ2luYWxEZWNsYXJhdGlvbgogICAgICAgICAgPyBfbmF0aXZlSW50ZXJmYWNlcyhfcmVmbGVjdGVkVHlwZSkKICAgICAgICAgIDogX25hdGl2ZUludGVyZmFjZXNJbnN0YW50aWF0ZWQoX3JlZmxlY3RlZFR5cGUpOwogICAgICBpZiAoX2lzVHJhbnNmb3JtZWRNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgaW50ZXJmYWNlVHlwZXMgPSBpbnRlcmZhY2VUeXBlcy5zdWJsaXN0KDAsIGludGVyZmFjZVR5cGVzLmxlbmd0aCAtIDEpOwogICAgICB9CiAgICAgIHZhciBpbnRlcmZhY2VNaXJyb3JzID0gbmV3IExpc3Q8Q2xhc3NNaXJyb3I+KCk7CiAgICAgIGZvciAodmFyIGludGVyZmFjZVR5cGUgaW4gaW50ZXJmYWNlVHlwZXMpIHsKICAgICAgICBpbnRlcmZhY2VNaXJyb3JzLmFkZChyZWZsZWN0VHlwZShpbnRlcmZhY2VUeXBlKSk7CiAgICAgIH0KICAgICAgX3N1cGVyaW50ZXJmYWNlcyA9CiAgICAgICAgICBuZXcgVW5tb2RpZmlhYmxlTGlzdFZpZXc8Q2xhc3NNaXJyb3I+KGludGVyZmFjZU1pcnJvcnMpOwogICAgfQogICAgcmV0dXJuIF9zdXBlcmludGVyZmFjZXM7CiAgfQoKICBnZXQgX21peGluQXBwbGljYXRpb25OYW1lIHsKICAgIHZhciBtaXhpbnMgPSBuZXcgTGlzdDxDbGFzc01pcnJvcj4oKTsKICAgIHZhciBrbGFzcyA9IHRoaXM7CiAgICB3aGlsZSAoX25hdGl2ZU1peGluKGtsYXNzLl9yZWZsZWN0ZWRUeXBlKSAhPSBudWxsKSB7CiAgICAgIG1peGlucy5hZGQoa2xhc3MubWl4aW4pOwogICAgICBrbGFzcyA9IGtsYXNzLnN1cGVyY2xhc3M7CiAgICB9CiAgICByZXR1cm4gX3MoX24oa2xhc3MucXVhbGlmaWVkTmFtZSkgKwogICAgICAgICcgd2l0aCAnICsKICAgICAgICBtaXhpbnMucmV2ZXJzZWQubWFwKChtKSA9PiBfbihtLnF1YWxpZmllZE5hbWUpKS5qb2luKCcsICcpKTsKICB9CgogIHZhciBfbWl4aW47CiAgQ2xhc3NNaXJyb3IgZ2V0IG1peGluIHsKICAgIGlmIChfbWl4aW4gPT0gbnVsbCkgewogICAgICBUeXBlIG1peGluVHlwZSA9CiAgICAgICAgICBfbmF0aXZlTWl4aW5JbnN0YW50aWF0ZWQoX3JlZmxlY3RlZFR5cGUsIF9pbnN0YW50aWF0b3IpOwogICAgICBpZiAobWl4aW5UeXBlID09IG51bGwpIHsKICAgICAgICAvLyBUaGUgcmVmbGVjdGVlIGlzIG5vdCBhIG1peGluIGFwcGxpY2F0aW9uLgogICAgICAgIF9taXhpbiA9IHRoaXM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX21peGluID0gcmVmbGVjdFR5cGUobWl4aW5UeXBlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9taXhpbjsKICB9CgogIHZhciBfY2FjaGVkU3RhdGljTWVtYmVyczsKICBNYXA8U3ltYm9sLCBNZXRob2RNaXJyb3I+IGdldCBzdGF0aWNNZW1iZXJzIHsKICAgIGlmIChfY2FjaGVkU3RhdGljTWVtYmVycyA9PSBudWxsKSB7CiAgICAgIHZhciByZXN1bHQgPSBuZXcgTWFwPFN5bWJvbCwgTWV0aG9kTWlycm9yPigpOwogICAgICBkZWNsYXJhdGlvbnMudmFsdWVzLmZvckVhY2goKGRlY2wpIHsKICAgICAgICBpZiAoZGVjbCBpcyBNZXRob2RNaXJyb3IgJiYgZGVjbC5pc1N0YXRpYyAmJiAhZGVjbC5pc0NvbnN0cnVjdG9yKSB7CiAgICAgICAgICByZXN1bHRbZGVjbC5zaW1wbGVOYW1lXSA9IGRlY2w7CiAgICAgICAgfQogICAgICAgIGlmIChkZWNsIGlzIFZhcmlhYmxlTWlycm9yICYmIGRlY2wuaXNTdGF0aWMpIHsKICAgICAgICAgIHZhciBnZXR0ZXJOYW1lID0gZGVjbC5zaW1wbGVOYW1lOwogICAgICAgICAgcmVzdWx0W2dldHRlck5hbWVdID0KICAgICAgICAgICAgICBuZXcgX1N5bnRoZXRpY0FjY2Vzc29yKHRoaXMsIGdldHRlck5hbWUsIHRydWUsIHRydWUsIGZhbHNlLCBkZWNsKTsKICAgICAgICAgIGlmICghZGVjbC5pc0ZpbmFsKSB7CiAgICAgICAgICAgIHZhciBzZXR0ZXJOYW1lID0gX2FzU2V0dGVyKGRlY2wuc2ltcGxlTmFtZSwgdGhpcy5vd25lcik7CiAgICAgICAgICAgIHJlc3VsdFtzZXR0ZXJOYW1lXSA9IG5ldyBfU3ludGhldGljQWNjZXNzb3IoCiAgICAgICAgICAgICAgICB0aGlzLCBzZXR0ZXJOYW1lLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGRlY2wpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIF9jYWNoZWRTdGF0aWNNZW1iZXJzID0KICAgICAgICAgIG5ldyBVbm1vZGlmaWFibGVNYXBWaWV3PFN5bWJvbCwgTWV0aG9kTWlycm9yPihyZXN1bHQpOwogICAgfQogICAgcmV0dXJuIF9jYWNoZWRTdGF0aWNNZW1iZXJzOwogIH0KCiAgdmFyIF9jYWNoZWRJbnN0YW5jZU1lbWJlcnM7CiAgTWFwPFN5bWJvbCwgTWV0aG9kTWlycm9yPiBnZXQgaW5zdGFuY2VNZW1iZXJzIHsKICAgIGlmIChfY2FjaGVkSW5zdGFuY2VNZW1iZXJzID09IG51bGwpIHsKICAgICAgdmFyIHJlc3VsdCA9IG5ldyBNYXA8U3ltYm9sLCBNZXRob2RNaXJyb3I+KCk7CiAgICAgIGlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsKICAgICAgICByZXN1bHQuYWRkQWxsKHN1cGVyY2xhc3MuaW5zdGFuY2VNZW1iZXJzKTsKICAgICAgfQogICAgICBkZWNsYXJhdGlvbnMudmFsdWVzLmZvckVhY2goKGRlY2wpIHsKICAgICAgICBpZiAoZGVjbCBpcyBNZXRob2RNaXJyb3IgJiYKICAgICAgICAgICAgIWRlY2wuaXNTdGF0aWMgJiYKICAgICAgICAgICAgIWRlY2wuaXNDb25zdHJ1Y3RvciAmJgogICAgICAgICAgICAhZGVjbC5pc0Fic3RyYWN0KSB7CiAgICAgICAgICByZXN1bHRbZGVjbC5zaW1wbGVOYW1lXSA9IGRlY2w7CiAgICAgICAgfQogICAgICAgIGlmIChkZWNsIGlzIFZhcmlhYmxlTWlycm9yICYmICFkZWNsLmlzU3RhdGljKSB7CiAgICAgICAgICB2YXIgZ2V0dGVyTmFtZSA9IGRlY2wuc2ltcGxlTmFtZTsKICAgICAgICAgIHJlc3VsdFtnZXR0ZXJOYW1lXSA9IG5ldyBfU3ludGhldGljQWNjZXNzb3IoCiAgICAgICAgICAgICAgdGhpcywgZ2V0dGVyTmFtZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBkZWNsKTsKICAgICAgICAgIGlmICghZGVjbC5pc0ZpbmFsKSB7CiAgICAgICAgICAgIHZhciBzZXR0ZXJOYW1lID0gX2FzU2V0dGVyKGRlY2wuc2ltcGxlTmFtZSwgdGhpcy5vd25lcik7CiAgICAgICAgICAgIHJlc3VsdFtzZXR0ZXJOYW1lXSA9IG5ldyBfU3ludGhldGljQWNjZXNzb3IoCiAgICAgICAgICAgICAgICB0aGlzLCBzZXR0ZXJOYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBkZWNsKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBfY2FjaGVkSW5zdGFuY2VNZW1iZXJzID0KICAgICAgICAgIG5ldyBVbm1vZGlmaWFibGVNYXBWaWV3PFN5bWJvbCwgTWV0aG9kTWlycm9yPihyZXN1bHQpOwogICAgfQogICAgcmV0dXJuIF9jYWNoZWRJbnN0YW5jZU1lbWJlcnM7CiAgfQoKICBNYXA8U3ltYm9sLCBEZWNsYXJhdGlvbk1pcnJvcj4gX2RlY2xhcmF0aW9uczsKICBNYXA8U3ltYm9sLCBEZWNsYXJhdGlvbk1pcnJvcj4gZ2V0IGRlY2xhcmF0aW9ucyB7CiAgICBpZiAoX2RlY2xhcmF0aW9ucyAhPSBudWxsKSByZXR1cm4gX2RlY2xhcmF0aW9uczsKCiAgICB2YXIgZGVjbHMgPSBuZXcgTWFwPFN5bWJvbCwgRGVjbGFyYXRpb25NaXJyb3I+KCk7CgogICAgdmFyIG1lbWJlcnMgPSAobWl4aW4gYXMgX0xvY2FsQ2xhc3NNaXJyb3IpLl9jb21wdXRlTWVtYmVycygKICAgICAgICBfaW5zdGFudGlhdG9yLCAobWl4aW4gYXMgX0xvY2FsQ2xhc3NNaXJyb3IpLl9yZWZsZWN0ZWUpOwogICAgZm9yICh2YXIgbWVtYmVyIGluIG1lbWJlcnMpIHsKICAgICAgZGVjbHNbbWVtYmVyLnNpbXBsZU5hbWVdID0gbWVtYmVyOwogICAgfQoKICAgIHZhciBjb25zdHJ1Y3RvcnMgPSBfY29tcHV0ZUNvbnN0cnVjdG9ycyhfaW5zdGFudGlhdG9yLCBfcmVmbGVjdGVlKTsKICAgIHZhciBzdHJpbmdOYW1lID0gX24oc2ltcGxlTmFtZSk7CiAgICBmb3IgKHZhciBjb25zdHJ1Y3RvciBpbiBjb25zdHJ1Y3RvcnMpIHsKICAgICAgY29uc3RydWN0b3IuX3BhdGNoQ29uc3RydWN0b3JOYW1lKHN0cmluZ05hbWUpOwogICAgICBkZWNsc1tjb25zdHJ1Y3Rvci5zaW1wbGVOYW1lXSA9IGNvbnN0cnVjdG9yOwogICAgfQoKICAgIGZvciAodmFyIHR5cGVWYXJpYWJsZSBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgIGRlY2xzW3R5cGVWYXJpYWJsZS5zaW1wbGVOYW1lXSA9IHR5cGVWYXJpYWJsZTsKICAgIH0KCiAgICByZXR1cm4gX2RlY2xhcmF0aW9ucyA9CiAgICAgICAgbmV3IFVubW9kaWZpYWJsZU1hcFZpZXc8U3ltYm9sLCBEZWNsYXJhdGlvbk1pcnJvcj4oZGVjbHMpOwogIH0KCiAgLy8gTm90ZTogcmV0dXJucyBjb3JyZWN0IHJlc3VsdCBvbmx5IGZvciBEYXJ0IDEgYW5vbnltb3VzIG1peGluIGFwcGxpY2F0aW9ucy4KICBib29sIGdldCBfaXNBbm9ueW1vdXNNaXhpbkFwcGxpY2F0aW9uIHsKICAgIGlmIChtaXhpbiA9PSB0aGlzKSByZXR1cm4gZmFsc2U7IC8vIE5vdCBhIG1peGluIGFwcGxpY2F0aW9uLgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBMaXN0PFR5cGVWYXJpYWJsZU1pcnJvcj4gX3R5cGVWYXJpYWJsZXM7CiAgTGlzdDxUeXBlVmFyaWFibGVNaXJyb3I+IGdldCB0eXBlVmFyaWFibGVzIHsKICAgIGlmIChfdHlwZVZhcmlhYmxlcyA9PSBudWxsKSB7CiAgICAgIGlmICghX2lzVHJhbnNmb3JtZWRNaXhpbkFwcGxpY2F0aW9uICYmIF9pc0Fub255bW91c01peGluQXBwbGljYXRpb24pIHsKICAgICAgICByZXR1cm4gX3R5cGVWYXJpYWJsZXMgPSBjb25zdCA8VHlwZVZhcmlhYmxlTWlycm9yPltdOwogICAgICB9CiAgICAgIF90eXBlVmFyaWFibGVzID0gbmV3IExpc3Q8VHlwZVZhcmlhYmxlTWlycm9yPigpOwoKICAgICAgTGlzdCBwYXJhbXMgPSBfQ2xhc3NNaXJyb3JfdHlwZV92YXJpYWJsZXMoX3JlZmxlY3RlZSk7CiAgICAgIENsYXNzTWlycm9yIG93bmVyID0gb3JpZ2luYWxEZWNsYXJhdGlvbjsKICAgICAgdmFyIG1pcnJvcjsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICBtaXJyb3IgPSBuZXcgX0xvY2FsVHlwZVZhcmlhYmxlTWlycm9yLl8ocGFyYW1zW2kgKyAxXSwgcGFyYW1zW2ldLCBvd25lcik7CiAgICAgICAgX3R5cGVWYXJpYWJsZXMuYWRkKG1pcnJvcik7CiAgICAgIH0KICAgICAgX3R5cGVWYXJpYWJsZXMgPQogICAgICAgICAgbmV3IFVubW9kaWZpYWJsZUxpc3RWaWV3PFR5cGVWYXJpYWJsZU1pcnJvcj4oX3R5cGVWYXJpYWJsZXMpOwogICAgfQogICAgcmV0dXJuIF90eXBlVmFyaWFibGVzOwogIH0KCiAgTGlzdDxUeXBlTWlycm9yPiBfdHlwZUFyZ3VtZW50czsKICBMaXN0PFR5cGVNaXJyb3I+IGdldCB0eXBlQXJndW1lbnRzIHsKICAgIGlmIChfdHlwZUFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIGlmIChfaXNHZW5lcmljRGVjbGFyYXRpb24gfHwKICAgICAgICAgICghX2lzVHJhbnNmb3JtZWRNaXhpbkFwcGxpY2F0aW9uICYmIF9pc0Fub255bW91c01peGluQXBwbGljYXRpb24pKSB7CiAgICAgICAgX3R5cGVBcmd1bWVudHMgPSBjb25zdCA8VHlwZU1pcnJvcj5bXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfdHlwZUFyZ3VtZW50cyA9IG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxUeXBlTWlycm9yPigKICAgICAgICAgICAgX2NvbXB1dGVUeXBlQXJndW1lbnRzKF9yZWZsZWN0ZWRUeXBlKS5jYXN0PFR5cGVNaXJyb3I+KCkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX3R5cGVBcmd1bWVudHM7CiAgfQoKICBib29sIGdldCBpc09yaWdpbmFsRGVjbGFyYXRpb24gPT4gIV9pc0dlbmVyaWMgfHwgX2lzR2VuZXJpY0RlY2xhcmF0aW9uOwoKICBDbGFzc01pcnJvciBnZXQgb3JpZ2luYWxEZWNsYXJhdGlvbiB7CiAgICBpZiAoaXNPcmlnaW5hbERlY2xhcmF0aW9uKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJlZmxlY3RDbGFzcyhfcmVmbGVjdGVkVHlwZSk7CiAgICB9CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiQ2xhc3NNaXJyb3Igb24gJyR7TWlycm9yU3lzdGVtLmdldE5hbWUoc2ltcGxlTmFtZSl9JyI7CgogIEluc3RhbmNlTWlycm9yIG5ld0luc3RhbmNlKFN5bWJvbCBjb25zdHJ1Y3Rvck5hbWUsIExpc3QgcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgW01hcDxTeW1ib2wsIGR5bmFtaWM+IG5hbWVkQXJndW1lbnRzXSkgewogICAgLy8gTmF0aXZlIGNvZGUgd2lsbCBhZGQgdGhlIDEgb3IgMiBpbXBsaWNpdCBhcmd1bWVudHMgZGVwZW5kaW5nIG9uIHdoZXRoZXIKICAgIC8vIHdlIGVuZCB1cCBpbnZva2luZyBhIGZhY3Rvcnkgb3IgY29uc3RydWN0b3IgcmVzcGVjdGl2ZWx5LgogICAgaW50IG51bVBvc2l0aW9uYWxBcmd1bWVudHMgPSBwb3NpdGlvbmFsQXJndW1lbnRzLmxlbmd0aDsKICAgIGludCBudW1OYW1lZEFyZ3VtZW50cyA9IG5hbWVkQXJndW1lbnRzICE9IG51bGwgPyBuYW1lZEFyZ3VtZW50cy5sZW5ndGggOiAwOwogICAgaW50IG51bUFyZ3VtZW50cyA9IG51bVBvc2l0aW9uYWxBcmd1bWVudHMgKyBudW1OYW1lZEFyZ3VtZW50czsKICAgIExpc3QgYXJndW1lbnRzID0gbmV3IExpc3QobnVtQXJndW1lbnRzKTsKICAgIGFyZ3VtZW50cy5zZXRSYW5nZSgwLCBudW1Qb3NpdGlvbmFsQXJndW1lbnRzLCBwb3NpdGlvbmFsQXJndW1lbnRzKTsKICAgIExpc3QgbmFtZXMgPSBuZXcgTGlzdChudW1OYW1lZEFyZ3VtZW50cyk7CiAgICBpbnQgYXJndW1lbnRJbmRleCA9IG51bVBvc2l0aW9uYWxBcmd1bWVudHM7CiAgICBpbnQgbmFtZUluZGV4ID0gMDsKICAgIGlmIChudW1OYW1lZEFyZ3VtZW50cyA+IDApIHsKICAgICAgbmFtZWRBcmd1bWVudHMuZm9yRWFjaCgobmFtZSwgdmFsdWUpIHsKICAgICAgICBhcmd1bWVudHNbYXJndW1lbnRJbmRleCsrXSA9IHZhbHVlOwogICAgICAgIG5hbWVzW25hbWVJbmRleCsrXSA9IF9uKG5hbWUpOwogICAgICB9KTsKICAgIH0KCiAgICByZXR1cm4gcmVmbGVjdChfaW52b2tlQ29uc3RydWN0b3IoCiAgICAgICAgX3JlZmxlY3RlZSwgX3JlZmxlY3RlZFR5cGUsIF9uKGNvbnN0cnVjdG9yTmFtZSksIGFyZ3VtZW50cywgbmFtZXMpKTsKICB9CgogIExpc3Q8SW5zdGFuY2VNaXJyb3I+IGdldCBtZXRhZGF0YSB7CiAgICAvLyBHZXQgdGhlIG1ldGFkYXRhIG9iamVjdHMsIGNvbnZlcnQgdGhlbSBpbnRvIEluc3RhbmNlTWlycm9ycyB1c2luZwogICAgLy8gcmVmbGVjdCgpIGFuZCB0aGVuIG1ha2UgdGhlbSBpbnRvIGEgRGFydCBsaXN0LgogICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxJbnN0YW5jZU1pcnJvcj4oCiAgICAgICAgX21ldGFkYXRhKF9yZWZsZWN0ZWUpLm1hcChyZWZsZWN0KSk7CiAgfQoKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICByZXR1cm4gdGhpcy5ydW50aW1lVHlwZSA9PSBvdGhlci5ydW50aW1lVHlwZSAmJgogICAgICAgIHRoaXMuX3JlZmxlY3RlZSA9PSBvdGhlci5fcmVmbGVjdGVlICYmCiAgICAgICAgdGhpcy5fcmVmbGVjdGVkVHlwZSA9PSBvdGhlci5fcmVmbGVjdGVkVHlwZSAmJgogICAgICAgIHRoaXMuX2lzR2VuZXJpY0RlY2xhcmF0aW9uID09IG90aGVyLl9pc0dlbmVyaWNEZWNsYXJhdGlvbjsKICB9CgogIGludCBnZXQgaGFzaENvZGUgPT4gc2ltcGxlTmFtZS5oYXNoQ29kZTsKCiAgYm9vbCBpc1N1YnR5cGVPZihUeXBlTWlycm9yIG90aGVyKSB7CiAgICBpZiAob3RoZXIgPT0gY3VycmVudE1pcnJvclN5c3RlbSgpLmR5bmFtaWNUeXBlKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciA9PSBjdXJyZW50TWlycm9yU3lzdGVtKCkudm9pZFR5cGUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfc3VidHlwZVRlc3QoCiAgICAgICAgX3JlZmxlY3RlZFR5cGUsIChvdGhlciBhcyBfTG9jYWxUeXBlTWlycm9yKS5fcmVmbGVjdGVkVHlwZSk7CiAgfQoKICBib29sIGlzQXNzaWduYWJsZVRvKFR5cGVNaXJyb3Igb3RoZXIpIHsKICAgIGlmIChvdGhlciA9PSBjdXJyZW50TWlycm9yU3lzdGVtKCkuZHluYW1pY1R5cGUpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyID09IGN1cnJlbnRNaXJyb3JTeXN0ZW0oKS52b2lkVHlwZSkgcmV0dXJuIGZhbHNlOwogICAgZmluYWwgb3RoZXJSZWZsZWN0ZWRUeXBlID0gKG90aGVyIGFzIF9Mb2NhbFR5cGVNaXJyb3IpLl9yZWZsZWN0ZWRUeXBlOwogICAgcmV0dXJuIF9zdWJ0eXBlVGVzdChfcmVmbGVjdGVkVHlwZSwgb3RoZXJSZWZsZWN0ZWRUeXBlKSB8fAogICAgICAgIF9zdWJ0eXBlVGVzdChvdGhlclJlZmxlY3RlZFR5cGUsIF9yZWZsZWN0ZWRUeXBlKTsKICB9CgogIGJvb2wgaXNTdWJjbGFzc09mKENsYXNzTWlycm9yIG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIENsYXNzTWlycm9yKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihvdGhlcik7CiAgICBDbGFzc01pcnJvciBvdGhlckRlY2xhcmF0aW9uID0gb3RoZXIub3JpZ2luYWxEZWNsYXJhdGlvbjsKICAgIENsYXNzTWlycm9yIGMgPSB0aGlzOwogICAgd2hpbGUgKGMgIT0gbnVsbCkgewogICAgICBjID0gYy5vcmlnaW5hbERlY2xhcmF0aW9uOwogICAgICBpZiAoYyA9PSBvdGhlckRlY2xhcmF0aW9uKSByZXR1cm4gdHJ1ZTsKICAgICAgYyA9IGMuc3VwZXJjbGFzczsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHN0YXRpYyBTdHJpbmcgX2xpYnJhcnlVcmkocmVmbGVjdGVlKSBuYXRpdmUgIkNsYXNzTWlycm9yX2xpYnJhcnlVcmkiOwoKICBzdGF0aWMgVHlwZSBfc3VwZXJ0eXBlKHJlZmxlY3RlZFR5cGUpIG5hdGl2ZSAiQ2xhc3NNaXJyb3Jfc3VwZXJ0eXBlIjsKCiAgc3RhdGljIFR5cGUgX3N1cGVydHlwZUluc3RhbnRpYXRlZChyZWZsZWN0ZWRUeXBlKQogICAgICBuYXRpdmUgIkNsYXNzTWlycm9yX3N1cGVydHlwZV9pbnN0YW50aWF0ZWQiOwoKICBzdGF0aWMgTGlzdDxkeW5hbWljPiBfbmF0aXZlSW50ZXJmYWNlcyhyZWZsZWN0ZWRUeXBlKQogICAgICBuYXRpdmUgIkNsYXNzTWlycm9yX2ludGVyZmFjZXMiOwoKICBzdGF0aWMgTGlzdDxkeW5hbWljPiBfbmF0aXZlSW50ZXJmYWNlc0luc3RhbnRpYXRlZChyZWZsZWN0ZWRUeXBlKQogICAgICBuYXRpdmUgIkNsYXNzTWlycm9yX2ludGVyZmFjZXNfaW5zdGFudGlhdGVkIjsKCiAgc3RhdGljIFR5cGUgX25hdGl2ZU1peGluKHJlZmxlY3RlZFR5cGUpIG5hdGl2ZSAiQ2xhc3NNaXJyb3JfbWl4aW4iOwoKICBzdGF0aWMgVHlwZSBfbmF0aXZlTWl4aW5JbnN0YW50aWF0ZWQocmVmbGVjdGVkVHlwZSwgaW5zdGFudGlhdG9yKQogICAgICBuYXRpdmUgIkNsYXNzTWlycm9yX21peGluX2luc3RhbnRpYXRlZCI7CgogIExpc3Q8ZHluYW1pYz4gX2NvbXB1dGVNZW1iZXJzKHJlZmxlY3RlZSwgaW5zdGFudGlhdG9yKQogICAgICBuYXRpdmUgIkNsYXNzTWlycm9yX21lbWJlcnMiOwoKICBMaXN0PGR5bmFtaWM+IF9jb21wdXRlQ29uc3RydWN0b3JzKHJlZmxlY3RlZSwgaW5zdGFudGlhdG9yKQogICAgICBuYXRpdmUgIkNsYXNzTWlycm9yX2NvbnN0cnVjdG9ycyI7CgogIF9pbnZva2UocmVmbGVjdGVlLCBtZW1iZXJOYW1lLCBhcmd1bWVudHMsIGFyZ3VtZW50TmFtZXMpCiAgICAgIG5hdGl2ZSAnQ2xhc3NNaXJyb3JfaW52b2tlJzsKCiAgX2ludm9rZUdldHRlcihyZWZsZWN0ZWUsIGdldHRlck5hbWUpIG5hdGl2ZSAnQ2xhc3NNaXJyb3JfaW52b2tlR2V0dGVyJzsKCiAgX2ludm9rZVNldHRlcihyZWZsZWN0ZWUsIHNldHRlck5hbWUsIHZhbHVlKSBuYXRpdmUgJ0NsYXNzTWlycm9yX2ludm9rZVNldHRlcic7CgogIHN0YXRpYyBfaW52b2tlQ29uc3RydWN0b3IocmVmbGVjdGVlLCB0eXBlLCBjb25zdHJ1Y3Rvck5hbWUsIGFyZ3VtZW50cywKICAgICAgYXJndW1lbnROYW1lcykgbmF0aXZlICdDbGFzc01pcnJvcl9pbnZva2VDb25zdHJ1Y3Rvcic7CgogIHN0YXRpYyBMaXN0PGR5bmFtaWM+IF9DbGFzc01pcnJvcl90eXBlX3ZhcmlhYmxlcyhyZWZsZWN0ZWUpCiAgICAgIG5hdGl2ZSAiQ2xhc3NNaXJyb3JfdHlwZV92YXJpYWJsZXMiOwoKICBzdGF0aWMgTGlzdDxkeW5hbWljPiBfY29tcHV0ZVR5cGVBcmd1bWVudHMocmVmbGVjdGVlKQogICAgICBuYXRpdmUgIkNsYXNzTWlycm9yX3R5cGVfYXJndW1lbnRzIjsKfQoKY2xhc3MgX0xvY2FsRnVuY3Rpb25UeXBlTWlycm9yIGV4dGVuZHMgX0xvY2FsQ2xhc3NNaXJyb3IKICAgIGltcGxlbWVudHMgRnVuY3Rpb25UeXBlTWlycm9yIHsKICBmaW5hbCBfZnVuY3Rpb25SZWZsZWN0ZWU7CiAgX0xvY2FsRnVuY3Rpb25UeXBlTWlycm9yLl8ocmVmbGVjdGVlLCB0aGlzLl9mdW5jdGlvblJlZmxlY3RlZSwgcmVmbGVjdGVkVHlwZSkKICAgICAgOiBzdXBlci5fKHJlZmxlY3RlZSwgcmVmbGVjdGVkVHlwZSwgbnVsbCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCiAgICAgICAgICAgIGZhbHNlKTsKCiAgYm9vbCBnZXQgX2lzQW5vbnltb3VzTWl4aW5BcHBsaWNhdGlvbiA9PiBmYWxzZTsKCiAgLy8gRnVuY3Rpb25UeXBlTWlycm9ycyBoYXZlIGEgc2ltcGxlTmFtZSBnZW5lcmF0ZWQgZnJvbSB0aGVpciBzaWduYXR1cmUuCiAgU3ltYm9sIF9zaW1wbGVOYW1lOwogIFN5bWJvbCBnZXQgc2ltcGxlTmFtZSB7CiAgICBpZiAoX3NpbXBsZU5hbWUgPT0gbnVsbCkgewogICAgICBfc2ltcGxlTmFtZSA9IF9zKF9tYWtlU2lnbmF0dXJlU3RyaW5nKHJldHVyblR5cGUsIHBhcmFtZXRlcnMpKTsKICAgIH0KICAgIHJldHVybiBfc2ltcGxlTmFtZTsKICB9CgogIE1ldGhvZE1pcnJvciBfY2FsbE1ldGhvZDsKICBNZXRob2RNaXJyb3IgZ2V0IGNhbGxNZXRob2QgewogICAgaWYgKF9jYWxsTWV0aG9kID09IG51bGwpIHsKICAgICAgX2NhbGxNZXRob2QgPSBfRnVuY3Rpb25UeXBlTWlycm9yX2NhbGxfbWV0aG9kKF9mdW5jdGlvblJlZmxlY3RlZSk7CiAgICB9CiAgICByZXR1cm4gX2NhbGxNZXRob2Q7CiAgfQoKICBUeXBlTWlycm9yIF9yZXR1cm5UeXBlOwogIFR5cGVNaXJyb3IgZ2V0IHJldHVyblR5cGUgewogICAgaWYgKF9yZXR1cm5UeXBlID09IG51bGwpIHsKICAgICAgX3JldHVyblR5cGUgPQogICAgICAgICAgcmVmbGVjdFR5cGUoX0Z1bmN0aW9uVHlwZU1pcnJvcl9yZXR1cm5fdHlwZShfZnVuY3Rpb25SZWZsZWN0ZWUpKTsKICAgIH0KICAgIHJldHVybiBfcmV0dXJuVHlwZTsKICB9CgogIExpc3Q8UGFyYW1ldGVyTWlycm9yPiBfcGFyYW1ldGVyczsKICBMaXN0PFBhcmFtZXRlck1pcnJvcj4gZ2V0IHBhcmFtZXRlcnMgewogICAgaWYgKF9wYXJhbWV0ZXJzID09IG51bGwpIHsKICAgICAgX3BhcmFtZXRlcnMgPSBfRnVuY3Rpb25UeXBlTWlycm9yX3BhcmFtZXRlcnMoX2Z1bmN0aW9uUmVmbGVjdGVlKQogICAgICAgICAgLmNhc3Q8UGFyYW1ldGVyTWlycm9yPigpOwogICAgICBfcGFyYW1ldGVycyA9IG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxQYXJhbWV0ZXJNaXJyb3I+KF9wYXJhbWV0ZXJzKTsKICAgIH0KICAgIHJldHVybiBfcGFyYW1ldGVyczsKICB9CgogIGJvb2wgZ2V0IGlzT3JpZ2luYWxEZWNsYXJhdGlvbiA9PiB0cnVlOwogIENsYXNzTWlycm9yIGdldCBvcmlnaW5hbERlY2xhcmF0aW9uID0+IHRoaXM7CiAgZ2V0IHR5cGVWYXJpYWJsZXMgPT4gY29uc3QgPFR5cGVWYXJpYWJsZU1pcnJvcj5bXTsKICBnZXQgdHlwZUFyZ3VtZW50cyA9PiBjb25zdCA8VHlwZU1pcnJvcj5bXTsKICBnZXQgbWV0YWRhdGEgPT4gY29uc3QgPEluc3RhbmNlTWlycm9yPltdOwogIGdldCBsb2NhdGlvbiA9PiBudWxsOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiRnVuY3Rpb25UeXBlTWlycm9yIG9uICcke19uKHNpbXBsZU5hbWUpfSciOwoKICBNZXRob2RNaXJyb3IgX0Z1bmN0aW9uVHlwZU1pcnJvcl9jYWxsX21ldGhvZChmdW5jdGlvblJlZmxlY3RlZSkKICAgICAgbmF0aXZlICJGdW5jdGlvblR5cGVNaXJyb3JfY2FsbF9tZXRob2QiOwoKICBzdGF0aWMgVHlwZSBfRnVuY3Rpb25UeXBlTWlycm9yX3JldHVybl90eXBlKGZ1bmN0aW9uUmVmbGVjdGVlKQogICAgICBuYXRpdmUgIkZ1bmN0aW9uVHlwZU1pcnJvcl9yZXR1cm5fdHlwZSI7CgogIExpc3Q8ZHluYW1pYz4gX0Z1bmN0aW9uVHlwZU1pcnJvcl9wYXJhbWV0ZXJzKGZ1bmN0aW9uUmVmbGVjdGVlKQogICAgICBuYXRpdmUgIkZ1bmN0aW9uVHlwZU1pcnJvcl9wYXJhbWV0ZXJzIjsKfQoKYWJzdHJhY3QgY2xhc3MgX0xvY2FsRGVjbGFyYXRpb25NaXJyb3IgZXh0ZW5kcyBfTG9jYWxNaXJyb3IKICAgIGltcGxlbWVudHMgRGVjbGFyYXRpb25NaXJyb3IgewogIGZpbmFsIF9yZWZsZWN0ZWU7CiAgU3ltYm9sIF9zaW1wbGVOYW1lOwoKICBfTG9jYWxEZWNsYXJhdGlvbk1pcnJvci5fKHRoaXMuX3JlZmxlY3RlZSwgdGhpcy5fc2ltcGxlTmFtZSk7CgogIFN5bWJvbCBnZXQgc2ltcGxlTmFtZSA9PiBfc2ltcGxlTmFtZTsKCiAgU3ltYm9sIF9xdWFsaWZpZWROYW1lOwogIFN5bWJvbCBnZXQgcXVhbGlmaWVkTmFtZSB7CiAgICBpZiAoX3F1YWxpZmllZE5hbWUgPT0gbnVsbCkgewogICAgICBfcXVhbGlmaWVkTmFtZSA9IF9jb21wdXRlUXVhbGlmaWVkTmFtZShvd25lciwgc2ltcGxlTmFtZSk7CiAgICB9CiAgICByZXR1cm4gX3F1YWxpZmllZE5hbWU7CiAgfQoKICBib29sIGdldCBpc1ByaXZhdGUgPT4gX24oc2ltcGxlTmFtZSkuc3RhcnRzV2l0aCgnXycpOwoKICBTb3VyY2VMb2NhdGlvbiBnZXQgbG9jYXRpb24gewogICAgcmV0dXJuIF9sb2NhdGlvbihfcmVmbGVjdGVlKTsKICB9CgogIExpc3Q8SW5zdGFuY2VNaXJyb3I+IGdldCBtZXRhZGF0YSB7CiAgICAvLyBHZXQgdGhlIG1ldGFkYXRhIG9iamVjdHMsIGNvbnZlcnQgdGhlbSBpbnRvIEluc3RhbmNlTWlycm9ycyB1c2luZwogICAgLy8gcmVmbGVjdCgpIGFuZCB0aGVuIG1ha2UgdGhlbSBpbnRvIGEgRGFydCBsaXN0LgogICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxJbnN0YW5jZU1pcnJvcj4oCiAgICAgICAgX21ldGFkYXRhKF9yZWZsZWN0ZWUpLm1hcChyZWZsZWN0KSk7CiAgfQoKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICByZXR1cm4gdGhpcy5ydW50aW1lVHlwZSA9PSBvdGhlci5ydW50aW1lVHlwZSAmJgogICAgICAgIHRoaXMuX3JlZmxlY3RlZSA9PSBvdGhlci5fcmVmbGVjdGVlOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSA9PiBzaW1wbGVOYW1lLmhhc2hDb2RlOwp9CgpjbGFzcyBfTG9jYWxUeXBlVmFyaWFibGVNaXJyb3IgZXh0ZW5kcyBfTG9jYWxEZWNsYXJhdGlvbk1pcnJvcgogICAgaW1wbGVtZW50cyBUeXBlVmFyaWFibGVNaXJyb3IsIF9Mb2NhbFR5cGVNaXJyb3IgewogIF9Mb2NhbFR5cGVWYXJpYWJsZU1pcnJvci5fKHJlZmxlY3RlZSwgU3RyaW5nIHNpbXBsZU5hbWUsIHRoaXMuX293bmVyKQogICAgICA6IHN1cGVyLl8ocmVmbGVjdGVlLCBfcyhzaW1wbGVOYW1lKSk7CgogIERlY2xhcmF0aW9uTWlycm9yIF9vd25lcjsKICBEZWNsYXJhdGlvbk1pcnJvciBnZXQgb3duZXIgewogICAgaWYgKF9vd25lciA9PSBudWxsKSB7CiAgICAgIF9vd25lciA9IChfVHlwZVZhcmlhYmxlTWlycm9yX293bmVyKF9yZWZsZWN0ZWUpIGFzIFR5cGVNaXJyb3IpCiAgICAgICAgICAub3JpZ2luYWxEZWNsYXJhdGlvbjsKICAgIH0KICAgIHJldHVybiBfb3duZXI7CiAgfQoKICBib29sIGdldCBpc1N0YXRpYyA9PiBmYWxzZTsKICBib29sIGdldCBpc1RvcExldmVsID0+IGZhbHNlOwoKICBUeXBlTWlycm9yIF91cHBlckJvdW5kOwogIFR5cGVNaXJyb3IgZ2V0IHVwcGVyQm91bmQgewogICAgaWYgKF91cHBlckJvdW5kID09IG51bGwpIHsKICAgICAgX3VwcGVyQm91bmQgPSByZWZsZWN0VHlwZShfVHlwZVZhcmlhYmxlTWlycm9yX3VwcGVyX2JvdW5kKF9yZWZsZWN0ZWUpKTsKICAgIH0KICAgIHJldHVybiBfdXBwZXJCb3VuZDsKICB9CgogIGJvb2wgZ2V0IGhhc1JlZmxlY3RlZFR5cGUgPT4gZmFsc2U7CiAgVHlwZSBnZXQgcmVmbGVjdGVkVHlwZSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignVHlwZSB2YXJpYWJsZXMgaGF2ZSBubyByZWZsZWN0ZWQgdHlwZScpOwogIH0KCiAgVHlwZSBnZXQgX3JlZmxlY3RlZFR5cGUgPT4gX3JlZmxlY3RlZTsKCiAgTGlzdDxUeXBlVmFyaWFibGVNaXJyb3I+IGdldCB0eXBlVmFyaWFibGVzID0+IGNvbnN0IDxUeXBlVmFyaWFibGVNaXJyb3I+W107CiAgTGlzdDxUeXBlTWlycm9yPiBnZXQgdHlwZUFyZ3VtZW50cyA9PiBjb25zdCA8VHlwZU1pcnJvcj5bXTsKCiAgYm9vbCBnZXQgaXNPcmlnaW5hbERlY2xhcmF0aW9uID0+IHRydWU7CiAgVHlwZU1pcnJvciBnZXQgb3JpZ2luYWxEZWNsYXJhdGlvbiA9PiB0aGlzOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiVHlwZVZhcmlhYmxlTWlycm9yIG9uICcke19uKHNpbXBsZU5hbWUpfSciOwoKICBvcGVyYXRvciA9PShvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIFR5cGVWYXJpYWJsZU1pcnJvciAmJgogICAgICAgIHNpbXBsZU5hbWUgPT0gb3RoZXIuc2ltcGxlTmFtZSAmJgogICAgICAgIG93bmVyID09IG90aGVyLm93bmVyOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSA9PiBzaW1wbGVOYW1lLmhhc2hDb2RlOwoKICBib29sIGlzU3VidHlwZU9mKFR5cGVNaXJyb3Igb3RoZXIpIHsKICAgIGlmIChvdGhlciA9PSBjdXJyZW50TWlycm9yU3lzdGVtKCkuZHluYW1pY1R5cGUpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyID09IGN1cnJlbnRNaXJyb3JTeXN0ZW0oKS52b2lkVHlwZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIF9zdWJ0eXBlVGVzdCgKICAgICAgICBfcmVmbGVjdGVkVHlwZSwgKG90aGVyIGFzIF9Mb2NhbFR5cGVNaXJyb3IpLl9yZWZsZWN0ZWRUeXBlKTsKICB9CgogIGJvb2wgaXNBc3NpZ25hYmxlVG8oVHlwZU1pcnJvciBvdGhlcikgewogICAgaWYgKG90aGVyID09IGN1cnJlbnRNaXJyb3JTeXN0ZW0oKS5keW5hbWljVHlwZSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgPT0gY3VycmVudE1pcnJvclN5c3RlbSgpLnZvaWRUeXBlKSByZXR1cm4gZmFsc2U7CiAgICBmaW5hbCBvdGhlclJlZmxlY3RlZFR5cGUgPSAob3RoZXIgYXMgX0xvY2FsVHlwZU1pcnJvcikuX3JlZmxlY3RlZFR5cGU7CiAgICByZXR1cm4gX3N1YnR5cGVUZXN0KF9yZWZsZWN0ZWRUeXBlLCBvdGhlclJlZmxlY3RlZFR5cGUpIHx8CiAgICAgICAgX3N1YnR5cGVUZXN0KG90aGVyUmVmbGVjdGVkVHlwZSwgX3JlZmxlY3RlZFR5cGUpOwogIH0KCiAgc3RhdGljIERlY2xhcmF0aW9uTWlycm9yIF9UeXBlVmFyaWFibGVNaXJyb3Jfb3duZXIocmVmbGVjdGVlKQogICAgICBuYXRpdmUgIlR5cGVWYXJpYWJsZU1pcnJvcl9vd25lciI7CgogIHN0YXRpYyBUeXBlIF9UeXBlVmFyaWFibGVNaXJyb3JfdXBwZXJfYm91bmQocmVmbGVjdGVlKQogICAgICBuYXRpdmUgIlR5cGVWYXJpYWJsZU1pcnJvcl91cHBlcl9ib3VuZCI7Cn0KCmNsYXNzIF9Mb2NhbFR5cGVkZWZNaXJyb3IgZXh0ZW5kcyBfTG9jYWxEZWNsYXJhdGlvbk1pcnJvcgogICAgaW1wbGVtZW50cyBUeXBlZGVmTWlycm9yLCBfTG9jYWxUeXBlTWlycm9yIHsKICBmaW5hbCBUeXBlIF9yZWZsZWN0ZWRUeXBlOwogIGZpbmFsIGJvb2wgX2lzR2VuZXJpYzsKICBmaW5hbCBib29sIF9pc0dlbmVyaWNEZWNsYXJhdGlvbjsKCiAgX0xvY2FsVHlwZWRlZk1pcnJvcihyZWZsZWN0ZWUsIHRoaXMuX3JlZmxlY3RlZFR5cGUsIFN0cmluZyBzaW1wbGVOYW1lLAogICAgICB0aGlzLl9pc0dlbmVyaWMsIHRoaXMuX2lzR2VuZXJpY0RlY2xhcmF0aW9uLCB0aGlzLl9vd25lcikKICAgICAgOiBzdXBlci5fKHJlZmxlY3RlZSwgX3Moc2ltcGxlTmFtZSkpOwoKICBib29sIGdldCBpc1RvcExldmVsID0+IHRydWU7CgogIERlY2xhcmF0aW9uTWlycm9yIF9vd25lcjsKICBEZWNsYXJhdGlvbk1pcnJvciBnZXQgb3duZXIgewogICAgaWYgKF9vd25lciA9PSBudWxsKSB7CiAgICAgIHZhciB1cmkgPSBfTG9jYWxDbGFzc01pcnJvci5fbGlicmFyeVVyaShfcmVmbGVjdGVlKTsKICAgICAgX293bmVyID0gY3VycmVudE1pcnJvclN5c3RlbSgpLmxpYnJhcmllc1tVcmkucGFyc2UodXJpKV07CiAgICB9CiAgICByZXR1cm4gX293bmVyOwogIH0KCiAgX0xvY2FsRnVuY3Rpb25UeXBlTWlycm9yIF9yZWZlcmVudDsKICBGdW5jdGlvblR5cGVNaXJyb3IgZ2V0IHJlZmVyZW50IHsKICAgIGlmIChfcmVmZXJlbnQgPT0gbnVsbCkgewogICAgICBfcmVmZXJlbnQgPSBfbmF0aXZlUmVmZXJlbnQoX3JlZmxlY3RlZFR5cGUpOwogICAgICBfcmVmZXJlbnQuX2luc3RhbnRpYXRvciA9IF9yZWZsZWN0ZWRUeXBlOwogICAgfQogICAgcmV0dXJuIF9yZWZlcmVudDsKICB9CgogIGJvb2wgZ2V0IGhhc1JlZmxlY3RlZFR5cGUgPT4gIV9pc0dlbmVyaWNEZWNsYXJhdGlvbjsKICBUeXBlIGdldCByZWZsZWN0ZWRUeXBlIHsKICAgIGlmICghaGFzUmVmbGVjdGVkVHlwZSkgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJEZWNsYXJhdGlvbnMgb2YgZ2VuZXJpY3MgaGF2ZSBubyByZWZsZWN0ZWQgdHlwZSIpOwogICAgfQogICAgcmV0dXJuIF9yZWZsZWN0ZWRUeXBlOwogIH0KCiAgYm9vbCBnZXQgaXNPcmlnaW5hbERlY2xhcmF0aW9uID0+ICFfaXNHZW5lcmljIHx8IF9pc0dlbmVyaWNEZWNsYXJhdGlvbjsKCiAgVHlwZWRlZk1pcnJvciBnZXQgb3JpZ2luYWxEZWNsYXJhdGlvbiB7CiAgICBpZiAoaXNPcmlnaW5hbERlY2xhcmF0aW9uKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9uYXRpdmVEZWNsYXJhdGlvbihfcmVmbGVjdGVkVHlwZSk7CiAgICB9CiAgfQoKICBMaXN0PFR5cGVWYXJpYWJsZU1pcnJvcj4gX3R5cGVWYXJpYWJsZXM7CiAgTGlzdDxUeXBlVmFyaWFibGVNaXJyb3I+IGdldCB0eXBlVmFyaWFibGVzIHsKICAgIGlmIChfdHlwZVZhcmlhYmxlcyA9PSBudWxsKSB7CiAgICAgIF90eXBlVmFyaWFibGVzID0gbmV3IExpc3Q8VHlwZVZhcmlhYmxlTWlycm9yPigpOwogICAgICBMaXN0IHBhcmFtcyA9IF9Mb2NhbENsYXNzTWlycm9yLl9DbGFzc01pcnJvcl90eXBlX3ZhcmlhYmxlcyhfcmVmbGVjdGVlKTsKICAgICAgVHlwZWRlZk1pcnJvciBvd25lciA9IG9yaWdpbmFsRGVjbGFyYXRpb247CiAgICAgIHZhciBtaXJyb3I7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgbWlycm9yID0gbmV3IF9Mb2NhbFR5cGVWYXJpYWJsZU1pcnJvci5fKHBhcmFtc1tpICsgMV0sIHBhcmFtc1tpXSwgb3duZXIpOwogICAgICAgIF90eXBlVmFyaWFibGVzLmFkZChtaXJyb3IpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX3R5cGVWYXJpYWJsZXM7CiAgfQoKICBMaXN0PFR5cGVNaXJyb3I+IF90eXBlQXJndW1lbnRzOwogIExpc3Q8VHlwZU1pcnJvcj4gZ2V0IHR5cGVBcmd1bWVudHMgewogICAgaWYgKF90eXBlQXJndW1lbnRzID09IG51bGwpIHsKICAgICAgaWYgKF9pc0dlbmVyaWNEZWNsYXJhdGlvbikgewogICAgICAgIF90eXBlQXJndW1lbnRzID0gY29uc3QgPFR5cGVNaXJyb3I+W107CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3R5cGVBcmd1bWVudHMgPSBuZXcgVW5tb2RpZmlhYmxlTGlzdFZpZXc8VHlwZU1pcnJvcj4oX0xvY2FsQ2xhc3NNaXJyb3IKICAgICAgICAgICAgLl9jb21wdXRlVHlwZUFyZ3VtZW50cyhfcmVmbGVjdGVkVHlwZSkKICAgICAgICAgICAgLmNhc3Q8VHlwZU1pcnJvcj4oKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfdHlwZUFyZ3VtZW50czsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJUeXBlZGVmTWlycm9yIG9uICcke19uKHNpbXBsZU5hbWUpfSciOwoKICBib29sIGlzU3VidHlwZU9mKFR5cGVNaXJyb3Igb3RoZXIpIHsKICAgIGlmIChvdGhlciA9PSBjdXJyZW50TWlycm9yU3lzdGVtKCkuZHluYW1pY1R5cGUpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyID09IGN1cnJlbnRNaXJyb3JTeXN0ZW0oKS52b2lkVHlwZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIF9zdWJ0eXBlVGVzdCgKICAgICAgICBfcmVmbGVjdGVkVHlwZSwgKG90aGVyIGFzIF9Mb2NhbFR5cGVNaXJyb3IpLl9yZWZsZWN0ZWRUeXBlKTsKICB9CgogIGJvb2wgaXNBc3NpZ25hYmxlVG8oVHlwZU1pcnJvciBvdGhlcikgewogICAgaWYgKG90aGVyID09IGN1cnJlbnRNaXJyb3JTeXN0ZW0oKS5keW5hbWljVHlwZSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgPT0gY3VycmVudE1pcnJvclN5c3RlbSgpLnZvaWRUeXBlKSByZXR1cm4gZmFsc2U7CiAgICBmaW5hbCBvdGhlclJlZmxlY3RlZFR5cGUgPSAob3RoZXIgYXMgX0xvY2FsVHlwZU1pcnJvcikuX3JlZmxlY3RlZFR5cGU7CiAgICByZXR1cm4gX3N1YnR5cGVUZXN0KF9yZWZsZWN0ZWRUeXBlLCBvdGhlclJlZmxlY3RlZFR5cGUpIHx8CiAgICAgICAgX3N1YnR5cGVUZXN0KG90aGVyUmVmbGVjdGVkVHlwZSwgX3JlZmxlY3RlZFR5cGUpOwogIH0KCiAgc3RhdGljIEZ1bmN0aW9uVHlwZU1pcnJvciBfbmF0aXZlUmVmZXJlbnQocmVmbGVjdGVkVHlwZSkKICAgICAgbmF0aXZlICJUeXBlZGVmTWlycm9yX3JlZmVyZW50IjsKCiAgc3RhdGljIFR5cGVkZWZNaXJyb3IgX25hdGl2ZURlY2xhcmF0aW9uKHJlZmxlY3RlZFR5cGUpCiAgICAgIG5hdGl2ZSAiVHlwZWRlZk1pcnJvcl9kZWNsYXJhdGlvbiI7Cn0KClN5bWJvbCBfYXNTZXR0ZXIoU3ltYm9sIGdldHRlciwgTGlicmFyeU1pcnJvciBsaWJyYXJ5KSB7CiAgdmFyIHVud3JhcHBlZCA9IE1pcnJvclN5c3RlbS5nZXROYW1lKGdldHRlcik7CiAgcmV0dXJuIE1pcnJvclN5c3RlbS5nZXRTeW1ib2woJyR7dW53cmFwcGVkfT0nLCBsaWJyYXJ5KTsKfQoKY2xhc3MgX0xvY2FsTGlicmFyeU1pcnJvciBleHRlbmRzIF9Mb2NhbE9iamVjdE1pcnJvciBpbXBsZW1lbnRzIExpYnJhcnlNaXJyb3IgewogIGZpbmFsIFN5bWJvbCBzaW1wbGVOYW1lOwogIGZpbmFsIFVyaSB1cmk7CgogIF9Mb2NhbExpYnJhcnlNaXJyb3IuXyhyZWZsZWN0ZWUsIFN0cmluZyBzaW1wbGVOYW1lLCBTdHJpbmcgdXJsKQogICAgICA6IHRoaXMuc2ltcGxlTmFtZSA9IF9zKHNpbXBsZU5hbWUpLAogICAgICAgIHRoaXMudXJpID0gVXJpLnBhcnNlKHVybCksCiAgICAgICAgc3VwZXIuXyhyZWZsZWN0ZWUpOwoKICAvLyBUaGUgc2ltcGxlIG5hbWUgYW5kIHRoZSBxdWFsaWZpZWQgbmFtZSBhcmUgdGhlIHNhbWUgZm9yIGEgbGlicmFyeS4KICBTeW1ib2wgZ2V0IHF1YWxpZmllZE5hbWUgPT4gc2ltcGxlTmFtZTsKCiAgRGVjbGFyYXRpb25NaXJyb3IgZ2V0IG93bmVyID0+IG51bGw7CgogIGJvb2wgZ2V0IGlzUHJpdmF0ZSA9PiBmYWxzZTsKICBib29sIGdldCBpc1RvcExldmVsID0+IGZhbHNlOwoKICBUeXBlIGdldCBfaW5zdGFudGlhdG9yID0+IG51bGw7CgogIE1hcDxTeW1ib2wsIERlY2xhcmF0aW9uTWlycm9yPiBfZGVjbGFyYXRpb25zOwogIE1hcDxTeW1ib2wsIERlY2xhcmF0aW9uTWlycm9yPiBnZXQgZGVjbGFyYXRpb25zIHsKICAgIGlmIChfZGVjbGFyYXRpb25zICE9IG51bGwpIHJldHVybiBfZGVjbGFyYXRpb25zOwoKICAgIHZhciBkZWNscyA9IG5ldyBNYXA8U3ltYm9sLCBEZWNsYXJhdGlvbk1pcnJvcj4oKTsKICAgIHZhciBtZW1iZXJzID0gX2NvbXB1dGVNZW1iZXJzKF9yZWZsZWN0ZWUpOwogICAgZm9yICh2YXIgbWVtYmVyIGluIG1lbWJlcnMpIHsKICAgICAgZGVjbHNbbWVtYmVyLnNpbXBsZU5hbWVdID0gbWVtYmVyOwogICAgfQoKICAgIHJldHVybiBfZGVjbGFyYXRpb25zID0KICAgICAgICBuZXcgVW5tb2RpZmlhYmxlTWFwVmlldzxTeW1ib2wsIERlY2xhcmF0aW9uTWlycm9yPihkZWNscyk7CiAgfQoKICBTb3VyY2VMb2NhdGlvbiBnZXQgbG9jYXRpb24gewogICAgcmV0dXJuIF9sb2NhdGlvbihfcmVmbGVjdGVlKTsKICB9CgogIExpc3Q8SW5zdGFuY2VNaXJyb3I+IGdldCBtZXRhZGF0YSB7CiAgICAvLyBHZXQgdGhlIG1ldGFkYXRhIG9iamVjdHMsIGNvbnZlcnQgdGhlbSBpbnRvIEluc3RhbmNlTWlycm9ycyB1c2luZwogICAgLy8gcmVmbGVjdCgpIGFuZCB0aGVuIG1ha2UgdGhlbSBpbnRvIGEgRGFydCBsaXN0LgogICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxJbnN0YW5jZU1pcnJvcj4oCiAgICAgICAgX21ldGFkYXRhKF9yZWZsZWN0ZWUpLm1hcChyZWZsZWN0KSk7CiAgfQoKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICByZXR1cm4gdGhpcy5ydW50aW1lVHlwZSA9PSBvdGhlci5ydW50aW1lVHlwZSAmJgogICAgICAgIHRoaXMuX3JlZmxlY3RlZSA9PSBvdGhlci5fcmVmbGVjdGVlOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSA9PiBzaW1wbGVOYW1lLmhhc2hDb2RlOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiTGlicmFyeU1pcnJvciBvbiAnJHtfbihzaW1wbGVOYW1lKX0nIjsKCiAgdmFyIF9jYWNoZWRMaWJyYXJ5RGVwZW5kZW5jaWVzOwogIGdldCBsaWJyYXJ5RGVwZW5kZW5jaWVzIHsKICAgIGlmIChfY2FjaGVkTGlicmFyeURlcGVuZGVuY2llcyA9PSBudWxsKSB7CiAgICAgIF9jYWNoZWRMaWJyYXJ5RGVwZW5kZW5jaWVzID0KICAgICAgICAgIG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxMaWJyYXJ5RGVwZW5kZW5jeU1pcnJvcj4oCiAgICAgICAgICAgICAgX2xpYnJhcnlEZXBlbmRlbmNpZXMoX3JlZmxlY3RlZSkuY2FzdDxMaWJyYXJ5RGVwZW5kZW5jeU1pcnJvcj4oKSk7CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZExpYnJhcnlEZXBlbmRlbmNpZXM7CiAgfQoKICBMaXN0PGR5bmFtaWM+IF9saWJyYXJ5RGVwZW5kZW5jaWVzKHJlZmxlY3RlZSkKICAgICAgbmF0aXZlICdMaWJyYXJ5TWlycm9yX2xpYnJhcnlEZXBlbmRlbmNpZXMnOwoKICBfaW52b2tlKHJlZmxlY3RlZSwgbWVtYmVyTmFtZSwgYXJndW1lbnRzLCBhcmd1bWVudE5hbWVzKQogICAgICBuYXRpdmUgJ0xpYnJhcnlNaXJyb3JfaW52b2tlJzsKCiAgX2ludm9rZUdldHRlcihyZWZsZWN0ZWUsIGdldHRlck5hbWUpIG5hdGl2ZSAnTGlicmFyeU1pcnJvcl9pbnZva2VHZXR0ZXInOwoKICBfaW52b2tlU2V0dGVyKHJlZmxlY3RlZSwgc2V0dGVyTmFtZSwgdmFsdWUpCiAgICAgIG5hdGl2ZSAnTGlicmFyeU1pcnJvcl9pbnZva2VTZXR0ZXInOwoKICBMaXN0PGR5bmFtaWM+IF9jb21wdXRlTWVtYmVycyhyZWZsZWN0ZWUpIG5hdGl2ZSAiTGlicmFyeU1pcnJvcl9tZW1iZXJzIjsKfQoKY2xhc3MgX0xvY2FsTGlicmFyeURlcGVuZGVuY3lNaXJyb3IgZXh0ZW5kcyBfTG9jYWxNaXJyb3IKICAgIGltcGxlbWVudHMgTGlicmFyeURlcGVuZGVuY3lNaXJyb3IgewogIGZpbmFsIExpYnJhcnlNaXJyb3Igc291cmNlTGlicmFyeTsKICB2YXIgX3RhcmdldE1pcnJvck9yUHJlZml4OwogIGZpbmFsIExpc3Q8Q29tYmluYXRvck1pcnJvcj4gY29tYmluYXRvcnM7CiAgZmluYWwgU3ltYm9sIHByZWZpeDsKICBmaW5hbCBib29sIGlzSW1wb3J0OwogIGZpbmFsIGJvb2wgaXNEZWZlcnJlZDsKICBmaW5hbCBMaXN0PEluc3RhbmNlTWlycm9yPiBtZXRhZGF0YTsKCiAgX0xvY2FsTGlicmFyeURlcGVuZGVuY3lNaXJyb3IuXygKICAgICAgdGhpcy5zb3VyY2VMaWJyYXJ5LAogICAgICB0aGlzLl90YXJnZXRNaXJyb3JPclByZWZpeCwKICAgICAgTGlzdDxkeW5hbWljPiBtdXRhYmxlQ29tYmluYXRvcnMsCiAgICAgIHByZWZpeFN0cmluZywKICAgICAgdGhpcy5pc0ltcG9ydCwKICAgICAgdGhpcy5pc0RlZmVycmVkLAogICAgICBMaXN0PGR5bmFtaWM+IHVud3JhcHBlZE1ldGFkYXRhKQogICAgICA6IHByZWZpeCA9IF9zKHByZWZpeFN0cmluZyksCiAgICAgICAgY29tYmluYXRvcnMgPSBuZXcgVW5tb2RpZmlhYmxlTGlzdFZpZXc8Q29tYmluYXRvck1pcnJvcj4oCiAgICAgICAgICAgIG11dGFibGVDb21iaW5hdG9ycy5jYXN0PENvbWJpbmF0b3JNaXJyb3I+KCkpLAogICAgICAgIG1ldGFkYXRhID0gbmV3IFVubW9kaWZpYWJsZUxpc3RWaWV3PEluc3RhbmNlTWlycm9yPigKICAgICAgICAgICAgdW53cmFwcGVkTWV0YWRhdGEubWFwKHJlZmxlY3QpKTsKCiAgYm9vbCBnZXQgaXNFeHBvcnQgPT4gIWlzSW1wb3J0OwoKICBMaWJyYXJ5TWlycm9yIGdldCB0YXJnZXRMaWJyYXJ5IHsKICAgIGlmIChfdGFyZ2V0TWlycm9yT3JQcmVmaXggaXMgX0xvY2FsTGlicmFyeU1pcnJvcikgewogICAgICByZXR1cm4gX3RhcmdldE1pcnJvck9yUHJlZml4OwogICAgfQogICAgdmFyIG1pcnJvck9yTnVsbCA9IF90cnlVcGdyYWRlUHJlZml4KF90YXJnZXRNaXJyb3JPclByZWZpeCk7CiAgICBpZiAobWlycm9yT3JOdWxsICE9IG51bGwpIHsKICAgICAgX3RhcmdldE1pcnJvck9yUHJlZml4ID0gbWlycm9yT3JOdWxsOwogICAgfQogICAgcmV0dXJuIG1pcnJvck9yTnVsbDsKICB9CgogIEZ1dHVyZTxMaWJyYXJ5TWlycm9yPiBsb2FkTGlicmFyeSgpIHsKICAgIGlmIChfdGFyZ2V0TWlycm9yT3JQcmVmaXggaXMgX0xvY2FsTGlicmFyeU1pcnJvcikgewogICAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShfdGFyZ2V0TWlycm9yT3JQcmVmaXgpOwogICAgfQogICAgdmFyIHNhdmVkUHJlZml4ID0gX3RhcmdldE1pcnJvck9yUHJlZml4OwogICAgcmV0dXJuIHNhdmVkUHJlZml4LmxvYWRMaWJyYXJ5KCkudGhlbigoXykgewogICAgICByZXR1cm4gX3RyeVVwZ3JhZGVQcmVmaXgoc2F2ZWRQcmVmaXgpOwogICAgfSk7CiAgfQoKICBzdGF0aWMgTGlicmFyeU1pcnJvciBfdHJ5VXBncmFkZVByZWZpeChsaWJyYXJ5UHJlZml4KQogICAgICBuYXRpdmUgIkxpYnJhcnlNaXJyb3JfZnJvbVByZWZpeCI7CgogIFNvdXJjZUxvY2F0aW9uIGdldCBsb2NhdGlvbiA9PiBudWxsOwp9CgpjbGFzcyBfTG9jYWxDb21iaW5hdG9yTWlycm9yIGV4dGVuZHMgX0xvY2FsTWlycm9yIGltcGxlbWVudHMgQ29tYmluYXRvck1pcnJvciB7CiAgZmluYWwgTGlzdDxTeW1ib2w+IGlkZW50aWZpZXJzOwogIGZpbmFsIGJvb2wgaXNTaG93OwoKICBfTG9jYWxDb21iaW5hdG9yTWlycm9yLl8oaWRlbnRpZmllclN0cmluZywgdGhpcy5pc1Nob3cpCiAgICAgIDogdGhpcy5pZGVudGlmaWVycyA9CiAgICAgICAgICAgIG5ldyBVbm1vZGlmaWFibGVMaXN0VmlldzxTeW1ib2w+KDxTeW1ib2w+W19zKGlkZW50aWZpZXJTdHJpbmcpXSk7CgogIGJvb2wgZ2V0IGlzSGlkZSA9PiAhaXNTaG93Owp9CgpjbGFzcyBfTG9jYWxNZXRob2RNaXJyb3IgZXh0ZW5kcyBfTG9jYWxEZWNsYXJhdGlvbk1pcnJvcgogICAgaW1wbGVtZW50cyBNZXRob2RNaXJyb3IgewogIGZpbmFsIFR5cGUgX2luc3RhbnRpYXRvcjsKICBmaW5hbCBib29sIGlzU3RhdGljOwogIGZpbmFsIGludCBfa2luZEZsYWdzOwoKICBfTG9jYWxNZXRob2RNaXJyb3IuXyhyZWZsZWN0ZWUsIFN0cmluZyBzaW1wbGVOYW1lLCB0aGlzLl9vd25lciwKICAgICAgdGhpcy5faW5zdGFudGlhdG9yLCB0aGlzLmlzU3RhdGljLCB0aGlzLl9raW5kRmxhZ3MpCiAgICAgIDogc3VwZXIuXyhyZWZsZWN0ZWUsIF9zKHNpbXBsZU5hbWUpKTsKCiAgc3RhdGljIGNvbnN0IGtBYnN0cmFjdCA9IDA7CiAgc3RhdGljIGNvbnN0IGtHZXR0ZXIgPSAxOwogIHN0YXRpYyBjb25zdCBrU2V0dGVyID0gMjsKICBzdGF0aWMgY29uc3Qga0NvbnN0cnVjdG9yID0gMzsKICBzdGF0aWMgY29uc3Qga0NvbnN0Q3RvciA9IDQ7CiAgc3RhdGljIGNvbnN0IGtHZW5lcmF0aXZlQ3RvciA9IDU7CiAgc3RhdGljIGNvbnN0IGtSZWRpcmVjdGluZ0N0b3IgPSA2OwogIHN0YXRpYyBjb25zdCBrRmFjdG9yeUN0b3IgPSA3OwogIHN0YXRpYyBjb25zdCBrRXh0ZXJuYWwgPSA4OwogIHN0YXRpYyBjb25zdCBrU3ludGhldGljID0gOTsKCiAgLy8gVGhlc2Ugb2Zmc2V0cyBtdWNoIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRob3NlIGluIG1pcnJvcnMuaC4KICBib29sIGdldCBpc0Fic3RyYWN0ID0+IDAgIT0gKF9raW5kRmxhZ3MgJiAoMSA8PCBrQWJzdHJhY3QpKTsKICBib29sIGdldCBpc0dldHRlciA9PiAwICE9IChfa2luZEZsYWdzICYgKDEgPDwga0dldHRlcikpOwogIGJvb2wgZ2V0IGlzU2V0dGVyID0+IDAgIT0gKF9raW5kRmxhZ3MgJiAoMSA8PCBrU2V0dGVyKSk7CiAgYm9vbCBnZXQgaXNDb25zdHJ1Y3RvciA9PiAwICE9IChfa2luZEZsYWdzICYgKDEgPDwga0NvbnN0cnVjdG9yKSk7CiAgYm9vbCBnZXQgaXNDb25zdENvbnN0cnVjdG9yID0+IDAgIT0gKF9raW5kRmxhZ3MgJiAoMSA8PCBrQ29uc3RDdG9yKSk7CiAgYm9vbCBnZXQgaXNHZW5lcmF0aXZlQ29uc3RydWN0b3IgPT4KICAgICAgMCAhPSAoX2tpbmRGbGFncyAmICgxIDw8IGtHZW5lcmF0aXZlQ3RvcikpOwogIGJvb2wgZ2V0IGlzUmVkaXJlY3RpbmdDb25zdHJ1Y3RvciA9PgogICAgICAwICE9IChfa2luZEZsYWdzICYgKDEgPDwga1JlZGlyZWN0aW5nQ3RvcikpOwogIGJvb2wgZ2V0IGlzRmFjdG9yeUNvbnN0cnVjdG9yID0+IDAgIT0gKF9raW5kRmxhZ3MgJiAoMSA8PCBrRmFjdG9yeUN0b3IpKTsKICBib29sIGdldCBpc0V4dGVybmFsID0+IDAgIT0gKF9raW5kRmxhZ3MgJiAoMSA8PCBrRXh0ZXJuYWwpKTsKICBib29sIGdldCBpc1N5bnRoZXRpYyA9PiAwICE9IChfa2luZEZsYWdzICYgKDEgPDwga1N5bnRoZXRpYykpOwoKICBzdGF0aWMgY29uc3QgX29wZXJhdG9ycyA9IGNvbnN0IFsKICAgICIlIiwgIiYiLCAiKiIsICIrIiwgIi0iLCAiLyIsICI8IiwgIjw8IiwgLy8KICAgICI8PSIsICI9PSIsICI+IiwgIj49IiwgIj4+IiwgIltdIiwgIltdPSIsCiAgICAiXiIsICJ8IiwgIn4iLCAidW5hcnktIiwgIn4vIiwKICBdOwogIGJvb2wgZ2V0IGlzT3BlcmF0b3IgPT4gX29wZXJhdG9ycy5jb250YWlucyhfbihzaW1wbGVOYW1lKSk7CgogIERlY2xhcmF0aW9uTWlycm9yIF9vd25lcjsKICBEZWNsYXJhdGlvbk1pcnJvciBnZXQgb3duZXIgewogICAgLy8gRm9yIG5lc3RlZCBjbG9zdXJlcyBpdCBpcyBwb3NzaWJsZSwgdGhhdCB0aGUgbWlycm9yIGZvciB0aGUgb3duZXIgaGFzIG5vdAogICAgLy8gYmVlbiBjcmVhdGVkIHlldC4KICAgIGlmIChfb3duZXIgPT0gbnVsbCkgewogICAgICBfb3duZXIgPSBfTWV0aG9kTWlycm9yX293bmVyKF9yZWZsZWN0ZWUsIF9pbnN0YW50aWF0b3IpOwogICAgfQogICAgcmV0dXJuIF9vd25lcjsKICB9CgogIGJvb2wgZ2V0IGlzUHJpdmF0ZSA9PgogICAgICBfbihzaW1wbGVOYW1lKS5zdGFydHNXaXRoKCdfJykgfHwgX24oY29uc3RydWN0b3JOYW1lKS5zdGFydHNXaXRoKCdfJyk7CgogIGJvb2wgZ2V0IGlzVG9wTGV2ZWwgPT4gb3duZXIgaXMgTGlicmFyeU1pcnJvcjsKCiAgVHlwZU1pcnJvciBfcmV0dXJuVHlwZTsKICBUeXBlTWlycm9yIGdldCByZXR1cm5UeXBlIHsKICAgIGlmIChfcmV0dXJuVHlwZSA9PSBudWxsKSB7CiAgICAgIGlmIChpc0NvbnN0cnVjdG9yKSB7CiAgICAgICAgX3JldHVyblR5cGUgPSBvd25lcjsKICAgICAgfSBlbHNlIHsKICAgICAgICBfcmV0dXJuVHlwZSA9CiAgICAgICAgICAgIHJlZmxlY3RUeXBlKF9NZXRob2RNaXJyb3JfcmV0dXJuX3R5cGUoX3JlZmxlY3RlZSwgX2luc3RhbnRpYXRvcikpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX3JldHVyblR5cGU7CiAgfQoKICBMaXN0PFBhcmFtZXRlck1pcnJvcj4gX3BhcmFtZXRlcnM7CiAgTGlzdDxQYXJhbWV0ZXJNaXJyb3I+IGdldCBwYXJhbWV0ZXJzIHsKICAgIGlmIChfcGFyYW1ldGVycyA9PSBudWxsKSB7CiAgICAgIF9wYXJhbWV0ZXJzID0gbmV3IFVubW9kaWZpYWJsZUxpc3RWaWV3PFBhcmFtZXRlck1pcnJvcj4oCiAgICAgICAgICBfTWV0aG9kTWlycm9yX3BhcmFtZXRlcnMoX3JlZmxlY3RlZSkuY2FzdDxQYXJhbWV0ZXJNaXJyb3I+KCkpOwogICAgfQogICAgcmV0dXJuIF9wYXJhbWV0ZXJzOwogIH0KCiAgYm9vbCBnZXQgaXNSZWd1bGFyTWV0aG9kID0+ICFpc0dldHRlciAmJiAhaXNTZXR0ZXIgJiYgIWlzQ29uc3RydWN0b3I7CgogIFN5bWJvbCBfY29uc3RydWN0b3JOYW1lOwogIFN5bWJvbCBnZXQgY29uc3RydWN0b3JOYW1lIHsKICAgIGlmIChfY29uc3RydWN0b3JOYW1lID09IG51bGwpIHsKICAgICAgaWYgKCFpc0NvbnN0cnVjdG9yKSB7CiAgICAgICAgX2NvbnN0cnVjdG9yTmFtZSA9IF9zKCcnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgcGFydHMgPSBNaXJyb3JTeXN0ZW0uZ2V0TmFtZShzaW1wbGVOYW1lKS5zcGxpdCgnLicpOwogICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgX0ludGVybmFsTWlycm9yRXJyb3IoCiAgICAgICAgICAgICAgJ0ludGVybmFsIGVycm9yIGluIE1ldGhvZE1pcnJvci5jb25zdHJ1Y3Rvck5hbWU6ICcKICAgICAgICAgICAgICAnbWFsZm9ybWVkIG5hbWUgPCRzaW1wbGVOYW1lPicpOwogICAgICAgIH0gZWxzZSBpZiAocGFydHMubGVuZ3RoID09IDIpIHsKICAgICAgICAgIExpYnJhcnlNaXJyb3IgZGVmaW5pbmdMaWJyYXJ5ID0gb3duZXIub3duZXI7CiAgICAgICAgICBfY29uc3RydWN0b3JOYW1lID0gTWlycm9yU3lzdGVtLmdldFN5bWJvbChwYXJ0c1sxXSwgZGVmaW5pbmdMaWJyYXJ5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX2NvbnN0cnVjdG9yTmFtZSA9IF9zKCcnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfY29uc3RydWN0b3JOYW1lOwogIH0KCiAgU3RyaW5nIGdldCBzb3VyY2UgPT4gX01ldGhvZE1pcnJvcl9zb3VyY2UoX3JlZmxlY3RlZSk7CgogIHZvaWQgX3BhdGNoQ29uc3RydWN0b3JOYW1lKG93bmVyTmFtZSkgewogICAgdmFyIGNuID0gX24oY29uc3RydWN0b3JOYW1lKTsKICAgIGlmIChjbiA9PSAnJykgewogICAgICBfc2ltcGxlTmFtZSA9IF9zKG93bmVyTmFtZSk7CiAgICB9IGVsc2UgewogICAgICBfc2ltcGxlTmFtZSA9IF9zKG93bmVyTmFtZSArICIuIiArIGNuKTsKICAgIH0KICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJNZXRob2RNaXJyb3Igb24gJyR7TWlycm9yU3lzdGVtLmdldE5hbWUoc2ltcGxlTmFtZSl9JyI7CgogIHN0YXRpYyBkeW5hbWljIF9NZXRob2RNaXJyb3Jfb3duZXIocmVmbGVjdGVlLCBpbnN0YW50aWF0b3IpCiAgICAgIG5hdGl2ZSAiTWV0aG9kTWlycm9yX293bmVyIjsKCiAgc3RhdGljIGR5bmFtaWMgX01ldGhvZE1pcnJvcl9yZXR1cm5fdHlwZShyZWZsZWN0ZWUsIGluc3RhbnRpYXRvcikKICAgICAgbmF0aXZlICJNZXRob2RNaXJyb3JfcmV0dXJuX3R5cGUiOwoKICBMaXN0PGR5bmFtaWM+IF9NZXRob2RNaXJyb3JfcGFyYW1ldGVycyhyZWZsZWN0ZWUpCiAgICAgIG5hdGl2ZSAiTWV0aG9kTWlycm9yX3BhcmFtZXRlcnMiOwoKICBzdGF0aWMgU3RyaW5nIF9NZXRob2RNaXJyb3Jfc291cmNlKHJlZmxlY3RlZSkgbmF0aXZlICJNZXRob2RNaXJyb3Jfc291cmNlIjsKfQoKY2xhc3MgX0xvY2FsVmFyaWFibGVNaXJyb3IgZXh0ZW5kcyBfTG9jYWxEZWNsYXJhdGlvbk1pcnJvcgogICAgaW1wbGVtZW50cyBWYXJpYWJsZU1pcnJvciB7CiAgZmluYWwgRGVjbGFyYXRpb25NaXJyb3Igb3duZXI7CiAgZmluYWwgYm9vbCBpc1N0YXRpYzsKICBmaW5hbCBib29sIGlzRmluYWw7CiAgZmluYWwgYm9vbCBpc0NvbnN0OwoKICBfTG9jYWxWYXJpYWJsZU1pcnJvci5fKHJlZmxlY3RlZSwgU3RyaW5nIHNpbXBsZU5hbWUsIHRoaXMub3duZXIsIHRoaXMuX3R5cGUsCiAgICAgIHRoaXMuaXNTdGF0aWMsIHRoaXMuaXNGaW5hbCwgdGhpcy5pc0NvbnN0KQogICAgICA6IHN1cGVyLl8ocmVmbGVjdGVlLCBfcyhzaW1wbGVOYW1lKSk7CgogIGJvb2wgZ2V0IGlzVG9wTGV2ZWwgPT4gb3duZXIgaXMgTGlicmFyeU1pcnJvcjsKCiAgVHlwZSBnZXQgX2luc3RhbnRpYXRvciB7CiAgICBmaW5hbCBvID0gb3duZXI7IC8vIE5vdGU6IG5lZWQgbG9jYWwgdmFyaWFibGUgZm9yIHByb21vdGlvbiB0byBoYXBwZW4uCiAgICBpZiAobyBpcyBfTG9jYWxDbGFzc01pcnJvcikgewogICAgICByZXR1cm4gby5faW5zdGFudGlhdG9yOwogICAgfSBlbHNlIGlmIChvIGlzIF9Mb2NhbE1ldGhvZE1pcnJvcikgewogICAgICByZXR1cm4gby5faW5zdGFudGlhdG9yOwogICAgfSBlbHNlIGlmIChvIGlzIF9Mb2NhbExpYnJhcnlNaXJyb3IpIHsKICAgICAgcmV0dXJuIG8uX2luc3RhbnRpYXRvcjsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJ1bmV4cGVjdGVkIG93bmVyICR7b3duZXJ9Iik7CiAgICB9CiAgfQoKICBUeXBlTWlycm9yIF90eXBlOwogIFR5cGVNaXJyb3IgZ2V0IHR5cGUgewogICAgaWYgKF90eXBlID09IG51bGwpIHsKICAgICAgX3R5cGUgPSByZWZsZWN0VHlwZShfVmFyaWFibGVNaXJyb3JfdHlwZShfcmVmbGVjdGVlLCBfaW5zdGFudGlhdG9yKSk7CiAgICB9CiAgICByZXR1cm4gX3R5cGU7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAiVmFyaWFibGVNaXJyb3Igb24gJyR7TWlycm9yU3lzdGVtLmdldE5hbWUoc2ltcGxlTmFtZSl9JyI7CgogIHN0YXRpYyBfVmFyaWFibGVNaXJyb3JfdHlwZShyZWZsZWN0ZWUsIGluc3RhbnRpYXRvcikKICAgICAgbmF0aXZlICJWYXJpYWJsZU1pcnJvcl90eXBlIjsKfQoKY2xhc3MgX0xvY2FsUGFyYW1ldGVyTWlycm9yIGV4dGVuZHMgX0xvY2FsVmFyaWFibGVNaXJyb3IKICAgIGltcGxlbWVudHMgUGFyYW1ldGVyTWlycm9yIHsKICBmaW5hbCBpbnQgX3Bvc2l0aW9uOwogIGZpbmFsIGJvb2wgaXNPcHRpb25hbDsKICBmaW5hbCBib29sIGlzTmFtZWQ7CiAgZmluYWwgTGlzdCBfdW5taXJyb3JlZE1ldGFkYXRhOwoKICBfTG9jYWxQYXJhbWV0ZXJNaXJyb3IuXygKICAgICAgcmVmbGVjdGVlLAogICAgICBTdHJpbmcgc2ltcGxlTmFtZSwKICAgICAgRGVjbGFyYXRpb25NaXJyb3Igb3duZXIsCiAgICAgIHRoaXMuX3Bvc2l0aW9uLAogICAgICB0aGlzLmlzT3B0aW9uYWwsCiAgICAgIHRoaXMuaXNOYW1lZCwKICAgICAgYm9vbCBpc0ZpbmFsLAogICAgICB0aGlzLl9kZWZhdWx0VmFsdWVSZWZsZWN0ZWUsCiAgICAgIHRoaXMuX3VubWlycm9yZWRNZXRhZGF0YSkKICAgICAgOiBzdXBlci5fKAogICAgICAgICAgICByZWZsZWN0ZWUsCiAgICAgICAgICAgIHNpbXBsZU5hbWUsCiAgICAgICAgICAgIG93bmVyLAogICAgICAgICAgICBudWxsLCAvLyBXZSBvdmVycmlkZSB0aGUgdHlwZS4KICAgICAgICAgICAgZmFsc2UsIC8vIGlzU3RhdGljIGRvZXMgbm90IGFwcGx5LgogICAgICAgICAgICBpc0ZpbmFsLAogICAgICAgICAgICBmYWxzZSAvLyBOb3QgY29uc3QuCiAgICAgICAgICAgICk7CgogIE9iamVjdCBfZGVmYXVsdFZhbHVlUmVmbGVjdGVlOwogIEluc3RhbmNlTWlycm9yIF9kZWZhdWx0VmFsdWU7CiAgSW5zdGFuY2VNaXJyb3IgZ2V0IGRlZmF1bHRWYWx1ZSB7CiAgICBpZiAoIWlzT3B0aW9uYWwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoX2RlZmF1bHRWYWx1ZSA9PSBudWxsKSB7CiAgICAgIF9kZWZhdWx0VmFsdWUgPSByZWZsZWN0KF9kZWZhdWx0VmFsdWVSZWZsZWN0ZWUpOwogICAgfQogICAgcmV0dXJuIF9kZWZhdWx0VmFsdWU7CiAgfQoKICBib29sIGdldCBoYXNEZWZhdWx0VmFsdWUgPT4gX2RlZmF1bHRWYWx1ZVJlZmxlY3RlZSAhPSBudWxsOwoKICBTb3VyY2VMb2NhdGlvbiBnZXQgbG9jYXRpb24gewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlBhcmFtZXRlck1pcnJvci5sb2NhdGlvbiB1bmltcGxlbWVudGVkIik7CiAgfQoKICBMaXN0PEluc3RhbmNlTWlycm9yPiBnZXQgbWV0YWRhdGEgewogICAgaWYgKF91bm1pcnJvcmVkTWV0YWRhdGEgPT0gbnVsbCkgcmV0dXJuIGNvbnN0IDxJbnN0YW5jZU1pcnJvcj5bXTsKICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlTGlzdFZpZXc8SW5zdGFuY2VNaXJyb3I+KAogICAgICAgIF91bm1pcnJvcmVkTWV0YWRhdGEubWFwKHJlZmxlY3QpKTsKICB9CgogIFR5cGVNaXJyb3IgX3R5cGU7CiAgVHlwZU1pcnJvciBnZXQgdHlwZSB7CiAgICBpZiAoX3R5cGUgPT0gbnVsbCkgewogICAgICBfdHlwZSA9IHJlZmxlY3RUeXBlKAogICAgICAgICAgX1BhcmFtZXRlck1pcnJvcl90eXBlKF9yZWZsZWN0ZWUsIF9wb3NpdGlvbiwgX2luc3RhbnRpYXRvcikpOwogICAgfQogICAgcmV0dXJuIF90eXBlOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlBhcmFtZXRlck1pcnJvciBvbiAnJHtfbihzaW1wbGVOYW1lKX0nIjsKCiAgc3RhdGljIFR5cGUgX1BhcmFtZXRlck1pcnJvcl90eXBlKF9yZWZsZWN0ZWUsIF9wb3NpdGlvbiwgaW5zdGFudGlhdG9yKQogICAgICBuYXRpdmUgIlBhcmFtZXRlck1pcnJvcl90eXBlIjsKfQoKY2xhc3MgX1NwZWNpYWxUeXBlTWlycm9yIGV4dGVuZHMgX0xvY2FsTWlycm9yCiAgICBpbXBsZW1lbnRzIFR5cGVNaXJyb3IsIERlY2xhcmF0aW9uTWlycm9yIHsKICBmaW5hbCBTeW1ib2wgc2ltcGxlTmFtZTsKCiAgX1NwZWNpYWxUeXBlTWlycm9yLl8oU3RyaW5nIG5hbWUpIDogc2ltcGxlTmFtZSA9IF9zKG5hbWUpOwoKICBib29sIGdldCBpc1ByaXZhdGUgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNUb3BMZXZlbCA9PiB0cnVlOwoKICBEZWNsYXJhdGlvbk1pcnJvciBnZXQgb3duZXIgPT4gbnVsbDsKCiAgU291cmNlTG9jYXRpb24gZ2V0IGxvY2F0aW9uID0+IG51bGw7CiAgTGlzdDxJbnN0YW5jZU1pcnJvcj4gZ2V0IG1ldGFkYXRhID0+IGNvbnN0IDxJbnN0YW5jZU1pcnJvcj5bXTsKCiAgYm9vbCBnZXQgaGFzUmVmbGVjdGVkVHlwZSA9PiBzaW1wbGVOYW1lID09ICNkeW5hbWljOwogIFR5cGUgZ2V0IHJlZmxlY3RlZFR5cGUgewogICAgaWYgKHNpbXBsZU5hbWUgPT0gI2R5bmFtaWMpIHJldHVybiBkeW5hbWljOwogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoInZvaWQgaGFzIG5vIHJlZmxlY3RlZCB0eXBlIik7CiAgfQoKICBMaXN0PFR5cGVWYXJpYWJsZU1pcnJvcj4gZ2V0IHR5cGVWYXJpYWJsZXMgPT4gY29uc3QgPFR5cGVWYXJpYWJsZU1pcnJvcj5bXTsKICBMaXN0PFR5cGVNaXJyb3I+IGdldCB0eXBlQXJndW1lbnRzID0+IGNvbnN0IDxUeXBlTWlycm9yPltdOwoKICBib29sIGdldCBpc09yaWdpbmFsRGVjbGFyYXRpb24gPT4gdHJ1ZTsKICBUeXBlTWlycm9yIGdldCBvcmlnaW5hbERlY2xhcmF0aW9uID0+IHRoaXM7CgogIFN5bWJvbCBnZXQgcXVhbGlmaWVkTmFtZSA9PiBzaW1wbGVOYW1lOwoKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIF9TcGVjaWFsVHlwZU1pcnJvcikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdGhpcy5zaW1wbGVOYW1lID09IG90aGVyLnNpbXBsZU5hbWU7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHNpbXBsZU5hbWUuaGFzaENvZGU7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJUeXBlTWlycm9yIG9uICcke19uKHNpbXBsZU5hbWUpfSciOwoKICBib29sIGlzU3VidHlwZU9mKFR5cGVNaXJyb3Igb3RoZXIpIHsKICAgIHJldHVybiBzaW1wbGVOYW1lID09ICNkeW5hbWljIHx8IG90aGVyIGlzIF9TcGVjaWFsVHlwZU1pcnJvcjsKICB9CgogIGJvb2wgaXNBc3NpZ25hYmxlVG8oVHlwZU1pcnJvciBvdGhlcikgewogICAgcmV0dXJuIHNpbXBsZU5hbWUgPT0gI2R5bmFtaWMgfHwgb3RoZXIgaXMgX1NwZWNpYWxUeXBlTWlycm9yOwogIH0KfQoKY2xhc3MgX01pcnJvcnMgewogIHN0YXRpYyBNaXJyb3JTeXN0ZW0gX2N1cnJlbnRNaXJyb3JTeXN0ZW0gPSBuZXcgX0xvY2FsTWlycm9yU3lzdGVtKCk7CiAgc3RhdGljIE1pcnJvclN5c3RlbSBjdXJyZW50TWlycm9yU3lzdGVtKCkgewogICAgcmV0dXJuIF9jdXJyZW50TWlycm9yU3lzdGVtOwogIH0KCiAgLy8gQ3JlYXRlcyBhIG5ldyBsb2NhbCBtaXJyb3IgZm9yIHNvbWUgT2JqZWN0LgogIHN0YXRpYyBJbnN0YW5jZU1pcnJvciByZWZsZWN0KE9iamVjdCByZWZsZWN0ZWUpIHsKICAgIHJldHVybiByZWZsZWN0ZWUgaXMgRnVuY3Rpb24KICAgICAgICA/IG5ldyBfTG9jYWxDbG9zdXJlTWlycm9yLl8ocmVmbGVjdGVlKQogICAgICAgIDogbmV3IF9Mb2NhbEluc3RhbmNlTWlycm9yLl8ocmVmbGVjdGVlKTsKICB9CgogIHN0YXRpYyBDbGFzc01pcnJvciBfbWFrZUxvY2FsQ2xhc3NNaXJyb3IoVHlwZSBrZXkpCiAgICAgIG5hdGl2ZSAiTWlycm9yc19tYWtlTG9jYWxDbGFzc01pcnJvciI7CiAgc3RhdGljIFR5cGVNaXJyb3IgX21ha2VMb2NhbFR5cGVNaXJyb3IoVHlwZSBrZXkpCiAgICAgIG5hdGl2ZSAiTWlycm9yc19tYWtlTG9jYWxUeXBlTWlycm9yIjsKICBzdGF0aWMgVHlwZSBfaW5zdGFudGlhdGVHZW5lcmljVHlwZShUeXBlIGtleSwgdHlwZUFyZ3VtZW50cykKICAgICAgbmF0aXZlICJNaXJyb3JzX2luc3RhbnRpYXRlR2VuZXJpY1R5cGUiOwoKICBzdGF0aWMgRXhwYW5kbzxfTG9jYWxDbGFzc01pcnJvcj4gX2RlY2xhcmF0aW9uQ2FjaGUgPQogICAgICBuZXcgRXhwYW5kbygiQ2xhc3NNaXJyb3IiKTsKICBzdGF0aWMgRXhwYW5kbzxUeXBlTWlycm9yPiBfaW5zdGFudGlhdGlvbkNhY2hlID0gbmV3IEV4cGFuZG8oIlR5cGVNaXJyb3IiKTsKCiAgc3RhdGljIENsYXNzTWlycm9yIHJlZmxlY3RDbGFzcyhUeXBlIGtleSkgewogICAgdmFyIGNsYXNzTWlycm9yID0gX2RlY2xhcmF0aW9uQ2FjaGVba2V5XTsKICAgIGlmIChjbGFzc01pcnJvciA9PSBudWxsKSB7CiAgICAgIGNsYXNzTWlycm9yID0gX21ha2VMb2NhbENsYXNzTWlycm9yKGtleSk7CiAgICAgIF9kZWNsYXJhdGlvbkNhY2hlW2tleV0gPSBjbGFzc01pcnJvcjsKICAgICAgaWYgKCFjbGFzc01pcnJvci5faXNHZW5lcmljKSB7CiAgICAgICAgX2luc3RhbnRpYXRpb25DYWNoZVtrZXldID0gY2xhc3NNaXJyb3I7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjbGFzc01pcnJvcjsKICB9CgogIHN0YXRpYyBUeXBlTWlycm9yIHJlZmxlY3RUeXBlKFR5cGUga2V5LCBbTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzXSkgewogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBrZXkgPSBfaW5zdGFudGlhdGVUeXBlKGtleSwgdHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgICB2YXIgdHlwZU1pcnJvciA9IF9pbnN0YW50aWF0aW9uQ2FjaGVba2V5XTsKICAgIGlmICh0eXBlTWlycm9yID09IG51bGwpIHsKICAgICAgdHlwZU1pcnJvciA9IF9tYWtlTG9jYWxUeXBlTWlycm9yKGtleSk7CiAgICAgIF9pbnN0YW50aWF0aW9uQ2FjaGVba2V5XSA9IHR5cGVNaXJyb3I7CiAgICAgIGlmICh0eXBlTWlycm9yIGlzIF9Mb2NhbENsYXNzTWlycm9yICYmICF0eXBlTWlycm9yLl9pc0dlbmVyaWMpIHsKICAgICAgICBfZGVjbGFyYXRpb25DYWNoZVtrZXldID0gdHlwZU1pcnJvcjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHR5cGVNaXJyb3I7CiAgfQoKICBzdGF0aWMgVHlwZSBfaW5zdGFudGlhdGVUeXBlKFR5cGUga2V5LCBMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIGlmICh0eXBlQXJndW1lbnRzLmlzRW1wdHkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUodHlwZUFyZ3VtZW50cywgJ3R5cGVBcmd1bWVudHMnLAogICAgICAgICAgJ1R5cGUgYXJndW1lbnRzIGxpc3QgY2Fubm90IGJlIGVtcHR5LicpOwogICAgfQogICAgcmV0dXJuIF9pbnN0YW50aWF0ZUdlbmVyaWNUeXBlKGtleSwgdHlwZUFyZ3VtZW50cy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKSk7CiAgfQp9CoXkAE5OPAEhAU0BKxUjHQIBPQEZITACAUsoPQIBHT8pEiolATAfRhYjBkwWKAYZJxcGLScXBgQeFAQjFAQWKxkCAUkBSAFDATBGQAESKioyNyMITBYGFwQBTAEaHhwkBhUEAUgBSgIBMjcvAT4SFAEXARZKBAIBMQFKGiMBOwEeATgBMSsaGy8GEwQBTAIBMyEbFxcZEQFQJgEgJSAjKC0qIC4gASI4AUguAS0pNDZPBAEnQR0CAT0hIAE3AS9IJwEgHR4gHRwfJSsnQQIBUT4oLwFHASkBRS89UEMtSC4wFyEtLCcKBgFQBAEvRAQBPTsbBAEkHxJJKRYGHz0GHzFLMzISBhkEAgE2IDoBFRkZTxg0BhIEATkhAR8BTgEcLDEEARVPOjYEAS8/BAE0NBkEAThFL05QQy0sSC4wFyEtLCcKBgFQBAE9JgFNAS4sAUYCATcfOQEaHh0vBhYEATkuRAQBTwFGAgEiGwIBMy8dFhwZGQE/TCEtASQVFgEXERUZExcXKyITKy0sHAE3Gx0iPgYbBAEaUR8wBhgEARkdIkEGGwQBIBo7QAYTBAE4AR8BICIEASoqKC0nNB8lFQg1OgYhBAEfHAQBGCokMS47LE8INjI6CBlDBh0EAR4qFjkfIAYoE0UEAQ4aGhdDHzUXDykIBhMEARwwKDQrTCoKNywfUR9FOT0MCgodQQYhBAEeMio0IDMIKyQeIyAqCjgsNzsfRTk+DAoKH0EGIwQBMDQ1ATYBQEEiKQYBSCUsNTMGAS41BgEbQwQBUCpBEQQBKy8iTT4INwE9LxIzUiQIF0gGGwQBIyciI08vDz9HCAYbBAFKASghEw0rBgQBTwFPL09BPVBDLUguMBchLSwnCgYBJ00EASZJNjUtBAEcNC83QwQBKwEnQT8ZRQQBKkE/Sz86BAEpPz4aGCEuGAYSBAFIAUgBNDMBOCcBRDQBRgFELwE5JAE+KQE7IwFKAVEBST0BPisBOCsCATkkHFBSFAEyAUsWGh9GBhgEARwgH0kGGAQBGh4fFEwGGAQBJSkfRyRMBhgEASovNS0sGAFEAUIvAUEvAUIuAgE8IxQWAUABKAEZHSJBBhsEATgBICIEASZJNjUtBAEcNC0EASsCAT82SCwBHCAaRSAGEwQBHiABGh4fTgYYBAEmG0kEASkBTj4BKi4BRAEXKioeBAErASdBPxlFBAEqQT9LPzoEAUApATkvAgE6MR0ZJAFJQCwBHwEcIBo7QAYTBAEmJB0zMAYWBAE3Gx0iPgYbBAFKASohEw0xBgQBKy8iN08xEjNSJAgGGwQBIyciIy8PUDMiCAYbBAE/ASdBPxlFBAEqQT9LPzoEATsnATkqAgE5MDsCAVAbEQFCKiMcAUgqAScBHyABIgEwNDUBNi8iKQYBG0MEASAiBAEmSTY1LQQBHDQtBAErAT8BIhwuIz1RBicEATAyATslAUwBLisBSwIBOSklHSwXFxknASMaIigUFRcnI0I6PS0BIgEkOCQGQSAsBhkEASg4NgYtMC0IBAE4KQEnAgFQIhUBOhtOAR4CATkeHBcYAUI6LAEeHBwhHyQlIR4fAUE/OztFSCYyJzNMP0EBJDAuIwU+ARwgURkaPwYTBAEYTQExARoeHxsdDxZPCAYYBAElKR8/SQYYBAFIARsfJBwjD0EgKkEvKDdQESUKCAYdBAE5ASoiFCMNLgYEAVABPiMBRCkBNCgBTgIBOyAhFxYWAU8xLAExARtLIh4qHiseDT8GBAEUGBlMBhIEARdBATckAgE5IRcZFiIBGxEZHxYXFBQjIBEXGBMrLxUgDwEhICQXEwYhNwYaBAE+ASBKBAEmRjUrBAEUGBkbSAYSBAFBAUklAgEuLxsBPQEfHwEnASdBATcbMD4EAU4+ASouASoBHCgUBjAEASsBPAEnQgQBKkIEAgERRy4hBAExNCEvMQQBNS0zLD8vATgiTgEuLh8wLCUwCAYYBAFIITIGLx4uLUctCAYXBAFFIUQzBlAEAgEkZGFydDptaXJyb3JzLXBhdGNoL21pcnJvcnNfaW1wbC5kYXJ0NW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvbWlycm9yX3JlZmVyZW5jZS5kYXJ0gbgvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAibWlycm9yc19wYXRjaC5kYXJ0IjsKCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX01pcnJvclJlZmVyZW5jZSB7CiAgZmFjdG9yeSBfTWlycm9yUmVmZXJlbmNlLl91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93ICJVbnJlYWNoYWJsZSI7CiAgfQoKICBib29sIG9wZXJhdG9yID09KG90aGVyKSBuYXRpdmUgIk1pcnJvclJlZmVyZW5jZV9lcXVhbHMiOwp9ChAATk48ASEBGhkvGQQBOwIBKGRhcnQ6bWlycm9ycy1wYXRjaC9taXJyb3JfcmVmZXJlbmNlLmRhcnQyb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9taXJyb3JzX3BhdGNoLmRhcnSKui8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gTm90ZTogdGhlIFZNIGNvbmNhdGVuYXRlcyBhbGwgcGF0Y2ggZmlsZXMgaW50byBhIHNpbmdsZSBwYXRjaCBmaWxlLiBUaGlzCi8vLyBmaWxlIGlzIHRoZSBmaXJzdCBwYXRjaCBpbiAiZGFydDpfaW50ZXJuYWwiIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW1wb3J0cwovLy8gdXNlZCBieSBwYXRjaGVzIG9mIHRoYXQgbGlicmFyeS4gV2UgcGxhbiB0byBjaGFuZ2UgdGhpcyB3aGVuIHdlIGhhdmUgYQovLy8gc2hhcmVkIGZyb250IGVuZCBhbmQgc2ltcGx5IHVzZSBwYXJ0cy4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIGFzIGludGVybmFsOwoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgc2hvdyBwYXRjaDsKCmltcG9ydCAiZGFydDphc3luYyIgc2hvdyBGdXR1cmU7CgppbXBvcnQgImRhcnQ6Y29sbGVjdGlvbiIgc2hvdyBVbm1vZGlmaWFibGVMaXN0VmlldywgVW5tb2RpZmlhYmxlTWFwVmlldzsKCi8vLyBUaGVzZSBhcmUgdGhlIGFkZGl0aW9uYWwgcGFydHMgb2YgdGhpcyBwYXRjaCBsaWJyYXJ5OgovLyBwYXJ0ICJtaXJyb3JzX2ltcGwuZGFydCI7Ci8vIHBhcnQgIm1pcnJvcl9yZWZlcmVuY2UuZGFydCI7CgovKioKICogUmV0dXJucyBhIFtNaXJyb3JTeXN0ZW1dIGZvciB0aGUgY3VycmVudCBpc29sYXRlLgogKi8KQHBhdGNoCk1pcnJvclN5c3RlbSBjdXJyZW50TWlycm9yU3lzdGVtKCkgewogIHJldHVybiBfTWlycm9ycy5jdXJyZW50TWlycm9yU3lzdGVtKCk7Cn0KCi8qKgogKiBSZXR1cm5zIGFuIFtJbnN0YW5jZU1pcnJvcl0gZm9yIHNvbWUgRGFydCBsYW5ndWFnZSBvYmplY3QuCiAqCiAqIFRoaXMgb25seSB3b3JrcyBpZiB0aGlzIG1pcnJvciBzeXN0ZW0gaXMgYXNzb2NpYXRlZCB3aXRoIHRoZQogKiBjdXJyZW50IHJ1bm5pbmcgaXNvbGF0ZS4KICovCkBwYXRjaApJbnN0YW5jZU1pcnJvciByZWZsZWN0KE9iamVjdCByZWZsZWN0ZWUpIHsKICByZXR1cm4gX01pcnJvcnMucmVmbGVjdChyZWZsZWN0ZWUpOwp9CgovKioKICogUmV0dXJucyBhIFtDbGFzc01pcnJvcl0gZm9yIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSBhIERhcnQKICogVHlwZSBvYmplY3QuCiAqCiAqIFRoaXMgb25seSB3b3JrcyB3aXRoIG9iamVjdHMgbG9jYWwgdG8gdGhlIGN1cnJlbnQgaXNvbGF0ZS4KICovCkBwYXRjaApDbGFzc01pcnJvciByZWZsZWN0Q2xhc3MoVHlwZSBrZXkpIHsKICByZXR1cm4gX01pcnJvcnMucmVmbGVjdENsYXNzKGtleSk7Cn0KCkBwYXRjaApUeXBlTWlycm9yIHJlZmxlY3RUeXBlKFR5cGUga2V5LCBbTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzXSkgewogIHJldHVybiBfTWlycm9ycy5yZWZsZWN0VHlwZShrZXksIHR5cGVBcmd1bWVudHMpOwp9CgpAcGF0Y2gKY2xhc3MgTWlycm9yU3lzdGVtIHsKICBAcGF0Y2gKICBMaWJyYXJ5TWlycm9yIGZpbmRMaWJyYXJ5KFN5bWJvbCBsaWJyYXJ5TmFtZSkgewogICAgdmFyIGNhbmRpZGF0ZXMgPQogICAgICAgIGxpYnJhcmllcy52YWx1ZXMud2hlcmUoKGxpYikgPT4gbGliLnNpbXBsZU5hbWUgPT0gbGlicmFyeU5hbWUpOwogICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIGNhbmRpZGF0ZXMuc2luZ2xlOwogICAgfQogICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID4gMSkgewogICAgICB2YXIgdXJpcyA9IGNhbmRpZGF0ZXMubWFwKChsaWIpID0+IGxpYi51cmkudG9TdHJpbmcoKSkudG9MaXN0KCk7CiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZXJlIGFyZSBtdWx0aXBsZSBsaWJyYXJpZXMgbmFtZWQgIgogICAgICAgICAgIicke2dldE5hbWUobGlicmFyeU5hbWUpfSc6ICR1cmlzIik7CiAgICB9CiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBsaWJyYXJ5IG5hbWVkICcke2dldE5hbWUobGlicmFyeU5hbWUpfSciKTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShTeW1ib2wgc3ltYm9sKSB7CiAgICByZXR1cm4gaW50ZXJuYWwuU3ltYm9sLmNvbXB1dGVVbm1hbmdsZWROYW1lKHN5bWJvbCk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgU3ltYm9sIGdldFN5bWJvbChTdHJpbmcgbmFtZSwgW0xpYnJhcnlNaXJyb3IgbGlicmFyeV0pIHsKICAgIGlmICgobGlicmFyeSAhPSBudWxsICYmIGxpYnJhcnkgaXMhIF9Mb2NhbExpYnJhcnlNaXJyb3IpIHx8CiAgICAgICAgKChuYW1lLmxlbmd0aCA+IDApICYmIChuYW1lWzBdID09ICdfJykgJiYgKGxpYnJhcnkgPT0gbnVsbCkpKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKGxpYnJhcnkpOwogICAgfQogICAgaWYgKGxpYnJhcnkgIT0gbnVsbCkgewogICAgICBuYW1lID0gX21hbmdsZU5hbWUobmFtZSwgKGxpYnJhcnkgYXMgX0xvY2FsTGlicmFyeU1pcnJvcikuX3JlZmxlY3RlZSk7CiAgICB9CiAgICByZXR1cm4gbmV3IGludGVybmFsLlN5bWJvbC51bnZhbGlkYXRlZChuYW1lKTsKICB9CgogIHN0YXRpYyBfbWFuZ2xlTmFtZShTdHJpbmcgbmFtZSwgX01pcnJvclJlZmVyZW5jZSBsaWIpCiAgICAgIG5hdGl2ZSAiTWlycm9yc19tYW5nbGVOYW1lIjsKfQpfAE5OPAFNT0srASUBJAEhAUkBOh0hAQQ1BAclKQIBBD4DQBwEBysmAgEEPxADPgQHJSUCAQc/MwIBBxUJMhVIIiAGIUdALwZQBAEJKTkEAQlCQEgoBhtNBjIEATgjAgElZGFydDptaXJyb3JzLXBhdGNoL21pcnJvcnNfcGF0Y2guZGFydDJvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvcHJvZmlsZXIvcHJvZmlsZXIuZGFydIGJLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBQbGVhc2Ugc2VlICdkYXJ0OmRldmVsb3BlcicuCkBEZXByZWNhdGVkKCJEYXJ0IFNESyAxLjEyIikKbGlicmFyeSBkYXJ0LnByb2ZpbGVyOwoKZXhwb3J0ICdkYXJ0OmRldmVsb3BlcicKICAgIHNob3cgZ2V0Q3VycmVudFRhZywgQ291bnRlciwgR2F1Z2UsIE1ldHJpYywgTWV0cmljcywgVXNlclRhZzsKDABOTjwBIR0XARhCAQ1kYXJ0OnByb2ZpbGVyNm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi90eXBlZF9kYXRhL3R5cGVkX2RhdGEuZGFydMABXZ4vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIExpc3RzIHRoYXQgZWZmaWNpZW50bHkgaGFuZGxlIGZpeGVkIHNpemVkIGRhdGEKLy8vIChmb3IgZXhhbXBsZSwgdW5zaWduZWQgOCBieXRlIGludGVnZXJzKSBhbmQgU0lNRCBudW1lcmljIHR5cGVzLgovLy8KLy8vIFRvIHVzZSB0aGlzIGxpYnJhcnkgaW4geW91ciBjb2RlOgovLy8KLy8vICAgICBpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7Ci8vLwovLy8ge0BjYXRlZ29yeSBDb3JlfQpsaWJyYXJ5IGRhcnQudHlwZWRfZGF0YTsKCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgVW5tb2RpZmlhYmxlTGlzdEJhc2U7CgpwYXJ0ICJ1bm1vZGlmaWFibGVfdHlwZWRfZGF0YS5kYXJ0IjsKCi8qKgogKiBBIHNlcXVlbmNlIG9mIGJ5dGVzIHVuZGVybHlpbmcgYSB0eXBlZCBkYXRhIG9iamVjdC4KICoKICogVXNlZCB0byBwcm9jZXNzIGxhcmdlIHF1YW50aXRpZXMgb2YgYmluYXJ5IG9yIG51bWVyaWNhbCBkYXRhCiAqIG1vcmUgZWZmaWNpZW50bHkgdXNpbmcgYSB0eXBlZCB2aWV3LgogKi8KYWJzdHJhY3QgY2xhc3MgQnl0ZUJ1ZmZlciB7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgYnl0ZSBidWZmZXIsIGluIGJ5dGVzLgogICAqLwogIGludCBnZXQgbGVuZ3RoSW5CeXRlczsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50OExpc3RdIF92aWV3XyBvZiBhIHJlZ2lvbiBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhlIHZpZXcgaXMgYmFja2VkIGJ5IHRoZSBieXRlcyBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqIEFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGBVaW50OExpc3RgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSBhbmQgY29udGFpbnMgW2xlbmd0aF0gYnl0ZXMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIHJhbmdlIG9mIHRoZSBidWZmZXI6CiAgICoKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoYCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIFVpbnQ4TGlzdCBhc1VpbnQ4TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbSW50OExpc3RdIF92aWV3XyBvZiBhIHJlZ2lvbiBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhlIHZpZXcgaXMgYmFja2VkIGJ5IHRoZSBieXRlcyBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqIEFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGBJbnQ4TGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdIGFuZCBjb250YWlucyBbbGVuZ3RoXSBieXRlcy4KICAgKiBJZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLCB0aGUgcmFuZ2UgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgcmFuZ2Ugb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYGxlbmd0aGAgbXVzdCBub3QgYmUgbmVnYXRpdmUsIGFuZAogICAqICogYG9mZnNldEluQnl0ZXMgKyBsZW5ndGhgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgSW50OExpc3QgYXNJbnQ4TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDhDbGFtcGVkTGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYFVpbnQ4Q2xhbXBlZExpc3RgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSBhbmQgY29udGFpbnMgW2xlbmd0aF0gYnl0ZXMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIHJhbmdlIG9mIHRoZSBidWZmZXI6CiAgICoKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoYCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIFVpbnQ4Q2xhbXBlZExpc3QgYXNVaW50OENsYW1wZWRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50MTZMaXN0XSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgVWludDE2TGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdLCB3aGljaCBtdXN0IGJlIDE2LWJpdCBhbGlnbmVkLAogICAqIGFuZCBjb250YWlucyBbbGVuZ3RoXSAxNi1iaXQgaW50ZWdlcnMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgYXMgZmFyIHRvd2FyZHMgdGhlIGVuZCBvZgogICAqIHRoZSBidWZmZXIgYXMgcG9zc2libGUgLQogICAqIGlmIFtsZW5ndGhJbkJ5dGVzXSBpcyBub3QgZXZlbiwgdGhlIGxhc3QgYnl0ZSBjYW4ndCBiZSBwYXJ0IG9mIHRoZSB2aWV3LgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIDE2LWJpdCBhbGlnbmVkIHJhbmdlCiAgICogb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHR3bywKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoICogMmAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIFtsZW5ndGhJbkJ5dGVzXS4KICAgKi8KICBVaW50MTZMaXN0IGFzVWludDE2TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbSW50MTZMaXN0XSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgSW50MTZMaXN0YCB3aWxsIGFsc28gY2hhbmdlIHRoZSBidWZmZXIsCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICoKICAgKiBUaGUgdmlld2VkIHJlZ2lvbiBzdGFydCBhdCBbb2Zmc2V0SW5CeXRlc10sIHdoaWNoIG11c3QgYmUgMTYtYml0IGFsaWduZWQsCiAgICogYW5kIGNvbnRhaW5zIFtsZW5ndGhdIDE2LWJpdCBpbnRlZ2Vycy4KICAgKiBJZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLCB0aGUgcmFuZ2UgZXh0ZW5kcyBhcyBmYXIgdG93YXJkcyB0aGUgZW5kIG9mCiAgICogdGhlIGJ1ZmZlciBhcyBwb3NzaWJsZSAtCiAgICogaWYgW2xlbmd0aEluQnl0ZXNdIGlzIG5vdCBldmVuLCB0aGUgbGFzdCBieXRlIGNhbid0IGJlIHBhcnQgb2YgdGhlIHZpZXcuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgMTYtYml0IGFsaWduZWQgcmFuZ2UKICAgKiBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBiZSBkaXZpc2libGUgYnkgdHdvLAogICAqICogYGxlbmd0aGAgbXVzdCBub3QgYmUgbmVnYXRpdmUsIGFuZAogICAqICogYG9mZnNldEluQnl0ZXMgKyBsZW5ndGggKiAyYCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIEludDE2TGlzdCBhc0ludDE2TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDMyTGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYFVpbnQzMkxpc3RgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSwgd2hpY2ggbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCwKICAgKiBhbmQgY29udGFpbnMgW2xlbmd0aF0gMzItYml0IGludGVnZXJzLgogICAqIElmIFtsZW5ndGhdIGlzIG9taXR0ZWQsIHRoZSByYW5nZSBleHRlbmRzIGFzIGZhciB0b3dhcmRzIHRoZSBlbmQgb2YKICAgKiB0aGUgYnVmZmVyIGFzIHBvc3NpYmxlIC0KICAgKiBpZiBbbGVuZ3RoSW5CeXRlc10gaXMgbm90IGRpdmlzaWJsZSBieSBmb3VyLCB0aGUgbGFzdCBieXRlcyBjYW4ndCBiZSBwYXJ0CiAgICogb2YgdGhlIHZpZXcuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgMzItYml0IGFsaWduZWQgcmFuZ2UKICAgKiBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBiZSBkaXZpc2libGUgYnkgZm91ciwKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoICogNGAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIFtsZW5ndGhJbkJ5dGVzXS4KICAgKi8KICBVaW50MzJMaXN0IGFzVWludDMyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbSW50MzJMaXN0XSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgSW50MzJMaXN0YCB3aWxsIGFsc28gY2hhbmdlIHRoZSBidWZmZXIsCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICoKICAgKiBUaGUgdmlld2VkIHJlZ2lvbiBzdGFydCBhdCBbb2Zmc2V0SW5CeXRlc10sIHdoaWNoIG11c3QgYmUgMzItYml0IGFsaWduZWQsCiAgICogYW5kIGNvbnRhaW5zIFtsZW5ndGhdIDMyLWJpdCBpbnRlZ2Vycy4KICAgKiBJZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLCB0aGUgcmFuZ2UgZXh0ZW5kcyBhcyBmYXIgdG93YXJkcyB0aGUgZW5kIG9mCiAgICogdGhlIGJ1ZmZlciBhcyBwb3NzaWJsZSAtCiAgICogaWYgW2xlbmd0aEluQnl0ZXNdIGlzIG5vdCBkaXZpc2libGUgYnkgZm91ciwgdGhlIGxhc3QgYnl0ZXMgY2FuJ3QgYmUgcGFydAogICAqIG9mIHRoZSB2aWV3LgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIDMyLWJpdCBhbGlnbmVkIHJhbmdlCiAgICogb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IGZvdXIsCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDRgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgSW50MzJMaXN0IGFzSW50MzJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50NjRMaXN0XSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgVWludDY0TGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdLCB3aGljaCBtdXN0IGJlIDY0LWJpdCBhbGlnbmVkLAogICAqIGFuZCBjb250YWlucyBbbGVuZ3RoXSA2NC1iaXQgaW50ZWdlcnMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgYXMgZmFyIHRvd2FyZHMgdGhlIGVuZCBvZgogICAqIHRoZSBidWZmZXIgYXMgcG9zc2libGUgLQogICAqIGlmIFtsZW5ndGhJbkJ5dGVzXSBpcyBub3QgZGl2aXNpYmxlIGJ5IGVpZ2h0LCB0aGUgbGFzdCBieXRlcyBjYW4ndCBiZSBwYXJ0CiAgICogb2YgdGhlIHZpZXcuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgNjQtYml0IGFsaWduZWQgcmFuZ2UKICAgKiBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBiZSBkaXZpc2libGUgYnkgZWlnaHQsCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDhgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgVWludDY0TGlzdCBhc1VpbnQ2NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0ludDY0TGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYEludDY0TGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdLCB3aGljaCBtdXN0IGJlIDY0LWJpdCBhbGlnbmVkLAogICAqIGFuZCBjb250YWlucyBbbGVuZ3RoXSA2NC1iaXQgaW50ZWdlcnMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgYXMgZmFyIHRvd2FyZHMgdGhlIGVuZCBvZgogICAqIHRoZSBidWZmZXIgYXMgcG9zc2libGUgLQogICAqIGlmIFtsZW5ndGhJbkJ5dGVzXSBpcyBub3QgZGl2aXNpYmxlIGJ5IGVpZ2h0LCB0aGUgbGFzdCBieXRlcyBjYW4ndCBiZSBwYXJ0CiAgICogb2YgdGhlIHZpZXcuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgNjQtYml0IGFsaWduZWQgcmFuZ2UKICAgKiBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBiZSBkaXZpc2libGUgYnkgZWlnaHQsCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDhgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgSW50NjRMaXN0IGFzSW50NjRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtJbnQzMng0TGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYEludDMyeDRMaXN0YCB3aWxsIGFsc28gY2hhbmdlIHRoZSBidWZmZXIsCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICoKICAgKiBUaGUgdmlld2VkIHJlZ2lvbiBzdGFydCBhdCBbb2Zmc2V0SW5CeXRlc10sIHdoaWNoIG11c3QgYmUgMTI4LWJpdCBhbGlnbmVkLAogICAqIGFuZCBjb250YWlucyBbbGVuZ3RoXSAxMjgtYml0IGludGVnZXJzLgogICAqIElmIFtsZW5ndGhdIGlzIG9taXR0ZWQsIHRoZSByYW5nZSBleHRlbmRzIGFzIGZhciB0b3dhcmRzIHRoZSBlbmQgb2YKICAgKiB0aGUgYnVmZmVyIGFzIHBvc3NpYmxlIC0KICAgKiBpZiBbbGVuZ3RoSW5CeXRlc10gaXMgbm90IGRpdmlzaWJsZSBieSAxNiwgdGhlIGxhc3QgYnl0ZXMgY2FuJ3QgYmUgcGFydAogICAqIG9mIHRoZSB2aWV3LgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIDEyOC1iaXQgYWxpZ25lZCByYW5nZQogICAqIG9mIHRoZSBidWZmZXI6CiAgICoKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IGJlIGRpdmlzaWJsZSBieSBzaXh0ZWVuLAogICAqICogYGxlbmd0aGAgbXVzdCBub3QgYmUgbmVnYXRpdmUsIGFuZAogICAqICogYG9mZnNldEluQnl0ZXMgKyBsZW5ndGggKiAxNmAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIFtsZW5ndGhJbkJ5dGVzXS4KICAgKi8KICBJbnQzMng0TGlzdCBhc0ludDMyeDRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDMyTGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYEZsb2F0MzJMaXN0YCB3aWxsIGFsc28gY2hhbmdlIHRoZSBidWZmZXIsCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICoKICAgKiBUaGUgdmlld2VkIHJlZ2lvbiBzdGFydCBhdCBbb2Zmc2V0SW5CeXRlc10sIHdoaWNoIG11c3QgYmUgMzItYml0IGFsaWduZWQsCiAgICogYW5kIGNvbnRhaW5zIFtsZW5ndGhdIDMyLWJpdCBpbnRlZ2Vycy4KICAgKiBJZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLCB0aGUgcmFuZ2UgZXh0ZW5kcyBhcyBmYXIgdG93YXJkcyB0aGUgZW5kIG9mCiAgICogdGhlIGJ1ZmZlciBhcyBwb3NzaWJsZSAtCiAgICogaWYgW2xlbmd0aEluQnl0ZXNdIGlzIG5vdCBkaXZpc2libGUgYnkgZm91ciwgdGhlIGxhc3QgYnl0ZXMgY2FuJ3QgYmUgcGFydAogICAqIG9mIHRoZSB2aWV3LgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIDMyLWJpdCBhbGlnbmVkIHJhbmdlCiAgICogb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IGZvdXIsCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDRgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgRmxvYXQzMkxpc3QgYXNGbG9hdDMyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbRmxvYXQ2NExpc3RdIF92aWV3XyBvZiBhIHJlZ2lvbiBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhlIHZpZXcgaXMgYmFja2VkIGJ5IHRoZSBieXRlcyBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqIEFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGBGbG9hdDY0TGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdLCB3aGljaCBtdXN0IGJlIDY0LWJpdCBhbGlnbmVkLAogICAqIGFuZCBjb250YWlucyBbbGVuZ3RoXSA2NC1iaXQgaW50ZWdlcnMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgYXMgZmFyIHRvd2FyZHMgdGhlIGVuZCBvZgogICAqIHRoZSBidWZmZXIgYXMgcG9zc2libGUgLQogICAqIGlmIFtsZW5ndGhJbkJ5dGVzXSBpcyBub3QgZGl2aXNpYmxlIGJ5IGVpZ2h0LCB0aGUgbGFzdCBieXRlcyBjYW4ndCBiZSBwYXJ0CiAgICogb2YgdGhlIHZpZXcuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgNjQtYml0IGFsaWduZWQgcmFuZ2UKICAgKiBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBiZSBkaXZpc2libGUgYnkgZWlnaHQsCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDhgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgRmxvYXQ2NExpc3QgYXNGbG9hdDY0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbRmxvYXQzMng0TGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYEZsb2F0MzJ4NExpc3RgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSwgd2hpY2ggbXVzdCBiZSAxMjgtYml0IGFsaWduZWQsCiAgICogYW5kIGNvbnRhaW5zIFtsZW5ndGhdIDEyOC1iaXQgaW50ZWdlcnMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgYXMgZmFyIHRvd2FyZHMgdGhlIGVuZCBvZgogICAqIHRoZSBidWZmZXIgYXMgcG9zc2libGUgLQogICAqIGlmIFtsZW5ndGhJbkJ5dGVzXSBpcyBub3QgZGl2aXNpYmxlIGJ5IDE2LCB0aGUgbGFzdCBieXRlcyBjYW4ndCBiZSBwYXJ0CiAgICogb2YgdGhlIHZpZXcuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgMTI4LWJpdCBhbGlnbmVkIHJhbmdlCiAgICogb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHNpeHRlZW4sCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDE2YCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIEZsb2F0MzJ4NExpc3QgYXNGbG9hdDMyeDRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDY0eDJMaXN0XSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgRmxvYXQ2NHgyTGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdLCB3aGljaCBtdXN0IGJlIDEyOC1iaXQgYWxpZ25lZCwKICAgKiBhbmQgY29udGFpbnMgW2xlbmd0aF0gMTI4LWJpdCBpbnRlZ2Vycy4KICAgKiBJZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLCB0aGUgcmFuZ2UgZXh0ZW5kcyBhcyBmYXIgdG93YXJkcyB0aGUgZW5kIG9mCiAgICogdGhlIGJ1ZmZlciBhcyBwb3NzaWJsZSAtCiAgICogaWYgW2xlbmd0aEluQnl0ZXNdIGlzIG5vdCBkaXZpc2libGUgYnkgMTYsIHRoZSBsYXN0IGJ5dGVzIGNhbid0IGJlIHBhcnQKICAgKiBvZiB0aGUgdmlldy4KICAgKgogICAqIFRoZSBzdGFydCBpbmRleCBhbmQgbGVuZ3RoIG11c3QgZGVzY3JpYmUgYSB2YWxpZCAxMjgtYml0IGFsaWduZWQgcmFuZ2UKICAgKiBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBiZSBkaXZpc2libGUgYnkgc2l4dGVlbiwKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoICogMTZgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgRmxvYXQ2NHgyTGlzdCBhc0Zsb2F0NjR4Mkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0J5dGVEYXRhXSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgQnl0ZURhdGFgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSBhbmQgY29udGFpbnMgW2xlbmd0aF0gYnl0ZXMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIHJhbmdlIG9mIHRoZSBidWZmZXI6CiAgICoKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoYCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIEJ5dGVEYXRhIGFzQnl0ZURhdGEoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwp9CgovKioKICogQSB0eXBlZCB2aWV3IG9mIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuCiAqLwphYnN0cmFjdCBjbGFzcyBUeXBlZERhdGEgewogIC8qKgogICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgcmVwcmVzZW50YXRpb24gb2YgZWFjaCBlbGVtZW50IGluIHRoaXMKICAgKiBsaXN0LgogICAqLwogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgaW4gYnl0ZXMgaW50byB0aGUgdW5kZXJseWluZyBieXRlIGJ1ZmZlciBvZiB0aGlzIHZpZXcuCiAgICovCiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyB2aWV3LCBpbiBieXRlcy4KICAgKi8KICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXM7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGJ5dGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4KICAgKi8KICBCeXRlQnVmZmVyIGdldCBidWZmZXI7Cn0KCmFic3RyYWN0IGNsYXNzIF9UeXBlZEludExpc3QgZXh0ZW5kcyBUeXBlZERhdGEgewogIC8qKgogICAqIFJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhpcyBsaXN0IGFuZCBbb3RoZXJdLgogICAqCiAgICogSWYgb3RoZXIgaXMgYWxzbyBhIHR5cGVkLWRhdGEgaW50ZWdlciBsaXN0LCB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsCiAgICogYmUgYSB0eXBlLWRhdGEgaW50ZWdlciBsaXN0IGNhcGFibGUgb2YgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzIG9mCiAgICogdGhpcyBsaXN0IGFuZCBvZiBbb3RoZXJdLgogICAqIE90aGVyd2lzZSB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIGEgbm9ybWFsIGdyb3dhYmxlIGBMaXN0PGludD5gLgogICAqLwogIExpc3Q8aW50PiBvcGVyYXRvciArKExpc3Q8aW50PiBvdGhlcik7Cn0KCmFic3RyYWN0IGNsYXNzIF9UeXBlZEZsb2F0TGlzdCBleHRlbmRzIFR5cGVkRGF0YSB7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGlzIGxpc3QgYW5kIFtvdGhlcl0uCiAgICoKICAgKiBJZiBvdGhlciBpcyBhbHNvIGEgdHlwZWQtZGF0YSBmbG9hdGluZyBwb2ludCBudW1iZXIgbGlzdCwKICAgKiB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIGEgdHlwZS1kYXRhIGZsb2F0IGxpc3QgY2FwYWJsZSBvZiBjb250YWluaW5nCiAgICogYWxsIHRoZSBlbGVtZW50cyBvZiB0aGlzIGxpc3QgYW5kIG9mIFtvdGhlcl0uCiAgICogT3RoZXJ3aXNlIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgYSBub3JtYWwgZ3Jvd2FibGUgYExpc3Q8ZG91YmxlPmAuCiAgICovCiAgTGlzdDxkb3VibGU+IG9wZXJhdG9yICsoTGlzdDxkb3VibGU+IG90aGVyKTsKfQoKLyoqCiAqIERlc2NyaWJlcyBlbmRpYW5uZXNzIHRvIGJlIHVzZWQgd2hlbiBhY2Nlc3Npbmcgb3IgdXBkYXRpbmcgYQogKiBzZXF1ZW5jZSBvZiBieXRlcy4KICovCmNsYXNzIEVuZGlhbiB7CiAgZmluYWwgYm9vbCBfbGl0dGxlRW5kaWFuOwogIGNvbnN0IEVuZGlhbi5fKHRoaXMuX2xpdHRsZUVuZGlhbik7CgogIHN0YXRpYyBjb25zdCBFbmRpYW4gYmlnID0gY29uc3QgRW5kaWFuLl8oZmFsc2UpOwogIHN0YXRpYyBjb25zdCBFbmRpYW4gbGl0dGxlID0gY29uc3QgRW5kaWFuLl8odHJ1ZSk7CiAgc3RhdGljIGZpbmFsIEVuZGlhbiBob3N0ID0KICAgICAgKG5ldyBCeXRlRGF0YS52aWV3KG5ldyBVaW50MTZMaXN0LmZyb21MaXN0KFsxXSkuYnVmZmVyKSkuZ2V0SW50OCgwKSA9PSAxCiAgICAgICAgICA/IGxpdHRsZQogICAgICAgICAgOiBiaWc7Cn0KCi8qKgogKiBBIGZpeGVkLWxlbmd0aCwgcmFuZG9tLWFjY2VzcyBzZXF1ZW5jZSBvZiBieXRlcyB0aGF0IGFsc28gcHJvdmlkZXMgcmFuZG9tCiAqIGFuZCB1bmFsaWduZWQgYWNjZXNzIHRvIHRoZSBmaXhlZC13aWR0aCBpbnRlZ2VycyBhbmQgZmxvYXRpbmcgcG9pbnQKICogbnVtYmVycyByZXByZXNlbnRlZCBieSB0aG9zZSBieXRlcy4KICoKICogYEJ5dGVEYXRhYCBtYXkgYmUgdXNlZCB0byBwYWNrIGFuZCB1bnBhY2sgZGF0YSBmcm9tIGV4dGVybmFsIHNvdXJjZXMKICogKHN1Y2ggYXMgbmV0d29ya3Mgb3IgZmlsZXMgc3lzdGVtcyksIGFuZCB0byBwcm9jZXNzIGxhcmdlIHF1YW50aXRpZXMKICogb2YgbnVtZXJpY2FsIGRhdGEgbW9yZSBlZmZpY2llbnRseSB0aGFuIHdvdWxkIGJlIHBvc3NpYmxlCiAqIHdpdGggb3JkaW5hcnkgW0xpc3RdIGltcGxlbWVudGF0aW9ucy4KICogYEJ5dGVEYXRhYCBjYW4gc2F2ZSBzcGFjZSwgYnkgZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIG9iamVjdCBoZWFkZXJzLAogKiBhbmQgdGltZSwgYnkgZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIGRhdGEgY29waWVzLgogKiBGaW5hbGx5LCBgQnl0ZURhdGFgIG1heSBiZSB1c2VkIHRvIGludGVudGlvbmFsbHkgcmVpbnRlcnByZXQgdGhlIGJ5dGVzCiAqIHJlcHJlc2VudGluZyBvbmUgYXJpdGhtZXRpYyB0eXBlIGFzIGFub3RoZXIuCiAqIEZvciBleGFtcGxlIHRoaXMgY29kZSBmcmFnbWVudCBkZXRlcm1pbmUgd2hhdCAzMi1iaXQgc2lnbmVkIGludGVnZXIKICogaXMgcmVwcmVzZW50ZWQgYnkgdGhlIGJ5dGVzIG9mIGEgMzItYml0IGZsb2F0aW5nIHBvaW50IG51bWJlcjoKICoKICogICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KDgpLmJ1ZmZlcjsKICogICAgIHZhciBiZGF0YSA9IG5ldyBCeXRlRGF0YS52aWV3KGJ1ZmZlcik7CiAqICAgICBiZGF0YS5zZXRGbG9hdDMyKDAsIDMuMDQpOwogKiAgICAgaW50IGh1aCA9IGJkYXRhLmdldEludDMyKDApOwogKi8KYWJzdHJhY3QgY2xhc3MgQnl0ZURhdGEgaW1wbGVtZW50cyBUeXBlZERhdGEgewogIC8qKgogICAqIENyZWF0ZXMgYSBbQnl0ZURhdGFdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbCBvZgogICAqIHdob3NlIGJ5dGVzIGFyZSBpbml0aWFsbHkgemVyby4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZXh0ZXJuYWwgZmFjdG9yeSBCeXRlRGF0YShpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbQnl0ZURhdGFdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiBbYnVmZmVyXS4KICAgKgogICAqIENoYW5nZXMgaW4gdGhlIFtCeXRlRGF0YV0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlCiAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICovCiAgZmFjdG9yeSBCeXRlRGF0YS52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc0J5dGVEYXRhKG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSAocG9zc2libHkgbmVnYXRpdmUpIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGJ5dGUgYXQgdGhlCiAgICogc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkKICAgKiByZXByZXNlbnRhdGlvbi4KICAgKgogICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIC0xMjggYW5kIDEyNywgaW5jbHVzaXZlLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCiAgICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgaW50IGdldEludDgoaW50IGJ5dGVPZmZzZXQpOwoKICAvKioKICAgKiBTZXRzIHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0IHRvIHRoZQogICAqIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXSwgd2hpY2gKICAgKiBtdXN0IGZpdCBpbiBhIHNpbmdsZSBieXRlLgogICAqCiAgICogSW4gb3RoZXIgd29yZHMsIFt2YWx1ZV0gbXVzdCBiZSBiZXR3ZWVuIC0xMjggYW5kIDEyNywgaW5jbHVzaXZlLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCiAgICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRJbnQ4KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwb3NpdGl2ZSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQKICAgKiBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHVuc2lnbmVkIGJpbmFyeSBmb3JtLgogICAqCiAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMCBhbmQgMjU1LCBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KICAgKi8KICBpbnQgZ2V0VWludDgoaW50IGJ5dGVPZmZzZXQpOwoKICAvKioKICAgKiBTZXRzIHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0IHRvIHRoZQogICAqIHVuc2lnbmVkIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0sIHdoaWNoIG11c3QgZml0CiAgICogaW4gYSBzaW5nbGUgYnl0ZS4KICAgKgogICAqIEluIG90aGVyIHdvcmRzLCBbdmFsdWVdIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLAogICAqIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIHZvaWQgc2V0VWludDgoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIChwb3NzaWJseSBuZWdhdGl2ZSkgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgdHdvIGJ5dGVzIGF0CiAgICogdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5CiAgICogZm9ybS4KICAgKgogICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIC0yPHN1cD4xNTwvc3VwPiBhbmQgMjxzdXA+MTU8L3N1cD4gLSAxLAogICAqIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgMmAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgaW50IGdldEludDE2KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgdHdvIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMKICAgKiBvYmplY3QgdG8gdGhlIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQKICAgKiBbdmFsdWVdLCB3aGljaCBtdXN0IGZpdCBpbiB0d28gYnl0ZXMuCiAgICoKICAgKiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGxpZQogICAqIGJldHdlZW4gLTI8c3VwPjE1PC9zdXA+IGFuZCAyPHN1cD4xNTwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgMmAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRJbnQxNihpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgdHdvIGJ5dGVzIHN0YXJ0aW5nCiAgICogYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHVuc2lnbmVkIGJpbmFyeQogICAqIGZvcm0uCiAgICoKICAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYmV0d2VlbiAwIGFuZCAgMjxzdXA+MTY8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDJgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIGludCBnZXRVaW50MTYoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pOwoKICAvKioKICAgKiBTZXRzIHRoZSB0d28gYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QKICAgKiB0byB0aGUgdW5zaWduZWQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXSwKICAgKiB3aGljaCBtdXN0IGZpdCBpbiB0d28gYnl0ZXMuCiAgICoKICAgKiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4KICAgKiAwIGFuZCAyPHN1cD4xNjwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgMmAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRVaW50MTYoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIChwb3NzaWJseSBuZWdhdGl2ZSkgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgZm91ciBieXRlcyBhdAogICAqIHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiB0d28ncyBjb21wbGVtZW50IGJpbmFyeQogICAqIGZvcm0uCiAgICoKICAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYmV0d2VlbiAtMjxzdXA+MzE8L3N1cD4gYW5kIDI8c3VwPjMxPC9zdXA+IC0gMSwKICAgKiBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDRgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIGludCBnZXRJbnQzMihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFNldHMgdGhlIGZvdXIgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcwogICAqIG9iamVjdCB0byB0aGUgdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZAogICAqIFt2YWx1ZV0sIHdoaWNoIG11c3QgZml0IGluIGZvdXIgYnl0ZXMuCiAgICoKICAgKiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGxpZQogICAqIGJldHdlZW4gLTI8c3VwPjMxPC9zdXA+IGFuZCAyPHN1cD4zMTwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgNGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRJbnQzMihpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgZm91ciBieXRlcyBzdGFydGluZwogICAqIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiB1bnNpZ25lZCBiaW5hcnkKICAgKiBmb3JtLgogICAqCiAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMCBhbmQgIDI8c3VwPjMyPC9zdXA+IC0gMSwgaW5jbHVzaXZlLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCiAgICogYGJ5dGVPZmZzZXQgKyA0YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KICAgKi8KICBpbnQgZ2V0VWludDMyKGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZm91ciBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdAogICAqIHRvIHRoZSB1bnNpZ25lZCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBbdmFsdWVdLAogICAqIHdoaWNoIG11c3QgZml0IGluIGZvdXIgYnl0ZXMuCiAgICoKICAgKiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4KICAgKiAwIGFuZCAyPHN1cD4zMjwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgNGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRVaW50MzIoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIChwb3NzaWJseSBuZWdhdGl2ZSkgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgZWlnaHQgYnl0ZXMgYXQKICAgKiB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkKICAgKiBmb3JtLgogICAqCiAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gLTI8c3VwPjYzPC9zdXA+IGFuZCAyPHN1cD42Mzwvc3VwPiAtIDEsCiAgICogaW5jbHVzaXZlLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCiAgICogYGJ5dGVPZmZzZXQgKyA4YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KICAgKi8KICBpbnQgZ2V0SW50NjQoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pOwoKICAvKioKICAgKiBTZXRzIHRoZSBlaWdodCBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzCiAgICogb2JqZWN0IHRvIHRoZSB0d28ncyBjb21wbGVtZW50IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCiAgICogW3ZhbHVlXSwgd2hpY2ggbXVzdCBmaXQgaW4gZWlnaHQgYnl0ZXMuCiAgICoKICAgKiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGxpZQogICAqIGJldHdlZW4gLTI8c3VwPjYzPC9zdXA+IGFuZCAyPHN1cD42Mzwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRJbnQ2NChpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgZWlnaHQgYnl0ZXMgc3RhcnRpbmcKICAgKiBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdW5zaWduZWQgYmluYXJ5CiAgICogZm9ybS4KICAgKgogICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIDAgYW5kICAyPHN1cD42NDwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgaW50IGdldFVpbnQ2NChpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFNldHMgdGhlIGVpZ2h0IGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0CiAgICogdG8gdGhlIHVuc2lnbmVkIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0sCiAgICogd2hpY2ggbXVzdCBmaXQgaW4gZWlnaHQgYnl0ZXMuCiAgICoKICAgKiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4KICAgKiAwIGFuZCAyPHN1cD42NDwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRVaW50NjQoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZsb2F0aW5nIHBvaW50IG51bWJlciByZXByZXNlbnRlZCBieSB0aGUgZm91ciBieXRlcyBhdAogICAqIHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiBJRUVFIDc1NAogICAqIHNpbmdsZS1wcmVjaXNpb24gYmluYXJ5IGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoYmluYXJ5MzIpLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCiAgICogYGJ5dGVPZmZzZXQgKyA0YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KICAgKi8KICBkb3VibGUgZ2V0RmxvYXQzMihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFNldHMgdGhlIGZvdXIgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcwogICAqIG9iamVjdCB0byB0aGUgSUVFRSA3NTQgc2luZ2xlLXByZWNpc2lvbiBiaW5hcnkgZmxvYXRpbmctcG9pbnQKICAgKiAoYmluYXJ5MzIpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXS4KICAgKgogICAqICoqTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGNhbiBsb3NlIHByZWNpc2lvbi4qKiBUaGUgaW5wdXQgW3ZhbHVlXSBpcwogICAqIGEgNjQtYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlLCB3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCB0byAzMi1iaXQKICAgKiBmbG9hdGluZyBwb2ludCB2YWx1ZSBieSBJRUVFIDc1NCByb3VuZGluZyBydWxlcyBiZWZvcmUgaXQgaXMgc3RvcmVkLgogICAqIElmIFt2YWx1ZV0gY2Fubm90IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgYXMgYSBiaW5hcnkzMiwgaXQgd2lsbCBiZQogICAqIGNvbnZlcnRlZCB0byB0aGUgbmVhcmVzdCBiaW5hcnkzMiB2YWx1ZS4gIElmIHR3byBiaW5hcnkzMiB2YWx1ZXMgYXJlCiAgICogZXF1YWxseSBjbG9zZSwgdGhlIG9uZSB3aG9zZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgaXMgemVybyB3aWxsIGJlIHVzZWQuCiAgICogTm90ZSB0aGF0IGZpbml0ZSAoYnV0IGxhcmdlKSB2YWx1ZXMgY2FuIGJlIGNvbnZlcnRlZCB0byBpbmZpbml0eSwgYW5kCiAgICogc21hbGwgbm9uLXplcm8gdmFsdWVzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gemVyby4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgNGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRGbG9hdDMyKGludCBieXRlT2Zmc2V0LCBkb3VibGUgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGVpZ2h0IGJ5dGVzIGF0CiAgICogdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIElFRUUgNzU0CiAgICogZG91YmxlLXByZWNpc2lvbiBiaW5hcnkgZmxvYXRpbmctcG9pbnQgZm9ybWF0IChiaW5hcnk2NCkuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDhgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIGRvdWJsZSBnZXRGbG9hdDY0KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZWlnaHQgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcwogICAqIG9iamVjdCB0byB0aGUgSUVFRSA3NTQgZG91YmxlLXByZWNpc2lvbiBiaW5hcnkgZmxvYXRpbmctcG9pbnQKICAgKiAoYmluYXJ5NjQpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRGbG9hdDY0KGludCBieXRlT2Zmc2V0LCBkb3VibGUgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pOwp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiA4LWJpdCBzaWduZWQgaW50ZWdlcnMuCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKICogbW9yZSBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgogKgogKiBJbnRlZ2VycyBzdG9yZWQgaW4gdGhlIGxpc3QgYXJlIHRydW5jYXRlZCB0byB0aGVpciBsb3cgZWlnaHQgYml0cywKICogaW50ZXJwcmV0ZWQgYXMgYSBzaWduZWQgOC1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIHdpdGggdmFsdWVzIGluIHRoZQogKiByYW5nZSAtMTI4IHRvICsxMjcuCiAqLwphYnN0cmFjdCBjbGFzcyBJbnQ4TGlzdCBpbXBsZW1lbnRzIExpc3Q8aW50PiwgX1R5cGVkSW50TGlzdCB7CiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbSW50OExpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbCBvZgogICAqIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IEludDhMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0ludDhMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKgogICAqIFZhbHVlcyBhcmUgdHJ1bmNhdGVkIHRvIGZpdCBpbiB0aGUgbGlzdCB3aGVuIHRoZXkgYXJlIGNvcGllZCwKICAgKiB0aGUgc2FtZSB3YXkgc3RvcmluZyB2YWx1ZXMgdHJ1bmNhdGVzIHRoZW0uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQ4TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIFtJbnQ4TGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluIFtidWZmZXJdLgogICAqCiAgICogQ2hhbmdlcyBpbiB0aGUgW0ludDhMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKi8KICBmYWN0b3J5IEludDhMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCiAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICByZXR1cm4gYnVmZmVyLmFzSW50OExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBiZXR3ZWVuIFtzdGFydF0gYW5kIFtlbmRdLgogICAqCiAgICogVGhlIG5ldyBsaXN0IGlzIGFuIGBJbnQ4TGlzdGAgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhpcyBsaXN0IGF0CiAgICogcG9zaXRpb25zIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBbc3RhcnRdIGFuZCBsZXNzIHRoYW4gW2VuZF0gaW4gdGhlIHNhbWUKICAgKiBvcmRlciBhcyB0aGV5IG9jY3VyIGluIHRoaXMgbGlzdC4KICAgKgogICAqIGBgYGRhcnQKICAgKiB2YXIgbnVtYmVycyA9IEludDhMaXN0LmZyb21MaXN0KFswLCAxLCAyLCAzLCA0XSk7CiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEsIDMpKTsgLy8gWzEsIDJdCiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEsIDMpLnJ1bnRpbWVUeXBlKTsgLy8gSW50OExpc3QKICAgKiBgYGAKICAgKgogICAqIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBbbGVuZ3RoXSBvZiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEpKTsgLy8gWzEsIDIsIDMsIDRdCiAgICogYGBgCiAgICoKICAgKiBUaGUgYHN0YXJ0YCBhbmQgYGVuZGAgcG9zaXRpb25zIG11c3Qgc2F0aXNmeSB0aGUgcmVsYXRpb25zCiAgICogMCDiiaQgYHN0YXJ0YCDiiaQgYGVuZGAg4omkIGB0aGlzLmxlbmd0aGAKICAgKiBJZiBgZW5kYCBpcyBlcXVhbCB0byBgc3RhcnRgLCB0aGVuIHRoZSByZXR1cm5lZCBsaXN0IGlzIGVtcHR5LgogICAqLwogIEludDhMaXN0IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pOwoKICBzdGF0aWMgY29uc3QgaW50IGJ5dGVzUGVyRWxlbWVudCA9IDE7Cn0KCi8qKgogKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIDgtYml0IHVuc2lnbmVkIGludGVnZXJzLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5CiAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICoKICogSW50ZWdlcnMgc3RvcmVkIGluIHRoZSBsaXN0IGFyZSB0cnVuY2F0ZWQgdG8gdGhlaXIgbG93IGVpZ2h0IGJpdHMsCiAqIGludGVycHJldGVkIGFzIGFuIHVuc2lnbmVkIDgtYml0IGludGVnZXIgd2l0aCB2YWx1ZXMgaW4gdGhlCiAqIHJhbmdlIDAgdG8gMjU1LgogKi8KYWJzdHJhY3QgY2xhc3MgVWludDhMaXN0IGltcGxlbWVudHMgTGlzdDxpbnQ+LCBfVHlwZWRJbnRMaXN0IHsKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQ4TGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsIG9mCiAgICogd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgVWludDhMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQ4TGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICoKICAgKiBWYWx1ZXMgYXJlIHRydW5jYXRlZCB0byBmaXQgaW4gdGhlIGxpc3Qgd2hlbiB0aGV5IGFyZSBjb3BpZWQsCiAgICogdGhlIHNhbWUgd2F5IHN0b3JpbmcgdmFsdWVzIHRydW5jYXRlcyB0aGVtLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgVWludDhMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDhMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbVWludDhMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKi8KICBmYWN0b3J5IFVpbnQ4TGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc1VpbnQ4TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIGNvbmNhdGVuYXRpb24gb2YgdGhpcyBsaXN0IGFuZCBbb3RoZXJdLgogICAqCiAgICogSWYgW290aGVyXSBpcyBhbHNvIGEgdHlwZWQtZGF0YSBsaXN0LCB0aGVuIHRoZSByZXR1cm4gbGlzdCB3aWxsIGJlIGEKICAgKiB0eXBlZCBkYXRhIGxpc3QgY2FwYWJsZSBvZiBob2xkaW5nIGJvdGggdW5zaWduZWQgOC1iaXQgaW50ZWdlcnMgYW5kCiAgICogdGhlIGVsZW1lbnRzIG9mIFtvdGhlcl0sIG90aGVyd2lzZSBpdCdsbCBiZSBhIG5vcm1hbCBsaXN0IG9mIGludGVnZXJzLgogICAqLwogIExpc3Q8aW50PiBvcGVyYXRvciArKExpc3Q8aW50PiBvdGhlcik7CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBiZXR3ZWVuIFtzdGFydF0gYW5kIFtlbmRdLgogICAqCiAgICogVGhlIG5ldyBsaXN0IGlzIGEgYFVpbnQ4TGlzdGAgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhpcyBsaXN0IGF0CiAgICogcG9zaXRpb25zIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBbc3RhcnRdIGFuZCBsZXNzIHRoYW4gW2VuZF0gaW4gdGhlIHNhbWUKICAgKiBvcmRlciBhcyB0aGV5IG9jY3VyIGluIHRoaXMgbGlzdC4KICAgKgogICAqIGBgYGRhcnQKICAgKiB2YXIgbnVtYmVycyA9IFVpbnQ4TGlzdC5mcm9tTGlzdChbMCwgMSwgMiwgMywgNF0pOwogICAqIHByaW50KG51bWJlcnMuc3VibGlzdCgxLCAzKSk7IC8vIFsxLCAyXQogICAqIHByaW50KG51bWJlcnMuc3VibGlzdCgxLCAzKS5ydW50aW1lVHlwZSk7IC8vIFVpbnQ4TGlzdAogICAqIGBgYAogICAqCiAgICogSWYgW2VuZF0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gdGhlIFtsZW5ndGhdIG9mIHRoaXMgbGlzdC4KICAgKgogICAqIGBgYGRhcnQKICAgKiBwcmludChudW1iZXJzLnN1Ymxpc3QoMSkpOyAvLyBbMSwgMiwgMywgNF0KICAgKiBgYGAKICAgKgogICAqIFRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMgbXVzdCBzYXRpc2Z5IHRoZSByZWxhdGlvbnMKICAgKiAwIOKJpCBgc3RhcnRgIOKJpCBgZW5kYCDiiaQgYHRoaXMubGVuZ3RoYAogICAqIElmIGBlbmRgIGlzIGVxdWFsIHRvIGBzdGFydGAsIHRoZW4gdGhlIHJldHVybmVkIGxpc3QgaXMgZW1wdHkuCiAgICovCiAgVWludDhMaXN0IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pOwoKICBzdGF0aWMgY29uc3QgaW50IGJ5dGVzUGVyRWxlbWVudCA9IDE7Cn0KCi8qKgogKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIDgtYml0IHVuc2lnbmVkIGludGVnZXJzLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5CiAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICoKICogSW50ZWdlcnMgc3RvcmVkIGluIHRoZSBsaXN0IGFyZSBjbGFtcGVkIHRvIGFuIHVuc2lnbmVkIGVpZ2h0IGJpdCB2YWx1ZS4KICogVGhhdCBpcywgYWxsIHZhbHVlcyBiZWxvdyB6ZXJvIGFyZSBzdG9yZWQgYXMgemVybwogKiBhbmQgYWxsIHZhbHVlcyBhYm92ZSAyNTUgYXJlIHN0b3JlZCBhcyAyNTUuCiAqLwphYnN0cmFjdCBjbGFzcyBVaW50OENsYW1wZWRMaXN0IGltcGxlbWVudHMgTGlzdDxpbnQ+LCBfVHlwZWRJbnRMaXN0IHsKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQ4Q2xhbXBlZExpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbCBvZgogICAqIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFVpbnQ4Q2xhbXBlZExpc3QoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDhDbGFtcGVkTGlzdF0gb2YgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgW2VsZW1lbnRzXQogICAqIGxpc3QgYW5kIGNvcGllcyBvdmVyIHRoZSB2YWx1ZXMgY2xhbXBpbmcgd2hlbiBuZWVkZWQuCiAgICoKICAgKiBWYWx1ZXMgYXJlIGNsYW1wZWQgdG8gZml0IGluIHRoZSBsaXN0IHdoZW4gdGhleSBhcmUgY29waWVkLAogICAqIHRoZSBzYW1lIHdheSBzdG9yaW5nIHZhbHVlcyBjbGFtcHMgdGhlbS4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFVpbnQ4Q2xhbXBlZExpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50OENsYW1wZWRMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gdGhlCiAgICogc3BlY2lmaWVkIGJ5dGUgW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbVWludDhMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUgYnVmZmVyCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKi8KICBmYWN0b3J5IFVpbnQ4Q2xhbXBlZExpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIHJldHVybiBidWZmZXIuYXNVaW50OENsYW1wZWRMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgZWxlbWVudHMgYmV0d2VlbiBbc3RhcnRdIGFuZCBbZW5kXS4KICAgKgogICAqIFRoZSBuZXcgbGlzdCBpcyBhIGBVaW50OENsYW1wZWRMaXN0YCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGlzCiAgICogbGlzdCBhdCBwb3NpdGlvbnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFtzdGFydF0gYW5kIGxlc3MgdGhhbiBbZW5kXSBpbgogICAqIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgb2NjdXIgaW4gdGhpcyBsaXN0LgogICAqCiAgICogYGBgZGFydAogICAqIHZhciBudW1iZXJzID0gVWludDhDbGFtcGVkTGlzdC5mcm9tTGlzdChbMCwgMSwgMiwgMywgNF0pOwogICAqIHByaW50KG51bWJlcnMuc3VibGlzdCgxLCAzKSk7IC8vIFsxLCAyXQogICAqIHByaW50KG51bWJlcnMuc3VibGlzdCgxLCAzKS5ydW50aW1lVHlwZSk7IC8vIFVpbnQ4Q2xhbXBlZExpc3QKICAgKiBgYGAKICAgKgogICAqIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBbbGVuZ3RoXSBvZiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEpKTsgLy8gWzEsIDIsIDMsIDRdCiAgICogYGBgCiAgICoKICAgKiBUaGUgYHN0YXJ0YCBhbmQgYGVuZGAgcG9zaXRpb25zIG11c3Qgc2F0aXNmeSB0aGUgcmVsYXRpb25zCiAgICogMCDiiaQgYHN0YXJ0YCDiiaQgYGVuZGAg4omkIGB0aGlzLmxlbmd0aGAKICAgKiBJZiBgZW5kYCBpcyBlcXVhbCB0byBgc3RhcnRgLCB0aGVuIHRoZSByZXR1cm5lZCBsaXN0IGlzIGVtcHR5LgogICAqLwogIFVpbnQ4Q2xhbXBlZExpc3Qgc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSk7CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gMTsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgMTYtYml0IHNpZ25lZCBpbnRlZ2VycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEKICogW1R5cGVkRGF0YV0uCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKICogbW9yZSBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgogKgogKiBJbnRlZ2VycyBzdG9yZWQgaW4gdGhlIGxpc3QgYXJlIHRydW5jYXRlZCB0byB0aGVpciBsb3cgMTYgYml0cywKICogaW50ZXJwcmV0ZWQgYXMgYSBzaWduZWQgMTYtYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciB3aXRoIHZhbHVlcyBpbiB0aGUKICogcmFuZ2UgLTMyNzY4IHRvICszMjc2Ny4KICovCmFic3RyYWN0IGNsYXNzIEludDE2TGlzdCBpbXBsZW1lbnRzIExpc3Q8aW50PiwgX1R5cGVkSW50TGlzdCB7CiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbSW50MTZMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKICAgKiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQxNkxpc3QoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbSW50MTZMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKgogICAqIFZhbHVlcyBhcmUgdHJ1bmNhdGVkIHRvIGZpdCBpbiB0aGUgbGlzdCB3aGVuIHRoZXkgYXJlIGNvcGllZCwKICAgKiB0aGUgc2FtZSB3YXkgc3RvcmluZyB2YWx1ZXMgdHJ1bmNhdGVzIHRoZW0uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQxNkxpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbSW50MTZMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbSW50MTZMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCiAgICogW2J5dGVzUGVyRWxlbWVudF0uCiAgICovCiAgZmFjdG9yeSBJbnQxNkxpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIHJldHVybiBidWZmZXIuYXNJbnQxNkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBiZXR3ZWVuIFtzdGFydF0gYW5kIFtlbmRdLgogICAqCiAgICogVGhlIG5ldyBsaXN0IGlzIGFuIGBJbnQxNkxpc3RgIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoaXMKICAgKiBsaXN0IGF0IHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gW3N0YXJ0XSBhbmQgbGVzcyB0aGFuIFtlbmRdIGluCiAgICogdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBvY2N1ciBpbiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogdmFyIG51bWJlcnMgPSBJbnQxNkxpc3QuZnJvbUxpc3QoWzAsIDEsIDIsIDMsIDRdKTsKICAgKiBwcmludChudW1iZXJzLnN1Ymxpc3QoMSwgMykpOyAvLyBbMSwgMl0KICAgKiBwcmludChudW1iZXJzLnN1Ymxpc3QoMSwgMykucnVudGltZVR5cGUpOyAvLyBJbnQxNkxpc3QKICAgKiBgYGAKICAgKgogICAqIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBbbGVuZ3RoXSBvZiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEpKTsgLy8gWzEsIDIsIDMsIDRdCiAgICogYGBgCiAgICoKICAgKiBUaGUgYHN0YXJ0YCBhbmQgYGVuZGAgcG9zaXRpb25zIG11c3Qgc2F0aXNmeSB0aGUgcmVsYXRpb25zCiAgICogMCDiiaQgYHN0YXJ0YCDiiaQgYGVuZGAg4omkIGB0aGlzLmxlbmd0aGAKICAgKiBJZiBgZW5kYCBpcyBlcXVhbCB0byBgc3RhcnRgLCB0aGVuIHRoZSByZXR1cm5lZCBsaXN0IGlzIGVtcHR5LgogICAqLwogIEludDE2TGlzdCBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKTsKCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSAyOwp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiAxNi1iaXQgdW5zaWduZWQgaW50ZWdlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhCiAqIFtUeXBlZERhdGFdLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5CiAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICoKICogSW50ZWdlcnMgc3RvcmVkIGluIHRoZSBsaXN0IGFyZSB0cnVuY2F0ZWQgdG8gdGhlaXIgbG93IDE2IGJpdHMsCiAqIGludGVycHJldGVkIGFzIGFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHdpdGggdmFsdWVzIGluIHRoZQogKiByYW5nZSAwIHRvIDY1NTM1LgogKi8KYWJzdHJhY3QgY2xhc3MgVWludDE2TGlzdCBpbXBsZW1lbnRzIExpc3Q8aW50PiwgX1R5cGVkSW50TGlzdCB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50MTZMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwKICAgKiBvZiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBVaW50MTZMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQxNkxpc3RdIHdpdGggdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBbZWxlbWVudHNdIGxpc3QKICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgogICAqCiAgICogVmFsdWVzIGFyZSB0cnVuY2F0ZWQgdG8gZml0IGluIHRoZSBsaXN0IHdoZW4gdGhleSBhcmUgY29waWVkLAogICAqIHRoZSBzYW1lIHdheSBzdG9yaW5nIHZhbHVlcyB0cnVuY2F0ZXMgdGhlbS4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFVpbnQxNkxpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50MTZMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4KICAgKiB0aGUgc3BlY2lmaWVkIGJ5dGUgYnVmZmVyLgogICAqCiAgICogQ2hhbmdlcyBpbiB0aGUgW1VpbnQxNkxpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZSBidWZmZXIKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90IHNwZWNpZmllZCwKICAgKiBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgogICAqIElmIHRoZSBsZW5ndGggaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gYG51bGxgLAogICAqIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCiAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KICAgKiB0aGUgbGVuZ3RoIG9mIFtidWZmZXJdLgogICAqCiAgICogVGhyb3dzIFtBcmd1bWVudEVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gaXMgbm90IGEgbXVsdGlwbGUgb2YKICAgKiBbYnl0ZXNQZXJFbGVtZW50XS4KICAgKi8KICBmYWN0b3J5IFVpbnQxNkxpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIHJldHVybiBidWZmZXIuYXNVaW50MTZMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgZWxlbWVudHMgYmV0d2VlbiBbc3RhcnRdIGFuZCBbZW5kXS4KICAgKgogICAqIFRoZSBuZXcgbGlzdCBpcyBhIGBVaW50MTZMaXN0YCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGlzCiAgICogbGlzdCBhdCBwb3NpdGlvbnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFtzdGFydF0gYW5kIGxlc3MgdGhhbiBbZW5kXSBpbgogICAqIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgb2NjdXIgaW4gdGhpcyBsaXN0LgogICAqCiAgICogYGBgZGFydAogICAqIHZhciBudW1iZXJzID0gVWludDE2TGlzdC5mcm9tTGlzdChbMCwgMSwgMiwgMywgNF0pOwogICAqIHByaW50KG51bWJlcnMuc3VibGlzdCgxLCAzKSk7IC8vIFsxLCAyXQogICAqIHByaW50KG51bWJlcnMuc3VibGlzdCgxLCAzKS5ydW50aW1lVHlwZSk7IC8vIFVpbnQxNkxpc3QKICAgKiBgYGAKICAgKgogICAqIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBbbGVuZ3RoXSBvZiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEpKTsgLy8gWzEsIDIsIDMsIDRdCiAgICogYGBgCiAgICoKICAgKiBUaGUgYHN0YXJ0YCBhbmQgYGVuZGAgcG9zaXRpb25zIG11c3Qgc2F0aXNmeSB0aGUgcmVsYXRpb25zCiAgICogMCDiiaQgYHN0YXJ0YCDiiaQgYGVuZGAg4omkIGB0aGlzLmxlbmd0aGAKICAgKiBJZiBgZW5kYCBpcyBlcXVhbCB0byBgc3RhcnRgLCB0aGVuIHRoZSByZXR1cm5lZCBsaXN0IGlzIGVtcHR5LgogICAqLwogIFVpbnQxNkxpc3Qgc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSk7CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gMjsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgMzItYml0IHNpZ25lZCBpbnRlZ2VycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEKICogW1R5cGVkRGF0YV0uCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKICogbW9yZSBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgogKgogKiBJbnRlZ2VycyBzdG9yZWQgaW4gdGhlIGxpc3QgYXJlIHRydW5jYXRlZCB0byB0aGVpciBsb3cgMzIgYml0cywKICogaW50ZXJwcmV0ZWQgYXMgYSBzaWduZWQgMzItYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciB3aXRoIHZhbHVlcyBpbiB0aGUKICogcmFuZ2UgLTIxNDc0ODM2NDggdG8gMjE0NzQ4MzY0Ny4KICovCmFic3RyYWN0IGNsYXNzIEludDMyTGlzdCBpbXBsZW1lbnRzIExpc3Q8aW50PiwgX1R5cGVkSW50TGlzdCB7CiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbSW50MzJMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKICAgKiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQzMkxpc3QoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbSW50MzJMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKgogICAqIFZhbHVlcyBhcmUgdHJ1bmNhdGVkIHRvIGZpdCBpbiB0aGUgbGlzdCB3aGVuIHRoZXkgYXJlIGNvcGllZCwKICAgKiB0aGUgc2FtZSB3YXkgc3RvcmluZyB2YWx1ZXMgdHJ1bmNhdGVzIHRoZW0uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQzMkxpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbSW50MzJMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbSW50MzJMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCiAgICogW2J5dGVzUGVyRWxlbWVudF0uCiAgICovCiAgZmFjdG9yeSBJbnQzMkxpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIHJldHVybiBidWZmZXIuYXNJbnQzMkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBiZXR3ZWVuIFtzdGFydF0gYW5kIFtlbmRdLgogICAqCiAgICogVGhlIG5ldyBsaXN0IGlzIGFuIGBJbnQzMkxpc3RgIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoaXMKICAgKiBsaXN0IGF0IHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gW3N0YXJ0XSBhbmQgbGVzcyB0aGFuIFtlbmRdIGluCiAgICogdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBvY2N1ciBpbiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogdmFyIG51bWJlcnMgPSBJbnQzMkxpc3QuZnJvbUxpc3QoWzAsIDEsIDIsIDMsIDRdKTsKICAgKiBwcmludChudW1iZXJzLnN1Ymxpc3QoMSwgMykpOyAvLyBbMSwgMl0KICAgKiBwcmludChudW1iZXJzLnN1Ymxpc3QoMSwgMykucnVudGltZVR5cGUpOyAvLyBJbnQzMkxpc3QKICAgKiBgYGAKICAgKgogICAqIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBbbGVuZ3RoXSBvZiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEpKTsgLy8gWzEsIDIsIDMsIDRdCiAgICogYGBgCiAgICoKICAgKiBUaGUgYHN0YXJ0YCBhbmQgYGVuZGAgcG9zaXRpb25zIG11c3Qgc2F0aXNmeSB0aGUgcmVsYXRpb25zCiAgICogMCDiiaQgYHN0YXJ0YCDiiaQgYGVuZGAg4omkIGB0aGlzLmxlbmd0aGAKICAgKiBJZiBgZW5kYCBpcyBlcXVhbCB0byBgc3RhcnRgLCB0aGVuIHRoZSByZXR1cm5lZCBsaXN0IGlzIGVtcHR5LgogICAqLwogIEludDMyTGlzdCBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKTsKCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSA0Owp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhCiAqIFtUeXBlZERhdGFdLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5CiAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICoKICogSW50ZWdlcnMgc3RvcmVkIGluIHRoZSBsaXN0IGFyZSB0cnVuY2F0ZWQgdG8gdGhlaXIgbG93IDMyIGJpdHMsCiAqIGludGVycHJldGVkIGFzIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHdpdGggdmFsdWVzIGluIHRoZQogKiByYW5nZSAwIHRvIDQyOTQ5NjcyOTUuCiAqLwphYnN0cmFjdCBjbGFzcyBVaW50MzJMaXN0IGltcGxlbWVudHMgTGlzdDxpbnQ+LCBfVHlwZWRJbnRMaXN0IHsKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQzMkxpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbAogICAqIG9mIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFVpbnQzMkxpc3QoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDMyTGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICoKICAgKiBWYWx1ZXMgYXJlIHRydW5jYXRlZCB0byBmaXQgaW4gdGhlIGxpc3Qgd2hlbiB0aGV5IGFyZSBjb3BpZWQsCiAgICogdGhlIHNhbWUgd2F5IHN0b3JpbmcgdmFsdWVzIHRydW5jYXRlcyB0aGVtLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgVWludDMyTGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQzMkxpc3RdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbgogICAqIHRoZSBzcGVjaWZpZWQgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbVWludDMyTGlzdF0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlIGJ1ZmZlcgogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICoKICAgKiBUaHJvd3MgW0FyZ3VtZW50RXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBpcyBub3QgYSBtdWx0aXBsZSBvZgogICAqIFtieXRlc1BlckVsZW1lbnRdLgogICAqLwogIGZhY3RvcnkgVWludDMyTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc1VpbnQzMkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBiZXR3ZWVuIFtzdGFydF0gYW5kIFtlbmRdLgogICAqCiAgICogVGhlIG5ldyBsaXN0IGlzIGEgYFVpbnQzMkxpc3RgIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoaXMKICAgKiBsaXN0IGF0IHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gW3N0YXJ0XSBhbmQgbGVzcyB0aGFuIFtlbmRdIGluCiAgICogdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBvY2N1ciBpbiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogdmFyIG51bWJlcnMgPSBVaW50MzJMaXN0LmZyb21MaXN0KFswLCAxLCAyLCAzLCA0XSk7CiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEsIDMpKTsgLy8gWzEsIDJdCiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEsIDMpLnJ1bnRpbWVUeXBlKTsgLy8gVWludDMyTGlzdAogICAqIGBgYAogICAqCiAgICogSWYgW2VuZF0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gdGhlIFtsZW5ndGhdIG9mIHRoaXMgbGlzdC4KICAgKgogICAqIGBgYGRhcnQKICAgKiBwcmludChudW1iZXJzLnN1Ymxpc3QoMSkpOyAvLyBbMSwgMiwgMywgNF0KICAgKiBgYGAKICAgKgogICAqIFRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMgbXVzdCBzYXRpc2Z5IHRoZSByZWxhdGlvbnMKICAgKiAwIOKJpCBgc3RhcnRgIOKJpCBgZW5kYCDiiaQgYHRoaXMubGVuZ3RoYAogICAqIElmIGBlbmRgIGlzIGVxdWFsIHRvIGBzdGFydGAsIHRoZW4gdGhlIHJldHVybmVkIGxpc3QgaXMgZW1wdHkuCiAgICovCiAgVWludDMyTGlzdCBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKTsKCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSA0Owp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiA2NC1iaXQgc2lnbmVkIGludGVnZXJzIHRoYXQgaXMgdmlld2FibGUgYXMgYQogKiBbVHlwZWREYXRhXS4KICoKICogRm9yIGxvbmcgbGlzdHMsIHRoaXMgaW1wbGVtZW50YXRpb24gY2FuIGJlIGNvbnNpZGVyYWJseQogKiBtb3JlIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCiAqCiAqIEludGVnZXJzIHN0b3JlZCBpbiB0aGUgbGlzdCBhcmUgdHJ1bmNhdGVkIHRvIHRoZWlyIGxvdyA2NCBiaXRzLAogKiBpbnRlcnByZXRlZCBhcyBhIHNpZ25lZCA2NC1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIHdpdGggdmFsdWVzIGluIHRoZQogKiByYW5nZSAtOTIyMzM3MjAzNjg1NDc3NTgwOCB0byArOTIyMzM3MjAzNjg1NDc3NTgwNy4KICovCmFic3RyYWN0IGNsYXNzIEludDY0TGlzdCBpbXBsZW1lbnRzIExpc3Q8aW50PiwgX1R5cGVkSW50TGlzdCB7CiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbSW50NjRMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKICAgKiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQ2NExpc3QoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbSW50NjRMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKgogICAqIFZhbHVlcyBhcmUgdHJ1bmNhdGVkIHRvIGZpdCBpbiB0aGUgbGlzdCB3aGVuIHRoZXkgYXJlIGNvcGllZCwKICAgKiB0aGUgc2FtZSB3YXkgc3RvcmluZyB2YWx1ZXMgdHJ1bmNhdGVzIHRoZW0uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQ2NExpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbSW50NjRMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbSW50NjRMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUgYnVmZmVyCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCiAgICogW2J5dGVzUGVyRWxlbWVudF0uCiAgICovCiAgZmFjdG9yeSBJbnQ2NExpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIHJldHVybiBidWZmZXIuYXNJbnQ2NExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBiZXR3ZWVuIFtzdGFydF0gYW5kIFtlbmRdLgogICAqCiAgICogVGhlIG5ldyBsaXN0IGlzIGFuIGBJbnQ2NExpc3RgIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoaXMKICAgKiBsaXN0IGF0IHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gW3N0YXJ0XSBhbmQgbGVzcyB0aGFuIFtlbmRdIGluCiAgICogdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBvY2N1ciBpbiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogdmFyIG51bWJlcnMgPSBJbnQ2NExpc3QuZnJvbUxpc3QoWzAsIDEsIDIsIDMsIDRdKTsKICAgKiBwcmludChudW1iZXJzLnN1Ymxpc3QoMSwgMykpOyAvLyBbMSwgMl0KICAgKiBwcmludChudW1iZXJzLnN1Ymxpc3QoMSwgMykucnVudGltZVR5cGUpOyAvLyBJbnQ2NExpc3QKICAgKiBgYGAKICAgKgogICAqIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBbbGVuZ3RoXSBvZiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEpKTsgLy8gWzEsIDIsIDMsIDRdCiAgICogYGBgCiAgICoKICAgKiBUaGUgYHN0YXJ0YCBhbmQgYGVuZGAgcG9zaXRpb25zIG11c3Qgc2F0aXNmeSB0aGUgcmVsYXRpb25zCiAgICogMCDiiaQgYHN0YXJ0YCDiiaQgYGVuZGAg4omkIGB0aGlzLmxlbmd0aGAKICAgKiBJZiBgZW5kYCBpcyBlcXVhbCB0byBgc3RhcnRgLCB0aGVuIHRoZSByZXR1cm5lZCBsaXN0IGlzIGVtcHR5LgogICAqLwogIEludDY0TGlzdCBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKTsKCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSA4Owp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiA2NC1iaXQgdW5zaWduZWQgaW50ZWdlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhCiAqIFtUeXBlZERhdGFdLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5CiAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICoKICogSW50ZWdlcnMgc3RvcmVkIGluIHRoZSBsaXN0IGFyZSB0cnVuY2F0ZWQgdG8gdGhlaXIgbG93IDY0IGJpdHMsCiAqIGludGVycHJldGVkIGFzIGFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHdpdGggdmFsdWVzIGluIHRoZQogKiByYW5nZSAwIHRvIDE4NDQ2NzQ0MDczNzA5NTUxNjE1LgogKi8KYWJzdHJhY3QgY2xhc3MgVWludDY0TGlzdCBpbXBsZW1lbnRzIExpc3Q8aW50PiwgX1R5cGVkSW50TGlzdCB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50NjRMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwKICAgKiBvZiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBVaW50NjRMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQ2NExpc3RdIHdpdGggdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBbZWxlbWVudHNdIGxpc3QKICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgogICAqCiAgICogVmFsdWVzIGFyZSB0cnVuY2F0ZWQgdG8gZml0IGluIHRoZSBsaXN0IHdoZW4gdGhleSBhcmUgY29waWVkLAogICAqIHRoZSBzYW1lIHdheSBzdG9yaW5nIHZhbHVlcyB0cnVuY2F0ZXMgdGhlbS4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFVpbnQ2NExpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbVWludDY0TGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluCiAgICogdGhlIHNwZWNpZmllZCBieXRlIGJ1ZmZlci4KICAgKgogICAqIENoYW5nZXMgaW4gdGhlIFtVaW50NjRMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUgYnVmZmVyCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCiAgICogW2J5dGVzUGVyRWxlbWVudF0uCiAgICovCiAgZmFjdG9yeSBVaW50NjRMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCiAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICByZXR1cm4gYnVmZmVyLmFzVWludDY0TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGJldHdlZW4gW3N0YXJ0XSBhbmQgW2VuZF0uCiAgICoKICAgKiBUaGUgbmV3IGxpc3QgaXMgYSBgVWludDY0TGlzdGAgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhpcwogICAqIGxpc3QgYXQgcG9zaXRpb25zIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBbc3RhcnRdIGFuZCBsZXNzIHRoYW4gW2VuZF0gaW4KICAgKiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IG9jY3VyIGluIHRoaXMgbGlzdC4KICAgKgogICAqIGBgYGRhcnQKICAgKiB2YXIgbnVtYmVycyA9IFVpbnQ2NExpc3QuZnJvbUxpc3QoWzAsIDEsIDIsIDMsIDRdKTsKICAgKiBwcmludChudW1iZXJzLnN1Ymxpc3QoMSwgMykpOyAvLyBbMSwgMl0KICAgKiBwcmludChudW1iZXJzLnN1Ymxpc3QoMSwgMykucnVudGltZVR5cGUpOyAvLyBVaW50NjRMaXN0CiAgICogYGBgCiAgICoKICAgKiBJZiBbZW5kXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byB0aGUgW2xlbmd0aF0gb2YgdGhpcyBsaXN0LgogICAqCiAgICogYGBgZGFydAogICAqIHByaW50KG51bWJlcnMuc3VibGlzdCgxKSk7IC8vIFsxLCAyLCAzLCA0XQogICAqIGBgYAogICAqCiAgICogVGhlIGBzdGFydGAgYW5kIGBlbmRgIHBvc2l0aW9ucyBtdXN0IHNhdGlzZnkgdGhlIHJlbGF0aW9ucwogICAqIDAg4omkIGBzdGFydGAg4omkIGBlbmRgIOKJpCBgdGhpcy5sZW5ndGhgCiAgICogSWYgYGVuZGAgaXMgZXF1YWwgdG8gYHN0YXJ0YCwgdGhlbiB0aGUgcmV0dXJuZWQgbGlzdCBpcyBlbXB0eS4KICAgKi8KICBVaW50NjRMaXN0IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pOwoKICBzdGF0aWMgY29uc3QgaW50IGJ5dGVzUGVyRWxlbWVudCA9IDg7Cn0KCi8qKgogKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIElFRUUgNzU0IHNpbmdsZS1wcmVjaXNpb24gYmluYXJ5IGZsb2F0aW5nLXBvaW50CiAqIG51bWJlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhIFtUeXBlZERhdGFdLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcwogKiBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5IG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuCiAqIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICoKICogRG91YmxlIHZhbHVlcyBzdG9yZWQgaW4gdGhlIGxpc3QgYXJlIGNvbnZlcnRlZCB0byB0aGUgbmVhcmVzdAogKiBzaW5nbGUtcHJlY2lzaW9uIHZhbHVlLiBWYWx1ZXMgcmVhZCBhcmUgY29udmVydGVkIHRvIGEgZG91YmxlCiAqIHZhbHVlIHdpdGggdGhlIHNhbWUgdmFsdWUuCiAqLwphYnN0cmFjdCBjbGFzcyBGbG9hdDMyTGlzdCBpbXBsZW1lbnRzIExpc3Q8ZG91YmxlPiwgX1R5cGVkRmxvYXRMaXN0IHsKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0MzJMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKICAgKiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDMyTGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDMyTGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICoKICAgKiBWYWx1ZXMgYXJlIHRydW5jYXRlZCB0byBmaXQgaW4gdGhlIGxpc3Qgd2hlbiB0aGV5IGFyZSBjb3BpZWQsCiAgICogdGhlIHNhbWUgd2F5IHN0b3JpbmcgdmFsdWVzIHRydW5jYXRlcyB0aGVtLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgRmxvYXQzMkxpc3QuZnJvbUxpc3QoTGlzdDxkb3VibGU+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDMyTGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluIFtidWZmZXJdLgogICAqCiAgICogQ2hhbmdlcyBpbiB0aGUgW0Zsb2F0MzJMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCiAgICogW2J5dGVzUGVyRWxlbWVudF0uCiAgICovCiAgZmFjdG9yeSBGbG9hdDMyTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc0Zsb2F0MzJMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgZWxlbWVudHMgYmV0d2VlbiBbc3RhcnRdIGFuZCBbZW5kXS4KICAgKgogICAqIFRoZSBuZXcgbGlzdCBpcyBhIGBGbG9hdDMyTGlzdGAgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhpcwogICAqIGxpc3QgYXQgcG9zaXRpb25zIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBbc3RhcnRdIGFuZCBsZXNzIHRoYW4gW2VuZF0gaW4KICAgKiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IG9jY3VyIGluIHRoaXMgbGlzdC4KICAgKgogICAqIGBgYGRhcnQKICAgKiB2YXIgbnVtYmVycyA9IEZsb2F0MzJMaXN0LmZyb21MaXN0KFswLCAxLCAyLCAzLCA0XSk7CiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEsIDMpKTsgLy8gWzEsIDJdCiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEsIDMpLnJ1bnRpbWVUeXBlKTsgLy8gRmxvYXQzMkxpc3QKICAgKiBgYGAKICAgKgogICAqIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBbbGVuZ3RoXSBvZiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEpKTsgLy8gWzEsIDIsIDMsIDRdCiAgICogYGBgCiAgICoKICAgKiBUaGUgYHN0YXJ0YCBhbmQgYGVuZGAgcG9zaXRpb25zIG11c3Qgc2F0aXNmeSB0aGUgcmVsYXRpb25zCiAgICogMCDiiaQgYHN0YXJ0YCDiiaQgYGVuZGAg4omkIGB0aGlzLmxlbmd0aGAKICAgKiBJZiBgZW5kYCBpcyBlcXVhbCB0byBgc3RhcnRgLCB0aGVuIHRoZSByZXR1cm5lZCBsaXN0IGlzIGVtcHR5LgogICAqLwogIEZsb2F0MzJMaXN0IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pOwoKICBzdGF0aWMgY29uc3QgaW50IGJ5dGVzUGVyRWxlbWVudCA9IDQ7Cn0KCi8qKgogKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIElFRUUgNzU0IGRvdWJsZS1wcmVjaXNpb24gYmluYXJ5IGZsb2F0aW5nLXBvaW50CiAqIG51bWJlcnMgIHRoYXQgaXMgdmlld2FibGUgYXMgYSBbVHlwZWREYXRhXS4KICoKICogRm9yIGxvbmcgbGlzdHMsIHRoaXMKICogaW1wbGVtZW50YXRpb24gY2FuIGJlIGNvbnNpZGVyYWJseSBtb3JlIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbgogKiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCiAqLwphYnN0cmFjdCBjbGFzcyBGbG9hdDY0TGlzdCBpbXBsZW1lbnRzIExpc3Q8ZG91YmxlPiwgX1R5cGVkRmxvYXRMaXN0IHsKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0NjRMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKICAgKiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDY0TGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDY0TGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDY0TGlzdC5mcm9tTGlzdChMaXN0PGRvdWJsZT4gZWxlbWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0NjRMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbRmxvYXQ2NExpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZQogICAqIGJ1ZmZlciBhbmQgdmljZSB2ZXJzYS4KICAgKiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90IHNwZWNpZmllZCwKICAgKiBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgogICAqIElmIHRoZSBsZW5ndGggaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gYG51bGxgLAogICAqIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCiAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KICAgKiB0aGUgbGVuZ3RoIG9mIFtidWZmZXJdLgogICAqCiAgICogVGhyb3dzIFtBcmd1bWVudEVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gaXMgbm90IGEgbXVsdGlwbGUgb2YKICAgKiBbYnl0ZXNQZXJFbGVtZW50XS4KICAgKi8KICBmYWN0b3J5IEZsb2F0NjRMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCiAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICByZXR1cm4gYnVmZmVyLmFzRmxvYXQ2NExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBiZXR3ZWVuIFtzdGFydF0gYW5kIFtlbmRdLgogICAqCiAgICogVGhlIG5ldyBsaXN0IGlzIGEgYEZsb2F0NjRMaXN0YCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGlzCiAgICogbGlzdCBhdCBwb3NpdGlvbnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFtzdGFydF0gYW5kIGxlc3MgdGhhbiBbZW5kXSBpbgogICAqIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgb2NjdXIgaW4gdGhpcyBsaXN0LgogICAqCiAgICogYGBgZGFydAogICAqIHZhciBudW1iZXJzID0gRmxvYXQ2NExpc3QuZnJvbUxpc3QoWzAsIDEsIDIsIDMsIDRdKTsKICAgKiBwcmludChudW1iZXJzLnN1Ymxpc3QoMSwgMykpOyAvLyBbMSwgMl0KICAgKiBwcmludChudW1iZXJzLnN1Ymxpc3QoMSwgMykucnVudGltZVR5cGUpOyAvLyBGbG9hdDY0TGlzdAogICAqIGBgYAogICAqCiAgICogSWYgW2VuZF0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gdGhlIFtsZW5ndGhdIG9mIHRoaXMgbGlzdC4KICAgKgogICAqIGBgYGRhcnQKICAgKiBwcmludChudW1iZXJzLnN1Ymxpc3QoMSkpOyAvLyBbMSwgMiwgMywgNF0KICAgKiBgYGAKICAgKgogICAqIFRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMgbXVzdCBzYXRpc2Z5IHRoZSByZWxhdGlvbnMKICAgKiAwIOKJpCBgc3RhcnRgIOKJpCBgZW5kYCDiiaQgYHRoaXMubGVuZ3RoYAogICAqIElmIGBlbmRgIGlzIGVxdWFsIHRvIGBzdGFydGAsIHRoZW4gdGhlIHJldHVybmVkIGxpc3QgaXMgZW1wdHkuCiAgICovCiAgRmxvYXQ2NExpc3Qgc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSk7CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gODsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgRmxvYXQzMng0IG51bWJlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhCiAqIFtUeXBlZERhdGFdLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGNvbnNpZGVyYWJseSBtb3JlCiAqIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCiAqLwphYnN0cmFjdCBjbGFzcyBGbG9hdDMyeDRMaXN0IGltcGxlbWVudHMgTGlzdDxGbG9hdDMyeDQ+LCBUeXBlZERhdGEgewogIC8qKgogICAqIENyZWF0ZXMgYSBbRmxvYXQzMng0TGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwKICAgKiBhbGwgb2Ygd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgRmxvYXQzMng0TGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDMyeDRMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0MzJ4NExpc3QuZnJvbUxpc3QoTGlzdDxGbG9hdDMyeDQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDMyeDRMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbRmxvYXQzMng0TGlzdF0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlCiAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICoKICAgKiBUaHJvd3MgW0FyZ3VtZW50RXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBpcyBub3QgYSBtdWx0aXBsZSBvZgogICAqIFtieXRlc1BlckVsZW1lbnRdLgogICAqLwogIGZhY3RvcnkgRmxvYXQzMng0TGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc0Zsb2F0MzJ4NExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhpcyBsaXN0IGFuZCBbb3RoZXJdLgogICAqCiAgICogSWYgW290aGVyXSBpcyBhbHNvIGEgW0Zsb2F0MzJ4NExpc3RdLCB0aGUgcmVzdWx0IGlzIGEgbmV3IFtGbG9hdDMyeDRMaXN0XSwKICAgKiBvdGhlcndpc2UgdGhlIHJlc3VsdCBpcyBhIG5vcm1hbCBncm93YWJsZSBgTGlzdDxGbG9hdDMyeDQ+YC4KICAgKi8KICBMaXN0PEZsb2F0MzJ4ND4gb3BlcmF0b3IgKyhMaXN0PEZsb2F0MzJ4ND4gb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgZWxlbWVudHMgYmV0d2VlbiBbc3RhcnRdIGFuZCBbZW5kXS4KICAgKgogICAqIFRoZSBuZXcgbGlzdCBpcyBhIGBGbG9hdDMyeDRMaXN0YCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGlzCiAgICogbGlzdCBhdCBwb3NpdGlvbnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFtzdGFydF0gYW5kIGxlc3MgdGhhbiBbZW5kXSBpbgogICAqIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgb2NjdXIgaW4gdGhpcyBsaXN0LgogICAqCiAgICogYGBgZGFydAogICAqIHZhciBudW1iZXJzID0gRmxvYXQzMng0TGlzdC5mcm9tTGlzdChbMCwgMSwgMiwgMywgNF0pOwogICAqIHByaW50KG51bWJlcnMuc3VibGlzdCgxLCAzKSk7IC8vIFsxLCAyXQogICAqIHByaW50KG51bWJlcnMuc3VibGlzdCgxLCAzKS5ydW50aW1lVHlwZSk7IC8vIEZsb2F0MzJ4NExpc3QKICAgKiBgYGAKICAgKgogICAqIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBbbGVuZ3RoXSBvZiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEpKTsgLy8gWzEsIDIsIDMsIDRdCiAgICogYGBgCiAgICoKICAgKiBUaGUgYHN0YXJ0YCBhbmQgYGVuZGAgcG9zaXRpb25zIG11c3Qgc2F0aXNmeSB0aGUgcmVsYXRpb25zCiAgICogMCDiiaQgYHN0YXJ0YCDiiaQgYGVuZGAg4omkIGB0aGlzLmxlbmd0aGAKICAgKiBJZiBgZW5kYCBpcyBlcXVhbCB0byBgc3RhcnRgLCB0aGVuIHRoZSByZXR1cm5lZCBsaXN0IGlzIGVtcHR5LgogICAqLwogIEZsb2F0MzJ4NExpc3Qgc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSk7CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gMTY7Cn0KCi8qKgogKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIEludDMyeDQgbnVtYmVycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEKICogW1R5cGVkRGF0YV0uCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgY29uc2lkZXJhYmx5IG1vcmUKICogc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIEludDMyeDRMaXN0IGltcGxlbWVudHMgTGlzdDxJbnQzMng0PiwgVHlwZWREYXRhIHsKICAvKioKICAgKiBDcmVhdGVzIGEgW0ludDMyeDRMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLAogICAqIGFsbCBvZiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQzMng0TGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtJbnQzMng0TGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQzMng0TGlzdC5mcm9tTGlzdChMaXN0PEludDMyeDQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtJbnQzMng0TGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluIFtidWZmZXJdLgogICAqCiAgICogQ2hhbmdlcyBpbiB0aGUgW0ludDMyeDRMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCiAgICogW2J5dGVzUGVyRWxlbWVudF0uCiAgICovCiAgZmFjdG9yeSBJbnQzMng0TGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc0ludDMyeDRMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoaXMgbGlzdCBhbmQgW290aGVyXS4KICAgKgogICAqIElmIFtvdGhlcl0gaXMgYWxzbyBhIFtJbnQzMng0TGlzdF0sIHRoZSByZXN1bHQgaXMgYSBuZXcgW0ludDMyeDRMaXN0XSwKICAgKiBvdGhlcndpc2UgdGhlIHJlc3VsdCBpcyBhIG5vcm1hbCBncm93YWJsZSBgTGlzdDxJbnQzMng0PmAuCiAgICovCiAgTGlzdDxJbnQzMng0PiBvcGVyYXRvciArKExpc3Q8SW50MzJ4ND4gb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgZWxlbWVudHMgYmV0d2VlbiBbc3RhcnRdIGFuZCBbZW5kXS4KICAgKgogICAqIFRoZSBuZXcgbGlzdCBpcyBhbiBgSW50MzJ4NGxpc3RgIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoaXMKICAgKiBsaXN0IGF0IHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gW3N0YXJ0XSBhbmQgbGVzcyB0aGFuIFtlbmRdIGluCiAgICogdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBvY2N1ciBpbiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogdmFyIG51bWJlcnMgPSBJbnQzMng0bGlzdC5mcm9tTGlzdChbMCwgMSwgMiwgMywgNF0pOwogICAqIHByaW50KG51bWJlcnMuc3VibGlzdCgxLCAzKSk7IC8vIFsxLCAyXQogICAqIHByaW50KG51bWJlcnMuc3VibGlzdCgxLCAzKS5ydW50aW1lVHlwZSk7IC8vIEludDMyeDRsaXN0CiAgICogYGBgCiAgICoKICAgKiBJZiBbZW5kXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byB0aGUgW2xlbmd0aF0gb2YgdGhpcyBsaXN0LgogICAqCiAgICogYGBgZGFydAogICAqIHByaW50KG51bWJlcnMuc3VibGlzdCgxKSk7IC8vIFsxLCAyLCAzLCA0XQogICAqIGBgYAogICAqCiAgICogVGhlIGBzdGFydGAgYW5kIGBlbmRgIHBvc2l0aW9ucyBtdXN0IHNhdGlzZnkgdGhlIHJlbGF0aW9ucwogICAqIDAg4omkIGBzdGFydGAg4omkIGBlbmRgIOKJpCBgdGhpcy5sZW5ndGhgCiAgICogSWYgYGVuZGAgaXMgZXF1YWwgdG8gYHN0YXJ0YCwgdGhlbiB0aGUgcmV0dXJuZWQgbGlzdCBpcyBlbXB0eS4KICAgKi8KICBJbnQzMng0TGlzdCBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKTsKCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSAxNjsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgRmxvYXQ2NHgyIG51bWJlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhCiAqIFtUeXBlZERhdGFdLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGNvbnNpZGVyYWJseSBtb3JlCiAqIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCiAqLwphYnN0cmFjdCBjbGFzcyBGbG9hdDY0eDJMaXN0IGltcGxlbWVudHMgTGlzdDxGbG9hdDY0eDI+LCBUeXBlZERhdGEgewogIC8qKgogICAqIENyZWF0ZXMgYSBbRmxvYXQ2NHgyTGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwKICAgKiBhbGwgb2Ygd2hvc2UgZWxlbWVudHMgaGF2ZSBhbGwgbGFuZXMgc2V0IHRvIHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDY0eDJMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0NjR4Mkxpc3RdIHdpdGggdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBbZWxlbWVudHNdIGxpc3QKICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgRmxvYXQ2NHgyTGlzdC5mcm9tTGlzdChMaXN0PEZsb2F0NjR4Mj4gZWxlbWVudHMpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoaXMgbGlzdCBhbmQgW290aGVyXS4KICAgKgogICAqIElmIFtvdGhlcl0gaXMgYWxzbyBhIFtGbG9hdDY0eDJMaXN0XSwgdGhlIHJlc3VsdCBpcyBhIG5ldyBbRmxvYXQ2NHgyTGlzdF0sCiAgICogb3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgYSBub3JtYWwgZ3Jvd2FibGUgYExpc3Q8RmxvYXQ2NHgyPmAuCiAgICovCiAgTGlzdDxGbG9hdDY0eDI+IG9wZXJhdG9yICsoTGlzdDxGbG9hdDY0eDI+IG90aGVyKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDY0eDJMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbRmxvYXQ2NHgyTGlzdF0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlCiAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICoKICAgKiBUaHJvd3MgW0FyZ3VtZW50RXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBpcyBub3QgYSBtdWx0aXBsZSBvZgogICAqIFtieXRlc1BlckVsZW1lbnRdLgogICAqLwogIGZhY3RvcnkgRmxvYXQ2NHgyTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc0Zsb2F0NjR4Mkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBiZXR3ZWVuIFtzdGFydF0gYW5kIFtlbmRdLgogICAqCiAgICogVGhlIG5ldyBsaXN0IGlzIGEgYEZsb2F0NjR4Mkxpc3RgIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoaXMKICAgKiBsaXN0IGF0IHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gW3N0YXJ0XSBhbmQgbGVzcyB0aGFuIFtlbmRdIGluCiAgICogdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBvY2N1ciBpbiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogdmFyIG51bWJlcnMgPSBGbG9hdDY0eDJMaXN0LmZyb21MaXN0KFswLCAxLCAyLCAzLCA0XSk7CiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEsIDMpKTsgLy8gWzEsIDJdCiAgICogcHJpbnQobnVtYmVycy5zdWJsaXN0KDEsIDMpLnJ1bnRpbWVUeXBlKTsgLy8gRmxvYXQ2NHgyTGlzdAogICAqIGBgYAogICAqCiAgICogSWYgW2VuZF0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gdGhlIFtsZW5ndGhdIG9mIHRoaXMgbGlzdC4KICAgKgogICAqIGBgYGRhcnQKICAgKiBwcmludChudW1iZXJzLnN1Ymxpc3QoMSkpOyAvLyBbMSwgMiwgMywgNF0KICAgKiBgYGAKICAgKgogICAqIFRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMgbXVzdCBzYXRpc2Z5IHRoZSByZWxhdGlvbnMKICAgKiAwIOKJpCBgc3RhcnRgIOKJpCBgZW5kYCDiiaQgYHRoaXMubGVuZ3RoYAogICAqIElmIGBlbmRgIGlzIGVxdWFsIHRvIGBzdGFydGAsIHRoZW4gdGhlIHJldHVybmVkIGxpc3QgaXMgZW1wdHkuCiAgICovCiAgRmxvYXQ2NHgyTGlzdCBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKTsKCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSAxNjsKfQoKLyoqCiAqIEZsb2F0MzJ4NCBpbW11dGFibGUgdmFsdWUgdHlwZSBhbmQgb3BlcmF0aW9ucy4KICoKICogRmxvYXQzMng0IHN0b3JlcyA0IDMyLWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZXMgaW4gImxhbmVzIi4KICogVGhlIGxhbmVzIGFyZSAieCIsICJ5IiwgInoiLCBhbmQgInciIHJlc3BlY3RpdmVseS4KICovCmFic3RyYWN0IGNsYXNzIEZsb2F0MzJ4NCB7CiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDMyeDQoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeiwgZG91YmxlIHcpOwogIGV4dGVybmFsIGZhY3RvcnkgRmxvYXQzMng0LnNwbGF0KGRvdWJsZSB2KTsKICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0MzJ4NC56ZXJvKCk7CiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDMyeDQuZnJvbUludDMyeDRCaXRzKEludDMyeDQgeCk7CgogIC8vLyBTZXRzIHRoZSB4IGFuZCB5IGxhbmVzIHRvIHRoZWlyIHJlc3BlY3RpdmUgdmFsdWVzIGluIFt2XSBhbmQgc2V0cyB0aGUgegogIC8vLyBhbmQgdyBsYW5lcyB0byAwLjAuCiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDMyeDQuZnJvbUZsb2F0NjR4MihGbG9hdDY0eDIgdik7CgogIC8vLyBBZGRpdGlvbiBvcGVyYXRvci4KICBGbG9hdDMyeDQgb3BlcmF0b3IgKyhGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gTmVnYXRlIG9wZXJhdG9yLgogIEZsb2F0MzJ4NCBvcGVyYXRvciAtKCk7CgogIC8vLyBTdWJ0cmFjdGlvbiBvcGVyYXRvci4KICBGbG9hdDMyeDQgb3BlcmF0b3IgLShGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gTXVsdGlwbGljYXRpb24gb3BlcmF0b3IuCiAgRmxvYXQzMng0IG9wZXJhdG9yICooRmxvYXQzMng0IG90aGVyKTsKCiAgLy8vIERpdmlzaW9uIG9wZXJhdG9yLgogIEZsb2F0MzJ4NCBvcGVyYXRvciAvKEZsb2F0MzJ4NCBvdGhlcik7CgogIC8vLyBSZWxhdGlvbmFsIGxlc3MgdGhhbi4KICBJbnQzMng0IGxlc3NUaGFuKEZsb2F0MzJ4NCBvdGhlcik7CgogIC8vLyBSZWxhdGlvbmFsIGxlc3MgdGhhbiBvciBlcXVhbC4KICBJbnQzMng0IGxlc3NUaGFuT3JFcXVhbChGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gUmVsYXRpb25hbCBncmVhdGVyIHRoYW4uCiAgSW50MzJ4NCBncmVhdGVyVGhhbihGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gUmVsYXRpb25hbCBncmVhdGVyIHRoYW4gb3IgZXF1YWwuCiAgSW50MzJ4NCBncmVhdGVyVGhhbk9yRXF1YWwoRmxvYXQzMng0IG90aGVyKTsKCiAgLy8vIFJlbGF0aW9uYWwgZXF1YWwuCiAgSW50MzJ4NCBlcXVhbChGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gUmVsYXRpb25hbCBub3QtZXF1YWwuCiAgSW50MzJ4NCBub3RFcXVhbChGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gUmV0dXJucyBhIGNvcHkgb2YgW3RoaXNdIGVhY2ggbGFuZSBiZWluZyBzY2FsZWQgYnkgW3NdLgogIC8vLyBFcXVpdmFsZW50IHRvIHRoaXMgKiBuZXcgRmxvYXQzMng0LnNwbGF0KHMpCiAgRmxvYXQzMng0IHNjYWxlKGRvdWJsZSBzKTsKCiAgLy8vIFJldHVybnMgdGhlIGxhbmUtd2lzZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGlzIFtGbG9hdDMyeDRdLgogIEZsb2F0MzJ4NCBhYnMoKTsKCiAgLy8vIExhbmUtd2lzZSBjbGFtcCBbdGhpc10gdG8gYmUgaW4gdGhlIHJhbmdlIFtsb3dlckxpbWl0XS1bdXBwZXJMaW1pdF0uCiAgRmxvYXQzMng0IGNsYW1wKEZsb2F0MzJ4NCBsb3dlckxpbWl0LCBGbG9hdDMyeDQgdXBwZXJMaW1pdCk7CgogIC8vLyBFeHRyYWN0ZWQgeCB2YWx1ZS4KICBkb3VibGUgZ2V0IHg7CgogIC8vLyBFeHRyYWN0ZWQgeSB2YWx1ZS4KICBkb3VibGUgZ2V0IHk7CgogIC8vLyBFeHRyYWN0ZWQgeiB2YWx1ZS4KICBkb3VibGUgZ2V0IHo7CgogIC8vLyBFeHRyYWN0ZWQgdyB2YWx1ZS4KICBkb3VibGUgZ2V0IHc7CgogIC8vLyBFeHRyYWN0IHRoZSBzaWduIGJpdHMgZnJvbSBlYWNoIGxhbmUgcmV0dXJuIHRoZW0gaW4gdGhlIGZpcnN0IDQgYml0cy4KICAvLy8gIngiIGxhbmUgaXMgYml0IDAuCiAgLy8vICJ5IiBsYW5lIGlzIGJpdCAxLgogIC8vLyAieiIgbGFuZSBpcyBiaXQgMi4KICAvLy8gInciIGxhbmUgaXMgYml0IDMuCiAgaW50IGdldCBzaWduTWFzazsKCiAgLy8vIE1hc2sgcGFzc2VkIHRvIFtzaHVmZmxlXSBvciBbc2h1ZmZsZU1peF0uCiAgc3RhdGljIGNvbnN0IGludCB4eHh4ID0gMHgwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh4eSA9IDB4NDA7CiAgc3RhdGljIGNvbnN0IGludCB4eHh6ID0gMHg4MDsKICBzdGF0aWMgY29uc3QgaW50IHh4eHcgPSAweEMwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh5eCA9IDB4MTA7CiAgc3RhdGljIGNvbnN0IGludCB4eHl5ID0gMHg1MDsKICBzdGF0aWMgY29uc3QgaW50IHh4eXogPSAweDkwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh5dyA9IDB4RDA7CiAgc3RhdGljIGNvbnN0IGludCB4eHp4ID0gMHgyMDsKICBzdGF0aWMgY29uc3QgaW50IHh4enkgPSAweDYwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh6eiA9IDB4QTA7CiAgc3RhdGljIGNvbnN0IGludCB4eHp3ID0gMHhFMDsKICBzdGF0aWMgY29uc3QgaW50IHh4d3ggPSAweDMwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh3eSA9IDB4NzA7CiAgc3RhdGljIGNvbnN0IGludCB4eHd6ID0gMHhCMDsKICBzdGF0aWMgY29uc3QgaW50IHh4d3cgPSAweEYwOwogIHN0YXRpYyBjb25zdCBpbnQgeHl4eCA9IDB4NDsKICBzdGF0aWMgY29uc3QgaW50IHh5eHkgPSAweDQ0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl4eiA9IDB4ODQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXh3ID0gMHhDNDsKICBzdGF0aWMgY29uc3QgaW50IHh5eXggPSAweDE0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl5eSA9IDB4NTQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXl6ID0gMHg5NDsKICBzdGF0aWMgY29uc3QgaW50IHh5eXcgPSAweEQ0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl6eCA9IDB4MjQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXp5ID0gMHg2NDsKICBzdGF0aWMgY29uc3QgaW50IHh5enogPSAweEE0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl6dyA9IDB4RTQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXd4ID0gMHgzNDsKICBzdGF0aWMgY29uc3QgaW50IHh5d3kgPSAweDc0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl3eiA9IDB4QjQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXd3ID0gMHhGNDsKICBzdGF0aWMgY29uc3QgaW50IHh6eHggPSAweDg7CiAgc3RhdGljIGNvbnN0IGludCB4enh5ID0gMHg0ODsKICBzdGF0aWMgY29uc3QgaW50IHh6eHogPSAweDg4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp4dyA9IDB4Qzg7CiAgc3RhdGljIGNvbnN0IGludCB4enl4ID0gMHgxODsKICBzdGF0aWMgY29uc3QgaW50IHh6eXkgPSAweDU4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp5eiA9IDB4OTg7CiAgc3RhdGljIGNvbnN0IGludCB4enl3ID0gMHhEODsKICBzdGF0aWMgY29uc3QgaW50IHh6enggPSAweDI4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp6eSA9IDB4Njg7CiAgc3RhdGljIGNvbnN0IGludCB4enp6ID0gMHhBODsKICBzdGF0aWMgY29uc3QgaW50IHh6encgPSAweEU4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp3eCA9IDB4Mzg7CiAgc3RhdGljIGNvbnN0IGludCB4end5ID0gMHg3ODsKICBzdGF0aWMgY29uc3QgaW50IHh6d3ogPSAweEI4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp3dyA9IDB4Rjg7CiAgc3RhdGljIGNvbnN0IGludCB4d3h4ID0gMHhDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd4eSA9IDB4NEM7CiAgc3RhdGljIGNvbnN0IGludCB4d3h6ID0gMHg4QzsKICBzdGF0aWMgY29uc3QgaW50IHh3eHcgPSAweENDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd5eCA9IDB4MUM7CiAgc3RhdGljIGNvbnN0IGludCB4d3l5ID0gMHg1QzsKICBzdGF0aWMgY29uc3QgaW50IHh3eXogPSAweDlDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd5dyA9IDB4REM7CiAgc3RhdGljIGNvbnN0IGludCB4d3p4ID0gMHgyQzsKICBzdGF0aWMgY29uc3QgaW50IHh3enkgPSAweDZDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd6eiA9IDB4QUM7CiAgc3RhdGljIGNvbnN0IGludCB4d3p3ID0gMHhFQzsKICBzdGF0aWMgY29uc3QgaW50IHh3d3ggPSAweDNDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd3eSA9IDB4N0M7CiAgc3RhdGljIGNvbnN0IGludCB4d3d6ID0gMHhCQzsKICBzdGF0aWMgY29uc3QgaW50IHh3d3cgPSAweEZDOwogIHN0YXRpYyBjb25zdCBpbnQgeXh4eCA9IDB4MTsKICBzdGF0aWMgY29uc3QgaW50IHl4eHkgPSAweDQxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh4eiA9IDB4ODE7CiAgc3RhdGljIGNvbnN0IGludCB5eHh3ID0gMHhDMTsKICBzdGF0aWMgY29uc3QgaW50IHl4eXggPSAweDExOwogIHN0YXRpYyBjb25zdCBpbnQgeXh5eSA9IDB4NTE7CiAgc3RhdGljIGNvbnN0IGludCB5eHl6ID0gMHg5MTsKICBzdGF0aWMgY29uc3QgaW50IHl4eXcgPSAweEQxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh6eCA9IDB4MjE7CiAgc3RhdGljIGNvbnN0IGludCB5eHp5ID0gMHg2MTsKICBzdGF0aWMgY29uc3QgaW50IHl4enogPSAweEExOwogIHN0YXRpYyBjb25zdCBpbnQgeXh6dyA9IDB4RTE7CiAgc3RhdGljIGNvbnN0IGludCB5eHd4ID0gMHgzMTsKICBzdGF0aWMgY29uc3QgaW50IHl4d3kgPSAweDcxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh3eiA9IDB4QjE7CiAgc3RhdGljIGNvbnN0IGludCB5eHd3ID0gMHhGMTsKICBzdGF0aWMgY29uc3QgaW50IHl5eHggPSAweDU7CiAgc3RhdGljIGNvbnN0IGludCB5eXh5ID0gMHg0NTsKICBzdGF0aWMgY29uc3QgaW50IHl5eHogPSAweDg1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl4dyA9IDB4QzU7CiAgc3RhdGljIGNvbnN0IGludCB5eXl4ID0gMHgxNTsKICBzdGF0aWMgY29uc3QgaW50IHl5eXkgPSAweDU1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl5eiA9IDB4OTU7CiAgc3RhdGljIGNvbnN0IGludCB5eXl3ID0gMHhENTsKICBzdGF0aWMgY29uc3QgaW50IHl5enggPSAweDI1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl6eSA9IDB4NjU7CiAgc3RhdGljIGNvbnN0IGludCB5eXp6ID0gMHhBNTsKICBzdGF0aWMgY29uc3QgaW50IHl5encgPSAweEU1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl3eCA9IDB4MzU7CiAgc3RhdGljIGNvbnN0IGludCB5eXd5ID0gMHg3NTsKICBzdGF0aWMgY29uc3QgaW50IHl5d3ogPSAweEI1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl3dyA9IDB4RjU7CiAgc3RhdGljIGNvbnN0IGludCB5enh4ID0gMHg5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp4eSA9IDB4NDk7CiAgc3RhdGljIGNvbnN0IGludCB5enh6ID0gMHg4OTsKICBzdGF0aWMgY29uc3QgaW50IHl6eHcgPSAweEM5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp5eCA9IDB4MTk7CiAgc3RhdGljIGNvbnN0IGludCB5enl5ID0gMHg1OTsKICBzdGF0aWMgY29uc3QgaW50IHl6eXogPSAweDk5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp5dyA9IDB4RDk7CiAgc3RhdGljIGNvbnN0IGludCB5enp4ID0gMHgyOTsKICBzdGF0aWMgY29uc3QgaW50IHl6enkgPSAweDY5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp6eiA9IDB4QTk7CiAgc3RhdGljIGNvbnN0IGludCB5enp3ID0gMHhFOTsKICBzdGF0aWMgY29uc3QgaW50IHl6d3ggPSAweDM5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp3eSA9IDB4Nzk7CiAgc3RhdGljIGNvbnN0IGludCB5end6ID0gMHhCOTsKICBzdGF0aWMgY29uc3QgaW50IHl6d3cgPSAweEY5OwogIHN0YXRpYyBjb25zdCBpbnQgeXd4eCA9IDB4RDsKICBzdGF0aWMgY29uc3QgaW50IHl3eHkgPSAweDREOwogIHN0YXRpYyBjb25zdCBpbnQgeXd4eiA9IDB4OEQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3h3ID0gMHhDRDsKICBzdGF0aWMgY29uc3QgaW50IHl3eXggPSAweDFEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd5eSA9IDB4NUQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3l6ID0gMHg5RDsKICBzdGF0aWMgY29uc3QgaW50IHl3eXcgPSAweEREOwogIHN0YXRpYyBjb25zdCBpbnQgeXd6eCA9IDB4MkQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3p5ID0gMHg2RDsKICBzdGF0aWMgY29uc3QgaW50IHl3enogPSAweEFEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd6dyA9IDB4RUQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3d4ID0gMHgzRDsKICBzdGF0aWMgY29uc3QgaW50IHl3d3kgPSAweDdEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd3eiA9IDB4QkQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3d3ID0gMHhGRDsKICBzdGF0aWMgY29uc3QgaW50IHp4eHggPSAweDI7CiAgc3RhdGljIGNvbnN0IGludCB6eHh5ID0gMHg0MjsKICBzdGF0aWMgY29uc3QgaW50IHp4eHogPSAweDgyOwogIHN0YXRpYyBjb25zdCBpbnQgenh4dyA9IDB4QzI7CiAgc3RhdGljIGNvbnN0IGludCB6eHl4ID0gMHgxMjsKICBzdGF0aWMgY29uc3QgaW50IHp4eXkgPSAweDUyOwogIHN0YXRpYyBjb25zdCBpbnQgenh5eiA9IDB4OTI7CiAgc3RhdGljIGNvbnN0IGludCB6eHl3ID0gMHhEMjsKICBzdGF0aWMgY29uc3QgaW50IHp4enggPSAweDIyOwogIHN0YXRpYyBjb25zdCBpbnQgenh6eSA9IDB4NjI7CiAgc3RhdGljIGNvbnN0IGludCB6eHp6ID0gMHhBMjsKICBzdGF0aWMgY29uc3QgaW50IHp4encgPSAweEUyOwogIHN0YXRpYyBjb25zdCBpbnQgenh3eCA9IDB4MzI7CiAgc3RhdGljIGNvbnN0IGludCB6eHd5ID0gMHg3MjsKICBzdGF0aWMgY29uc3QgaW50IHp4d3ogPSAweEIyOwogIHN0YXRpYyBjb25zdCBpbnQgenh3dyA9IDB4RjI7CiAgc3RhdGljIGNvbnN0IGludCB6eXh4ID0gMHg2OwogIHN0YXRpYyBjb25zdCBpbnQgenl4eSA9IDB4NDY7CiAgc3RhdGljIGNvbnN0IGludCB6eXh6ID0gMHg4NjsKICBzdGF0aWMgY29uc3QgaW50IHp5eHcgPSAweEM2OwogIHN0YXRpYyBjb25zdCBpbnQgenl5eCA9IDB4MTY7CiAgc3RhdGljIGNvbnN0IGludCB6eXl5ID0gMHg1NjsKICBzdGF0aWMgY29uc3QgaW50IHp5eXogPSAweDk2OwogIHN0YXRpYyBjb25zdCBpbnQgenl5dyA9IDB4RDY7CiAgc3RhdGljIGNvbnN0IGludCB6eXp4ID0gMHgyNjsKICBzdGF0aWMgY29uc3QgaW50IHp5enkgPSAweDY2OwogIHN0YXRpYyBjb25zdCBpbnQgenl6eiA9IDB4QTY7CiAgc3RhdGljIGNvbnN0IGludCB6eXp3ID0gMHhFNjsKICBzdGF0aWMgY29uc3QgaW50IHp5d3ggPSAweDM2OwogIHN0YXRpYyBjb25zdCBpbnQgenl3eSA9IDB4NzY7CiAgc3RhdGljIGNvbnN0IGludCB6eXd6ID0gMHhCNjsKICBzdGF0aWMgY29uc3QgaW50IHp5d3cgPSAweEY2OwogIHN0YXRpYyBjb25zdCBpbnQgenp4eCA9IDB4QTsKICBzdGF0aWMgY29uc3QgaW50IHp6eHkgPSAweDRBOwogIHN0YXRpYyBjb25zdCBpbnQgenp4eiA9IDB4OEE7CiAgc3RhdGljIGNvbnN0IGludCB6enh3ID0gMHhDQTsKICBzdGF0aWMgY29uc3QgaW50IHp6eXggPSAweDFBOwogIHN0YXRpYyBjb25zdCBpbnQgenp5eSA9IDB4NUE7CiAgc3RhdGljIGNvbnN0IGludCB6enl6ID0gMHg5QTsKICBzdGF0aWMgY29uc3QgaW50IHp6eXcgPSAweERBOwogIHN0YXRpYyBjb25zdCBpbnQgenp6eCA9IDB4MkE7CiAgc3RhdGljIGNvbnN0IGludCB6enp5ID0gMHg2QTsKICBzdGF0aWMgY29uc3QgaW50IHp6enogPSAweEFBOwogIHN0YXRpYyBjb25zdCBpbnQgenp6dyA9IDB4RUE7CiAgc3RhdGljIGNvbnN0IGludCB6end4ID0gMHgzQTsKICBzdGF0aWMgY29uc3QgaW50IHp6d3kgPSAweDdBOwogIHN0YXRpYyBjb25zdCBpbnQgenp3eiA9IDB4QkE7CiAgc3RhdGljIGNvbnN0IGludCB6end3ID0gMHhGQTsKICBzdGF0aWMgY29uc3QgaW50IHp3eHggPSAweEU7CiAgc3RhdGljIGNvbnN0IGludCB6d3h5ID0gMHg0RTsKICBzdGF0aWMgY29uc3QgaW50IHp3eHogPSAweDhFOwogIHN0YXRpYyBjb25zdCBpbnQgend4dyA9IDB4Q0U7CiAgc3RhdGljIGNvbnN0IGludCB6d3l4ID0gMHgxRTsKICBzdGF0aWMgY29uc3QgaW50IHp3eXkgPSAweDVFOwogIHN0YXRpYyBjb25zdCBpbnQgend5eiA9IDB4OUU7CiAgc3RhdGljIGNvbnN0IGludCB6d3l3ID0gMHhERTsKICBzdGF0aWMgY29uc3QgaW50IHp3enggPSAweDJFOwogIHN0YXRpYyBjb25zdCBpbnQgend6eSA9IDB4NkU7CiAgc3RhdGljIGNvbnN0IGludCB6d3p6ID0gMHhBRTsKICBzdGF0aWMgY29uc3QgaW50IHp3encgPSAweEVFOwogIHN0YXRpYyBjb25zdCBpbnQgend3eCA9IDB4M0U7CiAgc3RhdGljIGNvbnN0IGludCB6d3d5ID0gMHg3RTsKICBzdGF0aWMgY29uc3QgaW50IHp3d3ogPSAweEJFOwogIHN0YXRpYyBjb25zdCBpbnQgend3dyA9IDB4RkU7CiAgc3RhdGljIGNvbnN0IGludCB3eHh4ID0gMHgzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h4eSA9IDB4NDM7CiAgc3RhdGljIGNvbnN0IGludCB3eHh6ID0gMHg4MzsKICBzdGF0aWMgY29uc3QgaW50IHd4eHcgPSAweEMzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h5eCA9IDB4MTM7CiAgc3RhdGljIGNvbnN0IGludCB3eHl5ID0gMHg1MzsKICBzdGF0aWMgY29uc3QgaW50IHd4eXogPSAweDkzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h5dyA9IDB4RDM7CiAgc3RhdGljIGNvbnN0IGludCB3eHp4ID0gMHgyMzsKICBzdGF0aWMgY29uc3QgaW50IHd4enkgPSAweDYzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h6eiA9IDB4QTM7CiAgc3RhdGljIGNvbnN0IGludCB3eHp3ID0gMHhFMzsKICBzdGF0aWMgY29uc3QgaW50IHd4d3ggPSAweDMzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h3eSA9IDB4NzM7CiAgc3RhdGljIGNvbnN0IGludCB3eHd6ID0gMHhCMzsKICBzdGF0aWMgY29uc3QgaW50IHd4d3cgPSAweEYzOwogIHN0YXRpYyBjb25zdCBpbnQgd3l4eCA9IDB4NzsKICBzdGF0aWMgY29uc3QgaW50IHd5eHkgPSAweDQ3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l4eiA9IDB4ODc7CiAgc3RhdGljIGNvbnN0IGludCB3eXh3ID0gMHhDNzsKICBzdGF0aWMgY29uc3QgaW50IHd5eXggPSAweDE3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l5eSA9IDB4NTc7CiAgc3RhdGljIGNvbnN0IGludCB3eXl6ID0gMHg5NzsKICBzdGF0aWMgY29uc3QgaW50IHd5eXcgPSAweEQ3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l6eCA9IDB4Mjc7CiAgc3RhdGljIGNvbnN0IGludCB3eXp5ID0gMHg2NzsKICBzdGF0aWMgY29uc3QgaW50IHd5enogPSAweEE3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l6dyA9IDB4RTc7CiAgc3RhdGljIGNvbnN0IGludCB3eXd4ID0gMHgzNzsKICBzdGF0aWMgY29uc3QgaW50IHd5d3kgPSAweDc3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l3eiA9IDB4Qjc7CiAgc3RhdGljIGNvbnN0IGludCB3eXd3ID0gMHhGNzsKICBzdGF0aWMgY29uc3QgaW50IHd6eHggPSAweEI7CiAgc3RhdGljIGNvbnN0IGludCB3enh5ID0gMHg0QjsKICBzdGF0aWMgY29uc3QgaW50IHd6eHogPSAweDhCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p4dyA9IDB4Q0I7CiAgc3RhdGljIGNvbnN0IGludCB3enl4ID0gMHgxQjsKICBzdGF0aWMgY29uc3QgaW50IHd6eXkgPSAweDVCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p5eiA9IDB4OUI7CiAgc3RhdGljIGNvbnN0IGludCB3enl3ID0gMHhEQjsKICBzdGF0aWMgY29uc3QgaW50IHd6enggPSAweDJCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p6eSA9IDB4NkI7CiAgc3RhdGljIGNvbnN0IGludCB3enp6ID0gMHhBQjsKICBzdGF0aWMgY29uc3QgaW50IHd6encgPSAweEVCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p3eCA9IDB4M0I7CiAgc3RhdGljIGNvbnN0IGludCB3end5ID0gMHg3QjsKICBzdGF0aWMgY29uc3QgaW50IHd6d3ogPSAweEJCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p3dyA9IDB4RkI7CiAgc3RhdGljIGNvbnN0IGludCB3d3h4ID0gMHhGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d4eSA9IDB4NEY7CiAgc3RhdGljIGNvbnN0IGludCB3d3h6ID0gMHg4RjsKICBzdGF0aWMgY29uc3QgaW50IHd3eHcgPSAweENGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d5eCA9IDB4MUY7CiAgc3RhdGljIGNvbnN0IGludCB3d3l5ID0gMHg1RjsKICBzdGF0aWMgY29uc3QgaW50IHd3eXogPSAweDlGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d5dyA9IDB4REY7CiAgc3RhdGljIGNvbnN0IGludCB3d3p4ID0gMHgyRjsKICBzdGF0aWMgY29uc3QgaW50IHd3enkgPSAweDZGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d6eiA9IDB4QUY7CiAgc3RhdGljIGNvbnN0IGludCB3d3p3ID0gMHhFRjsKICBzdGF0aWMgY29uc3QgaW50IHd3d3ggPSAweDNGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d3eSA9IDB4N0Y7CiAgc3RhdGljIGNvbnN0IGludCB3d3d6ID0gMHhCRjsKICBzdGF0aWMgY29uc3QgaW50IHd3d3cgPSAweEZGOwoKICAvLy8gU2h1ZmZsZSB0aGUgbGFuZSB2YWx1ZXMuIFttYXNrXSBtdXN0IGJlIG9uZSBvZiB0aGUgMjU2IHNodWZmbGUgY29uc3RhbnRzLgogIEZsb2F0MzJ4NCBzaHVmZmxlKGludCBtYXNrKTsKCiAgLy8vIFNodWZmbGUgdGhlIGxhbmUgdmFsdWVzIGluIFt0aGlzXSBhbmQgW290aGVyXS4gVGhlIHJldHVybmVkCiAgLy8vIEZsb2F0MzJ4NCB3aWxsIGhhdmUgWFkgbGFuZXMgZnJvbSBbdGhpc10gYW5kIFpXIGxhbmVzIGZyb20gW290aGVyXS4KICAvLy8gVXNlcyB0aGUgc2FtZSBbbWFza10gYXMgW3NodWZmbGVdLgogIEZsb2F0MzJ4NCBzaHVmZmxlTWl4KEZsb2F0MzJ4NCBvdGhlciwgaW50IG1hc2spOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbRmxvYXQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB4IHZhbHVlLgogIEZsb2F0MzJ4NCB3aXRoWChkb3VibGUgeCk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IFtGbG9hdDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHkgdmFsdWUuCiAgRmxvYXQzMng0IHdpdGhZKGRvdWJsZSB5KTsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0Zsb2F0MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeiB2YWx1ZS4KICBGbG9hdDMyeDQgd2l0aFooZG91YmxlIHopOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbRmxvYXQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB3IHZhbHVlLgogIEZsb2F0MzJ4NCB3aXRoVyhkb3VibGUgdyk7CgogIC8vLyBSZXR1cm5zIHRoZSBsYW5lLXdpc2UgbWluaW11bSB2YWx1ZSBpbiBbdGhpc10gb3IgW290aGVyXS4KICBGbG9hdDMyeDQgbWluKEZsb2F0MzJ4NCBvdGhlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBsYW5lLXdpc2UgbWF4aW11bSB2YWx1ZSBpbiBbdGhpc10gb3IgW290aGVyXS4KICBGbG9hdDMyeDQgbWF4KEZsb2F0MzJ4NCBvdGhlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiBbdGhpc10uCiAgRmxvYXQzMng0IHNxcnQoKTsKCiAgLy8vIFJldHVybnMgdGhlIHJlY2lwcm9jYWwgb2YgW3RoaXNdLgogIEZsb2F0MzJ4NCByZWNpcHJvY2FsKCk7CgogIC8vLyBSZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgcmVjaXByb2NhbCBvZiBbdGhpc10uCiAgRmxvYXQzMng0IHJlY2lwcm9jYWxTcXJ0KCk7Cn0KCi8qKgogKiBJbnQzMng0IGFuZCBvcGVyYXRpb25zLgogKgogKiBJbnQzMng0IHN0b3JlcyA0IDMyLWJpdCBiaXQtbWFza3MgaW4gImxhbmVzIi4KICogVGhlIGxhbmVzIGFyZSAieCIsICJ5IiwgInoiLCBhbmQgInciIHJlc3BlY3RpdmVseS4KICovCmFic3RyYWN0IGNsYXNzIEludDMyeDQgewogIGV4dGVybmFsIGZhY3RvcnkgSW50MzJ4NChpbnQgeCwgaW50IHksIGludCB6LCBpbnQgdyk7CiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQzMng0LmJvb2woYm9vbCB4LCBib29sIHksIGJvb2wgeiwgYm9vbCB3KTsKICBleHRlcm5hbCBmYWN0b3J5IEludDMyeDQuZnJvbUZsb2F0MzJ4NEJpdHMoRmxvYXQzMng0IHgpOwoKICAvLy8gVGhlIGJpdC13aXNlIG9yIG9wZXJhdG9yLgogIEludDMyeDQgb3BlcmF0b3IgfChJbnQzMng0IG90aGVyKTsKCiAgLy8vIFRoZSBiaXQtd2lzZSBhbmQgb3BlcmF0b3IuCiAgSW50MzJ4NCBvcGVyYXRvciAmKEludDMyeDQgb3RoZXIpOwoKICAvLy8gVGhlIGJpdC13aXNlIHhvciBvcGVyYXRvci4KICBJbnQzMng0IG9wZXJhdG9yIF4oSW50MzJ4NCBvdGhlcik7CgogIC8vLyBBZGRpdGlvbiBvcGVyYXRvci4KICBJbnQzMng0IG9wZXJhdG9yICsoSW50MzJ4NCBvdGhlcik7CgogIC8vLyBTdWJ0cmFjdGlvbiBvcGVyYXRvci4KICBJbnQzMng0IG9wZXJhdG9yIC0oSW50MzJ4NCBvdGhlcik7CgogIC8vLyBFeHRyYWN0IDMyLWJpdCBtYXNrIGZyb20geCBsYW5lLgogIGludCBnZXQgeDsKCiAgLy8vIEV4dHJhY3QgMzItYml0IG1hc2sgZnJvbSB5IGxhbmUuCiAgaW50IGdldCB5OwoKICAvLy8gRXh0cmFjdCAzMi1iaXQgbWFzayBmcm9tIHogbGFuZS4KICBpbnQgZ2V0IHo7CgogIC8vLyBFeHRyYWN0IDMyLWJpdCBtYXNrIGZyb20gdyBsYW5lLgogIGludCBnZXQgdzsKCiAgLy8vIEV4dHJhY3QgdGhlIHRvcCBiaXQgZnJvbSBlYWNoIGxhbmUgcmV0dXJuIHRoZW0gaW4gdGhlIGZpcnN0IDQgYml0cy4KICAvLy8gIngiIGxhbmUgaXMgYml0IDAuCiAgLy8vICJ5IiBsYW5lIGlzIGJpdCAxLgogIC8vLyAieiIgbGFuZSBpcyBiaXQgMi4KICAvLy8gInciIGxhbmUgaXMgYml0IDMuCiAgaW50IGdldCBzaWduTWFzazsKCiAgLy8vIE1hc2sgcGFzc2VkIHRvIFtzaHVmZmxlXSBvciBbc2h1ZmZsZU1peF0uCiAgc3RhdGljIGNvbnN0IGludCB4eHh4ID0gMHgwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh4eSA9IDB4NDA7CiAgc3RhdGljIGNvbnN0IGludCB4eHh6ID0gMHg4MDsKICBzdGF0aWMgY29uc3QgaW50IHh4eHcgPSAweEMwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh5eCA9IDB4MTA7CiAgc3RhdGljIGNvbnN0IGludCB4eHl5ID0gMHg1MDsKICBzdGF0aWMgY29uc3QgaW50IHh4eXogPSAweDkwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh5dyA9IDB4RDA7CiAgc3RhdGljIGNvbnN0IGludCB4eHp4ID0gMHgyMDsKICBzdGF0aWMgY29uc3QgaW50IHh4enkgPSAweDYwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh6eiA9IDB4QTA7CiAgc3RhdGljIGNvbnN0IGludCB4eHp3ID0gMHhFMDsKICBzdGF0aWMgY29uc3QgaW50IHh4d3ggPSAweDMwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh3eSA9IDB4NzA7CiAgc3RhdGljIGNvbnN0IGludCB4eHd6ID0gMHhCMDsKICBzdGF0aWMgY29uc3QgaW50IHh4d3cgPSAweEYwOwogIHN0YXRpYyBjb25zdCBpbnQgeHl4eCA9IDB4NDsKICBzdGF0aWMgY29uc3QgaW50IHh5eHkgPSAweDQ0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl4eiA9IDB4ODQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXh3ID0gMHhDNDsKICBzdGF0aWMgY29uc3QgaW50IHh5eXggPSAweDE0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl5eSA9IDB4NTQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXl6ID0gMHg5NDsKICBzdGF0aWMgY29uc3QgaW50IHh5eXcgPSAweEQ0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl6eCA9IDB4MjQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXp5ID0gMHg2NDsKICBzdGF0aWMgY29uc3QgaW50IHh5enogPSAweEE0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl6dyA9IDB4RTQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXd4ID0gMHgzNDsKICBzdGF0aWMgY29uc3QgaW50IHh5d3kgPSAweDc0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl3eiA9IDB4QjQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXd3ID0gMHhGNDsKICBzdGF0aWMgY29uc3QgaW50IHh6eHggPSAweDg7CiAgc3RhdGljIGNvbnN0IGludCB4enh5ID0gMHg0ODsKICBzdGF0aWMgY29uc3QgaW50IHh6eHogPSAweDg4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp4dyA9IDB4Qzg7CiAgc3RhdGljIGNvbnN0IGludCB4enl4ID0gMHgxODsKICBzdGF0aWMgY29uc3QgaW50IHh6eXkgPSAweDU4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp5eiA9IDB4OTg7CiAgc3RhdGljIGNvbnN0IGludCB4enl3ID0gMHhEODsKICBzdGF0aWMgY29uc3QgaW50IHh6enggPSAweDI4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp6eSA9IDB4Njg7CiAgc3RhdGljIGNvbnN0IGludCB4enp6ID0gMHhBODsKICBzdGF0aWMgY29uc3QgaW50IHh6encgPSAweEU4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp3eCA9IDB4Mzg7CiAgc3RhdGljIGNvbnN0IGludCB4end5ID0gMHg3ODsKICBzdGF0aWMgY29uc3QgaW50IHh6d3ogPSAweEI4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp3dyA9IDB4Rjg7CiAgc3RhdGljIGNvbnN0IGludCB4d3h4ID0gMHhDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd4eSA9IDB4NEM7CiAgc3RhdGljIGNvbnN0IGludCB4d3h6ID0gMHg4QzsKICBzdGF0aWMgY29uc3QgaW50IHh3eHcgPSAweENDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd5eCA9IDB4MUM7CiAgc3RhdGljIGNvbnN0IGludCB4d3l5ID0gMHg1QzsKICBzdGF0aWMgY29uc3QgaW50IHh3eXogPSAweDlDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd5dyA9IDB4REM7CiAgc3RhdGljIGNvbnN0IGludCB4d3p4ID0gMHgyQzsKICBzdGF0aWMgY29uc3QgaW50IHh3enkgPSAweDZDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd6eiA9IDB4QUM7CiAgc3RhdGljIGNvbnN0IGludCB4d3p3ID0gMHhFQzsKICBzdGF0aWMgY29uc3QgaW50IHh3d3ggPSAweDNDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd3eSA9IDB4N0M7CiAgc3RhdGljIGNvbnN0IGludCB4d3d6ID0gMHhCQzsKICBzdGF0aWMgY29uc3QgaW50IHh3d3cgPSAweEZDOwogIHN0YXRpYyBjb25zdCBpbnQgeXh4eCA9IDB4MTsKICBzdGF0aWMgY29uc3QgaW50IHl4eHkgPSAweDQxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh4eiA9IDB4ODE7CiAgc3RhdGljIGNvbnN0IGludCB5eHh3ID0gMHhDMTsKICBzdGF0aWMgY29uc3QgaW50IHl4eXggPSAweDExOwogIHN0YXRpYyBjb25zdCBpbnQgeXh5eSA9IDB4NTE7CiAgc3RhdGljIGNvbnN0IGludCB5eHl6ID0gMHg5MTsKICBzdGF0aWMgY29uc3QgaW50IHl4eXcgPSAweEQxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh6eCA9IDB4MjE7CiAgc3RhdGljIGNvbnN0IGludCB5eHp5ID0gMHg2MTsKICBzdGF0aWMgY29uc3QgaW50IHl4enogPSAweEExOwogIHN0YXRpYyBjb25zdCBpbnQgeXh6dyA9IDB4RTE7CiAgc3RhdGljIGNvbnN0IGludCB5eHd4ID0gMHgzMTsKICBzdGF0aWMgY29uc3QgaW50IHl4d3kgPSAweDcxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh3eiA9IDB4QjE7CiAgc3RhdGljIGNvbnN0IGludCB5eHd3ID0gMHhGMTsKICBzdGF0aWMgY29uc3QgaW50IHl5eHggPSAweDU7CiAgc3RhdGljIGNvbnN0IGludCB5eXh5ID0gMHg0NTsKICBzdGF0aWMgY29uc3QgaW50IHl5eHogPSAweDg1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl4dyA9IDB4QzU7CiAgc3RhdGljIGNvbnN0IGludCB5eXl4ID0gMHgxNTsKICBzdGF0aWMgY29uc3QgaW50IHl5eXkgPSAweDU1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl5eiA9IDB4OTU7CiAgc3RhdGljIGNvbnN0IGludCB5eXl3ID0gMHhENTsKICBzdGF0aWMgY29uc3QgaW50IHl5enggPSAweDI1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl6eSA9IDB4NjU7CiAgc3RhdGljIGNvbnN0IGludCB5eXp6ID0gMHhBNTsKICBzdGF0aWMgY29uc3QgaW50IHl5encgPSAweEU1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl3eCA9IDB4MzU7CiAgc3RhdGljIGNvbnN0IGludCB5eXd5ID0gMHg3NTsKICBzdGF0aWMgY29uc3QgaW50IHl5d3ogPSAweEI1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl3dyA9IDB4RjU7CiAgc3RhdGljIGNvbnN0IGludCB5enh4ID0gMHg5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp4eSA9IDB4NDk7CiAgc3RhdGljIGNvbnN0IGludCB5enh6ID0gMHg4OTsKICBzdGF0aWMgY29uc3QgaW50IHl6eHcgPSAweEM5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp5eCA9IDB4MTk7CiAgc3RhdGljIGNvbnN0IGludCB5enl5ID0gMHg1OTsKICBzdGF0aWMgY29uc3QgaW50IHl6eXogPSAweDk5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp5dyA9IDB4RDk7CiAgc3RhdGljIGNvbnN0IGludCB5enp4ID0gMHgyOTsKICBzdGF0aWMgY29uc3QgaW50IHl6enkgPSAweDY5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp6eiA9IDB4QTk7CiAgc3RhdGljIGNvbnN0IGludCB5enp3ID0gMHhFOTsKICBzdGF0aWMgY29uc3QgaW50IHl6d3ggPSAweDM5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp3eSA9IDB4Nzk7CiAgc3RhdGljIGNvbnN0IGludCB5end6ID0gMHhCOTsKICBzdGF0aWMgY29uc3QgaW50IHl6d3cgPSAweEY5OwogIHN0YXRpYyBjb25zdCBpbnQgeXd4eCA9IDB4RDsKICBzdGF0aWMgY29uc3QgaW50IHl3eHkgPSAweDREOwogIHN0YXRpYyBjb25zdCBpbnQgeXd4eiA9IDB4OEQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3h3ID0gMHhDRDsKICBzdGF0aWMgY29uc3QgaW50IHl3eXggPSAweDFEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd5eSA9IDB4NUQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3l6ID0gMHg5RDsKICBzdGF0aWMgY29uc3QgaW50IHl3eXcgPSAweEREOwogIHN0YXRpYyBjb25zdCBpbnQgeXd6eCA9IDB4MkQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3p5ID0gMHg2RDsKICBzdGF0aWMgY29uc3QgaW50IHl3enogPSAweEFEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd6dyA9IDB4RUQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3d4ID0gMHgzRDsKICBzdGF0aWMgY29uc3QgaW50IHl3d3kgPSAweDdEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd3eiA9IDB4QkQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3d3ID0gMHhGRDsKICBzdGF0aWMgY29uc3QgaW50IHp4eHggPSAweDI7CiAgc3RhdGljIGNvbnN0IGludCB6eHh5ID0gMHg0MjsKICBzdGF0aWMgY29uc3QgaW50IHp4eHogPSAweDgyOwogIHN0YXRpYyBjb25zdCBpbnQgenh4dyA9IDB4QzI7CiAgc3RhdGljIGNvbnN0IGludCB6eHl4ID0gMHgxMjsKICBzdGF0aWMgY29uc3QgaW50IHp4eXkgPSAweDUyOwogIHN0YXRpYyBjb25zdCBpbnQgenh5eiA9IDB4OTI7CiAgc3RhdGljIGNvbnN0IGludCB6eHl3ID0gMHhEMjsKICBzdGF0aWMgY29uc3QgaW50IHp4enggPSAweDIyOwogIHN0YXRpYyBjb25zdCBpbnQgenh6eSA9IDB4NjI7CiAgc3RhdGljIGNvbnN0IGludCB6eHp6ID0gMHhBMjsKICBzdGF0aWMgY29uc3QgaW50IHp4encgPSAweEUyOwogIHN0YXRpYyBjb25zdCBpbnQgenh3eCA9IDB4MzI7CiAgc3RhdGljIGNvbnN0IGludCB6eHd5ID0gMHg3MjsKICBzdGF0aWMgY29uc3QgaW50IHp4d3ogPSAweEIyOwogIHN0YXRpYyBjb25zdCBpbnQgenh3dyA9IDB4RjI7CiAgc3RhdGljIGNvbnN0IGludCB6eXh4ID0gMHg2OwogIHN0YXRpYyBjb25zdCBpbnQgenl4eSA9IDB4NDY7CiAgc3RhdGljIGNvbnN0IGludCB6eXh6ID0gMHg4NjsKICBzdGF0aWMgY29uc3QgaW50IHp5eHcgPSAweEM2OwogIHN0YXRpYyBjb25zdCBpbnQgenl5eCA9IDB4MTY7CiAgc3RhdGljIGNvbnN0IGludCB6eXl5ID0gMHg1NjsKICBzdGF0aWMgY29uc3QgaW50IHp5eXogPSAweDk2OwogIHN0YXRpYyBjb25zdCBpbnQgenl5dyA9IDB4RDY7CiAgc3RhdGljIGNvbnN0IGludCB6eXp4ID0gMHgyNjsKICBzdGF0aWMgY29uc3QgaW50IHp5enkgPSAweDY2OwogIHN0YXRpYyBjb25zdCBpbnQgenl6eiA9IDB4QTY7CiAgc3RhdGljIGNvbnN0IGludCB6eXp3ID0gMHhFNjsKICBzdGF0aWMgY29uc3QgaW50IHp5d3ggPSAweDM2OwogIHN0YXRpYyBjb25zdCBpbnQgenl3eSA9IDB4NzY7CiAgc3RhdGljIGNvbnN0IGludCB6eXd6ID0gMHhCNjsKICBzdGF0aWMgY29uc3QgaW50IHp5d3cgPSAweEY2OwogIHN0YXRpYyBjb25zdCBpbnQgenp4eCA9IDB4QTsKICBzdGF0aWMgY29uc3QgaW50IHp6eHkgPSAweDRBOwogIHN0YXRpYyBjb25zdCBpbnQgenp4eiA9IDB4OEE7CiAgc3RhdGljIGNvbnN0IGludCB6enh3ID0gMHhDQTsKICBzdGF0aWMgY29uc3QgaW50IHp6eXggPSAweDFBOwogIHN0YXRpYyBjb25zdCBpbnQgenp5eSA9IDB4NUE7CiAgc3RhdGljIGNvbnN0IGludCB6enl6ID0gMHg5QTsKICBzdGF0aWMgY29uc3QgaW50IHp6eXcgPSAweERBOwogIHN0YXRpYyBjb25zdCBpbnQgenp6eCA9IDB4MkE7CiAgc3RhdGljIGNvbnN0IGludCB6enp5ID0gMHg2QTsKICBzdGF0aWMgY29uc3QgaW50IHp6enogPSAweEFBOwogIHN0YXRpYyBjb25zdCBpbnQgenp6dyA9IDB4RUE7CiAgc3RhdGljIGNvbnN0IGludCB6end4ID0gMHgzQTsKICBzdGF0aWMgY29uc3QgaW50IHp6d3kgPSAweDdBOwogIHN0YXRpYyBjb25zdCBpbnQgenp3eiA9IDB4QkE7CiAgc3RhdGljIGNvbnN0IGludCB6end3ID0gMHhGQTsKICBzdGF0aWMgY29uc3QgaW50IHp3eHggPSAweEU7CiAgc3RhdGljIGNvbnN0IGludCB6d3h5ID0gMHg0RTsKICBzdGF0aWMgY29uc3QgaW50IHp3eHogPSAweDhFOwogIHN0YXRpYyBjb25zdCBpbnQgend4dyA9IDB4Q0U7CiAgc3RhdGljIGNvbnN0IGludCB6d3l4ID0gMHgxRTsKICBzdGF0aWMgY29uc3QgaW50IHp3eXkgPSAweDVFOwogIHN0YXRpYyBjb25zdCBpbnQgend5eiA9IDB4OUU7CiAgc3RhdGljIGNvbnN0IGludCB6d3l3ID0gMHhERTsKICBzdGF0aWMgY29uc3QgaW50IHp3enggPSAweDJFOwogIHN0YXRpYyBjb25zdCBpbnQgend6eSA9IDB4NkU7CiAgc3RhdGljIGNvbnN0IGludCB6d3p6ID0gMHhBRTsKICBzdGF0aWMgY29uc3QgaW50IHp3encgPSAweEVFOwogIHN0YXRpYyBjb25zdCBpbnQgend3eCA9IDB4M0U7CiAgc3RhdGljIGNvbnN0IGludCB6d3d5ID0gMHg3RTsKICBzdGF0aWMgY29uc3QgaW50IHp3d3ogPSAweEJFOwogIHN0YXRpYyBjb25zdCBpbnQgend3dyA9IDB4RkU7CiAgc3RhdGljIGNvbnN0IGludCB3eHh4ID0gMHgzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h4eSA9IDB4NDM7CiAgc3RhdGljIGNvbnN0IGludCB3eHh6ID0gMHg4MzsKICBzdGF0aWMgY29uc3QgaW50IHd4eHcgPSAweEMzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h5eCA9IDB4MTM7CiAgc3RhdGljIGNvbnN0IGludCB3eHl5ID0gMHg1MzsKICBzdGF0aWMgY29uc3QgaW50IHd4eXogPSAweDkzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h5dyA9IDB4RDM7CiAgc3RhdGljIGNvbnN0IGludCB3eHp4ID0gMHgyMzsKICBzdGF0aWMgY29uc3QgaW50IHd4enkgPSAweDYzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h6eiA9IDB4QTM7CiAgc3RhdGljIGNvbnN0IGludCB3eHp3ID0gMHhFMzsKICBzdGF0aWMgY29uc3QgaW50IHd4d3ggPSAweDMzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h3eSA9IDB4NzM7CiAgc3RhdGljIGNvbnN0IGludCB3eHd6ID0gMHhCMzsKICBzdGF0aWMgY29uc3QgaW50IHd4d3cgPSAweEYzOwogIHN0YXRpYyBjb25zdCBpbnQgd3l4eCA9IDB4NzsKICBzdGF0aWMgY29uc3QgaW50IHd5eHkgPSAweDQ3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l4eiA9IDB4ODc7CiAgc3RhdGljIGNvbnN0IGludCB3eXh3ID0gMHhDNzsKICBzdGF0aWMgY29uc3QgaW50IHd5eXggPSAweDE3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l5eSA9IDB4NTc7CiAgc3RhdGljIGNvbnN0IGludCB3eXl6ID0gMHg5NzsKICBzdGF0aWMgY29uc3QgaW50IHd5eXcgPSAweEQ3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l6eCA9IDB4Mjc7CiAgc3RhdGljIGNvbnN0IGludCB3eXp5ID0gMHg2NzsKICBzdGF0aWMgY29uc3QgaW50IHd5enogPSAweEE3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l6dyA9IDB4RTc7CiAgc3RhdGljIGNvbnN0IGludCB3eXd4ID0gMHgzNzsKICBzdGF0aWMgY29uc3QgaW50IHd5d3kgPSAweDc3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l3eiA9IDB4Qjc7CiAgc3RhdGljIGNvbnN0IGludCB3eXd3ID0gMHhGNzsKICBzdGF0aWMgY29uc3QgaW50IHd6eHggPSAweEI7CiAgc3RhdGljIGNvbnN0IGludCB3enh5ID0gMHg0QjsKICBzdGF0aWMgY29uc3QgaW50IHd6eHogPSAweDhCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p4dyA9IDB4Q0I7CiAgc3RhdGljIGNvbnN0IGludCB3enl4ID0gMHgxQjsKICBzdGF0aWMgY29uc3QgaW50IHd6eXkgPSAweDVCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p5eiA9IDB4OUI7CiAgc3RhdGljIGNvbnN0IGludCB3enl3ID0gMHhEQjsKICBzdGF0aWMgY29uc3QgaW50IHd6enggPSAweDJCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p6eSA9IDB4NkI7CiAgc3RhdGljIGNvbnN0IGludCB3enp6ID0gMHhBQjsKICBzdGF0aWMgY29uc3QgaW50IHd6encgPSAweEVCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p3eCA9IDB4M0I7CiAgc3RhdGljIGNvbnN0IGludCB3end5ID0gMHg3QjsKICBzdGF0aWMgY29uc3QgaW50IHd6d3ogPSAweEJCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p3dyA9IDB4RkI7CiAgc3RhdGljIGNvbnN0IGludCB3d3h4ID0gMHhGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d4eSA9IDB4NEY7CiAgc3RhdGljIGNvbnN0IGludCB3d3h6ID0gMHg4RjsKICBzdGF0aWMgY29uc3QgaW50IHd3eHcgPSAweENGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d5eCA9IDB4MUY7CiAgc3RhdGljIGNvbnN0IGludCB3d3l5ID0gMHg1RjsKICBzdGF0aWMgY29uc3QgaW50IHd3eXogPSAweDlGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d5dyA9IDB4REY7CiAgc3RhdGljIGNvbnN0IGludCB3d3p4ID0gMHgyRjsKICBzdGF0aWMgY29uc3QgaW50IHd3enkgPSAweDZGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d6eiA9IDB4QUY7CiAgc3RhdGljIGNvbnN0IGludCB3d3p3ID0gMHhFRjsKICBzdGF0aWMgY29uc3QgaW50IHd3d3ggPSAweDNGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d3eSA9IDB4N0Y7CiAgc3RhdGljIGNvbnN0IGludCB3d3d6ID0gMHhCRjsKICBzdGF0aWMgY29uc3QgaW50IHd3d3cgPSAweEZGOwoKICAvLy8gU2h1ZmZsZSB0aGUgbGFuZSB2YWx1ZXMuIFttYXNrXSBtdXN0IGJlIG9uZSBvZiB0aGUgMjU2IHNodWZmbGUgY29uc3RhbnRzLgogIEludDMyeDQgc2h1ZmZsZShpbnQgbWFzayk7CgogIC8vLyBTaHVmZmxlIHRoZSBsYW5lIHZhbHVlcyBpbiBbdGhpc10gYW5kIFtvdGhlcl0uIFRoZSByZXR1cm5lZAogIC8vLyBJbnQzMng0IHdpbGwgaGF2ZSBYWSBsYW5lcyBmcm9tIFt0aGlzXSBhbmQgWlcgbGFuZXMgZnJvbSBbb3RoZXJdLgogIC8vLyBVc2VzIHRoZSBzYW1lIFttYXNrXSBhcyBbc2h1ZmZsZV0uCiAgSW50MzJ4NCBzaHVmZmxlTWl4KEludDMyeDQgb3RoZXIsIGludCBtYXNrKTsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHggdmFsdWUuCiAgSW50MzJ4NCB3aXRoWChpbnQgeCk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IFtJbnQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB5IHZhbHVlLgogIEludDMyeDQgd2l0aFkoaW50IHkpOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeiB2YWx1ZS4KICBJbnQzMng0IHdpdGhaKGludCB6KTsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHcgdmFsdWUuCiAgSW50MzJ4NCB3aXRoVyhpbnQgdyk7CgogIC8vLyBFeHRyYWN0ZWQgeCB2YWx1ZS4gUmV0dXJucyBmYWxzZSBmb3IgMCwgdHJ1ZSBmb3IgYW55IG90aGVyIHZhbHVlLgogIGJvb2wgZ2V0IGZsYWdYOwoKICAvLy8gRXh0cmFjdGVkIHkgdmFsdWUuIFJldHVybnMgZmFsc2UgZm9yIDAsIHRydWUgZm9yIGFueSBvdGhlciB2YWx1ZS4KICBib29sIGdldCBmbGFnWTsKCiAgLy8vIEV4dHJhY3RlZCB6IHZhbHVlLiBSZXR1cm5zIGZhbHNlIGZvciAwLCB0cnVlIGZvciBhbnkgb3RoZXIgdmFsdWUuCiAgYm9vbCBnZXQgZmxhZ1o7CgogIC8vLyBFeHRyYWN0ZWQgdyB2YWx1ZS4gUmV0dXJucyBmYWxzZSBmb3IgMCwgdHJ1ZSBmb3IgYW55IG90aGVyIHZhbHVlLgogIGJvb2wgZ2V0IGZsYWdXOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeCB2YWx1ZS4KICBJbnQzMng0IHdpdGhGbGFnWChib29sIHgpOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeSB2YWx1ZS4KICBJbnQzMng0IHdpdGhGbGFnWShib29sIHkpOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeiB2YWx1ZS4KICBJbnQzMng0IHdpdGhGbGFnWihib29sIHopOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgdyB2YWx1ZS4KICBJbnQzMng0IHdpdGhGbGFnVyhib29sIHcpOwoKICAvLy8gTWVyZ2UgW3RydWVWYWx1ZV0gYW5kIFtmYWxzZVZhbHVlXSBiYXNlZCBvbiBbdGhpc10nIGJpdCBtYXNrOgogIC8vLyBTZWxlY3QgYml0IGZyb20gW3RydWVWYWx1ZV0gd2hlbiBiaXQgaW4gW3RoaXNdIGlzIG9uLgogIC8vLyBTZWxlY3QgYml0IGZyb20gW2ZhbHNlVmFsdWVdIHdoZW4gYml0IGluIFt0aGlzXSBpcyBvZmYuCiAgRmxvYXQzMng0IHNlbGVjdChGbG9hdDMyeDQgdHJ1ZVZhbHVlLCBGbG9hdDMyeDQgZmFsc2VWYWx1ZSk7Cn0KCi8qKgogKiBGbG9hdDY0eDIgaW1tdXRhYmxlIHZhbHVlIHR5cGUgYW5kIG9wZXJhdGlvbnMuCiAqCiAqIEZsb2F0NjR4MiBzdG9yZXMgMiA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGluICJsYW5lcyIuCiAqIFRoZSBsYW5lcyBhcmUgIngiIGFuZCAieSIgcmVzcGVjdGl2ZWx5LgogKi8KYWJzdHJhY3QgY2xhc3MgRmxvYXQ2NHgyIHsKICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0NjR4Mihkb3VibGUgeCwgZG91YmxlIHkpOwogIGV4dGVybmFsIGZhY3RvcnkgRmxvYXQ2NHgyLnNwbGF0KGRvdWJsZSB2KTsKICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0NjR4Mi56ZXJvKCk7CgogIC8vLyBVc2VzIHRoZSAieCIgYW5kICJ5IiBsYW5lcyBmcm9tIFt2XS4KICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0NjR4Mi5mcm9tRmxvYXQzMng0KEZsb2F0MzJ4NCB2KTsKCiAgLy8vIEFkZGl0aW9uIG9wZXJhdG9yLgogIEZsb2F0NjR4MiBvcGVyYXRvciArKEZsb2F0NjR4MiBvdGhlcik7CgogIC8vLyBOZWdhdGUgb3BlcmF0b3IuCiAgRmxvYXQ2NHgyIG9wZXJhdG9yIC0oKTsKCiAgLy8vIFN1YnRyYWN0aW9uIG9wZXJhdG9yLgogIEZsb2F0NjR4MiBvcGVyYXRvciAtKEZsb2F0NjR4MiBvdGhlcik7CgogIC8vLyBNdWx0aXBsaWNhdGlvbiBvcGVyYXRvci4KICBGbG9hdDY0eDIgb3BlcmF0b3IgKihGbG9hdDY0eDIgb3RoZXIpOwoKICAvLy8gRGl2aXNpb24gb3BlcmF0b3IuCiAgRmxvYXQ2NHgyIG9wZXJhdG9yIC8oRmxvYXQ2NHgyIG90aGVyKTsKCiAgLy8vIFJldHVybnMgYSBjb3B5IG9mIFt0aGlzXSBlYWNoIGxhbmUgYmVpbmcgc2NhbGVkIGJ5IFtzXS4KICAvLy8gRXF1aXZhbGVudCB0byB0aGlzICogbmV3IEZsb2F0NjR4Mi5zcGxhdChzKQogIEZsb2F0NjR4MiBzY2FsZShkb3VibGUgcyk7CgogIC8vLyBSZXR1cm5zIHRoZSBsYW5lLXdpc2UgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBbRmxvYXQ2NHgyXS4KICBGbG9hdDY0eDIgYWJzKCk7CgogIC8vLyBMYW5lLXdpc2UgY2xhbXAgW3RoaXNdIHRvIGJlIGluIHRoZSByYW5nZSBbbG93ZXJMaW1pdF0tW3VwcGVyTGltaXRdLgogIEZsb2F0NjR4MiBjbGFtcChGbG9hdDY0eDIgbG93ZXJMaW1pdCwgRmxvYXQ2NHgyIHVwcGVyTGltaXQpOwoKICAvLy8gRXh0cmFjdGVkIHgg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ICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIAFQHwFCSikzAUcdAUcdAUcdAUcdAUAiAUAiASkUASgaATseAgEEGwMxNgQZOEE7ASAlASElASElARklARwlAScNAScNAScNAScNAUoZGRkZFAEwHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIB8gICAgICAgICAgICAgICAfICAgICAgICAgICAgICAgHyAgICAgICAgICAgICAgIAFQHQFCSCkvAUUYAUUYAUUYAUUYAUgSAUgSAUgSAUgSAUUdAUUdAUUdAUUdAUQ8Pj8CAQQyAz8rBBsyLiUBKzkBGSkBFxoBHCkBHykBGSkBPjIdAUATAUs/ARkQARkQAUwZGRQBRx0BRx0BQCIBQCIBMxQCAQ9kYXJ0OnR5cGVkX2RhdGE1b3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi90eXBlZF9kYXRhX3BhdGNoLmRhcnTAAhg3Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBOb3RlOiB0aGUgVk0gY29uY2F0ZW5hdGVzIGFsbCBwYXRjaCBmaWxlcyBpbnRvIGEgc2luZ2xlIHBhdGNoIGZpbGUuIFRoaXMKLy8vIGZpbGUgaXMgdGhlIGZpcnN0IHBhdGNoIGluICJkYXJ0OnR5cGVkX2RhdGEiIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW1wb3J0cwovLy8gdXNlZCBieSBwYXRjaGVzIG9mIHRoYXQgbGlicmFyeS4gV2UgcGxhbiB0byBjaGFuZ2UgdGhpcyB3aGVuIHdlIGhhdmUgYQovLy8gc2hhcmVkIGZyb250IGVuZCBhbmQgc2ltcGx5IHVzZSBwYXJ0cy4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiCiAgICBzaG93CiAgICAgICAgQ2xhc3NJRCwKICAgICAgICBDb2RlVW5pdHMsCiAgICAgICAgRXhwYW5kSXRlcmFibGUsCiAgICAgICAgRm9sbG93ZWRCeUl0ZXJhYmxlLAogICAgICAgIEl0ZXJhYmxlRWxlbWVudEVycm9yLAogICAgICAgIExpc3RNYXBWaWV3LAogICAgICAgIExpc3RzLAogICAgICAgIE1hcHBlZEl0ZXJhYmxlLAogICAgICAgIE1hcHBlZEl0ZXJhYmxlLAogICAgICAgIFJldmVyc2VkTGlzdEl0ZXJhYmxlLAogICAgICAgIFNraXBXaGlsZUl0ZXJhYmxlLAogICAgICAgIFNvcnQsCiAgICAgICAgU3ViTGlzdEl0ZXJhYmxlLAogICAgICAgIFRha2VXaGlsZUl0ZXJhYmxlLAogICAgICAgIFdoZXJlSXRlcmFibGUsCiAgICAgICAgV2hlcmVUeXBlSXRlcmFibGUsCiAgICAgICAgcGF0Y2g7CgppbXBvcnQgImRhcnQ6Y29sbGVjdGlvbiIgc2hvdyBMaXN0QmFzZTsKCmltcG9ydCAnZGFydDptYXRoJyBzaG93IFJhbmRvbTsKCi8vLyBUaGVyZSBhcmUgbm8gcGFydHMgaW4gcGF0Y2ggbGlicmFyeToKCkBwYXRjaApjbGFzcyBCeXRlRGF0YSBpbXBsZW1lbnRzIFR5cGVkRGF0YSB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGZhY3RvcnkgQnl0ZURhdGEoaW50IGxlbmd0aCkgewogICAgZmluYWwgbGlzdCA9IG5ldyBVaW50OExpc3QobGVuZ3RoKSBhcyBfVHlwZWRMaXN0OwogICAgX3JhbmdlQ2hlY2sobGlzdC5sZW5ndGhJbkJ5dGVzLCAwLCBsZW5ndGgpOwogICAgcmV0dXJuIG5ldyBfQnl0ZURhdGFWaWV3Ll8obGlzdCwgMCwgbGVuZ3RoKTsKICB9CgogIC8vIENhbGxlZCBkaXJlY3RseSBmcm9tIEMgY29kZS4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZmFjdG9yeSBCeXRlRGF0YS5fdmlldyhfVHlwZWRMaXN0IHR5cGVkRGF0YSwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpIHsKICAgIF9yYW5nZUNoZWNrKHR5cGVkRGF0YS5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogICAgcmV0dXJuIG5ldyBfQnl0ZURhdGFWaWV3Ll8odHlwZWREYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KfQoKLy8gQmFzZWQgY2xhc3MgZm9yIF9UeXBlZExpc3QgdGhhdCBwcm92aWRlcyBjb21tb24gbWV0aG9kcyBmb3IgaW1wbGVtZW50aW5nCi8vIHRoZSBjb2xsZWN0aW9uIGFuZCBsaXN0IGludGVyZmFjZXMuCi8vIFRoaXMgY2xhc3MgZG9lcyBub3QgZXh0ZW5kIExpc3RCYXNlPFQ+IHNpbmNlIHRoYXQgd291bGQgYWRkIHR5cGUgYXJndW1lbnRzCi8vIHRvIGluc3RhbmNlcyBvZiBfVHlwZUxpc3RCYXNlLiBJbnN0ZWFkIHRoZSBzdWJjbGFzc2VzIHVzZSB0eXBlIHNwZWNpZmljCi8vIG1peGlucyAobGlrZSBfSW50TGlzdE1peGluLCBfRG91YmxlTGlzdE1peGluKSB0byBpbXBsZW1lbnQgTGlzdEJhc2U8VD4uCmFic3RyYWN0IGNsYXNzIF9UeXBlZExpc3RCYXNlIHsKICBpbnQgZ2V0IGxlbmd0aDsKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlczsKICBpbnQgZ2V0IG9mZnNldEluQnl0ZXM7CiAgX0J5dGVCdWZmZXIgZ2V0IGJ1ZmZlcjsKCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgQ29sbGVjdGlvbiBpbnRlcmZhY2UuCiAgU3RyaW5nIGpvaW4oW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBidWZmZXIud3JpdGVBbGwodGhpcyBhcyBJdGVyYWJsZSwgc2VwYXJhdG9yKTsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgewogICAgcmV0dXJuIHRoaXMubGVuZ3RoID09IDA7CiAgfQoKICBib29sIGdldCBpc05vdEVtcHR5ID0+ICFpc0VtcHR5OwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KCiAgc2V0IGxlbmd0aChuZXdMZW5ndGgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVzaXplIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIGJvb2wgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmVtb3ZlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmVwbGFjZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGUgaXRlcmFibGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBPYmplY3QgaW50ZXJmYWNlLgogIFN0cmluZyB0b1N0cmluZygpID0+IExpc3RCYXNlLmxpc3RUb1N0cmluZyh0aGlzIGFzIExpc3QpOwoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCgogIC8vIFJldHVybnMgdHJ1ZSBpZiBvcGVyYXRpb24gc3VjY2VlZHMuCiAgLy8gJ2Zyb21DaWQnIGFuZCAndG9DaWQnIG1heSBiZSBjaWQtcyBvZiB0aGUgdmlld3MgYW5kIHRoZXJlZm9yZSBtYXkgbm90CiAgLy8gbWF0Y2ggdGhlIGNpZHMgb2YgJ3RoaXMnIGFuZCAnZnJvbScuCiAgLy8gVXNlcyB0b0NpZCBhbmQgZnJvbUNpZCB0byBkZWNpZGUgaWYgY2xhbXBpbmcgaXMgbmVjZXNzYXJ5LgogIC8vIEVsZW1lbnQgc2l6ZSBvZiB0b0NpZCBhbmQgZnJvbUNpZCBtdXN0IG1hdGNoICh0ZXN0IGF0IGNhbGxlcikuCiAgYm9vbCBfc2V0UmFuZ2UoaW50IHN0YXJ0SW5CeXRlcywgaW50IGxlbmd0aEluQnl0ZXMsIF9UeXBlZExpc3RCYXNlIGZyb20sCiAgICAgIGludCBzdGFydEZyb21JbkJ5dGVzLCBpbnQgdG9DaWQsIGludCBmcm9tQ2lkKSBuYXRpdmUgIlR5cGVkRGF0YV9zZXRSYW5nZSI7Cn0KCm1peGluIF9JbnRMaXN0TWl4aW4gaW1wbGVtZW50cyBMaXN0PGludD4gewogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzOwogIGludCBnZXQgb2Zmc2V0SW5CeXRlczsKICBfQnl0ZUJ1ZmZlciBnZXQgYnVmZmVyOwoKICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBuZXcgV2hlcmVUeXBlSXRlcmFibGU8VD4odGhpcyk7CgogIEl0ZXJhYmxlPGludD4gZm9sbG93ZWRCeShJdGVyYWJsZTxpbnQ+IG90aGVyKSA9PgogICAgICBuZXcgRm9sbG93ZWRCeUl0ZXJhYmxlPGludD4uZmlyc3RFZmZpY2llbnQodGhpcywgb3RoZXIpOwoKICBMaXN0PFI+IGNhc3Q8Uj4oKSA9PiBMaXN0LmNhc3RGcm9tPGludCwgUj4odGhpcyk7CiAgdm9pZCBzZXQgZmlyc3QoaW50IHZhbHVlKSB7CiAgICBpZiAodGhpcy5sZW5ndGggPT0gMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoMCwgdGhpcyk7CiAgICB0aGlzWzBdID0gdmFsdWU7CiAgfQoKICB2b2lkIHNldCBsYXN0KGludCB2YWx1ZSkgewogICAgaWYgKHRoaXMubGVuZ3RoID09IDApIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1t0aGlzLmxlbmd0aCAtIDFdID0gdmFsdWU7CiAgfQoKICBpbnQgaW5kZXhXaGVyZShib29sIHRlc3QoaW50IGVsZW1lbnQpLCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMDsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGludCBsYXN0SW5kZXhXaGVyZShib29sIHRlc3QoaW50IGVsZW1lbnQpLCBbaW50IHN0YXJ0XSkgewogICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkgewogICAgICBpZiAodGVzdCh0aGlzW2ldKSkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBMaXN0PGludD4gb3BlcmF0b3IgKyhMaXN0PGludD4gb3RoZXIpIHsKICAgIGludCB0b3RhbExlbmd0aCA9IHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoOwogICAgcmV0dXJuIDxpbnQ+W10KICAgICAgLi5sZW5ndGggPSB0b3RhbExlbmd0aAogICAgICAuLnNldFJhbmdlKDAsIHRoaXMubGVuZ3RoLCB0aGlzKQogICAgICAuLnNldFJhbmdlKHRoaXMubGVuZ3RoLCB0b3RhbExlbmd0aCwgb3RoZXIpOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgc2h1ZmZsZShbUmFuZG9tIHJhbmRvbV0pIHsKICAgIHJhbmRvbSA/Pz0gbmV3IFJhbmRvbSgpOwogICAgdmFyIGkgPSB0aGlzLmxlbmd0aDsKICAgIHdoaWxlIChpID4gMSkgewogICAgICBpbnQgcG9zID0gcmFuZG9tLm5leHRJbnQoaSk7CiAgICAgIGkgLT0gMTsKICAgICAgdmFyIHRtcCA9IHRoaXNbaV07CiAgICAgIHRoaXNbaV0gPSB0aGlzW3Bvc107CiAgICAgIHRoaXNbcG9zXSA9IHRtcDsKICAgIH0KICB9CgogIEl0ZXJhYmxlPGludD4gd2hlcmUoYm9vbCBmKGludCBlbGVtZW50KSkgPT4gbmV3IFdoZXJlSXRlcmFibGU8aW50Pih0aGlzLCBmKTsKCiAgSXRlcmFibGU8aW50PiB0YWtlKGludCBuKSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPGludD4odGhpcywgMCwgbik7CgogIEl0ZXJhYmxlPGludD4gdGFrZVdoaWxlKGJvb2wgdGVzdChpbnQgZWxlbWVudCkpID0+CiAgICAgIG5ldyBUYWtlV2hpbGVJdGVyYWJsZTxpbnQ+KHRoaXMsIHRlc3QpOwoKICBJdGVyYWJsZTxpbnQ+IHNraXAoaW50IG4pID0+IG5ldyBTdWJMaXN0SXRlcmFibGU8aW50Pih0aGlzLCBuLCBudWxsKTsKCiAgSXRlcmFibGU8aW50PiBza2lwV2hpbGUoYm9vbCB0ZXN0KGludCBlbGVtZW50KSkgPT4KICAgICAgbmV3IFNraXBXaGlsZUl0ZXJhYmxlPGludD4odGhpcywgdGVzdCk7CgogIEl0ZXJhYmxlPGludD4gZ2V0IHJldmVyc2VkID0+IG5ldyBSZXZlcnNlZExpc3RJdGVyYWJsZTxpbnQ+KHRoaXMpOwoKICBNYXA8aW50LCBpbnQ+IGFzTWFwKCkgPT4gbmV3IExpc3RNYXBWaWV3PGludD4odGhpcyk7CgogIEl0ZXJhYmxlPGludD4gZ2V0UmFuZ2UoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIHJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlPGludD4odGhpcywgc3RhcnQsIGVuZCk7CiAgfQoKICBJdGVyYXRvcjxpbnQ+IGdldCBpdGVyYXRvciA9PiBuZXcgX1R5cGVkTGlzdEl0ZXJhdG9yPGludD4odGhpcyk7CgogIExpc3Q8aW50PiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICByZXR1cm4gbmV3IExpc3Q8aW50Pi5mcm9tKHRoaXMsIGdyb3dhYmxlOiBncm93YWJsZSk7CiAgfQoKICBTZXQ8aW50PiB0b1NldCgpIHsKICAgIHJldHVybiBuZXcgU2V0PGludD4uZnJvbSh0aGlzKTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoaW50IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGYodGhpc1tpXSk7CiAgICB9CiAgfQoKICBpbnQgcmVkdWNlKGludCBjb21iaW5lKGludCB2YWx1ZSwgaW50IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBpZiAobGVuID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdmFyIHZhbHVlID0gdGhpc1swXTsKICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCB0aGlzW2ldKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgaW5pdGlhbFZhbHVlLCBpbnQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaW5pdGlhbFZhbHVlID0gY29tYmluZShpbml0aWFsVmFsdWUsIHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIGluaXRpYWxWYWx1ZTsKICB9CgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoaW50IGVsZW1lbnQpKSA9PiBuZXcgTWFwcGVkSXRlcmFibGU8aW50LCBUPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8VD4gZXhwYW5kPFQ+KEl0ZXJhYmxlPFQ+IGYoaW50IGVsZW1lbnQpKSA9PgogICAgICBuZXcgRXhwYW5kSXRlcmFibGU8aW50LCBUPih0aGlzLCBmKTsKCiAgYm9vbCBldmVyeShib29sIGYoaW50IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmICghZih0aGlzW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIGFueShib29sIGYoaW50IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmIChmKHRoaXNbaV0pKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGludCBmaXJzdFdoZXJlKGJvb2wgdGVzdChpbnQgZWxlbWVudCksIHtpbnQgb3JFbHNlKCl9KSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiBlbGVtZW50OwogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIGludCBsYXN0V2hlcmUoYm9vbCB0ZXN0KGludCBlbGVtZW50KSwge2ludCBvckVsc2UoKX0pIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkgewogICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIH0KICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBpbnQgc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KGludCBlbGVtZW50KSwge2ludCBvckVsc2UoKX0pIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICBpZiAoZm91bmRNYXRjaGluZykgewogICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSBlbGVtZW50OwogICAgICAgIGZvdW5kTWF0Y2hpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoZm91bmRNYXRjaGluZykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBpbnQgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgcmV0dXJuIHRoaXNbaW5kZXhdOwogIH0KCiAgdm9pZCBhZGQoaW50IHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxpbnQ+IHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydChpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBpbnNlcnQgaW50byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPGludD4gdmFsdWVzKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGluc2VydCBpbnRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgc29ydChbaW50IGNvbXBhcmUoaW50IGEsIGludCBiKV0pIHsKICAgIFNvcnQuc29ydCh0aGlzLCBjb21wYXJlID8/IENvbXBhcmFibGUuY29tcGFyZSk7CiAgfQoKICBpbnQgaW5kZXhPZihpbnQgZWxlbWVudCwgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHsKICAgICAgc3RhcnQgPSAwOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGludCBsYXN0SW5kZXhPZihpbnQgZWxlbWVudCwgW2ludCBzdGFydCA9IG51bGxdKSB7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgewogICAgICBzdGFydCA9IHRoaXMubGVuZ3RoIC0gMTsKICAgIH0gZWxzZSBpZiAoc3RhcnQgPCAwKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA+PSAwOyBpLS0pIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgcmVtb3ZlTGFzdCgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgaW50IHJlbW92ZUF0KGludCBpbmRleCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChpbnQgZWxlbWVudCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoaW50IGVsZW1lbnQpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIGludCBnZXQgZmlyc3QgewogICAgaWYgKGxlbmd0aCA+IDApIHJldHVybiB0aGlzWzBdOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBpbnQgZ2V0IGxhc3QgewogICAgaWYgKGxlbmd0aCA+IDApIHJldHVybiB0aGlzW2xlbmd0aCAtIDFdOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBpbnQgZ2V0IHNpbmdsZSB7CiAgICBpZiAobGVuZ3RoID09IDEpIHJldHVybiB0aGlzWzBdOwogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb01hbnkoKTsKICB9CgogIHZvaWQgc2V0QWxsKGludCBpbmRleCwgSXRlcmFibGU8aW50PiBpdGVyYWJsZSkgewogICAgZmluYWwgZW5kID0gaXRlcmFibGUubGVuZ3RoICsgaW5kZXg7CiAgICBzZXRSYW5nZShpbmRleCwgZW5kLCBpdGVyYWJsZSk7CiAgfQoKICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtpbnQgZmlsbFZhbHVlXSkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHsKICAgICAgdGhpc1tpXSA9IGZpbGxWYWx1ZTsKICAgIH0KICB9Cn0KCm1peGluIF9UeXBlZEludExpc3RNaXhpbjxTcGF3bmVkVHlwZSBleHRlbmRzIExpc3Q8aW50Pj4gb24gX0ludExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBMaXN0PGludD4gewogIFNwYXduZWRUeXBlIF9jcmVhdGVMaXN0KGludCBsZW5ndGgpOwoKICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8aW50PiBmcm9tLCBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICAvLyBDaGVjayByYW5nZXMuCiAgICBpZiAoMCA+IHN0YXJ0IHx8IHN0YXJ0ID4gZW5kIHx8IGVuZCA+IGxlbmd0aCkgewogICAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsZW5ndGgpOyAvLyBBbHdheXMgdGhyb3dzLgogICAgICBhc3NlcnQoZmFsc2UpOwogICAgfQogICAgaWYgKHNraXBDb3VudCA8IDApIHsKICAgICAgdGhyb3cgUmFuZ2VFcnJvci5yYW5nZShza2lwQ291bnQsIDAsIG51bGwsICJza2lwQ291bnQiKTsKICAgIH0KCiAgICBmaW5hbCBjb3VudCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKChmcm9tLmxlbmd0aCAtIHNraXBDb3VudCkgPCBjb3VudCkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29GZXcoKTsKICAgIH0KCiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuOwoKICAgIGlmIChmcm9tIGlzIF9UeXBlZExpc3RCYXNlKSB7CiAgICAgIC8vIE5vdGU6IF9UeXBlZExpc3RCYXNlIGlzIG5vdCByZWxhdGVkIHRvIEl0ZXJhYmxlPGludD4gc28gdGhlcmUgaXMKICAgICAgLy8gbm8gcHJvbW90aW9uIGhlcmUuCiAgICAgIGZpbmFsIGZyb21Bc1R5cGVkTGlzdCA9IGZyb20gYXMgX1R5cGVkTGlzdEJhc2U7CiAgICAgIGlmICh0aGlzLmVsZW1lbnRTaXplSW5CeXRlcyA9PSBmcm9tQXNUeXBlZExpc3QuZWxlbWVudFNpemVJbkJ5dGVzKSB7CiAgICAgICAgaWYgKChjb3VudCA8IDEwKSAmJiAoZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlciAhPSB0aGlzLmJ1ZmZlcikpIHsKICAgICAgICAgIExpc3RzLmNvcHkoZnJvbSBhcyBMaXN0PGludD4sIHNraXBDb3VudCwgdGhpcywgc3RhcnQsIGNvdW50KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYnVmZmVyLl9kYXRhLl9zZXRSYW5nZSgKICAgICAgICAgICAgc3RhcnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyB0aGlzLm9mZnNldEluQnl0ZXMsCiAgICAgICAgICAgIGNvdW50ICogZWxlbWVudFNpemVJbkJ5dGVzLAogICAgICAgICAgICBmcm9tQXNUeXBlZExpc3QuYnVmZmVyLl9kYXRhLAogICAgICAgICAgICBza2lwQ291bnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyBmcm9tQXNUeXBlZExpc3Qub2Zmc2V0SW5CeXRlcywKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRCh0aGlzKSwKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRChmcm9tKSkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlciA9PSB0aGlzLmJ1ZmZlcikgewogICAgICAgIC8vIERpZmZlcmVudCBlbGVtZW50IHNpemVzLCBidXQgc2FtZSBidWZmZXIgbWVhbnMgdGhhdCB3ZSBuZWVkCiAgICAgICAgLy8gYW4gaW50ZXJtZWRpYXRlIHN0cnVjdHVyZS4KICAgICAgICAvLyBUT0RPKHNyZGphbik6IE9wdGltaXplIHRvIHNraXAgY29weWluZyBpZiB0aGUgcmFuZ2UgZG9lcyBub3Qgb3ZlcmxhcC4KICAgICAgICBmaW5hbCBmcm9tQXNMaXN0ID0gZnJvbSBhcyBMaXN0PGludD47CiAgICAgICAgZmluYWwgdGVtcEJ1ZmZlciA9IF9jcmVhdGVMaXN0KGNvdW50KTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgIHRlbXBCdWZmZXJbaV0gPSBmcm9tQXNMaXN0W3NraXBDb3VudCArIGldOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgICAgdGhpc1tpXSA9IHRlbXBCdWZmZXJbaSAtIHN0YXJ0XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgTGlzdCBvdGhlckxpc3Q7CiAgICBpbnQgb3RoZXJTdGFydDsKICAgIGlmIChmcm9tIGlzIExpc3Q8aW50PikgewogICAgICBvdGhlckxpc3QgPSBmcm9tOwogICAgICBvdGhlclN0YXJ0ID0gc2tpcENvdW50OwogICAgfSBlbHNlIHsKICAgICAgb3RoZXJMaXN0ID0gZnJvbS5za2lwKHNraXBDb3VudCkudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIG90aGVyU3RhcnQgPSAwOwogICAgfQogICAgaWYgKG90aGVyU3RhcnQgKyBjb3VudCA+IG90aGVyTGlzdC5sZW5ndGgpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vRmV3KCk7CiAgICB9CiAgICBMaXN0cy5jb3B5KG90aGVyTGlzdCwgb3RoZXJTdGFydCwgdGhpcywgc3RhcnQsIGNvdW50KTsKICB9CgogIFNwYXduZWRUeXBlIHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIHZhciBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIFNwYXduZWRUeXBlIHJlc3VsdCA9IF9jcmVhdGVMaXN0KGxlbmd0aCk7CiAgICByZXN1bHQuc2V0UmFuZ2UoMCwgbGVuZ3RoLCB0aGlzLCBzdGFydCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKbWl4aW4gX0RvdWJsZUxpc3RNaXhpbiBpbXBsZW1lbnRzIExpc3Q8ZG91YmxlPiB7CiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXM7CiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzOwogIF9CeXRlQnVmZmVyIGdldCBidWZmZXI7CgogIEl0ZXJhYmxlPFQ+IHdoZXJlVHlwZTxUPigpID0+IG5ldyBXaGVyZVR5cGVJdGVyYWJsZTxUPih0aGlzKTsKCiAgSXRlcmFibGU8ZG91YmxlPiBmb2xsb3dlZEJ5KEl0ZXJhYmxlPGRvdWJsZT4gb3RoZXIpID0+CiAgICAgIG5ldyBGb2xsb3dlZEJ5SXRlcmFibGU8ZG91YmxlPi5maXJzdEVmZmljaWVudCh0aGlzLCBvdGhlcik7CgogIExpc3Q8Uj4gY2FzdDxSPigpID0+IExpc3QuY2FzdEZyb208ZG91YmxlLCBSPih0aGlzKTsKICB2b2lkIHNldCBmaXJzdChkb3VibGUgdmFsdWUpIHsKICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleCgwLCB0aGlzKTsKICAgIHRoaXNbMF0gPSB2YWx1ZTsKICB9CgogIHZvaWQgc2V0IGxhc3QoZG91YmxlIHZhbHVlKSB7CiAgICBpZiAodGhpcy5sZW5ndGggPT0gMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoMCwgdGhpcyk7CiAgICB0aGlzW3RoaXMubGVuZ3RoIC0gMV0gPSB2YWx1ZTsKICB9CgogIGludCBpbmRleFdoZXJlKGJvb2wgdGVzdChkb3VibGUgZWxlbWVudCksIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRlc3QodGhpc1tpXSkpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IGxhc3RJbmRleFdoZXJlKGJvb2wgdGVzdChkb3VibGUgZWxlbWVudCksIFtpbnQgc3RhcnRdKSB7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgc3RhcnQgPSB0aGlzLmxlbmd0aCAtIDE7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIExpc3Q8ZG91YmxlPiBvcGVyYXRvciArKExpc3Q8ZG91YmxlPiBvdGhlcikgewogICAgaW50IHRvdGFsTGVuZ3RoID0gdGhpcy5sZW5ndGggKyBvdGhlci5sZW5ndGg7CiAgICByZXR1cm4gPGRvdWJsZT5bXQogICAgICAuLmxlbmd0aCA9IHRvdGFsTGVuZ3RoCiAgICAgIC4uc2V0UmFuZ2UoMCwgdGhpcy5sZW5ndGgsIHRoaXMpCiAgICAgIC4uc2V0UmFuZ2UodGhpcy5sZW5ndGgsIHRvdGFsTGVuZ3RoLCBvdGhlcik7CiAgfQoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBzaHVmZmxlKFtSYW5kb20gcmFuZG9tXSkgewogICAgcmFuZG9tID8/PSBuZXcgUmFuZG9tKCk7CiAgICB2YXIgaSA9IHRoaXMubGVuZ3RoOwogICAgd2hpbGUgKGkgPiAxKSB7CiAgICAgIGludCBwb3MgPSByYW5kb20ubmV4dEludChpKTsKICAgICAgaSAtPSAxOwogICAgICB2YXIgdG1wID0gdGhpc1tpXTsKICAgICAgdGhpc1tpXSA9IHRoaXNbcG9zXTsKICAgICAgdGhpc1twb3NdID0gdG1wOwogICAgfQogIH0KCiAgSXRlcmFibGU8ZG91YmxlPiB3aGVyZShib29sIGYoZG91YmxlIGVsZW1lbnQpKSA9PgogICAgICBuZXcgV2hlcmVJdGVyYWJsZTxkb3VibGU+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxkb3VibGU+IHRha2UoaW50IG4pID0+IG5ldyBTdWJMaXN0SXRlcmFibGU8ZG91YmxlPih0aGlzLCAwLCBuKTsKCiAgSXRlcmFibGU8ZG91YmxlPiB0YWtlV2hpbGUoYm9vbCB0ZXN0KGRvdWJsZSBlbGVtZW50KSkgPT4KICAgICAgbmV3IFRha2VXaGlsZUl0ZXJhYmxlPGRvdWJsZT4odGhpcywgdGVzdCk7CgogIEl0ZXJhYmxlPGRvdWJsZT4gc2tpcChpbnQgbikgPT4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxkb3VibGU+KHRoaXMsIG4sIG51bGwpOwoKICBJdGVyYWJsZTxkb3VibGU+IHNraXBXaGlsZShib29sIHRlc3QoZG91YmxlIGVsZW1lbnQpKSA9PgogICAgICBuZXcgU2tpcFdoaWxlSXRlcmFibGU8ZG91YmxlPih0aGlzLCB0ZXN0KTsKCiAgSXRlcmFibGU8ZG91YmxlPiBnZXQgcmV2ZXJzZWQgPT4gbmV3IFJldmVyc2VkTGlzdEl0ZXJhYmxlPGRvdWJsZT4odGhpcyk7CgogIE1hcDxpbnQsIGRvdWJsZT4gYXNNYXAoKSA9PiBuZXcgTGlzdE1hcFZpZXc8ZG91YmxlPih0aGlzKTsKCiAgSXRlcmFibGU8ZG91YmxlPiBnZXRSYW5nZShpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGU8ZG91YmxlPih0aGlzLCBzdGFydCwgZW5kKTsKICB9CgogIEl0ZXJhdG9yPGRvdWJsZT4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBfVHlwZWRMaXN0SXRlcmF0b3I8ZG91YmxlPih0aGlzKTsKCiAgTGlzdDxkb3VibGU+IHRvTGlzdCh7Ym9vbCBncm93YWJsZTogdHJ1ZX0pIHsKICAgIHJldHVybiBuZXcgTGlzdDxkb3VibGU+LmZyb20odGhpcywgZ3Jvd2FibGU6IGdyb3dhYmxlKTsKICB9CgogIFNldDxkb3VibGU+IHRvU2V0KCkgewogICAgcmV0dXJuIG5ldyBTZXQ8ZG91YmxlPi5mcm9tKHRoaXMpOwogIH0KCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihkb3VibGUgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgZih0aGlzW2ldKTsKICAgIH0KICB9CgogIGRvdWJsZSByZWR1Y2UoZG91YmxlIGNvbWJpbmUoZG91YmxlIHZhbHVlLCBkb3VibGUgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGlmIChsZW4gPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB2YXIgdmFsdWUgPSB0aGlzWzBdOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47ICsraSkgewogICAgICB2YWx1ZSA9IGNvbWJpbmUodmFsdWUsIHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgVCBmb2xkPFQ+KFQgaW5pdGlhbFZhbHVlLCBUIGNvbWJpbmUoVCBpbml0aWFsVmFsdWUsIGRvdWJsZSBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpbml0aWFsVmFsdWUgPSBjb21iaW5lKGluaXRpYWxWYWx1ZSwgdGhpc1tpXSk7CiAgICB9CiAgICByZXR1cm4gaW5pdGlhbFZhbHVlOwogIH0KCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihkb3VibGUgZWxlbWVudCkpID0+CiAgICAgIG5ldyBNYXBwZWRJdGVyYWJsZTxkb3VibGUsIFQ+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihkb3VibGUgZWxlbWVudCkpID0+CiAgICAgIG5ldyBFeHBhbmRJdGVyYWJsZTxkb3VibGUsIFQ+KHRoaXMsIGYpOwoKICBib29sIGV2ZXJ5KGJvb2wgZihkb3VibGUgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKCFmKHRoaXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgYW55KGJvb2wgZihkb3VibGUgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKGYodGhpc1tpXSkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZG91YmxlIGZpcnN0V2hlcmUoYm9vbCB0ZXN0KGRvdWJsZSBlbGVtZW50KSwge2RvdWJsZSBvckVsc2UoKX0pIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgZG91YmxlIGxhc3RXaGVyZShib29sIHRlc3QoZG91YmxlIGVsZW1lbnQpLCB7ZG91YmxlIG9yRWxzZSgpfSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICByZXR1cm4gZWxlbWVudDsKICAgICAgfQogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIGRvdWJsZSBzaW5nbGVXaGVyZShib29sIHRlc3QoZG91YmxlIGVsZW1lbnQpLCB7ZG91YmxlIG9yRWxzZSgpfSkgewogICAgdmFyIHJlc3VsdCA9IG51bGw7CiAgICBib29sIGZvdW5kTWF0Y2hpbmcgPSBmYWxzZTsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIGlmIChmb3VuZE1hdGNoaW5nKSB7CiAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CiAgICAgICAgZm91bmRNYXRjaGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3VuZE1hdGNoaW5nKSByZXR1cm4gcmVzdWx0OwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIGRvdWJsZSBlbGVtZW50QXQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gdGhpc1tpbmRleF07CiAgfQoKICB2b2lkIGFkZChkb3VibGUgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPGRvdWJsZT4gdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGluc2VydCBpbnRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8ZG91YmxlPiB2YWx1ZXMpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgaW5zZXJ0IGludG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBzb3J0KFtpbnQgY29tcGFyZShkb3VibGUgYSwgZG91YmxlIGIpXSkgewogICAgU29ydC5zb3J0KHRoaXMsIGNvbXBhcmUgPz8gQ29tcGFyYWJsZS5jb21wYXJlKTsKICB9CgogIGludCBpbmRleE9mKGRvdWJsZSBlbGVtZW50LCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA+PSB0aGlzLmxlbmd0aCkgewogICAgICByZXR1cm4gLTE7CiAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICBzdGFydCA9IDA7CiAgICB9CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IGxhc3RJbmRleE9mKGRvdWJsZSBlbGVtZW50LCBbaW50IHN0YXJ0ID0gbnVsbF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB7CiAgICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGRvdWJsZSByZW1vdmVMYXN0KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICBkb3VibGUgcmVtb3ZlQXQoaW50IGluZGV4KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KGRvdWJsZSBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChkb3VibGUgZWxlbWVudCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgZG91YmxlIGdldCBmaXJzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbMF07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIGRvdWJsZSBnZXQgbGFzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbbGVuZ3RoIC0gMV07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIGRvdWJsZSBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPT0gMSkgcmV0dXJuIHRoaXNbMF07CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogIH0KCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxkb3VibGU+IGl0ZXJhYmxlKSB7CiAgICBmaW5hbCBlbmQgPSBpdGVyYWJsZS5sZW5ndGggKyBpbmRleDsKICAgIHNldFJhbmdlKGluZGV4LCBlbmQsIGl0ZXJhYmxlKTsKICB9CgogIHZvaWQgZmlsbFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgW2RvdWJsZSBmaWxsVmFsdWVdKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkgewogICAgICB0aGlzW2ldID0gZmlsbFZhbHVlOwogICAgfQogIH0KfQoKbWl4aW4gX1R5cGVkRG91YmxlTGlzdE1peGluPFNwYXduZWRUeXBlIGV4dGVuZHMgTGlzdDxkb3VibGU+PgogICAgb24gX0RvdWJsZUxpc3RNaXhpbiBpbXBsZW1lbnRzIExpc3Q8ZG91YmxlPiB7CiAgU3Bhd25lZFR5cGUgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCk7CgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxkb3VibGU+IGZyb20sCiAgICAgIFtpbnQgc2tpcENvdW50ID0gMF0pIHsKICAgIC8vIENoZWNrIHJhbmdlcy4KICAgIGlmICgwID4gc3RhcnQgfHwgc3RhcnQgPiBlbmQgfHwgZW5kID4gbGVuZ3RoKSB7CiAgICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGxlbmd0aCk7IC8vIEFsd2F5cyB0aHJvd3MuCiAgICAgIGFzc2VydChmYWxzZSk7CiAgICB9CiAgICBpZiAoc2tpcENvdW50IDwgMCkgewogICAgICB0aHJvdyBSYW5nZUVycm9yLnJhbmdlKHNraXBDb3VudCwgMCwgbnVsbCwgInNraXBDb3VudCIpOwogICAgfQoKICAgIGZpbmFsIGNvdW50ID0gZW5kIC0gc3RhcnQ7CiAgICBpZiAoKGZyb20ubGVuZ3RoIC0gc2tpcENvdW50KSA8IGNvdW50KSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb0ZldygpOwogICAgfQoKICAgIGlmIChjb3VudCA9PSAwKSByZXR1cm47CgogICAgaWYgKGZyb20gaXMgX1R5cGVkTGlzdEJhc2UpIHsKICAgICAgLy8gTm90ZTogX1R5cGVkTGlzdEJhc2UgaXMgbm90IHJlbGF0ZWQgdG8gSXRlcmFibGU8ZG91YmxlPiBzbyB0aGVyZSBpcwogICAgICAvLyBubyBwcm9tb3Rpb24gaGVyZS4KICAgICAgZmluYWwgZnJvbUFzVHlwZWRMaXN0ID0gZnJvbSBhcyBfVHlwZWRMaXN0QmFzZTsKICAgICAgaWYgKHRoaXMuZWxlbWVudFNpemVJbkJ5dGVzID09IGZyb21Bc1R5cGVkTGlzdC5lbGVtZW50U2l6ZUluQnl0ZXMpIHsKICAgICAgICBpZiAoKGNvdW50IDwgMTApICYmIChmcm9tQXNUeXBlZExpc3QuYnVmZmVyICE9IHRoaXMuYnVmZmVyKSkgewogICAgICAgICAgTGlzdHMuY29weShmcm9tIGFzIExpc3Q8ZG91YmxlPiwgc2tpcENvdW50LCB0aGlzLCBzdGFydCwgY291bnQpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5idWZmZXIuX2RhdGEuX3NldFJhbmdlKAogICAgICAgICAgICBzdGFydCAqIGVsZW1lbnRTaXplSW5CeXRlcyArIHRoaXMub2Zmc2V0SW5CeXRlcywKICAgICAgICAgICAgY291bnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMsCiAgICAgICAgICAgIGZyb21Bc1R5cGVkTGlzdC5idWZmZXIuX2RhdGEsCiAgICAgICAgICAgIHNraXBDb3VudCAqIGVsZW1lbnRTaXplSW5CeXRlcyArIGZyb21Bc1R5cGVkTGlzdC5vZmZzZXRJbkJ5dGVzLAogICAgICAgICAgICBDbGFzc0lELmdldElEKHRoaXMpLAogICAgICAgICAgICBDbGFzc0lELmdldElEKGZyb20pKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmcm9tQXNUeXBlZExpc3QuYnVmZmVyID09IHRoaXMuYnVmZmVyKSB7CiAgICAgICAgLy8gRGlmZmVyZW50IGVsZW1lbnQgc2l6ZXMsIGJ1dCBzYW1lIGJ1ZmZlciBtZWFucyB0aGF0IHdlIG5lZWQKICAgICAgICAvLyBhbiBpbnRlcm1lZGlhdGUgc3RydWN0dXJlLgogICAgICAgIC8vIFRPRE8oc3JkamFuKTogT3B0aW1pemUgdG8gc2tpcCBjb3B5aW5nIGlmIHRoZSByYW5nZSBkb2VzIG5vdCBvdmVybGFwLgogICAgICAgIGZpbmFsIGZyb21Bc0xpc3QgPSBmcm9tIGFzIExpc3Q8ZG91YmxlPjsKICAgICAgICBmaW5hbCB0ZW1wQnVmZmVyID0gX2NyZWF0ZUxpc3QoY291bnQpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgdGVtcEJ1ZmZlcltpXSA9IGZyb21Bc0xpc3Rbc2tpcENvdW50ICsgaV07CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgICB0aGlzW2ldID0gdGVtcEJ1ZmZlcltpIC0gc3RhcnRdOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBMaXN0IG90aGVyTGlzdDsKICAgIGludCBvdGhlclN0YXJ0OwogICAgaWYgKGZyb20gaXMgTGlzdDxkb3VibGU+KSB7CiAgICAgIG90aGVyTGlzdCA9IGZyb207CiAgICAgIG90aGVyU3RhcnQgPSBza2lwQ291bnQ7CiAgICB9IGVsc2UgewogICAgICBvdGhlckxpc3QgPSBmcm9tLnNraXAoc2tpcENvdW50KS50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgb3RoZXJTdGFydCA9IDA7CiAgICB9CiAgICBpZiAob3RoZXJTdGFydCArIGNvdW50ID4gb3RoZXJMaXN0Lmxlbmd0aCkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29GZXcoKTsKICAgIH0KICAgIExpc3RzLmNvcHkob3RoZXJMaXN0LCBvdGhlclN0YXJ0LCB0aGlzLCBzdGFydCwgY291bnQpOwogIH0KCiAgU3Bhd25lZFR5cGUgc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgdmFyIGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgU3Bhd25lZFR5cGUgcmVzdWx0ID0gX2NyZWF0ZUxpc3QobGVuZ3RoKTsKICAgIHJlc3VsdC5zZXRSYW5nZSgwLCBsZW5ndGgsIHRoaXMsIHN0YXJ0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfRmxvYXQzMng0TGlzdE1peGluIGltcGxlbWVudHMgTGlzdDxGbG9hdDMyeDQ+IHsKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlczsKICBpbnQgZ2V0IG9mZnNldEluQnl0ZXM7CiAgX0J5dGVCdWZmZXIgZ2V0IGJ1ZmZlcjsKCiAgRmxvYXQzMng0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKTsKCiAgSXRlcmFibGU8VD4gd2hlcmVUeXBlPFQ+KCkgPT4gbmV3IFdoZXJlVHlwZUl0ZXJhYmxlPFQ+KHRoaXMpOwoKICBJdGVyYWJsZTxGbG9hdDMyeDQ+IGZvbGxvd2VkQnkoSXRlcmFibGU8RmxvYXQzMng0PiBvdGhlcikgPT4KICAgICAgbmV3IEZvbGxvd2VkQnlJdGVyYWJsZTxGbG9hdDMyeDQ+LmZpcnN0RWZmaWNpZW50KHRoaXMsIG90aGVyKTsKCiAgTGlzdDxSPiBjYXN0PFI+KCkgPT4gTGlzdC5jYXN0RnJvbTxGbG9hdDMyeDQsIFI+KHRoaXMpOwogIHZvaWQgc2V0IGZpcnN0KEZsb2F0MzJ4NCB2YWx1ZSkgewogICAgaWYgKHRoaXMubGVuZ3RoID09IDApIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1swXSA9IHZhbHVlOwogIH0KCiAgdm9pZCBzZXQgbGFzdChGbG9hdDMyeDQgdmFsdWUpIHsKICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleCgwLCB0aGlzKTsKICAgIHRoaXNbdGhpcy5sZW5ndGggLSAxXSA9IHZhbHVlOwogIH0KCiAgaW50IGluZGV4V2hlcmUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSwgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDA7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAodGVzdCh0aGlzW2ldKSkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgbGFzdEluZGV4V2hlcmUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSwgW2ludCBzdGFydF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSBzdGFydCA9IHRoaXMubGVuZ3RoIC0gMTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA+PSAwOyBpLS0pIHsKICAgICAgaWYgKHRlc3QodGhpc1tpXSkpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgTGlzdDxGbG9hdDMyeDQ+IG9wZXJhdG9yICsoTGlzdDxGbG9hdDMyeDQ+IG90aGVyKSB7CiAgICBpbnQgdG90YWxMZW5ndGggPSB0aGlzLmxlbmd0aCArIG90aGVyLmxlbmd0aDsKICAgIHJldHVybiA8RmxvYXQzMng0PltdCiAgICAgIC4ubGVuZ3RoID0gdG90YWxMZW5ndGgKICAgICAgLi5zZXRSYW5nZSgwLCB0aGlzLmxlbmd0aCwgdGhpcykKICAgICAgLi5zZXRSYW5nZSh0aGlzLmxlbmd0aCwgdG90YWxMZW5ndGgsIG90aGVyKTsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIHNodWZmbGUoW1JhbmRvbSByYW5kb21dKSB7CiAgICByYW5kb20gPz89IG5ldyBSYW5kb20oKTsKICAgIHZhciBpID0gdGhpcy5sZW5ndGg7CiAgICB3aGlsZSAoaSA+IDEpIHsKICAgICAgaW50IHBvcyA9IHJhbmRvbS5uZXh0SW50KGkpOwogICAgICBpIC09IDE7CiAgICAgIHZhciB0bXAgPSB0aGlzW2ldOwogICAgICB0aGlzW2ldID0gdGhpc1twb3NdOwogICAgICB0aGlzW3Bvc10gPSB0bXA7CiAgICB9CiAgfQoKICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RmxvYXQzMng0PiBmcm9tLAogICAgICBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICAvLyBDaGVjayByYW5nZXMuCiAgICBpZiAoMCA+IHN0YXJ0IHx8IHN0YXJ0ID4gZW5kIHx8IGVuZCA+IGxlbmd0aCkgewogICAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsZW5ndGgpOyAvLyBBbHdheXMgdGhyb3dzLgogICAgICBhc3NlcnQoZmFsc2UpOwogICAgfQogICAgaWYgKHNraXBDb3VudCA8IDApIHsKICAgICAgdGhyb3cgUmFuZ2VFcnJvci5yYW5nZShza2lwQ291bnQsIDAsIG51bGwsICJza2lwQ291bnQiKTsKICAgIH0KCiAgICBmaW5hbCBjb3VudCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKChmcm9tLmxlbmd0aCAtIHNraXBDb3VudCkgPCBjb3VudCkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29GZXcoKTsKICAgIH0KCiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuOwoKICAgIGlmIChmcm9tIGlzIF9UeXBlZExpc3RCYXNlKSB7CiAgICAgIC8vIE5vdGU6IF9UeXBlZExpc3RCYXNlIGlzIG5vdCByZWxhdGVkIHRvIEl0ZXJhYmxlPEZsb2F0MzJ4ND4gc28gdGhlcmUgaXMKICAgICAgLy8gbm8gcHJvbW90aW9uIGhlcmUuCiAgICAgIGZpbmFsIGZyb21Bc1R5cGVkTGlzdCA9IGZyb20gYXMgX1R5cGVkTGlzdEJhc2U7CiAgICAgIGlmICh0aGlzLmVsZW1lbnRTaXplSW5CeXRlcyA9PSBmcm9tQXNUeXBlZExpc3QuZWxlbWVudFNpemVJbkJ5dGVzKSB7CiAgICAgICAgaWYgKChjb3VudCA8IDEwKSAmJiAoZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlciAhPSB0aGlzLmJ1ZmZlcikpIHsKICAgICAgICAgIExpc3RzLmNvcHkoZnJvbSBhcyBMaXN0PEZsb2F0MzJ4ND4sIHNraXBDb3VudCwgdGhpcywgc3RhcnQsIGNvdW50KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYnVmZmVyLl9kYXRhLl9zZXRSYW5nZSgKICAgICAgICAgICAgc3RhcnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyB0aGlzLm9mZnNldEluQnl0ZXMsCiAgICAgICAgICAgIGNvdW50ICogZWxlbWVudFNpemVJbkJ5dGVzLAogICAgICAgICAgICBmcm9tQXNUeXBlZExpc3QuYnVmZmVyLl9kYXRhLAogICAgICAgICAgICBza2lwQ291bnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyBmcm9tQXNUeXBlZExpc3Qub2Zmc2V0SW5CeXRlcywKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRCh0aGlzKSwKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRChmcm9tKSkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlciA9PSB0aGlzLmJ1ZmZlcikgewogICAgICAgIC8vIERpZmZlcmVudCBlbGVtZW50IHNpemVzLCBidXQgc2FtZSBidWZmZXIgbWVhbnMgdGhhdCB3ZSBuZWVkCiAgICAgICAgLy8gYW4gaW50ZXJtZWRpYXRlIHN0cnVjdHVyZS4KICAgICAgICAvLyBUT0RPKHNyZGphbik6IE9wdGltaXplIHRvIHNraXAgY29weWluZyBpZiB0aGUgcmFuZ2UgZG9lcyBub3Qgb3ZlcmxhcC4KICAgICAgICBmaW5hbCBmcm9tQXNMaXN0ID0gZnJvbSBhcyBMaXN0PEZsb2F0MzJ4ND47CiAgICAgICAgZmluYWwgdGVtcEJ1ZmZlciA9IF9jcmVhdGVMaXN0KGNvdW50KTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgIHRlbXBCdWZmZXJbaV0gPSBmcm9tQXNMaXN0W3NraXBDb3VudCArIGldOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgICAgdGhpc1tpXSA9IHRlbXBCdWZmZXJbaSAtIHN0YXJ0XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgTGlzdCBvdGhlckxpc3Q7CiAgICBpbnQgb3RoZXJTdGFydDsKICAgIGlmIChmcm9tIGlzIExpc3Q8RmxvYXQzMng0PikgewogICAgICBvdGhlckxpc3QgPSBmcm9tOwogICAgICBvdGhlclN0YXJ0ID0gc2tpcENvdW50OwogICAgfSBlbHNlIHsKICAgICAgb3RoZXJMaXN0ID0gZnJvbS5za2lwKHNraXBDb3VudCkudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIG90aGVyU3RhcnQgPSAwOwogICAgfQogICAgaWYgKG90aGVyU3RhcnQgKyBjb3VudCA+IG90aGVyTGlzdC5sZW5ndGgpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vRmV3KCk7CiAgICB9CiAgICBMaXN0cy5jb3B5KG90aGVyTGlzdCwgb3RoZXJTdGFydCwgdGhpcywgc3RhcnQsIGNvdW50KTsKICB9CgogIEl0ZXJhYmxlPEZsb2F0MzJ4ND4gd2hlcmUoYm9vbCBmKEZsb2F0MzJ4NCBlbGVtZW50KSkgPT4KICAgICAgbmV3IFdoZXJlSXRlcmFibGU8RmxvYXQzMng0Pih0aGlzLCBmKTsKCiAgSXRlcmFibGU8RmxvYXQzMng0PiB0YWtlKGludCBuKSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEZsb2F0MzJ4ND4odGhpcywgMCwgbik7CgogIEl0ZXJhYmxlPEZsb2F0MzJ4ND4gdGFrZVdoaWxlKGJvb2wgdGVzdChGbG9hdDMyeDQgZWxlbWVudCkpID0+CiAgICAgIG5ldyBUYWtlV2hpbGVJdGVyYWJsZTxGbG9hdDMyeDQ+KHRoaXMsIHRlc3QpOwoKICBJdGVyYWJsZTxGbG9hdDMyeDQ+IHNraXAoaW50IG4pID0+CiAgICAgIG5ldyBTdWJMaXN0SXRlcmFibGU8RmxvYXQzMng0Pih0aGlzLCBuLCBudWxsKTsKCiAgSXRlcmFibGU8RmxvYXQzMng0PiBza2lwV2hpbGUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSkgPT4KICAgICAgbmV3IFNraXBXaGlsZUl0ZXJhYmxlPEZsb2F0MzJ4ND4odGhpcywgdGVzdCk7CgogIEl0ZXJhYmxlPEZsb2F0MzJ4ND4gZ2V0IHJldmVyc2VkID0+IG5ldyBSZXZlcnNlZExpc3RJdGVyYWJsZTxGbG9hdDMyeDQ+KHRoaXMpOwoKICBNYXA8aW50LCBGbG9hdDMyeDQ+IGFzTWFwKCkgPT4gbmV3IExpc3RNYXBWaWV3PEZsb2F0MzJ4ND4odGhpcyk7CgogIEl0ZXJhYmxlPEZsb2F0MzJ4ND4gZ2V0UmFuZ2UoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIHJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEZsb2F0MzJ4ND4odGhpcywgc3RhcnQsIGVuZCk7CiAgfQoKICBJdGVyYXRvcjxGbG9hdDMyeDQ+IGdldCBpdGVyYXRvciA9PiBuZXcgX1R5cGVkTGlzdEl0ZXJhdG9yPEZsb2F0MzJ4ND4odGhpcyk7CgogIExpc3Q8RmxvYXQzMng0PiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICByZXR1cm4gbmV3IExpc3Q8RmxvYXQzMng0Pi5mcm9tKHRoaXMsIGdyb3dhYmxlOiBncm93YWJsZSk7CiAgfQoKICBTZXQ8RmxvYXQzMng0PiB0b1NldCgpIHsKICAgIHJldHVybiBuZXcgU2V0PEZsb2F0MzJ4ND4uZnJvbSh0aGlzKTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoRmxvYXQzMng0IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGYodGhpc1tpXSk7CiAgICB9CiAgfQoKICBGbG9hdDMyeDQgcmVkdWNlKEZsb2F0MzJ4NCBjb21iaW5lKEZsb2F0MzJ4NCB2YWx1ZSwgRmxvYXQzMng0IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBpZiAobGVuID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdmFyIHZhbHVlID0gdGhpc1swXTsKICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCB0aGlzW2ldKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgaW5pdGlhbFZhbHVlLCBGbG9hdDMyeDQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaW5pdGlhbFZhbHVlID0gY29tYmluZShpbml0aWFsVmFsdWUsIHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIGluaXRpYWxWYWx1ZTsKICB9CgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoRmxvYXQzMng0IGVsZW1lbnQpKSA9PgogICAgICBuZXcgTWFwcGVkSXRlcmFibGU8RmxvYXQzMng0LCBUPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8VD4gZXhwYW5kPFQ+KEl0ZXJhYmxlPFQ+IGYoRmxvYXQzMng0IGVsZW1lbnQpKSA9PgogICAgICBuZXcgRXhwYW5kSXRlcmFibGU8RmxvYXQzMng0LCBUPih0aGlzLCBmKTsKCiAgYm9vbCBldmVyeShib29sIGYoRmxvYXQzMng0IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmICghZih0aGlzW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIGFueShib29sIGYoRmxvYXQzMng0IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmIChmKHRoaXNbaV0pKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEZsb2F0MzJ4NCBmaXJzdFdoZXJlKGJvb2wgdGVzdChGbG9hdDMyeDQgZWxlbWVudCksIHtGbG9hdDMyeDQgb3JFbHNlKCl9KSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiBlbGVtZW50OwogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0MzJ4NCBsYXN0V2hlcmUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSwge0Zsb2F0MzJ4NCBvckVsc2UoKX0pIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkgewogICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIH0KICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBGbG9hdDMyeDQgc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSwge0Zsb2F0MzJ4NCBvckVsc2UoKX0pIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICBpZiAoZm91bmRNYXRjaGluZykgewogICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSBlbGVtZW50OwogICAgICAgIGZvdW5kTWF0Y2hpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoZm91bmRNYXRjaGluZykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBGbG9hdDMyeDQgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgcmV0dXJuIHRoaXNbaW5kZXhdOwogIH0KCiAgdm9pZCBhZGQoRmxvYXQzMng0IHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxGbG9hdDMyeDQ+IHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydChpbnQgaW5kZXgsIEZsb2F0MzJ4NCB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBpbnNlcnQgaW50byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEZsb2F0MzJ4ND4gdmFsdWVzKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGluc2VydCBpbnRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgc29ydChbaW50IGNvbXBhcmUoRmxvYXQzMng0IGEsIEZsb2F0MzJ4NCBiKV0pIHsKICAgIGlmIChjb21wYXJlID09IG51bGwpIHsKICAgICAgdGhyb3cgIlNJTUQgZG9uJ3QgaGF2ZSBkZWZhdWx0IGNvbXBhcmUuIjsKICAgIH0KICAgIFNvcnQuc29ydCh0aGlzLCBjb21wYXJlKTsKICB9CgogIGludCBpbmRleE9mKEZsb2F0MzJ4NCBlbGVtZW50LCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA+PSB0aGlzLmxlbmd0aCkgewogICAgICByZXR1cm4gLTE7CiAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICBzdGFydCA9IDA7CiAgICB9CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IGxhc3RJbmRleE9mKEZsb2F0MzJ4NCBlbGVtZW50LCBbaW50IHN0YXJ0ID0gbnVsbF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB7CiAgICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIEZsb2F0MzJ4NCByZW1vdmVMYXN0KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICBGbG9hdDMyeDQgcmVtb3ZlQXQoaW50IGluZGV4KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChGbG9hdDMyeDQgZWxlbWVudCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgRmxvYXQzMng0IGdldCBmaXJzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbMF07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0MzJ4NCBnZXQgbGFzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbbGVuZ3RoIC0gMV07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0MzJ4NCBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPT0gMSkgcmV0dXJuIHRoaXNbMF07CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogIH0KCiAgRmxvYXQzMng0TGlzdCBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICB2YXIgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBGbG9hdDMyeDRMaXN0IHJlc3VsdCA9IF9jcmVhdGVMaXN0KGxlbmd0aCk7CiAgICByZXN1bHQuc2V0UmFuZ2UoMCwgbGVuZ3RoLCB0aGlzLCBzdGFydCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxGbG9hdDMyeDQ+IGl0ZXJhYmxlKSB7CiAgICBmaW5hbCBlbmQgPSBpdGVyYWJsZS5sZW5ndGggKyBpbmRleDsKICAgIHNldFJhbmdlKGluZGV4LCBlbmQsIGl0ZXJhYmxlKTsKICB9CgogIHZvaWQgZmlsbFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgW0Zsb2F0MzJ4NCBmaWxsVmFsdWVdKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkgewogICAgICB0aGlzW2ldID0gZmlsbFZhbHVlOwogICAgfQogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX0ludDMyeDRMaXN0TWl4aW4gaW1wbGVtZW50cyBMaXN0PEludDMyeDQ+IHsKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlczsKICBpbnQgZ2V0IG9mZnNldEluQnl0ZXM7CiAgX0J5dGVCdWZmZXIgZ2V0IGJ1ZmZlcjsKCiAgSW50MzJ4NExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCk7CgogIEl0ZXJhYmxlPFQ+IHdoZXJlVHlwZTxUPigpID0+IG5ldyBXaGVyZVR5cGVJdGVyYWJsZTxUPih0aGlzKTsKCiAgSXRlcmFibGU8SW50MzJ4ND4gZm9sbG93ZWRCeShJdGVyYWJsZTxJbnQzMng0PiBvdGhlcikgPT4KICAgICAgbmV3IEZvbGxvd2VkQnlJdGVyYWJsZTxJbnQzMng0Pi5maXJzdEVmZmljaWVudCh0aGlzLCBvdGhlcik7CgogIExpc3Q8Uj4gY2FzdDxSPigpID0+IExpc3QuY2FzdEZyb208SW50MzJ4NCwgUj4odGhpcyk7CiAgdm9pZCBzZXQgZmlyc3QoSW50MzJ4NCB2YWx1ZSkgewogICAgaWYgKHRoaXMubGVuZ3RoID09IDApIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1swXSA9IHZhbHVlOwogIH0KCiAgdm9pZCBzZXQgbGFzdChJbnQzMng0IHZhbHVlKSB7CiAgICBpZiAodGhpcy5sZW5ndGggPT0gMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoMCwgdGhpcyk7CiAgICB0aGlzW3RoaXMubGVuZ3RoIC0gMV0gPSB2YWx1ZTsKICB9CgogIGludCBpbmRleFdoZXJlKGJvb2wgdGVzdChJbnQzMng0IGVsZW1lbnQpLCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMDsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGludCBsYXN0SW5kZXhXaGVyZShib29sIHRlc3QoSW50MzJ4NCBlbGVtZW50KSwgW2ludCBzdGFydF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSBzdGFydCA9IHRoaXMubGVuZ3RoIC0gMTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA+PSAwOyBpLS0pIHsKICAgICAgaWYgKHRlc3QodGhpc1tpXSkpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgTGlzdDxJbnQzMng0PiBvcGVyYXRvciArKExpc3Q8SW50MzJ4ND4gb3RoZXIpIHsKICAgIGludCB0b3RhbExlbmd0aCA9IHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoOwogICAgcmV0dXJuIDxJbnQzMng0PltdCiAgICAgIC4ubGVuZ3RoID0gdG90YWxMZW5ndGgKICAgICAgLi5zZXRSYW5nZSgwLCB0aGlzLmxlbmd0aCwgdGhpcykKICAgICAgLi5zZXRSYW5nZSh0aGlzLmxlbmd0aCwgdG90YWxMZW5ndGgsIG90aGVyKTsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIHNodWZmbGUoW1JhbmRvbSByYW5kb21dKSB7CiAgICByYW5kb20gPz89IG5ldyBSYW5kb20oKTsKICAgIHZhciBpID0gdGhpcy5sZW5ndGg7CiAgICB3aGlsZSAoaSA+IDEpIHsKICAgICAgaW50IHBvcyA9IHJhbmRvbS5uZXh0SW50KGkpOwogICAgICBpIC09IDE7CiAgICAgIHZhciB0bXAgPSB0aGlzW2ldOwogICAgICB0aGlzW2ldID0gdGhpc1twb3NdOwogICAgICB0aGlzW3Bvc10gPSB0bXA7CiAgICB9CiAgfQoKICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8SW50MzJ4ND4gZnJvbSwKICAgICAgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgLy8gQ2hlY2sgcmFuZ2VzLgogICAgaWYgKDAgPiBzdGFydCB8fCBzdGFydCA+IGVuZCB8fCBlbmQgPiBsZW5ndGgpIHsKICAgICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgbGVuZ3RoKTsgLy8gQWx3YXlzIHRocm93cy4KICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgIH0KICAgIGlmIChza2lwQ291bnQgPCAwKSB7CiAgICAgIHRocm93IFJhbmdlRXJyb3IucmFuZ2Uoc2tpcENvdW50LCAwLCBudWxsLCAic2tpcENvdW50Iik7CiAgICB9CgogICAgZmluYWwgY291bnQgPSBlbmQgLSBzdGFydDsKICAgIGlmICgoZnJvbS5sZW5ndGggLSBza2lwQ291bnQpIDwgY291bnQpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vRmV3KCk7CiAgICB9CgogICAgaWYgKGNvdW50ID09IDApIHJldHVybjsKCiAgICBpZiAoZnJvbSBpcyBfVHlwZWRMaXN0QmFzZSkgewogICAgICAvLyBOb3RlOiBfVHlwZWRMaXN0QmFzZSBpcyBub3QgcmVsYXRlZCB0byBJdGVyYWJsZTxJbnQzMng0PiBzbyB0aGVyZSBpcwogICAgICAvLyBubyBwcm9tb3Rpb24gaGVyZS4KICAgICAgZmluYWwgZnJvbUFzVHlwZWRMaXN0ID0gZnJvbSBhcyBfVHlwZWRMaXN0QmFzZTsKICAgICAgaWYgKHRoaXMuZWxlbWVudFNpemVJbkJ5dGVzID09IGZyb21Bc1R5cGVkTGlzdC5lbGVtZW50U2l6ZUluQnl0ZXMpIHsKICAgICAgICBpZiAoKGNvdW50IDwgMTApICYmIChmcm9tQXNUeXBlZExpc3QuYnVmZmVyICE9IHRoaXMuYnVmZmVyKSkgewogICAgICAgICAgTGlzdHMuY29weShmcm9tIGFzIExpc3Q8SW50MzJ4ND4sIHNraXBDb3VudCwgdGhpcywgc3RhcnQsIGNvdW50KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYnVmZmVyLl9kYXRhLl9zZXRSYW5nZSgKICAgICAgICAgICAgc3RhcnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyB0aGlzLm9mZnNldEluQnl0ZXMsCiAgICAgICAgICAgIGNvdW50ICogZWxlbWVudFNpemVJbkJ5dGVzLAogICAgICAgICAgICBmcm9tQXNUeXBlZExpc3QuYnVmZmVyLl9kYXRhLAogICAgICAgICAgICBza2lwQ291bnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyBmcm9tQXNUeXBlZExpc3Qub2Zmc2V0SW5CeXRlcywKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRCh0aGlzKSwKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRChmcm9tKSkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlciA9PSB0aGlzLmJ1ZmZlcikgewogICAgICAgIC8vIERpZmZlcmVudCBlbGVtZW50IHNpemVzLCBidXQgc2FtZSBidWZmZXIgbWVhbnMgdGhhdCB3ZSBuZWVkCiAgICAgICAgLy8gYW4gaW50ZXJtZWRpYXRlIHN0cnVjdHVyZS4KICAgICAgICAvLyBUT0RPKHNyZGphbik6IE9wdGltaXplIHRvIHNraXAgY29weWluZyBpZiB0aGUgcmFuZ2UgZG9lcyBub3Qgb3ZlcmxhcC4KICAgICAgICBmaW5hbCBmcm9tQXNMaXN0ID0gZnJvbSBhcyBMaXN0PEludDMyeDQ+OwogICAgICAgIGZpbmFsIHRlbXBCdWZmZXIgPSBfY3JlYXRlTGlzdChjb3VudCk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICB0ZW1wQnVmZmVyW2ldID0gZnJvbUFzTGlzdFtza2lwQ291bnQgKyBpXTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICAgIHRoaXNbaV0gPSB0ZW1wQnVmZmVyW2kgLSBzdGFydF07CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIExpc3Qgb3RoZXJMaXN0OwogICAgaW50IG90aGVyU3RhcnQ7CiAgICBpZiAoZnJvbSBpcyBMaXN0PEludDMyeDQ+KSB7CiAgICAgIG90aGVyTGlzdCA9IGZyb207CiAgICAgIG90aGVyU3RhcnQgPSBza2lwQ291bnQ7CiAgICB9IGVsc2UgewogICAgICBvdGhlckxpc3QgPSBmcm9tLnNraXAoc2tpcENvdW50KS50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgb3RoZXJTdGFydCA9IDA7CiAgICB9CiAgICBpZiAob3RoZXJTdGFydCArIGNvdW50ID4gb3RoZXJMaXN0Lmxlbmd0aCkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29GZXcoKTsKICAgIH0KICAgIExpc3RzLmNvcHkob3RoZXJMaXN0LCBvdGhlclN0YXJ0LCB0aGlzLCBzdGFydCwgY291bnQpOwogIH0KCiAgSXRlcmFibGU8SW50MzJ4ND4gd2hlcmUoYm9vbCBmKEludDMyeDQgZWxlbWVudCkpID0+CiAgICAgIG5ldyBXaGVyZUl0ZXJhYmxlPEludDMyeDQ+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxJbnQzMng0PiB0YWtlKGludCBuKSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEludDMyeDQ+KHRoaXMsIDAsIG4pOwoKICBJdGVyYWJsZTxJbnQzMng0PiB0YWtlV2hpbGUoYm9vbCB0ZXN0KEludDMyeDQgZWxlbWVudCkpID0+CiAgICAgIG5ldyBUYWtlV2hpbGVJdGVyYWJsZTxJbnQzMng0Pih0aGlzLCB0ZXN0KTsKCiAgSXRlcmFibGU8SW50MzJ4ND4gc2tpcChpbnQgbikgPT4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxJbnQzMng0Pih0aGlzLCBuLCBudWxsKTsKCiAgSXRlcmFibGU8SW50MzJ4ND4gc2tpcFdoaWxlKGJvb2wgdGVzdChJbnQzMng0IGVsZW1lbnQpKSA9PgogICAgICBuZXcgU2tpcFdoaWxlSXRlcmFibGU8SW50MzJ4ND4odGhpcywgdGVzdCk7CgogIEl0ZXJhYmxlPEludDMyeDQ+IGdldCByZXZlcnNlZCA9PiBuZXcgUmV2ZXJzZWRMaXN0SXRlcmFibGU8SW50MzJ4ND4odGhpcyk7CgogIE1hcDxpbnQsIEludDMyeDQ+IGFzTWFwKCkgPT4gbmV3IExpc3RNYXBWaWV3PEludDMyeDQ+KHRoaXMpOwoKICBJdGVyYWJsZTxJbnQzMng0PiBnZXRSYW5nZShpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGU8SW50MzJ4ND4odGhpcywgc3RhcnQsIGVuZCk7CiAgfQoKICBJdGVyYXRvcjxJbnQzMng0PiBnZXQgaXRlcmF0b3IgPT4gbmV3IF9UeXBlZExpc3RJdGVyYXRvcjxJbnQzMng0Pih0aGlzKTsKCiAgTGlzdDxJbnQzMng0PiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICByZXR1cm4gbmV3IExpc3Q8SW50MzJ4ND4uZnJvbSh0aGlzLCBncm93YWJsZTogZ3Jvd2FibGUpOwogIH0KCiAgU2V0PEludDMyeDQ+IHRvU2V0KCkgewogICAgcmV0dXJuIG5ldyBTZXQ8SW50MzJ4ND4uZnJvbSh0aGlzKTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoSW50MzJ4NCBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmKHRoaXNbaV0pOwogICAgfQogIH0KCiAgSW50MzJ4NCByZWR1Y2UoSW50MzJ4NCBjb21iaW5lKEludDMyeDQgdmFsdWUsIEludDMyeDQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGlmIChsZW4gPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB2YXIgdmFsdWUgPSB0aGlzWzBdOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47ICsraSkgewogICAgICB2YWx1ZSA9IGNvbWJpbmUodmFsdWUsIHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgVCBmb2xkPFQ+KFQgaW5pdGlhbFZhbHVlLCBUIGNvbWJpbmUoVCBpbml0aWFsVmFsdWUsIEludDMyeDQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaW5pdGlhbFZhbHVlID0gY29tYmluZShpbml0aWFsVmFsdWUsIHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIGluaXRpYWxWYWx1ZTsKICB9CgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoSW50MzJ4NCBlbGVtZW50KSkgPT4KICAgICAgbmV3IE1hcHBlZEl0ZXJhYmxlPEludDMyeDQsIFQ+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihJbnQzMng0IGVsZW1lbnQpKSA9PgogICAgICBuZXcgRXhwYW5kSXRlcmFibGU8SW50MzJ4NCwgVD4odGhpcywgZik7CgogIGJvb2wgZXZlcnkoYm9vbCBmKEludDMyeDQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKCFmKHRoaXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgYW55KGJvb2wgZihJbnQzMng0IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmIChmKHRoaXNbaV0pKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEludDMyeDQgZmlyc3RXaGVyZShib29sIHRlc3QoSW50MzJ4NCBlbGVtZW50KSwge0ludDMyeDQgb3JFbHNlKCl9KSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiBlbGVtZW50OwogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEludDMyeDQgbGFzdFdoZXJlKGJvb2wgdGVzdChJbnQzMng0IGVsZW1lbnQpLCB7SW50MzJ4NCBvckVsc2UoKX0pIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkgewogICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIH0KICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBJbnQzMng0IHNpbmdsZVdoZXJlKGJvb2wgdGVzdChJbnQzMng0IGVsZW1lbnQpLCB7SW50MzJ4NCBvckVsc2UoKX0pIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICBpZiAoZm91bmRNYXRjaGluZykgewogICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSBlbGVtZW50OwogICAgICAgIGZvdW5kTWF0Y2hpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoZm91bmRNYXRjaGluZykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBJbnQzMng0IGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIHJldHVybiB0aGlzW2luZGV4XTsKICB9CgogIHZvaWQgYWRkKEludDMyeDQgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEludDMyeDQ+IHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydChpbnQgaW5kZXgsIEludDMyeDQgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgaW5zZXJ0IGludG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBpbnNlcnRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxJbnQzMng0PiB2YWx1ZXMpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgaW5zZXJ0IGludG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBzb3J0KFtpbnQgY29tcGFyZShJbnQzMng0IGEsIEludDMyeDQgYildKSB7CiAgICBpZiAoY29tcGFyZSA9PSBudWxsKSB7CiAgICAgIHRocm93ICJTSU1EIGRvbid0IGhhdmUgZGVmYXVsdCBjb21wYXJlLiI7CiAgICB9CiAgICBTb3J0LnNvcnQodGhpcywgY29tcGFyZSk7CiAgfQoKICBpbnQgaW5kZXhPZihJbnQzMng0IGVsZW1lbnQsIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0gZWxzZSBpZiAoc3RhcnQgPCAwKSB7CiAgICAgIHN0YXJ0ID0gMDsKICAgIH0KICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgbGFzdEluZGV4T2YoSW50MzJ4NCBlbGVtZW50LCBbaW50IHN0YXJ0ID0gbnVsbF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB7CiAgICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIEludDMyeDQgcmVtb3ZlTGFzdCgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgSW50MzJ4NCByZW1vdmVBdChpbnQgaW5kZXgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoSW50MzJ4NCBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChJbnQzMng0IGVsZW1lbnQpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIEludDMyeDQgZ2V0IGZpcnN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1swXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgSW50MzJ4NCBnZXQgbGFzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbbGVuZ3RoIC0gMV07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEludDMyeDQgZ2V0IHNpbmdsZSB7CiAgICBpZiAobGVuZ3RoID09IDEpIHJldHVybiB0aGlzWzBdOwogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb01hbnkoKTsKICB9CgogIEludDMyeDRMaXN0IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIHZhciBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIEludDMyeDRMaXN0IHJlc3VsdCA9IF9jcmVhdGVMaXN0KGxlbmd0aCk7CiAgICByZXN1bHQuc2V0UmFuZ2UoMCwgbGVuZ3RoLCB0aGlzLCBzdGFydCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxJbnQzMng0PiBpdGVyYWJsZSkgewogICAgZmluYWwgZW5kID0gaXRlcmFibGUubGVuZ3RoICsgaW5kZXg7CiAgICBzZXRSYW5nZShpbmRleCwgZW5kLCBpdGVyYWJsZSk7CiAgfQoKICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtJbnQzMng0IGZpbGxWYWx1ZV0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7CiAgICAgIHRoaXNbaV0gPSBmaWxsVmFsdWU7CiAgICB9CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfRmxvYXQ2NHgyTGlzdE1peGluIGltcGxlbWVudHMgTGlzdDxGbG9hdDY0eDI+IHsKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlczsKICBpbnQgZ2V0IG9mZnNldEluQnl0ZXM7CiAgX0J5dGVCdWZmZXIgZ2V0IGJ1ZmZlcjsKCiAgRmxvYXQ2NHgyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKTsKCiAgSXRlcmFibGU8VD4gd2hlcmVUeXBlPFQ+KCkgPT4gbmV3IFdoZXJlVHlwZUl0ZXJhYmxlPFQ+KHRoaXMpOwoKICBJdGVyYWJsZTxGbG9hdDY0eDI+IGZvbGxvd2VkQnkoSXRlcmFibGU8RmxvYXQ2NHgyPiBvdGhlcikgPT4KICAgICAgbmV3IEZvbGxvd2VkQnlJdGVyYWJsZTxGbG9hdDY0eDI+LmZpcnN0RWZmaWNpZW50KHRoaXMsIG90aGVyKTsKCiAgTGlzdDxSPiBjYXN0PFI+KCkgPT4gTGlzdC5jYXN0RnJvbTxGbG9hdDY0eDIsIFI+KHRoaXMpOwogIHZvaWQgc2V0IGZpcnN0KEZsb2F0NjR4MiB2YWx1ZSkgewogICAgaWYgKHRoaXMubGVuZ3RoID09IDApIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1swXSA9IHZhbHVlOwogIH0KCiAgdm9pZCBzZXQgbGFzdChGbG9hdDY0eDIgdmFsdWUpIHsKICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleCgwLCB0aGlzKTsKICAgIHRoaXNbdGhpcy5sZW5ndGggLSAxXSA9IHZhbHVlOwogIH0KCiAgaW50IGluZGV4V2hlcmUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSwgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDA7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAodGVzdCh0aGlzW2ldKSkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgbGFzdEluZGV4V2hlcmUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSwgW2ludCBzdGFydF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSBzdGFydCA9IHRoaXMubGVuZ3RoIC0gMTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA+PSAwOyBpLS0pIHsKICAgICAgaWYgKHRlc3QodGhpc1tpXSkpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgTGlzdDxGbG9hdDY0eDI+IG9wZXJhdG9yICsoTGlzdDxGbG9hdDY0eDI+IG90aGVyKSB7CiAgICBpbnQgdG90YWxMZW5ndGggPSB0aGlzLmxlbmd0aCArIG90aGVyLmxlbmd0aDsKICAgIHJldHVybiA8RmxvYXQ2NHgyPltdCiAgICAgIC4ubGVuZ3RoID0gdG90YWxMZW5ndGgKICAgICAgLi5zZXRSYW5nZSgwLCB0aGlzLmxlbmd0aCwgdGhpcykKICAgICAgLi5zZXRSYW5nZSh0aGlzLmxlbmd0aCwgdG90YWxMZW5ndGgsIG90aGVyKTsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIHNodWZmbGUoW1JhbmRvbSByYW5kb21dKSB7CiAgICByYW5kb20gPz89IG5ldyBSYW5kb20oKTsKICAgIHZhciBpID0gdGhpcy5sZW5ndGg7CiAgICB3aGlsZSAoaSA+IDEpIHsKICAgICAgaW50IHBvcyA9IHJhbmRvbS5uZXh0SW50KGkpOwogICAgICBpIC09IDE7CiAgICAgIHZhciB0bXAgPSB0aGlzW2ldOwogICAgICB0aGlzW2ldID0gdGhpc1twb3NdOwogICAgICB0aGlzW3Bvc10gPSB0bXA7CiAgICB9CiAgfQoKICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RmxvYXQ2NHgyPiBmcm9tLAogICAgICBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICAvLyBDaGVjayByYW5nZXMuCiAgICBpZiAoMCA+IHN0YXJ0IHx8IHN0YXJ0ID4gZW5kIHx8IGVuZCA+IGxlbmd0aCkgewogICAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsZW5ndGgpOyAvLyBBbHdheXMgdGhyb3dzLgogICAgICBhc3NlcnQoZmFsc2UpOwogICAgfQogICAgaWYgKHNraXBDb3VudCA8IDApIHsKICAgICAgdGhyb3cgUmFuZ2VFcnJvci5yYW5nZShza2lwQ291bnQsIDAsIG51bGwsICJza2lwQ291bnQiKTsKICAgIH0KCiAgICBmaW5hbCBjb3VudCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKChmcm9tLmxlbmd0aCAtIHNraXBDb3VudCkgPCBjb3VudCkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29GZXcoKTsKICAgIH0KCiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuOwoKICAgIGlmIChmcm9tIGlzIF9UeXBlZExpc3RCYXNlKSB7CiAgICAgIC8vIE5vdGU6IF9UeXBlZExpc3RCYXNlIGlzIG5vdCByZWxhdGVkIHRvIEl0ZXJhYmxlPEZsb2F0NjR4Mj4gc28gdGhlcmUgaXMKICAgICAgLy8gbm8gcHJvbW90aW9uIGhlcmUuCiAgICAgIGZpbmFsIGZyb21Bc1R5cGVkTGlzdCA9IGZyb20gYXMgX1R5cGVkTGlzdEJhc2U7CiAgICAgIGlmICh0aGlzLmVsZW1lbnRTaXplSW5CeXRlcyA9PSBmcm9tQXNUeXBlZExpc3QuZWxlbWVudFNpemVJbkJ5dGVzKSB7CiAgICAgICAgaWYgKChjb3VudCA8IDEwKSAmJiAoZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlciAhPSB0aGlzLmJ1ZmZlcikpIHsKICAgICAgICAgIExpc3RzLmNvcHkoZnJvbSBhcyBMaXN0PEZsb2F0NjR4Mj4sIHNraXBDb3VudCwgdGhpcywgc3RhcnQsIGNvdW50KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYnVmZmVyLl9kYXRhLl9zZXRSYW5nZSgKICAgICAgICAgICAgc3RhcnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyB0aGlzLm9mZnNldEluQnl0ZXMsCiAgICAgICAgICAgIGNvdW50ICogZWxlbWVudFNpemVJbkJ5dGVzLAogICAgICAgICAgICBmcm9tQXNUeXBlZExpc3QuYnVmZmVyLl9kYXRhLAogICAgICAgICAgICBza2lwQ291bnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyBmcm9tQXNUeXBlZExpc3Qub2Zmc2V0SW5CeXRlcywKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRCh0aGlzKSwKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRChmcm9tKSkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlciA9PSB0aGlzLmJ1ZmZlcikgewogICAgICAgIC8vIERpZmZlcmVudCBlbGVtZW50IHNpemVzLCBidXQgc2FtZSBidWZmZXIgbWVhbnMgdGhhdCB3ZSBuZWVkCiAgICAgICAgLy8gYW4gaW50ZXJtZWRpYXRlIHN0cnVjdHVyZS4KICAgICAgICAvLyBUT0RPKHNyZGphbik6IE9wdGltaXplIHRvIHNraXAgY29weWluZyBpZiB0aGUgcmFuZ2UgZG9lcyBub3Qgb3ZlcmxhcC4KICAgICAgICBmaW5hbCBmcm9tQXNMaXN0ID0gZnJvbSBhcyBMaXN0PEZsb2F0NjR4Mj47CiAgICAgICAgZmluYWwgdGVtcEJ1ZmZlciA9IF9jcmVhdGVMaXN0KGNvdW50KTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgIHRlbXBCdWZmZXJbaV0gPSBmcm9tQXNMaXN0W3NraXBDb3VudCArIGldOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgICAgdGhpc1tpXSA9IHRlbXBCdWZmZXJbaSAtIHN0YXJ0XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgTGlzdCBvdGhlckxpc3Q7CiAgICBpbnQgb3RoZXJTdGFydDsKICAgIGlmIChmcm9tIGlzIExpc3Q8RmxvYXQ2NHgyPikgewogICAgICBvdGhlckxpc3QgPSBmcm9tOwogICAgICBvdGhlclN0YXJ0ID0gc2tpcENvdW50OwogICAgfSBlbHNlIHsKICAgICAgb3RoZXJMaXN0ID0gZnJvbS5za2lwKHNraXBDb3VudCkudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIG90aGVyU3RhcnQgPSAwOwogICAgfQogICAgaWYgKG90aGVyU3RhcnQgKyBjb3VudCA+IG90aGVyTGlzdC5sZW5ndGgpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vRmV3KCk7CiAgICB9CiAgICBMaXN0cy5jb3B5KG90aGVyTGlzdCwgb3RoZXJTdGFydCwgdGhpcywgc3RhcnQsIGNvdW50KTsKICB9CgogIEl0ZXJhYmxlPEZsb2F0NjR4Mj4gd2hlcmUoYm9vbCBmKEZsb2F0NjR4MiBlbGVtZW50KSkgPT4KICAgICAgbmV3IFdoZXJlSXRlcmFibGU8RmxvYXQ2NHgyPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8RmxvYXQ2NHgyPiB0YWtlKGludCBuKSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEZsb2F0NjR4Mj4odGhpcywgMCwgbik7CgogIEl0ZXJhYmxlPEZsb2F0NjR4Mj4gdGFrZVdoaWxlKGJvb2wgdGVzdChGbG9hdDY0eDIgZWxlbWVudCkpID0+CiAgICAgIG5ldyBUYWtlV2hpbGVJdGVyYWJsZTxGbG9hdDY0eDI+KHRoaXMsIHRlc3QpOwoKICBJdGVyYWJsZTxGbG9hdDY0eDI+IHNraXAoaW50IG4pID0+CiAgICAgIG5ldyBTdWJMaXN0SXRlcmFibGU8RmxvYXQ2NHgyPih0aGlzLCBuLCBudWxsKTsKCiAgSXRlcmFibGU8RmxvYXQ2NHgyPiBza2lwV2hpbGUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSkgPT4KICAgICAgbmV3IFNraXBXaGlsZUl0ZXJhYmxlPEZsb2F0NjR4Mj4odGhpcywgdGVzdCk7CgogIEl0ZXJhYmxlPEZsb2F0NjR4Mj4gZ2V0IHJldmVyc2VkID0+IG5ldyBSZXZlcnNlZExpc3RJdGVyYWJsZTxGbG9hdDY0eDI+KHRoaXMpOwoKICBNYXA8aW50LCBGbG9hdDY0eDI+IGFzTWFwKCkgPT4gbmV3IExpc3RNYXBWaWV3PEZsb2F0NjR4Mj4odGhpcyk7CgogIEl0ZXJhYmxlPEZsb2F0NjR4Mj4gZ2V0UmFuZ2UoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIHJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEZsb2F0NjR4Mj4odGhpcywgc3RhcnQsIGVuZCk7CiAgfQoKICBJdGVyYXRvcjxGbG9hdDY0eDI+IGdldCBpdGVyYXRvciA9PiBuZXcgX1R5cGVkTGlzdEl0ZXJhdG9yPEZsb2F0NjR4Mj4odGhpcyk7CgogIExpc3Q8RmxvYXQ2NHgyPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICByZXR1cm4gbmV3IExpc3Q8RmxvYXQ2NHgyPi5mcm9tKHRoaXMsIGdyb3dhYmxlOiBncm93YWJsZSk7CiAgfQoKICBTZXQ8RmxvYXQ2NHgyPiB0b1NldCgpIHsKICAgIHJldHVybiBuZXcgU2V0PEZsb2F0NjR4Mj4uZnJvbSh0aGlzKTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoRmxvYXQ2NHgyIGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGYodGhpc1tpXSk7CiAgICB9CiAgfQoKICBGbG9hdDY0eDIgcmVkdWNlKEZsb2F0NjR4MiBjb21iaW5lKEZsb2F0NjR4MiB2YWx1ZSwgRmxvYXQ2NHgyIGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBpZiAobGVuID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdmFyIHZhbHVlID0gdGhpc1swXTsKICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCB0aGlzW2ldKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgaW5pdGlhbFZhbHVlLCBGbG9hdDY0eDIgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaW5pdGlhbFZhbHVlID0gY29tYmluZShpbml0aWFsVmFsdWUsIHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIGluaXRpYWxWYWx1ZTsKICB9CgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoRmxvYXQ2NHgyIGVsZW1lbnQpKSA9PgogICAgICBuZXcgTWFwcGVkSXRlcmFibGU8RmxvYXQ2NHgyLCBUPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8VD4gZXhwYW5kPFQ+KEl0ZXJhYmxlPFQ+IGYoRmxvYXQ2NHgyIGVsZW1lbnQpKSA9PgogICAgICBuZXcgRXhwYW5kSXRlcmFibGU8RmxvYXQ2NHgyLCBUPih0aGlzLCBmKTsKCiAgYm9vbCBldmVyeShib29sIGYoRmxvYXQ2NHgyIGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmICghZih0aGlzW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIGFueShib29sIGYoRmxvYXQ2NHgyIGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmIChmKHRoaXNbaV0pKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEZsb2F0NjR4MiBmaXJzdFdoZXJlKGJvb2wgdGVzdChGbG9hdDY0eDIgZWxlbWVudCksIHtGbG9hdDY0eDIgb3JFbHNlKCl9KSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiBlbGVtZW50OwogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0NjR4MiBsYXN0V2hlcmUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSwge0Zsb2F0NjR4MiBvckVsc2UoKX0pIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkgewogICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIH0KICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBGbG9hdDY0eDIgc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSwge0Zsb2F0NjR4MiBvckVsc2UoKX0pIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICBpZiAoZm91bmRNYXRjaGluZykgewogICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSBlbGVtZW50OwogICAgICAgIGZvdW5kTWF0Y2hpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoZm91bmRNYXRjaGluZykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBGbG9hdDY0eDIgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgcmV0dXJuIHRoaXNbaW5kZXhdOwogIH0KCiAgdm9pZCBhZGQoRmxvYXQ2NHgyIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxGbG9hdDY0eDI+IHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydChpbnQgaW5kZXgsIEZsb2F0NjR4MiB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBpbnNlcnQgaW50byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEZsb2F0NjR4Mj4gdmFsdWVzKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGluc2VydCBpbnRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgc29ydChbaW50IGNvbXBhcmUoRmxvYXQ2NHgyIGEsIEZsb2F0NjR4MiBiKV0pIHsKICAgIGlmIChjb21wYXJlID09IG51bGwpIHsKICAgICAgdGhyb3cgIlNJTUQgZG9uJ3QgaGF2ZSBkZWZhdWx0IGNvbXBhcmUuIjsKICAgIH0KICAgIFNvcnQuc29ydCh0aGlzLCBjb21wYXJlKTsKICB9CgogIGludCBpbmRleE9mKEZsb2F0NjR4MiBlbGVtZW50LCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA+PSB0aGlzLmxlbmd0aCkgewogICAgICByZXR1cm4gLTE7CiAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICBzdGFydCA9IDA7CiAgICB9CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IGxhc3RJbmRleE9mKEZsb2F0NjR4MiBlbGVtZW50LCBbaW50IHN0YXJ0ID0gbnVsbF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB7CiAgICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIEZsb2F0NjR4MiByZW1vdmVMYXN0KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICBGbG9hdDY0eDIgcmVtb3ZlQXQoaW50IGluZGV4KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChGbG9hdDY0eDIgZWxlbWVudCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgRmxvYXQ2NHgyIGdldCBmaXJzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbMF07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0NjR4MiBnZXQgbGFzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbbGVuZ3RoIC0gMV07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0NjR4MiBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPT0gMSkgcmV0dXJuIHRoaXNbMF07CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogIH0KCiAgRmxvYXQ2NHgyTGlzdCBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICB2YXIgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBGbG9hdDY0eDJMaXN0IHJlc3VsdCA9IF9jcmVhdGVMaXN0KGxlbmd0aCk7CiAgICByZXN1bHQuc2V0UmFuZ2UoMCwgbGVuZ3RoLCB0aGlzLCBzdGFydCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxGbG9hdDY0eDI+IGl0ZXJhYmxlKSB7CiAgICBmaW5hbCBlbmQgPSBpdGVyYWJsZS5sZW5ndGggKyBpbmRleDsKICAgIHNldFJhbmdlKGluZGV4LCBlbmQsIGl0ZXJhYmxlKTsKICB9CgogIHZvaWQgZmlsbFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgW0Zsb2F0NjR4MiBmaWxsVmFsdWVdKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkgewogICAgICB0aGlzW2ldID0gZmlsbFZhbHVlOwogICAgfQogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfQnl0ZUJ1ZmZlciBpbXBsZW1lbnRzIEJ5dGVCdWZmZXIgewogIGZpbmFsIF9UeXBlZExpc3QgX2RhdGE7CgogIF9CeXRlQnVmZmVyKHRoaXMuX2RhdGEpOwoKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZmFjdG9yeSBfQnl0ZUJ1ZmZlci5fTmV3KGRhdGEpID0+IG5ldyBfQnl0ZUJ1ZmZlcihkYXRhKTsKCiAgLy8gRm9yd2FyZCBjYWxscyB0byBfZGF0YS4KICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXMgPT4gX2RhdGEubGVuZ3RoSW5CeXRlczsKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9kYXRhLmhhc2hDb2RlOwogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICAob3RoZXIgaXMgX0J5dGVCdWZmZXIpICYmIGlkZW50aWNhbChfZGF0YSwgb3RoZXIuX2RhdGEpOwoKICBCeXRlRGF0YSBhc0J5dGVEYXRhKFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89IHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXM7CiAgICBfcmFuZ2VDaGVjayh0aGlzLl9kYXRhLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgICByZXR1cm4gbmV3IF9CeXRlRGF0YVZpZXcuXyh0aGlzLl9kYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgSW50OExpc3QgYXNJbnQ4TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgbGVuZ3RoID8/PSAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8gSW50OExpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgX3JhbmdlQ2hlY2soCiAgICAgICAgdGhpcy5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGggKiBJbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBfSW50OEFycmF5Vmlldy5fKHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBVaW50OExpc3QgYXNVaW50OExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIGxlbmd0aCA/Pz0KICAgICAgICAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8gVWludDhMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKAogICAgICAgIHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoICogVWludDhMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9VaW50OEFycmF5Vmlldy5fKHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBVaW50OENsYW1wZWRMaXN0IGFzVWludDhDbGFtcGVkTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgbGVuZ3RoID8/PSAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8KICAgICAgICBVaW50OENsYW1wZWRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywKICAgICAgICBsZW5ndGggKiBVaW50OENsYW1wZWRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9VaW50OENsYW1wZWRBcnJheVZpZXcuXyh0aGlzLl9kYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgSW50MTZMaXN0IGFzSW50MTZMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89CiAgICAgICAgKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIEludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICBfcmFuZ2VDaGVjaygKICAgICAgICB0aGlzLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCAqIEludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgX29mZnNldEFsaWdubWVudENoZWNrKG9mZnNldEluQnl0ZXMsIEludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBfSW50MTZBcnJheVZpZXcuXyh0aGlzLl9kYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgVWludDE2TGlzdCBhc1VpbnQxNkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIGxlbmd0aCA/Pz0KICAgICAgICAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8gVWludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICBfcmFuZ2VDaGVjaygKICAgICAgICB0aGlzLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCAqIFVpbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIF9vZmZzZXRBbGlnbm1lbnRDaGVjayhvZmZzZXRJbkJ5dGVzLCBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9VaW50MTZBcnJheVZpZXcuXyh0aGlzLl9kYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgSW50MzJMaXN0IGFzSW50MzJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89CiAgICAgICAgKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICBfcmFuZ2VDaGVjaygKICAgICAgICB0aGlzLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCAqIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgX29mZnNldEFsaWdubWVudENoZWNrKG9mZnNldEluQnl0ZXMsIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBfSW50MzJBcnJheVZpZXcuXyh0aGlzLl9kYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgVWludDMyTGlzdCBhc1VpbnQzMkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIGxlbmd0aCA/Pz0KICAgICAgICAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8gVWludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICBfcmFuZ2VDaGVjaygKICAgICAgICB0aGlzLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCAqIFVpbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIF9vZmZzZXRBbGlnbm1lbnRDaGVjayhvZmZzZXRJbkJ5dGVzLCBVaW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9VaW50MzJBcnJheVZpZXcuXyh0aGlzLl9kYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgSW50NjRMaXN0IGFzSW50NjRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89CiAgICAgICAgKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICBfcmFuZ2VDaGVjaygKICAgICAgICB0aGlzLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCAqIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgX29mZnNldEFsaWdubWVudENoZWNrKG9mZnNldEluQnl0ZXMsIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBfSW50NjRBcnJheVZpZXcuXyh0aGlzLl9kYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgVWludDY0TGlzdCBhc1VpbnQ2NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIGxlbmd0aCA/Pz0KICAgICAgICAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8gVWludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICBfcmFuZ2VDaGVjaygKICAgICAgICB0aGlzLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCAqIFVpbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIF9vZmZzZXRBbGlnbm1lbnRDaGVjayhvZmZzZXRJbkJ5dGVzLCBVaW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9VaW50NjRBcnJheVZpZXcuXyh0aGlzLl9kYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgRmxvYXQzMkxpc3QgYXNGbG9hdDMyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgbGVuZ3RoID8/PQogICAgICAgICh0aGlzLmxlbmd0aEluQnl0ZXMgLSBvZmZzZXRJbkJ5dGVzKSB+LyBGbG9hdDMyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICBfcmFuZ2VDaGVjayh0aGlzLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsCiAgICAgICAgbGVuZ3RoICogRmxvYXQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIF9vZmZzZXRBbGlnbm1lbnRDaGVjayhvZmZzZXRJbkJ5dGVzLCBGbG9hdDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBfRmxvYXQzMkFycmF5Vmlldy5fKHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBGbG9hdDY0TGlzdCBhc0Zsb2F0NjRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89CiAgICAgICAgKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIEZsb2F0NjRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywKICAgICAgICBsZW5ndGggKiBGbG9hdDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgX29mZnNldEFsaWdubWVudENoZWNrKG9mZnNldEluQnl0ZXMsIEZsb2F0NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9GbG9hdDY0QXJyYXlWaWV3Ll8odGhpcy5fZGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIEZsb2F0MzJ4NExpc3QgYXNGbG9hdDMyeDRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89CiAgICAgICAgKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIEZsb2F0MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgX3JhbmdlQ2hlY2sodGhpcy5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLAogICAgICAgIGxlbmd0aCAqIEZsb2F0MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIF9vZmZzZXRBbGlnbm1lbnRDaGVjayhvZmZzZXRJbkJ5dGVzLCBGbG9hdDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9GbG9hdDMyeDRBcnJheVZpZXcuXyh0aGlzLl9kYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgSW50MzJ4NExpc3QgYXNJbnQzMng0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgbGVuZ3RoID8/PQogICAgICAgICh0aGlzLmxlbmd0aEluQnl0ZXMgLSBvZmZzZXRJbkJ5dGVzKSB+LyBJbnQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICBfcmFuZ2VDaGVjayh0aGlzLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsCiAgICAgICAgbGVuZ3RoICogSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIF9vZmZzZXRBbGlnbm1lbnRDaGVjayhvZmZzZXRJbkJ5dGVzLCBJbnQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBfSW50MzJ4NEFycmF5Vmlldy5fKHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBGbG9hdDY0eDJMaXN0IGFzRmxvYXQ2NHgyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgbGVuZ3RoID8/PQogICAgICAgICh0aGlzLmxlbmd0aEluQnl0ZXMgLSBvZmZzZXRJbkJ5dGVzKSB+LyBGbG9hdDY0eDJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywKICAgICAgICBsZW5ndGggKiBGbG9hdDY0eDJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICBfb2Zmc2V0QWxpZ25tZW50Q2hlY2sob2Zmc2V0SW5CeXRlcywgRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBfRmxvYXQ2NHgyQXJyYXlWaWV3Ll8odGhpcy5fZGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9UeXBlZExpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0QmFzZSB7CiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXM7CgogIC8vIERlZmF1bHQgbWV0aG9kIGltcGxlbWVudGluZyBwYXJ0cyBvZiB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IG9mZnNldEluQnl0ZXMgewogICAgcmV0dXJuIDA7CiAgfQoKICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXMgewogICAgcmV0dXJuIGxlbmd0aCAqIGVsZW1lbnRTaXplSW5CeXRlczsKICB9CgogIF9CeXRlQnVmZmVyIGdldCBidWZmZXIgPT4gbmV3IF9CeXRlQnVmZmVyKHRoaXMpOwoKICAvLyBNZXRob2RzIGltcGxlbWVudGluZyB0aGUgY29sbGVjdGlvbiBpbnRlcmZhY2UuCgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBpbnQgZ2V0IGxlbmd0aCBuYXRpdmUgIlR5cGVkRGF0YV9sZW5ndGgiOwoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgX2dldEludDgoaW50IG9mZnNldEluQnl0ZXMpIG5hdGl2ZSAiVHlwZWREYXRhX0dldEludDgiOwogIHZvaWQgX3NldEludDgoaW50IG9mZnNldEluQnl0ZXMsIGludCB2YWx1ZSkgbmF0aXZlICJUeXBlZERhdGFfU2V0SW50OCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgX2dldFVpbnQ4KGludCBvZmZzZXRJbkJ5dGVzKSBuYXRpdmUgIlR5cGVkRGF0YV9HZXRVaW50OCI7CiAgdm9pZCBfc2V0VWludDgoaW50IG9mZnNldEluQnl0ZXMsIGludCB2YWx1ZSkgbmF0aXZlICJUeXBlZERhdGFfU2V0VWludDgiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IF9nZXRJbnQxNihpbnQgb2Zmc2V0SW5CeXRlcykgbmF0aXZlICJUeXBlZERhdGFfR2V0SW50MTYiOwogIHZvaWQgX3NldEludDE2KGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgdmFsdWUpIG5hdGl2ZSAiVHlwZWREYXRhX1NldEludDE2IjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBfZ2V0VWludDE2KGludCBvZmZzZXRJbkJ5dGVzKSBuYXRpdmUgIlR5cGVkRGF0YV9HZXRVaW50MTYiOwogIHZvaWQgX3NldFVpbnQxNihpbnQgb2Zmc2V0SW5CeXRlcywgaW50IHZhbHVlKSBuYXRpdmUgIlR5cGVkRGF0YV9TZXRVaW50MTYiOwoKICBpbnQgX2dldEludDMyKGludCBvZmZzZXRJbkJ5dGVzKSBuYXRpdmUgIlR5cGVkRGF0YV9HZXRJbnQzMiI7CiAgdm9pZCBfc2V0SW50MzIoaW50IG9mZnNldEluQnl0ZXMsIGludCB2YWx1ZSkgbmF0aXZlICJUeXBlZERhdGFfU2V0SW50MzIiOwoKICBpbnQgX2dldFVpbnQzMihpbnQgb2Zmc2V0SW5CeXRlcykgbmF0aXZlICJUeXBlZERhdGFfR2V0VWludDMyIjsKICB2b2lkIF9zZXRVaW50MzIoaW50IG9mZnNldEluQnl0ZXMsIGludCB2YWx1ZSkgbmF0aXZlICJUeXBlZERhdGFfU2V0VWludDMyIjsKCiAgaW50IF9nZXRJbnQ2NChpbnQgb2Zmc2V0SW5CeXRlcykgbmF0aXZlICJUeXBlZERhdGFfR2V0SW50NjQiOwogIHZvaWQgX3NldEludDY0KGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgdmFsdWUpIG5hdGl2ZSAiVHlwZWREYXRhX1NldEludDY0IjsKCiAgaW50IF9nZXRVaW50NjQoaW50IG9mZnNldEluQnl0ZXMpIG5hdGl2ZSAiVHlwZWREYXRhX0dldFVpbnQ2NCI7CiAgdm9pZCBfc2V0VWludDY0KGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgdmFsdWUpIG5hdGl2ZSAiVHlwZWREYXRhX1NldFVpbnQ2NCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKICBkb3VibGUgX2dldEZsb2F0MzIoaW50IG9mZnNldEluQnl0ZXMpIG5hdGl2ZSAiVHlwZWREYXRhX0dldEZsb2F0MzIiOwogIHZvaWQgX3NldEZsb2F0MzIoaW50IG9mZnNldEluQnl0ZXMsIGRvdWJsZSB2YWx1ZSkKICAgICAgbmF0aXZlICJUeXBlZERhdGFfU2V0RmxvYXQzMiI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKICBkb3VibGUgX2dldEZsb2F0NjQoaW50IG9mZnNldEluQnl0ZXMpIG5hdGl2ZSAiVHlwZWREYXRhX0dldEZsb2F0NjQiOwogIHZvaWQgX3NldEZsb2F0NjQoaW50IG9mZnNldEluQnl0ZXMsIGRvdWJsZSB2YWx1ZSkKICAgICAgbmF0aXZlICJUeXBlZERhdGFfU2V0RmxvYXQ2NCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgX2dldEZsb2F0MzJ4NChpbnQgb2Zmc2V0SW5CeXRlcykgbmF0aXZlICJUeXBlZERhdGFfR2V0RmxvYXQzMng0IjsKICB2b2lkIF9zZXRGbG9hdDMyeDQoaW50IG9mZnNldEluQnl0ZXMsIEZsb2F0MzJ4NCB2YWx1ZSkKICAgICAgbmF0aXZlICJUeXBlZERhdGFfU2V0RmxvYXQzMng0IjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IF9nZXRJbnQzMng0KGludCBvZmZzZXRJbkJ5dGVzKSBuYXRpdmUgIlR5cGVkRGF0YV9HZXRJbnQzMng0IjsKICB2b2lkIF9zZXRJbnQzMng0KGludCBvZmZzZXRJbkJ5dGVzLCBJbnQzMng0IHZhbHVlKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YV9TZXRJbnQzMng0IjsKCiAgRmxvYXQ2NHgyIF9nZXRGbG9hdDY0eDIoaW50IG9mZnNldEluQnl0ZXMpIG5hdGl2ZSAiVHlwZWREYXRhX0dldEZsb2F0NjR4MiI7CiAgdm9pZCBfc2V0RmxvYXQ2NHgyKGludCBvZmZzZXRJbkJ5dGVzLCBGbG9hdDY0eDIgdmFsdWUpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhX1NldEZsb2F0NjR4MiI7CgogIC8qKgogICAqIFN0b3JlcyB0aGUgW0NvZGVVbml0c10gYXMgVVRGLTE2IHVuaXRzIGludG8gdGhpcyBUeXBlZERhdGEgYXQKICAgKiBwb3NpdGlvbnMgW3N0YXJ0XS4uW2VuZF0gKHVpbnQxNiBpbmRpY2VzKS4KICAgKi8KICB2b2lkIF9zZXRDb2RlVW5pdHMoCiAgICAgIENvZGVVbml0cyB1bml0cywgaW50IGJ5dGVTdGFydCwgaW50IGxlbmd0aCwgaW50IHNraXBDb3VudCkgewogICAgYXNzZXJ0KGJ5dGVTdGFydCArIGxlbmd0aCAqIFVpbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50IDw9IGxlbmd0aEluQnl0ZXMpOwogICAgU3RyaW5nIHN0cmluZyA9IENvZGVVbml0cy5zdHJpbmdPZih1bml0cyk7CiAgICBpbnQgc2xpY2VFbmQgPSBza2lwQ291bnQgKyBsZW5ndGg7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZSgKICAgICAgICBza2lwQ291bnQsIHNsaWNlRW5kLCBzdHJpbmcubGVuZ3RoLCAic2tpcENvdW50IiwgInNraXBDb3VudCArIGxlbmd0aCIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBfc2V0VWludDE2KGJ5dGVTdGFydCArIGkgKiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCwKICAgICAgICAgIHN0cmluZy5jb2RlVW5pdEF0KHNraXBDb3VudCArIGkpKTsKICAgIH0KICB9Cn0KCkBwYXRjaApjbGFzcyBJbnQ4TGlzdCB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50OExpc3QpCiAgZmFjdG9yeSBJbnQ4TGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9JbnQ4QXJyYXlfbmV3IjsKCiAgQHBhdGNoCiAgZmFjdG9yeSBJbnQ4TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgSW50OExpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfSW50OExpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4sIF9UeXBlZEludExpc3RNaXhpbjxJbnQ4TGlzdD4KICAgIGltcGxlbWVudHMgSW50OExpc3QgewogIGZhY3RvcnkgX0ludDhMaXN0Ll91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93ICJVbnJlYWNoYWJsZSI7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEludDgoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbnQ4KGluZGV4LCBfdG9JbnQ4KHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDhMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBJbnQ4TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDhMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgVWludDhMaXN0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9VaW50OExpc3QpCiAgZmFjdG9yeSBVaW50OExpc3QoaW50IGxlbmd0aCkgbmF0aXZlICJUeXBlZERhdGFfVWludDhBcnJheV9uZXciOwoKICBAcGF0Y2gKICBmYWN0b3J5IFVpbnQ4TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgVWludDhMaXN0KGVsZW1lbnRzLmxlbmd0aCkKICAgICAgLi5zZXRSYW5nZSgwLCBlbGVtZW50cy5sZW5ndGgsIGVsZW1lbnRzKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1VpbnQ4TGlzdCBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbiwgX1R5cGVkSW50TGlzdE1peGluPFVpbnQ4TGlzdD4KICAgIGltcGxlbWVudHMgVWludDhMaXN0IHsKICBmYWN0b3J5IF9VaW50OExpc3QuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgIlVucmVhY2hhYmxlIjsKICB9CgogIC8vIE1ldGhvZHMgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldFVpbnQ4KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0VWludDgoaW5kZXgsIF90b1VpbnQ4KHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2RzIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50OExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIFVpbnQ4TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOwogIH0KfQoKQHBhdGNoCmNsYXNzIFVpbnQ4Q2xhbXBlZExpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX1VpbnQ4Q2xhbXBlZExpc3QpCiAgZmFjdG9yeSBVaW50OENsYW1wZWRMaXN0KGludCBsZW5ndGgpIG5hdGl2ZSAiVHlwZWREYXRhX1VpbnQ4Q2xhbXBlZEFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgVWludDhDbGFtcGVkTGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgVWludDhDbGFtcGVkTGlzdChlbGVtZW50cy5sZW5ndGgpCiAgICAgIC4uc2V0UmFuZ2UoMCwgZWxlbWVudHMubGVuZ3RoLCBlbGVtZW50cyk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9VaW50OENsYW1wZWRMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluLCBfVHlwZWRJbnRMaXN0TWl4aW48VWludDhDbGFtcGVkTGlzdD4KICAgIGltcGxlbWVudHMgVWludDhDbGFtcGVkTGlzdCB7CiAgZmFjdG9yeSBfVWludDhDbGFtcGVkTGlzdC5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgLy8gTWV0aG9kcyBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0VWludDgoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRVaW50OChpbmRleCwgX3RvQ2xhbXBlZFVpbnQ4KHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2RzIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50OExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIFVpbnQ4Q2xhbXBlZExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50OENsYW1wZWRMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgSW50MTZMaXN0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQxNkxpc3QpCiAgZmFjdG9yeSBJbnQxNkxpc3QoaW50IGxlbmd0aCkgbmF0aXZlICJUeXBlZERhdGFfSW50MTZBcnJheV9uZXciOwoKICBAcGF0Y2gKICBmYWN0b3J5IEludDE2TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgSW50MTZMaXN0KGVsZW1lbnRzLmxlbmd0aCkKICAgICAgLi5zZXRSYW5nZSgwLCBlbGVtZW50cy5sZW5ndGgsIGVsZW1lbnRzKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ludDE2TGlzdCBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbiwgX1R5cGVkSW50TGlzdE1peGluPEludDE2TGlzdD4KICAgIGltcGxlbWVudHMgSW50MTZMaXN0IHsKICBmYWN0b3J5IF9JbnQxNkxpc3QuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgIlVucmVhY2hhYmxlIjsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEludDE2KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEludDE2KGluZGV4LCBfdG9JbnQxNih2YWx1ZSkpOwogIH0KCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlIGl0ZXJhYmxlLCBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICBpZiAoaXRlcmFibGUgaXMgQ29kZVVuaXRzKSB7CiAgICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgICBpbnQgYnl0ZVN0YXJ0ID0gdGhpcy5vZmZzZXRJbkJ5dGVzICsgc3RhcnQgKiBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgICBfc2V0Q29kZVVuaXRzKGl0ZXJhYmxlLCBieXRlU3RhcnQsIGxlbmd0aCwgc2tpcENvdW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLnNldFJhbmdlKHN0YXJ0LCBlbmQsIGl0ZXJhYmxlLCBza2lwQ291bnQpOwogICAgfQogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDE2TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDE2TGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkSW50MTYoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEludDE2KGluZGV4ICogSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkSW50MTYoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIF9zZXRJbnQxNihpbmRleCAqIEludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBVaW50MTZMaXN0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9VaW50MTZMaXN0KQogIGZhY3RvcnkgVWludDE2TGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9VaW50MTZBcnJheV9uZXciOwoKICBAcGF0Y2gKICBmYWN0b3J5IFVpbnQxNkxpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IFVpbnQxNkxpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVWludDE2TGlzdCBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbiwgX1R5cGVkSW50TGlzdE1peGluPFVpbnQxNkxpc3Q+CiAgICBpbXBsZW1lbnRzIFVpbnQxNkxpc3QgewogIGZhY3RvcnkgX1VpbnQxNkxpc3QuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgIlVucmVhY2hhYmxlIjsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRVaW50MTYoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkVWludDE2KGluZGV4LCBfdG9VaW50MTYodmFsdWUpKTsKICB9CgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZSBpdGVyYWJsZSwgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgaWYgKGl0ZXJhYmxlIGlzIENvZGVVbml0cykgewogICAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgICAgaW50IGJ5dGVTdGFydCA9IHRoaXMub2Zmc2V0SW5CeXRlcyArIHN0YXJ0ICogVWludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICAgIF9zZXRDb2RlVW5pdHMoaXRlcmFibGUsIGJ5dGVTdGFydCwgbGVuZ3RoLCBza2lwQ291bnQpOwogICAgfSBlbHNlIHsKICAgICAgc3VwZXIuc2V0UmFuZ2Uoc3RhcnQsIGVuZCwgaXRlcmFibGUsIHNraXBDb3VudCk7CiAgICB9CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50MTZMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDE2TGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkVWludDE2KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRVaW50MTYoaW5kZXggKiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkVWludDE2KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBfc2V0VWludDE2KGluZGV4ICogVWludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBJbnQzMkxpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyTGlzdCkKICBmYWN0b3J5IEludDMyTGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9JbnQzMkFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgSW50MzJMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgewogICAgcmV0dXJuIG5ldyBJbnQzMkxpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfSW50MzJMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluLCBfVHlwZWRJbnRMaXN0TWl4aW48SW50MzJMaXN0PgogICAgaW1wbGVtZW50cyBJbnQzMkxpc3QgewogIGZhY3RvcnkgX0ludDMyTGlzdC5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkSW50MzIoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkSW50MzIoaW5kZXgsIF90b0ludDMyKHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgSW50MzJMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50MzJMaXN0KGxlbmd0aCk7CiAgfQoKICBpbnQgX2dldEluZGV4ZWRJbnQzMihpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0SW50MzIoaW5kZXggKiBJbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRJbnQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgX3NldEludDMyKGluZGV4ICogSW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHBhdGNoCmNsYXNzIFVpbnQzMkxpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX1VpbnQzMkxpc3QpCiAgZmFjdG9yeSBVaW50MzJMaXN0KGludCBsZW5ndGgpIG5hdGl2ZSAiVHlwZWREYXRhX1VpbnQzMkFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgVWludDMyTGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgVWludDMyTGlzdChlbGVtZW50cy5sZW5ndGgpCiAgICAgIC4uc2V0UmFuZ2UoMCwgZWxlbWVudHMubGVuZ3RoLCBlbGVtZW50cyk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9VaW50MzJMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluLCBfVHlwZWRJbnRMaXN0TWl4aW48VWludDMyTGlzdD4KICAgIGltcGxlbWVudHMgVWludDMyTGlzdCB7CiAgZmFjdG9yeSBfVWludDMyTGlzdC5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkVWludDMyKGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZFVpbnQzMihpbmRleCwgX3RvVWludDMyKHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50MzJMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDMyTGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkVWludDMyKGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRVaW50MzIoaW5kZXggKiBVaW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkVWludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBfc2V0VWludDMyKGluZGV4ICogVWludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBJbnQ2NExpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDY0TGlzdCkKICBmYWN0b3J5IEludDY0TGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9JbnQ2NEFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgSW50NjRMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgewogICAgcmV0dXJuIG5ldyBJbnQ2NExpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfSW50NjRMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluLCBfVHlwZWRJbnRMaXN0TWl4aW48SW50NjRMaXN0PgogICAgaW1wbGVtZW50cyBJbnQ2NExpc3QgewogIGZhY3RvcnkgX0ludDY0TGlzdC5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkSW50NjQoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkSW50NjQoaW5kZXgsIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgSW50NjRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50NjRMaXN0KGxlbmd0aCk7CiAgfQoKICBpbnQgX2dldEluZGV4ZWRJbnQ2NChpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0SW50NjQoaW5kZXggKiBJbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRJbnQ2NChpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgX3NldEludDY0KGluZGV4ICogSW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHBhdGNoCmNsYXNzIFVpbnQ2NExpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX1VpbnQ2NExpc3QpCiAgZmFjdG9yeSBVaW50NjRMaXN0KGludCBsZW5ndGgpIG5hdGl2ZSAiVHlwZWREYXRhX1VpbnQ2NEFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgVWludDY0TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgVWludDY0TGlzdChlbGVtZW50cy5sZW5ndGgpCiAgICAgIC4uc2V0UmFuZ2UoMCwgZWxlbWVudHMubGVuZ3RoLCBlbGVtZW50cyk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9VaW50NjRMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluLCBfVHlwZWRJbnRMaXN0TWl4aW48VWludDY0TGlzdD4KICAgIGltcGxlbWVudHMgVWludDY0TGlzdCB7CiAgZmFjdG9yeSBfVWludDY0TGlzdC5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkVWludDY0KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZFVpbnQ2NChpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gVWludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDY0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ2NExpc3QobGVuZ3RoKTsKICB9CgogIGludCBfZ2V0SW5kZXhlZFVpbnQ2NChpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0VWludDY0KGluZGV4ICogVWludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZFVpbnQ2NChpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgX3NldFVpbnQ2NChpbmRleCAqIFVpbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgRmxvYXQzMkxpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJMaXN0KQogIGZhY3RvcnkgRmxvYXQzMkxpc3QoaW50IGxlbmd0aCkgbmF0aXZlICJUeXBlZERhdGFfRmxvYXQzMkFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgRmxvYXQzMkxpc3QuZnJvbUxpc3QoTGlzdDxkb3VibGU+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0MzJMaXN0KGVsZW1lbnRzLmxlbmd0aCkKICAgICAgLi5zZXRSYW5nZSgwLCBlbGVtZW50cy5sZW5ndGgsIGVsZW1lbnRzKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0MzJMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfRG91YmxlTGlzdE1peGluLCBfVHlwZWREb3VibGVMaXN0TWl4aW48RmxvYXQzMkxpc3Q+CiAgICBpbXBsZW1lbnRzIEZsb2F0MzJMaXN0IHsKICBmYWN0b3J5IF9GbG9hdDMyTGlzdC5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQogIGRvdWJsZSBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEZsb2F0MzIoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkRmxvYXQzMihpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEZsb2F0MzJMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgRmxvYXQzMkxpc3QobGVuZ3RoKTsKICB9CgogIGRvdWJsZSBfZ2V0SW5kZXhlZEZsb2F0MzIoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEZsb2F0MzIoaW5kZXggKiBGbG9hdDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEZsb2F0MzIoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKICAgIF9zZXRGbG9hdDMyKGluZGV4ICogRmxvYXQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgRmxvYXQ2NExpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjRMaXN0KQogIGZhY3RvcnkgRmxvYXQ2NExpc3QoaW50IGxlbmd0aCkgbmF0aXZlICJUeXBlZERhdGFfRmxvYXQ2NEFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgRmxvYXQ2NExpc3QuZnJvbUxpc3QoTGlzdDxkb3VibGU+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0NjRMaXN0KGVsZW1lbnRzLmxlbmd0aCkKICAgICAgLi5zZXRSYW5nZSgwLCBlbGVtZW50cy5sZW5ndGgsIGVsZW1lbnRzKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0NjRMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfRG91YmxlTGlzdE1peGluLCBfVHlwZWREb3VibGVMaXN0TWl4aW48RmxvYXQ2NExpc3Q+CiAgICBpbXBsZW1lbnRzIEZsb2F0NjRMaXN0IHsKICBmYWN0b3J5IF9GbG9hdDY0TGlzdC5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQogIGRvdWJsZSBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEZsb2F0NjQoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkRmxvYXQ2NChpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEZsb2F0NjRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgRmxvYXQ2NExpc3QobGVuZ3RoKTsKICB9CgogIGRvdWJsZSBfZ2V0SW5kZXhlZEZsb2F0NjQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEZsb2F0NjQoaW5kZXggKiBGbG9hdDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEZsb2F0NjQoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKICAgIF9zZXRGbG9hdDY0KGluZGV4ICogRmxvYXQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgRmxvYXQzMng0TGlzdCB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0TGlzdCkKICBmYWN0b3J5IEZsb2F0MzJ4NExpc3QoaW50IGxlbmd0aCkgbmF0aXZlICJUeXBlZERhdGFfRmxvYXQzMng0QXJyYXlfbmV3IjsKCiAgQHBhdGNoCiAgZmFjdG9yeSBGbG9hdDMyeDRMaXN0LmZyb21MaXN0KExpc3Q8RmxvYXQzMng0PiBlbGVtZW50cykgewogICAgcmV0dXJuIG5ldyBGbG9hdDMyeDRMaXN0KGVsZW1lbnRzLmxlbmd0aCkKICAgICAgLi5zZXRSYW5nZSgwLCBlbGVtZW50cy5sZW5ndGgsIGVsZW1lbnRzKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0MzJ4NExpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9GbG9hdDMyeDRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgRmxvYXQzMng0TGlzdCB7CiAgZmFjdG9yeSBfRmxvYXQzMng0TGlzdC5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEZsb2F0MzJ4NChpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEZsb2F0MzJ4NCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldEluZGV4ZWRGbG9hdDMyeDQoaW5kZXgsIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEZsb2F0MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEZsb2F0MzJ4NExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBGbG9hdDMyeDRMaXN0KGxlbmd0aCk7CiAgfQoKICBGbG9hdDMyeDQgX2dldEluZGV4ZWRGbG9hdDMyeDQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEZsb2F0MzJ4NChpbmRleCAqIEZsb2F0MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRGbG9hdDMyeDQoaW50IGluZGV4LCBGbG9hdDMyeDQgdmFsdWUpIHsKICAgIF9zZXRGbG9hdDMyeDQoaW5kZXggKiBGbG9hdDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHBhdGNoCmNsYXNzIEludDMyeDRMaXN0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0TGlzdCkKICBmYWN0b3J5IEludDMyeDRMaXN0KGludCBsZW5ndGgpIG5hdGl2ZSAiVHlwZWREYXRhX0ludDMyeDRBcnJheV9uZXciOwoKICBAcGF0Y2gKICBmYWN0b3J5IEludDMyeDRMaXN0LmZyb21MaXN0KExpc3Q8SW50MzJ4ND4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgSW50MzJ4NExpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfSW50MzJ4NExpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9JbnQzMng0TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEludDMyeDRMaXN0IHsKICBmYWN0b3J5IF9JbnQzMng0TGlzdC5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkSW50MzJ4NChpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEludDMyeDQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkSW50MzJ4NChpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDMyeDRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50MzJ4NExpc3QobGVuZ3RoKTsKICB9CgogIEludDMyeDQgX2dldEluZGV4ZWRJbnQzMng0KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRJbnQzMng0KGluZGV4ICogSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRJbnQzMng0KGludCBpbmRleCwgSW50MzJ4NCB2YWx1ZSkgewogICAgX3NldEludDMyeDQoaW5kZXggKiBJbnQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBGbG9hdDY0eDJMaXN0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0eDJMaXN0KQogIGZhY3RvcnkgRmxvYXQ2NHgyTGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9GbG9hdDY0eDJBcnJheV9uZXciOwoKICBAcGF0Y2gKICBmYWN0b3J5IEZsb2F0NjR4Mkxpc3QuZnJvbUxpc3QoTGlzdDxGbG9hdDY0eDI+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0NjR4Mkxpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRmxvYXQ2NHgyTGlzdCBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0Zsb2F0NjR4Mkxpc3RNaXhpbgogICAgaW1wbGVtZW50cyBGbG9hdDY0eDJMaXN0IHsKICBmYWN0b3J5IF9GbG9hdDY0eDJMaXN0Ll91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93ICJVbnJlYWNoYWJsZSI7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0eDIpCiAgRmxvYXQ2NHgyIG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkRmxvYXQ2NHgyKGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgRmxvYXQ2NHgyIHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEZsb2F0NjR4MihpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgRmxvYXQ2NHgyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0NjR4Mkxpc3QobGVuZ3RoKTsKICB9CgogIEZsb2F0NjR4MiBfZ2V0SW5kZXhlZEZsb2F0NjR4MihpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0RmxvYXQ2NHgyKGluZGV4ICogRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEZsb2F0NjR4MihpbnQgaW5kZXgsIEZsb2F0NjR4MiB2YWx1ZSkgewogICAgX3NldEZsb2F0NjR4MihpbmRleCAqIEZsb2F0NjR4Mkxpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbEludDhBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbiwgX1R5cGVkSW50TGlzdE1peGluPEludDhMaXN0PgogICAgaW1wbGVtZW50cyBJbnQ4TGlzdCB7CiAgZmFjdG9yeSBfRXh0ZXJuYWxJbnQ4QXJyYXkuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgIlVucmVhY2hhYmxlIjsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW50OChpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldEludDgoaW5kZXgsIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDhMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBJbnQ4TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDhMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbFVpbnQ4QXJyYXkgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4sIF9UeXBlZEludExpc3RNaXhpbjxVaW50OExpc3Q+CiAgICBpbXBsZW1lbnRzIFVpbnQ4TGlzdCB7CiAgZmFjdG9yeSBfRXh0ZXJuYWxVaW50OEFycmF5Ll91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93ICJVbnJlYWNoYWJsZSI7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRVaW50OChpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldFVpbnQ4KGluZGV4LCBfdG9VaW50OCh2YWx1ZSkpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gVWludDhMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50OExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50OExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsVWludDhDbGFtcGVkQXJyYXkgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4sIF9UeXBlZEludExpc3RNaXhpbjxVaW50OENsYW1wZWRMaXN0PgogICAgaW1wbGVtZW50cyBVaW50OENsYW1wZWRMaXN0IHsKICBmYWN0b3J5IF9FeHRlcm5hbFVpbnQ4Q2xhbXBlZEFycmF5Ll91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93ICJVbnJlYWNoYWJsZSI7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRVaW50OChpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldFVpbnQ4KGluZGV4LCBfdG9DbGFtcGVkVWludDgodmFsdWUpKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIFVpbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDhDbGFtcGVkTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4Q2xhbXBlZExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsSW50MTZBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbiwgX1R5cGVkSW50TGlzdE1peGluPEludDE2TGlzdD4KICAgIGltcGxlbWVudHMgSW50MTZMaXN0IHsKICBmYWN0b3J5IF9FeHRlcm5hbEludDE2QXJyYXkuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgIlVucmVhY2hhYmxlIjsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEludDE2KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEludDE2KGluZGV4LCBfdG9JbnQxNih2YWx1ZSkpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBJbnQxNkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBJbnQxNkxpc3QobGVuZ3RoKTsKICB9CgogIGludCBfZ2V0SW5kZXhlZEludDE2KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRJbnQxNihpbmRleCAqIEludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEludDE2KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBfc2V0SW50MTYoaW5kZXggKiBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbFVpbnQxNkFycmF5IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluLCBfVHlwZWRJbnRMaXN0TWl4aW48VWludDE2TGlzdD4KICAgIGltcGxlbWVudHMgVWludDE2TGlzdCB7CiAgZmFjdG9yeSBfRXh0ZXJuYWxVaW50MTZBcnJheS5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkVWludDE2KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZFVpbnQxNihpbmRleCwgX3RvVWludDE2KHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50MTZMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDE2TGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkVWludDE2KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRVaW50MTYoaW5kZXggKiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkVWludDE2KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBfc2V0VWludDE2KGluZGV4ICogVWludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsSW50MzJBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbiwgX1R5cGVkSW50TGlzdE1peGluPEludDMyTGlzdD4KICAgIGltcGxlbWVudHMgSW50MzJMaXN0IHsKICBmYWN0b3J5IF9FeHRlcm5hbEludDMyQXJyYXkuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgIlVucmVhY2hhYmxlIjsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEludDMyKGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEludDMyKGluZGV4LCBfdG9JbnQzMih2YWx1ZSkpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBJbnQzMkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBJbnQzMkxpc3QobGVuZ3RoKTsKICB9CgogIGludCBfZ2V0SW5kZXhlZEludDMyKGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRJbnQzMihpbmRleCAqIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBfc2V0SW50MzIoaW5kZXggKiBJbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbFVpbnQzMkFycmF5IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluLCBfVHlwZWRJbnRMaXN0TWl4aW48VWludDMyTGlzdD4KICAgIGltcGxlbWVudHMgVWludDMyTGlzdCB7CiAgZmFjdG9yeSBfRXh0ZXJuYWxVaW50MzJBcnJheS5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkVWludDMyKGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZFVpbnQzMihpbmRleCwgX3RvVWludDMyKHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50MzJMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDMyTGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkVWludDMyKGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRVaW50MzIoaW5kZXggKiBVaW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkVWludDMyKGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBfc2V0VWludDMyKGluZGV4ICogVWludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsSW50NjRBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbiwgX1R5cGVkSW50TGlzdE1peGluPEludDY0TGlzdD4KICAgIGltcGxlbWVudHMgSW50NjRMaXN0IHsKICBmYWN0b3J5IF9FeHRlcm5hbEludDY0QXJyYXkuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgIlVucmVhY2hhYmxlIjsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEludDY0KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEludDY0KGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDY0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDY0TGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkSW50NjQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEludDY0KGluZGV4ICogSW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkSW50NjQoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIF9zZXRJbnQ2NChpbmRleCAqIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsVWludDY0QXJyYXkgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4sIF9UeXBlZEludExpc3RNaXhpbjxVaW50NjRMaXN0PgogICAgaW1wbGVtZW50cyBVaW50NjRMaXN0IHsKICBmYWN0b3J5IF9FeHRlcm5hbFVpbnQ2NEFycmF5Ll91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93ICJVbnJlYWNoYWJsZSI7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRVaW50NjQoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkVWludDY0KGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50NjRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDY0TGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkVWludDY0KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRVaW50NjQoaW5kZXggKiBVaW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkVWludDY0KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBfc2V0VWludDY0KGluZGV4ICogVWludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsRmxvYXQzMkFycmF5IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfRG91YmxlTGlzdE1peGluLCBfVHlwZWREb3VibGVMaXN0TWl4aW48RmxvYXQzMkxpc3Q+CiAgICBpbXBsZW1lbnRzIEZsb2F0MzJMaXN0IHsKICBmYWN0b3J5IF9FeHRlcm5hbEZsb2F0MzJBcnJheS5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgZG91YmxlIG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkRmxvYXQzMihpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldEluZGV4ZWRGbG9hdDMyKGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBGbG9hdDMyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgRmxvYXQzMkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBGbG9hdDMyTGlzdChsZW5ndGgpOwogIH0KCiAgZG91YmxlIF9nZXRJbmRleGVkRmxvYXQzMihpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0RmxvYXQzMihpbmRleCAqIEZsb2F0MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkRmxvYXQzMihpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewogICAgX3NldEZsb2F0MzIoaW5kZXggKiBGbG9hdDMyTGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsRmxvYXQ2NEFycmF5IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfRG91YmxlTGlzdE1peGluLCBfVHlwZWREb3VibGVMaXN0TWl4aW48RmxvYXQ2NExpc3Q+CiAgICBpbXBsZW1lbnRzIEZsb2F0NjRMaXN0IHsKICBmYWN0b3J5IF9FeHRlcm5hbEZsb2F0NjRBcnJheS5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgZG91YmxlIG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkRmxvYXQ2NChpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldEluZGV4ZWRGbG9hdDY0KGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBGbG9hdDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgRmxvYXQ2NExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBGbG9hdDY0TGlzdChsZW5ndGgpOwogIH0KCiAgZG91YmxlIF9nZXRJbmRleGVkRmxvYXQ2NChpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0RmxvYXQ2NChpbmRleCAqIEZsb2F0NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkRmxvYXQ2NChpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewogICAgX3NldEZsb2F0NjQoaW5kZXggKiBGbG9hdDY0TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsRmxvYXQzMng0QXJyYXkgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9GbG9hdDMyeDRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgRmxvYXQzMng0TGlzdCB7CiAgZmFjdG9yeSBfRXh0ZXJuYWxGbG9hdDMyeDRBcnJheS5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgRmxvYXQzMng0IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkRmxvYXQzMng0KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgRmxvYXQzMng0IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEZsb2F0MzJ4NChpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgRmxvYXQzMng0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NExpc3QobGVuZ3RoKTsKICB9CgogIEZsb2F0MzJ4NCBfZ2V0SW5kZXhlZEZsb2F0MzJ4NChpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0RmxvYXQzMng0KGluZGV4ICogRmxvYXQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEZsb2F0MzJ4NChpbnQgaW5kZXgsIEZsb2F0MzJ4NCB2YWx1ZSkgewogICAgX3NldEZsb2F0MzJ4NChpbmRleCAqIEZsb2F0MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbEludDMyeDRBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludDMyeDRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgSW50MzJ4NExpc3QgewogIGZhY3RvcnkgX0V4dGVybmFsSW50MzJ4NEFycmF5Ll91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93ICJVbnJlYWNoYWJsZSI7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KICBJbnQzMng0IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkSW50MzJ4NChpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEludDMyeDQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkSW50MzJ4NChpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDMyeDRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50MzJ4NExpc3QobGVuZ3RoKTsKICB9CgogIEludDMyeDQgX2dldEluZGV4ZWRJbnQzMng0KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRJbnQzMng0KGluZGV4ICogSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRJbnQzMng0KGludCBpbmRleCwgSW50MzJ4NCB2YWx1ZSkgewogICAgX3NldEludDMyeDQoaW5kZXggKiBJbnQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsRmxvYXQ2NHgyQXJyYXkgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9GbG9hdDY0eDJMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgRmxvYXQ2NHgyTGlzdCB7CiAgZmFjdG9yeSBfRXh0ZXJuYWxGbG9hdDY0eDJBcnJheS5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgRmxvYXQ2NHgyIG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkRmxvYXQ2NHgyKGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgRmxvYXQ2NHgyIHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEZsb2F0NjR4MihpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgRmxvYXQ2NHgyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0NjR4Mkxpc3QobGVuZ3RoKTsKICB9CgogIEZsb2F0NjR4MiBfZ2V0SW5kZXhlZEZsb2F0NjR4MihpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0RmxvYXQ2NHgyKGluZGV4ICogRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEZsb2F0NjR4MihpbnQgaW5kZXgsIEZsb2F0NjR4MiB2YWx1ZSkgewogICAgX3NldEZsb2F0NjR4MihpbmRleCAqIEZsb2F0NjR4Mkxpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgRmxvYXQzMng0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgZmFjdG9yeSBGbG9hdDMyeDQoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeiwgZG91YmxlIHcpCiAgICAgIG5hdGl2ZSAiRmxvYXQzMng0X2Zyb21Eb3VibGVzIjsKCiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIGZhY3RvcnkgRmxvYXQzMng0LnNwbGF0KGRvdWJsZSB2KSBuYXRpdmUgIkZsb2F0MzJ4NF9zcGxhdCI7CgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBmYWN0b3J5IEZsb2F0MzJ4NC56ZXJvKCkgbmF0aXZlICJGbG9hdDMyeDRfemVybyI7CgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBmYWN0b3J5IEZsb2F0MzJ4NC5mcm9tSW50MzJ4NEJpdHMoSW50MzJ4NCB4KQogICAgICBuYXRpdmUgIkZsb2F0MzJ4NF9mcm9tSW50MzJ4NEJpdHMiOwoKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgZmFjdG9yeSBGbG9hdDMyeDQuZnJvbUZsb2F0NjR4MihGbG9hdDY0eDIgdikgbmF0aXZlICJGbG9hdDMyeDRfZnJvbUZsb2F0NjR4MiI7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0MzJ4NCBpbXBsZW1lbnRzIEZsb2F0MzJ4NCB7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBvcGVyYXRvciArKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfYWRkIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IG9wZXJhdG9yIC0oKSBuYXRpdmUgIkZsb2F0MzJ4NF9uZWdhdGUiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgb3BlcmF0b3IgLShGbG9hdDMyeDQgb3RoZXIpIG5hdGl2ZSAiRmxvYXQzMng0X3N1YiI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBvcGVyYXRvciAqKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfbXVsIjsKICBGbG9hdDMyeDQgb3BlcmF0b3IgLyhGbG9hdDMyeDQgb3RoZXIpIG5hdGl2ZSAiRmxvYXQzMng0X2RpdiI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IGxlc3NUaGFuKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfY21wbHQiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyeDQpCiAgSW50MzJ4NCBsZXNzVGhhbk9yRXF1YWwoRmxvYXQzMng0IG90aGVyKSBuYXRpdmUgIkZsb2F0MzJ4NF9jbXBsdGUiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyeDQpCiAgSW50MzJ4NCBncmVhdGVyVGhhbihGbG9hdDMyeDQgb3RoZXIpIG5hdGl2ZSAiRmxvYXQzMng0X2NtcGd0IjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0KQogIEludDMyeDQgZ3JlYXRlclRoYW5PckVxdWFsKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfY21wZ3RlIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0KQogIEludDMyeDQgZXF1YWwoRmxvYXQzMng0IG90aGVyKSBuYXRpdmUgIkZsb2F0MzJ4NF9jbXBlcXVhbCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IG5vdEVxdWFsKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfY21wbmVxdWFsIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IHNjYWxlKGRvdWJsZSBzKSBuYXRpdmUgIkZsb2F0MzJ4NF9zY2FsZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBhYnMoKSBuYXRpdmUgIkZsb2F0MzJ4NF9hYnMiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgY2xhbXAoRmxvYXQzMng0IGxvd2VyTGltaXQsIEZsb2F0MzJ4NCB1cHBlckxpbWl0KQogICAgICBuYXRpdmUgIkZsb2F0MzJ4NF9jbGFtcCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQogIGRvdWJsZSBnZXQgeCBuYXRpdmUgIkZsb2F0MzJ4NF9nZXRYIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCiAgZG91YmxlIGdldCB5IG5hdGl2ZSAiRmxvYXQzMng0X2dldFkiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKICBkb3VibGUgZ2V0IHogbmF0aXZlICJGbG9hdDMyeDRfZ2V0WiI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQogIGRvdWJsZSBnZXQgdyBuYXRpdmUgIkZsb2F0MzJ4NF9nZXRXIjsKICBpbnQgZ2V0IHNpZ25NYXNrIG5hdGl2ZSAiRmxvYXQzMng0X2dldFNpZ25NYXNrIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBzaHVmZmxlKGludCBtYXNrKSBuYXRpdmUgIkZsb2F0MzJ4NF9zaHVmZmxlIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IHNodWZmbGVNaXgoRmxvYXQzMng0IHp3LCBpbnQgbWFzaykgbmF0aXZlICJGbG9hdDMyeDRfc2h1ZmZsZU1peCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgd2l0aFgoZG91YmxlIHgpIG5hdGl2ZSAiRmxvYXQzMng0X3NldFgiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgd2l0aFkoZG91YmxlIHkpIG5hdGl2ZSAiRmxvYXQzMng0X3NldFkiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgd2l0aFooZG91YmxlIHopIG5hdGl2ZSAiRmxvYXQzMng0X3NldFoiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgd2l0aFcoZG91YmxlIHcpIG5hdGl2ZSAiRmxvYXQzMng0X3NldFciOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgbWluKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfbWluIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IG1heChGbG9hdDMyeDQgb3RoZXIpIG5hdGl2ZSAiRmxvYXQzMng0X21heCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBzcXJ0KCkgbmF0aXZlICJGbG9hdDMyeDRfc3FydCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCByZWNpcHJvY2FsKCkgbmF0aXZlICJGbG9hdDMyeDRfcmVjaXByb2NhbCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCByZWNpcHJvY2FsU3FydCgpIG5hdGl2ZSAiRmxvYXQzMng0X3JlY2lwcm9jYWxTcXJ0IjsKfQoKQHBhdGNoCmNsYXNzIEludDMyeDQgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyeDQpCiAgZmFjdG9yeSBJbnQzMng0KGludCB4LCBpbnQgeSwgaW50IHosIGludCB3KSBuYXRpdmUgIkludDMyeDRfZnJvbUludHMiOwoKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0KQogIGZhY3RvcnkgSW50MzJ4NC5ib29sKGJvb2wgeCwgYm9vbCB5LCBib29sIHosIGJvb2wgdykKICAgICAgbmF0aXZlICJJbnQzMng0X2Zyb21Cb29scyI7CgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyeDQpCiAgZmFjdG9yeSBJbnQzMng0LmZyb21GbG9hdDMyeDRCaXRzKEZsb2F0MzJ4NCB4KQogICAgICBuYXRpdmUgIkludDMyeDRfZnJvbUZsb2F0MzJ4NEJpdHMiOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9JbnQzMng0IGltcGxlbWVudHMgSW50MzJ4NCB7CiAgSW50MzJ4NCBvcGVyYXRvciB8KEludDMyeDQgb3RoZXIpIG5hdGl2ZSAiSW50MzJ4NF9vciI7CiAgSW50MzJ4NCBvcGVyYXRvciAmKEludDMyeDQgb3RoZXIpIG5hdGl2ZSAiSW50MzJ4NF9hbmQiOwogIEludDMyeDQgb3BlcmF0b3IgXihJbnQzMng0IG90aGVyKSBuYXRpdmUgIkludDMyeDRfeG9yIjsKICBJbnQzMng0IG9wZXJhdG9yICsoSW50MzJ4NCBvdGhlcikgbmF0aXZlICJJbnQzMng0X2FkZCI7CiAgSW50MzJ4NCBvcGVyYXRvciAtKEludDMyeDQgb3RoZXIpIG5hdGl2ZSAiSW50MzJ4NF9zdWIiOwogIGludCBnZXQgeCBuYXRpdmUgIkludDMyeDRfZ2V0WCI7CiAgaW50IGdldCB5IG5hdGl2ZSAiSW50MzJ4NF9nZXRZIjsKICBpbnQgZ2V0IHogbmF0aXZlICJJbnQzMng0X2dldFoiOwogIGludCBnZXQgdyBuYXRpdmUgIkludDMyeDRfZ2V0VyI7CiAgaW50IGdldCBzaWduTWFzayBuYXRpdmUgIkludDMyeDRfZ2V0U2lnbk1hc2siOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyeDQpCiAgSW50MzJ4NCBzaHVmZmxlKGludCBtYXNrKSBuYXRpdmUgIkludDMyeDRfc2h1ZmZsZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IHNodWZmbGVNaXgoSW50MzJ4NCB6dywgaW50IG1hc2spIG5hdGl2ZSAiSW50MzJ4NF9zaHVmZmxlTWl4IjsKICBJbnQzMng0IHdpdGhYKGludCB4KSBuYXRpdmUgIkludDMyeDRfc2V0WCI7CiAgSW50MzJ4NCB3aXRoWShpbnQgeSkgbmF0aXZlICJJbnQzMng0X3NldFkiOwogIEludDMyeDQgd2l0aFooaW50IHopIG5hdGl2ZSAiSW50MzJ4NF9zZXRaIjsKICBJbnQzMng0IHdpdGhXKGludCB3KSBuYXRpdmUgIkludDMyeDRfc2V0VyI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGZsYWdYIG5hdGl2ZSAiSW50MzJ4NF9nZXRGbGFnWCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGZsYWdZIG5hdGl2ZSAiSW50MzJ4NF9nZXRGbGFnWSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGZsYWdaIG5hdGl2ZSAiSW50MzJ4NF9nZXRGbGFnWiI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGZsYWdXIG5hdGl2ZSAiSW50MzJ4NF9nZXRGbGFnVyI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IHdpdGhGbGFnWChib29sIHgpIG5hdGl2ZSAiSW50MzJ4NF9zZXRGbGFnWCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IHdpdGhGbGFnWShib29sIHkpIG5hdGl2ZSAiSW50MzJ4NF9zZXRGbGFnWSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IHdpdGhGbGFnWihib29sIHopIG5hdGl2ZSAiSW50MzJ4NF9zZXRGbGFnWiI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IHdpdGhGbGFnVyhib29sIHcpIG5hdGl2ZSAiSW50MzJ4NF9zZXRGbGFnVyI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBzZWxlY3QoRmxvYXQzMng0IHRydWVWYWx1ZSwgRmxvYXQzMng0IGZhbHNlVmFsdWUpCiAgICAgIG5hdGl2ZSAiSW50MzJ4NF9zZWxlY3QiOwp9CgpAcGF0Y2gKY2xhc3MgRmxvYXQ2NHgyIHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0eDIpCiAgZmFjdG9yeSBGbG9hdDY0eDIoZG91YmxlIHgsIGRvdWJsZSB5KSBuYXRpdmUgIkZsb2F0NjR4Ml9mcm9tRG91YmxlcyI7CgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBmYWN0b3J5IEZsb2F0NjR4Mi5zcGxhdChkb3VibGUgdikgbmF0aXZlICJGbG9hdDY0eDJfc3BsYXQiOwoKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0eDIpCiAgZmFjdG9yeSBGbG9hdDY0eDIuemVybygpIG5hdGl2ZSAiRmxvYXQ2NHgyX3plcm8iOwoKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0eDIpCiAgZmFjdG9yeSBGbG9hdDY0eDIuZnJvbUZsb2F0MzJ4NChGbG9hdDMyeDQgdikgbmF0aXZlICJGbG9hdDY0eDJfZnJvbUZsb2F0MzJ4NCI7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0NjR4MiBpbXBsZW1lbnRzIEZsb2F0NjR4MiB7CiAgRmxvYXQ2NHgyIG9wZXJhdG9yICsoRmxvYXQ2NHgyIG90aGVyKSBuYXRpdmUgIkZsb2F0NjR4Ml9hZGQiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBGbG9hdDY0eDIgb3BlcmF0b3IgLSgpIG5hdGl2ZSAiRmxvYXQ2NHgyX25lZ2F0ZSI7CiAgRmxvYXQ2NHgyIG9wZXJhdG9yIC0oRmxvYXQ2NHgyIG90aGVyKSBuYXRpdmUgIkZsb2F0NjR4Ml9zdWIiOwogIEZsb2F0NjR4MiBvcGVyYXRvciAqKEZsb2F0NjR4MiBvdGhlcikgbmF0aXZlICJGbG9hdDY0eDJfbXVsIjsKICBGbG9hdDY0eDIgb3BlcmF0b3IgLyhGbG9hdDY0eDIgb3RoZXIpIG5hdGl2ZSAiRmxvYXQ2NHgyX2RpdiI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQ2NHgyKQogIEZsb2F0NjR4MiBzY2FsZShkb3VibGUgcykgbmF0aXZlICJGbG9hdDY0eDJfc2NhbGUiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBGbG9hdDY0eDIgYWJzKCkgbmF0aXZlICJGbG9hdDY0eDJfYWJzIjsKICBGbG9hdDY0eDIgY2xhbXAoRmxvYXQ2NHgyIGxvd2VyTGltaXQsIEZsb2F0NjR4MiB1cHBlckxpbWl0KQogICAgICBuYXRpdmUgIkZsb2F0NjR4Ml9jbGFtcCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQogIGRvdWJsZSBnZXQgeCBuYXRpdmUgIkZsb2F0NjR4Ml9nZXRYIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCiAgZG91YmxlIGdldCB5IG5hdGl2ZSAiRmxvYXQ2NHgyX2dldFkiOwogIGludCBnZXQgc2lnbk1hc2sgbmF0aXZlICJGbG9hdDY0eDJfZ2V0U2lnbk1hc2siOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBGbG9hdDY0eDIgd2l0aFgoZG91YmxlIHgpIG5hdGl2ZSAiRmxvYXQ2NHgyX3NldFgiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBGbG9hdDY0eDIgd2l0aFkoZG91YmxlIHkpIG5hdGl2ZSAiRmxvYXQ2NHgyX3NldFkiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBGbG9hdDY0eDIgbWluKEZsb2F0NjR4MiBvdGhlcikgbmF0aXZlICJGbG9hdDY0eDJfbWluIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0eDIpCiAgRmxvYXQ2NHgyIG1heChGbG9hdDY0eDIgb3RoZXIpIG5hdGl2ZSAiRmxvYXQ2NHgyX21heCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQ2NHgyKQogIEZsb2F0NjR4MiBzcXJ0KCkgbmF0aXZlICJGbG9hdDY0eDJfc3FydCI7Cn0KCmNsYXNzIF9UeXBlZExpc3RJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBMaXN0PEU+IF9hcnJheTsKICBmaW5hbCBpbnQgX2xlbmd0aDsKICBpbnQgX3Bvc2l0aW9uOwogIEUgX2N1cnJlbnQ7CgogIF9UeXBlZExpc3RJdGVyYXRvcihMaXN0IGFycmF5KQogICAgICA6IF9hcnJheSA9IGFycmF5LAogICAgICAgIF9sZW5ndGggPSBhcnJheS5sZW5ndGgsCiAgICAgICAgX3Bvc2l0aW9uID0gLTEgewogICAgYXNzZXJ0KGFycmF5IGlzIF9UeXBlZExpc3QgfHwgYXJyYXkgaXMgX1R5cGVkTGlzdFZpZXcpOwogIH0KCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGludCBuZXh0UG9zaXRpb24gPSBfcG9zaXRpb24gKyAxOwogICAgaWYgKG5leHRQb3NpdGlvbiA8IF9sZW5ndGgpIHsKICAgICAgX2N1cnJlbnQgPSBfYXJyYXlbbmV4dFBvc2l0aW9uXTsKICAgICAgX3Bvc2l0aW9uID0gbmV4dFBvc2l0aW9uOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9wb3NpdGlvbiA9IF9sZW5ndGg7CiAgICBfY3VycmVudCA9IG51bGw7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBFIGdldCBjdXJyZW50ID0+IF9jdXJyZW50Owp9CgphYnN0cmFjdCBjbGFzcyBfVHlwZWRMaXN0VmlldyBleHRlbmRzIF9UeXBlZExpc3RCYXNlIGltcGxlbWVudHMgVHlwZWREYXRhIHsKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgoKICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXMgewogICAgcmV0dXJuIGxlbmd0aCAqIGVsZW1lbnRTaXplSW5CeXRlczsKICB9CgogIF9CeXRlQnVmZmVyIGdldCBidWZmZXIgewogICAgcmV0dXJuIF90eXBlZERhdGEuYnVmZmVyOwogIH0KCiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBfVHlwZWRMaXN0IGdldCBfdHlwZWREYXRhIG5hdGl2ZSAiVHlwZWREYXRhVmlld190eXBlZERhdGEiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzIG5hdGl2ZSAiVHlwZWREYXRhVmlld19vZmZzZXRJbkJ5dGVzIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIGludCBnZXQgbGVuZ3RoIG5hdGl2ZSAiVHlwZWREYXRhVmlld19sZW5ndGgiOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9JbnQ4QXJyYXlWaWV3IGV4dGVuZHMgX1R5cGVkTGlzdFZpZXcKICAgIHdpdGggX0ludExpc3RNaXhpbiwgX1R5cGVkSW50TGlzdE1peGluPEludDhMaXN0PgogICAgaW1wbGVtZW50cyBJbnQ4TGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50OEFycmF5VmlldykKICBmYWN0b3J5IF9JbnQ4QXJyYXlWaWV3Ll8oX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfSW50OEFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRJbnQ4KG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBJbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQpKTsKICB9CgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRJbnQ4KAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBJbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQpLCBfdG9JbnQ4KHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDhMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBJbnQ4TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDhMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9VaW50OEFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4sIF9UeXBlZEludExpc3RNaXhpbjxVaW50OExpc3Q+CiAgICBpbXBsZW1lbnRzIFVpbnQ4TGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfVWludDhBcnJheVZpZXcpCiAgZmFjdG9yeSBfVWludDhBcnJheVZpZXcuXyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhVmlld19VaW50OEFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRVaW50OChvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogVWludDhMaXN0LmJ5dGVzUGVyRWxlbWVudCkpOwogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldFVpbnQ4KAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBVaW50OExpc3QuYnl0ZXNQZXJFbGVtZW50KSwgX3RvVWludDgodmFsdWUpKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gVWludDhMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50OExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50OExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1VpbnQ4Q2xhbXBlZEFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4sIF9UeXBlZEludExpc3RNaXhpbjxVaW50OENsYW1wZWRMaXN0PgogICAgaW1wbGVtZW50cyBVaW50OENsYW1wZWRMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9VaW50OENsYW1wZWRBcnJheVZpZXcpCiAgZmFjdG9yeSBfVWludDhDbGFtcGVkQXJyYXlWaWV3Ll8oX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLAogICAgICBpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfVWludDhDbGFtcGVkQXJyYXlWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldFVpbnQ4KG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBVaW50OExpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0VWludDgob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIFVpbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQpLAogICAgICAgIF90b0NsYW1wZWRVaW50OCh2YWx1ZSkpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50OExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIFVpbnQ4Q2xhbXBlZExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50OENsYW1wZWRMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9JbnQxNkFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4sIF9UeXBlZEludExpc3RNaXhpbjxJbnQxNkxpc3Q+CiAgICBpbXBsZW1lbnRzIEludDE2TGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MTZBcnJheVZpZXcpCiAgZmFjdG9yeSBfSW50MTZBcnJheVZpZXcuXyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhVmlld19JbnQxNkFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRJbnQxNihvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCkpOwogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldEludDE2KAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50KSwgX3RvSW50MTYodmFsdWUpKTsKICB9CgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZSBpdGVyYWJsZSwgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgaWYgKGl0ZXJhYmxlIGlzIENvZGVVbml0cykgewogICAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgICAgaW50IGJ5dGVTdGFydCA9IHRoaXMub2Zmc2V0SW5CeXRlcyArIHN0YXJ0ICogSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgICAgX3R5cGVkRGF0YS5fc2V0Q29kZVVuaXRzKGl0ZXJhYmxlLCBieXRlU3RhcnQsIGxlbmd0aCwgc2tpcENvdW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLnNldFJhbmdlKHN0YXJ0LCBlbmQsIGl0ZXJhYmxlLCBza2lwQ291bnQpOwogICAgfQogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgoKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBJbnQxNkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBJbnQxNkxpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1VpbnQxNkFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4sIF9UeXBlZEludExpc3RNaXhpbjxVaW50MTZMaXN0PgogICAgaW1wbGVtZW50cyBVaW50MTZMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9VaW50MTZBcnJheVZpZXcpCiAgZmFjdG9yeSBfVWludDE2QXJyYXlWaWV3Ll8oX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfVWludDE2QXJyYXlWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldFVpbnQxNihvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogVWludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQpKTsKICB9CgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRVaW50MTYoCiAgICAgICAgb2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIFVpbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50KSwgX3RvVWludDE2KHZhbHVlKSk7CiAgfQoKICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGUgaXRlcmFibGUsIFtpbnQgc2tpcENvdW50ID0gMF0pIHsKICAgIGlmIChpdGVyYWJsZSBpcyBDb2RlVW5pdHMpIHsKICAgICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgICBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICAgIGludCBieXRlU3RhcnQgPSB0aGlzLm9mZnNldEluQnl0ZXMgKyBzdGFydCAqIFVpbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgICBfdHlwZWREYXRhLl9zZXRDb2RlVW5pdHMoaXRlcmFibGUsIGJ5dGVTdGFydCwgbGVuZ3RoLCBza2lwQ291bnQpOwogICAgfSBlbHNlIHsKICAgICAgc3VwZXIuc2V0UmFuZ2Uoc3RhcnQsIGVuZCwgaXRlcmFibGUsIHNraXBDb3VudCk7CiAgICB9CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KCiAgVWludDE2TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQxNkxpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ludDMyQXJyYXlWaWV3IGV4dGVuZHMgX1R5cGVkTGlzdFZpZXcKICAgIHdpdGggX0ludExpc3RNaXhpbiwgX1R5cGVkSW50TGlzdE1peGluPEludDMyTGlzdD4KICAgIGltcGxlbWVudHMgSW50MzJMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMkFycmF5VmlldykKICBmYWN0b3J5IF9JbnQzMkFycmF5Vmlldy5fKF9UeXBlZExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkKICAgICAgbmF0aXZlICJUeXBlZERhdGFWaWV3X0ludDMyQXJyYXlWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldEludDMyKG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBJbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0SW50MzIoCiAgICAgICAgb2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpLCBfdG9JbnQzMih2YWx1ZSkpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDMyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDMyTGlzdChsZW5ndGgpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVWludDMyQXJyYXlWaWV3IGV4dGVuZHMgX1R5cGVkTGlzdFZpZXcKICAgIHdpdGggX0ludExpc3RNaXhpbiwgX1R5cGVkSW50TGlzdE1peGluPFVpbnQzMkxpc3Q+CiAgICBpbXBsZW1lbnRzIFVpbnQzMkxpc3QgewogIC8vIENvbnN0cnVjdG9yLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX1VpbnQzMkFycmF5VmlldykKICBmYWN0b3J5IF9VaW50MzJBcnJheVZpZXcuXyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhVmlld19VaW50MzJBcnJheVZpZXdfbmV3IjsKCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBMaXN0IGludGVyZmFjZS4KICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX3R5cGVkRGF0YQogICAgICAgIC5fZ2V0VWludDMyKG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBVaW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCkpOwogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldFVpbnQzMigKICAgICAgICBvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogVWludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpLCBfdG9VaW50MzIodmFsdWUpKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gVWludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDMyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQzMkxpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ludDY0QXJyYXlWaWV3IGV4dGVuZHMgX1R5cGVkTGlzdFZpZXcKICAgIHdpdGggX0ludExpc3RNaXhpbiwgX1R5cGVkSW50TGlzdE1peGluPEludDY0TGlzdD4KICAgIGltcGxlbWVudHMgSW50NjRMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQ2NEFycmF5VmlldykKICBmYWN0b3J5IF9JbnQ2NEFycmF5Vmlldy5fKF9UeXBlZExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkKICAgICAgbmF0aXZlICJUeXBlZERhdGFWaWV3X0ludDY0QXJyYXlWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldEludDY0KG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBJbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0SW50NjQoCiAgICAgICAgb2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpLCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgSW50NjRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50NjRMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9VaW50NjRBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfSW50TGlzdE1peGluLCBfVHlwZWRJbnRMaXN0TWl4aW48VWludDY0TGlzdD4KICAgIGltcGxlbWVudHMgVWludDY0TGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfVWludDY0QXJyYXlWaWV3KQogIGZhY3RvcnkgX1VpbnQ2NEFycmF5Vmlldy5fKF9UeXBlZExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkKICAgICAgbmF0aXZlICJUeXBlZERhdGFWaWV3X1VpbnQ2NEFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRVaW50NjQob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIFVpbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0VWludDY0KAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBVaW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCksIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gVWludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDY0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ2NExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0MzJBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfRG91YmxlTGlzdE1peGluLCBfVHlwZWREb3VibGVMaXN0TWl4aW48RmxvYXQzMkxpc3Q+CiAgICBpbXBsZW1lbnRzIEZsb2F0MzJMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyQXJyYXlWaWV3KQogIGZhY3RvcnkgX0Zsb2F0MzJBcnJheVZpZXcuXyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhVmlld19GbG9hdDMyQXJyYXlWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgZG91YmxlIG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldEZsb2F0MzIob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEZsb2F0MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCkpOwogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldEZsb2F0MzIoCiAgICAgICAgb2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEZsb2F0MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCksIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEZsb2F0MzJMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgRmxvYXQzMkxpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0NjRBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfRG91YmxlTGlzdE1peGluLCBfVHlwZWREb3VibGVMaXN0TWl4aW48RmxvYXQ2NExpc3Q+CiAgICBpbXBsZW1lbnRzIEZsb2F0NjRMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0QXJyYXlWaWV3KQogIGZhY3RvcnkgX0Zsb2F0NjRBcnJheVZpZXcuXyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhVmlld19GbG9hdDY0QXJyYXlWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgZG91YmxlIG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldEZsb2F0NjQob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEZsb2F0NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCkpOwogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldEZsb2F0NjQoCiAgICAgICAgb2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEZsb2F0NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCksIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEZsb2F0NjRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgRmxvYXQ2NExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0MzJ4NEFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9GbG9hdDMyeDRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgRmxvYXQzMng0TGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0QXJyYXlWaWV3KQogIGZhY3RvcnkgX0Zsb2F0MzJ4NEFycmF5Vmlldy5fKF9UeXBlZExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0SW5CeXRlcywKICAgICAgaW50IGxlbmd0aCkgbmF0aXZlICJUeXBlZERhdGFWaWV3X0Zsb2F0MzJ4NEFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIEZsb2F0MzJ4NCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRGbG9hdDMyeDQob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEZsb2F0MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEZsb2F0MzJ4NCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0RmxvYXQzMng0KAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBGbG9hdDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCksIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgRmxvYXQzMng0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ludDMyeDRBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfSW50MzJ4NExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBJbnQzMng0TGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NEFycmF5VmlldykKICBmYWN0b3J5IF9JbnQzMng0QXJyYXlWaWV3Ll8oX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfSW50MzJ4NEFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIEludDMyeDQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX3R5cGVkRGF0YQogICAgICAgIC5fZ2V0SW50MzJ4NChvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEludDMyeDQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldEludDMyeDQoCiAgICAgICAgb2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEludDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCksIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDMyeDRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50MzJ4NExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0NjR4MkFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9GbG9hdDY0eDJMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgRmxvYXQ2NHgyTGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQ2NHgyQXJyYXlWaWV3KQogIGZhY3RvcnkgX0Zsb2F0NjR4MkFycmF5Vmlldy5fKF9UeXBlZExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0SW5CeXRlcywKICAgICAgaW50IGxlbmd0aCkgbmF0aXZlICJUeXBlZERhdGFWaWV3X0Zsb2F0NjR4MkFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIEZsb2F0NjR4MiBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRGbG9hdDY0eDIob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEZsb2F0NjR4Mkxpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEZsb2F0NjR4MiB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0RmxvYXQ2NHgyKAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBGbG9hdDY0eDJMaXN0LmJ5dGVzUGVyRWxlbWVudCksIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgRmxvYXQ2NHgyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0NjR4Mkxpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0J5dGVEYXRhVmlldyBpbXBsZW1lbnRzIEJ5dGVEYXRhIHsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9CeXRlRGF0YVZpZXcpCiAgZmFjdG9yeSBfQnl0ZURhdGFWaWV3Ll8oX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfQnl0ZURhdGFWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBfQnl0ZUJ1ZmZlciBnZXQgYnVmZmVyIHsKICAgIHJldHVybiBfdHlwZWREYXRhLmJ1ZmZlcjsKICB9CgogIGludCBnZXQgbGVuZ3RoSW5CeXRlcyB7CiAgICByZXR1cm4gbGVuZ3RoOwogIH0KCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIDE7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIEJ5dGVEYXRhIGludGVyZmFjZS4KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgaW50IGdldEludDgoaW50IGJ5dGVPZmZzZXQpIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChieXRlT2Zmc2V0LCB0aGlzLCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEuX2dldEludDgob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQpOwogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgdm9pZCBzZXRJbnQ4KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUpIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChieXRlT2Zmc2V0LCB0aGlzLCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0SW50OChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwgdmFsdWUpOwogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgaW50IGdldFVpbnQ4KGludCBieXRlT2Zmc2V0KSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoYnl0ZU9mZnNldCwgdGhpcywgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhLl9nZXRVaW50OChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCk7CiAgfQoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICB2b2lkIHNldFVpbnQ4KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUpIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChieXRlT2Zmc2V0LCB0aGlzLCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0VWludDgob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQsIHZhbHVlKTsKICB9CgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIGludCBnZXRJbnQxNihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgKyAxID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShieXRlT2Zmc2V0LCAwLCBsZW5ndGggLSAyLCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF90eXBlZERhdGEuX2dldEludDE2KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0KTsKICAgIGlmIChpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkpIHsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBfYnl0ZVN3YXAxNihyZXN1bHQpLnRvU2lnbmVkKDE2KTsKICB9CgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIHZvaWQgc2V0SW50MTYoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgKyAxID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShieXRlT2Zmc2V0LCAwLCBsZW5ndGggLSAyLCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0SW50MTYob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQsCiAgICAgICAgaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpID8gdmFsdWUgOiBfYnl0ZVN3YXAxNih2YWx1ZSkpOwogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgaW50IGdldFVpbnQxNihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgKyAxID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShieXRlT2Zmc2V0LCAwLCBsZW5ndGggLSAyLCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF90eXBlZERhdGEuX2dldFVpbnQxNihvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCk7CiAgICBpZiAoaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gX2J5dGVTd2FwMTYocmVzdWx0KTsKICB9CgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIHZvaWQgc2V0VWludDE2KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgMSA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gMiwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldFVpbnQxNihvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwKICAgICAgICBpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkgPyB2YWx1ZSA6IF9ieXRlU3dhcDE2KHZhbHVlKSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBpbnQgZ2V0SW50MzIoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgMyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gNCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfdHlwZWREYXRhLl9nZXRJbnQzMihvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCk7CiAgICBpZiAoaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gX2J5dGVTd2FwMzIocmVzdWx0KS50b1NpZ25lZCgzMik7CiAgfQoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICB2b2lkIHNldEludDMyKGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgMyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gNCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldEludDMyKG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0LAogICAgICAgIGlkZW50aWNhbChlbmRpYW4sIEVuZGlhbi5ob3N0KSA/IHZhbHVlIDogX2J5dGVTd2FwMzIodmFsdWUpKTsKICB9CgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIGludCBnZXRVaW50MzIoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgMyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gNCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfdHlwZWREYXRhLl9nZXRVaW50MzIob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQpOwogICAgaWYgKGlkZW50aWNhbChlbmRpYW4sIEVuZGlhbi5ob3N0KSkgewogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIF9ieXRlU3dhcDMyKHJlc3VsdCk7CiAgfQoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICB2b2lkIHNldFVpbnQzMihpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDMgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDQsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRVaW50MzIob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQsCiAgICAgICAgaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpID8gdmFsdWUgOiBfYnl0ZVN3YXAzMih2YWx1ZSkpOwogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgaW50IGdldEludDY0KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDcgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDgsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX3R5cGVkRGF0YS5fZ2V0SW50NjQob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQpOwogICAgaWYgKGlkZW50aWNhbChlbmRpYW4sIEVuZGlhbi5ob3N0KSkgewogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIF9ieXRlU3dhcDY0KHJlc3VsdCkudG9TaWduZWQoNjQpOwogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgdm9pZCBzZXRJbnQ2NChpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDcgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDgsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRJbnQ2NChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwKICAgICAgICBpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkgPyB2YWx1ZSA6IF9ieXRlU3dhcDY0KHZhbHVlKSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBpbnQgZ2V0VWludDY0KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDcgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDgsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX3R5cGVkRGF0YS5fZ2V0VWludDY0KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0KTsKICAgIGlmIChpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkpIHsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBfYnl0ZVN3YXA2NChyZXN1bHQpOwogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgdm9pZCBzZXRVaW50NjQoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgKyA3ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShieXRlT2Zmc2V0LCAwLCBsZW5ndGggLSA4LCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0VWludDY0KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0LAogICAgICAgIGlkZW50aWNhbChlbmRpYW4sIEVuZGlhbi5ob3N0KSA/IHZhbHVlIDogX2J5dGVTd2FwNjQodmFsdWUpKTsKICB9CgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIGRvdWJsZSBnZXRGbG9hdDMyKGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDMgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDQsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpKSB7CiAgICAgIHJldHVybiBfdHlwZWREYXRhLl9nZXRGbG9hdDMyKG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0KTsKICAgIH0KICAgIF9jb252VTMyWzBdID0KICAgICAgICBfYnl0ZVN3YXAzMihfdHlwZWREYXRhLl9nZXRVaW50MzIob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQpKTsKICAgIHJldHVybiBfY29udkYzMlswXTsKICB9CgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIHZvaWQgc2V0RmxvYXQzMihpbnQgYnl0ZU9mZnNldCwgZG91YmxlIHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDMgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDQsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpKSB7CiAgICAgIF90eXBlZERhdGEuX3NldEZsb2F0MzIob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQsIHZhbHVlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgX2NvbnZGMzJbMF0gPSB2YWx1ZTsKICAgIF90eXBlZERhdGEuX3NldFVpbnQzMihvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwgX2J5dGVTd2FwMzIoX2NvbnZVMzJbMF0pKTsKICB9CgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIGRvdWJsZSBnZXRGbG9hdDY0KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDcgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDgsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpKSB7CiAgICAgIHJldHVybiBfdHlwZWREYXRhLl9nZXRGbG9hdDY0KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0KTsKICAgIH0KICAgIF9jb252VTY0WzBdID0KICAgICAgICBfYnl0ZVN3YXA2NChfdHlwZWREYXRhLl9nZXRVaW50NjQob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQpKTsKICAgIHJldHVybiBfY29udkY2NFswXTsKICB9CgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIHZvaWQgc2V0RmxvYXQ2NChpbnQgYnl0ZU9mZnNldCwgZG91YmxlIHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDcgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDgsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpKSB7CiAgICAgIF90eXBlZERhdGEuX3NldEZsb2F0NjQob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQsIHZhbHVlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgX2NvbnZGNjRbMF0gPSB2YWx1ZTsKICAgIF90eXBlZERhdGEuX3NldFVpbnQ2NChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwgX2J5dGVTd2FwNjQoX2NvbnZVNjRbMF0pKTsKICB9CgogIEZsb2F0MzJ4NCBnZXRGbG9hdDMyeDQoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgMyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gNCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIC8vIFRPRE8oam9obm1jY3V0Y2hhbikgOiBOZWVkIHRvIHJlc29sdmUgdGhpcyBmb3IgZW5kaWFuaXR5LgogICAgcmV0dXJuIF90eXBlZERhdGEuX2dldEZsb2F0MzJ4NChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCk7CiAgfQoKICB2b2lkIHNldEZsb2F0MzJ4NChpbnQgYnl0ZU9mZnNldCwgRmxvYXQzMng0IHZhbHVlLAogICAgICBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDMgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDQsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICAvLyBUT0RPKGpvaG5tY2N1dGNoYW4pIDogTmVlZCB0byByZXNvbHZlIHRoaXMgZm9yIGVuZGlhbml0eS4KICAgIF90eXBlZERhdGEuX3NldEZsb2F0MzJ4NChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwgdmFsdWUpOwogIH0KCiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBfVHlwZWRMaXN0IGdldCBfdHlwZWREYXRhIG5hdGl2ZSAiVHlwZWREYXRhVmlld190eXBlZERhdGEiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzIG5hdGl2ZSAiVHlwZWREYXRhVmlld19vZmZzZXRJbkJ5dGVzIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIGludCBnZXQgbGVuZ3RoIG5hdGl2ZSAiVHlwZWREYXRhVmlld19sZW5ndGgiOwp9CgpAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKaW50IF9ieXRlU3dhcDE2KGludCB2YWx1ZSkgewogIHJldHVybiAoKHZhbHVlICYgMHhGRjAwKSA+PiA4KSB8ICgodmFsdWUgJiAweDAwRkYpIDw8IDgpOwp9CgpAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKaW50IF9ieXRlU3dhcDMyKGludCB2YWx1ZSkgewogIHZhbHVlID0gKCh2YWx1ZSAmIDB4RkYwMEZGMDApID4+IDgpIHwgKCh2YWx1ZSAmIDB4MDBGRjAwRkYpIDw8IDgpOwogIHZhbHVlID0gKCh2YWx1ZSAmIDB4RkZGRjAwMDApID4+IDE2KSB8ICgodmFsdWUgJiAweDAwMDBGRkZGKSA8PCAxNik7CiAgcmV0dXJuIHZhbHVlOwp9CgpAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKaW50IF9ieXRlU3dhcDY0KGludCB2YWx1ZSkgewogIHJldHVybiAoX2J5dGVTd2FwMzIodmFsdWUpIDw8IDMyKSB8IF9ieXRlU3dhcDMyKHZhbHVlID4+IDMyKTsKfQoKZmluYWwgX2NvbnZVMzIgPSBuZXcgVWludDMyTGlzdCgyKTsKZmluYWwgX2NvbnZVNjQgPSBuZXcgVWludDY0TGlzdC52aWV3KF9jb252VTMyLmJ1ZmZlcik7CmZpbmFsIF9jb252RjMyID0gbmV3IEZsb2F0MzJMaXN0LnZpZXcoX2NvbnZVMzIuYnVmZmVyKTsKZmluYWwgX2NvbnZGNjQgPSBuZXcgRmxvYXQ2NExpc3QudmlldyhfY29udlUzMi5idWZmZXIpOwoKLy8gVG9wIGxldmVsIHV0aWxpdHkgbWV0aG9kcy4KQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCmludCBfdG9JbnQoaW50IHZhbHVlLCBpbnQgbWFzaykgewogIHZhbHVlICY9IG1hc2s7CiAgaWYgKHZhbHVlID4gKG1hc2sgPj4gMSkpIHZhbHVlIC09IG1hc2sgKyAxOwogIHJldHVybiB2YWx1ZTsKfQoKQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCmludCBfdG9JbnQ4KGludCB2YWx1ZSkgewogIHJldHVybiBfdG9JbnQodmFsdWUsIDB4RkYpOwp9CgpAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKaW50IF90b1VpbnQ4KGludCB2YWx1ZSkgewogIHJldHVybiB2YWx1ZSAmIDB4RkY7Cn0KCkBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKaW50IF90b0NsYW1wZWRVaW50OChpbnQgdmFsdWUpIHsKICBpZiAodmFsdWUgPCAwKSByZXR1cm4gMDsKICBpZiAodmFsdWUgPiAweEZGKSByZXR1cm4gMHhGRjsKICByZXR1cm4gdmFsdWU7Cn0KCkBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQppbnQgX3RvSW50MTYoaW50IHZhbHVlKSB7CiAgcmV0dXJuIF90b0ludCh2YWx1ZSwgMHhGRkZGKTsKfQoKQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCmludCBfdG9VaW50MTYoaW50IHZhbHVlKSB7CiAgcmV0dXJuIHZhbHVlICYgMHhGRkZGOwp9CgpAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKaW50IF90b0ludDMyKGludCB2YWx1ZSkgewogIHJldHVybiBfdG9JbnQodmFsdWUsIDB4RkZGRkZGRkYpOwp9CgpAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKaW50IF90b1VpbnQzMihpbnQgdmFsdWUpIHsKICByZXR1cm4gdmFsdWUgJiAweEZGRkZGRkZGOwp9CgovLyBJbiBhZGRpdGlvbiB0byBleHBsaWNpdGx5IGNoZWNraW5nIHRoZSByYW5nZSwgdGhpcyBtZXRob2QgaW1wbGljaXRseSBlbnN1cmVzCi8vIHRoYXQgYWxsIGFyZ3VtZW50cyBhcmUgbm9uLW51bGwgKGEgbm8gc3VjaCBtZXRob2QgZXJyb3IgZ2V0cyB0aHJvd24KLy8gb3RoZXJ3aXNlKS4Kdm9pZCBfcmFuZ2VDaGVjayhpbnQgbGlzdExlbmd0aCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CiAgaWYgKGxlbmd0aCA8IDApIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnZhbHVlKGxlbmd0aCk7CiAgfQogIGlmIChzdGFydCA8IDApIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnZhbHVlKHN0YXJ0KTsKICB9CiAgaWYgKHN0YXJ0ICsgbGVuZ3RoID4gbGlzdExlbmd0aCkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IudmFsdWUo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IGRhdGEpIDogX2RhdGEgPSBkYXRhOwoKICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXMgPT4gX2RhdGEubGVuZ3RoSW5CeXRlczsKCiAgVWludDhMaXN0IGFzVWludDhMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSA9PgogICAgICBuZXcgVW5tb2RpZmlhYmxlVWludDhMaXN0VmlldyhfZGF0YS5hc1VpbnQ4TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpKTsKCiAgSW50OExpc3QgYXNJbnQ4TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KICAgICAgbmV3IFVubW9kaWZpYWJsZUludDhMaXN0VmlldyhfZGF0YS5hc0ludDhMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCkpOwoKICBVaW50OENsYW1wZWRMaXN0IGFzVWludDhDbGFtcGVkTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KICAgICAgbmV3IFVubW9kaWZpYWJsZVVpbnQ4Q2xhbXBlZExpc3RWaWV3KAogICAgICAgICAgX2RhdGEuYXNVaW50OENsYW1wZWRMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCkpOwoKICBVaW50MTZMaXN0IGFzVWludDE2TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KICAgICAgbmV3IFVubW9kaWZpYWJsZVVpbnQxNkxpc3RWaWV3KF9kYXRhLmFzVWludDE2TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpKTsKCiAgSW50MTZMaXN0IGFzSW50MTZMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSA9PgogICAgICBuZXcgVW5tb2RpZmlhYmxlSW50MTZMaXN0VmlldyhfZGF0YS5hc0ludDE2TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpKTsKCiAgVWludDMyTGlzdCBhc1VpbnQzMkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pID0+CiAgICAgIG5ldyBVbm1vZGlmaWFibGVVaW50MzJMaXN0VmlldyhfZGF0YS5hc1VpbnQzMkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKSk7CgogIEludDMyTGlzdCBhc0ludDMyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KICAgICAgbmV3IFVubW9kaWZpYWJsZUludDMyTGlzdFZpZXcoX2RhdGEuYXNJbnQzMkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKSk7CgogIFVpbnQ2NExpc3QgYXNVaW50NjRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSA9PgogICAgICBuZXcgVW5tb2RpZmlhYmxlVWludDY0TGlzdFZpZXcoX2RhdGEuYXNVaW50NjRMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCkpOwoKICBJbnQ2NExpc3QgYXNJbnQ2NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pID0+CiAgICAgIG5ldyBVbm1vZGlmaWFibGVJbnQ2NExpc3RWaWV3KF9kYXRhLmFzSW50NjRMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCkpOwoKICBJbnQzMng0TGlzdCBhc0ludDMyeDRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSA9PgogICAgICBuZXcgVW5tb2RpZmlhYmxlSW50MzJ4NExpc3RWaWV3KAogICAgICAgICAgX2RhdGEuYXNJbnQzMng0TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpKTsKCiAgRmxvYXQzMkxpc3QgYXNGbG9hdDMyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KICAgICAgbmV3IFVubW9kaWZpYWJsZUZsb2F0MzJMaXN0VmlldygKICAgICAgICAgIF9kYXRhLmFzRmxvYXQzMkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKSk7CgogIEZsb2F0NjRMaXN0IGFzRmxvYXQ2NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pID0+CiAgICAgIG5ldyBVbm1vZGlmaWFibGVGbG9hdDY0TGlzdFZpZXcoCiAgICAgICAgICBfZGF0YS5hc0Zsb2F0NjRMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCkpOwoKICBGbG9hdDMyeDRMaXN0IGFzRmxvYXQzMng0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KICAgICAgbmV3IFVubW9kaWZpYWJsZUZsb2F0MzJ4NExpc3RWaWV3KAogICAgICAgICAgX2RhdGEuYXNGbG9hdDMyeDRMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCkpOwoKICBGbG9hdDY0eDJMaXN0IGFzRmxvYXQ2NHgyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KICAgICAgbmV3IFVubW9kaWZpYWJsZUZsb2F0NjR4Mkxpc3RWaWV3KAogICAgICAgICAgX2RhdGEuYXNGbG9hdDY0eDJMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCkpOwoKICBCeXRlRGF0YSBhc0J5dGVEYXRhKFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSA9PgogICAgICBuZXcgVW5tb2RpZmlhYmxlQnl0ZURhdGFWaWV3KF9kYXRhLmFzQnl0ZURhdGEob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKSk7Cn0KCi8qKgogKiBBIHJlYWQtb25seSB2aWV3IG9mIGEgW0J5dGVEYXRhXS4KICovCmNsYXNzIFVubW9kaWZpYWJsZUJ5dGVEYXRhVmlldyBpbXBsZW1lbnRzIEJ5dGVEYXRhIHsKICBmaW5hbCBCeXRlRGF0YSBfZGF0YTsKCiAgVW5tb2RpZmlhYmxlQnl0ZURhdGFWaWV3KEJ5dGVEYXRhIGRhdGEpIDogX2RhdGEgPSBkYXRhOwoKICBpbnQgZ2V0SW50OChpbnQgYnl0ZU9mZnNldCkgPT4gX2RhdGEuZ2V0SW50OChieXRlT2Zmc2V0KTsKCiAgdm9pZCBzZXRJbnQ4KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUpID0+IF91bnN1cHBvcnRlZCgpOwoKICBpbnQgZ2V0VWludDgoaW50IGJ5dGVPZmZzZXQpID0+IF9kYXRhLmdldFVpbnQ4KGJ5dGVPZmZzZXQpOwoKICB2b2lkIHNldFVpbnQ4KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUpID0+IF91bnN1cHBvcnRlZCgpOwoKICBpbnQgZ2V0SW50MTYoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pID0+CiAgICAgIF9kYXRhLmdldEludDE2KGJ5dGVPZmZzZXQsIGVuZGlhbik7CgogIHZvaWQgc2V0SW50MTYoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgPT4KICAgICAgX3Vuc3VwcG9ydGVkKCk7CgogIGludCBnZXRVaW50MTYoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pID0+CiAgICAgIF9kYXRhLmdldFVpbnQxNihieXRlT2Zmc2V0LCBlbmRpYW4pOwoKICB2b2lkIHNldFVpbnQxNihpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSA9PgogICAgICBfdW5zdXBwb3J0ZWQoKTsKCiAgaW50IGdldEludDMyKGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSA9PgogICAgICBfZGF0YS5nZXRJbnQzMihieXRlT2Zmc2V0LCBlbmRpYW4pOwoKICB2b2lkIHNldEludDMyKGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pID0+CiAgICAgIF91bnN1cHBvcnRlZCgpOwoKICBpbnQgZ2V0VWludDMyKGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSA9PgogICAgICBfZGF0YS5nZXRVaW50MzIoYnl0ZU9mZnNldCwgZW5kaWFuKTsKCiAgdm9pZCBzZXRVaW50MzIoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgPT4KICAgICAgX3Vuc3VwcG9ydGVkKCk7CgogIGludCBnZXRJbnQ2NChpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgPT4KICAgICAgX2RhdGEuZ2V0SW50NjQoYnl0ZU9mZnNldCwgZW5kaWFuKTsKCiAgdm9pZCBzZXRJbnQ2NChpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSA9PgogICAgICBfdW5zdXBwb3J0ZWQoKTsKCiAgaW50IGdldFVpbnQ2NChpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgPT4KICAgICAgX2RhdGEuZ2V0VWludDY0KGJ5dGVPZmZzZXQsIGVuZGlhbik7CgogIHZvaWQgc2V0VWludDY0KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pID0+CiAgICAgIF91bnN1cHBvcnRlZCgpOwoKICBkb3VibGUgZ2V0RmxvYXQzMihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgPT4KICAgICAgX2RhdGEuZ2V0RmxvYXQzMihieXRlT2Zmc2V0LCBlbmRpYW4pOwoKICB2b2lkIHNldEZsb2F0MzIoaW50IGJ5dGVPZmZzZXQsIGRvdWJsZSB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgPT4KICAgICAgX3Vuc3VwcG9ydGVkKCk7CgogIGRvdWJsZSBnZXRGbG9hdDY0KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSA9PgogICAgICBfZGF0YS5nZXRGbG9hdDY0KGJ5dGVPZmZzZXQsIGVuZGlhbik7CgogIHZvaWQgc2V0RmxvYXQ2NChpbnQgYnl0ZU9mZnNldCwgZG91YmxlIHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSA9PgogICAgICBfdW5zdXBwb3J0ZWQoKTsKCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgPT4gX2RhdGEuZWxlbWVudFNpemVJbkJ5dGVzOwoKICBpbnQgZ2V0IG9mZnNldEluQnl0ZXMgPT4gX2RhdGEub2Zmc2V0SW5CeXRlczsKCiAgaW50IGdldCBsZW5ndGhJbkJ5dGVzID0+IF9kYXRhLmxlbmd0aEluQnl0ZXM7CgogIEJ5dGVCdWZmZXIgZ2V0IGJ1ZmZlciA9PiBuZXcgVW5tb2RpZmlhYmxlQnl0ZUJ1ZmZlclZpZXcoX2RhdGEuYnVmZmVyKTsKCiAgdm9pZCBfdW5zdXBwb3J0ZWQoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQW4gVW5tb2RpZmlhYmxlQnl0ZURhdGFWaWV3IG1heSBub3QgYmUgbW9kaWZpZWQiKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9Vbm1vZGlmaWFibGVMaXN0TWl4aW48TiwgTCBleHRlbmRzIExpc3Q8Tj4sCiAgICBURCBleHRlbmRzIFR5cGVkRGF0YT4gewogIEwgZ2V0IF9saXN0OwogIFREIGdldCBfZGF0YSA9PiAoX2xpc3QgYXMgVEQpOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbGlzdC5sZW5ndGg7CgogIE4gb3BlcmF0b3IgW10oaW50IGluZGV4KSA9PiBfbGlzdFtpbmRleF07CgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzID0+IF9kYXRhLmVsZW1lbnRTaXplSW5CeXRlczsKCiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzID0+IF9kYXRhLm9mZnNldEluQnl0ZXM7CgogIGludCBnZXQgbGVuZ3RoSW5CeXRlcyA9PiBfZGF0YS5sZW5ndGhJbkJ5dGVzOwoKICBCeXRlQnVmZmVyIGdldCBidWZmZXIgPT4gbmV3IFVubW9kaWZpYWJsZUJ5dGVCdWZmZXJWaWV3KF9kYXRhLmJ1ZmZlcik7CgogIEwgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCk7CgogIEwgc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgbGVuZ3RoKTsKICAgIGludCBzdWJsaXN0TGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBMIHJlc3VsdCA9IF9jcmVhdGVMaXN0KHN1Ymxpc3RMZW5ndGgpOwogICAgcmVzdWx0LnNldFJhbmdlKDAsIHN1Ymxpc3RMZW5ndGgsIF9saXN0LCBzdGFydCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKLyoqCiAqIFZpZXcgb2YgYSBbVWludDhMaXN0XSB0aGF0IGRpc2FsbG93cyBtb2RpZmljYXRpb24uCiAqLwpjbGFzcyBVbm1vZGlmaWFibGVVaW50OExpc3RWaWV3IGV4dGVuZHMgVW5tb2RpZmlhYmxlTGlzdEJhc2U8aW50PgogICAgd2l0aCBfVW5tb2RpZmlhYmxlTGlzdE1peGluPGludCwgVWludDhMaXN0LCBVaW50OExpc3Q+CiAgICBpbXBsZW1lbnRzIFVpbnQ4TGlzdCB7CiAgZmluYWwgVWludDhMaXN0IF9saXN0OwogIFVubW9kaWZpYWJsZVVpbnQ4TGlzdFZpZXcoVWludDhMaXN0IGxpc3QpIDogX2xpc3QgPSBsaXN0OwoKICBVaW50OExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgPT4gVWludDhMaXN0KGxlbmd0aCk7Cn0KCi8qKgogKiBWaWV3IG9mIGEgW0ludDhMaXN0XSB0aGF0IGRpc2FsbG93cyBtb2RpZmljYXRpb24uCiAqLwpjbGFzcyBVbm1vZGlmaWFibGVJbnQ4TGlzdFZpZXcgZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxpbnQ+CiAgICB3aXRoIF9Vbm1vZGlmaWFibGVMaXN0TWl4aW48aW50LCBJbnQ4TGlzdCwgSW50OExpc3Q+CiAgICBpbXBsZW1lbnRzIEludDhMaXN0IHsKICBmaW5hbCBJbnQ4TGlzdCBfbGlzdDsKICBVbm1vZGlmaWFibGVJbnQ4TGlzdFZpZXcoSW50OExpc3QgbGlzdCkgOiBfbGlzdCA9IGxpc3Q7CgogIEludDhMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpID0+IEludDhMaXN0KGxlbmd0aCk7Cn0KCi8qKgogKiBWaWV3IG9mIGEgW1VpbnQ4Q2xhbXBlZExpc3RdIHRoYXQgZGlzYWxsb3dzIG1vZGlmaWNhdGlvbi4KICovCmNsYXNzIFVubW9kaWZpYWJsZVVpbnQ4Q2xhbXBlZExpc3RWaWV3IGV4dGVuZHMgVW5tb2RpZmlhYmxlTGlzdEJhc2U8aW50PgogICAgd2l0aCBfVW5tb2RpZmlhYmxlTGlzdE1peGluPGludCwgVWludDhDbGFtcGVkTGlzdCwgVWludDhDbGFtcGVkTGlzdD4KICAgIGltcGxlbWVudHMgVWludDhDbGFtcGVkTGlzdCB7CiAgZmluYWwgVWludDhDbGFtcGVkTGlzdCBfbGlzdDsKICBVbm1vZGlmaWFibGVVaW50OENsYW1wZWRMaXN0VmlldyhVaW50OENsYW1wZWRMaXN0IGxpc3QpIDogX2xpc3QgPSBsaXN0OwoKICBVaW50OENsYW1wZWRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpID0+IFVpbnQ4Q2xhbXBlZExpc3QobGVuZ3RoKTsKfQoKLyoqCiAqIFZpZXcgb2YgYSBbVWludDE2TGlzdF0gdGhhdCBkaXNhbGxvd3MgbW9kaWZpY2F0aW9uLgogKi8KY2xhc3MgVW5tb2RpZmlhYmxlVWludDE2TGlzdFZpZXcgZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxpbnQ+CiAgICB3aXRoIF9Vbm1vZGlmaWFibGVMaXN0TWl4aW48aW50LCBVaW50MTZMaXN0LCBVaW50MTZMaXN0PgogICAgaW1wbGVtZW50cyBVaW50MTZMaXN0IHsKICBmaW5hbCBVaW50MTZMaXN0IF9saXN0OwogIFVubW9kaWZpYWJsZVVpbnQxNkxpc3RWaWV3KFVpbnQxNkxpc3QgbGlzdCkgOiBfbGlzdCA9IGxpc3Q7CgogIFVpbnQxNkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgPT4gVWludDE2TGlzdChsZW5ndGgpOwp9CgovKioKICogVmlldyBvZiBhIFtJbnQxNkxpc3RdIHRoYXQgZGlzYWxsb3dzIG1vZGlmaWNhdGlvbi4KICovCmNsYXNzIFVubW9kaWZpYWJsZUludDE2TGlzdFZpZXcgZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxpbnQ+CiAgICB3aXRoIF9Vbm1vZGlmaWFibGVMaXN0TWl4aW48aW50LCBJbnQxNkxpc3QsIEludDE2TGlzdD4KICAgIGltcGxlbWVudHMgSW50MTZMaXN0IHsKICBmaW5hbCBJbnQxNkxpc3QgX2xpc3Q7CiAgVW5tb2RpZmlhYmxlSW50MTZMaXN0VmlldyhJbnQxNkxpc3QgbGlzdCkgOiBfbGlzdCA9IGxpc3Q7CgogIEludDE2TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSA9PiBJbnQxNkxpc3QobGVuZ3RoKTsKfQoKLyoqCiAqIFZpZXcgb2YgYSBbVWludDMyTGlzdF0gdGhhdCBkaXNhbGxvd3MgbW9kaWZpY2F0aW9uLgogKi8KY2xhc3MgVW5tb2RpZmlhYmxlVWludDMyTGlzdFZpZXcgZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxpbnQ+CiAgICB3aXRoIF9Vbm1vZGlmaWFibGVMaXN0TWl4aW48aW50LCBVaW50MzJMaXN0LCBVaW50MzJMaXN0PgogICAgaW1wbGVtZW50cyBVaW50MzJMaXN0IHsKICBmaW5hbCBVaW50MzJMaXN0IF9saXN0OwogIFVubW9kaWZpYWJsZVVpbnQzMkxpc3RWaWV3KFVpbnQzMkxpc3QgbGlzdCkgOiBfbGlzdCA9IGxpc3Q7CgogIFVpbnQzMkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgPT4gVWludDMyTGlzdChsZW5ndGgpOwp9CgovKioKICogVmlldyBvZiBhIFtJbnQzMkxpc3RdIHRoYXQgZGlzYWxsb3dzIG1vZGlmaWNhdGlvbi4KICovCmNsYXNzIFVubW9kaWZpYWJsZUludDMyTGlzdFZpZXcgZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxpbnQ+CiAgICB3aXRoIF9Vbm1vZGlmaWFibGVMaXN0TWl4aW48aW50LCBJbnQzMkxpc3QsIEludDMyTGlzdD4KICAgIGltcGxlbWVudHMgSW50MzJMaXN0IHsKICBmaW5hbCBJbnQzMkxpc3QgX2xpc3Q7CiAgVW5tb2RpZmlhYmxlSW50MzJMaXN0VmlldyhJbnQzMkxpc3QgbGlzdCkgOiBfbGlzdCA9IGxpc3Q7CgogIEludDMyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSA9PiBJbnQzMkxpc3QobGVuZ3RoKTsKfQoKLyoqCiAqIFZpZXcgb2YgYSBbVWludDY0TGlzdF0gdGhhdCBkaXNhbGxvd3MgbW9kaWZpY2F0aW9uLgogKi8KY2xhc3MgVW5tb2RpZmlhYmxlVWludDY0TGlzdFZpZXcgZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxpbnQ+CiAgICB3aXRoIF9Vbm1vZGlmaWFibGVMaXN0TWl4aW48aW50LCBVaW50NjRMaXN0LCBVaW50NjRMaXN0PgogICAgaW1wbGVtZW50cyBVaW50NjRMaXN0IHsKICBmaW5hbCBVaW50NjRMaXN0IF9saXN0OwogIFVubW9kaWZpYWJsZVVpbnQ2NExpc3RWaWV3KFVpbnQ2NExpc3QgbGlzdCkgOiBfbGlzdCA9IGxpc3Q7CgogIFVpbnQ2NExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgPT4gVWludDY0TGlzdChsZW5ndGgpOwp9CgovKioKICogVmlldyBvZiBhIFtJbnQ2NExpc3RdIHRoYXQgZGlzYWxsb3dzIG1vZGlmaWNhdGlvbi4KICovCmNsYXNzIFVubW9kaWZpYWJsZUludDY0TGlzdFZpZXcgZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxpbnQ+CiAgICB3aXRoIF9Vbm1vZGlmaWFibGVMaXN0TWl4aW48aW50LCBJbnQ2NExpc3QsIEludDY0TGlzdD4KICAgIGltcGxlbWVudHMgSW50NjRMaXN0IHsKICBmaW5hbCBJbnQ2NExpc3QgX2xpc3Q7CiAgVW5tb2RpZmlhYmxlSW50NjRMaXN0VmlldyhJbnQ2NExpc3QgbGlzdCkgOiBfbGlzdCA9IGxpc3Q7CgogIEludDY0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSA9PiBJbnQ2NExpc3QobGVuZ3RoKTsKfQoKLyoqCiAqIFZpZXcgb2YgYSBbSW50MzJ4NExpc3RdIHRoYXQgZGlzYWxsb3dzIG1vZGlmaWNhdGlvbi4KICovCmNsYXNzIFVubW9kaWZpYWJsZUludDMyeDRMaXN0VmlldyBleHRlbmRzIFVubW9kaWZpYWJsZUxpc3RCYXNlPEludDMyeDQ+CiAgICB3aXRoIF9Vbm1vZGlmaWFibGVMaXN0TWl4aW48SW50MzJ4NCwgSW50MzJ4NExpc3QsIEludDMyeDRMaXN0PgogICAgaW1wbGVtZW50cyBJbnQzMng0TGlzdCB7CiAgZmluYWwgSW50MzJ4NExpc3QgX2xpc3Q7CiAgVW5tb2RpZmlhYmxlSW50MzJ4NExpc3RWaWV3KEludDMyeDRMaXN0IGxpc3QpIDogX2xpc3QgPSBsaXN0OwoKICBJbnQzMng0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSA9PiBJbnQzMng0TGlzdChsZW5ndGgpOwp9CgovKioKICogVmlldyBvZiBhIFtGbG9hdDMyeDRMaXN0XSB0aGF0IGRpc2FsbG93cyBtb2RpZmljYXRpb24uCiAqLwpjbGFzcyBVbm1vZGlmaWFibGVGbG9hdDMyeDRMaXN0VmlldyBleHRlbmRzIFVubW9kaWZpYWJsZUxpc3RCYXNlPEZsb2F0MzJ4ND4KICAgIHdpdGggX1VubW9kaWZpYWJsZUxpc3RNaXhpbjxGbG9hdDMyeDQsIEZsb2F0MzJ4NExpc3QsIEZsb2F0MzJ4NExpc3Q+CiAgICBpbXBsZW1lbnRzIEZsb2F0MzJ4NExpc3QgewogIGZpbmFsIEZsb2F0MzJ4NExpc3QgX2xpc3Q7CiAgVW5tb2RpZmlhYmxlRmxvYXQzMng0TGlzdFZpZXcoRmxvYXQzMng0TGlzdCBsaXN0KSA6IF9saXN0ID0gbGlzdDsKCiAgRmxvYXQzMng0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSA9PiBGbG9hdDMyeDRMaXN0KGxlbmd0aCk7Cn0KCi8qKgogKiBWaWV3IG9mIGEgW0Zsb2F0NjR4Mkxpc3RdIHRoYXQgZGlzYWxsb3dzIG1vZGlmaWNhdGlvbi4KICovCmNsYXNzIFVubW9kaWZpYWJsZUZsb2F0NjR4Mkxpc3RWaWV3IGV4dGVuZHMgVW5tb2RpZmlhYmxlTGlzdEJhc2U8RmxvYXQ2NHgyPgogICAgd2l0aCBfVW5tb2RpZmlhYmxlTGlzdE1peGluPEZsb2F0NjR4MiwgRmxvYXQ2NHgyTGlzdCwgRmxvYXQ2NHgyTGlzdD4KICAgIGltcGxlbWVudHMgRmxvYXQ2NHgyTGlzdCB7CiAgZmluYWwgRmxvYXQ2NHgyTGlzdCBfbGlzdDsKICBVbm1vZGlmaWFibGVGbG9hdDY0eDJMaXN0VmlldyhGbG9hdDY0eDJMaXN0IGxpc3QpIDogX2xpc3QgPSBsaXN0OwoKICBGbG9hdDY0eDJMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpID0+IEZsb2F0NjR4Mkxpc3QobGVuZ3RoKTsKfQoKLyoqCiAqIFZpZXcgb2YgYSBbRmxvYXQzMkxpc3RdIHRoYXQgZGlzYWxsb3dzIG1vZGlmaWNhdGlvbi4KICovCmNsYXNzIFVubW9kaWZpYWJsZUZsb2F0MzJMaXN0VmlldyBleHRlbmRzIFVubW9kaWZpYWJsZUxpc3RCYXNlPGRvdWJsZT4KICAgIHdpdGggX1VubW9kaWZpYWJsZUxpc3RNaXhpbjxkb3VibGUsIEZsb2F0MzJMaXN0LCBGbG9hdDMyTGlzdD4KICAgIGltcGxlbWVudHMgRmxvYXQzMkxpc3QgewogIGZpbmFsIEZsb2F0MzJMaXN0IF9saXN0OwogIFVubW9kaWZpYWJsZUZsb2F0MzJMaXN0VmlldyhGbG9hdDMyTGlzdCBsaXN0KSA6IF9saXN0ID0gbGlzdDsKCiAgRmxvYXQzMkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgPT4gRmxvYXQzMkxpc3QobGVuZ3RoKTsKfQoKLyoqCiAqIFZpZXcgb2YgYSBbRmxvYXQ2NExpc3RdIHRoYXQgZGlzYWxsb3dzIG1vZGlmaWNhdGlvbi4KICovCmNsYXNzIFVubW9kaWZpYWJsZUZsb2F0NjRMaXN0VmlldyBleHRlbmRzIFVubW9kaWZpYWJsZUxpc3RCYXNlPGRvdWJsZT4KICAgIHdpdGggX1VubW9kaWZpYWJsZUxpc3RNaXhpbjxkb3VibGUsIEZsb2F0NjRMaXN0LCBGbG9hdDY0TGlzdD4KICAgIGltcGxlbWVudHMgRmxvYXQ2NExpc3QgewogIGZpbmFsIEZsb2F0NjRMaXN0IF9saXN0OwogIFVubW9kaWZpYWJsZUZsb2F0NjRMaXN0VmlldyhGbG9hdDY0TGlzdCBsaXN0KSA6IF9saXN0ID0gbGlzdDsKCiAgRmxvYXQ2NExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgPT4gRmxvYXQ2NExpc3QobGVuZ3RoKTsKfQqBVwBOTjwBGQEEJwQ5GgE+ATABQE8BPk0BTiw8AUJRAUBPAUJRAUBPAUJRAUBPAUQnNwFEJzcBRCc3AUgpOQFIKTkBPk0CAQQlBDUYAToBPAE9AT4BPgFAKgFMFgFBKwFNFgFAKgFMFgFBKwFNFgFAKgFMFgFBKwFNFgFFLAFRFgFFLAFRFgE6ATABMAFJARggPAQCATwcDyEBIgEsAToBMAEwAUkBHQEkOiUrNRMEAgEENgRCOxsZPAE6AgEENQRBORoYOgE4AgEEPQRJSSIgSgFIAgEENwRDPRwaPgE8AgEENgRCOxsZPAE6AgEENwRDPRwaPgE8AgEENgRCOxsZPAE6AgEENwRDPRwaPgE8AgEENgRCOxsZPAE6AgEEOARIQx0bQAE+AgEEOgRMSR8dRAFCAgEEOgRMSR8dRAFCAgEEOARHQh0bQAE+AgEEOARHQh0bQAE+AgEsZGFydDp0eXBlZF9kYXRhL3VubW9kaWZpYWJsZV90eXBlZF9kYXRhLmRhcnQ7b3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2Jpbi92bXNlcnZpY2Uvdm1zZXJ2aWNlX2lvLmRhcnSdVC8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHZtc2VydmljZV9pbzsKCmltcG9ydCAnZGFydDphc3luYyc7CmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6aW8nOwppbXBvcnQgJ2RhcnQ6aXNvbGF0ZSc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKaW1wb3J0ICdkYXJ0Ol92bXNlcnZpY2UnOwoKcGFydCAnbG9hZGVyLmRhcnQnOwpwYXJ0ICdzZXJ2ZXIuZGFydCc7CgovLyBUaGUgVENQIGlwL3BvcnQgdGhhdCB0aGUgSFRUUCBzZXJ2ZXIgbGlzdGVucyBvbi4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQppbnQgX3BvcnQ7CkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKU3RyaW5nIF9pcDsKLy8gU2hvdWxkIHRoZSBIVFRQIHNlcnZlciBhdXRvIHN0YXJ0PwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmJvb2wgX2F1dG9TdGFydDsKLy8gU2hvdWxkIHRoZSBIVFRQIHNlcnZlciByZXF1aXJlIGFuIGF1dGggY29kZT8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpib29sIF9hdXRoQ29kZXNEaXNhYmxlZDsKLy8gU2hvdWxkIHRoZSBIVFRQIHNlcnZlciBydW4gaW4gZGV2bW9kZT8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpib29sIF9vcmlnaW5DaGVja0Rpc2FibGVkOwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmJvb2wgX2lzV2luZG93cyA9IGZhbHNlOwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmJvb2wgX2lzRnVjaHNpYSA9IGZhbHNlOwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCnZhciBfc2lnbmFsV2F0Y2g7CnZhciBfc2lnbmFsU3Vic2NyaXB0aW9uOwoKLy8gSFRUUCBzZXJ2ZXIuClNlcnZlciBzZXJ2ZXI7CkZ1dHVyZTxTZXJ2ZXI+IHNlcnZlckZ1dHVyZTsKCl9sYXp5U2VydmVyQm9vdCgpIHsKICBpZiAoc2VydmVyICE9IG51bGwpIHsKICAgIHJldHVybjsKICB9CiAgLy8gTGF6aWx5IGNyZWF0ZSBzZXJ2aWNlLgogIHZhciBzZXJ2aWNlID0gbmV3IFZNU2VydmljZSgpOwogIC8vIExhemlseSBjcmVhdGUgc2VydmVyLgogIHNlcnZlciA9CiAgICAgIG5ldyBTZXJ2ZXIoc2VydmljZSwgX2lwLCBfcG9ydCwgX29yaWdpbkNoZWNrRGlzYWJsZWQsIF9hdXRoQ29kZXNEaXNhYmxlZCk7Cn0KCkZ1dHVyZSBjbGVhbnVwQ2FsbGJhY2soKSBhc3luYyB7CiAgc2h1dGRvd25Mb2FkZXJzKCk7CiAgLy8gQ2FuY2VsIHRoZSBzaWdxdWl0IHN1YnNjcmlwdGlvbi4KICBpZiAoX3NpZ25hbFN1YnNjcmlwdGlvbiAhPSBudWxsKSB7CiAgICBhd2FpdCBfc2lnbmFsU3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgX3NpZ25hbFN1YnNjcmlwdGlvbiA9IG51bGw7CiAgfQogIGlmIChzZXJ2ZXIgIT0gbnVsbCkgewogICAgdHJ5IHsKICAgICAgYXdhaXQgc2VydmVyLmNsZWFudXAodHJ1ZSk7CiAgICB9IGNhdGNoIChlLCBzdCkgewogICAgICBwcmludCgiRXJyb3IgaW4gdm0tc2VydmljZSBzaHV0ZG93bjogJGVcbiRzdFxuIik7CiAgICB9CiAgfQogIGlmIChfcmVnaXN0ZXJTaWduYWxIYW5kbGVyVGltZXIgIT0gbnVsbCkgewogICAgX3JlZ2lzdGVyU2lnbmFsSGFuZGxlclRpbWVyLmNhbmNlbCgpOwogICAgX3JlZ2lzdGVyU2lnbmFsSGFuZGxlclRpbWVyID0gbnVsbDsKICB9CiAgLy8gQ2FsbCBvdXQgdG8gZW1iZWRkZXIncyBzaHV0ZG93biBjYWxsYmFjay4KICBfc2h1dGRvd24oKTsKfQoKRnV0dXJlPFVyaT4gY3JlYXRlVGVtcERpckNhbGxiYWNrKFN0cmluZyBiYXNlKSBhc3luYyB7CiAgRGlyZWN0b3J5IHRlbXAgPSBhd2FpdCBEaXJlY3Rvcnkuc3lzdGVtVGVtcC5jcmVhdGVUZW1wKGJhc2UpOwogIC8vIFVuZGVybmVhdGggdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnksIGNyZWF0ZSBhIGRpcmVjdG9yeSB3aXRoIHRoZQogIC8vIHNhbWUgbmFtZSBhcyB0aGUgRGV2RlMgbmFtZSBbYmFzZV0uCiAgdmFyIGZzVXJpID0gdGVtcC51cmkucmVzb2x2ZVVyaShuZXcgVXJpLmRpcmVjdG9yeShiYXNlKSk7CiAgYXdhaXQgbmV3IERpcmVjdG9yeS5mcm9tVXJpKGZzVXJpKS5jcmVhdGUoKTsKICByZXR1cm4gZnNVcmk7Cn0KCkZ1dHVyZSBkZWxldGVEaXJDYWxsYmFjayhVcmkgcGF0aCkgYXN5bmMgewogIERpcmVjdG9yeSBkaXIgPSBuZXcgRGlyZWN0b3J5LmZyb21VcmkocGF0aCk7CiAgYXdhaXQgZGlyLmRlbGV0ZShyZWN1cnNpdmU6IHRydWUpOwp9CgpjbGFzcyBQZW5kaW5nV3JpdGUgewogIFBlbmRpbmdXcml0ZSh0aGlzLnVyaSwgdGhpcy5ieXRlcyk7CiAgZmluYWwgQ29tcGxldGVyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKICBmaW5hbCBVcmkgdXJpOwogIGZpbmFsIExpc3Q8aW50PiBieXRlczsKCiAgRnV0dXJlIHdyaXRlKCkgYXN5bmMgewogICAgdmFyIGZpbGUgPSBuZXcgRmlsZS5mcm9tVXJpKHVyaSk7CiAgICB2YXIgcGFyZW50X2RpcmVjdG9yeSA9IGZpbGUucGFyZW50OwogICAgYXdhaXQgcGFyZW50X2RpcmVjdG9yeS5jcmVhdGUocmVjdXJzaXZlOiB0cnVlKTsKICAgIGlmIChhd2FpdCBmaWxlLmV4aXN0cygpKSB7CiAgICAgIGF3YWl0IGZpbGUuZGVsZXRlKCk7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gYXdhaXQgZmlsZS53cml0ZUFzQnl0ZXMoYnl0ZXMpOwogICAgY29tcGxldGVyLmNvbXBsZXRlKG51bGwpOwogICAgV3JpdGVMaW1pdGVyLl93cml0ZUNvbXBsZXRlZCgpOwogIH0KfQoKY2xhc3MgV3JpdGVMaW1pdGVyIHsKICBzdGF0aWMgZmluYWwgTGlzdDxQZW5kaW5nV3JpdGU+IHBlbmRpbmdXcml0ZXMgPSBuZXcgTGlzdDxQZW5kaW5nV3JpdGU+KCk7CgogIC8vIG5vbi1yb290ZWQgQW5kcm9pZCBkZXZpY2VzIGhhdmUgYSB2ZXJ5IGxvdyBsaW1pdCBmb3IgdGhlIG51bWJlciBvZgogIC8vIG9wZW4gZmlsZXMuIEFydGlmaWNpYWxseSBjYXAgb3Vyc2VsdmVzIHRvIDE2LgogIHN0YXRpYyBjb25zdCBrTWF4T3BlbldyaXRlcyA9IDE2OwogIHN0YXRpYyBpbnQgb3BlbldyaXRlcyA9IDA7CgogIHN0YXRpYyBGdXR1cmUgc2NoZWR1bGVXcml0ZShVcmkgcGF0aCwgTGlzdDxpbnQ+IGJ5dGVzKSBhc3luYyB7CiAgICAvLyBDcmVhdGUgYSBuZXcgcGVuZGluZyB3cml0ZS4KICAgIFBlbmRpbmdXcml0ZSBwdyA9IG5ldyBQZW5kaW5nV3JpdGUocGF0aCwgYnl0ZXMpOwogICAgcGVuZGluZ1dyaXRlcy5hZGQocHcpOwogICAgX21heWJlV3JpdGVGaWxlcygpOwogICAgcmV0dXJuIHB3LmNvbXBsZXRlci5mdXR1cmU7CiAgfQoKICBzdGF0aWMgX21heWJlV3JpdGVGaWxlcygpIHsKICAgIHdoaWxlIChvcGVuV3JpdGVzIDwga01heE9wZW5Xcml0ZXMpIHsKICAgICAgaWYgKHBlbmRpbmdXcml0ZXMubGVuZ3RoID4gMCkgewogICAgICAgIFBlbmRpbmdXcml0ZSBwdyA9IHBlbmRpbmdXcml0ZXMucmVtb3ZlTGFzdCgpOwogICAgICAgIHB3LndyaXRlKCk7CiAgICAgICAgb3BlbldyaXRlcysrOwogICAgICB9IGVsc2UgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQoKICBzdGF0aWMgX3dyaXRlQ29tcGxldGVkKCkgewogICAgb3BlbldyaXRlcy0tOwogICAgYXNzZXJ0KG9wZW5Xcml0ZXMgPj0gMCk7CiAgICBfbWF5YmVXcml0ZUZpbGVzKCk7CiAgfQp9CgpGdXR1cmUgd3JpdGVGaWxlQ2FsbGJhY2soVXJpIHBhdGgsIExpc3Q8aW50PiBieXRlcykgYXN5bmMgewogIHJldHVybiBXcml0ZUxpbWl0ZXIuc2NoZWR1bGVXcml0ZShwYXRoLCBieXRlcyk7Cn0KCkZ1dHVyZSB3cml0ZVN0cmVhbUZpbGVDYWxsYmFjayhVcmkgcGF0aCwgU3RyZWFtPExpc3Q8aW50Pj4gYnl0ZXMpIGFzeW5jIHsKICB2YXIgZmlsZSA9IG5ldyBGaWxlLmZyb21VcmkocGF0aCk7CiAgdmFyIHBhcmVudF9kaXJlY3RvcnkgPSBmaWxlLnBhcmVudDsKICBhd2FpdCBwYXJlbnRfZGlyZWN0b3J5LmNyZWF0ZShyZWN1cnNpdmU6IHRydWUpOwogIGlmIChhd2FpdCBmaWxlLmV4aXN0cygpKSB7CiAgICBhd2FpdCBmaWxlLmRlbGV0ZSgpOwogIH0KICBJT1Npbmsgc2luayA9IGF3YWl0IGZpbGUub3BlbldyaXRlKCk7CiAgYXdhaXQgc2luay5hZGRTdHJlYW0oYnl0ZXMpOwogIGF3YWl0IHNpbmsuY2xvc2UoKTsKfQoKRnV0dXJlPExpc3Q8aW50Pj4gcmVhZEZpbGVDYWxsYmFjayhVcmkgcGF0aCkgYXN5bmMgewogIHZhciBmaWxlID0gbmV3IEZpbGUuZnJvbVVyaShwYXRoKTsKICByZXR1cm4gYXdhaXQgZmlsZS5yZWFkQXNCeXRlcygpOwp9CgpGdXR1cmU8TGlzdDxNYXA8U3RyaW5nLCBkeW5hbWljPj4+IGxpc3RGaWxlc0NhbGxiYWNrKFVyaSBkaXJQYXRoKSBhc3luYyB7CiAgdmFyIGRpciA9IG5ldyBEaXJlY3RvcnkuZnJvbVVyaShkaXJQYXRoKTsKICB2YXIgZGlyUGF0aFN0ciA9IGRpclBhdGgucGF0aDsKICB2YXIgc3RyZWFtID0gZGlyLmxpc3QocmVjdXJzaXZlOiB0cnVlKTsKICB2YXIgcmVzdWx0ID0gPE1hcDxTdHJpbmcsIGR5bmFtaWM+PltdOwogIGF3YWl0IGZvciAodmFyIGZpbGVFbnRpdHkgaW4gc3RyZWFtKSB7CiAgICB2YXIgZmlsZVBhdGggPSBuZXcgVXJpLmZpbGUoZmlsZUVudGl0eS5wYXRoKS5wYXRoOwogICAgdmFyIHN0YXQgPSBhd2FpdCBmaWxlRW50aXR5LnN0YXQoKTsKICAgIGlmIChzdGF0LnR5cGUgPT0gRmlsZVN5c3RlbUVudGl0eVR5cGUuRklMRSAmJgogICAgICAgIGZpbGVQYXRoLnN0YXJ0c1dpdGgoZGlyUGF0aFN0cikpIHsKICAgICAgdmFyIG1hcCA9IDxTdHJpbmcsIGR5bmFtaWM+e307CiAgICAgIG1hcFsnbmFtZSddID0gJy8nICsgZmlsZVBhdGguc3Vic3RyaW5nKGRpclBhdGhTdHIubGVuZ3RoKTsKICAgICAgbWFwWydzaXplJ10gPSBzdGF0LnNpemU7CiAgICAgIG1hcFsnbW9kaWZpZWQnXSA9IHN0YXQubW9kaWZpZWQubWlsbGlzZWNvbmRzU2luY2VFcG9jaDsKICAgICAgcmVzdWx0LmFkZChtYXApOwogICAgfQogIH0KICByZXR1cm4gcmVzdWx0Owp9CgpGdXR1cmU8VXJpPiBzZXJ2ZXJJbmZvcm1hdGlvbkNhbGxiYWNrKCkgYXN5bmMgewogIF9sYXp5U2VydmVyQm9vdCgpOwogIHJldHVybiBzZXJ2ZXIuc2VydmVyQWRkcmVzczsKfQoKRnV0dXJlPFVyaT4gd2ViU2VydmVyQ29udHJvbENhbGxiYWNrKGJvb2wgZW5hYmxlKSBhc3luYyB7CiAgX2xhenlTZXJ2ZXJCb290KCk7CiAgaWYgKHNlcnZlci5ydW5uaW5nID09IGVuYWJsZSkgewogICAgLy8gTm8gY2hhbmdlLgogICAgcmV0dXJuIHNlcnZlci5zZXJ2ZXJBZGRyZXNzOwogIH0KCiAgaWYgKGVuYWJsZSkgewogICAgYXdhaXQgc2VydmVyLnN0YXJ0dXAoKTsKICAgIHJldHVybiBzZXJ2ZXIuc2VydmVyQWRkcmVzczsKICB9IGVsc2UgewogICAgYXdhaXQgc2VydmVyLnNodXRkb3duKHRydWUpOwogICAgcmV0dXJuIHNlcnZlci5zZXJ2ZXJBZGRyZXNzOwogIH0KfQoKTnVsbCBfY2xlYXJGdXR1cmUoXykgewogIHNlcnZlckZ1dHVyZSA9IG51bGw7Cn0KCl9vblNpZ25hbChQcm9jZXNzU2lnbmFsIHNpZ25hbCkgewogIGlmIChzZXJ2ZXJGdXR1cmUgIT0gbnVsbCkgewogICAgLy8gU3RpbGwgd2FpdGluZy4KICAgIHJldHVybjsKICB9CiAgX2xhenlTZXJ2ZXJCb290KCk7CiAgLy8gVG9nZ2xlIEhUVFAgc2VydmVyLgogIGlmIChzZXJ2ZXIucnVubmluZykgewogICAgc2VydmVyRnV0dXJlID0gc2VydmVyLnNodXRkb3duKHRydWUpLnRoZW4oX2NsZWFyRnV0dXJlKTsKICB9IGVsc2UgewogICAgc2VydmVyRnV0dXJlID0gc2VydmVyLnN0YXJ0dXAoKS50aGVuKF9jbGVhckZ1dHVyZSk7CiAgfQp9CgpUaW1lciBfcmVnaXN0ZXJTaWduYWxIYW5kbGVyVGltZXI7CgpfcmVnaXN0ZXJTaWduYWxIYW5kbGVyKCkgewogIF9yZWdpc3RlclNpZ25hbEhhbmRsZXJUaW1lciA9IG51bGw7CiAgaWYgKF9zaWduYWxXYXRjaCA9PSBudWxsKSB7CiAgICAvLyBDYW5ub3QgcmVnaXN0ZXIgZm9yIHNpZ25hbHMuCiAgICByZXR1cm47CiAgfQogIGlmIChfaXNXaW5kb3dzIHx8IF9pc0Z1Y2hzaWEpIHsKICAgIC8vIENhbm5vdCByZWdpc3RlciBmb3Igc2lnbmFscyBvbiBXaW5kb3dzIG9yIEZ1Y2hzaWEuCiAgICByZXR1cm47CiAgfQogIF9zaWduYWxTdWJzY3JpcHRpb24gPSBfc2lnbmFsV2F0Y2goUHJvY2Vzc1NpZ25hbC5TSUdRVUlUKS5saXN0ZW4oX29uU2lnbmFsKTsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAhY29uc3QgYm9vbC5mcm9tRW52aXJvbm1lbnQoImRhcnQudm0ucHJvZHVjdCIpKQptYWluKCkgewogIC8vIFNldCBlbWJlZGRlciBob29rcy4KICBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLmNsZWFudXAgPSBjbGVhbnVwQ2FsbGJhY2s7CiAgVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy5jcmVhdGVUZW1wRGlyID0gY3JlYXRlVGVtcERpckNhbGxiYWNrOwogIFZNU2VydmljZUVtYmVkZGVySG9va3MuZGVsZXRlRGlyID0gZGVsZXRlRGlyQ2FsbGJhY2s7CiAgVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy53cml0ZUZpbGUgPSB3cml0ZUZpbGVDYWxsYmFjazsKICBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLndyaXRlU3RyZWFtRmlsZSA9IHdyaXRlU3RyZWFtRmlsZUNhbGxiYWNrOwogIFZNU2VydmljZUVtYmVkZGVySG9va3MucmVhZEZpbGUgPSByZWFkRmlsZUNhbGxiYWNrOwogIFZNU2VydmljZUVtYmVkZGVySG9va3MubGlzdEZpbGVzID0gbGlzdEZpbGVzQ2FsbGJhY2s7CiAgVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy5zZXJ2ZXJJbmZvcm1hdGlvbiA9IHNlcnZlckluZm9ybWF0aW9uQ2FsbGJhY2s7CiAgVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy53ZWJTZXJ2ZXJDb250cm9sID0gd2ViU2VydmVyQ29udHJvbENhbGxiYWNrOwogIC8vIEFsd2F5cyBpbnN0YW50aWF0ZSB0aGUgdm1zZXJ2aWNlIG9iamVjdCBzbyB0aGF0IHRoZSBleGl0IG1lc3NhZ2UKICAvLyBjYW4gYmUgZGVsaXZlcmVkIGFuZCB3YWl0aW5nIGxvYWRlcnMgY2FuIGJlIGNhbmNlbGxlZC4KICBuZXcgVk1TZXJ2aWNlKCk7CiAgaWYgKF9hdXRvU3RhcnQpIHsKICAgIF9sYXp5U2VydmVyQm9vdCgpOwogICAgc2VydmVyLnN0YXJ0dXAoKTsKICAgIC8vIEl0J3MganVzdCBoZXJlIHRvIHB1c2ggYW4gZXZlbnQgb24gdGhlIGV2ZW50IGxvb3Agc28gdGhhdCB3ZSBpbnZva2UgdGhlCiAgICAvLyBzY2hlZHVsZWQgbWljcm90YXNrcy4KICAgIFRpbWVyLnJ1bigoKSB7fSk7CiAgfQogIHNjcmlwdExvYWRQb3J0LmhhbmRsZXIgPSBfcHJvY2Vzc0xvYWRSZXF1ZXN0OwogIC8vIFJlZ2lzdGVyIHNpZ25hbCBoYW5kbGVyIGFmdGVyIGEgc21hbGwgZGVsYXkgdG8gYXZvaWQgc3RhbGxpbmcgbWFpbgogIC8vIGlzb2xhdGUgc3RhcnR1cC4KICBfcmVnaXN0ZXJTaWduYWxIYW5kbGVyVGltZXIgPSBuZXcgVGltZXIoc2hvcnREZWxheSwgX3JlZ2lzdGVyU2lnbmFsSGFuZGxlcik7CiAgcmV0dXJuIHNjcmlwdExvYWRQb3J0Owp9Cgpfc2h1dGRvd24oKSBuYXRpdmUgIlZNU2VydmljZUlPX1NodXRkb3duIjsKgQ8ATk48ARYBFRoXEhcaGgEUFAE0GgsaDCYaETAaGSoaGxoZGhkaEhkBEA8dARQYDAQcIRsLUQIBIRUmJSggBBgKIhY4BgQtKigELw8CATdARSk8LxACASsvJQIBFSYvERkBGSYoNB8bBjEeJAQCARVMAUgzJB0BQSM1GxggBAEeKiY2FBYPDwgGBAEdEh0YBAIBPDICAUolJjIdGQQoHxYCATUlIwIBSiwhKikpNygyKyVBHz4XBgQRAgEwFR8CAToVIhIhBAEQHCELISEEAgEXFwIBIh4WDAQVGRg9CzgEAgEjARsmHiQMBCI6DARPAgFKCRk0QDg4RDY4SEZGPBMUFxZPHRYEMEgWTxkCASsBEWRhcnQ6dm1zZXJ2aWNlX2lvNW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vdm1zZXJ2aWNlL2xvYWRlci5kYXJ0wACI6y8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIHZtc2VydmljZV9pbzsKCl9zYW5pdGl6ZVdpbmRvd3NQYXRoKHBhdGgpIHsKICAvLyBGb3IgV2luZG93cyB3ZSBuZWVkIHRvIG1hc3NhZ2UgdGhlIHBhdGhzIGEgYml0IGFjY29yZGluZyB0bwogIC8vIGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9iL2llL2FyY2hpdmUvMjAwNi8xMi8wNi9maWxlLXVyaXMtaW4td2luZG93cy5hc3B4CiAgLy8KICAvLyBDb252ZXJ0CiAgLy8gQzpcb25lXHR3b1x0aHJlZQogIC8vIHRvCiAgLy8gL0M6L29uZS90d28vdGhyZWUKCiAgaWYgKF9pc1dpbmRvd3MgPT0gZmFsc2UpIHsKICAgIC8vIERvIG5vdGhpbmcgd2hlbiBub3QgcnVubmluZyBXaW5kb3dzLgogICAgcmV0dXJuIHBhdGg7CiAgfQoKICB2YXIgZml4ZWRQYXRoID0gIiR7cGF0aC5yZXBsYWNlQWxsKCdcXCcsICcvJyl9IjsKCiAgaWYgKChwYXRoLmxlbmd0aCA+IDIpICYmIChwYXRoWzFdID09ICc6JykpIHsKICAgIC8vIFBhdGggYmVnaW5zIHdpdGggYSBkcml2ZSBsZXR0ZXIuCiAgICByZXR1cm4gJy8kZml4ZWRQYXRoJzsKICB9CgogIHJldHVybiBmaXhlZFBhdGg7Cn0KCl90cmltV2luZG93c1BhdGgocGF0aCkgewogIC8vIENvbnZlcnQgL1g6LyB0byBYOi8uCiAgaWYgKF9pc1dpbmRvd3MgPT0gZmFsc2UpIHsKICAgIC8vIERvIG5vdGhpbmcgd2hlbiBub3QgcnVubmluZyBXaW5kb3dzLgogICAgcmV0dXJuIHBhdGg7CiAgfQogIGlmICghcGF0aC5zdGFydHNXaXRoKCcvJykgfHwgKHBhdGgubGVuZ3RoIDwgMykpIHsKICAgIHJldHVybiBwYXRoOwogIH0KICAvLyBNYXRjaCAnLz86Jy4KICBpZiAoKHBhdGhbMF0gPT0gJy8nKSAmJiAocGF0aFsyXSA9PSAnOicpKSB7CiAgICAvLyBSZW1vdmUgbGVhZGluZyAnLycuCiAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMSk7CiAgfQogIHJldHVybiBwYXRoOwp9CgovLyBFbnN1cmUgd2UgaGF2ZSBhIHRyYWlsaW5nIHNsYXNoIGNoYXJhY3Rlci4KX2VuZm9yY2VUcmFpbGluZ1NsYXNoKHVyaSkgewogIGlmICghdXJpLmVuZHNXaXRoKCcvJykpIHsKICAgIHJldHVybiAnJHVyaS8nOwogIH0KICByZXR1cm4gdXJpOwp9CgpjbGFzcyBGaWxlUmVxdWVzdCB7CiAgZmluYWwgU2VuZFBvcnQgc3A7CiAgZmluYWwgaW50IHRhZzsKICBmaW5hbCBVcmkgdXJpOwogIGZpbmFsIFVyaSByZXNvbHZlZFVyaTsKICBmaW5hbCBTdHJpbmcgbGlicmFyeVVybDsKICBGaWxlUmVxdWVzdCh0aGlzLnNwLCB0aGlzLnRhZywgdGhpcy51cmksIHRoaXMucmVzb2x2ZWRVcmksIHRoaXMubGlicmFyeVVybCk7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKYm9vbCBfdHJhY2VMb2FkaW5nID0gZmFsc2U7CkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKYm9vbCBfZGV0ZXJtaW5pc3RpYyA9IGZhbHNlOwoKLy8gU3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBpc29sYXRlIHRoYXQgaXMgdXNlZCBmb3IgbG9hZGluZy4KY2xhc3MgSXNvbGF0ZUxvYWRlclN0YXRlIGV4dGVuZHMgSXNvbGF0ZUVtYmVkZGVyRGF0YSB7CiAgSXNvbGF0ZUxvYWRlclN0YXRlKHRoaXMuaXNvbGF0ZUlkKTsKCiAgZmluYWwgaW50IGlzb2xhdGVJZDsKICBib29sIF9kZWFkID0gZmFsc2U7CiAgU2VuZFBvcnQgc3A7CgogIHZvaWQgaW5pdChTdHJpbmcgcGFja2FnZVJvb3RGbGFnLCBTdHJpbmcgcGFja2FnZXNDb25maWdGbGFnLAogICAgICBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSwgU3RyaW5nIHJvb3RTY3JpcHQpIHsKICAgIGlmIChfZGVhZCkgewogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBfd29ya2luZ0RpcmVjdG9yeSBtdXN0IGJlIHNldCBmaXJzdC4KICAgIF93b3JraW5nRGlyZWN0b3J5ID0gbmV3IFVyaS5kaXJlY3Rvcnkod29ya2luZ0RpcmVjdG9yeSk7CiAgICBpZiAocm9vdFNjcmlwdCAhPSBudWxsKSB7CiAgICAgIF9yb290U2NyaXB0ID0gVXJpLnBhcnNlKHJvb3RTY3JpcHQpOwogICAgfQogICAgLy8gSWYgdGhlIC0tcGFja2FnZS1yb290IGZsYWcgd2FzIHBhc3NlZC4KICAgIGlmIChwYWNrYWdlUm9vdEZsYWcgIT0gbnVsbCkgewogICAgICBfc2V0UGFja2FnZVJvb3QocGFja2FnZVJvb3RGbGFnKTsKICAgIH0KICAgIC8vIElmIHRoZSAtLXBhY2thZ2VzIGZsYWcgd2FzIHBhc3NlZC4KICAgIGlmIChwYWNrYWdlc0NvbmZpZ0ZsYWcgIT0gbnVsbCkgewogICAgICBfc2V0UGFja2FnZXNDb25maWcocGFja2FnZXNDb25maWdGbGFnKTsKICAgIH0KICB9CgogIHZvaWQgdXBkYXRlUGFja2FnZU1hcChTdHJpbmcgcGFja2FnZXNDb25maWdGbGFnKSB7CiAgICBpZiAocGFja2FnZXNDb25maWdGbGFnID09IG51bGwpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgX3BhY2thZ2VNYXAgPSBudWxsOwogICAgX3NldFBhY2thZ2VzQ29uZmlnKHBhY2thZ2VzQ29uZmlnRmxhZyk7CiAgfQoKICB2b2lkIGNsZWFudXAoKSB7CiAgICBfZGVhZCA9IHRydWU7CiAgICBpZiAoX3BhY2thZ2VzUG9ydCAhPSBudWxsKSB7CiAgICAgIF9wYWNrYWdlc1BvcnQuY2xvc2UoKTsKICAgICAgX3BhY2thZ2VzUG9ydCA9IG51bGw7CiAgICB9CiAgfQoKICAvLyBUaGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGUgZW1iZWRkZXIgc3RhcnRlZC4KICBVcmkgX3dvcmtpbmdEaXJlY3Rvcnk7CgogIC8vIFRoZSByb290IHNjcmlwdCdzIHVyaS4KICBVcmkgX3Jvb3RTY3JpcHQ7CgogIC8vIFBhY2thZ2VzIGFyZSBlaXRoZXIgcmVzb2x2ZWQgbG9va2luZyB1cCBpbiBhIG1hcCBvciByZXNvbHZlZCBmcm9tIHdpdGhpbiBhCiAgLy8gcGFja2FnZSByb290LgogIGJvb2wgZ2V0IF9wYWNrYWdlc1JlYWR5ID0+CiAgICAgIChfcGFja2FnZVJvb3QgIT0gbnVsbCkgfHwKICAgICAgKF9wYWNrYWdlTWFwICE9IG51bGwpIHx8CiAgICAgIChfcGFja2FnZUVycm9yICE9IG51bGwpOwoKICAvLyBFcnJvciBzdHJpbmcgc2V0IGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZXNvbHZpbmcgcGFja2FnZSBjb25maWd1cmF0aW9uLgogIC8vIEZvciBleGFtcGxlIG5vdCBmaW5kaW5nIGEgLnBhY2thZ2VzIGZpbGUgb3IgcGFja2FnZXMvIGRpcmVjdG9yeSwgbWFsZm9ybWVkCiAgLy8gLnBhY2thZ2VzIGZpbGUgb3IgYW55IG90aGVyIHJlbGF0ZWQgZXJyb3IuCiAgU3RyaW5nIF9wYWNrYWdlRXJyb3IgPSBudWxsOwoKICAvLyBUaGUgZGlyZWN0b3J5IHRvIGxvb2sgaW4gdG8gcmVzb2x2ZSAicGFja2FnZToiIHNjaGVtZSBVUklzLiBCeSBkZWZhdWx0IGl0CiAgLy8gaXMgdGhlICdwYWNrYWdlcycgZGlyZWN0b3J5IHJpZ2h0IG5leHQgdG8gdGhlIHNjcmlwdC4KICBVcmkgX3BhY2thZ2VSb290ID0gbnVsbDsKCiAgLy8gVGhlIG1hcCBkZXNjcmliaW5nIGhvdyBjZXJ0YWluIHBhY2thZ2UgbmFtZXMgYXJlIG1hcHBlZCB0byBVcmlzLgogIFVyaSBfcGFja2FnZUNvbmZpZyA9IG51bGw7CiAgTWFwPFN0cmluZywgVXJpPiBfcGFja2FnZU1hcCA9IG51bGw7CgogIC8vIFdlIGlzc3VlIG9ubHkgMTYgY29uY3VycmVudCBjYWxscyB0byBGaWxlLnJlYWRBc0J5dGVzKCkgdG8gc3RheSB3aXRoaW4KICAvLyBwbGF0Zm9ybS1zcGVjaWZpYyByZXNvdXJjZSBsaW1pdHMgKGUuZy4gbWF4IG9wZW4gZmlsZXMpLiBUaGUgcmVzdCBnbyBvbgogIC8vIF9maWxlUmVxdWVzdFF1ZXVlIGFuZCBhcmUgcHJvY2Vzc2VkIHdoZW4gd2UgY2FuIHNhZmVseSBpc3N1ZSB0aGVtLgogIHN0YXRpYyBmaW5hbCBpbnQgX21heEZpbGVSZXF1ZXN0cyA9IF9kZXRlcm1pbmlzdGljID8gMSA6IDE2OwogIGludCBjdXJyZW50RmlsZVJlcXVlc3RzID0gMDsKICBmaW5hbCBMaXN0PEZpbGVSZXF1ZXN0PiBfZmlsZVJlcXVlc3RRdWV1ZSA9IG5ldyBMaXN0PEZpbGVSZXF1ZXN0PigpOwoKICBib29sIGdldCBzaG91bGRJc3N1ZUZpbGVSZXF1ZXN0ID0+IGN1cnJlbnRGaWxlUmVxdWVzdHMgPCBfbWF4RmlsZVJlcXVlc3RzOwogIHZvaWQgZW5xdWV1ZUZpbGVSZXF1ZXN0KEZpbGVSZXF1ZXN0IGZyKSB7CiAgICBfZmlsZVJlcXVlc3RRdWV1ZS5hZGQoZnIpOwogIH0KCiAgRmlsZVJlcXVlc3QgZGVxdWV1ZUZpbGVSZXF1ZXN0KCkgewogICAgaWYgKF9maWxlUmVxdWVzdFF1ZXVlLmxlbmd0aCA9PSAwKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIF9maWxlUmVxdWVzdFF1ZXVlLnJlbW92ZUF0KDApOwogIH0KCiAgX3NldFBhY2thZ2VSb290KFN0cmluZyBwYWNrYWdlUm9vdCkgewogICAgcGFja2FnZVJvb3QgPSBfc2FuaXRpemVXaW5kb3dzUGF0aChwYWNrYWdlUm9vdCk7CiAgICBpZiAocGFja2FnZVJvb3Quc3RhcnRzV2l0aCgnZmlsZTonKSB8fAogICAgICAgIHBhY2thZ2VSb290LnN0YXJ0c1dpdGgoJ2h0dHA6JykgfHwKICAgICAgICBwYWNrYWdlUm9vdC5zdGFydHNXaXRoKCdodHRwczonKSkgewogICAgICBwYWNrYWdlUm9vdCA9IF9lbmZvcmNlVHJhaWxpbmdTbGFzaChwYWNrYWdlUm9vdCk7CiAgICAgIF9wYWNrYWdlUm9vdCA9IF93b3JraW5nRGlyZWN0b3J5LnJlc29sdmUocGFja2FnZVJvb3QpOwogICAgfSBlbHNlIHsKICAgICAgcGFja2FnZVJvb3QgPSBfc2FuaXRpemVXaW5kb3dzUGF0aChwYWNrYWdlUm9vdCk7CiAgICAgIHBhY2thZ2VSb290ID0gX3RyaW1XaW5kb3dzUGF0aChwYWNrYWdlUm9vdCk7CiAgICAgIF9wYWNrYWdlUm9vdCA9CiAgICAgICAgICBfd29ya2luZ0RpcmVjdG9yeS5yZXNvbHZlVXJpKG5ldyBVcmkuZGlyZWN0b3J5KHBhY2thZ2VSb290KSk7CiAgICB9CiAgfQoKICBfc2V0UGFja2FnZXNDb25maWcoU3RyaW5nIHBhY2thZ2VzUGFyYW0pIHsKICAgIHZhciBwYWNrYWdlc05hbWUgPSBfc2FuaXRpemVXaW5kb3dzUGF0aChwYWNrYWdlc1BhcmFtKTsKICAgIHZhciBwYWNrYWdlc1VyaSA9IFVyaS5wYXJzZShwYWNrYWdlc05hbWUpOwogICAgaWYgKHBhY2thZ2VzVXJpLnNjaGVtZSA9PSAnJykgewogICAgICAvLyBTY3JpcHQgZG9lcyBub3QgaGF2ZSBhIHNjaGVtZSwgYXNzdW1lIHRoYXQgaXQgaXMgYSBwYXRoLAogICAgICAvLyByZXNvbHZlIGl0IGFnYWluc3QgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LgogICAgICBwYWNrYWdlc1VyaSA9IF93b3JraW5nRGlyZWN0b3J5LnJlc29sdmVVcmkocGFja2FnZXNVcmkpOwogICAgfQogICAgX3JlcXVlc3RQYWNrYWdlc01hcChwYWNrYWdlc1VyaSk7CiAgICBfcGVuZGluZ1BhY2thZ2VMb2Fkcy5hZGQoKCkgewogICAgICAvLyBEdW1teSBhY3Rpb24uCiAgICB9KTsKICB9CgogIC8vIEhhbmRsaW5nIG9mIGFjY2VzcyB0byB0aGUgcGFja2FnZSByb290IG9yIHBhY2thZ2UgbWFwIGZyb20gdXNlciBjb2RlLgogIF90cmlnZ2VyUGFja2FnZVJlc29sdXRpb24oYWN0aW9uKSB7CiAgICBpZiAoX3BhY2thZ2VzUmVhZHkpIHsKICAgICAgLy8gUGFja2FnZXMgYXJlIHJlYWR5LiBFeGVjdXRlIHRoZSBhY3Rpb24gbm93LgogICAgICBhY3Rpb24oKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChfcGVuZGluZ1BhY2thZ2VMb2Fkcy5pc0VtcHR5KSB7CiAgICAgICAgLy8gUGFja2FnZSByZXNvbHV0aW9uIGhhcyBub3QgYmVlbiBzZXR1cCB5ZXQsIGFuZCB0aGlzIGlzIHRoZSBmaXJzdAogICAgICAgIC8vIHJlcXVlc3QgZm9yIHBhY2thZ2UgcmVzb2x1dGlvbiAmIGxvYWRpbmcuCiAgICAgICAgX3JlcXVlc3RQYWNrYWdlc01hcCgpOwogICAgICB9CiAgICAgIC8vIFJlZ2lzdGVyIHRoZSBhY3Rpb24gZm9yIHdoZW4gdGhlIHBhY2thZ2UgcmVzb2x1dGlvbiBpcyByZWFkeS4KICAgICAgX3BlbmRpbmdQYWNrYWdlTG9hZHMuYWRkKGFjdGlvbik7CiAgICB9CiAgfQoKICAvLyBBIGxpc3Qgb2YgY2FsbGJhY2tzIHdoaWNoIHNob3VsZCBiZSBpbnZva2VkIGFmdGVyIHRoZSBwYWNrYWdlIG1hcCBoYXMgYmVlbgogIC8vIGxvYWRlZC4KICBMaXN0PEZ1bmN0aW9uPiBfcGVuZGluZ1BhY2thZ2VMb2FkcyA9IFtdOwoKICAvLyBHaXZlbiBhIHVyaSB3aXRoIGEgJ3BhY2thZ2UnIHNjaGVtZSwgcmV0dXJuIGEgVXJpIHRoYXQgaXMgcHJlZml4ZWQgd2l0aAogIC8vIHRoZSBwYWNrYWdlIHJvb3Qgb3IgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIHBhY2thZ2UgY29uZmlndXJhdGlvbi4KICBVcmkgX3Jlc29sdmVQYWNrYWdlVXJpKFVyaSB1cmkpIHsKICAgIGFzc2VydCh1cmkuc2NoZW1lID09ICJwYWNrYWdlIik7CiAgICBhc3NlcnQoX3BhY2thZ2VzUmVhZHkpOwoKICAgIGlmICh1cmkuaG9zdC5pc05vdEVtcHR5KSB7CiAgICAgIHZhciBwYXRoID0gJyR7dXJpLmhvc3R9JHt1cmkucGF0aH0nOwogICAgICB2YXIgcmlnaHQgPSAncGFja2FnZTokcGF0aCc7CiAgICAgIHZhciB3cm9uZyA9ICdwYWNrYWdlOi8vJHBhdGgnOwoKICAgICAgdGhyb3cgIlVSSXMgdXNpbmcgdGhlICdwYWNrYWdlOicgc2NoZW1lIHNob3VsZCBsb29rIGxpa2UgIgogICAgICAgICAgIickcmlnaHQnLCBub3QgJyR3cm9uZycuIjsKICAgIH0KCiAgICB2YXIgcGFja2FnZU5hbWVFbmQgPSB1cmkucGF0aC5pbmRleE9mKCcvJyk7CiAgICBpZiAocGFja2FnZU5hbWVFbmQgPT0gMCkgewogICAgICAvLyBQYWNrYWdlIFVSSXMgbXVzdCBoYXZlIGEgbm9uLWVtcHR5IHBhY2thZ2UgbmFtZSAobm90IHN0YXJ0IHdpdGggIi8iKS4KICAgICAgdGhyb3cgIlVSSVMgdXNpbmcgdGhlICdwYWNrYWdlOicgc2NoZW1lIHNob3VsZCBsb29rIGxpa2UgIgogICAgICAgICAgIidwYWNrYWdlOnBhY2thZ2VOYW1lJHt1cmkucGF0aH0nLCBub3QgJ3BhY2thZ2U6JHt1cmkucGF0aH0nIjsKICAgIH0KICAgIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coJ1Jlc29sdmluZyBwYWNrYWdlIHdpdGggdXJpIHBhdGg6ICR7dXJpLnBhdGh9Jyk7CiAgICB9CiAgICB2YXIgcmVzb2x2ZWRVcmk7CiAgICBpZiAoX3BhY2thZ2VFcnJvciAhPSBudWxsKSB7CiAgICAgIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICAgICAgX2xvZygiUmVzb2x2aW5nIHBhY2thZ2Ugd2l0aCBwZW5kaW5nIHJlc29sdXRpb24gZXJyb3I6ICRfcGFja2FnZUVycm9yIik7CiAgICAgIH0KICAgICAgdGhyb3cgX3BhY2thZ2VFcnJvcjsKICAgIH0gZWxzZSBpZiAoX3BhY2thZ2VSb290ICE9IG51bGwpIHsKICAgICAgcmVzb2x2ZWRVcmkgPSBfcGFja2FnZVJvb3QucmVzb2x2ZSh1cmkucGF0aCk7CiAgICB9IGVsc2UgewogICAgICBpZiAocGFja2FnZU5hbWVFbmQgPCAwKSB7CiAgICAgICAgLy8gUGFja2FnZSBVUklzIG11c3QgaGF2ZSBhIHBhdGggYWZ0ZXIgdGhlIHBhY2thZ2UgbmFtZSwgZXZlbiBpZiBpdCdzCiAgICAgICAgLy8ganVzdCAiLyIuCiAgICAgICAgdGhyb3cgIlVSSVMgdXNpbmcgdGhlICdwYWNrYWdlOicgc2NoZW1lIHNob3VsZCBsb29rIGxpa2UgIgogICAgICAgICAgICAiJ3BhY2thZ2U6JHt1cmkucGF0aH0vJywgbm90ICdwYWNrYWdlOiR7dXJpLnBhdGh9JyI7CiAgICAgIH0KICAgICAgdmFyIHBhY2thZ2VOYW1lID0gdXJpLnBhdGguc3Vic3RyaW5nKDAsIHBhY2thZ2VOYW1lRW5kKTsKICAgICAgdmFyIG1hcHBpbmcgPSBfcGFja2FnZU1hcFtwYWNrYWdlTmFtZV07CiAgICAgIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICAgICAgX2xvZygiTWFwcGVkICckcGFja2FnZU5hbWUnIHBhY2thZ2UgdG8gJyRtYXBwaW5nJyIpOwogICAgICB9CiAgICAgIGlmIChtYXBwaW5nID09IG51bGwpIHsKICAgICAgICB0aHJvdyAiTm8gbWFwcGluZyBmb3IgJyRwYWNrYWdlTmFtZScgcGFja2FnZSB3aGVuIHJlc29sdmluZyAnJHVyaScuIjsKICAgICAgfQogICAgICB2YXIgcGF0aDsKICAgICAgYXNzZXJ0KHVyaS5wYXRoLmxlbmd0aCA+IHBhY2thZ2VOYW1lLmxlbmd0aCk7CiAgICAgIHBhdGggPSB1cmkucGF0aC5zdWJzdHJpbmcocGFja2FnZU5hbWUubGVuZ3RoICsgMSk7CiAgICAgIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICAgICAgX2xvZygiUGF0aCB0byBiZSByZXNvbHZlZCBpbiBwYWNrYWdlOiAkcGF0aCIpOwogICAgICB9CiAgICAgIHJlc29sdmVkVXJpID0gbWFwcGluZy5yZXNvbHZlKHBhdGgpOwogICAgfQogICAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiUmVzb2x2ZWQgJyR1cmknIHRvICckcmVzb2x2ZWRVcmknLiIpOwogICAgfQogICAgcmV0dXJuIHJlc29sdmVkVXJpOwogIH0KCiAgUmF3UmVjZWl2ZVBvcnQgX3BhY2thZ2VzUG9ydDsKCiAgdm9pZCBfcmVxdWVzdFBhY2thZ2VzTWFwKFtVcmkgcGFja2FnZUNvbmZpZ10pIHsKICAgIGlmIChfcGFja2FnZXNQb3J0ICE9IG51bGwpIHsKICAgICAgLy8gQWxyZWFkeSBzY2hlZHVsZWQuCiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIENyZWF0ZSBhIHBvcnQgdG8gcmVjZWl2ZSB0aGUgcGFja2FnZXMgbWFwIG9uLgogICAgX3BhY2thZ2VzUG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydChfaGFuZGxlUGFja2FnZXNSZXBseSk7CiAgICB2YXIgc3AgPSBfcGFja2FnZXNQb3J0LnNlbmRQb3J0OwoKICAgIGlmIChwYWNrYWdlQ29uZmlnICE9IG51bGwpIHsKICAgICAgLy8gRXhwbGljaXRseSBzcGVjaWZpZWQgLnBhY2thZ2VzIHBhdGguCiAgICAgIF9oYW5kbGVQYWNrYWdlc1JlcXVlc3Qoc3AsIF90cmFjZUxvYWRpbmcsIC0yLCBwYWNrYWdlQ29uZmlnKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFNlYXJjaCBmb3IgLnBhY2thZ2VzIHN0YXJ0aW5nIGF0IHRoZSByb290IHNjcmlwdC4KICAgICAgX2hhbmRsZVBhY2thZ2VzUmVxdWVzdChzcCwgX3RyYWNlTG9hZGluZywgLTEsIF9yb290U2NyaXB0KTsKICAgIH0KCiAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICBfbG9nKCJSZXF1ZXN0ZWQgcGFja2FnZXMgbWFwIGZvciAnJF9yb290U2NyaXB0Jy4iKTsKICAgIH0KICB9CgogIHZvaWQgX2hhbmRsZVBhY2thZ2VzUmVwbHkobXNnKSB7CiAgICBpZiAoX3BhY2thZ2VzUG9ydCA9PSBudWxsKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIE1ha2Ugc3VyZSB0byBjbG9zZSB0aGUgX3BhY2thZ2VQb3J0IGJlZm9yZSBhbnkgb3RoZXIgYWN0aW9uLgogICAgX3BhY2thZ2VzUG9ydC5jbG9zZSgpOwogICAgX3BhY2thZ2VzUG9ydCA9IG51bGw7CgogICAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiR290IHBhY2thZ2VzIHJlcGx5OiAkbXNnIik7CiAgICB9CiAgICBpZiAobXNnIGlzIFN0cmluZykgewogICAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIkdvdCBmYWlsdXJlIHJlc3BvbnNlIG9uIHBhY2thZ2UgcG9ydDogJyRtc2cnIik7CiAgICAgIH0KICAgICAgLy8gUmVtZW1iZXIgdGhlIGVycm9yIG1lc3NhZ2UuCiAgICAgIF9wYWNrYWdlRXJyb3IgPSBtc2c7CiAgICB9IGVsc2UgaWYgKG1zZyBpcyBMaXN0KSB7CiAgICAgIGlmIChtc2cubGVuZ3RoID09IDEpIHsKICAgICAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICAgICAgX2xvZygiUmVjZWl2ZWQgcGFja2FnZSByb290OiAnJHttc2dbMF19JyIpOwogICAgICAgIH0KICAgICAgICBfcGFja2FnZVJvb3QgPSBVcmkucGFyc2UobXNnWzBdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBGaXJzdCBlbnRyeSBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIGxvYWRlZCAucGFja2FnZXMgZmlsZS4KICAgICAgICBhc3NlcnQoKG1zZy5sZW5ndGggJSAyKSA9PSAwKTsKICAgICAgICBhc3NlcnQobXNnLmxlbmd0aCA+PSAyKTsKICAgICAgICBhc3NlcnQobXNnWzFdID09IG51bGwpOwogICAgICAgIF9wYWNrYWdlQ29uZmlnID0gVXJpLnBhcnNlKG1zZ1swXSk7CiAgICAgICAgX3BhY2thZ2VNYXAgPSBuZXcgTWFwPFN0cmluZywgVXJpPigpOwogICAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgICAvLyBUT0RPKGlwb3N2YSk6IENvbXBsYWluIGFib3V0IGR1cGxpY2F0ZSBlbnRyaWVzLgogICAgICAgICAgX3BhY2thZ2VNYXBbbXNnW2ldXSA9IFVyaS5wYXJzZShtc2dbaSArIDFdKTsKICAgICAgICB9CiAgICAgICAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgICAgICAgIF9sb2coIlNldHVwIHBhY2thZ2UgbWFwOiAkX3BhY2thZ2VNYXAiKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIF9wYWNrYWdlRXJyb3IgPSAiQmFkIHR5cGUgb2YgcGFja2FnZXMgcmVwbHk6ICR7bXNnLnJ1bnRpbWVUeXBlfSI7CiAgICAgIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICAgICAgX2xvZyhfcGFja2FnZUVycm9yKTsKICAgICAgfQogICAgfQoKICAgIC8vIFJlc29sdmUgYWxsIHBlbmRpbmcgcGFja2FnZSBsb2FkcyBub3cgdGhhdCB3ZSBrbm93IGhvdyB0byByZXNvbHZlIHRoZW0uCiAgICB3aGlsZSAoX3BlbmRpbmdQYWNrYWdlTG9hZHMubGVuZ3RoID4gMCkgewogICAgICAvLyBPcmRlciBkb2VzIG5vdCBtYXR0ZXIgYXMgd2UgcXVldWUgYWxsIG9mIHRoZSByZXF1ZXN0cyB1cCByaWdodCBub3cuCiAgICAgIHZhciByZXEgPSBfcGVuZGluZ1BhY2thZ2VMb2Fkcy5yZW1vdmVMYXN0KCk7CiAgICAgIC8vIENhbGwgdGhlIHJlZ2lzdGVyZWQgY2xvc3VyZSwgdG8gaGFuZGxlIHRoZSBkZWxheWVkIGFjdGlvbi4KICAgICAgcmVxKCk7CiAgICB9CiAgICAvLyBSZXNldCB0aGUgcGVuZGluZyBwYWNrYWdlIGxvYWRzIHRvIGVtcHR5LiBTbyB0aGF0IHdlIGV2ZW50dWFsbHkgY2FuCiAgICAvLyBmaW5pc2ggbG9hZGluZy4KICAgIF9wZW5kaW5nUGFja2FnZUxvYWRzID0gW107CiAgfQp9CgpfbG9nKG1zZykgewogIHByaW50KCIlICRtc2ciKTsKfQoKdmFyIF9odHRwQ2xpZW50OwoKLy8gU2VuZCBhIHJlc3BvbnNlIHRvIHRoZSByZXF1ZXN0aW5nIGlzb2xhdGUuCnZvaWQgX3NlbmRSZXNvdXJjZVJlc3BvbnNlKFNlbmRQb3J0IHNwLCBpbnQgdGFnLCBVcmkgdXJpLCBVcmkgcmVzb2x2ZWRVcmksCiAgICBTdHJpbmcgbGlicmFyeVVybCwgZHluYW1pYyBkYXRhKSB7CiAgYXNzZXJ0KChkYXRhIGlzIExpc3Q8aW50PikgfHwgKGRhdGEgaXMgU3RyaW5nKSk7CiAgdmFyIG1zZyA9IG5ldyBMaXN0KDUpOwogIGlmIChkYXRhIGlzIFN0cmluZykgewogICAgLy8gV2UgZW5jb3VudGVyZWQgYW4gZXJyb3IsIGZsaXAgdGhlIHNpZ24gb2YgdGhlIHRhZyB0byBpbmRpY2F0ZSB0aGF0LgogICAgdGFnID0gLXRhZzsKICAgIGlmIChsaWJyYXJ5VXJsID09IG51bGwpIHsKICAgICAgZGF0YSA9ICdDb3VsZCBub3QgbG9hZCAiJHVyaSI6ICRkYXRhJzsKICAgIH0gZWxzZSB7CiAgICAgIGRhdGEgPSAnQ291bGQgbm90IGltcG9ydCAiJHVyaSIgZnJvbSAiJGxpYnJhcnlVcmwiOiAkZGF0YSc7CiAgICB9CiAgfQogIG1zZ1swXSA9IHRhZzsKICBtc2dbMV0gPSB1cmkudG9TdHJpbmcoKTsKICBtc2dbMl0gPSByZXNvbHZlZFVyaS50b1N0cmluZygpOwogIG1zZ1szXSA9IGxpYnJhcnlVcmw7CiAgbXNnWzRdID0gZGF0YTsKICBzcC5zZW5kKG1zZyk7Cn0KCi8vIFNlbmQgYSByZXNwb25zZSB0byB0aGUgcmVxdWVzdGluZyBpc29sYXRlLgp2b2lkIF9zZW5kRXh0ZW5zaW9uSW1wb3J0UmVzcG9uc2UoCiAgICBTZW5kUG9ydCBzcCwgVXJpIHVyaSwgU3RyaW5nIGxpYnJhcnlVcmwsIFN0cmluZyByZXNvbHZlZFVyaSkgewogIHZhciBtc2cgPSBuZXcgTGlzdCg1KTsKICBpbnQgdGFnID0gX0RhcnRfa0ltcG9ydEV4dGVuc2lvbjsKICBpZiAocmVzb2x2ZWRVcmkgPT0gbnVsbCkgewogICAgLy8gV2UgY291bGQgbm90IHJlc29sdmUgdGhlIGRhcnQtZXh0OiB1cmkuCiAgICB0YWcgPSAtdGFnOwogICAgcmVzb2x2ZWRVcmkgPSAnQ291bGQgbm90IHJlc29sdmUgIiR1cmkiIGZyb20gIiRsaWJyYXJ5VXJsIic7CiAgfQogIG1zZ1swXSA9IHRhZzsKICBtc2dbMV0gPSB1cmkudG9TdHJpbmcoKTsKICBtc2dbMl0gPSByZXNvbHZlZFVyaTsKICBtc2dbM10gPSBsaWJyYXJ5VXJsOwogIG1zZ1s0XSA9IHJlc29sdmVkVXJpOwogIHNwLnNlbmQobXNnKTsKfQoKdm9pZCBfbG9hZEh0dHAoCiAgICBTZW5kUG9ydCBzcCwgaW50IHRhZywgVXJpIHVyaSwgVXJpIHJlc29sdmVkVXJpLCBTdHJpbmcgbGlicmFyeVVybCkgewogIGlmIChfaHR0cENsaWVudCA9PSBudWxsKSB7CiAgICBfaHR0cENsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCkuLm1heENvbm5lY3Rpb25zUGVySG9zdCA9IDY7CiAgfQogIF9odHRwQ2xpZW50CiAgICAgIC5nZXRVcmwocmVzb2x2ZWRVcmkpCiAgICAgIC50aGVuKChIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSA9PiByZXF1ZXN0LmNsb3NlKCkpCiAgICAgIC50aGVuKChIdHRwQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UpIHsKICAgIHZhciBidWlsZGVyID0gbmV3IEJ5dGVzQnVpbGRlcihjb3B5OiBmYWxzZSk7CiAgICByZXNwb25zZS5saXN0ZW4oYnVpbGRlci5hZGQsIG9uRG9uZTogKCkgewogICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPSAyMDApIHsKICAgICAgICB2YXIgbXNnID0gIkZhaWx1cmUgZ2V0dGluZyAkcmVzb2x2ZWRVcmk6XG4iCiAgICAgICAgICAgICIgICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX0gJHtyZXNwb25zZS5yZWFzb25QaHJhc2V9IjsKICAgICAgICBfc2VuZFJlc291cmNlUmVzcG9uc2Uoc3AsIHRhZywgdXJpLCByZXNvbHZlZFVyaSwgbGlicmFyeVVybCwgbXNnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfc2VuZFJlc291cmNlUmVzcG9uc2UoCiAgICAgICAgICAgIHNwLCB0YWcsIHVyaSwgcmVzb2x2ZWRVcmksIGxpYnJhcnlVcmwsIGJ1aWxkZXIudGFrZUJ5dGVzKCkpOwogICAgICB9CiAgICB9LCBvbkVycm9yOiAoZSkgewogICAgICBfc2VuZFJlc291cmNlUmVzcG9uc2UoCiAgICAgICAgICBzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsLCBlLnRvU3RyaW5nKCkpOwogICAgfSk7CiAgfSkuY2F0Y2hFcnJvcigoZSkgewogICAgX3NlbmRSZXNvdXJjZVJlc3BvbnNlKHNwLCB0YWcsIHVyaSwgcmVzb2x2ZWRVcmksIGxpYnJhcnlVcmwsIGUudG9TdHJpbmcoKSk7CiAgfSk7CiAgLy8gSXQncyBqdXN0IGhlcmUgdG8gcHVzaCBhbiBldmVudCBvbiB0aGUgZXZlbnQgbG9vcCBzbyB0aGF0IHdlIGludm9rZSB0aGUKICAvLyBzY2hlZHVsZWQgbWljcm90YXNrcy4KICBUaW1lci5ydW4oKCkge30pOwp9Cgp2b2lkIF9sb2FkRmlsZShJc29sYXRlTG9hZGVyU3RhdGUgbG9hZGVyU3RhdGUsIFNlbmRQb3J0IHNwLCBpbnQgdGFnLCBVcmkgdXJpLAogICAgVXJpIHJlc29sdmVkVXJpLCBTdHJpbmcgbGlicmFyeVVybCkgewogIHZhciBwYXRoID0gcmVzb2x2ZWRVcmkudG9GaWxlUGF0aCgpOwogIHZhciBzb3VyY2VGaWxlID0gbmV3IEZpbGUocGF0aCk7CiAgc291cmNlRmlsZS5yZWFkQXNCeXRlcygpLnRoZW4oKGRhdGEpIHsKICAgIF9zZW5kUmVzb3VyY2VSZXNwb25zZShzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsLCBkYXRhKTsKICB9LCBvbkVycm9yOiAoZSkgewogICAgX3NlbmRSZXNvdXJjZVJlc3BvbnNlKHNwLCB0YWcsIHVyaSwgcmVzb2x2ZWRVcmksIGxpYnJhcnlVcmwsIGUudG9TdHJpbmcoKSk7CiAgfSkud2hlbkNvbXBsZXRlKCgpIHsKICAgIGxvYWRlclN0YXRlLmN1cnJlbnRGaWxlUmVxdWVzdHMtLTsKICAgIHdoaWxlIChsb2FkZXJTdGF0ZS5zaG91bGRJc3N1ZUZpbGVSZXF1ZXN0KSB7CiAgICAgIEZpbGVSZXF1ZXN0IGZyID0gbG9hZGVyU3RhdGUuZGVxdWV1ZUZpbGVSZXF1ZXN0KCk7CiAgICAgIGlmIChmciA9PSBudWxsKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgX2xvYWRGaWxlKAogICAgICAgICAgbG9hZGVyU3RhdGUsIGZyLnNwLCBmci50YWcsIGZyLnVyaSwgZnIucmVzb2x2ZWRVcmksIGZyLmxpYnJhcnlVcmwpOwogICAgICBsb2FkZXJTdGF0ZS5jdXJyZW50RmlsZVJlcXVlc3RzKys7CiAgICB9CiAgfSk7Cn0KCnZvaWQgX2xvYWREYXRhVXJpKAogICAgU2VuZFBvcnQgc3AsIGludCB0YWcsIFVyaSB1cmksIFVyaSByZXNvbHZlZFVyaSwgU3RyaW5nIGxpYnJhcnlVcmwpIHsKICB0cnkgewogICAgdmFyIG1pbWUgPSB1cmkuZGF0YS5taW1lVHlwZTsKICAgIGlmICgobWltZSAhPSAiYXBwbGljYXRpb24vZGFydCIpICYmIChtaW1lICE9ICJ0ZXh0L3BsYWluIikpIHsKICAgICAgdGhyb3cgIk1JTUUtdHlwZSBtdXN0IGJlIGFwcGxpY2F0aW9uL2RhcnQgb3IgdGV4dC9wbGFpbjogJG1pbWUgZ2l2ZW4uIjsKICAgIH0KICAgIHZhciBjaGFyc2V0ID0gdXJpLmRhdGEuY2hhcnNldDsKICAgIGlmICgoY2hhcnNldCAhPSAidXRmLTgiKSAmJiAoY2hhcnNldCAhPSAiVVMtQVNDSUkiKSkgewogICAgICAvLyBUaGUgQysrIHBvcnRpb24gb2YgdGhlIGVtYmVkZGVyIGFzc3VtZXMgVVRGLTguCiAgICAgIHRocm93ICJPbmx5IHV0Zi04IG9yIFVTLUFTQ0lJIGVuY29kaW5ncyBhcmUgc3VwcG9ydGVkOiAkY2hhcnNldCBnaXZlbi4iOwogICAgfQogICAgX3NlbmRSZXNvdXJjZVJlc3BvbnNlKAogICAgICAgIHNwLCB0YWcsIHVyaSwgcmVzb2x2ZWRVcmksIGxpYnJhcnlVcmwsIHVyaS5kYXRhLmNvbnRlbnRBc0J5dGVzKCkpOwogIH0gY2F0Y2ggKGUpIHsKICAgIF9zZW5kUmVzb3VyY2VSZXNwb25zZShzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsLAogICAgICAgICJJbnZhbGlkIGRhdGEgdXJpICgkdXJpKTpcbiAgJGUiKTsKICB9Cn0KCi8vIExvYWRpbmcgYSBwYWNrYWdlIFVSSSBuZWVkcyB0byBmaXJzdCBtYXAgdGhlIHBhY2thZ2UgbmFtZSB0byBhIGxvYWRhYmxlCi8vIFVSSS4KX2xvYWRQYWNrYWdlKElzb2xhdGVMb2FkZXJTdGF0ZSBsb2FkZXJTdGF0ZSwgU2VuZFBvcnQgc3AsIGJvb2wgdHJhY2VMb2FkaW5nLAogICAgaW50IHRhZywgVXJpIHVyaSwgVXJpIHJlc29sdmVkVXJpLCBTdHJpbmcgbGlicmFyeVVybCkgewogIGlmIChsb2FkZXJTdGF0ZS5fcGFja2FnZXNSZWFkeSkgewogICAgdmFyIHJlc29sdmVkVXJpOwogICAgdHJ5IHsKICAgICAgcmVzb2x2ZWRVcmkgPSBsb2FkZXJTdGF0ZS5fcmVzb2x2ZVBhY2thZ2VVcmkodXJpKTsKICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIkV4Y2VwdGlvbiAoJGUpIHdoZW4gcmVzb2x2aW5nIHBhY2thZ2UgVVJJOiAkdXJpIik7CiAgICAgIH0KICAgICAgLy8gUmVwb3J0IGVycm9yLgogICAgICBfc2VuZFJlc291cmNlUmVzcG9uc2UoCiAgICAgICAgICBzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsLCBlLnRvU3RyaW5nKCkpOwogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBSZWN1cnNpdmVseSBjYWxsIHdpdGggdGhlIG5ldyByZXNvbHZlZCB1cmkuCiAgICBfaGFuZGxlUmVzb3VyY2VSZXF1ZXN0KAogICAgICAgIGxvYWRlclN0YXRlLCBzcCwgdHJhY2VMb2FkaW5nLCB0YWcsIHVyaSwgcmVzb2x2ZWRVcmksIGxpYnJhcnlVcmwpOwogIH0gZWxzZSB7CiAgICBpZiAobG9hZGVyU3RhdGUuX3BlbmRpbmdQYWNrYWdlTG9hZHMuaXNFbXB0eSkgewogICAgICAvLyBQYWNrYWdlIHJlc29sdXRpb24gaGFzIG5vdCBiZWVuIHNldHVwIHlldCwgYW5kIHRoaXMgaXMgdGhlIGZpcnN0CiAgICAgIC8vIHJlcXVlc3QgZm9yIHBhY2thZ2UgcmVzb2x1dGlvbiAmIGxvYWRpbmcuCiAgICAgIGxvYWRlclN0YXRlLl9yZXF1ZXN0UGFja2FnZXNNYXAoKTsKICAgIH0KICAgIC8vIFJlZ2lzdGVyIHRoZSBhY3Rpb24gb2YgbG9hZGluZyB0aGlzIHBhY2thZ2Ugb25jZSB0aGUgcGFja2FnZSByZXNvbHV0aW9uCiAgICAvLyBpcyByZWFkeS4KICAgIGxvYWRlclN0YXRlLl9wZW5kaW5nUGFja2FnZUxvYWRzLmFkZCgoKSB7CiAgICAgIF9oYW5kbGVSZXNvdXJjZVJlcXVlc3QoCiAgICAgICAgICBsb2FkZXJTdGF0ZSwgc3AsIHRyYWNlTG9hZGluZywgdGFnLCB1cmksIHVyaSwgbGlicmFyeVVybCk7CiAgICB9KTsKICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiUGVuZGluZyBwYWNrYWdlIGxvYWQgb2YgJyR1cmknOiAiCiAgICAgICAgICAiJHtsb2FkZXJTdGF0ZS5fcGVuZGluZ1BhY2thZ2VMb2Fkcy5sZW5ndGh9IHBlbmRpbmciKTsKICAgIH0KICB9Cn0KCi8vIFRPRE8oam9obm1jY3V0Y2hhbik6IFRoaXMgYW5kIG1vc3Qgb3RoZXIgdG9wIGxldmVsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUKLy8gc2hvdWxkIGJlIHR1cm5lZCBpbnRvIG1ldGhvZHMgb24gdGhlIElzb2xhdGVMb2FkZXJTdGF0ZSBjbGFzcy4KX2hhbmRsZVJlc291cmNlUmVxdWVzdChJc29sYXRlTG9hZGVyU3RhdGUgbG9hZGVyU3RhdGUsIFNlbmRQb3J0IHNwLAogICAgYm9vbCB0cmFjZUxvYWRpbmcsIGludCB0YWcsIFVyaSB1cmksIFVyaSByZXNvbHZlZFVyaSwgU3RyaW5nIGxpYnJhcnlVcmwpIHsKICBpZiAocmVzb2x2ZWRVcmkuc2NoZW1lID09ICcnIHx8IHJlc29sdmVkVXJpLnNjaGVtZSA9PSAnZmlsZScpIHsKICAgIGlmIChsb2FkZXJTdGF0ZS5zaG91bGRJc3N1ZUZpbGVSZXF1ZXN0KSB7CiAgICAgIF9sb2FkRmlsZShsb2FkZXJTdGF0ZSwgc3AsIHRhZywgdXJpLCByZXNvbHZlZFVyaSwgbGlicmFyeVVybCk7CiAgICAgIGxvYWRlclN0YXRlLmN1cnJlbnRGaWxlUmVxdWVzdHMrKzsKICAgIH0gZWxzZSB7CiAgICAgIEZpbGVSZXF1ZXN0IGZyID0gbmV3IEZpbGVSZXF1ZXN0KHNwLCB0YWcsIHVyaSwgcmVzb2x2ZWRVcmksIGxpYnJhcnlVcmwpOwogICAgICBsb2FkZXJTdGF0ZS5lbnF1ZXVlRmlsZVJlcXVlc3QoZnIpOwogICAgfQogIH0gZWxzZSBpZiAoKHJlc29sdmVkVXJpLnNjaGVtZSA9PSAnaHR0cCcpIHx8CiAgICAgIChyZXNvbHZlZFVyaS5zY2hlbWUgPT0gJ2h0dHBzJykpIHsKICAgIF9sb2FkSHR0cChzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsKTsKICB9IGVsc2UgaWYgKChyZXNvbHZlZFVyaS5zY2hlbWUgPT0gJ2RhdGEnKSkgewogICAgX2xvYWREYXRhVXJpKHNwLCB0YWcsIHVyaSwgcmVzb2x2ZWRVcmksIGxpYnJhcnlVcmwpOwogIH0gZWxzZSBpZiAoKHJlc29sdmVkVXJpLnNjaGVtZSA9PSAncGFja2FnZScpKSB7CiAgICBfbG9hZFBhY2thZ2UoCiAgICAgICAgbG9hZGVyU3RhdGUsIHNwLCB0cmFjZUxvYWRpbmcsIHRhZywgdXJpLCByZXNvbHZlZFVyaSwgbGlicmFyeVVybCk7CiAgfSBlbHNlIHsKICAgIF9zZW5kUmVzb3VyY2VSZXNwb25zZSgKICAgICAgICBzcCwKICAgICAgICB0YWcsCiAgICAgICAgdXJpLAogICAgICAgIHJlc29sdmVkVXJpLAogICAgICAgIGxpYnJhcnlVcmwsCiAgICAgICAgJ1Vua25vd24gc2NoZW1lICgke3Jlc29sdmVkVXJpLnNjaGVtZX0pIGZvciAnCiAgICAgICAgJyRyZXNvbHZlZFVyaScpOwogIH0KfQoKLy8gSGFuZGxpbmcgb2YgcGFja2FnZXMgcmVxdWVzdHMuIEZpbmRpbmcgYW5kIHBhcnNpbmcgb2YgLnBhY2thZ2VzIGZpbGUgb3IKLy8gcGFja2FnZXMvIGRpcmVjdG9yaWVzLgpjb25zdCBfTEYgPSAweDBBOwpjb25zdCBfQ1IgPSAweDBEOwpjb25zdCBfU1BBQ0UgPSAweDIwOwpjb25zdCBfSEFTSCA9IDB4MjM7CmNvbnN0IF9ET1QgPSAweDJFOwpjb25zdCBfQ09MT04gPSAweDNBOwpjb25zdCBfREVMID0gMHg3RjsKCmNvbnN0IF9pbnZhbGlkUGFja2FnZU5hbWVDaGFycyA9IGNvbnN0IFsKICB0cnVlLCAvLyAgc3BhY2UKICBmYWxzZSwgLy8gIQogIHRydWUsIC8vICAiCiAgdHJ1ZSwgLy8gICMKICBmYWxzZSwgLy8gJAogIHRydWUsIC8vICAlCiAgZmFsc2UsIC8vICYKICBmYWxzZSwgLy8gJwogIGZhbHNlLCAvLyAoCiAgZmFsc2UsIC8vICkKICBmYWxzZSwgLy8gKgogIGZhbHNlLCAvLyArCiAgZmFsc2UsIC8vICwKICBmYWxzZSwgLy8gLQogIGZhbHNlLCAvLyAuCiAgdHJ1ZSwgLy8gIC8KICBmYWxzZSwgLy8gMAogIGZhbHNlLCAvLyAxCiAgZmFsc2UsIC8vIDIKICBmYWxzZSwgLy8gMwogIGZhbHNlLCAvLyA0CiAgZmFsc2UsIC8vIDUKICBmYWxzZSwgLy8gNgogIGZhbHNlLCAvLyA3CiAgZmFsc2UsIC8vIDgKICBmYWxzZSwgLy8gOQogIHRydWUsIC8vICA6CiAgZmFsc2UsIC8vIDsKICB0cnVlLCAvLyAgPAogIGZhbHNlLCAvLyA9CiAgdHJ1ZSwgLy8gID4KICB0cnVlLCAvLyAgPwogIGZhbHNlLCAvLyBACiAgZmFsc2UsIC8vIEEKICBmYWxzZSwgLy8gQgogIGZhbHNlLCAvLyBDCiAgZmFsc2UsIC8vIEQKICBmYWxzZSwgLy8gRQogIGZhbHNlLCAvLyBGCiAgZmFsc2UsIC8vIEcKICBmYWxzZSwgLy8gSAogIGZhbHNlLCAvLyBJCiAgZmFsc2UsIC8vIEoKICBmYWxzZSwgLy8gSwogIGZhbHNlLCAvLyBMCiAgZmFsc2UsIC8vIE0KICBmYWxzZSwgLy8gTgogIGZhbHNlLCAvLyBPCiAgZmFsc2UsIC8vIFAKICBmYWxzZSwgLy8gUQogIGZhbHNlLCAvLyBSCiAgZmFsc2UsIC8vIFMKICBmYWxzZSwgLy8gVAogIGZhbHNlLCAvLyBVCiAgZmFsc2UsIC8vIFYKICBmYWxzZSwgLy8gVwogIGZhbHNlLCAvLyBYCiAgZmFsc2UsIC8vIFkKICBmYWxzZSwgLy8gWgogIHRydWUsIC8vICBbCiAgdHJ1ZSwgLy8gIFwKICB0cnVlLCAvLyAgXQogIHRydWUsIC8vICBeCiAgZmFsc2UsIC8vIF8KICB0cnVlLCAvLyAgYAogIGZhbHNlLCAvLyBhCiAgZmFsc2UsIC8vIGIKICBmYWxzZSwgLy8gYwogIGZhbHNlLCAvLyBkCiAgZmFsc2UsIC8vIGUKICBmYWxzZSwgLy8gZgogIGZhbHNlLCAvLyBnCiAgZmFsc2UsIC8vIGgKICBmYWxzZSwgLy8gaQogIGZhbHNlLCAvLyBqCiAgZmFsc2UsIC8vIGsKICBmYWxzZSwgLy8gbAogIGZhbHNlLCAvLyBtCiAgZmFsc2UsIC8vIG4KICBmYWxzZSwgLy8gbwogIGZhbHNlLCAvLyBwCiAgZmFsc2UsIC8vIHEKICBmYWxzZSwgLy8gcgogIGZhbHNlLCAvLyBzCiAgZmFsc2UsIC8vIHQKICBmYWxzZSwgLy8gdQogIGZhbHNlLCAvLyB2CiAgZmFsc2UsIC8vIHcKICBmYWxzZSwgLy8geAogIGZhbHNlLCAvLyB5CiAgZmFsc2UsIC8vIHoKICB0cnVlLCAvLyAgewogIHRydWUsIC8vICB8CiAgdHJ1ZSwgLy8gIH0KICBmYWxzZSwgLy8gfgogIHRydWUsIC8vICBERUwKXTsKCl9wYXJzZVBhY2thZ2VzRmlsZSgKICAgIFNlbmRQb3J0IHNwLCBib29sIHRyYWNlTG9hZGluZywgVXJpIHBhY2thZ2VzRmlsZSwgTGlzdDxpbnQ+IGRhdGEpIHsKICAvLyBUaGUgZmlyc3QgZW50cnkgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBpZGVudGlmaWVkIC5wYWNrYWdlcyBmaWxlCiAgLy8gaW5zdGVhZCBvZiBhIG1hcHBpbmcuCiAgdmFyIHJlc3VsdCA9IFtwYWNrYWdlc0ZpbGUudG9TdHJpbmcoKSwgbnVsbF07CiAgdmFyIGluZGV4ID0gMDsKICB2YXIgbGVuID0gZGF0YS5sZW5ndGg7CiAgd2hpbGUgKGluZGV4IDwgbGVuKSB7CiAgICB2YXIgc3RhcnQgPSBpbmRleDsKICAgIHZhciBjaGFyID0gZGF0YVtpbmRleF07CiAgICBpZiAoKGNoYXIgPT0gX0NSKSB8fCAoY2hhciA9PSBfTEYpKSB7CiAgICAgIC8vIFNraXBwaW5nIGVtcHR5IGxpbmVzLgogICAgICBpbmRleCsrOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICAvLyBJZGVudGlmeSBzcGxpdCB3aXRoaW4gdGhlIGxpbmUgYW5kIGVuZCBvZiB0aGUgbGluZS4KICAgIHZhciBzZXBhcmF0b3IgPSAtMTsKICAgIHZhciBlbmQgPSBsZW47CiAgICAvLyBWZXJpZnlpbmcgdmFsaWRpdHkgb2YgcGFja2FnZSBuYW1lIHdoaWxlIHNjYW5uaW5nIHRoZSBsaW5lLgogICAgdmFyIG5vbkRvdCA9IGZhbHNlOwogICAgdmFyIGludmFsaWRQYWNrYWdlTmFtZSA9IGZhbHNlOwoKICAgIC8vIFNjYW4gdG8gdGhlIGVuZCBvZiB0aGUgbGluZSBvciBkYXRhLgogICAgd2hpbGUgKGluZGV4IDwgbGVuKSB7CiAgICAgIGNoYXIgPSBkYXRhW2luZGV4KytdOwogICAgICAvLyBJZiB3ZSBoYXZlIG5vdCByZWFjaGVkIHRoZSBzZXBhcmF0b3IgeWV0LCBkZXRlcm1pbmUgd2hldGhlciB3ZSBhcmUKICAgICAgLy8gc2Nhbm5pbmcgbGVnYWwgcGFja2FnZSBuYW1lIGNoYXJhY3RlcnMuCiAgICAgIGlmIChzZXBhcmF0b3IgPT0gLTEpIHsKICAgICAgICBpZiAoKGNoYXIgPT0gX0NPTE9OKSkgewogICAgICAgICAgLy8gVGhlIGZpcnN0IGNvbG9uIG9uIGEgbGluZSBpcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gcGFja2FnZSBuYW1lIGFuZAogICAgICAgICAgLy8gcmVsYXRlZCBVUkkuCiAgICAgICAgICBzZXBhcmF0b3IgPSBpbmRleCAtIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFN0aWxsIHNjYW5uaW5nIHRoZSBwYWNrYWdlIG5hbWUgcGFydC4gQ2hlY2sgZm9yIHRoZSB2YWxpZGl0eSBvZgogICAgICAgICAgLy8gdGhlIGNoYXJhY3RlcnMuCiAgICAgICAgICBub25Eb3QgPSBub25Eb3QgfHwgKGNoYXIgIT0gX0RPVCk7CiAgICAgICAgICBpbnZhbGlkUGFja2FnZU5hbWUgPSBpbnZhbGlkUGFja2FnZU5hbWUgfHwKICAgICAgICAgICAgICAoY2hhciA8IF9TUEFDRSkgfHwKICAgICAgICAgICAgICAoY2hhciA+IF9ERUwpIHx8CiAgICAgICAgICAgICAgX2ludmFsaWRQYWNrYWdlTmFtZUNoYXJzW2NoYXIgLSBfU1BBQ0VdOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBJZGVudGlmeSBlbmQgb2YgbGluZS4KICAgICAgaWYgKChjaGFyID09IF9DUikgfHwgKGNoYXIgPT0gX0xGKSkgewogICAgICAgIGVuZCA9IGluZGV4IC0gMTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIC8vIE5vIGZ1cnRoZXIgaGFuZGxpbmcgbmVlZGVkIGZvciBjb21tZW50IGxpbmVzLgogICAgaWYgKGRhdGFbc3RhcnRdID09IF9IQVNIKSB7CiAgICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgICBfbG9nKCJTa2lwcGluZyBjb21tZW50IGluICRwYWNrYWdlc0ZpbGU6XG4iCiAgICAgICAgICAgICIke25ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhkYXRhLCBzdGFydCwgZW5kKX0iKTsKICAgICAgfQogICAgICBjb250aW51ZTsKICAgIH0KCiAgICAvLyBDaGVjayBmb3IgYSBiYWRseSBmb3JtYXR0ZWQgbGluZSwgc3RhcnRpbmcgd2l0aCBhICc6Jy4KICAgIGlmIChzZXBhcmF0b3IgPT0gc3RhcnQpIHsKICAgICAgdmFyIGxpbmUgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgICBfbG9nKCJMaW5lIHN0YXJ0cyB3aXRoICc6JyBpbiAkcGFja2FnZXNGaWxlOlxuIgogICAgICAgICAgICAiJGxpbmUiKTsKICAgICAgfQogICAgICBzcC5zZW5kKCJNaXNzaW5nIHBhY2thZ2UgbmFtZSBpbiAkcGFja2FnZXNGaWxlOlxuIgogICAgICAgICAgIiRsaW5lIik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBFbnN1cmUgdGhlcmUgaXMgYSBzZXBhcmF0b3Igb24gdGhlIGxpbmUuCiAgICBpZiAoc2VwYXJhdG9yID09IC0xKSB7CiAgICAgIHZhciBsaW5lID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgICAgX2xvZygiTGluZSBoYXMgbm8gJzonIGluICRwYWNrYWdlc0ZpbGU6XG4iCiAgICAgICAgICAgICIkbGluZSIpOwogICAgICB9CiAgICAgIHNwLnNlbmQoIk1pc3NpbmcgJzonIHNlcGFyYXRvciBpbiAkcGFja2FnZXNGaWxlOlxuIgogICAgICAgICAgIiRsaW5lIik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgcGFja2FnZU5hbWUgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoZGF0YSwgc3RhcnQsIHNlcGFyYXRvcik7CgogICAgLy8gQ2hlY2sgZm9yIHZhbGlkIHBhY2thZ2UgbmFtZS4KICAgIGlmIChpbnZhbGlkUGFja2FnZU5hbWUgfHwgIW5vbkRvdCkgewogICAgICB2YXIgbGluZSA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhkYXRhLCBzdGFydCwgZW5kKTsKICAgICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIkludmFsaWQgcGFja2FnZSBuYW1lICRwYWNrYWdlTmFtZSBpbiAkcGFja2FnZXNGaWxlIik7CiAgICAgIH0KICAgICAgc3Auc2VuZCgiSW52YWxpZCBwYWNrYWdlIG5hbWUgJyRwYWNrYWdlTmFtZScgaW4gJHBhY2thZ2VzRmlsZTpcbiIKICAgICAgICAgICIkbGluZSIpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICBfbG9nKCJwYWNrYWdlTmFtZTogJHBhY2thZ2VOYW1lIik7CiAgICB9CiAgICB2YXIgcGFja2FnZVVyaSA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhkYXRhLCBzZXBhcmF0b3IgKyAxLCBlbmQpOwogICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICBfbG9nKCJvcmlnaW5hbCBwYWNrYWdlVXJpOiAkcGFja2FnZVVyaSIpOwogICAgfQogICAgLy8gRW5zdXJlIHRoZSBwYWNrYWdlIHVyaSBlbmRzIHdpdGggYSAvLgogICAgaWYgKCFwYWNrYWdlVXJpLmVuZHNXaXRoKCIvIikpIHsKICAgICAgcGFja2FnZVVyaSA9ICIkcGFja2FnZVVyaS8iOwogICAgfQogICAgcGFja2FnZVVyaSA9IHBhY2thZ2VzRmlsZS5yZXNvbHZlKHBhY2thZ2VVcmkpLnRvU3RyaW5nKCk7CiAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIm1hcHBpbmc6ICRwYWNrYWdlTmFtZSAtPiAkcGFja2FnZVVyaSIpOwogICAgfQogICAgcmVzdWx0LmFkZChwYWNrYWdlTmFtZSk7CiAgICByZXN1bHQuYWRkKHBhY2thZ2VVcmkpOwogIH0KCiAgaWYgKHRyYWNlTG9hZGluZykgewogICAgX2xvZygiUGFyc2VkIHBhY2thZ2VzIGZpbGUgYXQgJHBhY2thZ2VzRmlsZS4gU2VuZGluZzpcbiRyZXN1bHQiKTsKICB9CiAgc3Auc2VuZChyZXN1bHQpOwp9CgpfbG9hZFBhY2thZ2VzRmlsZShTZW5kUG9ydCBzcCwgYm9vbCB0cmFjZUxvYWRpbmcsIFVyaSBwYWNrYWdlc0ZpbGUpIGFzeW5jIHsKICB0cnkgewogICAgdmFyIGRhdGEgPSBhd2FpdCBuZXcgRmlsZS5mcm9tVXJpKHBhY2thZ2VzRmlsZSkucmVhZEFzQnl0ZXMoKTsKICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiTG9hZGVkIHBhY2thZ2VzIGZpbGUgZnJvbSAkcGFja2FnZXNGaWxlOlxuIgogICAgICAgICAgIiR7bmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGRhdGEpfSIpOwogICAgfQogICAgX3BhcnNlUGFja2FnZXNGaWxlKHNwLCB0cmFjZUxvYWRpbmcsIHBhY2thZ2VzRmlsZSwgZGF0YSk7CiAgfSBjYXRjaCAoZSwgcykgewogICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICBfbG9nKCJFcnJvciBsb2FkaW5nIHBhY2thZ2VzOiAkZVxuJHMiKTsKICAgIH0KICAgIHNwLnNlbmQoIlVuY2F1Z2h0IGVycm9yICgkZSkgbG9hZGluZyBwYWNrYWdlcyBmaWxlLiIpOwogIH0KfQoKX2ZpbmRQYWNrYWdlc0ZpbGUoU2VuZFBvcnQgc3AsIGJvb2wgdHJhY2VMb2FkaW5nLCBVcmkgYmFzZSkgYXN5bmMgewogIHRyeSB7CiAgICAvLyBXYWxrIHVwIHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5IHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mCiAgICAvLyAucGFja2FnZXMgZmlsZXMgaW4gcGFyZW50IGRpcmVjdG9yaWVzIGFuZCBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhCiAgICAvLyBwYWNrYWdlcy8gZGlyZWN0b3J5IG9uIHRoZSBmaXJzdCBpdGVyYXRpb24uCiAgICB2YXIgZGlyID0gbmV3IEZpbGUuZnJvbVVyaShiYXNlKS5wYXJlbnQ7CiAgICB2YXIgcHJldiA9IG51bGw7CiAgICAvLyBLZWVwIHNlYXJjaGluZyB1bnRpbCB3ZSByZWFjaCB0aGUgcm9vdC4KICAgIHdoaWxlICgocHJldiA9PSBudWxsKSB8fCAocHJldi5wYXRoICE9IGRpci5wYXRoKSkgewogICAgICAvLyBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhIC5wYWNrYWdlcyBmaWxlIGFuZCBpZiBpdCBleGlzdHMgdHJ5IHRvCiAgICAgIC8vIGxvYWQgYW5kIHBhcnNlIGl0LgogICAgICB2YXIgZGlyVXJpID0gZGlyLnVyaTsKICAgICAgdmFyIHBhY2thZ2VzRmlsZSA9IGRpclVyaS5yZXNvbHZlKCIucGFja2FnZXMiKTsKICAgICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIkNoZWNraW5nIGZvciAkcGFja2FnZXNGaWxlIGZpbGUuIik7CiAgICAgIH0KICAgICAgdmFyIGV4aXN0cyA9IGF3YWl0IG5ldyBGaWxlLmZyb21VcmkocGFja2FnZXNGaWxlKS5leGlzdHMoKTsKICAgICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIiRwYWNrYWdlc0ZpbGUgZXhpc3RzOiAkZXhpc3RzIik7CiAgICAgIH0KICAgICAgaWYgKGV4aXN0cykgewogICAgICAgIF9sb2FkUGFja2FnZXNGaWxlKHNwLCB0cmFjZUxvYWRpbmcsIHBhY2thZ2VzRmlsZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIE1vdmUgdXAgb25lIGxldmVsLgogICAgICBwcmV2ID0gZGlyOwogICAgICBkaXIgPSBkaXIucGFyZW50OwogICAgfQoKICAgIC8vIE5vIC5wYWNrYWdlcyBmaWxlIHdhcyBmb3VuZC4KICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiQ291bGQgbm90IHJlc29sdmUgYSBwYWNrYWdlIGxvY2F0aW9uIGZyb20gJGJhc2UiKTsKICAgIH0KICAgIHNwLnNlbmQoIkNvdWxkIG5vdCByZXNvbHZlIGEgcGFja2FnZSBsb2NhdGlvbiBmb3IgYmFzZSBhdCAkYmFzZSIpOwogIH0gY2F0Y2ggKGUsIHMpIHsKICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiRXJyb3IgbG9hZGluZyBwYWNrYWdlczogJGVcbiRzIik7CiAgICB9CiAgICBzcC5zZW5kKCJVbmNhdWdodCBlcnJvciAoJGUpIGxvYWRpbmcgcGFja2FnZXMgZmlsZS4iKTsKICB9Cn0KCkZ1dHVyZTxib29sPiBfbG9hZEh0dHBQYWNrYWdlc0ZpbGUoCiAgICBTZW5kUG9ydCBzcCwgYm9vbCB0cmFjZUxvYWRpbmcsIFVyaSByZXNvdXJjZSkgYXN5bmMgewogIHRyeSB7CiAgICBpZiAoX2h0dHBDbGllbnQgPT0gbnVsbCkgewogICAgICBfaHR0cENsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCkuLm1heENvbm5lY3Rpb25zUGVySG9zdCA9IDY7CiAgICB9CiAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIkZldGNoaW5nIHBhY2thZ2VzIGZpbGUgZnJvbSAnJHJlc291cmNlJy4iKTsKICAgIH0KICAgIHZhciByZXEgPSBhd2FpdCBfaHR0cENsaWVudC5nZXRVcmwocmVzb3VyY2UpOwogICAgdmFyIHJzcCA9IGF3YWl0IHJlcS5jbG9zZSgpOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgQnl0ZXNCdWlsZGVyKGNvcHk6IGZhbHNlKTsKICAgIGF3YWl0IGZvciAodmFyIGJ5dGVzIGluIHJzcCkgewogICAgICBidWlsZGVyLmFkZChieXRlcyk7CiAgICB9CiAgICBpZiAocnNwLnN0YXR1c0NvZGUgIT0gMjAwKSB7CiAgICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgICBfbG9nKCJHb3Qgc3RhdHVzICR7cnNwLnN0YXR1c0NvZGV9IGZldGNoaW5nICckcmVzb3VyY2UnLiIpOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHZhciBkYXRhID0gYnVpbGRlci50YWtlQnl0ZXMoKTsKICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiTG9hZGVkIHBhY2thZ2VzIGZpbGUgZnJvbSAnJHJlc291cmNlJzpcbiIKICAgICAgICAgICIke25ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhkYXRhKX0iKTsKICAgIH0KICAgIF9wYXJzZVBhY2thZ2VzRmlsZShzcCwgdHJhY2VMb2FkaW5nLCByZXNvdXJjZSwgZGF0YSk7CiAgfSBjYXRjaCAoZSwgcykgewogICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICBfbG9nKCJFcnJvciBsb2FkaW5nIHBhY2thZ2VzIGZpbGUgZnJvbSAnJHJlc291cmNlJzogJGVcbiRzIik7CiAgICB9CiAgICBzcC5zZW5kKCJVbmNhdWdodCBlcnJvciAoJGUpIGxvYWRpbmcgcGFja2FnZXMgZmlsZSBmcm9tICckcmVzb3VyY2UnLiIpOwogIH0KICByZXR1cm4gZmFsc2U7Cn0KCl9sb2FkUGFja2FnZXNEYXRhKHNwLCB0cmFjZUxvYWRpbmcsIHJlc291cmNlKSB7CiAgdHJ5IHsKICAgIHZhciBkYXRhID0gcmVzb3VyY2UuZGF0YTsKICAgIHZhciBtaW1lID0gZGF0YS5taW1lVHlwZTsKICAgIGlmIChtaW1lICE9ICJ0ZXh0L3BsYWluIikgewogICAgICB0aHJvdyAiTUlNRS10eXBlIG11c3QgYmUgdGV4dC9wbGFpbjogJG1pbWUgZ2l2ZW4uIjsKICAgIH0KICAgIHZhciBjaGFyc2V0ID0gZGF0YS5jaGFyc2V0OwogICAgaWYgKChjaGFyc2V0ICE9ICJ1dGYtOCIpICYmIChjaGFyc2V0ICE9ICJVUy1BU0NJSSIpKSB7CiAgICAgIC8vIFRoZSBDKysgcG9ydGlvbiBvZiB0aGUgZW1iZWRkZXIgYXNzdW1lcyBVVEYtOC4KICAgICAgdGhyb3cgIk9ubHkgdXRmLTggb3IgVVMtQVNDSUkgZW5jb2RpbmdzIGFyZSBzdXBwb3J0ZWQ6ICRjaGFyc2V0IGdpdmVuLiI7CiAgICB9CiAgICBfcGFyc2VQYWNrYWdlc0ZpbGUoc3AsIHRyYWNlTG9hZGluZywgcmVzb3VyY2UsIGRhdGEuY29udGVudEFzQnl0ZXMoKSk7CiAgfSBjYXRjaCAoZSkgewogICAgc3Auc2VuZCgiVW5jYXVnaHQgZXJyb3IgKCRlKSBsb2FkaW5nIHBhY2thZ2VzIGRhdGEuIik7CiAgfQp9CgovLyBUaGlzIGNvZGUgdXNlZCB0byBleGlzdCBpbiBhIHNlY29uZCBpc29sYXRlIGFuZCBzbyBpdCB1c2VzIGEgU2VuZFBvcnQgdG8KLy8gcmVwb3J0IGl0J3MgcmV0dXJuIHZhbHVlLiBUaGlzIGNvdWxkIGJlIHJlZmFjdG9yZWQgc28gdGhhdCBpdCByZXR1cm5zIGl0J3MKLy8gdmFsdWUgYW5kIHRoZSBjYWxsZXIgY291bGQgd2FpdCBvbiB0aGUgZnV0dXJlIHJhdGhlciB0aGFuIGEgbWVzc2FnZSBvbgovLyBTZW5kUG9ydC4KX2hhbmRsZVBhY2thZ2VzUmVxdWVzdCgKICAgIFNlbmRQb3J0IHNwLCBib29sIHRyYWNlTG9hZGluZywgaW50IHRhZywgVXJpIHJlc291cmNlKSBhc3luYyB7CiAgdHJ5IHsKICAgIGlmICh0YWcgPT0gLTEpIHsKICAgICAgaWYgKHJlc291cmNlLnNjaGVtZSA9PSAnJyB8fCByZXNvdXJjZS5zY2hlbWUgPT0gJ2ZpbGUnKSB7CiAgICAgICAgX2ZpbmRQYWNrYWdlc0ZpbGUoc3AsIHRyYWNlTG9hZGluZywgcmVzb3VyY2UpOwogICAgICB9IGVsc2UgaWYgKChyZXNvdXJjZS5zY2hlbWUgPT0gJ2h0dHAnKSB8fCAocmVzb3VyY2Uuc2NoZW1lID09ICdodHRwcycpKSB7CiAgICAgICAgLy8gVHJ5IHRvIGxvYWQgdGhlIC5wYWNrYWdlcyBmaWxlIG5leHQgdG8gdGhlIHJlc291cmNlLgogICAgICAgIHZhciBwYWNrYWdlc1VyaSA9IHJlc291cmNlLnJlc29sdmUoIi5wYWNrYWdlcyIpOwogICAgICAgIHZhciBleGlzdHMgPSBhd2FpdCBfbG9hZEh0dHBQYWNrYWdlc0ZpbGUoc3AsIHRyYWNlTG9hZGluZywgcGFja2FnZXNVcmkpOwogICAgICAgIGlmICghZXhpc3RzKSB7CiAgICAgICAgICAvLyBMb2FkaW5nIG9mIHRoZSAucGFja2FnZXMgZmlsZSBmYWlsZWQgZm9yIGh0dHAvaHR0cHMgYmFzZWQgc2NyaXB0cwogICAgICAgICAgc3Auc2VuZChbbnVsbF0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBzcC5zZW5kKCJVbnN1cHBvcnRlZCBzY2hlbWUgdXNlZCB0byBsb2NhdGUgLnBhY2thZ2VzIGZpbGU6ICIKICAgICAgICAgICAgIickcmVzb3VyY2UnLiIpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRhZyA9PSAtMikgewogICAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgICAgX2xvZygiSGFuZGxpbmcgbG9hZCBvZiBwYWNrYWdlcyBtYXA6ICckcmVzb3VyY2UnLiIpOwogICAgICB9CiAgICAgIGlmIChyZXNvdXJjZS5zY2hlbWUgPT0gJycgfHwgcmVzb3VyY2Uuc2NoZW1lID09ICdmaWxlJykgewogICAgICAgIHZhciBleGlzdHMgPSBhd2FpdCBuZXcgRmlsZS5mcm9tVXJpKHJlc291cmNlKS5leGlzdHMoKTsKICAgICAgICBpZiAoZXhpc3RzKSB7CiAgICAgICAgICBfbG9hZFBhY2thZ2VzRmlsZShzcCwgdHJhY2VMb2FkaW5nLCByZXNvdXJjZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNwLnNlbmQoIlBhY2thZ2VzIGZpbGUgJyRyZXNvdXJjZScgbm90IGZvdW5kLiIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICgocmVzb3VyY2Uuc2NoZW1lID09ICdodHRwJykgfHwgKHJlc291cmNlLnNjaGVtZSA9PSAnaHR0cHMnKSkgewogICAgICAgIHZhciBleGlzdHMgPSBhd2FpdCBfbG9hZEh0dHBQYWNrYWdlc0ZpbGUoc3AsIHRyYWNlTG9hZGluZywgcmVzb3VyY2UpOwogICAgICAgIGlmICghZXhpc3RzKSB7CiAgICAgICAgICBzcC5zZW5kKCJQYWNrYWdlcyBmaWxlICckcmVzb3VyY2UnIG5vdCBmb3VuZC4iKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2Uuc2NoZW1lID09ICdkYXRhJykgewogICAgICAgIF9sb2FkUGFja2FnZXNEYXRhKHNwLCB0cmFjZUxvYWRpbmcsIHJlc291cmNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzcC5zZW5kKCJVbmtub3duIHNjaGVtZSAoJHtyZXNvdXJjZS5zY2hlbWV9KSBmb3IgcGFja2FnZSBmaWxlIGF0ICIKICAgICAgICAgICAgIickcmVzb3VyY2UnLiIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzcC5zZW5kKCJVbmtub3duIHBhY2thZ2VzIHJlcXVlc3QgdGFnOiAkdGFnIGZvciAnJHJlc291cmNlJy4iKTsKICAgIH0KICB9IGNhdGNoIChlLCBzKSB7CiAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIkVycm9yIGhhbmRsaW5nIHBhY2thZ2VzIHJlcXVlc3Q6ICRlXG4kcyIpOwogICAgfQogICAgc3Auc2VuZCgiVW5jYXVnaHQgZXJyb3IgKCRlKSBoYW5kbGluZyBwYWNrYWdlcyByZXF1ZXN0LiIpOwogIH0KfQoKLy8gU2h1dGRvd24gYWxsIGFjdGl2ZSBsb2FkZXJzIGJ5IHNlbmRpbmcgYW4gZXJyb3IgbWVzc2FnZS4Kdm9pZCBzaHV0ZG93bkxvYWRlcnMoKSB7CiAgU3RyaW5nIG1lc3NhZ2UgPSAnU2VydmljZSBzaHV0ZG93bic7CiAgaWYgKF9odHRwQ2xpZW50ICE9IG51bGwpIHsKICAgIF9odHRwQ2xpZW50LmNsb3NlKGZvcmNlOiB0cnVlKTsKICAgIF9odHRwQ2xpZW50ID0gbnVsbDsKICB9CiAgaXNvbGF0ZUVtYmVkZGVyRGF0YS52YWx1ZXMudG9MaXN0KCkuZm9yRWFjaCgoaWVkKSB7CiAgICBJc29sYXRlTG9hZGVyU3RhdGUgaWxzID0gaWVkOwogICAgaWxzLmNsZWFudXAoKTsKICAgIGFzc2VydChpbHMuc3AgIT0gbnVsbCk7CiAgICBfc2VuZFJlc291cmNlUmVzcG9uc2UoaWxzLnNwLCAxLCBudWxsLCBudWxsLCBudWxsLCBtZXNzYWdlKTsKICB9KTsKfQoKLy8gU2VlIERhcnRfTGlicmFyeVRhZyBpbiBkYXJ0X2FwaS5oCmNvbnN0IF9EYXJ0X2tDYW5vbmljYWxpemVVcmwgPSAwOyAvLyBDYW5vbmljYWxpemUgdGhlIFVSTC4KY29uc3QgX0RhcnRfa1NjcmlwdFRhZyA9IDE7IC8vIExvYWQgdGhlIHJvb3Qgc2NyaXB0Lgpjb25zdCBfRGFydF9rU291cmNlVGFnID0gMjsgLy8gTG9hZCBhIHBhcnQgc291cmNlLgpjb25zdCBfRGFydF9rSW1wb3J0VGFnID0gMzsgLy8gSW1wb3J0IGEgbGlicmFyeS4KCi8vIEV4dHJhIHJlcXVlc3RzLiBLZWVwIHRoZXNlIGluIHN5bmMgYmV0d2VlbiBsb2FkZXIuZGFydCBhbmQgYnVpbHRpbi5kYXJ0Lgpjb25zdCBfRGFydF9rSW5pdExvYWRlciA9IDQ7IC8vIEluaXRpYWxpemUgdGhlIGxvYWRlci4KY29uc3QgX0RhcnRfa1Jlc291cmNlTG9hZCA9IDU7IC8vIFJlc291cmNlIGNsYXNzIHN1cHBvcnQuCmNvbnN0IF9EYXJ0X2tHZXRQYWNrYWdlUm9vdFVyaSA9IDY7IC8vIFVyaSBvZiB0aGUgcGFja2FnZXMvIGRpcmVjdG9yeS4KY29uc3QgX0RhcnRfa0dldFBhY2thZ2VDb25maWdVcmkgPSA3OyAvLyBVcmkgb2YgdGhlIC5wYWNrYWdlcyBmaWxlLgpjb25zdCBfRGFydF9rUmVzb2x2ZVBhY2thZ2VVcmkgPSA4OyAvLyBSZXNvbHZlIGEgcGFja2FnZTogdXJpLgoKLy8gRXh0cmEgcmVxdWVzdHMuIEtlZXAgdGhlc2UgaW4gc3luYyBiZXR3ZWVuIGxvYWRlci5kYXJ0IGFuZCBsb2FkZXIuY2MuCmNvbnN0IF9EYXJ0X2tJbXBvcnRFeHRlbnNpb24gPSA5OyAvLyBJbXBvcnQgYSBkYXJ0LWV4dDogZmlsZS4KY29uc3QgX0RhcnRfa1Jlc29sdmVBc0ZpbGVQYXRoID0gMTA7IC8vIFJlc29sdmUgdXJpIHRvIGZpbGUgcGF0aC4KCi8vIEV4dGVybmFsIGVudHJ5IHBvaW50IGZvciBsb2FkZXIgcmVxdWVzdHMuCl9wcm9jZXNzTG9hZFJlcXVlc3QocmVxdWVzdCkgewogIGFzc2VydChyZXF1ZXN0IGlzIExpc3QpOwogIGFzc2VydChyZXF1ZXN0Lmxlbmd0aCA+IDQpOwoKICAvLyBTaG91bGQgd2UgdHJhY2UgbG9hZGluZz8KICBib29sIHRyYWNlTG9hZGluZyA9IHJlcXVlc3RbMF07CgogIC8vIFRoaXMgaXMgdGhlIHNlbmRpbmcgaXNvbGF0ZSdzIERhcnRfR2V0TWFpblBvcnRJZCgpLgogIGludCBpc29sYXRlSWQgPSByZXF1ZXN0WzFdOwoKICAvLyBUaGUgdGFnIGRlc2NyaWJpbmcgdGhlIG9wZXJhdGlvbi4KICBpbnQgdGFnID0gcmVxdWVzdFsyXTsKCiAgLy8gVGhlIHNlbmQgcG9ydCB0byBzZW5kIHRoZSByZXNwb25zZSBvbi4KICBTZW5kUG9ydCBzcCA9IHJlcXVlc3RbM107CgogIC8vIEdyYWIgdGhlIGxvYWRlciBzdGF0ZSBmb3IgdGhlIHJlcXVlc3RpbmcgaXNvbGF0ZS4KICBJc29sYXRlTG9hZGVyU3RhdGUgbG9hZGVyU3RhdGUgPSBpc29sYXRlRW1iZWRkZXJEYXRhW2lzb2xhdGVJZF07CgogIC8vIFdlIGFyZSBlaXRoZXIgYWJvdXQgdG8gaW5pdGlhbGl6ZSB0aGUgbG9hZGVyLCBvciwgd2UgYWxyZWFkeSBoYXZlLgogIGFzc2VydCgodGFnID09IF9EYXJ0X2tJbml0TG9hZGVyKSB8fCAobG9hZGVyU3RhdGUgIT0gbnVsbCkpOwoKICAvLyBIYW5kbGUgdGhlIHJlcXVlc3Qgc3BlY2lmaWVkIGluIHRoZSB0YWcuCiAgc3dpdGNoICh0YWcpIHsKICAgIGNhc2UgX0RhcnRfa0luaXRMb2FkZXI6CiAgICAgIHsKICAgICAgICBTdHJpbmcgcGFja2FnZVJvb3QgPSByZXF1ZXN0WzRdOwogICAgICAgIFN0cmluZyBwYWNrYWdlc0ZpbGUgPSByZXF1ZXN0WzVdOwogICAgICAgIFN0cmluZyB3b3JraW5nRGlyZWN0b3J5ID0gcmVxdWVzdFs2XTsKICAgICAgICBTdHJpbmcgcm9vdFNjcmlwdCA9IHJlcXVlc3RbN107CiAgICAgICAgYm9vbCBpc1JlbG9hZGluZyA9IHJlcXVlc3RbOF07CiAgICAgICAgaWYgKGxvYWRlclN0YXRlID09IG51bGwpIHsKICAgICAgICAgIGxvYWRlclN0YXRlID0gbmV3IElzb2xhdGVMb2FkZXJTdGF0ZShpc29sYXRlSWQpOwogICAgICAgICAgaXNvbGF0ZUVtYmVkZGVyRGF0YVtpc29sYXRlSWRdID0gbG9hZGVyU3RhdGU7CiAgICAgICAgICBsb2FkZXJTdGF0ZS5pbml0KAogICAgICAgICAgICAgIHBhY2thZ2VSb290LCBwYWNrYWdlc0ZpbGUsIHdvcmtpbmdEaXJlY3RvcnksIHJvb3RTY3JpcHQpOwogICAgICAgIH0gZWxzZSBpZiAoaXNSZWxvYWRpbmcpIHsKICAgICAgICAgIGxvYWRlclN0YXRlLnVwZGF0ZVBhY2thZ2VNYXAocGFja2FnZXNGaWxlKTsKICAgICAgICB9CiAgICAgICAgbG9hZGVyU3RhdGUuc3AgPSBzcDsKICAgICAgICBhc3NlcnQoaXNvbGF0ZUVtYmVkZGVyRGF0YVtpc29sYXRlSWRdID09IGxvYWRlclN0YXRlKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgX0RhcnRfa1Jlc291cmNlTG9hZDoKICAgICAgewogICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UocmVxdWVzdFs0XSk7CiAgICAgICAgX2hhbmRsZVJlc291cmNlUmVxdWVzdCgKICAgICAgICAgICAgbG9hZGVyU3RhdGUsIHNwLCB0cmFjZUxvYWRpbmcsIHRhZywgdXJpLCB1cmksIG51bGwpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSBfRGFydF9rR2V0UGFja2FnZVJvb3RVcmk6CiAgICAgIGxvYWRlclN0YXRlLl90cmlnZ2VyUGFja2FnZVJlc29sdXRpb24oKCkgewogICAgICAgIC8vIFRoZSBwYWNrYWdlIHJvb3QgaXMgZGVwcmVjYXRlZCBhbmQgbm93IGFsd2F5cyByZXR1cm5zIG51bGwuCiAgICAgICAgc3Auc2VuZChudWxsKTsKICAgICAgfSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBfRGFydF9rR2V0UGFja2FnZUNvbmZpZ1VyaToKICAgICAgbG9hZGVyU3RhdGUuX3RyaWdnZXJQYWNrYWdlUmVzb2x1dGlvbigoKSB7CiAgICAgICAgLy8gUmVzcG9uZCB3aXRoIHRoZSBwYWNrYWdlcyBjb25maWcgKGlmIGFueSkgYWZ0ZXIgcGFja2FnZSByZXNvbHV0aW9uLgogICAgICAgIHNwLnNlbmQobG9hZGVyU3RhdGUuX3BhY2thZ2VDb25maWcpOwogICAgICB9KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIF9EYXJ0X2tSZXNvbHZlUGFja2FnZVVyaToKICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZShyZXF1ZXN0WzRdKTsKICAgICAgbG9hZGVyU3RhdGUuX3RyaWdnZXJQYWNrYWdlUmVzb2x1dGlvbigoKSB7CiAgICAgICAgLy8gUmVzcG9uZCB3aXRoIHRoZSByZXNvbHZlZCBwYWNrYWdlIHVyaSBhZnRlciBwYWNrYWdlIHJlc29sdXRpb24uCiAgICAgICAgVXJpIHJlc29sdmVkVXJpOwogICAgICAgIHRyeSB7CiAgICAgICAgICByZXNvbHZlZFVyaSA9IGxvYWRlclN0YXRlLl9yZXNvbHZlUGFja2FnZVVyaSh1cmkpOwogICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgICAgICAgX2xvZygiRXhjZXB0aW9uICgkZSkgd2hlbiByZXNvbHZpbmcgcGFja2FnZSBVUkk6ICR1cmkiKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc29sdmVkVXJpID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgc3Auc2VuZChyZXNvbHZlZFVyaSk7CiAgICAgIH0pOwogICAgICBicmVhazsKICAgIGNhc2UgX0RhcnRfa0ltcG9ydEV4dGVuc2lvbjoKICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZShyZXF1ZXN0WzRdKTsKICAgICAgU3RyaW5nIGxpYnJhcnlVcmkgPSByZXF1ZXN0WzVdOwogICAgICAvLyBTdHJpcCBhbnkgZmlsZW5hbWUgb2ZmIG9mIHRoZSBsaWJyYXJ5VXJpJ3MgcGF0aC4KICAgICAgaW50IGluZGV4ID0gbGlicmFyeVVyaS5sYXN0SW5kZXhPZignLycpOwogICAgICB2YXIgcGF0aDsKICAgICAgaWYgKGluZGV4ID09IC0xKSB7CiAgICAgICAgcGF0aCA9ICcuLyc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGF0aCA9IGxpYnJhcnlVcmkuc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7CiAgICAgIH0KICAgICAgdmFyIHBhdGhVcmkgPSBVcmkucGFyc2UocGF0aCk7CiAgICAgIHN3aXRjaCAocGF0aFVyaS5zY2hlbWUpIHsKICAgICAgICBjYXNlICcnOgogICAgICAgIGNhc2UgJ2ZpbGUnOgogICAgICAgICAgX3NlbmRFeHRlbnNpb25JbXBvcnRSZXNwb25zZSgKICAgICAgICAgICAgICBzcCwgdXJpLCBsaWJyYXJ5VXJpLCBwYXRoVXJpLnRvRmlsZVBhdGgoKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdkYXRhJzoKICAgICAgICBjYXNlICdodHRwJzoKICAgICAgICBjYXNlICdodHRwcyc6CiAgICAgICAgICBfc2VuZEV4dGVuc2lvbkltcG9ydFJlc3BvbnNlKHNwLCB1cmksIGxpYnJhcnlVcmksIHBhdGhVcmkudG9TdHJpbmcoKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdwYWNrYWdlJzoKICAgICAgICAgIC8vIFN0YXJ0IHBhY2thZ2UgcmVzb2x1dGlvbi4KICAgICAgICAgIGxvYWRlclN0YXRlLl90cmlnZ2VyUGFja2FnZVJlc29sdXRpb24oKCkgewogICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGZpbmQgdGhlIGZ1bGx5IHJlc29sdmVkIHVyaSBvZiBbcGF0aF0uCiAgICAgICAgICAgIFVyaSByZXNvbHZlZFVyaTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICByZXNvbHZlZFVyaSA9IGxvYWRlclN0YXRlLl9yZXNvbHZlUGFja2FnZVVyaShwYXRoVXJpKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgICAgICAgICAgIF9sb2coIkV4Y2VwdGlvbiAoJGUpIHdoZW4gcmVzb2x2aW5nIHBhY2thZ2UgVVJJOiAkdXJpIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJlc29sdmVkVXJpID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBfc2VuZEV4dGVuc2lvbkltcG9ydFJlc3BvbnNlKAogICAgICAgICAgICAgICAgc3AsIHVyaSwgbGlicmFyeVVyaSwgcmVzb2x2ZWRVcmkudG9TdHJpbmcoKSk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgICAgICAgIF9sb2coJ1Vua25vd24gc2NoZW1lICgke3BhdGhVcmkuc2NoZW1lfSkgaW4gJHBhdGhVcmkuJyk7CiAgICAgICAgICB9CiAgICAgICAgICBfc2VuZEV4dGVuc2lvbkltcG9ydFJlc3BvbnNlKHNwLCB1cmksIGxpYnJhcnlVcmksIG51bGwpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIF9EYXJ0X2tSZXNvbHZlQXNGaWxlUGF0aDoKICAgICAgbG9hZGVyU3RhdGUuX3RyaWdnZXJQYWNrYWdlUmVzb2x1dGlvbigoKSB7CiAgICAgICAgU3RyaW5nIHVyaSA9IHJlcXVlc3RbNF07CiAgICAgICAgVXJpIHJlc29sdmVkVXJpID0gVXJpLnBhcnNlKF9zYW5pdGl6ZVdpbmRvd3NQYXRoKHVyaSkpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAocmVzb2x2ZWRVcmkuc2NoZW1lID09ICdwYWNrYWdlJykgewogICAgICAgICAgICByZXNvbHZlZFVyaSA9IGxvYWRlclN0YXRlLl9yZXNvbHZlUGFja2FnZVVyaShyZXNvbHZlZFVyaSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocmVzb2x2ZWRVcmkuc2NoZW1lID09ICcnIHx8IHJlc29sdmVkVXJpLnNjaGVtZSA9PSAnZmlsZScpIHsKICAgICAgICAgICAgcmVzb2x2ZWRVcmkgPSBsb2FkZXJTdGF0ZS5fd29ya2luZ0RpcmVjdG9yeS5yZXNvbHZlVXJpKHJlc29sdmVkVXJpKTsKICAgICAgICAgICAgdmFyIG1zZyA9IG5ldyBMaXN0KDUpOwogICAgICAgICAgICBtc2dbMF0gPSB0YWc7CiAgICAgICAgICAgIG1zZ1sxXSA9IHVyaTsKICAgICAgICAgICAgbXNnWzJdID0gcmVzb2x2ZWRVcmkudG9TdHJpbmcoKTsKICAgICAgICAgICAgbXNnWzNdID0gbnVsbDsKICAgICAgICAgICAgbXNnWzRdID0gcmVzb2x2ZWRVcmkudG9GaWxlUGF0aCgpOwogICAgICAgICAgICBzcC5zZW5kKG1zZyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiQ2Fubm90IHJlc29sdmUgc2NoZW1lICgke3Jlc29sdmVkVXJpLnNjaGVtZX0pIHRvIGZpbGUgcGF0aCIKICAgICAgICAgICAgICAgICIgZm9yICRyZXNvbHZlZFVyaSI7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgdmFyIG1zZyA9IG5ldyBMaXN0KDUpOwogICAgICAgICAgbXNnWzBd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QlNFUlZBVE9SWScpOwoKdm9pZCBzZXJ2ZXJQcmludChTdHJpbmcgcykgewogIGlmIChzaWxlbnRPYnNlcnZhdG9yeSkgewogICAgLy8gV2UndmUgYmVlbiByZXF1ZXN0ZWQgdG8gYmUgc2lsZW50LgogICAgcmV0dXJuOwogIH0KICBwcmludChzKTsKfQoKY2xhc3MgV2ViU29ja2V0Q2xpZW50IGV4dGVuZHMgQ2xpZW50IHsKICBzdGF0aWMgY29uc3QgaW50IFBBUlNFX0VSUk9SX0NPREUgPSA0MDAwOwogIHN0YXRpYyBjb25zdCBpbnQgQklOQVJZX01FU1NBR0VfRVJST1JfQ09ERSA9IDQwMDE7CiAgc3RhdGljIGNvbnN0IGludCBOT1RfTUFQX0VSUk9SX0NPREUgPSA0MDAyOwogIHN0YXRpYyBjb25zdCBpbnQgSURfRVJST1JfQ09ERSA9IDQwMDM7CiAgZmluYWwgV2ViU29ja2V0IHNvY2tldDsKCiAgV2ViU29ja2V0Q2xpZW50KHRoaXMuc29ja2V0LCBWTVNlcnZpY2Ugc2VydmljZSkgOiBzdXBlcihzZXJ2aWNlKSB7CiAgICBzb2NrZXQubGlzdGVuKChtZXNzYWdlKSA9PiBvbldlYlNvY2tldE1lc3NhZ2UobWVzc2FnZSkpOwogICAgc29ja2V0LmRvbmUudGhlbigoXykgPT4gY2xvc2UoKSk7CiAgfQoKICBkaXNjb25uZWN0KCkgewogICAgaWYgKHNvY2tldCAhPSBudWxsKSB7CiAgICAgIHNvY2tldC5jbG9zZSgpOwogICAgfQogIH0KCiAgdm9pZCBvbldlYlNvY2tldE1lc3NhZ2UobWVzc2FnZSkgewogICAgaWYgKG1lc3NhZ2UgaXMgU3RyaW5nKSB7CiAgICAgIHZhciBtYXA7CiAgICAgIHRyeSB7CiAgICAgICAgbWFwID0ganNvbi5kZWNvZGUobWVzc2FnZSk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBzb2NrZXQuY2xvc2UoUEFSU0VfRVJST1JfQ09ERSwgJ01lc3NhZ2UgcGFyc2UgZXJyb3I6ICRlJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChtYXAgaXMhIE1hcCkgewogICAgICAgIHNvY2tldC5jbG9zZShOT1RfTUFQX0VSUk9SX0NPREUsICdNZXNzYWdlIG11c3QgYmUgYSBKU09OIG1hcC4nKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBmaW5hbCBycGMgPSBuZXcgTWVzc2FnZS5mcm9tSnNvblJwYyh0aGlzLCBtYXApOwogICAgICAgIHN3aXRjaCAocnBjLnR5cGUpIHsKICAgICAgICAgIGNhc2UgTWVzc2FnZVR5cGUuUmVxdWVzdDoKICAgICAgICAgICAgb25SZXF1ZXN0KHJwYyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb246CiAgICAgICAgICAgIG9uTm90aWZpY2F0aW9uKHJwYyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZS5SZXNwb25zZToKICAgICAgICAgICAgb25SZXNwb25zZShycGMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBzb2NrZXQuY2xvc2UoSURfRVJST1JfQ09ERSwgZS5tZXNzYWdlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgc29ja2V0LmNsb3NlKEJJTkFSWV9NRVNTQUdFX0VSUk9SX0NPREUsICdNZXNzYWdlIG11c3QgYmUgYSBzdHJpbmcuJyk7CiAgICB9CiAgfQoKICB2b2lkIHBvc3QoUmVzcG9uc2UgcmVzdWx0KSB7CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgLy8gRG8gbm90aGluZy4KICAgICAgcmV0dXJuOwogICAgfQogICAgdHJ5IHsKICAgICAgc3dpdGNoIChyZXN1bHQua2luZCkgewogICAgICAgIGNhc2UgUmVzcG9uc2VQYXlsb2FkS2luZC5TdHJpbmc6CiAgICAgICAgY2FzZSBSZXNwb25zZVBheWxvYWRLaW5kLkJpbmFyeToKICAgICAgICAgIHNvY2tldC5hZGQocmVzdWx0LnBheWxvYWQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBSZXNwb25zZVBheWxvYWRLaW5kLlV0ZjhTdHJpbmc6CiAgICAgICAgICBzb2NrZXQuYWRkVXRmOFRleHQocmVzdWx0LnBheWxvYWQpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0gb24gU3RhdGVFcnJvciBjYXRjaCAoXykgewogICAgICAvLyBWTSBoYXMgc2h1dGRvd24sIGRvIG5vdGhpbmcuCiAgICAgIHJldHVybjsKICAgIH0KICB9CgogIGR5bmFtaWMgdG9Kc29uKCkgewogICAgTWFwIG1hcCA9IHN1cGVyLnRvSnNvbigpOwogICAgbWFwWyd0eXBlJ10gPSAnV2ViU29ja2V0Q2xpZW50JzsKICAgIG1hcFsnc29ja2V0J10gPSAnJHNvY2tldCc7CiAgICByZXR1cm4gbWFwOwogIH0KfQoKY2xhc3MgSHR0cFJlcXVlc3RDbGllbnQgZXh0ZW5kcyBDbGllbnQgewogIHN0YXRpYyBDb250ZW50VHlwZSBqc29uQ29udGVudFR5cGUgPQogICAgICBuZXcgQ29udGVudFR5cGUoImFwcGxpY2F0aW9uIiwgImpzb24iLCBjaGFyc2V0OiAidXRmLTgiKTsKICBmaW5hbCBIdHRwUmVxdWVzdCByZXF1ZXN0OwoKICBIdHRwUmVxdWVzdENsaWVudCh0aGlzLnJlcXVlc3QsIFZNU2VydmljZSBzZXJ2aWNlKQogICAgICA6IHN1cGVyKHNlcnZpY2UsIHNlbmRFdmVudHM6IGZhbHNlKTsKCiAgZGlzY29ubmVjdCgpIHsKICAgIHJlcXVlc3QucmVzcG9uc2UuY2xvc2UoKTsKICAgIGNsb3NlKCk7CiAgfQoKICB2b2lkIHBvc3QoUmVzcG9uc2UgcmVzdWx0KSB7CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgY2xvc2UoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gcmVxdWVzdC5yZXNwb25zZTsKICAgIC8vIFdlIGNsb3NlZCB0aGUgY29ubmVjdGlvbiBmb3IgYmFkIG9yaWdpbnMgZWFybGllci4KICAgIHJlc3BvbnNlLmhlYWRlcnMuYWRkKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCAnKicpOwogICAgcmVzcG9uc2UuaGVhZGVycy5jb250ZW50VHlwZSA9IGpzb25Db250ZW50VHlwZTsKICAgIHN3aXRjaCAocmVzdWx0LmtpbmQpIHsKICAgICAgY2FzZSBSZXNwb25zZVBheWxvYWRLaW5kLlN0cmluZzoKICAgICAgICByZXNwb25zZS53cml0ZShyZXN1bHQucGF5bG9hZCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgUmVzcG9uc2VQYXlsb2FkS2luZC5VdGY4U3RyaW5nOgogICAgICAgIHJlc3BvbnNlLmFkZChyZXN1bHQucGF5bG9hZCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgUmVzcG9uc2VQYXlsb2FkS2luZC5CaW5hcnk6CiAgICAgICAgdGhyb3cgJ0NhbiBub3QgaGFuZGxlIGJpbmFyeSByZXNwb25zZXMnOwogICAgfQogICAgcmVzcG9uc2UuY2xvc2UoKTsKICAgIGNsb3NlKCk7CiAgfQoKICBkeW5hbWljIHRvSnNvbigpIHsKICAgIE1hcCBtYXAgPSBzdXBlci50b0pzb24oKTsKICAgIG1hcFsndHlwZSddID0gJ0h0dHBSZXF1ZXN0Q2xpZW50JzsKICAgIG1hcFsncmVxdWVzdCddID0gJyRyZXF1ZXN0JzsKICAgIHJldHVybiBtYXA7CiAgfQp9CgpjbGFzcyBTZXJ2ZXIgewogIHN0YXRpYyBjb25zdCBXRUJTT0NLRVRfUEFUSCA9ICcvd3MnOwogIHN0YXRpYyBjb25zdCBST09UX1JFRElSRUNUX1BBVEggPSAnL2luZGV4Lmh0bWwnOwoKICBmaW5hbCBWTVNlcnZpY2UgX3NlcnZpY2U7CiAgZmluYWwgU3RyaW5nIF9pcDsKICBmaW5hbCBpbnQgX3BvcnQ7CiAgZmluYWwgYm9vbCBfb3JpZ2luQ2hlY2tEaXNhYmxlZDsKICBmaW5hbCBib29sIF9hdXRoQ29kZXNEaXNhYmxlZDsKICBIdHRwU2VydmVyIF9zZXJ2ZXI7CiAgYm9vbCBnZXQgcnVubmluZyA9PiBfc2VydmVyICE9IG51bGw7CgogIC8vLyBSZXR1cm5zIHRoZSBzZXJ2ZXIgYWRkcmVzcyBpbmNsdWRpbmcgdGhlIGF1dGggdG9rZW4uCiAgVXJpIGdldCBzZXJ2ZXJBZGRyZXNzIHsKICAgIGlmICghcnVubmluZykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciBpcCA9IF9zZXJ2ZXIuYWRkcmVzcy5hZGRyZXNzOwogICAgdmFyIHBvcnQgPSBfc2VydmVyLnBvcnQ7CiAgICB2YXIgcGF0aCA9ICFfYXV0aENvZGVzRGlzYWJsZWQgPyAiJHNlcnZpY2VBdXRoVG9rZW4vIiA6ICIvIjsKICAgIHJldHVybiBuZXcgVXJpKHNjaGVtZTogJ2h0dHAnLCBob3N0OiBpcCwgcG9ydDogcG9ydCwgcGF0aDogcGF0aCk7CiAgfQoKICAvLyBPbiBGdWNoc2lhLCBhdXRoZW50aWNhdGlvbiBjb2RlcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4gVG8gZW5hYmxlLCB0aGUgYXV0aGVudGljYXRpb24gdG9rZW4KICAvLyB3b3VsZCBoYXZlIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgaHViIGFsb25nc2lkZSB0aGUgcG9ydCBudW1iZXIuCiAgU2VydmVyKHRoaXMuX3NlcnZpY2UsIHRoaXMuX2lwLCB0aGlzLl9wb3J0LCB0aGlzLl9vcmlnaW5DaGVja0Rpc2FibGVkLAogICAgICBib29sIGF1dGhDb2Rlc0Rpc2FibGVkKQogICAgICA6IF9hdXRoQ29kZXNEaXNhYmxlZCA9IChhdXRoQ29kZXNEaXNhYmxlZCB8fCBQbGF0Zm9ybS5pc0Z1Y2hzaWEpOwoKICBib29sIF9pc0FsbG93ZWRPcmlnaW4oU3RyaW5nIG9yaWdpbikgewogICAgVXJpIHVyaTsKICAgIHRyeSB7CiAgICAgIHVyaSA9IFVyaS5wYXJzZShvcmlnaW4pOwogICAgfSBjYXRjaCAoXykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gRXhwbGljaXRseSBhZGQgbG9jYWxob3N0IGFuZCAxMjcuMC4wLjEgb24gYW55IHBvcnQgKG5lY2Vzc2FyeSBmb3IKICAgIC8vIGFkYiBwb3J0IGZvcndhcmRpbmcpLgogICAgaWYgKCh1cmkuaG9zdCA9PSAnbG9jYWxob3N0JykgfHwKICAgICAgICAodXJpLmhvc3QgPT0gJzo6MScpIHx8CiAgICAgICAgKHVyaS5ob3N0ID09ICcxMjcuMC4wLjEnKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBpZiAoKHVyaS5wb3J0ID09IF9zZXJ2ZXIucG9ydCkgJiYKICAgICAgICAoKHVyaS5ob3N0ID09IF9zZXJ2ZXIuYWRkcmVzcy5hZGRyZXNzKSB8fAogICAgICAgICAgICAodXJpLmhvc3QgPT0gX3NlcnZlci5hZGRyZXNzLmhvc3QpKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIF9vcmlnaW5DaGVjayhIdHRwUmVxdWVzdCByZXF1ZXN0KSB7CiAgICBpZiAoX29yaWdpbkNoZWNrRGlzYWJsZWQpIHsKICAgICAgLy8gQWx3YXlzIGFsbG93LgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8vIEZpcnN0IGNoZWNrIHRoZSB3ZWItc29ja2V0IHNwZWNpZmljIG9yaWdpbi4KICAgIExpc3Q8U3RyaW5nPiBvcmlnaW5zID0gcmVxdWVzdC5oZWFkZXJzWyJTZWMtV2ViU29ja2V0LU9yaWdpbiJdOwogICAgaWYgKG9yaWdpbnMgPT0gbnVsbCkgewogICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGdlbmVyYWwgT3JpZ2luIGZpZWxkLgogICAgICBvcmlnaW5zID0gcmVxdWVzdC5oZWFkZXJzWyJPcmlnaW4iXTsKICAgIH0KICAgIGlmIChvcmlnaW5zID09IG51bGwpIHsKICAgICAgLy8gTm8gb3JpZ2luIHNlbnQuIFRoaXMgaXMgYSBub24tYnJvd3NlciBjbGllbnQgb3IgYSBzYW1lLW9yaWdpbiByZXF1ZXN0LgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZvciAoU3RyaW5nIG9yaWdpbiBpbiBvcmlnaW5zKSB7CiAgICAgIGlmIChfaXNBbGxvd2VkT3JpZ2luKG9yaWdpbikpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIENoZWNrcyB0aGUgW3JlcXVlc3RVcmldIGZvciB0aGUgc2VydmljZSBhdXRoIHRva2VuIGFuZCByZXR1cm5zIHRoZSBwYXRoCiAgLy8vIGFzIGEgU3RyaW5nLiBJZiB0aGUgc2VydmljZSBhdXRoIHRva2VuIGNoZWNrIGZhaWxzLCByZXR1cm5zIG51bGwuCiAgLy8vIFJldHVybnMgYSBVcmkgaWYgYSByZWRpcmVjdCBpcyByZXF1aXJlZC4KICBkeW5hbWljIF9jaGVja0F1dGhUb2tlbkFuZEdldFBhdGgoVXJpIHJlcXVlc3RVcmkpIHsKICAgIGlmIChfYXV0aENvZGVzRGlzYWJsZWQpIHsKICAgICAgcmV0dXJuIHJlcXVlc3RVcmkucGF0aCA9PSAnLycgPyBST09UX1JFRElSRUNUX1BBVEggOiByZXF1ZXN0VXJpLnBhdGg7CiAgICB9CiAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmVxdWVzdFBhdGhTZWdtZW50cyA9IHJlcXVlc3RVcmkucGF0aFNlZ21lbnRzOwogICAgaWYgKHJlcXVlc3RQYXRoU2VnbWVudHMuaXNFbXB0eSkgewogICAgICAvLyBNYWxmb3JtZWQuCiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLy8gQ2hlY2sgdGhhdCB3ZSB3ZXJlIGdpdmVuIHRoZSBhdXRoIHRva2VuLgogICAgZmluYWwgU3RyaW5nIGF1dGhUb2tlbiA9IHJlcXVlc3RQYXRoU2VnbWVudHNbMF07CiAgICBpZiAoYXV0aFRva2VuICE9IHNlcnZpY2VBdXRoVG9rZW4pIHsKICAgICAgLy8gTWFsZm9ybWVkLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8vIE1pc3NpbmcgYSB0cmFpbGluZyAnLycuIFdlJ2xsIG5lZWQgdG8gcmVkaXJlY3QgdG8gc2VydmUKICAgIC8vIFJPT1RfUkVESVJFQ1RfUEFUSCBjb3JyZWN0bHksIG90aGVyd2lzZSB0aGUgcmVzcG9uc2UgaXMgbWlzaW50ZXJwcmV0ZWQuCiAgICBpZiAocmVxdWVzdFBhdGhTZWdtZW50cy5sZW5ndGggPT0gMSkgewogICAgICAvLyByZXF1ZXN0UGF0aFNlZ21lbnRzIGlzIHVubW9kaWZpYWJsZS4gQ29weSBpdC4KICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBhdGhTZWdtZW50cyA9IDxTdHJpbmc+W10uLmFkZEFsbChyZXF1ZXN0UGF0aFNlZ21lbnRzKTsKCiAgICAgIC8vIEFkZGluZyBhbiBlbXB0eSBzdHJpbmcgdG8gdGhlIHBhdGggc2VnbWVudHMgcmVzdWx0cyBpbiB0aGUgcGF0aCBoYXZpbmcKICAgICAgLy8gYSB0cmFpbGluZyAnLycuCiAgICAgIHBhdGhTZWdtZW50cy5hZGQoJycpOwoKICAgICAgcmV0dXJuIHJlcXVlc3RVcmkucmVwbGFjZShwYXRoU2VnbWVudHM6IHBhdGhTZWdtZW50cyk7CiAgICB9CiAgICAvLyBDb25zdHJ1Y3QgdGhlIGFjdHVhbCByZXF1ZXN0IHBhdGggYnkgY2hvcHBpbmcgb2ZmIHRoZSBhdXRoIHRva2VuLgogICAgcmV0dXJuIChyZXF1ZXN0UGF0aFNlZ21lbnRzWzFdID09ICcnKQogICAgICAgID8gUk9PVF9SRURJUkVDVF9QQVRICiAgICAgICAgOiAnLyR7cmVxdWVzdFBhdGhTZWdtZW50cy5zdWJsaXN0KDEpLmpvaW4oJy8nKX0nOwogIH0KCiAgRnV0dXJlIF9yZXF1ZXN0SGFuZGxlcihIdHRwUmVxdWVzdCByZXF1ZXN0KSBhc3luYyB7CiAgICBpZiAoIV9vcmlnaW5DaGVjayhyZXF1ZXN0KSkgewogICAgICAvLyBUaGlzIGlzIGEgY3Jvc3Mgb3JpZ2luIGF0dGVtcHQgdG8gY29ubmVjdAogICAgICByZXF1ZXN0LnJlc3BvbnNlLnN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzLmZvcmJpZGRlbjsKICAgICAgcmVxdWVzdC5yZXNwb25zZS53cml0ZSgiZm9yYmlkZGVuIG9yaWdpbiIpOwogICAgICByZXF1ZXN0LnJlc3BvbnNlLmNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PSAnUFVUJykgewogICAgICAvLyBQVVQgcmVxdWVzdHMgYXJlIGZvcndhcmRlZCB0byBEZXZGUyBmb3IgcHJvY2Vzc2luZy4KCiAgICAgIExpc3QgZnNOYW1lTGlzdDsKICAgICAgTGlzdCBmc1BhdGhMaXN0OwogICAgICBMaXN0IGZzUGF0aEJhc2U2NExpc3Q7CiAgICAgIExpc3QgZnNVcmlCYXNlNjRMaXN0OwogICAgICBPYmplY3QgZnNOYW1lOwogICAgICBPYmplY3QgZnNQYXRoOwogICAgICBPYmplY3QgZnNVcmk7CgogICAgICB0cnkgewogICAgICAgIC8vIEV4dHJhY3QgdGhlIGZzIG5hbWUgYW5kIGZzIHBhdGggZnJvbSB0aGUgcmVxdWVzdCBoZWFkZXJzLgogICAgICAgIGZzTmFtZUxpc3QgPSByZXF1ZXN0LmhlYWRlcnNbJ2Rldl9mc19uYW1lJ107CiAgICAgICAgZnNOYW1lID0gZnNOYW1lTGlzdFswXTsKCiAgICAgICAgLy8gUHJlZmVyIFVyaSBlbmNvZGluZyBmaXJzdC4KICAgICAgICBmc1VyaUJhc2U2NExpc3QgPSByZXF1ZXN0LmhlYWRlcnNbJ2Rldl9mc191cmlfYjY0J107CiAgICAgICAgaWYgKChmc1VyaUJhc2U2NExpc3QgIT0gbnVsbCkgJiYgKGZzVXJpQmFzZTY0TGlzdC5sZW5ndGggPiAwKSkgewogICAgICAgICAgU3RyaW5nIGRlY29kZWRGc1VyaSA9IHV0ZjguZGVjb2RlKGJhc2U2NC5kZWNvZGUoZnNVcmlCYXNlNjRMaXN0WzBdKSk7CiAgICAgICAgICBmc1VyaSA9IFVyaS5wYXJzZShkZWNvZGVkRnNVcmkpOwogICAgICAgIH0KCiAgICAgICAgLy8gRmFsbGJhY2sgdG8gcGF0aCBlbmNvZGluZy4KICAgICAgICBpZiAoZnNVcmkgPT0gbnVsbCkgewogICAgICAgICAgZnNQYXRoTGlzdCA9IHJlcXVlc3QuaGVhZGVyc1snZGV2X2ZzX3BhdGgnXTsKICAgICAgICAgIGZzUGF0aEJhc2U2NExpc3QgPSByZXF1ZXN0LmhlYWRlcnNbJ2Rldl9mc19wYXRoX2I2NCddOwogICAgICAgICAgLy8gSWYgdGhlICdkZXZfZnNfcGF0aF9iNjQnIGhlYWRlciBmaWVsZCB3YXMgc2VudCwgdXNlIHRoYXQgaW5zdGVhZC4KICAgICAgICAgIGlmICgoZnNQYXRoQmFzZTY0TGlzdCAhPSBudWxsKSAmJiAoZnNQYXRoQmFzZTY0TGlzdC5sZW5ndGggPiAwKSkgewogICAgICAgICAgICBmc1BhdGggPSB1dGY4LmRlY29kZShiYXNlNjQuZGVjb2RlKGZzUGF0aEJhc2U2NExpc3RbMF0pKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZzUGF0aCA9IGZzUGF0aExpc3RbMF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7LyogaWdub3JlICovfQoKICAgICAgU3RyaW5nIHJlc3VsdDsKICAgICAgdHJ5IHsKICAgICAgICByZXN1bHQgPSBhd2FpdCBfc2VydmljZS5kZXZmcy5oYW5kbGVQdXRTdHJlYW0oZnNOYW1lLCBmc1BhdGgsIGZzVXJpLAogICAgICAgICAgICByZXF1ZXN0LmNhc3Q8TGlzdDxpbnQ+PigpLnRyYW5zZm9ybShHWklQLmRlY29kZXIpKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJlcXVlc3QucmVzcG9uc2Uuc3RhdHVzQ29kZSA9IEh0dHBTdGF0dXMuaW50ZXJuYWxTZXJ2ZXJFcnJvcjsKICAgICAgICByZXF1ZXN0LnJlc3BvbnNlLndyaXRlKGUpOwogICAgICAgIHJlcXVlc3QucmVzcG9uc2UuY2xvc2UoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewogICAgICAgIHJlcXVlc3QucmVzcG9uc2UuaGVhZGVycy5jb250ZW50VHlwZSA9CiAgICAgICAgICAgIEh0dHBSZXF1ZXN0Q2xpZW50Lmpzb25Db250ZW50VHlwZTsKICAgICAgICByZXF1ZXN0LnJlc3BvbnNlLndyaXRlKHJlc3VsdCk7CiAgICAgIH0KICAgICAgcmVxdWVzdC5yZXNwb25zZS5jbG9zZSgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAocmVxdWVzdC5tZXRob2QgIT0gJ0dFVCcpIHsKICAgICAgLy8gTm90IGEgR0VUIHJlcXVlc3QuIERvIG5vdGhpbmcuCiAgICAgIHJlcXVlc3QucmVzcG9uc2Uuc3RhdHVzQ29kZSA9IEh0dHBTdGF0dXMubWV0aG9kTm90QWxsb3dlZDsKICAgICAgcmVxdWVzdC5yZXNwb25zZS53cml0ZSgibWV0aG9kIG5vdCBhbGxvd2VkIik7CiAgICAgIHJlcXVlc3QucmVzcG9uc2UuY2xvc2UoKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZpbmFsIGR5bmFtaWMgcmVzdWx0ID0gX2NoZWNrQXV0aFRva2VuQW5kR2V0UGF0aChyZXF1ZXN0LnVyaSk7CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgLy8gRWl0aGVyIG5vIGF1dGhlbnRpY2F0aW9uIGNvZGUgd2FzIHByb3ZpZGVkIHdoZW4gb25lIHdhcyBleHBlY3RlZCBvciBhbgogICAgICAvLyBpbmNvcnJlY3QgYXV0aGVudGljYXRpb24gY29kZSB3YXMgcHJvdmlkZWQuCiAgICAgIHJlcXVlc3QucmVzcG9uc2Uuc3RhdHVzQ29kZSA9IEh0dHBTdGF0dXMuZm9yYmlkZGVuOwogICAgICByZXF1ZXN0LnJlc3BvbnNlLndyaXRlKCJtaXNzaW5nIG9yIGludmFsaWQgYXV0aGVudGljYXRpb24gY29kZSIpOwogICAgICByZXF1ZXN0LnJlc3BvbnNlLmNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAocmVzdWx0IGlzIFVyaSkgewogICAgICAvLyBUaGUgVVJJIGNvbnRhaW5zIHRoZSB2YWxpZCBhdXRoIHRva2VuIGJ1dCBpcyBtaXNzaW5nIGEgdHJhaWxpbmcgJy8nLgogICAgICAvLyBSZWRpcmVjdCB0byB0aGUgc2FtZSBVUkkgd2l0aCB0aGUgdHJhaWxpbmcgJy8nIHRvIGNvcnJlY3RseSBzZXJ2ZQogICAgICAvLyBpbmRleC5odG1sLgogICAgICByZXF1ZXN0LnJlc3BvbnNlLnJlZGlyZWN0KHJlc3VsdCBhcyBVcmkpOwogICAgICByZXF1ZXN0LnJlc3BvbnNlLmNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IHJlc3VsdDsKICAgIGlmIChwYXRoID09IFdFQlNPQ0tFVF9QQVRIKSB7CiAgICAgIFdlYlNvY2tldFRyYW5zZm9ybWVyLnVwZ3JhZGUocmVxdWVzdCkudGhlbigoV2ViU29ja2V0IHdlYlNvY2tldCkgewogICAgICAgIG5ldyBXZWJTb2NrZXRDbGllbnQod2ViU29ja2V0LCBfc2VydmljZSk7CiAgICAgIH0pOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGFzc2V0cyA9PSBudWxsKSB7CiAgICAgIHJlcXVlc3QucmVzcG9uc2UuaGVhZGVycy5jb250ZW50VHlwZSA9IENvbnRlbnRUeXBlLlRFWFQ7CiAgICAgIHJlcXVlc3QucmVzcG9uc2Uud3JpdGUoIlRoaXMgVk0gd2FzIGJ1aWx0IHdpdGhvdXQgdGhlIE9ic2VydmF0b3J5IFVJLiIpOwogICAgICByZXF1ZXN0LnJlc3BvbnNlLmNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIEFzc2V0IGFzc2V0ID0gYXNzZXRzW3BhdGhdOwogICAgaWYgKGFzc2V0ICE9IG51bGwpIHsKICAgICAgLy8gU2VydmluZyB1cCBhIHN0YXRpYyBhc3NldCAoZS5nLiAuY3NzLCAuaHRtbCwgLnBuZykuCiAgICAgIHJlcXVlc3QucmVzcG9uc2UuaGVhZGVycy5jb250ZW50VHlwZSA9IENvbnRlbnRUeXBlLnBhcnNlKGFzc2V0Lm1pbWVUeXBlKTsKICAgICAgcmVxdWVzdC5yZXNwb25zZS5hZGQoYXNzZXQuZGF0YSk7CiAgICAgIHJlcXVlc3QucmVzcG9uc2UuY2xvc2UoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gSFRUUCBiYXNlZCBzZXJ2aWNlIHJlcXVlc3QuCiAgICBmaW5hbCBjbGllbnQgPSBuZXcgSHR0cFJlcXVlc3RDbGllbnQocmVxdWVzdCwgX3NlcnZpY2UpOwogICAgZmluYWwgbWVzc2FnZSA9IG5ldyBNZXNzYWdlLmZyb21VcmkoCiAgICAgICAgY2xpZW50LCBVcmkocGF0aDogcGF0aCwgcXVlcnlQYXJhbWV0ZXJzOiByZXF1ZXN0LnVyaS5xdWVyeVBhcmFtZXRlcnMpKTsKICAgIGNsaWVudC5vblJlcXVlc3QobWVzc2FnZSk7IC8vIGV4Y2VwdGlvbiBmcmVlLCBubyBuZWVkIHRvIHRyeSBjYXRjaAogIH0KCiAgRnV0dXJlIHN0YXJ0dXAoKSBhc3luYyB7CiAgICBpZiAoX3NlcnZlciAhPSBudWxsKSB7CiAgICAgIC8vIEFscmVhZHkgcnVubmluZy4KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgLy8gU3RhcnR1cCBIVFRQIHNlcnZlci4KICAgIHZhciBwb2xsRXJyb3I7CiAgICB2YXIgcG9sbFN0YWNrOwogICAgRnV0dXJlPGJvb2w+IHBvbGwoKSBhc3luYyB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGFkZHJlc3M7CiAgICAgICAgdmFyIGFkZHJlc3NlcyA9IGF3YWl0IEludGVybmV0QWRkcmVzcy5sb29rdXAoX2lwKTsKICAgICAgICAvLyBQcmVmZXIgSVB2NCBhZGRyZXNzZXMuCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhZGRyZXNzZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGFkZHJlc3MgPSBhZGRyZXNzZXNbaV07CiAgICAgICAgICBpZiAoYWRkcmVzcy50eXBlID09IEludGVybmV0QWRkcmVzc1R5cGUuSVBfVjQpIGJyZWFrOwogICAgICAgIH0KICAgICAgICBfc2VydmVyID0gYXdhaXQgSHR0cFNlcnZlci5iaW5kKGFkZHJlc3MsIF9wb3J0KTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBjYXRjaCAoZSwgc3QpIHsKICAgICAgICBwb2xsRXJyb3IgPSBlOwogICAgICAgIHBvbGxTdGFjayA9IHN0OwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIC8vIHBvbGwgZm9yIHRoZSBuZXR3b3JrIGZvciB+MTAgc2Vjb25kcy4KICAgIGludCBhdHRlbXB0cyA9IDA7CiAgICBmaW5hbCBpbnQgbWF4QXR0ZW1wdHMgPSAxMDsKICAgIHdoaWxlICghYXdhaXQgcG9sbCgpKSB7CiAgICAgIGF0dGVtcHRzKys7CiAgICAgIHNlcnZlclByaW50KCJPYnNlcnZhdG9yeSBzZXJ2ZXIgZmFpbGVkIHRvIHN0YXJ0IGFmdGVyICRhdHRlbXB0cyB0cmllcyIpOwogICAgICBpZiAoYXR0ZW1wdHMgPiBtYXhBdHRlbXB0cykgewogICAgICAgIHNlcnZlclByaW50KCdDb3VsZCBub3Qgc3RhcnQgT2JzZXJ2YXRvcnkgSFRUUCBzZXJ2ZXI6XG4nCiAgICAgICAgICAgICckcG9sbEVycm9yXG4kcG9sbFN0YWNrXG4nKTsKICAgICAgICBfbm90aWZ5U2VydmVyU3RhdGUoIiIpOwogICAgICAgIG9uU2VydmVyQWRkcmVzc0NoYW5nZShudWxsKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBhd2FpdCBuZXcgRnV0dXJlPE51bGw+LmRlbGF5ZWQoY29uc3QgRHVyYXRpb24oc2Vjb25kczogMSkpOwogICAgfQogICAgaWYgKF9zZXJ2aWNlLmlzRXhpdGluZykgewogICAgICBzZXJ2ZXJQcmludCgnT2JzZXJ2YXRvcnkgSFRUUCBzZXJ2ZXIgZXhpdGluZyBiZWZvcmUgbGlzdGVuaW5nIGFzICcKICAgICAgICAgICd2bSBzZXJ2aWNlIGhhcyByZWNlaXZlZCBleGl0IHJlcXVlc3RcbicpOwogICAgICBhd2FpdCBzaHV0ZG93bih0cnVlKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBfc2VydmVyLmxpc3RlbihfcmVxdWVzdEhhbmRsZXIsIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgc2VydmVyUHJpbnQoJ09ic2VydmF0b3J5IGxpc3RlbmluZyBvbiAkc2VydmVyQWRkcmVzcycpOwogICAgaWYgKFBsYXRmb3JtLmlzRnVjaHNpYSkgewogICAgICAvLyBDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHBvcnQgbnVtYmVyLgogICAgICBTdHJpbmcgdG1wID0gRGlyZWN0b3J5LnN5c3RlbVRlbXAucGF0aDsKICAgICAgU3RyaW5nIHBhdGggPSAiJHRtcC9kYXJ0LnNlcnZpY2VzLyR7X3NlcnZlci5wb3J0fSI7CiAgICAgIHNlcnZlclByaW50KCJDcmVhdGluZyAkcGF0aCIpOwogICAgICBuZXcgRmlsZShwYXRoKS4uY3JlYXRlU3luYyhyZWN1cnNpdmU6IHRydWUpOwogICAgfQogICAgLy8gU2VydmVyIGlzIHVwIGFuZCBydW5uaW5nLgogICAgX25vdGlmeVNlcnZlclN0YXRlKHNlcnZlckFkZHJlc3MudG9TdHJpbmcoKSk7CiAgICBvblNlcnZlckFkZHJlc3NDaGFuZ2UoJyRzZXJ2ZXJBZGRyZXNzJyk7CiAgICByZXR1cm4gdGhpczsKICB9CgogIEZ1dHVyZSBjbGVhbnVwKGJvb2wgZm9yY2UpIHsKICAgIGlmIChfc2VydmVyID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUobnVsbCk7CiAgICB9CiAgICBpZiAoUGxhdGZvcm0uaXNGdWNoc2lhKSB7CiAgICAgIC8vIFJlbW92ZSB0aGUgZmlsZSB3aXRoIHRoZSBwb3J0IG51bWJlci4KICAgICAgU3RyaW5nIHRtcCA9IERpcmVjdG9yeS5zeXN0ZW1UZW1wLnBhdGg7CiAgICAgIFN0cmluZyBwYXRoID0gIiR0bXAvZGFydC5zZXJ2aWNlcy8ke19zZXJ2ZXIucG9ydH0iOwogICAgICBzZXJ2ZXJQcmludCgiRGVsZXRpbmcgJHBhdGgiKTsKICAgICAgbmV3IEZpbGUocGF0aCkuLmRlbGV0ZVN5bmMoKTsKICAgIH0KICAgIHJldHVybiBfc2VydmVyLmNsb3NlKGZvcmNlOiBmb3JjZSk7CiAgfQoKICBGdXR1cmUgc2h1dGRvd24oYm9vbCBmb3JjZWQpIHsKICAgIGlmIChfc2VydmVyID09IG51bGwpIHsKICAgICAgLy8gTm90IHN0YXJ0ZWQuCiAgICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKHRoaXMpOwogICAgfQoKICAgIC8vIFNodXRkb3duIEhUVFAgc2VydmVyIGFuZCBzdWJzY3JpcHRpb24uCiAgICBVcmkgb2xkU2VydmVyQWRkcmVzcyA9IHNlcnZlckFkZHJlc3M7CiAgICByZXR1cm4gY2xlYW51cChmb3JjZWQpLnRoZW4oKF8pIHsKICAgICAgc2VydmVyUHJpbnQoJ09ic2VydmF0b3J5IG5vIGxvbmdlciBsaXN0ZW5pbmcgb24gJG9sZFNlcnZlckFkZHJlc3MnKTsKICAgICAgX3NlcnZlciA9IG51bGw7CiAgICAgIF9ub3RpZnlTZXJ2ZXJTdGF0ZSgiIik7CiAgICAgIG9uU2VydmVyQWRkcmVzc0NoYW5nZShudWxsKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KS5jYXRjaEVycm9yKChlLCBzdCkgewogICAgICBfc2VydmVyID0gbnVsbDsKICAgICAgc2VydmVyUHJpbnQoJ0NvdWxkIG5vdCBzaHV0ZG93biBPYnNlcnZhdG9yeSBIVFRQIHNlcnZlcjpcbiRlXG4kc3RcbicpOwogICAgICBfbm90aWZ5U2VydmVyU3RhdGUoIiIpOwogICAgICBvblNlcnZlckFkZHJlc3NDaGFuZ2UobnVsbCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQp9Cgp2b2lkIF9ub3RpZnlTZXJ2ZXJTdGF0ZShTdHJpbmcgdXJpKSBuYXRpdmUgIlZNU2VydmljZUlPX05vdGlmeVNlcnZlclN0YXRlIjsKgdsATk48ARYBTwEdGyoMBAwCAScsNS4pGgFFPSYEAREaFgYEASUdDwwkFEMQCBlJEAgMOBwkHBMpIRMlHRMKFDAIDUwGBAEfGhUOBgodKSkmES0uEQggJg4GBAEVHiUfEAQCASknQB0BNSsBER4NBAEfGg8OBi45PjQbJygPKyYPJzEGFg0EARUeJyEQBAIBDyczARwUEyMhFicBOxoUEwYmHUFGBAFjRkkeSAEpDQofEhQGAUkdJR8lEwYBJjIzEwYBEgQBKyAXEwYzRBswKwYbUBMGJSYVCAYSBAFOSC82HkwGRicUEwYwNSkUEwY/Tys3UQFQGRwBPQZJKh06BAE2IjM6MiAOBiM9ARcXHRwVFRQBDEU1IAEmPUlQKwoBJh03QU9NRhMkDAohARUMTUAURiMiEAgBHC8vKAggDgYjKEE0IA4GAUMaUDU6SCAOIE5LFTAgDgYBICJJMgoOBgEaP08gDgYgGT1QKCAOBiM9KVBHBAEbGxoTBgEcExMgDBU7IjUiQAo5FRgXGBYIBgEtFiAcEk8kQSkgJRUIQgYeSTUcEwY6PB4tLjolMwYhMi0RBAEfGyUGHi8uOiUkBigEASEbFiUGAS4qJksWHiMTHBZNHiMTCAQCAUwBHWRhcnQ6dm1zZXJ2aWNlX2lvL3NlcnZlci5kYXJ0NG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi92bXNlcnZpY2Uvdm1zZXJ2aWNlLmRhcnTAAFNbLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydC5fdm1zZXJ2aWNlOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDppc29sYXRlJzsKaW1wb3J0ICdkYXJ0Om1hdGgnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgpwYXJ0ICdhc3NldC5kYXJ0JzsKcGFydCAnY2xpZW50LmRhcnQnOwpwYXJ0ICdkZXZmcy5kYXJ0JzsKcGFydCAnY29uc3RhbnRzLmRhcnQnOwpwYXJ0ICdydW5uaW5nX2lzb2xhdGUuZGFydCc7CnBhcnQgJ3J1bm5pbmdfaXNvbGF0ZXMuZGFydCc7CnBhcnQgJ21lc3NhZ2UuZGFydCc7CnBhcnQgJ21lc3NhZ2Vfcm91dGVyLmRhcnQnOwpwYXJ0ICduYW1lZF9sb29rdXAuZGFydCc7CgpmaW5hbCBSYXdSZWNlaXZlUG9ydCBpc29sYXRlQ29udHJvbFBvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoKTsKZmluYWwgUmF3UmVjZWl2ZVBvcnQgc2NyaXB0TG9hZFBvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoKTsKCmFic3RyYWN0IGNsYXNzIElzb2xhdGVFbWJlZGRlckRhdGEgewogIHZvaWQgY2xlYW51cCgpOwp9CgpTdHJpbmcgX21ha2VBdXRoVG9rZW4oKSB7CiAgZmluYWwga1Rva2VuQnl0ZVNpemUgPSA4OwogIFVpbnQ4TGlzdCBieXRlcyA9IG5ldyBVaW50OExpc3Qoa1Rva2VuQnl0ZVNpemUpOwogIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tLnNlY3VyZSgpOwogIGZvciAoaW50IGkgPSAwOyBpIDwga1Rva2VuQnl0ZVNpemU7IGkrKykgewogICAgYnl0ZXNbaV0gPSByYW5kb20ubmV4dEludCgyNTYpOwogIH0KICByZXR1cm4gYmFzZTY0VXJsLmVuY29kZShieXRlcyk7Cn0KCi8vIFRoZSByYW5kb21seSBnZW5lcmF0ZWQgYXV0aCB0b2tlbiB1c2VkIHRvIGFjY2VzcyB0aGUgVk0gc2VydmljZS4KZmluYWwgU3RyaW5nIHNlcnZpY2VBdXRoVG9rZW4gPSBfbWFrZUF1dGhUb2tlbigpOwoKLy8gVGhpcyBpcyBmb3IgdXNlIGJ5IHRoZSBlbWJlZGRlci4gSXQgaXMgYSBtYXAgZnJvbSB0aGUgaXNvbGF0ZUlkIHRvCi8vIGFueXRoaW5nIGltcGxlbWVudGluZyBJc29sYXRlRW1iZWRkZXJEYXRhLiBXaGVuIGFuIGlzb2xhdGUgZ29lcyBhd2F5LAovLyB0aGUgY2xlYW51cCBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGFmdGVyIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgbWFwLgpmaW5hbCBNYXA8aW50LCBJc29sYXRlRW1iZWRkZXJEYXRhPiBpc29sYXRlRW1iZWRkZXJEYXRhID0KICAgIG5ldyBNYXA8aW50LCBJc29sYXRlRW1iZWRkZXJEYXRhPigpOwoKLy8gVGhlc2UgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgZGVjbGFyYXRpb25zIGluIHZtL2pzb25fc3RyZWFtLmguCmNvbnN0IGtQYXJzZUVycm9yID0gLTMyNzAwOwpjb25zdCBrSW52YWxpZFJlcXVlc3QgPSAtMzI2MDA7CmNvbnN0IGtNZXRob2ROb3RGb3VuZCA9IC0zMjYwMTsKY29uc3Qga0ludmFsaWRQYXJhbXMgPSAtMzI2MDI7CmNvbnN0IGtJbnRlcm5hbEVycm9yID0gLTMyNjAzOwoKY29uc3Qga0V4dGVuc2lvbkVycm9yID0gLTMyMDAwOwoKY29uc3Qga0ZlYXR1cmVEaXNhYmxlZCA9IDEwMDsKY29uc3Qga0Nhbm5vdEFkZEJyZWFrcG9pbnQgPSAxMDI7CmNvbnN0IGtTdHJlYW1BbHJlYWR5U3Vic2NyaWJlZCA9IDEwMzsKY29uc3Qga1N0cmVhbU5vdFN1YnNjcmliZWQgPSAxMDQ7CmNvbnN0IGtJc29sYXRlTXVzdEJlUnVubmFibGUgPSAxMDU7CmNvbnN0IGtJc29sYXRlTXVzdEJlUGF1c2VkID0gMTA2Owpjb25zdCBrQ2Fubm90UmVzdW1lID0gMTA3Owpjb25zdCBrSXNvbGF0ZUlzUmVsb2FkaW5nID0gMTA4Owpjb25zdCBrSXNvbGF0ZVJlbG9hZEJhcnJlZCA9IDEwOTsKY29uc3Qga0lzb2xhdGVNdXN0SGF2ZVJlbG9hZGVkID0gMTEwOwpjb25zdCBrU2VydmljZUFscmVhZHlSZWdpc3RlcmVkID0gMTExOwpjb25zdCBrU2VydmljZURpc2FwcGVhcmVkID0gMTEyOwpjb25zdCBrRXhwcmVzc2lvbkNvbXBpbGF0aW9uRXJyb3IgPSAxMTM7CmNvbnN0IGtJbnZhbGlkVGltZWxpbmVSZXF1ZXN0ID0gMTE0OwoKLy8gRXhwZXJpbWVudGFsICh1c2VkIGluIHByaXZhdGUgcnBjcykuCmNvbnN0IGtGaWxlU3lzdGVtQWxyZWFkeUV4aXN0cyA9IDEwMDE7CmNvbnN0IGtGaWxlU3lzdGVtRG9lc05vdEV4aXN0ID0gMTAwMjsKY29uc3Qga0ZpbGVEb2VzTm90RXhpc3QgPSAxMDAzOwoKdmFyIF9lcnJvck1lc3NhZ2VzID0gewogIGtJbnZhbGlkUGFyYW1zOiAnSW52YWxpZCBwYXJhbXMnLAogIGtJbnRlcm5hbEVycm9yOiAnSW50ZXJuYWwgZXJyb3InLAogIGtGZWF0dXJlRGlzYWJsZWQ6ICdGZWF0dXJlIGlzIGRpc2FibGVkJywKICBrU3RyZWFtQWxyZWFkeVN1YnNjcmliZWQ6ICdTdHJlYW0gYWxyZWFkeSBzdWJzY3JpYmVkJywKICBrU3RyZWFtTm90U3Vic2NyaWJlZDogJ1N0cmVhbSBub3Qgc3Vic2NyaWJlZCcsCiAga0ZpbGVTeXN0ZW1BbHJlYWR5RXhpc3RzOiAnRmlsZSBzeXN0ZW0gYWxyZWFkeSBleGlzdHMnLAogIGtGaWxlU3lzdGVtRG9lc05vdEV4aXN0OiAnRmlsZSBzeXN0ZW0gZG9lcyBub3QgZXhpc3QnLAogIGtGaWxlRG9lc05vdEV4aXN0OiAnRmlsZSBkb2VzIG5vdCBleGlzdCcsCiAga1NlcnZpY2VBbHJlYWR5UmVnaXN0ZXJlZDogJ1NlcnZpY2UgYWxyZWFkeSByZWdpc3RlcmVkJywKICBrU2VydmljZURpc2FwcGVhcmVkOiAnU2VydmljZSBoYXMgZGlzYXBwZWFyZWQnLAogIGtFeHByZXNzaW9uQ29tcGlsYXRpb25FcnJvcjogJ0V4cHJlc3Npb24gY29tcGlsYXRpb24gZXJyb3InLAogIGtJbnZhbGlkVGltZWxpbmVSZXF1ZXN0OiAnVGhlIHRpbWVsaW5lIHJlbGF0ZWQgcmVxdWVzdCBjb3VsZCBub3QgYmUgY29tcGxldGVkJwogICAgICAnZHVlIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24nLAp9OwoKU3RyaW5nIGVuY29kZVJwY0Vycm9yKE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNvZGUsIHtTdHJpbmcgZGV0YWlsc30pIHsKICB2YXIgcmVzcG9uc2UgPSB7CiAgICAnanNvbnJwYyc6ICcyLjAnLAogICAgJ2lkJzogbWVzc2FnZS5zZXJpYWwsCiAgICAnZXJyb3InOiB7CiAgICAgICdjb2RlJzogY29kZSwKICAgICAgJ21lc3NhZ2UnOiBfZXJyb3JNZXNzYWdlc1tjb2RlXSwKICAgIH0sCiAgfTsKICBpZiAoZGV0YWlscyAhPSBudWxsKSB7CiAgICByZXNwb25zZVsnZXJyb3InXVsnZGF0YSddID0gewogICAgICAnZGV0YWlscyc6IGRldGFpbHMsCiAgICB9OwogIH0KICByZXR1cm4ganNvbi5lbmNvZGUocmVzcG9uc2UpOwp9CgpTdHJpbmcgZW5jb2RlTWlzc2luZ1BhcmFtRXJyb3IoTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgcGFyYW0pIHsKICByZXR1cm4gZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga0ludmFsaWRQYXJhbXMsCiAgICAgIGRldGFpbHM6ICIke21lc3NhZ2UubWV0aG9kfSBleHBlY3RzIHRoZSAnJHtwYXJhbX0nIHBhcmFtZXRlciIpOwp9CgpTdHJpbmcgZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IoTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgcGFyYW0pIHsKICB2YXIgdmFsdWUgPSBtZXNzYWdlLnBhcmFtc1twYXJhbV07CiAgcmV0dXJuIGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtJbnZhbGlkUGFyYW1zLAogICAgICBkZXRhaWxzOiAiJHttZXNzYWdlLm1ldGhvZH06IGludmFsaWQgJyR7cGFyYW19JyBwYXJhbWV0ZXI6ICR7dmFsdWV9Iik7Cn0KClN0cmluZyBlbmNvZGVDb21waWxhdGlvbkVycm9yKE1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIGRpYWdub3N0aWMpIHsKICByZXR1cm4gZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga0V4cHJlc3Npb25Db21waWxhdGlvbkVycm9yLAogICAgICBkZXRhaWxzOiBkaWFnbm9zdGljKTsKfQoKU3RyaW5nIGVuY29kZVJlc3VsdChNZXNzYWdlIG1lc3NhZ2UsIE1hcCByZXN1bHQpIHsKICB2YXIgcmVzcG9uc2UgPSB7CiAgICAnanNvbnJwYyc6ICcyLjAnLAogICAgJ2lkJzogbWVzc2FnZS5zZXJpYWwsCiAgICAncmVzdWx0JzogcmVzdWx0LAogIH07CiAgcmV0dXJuIGpzb24uZW5jb2RlKHJlc3BvbnNlKTsKfQoKU3RyaW5nIGVuY29kZVN1Y2Nlc3MoTWVzc2FnZSBtZXNzYWdlKSB7CiAgcmV0dXJuIGVuY29kZVJlc3VsdChtZXNzYWdlLCB7J3R5cGUnOiAnU3VjY2Vzcyd9KTsKfQoKY29uc3Qgc2hvcnREZWxheSA9IGNvbnN0IER1cmF0aW9uKG1pbGxpc2Vjb25kczogMTApOwoKLy8vIENhbGxlZCB3aGVuIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlIHN0YXJ0ZWQuCnR5cGVkZWYgRnV0dXJlIFNlcnZlclN0YXJ0Q2FsbGJhY2soKTsKCi8vLyBDYWxsZWQgd2hlbiB0aGUgc2VydmVyIHNob3VsZCBiZSBzdG9wcGVkLgp0eXBlZGVmIEZ1dHVyZSBTZXJ2ZXJTdG9wQ2FsbGJhY2soKTsKCi8vLyBDYWxsZWQgd2hlbiB0aGUgc2VydmljZSBpcyBleGl0aW5nLgp0eXBlZGVmIEZ1dHVyZSBDbGVhbnVwQ2FsbGJhY2soKTsKCi8vLyBDYWxsZWQgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeQp0eXBlZGVmIEZ1dHVyZTxVcmk+IENyZWF0ZVRlbXBEaXJDYWxsYmFjayhTdHJpbmcgYmFzZSk7CgovLy8gQ2FsbGVkIHRvIGRlbGV0ZSBhIGRpcmVjdG9yeQp0eXBlZGVmIEZ1dHVyZSBEZWxldGVEaXJDYWxsYmFjayhVcmkgcGF0aCk7CgovLy8gQ2FsbGVkIHRvIHdyaXRlIGEgZmlsZS4KdHlwZWRlZiBGdXR1cmUgV3JpdGVGaWxlQ2FsbGJhY2soVXJpIHBhdGgsIExpc3Q8aW50PiBieXRlcyk7CgovLy8gQ2FsbGVkIHRvIHdyaXRlIGEgc3RyZWFtIGludG8gYSBmaWxlLgp0eXBlZGVmIEZ1dHVyZSBXcml0ZVN0cmVhbUZpbGVDYWxsYmFjayhVcmkgcGF0aCwgU3RyZWFtPExpc3Q8aW50Pj4gYnl0ZXMpOwoKLy8vIENhbGxlZCB0byByZWFkIGEgZmlsZS4KdHlwZWRlZiBGdXR1cmU8TGlzdDxpbnQ+PiBSZWFkRmlsZUNhbGxiYWNrKFVyaSBwYXRoKTsKCi8vLyBDYWxsZWQgdG8gbGlzdCBhbGwgZmlsZXMgdW5kZXIgc29tZSBwYXRoLgp0eXBlZGVmIEZ1dHVyZTxMaXN0PE1hcDxTdHJpbmcsIGR5bmFtaWM+Pj4gTGlzdEZpbGVzQ2FsbGJhY2soVXJpIHBhdGgpOwoKLy8vIENhbGxlZCB3aGVuIHdlIG5lZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZlci4KdHlwZWRlZiBGdXR1cmU8VXJpPiBTZXJ2ZXJJbmZvcm1hbWVzc2FnZV9yb3V0ZXJ0aW9uQ2FsbGJhY2soKTsKCi8vLyBDYWxsZWQgd2hlbiB3ZSBuZWVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJ2ZXIuCnR5cGVkZWYgRnV0dXJlPFVyaT4gU2VydmVySW5mb3JtYXRpb25DYWxsYmFjaygpOwoKLy8vIENhbGxlZCB3aGVuIHdlIHdhbnQgdG8gW2VuYWJsZV0gb3IgZGlzYWJsZSB0aGUgd2ViIHNlcnZlci4KdHlwZWRlZiBGdXR1cmU8VXJpPiBXZWJTZXJ2ZXJDb250cm9sQ2FsbGJhY2soYm9vbCBlbmFibGUpOwoKLy8vIEhvb2tzIHRoYXQgYXJlIHNldHVwIGJ5IHRoZSBlbWJlZGRlci4KY2xhc3MgVk1TZXJ2aWNlRW1iZWRkZXJIb29rcyB7CiAgc3RhdGljIFNlcnZlclN0YXJ0Q2FsbGJhY2sgc2VydmVyU3RhcnQ7CiAgc3RhdGljIFNlcnZlclN0b3BDYWxsYmFjayBzZXJ2ZXJTdG9wOwogIHN0YXRpYyBDbGVhbnVwQ2FsbGJhY2sgY2xlYW51cDsKICBzdGF0aWMgQ3JlYXRlVGVtcERpckNhbGxiYWNrIGNyZWF0ZVRlbXBEaXI7CiAgc3RhdGljIERlbGV0ZURpckNhbGxiYWNrIGRlbGV0ZURpcjsKICBzdGF0aWMgV3JpdGVGaWxlQ2FsbGJhY2sgd3JpdGVGaWxlOwogIHN0YXRpYyBXcml0ZVN0cmVhbUZpbGVDYWxsYmFjayB3cml0ZVN0cmVhbUZpbGU7CiAgc3RhdGljIFJlYWRGaWxlQ2FsbGJhY2sgcmVhZEZpbGU7CiAgc3RhdGljIExpc3RGaWxlc0NhbGxiYWNrIGxpc3RGaWxlczsKICBzdGF0aWMgU2VydmVySW5mb3JtYXRpb25DYWxsYmFjayBzZXJ2ZXJJbmZvcm1hdGlvbjsKICBzdGF0aWMgV2ViU2VydmVyQ29udHJvbENhbGxiYWNrIHdlYlNlcnZlckNvbnRyb2w7Cn0KCmNsYXNzIFZNU2VydmljZSBleHRlbmRzIE1lc3NhZ2VSb3V0ZXIgewogIHN0YXRpYyBWTVNlcnZpY2UgX2luc3RhbmNlOwoKICBzdGF0aWMgY29uc3Qgc2VydmljZU5hbWVzcGFjZSA9ICdzJzsKCiAgLy8vIENvbGxlY3Rpb24gb2YgY3VycmVudGx5IGNvbm5lY3RlZCBjbGllbnRzLgogIGZpbmFsIE5hbWVkTG9va3VwPENsaWVudD4gY2xpZW50cyA9CiAgICAgIG5ldyBOYW1lZExvb2t1cDxDbGllbnQ+KHByb2xvZ3VlOiBzZXJ2aWNlTmFtZXNwYWNlKTsKICBmaW5hbCBJZEdlbmVyYXRvciBfc2VydmljZVJlcXVlc3RzID0gbmV3IElkR2VuZXJhdG9yKHByb2xvZ3VlOiAnc3InKTsKCiAgLy8vIENvbGxlY3Rpb24gb2YgY3VycmVudGx5IHJ1bm5pbmcgaXNvbGF0ZXMuCiAgUnVubmluZ0lzb2xhdGVzIHJ1bm5pbmdJc29sYXRlcyA9IG5ldyBSdW5uaW5nSXNvbGF0ZXMoKTsKCiAgLy8vIEZsYWcgdG8gaW5kaWNhdGUgVk0gc2VydmljZSBpcyBleGl0aW5nLgogIGJvb2wgaXNFeGl0aW5nID0gZmFsc2U7CgogIC8vLyBBIHBvcnQgdXNlZCB0byByZWNlaXZlIGV2ZW50cyBmcm9tIHRoZSBWTS4KICBmaW5hbCBSYXdSZWNlaXZlUG9ydCBldmVudFBvcnQ7CgogIGZpbmFsIGRldmZzID0gbmV3IERldkZTKCk7CgogIHZvaWQgX2FkZENsaWVudChDbGllbnQgY2xpZW50KSB7CiAgICBhc3NlcnQoY2xpZW50LnN0cmVhbXMuaXNFbXB0eSk7CiAgICBhc3NlcnQoY2xpZW50LnNlcnZpY2VzLmlzRW1wdHkpOwogICAgY2xpZW50cy5hZGQoY2xpZW50KTsKICB9CgogIHZvaWQgX3JlbW92ZUNsaWVudChDbGllbnQgY2xpZW50KSB7CiAgICBmaW5hbCBuYW1lc3BhY2UgPSBjbGllbnRzLmtleU9mKGNsaWVudCk7CiAgICBjbGllbnRzLnJlbW92ZShjbGllbnQpOwogICAgZm9yICh2YXIgc3RyZWFtSWQgaW4gY2xpZW50LnN0cmVhbXMpIHsKICAgICAgaWYgKCFfaXNBbnlDbGllbnRTdWJzY3JpYmVkKHN0cmVhbUlkKSkgewogICAgICAgIF92bUNhbmNlbFN0cmVhbShzdHJlYW1JZCk7CiAgICAgIH0KICAgIH0KICAgIGZvciAodmFyIHNlcnZpY2UgaW4gY2xpZW50LnNlcnZpY2VzLmtleXMpIHsKICAgICAgX2V2ZW50TWVzc2FnZUhhbmRsZXIoCiAgICAgICAgICAnU2VydmljZScsCiAgICAgICAgICBuZXcgUmVzcG9uc2UuanNvbih7CiAgICAgICAgICAgICdqc29ucnBjJzogJzIuMCcsCiAgICAgICAgICAgICdtZXRob2QnOiAnc3RyZWFtTm90aWZ5JywKICAgICAgICAgICAgJ3BhcmFtcyc6IHsKICAgICAgICAgICAgICAnc3RyZWFtSWQnOiAnU2VydmljZScsCiAgICAgICAgICAgICAgJ2V2ZW50JzogewogICAgICAgICAgICAgICAgInR5cGUiOiAiRXZlbnQiLAogICAgICAgICAgICAgICAgImtpbmQiOiAiU2VydmljZVVucmVnaXN0ZXJlZCIsCiAgICAgICAgICAgICAgICAndGltZXN0YW1wJzogbmV3IERhdGVUaW1lLm5vdygpLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2gsCiAgICAgICAgICAgICAgICAnc2VydmljZSc6IHNlcnZpY2UsCiAgICAgICAgICAgICAgICAnbWV0aG9kJzogbmFtZXNwYWNlICsgJy4nICsgc2VydmljZSwKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKTsKICAgIH0KICAgIC8vIENvbXBsZXRlIGFsbCByZXF1ZXN0cyBhcyBmYWlsZWQKICAgIGZvciAodmFyIGhhbmRsZSBpbiBjbGllbnQuc2VydmljZUhhbmRsZXMudmFsdWVzKSB7CiAgICAgIGhhbmRsZShudWxsKTsKICAgIH0KICB9CgogIHZvaWQgX2V2ZW50TWVzc2FnZUhhbmRsZXIoU3RyaW5nIHN0cmVhbUlkLCBSZXNwb25zZSBldmVudCkgewogICAgZm9yICh2YXIgY2xpZW50IGluIGNsaWVudHMpIHsKICAgICAgaWYgKGNsaWVudC5zZW5kRXZlbnRzICYmIGNsaWVudC5zdHJlYW1zLmNvbnRhaW5zKHN0cmVhbUlkKSkgewogICAgICAgIGNsaWVudC5wb3N0KGV2ZW50KTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfY29udHJvbE1lc3NhZ2VIYW5kbGVyKGludCBjb2RlLCBpbnQgcG9ydElkLCBTZW5kUG9ydCBzcCwgU3RyaW5nIG5hbWUpIHsKICAgIHN3aXRjaCAoY29kZSkgewogICAgICBjYXNlIENvbnN0YW50cy5JU09MQVRFX1NUQVJUVVBfTUVTU0FHRV9JRDoKICAgICAgICBydW5uaW5nSXNvbGF0ZXMuaXNvbGF0ZVN0YXJ0dXAocG9ydElkLCBzcCwgbmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RhbnRzLklTT0xBVEVfU0hVVERPV05fTUVTU0FHRV9JRDoKICAgICAgICBydW5uaW5nSXNvbGF0ZXMuaXNvbGF0ZVNodXRkb3duKHBvcnRJZCwgc3ApOwogICAgICAgIElzb2xhdGVFbWJlZGRlckRhdGEgaWVkID0gaXNvbGF0ZUVtYmVkZGVyRGF0YS5yZW1vdmUocG9ydElkKTsKICAgICAgICBpZiAoaWVkICE9IG51bGwpIHsKICAgICAgICAgIGllZC5jbGVhbnVwKCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgRnV0dXJlPE51bGw+IF9zZXJ2ZXJNZXNzYWdlSGFuZGxlcihpbnQgY29kZSwgU2VuZFBvcnQgc3AsIGJvb2wgZW5hYmxlKSBhc3luYyB7CiAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgY2FzZSBDb25zdGFudHMuV0VCX1NFUlZFUl9DT05UUk9MX01FU1NBR0VfSUQ6CiAgICAgICAgaWYgKFZNU2VydmljZUVtYmVkZGVySG9va3Mud2ViU2VydmVyQ29udHJvbCA9PSBudWxsKSB7CiAgICAgICAgICBzcC5zZW5kKG51bGwpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBVcmkgdXJpID0gYXdhaXQgVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy53ZWJTZXJ2ZXJDb250cm9sKGVuYWJsZSk7CiAgICAgICAgc3Auc2VuZCh1cmkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0YW50cy5TRVJWRVJfSU5GT19NRVNTQUdFX0lEOgogICAgICAgIGlmIChWTVNlcnZpY2VFbWJlZGRlckhvb2tzLnNlcnZlckluZm9ybWF0aW9uID09IG51bGwpIHsKICAgICAgICAgIHNwLnNlbmQobnVsbCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIFVyaSB1cmkgPSBhd2FpdCBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLnNlcnZlckluZm9ybWF0aW9uKCk7CiAgICAgICAgc3Auc2VuZCh1cmkpOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgRnV0dXJlPE51bGw+IF9oYW5kbGVOYXRpdmVScGNDYWxsKG1lc3NhZ2UsIFNlbmRQb3J0IHJlcGx5UG9ydCkgYXN5bmMgewogICAgLy8gS2VlcCBpbiBzeW5jIHdpdGggInJ1bnRpbWUvdm0vc2VydmljZV9pc29sYXRlLmNjOkludm9rZVNlcnZpY2VScGMiLgogICAgUmVzcG9uc2UgcmVzcG9uc2U7CgogICAgdHJ5IHsKICAgICAgZmluYWwgTWVzc2FnZSBycGMgPSBuZXcgTWVzc2FnZS5mcm9tSnNvblJwYygKICAgICAgICAgIG51bGwsIGpzb24uZGVjb2RlKHV0ZjguZGVjb2RlKG1lc3NhZ2UgYXMgTGlzdDxpbnQ+KSkpOwogICAgICBpZiAocnBjLnR5cGUgIT0gTWVzc2FnZVR5cGUuUmVxdWVzdCkgewogICAgICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlLmludGVybmFsRXJyb3IoCiAgICAgICAgICAgICdUaGUgY2xpZW50IHNlbnQgYSBub24tcmVxdWVzdCBqc29uLXJwYyBtZXNzYWdlLicpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3BvbnNlID0gYXdhaXQgcm91dGVSZXF1ZXN0KHRoaXMsIHJwYyk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICByZXNwb25zZSA9IG5ldyBSZXNwb25zZS5pbnRlcm5hbEVycm9yKAogICAgICAgICAgJ1RoZSBycGMgY2FsbCByZXN1bHRlZCBpbiBleGNlcHRpb246ICRleGNlcHRpb24uJyk7CiAgICB9CiAgICBMaXN0PGludD4gYnl0ZXM7CiAgICBzd2l0Y2ggKHJlc3BvbnNlLmtpbmQpIHsKICAgICAgY2FzZSBSZXNwb25zZVBheWxvYWRLaW5kLlN0cmluZzoKICAgICAgICBieXRlcyA9IHV0ZjguZW5jb2RlKHJlc3BvbnNlLnBheWxvYWQpOwogICAgICAgIGJ5dGVzID0gYnl0ZXMgaXMgVWludDhMaXN0ID8gYnl0ZXMgOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KGJ5dGVzKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBSZXNwb25zZVBheWxvYWRLaW5kLkJpbmFyeToKICAgICAgY2FzZSBSZXNwb25zZVBheWxvYWRLaW5kLlV0ZjhTdHJpbmc6CiAgICAgICAgYnl0ZXMgPSByZXNwb25zZS5wYXlsb2FkIGFzIFVpbnQ4TGlzdDsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJlcGx5UG9ydC5zZW5kKGJ5dGVzKTsKICB9CgogIEZ1dHVyZSBfZXhpdCgpIGFzeW5jIHsKICAgIGlzRXhpdGluZyA9IHRydWU7CgogICAgLy8gU3RvcCB0aGUgc2VydmVyLgogICAgaWYgKFZNU2VydmljZUVtYmVkZGVySG9va3Muc2VydmVyU3RvcCAhPSBudWxsKSB7CiAgICAgIGF3YWl0IFZNU2VydmljZUVtYmVkZGVySG9va3Muc2VydmVyU3RvcCgpOwogICAgfQoKICAgIC8vIENsb3NlIHJlY2VpdmUgcG9ydHMuCiAgICBpc29sYXRlQ29udHJvbFBvcnQuY2xvc2UoKTsKICAgIHNjcmlwdExvYWRQb3J0LmNsb3NlKCk7CgogICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgc2V0IGFzIGEgbGlzdCBiZWNhdXNlIGNsaWVudC5kaXNjb25uZWN0KCkgd2lsbAogICAgLy8gYWx0ZXIgdGhlIGNvbm5lY3RlZCBjbGllbnRzIHNldC4KICAgIHZhciBjbGllbnRzTGlzdCA9IGNsaWVudHMudG9MaXN0KCk7CiAgICBmb3IgKHZhciBjbGllbnQgaW4gY2xpZW50c0xpc3QpIHsKICAgICAgY2xpZW50LmRpc2Nvbm5lY3QoKTsKICAgIH0KICAgIGRldmZzLmNsZWFudXAoKTsKICAgIGlmIChWTVNlcnZpY2VFbWJlZGRlckhvb2tzLmNsZWFudXAgIT0gbnVsbCkgewogICAgICBhd2FpdCBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLmNsZWFudXAoKTsKICAgIH0KCiAgICAvLyBOb3RpZnkgdGhlIFZNIHRoYXQgd2UgaGF2ZSBleGl0ZWQuCiAgICBfb25FeGl0KCk7CiAgfQoKICB2b2lkIG1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UpIHsKICAgIGlmIChtZXNzYWdlIGlzIExpc3QpIHsKICAgICAgaWYgKG1lc3NhZ2UubGVuZ3RoID09IDIpIHsKICAgICAgICAvLyBUaGlzIGlzIGFuIGV2ZW50LgogICAgICAgIF9ldmVudE1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2VbMF0sIG5ldyBSZXNwb25zZS5mcm9tKG1lc3NhZ2VbMV0pKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKG1lc3NhZ2UubGVuZ3RoID09IDEpIHsKICAgICAgICAvLyBUaGlzIGlzIGEgY29udHJvbCBtZXNzYWdlIGRpcmVjdGluZyB0aGUgdm0gc2VydmljZSB0byBleGl0LgogICAgICAgIGFzc2VydChtZXNzYWdlWzBdID09IENvbnN0YW50cy5TRVJWSUNFX0VYSVRfTUVTU0FHRV9JRCk7CiAgICAgICAgX2V4aXQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKG1lc3NhZ2UubGVuZ3RoID09IDMpIHsKICAgICAgICBmaW5hbCBvcGNvZGUgPSBtZXNzYWdlWzBdOwogICAgICAgIGlmIChvcGNvZGUgPT0gQ29uc3RhbnRzLk1FVEhPRF9DQUxMX0ZST01fTkFUSVZFKSB7CiAgICAgICAgICBfaGFuZGxlTmF0aXZlUnBjQ2FsbChtZXNzYWdlWzFdLCBtZXNzYWdlWzJdKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gVGhpcyBpcyBhIG1lc3NhZ2UgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgd2ViIHNlcnZlci4KICAgICAgICAgIGFzc2VydCgob3Bjb2RlID09IENvbnN0YW50cy5XRUJfU0VSVkVSX0NPTlRST0xfTUVTU0FHRV9JRCkgfHwKICAgICAgICAgICAgICAob3Bjb2RlID09IENvbnN0YW50cy5TRVJWRVJfSU5GT19NRVNTQUdFX0lEKSk7CiAgICAgICAgICBfc2VydmVyTWVzc2FnZUhhbmRsZXIobWVzc2FnZVswXSwgbWVzc2FnZVsxXSwgbWVzc2FnZVsyXSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChtZXNzYWdlLmxlbmd0aCA9PSA0KSB7CiAgICAgICAgLy8gVGhpcyBpcyBhIG1lc3NhZ2UgaW5mb3JtaW5nIHVzIG9mIHRoZSBiaXJ0aCBvciBkZWF0aCBvZiBhbgogICAgICAgIC8vIGlzb2xhdGUuCiAgICAgICAgX2NvbnRyb2xNZXNzYWdlSGFuZGxlcihtZXNzYWdlWzBdLCBtZXNzYWdlWzFdLCBtZXNzYWdlWzJdLCBtZXNzYWdlWzNdKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIHByaW50KCdJbnRlcm5hbCB2bS1zZXJ2aWNlIGVycm9yOiBpZ25vcmluZyBpbGxlZ2FsIG1lc3NhZ2U6ICRtZXNzYWdlJyk7CiAgfQoKICBWTVNlcnZpY2UuX2ludGVybmFsKCkgOiBldmVudFBvcnQgPSBpc29sYXRlQ29udHJvbFBvcnQgewogICAgZXZlbnRQb3J0LmhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlcjsKICB9CgogIGZhY3RvcnkgVk1TZXJ2aWNlKCkgewogICAgaWYgKFZNU2VydmljZS5faW5zdGFuY2UgPT0gbnVsbCkgewogICAgICBWTVNlcnZpY2UuX2luc3RhbmNlID0gbmV3IFZNU2VydmljZS5faW50ZXJuYWwoKTsKICAgICAgX29uU3RhcnQoKTsKICAgIH0KICAgIHJldHVybiBfaW5zdGFuY2U7CiAgfQoKICBib29sIF9pc0FueUNsaWVudFN1YnNjcmliZWQoU3RyaW5nIHN0cmVhbUlkKSB7CiAgICBmb3IgKHZhciBjbGllbnQgaW4gY2xpZW50cykgewogICAgICBpZiAoY2xpZW50LnN0cmVhbXMuY29udGFpbnMoc3RyZWFtSWQpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIENsaWVudCBfZmluZEZpcnN0Q2xpZW50VGhhdEhhbmRsZXNTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlKSB7CiAgICBpZiAoY2xpZW50cyAhPSBudWxsKSB7CiAgICAgIGZvciAoQ2xpZW50IGMgaW4gY2xpZW50cykgewogICAgICAgIGlmIChjLnNlcnZpY2VzLmNvbnRhaW5zS2V5KHNlcnZpY2UpKSB7CiAgICAgICAgICByZXR1cm4gYzsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgc3RhdGljIGNvbnN0IGtTZXJ2aWNlU3RyZWFtID0gJ1NlcnZpY2UnOwogIHN0YXRpYyBjb25zdCBzZXJ2aWNlU3RyZWFtcyA9IGNvbnN0IFtrU2VydmljZVN0cmVhbV07CgogIEZ1dHVyZTxTdHJpbmc+IF9zdHJlYW1MaXN0ZW4oTWVzc2FnZSBtZXNzYWdlKSBhc3luYyB7CiAgICB2YXIgY2xpZW50ID0gbWVzc2FnZS5jbGllbnQ7CiAgICB2YXIgc3RyZWFtSWQgPSBtZXNzYWdlLnBhcmFtc1snc3RyZWFtSWQnXTsKCiAgICBpZiAoY2xpZW50LnN0cmVhbXMuY29udGFpbnMoc3RyZWFtSWQpKSB7CiAgICAgIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrU3RyZWFtQWxyZWFkeVN1YnNjcmliZWQpOwogICAgfQogICAgaWYgKCFfaXNBbnlDbGllbnRTdWJzY3JpYmVkKHN0cmVhbUlkKSkgewogICAgICBpZiAoIXNlcnZpY2VTdHJlYW1zLmNvbnRhaW5zKHN0cmVhbUlkKSAmJiAhX3ZtTGlzdGVuU3RyZWFtKHN0cmVhbUlkKSkgewogICAgICAgIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrSW52YWxpZFBhcmFtcywKICAgICAgICAgICAgZGV0YWlsczogInN0cmVhbUxpc3RlbjogaW52YWxpZCAnc3RyZWFtSWQnIHBhcmFtZXRlcjogJHtzdHJlYW1JZH0iKTsKICAgICAgfQogICAgfQoKICAgIC8vIFNvbWUgc3RyZWFtcyBjYW4gZ2VuZXJhdGUgZXZlbnRzIG9yIHNpZGUgZWZmZWN0cyBhZnRlciByZWdpc3RyYXRpb24KICAgIHN3aXRjaCAoc3RyZWFtSWQpIHsKICAgICAgY2FzZSBrU2VydmljZVN0cmVhbToKICAgICAgICBmb3IgKENsaWVudCBjIGluIGNsaWVudHMpIHsKICAgICAgICAgIGlmIChjID09IGNsaWVudCkgY29udGludWU7CiAgICAgICAgICBmb3IgKFN0cmluZyBzZXJ2aWNlIGluIGMuc2VydmljZXMua2V5cykgewogICAgICAgICAgICBfc2VuZFNlcnZpY2VSZWdpc3RlcmVkRXZlbnQoYywgc2VydmljZSwgdGFyZ2V0OiBjbGllbnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICA7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgY2xpZW50LnN0cmVhbXMuYWRkKHN0cmVhbUlkKTsKICAgIHJldHVybiBlbmNvZGVTdWNjZXNzKG1lc3NhZ2UpOwogIH0KCiAgRnV0dXJlPFN0cmluZz4gX3N0cmVhbUNhbmNlbChNZXNzYWdlIG1lc3NhZ2UpIGFzeW5jIHsKICAgIHZhciBjbGllbnQgPSBtZXNzYWdlLmNsaWVudDsKICAgIHZhciBzdHJlYW1JZCA9IG1lc3NhZ2UucGFyYW1zWydzdHJlYW1JZCddOwoKICAgIGlmICghY2xpZW50LnN0cmVhbXMuY29udGFpbnMoc3RyZWFtSWQpKSB7CiAgICAgIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrU3RyZWFtTm90U3Vic2NyaWJlZCk7CiAgICB9CiAgICBjbGllbnQuc3RyZWFtcy5yZW1vdmUoc3RyZWFtSWQpOwogICAgaWYgKCFzZXJ2aWNlU3RyZWFtcy5jb250YWlucyhzdHJlYW1JZCkgJiYKICAgICAgICAhX2lzQW55Q2xpZW50U3Vic2NyaWJlZChzdHJlYW1JZCkpIHsKICAgICAgX3ZtQ2FuY2VsU3RyZWFtKHN0cmVhbUlkKTsKICAgIH0KCiAgICByZXR1cm4gZW5jb2RlU3VjY2VzcyhtZXNzYWdlKTsKICB9CgogIHN0YXRpYyBib29sIF9oYXNOYW1lc3BhY2UoU3RyaW5nIG1ldGhvZCkgPT4KICAgICAgbWV0aG9kLmNvbnRhaW5zKCcuJykgJiYKICAgICAgX2dldE5hbWVzcGFjZShtZXRob2QpLnN0YXJ0c1dpdGgoc2VydmljZU5hbWVzcGFjZSk7CiAgc3RhdGljIFN0cmluZyBfZ2V0TmFtZXNwYWNlKFN0cmluZyBtZXRob2QpID0+IG1ldGhvZC5zcGxpdCgnLicpLmZpcnN0OwogIHN0YXRpYyBTdHJpbmcgX2dldE1ldGhvZChTdHJpbmcgbWV0aG9kKSA9PiBtZXRob2Quc3BsaXQoJy4nKS5sYXN0OwoKICBGdXR1cmU8U3RyaW5nPiBfcmVnaXN0ZXJTZXJ2aWNlKE1lc3NhZ2UgbWVzc2FnZSkgYXN5bmMgewogICAgZmluYWwgY2xpZW50ID0gbWVzc2FnZS5jbGllbnQ7CiAgICBmaW5hbCBzZXJ2aWNlID0gbWVzc2FnZS5wYXJhbXNbJ3NlcnZpY2UnXTsKICAgIGZpbmFsIGFsaWFzID0gbWVzc2FnZS5wYXJhbXNbJ2FsaWFzJ107CgogICAgaWYgKHNlcnZpY2UgaXMhIFN0cmluZyB8fCBzZXJ2aWNlID09ICcnKSB7CiAgICAgIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrSW52YWxpZFBhcmFtcywKICAgICAgICAgIGRldGFpbHM6ICJyZWdpc3RlclNlcnZpY2U6IGludmFsaWQgJ3NlcnZpY2UnIHBhcmFtZXRlcjogJHtzZXJ2aWNlfSIpOwogICAgfQogICAgaWYgKGFsaWFzIGlzISBTdHJpbmcgfHwgYWxpYXMgPT0gJycpIHsKICAgICAgcmV0dXJuIGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtJbnZhbGlkUGFyYW1zLAogICAgICAgICAgZGV0YWlsczogInJlZ2lzdGVyU2VydmljZTogaW52YWxpZCAnYWxpYXMnIHBhcmFtZXRlcjogJHthbGlhc30iKTsKICAgIH0KICAgIGlmIChjbGllbnQuc2VydmljZXMuY29udGFpbnNLZXkoc2VydmljZSkpIHsKICAgICAgcmV0dXJuIGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtTZXJ2aWNlQWxyZWFkeVJlZ2lzdGVyZWQpOwogICAgfQogICAgY2xpZW50LnNlcnZpY2VzW3NlcnZpY2VdID0gYWxpYXM7CgogICAgYm9vbCByZW1vdmVkOwogICAgdHJ5IHsKICAgICAgLy8gRG8gbm90IHNlbmQgc3RyZWFtaW5nIGV2ZW50cyB0byB0aGUgY2xpZW50IHdoaWNoIHJlZ2lzdGVycyB0aGUgc2VydmljZQogICAgICByZW1vdmVkID0gY2xpZW50LnN0cmVhbXMucmVtb3ZlKGtTZXJ2aWNlU3RyZWFtKTsKICAgICAgYXdhaXQgX3NlbmRTZXJ2aWNlUmVnaXN0ZXJlZEV2ZW50KGNsaWVudCwgc2VydmljZSk7CiAgICB9IGZpbmFsbHkgewogICAgICBpZiAocmVtb3ZlZCkgY2xpZW50LnN0cmVhbXMuYWRkKGtTZXJ2aWNlU3RyZWFtKTsKICAgIH0KCiAgICByZXR1cm4gZW5jb2RlU3VjY2VzcyhtZXNzYWdlKTsKICB9CgogIF9zZW5kU2VydmljZVJlZ2lzdGVyZWRFdmVudChDbGllbnQgY2xpZW50LCBTdHJpbmcgc2VydmljZSwKICAgICAge0NsaWVudCB0YXJnZXR9KSBhc3luYyB7CiAgICBmaW5hbCBuYW1lc3BhY2UgPSBjbGllbnRzLmtleU9mKGNsaWVudCk7CiAgICBmaW5hbCBhbGlhcyA9IGNsaWVudC5zZXJ2aWNlc1tzZXJ2aWNlXTsKICAgIGZpbmFsIGV2ZW50ID0gbmV3IFJlc3BvbnNlLmpzb24oewogICAgICAnanNvbnJwYyc6ICcyLjAnLAogICAgICAnbWV0aG9kJzogJ3N0cmVhbU5vdGlmeScsCiAgICAgICdwYXJhbXMnOiB7CiAgICAgICAgJ3N0cmVhbUlkJzoga1NlcnZpY2VTdHJlYW0sCiAgICAgICAgJ2V2ZW50JzogewogICAgICAgICAgInR5cGUiOiAiRXZlbnQiLAogICAgICAgICAgImtpbmQiOiAiU2VydmljZVJlZ2lzdGVyZWQiLAogICAgICAgICAgJ3RpbWVzdGFtcCc6IG5ldyBEYXRlVGltZS5ub3coKS5taWxsaXNlY29uZHNTaW5jZUVwb2NoLAogICAgICAgICAgJ3NlcnZpY2UnOiBzZXJ2aWNlLAogICAgICAgICAgJ21ldGhvZCc6IG5hbWVzcGFjZSArICcuJyArIHNlcnZpY2UsCiAgICAgICAgICAnYWxpYXMnOiBhbGlhcwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKICAgICAgX2V2ZW50TWVzc2FnZUhhbmRsZXIoa1NlcnZpY2VTdHJlYW0sIGV2ZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHRhcmdldC5wb3N0KGV2ZW50KTsKICAgIH0KICB9CgogIEZ1dHVyZTxTdHJpbmc+IF9oYW5kbGVTZXJ2aWNlKE1lc3NhZ2UgbWVzc2FnZSkgYXN5bmMgewogICAgZmluYWwgbmFtZXNwYWNlID0gX2dldE5hbWVzcGFjZShtZXNzYWdlLm1ldGhvZCk7CiAgICBmaW5hbCBtZXRob2QgPSBfZ2V0TWV0aG9kKG1lc3NhZ2UubWV0aG9kKTsKICAgIGZpbmFsIGNsaWVudCA9IGNsaWVudHNbbmFtZXNwYWNlXTsKICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewogICAgICBpZiAoY2xpZW50LnNlcnZpY2VzLmNvbnRhaW5zS2V5KG1ldGhvZCkpIHsKICAgICAgICBmaW5hbCBpZCA9IF9zZXJ2aWNlUmVxdWVzdHMubmV3SWQoKTsKICAgICAgICBmaW5hbCBvbGRJZCA9IG1lc3NhZ2Uuc2VyaWFsOwogICAgICAgIGZpbmFsIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8U3RyaW5nPigpOwogICAgICAgIGNsaWVudC5zZXJ2aWNlSGFuZGxlc1tpZF0gPSAoTWVzc2FnZSBtKSB7CiAgICAgICAgICBpZiAobSAhPSBudWxsKSB7CiAgICAgICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZShqc29uLmVuY29kZShtLmZvcndhcmRUb0pzb24oeydpZCc6IG9sZElkfSkpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZShlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrU2VydmljZURpc2FwcGVhcmVkKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBjbGllbnQucG9zdChuZXcgUmVzcG9uc2UuanNvbigKICAgICAgICAgICAgbWVzc2FnZS5mb3J3YXJkVG9Kc29uKHsnaWQnOiBpZCwgJ21ldGhvZCc6IG1ldGhvZH0pKSk7CiAgICAgICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrTWV0aG9kTm90Rm91bmQsCiAgICAgICAgZGV0YWlsczogIlVua25vd24gc2VydmljZTogJHttZXNzYWdlLm1ldGhvZH0iKTsKICB9CgogIEZ1dHVyZTxTdHJpbmc+IF9zcGF3blVyaShNZXNzYWdlIG1lc3NhZ2UpIGFzeW5jIHsKICAgIHZhciB0b2tlbiA9IG1lc3NhZ2UucGFyYW1zWyd0b2tlbiddOwogICAgaWYgKHRva2VuID09IG51bGwpIHsKICAgICAgcmV0dXJuIGVuY29kZU1pc3NpbmdQYXJhbUVycm9yKG1lc3NhZ2UsICd0b2tlbicpOwogICAgfQogICAgaWYgKHRva2VuIGlzISBTdHJpbmcpIHsKICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICd0b2tlbicpOwogICAgfQogICAgdmFyIHVyaSA9IG1lc3NhZ2UucGFyYW1zWyd1cmknXTsKICAgIGlmICh1cmkgPT0gbnVsbCkgewogICAgICByZXR1cm4gZW5jb2RlTWlzc2luZ1BhcmFtRXJyb3IobWVzc2FnZSwgJ3VyaScpOwogICAgfQogICAgaWYgKHVyaSBpcyEgU3RyaW5nKSB7CiAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAndXJpJyk7CiAgICB9CiAgICB2YXIgYXJncyA9IG1lc3NhZ2UucGFyYW1zWydhcmdzJ107CiAgICB2YXIgYXJnc09mU3RyaW5nID0gbmV3IExpc3Q8U3RyaW5nPigpOwogICAgaWYgKGFyZ3MgIT0gbnVsbCkgewogICAgICBpZiAoYXJncyBpcyEgTGlzdCkgewogICAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAnYXJncycpOwogICAgICB9CiAgICAgIGZvciAodmFyIGFyZyBpbiBhcmdzKSB7CiAgICAgICAgaWYgKGFyZyBpcyEgU3RyaW5nKSB7CiAgICAgICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ2FyZ3MnKTsKICAgICAgICB9CiAgICAgICAgYXJnc09mU3RyaW5nLmFkZChhcmcpOwogICAgICB9CiAgICB9CiAgICB2YXIgbXNnID0gbWVzc2FnZS5wYXJhbXNbJ21lc3NhZ2UnXTsKCiAgICBJc29sYXRlLnNwYXduVXJpKFVyaS5wYXJzZSh1cmkpLCBhcmdzT2ZTdHJpbmcsIG1zZykudGhlbigoaXNvbGF0ZSkgewogICAgICBfc3Bhd25VcmlOb3RpZnkoaXNvbGF0ZS5jb250cm9sUG9ydCwgdG9rZW4pOwogICAgfSkuY2F0Y2hFcnJvcigoZSkgewogICAgICBfc3Bhd25VcmlOb3RpZnkoZS50b1N0cmluZygpLCB0b2tlbik7CiAgICB9KTsKCiAgICByZXR1cm4gZW5jb2RlU3VjY2VzcyhtZXNzYWdlKTsKICB9CgogIEZ1dHVyZTxSZXNwb25zZT4gcm91dGVSZXF1ZXN0KFZNU2VydmljZSBfLCBNZXNzYWdlIG1lc3NhZ2UpIGFzeW5jIHsKICAgIGZpbmFsIHJlc3BvbnNlID0gYXdhaXQgX3JvdXRlUmVxdWVzdEltcGwobWVzc2FnZSk7CiAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgewogICAgICAvLyBXZSBzaG91bGQgb25seSBoYXZlIGEgbnVsbCByZXNwb25zZSBmb3IgTm90aWZpY2F0aW9ucy4KICAgICAgYXNzZXJ0KG1lc3NhZ2UudHlwZSA9PSBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24pOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBuZXcgUmVzcG9uc2UuZnJvbShyZXNwb25zZSk7CiAgfQoKICBGdXR1cmUgX3JvdXRlUmVxdWVzdEltcGwoTWVzc2FnZSBtZXNzYWdlKSBhc3luYyB7CiAgICB0cnkgewogICAgICBpZiAobWVzc2FnZS5jb21wbGV0ZWQpIHsKICAgICAgICByZXR1cm4gYXdhaXQgbWVzc2FnZS5yZXNwb25zZTsKICAgICAgfQogICAgICBpZiAobWVzc2FnZS5tZXRob2QgPT0gJ3N0cmVhbUxpc3RlbicpIHsKICAgICAgICByZXR1cm4gYXdhaXQgX3N0cmVhbUxpc3RlbihtZXNzYWdlKTsKICAgICAgfQogICAgICBpZiAobWVzc2FnZS5tZXRob2QgPT0gJ3N0cmVhbUNhbmNlbCcpIHsKICAgICAgICByZXR1cm4gYXdhaXQgX3N0cmVhbUNhbmNlbChtZXNzYWdlKTsKICAgICAgfQogICAgICBpZiAobWVzc2FnZS5tZXRob2QgPT0gJ3JlZ2lzdGVyU2VydmljZScpIHsKICAgICAgICByZXR1cm4gYXdhaXQgX3JlZ2lzdGVyU2VydmljZShtZXNzYWdlKTsKICAgICAgfQogICAgICBpZiAobWVzc2FnZS5tZXRob2QgPT0gJ19zcGF3blVyaScpIHsKICAgICAgICByZXR1cm4gYXdhaXQgX3NwYXduVXJpKG1lc3NhZ2UpOwogICAgICB9CiAgICAgIGlmIChkZXZmcy5zaG91bGRIYW5kbGVNZXNzYWdlKG1lc3NhZ2UpKSB7CiAgICAgICAgcmV0dXJuIGF3YWl0IGRldmZzLmhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7CiAgICAgIH0KICAgICAgaWYgKF9oYXNOYW1lc3BhY2UobWVzc2FnZS5tZXRob2QpKSB7CiAgICAgICAgcmV0dXJuIGF3YWl0IF9oYW5kbGVTZXJ2aWNlKG1lc3NhZ2UpOwogICAgICB9CiAgICAgIGlmIChtZXNzYWdlLnBhcmFtc1snaXNvbGF0ZUlkJ10gIT0gbnVsbCkgewogICAgICAgIHJldHVybiBhd2FpdCBydW5uaW5nSXNvbGF0ZXMucm91dGVSZXF1ZXN0KHRoaXMsIG1lc3NhZ2UpOwogICAgICB9CiAgICAgIHJldHVybiBhd2FpdCBtZXNzYWdlLnNlbmRUb1ZNKCk7CiAgICB9IGNhdGNoIChlLCBzdCkgewogICAgICBtZXNzYWdlLnNldEVycm9yUmVzcG9uc2Uoa0ludGVybmFsRXJyb3IsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbjokZVxuJHN0Jyk7CiAgICAgIHJldHVybiBtZXNzYWdlLnJlc3BvbnNlOwogICAgfQogIH0KCiAgdm9pZCByb3V0ZVJlc3BvbnNlKG1lc3NhZ2UpIHsKICAgIGZpbmFsIGNsaWVudCA9IG1lc3NhZ2UuY2xpZW50OwogICAgaWYgKGNsaWVudC5zZXJ2aWNlSGFuZGxlcy5jb250YWluc0tleShtZXNzYWdlLnNlcmlhbCkpIHsKICAgICAgY2xpZW50LnNlcnZpY2VIYW5kbGVzLnJlbW92ZShtZXNzYWdlLnNlcmlhbCkobWVzc2FnZSk7CiAgICAgIF9zZXJ2aWNlUmVxdWVzdHMucmVsZWFzZShtZXNzYWdlLnNlcmlhbCk7CiAgICB9CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKUmF3UmVjZWl2ZVBvcnQgYm9vdCgpIHsKICAvLyBSZXR1cm4gdGhlIHBvcnQgd2UgZXhwZWN0IGlzb2xhdGUgY29udHJvbCBtZXNzYWdlcyBvbi4KICByZXR1cm4gaXNvbGF0ZUNvbnRyb2xQb3J0Owp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICFjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgiZGFydC52bS5wcm9kdWN0IikpCnZvaWQgX3JlZ2lzdGVySXNvbGF0ZShpbnQgcG9ydF9pZCwgU2VuZFBvcnQgc3AsIFN0cmluZyBuYW1lKSB7CiAgdmFyIHNlcnZpY2UgPSBuZXcgVk1TZXJ2aWNlKCk7CiAgc2VydmljZS5ydW5uaW5nSXNvbGF0ZXMuaXNvbGF0ZVN0YXJ0dXAocG9ydF9pZCwgc3AsIG5hbWUpOwp9CgovLy8gTm90aWZ5IHRoZSBWTSB0aGF0IHRoZSBzZXJ2aWNlIGlzIHJ1bm5pbmcuCnZvaWQgX29uU3RhcnQoKSBuYXRpdmUgIlZNU2VydmljZV9PblN0YXJ0IjsKCi8vLyBOb3RpZnkgdGhlIFZNIHRoYXQgdGhlIHNlcnZpY2UgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcuCnZvaWQgX29uRXhpdCgpIG5hdGl2ZSAiVk1TZXJ2aWNlX09uRXhpdCI7CgovLy8gTm90aWZ5IHRoZSBWTSB0aGF0IHRoZSBzZXJ2ZXIncyBhZGRyZXNzIGhhcyBjaGFuZ2VkLgp2b2lkIG9uU2VydmVyQWRkcmVzc0NoYW5nZShTdHJpbmcgYWRkcmVzcykKICAgIG5hdGl2ZSAiVk1TZXJ2aWNlX09uU2VydmVyQWRkcmVzc0NoYW5nZSI7CgovLy8gU3Vic2NyaWJlIHRvIGEgc2VydmljZSBzdHJlYW0uCmJvb2wgX3ZtTGlzdGVuU3RyZWFtKFN0cmluZyBzdHJlYW1JZCkgbmF0aXZlICJWTVNlcnZpY2VfTGlzdGVuU3RyZWFtIjsKCi8vLyBDYW5jZWwgYSBzdWJzY3JpcHRpb24gdG8gYSBzZXJ2aWNlIHN0cmVhbS4Kdm9pZCBfdm1DYW5jZWxTdHJlYW0oU3RyaW5nIHN0cmVhbUlkKSBuYXRpdmUgIlZNU2VydmljZV9DYW5jZWxTdHJlYW0iOwoKLy8vIEdldCB0aGUgYnl0ZXMgdG8gdGhlIHRhciBhcmNoaXZlLgpVaW50OExpc3QgX3JlcXVlc3RBc3NldHMoKSBuYXRpdmUgIlZNU2VydmljZV9SZXF1ZXN0QXNzZXRzIjsKCi8vLyBOb3RpZnkgdGhlIHZtIHNlcnZpY2UgdGhhdCBhbiBpc29sYXRlIGhhcyBiZWVuIHNwYXduZWQgdmlhIHJwYy4Kdm9pZCBfc3Bhd25VcmlOb3RpZnkob2JqLCBTdHJpbmcgdG9rZW4pIG5hdGl2ZSAiVk1TZXJ2aWNlX3NwYXduVXJpTm90aWZ5IjsKgq0ATk48ARkBFRoXFxQaARMUExcdHhUcGgFAPAElEgIBGhwzJy0kBCICAUQyAUZJSDopAUkcICAfHwEgAR4iJiIkIhshIiYnISklASgnJiABFyQkKzkxOjksOzI/USoDAUUTFhoPFCcHBRkiGgcEIAIBQDFGAgFAJTFNAgFEPhwCATMTFhoWBSACASg1AgE1AS4mAS4lASgiASs4ASEsARw9ASpLARs2AS5IATY/ATYxAT87ASofKigiLiYmMiQmNjQCASgeAScBMSY7SAEwOwEuGgExIgEdASMkJRkEASYtHCsvIwgGMBwVHh4mGCUZIS9IJDUQDg8GJzcUBgQBPyJEHAgGBAFQFDE6DzI1RhsZCg8GBAFRFDQ/GRIKSRYPLUAZEgpEFg8GBAFJSxcBCjNBLS9ADzIIGi0+BhUdJy9MDycrLw8GGwQBGRYBGDUxBgEcIBwBSygoJhsGFTIuBgEqDwQBIRshHUkQCCFHQREQCCEjOzgSEUBIPUUSCgghRhRQEAgGTAQBOygEARgnNxIGFgQBMSIvFQgGEgQBPhsiLxQKCAYRBAErOAE4IS8BLUAGLU43UQgGAUsYGyQlNEUMCgoPBgEiIwQBOCEvAS48BiUuLSEGASMEAS4eOklFATsjLysBLzVQBis1TAYwQQYmARIKUDc6EDcGASMEAT0fLSwmGCASJBMbJ0IeLxkKCAgaMw0aBgQBOTUvJxoxLSYzMhtNE04MCydDIQgGNDgEATQpGTgGHDgGJRc2Bho2BicrGBs5CB4eOwofCAYpAUkzGCwIASMEAUY3HEA4EwYoBAE0Ch8nCC4tCC4tCDEwCCspCDAzCCsuCDFCCCcWUB8GBAEgIz09MAYEAgEiGDwdAgFKPyE9AgEvLAE5KgE5Ky4BI0cBL0cBJj0BREsBD2RhcnQ6X3Ztc2VydmljZTFvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvdm1zZXJ2aWNlL2NsaWVudC5kYXJ0h/svLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll92bXNlcnZpY2U7Cgp0eXBlZGVmIHZvaWQgQ2xpZW50U2VydmljZUhhbmRsZShNZXNzYWdlIHJlc3BvbnNlKTsKCi8vIEEgc2VydmljZSBjbGllbnQuCmFic3RyYWN0IGNsYXNzIENsaWVudCB7CiAgZmluYWwgVk1TZXJ2aWNlIHNlcnZpY2U7CiAgZmluYWwgYm9vbCBzZW5kRXZlbnRzOwoKICAvLy8gQSBzZXQgc3RyZWFtSWRzIHdoaWNoIGRlc2NyaWJlcyB0aGUgc3RyZWFtcyB0aGUgY2xpZW50IGlzIGNvbm5lY3RlZCB0bwogIGZpbmFsIFNldDxTdHJpbmc+IHN0cmVhbXMgPSBuZXcgU2V0PFN0cmluZz4oKTsKCiAgLy8vIFNlcnZpY2VzIHJlZ2lzdGVyZWQgYW5kIHRoZWlyIGFsaWFzZXMKICAvLy8ga2V5OiBzZXJ2aWNlCiAgLy8vIHZhbHVlOiBhbGlhcwogIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gc2VydmljZXMgPSBuZXcgTWFwPFN0cmluZywgU3RyaW5nPigpOwoKICAvLy8gQ2FsbGJhY2tzIHJlZ2lzdGVyZWQgZm9yIHNlcnZpY2UgaW52b2NhdGlvbnMgc2V0IHRvIHRoZSBjbGllbnQKICAvLy8ga2V5OiBSUEMgaWQgdXNlZCBmb3IgdGhlIHJlcXVlc3QKICAvLy8gdmFsdWU6IGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIGludm9rZWQKICBmaW5hbCBNYXA8U3RyaW5nLCBDbGllbnRTZXJ2aWNlSGFuZGxlPiBzZXJ2aWNlSGFuZGxlcyA9CiAgICAgIG5ldyBNYXA8U3RyaW5nLCBDbGllbnRTZXJ2aWNlSGFuZGxlPigpOwoKICBDbGllbnQodGhpcy5zZXJ2aWNlLCB7Ym9vbCBzZW5kRXZlbnRzOiB0cnVlfSkgOiB0aGlzLnNlbmRFdmVudHMgPSBzZW5kRXZlbnRzIHsKICAgIHNlcnZpY2UuX2FkZENsaWVudCh0aGlzKTsKICB9CgogIC8vIERpc2Nvbm5lY3RzIHRoZSBjbGllbnQuCiAgZGlzY29ubmVjdCgpOwoKICAvLy8gV2hlbiBpbXBsZW1lbnRpbmcsIGNhbGwgW2Nsb3NlXSB3aGVuIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gY2xvc2VzLgogIHZvaWQgY2xvc2UoKSB7CiAgICBzZXJ2aWNlLl9yZW1vdmVDbGllbnQodGhpcyk7CiAgfQoKICAvLy8gQ2FsbCB0byBwcm9jZXNzIGEgcmVxdWVzdC4gUmVzcG9uc2Ugd2lsbCBiZSBwb3N0ZWQgd2l0aCAnc2VxJy4KICB2b2lkIG9uUmVxdWVzdChNZXNzYWdlIG1lc3NhZ2UpIHsKICAgIC8vIEluIEpTT04tUlBDIDIuMCBtZXNzYWdlcyB3aXRoIGFuZCBpZCBhcmUgUmVxdWVzdCBhbmQgbXVzdCBiZSBhbnN3ZXJlZAogICAgLy8gaHR0cDovL3d3dy5qc29ucnBjLm9yZy9zcGVjaWZpY2F0aW9uI25vdGlmaWNhdGlvbgogICAgc2VydmljZS5yb3V0ZVJlcXVlc3Qoc2VydmljZSwgbWVzc2FnZSkudGhlbihwb3N0KTsKICB9CgogIHZvaWQgb25SZXNwb25zZShNZXNzYWdlIG1lc3NhZ2UpIHsKICAgIHNlcnZpY2Uucm91dGVSZXNwb25zZShtZXNzYWdlKTsKICB9CgogIC8vLyBDYWxsIHRvIHByb2Nlc3MgYSBub3RpZmljYXRpb24uIFJlc3BvbnNlIHdpbGwgbm90IGJlIHBvc3RlZC4KICB2b2lkIG9uTm90aWZpY2F0aW9uKE1lc3NhZ2UgbWVzc2FnZSkgewogICAgLy8gSW4gSlNPTi1SUEMgMi4wIG1lc3NhZ2VzIHdpdGhvdXQgYW4gaWQgYXJlIE5vdGlmaWNhdGlvbgogICAgLy8gYW5kIHNob3VsZCBub3QgYmUgYW5zd2VyZWQKICAgIC8vIGh0dHA6Ly93d3cuanNvbnJwYy5vcmcvc3BlY2lmaWNhdGlvbiNub3RpZmljYXRpb24KICAgIHNlcnZpY2Uucm91dGVSZXF1ZXN0KHNlcnZpY2UsIG1lc3NhZ2UpOwogIH0KCiAgLy8gU2VuZHMgYSByZXN1bHQgdG8gdGhlIGNsaWVudC4gIEltcGxlbWVudGVkIGluIHN1YmNsYXNzZXMuCiAgdm9pZCBwb3N0KFJlc3BvbnNlIHJlc3VsdCk7CgogIGR5bmFtaWMgdG9Kc29uKCkgewogICAgcmV0dXJuIHt9OwogIH0KfQpDAE5OPAEZATQBFRgbGQFNMQEsExNCAUUnLTouAVEeBAEdEAFKESEEAUUkTTk3BAElJAQBQyk/IjksBAE/HgEVDwQCARtkYXJ0Ol92bXNlcnZpY2UvY2xpZW50LmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL3Ztc2VydmljZS9hc3NldC5kYXJ0hwcvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll92bXNlcnZpY2U7CgpjbGFzcyBBc3NldCB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgVWludDhMaXN0IGRhdGE7CgogIEFzc2V0KHRoaXMubmFtZSwgdGhpcy5kYXRhKTsKCiAgU3RyaW5nIGdldCBtaW1lVHlwZSB7CiAgICB2YXIgZXh0ZW5zaW9uU3RhcnQgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7CiAgICB2YXIgZXh0ZW5zaW9uID0gbmFtZS5zdWJzdHJpbmcoZXh0ZW5zaW9uU3RhcnQgKyAxKTsKICAgIHN3aXRjaCAoZXh0ZW5zaW9uKSB7CiAgICAgIGNhc2UgJ2h0bWwnOgogICAgICAgIHJldHVybiAndGV4dC9odG1sOyBjaGFyc2V0PVVURi04JzsKICAgICAgY2FzZSAnZGFydCc6CiAgICAgICAgcmV0dXJuICdhcHBsaWNhdGlvbi9kYXJ0OyBjaGFyc2V0PVVURi04JzsKICAgICAgY2FzZSAnanMnOgogICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vamF2YXNjcmlwdDsgY2hhcnNldD1VVEYtOCc7CiAgICAgIGNhc2UgJ2Nzcyc6CiAgICAgICAgcmV0dXJuICd0ZXh0L2NzczsgY2hhcnNldD1VVEYtOCc7CiAgICAgIGNhc2UgJ2dpZic6CiAgICAgICAgcmV0dXJuICdpbWFnZS9naWYnOwogICAgICBjYXNlICdwbmcnOgogICAgICAgIHJldHVybiAnaW1hZ2UvcG5nJzsKICAgICAgY2FzZSAnanBnJzoKICAgICAgICByZXR1cm4gJ2ltYWdlL2pwZWcnOwogICAgICBjYXNlICdqcGVnJzoKICAgICAgICByZXR1cm4gJ2ltYWdlL2pwZWcnOwogICAgICBjYXNlICdzdmcnOgogICAgICAgIHJldHVybiAnaW1hZ2Uvc3ZnK3htbCc7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuICd0ZXh0L3BsYWluJzsKICAgIH0KICB9CgogIHN0YXRpYyBNYXA8U3RyaW5nLCBBc3NldD4gcmVxdWVzdCgpIHsKICAgIFVpbnQ4TGlzdCB0YXJCeXRlcyA9IF9yZXF1ZXN0QXNzZXRzKCk7CiAgICBpZiAodGFyQnl0ZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIExpc3QgYXNzZXRMaXN0ID0gX2RlY29kZUFzc2V0cyh0YXJCeXRlcyk7CiAgICBNYXA8U3RyaW5nLCBBc3NldD4gYXNzZXRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBc3NldD4oKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXNzZXRMaXN0Lmxlbmd0aDsgaSArPSAyKSB7CiAgICAgIHZhciBhID0gbmV3IEFzc2V0KGFzc2V0TGlzdFtpXSwgYXNzZXRMaXN0W2kgKyAxXSk7CiAgICAgIGFzc2V0c1thLm5hbWVdID0gYTsKICAgIH0KICAgIHJldHVybiBhc3NldHM7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJG5hbWUgKCRtaW1lVHlwZSknOwp9CgpMaXN0IF9kZWNvZGVBc3NldHMoVWludDhMaXN0IGRhdGEpIG5hdGl2ZSAiVk1TZXJ2aWNlX0RlY29kZUFzc2V0cyI7CgpNYXA8U3RyaW5nLCBBc3NldD4gX2Fzc2V0czsKTWFwPFN0cmluZywgQXNzZXQ+IGdldCBhc3NldHMgewogIGlmIChfYXNzZXRzID09IG51bGwpIHsKICAgIHRyeSB7CiAgICAgIF9hc3NldHMgPSBBc3NldC5yZXF1ZXN0KCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHByaW50KCdDb3VsZCBub3QgbG9hZCBPYnNlcnZhdG9yeSBhc3NldHM6ICRlJyk7CiAgICB9CiAgfQogIHJldHVybiBfYXNzZXRzOwp9CkcATk48ARkBDhUYAR8BGDA4GRMrEzIROBIqEhwSHBIdEx0SIA8dBgQBKCscEwYuPjQ5GgYTBAEsAgFEARwgGQohEjYGBBICARpkYXJ0Ol92bXNlcnZpY2UvYXNzZXQuZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvdm1zZXJ2aWNlL2RldmZzLmRhcnSvEi8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuX3Ztc2VydmljZTsKClN0cmluZyBfZW5jb2RlRGV2RlNEaXNhYmxlZEVycm9yKE1lc3NhZ2UgbWVzc2FnZSkgewogIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrRmVhdHVyZURpc2FibGVkLAogICAgICBkZXRhaWxzOiAiRGV2RlMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIERhcnQgaW1wbGVtZW50YXRpb24iKTsKfQoKU3RyaW5nIF9lbmNvZGVGaWxlU3lzdGVtQWxyZWFkeUV4aXN0c0Vycm9yKE1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIGZzTmFtZSkgewogIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrRmlsZVN5c3RlbUFscmVhZHlFeGlzdHMsCiAgICAgIGRldGFpbHM6ICIke21lc3NhZ2UubWV0aG9kfTogZmlsZSBzeXN0ZW0gJyR7ZnNOYW1lfScgYWxyZWFkeSBleGlzdHMiKTsKfQoKU3RyaW5nIF9lbmNvZGVGaWxlU3lzdGVtRG9lc05vdEV4aXN0RXJyb3IoTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgZnNOYW1lKSB7CiAgcmV0dXJuIGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtGaWxlU3lzdGVtRG9lc05vdEV4aXN0LAogICAgICBkZXRhaWxzOiAiJHttZXNzYWdlLm1ldGhvZH06IGZpbGUgc3lzdGVtICcke2ZzTmFtZX0nIGRvZXMgbm90IGV4aXN0Iik7Cn0KCmNsYXNzIF9GaWxlU3lzdGVtIHsKICBfRmlsZVN5c3RlbSh0aGlzLm5hbWUsIHRoaXMudXJpKTsKCiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgVXJpIHVyaTsKCiAgVXJpIHJlc29sdmVQYXRoKFN0cmluZyBwYXRoKSB7CiAgICBpZiAocGF0aC5zdGFydHNXaXRoKCcvJykpIHsKICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwogICAgfQogICAgaWYgKHBhdGguaXNFbXB0eSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIFVyaSBwYXRoVXJpOwogICAgdHJ5IHsKICAgICAgcGF0aFVyaSA9IG5ldyBVcmkuZmlsZShwYXRoKTsKICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHJldHVybiByZXNvbHZlKHBhdGhVcmkpOwogIH0KCiAgVXJpIHJlc29sdmUoVXJpIHBhdGhVcmkpIHsKICAgIHRyeSB7CiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoaXMgcGF0aFVyaSBjYW4gYmUgY29udmVydGVkIHRvIGEgZmlsZSBwYXRoLgogICAgICBwYXRoVXJpLnRvRmlsZVBhdGgoKTsKICAgIH0gb24gVW5zdXBwb3J0ZWRFcnJvciBjYXRjaCAoZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBVcmkgcmVzb2x2ZWRVcmkgPSB1cmkucmVzb2x2ZVVyaShwYXRoVXJpKTsKICAgIGlmICghcmVzb2x2ZWRVcmkudG9TdHJpbmcoKS5zdGFydHNXaXRoKHVyaS50b1N0cmluZygpKSkgewogICAgICAvLyBSZXNvbHZlZCB1cmkgbXVzdCBiZSB3aXRoaW4gdGhlIGZpbGVzeXN0ZW0ncyBiYXNlIHVyaS4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gcmVzb2x2ZWRVcmk7CiAgfQoKICBNYXAgdG9NYXAoKSB7CiAgICByZXR1cm4gewogICAgICAndHlwZSc6ICdGaWxlU3lzdGVtJywKICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAndXJpJzogdXJpLnRvU3RyaW5nKCksCiAgICB9OwogIH0KfQoKY2xhc3MgRGV2RlMgewogIERldkZTKCk7CgogIE1hcDxTdHJpbmcsIF9GaWxlU3lzdGVtPiBfZnNNYXAgPSB7fTsKCiAgZmluYWwgU2V0IF9ycGNOYW1lcyA9IG5ldyBTZXQuZnJvbShbCiAgICAnX2xpc3REZXZGUycsCiAgICAnX2NyZWF0ZURldkZTJywKICAgICdfZGVsZXRlRGV2RlMnLAogICAgJ19yZWFkRGV2RlNGaWxlJywKICAgICdfd3JpdGVEZXZGU0ZpbGUnLAogICAgJ193cml0ZURldkZTRmlsZXMnLAogICAgJ19saXN0RGV2RlNGaWxlcycsCiAgXSk7CgogIHZvaWQgY2xlYW51cCgpIHsKICAgIHZhciBkZWxldGVEaXIgPSBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLmRlbGV0ZURpcjsKICAgIGlmIChkZWxldGVEaXIgPT0gbnVsbCkgewogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgZGVsZXRpb25zID0gPEZ1dHVyZT5bXTsKICAgIGZvciAodmFyIGZzIGluIF9mc01hcC52YWx1ZXMpIHsKICAgICAgZGVsZXRpb25zLmFkZChkZWxldGVEaXIoZnMudXJpKSk7CiAgICB9CiAgICBGdXR1cmUud2FpdChkZWxldGlvbnMpOwogICAgX2ZzTWFwLmNsZWFyKCk7CiAgfQoKICBib29sIHNob3VsZEhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CiAgICByZXR1cm4gX3JwY05hbWVzLmNvbnRhaW5zKG1lc3NhZ2UubWV0aG9kKTsKICB9CgogIEZ1dHVyZTxTdHJpbmc+IGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSBhc3luYyB7CiAgICBzd2l0Y2ggKG1lc3NhZ2UubWV0aG9kKSB7CiAgICAgIGNhc2UgJ19saXN0RGV2RlMnOgogICAgICAgIHJldHVybiBfbGlzdERldkZTKG1lc3NhZ2UpOwogICAgICBjYXNlICdfY3JlYXRlRGV2RlMnOgogICAgICAgIHJldHVybiBfY3JlYXRlRGV2RlMobWVzc2FnZSk7CiAgICAgIGNhc2UgJ19kZWxldGVEZXZGUyc6CiAgICAgICAgcmV0dXJuIF9kZWxldGVEZXZGUyhtZXNzYWdlKTsKICAgICAgY2FzZSAnX3JlYWREZXZGU0ZpbGUnOgogICAgICAgIHJldHVybiBfcmVhZERldkZTRmlsZShtZXNzYWdlKTsKICAgICAgY2FzZSAnX3dyaXRlRGV2RlNGaWxlJzoKICAgICAgICByZXR1cm4gX3dyaXRlRGV2RlNGaWxlKG1lc3NhZ2UpOwogICAgICBjYXNlICdfd3JpdGVEZXZGU0ZpbGVzJzoKICAgICAgICByZXR1cm4gX3dyaXRlRGV2RlNGaWxlcyhtZXNzYWdlKTsKICAgICAgY2FzZSAnX2xpc3REZXZGU0ZpbGVzJzoKICAgICAgICByZXR1cm4gX2xpc3REZXZGU0ZpbGVzKG1lc3NhZ2UpOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrSW50ZXJuYWxFcnJvciwKICAgICAgICAgICAgZGV0YWlsczogJ1VuZXhwZWN0ZWQgcnBjICR7bWVzc2FnZS5tZXRob2R9Jyk7CiAgICB9CiAgfQoKICBGdXR1cmU8U3RyaW5nPiBoYW5kbGVQdXRTdHJlYW0oCiAgICAgIE9iamVjdCBmc05hbWUsIE9iamVjdCBwYXRoLCBVcmkgZnNVcmksIFN0cmVhbTxMaXN0PGludD4+IGJ5dGVzKSBhc3luYyB7CiAgICAvLyBBIGR1bW15IE1lc3NhZ2UgZm9yIGVycm9yIG1lc3NhZ2UgY29uc3RydWN0aW9uLgogICAgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UuZm9yTWV0aG9kKCdfd3JpdGVEZXZGU0ZpbGUnKTsKICAgIHZhciB3cml0ZVN0cmVhbUZpbGUgPSBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLndyaXRlU3RyZWFtRmlsZTsKICAgIGlmICh3cml0ZVN0cmVhbUZpbGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2VuY29kZURldkZTRGlzYWJsZWRFcnJvcihtZXNzYWdlKTsKICAgIH0KICAgIGlmIChmc05hbWUgPT0gbnVsbCkgewogICAgICByZXR1cm4gZW5jb2RlTWlzc2luZ1BhcmFtRXJyb3IobWVzc2FnZSwgJ2ZzTmFtZScpOwogICAgfQogICAgaWYgKGZzTmFtZSBpcyEgU3RyaW5nKSB7CiAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAnZnNOYW1lJyk7CiAgICB9CiAgICB2YXIgZnMgPSBfZnNNYXBbZnNOYW1lXTsKICAgIGlmIChmcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZW5jb2RlRmlsZVN5c3RlbURvZXNOb3RFeGlzdEVycm9yKG1lc3NhZ2UsIGZzTmFtZSk7CiAgICB9CiAgICBVcmkgdXJpID0gZnNVcmk7CiAgICBpZiAodXJpID09IG51bGwpIHsKICAgICAgaWYgKHBhdGggPT0gbnVsbCkgewogICAgICAgIHJldHVybiBlbmNvZGVNaXNzaW5nUGFyYW1FcnJvcihtZXNzYWdlLCAncGF0aCcpOwogICAgICB9CiAgICAgIGlmIChwYXRoIGlzISBTdHJpbmcpIHsKICAgICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ3BhdGgnKTsKICAgICAgfQogICAgICB1cmkgPSBmcy5yZXNvbHZlUGF0aChwYXRoKTsKICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICdwYXRoJyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHVyaSA9IGZzLnJlc29sdmUodXJpKTsKICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICd1cmknKTsKICAgICAgfQogICAgfQogICAgYXdhaXQgd3JpdGVTdHJlYW1GaWxlKHVyaSwgYnl0ZXMpOwogICAgcmV0dXJuIGVuY29kZVN1Y2Nlc3MobWVzc2FnZSk7CiAgfQoKICBGdXR1cmU8U3RyaW5nPiBfbGlzdERldkZTKE1lc3NhZ2UgbWVzc2FnZSkgYXN5bmMgewogICAgdmFyIHJlc3VsdCA9IHt9OwogICAgcmVzdWx0Wyd0eXBlJ10gPSAnRmlsZVN5c3RlbUxpc3QnOwogICAgcmVzdWx0Wydmc05hbWVzJ10gPSBfZnNNYXAua2V5cy50b0xpc3QoKTsKICAgIHJldHVybiBlbmNvZGVSZXN1bHQobWVzc2FnZSwgcmVzdWx0KTsKICB9CgogIEZ1dHVyZTxTdHJpbmc+IF9jcmVhdGVEZXZGUyhNZXNzYWdlIG1lc3NhZ2UpIGFzeW5jIHsKICAgIHZhciBjcmVhdGVUZW1wRGlyID0gVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy5jcmVhdGVUZW1wRGlyOwogICAgaWYgKGNyZWF0ZVRlbXBEaXIgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2VuY29kZURldkZTRGlzYWJsZWRFcnJvcihtZXNzYWdlKTsKICAgIH0KICAgIHZhciBmc05hbWUgPSBtZXNzYWdlLnBhcmFtc1snZnNOYW1lJ107CiAgICBpZiAoZnNOYW1lID09IG51bGwpIHsKICAgICAgcmV0dXJuIGVuY29kZU1pc3NpbmdQYXJhbUVycm9yKG1lc3NhZ2UsICdmc05hbWUnKTsKICAgIH0KICAgIGlmIChmc05hbWUgaXMhIFN0cmluZykgewogICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ2ZzTmFtZScpOwogICAgfQogICAgdmFyIGZzID0gX2ZzTWFwW2ZzTmFtZV07CiAgICBpZiAoZnMgIT0gbnVsbCkgewogICAgICByZXR1cm4gX2VuY29kZUZpbGVTeXN0ZW1BbHJlYWR5RXhpc3RzRXJyb3IobWVzc2FnZSwgZnNOYW1lKTsKICAgIH0KICAgIHZhciB0ZW1wRGlyID0gYXdhaXQgY3JlYXRlVGVtcERpcihmc05hbWUpOwogICAgZnMgPSBuZXcgX0ZpbGVTeXN0ZW0oZnNOYW1lLCB0ZW1wRGlyKTsKICAgIF9mc01hcFtmc05hbWVdID0gZnM7CiAgICByZXR1cm4gZW5jb2RlUmVzdWx0KG1lc3NhZ2UsIGZzLnRvTWFwKCkpOwogIH0KCiAgRnV0dXJlPFN0cmluZz4gX2RlbGV0ZURldkZTKE1lc3NhZ2UgbWVzc2FnZSkgYXN5bmMgewogICAgdmFyIGRlbGV0ZURpciA9IFZNU2VydmljZUVtYmVkZGVySG9va3MuZGVsZXRlRGlyOwogICAgaWYgKGRlbGV0ZURpciA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZW5jb2RlRGV2RlNEaXNhYmxlZEVycm9yKG1lc3NhZ2UpOwogICAgfQogICAgdmFyIGZzTmFtZSA9IG1lc3NhZ2UucGFyYW1zWydmc05hbWUnXTsKICAgIGlmIChmc05hbWUgPT0gbnVsbCkgewogICAgICByZXR1cm4gZW5jb2RlTWlzc2luZ1BhcmFtRXJyb3IobWVzc2FnZSwgJ2ZzTmFtZScpOwogICAgfQogICAgaWYgKGZzTmFtZSBpcyEgU3RyaW5nKSB7CiAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAnZnNOYW1lJyk7CiAgICB9CiAgICB2YXIgZnMgPSBfZnNNYXAucmVtb3ZlKGZzTmFtZSk7CiAgICBpZiAoZnMgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2VuY29kZUZpbGVTeXN0ZW1Eb2VzTm90RXhpc3RFcnJvcihtZXNzYWdlLCBmc05hbWUpOwogICAgfQogICAgYXdhaXQgZGVsZXRlRGlyKGZzLnVyaSk7CiAgICByZXR1cm4gZW5jb2RlU3VjY2VzcyhtZXNzYWdlKTsKICB9CgogIEZ1dHVyZTxTdHJpbmc+IF9yZWFkRGV2RlNGaWxlKE1lc3NhZ2UgbWVzc2FnZSkgYXN5bmMgewogICAgdmFyIHJlYWRGaWxlID0gVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy5yZWFkRmlsZTsKICAgIGlmIChyZWFkRmlsZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZW5jb2RlRGV2RlNEaXNhYmxlZEVycm9yKG1lc3NhZ2UpOwogICAgfQogICAgdmFyIGZzTmFtZSA9IG1lc3NhZ2UucGFyYW1zWydmc05hbWUnXTsKICAgIGlmIChmc05hbWUgPT0gbnVsbCkgewogICAgICByZXR1cm4gZW5jb2RlTWlzc2luZ1BhcmFtRXJyb3IobWVzc2FnZSwgJ2ZzTmFtZScpOwogICAgfQogICAgaWYgKGZzTmFtZSBpcyEgU3RyaW5nKSB7CiAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAnZnNOYW1lJyk7CiAgICB9CiAgICB2YXIgZnMgPSBfZnNNYXBbZnNOYW1lXTsKICAgIGlmIChmcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZW5jb2RlRmlsZVN5c3RlbURvZXNOb3RFeGlzdEVycm9yKG1lc3NhZ2UsIGZzTmFtZSk7CiAgICB9CiAgICBVcmkgdXJpOwogICAgaWYgKG1lc3NhZ2UucGFyYW1zWyd1cmknXSAhPSBudWxsKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHVyaVBhcmFtID0gbWVzc2FnZS5wYXJhbXNbJ3VyaSddOwogICAgICAgIGlmICh1cmlQYXJhbSBpcyEgU3RyaW5nKSB7CiAgICAgICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ3VyaScpOwogICAgICAgIH0KICAgICAgICBVcmkgcGFyc2VkVXJpID0gVXJpLnBhcnNlKHVyaVBhcmFtKTsKICAgICAgICB1cmkgPSBmcy5yZXNvbHZlKHBhcnNlZFVyaSk7CiAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ3VyaScpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAndXJpJyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhciBwYXRoID0gbWVzc2FnZS5wYXJhbXNbJ3BhdGgnXTsKICAgICAgaWYgKHBhdGggPT0gbnVsbCkgewogICAgICAgIHJldHVybiBlbmNvZGVNaXNzaW5nUGFyYW1FcnJvcihtZXNzYWdlLCAncGF0aCcpOwogICAgICB9CiAgICAgIGlmIChwYXRoIGlzISBTdHJpbmcpIHsKICAgICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ3BhdGgnKTsKICAgICAgfQogICAgICB1cmkgPSBmcy5yZXNvbHZlUGF0aChwYXRoKTsKICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICdwYXRoJyk7CiAgICAgIH0KICAgIH0KICAgIHRyeSB7CiAgICAgIExpc3Q8aW50PiBieXRlcyA9IGF3YWl0IHJlYWRGaWxlKHVyaSk7CiAgICAgIHZhciByZXN1bHQgPSB7J3R5cGUnOiAnRlNGaWxlJywgJ2ZpbGVDb250ZW50cyc6IGJhc2U2NC5lbmNvZGUoYnl0ZXMpfTsKICAgICAgcmV0dXJuIGVuY29kZVJlc3VsdChtZXNzYWdlLCByZXN1bHQpOwogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1cm4gZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga0ZpbGVEb2VzTm90RXhpc3QsCiAgICAgICAgICBkZXRhaWxzOiAiX3JlYWREZXZGU0ZpbGU6ICRlIik7CiAgICB9CiAgfQoKICBGdXR1cmU8U3RyaW5nPiBfd3JpdGVEZXZGU0ZpbGUoTWVzc2FnZSBtZXNzYWdlKSBhc3luYyB7CiAgICB2YXIgd3JpdGVGaWxlID0gVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy53cml0ZUZpbGU7CiAgICBpZiAod3JpdGVGaWxlID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9lbmNvZGVEZXZGU0Rpc2FibGVkRXJyb3IobWVzc2FnZSk7CiAgICB9CiAgICB2YXIgZnNOYW1lID0gbWVzc2FnZS5wYXJhbXNbJ2ZzTmFtZSddOwogICAgaWYgKGZzTmFtZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBlbmNvZGVNaXNzaW5nUGFyYW1FcnJvcihtZXNzYWdlLCAnZnNOYW1lJyk7CiAgICB9CiAgICBpZiAoZnNOYW1lIGlzISBTdHJpbmcpIHsKICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICdmc05hbWUnKTsKICAgIH0KICAgIHZhciBmcyA9IF9mc01hcFtmc05hbWVdOwogICAgaWYgKGZzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9lbmNvZGVGaWxlU3lzdGVtRG9lc05vdEV4aXN0RXJyb3IobWVzc2FnZSwgZnNOYW1lKTsKICAgIH0KICAgIFVyaSB1cmk7CiAgICBpZiAobWVzc2FnZS5wYXJhbXNbJ3VyaSddICE9IG51bGwpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgdXJpUGFyYW0gPSBtZXNzYWdlLnBhcmFtc1sndXJpJ107CiAgICAgICAgaWYgKHVyaVBhcmFtIGlzISBTdHJpbmcpIHsKICAgICAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAndXJpJyk7CiAgICAgICAgfQogICAgICAgIFVyaSBwYXJzZWRVcmkgPSBVcmkucGFyc2UodXJpUGFyYW0pOwogICAgICAgIHVyaSA9IGZzLnJlc29sdmUocGFyc2VkVXJpKTsKICAgICAgICBpZiAodXJpID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAndXJpJyk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICd1cmknKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIHBhdGggPSBtZXNzYWdlLnBhcmFtc1sncGF0aCddOwogICAgICBpZiAocGF0aCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGVuY29kZU1pc3NpbmdQYXJhbUVycm9yKG1lc3NhZ2UsICdwYXRoJyk7CiAgICAgIH0KICAgICAgaWYgKHBhdGggaXMhIFN0cmluZykgewogICAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAncGF0aCcpOwogICAgICB9CiAgICAgIHVyaSA9IGZzLnJlc29sdmVQYXRoKHBhdGgpOwogICAgICBpZiAodXJpID09IG51bGwpIHsKICAgICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ3BhdGgnKTsKICAgICAgfQogICAgfQogICAgdmFyIGZpbGVDb250ZW50cyA9IG1lc3NhZ2UucGFyYW1zWydmaWxlQ29udGVudHMnXTsKICAgIGlmIChmaWxlQ29udGVudHMgPT0gbnVsbCkgewogICAgICByZXR1cm4gZW5jb2RlTWlzc2luZ1BhcmFtRXJyb3IobWVzc2FnZSwgJ2ZpbGVDb250ZW50cycpOwogICAgfQogICAgaWYgKGZpbGVDb250ZW50cyBpcyEgU3RyaW5nKSB7CiAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAnZmlsZUNvbnRlbnRzJyk7CiAgICB9CiAgICBMaXN0PGludD4gZGVjb2RlZEZpbGVDb250ZW50cyA9IGJhc2U2NC5kZWNvZGUoZmlsZUNvbnRlbnRzKTsKCiAgICBhd2FpdCB3cml0ZUZpbGUodXJpLCBkZWNvZGVkRmlsZUNvbnRlbnRzKTsKICAgIHJldHVybiBlbmNvZGVTdWNjZXNzKG1lc3NhZ2UpOwogIH0KCiAgRnV0dXJlPFN0cmluZz4gX3dyaXRlRGV2RlNGaWxlcyhNZXNzYWdlIG1lc3NhZ2UpIGFzeW5jIHsKICAgIHZhciB3cml0ZUZpbGUgPSBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLndyaXRlRmlsZTsKICAgIGlmICh3cml0ZUZpbGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2VuY29kZURldkZTRGlzYWJsZWRFcnJvcihtZXNzYWdlKTsKICAgIH0KICAgIHZhciBmc05hbWUgPSBtZXNzYWdlLnBhcmFtc1snZnNOYW1lJ107CiAgICBpZiAoZnNOYW1lID09IG51bGwpIHsKICAgICAgcmV0dXJuIGVuY29kZU1pc3NpbmdQYXJhbUVycm9yKG1lc3NhZ2UsICdmc05hbWUnKTsKICAgIH0KICAgIGlmIChmc05hbWUgaXMhIFN0cmluZykgewogICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ2ZzTmFtZScpOwogICAgfQogICAgdmFyIGZzID0gX2ZzTWFwW2ZzTmFtZV07CiAgICBpZiAoZnMgPT0gbnVsbCkgewogICAgICByZXR1cm4gX2VuY29kZUZpbGVTeXN0ZW1Eb2VzTm90RXhpc3RFcnJvcihtZXNzYWdlLCBmc05hbWUpOwogICAgfQogICAgdmFyIGZpbGVzID0gbWVzc2FnZS5wYXJhbXNbJ2ZpbGVzJ107CiAgICBpZiAoZmlsZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gZW5jb2RlTWlzc2luZ1BhcmFtRXJyb3IobWVzc2FnZSwgJ2ZpbGVzJyk7CiAgICB9CiAgICBpZiAoZmlsZXMgaXMhIExpc3QpIHsKICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICdmaWxlcycpOwogICAgfQogICAgdmFyIHVyaXMgPSBbXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGZpbGVJbmZvID0gZmlsZXNbaV07CiAgICAgIGlmIChmaWxlSW5mbyBpcyEgTGlzdCB8fAogICAgICAgICAgZmlsZUluZm8ubGVuZ3RoICE9IDIgfHwKICAgICAgICAgIGZpbGVJbmZvWzBdIGlzISBTdHJpbmcgfHwKICAgICAgICAgIGZpbGVJbmZvWzFdIGlzISBTdHJpbmcpIHsKICAgICAgICByZXR1cm4gZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga0ludmFsaWRQYXJhbXMsCiAgICAgICAgICAgIGRldGFpbHM6ICIke21lc3NhZ2UubWV0aG9kfTogaW52YWxpZCAnZmlsZXMnIHBhcmFtZXRlciAiCiAgICAgICAgICAgICAgICAiYXQgaW5kZXggJHtpfTogJHtmaWxlSW5mb30iKTsKICAgICAgfQogICAgICB2YXIgdXJpID0gZnMucmVzb2x2ZVBhdGgoZmlsZUluZm9bMF0pOwogICAgICBpZiAodXJpID09IG51bGwpIHsKICAgICAgICByZXR1cm4gZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga0ludmFsaWRQYXJhbXMsCiAgICAgICAgICAgIGRldGFpbHM6ICIke21lc3NhZ2UubWV0aG9kfTogaW52YWxpZCAnZmlsZXMnIHBhcmFtZXRlciAiCiAgICAgICAgICAgICAgICAiYXQgaW5kZXggJHtpfTogJHtmaWxlSW5mb30iKTsKICAgICAgfQogICAgICB1cmlzLmFkZCh1cmkpOwogICAgfQogICAgdmFyIHBlbmRpbmdXcml0ZXMgPSA8RnV0dXJlPltdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIExpc3Q8aW50PiBkZWNvZGVkRmlsZUNvbnRlbnRzID0gYmFzZTY0LmRlY29kZShmaWxlc1tpXVsxXSk7CiAgICAgIHBlbmRpbmdXcml0ZXMuYWRkKHdyaXRlRmlsZSh1cmlzW2ldLCBkZWNvZGVkRmlsZUNvbnRlbnRzKSk7CiAgICB9CiAgICBhd2FpdCBGdXR1cmUud2FpdChwZW5kaW5nV3JpdGVzKTsKICAgIHJldHVybiBlbmNvZGVTdWNjZXNzKG1lc3NhZ2UpOwogIH0KCiAgRnV0dXJlPFN0cmluZz4gX2xpc3REZXZGU0ZpbGVzKE1lc3NhZ2UgbWVzc2FnZSkgYXN5bmMgewogICAgdmFyIGxpc3RGaWxlcyA9IFZNU2VydmljZUVtYmVkZGVySG9va3MubGlzdEZpbGVzOwogICAgaWYgKGxpc3RGaWxlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZW5jb2RlRGV2RlNEaXNhYmxlZEVycm9yKG1lc3NhZ2UpOwogICAgfQogICAgdmFyIGZzTmFtZSA9IG1lc3NhZ2UucGFyYW1zWydmc05hbWUnXTsKICAgIGlmIChmc05hbWUgPT0gbnVsbCkgewogICAgICByZXR1cm4gZW5jb2RlTWlzc2luZ1BhcmFtRXJyb3IobWVzc2FnZSwgJ2ZzTmFtZScpOwogICAgfQogICAgaWYgKGZzTmFtZSBpcyEgU3RyaW5nKSB7CiAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAnZnNOYW1lJyk7CiAgICB9CiAgICB2YXIgZnMgPSBfZnNNYXBbZnNOYW1lXTsKICAgIGlmIChmcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZW5jb2RlRmlsZVN5c3RlbURvZXNOb3RFeGlzdEVycm9yKG1lc3NhZ2UsIGZzTmFtZSk7CiAgICB9CiAgICB2YXIgZmlsZUxpc3QgPSBhd2FpdCBsaXN0RmlsZXMoZnMudXJpKTsKICAgIC8vIFJlbW92ZSBhbnkgdXJsLWVuY29kaW5nIGluIHRoZSBmaWxlbmFtZXMuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGZpbGVMaXN0W2ldWyduYW1lJ10gPSBVcmkuZGVjb2RlRnVsbChmaWxlTGlzdFtpXVsnbmFtZSddKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSB7J3R5cGUnOiAnRlNGaWxlTGlzdCcsICdmaWxlcyc6IGZpbGVMaXN0fTsKICAgIHJldHVybiBlbmNvZGVSZXN1bHQobWVzc2FnZSwgcmVzdWx0KTsKICB9Cn0KgZEATk48ARkBNDNGAgFNO00CAUw6TQIBFCQBFREBISAgBhgTBhEKJCUTBgEdBAEdCkYcJhMGAS8+QBMGGAQBEA0cFB0HBAIBDgsBKAEnEhQUFhcYFwYBEzYdDgYgJCgGHBQEAS4vBAE4HhkkGyYbJh0oHikfKh4pDzc6BgQBIk43QEIjMQYaOQYdOQYdFkIGFRcaOQgdOQgiGTkIDR0ZOAgGJyMEATUVJy4qBAE3PiExBisaOQYdOQYdFkMGLysZLgQBNzYdMQYrGjkGHTkGJBZCBh0jBAE5NBwxBisaOQYdOQYdFkIGDSkMLiM6Ci0lGzoKFDgIDSkaOQgdOQgiGTkIBgotTSwSOCoGBAE6Nh0xBisaOQYdOQYdFkIGDSkMLiM6Ci0lGzoKFDgIDSkaOQgdOQgiGTkIBjcgPwYjPwZBAS8jBAE7Nh0xBisaOQYdOQYdFkIGKRk4Bho4BhMtHx8iJCQ3RS8ILRk3RS8IFQYkLEJCBiYjBAE6Nh0xBisaOQYdOQYdFkIGLDEwQQY8KgQCARpkYXJ0Ol92bXNlcnZpY2UvZGV2ZnMuZGFydDRvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvdm1zZXJ2aWNlL2NvbnN0YW50cy5kYXJ0g68vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll92bXNlcnZpY2U7CgovLyBUaGVzZSBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHJ1bnRpbWUvdm0vc2VydmljZS5jYy4KY2xhc3MgQ29uc3RhbnRzIHsKICBzdGF0aWMgY29uc3QgaW50IFNFUlZJQ0VfRVhJVF9NRVNTQUdFX0lEID0gMDsKICBzdGF0aWMgY29uc3QgaW50IElTT0xBVEVfU1RBUlRVUF9NRVNTQUdFX0lEID0gMTsKICBzdGF0aWMgY29uc3QgaW50IElTT0xBVEVfU0hVVERPV05fTUVTU0FHRV9JRCA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBXRUJfU0VSVkVSX0NPTlRST0xfTUVTU0FHRV9JRCA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBTRVJWRVJfSU5GT19NRVNTQUdFX0lEID0gNDsKCiAgLy8vIFNpZ25hbHMgYW4gUlBDIGNvbWluZyBmcm9tIG5hdGl2ZSBjb2RlIChpbnN0ZWFkIG9mIGZyb20gYSB3ZWJzb2NrZXQKICAvLy8gY29ubmVjdGlvbikuICBUaGVzZSBjYWxscyBhcmUgbGltaXRlZCB0byBzaW1wbGUgcmVxdWVzdC1yZXNwb25zZSBhbmQgZG8KICAvLy8gbm90IGFsbG93IGFyYml0cmFyeSBqc29uLXJwYyBtZXNzYWdlcy4KICAvLy8KICAvLy8gVGhlIG1lc3NhZ2VzIGFyZSBhbiBhcnJheSBvZiBsZW5ndGggMzoKICAvLy8gICAoTUVUSE9EX0NBTExfRlJPTV9OQVRJVkUsIFN0cmluZyBqc29uUmVxdWVzdCwgUG9ydElkIHJlcGx5UG9ydCkuCiAgc3RhdGljIGNvbnN0IGludCBNRVRIT0RfQ0FMTF9GUk9NX05BVElWRSA9IDU7Cn0KGABOTjwBGQE6EjAzNDYvAUpOLQYtSTACAR5kYXJ0Ol92bXNlcnZpY2UvY29uc3RhbnRzLmRhcnQ6b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL3Ztc2VydmljZS9ydW5uaW5nX2lzb2xhdGUuZGFydIKrLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5fdm1zZXJ2aWNlOwoKY2xhc3MgUnVubmluZ0lzb2xhdGUgaW1wbGVtZW50cyBNZXNzYWdlUm91dGVyIHsKICBmaW5hbCBpbnQgcG9ydElkOwogIGZpbmFsIFNlbmRQb3J0IHNlbmRQb3J0OwogIGZpbmFsIFN0cmluZyBuYW1lOwoKICBSdW5uaW5nSXNvbGF0ZSh0aGlzLnBvcnRJZCwgdGhpcy5zZW5kUG9ydCwgdGhpcy5uYW1lKTsKCiAgU3RyaW5nIGdldCBzZXJ2aWNlSWQgPT4gJ2lzb2xhdGVzLyRwb3J0SWQnOwoKICBAb3ZlcnJpZGUKICBGdXR1cmU8UmVzcG9uc2U+IHJvdXRlUmVxdWVzdChWTVNlcnZpY2Ugc2VydmljZSwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAvLyBTZW5kIG1lc3NhZ2UgdG8gaXNvbGF0ZS4KICAgIHJldHVybiBtZXNzYWdlLnNlbmRUb0lzb2xhdGUoc2VuZFBvcnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByb3V0ZVJlc3BvbnNlKE1lc3NhZ2UgbWVzc2FnZSkge30KfQoaAE5OPAEZATAUGxUBOQEuAQxGICwEAQwpAgEkZGFydDpfdm1zZXJ2aWNlL3J1bm5pbmdfaXNvbGF0ZS5kYXJ0O29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi92bXNlcnZpY2UvcnVubmluZ19pc29sYXRlcy5kYXJ0nHcvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll92bXNlcnZpY2U7CgpjbGFzcyBSdW5uaW5nSXNvbGF0ZXMgaW1wbGVtZW50cyBNZXNzYWdlUm91dGVyIHsKICBmaW5hbCBNYXA8aW50LCBSdW5uaW5nSXNvbGF0ZT4gaXNvbGF0ZXMgPSBuZXcgTWFwPGludCwgUnVubmluZ0lzb2xhdGU+KCk7CiAgaW50IF9yb290UG9ydElkOwoKICBSdW5uaW5nSXNvbGF0ZXMoKTsKCiAgdm9pZCBpc29sYXRlU3RhcnR1cChpbnQgcG9ydElkLCBTZW5kUG9ydCBzcCwgU3RyaW5nIG5hbWUpIHsKICAgIGlmIChfcm9vdFBvcnRJZCA9PSBudWxsKSB7CiAgICAgIF9yb290UG9ydElkID0gcG9ydElkOwogICAgfQogICAgdmFyIHJpID0gbmV3IFJ1bm5pbmdJc29sYXRlKHBvcnRJZCwgc3AsIG5hbWUpOwogICAgaXNvbGF0ZXNbcG9ydElkXSA9IHJpOwogIH0KCiAgdm9pZCBpc29sYXRlU2h1dGRvd24oaW50IHBvcnRJZCwgU2VuZFBvcnQgc3ApIHsKICAgIGlmIChfcm9vdFBvcnRJZCA9PSBwb3J0SWQpIHsKICAgICAgX3Jvb3RQb3J0SWQgPSBudWxsOwogICAgfQogICAgaXNvbGF0ZXMucmVtb3ZlKHBvcnRJZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBGdXR1cmU8UmVzcG9uc2U+IHJvdXRlUmVxdWVzdChWTVNlcnZpY2Ugc2VydmljZSwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBTdHJpbmcgaXNvbGF0ZVBhcmFtID0gbWVzc2FnZS5wYXJhbXNbJ2lzb2xhdGVJZCddOwogICAgaW50IGlzb2xhdGVJZDsKICAgIGlmICghaXNvbGF0ZVBhcmFtLnN0YXJ0c1dpdGgoJ2lzb2xhdGVzLycpKSB7CiAgICAgIG1lc3NhZ2Uuc2V0RXJyb3JSZXNwb25zZSgKICAgICAgICAgIGtJbnZhbGlkUGFyYW1zLCAiaW52YWxpZCAnaXNvbGF0ZUlkJyBwYXJhbWV0ZXI6ICRpc29sYXRlUGFyYW0iKTsKICAgICAgcmV0dXJuIG1lc3NhZ2UucmVzcG9uc2U7CiAgICB9CiAgICBpc29sYXRlUGFyYW0gPSBpc29sYXRlUGFyYW0uc3Vic3RyaW5nKCdpc29sYXRlcy8nLmxlbmd0aCk7CiAgICBpZiAoaXNvbGF0ZVBhcmFtID09ICdyb290JykgewogICAgICBpc29sYXRlSWQgPSBfcm9vdFBvcnRJZDsKICAgIH0gZWxzZSB7CiAgICAgIHRyeSB7CiAgICAgICAgaXNvbGF0ZUlkID0gaW50LnBhcnNlKGlzb2xhdGVQYXJhbSk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBtZXNzYWdlLnNldEVycm9yUmVzcG9uc2UoCiAgICAgICAgICAgIGtJbnZhbGlkUGFyYW1zLCAiaW52YWxpZCAnaXNvbGF0ZUlkJyBwYXJhbWV0ZXI6ICRpc29sYXRlUGFyYW0iKTsKICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXNwb25zZTsKICAgICAgfQogICAgfQogICAgdmFyIGlzb2xhdGUgPSBpc29sYXRlc1tpc29sYXRlSWRdOwogICAgaWYgKGlzb2xhdGUgPT0gbnVsbCkgewogICAgICAvLyBUaGVyZSBpcyBzb21lIGNoYW5jZSB0aGF0IHRoaXMgaXNvbGF0ZSBtYXkgaGF2ZSBsaXZlZCBiZWZvcmUsCiAgICAgIC8vIHNvIHJldHVybiBhIHNlbnRpbmVsIHJhdGhlciB0aGFuIGFuIGVycm9yLgogICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICd0eXBlJzogJ1NlbnRpbmVsJywKICAgICAgICAna2luZCc6ICdDb2xsZWN0ZWQnLAogICAgICAgICd2YWx1ZUFzU3RyaW5nJzogJzxjb2xsZWN0ZWQ+JywKICAgICAgfTsKICAgICAgbWVzc2FnZS5zZXRSZXNwb25zZShlbmNvZGVSZXN1bHQobWVzc2FnZSwgcmVzdWx0KSk7CiAgICAgIHJldHVybiBtZXNzYWdlLnJlc3BvbnNlOwogICAgfQoKICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PSAnZXZhbHVhdGVJbkZyYW1lJyB8fCBtZXNzYWdlLm1ldGhvZCA9PSAnZXZhbHVhdGUnKSB7CiAgICAgIHJldHVybiBuZXcgX0V2YWx1YXRvcihtZXNzYWdlLCBpc29sYXRlLCBzZXJ2aWNlKS5ydW4oKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBpc29sYXRlLnJvdXRlUmVxdWVzdChzZXJ2aWNlLCBtZXNzYWdlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcm91dGVSZXNwb25zZShNZXNzYWdlIG1lc3NhZ2UpIHt9Cn0KCi8vLyBDbGFzcyB0aGF0IGtub3dzIGhvdyB0byBvcmNoZXN0cmF0ZSBleHByZXNzaW9uIGV2YWx1YXRpb24gaW4gZGFydDIgd29ybGQuCmNsYXNzIF9FdmFsdWF0b3IgewogIF9FdmFsdWF0b3IodGhpcy5fbWVzc2FnZSwgdGhpcy5faXNvbGF0ZSwgdGhpcy5fc2VydmljZSk7CgogIEZ1dHVyZTxSZXNwb25zZT4gcnVuKCkgYXN5bmMgewogICAgUmVzcG9uc2UgYnVpbGRTY29wZVJlc3BvbnNlID0gYXdhaXQgX2J1aWxkU2NvcGUoKTsKICAgIE1hcDxTdHJpbmcsIGR5bmFtaWM+IHJlc3BvbnNlSnNvbiA9IGJ1aWxkU2NvcGVSZXNwb25zZS5kZWNvZGVKc29uKCk7CgogICAgaWYgKHJlc3BvbnNlSnNvbi5jb250YWluc0tleSgnZXJyb3InKSkgewogICAgICByZXR1cm4gbmV3IFJlc3BvbnNlLmZyb20oZW5jb2RlQ29tcGlsYXRpb25FcnJvcigKICAgICAgICAgIF9tZXNzYWdlLCByZXNwb25zZUpzb25bJ2Vycm9yJ11bJ2RhdGEnXVsnZGV0YWlscyddKSk7CiAgICB9CgogICAgU3RyaW5nIGtlcm5lbEJhc2U2NDsKICAgIHRyeSB7CiAgICAgIGtlcm5lbEJhc2U2NCA9IGF3YWl0IF9jb21waWxlRXhwcmVzc2lvbihyZXNwb25zZUpzb25bJ3Jlc3VsdCddKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZS5mcm9tKGVuY29kZUNvbXBpbGF0aW9uRXJyb3IoX21lc3NhZ2UsIGUudG9TdHJpbmcoKSkpOwogICAgfQogICAgcmV0dXJuIF9ldmFsdWF0ZUNvbXBpbGVkRXhwcmVzc2lvbihrZXJuZWxCYXNlNjQpOwogIH0KCiAgTWVzc2FnZSBfbWVzc2FnZTsKICBSdW5uaW5nSXNvbGF0ZSBfaXNvbGF0ZTsKICBWTVNlcnZpY2UgX3NlcnZpY2U7CgogIEZ1dHVyZTxSZXNwb25zZT4gX2J1aWxkU2NvcGUoKSB7CiAgICBNYXA8U3RyaW5nLCBkeW5hbWljPiBwYXJhbXMgPSBfc2V0dXBQYXJhbXMoKTsKICAgIHBhcmFtc1snaXNvbGF0ZUlkJ10gPSBfbWVzc2FnZS5wYXJhbXNbJ2lzb2xhdGVJZCddOwogICAgTWFwIGJ1aWxkU2NvcGVQYXJhbXMgPSB7CiAgICAgICdtZXRob2QnOiAnX2J1aWxkRXhwcmVzc2lvbkV2YWx1YXRpb25TY29wZScsCiAgICAgICdpZCc6IF9tZXNzYWdlLnNlcmlhbCwKICAgICAgJ3BhcmFtcyc6IHBhcmFtcywKICAgIH07CiAgICBpZiAoX21lc3NhZ2UucGFyYW1zWydzY29wZSddICE9IG51bGwpIHsKICAgICAgYnVpbGRTY29wZVBhcmFtc1sncGFyYW1zJ11bJ3Njb3BlJ10gPSBfbWVzc2FnZS5wYXJhbXNbJ3Njb3BlJ107CiAgICB9CiAgICB2YXIgYnVpbGRTY29wZSA9CiAgICAgICAgbmV3IE1lc3NhZ2UuX2Zyb21Kc29uUnBjUmVxdWVzdChfbWVzc2FnZS5jbGllbnQsIGJ1aWxkU2NvcGVQYXJhbXMpOwoKICAgIC8vIERlY29kZSB0aGUgSlNPTiBhbmQgYW5kIGluc2VydCBpdCBpbnRvIHRoZSBtYXAuIFRoZSBtYXAga2V5CiAgICAvLyBpcyB0aGUgcmVxdWVzdCBVcmkuCiAgICByZXR1cm4gX2lzb2xhdGUucm91dGVSZXF1ZXN0KF9zZXJ2aWNlLCBidWlsZFNjb3BlKTsKICB9CgogIEZ1dHVyZTxTdHJpbmc+IF9jb21waWxlRXhwcmVzc2lvbigKICAgICAgTWFwPFN0cmluZywgZHluYW1pYz4gYnVpbGRTY29wZVJlc3BvbnNlUmVzdWx0KSB7CiAgICBDbGllbnQgZXh0ZXJuYWxDbGllbnQgPQogICAgICAgIF9zZXJ2aWNlLl9maW5kRmlyc3RDbGllbnRUaGF0SGFuZGxlc1NlcnZpY2UoJ2NvbXBpbGVFeHByZXNzaW9uJyk7CgogICAgTWFwIGNvbXBpbGVQYXJhbXMgPSB7CiAgICAgICdpc29sYXRlSWQnOiBfbWVzc2FnZS5wYXJhbXNbJ2lzb2xhdGVJZCddLAogICAgICAnZXhwcmVzc2lvbic6IF9tZXNzYWdlLnBhcmFtc1snZXhwcmVzc2lvbiddLAogICAgICAnZGVmaW5pdGlvbnMnOiBidWlsZFNjb3BlUmVzcG9uc2VSZXN1bHRbJ3BhcmFtX25hbWVzJ10sCiAgICAgICd0eXBlRGVmaW5pdGlvbnMnOiBidWlsZFNjb3BlUmVzcG9uc2VSZXN1bHRbJ3R5cGVfcGFyYW1zX25hbWVzJ10sCiAgICAgICdsaWJyYXJ5VXJpJzogYnVpbGRTY29wZVJlc3BvbnNlUmVzdWx0WydsaWJyYXJ5VXJpJ10sCiAgICAgICdpc1N0YXRpYyc6IGJ1aWxkU2NvcGVSZXNwb25zZVJlc3VsdFsnaXNTdGF0aWMnXSwKICAgIH07CiAgICBkeW5hbWljIGtsYXNzID0gYnVpbGRTY29wZVJlc3BvbnNlUmVzdWx0WydrbGFzcyddOwogICAgaWYgKGtsYXNzICE9IG51bGwpIHsKICAgICAgY29tcGlsZVBhcmFtc1sna2xhc3MnXSA9IGtsYXNzOwogICAgfQogICAgaWYgKGV4dGVybmFsQ2xpZW50ICE9IG51bGwpIHsKICAgICAgdmFyIGNvbXBpbGVFeHByZXNzaW9uID0gbmV3IE1lc3NhZ2UuZm9yTWV0aG9kKCdjb21waWxlRXhwcmVzc2lvbicpOwogICAgICBjb21waWxlRXhwcmVzc2lvbi5jbGllbnQgPSBleHRlcm5hbENsaWVudDsKICAgICAgY29tcGlsZUV4cHJlc3Npb24ucGFyYW1zLmFkZEFsbChjb21waWxlUGFyYW1zKTsKCiAgICAgIGZpbmFsIGlkID0gX3NlcnZpY2UuX3NlcnZpY2VSZXF1ZXN0cy5uZXdJZCgpOwogICAgICBmaW5hbCBvbGRJZCA9IF9tZXNzYWdlLnNlcmlhbDsKICAgICAgZmluYWwgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxTdHJpbmc+KCk7CiAgICAgIGV4dGVybmFsQ2xpZW50LnNlcnZpY2VIYW5kbGVzW2lkXSA9IChNZXNzYWdlIG0pIHsKICAgICAgICBpZiAobSAhPSBudWxsKSB7CiAgICAgICAgICBjb21wbGV0ZXIuY29tcGxldGUoanNvbi5lbmNvZGUobS5mb3J3YXJkVG9Kc29uKHsnaWQnOiBvbGRJZH0pKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZShlbmNvZGVScGNFcnJvcihfbWVzc2FnZSwga1NlcnZpY2VEaXNhcHBlYXJlZCkpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgZXh0ZXJuYWxDbGllbnQucG9zdChuZXcgUmVzcG9uc2UuanNvbihjb21waWxlRXhwcmVzc2lvbgogICAgICAgICAgLmZvcndhcmRUb0pzb24oeydpZCc6IGlkLCAnbWV0aG9kJzogJ2NvbXBpbGVFeHByZXNzaW9uJ30pKSk7CiAgICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlCiAgICAgICAgICAudGhlbigoU3RyaW5nIHMpID0+IGpzb25EZWNvZGUocykpCiAgICAgICAgICAudGhlbigoZHluYW1pYyBqc29uKSB7CiAgICAgICAgTWFwPFN0cmluZywgZHluYW1pYz4ganNvbk1hcCA9IGpzb247CiAgICAgICAgaWYgKGpzb25NYXAuY29udGFpbnNLZXkoJ2Vycm9yJykpIHsKICAgICAgICAgIHRocm93IGpzb25NYXBbJ2Vycm9yJ107CiAgICAgICAgfQogICAgICAgIHJldHVybiBqc29uTWFwWydyZXN1bHQnXVsncmVzdWx0J11bJ2tlcm5lbEJ5dGVzJ107CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgLy8gZmFsbGJhY2sgdG8gY29tcGlsZSB1c2luZyBrZXJuZWwgc2VydmljZQogICAgICBNYXAgY29tcGlsZUV4cHJlc3Npb25QYXJhbXMgPSB7CiAgICAgICAgJ21ldGhvZCc6ICdfY29tcGlsZUV4cHJlc3Npb24nLAogICAgICAgICdpZCc6IF9tZXNzYWdlLnNlcmlhbCwKICAgICAgICAncGFyYW1zJzogY29tcGlsZVBhcmFtcywKICAgICAgfTsKICAgICAgdmFyIGNvbXBpbGVFeHByZXNzaW9uID0gbmV3IE1lc3NhZ2UuX2Zyb21Kc29uUnBjUmVxdWVzdCgKICAgICAgICAgIF9tZXNzYWdlLmNsaWVudCwgY29tcGlsZUV4cHJlc3Npb25QYXJhbXMpOwoKICAgICAgcmV0dXJuIF9pc29sYXRlCiAgICAgICAgICAucm91dGVSZXF1ZXN0KF9zZXJ2aWNlLCBjb21waWxlRXhwcmVzc2lvbikKICAgICAgICAgIC50aGVuKChSZXNwb25zZSByZXNwb25zZSkgPT4gcmVzcG9uc2UuZGVjb2RlSnNvbigpKQogICAgICAgICAgLnRoZW4oKGR5bmFtaWMganNvbikgewogICAgICAgIGlmIChqc29uWydyZXN1bHQnXSAhPSBudWxsKSB7CiAgICAgICAgICByZXR1cm4ganNvblsncmVzdWx0J11bJ2tlcm5lbEJ5dGVzJ107CiAgICAgICAgfQogICAgICAgIHRocm93IGpzb25bJ2Vycm9yJ11bJ2RhdGEnXVsnZGV0YWlscyddOwogICAgICB9KTsKICAgIH0KICB9CgogIEZ1dHVyZTxSZXNwb25zZT4gX2V2YWx1YXRlQ29tcGlsZWRFeHByZXNzaW9uKFN0cmluZyBrZXJuZWxCYXNlNjQpIHsKICAgIGlmIChrZXJuZWxCYXNlNjQuaXNOb3RFbXB0eSkgewogICAgICBNYXA8U3RyaW5nLCBkeW5hbWljPiBwYXJhbXMgPSBfc2V0dXBQYXJhbXMoKTsKICAgICAgcGFyYW1zWydpc29sYXRlSWQnXSA9IF9tZXNzYWdlLnBhcmFtc1snaXNvbGF0ZUlkJ107CiAgICAgIHBhcmFtc1sna2VybmVsQnl0ZXMnXSA9IGtlcm5lbEJhc2U2NDsKICAgICAgcGFyYW1zWydkaXNhYmxlQnJlYWtwb2ludHMnXSA9IF9tZXNzYWdlLnBhcmFtc1snZGlzYWJsZUJyZWFrcG9pbnRzJ107CiAgICAgIE1hcCBydW5QYXJhbXMgPSB7CiAgICAgICAgJ21ldGhvZCc6ICdfZXZhbHVhdGVDb21waWxlZEV4cHJlc3Npb24nLAogICAgICAgICdpZCc6IF9tZXNzYWdlLnNlcmlhbCwKICAgICAgICAncGFyYW1zJzogcGFyYW1zLAogICAgICB9OwogICAgICBpZiAoX21lc3NhZ2UucGFyYW1zWydzY29wZSddICE9IG51bGwpIHsKICAgICAgICBydW5QYXJhbXNbJ3BhcmFtcyddWydzY29wZSddID0gX21lc3NhZ2UucGFyYW1zWydzY29wZSddOwogICAgICB9CiAgICAgIHZhciBydW5FeHByZXNzaW9uID0KICAgICAgICAgIG5ldyBNZXNzYWdlLl9mcm9tSnNvblJwY1JlcXVlc3QoX21lc3NhZ2UuY2xpZW50LCBydW5QYXJhbXMpOwogICAgICByZXR1cm4gX2lzb2xhdGUucm91dGVSZXF1ZXN0KF9zZXJ2aWNlLCBydW5FeHByZXNzaW9uKTsgLy8gX21lc3NhZ2UKICAgIH0gZWxzZSB7CiAgICAgIC8vIGVtcHR5IGtlcm5lbCBpbmRpY2F0ZXMgZGFydDEgbW9kZQogICAgICByZXR1cm4gX2lzb2xhdGUucm91dGVSZXF1ZXN0KF9zZXJ2aWNlLCBfbWVzc2FnZSk7CiAgICB9CiAgfQoKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBfc2V0dXBQYXJhbXMoKSB7CiAgICBpZiAoX21lc3NhZ2UubWV0aG9kID09ICdldmFsdWF0ZUluRnJhbWUnKSB7CiAgICAgIHJldHVybiA8U3RyaW5nLCBkeW5hbWljPnsnZnJhbWVJbmRleCc6IF9tZXNzYWdlLnBhcmFtc1snZnJhbWVJbmRleCddfTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChfbWVzc2FnZS5tZXRob2QgPT0gJ2V2YWx1YXRlJyk7CiAgICAgIHJldHVybiA8U3RyaW5nLCBkeW5hbWljPnsndGFyZ2V0SWQnOiBfbWVzc2FnZS5wYXJhbXNbJ3RhcmdldElkJ119OwogICAgfQogIH0KfQqA2ABOTjwBGQExTBMBFQE+HxwGMxsEATIhGgYdBAEMRjcTMSBLHwY/Ih8NDC0UIk0hCAYnG0c0FRwdKAk6HwYBTz4NNQYEAQwpAgFOEzsBITdJAS03QAYBGQpHElAGNgQBFBsWASMyOB0zHRgHLEYGFUwBQxs4BAElNxxKARoxMz5IPDgHNxkmBiJKMTYBNCUxOBlLEU0KCT5HHi0hLSwiCjsKDTImKB8hCT81ARY1PiEmMAowCgYEAUYjNDosTBgxHxoJLkEIGkdJDSs4BgQBKDBNDS1JBgQCASVkYXJ0Ol92bXNlcnZpY2UvcnVubmluZ19pc29sYXRlcy5kYXJ0Mm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi92bXNlcnZpY2UvbWVzc2FnZS5kYXJ0nuovLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll92bXNlcnZpY2U7CgplbnVtIE1lc3NhZ2VUeXBlIHsgUmVxdWVzdCwgTm90aWZpY2F0aW9uLCBSZXNwb25zZSB9CgpjbGFzcyBNZXNzYWdlIHsKICBmaW5hbCBDb21wbGV0ZXI8UmVzcG9uc2U+IF9jb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFJlc3BvbnNlPi5zeW5jKCk7CiAgYm9vbCBnZXQgY29tcGxldGVkID0+IF9jb21wbGV0ZXIuaXNDb21wbGV0ZWQ7CgogIC8vLyBGdXR1cmUgb2YgcmVzcG9uc2UuCiAgRnV0dXJlPFJlc3BvbnNlPiBnZXQgcmVzcG9uc2UgPT4gX2NvbXBsZXRlci5mdXR1cmU7CiAgQ2xpZW50IGNsaWVudDsKCiAgLy8gSXMgYSBub3RpZmljYXRpb24gbWVzc2FnZSAobm8gc2VyaWFsKQogIGZpbmFsIE1lc3NhZ2VUeXBlIHR5cGU7CgogIC8vIENsaWVudC1zaWRlIGlkZW50aWZpZXIgZm9yIHRoaXMgbWVzc2FnZS4KICBmaW5hbCBzZXJpYWw7CgogIGZpbmFsIFN0cmluZyBtZXRob2Q7CgogIGZpbmFsIE1hcCBwYXJhbXMgPSBuZXcgTWFwKCk7CiAgZmluYWwgTWFwIHJlc3VsdCA9IG5ldyBNYXAoKTsKICBmaW5hbCBNYXAgZXJyb3IgPSBuZXcgTWFwKCk7CgogIGZhY3RvcnkgTWVzc2FnZS5mcm9tSnNvblJwYyhDbGllbnQgY2xpZW50LCBNYXAgbWFwKSB7CiAgICBpZiAobWFwLmNvbnRhaW5zS2V5KCdpZCcpKSB7CiAgICAgIGZpbmFsIGlkID0gbWFwWydpZCddOwogICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZCBpcyEgbnVtICYmIGlkIGlzISBTdHJpbmcpIHsKICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCciaWQiIG11c3QgYmUgYSBudW1iZXIsIHN0cmluZywgb3IgbnVsbC4nKTsKICAgICAgfQogICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KCdtZXRob2QnKSkgewogICAgICAgIHJldHVybiBuZXcgTWVzc2FnZS5fZnJvbUpzb25ScGNSZXF1ZXN0KGNsaWVudCwgbWFwKTsKICAgICAgfQogICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KCdyZXN1bHQnKSkgewogICAgICAgIHJldHVybiBuZXcgTWVzc2FnZS5fZnJvbUpzb25ScGNSZXN1bHQoY2xpZW50LCBtYXApOwogICAgICB9CiAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoJ2Vycm9yJykpIHsKICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2UuX2Zyb21Kc29uUnBjRXJyb3IoY2xpZW50LCBtYXApOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG1hcC5jb250YWluc0tleSgnbWV0aG9kJykpIHsKICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlLl9mcm9tSnNvblJwY05vdGlmaWNhdGlvbihjbGllbnQsIG1hcCk7CiAgICB9CiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdJbnZhbGlkIG1lc3NhZ2UgZm9ybWF0Jyk7CiAgfQoKICAvLyBodHRwOi8vd3d3Lmpzb25ycGMub3JnL3NwZWNpZmljYXRpb24jcmVxdWVzdF9vYmplY3QKICBNZXNzYWdlLl9mcm9tSnNvblJwY1JlcXVlc3QoQ2xpZW50IGNsaWVudCwgTWFwIG1hcCkKICAgICAgOiBjbGllbnQgPSBjbGllbnQsCiAgICAgICAgdHlwZSA9IE1lc3NhZ2VUeXBlLlJlcXVlc3QsCiAgICAgICAgc2VyaWFsID0gbWFwWydpZCddLAogICAgICAgIG1ldGhvZCA9IG1hcFsnbWV0aG9kJ10gewogICAgaWYgKG1hcFsncGFyYW1zJ10gIT0gbnVsbCkgewogICAgICBwYXJhbXMuYWRkQWxsKG1hcFsncGFyYW1zJ10pOwogICAgfQogIH0KCiAgLy8gaHR0cDovL3d3dy5qc29ucnBjLm9yZy9zcGVjaWZpY2F0aW9uI25vdGlmaWNhdGlvbgogIE1lc3NhZ2UuX2Zyb21Kc29uUnBjTm90aWZpY2F0aW9uKENsaWVudCBjbGllbnQsIE1hcCBtYXApCiAgICAgIDogY2xpZW50ID0gY2xpZW50LAogICAgICAgIHR5cGUgPSBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24sCiAgICAgICAgbWV0aG9kID0gbWFwWydtZXRob2QnXSwKICAgICAgICBzZXJpYWwgPSBudWxsIHsKICAgIGlmIChtYXBbJ3BhcmFtcyddICE9IG51bGwpIHsKICAgICAgcGFyYW1zLmFkZEFsbChtYXBbJ3BhcmFtcyddKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly93d3cuanNvbnJwYy5vcmcvc3BlY2lmaWNhdGlvbiNyZXNwb25zZV9vYmplY3QKICBNZXNzYWdlLl9mcm9tSnNvblJwY1Jlc3VsdChDbGllbnQgY2xpZW50LCBNYXAgbWFwKQogICAgICA6IGNsaWVudCA9IGNsaWVudCwKICAgICAgICB0eXBlID0gTWVzc2FnZVR5cGUuUmVzcG9uc2UsCiAgICAgICAgc2VyaWFsID0gbWFwWydpZCddLAogICAgICAgIG1ldGhvZCA9IG51bGwgewogICAgcmVzdWx0LmFkZEFsbChtYXBbJ3Jlc3VsdCddKTsKICB9CgogIC8vIGh0dHA6Ly93d3cuanNvbnJwYy5vcmcvc3BlY2lmaWNhdGlvbiNyZXNwb25zZV9vYmplY3QKICBNZXNzYWdlLl9mcm9tSnNvblJwY0Vycm9yKENsaWVudCBjbGllbnQsIE1hcCBtYXApCiAgICAgIDogY2xpZW50ID0gY2xpZW50LAogICAgICAgIHR5cGUgPSBNZXNzYWdlVHlwZS5SZXNwb25zZSwKICAgICAgICBzZXJpYWwgPSBtYXBbJ2lkJ10sCiAgICAgICAgbWV0aG9kID0gbnVsbCB7CiAgICBlcnJvci5hZGRBbGwobWFwWydlcnJvciddKTsKICB9CgogIHN0YXRpYyBTdHJpbmcgX21ldGhvZE5hbWVGcm9tVXJpKFVyaSB1cmkpIHsKICAgIGlmICh1cmkgPT0gbnVsbCkgewogICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBpZiAodXJpLnBhdGhTZWdtZW50cy5sZW5ndGggPT0gMCkgewogICAgICByZXR1cm4gJyc7CiAgICB9CiAgICByZXR1cm4gdXJpLnBhdGhTZWdtZW50c1swXTsKICB9CgogIE1lc3NhZ2UuZm9yTWV0aG9kKFN0cmluZyBtZXRob2QpCiAgICAgIDogY2xpZW50ID0gbnVsbCwKICAgICAgICBtZXRob2QgPSBtZXRob2QsCiAgICAgICAgdHlwZSA9IE1lc3NhZ2VUeXBlLlJlcXVlc3QsCiAgICAgICAgc2VyaWFsID0gJyc7CgogIE1lc3NhZ2UuZnJvbVVyaSh0aGlzLmNsaWVudCwgVXJpIHVyaSkKICAgICAgOiB0eXBlID0gTWVzc2FnZVR5cGUuUmVxdWVzdCwKICAgICAgICBzZXJpYWwgPSAnJywKICAgICAgICBtZXRob2QgPSBfbWV0aG9kTmFtZUZyb21VcmkodXJpKSB7CiAgICBwYXJhbXMuYWRkQWxsKHVyaS5xdWVyeVBhcmFtZXRlcnMpOwogIH0KCiAgTWVzc2FnZS5mb3JJc29sYXRlKHRoaXMuY2xpZW50LCBVcmkgdXJpLCBSdW5uaW5nSXNvbGF0ZSBpc29sYXRlKQogICAgICA6IHR5cGUgPSBNZXNzYWdlVHlwZS5SZXF1ZXN0LAogICAgICAgIHNlcmlhbCA9ICcnLAogICAgICAgIG1ldGhvZCA9IF9tZXRob2ROYW1lRnJvbVVyaSh1cmkpIHsKICAgIHBhcmFtcy5hZGRBbGwodXJpLnF1ZXJ5UGFyYW1ldGVycyk7CiAgICBwYXJhbXNbJ2lzb2xhdGVJZCddID0gaXNvbGF0ZS5zZXJ2aWNlSWQ7CiAgfQoKICBVcmkgdG9VcmkoKSB7CiAgICByZXR1cm4gbmV3IFVyaShwYXRoOiBtZXRob2QsIHF1ZXJ5UGFyYW1ldGVyczogcGFyYW1zKTsKICB9CgogIGR5bmFtaWMgdG9Kc29uKCkgewogICAgdGhyb3cgJ3Vuc3VwcG9ydGVkJzsKICB9CgogIGR5bmFtaWMgZm9yd2FyZFRvSnNvbihbTWFwIG92ZXJsb2Fkc10pIHsKICAgIE1hcDxkeW5hbWljLCBkeW5hbWljPiBqc29uID0geydqc29ucnBjJzogJzIuMCcsICdpZCc6IHNlcmlhbH07CiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgY2FzZSBNZXNzYWdlVHlwZS5SZXF1ZXN0OgogICAgICBjYXNlIE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbjoKICAgICAgICBqc29uWydtZXRob2QnXSA9IG1ldGhvZDsKICAgICAgICBpZiAocGFyYW1zLmlzTm90RW1wdHkpIHsKICAgICAgICAgIGpzb25bJ3BhcmFtcyddID0gcGFyYW1zOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBNZXNzYWdlVHlwZS5SZXNwb25zZToKICAgICAgICBpZiAocmVzdWx0LmlzTm90RW1wdHkpIHsKICAgICAgICAgIGpzb25bJ3Jlc3VsdCddID0gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3IuaXNOb3RFbXB0eSkgewogICAgICAgICAganNvblsnZXJyb3InXSA9IGVycm9yOwogICAgICAgIH0KICAgIH0KICAgIGlmIChvdmVybG9hZHMgIT0gbnVsbCkgewogICAgICBqc29uLmFkZEFsbChvdmVybG9hZHMpOwogICAgfQogICAgcmV0dXJuIGpzb247CiAgfQoKICAvLyBDYWxscyB0b1N0cmluZyBvbiBhbGwgbm9uLVN0cmluZyBlbGVtZW50cyBvZiBbbGlzdF0uIFdlIGRvIHRoaXMgc28gYWxsCiAgLy8gZWxlbWVudHMgaW4gdGhlIGxpc3QgYXJlIHN0cmluZ3MsIG1ha2luZyBjb25zdW1wdGlvbiBieSBDKysgc2ltcGxlci4KICAvLyBUaGlzIGhhcyBhIHNpZGUgZWZmZWN0IHRoYXQgYm9vbGVhbiBsaXRlcmFsIHZhbHVlcyBsaWtlIHRydWUgYmVjb21lICd0cnVlJwogIC8vIGFuZCB0aHVzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIHN0cmluZyBsaXRlcmFsICd0cnVlJy4KICBMaXN0PFN0cmluZz4gX21ha2VBbGxTdHJpbmcoTGlzdCBsaXN0KSB7CiAgICBpZiAobGlzdCA9PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdmFyIG5ld19saXN0ID0gbmV3IExpc3Q8U3RyaW5nPihsaXN0Lmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgbmV3X2xpc3RbaV0gPSBsaXN0W2ldLnRvU3RyaW5nKCk7CiAgICB9CiAgICByZXR1cm4gbmV3X2xpc3Q7CiAgfQoKICBGdXR1cmU8UmVzcG9uc2U+IHNlbmRUb0lzb2xhdGUoU2VuZFBvcnQgc2VuZFBvcnQpIHsKICAgIGZpbmFsIHJlY2VpdmVQb3J0ID0gbmV3IFJhd1JlY2VpdmVQb3J0KCk7CiAgICByZWNlaXZlUG9ydC5oYW5kbGVyID0gKHZhbHVlKSB7CiAgICAgIHJlY2VpdmVQb3J0LmNsb3NlKCk7CiAgICAgIF9zZXRSZXNwb25zZUZyb21Qb3J0KHZhbHVlKTsKICAgIH07CiAgICB2YXIga2V5cyA9IF9tYWtlQWxsU3RyaW5nKHBhcmFtcy5rZXlzLnRvTGlzdChncm93YWJsZTogZmFsc2UpKTsKICAgIHZhciB2YWx1ZXMgPSBfbWFrZUFsbFN0cmluZyhwYXJhbXMudmFsdWVzLnRvTGlzdChncm93YWJsZTogZmFsc2UpKTsKICAgIHZhciByZXF1ZXN0ID0gbmV3IExpc3QoNikKICAgICAgLi5bMF0gPSAwIC8vIE1ha2Ugcm9vbSBmb3IgT09CIG1lc3NhZ2UgdHlwZS4KICAgICAgLi5bMV0gPSByZWNlaXZlUG9ydC5zZW5kUG9ydAogICAgICAuLlsyXSA9IHNlcmlhbAogICAgICAuLlszXSA9IG1ldGhvZAogICAgICAuLls0XSA9IGtleXMKICAgICAgLi5bNV0gPSB2YWx1ZXM7CiAgICBpZiAoIXNlbmRJc29sYXRlU2VydmljZU1lc3NhZ2Uoc2VuZFBvcnQsIHJlcXVlc3QpKSB7CiAgICAgIHJlY2VpdmVQb3J0LmNsb3NlKCk7CiAgICAgIF9jb21wbGV0ZXIuY29tcGxldGUobmV3IFJlc3BvbnNlLmludGVybmFsRXJyb3IoCiAgICAgICAgICAnY291bGQgbm90IHNlbmQgbWVzc2FnZSBbJHtzZXJpYWx9XSB0byBpc29sYXRlJykpOwogICAgfQogICAgcmV0dXJuIF9jb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgLy8gV2UgY3VycmVudGx5IHN1cHBvcnQgdHdvIHdheXMgb2YgcGFzc2luZyBwYXJhbWV0ZXJzIGZyb20gRGFydCBjb2RlIHRvIEMKICAvLyBjb2RlLiBUaGUgb3JpZ2luYWwgd2F5IGFsd2F5cyBjb252ZXJ0cyB0aGUgcGFyYW1ldGVycyB0byBzdHJpbmdzIGJlZm9yZQogIC8vIHBhc3NpbmcgdGhlbSBvdmVyLiBPdXIgZ29hbCBpcyB0byBjb252ZXJ0IGFsbCBDIGhhbmRsZXJzIHRvIHRha2UgdGhlCiAgLy8gcGFyYW1ldGVycyBhcyBEYXJ0IG9iamVjdHMgYnV0IHVudGlsIHRoZSBjb252ZXJzaW9uIGlzIGNvbXBsZXRlLCB3ZQogIC8vIG1haW50YWluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBtZXRob2RzIGJlbG93LgogIGJvb2wgX21ldGhvZE5lZWRzT2JqZWN0UGFyYW1ldGVycyhTdHJpbmcgbWV0aG9kKSB7CiAgICBzd2l0Y2ggKG1ldGhvZCkgewogICAgICBjYXNlICdfbGlzdERldkZTJzoKICAgICAgY2FzZSAnX2xpc3REZXZGU0ZpbGVzJzoKICAgICAgY2FzZSAnX2NyZWF0ZURldkZTJzoKICAgICAgY2FzZSAnX2RlbGV0ZURldkZTJzoKICAgICAgY2FzZSAnX3dyaXRlRGV2RlNGaWxlJzoKICAgICAgY2FzZSAnX3dyaXRlRGV2RlNGaWxlcyc6CiAgICAgIGNhc2UgJ19yZWFkRGV2RlNGaWxlJzoKICAgICAgY2FzZSAnX3NwYXduVXJpJzoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBGdXR1cmU8UmVzcG9uc2U+IHNlbmRUb1ZNKCkgewogICAgZmluYWwgcmVjZWl2ZVBvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoKTsKICAgIHJlY2VpdmVQb3J0LmhhbmRsZXIgPSAodmFsdWUpIHsKICAgICAgcmVjZWl2ZVBvcnQuY2xvc2UoKTsKICAgICAgX3NldFJlc3BvbnNlRnJvbVBvcnQodmFsdWUpOwogICAgfTsKICAgIHZhciBrZXlzID0gcGFyYW1zLmtleXMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICB2YXIgdmFsdWVzID0gcGFyYW1zLnZhbHVlcy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgIGlmICghX21ldGhvZE5lZWRzT2JqZWN0UGFyYW1ldGVycyhtZXRob2QpKSB7CiAgICAgIGtleXMgPSBfbWFrZUFsbFN0cmluZyhrZXlzKTsKICAgICAgdmFsdWVzID0gX21ha2VBbGxTdHJpbmcodmFsdWVzKTsKICAgIH0KCiAgICBmaW5hbCByZXF1ZXN0ID0gbmV3IExpc3QoNikKICAgICAgLi5bMF0gPSAwIC8vIE1ha2Ugcm9vbSBmb3IgT09CIG1lc3NhZ2UgdHlwZS4KICAgICAgLi5bMV0gPSByZWNlaXZlUG9ydC5zZW5kUG9ydAogICAgICAuLlsyXSA9IHNlcmlhbAogICAgICAuLlszXSA9IG1ldGhvZAogICAgICAuLls0XSA9IGtleXMKICAgICAgLi5bNV0gPSB2YWx1ZXM7CgogICAgaWYgKF9tZXRob2ROZWVkc09iamVjdFBhcmFtZXRlcnMobWV0aG9kKSkgewogICAgICAvLyBXZSB1c2UgYSBkaWZmZXJlbnQgbWV0aG9kIGludm9jYXRpb24gcGF0aCBoZXJlLgogICAgICBzZW5kT2JqZWN0Um9vdFNlcnZpY2VNZXNzYWdlKHJlcXVlc3QpOwogICAgfSBlbHNlIHsKICAgICAgc2VuZFJvb3RTZXJ2aWNlTWVzc2FnZShyZXF1ZXN0KTsKICAgIH0KCiAgICByZXR1cm4gX2NvbXBsZXRlci5mdXR1cmU7CiAgfQoKICB2b2lkIF9zZXRSZXNwb25zZUZyb21Qb3J0KGR5bmFtaWMgcmVzcG9uc2UpIHsKICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7CiAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGhhdmUgYSBudWxsIHJlc3BvbnNlIGZvciBOb3RpZmljYXRpb25zLgogICAgICBhc3NlcnQodHlwZSA9PSBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24pOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIF9jb21wbGV0ZXIuY29tcGxldGUoUmVzcG9uc2UuZnJvbShyZXNwb25zZSkpOwogIH0KCiAgdm9pZCBzZXRSZXNwb25zZShTdHJpbmcgcmVzcG9uc2UpIHsKICAgIF9jb21wbGV0ZXIuY29tcGxldGUobmV3IFJlc3BvbnNlKFJlc3BvbnNlUGF5bG9hZEtpbmQuU3RyaW5nLCByZXNwb25zZSkpOwogIH0KCiAgdm9pZCBzZXRFcnJvclJlc3BvbnNlKGludCBjb2RlLCBTdHJpbmcgZGV0YWlscykgewogICAgc2V0UmVzcG9uc2UoZW5jb2RlUnBjRXJyb3IodGhpcywgY29kZSwgZGV0YWlsczogJyRtZXRob2Q6ICRkZXRhaWxzJykpOwogIH0KfQoKYm9vbCBzZW5kSXNvbGF0ZVNlcnZpY2VNZXNzYWdlKFNlbmRQb3J0IHNwLCBMaXN0IG0pCiAgICBuYXRpdmUgIlZNU2VydmljZV9TZW5kSXNvbGF0ZVNlcnZpY2VNZXNzYWdlIjsKCnZvaWQgc2VuZFJvb3RTZXJ2aWNlTWVzc2FnZShMaXN0IG0pIG5hdGl2ZSAiVk1TZXJ2aWNlX1NlbmRSb290U2VydmljZU1lc3NhZ2UiOwoKdm9pZCBzZW5kT2JqZWN0Um9vdFNlcnZpY2VNZXNzYWdlKExpc3QgbSkKICAgIG5hdGl2ZSAiVk1TZXJ2aWNlX1NlbmRPYmplY3RSb290U2VydmljZU1lc3NhZ2UiOwqBDQBOTjwBGQE1ARBJMAEaNhEBKxoBLhABFwEgIB8BOCEcN0gIJz0IJzwIJjsILEAGMwQBOTYZJBwhISQGBAE3OxkpIBghJAYEATo1GSUcGCIEATo0GSUcGCAEAS4XEQYoEQYgBAEjFxkkFQEoJBUrKAQBQyQVKygtBAEQOwQBFRkEAStDFCAlISEjCg8hISMKICEKBh0eBhEEAUxKUEArGBMGMiwoBhUEATYuJBsjB0RIHjMjFRUTFjkbNj0GHgQBTU1KSTM1FhkeGxseHx0YFQ8WBgQBIC4kGyMHNDgxIycGASAzIxUVExYBMDktDScGAR4EATAcQDATBjIEASZNBAE0SwQCATQyAU8BKjUBHGRhcnQ6X3Ztc2VydmljZS9tZXNzYWdlLmRhcnQ5b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL3Ztc2VydmljZS9tZXNzYWdlX3JvdXRlci5kYXJ0icAvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll92bXNlcnZpY2U7CgphYnN0cmFjdCBjbGFzcyBNZXNzYWdlUm91dGVyIHsKICBGdXR1cmU8UmVzcG9uc2U+IHJvdXRlUmVxdWVzdChWTVNlcnZpY2Ugc2VydmljZSwgTWVzc2FnZSBtZXNzYWdlKTsKICB2b2lkIHJvdXRlUmVzcG9uc2UoTWVzc2FnZSBtZXNzYWdlKTsKfQoKZW51bSBSZXNwb25zZVBheWxvYWRLaW5kIHsKICAvLy8gUmVzcG9uc2UgcGF5bG9hZCBpcyBhIERhcnQgc3RyaW5nLgogIFN0cmluZywKCiAgLy8vIFJlc3BvbnNlIHBheWxvYWQgaXMgYSBiaW5hcnkgKFVpbnQ4TGlzdCkuCiAgQmluYXJ5LAoKICAvLy8gUmVzcG9uc2UgcGF5bG9hZCBpcyBhIHN0cmluZyBlbmNvZGVkIGFzIFVURjggYnl0ZXMgKFVpbnQ4TGlzdCkuCiAgVXRmOFN0cmluZywKfQoKY2xhc3MgUmVzcG9uc2UgewogIGZpbmFsIFJlc3BvbnNlUGF5bG9hZEtpbmQga2luZDsKICBmaW5hbCBwYXlsb2FkOwoKICAvLy8gQ29uc3RydWN0IHJlc3BvbnNlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBbcGF5bG9hZF0gYW5kIFtraW5kXS4KICBSZXNwb25zZSh0aGlzLmtpbmQsIHRoaXMucGF5bG9hZCkgewogICAgYXNzZXJ0KCgpIHsKICAgICAgc3dpdGNoIChraW5kKSB7CiAgICAgICAgY2FzZSBSZXNwb25zZVBheWxvYWRLaW5kLlN0cmluZzoKICAgICAgICAgIHJldHVybiBwYXlsb2FkIGlzIFN0cmluZzsKICAgICAgICBjYXNlIFJlc3BvbnNlUGF5bG9hZEtpbmQuQmluYXJ5OgogICAgICAgIGNhc2UgUmVzcG9uc2VQYXlsb2FkS2luZC5VdGY4U3RyaW5nOgogICAgICAgICAgcmV0dXJuIHBheWxvYWQgaXMgVWludDhMaXN0OwogICAgICB9CiAgICB9KCkpOwogIH0KCiAgLy8vIENvbnN0cnVjdCBhIHN0cmluZyByZXNwb25zZSBmcm9tIHRoZSBnaXZlbiBbdmFsdWVdIGJ5IGVuY29kaW5nIGl0CiAgLy8vIGFzIEpTT04uCiAgUmVzcG9uc2UuanNvbihPYmplY3QgdmFsdWUpCiAgICAgIDogdGhpcyhSZXNwb25zZVBheWxvYWRLaW5kLlN0cmluZywganNvbi5lbmNvZGUodmFsdWUpKTsKCiAgZmFjdG9yeSBSZXNwb25zZS5pbnRlcm5hbEVycm9yKFN0cmluZyBtZXNzYWdlKSB7CiAgICByZXR1cm4gbmV3IFJlc3BvbnNlLmpzb24oewogICAgICAndHlwZSc6ICdTZXJ2aWNlRXJyb3InLAogICAgICAnaWQnOiAnJywKICAgICAgJ2tpbmQnOiAnSW50ZXJuYWxFcnJvcicsCiAgICAgICdtZXNzYWdlJzogbWVzc2FnZSwKICAgIH0pOwogIH0KCiAgLy8vIENvbnN0cnVjdCByZXNwb25zZSBmcm9tIHRoZSByZXNwb25zZSBbdmFsdWVdIHdoaWNoIGNhbiBiZSBlaXRoZXI6CiAgLy8vICAgICBTdHJpbmc6IGEgc3RyaW5nCiAgLy8vICAgICBCaW5hcnk6IGEgVWludDhMaXN0CiAgLy8vICAgICBVdGY4U3RyaW5nOiBhIHNpbmdsZSBlbGVtZW50IGxpc3QgY29udGFpbmluZyBVaW50OExpc3QKICBmYWN0b3J5IFJlc3BvbnNlLmZyb20oT2JqZWN0IHZhbHVlKSB7CiAgICBpZiAodmFsdWUgaXMgU3RyaW5nKSB7CiAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoUmVzcG9uc2VQYXlsb2FkS2luZC5TdHJpbmcsIHZhbHVlKTsKICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgVWludDhMaXN0KSB7CiAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoUmVzcG9uc2VQYXlsb2FkS2luZC5CaW5hcnksIHZhbHVlKTsKICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgTGlzdCkgewogICAgICBhc3NlcnQodmFsdWUubGVuZ3RoID09IDEpOwogICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKAogICAgICAgICAgUmVzcG9uc2VQYXlsb2FkS2luZC5VdGY4U3RyaW5nLCB2YWx1ZVswXSBhcyBVaW50OExpc3QpOwogICAgfSBlbHNlIGlmICh2YWx1ZSBpcyBSZXNwb25zZSkgewogICAgICByZXR1cm4gdmFsdWU7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAnVW5yZWNvZ25pemVkIHJlc3BvbnNlOiAke3ZhbHVlfSc7CiAgICB9CiAgfQoKICAvLy8gRGVjb2RlIEpTT04gY29udGFpbmVkIGluIHRoaXMgcmVzcG9uc2UuCiAgZHluYW1pYyBkZWNvZGVKc29uKCkgewogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgUmVzcG9uc2VQYXlsb2FkS2luZC5TdHJpbmc6CiAgICAgICAgcmV0dXJuIGpzb24uZGVjb2RlKHBheWxvYWQpOwogICAgICBjYXNlIFJlc3BvbnNlUGF5bG9hZEtpbmQuVXRmOFN0cmluZzoKICAgICAgICByZXR1cm4ganNvbi5mdXNlKHV0ZjgpLmRlY29kZShwYXlsb2FkKTsKICAgICAgY2FzZSBSZXNwb25zZVBheWxvYWRLaW5kLkJpbmFyeToKICAgICAgICB0aHJvdyAnQmluYXJ5IHJlc3BvbnNlcyBjYW4gbm90IGJlIGRlY29kZWQnOwogICAgfQogIH0KfQpXAE5OPAEZAR9FJwIBGykKATAKAUYOAgERIhEBRSYQFikkKS0nCAoEAUgPHj4BMx8eEB8aCAQBSBseQSgbPiU+ICEbQiQUDS8GBAEuGRQnJSswJzUGBAIBI2RhcnQ6X3Ztc2VydmljZS9tZXNzYWdlX3JvdXRlci5kYXJ0N29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi92bXNlcnZpY2UvbmFtZWRfbG9va3VwLmRhcnSG/S8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuX3Ztc2VydmljZTsKCi8vLyBTZXQgbGlrZSBjb250YWluZXMgd2hpY2ggYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgU3RyaW5nIGlkcyBmb3IgaXRzIGl0ZW1zCmNsYXNzIE5hbWVkTG9va3VwPEU+IGV4dGVuZHMgT2JqZWN0IHdpdGggSXRlcmFibGVNaXhpbjxFPiB7CiAgZmluYWwgSWRHZW5lcmF0b3IgX2dlbmVyYXRvcjsKICBmaW5hbCBNYXA8U3RyaW5nLCBFPiBfZWxlbWVudHMgPSBuZXcgTWFwPFN0cmluZywgRT4oKTsKICBmaW5hbCBNYXA8RSwgU3RyaW5nPiBfaWRzID0gbmV3IE1hcDxFLCBTdHJpbmc+KCk7CgogIE5hbWVkTG9va3VwKHtTdHJpbmcgcHJvbG9ndWUgPSAnJ30pCiAgICAgIDogX2dlbmVyYXRvciA9IG5ldyBJZEdlbmVyYXRvcihwcm9sb2d1ZTogcHJvbG9ndWUpOwoKICB2b2lkIGFkZChFIGUpIHsKICAgIGZpbmFsIGlkID0gX2dlbmVyYXRvci5uZXdJZCgpOwogICAgX2VsZW1lbnRzW2lkXSA9IGU7CiAgICBfaWRzW2VdID0gaWQ7CiAgfQoKICB2b2lkIHJlbW92ZShFIGUpIHsKICAgIGZpbmFsIGlkID0gX2lkcy5yZW1vdmUoZSk7CiAgICBfZWxlbWVudHMucmVtb3ZlKGlkKTsKICAgIF9nZW5lcmF0b3IucmVsZWFzZShpZCk7CiAgfQoKICBFIG9wZXJhdG9yIFtdKFN0cmluZyBpZCkgPT4gX2VsZW1lbnRzW2lkXTsKICBTdHJpbmcga2V5T2YoRSBlKSA9PiBfaWRzW2VdOwoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gX2lkcy5rZXlzLml0ZXJhdG9yOwp9CgovLy8gR2VuZXJhdG9yIGZvciB1bmlxdWUgaWRzIHdoaWNoIHJlY3ljbGVzIGV4cGlyZWQgb25lcwpjbGFzcyBJZEdlbmVyYXRvciB7CiAgLy8vIEZpeGVkIGluaXRpYWwgcGFydCBvZiB0aGUgaWQKICBmaW5hbCBTdHJpbmcgcHJvbG9ndWU7CiAgLy8gSWRzIGluIHVzZQogIGZpbmFsIFNldDxTdHJpbmc+IF91c2VkID0gbmV3IFNldDxTdHJpbmc+KCk7CgogIC8vLyBJZHMgdGhhdCBoYXMgYmVlbiByZWxlYXNlZCAodXNlIHRoZXNlIGJlZm9yZSBnZW5lcmF0ZSBuZXcgb25lcykKICBmaW5hbCBTZXQ8U3RyaW5nPiBfZnJlZSA9IG5ldyBTZXQ8U3RyaW5nPigpOwoKICAvLy8gTmV4dCBpZCB0byBnZW5lcmF0ZSBpZiBubyBvbmUgY2FuIGJlIHJlY3ljbGVkIChmaXJzdCB1c2UgX2ZyZWUpOwogIGludCBfbmV4dCA9IDA7CgogIElkR2VuZXJhdG9yKHt0aGlzLnByb2xvZ3VlID0gJyd9KTsKCiAgLy8vIFJldHVybnMgYSBuZXcgSWQgKHBvc3NpYmx5IHJlY3ljbGVkKQogIFN0cmluZyBuZXdJZCgpIHsKICAgIHZhciBpZDsKICAgIGlmIChfZnJlZS5pc0VtcHR5KSB7CiAgICAgIGlkID0gcHJvbG9ndWUgKyAoX25leHQrKykudG9TdHJpbmcoKTsKICAgIH0gZWxzZSB7CiAgICAgIGlkID0gX2ZyZWUuZmlyc3Q7CiAgICB9CiAgICBfZnJlZS5yZW1vdmUoaWQpOwogICAgX3VzZWQuYWRkKGlkKTsKICAgIHJldHVybiBpZDsKICB9CgogIC8vLyBSZWxlYXNlcyB0aGUgaWQgYW5kIG1hcmsgaXQgZm9yIHJlY3ljbGUKICB2b2lkIHJlbGVhc2UoU3RyaW5nIGlkKSB7CiAgICBpZiAoX3VzZWQucmVtb3ZlKGlkKSkgewogICAgICBfZnJlZS5hZGQoaWQpOwogICAgfQogIH0KfQpGAE5OPAEZAU48IDk0ASY6ARIjFxIEARUfGhwEAS0gATICATkUIxkQLwFGLwFHEQElASsTDBksDRgGFhMPBAEuHBwVBgQCASFkYXJ0Ol92bXNlcnZpY2UvbmFtZWRfbG9va3VwLmRhcnQsb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2Jpbi9idWlsdGluLmRhcnSpJC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGJ1aWx0aW47CgovLyBOT1RFOiBEbyBub3QgaW1wb3J0ICdkYXJ0OmlvJyBpbiBidWlsdGluLgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgaGlkZSBMaW5rZWRMaXN0LCBMaW5rZWRMaXN0RW50cnk7CmltcG9ydCAnZGFydDpfaW50ZXJuYWwnIGhpZGUgU3ltYm9sOwppbXBvcnQgJ2RhcnQ6aXNvbGF0ZSc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCi8vIEVtYmVkZGVyIHNldHMgdGhpcyB0byB0cnVlIGlmIHRoZSAtLXRyYWNlLWxvYWRpbmcgZmxhZyB3YXMgcGFzc2VkIG9uIHRoZQovLyBjb21tYW5kIGxpbmUuCmJvb2wgX3RyYWNlTG9hZGluZyA9IGZhbHNlOwoKLy8gQmVmb3JlIGhhbmRsaW5nIGFuIGVtYmVkZGVyIGVudHJ5cG9pbnQgd2UgZmluYWxpemUgdGhlIHNldHVwIG9mIHRoZQovLyBkYXJ0Ol9idWlsdGluIGxpYnJhcnkuCmJvb2wgX3NldHVwQ29tcGxldGVkID0gZmFsc2U7CgovLyAncHJpbnQnIGltcGxlbWVudGF0aW9uLgovLyBUaGUgc3RhbmRhbG9uZSBlbWJlZGRlciByZWdpc3RlcnMgdGhlIGNsb3N1cml6ZWQgX3ByaW50IGZ1bmN0aW9uIHdpdGggdGhlCi8vIGRhcnQ6Y29yZSBsaWJyYXJ5Lgp2b2lkIF9wcmludFN0cmluZyhTdHJpbmcgcykgbmF0aXZlICJCdWlsdGluX1ByaW50U3RyaW5nIjsKCnZvaWQgX3ByaW50KGFyZykgewogIF9wcmludFN0cmluZyhhcmcudG9TdHJpbmcoKSk7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKX2dldFByaW50Q2xvc3VyZSgpID0+IF9wcmludDsKCi8vIEFzeW5jaHJvbm91cyBsb2FkaW5nIG9mIHJlc291cmNlcy4KLy8gVGhlIGVtYmVkZGVyIGZvcndhcmRzIGxvYWRpbmcgcmVxdWVzdHMgdG8gdGhlIHNlcnZpY2UgaXNvbGF0ZS4KCi8vIEEgcG9ydCBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBzZXJ2aWNlIGlzb2xhdGUgZm9yIEkvTy4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpTZW5kUG9ydCBfbG9hZFBvcnQ7CgovLyBUaGUgaXNvbGF0ZUlkIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgc2VydmljZSBpc29sYXRlIGZvciBJL08uCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKaW50IF9pc29sYXRlSWQ7CgovLyBSZXF1ZXN0cyBtYWRlIHRvIHRoZSBzZXJ2aWNlIGlzb2xhdGUgb3ZlciB0aGUgbG9hZCBwb3J0LgoKLy8gRXh0cmEgcmVxdWVzdHMuIEtlZXAgdGhlc2UgaW4gc3luYyBiZXR3ZWVuIGxvYWRlci5kYXJ0IGFuZCBidWlsdGluLmRhcnQuCmNvbnN0IF9EYXJ0X2tJbml0TG9hZGVyID0gNDsgLy8gSW5pdGlhbGl6ZSB0aGUgbG9hZGVyLgpjb25zdCBfRGFydF9rUmVzb3VyY2VMb2FkID0gNTsgLy8gUmVzb3VyY2UgY2xhc3Mgc3VwcG9ydC4KY29uc3QgX0RhcnRfa0dldFBhY2thZ2VSb290VXJpID0gNjsgLy8gVXJpIG9mIHRoZSBwYWNrYWdlcy8gZGlyZWN0b3J5Lgpjb25zdCBfRGFydF9rR2V0UGFja2FnZUNvbmZpZ1VyaSA9IDc7IC8vIFVyaSBvZiB0aGUgLnBhY2thZ2VzIGZpbGUuCmNvbnN0IF9EYXJ0X2tSZXNvbHZlUGFja2FnZVVyaSA9IDg7IC8vIFJlc29sdmUgYSBwYWNrYWdlOiB1cmkuCgovLyBNYWtlIGEgcmVxdWVzdCB0byB0aGUgbG9hZGVyLiBGdXR1cmUgd2lsbCBjb21wbGV0ZSB3aXRoIHJlc3VsdCB3aGljaCBpcwovLyBlaXRoZXIgYSBVcmkgb3IgYSBMaXN0PGludD4uCkZ1dHVyZTxUPiBfbWFrZUxvYWRlclJlcXVlc3Q8VD4oaW50IHRhZywgU3RyaW5nIHVyaSkgewogIGFzc2VydChfaXNvbGF0ZUlkICE9IG51bGwpOwogIGlmIChfbG9hZFBvcnQgPT0gbnVsbCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlNlcnZpY2UgaXNvbGF0ZSBpcyBub3QgYXZhaWxhYmxlLiIpOwogIH0KICBDb21wbGV0ZXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxUPigpOwogIFJhd1JlY2VpdmVQb3J0IHBvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoKTsKICBwb3J0LmhhbmRsZXIgPSAobXNnKSB7CiAgICAvLyBDbG9zZSB0aGUgcG9ydC4KICAgIHBvcnQuY2xvc2UoKTsKICAgIGNvbXBsZXRlci5jb21wbGV0ZShtc2cpOwogIH07CiAgX2xvYWRQb3J0LnNlbmQoW190cmFjZUxvYWRpbmcsIF9pc29sYXRlSWQsIHRhZywgcG9ydC5zZW5kUG9ydCwgdXJpXSk7CiAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7Cn0KCi8vIFRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIGVtYmVkZGVyIHdhcyBsYXVuY2hlZC4KVXJpIF93b3JraW5nRGlyZWN0b3J5OwovLyBUaGUgVVJJIHRoYXQgdGhlIHJvb3Qgc2NyaXB0IHdhcyBsb2FkZWQgZnJvbS4gUmVtZW1iZXJlZCBzbyB0aGF0Ci8vIHBhY2thZ2UgaW1wb3J0cyBjYW4gYmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gaXQuIFRoZSByb290IHNjcmlwdCBpcyB0aGUgYmFzaXMKLy8gZm9yIHRoZSByb290IGxpYnJhcnkgaW4gdGhlIFZNLgpVcmkgX3Jvb3RTY3JpcHQ7Ci8vIFRoZSBwYWNrYWdlIHJvb3Qgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUuClVyaSBfcGFja2FnZVJvb3Q7CgovLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBXaW5kb3dzIHBhdGhzIHNvIHRoYXQgdGhleSBhcmUgY29tcGF0aWJsZSB3aXRoIFVSSQovLyBoYW5kbGluZy4KLy8gRW1iZWRkZXIgc2V0cyB0aGlzIHRvIHRydWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24gV2luZG93cy4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpib29sIF9pc1dpbmRvd3MgPSBmYWxzZTsKCi8vIExvZ2dpbmcgZnJvbSBidWlsdGluLmRhcnQgaXMgcHJlZml4ZWQgd2l0aCBhICcqJy4KU3RyaW5nIF9sb2dJZCA9IChJc29sYXRlLmN1cnJlbnQuaGFzaENvZGUgJSAweDEwMDAwMCkudG9SYWRpeFN0cmluZygxNik7Cl9sb2cobXNnKSB7CiAgX3ByaW50KCIqICRfbG9nSWQgJG1zZyIpOwp9Cgpfc2FuaXRpemVXaW5kb3dzUGF0aChwYXRoKSB7CiAgLy8gRm9yIFdpbmRvd3Mgd2UgbmVlZCB0byBtYXNzYWdlIHRoZSBwYXRocyBhIGJpdCBhY2NvcmRpbmcgdG8KICAvLyBodHRwOi8vYmxvZ3MubXNkbi5jb20vYi9pZS9hcmNoaXZlLzIwMDYvMTIvMDYvZmlsZS11cmlzLWluLXdpbmRvd3MuYXNweAogIC8vCiAgLy8gQ29udmVydAogIC8vIEM6XG9uZVx0d29cdGhyZWUKICAvLyB0bwogIC8vIC9DOi9vbmUvdHdvL3RocmVlCgogIGlmIChfaXNXaW5kb3dzID09IGZhbHNlKSB7CiAgICAvLyBEbyBub3RoaW5nIHdoZW4gbm90IHJ1bm5pbmcgV2luZG93cy4KICAgIHJldHVybiBwYXRoOwogIH0KCiAgdmFyIGZpeGVkUGF0aCA9ICIke3BhdGgucmVwbGFjZUFsbCgnXFwnLCAnLycpfSI7CgogIGlmICgocGF0aC5sZW5ndGggPiAyKSAmJiAocGF0aFsxXSA9PSAnOicpKSB7CiAgICAvLyBQYXRoIGJlZ2lucyB3aXRoIGEgZHJpdmUgbGV0dGVyLgogICAgcmV0dXJuICcvJGZpeGVkUGF0aCc7CiAgfQoKICByZXR1cm4gZml4ZWRQYXRoOwp9CgpfdHJpbVdpbmRvd3NQYXRoKHBhdGgpIHsKICAvLyBDb252ZXJ0IC9YOi8gdG8gWDovLgogIGlmIChfaXNXaW5kb3dzID09IGZhbHNlKSB7CiAgICAvLyBEbyBub3RoaW5nIHdoZW4gbm90IHJ1bm5pbmcgV2luZG93cy4KICAgIHJldHVybiBwYXRoOwogIH0KICBpZiAoIXBhdGguc3RhcnRzV2l0aCgnLycpIHx8IChwYXRoLmxlbmd0aCA8IDMpKSB7CiAgICByZXR1cm4gcGF0aDsKICB9CiAgLy8gTWF0Y2ggJy8/OicuCiAgaWYgKChwYXRoWzBdID09ICcvJykgJiYgKHBhdGhbMl0gPT0gJzonKSkgewogICAgLy8gUmVtb3ZlIGxlYWRpbmcgJy8nLgogICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDEpOwogIH0KICByZXR1cm4gcGF0aDsKfQoKLy8gRW5zdXJlIHdlIGhhdmUgYSB0cmFpbGluZyBzbGFzaCBjaGFyYWN0ZXIuCl9lbmZvcmNlVHJhaWxpbmdTbGFzaCh1cmkpIHsKICBpZiAoIXVyaS5lbmRzV2l0aCgnLycpKSB7CiAgICByZXR1cm4gJyR1cmkvJzsKICB9CiAgcmV0dXJuIHVyaTsKfQoKLy8gRW1iZWRkZXIgRW50cnlwb2ludDoKLy8gVGhlIGVtYmVkZGVyIGNhbGxzIHRoaXMgbWV0aG9kIHdpdGggdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKdm9pZCBfc2V0V29ya2luZ0RpcmVjdG9yeShTdHJpbmcgY3dkKSB7CiAgaWYgKCFfc2V0dXBDb21wbGV0ZWQpIHsKICAgIF9zZXR1cEhvb2tzKCk7CiAgfQogIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICBfbG9nKCdTZXR0aW5nIHdvcmtpbmcgZGlyZWN0b3J5OiAkY3dkJyk7CiAgfQogIF93b3JraW5nRGlyZWN0b3J5ID0gbmV3IFVyaS5kaXJlY3RvcnkoY3dkKTsKICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgX2xvZygnV29ya2luZyBkaXJlY3RvcnkgVVJJOiAkX3dvcmtpbmdEaXJlY3RvcnknKTsKICB9Cn0KCi8vIEVtYmVkZGVyIEVudHJ5cG9pbnQ6Ci8vIFRoZSBlbWJlZGRlciBjYWxscyB0aGlzIG1ldGhvZCB3aXRoIGEgY3VzdG9tIHBhY2thZ2Ugcm9vdC4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpTdHJpbmcgX3NldFBhY2thZ2VSb290KFN0cmluZyBwYWNrYWdlUm9vdCkgewogIGlmICghX3NldHVwQ29tcGxldGVkKSB7CiAgICBfc2V0dXBIb29rcygpOwogIH0KICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgX2xvZygnU2V0dGluZyBwYWNrYWdlIHJvb3Q6ICRwYWNrYWdlUm9vdCcpOwogIH0KICBpZiAocGFja2FnZVJvb3Quc3RhcnRzV2l0aCgnZmlsZTonKSB8fAogICAgICBwYWNrYWdlUm9vdC5zdGFydHNXaXRoKCdodHRwOicpIHx8CiAgICAgIHBhY2thZ2VSb290LnN0YXJ0c1dpdGgoJ2h0dHBzOicpKSB7CiAgICBwYWNrYWdlUm9vdCA9IF9lbmZvcmNlVHJhaWxpbmdTbGFzaChwYWNrYWdlUm9vdCk7CiAgICBfcGFja2FnZVJvb3QgPSBfd29ya2luZ0RpcmVjdG9yeS5yZXNvbHZlKHBhY2thZ2VSb290KTsKICB9IGVsc2UgewogICAgcGFja2FnZVJvb3QgPSBfc2FuaXRpemVXaW5kb3dzUGF0aChwYWNrYWdlUm9vdCk7CiAgICBwYWNrYWdlUm9vdCA9IF90cmltV2luZG93c1BhdGgocGFja2FnZVJvb3QpOwogICAgX3BhY2thZ2VSb290ID0gX3dvcmtpbmdEaXJlY3RvcnkucmVzb2x2ZVVyaShuZXcgVXJpLmRpcmVjdG9yeShwYWNrYWdlUm9vdCkpOwogIH0KICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGRldGVybWluZWQgdGhlIHBhY2thZ2VSb290IHZhbHVlIGJlaW5nIHVzZWQsIHNldCBpdAogIC8vIHVwIGZvciB1c2UgaW4gUGxhdGZvcm0ucGFja2FnZVJvb3QuIFRoaXMgaXMgb25seSBzZXQgd2hlbiB0aGUgZW1iZWRkZXIKICAvLyBzZXRzIHVwIHRoZSBwYWNrYWdlIHJvb3QuIEF1dG9tYXRpY2FsbHkgZGlzY292ZXJlZCBwYWNrYWdlIHJvb3Qgd2lsbAogIC8vIG5vdCB1cGRhdGUgdGhlIFZNTGlicmFyeUhvb2tzIHZhbHVlLgogIHZhciBwYWNrYWdlUm9vdFN0ciA9IF9wYWNrYWdlUm9vdC50b1N0cmluZygpOwogIFZNTGlicmFyeUhvb2tzLnBhY2thZ2VSb290U3RyaW5nID0gcGFja2FnZVJvb3RTdHI7CiAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coJ1BhY2thZ2Ugcm9vdCBVUkk6ICRfcGFja2FnZVJvb3QnKTsKICB9CiAgcmV0dXJuIHBhY2thZ2VSb290U3RyOwp9CgovLyBFbWJlZGRlciBFbnRyeXBvaW50OgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpClN0cmluZyBfc2V0UGFja2FnZXNNYXAoU3RyaW5nIHBhY2thZ2VzUGFyYW0pIHsKICBpZiAoIV9zZXR1cENvbXBsZXRlZCkgewogICAgX3NldHVwSG9va3MoKTsKICB9CiAgLy8gRmlyc3QgY29udmVydCB0aGUgcGFja2FnZXMgcGFyYW1ldGVyIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0byBhIFVSSSB3aGljaAogIC8vIGNhbiBiZSBoYW5kbGVkIGJ5IHRoZSBsb2FkZXIgY29kZS4KICAvLyBUT0RPKGlwb3N2YSk6IENvbnNpZGVyIHJlZmFjdG9yaW5nIHRoZSBjb21tb24gY29kZSBiZWxvdyB3aGljaCBpcyBhbG1vc3QKICAvLyBzaGFyZWQgd2l0aCByZXNvbHV0aW9uIG9mIHRoZSByb290IHNjcmlwdC4KICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgX2xvZygiUmVzb2x2aW5nIHBhY2thZ2VzIG1hcDogJHBhY2thZ2VzUGFyYW0iKTsKICB9CiAgaWYgKF93b3JraW5nRGlyZWN0b3J5ID09IG51bGwpIHsKICAgIHRocm93ICdObyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHNldC4nOwogIH0KICB2YXIgcGFja2FnZXNOYW1lID0gX3Nhbml0aXplV2luZG93c1BhdGgocGFja2FnZXNQYXJhbSk7CiAgdmFyIHBhY2thZ2VzVXJpID0gVXJpLnBhcnNlKHBhY2thZ2VzTmFtZSk7CiAgaWYgKHBhY2thZ2VzVXJpLnNjaGVtZSA9PSAnJykgewogICAgLy8gU2NyaXB0IGRvZXMgbm90IGhhdmUgYSBzY2hlbWUsIGFzc3VtZSB0aGF0IGl0IGlzIGEgcGF0aCwKICAgIC8vIHJlc29sdmUgaXQgYWdhaW5zdCB0aGUgd29ya2luZyBkaXJlY3RvcnkuCiAgICBwYWNrYWdlc1VyaSA9IF93b3JraW5nRGlyZWN0b3J5LnJlc29sdmVVcmkocGFja2FnZXNVcmkpOwogIH0KICB2YXIgcGFja2FnZXNVcmlTdHIgPSBwYWNrYWdlc1VyaS50b1N0cmluZygpOwogIFZNTGlicmFyeUhvb2tzLnBhY2thZ2VDb25maWdTdHJpbmcgPSBwYWNrYWdlc1VyaVN0cjsKICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgX2xvZygnUmVzb2x2ZWQgcGFja2FnZXMgbWFwIHRvOiAkcGFja2FnZXNVcmknKTsKICB9CiAgcmV0dXJuIHBhY2thZ2VzVXJpU3RyOwp9CgovLyBSZXNvbHZlcyB0aGUgc2NyaXB0IHVyaSBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpZmYgdGhlIGdpdmVuIHVyaQovLyBkaWQgbm90IHNwZWNpZnkgYSBzY2hlbWUgKGUuZy4gYSBwYXRoIHRvIGEgc2NyaXB0IGZpbGUgb24gdGhlIGNvbW1hbmQgbGluZSkuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKU3RyaW5nIF9yZXNvbHZlU2NyaXB0VXJpKFN0cmluZyBzY3JpcHROYW1lKSB7CiAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coIlJlc29sdmluZyBzY3JpcHQ6ICRzY3JpcHROYW1lIik7CiAgfQogIGlmIChfd29ya2luZ0RpcmVjdG9yeSA9PSBudWxsKSB7CiAgICB0aHJvdyAnTm8gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBzZXQuJzsKICB9CiAgc2NyaXB0TmFtZSA9IF9zYW5pdGl6ZVdpbmRvd3NQYXRoKHNjcmlwdE5hbWUpOwoKICB2YXIgc2NyaXB0VXJpID0gVXJpLnBhcnNlKHNjcmlwdE5hbWUpOwogIGlmIChzY3JpcHRVcmkuc2NoZW1lID09ICcnKSB7CiAgICAvLyBTY3JpcHQgZG9lcyBub3QgaGF2ZSBhIHNjaGVtZSwgYXNzdW1lIHRoYXQgaXQgaXMgYSBwYXRoLAogICAgLy8gcmVzb2x2ZSBpdCBhZ2FpbnN0IHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KICAgIHNjcmlwdFVyaSA9IF93b3JraW5nRGlyZWN0b3J5LnJlc29sdmVVcmkoc2NyaXB0VXJpKTsKICB9CgogIC8vIFJlbWVtYmVyIHRoZSByb290IHNjcmlwdCBVUkkgc28gdGhhdCB3ZSBjYW4gcmVzb2x2ZSBwYWNrYWdlcyBiYXNlZCBvbgogIC8vIHRoaXMgbG9jYXRpb24uCiAgX3Jvb3RTY3JpcHQgPSBzY3JpcHRVcmk7CgogIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICBfbG9nKCdSZXNvbHZlZCBlbnRyeSBwb2ludCB0bzogJF9yb290U2NyaXB0Jyk7CiAgfQogIHJldHVybiBzY3JpcHRVcmkudG9TdHJpbmcoKTsKfQoKLy8gT25seSB1c2VkIGJ5IHZtL2NjIHVuaXQgdGVzdHMuClVyaSBfcmVzb2x2ZVBhY2thZ2VVcmkoVXJpIHVyaSkgewogIGFzc2VydChfcGFja2FnZVJvb3QgIT0gbnVsbCk7CiAgcmV0dXJuIF9wYWNrYWdlUm9vdC5yZXNvbHZlKHVyaS5wYXRoKTsKfQoKLy8gUmV0dXJucyBlaXRoZXIgYSBmaWxlIHBhdGggb3IgYSBVUkkgc3RhcnRpbmcgd2l0aCBodHRwW3NdOiwgYXMgYSBTdHJpbmcuClN0cmluZyBfZmlsZVBhdGhGcm9tVXJpKFN0cmluZyB1c2VyVXJpKSB7CiAgdmFyIHVyaSA9IFVyaS5wYXJzZSh1c2VyVXJpKTsKICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgX2xvZygnR2V0dGluZyBmaWxlIHBhdGggZnJvbTogJHVyaScpOwogIH0KCiAgdmFyIHBhdGg7CiAgc3dpdGNoICh1cmkuc2NoZW1lKSB7CiAgICBjYXNlICcnOgogICAgY2FzZSAnZmlsZSc6CiAgICAgIHJldHVybiB1cmkudG9GaWxlUGF0aCgpOwogICAgY2FzZSAncGFja2FnZSc6CiAgICAgIHJldHVybiBfZmlsZVBhdGhGcm9tVXJpKF9yZXNvbHZlUGFja2FnZVVyaSh1cmkpLnRvU3RyaW5nKCkpOwogICAgY2FzZSAnZGF0YSc6CiAgICBjYXNlICdodHRwJzoKICAgIGNhc2UgJ2h0dHBzJzoKICAgICAgcmV0dXJuIHVyaS50b1N0cmluZygpOwogICAgZGVmYXVsdDoKICAgICAgLy8gT25seSBoYW5kbGluZyBmaWxlLCBodHRwLCBhbmQgcGFja2FnZSBVUklzCiAgICAgIC8vIGluIHN0YW5kYWxvbmUgYmluYXJ5LgogICAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coJ1Vua25vd24gc2NoZW1lICgke3VyaS5zY2hlbWV9KSBpbiAkdXJpLicpOwogICAgICB9CiAgICAgIHRocm93ICdOb3QgYSBrbm93biBzY2hlbWU6ICR1cmknOwogIH0KfQoKLy8gUmVnaXN0ZXIgY2FsbGJhY2tzIGFuZCBob29rcyB3aXRoIHRoZSByZXN0IG9mIHRoZSBjb3JlIGxpYnJhcmllcy4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpfc2V0dXBIb29rcygpIHsKICBfc2V0dXBDb21wbGV0ZWQgPSB0cnVlOwogIFZNTGlicmFyeUhvb2tzLnJlc291cmNlUmVhZEFzQnl0ZXMgPSBfcmVzb3VyY2VSZWFkQXNCeXRlczsKCiAgVk1MaWJyYXJ5SG9va3MucGFja2FnZVJvb3RVcmlGdXR1cmUgPSBfZ2V0UGFja2FnZVJvb3RGdXR1cmU7CiAgVk1MaWJyYXJ5SG9va3MucGFja2FnZUNvbmZpZ1VyaUZ1dHVyZSA9IF9nZXRQYWNrYWdlQ29uZmlnRnV0dXJlOwogIFZNTGlicmFyeUhvb2tzLnJlc29sdmVQYWNrYWdlVXJpRnV0dXJlID0gX3Jlc29sdmVQYWNrYWdlVXJpRnV0dXJlOwp9CgovLyBIYW5kbGluZyBvZiBSZXNvdXJjZSBjbGFzcyBieSBkaXNwYXRjaGluZyB0byB0aGUgbG9hZCBwb3J0LgpGdXR1cmU8TGlzdDxpbnQ+PiBfcmVzb3VyY2VSZWFkQXNCeXRlcyhVcmkgdXJpKSBhc3luYyB7CiAgTGlzdCByZXNwb25zZSA9CiAgICAgIGF3YWl0IF9tYWtlTG9hZGVyUmVxdWVzdDxMaXN0PGludD4+KF9EYXJ0X2tSZXNvdXJjZUxvYWQsIHVyaS50b1N0cmluZygpKTsKICBpZiAocmVzcG9uc2VbNF0gaXMgU3RyaW5nKSB7CiAgICAvLyBUaHJvdyB0aGUgZXJyb3IuCiAgICB0aHJvdyByZXNwb25zZVs0XTsKICB9IGVsc2UgewogICAgcmV0dXJuIHJlc3BvbnNlWzRdOwogIH0KfQoKLy8gVE9ETyhtZmFpcmh1cnN0KTogcmVtb3ZlIHRoaXMKRnV0dXJlPFVyaT4gX2dldFBhY2thZ2VSb290RnV0dXJlKCkgewogIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICBfbG9nKCJSZXF1ZXN0IGZvciBwYWNrYWdlIHJvb3QgZnJvbSB1c2VyIGNvZGUuIik7CiAgfQogIC8vIFJldHVybiBudWxsLCBhcyB0aGUgYHBhY2thZ2VzL2AgZGlyZWN0b3J5IGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFydCAyLgogIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKG51bGwpOwp9CgpGdXR1cmU8VXJpPiBfZ2V0UGFja2FnZUNvbmZpZ0Z1dHVyZSgpIHsKICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgX2xvZygiUmVxdWVzdCBmb3IgcGFja2FnZSBjb25maWcgZnJvbSB1c2VyIGNvZGUuIik7CiAgfQogIGFzc2VydChfbG9hZFBvcnQgIT0gbnVsbCk7CiAgcmV0dXJuIF9tYWtlTG9hZGVyUmVxdWVzdDxVcmk+KF9EYXJ0X2tHZXRQYWNrYWdlQ29uZmlnVXJpLCBudWxsKTsKfQoKRnV0dXJlPFVyaT4gX3Jlc29sdmVQYWNrYWdlVXJpRnV0dXJlKFVyaSBwYWNrYWdlVXJpKSBhc3luYyB7CiAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coIlJlcXVlc3QgZm9yIHBhY2thZ2UgVXJpIHJlc29sdXRpb24gZnJvbSB1c2VyIGNvZGU6ICRwYWNrYWdlVXJpIik7CiAgfQogIGlmIChwYWNrYWdlVXJpLnNjaGVtZSAhPSAicGFja2FnZSIpIHsKICAgIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIk5vbi1wYWNrYWdlIFVyaSwgcmV0dXJuaW5nIHVubW9kaWZpZWQ6ICRwYWNrYWdlVXJpIik7CiAgICB9CiAgICAvLyBSZXR1cm4gdGhlIGluY29taW5nIHBhcmFtZXRlciBpZiBub3QgcGFzc2VkIGEgcGFja2FnZTogVVJJLgogICAgcmV0dXJuIHBhY2thZ2VVcmk7CiAgfQogIHZhciByZXN1bHQgPSBhd2FpdCBfbWFrZUxvYWRlclJlcXVlc3Q8VXJpPigKICAgICAgX0RhcnRfa1Jlc29sdmVQYWNrYWdlVXJpLCBwYWNrYWdlVXJpLnRvU3RyaW5nKCkpOwogIGlmIChyZXN1bHQgaXMhIFVyaSkgewogICAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiRXhjZXB0aW9uIHdoZW4gcmVzb2x2aW5nIHBhY2thZ2UgVVJJOiAkcGFja2FnZVVyaSIpOwogICAgfQogICAgcmVzdWx0ID0gbnVsbDsKICB9CiAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coIlJlc29sdmVkICckcGFja2FnZVVyaScgdG8gJyRyZXN1bHQnIik7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KgV0ATk48AREBLRU7JRcaAUwRHAFHGh4BG00WOgETIAIBGh4BJkIBPhoUAUcaEAE8AUw3OkdEPwFLIDceG0UELC4ZFxIdBUgbAgFBF0RQIxEtEgFLDTwaGQE1SQwcAgEdQU0FDRYIFwEdLBEEATMBLygaBAEUAgEZGh0sEQQ0EQQSLhseBA8CAS4dHBQEDgIBGEYaKBoTBBctBC4XNwQCARg+Gi0aEwQXMAQpKSo2Ows1MVEESkxKKjA1Fy0EGQIBGBovGhMETyhOMBc0BCMvBDotIkAxPQQvNxc0BBkCAU5QGi4XKwQjLwQxASkgQDE5BAFLFBsBFzMEHwIBIiIgKQIBTCogFyoEAQwYDREfFEMRERIdDTQfGzkIKAQCAUUaEBo9AT9DRQIBPzgSUB8YFwsYBAIBISYXNgRLIQIBKBc4BB1EAgE9F0wEKBlCBkMXBC44GBlBBhMEFzEEEQIBDWRhcnQ6X2J1aWx0aW48b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2h0bWwvZGFydGl1bS9uYXRpdmV3cmFwcGVycy5kYXJ0gX0vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBuYXRpdmV3cmFwcGVyczsKCmNsYXNzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMSB7fQoKY2xhc3MgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3MyIHt9CgpjbGFzcyBOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczMge30KCmNsYXNzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzNCB7fQoPAE5OPAEYASIBIgEiASIBE2RhcnQ6bmF0aXZld3JhcHBlcnMmb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL2lvLmRhcnSfGi8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovKioKICogRmlsZSwgc29ja2V0LCBIVFRQLCBhbmQgb3RoZXIgSS9PIHN1cHBvcnQgZm9yIG5vbi13ZWIgYXBwbGljYXRpb25zLgogKgogKiAqKkltcG9ydGFudDoqKiBCcm93c2VyLWJhc2VkIGFwcGxpY2F0aW9ucyBjYW4ndCB1c2UgdGhpcyBsaWJyYXJ5LgogKiBPbmx5IHNlcnZlcnMsIGNvbW1hbmQtbGluZSBzY3JpcHRzLCBhbmQgRmx1dHRlciBtb2JpbGUgYXBwcyBjYW4gaW1wb3J0CiAqIGFuZCB1c2UgZGFydDppby4KICoKICogVGhpcyBsaWJyYXJ5IGFsbG93cyB5b3UgdG8gd29yayB3aXRoIGZpbGVzLCBkaXJlY3RvcmllcywKICogc29ja2V0cywgcHJvY2Vzc2VzLCBIVFRQIHNlcnZlcnMgYW5kIGNsaWVudHMsIGFuZCBtb3JlLgogKiBNYW55IG9wZXJhdGlvbnMgcmVsYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IGFyZSBhc3luY2hyb25vdXMKICogYW5kIGFyZSBoYW5kbGVkIHVzaW5nIFtGdXR1cmVdcyBvciBbU3RyZWFtXXMsIGJvdGggb2Ygd2hpY2gKICogYXJlIGRlZmluZWQgaW4gdGhlIFtkYXJ0OmFzeW5jCiAqIGxpYnJhcnldKC4uL2RhcnQtYXN5bmMvZGFydC1hc3luYy1saWJyYXJ5Lmh0bWwpLgogKgogKiBUbyB1c2UgdGhlIGRhcnQ6aW8gbGlicmFyeSBpbiB5b3VyIGNvZGU6CiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nOwogKgogKiBGb3IgYW4gaW50cm9kdWN0aW9uIHRvIEkvTyBpbiBEYXJ0LCBzZWUgdGhlIFtkYXJ0OmlvIGxpYnJhcnkKICogdG91cl0oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RhcnQtdm0vaW8tbGlicmFyeS10b3VyKS4KICoKICogIyMgRmlsZSwgRGlyZWN0b3J5LCBhbmQgTGluawogKgogKiBBbiBpbnN0YW5jZSBvZiBbRmlsZV0sIFtEaXJlY3RvcnldLCBvciBbTGlua10gcmVwcmVzZW50cyBhIGZpbGUsCiAqIGRpcmVjdG9yeSwgb3IgbGluaywgcmVzcGVjdGl2ZWx5LCBpbiB0aGUgbmF0aXZlIGZpbGUgc3lzdGVtLgogKgogKiBZb3UgY2FuIG1hbmlwdWxhdGUgdGhlIGZpbGUgc3lzdGVtIHRocm91Z2ggb2JqZWN0cyBvZiB0aGVzZSB0eXBlcy4KICogRm9yIGV4YW1wbGUsIHlvdSBjYW4gcmVuYW1lIGEgZmlsZSBvciBkaXJlY3Rvcnk6CiAqCiAqICAgICBGaWxlIG15RmlsZSA9IG5ldyBGaWxlKCdteUZpbGUudHh0Jyk7CiAqICAgICBteUZpbGUucmVuYW1lKCd5b3VyRmlsZS50eHQnKS50aGVuKChfKSA9PiBwcmludCgnZmlsZSByZW5hbWVkJykpOwogKgogKiBNYW55IG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlIEZpbGUsIERpcmVjdG9yeSwgYW5kIExpbmsgY2xhc3NlcwogKiBydW4gYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybiBhIEZ1dHVyZS4KICoKICogIyMgRmlsZVN5c3RlbUVudGl0eQogKgogKiBGaWxlLCBEaXJlY3RvcnksIGFuZCBMaW5rIGFsbCBleHRlbmQgW0ZpbGVTeXN0ZW1FbnRpdHldLgogKiBJbiBhZGRpdGlvbiB0byBiZWluZyB0aGUgc3VwZXJjbGFzcyBmb3IgdGhlc2UgY2xhc3NlcywKICogRmlsZVN5c3RlbUVudGl0eSBoYXMgYSBudW1iZXIgb2Ygc3RhdGljIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBwYXRocy4KICoKICogVG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEgcGF0aCwKICogeW91IGNhbiB1c2UgdGhlIEZpbGVTeXN0ZW1FbnRpdHkgc3RhdGljIG1ldGhvZHMKICogc3VjaCBhcyAnaXNEaXJlY3RvcnknLCAnaXNGaWxlJywgYW5kICdleGlzdHMnLgogKiBCZWNhdXNlIGZpbGUgc3lzdGVtIGFjY2VzcyBpbnZvbHZlcyBJL08sIHRoZXNlIG1ldGhvZHMKICogYXJlIGFzeW5jaHJvbm91cyBhbmQgcmV0dXJuIGEgRnV0dXJlLgogKgogKiAgICAgRmlsZVN5c3RlbUVudGl0eS5pc0RpcmVjdG9yeShteVBhdGgpLnRoZW4oKGlzRGlyKSB7CiAqICAgICAgIGlmIChpc0RpcikgewogKiAgICAgICAgIHByaW50KCckbXlQYXRoIGlzIGEgZGlyZWN0b3J5Jyk7CiAqICAgICAgIH0gZWxzZSB7CiAqICAgICAgICAgcHJpbnQoJyRteVBhdGggaXMgbm90IGEgZGlyZWN0b3J5Jyk7CiAqICAgICAgIH0KICogICAgIH0pOwogKgogKiAjIyBIdHRwU2VydmVyIGFuZCBIdHRwQ2xpZW50CiAqCiAqIFRoZSBjbGFzc2VzIFtIdHRwU2VydmVyXSBhbmQgW0h0dHBDbGllbnRdCiAqIHByb3ZpZGUgSFRUUCBzZXJ2ZXIgYW5kIEhUVFAgY2xpZW50IGZ1bmN0aW9uYWxpdHkuCiAqCiAqIFRoZSBbSHR0cFNlcnZlcl0gY2xhc3MgcHJvdmlkZXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgZm9yCiAqIGltcGxlbWVudGluZyBhbiBIVFRQIHNlcnZlci4KICogRm9yIHNvbWUgaGlnaGVyLWxldmVsIGJ1aWxkaW5nLWJsb2Nrcywgd2UgcmVjb21tZW5kIHRoYXQgeW91IHRyeQogKiB0aGUgW3NoZWxmXShodHRwczovL3B1Yi5kYXJ0bGFuZy5vcmcvcGFja2FnZXMvc2hlbGYpCiAqIHB1YiBwYWNrYWdlLCB3aGljaCBjb250YWlucwogKiBhIHNldCBvZiBoaWdoLWxldmVsIGNsYXNzZXMgdGhhdCwgdG9nZXRoZXIgd2l0aCB0aGUgW0h0dHBTZXJ2ZXJdIGNsYXNzCiAqIGluIHRoaXMgbGlicmFyeSwgbWFrZSBpdCBlYXNpZXIgdG8gaW1wbGVtZW50IEhUVFAgc2VydmVycy4KICoKICogIyMgUHJvY2VzcwogKgogKiBUaGUgW1Byb2Nlc3NdIGNsYXNzIHByb3ZpZGVzIGEgd2F5IHRvIHJ1biBhIHByb2Nlc3Mgb24KICogdGhlIG5hdGl2ZSBtYWNoaW5lLgogKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHNwYXducyBhIHByb2Nlc3MgdGhhdCByZWN1cnNpdmVseSBsaXN0cwogKiB0aGUgZmlsZXMgdW5kZXIgYHdlYmAuCiAqCiAqICAgICBQcm9jZXNzLnN0YXJ0KCdscycsIFsnLVInLCAnd2ViJ10pLnRoZW4oKHByb2Nlc3MpIHsKICogICAgICAgc3Rkb3V0LmFkZFN0cmVhbShwcm9jZXNzLnN0ZG91dCk7CiAqICAgICAgIHN0ZGVyci5hZGRTdHJlYW0ocHJvY2Vzcy5zdGRlcnIpOwogKiAgICAgICBwcm9jZXNzLmV4aXRDb2RlLnRoZW4ocHJpbnQpOwogKiAgICAgfSk7CiAqCiAqIFVzaW5nIGBzdGFydCgpYCByZXR1cm5zIGEgRnV0dXJlLCB3aGljaCBjb21wbGV0ZXMgd2l0aCBhIFtQcm9jZXNzXSBvYmplY3QKICogd2hlbiB0aGUgcHJvY2VzcyBoYXMgc3RhcnRlZC4gVGhpcyBbUHJvY2Vzc10gb2JqZWN0IGFsbG93cyB5b3UgdG8gaW50ZXJhY3QKICogd2l0aCB0aGUgcHJvY2VzcyB3aGlsZSBpdCBpcyBydW5uaW5nLiBVc2luZyBgcnVuKClgIHJldHVybnMgYSBGdXR1cmUsIHdoaWNoCiAqIGNvbXBsZXRlcyB3aXRoIGEgW1Byb2Nlc3NSZXN1bHRdIG9iamVjdCB3aGVuIHRoZSBzcGF3bmVkIHByb2Nlc3MgaGFzCiAqIHRlcm1pbmF0ZWQuIFRoaXMgW1Byb2Nlc3NSZXN1bHRdIG9iamVjdCBjb2xsZWN0cyB0aGUgb3V0cHV0IGFuZCBleGl0IGNvZGUKICogZnJvbSB0aGUgcHJvY2Vzcy4KICoKICogV2hlbiB1c2luZyBgc3RhcnQoKWAsCiAqIHlvdSBuZWVkIHRvIHJlYWQgYWxsIGRhdGEgY29taW5nIG9uIHRoZSBzdGRvdXQgYW5kIHN0ZGVyciBzdHJlYW1zIG90aGVyd2lzZQogKiB0aGUgc3lzdGVtIHJlc291cmNlcyB3aWxsIG5vdCBiZSBmcmVlZC4KICoKICogIyMgV2ViU29ja2V0CiAqCiAqIFRoZSBbV2ViU29ja2V0XSBjbGFzcyBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgd2ViIHNvY2tldCBwcm90b2NvbC4gVGhpcwogKiBhbGxvd3MgZnVsbC1kdXBsZXggY29tbXVuaWNhdGlvbnMgYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBhcHBsaWNhdGlvbnMuCiAqCiAqIEEgd2ViIHNvY2tldCBzZXJ2ZXIgdXNlcyBhIG5vcm1hbCBIVFRQIHNlcnZlciBmb3IgYWNjZXB0aW5nIHdlYiBzb2NrZXQKICogY29ubmVjdGlvbnMuIFRoZSBpbml0aWFsIGhhbmRzaGFrZSBpcyBhIEhUVFAgcmVxdWVzdCB3aGljaCBpcyB0aGVuIHVwZ3JhZGVkIHRvIGEKICogd2ViIHNvY2tldCBjb25uZWN0aW9uLgogKiBUaGUgc2VydmVyIHVwZ3JhZGVzIHRoZSByZXF1ZXN0IHVzaW5nIFtXZWJTb2NrZXRUcmFuc2Zvcm1lcl0KICogYW5kIGxpc3RlbnMgZm9yIHRoZSBkYXRhIG9uIHRoZSByZXR1cm5lZCB3ZWIgc29ja2V0LgogKiBGb3IgZXhhbXBsZSwgaGVyZSdzIGEgbWluaSBzZXJ2ZXIgdGhhdCBsaXN0ZW5zIGZvciAnd3MnIGRhdGEKICogb24gYSBXZWJTb2NrZXQ6CiAqCiAqICAgICBydW5ab25lZCgoKSBhc3luYyB7CiAqICAgICAgIHZhciBzZXJ2ZXIgPSBhd2FpdCBIdHRwU2VydmVyLmJpbmQoJzEyNy4wLjAuMScsIDQwNDApOwogKiAgICAgICBzZXJ2ZXIubGlzdGVuKChIdHRwUmVxdWVzdCByZXEpIGFzeW5jIHsKICogICAgICAgICBpZiAocmVxLnVyaS5wYXRoID09ICcvd3MnKSB7CiAqICAgICAgICAgICB2YXIgc29ja2V0ID0gYXdhaXQgV2ViU29ja2V0VHJhbnNmb3JtZXIudXBncmFkZShyZXEpOwogKiAgICAgICAgICAgc29ja2V0Lmxpc3RlbihoYW5kbGVNc2cpOwogKiAgICAgICAgIH0KICogICAgICAgfSk7CiAqICAgICB9LCBvbkVycm9yOiAoZSkgPT4gcHJpbnQoIkFuIGVycm9yIG9jY3VycmVkLiIpKTsKICoKICogVGhlIGNsaWVudCBjb25uZWN0cyB0byB0aGUgV2ViU29ja2V0IHVzaW5nIHRoZSBgY29ubmVjdCgpYCBtZXRob2QKICogYW5kIGEgVVJJIHRoYXQgdXNlcyB0aGUgV2ViIFNvY2tldCBwcm90b2NvbC4KICogVGhlIGNsaWVudCBjYW4gd3JpdGUgdG8gdGhlIFdlYlNvY2tldCB3aXRoIHRoZSBgYWRkKClgIG1ldGhvZC4KICogRm9yIGV4YW1wbGUsCiAqCiAqICAgICB2YXIgc29ja2V0ID0gYXdhaXQgV2ViU29ja2V0LmNvbm5lY3QoJ3dzOi8vMTI3LjAuMC4xOjQwNDAvd3MnKTsKICogICAgIHNvY2tldC5hZGQoJ0hlbGxvLCBXb3JsZCEnKTsKICoKICogQ2hlY2sgb3V0IHRoZQogKiBbd2Vic29ja2V0X3NhbXBsZV0oaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9kYXJ0LXNhbXBsZXMvdHJlZS9tYXN0ZXIvaHRtbDUvd2ViL3dlYnNvY2tldHMvYmFzaWNzKQogKiBhcHAsIHdoaWNoIHVzZXMgV2ViU29ja2V0cyB0byBjb21tdW5pY2F0ZSB3aXRoIGEgc2VydmVyLgogKgogKiAjIyBTb2NrZXQgYW5kIFNlcnZlclNvY2tldAogKgogKiBDbGllbnRzIGFuZCBzZXJ2ZXJzIHVzZSBbU29ja2V0XXMgdG8gY29tbXVuaWNhdGUgdXNpbmcgdGhlIFRDUCBwcm90b2NvbC4KICogVXNlIFtTZXJ2ZXJTb2NrZXRdIG9uIHRoZSBzZXJ2ZXIgc2lkZSBhbmQgW1NvY2tldF0gb24gdGhlIGNsaWVudC4KICogVGhlIHNlcnZlciBjcmVhdGVzIGEgbGlzdGVuaW5nIHNvY2tldCB1c2luZyB0aGUgYGJpbmQoKWAgbWV0aG9kIGFuZAogKiB0aGVuIGxpc3RlbnMgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zIG9uIHRoZSBzb2NrZXQuIEZvciBleGFtcGxlOgogKgogKiAgICAgU2VydmVyU29ja2V0LmJpbmQoJzEyNy4wLjAuMScsIDQwNDEpCiAqICAgICAgIC50aGVuKChzZXJ2ZXJTb2NrZXQpIHsKICogICAgICAgICBzZXJ2ZXJTb2NrZXQubGlzdGVuKChzb2NrZXQpIHsKICogICAgICAgICAgIHNvY2tldC50cmFuc2Zvcm0odXRmOC5kZWNvZGVyKS5saXN0ZW4ocHJpbnQpOwogKiAgICAgICAgIH0pOwogKiAgICAgICB9KTsKICoKICogQSBjbGllbnQgY29ubmVjdHMgYSBTb2NrZXQgdXNpbmcgdGhlIGBjb25uZWN0KClgIG1ldGhvZCwKICogd2hpY2ggcmV0dXJucyBhIEZ1dHVyZS4KICogVXNpbmcgYHdyaXRlKClgLCBgd3JpdGVsbigpYCwgb3IgYHdyaXRlQWxsKClgIGFyZSB0aGUgZWFzaWVzdCB3YXlzIHRvCiAqIHNlbmQgZGF0YSBvdmVyIHRoZSBzb2NrZXQuCiAqIEZvciBleGFtcGxlOgogKgogKiAgICAgU29ja2V0LmNvbm5lY3QoJzEyNy4wLjAuMScsIDQwNDEpLnRoZW4oKHNvY2tldCkgewogKiAgICAgICBzb2NrZXQud3JpdGUoJ0hlbGxvLCBXb3JsZCEnKTsKICogICAgIH0pOwogKgogKiBCZXNpZGVzIFtTb2NrZXRdIGFuZCBbU2VydmVyU29ja2V0XSwgdGhlIFtSYXdTb2NrZXRdIGFuZAogKiBbUmF3U2VydmVyU29ja2V0XSBjbGFzc2VzIGFyZSBhdmFpbGFibGUgZm9yIGxvd2VyLWxldmVsIGFjY2VzcwogKiB0byBhc3luYyBzb2NrZXQgSU8uCiAqCiAqICMjIFN0YW5kYXJkIG91dHB1dCwgZXJyb3IsIGFuZCBpbnB1dCBzdHJlYW1zCiAqCiAqIFRoaXMgbGlicmFyeSBwcm92aWRlcyB0aGUgc3RhbmRhcmQgb3V0cHV0LCBlcnJvciwgYW5kIGlucHV0CiAqIHN0cmVhbXMsIG5hbWVkICdzdGRvdXQnLCAnc3RkZXJyJywgYW5kICdzdGRpbicsIHJlc3BlY3RpdmVseS4KICoKICogVGhlIHN0ZG91dCBhbmQgc3RkZXJyIHN0cmVhbXMgYXJlIGJvdGggW0lPU2lua11zIGFuZCBoYXZlIHRoZSBzYW1lIHNldAogKiBvZiBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzLgogKgogKiBUbyB3cml0ZSBhIHN0cmluZyB0byAnc3Rkb3V0JzoKICoKICogICAgIHN0ZG91dC53cml0ZWxuKCdIZWxsbywgV29ybGQhJyk7CiAqCiAqIFRvIHdyaXRlIGEgbGlzdCBvZiBvYmplY3RzIHRvICdzdGRlcnInOgogKgogKiAgICAgc3RkZXJyLndyaXRlQWxsKFsgJ1RoYXQgJywgJ2lzICcsICdhbiAnLCAnZXJyb3IuJywgJ1xuJ10pOwogKgogKiBUaGUgc3RhbmRhcmQgaW5wdXQgc3RyZWFtIGlzIGEgdHJ1ZSBbU3RyZWFtXSwgc28gaXQgaW5oZXJpdHMKICogcHJvcGVydGllcyBhbmQgbWV0aG9kcyBmcm9tIHRoZSBTdHJlYW0gY2xhc3MuCiAqCiAqIFRvIHJlYWQgdGV4dCBzeW5jaHJvbm91c2x5IGZyb20gdGhlIGNvbW1hbmQgbGluZQogKiAodGhlIHByb2dyYW0gYmxvY2tzIHdhaXRpbmcgZm9yIHVzZXIgdG8gdHlwZSBpbmZvcm1hdGlvbik6CiAqCiAqICAgICAgU3RyaW5nIGlucHV0VGV4dCA9IHN0ZGluLnJlYWRMaW5lU3luYygpOwogKgogKiB7QGNhdGVnb3J5IFZNfQogKi8KbGlicmFyeSBkYXJ0LmlvOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0Ol9pbnRlcm5hbCcgaGlkZSBTeW1ib2w7CmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJwogICAgc2hvdyBIYXNoTWFwLCBIYXNoU2V0LCBRdWV1ZSwgTGlzdFF1ZXVlLCBNYXBCYXNlLCBVbm1vZGlmaWFibGVNYXBWaWV3OwppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDpkZXZlbG9wZXInIGhpZGUgbG9nOwppbXBvcnQgJ2RhcnQ6aXNvbGF0ZSc7CmltcG9ydCAnZGFydDptYXRoJzsKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwoKZXhwb3J0ICdkYXJ0Ol9odHRwJzsKZXhwb3J0ICdkYXJ0Ol9pbnRlcm5hbCcgc2hvdyBIdHRwU3RhdHVzOwoKcGFydCAnYnl0ZXNfYnVpbGRlci5kYXJ0JzsKcGFydCAnY29tbW9uLmRhcnQnOwpwYXJ0ICdkYXRhX3RyYW5zZm9ybWVyLmRhcnQnOwpwYXJ0ICdkaXJlY3RvcnkuZGFydCc7CnBhcnQgJ2RpcmVjdG9yeV9pbXBsLmRhcnQnOwpwYXJ0ICdlbWJlZGRlcl9jb25maWcuZGFydCc7CnBhcnQgJ2V2ZW50aGFuZGxlci5kYXJ0JzsKcGFydCAnZmlsZS5kYXJ0JzsKcGFydCAnZmlsZV9pbXBsLmRhcnQnOwpwYXJ0ICdmaWxlX3N5c3RlbV9lbnRpdHkuZGFydCc7CnBhcnQgJ2lvX3Jlc291cmNlX2luZm8uZGFydCc7CnBhcnQgJ2lvX3NpbmsuZGFydCc7CnBhcnQgJ2lvX3NlcnZpY2UuZGFydCc7CnBhcnQgJ2xpbmsuZGFydCc7CnBhcnQgJ25hbWVzcGFjZV9pbXBsLmRhcnQnOwpwYXJ0ICdvdmVycmlkZXMuZGFydCc7CnBhcnQgJ3BsYXRmb3JtLmRhcnQnOwpwYXJ0ICdwbGF0Zm9ybV9pbXBsLmRhcnQnOwpwYXJ0ICdwcm9jZXNzLmRhcnQnOwpwYXJ0ICdzZWN1cmVfc2VydmVyX3NvY2tldC5kYXJ0JzsKcGFydCAnc2VjdXJlX3NvY2tldC5kYXJ0JzsKcGFydCAnc2VjdXJpdHlfY29udGV4dC5kYXJ0JzsKcGFydCAnc2VydmljZV9vYmplY3QuZGFydCc7CnBhcnQgJ3NvY2tldC5kYXJ0JzsKcGFydCAnc3RkaW8uZGFydCc7CnBhcnQgJ3N0cmluZ190cmFuc2Zvcm1lci5kYXJ0JzsKcGFydCAnc3luY19zb2NrZXQuZGFydCc7CoDlAE5OPAEERwNFShQDPDtAPyI0AywDGQNAPAMgA0RAA0Y0Ay1JA0IrAxcDPDpLAyQzMjopAzsWLBIwCwsDIAMtNgM/IEQ4H0o+Aw4DOhdLGgM7KysnCwNNTk9ITRUDGU8rAxADTE0DSlQaQDhAEwMbQDEoQycNDTgDRTBCEANHJAMRaTwDHgNMRUdFAywgKjsPDQM8G0keEAM5KAsDPEIXAzADP0EDSh4DIgMoAysDQgNAMQM0PgMxAxIEEQEVJRlLFyIXFBoBFSkBGxQeFxwdGhIXIB4VGBIcFxYbFSIbHhwUEyAZAQdkYXJ0OmlvNG9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vZGlyZWN0b3J5X3BhdGNoLmRhcnSJLi8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb21tb25fcGF0Y2guZGFydCI7CgpAcGF0Y2gKY2xhc3MgX0RpcmVjdG9yeSB7CiAgQHBhdGNoCiAgc3RhdGljIF9jdXJyZW50KF9OYW1lc3BhY2UgbmFtZXNwYWNlKSBuYXRpdmUgIkRpcmVjdG9yeV9DdXJyZW50IjsKICBAcGF0Y2gKICBzdGF0aWMgX3NldEN1cnJlbnQoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKQogICAgICBuYXRpdmUgIkRpcmVjdG9yeV9TZXRDdXJyZW50IjsKICBAcGF0Y2gKICBzdGF0aWMgX2NyZWF0ZVRlbXAoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKQogICAgICBuYXRpdmUgIkRpcmVjdG9yeV9DcmVhdGVUZW1wIjsKICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIF9zeXN0ZW1UZW1wKF9OYW1lc3BhY2UgbmFtZXNwYWNlKSBuYXRpdmUgIkRpcmVjdG9yeV9TeXN0ZW1UZW1wIjsKICBAcGF0Y2gKICBzdGF0aWMgX2V4aXN0cyhfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpCiAgICAgIG5hdGl2ZSAiRGlyZWN0b3J5X0V4aXN0cyI7CiAgQHBhdGNoCiAgc3RhdGljIF9jcmVhdGUoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKQogICAgICBuYXRpdmUgIkRpcmVjdG9yeV9DcmVhdGUiOwogIEBwYXRjaAogIHN0YXRpYyBfZGVsZXRlTmF0aXZlKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwgYm9vbCByZWN1cnNpdmUpCiAgICAgIG5hdGl2ZSAiRGlyZWN0b3J5X0RlbGV0ZSI7CiAgQHBhdGNoCiAgc3RhdGljIF9yZW5hbWUoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoLCBTdHJpbmcgbmV3UGF0aCkKICAgICAgbmF0aXZlICJEaXJlY3RvcnlfUmVuYW1lIjsKICBAcGF0Y2gKICBzdGF0aWMgdm9pZCBfZmlsbFdpdGhEaXJlY3RvcnlMaXN0aW5nKAogICAgICBfTmFtZXNwYWNlIG5hbWVzcGFjZSwKICAgICAgTGlzdDxGaWxlU3lzdGVtRW50aXR5PiBsaXN0LAogICAgICBVaW50OExpc3QgcmF3UGF0aCwKICAgICAgYm9vbCByZWN1cnNpdmUsCiAgICAgIGJvb2wgZm9sbG93TGlua3MpIG5hdGl2ZSAiRGlyZWN0b3J5X0ZpbGxXaXRoRGlyZWN0b3J5TGlzdGluZyI7Cn0KCkBwYXRjaApjbGFzcyBfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHMgewogIEBwYXRjaAogIGZhY3RvcnkgX0FzeW5jRGlyZWN0b3J5TGlzdGVyT3BzKGludCBwb2ludGVyKSA9PgogICAgICBuZXcgX0FzeW5jRGlyZWN0b3J5TGlzdGVyT3BzSW1wbChwb2ludGVyKTsKfQoKY2xhc3MgX0FzeW5jRGlyZWN0b3J5TGlzdGVyT3BzSW1wbCBleHRlbmRzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMQogICAgaW1wbGVtZW50cyBfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHMgewogIF9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wc0ltcGwuXygpOwoKICBmYWN0b3J5IF9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wc0ltcGwoaW50IHBvaW50ZXIpID0+CiAgICAgIG5ldyBfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHNJbXBsLl8oKS4uX3NldFBvaW50ZXIocG9pbnRlcik7CgogIHZvaWQgX3NldFBvaW50ZXIoaW50IHBvaW50ZXIpCiAgICAgIG5hdGl2ZSAiRGlyZWN0b3J5X1NldEFzeW5jRGlyZWN0b3J5TGlzdGVyUG9pbnRlciI7CiAgaW50IGdldFBvaW50ZXIoKSBuYXRpdmUgIkRpcmVjdG9yeV9HZXRBc3luY0RpcmVjdG9yeUxpc3RlclBvaW50ZXIiOwp9CgovLyBDb3JlbGliICdVcmkuYmFzZScgaW1wbGVtZW50YXRpb24uCi8vIFVyaS5iYXNlIGlzIHN1c2NlcHRpYmxlIHRvIGNoYW5nZXMgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuClVyaSBfdXJpQmFzZUNsb3N1cmUoKSB7CiAgdmFyIHJlc3VsdCA9IF9EaXJlY3RvcnkuX2N1cnJlbnQoX05hbWVzcGFjZS5fbmFtZXNwYWNlKTsKICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKAogICAgICAgICJHZXR0aW5nIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZmFpbGVkIiwgIiIsIHJlc3VsdCk7CiAgfQogIHJldHVybiBuZXcgVXJpLmRpcmVjdG9yeShyZXN1bHQpOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKX2dldFVyaUJhc2VDbG9zdXJlKCkgPT4gX3VyaUJhc2VDbG9zdXJlOwpJAE5OPAEgAQcTCUQJPiUJPiUJUQk6IQk6IQlQIQlKIQkpHCMZFkUCAQchCTMxAgFEKiQBN0IBIDlGAgEmSBg7GyNBBCQCASIpASJkYXJ0OmlvLXBhdGNoL2RpcmVjdG9yeV9wYXRjaC5kYXJ0L29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vZmlsZV9wYXRjaC5kYXJ0s9kvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29tbW9uX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIF9GaWxlIHsKICBAcGF0Y2gKICBzdGF0aWMgX2V4aXN0cyhfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpIG5hdGl2ZSAiRmlsZV9FeGlzdHMiOwogIEBwYXRjaAogIHN0YXRpYyBfY3JlYXRlKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCkgbmF0aXZlICJGaWxlX0NyZWF0ZSI7CiAgQHBhdGNoCiAgc3RhdGljIF9jcmVhdGVMaW5rKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwgU3RyaW5nIHRhcmdldCkKICAgICAgbmF0aXZlICJGaWxlX0NyZWF0ZUxpbmsiOwogIEBwYXRjaAogIHN0YXRpYyBfbGlua1RhcmdldChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpCiAgICAgIG5hdGl2ZSAiRmlsZV9MaW5rVGFyZ2V0IjsKICBAcGF0Y2gKICBzdGF0aWMgX2RlbGV0ZU5hdGl2ZShfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpCiAgICAgIG5hdGl2ZSAiRmlsZV9EZWxldGUiOwogIEBwYXRjaAogIHN0YXRpYyBfZGVsZXRlTGlua05hdGl2ZShfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpCiAgICAgIG5hdGl2ZSAiRmlsZV9EZWxldGVMaW5rIjsKICBAcGF0Y2gKICBzdGF0aWMgX3JlbmFtZShfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoKQogICAgICBuYXRpdmUgIkZpbGVfUmVuYW1lIjsKICBAcGF0Y2gKICBzdGF0aWMgX3JlbmFtZUxpbmsoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCkKICAgICAgbmF0aXZlICJGaWxlX1JlbmFtZUxpbmsiOwogIEBwYXRjaAogIHN0YXRpYyBfY29weShfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoKQogICAgICBuYXRpdmUgIkZpbGVfQ29weSI7CiAgQHBhdGNoCiAgc3RhdGljIF9sZW5ndGhGcm9tUGF0aChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpCiAgICAgIG5hdGl2ZSAiRmlsZV9MZW5ndGhGcm9tUGF0aCI7CiAgQHBhdGNoCiAgc3RhdGljIF9sYXN0TW9kaWZpZWQoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKQogICAgICBuYXRpdmUgIkZpbGVfTGFzdE1vZGlmaWVkIjsKICBAcGF0Y2gKICBzdGF0aWMgX3NldExhc3RNb2RpZmllZChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgsIGludCBtaWxsaXMpCiAgICAgIG5hdGl2ZSAiRmlsZV9TZXRMYXN0TW9kaWZpZWQiOwogIEBwYXRjaAogIHN0YXRpYyBfbGFzdEFjY2Vzc2VkKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCkKICAgICAgbmF0aXZlICJGaWxlX0xhc3RBY2Nlc3NlZCI7CiAgQHBhdGNoCiAgc3RhdGljIF9zZXRMYXN0QWNjZXNzZWQoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoLCBpbnQgbWlsbGlzKQogICAgICBuYXRpdmUgIkZpbGVfU2V0TGFzdEFjY2Vzc2VkIjsKICBAcGF0Y2gKICBzdGF0aWMgX29wZW4oX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoLCBpbnQgbW9kZSkKICAgICAgbmF0aXZlICJGaWxlX09wZW4iOwogIEBwYXRjaAogIHN0YXRpYyBpbnQgX29wZW5TdGRpbyhpbnQgZmQpIG5hdGl2ZSAiRmlsZV9PcGVuU3RkaW8iOwp9CgpAcGF0Y2gKY2xhc3MgX1JhbmRvbUFjY2Vzc0ZpbGVPcHMgewogIEBwYXRjaAogIGZhY3RvcnkgX1JhbmRvbUFjY2Vzc0ZpbGVPcHMoaW50IHBvaW50ZXIpID0+CiAgICAgIG5ldyBfUmFuZG9tQWNjZXNzRmlsZU9wc0ltcGwocG9pbnRlcik7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1JhbmRvbUFjY2Vzc0ZpbGVPcHNJbXBsIGV4dGVuZHMgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3MxCiAgICBpbXBsZW1lbnRzIF9SYW5kb21BY2Nlc3NGaWxlT3BzIHsKICBfUmFuZG9tQWNjZXNzRmlsZU9wc0ltcGwuXygpOwoKICBmYWN0b3J5IF9SYW5kb21BY2Nlc3NGaWxlT3BzSW1wbChpbnQgcG9pbnRlcikgPT4KICAgICAgbmV3IF9SYW5kb21BY2Nlc3NGaWxlT3BzSW1wbC5fKCkuLl9zZXRQb2ludGVyKHBvaW50ZXIpOwoKICB2b2lkIF9zZXRQb2ludGVyKGludCBwb2ludGVyKSBuYXRpdmUgIkZpbGVfU2V0UG9pbnRlciI7CgogIGludCBnZXRQb2ludGVyKCkgbmF0aXZlICJGaWxlX0dldFBvaW50ZXIiOwogIGludCBjbG9zZSgpIG5hdGl2ZSAiRmlsZV9DbG9zZSI7CiAgcmVhZEJ5dGUoKSBuYXRpdmUgIkZpbGVfUmVhZEJ5dGUiOwogIHJlYWQoaW50IGJ5dGVzKSBuYXRpdmUgIkZpbGVfUmVhZCI7CiAgcmVhZEludG8oTGlzdDxpbnQ+IGJ1ZmZlciwgaW50IHN0YXJ0LCBpbnQgZW5kKSBuYXRpdmUgIkZpbGVfUmVhZEludG8iOwogIHdyaXRlQnl0ZShpbnQgdmFsdWUpIG5hdGl2ZSAiRmlsZV9Xcml0ZUJ5dGUiOwogIHdyaXRlRnJvbShMaXN0PGludD4gYnVmZmVyLCBpbnQgc3RhcnQsIGludCBlbmQpIG5hdGl2ZSAiRmlsZV9Xcml0ZUZyb20iOwogIHBvc2l0aW9uKCkgbmF0aXZlICJGaWxlX1Bvc2l0aW9uIjsKICBzZXRQb3NpdGlvbihpbnQgcG9zaXRpb24pIG5hdGl2ZSAiRmlsZV9TZXRQb3NpdGlvbiI7CiAgdHJ1bmNhdGUoaW50IGxlbmd0aCkgbmF0aXZlICJGaWxlX1RydW5jYXRlIjsKICBsZW5ndGgoKSBuYXRpdmUgIkZpbGVfTGVuZ3RoIjsKICBmbHVzaCgpIG5hdGl2ZSAiRmlsZV9GbHVzaCI7CiAgbG9jayhpbnQgbG9jaywgaW50IHN0YXJ0LCBpbnQgZW5kKSBuYXRpdmUgIkZpbGVfTG9jayI7Cn0KCmNsYXNzIF9XYXRjaGVyUGF0aCB7CiAgZmluYWwgaW50IHBhdGhJZDsKICBmaW5hbCBTdHJpbmcgcGF0aDsKICBmaW5hbCBpbnQgZXZlbnRzOwogIGludCBjb3VudCA9IDA7CiAgX1dhdGNoZXJQYXRoKHRoaXMucGF0aElkLCB0aGlzLnBhdGgsIHRoaXMuZXZlbnRzKTsKfQoKQHBhdGNoCmNsYXNzIF9GaWxlU3lzdGVtV2F0Y2hlciB7CiAgdm9pZCBfcGF0aFdhdGNoZWRFbmQoKTsKCiAgc3RhdGljIGludCBfaWQ7CiAgc3RhdGljIGZpbmFsIE1hcDxpbnQsIF9XYXRjaGVyUGF0aD4gX2lkTWFwID0ge307CgogIGZpbmFsIFN0cmluZyBfcGF0aDsKICBmaW5hbCBpbnQgX2V2ZW50czsKICBmaW5hbCBib29sIF9yZWN1cnNpdmU7CgogIF9XYXRjaGVyUGF0aCBfd2F0Y2hlclBhdGg7CgogIFN0cmVhbUNvbnRyb2xsZXI8RmlsZVN5c3RlbUV2ZW50PiBfYnJvYWRjYXN0Q29udHJvbGxlcjsKCiAgQHBhdGNoCiAgc3RhdGljIFN0cmVhbTxGaWxlU3lzdGVtRXZlbnQ+IF93YXRjaCgKICAgICAgU3RyaW5nIHBhdGgsIGludCBldmVudHMsIGJvb2wgcmVjdXJzaXZlKSB7CiAgICBpZiAoUGxhdGZvcm0uaXNMaW51eCkgewogICAgICByZXR1cm4gbmV3IF9Jbm90aWZ5RmlsZVN5c3RlbVdhdGNoZXIocGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpLl9zdHJlYW07CiAgICB9CiAgICBpZiAoUGxhdGZvcm0uaXNXaW5kb3dzKSB7CiAgICAgIHJldHVybiBuZXcgX1dpbjMyRmlsZVN5c3RlbVdhdGNoZXIocGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpLl9zdHJlYW07CiAgICB9CiAgICBpZiAoUGxhdGZvcm0uaXNNYWNPUykgewogICAgICByZXR1cm4gbmV3IF9GU0V2ZW50U3RyZWFtRmlsZVN5c3RlbVdhdGNoZXIocGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpCiAgICAgICAgICAuX3N0cmVhbTsKICAgIH0KICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKAogICAgICAgICJGaWxlIHN5c3RlbSB3YXRjaGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKICB9CgogIF9GaWxlU3lzdGVtV2F0Y2hlci5fKHRoaXMuX3BhdGgsIHRoaXMuX2V2ZW50cywgdGhpcy5fcmVjdXJzaXZlKSB7CiAgICBpZiAoIWlzU3VwcG9ydGVkKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKAogICAgICAgICAgIkZpbGUgc3lzdGVtIHdhdGNoaW5nIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIsIF9wYXRoKTsKICAgIH0KICAgIF9icm9hZGNhc3RDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8RmlsZVN5c3RlbUV2ZW50Pi5icm9hZGNhc3QoCiAgICAgICAgb25MaXN0ZW46IF9saXN0ZW4sIG9uQ2FuY2VsOiBfY2FuY2VsKTsKICB9CgogIFN0cmVhbTxGaWxlU3lzdGVtRXZlbnQ+IGdldCBfc3RyZWFtID0+IF9icm9hZGNhc3RDb250cm9sbGVyLnN0cmVhbTsKCiAgdm9pZCBfbGlzdGVuKCkgewogICAgaWYgKF9pZCA9PSBudWxsKSB7CiAgICAgIHRyeSB7CiAgICAgICAgX2lkID0gX2luaXRXYXRjaGVyKCk7CiAgICAgICAgX25ld1dhdGNoZXIoKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIF9icm9hZGNhc3RDb250cm9sbGVyLmFkZEVycm9yKG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKAogICAgICAgICAgICAiRmFpbGVkIHRvIGluaXRpYWxpemUgZmlsZSBzeXN0ZW0gZW50aXR5IHdhdGNoZXIiLCBudWxsLCBlKSk7CiAgICAgICAgX2Jyb2FkY2FzdENvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIHZhciBwYXRoSWQ7CiAgICB0cnkgewogICAgICBwYXRoSWQgPQogICAgICAgICAgX3dhdGNoUGF0aChfaWQsIF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3BhdGgsIF9ldmVudHMsIF9yZWN1cnNpdmUpOwogICAgfSBjYXRjaCAoZSkgewogICAgICBfYnJvYWRjYXN0Q29udHJvbGxlcgogICAgICAgICAgLmFkZEVycm9yKG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJGYWlsZWQgdG8gd2F0Y2ggcGF0aCIsIF9wYXRoLCBlKSk7CiAgICAgIF9icm9hZGNhc3RDb250cm9sbGVyLmNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghX2lkTWFwLmNvbnRhaW5zS2V5KHBhdGhJZCkpIHsKICAgICAgX2lkTWFwW3BhdGhJZF0gPSBuZXcgX1dhdGNoZXJQYXRoKHBhdGhJZCwgX3BhdGgsIF9ldmVudHMpOwogICAgfQogICAgX3dhdGNoZXJQYXRoID0gX2lkTWFwW3BhdGhJZF07CiAgICBfd2F0Y2hlclBhdGguY291bnQrKzsKICAgIF9wYXRoV2F0Y2hlZCgpLnBpcGUoX2Jyb2FkY2FzdENvbnRyb2xsZXIpOwogIH0KCiAgdm9pZCBfY2FuY2VsKCkgewogICAgaWYgKF93YXRjaGVyUGF0aCAhPSBudWxsKSB7CiAgICAgIGFzc2VydChfd2F0Y2hlclBhdGguY291bnQgPiAwKTsKICAgICAgX3dhdGNoZXJQYXRoLmNvdW50LS07CiAgICAgIGlmIChfd2F0Y2hlclBhdGguY291bnQgPT0gMCkgewogICAgICAgIF91bndhdGNoUGF0aChfaWQsIF93YXRjaGVyUGF0aC5wYXRoSWQpOwogICAgICAgIF9wYXRoV2F0Y2hlZEVuZCgpOwogICAgICAgIF9pZE1hcC5yZW1vdmUoX3dhdGNoZXJQYXRoLnBhdGhJZCk7CiAgICAgIH0KICAgICAgX3dhdGNoZXJQYXRoID0gbnVsbDsKICAgIH0KICAgIGlmIChfaWRNYXAuaXNFbXB0eSAmJiBfaWQgIT0gbnVsbCkgewogICAgICBfY2xvc2VXYXRjaGVyKF9pZCk7CiAgICAgIF9kb25lV2F0Y2hlcigpOwogICAgICBfaWQgPSBudWxsOwogICAgfQogIH0KCiAgLy8gQ2FsbGVkIHdoZW4gKGFuZCBhZnRlcikgYSBuZXcgd2F0Y2hlciBpbnN0YW5jZSBpcyBjcmVhdGVkIGFuZCBhdmFpbGFibGUuCiAgdm9pZCBfbmV3V2F0Y2hlcigpIHt9CiAgLy8gQ2FsbGVkIHdoZW4gYSB3YXRjaGVyIGlzIG5vIGxvbmdlciBuZWVkZWQuCiAgdm9pZCBfZG9uZVdhdGNoZXIoKSB7fQogIC8vIENhbGxlZCB3aGVuIGEgbmV3IHBhdGggaXMgYmVpbmcgd2F0Y2hlZC4KICBTdHJlYW0gX3BhdGhXYXRjaGVkKCkge30KICAvLyBDYWxsZWQgd2hlbiBhIHBhdGggaXMgbm8gbG9uZ2VyIGJlaW5nIHdhdGNoZWQuCiAgdm9pZCBfZG9uZVBhdGhXYXRjaGVkKCkge30KCiAgc3RhdGljIF9XYXRjaGVyUGF0aCBfcGF0aEZyb21QYXRoSWQoaW50IHBhdGhJZCkgewogICAgcmV0dXJuIF9pZE1hcFtwYXRoSWRdOwogIH0KCiAgc3RhdGljIFN0cmVhbSBfbGlzdGVuT25Tb2NrZXQoaW50IHNvY2tldElkLCBpbnQgaWQsIGludCBwYXRoSWQpIHsKICAgIHZhciBuYXRpdmUgPSBuZXcgX05hdGl2ZVNvY2tldC53YXRjaChzb2NrZXRJZCk7CiAgICB2YXIgc29ja2V0ID0gbmV3IF9SYXdTb2NrZXQobmF0aXZlKTsKICAgIHJldHVybiBzb2NrZXQuZXhwYW5kKChldmVudCkgewogICAgICB2YXIgc3RvcHMgPSBbXTsKICAgICAgdmFyIGV2ZW50cyA9IFtdOwogICAgICB2YXIgcGFpciA9IHt9OwogICAgICBpZiAoZXZlbnQgPT0gUmF3U29ja2V0RXZlbnQucmVhZCkgewogICAgICAgIFN0cmluZyBnZXRQYXRoKGV2ZW50KSB7CiAgICAgICAgICB2YXIgcGF0aCA9IF9wYXRoRnJvbVBhdGhJZChldmVudFs0XSkucGF0aDsKICAgICAgICAgIGlmIChldmVudFsyXSAhPSBudWxsICYmIGV2ZW50WzJdLmlzTm90RW1wdHkpIHsKICAgICAgICAgICAgcGF0aCArPSBQbGF0Zm9ybS5wYXRoU2VwYXJhdG9yOwogICAgICAgICAgICBwYXRoICs9IGV2ZW50WzJdOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgICAgfQoKICAgICAgICBib29sIGdldElzRGlyKGV2ZW50KSB7CiAgICAgICAgICBpZiAoUGxhdGZvcm0uaXNXaW5kb3dzKSB7CiAgICAgICAgICAgIC8vIFdpbmRvd3MgZG9lcyBub3QgZ2V0ICdpc0RpcicgYXMgcGFydCBvZiB0aGUgZXZlbnQuCiAgICAgICAgICAgIHJldHVybiBGaWxlU3lzdGVtRW50aXR5LmlzRGlyZWN0b3J5U3luYyhnZXRQYXRoKGV2ZW50KSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gKGV2ZW50WzBdICYgRmlsZVN5c3RlbUV2ZW50Ll9pc0RpcikgIT0gMDsKICAgICAgICB9CgogICAgICAgIHZvaWQgYWRkKGlkLCBldmVudCkgewogICAgICAgICAgaWYgKChldmVudC50eXBlICYgX3BhdGhGcm9tUGF0aElkKGlkKS5ldmVudHMpID09IDApIHJldHVybjsKICAgICAgICAgIGV2ZW50cy5hZGQoW2lkLCBldmVudF0pOwogICAgICAgIH0KCiAgICAgICAgdm9pZCByZXdyaXRlTW92ZShldmVudCwgaXNEaXIpIHsKICAgICAgICAgIGlmIChldmVudFszXSkgewogICAgICAgICAgICBhZGQoZXZlbnRbNF0sIG5ldyBGaWxlU3lzdGVtQ3JlYXRlRXZlbnQuXyhnZXRQYXRoKGV2ZW50KSwgaXNEaXIpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFkZChldmVudFs0XSwgbmV3IEZpbGVTeXN0ZW1EZWxldGVFdmVudC5fKGdldFBhdGgoZXZlbnQpLCBpc0RpcikpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaW50IGV2ZW50Q291bnQ7CiAgICAgICAgZG8gewogICAgICAgICAgZXZlbnRDb3VudCA9IDA7CiAgICAgICAgICBmb3IgKHZhciBldmVudCBpbiBfcmVhZEV2ZW50cyhpZCwgcGF0aElkKSkgewogICAgICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCkgY29udGludWU7CiAgICAgICAgICAgIGV2ZW50Q291bnQrKzsKICAgICAgICAgICAgaW50IHBhdGhJZCA9IGV2ZW50WzRdOwogICAgICAgICAgICBpZiAoIV9pZE1hcC5jb250YWluc0tleShwYXRoSWQpKSB7CiAgICAgICAgICAgICAgLy8gUGF0aCBpcyBubyBsb25nZXIgYmVpbmcgd2F0aGVkLgogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJvb2wgaXNEaXIgPSBnZXRJc0RpcihldmVudCk7CiAgICAgICAgICAgIHZhciBwYXRoID0gZ2V0UGF0aChldmVudCk7CiAgICAgICAgICAgIGlmICgoZXZlbnRbMF0gJiBGaWxlU3lzdGVtRXZlbnQuY3JlYXRlKSAhPSAwKSB7CiAgICAgICAgICAgICAgYWRkKGV2ZW50WzRdLCBuZXcgRmlsZVN5c3RlbUNyZWF0ZUV2ZW50Ll8ocGF0aCwgaXNEaXIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKGV2ZW50WzBdICYgRmlsZVN5c3RlbUV2ZW50Lm1vZGlmeSkgIT0gMCkgewogICAgICAgICAgICAgIGFkZChldmVudFs0XSwgbmV3IEZpbGVTeXN0ZW1Nb2RpZnlFdmVudC5fKHBhdGgsIGlzRGlyLCB0cnVlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChldmVudFswXSAmIEZpbGVTeXN0ZW1FdmVudC5fbW9kaWZ5QXR0cmlidXRlcykgIT0gMCkgewogICAgICAgICAgICAgIGFkZChldmVudFs0XSwgbmV3IEZpbGVTeXN0ZW1Nb2RpZnlFdmVudC5fKHBhdGgsIGlzRGlyLCBmYWxzZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoZXZlbnRbMF0gJiBGaWxlU3lzdGVtRXZlbnQubW92ZSkgIT0gMCkgewogICAgICAgICAgICAgIGludCBsaW5rID0gZXZlbnRbMV07CiAgICAgICAgICAgICAgaWYgKGxpbmsgPiAwKSB7CiAgICAgICAgICAgICAgICBwYWlyLnB1dElmQWJzZW50KHBhdGhJZCwgKCkgPT4ge30pOwogICAgICAgICAgICAgICAgaWYgKHBhaXJbcGF0aElkXS5jb250YWluc0tleShsaW5rKSkgewogICAgICAgICAgICAgICAgICBhZGQoCiAgICAgICAgICAgICAgICAgICAgICBldmVudFs0XSwKICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlU3lzdGVtTW92ZUV2ZW50Ll8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGF0aChwYWlyW3BhdGhJZF1bbGlua10pLCBpc0RpciwgcGF0aCkpOwogICAgICAgICAgICAgICAgICBwYWlyW3BhdGhJZF0ucmVtb3ZlKGxpbmspOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcGFpcltwYXRoSWRdW2xpbmtdID0gZXZlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJld3JpdGVNb3ZlKGV2ZW50LCBpc0Rpcik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoZXZlbnRbMF0gJiBGaWxlU3lzdGVtRXZlbnQuZGVsZXRlKSAhPSAwKSB7CiAgICAgICAgICAgICAgYWRkKGV2ZW50WzRdLCBuZXcgRmlsZVN5c3RlbURlbGV0ZUV2ZW50Ll8ocGF0aCwgaXNEaXIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKGV2ZW50WzBdICYgRmlsZVN5c3RlbUV2ZW50Ll9kZWxldGVTZWxmKSAhPSAwKSB7CiAgICAgICAgICAgICAgYWRkKGV2ZW50WzRdLCBuZXcgRmlsZVN5c3RlbURlbGV0ZUV2ZW50Ll8ocGF0aCwgaXNEaXIpKTsKICAgICAgICAgICAgICAvLyBTaWduYWwgZG9uZSBldmVudC4KICAgICAgICAgICAgICBzdG9wcy5hZGQoW2V2ZW50WzRdLCBudWxsXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlIChldmVudENvdW50ID4gMCk7CiAgICAgICAgLy8gQmUgc3VyZSB0byBjbGVhciB0aGlzIG1hbnVhbGx5LCBhcyB0aGUgc29ja2V0cyBhcmUgbm90IHJlYWQgdGhyb3VnaAogICAgICAgIC8vIHRoZSBfTmF0aXZlU29ja2V0IGludGVyZmFjZS4KICAgICAgICBuYXRpdmUuYXZhaWxhYmxlID0gMDsKICAgICAgICBmb3IgKHZhciBtYXAgaW4gcGFpci52YWx1ZXMpIHsKICAgICAgICAgIGZvciAodmFyIGV2ZW50IGluIG1hcC52YWx1ZXMpIHsKICAgICAgICAgICAgcmV3cml0ZU1vdmUoZXZlbnQsIGdldElzRGlyKGV2ZW50KSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IFJhd1NvY2tldEV2ZW50LmNsb3NlZCkgewogICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IFJhd1NvY2tldEV2ZW50LnJlYWRDbG9zZWQpIHsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoZmFsc2UpOwogICAgICB9CiAgICAgIGV2ZW50cy5hZGRBbGwoc3RvcHMpOwogICAgICByZXR1cm4gZXZlbnRzOwogICAgfSk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgYm9vbCBnZXQgaXNTdXBwb3J0ZWQgbmF0aXZlICJGaWxlU3lzdGVtV2F0Y2hlcl9Jc1N1cHBvcnRlZCI7CgogIHN0YXRpYyBpbnQgX2luaXRXYXRjaGVyKCkgbmF0aXZlICJGaWxlU3lzdGVtV2F0Y2hlcl9Jbml0V2F0Y2hlciI7CiAgc3RhdGljIHZvaWQgX2Nsb3NlV2F0Y2hlcihpbnQgaWQpIG5hdGl2ZSAiRmlsZVN5c3RlbVdhdGNoZXJfQ2xvc2VXYXRjaGVyIjsKCiAgc3RhdGljIGludCBfd2F0Y2hQYXRoKGludCBpZCwgX05hbWVzcGFjZSBuYW1lc3BhY2UsIFN0cmluZyBwYXRoLCBpbnQgZXZlbnRzLAogICAgICBib29sIHJlY3Vyc2l2ZSkgbmF0aXZlICJGaWxlU3lzdGVtV2F0Y2hlcl9XYXRjaFBhdGgiOwogIHN0YXRpYyB2b2lkIF91bndhdGNoUGF0aChpbnQgaWQsIGludCBwYXRoX2lkKQogICAgICBuYXRpdmUgIkZpbGVTeXN0ZW1XYXRjaGVyX1Vud2F0Y2hQYXRoIjsKICBzdGF0aWMgTGlzdCBfcmVhZEV2ZW50cyhpbnQgaWQsIGludCBwYXRoX2lkKQogICAgICBuYXRpdmUgIkZpbGVTeXN0ZW1XYXRjaGVyX1JlYWRFdmVudHMiOwogIHN0YXRpYyBpbnQgX2dldFNvY2tldElkKGludCBpZCwgaW50IHBhdGhfaWQpCiAgICAgIG5hdGl2ZSAiRmlsZVN5c3RlbVdhdGNoZXJfR2V0U29ja2V0SWQiOwp9CgpjbGFzcyBfSW5vdGlmeUZpbGVTeXN0ZW1XYXRjaGVyIGV4dGVuZHMgX0ZpbGVTeXN0ZW1XYXRjaGVyIHsKICBzdGF0aWMgZmluYWwgTWFwPGludCwgU3RyZWFtQ29udHJvbGxlcj4gX2lkTWFwID0ge307CiAgc3RhdGljIFN0cmVhbVN1YnNjcmlwdGlvbiBfc3Vic2NyaXB0aW9uOwoKICBfSW5vdGlmeUZpbGVTeXN0ZW1XYXRjaGVyKHBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKQogICAgICA6IHN1cGVyLl8ocGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpOwoKICB2b2lkIF9uZXdXYXRjaGVyKCkgewogICAgaW50IGlkID0gX0ZpbGVTeXN0ZW1XYXRjaGVyLl9pZDsKICAgIF9zdWJzY3JpcHRpb24gPQogICAgICAgIF9GaWxlU3lzdGVtV2F0Y2hlci5fbGlzdGVuT25Tb2NrZXQoaWQsIGlkLCAwKS5saXN0ZW4oKGV2ZW50KSB7CiAgICAgIGlmIChfaWRNYXAuY29udGFpbnNLZXkoZXZlbnRbMF0pKSB7CiAgICAgICAgaWYgKGV2ZW50WzFdICE9IG51bGwpIHsKICAgICAgICAgIF9pZE1hcFtldmVudFswXV0uYWRkKGV2ZW50WzFdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX2lkTWFwW2V2ZW50WzBdXS5jbG9zZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfQoKICB2b2lkIF9kb25lV2F0Y2hlcigpIHsKICAgIF9zdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgfQoKICBTdHJlYW0gX3BhdGhXYXRjaGVkKCkgewogICAgdmFyIHBhdGhJZCA9IF93YXRjaGVyUGF0aC5wYXRoSWQ7CiAgICBpZiAoIV9pZE1hcC5jb250YWluc0tleShwYXRoSWQpKSB7CiAgICAgIF9pZE1hcFtwYXRoSWRdID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8RmlsZVN5c3RlbUV2ZW50Pi5icm9hZGNhc3QoKTsKICAgIH0KICAgIHJldHVybiBfaWRNYXBbcGF0aElkXS5zdHJlYW07CiAgfQoKICB2b2lkIF9wYXRoV2F0Y2hlZEVuZCgpIHsKICAgIHZhciBwYXRoSWQgPSBfd2F0Y2hlclBhdGgucGF0aElkOwogICAgaWYgKCFfaWRNYXAuY29udGFpbnNLZXkocGF0aElkKSkgcmV0dXJuOwogICAgX2lkTWFwW3BhdGhJZF0uY2xvc2UoKTsKICAgIF9pZE1hcC5yZW1vdmUocGF0aElkKTsKICB9Cn0KCmNsYXNzIF9XaW4zMkZpbGVTeXN0ZW1XYXRjaGVyIGV4dGVuZHMgX0ZpbGVTeXN0ZW1XYXRjaGVyIHsKICBTdHJlYW1TdWJzY3JpcHRpb24gX3N1YnNjcmlwdGlvbjsKICBTdHJlYW1Db250cm9sbGVyIF9jb250cm9sbGVyOwoKICBfV2luMzJGaWxlU3lzdGVtV2F0Y2hlcihwYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSkKICAgICAgOiBzdXBlci5fKHBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKTsKCiAgU3RyZWFtIF9wYXRoV2F0Y2hlZCgpIHsKICAgIHZhciBwYXRoSWQgPSBfd2F0Y2hlclBhdGgucGF0aElkOwogICAgX2NvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxGaWxlU3lzdGVtRXZlbnQ+KCk7CiAgICBfc3Vic2NyaXB0aW9uID0KICAgICAgICBfRmlsZVN5c3RlbVdhdGNoZXIuX2xpc3Rlbk9uU29ja2V0KHBhdGhJZCwgMCwgcGF0aElkKS5saXN0ZW4oKGV2ZW50KSB7CiAgICAgIGFzc2VydChldmVudFswXSA9PSBwYXRoSWQpOwogICAgICBpZiAoZXZlbnRbMV0gIT0gbnVsbCkgewogICAgICAgIF9jb250cm9sbGVyLmFkZChldmVudFsxXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuc3RyZWFtOwogIH0KCiAgdm9pZCBfcGF0aFdhdGNoZWRFbmQoKSB7CiAgICBfc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICB9Cn0KCmNsYXNzIF9GU0V2ZW50U3RyZWFtRmlsZVN5c3RlbVdhdGNoZXIgZXh0ZW5kcyBfRmlsZVN5c3RlbVdhdGNoZXIgewogIFN0cmVhbVN1YnNjcmlwdGlvbiBfc3Vic2NyaXB0aW9uOwogIFN0cmVhbUNvbnRyb2xsZXIgX2NvbnRyb2xsZXI7CgogIF9GU0V2ZW50U3RyZWFtRmlsZVN5c3RlbVdhdGNoZXIocGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpCiAgICAgIDogc3VwZXIuXyhwYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSk7CgogIFN0cmVhbSBfcGF0aFdhdGNoZWQoKSB7CiAgICB2YXIgcGF0aElkID0gX3dhdGNoZXJQYXRoLnBhdGhJZDsKICAgIHZhciBzb2NrZXRJZCA9IF9GaWxlU3lzdGVtV2F0Y2hlci5fZ2V0U29ja2V0SWQoMCwgcGF0aElkKTsKICAgIF9jb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8RmlsZVN5c3RlbUV2ZW50PigpOwogICAgX3N1YnNjcmlwdGlvbiA9CiAgICAgICAgX0ZpbGVTeXN0ZW1XYXRjaGVyLl9saXN0ZW5PblNvY2tldChzb2NrZXRJZCwgMCwgcGF0aElkKS5saXN0ZW4oKGV2ZW50KSB7CiAgICAgIGlmIChldmVudFsxXSAhPSBudWxsKSB7CiAgICAgICAgX2NvbnRyb2xsZXIuYWRkKGV2ZW50WzFdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiBfY29udHJvbGxlci5zdHJlYW07CiAgfQoKICB2b2lkIF9wYXRoV2F0Y2hlZEVuZCgpIHsKICAgIF9zdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICBfY29udHJvbGxlci5jbG9zZSgpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpClVpbnQ4TGlzdCBfbWFrZVVpbnQ4TGlzdFZpZXcoVWludDhMaXN0IHNvdXJjZSwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpIHsKICByZXR1cm4gbmV3IFVpbnQ4TGlzdC52aWV3KHNvdXJjZS5idWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7Cn0KgacATk48ASABBw4JUAlQCU0gCT4gCUAcCUQgCUocCU4gCUgaCUIkCUAiCU8lCUAiCU8lCUIaCTkCAQcdCS8tAgEaQCYgATM+AToBLSMlJkkwSyU3LyEfOQIBFRQVFBE1AgEHGxoBEjMBFhUZAR0BOgEJKTEcTQYeSwYcShQGI0MEAUQYJUwGTC8EAUYBExcMHhcUP0omEAgGEAoPThIbUCQOBidBBiMaLwQBEyAmHCUwGywIGwYpGhYSBgQBThgwGS4bNB0BNBsEAUQ0KSMWFxUqIDU5LB4MFwoBHyRCRQw7CgEeRiMKASkaTxNPDAoBGA0aNykaIy8xGA4qJzxHDjxNDkdODjojHjQ2FyAxRi0ZLhIXKxAOPEcOQUckKw4MIk8oHicqMQwKMzcPFwgcFQgEAQlGAURNAU88MC4vLS8uAgE9NysBNSoBFyUURyogKhEkCggIBAEYHAQBGiYnSgYiBAEbJi0cGwQCATskIAEzKgEaJjsUTyIeIw8dCAgfBAEbHBkEAgFDJCABOyoBGiY/OxRRHiMPHQgIHwQBGxwZBAIBIlBDAgEdZGFydDppby1wYXRjaC9maWxlX3BhdGNoLmRhcnQxb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2Jpbi9maWx0ZXJfcGF0Y2guZGFydIauLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvbW1vbl9wYXRjaC5kYXJ0IjsKCmNsYXNzIF9GaWx0ZXJJbXBsIGV4dGVuZHMgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3MxIGltcGxlbWVudHMgUmF3WkxpYkZpbHRlciB7CiAgdm9pZCBwcm9jZXNzKExpc3Q8aW50PiBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQpIG5hdGl2ZSAiRmlsdGVyX1Byb2Nlc3MiOwoKICBMaXN0PGludD4gcHJvY2Vzc2VkKHtib29sIGZsdXNoOiB0cnVlLCBib29sIGVuZDogZmFsc2V9KQogICAgICBuYXRpdmUgIkZpbHRlcl9Qcm9jZXNzZWQiOwp9CgpjbGFzcyBfWkxpYkluZmxhdGVGaWx0ZXIgZXh0ZW5kcyBfRmlsdGVySW1wbCB7CiAgX1pMaWJJbmZsYXRlRmlsdGVyKGludCB3aW5kb3dCaXRzLCBMaXN0PGludD4gZGljdGlvbmFyeSwgYm9vbCByYXcpIHsKICAgIF9pbml0KHdpbmRvd0JpdHMsIGRpY3Rpb25hcnksIHJhdyk7CiAgfQogIHZvaWQgX2luaXQoaW50IHdpbmRvd0JpdHMsIExpc3Q8aW50PiBkaWN0aW9uYXJ5LCBib29sIHJhdykKICAgICAgbmF0aXZlICJGaWx0ZXJfQ3JlYXRlWkxpYkluZmxhdGUiOwp9CgpjbGFzcyBfWkxpYkRlZmxhdGVGaWx0ZXIgZXh0ZW5kcyBfRmlsdGVySW1wbCB7CiAgX1pMaWJEZWZsYXRlRmlsdGVyKGJvb2wgZ3ppcCwgaW50IGxldmVsLCBpbnQgd2luZG93Qml0cywgaW50IG1lbUxldmVsLAogICAgICBpbnQgc3RyYXRlZ3ksIExpc3Q8aW50PiBkaWN0aW9uYXJ5LCBib29sIHJhdykgewogICAgX2luaXQoZ3ppcCwgbGV2ZWwsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwgZGljdGlvbmFyeSwgcmF3KTsKICB9CiAgdm9pZCBfaW5pdChib29sIGd6aXAsIGludCBsZXZlbCwgaW50IHdpbmRvd0JpdHMsIGludCBtZW1MZXZlbCwgaW50IHN0cmF0ZWd5LAogICAgICBMaXN0PGludD4gZGljdGlvbmFyeSwgYm9vbCByYXcpIG5hdGl2ZSAiRmlsdGVyX0NyZWF0ZVpMaWJEZWZsYXRlIjsKfQoKQHBhdGNoCmNsYXNzIFJhd1pMaWJGaWx0ZXIgewogIEBwYXRjaAogIHN0YXRpYyBSYXdaTGliRmlsdGVyIF9tYWtlWkxpYkRlZmxhdGVGaWx0ZXIoCiAgICAgICAgICBib29sIGd6aXAsCiAgICAgICAgICBpbnQgbGV2ZWwsCiAgICAgICAgICBpbnQgd2luZG93Qml0cywKICAgICAgICAgIGludCBtZW1MZXZlbCwKICAgICAgICAgIGludCBzdHJhdGVneSwKICAgICAgICAgIExpc3Q8aW50PiBkaWN0aW9uYXJ5LAogICAgICAgICAgYm9vbCByYXcpID0+CiAgICAgIG5ldyBfWkxpYkRlZmxhdGVGaWx0ZXIoCiAgICAgICAgICBnemlwLCBsZXZlbCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5LCBkaWN0aW9uYXJ5LCByYXcpOwogIEBwYXRjaAogIHN0YXRpYyBSYXdaTGliRmlsdGVyIF9tYWtlWkxpYkluZmxhdGVGaWx0ZXIoCiAgICAgICAgICBpbnQgd2luZG93Qml0cywgTGlzdDxpbnQ+IGRpY3Rpb25hcnksIGJvb2wgcmF3KSA9PgogICAgICBuZXcgX1pMaWJJbmZsYXRlRmlsdGVyKHdpbmRvd0JpdHMsIGRpY3Rpb25hcnksIHJhdyk7Cn0KMgBOTjwBIAFOTAE7IQIBL0coBD0pAgEvSTZJBE9JAgEHFgkvFRUaGBggFx5JCS89OwIBH2RhcnQ6aW8tcGF0Y2gvZmlsdGVyX3BhdGNoLmRhcnQ1b3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2Jpbi9pb19zZXJ2aWNlX3BhdGNoLmRhcnSLfS8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb21tb25fcGF0Y2guZGFydCI7CgpjbGFzcyBfSU9TZXJ2aWNlUG9ydHMgewogIC8vIFdlIGxpbWl0IHRoZSBudW1iZXIgb2YgSU8gU2VydmljZSBwb3J0cyBwZXIgaXNvbGF0ZSBzbyB0aGF0IHdlIGRvbid0CiAgLy8gc3Bhd24gdG9vIG1hbnkgdGhyZWFkcyBhbGwgYXQgb25jZSwgd2hpY2ggY2FuIGNyYXNoIHRoZSBWTSBvbiBXaW5kb3dzLgogIHN0YXRpYyBjb25zdCBpbnQgbWF4UG9ydHMgPSAzMjsKICBMaXN0PFNlbmRQb3J0PiBfcG9ydHMgPSA8U2VuZFBvcnQ+W107CiAgTGlzdDxTZW5kUG9ydD4gX2ZyZWVQb3J0cyA9IDxTZW5kUG9ydD5bXTsKICBNYXA8aW50LCBTZW5kUG9ydD4gX3VzZWRQb3J0cyA9IG5ldyBIYXNoTWFwPGludCwgU2VuZFBvcnQ+KCk7CgogIF9JT1NlcnZpY2VQb3J0cygpOwoKICBTZW5kUG9ydCBfZ2V0UG9ydChpbnQgZm9yUmVxdWVzdElkKSB7CiAgICBpZiAoX2ZyZWVQb3J0cy5pc0VtcHR5ICYmIF91c2VkUG9ydHMubGVuZ3RoIDwgbWF4UG9ydHMpIHsKICAgICAgZmluYWwgU2VuZFBvcnQgcG9ydCA9IF9uZXdTZXJ2aWNlUG9ydCgpOwogICAgICBfcG9ydHMuYWRkKHBvcnQpOwogICAgICBfZnJlZVBvcnRzLmFkZChwb3J0KTsKICAgIH0KICAgIGlmICghX2ZyZWVQb3J0cy5pc0VtcHR5KSB7CiAgICAgIGZpbmFsIFNlbmRQb3J0IHBvcnQgPSBfZnJlZVBvcnRzLnJlbW92ZUxhc3QoKTsKICAgICAgYXNzZXJ0KCFfdXNlZFBvcnRzLmNvbnRhaW5zS2V5KGZvclJlcXVlc3RJZCkpOwogICAgICBfdXNlZFBvcnRzW2ZvclJlcXVlc3RJZF0gPSBwb3J0OwogICAgICByZXR1cm4gcG9ydDsKICAgIH0KICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgdGhlIG1heCBudW1iZXIgb2YgcG9ydHMuIFJlLXVzZSBhbgogICAgLy8gZXhpc3Rpbmcgb25lLgogICAgZmluYWwgU2VuZFBvcnQgcG9ydCA9IF9wb3J0c1tmb3JSZXF1ZXN0SWQgJSBtYXhQb3J0c107CiAgICBfdXNlZFBvcnRzW2ZvclJlcXVlc3RJZF0gPSBwb3J0OwogICAgcmV0dXJuIHBvcnQ7CiAgfQoKICB2b2lkIF9yZXR1cm5Qb3J0KGludCBmb3JSZXF1ZXN0SWQpIHsKICAgIGZpbmFsIFNlbmRQb3J0IHBvcnQgPSBfdXNlZFBvcnRzLnJlbW92ZShmb3JSZXF1ZXN0SWQpOwogICAgaWYgKCFfdXNlZFBvcnRzLnZhbHVlcy5jb250YWlucyhwb3J0KSkgewogICAgICBfZnJlZVBvcnRzLmFkZChwb3J0KTsKICAgIH0KICB9CgogIHN0YXRpYyBTZW5kUG9ydCBfbmV3U2VydmljZVBvcnQoKSBuYXRpdmUgIklPU2VydmljZV9OZXdTZXJ2aWNlUG9ydCI7Cn0KCkBwYXRjaApjbGFzcyBfSU9TZXJ2aWNlIHsKICBzdGF0aWMgX0lPU2VydmljZVBvcnRzIF9zZXJ2aWNlUG9ydHMgPSBuZXcgX0lPU2VydmljZVBvcnRzKCk7CiAgc3RhdGljIFJhd1JlY2VpdmVQb3J0IF9yZWNlaXZlUG9ydDsKICBzdGF0aWMgU2VuZFBvcnQgX3JlcGx5VG9Qb3J0OwogIHN0YXRpYyBIYXNoTWFwPGludCwgQ29tcGxldGVyPiBfbWVzc2FnZU1hcCA9IG5ldyBIYXNoTWFwPGludCwgQ29tcGxldGVyPigpOwogIHN0YXRpYyBpbnQgX2lkID0gMDsKCiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZSBfZGlzcGF0Y2goaW50IHJlcXVlc3QsIExpc3QgZGF0YSkgewogICAgaW50IGlkOwogICAgZG8gewogICAgICBpZCA9IF9nZXROZXh0SWQoKTsKICAgIH0gd2hpbGUgKF9tZXNzYWdlTWFwLmNvbnRhaW5zS2V5KGlkKSk7CiAgICBmaW5hbCBTZW5kUG9ydCBzZXJ2aWNlUG9ydCA9IF9zZXJ2aWNlUG9ydHMuX2dldFBvcnQoaWQpOwogICAgX2Vuc3VyZUluaXRpYWxpemUoKTsKICAgIGZpbmFsIENvbXBsZXRlciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CiAgICBfbWVzc2FnZU1hcFtpZF0gPSBjb21wbGV0ZXI7CiAgICB0cnkgewogICAgICBzZXJ2aWNlUG9ydC5zZW5kKFtpZCwgX3JlcGx5VG9Qb3J0LCByZXF1ZXN0LCBkYXRhXSk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBfbWVzc2FnZU1hcC5yZW1vdmUoaWQpLmNvbXBsZXRlKGVycm9yKTsKICAgICAgaWYgKF9tZXNzYWdlTWFwLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgX2ZpbmFsaXplKCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgc3RhdGljIHZvaWQgX2Vuc3VyZUluaXRpYWxpemUoKSB7CiAgICBpZiAoX3JlY2VpdmVQb3J0ID09IG51bGwpIHsKICAgICAgX3JlY2VpdmVQb3J0ID0gbmV3IFJhd1JlY2VpdmVQb3J0KCk7CiAgICAgIF9yZXBseVRvUG9ydCA9IF9yZWNlaXZlUG9ydC5zZW5kUG9ydDsKICAgICAgX3JlY2VpdmVQb3J0LmhhbmRsZXIgPSAoZGF0YSkgewogICAgICAgIGFzc2VydChkYXRhIGlzIExpc3QgJiYgZGF0YS5sZW5ndGggPT0gMik7CiAgICAgICAgX21lc3NhZ2VNYXAucmVtb3ZlKGRhdGFbMF0pLmNvbXBsZXRlKGRhdGFbMV0pOwogICAgICAgIF9zZXJ2aWNlUG9ydHMuX3JldHVyblBvcnQoZGF0YVswXSk7CiAgICAgICAgaWYgKF9tZXNzYWdlTWFwLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICBfZmluYWxpemUoKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgfQoKICBzdGF0aWMgdm9pZCBfZmluYWxpemUoKSB7CiAgICBfaWQgPSAwOwogICAgX3JlY2VpdmVQb3J0LmNsb3NlKCk7CiAgICBfcmVjZWl2ZVBvcnQgPSBudWxsOwogIH0KCiAgc3RhdGljIGludCBfZ2V0TmV4dElkKCkgewogICAgaWYgKF9pZCA9PSAweDdGRkZGRkZGKSBfaWQgPSAwOwogICAgcmV0dXJuIF9pZCsrOwogIH0KfQpmAE5OPAEgARhKTCIoLEABFQEoPi8YHAYfNTUnEwZEFTslEQQBJzstHAYEAUcCAQcTQCYgThYBCTQMCRkrPRkxIQo7Fi4lFQgGHQQBJCArLCYyNywnFwoJBgQBHA0aGQQBHCQSBAIBI2RhcnQ6aW8tcGF0Y2gvaW9fc2VydmljZV9wYXRjaC5kYXJ0NG9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vbmFtZXNwYWNlX3BhdGNoLmRhcnSGWy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9OYW1lc3BhY2VJbXBsIGV4dGVuZHMgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3MxIGltcGxlbWVudHMgX05hbWVzcGFjZSB7CiAgX05hbWVzcGFjZUltcGwuXygpOwoKICBzdGF0aWMgX05hbWVzcGFjZUltcGwgX2NyZWF0ZShfTmFtZXNwYWNlSW1wbCBuYW1lc3BhY2UsIHZhciBuKQogICAgICBuYXRpdmUgIk5hbWVzcGFjZV9DcmVhdGUiOwogIHN0YXRpYyBpbnQgX2dldFBvaW50ZXIoX05hbWVzcGFjZUltcGwgbmFtZXNwYWNlKQogICAgICBuYXRpdmUgIk5hbWVzcGFjZV9HZXRQb2ludGVyIjsKICBzdGF0aWMgaW50IF9nZXREZWZhdWx0KCkgbmF0aXZlICJOYW1lc3BhY2VfR2V0RGVmYXVsdCI7CgogIC8vIElmIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyAibmFtZXNwYWNlcyIsIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUKICAvLyBlbWJlZGRlciB3aXRoIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBuYW1lc3BhY2UgaW5mb3JtYXRpb24uCiAgc3RhdGljIF9OYW1lc3BhY2VJbXBsIF9jYWNoZWROYW1lc3BhY2UgPSBudWxsOwogIHN0YXRpYyB2b2lkIF9zZXR1cE5hbWVzcGFjZSh2YXIgbmFtZXNwYWNlKSB7CiAgICBfY2FjaGVkTmFtZXNwYWNlID0gX2NyZWF0ZShuZXcgX05hbWVzcGFjZUltcGwuXygpLCBuYW1lc3BhY2UpOwogIH0KCiAgc3RhdGljIF9OYW1lc3BhY2VJbXBsIGdldCBfbmFtZXNwYWNlIHsKICAgIGlmIChfY2FjaGVkTmFtZXNwYWNlID09IG51bGwpIHsKICAgICAgLy8gVGhlIGVtYmVkZGVyIGhhcyBub3Qgc3VwcGxpZWQgYSBuYW1lc3BhY2UgYmVmb3JlIG9uZSBpcyBuZWVkZWQsIHNvCiAgICAgIC8vIGluc3RlYWQgdXNlIGEgc2FmZS1pc2ggZGVmYXVsdCB2YWx1ZS4KICAgICAgX2NhY2hlZE5hbWVzcGFjZSA9IF9jcmVhdGUobmV3IF9OYW1lc3BhY2VJbXBsLl8oKSwgX2dldERlZmF1bHQoKSk7CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZE5hbWVzcGFjZTsKICB9CgogIHN0YXRpYyBpbnQgZ2V0IF9uYW1lc3BhY2VQb2ludGVyID0+IF9nZXRQb2ludGVyKF9uYW1lc3BhY2UpOwp9CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfTmFtZXNwYWNlIHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBzdGF0aWMgdm9pZCBfc2V0dXBOYW1lc3BhY2UodmFyIG5hbWVzcGFjZSkgewogICAgX05hbWVzcGFjZUltcGwuX3NldHVwTmFtZXNwYWNlKG5hbWVzcGFjZSk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgX05hbWVzcGFjZSBnZXQgX25hbWVzcGFjZSA9PiBfTmFtZXNwYWNlSW1wbC5fbmFtZXNwYWNlOwoKICBAcGF0Y2gKICBzdGF0aWMgaW50IGdldCBfbmFtZXNwYWNlUG9pbnRlciA9PiBfTmFtZXNwYWNlSW1wbC5fbmFtZXNwYWNlUG9pbnRlcjsKfQoyAE5OPAEaThYBQSEzJToBSUAxL0MEASkkTC9JBh0EAT8CAQcaEwkkLy8EAQlBAQlIAgEiZGFydDppby1wYXRjaC9uYW1lc3BhY2VfcGF0Y2guZGFydDJvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvYmluL3Byb2Nlc3NfcGF0Y2guZGFydMAASj8vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29tbW9uX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIF9XaW5kb3dzQ29kZVBhZ2VEZWNvZGVyIHsKICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIF9kZWNvZGVCeXRlcyhMaXN0PGludD4gYnl0ZXMpIG5hdGl2ZSAiU3lzdGVtRW5jb2RpbmdUb1N0cmluZyI7Cn0KCkBwYXRjaApjbGFzcyBfV2luZG93c0NvZGVQYWdlRW5jb2RlciB7CiAgQHBhdGNoCiAgc3RhdGljIExpc3Q8aW50PiBfZW5jb2RlU3RyaW5nKFN0cmluZyBzdHJpbmcpIG5hdGl2ZSAiU3RyaW5nVG9TeXN0ZW1FbmNvZGluZyI7Cn0KCkBwYXRjaApjbGFzcyBQcm9jZXNzIHsKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPFByb2Nlc3M+IHN0YXJ0KFN0cmluZyBleGVjdXRhYmxlLCBMaXN0PFN0cmluZz4gYXJndW1lbnRzLAogICAgICB7U3RyaW5nIHdvcmtpbmdEaXJlY3RvcnksCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQsCiAgICAgIGJvb2wgaW5jbHVkZVBhcmVudEVudmlyb25tZW50OiB0cnVlLAogICAgICBib29sIHJ1bkluU2hlbGw6IGZhbHNlLAogICAgICBQcm9jZXNzU3RhcnRNb2RlIG1vZGU6IFByb2Nlc3NTdGFydE1vZGUubm9ybWFsfSkgewogICAgX1Byb2Nlc3NJbXBsIHByb2Nlc3MgPSBuZXcgX1Byb2Nlc3NJbXBsKAogICAgICAgIGV4ZWN1dGFibGUsCiAgICAgICAgYXJndW1lbnRzLAogICAgICAgIHdvcmtpbmdEaXJlY3RvcnksCiAgICAgICAgZW52aXJvbm1lbnQsCiAgICAgICAgaW5jbHVkZVBhcmVudEVudmlyb25tZW50LAogICAgICAgIHJ1bkluU2hlbGwsCiAgICAgICAgbW9kZSk7CiAgICByZXR1cm4gcHJvY2Vzcy5fc3RhcnQoKTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8UHJvY2Vzc1Jlc3VsdD4gcnVuKFN0cmluZyBleGVjdXRhYmxlLCBMaXN0PFN0cmluZz4gYXJndW1lbnRzLAogICAgICB7U3RyaW5nIHdvcmtpbmdEaXJlY3RvcnksCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQsCiAgICAgIGJvb2wgaW5jbHVkZVBhcmVudEVudmlyb25tZW50OiB0cnVlLAogICAgICBib29sIHJ1bkluU2hlbGw6IGZhbHNlLAogICAgICBFbmNvZGluZyBzdGRvdXRFbmNvZGluZzogc3lzdGVtRW5jb2RpbmcsCiAgICAgIEVuY29kaW5nIHN0ZGVyckVuY29kaW5nOiBzeXN0ZW1FbmNvZGluZ30pIHsKICAgIHJldHVybiBfcnVuTm9uSW50ZXJhY3RpdmVQcm9jZXNzKAogICAgICAgIGV4ZWN1dGFibGUsCiAgICAgICAgYXJndW1lbnRzLAogICAgICAgIHdvcmtpbmdEaXJlY3RvcnksCiAgICAgICAgZW52aXJvbm1lbnQsCiAgICAgICAgaW5jbHVkZVBhcmVudEVudmlyb25tZW50LAogICAgICAgIHJ1bkluU2hlbGwsCiAgICAgICAgc3Rkb3V0RW5jb2RpbmcsCiAgICAgICAgc3RkZXJyRW5jb2RpbmcpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIFByb2Nlc3NSZXN1bHQgcnVuU3luYyhTdHJpbmcgZXhlY3V0YWJsZSwgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cywKICAgICAge1N0cmluZyB3b3JraW5nRGlyZWN0b3J5LAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50LAogICAgICBib29sIGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudDogdHJ1ZSwKICAgICAgYm9vbCBydW5JblNoZWxsOiBmYWxzZSwKICAgICAgRW5jb2Rpbmcgc3Rkb3V0RW5jb2Rpbmc6IHN5c3RlbUVuY29kaW5nLAogICAgICBFbmNvZGluZyBzdGRlcnJFbmNvZGluZzogc3lzdGVtRW5jb2Rpbmd9KSB7CiAgICByZXR1cm4gX3J1bk5vbkludGVyYWN0aXZlUHJvY2Vzc1N5bmMoCiAgICAgICAgZXhlY3V0YWJsZSwKICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgd29ya2luZ0RpcmVjdG9yeSwKICAgICAgICBlbnZpcm9ubWVudCwKICAgICAgICBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQsCiAgICAgICAgcnVuSW5TaGVsbCwKICAgICAgICBzdGRvdXRFbmNvZGluZywKICAgICAgICBzdGRlcnJFbmNvZGluZyk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgYm9vbCBraWxsUGlkKGludCBwaWQsIFtQcm9jZXNzU2lnbmFsIHNpZ25hbCA9IFByb2Nlc3NTaWduYWwuc2lndGVybV0pIHsKICAgIGlmIChzaWduYWwgaXMhIFByb2Nlc3NTaWduYWwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkFyZ3VtZW50ICdzaWduYWwnIG11c3QgYmUgYSBQcm9jZXNzU2lnbmFsIik7CiAgICB9CiAgICByZXR1cm4gX1Byb2Nlc3NVdGlscy5fa2lsbFBpZChwaWQsIHNpZ25hbC5fc2lnbmFsTnVtYmVyKTsKICB9Cn0KCkxpc3Q8X1NpZ25hbENvbnRyb2xsZXI+IF9zaWduYWxDb250cm9sbGVycyA9IG5ldyBMaXN0KDMyKTsKCmNsYXNzIF9TaWduYWxDb250cm9sbGVyIHsKICBmaW5hbCBQcm9jZXNzU2lnbmFsIHNpZ25hbDsKCiAgU3RyZWFtQ29udHJvbGxlcjxQcm9jZXNzU2lnbmFsPiBfY29udHJvbGxlcjsKICB2YXIgX2lkOwoKICBfU2lnbmFsQ29udHJvbGxlcih0aGlzLnNpZ25hbCkgewogICAgX2NvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxQcm9jZXNzU2lnbmFsPi5icm9hZGNhc3QoCiAgICAgICAgb25MaXN0ZW46IF9saXN0ZW4sIG9uQ2FuY2VsOiBfY2FuY2VsKTsKICB9CgogIFN0cmVhbTxQcm9jZXNzU2lnbmFsPiBnZXQgc3RyZWFtID0+IF9jb250cm9sbGVyLnN0cmVhbTsKCiAgdm9pZCBfbGlzdGVuKCkgewogICAgdmFyIGlkID0gX3NldFNpZ25hbEhhbmRsZXIoc2lnbmFsLl9zaWduYWxOdW1iZXIpOwogICAgaWYgKGlkIGlzISBpbnQpIHsKICAgICAgX2NvbnRyb2xsZXIKICAgICAgICAgIC5hZGRFcnJvcihuZXcgU2lnbmFsRXhjZXB0aW9uKCJGYWlsZWQgdG8gbGlzdGVuIGZvciAkc2lnbmFsIiwgaWQpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgX2lkID0gaWQ7CiAgICB2YXIgc29ja2V0ID0gbmV3IF9SYXdTb2NrZXQobmV3IF9OYXRpdmVTb2NrZXQud2F0Y2hTaWduYWwoaWQpKTsKICAgIHNvY2tldC5saXN0ZW4oKGV2ZW50KSB7CiAgICAgIGlmIChldmVudCA9PSBSYXdTb2NrZXRFdmVudC5yZWFkKSB7CiAgICAgICAgdmFyIGJ5dGVzID0gc29ja2V0LnJlYWQoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBfY29udHJvbGxlci5hZGQoc2lnbmFsKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCBfY2FuY2VsKCkgewogICAgaWYgKF9pZCAhPSBudWxsKSB7CiAgICAgIF9jbGVhclNpZ25hbEhhbmRsZXIoc2lnbmFsLl9zaWduYWxOdW1iZXIpOwogICAgICBfaWQgPSBudWxsOwogICAgfQogIH0KCiAgc3RhdGljIF9zZXRTaWduYWxIYW5kbGVyKGludCBzaWduYWwpIG5hdGl2ZSAiUHJvY2Vzc19TZXRTaWduYWxIYW5kbGVyIjsKICBzdGF0aWMgaW50IF9jbGVhclNpZ25hbEhhbmRsZXIoaW50IHNpZ25hbCkKICAgICAgbmF0aXZlICJQcm9jZXNzX0NsZWFyU2lnbmFsSGFuZGxlciI7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpGdW5jdGlvbiBfZ2V0V2F0Y2hTaWduYWxJbnRlcm5hbCgpID0+IF9Qcm9jZXNzVXRpbHMuX3dhdGNoU2lnbmFsSW50ZXJuYWw7CgpAcGF0Y2gKY2xhc3MgX1Byb2Nlc3NVdGlscyB7CiAgQHBhdGNoCiAgc3RhdGljIHZvaWQgX2V4aXQoaW50IHN0YXR1cykgbmF0aXZlICJQcm9jZXNzX0V4aXQiOwogIEBwYXRjaAogIHN0YXRpYyB2b2lkIF9zZXRFeGl0Q29kZShpbnQgc3RhdHVzKSBuYXRpdmUgIlByb2Nlc3NfU2V0RXhpdENvZGUiOwogIEBwYXRjaAogIHN0YXRpYyBpbnQgX2dldEV4aXRDb2RlKCkgbmF0aXZlICJQcm9jZXNzX0dldEV4aXRDb2RlIjsKICBAcGF0Y2gKICBzdGF0aWMgdm9pZCBfc2xlZXAoaW50IG1pbGxpcykgbmF0aXZlICJQcm9jZXNzX1NsZWVwIjsKICBAcGF0Y2gKICBzdGF0aWMgaW50IF9waWQoUHJvY2VzcyBwcm9jZXNzKSBuYXRpdmUgIlByb2Nlc3NfUGlkIjsKICBzdGF0aWMgYm9vbCBfa2lsbFBpZChpbnQgcGlkLCBpbnQgc2lnbmFsKSBuYXRpdmUgIlByb2Nlc3NfS2lsbFBpZCI7CiAgQHBhdGNoCiAgc3RhdGljIFN0cmVhbTxQcm9jZXNzU2lnbmFsPiBfd2F0Y2hTaWduYWwoUHJvY2Vzc1NpZ25hbCBzaWduYWwpIHsKICAgIGlmIChzaWduYWwgIT0gUHJvY2Vzc1NpZ25hbC5zaWdodXAgJiYKICAgICAgICBzaWduYWwgIT0gUHJvY2Vzc1NpZ25hbC5zaWdpbnQgJiYKICAgICAgICBzaWduYWwgIT0gUHJvY2Vzc1NpZ25hbC5zaWd0ZXJtICYmCiAgICAgICAgKFBsYXRmb3JtLmlzV2luZG93cyB8fAogICAgICAgICAgICAoc2lnbmFsICE9IFByb2Nlc3NTaWduYWwuc2lndXNyMSAmJgogICAgICAgICAgICAgICAgc2lnbmFsICE9IFByb2Nlc3NTaWduYWwuc2lndXNyMiAmJgogICAgICAgICAgICAgICAgc2lnbmFsICE9IFByb2Nlc3NTaWduYWwuc2lnd2luY2gpKSkgewogICAgICB0aHJvdyBuZXcgU2lnbmFsRXhjZXB0aW9uKAogICAgICAgICAgIkxpc3RlbmluZyBmb3Igc2lnbmFsICRzaWduYWwgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgfQogICAgcmV0dXJuIF93YXRjaFNpZ25hbEludGVybmFsKHNpZ25hbCk7CiAgfQoKICBzdGF0aWMgU3RyZWFtPFByb2Nlc3NTaWduYWw+IF93YXRjaFNpZ25hbEludGVybmFsKFByb2Nlc3NTaWduYWwgc2lnbmFsKSB7CiAgICBpZiAoX3NpZ25hbENvbnRyb2xsZXJzW3NpZ25hbC5fc2lnbmFsTnVtYmVyXSA9PSBudWxsKSB7CiAgICAgIF9zaWduYWxDb250cm9sbGVyc1tzaWduYWwuX3NpZ25hbE51bWJlcl0gPSBuZXcgX1NpZ25hbENvbnRyb2xsZXIoc2lnbmFsKTsKICAgIH0KICAgIHJldHVybiBfc2lnbmFsQ29udHJvbGxlcnNbc2lnbmFsLl9zaWduYWxOdW1iZXJdLnN0cmVhbTsKICB9Cn0KCkBwYXRjaApjbGFzcyBQcm9jZXNzSW5mbyB7CiAgQHBhdGNoCiAgc3RhdGljIGludCBnZXQgbWF4UnNzIHsKICAgIHZhciByZXN1bHQgPSBfbWF4UnNzKCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBpbnQgZ2V0IGN1cnJlbnRSc3MgewogICAgdmFyIHJlc3VsdCA9IF9jdXJyZW50UnNzKCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBfbWF4UnNzKCkgbmF0aXZlICJQcm9jZXNzSW5mb19NYXhSU1MiOwogIHN0YXRpYyBfY3VycmVudFJzcygpIG5hdGl2ZSAiUHJvY2Vzc0luZm9fQ3VycmVudFJTUyI7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1Byb2Nlc3NTdGFydFN0YXR1cyB7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAic2V0IikKICBpbnQgX2Vycm9yQ29kZTsgLy8gU2V0IHRvIE9TIGVycm9yIGNvZGUgaWYgcHJvY2VzcyBzdGFydCBmYWlsZWQuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAic2V0IikKICBTdHJpbmcgX2Vycm9yTWVzc2FnZTsgLy8gU2V0IHRvIE9TIGVycm9yIG1lc3NhZ2UgaWYgcHJvY2VzcyBzdGFydCBmYWlsZWQuCn0KCi8vIFRoZSBOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczEgY2FuIG5vdCBiZSB1c2VkIHdpdGggYSBtaXhpbiwgZHVlIHRvIG1pc3NpbmcKLy8gaW1wbGljaXQgY29uc3RydWN0b3IuCmNsYXNzIF9Qcm9jZXNzSW1wbE5hdGl2ZVdyYXBwZXIgZXh0ZW5kcyBOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczEge30KCmNsYXNzIF9Qcm9jZXNzSW1wbCBleHRlbmRzIF9Qcm9jZXNzSW1wbE5hdGl2ZVdyYXBwZXIgaW1wbGVtZW50cyBQcm9jZXNzIHsKICBfUHJvY2Vzc1Jlc291cmNlSW5mbyBfcmVzb3VyY2VJbmZvOwogIHN0YXRpYyBib29sIGNvbm5lY3RlZFJlc291cmNlSGFuZGxlciA9IGZhbHNlOwoKICBfUHJvY2Vzc0ltcGwoCiAgICAgIFN0cmluZyBwYXRoLAogICAgICBMaXN0PFN0cmluZz4gYXJndW1lbnRzLAogICAgICB0aGlzLl93b3JraW5nRGlyZWN0b3J5LAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50LAogICAgICBib29sIGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudCwKICAgICAgYm9vbCBydW5JblNoZWxsLAogICAgICBQcm9jZXNzU3RhcnRNb2RlIG1vZGUpCiAgICAgIDogc3VwZXIoKSB7CiAgICBpZiAoIWNvbm5lY3RlZFJlc291cmNlSGFuZGxlcikgewogICAgICByZWdpc3RlckV4dGVuc2lvbigKICAgICAgICAgICdleHQuZGFydC5pby5nZXRQcm9jZXNzZXMnLCBfUHJvY2Vzc1Jlc291cmNlSW5mby5nZXRTdGFydGVkUHJvY2Vzc2VzKTsKICAgICAgcmVnaXN0ZXJFeHRlbnNpb24oJ2V4dC5kYXJ0LmlvLmdldFByb2Nlc3NCeUlkJywKICAgICAgICAgIF9Qcm9jZXNzUmVzb3VyY2VJbmZvLmdldFByb2Nlc3NJbmZvTWFwQnlJZCk7CiAgICAgIGNvbm5lY3RlZFJlc291cmNlSGFuZGxlciA9IHRydWU7CiAgICB9CgogICAgaWYgKHJ1bkluU2hlbGwpIHsKICAgICAgYXJndW1lbnRzID0gX2dldFNoZWxsQXJndW1lbnRzKHBhdGgsIGFyZ3VtZW50cyk7CiAgICAgIHBhdGggPSBfZ2V0U2hlbGxDb21tYW5kKCk7CiAgICB9CgogICAgaWYgKHBhdGggaXMhIFN0cmluZykgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiUGF0aCBpcyBub3QgYSBTdHJpbmc6ICRwYXRoIik7CiAgICB9CiAgICBfcGF0aCA9IHBhdGg7CgogICAgaWYgKGFyZ3VtZW50cyBpcyEgTGlzdCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiQXJndW1lbnRzIGlzIG5vdCBhIExpc3Q6ICRhcmd1bWVudHMiKTsKICAgIH0KICAgIGludCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoOwogICAgX2FyZ3VtZW50cyA9IG5ldyBMaXN0PFN0cmluZz4obGVuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tpXTsKICAgICAgaWYgKGFyZyBpcyEgU3RyaW5nKSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIk5vbi1zdHJpbmcgYXJndW1lbnQ6ICRhcmciKTsKICAgICAgfQogICAgICBfYXJndW1lbnRzW2ldID0gYXJndW1lbnRzW2ldOwogICAgICBpZiAoUGxhdGZvcm0uaXNXaW5kb3dzKSB7CiAgICAgICAgX2FyZ3VtZW50c1tpXSA9IF93aW5kb3dzQXJndW1lbnRFc2NhcGUoX2FyZ3VtZW50c1tpXSk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoX3dvcmtpbmdEaXJlY3RvcnkgIT0gbnVsbCAmJiBfd29ya2luZ0RpcmVjdG9yeSBpcyEgU3RyaW5nKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgIldvcmtpbmdEaXJlY3RvcnkgaXMgbm90IGEgU3RyaW5nOiAkX3dvcmtpbmdEaXJlY3RvcnkiKTsKICAgIH0KCiAgICBfZW52aXJvbm1lbnQgPSBbXTsKICAgIC8vIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSBub24tbnVsbCBlbnZpcm9ubWVudC4KICAgIGVudmlyb25tZW50ID0gKGVudmlyb25tZW50ID09IG51bGwpID8gKGNvbnN0IHt9KSA6IGVudmlyb25tZW50OwogICAgaWYgKGVudmlyb25tZW50IGlzISBNYXApIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkVudmlyb25tZW50IGlzIG5vdCBhIG1hcDogJGVudmlyb25tZW50Iik7CiAgICB9CiAgICBlbnZpcm9ubWVudC5mb3JFYWNoKChrZXksIHZhbHVlKSB7CiAgICAgIGlmIChrZXkgaXMhIFN0cmluZyB8fCB2YWx1ZSBpcyEgU3RyaW5nKSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAgICJFbnZpcm9ubWVudCBrZXkgb3IgdmFsdWUgaXMgbm90IGEgc3RyaW5nOiAoJGtleSwgJHZhbHVlKSIpOwogICAgICB9CiAgICAgIF9lbnZpcm9ubWVudC5hZGQoJyRrZXk9JHZhbHVlJyk7CiAgICB9KTsKICAgIGlmIChpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQpIHsKICAgICAgUGxhdGZvcm0uZW52aXJvbm1lbnQuZm9yRWFjaCgoa2V5LCB2YWx1ZSkgewogICAgICAgIGFzc2VydChrZXkgaXMgU3RyaW5nKTsKICAgICAgICBhc3NlcnQodmFsdWUgaXMgU3RyaW5nKTsKICAgICAgICAvLyBEbyBub3Qgb3ZlcnJpZGUga2V5cyBhbHJlYWR5IHNldCBhcyBwYXJ0IG9mIGVudmlyb25tZW50LgogICAgICAgIGlmICghZW52aXJvbm1lbnQuY29udGFpbnNLZXkoa2V5KSkgewogICAgICAgICAgX2Vudmlyb25tZW50LmFkZCgnJGtleT0kdmFsdWUnKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIGlmIChtb2RlIGlzISBQcm9jZXNzU3RhcnRNb2RlKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJNb2RlIGlzIG5vdCBhIFByb2Nlc3NTdGFydE1vZGU6ICRtb2RlIik7CiAgICB9CiAgICBfbW9kZSA9IG1vZGU7CgogICAgaWYgKF9tb2RlSGFzU3RkaW8obW9kZSkpIHsKICAgICAgLy8gc3RkaW4gZ29pbmcgdG8gcHJvY2Vzcy4KICAgICAgX3N0ZGluID0gbmV3IF9TdGRTaW5rKG5ldyBfU29ja2V0Ll93cml0ZVBpcGUoKS4uX293bmVyID0gdGhpcyk7CiAgICAgIC8vIHN0ZG91dCBjb21pbmcgZnJvbSBwcm9jZXNzLgogICAgICBfc3Rkb3V0ID0gbmV3IF9TdGRTdHJlYW0obmV3IF9Tb2NrZXQuX3JlYWRQaXBlKCkuLl9vd25lciA9IHRoaXMpOwogICAgICAvLyBzdGRlcnIgY29taW5nIGZyb20gcHJvY2Vzcy4KICAgICAgX3N0ZGVyciA9IG5ldyBfU3RkU3RyZWFtKG5ldyBfU29ja2V0Ll9yZWFkUGlwZSgpLi5fb3duZXIgPSB0aGlzKTsKICAgIH0KICAgIGlmIChfbW9kZUlzQXR0YWNoZWQobW9kZSkpIHsKICAgICAgX2V4aXRIYW5kbGVyID0gbmV3IF9Tb2NrZXQuX3JlYWRQaXBlKCk7CiAgICB9CiAgICBfZW5kZWQgPSBmYWxzZTsKICAgIF9zdGFydGVkID0gZmFsc2U7CiAgfQoKICBfTmF0aXZlU29ja2V0IGdldCBfc3RkaW5OYXRpdmVTb2NrZXQgPT4KICAgICAgKF9zdGRpbi5fc2luayBhcyBfU29ja2V0KS5fbmF0aXZlU29ja2V0OwogIF9OYXRpdmVTb2NrZXQgZ2V0IF9zdGRvdXROYXRpdmVTb2NrZXQgPT4KICAgICAgKF9zdGRvdXQuX3N0cmVhbSBhcyBfU29ja2V0KS5fbmF0aXZlU29ja2V0OwogIF9OYXRpdmVTb2NrZXQgZ2V0IF9zdGRlcnJOYXRpdmVTb2NrZXQgPT4KICAgICAgKF9zdGRlcnIuX3N0cmVhbSBhcyBfU29ja2V0KS5fbmF0aXZlU29ja2V0OwoKICBzdGF0aWMgYm9vbCBfbW9kZUlzQXR0YWNoZWQoUHJvY2Vzc1N0YXJ0TW9kZSBtb2RlKSB7CiAgICByZXR1cm4gKG1vZGUgPT0gUHJvY2Vzc1N0YXJ0TW9kZS5ub3JtYWwpIHx8CiAgICAgICAgKG1vZGUgPT0gUHJvY2Vzc1N0YXJ0TW9kZS5pbmhlcml0U3RkaW8pOwogIH0KCiAgc3RhdGljIGJvb2wgX21vZGVIYXNTdGRpbyhQcm9jZXNzU3RhcnRNb2RlIG1vZGUpIHsKICAgIHJldHVybiAobW9kZSA9PSBQcm9jZXNzU3RhcnRNb2RlLm5vcm1hbCkgfHwKICAgICAgICAobW9kZSA9PSBQcm9jZXNzU3RhcnRNb2RlLmRldGFjaGVkV2l0aFN0ZGlvKTsKICB9CgogIHN0YXRpYyBTdHJpbmcgX2dldFNoZWxsQ29tbWFuZCgpIHsKICAgIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgICAgcmV0dXJuICdjbWQuZXhlJzsKICAgIH0KICAgIHJldHVybiAnL2Jpbi9zaCc7CiAgfQoKICBzdGF0aWMgTGlzdDxTdHJpbmc+IF9nZXRTaGVsbEFyZ3VtZW50cygKICAgICAgU3RyaW5nIGV4ZWN1dGFibGUsIExpc3Q8U3RyaW5nPiBhcmd1bWVudHMpIHsKICAgIExpc3Q8U3RyaW5nPiBzaGVsbEFyZ3VtZW50cyA9IFtdOwogICAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykgewogICAgICBzaGVsbEFyZ3VtZW50cy5hZGQoJy9jJyk7CiAgICAgIHNoZWxsQXJndW1lbnRzLmFkZChleGVjdXRhYmxlKTsKICAgICAgZm9yICh2YXIgYXJnIGluIGFyZ3VtZW50cykgewogICAgICAgIHNoZWxsQXJndW1lbnRzLmFkZChhcmcpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB2YXIgY29tbWFuZExpbmUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgIGV4ZWN1dGFibGUgPSBleGVjdXRhYmxlLnJlcGxhY2VBbGwoIiciLCAiJ1wiJ1wiJyIpOwogICAgICBjb21tYW5kTGluZS53cml0ZSgiJyRleGVjdXRhYmxlJyIpOwogICAgICBzaGVsbEFyZ3VtZW50cy5hZGQoIi1jIik7CiAgICAgIGZvciAodmFyIGFyZyBpbiBhcmd1bWVudHMpIHsKICAgICAgICBhcmcgPSBhcmcucmVwbGFjZUFsbCgiJyIsICInXCInXCInIik7CiAgICAgICAgY29tbWFuZExpbmUud3JpdGUoIiAnJGFyZyciKTsKICAgICAgfQogICAgICBzaGVsbEFyZ3VtZW50cy5hZGQoY29tbWFuZExpbmUudG9TdHJpbmcoKSk7CiAgICB9CiAgICByZXR1cm4gc2hlbGxBcmd1bWVudHM7CiAgfQoKICBTdHJpbmcgX3dpbmRvd3NBcmd1bWVudEVzY2FwZShTdHJpbmcgYXJndW1lbnQpIHsKICAgIHZhciByZXN1bHQgPSBhcmd1bWVudDsKICAgIGlmIChhcmd1bWVudC5jb250YWlucygnXHQnKSB8fAogICAgICAgIGFyZ3VtZW50LmNvbnRhaW5zKCcgJykgfHwKICAgICAgICBhcmd1bWVudC5jb250YWlucygnIicpKSB7CiAgICAgIC8vIFByb2R1Y2Ugc29tZXRoaW5nIHRoYXQgdGhlIEMgcnVudGltZSBvbiBXaW5kb3dzIHdpbGwgcGFyc2UKICAgICAgLy8gYmFjayBhcyB0aGlzIHN0cmluZy4KCiAgICAgIC8vIFJlcGxhY2UgYW55IG51bWJlciBvZiAnXCcgZm9sbG93ZWQgYnkgJyInIHdpdGgKICAgICAgLy8gdHdpY2UgYXMgbWFueSAnXCcgZm9sbG93ZWQgYnkgJ1wiJy4KICAgICAgdmFyIGJhY2tzbGFzaCA9ICdcXCcuY29kZVVuaXRBdCgwKTsKICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICB2YXIgbmV4dFBvcyA9IDA7CiAgICAgIHZhciBxdW90ZVBvcyA9IGFyZ3VtZW50LmluZGV4T2YoJyInLCBuZXh0UG9zKTsKICAgICAgd2hpbGUgKHF1b3RlUG9zICE9IC0xKSB7CiAgICAgICAgdmFyIG51bUJhY2tzbGFzaCA9IDA7CiAgICAgICAgdmFyIHBvcyA9IHF1b3RlUG9zIC0gMTsKICAgICAgICB3aGlsZSAocG9zID49IDAgJiYgYXJndW1lbnQuY29kZVVuaXRBdChwb3MpID09IGJhY2tzbGFzaCkgewogICAgICAgICAgbnVtQmFja3NsYXNoKys7CiAgICAgICAgICBwb3MtLTsKICAgICAgICB9CiAgICAgICAgc2Iud3JpdGUoYXJndW1lbnQuc3Vic3RyaW5nKG5leHRQb3MsIHF1b3RlUG9zIC0gbnVtQmFja3NsYXNoKSk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1CYWNrc2xhc2g7IGkrKykgewogICAgICAgICAgc2Iud3JpdGUocidcXCcpOwogICAgICAgIH0KICAgICAgICBzYi53cml0ZShyJ1wiJyk7CiAgICAgICAgbmV4dFBvcyA9IHF1b3RlUG9zICsgMTsKICAgICAgICBxdW90ZVBvcyA9IGFyZ3VtZW50LmluZGV4T2YoJyInLCBuZXh0UG9zKTsKICAgICAgfQogICAgICBzYi53cml0ZShhcmd1bWVudC5zdWJzdHJpbmcobmV4dFBvcywgYXJndW1lbnQubGVuZ3RoKSk7CiAgICAgIHJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7CgogICAgICAvLyBBZGQgJyInIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBhbmQgcmVwbGFjZSBhbGwgJ1wnIGF0CiAgICAgIC8vIHRoZSBlbmQgd2l0aCB0d28gJ1wnLgogICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoJyInKTsKICAgICAgc2Iud3JpdGUocmVzdWx0KTsKICAgICAgbmV4dFBvcyA9IGFyZ3VtZW50Lmxlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChhcmd1bWVudC5jb2RlVW5pdEF0KG5leHRQb3MpID09IGJhY2tzbGFzaCkgewogICAgICAgIHNiLndyaXRlKCdcXCcpOwogICAgICAgIG5leHRQb3MtLTsKICAgICAgfQogICAgICBzYi53cml0ZSgnIicpOwogICAgICByZXN1bHQgPSBzYi50b1N0cmluZygpOwogICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBpbnQgX2ludEZyb21CeXRlcyhMaXN0PGludD4gYnl0ZXMsIGludCBvZmZzZXQpIHsKICAgIHJldHVybiAoYnl0ZXNbb2Zmc2V0XSArCiAgICAgICAgKGJ5dGVzW29mZnNldCArIDFdIDw8IDgpICsKICAgICAgICAoYnl0ZXNbb2Zmc2V0ICsgMl0gPDwgMTYpICsKICAgICAgICAoYnl0ZXNbb2Zmc2V0ICsgM10gPDwgMjQpKTsKICB9CgogIEZ1dHVyZTxQcm9jZXNzPiBfc3RhcnQoKSB7CiAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxQcm9jZXNzPigpOwogICAgaWYgKF9tb2RlSXNBdHRhY2hlZChfbW9kZSkpIHsKICAgICAgX2V4aXRDb2RlID0gbmV3IENvbXBsZXRlcjxpbnQ+KCk7CiAgICB9CiAgICAvLyBUT0RPKGFnZXIpOiBNYWtlIHRoZSBhY3R1YWwgcHJvY2VzcyBzdGFydGluZyByZWFsbHkgYXN5bmMgaW5zdGVhZCBvZgogICAgLy8gc2ltdWxhdGluZyBpdCB3aXRoIGEgdGltZXIuCiAgICBUaW1lci5ydW4oKCkgewogICAgICB2YXIgc3RhdHVzID0gbmV3IF9Qcm9jZXNzU3RhcnRTdGF0dXMoKTsKICAgICAgYm9vbCBzdWNjZXNzID0gX3N0YXJ0TmF0aXZlKAogICAgICAgICAgX05hbWVzcGFjZS5fbmFtZXNwYWNlLAogICAgICAgICAgX3BhdGgsCiAgICAgICAgICBfYXJndW1lbnRzLAogICAgICAgICAgX3dvcmtpbmdEaXJlY3RvcnksCiAgICAgICAgICBfZW52aXJvbm1lbnQsCiAgICAgICAgICBfbW9kZS5fbW9kZSwKICAgICAgICAgIF9tb2RlSGFzU3RkaW8oX21vZGUpID8gX3N0ZGluTmF0aXZlU29ja2V0IDogbnVsbCwKICAgICAgICAgIF9tb2RlSGFzU3RkaW8oX21vZGUpID8gX3N0ZG91dE5hdGl2ZVNvY2tldCA6IG51bGwsCiAgICAgICAgICBfbW9kZUhhc1N0ZGlvKF9tb2RlKSA/IF9zdGRlcnJOYXRpdmVTb2NrZXQgOiBudWxsLAogICAgICAgICAgX21vZGVJc0F0dGFjaGVkKF9tb2RlKSA/IF9leGl0SGFuZGxlci5fbmF0aXZlU29ja2V0IDogbnVsbCwKICAgICAgICAgIHN0YXR1cyk7CiAgICAgIGlmICghc3VjY2VzcykgewogICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKG5ldyBQcm9jZXNzRXhjZXB0aW9uKAogICAgICAgICAgICBfcGF0aCwgX2FyZ3VtZW50cywgc3RhdHVzLl9lcnJvck1lc3NhZ2UsIHN0YXR1cy5fZXJyb3JDb2RlKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBfc3RhcnRlZCA9IHRydWU7CiAgICAgIF9yZXNvdXJjZUluZm8gPSBuZXcgX1Byb2Nlc3NSZXNvdXJjZUluZm8odGhpcyk7CgogICAgICAvLyBTZXR1cCBhbiBleGl0IGhhbmRsZXIgdG8gaGFuZGxlIGludGVybmFsIGNsZWFudXAgYW5kIHBvc3NpYmxlCiAgICAgIC8vIGNhbGxiYWNrIHdoZW4gYSBwcm9jZXNzIHRlcm1pbmF0ZXMuCiAgICAgIGlmIChfbW9kZUlzQXR0YWNoZWQoX21vZGUpKSB7CiAgICAgICAgaW50IGV4aXREYXRhUmVhZCA9IDA7CiAgICAgICAgZmluYWwgaW50IEVYSVRfREFUQV9TSVpFID0gODsKICAgICAgICBMaXN0PGludD4gZXhpdERhdGFCdWZmZXIgPSBuZXcgTGlzdDxpbnQ+KEVYSVRfREFUQV9TSVpFKTsKICAgICAgICBfZXhpdEhhbmRsZXIubGlzdGVuKChkYXRhKSB7CiAgICAgICAgICBpbnQgZXhpdENvZGUoTGlzdDxpbnQ+IGludHMpIHsKICAgICAgICAgICAgdmFyIGNvZGUgPSBfaW50RnJvbUJ5dGVzKGludHMsIDApOwogICAgICAgICAgICB2YXIgbmVnYXRpdmUgPSBfaW50RnJvbUJ5dGVzKGludHMsIDQpOwogICAgICAgICAgICBhc3NlcnQobmVnYXRpdmUgPT0gMCB8fCBuZWdhdGl2ZSA9PSAxKTsKICAgICAgICAgICAgcmV0dXJuIChuZWdhdGl2ZSA9PSAwKSA/IGNvZGUgOiAtY29kZTsKICAgICAgICAgIH0KCiAgICAgICAgICB2b2lkIGhhbmRsZUV4aXQoKSB7CiAgICAgICAgICAgIF9lbmRlZCA9IHRydWU7CiAgICAgICAgICAgIF9leGl0Q29kZS5jb21wbGV0ZShleGl0Q29kZShleGl0RGF0YUJ1ZmZlcikpOwogICAgICAgICAgICAvLyBLaWxsIHN0ZGluLCBoZWxwaW5nIGhhbmQgaWYgdGhlIHVzZXIgZm9yZ290IHRvIGRvIGl0LgogICAgICAgICAgICBpZiAoX21vZGVIYXNTdGRpbyhfbW9kZSkpIHsKICAgICAgICAgICAgICAoX3N0ZGluLl9zaW5rIGFzIF9Tb2NrZXQpLmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfcmVzb3VyY2VJbmZvLnN0b3BwZWQoKTsKICAgICAgICAgIH0KCiAgICAgICAgICBleGl0RGF0YUJ1ZmZlci5zZXRSYW5nZSgKICAgICAgICAgICAgICBleGl0RGF0YVJlYWQsIGV4aXREYXRhUmVhZCArIGRhdGEubGVuZ3RoLCBkYXRhKTsKICAgICAgICAgIGV4aXREYXRhUmVhZCArPSBkYXRhLmxlbmd0aDsKICAgICAgICAgIGlmIChleGl0RGF0YVJlYWQgPT0gRVhJVF9EQVRBX1NJWkUpIHsKICAgICAgICAgICAgaGFuZGxlRXhpdCgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBjb21wbGV0ZXIuY29tcGxldGUodGhpcyk7CiAgICB9KTsKICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgUHJvY2Vzc1Jlc3VsdCBfcnVuQW5kV2FpdChFbmNvZGluZyBzdGRvdXRFbmNvZGluZywgRW5jb2Rpbmcgc3RkZXJyRW5jb2RpbmcpIHsKICAgIHZhciBzdGF0dXMgPSBuZXcgX1Byb2Nlc3NTdGFydFN0YXR1cygpOwogICAgX2V4aXRDb2RlID0gbmV3IENvbXBsZXRlcjxpbnQ+KCk7CiAgICBib29sIHN1Y2Nlc3MgPSBfc3RhcnROYXRpdmUoCiAgICAgICAgX05hbWVzcGFjZS5fbmFtZXNwYWNlLAogICAgICAgIF9wYXRoLAogICAgICAgIF9hcmd1bWVudHMsCiAgICAgICAgX3dvcmtpbmdEaXJlY3RvcnksCiAgICAgICAgX2Vudmlyb25tZW50LAogICAgICAgIFByb2Nlc3NTdGFydE1vZGUubm9ybWFsLl9tb2RlLAogICAgICAgIF9zdGRpbk5hdGl2ZVNvY2tldCwKICAgICAgICBfc3Rkb3V0TmF0aXZlU29ja2V0LAogICAgICAgIF9zdGRlcnJOYXRpdmVTb2NrZXQsCiAgICAgICAgX2V4aXRIYW5kbGVyLl9uYXRpdmVTb2NrZXQsCiAgICAgICAgc3RhdHVzKTsKICAgIGlmICghc3VjY2VzcykgewogICAgICB0aHJvdyBuZXcgUHJvY2Vzc0V4Y2VwdGlvbigKICAgICAgICAgIF9wYXRoLCBfYXJndW1lbnRzLCBzdGF0dXMuX2Vycm9yTWVzc2FnZSwgc3RhdHVzLl9lcnJvckNvZGUpOwogICAgfQoKICAgIF9yZXNvdXJjZUluZm8gPSBuZXcgX1Byb2Nlc3NSZXNvdXJjZUluZm8odGhpcyk7CgogICAgdmFyIHJlc3VsdCA9IF93YWl0KF9zdGRpbk5hdGl2ZVNvY2tldCwgX3N0ZG91dE5hdGl2ZVNvY2tldCwKICAgICAgICBfc3RkZXJyTmF0aXZlU29ja2V0LCBfZXhpdEhhbmRsZXIuX25hdGl2ZVNvY2tldCk7CgogICAgZ2V0T3V0cHV0KG91dHB1dCwgZW5jb2RpbmcpIHsKICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHJldHVybiBvdXRwdXQ7CiAgICAgIHJldHVybiBlbmNvZGluZy5kZWNvZGUob3V0cHV0KTsKICAgIH0KCiAgICBfcmVzb3VyY2VJbmZvLnN0b3BwZWQoKTsKCiAgICByZXR1cm4gbmV3IFByb2Nlc3NSZXN1bHQoCiAgICAgICAgcmVzdWx0WzBdLAogICAgICAgIHJlc3VsdFsxXSwKICAgICAgICBnZXRPdXRwdXQocmVzdWx0WzJdLCBzdGRvdXRFbmNvZGluZyksCiAgICAgICAgZ2V0T3V0cHV0KHJlc3VsdFszXSwgc3RkZXJyRW5jb2RpbmcpKTsKICB9CgogIGJvb2wgX3N0YXJ0TmF0aXZlKAogICAgICBfTmFtZXNwYWNlIG5hbWVzcGFjZSwKICAgICAgU3RyaW5nIHBhdGgsCiAgICAgIExpc3Q8U3RyaW5nPiBhcmd1bWVudHMsCiAgICAgIFN0cmluZyB3b3JraW5nRGlyZWN0b3J5LAogICAgICBMaXN0PFN0cmluZz4gZW52aXJvbm1lbnQsCiAgICAgIGludCBtb2RlLAogICAgICBfTmF0aXZlU29ja2V0IHN0ZGluLAogICAgICBfTmF0aXZlU29ja2V0IHN0ZG91dCwKICAgICAgX05hdGl2ZVNvY2tldCBzdGRlcnIsCiAgICAgIF9OYXRpdmVTb2NrZXQgZXhpdEhhbmRsZXIsCiAgICAgIF9Qcm9jZXNzU3RhcnRTdGF0dXMgc3RhdHVzKSBuYXRpdmUgIlByb2Nlc3NfU3RhcnQiOwoKICBfd2FpdChfTmF0aXZlU29ja2V0IHN0ZGluLCBfTmF0aXZlU29ja2V0IHN0ZG91dCwgX05hdGl2ZVNvY2tldCBzdGRlcnIsCiAgICAgIF9OYXRpdmVTb2NrZXQgZXhpdEhhbmRsZXIpIG5hdGl2ZSAiUHJvY2Vzc19XYWl0IjsKCiAgU3RyZWFtPExpc3Q8aW50Pj4gZ2V0IHN0ZG91dCB7CiAgICByZXR1cm4gX3N0ZG91dDsKICB9CgogIFN0cmVhbTxMaXN0PGludD4+IGdldCBzdGRlcnIgewogICAgcmV0dXJuIF9zdGRlcnI7CiAgfQoKICBJT1NpbmsgZ2V0IHN0ZGluIHsKICAgIHJldHVybiBfc3RkaW47CiAgfQoKICBGdXR1cmU8aW50PiBnZXQgZXhpdENvZGUgPT4gX2V4aXRDb2RlICE9IG51bGwgPyBfZXhpdENvZGUuZnV0dXJlIDogbnVsbDsKCiAgYm9vbCBraWxsKFtQcm9jZXNzU2lnbmFsIHNpZ25hbCA9IFByb2Nlc3NTaWduYWwuc2lndGVybV0pIHsKICAgIGlmIChzaWduYWwgaXMhIFByb2Nlc3NTaWduYWwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkFyZ3VtZW50ICdzaWduYWwnIG11c3QgYmUgYSBQcm9jZXNzU2lnbmFsIik7CiAgICB9CiAgICBhc3NlcnQoX3N0YXJ0ZWQpOwogICAgaWYgKF9lbmRlZCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIF9Qcm9jZXNzVXRpbHMuX2tpbGxQaWQocGlkLCBzaWduYWwuX3NpZ25hbE51bWJlcik7CiAgfQoKICBpbnQgZ2V0IHBpZCA9PiBfUHJvY2Vzc1V0aWxzLl9waWQodGhpcyk7CgogIFN0cmluZyBfcGF0aDsKICBMaXN0PFN0cmluZz4gX2FyZ3VtZW50czsKICBTdHJpbmcgX3dvcmtpbmdEaXJlY3Rvcnk7CiAgTGlzdDxTdHJpbmc+IF9lbnZpcm9ubWVudDsKICBQcm9jZXNzU3RhcnRNb2RlIF9tb2RlOwogIC8vIFByaXZhdGUgbWV0aG9kcyBvZiBTb2NrZXQgYXJlIHVzZWQgYnkgX2luLCBfb3V0LCBhbmQgX2Vyci4KICBfU3RkU2luayBfc3RkaW47CiAgX1N0ZFN0cmVhbSBfc3Rkb3V0OwogIF9TdGRTdHJlYW0gX3N0ZGVycjsKICBfU29ja2V0IF9leGl0SGFuZGxlcjsKICBib29sIF9lbmRlZDsKICBib29sIF9zdGFydGVkOwogIENvbXBsZXRlcjxpbnQ+IF9leGl0Q29kZTsKfQoKLy8gX05vbkludGVyYWN0aXZlUHJvY2VzcyBpcyBhIHdyYXBwZXIgYXJvdW5kIGFuIGludGVyYWN0aXZlIHByb2Nlc3MKLy8gdGhhdCBidWZmZXJzIG91dHB1dCBzbyBpdCBjYW4gYmUgZGVsaXZlcmVkIHdoZW4gdGhlIHByb2Nlc3MgZXhpdHMuCi8vIF9Ob25JbnRlcmFjdGl2ZVByb2Nlc3MgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIFByb2Nlc3MucnVuCi8vIG1ldGhvZC4KRnV0dXJlPFByb2Nlc3NSZXN1bHQ+IF9ydW5Ob25JbnRlcmFjdGl2ZVByb2Nlc3MoCiAgICBTdHJpbmcgcGF0aCwKICAgIExpc3Q8U3RyaW5nPiBhcmd1bWVudHMsCiAgICBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSwKICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQsCiAgICBib29sIGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudCwKICAgIGJvb2wgcnVuSW5TaGVsbCwKICAgIEVuY29kaW5nIHN0ZG91dEVuY29kaW5nLAogICAgRW5jb2Rpbmcgc3RkZXJyRW5jb2RpbmcpIHsKICAvLyBTdGFydCB0aGUgdW5kZXJseWluZyBwcm9jZXNzLgogIHJldHVybiBQcm9jZXNzLnN0YXJ0KHBhdGgsIGFyZ3VtZW50cywKICAgICAgICAgIHdvcmtpbmdEaXJlY3Rvcnk6IHdvcmtpbmdEaXJlY3RvcnksCiAgICAgICAgICBlbnZpcm9ubWVudDogZW52aXJvbm1lbnQsCiAgICAgICAgICBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQ6IGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudCwKICAgICAgICAgIHJ1bkluU2hlbGw6IHJ1bkluU2hlbGwpCiAgICAgIC50aGVuKChQcm9jZXNzIHApIHsKICAgIGludCBwaWQgPSBwLnBpZDsKCiAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2Nlc3Mgc3RkaW4gaXMgY2xvc2VkLgogICAgcC5zdGRpbi5jbG9zZSgpOwoKICAgIC8vIFNldHVwIHN0ZG91dCBhbmQgc3RkZXJyIGhhbmRsaW5nLgogICAgRnV0dXJlIGZvbGRTdHJlYW0oU3RyZWFtPExpc3Q8aW50Pj4gc3RyZWFtLCBFbmNvZGluZyBlbmNvZGluZykgewogICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgewogICAgICAgIHJldHVybiBzdHJlYW0KICAgICAgICAgICAgLmZvbGQobmV3IEJ5dGVzQnVpbGRlcigpLCAoYnVpbGRlciwgZGF0YSkgPT4gYnVpbGRlci4uYWRkKGRhdGEpKQogICAgICAgICAgICAudGhlbigoYnVpbGRlcikgPT4gYnVpbGRlci50YWtlQnl0ZXMoKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHN0cmVhbS50cmFuc2Zvcm0oZW5jb2RpbmcuZGVjb2RlcikuZm9sZChuZXcgU3RyaW5nQnVmZmVyKCksCiAgICAgICAgICAgIChidWYsIGRhdGEpIHsKICAgICAgICAgIGJ1Zi53cml0ZShkYXRhKTsKICAgICAgICAgIHJldHVybiBidWY7CiAgICAgICAgfSkudGhlbigoc2IpID0+IHNiLnRvU3RyaW5nKCkpOwogICAgICB9CiAgICB9CgogICAgRnV0dXJlIHN0ZG91dCA9IGZvbGRTdHJlYW0ocC5zdGRvdXQsIHN0ZG91dEVuY29kaW5nKTsKICAgIEZ1dHVyZSBzdGRlcnIgPSBmb2xkU3RyZWFtKHAuc3RkZXJyLCBzdGRlcnJFbmNvZGluZyk7CgogICAgcmV0dXJuIEZ1dHVyZS53YWl0KFtwLmV4aXRDb2RlLCBzdGRvdXQsIHN0ZGVycl0pLnRoZW4oKHJlc3VsdCkgewogICAgICByZXR1cm4gbmV3IFByb2Nlc3NSZXN1bHQocGlkLCByZXN1bHRbMF0sIHJlc3VsdFsxXSwgcmVzdWx0WzJdKTsKICAgIH0pOwogIH0pOwp9CgpQcm9jZXNzUmVzdWx0IF9ydW5Ob25JbnRlcmFjdGl2ZVByb2Nlc3NTeW5jKAogICAgU3RyaW5nIGV4ZWN1dGFibGUsCiAgICBMaXN0PFN0cmluZz4gYXJndW1lbnRzLAogICAgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnksCiAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50LAogICAgYm9vbCBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQsCiAgICBib29sIHJ1bkluU2hlbGwsCiAgICBFbmNvZGluZyBzdGRvdXRFbmNvZGluZywKICAgIEVuY29kaW5nIHN0ZGVyckVuY29kaW5nKSB7CiAgdmFyIHByb2Nlc3MgPSBuZXcgX1Byb2Nlc3NJbXBsKAogICAgICBleGVjdXRhYmxlLAogICAgICBhcmd1bWVudHMsCiAgICAgIHdvcmtpbmdEaXJlY3RvcnksCiAgICAgIGVudmlyb25tZW50LAogICAgICBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQsCiAgICAgIHJ1bkluU2hlbGwsCiAgICAgIFByb2Nlc3NTdGFydE1vZGUubm9ybWFsKTsKICByZXR1cm4gcHJvY2Vzcy5fcnVuQW5kV2FpdChzdGRvdXRFbmNvZGluZywgc3RkZXJyRW5jb2RpbmcpOwp9CoJ9AE5OPAEgAQcgCU8CAQcgCVECAQcQCUogJyseOS0UExoVIhQPHQQBCU4gJyseLzImFBMaFSIUGBkEAQlKICcrHi8yKhQTGhUiFBgZBAEJUSRMBj4EAgE7ARoeAS8LASNBLwQBOgETNhYSTg4GDkQcKiMxIwoICAQBExcxEgYEAUotKwIBIkoBBxYJNwlFCToJOQk5RglEKiorHzAzNiE8BikEAUw8UAY8BAIBBxQJGhwdFAYTBAEJHiAdFAYTBAEwOAIBGhwjQyNMAgFNGUQBSiYwARATHh4nJRcdEiUZUTY3JwYBFjchBgEbPgYSAR5GBiAoJB4cPggkID8IBgFFH0MGARczRB9JBicwIUkIJwgkMh8hRC0rCgoGASVIBhIBHyFGJUglSAYhLgYUFgQBKi8rMisyATcwMQQBNTA2BAElHhgGFgQBKjMmHiAmIyEIDSw6KiAjLiYIMgYbBAEzGyMiIkQeATgtKiMXNR8eIEQaEQpIMRsKGSAzCD4eAUEfIhglOhgTCBUeBgETBAEzHCMkJAQBHS4iKAZMIxMuIyERFh0YFzw9PUYTFjZKEAgBFzYBRy0kHiZCJSkvMzQzDAEeGzpFKDMOJQwBIz8nMBoMDAgBIAgdBAFQLCYhHw8UGxYnHB0dJBEUIkcGATQBQDoBIismBgEdAR4TEy4vBAEVHBMeHyAQGxwcIToBSTgBIRQEASEUBAEVEwQBSwE+JEwGFh4+BAErARAbHB0aQBMWFhgPERwCAUVGPwsxERwdJSMVHR8jKC4kPiIaFQEuFQEpRR4WTTUPSxobFigIBgE6OgFFRggGAgEtFxwdJSMVHR8iEhEYEyASID4CASBkYXJ0OmlvLXBhdGNoL3Byb2Nlc3NfcGF0Y2guZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvYmluL3NvY2tldF9wYXRjaC5kYXJ0wADy4i8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb21tb25fcGF0Y2guZGFydCI7CgpAcGF0Y2gKY2xhc3MgUmF3U2VydmVyU29ja2V0IHsKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPFJhd1NlcnZlclNvY2tldD4gYmluZChhZGRyZXNzLCBpbnQgcG9ydCwKICAgICAge2ludCBiYWNrbG9nOiAwLCBib29sIHY2T25seTogZmFsc2UsIGJvb2wgc2hhcmVkOiBmYWxzZX0pIHsKICAgIHJldHVybiBfUmF3U2VydmVyU29ja2V0LmJpbmQoYWRkcmVzcywgcG9ydCwgYmFja2xvZywgdjZPbmx5LCBzaGFyZWQpOwogIH0KfQoKQHBhdGNoCmNsYXNzIFJhd1NvY2tldCB7CiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxSYXdTb2NrZXQ+IGNvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0fSkgewogICAgcmV0dXJuIF9SYXdTb2NrZXQuY29ubmVjdChob3N0LCBwb3J0LCBzb3VyY2VBZGRyZXNzLCB0aW1lb3V0KTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8Q29ubmVjdGlvblRhc2s8UmF3U29ja2V0Pj4gc3RhcnRDb25uZWN0KGhvc3QsIGludCBwb3J0LAogICAgICB7c291cmNlQWRkcmVzc30pIHsKICAgIHJldHVybiBfUmF3U29ja2V0LnN0YXJ0Q29ubmVjdChob3N0LCBwb3J0LCBzb3VyY2VBZGRyZXNzKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBSYXdTb2NrZXRPcHRpb24gewogIHN0YXRpYyBmaW5hbCBMaXN0PGludD4gX29wdGlvbnNDYWNoZSA9CiAgICAgIExpc3Q8aW50PihfUmF3U29ja2V0T3B0aW9ucy52YWx1ZXMubGVuZ3RoKTsKCiAgQHBhdGNoCiAgc3RhdGljIGludCBfZ2V0T3B0aW9uVmFsdWUoaW50IGtleSkgewogICAgaWYgKGtleSA+IF9SYXdTb2NrZXRPcHRpb25zLnZhbHVlcy5sZW5ndGgpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvci52YWx1ZShrZXksICdrZXknKTsKICAgIH0KICAgIF9vcHRpb25zQ2FjaGVba2V5XSA/Pz0gX2dldE5hdGl2ZU9wdGlvblZhbHVlKGtleSk7CiAgICByZXR1cm4gX29wdGlvbnNDYWNoZVtrZXldOwogIH0KCiAgc3RhdGljIGludCBfZ2V0TmF0aXZlT3B0aW9uVmFsdWUoaW50IGtleSkKICAgICAgbmF0aXZlICJSYXdTb2NrZXRPcHRpb25fR2V0T3B0aW9uVmFsdWUiOwp9CgpAcGF0Y2gKY2xhc3MgSW50ZXJuZXRBZGRyZXNzIHsKICBAcGF0Y2gKICBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzIGdldCBMT09QQkFDS19JUF9WNCB7CiAgICByZXR1cm4gX0ludGVybmV0QWRkcmVzcy5sb29wYmFja0lQdjQ7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzIGdldCBMT09QQkFDS19JUF9WNiB7CiAgICByZXR1cm4gX0ludGVybmV0QWRkcmVzcy5sb29wYmFja0lQdjY7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzIGdldCBBTllfSVBfVjQgewogICAgcmV0dXJuIF9JbnRlcm5ldEFkZHJlc3MuYW55SVB2NDsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBJbnRlcm5ldEFkZHJlc3MgZ2V0IEFOWV9JUF9WNiB7CiAgICByZXR1cm4gX0ludGVybmV0QWRkcmVzcy5hbnlJUHY2OwogIH0KCiAgQHBhdGNoCiAgZmFjdG9yeSBJbnRlcm5ldEFkZHJlc3MoU3RyaW5nIGFkZHJlc3MpIHsKICAgIHJldHVybiBuZXcgX0ludGVybmV0QWRkcmVzcy5wYXJzZShhZGRyZXNzKTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8TGlzdDxJbnRlcm5ldEFkZHJlc3M+PiBsb29rdXAoU3RyaW5nIGhvc3QsCiAgICAgIHtJbnRlcm5ldEFkZHJlc3NUeXBlIHR5cGU6IEludGVybmV0QWRkcmVzc1R5cGUuYW55fSkgewogICAgcmV0dXJuIF9OYXRpdmVTb2NrZXQubG9va3VwKGhvc3QsIHR5cGU6IHR5cGUpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIEludGVybmV0QWRkcmVzcyBfY2xvbmVXaXRoTmV3SG9zdCgKICAgICAgSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3MsIFN0cmluZyBob3N0KSB7CiAgICByZXR1cm4gKGFkZHJlc3MgYXMgX0ludGVybmV0QWRkcmVzcykuX2Nsb25lV2l0aE5ld0hvc3QoaG9zdCk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgTmV0d29ya0ludGVyZmFjZSB7CiAgQHBhdGNoCiAgc3RhdGljIGJvb2wgZ2V0IGxpc3RTdXBwb3J0ZWQgewogICAgcmV0dXJuIF9saXN0U3VwcG9ydGVkKCk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPExpc3Q8TmV0d29ya0ludGVyZmFjZT4+IGxpc3QoCiAgICAgIHtib29sIGluY2x1ZGVMb29wYmFjazogZmFsc2UsCiAgICAgIGJvb2wgaW5jbHVkZUxpbmtMb2NhbDogZmFsc2UsCiAgICAgIEludGVybmV0QWRkcmVzc1R5cGUgdHlwZTogSW50ZXJuZXRBZGRyZXNzVHlwZS5hbnl9KSB7CiAgICByZXR1cm4gX05hdGl2ZVNvY2tldC5saXN0SW50ZXJmYWNlcygKICAgICAgICBpbmNsdWRlTG9vcGJhY2s6IGluY2x1ZGVMb29wYmFjaywKICAgICAgICBpbmNsdWRlTGlua0xvY2FsOiBpbmNsdWRlTGlua0xvY2FsLAogICAgICAgIHR5cGU6IHR5cGUpOwogIH0KCiAgc3RhdGljIGJvb2wgX2xpc3RTdXBwb3J0ZWQoKSBuYXRpdmUgIk5ldHdvcmtJbnRlcmZhY2VfTGlzdFN1cHBvcnRlZCI7Cn0KCnZvaWQgX3Rocm93T25CYWRQb3J0KGludCBwb3J0KSB7CiAgaWYgKChwb3J0ID09IG51bGwpIHx8IChwb3J0IDwgMCkgfHwgKHBvcnQgPiAweEZGRkYpKSB7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSW52YWxpZCBwb3J0ICRwb3J0Iik7CiAgfQp9Cgp2b2lkIF90aHJvd09uQmFkVHRsKGludCB0dGwpIHsKICBpZiAodHRsID09IG51bGwgfHwgdHRsIDwgMSB8fCB0dGwgPiAyNTUpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIHR0bCAkdHRsJyk7CiAgfQp9CgpjbGFzcyBfSW50ZXJuZXRBZGRyZXNzIGltcGxlbWVudHMgSW50ZXJuZXRBZGRyZXNzIHsKICBzdGF0aWMgY29uc3QgaW50IF9hZGRyZXNzTG9vcGJhY2tJUHY0ID0gMDsKICBzdGF0aWMgY29uc3QgaW50IF9hZGRyZXNzTG9vcGJhY2tJUHY2ID0gMTsKICBzdGF0aWMgY29uc3QgaW50IF9hZGRyZXNzQW55SVB2NCA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBfYWRkcmVzc0FueUlQdjYgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgX0lQdjRBZGRyTGVuZ3RoID0gNDsKICBzdGF0aWMgY29uc3QgaW50IF9JUHY2QWRkckxlbmd0aCA9IDE2OwoKICBzdGF0aWMgX0ludGVybmV0QWRkcmVzcyBsb29wYmFja0lQdjQgPQogICAgICBuZXcgX0ludGVybmV0QWRkcmVzcy5maXhlZChfYWRkcmVzc0xvb3BiYWNrSVB2NCk7CiAgc3RhdGljIF9JbnRlcm5ldEFkZHJlc3MgbG9vcGJhY2tJUHY2ID0KICAgICAgbmV3IF9JbnRlcm5ldEFkZHJlc3MuZml4ZWQoX2FkZHJlc3NMb29wYmFja0lQdjYpOwogIHN0YXRpYyBfSW50ZXJuZXRBZGRyZXNzIGFueUlQdjQgPSBuZXcgX0ludGVybmV0QWRkcmVzcy5maXhlZChfYWRkcmVzc0FueUlQdjQpOwogIHN0YXRpYyBfSW50ZXJuZXRBZGRyZXNzIGFueUlQdjYgPSBuZXcgX0ludGVybmV0QWRkcmVzcy5maXhlZChfYWRkcmVzc0FueUlQdjYpOwoKICBmaW5hbCBTdHJpbmcgYWRkcmVzczsKICBmaW5hbCBTdHJpbmcgX2hvc3Q7CiAgZmluYWwgVWludDhMaXN0IF9pbl9hZGRyOwoKICBJbnRlcm5ldEFkZHJlc3NUeXBlIGdldCB0eXBlID0+IF9pbl9hZGRyLmxlbmd0aCA9PSBfSVB2NEFkZHJMZW5ndGgKICAgICAgPyBJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjQKICAgICAgOiBJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjY7CgogIFN0cmluZyBnZXQgaG9zdCA9PiBfaG9zdCAhPSBudWxsID8gX2hvc3QgOiBhZGRyZXNzOwoKICBVaW50OExpc3QgZ2V0IHJhd0FkZHJlc3MgPT4gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChfaW5fYWRkcik7CgogIGJvb2wgZ2V0IGlzTG9vcGJhY2sgewogICAgc3dpdGNoICh0eXBlKSB7CiAgICAgIGNhc2UgSW50ZXJuZXRBZGRyZXNzVHlwZS5JUHY0OgogICAgICAgIHJldHVybiBfaW5fYWRkclswXSA9PSAxMjc7CgogICAgICBjYXNlIEludGVybmV0QWRkcmVzc1R5cGUuSVB2NjoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9JUHY2QWRkckxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgaWYgKF9pbl9hZGRyW2ldICE9IDApIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9pbl9hZGRyW19JUHY2QWRkckxlbmd0aCAtIDFdID09IDE7CiAgICB9CiAgfQoKICBib29sIGdldCBpc0xpbmtMb2NhbCB7CiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgY2FzZSBJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjQ6CiAgICAgICAgLy8gQ2hlY2tpbmcgZm9yIDE2OS4yNTQuMC4wLzE2LgogICAgICAgIHJldHVybiBfaW5fYWRkclswXSA9PSAxNjkgJiYgX2luX2FkZHJbMV0gPT0gMjU0OwoKICAgICAgY2FzZSBJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjY6CiAgICAgICAgLy8gQ2hlY2tpbmcgZm9yIGZlODA6Oi8xMC4KICAgICAgICByZXR1cm4gX2luX2FkZHJbMF0gPT0gMHhGRSAmJiAoX2luX2FkZHJbMV0gJiAweEIwKSA9PSAweDgwOwogICAgfQogIH0KCiAgYm9vbCBnZXQgaXNNdWx0aWNhc3QgewogICAgc3dpdGNoICh0eXBlKSB7CiAgICAgIGNhc2UgSW50ZXJuZXRBZGRyZXNzVHlwZS5JUHY0OgogICAgICAgIC8vIENoZWNraW5nIGZvciAyMjQuMC4wLjAgdGhyb3VnaCAyMzkuMjU1LjI1NS4yNTUuCiAgICAgICAgcmV0dXJuIF9pbl9hZGRyWzBdID49IDIyNCAmJiBfaW5fYWRkclswXSA8IDI0MDsKCiAgICAgIGNhc2UgSW50ZXJuZXRBZGRyZXNzVHlwZS5JUHY2OgogICAgICAgIC8vIENoZWNraW5nIGZvciBmZjAwOjovOC4KICAgICAgICByZXR1cm4gX2luX2FkZHJbMF0gPT0gMHhGRjsKICAgIH0KICB9CgogIEZ1dHVyZTxJbnRlcm5ldEFkZHJlc3M+IHJldmVyc2UoKSA9PiBfTmF0aXZlU29ja2V0LnJldmVyc2VMb29rdXAodGhpcyk7CgogIF9JbnRlcm5ldEFkZHJlc3ModGhpcy5hZGRyZXNzLCB0aGlzLl9ob3N0LCB0aGlzLl9pbl9hZGRyKTsKCiAgZmFjdG9yeSBfSW50ZXJuZXRBZGRyZXNzLnBhcnNlKFN0cmluZyBhZGRyZXNzKSB7CiAgICBpZiAoYWRkcmVzcyBpcyEgU3RyaW5nKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJJbnZhbGlkIGludGVybmV0IGFkZHJlc3MgJGFkZHJlc3MiKTsKICAgIH0KICAgIHZhciBpbl9hZGRyID0gX3BhcnNlKGFkZHJlc3MpOwogICAgaWYgKGluX2FkZHIgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSW52YWxpZCBpbnRlcm5ldCBhZGRyZXNzICRhZGRyZXNzIik7CiAgICB9CiAgICByZXR1cm4gbmV3IF9JbnRlcm5ldEFkZHJlc3MoYWRkcmVzcywgbnVsbCwgaW5fYWRkcik7CiAgfQoKICBmYWN0b3J5IF9JbnRlcm5ldEFkZHJlc3MuZml4ZWQoaW50IGlkKSB7CiAgICBzd2l0Y2ggKGlkKSB7CiAgICAgIGNhc2UgX2FkZHJlc3NMb29wYmFja0lQdjQ6CiAgICAgICAgdmFyIGluX2FkZHIgPSBuZXcgVWludDhMaXN0KF9JUHY0QWRkckxlbmd0aCk7CiAgICAgICAgaW5fYWRkclswXSA9IDEyNzsKICAgICAgICBpbl9hZGRyW19JUHY0QWRkckxlbmd0aCAtIDFdID0gMTsKICAgICAgICByZXR1cm4gbmV3IF9JbnRlcm5ldEFkZHJlc3MoIjEyNy4wLjAuMSIsIG51bGwsIGluX2FkZHIpOwogICAgICBjYXNlIF9hZGRyZXNzTG9vcGJhY2tJUHY2OgogICAgICAgIHZhciBpbl9hZGRyID0gbmV3IFVpbnQ4TGlzdChfSVB2NkFkZHJMZW5ndGgpOwogICAgICAgIGluX2FkZHJbX0lQdjZBZGRyTGVuZ3RoIC0gMV0gPSAxOwogICAgICAgIHJldHVybiBuZXcgX0ludGVybmV0QWRkcmVzcygiOjoxIiwgbnVsbCwgaW5fYWRkcik7CiAgICAgIGNhc2UgX2FkZHJlc3NBbnlJUHY0OgogICAgICAgIHZhciBpbl9hZGRyID0gbmV3IFVpbnQ4TGlzdChfSVB2NEFkZHJMZW5ndGgpOwogICAgICAgIHJldHVybiBuZXcgX0ludGVybmV0QWRkcmVzcygiMC4wLjAuMCIsICIwLjAuMC4wIiwgaW5fYWRkcik7CiAgICAgIGNhc2UgX2FkZHJlc3NBbnlJUHY2OgogICAgICAgIHZhciBpbl9hZGRyID0gbmV3IFVpbnQ4TGlzdChfSVB2NkFkZHJMZW5ndGgpOwogICAgICAgIHJldHVybiBuZXcgX0ludGVybmV0QWRkcmVzcygiOjoiLCAiOjoiLCBpbl9hZGRyKTsKICAgICAgZGVmYXVsdDoKICAgICAgICBhc3NlcnQoZmFsc2UpOwogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICB9CiAgfQoKICAvLyBDcmVhdGUgYSBjbG9uZSBvZiB0aGlzIF9JbnRlcm5ldEFkZHJlc3MgcmVwbGFjaW5nIHRoZSBob3N0LgogIF9JbnRlcm5ldEFkZHJlc3MgX2Nsb25lV2l0aE5ld0hvc3QoU3RyaW5nIGhvc3QpIHsKICAgIHJldHVybiBuZXcgX0ludGVybmV0QWRkcmVzcygKICAgICAgICBhZGRyZXNzLCBob3N0LCBuZXcgVWludDhMaXN0LmZyb21MaXN0KF9pbl9hZGRyKSk7CiAgfQoKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoIShvdGhlciBpcyBfSW50ZXJuZXRBZGRyZXNzKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG90aGVyLnR5cGUgIT0gdHlwZSkgcmV0dXJuIGZhbHNlOwogICAgYm9vbCBlcXVhbHMgPSB0cnVlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfaW5fYWRkci5sZW5ndGggJiYgZXF1YWxzOyBpKyspIHsKICAgICAgZXF1YWxzID0gb3RoZXIuX2luX2FkZHJbaV0gPT0gX2luX2FkZHJbaV07CiAgICB9CiAgICByZXR1cm4gZXF1YWxzOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICBpbnQgcmVzdWx0ID0gMTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2luX2FkZHIubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0ID0gKHJlc3VsdCAqIDMxICsgX2luX2FkZHJbaV0pICYgMHgzRkZGRkZGRjsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIkludGVybmV0QWRkcmVzcygnJGFkZHJlc3MnLCAke3R5cGUubmFtZX0pIjsKICB9CgogIHN0YXRpYyBVaW50OExpc3QgX3BhcnNlKFN0cmluZyBhZGRyZXNzKSBuYXRpdmUgIkludGVybmV0QWRkcmVzc19QYXJzZSI7Cn0KCmNsYXNzIF9OZXR3b3JrSW50ZXJmYWNlIGltcGxlbWVudHMgTmV0d29ya0ludGVyZmFjZSB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgaW50IGluZGV4OwogIGZpbmFsIExpc3Q8SW50ZXJuZXRBZGRyZXNzPiBhZGRyZXNzZXMgPSBbXTsKCiAgX05ldHdvcmtJbnRlcmZhY2UodGhpcy5uYW1lLCB0aGlzLmluZGV4KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICJOZXR3b3JrSW50ZXJmYWNlKCckbmFtZScsICRhZGRyZXNzZXMpIjsKICB9Cn0KCi8vIFRoZSBOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczEgY2Fubm90IGJlIHVzZWQgd2l0aCBhIG1peGluLCBkdWUgdG8gbWlzc2luZwovLyBpbXBsaWNpdCBjb25zdHJ1Y3Rvci4KY2xhc3MgX05hdGl2ZVNvY2tldE5hdGl2ZVdyYXBwZXIgZXh0ZW5kcyBOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczEge30KCi8vIFRoZSBfTmF0aXZlU29ja2V0IGNsYXNzIGVuY2Fwc3VsYXRlcyBhbiBPUyBzb2NrZXQuCmNsYXNzIF9OYXRpdmVTb2NrZXQgZXh0ZW5kcyBfTmF0aXZlU29ja2V0TmF0aXZlV3JhcHBlciB3aXRoIF9TZXJ2aWNlT2JqZWN0IHsKICAvLyBCaXQgZmxhZ3MgdXNlZCB3aGVuIGNvbW11bmljYXRpbmcgYmV0d2VlbiB0aGUgZXZlbnRoYW5kbGVyIGFuZAogIC8vIGRhcnQgY29kZS4gVGhlIEVWRU5UIGZsYWdzIGFyZSB1c2VkIHRvIGluZGljYXRlIGV2ZW50cyBvZgogIC8vIGludGVyZXN0IHdoZW4gc2VuZGluZyBhIG1lc3NhZ2UgZnJvbSBkYXJ0IGNvZGUgdG8gdGhlCiAgLy8gZXZlbnRoYW5kbGVyLiBXaGVuIHJlY2VpdmluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgZXZlbnRoYW5kbGVyIHRoZQogIC8vIEVWRU5UIGZsYWdzIGluZGljYXRlIHRoZSBldmVudHMgdGhhdCBhY3R1YWxseSBoYXBwZW5lZC4gVGhlCiAgLy8gQ09NTUFORCBmbGFncyBhcmUgdXNlZCB0byBzZW5kIGNvbW1hbmRzIGZyb20gZGFydCB0byB0aGUKICAvLyBldmVudGhhbmRsZXIuIENPTU1BTkQgZmxhZ3MgYXJlIG5ldmVyIHJlY2VpdmVkIGZyb20gdGhlCiAgLy8gZXZlbnRoYW5kbGVyLiBBZGRpdGlvbmFsIGZsYWdzIGFyZSB1c2VkIHRvIGNvbW11bmljYXRlIG90aGVyCiAgLy8gaW5mb3JtYXRpb24uCiAgc3RhdGljIGNvbnN0IGludCByZWFkRXZlbnQgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgd3JpdGVFdmVudCA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBlcnJvckV2ZW50ID0gMjsKICBzdGF0aWMgY29uc3QgaW50IGNsb3NlZEV2ZW50ID0gMzsKICBzdGF0aWMgY29uc3QgaW50IGRlc3Ryb3llZEV2ZW50ID0gNDsKICBzdGF0aWMgY29uc3QgaW50IGZpcnN0RXZlbnQgPSByZWFkRXZlbnQ7CiAgc3RhdGljIGNvbnN0IGludCBsYXN0RXZlbnQgPSBkZXN0cm95ZWRFdmVudDsKICBzdGF0aWMgY29uc3QgaW50IGV2ZW50Q291bnQgPSBsYXN0RXZlbnQgLSBmaXJzdEV2ZW50ICsgMTsKCiAgc3RhdGljIGNvbnN0IGludCBjbG9zZUNvbW1hbmQgPSA4OwogIHN0YXRpYyBjb25zdCBpbnQgc2h1dGRvd25SZWFkQ29tbWFuZCA9IDk7CiAgc3RhdGljIGNvbnN0IGludCBzaHV0ZG93bldyaXRlQ29tbWFuZCA9IDEwOwogIC8vIFRoZSBsb3dlciBiaXRzIG9mIHJldHVyblRva2VuQ29tbWFuZCBtZXNzYWdlcyBjb250YWlucyB0aGUgbnVtYmVyCiAgLy8gb2YgdG9rZW5zIHJldHVybmVkLgogIHN0YXRpYyBjb25zdCBpbnQgcmV0dXJuVG9rZW5Db21tYW5kID0gMTE7CiAgc3RhdGljIGNvbnN0IGludCBzZXRFdmVudE1hc2tDb21tYW5kID0gMTI7CiAgc3RhdGljIGNvbnN0IGludCBmaXJzdENvbW1hbmQgPSBjbG9zZUNvbW1hbmQ7CiAgc3RhdGljIGNvbnN0IGludCBsYXN0Q29tbWFuZCA9IHNldEV2ZW50TWFza0NvbW1hbmQ7CgogIC8vIFR5cGUgZmxhZyBzZW5kIHRvIHRoZSBldmVudGhhbmRsZXIgcHJvdmlkaW5nIGFkZGl0aW9uYWwKICAvLyBpbmZvcm1hdGlvbiBvbiB0aGUgdHlwZSBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yLgogIHN0YXRpYyBjb25zdCBpbnQgbGlzdGVuaW5nU29ja2V0ID0gMTY7CiAgc3RhdGljIGNvbnN0IGludCBwaXBlU29ja2V0ID0gMTc7CiAgc3RhdGljIGNvbnN0IGludCB0eXBlTm9ybWFsU29ja2V0ID0gMDsKICBzdGF0aWMgY29uc3QgaW50IHR5cGVMaXN0ZW5pbmdTb2NrZXQgPSAxIDw8IGxpc3RlbmluZ1NvY2tldDsKICBzdGF0aWMgY29uc3QgaW50IHR5cGVQaXBlID0gMSA8PCBwaXBlU29ja2V0OwogIHN0YXRpYyBjb25zdCBpbnQgdHlwZVR5cGVNYXNrID0gdHlwZUxpc3RlbmluZ1NvY2tldCB8IHBpcGVTb2NrZXQ7CgogIC8vIFByb3RvY29sIGZsYWdzLgogIC8vIEtlZXAgaW4gc3luYyB3aXRoIFNvY2tldFR5cGUgZW51bSBpbiBzb2NrZXQuaC4KICBzdGF0aWMgY29uc3QgaW50IHRjcFNvY2tldCA9IDE4OwogIHN0YXRpYyBjb25zdCBpbnQgdWRwU29ja2V0ID0gMTk7CiAgc3RhdGljIGNvbnN0IGludCBpbnRlcm5hbFNvY2tldCA9IDIwOwogIHN0YXRpYyBjb25zdCBpbnQgaW50ZXJuYWxTaWduYWxTb2NrZXQgPSAyMTsKICBzdGF0aWMgY29uc3QgaW50IHR5cGVUY3BTb2NrZXQgPSAxIDw8IHRjcFNvY2tldDsKICBzdGF0aWMgY29uc3QgaW50IHR5cGVVZHBTb2NrZXQgPSAxIDw8IHVkcFNvY2tldDsKICBzdGF0aWMgY29uc3QgaW50IHR5cGVJbnRlcm5hbFNvY2tldCA9IDEgPDwgaW50ZXJuYWxTb2NrZXQ7CiAgc3RhdGljIGNvbnN0IGludCB0eXBlSW50ZXJuYWxTaWduYWxTb2NrZXQgPSAxIDw8IGludGVybmFsU2lnbmFsU29ja2V0OwogIHN0YXRpYyBjb25zdCBpbnQgdHlwZVByb3RvY29sTWFzayA9IHR5cGVUY3BTb2NrZXQgfAogICAgICB0eXBlVWRwU29ja2V0IHwKICAgICAgdHlwZUludGVybmFsU29ja2V0IHwKICAgICAgdHlwZUludGVybmFsU2lnbmFsU29ja2V0OwoKICAvLyBOYXRpdmUgcG9ydCBtZXNzYWdlcy4KICBzdGF0aWMgY29uc3QgaG9zdE5hbWVMb29rdXBNZXNzYWdlID0gMDsKICBzdGF0aWMgY29uc3QgbGlzdEludGVyZmFjZXNNZXNzYWdlID0gMTsKICBzdGF0aWMgY29uc3QgcmV2ZXJzZUxvb2t1cE1lc3NhZ2UgPSAyOwoKICAvLyBQcm90b2NvbCBmbGFncy4KICBzdGF0aWMgY29uc3QgaW50IHByb3RvY29sSVB2NCA9IDEgPDwgMDsKICBzdGF0aWMgY29uc3QgaW50IHByb3RvY29sSVB2NiA9IDEgPDwgMTsKCiAgc3RhdGljIGNvbnN0IGludCBub3JtYWxUb2tlbkJhdGNoU2l6ZSA9IDg7CiAgc3RhdGljIGNvbnN0IGludCBsaXN0ZW5pbmdUb2tlbkJhdGNoU2l6ZSA9IDI7CgogIHN0YXRpYyBjb25zdCBEdXJhdGlvbiBfcmV0cnlEdXJhdGlvbiA9IGNvbnN0IER1cmF0aW9uKG1pbGxpc2Vjb25kczogMjUwKTsKICBzdGF0aWMgY29uc3QgRHVyYXRpb24gX3JldHJ5RHVyYXRpb25Mb29wYmFjayA9CiAgICAgIGNvbnN0IER1cmF0aW9uKG1pbGxpc2Vjb25kczogMjUpOwoKICAvLyBTb2NrZXQgY2xvc2Ugc3RhdGUKICBib29sIGlzQ2xvc2VkID0gZmFsc2U7CiAgYm9vbCBpc0Nsb3NpbmcgPSBmYWxzZTsKICBib29sIGlzQ2xvc2VkUmVhZCA9IGZhbHNlOwogIGJvb2wgY2xvc2VkUmVhZEV2ZW50U2VudCA9IGZhbHNlOwogIGJvb2wgaXNDbG9zZWRXcml0ZSA9IGZhbHNlOwogIENvbXBsZXRlciBjbG9zZUNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIuc3luYygpOwoKICAvLyBIYW5kbGVycyBhbmQgcmVjZWl2ZSBwb3J0IGZvciBzb2NrZXQgZXZlbnRzIGZyb20gdGhlIGV2ZW50IGhhbmRsZXIuCiAgZmluYWwgTGlzdCBldmVudEhhbmRsZXJzID0gbmV3IExpc3QoZXZlbnRDb3VudCArIDEpOwogIFJhd1JlY2VpdmVQb3J0IGV2ZW50UG9ydDsKICBib29sIGZsYWdzU2VudCA9IGZhbHNlOwoKICAvLyBUaGUgdHlwZSBmbGFncyBmb3IgdGhpcyBzb2NrZXQuCiAgZmluYWwgaW50IHR5cGVGbGFnczsKCiAgLy8gSG9sZHMgdGhlIHBvcnQgb2YgdGhlIHNvY2tldCwgMCBpZiBub3Qga25vd24uCiAgaW50IGxvY2FsUG9ydCA9IDA7CgogIC8vIEhvbGRzIHRoZSBhZGRyZXNzIHVzZWQgdG8gY29ubmVjdCBvciBiaW5kIHRoZSBzb2NrZXQuCiAgSW50ZXJuZXRBZGRyZXNzIGxvY2FsQWRkcmVzczsKCiAgaW50IGF2YWlsYWJsZSA9IDA7CgogIGludCB0b2tlbnMgPSAwOwoKICBib29sIHNlbmRSZWFkRXZlbnRzID0gZmFsc2U7CiAgYm9vbCByZWFkRXZlbnRJc3N1ZWQgPSBmYWxzZTsKCiAgYm9vbCBzZW5kV3JpdGVFdmVudHMgPSBmYWxzZTsKICBib29sIHdyaXRlRXZlbnRJc3N1ZWQgPSBmYWxzZTsKICBib29sIHdyaXRlQXZhaWxhYmxlID0gZmFsc2U7CgogIHN0YXRpYyBib29sIGNvbm5lY3RlZFJlc291cmNlSGFuZGxlciA9IGZhbHNlOwogIF9SZWFkV3JpdGVSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvOwoKICAvLyBUaGUgb3duZXIgb2JqZWN0IGlzIHRoZSBvYmplY3QgdGhhdCB0aGUgU29ja2V0IGlzIGJlaW5nIHVzZWQgYnksIGUuZy4KICAvLyBhIEh0dHBTZXJ2ZXIsIGEgV2ViU29ja2V0IGNvbm5lY3Rpb24sIGEgcHJvY2VzcyBwaXBlLCBldGMuCiAgT2JqZWN0IG93bmVyOwoKICBzdGF0aWMgRnV0dXJlPExpc3Q8SW50ZXJuZXRBZGRyZXNzPj4gbG9va3VwKFN0cmluZyBob3N0LAogICAgICB7SW50ZXJuZXRBZGRyZXNzVHlwZSB0eXBlOiBJbnRlcm5ldEFkZHJlc3NUeXBlLmFueX0pIHsKICAgIHJldHVybiBfSU9TZXJ2aWNlLl9kaXNwYXRjaChfSU9TZXJ2aWNlLnNvY2tldExvb2t1cCwgW2hvc3QsIHR5cGUuX3ZhbHVlXSkKICAgICAgICAudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKGlzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBjcmVhdGVFcnJvcihyZXNwb25zZSwgIkZhaWxlZCBob3N0IGxvb2t1cDogJyRob3N0JyIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiByZXNwb25zZS5za2lwKDEpLm1hcDxJbnRlcm5ldEFkZHJlc3M+KChyZXN1bHQpIHsKICAgICAgICAgIHZhciB0eXBlID0gbmV3IEludGVybmV0QWRkcmVzc1R5cGUuX2Zyb20ocmVzdWx0WzBdKTsKICAgICAgICAgIHJldHVybiBuZXcgX0ludGVybmV0QWRkcmVzcyhyZXN1bHRbMV0sIGhvc3QsIHJlc3VsdFsyXSk7CiAgICAgICAgfSkudG9MaXN0KCk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxJbnRlcm5ldEFkZHJlc3M+IHJldmVyc2VMb29rdXAoSW50ZXJuZXRBZGRyZXNzIGFkZHIpIHsKICAgIHJldHVybiBfSU9TZXJ2aWNlLl9kaXNwYXRjaChfSU9TZXJ2aWNlLnNvY2tldFJldmVyc2VMb29rdXAsCiAgICAgICAgWyhhZGRyIGFzIF9JbnRlcm5ldEFkZHJlc3MpLl9pbl9hZGRyXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKGlzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBjcmVhdGVFcnJvcihyZXNwb25zZSwgIkZhaWxlZCByZXZlcnNlIGhvc3QgbG9va3VwIiwgYWRkcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIChhZGRyIGFzIF9JbnRlcm5ldEFkZHJlc3MpLl9jbG9uZVdpdGhOZXdIb3N0KHJlc3BvbnNlKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPExpc3Q8TmV0d29ya0ludGVyZmFjZT4+IGxpc3RJbnRlcmZhY2VzKAogICAgICB7Ym9vbCBpbmNsdWRlTG9vcGJhY2s6IGZhbHNlLAogICAgICBib29sIGluY2x1ZGVMaW5rTG9jYWw6IGZhbHNlLAogICAgICBJbnRlcm5ldEFkZHJlc3NUeXBlIHR5cGU6IEludGVybmV0QWRkcmVzc1R5cGUuYW55fSkgewogICAgcmV0dXJuIF9JT1NlcnZpY2UuX2Rpc3BhdGNoKF9JT1NlcnZpY2Uuc29ja2V0TGlzdEludGVyZmFjZXMsIFt0eXBlLl92YWx1ZV0pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChpc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgY3JlYXRlRXJyb3IocmVzcG9uc2UsICJGYWlsZWQgbGlzdGluZyBpbnRlcmZhY2VzIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG1hcCA9IHJlc3BvbnNlLnNraXAoMSkuZm9sZChuZXcgTWFwPFN0cmluZywgTmV0d29ya0ludGVyZmFjZT4oKSwKICAgICAgICAgICAgKG1hcCwgcmVzdWx0KSB7CiAgICAgICAgICB2YXIgdHlwZSA9IG5ldyBJbnRlcm5ldEFkZHJlc3NUeXBlLl9mcm9tKHJlc3VsdFswXSk7CiAgICAgICAgICB2YXIgbmFtZSA9IHJlc3VsdFszXTsKICAgICAgICAgIHZhciBpbmRleCA9IHJlc3VsdFs0XTsKICAgICAgICAgIHZhciBhZGRyZXNzID0gbmV3IF9JbnRlcm5ldEFkZHJlc3MocmVzdWx0WzFdLCAiIiwgcmVzdWx0WzJdKTsKICAgICAgICAgIGlmICghaW5jbHVkZUxpbmtMb2NhbCAmJiBhZGRyZXNzLmlzTGlua0xvY2FsKSByZXR1cm4gbWFwOwogICAgICAgICAgaWYgKCFpbmNsdWRlTG9vcGJhY2sgJiYgYWRkcmVzcy5pc0xvb3BiYWNrKSByZXR1cm4gbWFwOwogICAgICAgICAgbWFwLnB1dElmQWJzZW50KG5hbWUsICgpID0+IG5ldyBfTmV0d29ya0ludGVyZmFjZShuYW1lLCBpbmRleCkpOwogICAgICAgICAgbWFwW25hbWVdLmFkZHJlc3Nlcy5hZGQoYWRkcmVzcyk7CiAgICAgICAgICByZXR1cm4gbWFwOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBtYXAudmFsdWVzLnRvTGlzdCgpOwogICAgICB9CiAgICB9KTsKICB9CgogIHN0YXRpYyBGdXR1cmU8Q29ubmVjdGlvblRhc2s8X05hdGl2ZVNvY2tldD4+IHN0YXJ0Q29ubmVjdCgKICAgICAgaG9zdCwgaW50IHBvcnQsIHNvdXJjZUFkZHJlc3MpIHsKICAgIF90aHJvd09uQmFkUG9ydChwb3J0KTsKICAgIGlmIChzb3VyY2VBZGRyZXNzICE9IG51bGwgJiYgc291cmNlQWRkcmVzcyBpcyEgX0ludGVybmV0QWRkcmVzcykgewogICAgICBpZiAoc291cmNlQWRkcmVzcyBpcyBTdHJpbmcpIHsKICAgICAgICBzb3VyY2VBZGRyZXNzID0gbmV3IEludGVybmV0QWRkcmVzcyhzb3VyY2VBZGRyZXNzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUoaG9zdCkudGhlbigoaG9zdCkgewogICAgICBpZiAoaG9zdCBpcyBfSW50ZXJuZXRBZGRyZXNzKSByZXR1cm4gW2hvc3RdOwogICAgICByZXR1cm4gbG9va3VwKGhvc3QpLnRoZW4oKGFkZHJlc3NlcykgewogICAgICAgIGlmIChhZGRyZXNzZXMuaXNFbXB0eSkgewogICAgICAgICAgdGhyb3cgY3JlYXRlRXJyb3IobnVsbCwgIkZhaWxlZCBob3N0IGxvb2t1cDogJyRob3N0JyIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWRkcmVzc2VzOwogICAgICB9KTsKICAgIH0pLnRoZW4oKGFkZHJlc3NlcykgewogICAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxfTmF0aXZlU29ja2V0PigpOwogICAgICB2YXIgaXQgPSAoYWRkcmVzc2VzIGFzIExpc3Q8SW50ZXJuZXRBZGRyZXNzPikuaXRlcmF0b3I7CiAgICAgIHZhciBlcnJvciA9IG51bGw7CiAgICAgIHZhciBjb25uZWN0aW5nID0gbmV3IEhhc2hNYXAoKTsKCiAgICAgIHZvaWQgY29ubmVjdE5leHQoKSB7CiAgICAgICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSB7CiAgICAgICAgICBpZiAoY29ubmVjdGluZy5pc0VtcHR5KSB7CiAgICAgICAgICAgIGFzc2VydChlcnJvciAhPSBudWxsKTsKICAgICAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBmaW5hbCBfSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3MgPSBpdC5jdXJyZW50OwogICAgICAgIHZhciBzb2NrZXQgPSBuZXcgX05hdGl2ZVNvY2tldC5ub3JtYWwoKTsKICAgICAgICBzb2NrZXQubG9jYWxBZGRyZXNzID0gYWRkcmVzczsKICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgIGlmIChzb3VyY2VBZGRyZXNzID09IG51bGwpIHsKICAgICAgICAgIHJlc3VsdCA9IHNvY2tldC5uYXRpdmVDcmVhdGVDb25uZWN0KGFkZHJlc3MuX2luX2FkZHIsIHBvcnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhc3NlcnQoc291cmNlQWRkcmVzcyBpcyBfSW50ZXJuZXRBZGRyZXNzKTsKICAgICAgICAgIHJlc3VsdCA9IHNvY2tldC5uYXRpdmVDcmVhdGVCaW5kQ29ubmVjdCgKICAgICAgICAgICAgICBhZGRyZXNzLl9pbl9hZGRyLCBwb3J0LCBzb3VyY2VBZGRyZXNzLl9pbl9hZGRyKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgICAgICAvLyBLZWVwIGZpcnN0IGVycm9yLCBpZiBwcmVzZW50LgogICAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHsKICAgICAgICAgICAgaW50IGVycm9yQ29kZSA9IHJlc3VsdC5lcnJvckNvZGU7CiAgICAgICAgICAgIGlmIChzb3VyY2VBZGRyZXNzICE9IG51bGwgJiYKICAgICAgICAgICAgICAgIGVycm9yQ29kZSAhPSBudWxsICYmCiAgICAgICAgICAgICAgICBzb2NrZXQuaXNCaW5kRXJyb3IoZXJyb3JDb2RlKSkgewogICAgICAgICAgICAgIGVycm9yID0gY3JlYXRlRXJyb3IocmVzdWx0LCAiQmluZCBmYWlsZWQiLCBzb3VyY2VBZGRyZXNzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBlcnJvciA9IGNyZWF0ZUVycm9yKHJlc3VsdCwgIkNvbm5lY3Rpb24gZmFpbGVkIiwgYWRkcmVzcywgcG9ydCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGNvbm5lY3ROZXh0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFF1ZXJ5IHRoZSBsb2NhbCBwb3J0IGZvciBlcnJvciBtZXNzYWdlcy4KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHNvY2tldC5wb3J0OwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgIGVycm9yID0gY3JlYXRlRXJyb3IoZSwgIkNvbm5lY3Rpb24gZmFpbGVkIiwgYWRkcmVzcywgcG9ydCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29ubmVjdE5leHQoKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFNldCB1cCB0aW1lciBmb3Igd2hlbiB3ZSBzaG91bGQgcmV0cnkgdGhlIG5leHQgYWRkcmVzcwogICAgICAgICAgLy8gKGlmIGFueSkuCiAgICAgICAgICB2YXIgZHVyYXRpb24gPQogICAgICAgICAgICAgIGFkZHJlc3MuaXNMb29wYmFjayA/IF9yZXRyeUR1cmF0aW9uTG9vcGJhY2sgOiBfcmV0cnlEdXJhdGlvbjsKICAgICAgICAgIHZhciB0aW1lciA9IG5ldyBUaW1lcihkdXJhdGlvbiwgY29ubmVjdE5leHQpOwogICAgICAgICAgc2V0dXBSZXNvdXJjZUluZm8oc29ja2V0KTsKCiAgICAgICAgICBjb25uZWN0aW5nW3NvY2tldF0gPSB0aW1lcjsKICAgICAgICAgIC8vIFNldHVwIGhhbmRsZXJzIGZvciByZWNlaXZpbmcgdGhlIGZpcnN0IHdyaXRlIGV2ZW50IHdoaWNoCiAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoZSBzb2NrZXQgaXMgZnVsbHkgY29ubmVjdGVkLgogICAgICAgICAgc29ja2V0LnNldEhhbmRsZXJzKHdyaXRlOiAoKSB7CiAgICAgICAgICAgIHRpbWVyLmNhbmNlbCgpOwogICAgICAgICAgICBjb25uZWN0aW5nLnJlbW92ZShzb2NrZXQpOwogICAgICAgICAgICAvLyBGcm9tICdtYW4gMiBjb25uZWN0JzoKICAgICAgICAgICAgLy8gQWZ0ZXIgc2VsZWN0KDIpIGluZGljYXRlcyB3cml0YWJpbGl0eSwgdXNlIGdldHNvY2tvcHQoMikgdG8gcmVhZAogICAgICAgICAgICAvLyB0aGUgU09fRVJST1Igb3B0aW9uIGF0IGxldmVsIFNPTF9TT0NLRVQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKICAgICAgICAgICAgLy8gY29ubmVjdCgpIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKFNPX0VSUk9SIGlzIHplcm8pIG9yCiAgICAgICAgICAgIC8vIHVuc3VjY2Vzc2Z1bGx5LgogICAgICAgICAgICBPU0Vycm9yIG9zRXJyb3IgPSBzb2NrZXQubmF0aXZlR2V0RXJyb3IoKTsKICAgICAgICAgICAgaWYgKG9zRXJyb3IuZXJyb3JDb2RlICE9IDApIHsKICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKICAgICAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgZXJyb3IgPSBvc0Vycm9yOwogICAgICAgICAgICAgIGlmIChjb25uZWN0aW5nLmlzRW1wdHkpIGNvbm5lY3ROZXh0KCk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNvY2tldC5zZXRMaXN0ZW5pbmcocmVhZDogZmFsc2UsIHdyaXRlOiBmYWxzZSk7CiAgICAgICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZShzb2NrZXQpOwogICAgICAgICAgICBjb25uZWN0aW5nLmZvckVhY2goKHMsIHQpIHsKICAgICAgICAgICAgICB0LmNhbmNlbCgpOwogICAgICAgICAgICAgIHMuY2xvc2UoKTsKICAgICAgICAgICAgICBzLnNldEhhbmRsZXJzKCk7CiAgICAgICAgICAgICAgcy5zZXRMaXN0ZW5pbmcocmVhZDogZmFsc2UsIHdyaXRlOiBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25uZWN0aW5nLmNsZWFyKCk7CiAgICAgICAgICB9LCBlcnJvcjogKGUpIHsKICAgICAgICAgICAgdGltZXIuY2FuY2VsKCk7CiAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOwogICAgICAgICAgICAvLyBLZWVwIGZpcnN0IGVycm9yLCBpZiBwcmVzZW50LgogICAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgZXJyb3IgPSBlOwogICAgICAgICAgICBjb25uZWN0aW5nLnJlbW92ZShzb2NrZXQpOwogICAgICAgICAgICBpZiAoY29ubmVjdGluZy5pc0VtcHR5KSBjb25uZWN0TmV4dCgpOwogICAgICAgICAgfSk7CiAgICAgICAgICBzb2NrZXQuc2V0TGlzdGVuaW5nKHJlYWQ6IGZhbHNlLCB3cml0ZTogdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICB2b2lkIG9uQ2FuY2VsKCkgewogICAgICAgIGNvbm5lY3RpbmcuZm9yRWFjaCgocywgdCkgewogICAgICAgICAgdC5jYW5jZWwoKTsKICAgICAgICAgIHMuY2xvc2UoKTsKICAgICAgICAgIHMuc2V0SGFuZGxlcnMoKTsKICAgICAgICAgIHMuc2V0TGlzdGVuaW5nKHJlYWQ6IGZhbHNlLCB3cml0ZTogZmFsc2UpOwogICAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHsKICAgICAgICAgICAgZXJyb3IgPSBjcmVhdGVFcnJvcihudWxsLAogICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gYXR0ZW1wdCBjYW5jZWxsZWQsIGhvc3Q6ICR7aG9zdH0sIHBvcnQ6ICR7cG9ydH0iKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBjb25uZWN0aW5nLmNsZWFyKCk7CiAgICAgICAgaWYgKCFjb21wbGV0ZXIuaXNDb21wbGV0ZWQpIHsKICAgICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGVycm9yKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGNvbm5lY3ROZXh0KCk7CiAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvblRhc2s8X05hdGl2ZVNvY2tldD4uXygKICAgICAgICAgIHNvY2tldDogY29tcGxldGVyLmZ1dHVyZSwgb25DYW5jZWw6IG9uQ2FuY2VsKTsKICAgIH0pOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxfTmF0aXZlU29ja2V0PiBjb25uZWN0KAogICAgICBob3N0LCBpbnQgcG9ydCwgc291cmNlQWRkcmVzcywgRHVyYXRpb24gdGltZW91dCkgewogICAgcmV0dXJuIHN0YXJ0Q29ubmVjdChob3N0LCBwb3J0LCBzb3VyY2VBZGRyZXNzKQogICAgICAgIC50aGVuKChDb25uZWN0aW9uVGFzazxfTmF0aXZlU29ja2V0PiB0YXNrKSB7CiAgICAgIEZ1dHVyZTxfTmF0aXZlU29ja2V0PiBzb2NrZXRGdXR1cmUgPSB0YXNrLnNvY2tldDsKICAgICAgaWYgKHRpbWVvdXQgIT0gbnVsbCkgewogICAgICAgIHNvY2tldEZ1dHVyZSA9IHNvY2tldEZ1dHVyZS50aW1lb3V0KHRpbWVvdXQsIG9uVGltZW91dDogKCkgewogICAgICAgICAgdGFzay5jYW5jZWwoKTsKICAgICAgICAgIHRocm93IGNyZWF0ZUVycm9yKAogICAgICAgICAgICAgIG51bGwsICJDb25uZWN0aW9uIHRpbWVkIG91dCwgaG9zdDogJHtob3N0fSwgcG9ydDogJHtwb3J0fSIpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBzb2NrZXRGdXR1cmU7CiAgICB9KTsKICB9CgogIHN0YXRpYyBGdXR1cmU8X0ludGVybmV0QWRkcmVzcz4gX3Jlc29sdmVIb3N0KGhvc3QpIGFzeW5jIHsKICAgIGlmIChob3N0IGlzIF9JbnRlcm5ldEFkZHJlc3MpIHsKICAgICAgcmV0dXJuIGhvc3Q7CiAgICB9IGVsc2UgewogICAgICBmaW5hbCBsaXN0ID0gYXdhaXQgbG9va3VwKGhvc3QpOwogICAgICBpZiAobGlzdC5pc0VtcHR5KSB7CiAgICAgICAgdGhyb3cgY3JlYXRlRXJyb3IobnVsbCwgIkZhaWxlZCBob3N0IGxvb2t1cDogJyRob3N0JyIpOwogICAgICB9CiAgICAgIHJldHVybiBsaXN0LmZpcnN0IGFzIF9JbnRlcm5ldEFkZHJlc3M7CiAgICB9CiAgfQoKICBzdGF0aWMgRnV0dXJlPF9OYXRpdmVTb2NrZXQ+IGJpbmQoCiAgICAgIGhvc3QsIGludCBwb3J0LCBpbnQgYmFja2xvZywgYm9vbCB2Nk9ubHksIGJvb2wgc2hhcmVkKSBhc3luYyB7CiAgICBfdGhyb3dPbkJhZFBvcnQocG9ydCk7CgogICAgZmluYWwgYWRkcmVzcyA9IGF3YWl0IF9yZXNvbHZlSG9zdChob3N0KTsKCiAgICB2YXIgc29ja2V0ID0gbmV3IF9OYXRpdmVTb2NrZXQubGlzdGVuKCk7CiAgICBzb2NrZXQubG9jYWxBZGRyZXNzID0gYWRkcmVzczsKICAgIHZhciByZXN1bHQgPSBzb2NrZXQubmF0aXZlQ3JlYXRlQmluZExpc3RlbigKICAgICAgICBhZGRyZXNzLl9pbl9hZGRyLCBwb3J0LCBiYWNrbG9nLCB2Nk9ubHksIHNoYXJlZCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IFNvY2tldEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwKICAgICAgICAgIG9zRXJyb3I6IHJlc3VsdCwgYWRkcmVzczogYWRkcmVzcywgcG9ydDogcG9ydCk7CiAgICB9CiAgICBpZiAocG9ydCAhPSAwKSBzb2NrZXQubG9jYWxQb3J0ID0gcG9ydDsKICAgIHNldHVwUmVzb3VyY2VJbmZvKHNvY2tldCk7CiAgICBzb2NrZXQuY29ubmVjdFRvRXZlbnRIYW5kbGVyKCk7CiAgICByZXR1cm4gc29ja2V0OwogIH0KCiAgc3RhdGljIHZvaWQgc2V0dXBSZXNvdXJjZUluZm8oX05hdGl2ZVNvY2tldCBzb2NrZXQpIHsKICAgIHNvY2tldC5yZXNvdXJjZUluZm8gPSBuZXcgX1NvY2tldFJlc291cmNlSW5mbyhzb2NrZXQpOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxfTmF0aXZlU29ja2V0PiBiaW5kRGF0YWdyYW0oCiAgICAgIGhvc3QsIGludCBwb3J0LCBib29sIHJldXNlQWRkcmVzcywgYm9vbCByZXVzZVBvcnQsIGludCB0dGwpIGFzeW5jIHsKICAgIF90aHJvd09uQmFkUG9ydChwb3J0KTsKICAgIF90aHJvd09uQmFkVHRsKHR0bCk7CgogICAgZmluYWwgYWRkcmVzcyA9IGF3YWl0IF9yZXNvbHZlSG9zdChob3N0KTsKCiAgICB2YXIgc29ja2V0ID0gbmV3IF9OYXRpdmVTb2NrZXQuZGF0YWdyYW0oYWRkcmVzcyk7CiAgICB2YXIgcmVzdWx0ID0gc29ja2V0Lm5hdGl2ZUNyZWF0ZUJpbmREYXRhZ3JhbSgKICAgICAgICBhZGRyZXNzLl9pbl9hZGRyLCBwb3J0LCByZXVzZUFkZHJlc3MsIHJldXNlUG9ydCwgdHRsKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIGRhdGFncmFtIHNvY2tldCIsCiAgICAgICAgICBvc0Vycm9yOiByZXN1bHQsIGFkZHJlc3M6IGFkZHJlc3MsIHBvcnQ6IHBvcnQpOwogICAgfQogICAgaWYgKHBvcnQgIT0gMCkgc29ja2V0LmxvY2FsUG9ydCA9IHBvcnQ7CiAgICBzZXR1cFJlc291cmNlSW5mbyhzb2NrZXQpOwogICAgcmV0dXJuIHNvY2tldDsKICB9CgogIF9OYXRpdmVTb2NrZXQuZGF0YWdyYW0odGhpcy5sb2NhbEFkZHJlc3MpCiAgICAgIDogdHlwZUZsYWdzID0gdHlwZU5vcm1hbFNvY2tldCB8IHR5cGVVZHBTb2NrZXQ7CgogIF9OYXRpdmVTb2NrZXQubm9ybWFsKCkgOiB0eXBlRmxhZ3MgPSB0eXBlTm9ybWFsU29ja2V0IHwgdHlwZVRjcFNvY2tldDsKCiAgX05hdGl2ZVNvY2tldC5saXN0ZW4oKSA6IHR5cGVGbGFncyA9IHR5cGVMaXN0ZW5pbmdTb2NrZXQgfCB0eXBlVGNwU29ja2V0IHsKICAgIGlzQ2xvc2VkV3JpdGUgPSB0cnVlOwogIH0KCiAgX05hdGl2ZVNvY2tldC5waXBlKCkgOiB0eXBlRmxhZ3MgPSB0eXBlUGlwZTsKCiAgX05hdGl2ZVNvY2tldC5fd2F0Y2hDb21tb24oaW50IGlkLCBpbnQgdHlwZSkKICAgICAgOiB0eXBlRmxhZ3MgPSB0eXBlTm9ybWFsU29ja2V0IHwgdHlwZSB7CiAgICBpc0Nsb3NlZFdyaXRlID0gdHJ1ZTsKICAgIG5hdGl2ZVNldFNvY2tldElkKGlkLCB0eXBlRmxhZ3MpOwogIH0KCiAgX05hdGl2ZVNvY2tldC53YXRjaFNpZ25hbChpbnQgaWQpCiAgICAgIDogdGhpcy5fd2F0Y2hDb21tb24oaWQsIHR5cGVJbnRlcm5hbFNpZ25hbFNvY2tldCk7CgogIF9OYXRpdmVTb2NrZXQud2F0Y2goaW50IGlkKSA6IHRoaXMuX3dhdGNoQ29tbW9uKGlkLCB0eXBlSW50ZXJuYWxTb2NrZXQpOwoKICBib29sIGdldCBpc0xpc3RlbmluZyA9PiAodHlwZUZsYWdzICYgdHlwZUxpc3RlbmluZ1NvY2tldCkgIT0gMDsKICBib29sIGdldCBpc1BpcGUgPT4gKHR5cGVGbGFncyAmIHR5cGVQaXBlKSAhPSAwOwogIGJvb2wgZ2V0IGlzSW50ZXJuYWwgPT4gKHR5cGVGbGFncyAmIHR5cGVJbnRlcm5hbFNvY2tldCkgIT0gMDsKICBib29sIGdldCBpc0ludGVybmFsU2lnbmFsID0+ICh0eXBlRmxhZ3MgJiB0eXBlSW50ZXJuYWxTaWduYWxTb2NrZXQpICE9IDA7CiAgYm9vbCBnZXQgaXNUY3AgPT4gKHR5cGVGbGFncyAmIHR5cGVUY3BTb2NrZXQpICE9IDA7CiAgYm9vbCBnZXQgaXNVZHAgPT4gKHR5cGVGbGFncyAmIHR5cGVVZHBTb2NrZXQpICE9IDA7CgogIE1hcCBfdG9KU09OKGJvb2wgcmVmKSA9PiB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CiAgU3RyaW5nIGdldCBfc2VydmljZVR5cGVQYXRoID0+IHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKICBTdHJpbmcgZ2V0IF9zZXJ2aWNlVHlwZU5hbWUgPT4gdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOwoKICBVaW50OExpc3QgcmVhZChpbnQgbGVuKSB7CiAgICBpZiAobGVuICE9IG51bGwgJiYgbGVuIDw9IDApIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIklsbGVnYWwgbGVuZ3RoICRsZW4iKTsKICAgIH0KICAgIGlmIChpc0Nsb3NpbmcgfHwgaXNDbG9zZWQpIHJldHVybiBudWxsOwogICAgbGVuID0gbWluKGF2YWlsYWJsZSwgbGVuID09IG51bGwgPyBhdmFpbGFibGUgOiBsZW4pOwogICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gbnVsbDsKICAgIHZhciByZXN1bHQgPSBuYXRpdmVSZWFkKGxlbik7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgcmVwb3J0RXJyb3IocmVzdWx0LCAiUmVhZCBmYWlsZWQiKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgYXZhaWxhYmxlIC09IHJlc3VsdC5sZW5ndGg7CiAgICAgIC8vIFRPRE8ocmljb3cpOiBSZW1vdmUgd2hlbiB3ZSB0cmFjayBpbnRlcm5hbCBhbmQgcGlwZSB1c2VzLgogICAgICBhc3NlcnQocmVzb3VyY2VJbmZvICE9IG51bGwgfHwgaXNQaXBlIHx8IGlzSW50ZXJuYWwgfHwgaXNJbnRlcm5hbFNpZ25hbCk7CiAgICAgIGlmIChyZXNvdXJjZUluZm8gIT0gbnVsbCkgewogICAgICAgIHJlc291cmNlSW5mby50b3RhbFJlYWQgKz0gcmVzdWx0Lmxlbmd0aDsKICAgICAgfQogICAgfQogICAgLy8gVE9ETyhyaWNvdyk6IFJlbW92ZSB3aGVuIHdlIHRyYWNrIGludGVybmFsIGFuZCBwaXBlIHVzZXMuCiAgICBhc3NlcnQocmVzb3VyY2VJbmZvICE9IG51bGwgfHwgaXNQaXBlIHx8IGlzSW50ZXJuYWwgfHwgaXNJbnRlcm5hbFNpZ25hbCk7CiAgICBpZiAocmVzb3VyY2VJbmZvICE9IG51bGwpIHsKICAgICAgcmVzb3VyY2VJbmZvLmRpZFJlYWQoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBEYXRhZ3JhbSByZWNlaXZlKCkgewogICAgaWYgKGlzQ2xvc2luZyB8fCBpc0Nsb3NlZCkgcmV0dXJuIG51bGw7CiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlUmVjdkZyb20oKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICByZXBvcnRFcnJvcihyZXN1bHQsICJSZWNlaXZlIGZhaWxlZCIpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewogICAgICAvLyBSZWFkIHRoZSBuZXh0IGF2YWlsYWJsZS4gQXZhaWxhYmxlIGlzIG9ubHkgZm9yIHRoZSBuZXh0IGRhdGFncmFtLCBub3QKICAgICAgLy8gdGhlIHN1bSBvZiBhbGwgZGF0YWdyYW1zIHBlbmRpbmcsIHNvIHdlIG5lZWQgdG8gY2FsbCBhZnRlciBlYWNoCiAgICAgIC8vIHJlY2VpdmUuIElmIGF2YWlsYWJsZSBiZWNvbWVzID4gMCwgdGhlIF9OYXRpdmVTb2NrZXQgd2lsbCBjb250aW51ZSB0bwogICAgICAvLyBlbWl0IHJlYWQgZXZlbnRzLgogICAgICBhdmFpbGFibGUgPSBuYXRpdmVBdmFpbGFibGUoKTsKICAgICAgLy8gVE9ETyhyaWNvdyk6IFJlbW92ZSB3aGVuIHdlIHRyYWNrIGludGVybmFsIGFuZCBwaXBlIHVzZXMuCiAgICAgIGFzc2VydChyZXNvdXJjZUluZm8gIT0gbnVsbCB8fCBpc1BpcGUgfHwgaXNJbnRlcm5hbCB8fCBpc0ludGVybmFsU2lnbmFsKTsKICAgICAgaWYgKHJlc291cmNlSW5mbyAhPSBudWxsKSB7CiAgICAgICAgcmVzb3VyY2VJbmZvLnRvdGFsUmVhZCArPSByZXN1bHQuZGF0YS5sZW5ndGg7CiAgICAgIH0KICAgIH0KICAgIC8vIFRPRE8ocmljb3cpOiBSZW1vdmUgd2hlbiB3ZSB0cmFjayBpbnRlcm5hbCBhbmQgcGlwZSB1c2VzLgogICAgYXNzZXJ0KHJlc291cmNlSW5mbyAhPSBudWxsIHx8IGlzUGlwZSB8fCBpc0ludGVybmFsIHx8IGlzSW50ZXJuYWxTaWduYWwpOwogICAgaWYgKHJlc291cmNlSW5mbyAhPSBudWxsKSB7CiAgICAgIHJlc291cmNlSW5mby5kaWRSZWFkKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgaW50IHdyaXRlKExpc3Q8aW50PiBidWZmZXIsIGludCBvZmZzZXQsIGludCBieXRlcykgewogICAgaWYgKGJ1ZmZlciBpcyEgTGlzdCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIGlmIChvZmZzZXQgPT0gbnVsbCkgb2Zmc2V0ID0gMDsKICAgIGlmIChieXRlcyA9PSBudWxsKSB7CiAgICAgIGlmIChvZmZzZXQgPiBidWZmZXIubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IudmFsdWUob2Zmc2V0KTsKICAgICAgfQogICAgICBieXRlcyA9IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQ7CiAgICB9CiAgICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IudmFsdWUob2Zmc2V0KTsKICAgIGlmIChieXRlcyA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yLnZhbHVlKGJ5dGVzKTsKICAgIGlmICgob2Zmc2V0ICsgYnl0ZXMpID4gYnVmZmVyLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci52YWx1ZShvZmZzZXQgKyBieXRlcyk7CiAgICB9CiAgICBpZiAob2Zmc2V0IGlzISBpbnQgfHwgYnl0ZXMgaXMhIGludCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSW52YWxpZCBhcmd1bWVudHMgdG8gd3JpdGUgb24gU29ja2V0Iik7CiAgICB9CiAgICBpZiAoaXNDbG9zaW5nIHx8IGlzQ2xvc2VkKSByZXR1cm4gMDsKICAgIGlmIChieXRlcyA9PSAwKSByZXR1cm4gMDsKICAgIF9CdWZmZXJBbmRTdGFydCBidWZmZXJBbmRTdGFydCA9CiAgICAgICAgX2Vuc3VyZUZhc3RBbmRTZXJpYWxpemFibGVCeXRlRGF0YShidWZmZXIsIG9mZnNldCwgb2Zmc2V0ICsgYnl0ZXMpOwogICAgdmFyIHJlc3VsdCA9CiAgICAgICAgbmF0aXZlV3JpdGUoYnVmZmVyQW5kU3RhcnQuYnVmZmVyLCBidWZmZXJBbmRTdGFydC5zdGFydCwgYnl0ZXMpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIE9TRXJyb3Igb3NFcnJvciA9IHJlc3VsdDsKICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgPT4gcmVwb3J0RXJyb3Iob3NFcnJvciwgIldyaXRlIGZhaWxlZCIpKTsKICAgICAgcmVzdWx0ID0gMDsKICAgIH0KICAgIC8vIFRoZSByZXN1bHQgbWF5IGJlIG5lZ2F0aXZlLCBpZiB3ZSBmb3JjZWQgYSBzaG9ydCB3cml0ZSBmb3IgdGVzdGluZwogICAgLy8gcHVycG9zZS4gSW4gc3VjaCBjYXNlLCBkb24ndCBtYXJrIHdyaXRlQXZhaWxhYmxlIGFzIGZhbHNlLCBhcyB3ZSBkb24ndAogICAgLy8ga25vdyBpZiB3ZSdsbCByZWNlaXZlIGFuIGV2ZW50LiBJdCdzIGJldHRlciB0byBqdXN0IHJldHJ5LgogICAgaWYgKHJlc3VsdCA+PSAwICYmIHJlc3VsdCA8IGJ5dGVzKSB7CiAgICAgIHdyaXRlQXZhaWxhYmxlID0gZmFsc2U7CiAgICB9CiAgICAvLyBOZWdhdGUgdGhlIHJlc3VsdCwgYXMgc3RhdGVkIGFib3ZlLgogICAgaWYgKHJlc3VsdCA8IDApIHJlc3VsdCA9IC1yZXN1bHQ7CiAgICAvLyBUT0RPKHJpY293KTogUmVtb3ZlIHdoZW4gd2UgdHJhY2sgaW50ZXJuYWwgYW5kIHBpcGUgdXNlcy4KICAgIGFzc2VydChyZXNvdXJjZUluZm8gIT0gbnVsbCB8fCBpc1BpcGUgfHwgaXNJbnRlcm5hbCB8fCBpc0ludGVybmFsU2lnbmFsKTsKICAgIGlmIChyZXNvdXJjZUluZm8gIT0gbnVsbCkgewogICAgICByZXNvdXJjZUluZm8uYWRkV3JpdGUocmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBpbnQgc2VuZChMaXN0PGludD4gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgYnl0ZXMsIEludGVybmV0QWRkcmVzcyBhZGRyZXNzLAogICAgICBpbnQgcG9ydCkgewogICAgX3Rocm93T25CYWRQb3J0KHBvcnQpOwogICAgaWYgKGlzQ2xvc2luZyB8fCBpc0Nsb3NlZCkgcmV0dXJuIDA7CiAgICBfQnVmZmVyQW5kU3RhcnQgYnVmZmVyQW5kU3RhcnQgPQogICAgICAgIF9lbnN1cmVGYXN0QW5kU2VyaWFsaXphYmxlQnl0ZURhdGEoYnVmZmVyLCBvZmZzZXQsIGJ5dGVzKTsKICAgIHZhciByZXN1bHQgPSBuYXRpdmVTZW5kVG8oYnVmZmVyQW5kU3RhcnQuYnVmZmVyLCBidWZmZXJBbmRTdGFydC5zdGFydCwKICAgICAgICBieXRlcywgKGFkZHJlc3MgYXMgX0ludGVybmV0QWRkcmVzcykuX2luX2FkZHIsIHBvcnQpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIE9TRXJyb3Igb3NFcnJvciA9IHJlc3VsdDsKICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgPT4gcmVwb3J0RXJyb3Iob3NFcnJvciwgIlNlbmQgZmFpbGVkIikpOwogICAgICByZXN1bHQgPSAwOwogICAgfQogICAgLy8gVE9ETyhyaWNvdyk6IFJlbW92ZSB3aGVuIHdlIHRyYWNrIGludGVybmFsIGFuZCBwaXBlIHVzZXMuCiAgICBhc3NlcnQocmVzb3VyY2VJbmZvICE9IG51bGwgfHwgaXNQaXBlIHx8IGlzSW50ZXJuYWwgfHwgaXNJbnRlcm5hbFNpZ25hbCk7CiAgICBpZiAocmVzb3VyY2VJbmZvICE9IG51bGwpIHsKICAgICAgcmVzb3VyY2VJbmZvLmFkZFdyaXRlKHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgX05hdGl2ZVNvY2tldCBhY2NlcHQoKSB7CiAgICAvLyBEb24ndCBpc3N1ZSBhY2NlcHQgaWYgd2UncmUgY2xvc2luZy4KICAgIGlmIChpc0Nsb3NpbmcgfHwgaXNDbG9zZWQpIHJldHVybiBudWxsOwogICAgYXNzZXJ0KGF2YWlsYWJsZSA+IDApOwogICAgYXZhaWxhYmxlLS07CiAgICB0b2tlbnMrKzsKICAgIHJldHVyblRva2VucyhsaXN0ZW5pbmdUb2tlbkJhdGNoU2l6ZSk7CiAgICB2YXIgc29ja2V0ID0gbmV3IF9OYXRpdmVTb2NrZXQubm9ybWFsKCk7CiAgICBpZiAobmF0aXZlQWNjZXB0KHNvY2tldCkgIT0gdHJ1ZSkgcmV0dXJuIG51bGw7CiAgICBzb2NrZXQubG9jYWxQb3J0ID0gbG9jYWxQb3J0OwogICAgc29ja2V0LmxvY2FsQWRkcmVzcyA9IGFkZHJlc3M7CiAgICBzZXR1cFJlc291cmNlSW5mbyhzb2NrZXQpOwogICAgLy8gVE9ETyhyaWNvdyk6IFJlbW92ZSB3aGVuIHdlIHRyYWNrIGludGVybmFsIGFuZCBwaXBlIHVzZXMuCiAgICBhc3NlcnQocmVzb3VyY2VJbmZvICE9IG51bGwgfHwgaXNQaXBlIHx8IGlzSW50ZXJuYWwgfHwgaXNJbnRlcm5hbFNpZ25hbCk7CiAgICBpZiAocmVzb3VyY2VJbmZvICE9IG51bGwpIHsKICAgICAgLy8gV2UgdHJhY2sgdGhpcyBhcyByZWFkIG9uZSBieXRlLgogICAgICByZXNvdXJjZUluZm8uYWRkUmVhZCgxKTsKICAgIH0KICAgIHJldHVybiBzb2NrZXQ7CiAgfQoKICBpbnQgZ2V0IHBvcnQgewogICAgaWYgKGxvY2FsUG9ydCAhPSAwKSByZXR1cm4gbG9jYWxQb3J0OwogICAgaWYgKGlzQ2xvc2luZyB8fCBpc0Nsb3NlZCkgdGhyb3cgY29uc3QgU29ja2V0RXhjZXB0aW9uLmNsb3NlZCgpOwogICAgdmFyIHJlc3VsdCA9IG5hdGl2ZUdldFBvcnQoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgdGhyb3cgcmVzdWx0OwogICAgcmV0dXJuIGxvY2FsUG9ydCA9IHJlc3VsdDsKICB9CgogIGludCBnZXQgcmVtb3RlUG9ydCB7CiAgICBpZiAoaXNDbG9zaW5nIHx8IGlzQ2xvc2VkKSB0aHJvdyBjb25zdCBTb2NrZXRFeGNlcHRpb24uY2xvc2VkKCk7CiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlR2V0UmVtb3RlUGVlcigpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB0aHJvdyByZXN1bHQ7CiAgICByZXR1cm4gcmVzdWx0WzFdOwogIH0KCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzID0+IGxvY2FsQWRkcmVzczsKCiAgSW50ZXJuZXRBZGRyZXNzIGdldCByZW1vdGVBZGRyZXNzIHsKICAgIGlmIChpc0Nsb3NpbmcgfHwgaXNDbG9zZWQpIHRocm93IGNvbnN0IFNvY2tldEV4Y2VwdGlvbi5jbG9zZWQoKTsKICAgIHZhciByZXN1bHQgPSBuYXRpdmVHZXRSZW1vdGVQZWVyKCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHRocm93IHJlc3VsdDsKICAgIHZhciBhZGRyID0gcmVzdWx0WzBdOwogICAgdmFyIHR5cGUgPSBuZXcgSW50ZXJuZXRBZGRyZXNzVHlwZS5fZnJvbShhZGRyWzBdKTsKICAgIHJldHVybiBuZXcgX0ludGVybmV0QWRkcmVzcyhhZGRyWzFdLCBudWxsLCBhZGRyWzJdKTsKICB9CgogIHZvaWQgaXNzdWVSZWFkRXZlbnQoKSB7CiAgICBpZiAoY2xvc2VkUmVhZEV2ZW50U2VudCkgcmV0dXJuOwogICAgaWYgKHJlYWRFdmVudElzc3VlZCkgcmV0dXJuOwogICAgcmVhZEV2ZW50SXNzdWVkID0gdHJ1ZTsKICAgIHZvaWQgaXNzdWUoKSB7CiAgICAgIHJlYWRFdmVudElzc3VlZCA9IGZhbHNlOwogICAgICBpZiAoaXNDbG9zaW5nKSByZXR1cm47CiAgICAgIGlmICghc2VuZFJlYWRFdmVudHMpIHJldHVybjsKICAgICAgaWYgKGF2YWlsYWJsZSA9PSAwKSB7CiAgICAgICAgaWYgKGlzQ2xvc2VkUmVhZCAmJiAhY2xvc2VkUmVhZEV2ZW50U2VudCkgewogICAgICAgICAgaWYgKGlzQ2xvc2VkV3JpdGUpIGNsb3NlKCk7CiAgICAgICAgICB2YXIgaGFuZGxlciA9IGV2ZW50SGFuZGxlcnNbY2xvc2VkRXZlbnRdOwogICAgICAgICAgaWYgKGhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgICAgY2xvc2VkUmVhZEV2ZW50U2VudCA9IHRydWU7CiAgICAgICAgICBoYW5kbGVyKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgaGFuZGxlciA9IGV2ZW50SGFuZGxlcnNbcmVhZEV2ZW50XTsKICAgICAgaWYgKGhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuOwogICAgICByZWFkRXZlbnRJc3N1ZWQgPSB0cnVlOwogICAgICBoYW5kbGVyKCk7CiAgICAgIHNjaGVkdWxlTWljcm90YXNrKGlzc3VlKTsKICAgIH0KCiAgICBzY2hlZHVsZU1pY3JvdGFzayhpc3N1ZSk7CiAgfQoKICB2b2lkIGlzc3VlV3JpdGVFdmVudCh7Ym9vbCBkZWxheWVkOiB0cnVlfSkgewogICAgaWYgKHdyaXRlRXZlbnRJc3N1ZWQpIHJldHVybjsKICAgIGlmICghd3JpdGVBdmFpbGFibGUpIHJldHVybjsKICAgIHZvaWQgaXNzdWUoKSB7CiAgICAgIHdyaXRlRXZlbnRJc3N1ZWQgPSBmYWxzZTsKICAgICAgaWYgKCF3cml0ZUF2YWlsYWJsZSkgcmV0dXJuOwogICAgICBpZiAoaXNDbG9zaW5nKSByZXR1cm47CiAgICAgIGlmICghc2VuZFdyaXRlRXZlbnRzKSByZXR1cm47CiAgICAgIHNlbmRXcml0ZUV2ZW50cyA9IGZhbHNlOwogICAgICB2YXIgaGFuZGxlciA9IGV2ZW50SGFuZGxlcnNbd3JpdGVFdmVudF07CiAgICAgIGlmIChoYW5kbGVyID09IG51bGwpIHJldHVybjsKICAgICAgaGFuZGxlcigpOwogICAgfQoKICAgIGlmIChkZWxheWVkKSB7CiAgICAgIHdyaXRlRXZlbnRJc3N1ZWQgPSB0cnVlOwogICAgICBzY2hlZHVsZU1pY3JvdGFzayhpc3N1ZSk7CiAgICB9IGVsc2UgewogICAgICBpc3N1ZSgpOwogICAgfQogIH0KCiAgLy8gTXVsdGlwbGV4ZXMgc29ja2V0IGV2ZW50cyB0byB0aGUgc29ja2V0IGhhbmRsZXJzLgogIHZvaWQgbXVsdGlwbGV4KE9iamVjdCBldmVudHNPYmopIHsKICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogd2hlbiBpc3N1ZSAjMzEzMDUgaXMgZml4ZWQsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNpbXBseQogICAgLy8gZGVjbGFyZSBgZXZlbnRzYCBhcyBhIGBjb3ZhcmlhbnQgaW50YCBwYXJhbWV0ZXIuCiAgICBpbnQgZXZlbnRzID0gZXZlbnRzT2JqOwogICAgZm9yIChpbnQgaSA9IGZpcnN0RXZlbnQ7IGkgPD0gbGFzdEV2ZW50OyBpKyspIHsKICAgICAgaWYgKCgoZXZlbnRzICYgKDEgPDwgaSkpICE9IDApKSB7CiAgICAgICAgaWYgKChpID09IGNsb3NlZEV2ZW50IHx8IGkgPT0gcmVhZEV2ZW50KSAmJiBpc0Nsb3NlZFJlYWQpIGNvbnRpbnVlOwogICAgICAgIGlmIChpc0Nsb3NpbmcgJiYgaSAhPSBkZXN0cm95ZWRFdmVudCkgY29udGludWU7CiAgICAgICAgaWYgKGkgPT0gY2xvc2VkRXZlbnQgJiYgIWlzTGlzdGVuaW5nICYmICFpc0Nsb3NpbmcgJiYgIWlzQ2xvc2VkKSB7CiAgICAgICAgICBpc0Nsb3NlZFJlYWQgPSB0cnVlOwogICAgICAgICAgaXNzdWVSZWFkRXZlbnQoKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGkgPT0gd3JpdGVFdmVudCkgewogICAgICAgICAgd3JpdGVBdmFpbGFibGUgPSB0cnVlOwogICAgICAgICAgaXNzdWVXcml0ZUV2ZW50KGRlbGF5ZWQ6IGZhbHNlKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGkgPT0gcmVhZEV2ZW50KSB7CiAgICAgICAgICBpZiAoaXNMaXN0ZW5pbmcpIHsKICAgICAgICAgICAgYXZhaWxhYmxlKys7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhdmFpbGFibGUgPSBuYXRpdmVBdmFpbGFibGUoKTsKICAgICAgICAgICAgaXNzdWVSZWFkRXZlbnQoKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgaGFuZGxlciA9IGV2ZW50SGFuZGxlcnNbaV07CiAgICAgICAgaWYgKGkgPT0gZGVzdHJveWVkRXZlbnQpIHsKICAgICAgICAgIGFzc2VydChpc0Nsb3NpbmcpOwogICAgICAgICAgYXNzZXJ0KCFpc0Nsb3NlZCk7CiAgICAgICAgICAvLyBUT0RPKHJpY293KTogUmVtb3ZlL3VwZGF0ZSB3aGVuIHdlIHRyYWNrIGludGVybmFsIGFuZCBwaXBlIHVzZXMuCiAgICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgICAgcmVzb3VyY2VJbmZvICE9IG51bGwgfHwgaXNQaXBlIHx8IGlzSW50ZXJuYWwgfHwgaXNJbnRlcm5hbFNpZ25hbCk7CiAgICAgICAgICBpZiAocmVzb3VyY2VJbmZvICE9IG51bGwpIHsKICAgICAgICAgICAgX1NvY2tldFJlc291cmNlSW5mby5Tb2NrZXRDbG9zZWQocmVzb3VyY2VJbmZvKTsKICAgICAgICAgIH0KICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICAgIGNsb3NlQ29tcGxldGVyLmNvbXBsZXRlKCk7CiAgICAgICAgICBkaXNjb25uZWN0RnJvbUV2ZW50SGFuZGxlcigpOwogICAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgaGFuZGxlcigpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoaSA9PSBlcnJvckV2ZW50KSB7CiAgICAgICAgICBpZiAoIWlzQ2xvc2luZykgewogICAgICAgICAgICByZXBvcnRFcnJvcihuYXRpdmVHZXRFcnJvcigpLCAiIik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghaXNDbG9zZWQpIHsKICAgICAgICAgIC8vIElmIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCByaWdodCBhZnRlciBpdCdzIGFjY2VwdGVkLCB0aGVyZSdzIGEKICAgICAgICAgIC8vIGNoYW5jZSB0aGUgY2xvc2UtaGFuZGxlciBpcyBub3Qgc2V0LgogICAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgaGFuZGxlcigpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKCFpc0xpc3RlbmluZykgewogICAgICB0b2tlbnMrKzsKICAgICAgcmV0dXJuVG9rZW5zKG5vcm1hbFRva2VuQmF0Y2hTaXplKTsKICAgIH0KICB9CgogIHZvaWQgcmV0dXJuVG9rZW5zKGludCB0b2tlbkJhdGNoU2l6ZSkgewogICAgaWYgKCFpc0Nsb3NpbmcgJiYgIWlzQ2xvc2VkKSB7CiAgICAgIGFzc2VydChldmVudFBvcnQgIT0gbnVsbCk7CiAgICAgIC8vIFJldHVybiBpbiBiYXRjaGVzLgogICAgICBpZiAodG9rZW5zID09IHRva2VuQmF0Y2hTaXplKSB7CiAgICAgICAgYXNzZXJ0KHRva2VucyA8ICgxIDw8IGZpcnN0Q29tbWFuZCkpOwogICAgICAgIHNlbmRUb0V2ZW50SGFuZGxlcigoMSA8PCByZXR1cm5Ub2tlbkNvbW1hbmQpIHwgdG9rZW5zKTsKICAgICAgICB0b2tlbnMgPSAwOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHNldEhhbmRsZXJzKHtyZWFkLCB3cml0ZSwgZXJyb3IsIGNsb3NlZCwgZGVzdHJveWVkfSkgewogICAgZXZlbnRIYW5kbGVyc1tyZWFkRXZlbnRdID0gcmVhZDsKICAgIGV2ZW50SGFuZGxlcnNbd3JpdGVFdmVudF0gPSB3cml0ZTsKICAgIGV2ZW50SGFuZGxlcnNbZXJyb3JFdmVudF0gPSBlcnJvcjsKICAgIGV2ZW50SGFuZGxlcnNbY2xvc2VkRXZlbnRdID0gY2xvc2VkOwogICAgZXZlbnRIYW5kbGVyc1tkZXN0cm95ZWRFdmVudF0gPSBkZXN0cm95ZWQ7CiAgfQoKICB2b2lkIHNldExpc3RlbmluZyh7cmVhZDogdHJ1ZSwgd3JpdGU6IHRydWV9KSB7CiAgICBzZW5kUmVhZEV2ZW50cyA9IHJlYWQ7CiAgICBzZW5kV3JpdGVFdmVudHMgPSB3cml0ZTsKICAgIGlmIChyZWFkKSBpc3N1ZVJlYWRFdmVudCgpOwogICAgaWYgKHdyaXRlKSBpc3N1ZVdyaXRlRXZlbnQoKTsKICAgIGlmICghZmxhZ3NTZW50ICYmICFpc0Nsb3NpbmcpIHsKICAgICAgZmxhZ3NTZW50ID0gdHJ1ZTsKICAgICAgaW50IGZsYWdzID0gMSA8PCBzZXRFdmVudE1hc2tDb21tYW5kOwogICAgICBpZiAoIWlzQ2xvc2VkUmVhZCkgZmxhZ3MgfD0gMSA8PCByZWFkRXZlbnQ7CiAgICAgIGlmICghaXNDbG9zZWRXcml0ZSkgZmxhZ3MgfD0gMSA8PCB3cml0ZUV2ZW50OwogICAgICBzZW5kVG9FdmVudEhhbmRsZXIoZmxhZ3MpOwogICAgfQogIH0KCiAgRnV0dXJlIGNsb3NlKCkgewogICAgaWYgKCFpc0Nsb3NpbmcgJiYgIWlzQ2xvc2VkKSB7CiAgICAgIHNlbmRUb0V2ZW50SGFuZGxlcigxIDw8IGNsb3NlQ29tbWFuZCk7CiAgICAgIGlzQ2xvc2luZyA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gY2xvc2VDb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgdm9pZCBzaHV0ZG93bihTb2NrZXREaXJlY3Rpb24gZGlyZWN0aW9uKSB7CiAgICBpZiAoIWlzQ2xvc2luZyAmJiAhaXNDbG9zZWQpIHsKICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHsKICAgICAgICBjYXNlIFNvY2tldERpcmVjdGlvbi5yZWNlaXZlOgogICAgICAgICAgc2h1dGRvd25SZWFkKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNvY2tldERpcmVjdGlvbi5zZW5kOgogICAgICAgICAgc2h1dGRvd25Xcml0ZSgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTb2NrZXREaXJlY3Rpb24uYm90aDoKICAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoZGlyZWN0aW9uKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBzaHV0ZG93bldyaXRlKCkgewogICAgaWYgKCFpc0Nsb3NpbmcgJiYgIWlzQ2xvc2VkKSB7CiAgICAgIGlmIChjbG9zZWRSZWFkRXZlbnRTZW50KSB7CiAgICAgICAgY2xvc2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZW5kVG9FdmVudEhhbmRsZXIoMSA8PCBzaHV0ZG93bldyaXRlQ29tbWFuZCk7CiAgICAgIH0KICAgICAgaXNDbG9zZWRXcml0ZSA9IHRydWU7CiAgICB9CiAgfQoKICB2b2lkIHNodXRkb3duUmVhZCgpIHsKICAgIGlmICghaXNDbG9zaW5nICYmICFpc0Nsb3NlZCkgewogICAgICBpZiAoaXNDbG9zZWRXcml0ZSkgewogICAgICAgIGNsb3NlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2VuZFRvRXZlbnRIYW5kbGVyKDEgPDwgc2h1dGRvd25SZWFkQ29tbWFuZCk7CiAgICAgIH0KICAgICAgaXNDbG9zZWRSZWFkID0gdHJ1ZTsKICAgIH0KICB9CgogIHZvaWQgc2VuZFRvRXZlbnRIYW5kbGVyKGludCBkYXRhKSB7CiAgICBpbnQgZnVsbERhdGEgPSAodHlwZUZsYWdzICYgdHlwZVR5cGVNYXNrKSB8IGRhdGE7CiAgICBhc3NlcnQoIWlzQ2xvc2luZyk7CiAgICBjb25uZWN0VG9FdmVudEhhbmRsZXIoKTsKICAgIF9FdmVudEhhbmRsZXIuX3NlbmREYXRhKHRoaXMsIGV2ZW50UG9ydC5zZW5kUG9ydCwgZnVsbERhdGEpOwogIH0KCiAgdm9pZCBjb25uZWN0VG9FdmVudEhhbmRsZXIoKSB7CiAgICBhc3NlcnQoIWlzQ2xvc2VkKTsKICAgIGlmIChldmVudFBvcnQgPT0gbnVsbCkgewogICAgICBldmVudFBvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQobXVsdGlwbGV4KTsKICAgIH0KICAgIGlmICghY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyKSB7CiAgICAgIHJlZ2lzdGVyRXh0ZW5zaW9uKAogICAgICAgICAgJ2V4dC5kYXJ0LmlvLmdldE9wZW5Tb2NrZXRzJywgX1NvY2tldFJlc291cmNlSW5mby5nZXRPcGVuU29ja2V0cyk7CiAgICAgIHJlZ2lzdGVyRXh0ZW5zaW9uKCdleHQuZGFydC5pby5nZXRTb2NrZXRCeUlEJywKICAgICAgICAgIF9Tb2NrZXRSZXNvdXJjZUluZm8uZ2V0U29ja2V0SW5mb01hcEJ5SUQpOwoKICAgICAgY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyID0gdHJ1ZTsKICAgIH0KICB9CgogIHZvaWQgZGlzY29ubmVjdEZyb21FdmVudEhhbmRsZXIoKSB7CiAgICBhc3NlcnQoZXZlbnRQb3J0ICE9IG51bGwpOwogICAgZXZlbnRQb3J0LmNsb3NlKCk7CiAgICBldmVudFBvcnQgPSBudWxsOwogICAgLy8gTm93IHRoYXQgd2UgZG9uJ3QgdHJhY2sgdGhpcyBTb2NrZXQgYW55bW9yZSwgd2UgY2FuIGNsZWFyIHRoZSBvd25lcgogICAgLy8gZmllbGQuCiAgICBvd25lciA9IG51bGw7CiAgfQoKICAvLyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gZXJyb3IgcmVzcG9uc2UgZnJvbSBhIG5hdGl2ZSBwb3J0IGNhbGwuCiAgc3RhdGljIGJvb2wgaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSB7CiAgICByZXR1cm4gcmVzcG9uc2UgaXMgTGlzdCAmJiByZXNwb25zZVswXSAhPSBfc3VjY2Vzc1Jlc3BvbnNlOwogIH0KCiAgLy8gQ3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBlcnJvci9leGNlcHRpb24gZnJvbSBkaWZmZXJlbnQgcmV0dXJuZWQKICAvLyBlcnJvciBvYmplY3RzLgogIHN0YXRpYyBjcmVhdGVFcnJvcihlcnJvciwgU3RyaW5nIG1lc3NhZ2UsCiAgICAgIFtJbnRlcm5ldEFkZHJlc3MgYWRkcmVzcywgaW50IHBvcnRdKSB7CiAgICBpZiAoZXJyb3IgaXMgT1NFcnJvcikgewogICAgICByZXR1cm4gbmV3IFNvY2tldEV4Y2VwdGlvbihtZXNzYWdlLAogICAgICAgICAgb3NFcnJvcjogZXJyb3IsIGFkZHJlc3M6IGFkZHJlc3MsIHBvcnQ6IHBvcnQpOwogICAgfSBlbHNlIGlmIChlcnJvciBpcyBMaXN0KSB7CiAgICAgIGFzc2VydChpc0Vycm9yUmVzcG9uc2UoZXJyb3IpKTsKICAgICAgc3dpdGNoIChlcnJvclswXSkgewogICAgICAgIGNhc2UgX2lsbGVnYWxBcmd1bWVudFJlc3BvbnNlOgogICAgICAgICAgcmV0dXJuIG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICAgICAgY2FzZSBfb3NFcnJvclJlc3BvbnNlOgogICAgICAgICAgcmV0dXJuIG5ldyBTb2NrZXRFeGNlcHRpb24obWVzc2FnZSwKICAgICAgICAgICAgICBvc0Vycm9yOiBuZXcgT1NFcnJvcihlcnJvclsyXSwgZXJyb3JbMV0pLAogICAgICAgICAgICAgIGFkZHJlc3M6IGFkZHJlc3MsCiAgICAgICAgICAgICAgcG9ydDogcG9ydCk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiBuZXcgRXhjZXB0aW9uKCJVbmtub3duIGVycm9yIik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgU29ja2V0RXhjZXB0aW9uKG1lc3NhZ2UsIGFkZHJlc3M6IGFkZHJlc3MsIHBvcnQ6IHBvcnQpOwogICAgfQogIH0KCiAgdm9pZCByZXBvcnRFcnJvcihlcnJvciwgU3RyaW5nIG1lc3NhZ2UpIHsKICAgIHZhciBlID0gY3JlYXRlRXJyb3IoZXJyb3IsIG1lc3NhZ2UsIGFkZHJlc3MsIGxvY2FsUG9ydCk7CiAgICAvLyBJbnZva2UgdGhlIGVycm9yIGhhbmRsZXIgaWYgYW55LgogICAgaWYgKGV2ZW50SGFuZGxlcnNbZXJyb3JFdmVudF0gIT0gbnVsbCkgewogICAgICBldmVudEhhbmRsZXJzW2Vycm9yRXZlbnRdKGUpOwogICAgfQogICAgLy8gRm9yIGFsbCBlcnJvcnMgd2UgY2xvc2UgdGhlIHNvY2tldAogICAgY2xvc2UoKTsKICB9CgogIGdldE9wdGlvbihTb2NrZXRPcHRpb24gb3B0aW9uKSB7CiAgICBpZiAob3B0aW9uID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoIm9wdGlvbiIpOwogICAgdmFyIHJlc3VsdCA9IG5hdGl2ZUdldE9wdGlvbihvcHRpb24uX3ZhbHVlLCBhZGRyZXNzLnR5cGUuX3ZhbHVlKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgdGhyb3cgcmVzdWx0OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGJvb2wgc2V0T3B0aW9uKFNvY2tldE9wdGlvbiBvcHRpb24sIHZhbHVlKSB7CiAgICBpZiAob3B0aW9uID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoIm9wdGlvbiIpOwogICAgdmFyIHJlc3VsdCA9IG5hdGl2ZVNldE9wdGlvbihvcHRpb24uX3ZhbHVlLCBhZGRyZXNzLnR5cGUuX3ZhbHVlLCB2YWx1ZSk7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHRocm93IHJlc3VsdDsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgVWludDhMaXN0IGdldFJhd09wdGlvbihSYXdTb2NrZXRPcHRpb24gb3B0aW9uKSB7CiAgICBpZiAob3B0aW9uID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoIm9wdGlvbiIpOwogICAgaWYgKG9wdGlvbi52YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJvcHRpb24udmFsdWUiKTsKCiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlR2V0UmF3T3B0aW9uKG9wdGlvbi5sZXZlbCwgb3B0aW9uLm9wdGlvbiwgb3B0aW9uLnZhbHVlKTsKICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgdGhyb3cgcmVzdWx0OwogICAgcmV0dXJuIG9wdGlvbi52YWx1ZTsKICB9CgogIHZvaWQgc2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pIHsKICAgIGlmIChvcHRpb24gPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgib3B0aW9uIik7CiAgICBpZiAob3B0aW9uLnZhbHVlID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoIm9wdGlvbi52YWx1ZSIpOwoKICAgIHZhciByZXN1bHQgPSBuYXRpdmVTZXRSYXdPcHRpb24ob3B0aW9uLmxldmVsLCBvcHRpb24ub3B0aW9uLCBvcHRpb24udmFsdWUpOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB0aHJvdyByZXN1bHQ7CiAgfQoKICBJbnRlcm5ldEFkZHJlc3MgbXVsdGljYXN0QWRkcmVzcygKICAgICAgSW50ZXJuZXRBZGRyZXNzIGFkZHIsIE5ldHdvcmtJbnRlcmZhY2UgaW50ZXJmYWNlKSB7CiAgICAvLyBPbiBNYWMgT1MgdXNpbmcgdGhlIGludGVyZmFjZSBpbmRleCBmb3Igam9pbmluZyBJUHY0IG11bHRpY2FzdCBncm91cHMKICAgIC8vIGlzIG5vdCBzdXBwb3J0ZWQuIEhlcmUgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZSBpcyBuZWVkZWQuCiAgICBpZiAoUGxhdGZvcm0uaXNNYWNPUyAmJiBhZGRyLnR5cGUgPT0gSW50ZXJuZXRBZGRyZXNzVHlwZS5JUHY0KSB7CiAgICAgIGlmIChpbnRlcmZhY2UgIT0gbnVsbCkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlLmFkZHJlc3Nlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKGludGVyZmFjZS5hZGRyZXNzZXNbaV0udHlwZSA9PSBJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjQpIHsKICAgICAgICAgICAgcmV0dXJuIGludGVyZmFjZS5hZGRyZXNzZXNbaV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIE5vIElQdjQgYWRkcmVzcyBmb3VuZCBvbiB0aGUgaW50ZXJmYWNlLgogICAgICAgIHRocm93IG5ldyBTb2NrZXRFeGNlcHRpb24oCiAgICAgICAgICAgICJUaGUgbmV0d29yayBpbnRlcmZhY2UgZG9lcyBub3QgaGF2ZSBhbiBhZGRyZXNzICIKICAgICAgICAgICAgIm9mIHRoZSBzYW1lIGZhbWlseSBhcyB0aGUgbXVsdGljYXN0IGFkZHJlc3MiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBEZWZhdWx0IHRvIHRoZSBBTlkgYWRkcmVzcyBpZiBubyBpbnRlcmZhY2UgaXMgc3BlY2lmaWVkLgogICAgICAgIHJldHVybiBJbnRlcm5ldEFkZHJlc3MuYW55SVB2NDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICB2b2lkIGpvaW5NdWx0aWNhc3QoSW50ZXJuZXRBZGRyZXNzIGFkZHIsIE5ldHdvcmtJbnRlcmZhY2UgaW50ZXJmYWNlKSB7CiAgICBfSW50ZXJuZXRBZGRyZXNzIGludGVyZmFjZUFkZHIgPSBtdWx0aWNhc3RBZGRyZXNzKGFkZHIsIGludGVyZmFjZSk7CiAgICB2YXIgaW50ZXJmYWNlSW5kZXggPSBpbnRlcmZhY2UgPT0gbnVsbCA/IDAgOiBpbnRlcmZhY2UuaW5kZXg7CiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlSm9pbk11bHRpY2FzdCgoYWRkciBhcyBfSW50ZXJuZXRBZGRyZXNzKS5faW5fYWRkciwKICAgICAgICBpbnRlcmZhY2VBZGRyPy5faW5fYWRkciwgaW50ZXJmYWNlSW5kZXgpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB0aHJvdyByZXN1bHQ7CiAgfQoKICB2b2lkIGxlYXZlTXVsdGljYXN0KEludGVybmV0QWRkcmVzcyBhZGRyLCBOZXR3b3JrSW50ZXJmYWNlIGludGVyZmFjZSkgewogICAgX0ludGVybmV0QWRkcmVzcyBpbnRlcmZhY2VBZGRyID0gbXVsdGljYXN0QWRkcmVzcyhhZGRyLCBpbnRlcmZhY2UpOwogICAgdmFyIGludGVyZmFjZUluZGV4ID0gaW50ZXJmYWNlID09IG51bGwgPyAwIDogaW50ZXJmYWNlLmluZGV4OwogICAgdmFyIHJlc3VsdCA9IG5hdGl2ZUxlYXZlTXVsdGljYXN0KChhZGRyIGFzIF9JbnRlcm5ldEFkZHJlc3MpLl9pbl9hZGRyLAogICAgICAgIGludGVyZmFjZUFkZHI/Ll9pbl9hZGRyLCBpbnRlcmZhY2VJbmRleCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHRocm93IHJlc3VsdDsKICB9CgogIHZvaWQgbmF0aXZlU2V0U29ja2V0SWQoaW50IGlkLCBpbnQgdHlwZUZsYWdzKSBuYXRpdmUgIlNvY2tldF9TZXRTb2NrZXRJZCI7CiAgbmF0aXZlQXZhaWxhYmxlKCkgbmF0aXZlICJTb2NrZXRfQXZhaWxhYmxlIjsKICBuYXRpdmVSZWFkKGludCBsZW4pIG5hdGl2ZSAiU29ja2V0X1JlYWQiOwogIG5hdGl2ZVJlY3ZGcm9tKCkgbmF0aXZlICJTb2NrZXRfUmVjdkZyb20iOwogIG5hdGl2ZVdyaXRlKExpc3Q8aW50PiBidWZmZXIsIGludCBvZmZzZXQsIGludCBieXRlcykKICAgICAgbmF0aXZlICJTb2NrZXRfV3JpdGVMaXN0IjsKICBuYXRpdmVTZW5kVG8oTGlzdDxpbnQ+IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGJ5dGVzLCBVaW50OExpc3QgYWRkcmVzcywKICAgICAgaW50IHBvcnQpIG5hdGl2ZSAiU29ja2V0X1NlbmRUbyI7CiAgbmF0aXZlQ3JlYXRlQ29ubmVjdChVaW50OExpc3QgYWRkciwgaW50IHBvcnQpIG5hdGl2ZSAiU29ja2V0X0NyZWF0ZUNvbm5lY3QiOwogIG5hdGl2ZUNyZWF0ZUJpbmRDb25uZWN0KFVpbnQ4TGlzdCBhZGRyLCBpbnQgcG9ydCwgVWludDhMaXN0IHNvdXJjZUFkZHIpCiAgICAgIG5hdGl2ZSAiU29ja2V0X0NyZWF0ZUJpbmRDb25uZWN0IjsKICBib29sIGlzQmluZEVycm9yKGludCBlcnJvck51bWJlcikgbmF0aXZlICJTb2NrZXRCYXNlX0lzQmluZEVycm9yIjsKICBuYXRpdmVDcmVhdGVCaW5kTGlzdGVuKFVpbnQ4TGlzdCBhZGRyLCBpbnQgcG9ydCwgaW50IGJhY2tsb2csIGJvb2wgdjZPbmx5LAogICAgICBib29sIHNoYXJlZCkgbmF0aXZlICJTZXJ2ZXJTb2NrZXRfQ3JlYXRlQmluZExpc3RlbiI7CiAgbmF0aXZlQ3JlYXRlQmluZERhdGFncmFtKFVpbnQ4TGlzdCBhZGRyLCBpbnQgcG9ydCwgYm9vbCByZXVzZUFkZHJlc3MsCiAgICAgIGJvb2wgcmV1c2VQb3J0LCBpbnQgdHRsKSBuYXRpdmUgIlNvY2tldF9DcmVhdGVCaW5kRGF0YWdyYW0iOwogIG5hdGl2ZUFjY2VwdChfTmF0aXZlU29ja2V0IHNvY2tldCkgbmF0aXZlICJTZXJ2ZXJTb2NrZXRfQWNjZXB0IjsKICBpbnQgbmF0aXZlR2V0UG9ydCgpIG5hdGl2ZSAiU29ja2V0X0dldFBvcnQiOwogIExpc3QgbmF0aXZlR2V0UmVtb3RlUGVlcigpIG5hdGl2ZSAiU29ja2V0X0dldFJlbW90ZVBlZXIiOwogIGludCBuYXRpdmVHZXRTb2NrZXRJZCgpIG5hdGl2ZSAiU29ja2V0X0dldFNvY2tldElkIjsKICBPU0Vycm9yIG5hdGl2ZUdldEVycm9yKCkgbmF0aXZlICJTb2NrZXRfR2V0RXJyb3IiOwogIG5hdGl2ZUdldE9wdGlvbihpbnQgb3B0aW9uLCBpbnQgcHJvdG9jb2wpIG5hdGl2ZSAiU29ja2V0X0dldE9wdGlvbiI7CiAgT1NFcnJvciBuYXRpdmVHZXRSYXdPcHRpb24oaW50IGxldmVsLCBpbnQgb3B0aW9uLCBVaW50OExpc3QgZGF0YSkKICAgICAgbmF0aXZlICJTb2NrZXRfR2V0UmF3T3B0aW9uIjsKICBPU0Vycm9yIG5hdGl2ZVNldE9wdGlvbihpbnQgb3B0aW9uLCBpbnQgcHJvdG9jb2wsIHZhbHVlKQogICAgICBuYXRpdmUgIlNvY2tldF9TZXRPcHRpb24iOwogIE9TRXJyb3IgbmF0aXZlU2V0UmF3T3B0aW9uKGludCBsZXZlbCwgaW50IG9wdGlvbiwgVWludDhMaXN0IGRhdGEpCiAgICAgIG5hdGl2ZSAiU29ja2V0X1NldFJhd09wdGlvbiI7CiAgT1NFcnJvciBuYXRpdmVKb2luTXVsdGljYXN0KFVpbnQ4TGlzdCBhZGRyLCBVaW50OExpc3QgaW50ZXJmYWNlQWRkciwKICAgICAgaW50IGludGVyZmFjZUluZGV4KSBuYXRpdmUgIlNvY2tldF9Kb2luTXVsdGljYXN0IjsKICBib29sIG5hdGl2ZUxlYXZlTXVsdGljYXN0KFVpbnQ4TGlzdCBhZGRyLCBVaW50OExpc3QgaW50ZXJmYWNlQWRkciwKICAgICAgaW50IGludGVyZmFjZUluZGV4KSBuYXRpdmUgIlNvY2tldF9MZWF2ZU11bHRpY2FzdCI7Cn0KCmNsYXNzIF9SYXdTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBTdHJlYW08UmF3U29ja2V0PiBpbXBsZW1lbnRzIFJhd1NlcnZlclNvY2tldCB7CiAgZmluYWwgX05hdGl2ZVNvY2tldCBfc29ja2V0OwogIFN0cmVhbUNvbnRyb2xsZXI8UmF3U29ja2V0PiBfY29udHJvbGxlcjsKICBSZWNlaXZlUG9ydCBfcmVmZXJlbmNlUG9ydDsKICBib29sIF92Nk9ubHk7CgogIHN0YXRpYyBGdXR1cmU8X1Jhd1NlcnZlclNvY2tldD4gYmluZCgKICAgICAgYWRkcmVzcywgaW50IHBvcnQsIGludCBiYWNrbG9nLCBib29sIHY2T25seSwgYm9vbCBzaGFyZWQpIHsKICAgIF90aHJvd09uQmFkUG9ydChwb3J0KTsKICAgIGlmIChiYWNrbG9nIDwgMCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgYmFja2xvZyAkYmFja2xvZyIpOwogICAgcmV0dXJuIF9OYXRpdmVTb2NrZXQuYmluZChhZGRyZXNzLCBwb3J0LCBiYWNrbG9nLCB2Nk9ubHksIHNoYXJlZCkKICAgICAgICAudGhlbigoc29ja2V0KSA9PiBuZXcgX1Jhd1NlcnZlclNvY2tldChzb2NrZXQsIHY2T25seSkpOwogIH0KCiAgX1Jhd1NlcnZlclNvY2tldCh0aGlzLl9zb2NrZXQsIHRoaXMuX3Y2T25seSk7CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxSYXdTb2NrZXQ+IGxpc3Rlbih2b2lkIG9uRGF0YShSYXdTb2NrZXQgZXZlbnQpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgaWYgKF9jb250cm9sbGVyICE9IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlN0cmVhbSB3YXMgYWxyZWFkeSBsaXN0ZW5lZCB0byIpOwogICAgfQogICAgdmFyIHpvbmUgPSBab25lLmN1cnJlbnQ7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyKAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlLAogICAgICAgIG9uQ2FuY2VsOiBfb25TdWJzY3JpcHRpb25TdGF0ZUNoYW5nZSwKICAgICAgICBvblBhdXNlOiBfb25QYXVzZVN0YXRlQ2hhbmdlLAogICAgICAgIG9uUmVzdW1lOiBfb25QYXVzZVN0YXRlQ2hhbmdlKTsKICAgIF9zb2NrZXQuc2V0SGFuZGxlcnMocmVhZDogem9uZS5iaW5kQ2FsbGJhY2tHdWFyZGVkKCgpIHsKICAgICAgd2hpbGUgKF9zb2NrZXQuYXZhaWxhYmxlID4gMCkgewogICAgICAgIHZhciBzb2NrZXQgPSBfc29ja2V0LmFjY2VwdCgpOwogICAgICAgIGlmIChzb2NrZXQgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgIF9jb250cm9sbGVyLmFkZChuZXcgX1Jhd1NvY2tldChzb2NrZXQpKTsKICAgICAgICBpZiAoX2NvbnRyb2xsZXIuaXNQYXVzZWQpIHJldHVybjsKICAgICAgfQogICAgfSksIGVycm9yOiB6b25lLmJpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZCgoZSkgewogICAgICBfY29udHJvbGxlci5hZGRFcnJvcihlKTsKICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgIH0pLCBkZXN0cm95ZWQ6ICgpIHsKICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgaWYgKF9yZWZlcmVuY2VQb3J0ICE9IG51bGwpIHsKICAgICAgICBfcmVmZXJlbmNlUG9ydC5jbG9zZSgpOwogICAgICAgIF9yZWZlcmVuY2VQb3J0ID0gbnVsbDsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuc3RyZWFtLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgaW50IGdldCBwb3J0ID0+IF9zb2NrZXQucG9ydDsKCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzID0+IF9zb2NrZXQuYWRkcmVzczsKCiAgRnV0dXJlPFJhd1NlcnZlclNvY2tldD4gY2xvc2UoKSB7CiAgICByZXR1cm4gX3NvY2tldC5jbG9zZSgpLnRoZW48UmF3U2VydmVyU29ja2V0PigoXykgewogICAgICBpZiAoX3JlZmVyZW5jZVBvcnQgIT0gbnVsbCkgewogICAgICAgIF9yZWZlcmVuY2VQb3J0LmNsb3NlKCk7CiAgICAgICAgX3JlZmVyZW5jZVBvcnQgPSBudWxsOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICB2b2lkIF9wYXVzZSgpIHsKICAgIF9zb2NrZXQuc2V0TGlzdGVuaW5nKHJlYWQ6IGZhbHNlLCB3cml0ZTogZmFsc2UpOwogIH0KCiAgdm9pZCBfcmVzdW1lKCkgewogICAgX3NvY2tldC5zZXRMaXN0ZW5pbmcocmVhZDogdHJ1ZSwgd3JpdGU6IGZhbHNlKTsKICB9CgogIHZvaWQgX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaGFzTGlzdGVuZXIpIHsKICAgICAgX3Jlc3VtZSgpOwogICAgfSBlbHNlIHsKICAgICAgX3NvY2tldC5jbG9zZSgpOwogICAgfQogIH0KCiAgdm9pZCBfb25QYXVzZVN0YXRlQ2hhbmdlKCkgewogICAgaWYgKF9jb250cm9sbGVyLmlzUGF1c2VkKSB7CiAgICAgIF9wYXVzZSgpOwogICAgfSBlbHNlIHsKICAgICAgX3Jlc3VtZSgpOwogICAgfQogIH0KCiAgdm9pZCBzZXQgX293bmVyKG93bmVyKSB7CiAgICBfc29ja2V0Lm93bmVyID0gb3duZXI7CiAgfQp9CgpjbGFzcyBfUmF3U29ja2V0IGV4dGVuZHMgU3RyZWFtPFJhd1NvY2tldEV2ZW50PiBpbXBsZW1lbnRzIFJhd1NvY2tldCB7CiAgZmluYWwgX05hdGl2ZVNvY2tldCBfc29ja2V0OwogIFN0cmVhbUNvbnRyb2xsZXI8UmF3U29ja2V0RXZlbnQ+IF9jb250cm9sbGVyOwogIGJvb2wgX3JlYWRFdmVudHNFbmFibGVkID0gdHJ1ZTsKICBib29sIF93cml0ZUV2ZW50c0VuYWJsZWQgPSB0cnVlOwoKICAvLyBGbGFnIHRvIGhhbmRsZSBDdHJsLUQgY2xvc2luZyBvZiBzdGRpbyBvbiBNYWMgT1MuCiAgYm9vbCBfaXNNYWNPU1Rlcm1pbmFsSW5wdXQgPSBmYWxzZTsKCiAgc3RhdGljIEZ1dHVyZTxSYXdTb2NrZXQ+IGNvbm5lY3QoCiAgICAgIGhvc3QsIGludCBwb3J0LCBzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0KSB7CiAgICByZXR1cm4gX05hdGl2ZVNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQsIHNvdXJjZUFkZHJlc3MsIHRpbWVvdXQpCiAgICAgICAgLnRoZW4oKHNvY2tldCkgPT4gbmV3IF9SYXdTb2NrZXQoc29ja2V0KSk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPENvbm5lY3Rpb25UYXNrPF9SYXdTb2NrZXQ+PiBzdGFydENvbm5lY3QoCiAgICAgIGhvc3QsIGludCBwb3J0LCBzb3VyY2VBZGRyZXNzKSB7CiAgICByZXR1cm4gX05hdGl2ZVNvY2tldC5zdGFydENvbm5lY3QoaG9zdCwgcG9ydCwgc291cmNlQWRkcmVzcykKICAgICAgICAudGhlbigoQ29ubmVjdGlvblRhc2s8X05hdGl2ZVNvY2tldD4gbmF0aXZlVGFzaykgewogICAgICBmaW5hbCBGdXR1cmU8X1Jhd1NvY2tldD4gcmF3ID0gbmF0aXZlVGFzay5zb2NrZXQKICAgICAgICAgIC50aGVuKChfTmF0aXZlU29ja2V0IG5hdGl2ZVNvY2tldCkgPT4gbmV3IF9SYXdTb2NrZXQobmF0aXZlU29ja2V0KSk7CiAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvblRhc2s8X1Jhd1NvY2tldD4uXygKICAgICAgICAgIHNvY2tldDogcmF3LCBvbkNhbmNlbDogbmF0aXZlVGFzay5fb25DYW5jZWwpOwogICAgfSk7CiAgfQoKICBfUmF3U29ja2V0KHRoaXMuX3NvY2tldCkgewogICAgdmFyIHpvbmUgPSBab25lLmN1cnJlbnQ7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyKAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlLAogICAgICAgIG9uQ2FuY2VsOiBfb25TdWJzY3JpcHRpb25TdGF0ZUNoYW5nZSwKICAgICAgICBvblBhdXNlOiBfb25QYXVzZVN0YXRlQ2hhbmdlLAogICAgICAgIG9uUmVzdW1lOiBfb25QYXVzZVN0YXRlQ2hhbmdlKTsKICAgIF9zb2NrZXQuc2V0SGFuZGxlcnMoCiAgICAgICAgcmVhZDogKCkgPT4gX2NvbnRyb2xsZXIuYWRkKFJhd1NvY2tldEV2ZW50LnJlYWQpLAogICAgICAgIHdyaXRlOiAoKSB7CiAgICAgICAgICAvLyBUaGUgd3JpdGUgZXZlbnQgaGFuZGxlciBpcyBhdXRvbWF0aWNhbGx5IGRpc2FibGVkIGJ5IHRoZQogICAgICAgICAgLy8gZXZlbnQgaGFuZGxlciB3aGVuIGl0IGZpcmVzLgogICAgICAgICAgd3JpdGVFdmVudHNFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQud3JpdGUpOwogICAgICAgIH0sCiAgICAgICAgY2xvc2VkOiAoKSA9PiBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZCksCiAgICAgICAgZGVzdHJveWVkOiAoKSB7CiAgICAgICAgICBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQuY2xvc2VkKTsKICAgICAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgICAgfSwKICAgICAgICBlcnJvcjogem9uZS5iaW5kVW5hcnlDYWxsYmFja0d1YXJkZWQoKGUpIHsKICAgICAgICAgIF9jb250cm9sbGVyLmFkZEVycm9yKGUpOwogICAgICAgICAgX3NvY2tldC5jbG9zZSgpOwogICAgICAgIH0pKTsKICB9CgogIGZhY3RvcnkgX1Jhd1NvY2tldC5fd3JpdGVQaXBlKCkgewogICAgdmFyIG5hdGl2ZSA9IG5ldyBfTmF0aXZlU29ja2V0LnBpcGUoKTsKICAgIG5hdGl2ZS5pc0Nsb3NlZFJlYWQgPSB0cnVlOwogICAgbmF0aXZlLmNsb3NlZFJlYWRFdmVudFNlbnQgPSB0cnVlOwogICAgcmV0dXJuIG5ldyBfUmF3U29ja2V0KG5hdGl2ZSk7CiAgfQoKICBmYWN0b3J5IF9SYXdTb2NrZXQuX3JlYWRQaXBlKGludCBmZCkgewogICAgdmFyIG5hdGl2ZSA9IG5ldyBfTmF0aXZlU29ja2V0LnBpcGUoKTsKICAgIG5hdGl2ZS5pc0Nsb3NlZFdyaXRlID0gdHJ1ZTsKICAgIGlmIChmZCAhPSBudWxsKSBfZ2V0U3RkaW9IYW5kbGUobmF0aXZlLCBmZCk7CiAgICB2YXIgcmVzdWx0ID0gbmV3IF9SYXdTb2NrZXQobmF0aXZlKTsKICAgIGlmIChmZCAhPSBudWxsKSB7CiAgICAgIHZhciBzb2NrZXRUeXBlID0gX1N0ZElPVXRpbHMuX25hdGl2ZVNvY2tldFR5cGUocmVzdWx0Ll9zb2NrZXQpOwogICAgICByZXN1bHQuX2lzTWFjT1NUZXJtaW5hbElucHV0ID0KICAgICAgICAgIFBsYXRmb3JtLmlzTWFjT1MgJiYgc29ja2V0VHlwZSA9PSBfc3RkaW9IYW5kbGVUeXBlVGVybWluYWw7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFJhd1NvY2tldEV2ZW50PiBsaXN0ZW4odm9pZCBvbkRhdGEoUmF3U29ja2V0RXZlbnQgZXZlbnQpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgcmV0dXJuIF9jb250cm9sbGVyLnN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIGludCBhdmFpbGFibGUoKSA9PiBfc29ja2V0LmF2YWlsYWJsZTsKCiAgVWludDhMaXN0IHJlYWQoW2ludCBsZW5dKSB7CiAgICBpZiAoX2lzTWFjT1NUZXJtaW5hbElucHV0KSB7CiAgICAgIHZhciBhdmFpbGFibGUgPSB0aGlzLmF2YWlsYWJsZSgpOwogICAgICBpZiAoYXZhaWxhYmxlID09IDApIHJldHVybiBudWxsOwogICAgICB2YXIgZGF0YSA9IF9zb2NrZXQucmVhZChsZW4pOwogICAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEubGVuZ3RoIDwgYXZhaWxhYmxlKSB7CiAgICAgICAgLy8gUmVhZGluZyBsZXNzIHRoYW4gYXZhaWxhYmxlIGZyb20gYSBNYWMgT1MgdGVybWluYWwgaW5kaWNhdGUgQ3RybC1ELgogICAgICAgIC8vIFRoaXMgaXMgaW50ZXJwcmV0ZWQgYXMgcmVhZCBjbG9zZWQuCiAgICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgPT4gX2NvbnRyb2xsZXIuYWRkKFJhd1NvY2tldEV2ZW50LnJlYWRDbG9zZWQpKTsKICAgICAgfQogICAgICByZXR1cm4gZGF0YTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfc29ja2V0LnJlYWQobGVuKTsKICAgIH0KICB9CgogIGludCB3cml0ZShMaXN0PGludD4gYnVmZmVyLCBbaW50IG9mZnNldCwgaW50IGNvdW50XSkgPT4KICAgICAgX3NvY2tldC53cml0ZShidWZmZXIsIG9mZnNldCwgY291bnQpOwoKICBGdXR1cmU8UmF3U29ja2V0PiBjbG9zZSgpID0+IF9zb2NrZXQuY2xvc2UoKS50aGVuPFJhd1NvY2tldD4oKF8pID0+IHRoaXMpOwoKICB2b2lkIHNodXRkb3duKFNvY2tldERpcmVjdGlvbiBkaXJlY3Rpb24pID0+IF9zb2NrZXQuc2h1dGRvd24oZGlyZWN0aW9uKTsKCiAgaW50IGdldCBwb3J0ID0+IF9zb2NrZXQucG9ydDsKCiAgaW50IGdldCByZW1vdGVQb3J0ID0+IF9zb2NrZXQucmVtb3RlUG9ydDsKCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzID0+IF9zb2NrZXQuYWRkcmVzczsKCiAgSW50ZXJuZXRBZGRyZXNzIGdldCByZW1vdGVBZGRyZXNzID0+IF9zb2NrZXQucmVtb3RlQWRkcmVzczsKCiAgYm9vbCBnZXQgcmVhZEV2ZW50c0VuYWJsZWQgPT4gX3JlYWRFdmVudHNFbmFibGVkOwogIHZvaWQgc2V0IHJlYWRFdmVudHNFbmFibGVkKGJvb2wgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSAhPSBfcmVhZEV2ZW50c0VuYWJsZWQpIHsKICAgICAgX3JlYWRFdmVudHNFbmFibGVkID0gdmFsdWU7CiAgICAgIGlmICghX2NvbnRyb2xsZXIuaXNQYXVzZWQpIF9yZXN1bWUoKTsKICAgIH0KICB9CgogIGJvb2wgZ2V0IHdyaXRlRXZlbnRzRW5hYmxlZCA9PiBfd3JpdGVFdmVudHNFbmFibGVkOwogIHZvaWQgc2V0IHdyaXRlRXZlbnRzRW5hYmxlZChib29sIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgIT0gX3dyaXRlRXZlbnRzRW5hYmxlZCkgewogICAgICBfd3JpdGVFdmVudHNFbmFibGVkID0gdmFsdWU7CiAgICAgIGlmICghX2NvbnRyb2xsZXIuaXNQYXVzZWQpIF9yZXN1bWUoKTsKICAgIH0KICB9CgogIGJvb2wgc2V0T3B0aW9uKFNvY2tldE9wdGlvbiBvcHRpb24sIGJvb2wgZW5hYmxlZCkgPT4KICAgICAgX3NvY2tldC5zZXRPcHRpb24ob3B0aW9uLCBlbmFibGVkKTsKCiAgVWludDhMaXN0IGdldFJhd09wdGlvbihSYXdTb2NrZXRPcHRpb24gb3B0aW9uKSA9PgogICAgICBfc29ja2V0LmdldFJhd09wdGlvbihvcHRpb24pOwogIHZvaWQgc2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pID0+IF9zb2NrZXQuc2V0UmF3T3B0aW9uKG9wdGlvbik7CgogIF9wYXVzZSgpIHsKICAgIF9zb2NrZXQuc2V0TGlzdGVuaW5nKHJlYWQ6IGZhbHNlLCB3cml0ZTogZmFsc2UpOwogIH0KCiAgdm9pZCBfcmVzdW1lKCkgewogICAgX3NvY2tldC5zZXRMaXN0ZW5pbmcocmVhZDogX3JlYWRFdmVudHNFbmFibGVkLCB3cml0ZTogX3dyaXRlRXZlbnRzRW5hYmxlZCk7CiAgfQoKICB2b2lkIF9vblBhdXNlU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaXNQYXVzZWQpIHsKICAgICAgX3BhdXNlKCk7CiAgICB9IGVsc2UgewogICAgICBfcmVzdW1lKCk7CiAgICB9CiAgfQoKICB2b2lkIF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlKCkgewogICAgaWYgKF9jb250cm9sbGVyLmhhc0xpc3RlbmVyKSB7CiAgICAgIF9yZXN1bWUoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9zb2NrZXQuY2xvc2UoKTsKICAgIH0KICB9CgogIHZvaWQgc2V0IF9vd25lcihvd25lcikgewogICAgX3NvY2tldC5vd25lciA9IG93bmVyOwogIH0KfQoKQHBhdGNoCmNsYXNzIFNlcnZlclNvY2tldCB7CiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxTZXJ2ZXJTb2NrZXQ+IGJpbmQoYWRkcmVzcywgaW50IHBvcnQsCiAgICAgIHtpbnQgYmFja2xvZzogMCwgYm9vbCB2Nk9ubHk6IGZhbHNlLCBib29sIHNoYXJlZDogZmFsc2V9KSB7CiAgICByZXR1cm4gX1NlcnZlclNvY2tldC5iaW5kKGFkZHJlc3MsIHBvcnQsIGJhY2tsb2csIHY2T25seSwgc2hhcmVkKTsKICB9Cn0KCmNsYXNzIF9TZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBTdHJlYW08U29ja2V0PiBpbXBsZW1lbnRzIFNlcnZlclNvY2tldCB7CiAgZmluYWwgX3NvY2tldDsKCiAgc3RhdGljIEZ1dHVyZTxfU2VydmVyU29ja2V0PiBiaW5kKAogICAgICBhZGRyZXNzLCBpbnQgcG9ydCwgaW50IGJhY2tsb2csIGJvb2wgdjZPbmx5LCBib29sIHNoYXJlZCkgewogICAgcmV0dXJuIF9SYXdTZXJ2ZXJTb2NrZXQuYmluZChhZGRyZXNzLCBwb3J0LCBiYWNrbG9nLCB2Nk9ubHksIHNoYXJlZCkKICAgICAgICAudGhlbigoc29ja2V0KSA9PiBuZXcgX1NlcnZlclNvY2tldChzb2NrZXQpKTsKICB9CgogIF9TZXJ2ZXJTb2NrZXQodGhpcy5fc29ja2V0KTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFNvY2tldD4gbGlzdGVuKHZvaWQgb25EYXRhKFNvY2tldCBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX3NvY2tldC5tYXA8U29ja2V0PigocmF3U29ja2V0KSA9PiBuZXcgX1NvY2tldChyYXdTb2NrZXQpKS5saXN0ZW4oCiAgICAgICAgb25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsCiAgICAgICAgb25Eb25lOiBvbkRvbmUsCiAgICAgICAgY2FuY2VsT25FcnJvcjogY2FuY2VsT25FcnJvcik7CiAgfQoKICBpbnQgZ2V0IHBvcnQgPT4gX3NvY2tldC5wb3J0OwoKICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3MgPT4gX3NvY2tldC5hZGRyZXNzOwoKICBGdXR1cmU8U2VydmVyU29ja2V0PiBjbG9zZSgpID0+CiAgICAgIF9zb2NrZXQuY2xvc2UoKS50aGVuPFNlcnZlclNvY2tldD4oKF8pID0+IHRoaXMpOwoKICB2b2lkIHNldCBfb3duZXIob3duZXIpIHsKICAgIF9zb2NrZXQuX293bmVyID0gb3duZXI7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgU29ja2V0IHsKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPFNvY2tldD4gX2Nvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0fSkgewogICAgcmV0dXJuIFJhd1NvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQsCiAgICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MsIHRpbWVvdXQ6IHRpbWVvdXQpCiAgICAgICAgLnRoZW4oKHNvY2tldCkgPT4gbmV3IF9Tb2NrZXQoc29ja2V0KSk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPENvbm5lY3Rpb25UYXNrPFNvY2tldD4+IF9zdGFydENvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzfSkgewogICAgcmV0dXJuIFJhd1NvY2tldC5zdGFydENvbm5lY3QoaG9zdCwgcG9ydCwgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcykKICAgICAgICAudGhlbigocmF3VGFzaykgewogICAgICBGdXR1cmU8U29ja2V0PiBzb2NrZXQgPQogICAgICAgICAgcmF3VGFzay5zb2NrZXQudGhlbigocmF3U29ja2V0KSA9PiBuZXcgX1NvY2tldChyYXdTb2NrZXQpKTsKICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uVGFzazxTb2NrZXQ+Ll8oCiAgICAgICAgICBzb2NrZXQ6IHNvY2tldCwgb25DYW5jZWw6IHJhd1Rhc2suX29uQ2FuY2VsKTsKICAgIH0pOwogIH0KfQoKY2xhc3MgX1NvY2tldFN0cmVhbUNvbnN1bWVyIGV4dGVuZHMgU3RyZWFtQ29uc3VtZXI8TGlzdDxpbnQ+PiB7CiAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICBmaW5hbCBfU29ja2V0IHNvY2tldDsKICBpbnQgb2Zmc2V0OwogIExpc3Q8aW50PiBidWZmZXI7CiAgYm9vbCBwYXVzZWQgPSBmYWxzZTsKICBDb21wbGV0ZXIgc3RyZWFtQ29tcGxldGVyOwoKICBfU29ja2V0U3RyZWFtQ29uc3VtZXIodGhpcy5zb2NrZXQpOwoKICBGdXR1cmU8U29ja2V0PiBhZGRTdHJlYW0oU3RyZWFtPExpc3Q8aW50Pj4gc3RyZWFtKSB7CiAgICBzb2NrZXQuX2Vuc3VyZVJhd1NvY2tldFN1YnNjcmlwdGlvbigpOwogICAgc3RyZWFtQ29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxTb2NrZXQ+KCk7CiAgICBpZiAoc29ja2V0Ll9yYXcgIT0gbnVsbCkgewogICAgICBzdWJzY3JpcHRpb24gPSBzdHJlYW0ubGlzdGVuKChkYXRhKSB7CiAgICAgICAgYXNzZXJ0KCFwYXVzZWQpOwogICAgICAgIGFzc2VydChidWZmZXIgPT0gbnVsbCk7CiAgICAgICAgYnVmZmVyID0gZGF0YTsKICAgICAgICBvZmZzZXQgPSAwOwogICAgICAgIHRyeSB7CiAgICAgICAgICB3cml0ZSgpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7CiAgICAgICAgICBzdG9wKCk7CiAgICAgICAgICBkb25lKGUpOwogICAgICAgIH0KICAgICAgfSwgb25FcnJvcjogKGVycm9yLCBbc3RhY2tUcmFjZV0pIHsKICAgICAgICBzb2NrZXQuZGVzdHJveSgpOwogICAgICAgIGRvbmUoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9LCBvbkRvbmU6ICgpIHsKICAgICAgICBkb25lKCk7CiAgICAgIH0sIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgfQogICAgcmV0dXJuIHN0cmVhbUNvbXBsZXRlci5mdXR1cmU7CiAgfQoKICBGdXR1cmU8U29ja2V0PiBjbG9zZSgpIHsKICAgIHNvY2tldC5fY29uc3VtZXJEb25lKCk7CiAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShzb2NrZXQpOwogIH0KCiAgdm9pZCB3cml0ZSgpIHsKICAgIGlmIChzdWJzY3JpcHRpb24gPT0gbnVsbCkgcmV0dXJuOwogICAgYXNzZXJ0KGJ1ZmZlciAhPSBudWxsKTsKICAgIC8vIFdyaXRlIGFzIG11Y2ggYXMgcG9zc2libGUuCiAgICBvZmZzZXQgKz0gc29ja2V0Ll93cml0ZShidWZmZXIsIG9mZnNldCwgYnVmZmVyLmxlbmd0aCAtIG9mZnNldCk7CiAgICBpZiAob2Zmc2V0IDwgYnVmZmVyLmxlbmd0aCkgewogICAgICBpZiAoIXBhdXNlZCkgewogICAgICAgIHBhdXNlZCA9IHRydWU7CiAgICAgICAgc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICAgIH0KICAgICAgc29ja2V0Ll9lbmFibGVXcml0ZUV2ZW50KCk7CiAgICB9IGVsc2UgewogICAgICBidWZmZXIgPSBudWxsOwogICAgICBpZiAocGF1c2VkKSB7CiAgICAgICAgcGF1c2VkID0gZmFsc2U7CiAgICAgICAgc3Vic2NyaXB0aW9uLnJlc3VtZSgpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGRvbmUoW2Vycm9yLCBzdGFja1RyYWNlXSkgewogICAgaWYgKHN0cmVhbUNvbXBsZXRlciAhPSBudWxsKSB7CiAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7CiAgICAgICAgc3RyZWFtQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9IGVsc2UgewogICAgICAgIHN0cmVhbUNvbXBsZXRlci5jb21wbGV0ZShzb2NrZXQpOwogICAgICB9CiAgICAgIHN0cmVhbUNvbXBsZXRlciA9IG51bGw7CiAgICB9CiAgfQoKICB2b2lkIHN0b3AoKSB7CiAgICBpZiAoc3Vic2NyaXB0aW9uID09IG51bGwpIHJldHVybjsKICAgIHN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgIHN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICBwYXVzZWQgPSBmYWxzZTsKICAgIHNvY2tldC5fZGlzYWJsZVdyaXRlRXZlbnQoKTsKICB9Cn0KCmNsYXNzIF9Tb2NrZXQgZXh0ZW5kcyBTdHJlYW08VWludDhMaXN0PiBpbXBsZW1lbnRzIFNvY2tldCB7CiAgUmF3U29ja2V0IF9yYXc7IC8vIFNldCB0byBudWxsIHdoZW4gdGhlIHJhdyBzb2NrZXQgaXMgY2xvc2VkLgogIGJvb2wgX2Nsb3NlZCA9IGZhbHNlOyAvLyBTZXQgdG8gdHJ1ZSB3aGVuIHRoZSByYXcgc29ja2V0IGlzIGNsb3NlZC4KICBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4gX2NvbnRyb2xsZXI7CiAgYm9vbCBfY29udHJvbGxlckNsb3NlZCA9IGZhbHNlOwogIF9Tb2NrZXRTdHJlYW1Db25zdW1lciBfY29uc3VtZXI7CiAgSU9TaW5rIF9zaW5rOwogIHZhciBfc3Vic2NyaXB0aW9uOwogIHZhciBfZGV0YWNoUmVhZHk7CgogIF9Tb2NrZXQodGhpcy5fcmF3KSB7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4oCiAgICAgICAgc3luYzogdHJ1ZSwKICAgICAgICBvbkxpc3RlbjogX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UsCiAgICAgICAgb25DYW5jZWw6IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlLAogICAgICAgIG9uUGF1c2U6IF9vblBhdXNlU3RhdGVDaGFuZ2UsCiAgICAgICAgb25SZXN1bWU6IF9vblBhdXNlU3RhdGVDaGFuZ2UpOwogICAgX2NvbnN1bWVyID0gbmV3IF9Tb2NrZXRTdHJlYW1Db25zdW1lcih0aGlzKTsKICAgIF9zaW5rID0gbmV3IElPU2luayhfY29uc3VtZXIpOwoKICAgIC8vIERpc2FibGUgcmVhZCBldmVudHMgdW50aWwgdGhlcmUgaXMgYSBzdWJzY3JpcHRpb24uCiAgICBfcmF3LnJlYWRFdmVudHNFbmFibGVkID0gZmFsc2U7CgogICAgLy8gRGlzYWJsZSB3cml0ZSBldmVudHMgdW50aWwgdGhlIGNvbnN1bWVyIG5lZWRzIGl0IGZvciBwZW5kaW5nIHdyaXRlcy4KICAgIF9yYXcud3JpdGVFdmVudHNFbmFibGVkID0gZmFsc2U7CiAgfQoKICBmYWN0b3J5IF9Tb2NrZXQuX3dyaXRlUGlwZSgpIHsKICAgIHJldHVybiBuZXcgX1NvY2tldChuZXcgX1Jhd1NvY2tldC5fd3JpdGVQaXBlKCkpOwogIH0KCiAgZmFjdG9yeSBfU29ja2V0Ll9yZWFkUGlwZShbaW50IGZkXSkgewogICAgcmV0dXJuIG5ldyBfU29ja2V0KG5ldyBfUmF3U29ja2V0Ll9yZWFkUGlwZShmZCkpOwogIH0KCiAgLy8gTm90ZTogdGhpcyBjb2RlIHNlZW1zIGEgYml0IHN1c3BpY2lvdXMgYmVjYXVzZSBfcmF3IGNhbiBiZSBfUmF3U29ja2V0IGFuZAogIC8vIGl0IGNhbiBiZSBfUmF3U2VjdXJlU29ja2V0IGJlY2F1c2UgX1NlY3VyZVNvY2tldCBleHRlbmRzIF9Tb2NrZXQKICAvLyBhbmQgdGhlc2UgdHdvIHR5cGVzIGFyZSBpbmNvbXBhdGlibGUgYmVjYXVzZSBfUmF3U2VjdXJlU29ja2V0Ll9zb2NrZXQKICAvLyBpcyBTb2NrZXQgYW5kIG5vdCBfTmF0aXZlU29ja2V0LgogIF9OYXRpdmVTb2NrZXQgZ2V0IF9uYXRpdmVTb2NrZXQgPT4gKF9yYXcgYXMgX1Jhd1NvY2tldCkuX3NvY2tldDsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFVpbnQ4TGlzdD4gbGlzdGVuKHZvaWQgb25EYXRhKFVpbnQ4TGlzdCBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuc3RyZWFtLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgRW5jb2RpbmcgZ2V0IGVuY29kaW5nID0+IF9zaW5rLmVuY29kaW5nOwoKICB2b2lkIHNldCBlbmNvZGluZyhFbmNvZGluZyB2YWx1ZSkgewogICAgX3NpbmsuZW5jb2RpbmcgPSB2YWx1ZTsKICB9CgogIHZvaWQgd3JpdGUoT2JqZWN0IG9iaikgPT4gX3Npbmsud3JpdGUob2JqKTsKCiAgdm9pZCB3cml0ZWxuKFtPYmplY3Qgb2JqID0gIiJdKSA9PiBfc2luay53cml0ZWxuKG9iaik7CgogIHZvaWQgd3JpdGVDaGFyQ29kZShpbnQgY2hhckNvZGUpID0+IF9zaW5rLndyaXRlQ2hhckNvZGUoY2hhckNvZGUpOwoKICB2b2lkIHdyaXRlQWxsKEl0ZXJhYmxlIG9iamVjdHMsIFtzZXAgPSAiIl0pID0+IF9zaW5rLndyaXRlQWxsKG9iamVjdHMsIHNlcCk7CgogIHZvaWQgYWRkKExpc3Q8aW50PiBieXRlcykgPT4gX3NpbmsuYWRkKGJ5dGVzKTsKCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHNlbmQgZXJyb3JzIG9uIHNvY2tldHMiKTsKICB9CgogIEZ1dHVyZSBhZGRTdHJlYW0oU3RyZWFtPExpc3Q8aW50Pj4gc3RyZWFtKSB7CiAgICByZXR1cm4gX3NpbmsuYWRkU3RyZWFtKHN0cmVhbSk7CiAgfQoKICBGdXR1cmUgZmx1c2goKSA9PiBfc2luay5mbHVzaCgpOwoKICBGdXR1cmUgY2xvc2UoKSA9PiBfc2luay5jbG9zZSgpOwoKICBGdXR1cmUgZ2V0IGRvbmUgPT4gX3NpbmsuZG9uZTsKCiAgdm9pZCBkZXN0cm95KCkgewogICAgLy8gRGVzdHJveSBjYW4gYWx3YXlzIGJlIGNhbGxlZCB0byBnZXQgcmlkIG9mIGEgc29ja2V0LgogICAgaWYgKF9yYXcgPT0gbnVsbCkgcmV0dXJuOwogICAgX2NvbnN1bWVyLnN0b3AoKTsKICAgIF9jbG9zZVJhd1NvY2tldCgpOwogICAgX2NvbnRyb2xsZXJDbG9zZWQgPSB0cnVlOwogICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICB9CgogIGJvb2wgc2V0T3B0aW9uKFNvY2tldE9wdGlvbiBvcHRpb24sIGJvb2wgZW5hYmxlZCkgewogICAgaWYgKF9yYXcgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIF9yYXcuc2V0T3B0aW9uKG9wdGlvbiwgZW5hYmxlZCk7CiAgfQoKICBVaW50OExpc3QgZ2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pIHsKICAgIGlmIChfcmF3ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9yYXcuZ2V0UmF3T3B0aW9uKG9wdGlvbik7CiAgfQoKICB2b2lkIHNldFJhd09wdGlvbihSYXdTb2NrZXRPcHRpb24gb3B0aW9uKSB7CiAgICBfcmF3Py5zZXRSYXdPcHRpb24ob3B0aW9uKTsKICB9CgogIGludCBnZXQgcG9ydCB7CiAgICBpZiAoX3JhdyA9PSBudWxsKSB0aHJvdyBjb25zdCBTb2NrZXRFeGNlcHRpb24uY2xvc2VkKCk7CiAgICA7CiAgICByZXR1cm4gX3Jhdy5wb3J0OwogIH0KCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzIHsKICAgIGlmIChfcmF3ID09IG51bGwpIHRocm93IGNvbnN0IFNvY2tldEV4Y2VwdGlvbi5jbG9zZWQoKTsKICAgIDsKICAgIHJldHVybiBfcmF3LmFkZHJlc3M7CiAgfQoKICBpbnQgZ2V0IHJlbW90ZVBvcnQgewogICAgaWYgKF9yYXcgPT0gbnVsbCkgdGhyb3cgY29uc3QgU29ja2V0RXhjZXB0aW9uLmNsb3NlZCgpOwogICAgOwogICAgcmV0dXJuIF9yYXcucmVtb3RlUG9ydDsKICB9CgogIEludGVybmV0QWRkcmVzcyBnZXQgcmVtb3RlQWRkcmVzcyB7CiAgICBpZiAoX3JhdyA9PSBudWxsKSB0aHJvdyBjb25zdCBTb2NrZXRFeGNlcHRpb24uY2xvc2VkKCk7CiAgICA7CiAgICByZXR1cm4gX3Jhdy5yZW1vdGVBZGRyZXNzOwogIH0KCiAgRnV0dXJlIF9kZXRhY2hSYXcoKSB7CiAgICBfZGV0YWNoUmVhZHkgPSBuZXcgQ29tcGxldGVyKCk7CiAgICBfc2luay5jbG9zZSgpOwogICAgcmV0dXJuIF9kZXRhY2hSZWFkeS5mdXR1cmUudGhlbigoXykgewogICAgICBhc3NlcnQoX2NvbnN1bWVyLmJ1ZmZlciA9PSBudWxsKTsKICAgICAgdmFyIHJhdyA9IF9yYXc7CiAgICAgIF9yYXcgPSBudWxsOwogICAgICByZXR1cm4gW3JhdywgX3N1YnNjcmlwdGlvbl07CiAgICB9KTsKICB9CgogIC8vIEVuc3VyZSBhIHN1YnNjcmlwdGlvbiBvbiB0aGUgcmF3IHNvY2tldC4gQm90aCB0aGUgc3RyZWFtIGFuZCB0aGUKICAvLyBjb25zdW1lciBuZWVkcyBhIHN1YnNjcmlwdGlvbiBhcyB0aGV5IHNoYXJlIHRoZSBlcnJvciBhbmQgZG9uZQogIC8vIGV2ZW50cyBmcm9tIHRoZSByYXcgc29ja2V0LgogIHZvaWQgX2Vuc3VyZVJhd1NvY2tldFN1YnNjcmlwdGlvbigpIHsKICAgIGlmIChfc3Vic2NyaXB0aW9uID09IG51bGwgJiYgX3JhdyAhPSBudWxsKSB7CiAgICAgIF9zdWJzY3JpcHRpb24gPSBfcmF3Lmxpc3Rlbihfb25EYXRhLAogICAgICAgICAgb25FcnJvcjogX29uRXJyb3IsIG9uRG9uZTogX29uRG9uZSwgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICB9CiAgfQoKICBfY2xvc2VSYXdTb2NrZXQoKSB7CiAgICB2YXIgdG1wID0gX3JhdzsKICAgIF9yYXcgPSBudWxsOwogICAgX2Nsb3NlZCA9IHRydWU7CiAgICB0bXAuY2xvc2UoKTsKICB9CgogIHZvaWQgX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaGFzTGlzdGVuZXIpIHsKICAgICAgX2Vuc3VyZVJhd1NvY2tldFN1YnNjcmlwdGlvbigpOwogICAgICAvLyBFbmFibGUgcmVhZCBldmVudHMgZm9yIHByb3ZpZGluZyBkYXRhIHRvIHN1YnNjcmlwdGlvbi4KICAgICAgaWYgKF9yYXcgIT0gbnVsbCkgewogICAgICAgIF9yYXcucmVhZEV2ZW50c0VuYWJsZWQgPSB0cnVlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBfY29udHJvbGxlckNsb3NlZCA9IHRydWU7CiAgICAgIGlmIChfcmF3ICE9IG51bGwpIHsKICAgICAgICBfcmF3LnNodXRkb3duKFNvY2tldERpcmVjdGlvbi5yZWNlaXZlKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfb25QYXVzZVN0YXRlQ2hhbmdlKCkgewogICAgaWYgKF9yYXcgIT0gbnVsbCkgewogICAgICBfcmF3LnJlYWRFdmVudHNFbmFibGVkID0gIV9jb250cm9sbGVyLmlzUGF1c2VkOwogICAgfQogIH0KCiAgdm9pZCBfb25EYXRhKGV2ZW50KSB7CiAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgIGNhc2UgUmF3U29ja2V0RXZlbnQucmVhZDoKICAgICAgICBpZiAoX3JhdyA9PSBudWxsKSBicmVhazsKICAgICAgICB2YXIgYnVmZmVyID0gX3Jhdy5yZWFkKCk7CiAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKSBfY29udHJvbGxlci5hZGQoYnVmZmVyKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBSYXdTb2NrZXRFdmVudC53cml0ZToKICAgICAgICBfY29uc3VtZXIud3JpdGUoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBSYXdTb2NrZXRFdmVudC5yZWFkQ2xvc2VkOgogICAgICAgIF9jb250cm9sbGVyQ2xvc2VkID0gdHJ1ZTsKICAgICAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgdm9pZCBfb25Eb25lKCkgewogICAgaWYgKCFfY29udHJvbGxlckNsb3NlZCkgewogICAgICBfY29udHJvbGxlckNsb3NlZCA9IHRydWU7CiAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICB9CiAgICBfY29uc3VtZXIuZG9uZSgpOwogIH0KCiAgdm9pZCBfb25FcnJvcihlcnJvciwgc3RhY2tUcmFjZSkgewogICAgaWYgKCFfY29udHJvbGxlckNsb3NlZCkgewogICAgICBfY29udHJvbGxlckNsb3NlZCA9IHRydWU7CiAgICAgIF9jb250cm9sbGVyLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgIH0KICAgIF9jb25zdW1lci5kb25lKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIGludCBfd3JpdGUoTGlzdDxpbnQ+IGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKICAgIGlmIChfcmF3ICE9IG51bGwpIHsKICAgICAgcmV0dXJuIF9yYXcud3JpdGUoZGF0YSwgb2Zmc2V0LCBsZW5ndGgpOwogICAgfQogICAgcmV0dXJuIDA7CiAgfQoKICB2b2lkIF9lbmFibGVXcml0ZUV2ZW50KCkgewogICAgaWYgKF9yYXcgIT0gbnVsbCkgewogICAgICBfcmF3LndyaXRlRXZlbnRzRW5hYmxlZCA9IHRydWU7CiAgICB9CiAgfQoKICB2b2lkIF9kaXNhYmxlV3JpdGVFdmVudCgpIHsKICAgIGlmIChfcmF3ICE9IG51bGwpIHsKICAgICAgX3Jhdy53cml0ZUV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKICAgIH0KICB9CgogIHZvaWQgX2NvbnN1bWVyRG9uZSgpIHsKICAgIGlmIChfZGV0YWNoUmVhZHkgIT0gbnVsbCkgewogICAgICBfZGV0YWNoUmVhZHkuY29tcGxldGUobnVsbCk7CiAgICB9IGVsc2UgewogICAgICBpZiAoX3JhdyAhPSBudWxsKSB7CiAgICAgICAgX3Jhdy5zaHV0ZG93bihTb2NrZXREaXJlY3Rpb24uc2VuZCk7CiAgICAgICAgX2Rpc2FibGVXcml0ZUV2ZW50KCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgc2V0IF9vd25lcihvd25lcikgewogICAgLy8gTm90ZTogX3JhdyBjYW4gYmUgX1Jhd1NvY2tldCBhbmQgX1Jhd1NlY3VyZVNvY2tldCB3aGljaCBhcmUgdHdvCiAgICAvLyBpbmNvbXBhdGlibGUgdHlwZXMuCiAgICAoX3JhdyBhcyBkeW5hbWljKS5fb3duZXIgPSBvd25lcjsKICB9Cn0KCkBwYXRjaApjbGFzcyBSYXdEYXRhZ3JhbVNvY2tldCB7CiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxSYXdEYXRhZ3JhbVNvY2tldD4gYmluZChob3N0LCBpbnQgcG9ydCwKICAgICAge2Jvb2wgcmV1c2VBZGRyZXNzOiB0cnVlLCBib29sIHJldXNlUG9ydDogZmFsc2UsIGludCB0dGw6IDF9KSB7CiAgICByZXR1cm4gX1Jhd0RhdGFncmFtU29ja2V0LmJpbmQoaG9zdCwgcG9ydCwgcmV1c2VBZGRyZXNzLCByZXVzZVBvcnQsIHR0bCk7CiAgfQp9CgpjbGFzcyBfUmF3RGF0YWdyYW1Tb2NrZXQgZXh0ZW5kcyBTdHJlYW08UmF3U29ja2V0RXZlbnQ+CiAgICBpbXBsZW1lbnRzIFJhd0RhdGFncmFtU29ja2V0IHsKICBfTmF0aXZlU29ja2V0IF9zb2NrZXQ7CiAgU3RyZWFtQ29udHJvbGxlcjxSYXdTb2NrZXRFdmVudD4gX2NvbnRyb2xsZXI7CiAgYm9vbCBfcmVhZEV2ZW50c0VuYWJsZWQgPSB0cnVlOwogIGJvb2wgX3dyaXRlRXZlbnRzRW5hYmxlZCA9IHRydWU7CgogIF9SYXdEYXRhZ3JhbVNvY2tldCh0aGlzLl9zb2NrZXQpIHsKICAgIHZhciB6b25lID0gWm9uZS5jdXJyZW50OwogICAgX2NvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxSYXdTb2NrZXRFdmVudD4oCiAgICAgICAgc3luYzogdHJ1ZSwKICAgICAgICBvbkxpc3RlbjogX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UsCiAgICAgICAgb25DYW5jZWw6IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlLAogICAgICAgIG9uUGF1c2U6IF9vblBhdXNlU3RhdGVDaGFuZ2UsCiAgICAgICAgb25SZXN1bWU6IF9vblBhdXNlU3RhdGVDaGFuZ2UpOwogICAgX3NvY2tldC5zZXRIYW5kbGVycygKICAgICAgICByZWFkOiAoKSA9PiBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQucmVhZCksCiAgICAgICAgd3JpdGU6ICgpIHsKICAgICAgICAgIC8vIFRoZSB3cml0ZSBldmVudCBoYW5kbGVyIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgYnkgdGhlCiAgICAgICAgICAvLyBldmVudCBoYW5kbGVyIHdoZW4gaXQgZmlyZXMuCiAgICAgICAgICB3cml0ZUV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgIF9jb250cm9sbGVyLmFkZChSYXdTb2NrZXRFdmVudC53cml0ZSk7CiAgICAgICAgfSwKICAgICAgICBjbG9zZWQ6ICgpID0+IF9jb250cm9sbGVyLmFkZChSYXdTb2NrZXRFdmVudC5yZWFkQ2xvc2VkKSwKICAgICAgICBkZXN0cm95ZWQ6ICgpIHsKICAgICAgICAgIF9jb250cm9sbGVyLmFkZChSYXdTb2NrZXRFdmVudC5jbG9zZWQpOwogICAgICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgICB9LAogICAgICAgIGVycm9yOiB6b25lLmJpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZCgoZSkgewogICAgICAgICAgX2NvbnRyb2xsZXIuYWRkRXJyb3IoZSk7CiAgICAgICAgICBfc29ja2V0LmNsb3NlKCk7CiAgICAgICAgfSkpOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxSYXdEYXRhZ3JhbVNvY2tldD4gYmluZCgKICAgICAgaG9zdCwgaW50IHBvcnQsIGJvb2wgcmV1c2VBZGRyZXNzLCBib29sIHJldXNlUG9ydCwgaW50IHR0bCkgewogICAgX3Rocm93T25CYWRQb3J0KHBvcnQpOwogICAgX3Rocm93T25CYWRUdGwodHRsKTsKICAgIHJldHVybiBfTmF0aXZlU29ja2V0LmJpbmREYXRhZ3JhbShob3N0LCBwb3J0LCByZXVzZUFkZHJlc3MsIHJldXNlUG9ydCwgdHRsKQogICAgICAgIC50aGVuKChzb2NrZXQpID0+IG5ldyBfUmF3RGF0YWdyYW1Tb2NrZXQoc29ja2V0KSk7CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb248UmF3U29ja2V0RXZlbnQ+IGxpc3Rlbih2b2lkIG9uRGF0YShSYXdTb2NrZXRFdmVudCBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuc3RyZWFtLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgRnV0dXJlIGNsb3NlKCkgPT4gX3NvY2tldC5jbG9zZSgpLnRoZW48UmF3RGF0YWdyYW1Tb2NrZXQ+KChfKSA9PiB0aGlzKTsKCiAgaW50IHNlbmQoTGlzdDxpbnQ+IGJ1ZmZlciwgSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0KSA9PgogICAgICBfc29ja2V0LnNlbmQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBhZGRyZXNzLCBwb3J0KTsKCiAgRGF0YWdyYW0gcmVjZWl2ZSgpIHsKICAgIHJldHVybiBfc29ja2V0LnJlY2VpdmUoKTsKICB9CgogIHZvaWQgam9pbk11bHRpY2FzdChJbnRlcm5ldEFkZHJlc3MgZ3JvdXAsIFtOZXR3b3JrSW50ZXJmYWNlIGludGVyZmFjZV0pIHsKICAgIF9zb2NrZXQuam9pbk11bHRpY2FzdChncm91cCwgaW50ZXJmYWNlKTsKICB9CgogIHZvaWQgbGVhdmVNdWx0aWNhc3QoSW50ZXJuZXRBZGRyZXNzIGdyb3VwLCBbTmV0d29ya0ludGVyZmFjZSBpbnRlcmZhY2VdKSB7CiAgICBfc29ja2V0LmxlYXZlTXVsdGljYXN0KGdyb3VwLCBpbnRlcmZhY2UpOwogIH0KCiAgYm9vbCBnZXQgcmVhZEV2ZW50c0VuYWJsZWQgPT4gX3JlYWRFdmVudHNFbmFibGVkOwogIHZvaWQgc2V0IHJlYWRFdmVudHNFbmFibGVkKGJvb2wgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSAhPSBfcmVhZEV2ZW50c0VuYWJsZWQpIHsKICAgICAgX3JlYWRFdmVudHNFbmFibGVkID0gdmFsdWU7CiAgICAgIGlmICghX2NvbnRyb2xsZXIuaXNQYXVzZWQpIF9yZXN1bWUoKTsKICAgIH0KICB9CgogIGJvb2wgZ2V0IHdyaXRlRXZlbnRzRW5hYmxlZCA9PiBfd3JpdGVFdmVudHNFbmFibGVkOwogIHZvaWQgc2V0IHdyaXRlRXZlbnRzRW5hYmxlZChib29sIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgIT0gX3dyaXRlRXZlbnRzRW5hYmxlZCkgewogICAgICBfd3JpdGVFdmVudHNFbmFibGVkID0gdmFsdWU7CiAgICAgIGlmICghX2NvbnRyb2xsZXIuaXNQYXVzZWQpIF9yZXN1bWUoKTsKICAgIH0KICB9CgogIGJvb2wgZ2V0IG11bHRpY2FzdExvb3BiYWNrID0+CiAgICAgIF9zb2NrZXQuZ2V0T3B0aW9uKFNvY2tldE9wdGlvbi5faXBNdWx0aWNhc3RMb29wKTsKICB2b2lkIHNldCBtdWx0aWNhc3RMb29wYmFjayhib29sIHZhbHVlKSA9PgogICAgICBfc29ja2V0LnNldE9wdGlvbihTb2NrZXRPcHRpb24uX2lwTXVsdGljYXN0TG9vcCwgdmFsdWUpOwoKICBpbnQgZ2V0IG11bHRpY2FzdEhvcHMgPT4gX3NvY2tldC5nZXRPcHRpb24oU29ja2V0T3B0aW9uLl9pcE11bHRpY2FzdEhvcHMpOwogIHZvaWQgc2V0IG11bHRpY2FzdEhvcHMoaW50IHZhbHVlKSA9PgogICAgICBfc29ja2V0LnNldE9wdGlvbihTb2NrZXRPcHRpb24uX2lwTXVsdGljYXN0SG9wcywgdmFsdWUpOwoKICBOZXR3b3JrSW50ZXJmYWNlIGdldCBtdWx0aWNhc3RJbnRlcmZhY2UgPT4gdGhyb3cgIk5vdCBpbXBsZW1lbnRlZCI7CiAgdm9pZCBzZXQgbXVsdGljYXN0SW50ZXJmYWNlKE5ldHdvcmtJbnRlcmZhY2UgdmFsdWUpID0+CiAgICAgIHRocm93ICJOb3QgaW1wbGVtZW50ZWQiOwoKICBib29sIGdldCBicm9hZGNhc3RFbmFibGVkID0+IF9zb2NrZXQuZ2V0T3B0aW9uKFNvY2tldE9wdGlvbi5faXBCcm9hZGNhc3QpOwogIHZvaWQgc2V0IGJyb2FkY2FzdEVuYWJsZWQoYm9vbCB2YWx1ZSkgPT4KICAgICAgX3NvY2tldC5zZXRPcHRpb24oU29ja2V0T3B0aW9uLl9pcEJyb2FkY2FzdCwgdmFsdWUpOwoKICBpbnQgZ2V0IHBvcnQgPT4gX3NvY2tldC5wb3J0OwoKICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3MgPT4gX3NvY2tldC5hZGRyZXNzOwoKICBfcGF1c2UoKSB7CiAgICBfc29ja2V0LnNldExpc3RlbmluZyhyZWFkOiBmYWxzZSwgd3JpdGU6IGZhbHNlKTsKICB9CgogIHZvaWQgX3Jlc3VtZSgpIHsKICAgIF9zb2NrZXQuc2V0TGlzdGVuaW5nKHJlYWQ6IF9yZWFkRXZlbnRzRW5hYmxlZCwgd3Jp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b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL3NlcnZpY2Vfb2JqZWN0LmRhcnSC6i8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgppbnQgX25leHRTZXJ2aWNlSWQgPSAxOwoKLy8gVE9ETyhham9obnNlbik6IFVzZSBvdGhlciB3YXkgb2YgZ2V0dGluZyBhIHVuaXF1ZSBpZC4KYWJzdHJhY3QgY2xhc3MgX1NlcnZpY2VPYmplY3QgewogIGludCBfX3NlcnZpY2VJZCA9IDA7CiAgaW50IGdldCBfc2VydmljZUlkIHsKICAgIGlmIChfX3NlcnZpY2VJZCA9PSAwKSBfX3NlcnZpY2VJZCA9IF9uZXh0U2VydmljZUlkKys7CiAgICByZXR1cm4gX19zZXJ2aWNlSWQ7CiAgfQoKICBNYXAgX3RvSlNPTihib29sIHJlZik7CgogIFN0cmluZyBnZXQgX3NlcnZpY2VQYXRoID0+ICIkX3NlcnZpY2VUeXBlUGF0aC8kX3NlcnZpY2VJZCI7CgogIFN0cmluZyBnZXQgX3NlcnZpY2VUeXBlUGF0aDsKCiAgU3RyaW5nIGdldCBfc2VydmljZVR5cGVOYW1lOwoKICBTdHJpbmcgX3NlcnZpY2VUeXBlKGJvb2wgcmVmKSB7CiAgICBpZiAocmVmKSByZXR1cm4gIkAkX3NlcnZpY2VUeXBlTmFtZSI7CiAgICByZXR1cm4gX3NlcnZpY2VUeXBlTmFtZTsKICB9Cn0KHwBOTjwBEQEYATkgFxc6GAQBGQE+AR8BHwEiKh0EAgEbZGFydDppby9zZXJ2aWNlX29iamVjdC5kYXJ0OG9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vc2VjdXJlX3NvY2tldF9wYXRjaC5kYXJ0nbEvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29tbW9uX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIFNlY3VyZVNvY2tldCB7CiAgQHBhdGNoCiAgZmFjdG9yeSBTZWN1cmVTb2NrZXQuXyhSYXdTZWN1cmVTb2NrZXQgcmF3U29ja2V0KSA9PgogICAgICBuZXcgX1NlY3VyZVNvY2tldChyYXdTb2NrZXQpOwp9CgpAcGF0Y2gKY2xhc3MgX1NlY3VyZUZpbHRlciB7CiAgQHBhdGNoCiAgZmFjdG9yeSBfU2VjdXJlRmlsdGVyLl8oKSA9PiBuZXcgX1NlY3VyZUZpbHRlckltcGwuXygpOwp9CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBYNTA5Q2VydGlmaWNhdGUgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBmYWN0b3J5IFg1MDlDZXJ0aWZpY2F0ZS5fKCkgPT4gbmV3IF9YNTA5Q2VydGlmaWNhdGVJbXBsLl8oKTsKfQoKY2xhc3MgX1NlY3VyZVNvY2tldCBleHRlbmRzIF9Tb2NrZXQgaW1wbGVtZW50cyBTZWN1cmVTb2NrZXQgewogIF9SYXdTZWN1cmVTb2NrZXQgZ2V0IF9yYXcgPT4gc3VwZXIuX3JhdyBhcyBfUmF3U2VjdXJlU29ja2V0OwoKICBfU2VjdXJlU29ja2V0KFJhd1NlY3VyZVNvY2tldCByYXcpIDogc3VwZXIocmF3KTsKCiAgdm9pZCByZW5lZ290aWF0ZSgKICAgICAge2Jvb2wgdXNlU2Vzc2lvbkNhY2hlOiB0cnVlLAogICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiBmYWxzZX0pIHsKICAgIF9yYXcucmVuZWdvdGlhdGUoCiAgICAgICAgdXNlU2Vzc2lvbkNhY2hlOiB1c2VTZXNzaW9uQ2FjaGUsCiAgICAgICAgcmVxdWVzdENsaWVudENlcnRpZmljYXRlOiByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUpOwogIH0KCiAgWDUwOUNlcnRpZmljYXRlIGdldCBwZWVyQ2VydGlmaWNhdGUgewogICAgaWYgKF9yYXcgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigicGVlckNlcnRpZmljYXRlIGNhbGxlZCBvbiBkZXN0cm95ZWQgU2VjdXJlU29ja2V0Iik7CiAgICB9CiAgICByZXR1cm4gX3Jhdy5wZWVyQ2VydGlmaWNhdGU7CiAgfQoKICBTdHJpbmcgZ2V0IHNlbGVjdGVkUHJvdG9jb2wgewogICAgaWYgKF9yYXcgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigic2VsZWN0ZWRQcm90b2NvbCBjYWxsZWQgb24gZGVzdHJveWVkIFNlY3VyZVNvY2tldCIpOwogICAgfQogICAgcmV0dXJuIF9yYXcuc2VsZWN0ZWRQcm90b2NvbDsKICB9Cn0KCi8qKgogKiBfU2VjdXJlRmlsdGVySW1wbCB3cmFwcyBhIGZpbHRlciB0aGF0IGVuY3J5cHRzIGFuZCBkZWNyeXB0cyBkYXRhIHRyYXZlbGxpbmcKICogb3ZlciBhbiBlbmNyeXB0ZWQgc29ja2V0LiAgVGhlIGZpbHRlciBhbHNvIGhhbmRsZXMgdGhlIGhhbmRzaGFraW5nCiAqIGFuZCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24uCiAqCiAqIFRoZSBmaWx0ZXIgZXhwb3NlcyBpdHMgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFzIERhcnQgb2JqZWN0cyB0aGF0CiAqIGFyZSBiYWNrZWQgYnkgYW4gZXh0ZXJuYWwgQyBhcnJheSBvZiBieXRlcywgc28gdGhhdCBib3RoIERhcnQgY29kZSBhbmQKICogbmF0aXZlIGNvZGUgY2FuIGFjY2VzcyB0aGUgc2FtZSBkYXRhLgogKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfU2VjdXJlRmlsdGVySW1wbCBleHRlbmRzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMQogICAgaW1wbGVtZW50cyBfU2VjdXJlRmlsdGVyIHsKICAvLyBQZXJmb3JtYW5jZSBpcyBpbXByb3ZlZCBpZiBhIGZ1bGwgYnVmZmVyIG9mIHBsYWludGV4dCBmaXRzCiAgLy8gaW4gdGhlIGVuY3J5cHRlZCBidWZmZXIsIHdoZW4gZW5jcnlwdGVkLgogIC8vIFNJWkUgYW5kIEVOQ1JZUFRFRF9TSVpFIGFyZSByZWZlcmVuY2VkIGZyb20gQysrLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBzdGF0aWMgZmluYWwgaW50IFNJWkUgPSA4ICogMTAyNDsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgc3RhdGljIGZpbmFsIGludCBFTkNSWVBURURfU0laRSA9IDEwICogMTAyNDsKCiAgX1NlY3VyZUZpbHRlckltcGwuXygpIHsKICAgIGJ1ZmZlcnMgPSBuZXcgTGlzdDxfRXh0ZXJuYWxCdWZmZXI+KF9SYXdTZWN1cmVTb2NrZXQuYnVmZmVyQ291bnQpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfUmF3U2VjdXJlU29ja2V0LmJ1ZmZlckNvdW50OyArK2kpIHsKICAgICAgYnVmZmVyc1tpXSA9IG5ldyBfRXh0ZXJuYWxCdWZmZXIoCiAgICAgICAgICBfUmF3U2VjdXJlU29ja2V0Ll9pc0J1ZmZlckVuY3J5cHRlZChpKSA/IEVOQ1JZUFRFRF9TSVpFIDogU0laRSk7CiAgICB9CiAgfQoKICB2b2lkIGNvbm5lY3QoCiAgICAgIFN0cmluZyBob3N0TmFtZSwKICAgICAgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgIGJvb2wgaXNfc2VydmVyLAogICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgYm9vbCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsCiAgICAgIFVpbnQ4TGlzdCBwcm90b2NvbHMpIG5hdGl2ZSAiU2VjdXJlU29ja2V0X0Nvbm5lY3QiOwoKICB2b2lkIGRlc3Ryb3koKSB7CiAgICBidWZmZXJzID0gbnVsbDsKICAgIF9kZXN0cm95KCk7CiAgfQoKICB2b2lkIF9kZXN0cm95KCkgbmF0aXZlICJTZWN1cmVTb2NrZXRfRGVzdHJveSI7CgogIHZvaWQgaGFuZHNoYWtlKCkgbmF0aXZlICJTZWN1cmVTb2NrZXRfSGFuZHNoYWtlIjsKCiAgdm9pZCByZWhhbmRzaGFrZSgpID0+IHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKCiAgaW50IHByb2Nlc3NCdWZmZXIoaW50IGJ1ZmZlckluZGV4KSA9PiB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CgogIFN0cmluZyBzZWxlY3RlZFByb3RvY29sKCkgbmF0aXZlICJTZWN1cmVTb2NrZXRfR2V0U2VsZWN0ZWRQcm90b2NvbCI7CgogIHZvaWQgcmVuZWdvdGlhdGUoYm9vbCB1c2VTZXNzaW9uQ2FjaGUsIGJvb2wgcmVxdWVzdENsaWVudENlcnRpZmljYXRlLAogICAgICBib29sIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSkgbmF0aXZlICJTZWN1cmVTb2NrZXRfUmVuZWdvdGlhdGUiOwoKICB2b2lkIGluaXQoKSBuYXRpdmUgIlNlY3VyZVNvY2tldF9Jbml0IjsKCiAgWDUwOUNlcnRpZmljYXRlIGdldCBwZWVyQ2VydGlmaWNhdGUgbmF0aXZlICJTZWN1cmVTb2NrZXRfUGVlckNlcnRpZmljYXRlIjsKCiAgdm9pZCByZWdpc3RlckJhZENlcnRpZmljYXRlQ2FsbGJhY2soRnVuY3Rpb24gY2FsbGJhY2spCiAgICAgIG5hdGl2ZSAiU2VjdXJlU29ja2V0X1JlZ2lzdGVyQmFkQ2VydGlmaWNhdGVDYWxsYmFjayI7CgogIHZvaWQgcmVnaXN0ZXJIYW5kc2hha2VDb21wbGV0ZUNhbGxiYWNrKEZ1bmN0aW9uIGhhbmRzaGFrZUNvbXBsZXRlSGFuZGxlcikKICAgICAgbmF0aXZlICJTZWN1cmVTb2NrZXRfUmVnaXN0ZXJIYW5kc2hha2VDb21wbGV0ZUNhbGxiYWNrIjsKCiAgLy8gVGhpcyBpcyBhIHNlY3VyaXR5IGlzc3VlLCBhcyBpdCBleHBvc2VzIGEgcmF3IHBvaW50ZXIgdG8gRGFydCBjb2RlLgogIGludCBfcG9pbnRlcigpIG5hdGl2ZSAiU2VjdXJlU29ja2V0X0ZpbHRlclBvaW50ZXIiOwoKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJnZXQiKQogIExpc3Q8X0V4dGVybmFsQnVmZmVyPiBidWZmZXJzOwp9CgpAcGF0Y2gKY2xhc3MgU2VjdXJpdHlDb250ZXh0IHsKICBAcGF0Y2gKICBmYWN0b3J5IFNlY3VyaXR5Q29udGV4dCh7Ym9vbCB3aXRoVHJ1c3RlZFJvb3RzOiBmYWxzZX0pIHsKICAgIHJldHVybiBuZXcgX1NlY3VyaXR5Q29udGV4dCh3aXRoVHJ1c3RlZFJvb3RzKTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBTZWN1cml0eUNvbnRleHQgZ2V0IGRlZmF1bHRDb250ZXh0IHsKICAgIHJldHVybiBfU2VjdXJpdHlDb250ZXh0LmRlZmF1bHRDb250ZXh0OwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIGJvb2wgZ2V0IGFscG5TdXBwb3J0ZWQgPT4gdHJ1ZTsKfQoKY2xhc3MgX1NlY3VyaXR5Q29udGV4dCBleHRlbmRzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMQogICAgaW1wbGVtZW50cyBTZWN1cml0eUNvbnRleHQgewogIF9TZWN1cml0eUNvbnRleHQoYm9vbCB3aXRoVHJ1c3RlZFJvb3RzKSB7CiAgICBfY3JlYXRlTmF0aXZlQ29udGV4dCgpOwogICAgaWYgKHdpdGhUcnVzdGVkUm9vdHMpIHsKICAgICAgX3RydXN0QnVpbHRpblJvb3RzKCk7CiAgICB9CiAgfQoKICB2b2lkIF9jcmVhdGVOYXRpdmVDb250ZXh0KCkgbmF0aXZlICJTZWN1cml0eUNvbnRleHRfQWxsb2NhdGUiOwoKICBzdGF0aWMgZmluYWwgU2VjdXJpdHlDb250ZXh0IGRlZmF1bHRDb250ZXh0ID0gbmV3IF9TZWN1cml0eUNvbnRleHQodHJ1ZSk7CgogIHZvaWQgdXNlUHJpdmF0ZUtleShTdHJpbmcgZmlsZSwge1N0cmluZyBwYXNzd29yZH0pIHsKICAgIExpc3Q8aW50PiBieXRlcyA9IChuZXcgRmlsZShmaWxlKSkucmVhZEFzQnl0ZXNTeW5jKCk7CiAgICB1c2VQcml2YXRlS2V5Qnl0ZXMoYnl0ZXMsIHBhc3N3b3JkOiBwYXNzd29yZCk7CiAgfQoKICB2b2lkIHVzZVByaXZhdGVLZXlCeXRlcyhMaXN0PGludD4ga2V5Qnl0ZXMsIHtTdHJpbmcgcGFzc3dvcmR9KQogICAgICBuYXRpdmUgIlNlY3VyaXR5Q29udGV4dF9Vc2VQcml2YXRlS2V5Qnl0ZXMiOwoKICB2b2lkIHNldFRydXN0ZWRDZXJ0aWZpY2F0ZXMoU3RyaW5nIGZpbGUsIHtTdHJpbmcgcGFzc3dvcmR9KSB7CiAgICBMaXN0PGludD4gYnl0ZXMgPSAobmV3IEZpbGUoZmlsZSkpLnJlYWRBc0J5dGVzU3luYygpOwogICAgc2V0VHJ1c3RlZENlcnRpZmljYXRlc0J5dGVzKGJ5dGVzLCBwYXNzd29yZDogcGFzc3dvcmQpOwogIH0KCiAgdm9pZCBzZXRUcnVzdGVkQ2VydGlmaWNhdGVzQnl0ZXMoTGlzdDxpbnQ+IGNlcnRCeXRlcywge1N0cmluZyBwYXNzd29yZH0pCiAgICAgIG5hdGl2ZSAiU2VjdXJpdHlDb250ZXh0X1NldFRydXN0ZWRDZXJ0aWZpY2F0ZXNCeXRlcyI7CgogIHZvaWQgdXNlQ2VydGlmaWNhdGVDaGFpbihTdHJpbmcgZmlsZSwge1N0cmluZyBwYXNzd29yZH0pIHsKICAgIExpc3Q8aW50PiBieXRlcyA9IChuZXcgRmlsZShmaWxlKSkucmVhZEFzQnl0ZXNTeW5jKCk7CiAgICB1c2VDZXJ0aWZpY2F0ZUNoYWluQnl0ZXMoYnl0ZXMsIHBhc3N3b3JkOiBwYXNzd29yZCk7CiAgfQoKICB2b2lkIHVzZUNlcnRpZmljYXRlQ2hhaW5CeXRlcyhMaXN0PGludD4gY2hhaW5CeXRlcywge1N0cmluZyBwYXNzd29yZH0pCiAgICAgIG5hdGl2ZSAiU2VjdXJpdHlDb250ZXh0X1VzZUNlcnRpZmljYXRlQ2hhaW5CeXRlcyI7CgogIHZvaWQgc2V0Q2xpZW50QXV0aG9yaXRpZXMoU3RyaW5nIGZpbGUsIHtTdHJpbmcgcGFzc3dvcmR9KSB7CiAgICBMaXN0PGludD4gYnl0ZXMgPSAobmV3IEZpbGUoZmlsZSkpLnJlYWRBc0J5dGVzU3luYygpOwogICAgc2V0Q2xpZW50QXV0aG9yaXRpZXNCeXRlcyhieXRlcywgcGFzc3dvcmQ6IHBhc3N3b3JkKTsKICB9CgogIHZvaWQgc2V0Q2xpZW50QXV0aG9yaXRpZXNCeXRlcyhMaXN0PGludD4gYXV0aENlcnRCeXRlcywge1N0cmluZyBwYXNzd29yZH0pCiAgICAgIG5hdGl2ZSAiU2VjdXJpdHlDb250ZXh0X1NldENsaWVudEF1dGhvcml0aWVzQnl0ZXMiOwoKICB2b2lkIHNldEFscG5Qcm90b2NvbHMoTGlzdDxTdHJpbmc+IHByb3RvY29scywgYm9vbCBpc1NlcnZlcikgewogICAgVWludDhMaXN0IGVuY29kZWRQcm90b2NvbHMgPQogICAgICAgIFNlY3VyaXR5Q29udGV4dC5fcHJvdG9jb2xzVG9MZW5ndGhFbmNvZGluZyhwcm90b2NvbHMpOwogICAgX3NldEFscG5Qcm90b2NvbHMoZW5jb2RlZFByb3RvY29scywgaXNTZXJ2ZXIpOwogIH0KCiAgdm9pZCBfc2V0QWxwblByb3RvY29scyhVaW50OExpc3QgcHJvdG9jb2xzLCBib29sIGlzU2VydmVyKQogICAgICBuYXRpdmUgIlNlY3VyaXR5Q29udGV4dF9TZXRBbHBuUHJvdG9jb2xzIjsKICB2b2lkIF90cnVzdEJ1aWx0aW5Sb290cygpIG5hdGl2ZSAiU2VjdXJpdHlDb250ZXh0X1RydXN0QnVpbHRpblJvb3RzIjsKfQoKLyoqCiAqIF9YNTA5Q2VydGlmaWNhdGVJbXBsIHdyYXBzIGFuIFg1MDkgY2VydGlmaWNhdGUgb2JqZWN0IGhlbGQgYnkgdGhlIEJvcmluZ1NTTAogKiBsaWJyYXJ5LiBJdCBleHBvc2VzIHRoZSBmaWVsZHMgb2YgdGhlIGNlcnRpZmljYXRlIG9iamVjdC4KICovCmNsYXNzIF9YNTA5Q2VydGlmaWNhdGVJbXBsIGV4dGVuZHMgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3MxCiAgICBpbXBsZW1lbnRzIFg1MDlDZXJ0aWZpY2F0ZSB7CiAgLy8gVGhlIG5hdGl2ZSBmaWVsZCBtdXN0IGJlIHNldCBtYW51YWxseSBvbiBhIG5ldyBvYmplY3QsIGluIG5hdGl2ZSBjb2RlLgogIC8vIFRoaXMgaXMgZG9uZSBieSBXcmFwcGVkWDUwOSBpbiBzZWN1cmVfc29ja2V0LmNjLgogIF9YNTA5Q2VydGlmaWNhdGVJbXBsLl8oKTsKCiAgVWludDhMaXN0IF9jYWNoZWREZXI7CiAgVWludDhMaXN0IGdldCBfZGVyIG5hdGl2ZSAiWDUwOV9EZXIiOwogIFVpbnQ4TGlzdCBnZXQgZGVyIHsKICAgIGlmIChfY2FjaGVkRGVyID09IG51bGwpIHsKICAgICAgX2NhY2hlZERlciA9IF9kZXI7CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZERlcjsKICB9CgogIFN0cmluZyBfY2FjaGVkUGVtOwogIFN0cmluZyBnZXQgX3BlbSBuYXRpdmUgIlg1MDlfUGVtIjsKICBTdHJpbmcgZ2V0IHBlbSB7CiAgICBpZiAoX2NhY2hlZFBlbSA9PSBudWxsKSB7CiAgICAgIF9jYWNoZWRQZW0gPSBfcGVtOwogICAgfQogICAgcmV0dXJuIF9jYWNoZWRQZW07CiAgfQoKICBVaW50OExpc3QgX2NhY2hlZFNoYTE7CiAgVWludDhMaXN0IGdldCBfc2hhMSBuYXRpdmUgIlg1MDlfU2hhMSI7CiAgVWludDhMaXN0IGdldCBzaGExIHsKICAgIGlmIChfY2FjaGVkU2hhMSA9PSBudWxsKSB7CiAgICAgIF9jYWNoZWRTaGExID0gX3NoYTE7CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZFNoYTE7CiAgfQoKICBTdHJpbmcgZ2V0IHN1YmplY3QgbmF0aXZlICJYNTA5X1N1YmplY3QiOwogIFN0cmluZyBnZXQgaXNzdWVyIG5hdGl2ZSAiWDUwOV9Jc3N1ZXIiOwogIERhdGVUaW1lIGdldCBzdGFydFZhbGlkaXR5IHsKICAgIHJldHVybiBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2goX3N0YXJ0VmFsaWRpdHkoKSwKICAgICAgICBpc1V0YzogdHJ1ZSk7CiAgfQoKICBEYXRlVGltZSBnZXQgZW5kVmFsaWRpdHkgewogICAgcmV0dXJuIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChfZW5kVmFsaWRpdHkoKSwgaXNVdGM6IHRydWUpOwogIH0KCiAgaW50IF9zdGFydFZhbGlkaXR5KCkgbmF0aXZlICJYNTA5X1N0YXJ0VmFsaWRpdHkiOwogIGludCBfZW5kVmFsaWRpdHkoKSBuYXRpdmUgIlg1MDlfRW5kVmFsaWRpdHkiOwp9CoD9AE5OPAEgAQcVCTckAgEHFgk6AgEHGhgJHD8CAT4/ATMBFCMsLxYqPD0EASgYUAYhBAEgGFEGIgQCAQRPRiEDSEopBBo5H0AuNhwkHC8BGkc9KEsGBAEQFx8WJSU6ARMUEAQBMQE0ATgBSAFHAUhIASoBTQE5PAFMPwFJNgEjIQIBBxgJPDMEAQkuLAQBCSkCATghLBwcHAYEAUEBTAE3OjMEAUEzAUA6PAQBSzwBPTo5BAFJOQE+OjoEAU06AUEhPzMEAT0xSAIBBE89BDwhTDYcARgoFh4ZBhcEARUlEx4ZBhcEARkqFx8bBhgEASwqH0UWBAEdUQQBNDACASZkYXJ0OmlvLXBhdGNoL3NlY3VyZV9zb2NrZXRfcGF0Y2guZGFydDZvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvYmluL3N5bmNfc29ja2V0X3BhdGNoLmRhcnSm4i8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb21tb25fcGF0Y2guZGFydCI7CgpAcGF0Y2gKY2xhc3MgUmF3U3luY2hyb25vdXNTb2NrZXQgewogIEBwYXRjaAogIHN0YXRpYyBSYXdTeW5jaHJvbm91c1NvY2tldCBjb25uZWN0U3luYyhob3N0LCBpbnQgcG9ydCkgewogICAgcmV0dXJuIF9SYXdTeW5jaHJvbm91c1NvY2tldC5jb25uZWN0U3luYyhob3N0LCBwb3J0KTsKICB9Cn0KCmNsYXNzIF9SYXdTeW5jaHJvbm91c1NvY2tldCBpbXBsZW1lbnRzIFJhd1N5bmNocm9ub3VzU29ja2V0IHsKICBmaW5hbCBfTmF0aXZlU3luY2hyb25vdXNTb2NrZXQgX3NvY2tldDsKCiAgX1Jhd1N5bmNocm9ub3VzU29ja2V0KHRoaXMuX3NvY2tldCk7CgogIHN0YXRpYyBSYXdTeW5jaHJvbm91c1NvY2tldCBjb25uZWN0U3luYyhob3N0LCBpbnQgcG9ydCkgewogICAgX3Rocm93T25CYWRQb3J0KHBvcnQpOwogICAgcmV0dXJuIG5ldyBfUmF3U3luY2hyb25vdXNTb2NrZXQoCiAgICAgICAgX05hdGl2ZVN5bmNocm9ub3VzU29ja2V0LmNvbm5lY3RTeW5jKGhvc3QsIHBvcnQpKTsKICB9CgogIEludGVybmV0QWRkcmVzcyBnZXQgYWRkcmVzcyA9PiBfc29ja2V0LmFkZHJlc3M7CiAgaW50IGdldCBwb3J0ID0+IF9zb2NrZXQucG9ydDsKICBJbnRlcm5ldEFkZHJlc3MgZ2V0IHJlbW90ZUFkZHJlc3MgPT4gX3NvY2tldC5yZW1vdGVBZGRyZXNzOwogIGludCBnZXQgcmVtb3RlUG9ydCA9PiBfc29ja2V0LnJlbW90ZVBvcnQ7CgogIGludCBhdmFpbGFibGUoKSA9PiBfc29ja2V0LmF2YWlsYWJsZTsKCiAgdm9pZCBjbG9zZVN5bmMoKSA9PiBfc29ja2V0LmNsb3NlU3luYygpOwoKICBpbnQgcmVhZEludG9TeW5jKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgPT4KICAgICAgX3NvY2tldC5yZWFkSW50b1N5bmMoYnVmZmVyLCBzdGFydCwgZW5kKTsKCiAgTGlzdDxpbnQ+IHJlYWRTeW5jKGludCBieXRlcykgPT4gX3NvY2tldC5yZWFkU3luYyhieXRlcyk7CgogIHZvaWQgc2h1dGRvd24oU29ja2V0RGlyZWN0aW9uIGRpcmVjdGlvbikgPT4gX3NvY2tldC5zaHV0ZG93bihkaXJlY3Rpb24pOwoKICB2b2lkIHdyaXRlRnJvbVN5bmMoTGlzdDxpbnQ+IGJ1ZmZlciwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSA9PgogICAgICBfc29ja2V0LndyaXRlRnJvbVN5bmMoYnVmZmVyLCBzdGFydCwgZW5kKTsKfQoKLy8gVGhlIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMSBjYW4gbm90IGJlIHVzZWQgd2l0aCBhIG1peGluLCBkdWUgdG8gbWlzc2luZwovLyBpbXBsaWNpdCBjb25zdHJ1Y3Rvci4KY2xhc3MgX05hdGl2ZVN5bmNocm9ub3VzU29ja2V0TmF0aXZlV3JhcHBlciBleHRlbmRzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMSB7fQoKLy8gVGhlIF9OYXRpdmVTeW5jaHJvbm91c1NvY2tldCBjbGFzcyBlbmNhcHN1bGF0ZXMgYSBzeW5jaHJvbm91cyBPUyBzb2NrZXQuCmNsYXNzIF9OYXRpdmVTeW5jaHJvbm91c1NvY2tldCBleHRlbmRzIF9OYXRpdmVTeW5jaHJvbm91c1NvY2tldE5hdGl2ZVdyYXBwZXIgewogIC8vIFNvY2tldCBjbG9zZSBzdGF0ZS4KICBib29sIGlzQ2xvc2VkID0gZmFsc2U7CiAgYm9vbCBpc0Nsb3NlZFJlYWQgPSBmYWxzZTsKICBib29sIGlzQ2xvc2VkV3JpdGUgPSBmYWxzZTsKCiAgLy8gSG9sZHMgdGhlIGFkZHJlc3MgdXNlZCB0byBjb25uZWN0IHRoZSBzb2NrZXQuCiAgSW50ZXJuZXRBZGRyZXNzIGxvY2FsQWRkcmVzczsKCiAgLy8gSG9sZHMgdGhlIHBvcnQgb2YgdGhlIHNvY2tldCwgMCBpZiBub3Qga25vd24uCiAgaW50IGxvY2FsUG9ydCA9IDA7CgogIF9SZWFkV3JpdGVSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvOwoKICBzdGF0aWMgX05hdGl2ZVN5bmNocm9ub3VzU29ja2V0IGNvbm5lY3RTeW5jKGhvc3QsIGludCBwb3J0KSB7CiAgICBpZiAoaG9zdCA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJQYXJhbWV0ZXIgaG9zdCBjYW5ub3QgYmUgbnVsbCIpOwogICAgfQogICAgTGlzdDxfSW50ZXJuZXRBZGRyZXNzPiBhZGRyZXNzZXMgPSBudWxsOwogICAgdmFyIGVycm9yID0gbnVsbDsKICAgIGlmIChob3N0IGlzIF9JbnRlcm5ldEFkZHJlc3MpIHsKICAgICAgYWRkcmVzc2VzID0gW2hvc3RdOwogICAgfSBlbHNlIHsKICAgICAgdHJ5IHsKICAgICAgICBhZGRyZXNzZXMgPSBsb29rdXAoaG9zdCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBlcnJvciA9IGU7CiAgICAgIH0KICAgICAgaWYgKGVycm9yICE9IG51bGwgfHwgYWRkcmVzc2VzID09IG51bGwgfHwgYWRkcmVzc2VzLmlzRW1wdHkpIHsKICAgICAgICB0aHJvdyBjcmVhdGVFcnJvcihlcnJvciwgIkZhaWxlZCBob3N0IGxvb2t1cDogJyRob3N0JyIpOwogICAgICB9CiAgICB9CiAgICBhc3NlcnQoYWRkcmVzc2VzIGlzIExpc3QpOwogICAgdmFyIGl0ID0gYWRkcmVzc2VzLml0ZXJhdG9yOwogICAgX05hdGl2ZVN5bmNocm9ub3VzU29ja2V0IGNvbm5lY3ROZXh0KCkgewogICAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHsKICAgICAgICAvLyBDb3VsZCBub3QgY29ubmVjdC4gVGhyb3cgdGhlIGZpcnN0IGNvbm5lY3Rpb24gZXJyb3Igd2UgZW5jb3VudGVyZWQuCiAgICAgICAgYXNzZXJ0KGVycm9yICE9IG51bGwpOwogICAgICAgIHRocm93IGVycm9yOwogICAgICB9CiAgICAgIHZhciBhZGRyZXNzID0gaXQuY3VycmVudDsKICAgICAgdmFyIHNvY2tldCA9IG5ldyBfTmF0aXZlU3luY2hyb25vdXNTb2NrZXQoKTsKICAgICAgc29ja2V0LmxvY2FsQWRkcmVzcyA9IGFkZHJlc3M7CiAgICAgIHZhciByZXN1bHQgPSBzb2NrZXQuX25hdGl2ZUNyZWF0ZUNvbm5lY3RTeW5jKGFkZHJlc3MuX2luX2FkZHIsIHBvcnQpOwogICAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgICAvLyBLZWVwIGZpcnN0IGVycm9yLCBpZiBwcmVzZW50LgogICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7CiAgICAgICAgICBlcnJvciA9IGNyZWF0ZUVycm9yKHJlc3VsdCwgIkNvbm5lY3Rpb24gZmFpbGVkIiwgYWRkcmVzcywgcG9ydCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb25uZWN0TmV4dCgpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFF1ZXJ5IHRoZSBsb2NhbCBwb3J0LCBmb3IgZXJyb3IgbWVzc2FnZXMuCiAgICAgICAgdHJ5IHsKICAgICAgICAgIHNvY2tldC5wb3J0OwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7CiAgICAgICAgICAgIGVycm9yID0gY3JlYXRlRXJyb3IoZSwgIkNvbm5lY3Rpb24gZmFpbGVkIiwgYWRkcmVzcywgcG9ydCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gY29ubmVjdE5leHQoKTsKICAgICAgICB9CiAgICAgICAgc2V0dXBSZXNvdXJjZUluZm8oc29ja2V0KTsKICAgICAgfQogICAgICByZXR1cm4gc29ja2V0OwogICAgfQoKICAgIHJldHVybiBjb25uZWN0TmV4dCgpOwogIH0KCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzID0+IGxvY2FsQWRkcmVzczsKICBpbnQgZ2V0IGF2YWlsYWJsZSA9PiBfbmF0aXZlQXZhaWxhYmxlKCk7CgogIGludCBnZXQgcG9ydCB7CiAgICBpZiAobG9jYWxQb3J0ICE9IDApIHsKICAgICAgcmV0dXJuIGxvY2FsUG9ydDsKICAgIH0KICAgIGlmIChpc0Nsb3NlZCkgewogICAgICB0aHJvdyBjb25zdCBTb2NrZXRFeGNlcHRpb24uY2xvc2VkKCk7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX25hdGl2ZUdldFBvcnQoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gbG9jYWxQb3J0ID0gcmVzdWx0OwogIH0KCiAgSW50ZXJuZXRBZGRyZXNzIGdldCByZW1vdGVBZGRyZXNzIHsKICAgIGlmIChpc0Nsb3NlZCkgewogICAgICB0aHJvdyBjb25zdCBTb2NrZXRFeGNlcHRpb24uY2xvc2VkKCk7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX25hdGl2ZUdldFJlbW90ZVBlZXIoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyByZXN1bHQ7CiAgICB9CiAgICB2YXIgYWRkciA9IHJlc3VsdFswXTsKICAgIHJldHVybiBuZXcgX0ludGVybmV0QWRkcmVzcyhhZGRyWzFdLCBudWxsLCBhZGRyWzJdKTsKICB9CgogIGludCBnZXQgcmVtb3RlUG9ydCB7CiAgICBpZiAoaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgY29uc3QgU29ja2V0RXhjZXB0aW9uLmNsb3NlZCgpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9uYXRpdmVHZXRSZW1vdGVQZWVyKCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdFsxXTsKICB9CgogIHZvaWQgY2xvc2VTeW5jKCkgewogICAgaWYgKCFpc0Nsb3NlZCkgewogICAgICBfbmF0aXZlQ2xvc2VTeW5jKCk7CiAgICAgIF9Tb2NrZXRSZXNvdXJjZUluZm8uU29ja2V0Q2xvc2VkKHJlc291cmNlSW5mbyk7CiAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKICAgIH0KICB9CgogIC8vIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgZXJyb3IvZXhjZXB0aW9uIGZyb20gZGlmZmVyZW50IHJldHVybmVkCiAgLy8gZXJyb3Igb2JqZWN0cy4KICBzdGF0aWMgY3JlYXRlRXJyb3IoZXJyb3IsIFN0cmluZyBtZXNzYWdlLAogICAgICBbSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0XSkgewogICAgaWYgKGVycm9yIGlzIE9TRXJyb3IpIHsKICAgICAgcmV0dXJuIG5ldyBTb2NrZXRFeGNlcHRpb24obWVzc2FnZSwKICAgICAgICAgIG9zRXJyb3I6IGVycm9yLCBhZGRyZXNzOiBhZGRyZXNzLCBwb3J0OiBwb3J0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgU29ja2V0RXhjZXB0aW9uKG1lc3NhZ2UsIGFkZHJlc3M6IGFkZHJlc3MsIHBvcnQ6IHBvcnQpOwogICAgfQogIH0KCiAgc3RhdGljIExpc3Q8X0ludGVybmV0QWRkcmVzcz4gbG9va3VwKFN0cmluZyBob3N0LAogICAgICB7SW50ZXJuZXRBZGRyZXNzVHlwZSB0eXBlOiBJbnRlcm5ldEFkZHJlc3NUeXBlLkFOWX0pIHsKICAgIHZhciByZXNwb25zZSA9IF9uYXRpdmVMb29rdXBSZXF1ZXN0KGhvc3QsIHR5cGUuX3ZhbHVlKTsKICAgIGlmIChyZXNwb25zZSBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IHJlc3BvbnNlOwogICAgfQogICAgTGlzdDxfSW50ZXJuZXRBZGRyZXNzPiBhZGRyZXNzZXMgPQogICAgICAgIG5ldyBMaXN0PF9JbnRlcm5ldEFkZHJlc3M+KHJlc3BvbnNlLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3BvbnNlLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciByZXN1bHQgPSByZXNwb25zZVtpXTsKICAgICAgYWRkcmVzc2VzW2ldID0gbmV3IF9JbnRlcm5ldEFkZHJlc3MocmVzdWx0WzFdLCBob3N0LCByZXN1bHRbMl0pOwogICAgfQogICAgcmV0dXJuIGFkZHJlc3NlczsKICB9CgogIGludCByZWFkSW50b1N5bmMoTGlzdDxpbnQ+IGJ1ZmZlciwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIGlmIChpc0Nsb3NlZFJlYWQpIHsKICAgICAgdGhyb3cgbmV3IFNvY2tldEV4Y2VwdGlvbigiU29ja2V0IGlzIGNsb3NlZCBmb3IgcmVhZGluZyIpOwogICAgfQoKICAgIGlmICgoYnVmZmVyIGlzISBMaXN0KSB8fAogICAgICAgICgoc3RhcnQgIT0gbnVsbCkgJiYgKHN0YXJ0IGlzISBpbnQpKSB8fAogICAgICAgICgoZW5kICE9IG51bGwpICYmIChlbmQgaXMhIGludCkpKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyB0byByZWFkSW50b1N5bmMiKTsKICAgIH0KICAgIGlmIChzdGFydCA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJzdGFydCBjYW5ub3QgYmUgbnVsbCIpOwogICAgfQogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgYnVmZmVyLmxlbmd0aCk7CiAgICBpZiAoZW5kID09IHN0YXJ0KSB7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9uYXRpdmVSZWFkSW50byhidWZmZXIsIHN0YXJ0LCAoZW5kIC0gc3RhcnQpKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCJyZWFkSW50b1N5bmMgZmFpbGVkIiwgb3NFcnJvcjogcmVzdWx0KTsKICAgIH0KICAgIHJlc291cmNlSW5mby5hZGRSZWFkKHJlc3VsdCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTGlzdDxpbnQ+IHJlYWRTeW5jKGludCBsZW4pIHsKICAgIF9jaGVja0F2YWlsYWJsZSgpOwogICAgaWYgKGlzQ2xvc2VkUmVhZCkgewogICAgICB0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCJTb2NrZXQgaXMgY2xvc2VkIGZvciByZWFkaW5nIik7CiAgICB9CgogICAgaWYgKChsZW4gIT0gbnVsbCkgJiYgKGxlbiA8IDApKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJJbGxlZ2FsIGxlbmd0aCAkbGVuIik7CiAgICB9CiAgICBpZiAobGVuID09IDApIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX25hdGl2ZVJlYWQobGVuKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyByZXN1bHQ7CiAgICB9CiAgICBhc3NlcnQocmVzb3VyY2VJbmZvICE9IG51bGwpOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgIGlmIChyZXNvdXJjZUluZm8gIT0gbnVsbCkgewogICAgICAgIHJlc291cmNlSW5mby50b3RhbFJlYWQgKz0gcmVzdWx0Lmxlbmd0aDsKICAgICAgfQogICAgfQogICAgaWYgKHJlc291cmNlSW5mbyAhPSBudWxsKSB7CiAgICAgIHJlc291cmNlSW5mby5kaWRSZWFkKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIHZvaWQgc2V0dXBSZXNvdXJjZUluZm8oX05hdGl2ZVN5bmNocm9ub3VzU29ja2V0IHNvY2tldCkgewogICAgc29ja2V0LnJlc291cmNlSW5mbyA9IG5ldyBfU29ja2V0UmVzb3VyY2VJbmZvKHNvY2tldCk7CiAgfQoKICB2b2lkIHNodXRkb3duKFNvY2tldERpcmVjdGlvbiBkaXJlY3Rpb24pIHsKICAgIGlmIChpc0Nsb3NlZCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBzd2l0Y2ggKGRpcmVjdGlvbikgewogICAgICBjYXNlIFNvY2tldERpcmVjdGlvbi5yZWNlaXZlOgogICAgICAgIHNodXRkb3duUmVhZCgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFNvY2tldERpcmVjdGlvbi5zZW5kOgogICAgICAgIHNodXRkb3duV3JpdGUoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTb2NrZXREaXJlY3Rpb24uYm90aDoKICAgICAgICBjbG9zZVN5bmMoKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihkaXJlY3Rpb24pOwogICAgfQogIH0KCiAgdm9pZCBzaHV0ZG93blJlYWQoKSB7CiAgICBpZiAoaXNDbG9zZWQgfHwgaXNDbG9zZWRSZWFkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpc0Nsb3NlZFdyaXRlKSB7CiAgICAgIGNsb3NlU3luYygpOwogICAgfSBlbHNlIHsKICAgICAgX25hdGl2ZVNodXRkb3duUmVhZCgpOwogICAgfQogICAgaXNDbG9zZWRSZWFkID0gdHJ1ZTsKICB9CgogIHZvaWQgc2h1dGRvd25Xcml0ZSgpIHsKICAgIGlmIChpc0Nsb3NlZCB8fCBpc0Nsb3NlZFdyaXRlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpc0Nsb3NlZFJlYWQpIHsKICAgICAgY2xvc2VTeW5jKCk7CiAgICB9IGVsc2UgewogICAgICBfbmF0aXZlU2h1dGRvd25Xcml0ZSgpOwogICAgfQogICAgaXNDbG9zZWRXcml0ZSA9IHRydWU7CiAgfQoKICB2b2lkIHdyaXRlRnJvbVN5bmMoTGlzdDxpbnQ+IGJ1ZmZlciwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIGlmIChpc0Nsb3NlZFdyaXRlKSB7CiAgICAgIHRocm93IG5ldyBTb2NrZXRFeGNlcHRpb24oIlNvY2tldCBpcyBjbG9zZWQgZm9yIHdyaXRpbmciKTsKICAgIH0KICAgIGlmICgoYnVmZmVyIGlzISBMaXN0KSB8fAogICAgICAgICgoc3RhcnQgIT0gbnVsbCkgJiYgKHN0YXJ0IGlzISBpbnQpKSB8fAogICAgICAgICgoZW5kICE9IG51bGwpICYmIChlbmQgaXMhIGludCkpKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyB0byB3cml0ZUZyb21TeW5jIik7CiAgICB9CiAgICBpZiAoc3RhcnQgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigic3RhcnQgY2Fubm90IGJlIGVxdWFsIHRvIG51bGwiKTsKICAgIH0KCiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBidWZmZXIubGVuZ3RoKTsKICAgIGlmIChlbmQgPT0gc3RhcnQpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIF9CdWZmZXJBbmRTdGFydCBidWZmZXJBbmRTdGFydCA9CiAgICAgICAgX2Vuc3VyZUZhc3RBbmRTZXJpYWxpemFibGVCeXRlRGF0YShidWZmZXIsIHN0YXJ0LCBlbmQpOwogICAgdmFyIHJlc3VsdCA9IF9uYXRpdmVXcml0ZShidWZmZXJBbmRTdGFydC5idWZmZXIsIGJ1ZmZlckFuZFN0YXJ0LnN0YXJ0LAogICAgICAgIGVuZCAtIChzdGFydCAtIGJ1ZmZlckFuZFN0YXJ0LnN0YXJ0KSk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IFNvY2tldEV4Y2VwdGlvbigid3JpdGVGcm9tU3luYyBmYWlsZWQiLCBvc0Vycm9yOiByZXN1bHQpOwogICAgfQogICAgYXNzZXJ0KHJlc291cmNlSW5mbyAhPSBudWxsKTsKICAgIGlmIChyZXNvdXJjZUluZm8gIT0gbnVsbCkgewogICAgICByZXNvdXJjZUluZm8uYWRkV3JpdGUocmVzdWx0KTsKICAgIH0KICB9CgogIHZvaWQgX2NoZWNrQXZhaWxhYmxlKCkgewogICAgaWYgKGlzQ2xvc2VkKSB7CiAgICAgIHRocm93IGNvbnN0IFNvY2tldEV4Y2VwdGlvbi5jbG9zZWQoKTsKICAgIH0KICB9CgogIC8vIE5hdGl2ZSBtZXRob2QgZGVjbGFyYXRpb25zLgogIHN0YXRpYyBfbmF0aXZlTG9va3VwUmVxdWVzdChob3N0LCBpbnQgdHlwZSkKICAgICAgbmF0aXZlICJTeW5jaHJvbm91c1NvY2tldF9Mb29rdXBSZXF1ZXN0IjsKICBfbmF0aXZlQ3JlYXRlQ29ubmVjdFN5bmMoaG9zdCwgaW50IHBvcnQpCiAgICAgIG5hdGl2ZSAiU3luY2hyb25vdXNTb2NrZXRfQ3JlYXRlQ29ubmVjdFN5bmMiOwogIF9uYXRpdmVBdmFpbGFibGUoKSBuYXRpdmUgIlN5bmNocm9ub3VzU29ja2V0X0F2YWlsYWJsZSI7CiAgX25hdGl2ZUNsb3NlU3luYygpIG5hdGl2ZSAiU3luY2hyb25vdXNTb2NrZXRfQ2xvc2VTeW5jIjsKICBpbnQgX25hdGl2ZUdldFBvcnQoKSBuYXRpdmUgIlN5bmNocm9ub3VzU29ja2V0X0dldFBvcnQiOwogIExpc3QgX25hdGl2ZUdldFJlbW90ZVBlZXIoKSBuYXRpdmUgIlN5bmNocm9ub3VzU29ja2V0X0dldFJlbW90ZVBlZXIiOwogIF9uYXRpdmVSZWFkKGludCBsZW4pIG5hdGl2ZSAiU3luY2hyb25vdXNTb2NrZXRfUmVhZCI7CiAgX25hdGl2ZVJlYWRJbnRvKExpc3Q8aW50PiBidWZmZXIsIGludCBvZmZzZXQsIGludCBieXRlcykKICAgICAgbmF0aXZlICJTeW5jaHJvbm91c1NvY2tldF9SZWFkTGlzdCI7CiAgX25hdGl2ZVNodXRkb3duUmVhZCgpIG5hdGl2ZSAiU3luY2hyb25vdXNTb2NrZXRfU2h1dGRvd25SZWFkIjsKICBfbmF0aXZlU2h1dGRvd25Xcml0ZSgpIG5hdGl2ZSAiU3luY2hyb25vdXNTb2NrZXRfU2h1dGRvd25Xcml0ZSI7CiAgX25hdGl2ZVdyaXRlKExpc3Q8aW50PiBidWZmZXIsIGludCBvZmZzZXQsIGludCBieXRlcykKICAgICAgbmF0aXZlICJTeW5jaHJvbm91c1NvY2tldF9Xcml0ZUxpc3QiOwp9CoFfAE5OPAEgAQcdCTw6BAIBPioBJwE8GyY7BAEyID4sASgBKwFCMAE8AUsBRDECAU0ZUAFMTxkZHR4BMyABMxUBJwFAGEAGLRYkGg0MIhQTCEVBCAYfIS0cTx8VCCAzJUwfKR1LCh4PNQ4XFh9IDCAKIwgVBgEaBAEvKwERGhgGFCwGIx0UBh8EASYULAYpHRQGGjkEARcULAYpHRQGFgQBFRUaNhcGBAFEFCwtHCo5DUkGBAE0PTwfFgYnNTAgRwYWBAE7FxhBBgEdMCxEBhk3BkEYEAZAHUkGIhMEASAXGEEGASY2BhQTBiMdFAYiGiIxCAYgHgYTBAFDOwQBLRQOBhkkGA8hGQ8hFQ8PLAYEARgkDgYZEw0dBhkEARklDgYYEw0eBhoEAT0XGUEGHTAsRQYZQAYBQRgOBgElQEsvHUoGIiAlBgQBGxQsBgQBIS4wKzQ7OztIODsrQUM4LAIBJGRhcnQ6aW8tcGF0Y2gvc3luY19zb2NrZXRfcGF0Y2guZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vYnl0ZXNfYnVpbGRlci5kYXJ0la4vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKLyoqCiAqIEJ1aWxkcyBhIGxpc3Qgb2YgYnl0ZXMsIGFsbG93aW5nIGJ5dGVzIGFuZCBsaXN0cyBvZiBieXRlcyB0byBiZSBhZGRlZCBhdCB0aGUKICogZW5kLgogKgogKiBVc2VkIHRvIGVmZmljaWVudGx5IGNvbGxlY3QgYnl0ZXMgYW5kIGxpc3RzIG9mIGJ5dGVzLgogKi8KYWJzdHJhY3QgY2xhc3MgQnl0ZXNCdWlsZGVyIHsKICAvKioKICAgKiBDb25zdHJ1Y3QgYSBuZXcgZW1wdHkgW0J5dGVzQnVpbGRlcl0uCiAgICoKICAgKiBJZiBbY29weV0gaXMgdHJ1ZSwgdGhlIGRhdGEgaXMgYWx3YXlzIGNvcGllZCB3aGVuIGFkZGVkIHRvIHRoZSBsaXN0LiBJZgogICAqIGl0IFtjb3B5XSBpcyBmYWxzZSwgdGhlIGRhdGEgaXMgb25seSBjb3BpZWQgaWYgbmVlZGVkLiBUaGF0IG1lYW5zIHRoYXQgaWYKICAgKiB0aGUgbGlzdHMgYXJlIGNoYW5nZWQgYWZ0ZXIgYWRkZWQgdG8gdGhlIFtCeXRlc0J1aWxkZXJdLCBpdCBtYXkgZWZmZWN0IHRoZQogICAqIG91dHB1dC4gRGVmYXVsdCBpcyBgdHJ1ZWAuCiAgICovCiAgZmFjdG9yeSBCeXRlc0J1aWxkZXIoe2Jvb2wgY29weTogdHJ1ZX0pIHsKICAgIGlmIChjb3B5KSB7CiAgICAgIHJldHVybiBuZXcgX0NvcHlpbmdCeXRlc0J1aWxkZXIoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgX0J5dGVzQnVpbGRlcigpOwogICAgfQogIH0KCiAgLyoqCiAgICogQXBwZW5kcyBbYnl0ZXNdIHRvIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBidWlsZGVyLgogICAqCiAgICogRWFjaCB2YWx1ZSBvZiBbYnl0ZXNdIHdpbGwgYmUgYml0LXJlcHJlc2VudGF0aW9uIHRydW5jYXRlZCB0byB0aGUgcmFuZ2UKICAgKiAwIC4uIDI1NS4KICAgKi8KICB2b2lkIGFkZChMaXN0PGludD4gYnl0ZXMpOwoKICAvKioKICAgKiBBcHBlbmQgW2J5dGVdIHRvIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBidWlsZGVyLgogICAqCiAgICogVGhlIFtieXRlXSB3aWxsIGJlIGJpdC1yZXByZXNlbnRhdGlvbiB0cnVuY2F0ZWQgdG8gdGhlIHJhbmdlIDAgLi4gMjU1LgogICAqLwogIHZvaWQgYWRkQnl0ZShpbnQgYnl0ZSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIGB0aGlzYCBhbmQgY2xlYXJzIGB0aGlzYC4KICAgKgogICAqIFRoZSBsaXN0IHJldHVybmVkIGlzIGEgdmlldyBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLCBsaW1pdGVkIHRvIHRoZQogICAqIFtsZW5ndGhdLgogICAqLwogIFVpbnQ4TGlzdCB0YWtlQnl0ZXMoKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGJ1aWxkZXIuCiAgICoKICAgKiBMZWF2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWlsZGVyIGludGFjdC4KICAgKi8KICBVaW50OExpc3QgdG9CeXRlcygpOwoKICAvKioKICAgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWlsZGVyLgogICAqLwogIGludCBnZXQgbGVuZ3RoOwoKICAvKioKICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYnVmZmVyIGlzIGVtcHR5LgogICAqLwogIGJvb2wgZ2V0IGlzRW1wdHk7CgogIC8qKgogICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBidWZmZXIgaXMgbm90IGVtcHR5LgogICAqLwogIGJvb2wgZ2V0IGlzTm90RW1wdHk7CgogIC8qKgogICAqIENsZWFyIHRoZSBjb250ZW50cyBvZiB0aGUgYnVpbGRlci4KICAgKi8KICB2b2lkIGNsZWFyKCk7Cn0KCmNsYXNzIF9Db3B5aW5nQnl0ZXNCdWlsZGVyIGltcGxlbWVudHMgQnl0ZXNCdWlsZGVyIHsKICAvLyBTdGFydCB3aXRoIDEwMjQgYnl0ZXMuCiAgc3RhdGljIGNvbnN0IGludCBfaW5pdFNpemUgPSAxMDI0OwoKICAvLyBTYWZlIGZvciByZXVzZSBiZWNhdXNlIGEgZml4ZWQtbGVuZ3RoIGVtcHR5IGxpc3QgaXMgaW1tdXRhYmxlLgogIHN0YXRpYyBmaW5hbCBfZW1wdHlMaXN0ID0gbmV3IFVpbnQ4TGlzdCgwKTsKCiAgaW50IF9sZW5ndGggPSAwOwogIFVpbnQ4TGlzdCBfYnVmZmVyOwoKICBfQ29weWluZ0J5dGVzQnVpbGRlcihbaW50IGluaXRpYWxDYXBhY2l0eSA9IDBdKQogICAgICA6IF9idWZmZXIgPSAoaW5pdGlhbENhcGFjaXR5IDw9IDApCiAgICAgICAgICAgID8gX2VtcHR5TGlzdAogICAgICAgICAgICA6IG5ldyBVaW50OExpc3QoX3BvdzJyb3VuZHVwKGluaXRpYWxDYXBhY2l0eSkpOwoKICB2b2lkIGFkZChMaXN0PGludD4gYnl0ZXMpIHsKICAgIGludCBieXRlc0xlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKICAgIGlmIChieXRlc0xlbmd0aCA9PSAwKSByZXR1cm47CiAgICBpbnQgcmVxdWlyZWQgPSBfbGVuZ3RoICsgYnl0ZXNMZW5ndGg7CiAgICBpZiAoX2J1ZmZlci5sZW5ndGggPCByZXF1aXJlZCkgewogICAgICBfZ3JvdyhyZXF1aXJlZCk7CiAgICB9CiAgICBhc3NlcnQoX2J1ZmZlci5sZW5ndGggPj0gcmVxdWlyZWQpOwogICAgaWYgKGJ5dGVzIGlzIFVpbnQ4TGlzdCkgewogICAgICBfYnVmZmVyLnNldFJhbmdlKF9sZW5ndGgsIHJlcXVpcmVkLCBieXRlcyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzTGVuZ3RoOyBpKyspIHsKICAgICAgICBfYnVmZmVyW19sZW5ndGggKyBpXSA9IGJ5dGVzW2ldOwogICAgICB9CiAgICB9CiAgICBfbGVuZ3RoID0gcmVxdWlyZWQ7CiAgfQoKICB2b2lkIGFkZEJ5dGUoaW50IGJ5dGUpIHsKICAgIGlmIChfYnVmZmVyLmxlbmd0aCA9PSBfbGVuZ3RoKSB7CiAgICAgIC8vIFRoZSBncm93IGFsZ29yaXRobSBhbHdheXMgYXQgbGVhc3QgZG91Ymxlcy4KICAgICAgLy8gSWYgd2UgYWRkZWQgb25lIHRvIF9sZW5ndGggaXQgd291bGQgcXVhZHJ1cGxlIHVubmVjZXNzYXJpbHkuCiAgICAgIF9ncm93KF9sZW5ndGgpOwogICAgfQogICAgYXNzZXJ0KF9idWZmZXIubGVuZ3RoID4gX2xlbmd0aCk7CiAgICBfYnVmZmVyW19sZW5ndGhdID0gYnl0ZTsKICAgIF9sZW5ndGgrKzsKICB9CgogIHZvaWQgX2dyb3coaW50IHJlcXVpcmVkKSB7CiAgICAvLyBXZSB3aWxsIGNyZWF0ZSBhIGxpc3QgaW4gdGhlIHJhbmdlIG9mIDItNCB0aW1lcyBsYXJnZXIgdGhhbgogICAgLy8gcmVxdWlyZWQuCiAgICBpbnQgbmV3U2l6ZSA9IHJlcXVpcmVkICogMjsKICAgIGlmIChuZXdTaXplIDwgX2luaXRTaXplKSB7CiAgICAgIG5ld1NpemUgPSBfaW5pdFNpemU7CiAgICB9IGVsc2UgewogICAgICBuZXdTaXplID0gX3BvdzJyb3VuZHVwKG5ld1NpemUpOwogICAgfQogICAgdmFyIG5ld0J1ZmZlciA9IG5ldyBVaW50OExpc3QobmV3U2l6ZSk7CiAgICBuZXdCdWZmZXIuc2V0UmFuZ2UoMCwgX2J1ZmZlci5sZW5ndGgsIF9idWZmZXIpOwogICAgX2J1ZmZlciA9IG5ld0J1ZmZlcjsKICB9CgogIFVpbnQ4TGlzdCB0YWtlQnl0ZXMoKSB7CiAgICBpZiAoX2xlbmd0aCA9PSAwKSByZXR1cm4gX2VtcHR5TGlzdDsKICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0LnZpZXcoX2J1ZmZlci5idWZmZXIsIDAsIF9sZW5ndGgpOwogICAgY2xlYXIoKTsKICAgIHJldHVybiBidWZmZXI7CiAgfQoKICBVaW50OExpc3QgdG9CeXRlcygpIHsKICAgIGlmIChfbGVuZ3RoID09IDApIHJldHVybiBfZW1wdHlMaXN0OwogICAgcmV0dXJuIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoCiAgICAgICAgbmV3IFVpbnQ4TGlzdC52aWV3KF9idWZmZXIuYnVmZmVyLCAwLCBfbGVuZ3RoKSk7CiAgfQoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbGVuZ3RoOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF9sZW5ndGggPT0gMDsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfbGVuZ3RoICE9IDA7CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfbGVuZ3RoID0gMDsKICAgIF9idWZmZXIgPSBfZW1wdHlMaXN0OwogIH0KCiAgc3RhdGljIGludCBfcG93MnJvdW5kdXAoaW50IHgpIHsKICAgIGFzc2VydCh4ID4gMCk7CiAgICAtLXg7CiAgICB4IHw9IHggPj4gMTsKICAgIHggfD0geCA+PiAyOwogICAgeCB8PSB4ID4+IDQ7CiAgICB4IHw9IHggPj4gODsKICAgIHggfD0geCA+PiAxNjsKICAgIHJldHVybiB4ICsgMTsKICB9Cn0KCmNsYXNzIF9CeXRlc0J1aWxkZXIgaW1wbGVtZW50cyBCeXRlc0J1aWxkZXIgewogIGludCBfbGVuZ3RoID0gMDsKICBmaW5hbCBMaXN0PFVpbnQ4TGlzdD4gX2NodW5rcyA9IFtdOwoKICB2b2lkIGFkZChMaXN0PGludD4gYnl0ZXMpIHsKICAgIFVpbnQ4TGlzdCB0eXBlZEJ5dGVzOwogICAgaWYgKGJ5dGVzIGlzIFVpbnQ4TGlzdCkgewogICAgICB0eXBlZEJ5dGVzID0gYnl0ZXM7CiAgICB9IGVsc2UgewogICAgICB0eXBlZEJ5dGVzID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChieXRlcyk7CiAgICB9CiAgICBfY2h1bmtzLmFkZCh0eXBlZEJ5dGVzKTsKICAgIF9sZW5ndGggKz0gdHlwZWRCeXRlcy5sZW5ndGg7CiAgfQoKICB2b2lkIGFkZEJ5dGUoaW50IGJ5dGUpIHsKICAgIF9jaHVua3MuYWRkKG5ldyBVaW50OExpc3QoMSkuLlswXSA9IGJ5dGUpOwogICAgX2xlbmd0aCsrOwogIH0KCiAgVWludDhMaXN0IHRha2VCeXRlcygpIHsKICAgIGlmIChfbGVuZ3RoID09IDApIHJldHVybiBfQ29weWluZ0J5dGVzQnVpbGRlci5fZW1wdHlMaXN0OwogICAgaWYgKF9jaHVua3MubGVuZ3RoID09IDEpIHsKICAgICAgdmFyIGJ1ZmZlciA9IF9jaHVua3NbMF07CiAgICAgIGNsZWFyKCk7CiAgICAgIHJldHVybiBidWZmZXI7CiAgICB9CiAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChfbGVuZ3RoKTsKICAgIGludCBvZmZzZXQgPSAwOwogICAgZm9yICh2YXIgY2h1bmsgaW4gX2NodW5rcykgewogICAgICBidWZmZXIuc2V0UmFuZ2Uob2Zmc2V0LCBvZmZzZXQgKyBjaHVuay5sZW5ndGgsIGNodW5rKTsKICAgICAgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aDsKICAgIH0KICAgIGNsZWFyKCk7CiAgICByZXR1cm4gYnVmZmVyOwogIH0KCiAgVWludDhMaXN0IHRvQnl0ZXMoKSB7CiAgICBpZiAoX2xlbmd0aCA9PSAwKSByZXR1cm4gX0NvcHlpbmdCeXRlc0J1aWxkZXIuX2VtcHR5TGlzdDsKICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KF9sZW5ndGgpOwogICAgaW50IG9mZnNldCA9IDA7CiAgICBmb3IgKHZhciBjaHVuayBpbiBfY2h1bmtzKSB7CiAgICAgIGJ1ZmZlci5zZXRSYW5nZShvZmZzZXQsIG9mZnNldCArIGNodW5rLmxlbmd0aCwgY2h1bmspOwogICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlcjsKICB9CgogIGludCBnZXQgbGVuZ3RoID0+IF9sZW5ndGg7CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2xlbmd0aCA9PSAwOwoKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9sZW5ndGggIT0gMDsKCiAgdm9pZCBjbGVhcigpIHsKICAgIF9sZW5ndGggPSAwOwogICAgX2NodW5rcy5jbGVhcigpOwogIH0KfQqA6wBOTjwBEQEEUAgDOQQeBisFTU9QIAYsECkNIgYEAQY9BU0PBh0BBjsFTAYaAQY3BUgPBhkBBjwFMAYXAQYpBhIBBiwGFAEGMAYXAQYoBhACATUcJQFELgETFQEyKRk8AR4kIiolFwYoHjINLikIBhgEARslNUYWBiYdDwQBHUMRIB8bDScGLDQZBAEaKUENEwQBGCkjOQQBHQEkAScBEREaBAEjEwkREREREhIEAgEuEyYBHhoeGg0yBh0iBAEbLw8EARo+Hx8PFQYpFCE9HgYNEwQBGD4pFCE9HgYTBAEdASQBJwERERUEAgEaZGFydDppby9ieXRlc19idWlsZGVyLmRhcnQqb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL2NvbW1vbi5kYXJ0jsovLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKLy8gQ29uc3RhbnRzIHVzZWQgd2hlbiB3b3JraW5nIHdpdGggbmF0aXZlIHBvcnRzLgovLyBUaGVzZSBtdXN0IG1hdGNoIHRoZSBjb25zdGFudHMgaW4gcnVudGltZS9iaW4vZGFydHV0aWxzLmggY2xhc3MgQ09iamVjdC4KY29uc3QgaW50IF9zdWNjZXNzUmVzcG9uc2UgPSAwOwpjb25zdCBpbnQgX2lsbGVnYWxBcmd1bWVudFJlc3BvbnNlID0gMTsKY29uc3QgaW50IF9vc0Vycm9yUmVzcG9uc2UgPSAyOwpjb25zdCBpbnQgX2ZpbGVDbG9zZWRSZXNwb25zZSA9IDM7Cgpjb25zdCBpbnQgX2Vycm9yUmVzcG9uc2VFcnJvclR5cGUgPSAwOwpjb25zdCBpbnQgX29zRXJyb3JSZXNwb25zZUVycm9yQ29kZSA9IDE7CmNvbnN0IGludCBfb3NFcnJvclJlc3BvbnNlTWVzc2FnZSA9IDI7CgovLyBGdW5jdGlvbnMgdXNlZCB0byByZWNlaXZlIGV4Y2VwdGlvbnMgZnJvbSBuYXRpdmUgcG9ydHMuCmJvb2wgX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkgPT4KICAgIHJlc3BvbnNlIGlzIExpc3QgJiYgcmVzcG9uc2VbMF0gIT0gX3N1Y2Nlc3NSZXNwb25zZTsKCi8qKgogKiBSZXR1cm5zIGFuIEV4Y2VwdGlvbiBvciBhbiBFcnJvcgogKi8KX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBwYXRoKSB7CiAgYXNzZXJ0KF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKTsKICBzd2l0Y2ggKHJlc3BvbnNlW19lcnJvclJlc3BvbnNlRXJyb3JUeXBlXSkgewogICAgY2FzZSBfaWxsZWdhbEFyZ3VtZW50UmVzcG9uc2U6CiAgICAgIHJldHVybiBuZXcgQXJndW1lbnRFcnJvcigiJG1lc3NhZ2U6ICRwYXRoIik7CiAgICBjYXNlIF9vc0Vycm9yUmVzcG9uc2U6CiAgICAgIHZhciBlcnIgPSBuZXcgT1NFcnJvcihyZXNwb25zZVtfb3NFcnJvclJlc3BvbnNlTWVzc2FnZV0sCiAgICAgICAgICByZXNwb25zZVtfb3NFcnJvclJlc3BvbnNlRXJyb3JDb2RlXSk7CiAgICAgIHJldHVybiBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbihtZXNzYWdlLCBwYXRoLCBlcnIpOwogICAgY2FzZSBfZmlsZUNsb3NlZFJlc3BvbnNlOgogICAgICByZXR1cm4gbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oIkZpbGUgY2xvc2VkIiwgcGF0aCk7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gbmV3IEV4Y2VwdGlvbigiVW5rbm93biBlcnJvciIpOwogIH0KfQoKLyoqCiAqIEJhc2UgY2xhc3MgZm9yIGFsbCBJTyByZWxhdGVkIGV4Y2VwdGlvbnMuCiAqLwphYnN0cmFjdCBjbGFzcyBJT0V4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbiB7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIklPRXhjZXB0aW9uIjsKfQoKLyoqCiAgKiBBbiBbT1NFcnJvcl0gb2JqZWN0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGFuIGVycm9yIGZyb20gdGhlCiAgKiBvcGVyYXRpbmcgc3lzdGVtLgogICovCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgT1NFcnJvciB7CiAgLyoqIENvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBPUyBlcnJvciBjb2RlIGlzIGF2YWlsYWJsZS4gKi8KICBzdGF0aWMgY29uc3QgaW50IG5vRXJyb3JDb2RlID0gLTE7CgogIC8vLyBFcnJvciBtZXNzYWdlIHN1cHBsaWVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBUaGlzIG1heSBiZSBgbnVsbGAgb3IKICAvLy8gZW1wdHkgaWYgbm8gbWVzc2FnZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwoKICAvLy8gRXJyb3IgY29kZSBzdXBwbGllZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4KICAvLy8KICAvLy8gV2lsbCBoYXZlIHRoZSB2YWx1ZSBbT1NFcnJvci5ub0Vycm9yQ29kZV0gaWYgdGhlcmUgaXMgbm8gZXJyb3IgY29kZQogIC8vLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgogIGZpbmFsIGludCBlcnJvckNvZGU7CgogIC8qKiBDcmVhdGVzIGFuIE9TRXJyb3Igb2JqZWN0IGZyb20gYSBtZXNzYWdlIGFuZCBhbiBlcnJvckNvZGUuICovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGNvbnN0IE9TRXJyb3IoW3RoaXMubWVzc2FnZSA9ICIiLCB0aGlzLmVycm9yQ29kZSA9IG5vRXJyb3JDb2RlXSk7CgogIC8qKiBDb252ZXJ0cyBhbiBPU0Vycm9yIG9iamVjdCB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4gKi8KICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgiT1MgRXJyb3IiKTsKICAgIGlmIChtZXNzYWdlLmlzTm90RW1wdHkpIHsKICAgICAgc2IuLndyaXRlKCI6ICIpLi53cml0ZShtZXNzYWdlKTsKICAgICAgaWYgKGVycm9yQ29kZSAhPSBub0Vycm9yQ29kZSkgewogICAgICAgIHNiLi53cml0ZSgiLCBlcnJubyA9ICIpLi53cml0ZShlcnJvckNvZGUudG9TdHJpbmcoKSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZXJyb3JDb2RlICE9IG5vRXJyb3JDb2RlKSB7CiAgICAgIHNiLi53cml0ZSgiOiBlcnJubyA9ICIpLi53cml0ZShlcnJvckNvZGUudG9TdHJpbmcoKSk7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCi8vIE9iamVjdCBmb3IgaG9sZGluZyBhIGJ1ZmZlciBhbmQgYW4gb2Zmc2V0LgpjbGFzcyBfQnVmZmVyQW5kU3RhcnQgewogIExpc3Q8aW50PiBidWZmZXI7CiAgaW50IHN0YXJ0OwogIF9CdWZmZXJBbmRTdGFydCh0aGlzLmJ1ZmZlciwgdGhpcy5zdGFydCk7Cn0KCi8vIEVuc3VyZSB0aGF0IHRoZSBpbnB1dCBMaXN0IGNhbiBiZSBzZXJpYWxpemVkIHRocm91Z2ggYSBuYXRpdmUgcG9ydC4KLy8gT25seSBJbnQ4TGlzdCBhbmQgVWludDhMaXN0IExpc3RzIGFyZSBzZXJpYWxpemVkIGRpcmVjdGx5LgovLyBBbGwgb3RoZXIgbGlzdHMgYXJlIGZpcnN0IGNvcGllZCBpbnRvIGEgVWludDhMaXN0LiBUaGlzIGhhcyB0aGUgYWRkZWQKLy8gYmVuZWZpdCB0aGF0IGl0IGlzIGZhc3RlciB0byBhY2Nlc3MgZnJvbSB0aGUgQyBjb2RlIGFzIHdlbGwuCl9CdWZmZXJBbmRTdGFydCBfZW5zdXJlRmFzdEFuZFNlcmlhbGl6YWJsZUJ5dGVEYXRhKAogICAgTGlzdDxpbnQ+IGJ1ZmZlciwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgaWYgKGJ1ZmZlciBpcyBVaW50OExpc3QgfHwgYnVmZmVyIGlzIEludDhMaXN0KSB7CiAgICByZXR1cm4gbmV3IF9CdWZmZXJBbmRTdGFydChidWZmZXIsIHN0YXJ0KTsKICB9CiAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogIHZhciBuZXdCdWZmZXIgPSBuZXcgVWludDhMaXN0KGxlbmd0aCk7CiAgaW50IGogPSBzdGFydDsKICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpbnQgdmFsdWUgPSBidWZmZXJbal07CiAgICBpZiAodmFsdWUgPT0gbnVsbCkgdGhyb3cgQXJndW1lbnRFcnJvcigiTGlzdCBlbGVtZW50IGlzIG51bGwgYXQgaW5kZXggJGoiKTsKICAgIG5ld0J1ZmZlcltpXSA9IHZhbHVlOwogICAgaisrOwogIH0KICByZXR1cm4gbmV3IF9CdWZmZXJBbmRTdGFydChuZXdCdWZmZXIsIDApOwp9CgpjbGFzcyBfSU9DcnlwdG8gewogIGV4dGVybmFsIHN0YXRpYyBVaW50OExpc3QgZ2V0UmFuZG9tQnl0ZXMoaW50IGNvdW50KTsKfQp3AE5OPAERATJMICggIwEnKScBOyM5AQQkBEAmLyMzGz8wOh47DS0EAgEELQQyJgIBBEIWBRoQRyUBTDgYATMGSiEXAUQcRAFAFioaHicmPggrPAYaBAIBLhgUDSwCAUc+SUA0LDMvBBwpESUbUBoJBCwCARI3AgETZGFydDppby9jb21tb24uZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvYmluL2NvbW1vbl9wYXRjaC5kYXJ0hzAvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIE5vdGU6IHRoZSBWTSBjb25jYXRlbmF0ZXMgYWxsIHBhdGNoIGZpbGVzIGludG8gYSBzaW5nbGUgcGF0Y2ggZmlsZS4gVGhpcwovLy8gZmlsZSBpcyB0aGUgZmlyc3QgcGF0Y2ggaW4gImRhcnQ6aW8iIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW1wb3J0cyB1c2VkIGJ5Ci8vLyBwYXRjaGVzIG9mIHRoYXQgbGlicmFyeS4gV2UgcGxhbiB0byBjaGFuZ2UgdGhpcyB3aGVuIHdlIGhhdmUgYSBzaGFyZWQgZnJvbnQKLy8vIGVuZCBhbmQgc2ltcGx5IHVzZSBwYXJ0cy4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgVk1MaWJyYXJ5SG9va3MsIHBhdGNoOwoKaW1wb3J0ICJkYXJ0OmFzeW5jIgogICAgc2hvdwogICAgICAgIENvbXBsZXRlciwKICAgICAgICBGdXR1cmUsCiAgICAgICAgU3RyZWFtLAogICAgICAgIFN0cmVhbUNvbnN1bWVyLAogICAgICAgIFN0cmVhbUNvbnRyb2xsZXIsCiAgICAgICAgU3RyZWFtU3Vic2NyaXB0aW9uLAogICAgICAgIFRpbWVyLAogICAgICAgIFpvbmUsCiAgICAgICAgc2NoZWR1bGVNaWNyb3Rhc2s7CgppbXBvcnQgImRhcnQ6Y29sbGVjdGlvbiIgc2hvdyBIYXNoTWFwOwoKaW1wb3J0ICJkYXJ0OmNvbnZlcnQiIHNob3cgRW5jb2RpbmcsIHV0Zjg7CgppbXBvcnQgImRhcnQ6ZGV2ZWxvcGVyIiBzaG93IHJlZ2lzdGVyRXh0ZW5zaW9uOwoKaW1wb3J0ICJkYXJ0Omlzb2xhdGUiIHNob3cgUmF3UmVjZWl2ZVBvcnQsIFJlY2VpdmVQb3J0LCBTZW5kUG9ydDsKCmltcG9ydCAiZGFydDptYXRoIiBzaG93IG1pbjsKCmltcG9ydCAiZGFydDpuYXRpdmV3cmFwcGVycyIgc2hvdyBOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczE7CgppbXBvcnQgImRhcnQ6dHlwZWRfZGF0YSIgc2hvdyBVaW50OExpc3Q7CgovLy8gVGhlc2UgYXJlIHRoZSBhZGRpdGlvbmFsIHBhcnRzIG9mIHRoaXMgcGF0Y2ggbGlicmFyeToKLy8gcGFydCAiZGlyZWN0b3J5X3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJldmVudGhhbmRsZXJfcGF0Y2guZGFydCI7Ci8vIHBhcnQgImZpbGVfcGF0Y2guZGFydCI7Ci8vIHBhcnQgImZpbGVfc3lzdGVtX2VudGl0eV9wYXRjaC5kYXJ0IjsKLy8gcGFydCAiZmlsdGVyX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJpb19zZXJ2aWNlX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJwbGF0Zm9ybV9wYXRjaC5kYXJ0IjsKLy8gcGFydCAicHJvY2Vzc19wYXRjaC5kYXJ0IjsKLy8gcGFydCAic29ja2V0X3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJzdGRpb19wYXRjaC5kYXJ0IjsKLy8gcGFydCAic2VjdXJlX3NvY2tldF9wYXRjaC5kYXJ0IjsKLy8gcGFydCAic3luY19zb2NrZXRfcGF0Y2guZGFydCI7CgpAcGF0Y2gKY2xhc3MgX0lPQ3J5cHRvIHsKICBAcGF0Y2gKICBzdGF0aWMgVWludDhMaXN0IGdldFJhbmRvbUJ5dGVzKGludCBjb3VudCkgbmF0aXZlICJDcnlwdG9fR2V0UmFuZG9tQnl0ZXMiOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKX3NldHVwSG9va3MoKSB7CiAgVk1MaWJyYXJ5SG9va3MuZXZlbnRIYW5kbGVyU2VuZERhdGEgPSBfRXZlbnRIYW5kbGVyLl9zZW5kRGF0YTsKICBWTUxpYnJhcnlIb29rcy50aW1lck1pbGxpc2Vjb25kQ2xvY2sgPSBfRXZlbnRIYW5kbGVyLl90aW1lck1pbGxpc2Vjb25kQ2xvY2s7Cn0KQABOTjwBTVBQHgE0ARQJExAQGBocDw4bAScBKwEwAUIBHQE8ASkBOiAjGykdIR8eHRwkIgEHEglNAgEiEEFPAgEfZGFydDppby1wYXRjaC9jb21tb25fcGF0Y2guZGFydDRvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vZGF0YV90cmFuc2Zvcm1lci5kYXJ0wABVlS8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgovKioKICogRXhwb3NlcyBaTGliIG9wdGlvbnMgZm9yIGlucHV0IHBhcmFtZXRlcnMuCiAqCiAqIFNlZSBodHRwOi8vd3d3LnpsaWIubmV0L21hbnVhbC5odG1sIGZvciBtb3JlIGRvY3VtZW50YXRpb24uCiAqLwphYnN0cmFjdCBjbGFzcyBaTGliT3B0aW9uIHsKICAvLy8gTWluaW1hbCB2YWx1ZSBmb3IgW1pMaWJDb2RlYy53aW5kb3dCaXRzXSwgW1pMaWJFbmNvZGVyLndpbmRvd0JpdHNdCiAgLy8vIGFuZCBbWkxpYkRlY29kZXIud2luZG93Qml0c10uCiAgc3RhdGljIGNvbnN0IGludCBtaW5XaW5kb3dCaXRzID0gODsKICBARGVwcmVjYXRlZCgiVXNlIG1pbldpbmRvd0JpdHMgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBNSU5fV0lORE9XX0JJVFMgPSA4OwoKICAvLy8gTWF4aW1hbCB2YWx1ZSBmb3IgW1pMaWJDb2RlYy53aW5kb3dCaXRzXSwgW1pMaWJFbmNvZGVyLndpbmRvd0JpdHNdCiAgLy8vIGFuZCBbWkxpYkRlY29kZXIud2luZG93Qml0c10uCiAgc3RhdGljIGNvbnN0IGludCBtYXhXaW5kb3dCaXRzID0gMTU7CiAgQERlcHJlY2F0ZWQoIlVzZSBtYXhXaW5kb3dCaXRzIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTUFYX1dJTkRPV19CSVRTID0gMTU7CgogIC8vLyBEZWZhdWx0IHZhbHVlIGZvciBbWkxpYkNvZGVjLndpbmRvd0JpdHNdLCBbWkxpYkVuY29kZXIud2luZG93Qml0c10KICAvLy8gYW5kIFtaTGliRGVjb2Rlci53aW5kb3dCaXRzXS4KICBzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRXaW5kb3dCaXRzID0gMTU7CiAgQERlcHJlY2F0ZWQoIlVzZSBkZWZhdWx0V2luZG93Qml0cyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfV0lORE9XX0JJVFMgPSAxNTsKCiAgLy8vIE1pbmltYWwgdmFsdWUgZm9yIFtaTGliQ29kZWMubGV2ZWxdIGFuZCBbWkxpYkVuY29kZXIubGV2ZWxdLgogIHN0YXRpYyBjb25zdCBpbnQgbWluTGV2ZWwgPSAtMTsKICBARGVwcmVjYXRlZCgiVXNlIG1pbkxldmVsIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTUlOX0xFVkVMID0gLTE7CgogIC8vLyBNYXhpbWFsIHZhbHVlIGZvciBbWkxpYkNvZGVjLmxldmVsXSBhbmQgW1pMaWJFbmNvZGVyLmxldmVsXQogIHN0YXRpYyBjb25zdCBpbnQgbWF4TGV2ZWwgPSA5OwogIEBEZXByZWNhdGVkKCJVc2UgbWF4TGV2ZWwgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBNQVhfTEVWRUwgPSA5OwoKICAvLy8gRGVmYXVsdCB2YWx1ZSBmb3IgW1pMaWJDb2RlYy5sZXZlbF0gYW5kIFtaTGliRW5jb2Rlci5sZXZlbF0uCiAgc3RhdGljIGNvbnN0IGludCBkZWZhdWx0TGV2ZWwgPSA2OwogIEBEZXByZWNhdGVkKCJVc2UgZGVmYXVsdExldmVsIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9MRVZFTCA9IDY7CgogIC8vLyBNaW5pbWFsIHZhbHVlIGZvciBbWkxpYkNvZGVjLm1lbUxldmVsXSBhbmQgW1pMaWJFbmNvZGVyLm1lbUxldmVsXS4KICBzdGF0aWMgY29uc3QgaW50IG1pbk1lbUxldmVsID0gMTsKICBARGVwcmVjYXRlZCgiVXNlIG1pbk1lbUxldmVsIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTUlOX01FTV9MRVZFTCA9IDE7CgogIC8vLyBNYXhpbWFsIHZhbHVlIGZvciBbWkxpYkNvZGVjLm1lbUxldmVsXSBhbmQgW1pMaWJFbmNvZGVyLm1lbUxldmVsXS4KICBzdGF0aWMgY29uc3QgaW50IG1heE1lbUxldmVsID0gOTsKICBARGVwcmVjYXRlZCgiVXNlIG1heE1lbUxldmVsIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTUFYX01FTV9MRVZFTCA9IDk7CgogIC8vLyBEZWZhdWx0IHZhbHVlIGZvciBbWkxpYkNvZGVjLm1lbUxldmVsXSBhbmQgW1pMaWJFbmNvZGVyLm1lbUxldmVsXS4KICBzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRNZW1MZXZlbCA9IDg7CiAgQERlcHJlY2F0ZWQoIlVzZSBkZWZhdWx0TWVtTGV2ZWwgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX01FTV9MRVZFTCA9IDg7CgogIC8vLyBSZWNvbW1lbmRlZCBzdHJhdGVneSBmb3IgZGF0YSBwcm9kdWNlZCBieSBhIGZpbHRlciAob3IgcHJlZGljdG9yKQogIHN0YXRpYyBjb25zdCBpbnQgc3RyYXRlZ3lGaWx0ZXJlZCA9IDE7CiAgQERlcHJlY2F0ZWQoIlVzZSBzdHJhdGVneUZpbHRlcmVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgU1RSQVRFR1lfRklMVEVSRUQgPSAxOwoKICAvLy8gVXNlIHRoaXMgc3RyYXRlZ3kgdG8gZm9yY2UgSHVmZm1hbiBlbmNvZGluZyBvbmx5IChubyBzdHJpbmcgbWF0Y2gpCiAgc3RhdGljIGNvbnN0IGludCBzdHJhdGVneUh1ZmZtYW5Pbmx5ID0gMjsKICBARGVwcmVjYXRlZCgiVXNlIHN0cmF0ZWd5SHVmZm1hbk9ubHkgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBTVFJBVEVHWV9IVUZGTUFOX09OTFkgPSAyOwoKICAvLy8gVXNlIHRoaXMgc3RyYXRlZ3kgdG8gbGltaXQgbWF0Y2ggZGlzdGFuY2VzIHRvIG9uZSAocnVuLWxlbmd0aCBlbmNvZGluZykKICBzdGF0aWMgY29uc3QgaW50IHN0cmF0ZWd5UmxlID0gMzsKICBARGVwcmVjYXRlZCgiVXNlIHN0cmF0ZWd5UmxlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgU1RSQVRFR1lfUkxFID0gMzsKCiAgLy8vIFRoaXMgc3RyYXRlZ3kgcHJldmVudHMgdGhlIHVzZSBvZiBkeW5hbWljIEh1ZmZtYW4gY29kZXMsIGFsbG93aW5nIGZvciBhCiAgLy8vIHNpbXBsZXIgZGVjb2RlcgogIHN0YXRpYyBjb25zdCBpbnQgc3RyYXRlZ3lGaXhlZCA9IDQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBzdHJhdGVneUZpeGVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgU1RSQVRFR1lfRklYRUQgPSA0OwoKICAvLy8gUmVjb21tZW5kZWQgc3RyYXRlZ3kgZm9yIG5vcm1hbCBkYXRhCiAgc3RhdGljIGNvbnN0IGludCBzdHJhdGVneURlZmF1bHQgPSAwOwogIEBEZXByZWNhdGVkKCJVc2Ugc3RyYXRlZ3lEZWZhdWx0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgU1RSQVRFR1lfREVGQVVMVCA9IDA7Cn0KCi8qKgogKiBBbiBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW1pMaWJDb2RlY10uCiAqLwpjb25zdCBaTGliQ29kZWMgemxpYiA9IGNvbnN0IFpMaWJDb2RlYy5fZGVmYXVsdCgpOwpARGVwcmVjYXRlZCgiVXNlIHpsaWIgaW5zdGVhZCIpCmNvbnN0IFpMaWJDb2RlYyBaTElCID0gemxpYjsKCi8qKgogKiBUaGUgW1pMaWJDb2RlY10gZW5jb2RlcyByYXcgYnl0ZXMgdG8gWkxpYiBjb21wcmVzc2VkIGJ5dGVzIGFuZCBkZWNvZGVzIFpMaWIKICogY29tcHJlc3NlZCBieXRlcyB0byByYXcgYnl0ZXMuCiAqLwpjbGFzcyBaTGliQ29kZWMgZXh0ZW5kcyBDb2RlYzxMaXN0PGludD4sIExpc3Q8aW50Pj4gewogIC8qKgogICAqIFdoZW4gdHJ1ZSwgYEdaaXBgIGZyYW1lcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wcmVzc2VkIGRhdGEuCiAgICovCiAgZmluYWwgYm9vbCBnemlwOwoKICAvKioKICAgKiBUaGUgY29tcHJlc3Npb24tW2xldmVsXSBjYW4gYmUgc2V0IGluIHRoZSByYW5nZSBvZiBgLTEuLjlgLCB3aXRoIGA2YCBiZWluZwogICAqIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsLiBMZXZlbHMgYWJvdmUgYDZgIHdpbGwgaGF2ZSBoaWdoZXIKICAgKiBjb21wcmVzc2lvbiByYXRlcyBhdCB0aGUgY29zdCBvZiBtb3JlIENQVSBhbmQgbWVtb3J5IHVzYWdlLiBMZXZlbHMgYmVsb3cKICAgKiBgNmAgd2lsbCB1c2UgbGVzcyBDUFUgYW5kIG1lbW9yeSBhdCB0aGUgY29zdCBvZiBsb3dlciBjb21wcmVzc2lvbiByYXRlcy4KICAgKi8KICBmaW5hbCBpbnQgbGV2ZWw7CgogIC8qKgogICAqIFNwZWNpZmllcyBob3cgbXVjaCBtZW1vcnkgc2hvdWxkIGJlIGFsbG9jYXRlZCBmb3IgdGhlIGludGVybmFsIGNvbXByZXNzaW9uCiAgICogc3RhdGUuIGAxYCB1c2VzIG1pbmltdW0gbWVtb3J5IGJ1dCBpcyBzbG93IGFuZCByZWR1Y2VzIGNvbXByZXNzaW9uIHJhdGlvOwogICAqIGA5YCB1c2VzIG1heGltdW0gbWVtb3J5IGZvciBvcHRpbWFsIHNwZWVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgOGAuCiAgICoKICAgKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKICAgKgogICAqICAgICAoMSA8PCAod2luZG93Qml0cyArIDIpKSArICAoMSA8PCAobWVtTGV2ZWwgKyA5KSkKICAgKiB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzID0gMTUgKyAxMjhLIGZvciBtZW1MZXZlbCA9IDggKGRlZmF1bHQgdmFsdWVzKQogICAqLwogIGZpbmFsIGludCBtZW1MZXZlbDsKCiAgLyoqCiAgICogVHVuZXMgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS4gVXNlIHRoZSB2YWx1ZSBzdHJhdGVneURlZmF1bHQgZm9yIG5vcm1hbAogICAqIGRhdGEsIHN0cmF0ZWd5RmlsdGVyZWQgZm9yIGRhdGEgcHJvZHVjZWQgYnkgYSBmaWx0ZXIgKG9yIHByZWRpY3RvciksCiAgICogc3RyYXRlZ3lIdWZmbWFuT25seSB0byBmb3JjZSBIdWZmbWFuIGVuY29kaW5nIG9ubHkgKG5vIHN0cmluZyBtYXRjaCksIG9yCiAgICogc3RyYXRlZ3lSbGUgdG8gbGltaXQgbWF0Y2ggZGlzdGFuY2VzIHRvIG9uZSAocnVuLWxlbmd0aCBlbmNvZGluZykuCiAgICovCiAgZmluYWwgaW50IHN0cmF0ZWd5OwoKICAvKioKICAgKiBCYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIHdpbmRvdyBzaXplICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiBJdAogICAqIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUuIExhcmdlciB2YWx1ZXMgcmVzdWx0IGluIGJldHRlciBjb21wcmVzc2lvbiBhdAogICAqIHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUKICAgKi8KICBmaW5hbCBpbnQgd2luZG93Qml0czsKCiAgLyoqCiAgICogV2hlbiB0cnVlLCBkZWZsYXRlIGdlbmVyYXRlcyByYXcgZGF0YSB3aXRoIG5vIHpsaWIgaGVhZGVyIG9yIHRyYWlsZXIsIGFuZAogICAqIHdpbGwgbm90IGNvbXB1dGUgYW4gYWRsZXIzMiBjaGVjayB2YWx1ZQogICAqLwogIGZpbmFsIGJvb2wgcmF3OwoKICAvKioKICAgKiBJbml0aWFsIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkuCiAgICoKICAgKiBJdCBzaG91bGQgY29uc2lzdCBvZiBzdHJpbmdzIChieXRlIHNlcXVlbmNlcykgdGhhdCBhcmUgbGlrZWx5IHRvIGJlCiAgICogZW5jb3VudGVyZWQgbGF0ZXIgaW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCwgd2l0aCB0aGUgbW9zdCBjb21tb25seSB1c2VkCiAgICogc3RyaW5ncyBwcmVmZXJhYmx5IHB1dCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnkuIFVzaW5nIGEKICAgKiBkaWN0aW9uYXJ5IGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCBpcyBzaG9ydCBhbmQgY2FuCiAgICogYmUgcHJlZGljdGVkIHdpdGggZ29vZCBhY2N1cmFjeTsgdGhlIGRhdGEgY2FuIHRoZW4gYmUgY29tcHJlc3NlZCBiZXR0ZXIKICAgKiB0aGFuIHdpdGggdGhlIGRlZmF1bHQgZW1wdHkgZGljdGlvbmFyeS4KICAgKi8KICBmaW5hbCBMaXN0PGludD4gZGljdGlvbmFyeTsKCiAgWkxpYkNvZGVjKAogICAgICB7dGhpcy5sZXZlbDogWkxpYk9wdGlvbi5kZWZhdWx0TGV2ZWwsCiAgICAgIHRoaXMud2luZG93Qml0czogWkxpYk9wdGlvbi5kZWZhdWx0V2luZG93Qml0cywKICAgICAgdGhpcy5tZW1MZXZlbDogWkxpYk9wdGlvbi5kZWZhdWx0TWVtTGV2ZWwsCiAgICAgIHRoaXMuc3RyYXRlZ3k6IFpMaWJPcHRpb24uc3RyYXRlZ3lEZWZhdWx0LAogICAgICB0aGlzLmRpY3Rpb25hcnksCiAgICAgIHRoaXMucmF3OiBmYWxzZSwKICAgICAgdGhpcy5nemlwOiBmYWxzZX0pIHsKICAgIF92YWxpZGF0ZVpMaWJlTGV2ZWwobGV2ZWwpOwogICAgX3ZhbGlkYXRlWkxpYk1lbUxldmVsKG1lbUxldmVsKTsKICAgIF92YWxpZGF0ZVpMaWJTdHJhdGVneShzdHJhdGVneSk7CiAgICBfdmFsaWRhdGVaTGliV2luZG93Qml0cyh3aW5kb3dCaXRzKTsKICB9CgogIGNvbnN0IFpMaWJDb2RlYy5fZGVmYXVsdCgpCiAgICAgIDogbGV2ZWwgPSBaTGliT3B0aW9uLmRlZmF1bHRMZXZlbCwKICAgICAgICB3aW5kb3dCaXRzID0gWkxpYk9wdGlvbi5kZWZhdWx0V2luZG93Qml0cywKICAgICAgICBtZW1MZXZlbCA9IFpMaWJPcHRpb24uZGVmYXVsdE1lbUxldmVsLAogICAgICAgIHN0cmF0ZWd5ID0gWkxpYk9wdGlvbi5zdHJhdGVneURlZmF1bHQsCiAgICAgICAgcmF3ID0gZmFsc2UsCiAgICAgICAgZ3ppcCA9IGZhbHNlLAogICAgICAgIGRpY3Rpb25hcnkgPSBudWxsOwoKICAvKioKICAgKiBHZXQgYSBbWkxpYkVuY29kZXJdIGZvciBlbmNvZGluZyB0byBgWkxpYmAgY29tcHJlc3NlZCBkYXRhLgogICAqLwogIFpMaWJFbmNvZGVyIGdldCBlbmNvZGVyID0+IG5ldyBaTGliRW5jb2RlcigKICAgICAgZ3ppcDogZmFsc2UsCiAgICAgIGxldmVsOiBsZXZlbCwKICAgICAgd2luZG93Qml0czogd2luZG93Qml0cywKICAgICAgbWVtTGV2ZWw6IG1lbUxldmVsLAogICAgICBzdHJhdGVneTogc3RyYXRlZ3ksCiAgICAgIGRpY3Rpb25hcnk6IGRpY3Rpb25hcnksCiAgICAgIHJhdzogcmF3KTsKCiAgLyoqCiAgICogR2V0IGEgW1pMaWJEZWNvZGVyXSBmb3IgZGVjb2RpbmcgYFpMaWJgIGNvbXByZXNzZWQgZGF0YS4KICAgKi8KICBaTGliRGVjb2RlciBnZXQgZGVjb2RlciA9PgogICAgICBuZXcgWkxpYkRlY29kZXIod2luZG93Qml0czogd2luZG93Qml0cywgZGljdGlvbmFyeTogZGljdGlvbmFyeSwgcmF3OiByYXcpOwp9CgovKioKICogQW4gaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFtHWmlwQ29kZWNdLgogKi8KY29uc3QgR1ppcENvZGVjIGd6aXAgPSBjb25zdCBHWmlwQ29kZWMuX2RlZmF1bHQoKTsKQERlcHJlY2F0ZWQoIlVzZSBnemlwIGluc3RlYWQiKQpjb25zdCBHWmlwQ29kZWMgR1pJUCA9IGd6aXA7CgovKioKICogVGhlIFtHWmlwQ29kZWNdIGVuY29kZXMgcmF3IGJ5dGVzIHRvIEdaaXAgY29tcHJlc3NlZCBieXRlcyBhbmQgZGVjb2RlcyBHWmlwCiAqIGNvbXByZXNzZWQgYnl0ZXMgdG8gcmF3IGJ5dGVzLgogKgogKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFtaTGliQ29kZWNdIGFuZCBbR1ppcENvZGVjXSBpcyB0aGF0IHRoZSBbR1ppcENvZGVjXQogKiB3cmFwcyB0aGUgYFpMaWJgIGNvbXByZXNzZWQgYnl0ZXMgaW4gYEdaaXBgIGZyYW1lcy4KICovCmNsYXNzIEdaaXBDb2RlYyBleHRlbmRzIENvZGVjPExpc3Q8aW50PiwgTGlzdDxpbnQ+PiB7CiAgLyoqCiAgICogV2hlbiB0cnVlLCBgR1ppcGAgZnJhbWVzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbXByZXNzZWQgZGF0YS4KICAgKi8KICBmaW5hbCBib29sIGd6aXA7CgogIC8qKgogICAqIFRoZSBjb21wcmVzc2lvbi1bbGV2ZWxdIGNhbiBiZSBzZXQgaW4gdGhlIHJhbmdlIG9mIGAtMS4uOWAsIHdpdGggYDZgIGJlaW5nCiAgICogdGhlIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwuIExldmVscyBhYm92ZSBgNmAgd2lsbCBoYXZlIGhpZ2hlcgogICAqIGNvbXByZXNzaW9uIHJhdGVzIGF0IHRoZSBjb3N0IG9mIG1vcmUgQ1BVIGFuZCBtZW1vcnkgdXNhZ2UuIExldmVscyBiZWxvdwogICAqIGA2YCB3aWxsIHVzZSBsZXNzIENQVSBhbmQgbWVtb3J5IGF0IHRoZSBjb3N0IG9mIGxvd2VyIGNvbXByZXNzaW9uIHJhdGVzLgogICAqLwogIGZpbmFsIGludCBsZXZlbDsKCiAgLyoqCiAgICogU3BlY2lmaWVzIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQgYmUgYWxsb2NhdGVkIGZvciB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24KICAgKiBzdGF0ZS4gYDFgIHVzZXMgbWluaW11bSBtZW1vcnkgYnV0IGlzIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW87CiAgICogYDlgIHVzZXMgbWF4aW11bSBtZW1vcnkgZm9yIG9wdGltYWwgc3BlZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGA4YC4KICAgKgogICAqIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgogICAqCiAgICogICAgICgxIDw8ICh3aW5kb3dCaXRzICsgMikpICsgICgxIDw8IChtZW1MZXZlbCArIDkpKQogICAqIHRoYXQgaXM6IDEyOEsgZm9yIHdpbmRvd0JpdHMgPSAxNSArIDEyOEsgZm9yIG1lbUxldmVsID0gOCAoZGVmYXVsdCB2YWx1ZXMpCiAgICovCiAgZmluYWwgaW50IG1lbUxldmVsOwoKICAvKioKICAgKiBUdW5lcyB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiBVc2UgdGhlIHZhbHVlCiAgICogW1pMaWJPcHRpb24uc3RyYXRlZ3lEZWZhdWx0XSBmb3Igbm9ybWFsIGRhdGEsCiAgICogW1pMaWJPcHRpb24uc3RyYXRlZ3lGaWx0ZXJlZF0gZm9yIGRhdGEgcHJvZHVjZWQgYnkgYSBmaWx0ZXIKICAgKiAob3IgcHJlZGljdG9yKSwgW1pMaWJPcHRpb24uc3RyYXRlZ3lIdWZmbWFuT25seV0gdG8gZm9yY2UgSHVmZm1hbgogICAqIGVuY29kaW5nIG9ubHkgKG5vIHN0cmluZyBtYXRjaCksIG9yIFtaTGliT3B0aW9uLnN0cmF0ZWd5UmxlXSB0byBsaW1pdAogICAqIG1hdGNoIGRpc3RhbmNlcyB0byBvbmUgKHJ1bi1sZW5ndGggZW5jb2RpbmcpLgogICAqLwogIGZpbmFsIGludCBzdHJhdGVneTsKCiAgLyoqCiAgICogQmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gSXQKICAgKiBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIGA4Li4xNWAuIExhcmdlciB2YWx1ZXMgcmVzdWx0IGluIGJldHRlciBjb21wcmVzc2lvbgogICAqIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYDE1YAogICAqLwogIGZpbmFsIGludCB3aW5kb3dCaXRzOwoKICAvKioKICAgKiBJbml0aWFsIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkuCiAgICoKICAgKiBJdCBzaG91bGQgY29uc2lzdCBvZiBzdHJpbmdzIChieXRlIHNlcXVlbmNlcykgdGhhdCBhcmUgbGlrZWx5IHRvIGJlCiAgICogZW5jb3VudGVyZWQgbGF0ZXIgaW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCwgd2l0aCB0aGUgbW9zdCBjb21tb25seSB1c2VkCiAgICogc3RyaW5ncyBwcmVmZXJhYmx5IHB1dCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnkuIFVzaW5nIGEKICAgKiBkaWN0aW9uYXJ5IGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCBpcyBzaG9ydCBhbmQgY2FuCiAgICogYmUgcHJlZGljdGVkIHdpdGggZ29vZCBhY2N1cmFjeTsgdGhlIGRhdGEgY2FuIHRoZW4gYmUgY29tcHJlc3NlZCBiZXR0ZXIKICAgKiB0aGFuIHdpdGggdGhlIGRlZmF1bHQgZW1wdHkgZGljdGlvbmFyeS4KICAgKi8KICBmaW5hbCBMaXN0PGludD4gZGljdGlvbmFyeTsKCiAgLyoqCiAgICogV2hlbiB0cnVlLCBkZWZsYXRlIGdlbmVyYXRlcyByYXcgZGF0YSB3aXRoIG5vIHpsaWIgaGVhZGVyIG9yIHRyYWlsZXIsIGFuZAogICAqIHdpbGwgbm90IGNvbXB1dGUgYW4gYWRsZXIzMiBjaGVjayB2YWx1ZQogICAqLwogIGZpbmFsIGJvb2wgcmF3OwoKICBHWmlwQ29kZWMoCiAgICAgIHt0aGlzLmxldmVsOiBaTGliT3B0aW9uLmRlZmF1bHRMZXZlbCwKICAgICAgdGhpcy53aW5kb3dCaXRzOiBaTGliT3B0aW9uLmRlZmF1bHRXaW5kb3dCaXRzLAogICAgICB0aGlzLm1lbUxldmVsOiBaTGliT3B0aW9uLmRlZmF1bHRNZW1MZXZlbCwKICAgICAgdGhpcy5zdHJhdGVneTogWkxpYk9wdGlvbi5zdHJhdGVneURlZmF1bHQsCiAgICAgIHRoaXMuZGljdGlvbmFyeSwKICAgICAgdGhpcy5yYXc6IGZhbHNlLAogICAgICB0aGlzLmd6aXA6IHRydWV9KSB7CiAgICBfdmFsaWRhdGVaTGliZUxldmVsKGxldmVsKTsKICAgIF92YWxpZGF0ZVpMaWJNZW1MZXZlbChtZW1MZXZlbCk7CiAgICBfdmFsaWRhdGVaTGliU3RyYXRlZ3koc3RyYXRlZ3kpOwogICAgX3ZhbGlkYXRlWkxpYldpbmRvd0JpdHMod2luZG93Qml0cyk7CiAgfQoKICBjb25zdCBHWmlwQ29kZWMuX2RlZmF1bHQoKQogICAgICA6IGxldmVsID0gWkxpYk9wdGlvbi5kZWZhdWx0TGV2ZWwsCiAgICAgICAgd2luZG93Qml0cyA9IFpMaWJPcHRpb24uZGVmYXVsdFdpbmRvd0JpdHMsCiAgICAgICAgbWVtTGV2ZWwgPSBaTGliT3B0aW9uLmRlZmF1bHRNZW1MZXZlbCwKICAgICAgICBzdHJhdGVneSA9IFpMaWJPcHRpb24uc3RyYXRlZ3lEZWZhdWx0LAogICAgICAgIHJhdyA9IGZhbHNlLAogICAgICAgIGd6aXAgPSB0cnVlLAogICAgICAgIGRpY3Rpb25hcnkgPSBudWxsOwoKICAvKioKICAgKiBHZXQgYSBbWkxpYkVuY29kZXJdIGZvciBlbmNvZGluZyB0byBgR1ppcGAgY29tcHJlc3NlZCBkYXRhLgogICAqLwogIFpMaWJFbmNvZGVyIGdldCBlbmNvZGVyID0+IG5ldyBaTGliRW5jb2RlcigKICAgICAgZ3ppcDogdHJ1ZSwKICAgICAgbGV2ZWw6IGxldmVsLAogICAgICB3aW5kb3dCaXRzOiB3aW5kb3dCaXRzLAogICAgICBtZW1MZXZlbDogbWVtTGV2ZWwsCiAgICAgIHN0cmF0ZWd5OiBzdHJhdGVneSwKICAgICAgZGljdGlvbmFyeTogZGljdGlvbmFyeSwKICAgICAgcmF3OiByYXcpOwoKICAvKioKICAgKiBHZXQgYSBbWkxpYkRlY29kZXJdIGZvciBkZWNvZGluZyBgR1ppcGAgY29tcHJlc3NlZCBkYXRhLgogICAqLwogIFpMaWJEZWNvZGVyIGdldCBkZWNvZGVyID0+CiAgICAgIG5ldyBaTGliRGVjb2Rlcih3aW5kb3dCaXRzOiB3aW5kb3dCaXRzLCBkaWN0aW9uYXJ5OiBkaWN0aW9uYXJ5LCByYXc6IHJhdyk7Cn0KCi8qKgogKiBUaGUgW1pMaWJFbmNvZGVyXSBlbmNvZGVyIGlzIHVzZWQgYnkgW1pMaWJDb2RlY10gYW5kIFtHWmlwQ29kZWNdIHRvIGNvbXByZXNzCiAqIGRhdGEuCiAqLwpjbGFzcyBaTGliRW5jb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIExpc3Q8aW50Pj4gewogIC8qKgogICAqIFdoZW4gdHJ1ZSwgYEdaaXBgIGZyYW1lcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wcmVzc2VkIGRhdGEuCiAgICovCiAgZmluYWwgYm9vbCBnemlwOwoKICAvKioKICAgKiBUaGUgY29tcHJlc3Npb24tW2xldmVsXSBjYW4gYmUgc2V0IGluIHRoZSByYW5nZSBvZiBgLTEuLjlgLCB3aXRoIGA2YCBiZWluZwogICAqIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsLiBMZXZlbHMgYWJvdmUgYDZgIHdpbGwgaGF2ZSBoaWdoZXIKICAgKiBjb21wcmVzc2lvbiByYXRlcyBhdCB0aGUgY29zdCBvZiBtb3JlIENQVSBhbmQgbWVtb3J5IHVzYWdlLiBMZXZlbHMgYmVsb3cKICAgKiBgNmAgd2lsbCB1c2UgbGVzcyBDUFUgYW5kIG1lbW9yeSBhdCB0aGUgY29zdCBvZiBsb3dlciBjb21wcmVzc2lvbiByYXRlcy4KICAgKi8KICBmaW5hbCBpbnQgbGV2ZWw7CgogIC8qKgogICAqIFNwZWNpZmllcyBob3cgbXVjaCBtZW1vcnkgc2hvdWxkIGJlIGFsbG9jYXRlZCBmb3IgdGhlIGludGVybmFsIGNvbXByZXNzaW9uCiAgICogc3RhdGUuIGAxYCB1c2VzIG1pbmltdW0gbWVtb3J5IGJ1dCBpcyBzbG93IGFuZCByZWR1Y2VzIGNvbXByZXNzaW9uIHJhdGlvOwogICAqIGA5YCB1c2VzIG1heGltdW0gbWVtb3J5IGZvciBvcHRpbWFsIHNwZWVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgOGAuCiAgICoKICAgKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKICAgKgogICAqICAgICAoMSA8PCAod2luZG93Qml0cyArIDIpKSArICAoMSA8PCAobWVtTGV2ZWwgKyA5KSkKICAgKiB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzID0gMTUgKyAxMjhLIGZvciBtZW1MZXZlbCA9IDggKGRlZmF1bHQgdmFsdWVzKQogICAqLwogIGZpbmFsIGludCBtZW1MZXZlbDsKCiAgLyoqCiAgICogVHVuZXMgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS4gVXNlIHRoZSB2YWx1ZQogICAqIFtaTGliT3B0aW9uLnN0cmF0ZWd5RGVmYXVsdF0gZm9yIG5vcm1hbCBkYXRhLAogICAqIFtaTGliT3B0aW9uLnN0cmF0ZWd5RmlsdGVyZWRdIGZvciBkYXRhIHByb2R1Y2VkIGJ5IGEgZmlsdGVyCiAgICogKG9yIHByZWRpY3RvciksIFtaTGliT3B0aW9uLnN0cmF0ZWd5SHVmZm1hbk9ubHldIHRvIGZvcmNlIEh1ZmZtYW4KICAgKiBlbmNvZGluZyBvbmx5IChubyBzdHJpbmcgbWF0Y2gpLCBvciBbWkxpYk9wdGlvbi5zdHJhdGVneVJsZV0gdG8gbGltaXQKICAgKiBtYXRjaCBkaXN0YW5jZXMgdG8gb25lIChydW4tbGVuZ3RoIGVuY29kaW5nKS4KICAgKi8KICBmaW5hbCBpbnQgc3RyYXRlZ3k7CgogIC8qKgogICAqIEJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgd2luZG93IHNpemUgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuIEl0CiAgICogc2hvdWxkIGJlIGluIHRoZSByYW5nZSBgOC4uMTVgLiBMYXJnZXIgdmFsdWVzIHJlc3VsdCBpbiBiZXR0ZXIgY29tcHJlc3Npb24KICAgKiBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGAxNWAKICAgKi8KICBmaW5hbCBpbnQgd2luZG93Qml0czsKCiAgLyoqCiAgICogSW5pdGlhbCBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5LgogICAqCiAgICogSXQgc2hvdWxkIGNvbnNpc3Qgb2Ygc3RyaW5ncyAoYnl0ZSBzZXF1ZW5jZXMpIHRoYXQgYXJlIGxpa2VseSB0byBiZQogICAqIGVuY291bnRlcmVkIGxhdGVyIGluIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQsIHdpdGggdGhlIG1vc3QgY29tbW9ubHkgdXNlZAogICAqIHN0cmluZ3MgcHJlZmVyYWJseSBwdXQgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LiBVc2luZyBhCiAgICogZGljdGlvbmFyeSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc2hvcnQgYW5kIGNhbgogICAqIGJlIHByZWRpY3RlZCB3aXRoIGdvb2QgYWNjdXJhY3k7IHRoZSBkYXRhIGNhbiB0aGVuIGJlIGNvbXByZXNzZWQgYmV0dGVyCiAgICogdGhhbiB3aXRoIHRoZSBkZWZhdWx0IGVtcHR5IGRpY3Rpb25hcnkuCiAgICovCiAgZmluYWwgTGlzdDxpbnQ+IGRpY3Rpb25hcnk7CgogIC8qKgogICAqIFdoZW4gdHJ1ZSwgZGVmbGF0ZSBnZW5lcmF0ZXMgcmF3IGRhdGEgd2l0aCBubyB6bGliIGhlYWRlciBvciB0cmFpbGVyLCBhbmQKICAgKiB3aWxsIG5vdCBjb21wdXRlIGFuIGFkbGVyMzIgY2hlY2sgdmFsdWUKICAgKi8KICBmaW5hbCBib29sIHJhdzsKCiAgWkxpYkVuY29kZXIoCiAgICAgIHt0aGlzLmd6aXA6IGZhbHNlLAogICAgICB0aGlzLmxldmVsOiBaTGliT3B0aW9uLmRlZmF1bHRMZXZlbCwKICAgICAgdGhpcy53aW5kb3dCaXRzOiBaTGliT3B0aW9uLmRlZmF1bHRXaW5kb3dCaXRzLAogICAgICB0aGlzLm1lbUxldmVsOiBaTGliT3B0aW9uLmRlZmF1bHRNZW1MZXZlbCwKICAgICAgdGhpcy5zdHJhdGVneTogWkxpYk9wdGlvbi5zdHJhdGVneURlZmF1bHQsCiAgICAgIHRoaXMuZGljdGlvbmFyeSwKICAgICAgdGhpcy5yYXc6IGZhbHNlfSkgewogICAgX3ZhbGlkYXRlWkxpYmVMZXZlbChsZXZlbCk7CiAgICBfdmFsaWRhdGVaTGliTWVtTGV2ZWwobWVtTGV2ZWwpOwogICAgX3ZhbGlkYXRlWkxpYlN0cmF0ZWd5KHN0cmF0ZWd5KTsKICAgIF92YWxpZGF0ZVpMaWJXaW5kb3dCaXRzKHdpbmRvd0JpdHMpOwogIH0KCiAgLyoqCiAgICogQ29udmVydCBhIGxpc3Qgb2YgYnl0ZXMgdXNpbmcgdGhlIG9wdGlvbnMgZ2l2ZW4gdG8gdGhlIFpMaWJFbmNvZGVyCiAgICogY29uc3RydWN0b3IuCiAgICovCiAgTGlzdDxpbnQ+IGNvbnZlcnQoTGlzdDxpbnQ+IGJ5dGVzKSB7CiAgICBfQnVmZmVyU2luayBzaW5rID0gbmV3IF9CdWZmZXJTaW5rKCk7CiAgICBzdGFydENodW5rZWRDb252ZXJzaW9uKHNpbmspCiAgICAgIC4uYWRkKGJ5dGVzKQogICAgICAuLmNsb3NlKCk7CiAgICByZXR1cm4gc2luay5idWlsZGVyLnRha2VCeXRlcygpOwogIH0KCiAgLyoqCiAgICogU3RhcnQgYSBjaHVua2VkIGNvbnZlcnNpb24gdXNpbmcgdGhlIG9wdGlvbnMgZ2l2ZW4gdG8gdGhlIFtaTGliRW5jb2Rlcl0KICAgKiBjb25zdHJ1Y3Rvci4gV2hpbGUgaXQgYWNjZXB0cyBhbnkgW1NpbmtdIHRha2luZyBbTGlzdDxpbnQ+XSdzLAogICAqIHRoZSBvcHRpbWFsIHNpbmsgdG8gYmUgcGFzc2VkIGFzIFtzaW5rXSBpcyBhIFtCeXRlQ29udmVyc2lvblNpbmtdLgogICAqLwogIEJ5dGVDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8TGlzdDxpbnQ+PiBzaW5rKSB7CiAgICBpZiAoc2luayBpcyEgQnl0ZUNvbnZlcnNpb25TaW5rKSB7CiAgICAgIHNpbmsgPSBuZXcgQnl0ZUNvbnZlcnNpb25TaW5rLmZyb20oc2luayk7CiAgICB9CiAgICByZXR1cm4gbmV3IF9aTGliRW5jb2RlclNpbmsuXygKICAgICAgICBzaW5rLCBnemlwLCBsZXZlbCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5LCBkaWN0aW9uYXJ5LCByYXcpOwogIH0KfQoKLyoqCiAqIFRoZSBbWkxpYkRlY29kZXJdIGlzIHVzZWQgYnkgW1pMaWJDb2RlY10gYW5kIFtHWmlwQ29kZWNdIHRvIGRlY29tcHJlc3MgZGF0YS4KICovCmNsYXNzIFpMaWJEZWNvZGVyIGV4dGVuZHMgQ29udmVydGVyPExpc3Q8aW50PiwgTGlzdDxpbnQ+PiB7CiAgLyoqCiAgICogQmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gSXQKICAgKiBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIGA4Li4xNWAuIExhcmdlciB2YWx1ZXMgcmVzdWx0IGluIGJldHRlciBjb21wcmVzc2lvbgogICAqIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYDE1YC4KICAgKi8KICBmaW5hbCBpbnQgd2luZG93Qml0czsKCiAgLyoqCiAgICogSW5pdGlhbCBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5LgogICAqCiAgICogSXQgc2hvdWxkIGNvbnNpc3Qgb2Ygc3RyaW5ncyAoYnl0ZSBzZXF1ZW5jZXMpIHRoYXQgYXJlIGxpa2VseSB0byBiZQogICAqIGVuY291bnRlcmVkIGxhdGVyIGluIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQsIHdpdGggdGhlIG1vc3QgY29tbW9ubHkgdXNlZAogICAqIHN0cmluZ3MgcHJlZmVyYWJseSBwdXQgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LiBVc2luZyBhCiAgICogZGljdGlvbmFyeSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc2hvcnQgYW5kIGNhbgogICAqIGJlIHByZWRpY3RlZCB3aXRoIGdvb2QgYWNjdXJhY3k7IHRoZSBkYXRhIGNhbiB0aGVuIGJlIGNvbXByZXNzZWQgYmV0dGVyCiAgICogdGhhbiB3aXRoIHRoZSBkZWZhdWx0IGVtcHR5IGRpY3Rpb25hcnkuCiAgICovCiAgZmluYWwgTGlzdDxpbnQ+IGRpY3Rpb25hcnk7CgogIC8qKgogICAqIFdoZW4gdHJ1ZSwgZGVmbGF0ZSBnZW5lcmF0ZXMgcmF3IGRhdGEgd2l0aCBubyB6bGliIGhlYWRlciBvciB0cmFpbGVyLCBhbmQKICAgKiB3aWxsIG5vdCBjb21wdXRlIGFuIGFkbGVyMzIgY2hlY2sgdmFsdWUKICAgKi8KICBmaW5hbCBib29sIHJhdzsKCiAgWkxpYkRlY29kZXIoCiAgICAgIHt0aGlzLndpbmRvd0JpdHM6IFpMaWJPcHRpb24uZGVmYXVsdFdpbmRvd0JpdHMsCiAgICAgIHRoaXMuZGljdGlvbmFyeSwKICAgICAgdGhpcy5yYXc6IGZhbHNlfSkgewogICAgX3ZhbGlkYXRlWkxpYldpbmRvd0JpdHMod2luZG93Qml0cyk7CiAgfQoKICAvKioKICAgKiBDb252ZXJ0IGEgbGlzdCBvZiBieXRlcyB1c2luZyB0aGUgb3B0aW9ucyBnaXZlbiB0byB0aGUgW1pMaWJEZWNvZGVyXQogICAqIGNvbnN0cnVjdG9yLgogICAqLwogIExpc3Q8aW50PiBjb252ZXJ0KExpc3Q8aW50PiBieXRlcykgewogICAgX0J1ZmZlclNpbmsgc2luayA9IG5ldyBfQnVmZmVyU2luaygpOwogICAgc3RhcnRDaHVua2VkQ29udmVyc2lvbihzaW5rKQogICAgICAuLmFkZChieXRlcykKICAgICAgLi5jbG9zZSgpOwogICAgcmV0dXJuIHNpbmsuYnVpbGRlci50YWtlQnl0ZXMoKTsKICB9CgogIC8qKgogICAqIFN0YXJ0IGEgY2h1bmtlZCBjb252ZXJzaW9uLiBXaGlsZSBpdCBhY2NlcHRzIGFueSBbU2lua10KICAgKiB0YWtpbmcgW0xpc3Q8aW50Pl0ncywgdGhlIG9wdGltYWwgc2luayB0byBiZSBwYXNzZWQgYXMgW3NpbmtdIGlzIGEKICAgKiBbQnl0ZUNvbnZlcnNpb25TaW5rXS4KICAgKi8KICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgewogICAgaWYgKHNpbmsgaXMhIEJ5dGVDb252ZXJzaW9uU2luaykgewogICAgICBzaW5rID0gbmV3IEJ5dGVDb252ZXJzaW9uU2luay5mcm9tKHNpbmspOwogICAgfQogICAgcmV0dXJuIG5ldyBfWkxpYkRlY29kZXJTaW5rLl8oc2luaywgd2luZG93Qml0cywgZGljdGlvbmFyeSwgcmF3KTsKICB9Cn0KCi8qKgogKiBUaGUgW1Jhd1pMaWJGaWx0ZXJdIGNsYXNzIHByb3ZpZGVzIGEgbG93LWxldmVsIGludGVyZmFjZSB0byB6bGliLgogKi8KYWJzdHJhY3QgY2xhc3MgUmF3WkxpYkZpbHRlciB7CiAgLyoqCiAgICogUmV0dXJucyBhIGEgW1Jhd1pMaWJGaWx0ZXJdIHdob3NlIFtwcm9jZXNzXSBhbmQgW3Byb2Nlc3NlZF0gbWV0aG9kcwogICAqIGNvbXByZXNzIGRhdGEuCiAgICovCiAgZmFjdG9yeSBSYXdaTGliRmlsdGVyLmRlZmxhdGVGaWx0ZXIoewogICAgYm9vbCBnemlwOiBmYWxzZSwKICAgIGludCBsZXZlbDogWkxpYk9wdGlvbi5kZWZhdWx0TGV2ZWwsCiAgICBpbnQgd2luZG93Qml0czogWkxpYk9wdGlvbi5kZWZhdWx0V2luZG93Qml0cywKICAgIGludCBtZW1MZXZlbDogWkxpYk9wdGlvbi5kZWZhdWx0TWVtTGV2ZWwsCiAgICBpbnQgc3RyYXRlZ3k6IFpMaWJPcHRpb24uc3RyYXRlZ3lEZWZhdWx0LAogICAgTGlzdDxpbnQ+IGRpY3Rpb25hcnksCiAgICBib29sIHJhdzogZmFsc2UsCiAgfSkgewogICAgcmV0dXJuIF9tYWtlWkxpYkRlZmxhdGVGaWx0ZXIoCiAgICAgICAgZ3ppcCwgbGV2ZWwsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwgZGljdGlvbmFyeSwgcmF3KTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBhIFtSYXdaTGliRmlsdGVyXSB3aG9zZSBbcHJvY2Vzc10gYW5kIFtwcm9jZXNzZWRdIG1ldGhvZHMKICAgKiBkZWNvbXByZXNzIGRhdGEuCiAgICovCiAgZmFjdG9yeSBSYXdaTGliRmlsdGVyLmluZmxhdGVGaWx0ZXIoewogICAgaW50IHdpbmRvd0JpdHM6IFpMaWJPcHRpb24uZGVmYXVsdFdpbmRvd0JpdHMsCiAgICBMaXN0PGludD4gZGljdGlvbmFyeSwKICAgIGJvb2wgcmF3OiBmYWxzZSwKICB9KSB7CiAgICByZXR1cm4gX21ha2VaTGliSW5mbGF0ZUZpbHRlcih3aW5kb3dCaXRzLCBkaWN0aW9uYXJ5LCByYXcpOwogIH0KCiAgLyoqCiAgICogQ2FsbCB0byBwcm9jZXNzIGEgY2h1bmsgb2YgZGF0YS4gQSBjYWxsIHRvIFtwcm9jZXNzXSBzaG91bGQgb25seSBiZSBtYWRlCiAgICogd2hlbiBbcHJvY2Vzc2VkXSByZXR1cm5zIFs6bnVsbDpdLgogICAqLwogIHZvaWQgcHJvY2VzcyhMaXN0PGludD4gZGF0YSwgaW50IHN0YXJ0LCBpbnQgZW5kKTsKCiAgLyoqCiAgICogR2V0IGEgY2h1bmsgb2YgcHJvY2Vzc2VkIGRhdGEuIFdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgZGF0YSBhdmFpbGFibGUsCiAgICogW3Byb2Nlc3NlZF0gd2lsbCByZXR1cm4gWzpudWxsOl0uIFNldCBbZmx1c2hdIHRvIFs6ZmFsc2U6XSBmb3Igbm9uLWZpbmFsCiAgICogY2FsbHMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBzb21lIGZpbHRlcnMuCiAgICoKICAgKiBUaGUgbGFzdCBjYWxsIHRvIFtwcm9jZXNzZWRdIHNob3VsZCBoYXZlIFtlbmRdIHNldCB0byBbOnRydWU6XS4gVGhpcyB3aWxsCiAgICogbWFrZSBzdXJlIGFuICdlbmQnIHBhY2tldCBpcyB3cml0dGVuIG9uIHRoZSBzdHJlYW0uCiAgICovCiAgTGlzdDxpbnQ+IHByb2Nlc3NlZCh7Ym9vbCBmbHVzaDogdHJ1ZSwgYm9vbCBlbmQ6IGZhbHNlfSk7CgogIGV4dGVybmFsIHN0YXRpYyBSYXdaTGliRmlsdGVyIF9tYWtlWkxpYkRlZmxhdGVGaWx0ZXIoCiAgICAgIGJvb2wgZ3ppcCwKICAgICAgaW50IGxldmVsLAogICAgICBpbnQgd2luZG93Qml0cywKICAgICAgaW50IG1lbUxldmVsLAogICAgICBpbnQgc3RyYXRlZ3ksCiAgICAgIExpc3Q8aW50PiBkaWN0aW9uYXJ5LAogICAgICBib29sIHJhdyk7CgogIGV4dGVybmFsIHN0YXRpYyBSYXdaTGliRmlsdGVyIF9tYWtlWkxpYkluZmxhdGVGaWx0ZXIoCiAgICAgIGludCB3aW5kb3dCaXRzLCBMaXN0PGludD4gZGljdGlvbmFyeSwgYm9vbCByYXcpOwp9CgpjbGFzcyBfQnVmZmVyU2luayBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2luayB7CiAgZmluYWwgQnl0ZXNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQnl0ZXNCdWlsZGVyKGNvcHk6IGZhbHNlKTsKCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGNodW5rKSB7CiAgICBidWlsZGVyLmFkZChjaHVuayk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKExpc3Q8aW50PiBjaHVuaywgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgaWYgKGNodW5rIGlzIFVpbnQ4TGlzdCkgewogICAgICBVaW50OExpc3QgbGlzdCA9IGNodW5rOwogICAgICBidWlsZGVyLmFkZChuZXcgVWludDhMaXN0LnZpZXcobGlzdC5idWZmZXIsIHN0YXJ0LCBlbmQgLSBzdGFydCkpOwogICAgfSBlbHNlIHsKICAgICAgYnVpbGRlci5hZGQoY2h1bmsuc3VibGlzdChzdGFydCwgZW5kKSk7CiAgICB9CiAgfQoKICB2b2lkIGNsb3NlKCkge30KfQoKY2xhc3MgX1pMaWJFbmNvZGVyU2luayBleHRlbmRzIF9GaWx0ZXJTaW5rIHsKICBfWkxpYkVuY29kZXJTaW5rLl8oCiAgICAgIEJ5dGVDb252ZXJzaW9uU2luayBzaW5rLAogICAgICBib29sIGd6aXAsCiAgICAgIGludCBsZXZlbCwKICAgICAgaW50IHdpbmRvd0JpdHMsCiAgICAgIGludCBtZW1MZXZlbCwKICAgICAgaW50IHN0cmF0ZWd5LAogICAgICBMaXN0PGludD4gZGljdGlvbmFyeSwKICAgICAgYm9vbCByYXcpCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIHNpbmssCiAgICAgICAgICAgIFJhd1pMaWJGaWx0ZXIuX21ha2VaTGliRGVmbGF0ZUZpbHRlcigKICAgICAgICAgICAgICAgIGd6aXAsIGxldmVsLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksIGRpY3Rpb25hcnksIHJhdykpOwp9CgpjbGFzcyBfWkxpYkRlY29kZXJTaW5rIGV4dGVuZHMgX0ZpbHRlclNpbmsgewogIF9aTGliRGVjb2RlclNpbmsuXygKICAgICAgQnl0ZUNvbnZlcnNpb25TaW5rIHNpbmssIGludCB3aW5kb3dCaXRzLCBMaXN0PGludD4gZGljdGlvbmFyeSwgYm9vbCByYXcpCiAgICAgIDogc3VwZXIoc2luaywKICAgICAgICAgICAgUmF3WkxpYkZpbHRlci5fbWFrZVpMaWJJbmZsYXRlRmlsdGVyKHdpbmRvd0JpdHMsIGRpY3Rpb25hcnksIHJhdykpOwp9CgpjbGFzcyBfRmlsdGVyU2luayBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2luayB7CiAgZmluYWwgUmF3WkxpYkZpbHRlciBfZmlsdGVyOwogIGZpbmFsIEJ5dGVDb252ZXJzaW9uU2luayBfc2luazsKICBib29sIF9jbG9zZWQgPSBmYWxzZTsKICBib29sIF9lbXB0eSA9IHRydWU7CgogIF9GaWx0ZXJTaW5rKHRoaXMuX3NpbmssIHRoaXMuX2ZpbHRlcik7CgogIHZvaWQgYWRkKExpc3Q8aW50PiBkYXRhKSB7CiAgICBhZGRTbGljZShkYXRhLCAwLCBkYXRhLmxlbmd0aCwgZmFsc2UpOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gZGF0YSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgaWYgKF9jbG9zZWQpIHJldHVybjsKICAgIGlmIChlbmQgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgiZW5kIik7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBkYXRhLmxlbmd0aCk7CiAgICB0cnkgewogICAgICBfZW1wdHkgPSBmYWxzZTsKICAgICAgX0J1ZmZlckFuZFN0YXJ0IGJ1ZmZlckFuZFN0YXJ0ID0KICAgICAgICAgIF9lbnN1cmVGYXN0QW5kU2VyaWFsaXphYmxlQnl0ZURhdGEoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICAgIF9maWx0ZXIucHJvY2VzcyhidWZmZXJBbmRTdGFydC5idWZmZXIsIGJ1ZmZlckFuZFN0YXJ0LnN0YXJ0LAogICAgICAgICAgZW5kIC0gKHN0YXJ0IC0gYnVmZmVyQW5kU3RhcnQuc3RhcnQpKTsKICAgICAgTGlzdDxpbnQ+IG91dDsKICAgICAgd2hpbGUgKChvdXQgPSBfZmlsdGVyLnByb2Nlc3NlZChmbHVzaDogZmFsc2UpKSAhPSBudWxsKSB7CiAgICAgICAgX3NpbmsuYWRkKG91dCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgX2Nsb3NlZCA9IHRydWU7CiAgICAgIHJldGhyb3c7CiAgICB9CgogICAgaWYgKGlzTGFzdCkgY2xvc2UoKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBpZiAoX2Nsb3NlZCkgcmV0dXJuOwogICAgLy8gQmUgc3VyZSB0byBzZW5kIHByb2Nlc3MgYW4gZW1wdHkgY2h1bmsgb2YgZGF0YS4gV2l0aG91dCB0aGlzLCB0aGUgZW1wdHkKICAgIC8vIG1lc3NhZ2Ugd291bGQgbm90IGhhdmUgYSBHWmlwIGZyYW1lIChpZiBjb21wcmVzc2VkIHdpdGggR1ppcCkuCiAgICBpZiAoX2VtcHR5KSBfZmlsdGVyLnByb2Nlc3MoY29uc3QgW10sIDAsIDApOwogICAgdHJ5IHsKICAgICAgTGlzdDxpbnQ+IG91dDsKICAgICAgd2hpbGUgKChvdXQgPSBfZmlsdGVyLnByb2Nlc3NlZChlbmQ6IHRydWUpKSAhPSBudWxsKSB7CiAgICAgICAgX3NpbmsuYWRkKG91dCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgLy8gVE9ETyhrZXZtb28pOiBub3Qgc3VyZSB3aHkgdGhpcyBpc24ndCBhIHRyeS9maW5hbGx5CiAgICAgIF9jbG9zZWQgPSB0cnVlOwogICAgICB0aHJvdyBlOwogICAgfQogICAgX2Nsb3NlZCA9IHRydWU7CiAgICBfc2luay5jbG9zZSgpOwogIH0KfQoKdm9pZCBfdmFsaWRhdGVaTGliV2luZG93Qml0cyhpbnQgd2luZG93Qml0cykgewogIGlmIChaTGliT3B0aW9uLm1pbldpbmRvd0JpdHMgPiB3aW5kb3dCaXRzIHx8CiAgICAgIFpMaWJPcHRpb24ubWF4V2luZG93Qml0cyA8IHdpbmRvd0JpdHMpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKAogICAgICAgIHdpbmRvd0JpdHMsIFpMaWJPcHRpb24ubWluV2luZG93Qml0cywgWkxpYk9wdGlvbi5tYXhXaW5kb3dCaXRzKTsKICB9Cn0KCnZvaWQgX3ZhbGlkYXRlWkxpYmVMZXZlbChpbnQgbGV2ZWwpIHsKICBpZiAoWkxpYk9wdGlvbi5taW5MZXZlbCA+IGxldmVsIHx8IFpMaWJPcHRpb24ubWF4TGV2ZWwgPCBsZXZlbCkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UobGV2ZWwsIFpMaWJPcHRpb24ubWluTGV2ZWwsIFpMaWJPcHRpb24ubWF4TGV2ZWwpOwogIH0KfQoKdm9pZCBfdmFsaWRhdGVaTGliTWVtTGV2ZWwoaW50IG1lbUxldmVsKSB7CiAgaWYgKFpMaWJPcHRpb24ubWluTWVtTGV2ZWwgPiBtZW1MZXZlbCB8fCBaTGliT3B0aW9uLm1heE1lbUxldmVsIDwgbWVtTGV2ZWwpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKAogICAgICAgIG1lbUxldmVsLCBaTGliT3B0aW9uLm1pbk1lbUxldmVsLCBaTGliT3B0aW9uLm1heE1lbUxldmVsKTsKICB9Cn0KCnZvaWQgX3ZhbGlkYXRlWkxpYlN0cmF0ZWd5KGludCBzdHJhdGVneSkgewogIGNvbnN0IHN0cmF0ZWdpZXMgPSBjb25zdCA8aW50PlsKICAgIFpMaWJPcHRpb24uc3RyYXRlZ3lGaWx0ZXJlZCwKICAgIFpMaWJPcHRpb24uc3RyYXRlZ3lIdWZmbWFuT25seSwKICAgIFpMaWJPcHRpb24uc3RyYXRlZ3lSbGUsCiAgICBaTGliT3B0aW9uLnN0cmF0ZWd5Rml4ZWQsCiAgICBaTGliT3B0aW9uLnN0cmF0ZWd5RGVmYXVsdAogIF07CiAgaWYgKHN0cmF0ZWdpZXMuaW5kZXhPZihzdHJhdGVneSkgPT0gLTEpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJVbnN1cHBvcnRlZCAnc3RyYXRlZ3knIik7CiAgfQp9CoKjAE5OPAERAQQuAz8EHEkkJisoAUkkJyspAUkkKy8tAUMiJiMBQiEmIgFDJSomAUkkKSYBSSQpJgFJKC0qAUgpLioBSSwxLgFOJCklAU4WJisnASsoLSkCAQRBBDMgHQEETyIENgZEBhMBBlBGTk4GEwEGUE9KBTkFOlAGFgEGT0pOSAYWAQZQUToGGAEGTy0GEgEGJQVJUUdPTS0GHgENLDUxMRcXGyAlJSkEAR0pMy8vFRYbAQZBBi4TFB4aGh4RAQY+Bh1RAgEEQQQzIB0BBE8iA043BDYGRAYTAQZQRk5OBhMBBlBPSgU5BTpQBhYBBjQzQUdLMwYWAQZQUD8GGAEGJQVJUUdPTS0GHgEGTy0GEgENLDUxMRcXGiAlJSkEAR0pMy8vFRUbAQZBBi4SFB4aGh4RAQY+Bh1RAgEEUAkEPAZEBhMBBlBGTk4GEwEGUE9KBTkFOlAGFgEGNDNBR0szBhYBBlBQPwYYAQYlBUlRR09NLQYeAQZPLQYSAQ8ZKzUxMRcaICUlKQQBBkgSBicqIRMRJQQBBk1ESAZEJzAGI00EAgEEUAQ8BlBQQAYYAQYlBUlRR09NLQYeAQZPLQYSAQ82FxopBAEGShIGJyohExElBAEGPUgbBkQnMAZGBAIBBEUEHwZJFAYoFigyLi4aFQcjRwQBBkkWBigyGhUHQAQBBk4oBjQBBktOMwVPOQY8ATgRERYUFBwRATg3AgEvPgEeGAQBRB4eSA0uBgQBEgIBLRYfEREWFBQcEA8SMlACAS0WTxRQAgEvHyIYFgEpAR0rBAFDGT05ChYnQEMxFUAYCBIWDwYBGQQBERlPRjEKFT0YCBI9Fg8GFBMEAgEvLy8gSQQCASZEUQQCAStQIEMEAgErIiEkHB4fBSw3BAIBHWRhcnQ6aW8vZGF0YV90cmFuc2Zvcm1lci5kYXJ0LW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9kaXJlY3RvcnkuZGFydK+oLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8qKgogKiBBIHJlZmVyZW5jZSB0byBhIGRpcmVjdG9yeSAob3IgX2ZvbGRlcl8pIG9uIHRoZSBmaWxlIHN5c3RlbS4KICoKICogQSBEaXJlY3RvcnkgaW5zdGFuY2UgaXMgYW4gb2JqZWN0IGhvbGRpbmcgYSBbcGF0aF0gb24gd2hpY2ggb3BlcmF0aW9ucyBjYW4KICogYmUgcGVyZm9ybWVkLiBUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGNhbiBiZSBbYWJzb2x1dGVdIG9yIHJlbGF0aXZlLgogKiBZb3UgY2FuIGdldCB0aGUgcGFyZW50IGRpcmVjdG9yeSB1c2luZyB0aGUgZ2V0dGVyIFtwYXJlbnRdLAogKiBhIHByb3BlcnR5IGluaGVyaXRlZCBmcm9tIFtGaWxlU3lzdGVtRW50aXR5XS4KICoKICogSW4gYWRkaXRpb24gdG8gYmVpbmcgdXNlZCBhcyBhbiBpbnN0YW5jZSB0byBhY2Nlc3MgdGhlIGZpbGUgc3lzdGVtLAogKiBEaXJlY3RvcnkgaGFzIGEgbnVtYmVyIG9mIHN0YXRpYyBwcm9wZXJ0aWVzLCBzdWNoIGFzIFtzeXN0ZW1UZW1wXSwKICogd2hpY2ggZ2V0cyB0aGUgc3lzdGVtJ3MgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYW5kIHRoZSBnZXR0ZXIgYW5kIHNldHRlcgogKiBbY3VycmVudF0sIHdoaWNoIHlvdSBjYW4gdXNlIHRvIGFjY2VzcyBvciBjaGFuZ2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgogKgogKiBDcmVhdGUgYSBuZXcgRGlyZWN0b3J5IG9iamVjdCB3aXRoIGEgcGF0aG5hbWUgdG8gYWNjZXNzIHRoZSBzcGVjaWZpZWQKICogZGlyZWN0b3J5IG9uIHRoZSBmaWxlIHN5c3RlbSBmcm9tIHlvdXIgcHJvZ3JhbS4KICoKICogICAgIHZhciBteURpciA9IG5ldyBEaXJlY3RvcnkoJ215RGlyJyk7CiAqCiAqIE1vc3QgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIG9jY3VyIGluIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcGFpcnMsCiAqIGZvciBleGFtcGxlLCBbY3JlYXRlXSBhbmQgW2NyZWF0ZVN5bmNdLgogKiBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyByZWFzb24gZm9yIHVzaW5nIHRoZSBzeW5jaHJvbm91cyB2ZXJzaW9uCiAqIG9mIGEgbWV0aG9kLCBwcmVmZXIgdGhlIGFzeW5jaHJvbm91cyB2ZXJzaW9uIHRvIGF2b2lkIGJsb2NraW5nIHlvdXIgcHJvZ3JhbS4KICoKICogIyMgQ3JlYXRlIGEgZGlyZWN0b3J5CiAqCiAqIFRoZSBmb2xsb3dpbmcgY29kZSBzYW1wbGUgY3JlYXRlcyBhIGRpcmVjdG9yeSB1c2luZyB0aGUgW2NyZWF0ZV0gbWV0aG9kLgogKiBCeSBzZXR0aW5nIHRoZSBgcmVjdXJzaXZlYCBwYXJhbWV0ZXIgdG8gdHJ1ZSwgeW91IGNhbiBjcmVhdGUgdGhlCiAqIG5hbWVkIGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBuZWNlc3NhcnkgcGFyZW50IGRpcmVjdG9yaWVzLAogKiBpZiB0aGV5IGRvIG5vdCBhbHJlYWR5IGV4aXN0LgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICoKICogICAgIHZvaWQgbWFpbigpIHsKICogICAgICAgLy8gQ3JlYXRlcyBkaXIvIGFuZCBkaXIvc3ViZGlyLy4KICogICAgICAgbmV3IERpcmVjdG9yeSgnZGlyL3N1YmRpcicpLmNyZWF0ZShyZWN1cnNpdmU6IHRydWUpCiAqICAgICAgICAgLy8gVGhlIGNyZWF0ZWQgZGlyZWN0b3J5IGlzIHJldHVybmVkIGFzIGEgRnV0dXJlLgogKiAgICAgICAgIC50aGVuKChEaXJlY3RvcnkgZGlyZWN0b3J5KSB7CiAqICAgICAgICAgICBwcmludChkaXJlY3RvcnkucGF0aCk7CiAqICAgICAgIH0pOwogKiAgICAgfQogKgogKiAjIyBMaXN0IGEgZGlyZWN0b3J5CiAqCiAqIFVzZSB0aGUgW2xpc3RdIG9yIFtsaXN0U3luY10gbWV0aG9kcyB0byBnZXQgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcwogKiBjb250YWluZWQgYnkgYSBkaXJlY3RvcnkuCiAqIFNldCBgcmVjdXJzaXZlYCB0byB0cnVlIHRvIHJlY3Vyc2l2ZWx5IGxpc3QgYWxsIHN1YmRpcmVjdG9yaWVzLgogKiBTZXQgYGZvbGxvd0xpbmtzYCB0byB0cnVlIHRvIGZvbGxvdyBzeW1ib2xpYyBsaW5rcy4KICogVGhlIGxpc3QgbWV0aG9kIHJldHVybnMgYSBbU3RyZWFtXSB0aGF0IHByb3ZpZGVzIEZpbGVTeXN0ZW1FbnRpdHkKICogb2JqZWN0cy4gVXNlIHRoZSBsaXN0ZW4gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBlYWNoIG9iamVjdAogKiBhcyBpdCBiZWNvbWUgYXZhaWxhYmxlLgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICoKICogICAgIHZvaWQgbWFpbigpIHsKICogICAgICAgLy8gR2V0IHRoZSBzeXN0ZW0gdGVtcCBkaXJlY3RvcnkuCiAqICAgICAgIHZhciBzeXN0ZW1UZW1wRGlyID0gRGlyZWN0b3J5LnN5c3RlbVRlbXA7CiAqCiAqICAgICAgIC8vIExpc3QgZGlyZWN0b3J5IGNvbnRlbnRzLCByZWN1cnNpbmcgaW50byBzdWItZGlyZWN0b3JpZXMsCiAqICAgICAgIC8vIGJ1dCBub3QgZm9sbG93aW5nIHN5bWJvbGljIGxpbmtzLgogKiAgICAgICBzeXN0ZW1UZW1wRGlyLmxpc3QocmVjdXJzaXZlOiB0cnVlLCBmb2xsb3dMaW5rczogZmFsc2UpCiAqICAgICAgICAgLmxpc3RlbigoRmlsZVN5c3RlbUVudGl0eSBlbnRpdHkpIHsKICogICAgICAgICAgIHByaW50KGVudGl0eS5wYXRoKTsKICogICAgICAgICB9KTsKICogICAgIH0KICoKICogIyMgVGhlIHVzZSBvZiBGdXR1cmVzCiAqCiAqIEkvTyBvcGVyYXRpb25zIGNhbiBibG9jayBhIHByb2dyYW0gZm9yIHNvbWUgcGVyaW9kIG9mIHRpbWUgd2hpbGUgaXQgd2FpdHMgZm9yCiAqIHRoZSBvcGVyYXRpb24gdG8gY29tcGxldGUuIFRvIGF2b2lkIHRoaXMsIGFsbAogKiBtZXRob2RzIGludm9sdmluZyBJL08gaGF2ZSBhbiBhc3luY2hyb25vdXMgdmFyaWFudCB3aGljaCByZXR1cm5zIGEgW0Z1dHVyZV0uCiAqIFRoaXMgZnV0dXJlIGNvbXBsZXRlcyB3aGVuIHRoZSBJL08gb3BlcmF0aW9uIGZpbmlzaGVzLiBXaGlsZSB0aGUgSS9PCiAqIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcywgdGhlIERhcnQgcHJvZ3JhbSBpcyBub3QgYmxvY2tlZCwKICogYW5kIGNhbiBwZXJmb3JtIG90aGVyIG9wZXJhdGlvbnMuCiAqCiAqIEZvciBleGFtcGxlLAogKiB0aGUgW2V4aXN0c10gbWV0aG9kLCB3aGljaCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRpcmVjdG9yeSBleGlzdHMsCiAqIHJldHVybnMgYSBib29sZWFuIHZhbHVlIHVzaW5nIGEgRnV0dXJlLgogKiBVc2UgYHRoZW5gIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24sIHdoaWNoIGlzIGNhbGxlZCB3aGVuCiAqIHRoZSB2YWx1ZSBpcyByZWFkeS4KICoKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqCiAqICAgICBtYWluKCkgewogKiAgICAgICBmaW5hbCBteURpciA9IG5ldyBEaXJlY3RvcnkoJ2RpcicpOwogKiAgICAgICBteURpci5leGlzdHMoKS50aGVuKChpc1RoZXJlKSB7CiAqICAgICAgICAgaXNUaGVyZSA/IHByaW50KCdleGlzdHMnKSA6IHByaW50KCdub24tZXhpc3RlbnQnKTsKICogICAgICAgfSk7CiAqICAgICB9CiAqCiAqCiAqIEluIGFkZGl0aW9uIHRvIGV4aXN0cywgdGhlIFtzdGF0XSwgW3JlbmFtZV0sIGFuZAogKiBvdGhlciBtZXRob2RzLCByZXR1cm4gRnV0dXJlcy4KICoKICogIyMgT3RoZXIgcmVzb3VyY2VzCiAqCiAqICogW0RhcnQgYnkgRXhhbXBsZV0oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RhcnQtYnktZXhhbXBsZS8jZmlsZXMtZGlyZWN0b3JpZXMtYW5kLXN5bWxpbmtzKQogKiAgIHByb3ZpZGVzIGFkZGl0aW9uYWwgdGFzay1vcmllbnRlZCBjb2RlIHNhbXBsZXMgdGhhdCBzaG93IGhvdyB0byB1c2UKICogICB2YXJpb3VzIEFQSSBmcm9tIHRoZSBEaXJlY3RvcnkgY2xhc3MgYW5kIHRoZSByZWxhdGVkIFtGaWxlXSBjbGFzcy4KICoKICogKiBbSS9PIGZvciBDb21tYW5kLUxpbmUKICogICBBcHBzXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NoMDMuaHRtbCNkYXJ0aW8tLS1pby1mb3ItY29tbWFuZC1saW5lLWFwcHMpCiAqICAgYSBzZWN0aW9uIGZyb20gX0EgVG91ciBvZiB0aGUgRGFydCBMaWJyYXJpZXNfIGNvdmVycyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCiAqCiAqICogW1dyaXRlIENvbW1hbmQtTGluZSBBcHBzXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy90dXRvcmlhbHMvY21kbGluZS8pLAogKiAgIGEgdHV0b3JpYWwgYWJvdXQgd3JpdGluZyBjb21tYW5kLWxpbmUgYXBwcywgaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQKICogICBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmFic3RyYWN0IGNsYXNzIERpcmVjdG9yeSBpbXBsZW1lbnRzIEZpbGVTeXN0ZW1FbnRpdHkgewogIC8qKgogICAqIEdldHMgdGhlIHBhdGggb2YgdGhpcyBkaXJlY3RvcnkuCiAgICovCiAgU3RyaW5nIGdldCBwYXRoOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0RpcmVjdG9yeV0gb2JqZWN0LgogICAqCiAgICogSWYgW3BhdGhdIGlzIGEgcmVsYXRpdmUgcGF0aCwgaXQgd2lsbCBiZSBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUKICAgKiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChzZWUgW0RpcmVjdG9yeS5jdXJyZW50XSksIHdoZW4gdXNlZC4KICAgKgogICAqIElmIFtwYXRoXSBpcyBhbiBhYnNvbHV0ZSBwYXRoLCBpdCB3aWxsIGJlIGltbXVuZSB0byBjaGFuZ2VzIHRvIHRoZQogICAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCiAgICovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGZhY3RvcnkgRGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgX0RpcmVjdG9yeShwYXRoKTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuY3JlYXRlRGlyZWN0b3J5KHBhdGgpOwogIH0KCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGZhY3RvcnkgRGlyZWN0b3J5LmZyb21SYXdQYXRoKFVpbnQ4TGlzdCBwYXRoKSB7CiAgICAvLyBUT0RPKGJrb255aSk6IEhhbmRsZSBvdmVycmlkZXMuCiAgICByZXR1cm4gbmV3IF9EaXJlY3RvcnkuZnJvbVJhd1BhdGgocGF0aCk7CiAgfQoKICAvKioKICAgKiBDcmVhdGUgYSBEaXJlY3Rvcnkgb2JqZWN0IGZyb20gYSBVUkkuCiAgICoKICAgKiBJZiBbdXJpXSBjYW5ub3QgcmVmZXJlbmNlIGEgZGlyZWN0b3J5IHRoaXMgdGhyb3dzIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBmYWN0b3J5IERpcmVjdG9yeS5mcm9tVXJpKFVyaSB1cmkpID0+IG5ldyBEaXJlY3RvcnkodXJpLnRvRmlsZVBhdGgoKSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBkaXJlY3Rvcnkgb2JqZWN0IHBvaW50aW5nIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKICAgKiBkaXJlY3RvcnkuCiAgICovCiAgc3RhdGljIERpcmVjdG9yeSBnZXQgY3VycmVudCB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfRGlyZWN0b3J5LmN1cnJlbnQ7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLmdldEN1cnJlbnREaXJlY3RvcnkoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBbVXJpXSByZXByZXNlbnRpbmcgdGhlIGRpcmVjdG9yeSdzIGxvY2F0aW9uLgogICAqCiAgICogVGhlIHJldHVybmVkIFVSSSdzIHNjaGVtZSBpcyBhbHdheXMgImZpbGUiIGlmIHRoZSBlbnRpdHkncyBbcGF0aF0gaXMKICAgKiBhYnNvbHV0ZSwgb3RoZXJ3aXNlIHRoZSBzY2hlbWUgd2lsbCBiZSBlbXB0eS4KICAgKiBUaGUgcmV0dXJuZWQgVVJJJ3MgcGF0aCBhbHdheXMgZW5kcyBpbiBhIHNsYXNoICgnLycpLgogICAqLwogIFVyaSBnZXQgdXJpOwoKICAvKioKICAgKiBTZXRzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBEYXJ0IHByb2Nlc3MgaW5jbHVkaW5nCiAgICogYWxsIHJ1bm5pbmcgaXNvbGF0ZXMuIFRoZSBuZXcgdmFsdWUgc2V0IGNhbiBiZSBlaXRoZXIgYSBbRGlyZWN0b3J5XQogICAqIG9yIGEgW1N0cmluZ10uCiAgICoKICAgKiBUaGUgbmV3IHZhbHVlIGlzIHBhc3NlZCB0byB0aGUgT1MncyBzeXN0ZW0gY2FsbCB1bmNoYW5nZWQsIHNvIGEKICAgKiByZWxhdGl2ZSBwYXRoIHBhc3NlZCBhcyB0aGUgbmV3IHdvcmtpbmcgZGlyZWN0b3J5IHdpbGwgYmUKICAgKiByZXNvbHZlZCBieSB0aGUgT1MuCiAgICoKICAgKiBOb3RlIHRoYXQgc2V0dGluZyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyBhIHN5bmNocm9ub3VzCiAgICogb3BlcmF0aW9uIGFuZCB0aGF0IGl0IGNoYW5nZXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mICphbGwqCiAgICogaXNvbGF0ZXMuCiAgICoKICAgKiBVc2UgdGhpcyB3aXRoIGNhcmUgLSBlc3BlY2lhbGx5IHdoZW4gd29ya2luZyB3aXRoIGFzeW5jaHJvbm91cwogICAqIG9wZXJhdGlvbnMgYW5kIG11bHRpcGxlIGlzb2xhdGVzLiBDaGFuZ2luZyB0aGUgd29ya2luZyBkaXJlY3RvcnksCiAgICogd2hpbGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYXJlIHBlbmRpbmcgb3Igd2hlbiBvdGhlciBpc29sYXRlcwogICAqIGFyZSB3b3JraW5nIHdpdGggdGhlIGZpbGUgc3lzdGVtLCBjYW4gbGVhZCB0byB1bmV4cGVjdGVkIHJlc3VsdHMuCiAgICovCiAgc3RhdGljIHZvaWQgc2V0IGN1cnJlbnQocGF0aCkgewogICAgZmluYWwgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gSU9PdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICBfRGlyZWN0b3J5LmN1cnJlbnQgPSBwYXRoOwogICAgICByZXR1cm47CiAgICB9CiAgICBvdmVycmlkZXMuc2V0Q3VycmVudERpcmVjdG9yeShwYXRoKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgdGhlIGRpcmVjdG9yeSB3aXRoIHRoaXMgbmFtZS4KICAgKgogICAqIElmIFtyZWN1cnNpdmVdIGlzIGZhbHNlLCBvbmx5IHRoZSBsYXN0IGRpcmVjdG9yeSBpbiB0aGUgcGF0aCBpcwogICAqIGNyZWF0ZWQuIElmIFtyZWN1cnNpdmVdIGlzIHRydWUsIGFsbCBub24tZXhpc3RpbmcgcGF0aCBjb21wb25lbnRzCiAgICogYXJlIGNyZWF0ZWQuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgbm90aGluZyBpcyBkb25lLgogICAqCiAgICogUmV0dXJucyBhIFs6RnV0dXJlPERpcmVjdG9yeT46XSB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoaXMKICAgKiBkaXJlY3Rvcnkgb25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkLiBJZiB0aGUgZGlyZWN0b3J5IGNhbm5vdCBiZQogICAqIGNyZWF0ZWQgdGhlIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBleGNlcHRpb24uCiAgICovCiAgRnV0dXJlPERpcmVjdG9yeT4gY3JlYXRlKHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBjcmVhdGVzIHRoZSBkaXJlY3Rvcnkgd2l0aCB0aGlzIG5hbWUuCiAgICoKICAgKiBJZiBbcmVjdXJzaXZlXSBpcyBmYWxzZSwgb25seSB0aGUgbGFzdCBkaXJlY3RvcnkgaW4gdGhlIHBhdGggaXMKICAgKiBjcmVhdGVkLiBJZiBbcmVjdXJzaXZlXSBpcyB0cnVlLCBhbGwgbm9uLWV4aXN0aW5nIHBhdGggY29tcG9uZW50cwogICAqIGFyZSBjcmVhdGVkLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIG5vdGhpbmcgaXMgZG9uZS4KICAgKgogICAqIElmIHRoZSBkaXJlY3RvcnkgY2Fubm90IGJlIGNyZWF0ZWQgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgKi8KICB2b2lkIGNyZWF0ZVN5bmMoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pOwoKICAvKioKICAgKiBHZXRzIHRoZSBzeXN0ZW0gdGVtcCBkaXJlY3RvcnkuCiAgICoKICAgKiBHZXRzIHRoZSBkaXJlY3RvcnkgcHJvdmlkZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZm9yIGNyZWF0aW5nCiAgICogdGVtcG9yYXJ5IGZpbGVzIGFuZCBkaXJlY3RvcmllcyBpbi4KICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIHN5c3RlbSB0ZW1wIGRpcmVjdG9yeSBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQsCiAgICogYW5kIG1heSBiZSBzZXQgYnkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCiAgICovCiAgc3RhdGljIERpcmVjdG9yeSBnZXQgc3lzdGVtVGVtcCB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfRGlyZWN0b3J5LnN5c3RlbVRlbXA7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLmdldFN5c3RlbVRlbXBEaXJlY3RvcnkoKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIHRoaXMgZGlyZWN0b3J5LiBBZGRpdGlvbmFsIHJhbmRvbQogICAqIGNoYXJhY3RlcnMgYXJlIGFwcGVuZGVkIHRvIFtwcmVmaXhdIHRvIHByb2R1Y2UgYSB1bmlxdWUgZGlyZWN0b3J5CiAgICogbmFtZS4gSWYgW3ByZWZpeF0gaXMgbWlzc2luZyBvciBudWxsLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHVzZWQKICAgKiBmb3IgW3ByZWZpeF0uCiAgICoKICAgKiBSZXR1cm5zIGEgWzpGdXR1cmU8RGlyZWN0b3J5PjpdIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIG5ld2x5CiAgICogY3JlYXRlZCB0ZW1wb3JhcnkgZGlyZWN0b3J5LgogICAqLwogIEZ1dHVyZTxEaXJlY3Rvcnk+IGNyZWF0ZVRlbXAoW1N0cmluZyBwcmVmaXhdKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBjcmVhdGVzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiB0aGlzIGRpcmVjdG9yeS4KICAgKiBBZGRpdGlvbmFsIHJhbmRvbSBjaGFyYWN0ZXJzIGFyZSBhcHBlbmRlZCB0byBbcHJlZml4XSB0byBwcm9kdWNlCiAgICogYSB1bmlxdWUgZGlyZWN0b3J5IG5hbWUuIElmIFtwcmVmaXhdIGlzIG1pc3Npbmcgb3IgbnVsbCwgdGhlIGVtcHR5CiAgICogc3RyaW5nIGlzIHVzZWQgZm9yIFtwcmVmaXhdLgogICAqCiAgICogUmV0dXJucyB0aGUgbmV3bHkgY3JlYXRlZCB0ZW1wb3JhcnkgZGlyZWN0b3J5LgogICAqLwogIERpcmVjdG9yeSBjcmVhdGVUZW1wU3luYyhbU3RyaW5nIHByZWZpeF0pOwoKICBGdXR1cmU8U3RyaW5nPiByZXNvbHZlU3ltYm9saWNMaW5rcygpOwoKICBTdHJpbmcgcmVzb2x2ZVN5bWJvbGljTGlua3NTeW5jKCk7CgogIC8qKgogICAqIFJlbmFtZXMgdGhpcyBkaXJlY3RvcnkuIFJldHVybnMgYSBbOkZ1dHVyZTxEaXJlY3Rvcnk+Ol0gdGhhdCBjb21wbGV0ZXMKICAgKiB3aXRoIGEgW0RpcmVjdG9yeV0gaW5zdGFuY2UgZm9yIHRoZSByZW5hbWVkIGRpcmVjdG9yeS4KICAgKgogICAqIElmIG5ld1BhdGggaWRlbnRpZmllcyBhbiBleGlzdGluZyBkaXJlY3RvcnksIHRoYXQgZGlyZWN0b3J5IGlzCiAgICogcmVwbGFjZWQuIElmIG5ld1BhdGggaWRlbnRpZmllcyBhbiBleGlzdGluZyBmaWxlLCB0aGUgb3BlcmF0aW9uCiAgICogZmFpbHMgYW5kIHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXhjZXB0aW9uLgogICAqLwogIEZ1dHVyZTxEaXJlY3Rvcnk+IHJlbmFtZShTdHJpbmcgbmV3UGF0aCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgcmVuYW1lcyB0aGlzIGRpcmVjdG9yeS4gUmV0dXJucyBhIFtEaXJlY3RvcnldCiAgICogaW5zdGFuY2UgZm9yIHRoZSByZW5hbWVkIGRpcmVjdG9yeS4KICAgKgogICAqIElmIG5ld1BhdGggaWRlbnRpZmllcyBhbiBleGlzdGluZyBkaXJlY3RvcnksIHRoYXQgZGlyZWN0b3J5IGlzCiAgICogcmVwbGFjZWQuIElmIG5ld1BhdGggaWRlbnRpZmllcyBhbiBleGlzdGluZyBmaWxlIHRoZSBvcGVyYXRpb24KICAgKiBmYWlscyBhbmQgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgKi8KICBEaXJlY3RvcnkgcmVuYW1lU3luYyhTdHJpbmcgbmV3UGF0aCk7CgogIC8qKgogICAqIFJldHVybnMgYSBbRGlyZWN0b3J5XSBpbnN0YW5jZSB3aG9zZSBwYXRoIGlzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIFt0aGlzXS4KICAgKgogICAqIFRoZSBhYnNvbHV0ZSBwYXRoIGlzIGNvbXB1dGVkIGJ5IHByZWZpeGluZwogICAqIGEgcmVsYXRpdmUgcGF0aCB3aXRoIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgcmV0dXJuaW5nCiAgICogYW4gYWJzb2x1dGUgcGF0aCB1bmNoYW5nZWQuCiAgICovCiAgRGlyZWN0b3J5IGdldCBhYnNvbHV0ZTsKCiAgLyoqCiAgICogTGlzdHMgdGhlIHN1Yi1kaXJlY3RvcmllcyBhbmQgZmlsZXMgb2YgdGhpcyBbRGlyZWN0b3J5XS4KICAgKiBPcHRpb25hbGx5IHJlY3Vyc2VzIGludG8gc3ViLWRpcmVjdG9yaWVzLgogICAqCiAgICogSWYgW2ZvbGxvd0xpbmtzXSBpcyBmYWxzZSwgdGhlbiBhbnkgc3ltYm9saWMgbGlua3MgZm91bmQKICAgKiBhcmUgcmVwb3J0ZWQgYXMgW0xpbmtdIG9iamVjdHMsIHJhdGhlciB0aGFuIGFzIGRpcmVjdG9yaWVzIG9yIGZpbGVzLAogICAqIGFuZCBhcmUgbm90IHJlY3Vyc2VkIGludG8uCiAgICoKICAgKiBJZiBbZm9sbG93TGlua3NdIGlzIHRydWUsIHRoZW4gd29ya2luZyBsaW5rcyBhcmUgcmVwb3J0ZWQgYXMKICAgKiBkaXJlY3RvcmllcyBvciBmaWxlcywgZGVwZW5kaW5nIG9uCiAgICogdGhlaXIgdHlwZSwgYW5kIGxpbmtzIHRvIGRpcmVjdG9yaWVzIGFyZSByZWN1cnNlZCBpbnRvLgogICAqIEJyb2tlbiBsaW5rcyBhcmUgcmVwb3J0ZWQgYXMgW0xpbmtdIG9iamVjdHMuCiAgICogSWYgYSBzeW1ib2xpYyBsaW5rIG1ha2VzIGEgbG9vcCBpbiB0aGUgZmlsZSBzeXN0ZW0sIHRoZW4gYSByZWN1cnNpdmUKICAgKiBsaXN0aW5nIHdpbGwgbm90IGZvbGxvdyBhIGxpbmsgdHdpY2UgaW4gdGhlCiAgICogc2FtZSByZWN1cnNpdmUgZGVzY2VudCwgYnV0IHdpbGwgcmVwb3J0IGl0IGFzIGEgW0xpbmtdCiAgICogdGhlIHNlY29uZCB0aW1lIGl0IGlzIHNlZW4uCiAgICoKICAgKiBUaGUgcmVzdWx0IGlzIGEgc3RyZWFtIG9mIFtGaWxlU3lzdGVtRW50aXR5XSBvYmplY3RzCiAgICogZm9yIHRoZSBkaXJlY3RvcmllcywgZmlsZXMsIGFuZCBsaW5rcy4KICAgKi8KICBTdHJlYW08RmlsZVN5c3RlbUVudGl0eT4gbGlzdCgKICAgICAge2Jvb2wgcmVjdXJzaXZlOiBmYWxzZSwgYm9vbCBmb2xsb3dMaW5rczogdHJ1ZX0pOwoKICAvKioKICAgKiBMaXN0cyB0aGUgc3ViLWRpcmVjdG9yaWVzIGFuZCBmaWxlcyBvZiB0aGlzIFtEaXJlY3RvcnldLgogICAqIE9wdGlvbmFsbHkgcmVjdXJzZXMgaW50byBzdWItZGlyZWN0b3JpZXMuCiAgICoKICAgKiBJZiBbZm9sbG93TGlua3NdIGlzIGZhbHNlLCB0aGVuIGFueSBzeW1ib2xpYyBsaW5rcyBmb3VuZAogICAqIGFyZSByZXBvcnRlZCBhcyBbTGlua10gb2JqZWN0cywgcmF0aGVyIHRoYW4gYXMgZGlyZWN0b3JpZXMgb3IgZmlsZXMsCiAgICogYW5kIGFyZSBub3QgcmVjdXJzZWQgaW50by4KICAgKgogICAqIElmIFtmb2xsb3dMaW5rc10gaXMgdHJ1ZSwgdGhlbiB3b3JraW5nIGxpbmtzIGFyZSByZXBvcnRlZCBhcwogICAqIGRpcmVjdG9yaWVzIG9yIGZpbGVzLCBkZXBlbmRpbmcgb24KICAgKiB0aGVpciB0eXBlLCBhbmQgbGlua3MgdG8gZGlyZWN0b3JpZXMgYXJlIHJlY3Vyc2VkIGludG8uCiAgICogQnJva2VuIGxpbmtzIGFyZSByZXBvcnRlZCBhcyBbTGlua10gb2JqZWN0cy4KICAgKiBJZiBhIGxpbmsgbWFrZXMgYSBsb29wIGluIHRoZSBmaWxlIHN5c3RlbSwgdGhlbiBhIHJlY3Vyc2l2ZQogICAqIGxpc3Rpbmcgd2lsbCBub3QgZm9sbG93IGEgbGluayB0d2ljZSBpbiB0aGUKICAgKiBzYW1lIHJlY3Vyc2l2ZSBkZXNjZW50LCBidXQgd2lsbCByZXBvcnQgaXQgYXMgYSBbTGlua10KICAgKiB0aGUgc2Vjb25kIHRpbWUgaXQgaXMgc2Vlbi4KICAgKgogICAqIFJldHVybnMgYSBbTGlzdF0gY29udGFpbmluZyBbRmlsZVN5c3RlbUVudGl0eV0gb2JqZWN0cyBmb3IgdGhlCiAgICogZGlyZWN0b3JpZXMsIGZpbGVzLCBhbmQgbGlua3MuCiAgICovCiAgTGlzdDxGaWxlU3lzdGVtRW50aXR5PiBsaXN0U3luYygKICAgICAge2Jvb2wgcmVjdXJzaXZlOiBmYWxzZSwgYm9vbCBmb2xsb3dMaW5rczogdHJ1ZX0pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIGZvciB0aGlzIERpcmVjdG9yeSBpbnN0YW5jZS4KICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKTsKfQqBWgBOTjwBEQEEQANOSj8xA0dGSksDSTMDKwNLK0dQAxkDTEQ9IQMZAxUqPT0pJA0JAxcDSR1DN0VEGwMZAxUrMwNFLkEvIQ8JAxkDUTFQSD4lAxBHK0QXAxkDEC0pPg0JAwM0IgMWA2FJSAMbalEDUkwcBBo3BiYGEwEGIwVKRQVIIAYcIzcdIwYsBAEcMictBAEGKwVLBkkBBkAQBiE3HSEGLAQBBjwFSjM7Bg8BBkZJFAVFPxkFRkIPBURHRkcGIjcdIQ4GKQQBBisFRUdDBT5ENQY1AQY5BUVHQwVABiwBBiUFRilGMAYkNx0kBi8EAQZIR0QTBUMiBjEBBkRGSCIFNAYtASkBJQEGTDwFREU3BiwBBkEpBUREJwYoAQZPBTBHIQYaAQY+LwU+SiAFQig9MkoxPCEFOiwGITgBBj4vBT5KIAVCKD0yQTE8IQVEJAYjOAEGQgYVAgEWZGFydDppby9kaXJlY3RvcnkuZGFydDJvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vZGlyZWN0b3J5X2ltcGwuZGFydLaaLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCmNsYXNzIF9EaXJlY3RvcnkgZXh0ZW5kcyBGaWxlU3lzdGVtRW50aXR5IGltcGxlbWVudHMgRGlyZWN0b3J5IHsKICBTdHJpbmcgX3BhdGg7CiAgVWludDhMaXN0IF9yYXdQYXRoOwoKICBfRGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChwYXRoLCAncGF0aCcpOwogICAgX3BhdGggPSBwYXRoOwogICAgX3Jhd1BhdGggPSBGaWxlU3lzdGVtRW50aXR5Ll90b1V0ZjhBcnJheShfcGF0aCk7CiAgfQoKICBfRGlyZWN0b3J5LmZyb21SYXdQYXRoKFVpbnQ4TGlzdCByYXdQYXRoKSB7CiAgICBpZiAocmF3UGF0aCA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdyYXdQYXRoIGNhbm5vdCBiZSBudWxsJyk7CiAgICB9CiAgICBfcmF3UGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RvTnVsbFRlcm1pbmF0ZWRVdGY4QXJyYXkocmF3UGF0aCk7CiAgICBfcGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RvU3RyaW5nRnJvbVV0ZjhBcnJheShyYXdQYXRoKTsKICB9CgogIFN0cmluZyBnZXQgcGF0aCA9PiBfcGF0aDsKCiAgZXh0ZXJuYWwgc3RhdGljIF9jdXJyZW50KF9OYW1lc3BhY2UgbmFtZXNwYWNlKTsKICBleHRlcm5hbCBzdGF0aWMgX3NldEN1cnJlbnQoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKTsKICBleHRlcm5hbCBzdGF0aWMgX2NyZWF0ZVRlbXAoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKTsKICBleHRlcm5hbCBzdGF0aWMgU3RyaW5nIF9zeXN0ZW1UZW1wKF9OYW1lc3BhY2UgbmFtZXNwYWNlKTsKICBleHRlcm5hbCBzdGF0aWMgX2V4aXN0cyhfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwogIGV4dGVybmFsIHN0YXRpYyBfY3JlYXRlKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCk7CiAgZXh0ZXJuYWwgc3RhdGljIF9kZWxldGVOYXRpdmUoCiAgICAgIF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwgYm9vbCByZWN1cnNpdmUpOwogIGV4dGVybmFsIHN0YXRpYyBfcmVuYW1lKAogICAgICBfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgsIFN0cmluZyBuZXdQYXRoKTsKICBleHRlcm5hbCBzdGF0aWMgdm9pZCBfZmlsbFdpdGhEaXJlY3RvcnlMaXN0aW5nKAogICAgICBfTmFtZXNwYWNlIG5hbWVzcGFjZSwKICAgICAgTGlzdDxGaWxlU3lzdGVtRW50aXR5PiBsaXN0LAogICAgICBVaW50OExpc3QgcmF3UGF0aCwKICAgICAgYm9vbCByZWN1cnNpdmUsCiAgICAgIGJvb2wgZm9sbG93TGlua3MpOwoKICBzdGF0aWMgRGlyZWN0b3J5IGdldCBjdXJyZW50IHsKICAgIHZhciByZXN1bHQgPSBfY3VycmVudChfTmFtZXNwYWNlLl9uYW1lc3BhY2UpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKAogICAgICAgICAgIkdldHRpbmcgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmYWlsZWQiLCAiIiwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiBuZXcgX0RpcmVjdG9yeShyZXN1bHQpOwogIH0KCiAgc3RhdGljIHZvaWQgc2V0IGN1cnJlbnQocGF0aCkgewogICAgVWludDhMaXN0IF9yYXdQYXRoOwogICAgaWYgKHBhdGggaXMgX0RpcmVjdG9yeSkgewogICAgICAvLyBGb3Igb3VyIGludGVybmFsIERpcmVjdG9yeSBpbXBsZW1lbnRhdGlvbiwgZ28gYWhlYWQgYW5kIHVzZSB0aGUgcmF3CiAgICAgIC8vIHBhdGguCiAgICAgIF9yYXdQYXRoID0gcGF0aC5fcmF3UGF0aDsKICAgIH0gZWxzZSBpZiAocGF0aCBpcyBEaXJlY3RvcnkpIHsKICAgICAgLy8gRklYTUUoYmtvbnlpKTogcGFja2FnZTpmaWxlIHBhc3NlcyBpbiBpbnN0YW5jZXMgb2YgY2xhc3NlcyB3aGljaCBkbwogICAgICAvLyBub3QgaGF2ZSBfcGF0aCBkZWZpbmVkLCBzbyB3ZSB3aWxsIGZhbGxiYWNrIHRvIHVzaW5nIHRoZSBleGlzdGluZwogICAgICAvLyBwYXRoIFN0cmluZyBmb3Igbm93LgogICAgICBfcmF3UGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RvVXRmOEFycmF5KHBhdGgucGF0aCk7CiAgICB9IGVsc2UgaWYgKHBhdGggaXMgU3RyaW5nKSB7CiAgICAgIF9yYXdQYXRoID0gRmlsZVN5c3RlbUVudGl0eS5fdG9VdGY4QXJyYXkocGF0aCk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignJHtFcnJvci5zYWZlVG9TdHJpbmcocGF0aCl9IGlzIG5vdCBhIFN0cmluZyBvcicKICAgICAgICAgICcgRGlyZWN0b3J5Jyk7CiAgICB9CiAgICBpZiAoIV9FbWJlZGRlckNvbmZpZy5fbWF5Q2hkaXIpIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiVGhpcyBlbWJlZGRlciBkaXNhbGxvd3Mgc2V0dGluZyBEaXJlY3RvcnkuY3VycmVudCIpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9zZXRDdXJyZW50KF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgaWYgKHJlc3VsdCBpcyBBcmd1bWVudEVycm9yKSB0aHJvdyByZXN1bHQ7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oCiAgICAgICAgICAiU2V0dGluZyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgfQoKICBVcmkgZ2V0IHVyaSB7CiAgICByZXR1cm4gbmV3IFVyaS5kaXJlY3RvcnkocGF0aCk7CiAgfQoKICBGdXR1cmU8Ym9vbD4gZXhpc3RzKCkgewogICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoCiAgICAgICAgX0lPU2VydmljZS5kaXJlY3RvcnlFeGlzdHMsIFtudWxsLCBfcmF3UGF0aF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25PckVycm9yRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAiRXhpc3RzIGZhaWxlZCIpOwogICAgICB9CiAgICAgIHJldHVybiByZXNwb25zZSA9PSAxOwogICAgfSk7CiAgfQoKICBib29sIGV4aXN0c1N5bmMoKSB7CiAgICB2YXIgcmVzdWx0ID0gX2V4aXN0cyhfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiRXhpc3RzIGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gKHJlc3VsdCA9PSAxKTsKICB9CgogIERpcmVjdG9yeSBnZXQgYWJzb2x1dGUgPT4gbmV3IERpcmVjdG9yeShfYWJzb2x1dGVQYXRoKTsKCiAgRnV0dXJlPERpcmVjdG9yeT4gY3JlYXRlKHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KSB7CiAgICBpZiAocmVjdXJzaXZlKSB7CiAgICAgIHJldHVybiBleGlzdHMoKS50aGVuKChleGlzdHMpIHsKICAgICAgICBpZiAoZXhpc3RzKSByZXR1cm4gdGhpczsKICAgICAgICBpZiAocGF0aCAhPSBwYXJlbnQucGF0aCkgewogICAgICAgICAgcmV0dXJuIHBhcmVudC5jcmVhdGUocmVjdXJzaXZlOiB0cnVlKS50aGVuKChfKSB7CiAgICAgICAgICAgIHJldHVybiBjcmVhdGUoKTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gY3JlYXRlKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfRmlsZS5fZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgICAgX0lPU2VydmljZS5kaXJlY3RvcnlDcmVhdGUsIFtudWxsLCBfcmF3UGF0aF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgICB0aHJvdyBfZXhjZXB0aW9uT3JFcnJvckZyb21SZXNwb25zZShyZXNwb25zZSwgIkNyZWF0aW9uIGZhaWxlZCIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSk7CiAgICB9CiAgfQoKICB2b2lkIGNyZWF0ZVN5bmMoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIGlmIChyZWN1cnNpdmUpIHsKICAgICAgaWYgKGV4aXN0c1N5bmMoKSkgcmV0dXJuOwogICAgICBpZiAocGF0aCAhPSBwYXJlbnQucGF0aCkgewogICAgICAgIHBhcmVudC5jcmVhdGVTeW5jKHJlY3Vyc2l2ZTogdHJ1ZSk7CiAgICAgIH0KICAgIH0KICAgIHZhciByZXN1bHQgPSBfY3JlYXRlKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJDcmVhdGlvbiBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogIH0KCiAgc3RhdGljIERpcmVjdG9yeSBnZXQgc3lzdGVtVGVtcCA9PgogICAgICBuZXcgRGlyZWN0b3J5KF9zeXN0ZW1UZW1wKF9OYW1lc3BhY2UuX25hbWVzcGFjZSkpOwoKICBGdXR1cmU8RGlyZWN0b3J5PiBjcmVhdGVUZW1wKFtTdHJpbmcgcHJlZml4XSkgewogICAgcHJlZml4ID8/PSAnJzsKICAgIGlmIChwYXRoID09ICcnKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJEaXJlY3RvcnkuY3JlYXRlVGVtcCBjYWxsZWQgd2l0aCBhbiBlbXB0eSBwYXRoLiAiCiAgICAgICAgICAiVG8gdXNlIHRoZSBzeXN0ZW0gdGVtcCBkaXJlY3RvcnksIHVzZSBEaXJlY3Rvcnkuc3lzdGVtVGVtcCIpOwogICAgfQogICAgU3RyaW5nIGZ1bGxQcmVmaXg7CiAgICAvLyBGSVhNRShia29ueWkpOiBoZXJlIHdlJ3JlIHVzaW5nIGBwYXRoYCBkaXJlY3RseSwgd2hpY2ggbWlnaHQgY2F1c2UKICAgIC8vIGlzc3VlcyBpZiBpdCBpcyBub3QgVVRGLTggZW5jb2RlZC4KICAgIGlmIChwYXRoLmVuZHNXaXRoKCcvJykgfHwgKFBsYXRmb3JtLmlzV2luZG93cyAmJiBwYXRoLmVuZHNXaXRoKCdcXCcpKSkgewogICAgICBmdWxsUHJlZml4ID0gIiRwYXRoJHByZWZpeCI7CiAgICB9IGVsc2UgewogICAgICBmdWxsUHJlZml4ID0gIiRwYXRoJHtQbGF0Zm9ybS5wYXRoU2VwYXJhdG9yfSRwcmVmaXgiOwogICAgfQogICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoX0lPU2VydmljZS5kaXJlY3RvcnlDcmVhdGVUZW1wLAogICAgICAgIFtudWxsLCBGaWxlU3lzdGVtRW50aXR5Ll90b1V0ZjhBcnJheShmdWxsUHJlZml4KV0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25PckVycm9yRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNyZWF0aW9uIG9mIHRlbXBvcmFyeSBkaXJlY3RvcnkgZmFpbGVkIik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBEaXJlY3RvcnkocmVzcG9uc2UpOwogICAgfSk7CiAgfQoKICBEaXJlY3RvcnkgY3JlYXRlVGVtcFN5bmMoW1N0cmluZyBwcmVmaXhdKSB7CiAgICBwcmVmaXggPz89ICcnOwogICAgaWYgKHBhdGggPT0gJycpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkRpcmVjdG9yeS5jcmVhdGVUZW1wIGNhbGxlZCB3aXRoIGFuIGVtcHR5IHBhdGguICIKICAgICAgICAgICJUbyB1c2UgdGhlIHN5c3RlbSB0ZW1wIGRpcmVjdG9yeSwgdXNlIERpcmVjdG9yeS5zeXN0ZW1UZW1wIik7CiAgICB9CiAgICBTdHJpbmcgZnVsbFByZWZpeDsKICAgIC8vIEZJWE1FKGJrb255aSk6IGhlcmUgd2UncmUgdXNpbmcgYHBhdGhgIGRpcmVjdGx5LCB3aGljaCBtaWdodCBjYXVzZQogICAgLy8gaXNzdWVzIGlmIGl0IGlzIG5vdCBVVEYtOCBlbmNvZGVkLgogICAgaWYgKHBhdGguZW5kc1dpdGgoJy8nKSB8fCAoUGxhdGZvcm0uaXNXaW5kb3dzICYmIHBhdGguZW5kc1dpdGgoJ1xcJykpKSB7CiAgICAgIGZ1bGxQcmVmaXggPSAiJHBhdGgkcHJlZml4IjsKICAgIH0gZWxzZSB7CiAgICAgIGZ1bGxQcmVmaXggPSAiJHBhdGgke1BsYXRmb3JtLnBhdGhTZXBhcmF0b3J9JHByZWZpeCI7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX2NyZWF0ZVRlbXAoCiAgICAgICAgX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBGaWxlU3lzdGVtRW50aXR5Ll90b1V0ZjhBcnJheShmdWxsUHJlZml4KSk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oCiAgICAgICAgICAiQ3JlYXRpb24gb2YgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmYWlsZWQiLCBmdWxsUHJlZml4LCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIG5ldyBEaXJlY3RvcnkocmVzdWx0KTsKICB9CgogIEZ1dHVyZTxEaXJlY3Rvcnk+IF9kZWxldGUoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIHJldHVybiBfRmlsZS5fZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgICAgICBfSU9TZXJ2aWNlLmRpcmVjdG9yeURlbGV0ZSwgW251bGwsIF9yYXdQYXRoLCByZWN1cnNpdmVdKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uT3JFcnJvckZyb21SZXNwb25zZShyZXNwb25zZSwgIkRlbGV0aW9uIGZhaWxlZCIpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICB2b2lkIF9kZWxldGVTeW5jKHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KSB7CiAgICB2YXIgcmVzdWx0ID0gX2RlbGV0ZU5hdGl2ZShfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoLCByZWN1cnNpdmUpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJEZWxldGlvbiBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogIH0KCiAgRnV0dXJlPERpcmVjdG9yeT4gcmVuYW1lKFN0cmluZyBuZXdQYXRoKSB7CiAgICByZXR1cm4gX0ZpbGUuX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICBfSU9TZXJ2aWNlLmRpcmVjdG9yeVJlbmFtZSwgW251bGwsIF9yYXdQYXRoLCBuZXdQYXRoXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbk9yRXJyb3JGcm9tUmVzcG9uc2UocmVzcG9uc2UsICJSZW5hbWUgZmFpbGVkIik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBEaXJlY3RvcnkobmV3UGF0aCk7CiAgICB9KTsKICB9CgogIERpcmVjdG9yeSByZW5hbWVTeW5jKFN0cmluZyBuZXdQYXRoKSB7CiAgICBpZiAobmV3UGF0aCBpcyEgU3RyaW5nKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX3JlbmFtZShfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoLCBuZXdQYXRoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiUmVuYW1lIGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gbmV3IERpcmVjdG9yeShuZXdQYXRoKTsKICB9CgogIFN0cmVhbTxGaWxlU3lzdGVtRW50aXR5PiBsaXN0KAogICAgICB7Ym9vbCByZWN1cnNpdmU6IGZhbHNlLCBib29sIGZvbGxvd0xpbmtzOiB0cnVlfSkgewogICAgcmV0dXJuIG5ldyBfQXN5bmNEaXJlY3RvcnlMaXN0ZXIoCiAgICAgICAgICAgIC8vIEZJWE1FKGJrb255aSk6IGhlcmUgd2UncmUgdXNpbmcgYHBhdGhgIGRpcmVjdGx5LCB3aGljaCBtaWdodCBjYXVzZSBpc3N1ZXMKICAgICAgICAgICAgLy8gaWYgaXQgaXMgbm90IFVURi04IGVuY29kZWQuCiAgICAgICAgICAgIEZpbGVTeXN0ZW1FbnRpdHkuX3RvVXRmOEFycmF5KAogICAgICAgICAgICAgICAgRmlsZVN5c3RlbUVudGl0eS5fZW5zdXJlVHJhaWxpbmdQYXRoU2VwYXJhdG9ycyhwYXRoKSksCiAgICAgICAgICAgIHJlY3Vyc2l2ZSwKICAgICAgICAgICAgZm9sbG93TGlua3MpCiAgICAgICAgLnN0cmVhbTsKICB9CgogIExpc3Q8RmlsZVN5c3RlbUVudGl0eT4gbGlzdFN5bmMoCiAgICAgIHtib29sIHJlY3Vyc2l2ZTogZmFsc2UsIGJvb2wgZm9sbG93TGlua3M6IHRydWV9KSB7CiAgICBpZiAocmVjdXJzaXZlIGlzISBib29sIHx8IGZvbGxvd0xpbmtzIGlzISBib29sKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gPEZpbGVTeXN0ZW1FbnRpdHk+W107CiAgICBfZmlsbFdpdGhEaXJlY3RvcnlMaXN0aW5nKAogICAgICAgIF9OYW1lc3BhY2UuX25hbWVzcGFjZSwKICAgICAgICByZXN1bHQsCiAgICAgICAgLy8gRklYTUUoYmtvbnlpKTogaGVyZSB3ZSdyZSB1c2luZyBgcGF0aGAgZGlyZWN0bHksIHdoaWNoIG1pZ2h0IGNhdXNlIGlzc3VlcwogICAgICAgIC8vIGlmIGl0IGlzIG5vdCBVVEYtOCBlbmNvZGVkLgogICAgICAgIEZpbGVTeXN0ZW1FbnRpdHkuX3RvVXRmOEFycmF5KAogICAgICAgICAgICBGaWxlU3lzdGVtRW50aXR5Ll9lbnN1cmVUcmFpbGluZ1BhdGhTZXBhcmF0b3JzKHBhdGgpKSwKICAgICAgICByZWN1cnNpdmUsCiAgICAgICAgZm9sbG93TGlua3MpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJEaXJlY3Rvcnk6ICckcGF0aCciOwoKICBib29sIF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpID0+CiAgICAgIHJlc3BvbnNlIGlzIExpc3QgJiYgcmVzcG9uc2VbMF0gIT0gX3N1Y2Nlc3NSZXNwb25zZTsKCiAgX2V4Y2VwdGlvbk9yRXJyb3JGcm9tUmVzcG9uc2UocmVzcG9uc2UsIFN0cmluZyBtZXNzYWdlKSB7CiAgICBhc3NlcnQoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpOwogICAgc3dpdGNoIChyZXNwb25zZVtfZXJyb3JSZXNwb25zZUVycm9yVHlwZV0pIHsKICAgICAgY2FzZSBfaWxsZWdhbEFyZ3VtZW50UmVzcG9uc2U6CiAgICAgICAgcmV0dXJuIG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICAgIGNhc2UgX29zRXJyb3JSZXNwb25zZToKICAgICAgICB2YXIgZXJyID0gbmV3IE9TRXJyb3IocmVzcG9uc2VbX29zRXJyb3JSZXNwb25zZU1lc3NhZ2VdLAogICAgICAgICAgICByZXNwb25zZVtfb3NFcnJvclJlc3BvbnNlRXJyb3JDb2RlXSk7CiAgICAgICAgcmV0dXJuIG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKG1lc3NhZ2UsIHBhdGgsIGVycik7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG5ldyBFeGNlcHRpb24oIlVua25vd24gZXJyb3IiKTsKICAgIH0KICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wcyB7CiAgZXh0ZXJuYWwgZmFjdG9yeSBfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHMoaW50IHBvaW50ZXIpOwoKICBpbnQgZ2V0UG9pbnRlcigpOwp9CgpjbGFzcyBfQXN5bmNEaXJlY3RvcnlMaXN0ZXIgewogIHN0YXRpYyBjb25zdCBpbnQgbGlzdEZpbGUgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgbGlzdERpcmVjdG9yeSA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBsaXN0TGluayA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBsaXN0RXJyb3IgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgbGlzdERvbmUgPSA0OwoKICBzdGF0aWMgY29uc3QgaW50IHJlc3BvbnNlVHlwZSA9IDA7CiAgc3RhdGljIGNvbnN0IGludCByZXNwb25zZVBhdGggPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgcmVzcG9uc2VDb21wbGV0ZSA9IDE7CiAgc3RhdGljIGNvbnN0IGludCByZXNwb25zZUVycm9yID0gMjsKCiAgZmluYWwgVWludDhMaXN0IHJhd1BhdGg7CiAgZmluYWwgYm9vbCByZWN1cnNpdmU7CiAgZmluYWwgYm9vbCBmb2xsb3dMaW5rczsKCiAgU3RyZWFtQ29udHJvbGxlcjxGaWxlU3lzdGVtRW50aXR5PiBjb250cm9sbGVyOwogIGJvb2wgY2FuY2VsZWQgPSBmYWxzZTsKICBib29sIG5leHRSdW5uaW5nID0gZmFsc2U7CiAgYm9vbCBjbG9zZWQgPSBmYWxzZTsKICBfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHMgX29wczsKICBDb21wbGV0ZXIgY2xvc2VDb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CgogIF9Bc3luY0RpcmVjdG9yeUxpc3Rlcih0aGlzLnJhd1BhdGgsIHRoaXMucmVjdXJzaXZlLCB0aGlzLmZvbGxvd0xpbmtzKSB7CiAgICBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8RmlsZVN5c3RlbUVudGl0eT4oCiAgICAgICAgb25MaXN0ZW46IG9uTGlzdGVuLCBvblJlc3VtZTogb25SZXN1bWUsIG9uQ2FuY2VsOiBvbkNhbmNlbCwgc3luYzogdHJ1ZSk7CiAgfQoKICAvLyBXQVJOSU5HOgogIC8vIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIG5hdGl2ZQogIC8vIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIGFzeW5jIGRpcmVjdG9yeSBsaXN0ZXIgb3BlcmF0aW9ucy4gSXQgc2hvdWxkCiAgLy8gb25seSBiZSBjYWxsZWQgdG8gcGFzcyB0aGUgcG9pbnRlciB0byB0aGUgSU8gU2VydmljZSwgd2hpY2ggd2lsbCBkZWNyZW1lbnQKICAvLyB0aGUgcmVmZXJlbmNlIGNvdW50IHdoZW4gaXQgaXMgZmluaXNoZWQgd2l0aCBpdC4KICBpbnQgX3BvaW50ZXIoKSB7CiAgICByZXR1cm4gKF9vcHMgPT0gbnVsbCkgPyBudWxsIDogX29wcy5nZXRQb2ludGVyKCk7CiAgfQoKICBTdHJlYW08RmlsZVN5c3RlbUVudGl0eT4gZ2V0IHN0cmVhbSA9PiBjb250cm9sbGVyLnN0cmVhbTsKCiAgdm9pZCBvbkxpc3RlbigpIHsKICAgIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoX0lPU2VydmljZS5kaXJlY3RvcnlMaXN0U3RhcnQsCiAgICAgICAgW251bGwsIHJhd1BhdGgsIHJlY3Vyc2l2ZSwgZm9sbG93TGlua3NdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAocmVzcG9uc2UgaXMgaW50KSB7CiAgICAgICAgX29wcyA9IG5ldyBfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHMocmVzcG9uc2UpOwogICAgICAgIG5leHQoKTsKICAgICAgfSBlbHNlIGlmIChyZXNwb25zZSBpcyBFcnJvcikgewogICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IocmVzcG9uc2UsIHJlc3BvbnNlLnN0YWNrVHJhY2UpOwogICAgICAgIGNsb3NlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXJyb3IocmVzcG9uc2UpOwogICAgICAgIGNsb3NlKCk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCBvblJlc3VtZSgpIHsKICAgIGlmICghbmV4dFJ1bm5pbmcpIHsKICAgICAgbmV4dCgpOwogICAgfQogIH0KCiAgRnV0dXJlIG9uQ2FuY2VsKCkgewogICAgY2FuY2VsZWQgPSB0cnVlOwogICAgLy8gSWYgd2UgYXJlIGFjdGl2ZSwgYnV0IG5vdCByZXF1ZXN0aW5nLCBjbG9zZS4KICAgIGlmICghbmV4dFJ1bm5pbmcpIHsKICAgICAgY2xvc2UoKTsKICAgIH0KCiAgICByZXR1cm4gY2xvc2VDb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgdm9pZCBuZXh0KCkgewogICAgaWYgKGNhbmNlbGVkKSB7CiAgICAgIGNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChjb250cm9sbGVyLmlzUGF1c2VkIHx8IG5leHRSdW5uaW5nKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBwb2ludGVyID0gX3BvaW50ZXIoKTsKICAgIGlmIChwb2ludGVyID09IG51bGwpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgbmV4dFJ1bm5pbmcgPSB0cnVlOwogICAgX0lPU2VydmljZS5fZGlzcGF0Y2goX0lPU2VydmljZS5kaXJlY3RvcnlMaXN0TmV4dCwgW3BvaW50ZXJdKQogICAgICAgIC50aGVuKChyZXN1bHQpIHsKICAgICAgbmV4dFJ1bm5pbmcgPSBmYWxzZTsKICAgICAgaWYgKHJlc3VsdCBpcyBMaXN0KSB7CiAgICAgICAgbmV4dCgpOwogICAgICAgIGFzc2VydChyZXN1bHQubGVuZ3RoICUgMiA9PSAwKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgYXNzZXJ0KGkgJSAyID09IDApOwogICAgICAgICAgc3dpdGNoIChyZXN1bHRbaSsrXSkgewogICAgICAgICAgICBjYXNlIGxpc3RGaWxlOgogICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkKG5ldyBGaWxlLmZyb21SYXdQYXRoKHJlc3VsdFtpXSkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIGxpc3REaXJlY3Rvcnk6CiAgICAgICAgICAgICAgY29udHJvbGxlci5hZGQobmV3IERpcmVjdG9yeS5mcm9tUmF3UGF0aChyZXN1bHRbaV0pKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBsaXN0TGluazoKICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZChuZXcgTGluay5mcm9tUmF3UGF0aChyZXN1bHRbaV0pKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBsaXN0RXJyb3I6CiAgICAgICAgICAgICAgZXJyb3IocmVzdWx0W2ldKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBsaXN0RG9uZToKICAgICAgICAgICAgICBjYW5jZWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpKTsKICAgICAgfQogICAgfSk7CiAgfQoKICB2b2lkIF9jbGVhbnVwKCkgewogICAgY29udHJvbGxlci5jbG9zZSgpOwogICAgY2xvc2VDb21wbGV0ZXIuY29tcGxldGUoKTsKICAgIF9vcHMgPSBudWxsOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIGlmIChjbG9zZWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG5leHRSdW5uaW5nKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNsb3NlZCA9IHRydWU7CgogICAgdmFyIHBvaW50ZXIgPSBfcG9pbnRlcigpOwogICAgaWYgKHBvaW50ZXIgPT0gbnVsbCkgewogICAgICBfY2xlYW51cCgpOwogICAgfSBlbHNlIHsKICAgICAgX0lPU2VydmljZS5fZGlzcGF0Y2goX0lPU2VydmljZS5kaXJlY3RvcnlMaXN0U3RvcCwgW3BvaW50ZXJdKQogICAgICAgICAgLndoZW5Db21wbGV0ZShfY2xlYW51cCk7CiAgICB9CiAgfQoKICB2b2lkIGVycm9yKG1lc3NhZ2UpIHsKICAgIHZhciBlcnJvclR5cGUgPSBtZXNzYWdlW3Jlc3BvbnNlRXJyb3JdW19lcnJvclJlc3BvbnNlRXJyb3JUeXBlXTsKICAgIGlmIChlcnJvclR5cGUgPT0gX2lsbGVnYWxBcmd1bWVudFJlc3BvbnNlKSB7CiAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IobmV3IEFyZ3VtZW50RXJyb3IoKSk7CiAgICB9IGVsc2UgaWYgKGVycm9yVHlwZSA9PSBfb3NFcnJvclJlc3BvbnNlKSB7CiAgICAgIHZhciByZXNwb25zZUVycm9ySW5mbyA9IG1lc3NhZ2VbcmVzcG9uc2VFcnJvcl07CiAgICAgIHZhciBlcnIgPSBuZXcgT1NFcnJvcihyZXNwb25zZUVycm9ySW5mb1tfb3NFcnJvclJlc3BvbnNlTWVzc2FnZV0sCiAgICAgICAgICByZXNwb25zZUVycm9ySW5mb1tfb3NFcnJvclJlc3BvbnNlRXJyb3JDb2RlXSk7CiAgICAgIHZhciBlcnJvclBhdGggPSBtZXNzYWdlW3Jlc3BvbnNlUGF0aF07CiAgICAgIGlmIChlcnJvclBhdGggPT0gbnVsbCkgewogICAgICAgIGVycm9yUGF0aCA9IHV0ZjguZGVjb2RlKHJhd1BhdGgsIGFsbG93TWFsZm9ybWVkOiB0cnVlKTsKICAgICAgfSBlbHNlIGlmIChlcnJvclBhdGggaXMgVWludDhMaXN0KSB7CiAgICAgICAgZXJyb3JQYXRoID0gdXRmOC5kZWNvZGUobWVzc2FnZVtyZXNwb25zZVBhdGhdLCBhbGxvd01hbGZvcm1lZDogdHJ1ZSk7CiAgICAgIH0KICAgICAgY29udHJvbGxlci5hZGRFcnJvcigKICAgICAgICAgIG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJEaXJlY3RvcnkgbGlzdGluZyBmYWlsZWQiLCBlcnJvclBhdGgsIGVycikpOwogICAgfSBlbHNlIHsKICAgICAgY29udHJvbGxlci5hZGRFcnJvcihuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IiKSk7CiAgICB9CiAgfQp9CoHBAE5OPAERAUEQFgEcLhI1BAEuGzkGRT4EARwBMkhIPEREIUAbQDIcIxkWGQEhMh0lQwYjBAEiGB5NDyAkTUseOyE2DU8ZBiYiQAY/Lx0lRQYEARAkBAEaKUgoSAgcCAQBFjsdRAYaBAE6ATYVJiEjOx0OERsKCg0rSipMChUKBgQBLRUgISwIBjsdRgYEASU5ATITFlFJBhdKKk0jDTwGSE0oLUEIJggEAS4TFlFJBhdKKk0jDTwGHksdJUkGIgQBNylFGyhKCBMIBAEuTB1GBgQBLSlRKEgIJQgEASkeIQZEHUQGIwQBITkmWSsrRxcZEQQBIzk2IQYnHx8QVScnQxMWEwQBLQElOwE8KDElJB1BMjwPLwYEAgEqOgEUAgEeISYhIiEBJSUpJgEbGBoBMRkcFyEuAUo5UQQBDktNUDYTNgQBPAEUQEMdNxAmPBEPGREICAQBFBgOBgQBFhU0GA8GASIEARAUDw4GLg4GHhsOBhhCGRscECgyHiEbPxUgRBUbPxUcIBUbHxYMCg9ICAgEARQYHxEEARESDgYXDgYTAR4bEg1EIwYEARhFMTAwNkg5LR9AK04IG1ANRgYEAgEbZGFydDppby9kaXJlY3RvcnlfaW1wbC5kYXJ0M29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9lbWJlZGRlcl9jb25maWcuZGFydIUoLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8vLyBFbWJlZGRlci1zcGVjaWZpYywgZmluZS1ncmFpbmVkIGRhcnQ6aW8gY29uZmlndXJhdGlvbi4KLy8vCi8vLyBUaGlzIGNsYXNzIGNvbnRhaW5zIHBlci1Jc29sYXRlIGZsYWdzIHRoYXQgYW4gZW1iZWRkZXIgY2FuIHNldCB0byBwdXQKLy8vIGZpbmUtZ3JhaW5lZCBsaW1pdGF0aW9ucyBvbiB3aGF0IHByb2Nlc3MtdmlzaWJsZSBvcGVyYXRpb25zIElzb2xhdGVzIGFyZQovLy8gcGVybWl0dGVkIHRvIHVzZSAoZS5nLiBleGl0KCkpLiBCeSBkZWZhdWx0LCB0aGUgd2hvbGUgZGFydDppbyBBUEkgaXMKLy8vIGVuYWJsZWQuIFdoZW4gYSBkaXNhbGxvd2VkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWQsIGFuIGBVbnN1cHBvcnRlZEVycm9yYCBpcwovLy8gdGhyb3duLgpAcHJhZ21hKCd2bTplbnRyeS1wb2ludCcpCmFic3RyYWN0IGNsYXNzIF9FbWJlZGRlckNvbmZpZyB7CiAgLy8vIFRoZSBJc29sYXRlIG1heSBzZXQgRGlyZWN0b3J5LmN1cnJlbnQuCiAgc3RhdGljIGJvb2wgX21heUNoZGlyID0gdHJ1ZTsKCiAgLy8vIFRoZSBJc29sYXRlIG1heSBjYWxsIGV4aXQoKS4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgc3RhdGljIGJvb2wgX21heUV4aXQgPSB0cnVlOwoKICAvLyBUaGUgSXNvbGF0ZSBtYXkgc2V0IFN0ZGluLmVjaG9Nb2RlLgogIEBwcmFnbWEoJ3ZtOmVudHJ5LXBvaW50JykKICBzdGF0aWMgYm9vbCBfbWF5U2V0RWNob01vZGUgPSB0cnVlOwoKICAvLyBUaGUgSXNvbGF0ZSBtYXkgc2V0IFN0ZGluLmxpbmVNb2RlLgogIEBwcmFnbWEoJ3ZtOmVudHJ5LXBvaW50JykKICBzdGF0aWMgYm9vbCBfbWF5U2V0TGluZU1vZGUgPSB0cnVlOwoKICAvLy8gVGhlIElzb2xhdGUgbWF5IGNhbGwgc2xlZXAoKS4KICBAcHJhZ21hKCd2bTplbnRyeS1wb2ludCcpCiAgc3RhdGljIGJvb2wgX21heVNsZWVwID0gdHJ1ZTsKCiAgLy8gVE9ETyh6cmEpOiBDb25zaWRlciBhZGRpbmc6CiAgLy8gLSBhbiBvcHRpb24gdG8gZGlzYWxsb3cgbW9kaWZ5aW5nIFNlY3VyaXR5Q29udGV4dC5kZWZhdWx0Q29udGV4dAogIC8vIC0gYW4gb3B0aW9uIHRvIGRpc2FsbG93IGNsb3Npbmcgc3Rkb3V0IGFuZCBzdGRlcnIuCn0KKABOTjwBEQE7BEpNSVAMGiEtIAEjHB8BKRwmASkcJgEkHCABIUY4AgEcZGFydDppby9lbWJlZGRlcl9jb25maWcuZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vZXZlbnRoYW5kbGVyLmRhcnSBUS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgpjbGFzcyBfRXZlbnRIYW5kbGVyIHsKICBleHRlcm5hbCBzdGF0aWMgdm9pZCBfc2VuZERhdGEoT2JqZWN0IHNlbmRlciwgU2VuZFBvcnQgc2VuZFBvcnQsIGludCBkYXRhKTsKfQoLAE5OPAERARZOAgEZZGFydDppby9ldmVudGhhbmRsZXIuZGFydDdvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvYmluL2V2ZW50aGFuZGxlcl9wYXRjaC5kYXJ0geYvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29tbW9uX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIF9FdmVudEhhbmRsZXIgewogIEBwYXRjaAogIHN0YXRpYyB2b2lkIF9zZW5kRGF0YShPYmplY3Qgc2VuZGVyLCBTZW5kUG9ydCBzZW5kUG9ydCwgaW50IGRhdGEpCiAgICAgIG5hdGl2ZSAiRXZlbnRIYW5kbGVyX1NlbmREYXRhIjsKCiAgc3RhdGljIGludCBfdGltZXJNaWxsaXNlY29uZENsb2NrKCkKICAgICAgbmF0aXZlICJFdmVudEhhbmRsZXJfVGltZXJNaWxsaXNlY29uZENsb2NrIjsKfQoRAE5OPAEgAQcWCUQmASYzAgElZGFydDppby1wYXRjaC9ldmVudGhhbmRsZXJfcGF0Y2guZGFydChvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vZmlsZS5kYXJ0wACFAS8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgovKioKICogVGhlIG1vZGVzIGluIHdoaWNoIGEgRmlsZSBjYW4gYmUgb3BlbmVkLgogKi8KY2xhc3MgRmlsZU1vZGUgewogIC8vLyBUaGUgbW9kZSBmb3Igb3BlbmluZyBhIGZpbGUgb25seSBmb3IgcmVhZGluZy4KICBzdGF0aWMgY29uc3QgcmVhZCA9IGNvbnN0IEZpbGVNb2RlLl9pbnRlcm5hbCgwKTsKICBARGVwcmVjYXRlZCgiVXNlIHJlYWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFJFQUQgPSByZWFkOwoKICAvLy8gTW9kZSBmb3Igb3BlbmluZyBhIGZpbGUgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIFRoZSBmaWxlIGlzCiAgLy8vIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90CiAgLy8vIGFscmVhZHkgZXhpc3QuCiAgc3RhdGljIGNvbnN0IHdyaXRlID0gY29uc3QgRmlsZU1vZGUuX2ludGVybmFsKDEpOwogIEBEZXByZWNhdGVkKCJVc2Ugd3JpdGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFdSSVRFID0gd3JpdGU7CgogIC8vLyBNb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUKICAvLy8gZW5kIG9mIGl0LiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCiAgc3RhdGljIGNvbnN0IGFwcGVuZCA9IGNvbnN0IEZpbGVNb2RlLl9pbnRlcm5hbCgyKTsKICBARGVwcmVjYXRlZCgiVXNlIGFwcGVuZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQVBQRU5EID0gYXBwZW5kOwoKICAvLy8gTW9kZSBmb3Igb3BlbmluZyBhIGZpbGUgZm9yIHdyaXRpbmcgKm9ubHkqLiBUaGUgZmlsZSBpcwogIC8vLyBvdmVyd3JpdHRlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy4gVGhlIGZpbGUgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdAogIC8vLyBhbHJlYWR5IGV4aXN0LgogIHN0YXRpYyBjb25zdCB3cml0ZU9ubHkgPSBjb25zdCBGaWxlTW9kZS5faW50ZXJuYWwoMyk7CiAgQERlcHJlY2F0ZWQoIlVzZSB3cml0ZU9ubHkgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFdSSVRFX09OTFkgPSB3cml0ZU9ubHk7CgogIC8vLyBNb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBmb3Igd3JpdGluZyAqb25seSogdG8gdGhlCiAgLy8vIGVuZCBvZiBpdC4gVGhlIGZpbGUgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgogIHN0YXRpYyBjb25zdCB3cml0ZU9ubHlBcHBlbmQgPSBjb25zdCBGaWxlTW9kZS5faW50ZXJuYWwoNCk7CiAgQERlcHJlY2F0ZWQoIlVzZSB3cml0ZU9ubHlBcHBlbmQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFdSSVRFX09OTFlfQVBQRU5EID0gd3JpdGVPbmx5QXBwZW5kOwoKICBmaW5hbCBpbnQgX21vZGU7CgogIGNvbnN0IEZpbGVNb2RlLl9pbnRlcm5hbCh0aGlzLl9tb2RlKTsKfQoKLy8vIFRoZSBtb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBvbmx5IGZvciByZWFkaW5nLgpARGVwcmVjYXRlZCgiVXNlIEZpbGVNb2RlLnJlYWQgaW5zdGVhZCIpCmNvbnN0IFJFQUQgPSBGaWxlTW9kZS5yZWFkOwoKLy8vIFRoZSBtb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4gVGhlIGZpbGUgaXMKLy8vIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90Ci8vLyBhbHJlYWR5IGV4aXN0LgpARGVwcmVjYXRlZCgiVXNlIEZpbGVNb2RlLndyaXRlIGluc3RlYWQiKQpjb25zdCBXUklURSA9IEZpbGVNb2RlLndyaXRlOwoKLy8vIFRoZSBtb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUKLy8vIGVuZCBvZiBpdC4gVGhlIGZpbGUgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgpARGVwcmVjYXRlZCgiVXNlIEZpbGVNb2RlLmFwcGVuZCBpbnN0ZWFkIikKY29uc3QgQVBQRU5EID0gRmlsZU1vZGUuYXBwZW5kOwoKLy8vIE1vZGUgZm9yIG9wZW5pbmcgYSBmaWxlIGZvciB3cml0aW5nICpvbmx5Ki4gVGhlIGZpbGUgaXMKLy8vIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90Ci8vLyBhbHJlYWR5IGV4aXN0LgpARGVwcmVjYXRlZCgiVXNlIEZpbGVNb2RlLndyaXRlT25seSBpbnN0ZWFkIikKY29uc3QgV1JJVEVfT05MWSA9IEZpbGVNb2RlLndyaXRlT25seTsKCi8vLyBNb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBmb3Igd3JpdGluZyAqb25seSogdG8gdGhlCi8vLyBlbmQgb2YgaXQuIFRoZSBmaWxlIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KQERlcHJlY2F0ZWQoIlVzZSBGaWxlTW9kZS53cml0ZU9ubHlBcHBlbmQgaW5zdGVhZCIpCmNvbnN0IFdSSVRFX09OTFlfQVBQRU5EID0gRmlsZU1vZGUud3JpdGVPbmx5QXBwZW5kOwoKLy8vIFR5cGUgb2YgbG9jayB3aGVuIHJlcXVlc3RpbmcgYSBsb2NrIG9uIGEgZmlsZS4KY2xhc3MgRmlsZUxvY2sgewogIC8vLyBTaGFyZWQgZmlsZSBsb2NrLgogIHN0YXRpYyBjb25zdCBzaGFyZWQgPSBjb25zdCBGaWxlTG9jay5faW50ZXJuYWwoMSk7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaGFyZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFNIQVJFRCA9IHNoYXJlZDsKCiAgLy8vIEV4Y2x1c2l2ZSBmaWxlIGxvY2suCiAgc3RhdGljIGNvbnN0IGV4Y2x1c2l2ZSA9IGNvbnN0IEZpbGVMb2NrLl9pbnRlcm5hbCgyKTsKICBARGVwcmVjYXRlZCgiVXNlIGV4Y2x1c2l2ZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgRVhDTFVTSVZFID0gZXhjbHVzaXZlOwoKICAvLy8gQmxvY2tpbmcgc2hhcmVkIGZpbGUgbG9jay4KICBzdGF0aWMgY29uc3QgYmxvY2tpbmdTaGFyZWQgPSBjb25zdCBGaWxlTG9jay5faW50ZXJuYWwoMyk7CiAgQERlcHJlY2F0ZWQoIlVzZSBibG9ja2luZ1NoYXJlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQkxPQ0tJTkdfU0hBUkVEID0gYmxvY2tpbmdTaGFyZWQ7CgogIC8vLyBCbG9ja2luZyBleGNsdXNpdmUgZmlsZSBsb2NrLgogIHN0YXRpYyBjb25zdCBibG9ja2luZ0V4Y2x1c2l2ZSA9IGNvbnN0IEZpbGVMb2NrLl9pbnRlcm5hbCg0KTsKICBARGVwcmVjYXRlZCgiVXNlIGJsb2NraW5nRXhjbHVzaXZlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBCTE9DS0lOR19FWENMVVNJVkUgPSBibG9ja2luZ0V4Y2x1c2l2ZTsKCiAgZmluYWwgaW50IF90eXBlOwoKICBjb25zdCBGaWxlTG9jay5faW50ZXJuYWwodGhpcy5fdHlwZSk7Cn0KCi8qKgogKiBBIHJlZmVyZW5jZSB0byBhIGZpbGUgb24gdGhlIGZpbGUgc3lzdGVtLgogKgogKiBBIEZpbGUgaW5zdGFuY2UgaXMgYW4gb2JqZWN0IHRoYXQgaG9sZHMgYSBbcGF0aF0gb24gd2hpY2ggb3BlcmF0aW9ucyBjYW4KICogYmUgcGVyZm9ybWVkLgogKiBZb3UgY2FuIGdldCB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgZmlsZSB1c2luZyB0aGUgZ2V0dGVyIFtwYXJlbnRdLAogKiBhIHByb3BlcnR5IGluaGVyaXRlZCBmcm9tIFtGaWxlU3lzdGVtRW50aXR5XS4KICoKICogQ3JlYXRlIGEgbmV3IEZpbGUgb2JqZWN0IHdpdGggYSBwYXRobmFtZSB0byBhY2Nlc3MgdGhlIHNwZWNpZmllZCBmaWxlIG9uIHRoZQogKiBmaWxlIHN5c3RlbSBmcm9tIHlvdXIgcHJvZ3JhbS4KICoKICogICAgIHZhciBteUZpbGUgPSBuZXcgRmlsZSgnZmlsZS50eHQnKTsKICoKICogVGhlIEZpbGUgY2xhc3MgY29udGFpbnMgbWV0aG9kcyBmb3IgbWFuaXB1bGF0aW5nIGZpbGVzIGFuZCB0aGVpciBjb250ZW50cy4KICogVXNpbmcgbWV0aG9kcyBpbiB0aGlzIGNsYXNzLCB5b3UgY2FuIG9wZW4gYW5kIGNsb3NlIGZpbGVzLCByZWFkIHRvIGFuZCB3cml0ZQogKiBmcm9tIHRoZW0sIGNyZWF0ZSBhbmQgZGVsZXRlIHRoZW0sIGFuZCBjaGVjayBmb3IgdGhlaXIgZXhpc3RlbmNlLgogKgogKiBXaGVuIHJlYWRpbmcgb3Igd3JpdGluZyBhIGZpbGUsIHlvdSBjYW4gdXNlIHN0cmVhbXMgKHdpdGggW29wZW5SZWFkXSksCiAqIHJhbmRvbSBhY2Nlc3Mgb3BlcmF0aW9ucyAod2l0aCBbb3Blbl0pLAogKiBvciBjb252ZW5pZW5jZSBtZXRob2RzIHN1Y2ggYXMgW3JlYWRBc1N0cmluZ10sCiAqCiAqIE1vc3QgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIG9jY3VyIGluIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcGFpcnMsCiAqIGZvciBleGFtcGxlLCBbcmVhZEFzU3RyaW5nXSBhbmQgW3JlYWRBc1N0cmluZ1N5bmNdLgogKiBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyByZWFzb24gZm9yIHVzaW5nIHRoZSBzeW5jaHJvbm91cyB2ZXJzaW9uCiAqIG9mIGEgbWV0aG9kLCBwcmVmZXIgdGhlIGFzeW5jaHJvbm91cyB2ZXJzaW9uIHRvIGF2b2lkIGJsb2NraW5nIHlvdXIgcHJvZ3JhbS4KICoKICogIyMgSWYgcGF0aCBpcyBhIGxpbmsKICoKICogSWYgW3BhdGhdIGlzIGEgc3ltYm9saWMgbGluaywgcmF0aGVyIHRoYW4gYSBmaWxlLAogKiB0aGVuIHRoZSBtZXRob2RzIG9mIEZpbGUgb3BlcmF0ZSBvbiB0aGUgdWx0aW1hdGUgdGFyZ2V0IG9mIHRoZQogKiBsaW5rLCBleGNlcHQgZm9yIFtkZWxldGVdIGFuZCBbZGVsZXRlU3luY10sIHdoaWNoIG9wZXJhdGUgb24KICogdGhlIGxpbmsuCiAqCiAqICMjIFJlYWQgZnJvbSBhIGZpbGUKICoKICogVGhlIGZvbGxvd2luZyBjb2RlIHNhbXBsZSByZWFkcyB0aGUgZW50aXJlIGNvbnRlbnRzIGZyb20gYSBmaWxlIGFzIGEgc3RyaW5nCiAqIHVzaW5nIHRoZSBhc3luY2hyb25vdXMgW3JlYWRBc1N0cmluZ10gbWV0aG9kOgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmFzeW5jJzsKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqCiAqICAgICB2b2lkIG1haW4oKSB7CiAqICAgICAgIG5ldyBGaWxlKCdmaWxlLnR4dCcpLnJlYWRBc1N0cmluZygpLnRoZW4oKFN0cmluZyBjb250ZW50cykgewogKiAgICAgICAgIHByaW50KGNvbnRlbnRzKTsKICogICAgICAgfSk7CiAqICAgICB9CiAqCiAqIEEgbW9yZSBmbGV4aWJsZSBhbmQgdXNlZnVsIHdheSB0byByZWFkIGEgZmlsZSBpcyB3aXRoIGEgW1N0cmVhbV0uCiAqIE9wZW4gdGhlIGZpbGUgd2l0aCBbb3BlblJlYWRdLCB3aGljaCByZXR1cm5zIGEgc3RyZWFtIHRoYXQKICogcHJvdmlkZXMgdGhlIGRhdGEgaW4gdGhlIGZpbGUgYXMgY2h1bmtzIG9mIGJ5dGVzLgogKiBMaXN0ZW4gdG8gdGhlIHN0cmVhbSBmb3IgZGF0YSBhbmQgcHJvY2VzcyBhcyBuZWVkZWQuCiAqIFlvdSBjYW4gdXNlIHZhcmlvdXMgdHJhbnNmb3JtZXJzIGluIHN1Y2Nlc3Npb24gdG8gbWFuaXB1bGF0ZSB0aGUKICogZGF0YSBpbnRvIHRoZSByZXF1aXJlZCBmb3JtYXQgb3IgdG8gcHJlcGFyZSBpdCBmb3Igb3V0cHV0LgogKgogKiBZb3UgbWlnaHQgd2FudCB0byB1c2UgYSBzdHJlYW0gdG8gcmVhZCBsYXJnZSBmaWxlcywKICogdG8gbWFuaXB1bGF0ZSB0aGUgZGF0YSB3aXRoIHRyYW5zZm9ybWVycywKICogb3IgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhbm90aGVyIEFQSSwgc3VjaCBhcyBbV2ViU29ja2V0XXMuCiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nOwogKiAgICAgaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwogKiAgICAgaW1wb3J0ICdkYXJ0OmFzeW5jJzsKICoKICogICAgIG1haW4oKSB7CiAqICAgICAgIGZpbmFsIGZpbGUgPSBuZXcgRmlsZSgnZmlsZS50eHQnKTsKICogICAgICAgU3RyZWFtPExpc3Q8aW50Pj4gaW5wdXRTdHJlYW0gPSBmaWxlLm9wZW5SZWFkKCk7CiAqCiAqICAgICAgIGlucHV0U3RyZWFtCiAqICAgICAgICAgLnRyYW5zZm9ybSh1dGY4LmRlY29kZXIpICAgICAgIC8vIERlY29kZSBieXRlcyB0byBVVEYtOC4KICogICAgICAgICAudHJhbnNmb3JtKG5ldyBMaW5lU3BsaXR0ZXIoKSkgLy8gQ29udmVydCBzdHJlYW0gdG8gaW5kaXZpZHVhbCBsaW5lcy4KICogICAgICAgICAubGlzdGVuKChTdHJpbmcgbGluZSkgeyAgICAgICAgLy8gUHJvY2VzcyByZXN1bHRzLgogKiAgICAgICAgICAgICBwcmludCgnJGxpbmU6ICR7bGluZS5sZW5ndGh9IGJ5dGVzJyk7CiAqICAgICAgICAgICB9LAogKiAgICAgICAgICAgb25Eb25lOiAoKSB7IHByaW50KCdGaWxlIGlzIG5vdyBjbG9zZWQuJyk7IH0sCiAqICAgICAgICAgICBvbkVycm9yOiAoZSkgeyBwcmludChlLnRvU3RyaW5nKCkpOyB9KTsKICogICAgIH0KICoKICogIyMgV3JpdGUgdG8gYSBmaWxlCiAqCiAqIFRvIHdyaXRlIGEgc3RyaW5nIHRvIGEgZmlsZSwgdXNlIHRoZSBbd3JpdGVBc1N0cmluZ10gbWV0aG9kOgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICoKICogICAgIHZvaWQgbWFpbigpIHsKICogICAgICAgZmluYWwgZmlsZW5hbWUgPSAnZmlsZS50eHQnOwogKiAgICAgICBuZXcgRmlsZShmaWxlbmFtZSkud3JpdGVBc1N0cmluZygnc29tZSBjb250ZW50JykKICogICAgICAgICAudGhlbigoRmlsZSBmaWxlKSB7CiAqICAgICAgICAgICAvLyBEbyBzb21ldGhpbmcgd2l0aCB0aGUgZmlsZS4KICogICAgICAgICB9KTsKICogICAgIH0KICoKICogWW91IGNhbiBhbHNvIHdyaXRlIHRvIGEgZmlsZSB1c2luZyBhIFtTdHJlYW1dLiBPcGVuIHRoZSBmaWxlIHdpdGgKICogW29wZW5Xcml0ZV0sIHdoaWNoIHJldHVybnMgYW4gW0lPU2lua10gdG8gd2hpY2ggeW91IGNhbiB3cml0ZSBkYXRhLgogKiBCZSBzdXJlIHRvIGNsb3NlIHRoZSBzaW5rIHdpdGggdGhlIFtJT1NpbmsuY2xvc2VdIG1ldGhvZC4KICoKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqCiAqICAgICB2b2lkIG1haW4oKSB7CiAqICAgICAgIHZhciBmaWxlID0gbmV3IEZpbGUoJ2ZpbGUudHh0Jyk7CiAqICAgICAgIHZhciBzaW5rID0gZmlsZS5vcGVuV3JpdGUoKTsKICogICAgICAgc2luay53cml0ZSgnRklMRSBBQ0NFU1NFRCAke25ldyBEYXRlVGltZS5ub3coKX1cbicpOwogKgogKiAgICAgICAvLyBDbG9zZSB0aGUgSU9TaW5rIHRvIGZyZWUgc3lzdGVtIHJlc291cmNlcy4KICogICAgICAgc2luay5jbG9zZSgpOwogKiAgICAgfQogKgogKiAjIyBUaGUgdXNlIG9mIEZ1dHVyZXMKICoKICogVG8gYXZvaWQgdW5pbnRlbnRpb25hbCBibG9ja2luZyBvZiB0aGUgcHJvZ3JhbSwKICogc2V2ZXJhbCBtZXRob2RzIHVzZSBhIFtGdXR1cmVdIHRvIHJldHVybiBhIHZhbHVlLiBGb3IgZXhhbXBsZSwKICogdGhlIFtsZW5ndGhdIG1ldGhvZCwgd2hpY2ggZ2V0cyB0aGUgbGVuZ3RoIG9mIGEgZmlsZSwgcmV0dXJucyBhIEZ1dHVyZS4KICogVXNlIGB0aGVuYCB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLCB3aGljaCBpcyBjYWxsZWQgd2hlbgogKiB0aGUgdmFsdWUgaXMgcmVhZHkuCiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nOwogKgogKiAgICAgbWFpbigpIHsKICogICAgICAgZmluYWwgZmlsZSA9IG5ldyBGaWxlKCdmaWxlLnR4dCcpOwogKgogKiAgICAgICBmaWxlLmxlbmd0aCgpLnRoZW4oKGxlbikgewogKiAgICAgICAgIHByaW50KGxlbik7CiAqICAgICAgIH0pOwogKiAgICAgfQogKgogKiBJbiBhZGRpdGlvbiB0byBsZW5ndGgsIHRoZSBbZXhpc3RzXSwgW2xhc3RNb2RpZmllZF0sIFtzdGF0XSwgYW5kCiAqIG90aGVyIG1ldGhvZHMsIHJldHVybiBGdXR1cmVzLgogKgogKiAjIyBPdGhlciByZXNvdXJjZXMKICoKICogKiBbRGFydCBieSBFeGFtcGxlXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZGFydC1ieS1leGFtcGxlLyNmaWxlcy1kaXJlY3Rvcmllcy1hbmQtc3ltbGlua3MpCiAqICAgcHJvdmlkZXMgYWRkaXRpb25hbCB0YXNrLW9yaWVudGVkIGNvZGUgc2FtcGxlcyB0aGF0IHNob3cgaG93IHRvIHVzZQogKiAgIHZhcmlvdXMgQVBJIGZyb20gdGhlIERpcmVjdG9yeSBjbGFzcyBhbmQgdGhlIHJlbGF0ZWQgW0ZpbGVdIGNsYXNzLgogKgogKiAqIFtJL08gZm9yIENvbW1hbmQtTGluZQogKiAgIEFwcHNdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvY2gwMy5odG1sI2RhcnRpby0tLWlvLWZvci1jb21tYW5kLWxpbmUtYXBwcykKICogICBhIHNlY3Rpb24gZnJvbSBfQSBUb3VyIG9mIHRoZSBEYXJ0IExpYnJhcmllc18gY292ZXJzIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KICoKICogKiBbV3JpdGUgQ29tbWFuZC1MaW5lIEFwcHNdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL3R1dG9yaWFscy9jbWRsaW5lLyksCiAqICAgYSB0dXRvcmlhbCBhYm91dCB3cml0aW5nIGNvbW1hbmQtbGluZSBhcHBzLCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dAogKiAgIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KICovCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKYWJzdHJhY3QgY2xhc3MgRmlsZSBpbXBsZW1lbnRzIEZpbGVTeXN0ZW1FbnRpdHkgewogIC8qKgogICAqIENyZWF0ZXMgYSBbRmlsZV0gb2JqZWN0LgogICAqCiAgICogSWYgW3BhdGhdIGlzIGEgcmVsYXRpdmUgcGF0aCwgaXQgd2lsbCBiZSBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUKICAgKiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChzZWUgW0RpcmVjdG9yeS5jdXJyZW50XSksIHdoZW4gdXNlZC4KICAgKgogICAqIElmIFtwYXRoXSBpcyBhbiBhYnNvbHV0ZSBwYXRoLCBpdCB3aWxsIGJlIGltbXVuZSB0byBjaGFuZ2VzIHRvIHRoZQogICAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCiAgICovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGZhY3RvcnkgRmlsZShTdHJpbmcgcGF0aCkgewogICAgZmluYWwgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gSU9PdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IF9GaWxlKHBhdGgpOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5jcmVhdGVGaWxlKHBhdGgpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIGEgRmlsZSBvYmplY3QgZnJvbSBhIFVSSS4KICAgKgogICAqIElmIFt1cmldIGNhbm5vdCByZWZlcmVuY2UgYSBmaWxlIHRoaXMgdGhyb3dzIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBmYWN0b3J5IEZpbGUuZnJvbVVyaShVcmkgdXJpKSA9PiBuZXcgRmlsZSh1cmkudG9GaWxlUGF0aCgpKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIEZpbGUgb2JqZWN0IGZyb20gYSByYXcgcGF0aCwgdGhhdCBpcywgYSBzZXF1ZW5jZSBvZiBieXRlcwogICAqIGFzIHJlcHJlc2VudGVkIGJ5IHRoZSBPUy4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZmFjdG9yeSBGaWxlLmZyb21SYXdQYXRoKFVpbnQ4TGlzdCByYXdQYXRoKSB7CiAgICAvLyBUT0RPKGJrb255aSk6IEhhbmRsZSBvdmVycmlkZXMuCiAgICByZXR1cm4gbmV3IF9GaWxlLmZyb21SYXdQYXRoKHJhd1BhdGgpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBmaWxlLiBSZXR1cm5zIGEgYEZ1dHVyZTxGaWxlPmAgdGhhdCBjb21wbGV0ZXMgd2l0aAogICAqIHRoZSBmaWxlIHdoZW4gaXQgaGFzIGJlZW4gY3JlYXRlZC4KICAgKgogICAqIElmIFtyZWN1cnNpdmVdIGlzIGZhbHNlLCB0aGUgZGVmYXVsdCwgdGhlIGZpbGUgaXMgY3JlYXRlZCBvbmx5IGlmCiAgICogYWxsIGRpcmVjdG9yaWVzIGluIHRoZSBwYXRoIGV4aXN0LiBJZiBbcmVjdXJzaXZlXSBpcyB0cnVlLCBhbGwKICAgKiBub24tZXhpc3RpbmcgcGF0aCBjb21wb25lbnRzIGFyZSBjcmVhdGVkLgogICAqCiAgICogRXhpc3RpbmcgZmlsZXMgYXJlIGxlZnQgdW50b3VjaGVkIGJ5IFtjcmVhdGVdLiBDYWxsaW5nIFtjcmVhdGVdIG9uIGFuCiAgICogZXhpc3RpbmcgZmlsZSBtaWdodCBmYWlsIGlmIHRoZXJlIGFyZSByZXN0cmljdGl2ZSBwZXJtaXNzaW9ucyBvbgogICAqIHRoZSBmaWxlLgogICAqCiAgICogQ29tcGxldGVzIHRoZSBmdXR1cmUgd2l0aCBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIEZ1dHVyZTxGaWxlPiBjcmVhdGUoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNyZWF0ZSB0aGUgZmlsZS4gRXhpc3RpbmcgZmlsZXMgYXJlIGxlZnQgdW50b3VjaGVkCiAgICogYnkgW2NyZWF0ZVN5bmNdLiBDYWxsaW5nIFtjcmVhdGVTeW5jXSBvbiBhbiBleGlzdGluZyBmaWxlIG1pZ2h0IGZhaWwKICAgKiBpZiB0aGVyZSBhcmUgcmVzdHJpY3RpdmUgcGVybWlzc2lvbnMgb24gdGhlIGZpbGUuCiAgICoKICAgKiBJZiBbcmVjdXJzaXZlXSBpcyBmYWxzZSwgdGhlIGRlZmF1bHQsIHRoZSBmaWxlIGlzIGNyZWF0ZWQKICAgKiBvbmx5IGlmIGFsbCBkaXJlY3RvcmllcyBpbiB0aGUgcGF0aCBleGlzdC4KICAgKiBJZiBbcmVjdXJzaXZlXSBpcyB0cnVlLCBhbGwgbm9uLWV4aXN0aW5nIHBhdGggY29tcG9uZW50cyBhcmUgY3JlYXRlZC4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIHZvaWQgY3JlYXRlU3luYyh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSk7CgogIC8qKgogICAqIFJlbmFtZXMgdGhpcyBmaWxlLiBSZXR1cm5zIGEgYEZ1dHVyZTxGaWxlPmAgdGhhdCBjb21wbGV0ZXMKICAgKiB3aXRoIGEgW0ZpbGVdIGluc3RhbmNlIGZvciB0aGUgcmVuYW1lZCBmaWxlLgogICAqCiAgICogSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZmlsZSwgdGhhdCBmaWxlIGlzCiAgICogcmVwbGFjZWQuIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSwgdGhlCiAgICogb3BlcmF0aW9uIGZhaWxzIGFuZCB0aGUgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGV4Y2VwdGlvbi4KICAgKi8KICBGdXR1cmU8RmlsZT4gcmVuYW1lKFN0cmluZyBuZXdQYXRoKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSByZW5hbWVzIHRoaXMgZmlsZS4gUmV0dXJucyBhIFtGaWxlXQogICAqIGluc3RhbmNlIGZvciB0aGUgcmVuYW1lZCBmaWxlLgogICAqCiAgICogSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZmlsZSwgdGhhdCBmaWxlIGlzCiAgICogcmVwbGFjZWQuIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSB0aGUKICAgKiBvcGVyYXRpb24gZmFpbHMgYW5kIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICovCiAgRmlsZSByZW5hbWVTeW5jKFN0cmluZyBuZXdQYXRoKTsKCiAgLyoqCiAgICogQ29weSB0aGlzIGZpbGUuIFJldHVybnMgYSBgRnV0dXJlPEZpbGU+YCB0aGF0IGNvbXBsZXRlcwogICAqIHdpdGggYSBbRmlsZV0gaW5zdGFuY2UgZm9yIHRoZSBjb3BpZWQgZmlsZS4KICAgKgogICAqIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGZpbGUsIHRoYXQgZmlsZSBpcwogICAqIHJlcGxhY2VkLiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBkaXJlY3RvcnksIHRoZQogICAqIG9wZXJhdGlvbiBmYWlscyBhbmQgdGhlIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBleGNlcHRpb24uCiAgICovCiAgRnV0dXJlPEZpbGU+IGNvcHkoU3RyaW5nIG5ld1BhdGgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNvcHkgdGhpcyBmaWxlLiBSZXR1cm5zIGEgW0ZpbGVdCiAgICogaW5zdGFuY2UgZm9yIHRoZSBjb3BpZWQgZmlsZS4KICAgKgogICAqIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGZpbGUsIHRoYXQgZmlsZSBpcwogICAqIHJlcGxhY2VkLiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBkaXJlY3RvcnkgdGhlCiAgICogb3BlcmF0aW9uIGZhaWxzIGFuZCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAqLwogIEZpbGUgY29weVN5bmMoU3RyaW5nIG5ld1BhdGgpOwoKICAvKioKICAgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZS4gUmV0dXJucyBhIGBGdXR1cmU8aW50PmAgdGhhdAogICAqIGNvbXBsZXRlcyB3aXRoIHRoZSBsZW5ndGggaW4gYnl0ZXMuCiAgICovCiAgRnV0dXJlPGludD4gbGVuZ3RoKCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgZ2V0IHRoZSBsZW5ndGggb2YgdGhlIGZpbGUuCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICBpbnQgbGVuZ3RoU3luYygpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgW0ZpbGVdIGluc3RhbmNlIHdob3NlIHBhdGggaXMgdGhlIGFic29sdXRlIHBhdGggdG8gW3RoaXNdLgogICAqCiAgICogVGhlIGFic29sdXRlIHBhdGggaXMgY29tcHV0ZWQgYnkgcHJlZml4aW5nCiAgICogYSByZWxhdGl2ZSBwYXRoIHdpdGggdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCByZXR1cm5pbmcKICAgKiBhbiBhYnNvbHV0ZSBwYXRoIHVuY2hhbmdlZC4KICAgKi8KICBGaWxlIGdldCBhYnNvbHV0ZTsKCi8qKgogKiBHZXQgdGhlIGxhc3QtYWNjZXNzZWQgdGltZSBvZiB0aGUgZmlsZS4KICoKICogUmV0dXJucyBhIGBGdXR1cmU8RGF0ZVRpbWU+YCB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlCiAqIGZpbGUgd2FzIGxhc3QgYWNjZXNzZWQsIGlmIHRoZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuCiAqCiAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogKi8KICBGdXR1cmU8RGF0ZVRpbWU+IGxhc3RBY2Nlc3NlZCgpOwoKLyoqCiAqIEdldCB0aGUgbGFzdC1hY2Nlc3NlZCB0aW1lIG9mIHRoZSBmaWxlLgogKgogKiBSZXR1cm5zIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIGZpbGUgd2FzIGxhc3QgYWNjZXNzZWQsCiAqIGlmIHRoZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuIEJsb2NrcyB1bnRpbCB0aGUgaW5mb3JtYXRpb24gY2FuIGJlIHJldHVybmVkCiAqIG9yIGl0IGlzIGRldGVybWluZWQgdGhhdCB0aGUgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4KICoKICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAqLwogIERhdGVUaW1lIGxhc3RBY2Nlc3NlZFN5bmMoKTsKCiAgLyoqCiAgICogTW9kaWZpZXMgdGhlIHRpbWUgdGhlIGZpbGUgd2FzIGxhc3QgYWNjZXNzZWQuCiAgICoKICAgKiBSZXR1cm5zIGEgW0Z1dHVyZV0gdGhhdCBjb21wbGV0ZXMgb25jZSB0aGUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIHRpbWUgY2Fubm90IGJlIHNldC4KICAgKi8KICBGdXR1cmUgc2V0TGFzdEFjY2Vzc2VkKERhdGVUaW1lIHRpbWUpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IG1vZGlmaWVzIHRoZSB0aW1lIHRoZSBmaWxlIHdhcyBsYXN0IGFjY2Vzc2VkLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSB0aW1lIGNhbm5vdCBiZSBzZXQuCiAgICovCiAgdm9pZCBzZXRMYXN0QWNjZXNzZWRTeW5jKERhdGVUaW1lIHRpbWUpOwoKLyoqCiAqIEdldCB0aGUgbGFzdC1tb2RpZmllZCB0aW1lIG9mIHRoZSBmaWxlLgogKgogKiBSZXR1cm5zIGEgYEZ1dHVyZTxEYXRlVGltZT5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUKICogZmlsZSB3YXMgbGFzdCBtb2RpZmllZCwgaWYgdGhlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KICoKICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAqLwogIEZ1dHVyZTxEYXRlVGltZT4gbGFzdE1vZGlmaWVkKCk7CgovKioKICogR2V0IHRoZSBsYXN0LW1vZGlmaWVkIHRpbWUgb2YgdGhlIGZpbGUuCiAqCiAqIFJldHVybnMgdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCwKICogaWYgdGhlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4gQmxvY2tzIHVudGlsIHRoZSBpbmZvcm1hdGlvbiBjYW4gYmUgcmV0dXJuZWQKICogb3IgaXQgaXMgZGV0ZXJtaW5lZCB0aGF0IHRoZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLgogKgogKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICovCiAgRGF0ZVRpbWUgbGFzdE1vZGlmaWVkU3luYygpOwoKICAvKioKICAgKiBNb2RpZmllcyB0aGUgdGltZSB0aGUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZC4KICAgKgogICAqIFJldHVybnMgYSBbRnV0dXJlXSB0aGF0IGNvbXBsZXRlcyBvbmNlIHRoZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgdGltZSBjYW5ub3QgYmUgc2V0LgogICAqLwogIEZ1dHVyZSBzZXRMYXN0TW9kaWZpZWQoRGF0ZVRpbWUgdGltZSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgbW9kaWZpZXMgdGhlIHRpbWUgdGhlIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQuCiAgICoKICAgKiBJZiB0aGUgYXR0cmlidXRlcyBjYW5ub3QgYmUgc2V0LCB0aHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0uCiAgICovCiAgdm9pZCBzZXRMYXN0TW9kaWZpZWRTeW5jKERhdGVUaW1lIHRpbWUpOwoKICAvKioKICAgKiBPcGVuIHRoZSBmaWxlIGZvciByYW5kb20gYWNjZXNzIG9wZXJhdGlvbnMuIFJldHVybnMgYQogICAqIGBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIG9wZW5lZAogICAqIHJhbmRvbSBhY2Nlc3MgZmlsZS4gW1JhbmRvbUFjY2Vzc0ZpbGVdcyBtdXN0IGJlIGNsb3NlZCB1c2luZyB0aGUKICAgKiBbUmFuZG9tQWNjZXNzRmlsZS5jbG9zZV0gbWV0aG9kLgogICAqCiAgICogRmlsZXMgY2FuIGJlIG9wZW5lZCBpbiB0aHJlZSBtb2RlczoKICAgKgogICAqIFtGaWxlTW9kZS5yZWFkXTogb3BlbiB0aGUgZmlsZSBmb3IgcmVhZGluZy4KICAgKgogICAqIFtGaWxlTW9kZS53cml0ZV06IG9wZW4gdGhlIGZpbGUgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZyBhbmQKICAgKiB0cnVuY2F0ZSB0aGUgZmlsZSB0byBsZW5ndGggemVyby4gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgdGhlCiAgICogZmlsZSBpcyBjcmVhdGVkLgogICAqCiAgICogW0ZpbGVNb2RlLmFwcGVuZF06IHNhbWUgYXMgW0ZpbGVNb2RlLndyaXRlXSBleGNlcHQgdGhhdCB0aGUgZmlsZSBpcwogICAqIG5vdCB0cnVuY2F0ZWQuCiAgICovCiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IG9wZW4oe0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLnJlYWR9KTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBvcGVuIHRoZSBmaWxlIGZvciByYW5kb20gYWNjZXNzIG9wZXJhdGlvbnMuIFRoZQogICAqIHJlc3VsdCBpcyBhIFtSYW5kb21BY2Nlc3NGaWxlXSBvbiB3aGljaCByYW5kb20gYWNjZXNzIG9wZXJhdGlvbnMKICAgKiBjYW4gYmUgcGVyZm9ybWVkLiBPcGVuZWQgW1JhbmRvbUFjY2Vzc0ZpbGVdcyBtdXN0IGJlIGNsb3NlZCB1c2luZwogICAqIHRoZSBbUmFuZG9tQWNjZXNzRmlsZS5jbG9zZV0gbWV0aG9kLgogICAqCiAgICogU2VlIFtvcGVuXSBmb3IgaW5mb3JtYXRpb24gb24gdGhlIFttb2RlXSBhcmd1bWVudC4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIFJhbmRvbUFjY2Vzc0ZpbGUgb3BlblN5bmMoe0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLnJlYWR9KTsKCiAgLyoqCiAgICogQ3JlYXRlIGEgbmV3IGluZGVwZW5kZW50IFtTdHJlYW1dIGZvciB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlLgogICAqCiAgICogSWYgW3N0YXJ0XSBpcyBwcmVzZW50LCB0aGUgZmlsZSB3aWxsIGJlIHJlYWQgZnJvbSBieXRlLW9mZnNldCBbc3RhcnRdLgogICAqIE90aGVyd2lzZSBmcm9tIHRoZSBiZWdpbm5pbmcgKGluZGV4IDApLgogICAqCiAgICogSWYgW2VuZF0gaXMgcHJlc2VudCwgb25seSB1cCB0byBieXRlLWluZGV4IFtlbmRdIHdpbGwgYmUgcmVhZC4gT3RoZXJ3aXNlLAogICAqIHVudGlsIGVuZCBvZiBmaWxlLgogICAqCiAgICogSW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgc3lzdGVtIHJlc291cmNlcyBhcmUgZnJlZWQsIHRoZSBzdHJlYW0KICAgKiBtdXN0IGJlIHJlYWQgdG8gY29tcGxldGlvbiBvciB0aGUgc3Vic2NyaXB0aW9uIG9uIHRoZSBzdHJlYW0gbXVzdAogICAqIGJlIGNhbmNlbGxlZC4KICAgKi8KICBTdHJlYW08TGlzdDxpbnQ+PiBvcGVuUmVhZChbaW50IHN0YXJ0LCBpbnQgZW5kXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgaW5kZXBlbmRlbnQgW0lPU2lua10gZm9yIHRoZSBmaWxlLiBUaGUKICAgKiBbSU9TaW5rXSBtdXN0IGJlIGNsb3NlZCB3aGVuIG5vIGxvbmdlciB1c2VkLCB0byBmcmVlCiAgICogc3lzdGVtIHJlc291cmNlcy4KICAgKgogICAqIEFuIFtJT1NpbmtdIGZvciBhIGZpbGUgY2FuIGJlIG9wZW5lZCBpbiB0d28gbW9kZXM6CiAgICoKICAgKiAqIFtGaWxlTW9kZS53cml0ZV06IHRydW5jYXRlcyB0aGUgZmlsZSB0byBsZW5ndGggemVyby4KICAgKiAqIFtGaWxlTW9kZS5hcHBlbmRdOiBzZXRzIHRoZSBpbml0aWFsIHdyaXRlIHBvc2l0aW9uIHRvIHRoZSBlbmQKICAgKiAgIG9mIHRoZSBmaWxlLgogICAqCiAgICogIFdoZW4gd3JpdGluZyBzdHJpbmdzIHRocm91Z2ggdGhlIHJldHVybmVkIFtJT1NpbmtdIHRoZSBlbmNvZGluZwogICAqICBzcGVjaWZpZWQgdXNpbmcgW2VuY29kaW5nXSB3aWxsIGJlIHVzZWQuIFRoZSByZXR1cm5lZCBbSU9TaW5rXQogICAqICBoYXMgYW4gYGVuY29kaW5nYCBwcm9wZXJ0eSB3aGljaCBjYW4gYmUgY2hhbmdlZCBhZnRlciB0aGUKICAgKiAgW0lPU2lua10gaGFzIGJlZW4gY3JlYXRlZC4KICAgKi8KICBJT1Npbmsgb3BlbldyaXRlKHtGaWxlTW9kZSBtb2RlOiBGaWxlTW9kZS53cml0ZSwgRW5jb2RpbmcgZW5jb2Rpbmc6IHV0Zjh9KTsKCiAgLyoqCiAgICogUmVhZCB0aGUgZW50aXJlIGZpbGUgY29udGVudHMgYXMgYSBsaXN0IG9mIGJ5dGVzLiBSZXR1cm5zIGEKICAgKiBgRnV0dXJlPFVpbnQ4TGlzdD5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIGxpc3Qgb2YgYnl0ZXMgdGhhdAogICAqIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4KICAgKi8KICBGdXR1cmU8VWludDhMaXN0PiByZWFkQXNCeXRlcygpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHJlYWQgdGhlIGVudGlyZSBmaWxlIGNvbnRlbnRzIGFzIGEgbGlzdCBvZiBieXRlcy4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIFVpbnQ4TGlzdCByZWFkQXNCeXRlc1N5bmMoKTsKCiAgLyoqCiAgICogUmVhZCB0aGUgZW50aXJlIGZpbGUgY29udGVudHMgYXMgYSBzdHJpbmcgdXNpbmcgdGhlIGdpdmVuCiAgICogW0VuY29kaW5nXS4KICAgKgogICAqIFJldHVybnMgYSBgRnV0dXJlPFN0cmluZz5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIHN0cmluZyBvbmNlCiAgICogdGhlIGZpbGUgY29udGVudHMgaGFzIGJlZW4gcmVhZC4KICAgKi8KICBGdXR1cmU8U3RyaW5nPiByZWFkQXNTdHJpbmcoe0VuY29kaW5nIGVuY29kaW5nOiB1dGY4fSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgcmVhZCB0aGUgZW50aXJlIGZpbGUgY29udGVudHMgYXMgYSBzdHJpbmcgdXNpbmcgdGhlCiAgICogZ2l2ZW4gW0VuY29kaW5nXS4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIFN0cmluZyByZWFkQXNTdHJpbmdTeW5jKHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pOwoKICAvKioKICAgKiBSZWFkIHRoZSBlbnRpcmUgZmlsZSBjb250ZW50cyBhcyBsaW5lcyBvZiB0ZXh0IHVzaW5nIHRoZSBnaXZlbgogICAqIFtFbmNvZGluZ10uCiAgICoKICAgKiBSZXR1cm5zIGEgYEZ1dHVyZTxMaXN0PFN0cmluZz4+YCB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZSBsaW5lcwogICAqIG9uY2UgdGhlIGZpbGUgY29udGVudHMgaGFzIGJlZW4gcmVhZC4KICAgKi8KICBGdXR1cmU8TGlzdDxTdHJpbmc+PiByZWFkQXNMaW5lcyh7RW5jb2RpbmcgZW5jb2Rpbmc6IHV0Zjh9KTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSByZWFkIHRoZSBlbnRpcmUgZmlsZSBjb250ZW50cyBhcyBsaW5lcyBvZiB0ZXh0CiAgICogdXNpbmcgdGhlIGdpdmVuIFtFbmNvZGluZ10uCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICBMaXN0PFN0cmluZz4gcmVhZEFzTGluZXNTeW5jKHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pOwoKICAvKioKICAgKiBXcml0ZSBhIGxpc3Qgb2YgYnl0ZXMgdG8gYSBmaWxlLgogICAqCiAgICogT3BlbnMgdGhlIGZpbGUsIHdyaXRlcyB0aGUgbGlzdCBvZiBieXRlcyB0byBpdCwgYW5kIGNsb3NlcyB0aGUgZmlsZS4KICAgKiBSZXR1cm5zIGEgYEZ1dHVyZTxGaWxlPmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGlzIFtGaWxlXSBvYmplY3Qgb25jZQogICAqIHRoZSBlbnRpcmUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCiAgICoKICAgKiBCeSBkZWZhdWx0IFt3cml0ZUFzQnl0ZXNdIGNyZWF0ZXMgdGhlIGZpbGUgZm9yIHdyaXRpbmcgYW5kIHRydW5jYXRlcyB0aGUKICAgKiBmaWxlIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBJbiBvcmRlciB0byBhcHBlbmQgdGhlIGJ5dGVzIHRvIGFuIGV4aXN0aW5nCiAgICogZmlsZSwgcGFzcyBbRmlsZU1vZGUuYXBwZW5kXSBhcyB0aGUgb3B0aW9uYWwgbW9kZSBwYXJhbWV0ZXIuCiAgICoKICAgKiBJZiB0aGUgYXJndW1lbnQgW2ZsdXNoXSBpcyBzZXQgdG8gYHRydWVgLCB0aGUgZGF0YSB3cml0dGVuIHdpbGwgYmUKICAgKiBmbHVzaGVkIHRvIHRoZSBmaWxlIHN5c3RlbSBiZWZvcmUgdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMuCiAgICovCiAgRnV0dXJlPEZpbGU+IHdyaXRlQXNCeXRlcyhMaXN0PGludD4gYnl0ZXMsCiAgICAgIHtGaWxlTW9kZSBtb2RlOiBGaWxlTW9kZS53cml0ZSwgYm9vbCBmbHVzaDogZmFsc2V9KTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSB3cml0ZSBhIGxpc3Qgb2YgYnl0ZXMgdG8gYSBmaWxlLgogICAqCiAgICogT3BlbnMgdGhlIGZpbGUsIHdyaXRlcyB0aGUgbGlzdCBvZiBieXRlcyB0byBpdCBhbmQgY2xvc2VzIHRoZSBmaWxlLgogICAqCiAgICogQnkgZGVmYXVsdCBbd3JpdGVBc0J5dGVzU3luY10gY3JlYXRlcyB0aGUgZmlsZSBmb3Igd3JpdGluZyBhbmQgdHJ1bmNhdGVzCiAgICogdGhlIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHMuIEluIG9yZGVyIHRvIGFwcGVuZCB0aGUgYnl0ZXMgdG8gYW4gZXhpc3RpbmcKICAgKiBmaWxlLCBwYXNzIFtGaWxlTW9kZS5hcHBlbmRdIGFzIHRoZSBvcHRpb25hbCBtb2RlIHBhcmFtZXRlci4KICAgKgogICAqIElmIHRoZSBbZmx1c2hdIGFyZ3VtZW50IGlzIHNldCB0byBgdHJ1ZWAgZGF0YSB3cml0dGVuIHdpbGwgYmUKICAgKiBmbHVzaGVkIHRvIHRoZSBmaWxlIHN5c3RlbSBiZWZvcmUgcmV0dXJuaW5nLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgdm9pZCB3cml0ZUFzQnl0ZXNTeW5jKExpc3Q8aW50PiBieXRlcywKICAgICAge0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLndyaXRlLCBib29sIGZsdXNoOiBmYWxzZX0pOwoKICAvKioKICAgKiBXcml0ZSBhIHN0cmluZyB0byBhIGZpbGUuCiAgICoKICAgKiBPcGVucyB0aGUgZmlsZSwgd3JpdGVzIHRoZSBzdHJpbmcgaW4gdGhlIGdpdmVuIGVuY29kaW5nLCBhbmQgY2xvc2VzIHRoZQogICAqIGZpbGUuIFJldHVybnMgYSBgRnV0dXJlPEZpbGU+YCB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoaXMgW0ZpbGVdIG9iamVjdAogICAqIG9uY2UgdGhlIGVudGlyZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KICAgKgogICAqIEJ5IGRlZmF1bHQgW3dyaXRlQXNTdHJpbmddIGNyZWF0ZXMgdGhlIGZpbGUgZm9yIHdyaXRpbmcgYW5kIHRydW5jYXRlcyB0aGUKICAgKiBmaWxlIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBJbiBvcmRlciB0byBhcHBlbmQgdGhlIGJ5dGVzIHRvIGFuIGV4aXN0aW5nCiAgICogZmlsZSwgcGFzcyBbRmlsZU1vZGUuYXBwZW5kXSBhcyB0aGUgb3B0aW9uYWwgbW9kZSBwYXJhbWV0ZXIuCiAgICoKICAgKiBJZiB0aGUgYXJndW1lbnQgW2ZsdXNoXSBpcyBzZXQgdG8gYHRydWVgLCB0aGUgZGF0YSB3cml0dGVuIHdpbGwgYmUKICAgKiBmbHVzaGVkIHRvIHRoZSBmaWxlIHN5c3RlbSBiZWZvcmUgdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMuCiAgICoKICAgKi8KICBGdXR1cmU8RmlsZT4gd3JpdGVBc1N0cmluZyhTdHJpbmcgY29udGVudHMsCiAgICAgIHtGaWxlTW9kZSBtb2RlOiBGaWxlTW9kZS53cml0ZSwKICAgICAgRW5jb2RpbmcgZW5jb2Rpbmc6IHV0ZjgsCiAgICAgIGJvb2wgZmx1c2g6IGZhbHNlfSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgd3JpdGUgYSBzdHJpbmcgdG8gYSBmaWxlLgogICAqCiAgICogT3BlbnMgdGhlIGZpbGUsIHdyaXRlcyB0aGUgc3RyaW5nIGluIHRoZSBnaXZlbiBlbmNvZGluZywgYW5kIGNsb3NlcyB0aGUKICAgKiBmaWxlLgogICAqCiAgICogQnkgZGVmYXVsdCBbd3JpdGVBc1N0cmluZ1N5bmNdIGNyZWF0ZXMgdGhlIGZpbGUgZm9yIHdyaXRpbmcgYW5kCiAgICogdHJ1bmNhdGVzIHRoZSBmaWxlIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBJbiBvcmRlciB0byBhcHBlbmQgdGhlIGJ5dGVzCiAgICogdG8gYW4gZXhpc3RpbmcgZmlsZSwgcGFzcyBbRmlsZU1vZGUuYXBwZW5kXSBhcyB0aGUgb3B0aW9uYWwgbW9kZQogICAqIHBhcmFtZXRlci4KICAgKgogICAqIElmIHRoZSBbZmx1c2hdIGFyZ3VtZW50IGlzIHNldCB0byBgdHJ1ZWAgZGF0YSB3cml0dGVuIHdpbGwgYmUKICAgKiBmbHVzaGVkIHRvIHRoZSBmaWxlIHN5c3RlbSBiZWZvcmUgcmV0dXJuaW5nLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgdm9pZCB3cml0ZUFzU3RyaW5nU3luYyhTdHJpbmcgY29udGVudHMsCiAgICAgIHtGaWxlTW9kZSBtb2RlOiBGaWxlTW9kZS53cml0ZSwKICAgICAgRW5jb2RpbmcgZW5jb2Rpbmc6IHV0ZjgsCiAgICAgIGJvb2wgZmx1c2g6IGZhbHNlfSk7CgogIC8qKgogICAqIEdldCB0aGUgcGF0aCBvZiB0aGUgZmlsZS4KICAgKi8KICBTdHJpbmcgZ2V0IHBhdGg7Cn0KCi8qKgogKiBgUmFuZG9tQWNjZXNzRmlsZWAgcHJvdmlkZXMgcmFuZG9tIGFjY2VzcyB0byB0aGUgZGF0YSBpbiBhCiAqIGZpbGUuCiAqCiAqIGBSYW5kb21BY2Nlc3NGaWxlYCBvYmplY3RzIGFyZSBvYnRhaW5lZCBieSBjYWxsaW5nIHRoZQogKiBgb3BlbmAgbWV0aG9kIG9uIGEgW0ZpbGVdIG9iamVjdC4KICoKICogQSBgUmFuZG9tQWNjZXNzRmlsZWAgaGF2ZSBib3RoIGFzeW5jaHJvbm91cyBhbmQgc3luY2hyb25vdXMKICogbWV0aG9kcy4gVGhlIGFzeW5jaHJvbm91cyBtZXRob2RzIGFsbCByZXR1cm4gYSBgRnV0dXJlYAogKiB3aGVyZWFzIHRoZSBzeW5jaHJvbm91cyBtZXRob2RzIHdpbGwgcmV0dXJuIHRoZSByZXN1bHQgZGlyZWN0bHksCiAqIGFuZCBibG9jayB0aGUgY3VycmVudCBpc29sYXRlIHVudGlsIHRoZSByZXN1bHQgaXMgcmVhZHkuCiAqCiAqIEF0IG1vc3Qgb25lIGFzeW5jaHJvbm91cyBtZXRob2QgY2FuIGJlIHBlbmRpbmcgb24gYSBnaXZlbiBgUmFuZG9tQWNjZXNzRmlsZWAKICogaW5zdGFuY2UgYXQgdGhlIHRpbWUuIElmIGFuIGFzeW5jaHJvbm91cyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gb25lIGlzCiAqIGFscmVhZHkgaW4gcHJvZ3Jlc3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaXMgdGhyb3duLgogKgogKiBJZiBhbiBhc3luY2hyb25vdXMgbWV0aG9kIGlzIHBlbmRpbmcgaXQgaXMgYWxzbyBub3QgcG9zc2libGUgdG8gY2FsbCBhbnkKICogc3luY2hyb25vdXMgbWV0aG9kcy4gVGhpcyB3aWxsIGFsc28gdGhyb3cgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0uCiAqLwphYnN0cmFjdCBjbGFzcyBSYW5kb21BY2Nlc3NGaWxlIHsKICAvKioKICAgKiBDbG9zZXMgdGhlIGZpbGUuIFJldHVybnMgYSBgRnV0dXJlYCB0aGF0CiAgICogY29tcGxldGVzIHdoZW4gaXQgaGFzIGJlZW4gY2xvc2VkLgogICAqLwogIEZ1dHVyZTx2b2lkPiBjbG9zZSgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNsb3NlcyB0aGUgZmlsZS4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIHZvaWQgY2xvc2VTeW5jKCk7CgogIC8qKgogICAqIFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBmaWxlLiBSZXR1cm5zIGEgYEZ1dHVyZTxpbnQ+YCB0aGF0CiAgICogY29tcGxldGVzIHdpdGggdGhlIGJ5dGUsIG9yIHdpdGggLTEgaWYgZW5kLW9mLWZpbGUgaGFzIGJlZW4gcmVhY2hlZC4KICAgKi8KICBGdXR1cmU8aW50PiByZWFkQnl0ZSgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHJlYWRzIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGUgZmlsZS4gSWYgZW5kLW9mLWZpbGUKICAgKiBoYXMgYmVlbiByZWFjaGVkIC0xIGlzIHJldHVybmVkLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgaW50IHJlYWRCeXRlU3luYygpOwoKICAvKioKICAgKiBSZWFkcyBbYnl0ZXNdIGJ5dGVzIGZyb20gYSBmaWxlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBsaXN0IG9mIGJ5dGVzLgogICAqLwogIEZ1dHVyZTxVaW50OExpc3Q+IHJlYWQoaW50IGJ5dGVzKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSByZWFkcyBhIG1heGltdW0gb2YgW2J5dGVzXSBieXRlcyBmcm9tIGEgZmlsZSBhbmQKICAgKiByZXR1cm5zIHRoZSByZXN1bHQgaW4gYSBsaXN0IG9mIGJ5dGVzLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgVWludDhMaXN0IHJlYWRTeW5jKGludCBieXRlcyk7CgogIC8qKgogICAqIFJlYWRzIGludG8gYW4gZXhpc3RpbmcgW0xpc3Q8aW50Pl0gZnJvbSB0aGUgZmlsZS4gSWYgW3N0YXJ0XSBpcyBwcmVzZW50LAogICAqIHRoZSBieXRlcyB3aWxsIGJlIGZpbGxlZCBpbnRvIFtidWZmZXJdIGZyb20gYXQgaW5kZXggW3N0YXJ0XSwgb3RoZXJ3aXNlCiAgICogaW5kZXggMC4gSWYgW2VuZF0gaXMgcHJlc2VudCwgdGhlIFtlbmRdIC0gW3N0YXJ0XSBieXRlcyB3aWxsIGJlIHJlYWQgaW50bwogICAqIFtidWZmZXJdLCBvdGhlcndpc2UgdXAgdG8gW2J1ZmZlci5sZW5ndGhdLiBJZiBbZW5kXSA9PSBbc3RhcnRdIG5vdGhpbmcKICAgKiBoYXBwZW5zLgogICAqCiAgICogUmV0dXJucyBhIGBGdXR1cmU8aW50PmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCiAgICovCiAgRnV0dXJlPGludD4gcmVhZEludG8oTGlzdDxpbnQ+IGJ1ZmZlciwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSByZWFkcyBpbnRvIGFuIGV4aXN0aW5nIFtMaXN0PGludD5dIGZyb20gdGhlIGZpbGUuIElmIFtzdGFydF0KICAgKiBpcyBwcmVzZW50LCB0aGUgYnl0ZXMgd2lsbCBiZSBmaWxsZWQgaW50byBbYnVmZmVyXSBmcm9tIGF0IGluZGV4IFtzdGFydF0sCiAgICogb3RoZXJ3aXNlIGluZGV4IDAuICBJZiBbZW5kXSBpcyBwcmVzZW50LCB0aGUgW2VuZF0gLSBbc3RhcnRdIGJ5dGVzIHdpbGwgYmUKICAgKiByZWFkIGludG8gW2J1ZmZlcl0sIG90aGVyd2lzZSB1cCB0byBbYnVmZmVyLmxlbmd0aF0uIElmIFtlbmRdID09IFtzdGFydF0KICAgKiBub3RoaW5nIGhhcHBlbnMuCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICBpbnQgcmVhZEludG9TeW5jKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSk7CgogIC8qKgogICAqIFdyaXRlcyBhIHNpbmdsZSBieXRlIHRvIHRoZSBmaWxlLiBSZXR1cm5zIGEKICAgKiBgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+YCB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoaXMKICAgKiBSYW5kb21BY2Nlc3NGaWxlIHdoZW4gdGhlIHdyaXRlIGNvbXBsZXRlcy4KICAgKi8KICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gd3JpdGVCeXRlKGludCB2YWx1ZSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgd3JpdGVzIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIGZpbGUuIFJldHVybnMgdGhlCiAgICogbnVtYmVyIG9mIGJ5dGVzIHN1Y2Nlc3NmdWxseSB3cml0dGVuLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgaW50IHdyaXRlQnl0ZVN5bmMoaW50IHZhbHVlKTsKCiAgLyoqCiAgICogV3JpdGVzIGZyb20gYSBbTGlzdDxpbnQ+XSB0byB0aGUgZmlsZS4gSXQgd2lsbCByZWFkIHRoZSBidWZmZXIgZnJvbSBpbmRleAogICAqIFtzdGFydF0gdG8gaW5kZXggW2VuZF0uIElmIFtzdGFydF0gaXMgb21pdHRlZCwgaXQnbGwgc3RhcnQgZnJvbSBpbmRleCAwLgogICAqIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IHdpbGwgd3JpdGUgdG8gZW5kIG9mIFtidWZmZXJdLgogICAqCiAgICogUmV0dXJucyBhIGBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhpcwogICAqIFtSYW5kb21BY2Nlc3NGaWxlXSB3aGVuIHRoZSB3cml0ZSBjb21wbGV0ZXMuCiAgICovCiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IHdyaXRlRnJvbShMaXN0PGludD4gYnVmZmVyLAogICAgICBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHdyaXRlcyBmcm9tIGEgW0xpc3Q8aW50Pl0gdG8gdGhlIGZpbGUuIEl0IHdpbGwgcmVhZCB0aGUKICAgKiBidWZmZXIgZnJvbSBpbmRleCBbc3RhcnRdIHRvIGluZGV4IFtlbmRdLiBJZiBbc3RhcnRdIGlzIG9taXR0ZWQsIGl0J2xsCiAgICogc3RhcnQgZnJvbSBpbmRleCAwLiBJZiBbZW5kXSBpcyBvbWl0dGVkLCBpdCB3aWxsIHdyaXRlIHRvIHRoZSBlbmQgb2YKICAgKiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIHZvaWQgd3JpdGVGcm9tU3luYyhMaXN0PGludD4gYnVmZmVyLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pOwoKICAvKioKICAgKiBXcml0ZXMgYSBzdHJpbmcgdG8gdGhlIGZpbGUgdXNpbmcgdGhlIGdpdmVuIFtFbmNvZGluZ10uIFJldHVybnMgYQogICAqIGBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhpcwogICAqIFJhbmRvbUFjY2Vzc0ZpbGUgd2hlbiB0aGUgd3JpdGUgY29tcGxldGVzLgogICAqLwogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiB3cml0ZVN0cmluZyhTdHJpbmcgc3RyaW5nLAogICAgICB7RW5jb2RpbmcgZW5jb2Rpbmc6IHV0Zjh9KTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSB3cml0ZXMgYSBzaW5nbGUgc3RyaW5nIHRvIHRoZSBmaWxlIHVzaW5nIHRoZSBnaXZlbgogICAqIFtFbmNvZGluZ10uCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICB2b2lkIHdyaXRlU3RyaW5nU3luYyhTdHJpbmcgc3RyaW5nLCB7RW5jb2RpbmcgZW5jb2Rpbmc6IHV0Zjh9KTsKCiAgLyoqCiAgICogR2V0cyB0aGUgY3VycmVudCBieXRlIHBvc2l0aW9uIGluIHRoZSBmaWxlLiBSZXR1cm5zIGEKICAgKiBgRnV0dXJlPGludD5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIHBvc2l0aW9uLgogICAqLwogIEZ1dHVyZTxpbnQ+IHBvc2l0aW9uKCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgZ2V0cyB0aGUgY3VycmVudCBieXRlIHBvc2l0aW9uIGluIHRoZSBmaWxlLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgaW50IHBvc2l0aW9uU3luYygpOwoKICAvKioKICAgKiBTZXRzIHRoZSBieXRlIHBvc2l0aW9uIGluIHRoZSBmaWxlLiBSZXR1cm5zIGEKICAgKiBgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+YCB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoaXMKICAgKiBSYW5kb21BY2Nlc3NGaWxlIHdoZW4gdGhlIHBvc2l0aW9uIGhhcyBiZWVuIHNldC4KICAgKi8KICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gc2V0UG9zaXRpb24oaW50IHBvc2l0aW9uKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBzZXRzIHRoZSBieXRlIHBvc2l0aW9uIGluIHRoZSBmaWxlLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgdm9pZCBzZXRQb3NpdGlvblN5bmMoaW50IHBvc2l0aW9uKTsKCiAgLyoqCiAgICogVHJ1bmNhdGVzIChvciBleHRlbmRzKSB0aGUgZmlsZSB0byBbbGVuZ3RoXSBieXRlcy4gUmV0dXJucyBhCiAgICogYEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGlzCiAgICogUmFuZG9tQWNjZXNzRmlsZSB3aGVuIHRoZSB0cnVuY2F0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZC4KICAgKi8KICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gdHJ1bmNhdGUoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgdHJ1bmNhdGVzIChvciBleHRlbmRzKSB0aGUgZmlsZSB0byBbbGVuZ3RoXSBieXRlcy4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIHZvaWQgdHJ1bmNhdGVTeW5jKGludCBsZW5ndGgpOwoKICAvKioKICAgKiBHZXRzIHRoZSBsZW5ndGggb2YgdGhlIGZpbGUuIFJldHVybnMgYSBgRnV0dXJlPGludD5gIHRoYXQKICAgKiBjb21wbGV0ZXMgd2l0aCB0aGUgbGVuZ3RoIGluIGJ5dGVzLgogICAqLwogIEZ1dHVyZTxpbnQ+IGxlbmd0aCgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGdldHMgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZS4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIGludCBsZW5ndGhTeW5jKCk7CgogIC8qKgogICAqIEZsdXNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIHRvIGRpc2suIFJldHVybnMgYQogICAqIGBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhpcwogICAqIFJhbmRvbUFjY2Vzc0ZpbGUgd2hlbiB0aGUgZmx1c2ggb3BlcmF0aW9uIGNvbXBsZXRlcy4KICAgKi8KICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gZmx1c2goKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBmbHVzaGVzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSB0byBkaXNrLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgdm9pZCBmbHVzaFN5bmMoKTsKCiAgLyoqCiAgICogTG9ja3MgdGhlIGZpbGUgb3IgcGFydCBvZiB0aGUgZmlsZS4KICAgKgogICAqIEJ5IGRlZmF1bHQgYW4gZXhjbHVzaXZlIGxvY2sgd2lsbCBiZSBvYnRhaW5lZCwgYnV0IHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4KICAgKiBieSB0aGUgW21vZGVdIGFyZ3VtZW50LgogICAqCiAgICogTG9ja3MgdGhlIGJ5dGUgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIG9mIHRoZSBmaWxlLCB3aXRoIHRoZQogICAqIGJ5dGUgYXQgcG9zaXRpb24gYGVuZGAgbm90IGluY2x1ZGVkLiBJZiBubyBhcmd1bWVudHMgYXJlCiAgICogc3BlY2lmaWVkLCB0aGUgZnVsbCBmaWxlIGlzIGxvY2tlZCwgSWYgb25seSBgc3RhcnRgIGlzIHNwZWNpZmllZAogICAqIHRoZSBmaWxlIGlzIGxvY2tlZCBmcm9tIGJ5dGUgcG9zaXRpb24gYHN0YXJ0YCB0byB0aGUgZW5kIG9mIHRoZQogICAqIGZpbGUsIG5vIG1hdHRlciBob3cgbGFyZ2UgaXQgZ3Jvd3MuIEl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgYW4KICAgKiBleHBsaWNpdCB2YWx1ZSBvZiBgZW5kYCB3aGljaCBpcyBwYXN0IHRoZSBjdXJyZW50IGxlbmd0aCBvZiB0aGUgZmlsZS4KICAgKgogICAqIFRvIG9idGFpbiBhbiBleGNsdXNpdmUgbG9jayBvbiBhIGZpbGUgaXQgbXVzdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmcuCiAgICoKICAgKiBJZiBbbW9kZV0gaXMgW0ZpbGVMb2NrLmV4Y2x1c2l2ZV0gb3IgW0ZpbGVMb2NrLnNoYXJlZF0sIGFuIGVycm9yIGlzCiAgICogc2lnbmFsZWQgaWYgdGhlIGxvY2sgY2Fubm90IGJlIG9idGFpbmVkLiBJZiBbbW9kZV0gaXMKICAgKiBbRmlsZUxvY2suYmxvY2tpbmdFeGNsdXNpdmVdIG9yIFtGaWxlTG9jay5ibG9ja2luZ1NoYXJlZF0sIHRoZQogICAqIHJldHVybmVkIFtGdXR1cmVdIGlzIHJlc29sdmVkIG9ubHkgd2hlbiB0aGUgbG9jayBoYXMgYmVlbiBvYnRhaW5lZC4KICAgKgogICAqICpOT1RFKiBmaWxlIGxvY2tpbmcgZG9lcyBoYXZlIHNsaWdodCBkaWZmZXJlbmNlcyBpbiBiZWhhdmlvciBhY3Jvc3MKICAgKiBwbGF0Zm9ybXM6CiAgICoKICAgKiBPbiBMaW51eCBhbmQgT1MgWCB0aGlzIHVzZXMgYWR2aXNvcnkgbG9ja3MsIHdoaWNoIGhhdmUgdGhlCiAgICogc3VycHJpc2luZyBzZW1hbnRpY3MgdGhhdCBhbGwgbG9ja3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZmlsZQogICAqIGFyZSByZW1vdmVkIHdoZW4gKmFueSogZmlsZSBkZXNjcmlwdG9yIGZvciB0aGF0IGZpbGUgaXMgY2xvc2VkIGJ5CiAgICogdGhlIHByb2Nlc3MuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFjdHVhbGx5IGxvY2sgdGhlIGZpbGUgZm9yCiAgICogYWNjZXNzLiBBbHNvIG5vdGUgdGhhdCBhZHZpc29yeSBsb2NrcyBhcmUgb24gYSBwcm9jZXNzCiAgICogbGV2ZWwuIFRoaXMgbWVhbnMgdGhhdCBzZXZlcmFsIGlzb2xhdGVzIGluIHRoZSBzYW1lIHByb2Nlc3MgY2FuCiAgICogb2J0YWluIGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIHRoZSBzYW1lIGZpbGUuCiAgICoKICAgKiBPbiBXaW5kb3dzIHRoZSByZWdpb25zIHVzZWQgZm9yIGxvY2sgYW5kIHVubG9jayBuZWVkcyB0byBtYXRjaC4gSWYgdGhhdAogICAqIGlzIG5vdCB0aGUgY2FzZSB1bmxvY2tpbmcgd2lsbCByZXN1bHQgaW4gdGhlIE9TIGVycm9yICJUaGUgc2VnbWVudCBpcwogICAqIGFscmVhZHkgdW5sb2NrZWQiLgogICAqLwogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiBsb2NrKAogICAgICBbRmlsZUxvY2sgbW9kZSA9IEZpbGVMb2NrLmV4Y2x1c2l2ZSwgaW50IHN0YXJ0ID0gMCwgaW50IGVuZCA9IC0xXSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgbG9ja3MgdGhlIGZpbGUgb3IgcGFydCBvZiB0aGUgZmlsZS4KICAgKgogICAqIEJ5IGRlZmF1bHQgYW4gZXhjbHVzaXZlIGxvY2sgd2lsbCBiZSBvYnRhaW5lZCwgYnV0IHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4KICAgKiBieSB0aGUgW21vZGVdIGFyZ3VtZW50LgogICAqCiAgICogTG9ja3MgdGhlIGJ5dGUgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIG9mIHRoZSBmaWxlICx3aXRoIHRoZQogICAqIGJ5dGUgYXQgcG9zaXRpb24gYGVuZGAgbm90IGluY2x1ZGVkLiBJZiBubyBhcmd1bWVudHMgYXJlCiAgICogc3BlY2lmaWVkLCB0aGUgZnVsbCBmaWxlIGlzIGxvY2tlZCwgSWYgb25seSBgc3RhcnRgIGlzIHNwZWNpZmllZAogICAqIHRoZSBmaWxlIGlzIGxvY2tlZCBmcm9tIGJ5dGUgcG9zaXRpb24gYHN0YXJ0YCB0byB0aGUgZW5kIG9mIHRoZQogICAqIGZpbGUsIG5vIG1hdHRlciBob3cgbGFyZ2UgaXQgZ3Jvd3MuIEl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgYW4KICAgKiBleHBsaWNpdCB2YWx1ZSBvZiBgZW5kYCB3aGljaCBpcyBwYXN0IHRoZSBjdXJyZW50IGxlbmd0aCBvZiB0aGUgZmlsZS4KICAgKgogICAqIFRvIG9idGFpbiBhbiBleGNsdXNpdmUgbG9jayBvbiBhIGZpbGUgaXQgbXVzdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmcuCiAgICoKICAgKiBJZiBbbW9kZV0gaXMgW0ZpbGVMb2NrLmV4Y2x1c2l2ZV0gb3IgW0ZpbGVMb2NrLnNoYXJlZF0sIGFuIGV4Y2VwdGlvbiBpcwogICAqIHRocm93biBpZiB0aGUgbG9jayBjYW5ub3QgYmUgb2J0YWluZWQuIElmIFttb2RlXSBpcwogICAqIFtGaWxlTG9jay5ibG9ja2luZ0V4Y2x1c2l2ZV0gb3IgW0ZpbGVMb2NrLmJsb2NraW5nU2hhcmVkXSwgdGhlCiAgICogY2FsbCByZXR1cm5zIG9ubHkgYWZ0ZXIgdGhlIGxvY2sgaGFzIGJlZW4gb2J0YWluZWQuCiAgICoKICAgKiAqTk9URSogZmlsZSBsb2NraW5nIGRvZXMgaGF2ZSBzbGlnaHQgZGlmZmVyZW5jZXMgaW4gYmVoYXZpb3IgYWNyb3NzCiAgICogcGxhdGZvcm1zOgogICAqCiAgICogT24gTGludXggYW5kIE9TIFggdGhpcyB1c2VzIGFkdmlzb3J5IGxvY2tzLCB3aGljaCBoYXZlIHRoZQogICAqIHN1cnByaXNpbmcgc2VtYW50aWNzIHRoYXQgYWxsIGxvY2tzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGZpbGUKICAgKiBhcmUgcmVtb3ZlZCB3aGVuICphbnkqIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhhdCBmaWxlIGlzIGNsb3NlZCBieQogICAqIHRoZSBwcm9jZXNzLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhY3R1YWxseSBsb2NrIHRoZSBmaWxlIGZvcgogICAqIGFjY2Vzcy4gQWxzbyBub3RlIHRoYXQgYWR2aXNvcnkgbG9ja3MgYXJlIG9uIGEgcHJvY2VzcwogICAqIGxldmVsLiBUaGlzIG1lYW5zIHRoYXQgc2V2ZXJhbCBpc29sYXRlcyBpbiB0aGUgc2FtZSBwcm9jZXNzIGNhbgogICAqIG9idGFpbiBhbiBleGNsdXNpdmUgbG9jayBvbiB0aGUgc2FtZSBmaWxlLgogICAqCiAgICogT24gV2luZG93cyB0aGUgcmVnaW9ucyB1c2VkIGZvciBsb2NrIGFuZCB1bmxvY2sgbmVlZHMgdG8gbWF0Y2guIElmIHRoYXQKICAgKiBpcyBub3QgdGhlIGNhc2UgdW5sb2NraW5nIHdpbGwgcmVzdWx0IGluIHRoZSBPUyBlcnJvciAiVGhlIHNlZ21lbnQgaXMKICAgKiBhbHJlYWR5IHVubG9ja2VkIi4KICAgKgogICAqLwogIHZvaWQgbG9ja1N5bmMoCiAgICAgIFtGaWxlTG9jayBtb2RlID0gRmlsZUxvY2suZXhjbHVzaXZlLCBpbnQgc3RhcnQgPSAwLCBpbnQgZW5kID0gLTFdKTsKCiAgLyoqCiAgICogVW5sb2NrcyB0aGUgZmlsZSBvciBwYXJ0IG9mIHRoZSBmaWxlLgogICAqCiAgICogVW5sb2NrcyB0aGUgYnl0ZSByYW5nZSBmcm9tIFtzdGFydF0gdG8gW2VuZF0gb2YgdGhlIGZpbGUsIHdpdGgKICAgKiB0aGUgYnl0ZSBhdCBwb3NpdGlvbiBgZW5kYCBub3QgaW5jbHVkZWQuIElmIG5vIGFyZ3VtZW50cyBhcmUKICAgKiBzcGVjaWZpZWQsIHRoZSBmdWxsIGZpbGUgaXMgdW5sb2NrZWQsIElmIG9ubHkgYHN0YXJ0YCBpcwogICAqIHNwZWNpZmllZCB0aGUgZmlsZSBpcyB1bmxvY2tlZCBmcm9tIGJ5dGUgcG9zaXRpb24gYHN0YXJ0YCB0byB0aGUKICAgKiBlbmQgb2YgdGhlIGZpbGUuCiAgICoKICAgKiAqTk9URSogZmlsZSBsb2NraW5nIGRvZXMgaGF2ZSBzbGlnaHQgZGlmZmVyZW5jZXMgaW4gYmVoYXZpb3IgYWNyb3NzCiAgICogcGxhdGZvcm1zOgogICAqCiAgICogU2VlIFtsb2NrXSBmb3IgbW9yZSBkZXRhaWxzLgogICAqLwogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiB1bmxvY2soW2ludCBzdGFydCA9IDAsIGludCBlbmQgPSAtMV0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHVubG9ja3MgdGhlIGZpbGUgb3IgcGFydCBvZiB0aGUgZmlsZS4KICAgKgogICAqIFVubG9ja3MgdGhlIGJ5dGUgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIG9mIHRoZSBmaWxlLCB3aXRoCiAgICogdGhlIGJ5dGUgYXQgcG9zaXRpb24gYGVuZGAgbm90IGluY2x1ZGVkLiBJZiBubyBhcmd1bWVudHMgYXJlCiAgICogc3BlY2lmaWVkLCB0aGUgZnVsbCBmaWxlIGlzIHVubG9ja2VkLCBJZiBvbmx5IGBzdGFydGAgaXMKICAgKiBzcGVjaWZpZWQgdGhlIGZpbGUgaXMgdW5sb2NrZWQgZnJvbSBieXRlIHBvc2l0aW9uIGBzdGFydGAgdG8gdGhlCiAgICogZW5kIG9mIHRoZSBmaWxlLgogICAqCiAgICogKk5PVEUqIGZpbGUgbG9ja2luZyBkb2VzIGhhdmUgc2xpZ2h0IGRpZmZlcmVuY2VzIGluIGJlaGF2aW9yIGFjcm9zcwogICAqIHBsYXRmb3JtczoKICAgKgogICAqIFNlZSBbbG9ja1N5bmNdIGZvciBtb3JlIGRldGFpbHMuCiAgICovCiAgdm9pZCB1bmxvY2tTeW5jKFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kID0gLTFdKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgdGhpcyBSYW5kb21BY2Nlc3NGaWxlIGluc3RhbmNlLgogICAqLwogIFN0cmluZyB0b1N0cmluZygpOwoKICAvKioKICAgKiBHZXRzIHRoZSBwYXRoIG9mIHRoZSBmaWxlIHVuZGVybHlpbmcgdGhpcyBSYW5kb21BY2Nlc3NGaWxlLgogICAqLwogIFN0cmluZyBnZXQgcGF0aDsKfQoKLyoqCiAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhIGZpbGUgb3BlcmF0aW9uIGZhaWxzLgogKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBGaWxlU3lzdGVtRXhjZXB0aW9uIGltcGxlbWVudHMgSU9FeGNlcHRpb24gewogIC8qKgogICAqIE1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgZXJyb3IuIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBhbnkgZGV0YWlsZWQKICAgKiBpbmZvcm1hdGlvbiBmb3JtIHRoZSB1bmRlcmx5aW5nIE9TIGVycm9yLiBDaGVjayBbb3NFcnJvcl0gZm9yCiAgICogdGhhdCBpbmZvcm1hdGlvbi4KICAgKi8KICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgLyoqCiAgICogVGhlIGZpbGUgc3lzdGVtIHBhdGggb24gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkLiBDYW4gYmUgYG51bGxgCiAgICogaWYgdGhlIGV4Y2VwdGlvbiBkb2VzIG5vdCByZWxhdGUgZGlyZWN0bHkgdG8gYSBmaWxlIHN5c3RlbSBwYXRoLgogICAqLwogIGZpbmFsIFN0cmluZyBwYXRoOwoKICAvKioKICAgKiBUaGUgdW5kZXJseWluZyBPUyBlcnJvci4gQ2FuIGJlIGBudWxsYCBpZiB0aGUgZXhjZXB0aW9uIGlzIG5vdAogICAqIHJhaXNlZCBkdWUgdG8gYW4gT1MgZXJyb3IuCiAgICovCiAgZmluYWwgT1NFcnJvciBvc0Vycm9yOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24gd2l0aCBhbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlCiAgICogW21lc3NhZ2VdLCBvcHRpb25hbCBmaWxlIHN5c3RlbSBwYXRoIFtwYXRoXSBhbmQgb3B0aW9uYWwgT1MgZXJyb3IKICAgKiBbb3NFcnJvcl0uCiAgICovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGNvbnN0IEZpbGVTeXN0ZW1FeGNlcHRpb24oW3RoaXMubWVzc2FnZSA9ICIiLCB0aGlzLnBhdGggPSAiIiwgdGhpcy5vc0Vycm9yXSk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCJGaWxlU3lzdGVtRXhjZXB0aW9uIik7CiAgICBpZiAobWVzc2FnZS5pc05vdEVtcHR5KSB7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c3MgX0ZpbGVTdHJlYW0gZXh0ZW5kcyBTdHJlYW08TGlzdDxpbnQ+PiB7CiAgLy8gU3RyZWFtIGNvbnRyb2xsZXIuCiAgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+IF9jb250cm9sbGVyOwoKICAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgdW5kZXJseWluZyBmaWxlLgogIFN0cmluZyBfcGF0aDsKICBSYW5kb21BY2Nlc3NGaWxlIF9vcGVuZWRGaWxlOwogIGludCBfcG9zaXRpb247CiAgaW50IF9lbmQ7CiAgZmluYWwgQ29tcGxldGVyIF9jbG9zZUNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKCiAgLy8gSGFzIHRoZSBzdHJlYW0gYmVlbiBwYXVzZWQgb3IgdW5zdWJzY3JpYmVkPwogIGJvb2wgX3Vuc3Vic2NyaWJlZCA9IGZhbHNlOwoKICAvLyBJcyB0aGVyZSBhIHJlYWQgY3VycmVudGx5IGluIHByb2dyZXNzPwogIGJvb2wgX3JlYWRJblByb2dyZXNzID0gdHJ1ZTsKICBib29sIF9jbG9zZWQgPSBmYWxzZTsKCiAgYm9vbCBfYXRFbmQgPSBmYWxzZTsKCiAgX0ZpbGVTdHJlYW0odGhpcy5fcGF0aCwgdGhpcy5fcG9zaXRpb24sIHRoaXMuX2VuZCkgewogICAgX3Bvc2l0aW9uID8/PSAwOwogIH0KCiAgX0ZpbGVTdHJlYW0uZm9yU3RkaW4oKSA6IF9wb3NpdGlvbiA9IDA7CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxVaW50OExpc3Q+IGxpc3Rlbih2b2lkIG9uRGF0YShVaW50OExpc3QgZXZlbnQpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgX3NldHVwQ29udHJvbGxlcigpOwogICAgcmV0dXJuIF9jb250cm9sbGVyLnN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIHZvaWQgX3NldHVwQ29udHJvbGxlcigpIHsKICAgIF9jb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PigKICAgICAgICBzeW5jOiB0cnVlLAogICAgICAgIG9uTGlzdGVuOiBfc3RhcnQsCiAgICAgICAgb25SZXN1bWU6IF9yZWFkQmxvY2ssCiAgICAgICAgb25DYW5jZWw6ICgpIHsKICAgICAgICAgIF91bnN1YnNjcmliZWQgPSB0cnVlOwogICAgICAgICAgcmV0dXJuIF9jbG9zZUZpbGUoKTsKICAgICAgICB9KTsKICB9CgogIEZ1dHVyZSBfY2xvc2VGaWxlKCkgewogICAgaWYgKF9yZWFkSW5Qcm9ncmVzcyB8fCBfY2xvc2VkKSB7CiAgICAgIHJldHVybiBfY2xvc2VDb21wbGV0ZXIuZnV0dXJlOwogICAgfQogICAgX2Nsb3NlZCA9IHRydWU7CgogICAgdm9pZCBkb25lKCkgewogICAgICBfY2xvc2VDb21wbGV0ZXIuY29tcGxldGUoKTsKICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgIH0KCiAgICBfb3BlbmVkRmlsZS5jbG9zZSgpLmNhdGNoRXJyb3IoX2NvbnRyb2xsZXIuYWRkRXJyb3IpLndoZW5Db21wbGV0ZShkb25lKTsKICAgIHJldHVybiBfY2xvc2VDb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgdm9pZCBfcmVhZEJsb2NrKCkgewogICAgLy8gRG9uJ3Qgc3RhcnQgYSBuZXcgcmVhZCBpZiBvbmUgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcy4KICAgIGlmIChfcmVhZEluUHJvZ3Jlc3MpIHJldHVybjsKICAgIGlmIChfYXRFbmQpIHsKICAgICAgX2Nsb3NlRmlsZSgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBfcmVhZEluUHJvZ3Jlc3MgPSB0cnVlOwogICAgaW50IHJlYWRCeXRlcyA9IF9ibG9ja1NpemU7CiAgICBpZiAoX2VuZCAhPSBudWxsKSB7CiAgICAgIHJlYWRCeXRlcyA9IG1pbihyZWFkQnl0ZXMsIF9lbmQgLSBfcG9zaXRpb24pOwogICAgICBpZiAocmVhZEJ5dGVzIDwgMCkgewogICAgICAgIF9yZWFkSW5Qcm9ncmVzcyA9IGZhbHNlOwogICAgICAgIGlmICghX3Vuc3Vic2NyaWJlZCkgewogICAgICAgICAgX2NvbnRyb2xsZXIuYWRkRXJyb3IobmV3IFJhbmdlRXJyb3IoIkJhZCBlbmQgcG9zaXRpb246ICRfZW5kIikpOwogICAgICAgICAgX2Nsb3NlRmlsZSgpOwogICAgICAgICAgX3Vuc3Vic2NyaWJlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgX29wZW5lZEZpbGUucmVhZChyZWFkQnl0ZXMpLnRoZW4oKGJsb2NrKSB7CiAgICAgIF9yZWFkSW5Qcm9ncmVzcyA9IGZhbHNlOwogICAgICBpZiAoX3Vuc3Vic2NyaWJlZCkgewogICAgICAgIF9jbG9zZUZpbGUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgX3Bvc2l0aW9uICs9IGJsb2NrLmxlbmd0aDsKICAgICAgaWYgKGJsb2NrLmxlbmd0aCA8IHJlYWRCeXRlcyB8fCAoX2VuZCAhPSBudWxsICYmIF9wb3NpdGlvbiA9PSBfZW5kKSkgewogICAgICAgIF9hdEVuZCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKCFfYXRFbmQgJiYgIV9jb250cm9sbGVyLmlzUGF1c2VkKSB7CiAgICAgICAgX3JlYWRCbG9jaygpOwogICAgICB9CiAgICAgIF9jb250cm9sbGVyLmFkZChibG9jayk7CiAgICAgIGlmIChfYXRFbmQpIHsKICAgICAgICBfY2xvc2VGaWxlKCk7CiAgICAgIH0KICAgIH0pLmNhdGNoRXJyb3IoKGUsIHMpIHsKICAgICAgaWYgKCFfdW5zdWJzY3JpYmVkKSB7CiAgICAgICAgX2NvbnRyb2xsZXIuYWRkRXJyb3IoZSwgcyk7CiAgICAgICAgX2Nsb3NlRmlsZSgpOwogICAgICAgIF91bnN1YnNjcmliZWQgPSB0cnVlOwogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgX3N0YXJ0KCkgewogICAgaWYgKF9wb3NpdGlvbiA8IDApIHsKICAgICAgX2NvbnRyb2xsZXIuYWRkRXJyb3IobmV3IFJhbmdlRXJyb3IoIkJhZCBzdGFydCBwb3NpdGlvbjogJF9wb3NpdGlvbiIpKTsKICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgX2Nsb3NlQ29tcGxldGVyLmNvbXBsZXRlKCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2b2lkIG9uUmVhZHkoUmFuZG9tQWNjZXNzRmlsZSBmaWxlKSB7CiAgICAgIF9vcGVuZWRGaWxlID0gZmlsZTsKICAgICAgX3JlYWRJblByb2dyZXNzID0gZmFsc2U7CiAgICAgIF9yZWFkQmxvY2soKTsKICAgIH0KCiAgICB2b2lkIG9uT3BlbkZpbGUoUmFuZG9tQWNjZXNzRmlsZSBmaWxlKSB7CiAgICAgIGlmIChfcG9zaXRpb24gPiAwKSB7CiAgICAgICAgZmlsZS5zZXRQb3NpdGlvbihfcG9zaXRpb24pLnRoZW4ob25SZWFkeSwgb25FcnJvcjogKGUsIHMpIHsKICAgICAgICAgIF9jb250cm9sbGVyLmFkZEVycm9yKGUsIHMpOwogICAgICAgICAgX3JlYWRJblByb2dyZXNzID0gZmFsc2U7CiAgICAgICAgICBfY2xvc2VGaWxlKCk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb25SZWFkeShmaWxlKTsKICAgICAgfQogICAgfQoKICAgIHZvaWQgb3BlbkZhaWxlZChlcnJvciwgc3RhY2tUcmFjZSkgewogICAgICBfY29udHJvbGxlci5hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgIF9jbG9zZUNvbXBsZXRlci5jb21wbGV0ZSgpOwogICAgfQoKICAgIGlmIChfcGF0aCAhPSBudWxsKSB7CiAgICAgIG5ldyBGaWxlKF9wYXRoKQogICAgICAgICAgLm9wZW4obW9kZTogRmlsZU1vZGUucmVhZCkKICAgICAgICAgIC50aGVuKG9uT3BlbkZpbGUsIG9uRXJyb3I6IG9wZW5GYWlsZWQpOwogICAgfSBlbHNlIHsKICAgICAgdHJ5IHsKICAgICAgICBvbk9wZW5GaWxlKF9GaWxlLl9vcGVuU3RkaW9TeW5jKDApKTsKICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgIG9wZW5GYWlsZWQoZSwgcyk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmNsYXNzIF9GaWxlU3RyZWFtQ29uc3VtZXIgZXh0ZW5kcyBTdHJlYW1Db25zdW1lcjxMaXN0PGludD4+IHsKICBGaWxlIF9maWxlOwogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiBfb3BlbkZ1dHVyZTsKCiAgX0ZpbGVTdHJlYW1Db25zdW1lcih0aGlzLl9maWxlLCBGaWxlTW9kZSBtb2RlKSB7CiAgICBfb3BlbkZ1dHVyZSA9IF9maWxlLm9wZW4obW9kZTogbW9kZSk7CiAgfQoKICBfRmlsZVN0cmVhbUNvbnN1bWVyLmZyb21TdGRpbyhpbnQgZmQpIHsKICAgIF9vcGVuRnV0dXJlID0gbmV3IEZ1dHVyZS52YWx1ZShfRmlsZS5fb3BlblN0ZGlvU3luYyhmZCkpOwogIH0KCiAgRnV0dXJlPEZpbGU+IGFkZFN0cmVhbShTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0pIHsKICAgIENvbXBsZXRlcjxGaWxlPiBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPEZpbGU+LnN5bmMoKTsKICAgIF9vcGVuRnV0dXJlLnRoZW4oKG9wZW5lZEZpbGUpIHsKICAgICAgdmFyIF9zdWJzY3JpcHRpb247CiAgICAgIHZvaWQgZXJyb3IoZSwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgICAgICBfc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgICAgIG9wZW5lZEZpbGUuY2xvc2UoKTsKICAgICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihlLCBzdGFja1RyYWNlKTsKICAgICAgfQoKICAgICAgX3N1YnNjcmlwdGlvbiA9IHN0cmVhbS5saXN0ZW4oKGQpIHsKICAgICAgICBfc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIG9wZW5lZEZpbGUKICAgICAgICAgICAgICAud3JpdGVGcm9tKGQsIDAsIGQubGVuZ3RoKQogICAgICAgICAgICAgIC50aGVuKChfKSA9PiBfc3Vic2NyaXB0aW9uLnJlc3VtZSgpLCBvbkVycm9yOiBlcnJvcik7CiAgICAgICAgfSBjYXRjaCAoZSwgc3RhY2tUcmFjZSkgewogICAgICAgICAgZXJyb3IoZSwgc3RhY2tUcmFjZSk7CiAgICAgICAgfQogICAgICB9LCBvbkRvbmU6ICgpIHsKICAgICAgICBjb21wbGV0ZXIuY29tcGxldGUoX2ZpbGUpOwogICAgICB9LCBvbkVycm9yOiBlcnJvciwgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICB9KS5jYXRjaEVycm9yKGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKTsKICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgRnV0dXJlPEZpbGU+IGNsb3NlKCkgPT4KICAgICAgX29wZW5GdXR1cmUudGhlbigob3BlbmVkRmlsZSkgPT4gb3BlbmVkRmlsZS5jbG9zZSgpKS50aGVuKChfKSA9PiBfZmlsZSk7Cn0KCi8vIENsYXNzIGZvciBlbmNhcHN1bGF0aW5nIHRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZmlsZXMuCmNsYXNzIF9GaWxlIGV4dGVuZHMgRmlsZVN5c3RlbUVudGl0eSBpbXBsZW1lbnRzIEZpbGUgewogIFN0cmluZyBfcGF0aDsKICBVaW50OExpc3QgX3Jhd1BhdGg7CgogIF9GaWxlKFN0cmluZyBwYXRoKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChwYXRoLCAncGF0aCcpOwogICAgX3BhdGggPSBwYXRoOwogICAgX3Jhd1BhdGggPSBGaWxlU3lzdGVtRW50aXR5Ll90b1V0ZjhBcnJheShwYXRoKTsKICB9CgogIF9GaWxlLmZyb21SYXdQYXRoKFVpbnQ4TGlzdCByYXdQYXRoKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChyYXdQYXRoLCAncmF3UGF0aCcpOwogICAgX3Jhd1BhdGggPSBGaWxlU3lzdGVtRW50aXR5Ll90b051bGxUZXJtaW5hdGVkVXRmOEFycmF5KHJhd1BhdGgpOwogICAgX3BhdGggPSBGaWxlU3lzdGVtRW50aXR5Ll90b1N0cmluZ0Zyb21VdGY4QXJyYXkocmF3UGF0aCk7CiAgfQoKICBTdHJpbmcgZ2V0IHBhdGggPT4gX3BhdGg7CgogIC8vIFdBUk5JTkc6CiAgLy8gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgaW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgbmF0aXZlCiAgLy8gbmFtZXNwYWNlIG9iamVjdC4gSXQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHRvIHBhc3MgdGhlIHBvaW50ZXIgdG8gdGhlCiAgLy8gSU9TZXJ2aWNlLCB3aGljaCB3aWxsIGRlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IHdoZW4gaXQgaXMgZmluaXNoZWQKICAvLyB3aXRoIGl0LgogIHN0YXRpYyBpbnQgX25hbWVzcGFjZVBvaW50ZXIoKSA9PiBfTmFtZXNwYWNlLl9uYW1lc3BhY2VQb2ludGVyOwoKICBzdGF0aWMgRnV0dXJlIF9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoaW50IHJlcXVlc3QsIExpc3QgZGF0YSkgewogICAgZGF0YVswXSA9IF9uYW1lc3BhY2VQb2ludGVyKCk7CiAgICByZXR1cm4gX0lPU2VydmljZS5fZGlzcGF0Y2gocmVxdWVzdCwgZGF0YSk7CiAgfQoKICBGdXR1cmU8Ym9vbD4gZXhpc3RzKCkgewogICAgcmV0dXJuIF9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoX0lPU2VydmljZS5maWxlRXhpc3RzLCBbbnVsbCwgX3Jhd1BhdGhdKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAiQ2Fubm90IGNoZWNrIGV4aXN0ZW5jZSIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0pOwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIF9leGlzdHMoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKTsKCiAgYm9vbCBleGlzdHNTeW5jKCkgewogICAgdmFyIHJlc3VsdCA9IF9leGlzdHMoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCk7CiAgICB0aHJvd0lmRXJyb3IocmVzdWx0LCAiQ2Fubm90IGNoZWNrIGV4aXN0ZW5jZSBvZiBmaWxlIiwgcGF0aCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRmlsZSBnZXQgYWJzb2x1dGUgPT4gbmV3IEZpbGUoX2Fic29sdXRlUGF0aCk7CgogIEZ1dHVyZTxGaWxlPiBjcmVhdGUoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIHZhciByZXN1bHQgPQogICAgICAgIHJlY3Vyc2l2ZSA/IHBhcmVudC5jcmVhdGUocmVjdXJzaXZlOiB0cnVlKSA6IG5ldyBGdXR1cmUudmFsdWUobnVsbCk7CiAgICByZXR1cm4gcmVzdWx0CiAgICAgICAgLnRoZW4oKF8pID0+CiAgICAgICAgICAgIF9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoX0lPU2VydmljZS5maWxlQ3JlYXRlLCBbbnVsbCwgX3Jhd1BhdGhdKSkKICAgICAgICAudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgIkNhbm5vdCBjcmVhdGUgZmlsZSIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX2NyZWF0ZShfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwoKICBleHRlcm5hbCBzdGF0aWMgX2NyZWF0ZUxpbmsoCiAgICAgIF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwgU3RyaW5nIHRhcmdldCk7CgogIGV4dGVybmFsIHN0YXRpYyBfbGlua1RhcmdldChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwoKICB2b2lkIGNyZWF0ZVN5bmMoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIGlmIChyZWN1cnNpdmUpIHsKICAgICAgcGFyZW50LmNyZWF0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfY3JlYXRlKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgdGhyb3dJZkVycm9yKHJlc3VsdCwgIkNhbm5vdCBjcmVhdGUgZmlsZSIsIHBhdGgpOwogIH0KCiAgRnV0dXJlPEZpbGU+IF9kZWxldGUoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIGlmIChyZWN1cnNpdmUpIHsKICAgICAgcmV0dXJuIG5ldyBEaXJlY3RvcnkocGF0aCkuZGVsZXRlKHJlY3Vyc2l2ZTogdHJ1ZSkudGhlbigoXykgPT4gdGhpcyk7CiAgICB9CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZShfSU9TZXJ2aWNlLmZpbGVEZWxldGUsIFtudWxsLCBfcmF3UGF0aF0pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJDYW5ub3QgZGVsZXRlIGZpbGUiLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIF9kZWxldGVOYXRpdmUoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKTsKCiAgZXh0ZXJuYWwgc3RhdGljIF9kZWxldGVMaW5rTmF0aXZlKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCk7CgogIHZvaWQgX2RlbGV0ZVN5bmMoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIGlmIChyZWN1cnNpdmUpIHsKICAgICAgcmV0dXJuIG5ldyBEaXJlY3RvcnkuZnJvbVJhd1BhdGgoX3Jhd1BhdGgpLmRlbGV0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfZGVsZXRlTmF0aXZlKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgdGhyb3dJZkVycm9yKHJlc3VsdCwgIkNhbm5vdCBkZWxldGUgZmlsZSIsIHBhdGgpOwogIH0KCiAgRnV0dXJlPEZpbGU+IHJlbmFtZShTdHJpbmcgbmV3UGF0aCkgewogICAgcmV0dXJuIF9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoCiAgICAgICAgX0lPU2VydmljZS5maWxlUmVuYW1lLCBbbnVsbCwgX3Jhd1BhdGgsIG5ld1BhdGhdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNhbm5vdCByZW5hbWUgZmlsZSB0byAnJG5ld1BhdGgnIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBGaWxlKG5ld1BhdGgpOwogICAgfSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX3JlbmFtZSgKICAgICAgX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCk7CgogIGV4dGVybmFsIHN0YXRpYyBfcmVuYW1lTGluaygKICAgICAgX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCk7CgogIEZpbGUgcmVuYW1lU3luYyhTdHJpbmcgbmV3UGF0aCkgewogICAgdmFyIHJlc3VsdCA9IF9yZW5hbWUoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCwgbmV3UGF0aCk7CiAgICB0aHJvd0lmRXJyb3IocmVzdWx0LCAiQ2Fubm90IHJlbmFtZSBmaWxlIHRvICckbmV3UGF0aCciLCBwYXRoKTsKICAgIHJldHVybiBuZXcgRmlsZShuZXdQYXRoKTsKICB9CgogIEZ1dHVyZTxGaWxlPiBjb3B5KFN0cmluZyBuZXdQYXRoKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICBfSU9TZXJ2aWNlLmZpbGVDb3B5LCBbbnVsbCwgX3Jhd1BhdGgsIG5ld1BhdGhdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNhbm5vdCBjb3B5IGZpbGUgdG8gJyRuZXdQYXRoJyIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRmlsZShuZXdQYXRoKTsKICAgIH0pOwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIF9jb3B5KAogICAgICBfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoKTsKCiAgRmlsZSBjb3B5U3luYyhTdHJpbmcgbmV3UGF0aCkgewogICAgdmFyIHJlc3VsdCA9IF9jb3B5KF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgsIG5ld1BhdGgpOwogICAgdGhyb3dJZkVycm9yKHJlc3VsdCwgIkNhbm5vdCBjb3B5IGZpbGUgdG8gJyRuZXdQYXRoJyIsIHBhdGgpOwogICAgcmV0dXJuIG5ldyBGaWxlKG5ld1BhdGgpOwogIH0KCiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IG9wZW4oe0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLnJlYWR9KSB7CiAgICBpZiAobW9kZSAhPSBGaWxlTW9kZS5yZWFkICYmCiAgICAgICAgbW9kZSAhPSBGaWxlTW9kZS53cml0ZSAmJgogICAgICAgIG1vZGUgIT0gRmlsZU1vZGUuYXBwZW5kICYmCiAgICAgICAgbW9kZSAhPSBGaWxlTW9kZS53cml0ZU9ubHkgJiYKICAgICAgICBtb2RlICE9IEZpbGVNb2RlLndyaXRlT25seUFwcGVuZCkgewogICAgICByZXR1cm4gbmV3IEZ1dHVyZS5lcnJvcigKICAgICAgICAgIG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIGZpbGUgbW9kZSBmb3IgdGhpcyBvcGVyYXRpb24nKSk7CiAgICB9CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICBfSU9TZXJ2aWNlLmZpbGVPcGVuLCBbbnVsbCwgX3Jhd1BhdGgsIG1vZGUuX21vZGVdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAiQ2Fubm90IG9wZW4gZmlsZSIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgX1JhbmRvbUFjY2Vzc0ZpbGUocmVzcG9uc2UsIHBhdGgpOwogICAgfSk7CiAgfQoKICBGdXR1cmU8aW50PiBsZW5ndGgoKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICBfSU9TZXJ2aWNlLmZpbGVMZW5ndGhGcm9tUGF0aCwgW251bGwsIF9yYXdQYXRoXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZSgKICAgICAgICAgICAgcmVzcG9uc2UsICJDYW5ub3QgcmV0cmlldmUgbGVuZ3RoIG9mIGZpbGUiLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9KTsKICB9CgogIGV4dGVybmFsIHN0YXRpYyBfbGVuZ3RoRnJvbVBhdGgoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKTsKCiAgaW50IGxlbmd0aFN5bmMoKSB7CiAgICB2YXIgcmVzdWx0ID0gX2xlbmd0aEZyb21QYXRoKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgdGhyb3dJZkVycm9yKHJlc3VsdCwgIkNhbm5vdCByZXRyaWV2ZSBsZW5ndGggb2YgZmlsZSIsIHBhdGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEZ1dHVyZTxEYXRlVGltZT4gbGFzdEFjY2Vzc2VkKCkgewogICAgcmV0dXJuIF9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoX0lPU2VydmljZS5maWxlTGFzdEFjY2Vzc2VkLCBbbnVsbCwgX3Jhd1BhdGhdKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNhbm5vdCByZXRyaWV2ZSBhY2Nlc3MgdGltZSIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2gocmVzcG9uc2UpOwogICAgfSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX2xhc3RBY2Nlc3NlZChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwoKICBEYXRlVGltZSBsYXN0QWNjZXNzZWRTeW5jKCkgewogICAgdmFyIG1zID0gX2xhc3RBY2Nlc3NlZChfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoKTsKICAgIHRocm93SWZFcnJvcihtcywgIkNhbm5vdCByZXRyaWV2ZSBhY2Nlc3MgdGltZSIsIHBhdGgpOwogICAgcmV0dXJuIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChtcyk7CiAgfQoKICBGdXR1cmUgc2V0TGFzdEFjY2Vzc2VkKERhdGVUaW1lIHRpbWUpIHsKICAgIGludCBtaWxsaXMgPSB0aW1lLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2g7CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICAgICAgX0lPU2VydmljZS5maWxlU2V0TGFzdEFjY2Vzc2VkLCBbbnVsbCwgX3Jhd1BhdGgsIG1pbGxpc10pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJDYW5ub3Qgc2V0IGFjY2VzcyB0aW1lIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9KTsKICB9CgogIGV4dGVybmFsIHN0YXRpYyBfc2V0TGFzdEFjY2Vzc2VkKAogICAgICBfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgsIGludCBtaWxsaXMpOwoKICB2b2lkIHNldExhc3RBY2Nlc3NlZFN5bmMoRGF0ZVRpbWUgdGltZSkgewogICAgaW50IG1pbGxpcyA9IHRpbWUubWlsbGlzZWNvbmRzU2luY2VFcG9jaDsKICAgIHZhciByZXN1bHQgPSBfc2V0TGFzdEFjY2Vzc2VkKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgsIG1pbGxpcyk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oCiAgICAgICAgICAiRmFpbGVkIHRvIHNldCBmaWxlIGFjY2VzcyB0aW1lIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICB9CgogIEZ1dHVyZTxEYXRlVGltZT4gbGFzdE1vZGlmaWVkKCkgewogICAgcmV0dXJuIF9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoX0lPU2VydmljZS5maWxlTGFzdE1vZGlmaWVkLCBbbnVsbCwgX3Jhd1BhdGhdKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNhbm5vdCByZXRyaWV2ZSBtb2RpZmljYXRpb24gdGltZSIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2gocmVzcG9uc2UpOwogICAgfSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX2xhc3RNb2RpZmllZChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwoKICBEYXRlVGltZSBsYXN0TW9kaWZpZWRTeW5jKCkgewogICAgdmFyIG1zID0gX2xhc3RNb2RpZmllZChfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoKTsKICAgIHRocm93SWZFcnJvcihtcywgIkNhbm5vdCByZXRyaWV2ZSBtb2RpZmljYXRpb24gdGltZSIsIHBhdGgpOwogICAgcmV0dXJuIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChtcyk7CiAgfQoKICBGdXR1cmUgc2V0TGFzdE1vZGlmaWVkKERhdGVUaW1lIHRpbWUpIHsKICAgIGludCBtaWxsaXMgPSB0aW1lLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2g7CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICAgICAgX0lPU2VydmljZS5maWxlU2V0TGFzdE1vZGlmaWVkLCBbbnVsbCwgX3Jhd1BhdGgsIG1pbGxpc10pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UoCiAgICAgICAgICAgIHJlc3BvbnNlLCAiQ2Fubm90IHNldCBtb2RpZmljYXRpb24gdGltZSIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX3NldExhc3RNb2RpZmllZCgKICAgICAgX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoLCBpbnQgbWlsbGlzKTsKCiAgdm9pZCBzZXRMYXN0TW9kaWZpZWRTeW5jKERhdGVUaW1lIHRpbWUpIHsKICAgIGludCBtaWxsaXMgPSB0aW1lLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2g7CiAgICB2YXIgcmVzdWx0ID0gX3NldExhc3RNb2RpZmllZChfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoLCBtaWxsaXMpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKAogICAgICAgICAgIkZhaWxlZCB0byBzZXQgZmlsZSBtb2RpZmljYXRpb24gdGltZSIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX29wZW4oX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoLCBpbnQgbW9kZSk7CgogIFJhbmRvbUFjY2Vzc0ZpbGUgb3BlblN5bmMoe0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLnJlYWR9KSB7CiAgICBpZiAobW9kZSAhPSBGaWxlTW9kZS5yZWFkICYmCiAgICAgICAgbW9kZSAhPSBGaWxlTW9kZS53cml0ZSAmJgogICAgICAgIG1vZGUgIT0gRmlsZU1vZGUuYXBwZW5kICYmCiAgICAgICAgbW9kZSAhPSBGaWxlTW9kZS53cml0ZU9ubHkgJiYKICAgICAgICBtb2RlICE9IEZpbGVNb2RlLndyaXRlT25seUFwcGVuZCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignSW52YWxpZCBmaWxlIG1vZGUgZm9yIHRoaXMgb3BlcmF0aW9uJyk7CiAgICB9CiAgICB2YXIgaWQgPSBfb3BlbihfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoLCBtb2RlLl9tb2RlKTsKICAgIHRocm93SWZFcnJvcihpZCwgIkNhbm5vdCBvcGVuIGZpbGUiLCBwYXRoKTsKICAgIHJldHVybiBuZXcgX1JhbmRvbUFjY2Vzc0ZpbGUoaWQsIF9wYXRoKTsKICB9CgogIGV4dGVybmFsIHN0YXRpYyBpbnQgX29wZW5TdGRpbyhpbnQgZmQpOwoKICBzdGF0aWMgUmFuZG9tQWNjZXNzRmlsZSBfb3BlblN0ZGlvU3luYyhpbnQgZmQpIHsKICAgIHZhciBpZCA9IF9vcGVuU3RkaW8oZmQpOwogICAgaWYgKGlkID09IDApIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oIkNhbm5vdCBvcGVuIHN0ZGlvIGZpbGUgZm9yOiAkZmQiKTsKICAgIH0KICAgIHJldHVybiBuZXcgX1JhbmRvbUFjY2Vzc0ZpbGUoaWQsICIiKTsKICB9CgogIFN0cmVhbTxMaXN0PGludD4+IG9wZW5SZWFkKFtpbnQgc3RhcnQsIGludCBlbmRdKSB7CiAgICByZXR1cm4gbmV3IF9GaWxlU3RyZWFtKHBhdGgsIHN0YXJ0LCBlbmQpOwogIH0KCiAgSU9TaW5rIG9wZW5Xcml0ZSh7RmlsZU1vZGUgbW9kZTogRmlsZU1vZGUud3JpdGUsIEVuY29kaW5nIGVuY29kaW5nOiB1dGY4fSkgewogICAgaWYgKG1vZGUgIT0gRmlsZU1vZGUud3JpdGUgJiYKICAgICAgICBtb2RlICE9IEZpbGVNb2RlLmFwcGVuZCAmJgogICAgICAgIG1vZGUgIT0gRmlsZU1vZGUud3JpdGVPbmx5ICYmCiAgICAgICAgbW9kZSAhPSBGaWxlTW9kZS53cml0ZU9ubHlBcHBlbmQpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgZmlsZSBtb2RlIGZvciB0aGlzIG9wZXJhdGlvbicpOwogICAgfQogICAgdmFyIGNvbnN1bWVyID0gbmV3IF9GaWxlU3RyZWFtQ29uc3VtZXIodGhpcywgbW9kZSk7CiAgICByZXR1cm4gbmV3IElPU2luayhjb25zdW1lciwgZW5jb2Rpbmc6IGVuY29kaW5nKTsKICB9CgogIEZ1dHVyZTxVaW50OExpc3Q+IHJlYWRBc0J5dGVzKCkgewogICAgRnV0dXJlPFVpbnQ4TGlzdD4gcmVhZERhdGFDaHVua2VkKFJhbmRvbUFjY2Vzc0ZpbGUgZmlsZSkgewogICAgICB2YXIgYnVpbGRlciA9IG5ldyBCeXRlc0J1aWxkZXIoY29weTogZmFsc2UpOwogICAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxVaW50OExpc3Q+KCk7CiAgICAgIHZvaWQgcmVhZCgpIHsKICAgICAgICBmaWxlLnJlYWQoX2Jsb2NrU2l6ZSkudGhlbigoZGF0YSkgewogICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgICBidWlsZGVyLmFkZChkYXRhKTsKICAgICAgICAgICAgcmVhZCgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlKGJ1aWxkZXIudGFrZUJ5dGVzKCkpOwogICAgICAgICAgfQogICAgICAgIH0sIG9uRXJyb3I6IGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKTsKICAgICAgfQoKICAgICAgcmVhZCgpOwogICAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKICAgIH0KCiAgICByZXR1cm4gb3BlbigpLnRoZW4oKGZpbGUpIHsKICAgICAgcmV0dXJuIGZpbGUubGVuZ3RoKCkudGhlbigobGVuZ3RoKSB7CiAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAvLyBNYXkgYmUgY2hhcmFjdGVyIGRldmljZSwgdHJ5IHRvIHJlYWQgaXQgaW4gY2h1bmtzLgogICAgICAgICAgcmV0dXJuIHJlYWREYXRhQ2h1bmtlZChmaWxlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZpbGUucmVhZChsZW5ndGgpOwogICAgICB9KS53aGVuQ29tcGxldGUoZmlsZS5jbG9zZSk7CiAgICB9KTsKICB9CgogIFVpbnQ4TGlzdCByZWFkQXNCeXRlc1N5bmMoKSB7CiAgICB2YXIgb3BlbmVkID0gb3BlblN5bmMoKTsKICAgIHRyeSB7CiAgICAgIFVpbnQ4TGlzdCBkYXRhOwogICAgICB2YXIgbGVuZ3RoID0gb3BlbmVkLmxlbmd0aFN5bmMoKTsKICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CiAgICAgICAgLy8gTWF5IGJlIGNoYXJhY3RlciBkZXZpY2UsIHRyeSB0byByZWFkIGl0IGluIGNodW5rcy4KICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBCeXRlc0J1aWxkZXIoY29weTogZmFsc2UpOwogICAgICAgIGRvIHsKICAgICAgICAgIGRhdGEgPSBvcGVuZWQucmVhZFN5bmMoX2Jsb2NrU2l6ZSk7CiAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSBidWlsZGVyLmFkZChkYXRhKTsKICAgICAgICB9IHdoaWxlIChkYXRhLmxlbmd0aCA+IDApOwogICAgICAgIGRhdGEgPSBidWlsZGVyLnRha2VCeXRlcygpOwogICAgICB9IGVsc2UgewogICAgICAgIGRhdGEgPSBvcGVuZWQucmVhZFN5bmMobGVuZ3RoKTsKICAgICAgfQogICAgICByZXR1cm4gZGF0YTsKICAgIH0gZmluYWxseSB7CiAgICAgIG9wZW5lZC5jbG9zZVN5bmMoKTsKICAgIH0KICB9CgogIFN0cmluZyBfdHJ5RGVjb2RlKExpc3Q8aW50PiBieXRlcywgRW5jb2RpbmcgZW5jb2RpbmcpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiBlbmNvZGluZy5kZWNvZGUoYnl0ZXMpOwogICAgfSBjYXRjaCAoXykgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigKICAgICAgICAgICJGYWlsZWQgdG8gZGVjb2RlIGRhdGEgdXNpbmcgZW5jb2RpbmcgJyR7ZW5jb2RpbmcubmFtZX0nIiwgcGF0aCk7CiAgICB9CiAgfQoKICBGdXR1cmU8U3RyaW5nPiByZWFkQXNTdHJpbmcoe0VuY29kaW5nIGVuY29kaW5nOiB1dGY4fSkgewogICAgLy8gVE9ETyhkYXJ0OmlvKTogSWYgdGhlIGNoYW5nZSBpbiBhc3luYyBzZW1hbnRpY3MgdG8gcnVuIHN5bmNocm9ub3VzbHkKICAgIC8vIHVudGlsIGF3YWl0IGxhbmRzLCB0aGlzIGlzIGFzIGVmZmljaWVudCBhcwogICAgLy8gcmV0dXJuIF90cnlEZWNvZGUoYXdhaXQgcmVhZEFzQnl0ZXMoKSwgZW5jb2RpbmcpOwogICAgdmFyIHN0YWNrID0gU3RhY2tUcmFjZS5jdXJyZW50OwogICAgcmV0dXJuIHJlYWRBc0J5dGVzKCkudGhlbigoYnl0ZXMpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gX3RyeURlY29kZShieXRlcywgZW5jb2RpbmcpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IoZSwgc3RhY2spOwogICAgICB9CiAgICB9KTsKICB9CgogIFN0cmluZyByZWFkQXNTdHJpbmdTeW5jKHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pID0+CiAgICAgIF90cnlEZWNvZGUocmVhZEFzQnl0ZXNTeW5jKCksIGVuY29kaW5nKTsKCiAgRnV0dXJlPExpc3Q8U3RyaW5nPj4gcmVhZEFzTGluZXMoe0VuY29kaW5nIGVuY29kaW5nOiB1dGY4fSkgPT4KICAgICAgcmVhZEFzU3RyaW5nKGVuY29kaW5nOiBlbmNvZGluZykudGhlbihjb25zdCBMaW5lU3BsaXR0ZXIoKS5jb252ZXJ0KTsKCiAgTGlzdDxTdHJpbmc+IHJlYWRBc0xpbmVzU3luYyh7RW5jb2RpbmcgZW5jb2Rpbmc6IHV0Zjh9KSA9PgogICAgICBjb25zdCBMaW5lU3BsaXR0ZXIoKS5jb252ZXJ0KHJlYWRBc1N0cmluZ1N5bmMoZW5jb2Rpbmc6IGVuY29kaW5nKSk7CgogIEZ1dHVyZTxGaWxlPiB3cml0ZUFzQnl0ZXMoTGlzdDxpbnQ+IGJ5dGVzLAogICAgICB7RmlsZU1vZGUgbW9kZTogRmlsZU1vZGUud3JpdGUsIGJvb2wgZmx1c2g6IGZhbHNlfSkgewogICAgcmV0dXJuIG9wZW4obW9kZTogbW9kZSkudGhlbigoZmlsZSkgewogICAgICByZXR1cm4gZmlsZS53cml0ZUZyb20oYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCkudGhlbjxGaWxlPigoXykgewogICAgICAgIGlmIChmbHVzaCkgcmV0dXJuIGZpbGUuZmx1c2goKS50aGVuKChfKSA9PiB0aGlzKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSkud2hlbkNvbXBsZXRlKGZpbGUuY2xvc2UpOwogICAgfSk7CiAgfQoKICB2b2lkIHdyaXRlQXNCeXRlc1N5bmMoTGlzdDxpbnQ+IGJ5dGVzLAogICAgICB7RmlsZU1vZGUgbW9kZTogRmlsZU1vZGUud3JpdGUsIGJvb2wgZmx1c2g6IGZhbHNlfSkgewogICAgUmFuZG9tQWNjZXNzRmlsZSBvcGVuZWQgPSBvcGVuU3luYyhtb2RlOiBtb2RlKTsKICAgIHRyeSB7CiAgICAgIG9wZW5lZC53cml0ZUZyb21TeW5jKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwogICAgICBpZiAoZmx1c2gpIG9wZW5lZC5mbHVzaFN5bmMoKTsKICAgIH0gZmluYWxseSB7CiAgICAgIG9wZW5lZC5jbG9zZVN5bmMoKTsKICAgIH0KICB9CgogIEZ1dHVyZTxGaWxlPiB3cml0ZUFzU3RyaW5nKFN0cmluZyBjb250ZW50cywKICAgICAge0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLndyaXRlLAogICAgICBFbmNvZGluZyBlbmNvZGluZzogdXRmOCwKICAgICAgYm9vbCBmbHVzaDogZmFsc2V9KSB7CiAgICB0cnkgewogICAgICByZXR1cm4gd3JpdGVBc0J5dGVzKGVuY29kaW5nLmVuY29kZShjb250ZW50cyksIG1vZGU6IG1vZGUsIGZsdXNoOiBmbHVzaCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBuZXcgRnV0dXJlLmVycm9yKGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUFzU3RyaW5nU3luYyhTdHJpbmcgY29udGVudHMsCiAgICAgIHtGaWxlTW9kZSBtb2RlOiBGaWxlTW9kZS53cml0ZSwKICAgICAgRW5jb2RpbmcgZW5jb2Rpbmc6IHV0ZjgsCiAgICAgIGJvb2wgZmx1c2g6IGZhbHNlfSkgewogICAgd3JpdGVBc0J5dGVzU3luYyhlbmNvZGluZy5lbmNvZGUoY29udGVudHMpLCBtb2RlOiBtb2RlLCBmbHVzaDogZmx1c2gpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkZpbGU6ICckcGF0aCciOwoKICBzdGF0aWMgdGhyb3dJZkVycm9yKE9iamVjdCByZXN1bHQsIFN0cmluZyBtc2csIFN0cmluZyBwYXRoKSB7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24obXNnLCBwYXRoLCByZXN1bHQpOwogICAgfQogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX1JhbmRvbUFjY2Vzc0ZpbGVPcHMgewogIGV4dGVybmFsIGZhY3RvcnkgX1JhbmRvbUFjY2Vzc0ZpbGVPcHMoaW50IHBvaW50ZXIpOwoKICBpbnQgZ2V0UG9pbnRlcigpOwogIGludCBjbG9zZSgpOwogIHJlYWRCeXRlKCk7CiAgcmVhZChpbnQgYnl0ZXMpOwogIHJlYWRJbnRvKExpc3Q8aW50PiBidWZmZXIsIGludCBzdGFydCwgaW50IGVuZCk7CiAgd3JpdGVCeXRlKGludCB2YWx1ZSk7CiAgd3JpdGVGcm9tKExpc3Q8aW50PiBidWZmZXIsIGludCBzdGFydCwgaW50IGVuZCk7CiAgcG9zaXRpb24oKTsKICBzZXRQb3NpdGlvbihpbnQgcG9zaXRpb24pOwogIHRydW5jYXRlKGludCBsZW5ndGgpOwogIGxlbmd0aCgpOwogIGZsdXNoKCk7CiAgbG9jayhpbnQgbG9jaywgaW50IHN0YXJ0LCBpbnQgZW5kKTsKfQoKY2xhc3MgX1JhbmRvbUFjY2Vzc0ZpbGUgaW1wbGVtZW50cyBSYW5kb21BY2Nlc3NGaWxlIHsKICBzdGF0aWMgYm9vbCBfY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyID0gZmFsc2U7CgogIGZpbmFsIFN0cmluZyBwYXRoOwoKICBib29sIF9hc3luY0Rpc3BhdGNoZWQgPSBmYWxzZTsKICBTZW5kUG9ydCBfZmlsZVNlcnZpY2U7CgogIF9GaWxlUmVzb3VyY2VJbmZvIF9yZXNvdXJjZUluZm87CiAgX1JhbmRvbUFjY2Vzc0ZpbGVPcHMgX29wczsKCiAgX1JhbmRvbUFjY2Vzc0ZpbGUoaW50IHBvaW50ZXIsIHRoaXMucGF0aCkgewogICAgX29wcyA9IG5ldyBfUmFuZG9tQWNjZXNzRmlsZU9wcyhwb2ludGVyKTsKICAgIF9yZXNvdXJjZUluZm8gPSBuZXcgX0ZpbGVSZXNvdXJjZUluZm8odGhpcyk7CiAgICBfbWF5YmVDb25uZWN0SGFuZGxlcigpOwogIH0KCiAgdm9pZCBfbWF5YmVQZXJmb3JtQ2xlYW51cCgpIHsKICAgIGlmIChjbG9zZWQpIHsKICAgICAgX0ZpbGVSZXNvdXJjZUluZm8uRmlsZUNsb3NlZChfcmVzb3VyY2VJbmZvKTsKICAgIH0KICB9CgogIF9tYXliZUNvbm5lY3RIYW5kbGVyKCkgewogICAgaWYgKCFfY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyKSB7CiAgICAgIC8vIFRPRE8ocmljb3cpOiBXZSBwcm9iYWJseSBuZWVkIHRvIHNldCB0aGVzZSBpbiBzb21lIGluaXRpYWxpemF0aW9uIGNvZGUuCiAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlc2UgYXJlIGFsd2F5cyBhdmFpbGFibGUgZnJvbSB0aGUKICAgICAgLy8gb2JzZXJ2YXRvcnkgZXZlbiBpZiBubyBmaWxlcyAob3Igc29ja2V0cyBmb3IgdGhlIHNvY2tldCBvbmVzKSBhcmUKICAgICAgLy8gb3Blbi4KICAgICAgcmVnaXN0ZXJFeHRlbnNpb24oCiAgICAgICAgICAnZXh0LmRhcnQuaW8uZ2V0T3BlbkZpbGVzJywgX0ZpbGVSZXNvdXJjZUluZm8uZ2V0T3BlbkZpbGVzKTsKICAgICAgcmVnaXN0ZXJFeHRlbnNpb24oCiAgICAgICAgICAnZXh0LmRhcnQuaW8uZ2V0RmlsZUJ5SUQnLCBfRmlsZVJlc291cmNlSW5mby5nZXRGaWxlSW5mb01hcEJ5SUQpOwogICAgICBfY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyID0gdHJ1ZTsKICAgIH0KICB9CgogIEZ1dHVyZTx2b2lkPiBjbG9zZSgpIHsKICAgIHJldHVybiBfZGlzcGF0Y2goX0lPU2VydmljZS5maWxlQ2xvc2UsIFtudWxsXSwgbWFya0Nsb3NlZDogdHJ1ZSkKICAgICAgICAudGhlbigocmVzdWx0KSB7CiAgICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKICAgICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiQ2Fubm90IGNsb3NlIGZpbGUiLCBwYXRoKTsKICAgICAgfQogICAgICBjbG9zZWQgPSBjbG9zZWQgfHwgKHJlc3VsdCA9PSAwKTsKICAgICAgX21heWJlUGVyZm9ybUNsZWFudXAoKTsKICAgIH0pOwogIH0KCiAgdm9pZCBjbG9zZVN5bmMoKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIHZhciBpZCA9IF9vcHMuY2xvc2UoKTsKICAgIGlmIChpZCA9PSAtMSkgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiQ2Fubm90IGNsb3NlIGZpbGUiLCBwYXRoKTsKICAgIH0KICAgIGNsb3NlZCA9IGNsb3NlZCB8fCAoaWQgPT0gMCk7CiAgICBfbWF5YmVQZXJmb3JtQ2xlYW51cCgpOwogIH0KCiAgRnV0dXJlPGludD4gcmVhZEJ5dGUoKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoKF9JT1NlcnZpY2UuZmlsZVJlYWRCeXRlLCBbbnVsbF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJyZWFkQnl0ZSBmYWlsZWQiLCBwYXRoKTsKICAgICAgfQogICAgICBfcmVzb3VyY2VJbmZvLmFkZFJlYWQoMSk7CiAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0pOwogIH0KCiAgaW50IHJlYWRCeXRlU3luYygpIHsKICAgIF9jaGVja0F2YWlsYWJsZSgpOwogICAgdmFyIHJlc3VsdCA9IF9vcHMucmVhZEJ5dGUoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigicmVhZEJ5dGUgZmFpbGVkIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICAgIF9yZXNvdXJjZUluZm8uYWRkUmVhZCgxKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBGdXR1cmU8VWludDhMaXN0PiByZWFkKGludCBieXRlcykgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoYnl0ZXMsICdieXRlcycpOwogICAgcmV0dXJuIF9kaXNwYXRjaChfSU9TZXJ2aWNlLmZpbGVSZWFkLCBbbnVsbCwgYnl0ZXNdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAicmVhZCBmYWlsZWQiLCBwYXRoKTsKICAgICAgfQogICAgICBfcmVzb3VyY2VJbmZvLmFkZFJlYWQocmVzcG9uc2VbMV0ubGVuZ3RoKTsKICAgICAgVWludDhMaXN0IHJlc3VsdCA9IHJlc3BvbnNlWzFdOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSk7CiAgfQoKICBVaW50OExpc3QgcmVhZFN5bmMoaW50IGJ5dGVzKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGJ5dGVzLCAnYnl0ZXMnKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLnJlYWQoYnl0ZXMpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJyZWFkU3luYyBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogICAgX3Jlc291cmNlSW5mby5hZGRSZWFkKHJlc3VsdC5sZW5ndGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEZ1dHVyZTxpbnQ+IHJlYWRJbnRvKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgaWYgKChidWZmZXIgaXMhIExpc3QpIHx8CiAgICAgICAgKChzdGFydCAhPSBudWxsKSAmJiAoc3RhcnQgaXMhIGludCkpIHx8CiAgICAgICAgKChlbmQgIT0gbnVsbCkgJiYgKGVuZCBpcyEgaW50KSkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGJ1ZmZlci5sZW5ndGgpOwogICAgaWYgKGVuZCA9PSBzdGFydCkgewogICAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZSgwKTsKICAgIH0KICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIHJldHVybiBfZGlzcGF0Y2goX0lPU2VydmljZS5maWxlUmVhZEludG8sIFtudWxsLCBsZW5ndGhdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAicmVhZEludG8gZmFpbGVkIiwgcGF0aCk7CiAgICAgIH0KICAgICAgaW50IHJlYWQgPSByZXNwb25zZVsxXTsKICAgICAgTGlzdDxpbnQ+IGRhdGEgPSByZXNwb25zZVsyXTsKICAgICAgYnVmZmVyLnNldFJhbmdlKHN0YXJ0LCBzdGFydCArIHJlYWQsIGRhdGEpOwogICAgICBfcmVzb3VyY2VJbmZvLmFkZFJlYWQocmVhZCk7CiAgICAgIHJldHVybiByZWFkOwogICAgfSk7CiAgfQoKICBpbnQgcmVhZEludG9TeW5jKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgX2NoZWNrQXZhaWxhYmxlKCk7CiAgICBpZiAoKGJ1ZmZlciBpcyEgTGlzdCkgfHwKICAgICAgICAoKHN0YXJ0ICE9IG51bGwpICYmIChzdGFydCBpcyEgaW50KSkgfHwKICAgICAgICAoKGVuZCAhPSBudWxsKSAmJiAoZW5kIGlzISBpbnQpKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgfQogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgYnVmZmVyLmxlbmd0aCk7CiAgICBpZiAoZW5kID09IHN0YXJ0KSB7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9vcHMucmVhZEludG8oYnVmZmVyLCBzdGFydCwgZW5kKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigicmVhZEludG8gZmFpbGVkIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICAgIF9yZXNvdXJjZUluZm8uYWRkUmVhZChyZXN1bHQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiB3cml0ZUJ5dGUoaW50IHZhbHVlKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbCh2YWx1ZSwgJ3ZhbHVlJyk7CiAgICByZXR1cm4gX2Rpc3BhdGNoKF9JT1NlcnZpY2UuZmlsZVdyaXRlQnl0ZSwgW251bGwsIHZhbHVlXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgIndyaXRlQnl0ZSBmYWlsZWQiLCBwYXRoKTsKICAgICAgfQogICAgICBfcmVzb3VyY2VJbmZvLmFkZFdyaXRlKDEpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogIH0KCiAgaW50IHdyaXRlQnl0ZVN5bmMoaW50IHZhbHVlKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKHZhbHVlLCAndmFsdWUnKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLndyaXRlQnl0ZSh2YWx1ZSk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oIndyaXRlQnl0ZSBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogICAgX3Jlc291cmNlSW5mby5hZGRXcml0ZSgxKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gd3JpdGVGcm9tKExpc3Q8aW50PiBidWZmZXIsCiAgICAgIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgaWYgKChidWZmZXIgaXMhIExpc3QpIHx8CiAgICAgICAgKChzdGFydCAhPSBudWxsKSAmJiAoc3RhcnQgaXMhIGludCkpIHx8CiAgICAgICAgKChlbmQgIT0gbnVsbCkgJiYgKGVuZCBpcyEgaW50KSkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHRvIHdyaXRlRnJvbSIpOwogICAgfQogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgYnVmZmVyLmxlbmd0aCk7CiAgICBpZiAoZW5kID09IHN0YXJ0KSB7CiAgICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKHRoaXMpOwogICAgfQogICAgX0J1ZmZlckFuZFN0YXJ0IHJlc3VsdDsKICAgIHRyeSB7CiAgICAgIHJlc3VsdCA9IF9lbnN1cmVGYXN0QW5kU2VyaWFsaXphYmxlQnl0ZURhdGEoYnVmZmVyLCBzdGFydCwgZW5kKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IoZSk7CiAgICB9CgogICAgTGlzdCByZXF1ZXN0ID0gbmV3IExpc3QoNCk7CiAgICByZXF1ZXN0WzBdID0gbnVsbDsKICAgIHJlcXVlc3RbMV0gPSByZXN1bHQuYnVmZmVyOwogICAgcmVxdWVzdFsyXSA9IHJlc3VsdC5zdGFydDsKICAgIHJlcXVlc3RbM10gPSBlbmQgLSAoc3RhcnQgLSByZXN1bHQuc3RhcnQpOwogICAgcmV0dXJuIF9kaXNwYXRjaChfSU9TZXJ2aWNlLmZpbGVXcml0ZUZyb20sIHJlcXVlc3QpLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJ3cml0ZUZyb20gZmFpbGVkIiwgcGF0aCk7CiAgICAgIH0KICAgICAgX3Jlc291cmNlSW5mby5hZGRXcml0ZShlbmQgLSAoc3RhcnQgLSByZXN1bHQuc3RhcnQpKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICB9CgogIHZvaWQgd3JpdGVGcm9tU3luYyhMaXN0PGludD4gYnVmZmVyLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIF9jaGVja0F2YWlsYWJsZSgpOwogICAgaWYgKChidWZmZXIgaXMhIExpc3QpIHx8CiAgICAgICAgKChzdGFydCAhPSBudWxsKSAmJiAoc3RhcnQgaXMhIGludCkpIHx8CiAgICAgICAgKChlbmQgIT0gbnVsbCkgJiYgKGVuZCBpcyEgaW50KSkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgYXJndW1lbnRzIHRvIHdyaXRlRnJvbVN5bmMiKTsKICAgIH0KICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGJ1ZmZlci5sZW5ndGgpOwogICAgaWYgKGVuZCA9PSBzdGFydCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBfQnVmZmVyQW5kU3RhcnQgYnVmZmVyQW5kU3RhcnQgPQogICAgICAgIF9lbnN1cmVGYXN0QW5kU2VyaWFsaXphYmxlQnl0ZURhdGEoYnVmZmVyLCBzdGFydCwgZW5kKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLndyaXRlRnJvbShidWZmZXJBbmRTdGFydC5idWZmZXIsIGJ1ZmZlckFuZFN0YXJ0LnN0YXJ0LAogICAgICAgIGVuZCAtIChzdGFydCAtIGJ1ZmZlckFuZFN0YXJ0LnN0YXJ0KSk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oIndyaXRlRnJvbSBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogICAgX3Jlc291cmNlSW5mby5hZGRXcml0ZShlbmQgLSAoc3RhcnQgLSBidWZmZXJBbmRTdGFydC5zdGFydCkpOwogIH0KCiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IHdyaXRlU3RyaW5nKFN0cmluZyBzdHJpbmcsCiAgICAgIHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGVuY29kaW5nLCAnZW5jb2RpbmcnKTsKICAgIHZhciBkYXRhID0gZW5jb2RpbmcuZW5jb2RlKHN0cmluZyk7CiAgICByZXR1cm4gd3JpdGVGcm9tKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKICB9CgogIHZvaWQgd3JpdGVTdHJpbmdTeW5jKFN0cmluZyBzdHJpbmcsIHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGVuY29kaW5nLCAnZW5jb2RpbmcnKTsKICAgIHZhciBkYXRhID0gZW5jb2RpbmcuZW5jb2RlKHN0cmluZyk7CiAgICB3cml0ZUZyb21TeW5jKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKICB9CgogIEZ1dHVyZTxpbnQ+IHBvc2l0aW9uKCkgewogICAgcmV0dXJuIF9kaXNwYXRjaChfSU9TZXJ2aWNlLmZpbGVQb3NpdGlvbiwgW251bGxdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAicG9zaXRpb24gZmFpbGVkIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgfSk7CiAgfQoKICBpbnQgcG9zaXRpb25TeW5jKCkgewogICAgX2NoZWNrQXZhaWxhYmxlKCk7CiAgICB2YXIgcmVzdWx0ID0gX29wcy5wb3NpdGlvbigpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJwb3NpdGlvbiBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiBzZXRQb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKICAgIHJldHVybiBfZGlzcGF0Y2goX0lPU2VydmljZS5maWxlU2V0UG9zaXRpb24sIFtudWxsLCBwb3NpdGlvbl0pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJzZXRQb3NpdGlvbiBmYWlsZWQiLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogIH0KCiAgdm9pZCBzZXRQb3NpdGlvblN5bmMoaW50IHBvc2l0aW9uKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLnNldFBvc2l0aW9uKHBvc2l0aW9uKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigic2V0UG9zaXRpb24gZmFpbGVkIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICB9CgogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiB0cnVuY2F0ZShpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoKF9JT1NlcnZpY2UuZmlsZVRydW5jYXRlLCBbbnVsbCwgbGVuZ3RoXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgInRydW5jYXRlIGZhaWxlZCIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICB2b2lkIHRydW5jYXRlU3luYyhpbnQgbGVuZ3RoKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLnRydW5jYXRlKGxlbmd0aCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oInRydW5jYXRlIGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgfQoKICBGdXR1cmU8aW50PiBsZW5ndGgoKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoKF9JT1NlcnZpY2UuZmlsZUxlbmd0aCwgW251bGxdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAibGVuZ3RoIGZhaWxlZCIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0pOwogIH0KCiAgaW50IGxlbmd0aFN5bmMoKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLmxlbmd0aCgpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJsZW5ndGggZmFpbGVkIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gZmx1c2goKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoKF9JT1NlcnZpY2UuZmlsZUZsdXNoLCBbbnVsbF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJmbHVzaCBmYWlsZWQiLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogIH0KCiAgdm9pZCBmbHVzaFN5bmMoKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLmZsdXNoKCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oImZsdXNoIGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IGxvY2tVbmxvY2sgPSAwOwogIC8vIHN0YXRpYyBjb25zdCBpbnQgbG9ja1NoYXJlZCA9IDE7CiAgLy8gc3RhdGljIGNvbnN0IGludCBsb2NrRXhjbHVzaXZlID0gMjsKICAvLyBzdGF0aWMgY29uc3QgaW50IGxvY2tCbG9ja2luZ1NoYXJlZCA9IDM7CiAgLy8gc3RhdGljIGNvbnN0IGludCBsb2NrQmxvY2tpbmdFeGNsdXNpdmUgPSA0OwoKICBpbnQgX2ZpbGVMb2NrVmFsdWUoRmlsZUxvY2sgZmwpID0+IGZsLl90eXBlOwoKICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gbG9jaygKICAgICAgW0ZpbGVMb2NrIG1vZGUgPSBGaWxlTG9jay5leGNsdXNpdmUsIGludCBzdGFydCA9IDAsIGludCBlbmQgPSAtMV0pIHsKICAgIGlmICgobW9kZSBpcyEgRmlsZUxvY2spIHx8IChzdGFydCBpcyEgaW50KSB8fCAoZW5kIGlzISBpbnQpKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICB9CiAgICBpZiAoKHN0YXJ0IDwgMCkgfHwgKGVuZCA8IC0xKSB8fCAoKGVuZCAhPSAtMSkgJiYgKHN0YXJ0ID49IGVuZCkpKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICB9CiAgICBpbnQgbG9jayA9IF9maWxlTG9ja1ZhbHVlKG1vZGUpOwogICAgcmV0dXJuIF9kaXNwYXRjaChfSU9TZXJ2aWNlLmZpbGVMb2NrLCBbbnVsbCwgbG9jaywgc3RhcnQsIGVuZF0pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICdsb2NrIGZhaWxlZCcsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gdW5sb2NrKFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kID0gLTFdKSB7CiAgICBpZiAoKHN0YXJ0IGlzISBpbnQpIHx8IChlbmQgaXMhIGludCkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICAgIGlmIChzdGFydCA9PSBlbmQpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICAgIHJldHVybiBfZGlzcGF0Y2goX0lPU2VydmljZS5maWxlTG9jaywgW251bGwsIGxvY2tVbmxvY2ssIHN0YXJ0LCBlbmRdKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAndW5sb2NrIGZhaWxlZCcsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICB2b2lkIGxvY2tTeW5jKAogICAgICBbRmlsZUxvY2sgbW9kZSA9IEZpbGVMb2NrLmV4Y2x1c2l2ZSwgaW50IHN0YXJ0ID0gMCwgaW50IGVuZCA9IC0xXSkgewogICAgX2NoZWNrQXZhaWxhYmxlKCk7CiAgICBpZiAoKG1vZGUgaXMhIEZpbGVMb2NrKSB8fCAoc3RhcnQgaXMhIGludCkgfHwgKGVuZCBpcyEgaW50KSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgfQogICAgaWYgKChzdGFydCA8IDApIHx8IChlbmQgPCAtMSkgfHwgKChlbmQgIT0gLTEpICYmIChzdGFydCA+PSBlbmQpKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgfQogICAgaW50IGxvY2sgPSBfZmlsZUxvY2tWYWx1ZShtb2RlKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLmxvY2sobG9jaywgc3RhcnQsIGVuZCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oJ2xvY2sgZmFpbGVkJywgcGF0aCwgcmVzdWx0KTsKICAgIH0KICB9CgogIHZvaWQgdW5sb2NrU3luYyhbaW50IHN0YXJ0ID0gMCwgaW50IGVuZCA9IC0xXSkgewogICAgX2NoZWNrQXZhaWxhYmxlKCk7CiAgICBpZiAoKHN0YXJ0IGlzISBpbnQpIHx8IChlbmQgaXMhIGludCkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICAgIGlmIChzdGFydCA9PSBlbmQpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfb3BzLmxvY2sobG9ja1VubG9jaywgc3RhcnQsIGVuZCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oJ3VubG9jayBmYWlsZWQnLCBwYXRoLCByZXN1bHQpOwogICAgfQogIH0KCiAgYm9vbCBjbG9zZWQgPSBmYWxzZTsKCiAgLy8gV0FSTklORzoKICAvLyBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBpbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBuYXRpdmUKICAvLyBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBmaWxlIG9wZXJhdGlvbnMuIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0bwogIC8vIHBhc3MgdGhlIHBvaW50ZXIgdG8gdGhlIElPIFNlcnZpY2UsIHdoaWNoIHdpbGwgZGVjcmVtZW50IHRoZSByZWZlcmVuY2UKICAvLyBjb3VudCB3aGVuIGl0IGlzIGZpbmlzaGVkIHdpdGggaXQuCiAgaW50IF9wb2ludGVyKCkgPT4gX29wcy5nZXRQb2ludGVyKCk7CgogIEZ1dHVyZSBfZGlzcGF0Y2goaW50IHJlcXVlc3QsIExpc3QgZGF0YSwge2Jvb2wgbWFya0Nsb3NlZDogZmFsc2V9KSB7CiAgICBpZiAoY2xvc2VkKSB7CiAgICAgIHJldHVybiBuZXcgRnV0dXJlLmVycm9yKG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJGaWxlIGNsb3NlZCIsIHBhdGgpKTsKICAgIH0KICAgIGlmIChfYXN5bmNEaXNwYXRjaGVkKSB7CiAgICAgIHZhciBtc2cgPSAiQW4gYXN5bmMgb3BlcmF0aW9uIGlzIGN1cnJlbnRseSBwZW5kaW5nIjsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IobmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24obXNnLCBwYXRoKSk7CiAgICB9CiAgICBpZiAobWFya0Nsb3NlZCkgewogICAgICAvLyBTZXQgY2xvc2VkIHRvIHRydWUgdG8gZW5zdXJlIHRoYXQgbm8gbW9yZSBhc3luYyByZXF1ZXN0cyBjYW4gYmUgaXNzdWVkCiAgICAgIC8vIGZvciB0aGlzIGZpbGUuCiAgICAgIGNsb3NlZCA9IHRydWU7CiAgICB9CiAgICBfYXN5bmNEaXNwYXRjaGVkID0gdHJ1ZTsKICAgIGRhdGFbMF0gPSBfcG9pbnRlcigpOwogICAgcmV0dXJuIF9JT1NlcnZpY2UuX2Rpc3BhdGNoKHJlcXVlc3QsIGRhdGEpLndoZW5Db21wbGV0ZSgoKSB7CiAgICAgIF9hc3luY0Rpc3BhdGNoZWQgPSBmYWxzZTsKICAgIH0pOwogIH0KCiAgdm9pZCBfY2hlY2tBdmFpbGFibGUoKSB7CiAgICBpZiAoX2FzeW5jRGlzcGF0Y2hlZCkgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigKICAgICAgICAgICJBbiBhc3luYyBvcGVyYXRpb24gaXMgY3VycmVudGx5IHBlbmRpbmciLCBwYXRoKTsKICAgIH0KICAgIGlmIChjbG9zZWQpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oIkZpbGUgY2xvc2VkIiwgcGF0aCk7CiAgICB9CiAgfQp9CoRJAE5OPAERASgiAS4YKwEsECARDDUBMR4BLB8YARcBNxUEASoBRT8YLUkEARwzFBoeFyAfDAQBGCYlBhQBEiIbBgFNIwQBFj0hEhQOBhwgGDQbIR5LGCAKEAgGLx8bFhAIIU0XCC4WCB4UFggbHCQWHggIBAESGU4bIg4GASoaHxQGAS0bRCYjGAwPFwgGASkvGyIGARkWJTINDC0XGggGBAIBPg4oATMqBAEqPgQBNTwkGS8gHDAIASofDhUpRCIgChYjLywdBAEaTwIBPzcQFgEXLhI0BAEpNEU+BAEcAQ5LS00OQgFBIzAEARpLGyhQCBcIBAFEARY7QhMEATABMRFNEhVNGyhMCBMIBAFEAR8/AUgBLRUqBjs2BAEyFUwGSxsoTAgTCAQBSgFOAS4VTgZBNgQBKCNMKCZBCCAIBAEbQAEfQAEkREQeBAEmI0ooJj8IIAgEARlAASJCQh4EAUIhIiMmLB9GBiNNKEoINAgEARkjSygmPwgXCAQBTAEVQ0ITBAEkURsoJjwIQAgEAUoBID07OAQBKi4jRhsoUAgTCAQBJDwBLC5MHSU7BgQBJFEbKCZCCEAIBAFKASA9QTgEASouI0YbKCY9CBMIBAEkPAEsLkwdJUEGBAFMAT4hIiMmLEcGQTAtBAEqATMdE0gGKgQBNS4EAU8iIyYsRwY4NQQBJD8zMhQsIR8UEzUMLggBDh8GASArG0AoCiIjCAQBIB0KFigZPjUNLjIjJA8oCBMQGgYEAToKJRIlTAYEATtMMjkkKAwsFCsICAQBOC8BQUsBPUoBLTwqRToVIwgEASk8NAo0JRAaBgQBLiYfHApQEiIGBAEqJh8cSwQBKAFAHTgGBAIBJjYBFA8OEzIYMw4dGAwLJgIBNjEBFQEhGQEjHQEuLjEcBAEgEjMGBAEbJlFHSw8ZRxlMKAYEARlFGRpCCCgeCAQBFRcbFEAGIhwEARtIKEkIIBcIBAEXFyIdRgYeEwQBJjBLKEUIMSYVCAQBIhcwIx1GBioTBAFFHTAsIQZBGCIGHlAoSQgeJDIjEwgEAUEXHTAsIQZBGBAGNB1GBiMTBAEyMFAoSgghEwgEASEXMCgdRwYfEwQBNyIdMCxBBkEYJQYcCkcSIgYBIBcgHy9KKEoIPBMIBAFDFx0wLEUGQRgOBiVATS8dRwZCBAE2IzYoLAQBQzYoKQQBG0goSQgXCAQBFxciHUYGEwQBN0MbKEwIEwgEAScXLR1JBgQBMlAoSQgTCAQBIhcoHUYGBAEZRihHCBcIBAEVFyAdRAYTBAElRShGCBMIBAEVFx8dQwYEASMmKS4xAS8BIUtDIQZIIQYlRBsoRQgTCAQBQywhBhghBkobKEcIEwgEARFLF0MhBkghBiUuHUIGBAEzFywhBhghBjQdRAYEARcBDktNTCgnAUcSTQYcO0MGFlAYFQYdGkEgCAQBGxwlPAYSOgYEAgEWZGFydDppby9maWxlX2ltcGwuZGFydDZvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vZmlsZV9zeXN0ZW1fZW50aXR5LmRhcnTAAIaZLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8qKgogKiBUaGUgdHlwZSBvZiBhbiBlbnRpdHkgb24gdGhlIGZpbGUgc3lzdGVtLCBzdWNoIGFzIGEgZmlsZSwgZGlyZWN0b3J5LCBvciBsaW5rLgogKgogKiBUaGVzZSBjb25zdGFudHMgYXJlIHVzZWQgYnkgdGhlIFtGaWxlU3lzdGVtRW50aXR5XSBjbGFzcwogKiB0byBpbmRpY2F0ZSB0aGUgb2JqZWN0J3MgdHlwZS4KICoKICovCgpjbGFzcyBGaWxlU3lzdGVtRW50aXR5VHlwZSB7CiAgc3RhdGljIGNvbnN0IGZpbGUgPSBjb25zdCBGaWxlU3lzdGVtRW50aXR5VHlwZS5faW50ZXJuYWwoMCk7CiAgQERlcHJlY2F0ZWQoIlVzZSBmaWxlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBGSUxFID0gZmlsZTsKCiAgc3RhdGljIGNvbnN0IGRpcmVjdG9yeSA9IGNvbnN0IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLl9pbnRlcm5hbCgxKTsKICBARGVwcmVjYXRlZCgiVXNlIGRpcmVjdG9yeSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgRElSRUNUT1JZID0gZGlyZWN0b3J5OwoKICBzdGF0aWMgY29uc3QgbGluayA9IGNvbnN0IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLl9pbnRlcm5hbCgyKTsKICBARGVwcmVjYXRlZCgiVXNlIGxpbmsgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IExJTksgPSBsaW5rOwoKICBzdGF0aWMgY29uc3Qgbm90Rm91bmQgPSBjb25zdCBGaWxlU3lzdGVtRW50aXR5VHlwZS5faW50ZXJuYWwoMyk7CiAgQERlcHJlY2F0ZWQoIlVzZSBub3RGb3VuZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgTk9UX0ZPVU5EID0gbm90Rm91bmQ7CgogIHN0YXRpYyBjb25zdCBfdHlwZUxpc3QgPSBjb25zdCBbCiAgICBGaWxlU3lzdGVtRW50aXR5VHlwZS5maWxlLAogICAgRmlsZVN5c3RlbUVudGl0eVR5cGUuZGlyZWN0b3J5LAogICAgRmlsZVN5c3RlbUVudGl0eVR5cGUubGluaywKICAgIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLm5vdEZvdW5kLAogIF07CiAgZmluYWwgaW50IF90eXBlOwoKICBjb25zdCBGaWxlU3lzdGVtRW50aXR5VHlwZS5faW50ZXJuYWwodGhpcy5fdHlwZSk7CgogIHN0YXRpYyBGaWxlU3lzdGVtRW50aXR5VHlwZSBfbG9va3VwKGludCB0eXBlKSA9PiBfdHlwZUxpc3RbdHlwZV07CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gY29uc3QgWydmaWxlJywgJ2RpcmVjdG9yeScsICdsaW5rJywgJ25vdEZvdW5kJ11bX3R5cGVdOwp9CgovKioKICogQSBGaWxlU3RhdCBvYmplY3QgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFBPU0lYIHN0YXQoKSBmdW5jdGlvbgogKiBvbiBhIGZpbGUgc3lzdGVtIG9iamVjdC4gIEl0IGlzIGFuIGltbXV0YWJsZSBvYmplY3QsIHJlcHJlc2VudGluZyB0aGUKICogc25hcHNob3R0ZWQgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBzdGF0KCkgY2FsbC4KICovCmNsYXNzIEZpbGVTdGF0IHsKICAvLyBUaGVzZSBtdXN0IGFncmVlIHdpdGggZW51bSBGaWxlU3RhdCBpbiBmaWxlLmguCiAgc3RhdGljIGNvbnN0IF90eXBlID0gMDsKICBzdGF0aWMgY29uc3QgX2NoYW5nZWRUaW1lID0gMTsKICBzdGF0aWMgY29uc3QgX21vZGlmaWVkVGltZSA9IDI7CiAgc3RhdGljIGNvbnN0IF9hY2Nlc3NlZFRpbWUgPSAzOwogIHN0YXRpYyBjb25zdCBfbW9kZSA9IDQ7CiAgc3RhdGljIGNvbnN0IF9zaXplID0gNTsKCiAgc3RhdGljIGNvbnN0IF9ub3RGb3VuZCA9IGNvbnN0IEZpbGVTdGF0Ll9pbnRlcm5hbE5vdEZvdW5kKCk7CgogIC8qKgogICAqIFRoZSB0aW1lIG9mIHRoZSBsYXN0IGNoYW5nZSB0byB0aGUgZGF0YSBvciBtZXRhZGF0YSBvZiB0aGUgZmlsZSBzeXN0ZW0KICAgKiBvYmplY3QuCiAgICoKICAgKiBPbiBXaW5kb3dzIHBsYXRmb3JtcywgdGhpcyBpcyBpbnN0ZWFkIHRoZSBmaWxlIGNyZWF0aW9uIHRpbWUuCiAgICovCiAgZmluYWwgRGF0ZVRpbWUgY2hhbmdlZDsKCiAgLyoqCiAgICogVGhlIHRpbWUgb2YgdGhlIGxhc3QgY2hhbmdlIHRvIHRoZSBkYXRhIG9mIHRoZSBmaWxlIHN5c3RlbSBvYmplY3QuCiAgICovCiAgZmluYWwgRGF0ZVRpbWUgbW9kaWZpZWQ7CgogIC8qKgogICAqIFRoZSB0aW1lIG9mIHRoZSBsYXN0IGFjY2VzcyB0byB0aGUgZGF0YSBvZiB0aGUgZmlsZSBzeXN0ZW0gb2JqZWN0LgogICAqCiAgICogT24gV2luZG93cyBwbGF0Zm9ybXMsIHRoaXMgbWF5IGhhdmUgMSBkYXkgZ3JhbnVsYXJpdHksIGFuZCBiZQogICAqIG91dCBvZiBkYXRlIGJ5IGFuIGhvdXIuCiAgICovCiAgZmluYWwgRGF0ZVRpbWUgYWNjZXNzZWQ7CgogIC8qKgogICAqIFRoZSB0eXBlIG9mIHRoZSB1bmRlcmx5aW5nIGZpbGUgc3lzdGVtIG9iamVjdC4KICAgKgogICAqIFtGaWxlU3lzdGVtRW50aXR5VHlwZS5ub3RGb3VuZF0gaWYgW3N0YXRdIG9yIFtzdGF0U3luY10gZmFpbGVkLgogICAqLwogIGZpbmFsIEZpbGVTeXN0ZW1FbnRpdHlUeXBlIHR5cGU7CgogIC8qKgogICAqIFRoZSBtb2RlIG9mIHRoZSBmaWxlIHN5c3RlbSBvYmplY3QuCiAgICoKICAgKiBQZXJtaXNzaW9ucyBhcmUgZW5jb2RlZCBpbiB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGlzIG51bWJlciwgYW5kIGNhbiBiZQogICAqIGRlY29kZWQgdXNpbmcgdGhlIFttb2RlU3RyaW5nXSBnZXR0ZXIuCiAgICovCiAgZmluYWwgaW50IG1vZGU7CgogIC8qKgogICAqIFRoZSBzaXplIG9mIHRoZSBmaWxlIHN5c3RlbSBvYmplY3QuCiAgICovCiAgZmluYWwgaW50IHNpemU7CgogIEZpbGVTdGF0Ll9pbnRlcm5hbCh0aGlzLmNoYW5nZWQsIHRoaXMubW9kaWZpZWQsIHRoaXMuYWNjZXNzZWQsIHRoaXMudHlwZSwKICAgICAgdGhpcy5tb2RlLCB0aGlzLnNpemUpOwoKICBjb25zdCBGaWxlU3RhdC5faW50ZXJuYWxOb3RGb3VuZCgpCiAgICAgIDogY2hhbmdlZCA9IG51bGwsCiAgICAgICAgbW9kaWZpZWQgPSBudWxsLAogICAgICAgIGFjY2Vzc2VkID0gbnVsbCwKICAgICAgICB0eXBlID0gRmlsZVN5c3RlbUVudGl0eVR5cGUubm90Rm91bmQsCiAgICAgICAgbW9kZSA9IDAsCiAgICAgICAgc2l6ZSA9IC0xOwoKICBleHRlcm5hbCBzdGF0aWMgX3N0YXRTeW5jKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBTdHJpbmcgcGF0aCk7CgogIC8qKgogICAqIENhbGxzIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgYHN0YXQoKWAgZnVuY3Rpb24gKG9yIGVxdWl2YWxlbnQpIG9uIFtwYXRoXS4KICAgKgogICAqIFJldHVybnMgYSBbRmlsZVN0YXRdIG9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhIHJldHVybmVkIGJ5IGBzdGF0KClgLgogICAqIElmIHRoZSBjYWxsIGZhaWxzLCByZXR1cm5zIGEgW0ZpbGVTdGF0XSBvYmplY3Qgd2l0aCBbRmlsZVN0YXQudHlwZV0gc2V0IHRvCiAgICogW0ZpbGVTeXN0ZW1FbnRpdHlUeXBlLm5vdEZvdW5kXSBhbmQgdGhlIG90aGVyIGZpZWxkcyBpbnZhbGlkLgogICAqLwogIHN0YXRpYyBGaWxlU3RhdCBzdGF0U3luYyhTdHJpbmcgcGF0aCkgewogICAgZmluYWwgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gSU9PdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gX3N0YXRTeW5jSW50ZXJuYWwocGF0aCk7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLnN0YXRTeW5jKHBhdGgpOwogIH0KCiAgc3RhdGljIEZpbGVTdGF0IF9zdGF0U3luY0ludGVybmFsKFN0cmluZyBwYXRoKSB7CiAgICAvLyBUcmFpbGluZyBwYXRoIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4KICAgIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgICAgcGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RyaW1UcmFpbGluZ1BhdGhTZXBhcmF0b3JzKHBhdGgpOwogICAgfQogICAgdmFyIGRhdGEgPSBfc3RhdFN5bmMoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBwYXRoKTsKICAgIGlmIChkYXRhIGlzIE9TRXJyb3IpIHJldHVybiBGaWxlU3RhdC5fbm90Rm91bmQ7CiAgICByZXR1cm4gbmV3IEZpbGVTdGF0Ll9pbnRlcm5hbCgKICAgICAgICBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2goZGF0YVtfY2hhbmdlZFRpbWVdKSwKICAgICAgICBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2goZGF0YVtfbW9kaWZpZWRUaW1lXSksCiAgICAgICAgbmV3IERhdGVUaW1lLmZyb21NaWxsaXNlY29uZHNTaW5jZUVwb2NoKGRhdGFbX2FjY2Vzc2VkVGltZV0pLAogICAgICAgIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLl9sb29rdXAoZGF0YVtfdHlwZV0pLAogICAgICAgIGRhdGFbX21vZGVdLAogICAgICAgIGRhdGFbX3NpemVdKTsKICB9CgogIC8qKgogICAqIEFzeW5jaHJvbm91c2x5IGNhbGxzIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgYHN0YXQoKWAgZnVuY3Rpb24gKG9yCiAgICogZXF1aXZhbGVudCkgb24gW3BhdGhdLgogICAqCiAgICogUmV0dXJucyBhIFtGdXR1cmVdIHdoaWNoIGNvbXBsZXRlcyB3aXRoIHRoZSBzYW1lIHJlc3VsdHMgYXMgW3N0YXRTeW5jXS4KICAgKi8KICBzdGF0aWMgRnV0dXJlPEZpbGVTdGF0PiBzdGF0KFN0cmluZyBwYXRoKSB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfc3RhdChwYXRoKTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuc3RhdChwYXRoKTsKICB9CgogIHN0YXRpYyBGdXR1cmU8RmlsZVN0YXQ+IF9zdGF0KFN0cmluZyBwYXRoKSB7CiAgICAvLyBUcmFpbGluZyBwYXRoIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4KICAgIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgICAgcGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RyaW1UcmFpbGluZ1BhdGhTZXBhcmF0b3JzKHBhdGgpOwogICAgfQogICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoX0lPU2VydmljZS5maWxlU3RhdCwgW251bGwsIHBhdGhdKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICByZXR1cm4gRmlsZVN0YXQuX25vdEZvdW5kOwogICAgICB9CiAgICAgIC8vIFVud3JhcCB0aGUgcmVhbCBsaXN0IGZyb20gdGhlICJJJ20gbm90IGFuIGVycm9yIiB3cmFwcGVyLgogICAgICBMaXN0IGRhdGEgPSByZXNwb25zZVsxXTsKICAgICAgcmV0dXJuIG5ldyBGaWxlU3RhdC5faW50ZXJuYWwoCiAgICAgICAgICBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2goZGF0YVtfY2hhbmdlZFRpbWVdKSwKICAgICAgICAgIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChkYXRhW19tb2RpZmllZFRpbWVdKSwKICAgICAgICAgIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChkYXRhW19hY2Nlc3NlZFRpbWVdKSwKICAgICAgICAgIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLl9sb29rdXAoZGF0YVtfdHlwZV0pLAogICAgICAgICAgZGF0YVtfbW9kZV0sCiAgICAgICAgICBkYXRhW19zaXplXSk7CiAgICB9KTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+ICIiIgpGaWxlU3RhdDogdHlwZSAkdHlwZQogICAgICAgICAgY2hhbmdlZCAkY2hhbmdlZAogICAgICAgICAgbW9kaWZpZWQgJG1vZGlmaWVkCiAgICAgICAgICBhY2Nlc3NlZCAkYWNjZXNzZWQKICAgICAgICAgIG1vZGUgJHttb2RlU3RyaW5nKCl9CiAgICAgICAgICBzaXplICRzaXplIiIiOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBtb2RlIHZhbHVlIGFzIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nLgogICAqCiAgICogVGhlIHN0cmluZyBpcyBpbiB0aGUgZm9ybWF0ICJyd3hyd3hyd3giLCByZWZsZWN0aW5nIHRoZSB1c2VyLCBncm91cCwgYW5kCiAgICogd29ybGQgcGVybWlzc2lvbnMgdG8gcmVhZCwgd3JpdGUsIGFuZCBleGVjdXRlIHRoZSBmaWxlIHN5c3RlbSBvYmplY3QsIHdpdGgKICAgKiAiLSIgcmVwbGFjaW5nIHRoZSBsZXR0ZXIgZm9yIG1pc3NpbmcgcGVybWlzc2lvbnMuICBFeHRyYSBwZXJtaXNzaW9uIGJpdHMKICAgKiBtYXkgYmUgcmVwcmVzZW50ZWQgYnkgcHJlcGVuZGluZyAiKHN1aWQpIiwgIihndWlkKSIsIGFuZC9vciAiKHN0aWNreSkiIHRvCiAgICogdGhlIG1vZGUgc3RyaW5nLgogICAqLwogIFN0cmluZyBtb2RlU3RyaW5nKCkgewogICAgdmFyIHBlcm1pc3Npb25zID0gbW9kZSAmIDB4RkZGOwogICAgdmFyIGNvZGVzID0gY29uc3QgWyctLS0nLCAnLS14JywgJy13LScsICctd3gnLCAnci0tJywgJ3IteCcsICdydy0nLCAncnd4J107CiAgICB2YXIgcmVzdWx0ID0gW107CiAgICBpZiAoKHBlcm1pc3Npb25zICYgMHg4MDApICE9IDApIHJlc3VsdC5hZGQoIihzdWlkKSAiKTsKICAgIGlmICgocGVybWlzc2lvbnMgJiAweDQwMCkgIT0gMCkgcmVzdWx0LmFkZCgiKGd1aWQpICIpOwogICAgaWYgKChwZXJtaXNzaW9ucyAmIDB4MjAwKSAhPSAwKSByZXN1bHQuYWRkKCIoc3RpY2t5KSAiKTsKICAgIHJlc3VsdAogICAgICAuLmFkZChjb2Rlc1socGVybWlzc2lvbnMgPj4gNikgJiAweDddKQogICAgICAuLmFkZChjb2Rlc1socGVybWlzc2lvbnMgPj4gMykgJiAweDddKQogICAgICAuLmFkZChjb2Rlc1twZXJtaXNzaW9ucyAmIDB4N10pOwogICAgcmV0dXJuIHJlc3VsdC5qb2luKCk7CiAgfQp9CgovKioKICogVGhlIGNvbW1vbiBzdXBlciBjbGFzcyBmb3IgW0ZpbGVdLCBbRGlyZWN0b3J5XSwgYW5kIFtMaW5rXSBvYmplY3RzLgogKgogKiBbRmlsZVN5c3RlbUVudGl0eV0gb2JqZWN0cyBhcmUgcmV0dXJuZWQgZnJvbSBkaXJlY3RvcnkgbGlzdGluZwogKiBvcGVyYXRpb25zLiBUbyBkZXRlcm1pbmUgaWYgYSBGaWxlU3lzdGVtRW50aXR5IGlzIGEgW0ZpbGVdLCBhCiAqIFtEaXJlY3RvcnldLCBvciBhIFtMaW5rXSBwZXJmb3JtIGEgdHlwZSBjaGVjazoKICoKICogICAgIGlmIChlbnRpdHkgaXMgRmlsZSkgKGVudGl0eSBhcyBGaWxlKS5yZWFkQXNTdHJpbmdTeW5jKCk7CiAqCiAqIFlvdSBjYW4gYWxzbyB1c2UgdGhlIFt0eXBlXSBvciBbdHlwZVN5bmNdIG1ldGhvZHMgdG8gZGV0ZXJtaW5lCiAqIHRoZSB0eXBlIG9mIGEgZmlsZSBzeXN0ZW0gb2JqZWN0LgogKgogKiBNb3N0IG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBvY2N1ciBpbiBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHBhaXJzLAogKiBmb3IgZXhhbXBsZSwgW2V4aXN0c10gYW5kIFtleGlzdHNTeW5jXS4KICogVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgcmVhc29uIGZvciB1c2luZyB0aGUgc3luY2hyb25vdXMgdmVyc2lvbgogKiBvZiBhIG1ldGhvZCwgcHJlZmVyIHRoZSBhc3luY2hyb25vdXMgdmVyc2lvbiB0byBhdm9pZCBibG9ja2luZyB5b3VyIHByb2dyYW0uCiAqCiAqIEhlcmUncyB0aGUgZXhpc3RzIG1ldGhvZCBpbiBhY3Rpb246CiAqCiAqICAgICBlbnRpdHkuZXhpc3RzKCkudGhlbigoaXNUaGVyZSkgewogKiAgICAgICBpc1RoZXJlID8gcHJpbnQoJ2V4aXN0cycpIDogcHJpbnQoJ25vbi1leGlzdGVudCcpOwogKiAgICAgfSk7CiAqCiAqCiAqICMjIE90aGVyIHJlc291cmNlcwogKgogKiAqIFtEYXJ0IGJ5CiAqICAgRXhhbXBsZV0oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RhcnQtYnktZXhhbXBsZS8jZmlsZXMtZGlyZWN0b3JpZXMtYW5kLXN5bWxpbmtzKQogKiAgIHByb3ZpZGVzIGFkZGl0aW9uYWwgdGFzay1vcmllbnRlZCBjb2RlIHNhbXBsZXMgdGhhdCBzaG93IGhvdyB0byB1c2UgdmFyaW91cwogKiAgIEFQSSBmcm9tIHRoZSBbRGlyZWN0b3J5XSBjbGFzcyBhbmQgdGhlIFtGaWxlXSBjbGFzcywgYm90aCBzdWJjbGFzc2VzIG9mCiAqICAgRmlsZVN5c3RlbUVudGl0eS4KICoKICogKiBbSS9PIGZvciBDb21tYW5kLUxpbmUKICogICBBcHBzXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NoMDMuaHRtbCNkYXJ0aW8tLS1pby1mb3ItY29tbWFuZC1saW5lLWFwcHMpLAogKiAgIGEgc2VjdGlvbiBmcm9tIF9BIFRvdXIgb2YgdGhlIERhcnQgTGlicmFyaWVzXyBjb3ZlcnMgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgogKgogKiAqIFtXcml0ZSBDb21tYW5kLUxpbmUgQXBwc10oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RvY3MvdHV0b3JpYWxzL2NtZGxpbmUvKSwKICogICBhIHR1dG9yaWFsIGFib3V0IHdyaXRpbmcgY29tbWFuZC1saW5lIGFwcHMsIGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0CiAqICAgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgogKi8KYWJzdHJhY3QgY2xhc3MgRmlsZVN5c3RlbUVudGl0eSB7CiAgU3RyaW5nIF9wYXRoOwogIFVpbnQ4TGlzdCBfcmF3UGF0aDsKCiAgU3RyaW5nIGdldCBwYXRoOwoKICAvKioKICAgKiBSZXR1cm5zIGEgW1VyaV0gcmVwcmVzZW50aW5nIHRoZSBmaWxlIHN5c3RlbSBlbnRpdHkncyBsb2NhdGlvbi4KICAgKgogICAqIFRoZSByZXR1cm5lZCBVUkkncyBzY2hlbWUgaXMgYWx3YXlzICJmaWxlIiBpZiB0aGUgZW50aXR5J3MgW3BhdGhdIGlzCiAgICogYWJzb2x1dGUsIG90aGVyd2lzZSB0aGUgc2NoZW1lIHdpbGwgYmUgZW1wdHkuCiAgICovCiAgVXJpIGdldCB1cmkgPT4gbmV3IFVyaS5maWxlKHBhdGgpOwoKICAvKioKICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZmlsZSBzeXN0ZW0gZW50aXR5IHdpdGggdGhpcyBwYXRoIGV4aXN0cy4gUmV0dXJucwogICAqIGEgWzpGdXR1cmU8Ym9vbD46XSB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZSByZXN1bHQuCiAgICoKICAgKiBTaW5jZSBGaWxlU3lzdGVtRW50aXR5IGlzIGFic3RyYWN0LCBldmVyeSBGaWxlU3lzdGVtRW50aXR5IG9iamVjdAogICAqIGlzIGFjdHVhbGx5IGFuIGluc3RhbmNlIG9mIG9uZSBvZiB0aGUgc3ViY2xhc3NlcyBbRmlsZV0sCiAgICogW0RpcmVjdG9yeV0sIGFuZCBbTGlua10uICBDYWxsaW5nIFtleGlzdHNdIG9uIGFuIGluc3RhbmNlIG9mIG9uZQogICAqIG9mIHRoZXNlIHN1YmNsYXNzZXMgY2hlY2tzIHdoZXRoZXIgdGhlIG9iamVjdCBleGlzdHMgaW4gdGhlIGZpbGUKICAgKiBzeXN0ZW0gb2JqZWN0IGV4aXN0cyBhbmQgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSAoZmlsZSwgZGlyZWN0b3J5LAogICAqIG9yIGxpbmspLiAgVG8gY2hlY2sgd2hldGhlciBhIHBhdGggcG9pbnRzIHRvIGFuIG9iamVjdCBvbiB0aGUKICAgKiBmaWxlIHN5c3RlbSwgcmVnYXJkbGVzcyBvZiB0aGUgb2JqZWN0J3MgdHlwZSwgdXNlIHRoZSBbdHlwZV0KICAgKiBzdGF0aWMgbWV0aG9kLgogICAqCiAgICovCiAgRnV0dXJlPGJvb2w+IGV4aXN0cygpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNoZWNrcyB3aGV0aGVyIHRoZSBmaWxlIHN5c3RlbSBlbnRpdHkgd2l0aCB0aGlzIHBhdGgKICAgKiBleGlzdHMuCiAgICoKICAgKiBTaW5jZSBGaWxlU3lzdGVtRW50aXR5IGlzIGFic3RyYWN0LCBldmVyeSBGaWxlU3lzdGVtRW50aXR5IG9iamVjdAogICAqIGlzIGFjdHVhbGx5IGFuIGluc3RhbmNlIG9mIG9uZSBvZiB0aGUgc3ViY2xhc3NlcyBbRmlsZV0sCiAgICogW0RpcmVjdG9yeV0sIGFuZCBbTGlua10uICBDYWxsaW5nIFtleGlzdHNTeW5jXSBvbiBhbiBpbnN0YW5jZSBvZgogICAqIG9uZSBvZiB0aGVzZSBzdWJjbGFzc2VzIGNoZWNrcyB3aGV0aGVyIHRoZSBvYmplY3QgZXhpc3RzIGluIHRoZQogICAqIGZpbGUgc3lzdGVtIG9iamVjdCBleGlzdHMgYW5kIGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUgKGZpbGUsCiAgICogZGlyZWN0b3J5LCBvciBsaW5rKS4gIFRvIGNoZWNrIHdoZXRoZXIgYSBwYXRoIHBvaW50cyB0byBhbiBvYmplY3QKICAgKiBvbiB0aGUgZmlsZSBzeXN0ZW0sIHJlZ2FyZGxlc3Mgb2YgdGhlIG9iamVjdCdzIHR5cGUsIHVzZSB0aGUKICAgKiBbdHlwZVN5bmNdIHN0YXRpYyBtZXRob2QuCiAgICovCiAgYm9vbCBleGlzdHNTeW5jKCk7CgogIC8qKgogICAqIFJlbmFtZXMgdGhpcyBmaWxlIHN5c3RlbSBlbnRpdHkuCiAgICoKICAgKiBSZXR1cm5zIGEgYEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5PmAgdGhhdCBjb21wbGV0ZXMgd2l0aCBhCiAgICogW0ZpbGVTeXN0ZW1FbnRpdHldIGluc3RhbmNlIGZvciB0aGUgcmVuYW1lZCBmaWxlIHN5c3RlbSBlbnRpdHkuCiAgICoKICAgKiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBlbnRpdHkgb2YgdGhlIHNhbWUgdHlwZSwgdGhhdCBlbnRpdHkKICAgKiBpcyByZXBsYWNlZC4gSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZW50aXR5IG9mIGEgZGlmZmVyZW50CiAgICogdHlwZSwgdGhlIG9wZXJhdGlvbiBmYWlscyBhbmQgdGhlIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBleGNlcHRpb24uCiAgICovCiAgRnV0dXJlPEZpbGVTeXN0ZW1FbnRpdHk+IHJlbmFtZShTdHJpbmcgbmV3UGF0aCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgcmVuYW1lcyB0aGlzIGZpbGUgc3lzdGVtIGVudGl0eS4KICAgKgogICAqIFJldHVybnMgYSBbRmlsZVN5c3RlbUVudGl0eV0gaW5zdGFuY2UgZm9yIHRoZSByZW5hbWVkIGVudGl0eS4KICAgKgogICAqIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGVudGl0eSBvZiB0aGUgc2FtZSB0eXBlLCB0aGF0IGVudGl0eQogICAqIGlzIHJlcGxhY2VkLiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBlbnRpdHkgb2YgYSBkaWZmZXJlbnQKICAgKiB0eXBlLCB0aGUgb3BlcmF0aW9uIGZhaWxzIGFuZCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAqLwogIEZpbGVTeXN0ZW1FbnRpdHkgcmVuYW1lU3luYyhTdHJpbmcgbmV3UGF0aCk7CgogIC8qKgogICAqIFJlc29sdmVzIHRoZSBwYXRoIG9mIGEgZmlsZSBzeXN0ZW0gb2JqZWN0IHJlbGF0aXZlIHRvIHRoZQogICAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCiAgICoKICAgKiBSZXNvbHZlcyBhbGwgc3ltYm9saWMgbGlua3Mgb24gdGhlIHBhdGggYW5kIHJlc29sdmVzIGFsbCBgLi5gIGFuZCBgLmAgcGF0aAogICAqIHNlZ21lbnRzLgogICAqCiAgICogW3Jlc29sdmVTeW1ib2xpY0xpbmtzXSB1c2VzIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgbmF0aXZlCiAgICogZmlsZSBzeXN0ZW0gQVBJIHRvIHJlc29sdmUgdGhlIHBhdGgsIHVzaW5nIHRoZSBgcmVhbHBhdGhgIGZ1bmN0aW9uCiAgICogb24gbGludXggYW5kIE9TIFgsIGFuZCB0aGUgYEdldEZpbmFsUGF0aE5hbWVCeUhhbmRsZWAgZnVuY3Rpb24gb24KICAgKiBXaW5kb3dzLiBJZiB0aGUgcGF0aCBkb2VzIG5vdCBwb2ludCB0byBhbiBleGlzdGluZyBmaWxlIHN5c3RlbSBvYmplY3QsCiAgICogYHJlc29sdmVTeW1ib2xpY0xpbmtzYCB0aHJvd3MgYSBgRmlsZVN5c3RlbUV4Y2VwdGlvbmAuCiAgICoKICAgKiBPbiBXaW5kb3dzIHRoZSBgLi5gIHNlZ21lbnRzIGFyZSByZXNvbHZlZCBfYmVmb3JlXyByZXNvbHZpbmcgdGhlIHN5bWJvbGljCiAgICogbGluaywgYW5kIG9uIG90aGVyIHBsYXRmb3JtcyB0aGUgc3ltYm9saWMgbGlua3MgYXJlIF9yZXNvbHZlZCB0byB0aGVpcgogICAqIHRhcmdldF8gYmVmb3JlIGFwcGx5aW5nIGEgYC4uYCB0aGF0IGZvbGxvd3MuCiAgICoKICAgKiBUbyBlbnN1cmUgdGhlIHNhbWUgYmVoYXZpb3Igb24gYWxsIHBsYXRmb3JtcyByZXNvbHZlIGAuLmAgc2VnbWVudHMgYmVmb3JlCiAgICogY2FsbGluZyBgcmVzb2x2ZVN5bWJvbGljTGlua3NgLiBPbmUgd2F5IG9mIGRvaW5nIHRoaXMgaXMgd2l0aCB0aGUgYFVyaWAKICAgKiBjbGFzczoKICAgKgogICAqICAgICB2YXIgcGF0aCA9IFVyaS5wYXJzZSgnLicpLnJlc29sdmVVcmkobmV3IFVyaS5maWxlKGlucHV0KSkudG9GaWxlUGF0aCgpOwogICAqICAgICBpZiAocGF0aCA9PSAnJykgcGF0aCA9ICcuJzsKICAgKiAgICAgbmV3IEZpbGUocGF0aCkucmVzb2x2ZVN5bWJvbGljTGlua3MoKS50aGVuKChyZXNvbHZlZCkgewogICAqICAgICAgIHByaW50KHJlc29sdmVkKTsKICAgKiAgICAgfSk7CiAgICoKICAgKiBzaW5jZSBgVXJpLnJlc29sdmVgIHJlbW92ZXMgYC4uYCBzZWdtZW50cy4gVGhpcyB3aWxsIHJlc3VsdCBpbiB0aGUgV2luZG93cwogICAqIGJlaGF2aW9yLgogICAqLwogIEZ1dHVyZTxTdHJpbmc+IHJlc29sdmVTeW1ib2xpY0xpbmtzKCkgewogICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoCiAgICAgICAgX0lPU2VydmljZS5maWxlUmVzb2x2ZVN5bWJvbGljTGlua3MsIFtudWxsLCBfcmF3UGF0aF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UoCiAgICAgICAgICAgIHJlc3BvbnNlLCAiQ2Fubm90IHJlc29sdmUgc3ltYm9saWMgbGlua3MiLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9KTsKICB9CgogIC8qKgogICAqIFJlc29sdmVzIHRoZSBwYXRoIG9mIGEgZmlsZSBzeXN0ZW0gb2JqZWN0IHJlbGF0aXZlIHRvIHRoZQogICAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCiAgICoKICAgKiBSZXNvbHZlcyBhbGwgc3ltYm9saWMgbGlua3Mgb24gdGhlIHBhdGggYW5kIHJlc29sdmVzIGFsbCBgLi5gIGFuZCBgLmAgcGF0aAogICAqIHNlZ21lbnRzLgogICAqCiAgICogW3Jlc29sdmVTeW1ib2xpY0xpbmtzU3luY10gdXNlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIG5hdGl2ZQogICAqIGZpbGUgc3lzdGVtIEFQSSB0byByZXNvbHZlIHRoZSBwYXRoLCB1c2luZyB0aGUgYHJlYWxwYXRoYCBmdW5jdGlvbgogICAqIG9uIGxpbnV4IGFuZCBPUyBYLCBhbmQgdGhlIGBHZXRGaW5hbFBhdGhOYW1lQnlIYW5kbGVgIGZ1bmN0aW9uIG9uCiAgICogV2luZG93cy4gSWYgdGhlIHBhdGggZG9lcyBub3QgcG9pbnQgdG8gYW4gZXhpc3RpbmcgZmlsZSBzeXN0ZW0gb2JqZWN0LAogICAqIGByZXNvbHZlU3ltYm9saWNMaW5rc1N5bmNgIHRocm93cyBhIGBGaWxlU3lzdGVtRXhjZXB0aW9uYC4KICAgKgogICAqIE9uIFdpbmRvd3MgdGhlIGAuLmAgc2VnbWVudHMgYXJlIHJlc29sdmVkIF9iZWZvcmVfIHJlc29sdmluZyB0aGUgc3ltYm9saWMKICAgKiBsaW5rLCBhbmQgb24gb3RoZXIgcGxhdGZvcm1zIHRoZSBzeW1ib2xpYyBsaW5rcyBhcmUgX3Jlc29sdmVkIHRvIHRoZWlyCiAgICogdGFyZ2V0XyBiZWZvcmUgYXBwbHlpbmcgYSBgLi5gIHRoYXQgZm9sbG93cy4KICAgKgogICAqIFRvIGVuc3VyZSB0aGUgc2FtZSBiZWhhdmlvciBvbiBhbGwgcGxhdGZvcm1zIHJlc29sdmUgYC4uYCBzZWdtZW50cyBiZWZvcmUKICAgKiBjYWxsaW5nIGByZXNvbHZlU3ltYm9saWNMaW5rc1N5bmNgLiBPbmUgd2F5IG9mIGRvaW5nIHRoaXMgaXMgd2l0aCB0aGUgYFVyaWAKICAgKiBjbGFzczoKICAgKgogICAqICAgICB2YXIgcGF0aCA9IFVyaS5wYXJzZSgnLicpLnJlc29sdmVVcmkobmV3IFVyaS5maWxlKGlucHV0KSkudG9GaWxlUGF0aCgpOwogICAqICAgICBpZiAocGF0aCA9PSAnJykgcGF0aCA9ICcuJzsKICAgKiAgICAgdmFyIHJlc29sdmVkID0gbmV3IEZpbGUocGF0aCkucmVzb2x2ZVN5bWJvbGljTGlua3NTeW5jKCk7CiAgICogICAgIHByaW50KHJlc29sdmVkKTsKICAgKgogICAqIHNpbmNlIGBVcmkucmVzb2x2ZWAgcmVtb3ZlcyBgLi5gIHNlZ21lbnRzLiBUaGlzIHdpbGwgcmVzdWx0IGluIHRoZSBXaW5kb3dzCiAgICogYmVoYXZpb3IuCiAgICovCiAgU3RyaW5nIHJlc29sdmVTeW1ib2xpY0xpbmtzU3luYygpIHsKICAgIHZhciByZXN1bHQgPSBfcmVzb2x2ZVN5bWJvbGljTGlua3MoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCk7CiAgICBfdGhyb3dJZkVycm9yKHJlc3VsdCwgIkNhbm5vdCByZXNvbHZlIHN5bWJvbGljIGxpbmtzIiwgcGF0aCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogQ2FsbHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBzdGF0KCkgZnVuY3Rpb24gb24gdGhlIFtwYXRoXSBvZiB0aGlzCiAgICogW0ZpbGVTeXN0ZW1FbnRpdHldLgogICAqCiAgICogSWRlbnRpY2FsIHRvIFs6RmlsZVN0YXQuc3RhdCh0aGlzLnBhdGgpOl0uCiAgICoKICAgKiBSZXR1cm5zIGEgWzpGdXR1cmU8RmlsZVN0YXQ+Ol0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRhdGEgcmV0dXJuZWQgYnkKICAgKiBzdGF0KCkuCiAgICoKICAgKiBJZiB0aGUgY2FsbCBmYWlscywgY29tcGxldGVzIHRoZSBmdXR1cmUgd2l0aCBhIFtGaWxlU3RhdF0gb2JqZWN0CiAgICogd2l0aCBgLnR5cGVgIHNldCB0byBbRmlsZVN5c3RlbUVudGl0eVR5cGUubm90Rm91bmRdIGFuZCB0aGUgb3RoZXIgZmllbGRzCiAgICogaW52YWxpZC4KICAgKi8KICBGdXR1cmU8RmlsZVN0YXQ+IHN0YXQoKSA9PiBGaWxlU3RhdC5zdGF0KHBhdGgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNhbGxzIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3Mgc3RhdCgpIGZ1bmN0aW9uIG9uIHRoZQogICAqIFtwYXRoXSBvZiB0aGlzIFtGaWxlU3lzdGVtRW50aXR5XS4KICAgKgogICAqIElkZW50aWNhbCB0byBbOkZpbGVTdGF0LnN0YXRTeW5jKHRoaXMucGF0aCk6XS4KICAgKgogICAqIFJldHVybnMgYSBbRmlsZVN0YXRdIG9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhIHJldHVybmVkIGJ5IHN0YXQoKS4KICAgKgogICAqIElmIHRoZSBjYWxsIGZhaWxzLCByZXR1cm5zIGEgW0ZpbGVTdGF0XSBvYmplY3Qgd2l0aCBgLnR5cGVgIHNldCB0bwogICAqIFtGaWxlU3lzdGVtRW50aXR5VHlwZS5ub3RGb3VuZF0gYW5kIHRoZSBvdGhlciBmaWVsZHMgaW52YWxpZC4KICAgKi8KICBGaWxlU3RhdCBzdGF0U3luYygpID0+IEZpbGVTdGF0LnN0YXRTeW5jKHBhdGgpOwoKICAvKioKICAgKiBEZWxldGVzIHRoaXMgW0ZpbGVTeXN0ZW1FbnRpdHldLgogICAqCiAgICogSWYgdGhlIFtGaWxlU3lzdGVtRW50aXR5XSBpcyBhIGRpcmVjdG9yeSwgYW5kIGlmIFtyZWN1cnNpdmVdIGlzIGZhbHNlLAogICAqIHRoZSBkaXJlY3RvcnkgbXVzdCBiZSBlbXB0eS4gT3RoZXJ3aXNlLCBpZiBbcmVjdXJzaXZlXSBpcyB0cnVlLCB0aGUKICAgKiBkaXJlY3RvcnkgYW5kIGFsbCBzdWItZGlyZWN0b3JpZXMgYW5kIGZpbGVzIGluIHRoZSBkaXJlY3RvcmllcyBhcmUKICAgKiBkZWxldGVkLiBMaW5rcyBhcmUgbm90IGZvbGxvd2VkIHdoZW4gZGVsZXRpbmcgcmVjdXJzaXZlbHkuIE9ubHkgdGhlIGxpbmsKICAgKiBpcyBkZWxldGVkLCBub3QgaXRzIHRhcmdldC4KICAgKgogICAqIElmIFtyZWN1cnNpdmVdIGlzIHRydWUsIHRoZSBbRmlsZVN5c3RlbUVudGl0eV0gaXMgZGVsZXRlZCBldmVuIGlmIHRoZSB0eXBlCiAgICogb2YgdGhlIFtGaWxlU3lzdGVtRW50aXR5XSBkb2Vzbid0IG1hdGNoIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHN5c3RlbS4KICAgKiBUaGlzIGJlaGF2aW9yIGFsbG93cyBbZGVsZXRlXSB0byBiZSB1c2VkIHRvIHVuY29uZGl0aW9uYWxseSBkZWxldGUgYW55IGZpbGUKICAgKiBzeXN0ZW0gb2JqZWN0LgogICAqCiAgICogUmV0dXJucyBhIFs6RnV0dXJlPEZpbGVTeXN0ZW1FbnRpdHk+Ol0gdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGlzCiAgICogW0ZpbGVTeXN0ZW1FbnRpdHldIHdoZW4gdGhlIGRlbGV0aW9uIGlzIGRvbmUuIElmIHRoZSBbRmlsZVN5c3RlbUVudGl0eV0KICAgKiBjYW5ub3QgYmUgZGVsZXRlZCwgdGhlIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBleGNlcHRpb24uCiAgICovCiAgRnV0dXJlPEZpbGVTeXN0ZW1FbnRpdHk+IGRlbGV0ZSh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSkgPT4KICAgICAgX2RlbGV0ZShyZWN1cnNpdmU6IHJlY3Vyc2l2ZSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgZGVsZXRlcyB0aGlzIFtGaWxlU3lzdGVtRW50aXR5XS4KICAgKgogICAqIElmIHRoZSBbRmlsZVN5c3RlbUVudGl0eV0gaXMgYSBkaXJlY3RvcnksIGFuZCBpZiBbcmVjdXJzaXZlXSBpcyBmYWxzZSwKICAgKiB0aGUgZGlyZWN0b3J5IG11c3QgYmUgZW1wdHkuIE90aGVyd2lzZSwgaWYgW3JlY3Vyc2l2ZV0gaXMgdHJ1ZSwgdGhlCiAgICogZGlyZWN0b3J5IGFuZCBhbGwgc3ViLWRpcmVjdG9yaWVzIGFuZCBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMgYXJlCiAgICogZGVsZXRlZC4gTGlua3MgYXJlIG5vdCBmb2xsb3dlZCB3aGVuIGRlbGV0aW5nIHJlY3Vyc2l2ZWx5LiBPbmx5IHRoZSBsaW5rCiAgICogaXMgZGVsZXRlZCwgbm90IGl0cyB0YXJnZXQuCiAgICoKICAgKiBJZiBbcmVjdXJzaXZlXSBpcyB0cnVlLCB0aGUgW0ZpbGVTeXN0ZW1FbnRpdHldIGlzIGRlbGV0ZWQgZXZlbiBpZiB0aGUgdHlwZQogICAqIG9mIHRoZSBbRmlsZVN5c3RlbUVudGl0eV0gZG9lc24ndCBtYXRjaCB0aGUgY29udGVudCBvZiB0aGUgZmlsZSBzeXN0ZW0uCiAgICogVGhpcyBiZWhhdmlvciBhbGxvd3MgW2RlbGV0ZVN5bmNdIHRvIGJlIHVzZWQgdG8gdW5jb25kaXRpb25hbGx5IGRlbGV0ZSBhbnkKICAgKiBmaWxlIHN5c3RlbSBvYmplY3QuCiAgICoKICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBbRmlsZVN5c3RlbUVudGl0eV0gY2Fubm90IGJlIGRlbGV0ZWQuCiAgICovCiAgdm9pZCBkZWxldGVTeW5jKHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KSA9PiBfZGVsZXRlU3luYyhyZWN1cnNpdmU6IHJlY3Vyc2l2ZSk7CgogIC8qKgogICAqIFN0YXJ0IHdhdGNoaW5nIHRoZSBbRmlsZVN5c3RlbUVudGl0eV0gZm9yIGNoYW5nZXMuCiAgICoKICAgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBwbGF0Zm9ybS1kZXBlbmRlbnQgZXZlbnQtYmFzZWQgQVBJcyBmb3IgcmVjZWl2aW5nCiAgICogZmlsZS1zeXN0ZW0gbm90aWZpY2F0aW9ucywgdGh1cyBiZWhhdmlvciBkZXBlbmRzIG9uIHRoZSBwbGF0Zm9ybS4KICAgKgogICAqICAgKiBgV2luZG93c2A6IFVzZXMgYFJlYWREaXJlY3RvcnlDaGFuZ2VzV2AuIFRoZSBpbXBsZW1lbnRhdGlvbiBvbmx5CiAgICogICAgIHN1cHBvcnRzIHdhdGNoaW5nIGRpcmVjdG9yaWVzLiBSZWN1cnNpdmUgd2F0Y2hpbmcgaXMgc3VwcG9ydGVkLgogICAqICAgKiBgTGludXhgOiBVc2VzIGBpbm90aWZ5YC4gVGhlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHdhdGNoaW5nIGJvdGgKICAgKiAgICAgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLiBSZWN1cnNpdmUgd2F0Y2hpbmcgaXMgbm90IHN1cHBvcnRlZC4KICAgKiAgICAgTm90ZTogV2hlbiB3YXRjaGluZyBmaWxlcyBkaXJlY3RseSwgZGVsZXRlIGV2ZW50cyBtaWdodCBub3QgaGFwcGVuCiAgICogICAgIGFzIGV4cGVjdGVkLgogICAqICAgKiBgT1MgWGA6IFVzZXMgYEZTRXZlbnRzYC4gVGhlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHdhdGNoaW5nIGJvdGgKICAgKiAgICAgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLiBSZWN1cnNpdmUgd2F0Y2hpbmcgaXMgc3VwcG9ydGVkLgogICAqCiAgICogVGhlIHN5c3RlbSB3aWxsIHN0YXJ0IGxpc3RlbmluZyBmb3IgZXZlbnRzIG9uY2UgdGhlIHJldHVybmVkIFtTdHJlYW1dIGlzCiAgICogYmVpbmcgbGlzdGVuZWQgdG8sIG5vdCB3aGVuIHRoZSBjYWxsIHRvIFt3YXRjaF0gaXMgaXNzdWVkLgogICAqCiAgICogVGhlIHJldHVybmVkIHZhbHVlIGlzIGFuIGVuZGxlc3MgYnJvYWRjYXN0IFtTdHJlYW1dLCB0aGF0IG9ubHkgc3RvcHMgd2hlbgogICAqIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhhcHBlbnM6CiAgICoKICAgKiAgICogVGhlIFtTdHJlYW1dIGlzIGNhbmNlbGVkLCBlLmcuIGJ5IGNhbGxpbmcgYGNhbmNlbGAgb24gdGhlCiAgICogICAgICBbU3RyZWFtU3Vic2NyaXB0aW9uXS4KICAgKiAgICogVGhlIFtGaWxlU3lzdGVtRW50aXR5XSBiZWluZyB3YXRjaGVzLCBpcyBkZWxldGVkLgogICAqCiAgICogVXNlIGBldmVudHNgIHRvIHNwZWNpZnkgd2hhdCBldmVudHMgdG8gbGlzdGVuIGZvci4gVGhlIGNvbnN0YW50cyBpbgogICAqIFtGaWxlU3lzdGVtRXZlbnRdIGNhbiBiZSBvcidlZCB0b2dldGhlciB0byBtaXggZXZlbnRzLiBEZWZhdWx0IGlzCiAgICogW0ZpbGVTeXN0ZW1FdmVudC5BTExdLgogICAqCiAgICogQSBtb3ZlIGV2ZW50IG1heSBiZSByZXBvcnRlZCBhcyBzZXBlcmF0ZSBkZWxldGUgYW5kIGNyZWF0ZSBldmVudHMuCiAgICovCiAgU3RyZWFtPEZpbGVTeXN0ZW1FdmVudD4gd2F0Y2goCiAgICAgIHtpbnQgZXZlbnRzOiBGaWxlU3lzdGVtRXZlbnQuYWxsLCBib29sIHJlY3Vyc2l2ZTogZmFsc2V9KSB7CiAgICAvLyBGSVhNRShia29ueWkpOiBmaW5kIGEgd2F5IHRvIGRvIHRoaXMgdXNpbmcgdGhlIHJhdyBwYXRoLgogICAgZmluYWwgU3RyaW5nIHRyaW1tZWRQYXRoID0gX3RyaW1UcmFpbGluZ1BhdGhTZXBhcmF0b3JzKHBhdGgpOwogICAgZmluYWwgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gSU9PdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gX0ZpbGVTeXN0ZW1XYXRjaGVyLl93YXRjaCh0cmltbWVkUGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5mc1dhdGNoKHRyaW1tZWRQYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSk7CiAgfQoKICBGdXR1cmU8RmlsZVN5c3RlbUVudGl0eT4gX2RlbGV0ZSh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSk7CiAgdm9pZCBfZGVsZXRlU3luYyh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSk7CgogIHN0YXRpYyBGdXR1cmU8Ym9vbD4gX2lkZW50aWNhbChTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMikgewogICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoCiAgICAgICAgX0lPU2VydmljZS5maWxlSWRlbnRpY2FsLCBbbnVsbCwgcGF0aDEsIHBhdGgyXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwKICAgICAgICAgICAgIkVycm9yIGluIEZpbGVTeXN0ZW1FbnRpdHkuaWRlbnRpY2FsKCRwYXRoMSwgJHBhdGgyKSIsICIiKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9KTsKICB9CgogIC8qKgogICAqIENoZWNrcyB3aGV0aGVyIHR3byBwYXRocyByZWZlciB0byB0aGUgc2FtZSBvYmplY3QgaW4gdGhlCiAgICogZmlsZSBzeXN0ZW0uCiAgICoKICAgKiBSZXR1cm5zIGEgWzpGdXR1cmU8Ym9vbD46XSB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZSByZXN1bHQuCiAgICoKICAgKiBDb21wYXJpbmcgYSBsaW5rIHRvIGl0cyB0YXJnZXQgcmV0dXJucyBmYWxzZSwgYXMgZG9lcyBjb21wYXJpbmcgdHdvIGxpbmtzCiAgICogdGhhdCBwb2ludCB0byB0aGUgc2FtZSB0YXJnZXQuICBUbyBjaGVjayB0aGUgdGFyZ2V0IG9mIGEgbGluaywgdXNlCiAgICogTGluay50YXJnZXQgZXhwbGljaXRseSB0byBmZXRjaCBpdC4gIERpcmVjdG9yeSBsaW5rcyBhcHBlYXJpbmcKICAgKiBpbnNpZGUgYSBwYXRoIGFyZSBmb2xsb3dlZCwgdGhvdWdoLCB0byBmaW5kIHRoZSBmaWxlIHN5c3RlbSBvYmplY3QuCiAgICoKICAgKiBDb21wbGV0ZXMgdGhlIHJldHVybmVkIEZ1dHVyZSB3aXRoIGFuIGVycm9yIGlmIG9uZSBvZiB0aGUgcGF0aHMgcG9pbnRzCiAgICogdG8gYW4gb2JqZWN0IHRoYXQgZG9lcyBub3QgZXhpc3QuCiAgICovCiAgc3RhdGljIEZ1dHVyZTxib29sPiBpZGVudGljYWwoU3RyaW5nIHBhdGgxLCBTdHJpbmcgcGF0aDIpIHsKICAgIElPT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IElPT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9pZGVudGljYWwocGF0aDEsIHBhdGgyKTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuZnNlSWRlbnRpY2FsKHBhdGgxLCBwYXRoMik7CiAgfQoKICBzdGF0aWMgZmluYWwgUmVnRXhwIF9hYnNvbHV0ZVdpbmRvd3NQYXRoUGF0dGVybiA9CiAgICAgIG5ldyBSZWdFeHAocideKFxcXFx8W2EtekEtWl06Wy9cXF0pJyk7CgogIC8qKgogICAqIFJldHVybnMgYSBbYm9vbF0gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgb2JqZWN0J3MgcGF0aCBpcyBhYnNvbHV0ZS4KICAgKgogICAqIE9uIFdpbmRvd3MsIGEgcGF0aCBpcyBhYnNvbHV0ZSBpZiBpdCBzdGFydHMgd2l0aCBcXFxcIG9yIGEgZHJpdmUgbGV0dGVyCiAgICogYmV0d2VlbiBhIGFuZCB6ICh1cHBlciBvciBsb3dlciBjYXNlKSBmb2xsb3dlZCBieSA6XFwgb3IgOi8uCiAgICogT24gbm9uLVdpbmRvd3MsIGEgcGF0aCBpcyBhYnNvbHV0ZSBpZiBpdCBzdGFydHMgd2l0aCAvLgogICAqLwogIGJvb2wgZ2V0IGlzQWJzb2x1dGUgewogICAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykgewogICAgICByZXR1cm4gcGF0aC5zdGFydHNXaXRoKF9hYnNvbHV0ZVdpbmRvd3NQYXRoUGF0dGVybik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gcGF0aC5zdGFydHNXaXRoKCcvJyk7CiAgICB9CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgW0ZpbGVTeXN0ZW1FbnRpdHldIHdob3NlIHBhdGggaXMgdGhlIGFic29sdXRlIHBhdGggdG8gW3RoaXNdLgogICAqCiAgICogVGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIGluc3RhbmNlIGlzIHRoZSB0eXBlIG9mIFt0aGlzXS4KICAgKgogICAqIFRoZSBhYnNvbHV0ZSBwYXRoIGlzIGNvbXB1dGVkIGJ5IHByZWZpeGluZwogICAqIGEgcmVsYXRpdmUgcGF0aCB3aXRoIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgcmV0dXJuaW5nCiAgICogYW4gYWJzb2x1dGUgcGF0aCB1bmNoYW5nZWQuCiAgICovCiAgRmlsZVN5c3RlbUVudGl0eSBnZXQgYWJzb2x1dGU7CgogIFN0cmluZyBnZXQgX2Fic29sdXRlUGF0aCB7CiAgICBpZiAoaXNBYnNvbHV0ZSkgcmV0dXJuIHBhdGg7CiAgICBTdHJpbmcgY3VycmVudCA9IERpcmVjdG9yeS5jdXJyZW50LnBhdGg7CiAgICBpZiAoY3VycmVudC5lbmRzV2l0aCgnLycpIHx8CiAgICAgICAgKFBsYXRmb3JtLmlzV2luZG93cyAmJiBjdXJyZW50LmVuZHNXaXRoKCdcXCcpKSkgewogICAgICByZXR1cm4gJyRjdXJyZW50JHBhdGgnOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICckY3VycmVudCR7UGxhdGZvcm0ucGF0aFNlcGFyYXRvcn0kcGF0aCc7CiAgICB9CiAgfQoKICBVaW50OExpc3QgZ2V0IF9yYXdBYnNvbHV0ZVBhdGggewogICAgaWYgKGlzQWJzb2x1dGUpIHJldHVybiBfcmF3UGF0aDsKICAgIHZhciBjdXJyZW50ID0gRGlyZWN0b3J5LmN1cnJlbnQuX3Jhd1BhdGgudG9MaXN0KCk7CiAgICBhc3NlcnQoY3VycmVudC5sYXN0ID09IDApOwogICAgY3VycmVudC5yZW1vdmVMYXN0KCk7IC8vIFJlbW92ZSBudWxsIHRlcm1pbmF0b3IuCiAgICBpZiAoKGN1cnJlbnQubGFzdCA9PSAnLycuY29kZVVuaXRBdCgwKSkgfHwKICAgICAgICAoUGxhdGZvcm0uaXNXaW5kb3dzICYmIChjdXJyZW50Lmxhc3QgPT0gJ1xcJy5jb2RlVW5pdEF0KDApKSkpIHsKICAgICAgY3VycmVudC5hZGRBbGwoX3Jhd1BhdGgpOwogICAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChjdXJyZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIGN1cnJlbnQuYWRkQWxsKHV0ZjguZW5jb2RlKFBsYXRmb3JtLnBhdGhTZXBhcmF0b3IpKTsKICAgICAgY3VycmVudC5hZGRBbGwoX3Jhd1BhdGgpOwogICAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChjdXJyZW50KTsKICAgIH0KICB9CgogIHN0YXRpYyBib29sIF9pZGVudGljYWxTeW5jKFN0cmluZyBwYXRoMSwgU3RyaW5nIHBhdGgyKSB7CiAgICB2YXIgcmVzdWx0ID0gX2lkZW50aWNhbE5hdGl2ZShfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIHBhdGgxLCBwYXRoMik7CiAgICBfdGhyb3dJZkVycm9yKHJlc3VsdCwgJ0Vycm9yIGluIEZpbGVTeXN0ZW1FbnRpdHkuaWRlbnRpY2FsU3luYycpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgY2hlY2tzIHdoZXRoZXIgdHdvIHBhdGhzIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCBpbiB0aGUKICAgKiBmaWxlIHN5c3RlbS4KICAgKgogICAqIENvbXBhcmluZyBhIGxpbmsgdG8gaXRzIHRhcmdldCByZXR1cm5zIGZhbHNlLCBhcyBkb2VzIGNvbXBhcmluZyB0d28gbGlua3MKICAgKiB0aGF0IHBvaW50IHRvIHRoZSBzYW1lIHRhcmdldC4gIFRvIGNoZWNrIHRoZSB0YXJnZXQgb2YgYSBsaW5rLCB1c2UKICAgKiBMaW5rLnRhcmdldCBleHBsaWNpdGx5IHRvIGZldGNoIGl0LiAgRGlyZWN0b3J5IGxpbmtzIGFwcGVhcmluZwogICAqIGluc2lkZSBhIHBhdGggYXJlIGZvbGxvd2VkLCB0aG91Z2gsIHRvIGZpbmQgdGhlIGZpbGUgc3lzdGVtIG9iamVjdC4KICAgKgogICAqIFRocm93cyBhbiBlcnJvciBpZiBvbmUgb2YgdGhlIHBhdGhzIHBvaW50cyB0byBhbiBvYmplY3QgdGhhdCBkb2VzIG5vdAogICAqIGV4aXN0LgogICAqLwogIHN0YXRpYyBib29sIGlkZW50aWNhbFN5bmMoU3RyaW5nIHBhdGgxLCBTdHJpbmcgcGF0aDIpIHsKICAgIElPT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IElPT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9pZGVudGljYWxTeW5jKHBhdGgxLCBwYXRoMik7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLmZzZUlkZW50aWNhbFN5bmMocGF0aDEsIHBhdGgyKTsKICB9CgogIC8qKgogICAqIFRlc3QgaWYgW3dhdGNoXSBpcyBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgc3lzdGVtLgogICAqCiAgICogT1MgWCAxMC42IGFuZCBiZWxvdyBpcyBub3Qgc3VwcG9ydGVkLgogICAqLwogIHN0YXRpYyBib29sIGdldCBpc1dhdGNoU3VwcG9ydGVkIHsKICAgIGZpbmFsIElPT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IElPT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9GaWxlU3lzdGVtV2F0Y2hlci5pc1N1cHBvcnRlZDsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuZnNXYXRjaElzU3VwcG9ydGVkKCk7CiAgfQoKICAvLyBUaGUgbmF0aXZlIG1ldGhvZHMgd2hpY2ggZGV0ZXJtaW5lIHR5cGUgb2YgdGhlIEZpbGVTeXN0ZW1FbnRpdHkgcmVxdWlyZQogIC8vIHRoYXQgdGhlIGJ1ZmZlciBwcm92aWRlZCBpcyBudWxsIHRlcm1pbmF0ZWQuCiAgc3RhdGljIFVpbnQ4TGlzdCBfdG9VdGY4QXJyYXkoU3RyaW5nIHMpID0+CiAgICAgIF90b051bGxUZXJtaW5hdGVkVXRmOEFycmF5KHV0ZjguZW5jb2RlKHMpKTsKCiAgc3RhdGljIFVpbnQ4TGlzdCBfdG9OdWxsVGVybWluYXRlZFV0ZjhBcnJheShVaW50OExpc3QgbCkgewogICAgaWYgKGwgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChsLmlzTm90RW1wdHkgJiYgbC5sYXN0ICE9IDApIHsKICAgICAgZmluYWwgdG1wID0gbmV3IFVpbnQ4TGlzdChsLmxlbmd0aCArIDEpOwogICAgICB0bXAuc2V0UmFuZ2UoMCwgbC5sZW5ndGgsIGwpOwogICAgICByZXR1cm4gdG1wOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGw7CiAgICB9CiAgfQoKICBzdGF0aWMgU3RyaW5nIF90b1N0cmluZ0Zyb21VdGY4QXJyYXkoVWludDhMaXN0IGwpIHsKICAgIGlmIChsID09IG51bGwpIHsKICAgICAgcmV0dXJuICcnOwogICAgfQogICAgVWludDhMaXN0IG5vbk51bGxUZXJtaW5hdGVkID0gbDsKICAgIGlmIChsLmxhc3QgPT0gMCkgewogICAgICBub25OdWxsVGVybWluYXRlZCA9IG5ldyBVaW50OExpc3QudmlldyhsLmJ1ZmZlciwgMCwgbC5sZW5ndGggLSAxKTsKICAgIH0KICAgIHJldHVybiB1dGY4LmRlY29kZShub25OdWxsVGVybWluYXRlZCwgYWxsb3dNYWxmb3JtZWQ6IHRydWUpOwogIH0KCiAgLyoqCiAgICogRmluZHMgdGhlIHR5cGUgb2YgZmlsZSBzeXN0ZW0gb2JqZWN0IHRoYXQgYSBwYXRoIHBvaW50cyB0by4KICAgKgogICAqIFJldHVybnMgYSBbOkZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5VHlwZT46XSB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZSBzYW1lCiAgICogcmVzdWx0cyBhcyBbdHlwZVN5bmNdLgogICAqLwogIHN0YXRpYyBGdXR1cmU8RmlsZVN5c3RlbUVudGl0eVR5cGU+IHR5cGUoU3RyaW5nIHBhdGgsCiAgICAgIHtib29sIGZvbGxvd0xpbmtzOiB0cnVlfSkgewogICAgcmV0dXJuIF9nZXRUeXBlKF90b1V0ZjhBcnJheShwYXRoKSwgZm9sbG93TGlua3MpOwogIH0KCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBmaW5kcyB0aGUgdHlwZSBvZiBmaWxlIHN5c3RlbSBvYmplY3QgdGhhdCBhIHBhdGggcG9pbnRzIHRvLgogICAqCiAgICogUmV0dXJucyBhIFtGaWxlU3lzdGVtRW50aXR5VHlwZV0uCiAgICoKICAgKiBSZXR1cm5zIFtGaWxlU3lzdGVtRW50aXR5VHlwZS5saW5rXSBvbmx5IGlmIFtmb2xsb3dMaW5rc10gaXMgZmFsc2UgYW5kIGlmCiAgICogW3BhdGhdIHBvaW50cyB0byBhIGxpbmsuCiAgICoKICAgKiBSZXR1cm5zIFtGaWxlU3lzdGVtRW50aXR5VHlwZS5ub3RGb3VuZF0gaWYgW3BhdGhdIGRvZXMgbm90IHBvaW50IHRvIGEgZmlsZQogICAqIHN5c3RlbSBvYmplY3Qgb3IgaWYgYW55IG90aGVyIGVycm9yIG9jY3VycyBpbiBsb29raW5nIHVwIHRoZSBwYXRoLgogICAqLwogIHN0YXRpYyBGaWxlU3lzdGVtRW50aXR5VHlwZSB0eXBlU3luYyhTdHJpbmcgcGF0aCwge2Jvb2wgZm9sbG93TGlua3M6IHRydWV9KSB7CiAgICByZXR1cm4gX2dldFR5cGVTeW5jKF90b1V0ZjhBcnJheShwYXRoKSwgZm9sbG93TGlua3MpOwogIH0KCiAgLyoqCiAgICogQ2hlY2tzIGlmIHR5cGUocGF0aCwgZm9sbG93TGlua3M6IGZhbHNlKSByZXR1cm5zIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLmxpbmsuCiAgICovCiAgc3RhdGljIEZ1dHVyZTxib29sPiBpc0xpbmsoU3RyaW5nIHBhdGgpID0+IF9pc0xpbmtSYXcoX3RvVXRmOEFycmF5KHBhdGgpKTsKCiAgc3RhdGljIEZ1dHVyZTxib29sPiBfaXNMaW5rUmF3KFVpbnQ4TGlzdCByYXdQYXRoKSA9PiBfZ2V0VHlwZShyYXdQYXRoLCBmYWxzZSkKICAgICAgLnRoZW4oKHR5cGUpID0+ICh0eXBlID09IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLmxpbmspKTsKCiAgLyoqCiAgICogQ2hlY2tzIGlmIHR5cGUocGF0aCkgcmV0dXJucyBGaWxlU3lzdGVtRW50aXR5VHlwZS5maWxlLgogICAqLwogIHN0YXRpYyBGdXR1cmU8Ym9vbD4gaXNGaWxlKFN0cmluZyBwYXRoKSA9PiBfZ2V0VHlwZShfdG9VdGY4QXJyYXkocGF0aCksIHRydWUpCiAgICAgIC50aGVuKCh0eXBlKSA9PiAodHlwZSA9PSBGaWxlU3lzdGVtRW50aXR5VHlwZS5maWxlKSk7CgogIC8qKgogICAqIENoZWNrcyBpZiB0eXBlKHBhdGgpIHJldHVybnMgRmlsZVN5c3RlbUVudGl0eVR5cGUuZGlyZWN0b3J5LgogICAqLwogIHN0YXRpYyBGdXR1cmU8Ym9vbD4gaXNEaXJlY3RvcnkoU3RyaW5nIHBhdGgpID0+CiAgICAgIF9nZXRUeXBlKF90b1V0ZjhBcnJheShwYXRoKSwgdHJ1ZSkKICAgICAgICAgIC50aGVuKCh0eXBlKSA9PiAodHlwZSA9PSBGaWxlU3lzdGVtRW50aXR5VHlwZS5kaXJlY3RvcnkpKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBjaGVja3MgaWYgdHlwZVN5bmMocGF0aCwgZm9sbG93TGlua3M6IGZhbHNlKSByZXR1cm5zCiAgICogRmlsZVN5c3RlbUVudGl0eVR5cGUubGluay4KICAgKi8KICBzdGF0aWMgYm9vbCBpc0xpbmtTeW5jKFN0cmluZyBwYXRoKSA9PiBfaXNMaW5rUmF3U3luYyhfdG9VdGY4QXJyYXkocGF0aCkpOwoKICBzdGF0aWMgYm9vbCBfaXNMaW5rUmF3U3luYyhyYXdQYXRoKSA9PgogICAgICAoX2dldFR5cGVTeW5jKHJhd1BhdGgsIGZhbHNlKSA9PSBGaWxlU3lzdGVtRW50aXR5VHlwZS5saW5rKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBjaGVja3MgaWYgdHlwZVN5bmMocGF0aCkgcmV0dXJucwogICAqIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLmZpbGUuCiAgICovCiAgc3RhdGljIGJvb2wgaXNGaWxlU3luYyhTdHJpbmcgcGF0aCkgPT4KICAgICAgKF9nZXRUeXBlU3luYyhfdG9VdGY4QXJyYXkocGF0aCksIHRydWUpID09IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLmZpbGUpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNoZWNrcyBpZiB0eXBlU3luYyhwYXRoKSByZXR1cm5zCiAgICogRmlsZVN5c3RlbUVudGl0eVR5cGUuZGlyZWN0b3J5LgogICAqLwogIHN0YXRpYyBib29sIGlzRGlyZWN0b3J5U3luYyhTdHJpbmcgcGF0aCkgPT4KICAgICAgKF9nZXRUeXBlU3luYyhfdG9VdGY4QXJyYXkocGF0aCksIHRydWUpID09CiAgICAgICAgICBGaWxlU3lzdGVtRW50aXR5VHlwZS5kaXJlY3RvcnkpOwoKICBleHRlcm5hbCBzdGF0aWMgX2dldFR5cGVOYXRpdmUoCiAgICAgIF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwgYm9vbCBmb2xsb3dMaW5rcyk7CiAgZXh0ZXJuYWwgc3RhdGljIF9pZGVudGljYWxOYXRpdmUoCiAgICAgIF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMik7CiAgZXh0ZXJuYWwgc3RhdGljIF9yZXNvbHZlU3ltYm9saWNMaW5rcyhfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHBhdGgpOwoKICAvLyBGaW5kcyB0aGUgbmV4dC10by1sYXN0IGNvbXBvbmVudCB3aGVuIGRpdmlkaW5nIGF0IHBhdGggc2VwYXJhdG9ycy4KICBzdGF0aWMgZmluYWwgUmVnRXhwIF9wYXJlbnRSZWdFeHAgPSBQbGF0Zm9ybS5pc1dpbmRvd3MKICAgICAgPyBuZXcgUmVnRXhwKHInW14vXFxdWy9cXF0rW14vXFxdJykKICAgICAgOiBuZXcgUmVnRXhwKHInW14vXS8rW14vXScpOwoKICAvKioKICAgKiBSZW1vdmVzIHRoZSBmaW5hbCBwYXRoIGNvbXBvbmVudCBvZiBhIHBhdGgsIHVzaW5nIHRoZSBwbGF0Zm9ybSdzCiAgICogcGF0aCBzZXBhcmF0b3IgdG8gc3BsaXQgdGhlIHBhdGguCiAgICoKICAgKiBXaWxsIG5vdCByZW1vdmUgdGhlIHJvb3QgY29tcG9uZW50IG9mIGEgV2luZG93cyBwYXRoLCBsaWtlICJDOlxcIiBvcgogICAqICJcXFxcc2VydmVyX25hbWVcXCIuIElnbm9yZXMgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3JzLCBhbmQgbGVhdmVzIG5vCiAgICogdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3JzLgogICAqLwogIHN0YXRpYyBTdHJpbmcgcGFyZW50T2YoU3RyaW5nIHBhdGgpIHsKICAgIGludCByb290RW5kID0gLTE7CiAgICBpZiAoUGxhdGZvcm0uaXNXaW5kb3dzKSB7CiAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoX2Fic29sdXRlV2luZG93c1BhdGhQYXR0ZXJuKSkgewogICAgICAgIC8vIFJvb3QgZW5kcyBhdCBmaXJzdCAvIG9yIFwgYWZ0ZXIgdGhlIGZpcnN0IHR3byBjaGFyYWN0ZXJzLgogICAgICAgIHJvb3RFbmQgPSBwYXRoLmluZGV4T2YobmV3IFJlZ0V4cChyJ1svXFxdJyksIDIpOwogICAgICAgIGlmIChyb290RW5kID09IC0xKSByZXR1cm4gcGF0aDsKICAgICAgfSBlbHNlIGlmIChwYXRoLnN0YXJ0c1dpdGgoJ1xcJykgfHwgcGF0aC5zdGFydHNXaXRoKCcvJykpIHsKICAgICAgICByb290RW5kID0gMDsKICAgICAgfQogICAgfSBlbHNlIGlmIChwYXRoLnN0YXJ0c1dpdGgoJy8nKSkgewogICAgICByb290RW5kID0gMDsKICAgIH0KICAgIC8vIElnbm9yZSB0cmFpbGluZyBzbGFzaGVzLgogICAgLy8gQWxsIG5vbi10cml2aWFsIGNhc2VzIGhhdmUgc2VwYXJhdG9ycyBiZXR3ZWVuIHR3byBub24tc2VwYXJhdG9ycy4KICAgIGludCBwb3MgPSBwYXRoLmxhc3RJbmRleE9mKF9wYXJlbnRSZWdFeHApOwogICAgaWYgKHBvcyA+IHJvb3RFbmQpIHsKICAgICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBvcyArIDEpOwogICAgfSBlbHNlIGlmIChyb290RW5kID4gLTEpIHsKICAgICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHJvb3RFbmQgKyAxKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAnLic7CiAgICB9CiAgfQoKICAvKioKICAgKiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgW3RoaXNdLgogICAqLwogIERpcmVjdG9yeSBnZXQgcGFyZW50ID0+IG5ldyBEaXJlY3RvcnkocGFyZW50T2YocGF0aCkpOwoKICBzdGF0aWMgRmlsZVN5c3RlbUVudGl0eVR5cGUgX2dldFR5cGVTeW5jSGVscGVyKAogICAgICBVaW50OExpc3QgcmF3UGF0aCwgYm9vbCBmb2xsb3dMaW5rcykgewogICAgdmFyIHJlc3VsdCA9IF9nZXRUeXBlTmF0aXZlKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgcmF3UGF0aCwgZm9sbG93TGlua3MpOwogICAgX3Rocm93SWZFcnJvcihyZXN1bHQsICdFcnJvciBnZXR0aW5nIHR5cGUgb2YgRmlsZVN5c3RlbUVudGl0eScpOwogICAgcmV0dXJuIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLl9sb29rdXAocmVzdWx0KTsKICB9CgogIHN0YXRpYyBGaWxlU3lzdGVtRW50aXR5VHlwZSBfZ2V0VHlwZVN5bmMoCiAgICAgIFVpbnQ4TGlzdCByYXdQYXRoLCBib29sIGZvbGxvd0xpbmtzKSB7CiAgICBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZ2V0VHlwZVN5bmNIZWxwZXIocmF3UGF0aCwgZm9sbG93TGlua3MpOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5mc2VHZXRUeXBlU3luYygKICAgICAgICB1dGY4LmRlY29kZShyYXdQYXRoLCBhbGxvd01hbGZvcm1lZDogdHJ1ZSksIGZvbGxvd0xpbmtzKTsKICB9CgogIHN0YXRpYyBGdXR1cmU8RmlsZVN5c3RlbUVudGl0eVR5cGU+IF9nZXRUeXBlUmVxdWVzdCgKICAgICAgVWludDhMaXN0IHJhd1BhdGgsIGJvb2wgZm9sbG93TGlua3MpIHsKICAgIHJldHVybiBfRmlsZS5fZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgIF9JT1NlcnZpY2UuZmlsZVR5cGUsIFtudWxsLCByYXdQYXRoLCBmb2xsb3dMaW5rc10pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJFcnJvciBnZXR0aW5nIHR5cGUiLAogICAgICAgICAgICB1dGY4LmRlY29kZShyYXdQYXRoLCBhbGxvd01hbGZvcm1lZDogdHJ1ZSkpOwogICAgICB9CiAgICAgIHJldHVybiBGaWxlU3lzdGVtRW50aXR5VHlwZS5fbG9va3VwKHJlc3BvbnNlKTsKICAgIH0pOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5VHlwZT4gX2dldFR5cGUoCiAgICAgIFVpbnQ4TGlzdCByYXdQYXRoLCBib29sIGZvbGxvd0xpbmtzKSB7CiAgICBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfZ2V0VHlwZVJlcXVlc3QocmF3UGF0aCwgZm9sbG93TGlua3MpOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5mc2VHZXRUeXBlKAogICAgICAgIHV0ZjguZGVjb2RlKHJhd1BhdGgsIGFsbG93TWFsZm9ybWVkOiB0cnVlKSwgZm9sbG93TGlua3MpOwogIH0KCiAgc3RhdGljIF90aHJvd0lmRXJyb3IoT2JqZWN0IHJlc3VsdCwgU3RyaW5nIG1zZywgW1N0cmluZyBwYXRoXSkgewogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKG1zZywgcGF0aCwgcmVzdWx0KTsKICAgIH0gZWxzZSBpZiAocmVzdWx0IGlzIEFyZ3VtZW50RXJyb3IpIHsKICAgICAgdGhyb3cgcmVzdWx0OwogICAgfQogIH0KCiAgLy8gVE9ETyhia29ueWkpOiBmaW5kIGEgd2F5IHRvIGRvIHRoaXMgd2l0aCByYXcgcGF0aHMuCiAgc3RhdGljIFN0cmluZyBfdHJpbVRyYWlsaW5nUGF0aFNlcGFyYXRvcnMoU3RyaW5nIHBhdGgpIHsKICAgIC8vIERvbid0IGhhbmRsZSBhcmd1bWVudCBlcnJvcnMgaGVyZS4KICAgIGlmIChwYXRoID09IG51bGwpIHJldHVybiBwYXRoOwogICAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykgewogICAgICB3aGlsZSAocGF0aC5sZW5ndGggPiAxICYmCiAgICAgICAgICAocGF0aC5lbmRzV2l0aChQbGF0Zm9ybS5wYXRoU2VwYXJhdG9yKSB8fCBwYXRoLmVuZHNXaXRoKCcvJykpKSB7CiAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlIChwYXRoLmxlbmd0aCA+IDEgJiYgcGF0aC5lbmRzV2l0aChQbGF0Zm9ybS5wYXRoU2VwYXJhdG9yKSkgewogICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtIDEpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGF0aDsKICB9CgogIC8vIFRPRE8oYmtvbnlpKTogZmluZCBhIHdheSB0byBkbyB0aGlzIHdpdGggcmF3IHBhdGhzLgogIHN0YXRpYyBTdHJpbmcgX2Vuc3VyZVRyYWlsaW5nUGF0aFNlcGFyYXRvcnMoU3RyaW5nIHBhdGgpIHsKICAgIC8vIERvbid0IGhhbmRsZSBhcmd1bWVudCBlcnJvcnMgaGVyZS4KICAgIGlmIChwYXRoID09IG51bGwpIHJldHVybiBwYXRoOwogICAgaWYgKHBhdGguaXNFbXB0eSkgcGF0aCA9ICcuJzsKICAgIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgICAgd2hpbGUgKCFwYXRoLmVuZHNXaXRoKFBsYXRmb3JtLnBhdGhTZXBhcmF0b3IpICYmICFwYXRoLmVuZHNXaXRoKCcvJykpIHsKICAgICAgICBwYXRoID0gIiRwYXRoJHtQbGF0Zm9ybS5wYXRoU2VwYXJhdG9yfSI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlICghcGF0aC5lbmRzV2l0aChQbGF0Zm9ybS5wYXRoU2VwYXJhdG9yKSkgewogICAgICAgIHBhdGggPSAiJHBhdGgke1BsYXRmb3JtLnBhdGhTZXBhcmF0b3J9IjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhdGg7CiAgfQp9CgovKioKICogQmFzZSBldmVudCBjbGFzcyBlbWl0dGVkIGJ5IFtGaWxlU3lzdGVtRW50aXR5LndhdGNoXS4KICovCmNsYXNzIEZpbGVTeXN0ZW1FdmVudCB7CiAgLyoqCiAgICogQml0ZmllbGQgZm9yIFtGaWxlU3lzdGVtRW50aXR5LndhdGNoXSwgdG8gZW5hYmxlIFtGaWxlU3lzdGVtQ3JlYXRlRXZlbnRdcy4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IGNyZWF0ZSA9IDEgPDwgMDsKICBARGVwcmVjYXRlZCgiVXNlIGNyZWF0ZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IENSRUFURSA9IDEgPDwgMDsKCiAgLyoqCiAgICogQml0ZmllbGQgZm9yIFtGaWxlU3lzdGVtRW50aXR5LndhdGNoXSwgdG8gZW5hYmxlIFtGaWxlU3lzdGVtTW9kaWZ5RXZlbnRdcy4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IG1vZGlmeSA9IDEgPDwgMTsKICBARGVwcmVjYXRlZCgiVXNlIG1vZGlmeSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE1PRElGWSA9IDEgPDwgMTsKCiAgLyoqCiAgICogQml0ZmllbGQgZm9yIFtGaWxlU3lzdGVtRW50aXR5LndhdGNoXSwgdG8gZW5hYmxlIFtGaWxlU3lzdGVtRGVsZXRlRXZlbnRdcy4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IGRlbGV0ZSA9IDEgPDwgMjsKICBARGVwcmVjYXRlZCgiVXNlIGRlbGV0ZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IERFTEVURSA9IDEgPDwgMjsKCiAgLyoqCiAgICogQml0ZmllbGQgZm9yIFtGaWxlU3lzdGVtRW50aXR5LndhdGNoXSwgdG8gZW5hYmxlIFtGaWxlU3lzdGVtTW92ZUV2ZW50XXMuCiAgICovCiAgc3RhdGljIGNvbnN0IGludCBtb3ZlID0gMSA8PCAzOwogIEBEZXByZWNhdGVkKCJVc2UgbW92ZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE1PVkUgPSAxIDw8IDM7CgogIC8qKgogICAqIEJpdGZpZWxkIGZvciBbRmlsZVN5c3RlbUVudGl0eS53YXRjaF0sIGZvciBlbmFibGluZyBhbGwgb2YgW2NyZWF0ZV0sCiAgICogW21vZGlmeV0sIFtkZWxldGVdIGFuZCBbbW92ZV0uCiAgICovCiAgc3RhdGljIGNvbnN0IGludCBhbGwgPSBjcmVhdGUgfCBtb2RpZnkgfCBkZWxldGUgfCBtb3ZlOwogIEBEZXByZWNhdGVkKCJVc2UgYWxsIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgQUxMID0gY3JlYXRlIHwgbW9kaWZ5IHwgZGVsZXRlIHwgbW92ZTsKCiAgc3RhdGljIGNvbnN0IGludCBfbW9kaWZ5QXR0cmlidXRlcyA9IDEgPDwgNDsKICBzdGF0aWMgY29uc3QgaW50IF9kZWxldGVTZWxmID0gMSA8PCA1OwogIHN0YXRpYyBjb25zdCBpbnQgX2lzRGlyID0gMSA8PCA2OwoKICAvKioKICAgKiBUaGUgdHlwZSBvZiBldmVudC4gU2VlIFtGaWxlU3lzdGVtRXZlbnRdIGZvciBhIGxpc3Qgb2YgZXZlbnRzLgogICAqLwogIGZpbmFsIGludCB0eXBlOwoKICAvKioKICAgKiBUaGUgcGF0aCB0aGF0IHRyaWdnZXJlZCB0aGUgZXZlbnQuCiAgICoKICAgKiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIGFuZCB0aGUgRmlsZVN5c3RlbUVudGl0eSwgdGhlIHBhdGggbWF5IGJlCiAgICogcmVsYXRpdmUuCiAgICovCiAgZmluYWwgU3RyaW5nIHBhdGg7CgogIC8qKgogICAqIElzIGB0cnVlYCBpZiB0aGUgZXZlbnQgdGFyZ2V0IHdhcyBhIGRpcmVjdG9yeS4KICAgKgogICAqIE5vdGUgdGhhdCBpZiB0aGUgZmlsZSBoYXMgYmVlbiBkZWxldGVkIGJ5IHRoZSB0aW1lIHRoZSBldmVudCBoYXMgYXJyaXZlZCwKICAgKiB0aGlzIHdpbGwgYWx3YXlzIGJlIGBmYWxzZWAgb24gV2luZG93cy4gSW4gcGFydGljdWxhciwgaXQgd2lsbCBhbHdheXMgYmUKICAgKiBgZmFsc2VgIGZvciBgZGVsZXRlYCBldmVudHMuCiAgICovCiAgZmluYWwgYm9vbCBpc0RpcmVjdG9yeTsKCiAgRmlsZVN5c3RlbUV2ZW50Ll8odGhpcy50eXBlLCB0aGlzLnBhdGgsIHRoaXMuaXNEaXJlY3RvcnkpOwp9CgovKioKICogRmlsZSBzeXN0ZW0gZXZlbnQgZm9yIG5ld2x5IGNyZWF0ZWQgZmlsZSBzeXN0ZW0gb2JqZWN0cy4KICovCmNsYXNzIEZpbGVTeXN0ZW1DcmVhdGVFdmVudCBleHRlbmRzIEZpbGVTeXN0ZW1FdmVudCB7CiAgRmlsZVN5c3RlbUNyZWF0ZUV2ZW50Ll8ocGF0aCwgaXNEaXJlY3RvcnkpCiAgICAgIDogc3VwZXIuXyhGaWxlU3lzdGVtRXZlbnQuY3JlYXRlLCBwYXRoLCBpc0RpcmVjdG9yeSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJGaWxlU3lzdGVtQ3JlYXRlRXZlbnQoJyRwYXRoJykiOwp9CgovKioKICogRmlsZSBzeXN0ZW0gZXZlbnQgZm9yIG1vZGlmaWNhdGlvbnMgb2YgZmlsZSBzeXN0ZW0gb2JqZWN0cy4KICovCmNsYXNzIEZpbGVTeXN0ZW1Nb2RpZnlFdmVudCBleHRlbmRzIEZpbGVTeXN0ZW1FdmVudCB7CiAgLyoqCiAgICogSWYgdGhlIGNvbnRlbnQgd2FzIGNoYW5nZWQgYW5kIG5vdCBvbmx5IHRoZSBhdHRyaWJ1dGVzLCBbY29udGVudENoYW5nZWRdCiAgICogaXMgYHRydWVgLgogICAqLwogIGZpbmFsIGJvb2wgY29udGVudENoYW5nZWQ7CgogIEZpbGVTeXN0ZW1Nb2RpZnlFdmVudC5fKHBhdGgsIGlzRGlyZWN0b3J5LCB0aGlzLmNvbnRlbnRDaGFuZ2VkKQogICAgICA6IHN1cGVyLl8oRmlsZVN5c3RlbUV2ZW50Lm1vZGlmeSwgcGF0aCwgaXNEaXJlY3RvcnkpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAiRmlsZVN5c3RlbU1vZGlmeUV2ZW50KCckcGF0aCcsIGNvbnRlbnRDaGFuZ2VkPSRjb250ZW50Q2hhbmdlZCkiOwp9CgovKioKICogRmlsZSBzeXN0ZW0gZXZlbnQgZm9yIGRlbGV0aW9uIG9mIGZpbGUgc3lzdGVtIG9iamVjdHMuCiAqLwpjbGFzcyBGaWxlU3lzdGVtRGVsZXRlRXZlbnQgZXh0ZW5kcyBGaWxlU3lzdGVtRXZlbnQgewogIEZpbGVTeXN0ZW1EZWxldGVFdmVudC5fKHBhdGgsIGlzRGlyZWN0b3J5KQogICAgICA6IHN1cGVyLl8oRmlsZVN5c3RlbUV2ZW50LmRlbGV0ZSwgcGF0aCwgaXNEaXJlY3RvcnkpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiRmlsZVN5c3RlbURlbGV0ZUV2ZW50KCckcGF0aCcpIjsKfQoKLyoqCiAqIEZpbGUgc3lzdGVtIGV2ZW50IGZvciBtb3Zpbmcgb2YgZmlsZSBzeXN0ZW0gb2JqZWN0cy4KICovCmNsYXNzIEZpbGVTeXN0ZW1Nb3ZlRXZlbnQgZXh0ZW5kcyBGaWxlU3lzdGVtRXZlbnQgewogIC8qKgogICAqIElmIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGlzIGFibGUgdG8gaWRlbnRpZnkgdGhlIGRlc3RpbmF0aW9uIG9mCiAgICogdGhlIG1v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Ly8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvbW1vbl9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBGaWxlU3RhdCB7CiAgQHBhdGNoCiAgc3RhdGljIF9zdGF0U3luYyhfTmFtZXNwYWNlIG5hbWVzcGFjZSwgU3RyaW5nIHBhdGgpIG5hdGl2ZSAiRmlsZV9TdGF0IjsKfQoKQHBhdGNoCmNsYXNzIEZpbGVTeXN0ZW1FbnRpdHkgewogIEBwYXRjaAogIHN0YXRpYyBfZ2V0VHlwZU5hdGl2ZShfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgsCiAgICAgIGJvb2wgZm9sbG93TGlua3MpIG5hdGl2ZSAiRmlsZV9HZXRUeXBlIjsKICBAcGF0Y2gKICBzdGF0aWMgX2lkZW50aWNhbE5hdGl2ZShfTmFtZXNwYWNlIG5hbWVzcGFjZSwgU3RyaW5nIHBhdGgxLCBTdHJpbmcgcGF0aDIpCiAgICAgIG5hdGl2ZSAiRmlsZV9BcmVJZGVudGljYWwiOwogIEBwYXRjaAogIHN0YXRpYyBfcmVzb2x2ZVN5bWJvbGljTGlua3MoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCBwYXRoKQogICAgICBuYXRpdmUgIkZpbGVfUmVzb2x2ZVN5bWJvbGljTGlua3MiOwp9ChoATk48ASABBxEJSgIBBxkJQS8JTCIJRSoCAStkYXJ0OmlvLXBhdGNoL2ZpbGVfc3lzdGVtX2VudGl0eV9wYXRjaC5kYXJ0NG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9pb19yZXNvdXJjZV9pbmZvLmRhcnSh/i8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgphYnN0cmFjdCBjbGFzcyBfSU9SZXNvdXJjZUluZm8gewogIGZpbmFsIFN0cmluZyB0eXBlOwogIGZpbmFsIGludCBpZDsKICBTdHJpbmcgZ2V0IG5hbWU7CiAgc3RhdGljIGludCBfY291bnQgPSAwOwoKICBzdGF0aWMgZmluYWwgU3RvcHdhdGNoIF9zdyA9IG5ldyBTdG9wd2F0Y2goKS4uc3RhcnQoKTsKICBzdGF0aWMgZmluYWwgX3N0YXJ0VGltZSA9IG5ldyBEYXRlVGltZS5ub3coKS5taWxsaXNlY29uZHNTaW5jZUVwb2NoOwoKICBzdGF0aWMgZG91YmxlIGdldCB0aW1lc3RhbXAgPT4gX3N0YXJ0VGltZSArIF9zdy5lbGFwc2VkTWljcm9zZWNvbmRzIC8gMTAwMDsKCiAgX0lPUmVzb3VyY2VJbmZvKHRoaXMudHlwZSkgOiBpZCA9IF9JT1Jlc291cmNlSW5mby5nZXROZXh0SUQoKTsKCiAgLy8vIEdldCB0aGUgZnVsbCBzZXQgb2YgdmFsdWVzIGZvciBhIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLiBUaGlzIGlzIG5vcm1hbGx5CiAgLy8vIGxvb2tlZCB1cCBiYXNlZCBvbiBhbiBpZCBmcm9tIGEgcmVmZXJlbmNlVmFsdWVNYXAuCiAgTWFwPFN0cmluZywgZHluYW1pYz4gZ2V0IGZ1bGxWYWx1ZU1hcDsKCiAgLy8vIFRoZSByZWZlcmVuY2UgbWFwLCB1c2VkIHRvIHJldHVybiBhIGxpc3Qgb2YgdmFsdWVzLCBlLmcuLCBnZXR0aW5nCiAgLy8vIGFsbCBvcGVuIHNvY2tldHMuIFRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBpcyBzaGFyZWQgYW1vbmcgYWxsIHN1YmNsYXNzZXMuCiAgTWFwPFN0cmluZywgZHluYW1pYz4gZ2V0IHJlZmVyZW5jZVZhbHVlTWFwID0+IHsKICAgICAgICAvLyBUaGUgdHlwZSBmb3IgYSByZWZlcmVuY2Ugb2JqZWN0IGlzIHByZWZpeGVkIHdpdGggQCBpbiBvYnNlcnZhdG9yeS4KICAgICAgICAndHlwZSc6ICdAJHR5cGUnLAogICAgICAgICdpZCc6IGlkLAogICAgICAgICduYW1lJzogbmFtZSwKICAgICAgfTsKCiAgc3RhdGljIGludCBnZXROZXh0SUQoKSA9PiBfY291bnQrKzsKfQoKYWJzdHJhY3QgY2xhc3MgX1JlYWRXcml0ZVJlc291cmNlSW5mbyBleHRlbmRzIF9JT1Jlc291cmNlSW5mbyB7CiAgaW50IHRvdGFsUmVhZDsKICBpbnQgdG90YWxXcml0dGVuOwogIGludCByZWFkQ291bnQ7CiAgaW50IHdyaXRlQ291bnQ7CiAgZG91YmxlIGxhc3RSZWFkOwogIGRvdWJsZSBsYXN0V3JpdGU7CgogIC8vIE5vdCBhbGwgY2FsbCBzaXRlcyB1c2UgdGhpcy4gSW4gc29tZSBjYXNlcywgZS5nLiwgYSBzb2NrZXQsIGEgcmVhZCBkb2VzCiAgLy8gbm90IGFsd2F5cyBtZWFuIHRoYXQgd2UgYWN0dWFsbHkgcmVhZCBzb21lIGJ5dGVzICh3ZSBtYXkgZG8gYSByZWFkIHRvIHNlZQogIC8vIGlmIHRoZXJlIGFyZSBzb21lIGJ5dGVzIGF2YWlsYWJsZSkuCiAgdm9pZCBhZGRSZWFkKGludCBieXRlcykgewogICAgdG90YWxSZWFkICs9IGJ5dGVzOwogICAgcmVhZENvdW50Kys7CiAgICBsYXN0UmVhZCA9IF9JT1Jlc291cmNlSW5mby50aW1lc3RhbXA7CiAgfQoKICAvLyBJbiBjYXNlcyB3aGVyZSB3ZSByZWFkIGJ1dCBkaWQgbm90IG5lY2Vzc2FyaWx5IGdldCBhbnkgYnl0ZXMsIHVzZSB0aGlzIHRvCiAgLy8gdXBkYXRlIHRoZSByZWFkQ291bnQgYW5kIHRpbWVzdGFtcC4gTWFudWFsbHkgdXBkYXRlIHRvdGFsUmVhZCBpZiBhbnkgYnl0ZXMKICAvLyB3aGVyZSBhY3R1YWxseSByZWFkLgogIHZvaWQgZGlkUmVhZCgpIHsKICAgIGFkZFJlYWQoMCk7CiAgfQoKICB2b2lkIGFkZFdyaXRlKGludCBieXRlcykgewogICAgdG90YWxXcml0dGVuICs9IGJ5dGVzOwogICAgd3JpdGVDb3VudCsrOwogICAgbGFzdFdyaXRlID0gX0lPUmVzb3VyY2VJbmZvLnRpbWVzdGFtcDsKICB9CgogIF9SZWFkV3JpdGVSZXNvdXJjZUluZm8oU3RyaW5nIHR5cGUpCiAgICAgIDogdG90YWxSZWFkID0gMCwKICAgICAgICB0b3RhbFdyaXR0ZW4gPSAwLAogICAgICAgIHJlYWRDb3VudCA9IDAsCiAgICAgICAgd3JpdGVDb3VudCA9IDAsCiAgICAgICAgbGFzdFJlYWQgPSAwLjAsCiAgICAgICAgbGFzdFdyaXRlID0gMC4wLAogICAgICAgIHN1cGVyKHR5cGUpOwoKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgZnVsbFZhbHVlTWFwID0+IHsKICAgICAgICAndHlwZSc6IHR5cGUsCiAgICAgICAgJ2lkJzogaWQsCiAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICd0b3RhbFJlYWQnOiB0b3RhbFJlYWQsCiAgICAgICAgJ3RvdGFsV3JpdHRlbic6IHRvdGFsV3JpdHRlbiwKICAgICAgICAncmVhZENvdW50JzogcmVhZENvdW50LAogICAgICAgICd3cml0ZUNvdW50Jzogd3JpdGVDb3VudCwKICAgICAgICAnbGFzdFJlYWQnOiBsYXN0UmVhZCwKICAgICAgICAnbGFzdFdyaXRlJzogbGFzdFdyaXRlCiAgICAgIH07Cn0KCmNsYXNzIF9GaWxlUmVzb3VyY2VJbmZvIGV4dGVuZHMgX1JlYWRXcml0ZVJlc291cmNlSW5mbyB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfdHlwZSA9ICdfZmlsZSc7CgogIGZpbmFsIGZpbGU7CgogIHN0YXRpYyBNYXA8aW50LCBfRmlsZVJlc291cmNlSW5mbz4gb3BlbkZpbGVzID0KICAgICAgbmV3IE1hcDxpbnQsIF9GaWxlUmVzb3VyY2VJbmZvPigpOwoKICBfRmlsZVJlc291cmNlSW5mbyh0aGlzLmZpbGUpIDogc3VwZXIoX3R5cGUpIHsKICAgIEZpbGVPcGVuZWQodGhpcyk7CiAgfQoKICBzdGF0aWMgRmlsZU9wZW5lZChfRmlsZVJlc291cmNlSW5mbyBpbmZvKSB7CiAgICBhc3NlcnQoIW9wZW5GaWxlcy5jb250YWluc0tleShpbmZvLmlkKSk7CiAgICBvcGVuRmlsZXNbaW5mby5pZF0gPSBpbmZvOwogIH0KCiAgc3RhdGljIEZpbGVDbG9zZWQoX0ZpbGVSZXNvdXJjZUluZm8gaW5mbykgewogICAgYXNzZXJ0KG9wZW5GaWxlcy5jb250YWluc0tleShpbmZvLmlkKSk7CiAgICBvcGVuRmlsZXMucmVtb3ZlKGluZm8uaWQpOwogIH0KCiAgc3RhdGljIEl0ZXJhYmxlPE1hcDxTdHJpbmcsIGR5bmFtaWM+PiBnZXRPcGVuRmlsZXNMaXN0KCkgewogICAgcmV0dXJuIG5ldyBMaXN0LmZyb20ob3BlbkZpbGVzLnZhbHVlcy5tYXAoKGUpID0+IGUucmVmZXJlbmNlVmFsdWVNYXApKTsKICB9CgogIHN0YXRpYyBGdXR1cmU8U2VydmljZUV4dGVuc2lvblJlc3BvbnNlPiBnZXRPcGVuRmlsZXMoZnVuY3Rpb24sIHBhcmFtcykgewogICAgYXNzZXJ0KGZ1bmN0aW9uID09ICdleHQuZGFydC5pby5nZXRPcGVuRmlsZXMnKTsKICAgIHZhciBkYXRhID0geyd0eXBlJzogJ19vcGVuZmlsZXMnLCAnZGF0YSc6IGdldE9wZW5GaWxlc0xpc3QoKX07CiAgICB2YXIganNvblZhbHVlID0ganNvbi5lbmNvZGUoZGF0YSk7CiAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShuZXcgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLnJlc3VsdChqc29uVmFsdWUpKTsKICB9CgogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGdldEZpbGVJbmZvTWFwKCkgewogICAgcmV0dXJuIGZ1bGxWYWx1ZU1hcDsKICB9CgogIHN0YXRpYyBGdXR1cmU8U2VydmljZUV4dGVuc2lvblJlc3BvbnNlPiBnZXRGaWxlSW5mb01hcEJ5SUQoZnVuY3Rpb24sIHBhcmFtcykgewogICAgYXNzZXJ0KHBhcmFtcy5jb250YWluc0tleSgnaWQnKSk7CiAgICB2YXIgaWQgPSBpbnQucGFyc2UocGFyYW1zWydpZCddKTsKICAgIHZhciByZXN1bHQgPQogICAgICAgIG9wZW5GaWxlcy5jb250YWluc0tleShpZCkgPyBvcGVuRmlsZXNbaWRdLmdldEZpbGVJbmZvTWFwKCkgOiB7fTsKICAgIHZhciBqc29uVmFsdWUgPSBqc29uLmVuY29kZShyZXN1bHQpOwogICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUobmV3IFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5yZXN1bHQoanNvblZhbHVlKSk7CiAgfQoKICBTdHJpbmcgZ2V0IG5hbWUgewogICAgcmV0dXJuICcke2ZpbGUucGF0aH0nOwogIH0KfQoKY2xhc3MgX1Byb2Nlc3NSZXNvdXJjZUluZm8gZXh0ZW5kcyBfSU9SZXNvdXJjZUluZm8gewogIHN0YXRpYyBjb25zdCBTdHJpbmcgX3R5cGUgPSAnX3Byb2Nlc3MnOwogIGZpbmFsIHByb2Nlc3M7CiAgZmluYWwgZG91YmxlIHN0YXJ0ZWRBdDsKCiAgc3RhdGljIE1hcDxpbnQsIF9Qcm9jZXNzUmVzb3VyY2VJbmZvPiBzdGFydGVkUHJvY2Vzc2VzID0KICAgICAgbmV3IE1hcDxpbnQsIF9Qcm9jZXNzUmVzb3VyY2VJbmZvPigpOwoKICBfUHJvY2Vzc1Jlc291cmNlSW5mbyh0aGlzLnByb2Nlc3MpCiAgICAgIDogc3RhcnRlZEF0ID0gX0lPUmVzb3VyY2VJbmZvLnRpbWVzdGFtcCwKICAgICAgICBzdXBlcihfdHlwZSkgewogICAgUHJvY2Vzc1N0YXJ0ZWQodGhpcyk7CiAgfQoKICBTdHJpbmcgZ2V0IG5hbWUgPT4gcHJvY2Vzcy5fcGF0aDsKCiAgdm9pZCBzdG9wcGVkKCkgewogICAgUHJvY2Vzc1N0b3BwZWQodGhpcyk7CiAgfQoKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgZnVsbFZhbHVlTWFwID0+IHsKICAgICAgICAndHlwZSc6IHR5cGUsCiAgICAgICAgJ2lkJzogaWQsCiAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICdwaWQnOiBwcm9jZXNzLnBpZCwKICAgICAgICAnc3RhcnRlZEF0Jzogc3RhcnRlZEF0LAogICAgICAgICdhcmd1bWVudHMnOiBwcm9jZXNzLl9hcmd1bWVudHMsCiAgICAgICAgJ3dvcmtpbmdEaXJlY3RvcnknOgogICAgICAgICAgICBwcm9jZXNzLl93b3JraW5nRGlyZWN0b3J5ID09IG51bGwgPyAnLicgOiBwcm9jZXNzLl93b3JraW5nRGlyZWN0b3J5LAogICAgICB9OwoKICBzdGF0aWMgUHJvY2Vzc1N0YXJ0ZWQoX1Byb2Nlc3NSZXNvdXJjZUluZm8gaW5mbykgewogICAgYXNzZXJ0KCFzdGFydGVkUHJvY2Vzc2VzLmNvbnRhaW5zS2V5KGluZm8uaWQpKTsKICAgIHN0YXJ0ZWRQcm9jZXNzZXNbaW5mby5pZF0gPSBpbmZvOwogIH0KCiAgc3RhdGljIFByb2Nlc3NTdG9wcGVkKF9Qcm9jZXNzUmVzb3VyY2VJbmZvIGluZm8pIHsKICAgIGFzc2VydChzdGFydGVkUHJvY2Vzc2VzLmNvbnRhaW5zS2V5KGluZm8uaWQpKTsKICAgIHN0YXJ0ZWRQcm9jZXNzZXMucmVtb3ZlKGluZm8uaWQpOwogIH0KCiAgc3RhdGljIEl0ZXJhYmxlPE1hcDxTdHJpbmcsIGR5bmFtaWM+PiBnZXRTdGFydGVkUHJvY2Vzc2VzTGlzdCgpID0+CiAgICAgIG5ldyBMaXN0LmZyb20oc3RhcnRlZFByb2Nlc3Nlcy52YWx1ZXMubWFwKChlKSA9PiBlLnJlZmVyZW5jZVZhbHVlTWFwKSk7CgogIHN0YXRpYyBGdXR1cmU8U2VydmljZUV4dGVuc2lvblJlc3BvbnNlPiBnZXRTdGFydGVkUHJvY2Vzc2VzKAogICAgICBTdHJpbmcgZnVuY3Rpb24sIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zKSB7CiAgICBhc3NlcnQoZnVuY3Rpb24gPT0gJ2V4dC5kYXJ0LmlvLmdldFByb2Nlc3NlcycpOwogICAgdmFyIGRhdGEgPSB7J3R5cGUnOiAnX3N0YXJ0ZWRwcm9jZXNzZXMnLCAnZGF0YSc6IGdldFN0YXJ0ZWRQcm9jZXNzZXNMaXN0KCl9OwogICAgdmFyIGpzb25WYWx1ZSA9IGpzb24uZW5jb2RlKGRhdGEpOwogICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUobmV3IFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5yZXN1bHQoanNvblZhbHVlKSk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZT4gZ2V0UHJvY2Vzc0luZm9NYXBCeUlkKAogICAgICBTdHJpbmcgZnVuY3Rpb24sIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zKSB7CiAgICB2YXIgaWQgPSBpbnQucGFyc2UocGFyYW1zWydpZCddKTsKICAgIHZhciByZXN1bHQgPSBzdGFydGVkUHJvY2Vzc2VzLmNvbnRhaW5zS2V5KGlkKQogICAgICAgID8gc3RhcnRlZFByb2Nlc3Nlc1tpZF0uZnVsbFZhbHVlTWFwCiAgICAgICAgOiB7fTsKICAgIHZhciBqc29uVmFsdWUgPSBqc29uLmVuY29kZShyZXN1bHQpOwogICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUobmV3IFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5yZXN1bHQoanNvblZhbHVlKSk7CiAgfQp9CgpjbGFzcyBfU29ja2V0UmVzb3VyY2VJbmZvIGV4dGVuZHMgX1JlYWRXcml0ZVJlc291cmNlSW5mbyB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfdGNwU3RyaW5nID0gJ1RDUCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfdWRwU3RyaW5nID0gJ1VEUCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfdHlwZSA9ICdfc29ja2V0JzsKCiAgZmluYWwgLypfTmF0aXZlU29ja2V0fCovIHNvY2tldDsKCiAgc3RhdGljIE1hcDxpbnQsIF9Tb2NrZXRSZXNvdXJjZUluZm8+IG9wZW5Tb2NrZXRzID0KICAgICAgbmV3IE1hcDxpbnQsIF9Tb2NrZXRSZXNvdXJjZUluZm8+KCk7CgogIF9Tb2NrZXRSZXNvdXJjZUluZm8odGhpcy5zb2NrZXQpIDogc3VwZXIoX3R5cGUpIHsKICAgIFNvY2tldE9wZW5lZCh0aGlzKTsKICB9CgogIFN0cmluZyBnZXQgbmFtZSB7CiAgICBpZiAoc29ja2V0LmlzTGlzdGVuaW5nKSB7CiAgICAgIHJldHVybiAnbGlzdGVuaW5nOiR7c29ja2V0LmFkZHJlc3MuaG9zdH06JHtzb2NrZXQucG9ydH0nOwogICAgfQogICAgdmFyIHJlbW90ZSA9ICcnOwogICAgdHJ5IHsKICAgICAgdmFyIHJlbW90ZUhvc3QgPSBzb2NrZXQucmVtb3RlQWRkcmVzcy5ob3N0OwogICAgICB2YXIgcmVtb3RlUG9ydCA9IHNvY2tldC5yZW1vdGVQb3J0OwogICAgICByZW1vdGUgPSAnIC0+ICRyZW1vdGVIb3N0OiRyZW1vdGVQb3J0JzsKICAgIH0gY2F0Y2ggKGUpIHt9IC8vIGlnbm9yZWQgaWYgd2UgY2FuJ3QgZ2V0IHRoZSBpbmZvcm1hdGlvbgogICAgcmV0dXJuICcke3NvY2tldC5hZGRyZXNzLmhvc3R9OiR7c29ja2V0LnBvcnR9JHJlbW90ZSc7CiAgfQoKICBzdGF0aWMgSXRlcmFibGU8TWFwPFN0cmluZywgZHluYW1pYz4+IGdldE9wZW5Tb2NrZXRzTGlzdCgpIHsKICAgIHJldHVybiBuZXcgTGlzdC5mcm9tKG9wZW5Tb2NrZXRzLnZhbHVlcy5tYXAoKGUpID0+IGUucmVmZXJlbmNlVmFsdWVNYXApKTsKICB9CgogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGdldFNvY2tldEluZm9NYXAoKSB7CiAgICB2YXIgcmVzdWx0ID0gZnVsbFZhbHVlTWFwOwogICAgcmVzdWx0Wydzb2NrZXRUeXBlJ10gPSBzb2NrZXQuaXNUY3AgPyBfdGNwU3RyaW5nIDogX3VkcFN0cmluZzsKICAgIHJlc3VsdFsnbGlzdGVuaW5nJ10gPSBzb2NrZXQuaXNMaXN0ZW5pbmc7CiAgICByZXN1bHRbJ2hvc3QnXSA9IHNvY2tldC5hZGRyZXNzLmhvc3Q7CiAgICByZXN1bHRbJ3BvcnQnXSA9IHNvY2tldC5wb3J0OwogICAgaWYgKCFzb2NrZXQuaXNMaXN0ZW5pbmcpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXN1bHRbJ3JlbW90ZUhvc3QnXSA9IHNvY2tldC5yZW1vdGVBZGRyZXNzLmhvc3Q7CiAgICAgICAgcmVzdWx0WydyZW1vdGVQb3J0J10gPSBzb2NrZXQucmVtb3RlUG9ydDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIC8vIFVEUC4KICAgICAgICByZXN1bHRbJ3JlbW90ZVBvcnQnXSA9ICdOQSc7CiAgICAgICAgcmVzdWx0WydyZW1vdGVIb3N0J10gPSAnTkEnOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXN1bHRbJ3JlbW90ZVBvcnQnXSA9ICdOQSc7CiAgICAgIHJlc3VsdFsncmVtb3RlSG9zdCddID0gJ05BJzsKICAgIH0KICAgIHJlc3VsdFsnYWRkcmVzc1R5cGUnXSA9IHNvY2tldC5hZGRyZXNzLnR5cGUubmFtZTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgRnV0dXJlPFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZT4gZ2V0U29ja2V0SW5mb01hcEJ5SUQoCiAgICAgIFN0cmluZyBmdW5jdGlvbiwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMpIHsKICAgIGFzc2VydChwYXJhbXMuY29udGFpbnNLZXkoJ2lkJykpOwogICAgdmFyIGlkID0gaW50LnBhcnNlKHBhcmFtc1snaWQnXSk7CiAgICB2YXIgcmVzdWx0ID0KICAgICAgICBvcGVuU29ja2V0cy5jb250YWluc0tleShpZCkgPyBvcGVuU29ja2V0c1tpZF0uZ2V0U29ja2V0SW5mb01hcCgpIDoge307CiAgICB2YXIganNvblZhbHVlID0ganNvbi5lbmNvZGUocmVzdWx0KTsKICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKG5ldyBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UucmVzdWx0KGpzb25WYWx1ZSkpOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2U+IGdldE9wZW5Tb2NrZXRzKGZ1bmN0aW9uLCBwYXJhbXMpIHsKICAgIGFzc2VydChmdW5jdGlvbiA9PSAnZXh0LmRhcnQuaW8uZ2V0T3BlblNvY2tldHMnKTsKICAgIHZhciBkYXRhID0geyd0eXBlJzogJ19vcGVuc29ja2V0cycsICdkYXRhJzogZ2V0T3BlblNvY2tldHNMaXN0KCl9OwogICAgdmFyIGpzb25WYWx1ZSA9IGpzb24uZW5jb2RlKGRhdGEpOwogICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUobmV3IFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5yZXN1bHQoanNvblZhbHVlKSk7CiAgfQoKICBzdGF0aWMgU29ja2V0T3BlbmVkKF9Tb2NrZXRSZXNvdXJjZUluZm8gaW5mbykgewogICAgYXNzZXJ0KCFvcGVuU29ja2V0cy5jb250YWluc0tleShpbmZvLmlkKSk7CiAgICBvcGVuU29ja2V0c1tpbmZvLmlkXSA9IGluZm87CiAgfQoKICBzdGF0aWMgU29ja2V0Q2xvc2VkKF9Tb2NrZXRSZXNvdXJjZUluZm8gaW5mbykgewogICAgYXNzZXJ0KG9wZW5Tb2NrZXRzLmNvbnRhaW5zS2V5KGluZm8uaWQpKTsKICAgIG9wZW5Tb2NrZXRzLnJlbW92ZShpbmZvLmlkKTsKICB9Cn0KgRwATk48AREBIRUQExkBOUcBTgFBAVE5KQFITjJOGhIWCQEmAgFAERQREhMUAU1PKRwYESoEAU9QGhMQBAEdGxIrBAEmFxoXGBgZFQEtFhIWICYgIh4fCQIBOScBDgExKQEwFgQBLi0fBAEuLB8EAT1MBAFLNEMnTQQBKhkEAVEmJhFJKU0EARQbBAIBNSoRGgE7LAElLxcaBAEkARMaBAEtFhIWHCApHFEJATU0JgQBNTMmBAFFTgE/NTRRJ00EAUE1JjIsDilNBAIBOyoqKQEjATUrATQYBAEUHkAGFQoyKi4+OwQBP04EASwfQy4qIh8MOjIUECUlCA0jIwY2EwQBQDUmJhFPKU0EAU02RydNBAEyLyEEATIuIQQCAR1kYXJ0OmlvL2lvX3Jlc291cmNlX2luZm8uZGFydCtvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vaW9fc2luay5kYXJ0pF8vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKLyoqCiAqIEEgY29tYmluZWQgYnl0ZSBhbmQgdGV4dCBvdXRwdXQuCiAqCiAqIEFuIFtJT1NpbmtdIGNvbWJpbmVzIGEgW1N0cmVhbVNpbmtdIG9mIGJ5dGVzIHdpdGggYSBbU3RyaW5nU2lua10sCiAqIGFuZCBhbGxvd3MgZWFzeSBvdXRwdXQgb2YgYm90aCBieXRlcyBhbmQgdGV4dC4KICoKICogV3JpdGluZyB0ZXh0IChbd3JpdGVdKSBhbmQgYWRkaW5nIGJ5dGVzIChbYWRkXSkgbWF5IGJlIGludGVybGVhdmVkIGZyZWVseS4KICoKICogV2hpbGUgYSBzdHJlYW0gaXMgYmVpbmcgYWRkZWQgdXNpbmcgW2FkZFN0cmVhbV0sIGFueSBmdXJ0aGVyIGF0dGVtcHRzCiAqIHRvIGFkZCBvciB3cml0ZSB0byB0aGUgW0lPU2lua10gd2lsbCBmYWlsIHVudGlsIHRoZSBbYWRkU3RyZWFtXSBjb21wbGV0ZXMuCiAqCiAqIEl0IGlzIGFuIGVycm9yIHRvIGFkZCBkYXRhIHRvIHRoZSBbSU9TaW5rXSBhZnRlciB0aGUgc2luayBpcyBjbG9zZWQuCiAqLwphYnN0cmFjdCBjbGFzcyBJT1NpbmsgaW1wbGVtZW50cyBTdHJlYW1TaW5rPExpc3Q8aW50Pj4sIFN0cmluZ1NpbmsgewogIC8qKgogICAqIENyZWF0ZSBhbiBbSU9TaW5rXSB0aGF0IG91dHB1dHMgdG8gYSBbdGFyZ2V0XSBbU3RyZWFtQ29uc3VtZXJdIG9mIGJ5dGVzLgogICAqCiAgICogVGV4dCB3cml0dGVuIHRvIFtTdHJlYW1TaW5rXSBtZXRob2RzIGlzIGVuY29kZWQgdG8gYnl0ZXMgdXNpbmcgW2VuY29kaW5nXQogICAqIGJlZm9yZSBiZWluZyBvdXRwdXQgb24gW3RhcmdldF0uCiAgICovCiAgZmFjdG9yeSBJT1NpbmsoU3RyZWFtQ29uc3VtZXI8TGlzdDxpbnQ+PiB0YXJnZXQsIHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pID0+CiAgICAgIG5ldyBfSU9TaW5rSW1wbCh0YXJnZXQsIGVuY29kaW5nKTsKCiAgLyoqCiAgICogVGhlIFtFbmNvZGluZ10gdXNlZCB3aGVuIHdyaXRpbmcgc3RyaW5ncy4gRGVwZW5kaW5nIG9uIHRoZQogICAqIHVuZGVybHlpbmcgY29uc3VtZXIgdGhpcyBwcm9wZXJ0eSBtaWdodCBiZSBtdXRhYmxlLgogICAqLwogIEVuY29kaW5nIGVuY29kaW5nOwoKICAvKioKICAgKiBBZGRzIGJ5dGUgW2RhdGFdIHRvIHRoZSB0YXJnZXQgY29uc3VtZXIsIGlnbm9yaW5nIFtlbmNvZGluZ10uCiAgICoKICAgKiBUaGUgW2VuY29kaW5nXSBkb2VzIG5vdCBhcHBseSB0byB0aGlzIG1ldGhvZCwgYW5kIHRoZSBgZGF0YWAgbGlzdCBpcyBwYXNzZWQKICAgKiBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGNvbnN1bWVyIGFzIGEgc3RyZWFtIGV2ZW50LgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBjdXJyZW50bHkgYmVpbmcgYWRkZWQKICAgKiB1c2luZyBbYWRkU3RyZWFtXS4KICAgKgogICAqIFRoaXMgb3BlcmF0aW9uIGlzIG5vbi1ibG9ja2luZy4gU2VlIFtmbHVzaF0gb3IgW2RvbmVdIGZvciBob3cgdG8gZ2V0IGFueQogICAqIGVycm9ycyBnZW5lcmF0ZWQgYnkgdGhpcyBjYWxsLgogICAqCiAgICogVGhlIGRhdGEgbGlzdCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGFmdGVyIGl0IGhhcyBiZWVuIHBhc3NlZCB0byBgYWRkYC4KICAgKi8KICB2b2lkIGFkZChMaXN0PGludD4gZGF0YSk7CgogIC8qKgogICAqIENvbnZlcnRzIFtvYmpdIHRvIGEgU3RyaW5nIGJ5IGludm9raW5nIFtPYmplY3QudG9TdHJpbmddIGFuZAogICAqIFthZGRdcyB0aGUgZW5jb2Rpbmcgb2YgdGhlIHJlc3VsdCB0byB0aGUgdGFyZ2V0IGNvbnN1bWVyLgogICAqCiAgICogVGhpcyBvcGVyYXRpb24gaXMgbm9uLWJsb2NraW5nLiBTZWUgW2ZsdXNoXSBvciBbZG9uZV0gZm9yIGhvdyB0byBnZXQgYW55CiAgICogZXJyb3JzIGdlbmVyYXRlZCBieSB0aGlzIGNhbGwuCiAgICovCiAgdm9pZCB3cml0ZShPYmplY3Qgb2JqKTsKCiAgLyoqCiAgICogSXRlcmF0ZXMgb3ZlciB0aGUgZ2l2ZW4gW29iamVjdHNdIGFuZCBbd3JpdGVdcyB0aGVtIGluIHNlcXVlbmNlLgogICAqCiAgICogSWYgW3NlcGFyYXRvcl0gaXMgcHJvdmlkZWQsIGEgYHdyaXRlYCB3aXRoIHRoZSBgc2VwYXJhdG9yYCBpcyBwZXJmb3JtZWQKICAgKiBiZXR3ZWVuIGFueSB0d28gZWxlbWVudHMgb2Ygb2JqZWN0c2AuCiAgICoKICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBub24tYmxvY2tpbmcuIFNlZSBbZmx1c2hdIG9yIFtkb25lXSBmb3IgaG93IHRvIGdldCBhbnkKICAgKiBlcnJvcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgY2FsbC4KICAgKi8KICB2b2lkIHdyaXRlQWxsKEl0ZXJhYmxlIG9iamVjdHMsIFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKTsKCiAgLyoqCiAgICogQ29udmVydHMgW29ial0gdG8gYSBTdHJpbmcgYnkgaW52b2tpbmcgW09iamVjdC50b1N0cmluZ10gYW5kCiAgICogd3JpdGVzIHRoZSByZXN1bHQgdG8gYHRoaXNgLCBmb2xsb3dlZCBieSBhIG5ld2xpbmUuCiAgICoKICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBub24tYmxvY2tpbmcuIFNlZSBbZmx1c2hdIG9yIFtkb25lXSBmb3IgaG93IHRvIGdldCBhbnkKICAgKiBlcnJvcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgY2FsbC4KICAgKi8KICB2b2lkIHdyaXRlbG4oW09iamVjdCBvYmogPSAiIl0pOwoKICAvKioKICAgKiBXcml0ZXMgdGhlIGNoYXJhY3RlciBvZiBbY2hhckNvZGVdLgogICAqCiAgICogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgd3JpdGUobmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpKWAuCiAgICoKICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBub24tYmxvY2tpbmcuIFNlZSBbZmx1c2hdIG9yIFtkb25lXSBmb3IgaG93IHRvIGdldCBhbnkKICAgKiBlcnJvcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgY2FsbC4KICAgKi8KICB2b2lkIHdyaXRlQ2hhckNvZGUoaW50IGNoYXJDb2RlKTsKCiAgLyoqCiAgICogUGFzc2VzIHRoZSBlcnJvciB0byB0aGUgdGFyZ2V0IGNvbnN1bWVyIGFzIGFuIGVycm9yIGV2ZW50LgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBjdXJyZW50bHkgYmVpbmcgYWRkZWQKICAgKiB1c2luZyBbYWRkU3RyZWFtXS4KICAgKgogICAqIFRoaXMgb3BlcmF0aW9uIGlzIG5vbi1ibG9ja2luZy4gU2VlIFtmbHVzaF0gb3IgW2RvbmVdIGZvciBob3cgdG8gZ2V0IGFueQogICAqIGVycm9ycyBnZW5lcmF0ZWQgYnkgdGhpcyBjYWxsLgogICAqLwogIHZvaWQgYWRkRXJyb3IoZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKTsKCiAgLyoqCiAgICogQWRkcyBhbGwgZWxlbWVudHMgb2YgdGhlIGdpdmVuIFtzdHJlYW1dIHRvIGB0aGlzYC4KICAgKgogICAqIFJldHVybnMgYSBbRnV0dXJlXSB0aGF0IGNvbXBsZXRlcyB3aGVuCiAgICogYWxsIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBbc3RyZWFtXSBhcmUgYWRkZWQgdG8gYHRoaXNgLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBjdXJyZW50bHkgYmVpbmcgYWRkZWQKICAgKiB1c2luZyB0aGlzIGZ1bmN0aW9uLgogICAqLwogIEZ1dHVyZSBhZGRTdHJlYW0oU3RyZWFtPExpc3Q8aW50Pj4gc3RyZWFtKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIFtGdXR1cmVdIHRoYXQgY29tcGxldGVzIG9uY2UgYWxsIGJ1ZmZlcmVkIGRhdGEgaXMgYWNjZXB0ZWQgYnkgdGhlCiAgICogdW5kZXJseWluZyBbU3RyZWFtQ29uc3VtZXJdLgogICAqCiAgICogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgY2FsbGVkIHdoaWxlIGFuIFthZGRTdHJlYW1dIGlzIGluY29tcGxldGUuCiAgICoKICAgKiBOT1RFOiBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgZGF0YSBiZWluZyBmbHVzaGVkIGJ5IHRoZQogICAqIG9wZXJhdGluZyBzeXN0ZW0uCiAgICovCiAgRnV0dXJlIGZsdXNoKCk7CgogIC8qKgogICAqIENsb3NlIHRoZSB0YXJnZXQgY29uc3VtZXIuCiAgICoKICAgKiBOT1RFOiBXcml0ZXMgdG8gdGhlIFtJT1NpbmtdIG1heSBiZSBidWZmZXJlZCwgYW5kIG1heSBub3QgYmUgZmx1c2hlZCBieQogICAqIGEgY2FsbCB0byBgY2xvc2UoKWAuIFRvIGZsdXNoIGFsbCBidWZmZXJlZCB3cml0ZXMsIGNhbGwgYGZsdXNoKClgIGJlZm9yZQogICAqIGNhbGxpbmcgYGNsb3NlKClgLgogICAqLwogIEZ1dHVyZSBjbG9zZSgpOwoKICAvKioKICAgKiBHZXQgYSBmdXR1cmUgdGhhdCB3aWxsIGNvbXBsZXRlIHdoZW4gdGhlIGNvbnN1bWVyIGNsb3Nlcywgb3Igd2hlbiBhbgogICAqIGVycm9yIG9jY3Vycy4gVGhpcyBmdXR1cmUgaXMgaWRlbnRpY2FsIHRvIHRoZSBmdXR1cmUgcmV0dXJuZWQgYnkKICAgKiBbY2xvc2VdLgogICAqLwogIEZ1dHVyZSBnZXQgZG9uZTsKfQoKY2xhc3MgX1N0cmVhbVNpbmtJbXBsPFQ+IGltcGxlbWVudHMgU3RyZWFtU2luazxUPiB7CiAgZmluYWwgU3RyZWFtQ29uc3VtZXI8VD4gX3RhcmdldDsKICBmaW5hbCBDb21wbGV0ZXIgX2RvbmVDb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CiAgU3RyZWFtQ29udHJvbGxlcjxUPiBfY29udHJvbGxlckluc3RhbmNlOwogIENvbXBsZXRlciBfY29udHJvbGxlckNvbXBsZXRlcjsKICBib29sIF9pc0Nsb3NlZCA9IGZhbHNlOwogIGJvb2wgX2lzQm91bmQgPSBmYWxzZTsKICBib29sIF9oYXNFcnJvciA9IGZhbHNlOwoKICBfU3RyZWFtU2lua0ltcGwodGhpcy5fdGFyZ2V0KTsKCiAgdm9pZCBhZGQoVCBkYXRhKSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoIlN0cmVhbVNpbmsgaXMgY2xvc2VkIik7CiAgICB9CiAgICBfY29udHJvbGxlci5hZGQoZGF0YSk7CiAgfQoKICB2b2lkIGFkZEVycm9yKGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgaWYgKF9pc0Nsb3NlZCkgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCJTdHJlYW1TaW5rIGlzIGNsb3NlZCIpOwogICAgfQogICAgX2NvbnRyb2xsZXIuYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgRnV0dXJlIGFkZFN0cmVhbShTdHJlYW08VD4gc3RyZWFtKSB7CiAgICBpZiAoX2lzQm91bmQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlN0cmVhbVNpbmsgaXMgYWxyZWFkeSBib3VuZCB0byBhIHN0cmVhbSIpOwogICAgfQogICAgaWYgKF9oYXNFcnJvcikgcmV0dXJuIGRvbmU7CgogICAgX2lzQm91bmQgPSB0cnVlOwogICAgdmFyIGZ1dHVyZSA9IF9jb250cm9sbGVyQ29tcGxldGVyID09IG51bGwKICAgICAgICA/IF90YXJnZXQuYWRkU3RyZWFtKHN0cmVhbSkKICAgICAgICA6IF9jb250cm9sbGVyQ29tcGxldGVyLmZ1dHVyZS50aGVuKChfKSA9PiBfdGFyZ2V0LmFkZFN0cmVhbShzdHJlYW0pKTsKICAgIF9jb250cm9sbGVySW5zdGFuY2U/LmNsb3NlKCk7CgogICAgLy8gV2FpdCBmb3IgYW55IHBlbmRpbmcgZXZlbnRzIGluIFtfY29udHJvbGxlcl0gdG8gYmUgZGlzcGF0Y2hlZCBiZWZvcmUKICAgIC8vIGFkZGluZyBbc3RyZWFtXS4KICAgIHJldHVybiBmdXR1cmUud2hlbkNvbXBsZXRlKCgpIHsKICAgICAgX2lzQm91bmQgPSBmYWxzZTsKICAgIH0pOwogIH0KCiAgRnV0dXJlIGZsdXNoKCkgewogICAgaWYgKF9pc0JvdW5kKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJTdHJlYW1TaW5rIGlzIGJvdW5kIHRvIGEgc3RyZWFtIik7CiAgICB9CiAgICBpZiAoX2NvbnRyb2xsZXJJbnN0YW5jZSA9PSBudWxsKSByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZSh0aGlzKTsKICAgIC8vIEFkZGluZyBhbiBlbXB0eSBzdHJlYW0tY29udHJvbGxlciB3aWxsIHJldHVybiBhIGZ1dHVyZSB0aGF0IHdpbGwgY29tcGxldGUKICAgIC8vIHdoZW4gYWxsIGRhdGEgaXMgZG9uZS4KICAgIF9pc0JvdW5kID0gdHJ1ZTsKICAgIHZhciBmdXR1cmUgPSBfY29udHJvbGxlckNvbXBsZXRlci5mdXR1cmU7CiAgICBfY29udHJvbGxlckluc3RhbmNlLmNsb3NlKCk7CiAgICByZXR1cm4gZnV0dXJlLndoZW5Db21wbGV0ZSgoKSB7CiAgICAgIF9pc0JvdW5kID0gZmFsc2U7CiAgICB9KTsKICB9CgogIEZ1dHVyZSBjbG9zZSgpIHsKICAgIGlmIChfaXNCb3VuZCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiU3RyZWFtU2luayBpcyBib3VuZCB0byBhIHN0cmVhbSIpOwogICAgfQogICAgaWYgKCFfaXNDbG9zZWQpIHsKICAgICAgX2lzQ2xvc2VkID0gdHJ1ZTsKICAgICAgaWYgKF9jb250cm9sbGVySW5zdGFuY2UgIT0gbnVsbCkgewogICAgICAgIF9jb250cm9sbGVySW5zdGFuY2UuY2xvc2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfY2xvc2VUYXJnZXQoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRvbmU7CiAgfQoKICB2b2lkIF9jbG9zZVRhcmdldCgpIHsKICAgIF90YXJnZXQuY2xvc2UoKS50aGVuKF9jb21wbGV0ZURvbmVWYWx1ZSwgb25FcnJvcjogX2NvbXBsZXRlRG9uZUVycm9yKTsKICB9CgogIEZ1dHVyZSBnZXQgZG9uZSA9PiBfZG9uZUNvbXBsZXRlci5mdXR1cmU7CgogIHZvaWQgX2NvbXBsZXRlRG9uZVZhbHVlKHZhbHVlKSB7CiAgICBpZiAoIV9kb25lQ29tcGxldGVyLmlzQ29tcGxldGVkKSB7CiAgICAgIF9kb25lQ29tcGxldGVyLmNvbXBsZXRlKHZhbHVlKTsKICAgIH0KICB9CgogIHZvaWQgX2NvbXBsZXRlRG9uZUVycm9yKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIGlmICghX2RvbmVDb21wbGV0ZXIuaXNDb21wbGV0ZWQpIHsKICAgICAgX2hhc0Vycm9yID0gdHJ1ZTsKICAgICAgX2RvbmVDb21wbGV0ZXIuY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICB9CiAgfQoKICBTdHJlYW1Db250cm9sbGVyPFQ+IGdldCBfY29udHJvbGxlciB7CiAgICBpZiAoX2lzQm91bmQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlN0cmVhbVNpbmsgaXMgYm91bmQgdG8gYSBzdHJlYW0iKTsKICAgIH0KICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlN0cmVhbVNpbmsgaXMgY2xvc2VkIik7CiAgICB9CiAgICBpZiAoX2NvbnRyb2xsZXJJbnN0YW5jZSA9PSBudWxsKSB7CiAgICAgIF9jb250cm9sbGVySW5zdGFuY2UgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxUPihzeW5jOiB0cnVlKTsKICAgICAgX2NvbnRyb2xsZXJDb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CiAgICAgIF90YXJnZXQuYWRkU3RyZWFtKF9jb250cm9sbGVyLnN0cmVhbSkudGhlbigoXykgewogICAgICAgIGlmIChfaXNCb3VuZCkgewogICAgICAgICAgLy8gQSBuZXcgc3RyZWFtIHRha2VzIG92ZXIgLSBmb3J3YXJkIHZhbHVlcyB0byB0aGF0IHN0cmVhbS4KICAgICAgICAgIF9jb250cm9sbGVyQ29tcGxldGVyLmNvbXBsZXRlKHRoaXMpOwogICAgICAgICAgX2NvbnRyb2xsZXJDb21wbGV0ZXIgPSBudWxsOwogICAgICAgICAgX2NvbnRyb2xsZXJJbnN0YW5jZSA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE5vIG5ldyBzdHJlYW0sIC5jbG9zZSB3YXMgY2FsbGVkLiBDbG9zZSBfdGFyZ2V0LgogICAgICAgICAgX2Nsb3NlVGFyZ2V0KCk7CiAgICAgICAgfQogICAgICB9LCBvbkVycm9yOiAoZXJyb3IsIHN0YWNrVHJhY2UpIHsKICAgICAgICBpZiAoX2lzQm91bmQpIHsKICAgICAgICAgIC8vIEEgbmV3IHN0cmVhbSB0YWtlcyBvdmVyIC0gZm9yd2FyZCBlcnJvcnMgdG8gdGhhdCBzdHJlYW0uCiAgICAgICAgICBfY29udHJvbGxlckNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgICAgIF9jb250cm9sbGVyQ29tcGxldGVyID0gbnVsbDsKICAgICAgICAgIF9jb250cm9sbGVySW5zdGFuY2UgPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBObyBuZXcgc3RyZWFtLiBObyBuZWVkIHRvIGNsb3NlIHRhcmdldCwgYXMgaXQgaGFzIGFscmVhZHkKICAgICAgICAgIC8vIGZhaWxlZC4KICAgICAgICAgIF9jb21wbGV0ZURvbmVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBfY29udHJvbGxlckluc3RhbmNlOwogIH0KfQoKY2xhc3MgX0lPU2lua0ltcGwgZXh0ZW5kcyBfU3RyZWFtU2lua0ltcGw8TGlzdDxpbnQ+PiBpbXBsZW1lbnRzIElPU2luayB7CiAgRW5jb2RpbmcgX2VuY29kaW5nOwogIGJvb2wgX2VuY29kaW5nTXV0YWJsZSA9IHRydWU7CgogIF9JT1NpbmtJbXBsKFN0cmVhbUNvbnN1bWVyPExpc3Q8aW50Pj4gdGFyZ2V0LCB0aGlzLl9lbmNvZGluZykgOiBzdXBlcih0YXJnZXQpOwoKICBFbmNvZGluZyBnZXQgZW5jb2RpbmcgPT4gX2VuY29kaW5nOwoKICB2b2lkIHNldCBlbmNvZGluZyhFbmNvZGluZyB2YWx1ZSkgewogICAgaWYgKCFfZW5jb2RpbmdNdXRhYmxlKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJJT1NpbmsgZW5jb2RpbmcgaXMgbm90IG11dGFibGUiKTsKICAgIH0KICAgIF9lbmNvZGluZyA9IHZhbHVlOwogIH0KCiAgdm9pZCB3cml0ZShPYmplY3Qgb2JqKSB7CiAgICBTdHJpbmcgc3RyaW5nID0gJyRvYmonOwogICAgaWYgKHN0cmluZy5pc0VtcHR5KSByZXR1cm47CiAgICBhZGQoX2VuY29kaW5nLmVuY29kZShzdHJpbmcpKTsKICB9CgogIHZvaWQgd3JpdGVBbGwoSXRlcmFibGUgb2JqZWN0cywgW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pIHsKICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gb2JqZWN0cy5pdGVyYXRvcjsKICAgIGlmICghaXRlcmF0b3IubW92ZU5leHQoKSkgcmV0dXJuOwogICAgaWYgKHNlcGFyYXRvci5pc0VtcHR5KSB7CiAgICAgIGRvIHsKICAgICAgICB3cml0ZShpdGVyYXRvci5jdXJyZW50KTsKICAgICAgfSB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZShpdGVyYXRvci5jdXJyZW50KTsKICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICB3cml0ZShzZXBhcmF0b3IpOwogICAgICAgIHdyaXRlKGl0ZXJhdG9yLmN1cnJlbnQpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlbG4oW09iamVjdCBvYmplY3QgPSAiIl0pIHsKICAgIHdyaXRlKG9iamVjdCk7CiAgICB3cml0ZSgiXG4iKTsKICB9CgogIHZvaWQgd3JpdGVDaGFyQ29kZShpbnQgY2hhckNvZGUpIHsKICAgIHdyaXRlKG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKSk7CiAgfQp9CoE+AE5OPAERAQQkA0UyA04DSU4DSARFBk4FTyYGUSkBBkA5BhUBBkMFUTgFTRgFTiQFTQYcAQZCPwVOJAYaAQZGBU0rBU4kBjwBBkI5BU4kBiMBBikFTgVOJAYkAQZABU0YBU4kBjEBBjgFLD0FTRoGLgEGUSIFSAVNFwYSAQYgBU1OGAYSAQZKRg4GEwIBNCM0KyIaGRoBIQEVFTAGGwQBMhUwBi0EAScURwYgARUuJE4iAUwYJBgIBAETFD8GRFEeFS4hJBgIBAETFD8GFhgpJQ8YCAYRBAEYSwQBLAEjJyYGBAE6Jxg3BgQBKBQ/BhU0BidBLjcYRi8nJhE+GgooGEZBJyYRRxUxCgoGIAQCAUkWIAFRASYBJh0+BhcEARscICMEAT0qJh0LISUNHyQaIQgGBAEnExEEASUuBAIBFGRhcnQ6aW8vaW9fc2luay5kYXJ0Lm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9pb19zZXJ2aWNlLmRhcnSIJy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgpjbGFzcyBfSU9TZXJ2aWNlIHsKICAvLyBUaGlzIGxpc3QgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgbGlzdCBpbiBydW50aW1lL2Jpbi9pb19zZXJ2aWNlLmgKICBzdGF0aWMgY29uc3QgaW50IGZpbGVFeGlzdHMgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZUNyZWF0ZSA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlRGVsZXRlID0gMjsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVSZW5hbWUgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZUNvcHkgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZU9wZW4gPSA1OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVJlc29sdmVTeW1ib2xpY0xpbmtzID0gNjsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVDbG9zZSA9IDc7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlUG9zaXRpb24gPSA4OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVNldFBvc2l0aW9uID0gOTsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVUcnVuY2F0ZSA9IDEwOwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZUxlbmd0aCA9IDExOwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZUxlbmd0aEZyb21QYXRoID0gMTI7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlTGFzdEFjY2Vzc2VkID0gMTM7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlU2V0TGFzdEFjY2Vzc2VkID0gMTQ7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlTGFzdE1vZGlmaWVkID0gMTU7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlU2V0TGFzdE1vZGlmaWVkID0gMTY7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlRmx1c2ggPSAxNzsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVSZWFkQnl0ZSA9IDE4OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVdyaXRlQnl0ZSA9IDE5OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVJlYWQgPSAyMDsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVSZWFkSW50byA9IDIxOwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVdyaXRlRnJvbSA9IDIyOwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZUNyZWF0ZUxpbmsgPSAyMzsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVEZWxldGVMaW5rID0gMjQ7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlUmVuYW1lTGluayA9IDI1OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZUxpbmtUYXJnZXQgPSAyNjsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVUeXBlID0gMjc7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlSWRlbnRpY2FsID0gMjg7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlU3RhdCA9IDI5OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZUxvY2sgPSAzMDsKICBzdGF0aWMgY29uc3QgaW50IHNvY2tldExvb2t1cCA9IDMxOwogIHN0YXRpYyBjb25zdCBpbnQgc29ja2V0TGlzdEludGVyZmFjZXMgPSAzMjsKICBzdGF0aWMgY29uc3QgaW50IHNvY2tldFJldmVyc2VMb29rdXAgPSAzMzsKICBzdGF0aWMgY29uc3QgaW50IGRpcmVjdG9yeUNyZWF0ZSA9IDM0OwogIHN0YXRpYyBjb25zdCBpbnQgZGlyZWN0b3J5RGVsZXRlID0gMzU7CiAgc3RhdGljIGNvbnN0IGludCBkaXJlY3RvcnlFeGlzdHMgPSAzNjsKICBzdGF0aWMgY29uc3QgaW50IGRpcmVjdG9yeUNyZWF0ZVRlbXAgPSAzNzsKICBzdGF0aWMgY29uc3QgaW50IGRpcmVjdG9yeUxpc3RTdGFydCA9IDM4OwogIHN0YXRpYyBjb25zdCBpbnQgZGlyZWN0b3J5TGlzdE5leHQgPSAzOTsKICBzdGF0aWMgY29uc3QgaW50IGRpcmVjdG9yeUxpc3RTdG9wID0gNDA7CiAgc3RhdGljIGNvbnN0IGludCBkaXJlY3RvcnlSZW5hbWUgPSA0MTsKICBzdGF0aWMgY29uc3QgaW50IHNzbFByb2Nlc3NGaWx0ZXIgPSA0MjsKCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZSBfZGlzcGF0Y2goaW50IHJlcXVlc3QsIExpc3QgZGF0YSk7Cn0KOABOTjwBEQETTiMjIyMhITEiJSgmJCwqLSotIyYnIiYnKCgoKCInIiImLi0pKSktLCsrKSoBPAIBF2RhcnQ6aW8vaW9fc2VydmljZS5kYXJ0KG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9saW5rLmRhcnSoIy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgovKioKICogW0xpbmtdIG9iamVjdHMgYXJlIHJlZmVyZW5jZXMgdG8gZmlsZXN5c3RlbSBsaW5rcy4KICoKICovCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKYWJzdHJhY3QgY2xhc3MgTGluayBpbXBsZW1lbnRzIEZpbGVTeXN0ZW1FbnRpdHkgewogIC8qKgogICAqIENyZWF0ZXMgYSBMaW5rIG9iamVjdC4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZmFjdG9yeSBMaW5rKFN0cmluZyBwYXRoKSB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgX0xpbmsocGF0aCk7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLmNyZWF0ZUxpbmsocGF0aCk7CiAgfQoKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZmFjdG9yeSBMaW5rLmZyb21SYXdQYXRoKFVpbnQ4TGlzdCByYXdQYXRoKSB7CiAgICAvLyBUT0RPKGJrb255aSk6IGhhbmRsZSBvdmVycmlkZXMKICAgIHJldHVybiBuZXcgX0xpbmsuZnJvbVJhd1BhdGgocmF3UGF0aCk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgW0xpbmtdIG9iamVjdC4KICAgKgogICAqIElmIFtwYXRoXSBpcyBhIHJlbGF0aXZlIHBhdGgsIGl0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlCiAgICogY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAoc2VlIFtEaXJlY3RvcnkuY3VycmVudF0pLCB3aGVuIHVzZWQuCiAgICoKICAgKiBJZiBbcGF0aF0gaXMgYW4gYWJzb2x1dGUgcGF0aCwgaXQgd2lsbCBiZSBpbW11bmUgdG8gY2hhbmdlcyB0byB0aGUKICAgKiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgogICAqLwogIGZhY3RvcnkgTGluay5mcm9tVXJpKFVyaSB1cmkpID0+IG5ldyBMaW5rKHVyaS50b0ZpbGVQYXRoKCkpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgc3ltYm9saWMgbGluay4gUmV0dXJucyBhIFs6RnV0dXJlPExpbms+Ol0gdGhhdCBjb21wbGV0ZXMgd2l0aAogICAqIHRoZSBsaW5rIHdoZW4gaXQgaGFzIGJlZW4gY3JlYXRlZC4gSWYgdGhlIGxpbmsgZXhpc3RzLAogICAqIHRoZSBmdXR1cmUgd2lsbCBjb21wbGV0ZSB3aXRoIGFuIGVycm9yLgogICAqCiAgICogSWYgW3JlY3Vyc2l2ZV0gaXMgZmFsc2UsIHRoZSBkZWZhdWx0LCB0aGUgbGluayBpcyBjcmVhdGVkCiAgICogb25seSBpZiBhbGwgZGlyZWN0b3JpZXMgaW4gaXRzIHBhdGggZXhpc3QuCiAgICogSWYgW3JlY3Vyc2l2ZV0gaXMgdHJ1ZSwgYWxsIG5vbi1leGlzdGluZyBwYXRoCiAgICogY29tcG9uZW50cyBhcmUgY3JlYXRlZC4gVGhlIGRpcmVjdG9yaWVzIGluIHRoZSBwYXRoIG9mIFt0YXJnZXRdIGFyZQogICAqIG5vdCBhZmZlY3RlZCwgdW5sZXNzIHRoZXkgYXJlIGFsc28gaW4gW3BhdGhdLgogICAqCiAgICogT24gdGhlIFdpbmRvd3MgcGxhdGZvcm0sIHRoaXMgY2FsbCB3aWxsIGNyZWF0ZSBhIHRydWUgc3ltYm9saWMgbGluawogICAqIGluc3RlYWQgb2YgYSBKdW5jdGlvbi4gSW4gb3JkZXIgdG8gY3JlYXRlIGEgc3ltYm9saWMgbGluayBvbiBXaW5kb3dzLCBEYXJ0CiAgICogbXVzdCBiZSBydW4gaW4gQWRtaW5pc3RyYXRvciBtb2RlIG9yIHRoZSBzeXN0ZW0gbXVzdCBoYXZlIERldmVsb3BlciBNb2RlCiAgICogZW5hYmxlZCwgb3RoZXJ3aXNlIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIHdpbGwgYmUgcmFpc2VkIHdpdGggCiAgICogYEVSUk9SX1BSSVZJTEVHRV9OT1RfSEVMRGAgc2V0IGFzIHRoZSBlcnJubyB3aGVuIHRoaXMgY2FsbCBpcyBtYWRlLgogICAqCiAgICogT24gb3RoZXIgcGxhdGZvcm1zLCB0aGUgcG9zaXggc3ltbGluaygpIGNhbGwgaXMgdXNlZCB0byBtYWtlIGEgc3ltYm9saWMKICAgKiBsaW5rIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBbdGFyZ2V0XS4gIElmIFt0YXJnZXRdIGlzIGEgcmVsYXRpdmUgcGF0aCwKICAgKiBpdCB3aWxsIGJlIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbGluay4KICAgKi8KICBGdXR1cmU8TGluaz4gY3JlYXRlKFN0cmluZyB0YXJnZXQsIHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBjcmVhdGUgdGhlIGxpbmsuIENhbGxpbmcgW2NyZWF0ZVN5bmNdIG9uIGFuIGV4aXN0aW5nIGxpbmsKICAgKiB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KICAgKgogICAqIElmIFtyZWN1cnNpdmVdIGlzIGZhbHNlLCB0aGUgZGVmYXVsdCwgdGhlIGxpbmsgaXMgY3JlYXRlZCBvbmx5IGlmIGFsbAogICAqIGRpcmVjdG9yaWVzIGluIGl0cyBwYXRoIGV4aXN0LiBJZiBbcmVjdXJzaXZlXSBpcyB0cnVlLCBhbGwKICAgKiBub24tZXhpc3RpbmcgcGF0aCBjb21wb25lbnRzIGFyZSBjcmVhdGVkLiBUaGUgZGlyZWN0b3JpZXMgaW4KICAgKiB0aGUgcGF0aCBvZiBbdGFyZ2V0XSBhcmUgbm90IGFmZmVjdGVkLCB1bmxlc3MgdGhleSBhcmUgYWxzbyBpbiBbcGF0aF0uCiAgICoKICAgKiBPbiB0aGUgV2luZG93cyBwbGF0Zm9ybSwgdGhpcyBjYWxsIHdpbGwgY3JlYXRlIGEgdHJ1ZSBzeW1ib2xpYyBsaW5rCiAgICogaW5zdGVhZCBvZiBhIEp1bmN0aW9uLiBJbiBvcmRlciB0byBjcmVhdGUgYSBzeW1ib2xpYyBsaW5rIG9uIFdpbmRvd3MsIERhcnQKICAgKiBtdXN0IGJlIHJ1biBpbiBBZG1pbmlzdHJhdG9yIG1vZGUgb3IgdGhlIHN5c3RlbSBtdXN0IGhhdmUgRGV2ZWxvcGVyIE1vZGUKICAgKiBlbmFibGVkLCBvdGhlcndpc2UgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gd2lsbCBiZSByYWlzZWQgd2l0aCAKICAgKiBgRVJST1JfUFJJVklMRUdFX05PVF9IRUxEYCBzZXQgYXMgdGhlIGVycm5vIHdoZW4gdGhpcyBjYWxsIGlzIG1hZGUuCiAgICoKICAgKiBPbiBvdGhlciBwbGF0Zm9ybXMsIHRoZSBwb3NpeCBzeW1saW5rKCkgY2FsbCBpcyB1c2VkIHRvIG1ha2UgYSBzeW1ib2xpYwogICAqIGxpbmsgY29udGFpbmluZyB0aGUgc3RyaW5nIFt0YXJnZXRdLiAgSWYgW3RhcmdldF0gaXMgYSByZWxhdGl2ZSBwYXRoLAogICAqIGl0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBsaW5rLgogICAqLwogIHZvaWQgY3JlYXRlU3luYyhTdHJpbmcgdGFyZ2V0LCB7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgdXBkYXRlcyB0aGUgbGluay4gQ2FsbGluZyBbdXBkYXRlU3luY10gb24gYSBub24tZXhpc3RpbmcgbGluawogICAqIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgogICAqLwogIHZvaWQgdXBkYXRlU3luYyhTdHJpbmcgdGFyZ2V0KTsKCiAgLyoqCiAgICogVXBkYXRlcyB0aGUgbGluay4gUmV0dXJucyBhIFs6RnV0dXJlPExpbms+Ol0gdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGUKICAgKiBsaW5rIHdoZW4gaXQgaGFzIGJlZW4gdXBkYXRlZC4gIENhbGxpbmcgW3VwZGF0ZV0gb24gYSBub24tZXhpc3RpbmcgbGluawogICAqIHdpbGwgY29tcGxldGUgaXRzIHJldHVybmVkIGZ1dHVyZSB3aXRoIGFuIGV4Y2VwdGlvbi4KICAgKi8KICBGdXR1cmU8TGluaz4gdXBkYXRlKFN0cmluZyB0YXJnZXQpOwoKICBGdXR1cmU8U3RyaW5nPiByZXNvbHZlU3ltYm9saWNMaW5rcygpOwoKICBTdHJpbmcgcmVzb2x2ZVN5bWJvbGljTGlua3NTeW5jKCk7CgogIC8qKgogICAqIFJlbmFtZXMgdGhpcyBsaW5rLiBSZXR1cm5zIGEgYEZ1dHVyZTxMaW5rPmAgdGhhdCBjb21wbGV0ZXMKICAgKiB3aXRoIGEgW0xpbmtdIGluc3RhbmNlIGZvciB0aGUgcmVuYW1lZCBsaW5rLgogICAqCiAgICogSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgbGluaywgdGhhdCBsaW5rIGlzCiAgICogcmVwbGFjZWQuIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5LAogICAqIHRoZSBvcGVyYXRpb24gZmFpbHMgYW5kIHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXhjZXB0aW9uLgogICAqLwogIEZ1dHVyZTxMaW5rPiByZW5hbWUoU3RyaW5nIG5ld1BhdGgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHJlbmFtZXMgdGhpcyBsaW5rLiBSZXR1cm5zIGEgW0xpbmtdCiAgICogaW5zdGFuY2UgZm9yIHRoZSByZW5hbWVkIGxpbmsuCiAgICoKICAgKiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBsaW5rLCB0aGF0IGxpbmsgaXMKICAgKiByZXBsYWNlZC4gSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnkKICAgKiB0aGUgb3BlcmF0aW9uIGZhaWxzIGFuZCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAqLwogIExpbmsgcmVuYW1lU3luYyhTdHJpbmcgbmV3UGF0aCk7CgogIC8qKgogICAqIFJldHVybnMgYSBbTGlua10gaW5zdGFuY2Ugd2hvc2UgcGF0aCBpcyB0aGUgYWJzb2x1dGUgcGF0aCB0byBbdGhpc10uCiAgICoKICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBpcyBjb21wdXRlZCBieSBwcmVmaXhpbmcKICAgKiBhIHJlbGF0aXZlIHBhdGggd2l0aCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIHJldHVybmluZwogICAqIGFuIGFic29sdXRlIHBhdGggdW5jaGFuZ2VkLgogICAqLwogIExpbmsgZ2V0IGFic29sdXRlOwoKICAvKioKICAgKiBHZXRzIHRoZSB0YXJnZXQgb2YgdGhlIGxpbmsuIFJldHVybnMgYSBmdXR1cmUgdGhhdCBjb21wbGV0ZXMgd2l0aAogICAqIHRoZSBwYXRoIHRvIHRoZSB0YXJnZXQuCiAgICoKICAgKiBJZiB0aGUgcmV0dXJuZWQgdGFyZ2V0IGlzIGEgcmVsYXRpdmUgcGF0aCwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlCiAgICogZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGxpbmsuCiAgICoKICAgKiBJZiB0aGUgbGluayBkb2VzIG5vdCBleGlzdCwgb3IgaXMgbm90IGEgbGluaywgdGhlIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aAogICAqIGEgRmlsZVN5c3RlbUV4Y2VwdGlvbi4KICAgKi8KICBGdXR1cmU8U3RyaW5nPiB0YXJnZXQoKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBnZXRzIHRoZSB0YXJnZXQgb2YgdGhlIGxpbmsuIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHRhcmdldC4KICAgKgogICAqIElmIHRoZSByZXR1cm5lZCB0YXJnZXQgaXMgYSByZWxhdGl2ZSBwYXRoLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUKICAgKiBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbGluay4KICAgKgogICAqIElmIHRoZSBsaW5rIGRvZXMgbm90IGV4aXN0LCBvciBpcyBub3QgYSBsaW5rLCB0aHJvd3MgYSBGaWxlU3lzdGVtRXhjZXB0aW9uLgogICAqLwogIFN0cmluZyB0YXJnZXRTeW5jKCk7Cn0KCmNsYXNzIF9MaW5rIGV4dGVuZHMgRmlsZVN5c3RlbUVudGl0eSBpbXBsZW1lbnRzIExpbmsgewogIFN0cmluZyBfcGF0aDsKICBVaW50OExpc3QgX3Jhd1BhdGg7CgogIF9MaW5rKFN0cmluZyBwYXRoKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChwYXRoLCAncGF0aCcpOwogICAgX3BhdGggPSBwYXRoOwogICAgX3Jhd1BhdGggPSBGaWxlU3lzdGVtRW50aXR5Ll90b1V0ZjhBcnJheShwYXRoKTsKICB9CgogIF9MaW5rLmZyb21SYXdQYXRoKFVpbnQ4TGlzdCByYXdQYXRoKSB7CiAgICBfcmF3UGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RvTnVsbFRlcm1pbmF0ZWRVdGY4QXJyYXkocmF3UGF0aCk7CiAgICBfcGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RvU3RyaW5nRnJvbVV0ZjhBcnJheShyYXdQYXRoKTsKICB9CgogIFN0cmluZyBnZXQgcGF0aCA9PiBfcGF0aDsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkxpbms6ICckcGF0aCciOwoKICBGdXR1cmU8Ym9vbD4gZXhpc3RzKCkgPT4gRmlsZVN5c3RlbUVudGl0eS5faXNMaW5rUmF3KF9yYXdQYXRoKTsKCiAgYm9vbCBleGlzdHNTeW5jKCkgPT4gRmlsZVN5c3RlbUVudGl0eS5faXNMaW5rUmF3U3luYyhfcmF3UGF0aCk7CgogIExpbmsgZ2V0IGFic29sdXRlID0+IG5ldyBMaW5rLmZyb21SYXdQYXRoKF9yYXdBYnNvbHV0ZVBhdGgpOwoKICBGdXR1cmU8TGluaz4gY3JlYXRlKFN0cmluZyB0YXJnZXQsIHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KSB7CiAgICB2YXIgcmVzdWx0ID0KICAgICAgICByZWN1cnNpdmUgPyBwYXJlbnQuY3JlYXRlKHJlY3Vyc2l2ZTogdHJ1ZSkgOiBuZXcgRnV0dXJlLnZhbHVlKG51bGwpOwogICAgcmV0dXJuIHJlc3VsdAogICAgICAgIC50aGVuKChfKSA9PiBfRmlsZS5fZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgICAgICBfSU9TZXJ2aWNlLmZpbGVDcmVhdGVMaW5rLCBbbnVsbCwgX3Jhd1BhdGgsIHRhcmdldF0pKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNhbm5vdCBjcmVhdGUgbGluayB0byB0YXJnZXQgJyR0YXJnZXQnIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICB9CgogIHZvaWQgY3JlYXRlU3luYyhTdHJpbmcgdGFyZ2V0LCB7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSkgewogICAgaWYgKHJlY3Vyc2l2ZSkgewogICAgICBwYXJlbnQuY3JlYXRlU3luYyhyZWN1cnNpdmU6IHRydWUpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9GaWxlLl9jcmVhdGVMaW5rKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgsIHRhcmdldCk7CiAgICB0aHJvd0lmRXJyb3IocmVzdWx0LCAiQ2Fubm90IGNyZWF0ZSBsaW5rIiwgcGF0aCk7CiAgfQoKICB2b2lkIHVwZGF0ZVN5bmMoU3RyaW5nIHRhcmdldCkgewogICAgLy8gVE9ETygxMjQxNCk6IFJlcGxhY2Ugd2l0aCBhdG9taWMgdXBkYXRlLCB3aGVyZSBzdXBwb3J0ZWQgYnkgcGxhdGZvcm0uCiAgICAvLyBBdG9taWNhbGx5IGNoYW5naW5nIGEgbGluayBjYW4gYmUgZG9uZSBieSBjcmVhdGluZyB0aGUgbmV3IGxpbmssIHdpdGgKICAgIC8vIGEgZGlmZmVyZW50IG5hbWUsIGFuZCB1c2luZyB0aGUgcmVuYW1lKCkgcG9zaXggY2FsbCB0byBtb3ZlIGl0IHRvCiAgICAvLyB0aGUgb2xkIG5hbWUgYXRvbWljYWxseS4KICAgIGRlbGV0ZVN5bmMoKTsKICAgIGNyZWF0ZVN5bmModGFyZ2V0KTsKICB9CgogIEZ1dHVyZTxMaW5rPiB1cGRhdGUoU3RyaW5nIHRhcmdldCkgewogICAgLy8gVE9ETygxMjQxNCk6IFJlcGxhY2Ugd2l0aCBhdG9taWMgdXBkYXRlLCB3aGVyZSBzdXBwb3J0ZWQgYnkgcGxhdGZvcm0uCiAgICAvLyBBdG9taWNhbGx5IGNoYW5naW5nIGEgbGluayBjYW4gYmUgZG9uZSBieSBjcmVhdGluZyB0aGUgbmV3IGxpbmssIHdpdGgKICAgIC8vIGEgZGlmZmVyZW50IG5hbWUsIGFuZCB1c2luZyB0aGUgcmVuYW1lKCkgcG9zaXggY2FsbCB0byBtb3ZlIGl0IHRvCiAgICAvLyB0aGUgb2xkIG5hbWUgYXRvbWljYWxseS4KICAgIHJldHVybiBkZWxldGUoKS50aGVuPExpbms+KChfKSA9PiBjcmVhdGUodGFyZ2V0KSk7CiAgfQoKICBGdXR1cmU8TGluaz4gX2RlbGV0ZSh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSkgewogICAgaWYgKHJlY3Vyc2l2ZSkgewogICAgICByZXR1cm4gbmV3IERpcmVjdG9yeS5mcm9tUmF3UGF0aChfcmF3UGF0aCkKICAgICAgICAgIC5kZWxldGUocmVjdXJzaXZlOiB0cnVlKQogICAgICAgICAgLnRoZW4oKF8pID0+IHRoaXMpOwogICAgfQogICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoCiAgICAgICAgX0lPU2VydmljZS5maWxlRGVsZXRlTGluaywgW251bGwsIF9yYXdQYXRoXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgIkNhbm5vdCBkZWxldGUgbGluayIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICB2b2lkIF9kZWxldGVTeW5jKHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KSB7CiAgICBpZiAocmVjdXJzaXZlKSB7CiAgICAgIHJldHVybiBuZXcgRGlyZWN0b3J5LmZyb21SYXdQYXRoKF9yYXdQYXRoKS5kZWxldGVTeW5jKHJlY3Vyc2l2ZTogdHJ1ZSk7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX0ZpbGUuX2RlbGV0ZUxpbmtOYXRpdmUoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCk7CiAgICB0aHJvd0lmRXJyb3IocmVzdWx0LCAiQ2Fubm90IGRlbGV0ZSBsaW5rIiwgcGF0aCk7CiAgfQoKICBGdXR1cmU8TGluaz4gcmVuYW1lKFN0cmluZyBuZXdQYXRoKSB7CiAgICByZXR1cm4gX0ZpbGUuX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICBfSU9TZXJ2aWNlLmZpbGVSZW5hbWVMaW5rLCBbbnVsbCwgX3Jhd1BhdGgsIG5ld1BhdGhdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNhbm5vdCByZW5hbWUgbGluayB0byAnJG5ld1BhdGgnIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBMaW5rKG5ld1BhdGgpOwogICAgfSk7CiAgfQoKICBMaW5rIHJlbmFtZVN5bmMoU3RyaW5nIG5ld1BhdGgpIHsKICAgIHZhciByZXN1bHQgPSBfRmlsZS5fcmVuYW1lTGluayhfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoLCBuZXdQYXRoKTsKICAgIHRocm93SWZFcnJvcihyZXN1bHQsICJDYW5ub3QgcmVuYW1lIGxpbmsgJyRwYXRoJyB0byAnJG5ld1BhdGgnIik7CiAgICByZXR1cm4gbmV3IExpbmsobmV3UGF0aCk7CiAgfQoKICBGdXR1cmU8U3RyaW5nPiB0YXJnZXQoKSB7CiAgICByZXR1cm4gX0ZpbGUuX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICBfSU9TZXJ2aWNlLmZpbGVMaW5rVGFyZ2V0LCBbbnVsbCwgX3Jhd1BhdGhdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNhbm5vdCBnZXQgdGFyZ2V0IG9mIGxpbmsiLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9KTsKICB9CgogIFN0cmluZyB0YXJnZXRTeW5jKCkgewogICAgdmFyIHJlc3VsdCA9IF9GaWxlLl9saW5rVGFyZ2V0KF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgdGhyb3dJZkVycm9yKHJlc3VsdCwgIkNhbm5vdCByZWFkIGxpbmsiLCBwYXRoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgdGhyb3dJZkVycm9yKE9iamVjdCByZXN1bHQsIFN0cmluZyBtc2csIFtTdHJpbmcgcGF0aCA9ICIiXSkgewogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKG1zZywgcGF0aCwgcmVzdWx0KTsKICAgIH0KICB9CgogIGJvb2wgX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkgewogICAgcmV0dXJuIHJlc3BvbnNlIGlzIExpc3QgJiYgcmVzcG9uc2VbMF0gIT0gX3N1Y2Nlc3NSZXNwb25zZTsKICB9CgogIF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcGF0aCkgewogICAgYXNzZXJ0KF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKTsKICAgIHN3aXRjaCAocmVzcG9uc2VbX2Vycm9yUmVzcG9uc2VFcnJvclR5cGVdKSB7CiAgICAgIGNhc2UgX2lsbGVnYWxBcmd1bWVudFJlc3BvbnNlOgogICAgICAgIHJldHVybiBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgICBjYXNlIF9vc0Vycm9yUmVzcG9uc2U6CiAgICAgICAgdmFyIGVyciA9IG5ldyBPU0Vycm9yKHJlc3BvbnNlW19vc0Vycm9yUmVzcG9uc2VNZXNzYWdlXSwKICAgICAgICAgICAgcmVzcG9uc2VbX29zRXJyb3JSZXNwb25zZUVycm9yQ29kZV0pOwogICAgICAgIHJldHVybiBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbihtZXNzYWdlLCBwYXRoLCBlcnIpOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBuZXcgRXhjZXB0aW9uKCJVbmtub3duIGVycm9yIik7CiAgICB9CiAgfQp9CoEuAE5OPAERAQQ2AwQaMgYcBhweNx0eBicEARwwJisEAQYeBUpFBUggBj8BBk08LQU/MDNJMwVJUE5FSQVNS0sGPwEGTR4FS0BCTAVJUE5FSQVNS0sGOwEGUR4GIgEGSk06BiYBKQElAQZAMgU8RkUGJwEGNyQFPEU1BiMBBkoFMEchBhUBBkcdBUYkBU0cBhsBBlAFRiQFUQYXAgE3EBYBFy4SNAQBKUU+BAEcASgBQgFCAT8BQBFNEjNCGygmRwgTCAQBPBUqBk02BAEjTU1JIBIYBAEnTU1JIDcEATIVMSMeBilHKEwIEwgEAS4VTgZLNgQBKClQKCZBCCAIBAEkTkYeBAEcKUcoJjoIFwgEARhFNBMEAUcdOAYEASRABAFCKDElJB1BMjwPLwYEAgERZGFydDppby9saW5rLmRhcnQyb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL25hbWVzcGFjZV9pbXBsLmRhcnSEfi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgovLyBFYWNoIElzb2xhdGUgbWF5IHJ1biBpbiBhIGRpZmZlcmVudCAibmFtZXNwYWNlIiwgd2hpY2ggcHJvdmlkZXMgdGhlIHNjb3BlIGluCi8vIHdoaWNoIGZpbGUgcGF0aHMgYXJlIHJlc29sdmVkLgphYnN0cmFjdCBjbGFzcyBfTmFtZXNwYWNlIHsKICAvLyBUaGlzIGdldHRlciBkb2VzIG5vdCBpbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSB1bmRlcmx5aW5nIG5hdGl2ZQogIC8vIG9iamVjdC4gSXQgY2Fubm90IGJlIHBhc3NlZCBpbiBhIGRpc3BhdGNoIG1lc3NhZ2UgdG8gdGhlIElPU2VydmljZSB0aHJlYWQuCiAgZXh0ZXJuYWwgc3RhdGljIF9OYW1lc3BhY2UgZ2V0IF9uYW1lc3BhY2U7CgogIC8vIFRoaXMgZ2V0dGVyIGRvZXMgaW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgdW5kZXJseWluZyBuYXRpdmUKICAvLyBvYmplY3QuIEl0IG11c3QgYmUgcGFzc2VkIGluIGEgZGlzcGF0Y2ggbWVzc2FnZSB0byB0aGUgSU9TZXJ2aWNlIHRocmVhZC4KICBleHRlcm5hbCBzdGF0aWMgaW50IGdldCBfbmFtZXNwYWNlUG9pbnRlcjsKCiAgLy8gVGhpcyBzZXRzIHVwIHRoZSBJc29sYXRlJ3MgbmFtZXNwYWNlLiBJdCBzaG91bGQgYmUgc2V0IHVwIGJ5IHRoZSBlbWJlZGRlci4KICAvLyBJZiBpdCBpcyBub3Qgc2V0IHVwIGJ5IHRoZSBlbWJlZGRlciwgcmVsYXRpdmUgcGF0aHMgd2lsbCBiZSByZXNvbHZlZAogIC8vIHJlbGF0aXZlIHRvIHRoZSBwcm9jZXNzJ3MgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBhbmQgYWJzb2x1dGUgcGF0aHMgd2lsbAogIC8vIGJlIGxlZnQgcmVsYXRpdmUgdG8gdGhlIGZpbGUgc3lzdGVtIHJvb3QuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGV4dGVybmFsIHN0YXRpYyB2b2lkIF9zZXR1cE5hbWVzcGFjZSh2YXIgbmFtZXNwYWNlKTsKfQoaAE5OPAERAVAiHFBQLQFMTi0BUEpRLxw3AgEbZGFydDppby9uYW1lc3BhY2VfaW1wbC5kYXJ0LW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9vdmVycmlkZXMuZGFydLqlLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCmZpbmFsIF9pb092ZXJyaWRlc1Rva2VuID0gbmV3IE9iamVjdCgpOwoKY29uc3QgX2FzeW5jUnVuWm9uZWQgPSBydW5ab25lZDsKCi8vLyBUaGlzIGNsYXNzIGZhY2lsaXRhdGVzIG92ZXJyaWRpbmcgdmFyaW91cyBBUElzIG9mIGRhcnQ6aW8gd2l0aCBtb2NrCi8vLyBpbXBsZW1lbnRhdGlvbnMuCi8vLwovLy8gVGhpcyBhYnN0cmFjdCBiYXNlIGNsYXNzIHNob3VsZCBiZSBleHRlbmRlZCB3aXRoIG92ZXJyaWRlcyBmb3IgdGhlCi8vLyBvcGVyYXRpb25zIG5lZWRlZCB0byBjb25zdHJ1Y3QgbW9ja3MuIFRoZSBpbXBsZW1lbnRhdGlvbnMgaW4gdGhpcyBiYXNlIGNsYXNzCi8vLyBkZWZhdWx0IHRvIHRoZSBhY3R1YWwgZGFydDppbyBpbXBsZW1lbnRhdGlvbi4gRm9yIGV4YW1wbGU6Ci8vLwovLy8gYGBgCi8vLyBjbGFzcyBNeURpcmVjdG9yeSBpbXBsZW1lbnRzIERpcmVjdG9yeSB7Ci8vLyAgIC4uLgovLy8gICAvLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRGlyZWN0b3J5IGludGVyZmFjZQovLy8gICAuLi4KLy8vIH0KLy8vCi8vLyBtYWluKCkgewovLy8gICBJT092ZXJyaWRlcy5ydW5ab25lZCgoKSB7Ci8vLyAgICAgLi4uCi8vLyAgICAgLy8gT3BlcmF0aW9ucyB3aWxsIHVzZSBNeURpcmVjdG9yeSBpbnN0ZWFkIG9mIGRhcnQ6aW8ncyBEaXJlY3RvcnkKLy8vICAgICAvLyBpbXBsZW1lbnRhdGlvbiB3aGVuZXZlciBEaXJlY3RvcnkgaXMgdXNlZC4KLy8vICAgICAuLi4KLy8vICAgfSwgY3JlYXRlRGlyZWN0b3J5OiAoU3RyaW5nIHBhdGgpID0+IG5ldyBNeURpcmVjdG9yeShwYXRoKSk7Ci8vLyB9Ci8vLyBgYGAKYWJzdHJhY3QgY2xhc3MgSU9PdmVycmlkZXMgewogIHN0YXRpYyBJT092ZXJyaWRlcyBfZ2xvYmFsOwoKICBzdGF0aWMgSU9PdmVycmlkZXMgZ2V0IGN1cnJlbnQgewogICAgcmV0dXJuIFpvbmUuY3VycmVudFtfaW9PdmVycmlkZXNUb2tlbl0gPz8gX2dsb2JhbDsKICB9CgogIC8vLyBUaGUgW0lPT3ZlcnJpZGVzXSB0byB1c2UgaW4gdGhlIHJvb3QgW1pvbmVdLgogIC8vLwogIC8vLyBUaGVzZSBhcmUgdGhlIFtJT092ZXJyaWRlc10gdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHJvb3QgWm9uZSwgYW5kIGluCiAgLy8vIFpvbmUncyB0aGF0IGRvIG5vdCBzZXQgW0lPT3ZlcnJpZGVzXSBhbmQgd2hvc2UgYW5jZXN0b3JzIHVwIHRvIHRoZSByb290CiAgLy8vIFpvbmUgZG8gbm90IHNldCBbSU9PdmVycmlkZXNdLgogIHN0YXRpYyBzZXQgZ2xvYmFsKElPT3ZlcnJpZGVzIG92ZXJyaWRlcykgewogICAgX2dsb2JhbCA9IG92ZXJyaWRlczsKICB9CgogIC8vLyBSdW5zIFtib2R5XSBpbiBhIGZyZXNoIFtab25lXSB1c2luZyB0aGUgcHJvdmlkZWQgb3ZlcnJpZGVzLgogIC8vLwogIC8vLyBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBvZiBJT092ZXJyaWRlcyBmb3IKICAvLy8gaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB0aGUgb3B0aW9uYWwgYXJndW1lbnRzIGRvLgogIHN0YXRpYyBSIHJ1blpvbmVkPFI+KFIgYm9keSgpLAogICAgICB7CiAgICAgIC8vIERpcmVjdG9yeQogICAgICBEaXJlY3RvcnkgRnVuY3Rpb24oU3RyaW5nKSBjcmVhdGVEaXJlY3RvcnksCiAgICAgIERpcmVjdG9yeSBGdW5jdGlvbigpIGdldEN1cnJlbnREaXJlY3RvcnksCiAgICAgIHZvaWQgRnVuY3Rpb24oU3RyaW5nKSBzZXRDdXJyZW50RGlyZWN0b3J5LAogICAgICBEaXJlY3RvcnkgRnVuY3Rpb24oKSBnZXRTeXN0ZW1UZW1wRGlyZWN0b3J5LAoKICAgICAgLy8gRmlsZQogICAgICBGaWxlIEZ1bmN0aW9uKFN0cmluZykgY3JlYXRlRmlsZSwKCiAgICAgIC8vIEZpbGVTdGF0CiAgICAgIEZ1dHVyZTxGaWxlU3RhdD4gRnVuY3Rpb24oU3RyaW5nKSBzdGF0LAogICAgICBGaWxlU3RhdCBGdW5jdGlvbihTdHJpbmcpIHN0YXRTeW5jLAoKICAgICAgLy8gRmlsZVN5c3RlbUVudGl0eQogICAgICBGdXR1cmU8Ym9vbD4gRnVuY3Rpb24oU3RyaW5nLCBTdHJpbmcpIGZzZUlkZW50aWNhbCwKICAgICAgYm9vbCBGdW5jdGlvbihTdHJpbmcsIFN0cmluZykgZnNlSWRlbnRpY2FsU3luYywKICAgICAgRnV0dXJlPEZpbGVTeXN0ZW1FbnRpdHlUeXBlPiBGdW5jdGlvbihTdHJpbmcsIGJvb2wpIGZzZUdldFR5cGUsCiAgICAgIEZpbGVTeXN0ZW1FbnRpdHlUeXBlIEZ1bmN0aW9uKFN0cmluZywgYm9vbCkgZnNlR2V0VHlwZVN5bmMsCgogICAgICAvLyBfRmlsZVN5c3RlbVdhdGNoZXIKICAgICAgU3RyZWFtPEZpbGVTeXN0ZW1FdmVudD4gRnVuY3Rpb24oU3RyaW5nLCBpbnQsIGJvb2wpIGZzV2F0Y2gsCiAgICAgIGJvb2wgRnVuY3Rpb24oKSBmc1dhdGNoSXNTdXBwb3J0ZWQsCgogICAgICAvLyBMaW5rCiAgICAgIExpbmsgRnVuY3Rpb24oU3RyaW5nKSBjcmVhdGVMaW5rLAoKICAgICAgLy8gU29ja2V0CiAgICAgIEZ1dHVyZTxTb2NrZXQ+IEZ1bmN0aW9uKGR5bmFtaWMsIGludCwKICAgICAgICAgICAgICB7ZHluYW1pYyBzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0fSkKICAgICAgICAgIHNvY2tldENvbm5lY3QsCiAgICAgIEZ1dHVyZTxDb25uZWN0aW9uVGFzazxTb2NrZXQ+PiBGdW5jdGlvbihkeW5hbWljLCBpbnQsCiAgICAgICAgICAgICAge2R5bmFtaWMgc291cmNlQWRkcmVzc30pCiAgICAgICAgICBzb2NrZXRTdGFydENvbm5lY3QsCgogICAgICAvLyBPcHRpb25hbCBab25lIHBhcmFtZXRlcnMKICAgICAgWm9uZVNwZWNpZmljYXRpb24gem9uZVNwZWNpZmljYXRpb24sCiAgICAgIEZ1bmN0aW9uIG9uRXJyb3J9KSB7CiAgICBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBuZXcgX0lPT3ZlcnJpZGVzU2NvcGUoCiAgICAgIC8vIERpcmVjdG9yeQogICAgICBjcmVhdGVEaXJlY3RvcnksCiAgICAgIGdldEN1cnJlbnREaXJlY3RvcnksCiAgICAgIHNldEN1cnJlbnREaXJlY3RvcnksCiAgICAgIGdldFN5c3RlbVRlbXBEaXJlY3RvcnksCgogICAgICAvLyBGaWxlCiAgICAgIGNyZWF0ZUZpbGUsCgogICAgICAvLyBGaWxlU3RhdAogICAgICBzdGF0LAogICAgICBzdGF0U3luYywKCiAgICAgIC8vIEZpbGVTeXN0ZW1FbnRpdHkKICAgICAgZnNlSWRlbnRpY2FsLAogICAgICBmc2VJZGVudGljYWxTeW5jLAogICAgICBmc2VHZXRUeXBlLAogICAgICBmc2VHZXRUeXBlU3luYywKCiAgICAgIC8vIF9GaWxlU3lzdGVtV2F0Y2hlcgogICAgICBmc1dhdGNoLAogICAgICBmc1dhdGNoSXNTdXBwb3J0ZWQsCgogICAgICAvLyBMaW5rCiAgICAgIGNyZWF0ZUxpbmssCgogICAgICAvLyBTb2NrZXQKICAgICAgc29ja2V0Q29ubmVjdCwKICAgICAgc29ja2V0U3RhcnRDb25uZWN0LAogICAgKTsKICAgIHJldHVybiBfYXN5bmNSdW5ab25lZDxSPihib2R5LAogICAgICAgIHpvbmVWYWx1ZXM6IHtfaW9PdmVycmlkZXNUb2tlbjogb3ZlcnJpZGVzfSwKICAgICAgICB6b25lU3BlY2lmaWNhdGlvbjogem9uZVNwZWNpZmljYXRpb24sCiAgICAgICAgb25FcnJvcjogb25FcnJvcik7CiAgfQoKICAvLy8gUnVucyBbYm9keV0gaW4gYSBmcmVzaCBbWm9uZV0gdXNpbmcgdGhlIG92ZXJyaWRlcyBmb3VuZCBpbiBbb3ZlcnJpZGVzXS4KICAvLy8KICAvLy8gTm90ZSB0aGF0IFtvdmVycmlkZXNdIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgZXh0ZW5kcwogIC8vLyBbSU9PdmVycmlkZXNdLgogIHN0YXRpYyBSIHJ1bldpdGhJT092ZXJyaWRlczxSPihSIGJvZHkoKSwgSU9PdmVycmlkZXMgb3ZlcnJpZGVzLAogICAgICB7Wm9uZVNwZWNpZmljYXRpb24gem9uZVNwZWNpZmljYXRpb24sIEZ1bmN0aW9uIG9uRXJyb3J9KSB7CiAgICByZXR1cm4gX2FzeW5jUnVuWm9uZWQ8Uj4oYm9keSwKICAgICAgICB6b25lVmFsdWVzOiB7X2lvT3ZlcnJpZGVzVG9rZW46IG92ZXJyaWRlc30sCiAgICAgICAgem9uZVNwZWNpZmljYXRpb246IHpvbmVTcGVjaWZpY2F0aW9uLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IpOwogIH0KCiAgLy8gRGlyZWN0b3J5CgogIC8vLyBDcmVhdGVzIGEgbmV3IFtEaXJlY3RvcnldIG9iamVjdCBmb3IgdGhlIGdpdmVuIFtwYXRoXS4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIGBuZXcgRGlyZWN0b3J5KClgIGFuZCBgbmV3IERpcmVjdG9yeS5mcm9tVXJpKClgLgogIERpcmVjdG9yeSBjcmVhdGVEaXJlY3RvcnkoU3RyaW5nIHBhdGgpID0+IG5ldyBfRGlyZWN0b3J5KHBhdGgpOwoKICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIHRoZSBzdGF0aWMgZ2V0dGVyIGBEaXJlY3RvcnkuY3VycmVudGAKICBEaXJlY3RvcnkgZ2V0Q3VycmVudERpcmVjdG9yeSgpID0+IF9EaXJlY3RvcnkuY3VycmVudDsKCiAgLy8vIFNldHMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgdG8gYmUgW3BhdGhdLgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gdGhlIHNldHRlciBgRGlyZWN0b3J5LmN1cnJlbnRgLgogIHZvaWQgc2V0Q3VycmVudERpcmVjdG9yeShTdHJpbmcgcGF0aCkgewogICAgX0RpcmVjdG9yeS5jdXJyZW50ID0gcGF0aDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBzeXN0ZW0gdGVtcG9yYXJ5IGRpcmVjdG9yeS4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIGBEaXJlY3Rvcnkuc3lzdGVtVGVtcGAuCiAgRGlyZWN0b3J5IGdldFN5c3RlbVRlbXBEaXJlY3RvcnkoKSA9PiBfRGlyZWN0b3J5LnN5c3RlbVRlbXA7CgogIC8vIEZpbGUKCiAgLy8vIENyZWF0ZXMgYSBuZXcgW0ZpbGVdIG9iamVjdCBmb3IgdGhlIGdpdmVuIFtwYXRoXS4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIGBuZXcgRmlsZSgpYCBhbmQgYG5ldyBGaWxlLmZyb21VcmkoKWAuCiAgRmlsZSBjcmVhdGVGaWxlKFN0cmluZyBwYXRoKSA9PiBuZXcgX0ZpbGUocGF0aCk7CgogIC8vIEZpbGVTdGF0CgogIC8vLyBBc3luY2hyb25vdXNseSByZXR1cm5zIFtGaWxlU3RhdF0gaW5mb3JtYXRpb24gZm9yIFtwYXRoXS4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIGBGaWxlU3RhdC5zdGF0KClgLgogIEZ1dHVyZTxGaWxlU3RhdD4gc3RhdChTdHJpbmcgcGF0aCkgewogICAgcmV0dXJuIEZpbGVTdGF0Ll9zdGF0KHBhdGgpOwogIH0KCiAgLy8vIFJldHVybnMgW0ZpbGVTdGF0XSBpbmZvcm1hdGlvbiBmb3IgW3BhdGhdLgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gYEZpbGVTdGF0LnN0YXRTeW5jKClgLgogIEZpbGVTdGF0IHN0YXRTeW5jKFN0cmluZyBwYXRoKSB7CiAgICByZXR1cm4gRmlsZVN0YXQuX3N0YXRTeW5jSW50ZXJuYWwocGF0aCk7CiAgfQoKICAvLyBGaWxlU3lzdGVtRW50aXR5CgogIC8vLyBBc3luY2hyb25vdXNseSByZXR1cm5zIGB0cnVlYCBpZiBbcGF0aDFdIGFuZCBbcGF0aDJdIGFyZSBwYXRocyB0byB0aGUKICAvLy8gc2FtZSBmaWxlIHN5c3RlbSBvYmplY3QuCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgRmlsZVN5c3RlbUVudGl0eS5pZGVudGljYWxgLgogIEZ1dHVyZTxib29sPiBmc2VJZGVudGljYWwoU3RyaW5nIHBhdGgxLCBTdHJpbmcgcGF0aDIpIHsKICAgIHJldHVybiBGaWxlU3lzdGVtRW50aXR5Ll9pZGVudGljYWwocGF0aDEsIHBhdGgyKTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbcGF0aDFdIGFuZCBbcGF0aDJdIGFyZSBwYXRocyB0byB0aGUKICAvLy8gc2FtZSBmaWxlIHN5c3RlbSBvYmplY3QuCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgRmlsZVN5c3RlbUVudGl0eS5pZGVudGljYWxTeW5jYC4KICBib29sIGZzZUlkZW50aWNhbFN5bmMoU3RyaW5nIHBhdGgxLCBTdHJpbmcgcGF0aDIpIHsKICAgIHJldHVybiBGaWxlU3lzdGVtRW50aXR5Ll9pZGVudGljYWxTeW5jKHBhdGgxLCBwYXRoMik7CiAgfQoKICAvLy8gQXN5bmNocm9ub3VzbHkgcmV0dXJucyB0aGUgW0ZpbGVTeXN0ZW1FbnRpdHlUeXBlXSBmb3IgW3BhdGhdLgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gYEZpbGVTeXN0ZW1FbnRpdHkudHlwZWAuCiAgRnV0dXJlPEZpbGVTeXN0ZW1FbnRpdHlUeXBlPiBmc2VHZXRUeXBlKFN0cmluZyBwYXRoLCBib29sIGZvbGxvd0xpbmtzKSB7CiAgICByZXR1cm4gRmlsZVN5c3RlbUVudGl0eS5fZ2V0VHlwZVJlcXVlc3QodXRmOC5lbmNvZGUocGF0aCksIGZvbGxvd0xpbmtzKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbRmlsZVN5c3RlbUVudGl0eVR5cGVdIGZvciBbcGF0aF0uCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgRmlsZVN5c3RlbUVudGl0eS50eXBlU3luY2AuCiAgRmlsZVN5c3RlbUVudGl0eVR5cGUgZnNlR2V0VHlwZVN5bmMoU3RyaW5nIHBhdGgsIGJvb2wgZm9sbG93TGlua3MpIHsKICAgIHJldHVybiBGaWxlU3lzdGVtRW50aXR5Ll9nZXRUeXBlU3luY0hlbHBlcih1dGY4LmVuY29kZShwYXRoKSwgZm9sbG93TGlua3MpOwogIH0KCiAgLy8gX0ZpbGVTeXN0ZW1XYXRjaGVyCgogIC8vLyBSZXR1cm5zIGEgW1N0cmVhbV0gb2YgW0ZpbGVTeXN0ZW1FdmVudF1zLgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gYEZpbGVTeXN0ZW1FbnRpdHkud2F0Y2goKWAuCiAgU3RyZWFtPEZpbGVTeXN0ZW1FdmVudD4gZnNXYXRjaChTdHJpbmcgcGF0aCwgaW50IGV2ZW50cywgYm9vbCByZWN1cnNpdmUpIHsKICAgIHJldHVybiBfRmlsZVN5c3RlbVdhdGNoZXIuX3dhdGNoKHBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKTsKICB9CgogIC8vLyBSZXR1cm5zIGB0cnVlYCB3aGVuIFtGaWxlU3lzdGVtRW50aXR5LndhdGNoXSBpcyBzdXBwb3J0ZWQuCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgRmlsZVN5c3RlbUVudGl0eS5pc1dhdGNoU3VwcG9ydGVkYC4KICBib29sIGZzV2F0Y2hJc1N1cHBvcnRlZCgpID0+IF9GaWxlU3lzdGVtV2F0Y2hlci5pc1N1cHBvcnRlZDsKCiAgLy8gTGluawoKICAvLy8gUmV0dXJucyBhIG5ldyBbTGlua10gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gW3BhdGhdLgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gYG5ldyBMaW5rKClgIGFuZCBgbmV3IExpbmsuZnJvbVVyaSgpYC4KICBMaW5rIGNyZWF0ZUxpbmsoU3RyaW5nIHBhdGgpID0+IG5ldyBfTGluayhwYXRoKTsKCiAgLy8gU29ja2V0CgogIC8vLyBBc3luY2hyb25vdXNseSByZXR1cm5zIGEgW1NvY2tldF0gY29ubmVjdGVkIHRvIHRoZSBnaXZlbiBob3N0IGFuZCBwb3J0LgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9ucyBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIGBTb2NrZXQuY29ubmVjdCguLi4pYC4KICBGdXR1cmU8U29ja2V0PiBzb2NrZXRDb25uZWN0KGhvc3QsIGludCBwb3J0LAogICAgICB7c291cmNlQWRkcmVzcywgRHVyYXRpb24gdGltZW91dH0pIHsKICAgIHJldHVybiBTb2NrZXQuX2Nvbm5lY3QoaG9zdCwgcG9ydCwKICAgICAgICBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzLCB0aW1lb3V0OiB0aW1lb3V0KTsKICB9CgogIC8vLyBBc3luY2hyb25vdXNseSByZXR1cm5zIGEgW0Nvbm5lY3Rpb25UYXNrXSB0aGF0IGNvbm5lY3RzIHRvIHRoZSBnaXZlbiBob3N0CiAgLy8vIGFuZCBwb3J0IHdoZW4gc3VjY2Vzc2Z1bC4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbnMgb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgU29ja2V0LnN0YXJ0Q29ubmVjdCguLi4pYC4KICBGdXR1cmU8Q29ubmVjdGlvblRhc2s8U29ja2V0Pj4gc29ja2V0U3RhcnRDb25uZWN0KGhvc3QsIGludCBwb3J0LAogICAgICB7c291cmNlQWRkcmVzc30pIHsKICAgIHJldHVybiBTb2NrZXQuX3N0YXJ0Q29ubmVjdChob3N0LCBwb3J0LCBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzKTsKICB9Cn0KCmNsYXNzIF9JT092ZXJyaWRlc1Njb3BlIGV4dGVuZHMgSU9PdmVycmlkZXMgewogIGZpbmFsIElPT3ZlcnJpZGVzIF9wcmV2aW91cyA9IElPT3ZlcnJpZGVzLmN1cnJlbnQ7CgogIC8vIERpcmVjdG9yeQogIERpcmVjdG9yeSBGdW5jdGlvbihTdHJpbmcpIF9jcmVhdGVEaXJlY3Rvcnk7CiAgRGlyZWN0b3J5IEZ1bmN0aW9uKCkgX2dldEN1cnJlbnREaXJlY3Rvcnk7CiAgdm9pZCBGdW5jdGlvbihTdHJpbmcpIF9zZXRDdXJyZW50RGlyZWN0b3J5OwogIERpcmVjdG9yeSBGdW5jdGlvbigpIF9nZXRTeXN0ZW1UZW1wRGlyZWN0b3J5OwoKICAvLyBGaWxlCiAgRmlsZSBGdW5jdGlvbihTdHJpbmcpIF9jcmVhdGVGaWxlOwoKICAvLyBGaWxlU3RhdAogIEZ1dHVyZTxGaWxlU3RhdD4gRnVuY3Rpb24oU3RyaW5nKSBfc3RhdDsKICBGaWxlU3RhdCBGdW5jdGlvbihTdHJpbmcpIF9zdGF0U3luYzsKCiAgLy8gRmlsZVN5c3RlbUVudGl0eQogIEZ1dHVyZTxib29sPiBGdW5jdGlvbihTdHJpbmcsIFN0cmluZykgX2ZzZUlkZW50aWNhbDsKICBib29sIEZ1bmN0aW9uKFN0cmluZywgU3RyaW5nKSBfZnNlSWRlbnRpY2FsU3luYzsKICBGdXR1cmU8RmlsZVN5c3RlbUVudGl0eVR5cGU+IEZ1bmN0aW9uKFN0cmluZywgYm9vbCkgX2ZzZUdldFR5cGU7CiAgRmlsZVN5c3RlbUVudGl0eVR5cGUgRnVuY3Rpb24oU3RyaW5nLCBib29sKSBfZnNlR2V0VHlwZVN5bmM7CgogIC8vIF9GaWxlU3lzdGVtV2F0Y2hlcgogIFN0cmVhbTxGaWxlU3lzdGVtRXZlbnQ+IEZ1bmN0aW9uKFN0cmluZywgaW50LCBib29sKSBfZnNXYXRjaDsKICBib29sIEZ1bmN0aW9uKCkgX2ZzV2F0Y2hJc1N1cHBvcnRlZDsKCiAgLy8gTGluawogIExpbmsgRnVuY3Rpb24oU3RyaW5nKSBfY3JlYXRlTGluazsKCiAgLy8gU29ja2V0CiAgRnV0dXJlPFNvY2tldD4gRnVuY3Rpb24oZHluYW1pYywgaW50LAogICAgICB7ZHluYW1pYyBzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0fSkgX3NvY2tldENvbm5lY3Q7CiAgRnV0dXJlPENvbm5lY3Rpb25UYXNrPFNvY2tldD4+IEZ1bmN0aW9uKGR5bmFtaWMsIGludCwge2R5bmFtaWMgc291cmNlQWRkcmVzc30pCiAgICAgIF9zb2NrZXRTdGFydENvbm5lY3Q7CgogIF9JT092ZXJyaWRlc1Njb3BlKAogICAgLy8gRGlyZWN0b3J5CiAgICB0aGlzLl9jcmVhdGVEaXJlY3RvcnksCiAgICB0aGlzLl9nZXRDdXJyZW50RGlyZWN0b3J5LAogICAgdGhpcy5fc2V0Q3VycmVudERpcmVjdG9yeSwKICAgIHRoaXMuX2dldFN5c3RlbVRlbXBEaXJlY3RvcnksCgogICAgLy8gRmlsZQogICAgdGhpcy5fY3JlYXRlRmlsZSwKCiAgICAvLyBGaWxlU3RhdAogICAgdGhpcy5fc3RhdCwKICAgIHRoaXMuX3N0YXRTeW5jLAoKICAgIC8vIEZpbGVTeXN0ZW1FbnRpdHkKICAgIHRoaXMuX2ZzZUlkZW50aWNhbCwKICAgIHRoaXMuX2ZzZUlkZW50aWNhbFN5bmMsCiAgICB0aGlzLl9mc2VHZXRUeXBlLAogICAgdGhpcy5fZnNlR2V0VHlwZVN5bmMsCgogICAgLy8gX0ZpbGVTeXN0ZW1XYXRjaGVyCiAgICB0aGlzLl9mc1dhdGNoLAogICAgdGhpcy5fZnNXYXRjaElzU3VwcG9ydGVkLAoKICAgIC8vIExpbmsKICAgIHRoaXMuX2NyZWF0ZUxpbmssCgogICAgLy8gU29ja2V0CiAgICB0aGlzLl9zb2NrZXRDb25uZWN0LAogICAgdGhpcy5fc29ja2V0U3RhcnRDb25uZWN0LAogICk7CgogIC8vIERpcmVjdG9yeQogIEBvdmVycmlkZQogIERpcmVjdG9yeSBjcmVhdGVEaXJlY3RvcnkoU3RyaW5nIHBhdGgpIHsKICAgIGlmIChfY3JlYXRlRGlyZWN0b3J5ICE9IG51bGwpIHJldHVybiBfY3JlYXRlRGlyZWN0b3J5KHBhdGgpOwogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSByZXR1cm4gX3ByZXZpb3VzLmNyZWF0ZURpcmVjdG9yeShwYXRoKTsKICAgIHJldHVybiBzdXBlci5jcmVhdGVEaXJlY3RvcnkocGF0aCk7CiAgfQoKICBAb3ZlcnJpZGUKICBEaXJlY3RvcnkgZ2V0Q3VycmVudERpcmVjdG9yeSgpIHsKICAgIGlmIChfZ2V0Q3VycmVudERpcmVjdG9yeSAhPSBudWxsKSByZXR1cm4gX2dldEN1cnJlbnREaXJlY3RvcnkoKTsKICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgcmV0dXJuIF9wcmV2aW91cy5nZXRDdXJyZW50RGlyZWN0b3J5KCk7CiAgICByZXR1cm4gc3VwZXIuZ2V0Q3VycmVudERpcmVjdG9yeSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXRDdXJyZW50RGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7CiAgICBpZiAoX3NldEN1cnJlbnREaXJlY3RvcnkgIT0gbnVsbCkKICAgICAgX3NldEN1cnJlbnREaXJlY3RvcnkocGF0aCk7CiAgICBlbHNlIGlmIChfcHJldmlvdXMgIT0gbnVsbCkKICAgICAgX3ByZXZpb3VzLnNldEN1cnJlbnREaXJlY3RvcnkocGF0aCk7CiAgICBlbHNlCiAgICAgIHN1cGVyLnNldEN1cnJlbnREaXJlY3RvcnkocGF0aCk7CiAgfQoKICBAb3ZlcnJpZGUKICBEaXJlY3RvcnkgZ2V0U3lzdGVtVGVtcERpcmVjdG9yeSgpIHsKICAgIGlmIChfZ2V0U3lzdGVtVGVtcERpcmVjdG9yeSAhPSBudWxsKSByZXR1cm4gX2dldFN5c3RlbVRlbXBEaXJlY3RvcnkoKTsKICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgcmV0dXJuIF9wcmV2aW91cy5nZXRTeXN0ZW1UZW1wRGlyZWN0b3J5KCk7CiAgICByZXR1cm4gc3VwZXIuZ2V0U3lzdGVtVGVtcERpcmVjdG9yeSgpOwogIH0KCiAgLy8gRmlsZQogIEBvdmVycmlkZQogIEZpbGUgY3JlYXRlRmlsZShTdHJpbmcgcGF0aCkgewogICAgaWYgKF9jcmVhdGVGaWxlICE9IG51bGwpIHJldHVybiBfY3JlYXRlRmlsZShwYXRoKTsKICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgcmV0dXJuIF9wcmV2aW91cy5jcmVhdGVGaWxlKHBhdGgpOwogICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUZpbGUocGF0aCk7CiAgfQoKICAvLyBGaWxlU3RhdAogIEBvdmVycmlkZQogIEZ1dHVyZTxGaWxlU3RhdD4gc3RhdChTdHJpbmcgcGF0aCkgewogICAgaWYgKF9zdGF0ICE9IG51bGwpIHJldHVybiBfc3RhdChwYXRoKTsKICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgcmV0dXJuIF9wcmV2aW91cy5zdGF0KHBhdGgpOwogICAgcmV0dXJuIHN1cGVyLnN0YXQocGF0aCk7CiAgfQoKICBAb3ZlcnJpZGUKICBGaWxlU3RhdCBzdGF0U3luYyhTdHJpbmcgcGF0aCkgewogICAgaWYgKF9zdGF0ICE9IG51bGwpIHJldHVybiBfc3RhdFN5bmMocGF0aCk7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuc3RhdFN5bmMocGF0aCk7CiAgICByZXR1cm4gc3VwZXIuc3RhdFN5bmMocGF0aCk7CiAgfQoKICAvLyBGaWxlU3lzdGVtRW50aXR5CiAgQG92ZXJyaWRlCiAgRnV0dXJlPGJvb2w+IGZzZUlkZW50aWNhbChTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMikgewogICAgaWYgKF9mc2VJZGVudGljYWwgIT0gbnVsbCkgcmV0dXJuIF9mc2VJZGVudGljYWwocGF0aDEsIHBhdGgyKTsKICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgcmV0dXJuIF9wcmV2aW91cy5mc2VJZGVudGljYWwocGF0aDEsIHBhdGgyKTsKICAgIHJldHVybiBzdXBlci5mc2VJZGVudGljYWwocGF0aDEsIHBhdGgyKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZnNlSWRlbnRpY2FsU3luYyhTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMikgewogICAgaWYgKF9mc2VJZGVudGljYWxTeW5jICE9IG51bGwpIHJldHVybiBfZnNlSWRlbnRpY2FsU3luYyhwYXRoMSwgcGF0aDIpOwogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSByZXR1cm4gX3ByZXZpb3VzLmZzZUlkZW50aWNhbFN5bmMocGF0aDEsIHBhdGgyKTsKICAgIHJldHVybiBzdXBlci5mc2VJZGVudGljYWxTeW5jKHBhdGgxLCBwYXRoMik7CiAgfQoKICBAb3ZlcnJpZGUKICBGdXR1cmU8RmlsZVN5c3RlbUVudGl0eVR5cGU+IGZzZUdldFR5cGUoU3RyaW5nIHBhdGgsIGJvb2wgZm9sbG93TGlua3MpIHsKICAgIGlmIChfZnNlR2V0VHlwZSAhPSBudWxsKSByZXR1cm4gX2ZzZUdldFR5cGUocGF0aCwgZm9sbG93TGlua3MpOwogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSByZXR1cm4gX3ByZXZpb3VzLmZzZUdldFR5cGUocGF0aCwgZm9sbG93TGlua3MpOwogICAgcmV0dXJuIHN1cGVyLmZzZUdldFR5cGUocGF0aCwgZm9sbG93TGlua3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgRmlsZVN5c3RlbUVudGl0eVR5cGUgZnNlR2V0VHlwZVN5bmMoU3RyaW5nIHBhdGgsIGJvb2wgZm9sbG93TGlua3MpIHsKICAgIGlmIChfZnNlR2V0VHlwZVN5bmMgIT0gbnVsbCkgcmV0dXJuIF9mc2VHZXRUeXBlU3luYyhwYXRoLCBmb2xsb3dMaW5rcyk7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuZnNlR2V0VHlwZVN5bmMocGF0aCwgZm9sbG93TGlua3MpOwogICAgcmV0dXJuIHN1cGVyLmZzZUdldFR5cGVTeW5jKHBhdGgsIGZvbGxvd0xpbmtzKTsKICB9CgogIC8vIF9GaWxlU3lzdGVtV2F0Y2hlcgogIEBvdmVycmlkZQogIFN0cmVhbTxGaWxlU3lzdGVtRXZlbnQ+IGZzV2F0Y2goU3RyaW5nIHBhdGgsIGludCBldmVudHMsIGJvb2wgcmVjdXJzaXZlKSB7CiAgICBpZiAoX2ZzV2F0Y2ggIT0gbnVsbCkgcmV0dXJuIF9mc1dhdGNoKHBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKTsKICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgcmV0dXJuIF9wcmV2aW91cy5mc1dhdGNoKHBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKTsKICAgIHJldHVybiBzdXBlci5mc1dhdGNoKHBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZnNXYXRjaElzU3VwcG9ydGVkKCkgewogICAgaWYgKF9mc1dhdGNoSXNTdXBwb3J0ZWQgIT0gbnVsbCkgcmV0dXJuIF9mc1dhdGNoSXNTdXBwb3J0ZWQoKTsKICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgcmV0dXJuIF9wcmV2aW91cy5mc1dhdGNoSXNTdXBwb3J0ZWQoKTsKICAgIHJldHVybiBzdXBlci5mc1dhdGNoSXNTdXBwb3J0ZWQoKTsKICB9CgogIC8vIExpbmsKICBAb3ZlcnJpZGUKICBMaW5rIGNyZWF0ZUxpbmsoU3RyaW5nIHBhdGgpIHsKICAgIGlmIChfY3JlYXRlTGluayAhPSBudWxsKSByZXR1cm4gX2NyZWF0ZUxpbmsocGF0aCk7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuY3JlYXRlTGluayhwYXRoKTsKICAgIHJldHVybiBzdXBlci5jcmVhdGVMaW5rKHBhdGgpOwogIH0KCiAgLy8gU29ja2V0CiAgQG92ZXJyaWRlCiAgRnV0dXJlPFNvY2tldD4gc29ja2V0Q29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3MsIER1cmF0aW9uIHRpbWVvdXR9KSB7CiAgICBpZiAoX3NvY2tldENvbm5lY3QgIT0gbnVsbCkgewogICAgICByZXR1cm4gX3NvY2tldENvbm5lY3QoaG9zdCwgcG9ydCwKICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MsIHRpbWVvdXQ6IHRpbWVvdXQpOwogICAgfQogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfcHJldmlvdXMuc29ja2V0Q29ubmVjdChob3N0LCBwb3J0LAogICAgICAgICAgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcywgdGltZW91dDogdGltZW91dCk7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuc29ja2V0Q29ubmVjdChob3N0LCBwb3J0LAogICAgICAgIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MsIHRpbWVvdXQ6IHRpbWVvdXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPENvbm5lY3Rpb25UYXNrPFNvY2tldD4+IHNvY2tldFN0YXJ0Q29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3N9KSB7CiAgICBpZiAoX3NvY2tldFN0YXJ0Q29ubmVjdCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfc29ja2V0U3RhcnRDb25uZWN0KGhvc3QsIHBvcnQsIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MpOwogICAgfQogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfcHJldmlvdXMuc29ja2V0U3RhcnRDb25uZWN0KGhvc3QsIHBvcnQsCiAgICAgICAgICBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzKTsKICAgIH0KICAgIHJldHVybiBzdXBlci5zb2NrZXRTdGFydENvbm5lY3QoaG9zdCwgcG9ydCwgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcyk7CiAgfQp9CoHjAE5OPAERASgBIQFIFQRHUT8ECC0KNgoGBA0gDEo2DEMGCB0eASM3BAEzBk1OJS0ZBAFCBkw4IQgTMjAxMwEOKAESLioBGjo2RkIBHEMqAQ4oARAsORk8Jx4BIisbMxMXGxseAQ4SARIMEAEaFBgSFgEcDxoBDhIBEBUaByM0LhsEAU4GShVCQSM0LhsEAQ8BPQZPN0IBLQZPLDkBNwZPJiofBAEuBk8ePwEKATgGTy0zAQ4BQAZPGSchBAExBk8dIy0EARYBTB8GTyQ6NgQBPR8GTyg2OgQBRAZPH0tNBAE1Bk8jR1AEARgBMAZPIk0/BAFBBk8rPwEKATgGTy0zAQwBTgZQHS8rJzkEAVAgBlAiRBlLBAIBLjUBDy8tLjABCiUBDisnARY3M0M/ARhAJwEKJQEMKEFRGwEVERsfHyIBDBYBEBAUARgYHBYaARoTHgEMFgEOGR4FAQ8MK0FDKAQBDCRFQygEAQwqJiIgKwknBAEMJ0tGKwQBCgwhNz4jBAEODCcrOB0EAQwjLzwhBAEWDDpDSC0EAQw2S0wxBAEMS0RLMAQBDEdMTzQEARgMTUROMwQBDB5DQicEAQoMITc+IwQBDAwvKyIoOwYdMTsGKzkEAQxEGSdMBh02KQZPBAIBFmRhcnQ6aW8vb3ZlcnJpZGVzLmRhcnQsb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL3BsYXRmb3JtLmRhcnSd7C8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgovKioKICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGVudmlyb25tZW50IGluIHdoaWNoIHRoZSBjdXJyZW50IHByb2dyYW0gaXMgcnVubmluZy4KICoKICogUGxhdGZvcm0gcHJvdmlkZXMgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSwKICogdGhlIGhvc3RuYW1lIG9mIHRoZSBjb21wdXRlciwgdGhlIHZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcywKICogdGhlIHBhdGggdG8gdGhlIHJ1bm5pbmcgcHJvZ3JhbSwKICogYW5kIHNvIG9uLgogKgogKiAjIyBHZXQgdGhlIFVSSSB0byB0aGUgY3VycmVudCBEYXJ0IHNjcmlwdAogKgogKiBVc2UgdGhlIFtzY3JpcHRdIGdldHRlciB0byBnZXQgdGhlIFVSSSB0byB0aGUgY3VycmVudGx5IHJ1bm5pbmcKICogRGFydCBzY3JpcHQuCiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nIHNob3cgUGxhdGZvcm07CiAqCiAqICAgICB2b2lkIG1haW4oKSB7CiAqICAgICAgIC8vIEdldCB0aGUgVVJJIG9mIHRoZSBzY3JpcHQgYmVpbmcgcnVuLgogKiAgICAgICB2YXIgdXJpID0gUGxhdGZvcm0uc2NyaXB0OwogKiAgICAgICAvLyBDb252ZXJ0IHRoZSBVUkkgdG8gYSBwYXRoLgogKiAgICAgICB2YXIgcGF0aCA9IHVyaS50b0ZpbGVQYXRoKCk7CiAqICAgICB9CiAqCiAqICMjIEdldCB0aGUgdmFsdWUgb2YgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKICoKICogVGhlIFtlbnZpcm9ubWVudF0gZ2V0dGVyIHJldHVybnMgYSB0aGUgbmFtZXMgYW5kIHZhbHVlcyBvZiBlbnZpcm9ubWVudAogKiB2YXJpYWJsZXMgaW4gYSBbTWFwXSB0aGF0IGNvbnRhaW5zIGtleS12YWx1ZSBwYWlycyBvZiBzdHJpbmdzLiBUaGUgTWFwIGlzCiAqIHVubW9kaWZpYWJsZS4gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGBQQVRIYAogKiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KICoKICogICAgIGltcG9ydCAnZGFydDppbycgc2hvdyBQbGF0Zm9ybTsKICoKICogICAgIHZvaWQgbWFpbigpIHsKICogICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZWYXJzID0gUGxhdGZvcm0uZW52aXJvbm1lbnQ7CiAqICAgICAgIHByaW50KGVudlZhcnNbJ1BBVEgnXSk7CiAqICAgICB9CiAqCiAqICMjIERldGVybWluZSB0aGUgT1MKICoKICogWW91IGNhbiBnZXQgdGhlIG5hbWUgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYXMgYSBzdHJpbmcgd2l0aCB0aGUKICogW29wZXJhdGluZ1N5c3RlbV0gZ2V0dGVyLiBZb3UgY2FuIGFsc28gdXNlIG9uZSBvZiB0aGUgc3RhdGljIGJvb2xlYW4KICogZ2V0dGVyczogW2lzTWFjT1NdLCBbaXNMaW51eF0sIGFuZCBbaXNXaW5kb3dzXS4KICoKICogICAgIGltcG9ydCAnZGFydDppbycgc2hvdyBQbGF0Zm9ybSwgc3Rkb3V0OwogKgogKiAgICAgdm9pZCBtYWluKCkgewogKiAgICAgICAvLyBHZXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYXMgYSBzdHJpbmcuCiAqICAgICAgIFN0cmluZyBvcyA9IFBsYXRmb3JtLm9wZXJhdGluZ1N5c3RlbTsKICogICAgICAgLy8gT3IsIHVzZSBhIHByZWRpY2F0ZSBnZXR0ZXIuCiAqICAgICAgIGlmIChQbGF0Zm9ybS5pc01hY09TKSB7CiAqICAgICAgICAgcHJpbnQoJ2lzIGEgTWFjJyk7CiAqICAgICAgIH0gZWxzZSB7CiAqICAgICAgICAgcHJpbnQoJ2lzIG5vdCBhIE1hYycpOwogKiAgICAgICB9CiAqICAgICB9CiAqCiAqICMjIE90aGVyIHJlc291cmNlcwogKgogKiBbRGFydCBieSBFeGFtcGxlXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZGFydC1ieS1leGFtcGxlLyNkYXJ0LWlvLWFuZC1jb21tYW5kLWxpbmUtYXBwcykKICogcHJvdmlkZXMgYWRkaXRpb25hbCB0YXNrLW9yaWVudGVkIGNvZGUgc2FtcGxlcyB0aGF0IHNob3cgaG93IHRvIHVzZQogKiB2YXJpb3VzIEFQSSBmcm9tIHRoZSBbZGFydDppb10gbGlicmFyeS4KICovCmNsYXNzIFBsYXRmb3JtIHsKICBzdGF0aWMgZmluYWwgX251bWJlck9mUHJvY2Vzc29ycyA9IF9QbGF0Zm9ybS5udW1iZXJPZlByb2Nlc3NvcnM7CiAgc3RhdGljIGZpbmFsIF9wYXRoU2VwYXJhdG9yID0gX1BsYXRmb3JtLnBhdGhTZXBhcmF0b3I7CiAgc3RhdGljIGZpbmFsIF9vcGVyYXRpbmdTeXN0ZW0gPSBfUGxhdGZvcm0ub3BlcmF0aW5nU3lzdGVtOwogIHN0YXRpYyBmaW5hbCBfb3BlcmF0aW5nU3lzdGVtVmVyc2lvbiA9IF9QbGF0Zm9ybS5vcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOwogIHN0YXRpYyBmaW5hbCBfbG9jYWxIb3N0bmFtZSA9IF9QbGF0Zm9ybS5sb2NhbEhvc3RuYW1lOwogIHN0YXRpYyBmaW5hbCBfdmVyc2lvbiA9IF9QbGF0Zm9ybS52ZXJzaW9uOwoKICAvKioKICAgKiBUaGUgbnVtYmVyIG9mIGluZGl2aWR1YWwgZXhlY3V0aW9uIHVuaXRzIG9mIHRoZSBtYWNoaW5lLgogICAqLwogIHN0YXRpYyBpbnQgZ2V0IG51bWJlck9mUHJvY2Vzc29ycyA9PiBfbnVtYmVyT2ZQcm9jZXNzb3JzOwoKICAvKioKICAgKiBUaGUgcGF0aCBzZXBhcmF0b3IgdXNlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0byBzZXBhcmF0ZQogICAqIGNvbXBvbmVudHMgaW4gZmlsZSBwYXRocy4KICAgKi8KICBzdGF0aWMgU3RyaW5nIGdldCBwYXRoU2VwYXJhdG9yID0+IF9wYXRoU2VwYXJhdG9yOwoKICAvKioKICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLgogICAqLwogIHN0YXRpYyBTdHJpbmcgZ2V0IGxvY2FsZU5hbWUgPT4gX1BsYXRmb3JtLmxvY2FsZU5hbWUoKTsKCiAgLyoqCiAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9yIHBsYXRmb3JtLgogICAqLwogIHN0YXRpYyBTdHJpbmcgZ2V0IG9wZXJhdGluZ1N5c3RlbSA9PiBfb3BlcmF0aW5nU3lzdGVtOwoKICAvKioKICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb3IgcGxhdGZvcm0uCiAgICovCiAgc3RhdGljIFN0cmluZyBnZXQgb3BlcmF0aW5nU3lzdGVtVmVyc2lvbiA9PiBfb3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsKCiAgLyoqCiAgICogVGhlIGxvY2FsIGhvc3RuYW1lIGZvciB0aGUgc3lzdGVtLgogICAqLwogIHN0YXRpYyBTdHJpbmcgZ2V0IGxvY2FsSG9zdG5hbWUgPT4gX2xvY2FsSG9zdG5hbWU7CgogIC8qKgogICAqIFdoZXRoZXIgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgYSB2ZXJzaW9uIG9mCiAgICogW0xpbnV4XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaW51eCkuCiAgICoKICAgKiBUaGlzIHZhbHVlIGlzIGBmYWxzZWAgaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgYSBzcGVjaWFsaXplZAogICAqIHZlcnNpb24gb2YgTGludXggdGhhdCBpZGVudGlmaWVzIGl0c2VsZiBieSBhIGRpZmZlcmVudCBuYW1lLAogICAqIGZvciBleGFtcGxlIEFuZHJvaWQgKHNlZSBbaXNBbmRyb2lkXSkuCiAgICovCiAgc3RhdGljIGZpbmFsIGJvb2wgaXNMaW51eCA9IChfb3BlcmF0aW5nU3lzdGVtID09ICJsaW51eCIpOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGlzIGEgdmVyc2lvbiBvZgogICAqIFttYWNPU10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWFjT1MpLgogICAqLwogIHN0YXRpYyBmaW5hbCBib29sIGlzTWFjT1MgPSAoX29wZXJhdGluZ1N5c3RlbSA9PSAibWFjb3MiKTsKCiAgLyoqCiAgICogV2hldGhlciB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBhIHZlcnNpb24gb2YKICAgKiBbTWljcm9zb2Z0IFdpbmRvd3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01pY3Jvc29mdF9XaW5kb3dzKS4KICAgKi8KICBzdGF0aWMgZmluYWwgYm9vbCBpc1dpbmRvd3MgPSAoX29wZXJhdGluZ1N5c3RlbSA9PSAid2luZG93cyIpOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGlzIGEgdmVyc2lvbiBvZgogICAqIFtBbmRyb2lkXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BbmRyb2lkXyUyOG9wZXJhdGluZ19zeXN0ZW0lMjkpLgogICAqLwogIHN0YXRpYyBmaW5hbCBib29sIGlzQW5kcm9pZCA9IChfb3BlcmF0aW5nU3lzdGVtID09ICJhbmRyb2lkIik7CgogIC8qKgogICAqIFdoZXRoZXIgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgYSB2ZXJzaW9uIG9mCiAgICogW2lPU10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSU9TKS4KICAgKi8KICBzdGF0aWMgZmluYWwgYm9vbCBpc0lPUyA9IChfb3BlcmF0aW5nU3lzdGVtID09ICJpb3MiKTsKCiAgLyoqCiAgICogV2hldGhlciB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBhIHZlcnNpb24gb2YKICAgKiBbRnVjaHNpYV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR29vZ2xlX0Z1Y2hzaWEpLgogICAqLwogIHN0YXRpYyBmaW5hbCBib29sIGlzRnVjaHNpYSA9IChfb3BlcmF0aW5nU3lzdGVtID09ICJmdWNoc2lhIik7CgogIC8qKgogICAqIFRoZSBlbnZpcm9ubWVudCBmb3IgdGhpcyBwcm9jZXNzIGFzIGEgbWFwIGZyb20gc3RyaW5nIGtleSB0byBzdHJpbmcgdmFsdWUuCiAgICoKICAgKiBUaGUgbWFwIGlzIHVubW9kaWZpYWJsZSwKICAgKiBhbmQgaXRzIGNvbnRlbnQgaXMgcmV0cmlldmVkIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24gaXRzIGZpcnN0IHVzZS4KICAgKgogICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyBvbiBXaW5kb3dzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLAogICAqIHNvIG9uIFdpbmRvd3MgdGhlIG1hcCBpcyBjYXNlLWluc2Vuc2l0aXZlIGFuZCB3aWxsIGNvbnZlcnQKICAgKiBhbGwga2V5cyB0byB1cHBlciBjYXNlLgogICAqIE9uIG90aGVyIHBsYXRmb3Jtcywga2V5cyBjYW4gYmUgZGlzdGluZ3Vpc2hlZCBieSBjYXNlLgogICAqLwogIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldCBlbnZpcm9ubWVudCA9PiBfUGxhdGZvcm0uZW52aXJvbm1lbnQ7CgogIC8qKgogICAqIFRoZSBwYXRoIG9mIHRoZSBleGVjdXRhYmxlIHVzZWQgdG8gcnVuIHRoZSBzY3JpcHQgaW4gdGhpcyBpc29sYXRlLgogICAqCiAgICogVGhlIGxpdGVyYWwgcGF0aCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzY3JpcHQuCiAgICogVGhpcyBwYXRoIG1pZ2h0IGJlIHJlbGF0aXZlIG9yIGp1c3QgYmUgYSBuYW1lIGZyb20gd2hpY2ggdGhlIGV4ZWN1dGFibGUKICAgKiB3YXMgZm91bmQgYnkgc2VhcmNoaW5nIHRoZSBzeXN0ZW0gcGF0aC4KICAgKgogICAqIFVzZSBbcmVzb2x2ZWRFeGVjdXRhYmxlXSB0byBnZXQgYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZS4KICAgKi8KICBzdGF0aWMgU3RyaW5nIGdldCBleGVjdXRhYmxlID0+IF9QbGF0Zm9ybS5leGVjdXRhYmxlOwoKICAvKioKICAgKiBUaGUgcGF0aCBvZiB0aGUgZXhlY3V0YWJsZSB1c2VkIHRvIHJ1biB0aGUgc2NyaXB0IGluIHRoaXMKICAgKiBpc29sYXRlIGFmdGVyIGl0IGhhcyBiZWVuIHJlc29sdmVkIGJ5IHRoZSBPUy4KICAgKgogICAqIFRoaXMgaXMgdGhlIGFic29sdXRlIHBhdGgsIHdpdGggYWxsIHN5bWxpbmtzIHJlc29sdmVkLCB0byB0aGUKICAgKiBleGVjdXRhYmxlIHVzZWQgdG8gcnVuIHRoZSBzY3JpcHQuCiAgICovCiAgc3RhdGljIFN0cmluZyBnZXQgcmVzb2x2ZWRFeGVjdXRhYmxlID0+IF9QbGF0Zm9ybS5yZXNvbHZlZEV4ZWN1dGFibGU7CgogIC8qKgogICAqIFRoZSBhYnNvbHV0ZSBVUkkgb2YgdGhlIHNjcmlwdCBiZWluZyBydW4gaW4gdGhpcyBpc29sYXRlLgogICAqCiAgICogSWYgdGhlIHNjcmlwdCBhcmd1bWVudCBvbiB0aGUgY29tbWFuZCBsaW5lIGlzIHJlbGF0aXZlLAogICAqIGl0IGlzIHJlc29sdmVkIHRvIGFuIGFic29sdXRlIFVSSSBiZWZvcmUgZmV0Y2hpbmcgdGhlIHNjcmlwdCwgYW5kCiAgICogdGhhdCBhYnNvbHV0ZSBVUkkgaXMgcmV0dXJuZWQuCiAgICoKICAgKiBVUkkgcmVzb2x1dGlvbiBvbmx5IGRvZXMgc3RyaW5nIG1hbmlwdWxhdGlvbiBvbiB0aGUgc2NyaXB0IHBhdGgsIGFuZCB0aGlzCiAgICogbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBmaWxlIHN5c3RlbSdzIHBhdGggcmVzb2x1dGlvbiBiZWhhdmlvci4gRm9yCiAgICogZXhhbXBsZSwgYSBzeW1ib2xpYyBsaW5rIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5ICcuLicgd2lsbCBub3QgYmUKICAgKiBsb29rZWQgdXAuCiAgICoKICAgKiBJZiB0aGUgZXhlY3V0YWJsZSBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IFtzY3JpcHRdLAogICAqIHRoZSBVUkkgaXMgZW1wdHkuCiAgICovCiAgc3RhdGljIFVyaSBnZXQgc2NyaXB0ID0+IF9QbGF0Zm9ybS5zY3JpcHQ7CgogIC8qKgogICAqIFRoZSBmbGFncyBwYXNzZWQgdG8gdGhlIGV4ZWN1dGFibGUgdXNlZCB0byBydW4gdGhlIHNjcmlwdCBpbiB0aGlzIGlzb2xhdGUuCiAgICoKICAgKiBUaGVzZSBhcmUgdGhlIGNvbW1hbmQtbGluZSBmbGFncyB0byB0aGUgZXhlY3V0YWJsZSB0aGF0IHByZWNlZGVzCiAgICogdGhlIHNjcmlwdCBuYW1lLgogICAqIFByb3ZpZGVzIGEgbmV3IGxpc3QgZXZlcnkgdGltZSB0aGUgdmFsdWUgaXMgcmVhZC4KICAgKi8KICBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldCBleGVjdXRhYmxlQXJndW1lbnRzID0+IF9QbGF0Zm9ybS5leGVjdXRhYmxlQXJndW1lbnRzOwoKICAvKioKICAgKiBUaGlzIHJldHVybnMgYG51bGxgLCBhcyBgcGFja2FnZXMvYCBkaXJlY3RvcmllcyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KICAgKgogICAqLwogIEBEZXByZWNhdGVkKCdwYWNrYWdlcy8gZGlyZWN0b3J5IHJlc29sdXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBEYXJ0IDInKQogIHN0YXRpYyBTdHJpbmcgZ2V0IHBhY2thZ2VSb290ID0+IG51bGw7IC8vIFRPRE8obWZhaXJodXJzdCk6IHJlbW92ZSB0aGlzCgogIC8qKgogICAqIFRoZSBgLS1wYWNrYWdlc2AgZmxhZyBwYXNzZWQgdG8gdGhlIGV4ZWN1dGFibGUgdXNlZCB0byBydW4gdGhlIHNjcmlwdAogICAqIGluIHRoaXMgaXNvbGF0ZS4KICAgKgogICAqIElmIHByZXNlbnQsIGl0IHNwZWNpZmllcyBhIGZpbGUgZGVzY3JpYmluZyBob3cgRGFydCBwYWNrYWdlcyBhcmUgbG9va2VkIHVwLgogICAqCiAgICogSXMgYG51bGxgIGlmIHRoZXJlIGlzIG5vIGAtLXBhY2thZ2VzYCBmbGFnLgogICAqLwogIHN0YXRpYyBTdHJpbmcgZ2V0IHBhY2thZ2VDb25maWcgPT4gX1BsYXRmb3JtLnBhY2thZ2VDb25maWc7CgogIC8qKgogICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IERhcnQgcnVudGltZS4KICAgKgogICAqIFRoZSB2YWx1ZSBpcyBhIFtzZW1hbnRpYyB2ZXJzaW9uaW5nXShodHRwOi8vc2VtdmVyLm9yZykKICAgKiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IERhcnQgcnVudGltZSwKICAgKiBwb3NzaWJseSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIGFuZCBvdGhlciB2ZXJzaW9uIGFuZAogICAqIGJ1aWxkIGRldGFpbHMuCiAgICovCiAgc3RhdGljIFN0cmluZyBnZXQgdmVyc2lvbiA9PiBfdmVyc2lvbjsKfQqA6gBOTjwBEQEETgM/RSQOAy0DQxADJwMVMSQnJgkDLwNKTUYZAycDFT0hCQMXA0VIMwMvAxUyLyghHhIiCwkDFgNeRysEEUM5PUs5LQEGPgY8AQZBHwY1AQYpBjoBBj0GOQEGTAZHAQYoBjUBBjIzBURCLAY9AQYyMwY9AQYySwZBAQYyTgZBAQYyLwY5AQYyPgZBAQZQBR5OBTxAHTwGRwEGSAUzTS0FSQY4AQY/MwVDKAZIAQY/BT1HJAVPS0cQBT4XBi0BBlAFRhY3BlABBk4FBktKAQZLFgVRBTEGPgEGLgU9QjsUBikCARVkYXJ0OmlvL3BsYXRmb3JtLmRhcnQxb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL3BsYXRmb3JtX2ltcGwuZGFydJaNLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCmNsYXNzIF9QbGF0Zm9ybSB7CiAgZXh0ZXJuYWwgc3RhdGljIGludCBfbnVtYmVyT2ZQcm9jZXNzb3JzKCk7CiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBfcGF0aFNlcGFyYXRvcigpOwogIGV4dGVybmFsIHN0YXRpYyBTdHJpbmcgX29wZXJhdGluZ1N5c3RlbSgpOwogIGV4dGVybmFsIHN0YXRpYyBfb3BlcmF0aW5nU3lzdGVtVmVyc2lvbigpOwogIGV4dGVybmFsIHN0YXRpYyBfbG9jYWxIb3N0bmFtZSgpOwogIGV4dGVybmFsIHN0YXRpYyBfZXhlY3V0YWJsZSgpOwogIGV4dGVybmFsIHN0YXRpYyBfcmVzb2x2ZWRFeGVjdXRhYmxlKCk7CgogIC8qKgogICAqIFJldHJpZXZlIHRoZSBlbnRyaWVzIG9mIHRoZSBwcm9jZXNzIGVudmlyb25tZW50LgogICAqCiAgICogVGhlIHJlc3VsdCBpcyBhbiBbSXRlcmFibGVdIG9mIHN0cmluZ3MsIHdoZXJlIGVhY2ggc3RyaW5nIHJlcHJlc2VudHMKICAgKiBhbiBlbnZpcm9ubWVudCBlbnRyeS4KICAgKgogICAqIEVudmlyb25tZW50IGVudHJpZXMgc2hvdWxkIGJlIHN0cmluZ3MgY29udGFpbmluZwogICAqIGEgbm9uLWVtcHR5IG5hbWUgYW5kIGEgdmFsdWUgc2VwYXJhdGVkIGJ5IGEgJz0nIGNoYXJhY3Rlci4KICAgKiBUaGUgbmFtZSBkb2VzIG5vdCBjb250YWluIGEgJz0nIGNoYXJhY3RlciwKICAgKiBzbyB0aGUgbmFtZSBpcyBldmVyeXRoaW5nIHVwIHRvIHRoZSBmaXJzdCAnPScgY2hhcmFjdGVyLgogICAqIFZhbHVlcyBhcmUgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgJz0nIGNoYXJhY3Rlci4KICAgKiBBIHZhbHVlIG1heSBjb250YWluIGZ1cnRoZXIgJz0nIGNoYXJhY3RlcnMsIGFuZCBpdCBtYXkgYmUgZW1wdHkuCiAgICoKICAgKiBSZXR1cm5zIGFuIFtPU0Vycm9yXSBpZiByZXRyaWV2aW5nIHRoZSBlbnZpcm9ubWVudCBmYWlscy4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgX2Vudmlyb25tZW50KCk7CiAgZXh0ZXJuYWwgc3RhdGljIExpc3Q8U3RyaW5nPiBfZXhlY3V0YWJsZUFyZ3VtZW50cygpOwogIGV4dGVybmFsIHN0YXRpYyBTdHJpbmcgX3BhY2thZ2VSb290KCk7IC8vIFRPRE8obWZhaXJodXJzdCk6IHJlbW92ZSB0aGlzCiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBfcGFja2FnZUNvbmZpZygpOwogIGV4dGVybmFsIHN0YXRpYyBTdHJpbmcgX3ZlcnNpb24oKTsKICBleHRlcm5hbCBzdGF0aWMgU3RyaW5nIF9sb2NhbGVOYW1lKCk7CiAgZXh0ZXJuYWwgc3RhdGljIFVyaSBfc2NyaXB0KCk7CgogIHN0YXRpYyBTdHJpbmcgZXhlY3V0YWJsZSA9IF9leGVjdXRhYmxlKCk7CiAgc3RhdGljIFN0cmluZyByZXNvbHZlZEV4ZWN1dGFibGUgPSBfcmVzb2x2ZWRFeGVjdXRhYmxlKCk7CiAgc3RhdGljIFN0cmluZyBwYWNrYWdlUm9vdDsgLy8gVE9ETyhtZmFpcmh1cnN0KTogcmVtb3ZlIHRoaXMKICBzdGF0aWMgU3RyaW5nIHBhY2thZ2VDb25maWcgPSBfcGFja2FnZUNvbmZpZygpOwoKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgc3RhdGljIFN0cmluZyBGdW5jdGlvbigpIF9sb2NhbGVDbG9zdXJlOwogIHN0YXRpYyBTdHJpbmcgbG9jYWxlTmFtZSgpIHsKICAgIGZpbmFsIHJlc3VsdCA9IChfbG9jYWxlQ2xvc3VyZSA9PSBudWxsKSA/IF9sb2NhbGVOYW1lKCkgOiBfbG9jYWxlQ2xvc3VyZSgpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IHJlc3VsdDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBDYWNoZSB0aGUgT1MgZW52aXJvbm1lbnQuIFRoaXMgY2FuIGJlIGFuIE9TRXJyb3IgaW5zdGFuY2UgaWYKICAvLyByZXRyaWV2aW5nIHRoZSBlbnZpcm9ubWVudCBmYWlsZWQuCiAgc3RhdGljIHZhciAvKk9TRXJyb3J8TWFwPFN0cmluZyxTdHJpbmc+Ki8gX2Vudmlyb25tZW50Q2FjaGU7CgogIHN0YXRpYyBpbnQgZ2V0IG51bWJlck9mUHJvY2Vzc29ycyA9PiBfbnVtYmVyT2ZQcm9jZXNzb3JzKCk7CiAgc3RhdGljIFN0cmluZyBnZXQgcGF0aFNlcGFyYXRvciA9PiBfcGF0aFNlcGFyYXRvcigpOwogIHN0YXRpYyBTdHJpbmcgZ2V0IG9wZXJhdGluZ1N5c3RlbSA9PiBfb3BlcmF0aW5nU3lzdGVtKCk7CiAgc3RhdGljIFVyaSBnZXQgc2NyaXB0ID0+IF9zY3JpcHQoKTsKCiAgc3RhdGljIFN0cmluZyBfY2FjaGVkT1NWZXJzaW9uOwogIHN0YXRpYyBTdHJpbmcgZ2V0IG9wZXJhdGluZ1N5c3RlbVZlcnNpb24gewogICAgaWYgKF9jYWNoZWRPU1ZlcnNpb24gPT0gbnVsbCkgewogICAgICB2YXIgcmVzdWx0ID0gX29wZXJhdGluZ1N5c3RlbVZlcnNpb24oKTsKICAgICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgICAgdGhyb3cgcmVzdWx0OwogICAgICB9CiAgICAgIF9jYWNoZWRPU1ZlcnNpb24gPSByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZE9TVmVyc2lvbjsKICB9CgogIHN0YXRpYyBTdHJpbmcgZ2V0IGxvY2FsSG9zdG5hbWUgewogICAgdmFyIHJlc3VsdCA9IF9sb2NhbEhvc3RuYW1lKCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0IGV4ZWN1dGFibGVBcmd1bWVudHMgPT4gX2V4ZWN1dGFibGVBcmd1bWVudHMoKTsKCiAgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0IGVudmlyb25tZW50IHsKICAgIGlmIChfZW52aXJvbm1lbnRDYWNoZSA9PSBudWxsKSB7CiAgICAgIHZhciBlbnYgPSBfZW52aXJvbm1lbnQoKTsKICAgICAgaWYgKGVudiBpcyEgT1NFcnJvcikgewogICAgICAgIHZhciBpc1dpbmRvd3MgPSBvcGVyYXRpbmdTeXN0ZW0gPT0gJ3dpbmRvd3MnOwogICAgICAgIHZhciByZXN1bHQgPSBpc1dpbmRvd3MKICAgICAgICAgICAgPyBuZXcgX0Nhc2VJbnNlbnNpdGl2ZVN0cmluZ01hcDxTdHJpbmc+KCkKICAgICAgICAgICAgOiBuZXcgTWFwPFN0cmluZywgU3RyaW5nPigpOwogICAgICAgIGZvciAodmFyIHN0ciBpbiBlbnYpIHsKICAgICAgICAgIGlmIChzdHIgPT0gbnVsbCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFRoZSBTdHJpbmdzIHJldHVybmVkIGJ5IFtfZW52aXJvbm1lbnQoKV0gYXJlIGV4cGVjdGVkIHRvIGJlCiAgICAgICAgICAvLyB2YWxpZCBlbnZpcm9ubWVudCBlbnRyaWVzLCBidXQgZXhjZXB0aW9ucyBoYXZlIGJlZW4gc2VlbgogICAgICAgICAgLy8gKGUuZy4sIGFuIGVudHJ5IG9mIGp1c3QgJz0nIGhhcyBiZWVuIHNlZW4gb24gT1MvWCkuCiAgICAgICAgICAvLyBJbnZhbGlkIGVudHJpZXMgKGxpbmVzIHdpdGhvdXQgYSAnPScgb3Igd2l0aCBhbiBlbXB0eSBuYW1lKQogICAgICAgICAgLy8gYXJlIGRpc2NhcmRlZC4KICAgICAgICAgIHZhciBlcXVhbHNJbmRleCA9IHN0ci5pbmRleE9mKCc9Jyk7CiAgICAgICAgICBpZiAoZXF1YWxzSW5kZXggPiAwKSB7CiAgICAgICAgICAgIHJlc3VsdFtzdHIuc3Vic3RyaW5nKDAsIGVxdWFsc0luZGV4KV0gPQogICAgICAgICAgICAgICAgc3RyLnN1YnN0cmluZyhlcXVhbHNJbmRleCArIDEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfZW52aXJvbm1lbnRDYWNoZSA9IG5ldyBVbm1vZGlmaWFibGVNYXBWaWV3PFN0cmluZywgU3RyaW5nPihyZXN1bHQpOwogICAgICB9IGVsc2UgewogICAgICAgIF9lbnZpcm9ubWVudENhY2hlID0gZW52OwogICAgICB9CiAgICB9CgogICAgaWYgKF9lbnZpcm9ubWVudENhY2hlIGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgX2Vudmlyb25tZW50Q2FjaGU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gX2Vudmlyb25tZW50Q2FjaGU7CiAgICB9CiAgfQoKICBzdGF0aWMgU3RyaW5nIGdldCB2ZXJzaW9uID0+IF92ZXJzaW9uKCk7Cn0KCi8vIEVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBvbiBXaW5kb3dzLiBJbiBvcmRlcgovLyB0byByZWZsZWN0IHRoYXQgd2UgdXNlIGEgY2FzZS1pbnNlbnNpdGl2ZSBzdHJpbmcgbWFwIG9uIFdpbmRvd3MuCmNsYXNzIF9DYXNlSW5zZW5zaXRpdmVTdHJpbmdNYXA8Vj4gZXh0ZW5kcyBNYXBCYXNlPFN0cmluZywgVj4gewogIGZpbmFsIE1hcDxTdHJpbmcsIFY+IF9tYXAgPSBuZXcgTWFwPFN0cmluZywgVj4oKTsKCiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSA9PgogICAgICBrZXkgaXMgU3RyaW5nICYmIF9tYXAuY29udGFpbnNLZXkoa2V5LnRvVXBwZXJDYXNlKCkpOwogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpID0+IF9tYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KSA9PiBrZXkgaXMgU3RyaW5nID8gX21hcFtrZXkudG9VcHBlckNhc2UoKV0gOiBudWxsOwogIHZvaWQgb3BlcmF0b3IgW109KFN0cmluZyBrZXksIFYgdmFsdWUpIHsKICAgIF9tYXBba2V5LnRvVXBwZXJDYXNlKCldID0gdmFsdWU7CiAgfQoKICBWIHB1dElmQWJzZW50KFN0cmluZyBrZXksIFYgaWZBYnNlbnQoKSkgewogICAgcmV0dXJuIF9tYXAucHV0SWZBYnNlbnQoa2V5LnRvVXBwZXJDYXNlKCksIGlmQWJzZW50KTsKICB9CgogIHZvaWQgYWRkQWxsKE1hcDxTdHJpbmcsIFY+IG90aGVyKSB7CiAgICBvdGhlci5mb3JFYWNoKChrZXksIHZhbHVlKSA9PiB0aGlzW2tleS50b1VwcGVyQ2FzZSgpXSA9IHZhbHVlKTsKICB9CgogIFYgcmVtb3ZlKE9iamVjdCBrZXkpID0+IGtleSBpcyBTdHJpbmcgPyBfbWFwLnJlbW92ZShrZXkudG9VcHBlckNhc2UoKSkgOiBudWxsOwoKICB2b2lkIGNsZWFyKCkgewogICAgX21hcC5jbGVhcigpOwogIH0KCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihTdHJpbmcga2V5LCBWIHZhbHVlKSkgewogICAgX21hcC5mb3JFYWNoKGYpOwogIH0KCiAgSXRlcmFibGU8U3RyaW5nPiBnZXQga2V5cyA9PiBfbWFwLmtleXM7CiAgSXRlcmFibGU8Vj4gZ2V0IHZhbHVlcyA9PiBfbWFwLnZhbHVlczsKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbWFwLmxlbmd0aDsKICBib29sIGdldCBpc0VtcHR5ID0+IF9tYXAuaXNFbXB0eTsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9tYXAuaXNOb3RFbXB0eTsKCiAgSXRlcmFibGU8TWFwRW50cnk8U3RyaW5nLCBWPj4gZ2V0IGVudHJpZXMgPT4gX21hcC5lbnRyaWVzOwoKICBNYXA8SzIsIFYyPiBtYXA8SzIsIFYyPihNYXBFbnRyeTxLMiwgVjI+IHRyYW5zZm9ybShTdHJpbmcga2V5LCBWIHZhbHVlKSkgPT4KICAgICAgX21hcC5tYXAodHJhbnNmb3JtKTsKCiAgViB1cGRhdGUoU3RyaW5nIGtleSwgViB1cGRhdGUoViB2YWx1ZSksIHtWIGlmQWJzZW50KCl9KSA9PgogICAgICBfbWFwLnVwZGF0ZShrZXkudG9VcHBlckNhc2UoKSwgdXBkYXRlLCBpZkFic2VudDogaWZBYnNlbnQpOwoKICB2b2lkIHVwZGF0ZUFsbChWIHVwZGF0ZShTdHJpbmcga2V5LCBWIHZhbHVlKSkgewogICAgX21hcC51cGRhdGVBbGwodXBkYXRlKTsKICB9CgogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KFN0cmluZyBrZXksIFYgdmFsdWUpKSB7CiAgICBfbWFwLnJlbW92ZVdoZXJlKHRlc3QpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX21hcC50b1N0cmluZygpOwp9CoC0AE5OPAERARItKy0tJCEpAQY2BUobBTZAMD46RgU/BiI3SislKCEBLDw+MgEcKx9QHRQGEwQBQig/AT43OyYBIi0kLh8WCCEGHQQBJCMdFAYTBAFJAS8lIB02HzYpHx0WDElGQUkcLiE0MAwKTQ8hCAYBKB8NIAYEASsCAUNEQDQBIjxBTyslBAEsOgQBJkQEAVEBERIEAS4VBAEqKSEkKgE9AU4bAT1CATIcBAE1HAQBKAIBGmRhcnQ6aW8vcGxhdGZvcm1faW1wbC5kYXJ0M29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vcGxhdGZvcm1fcGF0Y2guZGFydId3Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvbW1vbl9wYXRjaC5kYXJ0IjsKCkBwYXRjaApAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9QbGF0Zm9ybSB7CiAgQHBhdGNoCiAgc3RhdGljIGludCBfbnVtYmVyT2ZQcm9jZXNzb3JzKCkgbmF0aXZlICJQbGF0Zm9ybV9OdW1iZXJPZlByb2Nlc3NvcnMiOwogIEBwYXRjaAogIHN0YXRpYyBTdHJpbmcgX3BhdGhTZXBhcmF0b3IoKSBuYXRpdmUgIlBsYXRmb3JtX1BhdGhTZXBhcmF0b3IiOwogIEBwYXRjaAogIHN0YXRpYyBTdHJpbmcgX29wZXJhdGluZ1N5c3RlbSgpIG5hdGl2ZSAiUGxhdGZvcm1fT3BlcmF0aW5nU3lzdGVtIjsKICBAcGF0Y2gKICBzdGF0aWMgX29wZXJhdGluZ1N5c3RlbVZlcnNpb24oKSBuYXRpdmUgIlBsYXRmb3JtX09wZXJhdGluZ1N5c3RlbVZlcnNpb24iOwogIEBwYXRjaAogIHN0YXRpYyBfbG9jYWxIb3N0bmFtZSgpIG5hdGl2ZSAiUGxhdGZvcm1fTG9jYWxIb3N0bmFtZSI7CiAgQHBhdGNoCiAgc3RhdGljIF9leGVjdXRhYmxlKCkgbmF0aXZlICJQbGF0Zm9ybV9FeGVjdXRhYmxlTmFtZSI7CiAgQHBhdGNoCiAgc3RhdGljIF9yZXNvbHZlZEV4ZWN1dGFibGUoKSBuYXRpdmUgIlBsYXRmb3JtX1Jlc29sdmVkRXhlY3V0YWJsZU5hbWUiOwogIEBwYXRjaAogIHN0YXRpYyBfZW52aXJvbm1lbnQoKSBuYXRpdmUgIlBsYXRmb3JtX0Vudmlyb25tZW50IjsKICBAcGF0Y2gKICBzdGF0aWMgTGlzdDxTdHJpbmc+IF9leGVjdXRhYmxlQXJndW1lbnRzKCkKICAgICAgbmF0aXZlICJQbGF0Zm9ybV9FeGVjdXRhYmxlQXJndW1lbnRzIjsKICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIF92ZXJzaW9uKCkgbmF0aXZlICJQbGF0Zm9ybV9HZXRWZXJzaW9uIjsKCiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBfbG9jYWxlTmFtZSgpIG5hdGl2ZSAiUGxhdGZvcm1fTG9jYWxlTmFtZSI7CgogIEBwYXRjaAogIHN0YXRpYyBTdHJpbmcgX3BhY2thZ2VSb290KCkgPT4gVk1MaWJyYXJ5SG9va3MucGFja2FnZVJvb3RTdHJpbmc7CiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBfcGFja2FnZUNvbmZpZygpID0+IFZNTGlicmFyeUhvb2tzLnBhY2thZ2VDb25maWdTdHJpbmc7CgogIEBwYXRjaAogIHN0YXRpYyBVcmkgX3NjcmlwdCgpID0+IFZNTGlicmFyeUhvb2tzLnBsYXRmb3JtU2NyaXB0OwoKICAvLyBUaGlzIHNjcmlwdCBzaW5nbGV0b24gaXMgd3JpdHRlbiB0byBieSB0aGUgZW1iZWRkZXIgaWYgYXBwbGljYWJsZS4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgc3RhdGljIHZvaWQgc2V0IF9uYXRpdmVTY3JpcHQoU3RyaW5nIHBhdGgpIHsKICAgIFZNTGlicmFyeUhvb2tzLnBsYXRmb3JtU2NyaXB0ID0gKCgpIHsKICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgnaHR0cDonKSB8fAogICAgICAgICAgcGF0aC5zdGFydHNXaXRoKCdodHRwczonKSB8fAogICAgICAgICAgcGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlOicpIHx8CiAgICAgICAgICBwYXRoLnN0YXJ0c1dpdGgoJ2RhcnQ6JykgfHwKICAgICAgICAgIHBhdGguc3RhcnRzV2l0aCgnZGF0YTonKSB8fAogICAgICAgICAgcGF0aC5zdGFydHNXaXRoKCdmaWxlOicpKSB7CiAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShwYXRoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gVXJpLmJhc2UucmVzb2x2ZVVyaShuZXcgVXJpLmZpbGUocGF0aCkpOwogICAgICB9CiAgICB9KTsKICB9Cn0KPQBOTjwBIAEHGhIJSQlCCUYJTQk7CTkJSQk3CS0tCTkBCTwBCUQJSAEJOQFIHC8qJicpJiYmIA84CAgEAgEhZGFydDppby1wYXRjaC9wbGF0Zm9ybV9wYXRjaC5kYXJ0K29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9wcm9jZXNzLmRhcnTAAGftLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8vIFRPRE8oYWdlcik6IFRoZSBvbmx5IHJlYXNvbiBmb3IgdGhpcyBjbGFzcyBpcyB0aGF0IHdlCi8vIGNhbm5vdCBwYXRjaCBhIHRvcC1sZXZlbCBhdCB0aGlzIHBvaW50LgpjbGFzcyBfUHJvY2Vzc1V0aWxzIHsKICBleHRlcm5hbCBzdGF0aWMgdm9pZCBfZXhpdChpbnQgc3RhdHVzKTsKICBleHRlcm5hbCBzdGF0aWMgdm9pZCBfc2V0RXhpdENvZGUoaW50IHN0YXR1cyk7CiAgZXh0ZXJuYWwgc3RhdGljIGludCBfZ2V0RXhpdENvZGUoKTsKICBleHRlcm5hbCBzdGF0aWMgdm9pZCBfc2xlZXAoaW50IG1pbGxpcyk7CiAgZXh0ZXJuYWwgc3RhdGljIGludCBfcGlkKFByb2Nlc3MgcHJvY2Vzcyk7CiAgZXh0ZXJuYWwgc3RhdGljIFN0cmVhbTxQcm9jZXNzU2lnbmFsPiBfd2F0Y2hTaWduYWwoUHJvY2Vzc1NpZ25hbCBzaWduYWwpOwp9CgovKioKICogRXhpdCB0aGUgRGFydCBWTSBwcm9jZXNzIGltbWVkaWF0ZWx5IHdpdGggdGhlIGdpdmVuIGV4aXQgY29kZS4KICoKICogVGhpcyBkb2VzIG5vdCB3YWl0IGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgdG8gdGVybWluYXRlLiBVc2luZwogKiBbZXhpdF0gaXMgdGhlcmVmb3JlIHZlcnkgbGlrZWx5IHRvIGxvc2UgZGF0YS4KICoKICogV2hpbGUgZGVidWdnaW5nLCB0aGUgVk0gd2lsbCBub3QgcmVzcGVjdCB0aGUgYC0tcGF1c2UtaXNvbGF0ZXMtb24tZXhpdGAKICogZmxhZyBpZiBbZXhpdF0gaXMgY2FsbGVkIGFzIGludm9raW5nIHRoaXMgbWV0aG9kIGNhdXNlcyB0aGUgRGFydCBWTQogKiBwcm9jZXNzIHRvIHNodXRkb3duIGltbWVkaWF0ZWx5LiBUbyBwcm9wZXJseSBicmVhayBvbiBleGl0LCBjb25zaWRlcgogKiBjYWxsaW5nIFtkZWJ1Z2dlcl0gZnJvbSBgZGFydDpkZXZlbG9wZXJgIG9yIFtJc29sYXRlLnBhdXNlXSBmcm9tCiAqIGBkYXJ0Omlzb2xhdGVgIG9uIFtJc29sYXRlLmN1cnJlbnRdIHRvIHBhdXNlIHRoZSBpc29sYXRlIGJlZm9yZQogKiBpbnZva2luZyBbZXhpdF0uCiAqCiAqIFRoZSBoYW5kbGluZyBvZiBleGl0IGNvZGVzIGlzIHBsYXRmb3JtIHNwZWNpZmljLgogKgogKiBPbiBMaW51eCBhbmQgT1MgWCBhbiBleGl0IGNvZGUgZm9yIG5vcm1hbCB0ZXJtaW5hdGlvbiB3aWxsIGFsd2F5cwogKiBiZSBpbiB0aGUgcmFuZ2UgWzAuLjI1NV0uIElmIGFuIGV4aXQgY29kZSBvdXRzaWRlIHRoaXMgcmFuZ2UgaXMKICogc2V0IHRoZSBhY3R1YWwgZXhpdCBjb2RlIHdpbGwgYmUgdGhlIGxvd2VyIDggYml0cyBtYXNrZWQgb2ZmIGFuZAogKiB0cmVhdGVkIGFzIGFuIHVuc2lnbmVkIHZhbHVlLiBFLmcuIHVzaW5nIGFuIGV4aXQgY29kZSBvZiAtMSB3aWxsCiAqIHJlc3VsdCBpbiBhbiBhY3R1YWwgZXhpdCBjb2RlIG9mIDI1NSBiZWluZyByZXBvcnRlZC4KICoKICogT24gV2luZG93cyB0aGUgZXhpdCBjb2RlIGNhbiBiZSBzZXQgdG8gYW55IDMyLWJpdCB2YWx1ZS4gSG93ZXZlcgogKiBzb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIHJlcG9ydGluZyBzeXN0ZW0gZXJyb3JzIGxpa2UKICogY3Jhc2hlcy4KICoKICogQmVzaWRlcyB0aGlzIHRoZSBEYXJ0IGV4ZWN1dGFibGUgaXRzZWxmIHVzZXMgYW4gZXhpdCBjb2RlIG9mIGAyNTRgCiAqIGZvciByZXBvcnRpbmcgY29tcGlsZSB0aW1lIGVycm9ycyBhbmQgYW4gZXhpdCBjb2RlIG9mIGAyNTVgIGZvcgogKiByZXBvcnRpbmcgcnVudGltZSBlcnJvciAodW5oYW5kbGVkIGV4Y2VwdGlvbikuCiAqCiAqIER1ZSB0byB0aGVzZSBmYWN0cyBpdCBpcyByZWNvbW1lbmRlZCB0byBvbmx5IHVzZSBleGl0IGNvZGVzIGluIHRoZQogKiByYW5nZSBbMC4uMTI3XSBmb3IgY29tbXVuaWNhdGluZyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgYSBEYXJ0CiAqIHByb2dyYW0gdG8gdGhlIHN1cnJvdW5kaW5nIGVudmlyb25tZW50LiBUaGlzIHdpbGwgYXZvaWQgYW55CiAqIGNyb3NzLXBsYXRmb3JtIGlzc3Vlcy4KICovCnZvaWQgZXhpdChpbnQgY29kZSkgewogIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGNvZGUsICJjb2RlIik7CiAgaWYgKCFfRW1iZWRkZXJDb25maWcuX21heUV4aXQpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJUaGlzIGVtYmVkZGVyIGRpc2FsbG93cyBjYWxsaW5nIGRhcnQ6aW8ncyBleGl0KCkiKTsKICB9CiAgX1Byb2Nlc3NVdGlscy5fZXhpdChjb2RlKTsKfQoKLyoqCiAqIFNldCB0aGUgZ2xvYmFsIGV4aXQgY29kZSBmb3IgdGhlIERhcnQgVk0uCiAqCiAqIFRoZSBleGl0IGNvZGUgaXMgZ2xvYmFsIGZvciB0aGUgRGFydCBWTSBhbmQgdGhlIGxhc3QgYXNzaWdubWVudCB0bwogKiBleGl0Q29kZSBmcm9tIGFueSBpc29sYXRlIGRldGVybWluZXMgdGhlIGV4aXQgY29kZSBvZiB0aGUgRGFydCBWTQogKiBvbiBub3JtYWwgdGVybWluYXRpb24uCiAqCiAqIERlZmF1bHQgdmFsdWUgaXMgYDBgLgogKgogKiBTZWUgW2V4aXRdIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjaG9zZSBhIHZhbHVlIGZvciB0aGUKICogZXhpdCBjb2RlLgogKi8Kdm9pZCBzZXQgZXhpdENvZGUoaW50IGNvZGUpIHsKICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChjb2RlLCAiY29kZSIpOwogIF9Qcm9jZXNzVXRpbHMuX3NldEV4aXRDb2RlKGNvZGUpOwp9CgovKioKICogR2V0IHRoZSBnbG9iYWwgZXhpdCBjb2RlIGZvciB0aGUgRGFydCBWTS4KICoKICogVGhlIGV4aXQgY29kZSBpcyBnbG9iYWwgZm9yIHRoZSBEYXJ0IFZNIGFuZCB0aGUgbGFzdCBhc3NpZ25tZW50IHRvCiAqIGV4aXRDb2RlIGZyb20gYW55IGlzb2xhdGUgZGV0ZXJtaW5lcyB0aGUgZXhpdCBjb2RlIG9mIHRoZSBEYXJ0IFZNCiAqIG9uIG5vcm1hbCB0ZXJtaW5hdGlvbi4KICoKICogU2VlIFtleGl0XSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY2hvc2UgYSB2YWx1ZSBmb3IgdGhlCiAqIGV4aXQgY29kZS4KICovCmludCBnZXQgZXhpdENvZGUgPT4gX1Byb2Nlc3NVdGlscy5fZ2V0RXhpdENvZGUoKTsKCi8qKgogKiBTbGVlcCBmb3IgdGhlIGR1cmF0aW9uIHNwZWNpZmllZCBpbiBbZHVyYXRpb25dLgogKgogKiBVc2UgdGhpcyB3aXRoIGNhcmUsIGFzIG5vIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGNhbiBiZSBwcm9jZXNzZWQKICogaW4gYSBpc29sYXRlIHdoaWxlIGl0IGlzIGJsb2NrZWQgaW4gYSBbc2xlZXBdIGNhbGwuCiAqLwp2b2lkIHNsZWVwKER1cmF0aW9uIGR1cmF0aW9uKSB7CiAgaW50IG1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uLmluTWlsbGlzZWNvbmRzOwogIGlmIChtaWxsaXNlY29uZHMgPCAwKSB7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigic2xlZXA6IGR1cmF0aW9uIGNhbm5vdCBiZSBuZWdhdGl2ZSIpOwogIH0KICBpZiAoIV9FbWJlZGRlckNvbmZpZy5fbWF5U2xlZXApIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJUaGlzIGVtYmVkZGVyIGRpc2FsbG93cyBjYWxsaW5nIGRhcnQ6aW8ncyBzbGVlcCgpIik7CiAgfQogIF9Qcm9jZXNzVXRpbHMuX3NsZWVwKG1pbGxpc2Vjb25kcyk7Cn0KCi8qKgogKiBSZXR1cm5zIHRoZSBQSUQgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KICovCmludCBnZXQgcGlkID0+IF9Qcm9jZXNzVXRpbHMuX3BpZChudWxsKTsKCi8qKgogKiBbUHJvY2Vzc0luZm9dIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHJldHJpZXZpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlCiAqIGN1cnJlbnQgcHJvY2Vzcy4KICovCmNsYXNzIFByb2Nlc3NJbmZvIHsKICAvKioKICAgKiBUaGUgY3VycmVudCByZXNpZGVudCBzZXQgc2l6ZSBvZiBtZW1vcnkgZm9yIHRoZSBwcm9jZXNzLgogICAqCiAgICogTm90ZSB0aGF0IHRoZSBtZWFuaW5nIG9mIHRoaXMgZmllbGQgaXMgcGxhdGZvcm0gZGVwZW5kZW50LiBGb3IgZXhhbXBsZSwKICAgKiBzb21lIG1lbW9yeSBhY2NvdW50ZWQgZm9yIGhlcmUgbWF5IGJlIHNoYXJlZCB3aXRoIG90aGVyIHByb2Nlc3Nlcywgb3IgaWYKICAgKiB0aGUgc2FtZSBwYWdlIGlzIG1hcHBlZCBpbnRvIGEgcHJvY2VzcydzIGFkZHJlc3Mgc3BhY2UsIGl0IG1heSBiZSBjb3VudGVkCiAgICogdHdpY2UuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIGludCBnZXQgY3VycmVudFJzczsKCiAgLyoqCiAgICogVGhlIGhpZ2gtd2F0ZXJtYXJrIGluIGJ5dGVzIGZvciB0aGUgcmVzaWRlbnQgc2V0IHNpemUgb2YgbWVtb3J5IGZvciB0aGUKICAgKiBwcm9jZXNzLgogICAqCiAgICogTm90ZSB0aGF0IHRoZSBtZWFuaW5nIG9mIHRoaXMgZmllbGQgaXMgcGxhdGZvcm0gZGVwZW5kZW50LiBGb3IgZXhhbXBsZSwKICAgKiBzb21lIG1lbW9yeSBhY2NvdW50ZWQgZm9yIGhlcmUgbWF5IGJlIHNoYXJlZCB3aXRoIG90aGVyIHByb2Nlc3Nlcywgb3IgaWYKICAgKiB0aGUgc2FtZSBwYWdlIGlzIG1hcHBlZCBpbnRvIGEgcHJvY2VzcydzIGFkZHJlc3Mgc3BhY2UsIGl0IG1heSBiZSBjb3VudGVkCiAgICogdHdpY2UuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIGludCBnZXQgbWF4UnNzOwp9CgovKioKICogTW9kZXMgZm9yIHJ1bm5pbmcgYSBuZXcgcHJvY2Vzcy4KICovCmNsYXNzIFByb2Nlc3NTdGFydE1vZGUgewogIC8vLyBOb3JtYWwgY2hpbGQgcHJvY2Vzcy4KICBzdGF0aWMgY29uc3Qgbm9ybWFsID0gY29uc3QgUHJvY2Vzc1N0YXJ0TW9kZS5faW50ZXJuYWwoMCk7CiAgQERlcHJlY2F0ZWQoIlVzZSBub3JtYWwgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IE5PUk1BTCA9IG5vcm1hbDsKCiAgLy8vIFN0ZGlvIGhhbmRsZXMgYXJlIGluaGVyaXRlZCBieSB0aGUgY2hpbGQgcHJvY2Vzcy4KICBzdGF0aWMgY29uc3QgaW5oZXJpdFN0ZGlvID0gY29uc3QgUHJvY2Vzc1N0YXJ0TW9kZS5faW50ZXJuYWwoMSk7CiAgQERlcHJlY2F0ZWQoIlVzZSBpbmhlcml0U3RkaW8gaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IElOSEVSSVRfU1RESU8gPSBpbmhlcml0U3RkaW87CgogIC8vLyBEZXRhY2hlZCBjaGlsZCBwcm9jZXNzIHdpdGggbm8gb3BlbiBjb21tdW5pY2F0aW9uIGNoYW5uZWwuCiAgc3RhdGljIGNvbnN0IGRldGFjaGVkID0gY29uc3QgUHJvY2Vzc1N0YXJ0TW9kZS5faW50ZXJuYWwoMik7CiAgQERlcHJlY2F0ZWQoIlVzZSBkZXRhY2hlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgREVUQUNIRUQgPSBkZXRhY2hlZDsKCiAgLy8vIERldGFjaGVkIGNoaWxkIHByb2Nlc3Mgd2l0aCBzdGRpbiwgc3Rkb3V0IGFuZCBzdGRlcnIgc3RpbGwgb3BlbgogIC8vLyBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBjaGlsZC4KICBzdGF0aWMgY29uc3QgZGV0YWNoZWRXaXRoU3RkaW8gPSBjb25zdCBQcm9jZXNzU3RhcnRNb2RlLl9pbnRlcm5hbCgzKTsKICBARGVwcmVjYXRlZCgiVXNlIGRldGFjaGVkV2l0aFN0ZGlvIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBERVRBQ0hFRF9XSVRIX1NURElPID0gZGV0YWNoZWRXaXRoU3RkaW87CgogIHN0YXRpYyBMaXN0PFByb2Nlc3NTdGFydE1vZGU+IGdldCB2YWx1ZXMgPT4gY29uc3QgPFByb2Nlc3NTdGFydE1vZGU+WwogICAgICAgIG5vcm1hbCwKICAgICAgICBpbmhlcml0U3RkaW8sCiAgICAgICAgZGV0YWNoZWQsCiAgICAgICAgZGV0YWNoZWRXaXRoU3RkaW8KICAgICAgXTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICBjb25zdCBbIm5vcm1hbCIsICJpbmhlcml0U3RkaW8iLCAiZGV0YWNoZWQiLCAiZGV0YWNoZWRXaXRoU3RkaW8iXVtfbW9kZV07CgogIGZpbmFsIGludCBfbW9kZTsKICBjb25zdCBQcm9jZXNzU3RhcnRNb2RlLl9pbnRlcm5hbCh0aGlzLl9tb2RlKTsKfQoKLyoqCiAqIFRoZSBtZWFucyB0byBleGVjdXRlIGEgcHJvZ3JhbS4KICoKICogVXNlIHRoZSBzdGF0aWMgW3N0YXJ0XSBhbmQgW3J1bl0gbWV0aG9kcyB0byBzdGFydCBhIG5ldyBwcm9jZXNzLgogKiBUaGUgcnVuIG1ldGhvZCBleGVjdXRlcyB0aGUgcHJvY2VzcyBub24taW50ZXJhY3RpdmVseSB0byBjb21wbGV0aW9uLgogKiBJbiBjb250cmFzdCwgdGhlIHN0YXJ0IG1ldGhvZCBhbGxvd3MgeW91ciBjb2RlIHRvIGludGVyYWN0IHdpdGggdGhlCiAqIHJ1bm5pbmcgcHJvY2Vzcy4KICoKICogIyMgU3RhcnQgYSBwcm9jZXNzIHdpdGggdGhlIHJ1biBtZXRob2QKICoKICogVGhlIGZvbGxvd2luZyBjb2RlIHNhbXBsZSB1c2VzIHRoZSBydW4gbWV0aG9kIHRvIGNyZWF0ZSBhIHByb2Nlc3MKICogdGhhdCBydW5zIHRoZSBVTklYIGNvbW1hbmQgYGxzYCwgd2hpY2ggbGlzdHMgdGhlIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5LgogKiBUaGUgcnVuIG1ldGhvZCBjb21wbGV0ZXMgd2l0aCBhIFtQcm9jZXNzUmVzdWx0XSBvYmplY3Qgd2hlbiB0aGUgcHJvY2VzcwogKiB0ZXJtaW5hdGVzLiBUaGlzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgb3V0cHV0IGFuZCBleGl0IGNvZGUgZnJvbSB0aGUKICogcHJvY2Vzcy4gVGhlIHJ1biBtZXRob2QgZG9lcyBub3QgcmV0dXJuIGEgUHJvY2VzcyBvYmplY3Q7IHRoaXMgcHJldmVudHMgeW91cgogKiBjb2RlIGZyb20gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgcnVubmluZyBwcm9jZXNzLgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICoKICogICAgIG1haW4oKSB7CiAqICAgICAgIC8vIExpc3QgYWxsIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbiBVTklYLWxpa2Ugc3lzdGVtcy4KICogICAgICAgUHJvY2Vzcy5ydW4oJ2xzJywgWyctbCddKS50aGVuKChQcm9jZXNzUmVzdWx0IHJlc3VsdHMpIHsKICogICAgICAgICBwcmludChyZXN1bHRzLnN0ZG91dCk7CiAqICAgICAgIH0pOwogKiAgICAgfQogKgogKiAjIyBTdGFydCBhIHByb2Nlc3Mgd2l0aCB0aGUgc3RhcnQgbWV0aG9kCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB1c2VzIHN0YXJ0IHRvIGNyZWF0ZSB0aGUgcHJvY2Vzcy4KICogVGhlIHN0YXJ0IG1ldGhvZCByZXR1cm5zIGEgW0Z1dHVyZV0gZm9yIGEgUHJvY2VzcyBvYmplY3QuCiAqIFdoZW4gdGhlIGZ1dHVyZSBjb21wbGV0ZXMgdGhlIHByb2Nlc3MgaXMgc3RhcnRlZCBhbmQKICogeW91ciBjb2RlIGNhbiBpbnRlcmFjdCB3aXRoIHRoZQogKiBQcm9jZXNzOiB3cml0aW5nIHRvIHN0ZGluLCBsaXN0ZW5pbmcgdG8gc3Rkb3V0LCBhbmQgc28gb24uCiAqCiAqIFRoZSBmb2xsb3dpbmcgc2FtcGxlIHN0YXJ0cyB0aGUgVU5JWCBgY2F0YCB1dGlsaXR5LCB3aGljaCB3aGVuIGdpdmVuIG5vCiAqIGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGVjaG9zIGl0cyBpbnB1dC4KICogVGhlIHByb2dyYW0gd3JpdGVzIHRvIHRoZSBwcm9jZXNzJ3Mgc3RhbmRhcmQgaW5wdXQgc3RyZWFtCiAqIGFuZCBwcmludHMgZGF0YSBmcm9tIGl0cyBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtLgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICogICAgIGltcG9ydCAnZGFydDpjb252ZXJ0JzsKICoKICogICAgIG1haW4oKSB7CiAqICAgICAgIFByb2Nlc3Muc3RhcnQoJ2NhdCcsIFtdKS50aGVuKChQcm9jZXNzIHByb2Nlc3MpIHsKICogICAgICAgICBwcm9jZXNzLnN0ZG91dAogKiAgICAgICAgICAgICAudHJhbnNmb3JtKHV0ZjguZGVjb2RlcikKICogICAgICAgICAgICAgLmxpc3RlbigoZGF0YSkgeyBwcmludChkYXRhKTsgfSk7CiAqICAgICAgICAgcHJvY2Vzcy5zdGRpbi53cml0ZWxuKCdIZWxsbywgd29ybGQhJyk7CiAqICAgICAgICAgcHJvY2Vzcy5zdGRpbi53cml0ZWxuKCdIZWxsbywgZ2FsYXh5IScpOwogKiAgICAgICAgIHByb2Nlc3Muc3RkaW4ud3JpdGVsbignSGVsbG8sIHVuaXZlcnNlIScpOwogKiAgICAgICB9KTsKICogICAgIH0KICoKICogIyMgU3RhbmRhcmQgSS9PIHN0cmVhbXMKICoKICogQXMgc2VlbiBpbiB0aGUgcHJldmlvdXMgY29kZSBzYW1wbGUsIHlvdSBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgUHJvY2VzcydzCiAqIHN0YW5kYXJkIG91dHB1dCBzdHJlYW0gdGhyb3VnaCB0aGUgZ2V0dGVyIFtzdGRvdXRdLAogKiBhbmQgeW91IGNhbiBpbnRlcmFjdCB3aXRoIHRoZSBQcm9jZXNzJ3Mgc3RhbmRhcmQgaW5wdXQgc3RyZWFtIHRocm91Z2gKICogdGhlIGdldHRlciBbc3RkaW5dLgogKiBJbiBhZGRpdGlvbiwgUHJvY2VzcyBwcm92aWRlcyBhIGdldHRlciBbc3RkZXJyXSBmb3IgdXNpbmcgdGhlIFByb2Nlc3MncwogKiBzdGFuZGFyZCBlcnJvciBzdHJlYW0uCiAqCiAqIEEgUHJvY2VzcydzIHN0cmVhbXMgYXJlIGRpc3RpbmN0IGZyb20gdGhlIHRvcC1sZXZlbCBzdHJlYW1zCiAqIGZvciB0aGUgY3VycmVudCBwcm9ncmFtLgogKgogKiAjIyBFeGl0IGNvZGVzCiAqCiAqIENhbGwgdGhlIFtleGl0Q29kZV0gbWV0aG9kIHRvIGdldCB0aGUgZXhpdCBjb2RlIG9mIHRoZSBwcm9jZXNzLgogKiBUaGUgZXhpdCBjb2RlIGluZGljYXRlcyB3aGV0aGVyIHRoZSBwcm9ncmFtIHRlcm1pbmF0ZWQgc3VjY2Vzc2Z1bGx5CiAqICh1c3VhbGx5IGluZGljYXRlZCB3aXRoIGFuIGV4aXQgY29kZSBvZiAwKSBvciB3aXRoIGFuIGVycm9yLgogKgogKiBJZiB0aGUgc3RhcnQgbWV0aG9kIGlzIHVzZWQsIHRoZSBleGl0Q29kZSBpcyBhdmFpbGFibGUgdGhyb3VnaCBhIGZ1dHVyZQogKiBvbiB0aGUgUHJvY2VzcyBvYmplY3QgKGFzIHNob3duIGluIHRoZSBleGFtcGxlIGJlbG93KS4KICogSWYgdGhlIHJ1biBtZXRob2QgaXMgdXNlZCwgdGhlIGV4aXRDb2RlIGlzIGF2YWlsYWJsZQogKiB0aHJvdWdoIGEgZ2V0dGVyIG9uIHRoZSBQcm9jZXNzUmVzdWx0IGluc3RhbmNlLgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICoKICogICAgIG1haW4oKSB7CiAqICAgICAgIFByb2Nlc3Muc3RhcnQoJ2xzJywgWyctbCddKS50aGVuKChwcm9jZXNzKSB7CiAqICAgICAgICAgLy8gR2V0IHRoZSBleGl0IGNvZGUgZnJvbSB0aGUgbmV3IHByb2Nlc3MuCiAqICAgICAgICAgcHJvY2Vzcy5leGl0Q29kZS50aGVuKChleGl0Q29kZSkgewogKiAgICAgICAgICAgcHJpbnQoJ2V4aXQgY29kZTogJGV4aXRDb2RlJyk7CiAqICAgICAgICAgfSk7CiAqICAgICAgIH0pOwogKiAgICAgfQogKgogKiAjIyBPdGhlciByZXNvdXJjZXMKICoKICogW0RhcnQgYnkgRXhhbXBsZV0oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RhcnQtYnktZXhhbXBsZS8jZGFydC1pby1hbmQtY29tbWFuZC1saW5lLWFwcHMpCiAqIHByb3ZpZGVzIGFkZGl0aW9uYWwgdGFzay1vcmllbnRlZCBjb2RlIHNhbXBsZXMgdGhhdCBzaG93IGhvdyB0byB1c2UKICogdmFyaW91cyBBUEkgZnJvbSB0aGUgW2RhcnQ6aW9dIGxpYnJhcnkuCiAqLwphYnN0cmFjdCBjbGFzcyBQcm9jZXNzIHsKICAvKioKICAgKiBSZXR1cm5zIGEgWzpGdXR1cmU6XSB3aGljaCBjb21wbGV0ZXMgd2l0aCB0aGUgZXhpdCBjb2RlIG9mIHRoZSBwcm9jZXNzCiAgICogd2hlbiB0aGUgcHJvY2VzcyBjb21wbGV0ZXMuCiAgICoKICAgKiBUaGUgaGFuZGxpbmcgb2YgZXhpdCBjb2RlcyBpcyBwbGF0Zm9ybSBzcGVjaWZpYy4KICAgKgogICAqIE9uIExpbnV4IGFuZCBPUyBYIGEgbm9ybWFsIGV4aXQgY29kZSB3aWxsIGJlIGEgcG9zaXRpdmUgdmFsdWUgaW4KICAgKiB0aGUgcmFuZ2UgWzAuLjI1NV0uIElmIHRoZSBwcm9jZXNzIHdhcyB0ZXJtaW5hdGVkIGR1ZSB0byBhIHNpZ25hbAogICAqIHRoZSBleGl0IGNvZGUgd2lsbCBiZSBhIG5lZ2F0aXZlIHZhbHVlIGluIHRoZSByYW5nZSBbLTI1NS4uLTFdLAogICAqIHdoZXJlIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZXhpdCBjb2RlIGlzIHRoZSBzaWduYWwKICAgKiBudW1iZXIuIEZvciBleGFtcGxlLCBpZiBhIHByb2Nlc3MgY3Jhc2hlcyBkdWUgdG8gYSBzZWdtZW50YXRpb24KICAgKiB2aW9sYXRpb24gdGhlIGV4aXQgY29kZSB3aWxsIGJlIC0xMSwgYXMgdGhlIHNpZ25hbCBTSUdTRUdWIGhhcyB0aGUKICAgKiBudW1iZXIgMTEuCiAgICoKICAgKiBPbiBXaW5kb3dzIGEgcHJvY2VzcyBjYW4gcmVwb3J0IGFueSAzMi1iaXQgdmFsdWUgYXMgYW4gZXhpdAogICAqIGNvZGUuIFdoZW4gcmV0dXJuaW5nIHRoZSBleGl0IGNvZGUgdGhpcyBleGl0IGNvZGUgaXMgdHVybmVkIGludG8KICAgKiBhIHNpZ25lZCB2YWx1ZS4gU29tZSBzcGVjaWFsIHZhbHVlcyBhcmUgdXNlZCB0byByZXBvcnQKICAgKiB0ZXJtaW5hdGlvbiBkdWUgdG8gc29tZSBzeXN0ZW0gZXZlbnQuIEUuZy4gaWYgYSBwcm9jZXNzIGNyYXNoZXMKICAgKiBkdWUgdG8gYW4gYWNjZXNzIHZpb2xhdGlvbiB0aGUgMzItYml0IGV4aXQgY29kZSBpcyBgMHhjMDAwMDAwNWAsCiAgICogd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBhcyB0aGUgbmVnYXRpdmUgbnVtYmVyIGAtMTA3Mzc0MTgxOWAuIFRvCiAgICogZ2V0IHRoZSBvcmlnaW5hbCAzMi1iaXQgdmFsdWUgdXNlIGAoMHgxMDAwMDAwMDAgKyBleGl0Q29kZSkgJgogICAqIDB4ZmZmZmZmZmZgLgogICAqCiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgW3N0ZG91dF0gYW5kIFtzdGRlcnJdIGhhdmUgZmluaXNoZWQgcmVwb3J0aW5nCiAgICogdGhlIGJ1ZmZlcmVkIG91dHB1dCBvZiB0aGUgcHJvY2VzcyB3aGVuIHRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzLgogICAqIFRvIGJlIHN1cmUgdGhhdCBhbGwgb3V0cHV0IGlzIGNhcHR1cmVkLAogICAqIHdhaXQgZm9yIHRoZSBkb25lIGV2ZW50IG9uIHRoZSBzdHJlYW1zLgogICAqLwogIEZ1dHVyZTxpbnQ+IGdldCBleGl0Q29kZTsKCiAgLyoqCiAgICogU3RhcnRzIGEgcHJvY2VzcyBydW5uaW5nIHRoZSBbZXhlY3V0YWJsZV0gd2l0aCB0aGUgc3BlY2lmaWVkCiAgICogW2FyZ3VtZW50c10uIFJldHVybnMgYSBbOkZ1dHVyZTxQcm9jZXNzPjpdIHRoYXQgY29tcGxldGVzIHdpdGggYQogICAqIFByb2Nlc3MgaW5zdGFuY2Ugd2hlbiB0aGUgcHJvY2VzcyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkKICAgKiBzdGFydGVkLiBUaGF0IFtQcm9jZXNzXSBvYmplY3QgY2FuIGJlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUKICAgKiBwcm9jZXNzLiBJZiB0aGUgcHJvY2VzcyBjYW5ub3QgYmUgc3RhcnRlZCB0aGUgcmV0dXJuZWQgW0Z1dHVyZV0KICAgKiBjb21wbGV0ZXMgd2l0aCBhbiBleGNlcHRpb24uCiAgICoKICAgKiBVc2UgW3dvcmtpbmdEaXJlY3RvcnldIHRvIHNldCB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBwcm9jZXNzLiBOb3RlCiAgICogdGhhdCB0aGUgY2hhbmdlIG9mIGRpcmVjdG9yeSBvY2N1cnMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgcHJvY2VzcyBvbiBzb21lCiAgICogcGxhdGZvcm1zLCB3aGljaCBtYXkgaGF2ZSBpbXBhY3Qgd2hlbiB1c2luZyByZWxhdGl2ZSBwYXRocyBmb3IgdGhlCiAgICogZXhlY3V0YWJsZSBhbmQgdGhlIGFyZ3VtZW50cy4KICAgKgogICAqIFVzZSBbZW52aXJvbm1lbnRdIHRvIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgcHJvY2Vzcy4gSWYgbm90CiAgICogc2V0IHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgcGFyZW50IHByb2Nlc3MgaXMgaW5oZXJpdGVkLiBDdXJyZW50bHksIG9ubHkKICAgKiBVUy1BU0NJSSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHN1cHBvcnRlZCBhbmQgZXJyb3JzIGFyZSBsaWtlbHkgdG8gb2NjdXIKICAgKiBpZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIGNvZGUtcG9pbnRzIG91dHNpZGUgdGhlIFVTLUFTQ0lJIHJhbmdlIGlzCiAgICogcGFzc2VkIGluLgogICAqCiAgICogSWYgW2luY2x1ZGVQYXJlbnRFbnZpcm9ubWVudF0gaXMgYHRydWVgLCB0aGUgcHJvY2VzcydzIGVudmlyb25tZW50IHdpbGwKICAgKiBpbmNsdWRlIHRoZSBwYXJlbnQgcHJvY2VzcydzIGVudmlyb25tZW50LCB3aXRoIFtlbnZpcm9ubWVudF0gdGFraW5nCiAgICogcHJlY2VkZW5jZS4gRGVmYXVsdCBpcyBgdHJ1ZWAuCiAgICoKICAgKiBJZiBbcnVuSW5TaGVsbF0gaXMgYHRydWVgLCB0aGUgcHJvY2VzcyB3aWxsIGJlIHNwYXduZWQgdGhyb3VnaCBhIHN5c3RlbQogICAqIHNoZWxsLiBPbiBMaW51eCBhbmQgT1MgWCwgWzovYmluL3NoOl0gaXMgdXNlZCwgd2hpbGUKICAgKiBbOiVXSU5ESVIlXHN5c3RlbTMyXGNtZC5leGU6XSBpcyB1c2VkIG9uIFdpbmRvd3MuCiAgICoKICAgKiBVc2VycyBtdXN0IHJlYWQgYWxsIGRhdGEgY29taW5nIG9uIHRoZSBbc3Rkb3V0XSBhbmQgW3N0ZGVycl0KICAgKiBzdHJlYW1zIG9mIHByb2Nlc3NlcyBzdGFydGVkIHdpdGggWzpQcm9jZXNzLnN0YXJ0Ol0uIElmIHRoZSB1c2VyCiAgICogZG9lcyBub3QgcmVhZCBhbGwgZGF0YSBvbiB0aGUgc3RyZWFtcyB0aGUgdW5kZXJseWluZyBzeXN0ZW0KICAgKiByZXNvdXJjZXMgd2lsbCBub3QgYmUgcmVsZWFzZWQgc2luY2UgdGhlcmUgaXMgc3RpbGwgcGVuZGluZyBkYXRhLgogICAqCiAgICogVGhlIGZvbGxvd2luZyBjb2RlIHVzZXMgYFByb2Nlc3Muc3RhcnRgIHRvIGdyZXAgZm9yIGBtYWluYCBpbiB0aGUKICAgKiBmaWxlIGB0ZXN0LmRhcnRgIG9uIExpbnV4LgogICAqCiAgICogICAgIFByb2Nlc3Muc3RhcnQoJ2dyZXAnLCBbJy1pJywgJ21haW4nLCAndGVzdC5kYXJ0J10pLnRoZW4oKHByb2Nlc3MpIHsKICAgKiAgICAgICBzdGRvdXQuYWRkU3RyZWFtKHByb2Nlc3Muc3Rkb3V0KTsKICAgKiAgICAgICBzdGRlcnIuYWRkU3RyZWFtKHByb2Nlc3Muc3RkZXJyKTsKICAgKiAgICAgfSk7CiAgICoKICAgKiBJZiBbbW9kZV0gaXMgW1Byb2Nlc3NTdGFydE1vZGUubm9ybWFsXSAodGhlIGRlZmF1bHQpIGEgY2hpbGQKICAgKiBwcm9jZXNzIHdpbGwgYmUgc3RhcnRlZCB3aXRoIGBzdGRpbmAsIGBzdGRvdXRgIGFuZCBgc3RkZXJyYAogICAqIGNvbm5lY3RlZC4KICAgKgogICAqIElmIGBtb2RlYCBpcyBbUHJvY2Vzc1N0YXJ0TW9kZS5kZXRhY2hlZF0gYSBkZXRhY2hlZCBwcm9jZXNzIHdpbGwKICAgKiBiZSBjcmVhdGVkLiBBIGRldGFjaGVkIHByb2Nlc3MgaGFzIG5vIGNvbm5lY3Rpb24gdG8gaXRzIHBhcmVudCwKICAgKiBhbmQgY2FuIGtlZXAgcnVubmluZyBvbiBpdHMgb3duIHdoZW4gdGhlIHBhcmVudCBkaWVzLiBUaGUgb25seQogICAqIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBmcm9tIGEgZGV0YWNoZWQgcHJvY2VzcyBpcyBpdHMgYHBpZGAuIFRoZXJlCiAgICogaXMgbm8gY29ubmVjdGlvbiB0byBpdHMgYHN0ZGluYCwgYHN0ZG91dGAgb3IgYHN0ZGVycmAsIG5vciB3aWxsCiAgICogdGhlIHByb2Nlc3MnIGV4aXQgY29kZSBiZWNvbWUgYXZhaWxhYmxlIHdoZW4gaXQgdGVybWluYXRlcy4KICAgKgogICAqIElmIGBtb2RlYCBpcyBbUHJvY2Vzc1N0YXJ0TW9kZS5kZXRhY2hlZFdpdGhTdGRpb10gYSBkZXRhY2hlZAogICAqIHByb2Nlc3Mgd2lsbCBiZSBjcmVhdGVkIHdoZXJlIHRoZSBgc3RkaW5gLCBgc3Rkb3V0YCBhbmQgYHN0ZGVycmAKICAgKiBhcmUgY29ubmVjdGVkLiBUaGUgY3JlYXRvciBjYW4gY29tbXVuaWNhdGUgd2l0aCB0aGUgY2hpbGQgdGhyb3VnaAogICAqIHRoZXNlLiBUaGUgZGV0YWNoZWQgcHJvY2VzcyB3aWxsIGtlZXAgcnVubmluZyBldmVuIGlmIHRoZXNlCiAgICogY29tbXVuaWNhdGlvbiBjaGFubmVscyBhcmUgY2xvc2VkLiBUaGUgcHJvY2VzcycgZXhpdCBjb2RlIHdpbGwKICAgKiBub3QgYmVjb21lIGF2YWlsYWJsZSB3aGVuIGl0IHRlcm1pbmF0ZWQuCiAgICoKICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgYG1vZGVgIGlzIGBQcm9jZXNzU3RhcnRNb2RlLm5vcm1hbGAuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxQcm9jZXNzPiBzdGFydCgKICAgICAgU3RyaW5nIGV4ZWN1dGFibGUsIExpc3Q8U3RyaW5nPiBhcmd1bWVudHMsCiAgICAgIHtTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCwKICAgICAgYm9vbCBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQ6IHRydWUsCiAgICAgIGJvb2wgcnVuSW5TaGVsbDogZmFsc2UsCiAgICAgIFByb2Nlc3NTdGFydE1vZGUgbW9kZTogUHJvY2Vzc1N0YXJ0TW9kZS5ub3JtYWx9KTsKCiAgLyoqCiAgICogU3RhcnRzIGEgcHJvY2VzcyBhbmQgcnVucyBpdCBub24taW50ZXJhY3RpdmVseSB0byBjb21wbGV0aW9uLiBUaGUKICAgKiBwcm9jZXNzIHJ1biBpcyBbZXhlY3V0YWJsZV0gd2l0aCB0aGUgc3BlY2lmaWVkIFthcmd1bWVudHNdLgogICAqCiAgICogVXNlIFt3b3JraW5nRGlyZWN0b3J5XSB0byBzZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgcHJvY2Vzcy4gTm90ZQogICAqIHRoYXQgdGhlIGNoYW5nZSBvZiBkaXJlY3Rvcnkgb2NjdXJzIGJlZm9yZSBleGVjdXRpbmcgdGhlIHByb2Nlc3Mgb24gc29tZQogICAqIHBsYXRmb3Jtcywgd2hpY2ggbWF5IGhhdmUgaW1wYWN0IHdoZW4gdXNpbmcgcmVsYXRpdmUgcGF0aHMgZm9yIHRoZQogICAqIGV4ZWN1dGFibGUgYW5kIHRoZSBhcmd1bWVudHMuCiAgICoKICAgKiBVc2UgW2Vudmlyb25tZW50XSB0byBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIHByb2Nlc3MuIElmIG5vdAogICAqIHNldCB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIHBhcmVudCBwcm9jZXNzIGlzIGluaGVyaXRlZC4gQ3VycmVudGx5LCBvbmx5CiAgICogVVMtQVNDSUkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzdXBwb3J0ZWQgYW5kIGVycm9ycyBhcmUgbGlrZWx5IHRvIG9jY3VyCiAgICogaWYgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCBjb2RlLXBvaW50cyBvdXRzaWRlIHRoZSBVUy1BU0NJSSByYW5nZSBpcwogICAqIHBhc3NlZCBpbi4KICAgKgogICAqIElmIFtpbmNsdWRlUGFyZW50RW52aXJvbm1lbnRdIGlzIGB0cnVlYCwgdGhlIHByb2Nlc3MncyBlbnZpcm9ubWVudCB3aWxsCiAgICogaW5jbHVkZSB0aGUgcGFyZW50IHByb2Nlc3MncyBlbnZpcm9ubWVudCwgd2l0aCBbZW52aXJvbm1lbnRdIHRha2luZwogICAqIHByZWNlZGVuY2UuIERlZmF1bHQgaXMgYHRydWVgLgogICAqCiAgICogSWYgW3J1bkluU2hlbGxdIGlzIHRydWUsIHRoZSBwcm9jZXNzIHdpbGwgYmUgc3Bhd25lZCB0aHJvdWdoIGEgc3lzdGVtCiAgICogc2hlbGwuIE9uIExpbnV4IGFuZCBPUyBYLCBgL2Jpbi9zaGAgaXMgdXNlZCwgd2hpbGUKICAgKiBgJVdJTkRJUiVcc3lzdGVtMzJcY21kLmV4ZWAgaXMgdXNlZCBvbiBXaW5kb3dzLgogICAqCiAgICogVGhlIGVuY29kaW5nIHVzZWQgZm9yIGRlY29kaW5nIGBzdGRvdXRgIGFuZCBgc3RkZXJyYCBpbnRvIHRleHQgaXMKICAgKiBjb250cm9sbGVkIHRocm91Z2ggW3N0ZG91dEVuY29kaW5nXSBhbmQgW3N0ZGVyckVuY29kaW5nXS4gVGhlCiAgICogZGVmYXVsdCBlbmNvZGluZyBpcyBbc3lzdGVtRW5jb2RpbmddLiBJZiBgbnVsbGAgaXMgdXNlZCBubwogICAqIGRlY29kaW5nIHdpbGwgaGFwcGVuIGFuZCB0aGUgW1Byb2Nlc3NSZXN1bHRdIHdpbGwgaG9sZCBiaW5hcnkKICAgKiBkYXRhLgogICAqCiAgICogUmV0dXJucyBhIGBGdXR1cmU8UHJvY2Vzc1Jlc3VsdD5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhlCiAgICogcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIHByb2Nlc3MsIGkuZS4sIGV4aXQgY29kZSwgc3RhbmRhcmQgb3V0IGFuZAogICAqIHN0YW5kYXJkIGluLgogICAqCiAgICogVGhlIGZvbGxvd2luZyBjb2RlIHVzZXMgYFByb2Nlc3MucnVuYCB0byBncmVwIGZvciBgbWFpbmAgaW4gdGhlCiAgICogZmlsZSBgdGVzdC5kYXJ0YCBvbiBMaW51eC4KICAgKgogICAqICAgICBQcm9jZXNzLnJ1bignZ3JlcCcsIFsnLWknLCAnbWFpbicsICd0ZXN0LmRhcnQnXSkudGhlbigocmVzdWx0KSB7CiAgICogICAgICAgc3Rkb3V0LndyaXRlKHJlc3VsdC5zdGRvdXQpOwogICAqICAgICAgIHN0ZGVyci53cml0ZShyZXN1bHQuc3RkZXJyKTsKICAgKiAgICAgfSk7CiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxQcm9jZXNzUmVzdWx0PiBydW4oCiAgICAgIFN0cmluZyBleGVjdXRhYmxlLCBMaXN0PFN0cmluZz4gYXJndW1lbnRzLAogICAgICB7U3RyaW5nIHdvcmtpbmdEaXJlY3RvcnksCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQsCiAgICAgIGJvb2wgaW5jbHVkZVBhcmVudEVudmlyb25tZW50OiB0cnVlLAogICAgICBib29sIHJ1bkluU2hlbGw6IGZhbHNlLAogICAgICBFbmNvZGluZyBzdGRvdXRFbmNvZGluZzogc3lzdGVtRW5jb2RpbmcsCiAgICAgIEVuY29kaW5nIHN0ZGVyckVuY29kaW5nOiBzeXN0ZW1FbmNvZGluZ30pOwoKICAvKioKICAgKiBTdGFydHMgYSBwcm9jZXNzIGFuZCBydW5zIGl0IHRvIGNvbXBsZXRpb24uIFRoaXMgaXMgYSBzeW5jaHJvbm91cwogICAqIGNhbGwgYW5kIHdpbGwgYmxvY2sgdW50aWwgdGhlIGNoaWxkIHByb2Nlc3MgdGVybWluYXRlcy4KICAgKgogICAqIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciBgUHJvY2Vzcy5ydW5gLgogICAqCiAgICogUmV0dXJucyBhIGBQcm9jZXNzUmVzdWx0YCB3aXRoIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUgcHJvY2VzcywKICAgKiBpLmUuLCBleGl0IGNvZGUsIHN0YW5kYXJkIG91dCBhbmQgc3RhbmRhcmQgaW4uCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIFByb2Nlc3NSZXN1bHQgcnVuU3luYygKICAgICAgU3RyaW5nIGV4ZWN1dGFibGUsIExpc3Q8U3RyaW5nPiBhcmd1bWVudHMsCiAgICAgIHtTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCwKICAgICAgYm9vbCBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQ6IHRydWUsCiAgICAgIGJvb2wgcnVuSW5TaGVsbDogZmFsc2UsCiAgICAgIEVuY29kaW5nIHN0ZG91dEVuY29kaW5nOiBzeXN0ZW1FbmNvZGluZywKICAgICAgRW5jb2Rpbmcgc3RkZXJyRW5jb2Rpbmc6IHN5c3RlbUVuY29kaW5nfSk7CgogIC8qKgogICAqIEtpbGxzIHRoZSBwcm9jZXNzIHdpdGggaWQgW3BpZF0uCiAgICoKICAgKiBXaGVyZSBwb3NzaWJsZSwgc2VuZHMgdGhlIFtzaWduYWxdIHRvIHRoZSBwcm9jZXNzIHdpdGggaWQKICAgKiBgcGlkYC4gVGhpcyBpbmNsdWRlcyBMaW51eCBhbmQgT1MgWC4gVGhlIGRlZmF1bHQgc2lnbmFsIGlzCiAgICogW1Byb2Nlc3NTaWduYWwuc2lndGVybV0gd2hpY2ggd2lsbCBub3JtYWxseSB0ZXJtaW5hdGUgdGhlCiAgICogcHJvY2Vzcy4KICAgKgogICAqIE9uIHBsYXRmb3JtcyB3aXRob3V0IHNpZ25hbCBzdXBwb3J0LCBpbmNsdWRpbmcgV2luZG93cywgdGhlIGNhbGwKICAgKiBqdXN0IHRlcm1pbmF0ZXMgdGhlIHByb2Nlc3Mgd2l0aCBpZCBgcGlkYCBpbiBhIHBsYXRmb3JtIHNwZWNpZmljCiAgICogd2F5LCBhbmQgdGhlIGBzaWduYWxgIHBhcmFtZXRlciBpcyBpZ25vcmVkLgogICAqCiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNpZ25hbCBpcyBzdWNjZXNzZnVsbHkgZGVsaXZlcmVkIHRvIHRoZQogICAqIHByb2Nlc3MuIE90aGVyd2lzZSB0aGUgc2lnbmFsIGNvdWxkIG5vdCBiZSBzZW50LCB1c3VhbGx5IG1lYW5pbmcKICAgKiB0aGF0IHRoZSBwcm9jZXNzIGlzIGFscmVhZHkgZGVhZC4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgYm9vbCBraWxsUGlkKGludCBwaWQsCiAgICAgIFtQcm9jZXNzU2lnbmFsIHNpZ25hbCA9IFByb2Nlc3NTaWduYWwuc2lndGVybV0pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtIG9mIHRoZSBwcm9jZXNzIGFzIGEgWzpTdHJlYW06XS4KICAgKi8KICBTdHJlYW08TGlzdDxpbnQ+PiBnZXQgc3Rkb3V0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0gb2YgdGhlIHByb2Nlc3MgYXMgYSBbOlN0cmVhbTpdLgogICAqLwogIFN0cmVhbTxMaXN0PGludD4+IGdldCBzdGRlcnI7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGlucHV0IHN0cmVhbSBvZiB0aGUgcHJvY2VzcyBhcyBhbiBbSU9TaW5rXS4KICAgKi8KICBJT1NpbmsgZ2V0IHN0ZGluOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwcm9jZXNzIGlkIG9mIHRoZSBwcm9jZXNzLgogICAqLwogIGludCBnZXQgcGlkOwoKICAvKioKICAgKiBLaWxscyB0aGUgcHJvY2Vzcy4KICAgKgogICAqIFdoZXJlIHBvc3NpYmxlLCBzZW5kcyB0aGUgW3NpZ25hbF0gdG8gdGhlIHByb2Nlc3MuIFRoaXMgaW5jbHVkZXMKICAgKiBMaW51eCBhbmQgT1MgWC4gVGhlIGRlZmF1bHQgc2lnbmFsIGlzIFtQcm9jZXNzU2lnbmFsLnNpZ3Rlcm1dCiAgICogd2hpY2ggd2lsbCBub3JtYWxseSB0ZXJtaW5hdGUgdGhlIHByb2Nlc3MuCiAgICoKICAgKiBPbiBwbGF0Zm9ybXMgd2l0aG91dCBzaWduYWwgc3VwcG9ydCwgaW5jbHVkaW5nIFdpbmRvd3MsIHRoZSBjYWxsCiAgICoganVzdCB0ZXJtaW5hdGVzIHRoZSBwcm9jZXNzIGluIGEgcGxhdGZvcm0gc3BlY2lmaWMgd2F5LCBhbmQgdGhlCiAgICogYHNpZ25hbGAgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCiAgICoKICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc2lnbmFsIGlzIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQgdG8gdGhlCiAgICogcHJvY2Vzcy4gT3RoZXJ3aXNlIHRoZSBzaWduYWwgY291bGQgbm90IGJlIHNlbnQsIHVzdWFsbHkgbWVhbmluZwogICAqIHRoYXQgdGhlIHByb2Nlc3MgaXMgYWxyZWFkeSBkZWFkLgogICAqLwogIGJvb2wga2lsbChbUHJvY2Vzc1NpZ25hbCBzaWduYWwgPSBQcm9jZXNzU2lnbmFsLnNpZ3Rlcm1dKTsKfQoKLyoqCiAqIFtQcm9jZXNzUmVzdWx0XSByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgcnVubmluZyBhIG5vbi1pbnRlcmFjdGl2ZQogKiBwcm9jZXNzIHN0YXJ0ZWQgd2l0aCBbUHJvY2Vzcy5ydW5dIG9yIFtQcm9jZXNzLnJ1blN5bmNdLgogKi8KY2xhc3MgUHJvY2Vzc1Jlc3VsdCB7CiAgLyoqCiAgICogRXhpdCBjb2RlIGZvciB0aGUgcHJvY2Vzcy4KICAgKgogICAqIFNlZSBbUHJvY2Vzcy5leGl0Q29kZV0gZm9yIG1vcmUgaW5mb3JtYXRpb24gaW4gdGhlIGV4aXQgY29kZQogICAqIHZhbHVlLgogICAqLwogIGZpbmFsIGludCBleGl0Q29kZTsKCiAgLyoqCiAgICogU3RhbmRhcmQgb3V0cHV0IGZyb20gdGhlIHByb2Nlc3MuIFRoZSB2YWx1ZSB1c2VkIGZvciB0aGUKICAgKiBgc3Rkb3V0RW5jb2RpbmdgIGFyZ3VtZW50IHRvIGBQcm9jZXNzLnJ1bmAgZGV0ZXJtaW5lcyB0aGUgdHlwZS4gSWYKICAgKiBgbnVsbGAgd2FzIHVzZWQgdGhpcyB2YWx1ZSBpcyBvZiB0eXBlIGBMaXN0PGludD5gIG90aGVyd2lzZSBpdCBpcwogICAqIG9mIHR5cGUgYFN0cmluZ2AuCiAgICovCiAgZmluYWwgc3Rkb3V0OwoKICAvKioKICAgKiBTdGFuZGFyZCBlcnJvciBmcm9tIHRoZSBwcm9jZXNzLiBUaGUgdmFsdWUgdXNlZCBmb3IgdGhlCiAgICogYHN0ZGVyckVuY29kaW5nYCBhcmd1bWVudCB0byBgUHJvY2Vzcy5ydW5gIGRldGVybWluZXMgdGhlIHR5cGUuIElmCiAgICogYG51bGxgIHdhcyB1c2VkIHRoaXMgdmFsdWUgaXMgb2YgdHlwZSBgTGlzdDxpbnQ+YAogICAqIG90aGVyd2lzZSBpdCBpcyBvZiB0eXBlIGBTdHJpbmdgLgogICAqLwogIGZpbmFsIHN0ZGVycjsKCiAgLyoqCiAgICogUHJvY2VzcyBpZCBvZiB0aGUgcHJvY2Vzcy4KICAgKi8KICBmaW5hbCBpbnQgcGlkOwoKICBQcm9jZXNzUmVzdWx0KHRoaXMucGlkLCB0aGlzLmV4aXRDb2RlLCB0aGlzLnN0ZG91dCwgdGhpcy5zdGRlcnIpOwp9CgovKioKICogT24gUG9zaXggc3lzdGVtcywgW1Byb2Nlc3NTaWduYWxdIGlzIHVzZWQgdG8gc2VuZCBhIHNwZWNpZmljIHNpZ25hbAogKiB0byBhIGNoaWxkIHByb2Nlc3MsIHNlZSBbOlByb2Nlc3Mua2lsbDpdLgogKgogKiBTb21lIFtQcm9jZXNzU2lnbmFsXXMgY2FuIGFsc28gYmUgd2F0Y2hlZCwgYXMgYSB3YXkgdG8gaW50ZXJjZXB0IHRoZSBkZWZhdWx0CiAqIHNpZ25hbCBoYW5kbGVyIGFuZCBpbXBsZW1lbnQgYW5vdGhlci4gU2VlIFtQcm9jZXNzU2lnbmFsLndhdGNoXSBmb3IgbW9yZQogKiBpbmZvcm1hdGlvbi4KICovCmNsYXNzIFByb2Nlc3NTaWduYWwgewogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ2h1cCA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygxLCAiU0lHSFVQIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lnaW50ID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDIsICJTSUdJTlQiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdxdWl0ID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDMsICJTSUdRVUlUIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lnaWxsID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDQsICJTSUdJTEwiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWd0cmFwID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDUsICJTSUdUUkFQIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lnYWJydCA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXyg2LCAiU0lHQUJSVCIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ2J1cyA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXyg3LCAiU0lHQlVTIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lnZnBlID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDgsICJTSUdGUEUiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdraWxsID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDksICJTSUdLSUxMIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lndXNyMSA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygxMCwgIlNJR1VTUjEiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdzZWd2ID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDExLCAiU0lHU0VHViIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3VzcjIgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMTIsICJTSUdVU1IyIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lncGlwZSA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygxMywgIlNJR1BJUEUiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdhbHJtID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDE0LCAiU0lHQUxSTSIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3Rlcm0gPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMTUsICJTSUdURVJNIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lnY2hsZCA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygxNywgIlNJR0NITEQiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdjb250ID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDE4LCAiU0lHQ09OVCIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3N0b3AgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMTksICJTSUdTVE9QIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lndHN0cCA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygyMCwgIlNJR1RTVFAiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWd0dGluID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDIxLCAiU0lHVFRJTiIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3R0b3UgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMjIsICJTSUdUVE9VIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lndXJnID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDIzLCAiU0lHVVJHIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lneGNwdSA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygyNCwgIlNJR1hDUFUiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWd4ZnN6ID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDI1LCAiU0lHWEZTWiIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3Z0YWxybSA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygyNiwgIlNJR1ZUQUxSTSIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3Byb2YgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMjcsICJTSUdQUk9GIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lnd2luY2ggPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMjgsICJTSUdXSU5DSCIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3BvbGwgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMjksICJTSUdQT0xMIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lnc3lzID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDMxLCAiU0lHU1lTIik7CgogIEBEZXByZWNhdGVkKCJVc2Ugc2lnaHVwIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR0hVUCA9IHNpZ2h1cDsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ2ludCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdJTlQgPSBzaWdpbnQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdxdWl0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1FVSVQgPSBzaWdxdWl0OwogIEBEZXByZWNhdGVkKCJVc2Ugc2lnaWxsIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR0lMTCA9IHNpZ2lsbDsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3RyYXAgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHVFJBUCA9IHNpZ3RyYXA7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdhYnJ0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR0FCUlQgPSBzaWdhYnJ0OwogIEBEZXByZWNhdGVkKCJVc2Ugc2lnYnVzIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR0JVUyA9IHNpZ2J1czsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ2ZwZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdGUEUgPSBzaWdmcGU7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdraWxsIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR0tJTEwgPSBzaWdraWxsOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lndXNyMSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdVU1IxID0gc2lndXNyMTsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3NlZ3YgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHU0VHViA9IHNpZ3NlZ3Y7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWd1c3IyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1VTUjIgPSBzaWd1c3IyOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lncGlwZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdQSVBFID0gc2lncGlwZTsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ2Fscm0gaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHQUxSTSA9IHNpZ2Fscm07CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWd0ZXJtIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1RFUk0gPSBzaWd0ZXJtOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lnY2hsZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdDSExEID0gc2lnY2hsZDsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ2NvbnQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHQ09OVCA9IHNpZ2NvbnQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdzdG9wIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1NUT1AgPSBzaWdzdG9wOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lndHN0cCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdUU1RQID0gc2lndHN0cDsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3R0aW4gaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHVFRJTiA9IHNpZ3R0aW47CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWd0dG91IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1RUT1UgPSBzaWd0dG91OwogIEBEZXByZWNhdGVkKCJVc2Ugc2lndXJnIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1VSRyA9IHNpZ3VyZzsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3hjcHUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHWENQVSA9IHNpZ3hjcHU7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWd4ZnN6IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1hGU1ogPSBzaWd4ZnN6OwogIEBEZXByZWNhdGVkKCJVc2Ugc2lndnRhbHJtIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1ZUQUxSTSA9IHNpZ3Z0YWxybTsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3Byb2YgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHUFJPRiA9IHNpZ3Byb2Y7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWd3aW5jaCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdXSU5DSCA9IHNpZ3dpbmNoOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lncG9sbCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdQT0xMID0gc2lncG9sbDsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3N5cyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdTWVMgPSBzaWdzeXM7CgogIGZpbmFsIGludCBfc2lnbmFsTnVtYmVyOwogIGZpbmFsIFN0cmluZyBfbmFtZTsKCiAgY29uc3QgUHJvY2Vzc1NpZ25hbC5fKHRoaXMuX3NpZ25hbE51bWJlciwgdGhpcy5fbmFtZSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+IF9uYW1lOwoKICAvKioKICAgKiBXYXRjaCBmb3IgcHJvY2VzcyBzaWduYWxzLgogICAqCiAgICogVGhlIGZvbGxvd2luZyBbUHJvY2Vzc1NpZ25hbF1zIGNhbiBiZSBsaXN0ZW5lZCB0bzoKICAgKgogICAqICAgKiBbUHJvY2Vzc1NpZ25hbC5zaWdodXBdLgogICAqICAgKiBbUHJvY2Vzc1NpZ25hbC5zaWdpbnRdLiBTaWduYWwgc2VudCBieSBlLmcuIENUUkwtQy4KICAgKiAgICogW1Byb2Nlc3NTaWduYWwuc2lndGVybV0uIE5vdCBhdmFpbGFibGUgb24gV2luZG93cy4KICAgKiAgICogW1Byb2Nlc3NTaWduYWwuc2lndXNyMV0uIE5vdCBhdmFpbGFibGUgb24gV2luZG93cy4KICAgKiAgICogW1Byb2Nlc3NTaWduYWwuc2lndXNyMl0uIE5vdCBhdmFpbGFibGUgb24gV2luZG93cy4KICAgKiAgICogW1Byb2Nlc3NTaWduYWwuc2lnd2luY2hdLiBOb3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuCiAgICoKICAgKiBPdGhlciBzaWduYWxzIGFyZSBkaXNhbGxvd2VkLCBhcyB0aGV5IG1heSBiZSB1c2VkIGJ5IHRoZSBWTS4KICAgKgogICAqIEEgc2lnbmFsIGNhbiBiZSB3YXRjaGVkIG11bHRpcGxlIHRpbWVzLCBmcm9tIG11bHRpcGxlIGlzb2xhdGVzLCB3aGVyZSBhbGwKICAgKiBjYWxsYmFja3MgYXJlIGludm9rZWQgd2hlbiBzaWduYWxlZCwgaW4gbm8gc3BlY2lmaWMgb3JkZXIuCiAgICovCiAgU3RyZWFtPFByb2Nlc3NTaWduYWw+IHdhdGNoKCkgPT4gX1Byb2Nlc3NVdGlscy5fd2F0Y2hTaWduYWwodGhpcyk7Cn0KCmNsYXNzIFNpZ25hbEV4Y2VwdGlvbiBpbXBsZW1lbnRzIElPRXhjZXB0aW9uIHsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKICBmaW5hbCBvc0Vycm9yOwoKICBjb25zdCBTaWduYWxFeGNlcHRpb24odGhpcy5tZXNzYWdlLCBbdGhpcy5vc0Vycm9yXSk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHZhciBtc2cgPSAiIjsKICAgIGlmIChvc0Vycm9yICE9IG51bGwpIHsKICAgICAgbXNnID0gIiwgb3NFcnJvcjogJG9zRXJyb3IiOwogICAgfQogICAgcmV0dXJuICJTaWduYWxFeGNlcHRpb246ICRtZXNzYWdlJG1zZyI7CiAgfQp9CgpjbGFzcyBQcm9jZXNzRXhjZXB0aW9uIGltcGxlbWVudHMgSU9FeGNlcHRpb24gewogIC8qKgogICAqIENvbnRhaW5zIHRoZSBleGVjdXRhYmxlIHByb3ZpZGVkIGZvciB0aGUgcHJvY2Vzcy4KICAgKi8KICBmaW5hbCBTdHJpbmcgZXhlY3V0YWJsZTsKCiAgLyoqCiAgICogQ29udGFpbnMgdGhlIGFyZ3VtZW50cyBwcm92aWRlZCBmb3IgdGhlIHByb2Nlc3MuCiAgICovCiAgZmluYWwgTGlzdDxTdHJpbmc+IGFyZ3VtZW50czsKCiAgLyoqCiAgICogQ29udGFpbnMgdGhlIHN5c3RlbSBtZXNzYWdlIGZvciB0aGUgcHJvY2VzcyBleGNlcHRpb24gaWYgYW55LgogICAqLwogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwoKICAvKioKICAgKiBDb250YWlucyB0aGUgT1MgZXJyb3IgY29kZSBmb3IgdGhlIHByb2Nlc3MgZXhjZXB0aW9uIGlmIGFueS4KICAgKi8KICBmaW5hbCBpbnQgZXJyb3JDb2RlOwoKICBjb25zdCBQcm9jZXNzRXhjZXB0aW9uKHRoaXMuZXhlY3V0YWJsZSwgdGhpcy5hcmd1bWVudHMsCiAgICAgIFt0aGlzLm1lc3NhZ2UgPSAiIiwgdGhpcy5lcnJvckNvZGUgPSAwXSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgdmFyIG1zZyA9IChtZXNzYWdlID09IG51bGwpID8gJ09TIGVycm9yIGNvZGU6ICRlcnJvckNvZGUnIDogbWVzc2FnZTsKICAgIHZhciBhcmdzID0gYXJndW1lbnRzLmpvaW4oJyAnKTsKICAgIHJldHVybiAiUHJvY2Vzc0V4Y2VwdGlvbjogJG1zZ1xuICBDb21tYW5kOiAkZXhlY3V0YWJsZSAkYXJncyI7CiAgfQp9CoK+AE5OPAERATkrFioxJistTAIBBEIDSjEDS0dIREMUAzQDRUNERDgDREYMA0ZDMgNGQT8aBBYsIyA9BB0CAQQtA0ZFGgMZA0MOBB4sJAIBBC0DRkUaA0MOBDIBBDMDRjcEIC4aQwQkID4EJgIBBCsEKQEERxQEFAY+BU1OTwwGJgEGTQ4FTU5PDAYiAgEEJAQZHD0kIAE4QyotAUE/JiQBRihILzgBSBAWEhoJF1ABEzACAQQjA0RIRxQDKgNFTUtJUDMDGQMQSkIiDQkDLAM7PTgjPgNLLD00AxkeAxA7GigxMzQ2DQkDGwNMN0kXSxoDPxwDEQNDR0ADSzo4MwMZAxA2Ni4sDw0JAxYDXkcrBBkGTCEFNgVGR0U9RUgQBUFGPEVGRUMSBU5MLS0GHAEGQkY9RUUiBU9OSCMFUE1RTxAFTUkkBU06NwVCRkFHBUcgBU0tLQ0FQkEQBUZFREdFQQVCRkdBRC4FQAYpMSAnKx44AQZHQQVPTkgjBVBNUU8QBU1JJAVLODUFR0NAQwsFP0YSBUUgBUooKA0GLTEgJyseLzEBBkc9BTYFRzQGKTEgJyseLzEBBiYFP0A/DgVGRjEFQ0YnBig3AQZIBiABBkcGIAEGRgYUAQYsBg8BBhgFRkMwBUZFJAVDRicGPQIBBEY8BBYGIAVCDAYWAQY+SEcXBhABBj1INycGEAEGIAYRAUQCAQRHLQNQTBAEFkpKTEpMTEpKTE1NTU1NTU1NTU1NTUtNTVFNT01LASQuJC4lMCQuJTAlMCQuJC4lMCUwJTAlMCUwJTAlMCUwJTAlMCUwJTAlMCQuJTAlMCc0JTAmMiUwJC4BGxYBOQEeAQYgBTgFIT08PDw9BUIFT0AGRQIBLxgRATcBFhIbIwYsBAIBMAY3BhsBBjYGIAEGQwYYAQZCBhcBOjAWSSRDBAIBFGRhcnQ6aW8vcHJvY2Vzcy5kYXJ0OG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9zZWN1cmVfc2VydmVyX3NvY2tldC5kYXJ0qokvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKLyoqCiAqIFRoZSBbU2VjdXJlU2VydmVyU29ja2V0XSBpcyBhIHNlcnZlciBzb2NrZXQsIHByb3ZpZGluZyBhIHN0cmVhbSBvZiBoaWdoLWxldmVsCiAqIFtTb2NrZXRdcy4KICoKICogU2VlIFtTZWN1cmVTb2NrZXRdIGZvciBtb3JlIGluZm8uCiAqLwpjbGFzcyBTZWN1cmVTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBTdHJlYW08U2VjdXJlU29ja2V0PiB7CiAgZmluYWwgUmF3U2VjdXJlU2VydmVyU29ja2V0IF9zb2NrZXQ7CgogIFNlY3VyZVNlcnZlclNvY2tldC5fKHRoaXMuX3NvY2tldCk7CgogIC8qKgogICAqIFJldHVybnMgYSBmdXR1cmUgZm9yIGEgW1NlY3VyZVNlcnZlclNvY2tldF0uIFdoZW4gdGhlIGZ1dHVyZQogICAqIGNvbXBsZXRlcyB0aGUgc2VydmVyIHNvY2tldCBpcyBib3VuZCB0byB0aGUgZ2l2ZW4gW2FkZHJlc3NdIGFuZAogICAqIFtwb3J0XSBhbmQgaGFzIHN0YXJ0ZWQgbGlzdGVuaW5nIG9uIGl0LgogICAqCiAgICogVGhlIFthZGRyZXNzXSBjYW4gZWl0aGVyIGJlIGEgW1N0cmluZ10gb3IgYW4KICAgKiBbSW50ZXJuZXRBZGRyZXNzXS4gSWYgW2FkZHJlc3NdIGlzIGEgW1N0cmluZ10sIFtiaW5kXSB3aWxsCiAgICogcGVyZm9ybSBhIFtJbnRlcm5ldEFkZHJlc3MubG9va3VwXSBhbmQgdXNlIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUKICAgKiBsaXN0LiBUbyBsaXN0ZW4gb24gdGhlIGxvb3BiYWNrIGFkYXB0ZXIsIHdoaWNoIHdpbGwgYWxsb3cgb25seQogICAqIGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20gdGhlIGxvY2FsIGhvc3QsIHVzZSB0aGUgdmFsdWUKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2NF0gb3IKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2Nl0uIFRvIGFsbG93IGZvciBpbmNvbWluZwogICAqIGNvbm5lY3Rpb24gZnJvbSB0aGUgbmV0d29yayB1c2UgZWl0aGVyIG9uZSBvZiB0aGUgdmFsdWVzCiAgICogW0ludGVybmV0QWRkcmVzcy5hbnlJUHY0XSBvciBbSW50ZXJuZXRBZGRyZXNzLmFueUlQdjZdIHRvCiAgICogYmluZCB0byBhbGwgaW50ZXJmYWNlcyBvciB0aGUgSVAgYWRkcmVzcyBvZiBhIHNwZWNpZmljIGludGVyZmFjZS4KICAgKgogICAqIElmIFtwb3J0XSBoYXMgdGhlIHZhbHVlIFs6MDpdIGFuIGVwaGVtZXJhbCBwb3J0IHdpbGwgYmUgY2hvc2VuIGJ5CiAgICogdGhlIHN5c3RlbS4gVGhlIGFjdHVhbCBwb3J0IHVzZWQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUKICAgKiBbcG9ydF0gZ2V0dGVyLgogICAqCiAgICogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFtiYWNrbG9nXSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsaXN0ZW4KICAgKiBiYWNrbG9nIGZvciB0aGUgdW5kZXJseWluZyBPUyBsaXN0ZW4gc2V0dXAuIElmIFtiYWNrbG9nXSBoYXMgdGhlCiAgICogdmFsdWUgb2YgWzowOl0gKHRoZSBkZWZhdWx0KSBhIHJlYXNvbmFibGUgdmFsdWUgd2lsbCBiZSBjaG9zZW4gYnkKICAgKiB0aGUgc3lzdGVtLgogICAqCiAgICogSW5jb21pbmcgY2xpZW50IGNvbm5lY3Rpb25zIGFyZSBwcm9tb3RlZCB0byBzZWN1cmUgY29ubmVjdGlvbnMsIHVzaW5nCiAgICogdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBhbmQga2V5IHNldCBpbiBbY29udGV4dF0uCiAgICoKICAgKiBbYWRkcmVzc10gbXVzdCBiZSBnaXZlbiBhcyBhIG51bWVyaWMgYWRkcmVzcywgbm90IGEgaG9zdCBuYW1lLgogICAqCiAgICogVG8gcmVxdWVzdCBvciByZXF1aXJlIHRoYXQgY2xpZW50cyBhdXRoZW50aWNhdGUgYnkgcHJvdmlkaW5nIGFuIFNTTCAoVExTKQogICAqIGNsaWVudCBjZXJ0aWZpY2F0ZSwgc2V0IHRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgW3JlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZV0KICAgKiBvciBbcmVxdWlyZUNsaWVudENlcnRpZmljYXRlXSB0byB0cnVlLiAgUmVxdWlyaW5nIGEgY2VydGlmaWNhdGUgaW1wbGllcwogICAqIHJlcXVlc3RpbmcgYSBjZXJ0aWZpY2F0ZSwgc28gc2V0dGluZyBib3RoIGlzIHJlZHVuZGFudC4KICAgKiBUbyBjaGVjayB3aGV0aGVyIGEgY2xpZW50IGNlcnRpZmljYXRlIHdhcyByZWNlaXZlZCwgY2hlY2sKICAgKiBTZWN1cmVTb2NrZXQucGVlckNlcnRpZmljYXRlIGFmdGVyIGNvbm5lY3RpbmcuICBJZiBubyBjZXJ0aWZpY2F0ZQogICAqIHdhcyByZWNlaXZlZCwgdGhlIHJlc3VsdCB3aWxsIGJlIG51bGwuCiAgICoKICAgKiBbc3VwcG9ydGVkUHJvdG9jb2xzXSBpcyBhbiBvcHRpb25hbCBsaXN0IG9mIHByb3RvY29scyAoaW4gZGVjcmVhc2luZwogICAqIG9yZGVyIG9mIHByZWZlcmVuY2UpIHRvIHVzZSBkdXJpbmcgdGhlIEFMUE4gcHJvdG9jb2wgbmVnb2dpYXRpb24gd2l0aAogICAqIGNsaWVudHMuICBFeGFtcGxlIHZhbHVlcyBhcmUgImh0dHAvMS4xIiBvciAiaDIiLiAgVGhlIHNlbGVjdGVkIHByb3RvY29sCiAgICogY2FuIGJlIG9idGFpbmVkIHZpYSBbU2VjdXJlU29ja2V0LnNlbGVjdGVkUHJvdG9jb2xdLgogICAqCiAgICogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFtzaGFyZWRdIHNwZWNpZmllcyB3aGV0aGVyIGFkZGl0aW9uYWwKICAgKiBTZWN1cmVTZXJ2ZXJTb2NrZXQgb2JqZWN0cyBjYW4gYmluZCB0byB0aGUgc2FtZSBjb21iaW5hdGlvbiBvZiBgYWRkcmVzc2AsCiAgICogYHBvcnRgIGFuZCBgdjZPbmx5YC4gIElmIGBzaGFyZWRgIGlzIGB0cnVlYCBhbmQgbW9yZSBgU2VjdXJlU2VydmVyU29ja2V0YHMKICAgKiBmcm9tIHRoaXMgaXNvbGF0ZSBvciBvdGhlciBpc29sYXRlcyBhcmUgYm91bmQgdG8gdGhlIHBvcnQsIHRoZW4gdGhlCiAgICogaW5jb21pbmcgY29ubmVjdGlvbnMgd2lsbCBiZSBkaXN0cmlidXRlZCBhbW9uZyBhbGwgdGhlIGJvdW5kCiAgICogYFNlY3VyZVNlcnZlclNvY2tldGBzLiBDb25uZWN0aW9ucyBjYW4gYmUgZGlzdHJpYnV0ZWQgb3ZlciBtdWx0aXBsZQogICAqIGlzb2xhdGVzIHRoaXMgd2F5LgogICAqLwogIHN0YXRpYyBGdXR1cmU8U2VjdXJlU2VydmVyU29ja2V0PiBiaW5kKAogICAgICBhZGRyZXNzLCBpbnQgcG9ydCwgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgIHtpbnQgYmFja2xvZzogMCwKICAgICAgYm9vbCB2Nk9ubHk6IGZhbHNlLAogICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiBmYWxzZSwKICAgICAgTGlzdDxTdHJpbmc+IHN1cHBvcnRlZFByb3RvY29scywKICAgICAgYm9vbCBzaGFyZWQ6IGZhbHNlfSkgewogICAgcmV0dXJuIFJhd1NlY3VyZVNlcnZlclNvY2tldAogICAgICAgIC5iaW5kKGFkZHJlc3MsIHBvcnQsIGNvbnRleHQsCiAgICAgICAgICAgIGJhY2tsb2c6IGJhY2tsb2csCiAgICAgICAgICAgIHY2T25seTogdjZPbmx5LAogICAgICAgICAgICByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU6IHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgICAgIHN1cHBvcnRlZFByb3RvY29sczogc3VwcG9ydGVkUHJvdG9jb2xzLAogICAgICAgICAgICBzaGFyZWQ6IHNoYXJlZCkKICAgICAgICAudGhlbigoc2VydmVyU29ja2V0KSA9PiBuZXcgU2VjdXJlU2VydmVyU29ja2V0Ll8oc2VydmVyU29ja2V0KSk7CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb248U2VjdXJlU29ja2V0PiBsaXN0ZW4odm9pZCBvbkRhdGEoU2VjdXJlU29ja2V0IHNvY2tldCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX3NvY2tldC5tYXAoKHJhd1NvY2tldCkgPT4gbmV3IFNlY3VyZVNvY2tldC5fKHJhd1NvY2tldCkpLmxpc3RlbigKICAgICAgICBvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwKICAgICAgICBvbkRvbmU6IG9uRG9uZSwKICAgICAgICBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIHBvcnQgdXNlZCBieSB0aGlzIHNvY2tldC4KICAgKi8KICBpbnQgZ2V0IHBvcnQgPT4gX3NvY2tldC5wb3J0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIHVzZWQgYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzID0+IF9zb2NrZXQuYWRkcmVzczsKCiAgLyoqCiAgICogQ2xvc2VzIHRoZSBzb2NrZXQuIFRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdoZW4gdGhlIHNvY2tldAogICAqIGlzIGZ1bGx5IGNsb3NlZCBhbmQgaXMgbm8gbG9uZ2VyIGJvdW5kLgogICAqLwogIEZ1dHVyZTxTZWN1cmVTZXJ2ZXJTb2NrZXQ+IGNsb3NlKCkgPT4gX3NvY2tldC5jbG9zZSgpLnRoZW4oKF8pID0+IHRoaXMpOwoKICB2b2lkIHNldCBfb3duZXIob3duZXIpIHsKICAgIF9zb2NrZXQuX293bmVyID0gb3duZXI7CiAgfQp9CgovKioKICogVGhlIFJhd1NlY3VyZVNlcnZlclNvY2tldCBpcyBhIHNlcnZlciBzb2NrZXQsIHByb3ZpZGluZyBhIHN0cmVhbSBvZiBsb3ctbGV2ZWwKICogW1Jhd1NlY3VyZVNvY2tldF1zLgogKgogKiBTZWUgW1Jhd1NlY3VyZVNvY2tldF0gZm9yIG1vcmUgaW5mby4KICovCmNsYXNzIFJhd1NlY3VyZVNlcnZlclNvY2tldCBleHRlbmRzIFN0cmVhbTxSYXdTZWN1cmVTb2NrZXQ+IHsKICBmaW5hbCBSYXdTZXJ2ZXJTb2NrZXQgX3NvY2tldDsKICBTdHJlYW1Db250cm9sbGVyPFJhd1NlY3VyZVNvY2tldD4gX2NvbnRyb2xsZXI7CiAgU3RyZWFtU3Vic2NyaXB0aW9uPFJhd1NvY2tldD4gX3N1YnNjcmlwdGlvbjsKICBmaW5hbCBTZWN1cml0eUNvbnRleHQgX2NvbnRleHQ7CiAgZmluYWwgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU7CiAgZmluYWwgYm9vbCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGU7CiAgZmluYWwgTGlzdDxTdHJpbmc+IHN1cHBvcnRlZFByb3RvY29sczsKICBib29sIF9jbG9zZWQgPSBmYWxzZTsKCiAgUmF3U2VjdXJlU2VydmVyU29ja2V0Ll8oCiAgICAgIHRoaXMuX3NvY2tldCwKICAgICAgdGhpcy5fY29udGV4dCwKICAgICAgdGhpcy5yZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgIHRoaXMucmVxdWlyZUNsaWVudENlcnRpZmljYXRlLAogICAgICB0aGlzLnN1cHBvcnRlZFByb3RvY29scykgewogICAgX2NvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxSYXdTZWN1cmVTb2NrZXQ+KAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlLAogICAgICAgIG9uUGF1c2U6IF9vblBhdXNlU3RhdGVDaGFuZ2UsCiAgICAgICAgb25SZXN1bWU6IF9vblBhdXNlU3RhdGVDaGFuZ2UsCiAgICAgICAgb25DYW5jZWw6IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBmdXR1cmUgZm9yIGEgW1Jhd1NlY3VyZVNlcnZlclNvY2tldF0uIFdoZW4gdGhlIGZ1dHVyZQogICAqIGNvbXBsZXRlcyB0aGUgc2VydmVyIHNvY2tldCBpcyBib3VuZCB0byB0aGUgZ2l2ZW4gW2FkZHJlc3NdIGFuZAogICAqIFtwb3J0XSBhbmQgaGFzIHN0YXJ0ZWQgbGlzdGVuaW5nIG9uIGl0LgogICAqCiAgICogVGhlIFthZGRyZXNzXSBjYW4gZWl0aGVyIGJlIGEgW1N0cmluZ10gb3IgYW4KICAgKiBbSW50ZXJuZXRBZGRyZXNzXS4gSWYgW2FkZHJlc3NdIGlzIGEgW1N0cmluZ10sIFtiaW5kXSB3aWxsCiAgICogcGVyZm9ybSBhIFtJbnRlcm5ldEFkZHJlc3MubG9va3VwXSBhbmQgdXNlIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUKICAgKiBsaXN0LiBUbyBsaXN0ZW4gb24gdGhlIGxvb3BiYWNrIGFkYXB0ZXIsIHdoaWNoIHdpbGwgYWxsb3cgb25seQogICAqIGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20gdGhlIGxvY2FsIGhvc3QsIHVzZSB0aGUgdmFsdWUKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2NF0gb3IKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2Nl0uIFRvIGFsbG93IGZvciBpbmNvbWluZwogICAqIGNvbm5lY3Rpb24gZnJvbSB0aGUgbmV0d29yayB1c2UgZWl0aGVyIG9uZSBvZiB0aGUgdmFsdWVzCiAgICogW0ludGVybmV0QWRkcmVzcy5hbnlJUHY0XSBvciBbSW50ZXJuZXRBZGRyZXNzLmFueUlQdjZdIHRvCiAgICogYmluZCB0byBhbGwgaW50ZXJmYWNlcyBvciB0aGUgSVAgYWRkcmVzcyBvZiBhIHNwZWNpZmljIGludGVyZmFjZS4KICAgKgogICAqIElmIFtwb3J0XSBoYXMgdGhlIHZhbHVlIFs6MDpdIGFuIGVwaGVtZXJhbCBwb3J0IHdpbGwgYmUgY2hvc2VuIGJ5CiAgICogdGhlIHN5c3RlbS4gVGhlIGFjdHVhbCBwb3J0IHVzZWQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUKICAgKiBbcG9ydF0gZ2V0dGVyLgogICAqCiAgICogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFtiYWNrbG9nXSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsaXN0ZW4KICAgKiBiYWNrbG9nIGZvciB0aGUgdW5kZXJseWluZyBPUyBsaXN0ZW4gc2V0dXAuIElmIFtiYWNrbG9nXSBoYXMgdGhlCiAgICogdmFsdWUgb2YgWzowOl0gKHRoZSBkZWZhdWx0KSBhIHJlYXNvbmFibGUgdmFsdWUgd2lsbCBiZSBjaG9zZW4gYnkKICAgKiB0aGUgc3lzdGVtLgogICAqCiAgICogSW5jb21pbmcgY2xpZW50IGNvbm5lY3Rpb25zIGFyZSBwcm9tb3RlZCB0byBzZWN1cmUgY29ubmVjdGlvbnMsCiAgICogdXNpbmcgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBhbmQga2V5IHNldCBpbiBbY29udGV4dF0uCiAgICoKICAgKiBbYWRkcmVzc10gbXVzdCBiZSBnaXZlbiBhcyBhIG51bWVyaWMgYWRkcmVzcywgbm90IGEgaG9zdCBuYW1lLgogICAqCiAgICogVG8gcmVxdWVzdCBvciByZXF1aXJlIHRoYXQgY2xpZW50cyBhdXRoZW50aWNhdGUgYnkgcHJvdmlkaW5nIGFuIFNTTCAoVExTKQogICAqIGNsaWVudCBjZXJ0aWZpY2F0ZSwgc2V0IHRoZSBvcHRpb25hbCBwYXJhbWV0ZXJzIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSBvcgogICAqIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSB0byB0cnVlLiAgUmVxdWlyZSBpbXBsaWVzIHJlcXVlc3QsIHNvIG9uZSBkb2Vzbid0CiAgICogbmVlZCB0byBzcGVjaWZ5IGJvdGguICBUbyBjaGVjayB3aGV0aGVyIGEgY2xpZW50IGNlcnRpZmljYXRlIHdhcyByZWNlaXZlZCwKICAgKiBjaGVjayBTZWN1cmVTb2NrZXQucGVlckNlcnRpZmljYXRlIGFmdGVyIGNvbm5lY3RpbmcuICBJZiBubyBjZXJ0aWZpY2F0ZQogICAqIHdhcyByZWNlaXZlZCwgdGhlIHJlc3VsdCB3aWxsIGJlIG51bGwuCiAgICoKICAgKiBbc3VwcG9ydGVkUHJvdG9jb2xzXSBpcyBhbiBvcHRpb25hbCBsaXN0IG9mIHByb3RvY29scyAoaW4gZGVjcmVhc2luZwogICAqIG9yZGVyIG9mIHByZWZlcmVuY2UpIHRvIHVzZSBkdXJpbmcgdGhlIEFMUE4gcHJvdG9jb2wgbmVnb3RpYXRpb24gd2l0aAogICAqIGNsaWVudHMuICBFeGFtcGxlIHZhbHVlcyBhcmUgImh0dHAvMS4xIiBvciAiaDIiLiAgVGhlIHNlbGVjdGVkIHByb3RvY29sCiAgICogY2FuIGJlIG9idGFpbmVkIHZpYSBbUmF3U2VjdXJlU29ja2V0LnNlbGVjdGVkUHJvdG9jb2xdLgogICAqCiAgICogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFtzaGFyZWRdIHNwZWNpZmllcyB3aGV0aGVyIGFkZGl0aW9uYWwKICAgKiBSYXdTZWN1cmVTZXJ2ZXJTb2NrZXQgb2JqZWN0cyBjYW4gYmluZCB0byB0aGUgc2FtZSBjb21iaW5hdGlvbiBvZgogICAqIGBhZGRyZXNzYCwgYHBvcnRgIGFuZCBgdjZPbmx5YC4gIElmIGBzaGFyZWRgIGlzIGB0cnVlYCBhbmQgbW9yZQogICAqIGBSYXdTZWN1cmVTZXJ2ZXJTb2NrZXRgcyBmcm9tIHRoaXMgaXNvbGF0ZSBvciBvdGhlciBpc29sYXRlcyBhcmUgYm91bmQgdG8KICAgKiB0aGUgcG9ydCwgdGhlbiB0aGUgaW5jb21pbmcgY29ubmVjdGlvbnMgd2lsbCBiZSBkaXN0cmlidXRlZCBhbW9uZyBhbGwgdGhlCiAgICogYm91bmQgYFJhd1NlY3VyZVNlcnZlclNvY2tldGBzLiBDb25uZWN0aW9ucyBjYW4gYmUgZGlzdHJpYnV0ZWQgb3ZlcgogICAqIG11bHRpcGxlIGlzb2xhdGVzIHRoaXMgd2F5LgogICAqLwogIHN0YXRpYyBGdXR1cmU8UmF3U2VjdXJlU2VydmVyU29ja2V0PiBiaW5kKAogICAgICBhZGRyZXNzLCBpbnQgcG9ydCwgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgIHtpbnQgYmFja2xvZzogMCwKICAgICAgYm9vbCB2Nk9ubHk6IGZhbHNlLAogICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiBmYWxzZSwKICAgICAgTGlzdDxTdHJpbmc+IHN1cHBvcnRlZFByb3RvY29scywKICAgICAgYm9vbCBzaGFyZWQ6IGZhbHNlfSkgewogICAgcmV0dXJuIFJhd1NlcnZlclNvY2tldAogICAgICAgIC5iaW5kKGFkZHJlc3MsIHBvcnQsIGJhY2tsb2c6IGJhY2tsb2csIHY2T25seTogdjZPbmx5LCBzaGFyZWQ6IHNoYXJlZCkKICAgICAgICAudGhlbigoc2VydmVyU29ja2V0KSA9PiBuZXcgUmF3U2VjdXJlU2VydmVyU29ja2V0Ll8oCiAgICAgICAgICAgIHNlcnZlclNvY2tldCwKICAgICAgICAgICAgY29udGV4dCwKICAgICAgICAgICAgcmVxdWVzdENsaWVudENlcnRpZmljYXRlLAogICAgICAgICAgICByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgICAgIHN1cHBvcnRlZFByb3RvY29scykpOwogIH0KCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFJhd1NlY3VyZVNvY2tldD4gbGlzdGVuKHZvaWQgb25EYXRhKFJhd1NlY3VyZVNvY2tldCBzKSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIHJldHVybiBfY29udHJvbGxlci5zdHJlYW0ubGlzdGVuKG9uRGF0YSwKICAgICAgICBvbkVycm9yOiBvbkVycm9yLCBvbkRvbmU6IG9uRG9uZSwgY2FuY2VsT25FcnJvcjogY2FuY2VsT25FcnJvcik7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwb3J0IHVzZWQgYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgaW50IGdldCBwb3J0ID0+IF9zb2NrZXQucG9ydDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgYWRkcmVzcyB1c2VkIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIEludGVybmV0QWRkcmVzcyBnZXQgYWRkcmVzcyA9PiBfc29ja2V0LmFkZHJlc3M7CgogIC8qKgogICAqIENsb3NlcyB0aGUgc29ja2V0LiBUaGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcyB3aGVuIHRoZSBzb2NrZXQKICAgKiBpcyBmdWxseSBjbG9zZWQgYW5kIGlzIG5vIGxvbmdlciBib3VuZC4KICAgKi8KICBGdXR1cmU8UmF3U2VjdXJlU2VydmVyU29ja2V0PiBjbG9zZSgpIHsKICAgIF9jbG9zZWQgPSB0cnVlOwogICAgcmV0dXJuIF9zb2NrZXQuY2xvc2UoKS50aGVuKChfKSA9PiB0aGlzKTsKICB9CgogIHZvaWQgX29uRGF0YShSYXdTb2NrZXQgY29ubmVjdGlvbikgewogICAgdmFyIHJlbW90ZVBvcnQ7CiAgICB0cnkgewogICAgICByZW1vdGVQb3J0ID0gY29ubmVjdGlvbi5yZW1vdGVQb3J0OwogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBJZiBjb25uZWN0aW9uIGlzIGFscmVhZHkgY2xvc2VkLCByZW1vdGVQb3J0IHRocm93cyBhbiBleGNlcHRpb24uCiAgICAgIC8vIERvIG5vdGhpbmcgLSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KICAgICAgcmV0dXJuOwogICAgfQogICAgX1Jhd1NlY3VyZVNvY2tldAogICAgICAgIC5jb25uZWN0KGNvbm5lY3Rpb24uYWRkcmVzcywgcmVtb3RlUG9ydCwKICAgICAgICAgICAgY29udGV4dDogX2NvbnRleHQsCiAgICAgICAgICAgIGlzX3NlcnZlcjogdHJ1ZSwKICAgICAgICAgICAgc29ja2V0OiBjb25uZWN0aW9uLAogICAgICAgICAgICByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU6IHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgICAgIHN1cHBvcnRlZFByb3RvY29sczogc3VwcG9ydGVkUHJvdG9jb2xzKQogICAgICAgIC50aGVuKChSYXdTZWN1cmVTb2NrZXQgc2VjdXJlQ29ubmVjdGlvbikgewogICAgICBpZiAoX2Nsb3NlZCkgewogICAgICAgIHNlY3VyZUNvbm5lY3Rpb24uY2xvc2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfY29udHJvbGxlci5hZGQoc2VjdXJlQ29ubmVjdGlvbik7CiAgICAgIH0KICAgIH0pLmNhdGNoRXJyb3IoKGUsIHMpIHsKICAgICAgaWYgKCFfY2xvc2VkKSB7CiAgICAgICAgX2NvbnRyb2xsZXIuYWRkRXJyb3IoZSwgcyk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCBfb25QYXVzZVN0YXRlQ2hhbmdlKCkgewogICAgaWYgKF9jb250cm9sbGVyLmlzUGF1c2VkKSB7CiAgICAgIF9zdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9zdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICB9CiAgfQoKICB2b2lkIF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlKCkgewogICAgaWYgKF9jb250cm9sbGVyLmhhc0xpc3RlbmVyKSB7CiAgICAgIF9zdWJzY3JpcHRpb24gPSBfc29ja2V0Lmxpc3Rlbihfb25EYXRhLAogICAgICAgICAgb25FcnJvcjogX2NvbnRyb2xsZXIuYWRkRXJyb3IsIG9uRG9uZTogX2NvbnRyb2xsZXIuY2xvc2UpOwogICAgfSBlbHNlIHsKICAgICAgY2xvc2UoKTsKICAgIH0KICB9CgogIHZvaWQgc2V0IF9vd25lcihvd25lcikgewogICAgKF9zb2NrZXQgYXMgZHluYW1pYykuX293bmVyID0gb3duZXI7CiAgfQp9CoElAE5OPAERAQRRDgMlBDgnASYBBkJFLQUyQEdEPSc7Pj9HBUdBFAVHRkcRBUs2BUQFT09NPT9HLAVKS006BUFPUElCSRgGKjIXGiwsJx0hJh4cQEA0HEkEAUw/TRAaGCcEAQYrBiABBi4GMgEGRi0GSwEbHAQCAQRRFwMoBD4hMS8iJycpGAEbFBUlJSE5FC4mJy8EAQZFRS0FMkBHRD0nOz4/RwVHQRQFR0ZHEQVFPAVEBU9RUFBNLAVKS009BUFHRU9PSSEGLTIXGiwsJx0bTz0aFSYmIgQBTT8tSQQBBisGIAEGLgYyAQZGLQYqFC4EAScUCioSSiwOBhUxHx0gQEA0MxUiDysIGxYkCAgEAR8gHQ0eBgQBJiMuRQ0PBgQBGykEAgEhZGFydDppby9zZWN1cmVfc2VydmVyX3NvY2tldC5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9zZWN1cmVfc29ja2V0LmRhcnTAAKw7Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8qKgogKiBBIGhpZ2gtbGV2ZWwgY2xhc3MgZm9yIGNvbW11bmljYXRpbmcgc2VjdXJlbHkgb3ZlciBhIFRDUCBzb2NrZXQsIHVzaW5nCiAqIFRMUyBhbmQgU1NMLiBUaGUgW1NlY3VyZVNvY2tldF0gZXhwb3NlcyBib3RoIGEgW1N0cmVhbV0gYW5kIGFuCiAqIFtJT1NpbmtdIGludGVyZmFjZSwgbWFraW5nIGl0IGlkZWFsIGZvciB1c2luZyB0b2dldGhlciB3aXRoCiAqIG90aGVyIFtTdHJlYW1dcy4KICovCmFic3RyYWN0IGNsYXNzIFNlY3VyZVNvY2tldCBpbXBsZW1lbnRzIFNvY2tldCB7CiAgZXh0ZXJuYWwgZmFjdG9yeSBTZWN1cmVTb2NrZXQuXyhSYXdTZWN1cmVTb2NrZXQgcmF3U29ja2V0KTsKCiAgLyoqCiAgICogQ29uc3RydWN0cyBhIG5ldyBzZWN1cmUgY2xpZW50IHNvY2tldCBhbmQgY29ubmVjdHMgaXQgdG8gdGhlIGdpdmVuCiAgICogW2hvc3RdIG9uIHBvcnQgW3BvcnRdLiBUaGUgcmV0dXJuZWQgRnV0dXJlIHdpbGwgY29tcGxldGUgd2l0aCBhCiAgICogW1NlY3VyZVNvY2tldF0gdGhhdCBpcyBjb25uZWN0ZWQgYW5kIHJlYWR5IGZvciBzdWJzY3JpcHRpb24uCiAgICoKICAgKiBUaGUgY2VydGlmaWNhdGUgcHJvdmlkZWQgYnkgdGhlIHNlcnZlciBpcyBjaGVja2VkCiAgICogdXNpbmcgdGhlIHRydXN0ZWQgY2VydGlmaWNhdGVzIHNldCBpbiB0aGUgU2VjdXJpdHlDb250ZXh0IG9iamVjdC4KICAgKiBUaGUgZGVmYXVsdCBTZWN1cml0eUNvbnRleHQgb2JqZWN0IGNvbnRhaW5zIGEgYnVpbHQtaW4gc2V0IG9mIHRydXN0ZWQKICAgKiByb290IGNlcnRpZmljYXRlcyBmb3Igd2VsbC1rbm93biBjZXJ0aWZpY2F0ZSBhdXRob3JpdGllcy4KICAgKgogICAqIFtvbkJhZENlcnRpZmljYXRlXSBpcyBhbiBvcHRpb25hbCBoYW5kbGVyIGZvciB1bnZlcmlmaWFibGUgY2VydGlmaWNhdGVzLgogICAqIFRoZSBoYW5kbGVyIHJlY2VpdmVzIHRoZSBbWDUwOUNlcnRpZmljYXRlXSwgYW5kIGNhbiBpbnNwZWN0IGl0IGFuZAogICAqIGRlY2lkZSAob3IgbGV0IHRoZSB1c2VyIGRlY2lkZSkgd2hldGhlciB0byBhY2NlcHQKICAgKiB0aGUgY29ubmVjdGlvbiBvciBub3QuICBUaGUgaGFuZGxlciBzaG91bGQgcmV0dXJuIHRydWUKICAgKiB0byBjb250aW51ZSB0aGUgW1NlY3VyZVNvY2tldF0gY29ubmVjdGlvbi4KICAgKgogICAqIFtzdXBwb3J0ZWRQcm90b2NvbHNdIGlzIGFuIG9wdGlvbmFsIGxpc3Qgb2YgcHJvdG9jb2xzIChpbiBkZWNyZWFzaW5nCiAgICogb3JkZXIgb2YgcHJlZmVyZW5jZSkgdG8gdXNlIGR1cmluZyB0aGUgQUxQTiBwcm90b2NvbCBuZWdvdGlhdGlvbiB3aXRoIHRoZQogICAqIHNlcnZlci4gIEV4YW1wbGUgdmFsdWVzIGFyZSAiaHR0cC8xLjEiIG9yICJoMiIuICBUaGUgc2VsZWN0ZWQgcHJvdG9jb2wKICAgKiBjYW4gYmUgb2J0YWluZWQgdmlhIFtTZWN1cmVTb2NrZXQuc2VsZWN0ZWRQcm90b2NvbF0uCiAgICoKICAgKiBUaGUgYXJndW1lbnQgW3RpbWVvdXRdIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBhbGxvd2VkIHRpbWUgdG8gd2FpdAogICAqIGZvciBhIGNvbm5lY3Rpb24gdG8gYmUgZXN0YWJsaXNoZWQuIElmIFt0aW1lb3V0XSBpcyBsb25nZXIgdGhhbiB0aGUgc3lzdGVtCiAgICogbGV2ZWwgdGltZW91dCBkdXJhdGlvbiwgYSB0aW1lb3V0IG1heSBvY2N1ciBzb29uZXIgdGhhbiBzcGVjaWZpZWQgaW4KICAgKiBbdGltZW91dF0uIE9uIHRpbWVvdXQsIGEgW1NvY2tldEV4Y2VwdGlvbl0gaXMgdGhyb3duIGFuZCBhbGwgb25nb2luZwogICAqIGNvbm5lY3Rpb24gYXR0ZW1wdHMgdG8gW2hvc3RdIGFyZSBjYW5jZWxsZWQuCgogICAqLwogIHN0YXRpYyBGdXR1cmU8U2VjdXJlU29ja2V0PiBjb25uZWN0KGhvc3QsIGludCBwb3J0LAogICAgICB7U2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgIGJvb2wgb25CYWRDZXJ0aWZpY2F0ZShYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUpLAogICAgICBMaXN0PFN0cmluZz4gc3VwcG9ydGVkUHJvdG9jb2xzLAogICAgICBEdXJhdGlvbiB0aW1lb3V0fSkgewogICAgcmV0dXJuIFJhd1NlY3VyZVNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQsCiAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgICAgIG9uQmFkQ2VydGlmaWNhdGU6IG9uQmFkQ2VydGlmaWNhdGUsCiAgICAgICAgICAgIHN1cHBvcnRlZFByb3RvY29sczogc3VwcG9ydGVkUHJvdG9jb2xzLAogICAgICAgICAgICB0aW1lb3V0OiB0aW1lb3V0KQogICAgICAgIC50aGVuKChyYXdTb2NrZXQpID0+IG5ldyBTZWN1cmVTb2NrZXQuXyhyYXdTb2NrZXQpKTsKICB9CgogIC8vLyBMaWtlIFtjb25uZWN0XSwgYnV0IHJldHVybnMgYSBbRnV0dXJlXSB0aGF0IGNvbXBsZXRlcyB3aXRoIGEKICAvLy8gW0Nvbm5lY3Rpb25UYXNrXSB0aGF0IGNhbiBiZSBjYW5jZWxsZWQgaWYgdGhlIFtTZWN1cmVTb2NrZXRdIGlzIG5vCiAgLy8vIGxvbmdlciBuZWVkZWQuCiAgc3RhdGljIEZ1dHVyZTxDb25uZWN0aW9uVGFzazxTZWN1cmVTb2NrZXQ+PiBzdGFydENvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtTZWN1cml0eUNvbnRleHQgY29udGV4dCwKICAgICAgYm9vbCBvbkJhZENlcnRpZmljYXRlKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSksCiAgICAgIExpc3Q8U3RyaW5nPiBzdXBwb3J0ZWRQcm90b2NvbHN9KSB7CiAgICByZXR1cm4gUmF3U2VjdXJlU29ja2V0LnN0YXJ0Q29ubmVjdChob3N0LCBwb3J0LAogICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0LAogICAgICAgICAgICBvbkJhZENlcnRpZmljYXRlOiBvbkJhZENlcnRpZmljYXRlLAogICAgICAgICAgICBzdXBwb3J0ZWRQcm90b2NvbHM6IHN1cHBvcnRlZFByb3RvY29scykKICAgICAgICAudGhlbigocmF3U3RhdGUpIHsKICAgICAgRnV0dXJlPFNlY3VyZVNvY2tldD4gc29ja2V0ID0KICAgICAgICAgIHJhd1N0YXRlLnNvY2tldC50aGVuKChyYXdTb2NrZXQpID0+IG5ldyBTZWN1cmVTb2NrZXQuXyhyYXdTb2NrZXQpKTsKICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uVGFzazxTZWN1cmVTb2NrZXQ+Ll8oCiAgICAgICAgICBzb2NrZXQ6IHNvY2tldCwgb25DYW5jZWw6IHJhd1N0YXRlLl9vbkNhbmNlbCk7CiAgICB9KTsKICB9CgogIC8qKgogICAqIFRha2VzIGFuIGFscmVhZHkgY29ubmVjdGVkIFtzb2NrZXRdIGFuZCBzdGFydHMgY2xpZW50IHNpZGUgVExTCiAgICogaGFuZHNoYWtlIHRvIG1ha2UgdGhlIGNvbW11bmljYXRpb24gc2VjdXJlLiBXaGVuIHRoZSByZXR1cm5lZAogICAqIGZ1dHVyZSBjb21wbGV0ZXMgdGhlIFtTZWN1cmVTb2NrZXRdIGhhcyBjb21wbGV0ZWQgdGhlIFRMUwogICAqIGhhbmRzaGFrZS4gVXNpbmcgdGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBvdGhlciBlbmQgb2YgdGhlCiAgICogY29ubmVjdGlvbiBpcyBwcmVwYXJlZCBmb3IgVExTIGhhbmRzaGFrZS4KICAgKgogICAqIElmIHRoZSBbc29ja2V0XSBhbHJlYWR5IGhhcyBhIHN1YnNjcmlwdGlvbiwgdGhpcyBzdWJzY3JpcHRpb24KICAgKiB3aWxsIG5vIGxvbmdlciByZWNlaXZlIGFuZCBldmVudHMuIEluIG1vc3QgY2FzZXMgY2FsbGluZwogICAqIGBwYXVzZWAgb24gdGhpcyBzdWJzY3JpcHRpb24gYmVmb3JlIHN0YXJ0aW5nIFRMUyBoYW5kc2hha2UgaXMKICAgKiB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uCiAgICoKICAgKiBUaGUgZ2l2ZW4gW3NvY2tldF0gaXMgY2xvc2VkIGFuZCBtYXkgbm90IGJlIHVzZWQgYW55bW9yZS4KICAgKgogICAqIElmIHRoZSBbaG9zdF0gYXJndW1lbnQgaXMgcGFzc2VkIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgaG9zdCBuYW1lCiAgICogZm9yIHRoZSBUTFMgaGFuZHNoYWtlLiBJZiBbaG9zdF0gaXMgbm90IHBhc3NlZCB0aGUgaG9zdCBuYW1lIGZyb20KICAgKiB0aGUgW3NvY2tldF0gd2lsbCBiZSB1c2VkLiBUaGUgW2hvc3RdIGNhbiBiZSBlaXRoZXIgYSBbU3RyaW5nXSBvcgogICAqIGFuIFtJbnRlcm5ldEFkZHJlc3NdLgogICAqCiAgICogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgX25vdF8gY2F1c2UgYSBETlMgaG9zdCBsb29rdXAuIElmIHRoZQogICAqIFtob3N0XSBwYXNzZWQgaXMgYSBbU3RyaW5nXSB0aGUgW0ludGVybmV0QWRkcmVzc10gZm9yIHRoZQogICAqIHJlc3VsdGluZyBbU2VjdXJlU29ja2V0XSB3aWxsIGhhdmUgdGhlIHBhc3NlZCBpbiBbaG9zdF0gYXMgaXRzCiAgICogaG9zdCB2YWx1ZSBhbmQgdGhlIGludGVybmV0IGFkZHJlc3Mgb2YgdGhlIGFscmVhZHkgY29ubmVjdGVkCiAgICogc29ja2V0IGFzIGl0cyBhZGRyZXNzIHZhbHVlLgogICAqCiAgICogU2VlIFtjb25uZWN0XSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgYXJndW1lbnRzLgogICAqCiAgICovCiAgc3RhdGljIEZ1dHVyZTxTZWN1cmVTb2NrZXQ+IHNlY3VyZShTb2NrZXQgc29ja2V0LAogICAgICB7aG9zdCwKICAgICAgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgIGJvb2wgb25CYWRDZXJ0aWZpY2F0ZShYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUpfSkgewogICAgcmV0dXJuICgoc29ja2V0IGFzIGR5bmFtaWMgLypfU29ja2V0Ki8pLl9kZXRhY2hSYXcoKSBhcyBGdXR1cmUpCiAgICAgICAgLnRoZW48UmF3U2VjdXJlU29ja2V0PigoZGV0YWNoZWRSYXcpIHsKICAgICAgcmV0dXJuIFJhd1NlY3VyZVNvY2tldC5zZWN1cmUoZGV0YWNoZWRSYXdbMF0gYXMgUmF3U29ja2V0LAogICAgICAgICAgc3Vic2NyaXB0aW9uOiBkZXRhY2hlZFJhd1sxXSBhcyBTdHJlYW1TdWJzY3JpcHRpb248UmF3U29ja2V0RXZlbnQ+LAogICAgICAgICAgaG9zdDogaG9zdCwKICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgICBvbkJhZENlcnRpZmljYXRlOiBvbkJhZENlcnRpZmljYXRlKTsKICAgIH0pLnRoZW48U2VjdXJlU29ja2V0PigocmF3KSA9PiBuZXcgU2VjdXJlU29ja2V0Ll8ocmF3KSk7CiAgfQoKICAvKioKICAgKiBUYWtlcyBhbiBhbHJlYWR5IGNvbm5lY3RlZCBbc29ja2V0XSBhbmQgc3RhcnRzIHNlcnZlciBzaWRlIFRMUwogICAqIGhhbmRzaGFrZSB0byBtYWtlIHRoZSBjb21tdW5pY2F0aW9uIHNlY3VyZS4gV2hlbiB0aGUgcmV0dXJuZWQKICAgKiBmdXR1cmUgY29tcGxldGVzIHRoZSBbU2VjdXJlU29ja2V0XSBoYXMgY29tcGxldGVkIHRoZSBUTFMKICAgKiBoYW5kc2hha2UuIFVzaW5nIHRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdGhhdCB0aGUgb3RoZXIgZW5kIG9mIHRoZQogICAqIGNvbm5lY3Rpb24gaXMgZ29pbmcgdG8gc3RhcnQgdGhlIFRMUyBoYW5kc2hha2UuCiAgICoKICAgKiBJZiB0aGUgW3NvY2tldF0gYWxyZWFkeSBoYXMgYSBzdWJzY3JpcHRpb24sIHRoaXMgc3Vic2NyaXB0aW9uCiAgICogd2lsbCBubyBsb25nZXIgcmVjZWl2ZSBhbmQgZXZlbnRzLiBJbiBtb3N0IGNhc2VzIGNhbGxpbmcKICAgKiBbOnBhdXNlOl0gb24gdGhpcyBzdWJzY3JpcHRpb24gYmVmb3JlIHN0YXJ0aW5nIFRMUyBoYW5kc2hha2UgaXMKICAgKiB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uCiAgICoKICAgKiBJZiBzb21lIG9mIHRoZSBkYXRhIG9mIHRoZSBUTFMgaGFuZHNoYWtlIGhhcyBhbHJlYWR5IGJlZW4gcmVhZAogICAqIGZyb20gdGhlIHNvY2tldCB0aGlzIGRhdGEgY2FuIGJlIHBhc3NlZCBpbiB0aGUgW2J1ZmZlcmVkRGF0YV0KICAgKiBwYXJhbWV0ZXIuIFRoaXMgZGF0YSB3aWxsIGJlIHByb2Nlc3NlZCBiZWZvcmUgYW55IG90aGVyIGRhdGEKICAgKiBhdmFpbGFibGUgb24gdGhlIHNvY2tldC4KICAgKgogICAqIFNlZSBbU2VjdXJlU2VydmVyU29ja2V0LmJpbmRdIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZQogICAqIGFyZ3VtZW50cy4KICAgKgogICAqLwogIHN0YXRpYyBGdXR1cmU8U2VjdXJlU29ja2V0PiBzZWN1cmVTZXJ2ZXIoCiAgICAgIFNvY2tldCBzb2NrZXQsIFNlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICB7TGlzdDxpbnQ+IGJ1ZmZlcmVkRGF0YSwKICAgICAgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU6IGZhbHNlLAogICAgICBib29sIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIExpc3Q8U3RyaW5nPiBzdXBwb3J0ZWRQcm90b2NvbHN9KSB7CiAgICByZXR1cm4gKChzb2NrZXQgYXMgZHluYW1pYyAvKl9Tb2NrZXQqLykuX2RldGFjaFJhdygpIGFzIEZ1dHVyZSkKICAgICAgICAudGhlbjxSYXdTZWN1cmVTb2NrZXQ+KChkZXRhY2hlZFJhdykgewogICAgICByZXR1cm4gUmF3U2VjdXJlU29ja2V0LnNlY3VyZVNlcnZlcihkZXRhY2hlZFJhd1swXSBhcyBSYXdTb2NrZXQsIGNvbnRleHQsCiAgICAgICAgICBzdWJzY3JpcHRpb246IGRldGFjaGVkUmF3WzFdIGFzIFN0cmVhbVN1YnNjcmlwdGlvbjxSYXdTb2NrZXRFdmVudD4sCiAgICAgICAgICBidWZmZXJlZERhdGE6IGJ1ZmZlcmVkRGF0YSwKICAgICAgICAgIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogcmVxdWVzdENsaWVudENlcnRpZmljYXRlLAogICAgICAgICAgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgICBzdXBwb3J0ZWRQcm90b2NvbHM6IHN1cHBvcnRlZFByb3RvY29scyk7CiAgICB9KS50aGVuPFNlY3VyZVNvY2tldD4oKHJhdykgPT4gbmV3IFNlY3VyZVNvY2tldC5fKHJhdykpOwogIH0KCiAgLyoqCiAgICogR2V0IHRoZSBwZWVyIGNlcnRpZmljYXRlIGZvciBhIGNvbm5lY3RlZCBTZWN1cmVTb2NrZXQuICBJZiB0aGlzCiAgICogU2VjdXJlU29ja2V0IGlzIHRoZSBzZXJ2ZXIgZW5kIG9mIGEgc2VjdXJlIHNvY2tldCBjb25uZWN0aW9uLAogICAqIFtwZWVyQ2VydGlmaWNhdGVdIHdpbGwgcmV0dXJuIHRoZSBjbGllbnQgY2VydGlmaWNhdGUsIG9yIG51bGwsIGlmIG5vCiAgICogY2xpZW50IGNlcnRpZmljYXRlIHdhcyByZWNlaXZlZC4gIElmIGl0IGlzIHRoZSBjbGllbnQgZW5kLAogICAqIFtwZWVyQ2VydGlmaWNhdGVdIHdpbGwgcmV0dXJuIHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZS4KICAgKi8KICBYNTA5Q2VydGlmaWNhdGUgZ2V0IHBlZXJDZXJ0aWZpY2F0ZTsKCiAgLyoqCiAgICogVGhlIHByb3RvY29sIHdoaWNoIHdhcyBzZWxlY3RlZCBkdXJpbmcgQUxQTiBwcm90b2NvbCBuZWdvdGlhdGlvbi4KICAgKgogICAqIFJldHVybnMgbnVsbCBpZiBvbmUgb2YgdGhlIHBlZXJzIGRvZXMgbm90IGhhdmUgc3VwcG9ydCBmb3IgQUxQTiwgZGlkIG5vdAogICAqIHNwZWNpZnkgYSBsaXN0IG9mIHN1cHBvcnRlZCBBTFBOIHByb3RvY29scyBvciB0aGVyZSB3YXMgbm8gY29tbW9uCiAgICogcHJvdG9jb2wgYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlci4KICAgKi8KICBTdHJpbmcgZ2V0IHNlbGVjdGVkUHJvdG9jb2w7CgogIC8qKgogICAqIFJlbmVnb3RpYXRlIGFuIGV4aXN0aW5nIHNlY3VyZSBjb25uZWN0aW9uLCByZW5ld2luZyB0aGUgc2Vzc2lvbiBrZXlzCiAgICogYW5kIHBvc3NpYmx5IGNoYW5naW5nIHRoZSBjb25uZWN0aW9uIHByb3BlcnRpZXMuCiAgICoKICAgKiBUaGlzIHJlcGVhdHMgdGhlIFNTTCBvciBUTFMgaGFuZHNoYWtlLCB3aXRoIG9wdGlvbnMgdGhhdCBhbGxvdyBjbGVhcmluZwogICAqIHRoZSBzZXNzaW9uIGNhY2hlIGFuZCByZXF1ZXN0aW5nIGEgY2xpZW50IGNlcnRpZmljYXRlLgogICAqLwogIHZvaWQgcmVuZWdvdGlhdGUoCiAgICAgIHtib29sIHVzZVNlc3Npb25DYWNoZTogdHJ1ZSwKICAgICAgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU6IGZhbHNlLAogICAgICBib29sIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2V9KTsKfQoKLyoqCiAqIFJhd1NlY3VyZVNvY2tldCBwcm92aWRlcyBhIHNlY3VyZSAoU1NMIG9yIFRMUykgbmV0d29yayBjb25uZWN0aW9uLgogKiBDbGllbnQgY29ubmVjdGlvbnMgdG8gYSBzZXJ2ZXIgYXJlIHByb3ZpZGVkIGJ5IGNhbGxpbmcKICogUmF3U2VjdXJlU29ja2V0LmNvbm5lY3QuICBBIHNlY3VyZSBzZXJ2ZXIsIGNyZWF0ZWQgd2l0aAogKiBbUmF3U2VjdXJlU2VydmVyU29ja2V0XSwgYWxzbyByZXR1cm5zIFJhd1NlY3VyZVNvY2tldCBvYmplY3RzIHJlcHJlc2VudGluZwogKiB0aGUgc2VydmVyIGVuZCBvZiBhIHNlY3VyZSBjb25uZWN0aW9uLgogKiBUaGUgY2VydGlmaWNhdGUgcHJvdmlkZWQgYnkgdGhlIHNlcnZlciBpcyBjaGVja2VkCiAqIHVzaW5nIHRoZSB0cnVzdGVkIGNlcnRpZmljYXRlcyBzZXQgaW4gdGhlIFNlY3VyaXR5Q29udGV4dCBvYmplY3QuCiAqIFRoZSBkZWZhdWx0IFtTZWN1cml0eUNvbnRleHRdIG9iamVjdCBjb250YWlucyBhIGJ1aWx0LWluIHNldCBvZiB0cnVzdGVkCiAqIHJvb3QgY2VydGlmaWNhdGVzIGZvciB3ZWxsLWtub3duIGNlcnRpZmljYXRlIGF1dGhvcml0aWVzLgogKi8KYWJzdHJhY3QgY2xhc3MgUmF3U2VjdXJlU29ja2V0IGltcGxlbWVudHMgUmF3U29ja2V0IHsKICAvKioKICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNlY3VyZSBjbGllbnQgc29ja2V0IGFuZCBjb25uZWN0IGl0IHRvIHRoZSBnaXZlbgogICAqIGhvc3Qgb24gdGhlIGdpdmVuIHBvcnQuIFRoZSByZXR1cm5lZCBbRnV0dXJlXSBpcyBjb21wbGV0ZWQgd2l0aCB0aGUKICAgKiBSYXdTZWN1cmVTb2NrZXQgd2hlbiBpdCBpcyBjb25uZWN0ZWQgYW5kIHJlYWR5IGZvciBzdWJzY3JpcHRpb24uCiAgICoKICAgKiBUaGUgY2VydGlmaWNhdGUgcHJvdmlkZWQgYnkgdGhlIHNlcnZlciBpcyBjaGVja2VkIHVzaW5nIHRoZSB0cnVzdGVkCiAgICogY2VydGlmaWNhdGVzIHNldCBpbiB0aGUgU2VjdXJpdHlDb250ZXh0IG9iamVjdCBJZiBhIGNlcnRpZmljYXRlIGFuZCBrZXkgYXJlCiAgICogc2V0IG9uIHRoZSBjbGllbnQsIHVzaW5nIFtTZWN1cml0eUNvbnRleHQudXNlQ2VydGlmaWNhdGVDaGFpbl0gYW5kCiAgICogW1NlY3VyaXR5Q29udGV4dC51c2VQcml2YXRlS2V5XSwgYW5kIHRoZSBzZXJ2ZXIgYXNrcyBmb3IgYSBjbGllbnQKICAgKiBjZXJ0aWZpY2F0ZSwgdGhlbiB0aGF0IGNsaWVudCBjZXJ0aWZpY2F0ZSBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIuCiAgICoKICAgKiBbb25CYWRDZXJ0aWZpY2F0ZV0gaXMgYW4gb3B0aW9uYWwgaGFuZGxlciBmb3IgdW52ZXJpZmlhYmxlIGNlcnRpZmljYXRlcy4KICAgKiBUaGUgaGFuZGxlciByZWNlaXZlcyB0aGUgW1g1MDlDZXJ0aWZpY2F0ZV0sIGFuZCBjYW4gaW5zcGVjdCBpdCBhbmQKICAgKiBkZWNpZGUgKG9yIGxldCB0aGUgdXNlciBkZWNpZGUpIHdoZXRoZXIgdG8gYWNjZXB0CiAgICogdGhlIGNvbm5lY3Rpb24gb3Igbm90LiAgVGhlIGhhbmRsZXIgc2hvdWxkIHJldHVybiB0cnVlCiAgICogdG8gY29udGludWUgdGhlIFtSYXdTZWN1cmVTb2NrZXRdIGNvbm5lY3Rpb24uCiAgICoKICAgKiBbc3VwcG9ydGVkUHJvdG9jb2xzXSBpcyBhbiBvcHRpb25hbCBsaXN0IG9mIHByb3RvY29scyAoaW4gZGVjcmVhc2luZwogICAqIG9yZGVyIG9mIHByZWZlcmVuY2UpIHRvIHVzZSBkdXJpbmcgdGhlIEFMUE4gcHJvdG9jb2wgbmVnb3RpYXRpb24gd2l0aCB0aGUKICAgKiBzZXJ2ZXIuICBFeGFtcGxlIHZhbHVlcyBhcmUgImh0dHAvMS4xIiBvciAiaDIiLiAgVGhlIHNlbGVjdGVkIHByb3RvY29sCiAgICogY2FuIGJlIG9idGFpbmVkIHZpYSBbUmF3U2VjdXJlU29ja2V0LnNlbGVjdGVkUHJvdG9jb2xdLgogICAqLwogIHN0YXRpYyBGdXR1cmU8UmF3U2VjdXJlU29ja2V0PiBjb25uZWN0KGhvc3QsIGludCBwb3J0LAogICAgICB7U2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgIGJvb2wgb25CYWRDZXJ0aWZpY2F0ZShYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUpLAogICAgICBMaXN0PFN0cmluZz4gc3VwcG9ydGVkUHJvdG9jb2xzLAogICAgICBEdXJhdGlvbiB0aW1lb3V0fSkgewogICAgX1Jhd1NlY3VyZVNvY2tldC5fdmVyaWZ5RmllbGRzKAogICAgICAgIGhvc3QsIHBvcnQsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIG9uQmFkQ2VydGlmaWNhdGUpOwogICAgcmV0dXJuIFJhd1NvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQsIHRpbWVvdXQ6IHRpbWVvdXQpLnRoZW4oKHNvY2tldCkgewogICAgICByZXR1cm4gc2VjdXJlKHNvY2tldCwKICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgICBvbkJhZENlcnRpZmljYXRlOiBvbkJhZENlcnRpZmljYXRlLAogICAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xzOiBzdXBwb3J0ZWRQcm90b2NvbHMpOwogICAgfSk7CiAgfQoKICAvLy8gTGlrZSBbY29ubmVjdF0sIGJ1dCByZXR1cm5zIGEgW0Z1dHVyZV0gdGhhdCBjb21wbGV0ZXMgd2l0aCBhCiAgLy8vIFtDb25uZWN0aW9uVGFza10gdGhhdCBjYW4gYmUgY2FuY2VsbGVkIGlmIHRoZSBbUmF3U2VjdXJlU29ja2V0XSBpcyBubwogIC8vLyBsb25nZXIgbmVlZGVkLgogIHN0YXRpYyBGdXR1cmU8Q29ubmVjdGlvblRhc2s8UmF3U2VjdXJlU29ja2V0Pj4gc3RhcnRDb25uZWN0KGhvc3QsIGludCBwb3J0LAogICAgICB7U2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgIGJvb2wgb25CYWRDZXJ0aWZpY2F0ZShYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUpLAogICAgICBMaXN0PFN0cmluZz4gc3VwcG9ydGVkUHJvdG9jb2xzfSkgewogICAgcmV0dXJuIFJhd1NvY2tldC5zdGFydENvbm5lY3QoaG9zdCwgcG9ydCkKICAgICAgICAudGhlbigoQ29ubmVjdGlvblRhc2s8UmF3U29ja2V0PiByYXdTdGF0ZSkgewogICAgICBGdXR1cmU8UmF3U2VjdXJlU29ja2V0PiBzb2NrZXQgPSByYXdTdGF0ZS5zb2NrZXQudGhlbigocmF3U29ja2V0KSB7CiAgICAgICAgcmV0dXJuIHNlY3VyZShyYXdTb2NrZXQsCiAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgICAgIG9uQmFkQ2VydGlmaWNhdGU6IG9uQmFkQ2VydGlmaWNhdGUsCiAgICAgICAgICAgIHN1cHBvcnRlZFByb3RvY29sczogc3VwcG9ydGVkUHJvdG9jb2xzKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvblRhc2s8UmF3U2VjdXJlU29ja2V0Pi5fKAogICAgICAgICAgc29ja2V0OiBzb2NrZXQsIG9uQ2FuY2VsOiByYXdTdGF0ZS5fb25DYW5jZWwpOwogICAgfSk7CiAgfQoKICAvKioKICAgKiBUYWtlcyBhbiBhbHJlYWR5IGNvbm5lY3RlZCBbc29ja2V0XSBhbmQgc3RhcnRzIGNsaWVudCBzaWRlIFRMUwogICAqIGhhbmRzaGFrZSB0byBtYWtlIHRoZSBjb21tdW5pY2F0aW9uIHNlY3VyZS4gV2hlbiB0aGUgcmV0dXJuZWQKICAgKiBmdXR1cmUgY29tcGxldGVzIHRoZSBbUmF3U2VjdXJlU29ja2V0XSBoYXMgY29tcGxldGVkIHRoZSBUTFMKICAgKiBoYW5kc2hha2UuIFVzaW5nIHRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdGhhdCB0aGUgb3RoZXIgZW5kIG9mIHRoZQogICAqIGNvbm5lY3Rpb24gaXMgcHJlcGFyZWQgZm9yIFRMUyBoYW5kc2hha2UuCiAgICoKICAgKiBJZiB0aGUgW3NvY2tldF0gYWxyZWFkeSBoYXMgYSBzdWJzY3JpcHRpb24sIHBhc3MgdGhlIGV4aXN0aW5nCiAgICogc3Vic2NyaXB0aW9uIGluIHRoZSBbc3Vic2NyaXB0aW9uXSBwYXJhbWV0ZXIuIFRoZSBbc2VjdXJlXQogICAqIG9wZXJhdGlvbiB3aWxsIHRha2Ugb3ZlciB0aGUgc3Vic2NyaXB0aW9uIGJ5IHJlcGxhY2luZyB0aGUKICAgKiBoYW5kbGVycyB3aXRoIGl0IG93biBzZWN1cmUgcHJvY2Vzc2luZy4gVGhlIGNhbGxlciBtdXN0IG5vdCB0b3VjaAogICAqIHRoaXMgc3Vic2NyaXB0aW9uIGFueW1vcmUuIFBhc3NpbmcgYSBwYXVzZWQgc3Vic2NyaXB0aW9uIGlzIGFuCiAgICogZXJyb3IuCiAgICoKICAgKiBJZiB0aGUgW2hvc3RdIGFyZ3VtZW50IGlzIHBhc3NlZCBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGhvc3QgbmFtZQogICAqIGZvciB0aGUgVExTIGhhbmRzaGFrZS4gSWYgW2hvc3RdIGlzIG5vdCBwYXNzZWQgdGhlIGhvc3QgbmFtZSBmcm9tCiAgICogdGhlIFtzb2NrZXRdIHdpbGwgYmUgdXNlZC4gVGhlIFtob3N0XSBjYW4gYmUgZWl0aGVyIGEgW1N0cmluZ10gb3IKICAgKiBhbiBbSW50ZXJuZXRBZGRyZXNzXS4KICAgKgogICAqIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIF9ub3RfIGNhdXNlIGEgRE5TIGhvc3QgbG9va3VwLiBJZiB0aGUKICAgKiBbaG9zdF0gcGFzc2VkIGlzIGEgW1N0cmluZ10gdGhlIFtJbnRlcm5ldEFkZHJlc3NdIGZvciB0aGUKICAgKiByZXN1bHRpbmcgW1NlY3VyZVNvY2tldF0gd2lsbCBoYXZlIHRoaXMgcGFzc2VkIGluIFtob3N0XSBhcyBpdHMKICAgKiBob3N0IHZhbHVlIGFuZCB0aGUgaW50ZXJuZXQgYWRkcmVzcyBvZiB0aGUgYWxyZWFkeSBjb25uZWN0ZWQKICAgKiBzb2NrZXQgYXMgaXRzIGFkZHJlc3MgdmFsdWUuCiAgICoKICAgKiBTZWUgW2Nvbm5lY3RdIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBhcmd1bWVudHMuCiAgICoKICAgKi8KICBzdGF0aWMgRnV0dXJlPFJhd1NlY3VyZVNvY2tldD4gc2VjdXJlKFJhd1NvY2tldCBzb2NrZXQsCiAgICAgIHtTdHJlYW1TdWJzY3JpcHRpb248UmF3U29ja2V0RXZlbnQ+IHN1YnNjcmlwdGlvbiwKICAgICAgaG9zdCwKICAgICAgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgIGJvb2wgb25CYWRDZXJ0aWZpY2F0ZShYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUpLAogICAgICBMaXN0PFN0cmluZz4gc3VwcG9ydGVkUHJvdG9jb2xzfSkgewogICAgc29ja2V0LnJlYWRFdmVudHNFbmFibGVkID0gZmFsc2U7CiAgICBzb2NrZXQud3JpdGVFdmVudHNFbmFibGVkID0gZmFsc2U7CiAgICByZXR1cm4gX1Jhd1NlY3VyZVNvY2tldC5jb25uZWN0KAogICAgICAgIGhvc3QgIT0gbnVsbCA/IGhvc3QgOiBzb2NrZXQuYWRkcmVzcy5ob3N0LCBzb2NrZXQucG9ydCwKICAgICAgICBpc19zZXJ2ZXI6IGZhbHNlLAogICAgICAgIHNvY2tldDogc29ja2V0LAogICAgICAgIHN1YnNjcmlwdGlvbjogc3Vic2NyaXB0aW9uLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgb25CYWRDZXJ0aWZpY2F0ZTogb25CYWRDZXJ0aWZpY2F0ZSwKICAgICAgICBzdXBwb3J0ZWRQcm90b2NvbHM6IHN1cHBvcnRlZFByb3RvY29scyk7CiAgfQoKICAvKioKICAgKiBUYWtlcyBhbiBhbHJlYWR5IGNvbm5lY3RlZCBbc29ja2V0XSBhbmQgc3RhcnRzIHNlcnZlciBzaWRlIFRMUwogICAqIGhhbmRzaGFrZSB0byBtYWtlIHRoZSBjb21tdW5pY2F0aW9uIHNlY3VyZS4gV2hlbiB0aGUgcmV0dXJuZWQKICAgKiBmdXR1cmUgY29tcGxldGVzIHRoZSBbUmF3U2VjdXJlU29ja2V0XSBoYXMgY29tcGxldGVkIHRoZSBUTFMKICAgKiBoYW5kc2hha2UuIFVzaW5nIHRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdGhhdCB0aGUgb3RoZXIgZW5kIG9mIHRoZQogICAqIGNvbm5lY3Rpb24gaXMgZ29pbmcgdG8gc3RhcnQgdGhlIFRMUyBoYW5kc2hha2UuCiAgICoKICAgKiBJZiB0aGUgW3NvY2tldF0gYWxyZWFkeSBoYXMgYSBzdWJzY3JpcHRpb24sIHBhc3MgdGhlIGV4aXN0aW5nCiAgICogc3Vic2NyaXB0aW9uIGluIHRoZSBbc3Vic2NyaXB0aW9uXSBwYXJhbWV0ZXIuIFRoZSBbc2VjdXJlU2VydmVyXQogICAqIG9wZXJhdGlvbiB3aWxsIHRha2Ugb3ZlciB0aGUgc3Vic2NyaXB0aW9uIGJ5IHJlcGxhY2luZyB0aGUKICAgKiBoYW5kbGVycyB3aXRoIGl0IG93biBzZWN1cmUgcHJvY2Vzc2luZy4gVGhlIGNhbGxlciBtdXN0IG5vdCB0b3VjaAogICAqIHRoaXMgc3Vic2NyaXB0aW9uIGFueW1vcmUuIFBhc3NpbmcgYSBwYXVzZWQgc3Vic2NyaXB0aW9uIGlzIGFuCiAgICogZXJyb3IuCiAgICoKICAgKiBJZiBzb21lIG9mIHRoZSBkYXRhIG9mIHRoZSBUTFMgaGFuZHNoYWtlIGhhcyBhbHJlYWR5IGJlZW4gcmVhZAogICAqIGZyb20gdGhlIHNvY2tldCB0aGlzIGRhdGEgY2FuIGJlIHBhc3NlZCBpbiB0aGUgW2J1ZmZlcmVkRGF0YV0KICAgKiBwYXJhbWV0ZXIuIFRoaXMgZGF0YSB3aWxsIGJlIHByb2Nlc3NlZCBiZWZvcmUgYW55IG90aGVyIGRhdGEKICAgKiBhdmFpbGFibGUgb24gdGhlIHNvY2tldC4KICAgKgogICAqIFNlZSBbUmF3U2VjdXJlU2VydmVyU29ja2V0LmJpbmRdIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZQogICAqIGFyZ3VtZW50cy4KICAgKgogICAqLwogIHN0YXRpYyBGdXR1cmU8UmF3U2VjdXJlU29ja2V0PiBzZWN1cmVTZXJ2ZXIoCiAgICAgIFJhd1NvY2tldCBzb2NrZXQsIFNlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICB7U3RyZWFtU3Vic2NyaXB0aW9uPFJhd1NvY2tldEV2ZW50PiBzdWJzY3JpcHRpb24sCiAgICAgIExpc3Q8aW50PiBidWZmZXJlZERhdGEsCiAgICAgIGJvb2wgcmVxdWVzdENsaWVudENlcnRpZmljYXRlOiBmYWxzZSwKICAgICAgYm9vbCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGU6IGZhbHNlLAogICAgICBMaXN0PFN0cmluZz4gc3VwcG9ydGVkUHJvdG9jb2xzfSkgewogICAgc29ja2V0LnJlYWRFdmVudHNFbmFibGVkID0gZmFsc2U7CiAgICBzb2NrZXQud3JpdGVFdmVudHNFbmFibGVkID0gZmFsc2U7CiAgICByZXR1cm4gX1Jhd1NlY3VyZVNvY2tldC5jb25uZWN0KHNvY2tldC5hZGRyZXNzLCBzb2NrZXQucmVtb3RlUG9ydCwKICAgICAgICBjb250ZXh0OiBjb250ZXh0LAogICAgICAgIGlzX3NlcnZlcjogdHJ1ZSwKICAgICAgICBzb2NrZXQ6IHNvY2tldCwKICAgICAgICBzdWJzY3JpcHRpb246IHN1YnNjcmlwdGlvbiwKICAgICAgICBidWZmZXJlZERhdGE6IGJ1ZmZlcmVkRGF0YSwKICAgICAgICByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU6IHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGU6IHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICBzdXBwb3J0ZWRQcm90b2NvbHM6IHN1cHBvcnRlZFByb3RvY29scyk7CiAgfQoKICAvKioKICAgKiBSZW5lZ290aWF0ZSBhbiBleGlzdGluZyBzZWN1cmUgY29ubmVjdGlvbiwgcmVuZXdpbmcgdGhlIHNlc3Npb24ga2V5cwogICAqIGFuZCBwb3NzaWJseSBjaGFuZ2luZyB0aGUgY29ubmVjdGlvbiBwcm9wZXJ0aWVzLgogICAqCiAgICogVGhpcyByZXBlYXRzIHRoZSBTU0wgb3IgVExTIGhhbmRzaGFrZSwgd2l0aCBvcHRpb25zIHRoYXQgYWxsb3cgY2xlYXJpbmcKICAgKiB0aGUgc2Vzc2lvbiBjYWNoZSBhbmQgcmVxdWVzdGluZyBhIGNsaWVudCBjZXJ0aWZpY2F0ZS4KICAgKi8KICB2b2lkIHJlbmVnb3RpYXRlKAogICAgICB7Ym9vbCB1c2VTZXNzaW9uQ2FjaGU6IHRydWUsCiAgICAgIGJvb2wgcmVxdWVzdENsaWVudENlcnRpZmljYXRlOiBmYWxzZSwKICAgICAgYm9vbCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGU6IGZhbHNlfSk7CgogIC8qKgogICAqIEdldCB0aGUgcGVlciBjZXJ0aWZpY2F0ZSBmb3IgYSBjb25uZWN0ZWQgUmF3U2VjdXJlU29ja2V0LiAgSWYgdGhpcwogICAqIFJhd1NlY3VyZVNvY2tldCBpcyB0aGUgc2VydmVyIGVuZCBvZiBhIHNlY3VyZSBzb2NrZXQgY29ubmVjdGlvbiwKICAgKiBbcGVlckNlcnRpZmljYXRlXSB3aWxsIHJldHVybiB0aGUgY2xpZW50IGNlcnRpZmljYXRlLCBvciBudWxsLCBpZiBubwogICAqIGNsaWVudCBjZXJ0aWZpY2F0ZSB3YXMgcmVjZWl2ZWQuICBJZiBpdCBpcyB0aGUgY2xpZW50IGVuZCwKICAgKiBbcGVlckNlcnRpZmljYXRlXSB3aWxsIHJldHVybiB0aGUgc2VydmVyJ3MgY2VydGlmaWNhdGUuCiAgICovCiAgWDUwOUNlcnRpZmljYXRlIGdldCBwZWVyQ2VydGlmaWNhdGU7CgogIC8qKgogICAqIFRoZSBwcm90b2NvbCB3aGljaCB3YXMgc2VsZWN0ZWQgZHVyaW5nIHByb3RvY29sIG5lZ290aWF0aW9uLgogICAqCiAgICogUmV0dXJucyBudWxsIGlmIG9uZSBvZiB0aGUgcGVlcnMgZG9lcyBub3QgaGF2ZSBzdXBwb3J0IGZvciBBTFBOLCBkaWQgbm90CiAgICogc3BlY2lmeSBhIGxpc3Qgb2Ygc3VwcG9ydGVkIEFMUE4gcHJvdG9jb2xzIG9yIHRoZXJlIHdhcyBubyBjb21tb24KICAgKiBwcm90b2NvbCBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyLgogICAqLwogIFN0cmluZyBnZXQgc2VsZWN0ZWRQcm90b2NvbDsKfQoKLyoqCiAqIFg1MDlDZXJ0aWZpY2F0ZSByZXByZXNlbnRzIGFuIFNTTCBjZXJ0aWZpY2F0ZSwgd2l0aCBhY2Nlc3NvcnMgdG8KICogZ2V0IHRoZSBmaWVsZHMgb2YgdGhlIGNlcnRpZmljYXRlLgogKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQphYnN0cmFjdCBjbGFzcyBYNTA5Q2VydGlmaWNhdGUgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBleHRlcm5hbCBmYWN0b3J5IFg1MDlDZXJ0aWZpY2F0ZS5fKCk7CgogIC8vLyBUaGUgREVSIGVuY29kZWQgYnl0ZXMgb2YgdGhlIGNlcnRpZmljYXRlLgogIFVpbnQ4TGlzdCBnZXQgZGVyOwoKICAvLy8gVGhlIFBFTSBlbmNvZGVkIFN0cmluZyBvZiB0aGUgY2VydGlmaWNhdGUuCiAgU3RyaW5nIGdldCBwZW07CgogIC8vLyBUaGUgU0hBMSBoYXNoIG9mIHRoZSBjZXJ0aWZpY2F0ZS4KICBVaW50OExpc3QgZ2V0IHNoYTE7CgogIFN0cmluZyBnZXQgc3ViamVjdDsKICBTdHJpbmcgZ2V0IGlzc3VlcjsKICBEYXRlVGltZSBnZXQgc3RhcnRWYWxpZGl0eTsKICBEYXRlVGltZSBnZXQgZW5kVmFsaWRpdHk7Cn0KCmNsYXNzIF9GaWx0ZXJTdGF0dXMgewogIGJvb2wgcHJvZ3Jlc3MgPSBmYWxzZTsgLy8gVGhlIGZpbHRlciByZWFkIG9yIHdyb3RlIGRhdGEgdG8gdGhlIGJ1ZmZlcnMuCiAgYm9vbCByZWFkRW1wdHkgPSB0cnVlOyAvLyBUaGUgcmVhZCBidWZmZXJzIGFuZCBkZWNyeXB0aW9uIGZpbHRlciBhcmUgZW1wdHkuCiAgYm9vbCB3cml0ZUVtcHR5ID0gdHJ1ZTsgLy8gVGhlIHdyaXRlIGJ1ZmZlcnMgYW5kIGVuY3J5cHRpb24gZmlsdGVyIGFyZSBlbXB0eS4KICAvLyBUaGVzZSBhcmUgc2V0IGlmIGEgYnVmZmVyIGNoYW5nZXMgc3RhdGUgZnJvbSBlbXB0eSBvciBmdWxsLgogIGJvb2wgcmVhZFBsYWludGV4dE5vTG9uZ2VyRW1wdHkgPSBmYWxzZTsKICBib29sIHdyaXRlUGxhaW50ZXh0Tm9Mb25nZXJGdWxsID0gZmFsc2U7CiAgYm9vbCByZWFkRW5jcnlwdGVkTm9Mb25nZXJGdWxsID0gZmFsc2U7CiAgYm9vbCB3cml0ZUVuY3J5cHRlZE5vTG9uZ2VyRW1wdHkgPSBmYWxzZTsKCiAgX0ZpbHRlclN0YXR1cygpOwp9CgpjbGFzcyBfUmF3U2VjdXJlU29ja2V0IGV4dGVuZHMgU3RyZWFtPFJhd1NvY2tldEV2ZW50PgogICAgaW1wbGVtZW50cyBSYXdTZWN1cmVTb2NrZXQgewogIC8vIFN0YXR1cyBzdGF0ZXMKICBzdGF0aWMgY29uc3QgaW50IGhhbmRzaGFrZVN0YXR1cyA9IDIwMTsKICBzdGF0aWMgY29uc3QgaW50IGNvbm5lY3RlZFN0YXR1cyA9IDIwMjsKICBzdGF0aWMgY29uc3QgaW50IGNsb3NlZFN0YXR1cyA9IDIwMzsKCiAgLy8gQnVmZmVyIGlkZW50aWZpZXJzLgogIC8vIFRoZXNlIG11c3QgYWdyZWUgd2l0aCB0aG9zZSBpbiB0aGUgbmF0aXZlIEMrKyBpbXBsZW1lbnRhdGlvbi4KICBzdGF0aWMgY29uc3QgaW50IHJlYWRQbGFpbnRleHRJZCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCB3cml0ZVBsYWludGV4dElkID0gMTsKICBzdGF0aWMgY29uc3QgaW50IHJlYWRFbmNyeXB0ZWRJZCA9IDI7CiAgc3RhdGljIGNvbnN0IGludCB3cml0ZUVuY3J5cHRlZElkID0gMzsKICBzdGF0aWMgY29uc3QgaW50IGJ1ZmZlckNvdW50ID0gNDsKCiAgLy8gSXMgYSBidWZmZXIgaWRlbnRpZmllciBmb3IgYW4gZW5jcnlwdGVkIGJ1ZmZlcj8KICBzdGF0aWMgYm9vbCBfaXNCdWZmZXJFbmNyeXB0ZWQoaW50IGlkZW50aWZpZXIpID0+CiAgICAgIGlkZW50aWZpZXIgPj0gcmVhZEVuY3J5cHRlZElkOwoKICBSYXdTb2NrZXQgX3NvY2tldDsKICBmaW5hbCBDb21wbGV0ZXI8X1Jhd1NlY3VyZVNvY2tldD4gX2hhbmRzaGFrZUNvbXBsZXRlID0KICAgICAgbmV3IENvbXBsZXRlcjxfUmF3U2VjdXJlU29ja2V0PigpOwogIFN0cmVhbUNvbnRyb2xsZXI8UmF3U29ja2V0RXZlbnQ+IF9jb250cm9sbGVyOwogIFN0cmVhbTxSYXdTb2NrZXRFdmVudD4gX3N0cmVhbTsKICBTdHJlYW1TdWJzY3JpcHRpb248UmF3U29ja2V0RXZlbnQ+IF9zb2NrZXRTdWJzY3JpcHRpb247CiAgTGlzdDxpbnQ+IF9idWZmZXJlZERhdGE7CiAgaW50IF9idWZmZXJlZERhdGFJbmRleCA9IDA7CiAgZmluYWwgSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3M7CiAgZmluYWwgYm9vbCBpc19zZXJ2ZXI7CiAgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQ7CiAgZmluYWwgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU7CiAgZmluYWwgYm9vbCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGU7CiAgZmluYWwgRnVuY3Rpb24gb25CYWRDZXJ0aWZpY2F0ZTsKCiAgdmFyIF9zdGF0dXMgPSBoYW5kc2hha2VTdGF0dXM7CiAgYm9vbCBfd3JpdGVFdmVudHNFbmFibGVkID0gdHJ1ZTsKICBib29sIF9yZWFkRXZlbnRzRW5hYmxlZCA9IHRydWU7CiAgaW50IF9wYXVzZUNvdW50ID0gMDsKICBib29sIF9wZW5kaW5nUmVhZEV2ZW50ID0gZmFsc2U7CiAgYm9vbCBfc29ja2V0Q2xvc2VkUmVhZCA9IGZhbHNlOyAvLyBUaGUgbmV0d29yayBzb2NrZXQgaXMgY2xvc2VkIGZvciByZWFkaW5nLgogIGJvb2wgX3NvY2tldENsb3NlZFdyaXRlID0gZmFsc2U7IC8vIFRoZSBuZXR3b3JrIHNvY2tldCBpcyBjbG9zZWQgZm9yIHdyaXRpbmcuCiAgYm9vbCBfY2xvc2VkUmVhZCA9IGZhbHNlOyAvLyBUaGUgc2VjdXJlIHNvY2tldCBoYXMgZmlyZWQgYW4gb25DbG9zZWQgZXZlbnQuCiAgYm9vbCBfY2xvc2VkV3JpdGUgPSBmYWxzZTsgLy8gVGhlIHNlY3VyZSBzb2NrZXQgaGFzIGJlZW4gY2xvc2VkIGZvciB3cml0aW5nLgogIC8vIFRoZSBuZXR3b3JrIHNvY2tldCBpcyBnb25lLgogIENvbXBsZXRlcjxSYXdTZWN1cmVTb2NrZXQ+IF9jbG9zZUNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8UmF3U2VjdXJlU29ja2V0PigpOwogIF9GaWx0ZXJTdGF0dXMgX2ZpbHRlclN0YXR1cyA9IG5ldyBfRmlsdGVyU3RhdHVzKCk7CiAgYm9vbCBfY29ubmVjdFBlbmRpbmcgPSB0cnVlOwogIGJvb2wgX2ZpbHRlclBlbmRpbmcgPSBmYWxzZTsKICBib29sIF9maWx0ZXJBY3RpdmUgPSBmYWxzZTsKCiAgX1NlY3VyZUZpbHRlciBfc2VjdXJlRmlsdGVyID0gbmV3IF9TZWN1cmVGaWx0ZXIuXygpOwogIFN0cmluZyBfc2VsZWN0ZWRQcm90b2NvbDsKCiAgc3RhdGljIEZ1dHVyZTxfUmF3U2VjdXJlU29ja2V0PiBjb25uZWN0KAogICAgICBkeW5hbWljIC8qU3RyaW5nfEludGVybmV0QWRkcmVzcyovIGhvc3QsIGludCByZXF1ZXN0ZWRQb3J0LAogICAgICB7Ym9vbCBpc19zZXJ2ZXIsCiAgICAgIFNlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICBSYXdTb2NrZXQgc29ja2V0LAogICAgICBTdHJlYW1TdWJzY3JpcHRpb248UmF3U29ja2V0RXZlbnQ+IHN1YnNjcmlwdGlvbiwKICAgICAgTGlzdDxpbnQ+IGJ1ZmZlcmVkRGF0YSwKICAgICAgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU6IGZhbHNlLAogICAgICBib29sIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIGJvb2wgb25CYWRDZXJ0aWZpY2F0ZShYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUpLAogICAgICBMaXN0PFN0cmluZz4gc3VwcG9ydGVkUHJvdG9jb2xzfSkgewogICAgX3ZlcmlmeUZpZWxkcyhob3N0LCByZXF1ZXN0ZWRQb3J0LCBpc19zZXJ2ZXIsIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsIG9uQmFkQ2VydGlmaWNhdGUpOwogICAgaWYgKGhvc3QgaXMgSW50ZXJuZXRBZGRyZXNzKSBob3N0ID0gaG9zdC5ob3N0OwogICAgSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3MgPSBzb2NrZXQuYWRkcmVzczsKICAgIGlmIChob3N0ICE9IG51bGwpIHsKICAgICAgYWRkcmVzcyA9IEludGVybmV0QWRkcmVzcy5fY2xvbmVXaXRoTmV3SG9zdChhZGRyZXNzLCBob3N0KTsKICAgIH0KICAgIHJldHVybiBuZXcgX1Jhd1NlY3VyZVNvY2tldCgKICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgcmVxdWVzdGVkUG9ydCwKICAgICAgICAgICAgaXNfc2VydmVyLAogICAgICAgICAgICBjb250ZXh0LAogICAgICAgICAgICBzb2NrZXQsCiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiwKICAgICAgICAgICAgYnVmZmVyZWREYXRhLAogICAgICAgICAgICByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgICAgIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgb25CYWRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xzKQogICAgICAgIC5faGFuZHNoYWtlQ29tcGxldGUKICAgICAgICAuZnV0dXJlOwogIH0KCiAgX1Jhd1NlY3VyZVNvY2tldCgKICAgICAgdGhpcy5hZGRyZXNzLAogICAgICBpbnQgcmVxdWVzdGVkUG9ydCwKICAgICAgdGhpcy5pc19zZXJ2ZXIsCiAgICAgIHRoaXMuY29udGV4dCwKICAgICAgdGhpcy5fc29ja2V0LAogICAgICB0aGlzLl9zb2NrZXRTdWJzY3JpcHRpb24sCiAgICAgIHRoaXMuX2J1ZmZlcmVkRGF0YSwKICAgICAgdGhpcy5yZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgIHRoaXMucmVxdWlyZUNsaWVudENlcnRpZmljYXRlLAogICAgICB0aGlzLm9uQmFkQ2VydGlmaWNhdGUsCiAgICAgIExpc3Q8U3RyaW5nPiBzdXBwb3J0ZWRQcm90b2NvbHMpIHsKICAgIGNvbnRleHQgPz89IFNlY3VyaXR5Q29udGV4dC5kZWZhdWx0Q29udGV4dDsKICAgIF9jb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8UmF3U29ja2V0RXZlbnQ+KAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlLAogICAgICAgIG9uUGF1c2U6IF9vblBhdXNlU3RhdGVDaGFuZ2UsCiAgICAgICAgb25SZXN1bWU6IF9vblBhdXNlU3RhdGVDaGFuZ2UsCiAgICAgICAgb25DYW5jZWw6IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlKTsKICAgIF9zdHJlYW0gPSBfY29udHJvbGxlci5zdHJlYW07CiAgICAvLyBUaHJvdyBhbiBBcmd1bWVudEVycm9yIGlmIGFueSBmaWVsZCBpcyBpbnZhbGlkLiAgQWZ0ZXIgdGhpcywgYWxsCiAgICAvLyBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZCB0aHJvdWdoIHRoZSBmdXR1cmUgb3IgdGhlIHN0cmVhbS4KICAgIF9zZWN1cmVGaWx0ZXIuaW5pdCgpOwogICAgX3NlY3VyZUZpbHRlcgogICAgICAgIC5yZWdpc3RlckhhbmRzaGFrZUNvbXBsZXRlQ2FsbGJhY2soX3NlY3VyZUhhbmRzaGFrZUNvbXBsZXRlSGFuZGxlcik7CiAgICBpZiAob25CYWRDZXJ0aWZpY2F0ZSAhPSBudWxsKSB7CiAgICAgIF9zZWN1cmVGaWx0ZXIucmVnaXN0ZXJCYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrKF9vbkJhZENlcnRpZmljYXRlV3JhcHBlcik7CiAgICB9CiAgICBfc29ja2V0LnJlYWRFdmVudHNFbmFibGVkID0gdHJ1ZTsKICAgIF9zb2NrZXQud3JpdGVFdmVudHNFbmFibGVkID0gZmFsc2U7CiAgICBpZiAoX3NvY2tldFN1YnNjcmlwdGlvbiA9PSBudWxsKSB7CiAgICAgIC8vIElmIGEgY3VycmVudCBzdWJzY3JpcHRpb24gaXMgcHJvdmlkZWQgdXNlIHRoaXMgb3RoZXJ3aXNlCiAgICAgIC8vIGNyZWF0ZSBhIG5ldyBvbmUuCiAgICAgIF9zb2NrZXRTdWJzY3JpcHRpb24gPSBfc29ja2V0Lmxpc3RlbihfZXZlbnREaXNwYXRjaGVyLAogICAgICAgICAgb25FcnJvcjogX3JlcG9ydEVycm9yLCBvbkRvbmU6IF9kb25lSGFuZGxlcik7CiAgICB9IGVsc2UgewogICAgICBpZiAoX3NvY2tldFN1YnNjcmlwdGlvbi5pc1BhdXNlZCkgewogICAgICAgIF9zb2NrZXQuY2xvc2UoKTsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiU3Vic2NyaXB0aW9uIHBhc3NlZCB0byBUTFMgdXBncmFkZSBpcyBwYXVzZWQiKTsKICAgICAgfQogICAgICAvLyBJZiB3ZSBhcmUgdXBncmFkaW5nIGEgc29ja2V0IHRoYXQgaXMgYWxyZWFkeSBjbG9zZWQgZm9yIHJlYWQsCiAgICAgIC8vIHJlcG9ydCBhbiBlcnJvciBhcyBpZiB3ZSByZWNlaXZlZCByZWFkQ2xvc2VkIGR1cmluZyB0aGUgaGFuZHNoYWtlLgogICAgICBkeW5hbWljIHMgPSBfc29ja2V0OyAvLyBDYXN0IHRvIGR5bmFtaWMgdG8gYXZvaWQgd2FybmluZy4KICAgICAgaWYgKHMuX3NvY2tldC5jbG9zZWRSZWFkRXZlbnRTZW50KSB7CiAgICAgICAgX2V2ZW50RGlzcGF0Y2hlcihSYXdTb2NrZXRFdmVudC5yZWFkQ2xvc2VkKTsKICAgICAgfQogICAgICBfc29ja2V0U3Vic2NyaXB0aW9uCiAgICAgICAgLi5vbkRhdGEoX2V2ZW50RGlzcGF0Y2hlcikKICAgICAgICAuLm9uRXJyb3IoX3JlcG9ydEVycm9yKQogICAgICAgIC4ub25Eb25lKF9kb25lSGFuZGxlcik7CiAgICB9CiAgICB0cnkgewogICAgICB2YXIgZW5jb2RlZFByb3RvY29scyA9CiAgICAgICAgICBTZWN1cml0eUNvbnRleHQuX3Byb3RvY29sc1RvTGVuZ3RoRW5jb2Rpbmcoc3VwcG9ydGVkUHJvdG9jb2xzKTsKICAgICAgX3NlY3VyZUZpbHRlci5jb25uZWN0KAogICAgICAgICAgYWRkcmVzcy5ob3N0LAogICAgICAgICAgY29udGV4dCwKICAgICAgICAgIGlzX3NlcnZlciwKICAgICAgICAgIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSB8fCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgICByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgICBlbmNvZGVkUHJvdG9jb2xzKTsKICAgICAgX3NlY3VyZUhhbmRzaGFrZSgpOwogICAgfSBjYXRjaCAoZSwgcykgewogICAgICBfcmVwb3J0RXJyb3IoZSwgcyk7CiAgICB9CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb248UmF3U29ja2V0RXZlbnQ+IGxpc3Rlbih2b2lkIG9uRGF0YShSYXdTb2NrZXRFdmVudCBkYXRhKSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIF9zZW5kV3JpdGVFdmVudCgpOwogICAgcmV0dXJuIF9zdHJlYW0ubGlzdGVuKG9uRGF0YSwKICAgICAgICBvbkVycm9yOiBvbkVycm9yLCBvbkRvbmU6IG9uRG9uZSwgY2FuY2VsT25FcnJvcjogY2FuY2VsT25FcnJvcik7CiAgfQoKICBzdGF0aWMgdm9pZCBfdmVyaWZ5RmllbGRzKAogICAgICBob3N0LAogICAgICBpbnQgcmVxdWVzdGVkUG9ydCwKICAgICAgYm9vbCBpc19zZXJ2ZXIsCiAgICAgIGJvb2wgcmVxdWVzdENsaWVudENlcnRpZmljYXRlLAogICAgICBib29sIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgRnVuY3Rpb24gb25CYWRDZXJ0aWZpY2F0ZSkgewogICAgaWYgKGhvc3QgaXMhIFN0cmluZyAmJiBob3N0IGlzISBJbnRlcm5ldEFkZHJlc3MpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoImhvc3QgaXMgbm90IGEgU3RyaW5nIG9yIGFuIEludGVybmV0QWRkcmVzcyIpOwogICAgfQogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwocmVxdWVzdGVkUG9ydCwgInJlcXVlc3RlZFBvcnQiKTsKICAgIGlmIChyZXF1ZXN0ZWRQb3J0IDwgMCB8fCByZXF1ZXN0ZWRQb3J0ID4gNjU1MzUpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigicmVxdWVzdGVkUG9ydCBpcyBub3QgaW4gdGhlIHJhbmdlIDAuLjY1NTM1Iik7CiAgICB9CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbCgKICAgICAgICByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsICJyZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUiKTsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKAogICAgICAgIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSwgInJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSIpOwogIH0KCiAgaW50IGdldCBwb3J0ID0+IF9zb2NrZXQucG9ydDsKCiAgSW50ZXJuZXRBZGRyZXNzIGdldCByZW1vdGVBZGRyZXNzID0+IF9zb2NrZXQucmVtb3RlQWRkcmVzczsKCiAgaW50IGdldCByZW1vdGVQb3J0ID0+IF9zb2NrZXQucmVtb3RlUG9ydDsKCiAgdm9pZCBzZXQgX293bmVyKG93bmVyKSB7CiAgICAoX3NvY2tldCBhcyBkeW5hbWljKS5fb3duZXIgPSBvd25lcjsKICB9CgogIGludCBhdmFpbGFibGUoKSB7CiAgICByZXR1cm4gX3N0YXR1cyAhPSBjb25uZWN0ZWRTdGF0dXMKICAgICAgICA/IDAKICAgICAgICA6IF9zZWN1cmVGaWx0ZXIuYnVmZmVyc1tyZWFkUGxhaW50ZXh0SWRdLmxlbmd0aDsKICB9CgogIEZ1dHVyZTxSYXdTZWN1cmVTb2NrZXQ+IGNsb3NlKCkgewogICAgc2h1dGRvd24oU29ja2V0RGlyZWN0aW9uLmJvdGgpOwogICAgcmV0dXJuIF9jbG9zZUNvbXBsZXRlci5mdXR1cmU7CiAgfQoKICB2b2lkIF9jb21wbGV0ZUNsb3NlQ29tcGxldGVyKFtSYXdTb2NrZXQgZHVtbXldKSB7CiAgICBpZiAoIV9jbG9zZUNvbXBsZXRlci5pc0NvbXBsZXRlZCkgX2Nsb3NlQ29tcGxldGVyLmNvbXBsZXRlKHRoaXMpOwogIH0KCiAgdm9pZCBfY2xvc2UoKSB7CiAgICBfY2xvc2VkV3JpdGUgPSB0cnVlOwogICAgX2Nsb3NlZFJlYWQgPSB0cnVlOwogICAgaWYgKF9zb2NrZXQgIT0gbnVsbCkgewogICAgICBfc29ja2V0LmNsb3NlKCkudGhlbihfY29tcGxldGVDbG9zZUNvbXBsZXRlcik7CiAgICB9IGVsc2UgewogICAgICBfY29tcGxldGVDbG9zZUNvbXBsZXRlcigpOwogICAgfQogICAgX3NvY2tldENsb3NlZFdyaXRlID0gdHJ1ZTsKICAgIF9zb2NrZXRDbG9zZWRSZWFkID0gdHJ1ZTsKICAgIGlmICghX2ZpbHRlckFjdGl2ZSAmJiBfc2VjdXJlRmlsdGVyICE9IG51bGwpIHsKICAgICAgX3NlY3VyZUZpbHRlci5kZXN0cm95KCk7CiAgICAgIF9zZWN1cmVGaWx0ZXIgPSBudWxsOwogICAgfQogICAgaWYgKF9zb2NrZXRTdWJzY3JpcHRpb24gIT0gbnVsbCkgewogICAgICBfc29ja2V0U3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgfQogICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgIF9zdGF0dXMgPSBjbG9zZWRTdGF0dXM7CiAgfQoKICB2b2lkIHNodXRkb3duKFNvY2tldERpcmVjdGlvbiBkaXJlY3Rpb24pIHsKICAgIGlmIChkaXJlY3Rpb24gPT0gU29ja2V0RGlyZWN0aW9uLnNlbmQgfHwKICAgICAgICBkaXJlY3Rpb24gPT0gU29ja2V0RGlyZWN0aW9uLmJvdGgpIHsKICAgICAgX2Nsb3NlZFdyaXRlID0gdHJ1ZTsKICAgICAgaWYgKF9maWx0ZXJTdGF0dXMud3JpdGVFbXB0eSkgewogICAgICAgIF9zb2NrZXQuc2h1dGRvd24oU29ja2V0RGlyZWN0aW9uLnNlbmQpOwogICAgICAgIF9zb2NrZXRDbG9zZWRXcml0ZSA9IHRydWU7CiAgICAgICAgaWYgKF9jbG9zZWRSZWFkKSB7CiAgICAgICAgICBfY2xvc2UoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChkaXJlY3Rpb24gPT0gU29ja2V0RGlyZWN0aW9uLnJlY2VpdmUgfHwKICAgICAgICBkaXJlY3Rpb24gPT0gU29ja2V0RGlyZWN0aW9uLmJvdGgpIHsKICAgICAgX2Nsb3NlZFJlYWQgPSB0cnVlOwogICAgICBfc29ja2V0Q2xvc2VkUmVhZCA9IHRydWU7CiAgICAgIF9zb2NrZXQuc2h1dGRvd24oU29ja2V0RGlyZWN0aW9uLnJlY2VpdmUpOwogICAgICBpZiAoX3NvY2tldENsb3NlZFdyaXRlKSB7CiAgICAgICAgX2Nsb3NlKCk7CiAgICAgIH0KICAgIH0KICB9CgogIGJvb2wgZ2V0IHdyaXRlRXZlbnRzRW5hYmxlZCA9PiBfd3JpdGVFdmVudHNFbmFibGVkOwoKICB2b2lkIHNldCB3cml0ZUV2ZW50c0VuYWJsZWQoYm9vbCB2YWx1ZSkgewogICAgX3dyaXRlRXZlbnRzRW5hYmxlZCA9IHZhbHVlOwogICAgaWYgKHZhbHVlKSB7CiAgICAgIFRpbWVyLnJ1bigoKSA9PiBfc2VuZFdyaXRlRXZlbnQoKSk7CiAgICB9CiAgfQoKICBib29sIGdldCByZWFkRXZlbnRzRW5hYmxlZCA9PiBfcmVhZEV2ZW50c0VuYWJsZWQ7CgogIHZvaWQgc2V0IHJlYWRFdmVudHNFbmFibGVkKGJvb2wgdmFsdWUpIHsKICAgIF9yZWFkRXZlbnRzRW5hYmxlZCA9IHZhbHVlOwogICAgX3NjaGVkdWxlUmVhZEV2ZW50KCk7CiAgfQoKICBVaW50OExpc3QgcmVhZChbaW50IGxlbmd0aF0pIHsKICAgIGlmIChsZW5ndGggIT0gbnVsbCAmJiAobGVuZ3RoIGlzISBpbnQgfHwgbGVuZ3RoIDwgMCkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAiSW52YWxpZCBsZW5ndGggcGFyYW1ldGVyIGluIFNlY3VyZVNvY2tldC5yZWFkIChsZW5ndGg6ICRsZW5ndGgpIik7CiAgICB9CiAgICBpZiAoX2Nsb3NlZFJlYWQpIHsKICAgICAgdGhyb3cgbmV3IFNvY2tldEV4Y2VwdGlvbigiUmVhZGluZyBmcm9tIGEgY2xvc2VkIHNvY2tldCIpOwogICAgfQogICAgaWYgKF9zdGF0dXMgIT0gY29ubmVjdGVkU3RhdHVzKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9zZWN1cmVGaWx0ZXIuYnVmZmVyc1tyZWFkUGxhaW50ZXh0SWRdLnJlYWQobGVuZ3RoKTsKICAgIF9zY2hlZHVsZUZpbHRlcigpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBzb2NrZXQsIGFuZCBzY2hlZHVsZSB0aGUgZmlsdGVyIHRvIGVuY3J5cHQgaXQuCiAgaW50IHdyaXRlKExpc3Q8aW50PiBkYXRhLCBbaW50IG9mZnNldCwgaW50IGJ5dGVzXSkgewogICAgaWYgKGJ5dGVzICE9IG51bGwgJiYgKGJ5dGVzIGlzISBpbnQgfHwgYnl0ZXMgPCAwKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICJJbnZhbGlkIGJ5dGVzIHBhcmFtZXRlciBpbiBTZWN1cmVTb2NrZXQucmVhZCAoYnl0ZXM6ICRieXRlcykiKTsKICAgIH0KICAgIGlmIChvZmZzZXQgIT0gbnVsbCAmJiAob2Zmc2V0IGlzISBpbnQgfHwgb2Zmc2V0IDwgMCkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAiSW52YWxpZCBvZmZzZXQgcGFyYW1ldGVyIGluIFNlY3VyZVNvY2tldC5yZWFkIChvZmZzZXQ6ICRvZmZzZXQpIik7CiAgICB9CiAgICBpZiAoX2Nsb3NlZFdyaXRlKSB7CiAgICAgIF9jb250cm9sbGVyLmFkZEVycm9yKG5ldyBTb2NrZXRFeGNlcHRpb24oIldyaXRpbmcgdG8gYSBjbG9zZWQgc29ja2V0IikpOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmIChfc3RhdHVzICE9IGNvbm5lY3RlZFN0YXR1cykgcmV0dXJuIDA7CiAgICBvZmZzZXQgPz89IDA7CiAgICBieXRlcyA/Pz0gZGF0YS5sZW5ndGggLSBvZmZzZXQ7CgogICAgaW50IHdyaXR0ZW4gPQogICAgICAgIF9zZWN1cmVGaWx0ZXIuYnVmZmVyc1t3cml0ZVBsYWludGV4dElkXS53cml0ZShkYXRhLCBvZmZzZXQsIGJ5dGVzKTsKICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICBfZmlsdGVyU3RhdHVzLndyaXRlRW1wdHkgPSBmYWxzZTsKICAgIH0KICAgIF9zY2hlZHVsZUZpbHRlcigpOwogICAgcmV0dXJuIHdyaXR0ZW47CiAgfQoKICBYNTA5Q2VydGlmaWNhdGUgZ2V0IHBlZXJDZXJ0aWZpY2F0ZSA9PiBfc2VjdXJlRmlsdGVyLnBlZXJDZXJ0aWZpY2F0ZTsKCiAgU3RyaW5nIGdldCBzZWxlY3RlZFByb3RvY29sID0+IF9zZWxlY3RlZFByb3RvY29sOwoKICBib29sIF9vbkJhZENlcnRpZmljYXRlV3JhcHBlcihYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUpIHsKICAgIGlmIChvbkJhZENlcnRpZmljYXRlID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHZhciByZXN1bHQgPSBvbkJhZENlcnRpZmljYXRlKGNlcnRpZmljYXRlKTsKICAgIGlmIChyZXN1bHQgaXMgYm9vbCkgcmV0dXJuIHJlc3VsdDsKICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oCiAgICAgICAgIm9uQmFkQ2VydGlmaWNhdGUgY2FsbGJhY2sgcmV0dXJuZWQgbm9uLWJvb2xlYW4gJHJlc3VsdCIpOwogIH0KCiAgYm9vbCBzZXRPcHRpb24oU29ja2V0T3B0aW9uIG9wdGlvbiwgYm9vbCBlbmFibGVkKSB7CiAgICBpZiAoX3NvY2tldCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX3NvY2tldC5zZXRPcHRpb24ob3B0aW9uLCBlbmFibGVkKTsKICB9CgogIFVpbnQ4TGlzdCBnZXRSYXdPcHRpb24oUmF3U29ja2V0T3B0aW9uIG9wdGlvbikgewogICAgcmV0dXJuIF9zb2NrZXQ/LmdldFJhd09wdGlvbihvcHRpb24pOwogIH0KCiAgdm9pZCBzZXRSYXdPcHRpb24oUmF3U29ja2V0T3B0aW9uIG9wdGlvbikgewogICAgX3NvY2tldD8uc2V0UmF3T3B0aW9uKG9wdGlvbik7CiAgfQoKICB2b2lkIF9ldmVudERpc3BhdGNoZXIoUmF3U29ja2V0RXZlbnQgZXZlbnQpIHsKICAgIHRyeSB7CiAgICAgIGlmIChldmVudCA9PSBSYXdTb2NrZXRFdmVudC5yZWFkKSB7CiAgICAgICAgX3JlYWRIYW5kbGVyKCk7CiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gUmF3U29ja2V0RXZlbnQud3JpdGUpIHsKICAgICAgICBfd3JpdGVIYW5kbGVyKCk7CiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZCkgewogICAgICAgIF9jbG9zZUhhbmRsZXIoKTsKICAgICAgfQogICAgfSBjYXRjaCAoZSwgc3RhY2tUcmFjZSkgewogICAgICBfcmVwb3J0RXJyb3IoZSwgc3RhY2tUcmFjZSk7CiAgICB9CiAgfQoKICB2b2lkIF9yZWFkSGFuZGxlcigpIHsKICAgIF9yZWFkU29ja2V0KCk7CiAgICBfc2NoZWR1bGVGaWx0ZXIoKTsKICB9CgogIHZvaWQgX3dyaXRlSGFuZGxlcigpIHsKICAgIF93cml0ZVNvY2tldCgpOwogICAgX3NjaGVkdWxlRmlsdGVyKCk7CiAgfQoKICB2b2lkIF9kb25lSGFuZGxlcigpIHsKICAgIGlmIChfZmlsdGVyU3RhdHVzLnJlYWRFbXB0eSkgewogICAgICBfY2xvc2UoKTsKICAgIH0KICB9CgogIHZvaWQgX3JlcG9ydEVycm9yKGUsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBpZiAoX3N0YXR1cyA9PSBjbG9zZWRTdGF0dXMpIHsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmIChfY29ubmVjdFBlbmRpbmcpIHsKICAgICAgLy8gX2Nvbm5lY3RQZW5kaW5nIGlzIHRydWUgdW50aWwgdGhlIGhhbmRzaGFrZSBoYXMgY29tcGxldGVkLCBhbmQgdGhlCiAgICAgIC8vIF9oYW5kc2hha2VDb21wbGV0ZSBmdXR1cmUgcmV0dXJuZWQgZnJvbSBTZWN1cmVTb2NrZXQuY29ubmVjdCBoYXMKICAgICAgLy8gY29tcGxldGVkLiAgQmVmb3JlIHRoaXMgcG9pbnQsIHdlIG11c3QgY29tcGxldGUgaXQgd2l0aCBhbiBlcnJvci4KICAgICAgX2hhbmRzaGFrZUNvbXBsZXRlLmNvbXBsZXRlRXJyb3IoZSwgc3RhY2tUcmFjZSk7CiAgICB9IGVsc2UgewogICAgICBfY29udHJvbGxlci5hZGRFcnJvcihlLCBzdGFja1RyYWNlKTsKICAgIH0KICAgIF9jbG9zZSgpOwogIH0KCiAgdm9pZCBfY2xvc2VIYW5kbGVyKCkgewogICAgaWYgKF9zdGF0dXMgPT0gY29ubmVjdGVkU3RhdHVzKSB7CiAgICAgIGlmIChfY2xvc2VkUmVhZCkgcmV0dXJuOwogICAgICBfc29ja2V0Q2xvc2VkUmVhZCA9IHRydWU7CiAgICAgIGlmIChfZmlsdGVyU3RhdHVzLnJlYWRFbXB0eSkgewogICAgICAgIF9jbG9zZWRSZWFkID0gdHJ1ZTsKICAgICAgICBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZCk7CiAgICAgICAgaWYgKF9zb2NrZXRDbG9zZWRXcml0ZSkgewogICAgICAgICAgX2Nsb3NlKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIF9zY2hlZHVsZUZpbHRlcigpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9zdGF0dXMgPT0gaGFuZHNoYWtlU3RhdHVzKSB7CiAgICAgIF9zb2NrZXRDbG9zZWRSZWFkID0gdHJ1ZTsKICAgICAgaWYgKF9maWx0ZXJTdGF0dXMucmVhZEVtcHR5KSB7CiAgICAgICAgX3JlcG9ydEVycm9yKAogICAgICAgICAgICBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCdDb25uZWN0aW9uIHRlcm1pbmF0ZWQgZHVyaW5nIGhhbmRzaGFrZScpLAogICAgICAgICAgICBudWxsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfc2VjdXJlSGFuZHNoYWtlKCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX3NlY3VyZUhhbmRzaGFrZSgpIHsKICAgIHRyeSB7CiAgICAgIF9zZWN1cmVGaWx0ZXIuaGFuZHNoYWtlKCk7CiAgICAgIF9maWx0ZXJTdGF0dXMud3JpdGVFbXB0eSA9IGZhbHNlOwogICAgICBfcmVhZFNvY2tldCgpOwogICAgICBfd3JpdGVTb2NrZXQoKTsKICAgICAgX3NjaGVkdWxlRmlsdGVyKCk7CiAgICB9IGNhdGNoIChlLCBzdGFja1RyYWNlKSB7CiAgICAgIF9yZXBvcnRFcnJvcihlLCBzdGFja1RyYWNlKTsKICAgIH0KICB9CgogIHZvaWQgcmVuZWdvdGlhdGUoCiAgICAgIHtib29sIHVzZVNlc3Npb25DYWNoZTogdHJ1ZSwKICAgICAgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU6IGZhbHNlLAogICAgICBib29sIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2V9KSB7CiAgICBpZiAoX3N0YXR1cyAhPSBjb25uZWN0ZWRTdGF0dXMpIHsKICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigKICAgICAgICAgICJDYWxsZWQgcmVuZWdvdGlhdGUgb24gYSBub24tY29ubmVjdGVkIHNvY2tldCIpOwogICAgfQogICAgX3NlY3VyZUZpbHRlci5yZW5lZ290aWF0ZSgKICAgICAgICB1c2VTZXNzaW9uQ2FjaGUsIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlKTsKICAgIF9zdGF0dXMgPSBoYW5kc2hha2VTdGF0dXM7CiAgICBfZmlsdGVyU3RhdHVzLndyaXRlRW1wdHkgPSBmYWxzZTsKICAgIF9zY2hlZHVsZUZpbHRlcigpOwogIH0KCiAgdm9pZCBfc2VjdXJlSGFuZHNoYWtlQ29tcGxldGVIYW5kbGVyKCkgewogICAgX3N0YXR1cyA9IGNvbm5lY3RlZFN0YXR1czsKICAgIGlmIChfY29ubmVjdFBlbmRpbmcpIHsKICAgICAgX2Nvbm5lY3RQZW5kaW5nID0gZmFsc2U7CiAgICAgIHRyeSB7CiAgICAgICAgX3NlbGVjdGVkUHJvdG9jb2wgPSBfc2VjdXJlRmlsdGVyLnNlbGVjdGVkUHJvdG9jb2woKTsKICAgICAgICAvLyBXZSBkb24ndCB3YW50IHVzZXIgY29kZSB0byBydW4gc3luY2hyb25vdXNseSBpbiB0aGlzIGNhbGxiYWNrLgogICAgICAgIFRpbWVyLnJ1bigoKSA9PiBfaGFuZHNoYWtlQ29tcGxldGUuY29tcGxldGUodGhpcykpOwogICAgICB9IGNhdGNoIChlcnJvciwgc3RhY2spIHsKICAgICAgICBfaGFuZHNoYWtlQ29tcGxldGUuY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2spOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIF9vblBhdXNlU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaXNQYXVzZWQpIHsKICAgICAgX3BhdXNlQ291bnQrKzsKICAgIH0gZWxzZSB7CiAgICAgIF9wYXVzZUNvdW50LS07CiAgICAgIGlmIChfcGF1c2VDb3VudCA9PSAwKSB7CiAgICAgICAgX3NjaGVkdWxlUmVhZEV2ZW50KCk7CiAgICAgICAgX3NlbmRXcml0ZUV2ZW50KCk7IC8vIENhbiBzZW5kIGV2ZW50IHN5bmNocm9ub3VzbHkuCiAgICAgIH0KICAgIH0KCiAgICBpZiAoIV9zb2NrZXRDbG9zZWRSZWFkIHx8ICFfc29ja2V0Q2xvc2VkV3JpdGUpIHsKICAgICAgaWYgKF9jb250cm9sbGVyLmlzUGF1c2VkKSB7CiAgICAgICAgX3NvY2tldFN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIF9zb2NrZXRTdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaGFzTGlzdGVuZXIpIHsKICAgICAgLy8gVE9ETyhham9obnNlbik6IERvIHNvbWV0aGluZyBoZXJlPwogICAgfQogIH0KCiAgdm9pZCBfc2NoZWR1bGVGaWx0ZXIoKSB7CiAgICBfZmlsdGVyUGVuZGluZyA9IHRydWU7CiAgICBfdHJ5RmlsdGVyKCk7CiAgfQoKICB2b2lkIF90cnlGaWx0ZXIoKSB7CiAgICBpZiAoX3N0YXR1cyA9PSBjbG9zZWRTdGF0dXMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKF9maWx0ZXJQZW5kaW5nICYmICFfZmlsdGVyQWN0aXZlKSB7CiAgICAgIF9maWx0ZXJBY3RpdmUgPSB0cnVlOwogICAgICBfZmlsdGVyUGVuZGluZyA9IGZhbHNlOwogICAgICBfcHVzaEFsbEZpbHRlclN0YWdlcygpLnRoZW4oKHN0YXR1cykgewogICAgICAgIF9maWx0ZXJTdGF0dXMgPSBzdGF0dXM7CiAgICAgICAgX2ZpbHRlckFjdGl2ZSA9IGZhbHNlOwogICAgICAgIGlmIChfc3RhdHVzID09IGNsb3NlZFN0YXR1cykgewogICAgICAgICAgX3NlY3VyZUZpbHRlci5kZXN0cm95KCk7CiAgICAgICAgICBfc2VjdXJlRmlsdGVyID0gbnVsbDsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgX3NvY2tldC5yZWFkRXZlbnRzRW5hYmxlZCA9IHRydWU7CiAgICAgICAgaWYgKF9maWx0ZXJTdGF0dXMud3JpdGVFbXB0eSAmJiBfY2xvc2VkV3JpdGUgJiYgIV9zb2NrZXRDbG9zZWRXcml0ZSkgewogICAgICAgICAgLy8gQ2hlY2tzIGZvciBhbmQgaGFuZGxlcyBhbGwgY2FzZXMgb2YgcGFydGlhbGx5IGNsb3NlZCBzb2NrZXRzLgogICAgICAgICAgc2h1dGRvd24oU29ja2V0RGlyZWN0aW9uLnNlbmQpOwogICAgICAgICAgaWYgKF9zdGF0dXMgPT0gY2xvc2VkU3RhdHVzKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKF9maWx0ZXJTdGF0dXMucmVhZEVtcHR5ICYmIF9zb2NrZXRDbG9zZWRSZWFkICYmICFfY2xvc2VkUmVhZCkgewogICAgICAgICAgaWYgKF9zdGF0dXMgPT0gaGFuZHNoYWtlU3RhdHVzKSB7CiAgICAgICAgICAgIF9zZWN1cmVGaWx0ZXIuaGFuZHNoYWtlKCk7CiAgICAgICAgICAgIGlmIChfc3RhdHVzID09IGhhbmRzaGFrZVN0YXR1cykgewogICAgICAgICAgICAgIHRocm93IG5ldyBIYW5kc2hha2VFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICdDb25uZWN0aW9uIHRlcm1pbmF0ZWQgZHVyaW5nIGhhbmRzaGFrZScpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBfY2xvc2VIYW5kbGVyKCk7CiAgICAgICAgfQogICAgICAgIGlmIChfc3RhdHVzID09IGNsb3NlZFN0YXR1cykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoX2ZpbHRlclN0YXR1cy5wcm9ncmVzcykgewogICAgICAgICAgX2ZpbHRlclBlbmRpbmcgPSB0cnVlOwogICAgICAgICAgaWYgKF9maWx0ZXJTdGF0dXMud3JpdGVFbmNyeXB0ZWROb0xvbmdlckVtcHR5KSB7CiAgICAgICAgICAgIF93cml0ZVNvY2tldCgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKF9maWx0ZXJTdGF0dXMud3JpdGVQbGFpbnRleHROb0xvbmdlckZ1bGwpIHsKICAgICAgICAgICAgX3NlbmRXcml0ZUV2ZW50KCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoX2ZpbHRlclN0YXR1cy5yZWFkRW5jcnlwdGVkTm9Mb25nZXJGdWxsKSB7CiAgICAgICAgICAgIF9yZWFkU29ja2V0KCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoX2ZpbHRlclN0YXR1cy5yZWFkUGxhaW50ZXh0Tm9Mb25nZXJFbXB0eSkgewogICAgICAgICAgICBfc2NoZWR1bGVSZWFkRXZlbnQoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChfc3RhdHVzID09IGhhbmRzaGFrZVN0YXR1cykgewogICAgICAgICAgICBfc2VjdXJlSGFuZHNoYWtlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF90cnlGaWx0ZXIoKTsKICAgICAgfSkuY2F0Y2hFcnJvcihfcmVwb3J0RXJyb3IpOwogICAgfQogIH0KCiAgTGlzdDxpbnQ+IF9yZWFkU29ja2V0T3JCdWZmZXJlZERhdGEoaW50IGJ5dGVzKSB7CiAgICBpZiAoX2J1ZmZlcmVkRGF0YSAhPSBudWxsKSB7CiAgICAgIGlmIChieXRlcyA+IF9idWZmZXJlZERhdGEubGVuZ3RoIC0gX2J1ZmZlcmVkRGF0YUluZGV4KSB7CiAgICAgICAgYnl0ZXMgPSBfYnVmZmVyZWREYXRhLmxlbmd0aCAtIF9idWZmZXJlZERhdGFJbmRleDsKICAgICAgfQogICAgICB2YXIgcmVzdWx0ID0KICAgICAgICAgIF9idWZmZXJlZERhdGEuc3VibGlzdChfYnVmZmVyZWREYXRhSW5kZXgsIF9idWZmZXJlZERhdGFJbmRleCArIGJ5dGVzKTsKICAgICAgX2J1ZmZlcmVkRGF0YUluZGV4ICs9IGJ5dGVzOwogICAgICBpZiAoX2J1ZmZlcmVkRGF0YS5sZW5ndGggPT0gX2J1ZmZlcmVkRGF0YUluZGV4KSB7CiAgICAgICAgX2J1ZmZlcmVkRGF0YSA9IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0gZWxzZSBpZiAoIV9zb2NrZXRDbG9zZWRSZWFkKSB7CiAgICAgIHJldHVybiBfc29ja2V0LnJlYWQoYnl0ZXMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICB2b2lkIF9yZWFkU29ja2V0KCkgewogICAgaWYgKF9zdGF0dXMgPT0gY2xvc2VkU3RhdHVzKSByZXR1cm47CiAgICB2YXIgYnVmZmVyID0gX3NlY3VyZUZpbHRlci5idWZmZXJzW3JlYWRFbmNyeXB0ZWRJZF07CiAgICBpZiAoYnVmZmVyLndyaXRlRnJvbVNvdXJjZShfcmVhZFNvY2tldE9yQnVmZmVyZWREYXRhKSA+IDApIHsKICAgICAgX2ZpbHRlclN0YXR1cy5yZWFkRW1wdHkgPSBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIF9zb2NrZXQucmVhZEV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKICAgIH0KICB9CgogIHZvaWQgX3dyaXRlU29ja2V0KCkgewogICAgaWYgKF9zb2NrZXRDbG9zZWRXcml0ZSkgcmV0dXJuOwogICAgdmFyIGJ1ZmZlciA9IF9zZWN1cmVGaWx0ZXIuYnVmZmVyc1t3cml0ZUVuY3J5cHRlZElkXTsKICAgIGlmIChidWZmZXIucmVhZFRvU29ja2V0KF9zb2NrZXQpKSB7CiAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBibG9ja2VkCiAgICAgIF9zb2NrZXQud3JpdGVFdmVudHNFbmFibGVkID0gdHJ1ZTsKICAgIH0KICB9CgogIC8vIElmIGEgcmVhZCBldmVudCBzaG91bGQgYmUgc2VudCwgYWRkIGl0IHRvIHRoZSBjb250cm9sbGVyLgogIF9zY2hlZHVsZVJlYWRFdmVudCgpIHsKICAgIGlmICghX3BlbmRpbmdSZWFkRXZlbnQgJiYKICAgICAgICBfcmVhZEV2ZW50c0VuYWJsZWQgJiYKICAgICAgICBfcGF1c2VDb3VudCA9PSAwICYmCiAgICAgICAgX3NlY3VyZUZpbHRlciAhPSBudWxsICYmCiAgICAgICAgIV9zZWN1cmVGaWx0ZXIuYnVmZmVyc1tyZWFkUGxhaW50ZXh0SWRdLmlzRW1wdHkpIHsKICAgICAgX3BlbmRpbmdSZWFkRXZlbnQgPSB0cnVlOwogICAgICBUaW1lci5ydW4oX3NlbmRSZWFkRXZlbnQpOwogICAgfQogIH0KCiAgX3NlbmRSZWFkRXZlbnQoKSB7CiAgICBfcGVuZGluZ1JlYWRFdmVudCA9IGZhbHNlOwogICAgaWYgKF9zdGF0dXMgIT0gY2xvc2VkU3RhdHVzICYmCiAgICAgICAgX3JlYWRFdmVudHNFbmFibGVkICYmCiAgICAgICAgX3BhdXNlQ291bnQgPT0gMCAmJgogICAgICAgIF9zZWN1cmVGaWx0ZXIgIT0gbnVsbCAmJgogICAgICAgICFfc2VjdXJlRmlsdGVyLmJ1ZmZlcnNbcmVhZFBsYWludGV4dElkXS5pc0VtcHR5KSB7CiAgICAgIF9jb250cm9sbGVyLmFkZChSYXdTb2NrZXRFdmVudC5yZWFkKTsKICAgICAgX3NjaGVkdWxlUmVhZEV2ZW50KCk7CiAgICB9CiAgfQoKICAvLyBJZiBhIHdyaXRlIGV2ZW50IHNob3VsZCBiZSBzZW50LCBhZGQgaXQgdG8gdGhlIGNvbnRyb2xsZXIuCiAgX3NlbmRXcml0ZUV2ZW50KCkgewogICAgaWYgKCFfY2xvc2VkV3JpdGUgJiYKICAgICAgICBfd3JpdGVFdmVudHNFbmFibGVkICYmCiAgICAgICAgX3BhdXNlQ291bnQgPT0gMCAmJgogICAgICAgIF9zZWN1cmVGaWx0ZXIgIT0gbnVsbCAmJgogICAgICAgIF9zZWN1cmVGaWx0ZXIuYnVmZmVyc1t3cml0ZVBsYWludGV4dElkXS5mcmVlID4gMCkgewogICAgICBfd3JpdGVFdmVudHNFbmFibGVkID0gZmFsc2U7CiAgICAgIF9jb250cm9sbGVyLmFkZChSYXdTb2NrZXRFdmVudC53cml0ZSk7CiAgICB9CiAgfQoKICBGdXR1cmU8X0ZpbHRlclN0YXR1cz4gX3B1c2hBbGxGaWx0ZXJTdGFnZXMoKSB7CiAgICBib29sIHdhc0luSGFuZHNoYWtlID0gX3N0YXR1cyAhPSBjb25uZWN0ZWRTdGF0dXM7CiAgICBMaXN0IGFyZ3MgPSBuZXcgTGlzdCgyICsgYnVmZmVyQ291bnQgKiAyKTsKICAgIGFyZ3NbMF0gPSBfc2VjdXJlRmlsdGVyLl9wb2ludGVyKCk7CiAgICBhcmdzWzFdID0gd2FzSW5IYW5kc2hha2U7CiAgICB2YXIgYnVmcyA9IF9zZWN1cmVGaWx0ZXIuYnVmZmVyczsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmZmVyQ291bnQ7ICsraSkgewogICAgICBhcmdzWzIgKiBpICsgMl0gPSBidWZzW2ldLnN0YXJ0OwogICAgICBhcmdzWzIgKiBpICsgM10gPSBidWZzW2ldLmVuZDsKICAgIH0KCiAgICByZXR1cm4gX0lPU2VydmljZS5fZGlzcGF0Y2goX0lPU2VydmljZS5zc2xQcm9jZXNzRmlsdGVyLCBhcmdzKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAocmVzcG9uc2UubGVuZ3RoID09IDIpIHsKICAgICAgICBpZiAod2FzSW5IYW5kc2hha2UpIHsKICAgICAgICAgIC8vIElmIHdlJ3JlIGluIGhhbmRzaGFrZSwgdGhyb3cgYSBoYW5kc2hha2UgZXJyb3IuCiAgICAgICAgICBfcmVwb3J0RXJyb3IoCiAgICAgICAgICAgICAgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbignJHtyZXNwb25zZVsxXX0gZXJyb3IgJHtyZXNwb25zZVswXX0nKSwKICAgICAgICAgICAgICBudWxsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gSWYgd2UncmUgY29ubmVjdGVkLCB0aHJvdyBhIFRMUyBlcnJvci4KICAgICAgICAgIF9yZXBvcnRFcnJvcigKICAgICAgICAgICAgICBuZXcgVGxzRXhjZXB0aW9uKCcke3Jlc3BvbnNlWzFdfSBlcnJvciAke3Jlc3BvbnNlWzBdfScpLCBudWxsKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaW50IHN0YXJ0KGludCBpbmRleCkgPT4gcmVzcG9uc2VbMiAqIGluZGV4XTsKICAgICAgaW50IGVuZChpbnQgaW5kZXgpID0+IHJlc3BvbnNlWzIgKiBpbmRleCArIDFdOwoKICAgICAgX0ZpbHRlclN0YXR1cyBzdGF0dXMgPSBuZXcgX0ZpbHRlclN0YXR1cygpOwogICAgICAvLyBDb21wdXRlIHdyaXRlRW1wdHkgYXMgIndyaXRlIHBsYWludGV4dCBidWZmZXIgYW5kIHdyaXRlIGVuY3J5cHRlZAogICAgICAvLyBidWZmZXIgd2VyZSBlbXB0eSB3aGVuIHdlIHN0YXJ0ZWQgYW5kIGFyZSBlbXB0eSBub3ciLgogICAgICBzdGF0dXMud3JpdGVFbXB0eSA9IGJ1ZnNbd3JpdGVQbGFpbnRleHRJZF0uaXNFbXB0eSAmJgogICAgICAgICAgc3RhcnQod3JpdGVFbmNyeXB0ZWRJZCkgPT0gZW5kKHdyaXRlRW5jcnlwdGVkSWQpOwogICAgICAvLyBJZiB3ZSB3ZXJlIGluIGhhbmRzaGFrZSB3aGVuIHRoaXMgc3RhcnRlZCwgX3dyaXRlRW1wdHkgbWF5IGJlIGZhbHNlCiAgICAgIC8vIGJlY2F1c2UgdGhlIGhhbmRzaGFrZSB3cm90ZSBkYXRhIGFmdGVyIHdlIGNoZWNrZWQuCiAgICAgIGlmICh3YXNJbkhhbmRzaGFrZSkgc3RhdHVzLndyaXRlRW1wdHkgPSBmYWxzZTsKCiAgICAgIC8vIENvbXB1dGUgcmVhZEVtcHR5IGFzICJib3RoIHJlYWQgYnVmZmVycyB3ZXJlIGVtcHR5IHdoZW4gd2Ugc3RhcnRlZAogICAgICAvLyBhbmQgYXJlIGVtcHR5IG5vdyIuCiAgICAgIHN0YXR1cy5yZWFkRW1wdHkgPSBidWZzW3JlYWRFbmNyeXB0ZWRJZF0uaXNFbXB0eSAmJgogICAgICAgICAgc3RhcnQocmVhZFBsYWludGV4dElkKSA9PSBlbmQocmVhZFBsYWludGV4dElkKTsKCiAgICAgIF9FeHRlcm5hbEJ1ZmZlciBidWZmZXIgPSBidWZzW3dyaXRlUGxhaW50ZXh0SWRdOwogICAgICBpbnQgbmV3X3N0YXJ0ID0gc3RhcnQod3JpdGVQbGFpbnRleHRJZCk7CiAgICAgIGlmIChuZXdfc3RhcnQgIT0gYnVmZmVyLnN0YXJ0KSB7CiAgICAgICAgc3RhdHVzLnByb2dyZXNzID0gdHJ1ZTsKICAgICAgICBpZiAoYnVmZmVyLmZyZWUgPT0gMCkgewogICAgICAgICAgc3RhdHVzLndyaXRlUGxhaW50ZXh0Tm9Mb25nZXJGdWxsID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgYnVmZmVyLnN0YXJ0ID0gbmV3X3N0YXJ0OwogICAgICB9CiAgICAgIGJ1ZmZlciA9IGJ1ZnNbcmVhZEVuY3J5cHRlZElkXTsKICAgICAgbmV3X3N0YXJ0ID0gc3RhcnQocmVhZEVuY3J5cHRlZElkKTsKICAgICAgaWYgKG5ld19zdGFydCAhPSBidWZmZXIuc3RhcnQpIHsKICAgICAgICBzdGF0dXMucHJvZ3Jlc3MgPSB0cnVlOwogICAgICAgIGlmIChidWZmZXIuZnJlZSA9PSAwKSB7CiAgICAgICAgICBzdGF0dXMucmVhZEVuY3J5cHRlZE5vTG9uZ2VyRnVsbCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGJ1ZmZlci5zdGFydCA9IG5ld19zdGFydDsKICAgICAgfQogICAgICBidWZmZXIgPSBidWZzW3dyaXRlRW5jcnlwdGVkSWRdOwogICAgICBpbnQgbmV3X2VuZCA9IGVuZCh3cml0ZUVuY3J5cHRlZElkKTsKICAgICAgaWYgKG5ld19lbmQgIT0gYnVmZmVyLmVuZCkgewogICAgICAgIHN0YXR1cy5wcm9ncmVzcyA9IHRydWU7CiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT0gMCkgewogICAgICAgICAgc3RhdHVzLndyaXRlRW5jcnlwdGVkTm9Mb25nZXJFbXB0eSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGJ1ZmZlci5lbmQgPSBuZXdfZW5kOwogICAgICB9CiAgICAgIGJ1ZmZlciA9IGJ1ZnNbcmVhZFBsYWludGV4dElkXTsKICAgICAgbmV3X2VuZCA9IGVuZChyZWFkUGxhaW50ZXh0SWQpOwogICAgICBpZiAobmV3X2VuZCAhPSBidWZmZXIuZW5kKSB7CiAgICAgICAgc3RhdHVzLnByb2dyZXNzID0gdHJ1ZTsKICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICBzdGF0dXMucmVhZFBsYWludGV4dE5vTG9uZ2VyRW1wdHkgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBidWZmZXIuZW5kID0gbmV3X2VuZDsKICAgICAgfQogICAgICByZXR1cm4gc3RhdHVzOwogICAgfSk7CiAgfQp9CgovKioKICogQSBjaXJjdWxhciBidWZmZXIgYmFja2VkIGJ5IGFuIGV4dGVybmFsIGJ5dGUgYXJyYXkuICBBY2Nlc3NlZCBmcm9tCiAqIGJvdGggQysrIGFuZCBEYXJ0IGNvZGUgaW4gYW4gdW5zeW5jaHJvbml6ZWQgd2F5LCB3aXRoIG9uZSByZWFkaW5nCiAqIGFuZCBvbmUgd3JpdGluZy4gIEFsbCB1cGRhdGVzIHRvIHN0YXJ0IGFuZCBlbmQgYXJlIGRvbmUgYnkgRGFydCBjb2RlLgogKi8KY2xhc3MgX0V4dGVybmFsQnVmZmVyIHsKICAvLyBUaGlzIHdpbGwgYmUgYW4gRXh0ZXJuYWxCeXRlQXJyYXksIGJhY2tlZCBieSBDIGFsbG9jYXRlZCBkYXRhLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgInNldCIpCiAgTGlzdDxpbnQ+IGRhdGE7CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBpbnQgc3RhcnQ7CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBpbnQgZW5kOwoKICBmaW5hbCBzaXplOwoKICBfRXh0ZXJuYWxCdWZmZXIodGhpcy5zaXplKSB7CiAgICBzdGFydCA9IGVuZCA9IHNpemUgfi8gMjsKICB9CgogIHZvaWQgYWR2YW5jZVN0YXJ0KGludCBieXRlcykgewogICAgYXNzZXJ0KHN0YXJ0ID4gZW5kIHx8IHN0YXJ0ICsgYnl0ZXMgPD0gZW5kKTsKICAgIHN0YXJ0ICs9IGJ5dGVzOwogICAgaWYgKHN0YXJ0ID49IHNpemUpIHsKICAgICAgc3RhcnQgLT0gc2l6ZTsKICAgICAgYXNzZXJ0KHN0YXJ0IDw9IGVuZCk7CiAgICAgIGFzc2VydChzdGFydCA8IHNpemUpOwogICAgfQogIH0KCiAgdm9pZCBhZHZhbmNlRW5kKGludCBieXRlcykgewogICAgYXNzZXJ0KHN0YXJ0IDw9IGVuZCB8fCBzdGFydCA+IGVuZCArIGJ5dGVzKTsKICAgIGVuZCArPSBieXRlczsKICAgIGlmIChlbmQgPj0gc2l6ZSkgewogICAgICBlbmQgLT0gc2l6ZTsKICAgICAgYXNzZXJ0KGVuZCA8IHN0YXJ0KTsKICAgICAgYXNzZXJ0KGVuZCA8IHNpemUpOwogICAgfQogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBlbmQgPT0gc3RhcnQ7CgogIGludCBnZXQgbGVuZ3RoID0+IHN0YXJ0ID4gZW5kID8gc2l6ZSArIGVuZCAtIHN0YXJ0IDogZW5kIC0gc3RhcnQ7CgogIGludCBnZXQgbGluZWFyTGVuZ3RoID0+IHN0YXJ0ID4gZW5kID8gc2l6ZSAtIHN0YXJ0IDogZW5kIC0gc3RhcnQ7CgogIGludCBnZXQgZnJlZSA9PiBzdGFydCA+IGVuZCA/IHN0YXJ0IC0gZW5kIC0gMSA6IHNpemUgKyBzdGFydCAtIGVuZCAtIDE7CgogIGludCBnZXQgbGluZWFyRnJlZSB7CiAgICBpZiAoc3RhcnQgPiBlbmQpIHJldHVybiBzdGFydCAtIGVuZCAtIDE7CiAgICBpZiAoc3RhcnQgPT0gMCkgcmV0dXJuIHNpemUgLSBlbmQgLSAxOwogICAgcmV0dXJuIHNpemUgLSBlbmQ7CiAgfQoKICBVaW50OExpc3QgcmVhZChpbnQgYnl0ZXMpIHsKICAgIGlmIChieXRlcyA9PSBudWxsKSB7CiAgICAgIGJ5dGVzID0gbGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgYnl0ZXMgPSBtaW4oYnl0ZXMsIGxlbmd0aCk7CiAgICB9CiAgICBpZiAoYnl0ZXMgPT0gMCkgcmV0dXJuIG51bGw7CiAgICBVaW50OExpc3QgcmVzdWx0ID0gbmV3IFVpbnQ4TGlzdChieXRlcyk7CiAgICBpbnQgYnl0ZXNSZWFkID0gMDsKICAgIC8vIExvb3Agb3ZlciB6ZXJvLCBvbmUsIG9yIHR3byBsaW5lYXIgZGF0YSByYW5nZXMuCiAgICB3aGlsZSAoYnl0ZXNSZWFkIDwgYnl0ZXMpIHsKICAgICAgaW50IHRvUmVhZCA9IG1pbihieXRlcyAtIGJ5dGVzUmVhZCwgbGluZWFyTGVuZ3RoKTsKICAgICAgcmVzdWx0LnNldFJhbmdlKGJ5dGVzUmVhZCwgYnl0ZXNSZWFkICsgdG9SZWFkLCBkYXRhLCBzdGFydCk7CiAgICAgIGFkdmFuY2VTdGFydCh0b1JlYWQpOwogICAgICBieXRlc1JlYWQgKz0gdG9SZWFkOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGludCB3cml0ZShMaXN0PGludD4gaW5wdXREYXRhLCBpbnQgb2Zmc2V0LCBpbnQgYnl0ZXMpIHsKICAgIGlmIChieXRlcyA+IGZyZWUpIHsKICAgICAgYnl0ZXMgPSBmcmVlOwogICAgfQogICAgaW50IHdyaXR0ZW4gPSAwOwogICAgaW50IHRvV3JpdGUgPSBtaW4oYnl0ZXMsIGxpbmVhckZyZWUpOwogICAgLy8gTG9vcCBvdmVyIHplcm8sIG9uZSwgb3IgdHdvIGxpbmVhciBkYXRhIHJhbmdlcy4KICAgIHdoaWxlICh0b1dyaXRlID4gMCkgewogICAgICBkYXRhLnNldFJhbmdlKGVuZCwgZW5kICsgdG9Xcml0ZSwgaW5wdXREYXRhLCBvZmZzZXQpOwogICAgICBhZHZhbmNlRW5kKHRvV3JpdGUpOwogICAgICBvZmZzZXQgKz0gdG9Xcml0ZTsKICAgICAgd3JpdHRlbiArPSB0b1dyaXRlOwogICAgICB0b1dyaXRlID0gbWluKGJ5dGVzIC0gd3JpdHRlbiwgbGluZWFyRnJlZSk7CiAgICB9CiAgICByZXR1cm4gd3JpdHRlbjsKICB9CgogIGludCB3cml0ZUZyb21Tb3VyY2UoTGlzdDxpbnQ+IGdldERhdGEoaW50IHJlcXVlc3RlZCkpIHsKICAgIGludCB3cml0dGVuID0gMDsKICAgIGludCB0b1dyaXRlID0gbGluZWFyRnJlZTsKICAgIC8vIExvb3Agb3ZlciB6ZXJvLCBvbmUsIG9yIHR3byBsaW5lYXIgZGF0YSByYW5nZXMuCiAgICB3aGlsZSAodG9Xcml0ZSA+IDApIHsKICAgICAgLy8gU291cmNlIHJldHVybnMgYXQgbW9zdCB0b1dyaXRlIGJ5dGVzLCBhbmQgaXQgcmV0dXJucyBudWxsIHdoZW4gZW1wdHkuCiAgICAgIHZhciBpbnB1dERhdGEgPSBnZXREYXRhKHRvV3JpdGUpOwogICAgICBpZiAoaW5wdXREYXRhID09IG51bGwgfHwgaW5wdXREYXRhLmxlbmd0aCA9PSAwKSBicmVhazsKICAgICAgdmFyIGxlbiA9IGlucHV0RGF0YS5sZW5ndGg7CiAgICAgIGRhdGEuc2V0UmFuZ2UoZW5kLCBlbmQgKyBsZW4sIGlucHV0RGF0YSk7CiAgICAgIGFkdmFuY2VFbmQobGVuKTsKICAgICAgd3JpdHRlbiArPSBsZW47CiAgICAgIHRvV3JpdGUgPSBsaW5lYXJGcmVlOwogICAgfQogICAgcmV0dXJuIHdyaXR0ZW47CiAgfQoKICBib29sIHJlYWRUb1NvY2tldChSYXdTb2NrZXQgc29ja2V0KSB7CiAgICAvLyBMb29wIG92ZXIgemVybywgb25lLCBvciB0d28gbGluZWFyIGRhdGEgcmFuZ2VzLgogICAgd2hpbGUgKHRydWUpIHsKICAgICAgdmFyIHRvV3JpdGUgPSBsaW5lYXJMZW5ndGg7CiAgICAgIGlmICh0b1dyaXRlID09IDApIHJldHVybiBmYWxzZTsKICAgICAgaW50IGJ5dGVzID0gc29ja2V0LndyaXRlKGRhdGEsIHN0YXJ0LCB0b1dyaXRlKTsKICAgICAgYWR2YW5jZVN0YXJ0KGJ5dGVzKTsKICAgICAgaWYgKGJ5dGVzIDwgdG9Xcml0ZSkgewogICAgICAgIC8vIFRoZSBzb2NrZXQgaGFzIGJsb2NrZWQgd2hpbGUgd2UgaGF2ZSBkYXRhIHRvIHdyaXRlLgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfU2VjdXJlRmlsdGVyIHsKICBleHRlcm5hbCBmYWN0b3J5IF9TZWN1cmVGaWx0ZXIuXygpOwoKICB2b2lkIGNvbm5lY3QoCiAgICAgIFN0cmluZyBob3N0TmFtZSwKICAgICAgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgIGJvb2wgaXNfc2VydmVyLAogICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgYm9vbCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsCiAgICAgIFVpbnQ4TGlzdCBwcm90b2NvbHMpOwogIHZvaWQgZGVzdHJveSgpOwogIHZvaWQgaGFuZHNoYWtlKCk7CiAgU3RyaW5nIHNlbGVjdGVkUHJvdG9jb2woKTsKICB2b2lkIHJlaGFuZHNoYWtlKCk7CiAgdm9pZCByZW5lZ290aWF0ZShib29sIHVzZVNlc3Npb25DYWNoZSwgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlKTsKICB2b2lkIGluaXQoKTsKICBYNTA5Q2VydGlmaWNhdGUgZ2V0IHBlZXJDZXJ0aWZpY2F0ZTsKICBpbnQgcHJvY2Vzc0J1ZmZlcihpbnQgYnVmZmVySW5kZXgpOwogIHZvaWQgcmVnaXN0ZXJCYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrKEZ1bmN0aW9uIGNhbGxiYWNrKTsKICB2b2lkIHJlZ2lzdGVySGFuZHNoYWtlQ29tcGxldGVDYWxsYmFjayhGdW5jdGlvbiBoYW5kc2hha2VDb21wbGV0ZUhhbmRsZXIpOwoKICAvLyBUaGlzIGNhbGwgbWF5IGNhdXNlIGEgcmVmZXJlbmNlIGNvdW50ZWQgcG9pbnRlciBpbiB0aGUgbmF0aXZlCiAgLy8gaW1wbGVtZW50YXRpb24gdG8gYmUgcmV0YWluZWQuIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSByZXN1bHRpbmcKICAvLyB2YWx1ZSBpcyBwYXNzZWQgdG8gdGhlIElPIHNlcnZpY2UgdGhyb3VnaCBhIGNhbGwgdG8gZGlzcGF0Y2goKS4KICBpbnQgX3BvaW50ZXIoKTsKCiAgTGlzdDxfRXh0ZXJuYWxCdWZmZXI+IGdldCBidWZmZXJzOwp9CgovKiogQSBzZWN1cmUgbmV0d29ya2luZyBleGNlcHRpb24gY2F1c2VkIGJ5IGEgZmFpbHVyZSBpbiB0aGUKICogIFRMUy9TU0wgcHJvdG9jb2wuCiAqLwpjbGFzcyBUbHNFeGNlcHRpb24gaW1wbGVtZW50cyBJT0V4Y2VwdGlvbiB7CiAgZmluYWwgU3RyaW5nIHR5cGU7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CiAgZmluYWwgT1NFcnJvciBvc0Vycm9yOwoKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgY29uc3QgVGxzRXhjZXB0aW9uKFtTdHJpbmcgbWVzc2FnZSA9ICIiLCBPU0Vycm9yIG9zRXJyb3JdKQogICAgICA6IHRoaXMuXygiVGxzRXhjZXB0aW9uIiwgbWVzc2FnZSwgb3NFcnJvcik7CgogIGNvbnN0IFRsc0V4Y2VwdGlvbi5fKHRoaXMudHlwZSwgdGhpcy5tZXNzYWdlLCB0aGlzLm9zRXJyb3IpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSh0eXBlKTsKICAgIGlmIChtZXNzYWdlLmlzTm90RW1wdHkpIHsKICAgICAgc2Iud3JpdGUoIjogJG1lc3NhZ2UiKTsKICAgICAgaWYgKG9zRXJyb3IgIT0gbnVsbCkgewogICAgICAgIHNiLndyaXRlKCIgKCRvc0Vycm9yKSIpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG9zRXJyb3IgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgiOiAkb3NFcnJvciIpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgovKioKICogQW4gZXhjZXB0aW9uIHRoYXQgaGFwcGVucyBpbiB0aGUgaGFuZHNoYWtlIHBoYXNlIG9mIGVzdGFibGlzaGluZwogKiBhIHNlY3VyZSBuZXR3b3JrIGNvbm5lY3Rpb24uCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIEhhbmRzaGFrZUV4Y2VwdGlvbiBleHRlbmRzIFRsc0V4Y2VwdGlvbiB7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGNvbnN0IEhhbmRzaGFrZUV4Y2VwdGlvbihbU3RyaW5nIG1lc3NhZ2UgPSAiIiwgT1NFcnJvciBvc0Vycm9yXSkKICAgICAgOiBzdXBlci5fKCJIYW5kc2hha2VFeGNlcHRpb24iLCBtZXNzYWdlLCBvc0Vycm9yKTsKfQoKLyoqCiAqIEFuIGV4Y2VwdGlvbiB0aGF0IGhhcHBlbnMgaW4gdGhlIGhhbmRzaGFrZSBwaGFzZSBvZiBlc3RhYmxpc2hpbmcKICogYSBzZWN1cmUgbmV0d29yayBjb25uZWN0aW9uLCB3aGVuIGxvb2tpbmcgdXAgb3IgdmVyaWZ5aW5nIGEKICogY2VydGlmaWNhdGUuCiAqLwpjbGFzcyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBleHRlbmRzIFRsc0V4Y2VwdGlvbiB7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGNvbnN0IENlcnRpZmljYXRlRXhjZXB0aW9uKFtTdHJpbmcgbWVzc2FnZSA9ICIiLCBPU0Vycm9yIG9zRXJyb3JdKQogICAgICA6IHN1cGVyLl8oIkNlcnRpZmljYXRlRXhjZXB0aW9uIiwgbWVzc2FnZSwgb3NFcnJvcik7Cn0KhR0ATk48AREBBEpCPxQEMD4BBkhFQgU3R0s/BU5INzwwBUpPTDoFUFBKSjIBBjYgOicbLx4wNB49BAFDSRVLIDoqNB4wNBskTjE5CAQBBkRDP0cvBUM+QxwFPwVHR0cbBUY/REIiBToFBjQNHz1EL0FOFhwvPQQBBkRDP0c1BUM+RRwFRENCHgU/EAUGLC4fLCwqRC9QTiY+PjM9BAEGRUNKQD0GJwEGRwVORykGHwEGSjYFTTwGFCMsLgIBBEY6O04qNUVLPQQ2BkdJRgVJUUhHRgVOSDc8MwVKT0w9BjkgOicbJDxLHBwuMwgEAUNMFU4gOiouNUohHjA1CjQ5CAQBBkRDQkcvBUNAQEdEDAVHR0cbBUY/RUIiBToFBjo4DB86KiYnJUAaGCQaLDEEAQZEQ0JHNQVDRkBHRAwFRENCHgVCEAUGLzE4HiwsKiYnRxoZGCQkPDwxBAEGSjYFTTwGFCMsLgEGSEZKQD0GJwEGQgVORykGHwIBBEQmBBohHCgBMBUBMRIBKBYBFhUeHAIBFkpOUEErKyosARMCATYhEyoqJwEZQygpKCkkATU0JQEVOSkwIjobHiEYGycnIwEhIyIXIk9QTk8hUTUfHx4BNxwBK0IXHxg3HiwsOipMNTMuGEIGIRUbFxUUGhomJh4gHBEEARQUGRYUFCAaJSUdKTA4FC4mJy8iSEEaEk0kTgYmKCdCGz04DSoZUQhHTEArNQgaIyAgBgodSh0YExVAJB0aFRoGBAFOPxciSQQBHQwZFiUlIzdNBkA2SQYgPyA/BAEgAT4BLAEbKQQBFCYMOQQBJCQjBAE0RgQBEhkYGzUNIQYfHjMfHAYnJAYZHAQBLS0tGyYwIxsUCggGMC0aIDEgEggGBAE2ASwhESoGBAE0ASsgGgQBITwfTgYXQQYmEwZGFxMEAUo3OR9LBjwfTgYYTxAGLhIkARJMFygGFxQEAUgBNAE/MDAnIkMEATYnLwQBMyoEAS4jBAEwCioYMhk3GQgeIwYEARgTFwQBGRQXBAEYIxAGBAEyIw4iTEpLNw0rBg4EARkmHyAlHDQiFAoPGwgtICUWThMPHAgGBAEcCiEoFRYZHiMGBAEUIywvJiQ7Bh9OHyYXBAErHxsfDD5KPB84CAYEAR8gFQ0VHh48CAYBNSIlDyYIBgQBJiMsBgQBGxsSBAEWIw4GLBweLSAfJyMgEgoqT0sqKRQMCkwsJy4sPQ4MGwonEgomITscDDofDDkbDDoiDCwgDAoWIwYEATMhPzsIE1EjOB4IFSUiDRMGBAEXKTlBJw0pBgQBGCQ6KCEpBgQBPxkeHhwhOyAhBgQBFR8jHhwhOywcBgQBQBYZHxwhPCMtBgQBMTYvKB4mLCclBgFDGyIePRhNFRE0GE4KCDM1ATJLPzw8TTw1AUwdOjoBNy8nICA0CiIIJionICAzCiIIJysjICI1Ch4IJiYjICI0Ch4IFQgEAgEERkVJBBhEIxIBHA0BHAsBDgEfHQQBITEUGRUcHAYEAR8xEhcTGxoGBAEkAUQBRAFKARctKxcEAR4ZFg0iBiEtFzcgOUMcGwYTBAE6GBQGFSo3GjwbGRoyBhQEAToVHjcaTyg9IjAXFhwGFAQBKDcTIiY2Gx0/FQgGBAIBHyYBEBcfFiUlHBIUHRZIJg8nJjpNAUNQRRIBJQIBPRYELBUYGQEcPTIBPwEWKhQeHh0hCCIeBhoEAgEERCAEGjAcQzkCAQREPxAEMhxFOwIBGmRhcnQ6aW8vc2VjdXJlX3NvY2tldC5kYXJ0NG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9zZWN1cml0eV9jb250ZXh0LmRhcnSrxC8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgovKioKICogVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZXMgdG8gdHJ1c3Qgd2hlbiBtYWtpbmcKICogYSBzZWN1cmUgY2xpZW50IGNvbm5lY3Rpb24sIGFuZCB0aGUgY2VydGlmaWNhdGUgY2hhaW4gYW5kCiAqIHByaXZhdGUga2V5IHRvIHNlcnZlIGZyb20gYSBzZWN1cmUgc2VydmVyLgogKgogKiBUaGUgW1NlY3VyZVNvY2tldF0gIGFuZCBbU2VjdXJlU2VydmVyU29ja2V0XSBjbGFzc2VzIHRha2UgYSBTZWN1cml0eUNvbnRleHQKICogYXMgYW4gYXJndW1lbnQgdG8gdGhlaXIgY29ubmVjdCBhbmQgYmluZCBtZXRob2RzLgogKgogKiBDZXJ0aWZpY2F0ZXMgYW5kIGtleXMgY2FuIGJlIGFkZGVkIHRvIGEgU2VjdXJpdHlDb250ZXh0IGZyb20gZWl0aGVyIFBFTQogKiBvciBQS0NTMTIgY29udGFpbmVycy4KICoKICogaU9TIG5vdGU6IFNvbWUgbWV0aG9kcyB0byBhZGQsIHJlbW92ZSwgYW5kIGluc3BlY3QgY2VydGlmaWNhdGVzIGFyZSBub3QgeWV0CiAqIGltcGxlbWVudGVkLiBIb3dldmVyLCB0aGUgcGxhdGZvcm0ncyBidWlsdC1pbiB0cnVzdGVkIGNlcnRpZmljYXRlcyBjYW4KICogYmUgdXNlZCwgYnkgd2F5IG9mIFtTZWN1cml0eUNvbnRleHQuZGVmYXVsdENvbnRleHRdLgogKi8KYWJzdHJhY3QgY2xhc3MgU2VjdXJpdHlDb250ZXh0IHsKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IFtTZWN1cml0eUNvbnRleHRdLgogICAqCiAgICogQnkgZGVmYXVsdCwgdGhlIGNyZWF0ZWQgW1NlY3VyaXR5Q29udGV4dF0gY29udGFpbnMgbm8ga2V5cyBvciBjZXJ0aWZpY2F0ZXMuCiAgICogVGhlc2UgY2FuIGJlIGFkZGVkIGJ5IGNhbGxpbmcgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIElmIGB3aXRoVHJ1c3RlZFJvb3RzYCBpcyBwYXNzZWQgYXMgYHRydWVgLCB0aGUgW1NlY3VyaXR5Q29udGV4dF0gd2lsbCBiZQogICAqIHNlZWRlZCBieSB0aGUgdHJ1c3RlZCByb290IGNlcnRpZmljYXRlcyBwcm92aWRlZCBhcyBleHBsYWluZWQgYmVsb3cuIFRvCiAgICogb2J0YWluIGEgW1NlY3VyaXR5Q29udGV4dF0gY29udGFpbmluZyB0cnVzdGVkIHJvb3QgY2VydGlmaWNhdGVzLAogICAqIFtTZWN1cml0eUNvbnRleHQuZGVmYXVsdENvbnRleHRdIGlzIHVzdWFsbHkgc3VmZmljaWVudCwgYW5kIHNob3VsZAogICAqIGJlIHVzZWQgaW5zdGVhZC4gSG93ZXZlciwgaWYgdGhlIFtTZWN1cml0eUNvbnRleHRdIGNvbnRhaW5pbmcgdGhlIHRydXN0ZWQKICAgKiByb290IGNlcnRpZmljYXRlcyBtdXN0IGJlIG1vZGlmaWVkIHBlci1jb25uZWN0aW9uLCB0aGVuIGB3aXRoVHJ1c3RlZFJvb3RzYAogICAqIHNob3VsZCBiZSB1c2VkLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgU2VjdXJpdHlDb250ZXh0KHtib29sIHdpdGhUcnVzdGVkUm9vdHM6IGZhbHNlfSk7CgogIC8qKgogICAqIFNlY3VyZSBuZXR3b3JraW5nIGNsYXNzZXMgd2l0aCBhbiBvcHRpb25hbCBgY29udGV4dGAgcGFyYW1ldGVyCiAgICogdXNlIHRoZSBbZGVmYXVsdENvbnRleHRdIG9iamVjdCBpZiB0aGUgcGFyYW1ldGVyIGlzIG9taXR0ZWQuCiAgICogVGhpcyBvYmplY3QgY2FuIGFsc28gYmUgYWNjZXNzZWQsIGFuZCBtb2RpZmllZCwgZGlyZWN0bHkuCiAgICogRWFjaCBpc29sYXRlIGhhcyBhIGRpZmZlcmVudCBbZGVmYXVsdENvbnRleHRdIG9iamVjdC4KICAgKiBUaGUgW2RlZmF1bHRDb250ZXh0XSBvYmplY3QgdXNlcyBhIGxpc3Qgb2Ygd2VsbC1rbm93biB0cnVzdGVkCiAgICogY2VydGlmaWNhdGUgYXV0aG9yaXRpZXMgYXMgaXRzIHRydXN0ZWQgcm9vdHMuIE9uIExpbnV4IGFuZCBXaW5kb3dzLCB0aGlzCiAgICogbGlzdCBpcyB0YWtlbiBmcm9tIE1vemlsbGEsIHdobyBtYWludGFpbnMgaXQgYXMgcGFydCBvZiBGaXJlZm94LiBPbiwKICAgKiBNYWNPUywgaU9TLCBhbmQgQW5kcm9pZCwgdGhpcyBsaXN0IGNvbWVzIGZyb20gdGhlIHRydXN0ZWQgY2VydGlmaWNhdGVzCiAgICogc3RvcmVzIGJ1aWx0IGluIHRvIHRoZSBwbGF0Zm9ybXMuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIFNlY3VyaXR5Q29udGV4dCBnZXQgZGVmYXVsdENvbnRleHQ7CgogIC8qKgogICAqIFNldHMgdGhlIHByaXZhdGUga2V5IGZvciBhIHNlcnZlciBjZXJ0aWZpY2F0ZSBvciBjbGllbnQgY2VydGlmaWNhdGUuCiAgICoKICAgKiBBIHNlY3VyZSBjb25uZWN0aW9uIHVzaW5nIHRoaXMgU2VjdXJpdHlDb250ZXh0IHdpbGwgdXNlIHRoaXMga2V5IHdpdGgKICAgKiB0aGUgc2VydmVyIG9yIGNsaWVudCBjZXJ0aWZpY2F0ZSB0byBzaWduIGFuZCBkZWNyeXB0IG1lc3NhZ2VzLgogICAqIFtmaWxlXSBpcyB0aGUgcGF0aCB0byBhIFBFTSBvciBQS0NTMTIgZmlsZSBjb250YWluaW5nIGFuIGVuY3J5cHRlZAogICAqIHByaXZhdGUga2V5LCBlbmNyeXB0ZWQgd2l0aCBbcGFzc3dvcmRdLiBBc3N1bWluZyBpdCBpcyB3ZWxsLWZvcm1hdHRlZCwgYWxsCiAgICogb3RoZXIgY29udGVudHMgb2YgW2ZpbGVdIGFyZSBpZ25vcmVkLiBBbiB1bmVuY3J5cHRlZCBmaWxlIGNhbiBiZSB1c2VkLAogICAqIGJ1dCB0aGlzIGlzIG5vdCB1c3VhbC4KICAgKgogICAqIE5COiBUaGlzIGZ1bmN0aW9uIGNhbGxzIFtGaWxlLnJlYWRBc0J5dGVzU3luY10sIGFuZCB3aWxsIGJsb2NrIG9uIGZpbGUgSU8uCiAgICogUHJlZmVyIHVzaW5nIFt1c2VQcml2YXRlS2V5Qnl0ZXNdLgogICAqCiAgICogaU9TIG5vdGU6IE9ubHkgUEtDUzEyIGRhdGEgaXMgc3VwcG9ydGVkLiBJdCBzaG91bGQgY29udGFpbiBib3RoIHRoZSBwcml2YXRlCiAgICoga2V5IGFuZCB0aGUgY2VydGlmaWNhdGUgY2hhaW4uIE9uIGlPUyBvbmUgY2FsbCB0byBbdXNlUHJpdmF0ZUtleV0gd2l0aCB0aGlzCiAgICogZGF0YSBpcyB1c2VkIGluc3RlYWQgb2YgdHdvIGNhbGxzIHRvIFt1c2VDZXJ0aWZpY2F0ZUNoYWluXSBhbmQKICAgKiBbdXNlUHJpdmF0ZUtleV0uCiAgICovCiAgdm9pZCB1c2VQcml2YXRlS2V5KFN0cmluZyBmaWxlLCB7U3RyaW5nIHBhc3N3b3JkfSk7CgogIC8qKgogICAqIFNldHMgdGhlIHByaXZhdGUga2V5IGZvciBhIHNlcnZlciBjZXJ0aWZpY2F0ZSBvciBjbGllbnQgY2VydGlmaWNhdGUuCiAgICoKICAgKiBMaWtlIFt1c2VQcml2YXRlS2V5XSwgYnV0IHRha2VzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhcyBhIGxpc3QKICAgKiBvZiBieXRlcy4KICAgKi8KICB2b2lkIHVzZVByaXZhdGVLZXlCeXRlcyhMaXN0PGludD4ga2V5Qnl0ZXMsIHtTdHJpbmcgcGFzc3dvcmR9KTsKCiAgLyoqCiAgICogU2V0cyB0aGUgc2V0IG9mIHRydXN0ZWQgWDUwOSBjZXJ0aWZpY2F0ZXMgdXNlZCBieSBbU2VjdXJlU29ja2V0XQogICAqIGNsaWVudCBjb25uZWN0aW9ucywgd2hlbiBjb25uZWN0aW5nIHRvIGEgc2VjdXJlIHNlcnZlci4KICAgKgogICAqIFtmaWxlXSBpcyB0aGUgcGF0aCB0byBhIFBFTSBvciBQS0NTMTIgZmlsZSBjb250YWluaW5nIFg1MDkgY2VydGlmaWNhdGVzLAogICAqIHVzdWFsbHkgcm9vdCBjZXJ0aWZpY2F0ZXMgZnJvbSBjZXJ0aWZpY2F0ZSBhdXRob3JpdGllcy4gRm9yIFBLQ1MxMiBmaWxlcywKICAgKiBbcGFzc3dvcmRdIGlzIHRoZSBwYXNzd29yZCBmb3IgdGhlIGZpbGUuIEZvciBQRU0gZmlsZXMsIFtwYXNzd29yZF0gaXMKICAgKiBpZ25vcmVkLiBBc3N1bWluZyBpdCBpcyB3ZWxsLWZvcm1hdHRlZCwgYWxsIG90aGVyIGNvbnRlbnRzIG9mIFtmaWxlXSBhcmUKICAgKiBpZ25vcmVkLgogICAqCiAgICogTkI6IFRoaXMgZnVuY3Rpb24gY2FsbHMgW0ZpbGUucmVhZEFzQnl0ZXNTeW5jXSwgYW5kIHdpbGwgYmxvY2sgb24gZmlsZSBJTy4KICAgKiBQcmVmZXIgdXNpbmcgW3NldFRydXN0ZWRDZXJ0aWZpY2F0ZXNCeXRlc10uCiAgICoKICAgKiBpT1Mgbm90ZTogT24gaU9TLCB0aGlzIGNhbGwgdGFrZXMgb25seSB0aGUgYnl0ZXMgZm9yIGEgc2luZ2xlIERFUgogICAqIGVuY29kZWQgWDUwOSBjZXJ0aWZpY2F0ZS4gSXQgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBhZGQKICAgKiBtdWx0aXBsZSB0cnVzdGVkIGNlcnRpZmljYXRlcyB0byB0aGUgY29udGV4dC4gQSBERVIgZW5jb2RlZCBjZXJ0aWZpY2F0ZQogICAqIGNhbiBiZSBvYnRhaW5lZCBmcm9tIGEgUEVNIGVuY29kZWQgY2VydGlmaWNhdGUgYnkgdXNpbmcgdGhlIG9wZW5zc2wgdG9vbDoKICAgKgogICAqICAgJCBvcGVuc3NsIHg1MDkgLW91dGZvcm0gZGVyIC1pbiBjZXJ0LnBlbSAtb3V0IGNlcnQuZGVyCiAgICovCiAgdm9pZCBzZXRUcnVzdGVkQ2VydGlmaWNhdGVzKFN0cmluZyBmaWxlLCB7U3RyaW5nIHBhc3N3b3JkfSk7CgogIC8qKgogICAqIFNldHMgdGhlIHNldCBvZiB0cnVzdGVkIFg1MDkgY2VydGlmaWNhdGVzIHVzZWQgYnkgW1NlY3VyZVNvY2tldF0KICAgKiBjbGllbnQgY29ubmVjdGlvbnMsIHdoZW4gY29ubmVjdGluZyB0byBhIHNlY3VyZSBzZXJ2ZXIuCiAgICoKICAgKiBMaWtlIFtzZXRUcnVzdGVkQ2VydGlmaWNhdGVzXSBidXQgdGFrZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLgogICAqLwogIHZvaWQgc2V0VHJ1c3RlZENlcnRpZmljYXRlc0J5dGVzKExpc3Q8aW50PiBjZXJ0Qnl0ZXMsIHtTdHJpbmcgcGFzc3dvcmR9KTsKCiAgLyoqCiAgICogU2V0cyB0aGUgY2hhaW4gb2YgWDUwOSBjZXJ0aWZpY2F0ZXMgc2VydmVkIGJ5IFtTZWN1cmVTZXJ2ZXJTb2NrZXRdCiAgICogd2hlbiBtYWtpbmcgc2VjdXJlIGNvbm5lY3Rpb25zLCBpbmNsdWRpbmcgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZS4KICAgKgogICAqIFtmaWxlXSBpcyBhIFBFTSBvciBQS0NTMTIgZmlsZSBjb250YWluaW5nIFg1MDkgY2VydGlmaWNhdGVzLCBzdGFydGluZyB3aXRoCiAgICogdGhlIHJvb3QgYXV0aG9yaXR5IGFuZCBpbnRlcm1lZGlhdGUgYXV0aG9yaXRpZXMgZm9ybWluZyB0aGUgc2lnbmVkCiAgICogY2hhaW4gdG8gdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSwgYW5kIGVuZGluZyB3aXRoIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUuCiAgICogVGhlIHByaXZhdGUga2V5IGZvciB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGlzIHNldCBieSBbdXNlUHJpdmF0ZUtleV0uIEZvcgogICAqIFBLQ1MxMiBmaWxlcywgW3Bhc3N3b3JkXSBpcyB0aGUgcGFzc3dvcmQgZm9yIHRoZSBmaWxlLiBGb3IgUEVNIGZpbGVzLAogICAqIFtwYXNzd29yZF0gaXMgaWdub3JlZC4gQXNzdW1pbmcgaXQgaXMgd2VsbC1mb3JtYXR0ZWQsIGFsbAogICAqIG90aGVyIGNvbnRlbnRzIG9mIFtmaWxlXSBhcmUgaWdub3JlZC4KICAgKgogICAqIE5COiBUaGlzIGZ1bmN0aW9uIGNhbGxzIFtGaWxlLnJlYWRBc0J5dGVzU3luY10sIGFuZCB3aWxsIGJsb2NrIG9uIGZpbGUgSU8uCiAgICogUHJlZmVyIHVzaW5nIFt1c2VDZXJ0aWZpY2F0ZUNoYWluQnl0ZXNdLgogICAqCiAgICogaU9TIG5vdGU6IEFzIG5vdGVkIGFib3ZlLCBbdXNlUHJpdmF0ZUtleV0gZG9lcyB0aGUgam9iIG9mIGJvdGgKICAgKiB0aGF0IGNhbGwgYW5kIHRoaXMgb25lLiBPbiBpT1MsIHRoaXMgY2FsbCBpcyBhIG5vLW9wLgogICAqLwogIHZvaWQgdXNlQ2VydGlmaWNhdGVDaGFpbihTdHJpbmcgZmlsZSwge1N0cmluZyBwYXNzd29yZH0pOwoKICAvKioKICAgKiBTZXRzIHRoZSBjaGFpbiBvZiBYNTA5IGNlcnRpZmljYXRlcyBzZXJ2ZWQgYnkgW1NlY3VyZVNlcnZlclNvY2tldF0KICAgKiB3aGVuIG1ha2luZyBzZWN1cmUgY29ubmVjdGlvbnMsIGluY2x1ZGluZyB0aGUgc2VydmVyIGNlcnRpZmljYXRlLgogICAqCiAgICogTGlrZSBbdXNlQ2VydGlmaWNhdGVDaGFpbl0gYnV0IHRha2VzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4KICAgKi8KICB2b2lkIHVzZUNlcnRpZmljYXRlQ2hhaW5CeXRlcyhMaXN0PGludD4gY2hhaW5CeXRlcywge1N0cmluZyBwYXNzd29yZH0pOwoKICAvKioKICAgKiBTZXRzIHRoZSBsaXN0IG9mIGF1dGhvcml0eSBuYW1lcyB0aGF0IGEgW1NlY3VyZVNlcnZlclNvY2tldF0gd2lsbCBhZHZlcnRpc2UKICAgKiBhcyBhY2NlcHRlZCB3aGVuIHJlcXVlc3RpbmcgYSBjbGllbnQgY2VydGlmaWNhdGUgZnJvbSBhIGNvbm5lY3RpbmcKICAgKiBjbGllbnQuCiAgICoKICAgKiBbZmlsZV0gaXMgYSBQRU0gb3IgUEtDUzEyIGZpbGUgY29udGFpbmluZyB0aGUgYWNjZXB0ZWQgc2lnbmluZwogICAqIGF1dGhvcml0eSBjZXJ0aWZpY2F0ZXMgLSB0aGUgYXV0aG9yaXR5IG5hbWVzIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUKICAgKiBjZXJ0aWZpY2F0ZXMuIEZvciBQS0NTMTIgZmlsZXMsIFtwYXNzd29yZF0gaXMgdGhlIHBhc3N3b3JkIGZvciB0aGUgZmlsZS4KICAgKiBGb3IgUEVNIGZpbGVzLCBbcGFzc3dvcmRdIGlzIGlnbm9yZWQuIEFzc3VtaW5nIGl0IGlzIHdlbGwtZm9ybWF0dGVkLCBhbGwKICAgKiBvdGhlciBjb250ZW50cyBvZiBbZmlsZV0gYXJlIGlnbm9yZWQuCiAgICoKICAgKiBOQjogVGhpcyBmdW5jdGlvbiBjYWxscyBbRmlsZS5yZWFkQXNCeXRlc1N5bmNdLCBhbmQgd2lsbCBibG9jayBvbiBmaWxlIElPLgogICAqIFByZWZlciB1c2luZyBbc2V0Q2xpZW50QXV0aG9yaXRpZXNCeXRlc10uCiAgICoKICAgKiBpT1Mgbm90ZTogVGhpcyBjYWxsIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICovCiAgdm9pZCBzZXRDbGllbnRBdXRob3JpdGllcyhTdHJpbmcgZmlsZSwge1N0cmluZyBwYXNzd29yZH0pOwoKICAvKioKICAgKiBTZXRzIHRoZSBsaXN0IG9mIGF1dGhvcml0eSBuYW1lcyB0aGF0IGEgW1NlY3VyZVNlcnZlclNvY2tldF0gd2lsbCBhZHZlcnRpc2UKICAgKiBhcyBhY2NlcHRlZCwgd2hlbiByZXF1ZXN0aW5nIGEgY2xpZW50IGNlcnRpZmljYXRlIGZyb20gYSBjb25uZWN0aW5nCiAgICogY2xpZW50LgogICAqCiAgICogTGlrZSBbc2V0Q2xpZW50QXV0aG9yaXRpZXNdIGJ1dCB0YWtlcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUuCiAgICovCiAgdm9pZCBzZXRDbGllbnRBdXRob3JpdGllc0J5dGVzKExpc3Q8aW50PiBhdXRoQ2VydEJ5dGVzLCB7U3RyaW5nIHBhc3N3b3JkfSk7CgogIC8qKgogICAqIFdoZXRoZXIgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIEFMUE4uIFRoaXMgYWx3YXlzIHJldHVybnMgdHJ1ZSBhbmQgd2lsbCBiZQogICAqIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KICAgKi8KICBAZGVwcmVjYXRlZAogIGV4dGVybmFsIHN0YXRpYyBib29sIGdldCBhbHBuU3VwcG9ydGVkOwoKICAvKioKICAgKiBTZXRzIHRoZSBsaXN0IG9mIGFwcGxpY2F0aW9uLWxldmVsIHByb3RvY29scyBzdXBwb3J0ZWQgYnkgYSBjbGllbnQKICAgKiBjb25uZWN0aW9uIG9yIHNlcnZlciBjb25uZWN0aW9uLiBUaGUgQUxQTiAoYXBwbGljYXRpb24gbGV2ZWwgcHJvdG9jb2wKICAgKiBuZWdvdGlhdGlvbikgZXh0ZW5zaW9uIHRvIFRMUyBhbGxvd3MgYSBjbGllbnQgdG8gc2VuZCBhIGxpc3Qgb2YKICAgKiBwcm90b2NvbHMgaW4gdGhlIFRMUyBjbGllbnQgaGVsbG8gbWVzc2FnZSwgYW5kIHRoZSBzZXJ2ZXIgdG8gcGljawogICAqIG9uZSBhbmQgc2VuZCB0aGUgc2VsZWN0ZWQgb25lIGJhY2sgaW4gaXRzIHNlcnZlciBoZWxsbyBtZXNzYWdlLgogICAqCiAgICogU2VwYXJhdGUgbGlzdHMgb2YgcHJvdG9jb2xzIGNhbiBiZSBzZW50IGZvciBjbGllbnQgY29ubmVjdGlvbnMgYW5kCiAgICogZm9yIHNlcnZlciBjb25uZWN0aW9ucywgdXNpbmcgdGhlIHNhbWUgU2VjdXJpdHlDb250ZXh0LiAgVGhlIFtpc1NlcnZlcl0KICAgKiBib29sZWFuIGFyZ3VtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRvIHNldCB0aGUgbGlzdCBmb3Igc2VydmVyIGNvbm5lY3Rpb25zCiAgICogb3IgY2xpZW50IGNvbm5lY3Rpb25zLgogICAqLwogIHZvaWQgc2V0QWxwblByb3RvY29scyhMaXN0PFN0cmluZz4gcHJvdG9jb2xzLCBib29sIGlzU2VydmVyKTsKCiAgLy8vIEVuY29kZXMgYSBzZXQgb2Ygc3VwcG9ydGVkIHByb3RvY29scyBmb3IgQUxQTi9OUE4gdXNhZ2UuCiAgLy8vCiAgLy8vIFRoZSBgcHJvdG9jb2xzYCBsaXN0IGlzIGV4cGVjdGVkIHRvIGNvbnRhaW4gcHJvdG9jb2xzIGluIGRlc2NlbmRpbmcgb3JkZXIKICAvLy8gb2YgcHJlZmVyZW5jZS4KICAvLy8KICAvLy8gU2VlIFJGQyA3MzAxIChodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzMwMSkgZm9yIHRoZSBlbmNvZGluZyBvZgogIC8vLyBgTGlzdDxTdHJpbmc+IHByb3RvY29sc2A6CiAgLy8vICAgICBvcGFxdWUgUHJvdG9jb2xOYW1lPDEuLjJeOC0xPjsKICAvLy8KICAvLy8gICAgIHN0cnVjdCB7CiAgLy8vICAgICAgICAgUHJvdG9jb2xOYW1lIHByb3RvY29sX25hbWVfbGlzdDwyLi4yXjE2LTE+CiAgLy8vICAgICB9IFByb3RvY29sTmFtZUxpc3Q7CiAgLy8vCiAgLy8vIFRoZSBlbmNvZGluZyBvZiB0aGUgb3BhcXVlIGBQcm90b2NvbE5hbWU8bG93ZXIuLnVwcGVyPmAgdmVjdG9yIGlzCiAgLy8vIGRlc2NyaWJlZCBpbiBSRkMgMjI0NjogNC4zIFZlY3RvcnMuCiAgLy8vCiAgLy8vIE5vdGU6IEV2ZW4gdGhvdWdoIHRoaXMgZW5jb2Rpbmcgc2NoZW1lIHdvdWxkIGFsbG93IGEgdG90YWwKICAvLy8gYFByb3RvY29sTmFtZUxpc3RgIGxlbmd0aCBvZiA2NTUzNSwgdGhpcyBsaW1pdCBjYW5ub3QgYmUgcmVhY2hlZC4gVGVzdGluZwogIC8vLyBzaG93ZWQgdGhhdCBtb3JlIHRoYW4gfiAyXjE0ICBieXRlcyB3aWxsIGZhaWwgdG8gbmVnb3RpYXRlIGEgcHJvdG9jb2wuCiAgLy8vIFdlIHdpbGwgYmUgY29uc2VydmF0aXZlIGFuZCBzdXBwb3J0IG9ubHkgbWVzc2FnZXMgdXAgdG8gKDE8PDEzKS0xIGJ5dGVzLgogIHN0YXRpYyBVaW50OExpc3QgX3Byb3RvY29sc1RvTGVuZ3RoRW5jb2RpbmcoTGlzdDxTdHJpbmc+IHByb3RvY29scykgewogICAgaWYgKHByb3RvY29scyA9PSBudWxsIHx8IHByb3RvY29scy5sZW5ndGggPT0gMCkgewogICAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdCgwKTsKICAgIH0KICAgIGludCBwcm90b2NvbHNMZW5ndGggPSBwcm90b2NvbHMubGVuZ3RoOwoKICAgIC8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIHdpbGwgbmVlZCBpZiBpdCBpcyBBU0NJSS4KICAgIGludCBleHBlY3RlZExlbmd0aCA9IHByb3RvY29sc0xlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG9jb2xzTGVuZ3RoOyBpKyspIHsKICAgICAgaW50IGxlbmd0aCA9IHByb3RvY29sc1tpXS5sZW5ndGg7CiAgICAgIGlmIChsZW5ndGggPiAwICYmIGxlbmd0aCA8PSAyNTUpIHsKICAgICAgICBleHBlY3RlZExlbmd0aCArPSBsZW5ndGg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAgICdMZW5ndGggb2YgcHJvdG9jb2wgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSAod2FzOiAkbGVuZ3RoKS4nKTsKICAgICAgfQogICAgfQoKICAgIGlmIChleHBlY3RlZExlbmd0aCA+PSAoMSA8PCAxMykpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAnVGhlIG1heGltdW0gbWVzc2FnZSBsZW5ndGggc3VwcG9ydGVkIGlzIDJeMTMtMS4nKTsKICAgIH0KCiAgICAvLyBUcnkgZW5jb2RpbmcgdGhlIGBMaXN0PFN0cmluZz4gcHJvdG9jb2xzYCBhcnJheSB1c2luZyBmYXN0IEFTQ0lJIHBhdGguCiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhMaXN0KGV4cGVjdGVkTGVuZ3RoKTsKICAgIGludCBieXRlc09mZnNldCA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvY29sc0xlbmd0aDsgaSsrKSB7CiAgICAgIFN0cmluZyBwcm90byA9IHByb3RvY29sc1tpXTsKCiAgICAgIC8vIEFkZCBsZW5ndGggYnl0ZS4KICAgICAgYnl0ZXNbYnl0ZXNPZmZzZXQrK10gPSBwcm90by5sZW5ndGg7CiAgICAgIGludCBiaXRzID0gMDsKCiAgICAgIC8vIEFkZCBwcm90b2NvbCBieXRlcy4KICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwcm90by5sZW5ndGg7IGorKykgewogICAgICAgIHZhciBjaGFyID0gcHJvdG8uY29kZVVuaXRBdChqKTsKICAgICAgICBiaXRzIHw9IGNoYXI7CiAgICAgICAgYnl0ZXNbYnl0ZXNPZmZzZXQrK10gPSBjaGFyICYgMHhmZjsKICAgICAgfQoKICAgICAgLy8gR28gc2xvdyBjYXNlIGlmIHdlIGhhdmUgZW5jb3VudGVyZWQgYW55dGhpbmcgbm9uLWFzY2lpLgogICAgICBpZiAoYml0cyA+IDB4N2YpIHsKICAgICAgICByZXR1cm4gX3Byb3RvY29sc1RvTGVuZ3RoRW5jb2RpbmdOb25Bc2NpaUJhaWxvdXQocHJvdG9jb2xzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ5dGVzOwogIH0KCiAgc3RhdGljIFVpbnQ4TGlzdCBfcHJvdG9jb2xzVG9MZW5ndGhFbmNvZGluZ05vbkFzY2lpQmFpbG91dCgKICAgICAgTGlzdDxTdHJpbmc+IHByb3RvY29scykgewogICAgdm9pZCBhZGRQcm90b2NvbChMaXN0PGludD4gb3V0Qnl0ZXMsIFN0cmluZyBwcm90b2NvbCkgewogICAgICB2YXIgcHJvdG9jb2xCeXRlcyA9IHV0ZjguZW5jb2RlKHByb3RvY29sKTsKICAgICAgdmFyIGxlbiA9IHByb3RvY29sQnl0ZXMubGVuZ3RoOwoKICAgICAgaWYgKGxlbiA+IDI1NSkgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgICAnTGVuZ3RoIG9mIHByb3RvY29sIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAyNTUgKHdhczogJGxlbiknKTsKICAgICAgfQogICAgICAvLyBBZGQgbGVuZ3RoIGJ5dGUuCiAgICAgIG91dEJ5dGVzLmFkZChsZW4pOwoKICAgICAgLy8gQWRkIHByb3RvY29sIGJ5dGVzLgogICAgICBvdXRCeXRlcy5hZGRBbGwocHJvdG9jb2xCeXRlcyk7CiAgICB9CgogICAgTGlzdDxpbnQ+IGJ5dGVzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3RvY29scy5sZW5ndGg7IGkrKykgewogICAgICBhZGRQcm90b2NvbChieXRlcywgcHJvdG9jb2xzW2ldKTsKICAgIH0KCiAgICBpZiAoYnl0ZXMubGVuZ3RoID49ICgxIDw8IDEzKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICdUaGUgbWF4aW11bSBtZXNzYWdlIGxlbmd0aCBzdXBwb3J0ZWQgaXMgMl4xMy0xLicpOwogICAgfQoKICAgIHJldHVybiBuZXcgVWludDhMaXN0LmZyb21MaXN0KGJ5dGVzKTsKICB9Cn0KgR0ATk48AREBBD89LgNPNQNLGQNPSjgEIQYmBVE+BU5NRkhPUBUGRAEGREI/O0NOSkwnBjYBBkoFS0RIUEwcBVAoBVFRRBYGNgEGSgVIDwZCAQZGPQVOT0tODgVQMQVHRk1PBT4GPwEGRj0FRwZMAQZIRwVQSE5PSz8rBVAuBUQ7BjwBBkhHBUQGSgEGUUgNBURJTk4rBVAvBSsGPQEGUUkNBUUGTgEGTiIGDioBBkhLRUdFBUhNTxwGQAE/BlAVBk0gKQYTOR4GSCoGQVBNT0g2HwYsAUIqMCgpIg8hTQgGAScfPgYBTi8ZMCMBGisUAR0vKBYsCAFBGUUIBhIEAT4gPDEmARchSQgaGQEdJgYBGjEoBgElHz4GASoEAgEdZGFydDppby9zZWN1cml0eV9jb250ZXh0LmRhcnQqb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL3NvY2tldC5kYXJ0wACA2S8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgovKioKICogW0ludGVybmV0QWRkcmVzc1R5cGVdIGlzIHRoZSB0eXBlIGFuIFtJbnRlcm5ldEFkZHJlc3NdLiBDdXJyZW50bHksCiAqIElQIHZlcnNpb24gNCAoSVB2NCkgYW5kIElQIHZlcnNpb24gNiAoSVB2NikgYXJlIHN1cHBvcnRlZC4KICovCmNsYXNzIEludGVybmV0QWRkcmVzc1R5cGUgewogIHN0YXRpYyBjb25zdCBJbnRlcm5ldEFkZHJlc3NUeXBlIElQdjQgPSBjb25zdCBJbnRlcm5ldEFkZHJlc3NUeXBlLl8oMCk7CiAgc3RhdGljIGNvbnN0IEludGVybmV0QWRkcmVzc1R5cGUgSVB2NiA9IGNvbnN0IEludGVybmV0QWRkcmVzc1R5cGUuXygxKTsKICBzdGF0aWMgY29uc3QgSW50ZXJuZXRBZGRyZXNzVHlwZSBhbnkgPSBjb25zdCBJbnRlcm5ldEFkZHJlc3NUeXBlLl8oLTEpOwoKICBARGVwcmVjYXRlZCgiVXNlIElQdjQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEludGVybmV0QWRkcmVzc1R5cGUgSVBfVjQgPSBJUHY0OwogIEBEZXByZWNhdGVkKCJVc2UgSVB2NiBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgSW50ZXJuZXRBZGRyZXNzVHlwZSBJUF9WNiA9IElQdjY7CiAgQERlcHJlY2F0ZWQoIlVzZSBhbnkgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEludGVybmV0QWRkcmVzc1R5cGUgQU5ZID0gYW55OwoKICBmaW5hbCBpbnQgX3ZhbHVlOwoKICBjb25zdCBJbnRlcm5ldEFkZHJlc3NUeXBlLl8odGhpcy5fdmFsdWUpOwoKICBmYWN0b3J5IEludGVybmV0QWRkcmVzc1R5cGUuX2Zyb20oaW50IHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gMCkgcmV0dXJuIElQdjQ7CiAgICBpZiAodmFsdWUgPT0gMSkgcmV0dXJuIElQdjY7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSW52YWxpZCB0eXBlOiAkdmFsdWUiKTsKICB9CgogIC8qKgogICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgdHlwZSwgZS5nLiAiSVB2NCIgb3IgIklQdjYiLgogICAqLwogIFN0cmluZyBnZXQgbmFtZSB7CiAgICBzd2l0Y2ggKF92YWx1ZSkgewogICAgICBjYXNlIC0xOgogICAgICAgIHJldHVybiAiQU5ZIjsKICAgICAgY2FzZSAwOgogICAgICAgIHJldHVybiAiSVB2NCI7CiAgICAgIGNhc2UgMToKICAgICAgICByZXR1cm4gIklQdjYiOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJJbnZhbGlkIEludGVybmV0QWRkcmVzcyIpOwogICAgfQogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkludGVybmV0QWRkcmVzc1R5cGU6ICRuYW1lIjsKfQoKLyoqCiAqIEFuIGludGVybmV0IGFkZHJlc3MuCiAqCiAqIFRoaXMgb2JqZWN0IGhvbGRzIGFuIGludGVybmV0IGFkZHJlc3MuIElmIHRoaXMgaW50ZXJuZXQgYWRkcmVzcwogKiBpcyB0aGUgcmVzdWx0IG9mIGEgRE5TIGxvb2t1cCwgdGhlIGFkZHJlc3MgYWxzbyBob2xkcyB0aGUgaG9zdG5hbWUKICogdXNlZCB0byBtYWtlIHRoZSBsb29rdXAuCiAqIEFuIEludGVybmV0IGFkZHJlc3MgY29tYmluZWQgd2l0aCBhIHBvcnQgbnVtYmVyIHJlcHJlc2VudHMgYW4KICogZW5kcG9pbnQgdG8gd2hpY2ggYSBzb2NrZXQgY2FuIGNvbm5lY3Qgb3IgYSBsaXN0ZW5pbmcgc29ja2V0IGNhbgogKiBiaW5kLgogKi8KYWJzdHJhY3QgY2xhc3MgSW50ZXJuZXRBZGRyZXNzIHsKICAvKioKICAgKiBJUCB2ZXJzaW9uIDQgbG9vcGJhY2sgYWRkcmVzcy4gVXNlIHRoaXMgYWRkcmVzcyB3aGVuIGxpc3RlbmluZyBvbgogICAqIG9yIGNvbm5lY3RpbmcgdG8gdGhlIGxvb3BiYWNrIGFkYXB0ZXIgdXNpbmcgSVAgdmVyc2lvbiA0IChJUHY0KS4KICAgKi8KICBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzIGdldCBsb29wYmFja0lQdjQgPT4gTE9PUEJBQ0tfSVBfVjQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBsb29wYmFja0lQdjQgaW5zdGVhZCIpCiAgZXh0ZXJuYWwgc3RhdGljIEludGVybmV0QWRkcmVzcyBnZXQgTE9PUEJBQ0tfSVBfVjQ7CgogIC8qKgogICAqIElQIHZlcnNpb24gNiBsb29wYmFjayBhZGRyZXNzLiBVc2UgdGhpcyBhZGRyZXNzIHdoZW4gbGlzdGVuaW5nIG9uCiAgICogb3IgY29ubmVjdGluZyB0byB0aGUgbG9vcGJhY2sgYWRhcHRlciB1c2luZyBJUCB2ZXJzaW9uIDYgKElQdjYpLgogICAqLwogIHN0YXRpYyBJbnRlcm5ldEFkZHJlc3MgZ2V0IGxvb3BiYWNrSVB2NiA9PiBMT09QQkFDS19JUF9WNjsKICBARGVwcmVjYXRlZCgiVXNlIGxvb3BiYWNrSVB2NiBpbnN0ZWFkIikKICBleHRlcm5hbCBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzIGdldCBMT09QQkFDS19JUF9WNjsKCiAgLyoqCiAgICogSVAgdmVyc2lvbiA0IGFueSBhZGRyZXNzLiBVc2UgdGhpcyBhZGRyZXNzIHdoZW4gbGlzdGVuaW5nIG9uCiAgICogYWxsIGFkYXB0ZXJzIElQIGFkZHJlc3NlcyB1c2luZyBJUCB2ZXJzaW9uIDQgKElQdjQpLgogICAqLwogIHN0YXRpYyBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFueUlQdjQgPT4gQU5ZX0lQX1Y0OwogIEBEZXByZWNhdGVkKCJVc2UgYW55SVB2NCBpbnN0ZWFkIikKICBleHRlcm5hbCBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzIGdldCBBTllfSVBfVjQ7CgogIC8qKgogICAqIElQIHZlcnNpb24gNiBhbnkgYWRkcmVzcy4gVXNlIHRoaXMgYWRkcmVzcyB3aGVuIGxpc3RlbmluZyBvbgogICAqIGFsbCBhZGFwdGVycyBJUCBhZGRyZXNzZXMgdXNpbmcgSVAgdmVyc2lvbiA2IChJUHY2KS4KICAgKi8KICBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzIGdldCBhbnlJUHY2ID0+IEFOWV9JUF9WNjsKICBARGVwcmVjYXRlZCgiVXNlIGFueUlQdjYgaW5zdGVhZCIpCiAgZXh0ZXJuYWwgc3RhdGljIEludGVybmV0QWRkcmVzcyBnZXQgQU5ZX0lQX1Y2OwoKICAvKioKICAgKiBUaGUgW3R5cGVdIG9mIHRoZSBbSW50ZXJuZXRBZGRyZXNzXSBzcGVjaWZpZWQgd2hhdCBJUCBwcm90b2NvbC4KICAgKi8KICBJbnRlcm5ldEFkZHJlc3NUeXBlIGdldCB0eXBlOwoKICAvKioKICAgKiBUaGUgbnVtZXJpYyBhZGRyZXNzIG9mIHRoZSBob3N0LiBGb3IgSVB2NCBhZGRyZXNzZXMgdGhpcyBpcyB1c2luZwogICAqIHRoZSBkb3R0ZWQtZGVjaW1hbCBub3RhdGlvbi4gRm9yIElQdjYgaXQgaXMgdXNpbmcgdGhlCiAgICogaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24uCiAgICovCiAgU3RyaW5nIGdldCBhZGRyZXNzOwoKICAvKioKICAgKiBUaGUgaG9zdCB1c2VkIHRvIGxvb2t1cCB0aGUgYWRkcmVzcy4gSWYgdGhlcmUgaXMgbm8gaG9zdAogICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWRkcmVzcyB0aGlzIHJldHVybnMgdGhlIG51bWVyaWMgYWRkcmVzcy4KICAgKi8KICBTdHJpbmcgZ2V0IGhvc3Q7CgogIC8qKgogICAqIEdldCB0aGUgcmF3IGFkZHJlc3Mgb2YgdGhpcyBbSW50ZXJuZXRBZGRyZXNzXS4gVGhlIHJlc3VsdCBpcyBlaXRoZXIgYQogICAqIDQgb3IgMTYgYnl0ZSBsb25nIGxpc3QuIFRoZSByZXR1cm5lZCBsaXN0IGlzIGEgY29weSwgbWFraW5nIGl0IHBvc3NpYmxlCiAgICogdG8gY2hhbmdlIHRoZSBsaXN0IHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBbSW50ZXJuZXRBZGRyZXNzXS4KICAgKi8KICBVaW50OExpc3QgZ2V0IHJhd0FkZHJlc3M7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgW0ludGVybmV0QWRkcmVzc10gaXMgYSBsb29wYmFjayBhZGRyZXNzLgogICAqLwogIGJvb2wgZ2V0IGlzTG9vcGJhY2s7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgW0ludGVybmV0QWRkcmVzc11zIHNjb3BlIGlzIGEgbGluay1sb2NhbC4KICAgKi8KICBib29sIGdldCBpc0xpbmtMb2NhbDsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBbSW50ZXJuZXRBZGRyZXNzXXMgc2NvcGUgaXMgbXVsdGljYXN0LgogICAqLwogIGJvb2wgZ2V0IGlzTXVsdGljYXN0OwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IFtJbnRlcm5ldEFkZHJlc3NdIGZyb20gYSBudW1lcmljIGFkZHJlc3MuCiAgICoKICAgKiBJZiB0aGUgYWRkcmVzcyBpbiBbYWRkcmVzc10gaXMgbm90IGEgbnVtZXJpYyBJUHY0CiAgICogKGRvdHRlZC1kZWNpbWFsIG5vdGF0aW9uKSBvciBJUHY2IChoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbikuCiAgICogYWRkcmVzcyBbQXJndW1lbnRFcnJvcl0gaXMgdGhyb3duLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgSW50ZXJuZXRBZGRyZXNzKFN0cmluZyBhZGRyZXNzKTsKCiAgLyoqCiAgICogUGVyZm9ybSBhIHJldmVyc2UgZG5zIGxvb2t1cCBvbiB0aGUgW2FkZHJlc3NdLCBjcmVhdGluZyBhIG5ldwogICAqIFtJbnRlcm5ldEFkZHJlc3NdIHdoZXJlIHRoZSBob3N0IGZpZWxkIHNldCB0byB0aGUgcmVzdWx0LgogICAqLwogIEZ1dHVyZTxJbnRlcm5ldEFkZHJlc3M+IHJldmVyc2UoKTsKCiAgLyoqCiAgICogTG9va3VwIGEgaG9zdCwgcmV0dXJuaW5nIGEgRnV0dXJlIG9mIGEgbGlzdCBvZgogICAqIFtJbnRlcm5ldEFkZHJlc3Ndcy4gSWYgW3R5cGVdIGlzIFtJbnRlcm5ldEFkZHJlc3NUeXBlLkFOWV0sIGl0CiAgICogd2lsbCBsb29rdXAgYm90aCBJUCB2ZXJzaW9uIDQgKElQdjQpIGFuZCBJUCB2ZXJzaW9uIDYgKElQdjYpCiAgICogYWRkcmVzc2VzLiBJZiBbdHlwZV0gaXMgZWl0aGVyIFtJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjRdIG9yCiAgICogW0ludGVybmV0QWRkcmVzc1R5cGUuSVB2Nl0gaXQgd2lsbCBvbmx5IGxvb2t1cCBhZGRyZXNzZXMgb2YgdGhlCiAgICogc3BlY2lmaWVkIHR5cGUuIFRoZSBvcmRlciBvZiB0aGUgbGlzdCBjYW4sIGFuZCBtb3N0IGxpa2VseSB3aWxsLAogICAqIGNoYW5nZSBvdmVyIHRpbWUuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxMaXN0PEludGVybmV0QWRkcmVzcz4+IGxvb2t1cChTdHJpbmcgaG9zdCwKICAgICAge0ludGVybmV0QWRkcmVzc1R5cGUgdHlwZTogSW50ZXJuZXRBZGRyZXNzVHlwZS5hbnl9KTsKCiAgLyoqCiAgICogQ2xvbmVzIHRoZSBnaXZlbiBbYWRkcmVzc10gd2l0aCB0aGUgbmV3IFtob3N0XS4KICAgKgogICAqIFRoZSBbYWRkcmVzc10gbXVzdCBiZSBhbiBbSW50ZXJuZXRBZGRyZXNzXSB0aGF0IHdhcyBjcmVhdGVkIHdpdGggb25lCiAgICogb2YgdGhlIHN0YXRpYyBtZXRob2RzIG9mIHRoaXMgY2xhc3MuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIEludGVybmV0QWRkcmVzcyBfY2xvbmVXaXRoTmV3SG9zdCgKICAgICAgSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3MsIFN0cmluZyBob3N0KTsKfQoKLyoqCiAqIEEgW05ldHdvcmtJbnRlcmZhY2VdIHJlcHJlc2VudHMgYW4gYWN0aXZlIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHRoZSBjdXJyZW50CiAqIHN5c3RlbS4gSXQgY29udGFpbnMgYSBsaXN0IG9mIFtJbnRlcm5ldEFkZHJlc3NdZXMgdGhhdCBhcmUgYm91bmQgdG8gdGhlCiAqIGludGVyZmFjZS4KICovCmFic3RyYWN0IGNsYXNzIE5ldHdvcmtJbnRlcmZhY2UgewogIC8qKgogICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgW05ldHdvcmtJbnRlcmZhY2VdLgogICAqLwogIFN0cmluZyBnZXQgbmFtZTsKCiAgLyoqCiAgICogR2V0IHRoZSBpbmRleCBvZiB0aGUgW05ldHdvcmtJbnRlcmZhY2VdLgogICAqLwogIGludCBnZXQgaW5kZXg7CgogIC8qKgogICAqIEdldCBhIGxpc3Qgb2YgW0ludGVybmV0QWRkcmVzc11lcyBjdXJyZW50bHkgYm91bmQgdG8gdGhpcwogICAqIFtOZXR3b3JrSW50ZXJmYWNlXS4KICAgKi8KICBMaXN0PEludGVybmV0QWRkcmVzcz4gZ2V0IGFkZHJlc3NlczsKCiAgLyoqCiAgICogV2hldGhlciBbbGlzdF0gaXMgc3VwcG9ydGVkLgogICAqCiAgICogW2xpc3RdIGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZCBvbiBBbmRyb2lkLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBib29sIGdldCBsaXN0U3VwcG9ydGVkOwoKICAvKioKICAgKiBRdWVyeSB0aGUgc3lzdGVtIGZvciBbTmV0d29ya0ludGVyZmFjZV1zLgogICAqCiAgICogSWYgW2luY2x1ZGVMb29wYmFja10gaXMgYHRydWVgLCB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGluY2x1ZGUgdGhlCiAgICogbG9vcGJhY2sgZGV2aWNlLiBEZWZhdWx0IGlzIGBmYWxzZWAuCiAgICoKICAgKiBJZiBbaW5jbHVkZUxpbmtMb2NhbF0gaXMgYHRydWVgLCB0aGUgbGlzdCBvZiBhZGRyZXNzZXMgb2YgdGhlIHJldHVybmVkCiAgICogW05ldHdvcmtJbnRlcmZhY2VdcywgbWF5IGluY2x1ZGUgbGluayBsb2NhbCBhZGRyZXNzZXMuIERlZmF1bHQgaXMgYGZhbHNlYC4KICAgKgogICAqIElmIFt0eXBlXSBpcyBlaXRoZXIgW0ludGVybmV0QWRkcmVzc1R5cGUuSVB2NF0gb3IKICAgKiBbSW50ZXJuZXRBZGRyZXNzVHlwZS5JUHY2XSBpdCB3aWxsIG9ubHkgbG9va3VwIGFkZHJlc3NlcyBvZiB0aGUKICAgKiBzcGVjaWZpZWQgdHlwZS4gRGVmYXVsdCBpcyBbSW50ZXJuZXRBZGRyZXNzVHlwZS5hbnldLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8TGlzdDxOZXR3b3JrSW50ZXJmYWNlPj4gbGlzdCgKICAgICAge2Jvb2wgaW5jbHVkZUxvb3BiYWNrOiBmYWxzZSwKICAgICAgYm9vbCBpbmNsdWRlTGlua0xvY2FsOiBmYWxzZSwKICAgICAgSW50ZXJuZXRBZGRyZXNzVHlwZSB0eXBlOiBJbnRlcm5ldEFkZHJlc3NUeXBlLmFueX0pOwp9CgovKioKICogQSBbUmF3U2VydmVyU29ja2V0XSByZXByZXNlbnRzIGEgbGlzdGVuaW5nIHNvY2tldCwgYW5kIHByb3ZpZGVzIGEKICogc3RyZWFtIG9mIGxvdy1sZXZlbCBbUmF3U29ja2V0XSBvYmplY3RzLCBvbmUgZm9yIGVhY2ggY29ubmVjdGlvbgogKiBtYWRlIHRvIHRoZSBsaXN0ZW5pbmcgc29ja2V0LgogKgogKiBTZWUgW1Jhd1NvY2tldF0gZm9yIG1vcmUgaW5mby4KICovCmFic3RyYWN0IGNsYXNzIFJhd1NlcnZlclNvY2tldCBpbXBsZW1lbnRzIFN0cmVhbTxSYXdTb2NrZXQ+IHsKICAvKioKICAgKiBSZXR1cm5zIGEgZnV0dXJlIGZvciBhIFs6UmF3U2VydmVyU29ja2V0Ol0uIFdoZW4gdGhlIGZ1dHVyZQogICAqIGNvbXBsZXRlcyB0aGUgc2VydmVyIHNvY2tldCBpcyBib3VuZCB0byB0aGUgZ2l2ZW4gW2FkZHJlc3NdIGFuZAogICAqIFtwb3J0XSBhbmQgaGFzIHN0YXJ0ZWQgbGlzdGVuaW5nIG9uIGl0LgogICAqCiAgICogVGhlIFthZGRyZXNzXSBjYW4gZWl0aGVyIGJlIGEgW1N0cmluZ10gb3IgYW4KICAgKiBbSW50ZXJuZXRBZGRyZXNzXS4gSWYgW2FkZHJlc3NdIGlzIGEgW1N0cmluZ10sIFtiaW5kXSB3aWxsCiAgICogcGVyZm9ybSBhIFtJbnRlcm5ldEFkZHJlc3MubG9va3VwXSBhbmQgdXNlIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUKICAgKiBsaXN0LiBUbyBsaXN0ZW4gb24gdGhlIGxvb3BiYWNrIGFkYXB0ZXIsIHdoaWNoIHdpbGwgYWxsb3cgb25seQogICAqIGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20gdGhlIGxvY2FsIGhvc3QsIHVzZSB0aGUgdmFsdWUKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2NF0gb3IKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2Nl0uIFRvIGFsbG93IGZvciBpbmNvbWluZwogICAqIGNvbm5lY3Rpb24gZnJvbSB0aGUgbmV0d29yayB1c2UgZWl0aGVyIG9uZSBvZiB0aGUgdmFsdWVzCiAgICogW0ludGVybmV0QWRkcmVzcy5hbnlJUHY0XSBvciBbSW50ZXJuZXRBZGRyZXNzLmFueUlQdjZdIHRvCiAgICogYmluZCB0byBhbGwgaW50ZXJmYWNlcyBvciB0aGUgSVAgYWRkcmVzcyBvZiBhIHNwZWNpZmljIGludGVyZmFjZS4KICAgKgogICAqIElmIGFuIElQIHZlcnNpb24gNiAoSVB2NikgYWRkcmVzcyBpcyB1c2VkLCBib3RoIElQIHZlcnNpb24gNgogICAqIChJUHY2KSBhbmQgdmVyc2lvbiA0IChJUHY0KSBjb25uZWN0aW9ucyB3aWxsIGJlIGFjY2VwdGVkLiBUbwogICAqIHJlc3RyaWN0IHRoaXMgdG8gdmVyc2lvbiA2IChJUHY2KSBvbmx5LCB1c2UgW3Y2T25seV0gdG8gc2V0CiAgICogdmVyc2lvbiA2IG9ubHkuCiAgICoKICAgKiBJZiBbcG9ydF0gaGFzIHRoZSB2YWx1ZSBbOjA6XSBhbiBlcGhlbWVyYWwgcG9ydCB3aWxsCiAgICogYmUgY2hvc2VuIGJ5IHRoZSBzeXN0ZW0uIFRoZSBhY3R1YWwgcG9ydCB1c2VkIGNhbiBiZSByZXRyaWV2ZWQKICAgKiB1c2luZyB0aGUgWzpwb3J0Ol0gZ2V0dGVyLgogICAqCiAgICogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFtiYWNrbG9nXSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsaXN0ZW4KICAgKiBiYWNrbG9nIGZvciB0aGUgdW5kZXJseWluZyBPUyBsaXN0ZW4gc2V0dXAuIElmIFtiYWNrbG9nXSBoYXMgdGhlCiAgICogdmFsdWUgb2YgWzowOl0gKHRoZSBkZWZhdWx0KSBhIHJlYXNvbmFibGUgdmFsdWUgd2lsbCBiZSBjaG9zZW4gYnkKICAgKiB0aGUgc3lzdGVtLgogICAqCiAgICogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFtzaGFyZWRdIHNwZWNpZmllcyB3aGV0aGVyIGFkZGl0aW9uYWwgUmF3U2VydmVyU29ja2V0CiAgICogb2JqZWN0cyBjYW4gYmluZCB0byB0aGUgc2FtZSBjb21iaW5hdGlvbiBvZiBgYWRkcmVzc2AsIGBwb3J0YCBhbmQgYHY2T25seWAuCiAgICogSWYgYHNoYXJlZGAgaXMgYHRydWVgIGFuZCBtb3JlIGBSYXdTZXJ2ZXJTb2NrZXRgcyBmcm9tIHRoaXMgaXNvbGF0ZSBvcgogICAqIG90aGVyIGlzb2xhdGVzIGFyZSBib3VuZCB0byB0aGUgcG9ydCwgdGhlbiB0aGUgaW5jb21pbmcgY29ubmVjdGlvbnMgd2lsbCBiZQogICAqIGRpc3RyaWJ1dGVkIGFtb25nIGFsbCB0aGUgYm91bmQgYFJhd1NlcnZlclNvY2tldGBzLiBDb25uZWN0aW9ucyBjYW4gYmUKICAgKiBkaXN0cmlidXRlZCBvdmVyIG11bHRpcGxlIGlzb2xhdGVzIHRoaXMgd2F5LgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8UmF3U2VydmVyU29ja2V0PiBiaW5kKGFkZHJlc3MsIGludCBwb3J0LAogICAgICB7aW50IGJhY2tsb2c6IDAsIGJvb2wgdjZPbmx5OiBmYWxzZSwgYm9vbCBzaGFyZWQ6IGZhbHNlfSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHBvcnQgdXNlZCBieSB0aGlzIHNvY2tldC4KICAgKi8KICBpbnQgZ2V0IHBvcnQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGFkZHJlc3MgdXNlZCBieSB0aGlzIHNvY2tldC4KICAgKi8KICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3M7CgogIC8qKgogICAqIENsb3NlcyB0aGUgc29ja2V0LiBUaGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcyB3aGVuIHRoZSBzb2NrZXQKICAgKiBpcyBmdWxseSBjbG9zZWQgYW5kIGlzIG5vIGxvbmdlciBib3VuZC4KICAgKi8KICBGdXR1cmU8UmF3U2VydmVyU29ja2V0PiBjbG9zZSgpOwp9CgovKioKICogQSBbU2VydmVyU29ja2V0XSByZXByZXNlbnRzIGEgbGlzdGVuaW5nIHNvY2tldCwgYW5kIHByb3ZpZGVzIGEKICogc3RyZWFtIG9mIFtTb2NrZXRdIG9iamVjdHMsIG9uZSBmb3IgZWFjaCBjb25uZWN0aW9uIG1hZGUgdG8gdGhlCiAqIGxpc3RlbmluZyBzb2NrZXQuCiAqCiAqIFNlZSBbU29ja2V0XSBmb3IgbW9yZSBpbmZvLgogKi8KYWJzdHJhY3QgY2xhc3MgU2VydmVyU29ja2V0IGltcGxlbWVudHMgU3RyZWFtPFNvY2tldD4gewogIC8qKgogICAqIFJldHVybnMgYSBmdXR1cmUgZm9yIGEgWzpTZXJ2ZXJTb2NrZXQ6XS4gV2hlbiB0aGUgZnV0dXJlCiAgICogY29tcGxldGVzIHRoZSBzZXJ2ZXIgc29ja2V0IGlzIGJvdW5kIHRvIHRoZSBnaXZlbiBbYWRkcmVzc10gYW5kCiAgICogW3BvcnRdIGFuZCBoYXMgc3RhcnRlZCBsaXN0ZW5pbmcgb24gaXQuCiAgICoKICAgKiBUaGUgW2FkZHJlc3NdIGNhbiBlaXRoZXIgYmUgYSBbU3RyaW5nXSBvciBhbgogICAqIFtJbnRlcm5ldEFkZHJlc3NdLiBJZiBbYWRkcmVzc10gaXMgYSBbU3RyaW5nXSwgW2JpbmRdIHdpbGwKICAgKiBwZXJmb3JtIGEgW0ludGVybmV0QWRkcmVzcy5sb29rdXBdIGFuZCB1c2UgdGhlIGZpcnN0IHZhbHVlIGluIHRoZQogICAqIGxpc3QuIFRvIGxpc3RlbiBvbiB0aGUgbG9vcGJhY2sgYWRhcHRlciwgd2hpY2ggd2lsbCBhbGxvdyBvbmx5CiAgICogaW5jb21pbmcgY29ubmVjdGlvbnMgZnJvbSB0aGUgbG9jYWwgaG9zdCwgdXNlIHRoZSB2YWx1ZQogICAqIFtJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY0XSBvcgogICAqIFtJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY2XS4gVG8gYWxsb3cgZm9yIGluY29taW5nCiAgICogY29ubmVjdGlvbiBmcm9tIHRoZSBuZXR3b3JrIHVzZSBlaXRoZXIgb25lIG9mIHRoZSB2YWx1ZXMKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmFueUlQdjRdIG9yIFtJbnRlcm5ldEFkZHJlc3MuYW55SVB2Nl0gdG8KICAgKiBiaW5kIHRvIGFsbCBpbnRlcmZhY2VzIG9yIHRoZSBJUCBhZGRyZXNzIG9mIGEgc3BlY2lmaWMgaW50ZXJmYWNlLgogICAqCiAgICogSWYgYW4gSVAgdmVyc2lvbiA2IChJUHY2KSBhZGRyZXNzIGlzIHVzZWQsIGJvdGggSVAgdmVyc2lvbiA2CiAgICogKElQdjYpIGFuZCB2ZXJzaW9uIDQgKElQdjQpIGNvbm5lY3Rpb25zIHdpbGwgYmUgYWNjZXB0ZWQuIFRvCiAgICogcmVzdHJpY3QgdGhpcyB0byB2ZXJzaW9uIDYgKElQdjYpIG9ubHksIHVzZSBbdjZPbmx5XSB0byBzZXQKICAgKiB2ZXJzaW9uIDYgb25seS4KICAgKgogICAqIElmIFtwb3J0XSBoYXMgdGhlIHZhbHVlIFs6MDpdIGFuIGVwaGVtZXJhbCBwb3J0IHdpbGwgYmUgY2hvc2VuIGJ5CiAgICogdGhlIHN5c3RlbS4gVGhlIGFjdHVhbCBwb3J0IHVzZWQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUKICAgKiBbcG9ydF0gZ2V0dGVyLgogICAqCiAgICogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFtiYWNrbG9nXSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsaXN0ZW4KICAgKiBiYWNrbG9nIGZvciB0aGUgdW5kZXJseWluZyBPUyBsaXN0ZW4gc2V0dXAuIElmIFtiYWNrbG9nXSBoYXMgdGhlCiAgICogdmFsdWUgb2YgWzowOl0gKHRoZSBkZWZhdWx0KSBhIHJlYXNvbmFibGUgdmFsdWUgd2lsbCBiZSBjaG9zZW4gYnkKICAgKiB0aGUgc3lzdGVtLgogICAqCiAgICogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFtzaGFyZWRdIHNwZWNpZmllcyB3aGV0aGVyIGFkZGl0aW9uYWwgU2VydmVyU29ja2V0CiAgICogb2JqZWN0cyBjYW4gYmluZCB0byB0aGUgc2FtZSBjb21iaW5hdGlvbiBvZiBgYWRkcmVzc2AsIGBwb3J0YCBhbmQgYHY2T25seWAuCiAgICogSWYgYHNoYXJlZGAgaXMgYHRydWVgIGFuZCBtb3JlIGBTZXJ2ZXJTb2NrZXRgcyBmcm9tIHRoaXMgaXNvbGF0ZSBvciBvdGhlcgogICAqIGlzb2xhdGVzIGFyZSBib3VuZCB0byB0aGUgcG9ydCwgdGhlbiB0aGUgaW5jb21pbmcgY29ubmVjdGlvbnMgd2lsbCBiZQogICAqIGRpc3RyaWJ1dGVkIGFtb25nIGFsbCB0aGUgYm91bmQgYFNlcnZlclNvY2tldGBzLiBDb25uZWN0aW9ucyBjYW4gYmUKICAgKiBkaXN0cmlidXRlZCBvdmVyIG11bHRpcGxlIGlzb2xhdGVzIHRoaXMgd2F5LgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8U2VydmVyU29ja2V0PiBiaW5kKGFkZHJlc3MsIGludCBwb3J0LAogICAgICB7aW50IGJhY2tsb2c6IDAsIGJvb2wgdjZPbmx5OiBmYWxzZSwgYm9vbCBzaGFyZWQ6IGZhbHNlfSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHBvcnQgdXNlZCBieSB0aGlzIHNvY2tldC4KICAgKi8KICBpbnQgZ2V0IHBvcnQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGFkZHJlc3MgdXNlZCBieSB0aGlzIHNvY2tldC4KICAgKi8KICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3M7CgogIC8qKgogICAqIENsb3NlcyB0aGUgc29ja2V0LiBUaGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcyB3aGVuIHRoZSBzb2NrZXQKICAgKiBpcyBmdWxseSBjbG9zZWQgYW5kIGlzIG5vIGxvbmdlciBib3VuZC4KICAgKi8KICBGdXR1cmU8U2VydmVyU29ja2V0PiBjbG9zZSgpOwp9CgovKioKICogVGhlIFtTb2NrZXREaXJlY3Rpb25dIGlzIHVzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gW1NvY2tldC5jbG9zZV0gYW5kCiAqIFtSYXdTb2NrZXQuY2xvc2VdIHRvIGNsb3NlIGEgc29ja2V0IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0aW9uKHMpLgogKi8KY2xhc3MgU29ja2V0RGlyZWN0aW9uIHsKICBzdGF0aWMgY29uc3QgU29ja2V0RGlyZWN0aW9uIHJlY2VpdmUgPSBjb25zdCBTb2NrZXREaXJlY3Rpb24uXygwKTsKICBzdGF0aWMgY29uc3QgU29ja2V0RGlyZWN0aW9uIHNlbmQgPSBjb25zdCBTb2NrZXREaXJlY3Rpb24uXygxKTsKICBzdGF0aWMgY29uc3QgU29ja2V0RGlyZWN0aW9uIGJvdGggPSBjb25zdCBTb2NrZXREaXJlY3Rpb24uXygyKTsKCiAgQERlcHJlY2F0ZWQoIlVzZSByZWNlaXZlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBTb2NrZXREaXJlY3Rpb24gUkVDRUlWRSA9IHJlY2VpdmU7CiAgQERlcHJlY2F0ZWQoIlVzZSBzZW5kIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBTb2NrZXREaXJlY3Rpb24gU0VORCA9IHNlbmQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBib3RoIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBTb2NrZXREaXJlY3Rpb24gQk9USCA9IGJvdGg7CgogIGZpbmFsIF92YWx1ZTsKCiAgY29uc3QgU29ja2V0RGlyZWN0aW9uLl8odGhpcy5fdmFsdWUpOwp9CgovKioKICogVGhlIFtTb2NrZXRPcHRpb25dIGlzIHVzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gW1NvY2tldC5zZXRPcHRpb25dIGFuZAogKiBbUmF3U29ja2V0LnNldE9wdGlvbl0gdG8gc2V0IGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3VyIG9mIHRoZSB1bmRlcmx5aW5nCiAqIHNvY2tldC4KICovCmNsYXNzIFNvY2tldE9wdGlvbiB7CiAgLyoqCiAgICogRW5hYmxlIG9yIGRpc2FibGUgbm8tZGVsYXkgb24gdGhlIHNvY2tldC4gSWYgdGNwTm9EZWxheSBpcyBlbmFibGVkLCB0aGUKICAgKiBzb2NrZXQgd2lsbCBub3QgYnVmZmVyIGRhdGEgaW50ZXJuYWxseSwgYnV0IGluc3RlYWQgd3JpdGUgZWFjaCBkYXRhIGNodW5rCiAgICogYXMgYW4gaW5kaXZpZHVhbCBUQ1AgcGFja2V0LgogICAqCiAgICogdGNwTm9EZWxheSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgogICAqLwogIHN0YXRpYyBjb25zdCBTb2NrZXRPcHRpb24gdGNwTm9EZWxheSA9IGNvbnN0IFNvY2tldE9wdGlvbi5fKDApOwogIEBEZXByZWNhdGVkKCJVc2UgdGNwTm9EZWxheSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgU29ja2V0T3B0aW9uIFRDUF9OT0RFTEFZID0gdGNwTm9EZWxheTsKCiAgc3RhdGljIGNvbnN0IFNvY2tldE9wdGlvbiBfaXBNdWx0aWNhc3RMb29wID0gY29uc3QgU29ja2V0T3B0aW9uLl8oMSk7CiAgc3RhdGljIGNvbnN0IFNvY2tldE9wdGlvbiBfaXBNdWx0aWNhc3RIb3BzID0gY29uc3QgU29ja2V0T3B0aW9uLl8oMik7CiAgc3RhdGljIGNvbnN0IFNvY2tldE9wdGlvbiBfaXBNdWx0aWNhc3RJZiA9IGNvbnN0IFNvY2tldE9wdGlvbi5fKDMpOwogIHN0YXRpYyBjb25zdCBTb2NrZXRPcHRpb24gX2lwQnJvYWRjYXN0ID0gY29uc3QgU29ja2V0T3B0aW9uLl8oNCk7CgogIGZpbmFsIF92YWx1ZTsKCiAgY29uc3QgU29ja2V0T3B0aW9uLl8odGhpcy5fdmFsdWUpOwp9CgovLyBNdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIGVudW0gaW4gc29ja2V0LmNjCmVudW0gX1Jhd1NvY2tldE9wdGlvbnMgewogIFNPTF9TT0NLRVQsIC8vIDAKICBJUFBST1RPX0lQLCAvLyAxCiAgSVBfTVVMVElDQVNUX0lGLCAvLyAyCiAgSVBQUk9UT19JUFY2LCAvLyAzCiAgSVBWNl9NVUxUSUNBU1RfSUYsIC8vIDQKICBJUFBST1RPX1RDUCwgLy8gNQogIElQUFJPVE9fVURQLCAvLyA2Cn0KCi8vLyBUaGUgW1Jhd1NvY2tldE9wdGlvbl0gaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB0byBbU29ja2V0LnNldFJhd09wdGlvbl0gYW5kCi8vLyBbUmF3U29ja2V0LnNldFJhd09wdGlvbl0gdG8gc2V0IGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3VyIG9mIHRoZSB1bmRlcmx5aW5nCi8vLyBzb2NrZXQuCi8vLwovLy8gSXQgYWxsb3dzIGZvciBmaW5lIGdyYWluZWQgY29udHJvbCBvZiB0aGUgc29ja2V0IG9wdGlvbnMsIGFuZCBpdHMgdmFsdWVzIHdpbGwKLy8vIGJlIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybSdzIGltcGxlbWVudGF0aW9uIG9mIHNldHNvY2tvcHQgYW5kCi8vLyBnZXRzb2Nrb3B0LgpAU2luY2UoIjIuMiIpCmNsYXNzIFJhd1NvY2tldE9wdGlvbiB7CiAgLy8vIENyZWF0ZXMgYSBSYXdTb2NrZXRPcHRpb24gZm9yIGdldFJhd09wdGlvbiBhbmRTZXRSYXdPcHRpb24uCiAgLy8vCiAgLy8vIEFsbCBhcmd1bWVudHMgYXJlIHJlcXVpcmVkIGFuZCBtdXN0IG5vdCBiZSBudWxsLgogIC8vLwogIC8vLyBUaGUgbGV2ZWwgYW5kIG9wdGlvbiBhcmd1bWVudHMgY29ycmVzcG9uZCB0byBsZXZlbCBhbmQgb3B0bmFtZSBhcmd1bWVudHMKICAvLy8gb24gdGhlIGdldC9zZXRzb2Nrb3B0IG5hdGl2ZSBjYWxscy4KICAvLy8KICAvLy8gVGhlIHZhbHVlIGFyZ3VtZW50IGFuZCBpdHMgbGVuZ3RoIGNvcnJlc3BvbmQgdG8gdGhlIG9wdHZhbCBhbmQgbGVuZ3RoCiAgLy8vIGFyZ3VtZW50cyBvbiB0aGUgbmF0aXZlIGNhbGwuCiAgLy8vCiAgLy8vIEZvciBhIFtnZXRSYXdPcHRpb25dIGNhbGwsIHRoZSB2YWx1ZSBwYXJhbWV0ZXIgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGEKICAvLy8gc3VjY2Vzc2Z1bCBjYWxsIChhbHRob3VnaCBpdHMgbGVuZ3RoIHdpbGwgbm90IGJlIGNoYW5nZWQpLgogIC8vLwogIC8vLyBGb3IgYSBbc2V0UmF3T3B0aW9uXSBjYWxsLCB0aGUgdmFsdWUgcGFyYW1ldGVyIHdpbGwgYmUgdXNlZCBzZXQgdGhlCiAgLy8vIG9wdGlvbi4KICBjb25zdCBSYXdTb2NrZXRPcHRpb24odGhpcy5sZXZlbCwgdGhpcy5vcHRpb24sIHRoaXMudmFsdWUpOwoKICAvLy8gQ29udmVuaWVuY2UgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGFuIGludCBiYXNlZCBSYXdTb2NrZXRPcHRpb24uCiAgZmFjdG9yeSBSYXdTb2NrZXRPcHRpb24uZnJvbUludChpbnQgbGV2ZWwsIGludCBvcHRpb24sIGludCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgdmFsdWUgPSAwOwogICAgfQogICAgZmluYWwgVWludDhMaXN0IGxpc3QgPSBVaW50OExpc3QoNCk7CiAgICBmaW5hbCBidWZmZXIgPSBCeXRlRGF0YS52aWV3KGxpc3QuYnVmZmVyKTsKICAgIGJ1ZmZlci5zZXRJbnQzMigwLCB2YWx1ZSk7CiAgICByZXR1cm4gUmF3U29ja2V0T3B0aW9uKGxldmVsLCBvcHRpb24sIGxpc3QpOwogIH0KCiAgLy8vIENvbnZlbmllbmNlIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBhIGJvb2wgYmFzZWQgUmF3U29ja2V0T3B0aW9uLgogIGZhY3RvcnkgUmF3U29ja2V0T3B0aW9uLmZyb21Cb29sKGludCBsZXZlbCwgaW50IG9wdGlvbiwgYm9vbCB2YWx1ZSkgPT4KICAgICAgUmF3U29ja2V0T3B0aW9uLmZyb21JbnQobGV2ZWwsIG9wdGlvbiwgdmFsdWUgPT0gdHJ1ZSA/IDEgOiAwKTsKCiAgLy8vIFRoZSBsZXZlbCBmb3IgdGhlIG9wdGlvbiB0byBzZXQgb3IgZ2V0LgogIC8vLwogIC8vLyBTZWUgYWxzbzoKICAvLy8gICAqIFtSYXdTb2NrZXRPcHRpb24ubGV2ZWxTb2NrZXRdCiAgLy8vICAgKiBbUmF3U29ja2V0T3B0aW9uLmxldmVsSVB2NF0KICAvLy8gICAqIFtSYXdTb2NrZXRPcHRpb24ubGV2ZWxJUHY2XQogIC8vLyAgICogW1Jhd1NvY2tldE9wdGlvbi5sZXZlbFRjcF0KICAvLy8gICAqIFtSYXdTb2NrZXRPcHRpb24ubGV2ZWxVZHBdCiAgZmluYWwgaW50IGxldmVsOwoKICAvLy8gVGhlIG9wdGlvbiB0byBzZXQgb3IgZ2V0LgogIGZpbmFsIGludCBvcHRpb247CgogIC8vLyBUaGUgcmF3IGRhdGEgdG8gc2V0LCBvciB0aGUgYXJyYXkgdG8gd3JpdGUgdGhlIGN1cnJlbnQgb3B0aW9uIHZhbHVlIGludG8uCiAgLy8vCiAgLy8vIFRoaXMgbGlzdCBtdXN0IGJlIHRoZSBjb3JyZWN0IGxlbmd0aCBmb3IgdGhlIGV4cGVjdGVkIG9wdGlvbi4gRm9yIG1vc3QKICAvLy8gb3B0aW9ucyB0aGF0IHRha2UgaW50IG9yIGJvb2wgdmFsdWVzLCB0aGUgbGVuZ3RoIHNob3VsZCBiZSA0LiBGb3Igb3B0aW9ucwogIC8vLyB0aGF0IGV4cGVjdCBhIHN0cnVjdCAoc3VjaCBhcyBhbiBpbl9hZGRyX3QpLCB0aGUgbGVuZ3RoIHNob3VsZCBiZSB0aGUKICAvLy8gY29ycmVjdCBsZW5ndGggZm9yIHRoYXQgc3RydWN0LgogIGZpbmFsIFVpbnQ4TGlzdCB2YWx1ZTsKCiAgLy8vIFNvY2tldCBsZXZlbCBvcHRpb24gZm9yIFNPTF9TT0NLRVQuCiAgc3RhdGljIGludCBnZXQgbGV2ZWxTb2NrZXQgPT4KICAgICAgX2dldE9wdGlvblZhbHVlKF9SYXdTb2NrZXRPcHRpb25zLlNPTF9TT0NLRVQuaW5kZXgpOwoKICAvLy8gU29ja2V0IGxldmVsIG9wdGlvbiBmb3IgSVBQUk9UT19JUC4KICBzdGF0aWMgaW50IGdldCBsZXZlbElQdjQgPT4KICAgICAgX2dldE9wdGlvblZhbHVlKF9SYXdTb2NrZXRPcHRpb25zLklQUFJPVE9fSVAuaW5kZXgpOwoKICAvLy8gU29ja2V0IG9wdGlvbiBmb3IgSVBfTVVMVElDQVNUX0lGLgogIHN0YXRpYyBpbnQgZ2V0IElQdjRNdWx0aWNhc3RJbnRlcmZhY2UgPT4KICAgICAgX2dldE9wdGlvblZhbHVlKF9SYXdTb2NrZXRPcHRpb25zLklQX01VTFRJQ0FTVF9JRi5pbmRleCk7CgogIC8vLyBTb2NrZXQgbGV2ZWwgb3B0aW9uIGZvciBJUFBST1RPX0lQVjYuCiAgc3RhdGljIGludCBnZXQgbGV2ZWxJUHY2ID0+CiAgICAgIF9nZXRPcHRpb25WYWx1ZShfUmF3U29ja2V0T3B0aW9ucy5JUFBST1RPX0lQVjYuaW5kZXgpOwoKICAvLy8gU29ja2V0IG9wdGlvbiBmb3IgSVBWNl9NVUxUSUNBU1RfSUYuCiAgc3RhdGljIGludCBnZXQgSVB2Nk11bHRpY2FzdEludGVyZmFjZSA9PgogICAgICBfZ2V0T3B0aW9uVmFsdWUoX1Jhd1NvY2tldE9wdGlvbnMuSVBWNl9NVUxUSUNBU1RfSUYuaW5kZXgpOwoKICAvLy8gU29ja2V0IGxldmVsIG9wdGlvbiBmb3IgSVBQUk9UT19UQ1AuCiAgc3RhdGljIGludCBnZXQgbGV2ZWxUY3AgPT4KICAgICAgX2dldE9wdGlvblZhbHVlKF9SYXdTb2NrZXRPcHRpb25zLklQUFJPVE9fVENQLmluZGV4KTsKCiAgLy8vIFNvY2tldCBsZXZlbCBvcHRpb24gZm9yIElQUFJPVE9fVURQLgogIHN0YXRpYyBpbnQgZ2V0IGxldmVsVWRwID0+CiAgICAgIF9nZXRPcHRpb25WYWx1ZShfUmF3U29ja2V0T3B0aW9ucy5JUFBST1RPX1VEUC5pbmRleCk7CgogIGV4dGVybmFsIHN0YXRpYyBpbnQgX2dldE9wdGlvblZhbHVlKGludCBrZXkpOwp9CgovKioKICogRXZlbnRzIGZvciB0aGUgW1Jhd1NvY2tldF0uCiAqLwpjbGFzcyBSYXdTb2NrZXRFdmVudCB7CiAgc3RhdGljIGNvbnN0IFJhd1NvY2tldEV2ZW50IHJlYWQgPSBjb25zdCBSYXdTb2NrZXRFdmVudC5fKDApOwogIHN0YXRpYyBjb25zdCBSYXdTb2NrZXRFdmVudCB3cml0ZSA9IGNvbnN0IFJhd1NvY2tldEV2ZW50Ll8oMSk7CiAgc3RhdGljIGNvbnN0IFJhd1NvY2tldEV2ZW50IHJlYWRDbG9zZWQgPSBjb25zdCBSYXdTb2NrZXRFdmVudC5fKDIpOwogIHN0YXRpYyBjb25zdCBSYXdTb2NrZXRFdmVudCBjbG9zZWQgPSBjb25zdCBSYXdTb2NrZXRFdmVudC5fKDMpOwoKICBARGVwcmVjYXRlZCgiVXNlIHJlYWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFJhd1NvY2tldEV2ZW50IFJFQUQgPSByZWFkOwogIEBEZXByZWNhdGVkKCJVc2Ugd3JpdGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFJhd1NvY2tldEV2ZW50IFdSSVRFID0gd3JpdGU7CiAgQERlcHJlY2F0ZWQoIlVzZSByZWFkQ2xvc2VkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBSYXdTb2NrZXRFdmVudCBSRUFEX0NMT1NFRCA9IHJlYWRDbG9zZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBjbG9zZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFJhd1NvY2tldEV2ZW50IENMT1NFRCA9IGNsb3NlZDsKCiAgZmluYWwgaW50IF92YWx1ZTsKCiAgY29uc3QgUmF3U29ja2V0RXZlbnQuXyh0aGlzLl92YWx1ZSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIGNvbnN0IFsKICAgICAgJ1Jhd1NvY2tldEV2ZW50LnJlYWQnLAogICAgICAnUmF3U29ja2V0RXZlbnQud3JpdGUnLAogICAgICAnUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZCcsCiAgICAgICdSYXdTb2NrZXRFdmVudC5jbG9zZWQnCiAgICBdW192YWx1ZV07CiAgfQp9CgovLy8gUmV0dXJuZWQgYnkgdGhlIGBzdGFydENvbm5lY3RgIG1ldGhvZHMgb24gY2xpZW50LXNpZGUgc29ja2V0IHR5cGVzIGBTYCwKLy8vIGBDb25uZWN0aW9uVGFzazxTPmAgYWxsb3dzIGNhbmNlbGxpbmcgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHRvIGEgaG9zdC4KY2xhc3MgQ29ubmVjdGlvblRhc2s8Uz4gewogIC8vLyBBIGBGdXR1cmVgIHRoYXQgY29tcGxldGVzIHdpdGggdmFsdWUgdGhhdCBgUy5jb25uZWN0KClgIHdvdWxkIHJldHVybgogIC8vLyB1bmxlc3MgW2NhbmNlbF0gaXMgY2FsbGVkIG9uIHRoaXMgW0Nvbm5lY3Rpb25UYXNrXS4KICAvLy8KICAvLy8gSWYgW2NhbmNlbF0gaXMgY2FsbGVkLCB0aGUgYEZ1dHVyZWAgY29tcGxldGVzIHdpdGggYSBbU29ja2V0RXhjZXB0aW9uXQogIC8vLyBlcnJvciB3aG9zZSBtZXNzYWdlIGluZGljYXRlcyB0aGF0IHRoZSBjb25uZWN0aW9uIGF0dGVtcHQgd2FzIGNhbmNlbGxlZC4KICBmaW5hbCBGdXR1cmU8Uz4gc29ja2V0OwogIGZpbmFsIHZvaWQgRnVuY3Rpb24oKSBfb25DYW5jZWw7CgogIENvbm5lY3Rpb25UYXNrLl8oe0Z1dHVyZTxTPiBzb2NrZXQsIHZvaWQgRnVuY3Rpb24oKSBvbkNhbmNlbH0pCiAgICAgIDogYXNzZXJ0KHNvY2tldCAhPSBudWxsKSwKICAgICAgICBhc3NlcnQob25DYW5jZWwgIT0gbnVsbCksCiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQsCiAgICAgICAgdGhpcy5fb25DYW5jZWwgPSBvbkNhbmNlbDsKCiAgLy8vIENhbmNlbHMgdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdC4KICAvLy8KICAvLy8gVGhpcyBhbHNvIGNhdXNlcyB0aGUgW3NvY2tldF0gYEZ1dHVyZWAgdG8gY29tcGxldGUgd2l0aCBhCiAgLy8vIFtTb2NrZXRFeGNlcHRpb25dIGVycm9yLgogIHZvaWQgY2FuY2VsKCkgewogICAgX29uQ2FuY2VsKCk7CiAgfQp9CgovKioKICogQSBbUmF3U29ja2V0XSBpcyBhbiB1bmJ1ZmZlcmVkIGludGVyZmFjZSB0byBhIFRDUCBzb2NrZXQuCiAqCiAqIFRoZSByYXcgc29ja2V0IGRlbGl2ZXJzIHRoZSBkYXRhIHN0cmVhbSBpbiB0aGUgc2FtZSBjaHVua3MgYXMgdGhlIHVuZGVybHlpbmcKICogb3BlcmF0aW5nIHN5c3RlbS4KICoKICogSXQgaXMgbm90IHRoZSBzYW1lIGFzIGEKICogW1BPU0lYIHJhdyBzb2NrZXRdKGh0dHA6Ly9tYW43Lm9yZy9saW51eC9tYW4tcGFnZXMvbWFuNy9yYXcuNy5odG1sKS4KICovCmFic3RyYWN0IGNsYXNzIFJhd1NvY2tldCBpbXBsZW1lbnRzIFN0cmVhbTxSYXdTb2NrZXRFdmVudD4gewogIC8qKgogICAqIFNldCBvciBnZXQsIGlmIHRoZSBbUmF3U29ja2V0XSBzaG91bGQgbGlzdGVuIGZvciBbUmF3U29ja2V0RXZlbnQucmVhZF0KICAgKiBldmVudHMuIERlZmF1bHQgaXMgWzp0cnVlOl0uCiAgICovCiAgYm9vbCByZWFkRXZlbnRzRW5hYmxlZDsKCiAgLyoqCiAgICogU2V0IG9yIGdldCwgaWYgdGhlIFtSYXdTb2NrZXRdIHNob3VsZCBsaXN0ZW4gZm9yIFtSYXdTb2NrZXRFdmVudC53cml0ZV0KICAgKiBldmVudHMuIERlZmF1bHQgaXMgWzp0cnVlOl0uCiAgICogVGhpcyBpcyBhIG9uZS1zaG90IGxpc3RlbmVyLCBhbmQgd3JpdGVFdmVudHNFbmFibGVkIG11c3QgYmUgc2V0CiAgICogdG8gdHJ1ZSBhZ2FpbiB0byByZWNlaXZlIGFub3RoZXIgd3JpdGUgZXZlbnQuCiAgICovCiAgYm9vbCB3cml0ZUV2ZW50c0VuYWJsZWQ7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgc29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIGhvc3QgYW5kIHBvcnQgYW5kIHJldHVybnMgYSBbRnV0dXJlXQogICAqIHRoYXQgd2lsbCBjb21wbGV0ZSB3aXRoIGVpdGhlciBhIFtSYXdTb2NrZXRdIG9uY2UgY29ubmVjdGVkIG9yIGFuIGVycm9yCiAgICogaWYgdGhlIGhvc3QtbG9va3VwIG9yIGNvbm5lY3Rpb24gZmFpbGVkLgogICAqCiAgICogW2hvc3RdIGNhbiBlaXRoZXIgYmUgYSBbU3RyaW5nXSBvciBhbiBbSW50ZXJuZXRBZGRyZXNzXS4gSWYgW2hvc3RdIGlzIGEKICAgKiBbU3RyaW5nXSwgW2Nvbm5lY3RdIHdpbGwgcGVyZm9ybSBhIFtJbnRlcm5ldEFkZHJlc3MubG9va3VwXSBhbmQgdHJ5CiAgICogYWxsIHJldHVybmVkIFtJbnRlcm5ldEFkZHJlc3NdZXMsIHVudGlsIGNvbm5lY3RlZC4gVW5sZXNzIGEKICAgKiBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCwgdGhlIGVycm9yIGZyb20gdGhlIGZpcnN0IGZhaWxpbmcgY29ubmVjdGlvbiBpcwogICAqIHJldHVybmVkLgogICAqCiAgICogVGhlIGFyZ3VtZW50IFtzb3VyY2VBZGRyZXNzXSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhbAogICAqIGFkZHJlc3MgdG8gYmluZCB3aGVuIG1ha2luZyB0aGUgY29ubmVjdGlvbi4gYHNvdXJjZUFkZHJlc3NgIGNhbiBlaXRoZXIKICAgKiBiZSBhIGBTdHJpbmdgIG9yIGFuIGBJbnRlcm5ldEFkZHJlc3NgLiBJZiBhIGBTdHJpbmdgIGlzIHBhc3NlZCBpdCBtdXN0CiAgICogaG9sZCBhIG51bWVyaWMgSVAgYWRkcmVzcy4KICAgKgogICAqIFRoZSBhcmd1bWVudCBbdGltZW91dF0gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFsbG93ZWQgdGltZSB0byB3YWl0CiAgICogZm9yIGEgY29ubmVjdGlvbiB0byBiZSBlc3RhYmxpc2hlZC4gSWYgW3RpbWVvdXRdIGlzIGxvbmdlciB0aGFuIHRoZSBzeXN0ZW0KICAgKiBsZXZlbCB0aW1lb3V0IGR1cmF0aW9uLCBhIHRpbWVvdXQgbWF5IG9jY3VyIHNvb25lciB0aGFuIHNwZWNpZmllZCBpbgogICAqIFt0aW1lb3V0XS4gT24gdGltZW91dCwgYSBbU29ja2V0RXhjZXB0aW9uXSBpcyB0aHJvd24gYW5kIGFsbCBvbmdvaW5nCiAgICogY29ubmVjdGlvbiBhdHRlbXB0cyB0byBbaG9zdF0gYXJlIGNhbmNlbGxlZC4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPFJhd1NvY2tldD4gY29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3MsIER1cmF0aW9uIHRpbWVvdXR9KTsKCiAgLy8vIExpa2UgW2Nvbm5lY3RdLCBidXQgcmV0dXJucyBhIFtGdXR1cmVdIHRoYXQgY29tcGxldGVzIHdpdGggYQogIC8vLyBbQ29ubmVjdGlvblRhc2tdIHRoYXQgY2FuIGJlIGNhbmNlbGxlZCBpZiB0aGUgW1Jhd1NvY2tldF0gaXMgbm8KICAvLy8gbG9uZ2VyIG5lZWRlZC4KICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPENvbm5lY3Rpb25UYXNrPFJhd1NvY2tldD4+IHN0YXJ0Q29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3N9KTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGFuZCBub24tcmVhZCBieXRlcyBpbiB0aGUgc29ja2V0IHRoYXQKICAgKiBjYW4gYmUgcmVhZC4KICAgKi8KICBpbnQgYXZhaWxhYmxlKCk7CgogIC8qKgogICAqIFJlYWQgdXAgdG8gW2xlbl0gYnl0ZXMgZnJvbSB0aGUgc29ja2V0LiBUaGlzIGZ1bmN0aW9uIGlzCiAgICogbm9uLWJsb2NraW5nIGFuZCB3aWxsIG9ubHkgcmV0dXJuIGRhdGEgaWYgZGF0YSBpcyBhdmFpbGFibGUuIFRoZQogICAqIG51bWJlciBvZiBieXRlcyByZWFkIGNhbiBiZSBsZXNzIHRoZW4gW2xlbl0gaWYgZmV3ZXIgYnl0ZXMgYXJlCiAgICogYXZhaWxhYmxlIGZvciBpbW1lZGlhdGUgcmVhZGluZy4gSWYgbm8gZGF0YSBpcyBhdmFpbGFibGUgWzpudWxsOl0KICAgKiBpcyByZXR1cm5lZC4KICAgKi8KICBVaW50OExpc3QgcmVhZChbaW50IGxlbl0pOwoKICAvKioKICAgKiBXcml0ZXMgdXAgdG8gW2NvdW50XSBieXRlcyBvZiB0aGUgYnVmZmVyIGZyb20gW29mZnNldF0gYnVmZmVyIG9mZnNldCB0bwogICAqIHRoZSBzb2NrZXQuIFRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gYnl0ZXMgaXMgcmV0dXJuZWQuIFRoaXMKICAgKiBmdW5jdGlvbiBpcyBub24tYmxvY2tpbmcgYW5kIHdpbGwgb25seSB3cml0ZSBkYXRhIGlmIGJ1ZmZlciBzcGFjZSBpcwogICAqIGF2YWlsYWJsZSBpbiB0aGUgc29ja2V0LgogICAqCiAgICogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIFtvZmZzZXRdIGlzIDAsIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgW2NvdW50XSBpcwogICAqIFs6YnVmZmVyLmxlbmd0aCAtIG9mZnNldDpdLgogICAqLwogIGludCB3cml0ZShMaXN0PGludD4gYnVmZmVyLCBbaW50IG9mZnNldCwgaW50IGNvdW50XSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHBvcnQgdXNlZCBieSB0aGlzIHNvY2tldC4KICAgKi8KICBpbnQgZ2V0IHBvcnQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHJlbW90ZSBwb3J0IGNvbm5lY3RlZCB0byBieSB0aGlzIHNvY2tldC4KICAgKi8KICBpbnQgZ2V0IHJlbW90ZVBvcnQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIFtJbnRlcm5ldEFkZHJlc3NdIHVzZWQgdG8gY29ubmVjdCB0aGlzIHNvY2tldC4KICAgKi8KICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3M7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHJlbW90ZSBbSW50ZXJuZXRBZGRyZXNzXSBjb25uZWN0ZWQgdG8gYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgSW50ZXJuZXRBZGRyZXNzIGdldCByZW1vdGVBZGRyZXNzOwoKICAvKioKICAgKiBDbG9zZXMgdGhlIHNvY2tldC4gUmV0dXJucyBhIEZ1dHVyZSB0aGF0IGNvbXBsZXRlcyB3aXRoIFt0aGlzXSB3aGVuIHRoZQogICAqIHVuZGVybHlpbmcgY29ubmVjdGlvbiBpcyBjb21wbGV0ZWx5IGRlc3Ryb3llZC4KICAgKgogICAqIENhbGxpbmcgW2Nsb3NlXSB3aWxsIG5ldmVyIHRocm93IGFuIGV4Y2VwdGlvbgogICAqIGFuZCBjYWxsaW5nIGl0IHNldmVyYWwgdGltZXMgaXMgc3VwcG9ydGVkLiBDYWxsaW5nIFtjbG9zZV0gY2FuIHJlc3VsdCBpbgogICAqIGEgW1Jhd1NvY2tldEV2ZW50LnJlYWRDbG9zZWRdIGV2ZW50LgogICAqLwogIEZ1dHVyZTxSYXdTb2NrZXQ+IGNsb3NlKCk7CgogIC8qKgogICAqIFNodXRkb3duIHRoZSBzb2NrZXQgaW4gdGhlIFtkaXJlY3Rpb25dLiBDYWxsaW5nIFtzaHV0ZG93bl0gd2lsbCBuZXZlcgogICAqIHRocm93IGFuIGV4Y2VwdGlvbiBhbmQgY2FsbGluZyBpdCBzZXZlcmFsIHRpbWVzIGlzIHN1cHBvcnRlZC4gQ2FsbGluZwogICAqIHNodXRkb3duIHdpdGggZWl0aGVyIFtTb2NrZXREaXJlY3Rpb24uYm90aF0gb3IgW1NvY2tldERpcmVjdGlvbi5yZWNlaXZlXQogICAqIGNhbiByZXN1bHQgaW4gYSBbUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZF0gZXZlbnQuCiAgICovCiAgdm9pZCBzaHV0ZG93bihTb2NrZXREaXJlY3Rpb24gZGlyZWN0aW9uKTsKCiAgLyoqCiAgICogVXNlIFtzZXRPcHRpb25dIHRvIGN1c3RvbWl6ZSB0aGUgW1Jhd1NvY2tldF0uIFNlZSBbU29ja2V0T3B0aW9uXSBmb3IKICAgKiBhdmFpbGFibGUgb3B0aW9ucy4KICAgKgogICAqIFJldHVybnMgWzp0cnVlOl0gaWYgdGhlIG9wdGlvbiB3YXMgc2V0IHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAqLwogIGJvb2wgc2V0T3B0aW9uKFNvY2tldE9wdGlvbiBvcHRpb24sIGJvb2wgZW5hYmxlZCk7CgogIC8qKgogICAqIFVzZSBbZ2V0UmF3T3B0aW9uXSB0byBnZXQgbG93IGxldmVsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBbUmF3U29ja2V0XS4gU2VlCiAgICogW1Jhd1NvY2tldE9wdGlvbl0gZm9yIGF2YWlsYWJsZSBvcHRpb25zLgogICAqCiAgICogUmV0dXJucyB0aGUgW1Jhd1NvY2tldE9wdGlvbi52YWx1ZV0gb24gc3VjY2Vzcy4KICAgKgogICAqIFRocm93cyBhbiBbT1NFcnJvcl0gb24gZmFpbHVyZS4KICAgKi8KICBAU2luY2UoIjIuMiIpCiAgVWludDhMaXN0IGdldFJhd09wdGlvbihSYXdTb2NrZXRPcHRpb24gb3B0aW9uKTsKCiAgLyoqCiAgICogVXNlIFtzZXRSYXdPcHRpb25dIHRvIGN1c3RvbWl6ZSB0aGUgW1Jhd1NvY2tldF0uIFNlZSBbUmF3U29ja2V0T3B0aW9uXSBmb3IKICAgKiBhdmFpbGFibGUgb3B0aW9ucy4KICAgKgogICAqIFRocm93cyBhbiBbT1NFcnJvcl0gb24gZmFpbHVyZS4KICAgKi8KICBAU2luY2UoIjIuMiIpCiAgdm9pZCBzZXRSYXdPcHRpb24oUmF3U29ja2V0T3B0aW9uIG9wdGlvbik7Cn0KCi8qKgogKiBBIGhpZ2gtbGV2ZWwgY2xhc3MgZm9yIGNvbW11bmljYXRpbmcgb3ZlciBhIFRDUCBzb2NrZXQuCiAqCiAqIFRoZSBbU29ja2V0XSBleHBvc2VzIGJvdGggYSBbU3RyZWFtXSBhbmQgYSBbSU9TaW5rXSBpbnRlcmZhY2UsIG1ha2luZyBpdAogKiBpZGVhbCBmb3IgdXNpbmcgdG9nZXRoZXIgd2l0aCBvdGhlciBbU3RyZWFtXXMuCiAqLwphYnN0cmFjdCBjbGFzcyBTb2NrZXQgaW1wbGVtZW50cyBTdHJlYW08VWludDhMaXN0PiwgSU9TaW5rIHsKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBob3N0IGFuZCBwb3J0IGFuZCByZXR1cm5zIGEgW0Z1dHVyZV0KICAgKiB0aGF0IHdpbGwgY29tcGxldGUgd2l0aCBlaXRoZXIgYSBbU29ja2V0XSBvbmNlIGNvbm5lY3RlZCBvciBhbiBlcnJvcgogICAqIGlmIHRoZSBob3N0LWxvb2t1cCBvciBjb25uZWN0aW9uIGZhaWxlZC4KICAgKgogICAqIFtob3N0XSBjYW4gZWl0aGVyIGJlIGEgW1N0cmluZ10gb3IgYW4gW0ludGVybmV0QWRkcmVzc10uIElmIFtob3N0XSBpcyBhCiAgICogW1N0cmluZ10sIFtjb25uZWN0XSB3aWxsIHBlcmZvcm0gYSBbSW50ZXJuZXRBZGRyZXNzLmxvb2t1cF0gYW5kIHRyeQogICAqIGFsbCByZXR1cm5lZCBbSW50ZXJuZXRBZGRyZXNzXWVzLCB1bnRpbCBjb25uZWN0ZWQuIFVubGVzcyBhCiAgICogY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQsIHRoZSBlcnJvciBmcm9tIHRoZSBmaXJzdCBmYWlsaW5nIGNvbm5lY3Rpb24gaXMKICAgKiByZXR1cm5lZC4KICAgKgogICAqIFRoZSBhcmd1bWVudCBbc291cmNlQWRkcmVzc10gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYWwKICAgKiBhZGRyZXNzIHRvIGJpbmQgd2hlbiBtYWtpbmcgdGhlIGNvbm5lY3Rpb24uIGBzb3VyY2VBZGRyZXNzYCBjYW4gZWl0aGVyCiAgICogYmUgYSBgU3RyaW5nYCBvciBhbiBgSW50ZXJuZXRBZGRyZXNzYC4gSWYgYSBgU3RyaW5nYCBpcyBwYXNzZWQgaXQgbXVzdAogICAqIGhvbGQgYSBudW1lcmljIElQIGFkZHJlc3MuCiAgICoKICAgKiBUaGUgYXJndW1lbnQgW3RpbWVvdXRdIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBhbGxvd2VkIHRpbWUgdG8gd2FpdAogICAqIGZvciBhIGNvbm5lY3Rpb24gdG8gYmUgZXN0YWJsaXNoZWQuIElmIFt0aW1lb3V0XSBpcyBsb25nZXIgdGhhbiB0aGUgc3lzdGVtCiAgICogbGV2ZWwgdGltZW91dCBkdXJhdGlvbiwgYSB0aW1lb3V0IG1heSBvY2N1ciBzb29uZXIgdGhhbiBzcGVjaWZpZWQgaW4KICAgKiBbdGltZW91dF0uIE9uIHRpbWVvdXQsIGEgW1NvY2tldEV4Y2VwdGlvbl0gaXMgdGhyb3duIGFuZCBhbGwgb25nb2luZwogICAqIGNvbm5lY3Rpb24gYXR0ZW1wdHMgdG8gW2hvc3RdIGFyZSBjYW5jZWxsZWQuCiAgICovCiAgc3RhdGljIEZ1dHVyZTxTb2NrZXQ+IGNvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0fSkgewogICAgZmluYWwgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gSU9PdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gU29ja2V0Ll9jb25uZWN0KGhvc3QsIHBvcnQsCiAgICAgICAgICBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzLCB0aW1lb3V0OiB0aW1lb3V0KTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuc29ja2V0Q29ubmVjdChob3N0LCBwb3J0LAogICAgICAgIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MsIHRpbWVvdXQ6IHRpbWVvdXQpOwogIH0KCiAgLy8vIExpa2UgW2Nvbm5lY3RdLCBidXQgcmV0dXJucyBhIFtGdXR1cmVdIHRoYXQgY29tcGxldGVzIHdpdGggYQogIC8vLyBbQ29ubmVjdGlvblRhc2tdIHRoYXQgY2FuIGJlIGNhbmNlbGxlZCBpZiB0aGUgW1NvY2tldF0gaXMgbm8KICAvLy8gbG9uZ2VyIG5lZWRlZC4KICBzdGF0aWMgRnV0dXJlPENvbm5lY3Rpb25UYXNrPFNvY2tldD4+IHN0YXJ0Q29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3N9KSB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBTb2NrZXQuX3N0YXJ0Q29ubmVjdChob3N0LCBwb3J0LCBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzKTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuc29ja2V0U3RhcnRDb25uZWN0KGhvc3QsIHBvcnQsCiAgICAgICAgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcyk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPFNvY2tldD4gX2Nvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0fSk7CgogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8Q29ubmVjdGlvblRhc2s8U29ja2V0Pj4gX3N0YXJ0Q29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3N9KTsKCiAgLyoqCiAgICogRGVzdHJveSB0aGUgc29ja2V0IGluIGJvdGggZGlyZWN0aW9ucy4gQ2FsbGluZyBbZGVzdHJveV0gd2lsbCBtYWtlIHRoZQogICAqIHNlbmQgYSBjbG9zZSBldmVudCBvbiB0aGUgc3RyZWFtIGFuZCB3aWxsIG5vIGxvbmdlciByZWFjdCBvbiBkYXRhIGJlaW5nCiAgICogcGlwZWQgdG8gaXQuCiAgICoKICAgKiBDYWxsIFtjbG9zZV0oaW5oZXJpdGVkIGZyb20gW0lPU2lua10pIHRvIG9ubHkgY2xvc2UgdGhlIFtTb2NrZXRdCiAgICogZm9yIHNlbmRpbmcgZGF0YS4KICAgKi8KICB2b2lkIGRlc3Ryb3koKTsKCiAgLyoqCiAgICogVXNlIFtzZXRPcHRpb25dIHRvIGN1c3RvbWl6ZSB0aGUgW1Jhd1NvY2tldF0uIFNlZSBbU29ja2V0T3B0aW9uXSBmb3IKICAgKiBhdmFpbGFibGUgb3B0aW9ucy4KICAgKgogICAqIFJldHVybnMgWzp0cnVlOl0gaWYgdGhlIG9wdGlvbiB3YXMgc2V0IHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAqLwogIGJvb2wgc2V0T3B0aW9uKFNvY2tldE9wdGlvbiBvcHRpb24sIGJvb2wgZW5hYmxlZCk7CgogIC8qKgogICAqIFVzZSBbZ2V0UmF3T3B0aW9uXSB0byBnZXQgbG93IGxldmVsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBbUmF3U29ja2V0XS4gU2VlCiAgICogW1Jhd1NvY2tldE9wdGlvbl0gZm9yIGF2YWlsYWJsZSBvcHRpb25zLgogICAqCiAgICogUmV0dXJucyB0aGUgW1Jhd1NvY2tldE9wdGlvbi52YWx1ZV0gb24gc3VjY2Vzcy4KICAgKgogICAqIFRocm93cyBhbiBbT1NFcnJvcl0gb24gZmFpbHVyZS4KICAgKi8KICBVaW50OExpc3QgZ2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pOwoKICAvKioKICAgKiBVc2UgW3NldFJhd09wdGlvbl0gdG8gY3VzdG9taXplIHRoZSBbUmF3U29ja2V0XS4gU2VlIFtSYXdTb2NrZXRPcHRpb25dIGZvcgogICAqIGF2YWlsYWJsZSBvcHRpb25zLgogICAqCiAgICogVGhyb3dzIGFuIFtPU0Vycm9yXSBvbiBmYWlsdXJlLgogICAqLwogIHZvaWQgc2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwb3J0IHVzZWQgYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgaW50IGdldCBwb3J0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSByZW1vdGUgcG9ydCBjb25uZWN0ZWQgdG8gYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgaW50IGdldCByZW1vdGVQb3J0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBbSW50ZXJuZXRBZGRyZXNzXSB1c2VkIHRvIGNvbm5lY3QgdGhpcyBzb2NrZXQuCiAgICovCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSByZW1vdGUgW0ludGVybmV0QWRkcmVzc10gY29ubmVjdGVkIHRvIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIEludGVybmV0QWRkcmVzcyBnZXQgcmVtb3RlQWRkcmVzczsKCiAgRnV0dXJlIGNsb3NlKCk7CgogIEZ1dHVyZSBnZXQgZG9uZTsKfQoKLyoqCiAqIERhdGFncmFtIHBhY2thZ2UuIERhdGEgc2VudCB0byBhbmQgcmVjZWl2ZWQgZnJvbSBkYXRhZ3JhbSBzb2NrZXRzCiAqIGNvbnRhaW5zIHRoZSBpbnRlcm5ldCBhZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSBkZXN0aW5hdGlvbiBvciBzb3VyY2UKICogdG9nZXRlciB3aXRoIHRoZSBkYXRhLgogKi8KY2xhc3MgRGF0YWdyYW0gewogIFVpbnQ4TGlzdCBkYXRhOwogIEludGVybmV0QWRkcmVzcyBhZGRyZXNzOwogIGludCBwb3J0OwoKICBEYXRhZ3JhbSh0aGlzLmRhdGEsIHRoaXMuYWRkcmVzcywgdGhpcy5wb3J0KTsKfQoKLyoqCiAqIEEgW1Jhd0RhdGFncmFtU29ja2V0XSBpcyBhbiB1bmJ1ZmZlcmVkIGludGVyZmFjZSB0byBhIFVEUCBzb2NrZXQuCiAqCiAqIFRoZSByYXcgZGF0YWdyYW0gc29ja2V0IGRlbGl2ZXJzIHRoZSBkYXRhZ3JhbXMgaW4gdGhlIHNhbWUgY2h1bmtzIGFzIHRoZQogKiB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0uIEl0J3MgYSBbU3RyZWFtXSBvZiBbUmF3U29ja2V0RXZlbnRdcy4KICoKICogTm90ZSB0aGF0IHRoZSBldmVudCBbUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZF0gd2lsbCBuZXZlciBiZQogKiByZWNlaXZlZCBhcyBhbiBVRFAgc29ja2V0IGNhbm5vdCBiZSBjbG9zZWQgYnkgYSByZW1vdGUgcGVlci4KICoKICogSXQgaXMgbm90IHRoZSBzYW1lIGFzIGEKICogW1BPU0lYIHJhdyBzb2NrZXRdKGh0dHA6Ly9tYW43Lm9yZy9saW51eC9tYW4tcGFnZXMvbWFuNy9yYXcuNy5odG1sKS4KICovCmFic3RyYWN0IGNsYXNzIFJhd0RhdGFncmFtU29ja2V0IGV4dGVuZHMgU3RyZWFtPFJhd1NvY2tldEV2ZW50PiB7CiAgLyoqCiAgICogU2V0IG9yIGdldCwgaWYgdGhlIFtSYXdEYXRhZ3JhbVNvY2tldF0gc2hvdWxkIGxpc3RlbiBmb3IKICAgKiBbUmF3U29ja2V0RXZlbnQucmVhZF0gZXZlbnRzLiBEZWZhdWx0IGlzIFs6dHJ1ZTpdLgogICAqLwogIGJvb2wgcmVhZEV2ZW50c0VuYWJsZWQ7CgogIC8qKgogICAqIFNldCBvciBnZXQsIGlmIHRoZSBbUmF3RGF0YWdyYW1Tb2NrZXRdIHNob3VsZCBsaXN0ZW4gZm9yCiAgICogW1Jhd1NvY2tldEV2ZW50LndyaXRlXSBldmVudHMuIERlZmF1bHQgaXMgWzp0cnVlOl0uICBUaGlzIGlzIGEKICAgKiBvbmUtc2hvdCBsaXN0ZW5lciwgYW5kIHdyaXRlRXZlbnRzRW5hYmxlZCBtdXN0IGJlIHNldCB0byB0cnVlCiAgICogYWdhaW4gdG8gcmVjZWl2ZSBhbm90aGVyIHdyaXRlIGV2ZW50LgogICAqLwogIGJvb2wgd3JpdGVFdmVudHNFbmFibGVkOwoKICAvKioKICAgKiBTZXQgb3IgZ2V0LCB3aGV0aGVyIG11bHRpY2FzdCB0cmFmZmljIGlzIGxvb3BlZCBiYWNrIHRvIHRoZSBob3N0LgogICAqCiAgICogQnkgZGVmYXVsdCBtdWx0aWNhc3QgbG9vcGJhY2sgaXMgZW5hYmxlZC4KICAgKi8KICBib29sIG11bHRpY2FzdExvb3BiYWNrOwoKICAvKioKICAgKiBTZXQgb3IgZ2V0LCB0aGUgbWF4aW11bSBuZXR3b3JrIGhvcHMgZm9yIG11bHRpY2FzdCBwYWNrYWdlcwogICAqIG9yaWdpbmF0aW5nIGZyb20gdGhpcyBzb2NrZXQuCiAgICoKICAgKiBGb3IgSVB2NCB0aGlzIGlzIHJlZmVycmVkIHRvIGFzIFRUTCAodGltZSB0byBsaXZlKS4KICAgKgogICAqIEJ5IGRlZmF1bHQgdGhpcyB2YWx1ZSBpcyAxIGNhdXNpbmcgbXVsdGljYXN0IHRyYWZmaWMgdG8gc3RheSBvbgogICAqIHRoZSBsb2NhbCBuZXR3b3JrLgogICAqLwogIGludCBtdWx0aWNhc3RIb3BzOwoKICAvKioKICAgKiBTZXQgb3IgZ2V0LCB0aGUgbmV0d29yayBpbnRlcmZhY2UgdXNlZCBmb3Igb3V0Z29pbmcgbXVsdGljYXN0IHBhY2thZ2VzLgogICAqCiAgICogQSB2YWx1ZSBvZiBgbnVsbGBpbmRpY2F0ZSB0aGF0IHRoZSBzeXN0ZW0gY2hvb3NlcyB0aGUgbmV0d29yawogICAqIGludGVyZmFjZSB0byB1c2UuCiAgICoKICAgKiBCeSBkZWZhdWx0IHRoaXMgdmFsdWUgaXMgYG51bGxgCiAgICovCiAgQERlcHJlY2F0ZWQoIlRoaXMgcHJvcGVydHkgaXMgbm90IGltcGxlbWVudGVkLiBVc2UgZ2V0UmF3T3B0aW9uIGFuZCAiCiAgICAgICJzZXRSYXdPcHRpb24gaW5zdGVhZC4iKQogIE5ldHdvcmtJbnRlcmZhY2UgbXVsdGljYXN0SW50ZXJmYWNlOwoKICAvKioKICAgKiBTZXQgb3IgZ2V0LCB3aGV0aGVyIElQdjQgYnJvYWRjYXN0IGlzIGVuYWJsZWQuCiAgICoKICAgKiBJUHY0IGJyb2FkY2FzdCBuZWVkcyB0byBiZSBlbmFibGVkIGJ5IHRoZSBzZW5kZXIgZm9yIHNlbmRpbmcgSVB2NAogICAqIGJyb2FkY2FzdCBwYWNrYWdlcy4gQnkgZGVmYXVsdCBJUHY0IGJyb2FkY2FzdCBpcyBkaXNhYmxlZC4KICAgKgogICAqIEZvciBJUHY2IHRoZXJlIGlzIG5vIGdlbmVyYWwgYnJvYWRjYXN0IG1lY2hhbmlzbS4gVXNlIG11bHRpY2FzdAogICAqIGluc3RlYWQuCiAgICovCiAgYm9vbCBicm9hZGNhc3RFbmFibGVkOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHJhdyBkYXRhZ3JhbSBzb2NrZXQgYmluZGluZyBpdCB0byBhbiBhZGRyZXNzIGFuZAogICAqIHBvcnQuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxSYXdEYXRhZ3JhbVNvY2tldD4gYmluZChob3N0LCBpbnQgcG9ydCwKICAgICAge2Jvb2wgcmV1c2VBZGRyZXNzOiB0cnVlLCBib29sIHJldXNlUG9ydDogZmFsc2UsIGludCB0dGw6IDF9KTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9ydCB1c2VkIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIGludCBnZXQgcG9ydDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgYWRkcmVzcyB1c2VkIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIEludGVybmV0QWRkcmVzcyBnZXQgYWRkcmVzczsKCiAgLyoqCiAgICogQ2xvc2UgdGhlIGRhdGFncmFtIHNvY2tldC4KICAgKi8KICB2b2lkIGNsb3NlKCk7CgogIC8qKgogICAqIFNlbmQgYSBkYXRhZ3JhbS4KICAgKgogICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLiBUaGlzIHdpbGwgYWx3YXlzIGJlIGVpdGhlcgogICAqIHRoZSBzaXplIG9mIFtidWZmZXJdIG9yIGAwYC4KICAgKi8KICBpbnQgc2VuZChMaXN0PGludD4gYnVmZmVyLCBJbnRlcm5ldEFkZHJlc3MgYWRkcmVzcywgaW50IHBvcnQpOwoKICAvKioKICAgKiBSZWNlaXZlIGEgZGF0YWdyYW0uIElmIHRoZXJlIGFyZSBubyBkYXRhZ3JhbXMgYXZhaWxhYmxlIGBudWxsYCBpcwogICAqIHJldHVybmVkLgogICAqCiAgICogVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBkYXRhZ3JhbSB0aGF0IGNhbiBiZSByZWNlaXZlZCBpcyA2NTUwMyBieXRlcy4KICAgKi8KICBEYXRhZ3JhbSByZWNlaXZlKCk7CgogIC8qKgogICAqIEpvaW4gYSBtdWx0aWNhc3QgZ3JvdXAuCiAgICoKICAgKiBJZiBhbiBlcnJvciBvY2N1ciB3aGVuIHRyeWluZyB0byBqb2luIHRoZSBtdWx0aWNhc3QgZ3JvdXAgYW4KICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgogICAqLwogIHZvaWQgam9pbk11bHRpY2FzdChJbnRlcm5ldEFkZHJlc3MgZ3JvdXAsIFtOZXR3b3JrSW50ZXJmYWNlIGludGVyZmFjZV0pOwoKICAvKioKICAgKiBMZWF2ZSBhIG11bHRpY2FzdCBncm91cC4KICAgKgogICAqIElmIGFuIGVycm9yIG9jY3VyIHdoZW4gdHJ5aW5nIHRvIGpvaW4gdGhlIG11bHRpY2FzZSBncm91cCBhbgogICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICovCiAgdm9pZCBsZWF2ZU11bHRpY2FzdChJbnRlcm5ldEFkZHJlc3MgZ3JvdXAsIFtOZXR3b3JrSW50ZXJmYWNlIGludGVyZmFjZV0pOwoKICAvKioKICAgKiBVc2UgW2dldFJhd09wdGlvbl0gdG8gZ2V0IGxvdyBsZXZlbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgW1Jhd1NvY2tldF0uIFNlZQogICAqIFtSYXdTb2NrZXRPcHRpb25dIGZvciBhdmFpbGFibGUgb3B0aW9ucy4KICAgKgogICAqIFJldHVybnMgW1Jhd1NvY2tldE9wdGlvbi52YWx1ZV0gb24gc3VjY2Vzcy4KICAgKgogICAqIFRocm93cyBhbiBbT1NFcnJvcl0gb24gZmFpbHVyZS4KICAgKi8KICBVaW50OExpc3QgZ2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pOwoKICAvKioKICAgKiBVc2UgW3NldFJhd09wdGlvbl0gdG8gY3VzdG9taXplIHRoZSBbUmF3U29ja2V0XS4gU2VlIFtSYXdTb2NrZXRPcHRpb25dIGZvcgogICAqIGF2YWlsYWJsZSBvcHRpb25zLgogICAqCiAgICogVGhyb3dzIGFuIFtPU0Vycm9yXSBvbiBmYWlsdXJlLgogICAqLwogIHZvaWQgc2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pOwp9CgpjbGFzcyBTb2NrZXRFeGNlcHRpb24gaW1wbGVtZW50cyBJT0V4Y2VwdGlvbiB7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CiAgZmluYWwgT1NFcnJvciBvc0Vycm9yOwogIGZpbmFsIEludGVybmV0QWRkcmVzcyBhZGRyZXNzOwogIGZpbmFsIGludCBwb3J0OwoKICBjb25zdCBTb2NrZXRFeGNlcHRpb24odGhpcy5tZXNzYWdlLCB7dGhpcy5vc0Vycm9yLCB0aGlzLmFkZHJlc3MsIHRoaXMucG9ydH0pOwogIGNvbnN0IFNvY2tldEV4Y2VwdGlvbi5jbG9zZWQoKQogICAgICA6IG1lc3NhZ2UgPSAnU29ja2V0IGhhcyBiZWVuIGNsb3NlZCcsCiAgICAgICAgb3NFcnJvciA9IG51bGwsCiAgICAgICAgYWRk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aWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKY29uc3QgaW50IF9zdGRpb0hhbmRsZVR5cGVUZXJtaW5hbCA9IDA7CmNvbnN0IGludCBfc3RkaW9IYW5kbGVUeXBlUGlwZSA9IDE7CmNvbnN0IGludCBfc3RkaW9IYW5kbGVUeXBlRmlsZSA9IDI7CmNvbnN0IGludCBfc3RkaW9IYW5kbGVUeXBlU29ja2V0ID0gMzsKY29uc3QgaW50IF9zdGRpb0hhbmRsZVR5cGVPdGhlciA9IDQ7CgpjbGFzcyBfU3RkU3RyZWFtIGV4dGVuZHMgU3RyZWFtPExpc3Q8aW50Pj4gewogIGZpbmFsIFN0cmVhbTxMaXN0PGludD4+IF9zdHJlYW07CgogIF9TdGRTdHJlYW0odGhpcy5fc3RyZWFtKTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPExpc3Q8aW50Pj4gbGlzdGVuKHZvaWQgb25EYXRhKExpc3Q8aW50PiBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX3N0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9Cn0KCi8qKgogKiBbU3RkaW5dIGFsbG93cyBib3RoIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcmVhZHMgZnJvbSB0aGUgc3RhbmRhcmQKICogaW5wdXQgc3RyZWFtLgogKgogKiBNaXhpbmcgc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyByZWFkcyBpcyB1bmRlZmluZWQuCiAqLwpjbGFzcyBTdGRpbiBleHRlbmRzIF9TdGRTdHJlYW0gaW1wbGVtZW50cyBTdHJlYW08TGlzdDxpbnQ+PiB7CiAgaW50IF9mZDsKCiAgU3RkaW4uXyhTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0sIHRoaXMuX2ZkKSA6IHN1cGVyKHN0cmVhbSk7CgogIC8qKgogICAqIFJlYWQgYSBsaW5lIGZyb20gc3RkaW4uCiAgICoKICAgKiBCbG9ja3MgdW50aWwgYSBmdWxsIGxpbmUgaXMgYXZhaWxhYmxlLgogICAqCiAgICogTGluZXMgbXkgYmUgdGVybWluYXRlZCBieSBlaXRoZXIgYDxDUj48TEY+YCBvciBgPExGPmAuIE9uIFdpbmRvd3MgaW4gY2FzZXMKICAgKiB3aGVyZSB0aGUgW3N0ZGlvVHlwZV0gb2Ygc3RkaW4gaXMgW1N0ZGlvVHlwZS50ZXJtaW1hbF0gdGhlIHRlcm1pbmF0b3IgbWF5CiAgICogYWxzbyBiZSBhIHNpbmdsZSBgPENSPmAuCiAgICoKICAgKiBJbnB1dCBieXRlcyBhcmUgY29udmVydGVkIHRvIGEgc3RyaW5nIGJ5IFtlbmNvZGluZ10uCiAgICogSWYgW2VuY29kaW5nXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBbc3lzdGVtRW5jb2RpbmddLgogICAqCiAgICogSWYgW3JldGFpbk5ld2xpbmVzXSBpcyBgZmFsc2VgLCB0aGUgcmV0dXJuZWQgU3RyaW5nIHdpbGwgbm90IGluY2x1ZGUgdGhlCiAgICogZmluYWwgbGluZSB0ZXJtaW5hdG9yLiBJZiBgdHJ1ZWAsIHRoZSByZXR1cm5lZCBTdHJpbmcgd2lsbCBpbmNsdWRlIHRoZSBsaW5lCiAgICogdGVybWluYXRvci4gRGVmYXVsdCBpcyBgZmFsc2VgLgogICAqCiAgICogSWYgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZCBhZnRlciBhbnkgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgZnJvbSBzdGRpbiwKICAgKiB0aGF0IGRhdGEgaXMgcmV0dXJuZWQgd2l0aG91dCBhIGxpbmUgdGVybWluYXRvci4KICAgKiBSZXR1cm5zIGBudWxsYCBpZiBubyBieXRlcyBwcmVjZWRlZCB0aGUgZW5kIG9mIGlucHV0LgogICAqLwogIFN0cmluZyByZWFkTGluZVN5bmMoCiAgICAgIHtFbmNvZGluZyBlbmNvZGluZzogc3lzdGVtRW5jb2RpbmcsIGJvb2wgcmV0YWluTmV3bGluZXM6IGZhbHNlfSkgewogICAgY29uc3QgQ1IgPSAxMzsKICAgIGNvbnN0IExGID0gMTA7CiAgICBmaW5hbCBMaXN0PGludD4gbGluZSA9IDxpbnQ+W107CiAgICAvLyBPbiBXaW5kb3dzLCBpZiBsaW5lTW9kZSBpcyBkaXNhYmxlZCwgb25seSBDUiBpcyByZWNlaXZlZC4KICAgIGJvb2wgY3JJc05ld2xpbmUgPSBQbGF0Zm9ybS5pc1dpbmRvd3MgJiYKICAgICAgICAoc3RkaW9UeXBlKHN0ZGluKSA9PSBTdGRpb1R5cGUudGVybWluYWwpICYmCiAgICAgICAgIWxpbmVNb2RlOwogICAgaWYgKHJldGFpbk5ld2xpbmVzKSB7CiAgICAgIGludCBieXRlOwogICAgICBkbyB7CiAgICAgICAgYnl0ZSA9IHJlYWRCeXRlU3luYygpOwogICAgICAgIGlmIChieXRlIDwgMCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGxpbmUuYWRkKGJ5dGUpOwogICAgICB9IHdoaWxlIChieXRlICE9IExGICYmICEoYnl0ZSA9PSBDUiAmJiBjcklzTmV3bGluZSkpOwogICAgICBpZiAobGluZS5pc0VtcHR5KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY3JJc05ld2xpbmUpIHsKICAgICAgLy8gQ1IgYW5kIExGIGFyZSBib3RoIGxpbmUgdGVybWluYXRvcnMsIG5laXRoZXIgaXMgcmV0YWluZWQuCiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaW50IGJ5dGUgPSByZWFkQnl0ZVN5bmMoKTsKICAgICAgICBpZiAoYnl0ZSA8IDApIHsKICAgICAgICAgIGlmIChsaW5lLmlzRW1wdHkpIHJldHVybiBudWxsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChieXRlID09IExGIHx8IGJ5dGUgPT0gQ1IpIGJyZWFrOwogICAgICAgIGxpbmUuYWRkKGJ5dGUpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBDYXNlIGhhdmluZyB0byBoYW5kbGUgQ1IgTEYgYXMgYSBzaW5nbGUgdW5yZXRhaW5lZCBsaW5lIHRlcm1pbmF0b3IuCiAgICAgIG91dGVyOgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGludCBieXRlID0gcmVhZEJ5dGVTeW5jKCk7CiAgICAgICAgaWYgKGJ5dGUgPT0gTEYpIGJyZWFrOwogICAgICAgIGlmIChieXRlID09IENSKSB7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIGJ5dGUgPSByZWFkQnl0ZVN5bmMoKTsKICAgICAgICAgICAgaWYgKGJ5dGUgPT0gTEYpIGJyZWFrIG91dGVyOwoKICAgICAgICAgICAgbGluZS5hZGQoQ1IpOwogICAgICAgICAgfSB3aGlsZSAoYnl0ZSA9PSBDUik7CiAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggYW5kIGhhbmRsZSBub24tQ1IgY2hhcmFjdGVyLgogICAgICAgIH0KICAgICAgICBpZiAoYnl0ZSA8IDApIHsKICAgICAgICAgIGlmIChsaW5lLmlzRW1wdHkpIHJldHVybiBudWxsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGxpbmUuYWRkKGJ5dGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZW5jb2RpbmcuZGVjb2RlKGxpbmUpOwogIH0KCiAgLyoqCiAgICogQ2hlY2sgaWYgZWNobyBtb2RlIGlzIGVuYWJsZWQgb24gW3N0ZGluXS4KICAgKi8KICBleHRlcm5hbCBib29sIGdldCBlY2hvTW9kZTsKCiAgLyoqCiAgICogRW5hYmxlIG9yIGRpc2FibGUgZWNobyBtb2RlIG9uIFtzdGRpbl0uCiAgICoKICAgKiBJZiBkaXNhYmxlZCwgaW5wdXQgZnJvbSB0byBjb25zb2xlIHdpbGwgbm90IGJlIGVjaG9lZC4KICAgKgogICAqIERlZmF1bHQgZGVwZW5kcyBvbiB0aGUgcGFyZW50IHByb2Nlc3MsIGJ1dCB1c3VhbGx5IGVuYWJsZWQuCiAgICoKICAgKiBPbiBXaW5kb3dzIHRoaXMgbW9kZSBjYW4gb25seSBiZSBlbmFibGVkIGlmIFtsaW5lTW9kZV0gaXMgZW5hYmxlZCBhcyB3ZWxsLgogICAqLwogIGV4dGVybmFsIHZvaWQgc2V0IGVjaG9Nb2RlKGJvb2wgZW5hYmxlZCk7CgogIC8qKgogICAqIENoZWNrIGlmIGxpbmUgbW9kZSBpcyBlbmFibGVkIG9uIFtzdGRpbl0uCiAgICovCiAgZXh0ZXJuYWwgYm9vbCBnZXQgbGluZU1vZGU7CgogIC8qKgogICAqIEVuYWJsZSBvciBkaXNhYmxlIGxpbmUgbW9kZSBvbiBbc3RkaW5dLgogICAqCiAgICogSWYgZW5hYmxlZCwgY2hhcmFjdGVycyBhcmUgZGVsYXllZCB1bnRpbCBhIG5ldy1saW5lIGNoYXJhY3RlciBpcyBlbnRlcmVkLgogICAqIElmIGRpc2FibGVkLCBjaGFyYWN0ZXJzIHdpbGwgYmUgYXZhaWxhYmxlIGFzIHR5cGVkLgogICAqCiAgICogRGVmYXVsdCBkZXBlbmRzIG9uIHRoZSBwYXJlbnQgcHJvY2VzcywgYnV0IHVzdWFsbHkgZW5hYmxlZC4KICAgKgogICAqIE9uIFdpbmRvd3MgdGhpcyBtb2RlIGNhbiBvbmx5IGJlIGRpc2FibGVkIGlmIFtlY2hvTW9kZV0gaXMgZGlzYWJsZWQgYXMgd2VsbC4KICAgKi8KICBleHRlcm5hbCB2b2lkIHNldCBsaW5lTW9kZShib29sIGVuYWJsZWQpOwoKICAvKioKICAgICogV2hldGhlciBjb25uZWN0ZWQgdG8gYSB0ZXJtaW5hbCB0aGF0IHN1cHBvcnRzIEFOU0kgZXNjYXBlIHNlcXVlbmNlcy4KICAgICoKICAgICogTm90IGFsbCB0ZXJtaW5hbHMgYXJlIHJlY29nbml6ZWQsIGFuZCBub3QgYWxsIHJlY29nbml6ZWQgdGVybWluYWxzIGNhbgogICAgKiByZXBvcnQgd2hldGhlciB0aGV5IHN1cHBvcnQgQU5TSSBlc2NhcGUgc2VxdWVuY2VzLCBzbyB0aGlzIHZhbHVlIGlzIGEKICAgICogYmVzdC1lZmZvcnQgYXR0ZW1wdCBhdCBkZXRlY3RpbmcgdGhlIHN1cHBvcnQuCiAgICAqCiAgICAqIFRoZSBhY3R1YWwgZXNjYXBlIHNlcXVlbmNlIHN1cHBvcnQgbWF5IGRpZmZlciBiZXR3ZWVuIHRlcm1pbmFscywKICAgICogd2l0aCBzb21lIHRlcm1pbmFscyBzdXBwb3J0aW5nIG1vcmUgZXNjYXBlIHNlcXVlbmNlcyB0aGFuIG90aGVycywKICAgICogYW5kIHNvbWUgdGVybWluYWxzIGV2ZW4gZGlmZmVyaW5nIGluIGJlaGF2aW9yIGZvciB0aGUgc2FtZSBlc2NhcGUKICAgICogc2VxdWVuY2UuCiAgICAqCiAgICAqIFRoZSBBTlNJIGNvbG9yIHNlbGVjdGlvbiBpcyBnZW5lcmFsbHkgc3VwcG9ydGVkLgogICAgKgogICAgKiBDdXJyZW50bHksIGEgYFRFUk1gIGVudmlyb25tZW50IHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBgeHRlcm1gCiAgICAqIHdpbGwgYmUgdGFrZW4gYXMgZXZpZGVuY2UgdGhhdCBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIHN1cHBvcnRlZC4KICAgICogT24gV2luZG93cywgb25seSB2ZXJzaW9ucyBvZiBXaW5kb3dzIDEwIGFmdGVyIHYuMTUxMQogICAgKiAoIlRIMiIsIE9TIGJ1aWxkIDEwNTg2KSB3aWxsIGJlIGRldGVjdGVkIGFzIHN1cHBvcnRpbmcgdGhlIG91dHB1dCBvZgogICAgKiBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMsIGFuZCBvbmx5IHZlcnNpb25zIGFmdGVyIHYuMTYwNyAoIkFubml2ZXJzYXJ5CiAgICAqIFVwZGF0ZSIsIE9TIGJ1aWxkIDE0MzkzKSB3aWxsIGJlIGRldGVjdGVkIGFzIHN1cHBvcnRpbmcgdGhlIGlucHV0IG9mCiAgICAqIEFOU0kgZXNjYXBlIHNlcXVlbmNlcy4KICAgICovCiAgZXh0ZXJuYWwgYm9vbCBnZXQgc3VwcG9ydHNBbnNpRXNjYXBlczsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSByZWFkIGEgYnl0ZSBmcm9tIHN0ZGluLiBUaGlzIGNhbGwgd2lsbCBibG9jayB1bnRpbCBhIGJ5dGUgaXMKICAgKiBhdmFpbGFibGUuCiAgICoKICAgKiBJZiBhdCBlbmQgb2YgZmlsZSwgLTEgaXMgcmV0dXJuZWQuCiAgICovCiAgZXh0ZXJuYWwgaW50IHJlYWRCeXRlU3luYygpOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSB0ZXJtaW5hbCBhdHRhY2hlZCB0byBzdGRpbi4KICAgKi8KICBib29sIGdldCBoYXNUZXJtaW5hbCB7CiAgICB0cnkgewogICAgICByZXR1cm4gc3RkaW9UeXBlKHRoaXMpID09IFN0ZGlvVHlwZS50ZXJtaW5hbDsKICAgIH0gb24gRmlsZVN5c3RlbUV4Y2VwdGlvbiBjYXRjaCAoXykgewogICAgICAvLyBJZiBzdGRpb1R5cGUgdGhyb3dzIGEgRmlsZVN5c3RlbUV4Y2VwdGlvbiwgdGhlbiBpdCBpcyBub3QgaG9va2VkIHVwIHRvCiAgICAgIC8vIGEgdGVybWluYWwsIHByb2JhYmx5IGJlY2F1c2UgaXQgaXMgY2xvc2VkLCBidXQgbGV0IG90aGVyIGV4Y2VwdGlvbgogICAgICAvLyB0eXBlcyBidWJibGUgdXAuCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9Cn0KCi8qKgogKiBbU3Rkb3V0XSByZXByZXNlbnRzIHRoZSBbSU9TaW5rXSBmb3IgZWl0aGVyIGBzdGRvdXRgIG9yIGBzdGRlcnJgLgogKgogKiBJdCBwcm92aWRlcyBhICpibG9ja2luZyogYElPU2lua2AsIHNvIHVzaW5nIHRoaXMgdG8gd3JpdGUgd2lsbCBibG9jayB1bnRpbAogKiB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4uCiAqCiAqIEluIHNvbWUgc2l0dWF0aW9ucyB0aGlzIGJsb2NraW5nIGJlaGF2aW9yIGlzIHVuZGVzaXJhYmxlIGFzIGl0IGRvZXMgbm90CiAqIHByb3ZpZGUgdGhlIHNhbWUgbm9uLWJsb2NraW5nIGJlaGF2aW9yIGFzIGRhcnQ6aW8gaW4gZ2VuZXJhbCBleHBvc2VzLgogKiBVc2UgdGhlIHByb3BlcnR5IFtub25CbG9ja2luZ10gdG8gZ2V0IGFuIGBJT1NpbmtgIHdoaWNoIGhhcyB0aGUgbm9uLWJsb2NraW5nCiAqIGJlaGF2aW9yLgogKgogKiBUaGlzIGNsYXNzIGNhbiBhbHNvIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBgc3Rkb3V0YCBvciBgc3RkZXJyYCBpcwogKiBjb25uZWN0ZWQgdG8gYSB0ZXJtaW5hbCBhbmQgcXVlcnkgc29tZSB0ZXJtaW5hbCBwcm9wZXJ0aWVzLgogKgogKiBUaGUgW2FkZEVycm9yXSBBUEkgaXMgaW5oZXJpdGVkIGZyb20gIFtTdHJlYW1TaW5rXSBhbmQgY2FsbGluZyBpdCB3aWxsIHJlc3VsdAogKiBpbiBhbiB1bmhhbmRsZWQgYXN5bmNocm9ub3VzIGVycm9yIHVubGVzcyB0aGVyZSBpcyBhbiBlcnJvciBoYW5kbGVyIG9uCiAqIFtkb25lXS4KICovCmNsYXNzIFN0ZG91dCBleHRlbmRzIF9TdGRTaW5rIGltcGxlbWVudHMgSU9TaW5rIHsKICBmaW5hbCBpbnQgX2ZkOwogIElPU2luayBfbm9uQmxvY2tpbmc7CgogIFN0ZG91dC5fKElPU2luayBzaW5rLCB0aGlzLl9mZCkgOiBzdXBlcihzaW5rKTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgdGVybWluYWwgYXR0YWNoZWQgdG8gc3Rkb3V0LgogICAqLwogIGJvb2wgZ2V0IGhhc1Rlcm1pbmFsID0+IF9oYXNUZXJtaW5hbChfZmQpOwoKICAvKioKICAgKiBHZXQgdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSB0ZXJtaW5hbC4KICAgKgogICAqIElmIG5vIHRlcm1pbmFsIGlzIGF0dGFjaGVkIHRvIHN0ZG91dCwgYSBbU3Rkb3V0RXhjZXB0aW9uXSBpcyB0aHJvd24uIFNlZQogICAqIFtoYXNUZXJtaW5hbF0gZm9yIG1vcmUgaW5mby4KICAgKi8KICBpbnQgZ2V0IHRlcm1pbmFsQ29sdW1ucyA9PiBfdGVybWluYWxDb2x1bW5zKF9mZCk7CgogIC8qKgogICAqIEdldCB0aGUgbnVtYmVyIG9mIGxpbmVzIG9mIHRoZSB0ZXJtaW5hbC4KICAgKgogICAqIElmIG5vIHRlcm1pbmFsIGlzIGF0dGFjaGVkIHRvIHN0ZG91dCwgYSBbU3Rkb3V0RXhjZXB0aW9uXSBpcyB0aHJvd24uIFNlZQogICAqIFtoYXNUZXJtaW5hbF0gZm9yIG1vcmUgaW5mby4KICAgKi8KICBpbnQgZ2V0IHRlcm1pbmFsTGluZXMgPT4gX3Rlcm1pbmFsTGluZXMoX2ZkKTsKCiAgLyoqCiAgICAqIFdoZXRoZXIgY29ubmVjdGVkIHRvIGEgdGVybWluYWwgdGhhdCBzdXBwb3J0cyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMuCiAgICAqCiAgICAqIE5vdCBhbGwgdGVybWluYWxzIGFyZSByZWNvZ25pemVkLCBhbmQgbm90IGFsbCByZWNvZ25pemVkIHRlcm1pbmFscyBjYW4KICAgICogcmVwb3J0IHdoZXRoZXIgdGhleSBzdXBwb3J0IEFOU0kgZXNjYXBlIHNlcXVlbmNlcywgc28gdGhpcyB2YWx1ZSBpcyBhCiAgICAqIGJlc3QtZWZmb3J0IGF0dGVtcHQgYXQgZGV0ZWN0aW5nIHRoZSBzdXBwb3J0LgogICAgKgogICAgKiBUaGUgYWN0dWFsIGVzY2FwZSBzZXF1ZW5jZSBzdXBwb3J0IG1heSBkaWZmZXIgYmV0d2VlbiB0ZXJtaW5hbHMsCiAgICAqIHdpdGggc29tZSB0ZXJtaW5hbHMgc3VwcG9ydGluZyBtb3JlIGVzY2FwZSBzZXF1ZW5jZXMgdGhhbiBvdGhlcnMsCiAgICAqIGFuZCBzb21lIHRlcm1pbmFscyBldmVuIGRpZmZlcmluZyBpbiBiZWhhdmlvciBmb3IgdGhlIHNhbWUgZXNjYXBlCiAgICAqIHNlcXVlbmNlLgogICAgKgogICAgKiBUaGUgQU5TSSBjb2xvciBzZWxlY3Rpb24gaXMgZ2VuZXJhbGx5IHN1cHBvcnRlZC4KICAgICoKICAgICogQ3VycmVudGx5LCBhIGBURVJNYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBzdHJpbmcgYHh0ZXJtYAogICAgKiB3aWxsIGJlIHRha2VuIGFzIGV2aWRlbmNlIHRoYXQgQU5TSSBlc2NhcGUgc2VxdWVuY2VzIGFyZSBzdXBwb3J0ZWQuCiAgICAqIE9uIFdpbmRvd3MsIG9ubHkgdmVyc2lvbnMgb2YgV2luZG93cyAxMCBhZnRlciB2LjE1MTEKICAgICogKCJUSDIiLCBPUyBidWlsZCAxMDU4Nikgd2lsbCBiZSBkZXRlY3RlZCBhcyBzdXBwb3J0aW5nIHRoZSBvdXRwdXQgb2YKICAgICogQU5TSSBlc2NhcGUgc2VxdWVuY2VzLCBhbmQgb25seSB2ZXJzaW9ucyBhZnRlciB2LjE2MDcgKCJBbm5pdmVyc2FyeQogICAgKiBVcGRhdGUiLCBPUyBidWlsZCAxNDM5Mykgd2lsbCBiZSBkZXRlY3RlZCBhcyBzdXBwb3J0aW5nIHRoZSBpbnB1dCBvZgogICAgKiBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMuCiAgICAqLwogIGJvb2wgZ2V0IHN1cHBvcnRzQW5zaUVzY2FwZXMgPT4gX3N1cHBvcnRzQW5zaUVzY2FwZXMoX2ZkKTsKCiAgZXh0ZXJuYWwgYm9vbCBfaGFzVGVybWluYWwoaW50IGZkKTsKICBleHRlcm5hbCBpbnQgX3Rlcm1pbmFsQ29sdW1ucyhpbnQgZmQpOwogIGV4dGVybmFsIGludCBfdGVybWluYWxMaW5lcyhpbnQgZmQpOwogIGV4dGVybmFsIHN0YXRpYyBib29sIF9zdXBwb3J0c0Fuc2lFc2NhcGVzKGludCBmZCk7CgogIC8qKgogICAqIEdldCBhIG5vbi1ibG9ja2luZyBgSU9TaW5rYC4KICAgKi8KICBJT1NpbmsgZ2V0IG5vbkJsb2NraW5nIHsKICAgIF9ub25CbG9ja2luZyA/Pz0gbmV3IElPU2luayhuZXcgX0ZpbGVTdHJlYW1Db25zdW1lci5mcm9tU3RkaW8oX2ZkKSk7CiAgICByZXR1cm4gX25vbkJsb2NraW5nOwogIH0KfQoKY2xhc3MgU3Rkb3V0RXhjZXB0aW9uIGltcGxlbWVudHMgSU9FeGNlcHRpb24gewogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIGZpbmFsIE9TRXJyb3Igb3NFcnJvcjsKCiAgY29uc3QgU3Rkb3V0RXhjZXB0aW9uKHRoaXMubWVzc2FnZSwgW3RoaXMub3NFcnJvcl0pOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIlN0ZG91dEV4Y2VwdGlvbjogJG1lc3NhZ2Uke29zRXJyb3IgPT0gbnVsbCA/ICIiIDogIiwgJG9zRXJyb3IifSI7CiAgfQp9CgpjbGFzcyBTdGRpbkV4Y2VwdGlvbiBpbXBsZW1lbnRzIElPRXhjZXB0aW9uIHsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKICBmaW5hbCBPU0Vycm9yIG9zRXJyb3I7CgogIGNvbnN0IFN0ZGluRXhjZXB0aW9uKHRoaXMubWVzc2FnZSwgW3RoaXMub3NFcnJvcl0pOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIlN0ZGluRXhjZXB0aW9uOiAkbWVzc2FnZSR7b3NFcnJvciA9PSBudWxsID8gIiIgOiAiLCAkb3NFcnJvciJ9IjsKICB9Cn0KCmNsYXNzIF9TdGRDb25zdW1lciBpbXBsZW1lbnRzIFN0cmVhbUNvbnN1bWVyPExpc3Q8aW50Pj4gewogIGZpbmFsIF9maWxlOwoKICBfU3RkQ29uc3VtZXIoaW50IGZkKSA6IF9maWxlID0gX0ZpbGUuX29wZW5TdGRpb1N5bmMoZmQpOwoKICBGdXR1cmUgYWRkU3RyZWFtKFN0cmVhbTxMaXN0PGludD4+IHN0cmVhbSkgewogICAgdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKICAgIHZhciBzdWI7CiAgICBzdWIgPSBzdHJlYW0ubGlzdGVuKChkYXRhKSB7CiAgICAgIHRyeSB7CiAgICAgICAgX2ZpbGUud3JpdGVGcm9tU3luYyhkYXRhKTsKICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgIHN1Yi5jYW5jZWwoKTsKICAgICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihlLCBzKTsKICAgICAgfQogICAgfSwKICAgICAgICBvbkVycm9yOiBjb21wbGV0ZXIuY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6IGNvbXBsZXRlci5jb21wbGV0ZSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgRnV0dXJlIGNsb3NlKCkgewogICAgX2ZpbGUuY2xvc2VTeW5jKCk7CiAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZSgpOwogIH0KfQoKY2xhc3MgX1N0ZFNpbmsgaW1wbGVtZW50cyBJT1NpbmsgewogIGZpbmFsIElPU2luayBfc2luazsKCiAgX1N0ZFNpbmsodGhpcy5fc2luayk7CgogIEVuY29kaW5nIGdldCBlbmNvZGluZyA9PiBfc2luay5lbmNvZGluZzsKICB2b2lkIHNldCBlbmNvZGluZyhFbmNvZGluZyBlbmNvZGluZykgewogICAgX3NpbmsuZW5jb2RpbmcgPSBlbmNvZGluZzsKICB9CgogIHZvaWQgd3JpdGUob2JqZWN0KSB7CiAgICBfc2luay53cml0ZShvYmplY3QpOwogIH0KCiAgdm9pZCB3cml0ZWxuKFtvYmplY3QgPSAiIl0pIHsKICAgIF9zaW5rLndyaXRlbG4ob2JqZWN0KTsKICB9CgogIHZvaWQgd3JpdGVBbGwob2JqZWN0cywgW3NlcCA9ICIiXSkgewogICAgX3Npbmsud3JpdGVBbGwob2JqZWN0cywgc2VwKTsKICB9CgogIHZvaWQgYWRkKExpc3Q8aW50PiBkYXRhKSB7CiAgICBfc2luay5hZGQoZGF0YSk7CiAgfQoKICB2b2lkIGFkZEVycm9yKGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgX3NpbmsuYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgdm9pZCB3cml0ZUNoYXJDb2RlKGludCBjaGFyQ29kZSkgewogICAgX3Npbmsud3JpdGVDaGFyQ29kZShjaGFyQ29kZSk7CiAgfQoKICBGdXR1cmUgYWRkU3RyZWFtKFN0cmVhbTxMaXN0PGludD4+IHN0cmVhbSkgPT4gX3NpbmsuYWRkU3RyZWFtKHN0cmVhbSk7CiAgRnV0dXJlIGZsdXNoKCkgPT4gX3NpbmsuZmx1c2goKTsKICBGdXR1cmUgY2xvc2UoKSA9PiBfc2luay5jbG9zZSgpOwogIEZ1dHVyZSBnZXQgZG9uZSA9PiBfc2luay5kb25lOwp9CgovLy8gVGhlIHR5cGUgb2Ygb2JqZWN0IGEgc3RhbmRhcmQgSU8gc3RyZWFtIGlzIGF0dGFjaGVkIHRvLgpjbGFzcyBTdGRpb1R5cGUgewogIHN0YXRpYyBjb25zdCBTdGRpb1R5cGUgdGVybWluYWwgPSBjb25zdCBTdGRpb1R5cGUuXygidGVybWluYWwiKTsKICBzdGF0aWMgY29uc3QgU3RkaW9UeXBlIHBpcGUgPSBjb25zdCBTdGRpb1R5cGUuXygicGlwZSIpOwogIHN0YXRpYyBjb25zdCBTdGRpb1R5cGUgZmlsZSA9IGNvbnN0IFN0ZGlvVHlwZS5fKCJmaWxlIik7CiAgc3RhdGljIGNvbnN0IFN0ZGlvVHlwZSBvdGhlciA9IGNvbnN0IFN0ZGlvVHlwZS5fKCJvdGhlciIpOwoKICBARGVwcmVjYXRlZCgiVXNlIHRlcm1pbmFsIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBTdGRpb1R5cGUgVEVSTUlOQUwgPSB0ZXJtaW5hbDsKICBARGVwcmVjYXRlZCgiVXNlIHBpcGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFN0ZGlvVHlwZSBQSVBFID0gcGlwZTsKICBARGVwcmVjYXRlZCgiVXNlIGZpbGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFN0ZGlvVHlwZSBGSUxFID0gZmlsZTsKICBARGVwcmVjYXRlZCgiVXNlIG90aGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBTdGRpb1R5cGUgT1RIRVIgPSBvdGhlcjsKCiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgY29uc3QgU3RkaW9UeXBlLl8odGhpcy5uYW1lKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiU3RkaW9UeXBlOiAkbmFtZSI7Cn0KClN0ZGluIF9zdGRpbjsKU3Rkb3V0IF9zdGRvdXQ7ClN0ZG91dCBfc3RkZXJyOwoKLy8gVGhlc2UgbWF5IGJlIHNldCB0byBkaWZmZXJlbnQgdmFsdWVzIGJ5IHRoZSBlbWJlZGRlciBieSBjYWxsaW5nCi8vIF9zZXRTdGRpb0ZEcyB3aGVuIGluaXRpYWxpemluZyBkYXJ0OmlvLgppbnQgX3N0ZGluRkQgPSAwOwppbnQgX3N0ZG91dEZEID0gMTsKaW50IF9zdGRlcnJGRCA9IDI7CgpAcHJhZ21hKCd2bTplbnRyeS1wb2ludCcsICdjYWxsJykKdm9pZCBfc2V0U3RkaW9GRHMoaW50IHN0ZGluLCBpbnQgc3Rkb3V0LCBpbnQgc3RkZXJyKSB7CiAgX3N0ZGluRkQgPSBzdGRpbjsKICBfc3Rkb3V0RkQgPSBzdGRvdXQ7CiAgX3N0ZGVyckZEID0gc3RkZXJyOwp9CgovLy8gVGhlIHN0YW5kYXJkIGlucHV0IHN0cmVhbSBvZiBkYXRhIHJlYWQgYnkgdGhpcyBwcm9ncmFtLgpTdGRpbiBnZXQgc3RkaW4gewogIF9zdGRpbiA/Pz0gX1N0ZElPVXRpbHMuX2dldFN0ZGlvSW5wdXRTdHJlYW0oX3N0ZGluRkQpOwogIHJldHVybiBfc3RkaW47Cn0KCi8vLyBUaGUgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbSBvZiBkYXRhIHdyaXR0ZW4gYnkgdGhpcyBwcm9ncmFtLgovLy8KLy8vIFRoZSBgYWRkRXJyb3JgIEFQSSBpcyBpbmhlcml0ZWQgZnJvbSAgYFN0cmVhbVNpbmtgIGFuZCBjYWxsaW5nIGl0IHdpbGwKLy8vIHJlc3VsdCBpbiBhbiB1bmhhbmRsZWQgYXN5bmNocm9ub3VzIGVycm9yIHVubGVzcyB0aGVyZSBpcyBhbiBlcnJvciBoYW5kbGVyCi8vLyBvbiBgZG9uZWAuClN0ZG91dCBnZXQgc3Rkb3V0IHsKICBfc3Rkb3V0ID8/PSBfU3RkSU9VdGlscy5fZ2V0U3RkaW9PdXRwdXRTdHJlYW0oX3N0ZG91dEZEKTsKICByZXR1cm4gX3N0ZG91dDsKfQoKLy8vIFRoZSBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtIG9mIGVycm9ycyB3cml0dGVuIGJ5IHRoaXMgcHJvZ3JhbS4KLy8vCi8vLyBUaGUgYGFkZEVycm9yYCBBUEkgaXMgaW5oZXJpdGVkIGZyb20gIGBTdHJlYW1TaW5rYCBhbmQgY2FsbGluZyBpdCB3aWxsCi8vLyByZXN1bHQgaW4gYW4gdW5oYW5kbGVkIGFzeW5jaHJvbm91cyBlcnJvciB1bmxlc3MgdGhlcmUgaXMgYW4gZXJyb3IgaGFuZGxlcgovLy8gb24gYGRvbmVgLgpTdGRvdXQgZ2V0IHN0ZGVyciB7CiAgX3N0ZGVyciA/Pz0gX1N0ZElPVXRpbHMuX2dldFN0ZGlvT3V0cHV0U3RyZWFtKF9zdGRlcnJGRCk7CiAgcmV0dXJuIF9zdGRlcnI7Cn0KCi8vLyBGb3IgYSBzdHJlYW0sIHJldHVybnMgd2hldGhlciBpdCBpcyBhdHRhY2hlZCB0byBhIGZpbGUsIHBpcGUsIHRlcm1pbmFsLCBvcgovLy8gc29tZXRoaW5nIGVsc2UuClN0ZGlvVHlwZSBzdGRpb1R5cGUob2JqZWN0KSB7CiAgaWYgKG9iamVjdCBpcyBfU3RkU3RyZWFtKSB7CiAgICBvYmplY3QgPSBvYmplY3QuX3N0cmVhbTsKICB9IGVsc2UgaWYgKG9iamVjdCA9PSBzdGRvdXQgfHwgb2JqZWN0ID09IHN0ZGVycikgewogICAgaW50IHN0ZGlvZmQgPSBvYmplY3QgPT0gc3Rkb3V0ID8gX3N0ZG91dEZEIDogX3N0ZGVyckZEOwogICAgc3dpdGNoIChfU3RkSU9VdGlscy5fZ2V0U3RkaW9IYW5kbGVUeXBlKHN0ZGlvZmQpKSB7CiAgICAgIGNhc2UgX3N0ZGlvSGFuZGxlVHlwZVRlcm1pbmFsOgogICAgICAgIHJldHVybiBTdGRpb1R5cGUudGVybWluYWw7CiAgICAgIGNhc2UgX3N0ZGlvSGFuZGxlVHlwZVBpcGU6CiAgICAgICAgcmV0dXJuIFN0ZGlvVHlwZS5waXBlOwogICAgICBjYXNlIF9zdGRpb0hhbmRsZVR5cGVGaWxlOgogICAgICAgIHJldHVybiBTdGRpb1R5cGUuZmlsZTsKICAgIH0KICB9CiAgaWYgKG9iamVjdCBpcyBfRmlsZVN0cmVhbSkgewogICAgcmV0dXJuIFN0ZGlvVHlwZS5maWxlOwogIH0KICBpZiAob2JqZWN0IGlzIFNvY2tldCkgewogICAgaW50IHNvY2tldFR5cGUgPSBfU3RkSU9VdGlscy5fc29ja2V0VHlwZShvYmplY3QpOwogICAgaWYgKHNvY2tldFR5cGUgPT0gbnVsbCkgcmV0dXJuIFN0ZGlvVHlwZS5vdGhlcjsKICAgIHN3aXRjaCAoc29ja2V0VHlwZSkgewogICAgICBjYXNlIF9zdGRpb0hhbmRsZVR5cGVUZXJtaW5hbDoKICAgICAgICByZXR1cm4gU3RkaW9UeXBlLnRlcm1pbmFsOwog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eXBlRmlsZToKICAgICAgICByZXR1cm4gbmV3IFN0ZGluLl8obmV3IF9GaWxlU3RyZWFtLmZvclN0ZGluKCksIGZkKTsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigKICAgICAgICAgICAgIkNvdWxkbid0IGRldGVybWluZSBmaWxlIHR5cGUgb2Ygc3RkaW4gKGZkICRmZCkiKTsKICAgIH0KICB9CgogIEBwYXRjaAogIHN0YXRpYyBfZ2V0U3RkaW9PdXRwdXRTdHJlYW0oaW50IGZkKSB7CiAgICBzd2l0Y2ggKF9nZXRTdGRpb0hhbmRsZVR5cGUoZmQpKSB7CiAgICAgIGNhc2UgX3N0ZGlvSGFuZGxlVHlwZVRlcm1pbmFsOgogICAgICBjYXNlIF9zdGRpb0hhbmRsZVR5cGVQaXBlOgogICAgICBjYXNlIF9zdGRpb0hhbmRsZVR5cGVTb2NrZXQ6CiAgICAgIGNhc2UgX3N0ZGlvSGFuZGxlVHlwZUZpbGU6CiAgICAgICAgcmV0dXJuIG5ldyBTdGRvdXQuXyhuZXcgSU9TaW5rKG5ldyBfU3RkQ29uc3VtZXIoZmQpKSwgZmQpOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKAogICAgICAgICAgICAiQ291bGRuJ3QgZGV0ZXJtaW5lIGZpbGUgdHlwZSBvZiBzdGRpbyBoYW5kbGUgKGZkICRmZCkiKTsKICAgIH0KICB9CgogIEBwYXRjaAogIHN0YXRpYyBpbnQgX3NvY2tldFR5cGUoU29ja2V0IHNvY2tldCkgewogICAgaWYgKHNvY2tldCBpcyBfU29ja2V0KSByZXR1cm4gX25hdGl2ZVNvY2tldFR5cGUoc29ja2V0Ll9uYXRpdmVTb2NrZXQpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBzdGF0aWMgaW50IF9uYXRpdmVTb2NrZXRUeXBlKF9OYXRpdmVTb2NrZXQgbmF0aXZlU29ja2V0KSB7CiAgICB2YXIgcmVzdWx0ID0gX2dldFNvY2tldFR5cGUobmF0aXZlU29ja2V0KTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiRXJyb3IgcmV0cmlldmluZyBzb2NrZXQgdHlwZSIsICIiLCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBfZ2V0U3RkaW9IYW5kbGVUeXBlKGludCBmZCkgbmF0aXZlICJGaWxlX0dldFN0ZGlvSGFuZGxlVHlwZSI7Cn0KCkBwYXRjaApjbGFzcyBTdGRpbiB7CiAgQHBhdGNoCiAgaW50IHJlYWRCeXRlU3luYygpIHsKICAgIHZhciByZXN1bHQgPSBfcmVhZEJ5dGUoX2ZkKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgU3RkaW5FeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgYnl0ZSBmcm9tIHN0ZGluIiwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAcGF0Y2gKICBib29sIGdldCBlY2hvTW9kZSB7CiAgICB2YXIgcmVzdWx0ID0gX2VjaG9Nb2RlKF9mZCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IFN0ZGluRXhjZXB0aW9uKCJFcnJvciBnZXR0aW5nIHRlcm1pbmFsIGVjaG8gbW9kZSIsIHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQHBhdGNoCiAgdm9pZCBzZXQgZWNob01vZGUoYm9vbCBlbmFibGVkKSB7CiAgICBpZiAoIV9FbWJlZGRlckNvbmZpZy5fbWF5U2V0RWNob01vZGUpIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiVGhpcyBlbWJlZGRlciBkaXNhbGxvd3Mgc2V0dGluZyBTdGRpbi5lY2hvTW9kZSIpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9zZXRFY2hvTW9kZShfZmQsIGVuYWJsZWQpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBTdGRpbkV4Y2VwdGlvbigiRXJyb3Igc2V0dGluZyB0ZXJtaW5hbCBlY2hvIG1vZGUiLCByZXN1bHQpOwogICAgfQogIH0KCiAgQHBhdGNoCiAgYm9vbCBnZXQgbGluZU1vZGUgewogICAgdmFyIHJlc3VsdCA9IF9saW5lTW9kZShfZmQpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBTdGRpbkV4Y2VwdGlvbigiRXJyb3IgZ2V0dGluZyB0ZXJtaW5hbCBsaW5lIG1vZGUiLCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBwYXRjaAogIHZvaWQgc2V0IGxpbmVNb2RlKGJvb2wgZW5hYmxlZCkgewogICAgaWYgKCFfRW1iZWRkZXJDb25maWcuX21heVNldExpbmVNb2RlKSB7CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgIlRoaXMgZW1iZWRkZXIgZGlzYWxsb3dzIHNldHRpbmcgU3RkaW4ubGluZU1vZGUiKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfc2V0TGluZU1vZGUoX2ZkLCBlbmFibGVkKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgU3RkaW5FeGNlcHRpb24oIkVycm9yIHNldHRpbmcgdGVybWluYWwgbGluZSBtb2RlIiwgcmVzdWx0KTsKICAgIH0KICB9CgogIEBwYXRjaAogIGJvb2wgZ2V0IHN1cHBvcnRzQW5zaUVzY2FwZXMgewogICAgdmFyIHJlc3VsdCA9IF9zdXBwb3J0c0Fuc2lFc2NhcGVzKF9mZCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IFN0ZGluRXhjZXB0aW9uKCJFcnJvciBkZXRlcm1pbmluZyBBTlNJIHN1cHBvcnQiLCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBfZWNob01vZGUoaW50IGZkKSBuYXRpdmUgIlN0ZGluX0dldEVjaG9Nb2RlIjsKICBzdGF0aWMgX3NldEVjaG9Nb2RlKGludCBmZCwgYm9vbCBlbmFibGVkKSBuYXRpdmUgIlN0ZGluX1NldEVjaG9Nb2RlIjsKICBzdGF0aWMgX2xpbmVNb2RlKGludCBmZCkgbmF0aXZlICJTdGRpbl9HZXRMaW5lTW9kZSI7CiAgc3RhdGljIF9zZXRMaW5lTW9kZShpbnQgZmQsIGJvb2wgZW5hYmxlZCkgbmF0aXZlICJTdGRpbl9TZXRMaW5lTW9kZSI7CiAgc3RhdGljIF9yZWFkQnl0ZShpbnQgZmQpIG5hdGl2ZSAiU3RkaW5fUmVhZEJ5dGUiOwogIHN0YXRpYyBfc3VwcG9ydHNBbnNpRXNjYXBlcyhpbnQgZmQpIG5hdGl2ZSAiU3RkaW5fQW5zaVN1cHBvcnRlZCI7Cn0KCkBwYXRjaApjbGFzcyBTdGRvdXQgewogIEBwYXRjaAogIGJvb2wgX2hhc1Rlcm1pbmFsKGludCBmZCkgewogICAgdHJ5IHsKICAgICAgX3Rlcm1pbmFsU2l6ZShmZCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBjYXRjaCAoXykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBAcGF0Y2gKICBpbnQgX3Rlcm1pbmFsQ29sdW1ucyhpbnQgZmQpID0+IF90ZXJtaW5hbFNpemUoZmQpWzBdOwogIEBwYXRjaAogIGludCBfdGVybWluYWxMaW5lcyhpbnQgZmQpID0+IF90ZXJtaW5hbFNpemUoZmQpWzFdOwoKICBzdGF0aWMgTGlzdCBfdGVybWluYWxTaXplKGludCBmZCkgewogICAgdmFyIHNpemUgPSBfZ2V0VGVybWluYWxTaXplKGZkKTsKICAgIGlmIChzaXplIGlzISBMaXN0KSB7CiAgICAgIHRocm93IG5ldyBTdGRvdXRFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgdGVybWluYWwgc2l6ZSIsIHNpemUpOwogICAgfQogICAgcmV0dXJuIHNpemU7CiAgfQoKICBzdGF0aWMgX2dldFRlcm1pbmFsU2l6ZShpbnQgZmQpIG5hdGl2ZSAiU3Rkb3V0X0dldFRlcm1pbmFsU2l6ZSI7CgogIEBwYXRjaAogIHN0YXRpYyBib29sIF9zdXBwb3J0c0Fuc2lFc2NhcGVzKGludCBmZCkgewogICAgdmFyIHJlc3VsdCA9IF9nZXRBbnNpU3VwcG9ydGVkKGZkKTsKICAgIGlmIChyZXN1bHQgaXMhIGJvb2wpIHsKICAgICAgdGhyb3cgbmV3IFN0ZG91dEV4Y2VwdGlvbigiRXJyb3IgZGV0ZXJtaW5pbmcgQU5TSSBzdXBwb3J0IiwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgX2dldEFuc2lTdXBwb3J0ZWQoaW50IGZkKSBuYXRpdmUgIlN0ZG91dF9BbnNpU3VwcG9ydGVkIjsKfQoKX2dldFN0ZGlvSGFuZGxlKF9OYXRpdmVTb2NrZXQgc29ja2V0LCBpbnQgbnVtKSBuYXRpdmUgIlNvY2tldF9HZXRTdGRpb0hhbmRsZSI7Cl9nZXRTb2NrZXRUeXBlKF9OYXRpdmVTb2NrZXQgbmF0aXZlU29ja2V0KSBuYXRpdmUgIlNvY2tldF9HZXRUeXBlIjsKgKgATk48ASABBxQJLiclISM7ITwPJz8GBAEJKSclISMhQw8nRgYEAQkqSxEEAT0vHVEGEwQBCUcCAQcOCRchHUkGEwQBCRYhHUwGEwQBCSQsIj0GLR1MBgQBCRYhHUwGEwQBCSQsIj0GLR1MBgQBCSEsHUoGEwQBN0g3SDREAgEHDwkeChkTEhQGBAEJOAk2ASYlGUYGEQQBQwEJLSgbSwYTBAFCAgFPRAEeZGFydDppby1wYXRjaC9zdGRpb19wYXRjaC5kYXJ0Nm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9zdHJpbmdfdHJhbnNmb3JtZXIuZGFydI3aLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8vLyBUaGUgY3VycmVudCBzeXN0ZW0gZW5jb2RpbmcuCi8vLwovLy8gVGhpcyBpcyB1c2VkIGZvciBjb252ZXJ0aW5nIGZyb20gYnl0ZXMgdG8gYW5kIGZyb20gU3RyaW5ncyB3aGVuCi8vLyBjb21tdW5pY2F0aW5nIG9uIHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyci4KLy8vCi8vLyBPbiBXaW5kb3dzIHRoaXMgd2lsbCB1c2UgdGhlIGN1cnJlbnRseSBhY3RpdmUgY29kZSBwYWdlIGZvciB0aGUgY29udmVyc2lvbi4KLy8vIE9uIGFsbCBvdGhlciBzeXN0ZW1zIGl0IHdpbGwgYWx3YXlzIHVzZSBVVEYtOC4KY29uc3QgU3lzdGVtRW5jb2Rpbmcgc3lzdGVtRW5jb2RpbmcgPSBjb25zdCBTeXN0ZW1FbmNvZGluZygpOwpARGVwcmVjYXRlZCgiVXNlIHN5c3RlbUVuY29kaW5nIGluc3RlYWQiKQpjb25zdCBTeXN0ZW1FbmNvZGluZyBTWVNURU1fRU5DT0RJTkcgPSBjb25zdCBTeXN0ZW1FbmNvZGluZygpOwoKLy8vIFRoZSBzeXN0ZW0gZW5jb2RpbmcgaXMgdGhlIGN1cnJlbnQgY29kZSBwYWdlIG9uIFdpbmRvd3MgYW5kIFVURi04IG9uIExpbnV4Ci8vLyBhbmQgTWFjLgpjbGFzcyBTeXN0ZW1FbmNvZGluZyBleHRlbmRzIEVuY29kaW5nIHsKICAvLy8gQ3JlYXRlcyBhIGNvbnN0IFN5c3RlbUVuY29kaW5nLgogIC8vLwogIC8vLyBVc2VycyBzaG91bGQgdXNlIHRoZSB0b3AtbGV2ZWwgY29uc3RhbnQsIFtzeXN0ZW1FbmNvZGluZ10uCiAgY29uc3QgU3lzdGVtRW5jb2RpbmcoKTsKCiAgU3RyaW5nIGdldCBuYW1lID0+ICdzeXN0ZW0nOwoKICBMaXN0PGludD4gZW5jb2RlKFN0cmluZyBpbnB1dCkgPT4gZW5jb2Rlci5jb252ZXJ0KGlucHV0KTsKICBTdHJpbmcgZGVjb2RlKExpc3Q8aW50PiBlbmNvZGVkKSA9PiBkZWNvZGVyLmNvbnZlcnQoZW5jb2RlZCk7CgogIENvbnZlcnRlcjxTdHJpbmcsIExpc3Q8aW50Pj4gZ2V0IGVuY29kZXIgewogICAgaWYgKFBsYXRmb3JtLm9wZXJhdGluZ1N5c3RlbSA9PSAid2luZG93cyIpIHsKICAgICAgcmV0dXJuIGNvbnN0IF9XaW5kb3dzQ29kZVBhZ2VFbmNvZGVyKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gY29uc3QgVXRmOEVuY29kZXIoKTsKICAgIH0KICB9CgogIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gZ2V0IGRlY29kZXIgewogICAgaWYgKFBsYXRmb3JtLm9wZXJhdGluZ1N5c3RlbSA9PSAid2luZG93cyIpIHsKICAgICAgcmV0dXJuIGNvbnN0IF9XaW5kb3dzQ29kZVBhZ2VEZWNvZGVyKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gY29uc3QgVXRmOERlY29kZXIoKTsKICAgIH0KICB9Cn0KCmNsYXNzIF9XaW5kb3dzQ29kZVBhZ2VFbmNvZGVyIGV4dGVuZHMgQ29udmVydGVyPFN0cmluZywgTGlzdDxpbnQ+PiB7CiAgY29uc3QgX1dpbmRvd3NDb2RlUGFnZUVuY29kZXIoKTsKCiAgTGlzdDxpbnQ+IGNvbnZlcnQoU3RyaW5nIGlucHV0KSB7CiAgICBMaXN0PGludD4gZW5jb2RlZCA9IF9lbmNvZGVTdHJpbmcoaW5wdXQpOwogICAgaWYgKGVuY29kZWQgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIGNoYXJhY3RlciBmb3IgZW5jb2RpbmciKTsKICAgIH0KICAgIHJldHVybiBlbmNvZGVkOwogIH0KCiAgLyoqCiAgICogU3RhcnRzIGEgY2h1bmtlZCBjb252ZXJzaW9uLgogICAqLwogIFN0cmluZ0NvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxMaXN0PGludD4+IHNpbmspIHsKICAgIHJldHVybiBuZXcgX1dpbmRvd3NDb2RlUGFnZUVuY29kZXJTaW5rKHNpbmspOwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIExpc3Q8aW50PiBfZW5jb2RlU3RyaW5nKFN0cmluZyBzdHJpbmcpOwp9CgpjbGFzcyBfV2luZG93c0NvZGVQYWdlRW5jb2RlclNpbmsgZXh0ZW5kcyBTdHJpbmdDb252ZXJzaW9uU2lua0Jhc2UgewogIC8vIFRPRE8oZmxvaXRzY2gpOiBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGNvbnZlcnNpb25zIHdoZW4gdGhlIGlucHV0IGlzCiAgLy8gbm90IGEgU3RyaW5nLgoKICBmaW5hbCBTaW5rPExpc3Q8aW50Pj4gX3Npbms7CgogIF9XaW5kb3dzQ29kZVBhZ2VFbmNvZGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChTdHJpbmcgc3RyaW5nKSB7CiAgICBMaXN0PGludD4gZW5jb2RlZCA9IF9XaW5kb3dzQ29kZVBhZ2VFbmNvZGVyLl9lbmNvZGVTdHJpbmcoc3RyaW5nKTsKICAgIGlmIChlbmNvZGVkID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBjaGFyYWN0ZXIgZm9yIGVuY29kaW5nIik7CiAgICB9CiAgICBfc2luay5hZGQoZW5jb2RlZCk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKFN0cmluZyBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGlmIChzdGFydCAhPSAwIHx8IGVuZCAhPSBzb3VyY2UubGVuZ3RoKSB7CiAgICAgIHNvdXJjZSA9IHNvdXJjZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgICB9CiAgICBhZGQoc291cmNlKTsKICAgIGlmIChpc0xhc3QpIGNsb3NlKCk7CiAgfQp9CgpjbGFzcyBfV2luZG93c0NvZGVQYWdlRGVjb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gewogIGNvbnN0IF9XaW5kb3dzQ29kZVBhZ2VEZWNvZGVyKCk7CgogIFN0cmluZyBjb252ZXJ0KExpc3Q8aW50PiBpbnB1dCkgewogICAgcmV0dXJuIF9kZWNvZGVCeXRlcyhpbnB1dCk7CiAgfQoKICAvKioKICAgKiBTdGFydHMgYSBjaHVua2VkIGNvbnZlcnNpb24uCiAgICovCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxTdHJpbmc+IHNpbmspIHsKICAgIHJldHVybiBuZXcgX1dpbmRvd3NDb2RlUGFnZURlY29kZXJTaW5rKHNpbmspOwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBfZGVjb2RlQnl0ZXMoTGlzdDxpbnQ+IGJ5dGVzKTsKfQoKY2xhc3MgX1dpbmRvd3NDb2RlUGFnZURlY29kZXJTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgLy8gVE9ETyhmbG9pdHNjaCk6IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgY29udmVyc2lvbnMgd2hlbiB0aGUgaW5wdXQgaXMKICAvLyBhIHNsaWNlLgoKICBmaW5hbCBTaW5rPFN0cmluZz4gX3Npbms7CgogIF9XaW5kb3dzQ29kZVBhZ2VEZWNvZGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChMaXN0PGludD4gYnl0ZXMpIHsKICAgIF9zaW5rLmFkZChfV2luZG93c0NvZGVQYWdlRGVjb2Rlci5fZGVjb2RlQnl0ZXMoYnl0ZXMpKTsKICB9Cn0KgIQATk48AREBIQRELwRQMz4qPwFPDSgmBkEaAR8BPEABLTEuDSIGBAEtMS4NIgYEAgFFIwEkLhtDBhQEAQYiBkYyBAE6AgFFShMBHwErARETBAEcRxtDBhgEAUIuLQYRGQQCAUUjASQgBAEGIgZBMgQBOAIBQ0oOARwBKwEREwQBHjwEAgEfZGFydDppby9zdHJpbmdfdHJhbnNmb3JtZXIuZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vc3luY19zb2NrZXQuZGFydI/SLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8qKgogKiBBIGxvdy1sZXZlbCBjbGFzcyBmb3IgY29tbXVuaWNhdGluZyBzeW5jaHJvbm91c2x5IG92ZXIgYSBUQ1Agc29ja2V0LgogKgogKiBXYXJuaW5nOiBbUmF3U3luY2hyb25vdXNTb2NrZXRdIHNob3VsZCBwcm9iYWJseSBvbmx5IGJlIHVzZWQgdG8gY29ubmVjdCB0bwogKiAnbG9jYWxob3N0Jy4gVGhlIG9wZXJhdGlvbnMgYmVsb3cgd2lsbCBibG9jayB0aGUgY2FsbGluZyB0aHJlYWQgdG8gd2FpdCBmb3IKICogYSByZXNwb25zZSBmcm9tIHRoZSBuZXR3b3JrLiBUaGUgdGhyZWFkIGNhbiBwcm9jZXNzIG5vIG90aGVyIGV2ZW50cyB3aGlsZQogKiB3YWl0aW5nIGZvciB0aGVzZSBvcGVyYXRpb25zIHRvIGNvbXBsZXRlLiBbUmF3U3luY2hyb25vdXNTb2NrZXRdIGlzIG5vdAogKiBzdWl0YWJsZSBmb3IgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSBoaWdoIHBlcmZvcm1hbmNlIG9yIGFzeW5jaHJvbm91cyBJL08KICogc3VjaCBhcyBhIHNlcnZlci4gSW5zdGVhZCBzdWNoIGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSBub24tYmxvY2tpbmcKICogc29ja2V0cyBhbmQgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgaW4gdGhlIFNvY2tldCBvciBSYXdTb2NrZXQgY2xhc3Nlcy4KICovCmFic3RyYWN0IGNsYXNzIFJhd1N5bmNocm9ub3VzU29ja2V0IHsKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHNvY2tldCBjb25uZWN0aW9uIGFuZCByZXR1cm5zIGEgW1Jhd1N5bmNocm9ub3VzU29ja2V0XS4KICAgKgogICAqIFtob3N0XSBjYW4gZWl0aGVyIGJlIGEgW1N0cmluZ10gb3IgYW4gW0ludGVybmV0QWRkcmVzc10uIElmIFtob3N0XSBpcyBhCiAgICogW1N0cmluZ10sIFtjb25uZWN0U3luY10gd2lsbCBwZXJmb3JtIGEgW0ludGVybmV0QWRkcmVzcy5sb29rdXBdIGFuZCB0cnkKICAgKiBhbGwgcmV0dXJuZWQgW0ludGVybmV0QWRkcmVzc11lcywgdW50aWwgY29ubmVjdGVkLiBVbmxlc3MgYQogICAqIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkLCB0aGUgZXJyb3IgZnJvbSB0aGUgZmlyc3QgZmFpbGluZyBjb25uZWN0aW9uIGlzCiAgICogcmV0dXJuZWQuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIFJhd1N5bmNocm9ub3VzU29ja2V0IGNvbm5lY3RTeW5jKGhvc3QsIGludCBwb3J0KTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGFuZCB1bnJlYWQgYnl0ZXMgaW4gdGhlIHNvY2tldCB0aGF0IGNhbiBiZQogICAqIHJlYWQuCiAgICovCiAgaW50IGF2YWlsYWJsZSgpOwoKICAvKioKICAgKiBDbG9zZXMgdGhlIFtSYXdTeW5jaHJvbm91c1NvY2tldF0uCiAgICoKICAgKiBPbmNlIFtjbG9zZVN5bmNdIGhhcyBiZWVuIGNhbGxlZCwgYXR0ZW1wdGluZyB0byBjYWxsIFtyZWFkU3luY10sCiAgICogW3JlYWRJbnRvU3luY10sIFt3cml0ZUZyb21TeW5jXSwgW3JlbW90ZUFkZHJlc3NdLCBhbmQgW3JlbW90ZVBvcnRdIHdpbGwKICAgKiBjYXVzZSBhIFtTb2NrZXRFeGNlcHRpb25dIHRvIGJlIHRocm93bi4KICAgKi8KICB2b2lkIGNsb3NlU3luYygpOwoKICAvKioKICAgKiBSZWFkcyBpbnRvIGFuIGV4aXN0aW5nIFtMaXN0PGludD5dIGZyb20gdGhlIHNvY2tldCBpbnRvIHRoZSByYW5nZToKICAgKiBbW3N0YXJ0XSxbZW5kXSkuCiAgICoKICAgKiBSZWFkcyBpbnRvIGFuIGV4aXN0aW5nIFtMaXN0PGludD5dIGZyb20gdGhlIHNvY2tldC4gSWYgW3N0YXJ0XSBpcyBwcmVzZW50LAogICAqIHRoZSBieXRlcyB3aWxsIGJlIGZpbGxlZCBpbnRvIFtidWZmZXJdIGZyb20gaW5kZXggW3N0YXJ0XSwgb3RoZXJ3aXNlIGluZGV4CiAgICogMC4gSWYgW2VuZF0gaXMgcHJlc2VudCwgW2VuZF0gLSBbc3RhcnRdIGJ5dGVzIHdpbGwgYmUgcmVhZCBpbnRvIFtidWZmZXJdLAogICAqIG90aGVyd2lzZSB1cCB0byBbYnVmZmVyLmxlbmd0aF0uIElmIFtlbmRdID09IFtzdGFydF0sIG5vIGJ5dGVzIGFyZSByZWFkLgogICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgogICAqLwogIGludCByZWFkSW50b1N5bmMoTGlzdDxpbnQ+IGJ1ZmZlciwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKTsKCiAgLyoqCiAgICogUmVhZHMgdXAgdG8gW2J5dGVzXSBieXRlcyBmcm9tIHRoZSBzb2NrZXQuCiAgICoKICAgKiBCbG9ja3MgYW5kIHdhaXRzIGZvciBhIHJlc3BvbnNlIG9mIHVwIHRvIGEgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcwogICAqIHNlbnQgYnkgdGhlIHNvY2tldC4gW2J5dGVzXSBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvCiAgICogYmUgcmVhZC4gUmV0dXJucyB0aGUgbGlzdCBvZiBieXRlcyByZWFkLCB3aGljaCBjb3VsZCBiZSBsZXNzIHRoYW4gdGhlCiAgICogdmFsdWUgc3BlY2lmaWVkIGJ5IFtieXRlc10uCiAgICovCiAgTGlzdDxpbnQ+IHJlYWRTeW5jKGludCBieXRlcyk7CgogIC8qKgogICAqIFNodXRkb3duIGEgc29ja2V0IGluIHRoZSBwcm92aWRlZCBkaXJlY3Rpb24uCiAgICoKICAgKiBDYWxsaW5nIHNodXRkb3duIHdpbGwgbmV2ZXIgdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCBjYWxsaW5nIGl0IHNldmVyYWwgdGltZXMKICAgKiBpcyBzdXBwb3J0ZWQuIElmIGJvdGggW1NvY2tldERpcmVjdGlvbi5SRUNFSVZFXSBhbmQgW1NvY2tldERpcmVjdGlvbi5TRU5EXQogICAqIGRpcmVjdGlvbnMgYXJlIGNsb3NlZCwgdGhlIHNvY2tldCBpcyBjbG9zZWQgY29tcGxldGVseSwgdGhlIHNhbWUgYXMgaWYKICAgKiBbY2xvc2VTeW5jXSBoYXMgYmVlbiBjYWxsZWQuCiAgICovCiAgdm9pZCBzaHV0ZG93bihTb2NrZXREaXJlY3Rpb24gZGlyZWN0aW9uKTsKCiAgLyoqCiAgICogV3JpdGVzIGRhdGEgZnJvbSBhIHNwZWNpZmllZCByYW5nZSBpbiBhIFtMaXN0PGludD5dIHRvIHRoZSBzb2NrZXQuCiAgICoKICAgKiBXcml0ZXMgaW50byB0aGUgc29ja2V0IGZyb20gYSBbTGlzdDxpbnQ+XS4gSWYgW3N0YXJ0XSBpcyBwcmVzZW50LCB0aGUgYnl0ZXMKICAgKiB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIHNvY2tldCBzdGFydGluZyBmcm9tIGluZGV4IFtzdGFydF0uIElmIFtzdGFydF0gaXMKICAgKiBub3QgcHJlc2VudCwgdGhlIGJ5dGVzIHdpbGwgYmUgd3JpdHRlbiBzdGFydGluZyBmcm9tIGluZGV4IDAuIElmIFtlbmRdIGlzCiAgICogcHJlc2VudCwgdGhlIFtlbmRdIC0gW3N0YXJ0XSBieXRlcyB3aWxsIGJlIHdyaXR0ZW4gaW50byB0aGUgc29ja2V0IHN0YXJ0aW5nCiAgICogYXQgaW5kZXggW3N0YXJ0XS4gSWYgW2VuZF0gaXMgbm90IHByb3ZpZGVkLCBbYnVmZmVyLmxlbmd0aF0gZWxlbWVudHMgd2lsbAogICAqIGJlIHdyaXR0ZW4gdG8gdGhlIHNvY2tldCBzdGFydGluZyBmcm9tIGluZGV4IFtzdGFydF0uIElmIFtlbmRdID09IFtzdGFydF0sCiAgICogbm90aGluZyBoYXBwZW5zLgogICAqLwogIHZvaWQgd3JpdGVGcm9tU3luYyhMaXN0PGludD4gYnVmZmVyLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pOwoKICAvKioKICAgKiBUaGUgcG9ydCB1c2VkIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIGludCBnZXQgcG9ydDsKCiAgLyoqCiAgICogVGhlIHJlbW90ZSBwb3J0IGNvbm5lY3RlZCB0byBieSB0aGlzIHNvY2tldC4KICAgKi8KICBpbnQgZ2V0IHJlbW90ZVBvcnQ7CgogIC8qKgogICAqIFRoZSBbSW50ZXJuZXRBZGRyZXNzXSB1c2VkIHRvIGNvbm5lY3QgdGhpcyBzb2NrZXQuCiAgICovCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzOwoKICAvKioKICAgKiBUaGUgcmVtb3RlIFtJbnRlcm5ldEFkZHJlc3NdIGNvbm5lY3RlZCB0byBieSB0aGlzIHNvY2tldC4KICAgKi8KICBJbnRlcm5ldEFkZHJlc3MgZ2V0IHJlbW90ZUFkZHJlc3M7Cn0KbwBOTjwBEQEESANOT01LT0tLBCYGSwVNTUFQDwZEAQZPCwYTAQYoBUZNLQYUAQZIFgVQUE9OJwZAAQYwBUpKSyEGIQEGMgVRUEwiBiwBBkgFUU5PUU9QFgZCAQYjBhABBjIGFgEGOAYfAQY/BiUCARhkYXJ0OmlvL3N5bmNfc29ja2V0LmRhcnQob3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NsaS9jbGkuZGFydIE/Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyB7QGNhdGVnb3J5IFZNfQpsaWJyYXJ5IGRhcnQuY2xpOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0Om1hdGgnOwoKcGFydCAnd2FpdF9mb3IuZGFydCc7Cg0ATk48ARMSARUUARYBCGRhcnQ6Y2xpLW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jbGkvd2FpdF9mb3IuZGFydJhdLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jbGk7CgovKioKICogU3luY2hyb25vdXNseSBibG9ja3MgdGhlIGNhbGxpbmcgaXNvbGF0ZSB0byB3YWl0IGZvciBhc3luY2hyb25vdXMgZXZlbnRzIHRvCiAqIGNvbXBsZXRlLgogKgogKiBJZiB0aGUgW3RpbWVvdXRdIHBhcmFtZXRlciBpcyBzdXBwbGllZCwgW3dhaXRGb3JFdmVudF0gd2lsbCByZXR1cm4gYWZ0ZXIKICogdGhlIHNwZWNpZmllZCB0aW1lb3V0IGV2ZW4gaWYgbm8gZXZlbnRzIGhhdmUgb2NjdXJyZWQuCiAqCiAqIFRoaXMgY2FsbCBkb2VzIHRoZSBmb2xsb3dpbmc6CiAqIC0gc3VzcGVuZHMgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YWNrLAogKiAtIHJ1bnMgdGhlIG1pY3JvdGFzayBxdWV1ZSB1bnRpbCBpdCBpcyBlbXB0eSwKICogLSB3YWl0cyB1bnRpbCB0aGUgbWVzc2FnZSBxdWV1ZSBpcyBub3QgZW1wdHksCiAqIC0gaGFuZGxlcyBtZXNzYWdlcyBvbiB0aGUgbWVzc2FnZSBxdWV1ZSwgcGx1cyB0aGVpciBhc3NvY2lhdGVkIG1pY3JvdGFza3MsCiAqICAgdW50aWwgdGhlIG1lc3NhZ2UgcXVldWUgaXMgZW1wdHksCiAqIC0gcmVzdW1lcyB0aGUgb3JpZ2luYWwgc3RhY2suCiAqCiAqIFRoaXMgZnVuY3Rpb24gYnJlYWtzIHRoZSB1c3VhbCBwcm9taXNlIG9mZmVyZWQgYnkgRGFydCBzZW1hbnRpY3MgdGhhdAogKiBtZXNzYWdlIGhhbmRsZXJzIGFuZCBtaWNyb3Rhc2tzIHJ1biB0byBjb21wbGV0aW9uIGJlZm9yZSB0aGUgbmV4dCBtZXNzYWdlCiAqIGhhbmRsZXIgb3IgbWljcm90YXNrIGJlZ2lucyB0byBydW4uIE9mIHBhcnRpY3VsYXIgbm90ZSBpcyB0aGF0IHVzZSBvZiB0aGlzCiAqIGZ1bmN0aW9uIGluIGEgZmluYWxseSBibG9jayB3aWxsIGFsbG93IG1pY3JvdGFza3MgYW5kIG1lc3NhZ2UgaGFuZGxlcnMgdG8KICogcnVuIGJlZm9yZSBhbGwgZmluYWxseSBibG9ja3MgZm9yIGFuIGV4Y2VwdGlvbiBoYXZlIGNvbXBsZXRlZCwgcG9zc2libHkKICogYnJlYWtpbmcgaW52YXJpYW50cyBpbiB5b3VyIHByb2dyYW0uCiAqCiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzeW5jaHJvbm91c2x5IHRocm93IHRoZSBmaXJzdCB1bmhhbmRsZWQgZXhjZXB0aW9uIGl0CiAqIGVuY291bnRlcnMgaW4gcnVubmluZyB0aGUgbWljcm90YXNrcyBhbmQgbWVzc2FnZSBoYW5kbGVycyBhcyB0aG91Z2ggdGhlCiAqIHRocm93aW5nIG1pY3JvdGFzayBvciBtZXNzYWdlIGhhbmRsZXIgd2FzIHRoZSBvbmx5IERhcnQgaW52b2NhdGlvbiBvbiB0aGUKICogc3RhY2suIFRoYXQgaXMsIHVuaGFuZGxlZCBleGNlcHRpb25zIGluIGEgbWljcm90YXNrIG9yIG1lc3NhZ2UgaGFuZGxlciB3aWxsCiAqIHNraXAgb3ZlciBzdGFja3Mgc3VzcGVuZGVkIGluIGEgY2FsbCB0byBbd2FpdEZvckV2ZW50XS4KICoKICogQ2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBtYXkgYmUgbmVzdGVkLiBFYXJsaWVyIGludm9jYXRpb25zIHdpbGwgbm90CiAqIGJlIGFibGUgdG8gY29tcGxldGUgdW50aWwgc3Vic2VxdWVudCBvbmVzIGRvLiBNZXNzYWdlcyB0aGF0IGFycml2ZSBhZnRlcgogKiBhIHN1YnNlcXVlbnQgaW52b2NhdGlvbiBhcmUgImNvbnN1bWVkIiBieSB0aGF0IGludm9jYXRpb24sIGFuZCBkbyBub3QKICogdW5ibG9jayBhbiBlYXJsaWVyIGludm9jYXRpb24uIFBsZWFzZSBiZSBhd2FyZSB0aGF0IG5lc3RpbmcgY2FsbHMgdG8KICogW3dhaXRGb3JFdmVudF0gY2FuIGxlYWQgdG8gZGVhZGxvY2sgd2hlbiBzdWJzZXF1ZW50IGNhbGxzIGJsb2NrIHRvIHdhaXQgZm9yCiAqIGEgY29uZGl0aW9uIHRoYXQgaXMgb25seSBzYXRpc2ZpZWQgYWZ0ZXIgYW4gZWFybGllciBjYWxsIHJldHVybnMuCiAqCiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBjYWxsIGlzIG9ubHkgYXZhaWxhYmxlIGluIHRoZSBzdGFuZGFsb25lIGNvbW1hbmQtbGluZQogKiBEYXJ0IFZNLiBGdXJ0aGVyLCBiZWNhdXNlIGl0IHN1c3BlbmRzIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGFjayB1bnRpbCB0aGUKICogbWVzc2FnZSBxdWV1ZSBpcyBlbXB0eSwgZXZlbiB3aGVuIHJ1bm5pbmcgaW4gdGhlIHN0YW5kYWxvbmUgY29tbWFuZC1saW5lIFZNCiAqIHRoZXJlIGV4aXN0cyBhIHJpc2sgdGhhdCB0aGUgY3VycmVudCBleGVjdXRpb24gc3RhY2sgd2lsbCBiZSBzdGFydmVkLgogKi8KZXh0ZXJuYWwgdm9pZCBfd2FpdEZvckV2ZW50KGludCB0aW1lb3V0TWlsbGlzKTsKCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKdm9pZCBGdW5jdGlvbihpbnQpIF9nZXRXYWl0Rm9yRXZlbnQoKSA9PiBfd2FpdEZvckV2ZW50OwoKLy8gVGhpcyBzaG91bGQgYmUgc2V0IGZyb20gQysrIGNvZGUgYnkgdGhlIGVtYmVkZGVyIHRvIHdpcmUgdXAgd2FpdEZvcigpIHRvIHRoZQovLyBuYXRpdmUgaW1wbGVtZW50YXRpb24uIEluIHRoZSBzdGFuZGFsb25lIFZNIHRoaXMgaXMgc2V0IHRvIF93YWl0Rm9yRXZlbnQoKQovLyBhYm92ZS4gSWYgaXQgaXMgbnVsbCwgY2FsbGluZyB3YWl0Rm9yKCkgd2lsbCB0aHJvdyBhbiBVbnN1cHBvcnRlZEVycm9yLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCnZvaWQgRnVuY3Rpb24oaW50KSBfd2FpdEZvckV2ZW50Q2xvc3VyZTsKCmNsYXNzIF9XYWl0Rm9yVXRpbHMgewogIHN0YXRpYyB2b2lkIHdhaXRGb3JFdmVudCh7RHVyYXRpb24gdGltZW91dH0pIHsKICAgIGlmIChfd2FpdEZvckV2ZW50Q2xvc3VyZSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJ3YWl0Rm9yIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbWJlZGRlciIpOwogICAgfQogICAgX3dhaXRGb3JFdmVudENsb3N1cmUodGltZW91dCA9PSBudWxsID8gMCA6IG1heCgxLCB0aW1lb3V0LmluTWlsbGlzZWNvbmRzKSk7CiAgfQp9CgovKioKICogU3VzcGVuZHMgdGhlIHN0YWNrLCBydW5zIG1pY3JvdGFza3MsIGFuZCBoYW5kbGVzIGluY29taW5nIGV2ZW50cyB1bnRpbAogKiBbZnV0dXJlXSBjb21wbGV0ZXMuCiAqCiAqIFdBUk5JTkc6IEVYUEVSSU1FTlRBTC4gVVNFIEFUIFlPVVIgT1dOIFJJU0suCiAqCiAqIFRoaXMgY2FsbCBkb2VzIHRoZSBmb2xsb3dpbmc6CiAqIC0gV2hpbGUgW2Z1dHVyZV0gaXMgbm90IGNvbXBsZXRlZDoKICogICAtIHN1c3BlbmRzIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGFjaywKICogICAtIHJ1bnMgdGhlIG1pY3JvdGFzayBxdWV1ZSB1bnRpbCBpdCBpcyBlbXB0eSwKICogICAtIHdhaXRzIHVudGlsIHRoZSBtZXNzYWdlIHF1ZXVlIGlzIG5vdCBlbXB0eSwKICogICAtIGhhbmRsZXMgbWVzc2FnZXMgb24gdGhlIG1lc3NhZ2UgcXVldWUsIHBsdXMgdGhlaXIgYXNzb2NpYXRlZCBtaWNyb3Rhc2tzLAogKiAgICAgdW50aWwgdGhlIG1lc3NhZ2UgcXVldWUgaXMgZW1wdHksCiAqICAgLSByZXN1bWVzIHRoZSBvcmlnaW5hbCBzdGFjay4KICoKICogVGhpcyBmdW5jdGlvbiBicmVha3MgdGhlIHVzdWFsIHByb21pc2Ugb2ZmZXJlZCBieSBEYXJ0IHNlbWFudGljcyB0aGF0CiAqIG1lc3NhZ2UgaGFuZGxlcnMgYW5kIG1pY3JvdGFza3MgcnVuIHRvIGNvbXBsZXRpb24gYmVmb3JlIHRoZSBuZXh0IG1lc3NhZ2UKICogaGFuZGxlciBvciBtaWNyb3Rhc2sgYmVnaW5zIHRvIHJ1bi4gT2YgcGFydGljdWxhciBub3RlIGlzIHRoYXQgdXNlIG9mIHRoaXMKICogZnVuY3Rpb24gaW4gYSBmaW5hbGx5IGJsb2NrIHdpbGwgYWxsb3cgbWljcm90YXNrcyBhbmQgbWVzc2FnZSBoYW5kbGVycyB0bwogKiBydW4gYmVmb3JlIGFsbCBmaW5hbGx5IGJsb2NrcyBmb3IgYW4gZXhjZXB0aW9uIGhhdmUgY29tcGxldGVkLCBwb3NzaWJseQogKiBicmVha2luZyBpbnZhcmlhbnRzIGluIHlvdXIgcHJvZ3JhbS4KICoKICogVXNlIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBsYXN0IHJlc29ydCB3aGVuIGl0IGlzIG5vdAogKiBwb3NzaWJsZSB0byBjb252ZXJ0IGEgRGFydCBwcm9ncmFtIGVudGlyZWx5IHRvIGFuIGFzeW5jaHJvbm91cyBzdHlsZSB1c2luZwogKiBgYXN5bmNgIGFuZCBgYXdhaXRgLgogKgogKiBJZiB0aGUgW0Z1dHVyZV0gY29tcGxldGVzIG5vcm1hbGx5LCBpdHMgcmVzdWx0IGlzIHJldHVybmVkLiBJZiB0aGUgW0Z1dHVyZV0KICogY29tcGxldGVzIHdpdGggYW4gZXJyb3IsIHRoZSBlcnJvciBhbmQgc3RhY2sgdHJhY2UgYXJlIHdyYXBwZWQgaW4gYW4KICogW0FzeW5jRXJyb3JdIGFuZCB0aHJvd24uIElmIGEgbWljcm90YXNrIG9yIG1lc3NhZ2UgaGFuZGxlciBydW4gZHVyaW5nIHRoaXMKICogY2FsbCByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24sIHRoYXQgZXhjZXB0aW9uIHdpbGwgYmUgcHJvcGFnYXRlZAogKiBhcyB0aG91Z2ggdGhlIG1pY3JvdGFzayBvciBtZXNzYWdlIGhhbmRsZXIgd2FzIHRoZSBvbmx5IERhcnQgaW52b2NhdGlvbiBvbgogKiB0aGUgc3RhY2suIFRoYXQgaXMsIHVuaGFuZGxlZCBleGNlcHRpb25zIGluIGEgbWljcm90YXNrIG9yIG1lc3NhZ2UgaGFuZGxlcgogKiB3aWxsIHNraXAgb3ZlciBzdGFja3Mgc3VzcGVuZGVkIGluIGEgY2FsbCB0byBbd2FpdEZvcl0uCiAqCiAqIElmIHRoZSBvcHRpb25hbCBgdGltZW91dGAgcGFyYW1ldGVyIGlzIHBhc3NlZCwgW3dhaXRGb3JdIHRocm93cyBhCiAqIFtUaW1lb3V0RXhjZXB0aW9uXSBpZiB0aGUgW0Z1dHVyZV0gaXMgbm90IGNvbXBsZXRlZCB3aXRoaW4gdGhlIHNwZWNpZmllZAogKiBwZXJpb2QuCiAqCiAqIENhbGxzIHRvIFt3YWl0Rm9yXSBtYXkgYmUgbmVzdGVkLiBFYXJsaWVyIGludm9jYXRpb25zIHdpbGwgbm90IGNvbXBsZXRlCiAqIHVudGlsIHN1YnNlcXVlbnQgb25lcyBkbywgYnV0IHRoZSBjb21wbGV0aW9uIG9mIGEgc3Vic2VxdWVudCBpbnZvY2F0aW9uIHdpbGwKICogY2F1c2UgdGhlIHByZXZpb3VzIGludm9jYXRpb24gdG8gd2FrZSB1cCBhbmQgY2hlY2sgaXRzIFtGdXR1cmVdIGZvcgogKiBjb21wbGV0aW9uLgogKgogKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCBuZXN0aW5nIGNhbGxzIHRvIFt3YWl0Rm9yXSBjYW4gbGVhZCB0byBkZWFkbG9jayBpZgogKiBzdWJzZXF1ZW50IGNhbGxzIGJsb2NrIHdhaXRpbmcgZm9yIGEgY29uZGl0aW9uIHRoYXQgaXMgb25seSBzYXRpc2ZpZWQgd2hlbgogKiBhbiBlYXJsaWVyIGNhbGwgcmV0dXJucy4KICovClQgd2FpdEZvcjxUPihGdXR1cmU8VD4gZnV0dXJlLCB7RHVyYXRpb24gdGltZW91dH0pIHsKICBUIHJlc3VsdDsKICBib29sIGZ1dHVyZUNvbXBsZXRlZCA9IGZhbHNlOwogIE9iamVjdCBlcnJvcjsKICBTdGFja1RyYWNlIHN0YWNrdHJhY2U7CiAgZnV0dXJlLnRoZW4oKHIpIHsKICAgIGZ1dHVyZUNvbXBsZXRlZCA9IHRydWU7CiAgICByZXN1bHQgPSByOwogIH0sIG9uRXJyb3I6IChlLCBzdCkgewogICAgZXJyb3IgPSBlOwogICAgc3RhY2t0cmFjZSA9IHN0OwogIH0pOwoKICBTdG9wd2F0Y2ggczsKICBpZiAodGltZW91dCAhPSBudWxsKSB7CiAgICBzID0gbmV3IFN0b3B3YXRjaCgpLi5zdGFydCgpOwogIH0KICBUaW1lci5ydW4oKCkge30pOyAvLyBFbnVzcmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG1lc3NhZ2UuCiAgd2hpbGUgKCFmdXR1cmVDb21wbGV0ZWQgJiYgKGVycm9yID09IG51bGwpKSB7CiAgICBEdXJhdGlvbiByZW1haW5pbmc7CiAgICBpZiAodGltZW91dCAhPSBudWxsKSB7CiAgICAgIGlmIChzLmVsYXBzZWQgPj0gdGltZW91dCkgewogICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJ3YWl0Rm9yKCkgdGltZWQgb3V0IiwgdGltZW91dCk7CiAgICAgIH0KICAgICAgcmVtYWluaW5nID0gdGltZW91dCAtIHMuZWxhcHNlZDsKICAgIH0KICAgIF9XYWl0Rm9yVXRpbHMud2FpdEZvckV2ZW50KHRpbWVvdXQ6IHJlbWFpbmluZyk7CiAgfQogIGlmICh0aW1lb3V0ICE9IG51bGwpIHsKICAgIHMuc3RvcCgpOwogIH0KICBUaW1lci5ydW4oKCkge30pOyAvLyBFbnN1cmUgdGhhdCBwcmV2aW91cyBjYWxscyB0byB3YWl0Rm9yIGFyZSB3b2tlbiB1cC4KCiAgaWYgKGVycm9yICE9IG51bGwpIHsKICAgIHRocm93IG5ldyBBc3luY0Vycm9yKGVycm9yLCBzdGFja3RyYWNlKTsKICB9CgogIHJldHVybiByZXN1bHQ7Cn0KgJoATk48ARIBBE8NA0w6AyErMTFOJyEDSU1OTUsoA0tLTU87A0ZMSUhPRQNPT09JBDABGjgBUE5LGikBFjEoTwZQBAIBBEoXAzADISYtMzNQKSMDSU1OTUsoA0pOGANPSE5NTk47A0VMCwNLUEcPA0tOHAQ1DCAQGRQcEBgPFQYBDxkiBD0wGBsiRAgnBjQEGQ4ESwEXLQQBEQIBFmRhcnQ6Y2xpL3dhaXRfZm9yLmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2Jpbi9jbGlfcGF0Y2guZGFydIFGLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgcGF0Y2g7CgpAcGF0Y2gKdm9pZCBfd2FpdEZvckV2ZW50KGludCB0aW1lb3V0TWlsbGlzKSBuYXRpdmUgIkNMSV9XYWl0Rm9yRXZlbnQiOwoKAE5OPAEkAQdBAR1kYXJ0OmNsaS1wYXRjaC9jbGlfcGF0Y2guZGFydCpvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9jb3JlLmRhcnSZ7S8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovKioKICoKICogQnVpbHQtaW4gdHlwZXMsIGNvbGxlY3Rpb25zLAogKiBhbmQgb3RoZXIgY29yZSBmdW5jdGlvbmFsaXR5IGZvciBldmVyeSBEYXJ0IHByb2dyYW0uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBhdXRvbWF0aWNhbGx5IGltcG9ydGVkLgogKgogKiBTb21lIGNsYXNzZXMgaW4gdGhpcyBsaWJyYXJ5LAogKiBzdWNoIGFzIFtTdHJpbmddIGFuZCBbbnVtXSwKICogc3VwcG9ydCBEYXJ0J3MgYnVpbHQtaW4gZGF0YSB0eXBlcy4KICogT3RoZXIgY2xhc3Nlcywgc3VjaCBhcyBbTGlzdF0gYW5kIFtNYXBdLCBwcm92aWRlIGRhdGEgc3RydWN0dXJlcwogKiBmb3IgbWFuYWdpbmcgY29sbGVjdGlvbnMgb2Ygb2JqZWN0cy4KICogQW5kIHN0aWxsIG90aGVyIGNsYXNzZXMgcmVwcmVzZW50IGNvbW1vbmx5IHVzZWQgdHlwZXMgb2YgZGF0YQogKiBzdWNoIGFzIFVSSXMsIGRhdGVzIGFuZCB0aW1lcywgYW5kIGVycm9ycy4KICoKICogIyMgTnVtYmVycyBhbmQgYm9vbGVhbnMKICoKICogW2ludF0gYW5kIFtkb3VibGVdIHByb3ZpZGUgc3VwcG9ydCBmb3IgRGFydCdzIGJ1aWx0LWluIG51bWVyaWNhbCBkYXRhIHR5cGVzOgogKiBpbnRlZ2VycyBhbmQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzLCByZXNwZWN0aXZlbHkuCiAqIEFuIG9iamVjdCBvZiB0eXBlIFtib29sXSBpcyBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KICogVmFyaWFibGVzIG9mIHRoZXNlIHR5cGVzIGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIGxpdGVyYWxzOgogKgogKiAgICAgaW50IG1lYW5pbmdPZkxpZmUgPSA0MjsKICogICAgIGRvdWJsZSB2YWx1ZU9mUGkgID0gMy4xNDE1OTI7CiAqICAgICBib29sIHZpc2libGUgICAgICA9IHRydWU7CiAqCiAqICMjIFN0cmluZ3MgYW5kIHJlZ3VsYXIgZXhwcmVzc2lvbnMKICoKICogQSBbU3RyaW5nXSBpcyBpbW11dGFibGUgYW5kIHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLgogKgogKiAgICAgU3RyaW5nIHNoYWtlc3BlYXJlUXVvdGUgPSAiQWxsIHRoZSB3b3JsZCdzIGEgc3RhZ2UsIC4uLiI7CiAqCiAqIFtTdHJpbmdCdWZmZXJdIHByb3ZpZGVzIGEgd2F5IHRvIGNvbnN0cnVjdCBzdHJpbmdzIGVmZmljaWVudGx5LgogKgogKiAgICAgU3RyaW5nQnVmZmVyIG1vcmVTaGFrZXNwZWFyZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICogICAgIG1vcmVTaGFrZXNwZWFyZS53cml0ZSgnQW5kIGFsbCB0aGUgbWVuIGFuZCB3b21lbiAnKTsKICogICAgIG1vcmVTaGFrZXNwZWFyZS53cml0ZSgnbWVyZWx5IHBsYXllcnM7IC4uLicpOwogKgogKiBUaGUgU3RyaW5nIGFuZCBTdHJpbmdCdWZmZXIgY2xhc3NlcyBpbXBsZW1lbnQgc3RyaW5nIGNvbmNhdGVuYXRpb24sCiAqIGludGVycG9sYXRpb24sIGFuZCBvdGhlciBzdHJpbmcgbWFuaXB1bGF0aW9uIGZlYXR1cmVzLgogKgogKiAgICAgU3RyaW5nIHBoaWxvc29waHkgPSAnTGl2ZSBvbiAnOwogKiAgICAgU3RyaW5nIGdldCBwYWxpbmRyb21lID0+IHBoaWxvc29waHkgKyBwaGlsb3NvcGh5LnNwbGl0KCcnKS5yZXZlcnNlZC5qb2luKCk7CiAqCiAqIFtSZWdFeHBdIGltcGxlbWVudHMgRGFydCByZWd1bGFyIGV4cHJlc3Npb25zLAogKiB3aGljaCBwcm92aWRlIGEgZ3JhbW1hciBmb3IgbWF0Y2hpbmcgcGF0dGVybnMgd2l0aGluIHRleHQuCiAqIEZvciBleGFtcGxlLCBoZXJlJ3MgYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzCiAqIGEgc3RyaW5nIG9mIG9uZSBvciBtb3JlIGRpZ2l0czoKICoKICogICAgIHZhciBudW1iZXJzID0gbmV3IFJlZ0V4cChyJ1xkKycpOwogKgogKiBEYXJ0IHJlZ3VsYXIgZXhwcmVzc2lvbnMgaGF2ZSB0aGUgc2FtZSBzeW50YXggYW5kIHNlbWFudGljcyBhcwogKiBKYXZhU2NyaXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMuIFNlZQogKiA8aHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuMTA+CiAqIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBvZiBKYXZhU2NyaXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMuCiAqCiAqICMjIENvbGxlY3Rpb25zCiAqCiAqIFRoZSBkYXJ0OmNvcmUgbGlicmFyeSBwcm92aWRlcyBiYXNpYyBjb2xsZWN0aW9ucywKICogc3VjaCBhcyBbTGlzdF0sIFtNYXBdLCBhbmQgW1NldF0uCiAqCiAqIEEgTGlzdCBpcyBhbiBvcmRlcmVkIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cywgd2l0aCBhIGxlbmd0aC4KICogTGlzdHMgYXJlIHNvbWV0aW1lcyBjYWxsZWQgYXJyYXlzLgogKiBVc2UgYSBMaXN0IHdoZW4geW91IG5lZWQgdG8gYWNjZXNzIG9iamVjdHMgYnkgaW5kZXguCiAqCiAqICAgICBMaXN0IHN1cGVyaGVyb2VzID0gWyAnQmF0bWFuJywgJ1N1cGVybWFuJywgJ0hhcnJ5IFBvdHRlcicgXTsKICoKICogQSBTZXQgaXMgYW4gdW5vcmRlcmVkIGNvbGxlY3Rpb24gb2YgdW5pcXVlIG9iamVjdHMuCiAqIFlvdSBjYW5ub3QgZ2V0IGFuIGl0ZW0gYnkgaW5kZXggKHBvc2l0aW9uKS4KICogQWRkaW5nIGEgZHVwbGljYXRlIGl0ZW0gaGFzIG5vIGVmZmVjdC4KICoKICogICAgIFNldCB2aWxsYWlucyA9IG5ldyBTZXQoKTsKICogICAgIHZpbGxhaW5zLmFkZCgnSm9rZXInKTsKICogICAgIHZpbGxhaW5zLmFkZEFsbCggWydMZXggTHV0aGVyJywgJ1ZvbGRlbW9ydCddICk7CiAqCiAqIEEgTWFwIGlzIGFuIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIGtleS12YWx1ZSBwYWlycy4KICogTWFwcyBhcmUgc29tZXRpbWVzIGNhbGxlZCBhc3NvY2lhdGl2ZSBhcnJheXMgYmVjYXVzZQogKiBtYXBzIGFzc29jaWF0ZSBhIGtleSB0byBzb21lIHZhbHVlIGZvciBlYXN5IHJldHJpZXZhbC4KICogS2V5cyBhcmUgdW5pcXVlLgogKiBVc2UgYSBNYXAgd2hlbiB5b3UgbmVlZCB0byBhY2Nlc3Mgb2JqZWN0cwogKiBieSBhIHVuaXF1ZSBpZGVudGlmaWVyLgogKgogKiAgICAgTWFwIHNpZGVraWNrcyA9IHsgJ0JhdG1hbic6ICdSb2JpbicsCiAqICAgICAgICAgICAgICAgICAgICAgICAnU3VwZXJtYW4nOiAnTG9pcyBMYW5lJywKICogICAgICAgICAgICAgICAgICAgICAgICdIYXJyeSBQb3R0ZXInOiAnUm9uIGFuZCBIZXJtaW9uZScgfTsKICoKICogSW4gYWRkaXRpb24gdG8gdGhlc2UgY2xhc3NlcywKICogZGFydDpjb3JlIGNvbnRhaW5zIFtJdGVyYWJsZV0sCiAqIGFuIGludGVyZmFjZSB0aGF0IGRlZmluZXMgZnVuY3Rpb25hbGl0eQogKiBjb21tb24gaW4gY29sbGVjdGlvbnMgb2Ygb2JqZWN0cy4KICogRXhhbXBsZXMgaW5jbHVkZSB0aGUgYWJpbGl0eQogKiB0byBydW4gYSBmdW5jdGlvbiBvbiBlYWNoIGVsZW1lbnQgaW4gdGhlIGNvbGxlY3Rpb24sCiAqIHRvIGFwcGx5IGEgdGVzdCB0byBlYWNoIGVsZW1lbnQsCiAqIHRvIHJldHJpZXZlIGFuIG9iamVjdCwgYW5kIHRvIGRldGVybWluZSBsZW5ndGguCiAqCiAqIEl0ZXJhYmxlIGlzIGltcGxlbWVudGVkIGJ5IExpc3QgYW5kIFNldCwKICogYW5kIHVzZWQgYnkgTWFwIGZvciBpdHMga2V5cyBhbmQgdmFsdWVzLgogKgogKiBGb3Igb3RoZXIga2luZHMgb2YgY29sbGVjdGlvbnMsIGNoZWNrIG91dCB0aGUKICogYGRhcnQ6Y29sbGVjdGlvbmAgbGlicmFyeS4KICoKICogIyMgRGF0ZSBhbmQgdGltZQogKgogKiBVc2UgW0RhdGVUaW1lXSB0byByZXByZXNlbnQgYSBwb2ludCBpbiB0aW1lCiAqIGFuZCBbRHVyYXRpb25dIHRvIHJlcHJlc2VudCBhIHNwYW4gb2YgdGltZS4KICoKICogWW91IGNhbiBjcmVhdGUgRGF0ZVRpbWUgb2JqZWN0cyB3aXRoIGNvbnN0cnVjdG9ycwogKiBvciBieSBwYXJzaW5nIGEgY29ycmVjdGx5IGZvcm1hdHRlZCBzdHJpbmcuCiAqCiAqICAgICBEYXRlVGltZSBub3cgPSBuZXcgRGF0ZVRpbWUubm93KCk7CiAqICAgICBEYXRlVGltZSBiZXJsaW5XYWxsRmVsbCA9IG5ldyBEYXRlVGltZSgxOTg5LCAxMSwgOSk7CiAqICAgICBEYXRlVGltZSBtb29uTGFuZGluZyA9IERhdGVUaW1lLnBhcnNlKCIxOTY5LTA3LTIwIik7CiAqCiAqIENyZWF0ZSBhIER1cmF0aW9uIG9iamVjdCBzcGVjaWZ5aW5nIHRoZSBpbmRpdmlkdWFsIHRpbWUgdW5pdHMuCiAqCiAqICAgICBEdXJhdGlvbiB0aW1lUmVtYWluaW5nID0gbmV3IER1cmF0aW9uKGhvdXJzOjU2LCBtaW51dGVzOjE0KTsKICoKICogSW4gYWRkaXRpb24gdG8gRGF0ZVRpbWUgYW5kIER1cmF0aW9uLAogKiBkYXJ0OmNvcmUgY29udGFpbnMgdGhlIFtTdG9wd2F0Y2hdIGNsYXNzIGZvciBtZWFzdXJpbmcgZWxhcHNlZCB0aW1lLgogKgogKiAjIyBVcmkKICoKICogQSBbVXJpXSBvYmplY3QgcmVwcmVzZW50cyBhIHVuaWZvcm0gcmVzb3VyY2UgaWRlbnRpZmllciwKICogd2hpY2ggaWRlbnRpZmllcyBhIHJlc291cmNlIG9uIHRoZSB3ZWIuCiAqCiAqICAgICBVcmkgZGFydGxhbmcgPSBVcmkucGFyc2UoJ2h0dHA6Ly9kYXJ0bGFuZy5vcmcvJyk7CiAqCiAqICMjIEVycm9ycwogKgogKiBUaGUgW0Vycm9yXSBjbGFzcyByZXByZXNlbnRzIHRoZSBvY2N1cnJlbmNlIG9mIGFuIGVycm9yCiAqIGR1cmluZyBydW50aW1lLgogKiBTdWJjbGFzc2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IHNwZWNpZmljIGtpbmRzIG9mIGVycm9ycy4KICoKICogIyMgT3RoZXIgZG9jdW1lbnRhdGlvbgogKgogKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gdXNlIHRoZSBidWlsdC1pbiB0eXBlcywgcmVmZXIgdG8gW0J1aWx0LWluCiAqIFR5cGVzXShodHRwOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvY29udGVudHMvY2gwMi5odG1sI2J1aWx0LWluLXR5cGVzKQogKiBpbiBDaGFwdGVyIDIgb2YKICogW0RhcnQ6IFVwIGFuZCBSdW5uaW5nXShodHRwOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvKS4KICoKICogQWxzbywgc2VlIFtkYXJ0OmNvcmUgLSBOdW1iZXJzLCBDb2xsZWN0aW9ucywgU3RyaW5ncywgYW5kCiAqIE1vcmVdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvY2gwMy5odG1sI2RhcnRjb3JlLS0tbnVtYmVycy1jb2xsZWN0aW9ucy1zdHJpbmdzLWFuZC1tb3JlKQogKiBmb3IgbW9yZSBjb3ZlcmFnZSBvZiBjbGFzc2VzIGluIHRoaXMgcGFja2FnZS4KICoKICogVGhlCiAqIFtEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb25dKGh0dHA6Ly93d3cuZGFydGxhbmcub3JnL2RvY3Mvc3BlYy8pCiAqIHByb3ZpZGVzIHRlY2huaWNhbCBkZXRhaWxzLgogKgogKiB7QGNhdGVnb3J5IENvcmV9CiAqLwpsaWJyYXJ5IGRhcnQuY29yZTsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIjsKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgaGlkZSBTeW1ib2wsIExpbmtlZExpc3QsIExpbmtlZExpc3RFbnRyeTsKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgYXMgaW50ZXJuYWwgc2hvdyBTeW1ib2w7CmltcG9ydCAiZGFydDpjb252ZXJ0IgogICAgc2hvdwogICAgICAgIGFzY2lpLAogICAgICAgIGJhc2U2NCwKICAgICAgICBCYXNlNjRDb2RlYywKICAgICAgICBFbmNvZGluZywKICAgICAgICBsYXRpbjEsCiAgICAgICAgU3RyaW5nQ29udmVyc2lvblNpbmssCiAgICAgICAgdXRmODsKaW1wb3J0ICJkYXJ0Om1hdGgiIHNob3cgUmFuZG9tOyAvLyBVc2VkIGJ5IExpc3Quc2h1ZmZsZS4KaW1wb3J0ICJkYXJ0OnR5cGVkX2RhdGEiIHNob3cgVWludDhMaXN0LCBVaW50MTZMaXN0LCBFbmRpYW47CgpAU2luY2UoIjIuMSIpCmV4cG9ydCAiZGFydDphc3luYyIgc2hvdyBGdXR1cmUsIFN0cmVhbTsKCnBhcnQgImFubm90YXRpb25zLmRhcnQiOwpwYXJ0ICJiaWdpbnQuZGFydCI7CnBhcnQgImJvb2wuZGFydCI7CnBhcnQgImNvbXBhcmFibGUuZGFydCI7CnBhcnQgImRhdGVfdGltZS5kYXJ0IjsKcGFydCAiZG91YmxlLmRhcnQiOwpwYXJ0ICJkdXJhdGlvbi5kYXJ0IjsKcGFydCAiZXJyb3JzLmRhcnQiOwpwYXJ0ICJleGNlcHRpb25zLmRhcnQiOwpwYXJ0ICJleHBhbmRvLmRhcnQiOwpwYXJ0ICJmdW5jdGlvbi5kYXJ0IjsKcGFydCAiaWRlbnRpY2FsLmRhcnQiOwpwYXJ0ICJpbnQuZGFydCI7CnBhcnQgImludm9jYXRpb24uZGFydCI7CnBhcnQgIml0ZXJhYmxlLmRhcnQiOwpwYXJ0ICJpdGVyYXRvci5kYXJ0IjsKcGFydCAibGlzdC5kYXJ0IjsKcGFydCAibWFwLmRhcnQiOwpwYXJ0ICJudWxsLmRhcnQiOwpwYXJ0ICJudW0uZGFydCI7CnBhcnQgIm9iamVjdC5kYXJ0IjsKcGFydCAicGF0dGVybi5kYXJ0IjsKcGFydCAicHJpbnQuZGFydCI7CnBhcnQgInJlZ2V4cC5kYXJ0IjsKcGFydCAic2V0LmRhcnQiOwpwYXJ0ICJzaW5rLmRhcnQiOwpwYXJ0ICJzdGFja3RyYWNlLmRhcnQiOwpwYXJ0ICJzdG9wd2F0Y2guZGFydCI7CnBhcnQgInN0cmluZy5kYXJ0IjsKcGFydCAic3RyaW5nX2J1ZmZlci5kYXJ0IjsKcGFydCAic3RyaW5nX3NpbmsuZGFydCI7CnBhcnQgInN5bWJvbC5kYXJ0IjsKcGFydCAidHlwZS5kYXJ0IjsKcGFydCAidXJpLmRhcnQiOwqA0gBOTjwBBAMgOAMrAyEfJ0QoQS4DGwNQRzU+Ax8lIQMmA0QDQQNDAzo8NQNHOgMnUwMxPjkjAykDQic7PAMSAzUlAz4mOANEAzcvKgMhHjcDODg6FC0bAywyPwMhIislIDgkMwMsLAMxHgMUAy8vAzUvAyo8PANCA0QDKUgDCgM8KwM5Aw0DOxNAAxoDUF4TTgM9djEDB0UfAxQEEwEaQjEWCQ8QFRIQHg45PQEOKQEZFBIYFxQWFBgVFhcRGBYWEhESERQVExQREhgXFBsZFBIRAQlkYXJ0OmNvcmUwb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvY29tcGFyYWJsZS5kYXJ0jlUvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogVGhlIHNpZ25hdHVyZSBvZiBhIGdlbmVyaWMgY29tcGFyaXNvbiBmdW5jdGlvbi4KICoKICogQSBjb21wYXJpc29uIGZ1bmN0aW9uIHJlcHJlc2VudHMgYW4gb3JkZXJpbmcgb24gYSB0eXBlIG9mIG9iamVjdHMuCiAqIEEgdG90YWwgb3JkZXJpbmcgb24gYSB0eXBlIG1lYW5zIHRoYXQgZm9yIHR3byB2YWx1ZXMsIGVpdGhlciB0aGV5CiAqIGFyZSBlcXVhbCBvciBvbmUgaXMgZ3JlYXRlciB0aGFuIHRoZSBvdGhlciAoYW5kIHRoZSBsYXR0ZXIgbXVzdCB0aGVuIGJlCiAqIHNtYWxsZXIgdGhhbiB0aGUgZm9ybWVyKS4KICoKICogQSBbQ29tcGFyYXRvcl0gZnVuY3Rpb24gcmVwcmVzZW50cyBzdWNoIGEgdG90YWwgb3JkZXJpbmcgYnkgcmV0dXJuaW5nCiAqCiAqICogYSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIFthXSBpcyBzbWFsbGVyIHRoYW4gW2JdLAogKiAqIHplcm8gaWYgW2FdIGlzIGVxdWFsIHRvIFtiXSwgYW5kCiAqICogYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIFthXSBpcyBncmVhdGVyIHRoYW4gW2JdLgogKi8KdHlwZWRlZiBDb21wYXJhdG9yPFQ+ID0gaW50IEZ1bmN0aW9uKFQgYSwgVCBiKTsKCi8qKgogKiBJbnRlcmZhY2UgdXNlZCBieSB0eXBlcyB0aGF0IGhhdmUgYW4gaW50cmluc2ljIG9yZGVyaW5nLgogKgogKiBUaGUgW2NvbXBhcmVUb10gb3BlcmF0aW9uIGRlZmluZXMgYSB0b3RhbCBvcmRlcmluZyBvZiBvYmplY3RzLAogKiB3aGljaCBjYW4gYmUgdXNlZCBmb3Igb3JkZXJpbmcgYW5kIHNvcnRpbmcuCiAqCiAqIFRoZSBbQ29tcGFyYWJsZV0gaW50ZXJmYWNlIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgbmF0dXJhbCBvcmRlcmluZyBvZiBhIHR5cGUuCiAqIElmIGEgdHlwZSBjYW4gYmUgb3JkZXJlZCBpbiBtb3JlIHRoYW4gb25lIHdheSwKICogYW5kIG5vbmUgb2YgdGhlbSBpcyB0aGUgb2J2aW91cyBuYXR1cmFsIG9yZGVyaW5nLAogKiB0aGVuIGl0IG1pZ2h0IGJlIGJldHRlciBub3QgdG8gdXNlIHRoZSBbQ29tcGFyYWJsZV0gaW50ZXJmYWNlLAogKiBhbmQgdG8gcHJvdmlkZSBzZXBhcmF0ZSBbQ29tcGFyYXRvcl1zIGluc3RlYWQuCiAqCiAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIG9yZGVyIG9mIGEgW0NvbXBhcmFibGVdIGFncmVlcwogKiB3aXRoIGl0cyBvcGVyYXRvciBbb3BlcmF0b3IgPT1dIGVxdWFsaXR5IChgYS5jb21wYXJlVG8oYikgPT0gMGAgaWZmIGBhID09IGJgKSwKICogYnV0IHRoaXMgaXMgbm90IGEgcmVxdWlyZW1lbnQuCiAqIEZvciBleGFtcGxlLCBbZG91YmxlXSBhbmQgW0RhdGVUaW1lXSBoYXZlIGBjb21wYXJlVG9gIG1ldGhvZHMKICogdGhhdCBkbyBub3QgYWdyZWUgd2l0aCBvcGVyYXRvciBbb3BlcmF0b3IgPT1dLgogKiBGb3IgZG91YmxlcyB0aGUgW2NvbXBhcmVUb10gbWV0aG9kIGlzIG1vcmUgcHJlY2lzZSB0aGFuIHRoZSBlcXVhbGl0eSwKICogYW5kIGZvciBbRGF0ZVRpbWVdIGl0IGlzIGxlc3MgcHJlY2lzZS4KICoKICogRXhhbXBsZXM6CiAqCiAqICAgICAgKDAuMCkuY29tcGFyZVRvKC0wLjApOyAgLy8gPT4gMQogKiAgICAgIDAuMCA9PSAtMC4wOyAgICAgICAgICAgIC8vID0+IHRydWUKICogICAgICB2YXIgZHQgPSBuZXcgRGF0ZVRpbWUubm93KCk7CiAqICAgICAgdmFyIGR0MiA9IGR0LnRvVXRjKCk7CiAqICAgICAgZHQgPT0gZHQyOyAgICAgICAgICAgICAgLy8gPT4gZmFsc2UKICogICAgICBkdC5jb21wYXJlVG8oZHQyKTsgICAgICAvLyA9PiAwCiAqCiAqIFRoZSBbQ29tcGFyYWJsZV0gaW50ZXJmYWNlIGRvZXMgbm90IGltcGx5IHRoZSBleGlzdGVuY2UKICogb2YgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIGA8YCwgYDw9YCwgYD5gIGFuZCBgPj1gLgogKiBUaGVzZSBzaG91bGQgb25seSBiZSBkZWZpbmVkCiAqIGlmIHRoZSBvcmRlcmluZyBpcyBhIGxlc3MtdGhhbi9ncmVhdGVyLXRoYW4gb3JkZXJpbmcsCiAqIHRoYXQgaXMsIGFuIG9yZGVyaW5nIHdoZXJlIHlvdSB3b3VsZCBuYXR1cmFsbHkKICogdXNlIHRoZSB3b3JkcyAibGVzcyB0aGFuIiBhYm91dCB0aGUgb3JkZXIgb2YgdHdvIGVsZW1lbnRzLgogKgogKiBJZiB0aGUgZXF1YWxpdHkgb3BlcmF0b3IgYW5kIFtjb21wYXJlVG9dIGRpc2FncmVlLAogKiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgc2hvdWxkIGZvbGxvdyB0aGUgZXF1YWxpdHkgb3BlcmF0b3IsCiAqIGFuZCB3aWxsIGxpa2VseSBhbHNvIGRpc2FncmVlIHdpdGggW2NvbXBhcmVUb10uCiAqIE90aGVyd2lzZSB0aGV5IHNob3VsZCBtYXRjaCB0aGUgW2NvbXBhcmVUb10gbWV0aG9kLAogKiBzbyB0aGF0IGBhIDwgYmAgaWZmIGBhLmNvbXBhcmVUbyhiKSA8IDBgLgogKgogKiBUaGUgW2RvdWJsZV0gY2xhc3MgZGVmaW5lcyBjb21wYXJpc29uIG9wZXJhdG9ycwogKiB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggZXF1YWxpdHkuCiAqIFRoZSBvcGVyYXRvcnMgZGlmZmVyIGZyb20gYGRvdWJsZS5jb21wYXJlVG9gIG9uIC0wLjAgYW5kIE5hTi4KICoKICogVGhlIFtEYXRlVGltZV0gY2xhc3MgaGFzIG5vIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBpbnN0ZWFkIGl0IGhhcyB0aGUgbW9yZQogKiBwcmVjaXNlbHkgbmFtZWQgW0RhdGVUaW1lLmlzQmVmb3JlXSBhbmQgW0RhdGVUaW1lLmlzQWZ0ZXJdLgogKi8KYWJzdHJhY3QgY2xhc3MgQ29tcGFyYWJsZTxUPiB7CiAgLyoqCiAgICogQ29tcGFyZXMgdGhpcyBvYmplY3QgdG8gYW5vdGhlciBbQ29tcGFyYWJsZV0KICAgKgogICAqIFJldHVybnMgYSB2YWx1ZSBsaWtlIGEgW0NvbXBhcmF0b3JdIHdoZW4gY29tcGFyaW5nIGB0aGlzYCB0byBbb3RoZXJdLgogICAqIFRoYXQgaXMsIGl0IHJldHVybnMgYSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIGB0aGlzYCBpcyBvcmRlcmVkIGJlZm9yZSBbb3RoZXJdLAogICAqIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBgdGhpc2AgaXMgb3JkZXJlZCBhZnRlciBbb3RoZXJdLAogICAqIGFuZCB6ZXJvIGlmIGB0aGlzYCBhbmQgW290aGVyXSBhcmUgb3JkZXJlZCB0b2dldGhlci4KICAgKgogICAqIFRoZSBbb3RoZXJdIGFyZ3VtZW50IG11c3QgYmUgYSB2YWx1ZSB0aGF0IGlzIGNvbXBhcmFibGUgdG8gdGhpcyBvYmplY3QuCiAgICovCiAgaW50IGNvbXBhcmVUbyhUIG90aGVyKTsKCiAgLyoqCiAgICogQSBbQ29tcGFyYXRvcl0gdGhhdCBjb21wYXJlcyBvbmUgY29tcGFyYWJsZSB0byBhbm90aGVyLgogICAqCiAgICogSXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGBhLmNvbXBhcmVUbyhiKWAuCiAgICoKICAgKiBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBjb21wYXJhdG9yCiAgICogZm9yIG9yZGVyaW5nIGNvbGxlY3Rpb25zLCBmb3IgZXhhbXBsZSBpbiB0aGUgW0xpc3RdIHNvcnQgZnVuY3Rpb24uCiAgICovCiAgc3RhdGljIGludCBjb21wYXJlKENvbXBhcmFibGUgYSwgQ29tcGFyYWJsZSBiKSA9PiBhLmNvbXBhcmVUbyhiKTsKfQpgAE5OPAETAQQzA0ZFSx0DSQM0JjQEMAEEPANCLwNRMjVCMgM9UiJBMkkqAw0DKCslHiwoAzs4IDkyPgM2QTM3LQMzJkEDTT8EHwYyBUtRPDoFTQYaAQY9BTAFPUgGRAIBGWRhcnQ6Y29yZS9jb21wYXJhYmxlLmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvaXRlcmFibGUuZGFydMAAYswvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQSBjb2xsZWN0aW9uIG9mIHZhbHVlcywgb3IgImVsZW1lbnRzIiwgdGhhdCBjYW4gYmUgYWNjZXNzZWQgc2VxdWVudGlhbGx5LgogKgogKiBUaGUgZWxlbWVudHMgb2YgdGhlIGl0ZXJhYmxlIGFyZSBhY2Nlc3NlZCBieSBnZXR0aW5nIGFuIFtJdGVyYXRvcl0KICogdXNpbmcgdGhlIFtpdGVyYXRvcl0gZ2V0dGVyLCBhbmQgdXNpbmcgaXQgdG8gc3RlcCB0aHJvdWdoIHRoZSB2YWx1ZXMuCiAqIFN0ZXBwaW5nIHdpdGggdGhlIGl0ZXJhdG9yIGlzIGRvbmUgYnkgY2FsbGluZyBbSXRlcmF0b3IubW92ZU5leHRdLAogKiBhbmQgaWYgdGhlIGNhbGwgcmV0dXJucyBgdHJ1ZWAsCiAqIHRoZSBpdGVyYXRvciBoYXMgbm93IG1vdmVkIHRvIHRoZSBuZXh0IGVsZW1lbnQsCiAqIHdoaWNoIGlzIHRoZW4gYXZhaWxhYmxlIGFzIFtJdGVyYXRvci5jdXJyZW50XS4KICogSWYgdGhlIGNhbGwgcmV0dXJucyBgZmFsc2VgLCB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cywKICogYW5kIGBpdGVyYXRvci5jdXJyZW50YCByZXR1cm5zIGBudWxsYC4KICoKICogWW91IGNhbiBjcmVhdGUgbW9yZSB0aGFuIG9uZSBpdGVyYXRvciBmcm9tIHRoZSBzYW1lIGBJdGVyYWJsZWAuCiAqIEVhY2ggdGltZSBgaXRlcmF0b3JgIGlzIHJlYWQsIGl0IHJldHVybnMgYSBuZXcgaXRlcmF0b3IsCiAqIGFuZCBkaWZmZXJlbnQgaXRlcmF0b3JzIGNhbiBiZSBzdGVwcGVkIHRocm91Z2ggaW5kZXBlbmRlbnRseSwKICogZWFjaCBnaXZpbmcgYWNjZXNzIHRvIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIGl0ZXJhYmxlLgogKiBUaGUgaXRlcmF0b3JzIG9mIHRoZSBzYW1lIGl0ZXJhYmxlICpzaG91bGQqIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWVzCiAqIGluIHRoZSBzYW1lIG9yZGVyICh1bmxlc3MgdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbiBpcyBtb2RpZmllZCBiZXR3ZWVuCiAqIHRoZSBpdGVyYXRpb25zLCB3aGljaCBzb21lIGNvbGxlY3Rpb25zIGFsbG93KS4KICoKICogWW91IGNhbiBhbHNvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYW4gYEl0ZXJhYmxlYAogKiB1c2luZyB0aGUgZm9yLWluIGxvb3AgY29uc3RydWN0LCB3aGljaCB1c2VzIHRoZSBgaXRlcmF0b3JgIGdldHRlciBiZWhpbmQgdGhlCiAqIHNjZW5lcy4KICogRm9yIGV4YW1wbGUsIHlvdSBjYW4gaXRlcmF0ZSBvdmVyIGFsbCBvZiB0aGUga2V5cyBvZiBhIFtNYXBdLAogKiBiZWNhdXNlIGBNYXBgIGtleXMgYXJlIGl0ZXJhYmxlLgogKgogKiAgICAgTWFwIGtpZHNCb29rcyA9IHsnTWF0aWxkYSc6ICdSb2FsZCBEYWhsJywKICogICAgICAgICAgICAgICAgICAgICAgJ0dyZWVuIEVnZ3MgYW5kIEhhbSc6ICdEciBTZXVzcycsCiAqICAgICAgICAgICAgICAgICAgICAgICdXaGVyZSB0aGUgV2lsZCBUaGluZ3MgQXJlJzogJ01hdXJpY2UgU2VuZGFrJ307CiAqICAgICBmb3IgKHZhciBib29rIGluIGtpZHNCb29rcy5rZXlzKSB7CiAqICAgICAgIHByaW50KCckYm9vayB3YXMgd3JpdHRlbiBieSAke2tpZHNCb29rc1tib29rXX0nKTsKICogICAgIH0KICoKICogVGhlIFtMaXN0XSBhbmQgW1NldF0gY2xhc3NlcyBhcmUgYm90aCBgSXRlcmFibGVgLAogKiBhcyBhcmUgbW9zdCBjbGFzc2VzIGluIHRoZSBgZGFydDpjb2xsZWN0aW9uYCBsaWJyYXJ5LgogKgogKiBTb21lIFtJdGVyYWJsZV0gY29sbGVjdGlvbnMgY2FuIGJlIG1vZGlmaWVkLgogKiBBZGRpbmcgYW4gZWxlbWVudCB0byBhIGBMaXN0YCBvciBgU2V0YCB3aWxsIGNoYW5nZSB3aGljaCBlbGVtZW50cyBpdAogKiBjb250YWlucywgYW5kIGFkZGluZyBhIG5ldyBrZXkgdG8gYSBgTWFwYCBjaGFuZ2VzIHRoZSBlbGVtZW50cyBvZiBbTWFwLmtleXNdLgogKiBJdGVyYXRvcnMgY3JlYXRlZCBhZnRlciB0aGUgY2hhbmdlIHdpbGwgcHJvdmlkZSB0aGUgbmV3IGVsZW1lbnRzLCBhbmQgbWF5CiAqIG9yIG1heSBub3QgcHJlc2VydmUgdGhlIG9yZGVyIG9mIGV4aXN0aW5nIGVsZW1lbnRzCiAqIChmb3IgZXhhbXBsZSwgYSBbSGFzaFNldF0gbWF5IGNvbXBsZXRlbHkgY2hhbmdlIGl0cyBvcmRlciB3aGVuIGEgc2luZ2xlCiAqIGVsZW1lbnQgaXMgYWRkZWQpLgogKgogKiBDaGFuZ2luZyBhIGNvbGxlY3Rpb24gKndoaWxlKiBpdCBpcyBiZWluZyBpdGVyYXRlZAogKiBpcyBnZW5lcmFsbHkgKm5vdCogYWxsb3dlZC4KICogRG9pbmcgc28gd2lsbCBicmVhayB0aGUgaXRlcmF0aW9uLCB3aGljaCBpcyB0eXBpY2FsbHkgc2lnbmFsbGVkCiAqIGJ5IHRocm93aW5nIGEgW0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcl0KICogdGhlIG5leHQgdGltZSBbSXRlcmF0b3IubW92ZU5leHRdIGlzIGNhbGxlZC4KICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgW0l0ZXJhdG9yLmN1cnJlbnRdIGdldHRlcgogKiBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IHRoZSBjaGFuZ2UgaW4gdGhlIGNvbGxlY3Rpb24sCiAqIHRoZSBgY3VycmVudGAgdmFsdWUgd2FzIHNldCBieSB0aGUgcHJldmlvdXMgY2FsbCB0byBbSXRlcmF0b3IubW92ZU5leHRdLgogKgogKiBTb21lIGl0ZXJhYmxlcyBjb21wdXRlIHRoZWlyIGVsZW1lbnRzIGR5bmFtaWNhbGx5IGV2ZXJ5IHRpbWUgdGhleSBhcmUKICogaXRlcmF0ZWQsIGxpa2UgdGhlIG9uZSByZXR1cm5lZCBieSBbSXRlcmFibGUuZ2VuZXJhdGVdIG9yIHRoZSBpdGVyYWJsZQogKiByZXR1cm5lZCBieSBhIGBzeW5jKmAgZ2VuZXJhdG9yIGZ1bmN0aW9uLiBJZiB0aGUgY29tcHV0YXRpb24gZG9lc24ndCBkZXBlbmQKICogb24gb3RoZXIgb2JqZWN0cyB0aGF0IG1heSBjaGFuZ2UsIHRoZW4gdGhlIGdlbmVyYXRlZCBzZXF1ZW5jZSBzaG91bGQgYmUKICogdGhlIHNhbWUgb25lIGV2ZXJ5IHRpbWUgaXQncyBpdGVyYXRlZC4KICoKICogVGhlIG1lbWJlcnMgb2YgYEl0ZXJhYmxlYCwgb3RoZXIgdGhhbiBgaXRlcmF0b3JgIGl0c2VsZiwKICogd29yayBieSBsb29raW5nIGF0IHRoZSBlbGVtZW50cyBvZiB0aGUgaXRlcmFibGUuCiAqIFRoaXMgY2FuIGJlIGltcGxlbWVudGVkIGJ5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgW2l0ZXJhdG9yXSwgYnV0IHNvbWUgY2xhc3NlcwogKiBtYXkgaGF2ZSBtb3JlIGVmZmljaWVudCB3YXlzIG9mIGZpbmRpbmcgdGhlIHJlc3VsdAogKiAobGlrZSBbbGFzdF0gb3IgW2xlbmd0aF0gb24gYSBbTGlzdF0sIG9yIFtjb250YWluc10gb24gYSBbU2V0XSkuCiAqCiAqIFRoZSBtZXRob2RzIHRoYXQgcmV0dXJuIGFub3RoZXIgYEl0ZXJhYmxlYCAobGlrZSBbbWFwXSBhbmQgW3doZXJlXSkKICogYXJlIGFsbCAqbGF6eSogLSB0aGV5IHdpbGwgaXRlcmF0ZSB0aGUgb3JpZ2luYWwgKGFzIG5lY2Vzc2FyeSkKICogZXZlcnkgdGltZSB0aGUgcmV0dXJuZWQgaXRlcmFibGUgaXMgaXRlcmF0ZWQsIGFuZCBub3QgYmVmb3JlLgogKgogKiBTaW5jZSBhbiBpdGVyYWJsZSBtYXkgYmUgaXRlcmF0ZWQgbW9yZSB0aGFuIG9uY2UsIGl0J3Mgbm90IHJlY29tbWVuZGVkIHRvCiAqIGhhdmUgZGV0ZWN0YWJsZSBzaWRlLWVmZmVjdHMgaW4gdGhlIGl0ZXJhdG9yLgogKiBGb3IgbWV0aG9kcyBsaWtlIFttYXBdIGFuZCBbd2hlcmVdLCB0aGUgcmV0dXJuZWQgaXRlcmFibGUgd2lsbCBleGVjdXRlIHRoZQogKiBhcmd1bWVudCBmdW5jdGlvbiBvbiBldmVyeSBpdGVyYXRpb24sIHNvIHRob3NlIGZ1bmN0aW9ucyBzaG91bGQgYWxzbyBub3QKICogaGF2ZSBzaWRlIGVmZmVjdHMuCiAqLwphYnN0cmFjdCBjbGFzcyBJdGVyYWJsZTxFPiB7CiAgLy8gVE9ETyhscm4pOiBXaGVuIHdlIGFsbG93IGZvcndhcmRpbmcgY29uc3QgY29uc3RydWN0b3JzIHRocm91Z2gKICAvLyBtaXhpbiBhcHBsaWNhdGlvbnMsIG1ha2UgdGhpcyBjbGFzcyBpbXBsZW1lbnQgW0l0ZXJhYmxlTWl4aW5dLgogIGNvbnN0IEl0ZXJhYmxlKCk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gYEl0ZXJhYmxlYCB3aGljaCBnZW5lcmF0ZXMgaXRzIGVsZW1lbnRzIGR5bmFtaWNhbGx5LgogICAqCiAgICogVGhlIGdlbmVyYXRlZCBpdGVyYWJsZSBoYXMgW2NvdW50XSBlbGVtZW50cywKICAgKiBhbmQgdGhlIGVsZW1lbnQgYXQgaW5kZXggYG5gIGlzIGNvbXB1dGVkIGJ5IGNhbGxpbmcgYGdlbmVyYXRvcihuKWAuCiAgICogVmFsdWVzIGFyZSBub3QgY2FjaGVkLCBzbyBlYWNoIGl0ZXJhdGlvbiBjb21wdXRlcyB0aGUgdmFsdWVzIGFnYWluLgogICAqCiAgICogSWYgW2dlbmVyYXRvcl0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYW4gaWRlbnRpdHkgZnVuY3Rpb24KICAgKiBvbiBpbnRlZ2VycyBgKGludCB4KSA9PiB4YCwgc28gaXQgbWF5IG9ubHkgYmUgb21pdHRlZCBpZiB0aGUgdHlwZQogICAqIHBhcmFtZXRlciBhbGxvd3MgaW50ZWdlciB2YWx1ZXMuIFRoYXQgaXMsIGlmIFtFXSBpcyBhIHN1cGVyLXR5cGUKICAgKiBvZiBbaW50XS4KICAgKgogICAqIEFzIGFuIGBJdGVyYWJsZWAsIGBuZXcgSXRlcmFibGUuZ2VuZXJhdGUobiwgZ2VuZXJhdG9yKSlgIGlzIGVxdWl2YWxlbnQgdG8KICAgKiBgY29uc3QgWzAsIC4uLiwgbiAtIDFdLm1hcChnZW5lcmF0b3IpYC4KICAgKi8KICBmYWN0b3J5IEl0ZXJhYmxlLmdlbmVyYXRlKGludCBjb3VudCwgW0UgZ2VuZXJhdG9yKGludCBpbmRleCldKSB7CiAgICBpZiAoY291bnQgPD0gMCkgcmV0dXJuIEVtcHR5SXRlcmFibGU8RT4oKTsKICAgIHJldHVybiBfR2VuZXJhdG9ySXRlcmFibGU8RT4oY291bnQsIGdlbmVyYXRvcik7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGFuIGVtcHR5IGl0ZXJhYmxlLgogICAqCiAgICogVGhlIGVtcHR5IGl0ZXJhYmxlIGhhcyBubyBlbGVtZW50cywgYW5kIGl0ZXJhdGluZyBpdCBhbHdheXMgc3RvcHMKICAgKiBpbW1lZGlhdGVseS4KICAgKi8KICBjb25zdCBmYWN0b3J5IEl0ZXJhYmxlLmVtcHR5KCkgPSBFbXB0eUl0ZXJhYmxlPEU+OwoKICAvKioKICAgKiBBZGFwdHMgW3NvdXJjZV0gdG8gYmUgYW4gYEl0ZXJhYmxlPFQ+YC4KICAgKgogICAqIEFueSB0aW1lIHRoZSBpdGVyYWJsZSB3b3VsZCBwcm9kdWNlIGFuIGVsZW1lbnQgdGhhdCBpcyBub3QgYSBbVF0sCiAgICogdGhlIGVsZW1lbnQgYWNjZXNzIHdpbGwgdGhyb3cuIElmIGFsbCBlbGVtZW50cyBvZiBbc291cmNlXSBhcmUgYWN0dWFsbHkKICAgKiBpbnN0YW5jZXMgb2YgW1RdLCBvciBpZiBvbmx5IGVsZW1lbnRzIHRoYXQgYXJlIGFjdHVhbGx5IGluc3RhbmNlcyBvZiBbVF0KICAgKiBhcmUgYWNjZXNzZWQsIHRoZW4gdGhlIHJlc3VsdGluZyBpdGVyYWJsZSBjYW4gYmUgdXNlZCBhcyBhbiBgSXRlcmFibGU8VD5gLgogICAqLwogIHN0YXRpYyBJdGVyYWJsZTxUPiBjYXN0RnJvbTxTLCBUPihJdGVyYWJsZTxTPiBzb3VyY2UpID0+CiAgICAgIENhc3RJdGVyYWJsZTxTLCBUPihzb3VyY2UpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGBJdGVyYXRvcmAgdGhhdCBhbGxvd3MgaXRlcmF0aW5nIHRoZSBlbGVtZW50cyBvZiB0aGlzCiAgICogYEl0ZXJhYmxlYC4KICAgKgogICAqIEl0ZXJhYmxlIGNsYXNzZXMgbWF5IHNwZWNpZnkgdGhlIGl0ZXJhdGlvbiBvcmRlciBvZiB0aGVpciBlbGVtZW50cwogICAqIChmb3IgZXhhbXBsZSBbTGlzdF0gYWx3YXlzIGl0ZXJhdGUgaW4gaW5kZXggb3JkZXIpLAogICAqIG9yIHRoZXkgbWF5IGxlYXZlIGl0IHVuc3BlY2lmaWVkIChmb3IgZXhhbXBsZSBhIGhhc2gtYmFzZWQgW1NldF0KICAgKiBtYXkgaXRlcmF0ZSBpbiBhbnkgb3JkZXIpLgogICAqCiAgICogRWFjaCB0aW1lIGBpdGVyYXRvcmAgaXMgcmVhZCwgaXQgcmV0dXJucyBhIG5ldyBpdGVyYXRvciwKICAgKiB3aGljaCBjYW4gYmUgdXNlZCB0byBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBlbGVtZW50cyBhZ2Fpbi4KICAgKiBUaGUgaXRlcmF0b3JzIG9mIHRoZSBzYW1lIGl0ZXJhYmxlIGNhbiBiZSBzdGVwcGVkIHRocm91Z2ggaW5kZXBlbmRlbnRseSwKICAgKiBidXQgc2hvdWxkIHJldHVybiB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlciwKICAgKiBhcyBsb25nIGFzIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gaXNuJ3QgY2hhbmdlZC4KICAgKgogICAqIE1vZGlmeWluZyB0aGUgY29sbGVjdGlvbiBtYXkgY2F1c2UgbmV3IGl0ZXJhdG9ycyB0byBwcm9kdWNlCiAgICogZGlmZmVyZW50IGVsZW1lbnRzLCBhbmQgbWF5IGNoYW5nZSB0aGUgb3JkZXIgb2YgZXhpc3RpbmcgZWxlbWVudHMuCiAgICogQSBbTGlzdF0gc3BlY2lmaWVzIGl0cyBpdGVyYXRpb24gb3JkZXIgcHJlY2lzZWx5LAogICAqIHNvIG1vZGlmeWluZyB0aGUgbGlzdCBjaGFuZ2VzIHRoZSBpdGVyYXRpb24gb3JkZXIgcHJlZGljdGFibHkuCiAgICogQSBoYXNoLWJhc2VkIFtTZXRdIG1heSBjaGFuZ2UgaXRzIGl0ZXJhdGlvbiBvcmRlciBjb21wbGV0ZWx5CiAgICogd2hlbiBhZGRpbmcgYSBuZXcgZWxlbWVudCB0byB0aGUgc2V0LgogICAqCiAgICogTW9kaWZ5aW5nIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gYWZ0ZXIgY3JlYXRpbmcgdGhlIG5ldyBpdGVyYXRvcgogICAqIG1heSBjYXVzZSBhbiBlcnJvciB0aGUgbmV4dCB0aW1lIFtJdGVyYXRvci5tb3ZlTmV4dF0gaXMgY2FsbGVkCiAgICogb24gdGhhdCBpdGVyYXRvci4KICAgKiBBbnkgKm1vZGlmaWFibGUqIGl0ZXJhYmxlIGNsYXNzIHNob3VsZCBzcGVjaWZ5IHdoaWNoIG9wZXJhdGlvbnMgd2lsbAogICAqIGJyZWFrIGl0ZXJhdGlvbi4KICAgKi8KICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3I7CgogIC8qKgogICAqIFByb3ZpZGVzIGEgdmlldyBvZiB0aGlzIGl0ZXJhYmxlIGFzIGFuIGl0ZXJhYmxlIG9mIFtSXSBpbnN0YW5jZXMuCiAgICoKICAgKiBJZiB0aGlzIGl0ZXJhYmxlIG9ubHkgY29udGFpbnMgaW5zdGFuY2VzIG9mIFtSXSwgYWxsIG9wZXJhdGlvbnMKICAgKiB3aWxsIHdvcmsgY29ycmVjdGx5LiBJZiBhbnkgb3BlcmF0aW9uIHRyaWVzIHRvIGFjY2VzcyBhbiBlbGVtZW50CiAgICogdGhhdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgW1JdLCB0aGUgYWNjZXNzIHdpbGwgdGhyb3cgaW5zdGVhZC4KICAgKgogICAqIFdoZW4gdGhlIHJldHVybmVkIGl0ZXJhYmxlIGNyZWF0ZXMgYSBuZXcgb2JqZWN0IHRoYXQgZGVwZW5kcyBvbgogICAqIHRoZSB0eXBlIFtSXSwgZS5nLiwgZnJvbSBbdG9MaXN0XSwgaXQgd2lsbCBoYXZlIGV4YWN0bHkgdGhlIHR5cGUgW1JdLgogICAqLwogIEl0ZXJhYmxlPFI+IGNhc3Q8Uj4oKSA9PiBJdGVyYWJsZS5jYXN0RnJvbTxFLCBSPih0aGlzKTsKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsYXp5IGNvbmNhdGVudGF0aW9uIG9mIHRoaXMgaXRlcmFibGUgYW5kIFtvdGhlcl0uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgaXRlcmFibGUgd2lsbCBwcm92aWRlIHRoZSBzYW1lIGVsZW1lbnRzIGFzIHRoaXMgaXRlcmFibGUsCiAgICogYW5kLCBhZnRlciB0aGF0LCB0aGUgZWxlbWVudHMgb2YgW290aGVyXSwgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaW4gdGhlCiAgICogb3JpZ2luYWwgaXRlcmFibGVzLgogICAqLwogIEl0ZXJhYmxlPEU+IGZvbGxvd2VkQnkoSXRlcmFibGU8RT4gb3RoZXIpIHsKICAgIGlmICh0aGlzIGlzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+KSB7CiAgICAgIHJldHVybiBGb2xsb3dlZEJ5SXRlcmFibGU8RT4uZmlyc3RFZmZpY2llbnQodGhpcywgb3RoZXIpOwogICAgfQogICAgcmV0dXJuIEZvbGxvd2VkQnlJdGVyYWJsZTxFPih0aGlzLCBvdGhlcik7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGxhenkgW0l0ZXJhYmxlXSB3aXRoIGVsZW1lbnRzIHRoYXQgYXJlIGNyZWF0ZWQgYnkKICAgKiBjYWxsaW5nIGBmYCBvbiBlYWNoIGVsZW1lbnQgb2YgdGhpcyBgSXRlcmFibGVgIGluIGl0ZXJhdGlvbiBvcmRlci4KICAgKgogICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSB2aWV3IG9mIHRoZSBtYXBwZWQgZWxlbWVudHMuIEFzIGxvbmcgYXMgdGhlCiAgICogcmV0dXJuZWQgW0l0ZXJhYmxlXSBpcyBub3QgaXRlcmF0ZWQgb3ZlciwgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIFtmXSB3aWxsCiAgICogbm90IGJlIGludm9rZWQuIFRoZSB0cmFuc2Zvcm1lZCBlbGVtZW50cyB3aWxsIG5vdCBiZSBjYWNoZWQuIEl0ZXJhdGluZwogICAqIG11bHRpcGxlIHRpbWVzIG92ZXIgdGhlIHJldHVybmVkIFtJdGVyYWJsZV0gd2lsbCBpbnZva2UgdGhlIHN1cHBsaWVkCiAgICogZnVuY3Rpb24gW2ZdIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGVsZW1lbnQuCiAgICoKICAgKiBNZXRob2RzIG9uIHRoZSByZXR1cm5lZCBpdGVyYWJsZSBhcmUgYWxsb3dlZCB0byBvbWl0IGNhbGxpbmcgYGZgCiAgICogb24gYW55IGVsZW1lbnQgd2hlcmUgdGhlIHJlc3VsdCBpc24ndCBuZWVkZWQuCiAgICogRm9yIGV4YW1wbGUsIFtlbGVtZW50QXRdIG1heSBjYWxsIGBmYCBvbmx5IG9uY2UuCiAgICovCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihFIGUpKSA9PiBNYXBwZWRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBsYXp5IFtJdGVyYWJsZV0gd2l0aCBhbGwgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZQogICAqIHByZWRpY2F0ZSBbdGVzdF0uCiAgICoKICAgKiBUaGUgbWF0Y2hpbmcgZWxlbWVudHMgaGF2ZSB0aGUgc2FtZSBvcmRlciBpbiB0aGUgcmV0dXJuZWQgaXRlcmFibGUKICAgKiBhcyB0aGV5IGhhdmUgaW4gW2l0ZXJhdG9yXS4KICAgKgogICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSB2aWV3IG9mIHRoZSBtYXBwZWQgZWxlbWVudHMuCiAgICogQXMgbG9uZyBhcyB0aGUgcmV0dXJuZWQgW0l0ZXJhYmxlXSBpcyBub3QgaXRlcmF0ZWQgb3ZlciwKICAgKiB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gW3Rlc3RdIHdpbGwgbm90IGJlIGludm9rZWQuCiAgICogSXRlcmF0aW5nIHdpbGwgbm90IGNhY2hlIHJlc3VsdHMsIGFuZCB0aHVzIGl0ZXJhdGluZyBtdWx0aXBsZSB0aW1lcyBvdmVyCiAgICogdGhlIHJldHVybmVkIFtJdGVyYWJsZV0gbWF5IGludm9rZSB0aGUgc3VwcGxpZWQKICAgKiBmdW5jdGlvbiBbdGVzdF0gbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgZWxlbWVudC4KICAgKi8KICBJdGVyYWJsZTxFPiB3aGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gV2hlcmVJdGVyYWJsZTxFPih0aGlzLCB0ZXN0KTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBsYXp5IFtJdGVyYWJsZV0gd2l0aCBhbGwgZWxlbWVudHMgdGhhdCBoYXZlIHR5cGUgW1RdLgogICAqCiAgICogVGhlIG1hdGNoaW5nIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgb3JkZXIgaW4gdGhlIHJldHVybmVkIGl0ZXJhYmxlCiAgICogYXMgdGhleSBoYXZlIGluIFtpdGVyYXRvcl0uCiAgICoKICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgdmlldyBvZiB0aGUgbWFwcGVkIGVsZW1lbnRzLgogICAqIEl0ZXJhdGluZyB3aWxsIG5vdCBjYWNoZSByZXN1bHRzLCBhbmQgdGh1cyBpdGVyYXRpbmcgbXVsdGlwbGUgdGltZXMgb3ZlcgogICAqIHRoZSByZXR1cm5lZCBbSXRlcmFibGVdIG1heSB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0cywKICAgKiBpZiB0aGUgdW5kZXJseWluZyBlbGVtZW50cyBjaGFuZ2UgYmV0d2VlbiBpdGVyYXRpb25zLgogICAqLwogIEl0ZXJhYmxlPFQ+IHdoZXJlVHlwZTxUPigpID0+IFdoZXJlVHlwZUl0ZXJhYmxlPFQ+KHRoaXMpOwoKICAvKioKICAgKiBFeHBhbmRzIGVhY2ggZWxlbWVudCBvZiB0aGlzIFtJdGVyYWJsZV0gaW50byB6ZXJvIG9yIG1vcmUgZWxlbWVudHMuCiAgICoKICAgKiBUaGUgcmVzdWx0aW5nIEl0ZXJhYmxlIHJ1bnMgdGhyb3VnaCB0aGUgZWxlbWVudHMgcmV0dXJuZWQKICAgKiBieSBbZl0gZm9yIGVhY2ggZWxlbWVudCBvZiB0aGlzLCBpbiBpdGVyYXRpb24gb3JkZXIuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgW0l0ZXJhYmxlXSBpcyBsYXp5LCBhbmQgY2FsbHMgW2ZdIGZvciBlYWNoIGVsZW1lbnQKICAgKiBvZiB0aGlzIGV2ZXJ5IHRpbWUgaXQncyBpdGVyYXRlZC4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiAgICAgdmFyIHBhaXJzID0gW1sxLCAyXSwgWzMsIDRdXTsKICAgKiAgICAgdmFyIGZsYXR0ZW5lZCA9IHBhaXJzLmV4cGFuZCgocGFpcikgPT4gcGFpcikudG9MaXN0KCk7CiAgICogICAgIHByaW50KGZsYXR0ZW5lZCk7IC8vID0+IFsxLCAyLCAzLCA0XTsKICAgKgogICAqICAgICB2YXIgaW5wdXQgPSBbMSwgMiwgM107CiAgICogICAgIHZhciBkdXBsaWNhdGVkID0gaW5wdXQuZXhwYW5kKChpKSA9PiBbaSwgaV0pLnRvTGlzdCgpOwogICAqICAgICBwcmludChkdXBsaWNhdGVkKTsgLy8gPT4gWzEsIDEsIDIsIDIsIDMsIDNdCiAgICoKICAgKi8KICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihFIGVsZW1lbnQpKSA9PgogICAgICBFeHBhbmRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIGFuIGVsZW1lbnQgZXF1YWwgdG8gW2VsZW1lbnRdLgogICAqCiAgICogVGhpcyBvcGVyYXRpb24gd2lsbCBjaGVjayBlYWNoIGVsZW1lbnQgaW4gb3JkZXIgZm9yIGJlaW5nIGVxdWFsIHRvCiAgICogW2VsZW1lbnRdLCB1bmxlc3MgaXQgaGFzIGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGZpbmQgYW4gZWxlbWVudAogICAqIGVxdWFsIHRvIFtlbGVtZW50XS4KICAgKgogICAqIFRoZSBlcXVhbGl0eSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIFtlbGVtZW50XSBpcyBlcXVhbCB0byBhbiBlbGVtZW50IG9mCiAgICogdGhlIGl0ZXJhYmxlIGRlZmF1bHRzIHRvIHRoZSBbT2JqZWN0Lj09XSBvZiB0aGUgZWxlbWVudC4KICAgKgogICAqIFNvbWUgdHlwZXMgb2YgaXRlcmFibGUgbWF5IGhhdmUgYSBkaWZmZXJlbnQgZXF1YWxpdHkgdXNlZCBmb3IgaXRzIGVsZW1lbnRzLgogICAqIEZvciBleGFtcGxlLCBhIFtTZXRdIG1heSBoYXZlIGEgY3VzdG9tIGVxdWFsaXR5CiAgICogKHNlZSBbU2V0LmlkZW50aXR5XSkgdGhhdCBpdHMgYGNvbnRhaW5zYCB1c2VzLgogICAqIExpa2V3aXNlIHRoZSBgSXRlcmFibGVgIHJldHVybmVkIGJ5IGEgW01hcC5rZXlzXSBjYWxsCiAgICogc2hvdWxkIHVzZSB0aGUgc2FtZSBlcXVhbGl0eSB0aGF0IHRoZSBgTWFwYCB1c2VzIGZvciBrZXlzLgogICAqLwogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGZvciAoRSBlIGluIHRoaXMpIHsKICAgICAgaWYgKGUgPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvKioKICAgKiBBcHBsaWVzIHRoZSBmdW5jdGlvbiBbZl0gdG8gZWFjaCBlbGVtZW50IG9mIHRoaXMgY29sbGVjdGlvbiBpbiBpdGVyYXRpb24KICAgKiBvcmRlci4KICAgKi8KICB2b2lkIGZvckVhY2godm9pZCBmKEUgZWxlbWVudCkpIHsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIGYoZWxlbWVudCk7CiAgfQoKICAvKioKICAgKiBSZWR1Y2VzIGEgY29sbGVjdGlvbiB0byBhIHNpbmdsZSB2YWx1ZSBieSBpdGVyYXRpdmVseSBjb21iaW5pbmcgZWxlbWVudHMKICAgKiBvZiB0aGUgY29sbGVjdGlvbiB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uCiAgICoKICAgKiBUaGUgaXRlcmFibGUgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50LgogICAqIElmIGl0IGhhcyBvbmx5IG9uZSBlbGVtZW50LCB0aGF0IGVsZW1lbnQgaXMgcmV0dXJuZWQuCiAgICoKICAgKiBPdGhlcndpc2UgdGhpcyBtZXRob2Qgc3RhcnRzIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgaXRlcmF0b3IsCiAgICogYW5kIHRoZW4gY29tYmluZXMgaXQgd2l0aCB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGluIGl0ZXJhdGlvbiBvcmRlciwKICAgKiBhcyBpZiBieToKICAgKgogICAqICAgICBFIHZhbHVlID0gaXRlcmFibGUuZmlyc3Q7CiAgICogICAgIGl0ZXJhYmxlLnNraXAoMSkuZm9yRWFjaCgoZWxlbWVudCkgewogICAqICAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgZWxlbWVudCk7CiAgICogICAgIH0pOwogICAqICAgICByZXR1cm4gdmFsdWU7CiAgICoKICAgKiBFeGFtcGxlIG9mIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYW4gaXRlcmFibGU6CiAgICoKICAgKiAgICAgaXRlcmFibGUucmVkdWNlKCh2YWx1ZSwgZWxlbWVudCkgPT4gdmFsdWUgKyBlbGVtZW50KTsKICAgKgogICAqLwogIEUgcmVkdWNlKEUgY29tYmluZShFIHZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICBJdGVyYXRvcjxFPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICBFIHZhbHVlID0gaXRlcmF0b3IuY3VycmVudDsKICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgaXRlcmF0b3IuY3VycmVudCk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICAvKioKICAgKiBSZWR1Y2VzIGEgY29sbGVjdGlvbiB0byBhIHNpbmdsZSB2YWx1ZSBieSBpdGVyYXRpdmVseSBjb21iaW5pbmcgZWFjaAogICAqIGVsZW1lbnQgb2YgdGhlIGNvbGxlY3Rpb24gd2l0aCBhbiBleGlzdGluZyB2YWx1ZQogICAqCiAgICogVXNlcyBbaW5pdGlhbFZhbHVlXSBhcyB0aGUgaW5pdGlhbCB2YWx1ZSwKICAgKiB0aGVuIGl0ZXJhdGVzIHRocm91Z2ggdGhlIGVsZW1lbnRzIGFuZCB1cGRhdGVzIHRoZSB2YWx1ZSB3aXRoCiAgICogZWFjaCBlbGVtZW50IHVzaW5nIHRoZSBbY29tYmluZV0gZnVuY3Rpb24sIGFzIGlmIGJ5OgogICAqCiAgICogICAgIHZhciB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsKICAgKiAgICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAqICAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgZWxlbWVudCk7CiAgICogICAgIH0KICAgKiAgICAgcmV0dXJuIHZhbHVlOwogICAqCiAgICogRXhhbXBsZSBvZiBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFuIGl0ZXJhYmxlOgogICAqCiAgICogICAgIGl0ZXJhYmxlLmZvbGQoMCwgKHByZXYsIGVsZW1lbnQpID0+IHByZXYgKyBlbGVtZW50KTsKICAgKgogICAqLwogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgcHJldmlvdXNWYWx1ZSwgRSBlbGVtZW50KSkgewogICAgdmFyIHZhbHVlID0gaW5pdGlhbFZhbHVlOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCBlbGVtZW50KTsKICAgIHJldHVybiB2YWx1ZTsKICB9CgogIC8qKgogICAqIENoZWNrcyB3aGV0aGVyIGV2ZXJ5IGVsZW1lbnQgb2YgdGhpcyBpdGVyYWJsZSBzYXRpc2ZpZXMgW3Rlc3RdLgogICAqCiAgICogQ2hlY2tzIGV2ZXJ5IGVsZW1lbnQgaW4gaXRlcmF0aW9uIG9yZGVyLCBhbmQgcmV0dXJucyBgZmFsc2VgIGlmCiAgICogYW55IG9mIHRoZW0gbWFrZSBbdGVzdF0gcmV0dXJuIGBmYWxzZWAsIG90aGVyd2lzZSByZXR1cm5zIGB0cnVlYC4KICAgKi8KICBib29sIGV2ZXJ5KGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICghdGVzdChlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvKioKICAgKiBDb252ZXJ0cyBlYWNoIGVsZW1lbnQgdG8gYSBbU3RyaW5nXSBhbmQgY29uY2F0ZW5hdGVzIHRoZSBzdHJpbmdzLgogICAqCiAgICogSXRlcmF0ZXMgdGhyb3VnaCBlbGVtZW50cyBvZiB0aGlzIGl0ZXJhYmxlLAogICAqIGNvbnZlcnRzIGVhY2ggb25lIHRvIGEgW1N0cmluZ10gYnkgY2FsbGluZyBbT2JqZWN0LnRvU3RyaW5nXSwKICAgKiBhbmQgdGhlbiBjb25jYXRlbmF0ZXMgdGhlIHN0cmluZ3MsIHdpdGggdGhlCiAgICogW3NlcGFyYXRvcl0gc3RyaW5nIGludGVybGVhdmVkIGJldHdlZW4gdGhlIGVsZW1lbnRzLgogICAqLwogIFN0cmluZyBqb2luKFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSB7CiAgICBJdGVyYXRvcjxFPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHJldHVybiAiIjsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBTdHJpbmdCdWZmZXIoKTsKICAgIGlmIChzZXBhcmF0b3IgPT0gbnVsbCB8fCBzZXBhcmF0b3IgPT0gIiIpIHsKICAgICAgZG8gewogICAgICAgIGJ1ZmZlci53cml0ZSgiJHtpdGVyYXRvci5jdXJyZW50fSIpOwogICAgICB9IHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIGJ1ZmZlci53cml0ZSgiJHtpdGVyYXRvci5jdXJyZW50fSIpOwogICAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgIGJ1ZmZlci53cml0ZShzZXBhcmF0b3IpOwogICAgICAgIGJ1ZmZlci53cml0ZSgiJHtpdGVyYXRvci5jdXJyZW50fSIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICAvKioKICAgKiBDaGVja3Mgd2hldGhlciBhbnkgZWxlbWVudCBvZiB0aGlzIGl0ZXJhYmxlIHNhdGlzZmllcyBbdGVzdF0uCiAgICoKICAgKiBDaGVja3MgZXZlcnkgZWxlbWVudCBpbiBpdGVyYXRpb24gb3JkZXIsIGFuZCByZXR1cm5zIGB0cnVlYCBpZgogICAqIGFueSBvZiB0aGVtIG1ha2UgW3Rlc3RdIHJldHVybiBgdHJ1ZWAsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgogICAqLwogIGJvb2wgYW55KGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBbTGlzdF0gY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhpcyBbSXRlcmFibGVdLgogICAqCiAgICogVGhlIGVsZW1lbnRzIGFyZSBpbiBpdGVyYXRpb24gb3JkZXIuCiAgICogVGhlIGxpc3QgaXMgZml4ZWQtbGVuZ3RoIGlmIFtncm93YWJsZV0gaXMgZmFsc2UuCiAgICovCiAgTGlzdDxFPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGUgPSB0cnVlfSkgewogICAgcmV0dXJuIExpc3Q8RT4uZnJvbSh0aGlzLCBncm93YWJsZTogZ3Jvd2FibGUpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtTZXRdIGNvbnRhaW5pbmcgdGhlIHNhbWUgZWxlbWVudHMgYXMgdGhpcyBpdGVyYWJsZS4KICAgKgogICAqIFRoZSBzZXQgbWF5IGNvbnRhaW4gZmV3ZXIgZWxlbWVudHMgdGhhbiB0aGUgaXRlcmFibGUsCiAgICogaWYgdGhlIGl0ZXJhYmxlIGNvbnRhaW5zIGFuIGVsZW1lbnQgbW9yZSB0aGFuIG9uY2UsCiAgICogb3IgaXQgY29udGFpbnMgb25lIG9yIG1vcmUgZWxlbWVudHMgdGhhdCBhcmUgZXF1YWwuCiAgICogVGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc2V0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lCiAgICogYXMgZm9yIHRoZSBpdGVyYWJsZS4KICAgKi8KICBTZXQ8RT4gdG9TZXQoKSA9PiBTZXQ8RT4uZnJvbSh0aGlzKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIFt0aGlzXS4KICAgKgogICAqIENvdW50aW5nIGFsbCBlbGVtZW50cyBtYXkgaW52b2x2ZSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgZWxlbWVudHMgYW5kIGNhbgogICAqIHRoZXJlZm9yZSBiZSBzbG93LgogICAqIFNvbWUgaXRlcmFibGVzIGhhdmUgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZmluZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLgogICAqLwogIGludCBnZXQgbGVuZ3RoIHsKICAgIGFzc2VydCh0aGlzIGlzISBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSk7CiAgICBpbnQgY291bnQgPSAwOwogICAgSXRlcmF0b3IgaXQgPSBpdGVyYXRvcjsKICAgIHdoaWxlIChpdC5tb3ZlTmV4dCgpKSB7CiAgICAgIGNvdW50Kys7CiAgICB9CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudHMgaW4gdGhpcyBjb2xsZWN0aW9uLgogICAqCiAgICogTWF5IGJlIGNvbXB1dGVkIGJ5IGNoZWNraW5nIGlmIGBpdGVyYXRvci5tb3ZlTmV4dCgpYCByZXR1cm5zIGBmYWxzZWAuCiAgICovCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiAhaXRlcmF0b3IubW92ZU5leHQoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBlbGVtZW50IGluIHRoaXMgY29sbGVjdGlvbi4KICAgKgogICAqIE1heSBiZSBjb21wdXRlZCBieSBjaGVja2luZyBpZiBgaXRlcmF0b3IubW92ZU5leHQoKWAgcmV0dXJucyBgdHJ1ZWAuCiAgICovCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKCiAgLyoqCiAgICogUmV0dXJucyBhIGxhenkgaXRlcmFibGUgb2YgdGhlIFtjb3VudF0gZmlyc3QgZWxlbWVudHMgb2YgdGhpcyBpdGVyYWJsZS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBgSXRlcmFibGVgIG1heSBjb250YWluIGZld2VyIHRoYW4gYGNvdW50YCBlbGVtZW50cywgaWYgYHRoaXNgCiAgICogY29udGFpbnMgZmV3ZXIgdGhhbiBgY291bnRgIGVsZW1lbnRzLgogICAqCiAgICogVGhlIGVsZW1lbnRzIGNhbiBiZSBjb21wdXRlZCBieSBzdGVwcGluZyB0aHJvdWdoIFtpdGVyYXRvcl0gdW50aWwgW2NvdW50XQogICAqIGVsZW1lbnRzIGhhdmUgYmVlbiBzZWVuLgogICAqCiAgICogVGhlIGBjb3VudGAgbXVzdCBub3QgYmUgbmVnYXRpdmUuCiAgICovCiAgSXRlcmFibGU8RT4gdGFrZShpbnQgY291bnQpIHsKICAgIHJldHVybiBUYWtlSXRlcmFibGU8RT4odGhpcywgY291bnQpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIGxhenkgaXRlcmFibGUgb2YgdGhlIGxlYWRpbmcgZWxlbWVudHMgc2F0aXNmeWluZyBbdGVzdF0uCiAgICoKICAgKiBUaGUgZmlsdGVyaW5nIGhhcHBlbnMgbGF6aWx5LiBFdmVyeSBuZXcgaXRlcmF0b3Igb2YgdGhlIHJldHVybmVkCiAgICogaXRlcmFibGUgc3RhcnRzIGl0ZXJhdGluZyBvdmVyIHRoZSBlbGVtZW50cyBvZiBgdGhpc2AuCiAgICoKICAgKiBUaGUgZWxlbWVudHMgY2FuIGJlIGNvbXB1dGVkIGJ5IHN0ZXBwaW5nIHRocm91Z2ggW2l0ZXJhdG9yXSB1bnRpbCBhbgogICAqIGVsZW1lbnQgaXMgZm91bmQgd2hlcmUgYHRlc3QoZWxlbWVudClgIGlzIGZhbHNlLiBBdCB0aGF0IHBvaW50LAogICAqIHRoZSByZXR1cm5lZCBpdGVyYWJsZSBzdG9wcyAoaXRzIGBtb3ZlTmV4dCgpYCByZXR1cm5zIGZhbHNlKS4KICAgKi8KICBJdGVyYWJsZTxFPiB0YWtlV2hpbGUoYm9vbCB0ZXN0KEUgdmFsdWUpKSB7CiAgICByZXR1cm4gVGFrZVdoaWxlSXRlcmFibGU8RT4odGhpcywgdGVzdCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGFuIFtJdGVyYWJsZV0gdGhhdCBwcm92aWRlcyBhbGwgYnV0IHRoZSBmaXJzdCBbY291bnRdIGVsZW1lbnRzLgogICAqCiAgICogV2hlbiB0aGUgcmV0dXJuZWQgaXRlcmFibGUgaXMgaXRlcmF0ZWQsIGl0IHN0YXJ0cyBpdGVyYXRpbmcgb3ZlciBgdGhpc2AsCiAgICogZmlyc3Qgc2tpcHBpbmcgcGFzdCB0aGUgaW5pdGlhbCBbY291bnRdIGVsZW1lbnRzLgogICAqIElmIGB0aGlzYCBoYXMgZmV3ZXIgdGhhbiBgY291bnRgIGVsZW1lbnRzLCB0aGVuIHRoZSByZXN1bHRpbmcgSXRlcmFibGUgaXMKICAgKiBlbXB0eS4KICAgKiBBZnRlciB0aGF0LCB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGFyZSBpdGVyYXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcwogICAqIGluIHRoaXMgaXRlcmFibGUuCiAgICoKICAgKiBTb21lIGl0ZXJhYmxlcyBtYXkgYmUgYWJsZSB0byBmaW5kIGxhdGVyIGVsZW1lbnRzIHdpdGhvdXQgZmlyc3QgaXRlcmF0aW5nCiAgICogdGhyb3VnaCBlYXJsaWVyIGVsZW1lbnRzLCBmb3IgZXhhbXBsZSB3aGVuIGl0ZXJhdGluZyBhIFtMaXN0XS4KICAgKiBTdWNoIGl0ZXJhYmxlcyBhcmUgYWxsb3dlZCB0byBpZ25vcmUgdGhlIGluaXRpYWwgc2tpcHBlZCBlbGVtZW50cy4KICAgKgogICAqIFRoZSBbY291bnRdIG11c3Qgbm90IGJlIG5lZ2F0aXZlLgogICAqLwogIEl0ZXJhYmxlPEU+IHNraXAoaW50IGNvdW50KSB7CiAgICByZXR1cm4gU2tpcEl0ZXJhYmxlPEU+KHRoaXMsIGNvdW50KTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYW4gYEl0ZXJhYmxlYCB0aGF0IHNraXBzIGxlYWRpbmcgZWxlbWVudHMgd2hpbGUgW3Rlc3RdIGlzIHNhdGlzZmllZC4KICAgKgogICAqIFRoZSBmaWx0ZXJpbmcgaGFwcGVucyBsYXppbHkuIEV2ZXJ5IG5ldyBbSXRlcmF0b3JdIG9mIHRoZSByZXR1cm5lZAogICAqIGl0ZXJhYmxlIGl0ZXJhdGVzIG92ZXIgYWxsIGVsZW1lbnRzIG9mIGB0aGlzYC4KICAgKgogICAqIFRoZSByZXR1cm5lZCBpdGVyYWJsZSBwcm92aWRlcyBlbGVtZW50cyBieSBpdGVyYXRpbmcgdGhpcyBpdGVyYWJsZSwKICAgKiBidXQgc2tpcHBpbmcgb3ZlciBhbGwgaW5pdGlhbCBlbGVtZW50cyB3aGVyZSBgdGVzdChlbGVtZW50KWAgcmV0dXJucwogICAqIHRydWUuIElmIGFsbCBlbGVtZW50cyBzYXRpc2Z5IGB0ZXN0YCB0aGUgcmVzdWx0aW5nIGl0ZXJhYmxlIGlzIGVtcHR5LAogICAqIG90aGVyd2lzZSBpdCBpdGVyYXRlcyB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGluIHRoZWlyIG9yaWdpbmFsIG9yZGVyLAogICAqIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgZm9yIHdoaWNoIGB0ZXN0KGVsZW1lbnQpYCByZXR1cm5zIGBmYWxzZWAuCiAgICovCiAgSXRlcmFibGU8RT4gc2tpcFdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgewogICAgcmV0dXJuIFNraXBXaGlsZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudC4KICAgKgogICAqIFRocm93cyBhIFtTdGF0ZUVycm9yXSBpZiBgdGhpc2AgaXMgZW1wdHkuCiAgICogT3RoZXJ3aXNlIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdGlvbiBvcmRlciwKICAgKiBlcXVpdmFsZW50IHRvIGB0aGlzLmVsZW1lbnRBdCgwKWAuCiAgICovCiAgRSBnZXQgZmlyc3QgewogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIH0KICAgIHJldHVybiBpdC5jdXJyZW50OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50LgogICAqCiAgICogVGhyb3dzIGEgW1N0YXRlRXJyb3JdIGlmIGB0aGlzYCBpcyBlbXB0eS4KICAgKiBPdGhlcndpc2UgbWF5IGl0ZXJhdGUgdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIHJldHVybnMgdGhlIGxhc3Qgb25lCiAgICogc2Vlbi4KICAgKiBTb21lIGl0ZXJhYmxlcyBtYXkgaGF2ZSBtb3JlIGVmZmljaWVudCB3YXlzIHRvIGZpbmQgdGhlIGxhc3QgZWxlbWVudAogICAqIChmb3IgZXhhbXBsZSBhIGxpc3QgY2FuIGRpcmVjdGx5IGFjY2VzcyB0aGUgbGFzdCBlbGVtZW50LAogICAqIHdpdGhvdXQgaXRlcmF0aW5nIHRocm91Z2ggdGhlIHByZXZpb3VzIG9uZXMpLgogICAqLwogIEUgZ2V0IGxhc3QgewogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIH0KICAgIEUgcmVzdWx0OwogICAgZG8gewogICAgICByZXN1bHQgPSBpdC5jdXJyZW50OwogICAgfSB3aGlsZSAoaXQubW92ZU5leHQoKSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogQ2hlY2tzIHRoYXQgdGhpcyBpdGVyYWJsZSBoYXMgb25seSBvbmUgZWxlbWVudCwgYW5kIHJldHVybnMgdGhhdCBlbGVtZW50LgogICAqCiAgICogVGhyb3dzIGEgW1N0YXRlRXJyb3JdIGlmIGB0aGlzYCBpcyBlbXB0eSBvciBoYXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50LgogICAqLwogIEUgZ2V0IHNpbmdsZSB7CiAgICBJdGVyYXRvcjxFPiBpdCA9IGl0ZXJhdG9yOwogICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIEUgcmVzdWx0ID0gaXQuY3VycmVudDsKICAgIGlmIChpdC5tb3ZlTmV4dCgpKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IHNhdGlzZmllcyB0aGUgZ2l2ZW4gcHJlZGljYXRlIFt0ZXN0XS4KICAgKgogICAqIEl0ZXJhdGVzIHRocm91Z2ggZWxlbWVudHMgYW5kIHJldHVybnMgdGhlIGZpcnN0IHRvIHNhdGlzZnkgW3Rlc3RdLgogICAqCiAgICogSWYgbm8gZWxlbWVudCBzYXRpc2ZpZXMgW3Rlc3RdLCB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBbb3JFbHNlXQogICAqIGZ1bmN0aW9uIGlzIHJldHVybmVkLgogICAqIElmIFtvckVsc2VdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRocm93aW5nIGEgW1N0YXRlRXJyb3JdLgogICAqLwogIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDsKICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgdGhhdCBzYXRpc2ZpZXMgdGhlIGdpdmVuIHByZWRpY2F0ZSBbdGVzdF0uCiAgICoKICAgKiBBbiBpdGVyYWJsZSB0aGF0IGNhbiBhY2Nlc3MgaXRzIGVsZW1lbnRzIGRpcmVjdGx5IG1heSBjaGVjayBpdHMKICAgKiBlbGVtZW50cyBpbiBhbnkgb3JkZXIgKGZvciBleGFtcGxlIGEgbGlzdCBzdGFydHMgYnkgY2hlY2tpbmcgdGhlCiAgICogbGFzdCBlbGVtZW50IGFuZCB0aGVuIG1vdmVzIHRvd2FyZHMgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0KS4KICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpdGVyYXRlcyBlbGVtZW50cyBpbiBpdGVyYXRpb24gb3JkZXIsCiAgICogY2hlY2tzIGB0ZXN0KGVsZW1lbnQpYCBmb3IgZWFjaCwKICAgKiBhbmQgZmluYWxseSByZXR1cm5zIHRoYXQgbGFzdCBvbmUgdGhhdCBtYXRjaGVkLgogICAqCiAgICogSWYgbm8gZWxlbWVudCBzYXRpc2ZpZXMgW3Rlc3RdLCB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBbb3JFbHNlXQogICAqIGZ1bmN0aW9uIGlzIHJldHVybmVkLgogICAqIElmIFtvckVsc2VdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRocm93aW5nIGEgW1N0YXRlRXJyb3JdLgogICAqLwogIEUgbGFzdFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pIHsKICAgIEUgcmVzdWx0OwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmVzdWx0ID0gZWxlbWVudDsKICAgICAgICBmb3VuZE1hdGNoaW5nID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgaWYgKGZvdW5kTWF0Y2hpbmcpIHJldHVybiByZXN1bHQ7CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc2luZ2xlIGVsZW1lbnQgdGhhdCBzYXRpc2ZpZXMgW3Rlc3RdLgogICAqCiAgICogQ2hlY2tzIGVsZW1lbnRzIHRvIHNlZSBpZiBgdGVzdChlbGVtZW50KWAgcmV0dXJucyB0cnVlLgogICAqIElmIGV4YWN0bHkgb25lIGVsZW1lbnQgc2F0aXNmaWVzIFt0ZXN0XSwgdGhhdCBlbGVtZW50IGlzIHJldHVybmVkLgogICAqIElmIG1vcmUgdGhhbiBvbmUgbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZCwgdGhyb3dzIFtTdGF0ZUVycm9yXS4KICAgKiBJZiBubyBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kLCByZXR1cm5zIHRoZSByZXN1bHQgb2YgW29yRWxzZV0uCiAgICogSWYgW29yRWxzZV0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gdGhyb3dpbmcgYSBbU3RhdGVFcnJvcl0uCiAgICovCiAgRSBzaW5nbGVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBFIHJlc3VsdDsKICAgIGJvb2wgZm91bmRNYXRjaGluZyA9IGZhbHNlOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIGlmIChmb3VuZE1hdGNoaW5nKSB7CiAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CiAgICAgICAgZm91bmRNYXRjaGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3VuZE1hdGNoaW5nKSByZXR1cm4gcmVzdWx0OwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIFtpbmRleF10aCBlbGVtZW50LgogICAqCiAgICogVGhlIFtpbmRleF0gbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIGxlc3MgdGhhbiBbbGVuZ3RoXS4KICAgKiBJbmRleCB6ZXJvIHJlcHJlc2VudHMgdGhlIGZpcnN0IGVsZW1lbnQgKHNvIGBpdGVyYWJsZS5lbGVtZW50QXQoMClgIGlzCiAgICogZXF1aXZhbGVudCB0byBgaXRlcmFibGUuZmlyc3RgKS4KICAgKgogICAqIE1heSBpdGVyYXRlIHRocm91Z2ggdGhlIGVsZW1lbnRzIGluIGl0ZXJhdGlvbiBvcmRlciwgaWdub3JpbmcgdGhlCiAgICogZmlyc3QgW2luZGV4XSBlbGVtZW50cyBhbmQgdGhlbiByZXR1cm5pbmcgdGhlIG5leHQuCiAgICogU29tZSBpdGVyYWJsZXMgbWF5IGhhdmUgbW9yZSBhIGVmZmljaWVudCB3YXkgdG8gZmluZCB0aGUgZWxlbWVudC4KICAgKi8KICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGluZGV4LCAiaW5kZXgiKTsKICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShpbmRleCwgImluZGV4Iik7CiAgICBpbnQgZWxlbWVudEluZGV4ID0gMDsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKGluZGV4ID09IGVsZW1lbnRJbmRleCkgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIGVsZW1lbnRJbmRleCsrOwogICAgfQogICAgdGhyb3cgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4IiwgbnVsbCwgZWxlbWVudEluZGV4KTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgKHNvbWUgb2YpIHRoZSBlbGVtZW50cyBvZiBgdGhpc2AuCiAgICoKICAgKiBFbGVtZW50cyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlaXIgb3duIGB0b1N0cmluZ2AgcmVzdWx0cy4KICAgKgogICAqIFRoZSBkZWZhdWx0IHJlcHJlc2VudGF0aW9uIGFsd2F5cyBjb250YWlucyB0aGUgZmlyc3QgdGhyZWUgZWxlbWVudHMuCiAgICogSWYgdGhlcmUgYXJlIGxlc3MgdGhhbiBhIGh1bmRyZWQgZWxlbWVudHMgaW4gdGhlIGl0ZXJhYmxlLCBpdCBhbHNvCiAgICogY29udGFpbnMgdGhlIGxhc3QgdHdvIGVsZW1lbnRzLgogICAqCiAgICogSWYgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXNuJ3QgYWJvdmUgODAgY2hhcmFjdGVycywgbW9yZSBlbGVtZW50cyBhcmUKICAgKiBpbmNsdWRlZCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaXRlcmFibGUuCiAgICoKICAgKiBUaGUgY29udmVyc2lvbiBtYXkgb21pdCBjYWxsaW5nIGB0b1N0cmluZ2Agb24gc29tZSBlbGVtZW50cyBpZiB0aGV5CiAgICogYXJlIGtub3duIHRvIG5vdCBvY2N1ciBpbiB0aGUgb3V0cHV0LCBhbmQgaXQgbWF5IHN0b3AgaXRlcmF0aW5nIGFmdGVyCiAgICogYSBodW5kcmVkIGVsZW1lbnRzLgogICAqLwogIFN0cmluZyB0b1N0cmluZygpID0+IEl0ZXJhYmxlQmFzZS5pdGVyYWJsZVRvU2hvcnRTdHJpbmcodGhpcywgJygnLCAnKScpOwp9Cgp0eXBlZGVmIF9HZW5lcmF0b3I8RT4gPSBFIEZ1bmN0aW9uKGludCBpbmRleCk7CgpjbGFzcyBfR2VuZXJhdG9ySXRlcmFibGU8RT4gZXh0ZW5kcyBMaXN0SXRlcmFibGU8RT4gewogIC8vLyBUaGUgbGVuZ3RoIG9mIHRoZSBnZW5lcmF0ZWQgaXRlcmFibGUuCiAgZmluYWwgaW50IGxlbmd0aDsKCiAgLy8vIFRoZSBmdW5jdGlvbiBtYXBwaW5nIGluZGljZXMgdG8gdmFsdWVzLgogIGZpbmFsIF9HZW5lcmF0b3I8RT4gX2dlbmVyYXRvcjsKCiAgLy8vIENyZWF0ZXMgdGhlIGdlbmVyYXRlZCBpdGVyYWJsZS4KICAvLy8KICAvLy8gSWYgW2dlbmVyYXRvcl0gaXMgYG51bGxgLCBpdCBpcyBjaGVja2VkIHRoYXQgYGludGAgaXMgYXNzaWduYWJsZSB0byBbRV0uCiAgX0dlbmVyYXRvckl0ZXJhYmxlKHRoaXMubGVuZ3RoLCBFIGdlbmVyYXRvcihpbnQgaW5kZXgpKQogICAgICA6IC8vIFRoZSBgYXNgIGJlbG93IGlzIHVzZWQgYXMgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgYGludGAgaXMgYXNzaWduYWJsZQogICAgICAgIC8vIHRvIFtFXS4KICAgICAgICBfZ2VuZXJhdG9yID0gKGdlbmVyYXRvciAhPSBudWxsKSA/IGdlbmVyYXRvciA6IF9pZCBhcyBfR2VuZXJhdG9yPEU+OwoKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZEluZGV4KGluZGV4LCB0aGlzKTsKICAgIHJldHVybiBfZ2VuZXJhdG9yKGluZGV4KTsKICB9CgogIC8vLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBhcyBkZWZhdWx0IF9nZW5lcmF0b3IgZnVuY3Rpb24uCiAgc3RhdGljIGludCBfaWQoaW50IG4pID0+IG47Cn0KCi8qKgogKiBBbiBJdGVyYXRvciB0aGF0IGFsbG93cyBtb3ZpbmcgYmFja3dhcmRzIGFzIHdlbGwgYXMgZm9yd2FyZHMuCiAqLwphYnN0cmFjdCBjbGFzcyBCaWRpcmVjdGlvbmFsSXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgLyoqCiAgICogTW92ZSBiYWNrIHRvIHRoZSBwcmV2aW91cyBlbGVtZW50LgogICAqCiAgICogUmV0dXJucyB0cnVlIGFuZCB1cGRhdGVzIFtjdXJyZW50XSBpZiBzdWNjZXNzZnVsLiBSZXR1cm5zIGZhbHNlCiAgICogYW5kIHNldHMgW2N1cnJlbnRdIHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgZWxlbWVudC4KICAgKi8KICBib29sIG1vdmVQcmV2aW91cygpOwp9CoLFAE5OPAETAQRNA0ZJRiMzMjwqA0M8QTtHSzIDO1ALQSQDMTpIKjsJAzU5AzBIUU02SxYDNh9DLzAyO0wDSUpPSyoDPDRPNkQDR0JBA00xTkwWBB1ERBQBBkUFMklJBURHRg8FTy0GQy80BAEGIAVHEgY1AQYtBUdNTlAGOyIBBkkRBUg5RiAFPkJOPDkFQUg3REIrBUlEF0oWBhwBBkcFRUZEBUVLBjoGQwVMSxkGLi5ABi8EAQZFSAVHTkxKNgVGMzYGQQEGRhcFSCEFOD43TjU5BksBBkkFSCEFOE46OwY8AQZJBT86BUUnBQ4FJ0AvBSBANQUGNSUBBkwFSEYZBVA+BVE1NDtABiIYJQYSBAEGTgwGJCgEAQZONAUyOwVMSg8FIy4sDRcFNAU/BQYsKiAuBiAiMAYSBAEGSjYFL0M6BSMjLAsXBTQFPgUGRR49EgQBBkUFRUcGJR4oBhEEAQZHBTFDMToGKSopKjALLSUNKyQhLQgGHgQBBkMFREUGIx4mBhIEAQZCBSo2BiszBAEGRAU7OTlLGgYnAQYvBU4YTgYTLhMcHA8GEgQBBkEFSwYsAQZHBUoGIwEGTQVQKwVPHgUnBiApBAEGSAVGPAVKRUMGLi0EAQZNBU43TwxKFwVPREgFJwYgKQQBBlIFSDQFSUpLS1AGLi0EAQYgBS9BKAYQHxouBhcEAQYfBS9JC0o/MwYPHxouBg4JGx0TBAEGTwVMBhEfQBs9EwQBBkoFSAVJG0UGNR4pBiksBAEGSQVFRkFGJjUFSRtFBjQOIB4bGh4IBiYpLAQBBjcFPUhGRkUGNg4gHhsdMAoaHggGJiksBAEGJAU+TCYFRzlHBhswMRoeMRYGRgQBBkoFPwVKSCUFSi4FSUsZBksCAS8BNiwUAS4iASYGTzpRE00BGy0eBAE7HgIBBEEEQQYoBUVBBhcCARdkYXJ0OmNvcmUvaXRlcmFibGUuZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2NvcmVfcGF0Y2guZGFydJJuLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBOb3RlOiB0aGUgVk0gY29uY2F0ZW5hdGVzIGFsbCBwYXRjaCBmaWxlcyBpbnRvIGEgc2luZ2xlIHBhdGNoIGZpbGUuIFRoaXMKLy8vIGZpbGUgaXMgdGhlIGZpcnN0IHBhdGNoIGluICJkYXJ0OmNvcmUiIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW1wb3J0cwovLy8gdXNlZCBieSBwYXRjaGVzIG9mIHRoYXQgbGlicmFyeS4gV2UgcGxhbiB0byBjaGFuZ2UgdGhpcyB3aGVuIHdlIGhhdmUgYQovLy8gc2hhcmVkIGZyb250IGVuZCBhbmQgc2ltcGx5IHVzZSBwYXJ0cy4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIGFzIGludGVybmFsIHNob3cgU3ltYm9sOwoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIKICAgIHNob3cKICAgICAgICBDbGFzc0lELAogICAgICAgIENvZGVVbml0cywKICAgICAgICBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSwKICAgICAgICBGaXhlZExlbmd0aExpc3RCYXNlLAogICAgICAgIEl0ZXJhYmxlRWxlbWVudEVycm9yLAogICAgICAgIExpc3RJdGVyYXRvciwKICAgICAgICBMaXN0cywKICAgICAgICBQT1dFUlNfT0ZfVEVOLAogICAgICAgIFN1Ykxpc3RJdGVyYWJsZSwKICAgICAgICBVbm1vZGlmaWFibGVMaXN0QmFzZSwKICAgICAgICBpczY0Qml0LAogICAgICAgIG1ha2VGaXhlZExpc3RVbm1vZGlmaWFibGUsCiAgICAgICAgbWFrZUxpc3RGaXhlZExlbmd0aCwKICAgICAgICBwYXRjaCwKICAgICAgICB1bnNhZmVDYXN0OwoKaW1wb3J0ICJkYXJ0OmFzeW5jIiBzaG93IENvbXBsZXRlciwgRnV0dXJlLCBUaW1lcjsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIgogICAgc2hvdwogICAgICAgIEhhc2hNYXAsCiAgICAgICAgSXRlcmFibGVCYXNlLAogICAgICAgIExpbmtlZEhhc2hNYXAsCiAgICAgICAgTGlua2VkTGlzdCwKICAgICAgICBMaW5rZWRMaXN0RW50cnksCiAgICAgICAgTGlzdEJhc2UsCiAgICAgICAgTWFwQmFzZSwKICAgICAgICBNYXBzLAogICAgICAgIFVubW9kaWZpYWJsZU1hcEJhc2UsCiAgICAgICAgVW5tb2RpZmlhYmxlTWFwVmlldzsKCmltcG9ydCAiZGFydDpjb252ZXJ0IiBzaG93IGFzY2lpLCBFbmNvZGluZywganNvbiwgbGF0aW4xLCB1dGY4OwoKaW1wb3J0ICJkYXJ0Omlzb2xhdGUiIHNob3cgSXNvbGF0ZTsKCmltcG9ydCAiZGFydDptYXRoIiBzaG93IFJhbmRvbTsKCmltcG9ydCAiZGFydDp0eXBlZF9kYXRhIgogICAgc2hvdyBFbmRpYW4sIFVpbnQ4TGlzdCwgSW50NjRMaXN0LCBVaW50MTZMaXN0LCBVaW50MzJMaXN0OwoKLy8vIFRoZXNlIGFyZSB0aGUgYWRkaXRpb25hbCBwYXJ0cyBvZiB0aGlzIHBhdGNoIGxpYnJhcnk6Ci8vIHBhcnQgImFycmF5LmRhcnQiOwovLyBwYXJ0ICJhcnJheV9wYXRjaC5kYXJ0IjsKLy8gcGFydCAiYmlnaW50X3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJib29sX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJkYXRlX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJkb3VibGUuZGFydCI7Ci8vIHBhcnQgImRvdWJsZV9wYXRjaC5kYXJ0IjsKLy8gcGFydCAiZXJyb3JzX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJleHBhbmRvX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJmdW5jdGlvbi5kYXJ0IjsKLy8gcGFydCAiZnVuY3Rpb25fcGF0Y2guZGFydCI7Ci8vIHBhcnQgImdyb3dhYmxlX2FycmF5LmRhcnQiOwovLyBwYXJ0ICJpZGVudGljYWxfcGF0Y2guZGFydCI7Ci8vIHBhcnQgImltbXV0YWJsZV9tYXAuZGFydCI7Ci8vIHBhcnQgImludGVnZXJzLmRhcnQiOwovLyBwYXJ0ICJpbnRlZ2Vyc19wYXRjaC5kYXJ0IjsKLy8gcGFydCAiaW52b2NhdGlvbl9taXJyb3JfcGF0Y2guZGFydCI7Ci8vIHBhcnQgImxpYl9wcmVmaXguZGFydCI7Ci8vIHBhcnQgIm1hcF9wYXRjaC5kYXJ0IjsKLy8gcGFydCAibnVsbF9wYXRjaC5kYXJ0IjsKLy8gcGFydCAib2JqZWN0X3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJyZWdleHBfcGF0Y2guZGFydCI7Ci8vIHBhcnQgInN0YWNrdHJhY2UuZGFydCI7Ci8vIHBhcnQgInN0b3B3YXRjaF9wYXRjaC5kYXJ0IjsKLy8gcGFydCAic3RyaW5nX2J1ZmZlcl9wYXRjaC5kYXJ0IjsKLy8gcGFydCAic3RyaW5nX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJ0eXBlX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJ1cmlfcGF0Y2guZGFydCI7Ci8vIHBhcnQgIndlYWtfcHJvcGVydHkuZGFydCI7CgpAcGF0Y2gKY2xhc3MgbnVtIHsKICBudW0gX2FkZEZyb21JbnRlZ2VyKGludCBvdGhlcik7CiAgbnVtIF9zdWJGcm9tSW50ZWdlcihpbnQgb3RoZXIpOwogIG51bSBfbXVsRnJvbUludGVnZXIoaW50IG90aGVyKTsKICBpbnQgX3RydW5jRGl2RnJvbUludGVnZXIoaW50IG90aGVyKTsKICBudW0gX21vZHVsb0Zyb21JbnRlZ2VyKGludCBvdGhlcik7CiAgbnVtIF9yZW1haW5kZXJGcm9tSW50ZWdlcihpbnQgb3RoZXIpOwogIGJvb2wgX2dyZWF0ZXJUaGFuRnJvbUludGVnZXIoaW50IG90aGVyKTsKICBib29sIF9lcXVhbFRvSW50ZWdlcihpbnQgb3RoZXIpOwp9CgovLyBfU3luY0l0ZXJhYmxlIGFuZCBfc3luY0l0ZXJhdG9yIGFyZSB1c2VkIGJ5IHRoZSBjb21waWxlciB0bwovLyBpbXBsZW1lbnQgc3luYyogZ2VuZXJhdG9yIGZ1bmN0aW9ucy4gQSBzeW5jKiBnZW5lcmF0b3IgYWxsb2NhdGVzCi8vIGFuZCByZXR1cm5zIGEgbmV3IF9TeW5jSXRlcmFibGUgb2JqZWN0LgoKdHlwZWRlZiBib29sIF9TeW5jR2VuZXJhdG9yQ2FsbGJhY2s8VD4oX1N5bmNJdGVyYXRvcjxUPiBpdGVyYXRvcik7CgpjbGFzcyBfU3luY0l0ZXJhYmxlPFQ+IGV4dGVuZHMgSXRlcmFibGVCYXNlPFQ+IHsKICAvLyBfbW92ZU5leHRGbiBpcyB0aGUgY2xvc3VyaXplZCBib2R5IG9mIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24uCiAgZmluYWwgX1N5bmNHZW5lcmF0b3JDYWxsYmFjazxUPiBfbW92ZU5leHRGbjsKCiAgY29uc3QgX1N5bmNJdGVyYWJsZSh0aGlzLl9tb3ZlTmV4dEZuKTsKCiAgSXRlcmF0b3I8VD4gZ2V0IGl0ZXJhdG9yIHsKICAgIC8vIE5vdGU6IF9DbG9zdXJlLl9jbG9uZSByZXR1cm5zIF9DbG9zdXJlIHdoaWNoIGlzIG5vdCByZWxhdGVkIHRvCiAgICAvLyBfU3luY0dlbmVyYXRvckNhbGxiYWNrLCB3aGljaCBtZWFucyB3ZSBuZWVkIGV4cGxpY2l0IGNhc3QuCiAgICByZXR1cm4gbmV3IF9TeW5jSXRlcmF0b3I8VD4odW5zYWZlQ2FzdDxfU3luY0dlbmVyYXRvckNhbGxiYWNrPFQ+PigKICAgICAgICB1bnNhZmVDYXN0PF9DbG9zdXJlPihfbW92ZU5leHRGbikuX2Nsb25lKCkpKTsKICB9Cn0KCmNsYXNzIF9TeW5jSXRlcmF0b3I8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7CiAgX1N5bmNHZW5lcmF0b3JDYWxsYmFjazxUPiBfbW92ZU5leHRGbjsKICBJdGVyYXRvcjxUPiBfeWllbGRFYWNoSXRlcmF0b3I7CgogIC8vIFRoZXNlIHR3byBmaWVsZHMgYXJlIHNldCBieSBnZW5lcmF0ZWQgY29kZSBmb3IgdGhlIHlpZWxkIGFuZCB5aWVsZCoKICAvLyBzdGF0ZW1lbnQuCiAgVCBfY3VycmVudDsKICBJdGVyYWJsZTxUPiBfeWllbGRFYWNoSXRlcmFibGU7CgogIFQgZ2V0IGN1cnJlbnQgPT4KICAgICAgX3lpZWxkRWFjaEl0ZXJhdG9yICE9IG51bGwgPyBfeWllbGRFYWNoSXRlcmF0b3IuY3VycmVudCA6IF9jdXJyZW50OwoKICBfU3luY0l0ZXJhdG9yKHRoaXMuX21vdmVOZXh0Rm4pOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9tb3ZlTmV4dEZuID09IG51bGwpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKF95aWVsZEVhY2hJdGVyYXRvciAhPSBudWxsKSB7CiAgICAgICAgaWYgKF95aWVsZEVhY2hJdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgX3lpZWxkRWFjaEl0ZXJhdG9yID0gbnVsbDsKICAgICAgfQogICAgICAvLyBfbW92ZU5leHRGbigpIHdpbGwgdXBkYXRlIHRoZSB2YWx1ZXMgb2YgX3lpZWxkRWFjaEl0ZXJhYmxlCiAgICAgIC8vICBhbmQgX2N1cnJlbnQuCiAgICAgIGlmICghX21vdmVOZXh0Rm4odGhpcykpIHsKICAgICAgICBfbW92ZU5leHRGbiA9IG51bGw7CiAgICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoX3lpZWxkRWFjaEl0ZXJhYmxlICE9IG51bGwpIHsKICAgICAgICAvLyBTcGVjIG1hbmRhdGVzOiBpdCBpcyBhIGR5bmFtaWMgZXJyb3IgaWYgdGhlIGNsYXNzIG9mIFt0aGUgb2JqZWN0CiAgICAgICAgLy8gcmV0dXJuZWQgYnkgeWllbGQqXSBkb2VzIG5vdCBpbXBsZW1lbnQgSXRlcmFibGUuCiAgICAgICAgX3lpZWxkRWFjaEl0ZXJhdG9yID0gX3lpZWxkRWFjaEl0ZXJhYmxlLml0ZXJhdG9yOwogICAgICAgIF95aWVsZEVhY2hJdGVyYWJsZSA9IG51bGw7CiAgICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KfQoKQHBhdGNoCmNsYXNzIFN0YWNrVHJhY2UgewogIEBwYXRjaAogIHN0YXRpYyBTdGFja1RyYWNlIGdldCBjdXJyZW50IG5hdGl2ZSAiU3RhY2tUcmFjZV9jdXJyZW50IjsKfQqAqABOTjwBTUpLKwExARgJERMhHR4WDxcZHhEjHQ8UATMBGQkRFhcUGRIRDh0dAUABJAEgARk/AToWHB0bGxcdHR4ZHx8gHhkfKBsaGx0dGyAkHRsaHgEHDCIiIiclKCsjAgE/RCsBQwExQy8BKQEdRkJHNgQCATApIgFJEA4iARNKASMBFB8UBhMoLRcKIwhEGCAcGRYIKEw8OiMZEggTBgQCAQcTCT0CAR9kYXJ0OmNvcmUtcGF0Y2gvY29yZV9wYXRjaC5kYXJ0Km9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvYXJyYXkuZGFydJ0gLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9MaXN0PEU+IGV4dGVuZHMgRml4ZWRMZW5ndGhMaXN0QmFzZTxFPiB7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfTGlzdCkKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBmYWN0b3J5IF9MaXN0KGxlbmd0aCkgbmF0aXZlICJMaXN0X2FsbG9jYXRlIjsKCiAgRSBvcGVyYXRvciBbXShpbnQgaW5kZXgpIG5hdGl2ZSAiTGlzdF9nZXRJbmRleGVkIjsKCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBFIHZhbHVlKSB7CiAgICBfc2V0SW5kZXhlZChpbmRleCwgdmFsdWUpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZChpbnQgaW5kZXgsIEUgdmFsdWUpIG5hdGl2ZSAiTGlzdF9zZXRJbmRleGVkIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIGludCBnZXQgbGVuZ3RoIG5hdGl2ZSAiTGlzdF9nZXRMZW5ndGgiOwoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBMaXN0IF9zbGljZShpbnQgc3RhcnQsIGludCBjb3VudCwgYm9vbCBuZWVkc1R5cGVBcmd1bWVudCkgewogICAgaWYgKGNvdW50IDw9IDY0KSB7CiAgICAgIGZpbmFsIHJlc3VsdCA9IG5lZWRzVHlwZUFyZ3VtZW50ID8gbmV3IF9MaXN0PEU+KGNvdW50KSA6IG5ldyBfTGlzdChjb3VudCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcmVzdWx0W2ldID0gdGhpc1tzdGFydCArIGldOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gX3NsaWNlSW50ZXJuYWwoc3RhcnQsIGNvdW50LCBuZWVkc1R5cGVBcmd1bWVudCk7CiAgICB9CiAgfQoKICBMaXN0IF9zbGljZUludGVybmFsKGludCBzdGFydCwgaW50IGNvdW50LCBib29sIG5lZWRzVHlwZUFyZ3VtZW50KQogICAgICBuYXRpdmUgIkxpc3Rfc2xpY2UiOwoKICAvLyBMaXN0IGludGVyZmFjZS4KICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RT4gaXRlcmFibGUsIFtpbnQgc2tpcENvdW50ID0gMF0pIHsKICAgIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPiB0aGlzLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgdGhpcy5sZW5ndGgpOwogICAgfQogICAgaWYgKGVuZCA8IHN0YXJ0IHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGVuZCwgc3RhcnQsIHRoaXMubGVuZ3RoKTsKICAgIH0KICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuOwogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBpdGVyYWJsZSkpIHsKICAgICAgTGlzdHMuY29weSh0aGlzLCBza2lwQ291bnQsIHRoaXMsIHN0YXJ0LCBsZW5ndGgpOwogICAgfSBlbHNlIGlmIChDbGFzc0lELmdldElEKGl0ZXJhYmxlKSA9PSBDbGFzc0lELmNpZEFycmF5KSB7CiAgICAgIGZpbmFsIF9MaXN0PEU+IGl0ZXJhYmxlQXNMaXN0ID0gaXRlcmFibGU7CiAgICAgIExpc3RzLmNvcHkoaXRlcmFibGVBc0xpc3QsIHNraXBDb3VudCwgdGhpcywgc3RhcnQsIGxlbmd0aCk7CiAgICB9IGVsc2UgaWYgKGl0ZXJhYmxlIGlzIExpc3Q8RT4pIHsKICAgICAgTGlzdHMuY29weShpdGVyYWJsZSwgc2tpcENvdW50LCB0aGlzLCBzdGFydCwgbGVuZ3RoKTsKICAgIH0gZWxzZSB7CiAgICAgIEl0ZXJhdG9yIGl0ID0gaXRlcmFibGUuaXRlcmF0b3I7CiAgICAgIHdoaWxlIChza2lwQ291bnQgPiAwKSB7CiAgICAgICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSByZXR1cm47CiAgICAgICAgc2tpcENvdW50LS07CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHJldHVybjsKICAgICAgICB0aGlzW2ldID0gaXQuY3VycmVudDsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHRoaXMubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGluZGV4LCAwLCB0aGlzLmxlbmd0aCwgImluZGV4Iik7CiAgICB9CiAgICBMaXN0PEU+IGl0ZXJhYmxlQXNMaXN0OwogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBpdGVyYWJsZSkpIHsKICAgICAgaXRlcmFibGVBc0xpc3QgPSB0aGlzOwogICAgfSBlbHNlIGlmIChDbGFzc0lELmdldElEKGl0ZXJhYmxlKSA9PSBDbGFzc0lELmNpZEFycmF5KSB7CiAgICAgIGl0ZXJhYmxlQXNMaXN0ID0gaXRlcmFibGU7CiAgICB9IGVsc2UgaWYgKGl0ZXJhYmxlIGlzIExpc3Q8RT4pIHsKICAgICAgaXRlcmFibGVBc0xpc3QgPSBpdGVyYWJsZTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAodmFyIHZhbHVlIGluIGl0ZXJhYmxlKSB7CiAgICAgICAgdGhpc1tpbmRleCsrXSA9IHZhbHVlOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGludCBsZW5ndGggPSBpdGVyYWJsZUFzTGlzdC5sZW5ndGg7CiAgICBpZiAoaW5kZXggKyBsZW5ndGggPiB0aGlzLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShpbmRleCArIGxlbmd0aCwgMCwgdGhpcy5sZW5ndGgpOwogICAgfQogICAgTGlzdHMuY29weShpdGVyYWJsZUFzTGlzdCwgMCwgdGhpcywgaW5kZXgsIGxlbmd0aCk7CiAgfQoKICBMaXN0PEU+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIDxFPltdOwogICAgdmFyIHJlc3VsdCA9IG5ldyBfR3Jvd2FibGVMaXN0PEU+Ll93aXRoRGF0YShfc2xpY2Uoc3RhcnQsIGxlbmd0aCwgZmFsc2UpKTsKICAgIHJlc3VsdC5fc2V0TGVuZ3RoKGxlbmd0aCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gSXRlcmFibGUgaW50ZXJmYWNlLgoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICB2b2lkIGZvckVhY2goZihFIGVsZW1lbnQpKSB7CiAgICBmaW5hbCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgZih0aGlzW2ldKTsKICAgIH0KICB9CgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IF9GaXhlZFNpemVBcnJheUl0ZXJhdG9yPEU+KHRoaXMpOwogIH0KCiAgRSBnZXQgZmlyc3QgewogICAgaWYgKGxlbmd0aCA+IDApIHJldHVybiB0aGlzWzBdOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGdldCBsYXN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1tsZW5ndGggLSAxXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPT0gMSkgcmV0dXJuIHRoaXNbMF07CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogIH0KCiAgTGlzdDxFPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBpZiAobGVuZ3RoID4gMCkgewogICAgICB2YXIgcmVzdWx0ID0gX3NsaWNlKDAsIGxlbmd0aCwgIWdyb3dhYmxlKTsKICAgICAgaWYgKGdyb3dhYmxlKSB7CiAgICAgICAgcmVzdWx0ID0gbmV3IF9Hcm93YWJsZUxpc3Q8RT4uX3dpdGhEYXRhKHJlc3VsdCkuLl9zZXRMZW5ndGgobGVuZ3RoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLy8gX0dyb3dhYmxlTGlzdC5fd2l0aERhdGEgbXVzdCBub3QgYmUgY2FsbGVkIHdpdGggZW1wdHkgbGlzdC4KICAgIHJldHVybiBncm93YWJsZSA/IDxFPltdIDogbmV3IExpc3Q8RT4oMCk7CiAgfQp9CgovLyBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGNsYXNzIGFzIF9MaXN0LCBidXQgaXQgZG9lcyBub3QKLy8gcGVybWl0IGFueSBtb2RpZmljYXRpb24gb2YgYXJyYXkgZWxlbWVudHMgZnJvbSBEYXJ0IGNvZGUuIFdlIHVzZQovLyB0aGlzIGNsYXNzIGZvciBhcnJheXMgY29uc3RydWN0ZWQgZnJvbSBEYXJ0IGFycmF5IGxpdGVyYWxzLgovLyBUT0RPKGhhdXNuZXIpOiBXZSBzaG91bGQgY29uc2lkZXIgdGhlIHRyYWRlLW9mZnMgYmV0d2VlbiB0d28KLy8gY2xhc3NlcyAoYW5kIGlubGluZSBjYWNoZSBtaXNzZXMpIHZlcnN1cyBhIGZpZWxkIGluIHRoZSBuYXRpdmUKLy8gaW1wbGVtZW50YXRpb24gKGNoZWNrcyB3aGVuIG1vZGlmeWluZykuIFdlIHNob3VsZCBrZWVwIHdhdGNoaW5nCi8vIHRoZSBpbmxpbmUgY2FjaGUgbWlzc2VzLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9JbW11dGFibGVMaXN0PEU+IGV4dGVuZHMgVW5tb2RpZmlhYmxlTGlzdEJhc2U8RT4gewogIGZhY3RvcnkgX0ltbXV0YWJsZUxpc3QuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkltbXV0YWJsZUFycmF5IGNhbiBvbmx5IGJlIGFsbG9jYXRlZCBieSB0aGUgVk0iKTsKICB9CgogIGZhY3RvcnkgX0ltbXV0YWJsZUxpc3QuX2Zyb20oTGlzdCBmcm9tLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIkltbXV0YWJsZUxpc3RfZnJvbSI7CgogIEUgb3BlcmF0b3IgW10oaW50IGluZGV4KSBuYXRpdmUgIkxpc3RfZ2V0SW5kZXhlZCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBpbnQgZ2V0IGxlbmd0aCBuYXRpdmUgIkxpc3RfZ2V0TGVuZ3RoIjsKCiAgTGlzdDxFPiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiA8RT5bXTsKICAgIExpc3QgbGlzdCA9IG5ldyBfTGlzdChsZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBsaXN0W2ldID0gdGhpc1tzdGFydCArIGldOwogICAgfQogICAgdmFyIHJlc3VsdCA9IG5ldyBfR3Jvd2FibGVMaXN0PEU+Ll93aXRoRGF0YShsaXN0KTsKICAgIHJlc3VsdC5fc2V0TGVuZ3RoKGxlbmd0aCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gQ29sbGVjdGlvbiBpbnRlcmZhY2UuCgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIHZvaWQgZm9yRWFjaChmKEUgZWxlbWVudCkpIHsKICAgIGZpbmFsIGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBmKHRoaXNbaV0pOwogICAgfQogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBuZXcgX0ZpeGVkU2l6ZUFycmF5SXRlcmF0b3I8RT4odGhpcyk7CiAgfQoKICBFIGdldCBmaXJzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbMF07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgaWYgKGxlbmd0aCA+IDApIHJldHVybiB0aGlzW2xlbmd0aCAtIDFdOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGdldCBzaW5nbGUgewogICAgaWYgKGxlbmd0aCA9PSAxKSByZXR1cm4gdGhpc1swXTsKICAgIGlmIChsZW5ndGggPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgfQoKICBMaXN0PEU+IHRvTGlzdCh7Ym9vbCBncm93YWJsZTogdHJ1ZX0pIHsKICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGlmIChsZW5ndGggPiAwKSB7CiAgICAgIExpc3QgbGlzdCA9IGdyb3dhYmxlID8gbmV3IF9MaXN0KGxlbmd0aCkgOiBuZXcgX0xpc3Q8RT4obGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIGxpc3RbaV0gPSB0aGlzW2ldOwogICAgICB9CiAgICAgIGlmICghZ3Jvd2FibGUpIHJldHVybiBsaXN0OwogICAgICB2YXIgcmVzdWx0ID0gbmV3IF9Hcm93YWJsZUxpc3Q8RT4uX3dpdGhEYXRhKGxpc3QpOwogICAgICByZXN1bHQuX3NldExlbmd0aChsZW5ndGgpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIGdyb3dhYmxlID8gPEU+W10gOiBuZXcgX0xpc3Q8RT4oMCk7CiAgfQp9CgovLyBJdGVyYXRvciBmb3IgYXJyYXlzIHdpdGggZml4ZWQgc2l6ZS4KY2xhc3MgX0ZpeGVkU2l6ZUFycmF5SXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgZmluYWwgTGlzdDxFPiBfYXJyYXk7CiAgZmluYWwgaW50IF9sZW5ndGg7IC8vIENhY2hlIGFycmF5IGxlbmd0aCBmb3IgZmFzdGVyIGFjY2Vzcy4KICBpbnQgX2luZGV4OwogIEUgX2N1cnJlbnQ7CgogIF9GaXhlZFNpemVBcnJheUl0ZXJhdG9yKExpc3Q8RT4gYXJyYXkpCiAgICAgIDogX2FycmF5ID0gYXJyYXksCiAgICAgICAgX2xlbmd0aCA9IGFycmF5Lmxlbmd0aCwKICAgICAgICBfaW5kZXggPSAwIHsKICAgIGFzc2VydChhcnJheSBpcyBfTGlzdDxFPiB8fCBhcnJheSBpcyBfSW1tdXRhYmxlTGlzdDxFPik7CiAgfQoKICBFIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9pbmRleCA+PSBfbGVuZ3RoKSB7CiAgICAgIF9jdXJyZW50ID0gbnVsbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX2N1cnJlbnQgPSBfYXJyYXlbX2luZGV4XTsKICAgIF9pbmRleCsrOwogICAgcmV0dXJuIHRydWU7CiAgfQp9CoEEAE5OPAEeARowKR4wATUBKh8EAUEBNB4qAR4+F1EwJQgVDT4GBAFEGwEVUSw5Biw7Bh4dJTg+MEImPA0nHiQVCCokHggGBAExLEIGHCUdPiEmIQ0kHwgOBigoQgY4BAEqPx4jTx8TBAEZAR4fICcSBgQBHh0xBAEQJCwEAQ8tLAQBESU9KgQBKh4WMRZNCBUGQy4EAgFARD9AQkMcGjotIDsEAUIjATUBNB4qASo/HiMjJyEGNx8TBAEbAR4fICcSBgQBHh0xBAEQJCwEAQ8tLAQBESU9KgQBKh4WRykbCCI5IRUGLwQCASg6GD4ODgEpGCAVPQQBHQEeFB0XFAYfDhEEAgEaZGFydDpjb3JlLXBhdGNoL2FycmF5LmRhcnQxb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9iaWdpbnRfcGF0Y2guZGFydMABfR4vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiBkYXJ0LmNvcmU7CgovLyBDb3B5cmlnaHQgMjAwOSBUaGUgR28gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKLy8gbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLyoKICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgIFRvbSBXdQogKiBDb3B5cmlnaHQgKGMpIDIwMTIgQWRhbSBTaW5nZXIgKGFkYW1Ac29sdnIuaW8pCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQogKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkKICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogKgogKiBJTiBOTyBFVkVOVCBTSEFMTCBUT00gV1UgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwKICogSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSCiAqIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YKICogVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBBUklTSU5HIE9VVAogKiBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKgogKiBJbiBhZGRpdGlvbiwgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gYXBwbGllczoKICoKICogQWxsIHJlZGlzdHJpYnV0aW9ucyBtdXN0IHJldGFpbiBhbiBpbnRhY3QgY29weSBvZiB0aGlzIGNvcHlyaWdodCBub3RpY2UKICogYW5kIGRpc2NsYWltZXIuCiAqLwoKQHBhdGNoCmNsYXNzIEJpZ0ludCBpbXBsZW1lbnRzIENvbXBhcmFibGU8QmlnSW50PiB7CiAgQHBhdGNoCiAgc3RhdGljIEJpZ0ludCBnZXQgemVybyA9PiBfQmlnSW50SW1wbC56ZXJvOwogIEBwYXRjaAogIHN0YXRpYyBCaWdJbnQgZ2V0IG9uZSA9PiBfQmlnSW50SW1wbC5vbmU7CiAgQHBhdGNoCiAgc3RhdGljIEJpZ0ludCBnZXQgdHdvID0+IF9CaWdJbnRJbXBsLnR3bzsKCiAgQHBhdGNoCiAgc3RhdGljIEJpZ0ludCBwYXJzZShTdHJpbmcgc291cmNlLCB7aW50IHJhZGl4fSkgPT4KICAgICAgX0JpZ0ludEltcGwucGFyc2Uoc291cmNlLCByYWRpeDogcmFkaXgpOwoKICBAcGF0Y2gKICBzdGF0aWMgQmlnSW50IHRyeVBhcnNlKFN0cmluZyBzb3VyY2UsIHtpbnQgcmFkaXh9KSA9PgogICAgICBfQmlnSW50SW1wbC5fdHJ5UGFyc2Uoc291cmNlLCByYWRpeDogcmFkaXgpOwoKICBAcGF0Y2gKICBmYWN0b3J5IEJpZ0ludC5mcm9tKG51bSB2YWx1ZSkgPT4gbmV3IF9CaWdJbnRJbXBsLmZyb20odmFsdWUpOwp9CgppbnQgX21heChpbnQgYSwgaW50IGIpID0+IGEgPiBiID8gYSA6IGI7CmludCBfbWluKGludCBhLCBpbnQgYikgPT4gYSA8IGIgPyBhIDogYjsKCi8vLyBBbGxvY2F0ZSBhIG5ldyBkaWdpdHMgbGlzdCBvZiBldmVuIGxlbmd0aC4KVWludDMyTGlzdCBfbmV3RGlnaXRzKGludCBsZW5ndGgpID0+IG5ldyBVaW50MzJMaXN0KGxlbmd0aCArIChsZW5ndGggJiAxKSk7CgovKioKICogQW4gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBhcmJpdHJhcmlseSBsYXJnZSBpbnRlZ2VyLgogKgogKiBUaGUgaW50ZWdlciBudW1iZXIgaXMgcmVwcmVzZW50ZWQgYnkgYSBzaWduLCBhbiBhcnJheSBvZiAzMi1iaXQgdW5zaWduZWQKICogaW50ZWdlcnMgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIGFuZCBhIG51bWJlciBvZiB1c2VkIGRpZ2l0cyBpbiB0aGF0IGFycmF5LgogKi8KY2xhc3MgX0JpZ0ludEltcGwgaW1wbGVtZW50cyBCaWdJbnQgewogIC8vIEJpdHMgcGVyIGRpZ2l0LgogIHN0YXRpYyBjb25zdCBpbnQgX2RpZ2l0Qml0cyA9IDMyOwogIHN0YXRpYyBjb25zdCBpbnQgX2RpZ2l0QmFzZSA9IDEgPDwgX2RpZ2l0Qml0czsKICBzdGF0aWMgY29uc3QgaW50IF9kaWdpdE1hc2sgPSAoMSA8PCBfZGlnaXRCaXRzKSAtIDE7CgogIC8vIEJpdHMgcGVyIGhhbGYgZGlnaXQuCiAgc3RhdGljIGNvbnN0IGludCBfaGFsZkRpZ2l0Qml0cyA9IF9kaWdpdEJpdHMgPj4gMTsKICBzdGF0aWMgY29uc3QgaW50IF9oYWxmRGlnaXRNYXNrID0gKDEgPDwgX2hhbGZEaWdpdEJpdHMpIC0gMTsKCiAgc3RhdGljIGZpbmFsIF9CaWdJbnRJbXBsIHplcm8gPSBuZXcgX0JpZ0ludEltcGwuX2Zyb21JbnQoMCk7CiAgc3RhdGljIGZpbmFsIF9CaWdJbnRJbXBsIG9uZSA9IG5ldyBfQmlnSW50SW1wbC5fZnJvbUludCgxKTsKICBzdGF0aWMgZmluYWwgX0JpZ0ludEltcGwgdHdvID0gbmV3IF9CaWdJbnRJbXBsLl9mcm9tSW50KDIpOwoKICBzdGF0aWMgZmluYWwgX0JpZ0ludEltcGwgX21pbnVzT25lID0gLW9uZTsKICBzdGF0aWMgZmluYWwgX0JpZ0ludEltcGwgX29uZURpZ2l0TWFzayA9IG5ldyBfQmlnSW50SW1wbC5fZnJvbUludChfZGlnaXRNYXNrKTsKICBzdGF0aWMgZmluYWwgX0JpZ0ludEltcGwgX3R3b0RpZ2l0TWFzayA9IChvbmUgPDwgKDIgKiBfZGlnaXRCaXRzKSkgLSBvbmU7CiAgc3RhdGljIGZpbmFsIF9CaWdJbnRJbXBsIF9vbmVCaWxsaW9uID0gbmV3IF9CaWdJbnRJbXBsLl9mcm9tSW50KDEwMDAwMDAwMDApOwogIHN0YXRpYyBjb25zdCBpbnQgX21pbkludCA9IC0weDgwMDAwMDAwMDAwMDAwMDA7CiAgc3RhdGljIGNvbnN0IGludCBfbWF4SW50ID0gMHg3ZmZmZmZmZmZmZmZmZmZmOwoKICAvLyBSZXN1bHQgY2FjaGUgZm9yIGxhc3QgX2RpdlJlbSBjYWxsLgogIC8vIFJlc3VsdCBjYWNoZSBmb3IgbGFzdCBfZGl2UmVtIGNhbGwuCiAgc3RhdGljIFVpbnQzMkxpc3QgX2xhc3REaXZpZGVuZERpZ2l0czsKICBzdGF0aWMgaW50IF9sYXN0RGl2aWRlbmRVc2VkOwogIHN0YXRpYyBVaW50MzJMaXN0IF9sYXN0RGl2aXNvckRpZ2l0czsKICBzdGF0aWMgaW50IF9sYXN0RGl2aXNvclVzZWQ7CiAgc3RhdGljIFVpbnQzMkxpc3QgX2xhc3RRdW9SZW1EaWdpdHM7CiAgc3RhdGljIGludCBfbGFzdFF1b1JlbVVzZWQ7CiAgc3RhdGljIGludCBfbGFzdFJlbVVzZWQ7CiAgc3RhdGljIGludCBfbGFzdFJlbV9uc2g7CgogIC8vLyBXaGV0aGVyIHRoaXMgYmlnaW50IGlzIG5lZ2F0aXZlLgogIGZpbmFsIGJvb2wgX2lzTmVnYXRpdmU7CgogIC8vLyBUaGUgdW5zaWduZWQgZGlnaXRzIG9mIHRoaXMgYmlnaW50LgogIC8vLwogIC8vLyBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgZGlnaXQgaXMgaW4gc2xvdCAwLgogIC8vLyBUaGUgbGlzdCBtYXkgaGF2ZSBtb3JlIGRpZ2l0cyB0aGFuIG5lZWRlZC4gVGhhdCBpcywgYF9kaWdpdHMubGVuZ3RoYCBtYXkKICAvLy8gYmUgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIGBfdXNlZGAuCiAgLy8vIEFsc28sIGBfZGlnaXRzLmxlbmd0aGAgbXVzdCBhbHdheXMgYmUgZXZlbiwgYmVjYXVzZSBpbnRyaW5zaWNzIG9uIDY0LWJpdAogIC8vLyBwbGF0Zm9ybXMgbWF5IHByb2Nlc3MgYSBkaWdpdCBwYWlyIGFzIGEgNjQtYml0IHZhbHVlLgogIGZpbmFsIFVpbnQzMkxpc3QgX2RpZ2l0czsKCiAgLy8vIFRoZSBudW1iZXIgb2YgdXNlZCBlbnRyaWVzIGluIFtfZGlnaXRzXS4KICAvLy8KICAvLy8gVG8gYXZvaWQgcmVhbGxvY2F0aW5nIFtVaW50MzJMaXN0XXMsIGxpc3RzIHRoYXQgYXJlIHRvbyBiaWcgYXJlIG5vdAogIC8vLyByZXBsYWNlZCwgYnV0IGBfdXNlZGAgcmVmbGVjdHMgdGhlIHNtYWxsZXIgbnVtYmVyIG9mIGRpZ2l0cyBhY3R1YWxseSB1c2VkLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgZnVuY3Rpb25zIHNob3J0ZW5pbmcgYW4gZXhpc3RpbmcgbGlzdCBvZiBkaWdpdHMgdG8gYSBzbWFsbGVyCiAgLy8vIGBfdXNlZGAgbnVtYmVyIG9mIGRpZ2l0cyBtdXN0IGVuc3VyZSB0aGF0IHRoZSBoaWdoZXJtb3N0IHBhaXIgb2YgZGlnaXRzCiAgLy8vIGlzIGNvcnJlY3Qgd2hlbiByZWFkIGFzIGEgNjQtYml0IHZhbHVlIGJ5IGludHJpbnNpY3MuIFRoZXJlZm9yZSwgaWYgdGhlCiAgLy8vIHNtYWxsZXIgJ191c2VkJyBudW1iZXIgaXMgb2RkLCB0aGUgaGlnaCBkaWdpdCBvZiB0aGF0IHBhaXIgbXVzdCBiZQogIC8vLyBleHBsaWNpdGx5IGNsZWFyZWQsIGkuZS4gX2RpZ2l0c1tfdXNlZF0gPSAwLCB3aGljaCBjYW5ub3QgcmVzdWx0IGluIGFuCiAgLy8vIG91dCBvZiBib3VuZHMgYWNjZXNzLCBzaW5jZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGlzIGd1YXJhbnRlZWQgdG8gYmUKICAvLy8gZXZlbi4KICBmaW5hbCBpbnQgX3VzZWQ7CgogIC8qKgogICAqIFBhcnNlcyBbc291cmNlXSBhcyBhLCBwb3NzaWJseSBzaWduZWQsIGludGVnZXIgbGl0ZXJhbCBhbmQgcmV0dXJucyBpdHMKICAgKiB2YWx1ZS4KICAgKgogICAqIFRoZSBbc291cmNlXSBtdXN0IGJlIGEgbm9uLWVtcHR5IHNlcXVlbmNlIG9mIGJhc2UtW3JhZGl4XSBkaWdpdHMsCiAgICogb3B0aW9uYWxseSBwcmVmaXhlZCB3aXRoIGEgbWludXMgb3IgcGx1cyBzaWduICgnLScgb3IgJysnKS4KICAgKgogICAqIFRoZSBbcmFkaXhdIG11c3QgYmUgaW4gdGhlIHJhbmdlIDIuLjM2LiBUaGUgZGlnaXRzIHVzZWQgYXJlCiAgICogZmlyc3QgdGhlIGRlY2ltYWwgZGlnaXRzIDAuLjksIGFuZCB0aGVuIHRoZSBsZXR0ZXJzICdhJy4uJ3onIHdpdGgKICAgKiB2YWx1ZXMgMTAgdGhyb3VnaCAzNS4gQWxzbyBhY2NlcHRzIHVwcGVyLWNhc2UgbGV0dGVycyB3aXRoIHRoZSBzYW1lCiAgICogdmFsdWVzIGFzIHRoZSBsb3dlci1jYXNlIG9uZXMuCiAgICoKICAgKiBJZiBubyBbcmFkaXhdIGlzIGdpdmVuIHRoZW4gaXQgZGVmYXVsdHMgdG8gMTAuIEluIHRoaXMgY2FzZSwgdGhlIFtzb3VyY2VdCiAgICogZGlnaXRzIG1heSBhbHNvIHN0YXJ0IHdpdGggYDB4YCwgaW4gd2hpY2ggY2FzZSB0aGUgbnVtYmVyIGlzIGludGVycHJldGVkCiAgICogYXMgYSBoZXhhZGVjaW1hbCBsaXRlcmFsLCB3aGljaCBlZmZlY3RpdmVseSBtZWFucyB0aGF0IHRoZSBgMHhgIGlzIGlnbm9yZWQKICAgKiBhbmQgdGhlIHJhZGl4IGlzIGluc3RlYWQgc2V0IHRvIDE2LgogICAqCiAgICogRm9yIGFueSBpbnQgYG5gIGFuZCByYWRpeCBgcmAsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdAogICAqIGBuID09IGludC5wYXJzZShuLnRvUmFkaXhTdHJpbmcociksIHJhZGl4OiByKWAuCiAgICoKICAgKiBUaHJvd3MgYSBbRm9ybWF0RXhjZXB0aW9uXSBpZiB0aGUgW3NvdXJjZV0gaXMgbm90IGEgdmFsaWQgaW50ZWdlciBsaXRlcmFsLAogICAqIG9wdGlvbmFsbHkgcHJlZml4ZWQgYnkgYSBzaWduLgogICAqLwogIHN0YXRpYyBfQmlnSW50SW1wbCBwYXJzZShTdHJpbmcgc291cmNlLCB7aW50IHJhZGl4fSkgewogICAgdmFyIHJlc3VsdCA9IF90cnlQYXJzZShzb3VyY2UsIHJhZGl4OiByYWRpeCk7CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiQ291bGQgbm90IHBhcnNlIEJpZ0ludCIsIHNvdXJjZSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFBhcnNlcyBhIGRlY2ltYWwgYmlnaW50IGxpdGVyYWwuCiAgLy8vCiAgLy8vIFRoZSBbc291cmNlXSBtdXN0IG5vdCBjb250YWluIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZS4KICBzdGF0aWMgX0JpZ0ludEltcGwgX3BhcnNlRGVjaW1hbChTdHJpbmcgc291cmNlLCBib29sIGlzTmVnYXRpdmUpIHsKICAgIGNvbnN0IF8wID0gNDg7CgogICAgaW50IHBhcnQgPSAwOwogICAgX0JpZ0ludEltcGwgcmVzdWx0ID0gemVybzsKICAgIC8vIFJlYWQgaW4gdGhlIHNvdXJjZSA5IGRpZ2l0cyBhdCBhIHRpbWUuCiAgICAvLyBUaGUgZmlyc3QgcGFydCBtYXkgaGF2ZSBhIGZldyBsZWFkaW5nIHZpcnR1YWwgJzAncyB0byBtYWtlIHRoZSByZW1haW5pbmcKICAgIC8vIHBhcnRzIGFsbCBoYXZlIGV4YWN0bHkgOSBkaWdpdHMuCiAgICBpbnQgZGlnaXRJblBhcnRDb3VudCA9IDkgLSBzb3VyY2UubGVuZ3RoLnJlbWFpbmRlcig5KTsKICAgIGlmIChkaWdpdEluUGFydENvdW50ID09IDkpIGRpZ2l0SW5QYXJ0Q291bnQgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHsKICAgICAgcGFydCA9IHBhcnQgKiAxMCArIHNvdXJjZS5jb2RlVW5pdEF0KGkpIC0gXzA7CiAgICAgIGlmICgrK2RpZ2l0SW5QYXJ0Q291bnQgPT0gOSkgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdCAqIF9vbmVCaWxsaW9uICsgbmV3IF9CaWdJbnRJbXBsLl9mcm9tSW50KHBhcnQpOwogICAgICAgIHBhcnQgPSAwOwogICAgICAgIGRpZ2l0SW5QYXJ0Q291bnQgPSAwOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNOZWdhdGl2ZSkgcmV0dXJuIC1yZXN1bHQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gc291cmNlIGRpZ2l0LgogIC8vLwogIC8vLyBTb3VyY2UgZGlnaXRzIGJldHdlZW4gIjAiIGFuZCAiOSIgKGluY2x1c2l2ZSkgcmV0dXJuIHRoZWlyIGRlY2ltYWwgdmFsdWUuCiAgLy8vCiAgLy8vIFNvdXJjZSBkaWdpdHMgYmV0d2VlbiAiYSIgYW5kICJ6Iiwgb3IgIkEiIGFuZCAiWiIgKGluY2x1c2l2ZSkgcmV0dXJuCiAgLy8vIDEwICsgdGhlaXIgcG9zaXRpb24gaW4gdGhlIEFTQ0lJIGFscGhhYmV0LgogIC8vLwogIC8vLyBUaGUgaW5jb21pbmcgW2NvZGVVbml0XSBtdXN0IGJlIGFuIEFTQ0lJIGNvZGUtdW5pdC4KICBzdGF0aWMgaW50IF9jb2RlVW5pdFRvUmFkaXhWYWx1ZShpbnQgY29kZVVuaXQpIHsKICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2hhcmFjdGVycyBtdXN0IGJlIEFTQ0lJIGFzIG90aGVyd2lzZSB0aGUKICAgIC8vIHJlZ2V4cCB3b3VsZG4ndCBoYXZlIG1hdGNoZWQuIExvd2VyY2FzaW5nIGJ5IGRvaW5nIGB8IDB4MjBgIGlzIHRodXMKICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgYSBzYWZlIG9wZXJhdGlvbiwgc2luY2UgaXQgcHJlc2VydmVzIGRpZ2l0cwogICAgLy8gYW5kIGxvd2VyLWNhc2VzIEFTQ0lJIGxldHRlcnMuCiAgICBjb25zdCBpbnQgXzAgPSA0ODsKICAgIGNvbnN0IGludCBfOSA9IDU3OwogICAgY29uc3QgaW50IF9hID0gOTc7CiAgICBpZiAoXzAgPD0gY29kZVVuaXQgJiYgY29kZVVuaXQgPD0gXzkpIHJldHVybiBjb2RlVW5pdCAtIF8wOwogICAgY29kZVVuaXQgfD0gMHgyMDsKICAgIHZhciByZXN1bHQgPSBjb2RlVW5pdCAtIF9hICsgMTA7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFBhcnNlcyB0aGUgZ2l2ZW4gW3NvdXJjZV0gc3RyaW5nLCBzdGFydGluZyBhdCBbc3RhcnRQb3NdLCBhcyBhIGhleAogIC8vLyBsaXRlcmFsLgogIC8vLwogIC8vLyBJZiBbaXNOZWdhdGl2ZV0gaXMgdHJ1ZSwgbmVnYXRlcyB0aGUgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcgaXQuCiAgLy8vCiAgLy8vIFRoZSBbc291cmNlXSAoc3Vic3RyaW5nKSBtdXN0IGJlIGEgdmFsaWQgaGV4IGxpdGVyYWwuCiAgc3RhdGljIF9CaWdJbnRJbXBsIF9wYXJzZUhleChTdHJpbmcgc291cmNlLCBpbnQgc3RhcnRQb3MsIGJvb2wgaXNOZWdhdGl2ZSkgewogICAgaW50IGhleENoYXJzUGVyRGlnaXQgPSBfZGlnaXRCaXRzIH4vIDQ7CiAgICBpbnQgc291cmNlTGVuZ3RoID0gc291cmNlLmxlbmd0aCAtIHN0YXJ0UG9zOwogICAgaW50IHVzZWQgPSAoc291cmNlTGVuZ3RoICsgaGV4Q2hhcnNQZXJEaWdpdCAtIDEpIH4vIGhleENoYXJzUGVyRGlnaXQ7CiAgICB2YXIgZGlnaXRzID0gX25ld0RpZ2l0cyh1c2VkKTsKCiAgICBpbnQgbGFzdERpZ2l0TGVuZ3RoID0gc291cmNlTGVuZ3RoIC0gKHVzZWQgLSAxKSAqIGhleENoYXJzUGVyRGlnaXQ7CiAgICBpbnQgZGlnaXRJbmRleCA9IHVzZWQgLSAxOwogICAgaW50IGkgPSBzdGFydFBvczsKICAgIGludCBkaWdpdCA9IDA7CiAgICBmb3IgKGludCBqID0gMDsgaiA8IGxhc3REaWdpdExlbmd0aDsgaisrKSB7CiAgICAgIHZhciB2YWx1ZSA9IF9jb2RlVW5pdFRvUmFkaXhWYWx1ZShzb3VyY2UuY29kZVVuaXRBdChpKyspKTsKICAgICAgaWYgKHZhbHVlID49IDE2KSByZXR1cm4gbnVsbDsKICAgICAgZGlnaXQgPSBkaWdpdCAqIDE2ICsgdmFsdWU7CiAgICB9CiAgICBkaWdpdHNbZGlnaXRJbmRleC0tXSA9IGRpZ2l0OwoKICAgIHdoaWxlIChpIDwgc291cmNlLmxlbmd0aCkgewogICAgICBkaWdpdCA9IDA7CiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaGV4Q2hhcnNQZXJEaWdpdDsgaisrKSB7CiAgICAgICAgdmFyIHZhbHVlID0gX2NvZGVVbml0VG9SYWRpeFZhbHVlKHNvdXJjZS5jb2RlVW5pdEF0KGkrKykpOwogICAgICAgIGlmICh2YWx1ZSA+PSAxNikgcmV0dXJuIG51bGw7CiAgICAgICAgZGlnaXQgPSBkaWdpdCAqIDE2ICsgdmFsdWU7CiAgICAgIH0KICAgICAgZGlnaXRzW2RpZ2l0SW5kZXgtLV0gPSBkaWdpdDsKICAgIH0KICAgIGlmICh1c2VkID09IDEgJiYgZGlnaXRzWzBdID09IDApIHJldHVybiB6ZXJvOwogICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKGlzTmVnYXRpdmUsIHVzZWQsIGRpZ2l0cyk7CiAgfQoKICAvLy8gUGFyc2VzIHRoZSBnaXZlbiBbc291cmNlXSBhcyBhIFtyYWRpeF0gbGl0ZXJhbC4KICAvLy8KICAvLy8gVGhlIFtzb3VyY2VdIHdpbGwgYmUgY2hlY2tlZCBmb3IgaW52YWxpZCBjaGFyYWN0ZXJzLiBJZiBpdCBpcyBpbnZhbGlkLAogIC8vLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYG51bGxgLgogIHN0YXRpYyBfQmlnSW50SW1wbCBfcGFyc2VSYWRpeChTdHJpbmcgc291cmNlLCBpbnQgcmFkaXgsIGJvb2wgaXNOZWdhdGl2ZSkgewogICAgdmFyIHJlc3VsdCA9IHplcm87CiAgICB2YXIgYmFzZSA9IG5ldyBfQmlnSW50SW1wbC5fZnJvbUludChyYWRpeCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgewogICAgICB2YXIgdmFsdWUgPSBfY29kZVVuaXRUb1JhZGl4VmFsdWUoc291cmNlLmNvZGVVbml0QXQoaSkpOwogICAgICBpZiAodmFsdWUgPj0gcmFkaXgpIHJldHVybiBudWxsOwogICAgICByZXN1bHQgPSByZXN1bHQgKiBiYXNlICsgbmV3IF9CaWdJbnRJbXBsLl9mcm9tSW50KHZhbHVlKTsKICAgIH0KICAgIGlmIChpc05lZ2F0aXZlKSByZXR1cm4gLXJlc3VsdDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gVHJpZXMgdG8gcGFyc2UgdGhlIGdpdmVuIFtzb3VyY2VdIGFzIGEgW3JhZGl4XSBsaXRlcmFsLgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSBwYXJzZWQgYmlnIGludGVnZXIsIG9yIGBudWxsYCBpZiBpdCBmYWlsZWQuCiAgLy8vCiAgLy8vIElmIHRoZSBbcmFkaXhdIGlzIGBudWxsYCBhY2NlcHRzIGRlY2ltYWwgbGl0ZXJhbHMgb3IgYDB4YCBoZXggbGl0ZXJhbHMuCiAgc3RhdGljIF9CaWdJbnRJbXBsIF90cnlQYXJzZShTdHJpbmcgc291cmNlLCB7aW50IHJhZGl4fSkgewogICAgaWYgKHNvdXJjZSA9PSAiIikgcmV0dXJuIG51bGw7CgogICAgdmFyIHJlID0gbmV3IFJlZ0V4cChyJ15ccyooWystXT8pKCgweFthLWYwLTldKyl8KFxkKyl8KFthLXowLTldKykpXHMqJCcsCiAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UpOwogICAgdmFyIG1hdGNoID0gcmUuZmlyc3RNYXRjaChzb3VyY2UpOwogICAgaW50IHNpZ25JbmRleCA9IDE7CiAgICBpbnQgaGV4SW5kZXggPSAzOwogICAgaW50IGRlY2ltYWxJbmRleCA9IDQ7CiAgICBpbnQgbm9uRGVjaW1hbEhleEluZGV4ID0gNTsKICAgIGlmIChtYXRjaCA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgICBib29sIGlzTmVnYXRpdmUgPSBtYXRjaFtzaWduSW5kZXhdID09ICItIjsKCiAgICBTdHJpbmcgZGVjaW1hbE1hdGNoID0gbWF0Y2hbZGVjaW1hbEluZGV4XTsKICAgIFN0cmluZyBoZXhNYXRjaCA9IG1hdGNoW2hleEluZGV4XTsKICAgIFN0cmluZyBub25EZWNpbWFsTWF0Y2ggPSBtYXRjaFtub25EZWNpbWFsSGV4SW5kZXhdOwoKICAgIGlmIChyYWRpeCA9PSBudWxsKSB7CiAgICAgIGlmIChkZWNpbWFsTWF0Y2ggIT0gbnVsbCkgewogICAgICAgIC8vIENhbm5vdCBmYWlsIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSBkaWdpdHMgYXJlIGFsbCBkZWNpbWFsLgogICAgICAgIHJldHVybiBfcGFyc2VEZWNpbWFsKGRlY2ltYWxNYXRjaCwgaXNOZWdhdGl2ZSk7CiAgICAgIH0KICAgICAgaWYgKGhleE1hdGNoICE9IG51bGwpIHsKICAgICAgICAvLyBDYW5ub3QgZmFpbCBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGUgZGlnaXRzIGFyZSBhbGwgaGV4LgogICAgICAgIHJldHVybiBfcGFyc2VIZXgoaGV4TWF0Y2gsIDIsIGlzTmVnYXRpdmUpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmIChyYWRpeCBpcyEgaW50KSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKHJhZGl4LCAncmFkaXgnLCAnaXMgbm90IGFuIGludGVnZXInKTsKICAgIH0KICAgIGlmIChyYWRpeCA8IDIgfHwgcmFkaXggPiAzNikgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShyYWRpeCwgMiwgMzYsICdyYWRpeCcpOwogICAgfQogICAgaWYgKHJhZGl4ID09IDEwICYmIGRlY2ltYWxNYXRjaCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfcGFyc2VEZWNpbWFsKGRlY2ltYWxNYXRjaCwgaXNOZWdhdGl2ZSk7CiAgICB9CiAgICBpZiAocmFkaXggPT0gMTYgJiYgKGRlY2ltYWxNYXRjaCAhPSBudWxsIHx8IG5vbkRlY2ltYWxNYXRjaCAhPSBudWxsKSkgewogICAgICByZXR1cm4gX3BhcnNlSGV4KGRlY2ltYWxNYXRjaCA/PyBub25EZWNpbWFsTWF0Y2gsIDAsIGlzTmVnYXRpdmUpOwogICAgfQoKICAgIHJldHVybiBfcGFyc2VSYWRpeCgKICAgICAgICBkZWNpbWFsTWF0Y2ggPz8gbm9uRGVjaW1hbE1hdGNoID8/IGhleE1hdGNoLCByYWRpeCwgaXNOZWdhdGl2ZSk7CiAgfQoKICAvLy8gRmluZHMgdGhlIGFtb3VudCBzaWduaWZpY2FudCBkaWdpdHMgaW4gdGhlIHByb3ZpZGVkIFtkaWdpdHNdIGFycmF5LgogIHN0YXRpYyBpbnQgX25vcm1hbGl6ZShpbnQgdXNlZCwgVWludDMyTGlzdCBkaWdpdHMpIHsKICAgIHdoaWxlICh1c2VkID4gMCAmJiBkaWdpdHNbdXNlZCAtIDFdID09IDApIHVzZWQtLTsKICAgIHJldHVybiB1c2VkOwogIH0KCiAgLy8vIEZhY3RvcnkgcmV0dXJuaW5nIGFuIGluc3RhbmNlIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIGZpZWxkIHZhbHVlcy4KICAvLy8gSWYgdGhlIFtkaWdpdHNdIGFycmF5IGNvbnRhaW5zIGxlYWRpbmcgMHMsIHRoZSBbdXNlZF0gdmFsdWUgaXMgYWRqdXN0ZWQKICAvLy8gYWNjb3JkaW5nbHkuIFRoZSBbZGlnaXRzXSBhcnJheSBpcyBub3QgbW9kaWZpZWQuCiAgX0JpZ0ludEltcGwuXyhib29sIGlzTmVnYXRpdmUsIGludCB1c2VkLCBVaW50MzJMaXN0IGRpZ2l0cykKICAgICAgOiB0aGlzLl9ub3JtYWxpemVkKGlzTmVnYXRpdmUsIF9ub3JtYWxpemUodXNlZCwgZGlnaXRzKSwgZGlnaXRzKTsKCiAgX0JpZ0ludEltcGwuX25vcm1hbGl6ZWQoYm9vbCBpc05lZ2F0aXZlLCB0aGlzLl91c2VkLCB0aGlzLl9kaWdpdHMpCiAgICAgIDogX2lzTmVnYXRpdmUgPSBfdXNlZCA9PSAwID8gZmFsc2UgOiBpc05lZ2F0aXZlIHsKICAgIGFzc2VydChfZGlnaXRzLmxlbmd0aC5pc0V2ZW4pOwogICAgYXNzZXJ0KF91c2VkLmlzRXZlbiB8fCBfZGlnaXRzW191c2VkXSA9PSAwKTsgLy8gTGVhZGluZyB6ZXJvIGZvciA2NC1iaXQuCiAgfQoKICAvLy8gV2hldGhlciB0aGlzIGJpZyBpbnRlZ2VyIGlzIHplcm8uCiAgYm9vbCBnZXQgX2lzWmVybyA9PiBfdXNlZCA9PSAwOwoKICAvLy8gQWxsb2NhdGVzIGFuIGFycmF5IG9mIHRoZSBnaXZlbiBbbGVuZ3RoXSBhbmQgY29waWVzIHRoZSBbZGlnaXRzXSBpbiB0aGUKICAvLy8gcmFuZ2UgW2Zyb21dIHRvIFt0by0xXSwgc3RhcnRpbmcgYXQgaW5kZXggMCwgZm9sbG93ZWQgYnkgbGVhZGluZyB6ZXJvCiAgLy8vIGRpZ2l0cy4KICBzdGF0aWMgVWludDMyTGlzdCBfY2xvbmVEaWdpdHMoCiAgICAgIFVpbnQzMkxpc3QgZGlnaXRzLCBpbnQgZnJvbSwgaW50IHRvLCBpbnQgbGVuZ3RoKSB7CiAgICB2YXIgcmVzdWx0RGlnaXRzID0gX25ld0RpZ2l0cyhsZW5ndGgpOwogICAgdmFyIG4gPSB0byAtIGZyb207CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICByZXN1bHREaWdpdHNbaV0gPSBkaWdpdHNbZnJvbSArIGldOwogICAgfQogICAgcmV0dXJuIHJlc3VsdERpZ2l0czsKICB9CgogIC8vLyBBbGxvY2F0ZXMgYSBiaWcgaW50ZWdlciBmcm9tIHRoZSBwcm92aWRlZCBbdmFsdWVdIG51bWJlci4KICBmYWN0b3J5IF9CaWdJbnRJbXBsLmZyb20obnVtIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gMCkgcmV0dXJuIHplcm87CiAgICBpZiAodmFsdWUgPT0gMSkgcmV0dXJuIG9uZTsKICAgIGlmICh2YWx1ZSA9PSAyKSByZXR1cm4gdHdvOwoKICAgIGlmICh2YWx1ZS5hYnMoKSA8IDB4MTAwMDAwMDAwKQogICAgICByZXR1cm4gbmV3IF9CaWdJbnRJbXBsLl9mcm9tSW50KHZhbHVlLnRvSW50KCkpOwogICAgaWYgKHZhbHVlIGlzIGRvdWJsZSkgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fZnJvbURvdWJsZSh2YWx1ZSk7CiAgICByZXR1cm4gbmV3IF9CaWdJbnRJbXBsLl9mcm9tSW50KHZhbHVlKTsKICB9CgogIGZhY3RvcnkgX0JpZ0ludEltcGwuX2Zyb21JbnQoaW50IHZhbHVlKSB7CiAgICBib29sIGlzTmVnYXRpdmUgPSB2YWx1ZSA8IDA7CiAgICBhc3NlcnQoX2RpZ2l0Qml0cyA9PSAzMik7CiAgICB2YXIgZGlnaXRzID0gX25ld0RpZ2l0cygyKTsKICAgIGlmIChpc05lZ2F0aXZlKSB7CiAgICAgIC8vIEhhbmRsZSB0aGUgbWluIDY0LWJpdCB2YWx1ZSBkaWZmZXJlbnRseSwgc2luY2UgaXRzIG5lZ2F0aW9uIGlzIG5vdAogICAgICAvLyBwb3NpdGl2ZS4KICAgICAgaWYgKHZhbHVlID09IF9taW5JbnQpIHsKICAgICAgICBkaWdpdHNbMV0gPSAweDgwMDAwMDAwOwogICAgICAgIHJldHVybiBuZXcgX0JpZ0ludEltcGwuXyh0cnVlLCAyLCBkaWdpdHMpOwogICAgICB9CiAgICAgIHZhbHVlID0gLXZhbHVlOwogICAgfQogICAgaWYgKHZhbHVlIDwgX2RpZ2l0QmFzZSkgewogICAgICBkaWdpdHNbMF0gPSB2YWx1ZTsKICAgICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKGlzTmVnYXRpdmUsIDEsIGRpZ2l0cyk7CiAgICB9CiAgICBkaWdpdHNbMF0gPSB2YWx1ZSAmIF9kaWdpdE1hc2s7CiAgICBkaWdpdHNbMV0gPSB2YWx1ZSA+PiBfZGlnaXRCaXRzOwogICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKGlzTmVnYXRpdmUsIDIsIGRpZ2l0cyk7CiAgfQoKICAvLy8gQW4gOC1ieXRlIFVpbnQ4TGlzdCB3ZSBjYW4gcmV1c2UgZm9yIFtfZnJvbURvdWJsZV0gdG8gYXZvaWQgZ2VuZXJhdGluZwogIC8vLyBnYXJiYWdlLgogIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgX2JpdHNGb3JGcm9tRG91YmxlID0gbmV3IFVpbnQ4TGlzdCg4KTsKCiAgZmFjdG9yeSBfQmlnSW50SW1wbC5fZnJvbURvdWJsZShkb3VibGUgdmFsdWUpIHsKICAgIGNvbnN0IGludCBleHBvbmVudEJpYXMgPSAxMDc1OwoKICAgIGlmICh2YWx1ZS5pc05hTiB8fCB2YWx1ZS5pc0luZmluaXRlKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJWYWx1ZSBtdXN0IGJlIGZpbml0ZTogJHZhbHVlIik7CiAgICB9CiAgICBib29sIGlzTmVnYXRpdmUgPSB2YWx1ZSA8IDA7CiAgICBpZiAoaXNOZWdhdGl2ZSkgdmFsdWUgPSAtdmFsdWU7CgogICAgdmFsdWUgPSB2YWx1ZS5mbG9vclRvRG91YmxlKCk7CiAgICBpZiAodmFsdWUgPT0gMCkgcmV0dXJuIHplcm87CgogICAgdmFyIGJpdHMgPSBfYml0c0ZvckZyb21Eb3VibGU7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgewogICAgICBiaXRzW2ldID0gMDsKICAgIH0KICAgIGJpdHMuYnVmZmVyLmFzQnl0ZURhdGEoKS5zZXRGbG9hdDY0KDAsIHZhbHVlLCBFbmRpYW4ubGl0dGxlKTsKICAgIC8vIFRoZSBleHBvbmVudCBpcyBpbiBiaXRzIDUzLi42My4KICAgIHZhciBiaWFzZWRFeHBvbmVudCA9IChiaXRzWzddIDw8IDQpICsgKGJpdHNbNl0gPj4gNCk7CiAgICB2YXIgZXhwb25lbnQgPSBiaWFzZWRFeHBvbmVudCAtIGV4cG9uZW50QmlhczsKCiAgICBhc3NlcnQoX2RpZ2l0Qml0cyA9PSAzMik7CiAgICAvLyBUaGUgc2lnbmlmaWNhbnQgYml0cyBhcmUgaW4gMCAuLiA1Mi4KICAgIHZhciB1bnNoaWZ0ZWREaWdpdHMgPSBfbmV3RGlnaXRzKDIpOwogICAgdW5zaGlmdGVkRGlnaXRzWzBdID0KICAgICAgICAoYml0c1szXSA8PCAyNCkgKyAoYml0c1syXSA8PCAxNikgKyAoYml0c1sxXSA8PCA4KSArIGJpdHNbMF07CiAgICAvLyBEb24ndCBmb3JnZXQgdG8gYWRkIHRoZSBoaWRkZW4gYml0LgogICAgdW5zaGlmdGVkRGlnaXRzWzFdID0KICAgICAgICAoKDB4MTAgfCAoYml0c1s2XSAmIDB4RikpIDw8IDE2KSArIChiaXRzWzVdIDw8IDgpICsgYml0c1s0XTsKCiAgICB2YXIgdW5zaGlmdGVkQmlnID0gbmV3IF9CaWdJbnRJbXBsLl9ub3JtYWxpemVkKGZhbHNlLCAyLCB1bnNoaWZ0ZWREaWdpdHMpOwogICAgX0JpZ0ludEltcGwgYWJzUmVzdWx0ID0gdW5zaGlmdGVkQmlnOwogICAgaWYgKGV4cG9uZW50IDwgMCkgewogICAgICBhYnNSZXN1bHQgPSB1bnNoaWZ0ZWRCaWcgPj4gLWV4cG9uZW50OwogICAgfSBlbHNlIGlmIChleHBvbmVudCA+IDApIHsKICAgICAgYWJzUmVzdWx0ID0gdW5zaGlmdGVkQmlnIDw8IGV4cG9uZW50OwogICAgfQogICAgaWYgKGlzTmVnYXRpdmUpIHJldHVybiAtYWJzUmVzdWx0OwogICAgcmV0dXJuIGFic1Jlc3VsdDsKICB9CgogIC8qKgogICAqIFJldHVybiB0aGUgbmVnYXRpdmUgdmFsdWUgb2YgdGhpcyBpbnRlZ2VyLgogICAqCiAgICogVGhlIHJlc3VsdCBvZiBuZWdhdGluZyBhbiBpbnRlZ2VyIGFsd2F5cyBoYXMgdGhlIG9wcG9zaXRlIHNpZ24sIGV4Y2VwdAogICAqIGZvciB6ZXJvLCB3aGljaCBpcyBpdHMgb3duIG5lZ2F0aW9uLgogICAqLwogIF9CaWdJbnRJbXBsIG9wZXJhdG9yIC0oKSB7CiAgICBpZiAoX3VzZWQgPT0gMCkgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gbmV3IF9CaWdJbnRJbXBsLl8oIV9pc05lZ2F0aXZlLCBfdXNlZCwgX2RpZ2l0cyk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGlzIGludGVnZXIuCiAgICoKICAgKiBGb3IgYW55IGludGVnZXIgYHhgLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIGB4IDwgMCA/IC14IDogeGAuCiAgICovCiAgX0JpZ0ludEltcGwgYWJzKCkgPT4gX2lzTmVnYXRpdmUgPyAtdGhpcyA6IHRoaXM7CgogIC8vLyBSZXR1cm5zIHRoaXMgPDwgbipfZGlnaXRCaXRzLgogIF9CaWdJbnRJbXBsIF9kbFNoaWZ0KGludCBuKSB7CiAgICBmaW5hbCB1c2VkID0gX3VzZWQ7CiAgICBpZiAodXNlZCA9PSAwKSB7CiAgICAgIHJldHVybiB6ZXJvOwogICAgfQogICAgZmluYWwgcmVzdWx0VXNlZCA9IHVzZWQgKyBuOwogICAgZmluYWwgZGlnaXRzID0gX2RpZ2l0czsKICAgIGZpbmFsIHJlc3VsdERpZ2l0cyA9IF9uZXdEaWdpdHMocmVzdWx0VXNlZCk7CiAgICBmb3IgKGludCBpID0gdXNlZCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tpICsgbl0gPSBkaWdpdHNbaV07CiAgICB9CiAgICByZXR1cm4gbmV3IF9CaWdJbnRJbXBsLl8oX2lzTmVnYXRpdmUsIHJlc3VsdFVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgfQoKICAvLy8gU2FtZSBhcyBbX2RsU2hpZnRdIGJ1dCB3b3JrcyBvbiB0aGUgZGVjb21wb3NlZCBiaWcgaW50ZWdlcnMuCiAgLy8vCiAgLy8vIFJldHVybnMgYHJlc3VsdFVzZWRgLgogIC8vLwogIC8vLyBgcmVzdWx0RGlnaXRzWzAuLnJlc3VsdFVzZWQtMV0gPSB4RGlnaXRzWzAuLnhVc2VkLTFdIDw8IG4qX2RpZ2l0Qml0c2AuCiAgc3RhdGljIGludCBfZGxTaGlmdERpZ2l0cygKICAgICAgVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQsIGludCBuLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgaWYgKHhVc2VkID09IDApIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAobiA9PSAwICYmIGlkZW50aWNhbChyZXN1bHREaWdpdHMsIHhEaWdpdHMpKSB7CiAgICAgIHJldHVybiB4VXNlZDsKICAgIH0KICAgIGZpbmFsIHJlc3VsdFVzZWQgPSB4VXNlZCArIG47CiAgICBhc3NlcnQocmVzdWx0RGlnaXRzLmxlbmd0aCA+PSByZXN1bHRVc2VkICsgKHJlc3VsdFVzZWQgJiAxKSk7CiAgICBmb3IgKGludCBpID0geFVzZWQgLSAxOyBpID49IDA7IGktLSkgewogICAgICByZXN1bHREaWdpdHNbaSArIG5dID0geERpZ2l0c1tpXTsKICAgIH0KICAgIGZvciAoaW50IGkgPSBuIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0gMDsKICAgIH0KICAgIGlmIChyZXN1bHRVc2VkLmlzT2RkKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tyZXN1bHRVc2VkXSA9IDA7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0VXNlZDsKICB9CgogIC8vLyBSZXR1cm5zIGB0aGlzID4+IG4qX2RpZ2l0Qml0c2AuCiAgX0JpZ0ludEltcGwgX2RyU2hpZnQoaW50IG4pIHsKICAgIGZpbmFsIHVzZWQgPSBfdXNlZDsKICAgIGlmICh1c2VkID09IDApIHsKICAgICAgcmV0dXJuIHplcm87CiAgICB9CiAgICBmaW5hbCByZXN1bHRVc2VkID0gdXNlZCAtIG47CiAgICBpZiAocmVzdWx0VXNlZCA8PSAwKSB7CiAgICAgIHJldHVybiBfaXNOZWdhdGl2ZSA/IF9taW51c09uZSA6IHplcm87CiAgICB9CiAgICBmaW5hbCBkaWdpdHMgPSBfZGlnaXRzOwogICAgZmluYWwgcmVzdWx0RGlnaXRzID0gX25ld0RpZ2l0cyhyZXN1bHRVc2VkKTsKICAgIGZvciAodmFyIGkgPSBuOyBpIDwgdXNlZDsgaSsrKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tpIC0gbl0gPSBkaWdpdHNbaV07CiAgICB9CiAgICBmaW5hbCByZXN1bHQgPSBuZXcgX0JpZ0ludEltcGwuXyhfaXNOZWdhdGl2ZSwgcmVzdWx0VXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgIGlmIChfaXNOZWdhdGl2ZSkgewogICAgICAvLyBSb3VuZCBkb3duIGlmIGFueSBiaXQgd2FzIHNoaWZ0ZWQgb3V0LgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIGlmIChkaWdpdHNbaV0gIT0gMCkgewogICAgICAgICAgcmV0dXJuIHJlc3VsdCAtIG9uZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gU2FtZSBhcyBbX2RyU2hpZnRdIGJ1dCB3b3JrcyBvbiB0aGUgZGVjb21wb3NlZCBiaWcgaW50ZWdlcnMuCiAgLy8vCiAgLy8vIFJldHVybnMgYHJlc3VsdFVzZWRgLgogIC8vLwogIC8vLyBgcmVzdWx0RGlnaXRzWzAuLnJlc3VsdFVzZWQtMV0gPSB4RGlnaXRzWzAuLnhVc2VkLTFdID4+IG4qX2RpZ2l0Qml0c2AuCiAgc3RhdGljIGludCBfZHJTaGlmdERpZ2l0cygKICAgICAgVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQsIGludCBuLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgZmluYWwgcmVzdWx0VXNlZCA9IHhVc2VkIC0gbjsKICAgIGlmIChyZXN1bHRVc2VkIDw9IDApIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBhc3NlcnQocmVzdWx0RGlnaXRzLmxlbmd0aCA+PSByZXN1bHRVc2VkICsgKHJlc3VsdFVzZWQgJiAxKSk7CiAgICBmb3IgKHZhciBpID0gbjsgaSA8IHhVc2VkOyBpKyspIHsKICAgICAgcmVzdWx0RGlnaXRzW2kgLSBuXSA9IHhEaWdpdHNbaV07CiAgICB9CiAgICBpZiAocmVzdWx0VXNlZC5pc09kZCkgewogICAgICByZXN1bHREaWdpdHNbcmVzdWx0VXNlZF0gPSAwOwogICAgfQogICAgcmV0dXJuIHJlc3VsdFVzZWQ7CiAgfQoKICAvLy8gU2hpZnRzIHRoZSBkaWdpdHMgb2YgW3hEaWdpdHNdIGludG8gdGhlIHJpZ2h0IHBsYWNlIGluIFtyZXN1bHREaWdpdHNdLgogIC8vLwogIC8vLyBgcmVzdWx0RGlnaXRzW2RzLi54VXNlZCtkc10gPSB4RGlnaXRzWzAuLnhVc2VkLTFdIDw8IChuICUgX2RpZ2l0Qml0cylgCiAgLy8vICAgd2hlcmUgYGRzID0gbiB+LyBfZGlnaXRCaXRzYAogIC8vLwogIC8vLyBEb2VzICpub3QqIGNsZWFyIGRpZ2l0cyBiZWxvdyBkcy4KICAvLy8KICAvLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50cmluc2lmaWVkLgogIEBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCiAgc3RhdGljIHZvaWQgX2xzaCgKICAgICAgVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQsIGludCBuLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgYXNzZXJ0KHhVc2VkID4gMCk7CiAgICBmaW5hbCBkaWdpdFNoaWZ0ID0gbiB+LyBfZGlnaXRCaXRzOwogICAgZmluYWwgYml0U2hpZnQgPSBuICUgX2RpZ2l0Qml0czsKICAgIGZpbmFsIGNhcnJ5Qml0U2hpZnQgPSBfZGlnaXRCaXRzIC0gYml0U2hpZnQ7CiAgICBmaW5hbCBiaXRNYXNrID0gKDEgPDwgY2FycnlCaXRTaGlmdCkgLSAxOwogICAgdmFyIGNhcnJ5ID0gMDsKICAgIGZvciAoaW50IGkgPSB4VXNlZCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGZpbmFsIGRpZ2l0ID0geERpZ2l0c1tpXTsKICAgICAgcmVzdWx0RGlnaXRzW2kgKyBkaWdpdFNoaWZ0ICsgMV0gPSAoZGlnaXQgPj4gY2FycnlCaXRTaGlmdCkgfCBjYXJyeTsKICAgICAgY2FycnkgPSAoZGlnaXQgJiBiaXRNYXNrKSA8PCBiaXRTaGlmdDsKICAgIH0KICAgIHJlc3VsdERpZ2l0c1tkaWdpdFNoaWZ0XSA9IGNhcnJ5OwogIH0KCiAgLyoqCiAgICogU2hpZnQgdGhlIGJpdHMgb2YgdGhpcyBpbnRlZ2VyIHRvIHRoZSBsZWZ0IGJ5IFtzaGlmdEFtb3VudF0uCiAgICoKICAgKiBTaGlmdGluZyB0byB0aGUgbGVmdCBtYWtlcyB0aGUgbnVtYmVyIGxhcmdlciwgZWZmZWN0aXZlbHkgbXVsdGlwbHlpbmcKICAgKiB0aGUgbnVtYmVyIGJ5IGBwb3coMiwgc2hpZnRJbmRleClgLgogICAqCiAgICogVGhlcmUgaXMgbm8gbGltaXQgb24gdGhlIHNpemUgb2YgdGhlIHJlc3VsdC4gSXQgbWF5IGJlIHJlbGV2YW50IHRvCiAgICogbGltaXQgaW50ZXJtZWRpYXRlIHZhbHVlcyBieSB1c2luZyB0aGUgImFuZCIgb3BlcmF0b3Igd2l0aCBhIHN1aXRhYmxlCiAgICogbWFzay4KICAgKgogICAqIEl0IGlzIGFuIGVycm9yIGlmIFtzaGlmdEFtb3VudF0gaXMgbmVnYXRpdmUuCiAgICovCiAgX0JpZ0ludEltcGwgb3BlcmF0b3IgPDwoaW50IHNoaWZ0QW1vdW50KSB7CiAgICBpZiAoc2hpZnRBbW91bnQgPCAwKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJzaGlmdC1hbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSAkc2hpZnRBbW91bnQiKTsKICAgIH0KICAgIGlmIChfaXNaZXJvKSByZXR1cm4gdGhpczsKICAgIGZpbmFsIGRpZ2l0U2hpZnQgPSBzaGlmdEFtb3VudCB+LyBfZGlnaXRCaXRzOwogICAgZmluYWwgYml0U2hpZnQgPSBzaGlmdEFtb3VudCAlIF9kaWdpdEJpdHM7CiAgICBpZiAoYml0U2hpZnQgPT0gMCkgewogICAgICByZXR1cm4gX2RsU2hpZnQoZGlnaXRTaGlmdCk7CiAgICB9CiAgICAvLyBOZWVkIG9uZSBleHRyYSBkaWdpdCB0byBob2xkIGJpdHMgc2hpZnRlZCBieSBiaXRTaGlmdC4KICAgIHZhciByZXN1bHRVc2VkID0gX3VzZWQgKyBkaWdpdFNoaWZ0ICsgMTsKICAgIC8vIFRoZSA2NC1iaXQgaW50cmluc2ljIHJlcXVpcmVzIG9uZSBleHRyYSBwYWlyIHRvIHdvcmsgd2l0aC4KICAgIHZhciByZXN1bHREaWdpdHMgPSBfbmV3RGlnaXRzKHJlc3VsdFVzZWQgKyAxKTsKICAgIF9sc2goX2RpZ2l0cywgX3VzZWQsIHNoaWZ0QW1vdW50LCByZXN1bHREaWdpdHMpOwogICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKF9pc05lZ2F0aXZlLCByZXN1bHRVc2VkLCByZXN1bHREaWdpdHMpOwogIH0KCiAgLy8vIHJlc3VsdERpZ2l0c1swLi5yZXN1bHRVc2VkLTFdID0geERpZ2l0c1swLi54VXNlZC0xXSA8PCBuLgogIC8vLyBSZXR1cm5zIHJlc3VsdFVzZWQuCiAgc3RhdGljIGludCBfbFNoaWZ0RGlnaXRzKAogICAgICBVaW50MzJMaXN0IHhEaWdpdHMsIGludCB4VXNlZCwgaW50IG4sIFVpbnQzMkxpc3QgcmVzdWx0RGlnaXRzKSB7CiAgICBmaW5hbCBkaWdpdHNTaGlmdCA9IG4gfi8gX2RpZ2l0Qml0czsKICAgIGZpbmFsIGJpdFNoaWZ0ID0gbiAlIF9kaWdpdEJpdHM7CiAgICBpZiAoYml0U2hpZnQgPT0gMCkgewogICAgICByZXR1cm4gX2RsU2hpZnREaWdpdHMoeERpZ2l0cywgeFVzZWQsIGRpZ2l0c1NoaWZ0LCByZXN1bHREaWdpdHMpOwogICAgfQogICAgLy8gTmVlZCBvbmUgZXh0cmEgZGlnaXQgdG8gaG9sZCBiaXRzIHNoaWZ0ZWQgYnkgYml0U2hpZnQuCiAgICB2YXIgcmVzdWx0VXNlZCA9IHhVc2VkICsgZGlnaXRzU2hpZnQgKyAxOwogICAgLy8gVGhlIDY0LWJpdCBpbnRyaW5zaWMgcmVxdWlyZXMgb25lIGV4dHJhIHBhaXIgdG8gd29yayB3aXRoLgogICAgYXNzZXJ0KHJlc3VsdERpZ2l0cy5sZW5ndGggPj0gcmVzdWx0VXNlZCArIDIgLSAocmVzdWx0VXNlZCAmIDEpKTsKICAgIF9sc2goeERpZ2l0cywgeFVzZWQsIG4sIHJlc3VsdERpZ2l0cyk7CiAgICB2YXIgaSA9IGRpZ2l0c1NoaWZ0OwogICAgd2hpbGUgKC0taSA+PSAwKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tpXSA9IDA7CiAgICB9CiAgICBpZiAocmVzdWx0RGlnaXRzW3Jlc3VsdFVzZWQgLSAxXSA9PSAwKSB7CiAgICAgIHJlc3VsdFVzZWQtLTsgLy8gQ2xhbXAgcmVzdWx0LgogICAgfSBlbHNlIGlmIChyZXN1bHRVc2VkLmlzT2RkKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tyZXN1bHRVc2VkXSA9IDA7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0VXNlZDsKICB9CgogIC8vLyByZXN1bHREaWdpdHNbMC4ucmVzdWx0VXNlZC0xXSA9IHhEaWdpdHNbMC4ueFVzZWQtMV0gPj4gbi4KICAvLy8KICAvLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50cmluc2lmaWVkLgogIEBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCiAgc3RhdGljIHZvaWQgX3JzaCgKICAgICAgVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQsIGludCBuLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgYXNzZXJ0KHhVc2VkID4gMCk7CiAgICBmaW5hbCBkaWdpdHNTaGlmdCA9IG4gfi8gX2RpZ2l0Qml0czsKICAgIGZpbmFsIGJpdFNoaWZ0ID0gbiAlIF9kaWdpdEJpdHM7CiAgICBmaW5hbCBjYXJyeUJpdFNoaWZ0ID0gX2RpZ2l0Qml0cyAtIGJpdFNoaWZ0OwogICAgZmluYWwgYml0TWFzayA9ICgxIDw8IGJpdFNoaWZ0KSAtIDE7CiAgICB2YXIgY2FycnkgPSB4RGlnaXRzW2RpZ2l0c1NoaWZ0XSA+PiBiaXRTaGlmdDsKICAgIGZpbmFsIGxhc3QgPSB4VXNlZCAtIGRpZ2l0c1NoaWZ0IC0gMTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdDsgaSsrKSB7CiAgICAgIGZpbmFsIGRpZ2l0ID0geERpZ2l0c1tpICsgZGlnaXRzU2hpZnQgKyAxXTsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0gKChkaWdpdCAmIGJpdE1hc2spIDw8IGNhcnJ5Qml0U2hpZnQpIHwgY2Fycnk7CiAgICAgIGNhcnJ5ID0gZGlnaXQgPj4gYml0U2hpZnQ7CiAgICB9CiAgICByZXN1bHREaWdpdHNbbGFzdF0gPSBjYXJyeTsKICB9CgogIC8qKgogICAqIFNoaWZ0IHRoZSBiaXRzIG9mIHRoaXMgaW50ZWdlciB0byB0aGUgcmlnaHQgYnkgW3NoaWZ0QW1vdW50XS4KICAgKgogICAqIFNoaWZ0aW5nIHRvIHRoZSByaWdodCBtYWtlcyB0aGUgbnVtYmVyIHNtYWxsZXIgYW5kIGRyb3BzIHRoZSBsZWFzdAogICAqIHNpZ25pZmljYW50IGJpdHMsIGVmZmVjdGl2ZWx5IGRvaW5nIGFuIGludGVnZXIgZGl2aXNpb24gYnkKICAgKmBwb3coMiwgc2hpZnRJbmRleClgLgogICAqCiAgICogSXQgaXMgYW4gZXJyb3IgaWYgW3NoaWZ0QW1vdW50XSBpcyBuZWdhdGl2ZS4KICAgKi8KICBfQmlnSW50SW1wbCBvcGVyYXRvciA+PihpbnQgc2hpZnRBbW91bnQpIHsKICAgIGlmIChzaGlmdEFtb3VudCA8IDApIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoInNoaWZ0LWFtb3VudCBtdXN0IGJlIHBvc2l0aXZlICRzaGlmdEFtb3VudCIpOwogICAgfQogICAgaWYgKF9pc1plcm8pIHJldHVybiB0aGlzOwogICAgZmluYWwgZGlnaXRTaGlmdCA9IHNoaWZ0QW1vdW50IH4vIF9kaWdpdEJpdHM7CiAgICBmaW5hbCBiaXRTaGlmdCA9IHNoaWZ0QW1vdW50ICUgX2RpZ2l0Qml0czsKICAgIGlmIChiaXRTaGlmdCA9PSAwKSB7CiAgICAgIHJldHVybiBfZHJTaGlmdChkaWdpdFNoaWZ0KTsKICAgIH0KICAgIGZpbmFsIHVzZWQgPSBfdXNlZDsKICAgIGZpbmFsIHJlc3VsdFVzZWQgPSB1c2VkIC0gZGlnaXRTaGlmdDsKICAgIGlmIChyZXN1bHRVc2VkIDw9IDApIHsKICAgICAgcmV0dXJuIF9pc05lZ2F0aXZlID8gX21pbnVzT25lIDogemVybzsKICAgIH0KICAgIGZpbmFsIGRpZ2l0cyA9IF9kaWdpdHM7CiAgICBmaW5hbCByZXN1bHREaWdpdHMgPSBfbmV3RGlnaXRzKHJlc3VsdFVzZWQpOwogICAgX3JzaChkaWdpdHMsIHVzZWQsIHNoaWZ0QW1vdW50LCByZXN1bHREaWdpdHMpOwogICAgZmluYWwgcmVzdWx0ID0gbmV3IF9CaWdJbnRJbXBsLl8oX2lzTmVnYXRpdmUsIHJlc3VsdFVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgICBpZiAoX2lzTmVnYXRpdmUpIHsKICAgICAgLy8gUm91bmQgZG93biBpZiBhbnkgYml0IHdhcyBzaGlmdGVkIG91dC4KICAgICAgaWYgKChkaWdpdHNbZGlnaXRTaGlmdF0gJiAoKDEgPDwgYml0U2hpZnQpIC0gMSkpICE9IDApIHsKICAgICAgICByZXR1cm4gcmVzdWx0IC0gb25lOwogICAgICB9CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlnaXRTaGlmdDsgaSsrKSB7CiAgICAgICAgaWYgKGRpZ2l0c1tpXSAhPSAwKSB7CiAgICAgICAgICByZXR1cm4gcmVzdWx0IC0gb25lOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyByZXN1bHREaWdpdHNbMC4ucmVzdWx0VXNlZC0xXSA9IHhEaWdpdHNbMC4ueFVzZWQtMV0gPj4gbi4KICAvLy8gUmV0dXJucyByZXN1bHRVc2VkLgogIHN0YXRpYyBpbnQgX3JTaGlmdERpZ2l0cygKICAgICAgVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQsIGludCBuLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgZmluYWwgZGlnaXRTaGlmdCA9IG4gfi8gX2RpZ2l0Qml0czsKICAgIGZpbmFsIGJpdFNoaWZ0ID0gbiAlIF9kaWdpdEJpdHM7CiAgICBpZiAoYml0U2hpZnQgPT0gMCkgewogICAgICByZXR1cm4gX2RyU2hpZnREaWdpdHMoeERpZ2l0cywgeFVzZWQsIGRpZ2l0U2hpZnQsIHJlc3VsdERpZ2l0cyk7CiAgICB9CiAgICB2YXIgcmVzdWx0VXNlZCA9IHhVc2VkIC0gZGlnaXRTaGlmdDsKICAgIGlmIChyZXN1bHRVc2VkIDw9IDApIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBhc3NlcnQocmVzdWx0RGlnaXRzLmxlbmd0aCA+PSByZXN1bHRVc2VkICsgKHJlc3VsdFVzZWQgJiAxKSk7CiAgICBfcnNoKHhEaWdpdHMsIHhVc2VkLCBuLCByZXN1bHREaWdpdHMpOwogICAgaWYgKHJlc3VsdERpZ2l0c1tyZXN1bHRVc2VkIC0gMV0gPT0gMCkgewogICAgICByZXN1bHRVc2VkLS07IC8vIENsYW1wIHJlc3VsdC4KICAgIH0gZWxzZSBpZiAocmVzdWx0VXNlZC5pc09kZCkgewogICAgICByZXN1bHREaWdpdHNbcmVzdWx0VXNlZF0gPSAwOwogICAgfQogICAgcmV0dXJuIHJlc3VsdFVzZWQ7CiAgfQoKICAvLy8gQ29tcGFyZXMgdGhpcyB0byBbb3RoZXJdIHRha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYm90aCBvcGVyYW5kcy4KICAvLy8KICAvLy8gUmV0dXJucyAwIGlmIGFicyh0aGlzKSA9PSBhYnMob3RoZXIpOyBhIHBvc2l0aXZlIG51bWJlciBpZgogIC8vLyBhYnModGhpcykgPiBhYnMob3RoZXIpOyBhbmQgYSBuZWdhdGl2ZSBudW1iZXIgaWYgYWJzKHRoaXMpIDwgYWJzKG90aGVyKS4KICBpbnQgX2Fic0NvbXBhcmUoQmlnSW50IGJpZ0ludCkgewogICAgX0JpZ0ludEltcGwgb3RoZXIgPSBiaWdJbnQ7CiAgICByZXR1cm4gX2NvbXBhcmVEaWdpdHMoX2RpZ2l0cywgX3VzZWQsIG90aGVyLl9kaWdpdHMsIG90aGVyLl91c2VkKTsKICB9CgogIC8qKgogICAqIENvbXBhcmVzIHRoaXMgdG8gYG90aGVyYC4KICAgKgogICAqIFJldHVybnMgYSBuZWdhdGl2ZSBudW1iZXIgaWYgYHRoaXNgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLCB6ZXJvIGlmIHRoZXkgYXJlCiAgICogZXF1YWwsIGFuZCBhIHBvc2l0aXZlIG51bWJlciBpZiBgdGhpc2AgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAuCiAgICovCiAgaW50IGNvbXBhcmVUbyhCaWdJbnQgYmlnSW50KSB7CiAgICBfQmlnSW50SW1wbCBvdGhlciA9IGJpZ0ludDsKICAgIGlmIChfaXNOZWdhdGl2ZSA9PSBvdGhlci5faXNOZWdhdGl2ZSkgewogICAgICB2YXIgcmVzdWx0ID0gX2Fic0NvbXBhcmUob3RoZXIpOwogICAgICAvLyBVc2UgMCAtIHJlc3VsdCB0byBhdm9pZCBuZWdhdGl2ZSB6ZXJvIGluIEphdmFTY3JpcHQuCiAgICAgIHJldHVybiBfaXNOZWdhdGl2ZSA/IDAgLSByZXN1bHQgOiByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gX2lzTmVnYXRpdmUgPyAtMSA6IDE7CiAgfQoKICAvLy8gQ29tcGFyZXMgYGRpZ2l0c1swLi51c2VkLTFdYCB3aXRoIGBvdGhlckRpZ2l0c1swLi5vdGhlclVzZWQtMV1gLgogIC8vLwogIC8vLyBSZXR1cm5zIDAgaWYgZXF1YWw7IGEgcG9zaXRpdmUgbnVtYmVyIGlmIGxhcmdlcjsKICAvLy8gYW5kIGEgbmVnYXRpdmUgbnVtYmVyIGlmIHNtYWxsZXIuCiAgc3RhdGljIGludCBfY29tcGFyZURpZ2l0cygKICAgICAgVWludDMyTGlzdCBkaWdpdHMsIGludCB1c2VkLCBVaW50MzJMaXN0IG90aGVyRGlnaXRzLCBpbnQgb3RoZXJVc2VkKSB7CiAgICB2YXIgcmVzdWx0ID0gdXNlZCAtIG90aGVyVXNlZDsKICAgIGlmIChyZXN1bHQgPT0gMCkgewogICAgICBmb3IgKGludCBpID0gdXNlZCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgcmVzdWx0ID0gZGlnaXRzW2ldIC0gb3RoZXJEaWdpdHNbaV07CiAgICAgICAgaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIHJlc3VsdERpZ2l0c1swLi51c2VkXSA9IGRpZ2l0c1swLi51c2VkLTFdICsgb3RoZXJEaWdpdHNbMC4ub3RoZXJVc2VkLTFdLgogIC8vLyB1c2VkID49IG90aGVyVXNlZCA+IDAuCiAgLy8vCiAgLy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludHJpbnNpZmllZC4KICBAcHJhZ21hKCJ2bTpuZXZlci1pbmxpbmUiKQogIHN0YXRpYyB2b2lkIF9hYnNBZGQoVWludDMyTGlzdCBkaWdpdHMsIGludCB1c2VkLCBVaW50MzJMaXN0IG90aGVyRGlnaXRzLAogICAgICBpbnQgb3RoZXJVc2VkLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgYXNzZXJ0KHVzZWQgPj0gb3RoZXJVc2VkICYmIG90aGVyVXNlZCA+IDApOwogICAgdmFyIGNhcnJ5ID0gMDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3RoZXJVc2VkOyBpKyspIHsKICAgICAgY2FycnkgKz0gZGlnaXRzW2ldICsgb3RoZXJEaWdpdHNbaV07CiAgICAgIHJlc3VsdERpZ2l0c1tpXSA9IGNhcnJ5ICYgX2RpZ2l0TWFzazsKICAgICAgY2FycnkgPj49IF9kaWdpdEJpdHM7CiAgICB9CiAgICBmb3IgKHZhciBpID0gb3RoZXJVc2VkOyBpIDwgdXNlZDsgaSsrKSB7CiAgICAgIGNhcnJ5ICs9IGRpZ2l0c1tpXTsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0gY2FycnkgJiBfZGlnaXRNYXNrOwogICAgICBjYXJyeSA+Pj0gX2RpZ2l0Qml0czsKICAgIH0KICAgIHJlc3VsdERpZ2l0c1t1c2VkXSA9IGNhcnJ5OwogIH0KCiAgLy8vIHJlc3VsdERpZ2l0c1swLi51c2VkLTFdID0gZGlnaXRzWzAuLnVzZWQtMV0gLSBvdGhlckRpZ2l0c1swLi5vdGhlclVzZWQtMV0uCiAgLy8vIHVzZWQgPj0gb3RoZXJVc2VkID4gMC4KICAvLy8KICAvLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50cmluc2lmaWVkLgogIEBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCiAgc3RhdGljIHZvaWQgX2Fic1N1YihVaW50MzJMaXN0IGRpZ2l0cywgaW50IHVzZWQsIFVpbnQzMkxpc3Qgb3RoZXJEaWdpdHMsCiAgICAgIGludCBvdGhlclVzZWQsIFVpbnQzMkxpc3QgcmVzdWx0RGlnaXRzKSB7CiAgICBhc3NlcnQodXNlZCA+PSBvdGhlclVzZWQgJiYgb3RoZXJVc2VkID4gMCk7CiAgICB2YXIgY2FycnkgPSAwOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdGhlclVzZWQ7IGkrKykgewogICAgICBjYXJyeSArPSBkaWdpdHNbaV0gLSBvdGhlckRpZ2l0c1tpXTsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0gY2FycnkgJiBfZGlnaXRNYXNrOwogICAgICBjYXJyeSA+Pj0gX2RpZ2l0Qml0czsKICAgIH0KICAgIGZvciAodmFyIGkgPSBvdGhlclVzZWQ7IGkgPCB1c2VkOyBpKyspIHsKICAgICAgY2FycnkgKz0gZGlnaXRzW2ldOwogICAgICByZXN1bHREaWdpdHNbaV0gPSBjYXJyeSAmIF9kaWdpdE1hc2s7CiAgICAgIGNhcnJ5ID4+PSBfZGlnaXRCaXRzOwogICAgfQogIH0KCiAgLy8vIFJldHVybnMgYGFicyh0aGlzKSArIGFicyhvdGhlcilgIHdpdGggc2lnbiBzZXQgYWNjb3JkaW5nIHRvIFtpc05lZ2F0aXZlXS4KICBfQmlnSW50SW1wbCBfYWJzQWRkU2V0U2lnbihfQmlnSW50SW1wbCBvdGhlciwgYm9vbCBpc05lZ2F0aXZlKSB7CiAgICB2YXIgdXNlZCA9IF91c2VkOwogICAgdmFyIG90aGVyVXNlZCA9IG90aGVyLl91c2VkOwogICAgaWYgKHVzZWQgPCBvdGhlclVzZWQpIHsKICAgICAgcmV0dXJuIG90aGVyLl9hYnNBZGRTZXRTaWduKHRoaXMsIGlzTmVnYXRpdmUpOwogICAgfQogICAgaWYgKHVzZWQgPT0gMCkgewogICAgICBhc3NlcnQoIWlzTmVnYXRpdmUpOwogICAgICByZXR1cm4gemVybzsKICAgIH0KICAgIGlmIChvdGhlclVzZWQgPT0gMCkgewogICAgICByZXR1cm4gX2lzTmVnYXRpdmUgPT0gaXNOZWdhdGl2ZSA/IHRoaXMgOiAtdGhpczsKICAgIH0KICAgIHZhciByZXN1bHRVc2VkID0gdXNlZCArIDE7CiAgICB2YXIgcmVzdWx0RGlnaXRzID0gX25ld0RpZ2l0cyhyZXN1bHRVc2VkKTsKICAgIF9hYnNBZGQoX2RpZ2l0cywgdXNlZCwgb3RoZXIuX2RpZ2l0cywgb3RoZXJVc2VkLCByZXN1bHREaWdpdHMpOwogICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKGlzTmVnYXRpdmUsIHJlc3VsdFVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgfQoKICAvLy8gUmV0dXJucyBgYWJzKHRoaXMpIC0gYWJzKG90aGVyKWAgd2l0aCBzaWduIHNldCBhY2NvcmRpbmcgdG8gW2lzTmVnYXRpdmVdLgogIC8vLwogIC8vLyBSZXF1aXJlbWVudDogYGFicyh0aGlzKSA+PSBhYnMob3RoZXIpYC4KICBfQmlnSW50SW1wbCBfYWJzU3ViU2V0U2lnbihfQmlnSW50SW1wbCBvdGhlciwgYm9vbCBpc05lZ2F0aXZlKSB7CiAgICBhc3NlcnQoX2Fic0NvbXBhcmUob3RoZXIpID49IDApOwogICAgdmFyIHVzZWQgPSBfdXNlZDsKICAgIGlmICh1c2VkID09IDApIHsKICAgICAgYXNzZXJ0KCFpc05lZ2F0aXZlKTsKICAgICAgcmV0dXJuIHplcm87CiAgICB9CiAgICB2YXIgb3RoZXJVc2VkID0gb3RoZXIuX3VzZWQ7CiAgICBpZiAob3RoZXJVc2VkID09IDApIHsKICAgICAgcmV0dXJuIF9pc05lZ2F0aXZlID09IGlzTmVnYXRpdmUgPyB0aGlzIDogLXRoaXM7CiAgICB9CiAgICB2YXIgcmVzdWx0RGlnaXRzID0gX25ld0RpZ2l0cyh1c2VkKTsKICAgIF9hYnNTdWIoX2RpZ2l0cywgdXNlZCwgb3RoZXIuX2RpZ2l0cywgb3RoZXJVc2VkLCByZXN1bHREaWdpdHMpOwogICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKGlzTmVnYXRpdmUsIHVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgfQoKICAvLy8gUmV0dXJucyBgYWJzKHRoaXMpICYgYWJzKG90aGVyKWAgd2l0aCBzaWduIHNldCBhY2NvcmRpbmcgdG8gW2lzTmVnYXRpdmVdLgogIF9CaWdJbnRJbXBsIF9hYnNBbmRTZXRTaWduKF9CaWdJbnRJbXBsIG90aGVyLCBib29sIGlzTmVnYXRpdmUpIHsKICAgIHZhciByZXN1bHRVc2VkID0gX21pbihfdXNlZCwgb3RoZXIuX3VzZWQpOwogICAgdmFyIGRpZ2l0cyA9IF9kaWdpdHM7CiAgICB2YXIgb3RoZXJEaWdpdHMgPSBvdGhlci5fZGlnaXRzOwogICAgdmFyIHJlc3VsdERpZ2l0cyA9IF9uZXdEaWdpdHMocmVzdWx0VXNlZCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdFVzZWQ7IGkrKykgewogICAgICByZXN1bHREaWdpdHNbaV0gPSBkaWdpdHNbaV0gJiBvdGhlckRpZ2l0c1tpXTsKICAgIH0KICAgIHJldHVybiBuZXcgX0JpZ0ludEltcGwuXyhpc05lZ2F0aXZlLCByZXN1bHRVc2VkLCByZXN1bHREaWdpdHMpOwogIH0KCiAgLy8vIFJldHVybnMgYGFicyh0aGlzKSAmfiBhYnMob3RoZXIpYCB3aXRoIHNpZ24gc2V0IGFjY29yZGluZyB0byBbaXNOZWdhdGl2ZV0uCiAgX0JpZ0ludEltcGwgX2Fic0FuZE5vdFNldFNpZ24oX0JpZ0ludEltcGwgb3RoZXIsIGJvb2wgaXNOZWdhdGl2ZSkgewogICAgdmFyIHJlc3VsdFVzZWQgPSBfdXNlZDsKICAgIHZhciBkaWdpdHMgPSBfZGlnaXRzOwogICAgdmFyIG90aGVyRGlnaXRzID0gb3RoZXIuX2RpZ2l0czsKICAgIHZhciByZXN1bHREaWdpdHMgPSBfbmV3RGlnaXRzKHJlc3VsdFVzZWQpOwogICAgdmFyIG0gPSBfbWluKHJlc3VsdFVzZWQsIG90aGVyLl91c2VkKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tpXSA9IGRpZ2l0c1tpXSAmIH5vdGhlckRpZ2l0c1tpXTsKICAgIH0KICAgIGZvciAodmFyIGkgPSBtOyBpIDwgcmVzdWx0VXNlZDsgaSsrKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tpXSA9IGRpZ2l0c1tpXTsKICAgIH0KICAgIHJldHVybiBuZXcgX0JpZ0ludEltcGwuXyhpc05lZ2F0aXZlLCByZXN1bHRVc2VkLCByZXN1bHREaWdpdHMpOwogIH0KCiAgLy8vIFJldHVybnMgYGFicyh0aGlzKSB8IGFicyhvdGhlcilgIHdpdGggc2lnbiBzZXQgYWNjb3JkaW5nIHRvIFtpc05lZ2F0aXZlXS4KICBfQmlnSW50SW1wbCBfYWJzT3JTZXRTaWduKF9CaWdJbnRJbXBsIG90aGVyLCBib29sIGlzTmVnYXRpdmUpIHsKICAgIHZhciB1c2VkID0gX3VzZWQ7CiAgICB2YXIgb3RoZXJVc2VkID0gb3RoZXIuX3VzZWQ7CiAgICB2YXIgcmVzdWx0VXNlZCA9IF9tYXgodXNlZCwgb3RoZXJVc2VkKTsKICAgIHZhciBkaWdpdHMgPSBfZGlnaXRzOwogICAgdmFyIG90aGVyRGlnaXRzID0gb3RoZXIuX2RpZ2l0czsKICAgIHZhciByZXN1bHREaWdpdHMgPSBfbmV3RGlnaXRzKHJlc3VsdFVzZWQpOwogICAgdmFyIGwsIG07CiAgICBpZiAodXNlZCA8IG90aGVyVXNlZCkgewogICAgICBsID0gb3RoZXI7CiAgICAgIG0gPSB1c2VkOwogICAgfSBlbHNlIHsKICAgICAgbCA9IHRoaXM7CiAgICAgIG0gPSBvdGhlclVzZWQ7CiAgICB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG07IGkrKykgewogICAgICByZXN1bHREaWdpdHNbaV0gPSBkaWdpdHNbaV0gfCBvdGhlckRpZ2l0c1tpXTsKICAgIH0KICAgIHZhciBsRGlnaXRzID0gbC5fZGlnaXRzOwogICAgZm9yICh2YXIgaSA9IG07IGkgPCByZXN1bHRVc2VkOyBpKyspIHsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0gbERpZ2l0c1tpXTsKICAgIH0KICAgIHJldHVybiBuZXcgX0JpZ0ludEltcGwuXyhpc05lZ2F0aXZlLCByZXN1bHRVc2VkLCByZXN1bHREaWdpdHMpOwogIH0KCiAgLy8vIFJldHVybnMgYGFicyh0aGlzKSBeIGFicyhvdGhlcilgIHdpdGggc2lnbiBzZXQgYWNjb3JkaW5nIHRvIFtpc05lZ2F0aXZlXS4KICBfQmlnSW50SW1wbCBfYWJzWG9yU2V0U2lnbihfQmlnSW50SW1wbCBvdGhlciwgYm9vbCBpc05lZ2F0aXZlKSB7CiAgICB2YXIgdXNlZCA9IF91c2VkOwogICAgdmFyIG90aGVyVXNlZCA9IG90aGVyLl91c2VkOwogICAgdmFyIHJlc3VsdFVzZWQgPSBfbWF4KHVzZWQsIG90aGVyVXNlZCk7CiAgICB2YXIgZGlnaXRzID0gX2RpZ2l0czsKICAgIHZhciBvdGhlckRpZ2l0cyA9IG90aGVyLl9kaWdpdHM7CiAgICB2YXIgcmVzdWx0RGlnaXRzID0gX25ld0RpZ2l0cyhyZXN1bHRVc2VkKTsKICAgIHZhciBsLCBtOwogICAgaWYgKHVzZWQgPCBvdGhlclVzZWQpIHsKICAgICAgbCA9IG90aGVyOwogICAgICBtID0gdXNlZDsKICAgIH0gZWxzZSB7CiAgICAgIGwgPSB0aGlzOwogICAgICBtID0gb3RoZXJVc2VkOwogICAgfQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0gZGlnaXRzW2ldIF4gb3RoZXJEaWdpdHNbaV07CiAgICB9CiAgICB2YXIgbERpZ2l0cyA9IGwuX2RpZ2l0czsKICAgIGZvciAodmFyIGkgPSBtOyBpIDwgcmVzdWx0VXNlZDsgaSsrKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tpXSA9IGxEaWdpdHNbaV07CiAgICB9CiAgICByZXR1cm4gbmV3IF9CaWdJbnRJbXBsLl8oaXNOZWdhdGl2ZSwgcmVzdWx0VXNlZCwgcmVzdWx0RGlnaXRzKTsKICB9CgogIC8qKgogICAqIEJpdC13aXNlIGFuZCBvcGVyYXRvci4KICAgKgogICAqIFRyZWF0aW5nIGJvdGggYHRoaXNgIGFuZCBbb3RoZXJdIGFzIHN1ZmZpY2llbnRseSBsYXJnZSB0d28ncyBjb21wb25lbnQKICAgKiBpbnRlZ2VycywgdGhlIHJlc3VsdCBpcyBhIG51bWJlciB3aXRoIG9ubHkgdGhlIGJpdHMgc2V0IHRoYXQgYXJlIHNldCBpbgogICAqIGJvdGggYHRoaXNgIGFuZCBbb3RoZXJdCiAgICoKICAgKiBPZiBib3RoIG9wZXJhbmRzIGFyZSBuZWdhdGl2ZSwgdGhlIHJlc3VsdCBpcyBuZWdhdGl2ZSwgb3RoZXJ3aXNlCiAgICogdGhlIHJlc3VsdCBpcyBub24tbmVnYXRpdmUuCiAgICovCiAgX0JpZ0ludEltcGwgb3BlcmF0b3IgJihCaWdJbnQgYmlnSW50KSB7CiAgICBfQmlnSW50SW1wbCBvdGhlciA9IGJpZ0ludDsKICAgIGlmIChfaXNaZXJvIHx8IG90aGVyLl9pc1plcm8pIHJldHVybiB6ZXJvOwogICAgaWYgKF9pc05lZ2F0aXZlID09IG90aGVyLl9pc05lZ2F0aXZlKSB7CiAgICAgIGlmIChfaXNOZWdhdGl2ZSkgewogICAgICAgIC8vICgtdGhpcykgJiAoLW90aGVyKSA9PSB+KHRoaXMtMSkgJiB+KG90aGVyLTEpCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgID09IH4oKHRoaXMtMSkgfCAob3RoZXItMSkpCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgID09IC0oKCh0aGlzLTEpIHwgKG90aGVyLTEpKSArIDEpCiAgICAgICAgX0JpZ0ludEltcGwgdGhpczEgPSBfYWJzU3ViU2V0U2lnbihvbmUsIHRydWUpOwogICAgICAgIF9CaWdJbnRJbXBsIG90aGVyMSA9IG90aGVyLl9hYnNTdWJTZXRTaWduKG9uZSwgdHJ1ZSk7CiAgICAgICAgLy8gUmVzdWx0IGNhbm5vdCBiZSB6ZXJvIGlmIHRoaXMgYW5kIG90aGVyIGFyZSBuZWdhdGl2ZS4KICAgICAgICByZXR1cm4gdGhpczEuX2Fic09yU2V0U2lnbihvdGhlcjEsIHRydWUpLl9hYnNBZGRTZXRTaWduKG9uZSwgdHJ1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIF9hYnNBbmRTZXRTaWduKG90aGVyLCBmYWxzZSk7CiAgICB9CiAgICAvLyBfaXNOZWdhdGl2ZSAhPSBvdGhlci5faXNOZWdhdGl2ZQogICAgdmFyIHAsIG47CiAgICBpZiAoX2lzTmVnYXRpdmUpIHsKICAgICAgcCA9IG90aGVyOwogICAgICBuID0gdGhpczsKICAgIH0gZWxzZSB7CiAgICAgIC8vICYgaXMgc3ltbWV0cmljLgogICAgICBwID0gdGhpczsKICAgICAgbiA9IG90aGVyOwogICAgfQogICAgLy8gcCAmICgtbikgPT0gcCAmIH4obi0xKSA9PSBwICZ+IChuLTEpCiAgICB2YXIgbjEgPSBuLl9hYnNTdWJTZXRTaWduKG9uZSwgZmFsc2UpOwogICAgcmV0dXJuIHAuX2Fic0FuZE5vdFNldFNpZ24objEsIGZhbHNlKTsKICB9CgogIC8qKgogICAqIEJpdC13aXNlIG9yIG9wZXJhdG9yLgogICAqCiAgICogVHJlYXRpbmcgYm90aCBgdGhpc2AgYW5kIFtvdGhlcl0gYXMgc3VmZmljaWVudGx5IGxhcmdlIHR3bydzIGNvbXBvbmVudAogICAqIGludGVnZXJzLCB0aGUgcmVzdWx0IGlzIGEgbnVtYmVyIHdpdGggdGhlIGJpdHMgc2V0IHRoYXQgYXJlIHNldCBpbiBlaXRoZXIKICAgKiBvZiBgdGhpc2AgYW5kIFtvdGhlcl0KICAgKgogICAqIElmIGJvdGggb3BlcmFuZHMgYXJlIG5vbi1uZWdhdGl2ZSwgdGhlIHJlc3VsdCBpcyBub24tbmVnYXRpdmUsCiAgICogb3RoZXJ3aXNlIHRoZSByZXN1bHQgdXMgbmVnYXRpdmUuCiAgICovCiAgX0JpZ0ludEltcGwgb3BlcmF0b3IgfChCaWdJbnQgYmlnSW50KSB7CiAgICBfQmlnSW50SW1wbCBvdGhlciA9IGJpZ0ludDsKICAgIGlmIChfaXNaZXJvKSByZXR1cm4gb3RoZXI7CiAgICBpZiAob3RoZXIuX2lzWmVybykgcmV0dXJuIHRoaXM7CiAgICBpZiAoX2lzTmVnYXRpdmUgPT0gb3RoZXIuX2lzTmVnYXRpdmUpIHsKICAgICAgaWYgKF9pc05lZ2F0aXZlKSB7CiAgICAgICAgLy8gKC10aGlzKSB8ICgtb3RoZXIpID09IH4odGhpcy0xKSB8IH4ob3RoZXItMSkKICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgPT0gfigodGhpcy0xKSAmIChvdGhlci0xKSkKICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgPT0gLSgoKHRoaXMtMSkgJiAob3RoZXItMSkpICsgMSkKICAgICAgICB2YXIgdGhpczEgPSBfYWJzU3ViU2V0U2lnbihvbmUsIHRydWUpOwogICAgICAgIHZhciBvdGhlcjEgPSBvdGhlci5fYWJzU3ViU2V0U2lnbihvbmUsIHRydWUpOwogICAgICAgIC8vIFJlc3VsdCBjYW5ub3QgYmUgemVybyBpZiB0aGlzIGFuZCBhIGFyZSBuZWdhdGl2ZS4KICAgICAgICByZXR1cm4gdGhpczEuX2Fic0FuZFNldFNpZ24ob3RoZXIxLCB0cnVlKS5fYWJzQWRkU2V0U2lnbihvbmUsIHRydWUpOwogICAgICB9CiAgICAgIHJldHVybiBfYWJzT3JTZXRTaWduKG90aGVyLCBmYWxzZSk7CiAgICB9CiAgICAvLyBfbmVnICE9IGEuX25lZwogICAgdmFyIHAsIG47CiAgICBpZiAoX2lzTmVnYXRpdmUpIHsKICAgICAgcCA9IG90aGVyOwogICAgICBuID0gdGhpczsKICAgIH0gZWxzZSB7CiAgICAgIC8vIHwgaXMgc3ltbWV0cmljLgogICAgICBwID0gdGhpczsKICAgICAgbiA9IG90aGVyOwogICAgfQogICAgLy8gcCB8ICgtbikgPT0gcCB8IH4obi0xKSA9PSB+KChuLTEpICZ+IHApID09IC0ofigobi0xKSAmfiBwKSArIDEpCiAgICB2YXIgbjEgPSBuLl9hYnNTdWJTZXRTaWduKG9uZSwgdHJ1ZSk7CiAgICAvLyBSZXN1bHQgY2Fubm90IGJlIHplcm8gaWYgb25seSBvbmUgb2YgdGhpcyBvciBhIGlzIG5lZ2F0aXZlLgogICAgcmV0dXJuIG4xLl9hYnNBbmROb3RTZXRTaWduKHAsIHRydWUpLl9hYnNBZGRTZXRTaWduKG9uZSwgdHJ1ZSk7CiAgfQoKICAvKioKICAgKiBCaXQtd2lzZSBleGNsdXNpdmUtb3Igb3BlcmF0b3IuCiAgICoKICAgKiBUcmVhdGluZyBib3RoIGB0aGlzYCBhbmQgW290aGVyXSBhcyBzdWZmaWNpZW50bHkgbGFyZ2UgdHdvJ3MgY29tcG9uZW50CiAgICogaW50ZWdlcnMsIHRoZSByZXN1bHQgaXMgYSBudW1iZXIgd2l0aCB0aGUgYml0cyBzZXQgdGhhdCBhcmUgc2V0IGluIG9uZSwKICAgKiBidXQgbm90IGJvdGgsIG9mIGB0aGlzYCBhbmQgW290aGVyXQogICAqCiAgICogSWYgdGhlIG9wZXJhbmRzIGhhdmUgdGhlIHNhbWUgc2lnbiwgdGhlIHJlc3VsdCBpcyBub24tbmVnYXRpdmUsCiAgICogb3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgbmVnYXRpdmUuCiAgICovCiAgX0JpZ0ludEltcGwgb3BlcmF0b3IgXihCaWdJbnQgYmlnSW50KSB7CiAgICBfQmlnSW50SW1wbCBvdGhlciA9IGJpZ0ludDsKICAgIGlmIChfaXNaZXJvKSByZXR1cm4gb3RoZXI7CiAgICBpZiAob3RoZXIuX2lzWmVybykgcmV0dXJuIHRoaXM7CiAgICBpZiAoX2lzTmVnYXRpdmUgPT0gb3RoZXIuX2lzTmVnYXRpdmUpIHsKICAgICAgaWYgKF9pc05lZ2F0aXZlKSB7CiAgICAgICAgLy8gKC10aGlzKSBeICgtb3RoZXIpID09IH4odGhpcy0xKSBeIH4ob3RoZXItMSkgPT0gKHRoaXMtMSkgXiAob3RoZXItMSkKICAgICAgICB2YXIgdGhpczEgPSBfYWJzU3ViU2V0U2lnbihvbmUsIHRydWUpOwogICAgICAgIHZhciBvdGhlcjEgPSBvdGhlci5fYWJzU3ViU2V0U2lnbihvbmUsIHRydWUpOwogICAgICAgIHJldHVybiB0aGlzMS5fYWJzWG9yU2V0U2lnbihvdGhlcjEsIGZhbHNlKTsKICAgICAgfQogICAgICByZXR1cm4gX2Fic1hvclNldFNpZ24ob3RoZXIsIGZhbHNlKTsKICAgIH0KICAgIC8vIF9pc05lZ2F0aXZlICE9IGEuX2lzTmVnYXRpdmUKICAgIHZhciBwLCBuOwogICAgaWYgKF9pc05lZ2F0aXZlKSB7CiAgICAgIHAgPSBvdGhlcjsKICAgICAgbiA9IHRoaXM7CiAgICB9IGVsc2UgewogICAgICAvLyBeIGlzIHN5bW1ldHJpYy4KICAgICAgcCA9IHRoaXM7CiAgICAgIG4gPSBvdGhlcjsKICAgIH0KICAgIC8vIHAgXiAoLW4pID09IHAgXiB+KG4tMSkgPT0gfihwIF4gKG4tMSkpID09IC0oKHAgXiAobi0xKSkgKyAxKQogICAgdmFyIG4xID0gbi5fYWJzU3ViU2V0U2lnbihvbmUsIHRydWUpOwogICAgLy8gUmVzdWx0IGNhbm5vdCBiZSB6ZXJvIGlmIG9ubHkgb25lIG9mIHRoaXMgb3IgYSBpcyBuZWdhdGl2ZS4KICAgIHJldHVybiBwLl9hYnNYb3JTZXRTaWduKG4xLCB0cnVlKS5fYWJzQWRkU2V0U2lnbihvbmUsIHRydWUpOwogIH0KCiAgLyoqCiAgICogVGhlIGJpdC13aXNlIG5lZ2F0ZSBvcGVyYXRvci4KICAgKgogICAqIFRyZWF0aW5nIGB0aGlzYCBhcyBhIHN1ZmZpY2llbnRseSBsYXJnZSB0d28ncyBjb21wb25lbnQgaW50ZWdlciwKICAgKiB0aGUgcmVzdWx0IGlzIGEgbnVtYmVyIHdpdGggdGhlIG9wcG9zaXRlIGJpdHMgc2V0LgogICAqCiAgICogVGhpcyBtYXBzIGFueSBpbnRlZ2VyIGB4YCB0byBgLXggLSAxYC4KICAgKi8KICBfQmlnSW50SW1wbCBvcGVyYXRvciB+KCkgewogICAgaWYgKF9pc1plcm8pIHJldHVybiBfbWludXNPbmU7CiAgICBpZiAoX2lzTmVnYXRpdmUpIHsKICAgICAgLy8gfigtdGhpcykgPT0gfih+KHRoaXMtMSkpID09IHRoaXMtMQogICAgICByZXR1cm4gX2Fic1N1YlNldFNpZ24ob25lLCBmYWxzZSk7CiAgICB9CiAgICAvLyB+dGhpcyA9PSAtdGhpcy0xID09IC0odGhpcysxKQogICAgLy8gUmVzdWx0IGNhbm5vdCBiZSB6ZXJvIGlmIHRoaXMgaXMgcG9zaXRpdmUuCiAgICByZXR1cm4gX2Fic0FkZFNldFNpZ24ob25lLCB0cnVlKTsKICB9CgogIC8vLyBBZGRpdGlvbiBvcGVyYXRvci4KICBfQmlnSW50SW1wbCBvcGVyYXRvciArKEJpZ0ludCBiaWdJbnQpIHsKICAgIF9CaWdJbnRJbXBsIG90aGVyID0gYmlnSW50OwogICAgaWYgKF9pc1plcm8pIHJldHVybiBvdGhlcjsKICAgIGlmIChvdGhlci5faXNaZXJvKSByZXR1cm4gdGhpczsKICAgIHZhciBpc05lZ2F0aXZlID0gX2lzTmVnYXRpdmU7CiAgICBpZiAoaXNOZWdhdGl2ZSA9PSBvdGhlci5faXNOZWdhdGl2ZSkgewogICAgICAvLyB0aGlzICsgb3RoZXIgPT0gdGhpcyArIG90aGVyCiAgICAgIC8vICgtdGhpcykgKyAoLW90aGVyKSA9PSAtKHRoaXMgKyBvdGhlcikKICAgICAgcmV0dXJuIF9hYnNBZGRTZXRTaWduKG90aGVyLCBpc05lZ2F0aXZlKTsKICAgIH0KICAgIC8vIHRoaXMgKyAoLW90aGVyKSA9PSB0aGlzIC0gb3RoZXIgPT0gLSh0aGlzIC0gb3RoZXIpCiAgICAvLyAoLXRoaXMpICsgb3RoZXIgPT0gb3RoZXIgLSB0aGlzID09IC0odGhpcyAtIG90aGVyKQogICAgaWYgKF9hYnNDb21wYXJlKG90aGVyKSA+PSAwKSB7CiAgICAgIHJldHVybiBfYWJzU3ViU2V0U2lnbihvdGhlciwgaXNOZWdhdGl2ZSk7CiAgICB9CiAgICByZXR1cm4gb3RoZXIuX2Fic1N1YlNldFNpZ24odGhpcywgIWlzTmVnYXRpdmUpOwogIH0KCiAgLy8vIFN1YnRyYWN0aW9uIG9wZXJhdG9yLgogIF9CaWdJbnRJbXBsIG9wZXJhdG9yIC0oQmlnSW50IGJpZ0ludCkgewogICAgX0JpZ0ludEltcGwgb3RoZXIgPSBiaWdJbnQ7CiAgICBpZiAoX2lzWmVybykgcmV0dXJuIC1vdGhlcjsKICAgIGlmIChvdGhlci5faXNaZXJvKSByZXR1cm4gdGhpczsKICAgIHZhciBpc05lZ2F0aXZlID0gX2lzTmVnYXRpdmU7CiAgICBpZiAoaXNOZWdhdGl2ZSAhPSBvdGhlci5faXNOZWdhdGl2ZSkgewogICAgICAvLyB0aGlzIC0gKC1vdGhlcikgPT0gdGhpcyArIG90aGVyCiAgICAgIC8vICgtdGhpcykgLSBvdGhlciA9PSAtKHRoaXMgKyBvdGhlcikKICAgICAgcmV0dXJuIF9hYnNBZGRTZXRTaWduKG90aGVyLCBpc05lZ2F0aXZlKTsKICAgIH0KICAgIC8vIHRoaXMgLSBvdGhlciA9PSB0aGlzIC0gYSA9PSAtKHRoaXMgLSBvdGhlcikKICAgIC8vICgtdGhpcykgLSAoLW90aGVyKSA9PSBvdGhlciAtIHRoaXMgPT0gLSh0aGlzIC0gb3RoZXIpCiAgICBpZiAoX2Fic0NvbXBhcmUob3RoZXIpID49IDApIHsKICAgICAgcmV0dXJuIF9hYnNTdWJTZXRTaWduKG90aGVyLCBpc05lZ2F0aXZlKTsKICAgIH0KICAgIHJldHVybiBvdGhlci5fYWJzU3ViU2V0U2lnbih0aGlzLCAhaXNOZWdhdGl2ZSk7CiAgfQoKICAvLy8gTXVsdGlwbGllcyBgeERpZ2l0c1t4SW5kZXhdYCB3aXRoIGBtdWx0aXBsaWNhbmREaWdpdHNgIGFuZCBhZGRzIHRoZSByZXN1bHQKICAvLy8gdG8gYGFjY3VtdWxhdG9yRGlnaXRzYC4KICAvLy8KICAvLy8gVGhlIGBtdWx0aXBsaWNhbmREaWdpdHNgIGluIHRoZSByYW5nZSBgaWAgdG8gYGlgK2BuYC0xIGFyZSB0aGUKICAvLy8gbXVsdGlwbGljYW5kIGRpZ2l0cy4KICAvLy8KICAvLy8gVGhlIGBhY2N1bXVsYXRvckRpZ2l0c2AgaW4gdGhlIHJhbmdlIGBqYCB0byBgamArYG5gLTEgYXJlIHRoZSBhY2N1bXVsYXRvcgogIC8vLyBkaWdpdHMuCiAgLy8vCiAgLy8vIENvbmNyZXRlbHk6CiAgLy8vIGBhY2N1bXVsYXRvckRpZ2l0c1tqLi5qK25dICs9IHhEaWdpdHNbeEluZGV4XSAqIG1fZGlnaXRzW2kuLmkrbi0xXWAuCiAgLy8vIFJldHVybnMgMS4KICAvLy8KICAvLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50cmluc2lmaWVkLiBJbnRyaW5zaWNzIG9uIDY0LWJpdCBwbGF0Zm9ybXMKICAvLy8gcHJvY2VzcyBkaWdpdCBwYWlycyBhdCBldmVuIGluZGljZXMgYW5kIHJldHVybnMgMi4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgQHByYWdtYSgidm06bmV2ZXItaW5saW5lIikKICBzdGF0aWMgaW50IF9tdWxBZGQoCiAgICAgIFVpbnQzMkxpc3QgeERpZ2l0cywKICAgICAgaW50IHhJbmRleCwKICAgICAgVWludDMyTGlzdCBtdWx0aXBsaWNhbmREaWdpdHMsCiAgICAgIGludCBpLAogICAgICBVaW50MzJMaXN0IGFjY3VtdWxhdG9yRGlnaXRzLAogICAgICBpbnQgaiwKICAgICAgaW50IG4pIHsKICAgIGludCB4ID0geERpZ2l0c1t4SW5kZXhdOwogICAgaWYgKHggPT0gMCkgewogICAgICAvLyBOby1vcCBpZiB4IGlzIDAuCiAgICAgIHJldHVybiAxOwogICAgfQogICAgaW50IGNhcnJ5ID0gMDsKICAgIGludCB4bCA9IHggJiBfaGFsZkRpZ2l0TWFzazsKICAgIGludCB4aCA9IHggPj4gX2hhbGZEaWdpdEJpdHM7CiAgICB3aGlsZSAoLS1uID49IDApIHsKICAgICAgaW50IG1sID0gbXVsdGlwbGljYW5kRGlnaXRzW2ldICYgX2hhbGZEaWdpdE1hc2s7CiAgICAgIGludCBtaCA9IG11bHRpcGxpY2FuZERpZ2l0c1tpKytdID4+IF9oYWxmRGlnaXRCaXRzOwogICAgICBpbnQgcGggPSB4aCAqIG1sICsgbWggKiB4bDsKICAgICAgaW50IHBsID0geGwgKiBtbCArCiAgICAgICAgICAoKHBoICYgX2hhbGZEaWdpdE1hc2spIDw8IF9oYWxmRGlnaXRCaXRzKSArCiAgICAgICAgICBhY2N1bXVsYXRvckRpZ2l0c1tqXSArCiAgICAgICAgICBjYXJyeTsKICAgICAgY2FycnkgPSAocGwgPj4gX2RpZ2l0Qml0cykgKyAocGggPj4gX2hhbGZEaWdpdEJpdHMpICsgeGggKiBtaDsKICAgICAgYWNjdW11bGF0b3JEaWdpdHNbaisrXSA9IHBsICYgX2RpZ2l0TWFzazsKICAgIH0KICAgIHdoaWxlIChjYXJyeSAhPSAwKSB7CiAgICAgIGludCBsID0gYWNjdW11bGF0b3JEaWdpdHNbal0gKyBjYXJyeTsKICAgICAgY2FycnkgPSBsID4+IF9kaWdpdEJpdHM7CiAgICAgIGFjY3VtdWxhdG9yRGlnaXRzW2orK10gPSBsICYgX2RpZ2l0TWFzazsKICAgIH0KICAgIHJldHVybiAxOwogIH0KCiAgLy8vIE11bHRpcGxpZXMgYHhEaWdpdHNbaV1gIHdpdGggYHhEaWdpdHNgIGFuZCBhZGRzIHRoZSByZXN1bHQgdG8KICAvLy8gYGFjY3VtdWxhdG9yRGlnaXRzYC4KICAvLy8KICAvLy8gVGhlIGB4RGlnaXRzYCBpbiB0aGUgcmFuZ2UgYGlgIHRvIGB1c2VkYC0xIGFyZSB0aGUgbXVsdGlwbGljYW5kIGRpZ2l0cy4KICAvLy8KICAvLy8gVGhlIGBhY2N1bXVsYXRvckRpZ2l0c2AgaW4gdGhlIHJhbmdlIDIqYGlgIHRvIGBpYCtgdXNlZGAtMSBhcmUgdGhlCiAgLy8vIGFjY3VtdWxhdG9yIGRpZ2l0cy4KICAvLy8KICAvLy8gQ29uY3JldGVseToKICAvLy8gYGFjY3VtdWxhdG9yRGlnaXRzWzIqaS4uaSt1c2VkLTFdICs9IHhEaWdpdHNbaV0qeERpZ2l0c1tpXSArCiAgLy8vIDIqeERpZ2l0c1tpXSp4RGlnaXRzW2krMS4udXNlZC0xXWAuCiAgLy8vIFJldHVybnMgMS4KICAvLy8KICAvLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50cmluc2lmaWVkLiBJbnRyaW5zaWNzIG9uIDY0LWJpdCBwbGF0Zm9ybXMKICAvLy8gcHJvY2VzcyBkaWdpdCBwYWlycyBhdCBldmVuIGluZGljZXMgYW5kIHJldHVybnMgMi4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgQHByYWdtYSgidm06bmV2ZXItaW5saW5lIikKICBzdGF0aWMgaW50IF9zcXJBZGQoCiAgICAgIFVpbnQzMkxpc3QgeERpZ2l0cywgaW50IGksIFVpbnQzMkxpc3QgYWNjdWx1bWF0b3JEaWdpdHMsIGludCB1c2VkKSB7CiAgICBpbnQgeCA9IHhEaWdpdHNbaV07CiAgICBpZiAoeCA9PSAwKSByZXR1cm4gMTsKICAgIGludCBqID0gMiAqIGk7CiAgICBpbnQgY2FycnkgPSAwOwogICAgaW50IHhsID0geCAmIF9oYWxmRGlnaXRNYXNrOwogICAgaW50IHhoID0geCA+PiBfaGFsZkRpZ2l0Qml0czsKICAgIGludCBwaCA9IDIgKiB4aCAqIHhsOwogICAgaW50IHBsID0geGwgKiB4bCArCiAgICAgICAgKChwaCAmIF9oYWxmRGlnaXRNYXNrKSA8PCBfaGFsZkRpZ2l0Qml0cykgKwogICAgICAgIGFjY3VsdW1hdG9yRGlnaXRzW2pdOwogICAgY2FycnkgPSAocGwgPj4gX2RpZ2l0Qml0cykgKyAocGggPj4gX2hhbGZEaWdpdEJpdHMpICsgeGggKiB4aDsKICAgIGFjY3VsdW1hdG9yRGlnaXRzW2pdID0gcGwgJiBfZGlnaXRNYXNrOwogICAgeCA8PD0gMTsKICAgIHhsID0geCAmIF9oYWxmRGlnaXRNYXNrOwogICAgeGggPSB4ID4+IF9oYWxmRGlnaXRCaXRzOwogICAgaW50IG4gPSB1c2VkIC0gaSAtIDE7CiAgICBpbnQgayA9IGkgKyAxOwogICAgaisrOwogICAgd2hpbGUgKC0tbiA+PSAwKSB7CiAgICAgIGludCBsID0geERpZ2l0c1trXSAmIF9oYWxmRGlnaXRNYXNrOwogICAgICBpbnQgaCA9IHhEaWdpdHNbaysrXSA+PiBfaGFsZkRpZ2l0Qml0czsKICAgICAgaW50IHBoID0geGggKiBsICsgaCAqIHhsOwogICAgICBpbnQgcGwgPSB4bCAqIGwgKwogICAgICAgICAgKChwaCAmIF9oYWxmRGlnaXRNYXNrKSA8PCBfaGFsZkRpZ2l0Qml0cykgKwogICAgICAgICAgYWNjdWx1bWF0b3JEaWdpdHNbal0gKwogICAgICAgICAgY2Fycnk7CiAgICAgIGNhcnJ5ID0gKHBsID4+IF9kaWdpdEJpdHMpICsgKHBoID4+IF9oYWxmRGlnaXRCaXRzKSArIHhoICogaDsKICAgICAgYWNjdWx1bWF0b3JEaWdpdHNbaisrXSA9IHBsICYgX2RpZ2l0TWFzazsKICAgIH0KICAgIGNhcnJ5ICs9IGFjY3VsdW1hdG9yRGlnaXRzW2kgKyB1c2VkXTsKICAgIGlmIChjYXJyeSA+PSBfZGlnaXRCYXNlKSB7CiAgICAgIGFjY3VsdW1hdG9yRGlnaXRzW2kgKyB1c2VkXSA9IGNhcnJ5IC0gX2RpZ2l0QmFzZTsKICAgICAgYWNjdWx1bWF0b3JEaWdpdHNbaSArIHVzZWQgKyAxXSA9IDE7CiAgICB9IGVsc2UgewogICAgICBhY2N1bHVtYXRvckRpZ2l0c1tpICsgdXNlZF0gPSBjYXJyeTsKICAgIH0KICAgIHJldHVybiAxOwogIH0KCiAgLy8vIE11bHRpcGxpY2F0aW9uIG9wZXJhdG9yLgogIF9CaWdJbnRJbXBsIG9wZXJhdG9yICooQmlnSW50IGJpZ0ludCkgewogICAgX0JpZ0ludEltcGwgb3RoZXIgPSBiaWdJbnQ7CiAgICB2YXIgdXNlZCA9IF91c2VkOwogICAgdmFyIG90aGVyVXNlZCA9IG90aGVyLl91c2VkOwogICAgaWYgKHVzZWQgPT0gMCB8fCBvdGhlclVzZWQgPT0gMCkgewogICAgICByZXR1cm4gemVybzsKICAgIH0KICAgIHZhciByZXN1bHRVc2VkID0gdXNlZCArIG90aGVyVXNlZDsKICAgIHZhciBkaWdpdHMgPSBfZGlnaXRzOwogICAgdmFyIG90aGVyRGlnaXRzID0gb3RoZXIuX2RpZ2l0czsKICAgIHZhciByZXN1bHREaWdpdHMgPSBfbmV3RGlnaXRzKHJlc3VsdFVzZWQpOwogICAgdmFyIGkgPSAwOwogICAgd2hpbGUgKGkgPCBvdGhlclVzZWQpIHsKICAgICAgaSArPSBfbXVsQWRkKG90aGVyRGlnaXRzLCBpLCBkaWdpdHMsIDAsIHJlc3VsdERpZ2l0cywgaSwgdXNlZCk7CiAgICB9CiAgICByZXR1cm4gbmV3IF9CaWdJbnRJbXBsLl8oCiAgICAgICAgX2lzTmVnYXRpdmUgIT0gb3RoZXIuX2lzTmVnYXRpdmUsIHJlc3VsdFVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgfQoKICAvLyByZXN1bHREaWdpdHNbMC4ucmVzdWx0VXNlZC0xXSA9CiAgLy8gICAgIHhEaWdpdHNbMC4ueFVzZWQtMV0qb3RoZXJEaWdpdHNbMC4ub3RoZXJVc2VkLTFdLgogIC8vIFJldHVybnMgcmVzdWx0VXNlZCA9IHhVc2VkICsgb3RoZXJVc2VkLgogIHN0YXRpYyBpbnQgX211bERpZ2l0cyhVaW50MzJMaXN0IHhEaWdpdHMsIGludCB4VXNlZCwgVWludDMyTGlzdCBvdGhlckRpZ2l0cywKICAgICAgaW50IG90aGVyVXNlZCwgVWludDMyTGlzdCByZXN1bHREaWdpdHMpIHsKICAgIHZhciByZXN1bHRVc2VkID0geFVzZWQgKyBvdGhlclVzZWQ7CiAgICB2YXIgaSA9IHJlc3VsdFVzZWQgKyAocmVzdWx0VXNlZCAmIDEpOwogICAgYXNzZXJ0KHJlc3VsdERpZ2l0cy5sZW5ndGggPj0gaSk7CiAgICB3aGlsZSAoLS1pID49IDApIHsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0gMDsKICAgIH0KICAgIGkgPSAwOwogICAgd2hpbGUgKGkgPCBvdGhlclVzZWQpIHsKICAgICAgaSArPSBfbXVsQWRkKG90aGVyRGlnaXRzLCBpLCB4RGlnaXRzLCAwLCByZXN1bHREaWdpdHMsIGksIHhVc2VkKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRVc2VkOwogIH0KCiAgLy8gcmVzdWx0RGlnaXRzWzAuLnJlc3VsdFVzZWQtMV0gPSB4RGlnaXRzWzAuLnhVc2VkLTFdXjIuCiAgLy8gUmV0dXJucyByZXN1bHRVc2VkID0gMip4VXNlZC4KICBzdGF0aWMgaW50IF9zcXJEaWdpdHMoCiAgICAgIFVpbnQzMkxpc3QgeERpZ2l0cywgaW50IHhVc2VkLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgdmFyIHJlc3VsdFVzZWQgPSAyICogeFVzZWQ7CiAgICBhc3NlcnQocmVzdWx0RGlnaXRzLmxlbmd0aCA+PSByZXN1bHRVc2VkKTsKICAgIC8vIFNpbmNlIHJlc3VsdFVzZWQgaXMgZXZlbiwgbm8gbmVlZCBmb3IgYSBsZWFkaW5nIHplcm8gZm9yCiAgICAvLyA2NC1iaXQgcHJvY2Vzc2luZy4KICAgIHZhciBpID0gcmVzdWx0VXNlZDsKICAgIHdoaWxlICgtLWkgPj0gMCkgewogICAgICByZXN1bHREaWdpdHNbaV0gPSAwOwogICAgfQogICAgaSA9IDA7CiAgICB3aGlsZSAoaSA8IHhVc2VkIC0gMSkgewogICAgICBpICs9IF9zcXJBZGQoeERpZ2l0cywgaSwgcmVzdWx0RGlnaXRzLCB4VXNlZCk7CiAgICB9CiAgICAvLyBUaGUgbGFzdCBzdGVwIGlzIGFscmVhZHkgZG9uZSBpZiBkaWdpdCBwYWlycyB3ZXJlIHByb2Nlc3NlZCBhYm92ZS4KICAgIGlmIChpIDwgeFVzZWQpIHsKICAgICAgX211bEFkZCh4RGlnaXRzLCBpLCB4RGlnaXRzLCBpLCByZXN1bHREaWdpdHMsIDIgKiBpLCAxKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRVc2VkOwogIH0KCiAgLy8gSW5kaWNlcyBvZiB0aGUgYXJndW1lbnRzIG9mIF9lc3RpbWF0ZVF1b3RpZW50RGlnaXQuCiAgLy8gRm9yIDY0LWJpdCBwcm9jZXNzaW5nIGJ5IGludHJpbnNpY3Mgb24gNjQtYml0IHBsYXRmb3JtcywgdGhlIHRvcCBkaWdpdCBwYWlyCiAgLy8gb2YgdGhlIGRpdmlzb3IgaXMgcHJvdmlkZWQgaW4gdGhlIGFyZ3MgYXJyYXksIGFuZCBhIDY0LWJpdCBlc3RpbWF0ZWQKICAvLyBxdW90aWVudCBpcyByZXR1cm5lZC4gSG93ZXZlciwgb24gMzItYml0IHBsYXRmb3JtcywgdGhlIGxvdyAzMi1iaXQgZGlnaXQgaXMKICAvLyBpZ25vcmVkIGFuZCBvbmx5IG9uZSAzMi1iaXQgZGlnaXQgaXMgcmV0dXJuZWQgYXMgdGhlIGVzdGltYXRlZCBxdW90aWVudC4KICBzdGF0aWMgY29uc3QgaW50IF9kaXZpc29yTG93VG9wRGlnaXQgPSAwOyAvLyBMb3cgZGlnaXQgb2YgdG9wIHBhaXIgb2YgZGl2aXNvci4KICBzdGF0aWMgY29uc3QgaW50IF9kaXZpc29yVG9wRGlnaXQgPSAxOyAvLyBUb3AgZGlnaXQgb2YgZGl2aXNvci4KICBzdGF0aWMgY29uc3QgaW50IF9xdW90aWVudERpZ2l0ID0gMjsgLy8gRXN0aW1hdGVkIHF1b3RpZW50LgogIHN0YXRpYyBjb25zdCBpbnQgX3F1b3RpZW50SGlnaERpZ2l0ID0gMzsgLy8gSGlnaCBkaWdpdCBvZiBlc3RpbWF0ZWQgcXVvdGllbnQuCgogIC8vLyBFc3RpbWF0ZSBgYXJnc1tfcXVvdGllbnREaWdpdF0gPSBkaWdpdHNbaS0xLi5pXSB+LyBhcmdzW19kaXZpc29yVG9wRGlnaXRdYAogIC8vLyBSZXR1cm5zIDEuCiAgLy8vCiAgLy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludHJpbnNpZmllZC4gSW50cmluc2ljcyBvbiA2NC1iaXQgcGxhdGZvcm1zCiAgLy8vIHByb2Nlc3MgYSBkaWdpdCBwYWlyIChpIGFsd2F5cyBvZGQpOgogIC8vLyBFc3RpbWF0ZSBgYXJnc1tfcXVvdGllbnREaWdpdC4uX3F1b3RpZW50SGlnaERpZ2l0XSA9IGRpZ2l0c1tpLTMuLmldIH4vCiAgLy8vIGFyZ3NbX2Rpdmlzb3JMb3dUb3BEaWdpdC4uX2Rpdmlzb3JUb3BEaWdpdF1gLgogIC8vLyBSZXR1cm5zIDIuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIEBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCiAgc3RhdGljIGludCBfZXN0aW1hdGVRdW90aWVudERpZ2l0KFVpbnQzMkxpc3QgYXJncywgVWludDMyTGlzdCBkaWdpdHMsIGludCBpKSB7CiAgICAvLyBWZXJpZnkgdGhhdCBkaWdpdCBwYWlycyBhcmUgYWNjZXNzaWJsZSBmb3IgNjQtYml0IHByb2Nlc3NpbmcuCiAgICBhc3NlcnQoZGlnaXRzLmxlbmd0aCA+PSA0KTsKICAgIGlmIChkaWdpdHNbaV0gPT0gYXJnc1tfZGl2aXNvclRvcERpZ2l0XSkgewogICAgICBhcmdzW19xdW90aWVudERpZ2l0XSA9IF9kaWdpdE1hc2s7CiAgICB9IGVsc2UgewogICAgICAvLyBDaG9wIG9mZiBvbmUgYml0LCBzaW5jZSBhIE1pbnQgY2Fubm90IGhvbGQgMiBkaWdpdHMuCiAgICAgIHZhciBxdW90aWVudERpZ2l0ID0KICAgICAgICAgICgoZGlnaXRzW2ldIDw8IChfZGlnaXRCaXRzIC0gMSkpIHwgKGRpZ2l0c1tpIC0gMV0gPj4gMSkpIH4vCiAgICAgICAgICAgICAgKGFyZ3NbX2Rpdmlzb3JUb3BEaWdpdF0gPj4gMSk7CiAgICAgIGlmIChxdW90aWVudERpZ2l0ID4gX2RpZ2l0TWFzaykgewogICAgICAgIGFyZ3NbX3F1b3RpZW50RGlnaXRdID0gX2RpZ2l0TWFzazsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcmdzW19xdW90aWVudERpZ2l0XSA9IHF1b3RpZW50RGlnaXQ7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwogIH0KCiAgLy8vIFJldHVybnMgYHRydW5jKHRoaXMgLyBvdGhlcilgLCB3aXRoIGBvdGhlciAhPSAwYC4KICBfQmlnSW50SW1wbCBfZGl2KEJpZ0ludCBiaWdJbnQpIHsKICAgIF9CaWdJbnRJbXBsIG90aGVyID0gYmlnSW50OwogICAgYXNzZXJ0KG90aGVyLl91c2VkID4gMCk7CiAgICBpZiAoX3VzZWQgPCBvdGhlci5fdXNlZCkgewogICAgICByZXR1cm4gemVybzsKICAgIH0KICAgIF9kaXZSZW0ob3RoZXIpOwogICAgLy8gUmV0dXJuIHF1b3RpZW50LCBpLmUuCiAgICAvLyBfbGFzdFF1b1JlbV9kaWdpdHNbX2xhc3RSZW1fdXNlZC4uX2xhc3RRdW9SZW1fdXNlZC0xXSB3aXRoIHByb3BlciBzaWduLgogICAgdmFyIGxhc3RRdW9fdXNlZCA9IF9sYXN0UXVvUmVtVXNlZCAtIF9sYXN0UmVtVXNlZDsKICAgIHZhciBxdW9fZGlnaXRzID0gX2Nsb25lRGlnaXRzKAogICAgICAgIF9sYXN0UXVvUmVtRGlnaXRzLCBfbGFzdFJlbVVzZWQsIF9sYXN0UXVvUmVtVXNlZCwgbGFzdFF1b191c2VkKTsKICAgIHZhciBxdW8gPSBuZXcgX0JpZ0ludEltcGwuXyhmYWxzZSwgbGFzdFF1b191c2VkLCBxdW9fZGlnaXRzKTsKICAgIGlmICgoX2lzTmVnYXRpdmUgIT0gb3RoZXIuX2lzTmVnYXRpdmUpICYmIChxdW8uX3VzZWQgPiAwKSkgewogICAgICBxdW8gPSAtcXVvOwogICAgfQogICAgcmV0dXJuIHF1bzsKICB9CgogIC8vLyBSZXR1cm5zIGB0aGlzIC0gb3RoZXIgKiB0cnVuYyh0aGlzIC8gb3RoZXIpYCwgd2l0aCBgb3RoZXIgIT0gMGAuCiAgX0JpZ0ludEltcGwgX3JlbShCaWdJbnQgYmlnSW50KSB7CiAgICBfQmlnSW50SW1wbCBvdGhlciA9IGJpZ0ludDsKICAgIGFzc2VydChvdGhlci5fdXNlZCA+IDApOwogICAgaWYgKF91c2VkIDwgb3RoZXIuX3VzZWQpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBfZGl2UmVtKG90aGVyKTsKICAgIC8vIFJldHVybiByZW1haW5kZXIsIGkuZS4KICAgIC8vIGRlbm9ybWFsaXplZCBfbGFzdFF1b1JlbV9kaWdpdHNbMC4uX2xhc3RSZW1fdXNlZC0xXSB3aXRoIHByb3BlciBzaWduLgogICAgdmFyIHJlbURpZ2l0cyA9CiAgICAgICAgX2Nsb25lRGlnaXRzKF9sYXN0UXVvUmVtRGlnaXRzLCAwLCBfbGFzdFJlbVVzZWQsIF9sYXN0UmVtVXNlZCk7CiAgICB2YXIgcmVtID0gbmV3IF9CaWdJbnRJbXBsLl8oZmFsc2UsIF9sYXN0UmVtVXNlZCwgcmVtRGlnaXRzKTsKICAgIGlmIChfbGFzdFJlbV9uc2ggPiAwKSB7CiAgICAgIHJlbSA9IHJlbSA+PiBfbGFzdFJlbV9uc2g7IC8vIERlbm9ybWFsaXplIHJlbWFpbmRlci4KICAgIH0KICAgIGlmIChfaXNOZWdhdGl2ZSAmJiAocmVtLl91c2VkID4gMCkpIHsKICAgICAgcmVtID0gLXJlbTsKICAgIH0KICAgIHJldHVybiByZW07CiAgfQoKICAvLy8gQ29tcHV0ZXMgdGhpcyB+LyBvdGhlciBhbmQgdGhpcy5yZW1haW5kZXIob3RoZXIpLgogIC8vLwogIC8vLyBTdG9yZXMgdGhlIHJlc3VsdCBpbiBbX2xhc3RRdW9SZW1EaWdpdHNdLCBbX2xhc3RRdW9SZW1Vc2VkXSBhbmQKICAvLy8gW19sYXN0UmVtVXNlZF0uIFRoZSBbX2xhc3RRdW9SZW1EaWdpdHNdIGNvbnRhaW5zIHRoZSBkaWdpdHMgb2YgKmJvdGgqLCB0aGUKICAvLy8gcXVvdGllbnQgYW5kIHRoZSByZW1haW5kZXIuCiAgLy8vCiAgLy8vIENhY2hlcyB0aGUgaW5wdXQgdG8gYXZvaWQgZG9pbmcgdGhlIHdvcmsgYWdhaW4gd2hlbiB1c2VycyB3cml0ZQogIC8vLyBgYSB+LyBiYCBmb2xsb3dlZCBieSBhIGBhICUgYmAuCiAgdm9pZCBfZGl2UmVtKF9CaWdJbnRJbXBsIG90aGVyKSB7CiAgICAvLyBDaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQuCiAgICBpZiAoKHRoaXMuX3VzZWQgPT0gX2xhc3REaXZpZGVuZFVzZWQpICYmCiAgICAgICAgKG90aGVyLl91c2VkID09IF9sYXN0RGl2aXNvclVzZWQpICYmCiAgICAgICAgaWRlbnRpY2FsKHRoaXMuX2RpZ2l0cywgX2xhc3REaXZpZGVuZERpZ2l0cykgJiYKICAgICAgICBpZGVudGljYWwob3RoZXIuX2RpZ2l0cywgX2xhc3REaXZpc29yRGlnaXRzKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBhc3NlcnQoX3VzZWQgPj0gb3RoZXIuX3VzZWQpOwoKICAgIHZhciBuc2ggPSBfZGlnaXRCaXRzIC0gb3RoZXIuX2RpZ2l0c1tvdGhlci5fdXNlZCAtIDFdLmJpdExlbmd0aDsKICAgIC8vIEZvciA2NC1iaXQgcHJvY2Vzc2luZywgbWFrZSBzdXJlIG90aGVyIGhhcyBhbiBldmVuIG51bWJlciBvZiBkaWdpdHMuCiAgICBpZiAob3RoZXIuX3VzZWQuaXNPZGQpIHsKICAgICAgbnNoICs9IF9kaWdpdEJpdHM7CiAgICB9CiAgICAvLyBDb25jYXRlbmF0ZWQgcG9zaXRpdmUgcXVvdGllbnQgYW5kIG5vcm1hbGl6ZWQgcG9zaXRpdmUgcmVtYWluZGVyLgogICAgLy8gVGhlIHJlc3VsdERpZ2l0cyBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBtb3JlIGRpZ2l0IHRoYW4gdGhlIGRpdmlkZW5kLgogICAgVWludDMyTGlzdCByZXN1bHREaWdpdHM7CiAgICBpbnQgcmVzdWx0VXNlZDsKICAgIC8vIE5vcm1hbGl6ZWQgcG9zaXRpdmUgZGl2aXNvciAocmVmZXJyZWQgdG8gYXMgJ3knKS4KICAgIC8vIFRoZSBub3JtYWxpemVkIGRpdmlzb3IgaGFzIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdCBvZiBpdHMgbW9zdAogICAgLy8gc2lnbmlmaWNhbnQgZGlnaXQgc2V0LgogICAgLy8gVGhpcyBtYWtlcyBlc3RpbWF0aW5nIHRoZSBxdW90aWVudCBlYXNpZXIuCiAgICBVaW50MzJMaXN0IHlEaWdpdHM7CiAgICBpbnQgeVVzZWQ7CiAgICBpZiAobnNoID4gMCkgewogICAgICAvLyBFeHRyYSBkaWdpdHMgZm9yIG5vcm1hbGl6YXRpb24sIGFsc28gdXNlZCBmb3IgcG9zc2libGUgX211bEFkZCBjYXJyeS4KICAgICAgdmFyIG51bUV4dHJhRGlnaXRzID0gKG5zaCArIF9kaWdpdEJpdHMgLSAxKSB+LyBfZGlnaXRCaXRzICsgMTsKICAgICAgeURpZ2l0cyA9IF9uZXdEaWdpdHMob3RoZXIuX3VzZWQgKyBudW1FeHRyYURpZ2l0cyk7CiAgICAgIHlVc2VkID0gX2xTaGlmdERpZ2l0cyhvdGhlci5fZGlnaXRzLCBvdGhlci5fdXNlZCwgbnNoLCB5RGlnaXRzKTsKICAgICAgcmVzdWx0RGlnaXRzID0gX25ld0RpZ2l0cyhfdXNlZCArIG51bUV4dHJhRGlnaXRzKTsKICAgICAgcmVzdWx0VXNlZCA9IF9sU2hpZnREaWdpdHMoX2RpZ2l0cywgX3VzZWQsIG5zaCwgcmVzdWx0RGlnaXRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHlEaWdpdHMgPSBvdGhlci5fZGlnaXRzOwogICAgICB5VXNlZCA9IG90aGVyLl91c2VkOwogICAgICAvLyBFeHRyYSBkaWdpdCB0byBob2xkIHBvc3NpYmxlIF9tdWxBZGQgY2FycnkuCiAgICAgIHJlc3VsdERpZ2l0cyA9IF9jbG9uZURpZ2l0cyhfZGlnaXRzLCAwLCBfdXNlZCwgX3VzZWQgKyAxKTsKICAgICAgcmVzdWx0VXNlZCA9IF91c2VkOwogICAgfQogICAgVWludDMyTGlzdCBhcmdzID0gX25ld0RpZ2l0cyg0KTsKICAgIGFyZ3NbX2Rpdmlzb3JMb3dUb3BEaWdpdF0gPSB5RGlnaXRzW3lVc2VkIC0gMl07CiAgICBhcmdzW19kaXZpc29yVG9wRGlnaXRdID0geURpZ2l0c1t5VXNlZCAtIDFdOwogICAgLy8gRm9yIDY0LWJpdCBwcm9jZXNzaW5nLCBtYWtlIHN1cmUgeVVzZWQsIGksIGFuZCBqIGFyZSBldmVuLgogICAgYXNzZXJ0KHlVc2VkLmlzRXZlbik7CiAgICB2YXIgaSA9IHJlc3VsdFVzZWQgKyAocmVzdWx0VXNlZCAmIDEpOwogICAgdmFyIGogPSBpIC0geVVzZWQ7CiAgICAvLyB0bXBEaWdpdHMgaXMgYSB0ZW1wb3JhcnkgYXJyYXkgb2YgaSAoZXZlbiByZXN1bHRVc2VkKSBkaWdpdHMuCiAgICB2YXIgdG1wRGlnaXRzID0gX25ld0RpZ2l0cyhpKTsKICAgIHZhciB0bXBVc2VkID0gX2RsU2hpZnREaWdpdHMoeURpZ2l0cywgeVVzZWQsIGosIHRtcERpZ2l0cyk7CiAgICAvLyBFeHBsaWNpdCBmaXJzdCBkaXZpc2lvbiBzdGVwIGluIGNhc2Ugbm9ybWFsaXplZCBkaXZpZGVuZCBpcyBsYXJnZXIgb3IKICAgIC8vIGVxdWFsIHRvIHNoaWZ0ZWQgbm9ybWFsaXplZCBkaXZpc29yLgogICAgaWYgKF9jb21wYXJlRGlnaXRzKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCwgdG1wRGlnaXRzLCB0bXBVc2VkKSA+PSAwKSB7CiAgICAgIGFzc2VydChpID09IHJlc3VsdFVzZWQpOwogICAgICByZXN1bHREaWdpdHNbcmVzdWx0VXNlZCsrXSA9IDE7IC8vIFF1b3RpZW50ID0gMS4KICAgICAgLy8gU3VidHJhY3QgZGl2aXNvciBmcm9tIHJlbWFpbmRlci4KICAgICAgX2Fic1N1YihyZXN1bHREaWdpdHMsIHJlc3VsdFVzZWQsIHRtcERpZ2l0cywgdG1wVXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEFjY291bnQgZm9yIHBvc3NpYmxlIGNhcnJ5IGluIF9tdWxBZGQgc3RlcC4KICAgICAgcmVzdWx0RGlnaXRzW3Jlc3VsdFVzZWQrK10gPSAwOwogICAgfQogICAgaWYgKHJlc3VsdFVzZWQuaXNPZGQpIHsKICAgICAgcmVzdWx0RGlnaXRzW3Jlc3VsdFVzZWRdID0gMDsgLy8gTGVhZGluZyB6ZXJvIGZvciA2NC1iaXQgcHJvY2Vzc2luZy4KICAgIH0KICAgIC8vIE5lZ2F0ZSB5IHNvIHdlIGNhbiBsYXRlciB1c2UgX211bEFkZCBpbnN0ZWFkIG9mIG5vbi1leGlzdGVudCBfbXVsU3ViLgogICAgdmFyIG55RGlnaXRzID0gX25ld0RpZ2l0cyh5VXNlZCArIDIpOwogICAgbnlEaWdpdHNbeVVzZWRdID0gMTsKICAgIF9hYnNTdWIobnlEaWdpdHMsIHlVc2VkICsgMSwgeURpZ2l0cywgeVVzZWQsIG55RGlnaXRzKTsKICAgIC8vIG55RGlnaXRzIGlzIHJlYWQtb25seSBhbmQgaGFzIHlVc2VkIGRpZ2l0cyAocG9zc2libHkgaW5jbHVkaW5nIHNldmVyYWwKICAgIC8vIGxlYWRpbmcgemVyb3MpIHBsdXMgYSBsZWFkaW5nIHplcm8gZm9yIDY0LWJpdCBwcm9jZXNzaW5nLgogICAgLy8gcmVzdWx0RGlnaXRzIGlzIG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uCiAgICAvLyByZXN1bHREaWdpdHNbMC4ueVVzZWQtMV0gaXMgdGhlIGN1cnJlbnQgcmVtYWluZGVyLgogICAgLy8gcmVzdWx0RGlnaXRzW3lVc2VkLi5yZXN1bHRVc2VkLTFdIGlzIHRoZSBjdXJyZW50IHF1b3RpZW50LgogICAgLS1pOwogICAgd2hpbGUgKGogPiAwKSB7CiAgICAgIHZhciBkMCA9IF9lc3RpbWF0ZVF1b3RpZW50RGlnaXQoYXJncywgcmVzdWx0RGlnaXRzLCBpKTsKICAgICAgaiAtPSBkMDsKICAgICAgdmFyIGQxID0KICAgICAgICAgIF9tdWxBZGQoYXJncywgX3F1b3RpZW50RGlnaXQsIG55RGlnaXRzLCAwLCByZXN1bHREaWdpdHMsIGosIHlVc2VkKTsKICAgICAgLy8gX2VzdGltYXRlUXVvdGllbnREaWdpdCBhbmQgX211bEFkZCBtdXN0IGFncmVlIG9uIHRoZSBudW1iZXIgb2YgZGlnaXRzCiAgICAgIC8vIHRvIHByb2Nlc3MuCiAgICAgIGFzc2VydChkMCA9PSBkMSk7CiAgICAgIGlmIChkMCA9PSAxKSB7CiAgICAgICAgaWYgKHJlc3VsdERpZ2l0c1tpXSA8IGFyZ3NbX3F1b3RpZW50RGlnaXRdKSB7CiAgICAgICAgICAvLyBSZXVzaW5nIHRoZSBhbHJlYWR5IGV4aXN0aW5nIHRtcERpZ2l0cyBhcnJheS4KICAgICAgICAgIHZhciB0bXBVc2VkID0gX2RsU2hpZnREaWdpdHMobnlEaWdpdHMsIHlVc2VkLCBqLCB0bXBEaWdpdHMpOwogICAgICAgICAgX2Fic1N1YihyZXN1bHREaWdpdHMsIHJlc3VsdFVzZWQsIHRtcERpZ2l0cywgdG1wVXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgICAgICAgIHdoaWxlIChyZXN1bHREaWdpdHNbaV0gPCAtLWFyZ3NbX3F1b3RpZW50RGlnaXRdKSB7CiAgICAgICAgICAgIF9hYnNTdWIocmVzdWx0RGlnaXRzLCByZXN1bHRVc2VkLCB0bXBEaWdpdHMsIHRtcFVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChkMCA9PSAyKTsKICAgICAgICBhc3NlcnQocmVzdWx0RGlnaXRzW2ldIDw9IGFyZ3NbX3F1b3RpZW50SGlnaERpZ2l0XSk7CiAgICAgICAgaWYgKHJlc3VsdERpZ2l0c1tpXSA8IGFyZ3NbX3F1b3RpZW50SGlnaERpZ2l0XSB8fAogICAgICAgICAgICByZXN1bHREaWdpdHNbaSAtIDFdIDwgYXJnc1tfcXVvdGllbnREaWdpdF0pIHsKICAgICAgICAgIC8vIFJldXNpbmcgdGhlIGFscmVhZHkgZXhpc3RpbmcgdG1wRGlnaXRzIGFycmF5LgogICAgICAgICAgdmFyIHRtcFVzZWQgPSBfZGxTaGlmdERpZ2l0cyhueURpZ2l0cywgeVVzZWQsIGosIHRtcERpZ2l0cyk7CiAgICAgICAgICBfYWJzU3ViKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCwgdG1wRGlnaXRzLCB0bXBVc2VkLCByZXN1bHREaWdpdHMpOwogICAgICAgICAgaWYgKGFyZ3NbX3F1b3RpZW50RGlnaXRdID09IDApIHsKICAgICAgICAgICAgLS1hcmdzW19xdW90aWVudEhpZ2hEaWdpdF07CiAgICAgICAgICB9CiAgICAgICAgICAtLWFyZ3NbX3F1b3RpZW50RGlnaXRdOwogICAgICAgICAgYXNzZXJ0KHJlc3VsdERpZ2l0c1tpXSA8PSBhcmdzW19xdW90aWVudEhpZ2hEaWdpdF0pOwogICAgICAgICAgd2hpbGUgKHJlc3VsdERpZ2l0c1tpXSA8IGFyZ3NbX3F1b3RpZW50SGlnaERpZ2l0XSB8fAogICAgICAgICAgICAgIHJlc3VsdERpZ2l0c1tpIC0gMV0gPCBhcmdzW19xdW90aWVudERpZ2l0XSkgewogICAgICAgICAgICBfYWJzU3ViKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCwgdG1wRGlnaXRzLCB0bXBVc2VkLCByZXN1bHREaWdpdHMpOwogICAgICAgICAgICBpZiAoYXJnc1tfcXVvdGllbnREaWdpdF0gPT0gMCkgewogICAgICAgICAgICAgIC0tYXJnc1tfcXVvdGllbnRIaWdoRGlnaXRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC0tYXJnc1tfcXVvdGllbnREaWdpdF07CiAgICAgICAgICAgIGFzc2VydChyZXN1bHREaWdpdHNbaV0gPD0gYXJnc1tfcXVvdGllbnRIaWdoRGlnaXRdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaSAtPSBkMDsKICAgIH0KICAgIC8vIENhY2hlIHJlc3VsdC4KICAgIF9sYXN0RGl2aWRlbmREaWdpdHMgPSBfZGlnaXRzOwogICAgX2xhc3REaXZpZGVuZFVzZWQgPSBfdXNlZDsKICAgIF9sYXN0RGl2aXNvckRpZ2l0cyA9IG90aGVyLl9kaWdpdHM7CiAgICBfbGFzdERpdmlzb3JVc2VkID0gb3RoZXIuX3VzZWQ7CiAgICBfbGFzdFF1b1JlbURpZ2l0cyA9IHJlc3VsdERpZ2l0czsKICAgIF9sYXN0UXVvUmVtVXNlZCA9IHJlc3VsdFVzZWQ7CiAgICBfbGFzdFJlbVVzZWQgPSB5VXNlZDsKICAgIF9sYXN0UmVtX25zaCA9IG5zaDsKICB9CgogIC8vIEN1c3RvbWl6ZWQgdmVyc2lvbiBvZiBfcmVtKCkgbWluaW1pemluZyBhbGxvY2F0aW9ucyBmb3IgdXNlIGluIHJlZHVjdGlvbi4KICAvLyBJbnB1dDoKICAvLyAgIHhEaWdpdHNbMC4ueFVzZWQtMV06IHBvc2l0aXZlIGRpdmlkZW5kLgogIC8vICAgeURpZ2l0c1swLi55VXNlZC0xXTogbm9ybWFsaXplZCBwb3NpdGl2ZSBkaXZpc29yLgogIC8vICAgbnlEaWdpdHNbMC4ueVVzZWQtMV06IG5lZ2F0ZWQgeURpZ2l0cy4KICAvLyAgIG5zaDogbm9ybWFsaXphdGlvbiBzaGlmdCBhbW91bnQuCiAgLy8gICBhcmdzOiB0b3AgeSBkaWdpdChzKSBhbmQgcGxhY2UgaG9sZGVyIGZvciBlc3RpbWF0ZWQgcXVvdGllbnQgZGlnaXQocykuCiAgLy8gICB0bXBEaWdpdHM6IHRlbXAgYXJyYXkgb2YgMip5VXNlZCBkaWdpdHMuCiAgLy8gICByZXN1bHREaWdpdHM6IHJlc3VsdCBkaWdpdHMgYXJyYXkgbGFyZ2UgZW5vdWdoIHRvIHRlbXBvcmFyaWx5IGhvbGQKICAvLyAgICAgICAgICAgICAgICAgY29uY2F0ZW5hdGVkIHF1b3RpZW50IGFuZCBub3JtYWxpemVkIHJlbWFpbmRlci4KICAvLyBPdXRwdXQ6CiAgLy8gICByZXN1bHREaWdpdHNbMC4ucmVzdWx0VXNlZC0xXTogcG9zaXRpdmUgcmVtYWluZGVyLgogIC8vIFJldHVybnMgcmVzdWx0VXNlZC4KICBzdGF0aWMgaW50IF9yZW1EaWdpdHMoCiAgICAgIFVpbnQzMkxpc3QgeERpZ2l0cywKICAgICAgaW50IHhVc2VkLAogICAgICBVaW50MzJMaXN0IHlEaWdpdHMsCiAgICAgIGludCB5VXNlZCwKICAgICAgVWludDMyTGlzdCBueURpZ2l0cywKICAgICAgaW50IG5zaCwKICAgICAgVWludDMyTGlzdCBhcmdzLAogICAgICBVaW50MzJMaXN0IHRtcERpZ2l0cywKICAgICAgVWludDMyTGlzdCByZXN1bHREaWdpdHMpIHsKICAgIC8vIEluaXRpYWxpemUgcmVzdWx0RGlnaXRzIHRvIG5vcm1hbGl6ZWQgcG9zaXRpdmUgZGl2aWRlbmQuCiAgICB2YXIgcmVzdWx0VXNlZCA9IF9sU2hpZnREaWdpdHMoeERpZ2l0cywgeFVzZWQsIG5zaCwgcmVzdWx0RGlnaXRzKTsKICAgIC8vIEZvciA2NC1iaXQgcHJvY2Vzc2luZywgbWFrZSBzdXJlIHlVc2VkLCBpLCBhbmQgaiBhcmUgZXZlbi4KICAgIGFzc2VydCh5VXNlZC5pc0V2ZW4pOwogICAgdmFyIGkgPSByZXN1bHRVc2VkICsgKHJlc3VsdFVzZWQgJiAxKTsKICAgIHZhciBqID0gaSAtIHlVc2VkOwogICAgdmFyIHRtcFVzZWQgPSBfZGxTaGlmdERpZ2l0cyh5RGlnaXRzLCB5VXNlZCwgaiwgdG1wRGlnaXRzKTsKICAgIC8vIEV4cGxpY2l0IGZpcnN0IGRpdmlzaW9uIHN0ZXAgaW4gY2FzZSBub3JtYWxpemVkIGRpdmlkZW5kIGlzIGxhcmdlciBvcgogICAgLy8gZXF1YWwgdG8gc2hpZnRlZCBub3JtYWxpemVkIGRpdmlzb3IuCiAgICBpZiAoX2NvbXBhcmVEaWdpdHMocmVzdWx0RGlnaXRzLCByZXN1bHRVc2VkLCB0bXBEaWdpdHMsIHRtcFVzZWQpID49IDApIHsKICAgICAgYXNzZXJ0KGkgPT0gcmVzdWx0VXNlZCk7CiAgICAgIHJlc3VsdERpZ2l0c1tyZXN1bHRVc2VkKytdID0gMTsgLy8gUXVvdGllbnQgPSAxLgogICAgICAvLyBTdWJ0cmFjdCBkaXZpc29yIGZyb20gcmVtYWluZGVyLgogICAgICBfYWJzU3ViKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCwgdG1wRGlnaXRzLCB0bXBVc2VkLCByZXN1bHREaWdpdHMpOwogICAgfSBlbHNlIHsKICAgICAgLy8gQWNjb3VudCBmb3IgcG9zc2libGUgY2FycnkgaW4gX211bEFkZCBzdGVwLgogICAgICByZXN1bHREaWdpdHNbcmVzdWx0VXNlZCsrXSA9IDA7CiAgICB9CiAgICBpZiAocmVzdWx0VXNlZC5pc09kZCkgewogICAgICByZXN1bHREaWdpdHNbcmVzdWx0VXNlZF0gPSAwOyAvLyBMZWFkaW5nIHplcm8gZm9yIDY0LWJpdCBwcm9jZXNzaW5nLgogICAgfQogICAgLy8gTmVnYXRlZCB5RGlnaXRzIHBhc3NlZCBpbiBueURpZ2l0cyBhbGxvdyB0aGUgdXNlIG9mIF9tdWxBZGQgaW5zdGVhZCBvZgogICAgLy8gdW5pbXBsZW1lbnRlZCBfbXVsU3ViLgogICAgLy8gbnlEaWdpdHMgaXMgcmVhZC1vbmx5IGFuZCBoYXMgeVVzZWQgZGlnaXRzIChwb3NzaWJseSBpbmNsdWRpbmcgc2V2ZXJhbAogICAgLy8gbGVhZGluZyB6ZXJvcykgcGx1cyBhIGxlYWRpbmcgemVybyBmb3IgNjQtYml0IHByb2Nlc3NpbmcuCiAgICAvLyByZXN1bHREaWdpdHMgaXMgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi4KICAgIC8vIHJlc3VsdERpZ2l0c1swLi55VXNlZC0xXSBpcyB0aGUgY3VycmVudCByZW1haW5kZXIuCiAgICAvLyByZXN1bHREaWdpdHNbeVVzZWQuLnJlc3VsdFVzZWQtMV0gaXMgdGhlIGN1cnJlbnQgcXVvdGllbnQuCiAgICAtLWk7CiAgICB3aGlsZSAoaiA+IDApIHsKICAgICAgdmFyIGQwID0gX2VzdGltYXRlUXVvdGllbnREaWdpdChhcmdzLCByZXN1bHREaWdpdHMsIGkpOwogICAgICBqIC09IGQwOwogICAgICB2YXIgZDEgPQogICAgICAgICAgX211bEFkZChhcmdzLCBfcXVvdGllbnREaWdpdCwgbnlEaWdpdHMsIDAsIHJlc3VsdERpZ2l0cywgaiwgeVVzZWQpOwogICAgICAvLyBfZXN0aW1hdGVRdW90aWVudERpZ2l0IGFuZCBfbXVsQWRkIG11c3QgYWdyZWUgb24gdGhlIG51bWJlciBvZiBkaWdpdHMKICAgICAgLy8gdG8gcHJvY2Vzcy4KICAgICAgYXNzZXJ0KGQwID09IGQxKTsKICAgICAgaWYgKGQwID09IDEpIHsKICAgICAgICBpZiAocmVzdWx0RGlnaXRzW2ldIDwgYXJnc1tfcXVvdGllbnREaWdpdF0pIHsKICAgICAgICAgIHZhciB0bXBVc2VkID0gX2RsU2hpZnREaWdpdHMobnlEaWdpdHMsIHlVc2VkLCBqLCB0bXBEaWdpdHMpOwogICAgICAgICAgX2Fic1N1YihyZXN1bHREaWdpdHMsIHJlc3VsdFVzZWQsIHRtcERpZ2l0cywgdG1wVXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgICAgICAgIHdoaWxlIChyZXN1bHREaWdpdHNbaV0gPCAtLWFyZ3NbX3F1b3RpZW50RGlnaXRdKSB7CiAgICAgICAgICAgIF9hYnNTdWIocmVzdWx0RGlnaXRzLCByZXN1bHRVc2VkLCB0bXBEaWdpdHMsIHRtcFVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChkMCA9PSAyKTsKICAgICAgICBhc3NlcnQocmVzdWx0RGlnaXRzW2ldIDw9IGFyZ3NbX3F1b3RpZW50SGlnaERpZ2l0XSk7CiAgICAgICAgaWYgKChyZXN1bHREaWdpdHNbaV0gPCBhcmdzW19xdW90aWVudEhpZ2hEaWdpdF0pIHx8CiAgICAgICAgICAgIChyZXN1bHREaWdpdHNbaSAtIDFdIDwgYXJnc1tfcXVvdGllbnREaWdpdF0pKSB7CiAgICAgICAgICB2YXIgdG1wVXNlZCA9IF9kbFNoaWZ0RGlnaXRzKG55RGlnaXRzLCB5VXNlZCwgaiwgdG1wRGlnaXRzKTsKICAgICAgICAgIF9hYnNTdWIocmVzdWx0RGlnaXRzLCByZXN1bHRVc2VkLCB0bXBEaWdpdHMsIHRtcFVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgICAgICAgICBpZiAoYXJnc1tfcXVvdGllbnREaWdpdF0gPT0gMCkgewogICAgICAgICAgICAtLWFyZ3NbX3F1b3RpZW50SGlnaERpZ2l0XTsKICAgICAgICAgIH0KICAgICAgICAgIC0tYXJnc1tfcXVvdGllbnREaWdpdF07CiAgICAgICAgICBhc3NlcnQocmVzdWx0RGlnaXRzW2ldIDw9IGFyZ3NbX3F1b3RpZW50SGlnaERpZ2l0XSk7CiAgICAgICAgICB3aGlsZSAoKHJlc3VsdERpZ2l0c1tpXSA8IGFyZ3NbX3F1b3RpZW50SGlnaERpZ2l0XSkgfHwKICAgICAgICAgICAgICAocmVzdWx0RGlnaXRzW2kgLSAxXSA8IGFyZ3NbX3F1b3RpZW50RGlnaXRdKSkgewogICAgICAgICAgICBfYWJzU3ViKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCwgdG1wRGlnaXRzLCB0bXBVc2VkLCByZXN1bHREaWdpdHMpOwogICAgICAgICAgICBpZiAoYXJnc1tfcXVvdGllbnREaWdpdF0gPT0gMCkgewogICAgICAgICAgICAgIC0tYXJnc1tfcXVvdGllbnRIaWdoRGlnaXRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC0tYXJnc1tfcXVvdGllbnREaWdpdF07CiAgICAgICAgICAgIGFzc2VydChyZXN1bHREaWdpdHNbaV0gPD0gYXJnc1tfcXVvdGllbnRIaWdoRGlnaXRdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaSAtPSBkMDsKICAgIH0KICAgIC8vIFJldHVybiByZW1haW5kZXIsIGkuZS4gZGVub3JtYWxpemVkIHJlc3VsdERpZ2l0c1swLi55VXNlZC0xXS4KICAgIHJlc3VsdFVzZWQgPSB5VXNlZDsKICAgIGlmIChuc2ggPiAwKSB7CiAgICAgIC8vIERlbm9ybWFsaXplIHJlbWFpbmRlci4KICAgICAgcmVzdWx0VXNlZCA9IF9yU2hpZnREaWdpdHMocmVzdWx0RGlnaXRzLCByZXN1bHRVc2VkLCBuc2gsIHJlc3VsdERpZ2l0cyk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0VXNlZDsKICB9CgogIGludCBnZXQgaGFzaENvZGUgewogICAgLy8gVGhpcyBpcyB0aGUgW0plbmtpbnMgaGFzaCBmdW5jdGlvbl1bMV0gYnV0IHVzaW5nIG1hc2tpbmcgdG8ga2VlcAogICAgLy8gdmFsdWVzIGluIFNNSSByYW5nZS4KICAgIC8vCiAgICAvLyBbMV06IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSmVua2luc19oYXNoX2Z1bmN0aW9uCgogICAgaW50IGNvbWJpbmUoaW50IGhhc2gsIGludCB2YWx1ZSkgewogICAgICBoYXNoID0gMHgxZmZmZmZmZiAmIChoYXNoICsgdmFsdWUpOwogICAgICBoYXNoID0gMHgxZmZmZmZmZiAmIChoYXNoICsgKCgweDAwMDdmZmZmICYgaGFzaCkgPDwgMTApKTsKICAgICAgcmV0dXJuIGhhc2ggXiAoaGFzaCA+PiA2KTsKICAgIH0KCiAgICBpbnQgZmluaXNoKGludCBoYXNoKSB7CiAgICAgIGhhc2ggPSAweDFmZmZmZmZmICYgKGhhc2ggKyAoKDB4MDNmZmZmZmYgJiBoYXNoKSA8PCAzKSk7CiAgICAgIGhhc2ggPSBoYXNoIF4gKGhhc2ggPj4gMTEpOwogICAgICByZXR1cm4gMHgxZmZmZmZmZiAmIChoYXNoICsgKCgweDAwMDAzZmZmICYgaGFzaCkgPDwgMTUpKTsKICAgIH0KCiAgICBpZiAoX2lzWmVybykgcmV0dXJuIDY3MDc7IC8vIEp1c3QgYSByYW5kb20gbnVtYmVyLgogICAgdmFyIGhhc2ggPSBfaXNOZWdhdGl2ZSA/IDgzNTg1IDogNDI5Njg5OyAvLyBBbHNvIHJhbmRvbS4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3VzZWQ7IGkrKykgewogICAgICBoYXNoID0gY29tYmluZShoYXNoLCBfZGlnaXRzW2ldKTsKICAgIH0KICAgIHJldHVybiBmaW5pc2goaGFzaCk7CiAgfQoKICAvKioKICAgKiBUZXN0IHdoZXRoZXIgdGhpcyB2YWx1ZSBpcyBudW1lcmljYWxseSBlcXVhbCB0byBgb3RoZXJgLgogICAqCiAgICogSWYgW290aGVyXSBpcyBhIFtfQmlnSW50SW1wbF0gcmV0dXJucyB3aGV0aGVyIHRoZSB0d28gb3BlcmFuZHMgaGF2ZSB0aGUKICAgKiBzYW1lIHZhbHVlLgogICAqCiAgICogUmV0dXJucyBmYWxzZSBpZiBgb3RoZXJgIGlzIG5vdCBhIFtfQmlnSW50SW1wbF0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIG90aGVyIGlzIF9CaWdJbnRJbXBsICYmIGNvbXBhcmVUbyhvdGhlcikgPT0gMDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBzdG9yZSB0aGlzIGJpZyBpbnRlZ2VyLgogICAqCiAgICogVGhlIG51bWJlciBvZiBiaXRzIGV4Y2x1ZGVzIHRoZSBzaWduIGJpdCwgd2hpY2ggZ2l2ZXMgdGhlIG5hdHVyYWwgbGVuZ3RoCiAgICogZm9yIG5vbi1uZWdhdGl2ZSAodW5zaWduZWQpIHZhbHVlcy4gIE5lZ2F0aXZlIHZhbHVlcyBhcmUgY29tcGxlbWVudGVkIHRvCiAgICogcmV0dXJuIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJpdCB0aGF0IGRpZmZlcnMgZnJvbSB0aGUgc2lnbiBiaXQuCiAgICoKICAgKiBUbyBmaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gc3RvcmUgdGhlIHZhbHVlIGFzIGEgc2lnbmVkIHZhbHVlLAogICAqIGFkZCBvbmUsIGkuZS4gdXNlIGB4LmJpdExlbmd0aCArIDFgLgogICAqCiAgICogYGBgCiAgICogeC5iaXRMZW5ndGggPT0gKC14LTEpLmJpdExlbmd0aAogICAqCiAgICogbmV3IEJpZ0ludC5mcm9tKDMpLmJpdExlbmd0aCA9PSAyOyAgIC8vIDAwMDAwMDExCiAgICogbmV3IEJpZ0ludC5mcm9tKDIpLmJpdExlbmd0aCA9PSAyOyAgIC8vIDAwMDAwMDEwCiAgICogbmV3IEJpZ0ludC5mcm9tKDEpLmJpdExlbmd0aCA9PSAxOyAgIC8vIDAwMDAwMDAxCiAgICogbmV3IEJpZ0ludC5mcm9tKDApLmJpdExlbmd0aCA9PSAwOyAgIC8vIDAwMDAwMDAwCiAgICogbmV3IEJpZ0ludC5mcm9tKC0xKS5iaXRMZW5ndGggPT0gMDsgIC8vIDExMTExMTExCiAgICogbmV3IEJpZ0ludC5mcm9tKC0yKS5iaXRMZW5ndGggPT0gMTsgIC8vIDExMTExMTEwCiAgICogbmV3IEJpZ0ludC5mcm9tKC0zKS5iaXRMZW5ndGggPT0gMjsgIC8vIDExMTExMTAxCiAgICogbmV3IEJpZ0ludC5mcm9tKC00KS5iaXRMZW5ndGggPT0gMjsgIC8vIDExMTExMTAwCiAgICogYGBgCiAgICovCiAgaW50IGdldCBiaXRMZW5ndGggewogICAgaWYgKF91c2VkID09IDApIHJldHVybiAwOwogICAgaWYgKF9pc05lZ2F0aXZlKSByZXR1cm4gKH50aGlzKS5iaXRMZW5ndGg7CiAgICByZXR1cm4gX2RpZ2l0Qml0cyAqIChfdXNlZCAtIDEpICsgX2RpZ2l0c1tfdXNlZCAtIDFdLmJpdExlbmd0aDsKICB9CgogIC8qKgogICAqIFRydW5jYXRpbmcgZGl2aXNpb24gb3BlcmF0b3IuCiAgICoKICAgKiBQZXJmb3JtcyBhIHRydW5jYXRpbmcgaW50ZWdlciBkaXZpc2lvbiwgd2hlcmUgdGhlIHJlbWFpbmRlciBpcyBkaXNjYXJkZWQuCiAgICoKICAgKiBUaGUgcmVtYWluZGVyIGNhbiBiZSBjb21wdXRlZCB1c2luZyB0aGUgW3JlbWFpbmRlcl0gbWV0aG9kLgogICAqCiAgICogRXhhbXBsZXM6CiAgICogYGBgCiAgICogdmFyIHNldmVuID0gbmV3IEJpZ0ludC5mcm9tKDcpOwogICAqIHZhciB0aHJlZSA9IG5ldyBCaWdJbnQuZnJvbSgzKTsKICAgKiBzZXZlbiB+LyB0aHJlZTsgICAgLy8gPT4gMgogICAqICgtc2V2ZW4pIH4vIHRocmVlOyAvLyA9PiAtMgogICAqIHNldmVuIH4vIC10aHJlZTsgICAvLyA9PiAtMgogICAqIHNldmVuLnJlbWFpbmRlcih0aHJlZSk7ICAgIC8vID0+IDEKICAgKiAoLXNldmVuKS5yZW1haW5kZXIodGhyZWUpOyAvLyA9PiAtMQogICAqIHNldmVuLnJlbWFpbmRlcigtdGhyZWUpOyAgIC8vID0+IDEKICAgKiBgYGAKICAgKi8KICBfQmlnSW50SW1wbCBvcGVyYXRvciB+LyhCaWdJbnQgYmlnSW50KSB7CiAgICBfQmlnSW50SW1wbCBvdGhlciA9IGJpZ0ludDsKICAgIGlmIChvdGhlci5fdXNlZCA9PSAwKSB7CiAgICAgIHRocm93IGNvbnN0IEludGVnZXJEaXZpc2lvbkJ5WmVyb0V4Y2VwdGlvbigpOwogICAgfQogICAgcmV0dXJuIF9kaXYob3RoZXIpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIHRoZSB0cnVuY2F0aW5nIGRpdmlzaW9uIG9mIGB0aGlzYCBieSBbb3RoZXJdLgogICAqCiAgICogVGhlIHJlc3VsdCBgcmAgb2YgdGhpcyBvcGVyYXRpb24gc2F0aXNmaWVzOgogICAqIGB0aGlzID09ICh0aGlzIH4vIG90aGVyKSAqIG90aGVyICsgcmAuCiAgICogQXMgYSBjb25zZXF1ZW5jZSB0aGUgcmVtYWluZGVyIGByYCBoYXMgdGhlIHNhbWUgc2lnbiBhcyB0aGUgZGl2aWRlciBgdGhpc2AuCiAgICovCiAgX0JpZ0ludEltcGwgcmVtYWluZGVyKEJpZ0ludCBiaWdJbnQpIHsKICAgIF9CaWdJbnRJbXBsIG90aGVyID0gYmlnSW50OwogICAgaWYgKG90aGVyLl91c2VkID09IDApIHsKICAgICAgdGhyb3cgY29uc3QgSW50ZWdlckRpdmlzaW9uQnlaZXJvRXhjZXB0aW9uKCk7CiAgICB9CiAgICByZXR1cm4gX3JlbShvdGhlcik7CiAgfQoKICAvLy8gRGl2aXNpb24gb3BlcmF0b3IuCiAgZG91YmxlIG9wZXJhdG9yIC8oQmlnSW50IG90aGVyKSA9PiB0aGlzLnRvRG91YmxlKCkgLyBvdGhlci50b0RvdWJsZSgpOwoKICAvKiogUmVsYXRpb25hbCBsZXNzIHRoYW4gb3BlcmF0b3IuICovCiAgYm9vbCBvcGVyYXRvciA8KEJpZ0ludCBvdGhlcikgPT4gY29tcGFyZVRvKG90aGVyKSA8IDA7CgogIC8qKiBSZWxhdGlvbmFsIGxlc3MgdGhhbiBvciBlcXVhbCBvcGVyYXRvci4gKi8KICBib29sIG9wZXJhdG9yIDw9KEJpZ0ludCBvdGhlcikgPT4gY29tcGFyZVRvKG90aGVyKSA8PSAwOwoKICAvKiogUmVsYXRpb25hbCBncmVhdGVyIHRoYW4gb3BlcmF0b3IuICovCiAgYm9vbCBvcGVyYXRvciA+KEJpZ0ludCBvdGhlcikgPT4gY29tcGFyZVRvKG90aGVyKSA+IDA7CgogIC8qKiBSZWxhdGlvbmFsIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCBvcGVyYXRvci4gKi8KICBib29sIG9wZXJhdG9yID49KEJpZ0ludCBvdGhlcikgPT4gY29tcGFyZVRvKG90aGVyKSA+PSAwOwoKICAvKioKICAgKiBFdWNsaWRlYW4gbW9kdWxvIG9wZXJhdG9yLgogICAqCiAgICogUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIHRoZSBFdWNsaWRlYW4gZGl2aXNpb24uIFRoZSBFdWNsaWRlYW4gZGl2aXNpb24gb2YKICAgKiB0d28gaW50ZWdlcnMgYGFgIGFuZCBgYmAgeWllbGRzIHR3byBpbnRlZ2VycyBgcWAgYW5kIGByYCBzdWNoIHRoYXQKICAgKiBgYSA9PSBiICogcSArIHJgIGFuZCBgMCA8PSByIDwgYi5hYnMoKWAuCiAgICoKICAgKiBUaGUgc2lnbiBvZiB0aGUgcmV0dXJuZWQgdmFsdWUgYHJgIGlzIGFsd2F5cyBwb3NpdGl2ZS4KICAgKgogICAqIFNlZSBbcmVtYWluZGVyXSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgdHJ1bmNhdGluZyBkaXZpc2lvbi4KICAgKi8KICBfQmlnSW50SW1wbCBvcGVyYXRvciAlKEJpZ0ludCBiaWdJbnQpIHsKICAgIF9CaWdJbnRJbXBsIG90aGVyID0gYmlnSW50OwogICAgaWYgKG90aGVyLl91c2VkID09IDApIHsKICAgICAgdGhyb3cgY29uc3QgSW50ZWdlckRpdmlzaW9uQnlaZXJvRXhjZXB0aW9uKCk7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX3JlbShvdGhlcik7CiAgICBpZiAocmVzdWx0Ll9pc05lZ2F0aXZlKSB7CiAgICAgIGlmIChvdGhlci5faXNOZWdhdGl2ZSkgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdCAtIG90aGVyOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG90aGVyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc2lnbiBvZiB0aGlzIGJpZyBpbnRlZ2VyLgogICAqCiAgICogUmV0dXJucyAwIGZvciB6ZXJvLCAtMSBmb3IgdmFsdWVzIGxlc3MgdGhhbiB6ZXJvIGFuZAogICAqICsxIGZvciB2YWx1ZXMgZ3JlYXRlciB0aGFuIHplcm8uCiAgICovCiAgaW50IGdldCBzaWduIHsKICAgIGlmIChfdXNlZCA9PSAwKSByZXR1cm4gMDsKICAgIHJldHVybiBfaXNOZWdhdGl2ZSA/IC0xIDogMTsKICB9CgogIC8vLyBXaGV0aGVyIHRoaXMgYmlnIGludGVnZXIgaXMgZXZlbi4KICBib29sIGdldCBpc0V2ZW4gPT4gX3VzZWQgPT0gMCB8fCAoX2RpZ2l0c1swXSAmIDEpID09IDA7CgogIC8vLyBXaGV0aGVyIHRoaXMgYmlnIGludGVnZXIgaXMgb2RkLgogIGJvb2wgZ2V0IGlzT2RkID0+ICFpc0V2ZW47CgogIC8vLyBXaGV0aGVyIHRoaXMgbnVtYmVyIGlzIG5lZ2F0aXZlLgogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgPT4gX2lzTmVnYXRpdmU7CgogIF9CaWdJbnRJbXBsIHBvdyhpbnQgZXhwb25lbnQpIHsKICAgIGlmIChleHBvbmVudCA8IDApIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkV4cG9uZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlOiAkZXhwb25lbnQiKTsKICAgIH0KICAgIGlmIChleHBvbmVudCA9PSAwKSByZXR1cm4gb25lOwoKICAgIC8vIEV4cG9uZW50aWF0aW9uIGJ5IHNxdWFyaW5nLgogICAgdmFyIHJlc3VsdCA9IG9uZTsKICAgIHZhciBiYXNlID0gdGhpczsKICAgIHdoaWxlIChleHBvbmVudCAhPSAwKSB7CiAgICAgIGlmICgoZXhwb25lbnQgJiAxKSA9PSAxKSB7CiAgICAgICAgcmVzdWx0ICo9IGJhc2U7CiAgICAgIH0KICAgICAgZXhwb25lbnQgPj49IDE7CiAgICAgIC8vIFNraXAgdW5uZWNlc3Nhcnkgb3BlcmF0aW9uLgogICAgICBpZiAoZXhwb25lbnQgIT0gMCkgewogICAgICAgIGJhc2UgKj0gYmFzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhpcyBpbnRlZ2VyIHRvIHRoZSBwb3dlciBvZiBbZXhwb25lbnRdIG1vZHVsbyBbbW9kdWx1c10uCiAgICoKICAgKiBUaGUgW2V4cG9uZW50XSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgW21vZHVsdXNdIG11c3QgYmUKICAgKiBwb3NpdGl2ZS4KICAgKi8KICBfQmlnSW50SW1wbCBtb2RQb3coQmlnSW50IGJpZ0V4cG9uZW50LCBCaWdJbnQgYmlnTW9kdWx1cykgewogICAgX0JpZ0ludEltcGwgZXhwb25lbnQgPSBiaWdFeHBvbmVudDsKICAgIF9CaWdJbnRJbXBsIG1vZHVsdXMgPSBiaWdNb2R1bHVzOwogICAgaWYgKGV4cG9uZW50Ll9pc05lZ2F0aXZlKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJleHBvbmVudCBtdXN0IGJlIHBvc2l0aXZlOiAkZXhwb25lbnQiKTsKICAgIH0KICAgIGlmIChtb2R1bHVzIDw9IHplcm8pIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIm1vZHVsdXMgbXVzdCBiZSBzdHJpY3RseSBwb3NpdGl2ZTogJG1vZHVsdXMiKTsKICAgIH0KICAgIGlmIChleHBvbmVudC5faXNaZXJvKSByZXR1cm4gb25lOwoKICAgIGZpbmFsIGV4cG9uZW50Qml0bGVuID0gZXhwb25lbnQuYml0TGVuZ3RoOwogICAgaWYgKGV4cG9uZW50Qml0bGVuIDw9IDApIHJldHVybiBvbmU7CiAgICBmaW5hbCBib29sIGNhbm5vdFVzZU1vbnRnb21lcnkgPSBtb2R1bHVzLmlzRXZlbiB8fCBhYnMoKSA+PSBtb2R1bHVzOwogICAgaWYgKGNhbm5vdFVzZU1vbnRnb21lcnkgfHwgZXhwb25lbnRCaXRsZW4gPCA2NCkgewogICAgICBfQmlnSW50UmVkdWN0aW9uIHogPSAoY2Fubm90VXNlTW9udGdvbWVyeSB8fCBleHBvbmVudEJpdGxlbiA8IDgpCiAgICAgICAgICA/IG5ldyBfQmlnSW50Q2xhc3NpY1JlZHVjdGlvbihtb2R1bHVzKQogICAgICAgICAgOiBuZXcgX0JpZ0ludE1vbnRnb21lcnlSZWR1Y3Rpb24obW9kdWx1cyk7CiAgICAgIHZhciByZXN1bHREaWdpdHMgPSBfbmV3RGlnaXRzKDIgKiB6Ll9ub3JtTW9kdWx1c1VzZWQgKyAyKTsKICAgICAgdmFyIHJlc3VsdDJEaWdpdHMgPSBfbmV3RGlnaXRzKDIgKiB6Ll9ub3JtTW9kdWx1c1VzZWQgKyAyKTsKICAgICAgdmFyIGdEaWdpdHMgPSBfbmV3RGlnaXRzKHouX25vcm1Nb2R1bHVzVXNlZCk7CiAgICAgIHZhciBnVXNlZCA9IHouX2NvbnZlcnQodGhpcywgZ0RpZ2l0cyk7CiAgICAgIC8vIEluaXRpYWxpemUgcmVzdWx0IHdpdGggZy4KICAgICAgLy8gQ29weSBsZWFkaW5nIHplcm8gaWYgYW55LgogICAgICBmb3IgKGludCBqID0gZ1VzZWQgKyAoZ1VzZWQgJiAxKSAtIDE7IGogPj0gMDsgai0tKSB7CiAgICAgICAgcmVzdWx0RGlnaXRzW2pdID0gZ0RpZ2l0c1tqXTsKICAgICAgfQogICAgICB2YXIgcmVzdWx0VXNlZCA9IGdVc2VkOwogICAgICB2YXIgcmVzdWx0MlVzZWQ7CiAgICAgIGZvciAoaW50IGkgPSBleHBvbmVudEJpdGxlbiAtIDI7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgcmVzdWx0MlVzZWQgPSB6Ll9zcXIocmVzdWx0RGlnaXRzLCByZXN1bHRVc2VkLCByZXN1bHQyRGlnaXRzKTsKICAgICAgICBpZiAoZXhwb25lbnQuX2RpZ2l0c1tpIH4vIF9kaWdpdEJpdHNdICYgKDEgPDwgKGkgJSBfZGlnaXRCaXRzKSkgIT0gMCkgewogICAgICAgICAgcmVzdWx0VXNlZCA9CiAgICAgICAgICAgICAgei5fbXVsKHJlc3VsdDJEaWdpdHMsIHJlc3VsdDJVc2VkLCBnRGlnaXRzLCBnVXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gU3dhcCByZXN1bHQgYW5kIHJlc3VsdDIuCiAgICAgICAgICB2YXIgdG1wRGlnaXRzID0gcmVzdWx0RGlnaXRzOwogICAgICAgICAgdmFyIHRtcFVzZWQgPSByZXN1bHRVc2VkOwogICAgICAgICAgcmVzdWx0RGlnaXRzID0gcmVzdWx0MkRpZ2l0czsKICAgICAgICAgIHJlc3VsdFVzZWQgPSByZXN1bHQyVXNlZDsKICAgICAgICAgIHJlc3VsdDJEaWdpdHMgPSB0bXBEaWdpdHM7CiAgICAgICAgICByZXN1bHQyVXNlZCA9IHRtcFVzZWQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB6Ll9yZXZlcnQocmVzdWx0RGlnaXRzLCByZXN1bHRVc2VkKTsKICAgIH0KICAgIHZhciBrOwogICAgaWYgKGV4cG9uZW50Qml0bGVuIDwgMTgpCiAgICAgIGsgPSAxOwogICAgZWxzZSBpZiAoZXhwb25lbnRCaXRsZW4gPCA0OCkKICAgICAgayA9IDM7CiAgICBlbHNlIGlmIChleHBvbmVudEJpdGxlbiA8IDE0NCkKICAgICAgayA9IDQ7CiAgICBlbHNlIGlmIChleHBvbmVudEJpdGxlbiA8IDc2OCkKICAgICAgayA9IDU7CiAgICBlbHNlCiAgICAgIGsgPSA2OwogICAgX0JpZ0ludFJlZHVjdGlvbiB6ID0gbmV3IF9CaWdJbnRNb250Z29tZXJ5UmVkdWN0aW9uKG1vZHVsdXMpOwogICAgdmFyIG4gPSAzOwogICAgZmluYWwgazEgPSBrIC0gMTsKICAgIGZpbmFsIGttID0gKDEgPDwgaykgLSAxOwogICAgTGlzdCBnRGlnaXRzID0gbmV3IExpc3Qoa20gKyAxKTsKICAgIExpc3QgZ1VzZWQgPSBuZXcgTGlzdChrbSArIDEpOwogICAgZ0RpZ2l0c1sxXSA9IF9uZXdEaWdpdHMoei5fbm9ybU1vZHVsdXNVc2VkKTsKICAgIGdVc2VkWzFdID0gei5fY29udmVydCh0aGlzLCBnRGlnaXRzWzFdKTsKICAgIGlmIChrID4gMSkgewogICAgICB2YXIgZzJEaWdpdHMgPSBfbmV3RGlnaXRzKDIgKiB6Ll9ub3JtTW9kdWx1c1VzZWQgKyAyKTsKICAgICAgdmFyIGcyVXNlZCA9IHouX3NxcihnRGlnaXRzWzFdLCBnVXNlZFsxXSwgZzJEaWdpdHMpOwogICAgICB3aGlsZSAobiA8PSBrbSkgewogICAgICAgIGdEaWdpdHNbbl0gPSBfbmV3RGlnaXRzKDIgKiB6Ll9ub3JtTW9kdWx1c1VzZWQgKyAyKTsKICAgICAgICBnVXNlZFtuXSA9CiAgICAgICAgICAgIHouX211bChnMkRpZ2l0cywgZzJVc2VkLCBnRGlnaXRzW24gLSAyXSwgZ1VzZWRbbiAtIDJdLCBnRGlnaXRzW25dKTsKICAgICAgICBuICs9IDI7CiAgICAgIH0KICAgIH0KICAgIHZhciB3OwogICAgdmFyIGlzT25lID0gdHJ1ZTsKICAgIHZhciByZXN1bHREaWdpdHMgPSBvbmUuX2RpZ2l0czsKICAgIHZhciByZXN1bHRVc2VkID0gb25lLl91c2VkOwogICAgdmFyIHJlc3VsdDJEaWdpdHMgPSBfbmV3RGlnaXRzKDIgKiB6Ll9ub3JtTW9kdWx1c1VzZWQgKyAyKTsKICAgIHZhciByZXN1bHQyVXNlZDsKICAgIHZhciBleHBvbmVudERpZ2l0cyA9IGV4cG9uZW50Ll9kaWdpdHM7CiAgICB2YXIgaiA9IGV4cG9uZW50Ll91c2VkIC0gMTsKICAgIHZhciBpID0gZXhwb25lbnREaWdpdHNbal0uYml0TGVuZ3RoIC0gMTsKICAgIHdoaWxlIChqID49IDApIHsKICAgICAgaWYgKGkgPj0gazEpIHsKICAgICAgICB3ID0gKGV4cG9uZW50RGlnaXRzW2pdID4+IChpIC0gazEpKSAmIGttOwogICAgICB9IGVsc2UgewogICAgICAgIHcgPSAoZXhwb25lbnREaWdpdHNbal0gJiAoKDEgPDwgKGkgKyAxKSkgLSAxKSkgPDwgKGsxIC0gaSk7CiAgICAgICAgaWYgKGogPiAwKSB7CiAgICAgICAgICB3IHw9IGV4cG9uZW50RGlnaXRzW2ogLSAxXSA+PiAoX2RpZ2l0Qml0cyArIGkgLSBrMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIG4gPSBrOwogICAgICB3aGlsZSAoKHcgJiAxKSA9PSAwKSB7CiAgICAgICAgdyA+Pj0gMTsKICAgICAgICAtLW47CiAgICAgIH0KICAgICAgaWYgKChpIC09IG4pIDwgMCkgewogICAgICAgIGkgKz0gX2RpZ2l0Qml0czsKICAgICAgICAtLWo7CiAgICAgIH0KICAgICAgaWYgKGlzT25lKSB7CiAgICAgICAgLy8gciA9PSAxLCBkb24ndCBib3RoZXIgc3F1YXJpbmcgb3IgbXVsdGlwbHlpbmcgaXQuCiAgICAgICAgcmVzdWx0RGlnaXRzID0gX25ld0RpZ2l0cygyICogei5fbm9ybU1vZHVsdXNVc2VkICsgMik7CiAgICAgICAgcmVzdWx0VXNlZCA9IGdVc2VkW3ddOwogICAgICAgIHZhciBnd0RpZ2l0cyA9IGdEaWdpdHNbd107CiAgICAgICAgdmFyIHJpID0gcmVzdWx0VXNlZCArIChyZXN1bHRVc2VkICYgMSk7IC8vIENvcHkgbGVhZGluZyB6ZXJvIGlmIGFueS4KICAgICAgICB3aGlsZSAoLS1yaSA+PSAwKSB7CiAgICAgICAgICByZXN1bHREaWdpdHNbcmldID0gZ3dEaWdpdHNbcmldOwogICAgICAgIH0KICAgICAgICBpc09uZSA9IGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIHdoaWxlIChuID4gMSkgewogICAgICAgICAgcmVzdWx0MlVzZWQgPSB6Ll9zcXIocmVzdWx0RGlnaXRzLCByZXN1bHRVc2VkLCByZXN1bHQyRGlnaXRzKTsKICAgICAgICAgIHJlc3VsdFVzZWQgPSB6Ll9zcXIocmVzdWx0MkRpZ2l0cywgcmVzdWx0MlVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgICAgICAgICBuIC09IDI7CiAgICAgICAgfQogICAgICAgIGlmIChuID4gMCkgewogICAgICAgICAgcmVzdWx0MlVzZWQgPSB6Ll9zcXIocmVzdWx0RGlnaXRzLCByZXN1bHRVc2VkLCByZXN1bHQyRGlnaXRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHN3YXBEaWdpdHMgPSByZXN1bHREaWdpdHM7CiAgICAgICAgICB2YXIgc3dhcFVzZWQgPSByZXN1bHRVc2VkOwogICAgICAgICAgcmVzdWx0RGlnaXRzID0gcmVzdWx0MkRpZ2l0czsKICAgICAgICAgIHJlc3VsdFVzZWQgPSByZXN1bHQyVXNlZDsKICAgICAgICAgIHJlc3VsdDJEaWdpdHMgPSBzd2FwRGlnaXRzOwogICAgICAgICAgcmVzdWx0MlVzZWQgPSBzd2FwVXNlZDsKICAgICAgICB9CiAgICAgICAgcmVzdWx0VXNlZCA9IHouX211bCgKICAgICAgICAgICAgcmVzdWx0MkRpZ2l0cywgcmVzdWx0MlVzZWQsIGdEaWdpdHNbd10sIGdVc2VkW3ddLCByZXN1bHREaWdpdHMpOwogICAgICB9CiAgICAgIHdoaWxlIChqID49IDAgJiYgKGV4cG9uZW50RGlnaXRzW2pdICYgKDEgPDwgaSkpID09IDApIHsKICAgICAgICByZXN1bHQyVXNlZCA9IHouX3NxcihyZXN1bHREaWdpdHMsIHJlc3VsdFVzZWQsIHJlc3VsdDJEaWdpdHMpOwogICAgICAgIHZhciBzd2FwRGlnaXRzID0gcmVzdWx0RGlnaXRzOwogICAgICAgIHZhciBzd2FwVXNlZCA9IHJlc3VsdFVzZWQ7CiAgICAgICAgcmVzdWx0RGlnaXRzID0gcmVzdWx0MkRpZ2l0czsKICAgICAgICByZXN1bHRVc2VkID0gcmVzdWx0MlVzZWQ7CiAgICAgICAgcmVzdWx0MkRpZ2l0cyA9IHN3YXBEaWdpdHM7CiAgICAgICAgcmVzdWx0MlVzZWQgPSBzd2FwVXNlZDsKICAgICAgICBpZiAoLS1pIDwgMCkgewogICAgICAgICAgaSA9IF9kaWdpdEJpdHMgLSAxOwogICAgICAgICAgLS1qOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXNzZXJ0KCFpc09uZSk7CiAgICByZXR1cm4gei5fcmV2ZXJ0KHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCk7CiAgfQoKICAvLyBJZiBpbnYgaXMgZmFsc2UsIHJldHVybnMgZ2NkKHgsIHkpLgogIC8vIElmIGludiBpcyB0cnVlIGFuZCBnY2QoeCwgeSkgPSAxLCByZXR1cm5zIGQsIHNvIHRoYXQgYyp4ICsgZCp5ID0gMS4KICAvLyBJZiBpbnYgaXMgdHJ1ZSBhbmQgZ2NkKHgsIHkpICE9IDEsIHRocm93cyBFeGNlcHRpb24oIk5vdCBjb3ByaW1lIikuCiAgc3RhdGljIF9CaWdJbnRJbXBsIF9iaW5hcnlHY2QoX0JpZ0ludEltcGwgeCwgX0JpZ0ludEltcGwgeSwgYm9vbCBpbnYpIHsKICAgIHZhciB4RGlnaXRzID0geC5fZGlnaXRzOwogICAgdmFyIHlEaWdpdHMgPSB5Ll9kaWdpdHM7CiAgICB2YXIgeFVzZWQgPSB4Ll91c2VkOwogICAgdmFyIHlVc2VkID0geS5fdXNlZDsKICAgIHZhciBtYXhVc2VkID0gX21heCh4VXNlZCwgeVVzZWQpOwogICAgZmluYWwgbWF4TGVuID0gbWF4VXNlZCArIChtYXhVc2VkICYgMSk7CiAgICB4RGlnaXRzID0gX2Nsb25lRGlnaXRzKHhEaWdpdHMsIDAsIHhVc2VkLCBtYXhMZW4pOwogICAgeURpZ2l0cyA9IF9jbG9uZURpZ2l0cyh5RGlnaXRzLCAwLCB5VXNlZCwgbWF4TGVuKTsKICAgIGludCBzaGlmdEFtb3VudCA9IDA7CiAgICBpZiAoaW52KSB7CiAgICAgIGlmICgoeVVzZWQgPT0gMSkgJiYgKHlEaWdpdHNbMF0gPT0gMSkpIHJldHVybiBvbmU7CiAgICAgIGlmICgoeVVzZWQgPT0gMCkgfHwgKHlEaWdpdHNbMF0uaXNFdmVuICYmIHhEaWdpdHNbMF0uaXNFdmVuKSkgewogICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5vdCBjb3ByaW1lIik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmICh4Ll9pc1plcm8pIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgwLCAidGhpcyIsICJtdXN0IG5vdCBiZSB6ZXJvIik7CiAgICAgIH0KICAgICAgaWYgKHkuX2lzWmVybykgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKDAsICJvdGhlciIsICJtdXN0IG5vdCBiZSB6ZXJvIik7CiAgICAgIH0KICAgICAgaWYgKCgoeFVzZWQgPT0gMSkgJiYgKHhEaWdpdHNbMF0gPT0gMSkpIHx8CiAgICAgICAgICAoKHlVc2VkID09IDEpICYmICh5RGlnaXRzWzBdID09IDEpKSkgcmV0dXJuIG9uZTsKICAgICAgd2hpbGUgKCgoeERpZ2l0c1swXSAmIDEpID09IDApICYmICgoeURpZ2l0c1swXSAmIDEpID09IDApKSB7CiAgICAgICAgX3JzaCh4RGlnaXRzLCB4VXNlZCwgMSwgeERpZ2l0cyk7CiAgICAgICAgX3JzaCh5RGlnaXRzLCB5VXNlZCwgMSwgeURpZ2l0cyk7CiAgICAgICAgc2hpZnRBbW91bnQrKzsKICAgICAgfQogICAgICBpZiAoc2hpZnRBbW91bnQgPj0gX2RpZ2l0Qml0cykgewogICAgICAgIHZhciBkaWdpdFNoaWZ0QW1vdW50ID0gc2hpZnRBbW91bnQgfi8gX2RpZ2l0Qml0czsKICAgICAgICB4VXNlZCAtPSBkaWdpdFNoaWZ0QW1vdW50OwogICAgICAgIHlVc2VkIC09IGRpZ2l0U2hpZnRBbW91bnQ7CiAgICAgICAgbWF4VXNlZCAtPSBkaWdpdFNoaWZ0QW1vdW50OwogICAgICB9CiAgICAgIGlmICgoeURpZ2l0c1swXSAmIDEpID09IDEpIHsKICAgICAgICAvLyBTd2FwIHggYW5kIHkuCiAgICAgICAgdmFyIHRtcERpZ2l0cyA9IHhEaWdpdHM7CiAgICAgICAgdmFyIHRtcFVzZWQgPSB4VXNlZDsKICAgICAgICB4RGlnaXRzID0geURpZ2l0czsKICAgICAgICB4VXNlZCA9IHlVc2VkOwogICAgICAgIHlEaWdpdHMgPSB0bXBEaWdpdHM7CiAgICAgICAgeVVzZWQgPSB0bXBVc2VkOwogICAgICB9CiAgICB9CiAgICB2YXIgdURpZ2l0cyA9IF9jbG9uZURpZ2l0cyh4RGlnaXRzLCAwLCB4VXNlZCwgbWF4TGVuKTsKICAgIHZhciB2RGlnaXRzID0gX2Nsb25lRGlnaXRzKHlEaWdpdHMsIDAsIHlVc2VkLCBtYXhMZW4gKyAyKTsgLy8gKzIgZm9yIGxzaC4KICAgIGZpbmFsIGJvb2wgYWMgPSAoeERpZ2l0c1swXSAmIDEpID09IDA7CgogICAgLy8gVmFyaWFibGVzIGEsIGIsIGMsIGFuZCBkIHJlcXVpcmUgb25lIG1vcmUgZGlnaXQuCiAgICBmaW5hbCBhYmNkVXNlZCA9IG1heFVzZWQgKyAxOwogICAgZmluYWwgYWJjZExlbiA9IGFiY2RVc2VkICsgKGFiY2RVc2VkICYgMSkgKyAyOyAvLyArMiB0byBzYXRpc2Z5IF9hYnNBZGQuCiAgICB2YXIgYURpZ2l0cywgYkRpZ2l0cywgY0RpZ2l0cywgZERpZ2l0czsKICAgIGJvb2wgYUlzTmVnYXRpdmUsIGJJc05lZ2F0aXZlLCBjSXNOZWdhdGl2ZSwgZElzTmVnYXRpdmU7CiAgICBpZiAoYWMpIHsKICAgICAgYURpZ2l0cyA9IF9uZXdEaWdpdHMoYWJjZExlbik7CiAgICAgIGFJc05lZ2F0aXZlID0gZmFsc2U7CiAgICAgIGFEaWdpdHNbMF0gPSAxOwogICAgICBjRGlnaXRzID0gX25ld0RpZ2l0cyhhYmNkTGVuKTsKICAgICAgY0lzTmVnYXRpdmUgPSBmYWxzZTsKICAgIH0KICAgIGJEaWdpdHMgPSBfbmV3RGlnaXRzKGFiY2RMZW4pOwogICAgYklzTmVnYXRpdmUgPSBmYWxzZTsKICAgIGREaWdpdHMgPSBfbmV3RGlnaXRzKGFiY2RMZW4pOwogICAgZElzTmVnYXRpdmUgPSBmYWxzZTsKICAgIGREaWdpdHNbMF0gPSAxOwoKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIHdoaWxlICgodURpZ2l0c1swXSAmIDEpID09IDApIHsKICAgICAgICBfcnNoKHVEaWdpdHMsIG1heFVzZWQsIDEsIHVEaWdpdHMpOwogICAgICAgIGlmIChhYykgewogICAgICAgICAgaWYgKCgoYURpZ2l0c1swXSAmIDEpID09IDEpIHx8ICgoYkRpZ2l0c1swXSAmIDEpID09IDEpKSB7CiAgICAgICAgICAgIC8vIGEgKz0geQogICAgICAgICAgICBpZiAoYUlzTmVnYXRpdmUpIHsKICAgICAgICAgICAgICBpZiAoKGFEaWdpdHNbbWF4VXNlZF0gIT0gMCkgfHwKICAgICAgICAgICAgICAgICAgKF9jb21wYXJlRGlnaXRzKGFEaWdpdHMsIG1heFVzZWQsIHlEaWdpdHMsIG1heFVzZWQpKSA+IDApIHsKICAgICAgICAgICAgICAgIF9hYnNTdWIoYURpZ2l0cywgYWJjZFVzZWQsIHlEaWdpdHMsIG1heFVzZWQsIGFEaWdpdHMpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfYWJzU3ViKHlEaWdpdHMsIG1heFVzZWQsIGFEaWdpdHMsIG1heFVzZWQsIGFEaWdpdHMpOwogICAgICAgICAgICAgICAgYUlzTmVnYXRpdmUgPSBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX2Fic0FkZChhRGlnaXRzLCBhYmNkVXNlZCwgeURpZ2l0cywgbWF4VXNlZCwgYURpZ2l0cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gYiAtPSB4CiAgICAgICAgICAgIGlmIChiSXNOZWdhdGl2ZSkgewogICAgICAgICAgICAgIF9hYnNBZGQoYkRpZ2l0cywgYWJjZFVzZWQsIHhEaWdpdHMsIG1heFVzZWQsIGJEaWdpdHMpOwogICAgICAgICAgICB9IGVsc2UgaWYgKChiRGlnaXRzW21heFVzZWRdICE9IDApIHx8CiAgICAgICAgICAgICAgICAoX2NvbXBhcmVEaWdpdHMoYkRpZ2l0cywgbWF4VXNlZCwgeERpZ2l0cywgbWF4VXNlZCkgPiAwKSkgewogICAgICAgICAgICAgIF9hYnNTdWIoYkRpZ2l0cywgYWJjZFVzZWQsIHhEaWdpdHMsIG1heFVzZWQsIGJEaWdpdHMpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIF9hYnNTdWIoeERpZ2l0cywgbWF4VXNlZCwgYkRpZ2l0cywgbWF4VXNlZCwgYkRpZ2l0cyk7CiAgICAgICAgICAgICAgYklzTmVnYXRpdmUgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBfcnNoKGFEaWdpdHMsIGFiY2RVc2VkLCAxLCBhRGlnaXRzKTsKICAgICAgICB9IGVsc2UgaWYgKChiRGlnaXRzWzBdICYgMSkgPT0gMSkgewogICAgICAgICAgLy8gYiAtPSB4CiAgICAgICAgICBpZiAoYklzTmVnYXRpdmUpIHsKICAgICAgICAgICAgX2Fic0FkZChiRGlnaXRzLCBhYmNkVXNlZCwgeERpZ2l0cywgbWF4VXNlZCwgYkRpZ2l0cyk7CiAgICAgICAgICB9IGVsc2UgaWYgKChiRGlnaXRzW21heFVzZWRdICE9IDApIHx8CiAgICAgICAgICAgICAgKF9jb21wYXJlRGlnaXRzKGJEaWdpdHMsIG1heFVzZWQsIHhEaWdpdHMsIG1heFVzZWQpID4gMCkpIHsKICAgICAgICAgICAgX2Fic1N1YihiRGlnaXRzLCBhYmNkVXNlZCwgeERpZ2l0cywgbWF4VXNlZCwgYkRpZ2l0cyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfYWJzU3ViKHhEaWdpdHMsIG1heFVzZWQsIGJEaWdpdHMsIG1heFVzZWQsIGJEaWdpdHMpOwogICAgICAgICAgICBiSXNOZWdhdGl2ZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9yc2goYkRpZ2l0cywgYWJjZFVzZWQsIDEsIGJEaWdpdHMpOwogICAgICB9CiAgICAgIHdoaWxlICgodkRpZ2l0c1swXSAmIDEpID09IDApIHsKICAgICAgICBfcnNoKHZEaWdpdHMsIG1heFVzZWQsIDEsIHZEaWdpdHMpOwogICAgICAgIGlmIChhYykgewogICAgICAgICAgaWYgKCgoY0RpZ2l0c1swXSAmIDEpID09IDEpIHx8ICgoZERpZ2l0c1swXSAmIDEpID09IDEpKSB7CiAgICAgICAgICAgIC8vIGMgKz0geQogICAgICAgICAgICBpZiAoY0lzTmVnYXRpdmUpIHsKICAgICAgICAgICAgICBpZiAoKGNEaWdpdHNbbWF4VXNlZF0gIT0gMCkgfHwKICAgICAgICAgICAgICAgICAgKF9jb21wYXJlRGlnaXRzKGNEaWdpdHMsIG1heFVzZWQsIHlEaWdpdHMsIG1heFVzZWQpID4gMCkpIHsKICAgICAgICAgICAgICAgIF9hYnNTdWIoY0RpZ2l0cywgYWJjZFVzZWQsIHlEaWdpdHMsIG1heFVzZWQsIGNEaWdpdHMpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfYWJzU3ViKHlEaWdpdHMsIG1heFVzZWQsIGNEaWdpdHMsIG1heFVzZWQsIGNEaWdpdHMpOwogICAgICAgICAgICAgICAgY0lzTmVnYXRpdmUgPSBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX2Fic0FkZChjRGlnaXRzLCBhYmNkVXNlZCwgeURpZ2l0cywgbWF4VXNlZCwgY0RpZ2l0cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZCAtPSB4CiAgICAgICAgICAgIGlmIChkSXNOZWdhdGl2ZSkgewogICAgICAgICAgICAgIF9hYnNBZGQoZERpZ2l0cywgYWJjZFVzZWQsIHhEaWdpdHMsIG1heFVzZWQsIGREaWdpdHMpOwogICAgICAgICAgICB9IGVsc2UgaWYgKChkRGlnaXRzW21heFVzZWRdICE9IDApIHx8CiAgICAgICAgICAgICAgICAoX2NvbXBhcmVEaWdpdHMoZERpZ2l0cywgbWF4VXNlZCwgeERpZ2l0cywgbWF4VXNlZCkgPiAwKSkgewogICAgICAgICAgICAgIF9hYnNTdWIoZERpZ2l0cywgYWJjZFVzZWQsIHhEaWdpdHMsIG1heFVzZWQsIGREaWdpdHMpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIF9hYnNTdWIoeERpZ2l0cywgbWF4VXNlZCwgZERpZ2l0cywgbWF4VXNlZCwgZERpZ2l0cyk7CiAgICAgICAgICAgICAgZElzTmVnYXRpdmUgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBfcnNoKGNEaWdpdHMsIGFiY2RVc2VkLCAxLCBjRGlnaXRzKTsKICAgICAgICB9IGVsc2UgaWYgKChkRGlnaXRzWzBdICYgMSkgPT0gMSkgewogICAgICAgICAgLy8gZCAtPSB4CiAgICAgICAgICBpZiAoZElzTmVnYXRpdmUpIHsKICAgICAgICAgICAgX2Fic0FkZChkRGlnaXRzLCBhYmNkVXNlZCwgeERpZ2l0cywgbWF4VXNlZCwgZERpZ2l0cyk7CiAgICAgICAgICB9IGVsc2UgaWYgKChkRGlnaXRzW21heFVzZWRdICE9IDApIHx8CiAgICAgICAgICAgICAgKF9jb21wYXJlRGlnaXRzKGREaWdpdHMsIG1heFVzZWQsIHhEaWdpdHMsIG1heFVzZWQpID4gMCkpIHsKICAgICAgICAgICAgX2Fic1N1YihkRGlnaXRzLCBhYmNkVXNlZCwgeERpZ2l0cywgbWF4VXNlZCwgZERpZ2l0cyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfYWJzU3ViKHhEaWdpdHMsIG1heFVzZWQsIGREaWdpdHMsIG1heFVzZWQsIGREaWdpdHMpOwogICAgICAgICAgICBkSXNOZWdhdGl2ZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9yc2goZERpZ2l0cywgYWJjZFVzZWQsIDEsIGREaWdpdHMpOwogICAgICB9CiAgICAgIGlmIChfY29tcGFyZURpZ2l0cyh1RGlnaXRzLCBtYXhVc2VkLCB2RGlnaXRzLCBtYXhVc2VkKSA+PSAwKSB7CiAgICAgICAgLy8gdSAtPSB2CiAgICAgICAgX2Fic1N1Yih1RGlnaXRzLCBtYXhVc2VkLCB2RGlnaXRzLCBtYXhVc2VkLCB1RGlnaXRzKTsKICAgICAgICBpZiAoYWMpIHsKICAgICAgICAgIC8vIGEgLT0gYwogICAgICAgICAgaWYgKGFJc05lZ2F0aXZlID09IGNJc05lZ2F0aXZlKSB7CiAgICAgICAgICAgIHZhciBhX2NtcF9jID0gX2NvbXBhcmVEaWdpdHMoYURpZ2l0cywgYWJjZFVzZWQsIGNEaWdpdHMsIGFiY2RVc2VkKTsKICAgICAgICAgICAgaWYgKGFfY21wX2MgPiAwKSB7CiAgICAgICAgICAgICAgX2Fic1N1YihhRGlnaXRzLCBhYmNkVXNlZCwgY0RpZ2l0cywgYWJjZFVzZWQsIGFEaWdpdHMpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIF9hYnNTdWIoY0RpZ2l0cywgYWJjZFVzZWQsIGFEaWdpdHMsIGFiY2RVc2VkLCBhRGlnaXRzKTsKICAgICAgICAgICAgICBhSXNOZWdhdGl2ZSA9ICFhSXNOZWdhdGl2ZSAmJiAoYV9jbXBfYyAhPSAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX2Fic0FkZChhRGlnaXRzLCBhYmNkVXNlZCwgY0RpZ2l0cywgYWJjZFVzZWQsIGFEaWdpdHMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBiIC09IGQKICAgICAgICBpZiAoYklzTmVnYXRpdmUgPT0gZElzTmVnYXRpdmUpIHsKICAgICAgICAgIHZhciBiX2NtcF9kID0gX2NvbXBhcmVEaWdpdHMoYkRpZ2l0cywgYWJjZFVzZWQsIGREaWdpdHMsIGFiY2RVc2VkKTsKICAgICAgICAgIGlmIChiX2NtcF9kID4gMCkgewogICAgICAgICAgICBfYWJzU3ViKGJEaWdpdHMsIGFiY2RVc2VkLCBkRGlnaXRzLCBhYmNkVXNlZCwgYkRpZ2l0cyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfYWJzU3ViKGREaWdpdHMsIGFiY2RVc2VkLCBiRGlnaXRzLCBhYmNkVXNlZCwgYkRpZ2l0cyk7CiAgICAgICAgICAgIGJJc05lZ2F0aXZlID0gIWJJc05lZ2F0aXZlICYmIChiX2NtcF9kICE9IDApOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfYWJzQWRkKGJEaWdpdHMsIGFiY2RVc2VkLCBkRGlnaXRzLCBhYmNkVXNlZCwgYkRpZ2l0cyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vIHYgLT0gdQogICAgICAgIF9hYnNTdWIodkRpZ2l0cywgbWF4VXNlZCwgdURpZ2l0cywgbWF4VXNlZCwgdkRpZ2l0cyk7CiAgICAgICAgaWYgKGFjKSB7CiAgICAgICAgICAvLyBjIC09IGEKICAgICAgICAgIGlmIChjSXNOZWdhdGl2ZSA9PSBhSXNOZWdhdGl2ZSkgewogICAgICAgICAgICB2YXIgY19jbXBfYSA9IF9jb21wYXJlRGlnaXRzKGNEaWdpdHMsIGFiY2RVc2VkLCBhRGlnaXRzLCBhYmNkVXNlZCk7CiAgICAgICAgICAgIGlmIChjX2NtcF9hID4gMCkgewogICAgICAgICAgICAgIF9hYnNTdWIoY0RpZ2l0cywgYWJjZFVzZWQsIGFEaWdpdHMsIGFiY2RVc2VkLCBjRGlnaXRzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfYWJzU3ViKGFEaWdpdHMsIGFiY2RVc2VkLCBjRGlnaXRzLCBhYmNkVXNlZCwgY0RpZ2l0cyk7CiAgICAgICAgICAgICAgY0lzTmVnYXRpdmUgPSAhY0lzTmVnYXRpdmUgJiYgKGNfY21wX2EgIT0gMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9hYnNBZGQoY0RpZ2l0cywgYWJjZFVzZWQsIGFEaWdpdHMsIGFiY2RVc2VkLCBjRGlnaXRzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gZCAtPSBiCiAgICAgICAgaWYgKGRJc05lZ2F0aXZlID09IGJJc05lZ2F0aXZlKSB7CiAgICAgICAgICB2YXIgZF9jbXBfYiA9IF9jb21wYXJlRGlnaXRzKGREaWdpdHMsIGFiY2RVc2VkLCBiRGlnaXRzLCBhYmNkVXNlZCk7CiAgICAgICAgICBpZiAoZF9jbXBfYiA+IDApIHsKICAgICAgICAgICAgX2Fic1N1YihkRGlnaXRzLCBhYmNkVXNlZCwgYkRpZ2l0cywgYWJjZFVzZWQsIGREaWdpdHMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX2Fic1N1YihiRGlnaXRzLCBhYmNkVXNlZCwgZERpZ2l0cywgYWJjZFVzZWQsIGREaWdpdHMpOwogICAgICAgICAgICBkSXNOZWdhdGl2ZSA9ICFkSXNOZWdhdGl2ZSAmJiAoZF9jbXBfYiAhPSAwKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgX2Fic0FkZChkRGlnaXRzLCBhYmNkVXNlZCwgYkRpZ2l0cywgYWJjZFVzZWQsIGREaWdpdHMpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBFeGl0IGxvb3AgaWYgdSA9PSAwLgogICAgICB2YXIgaSA9IG1heFVzZWQ7CiAgICAgIHdoaWxlICgoaSA+IDApICYmICh1RGlnaXRzW2kgLSAxXSA9PSAwKSkgLS1pOwogICAgICBpZiAoaSA9PSAwKSBicmVhazsKICAgIH0KICAgIGlmICghaW52KSB7CiAgICAgIGlmIChzaGlmdEFtb3VudCA+IDApIHsKICAgICAgICBtYXhVc2VkID0gX2xTaGlmdERpZ2l0cyh2RGlnaXRzLCBtYXhVc2VkLCBzaGlmdEFtb3VudCwgdkRpZ2l0cyk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKGZhbHNlLCBtYXhVc2VkLCB2RGlnaXRzKTsKICAgIH0KICAgIC8vIE5vIGludmVyc2UgaWYgdiAhPSAxLgogICAgdmFyIGkgPSBtYXhVc2VkIC0gMTsKICAgIHdoaWxlICgoaSA+IDApICYmICh2RGlnaXRzW2ldID09IDApKSAtLWk7CiAgICBpZiAoKGkgIT0gMCkgfHwgKHZEaWdpdHNbMF0gIT0gMSkpIHsKICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm90IGNvcHJpbWUiKTsKICAgIH0KCiAgICBpZiAoZElzTmVnYXRpdmUpIHsKICAgICAgd2hpbGUgKChkRGlnaXRzW21heFVzZWRdICE9IDApIHx8CiAgICAgICAgICAoX2NvbXBhcmVEaWdpdHMoZERpZ2l0cywgbWF4VXNlZCwgeERpZ2l0cywgbWF4VXNlZCkgPiAwKSkgewogICAgICAgIC8vIGQgKz0geCwgZCBzdGlsbCBuZWdhdGl2ZQogICAgICAgIF9hYnNTdWIoZERpZ2l0cywgYWJjZFVzZWQsIHhEaWdpdHMsIG1heFVzZWQsIGREaWdpdHMpOwogICAgICB9CiAgICAgIC8vIGQgKz0geAogICAgICBfYWJzU3ViKHhEaWdpdHMsIG1heFVzZWQsIGREaWdpdHMsIG1heFVzZWQsIGREaWdpdHMpOwogICAgICBkSXNOZWdhdGl2ZSA9IGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKChkRGlnaXRzW21heFVzZWRdICE9IDApIHx8CiAgICAgICAgICAoX2NvbXBhcmVEaWdpdHMoZERpZ2l0cywgbWF4VXNlZCwgeERpZ2l0cywgbWF4VXNlZCkgPj0gMCkpIHsKICAgICAgICAvLyBkIC09IHgKICAgICAgICBfYWJzU3ViKGREaWdpdHMsIGFiY2RVc2VkLCB4RGlnaXRzLCBtYXhVc2VkLCBkRGlnaXRzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKGZhbHNlLCBtYXhVc2VkLCBkRGlnaXRzKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIG1vZHVsYXIgbXVsdGlwbGljYXRpdmUgaW52ZXJzZSBvZiB0aGlzIGJpZyBpbnRlZ2VyCiAgICogbW9kdWxvIFttb2R1bHVzXS4KICAgKgogICAqIFRoZSBbbW9kdWx1c10gbXVzdCBiZSBwb3NpdGl2ZS4KICAgKgogICAqIEl0IGlzIGFuIGVycm9yIGlmIG5vIG1vZHVsYXIgaW52ZXJzZSBleGlzdHMuCiAgICovCiAgLy8gUmV0dXJucyAxL3RoaXMgJSBtb2R1bHVzLCB3aXRoIG1vZHVsdXMgPiAwLgogIF9CaWdJbnRJbXBsIG1vZEludmVyc2UoQmlnSW50IGJpZ0ludCkgewogICAgX0JpZ0ludEltcGwgbW9kdWx1cyA9IGJpZ0ludDsKICAgIGlmIChtb2R1bHVzIDw9IHplcm8pIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIk1vZHVsdXMgbXVzdCBiZSBzdHJpY3RseSBwb3NpdGl2ZTogJG1vZHVsdXMiKTsKICAgIH0KICAgIGlmIChtb2R1bHVzID09IG9uZSkgcmV0dXJuIHplcm87CiAgICB2YXIgdG1wID0gdGhpczsKICAgIGlmICh0bXAuX2lzTmVnYXRpdmUgfHwgKHRtcC5fYWJzQ29tcGFyZShtb2R1bHVzKSA+PSAwKSkgewogICAgICB0bXAgJT0gbW9kdWx1czsKICAgIH0KICAgIHJldHVybiBfYmluYXJ5R2NkKG1vZHVsdXMsIHRtcCwgdHJ1ZSk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiB0aGlzIGJpZyBpbnRlZ2VyIGFuZCBbb3RoZXJdLgogICAqCiAgICogSWYgZWl0aGVyIG51bWJlciBpcyBub24temVybywgdGhlIHJlc3VsdCBpcyB0aGUgbnVtZXJpY2FsbHkgZ3JlYXRlc3QKICAgKiBpbnRlZ2VyIGRpdmlkaW5nIGJvdGggYHRoaXNgIGFuZCBgb3RoZXJgLgogICAqCiAgICogVGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIGlzIGluZGVwZW5kZW50IG9mIHRoZSBvcmRlciwKICAgKiBzbyBgeC5nY2QoeSlgIGlzICBhbHdheXMgdGhlIHNhbWUgYXMgYHkuZ2NkKHgpYC4KICAgKgogICAqIEZvciBhbnkgaW50ZWdlciBgeGAsIGB4LmdjZCh4KWAgaXMgYHguYWJzKClgLgogICAqCiAgICogSWYgYm90aCBgdGhpc2AgYW5kIGBvdGhlcmAgaXMgemVybywgdGhlIHJlc3VsdCBpcyBhbHNvIHplcm8uCiAgICovCiAgX0JpZ0ludEltcGwgZ2NkKEJpZ0ludCBiaWdJbnQpIHsKICAgIF9CaWdJbnRJbXBsIG90aGVyID0gYmlnSW50OwogICAgaWYgKF9pc1plcm8pIHJldHVybiBvdGhlci5hYnMoKTsKICAgIGlmIChvdGhlci5faXNaZXJvKSByZXR1cm4gdGhpcy5hYnMoKTsKICAgIHJldHVybiBfYmluYXJ5R2NkKHRoaXMsIG90aGVyLCBmYWxzZSk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsZWFzdCBzaWduaWZpY2FudCBbd2lkdGhdIGJpdHMgb2YgdGhpcyBiaWcgaW50ZWdlciBhcyBhCiAgICogbm9uLW5lZ2F0aXZlIG51bWJlciAoaS5lLiB1bnNpZ25lZCByZXByZXNlbnRhdGlvbikuICBUaGUgcmV0dXJuZWQgdmFsdWUgaGFzCiAgICogemVyb3MgaW4gYWxsIGJpdCBwb3NpdGlvbnMgaGlnaGVyIHRoYW4gW3dpZHRoXS4KICAgKgogICAqIGBgYAogICAqIG5ldyBCaWdJbnQuZnJvbSgtMSkudG9VbnNpZ25lZCg1KSA9PSAzMSAgIC8vIDExMTExMTExICAtPiAgMDAwMTExMTEKICAgKiBgYGAKICAgKgogICAqIFRoaXMgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHRvIHNpbXVsYXRlIGFyaXRobWV0aWMgZnJvbSBsb3cgbGV2ZWwgbGFuZ3VhZ2VzLgogICAqIEZvciBleGFtcGxlLCB0byBpbmNyZW1lbnQgYW4gOCBiaXQgcXVhbnRpdHk6CiAgICoKICAgKiBgYGAKICAgKiBxID0gKHEgKyAxKS50b1Vuc2lnbmVkKDgpOwogICAqIGBgYAogICAqCiAgICogYHFgIHdpbGwgY291bnQgZnJvbSBgMGAgdXAgdG8gYDI1NWAgYW5kIHRoZW4gd3JhcCBhcm91bmQgdG8gYDBgLgogICAqCiAgICogSWYgdGhlIGlucHV0IGZpdHMgaW4gW3dpZHRoXSBiaXRzIHdpdGhvdXQgdHJ1bmNhdGlvbiwgdGhlIHJlc3VsdCBpcyB0aGUKICAgKiBzYW1lIGFzIHRoZSBpbnB1dC4gIFRoZSBtaW5pbXVtIHdpZHRoIG5lZWRlZCB0byBhdm9pZCB0cnVuY2F0aW9uIG9mIGB4YCBpcwogICAqIGdpdmVuIGJ5IGB4LmJpdExlbmd0aGAsIGkuZS4KICAgKgogICAqIGBgYAogICAqIHggPT0geC50b1Vuc2lnbmVkKHguYml0TGVuZ3RoKTsKICAgKiBgYGAKICAgKi8KICBfQmlnSW50SW1wbCB0b1Vuc2lnbmVkKGludCB3aWR0aCkgewogICAgcmV0dXJuIHRoaXMgJiAoKG9uZSA8PCB3aWR0aCkgLSBvbmUpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgW3dpZHRoXSBiaXRzIG9mIHRoaXMgaW50ZWdlciwgZXh0ZW5kaW5nIHRoZQogICAqIGhpZ2hlc3QgcmV0YWluZWQgYml0IHRvIHRoZSBzaWduLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0cnVuY2F0aW5nIHRoZSB2YWx1ZQogICAqIHRvIGZpdCBpbiBbd2lkdGhdIGJpdHMgdXNpbmcgYW4gc2lnbmVkIDItcyBjb21wbGVtZW50IHJlcHJlc2VudGF0aW9uLiAgVGhlCiAgICogcmV0dXJuZWQgdmFsdWUgaGFzIHRoZSBzYW1lIGJpdCB2YWx1ZSBpbiBhbGwgcG9zaXRpb25zIGhpZ2hlciB0aGFuIFt3aWR0aF0uCiAgICoKICAgKiBgYGAKICAgKiB2YXIgYmlnMTUgPSBuZXcgQmlnSW50LmZyb20oMTUpOwogICAqIHZhciBiaWcxNiA9IG5ldyBCaWdJbnQuZnJvbSgxNik7CiAgICogdmFyIGJpZzIzOSA9IG5ldyBCaWdJbnQuZnJvbSgyMzkpOwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWLS1zaWduIGJpdC1WCiAgICogYmlnMTYudG9TaWduZWQoNSkgPT0gLWJpZzE2ICAgLy8gIDAwMDEwMDAwIC0+IDExMTEwMDAwCiAgICogYmlnMjM5LnRvU2lnbmVkKDUpID09IGJpZzE1ICAgLy8gIDExMTAxMTExIC0+IDAwMDAxMTExCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgIF4KICAgKiBgYGAKICAgKgogICAqIFRoaXMgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHRvIHNpbXVsYXRlIGFyaXRobWV0aWMgZnJvbSBsb3cgbGV2ZWwgbGFuZ3VhZ2VzLgogICAqIEZvciBleGFtcGxlLCB0byBpbmNyZW1lbnQgYW4gOCBiaXQgc2lnbmVkIHF1YW50aXR5OgogICAqCiAgICogYGBgCiAgICogcSA9IChxICsgMSkudG9TaWduZWQoOCk7CiAgICogYGBgCiAgICoKICAgKiBgcWAgd2lsbCBjb3VudCBmcm9tIGAwYCB1cCB0byBgMTI3YCwgd3JhcCB0byBgLTEyOGAgYW5kIGNvdW50IGJhY2sgdXAgdG8KICAgKiBgMTI3YC4KICAgKgogICAqIElmIHRoZSBpbnB1dCB2YWx1ZSBmaXRzIGluIFt3aWR0aF0gYml0cyB3aXRob3V0IHRydW5jYXRpb24sIHRoZSByZXN1bHQgaXMKICAgKiB0aGUgc2FtZSBhcyB0aGUgaW5wdXQuICBUaGUgbWluaW11bSB3aWR0aCBuZWVkZWQgdG8gYXZvaWQgdHJ1bmNhdGlvbiBvZiBgeGAKICAgKiBpcyBgeC5iaXRMZW5ndGggKyAxYCwgaS5lLgogICAqCiAgICogYGBgCiAgICogeCA9PSB4LnRvU2lnbmVkKHguYml0TGVuZ3RoICsgMSk7CiAgICogYGBgCiAgICovCiAgX0JpZ0ludEltcGwgdG9TaWduZWQoaW50IHdpZHRoKSB7CiAgICAvLyBUaGUgdmFsdWUgb2YgYmluYXJ5IG51bWJlciB3ZWlnaHRzIGVhY2ggYml0IGJ5IGEgcG93ZXIgb2YgdHdvLiAgVGhlCiAgICAvLyB0d29zLWNvbXBsZW1lbnQgdmFsdWUgd2VpZ2h0cyB0aGUgc2lnbiBiaXQgbmVnYXRpdmVseS4gIFdlIGNvbXB1dGUgdGhlCiAgICAvLyB2YWx1ZSBvZiB0aGUgbmVnYXRpdmUgd2VpZ2h0aW5nIGJ5IGlzb2xhdGluZyB0aGUgc2lnbiBiaXQgd2l0aCB0aGUKICAgIC8vIGNvcnJlY3QgcG93ZXIgb2YgdHdvIHdlaWdodGluZyBhbmQgc3VidHJhY3RpbmcgaXQgZnJvbSB0aGUgdmFsdWUgb2YgdGhlCiAgICAvLyBsb3dlciBiaXRzLgogICAgdmFyIHNpZ25NYXNrID0gb25lIDw8ICh3aWR0aCAtIDEpOwogICAgcmV0dXJuICh0aGlzICYgKHNpZ25NYXNrIC0gb25lKSkgLSAodGhpcyAmIHNpZ25NYXNrKTsKICB9CgogIGJvb2wgZ2V0IGlzVmFsaWRJbnQgewogICAgYXNzZXJ0KF9kaWdpdEJpdHMgPT0gMzIpOwogICAgcmV0dXJuIF91c2VkIDwgMiB8fAogICAgICAgIChfdXNlZCA9PSAyICYmCiAgICAgICAgICAgIChfZGlnaXRzWzFdIDwgMHg4MDAwMDAwMCB8fAogICAgICAgICAgICAgICAgKF9pc05lZ2F0aXZlICYmIF9kaWdpdHNbMV0gPT0gMHg4MDAwMDAwMCAmJiBfZGlnaXRzWzBdID09IDApKSk7CiAgfQoKICBpbnQgdG9JbnQoKSB7CiAgICBhc3NlcnQoX2RpZ2l0Qml0cyA9PSAzMik7CiAgICBpZiAoX3VzZWQgPT0gMCkgcmV0dXJuIDA7CiAgICBpZiAoX3VzZWQgPT0gMSkgcmV0dXJuIF9pc05lZ2F0aXZlID8gLV9kaWdpdHNbMF0gOiBfZGlnaXRzWzBdOwogICAgaWYgKF91c2VkID09IDIgJiYgX2RpZ2l0c1sxXSA8IDB4ODAwMDAwMDApIHsKICAgICAgdmFyIHJlc3VsdCA9IChfZGlnaXRzWzFdIDw8IF9kaWdpdEJpdHMpIHwgX2RpZ2l0c1swXTsKICAgICAgcmV0dXJuIF9pc05lZ2F0aXZlID8gLXJlc3VsdCA6IHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBfaXNOZWdhdGl2ZSA/IF9taW5JbnQgOiBfbWF4SW50OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGlzIFtfQmlnSW50SW1wbF0gYXMgYSBbZG91YmxlXS4KICAgKgogICAqIElmIHRoZSBudW1iZXIgaXMgbm90IHJlcHJlc2VudGFibGUgYXMgYSBbZG91YmxlXSwgYW4KICAgKiBhcHByb3hpbWF0aW9uIGlzIHJldHVybmVkLiBGb3IgbnVtZXJpY2FsbHkgbGFyZ2UgaW50ZWdlcnMsIHRoZQogICAqIGFwcHJveGltYXRpb24gbWF5IGJlIGluZmluaXRlLgogICAqLwogIGRvdWJsZSB0b0RvdWJsZSgpIHsKICAgIGNvbnN0IGludCBleHBvbmVudEJpYXMgPSAxMDc1OwogICAgLy8gVGhlcmUgYXJlIDExIGJpdHMgZm9yIHRoZSBleHBvbmVudC4KICAgIC8vIDIwNDcgKGFsbCBiaXRzIHNldCB0byAxKSBpcyByZXNlcnZlZCBmb3IgaW5maW5pdHkgYW5kIE5hTi4KICAgIC8vIFdoZW4gc3RvcmluZyB0aGUgZXhwb25lbnQgaW4gdGhlIDExIGJpdHMsIGl0IGlzIGJpYXNlZCBieSBleHBvbmVudEJpYXMKICAgIC8vIHRvIHN1cHBvcnQgbmVnYXRpdmUgZXhwb25lbnRzLgogICAgY29uc3QgaW50IG1heERvdWJsZUV4cG9uZW50ID0gMjA0NiAtIGV4cG9uZW50QmlhczsKICAgIGlmIChfaXNaZXJvKSByZXR1cm4gMC4wOwoKICAgIC8vIFdlIGZpbGwgdGhlIDUzIGJpdHMgbGl0dGxlLWVuZGlhbi4KICAgIHZhciByZXN1bHRCaXRzID0gbmV3IFVpbnQ4TGlzdCg4KTsKCiAgICB2YXIgbGVuZ3RoID0gX2RpZ2l0Qml0cyAqIChfdXNlZCAtIDEpICsgX2RpZ2l0c1tfdXNlZCAtIDFdLmJpdExlbmd0aDsKICAgIGlmIChsZW5ndGggPiBtYXhEb3VibGVFeHBvbmVudCArIDUzKSB7CiAgICAgIHJldHVybiBfaXNOZWdhdGl2ZSA/IGRvdWJsZS5uZWdhdGl2ZUluZmluaXR5IDogZG91YmxlLmluZmluaXR5OwogICAgfQoKICAgIC8vIFRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyBmb3IgdGhlIHNpZ24uCiAgICBpZiAoX2lzTmVnYXRpdmUpIHJlc3VsdEJpdHNbN10gPSAweDgwOwoKICAgIC8vIFdyaXRlIHRoZSBleHBvbmVudCBpbnRvIGJpdHMgMS4uMTI6CiAgICB2YXIgYmlhc2VkRXhwb25lbnQgPSBsZW5ndGggLSA1MyArIGV4cG9uZW50QmlhczsKICAgIHJlc3VsdEJpdHNbNl0gPSAoYmlhc2VkRXhwb25lbnQgJiAweEYpIDw8IDQ7CiAgICByZXN1bHRCaXRzWzddIHw9IGJpYXNlZEV4cG9uZW50ID4+IDQ7CgogICAgaW50IGNhY2hlZEJpdHMgPSAwOwogICAgaW50IGNhY2hlZEJpdHNMZW5ndGggPSAwOwogICAgaW50IGRpZ2l0SW5kZXggPSBfdXNlZCAtIDE7CiAgICBpbnQgcmVhZEJpdHMoaW50IG4pIHsKICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBlbm91Z2ggYml0cyBpbiBbY2FjaGVkQml0c10uCiAgICAgIHdoaWxlIChjYWNoZWRCaXRzTGVuZ3RoIDwgbikgewogICAgICAgIGludCBuZXh0RGlnaXQ7CiAgICAgICAgaW50IG5leHREaWdpdExlbmd0aCA9IF9kaWdpdEJpdHM7IC8vIE1heSBnZXQgdXBkYXRlZC4KICAgICAgICBpZiAoZGlnaXRJbmRleCA8IDApIHsKICAgICAgICAgIG5leHREaWdpdCA9IDA7CiAgICAgICAgICBkaWdpdEluZGV4LS07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5leHREaWdpdCA9IF9kaWdpdHNbZGlnaXRJbmRleF07CiAgICAgICAgICBpZiAoZGlnaXRJbmRleCA9PSBfdXNlZCAtIDEpIG5leHREaWdpdExlbmd0aCA9IG5leHREaWdpdC5iaXRMZW5ndGg7CiAgICAgICAgICBkaWdpdEluZGV4LS07CiAgICAgICAgfQogICAgICAgIGNhY2hlZEJpdHMgPSAoY2FjaGVkQml0cyA8PCBuZXh0RGlnaXRMZW5ndGgpICsgbmV4dERpZ2l0OwogICAgICAgIGNhY2hlZEJpdHNMZW5ndGggKz0gbmV4dERpZ2l0TGVuZ3RoOwogICAgICB9CiAgICAgIC8vIFJlYWQgdGhlIHRvcCBbbl0gYml0cy4KICAgICAgdmFyIHJlc3VsdCA9IGNhY2hlZEJpdHMgPj4gKGNhY2hlZEJpdHNMZW5ndGggLSBuKTsKICAgICAgLy8gUmVtb3ZlIHRoZSBiaXRzIGZyb20gdGhlIGNhY2hlLgogICAgICBjYWNoZWRCaXRzIC09IHJlc3VsdCA8PCAoY2FjaGVkQml0c0xlbmd0aCAtIG4pOwogICAgICBjYWNoZWRCaXRzTGVuZ3RoIC09IG47CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLy8gVGhlIGZpcnN0IGxlYWRpbmcgMSBiaXQgaXMgaW1wbGljaXQgaW4gdGhlIGRvdWJsZS1yZXByZXNlbnRhdGlvbiBhbmQgY2FuCiAgICAvLyBiZSBkaXNjYXJkZWQuCiAgICB2YXIgbGVhZGluZ0JpdHMgPSByZWFkQml0cyg1KSAmIDB4RjsKICAgIHJlc3VsdEJpdHNbNl0gfD0gbGVhZGluZ0JpdHM7CgogICAgZm9yIChpbnQgaSA9IDU7IGkgPj0gMDsgaS0tKSB7CiAgICAgIC8vIEdldCB0aGUgcmVtYWluaW5nIDQ4IGJpdHMuCiAgICAgIHJlc3VsdEJpdHNbaV0gPSByZWFkQml0cyg4KTsKICAgIH0KCiAgICB2b2lkIHJvdW5kVXAoKSB7CiAgICAgIC8vIFNpbXBseSBjb25zaXN0cyBvZiBhZGRpbmcgMSB0byB0aGUgd2hvbGUgNjQgYml0ICJudW1iZXIiLgogICAgICAvLyBJdCB3aWxsIHVwZGF0ZSB0aGUgZXhwb25lbnQsIGlmIG5lY2Vzc2FyeS4KICAgICAgLy8gSXQgbWlnaHQgZXZlbiByb3VuZCB1cCB0byBpbmZpbml0eSAod2hpY2ggaXMgd2hhdCB3ZSB3YW50KS4KICAgICAgdmFyIGNhcnJ5ID0gMTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICBpZiAoY2FycnkgPT0gMCkgYnJlYWs7CiAgICAgICAgdmFyIHN1bSA9IHJlc3VsdEJpdHNbaV0gKyBjYXJyeTsKICAgICAgICByZXN1bHRCaXRzW2ldID0gc3VtICYgMHhGRjsKICAgICAgICBjYXJyeSA9IHN1bSA+PiA4OwogICAgICB9CiAgICB9CgogICAgaWYgKHJlYWRCaXRzKDEpID09IDEpIHsKICAgICAgaWYgKHJlc3VsdEJpdHNbMF0uaXNPZGQpIHsKICAgICAgICAvLyBSb3VuZHMgdG8gZXZlbiBhbGwgdGhlIHRpbWUuCiAgICAgICAgcm91bmRVcCgpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFJvdW5kIHVwLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3RoZXIgZGlnaXQgdGhhdCBpcyBub3QgMC4KICAgICAgICBpZiAoY2FjaGVkQml0cyAhPSAwKSB7CiAgICAgICAgICAvLyBUaGVyZSBpcyBhbHJlYWR5IG9uZSBpbiB0aGUgY2FjaGVkQml0cy4KICAgICAgICAgIHJvdW5kVXAoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9yIChpbnQgaSA9IGRpZ2l0SW5kZXg7IGRpZ2l0SW5kZXggPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIGlmIChfZGlnaXRzW2ldICE9IDApIHsKICAgICAgICAgICAgICByb3VuZFVwKCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHRCaXRzLmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0RmxvYXQ2NCgwLCBFbmRpYW4ubGl0dGxlKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBTdHJpbmctcmVwcmVzZW50YXRpb24gb2YgdGhpcyBpbnRlZ2VyLgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmluZyBpcyBwYXJzYWJsZSBieSBbcGFyc2VdLgogICAqIEZvciBhbnkgYF9CaWdJbnRJbXBsYCBgaWAsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdAogICAqIGBpID09IF9CaWdJbnRJbXBsLnBhcnNlKGkudG9TdHJpbmcoKSlgLgogICAqLwogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmIChfdXNlZCA9PSAwKSByZXR1cm4gIjAiOwogICAgaWYgKF91c2VkID09IDEpIHsKICAgICAgaWYgKF9pc05lZ2F0aXZlKSByZXR1cm4gKC1fZGlnaXRzWzBdKS50b1N0cmluZygpOwogICAgICByZXR1cm4gX2RpZ2l0c1swXS50b1N0cmluZygpOwogICAgfQoKICAgIC8vIEdlbmVyYXRlIGluIGNodW5rcyBvZiA5IGRpZ2l0cy4KICAgIC8vIFRoZSBjaHVua3MgYXJlIGluIHJldmVyc2VkIG9yZGVyLgogICAgdmFyIGRlY2ltYWxEaWdpdENodW5rcyA9IDxTdHJpbmc+W107CiAgICB2YXIgcmVzdCA9IGlzTmVnYXRpdmUgPyAtdGhpcyA6IHRoaXM7CiAgICB3aGlsZSAocmVzdC5fdXNlZCA+IDEpIHsKICAgICAgdmFyIGRpZ2l0czkgPSByZXN0LnJlbWFpbmRlcihfb25lQmlsbGlvbikudG9TdHJpbmcoKTsKICAgICAgZGVjaW1hbERpZ2l0Q2h1bmtzLmFkZChkaWdpdHM5KTsKICAgICAgdmFyIHplcm9zID0gOSAtIGRpZ2l0czkubGVuZ3RoOwogICAgICBpZiAoemVyb3MgPT0gOCkgewogICAgICAgIGRlY2ltYWxEaWdpdENodW5rcy5hZGQoIjAwMDAwMDAwIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHplcm9zID49IDQpIHsKICAgICAgICAgIHplcm9zIC09IDQ7CiAgICAgICAgICBkZWNpbWFsRGlnaXRDaHVua3MuYWRkKCIwMDAwIik7CiAgICAgICAgfQogICAgICAgIGlmICh6ZXJvcyA+PSAyKSB7CiAgICAgICAgICB6ZXJvcyAtPSAyOwogICAgICAgICAgZGVjaW1hbERpZ2l0Q2h1bmtzLmFkZCgiMDAiKTsKICAgICAgICB9CiAgICAgICAgaWYgKHplcm9zID49IDEpIHsKICAgICAgICAgIGRlY2ltYWxEaWdpdENodW5rcy5hZGQoIjAiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmVzdCA9IHJlc3Qgfi8gX29uZUJpbGxpb247CiAgICB9CiAgICBkZWNpbWFsRGlnaXRDaHVua3MuYWRkKHJlc3QuX2RpZ2l0c1swXS50b1N0cmluZygpKTsKICAgIGlmIChfaXNOZWdhdGl2ZSkgZGVjaW1hbERpZ2l0Q2h1bmtzLmFkZCgiLSIpOwogICAgcmV0dXJuIGRlY2ltYWxEaWdpdENodW5rcy5yZXZlcnNlZC5qb2luKCk7CiAgfQoKICBpbnQgX3RvUmFkaXhDb2RlVW5pdChpbnQgZGlnaXQpIHsKICAgIGNvbnN0IGludCBfMCA9IDQ4OwogICAgY29uc3QgaW50IF9hID0gOTc7CiAgICBpZiAoZGlnaXQgPCAxMCkgcmV0dXJuIF8wICsgZGlnaXQ7CiAgICByZXR1cm4gX2EgKyBkaWdpdCAtIDEwOwogIH0KCiAgLyoqCiAgICogQ29udmVydHMgW3RoaXNdIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluIHRoZSBnaXZlbiBbcmFkaXhdLgogICAqCiAgICogSW4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiwgbG93ZXItY2FzZSBsZXR0ZXJzIGFyZSB1c2VkIGZvciBkaWdpdHMgYWJvdmUKICAgKiAnOScsIHdpdGggJ2EnIGJlaW5nIDEwIGFuICd6JyBiZWluZyAzNS4KICAgKgogICAqIFRoZSBbcmFkaXhdIGFyZ3VtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgMiB0byAzNi4KICAgKi8KICBTdHJpbmcgdG9SYWRpeFN0cmluZyhpbnQgcmFkaXgpIHsKICAgIGlmIChyYWRpeCA+IDM2KSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShyYWRpeCwgMiwgMzYpOwoKICAgIGlmIChfdXNlZCA9PSAwKSByZXR1cm4gIjAiOwoKICAgIGlmIChfdXNlZCA9PSAxKSB7CiAgICAgIHZhciBkaWdpdFN0cmluZyA9IF9kaWdpdHNbMF0udG9SYWRpeFN0cmluZyhyYWRpeCk7CiAgICAgIGlmIChfaXNOZWdhdGl2ZSkgcmV0dXJuICItIiArIGRpZ2l0U3RyaW5nOwogICAgICByZXR1cm4gZGlnaXRTdHJpbmc7CiAgICB9CgogICAgaWYgKHJhZGl4ID09IDE2KSByZXR1cm4gX3RvSGV4U3RyaW5nKCk7CgogICAgdmFyIGJhc2UgPSBuZXcgX0JpZ0ludEltcGwuX2Zyb21JbnQocmFkaXgpOwogICAgdmFyIHJldmVyc2VkRGlnaXRDb2RlVW5pdHMgPSA8aW50PltdOwogICAgdmFyIHJlc3QgPSB0aGlzLmFicygpOwogICAgd2hpbGUgKCFyZXN0Ll9pc1plcm8pIHsKICAgICAgdmFyIGRpZ2l0ID0gcmVzdC5yZW1haW5kZXIoYmFzZSkudG9JbnQoKTsKICAgICAgcmVzdCA9IHJlc3Qgfi8gYmFzZTsKICAgICAgcmV2ZXJzZWREaWdpdENvZGVVbml0cy5hZGQoX3RvUmFkaXhDb2RlVW5pdChkaWdpdCkpOwogICAgfQogICAgdmFyIGRpZ2l0U3RyaW5nID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKHJldmVyc2VkRGlnaXRDb2RlVW5pdHMucmV2ZXJzZWQpOwogICAgaWYgKF9pc05lZ2F0aXZlKSByZXR1cm4gIi0iICsgZGlnaXRTdHJpbmc7CiAgICByZXR1cm4gZGlnaXRTdHJpbmc7CiAgfQoKICBTdHJpbmcgX3RvSGV4U3RyaW5nKCkgewogICAgdmFyIGNoYXJzID0gPGludD5bXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3VzZWQgLSAxOyBpKyspIHsKICAgICAgaW50IGNodW5rID0gX2RpZ2l0c1tpXTsKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAoX2RpZ2l0Qml0cyB+LyA0KTsgaisrKSB7CiAgICAgICAgY2hhcnMuYWRkKF90b1JhZGl4Q29kZVVuaXQoY2h1bmsgJiAweEYpKTsKICAgICAgICBjaHVuayA+Pj0gNDsKICAgICAgfQogICAgfQogICAgdmFyIG1zYkNodW5rID0gX2RpZ2l0c1tfdXNlZCAtIDFdOwogICAgd2hpbGUgKG1zYkNodW5rICE9IDApIHsKICAgICAgY2hhcnMuYWRkKF90b1JhZGl4Q29kZVVuaXQobXNiQ2h1bmsgJiAweEYpKTsKICAgICAgbXNiQ2h1bmsgPj49IDQ7CiAgICB9CiAgICBpZiAoX2lzTmVnYXRpdmUpIHsKICAgICAgY29uc3QgX2Rhc2ggPSA0NTsKICAgICAgY2hhcnMuYWRkKF9kYXNoKTsKICAgIH0KICAgIHJldHVybiBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoY2hhcnMucmV2ZXJzZWQpOwogIH0KfQoKLy8gSW50ZXJmYWNlIGZvciBtb2R1bGFyIHJlZHVjdGlvbi4KYWJzdHJhY3QgY2xhc3MgX0JpZ0ludFJlZHVjdGlvbiB7CiAgaW50IGdldCBfbm9ybU1vZHVsdXNVc2VkOwogIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB1c2VkIGJ5IHJlc3VsdERpZ2l0cy4KICBpbnQgX2NvbnZlcnQoX0JpZ0ludEltcGwgeCwgVWludDMyTGlzdCByZXN1bHREaWdpdHMpOwogIGludCBfbXVsKFVpbnQzMkxpc3QgeERpZ2l0cywgaW50IHhVc2VkLCBVaW50MzJMaXN0IHlEaWdpdHMsIGludCB5VXNlZCwKICAgICAgVWludDMyTGlzdCByZXN1bHREaWdpdHMpOwogIGludCBfc3FyKFVpbnQzMkxpc3QgeERpZ2l0cywgaW50IHhVc2VkLCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cyk7CgogIC8vIFJldHVybiB4IHJldmVydGVkIHRvIF9CaWdJbnRJbXBsLgogIF9CaWdJbnRJbXBsIF9yZXZlcnQoVWludDMyTGlzdCB4RGlnaXRzLCBpbnQgeFVzZWQpOwp9CgovLyBNb250Z29tZXJ5IHJlZHVjdGlvbiBvbiBfQmlnSW50SW1wbC4KY2xhc3MgX0JpZ0ludE1vbnRnb21lcnlSZWR1Y3Rpb24gaW1wbGVtZW50cyBfQmlnSW50UmVkdWN0aW9uIHsKICBmaW5hbCBfQmlnSW50SW1wbCBfbW9kdWx1czsKICBpbnQgX25vcm1Nb2R1bHVzVXNlZDsgLy8gRXZlbiBpZiBwcm9jZXNzaW5nIDY0LWJpdCAoZGlnaXQgcGFpcnMpLgogIFVpbnQzMkxpc3QgX21vZHVsdXNEaWdpdHM7CiAgVWludDMyTGlzdCBfYXJnczsKICBpbnQgX2RpZ2l0c1BlclN0ZXA7IC8vIE51bWJlciBvZiBkaWdpdHMgcHJvY2Vzc2VkIGluIG9uZSBzdGVwLiAxIG9yIDIuCiAgc3RhdGljIGNvbnN0IGludCBfeERpZ2l0ID0gMDsgLy8gSW5kZXggb2YgZGlnaXQgb2YgeC4KICBzdGF0aWMgY29uc3QgaW50IF94SGlnaERpZ2l0ID0gMTsgLy8gSW5kZXggb2YgaGlnaCBkaWdpdCBvZiB4ICg2NC1iaXQgb25seSkuCiAgc3RhdGljIGNvbnN0IGludCBfcmhvRGlnaXQgPSAyOyAvLyBJbmRleCBvZiBkaWdpdCBvZiByaG8uCiAgc3RhdGljIGNvbnN0IGludCBfcmhvSGlnaERpZ2l0ID0gMzsgLy8gSW5kZXggb2YgaGlnaCBkaWdpdCBvZiByaG8gKDY0LWJpdCkuCiAgc3RhdGljIGNvbnN0IGludCBfbXVEaWdpdCA9IDQ7IC8vIEluZGV4IG9mIG11LgogIHN0YXRpYyBjb25zdCBpbnQgX211SGlnaERpZ2l0ID0gNTsgLy8gSW5kZXggb2YgaGlnaCAzMi1iaXRzIG9mIG11ICg2NC1iaXQpLgoKICBfQmlnSW50TW9udGdvbWVyeVJlZHVjdGlvbih0aGlzLl9tb2R1bHVzKSB7CiAgICBfbW9kdWx1c0RpZ2l0cyA9IF9tb2R1bHVzLl9kaWdpdHM7CiAgICBfYXJncyA9IF9uZXdEaWdpdHMoNik7CiAgICAvLyBEZXRlcm1pbmUgaWYgd2UgY2FuIHByb2Nlc3MgZGlnaXQgcGFpcnMgYnkgY2FsbGluZyBhbiBpbnRyaW5zaWMuCiAgICBfZGlnaXRzUGVyU3RlcCA9IF9tdWxNb2QoX2FyZ3MsIF9hcmdzLCAwKTsKICAgIF9hcmdzW194RGlnaXRdID0gX21vZHVsdXNEaWdpdHNbMF07CiAgICBpZiAoX2RpZ2l0c1BlclN0ZXAgPT0gMSkgewogICAgICBfbm9ybU1vZHVsdXNVc2VkID0gX21vZHVsdXMuX3VzZWQ7CiAgICAgIF9pbnZEaWdpdChfYXJncyk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoX2RpZ2l0c1BlclN0ZXAgPT0gMik7CiAgICAgIF9ub3JtTW9kdWx1c1VzZWQgPSBfbW9kdWx1cy5fdXNlZCArIChfbW9kdWx1cy5fdXNlZCAmIDEpOwogICAgICBfYXJnc1tfeEhpZ2hEaWdpdF0gPSBfbW9kdWx1c0RpZ2l0c1sxXTsKICAgICAgX2ludkRpZ2l0UGFpcihfYXJncyk7CiAgICB9CiAgfQoKICAvLyBDYWxjdWxhdGVzIC0xL3ggJSBfZGlnaXRCYXNlLCB4IGlzIDMyLWJpdCBkaWdpdC4KICAvLyAgICAgICAgIHh5ID09IDEgKG1vZCBtKQogIC8vICAgICAgICAgeHkgPSAgMStrbQogIC8vICAgeHkoMi14eSkgPSAoMStrbSkoMS1rbSkKICAvLyB4KHkoMi14eSkpID0gMS1rXjIgbV4yCiAgLy8geCh5KDIteHkpKSA9PSAxIChtb2QgbV4yKQogIC8vIGlmIHkgaXMgMS94IG1vZCBtLCB0aGVuIHkoMi14eSkgaXMgMS94IG1vZCBtXjIKICAvLyBTaG91bGQgcmVkdWNlIHggYW5kIHkoMi14eSkgYnkgbV4yIGF0IGVhY2ggc3RlcCB0byBrZWVwIHNpemUgYm91bmRlZC4KICAvLwogIC8vIE9wZXJhdGlvbjoKICAvLyAgIGFyZ3NbX3Job0RpZ2l0XSA9IDEvYXJnc1tfeERpZ2l0XSBtb2QgX2RpZ2l0QmFzZS4KICBzdGF0aWMgdm9pZCBfaW52RGlnaXQoVWludDMyTGlzdCBhcmdzKSB7CiAgICB2YXIgeCA9IGFyZ3NbX3hEaWdpdF07CiAgICB2YXIgeSA9IHggJiAzOyAvLyB5ID09IDEveCBtb2QgMl4yCiAgICB5ID0gKHkgKiAoMiAtICh4ICYgMHhmKSAqIHkpKSAmIDB4ZjsgLy8geSA9PSAxL3ggbW9kIDJeNAogICAgeSA9ICh5ICogKDIgLSAoeCAmIDB4ZmYpICogeSkpICYgMHhmZjsgLy8geSA9PSAxL3ggbW9kIDJeOAogICAgeSA9ICh5ICogKDIgLSAoKCh4ICYgMHhmZmZmKSAqIHkpICYgMHhmZmZmKSkpICYgMHhmZmZmOyAvLyB5ID09IDEveCBtb2QgMl4xNgogICAgeSA9ICh5ICogKDIgLSB4ICogeSAlIF9CaWdJbnRJbXBsLl9kaWdpdEJhc2UpKSAlIF9CaWdJbnRJbXBsLl9kaWdpdEJhc2U7CiAgICAvLyB5ID09IDEveCBtb2QgX2RpZ2l0QmFzZQogICAgeSA9IC15OyAvLyBXZSByZWFsbHkgd2FudCB0aGUgbmVnYXRpdmUgaW52ZXJzZS4KICAgIGFyZ3NbX3Job0RpZ2l0XSA9IHkgJiBfQmlnSW50SW1wbC5fZGlnaXRNYXNrOwogICAgYXNzZXJ0KCgoeCAqIHkpICYgX0JpZ0ludEltcGwuX2RpZ2l0TWFzaykgPT0gX0JpZ0ludEltcGwuX2RpZ2l0TWFzayk7CiAgfQoKICAvLyBDYWxjdWxhdGVzIC0xL3ggJSBfZGlnaXRCYXNlXjIsIHggaXMgYSBwYWlyIG9mIDMyLWJpdCBkaWdpdHMuCiAgLy8gT3BlcmF0aW9uOgogIC8vICAgYXJnc1tfcmhvRGlnaXQuLl9yaG9IaWdoRGlnaXRdID0KICAvLyAgICAgMS9hcmdzW194RGlnaXQuLl94SGlnaERpZ2l0XSBtb2QgX2RpZ2l0QmFzZV4yLgogIHN0YXRpYyB2b2lkIF9pbnZEaWdpdFBhaXIoVWludDMyTGlzdCBhcmdzKSB7CiAgICB2YXIgeGwgPSBhcmdzW194RGlnaXRdOyAvLyBMb3dlciAzMi1iaXQgZGlnaXQgb2YgeC4KICAgIHZhciB5ID0geGwgJiAzOyAvLyB5ID09IDEveCBtb2QgMl4yCiAgICB5ID0gKHkgKiAoMiAtICh4bCAmIDB4ZikgKiB5KSkgJiAweGY7IC8vIHkgPT0gMS94IG1vZCAyXjQKICAgIHkgPSAoeSAqICgyIC0gKHhsICYgMHhmZikgKiB5KSkgJiAweGZmOyAvLyB5ID09IDEveCBtb2QgMl44CiAgICB5ID0gKHkgKiAoMiAtICgoKHhsICYgMHhmZmZmKSAqIHkpICYgMHhmZmZmKSkpICYgMHhmZmZmOwogICAgLy8geSA9PSAxL3ggbW9kIDJeMTYKICAgIHkgPSAoeSAqICgyIC0gKCh4bCAqIHkpICYgMHhmZmZmZmZmZikpKSAmIDB4ZmZmZmZmZmY7IC8vIHkgPT0gMS94IG1vZCAyXjMyCiAgICB2YXIgeCA9IChhcmdzW194SGlnaERpZ2l0XSA8PCBfQmlnSW50SW1wbC5fZGlnaXRCaXRzKSB8IHhsOwogICAgeSAqPSAyIC0geCAqIHk7IC8vIE1hc2tpbmcgd2l0aCAyXjY0LTEgaXMgaW1wbGllZCBieSA2NC1iaXQgYXJpdGhtZXRpYy4KICAgIC8vIHkgPT0gMS94IG1vZCBfZGlnaXRCYXNlXjIKICAgIHkgPSAteTsgLy8gV2UgcmVhbGx5IHdhbnQgdGhlIG5lZ2F0aXZlIGludmVyc2UuCiAgICBhcmdzW19yaG9EaWdpdF0gPSB5ICYgX0JpZ0ludEltcGwuX2RpZ2l0TWFzazsKICAgIGFyZ3NbX3Job0hpZ2hEaWdpdF0gPQogICAgICAgICh5ID4+IF9CaWdJbnRJbXBsLl9kaWdpdEJpdHMpICYgX0JpZ0ludEltcGwuX2RpZ2l0TWFzazsKICAgIGFzc2VydCh4ICogeSA9PSAtMSk7CiAgfQoKICAvLyBPcGVyYXRpb246CiAgLy8gICBhcmdzW19tdURpZ2l0XSA9IGFyZ3NbX3Job0RpZ2l0XSpkaWdpdHNbaV0gbW9kIF9kaWdpdEJhc2UuCiAgLy8gICBSZXR1cm5zIDEuCiAgLy8gTm90ZTogSW50cmluc2ljcyBvbiA2NC1iaXQgcGxhdGZvcm1zIHByb2Nlc3MgZGlnaXQgcGFpcnMgYXQgZXZlbiBpbmRpY2VzOgogIC8vICAgYXJnc1tfbXVEaWdpdC4uX211SGlnaERpZ2l0XSA9CiAgLy8gICAgIGFyZ3NbX3Job0RpZ2l0Li5fcmhvSGlnaERpZ2l0XSAqIGRpZ2l0c1tpLi5pKzFdIG1vZCBfZGlnaXRCYXNlXjIuCiAgLy8gICBSZXR1cm5zIDIuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIEBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCiAgc3RhdGljIGludCBfbXVsTW9kKFVpbnQzMkxpc3QgYXJncywgVWludDMyTGlzdCBkaWdpdHMsIGludCBpKSB7CiAgICB2YXIgcmhvbCA9IGFyZ3NbX3Job0RpZ2l0XSAmIF9CaWdJbnRJbXBsLl9oYWxmRGlnaXRNYXNrOwogICAgdmFyIHJob2ggPSBhcmdzW19yaG9EaWdpdF0gPj4gX0JpZ0ludEltcGwuX2hhbGZEaWdpdEJpdHM7CiAgICB2YXIgZGggPSBkaWdpdHNbaV0gPj4gX0JpZ0ludEltcGwuX2hhbGZEaWdpdEJpdHM7CiAgICB2YXIgZGwgPSBkaWdpdHNbaV0gJiBfQmlnSW50SW1wbC5faGFsZkRpZ2l0TWFzazsKICAgIGFyZ3NbX211RGlnaXRdID0gKGRsICogcmhvbCArCiAgICAgICAgICAgICgoKGRsICogcmhvaCArIGRoICogcmhvbCkgJiBfQmlnSW50SW1wbC5faGFsZkRpZ2l0TWFzaykgPDwKICAgICAgICAgICAgICAgIF9CaWdJbnRJbXBsLl9oYWxmRGlnaXRCaXRzKSkgJgogICAgICAgIF9CaWdJbnRJbXBsLl9kaWdpdE1hc2s7CiAgICByZXR1cm4gMTsKICB9CgogIC8vIHJlc3VsdCA9IHgqUiBtb2QgX21vZHVsdXMuCiAgLy8gUmV0dXJucyByZXN1bHRVc2VkLgogIGludCBfY29udmVydChfQmlnSW50SW1wbCB4LCBVaW50MzJMaXN0IHJlc3VsdERpZ2l0cykgewogICAgLy8gTW9udGdvbWVyeSByZWR1Y3Rpb24gb25seSB3b3JrcyBpZiBhYnMoeCkgPCBfbW9kdWx1cy4KICAgIGFzc2VydCh4LmFicygpIDwgX21vZHVsdXMpOwogICAgYXNzZXJ0KF9kaWdpdHNQZXJTdGVwID09IDEgfHwgX25vcm1Nb2R1bHVzVXNlZC5pc0V2ZW4pOwogICAgdmFyIHJlc3VsdCA9IHguYWJzKCkuX2RsU2hpZnQoX25vcm1Nb2R1bHVzVXNlZCkuX3JlbShfbW9kdWx1cyk7CiAgICBpZiAoeC5faXNOZWdhdGl2ZSAmJiAhcmVzdWx0Ll9pc05lZ2F0aXZlICYmIHJlc3VsdC5fdXNlZCA+IDApIHsKICAgICAgcmVzdWx0ID0gX21vZHVsdXMgLSByZXN1bHQ7CiAgICB9CiAgICB2YXIgdXNlZCA9IHJlc3VsdC5fdXNlZDsKICAgIHZhciBkaWdpdHMgPSByZXN1bHQuX2RpZ2l0czsKICAgIHZhciBpID0gdXNlZCArICh1c2VkICYgMSk7CiAgICB3aGlsZSAoLS1pID49IDApIHsKICAgICAgcmVzdWx0RGlnaXRzW2ldID0gZGlnaXRzW2ldOwogICAgfQogICAgcmV0dXJuIHVzZWQ7CiAgfQoKICBfQmlnSW50SW1wbCBfcmV2ZXJ0KFVpbnQzMkxpc3QgeERpZ2l0cywgaW50IHhVc2VkKSB7CiAgICAvLyBSZXNlcnZlIGVub3VnaCBkaWdpdHMgZm9yIG1vZHVsdXMgc3F1YXJpbmcgYW5kIGFjY3VtdWxhdG9yIGNhcnJ5LgogICAgdmFyIHJlc3VsdERpZ2l0cyA9IF9uZXdEaWdpdHMoMiAqIF9ub3JtTW9kdWx1c1VzZWQgKyAyKTsKICAgIHZhciBpID0geFVzZWQgKyAoeFVzZWQgJiAxKTsKICAgIHdoaWxlICgtLWkgPj0gMCkgewogICAgICByZXN1bHREaWdpdHNbaV0gPSB4RGlnaXRzW2ldOwogICAgfQogICAgdmFyIHJlc3VsdFVzZWQgPSBfcmVkdWNlKHJlc3VsdERpZ2l0cywgeFVzZWQpOwogICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKGZhbHNlLCByZXN1bHRVc2VkLCByZXN1bHREaWdpdHMpOwogIH0KCiAgLy8geCA9IHgvUiBtb2QgX21vZHVsdXMuCiAgLy8gUmV0dXJucyB4VXNlZC4KICBpbnQgX3JlZHVjZShVaW50MzJMaXN0IHhEaWdpdHMsIGludCB4VXNlZCkgewogICAgd2hpbGUgKHhVc2VkIDwgMiAqIF9ub3JtTW9kdWx1c1VzZWQgKyAyKSB7CiAgICAgIC8vIFBhZCB4IHNvIF9tdWxBZGQgaGFzIGVub3VnaCByb29tIGxhdGVyIGZvciBhIHBvc3NpYmxlIGNhcnJ5LgogICAgICB4RGlnaXRzW3hVc2VkKytdID0gMDsKICAgIH0KICAgIHZhciBpID0gMDsKICAgIHdoaWxlIChpIDwgX25vcm1Nb2R1bHVzVXNlZCkgewogICAgICB2YXIgZCA9IF9tdWxNb2QoX2FyZ3MsIHhEaWdpdHMsIGkpOwogICAgICBhc3NlcnQoZCA9PSBfZGlnaXRzUGVyU3RlcCk7CiAgICAgIGQgPSBfQmlnSW50SW1wbC5fbXVsQWRkKAogICAgICAgICAgX2FyZ3MsIF9tdURpZ2l0LCBfbW9kdWx1c0RpZ2l0cywgMCwgeERpZ2l0cywgaSwgX25vcm1Nb2R1bHVzVXNlZCk7CiAgICAgIGFzc2VydChkID09IF9kaWdpdHNQZXJTdGVwKTsKICAgICAgaSArPSBkOwogICAgfQogICAgLy8gQ2xhbXAgeC4KICAgIHdoaWxlICh4VXNlZCA+IDAgJiYgeERpZ2l0c1t4VXNlZCAtIDFdID09IDApIHsKICAgICAgLS14VXNlZDsKICAgIH0KICAgIHhVc2VkID0gX0JpZ0ludEltcGwuX2RyU2hpZnREaWdpdHMoeERpZ2l0cywgeFVzZWQsIGksIHhEaWdpdHMpOwogICAgaWYgKF9CaWdJbnRJbXBsLl9jb21wYXJlRGlnaXRzKAogICAgICAgICAgICB4RGlnaXRzLCB4VXNlZCwgX21vZHVsdXNEaWdpdHMsIF9ub3JtTW9kdWx1c1VzZWQpID49CiAgICAgICAgMCkgewogICAgICBfQmlnSW50SW1wbC5fYWJzU3ViKAogICAgICAgICAgeERpZ2l0cywgeFVzZWQsIF9tb2R1bHVzRGlnaXRzLCBfbm9ybU1vZHVsdXNVc2VkLCB4RGlnaXRzKTsKICAgIH0KICAgIC8vIENsYW1wIHguCiAgICB3aGlsZSAoeFVzZWQgPiAwICYmIHhEaWdpdHNbeFVzZWQgLSAxXSA9PSAwKSB7CiAgICAgIC0teFVzZWQ7CiAgICB9CiAgICByZXR1cm4geFVzZWQ7CiAgfQoKICBpbnQgX3NxcihVaW50MzJMaXN0IHhEaWdpdHMsIGludCB4VXNlZCwgVWludDMyTGlzdCByZXN1bHREaWdpdHMpIHsKICAgIHZhciByZXN1bHRVc2VkID0gX0JpZ0ludEltcGwuX3NxckRpZ2l0cyh4RGlnaXRzLCB4VXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgIHJldHVybiBfcmVkdWNlKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCk7CiAgfQoKICBpbnQgX211bChVaW50MzJMaXN0IHhEaWdpdHMsIGludCB4VXNlZCwgVWludDMyTGlzdCB5RGlnaXRzLCBpbnQgeVVzZWQsCiAgICAgIFVpbnQzMkxpc3QgcmVzdWx0RGlnaXRzKSB7CiAgICB2YXIgcmVzdWx0VXNlZCA9CiAgICAgICAgX0JpZ0ludEltcGwuX211bERpZ2l0cyh4RGlnaXRzLCB4VXNlZCwgeURpZ2l0cywgeVVzZWQsIHJlc3VsdERpZ2l0cyk7CiAgICByZXR1cm4gX3JlZHVjZShyZXN1bHREaWdpdHMsIHJlc3VsdFVzZWQpOwogIH0KfQoKLy8gTW9kdWxhciByZWR1Y3Rpb24gdXNpbmcgImNsYXNzaWMiIGFsZ29yaXRobS4KY2xhc3MgX0JpZ0ludENsYXNzaWNSZWR1Y3Rpb24gaW1wbGVtZW50cyBfQmlnSW50UmVkdWN0aW9uIHsKICBmaW5hbCBfQmlnSW50SW1wbCBfbW9kdWx1czsgLy8gTW9kdWx1cy4KICBpbnQgX25vcm1Nb2R1bHVzVXNlZDsKICBfQmlnSW50SW1wbCBfbm9ybU1vZHVsdXM7IC8vIE5vcm1hbGl6ZWQgX21vZHVsdXMuCiAgVWludDMyTGlzdCBfbm9ybU1vZHVsdXNEaWdpdHM7CiAgVWludDMyTGlzdCBfbmVnTm9ybU1vZHVsdXNEaWdpdHM7IC8vIE5lZ2F0ZWQgX25vcm1Nb2R1bHVzIGRpZ2l0cy4KICBpbnQgX21vZHVsdXNOc2g7IC8vIE5vcm1hbGl6YXRpb24gc2hpZnQgYW1vdW50LgogIFVpbnQzMkxpc3QgX2FyZ3M7IC8vIFRvcCBfbm9ybU1vZHVsdXMgZGlnaXQocykgYW5kIHBsYWNlIGhvbGRlciBmb3IgZXN0aW1hdGVkCiAgLy8gcXVvdGllbnQgZGlnaXQocykuCiAgVWludDMyTGlzdCBfdG1wRGlnaXRzOyAvLyBUZW1wb3JhcnkgZGlnaXRzIHVzZWQgZHVyaW5nIHJlZHVjdGlvbi4KCiAgX0JpZ0ludENsYXNzaWNSZWR1Y3Rpb24odGhpcy5fbW9kdWx1cykgewogICAgLy8gUHJlcHJvY2VzcyBhcmd1bWVudHMgdG8gX3JlbURpZ2l0cy4KICAgIHZhciBuc2ggPQogICAgICAgIF9CaWdJbnRJbXBsLl9kaWdpdEJpdHMgLSBfbW9kdWx1cy5fZGlnaXRzW19tb2R1bHVzLl91c2VkIC0gMV0uYml0TGVuZ3RoOwogICAgLy8gRm9yIDY0LWJpdCBwcm9jZXNzaW5nLCBtYWtlIHN1cmUgX25lZ05vcm1Nb2R1bHVzRGlnaXRzIGhhcyBhbiBldmVuIG51bWJlcgogICAgLy8gb2YgZGlnaXRzLgogICAgaWYgKF9tb2R1bHVzLl91c2VkLmlzT2RkKSB7CiAgICAgIG5zaCArPSBfQmlnSW50SW1wbC5fZGlnaXRCaXRzOwogICAgfQogICAgX21vZHVsdXNOc2ggPSBuc2g7CiAgICBfbm9ybU1vZHVsdXMgPSBfbW9kdWx1cyA8PCBuc2g7CiAgICBfbm9ybU1vZHVsdXNVc2VkID0gX25vcm1Nb2R1bHVzLl91c2VkOwogICAgX25vcm1Nb2R1bHVzRGlnaXRzID0gX25vcm1Nb2R1bHVzLl9kaWdpdHM7CiAgICBhc3NlcnQoX25vcm1Nb2R1bHVzVXNlZC5pc0V2ZW4pOwogICAgX2FyZ3MgPSBfbmV3RGlnaXRzKDQpOwogICAgX2FyZ3NbX0JpZ0ludEltcGwuX2Rpdmlzb3JMb3dUb3BEaWdpdF0gPQogICAgICAgIF9ub3JtTW9kdWx1c0RpZ2l0c1tfbm9ybU1vZHVsdXNVc2VkIC0gMl07CiAgICBfYXJnc1tfQmlnSW50SW1wbC5fZGl2aXNvclRvcERpZ2l0XSA9CiAgICAgICAgX25vcm1Nb2R1bHVzRGlnaXRzW19ub3JtTW9kdWx1c1VzZWQgLSAxXTsKICAgIC8vIE5lZ2F0ZSBfbm9ybU1vZHVsdXMgc28gd2UgY2FuIHVzZSBfbXVsQWRkIGluc3RlYWQgb2YKICAgIC8vIHVuaW1wbGVtZW50ZWQgIF9tdWxTdWIuCiAgICB2YXIgbmVnTm9ybU1vZHVsdXMgPQogICAgICAgIF9CaWdJbnRJbXBsLm9uZS5fZGxTaGlmdChfbm9ybU1vZHVsdXNVc2VkKSAtIF9ub3JtTW9kdWx1czsKICAgIGlmIChuZWdOb3JtTW9kdWx1cy5fdXNlZCA8IF9ub3JtTW9kdWx1c1VzZWQpIHsKICAgICAgX25lZ05vcm1Nb2R1bHVzRGlnaXRzID0gX0JpZ0ludEltcGwuX2Nsb25lRGlnaXRzKAogICAgICAgICAgbmVnTm9ybU1vZHVsdXMuX2RpZ2l0cywgMCwgX25vcm1Nb2R1bHVzVXNlZCwgX25vcm1Nb2R1bHVzVXNlZCk7CiAgICB9IGVsc2UgewogICAgICBfbmVnTm9ybU1vZHVsdXNEaWdpdHMgPSBuZWdOb3JtTW9kdWx1cy5fZGlnaXRzOwogICAgfQogICAgLy8gX25lZ05vcm1Nb2R1bHVzRGlnaXRzIGlzIHJlYWQtb25seSBhbmQgaGFzIF9ub3JtTW9kdWx1c1VzZWQgZGlnaXRzIChwb3NzaWJseQogICAgLy8gaW5jbHVkaW5nIHNldmVyYWwgbGVhZGluZyB6ZXJvcykgcGx1cyBhIGxlYWRpbmcgemVybyBmb3IgNjQtYml0CiAgICAvLyBwcm9jZXNzaW5nLgogICAgX3RtcERpZ2l0cyA9IF9uZXdEaWdpdHMoMiAqIF9ub3JtTW9kdWx1c1VzZWQpOwogIH0KCiAgaW50IF9jb252ZXJ0KF9CaWdJbnRJbXBsIHgsIFVpbnQzMkxpc3QgcmVzdWx0RGlnaXRzKSB7CiAgICB2YXIgZGlnaXRzOwogICAgdmFyIHVzZWQ7CiAgICBpZiAoeC5faXNOZWdhdGl2ZSB8fCB4Ll9hYnNDb21wYXJlKF9tb2R1bHVzKSA+PSAwKSB7CiAgICAgIHZhciByZW1haW5kZXIgPSB4Ll9yZW0oX21vZHVsdXMpOwogICAgICBpZiAoeC5faXNOZWdhdGl2ZSAmJiByZW1haW5kZXIuX3VzZWQgPiAwKSB7CiAgICAgICAgYXNzZXJ0KHJlbWFpbmRlci5faXNOZWdhdGl2ZSk7CiAgICAgICAgcmVtYWluZGVyICs9IF9tb2R1bHVzOwogICAgICB9CiAgICAgIGFzc2VydCghcmVtYWluZGVyLl9pc05lZ2F0aXZlKTsKICAgICAgdXNlZCA9IHJlbWFpbmRlci5fdXNlZDsKICAgICAgZGlnaXRzID0gcmVtYWluZGVyLl9kaWdpdHM7CiAgICB9IGVsc2UgewogICAgICB1c2VkID0geC5fdXNlZDsKICAgICAgZGlnaXRzID0geC5fZGlnaXRzOwogICAgfQogICAgdmFyIGkgPSB1c2VkICsgKHVzZWQgJiAxKTsgLy8gQ29weSBsZWFkaW5nIHplcm8gaWYgYW55LgogICAgd2hpbGUgKC0taSA+PSAwKSB7CiAgICAgIHJlc3VsdERpZ2l0c1tpXSA9IGRpZ2l0c1tpXTsKICAgIH0KICAgIHJldHVybiB1c2VkOwogIH0KCiAgX0JpZ0ludEltcGwgX3JldmVydChVaW50MzJMaXN0IHhEaWdpdHMsIGludCB4VXNlZCkgewogICAgcmV0dXJuIG5ldyBfQmlnSW50SW1wbC5fKGZhbHNlLCB4VXNlZCwgeERpZ2l0cyk7CiAgfQoKICBpbnQgX3JlZHVjZShVaW50MzJMaXN0IHhEaWdpdHMsIGludCB4VXNlZCkgewogICAgaWYgKHhVc2VkIDwgX21vZHVsdXMuX3VzZWQpIHsKICAgICAgcmV0dXJuIHhVc2VkOwogICAgfQogICAgLy8gVGhlIGZ1bmN0aW9uIF9CaWdJbnRJbXBsLl9yZW1EaWdpdHMoLi4uKSBpcyBvcHRpbWl6ZWQgZm9yIHJlZHVjdGlvbiBhbmQKICAgIC8vIGVxdWl2YWxlbnQgdG8gY2FsbGluZwogICAgLy8gJ2NvbnZlcnQocmV2ZXJ0KHhEaWdpdHMsIHhVc2VkKS5fcmVtKF9ub3JtTW9kdWx1cyksIHhEaWdpdHMpOycKICAgIHJldHVybiBfQmlnSW50SW1wbC5fcmVtRGlnaXRzKAogICAgICAgIHhEaWdpdHMsCiAgICAgICAgeFVzZWQsCiAgICAgICAgX25vcm1Nb2R1bHVzRGlnaXRzLAogICAgICAgIF9ub3JtTW9kdWx1c1VzZWQsCiAgICAgICAgX25lZ05vcm1Nb2R1bHVzRGlnaXRzLAogICAgICAgIF9tb2R1bHVzTnNoLAogICAgICAgIF9hcmdzLAogICAgICAgIF90bXBEaWdpdHMsCiAgICAgICAgeERpZ2l0cyk7CiAgfQoKICBpbnQgX3NxcihVaW50MzJMaXN0IHhEaWdpdHMsIGludCB4VXNlZCwgVWludDMyTGlzdCByZXN1bHREaWdpdHMpIHsKICAgIHZhciByZXN1bHRVc2VkID0gX0JpZ0ludEltcGwuX3NxckRpZ2l0cyh4RGlnaXRzLCB4VXNlZCwgcmVzdWx0RGlnaXRzKTsKICAgIHJldHVybiBfcmVkdWNlKHJlc3VsdERpZ2l0cywgcmVzdWx0VXNlZCk7CiAgfQoKICBpbnQgX211bChVaW50MzJMaXN0IHhEaWdpdHMsIGludCB4VXNlZCwgVWludDMyTGlzdCB5RGlnaXRz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RG91YmxlX2hhc2hDb2RlIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRG91YmxlKQogIEBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCiAgZG91YmxlIG9wZXJhdG9yICsobnVtIG90aGVyKSB7CiAgICByZXR1cm4gX2FkZChvdGhlci50b0RvdWJsZSgpKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgX2FkZChkb3VibGUgb3RoZXIpIG5hdGl2ZSAiRG91YmxlX2FkZCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBAcHJhZ21hKCJ2bTpuZXZlci1pbmxpbmUiKQogIGRvdWJsZSBvcGVyYXRvciAtKG51bSBvdGhlcikgewogICAgcmV0dXJuIF9zdWIob3RoZXIudG9Eb3VibGUoKSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgZG91YmxlIF9zdWIoZG91YmxlIG90aGVyKSBuYXRpdmUgIkRvdWJsZV9zdWIiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgQHByYWdtYSgidm06bmV2ZXItaW5saW5lIikKICBkb3VibGUgb3BlcmF0b3IgKihudW0gb3RoZXIpIHsKICAgIHJldHVybiBfbXVsKG90aGVyLnRvRG91YmxlKCkpOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRG91YmxlKQogIGRvdWJsZSBfbXVsKGRvdWJsZSBvdGhlcikgbmF0aXZlICJEb3VibGVfbXVsIjsKCiAgaW50IG9wZXJhdG9yIH4vKG51bSBvdGhlcikgewogICAgcmV0dXJuIF90cnVuY19kaXYob3RoZXIudG9Eb3VibGUoKSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBfdHJ1bmNfZGl2KGRvdWJsZSBvdGhlcikgbmF0aXZlICJEb3VibGVfdHJ1bmNfZGl2IjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRG91YmxlKQogIEBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCiAgZG91YmxlIG9wZXJhdG9yIC8obnVtIG90aGVyKSB7CiAgICByZXR1cm4gX2RpdihvdGhlci50b0RvdWJsZSgpKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgX2Rpdihkb3VibGUgb3RoZXIpIG5hdGl2ZSAiRG91YmxlX2RpdiI7CgogIGRvdWJsZSBvcGVyYXRvciAlKG51bSBvdGhlcikgewogICAgcmV0dXJuIF9tb2R1bG8ob3RoZXIudG9Eb3VibGUoKSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgZG91YmxlIF9tb2R1bG8oZG91YmxlIG90aGVyKSBuYXRpdmUgIkRvdWJsZV9tb2R1bG8iOwoKICBkb3VibGUgcmVtYWluZGVyKG51bSBvdGhlcikgewogICAgcmV0dXJuIF9yZW1haW5kZXIob3RoZXIudG9Eb3VibGUoKSk7CiAgfQoKICBkb3VibGUgX3JlbWFpbmRlcihkb3VibGUgb3RoZXIpIG5hdGl2ZSAiRG91YmxlX3JlbWFpbmRlciI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgb3BlcmF0b3IgLSgpIG5hdGl2ZSAiRG91YmxlX2ZsaXBTaWduQml0IjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIEBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIHJldHVybiAob3RoZXIgaXMgbnVtKSAmJiBfZXF1YWwob3RoZXIudG9Eb3VibGUoKSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBfZXF1YWwoZG91YmxlIG90aGVyKSBuYXRpdmUgIkRvdWJsZV9lcXVhbCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgX2VxdWFsVG9JbnRlZ2VyKGludCBvdGhlcikgbmF0aXZlICJEb3VibGVfZXF1YWxUb0ludGVnZXIiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgQHByYWdtYSgidm06bmV2ZXItaW5saW5lIikKICBib29sIG9wZXJhdG9yIDwobnVtIG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIgPiB0aGlzOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIEBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCiAgYm9vbCBvcGVyYXRvciA+KG51bSBvdGhlcikgewogICAgcmV0dXJuIF9ncmVhdGVyVGhhbihvdGhlci50b0RvdWJsZSgpKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIF9ncmVhdGVyVGhhbihkb3VibGUgb3RoZXIpIG5hdGl2ZSAiRG91YmxlX2dyZWF0ZXJUaGFuIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIEBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCiAgYm9vbCBvcGVyYXRvciA+PShudW0gb3RoZXIpIHsKICAgIHJldHVybiAodGhpcyA9PSBvdGhlcikgfHwgKHRoaXMgPiBvdGhlcik7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgQHByYWdtYSgidm06bmV2ZXItaW5saW5lIikKICBib29sIG9wZXJhdG9yIDw9KG51bSBvdGhlcikgewogICAgcmV0dXJuICh0aGlzID09IG90aGVyKSB8fCAodGhpcyA8IG90aGVyKTsKICB9CgogIGRvdWJsZSBfYWRkRnJvbUludGVnZXIoaW50IG90aGVyKSB7CiAgICByZXR1cm4gbmV3IF9Eb3VibGUuZnJvbUludGVnZXIob3RoZXIpLl9hZGQodGhpcyk7CiAgfQoKICBkb3VibGUgX3N1YkZyb21JbnRlZ2VyKGludCBvdGhlcikgewogICAgcmV0dXJuIG5ldyBfRG91YmxlLmZyb21JbnRlZ2VyKG90aGVyKS5fc3ViKHRoaXMpOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQogIGRvdWJsZSBfbXVsRnJvbUludGVnZXIoaW50IG90aGVyKSB7CiAgICByZXR1cm4gbmV3IF9Eb3VibGUuZnJvbUludGVnZXIob3RoZXIpLl9tdWwodGhpcyk7CiAgfQoKICBpbnQgX3RydW5jRGl2RnJvbUludGVnZXIoaW50IG90aGVyKSB7CiAgICByZXR1cm4gbmV3IF9Eb3VibGUuZnJvbUludGVnZXIob3RoZXIpLl90cnVuY19kaXYodGhpcyk7CiAgfQoKICBkb3VibGUgX21vZHVsb0Zyb21JbnRlZ2VyKGludCBvdGhlcikgewogICAgcmV0dXJuIG5ldyBfRG91YmxlLmZyb21JbnRlZ2VyKG90aGVyKS5fbW9kdWxvKHRoaXMpOwogIH0KCiAgZG91YmxlIF9yZW1haW5kZXJGcm9tSW50ZWdlcihpbnQgb3RoZXIpIHsKICAgIHJldHVybiBuZXcgX0RvdWJsZS5mcm9tSW50ZWdlcihvdGhlcikuX3JlbWFpbmRlcih0aGlzKTsKICB9CgogIGJvb2wgX2dyZWF0ZXJUaGFuRnJvbUludGVnZXIoaW50IG90aGVyKQogICAgICBuYXRpdmUgIkRvdWJsZV9ncmVhdGVyVGhhbkZyb21JbnRlZ2VyIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgbmF0aXZlICJEb3VibGVfZ2V0SXNOZWdhdGl2ZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGlzSW5maW5pdGUgbmF0aXZlICJEb3VibGVfZ2V0SXNJbmZpbml0ZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGlzTmFOIG5hdGl2ZSAiRG91YmxlX2dldElzTmFOIjsKICBib29sIGdldCBpc0Zpbml0ZSA9PiAhaXNJbmZpbml0ZSAmJiAhaXNOYU47IC8vIENhbiBiZSBvcHRpbWl6ZWQuCgogIGRvdWJsZSBhYnMoKSB7CiAgICAvLyBIYW5kbGUgbmVnYXRpdmUgMC4wLgogICAgaWYgKHRoaXMgPT0gMC4wKSByZXR1cm4gMC4wOwogICAgcmV0dXJuIHRoaXMgPCAwLjAgPyAtdGhpcyA6IHRoaXM7CiAgfQoKICBkb3VibGUgZ2V0IHNpZ24gewogICAgaWYgKHRoaXMgPiAwLjApIHJldHVybiAxLjA7CiAgICBpZiAodGhpcyA8IDAuMCkgcmV0dXJuIC0xLjA7CiAgICByZXR1cm4gdGhpczsgLy8gKy8tMC4wIG9yIE5hTi4KICB9CgogIGludCByb3VuZCgpID0+IHJvdW5kVG9Eb3VibGUoKS50b0ludCgpOwogIGludCBmbG9vcigpID0+IGZsb29yVG9Eb3VibGUoKS50b0ludCgpOwogIGludCBjZWlsKCkgPT4gY2VpbFRvRG91YmxlKCkudG9JbnQoKTsKICBpbnQgdHJ1bmNhdGUoKSA9PiB0cnVuY2F0ZVRvRG91YmxlKCkudG9JbnQoKTsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRG91YmxlKQogIGRvdWJsZSByb3VuZFRvRG91YmxlKCkgbmF0aXZlICJEb3VibGVfcm91bmQiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgZmxvb3JUb0RvdWJsZSgpIG5hdGl2ZSAiRG91YmxlX2Zsb29yIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgZG91YmxlIGNlaWxUb0RvdWJsZSgpIG5hdGl2ZSAiRG91YmxlX2NlaWwiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgdHJ1bmNhdGVUb0RvdWJsZSgpIG5hdGl2ZSAiRG91YmxlX3RydW5jYXRlIjsKCiAgbnVtIGNsYW1wKG51bSBsb3dlckxpbWl0LCBudW0gdXBwZXJMaW1pdCkgewogICAgaWYgKGxvd2VyTGltaXQgaXMhIG51bSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShsb3dlckxpbWl0LCAibG93ZXJMaW1pdCIsICJub3QgYSBudW1iZXIiKTsKICAgIH0KICAgIGlmICh1cHBlckxpbWl0IGlzISBudW0pIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUodXBwZXJMaW1pdCwgInVwcGVyTGltaXQiLCAibm90IGEgbnVtYmVyIik7CiAgICB9CgogICAgaWYgKGxvd2VyTGltaXQuY29tcGFyZVRvKHVwcGVyTGltaXQpID4gMCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihsb3dlckxpbWl0KTsKICAgIH0KICAgIGlmIChsb3dlckxpbWl0LmlzTmFOKSByZXR1cm4gbG93ZXJMaW1pdDsKICAgIGlmICh0aGlzLmNvbXBhcmVUbyhsb3dlckxpbWl0KSA8IDApIHJldHVybiBsb3dlckxpbWl0OwogICAgaWYgKHRoaXMuY29tcGFyZVRvKHVwcGVyTGltaXQpID4gMCkgcmV0dXJuIHVwcGVyTGltaXQ7CiAgICByZXR1cm4gdGhpczsKICB9CgogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IHRvSW50KCkgbmF0aXZlICJEb3VibGVfdG9JbnQiOwoKICBkb3VibGUgdG9Eb3VibGUoKSB7CiAgICByZXR1cm4gdGhpczsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgQ0FDSEVfU0laRV9MT0cyID0gMzsKICBzdGF0aWMgY29uc3QgaW50IENBQ0hFX0xFTkdUSCA9IDEgPDwgKENBQ0hFX1NJWkVfTE9HMiArIDEpOwogIHN0YXRpYyBjb25zdCBpbnQgQ0FDSEVfTUFTSyA9IENBQ0hFX0xFTkdUSCAtIDE7CiAgLy8gRWFjaCBrZXkgKGRvdWJsZSkgZm9sbG93ZWQgYnkgaXRzIHRvU3RyaW5nIHJlc3VsdC4KICBzdGF0aWMgZmluYWwgTGlzdCBfY2FjaGUgPSBuZXcgTGlzdChDQUNIRV9MRU5HVEgpOwogIHN0YXRpYyBpbnQgX2NhY2hlRXZpY3RJbmRleCA9IDA7CgogIFN0cmluZyBfdG9TdHJpbmcoKSBuYXRpdmUgIkRvdWJsZV90b1N0cmluZyI7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIC8vIFRPRE8oa29kYSk6IENvbnNpZGVyIHN0YXJ0aW5nIGF0IG1vc3QgcmVjZW50bHkgaW5zZXJ0ZWQuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IENBQ0hFX0xFTkdUSDsgaSArPSAyKSB7CiAgICAgIC8vIE5lZWQgJ2lkZW50aWNhbCcgdG8gaGFuZGxlIG5lZ2F0aXZlIHplcm8sIGV0Yy4KICAgICAgaWYgKGlkZW50aWNhbChfY2FjaGVbaV0sIHRoaXMpKSB7CiAgICAgICAgcmV0dXJuIF9jYWNoZVtpICsgMV07CiAgICAgIH0KICAgIH0KICAgIC8vIFRPRE8oa29kYSk6IENvbnNpZGVyIG9wdGltaXppbmcgYWxsIHNtYWxsIGludGVncmFsIHZhbHVlcy4KICAgIGlmIChpZGVudGljYWwoMC4wLCB0aGlzKSkgewogICAgICByZXR1cm4gIjAuMCI7CiAgICB9CiAgICBTdHJpbmcgcmVzdWx0ID0gX3RvU3RyaW5nKCk7CiAgICAvLyBSZXBsYWNlIHRoZSBsZWFzdCByZWNlbnRseSBpbnNlcnRlZCBlbnRyeS4KICAgIF9jYWNoZVtfY2FjaGVFdmljdEluZGV4XSA9IHRoaXM7CiAgICBfY2FjaGVbX2NhY2hlRXZpY3RJbmRleCArIDFdID0gcmVzdWx0OwogICAgX2NhY2hlRXZpY3RJbmRleCA9IChfY2FjaGVFdmljdEluZGV4ICsgMikgJiBDQUNIRV9NQVNLOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmluZyB0b1N0cmluZ0FzRml4ZWQoaW50IGZyYWN0aW9uRGlnaXRzKSB7CiAgICAvLyBTZWUgRUNNQVNjcmlwdC0yNjIsIDE1LjcuNC41IGZvciBkZXRhaWxzLgoKICAgIGlmIChmcmFjdGlvbkRpZ2l0cyBpcyEgaW50KSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgICAgZnJhY3Rpb25EaWdpdHMsICJmcmFjdGlvbkRpZ2l0cyIsICJub3QgYW4gaW50ZWdlciIpOwogICAgfQogICAgLy8gU3RlcCAyLgogICAgaWYgKGZyYWN0aW9uRGlnaXRzIDwgMCB8fCBmcmFjdGlvbkRpZ2l0cyA+IDIwKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGZyYWN0aW9uRGlnaXRzLCAwLCAyMCwgImZyYWN0aW9uRGlnaXRzIik7CiAgICB9CgogICAgLy8gU3RlcCAzLgogICAgZG91YmxlIHggPSB0aGlzOwoKICAgIC8vIFN0ZXAgNC4KICAgIGlmIChpc05hTikgcmV0dXJuICJOYU4iOwoKICAgIC8vIFN0ZXAgNSBhbmQgNiBza2lwcGVkLiBXaWxsIGJlIGRlYWx0IHdpdGggYnkgbmF0aXZlIGZ1bmN0aW9uLgoKICAgIC8vIFN0ZXAgNy4KICAgIGlmICh4ID49IDFlMjEgfHwgeCA8PSAtMWUyMSkgewogICAgICByZXR1cm4geC50b1N0cmluZygpOwogICAgfQoKICAgIHJldHVybiBfdG9TdHJpbmdBc0ZpeGVkKGZyYWN0aW9uRGlnaXRzKTsKICB9CgogIFN0cmluZyBfdG9TdHJpbmdBc0ZpeGVkKGludCBmcmFjdGlvbkRpZ2l0cykgbmF0aXZlICJEb3VibGVfdG9TdHJpbmdBc0ZpeGVkIjsKCiAgU3RyaW5nIHRvU3RyaW5nQXNFeHBvbmVudGlhbChbaW50IGZyYWN0aW9uRGlnaXRzXSkgewogICAgLy8gU2VlIEVDTUFTY3JpcHQtMjYyLCAxNS43LjQuNiBmb3IgZGV0YWlscy4KCiAgICAvLyBUaGUgRWNtYVNjcmlwdCBzcGVjaWZpY2F0aW9uIGNoZWNrcyBmb3IgTmFOIGFuZCBJbmZpbml0eSBiZWZvcmUgbG9va2luZwogICAgLy8gYXQgdGhlIGZyYWN0aW9uRGlnaXRzLiBJbiBEYXJ0IHdlIGFyZSBjb25zaXN0ZW50IHdpdGggdG9TdHJpbmdBc0ZpeGVkIGFuZAogICAgLy8gbG9vayBhdCB0aGUgZnJhY3Rpb25EaWdpdHMgZmlyc3QuCgogICAgLy8gU3RlcCA3LgogICAgaWYgKGZyYWN0aW9uRGlnaXRzICE9IG51bGwpIHsKICAgICAgaWYgKGZyYWN0aW9uRGlnaXRzIGlzISBpbnQpIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICAgICAgZnJhY3Rpb25EaWdpdHMsICJmcmFjdGlvbkRpZ2l0cyIsICJub3QgYW4gaW50ZWdlciIpOwogICAgICB9CiAgICAgIGlmIChmcmFjdGlvbkRpZ2l0cyA8IDAgfHwgZnJhY3Rpb25EaWdpdHMgPiAyMCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGZyYWN0aW9uRGlnaXRzLCAwLCAyMCwgImZyYWN0aW9uRGlnaXRzIik7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaXNOYU4pIHJldHVybiAiTmFOIjsKICAgIGlmICh0aGlzID09IGRvdWJsZS5pbmZpbml0eSkgcmV0dXJuICJJbmZpbml0eSI7CiAgICBpZiAodGhpcyA9PSAtZG91YmxlLmluZmluaXR5KSByZXR1cm4gIi1JbmZpbml0eSI7CgogICAgLy8gVGhlIGRhcnQgZnVuY3Rpb24gcHJpbnRzIHRoZSBzaG9ydGVzdCByZXByZXNlbnRhdGlvbiB3aGVuIGZyYWN0aW9uRGlnaXRzCiAgICAvLyBlcXVhbHMgbnVsbC4gVGhlIG5hdGl2ZSBmdW5jdGlvbiB3YW50cyAtMSBpbnN0ZWFkLgogICAgZnJhY3Rpb25EaWdpdHMgPSAoZnJhY3Rpb25EaWdpdHMgPT0gbnVsbCkgPyAtMSA6IGZyYWN0aW9uRGlnaXRzOwoKICAgIHJldHVybiBfdG9TdHJpbmdBc0V4cG9uZW50aWFsKGZyYWN0aW9uRGlnaXRzKTsKICB9CgogIFN0cmluZyBfdG9TdHJpbmdBc0V4cG9uZW50aWFsKGludCBmcmFjdGlvbkRpZ2l0cykKICAgICAgbmF0aXZlICJEb3VibGVfdG9TdHJpbmdBc0V4cG9uZW50aWFsIjsKCiAgU3RyaW5nIHRvU3RyaW5nQXNQcmVjaXNpb24oaW50IHByZWNpc2lvbikgewogICAgLy8gU2VlIEVDTUFTY3JpcHQtMjYyLCAxNS43LjQuNyBmb3IgZGV0YWlscy4KCiAgICAvLyBUaGUgRWNtYVNjcmlwdCBzcGVjaWZpY2F0aW9uIGNoZWNrcyBmb3IgTmFOIGFuZCBJbmZpbml0eSBiZWZvcmUgbG9va2luZwogICAgLy8gYXQgdGhlIGZyYWN0aW9uRGlnaXRzLiBJbiBEYXJ0IHdlIGFyZSBjb25zaXN0ZW50IHdpdGggdG9TdHJpbmdBc0ZpeGVkIGFuZAogICAgLy8gbG9vayBhdCB0aGUgZnJhY3Rpb25EaWdpdHMgZmlyc3QuCgogICAgaWYgKHByZWNpc2lvbiBpcyEgaW50KSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKHByZWNpc2lvbiwgInByZWNpc2lvbiIsICJub3QgYW4gaW50ZWdlciIpOwogICAgfQogICAgLy8gU3RlcCA4LgogICAgaWYgKHByZWNpc2lvbiA8IDEgfHwgcHJlY2lzaW9uID4gMjEpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UocHJlY2lzaW9uLCAxLCAyMSwgInByZWNpc2lvbiIpOwogICAgfQoKICAgIGlmIChpc05hTikgcmV0dXJuICJOYU4iOwogICAgaWYgKHRoaXMgPT0gZG91YmxlLmluZmluaXR5KSByZXR1cm4gIkluZmluaXR5IjsKICAgIGlmICh0aGlzID09IC1kb3VibGUuaW5maW5pdHkpIHJldHVybiAiLUluZmluaXR5IjsKCiAgICByZXR1cm4gX3RvU3RyaW5nQXNQcmVjaXNpb24ocHJlY2lzaW9uKTsKICB9CgogIFN0cmluZyBfdG9TdHJpbmdBc1ByZWNpc2lvbihpbnQgZnJhY3Rpb25EaWdpdHMpCiAgICAgIG5hdGl2ZSAiRG91YmxlX3RvU3RyaW5nQXNQcmVjaXNpb24iOwoKICAvLyBPcmRlciBpczogTmFOID4gSW5maW5pdHkgPiAuLi4gPiAwLjAgPiAtMC4wID4gLi4uID4gLUluZmluaXR5LgogIGludCBjb21wYXJlVG8obnVtIG90aGVyKSB7CiAgICBjb25zdCBpbnQgRVFVQUwgPSAwLCBMRVNTID0gLTEsIEdSRUFURVIgPSAxOwogICAgaWYgKHRoaXMgPCBvdGhlcikgewogICAgICByZXR1cm4gTEVTUzsKICAgIH0gZWxzZSBpZiAodGhpcyA+IG90aGVyKSB7CiAgICAgIHJldHVybiBHUkVBVEVSOwogICAgfSBlbHNlIGlmICh0aGlzID09IG90aGVyKSB7CiAgICAgIGlmICh0aGlzID09IDAuMCkgewogICAgICAgIGJvb2wgdGhpc0lzTmVnYXRpdmUgPSBpc05lZ2F0aXZlOwogICAgICAgIGJvb2wgb3RoZXJJc05lZ2F0aXZlID0gb3RoZXIuaXNOZWdhdGl2ZTsKICAgICAgICBpZiAodGhpc0lzTmVnYXRpdmUgPT0gb3RoZXJJc05lZ2F0aXZlKSB7CiAgICAgICAgICByZXR1cm4gRVFVQUw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzSXNOZWdhdGl2ZSA/IExFU1MgOiBHUkVBVEVSOwogICAgICB9IGVsc2UgaWYgKG90aGVyIGlzIGludCkgewogICAgICAgIC8vIENvbXBhcmUgYXMgaW50ZWdlcnMgYXMgaXQgaXMgbW9yZSBwcmVjaXNlIGlmIHRoZSBpbnRlZ2VyIHZhbHVlIGlzCiAgICAgICAgLy8gb3V0c2lkZSBvZiBNSU5fRVhBQ1RfSU5UX1RPX0RPVUJMRS4uTUFYX0VYQUNUX0lOVF9UT19ET1VCTEUgcmFuZ2UuCiAgICAgICAgY29uc3QgaW50IE1BWF9FWEFDVF9JTlRfVE9fRE9VQkxFID0gOTAwNzE5OTI1NDc0MDk5MjsgLy8gMl41My4KICAgICAgICBjb25zdCBpbnQgTUlOX0VYQUNUX0lOVF9UT19ET1VCTEUgPSAtTUFYX0VYQUNUX0lOVF9UT19ET1VCTEU7CiAgICAgICAgaWYgKChNSU5fRVhBQ1RfSU5UX1RPX0RPVUJMRSA8PSBvdGhlcikgJiYKICAgICAgICAgICAgKG90aGVyIDw9IE1BWF9FWEFDVF9JTlRfVE9fRE9VQkxFKSkgewogICAgICAgICAgcmV0dXJuIEVRVUFMOwogICAgICAgIH0KICAgICAgICBjb25zdCBib29sIGxpbWl0SW50c1RvNjRCaXRzID0gKCgxIDw8IDY0KSA9PSAwKTsKICAgICAgICBpZiAobGltaXRJbnRzVG82NEJpdHMpIHsKICAgICAgICAgIC8vIFdpdGggaW50ZWdlcnMgbGltaXRlZCB0byA2NCBiaXRzLCBkb3VibGUudG9JbnQoKSBjbGFtcHMKICAgICAgICAgIC8vIGRvdWJsZSB2YWx1ZSB0byBmaXQgaW50byB0aGUgTUlOX0lOVDY0Li5NQVhfSU5UNjQgcmFuZ2UuCiAgICAgICAgICAvLyBNQVhfSU5UNjQgaXMgbm90IHByZWNpc2VseSByZXByZXNlbnRhYmxlIGFzIGRvdWJsZSwgc28KICAgICAgICAgIC8vIGludGVnZXJzIG5lYXIgTUFYX0lOVDY0IGNvbXBhcmUgYXMgZXF1YWwgdG8gKE1BWF9JTlQ2NCArIDEpIHdoZW4KICAgICAgICAgIC8vIHJlcHJlc2VudGVkIGFzIGRvdWJsZXMuCiAgICAgICAgICAvLyBUaGVyZSBpcyBubyBzaW1pbGFyIHByb2JsZW0gd2l0aCBNSU5fSU5UNjQgYXMgaXQgaXMgcHJlY2lzZWx5CiAgICAgICAgICAvLyByZXByZXNlbnRhYmxlIGFzIGRvdWJsZS4KICAgICAgICAgIGNvbnN0IGRvdWJsZSBtYXhJbnQ2NFBsdXMxQXNEb3VibGUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA4LjA7CiAgICAgICAgICBpZiAodGhpcyA+PSBtYXhJbnQ2NFBsdXMxQXNEb3VibGUpIHsKICAgICAgICAgICAgcmV0dXJuIEdSRUFURVI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0b0ludCgpLmNvbXBhcmVUbyhvdGhlcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIEVRVUFMOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzTmFOKSB7CiAgICAgIHJldHVybiBvdGhlci5pc05hTiA/IEVRVUFMIDogR1JFQVRFUjsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE90aGVyIGlzIE5hTi4KICAgICAgcmV0dXJuIExFU1M7CiAgICB9CiAgfQp9CoFtAE5OPAEeARoiK0wBLTYBKx0hIwQBKzEBKx0hIwQBKzEBKx0hIwQBKzEBHykEASk6ASsdISMEASsxASEmBAErNwEgKQQBPQErMwEoHSM3BAEoMyhCASgdHxkEASgdHysEASg/ASgdIC4EASgdIC4EASY2BAEmNgQBNyY2BAEoPAQBKTkEASw8BAEqLgEoNSg1KCtDAREcISYEARQgISMEASoqKDABKzArMCsuKzYBLh5PBh5PBgEwKwYtOzsRBAEpJQEWEQQBKD4yODUjAS8BFkAwOCgeCAZCIBQGITIlKzwTBAEvMQEiJT8GDzVLBgEPFQEPHQFEAQ8jGwYBLQQBTwE3MQFPUSkBDyIkJ0EIN00IBgEdNDYBUDpFATMEATQtAS4xAU9RKQEdTwYPK0EGAR00NgEsBAEyKwFEHTEYEx8WIBkqMTEYCjAhTU5HRjIyGAo5IUVGRE4lSyZGLxwMCikPFggYLA0XEwYEAgEbZGFydDpjb3JlLXBhdGNoL2RvdWJsZS5kYXJ0LW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvZnVuY3Rpb24uZGFydIdlLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9DbG9zdXJlIGltcGxlbWVudHMgRnVuY3Rpb24gewogIGZhY3RvcnkgX0Nsb3N1cmUuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgIlVucmVhY2hhYmxlIjsKICB9CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSBuYXRpdmUgIkNsb3N1cmVfZXF1YWxzIjsKCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICBfaGFzaCA/Pz0gX2NvbXB1dGVIYXNoKCk7CiAgICByZXR1cm4gX2hhc2g7CiAgfQoKICBfQ2xvc3VyZSBnZXQgY2FsbCA9PiB0aGlzOwoKICBfQ2xvc3VyZSBfY2xvbmUoKSBuYXRpdmUgIkNsb3N1cmVfY2xvbmUiOwoKICBpbnQgX2NvbXB1dGVIYXNoKCkgbmF0aXZlICJDbG9zdXJlX2NvbXB1dGVIYXNoIjsKCiAgLy8gTm8gaW5zdGFuY2UgZmllbGRzIHNob3VsZCBiZSBkZWNsYXJlZCBiZWZvcmUgdGhlIGZvbGxvd2luZyBmaWVsZHMgd2hvc2UKICAvLyBvZmZzZXRzIG11c3QgYmUgaWRlbnRpY2FsIGluIERhcnQgYW5kIEMrKy4KCiAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGRlY2xhcmVkIGJvdGggaW4gcmF3X29iamVjdC5oIChmb3IgZGlyZWN0IGFjY2VzcwogIC8vIGZyb20gQysrIGNvZGUpIGFuZCBhbHNvIGhlcmUgc28gdGhhdCB0aGUgb2Zmc2V0LXRvLWZpZWxkIG1hcCB1c2VkIGJ5CiAgLy8gZGVmZXJyZWQgb2JqZWN0cyBpcyBwcm9wZXJseSBpbml0aWFsaXplZC4KICAvLyBDYXV0aW9uOiBUaGVzZSBmaWVsZHMgYXJlIG5vdCBEYXJ0IGluc3RhbmNlcywgYnV0IFZNIG9iamVjdHMuIFRoZWlyIERhcnQKICAvLyBuYW1lcyBkbyBub3QgbmVlZCB0byBtYXRjaCB0aGUgQysrIG5hbWVzLCBidXQgdGhleSBtdXN0IGJlIHByaXZhdGUuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHZhciBfaW5zdGFudGlhdG9yX3R5cGVfYXJndW1lbnRzOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICB2YXIgX2Z1bmN0aW9uX3R5cGVfYXJndW1lbnRzOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICB2YXIgX2RlbGF5ZWRfdHlwZV9hcmd1bWVudHM7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHZhciBfZnVuY3Rpb247CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHZhciBfY29udGV4dDsKCiAgLy8gTm90ZTogX0Nsb3N1cmUgb2JqZWN0cyBhcmUgY3JlYXRlZCBieSBWTSAibWFnaWNhbGx5Iiwgd2l0aG91dCBpbnZva2luZwogIC8vIGNvbnN0cnVjdG9yLiBTbywgX0Nsb3N1cmUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBuZXZlciBjb21waWxlZCBhbmQKICAvLyBkZXRlY3Rpb24gb2YgZGVmYXVsdC1pbml0aWFsaXplZCBmaWVsZHMgaXMgbm90IHBlcmZvcm1lZC4KICAvLyBBcyBhIGNvbnNlcXVlbmNlLCBWTSBpbmNvcnJlY3RseSBhc3N1bWVzIHRoYXQgX2hhc2ggZmllbGQgaXMgbm90CiAgLy8gbnVsbGFibGUgYW5kIG1heSBpbmNvcnJlY3RseSByZW1vdmUgJ2lmIChfaGFzaCA9PSBudWxsKScgaW4gZ2V0Omhhc2hDb2RlLgogIC8vIFRoaXMgaW5pdGlhbGl6ZXIgbWFrZXMgX2hhc2ggZmllbGQgbnVsbGFibGUgZXZlbiB3aXRob3V0IGNvbnN0cnVjdG9yCiAgLy8gY29tcGlsYXRpb24uCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHZhciBfaGFzaCA9IG51bGw7Cn0KOABOTjwBHgEaJScZBAE6ARUeEgQBHQEsATMBTTABT0ovTkkcJBwgHB8cERwQAUxJP0ZPShIcFAIBHWRhcnQ6Y29yZS1wYXRjaC9mdW5jdGlvbi5kYXJ0M29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvZ3Jvd2FibGVfYXJyYXkuZGFydK3LLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9Hcm93YWJsZUxpc3Q8VD4gZXh0ZW5kcyBMaXN0QmFzZTxUPiB7CiAgdm9pZCBpbnNlcnQoaW50IGluZGV4LCBUIGVsZW1lbnQpIHsKICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPiBsZW5ndGgpKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGluZGV4LCAwLCBsZW5ndGgpOwogICAgfQogICAgaWYgKGluZGV4ID09IHRoaXMubGVuZ3RoKSB7CiAgICAgIGFkZChlbGVtZW50KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG9sZExlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgLy8gV2UgYXJlIG1vZGlmeWluZyB0aGUgbGVuZ3RoIGp1c3QgYmVsb3cgdGhlIGlzLWNoZWNrLiBXaXRob3V0IHRoZSBjaGVjawogICAgLy8gQXJyYXkuY29weSBjb3VsZCB0aHJvdyBhbiBleGNlcHRpb24sIGxlYXZpbmcgdGhlIGxpc3QgaW4gYSBiYWQgc3RhdGUKICAgIC8vICh3aXRoIGEgbGVuZ3RoIHRoYXQgaGFzIGJlZW4gaW5jcmVhc2VkLCBidXQgd2l0aG91dCBhIG5ldyBlbGVtZW50KS4KICAgIGlmIChpbmRleCBpcyEgaW50KSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihpbmRleCk7CiAgICB0aGlzLmxlbmd0aCsrOwogICAgTGlzdHMuY29weSh0aGlzLCBpbmRleCwgdGhpcywgaW5kZXggKyAxLCBvbGRMZW5ndGggLSBpbmRleCk7CiAgICB0aGlzW2luZGV4XSA9IGVsZW1lbnQ7CiAgfQoKICBUIHJlbW92ZUF0KGludCBpbmRleCkgewogICAgdmFyIHJlc3VsdCA9IHRoaXNbaW5kZXhdOwogICAgaW50IG5ld0xlbmd0aCA9IHRoaXMubGVuZ3RoIC0gMTsKICAgIGlmIChpbmRleCA8IG5ld0xlbmd0aCkgewogICAgICBMaXN0cy5jb3B5KHRoaXMsIGluZGV4ICsgMSwgdGhpcywgaW5kZXgsIG5ld0xlbmd0aCAtIGluZGV4KTsKICAgIH0KICAgIHRoaXMubGVuZ3RoID0gbmV3TGVuZ3RoOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGJvb2wgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgewogICAgICAgIHJlbW92ZUF0KGkpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIGluc2VydEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGluZGV4LCAwLCBsZW5ndGgpOwogICAgfQogICAgLy8gVE9ETyhmbG9pdHNjaCk6IHdlIGNhbiBwcm9iYWJseSBkZXRlY3QgbW9yZSBjYXNlcy4KICAgIGlmIChpdGVyYWJsZSBpcyEgTGlzdCAmJiBpdGVyYWJsZSBpcyEgU2V0ICYmIGl0ZXJhYmxlIGlzISBTdWJMaXN0SXRlcmFibGUpIHsKICAgICAgaXRlcmFibGUgPSBpdGVyYWJsZS50b0xpc3QoKTsKICAgIH0KICAgIGludCBpbnNlcnRpb25MZW5ndGggPSBpdGVyYWJsZS5sZW5ndGg7CiAgICAvLyBUaGVyZSBtaWdodCBiZSBlcnJvcnMgYWZ0ZXIgdGhlIGxlbmd0aCBjaGFuZ2UsIGluIHdoaWNoIGNhc2UgdGhlIGxpc3QKICAgIC8vIHdpbGwgZW5kIHVwIGJlaW5nIG1vZGlmaWVkIGJ1dCB0aGUgb3BlcmF0aW9uIG5vdCBjb21wbGV0ZS4gVW5sZXNzIHdlCiAgICAvLyBhbHdheXMgZ28gdGhyb3VnaCBhICJ0b0xpc3QiIHdlIGNhbid0IHJlYWxseSBhdm9pZCB0aGF0LgogICAgdGhpcy5sZW5ndGggKz0gaW5zZXJ0aW9uTGVuZ3RoOwogICAgc2V0UmFuZ2UoaW5kZXggKyBpbnNlcnRpb25MZW5ndGgsIHRoaXMubGVuZ3RoLCB0aGlzLCBpbmRleCk7CiAgICBzZXRBbGwoaW5kZXgsIGl0ZXJhYmxlKTsKICB9CgogIHZvaWQgc2V0QWxsKGludCBpbmRleCwgSXRlcmFibGU8VD4gaXRlcmFibGUpIHsKICAgIGlmIChpdGVyYWJsZSBpcyBMaXN0KSB7CiAgICAgIHNldFJhbmdlKGluZGV4LCBpbmRleCArIGl0ZXJhYmxlLmxlbmd0aCwgaXRlcmFibGUpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChUIGVsZW1lbnQgaW4gaXRlcmFibGUpIHsKICAgICAgICB0aGlzW2luZGV4KytdID0gZWxlbWVudDsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCByZW1vdmVSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIExpc3RzLmNvcHkodGhpcywgZW5kLCB0aGlzLCBzdGFydCwgdGhpcy5sZW5ndGggLSBlbmQpOwogICAgdGhpcy5sZW5ndGggPSB0aGlzLmxlbmd0aCAtIChlbmQgLSBzdGFydCk7CiAgfQoKICBMaXN0PFQ+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIDxUPltdOwogICAgTGlzdCBsaXN0ID0gbmV3IF9MaXN0KGxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGxpc3RbaV0gPSB0aGlzW3N0YXJ0ICsgaV07CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gbmV3IF9Hcm93YWJsZUxpc3Q8VD4uX3dpdGhEYXRhKGxpc3QpOwogICAgcmVzdWx0Ll9zZXRMZW5ndGgobGVuZ3RoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBmYWN0b3J5IF9Hcm93YWJsZUxpc3QoaW50IGxlbmd0aCkgewogICAgdmFyIGRhdGEgPSBfYWxsb2NhdGVEYXRhKGxlbmd0aCk7CiAgICB2YXIgcmVzdWx0ID0gbmV3IF9Hcm93YWJsZUxpc3Q8VD4uX3dpdGhEYXRhKGRhdGEpOwogICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgcmVzdWx0Ll9zZXRMZW5ndGgobGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBmYWN0b3J5IF9Hcm93YWJsZUxpc3Qud2l0aENhcGFjaXR5KGludCBjYXBhY2l0eSkgewogICAgdmFyIGRhdGEgPSBfYWxsb2NhdGVEYXRhKGNhcGFjaXR5KTsKICAgIHJldHVybiBuZXcgX0dyb3dhYmxlTGlzdDxUPi5fd2l0aERhdGEoZGF0YSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Hcm93YWJsZUxpc3QpCiAgZmFjdG9yeSBfR3Jvd2FibGVMaXN0Ll93aXRoRGF0YShfTGlzdCBkYXRhKSBuYXRpdmUgIkdyb3dhYmxlTGlzdF9hbGxvY2F0ZSI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBpbnQgZ2V0IF9jYXBhY2l0eSBuYXRpdmUgIkdyb3dhYmxlTGlzdF9nZXRDYXBhY2l0eSI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBpbnQgZ2V0IGxlbmd0aCBuYXRpdmUgIkdyb3dhYmxlTGlzdF9nZXRMZW5ndGgiOwoKICB2b2lkIHNldCBsZW5ndGgoaW50IG5ld19sZW5ndGgpIHsKICAgIGludCBvbGRfY2FwYWNpdHkgPSBfY2FwYWNpdHk7CiAgICBpbnQgbmV3X2NhcGFjaXR5ID0gbmV3X2xlbmd0aDsKICAgIGlmIChuZXdfY2FwYWNpdHkgPiBvbGRfY2FwYWNpdHkpIHsKICAgICAgX2dyb3cobmV3X2NhcGFjaXR5KTsKICAgICAgX3NldExlbmd0aChuZXdfbGVuZ3RoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gV2UgYXJlIHNocmlua2luZy4gUGljayB0aGUgbWV0aG9kIHdoaWNoIGhhcyBmZXdlciB3cml0ZXMuCiAgICAvLyBJbiB0aGUgc2hyaW5rLXRvLWZpdCBwYXRoLCB3ZSB3cml0ZSB8bmV3X2NhcGFjaXR5ICsgbmV3X2xlbmd0aHwgd29yZHMKICAgIC8vIChudWxsIGluaXQgKyBjb3B5KS4KICAgIC8vIEluIHRoZSBub24tc2hyaW5rLXRvLWZpdCBwYXRoLCB3ZSB3cml0ZSB8bGVuZ3RoIC0gbmV3X2xlbmd0aHwgd29yZHMKICAgIC8vIChudWxsIG92ZXJ3cml0ZSkuCiAgICBmaW5hbCBib29sIHNob3VsZFNocmlua1RvRml0ID0KICAgICAgICAobmV3X2NhcGFjaXR5ICsgbmV3X2xlbmd0aCkgPCAobGVuZ3RoIC0gbmV3X2xlbmd0aCk7CiAgICBpZiAoc2hvdWxkU2hyaW5rVG9GaXQpIHsKICAgICAgX3NocmluayhuZXdfY2FwYWNpdHksIG5ld19sZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgaSA9IG5ld19sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIHRoaXNbaV0gPSBudWxsOwogICAgICB9CiAgICB9CiAgICBfc2V0TGVuZ3RoKG5ld19sZW5ndGgpOwogIH0KCiAgdm9pZCBfc2V0TGVuZ3RoKGludCBuZXdfbGVuZ3RoKSBuYXRpdmUgIkdyb3dhYmxlTGlzdF9zZXRMZW5ndGgiOwoKICB2b2lkIF9zZXREYXRhKF9MaXN0IGFycmF5KSBuYXRpdmUgIkdyb3dhYmxlTGlzdF9zZXREYXRhIjsKCiAgVCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIG5hdGl2ZSAiR3Jvd2FibGVMaXN0X2dldEluZGV4ZWQiOwoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIFQgdmFsdWUpIHsKICAgIF9zZXRJbmRleGVkKGluZGV4LCB2YWx1ZSk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkKGludCBpbmRleCwgVCB2YWx1ZSkgbmF0aXZlICJHcm93YWJsZUxpc3Rfc2V0SW5kZXhlZCI7CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIHZvaWQgYWRkKFQgdmFsdWUpIHsKICAgIHZhciBsZW4gPSBsZW5ndGg7CiAgICBpZiAobGVuID09IF9jYXBhY2l0eSkgewogICAgICBfZ3JvdyhfbmV4dENhcGFjaXR5KGxlbikpOwogICAgfQogICAgX3NldExlbmd0aChsZW4gKyAxKTsKICAgIHRoaXNbbGVuXSA9IHZhbHVlOwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8VD4gaXRlcmFibGUpIHsKICAgIHZhciBsZW4gPSBsZW5ndGg7CiAgICBmaW5hbCBjaWQgPSBDbGFzc0lELmdldElEKGl0ZXJhYmxlKTsKICAgIGZpbmFsIGlzVk1MaXN0ID0gKGNpZCA9PSBDbGFzc0lELmNpZEFycmF5KSB8fAogICAgICAgIChjaWQgPT0gQ2xhc3NJRC5jaWRHcm93YWJsZU9iamVjdEFycmF5KSB8fAogICAgICAgIChjaWQgPT0gQ2xhc3NJRC5jaWRJbW11dGFibGVBcnJheSk7CiAgICBpZiAoaXNWTUxpc3QgfHwgKGl0ZXJhYmxlIGlzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlKSkgewogICAgICB2YXIgY2FwID0gX2NhcGFjaXR5OwogICAgICAvLyBQcmVncm93IGlmIHdlIGtub3cgaXRlcmFibGUubGVuZ3RoLgogICAgICB2YXIgaXRlckxlbiA9IGl0ZXJhYmxlLmxlbmd0aDsKICAgICAgdmFyIG5ld0xlbiA9IGxlbiArIGl0ZXJMZW47CiAgICAgIGlmIChuZXdMZW4gPiBjYXApIHsKICAgICAgICBkbyB7CiAgICAgICAgICBjYXAgPSBfbmV4dENhcGFjaXR5KGNhcCk7CiAgICAgICAgfSB3aGlsZSAobmV3TGVuID4gY2FwKTsKICAgICAgICBfZ3JvdyhjYXApOwogICAgICB9CiAgICAgIGlmIChpc1ZNTGlzdCkgewogICAgICAgIGlmIChpZGVudGljYWwoaXRlcmFibGUsIHRoaXMpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9zZXRMZW5ndGgobmV3TGVuKTsKICAgICAgICBmaW5hbCBMaXN0QmFzZTxUPiBpdGVyYWJsZUFzTGlzdCA9IGl0ZXJhYmxlOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlckxlbjsgaSsrKSB7CiAgICAgICAgICB0aGlzW2xlbisrXSA9IGl0ZXJhYmxlQXNMaXN0W2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIEl0ZXJhdG9yIGl0ID0gaXRlcmFibGUuaXRlcmF0b3I7CiAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHJldHVybjsKICAgIGRvIHsKICAgICAgd2hpbGUgKGxlbiA8IF9jYXBhY2l0eSkgewogICAgICAgIGludCBuZXdMZW4gPSBsZW4gKyAxOwogICAgICAgIHRoaXMuX3NldExlbmd0aChuZXdMZW4pOwogICAgICAgIHRoaXNbbGVuXSA9IGl0LmN1cnJlbnQ7CiAgICAgICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSByZXR1cm47CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoICE9IG5ld0xlbikgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgICBsZW4gPSBuZXdMZW47CiAgICAgIH0KICAgICAgX2dyb3coX25leHRDYXBhY2l0eShfY2FwYWNpdHkpKTsKICAgIH0gd2hpbGUgKHRydWUpOwogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgVCByZW1vdmVMYXN0KCkgewogICAgdmFyIGxlbiA9IGxlbmd0aCAtIDE7CiAgICB2YXIgZWxlbSA9IHRoaXNbbGVuXTsKICAgIHRoaXMubGVuZ3RoID0gbGVuOwogICAgcmV0dXJuIGVsZW07CiAgfQoKICBUIGdldCBmaXJzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbMF07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIFQgZ2V0IGxhc3QgewogICAgaWYgKGxlbmd0aCA+IDApIHJldHVybiB0aGlzW2xlbmd0aCAtIDFdOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBUIGdldCBzaW5nbGUgewogICAgaWYgKGxlbmd0aCA9PSAxKSByZXR1cm4gdGhpc1swXTsKICAgIGlmIChsZW5ndGggPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgfQoKICAvLyBTaGFyZWQgYXJyYXkgdXNlZCBhcyBiYWNraW5nIGZvciBuZXcgZW1wdHkgZ3Jvd2FibGUgYXJyYXlzLgogIHN0YXRpYyBmaW5hbCBfTGlzdCBfZW1wdHlMaXN0ID0gbmV3IF9MaXN0KDApOwoKICBzdGF0aWMgX0xpc3QgX2FsbG9jYXRlRGF0YShpbnQgY2FwYWNpdHkpIHsKICAgIGlmIChjYXBhY2l0eSA9PSAwKSB7CiAgICAgIC8vIFVzZSBzaGFyZWQgZW1wdHkgbGlzdCBhcyBiYWNraW5nLgogICAgICByZXR1cm4gX2VtcHR5TGlzdDsKICAgIH0KICAgIC8vIFJvdW5kIHVwIHNpemUgdG8gdGhlIG5leHQgb2RkIG51bWJlciwgc2luY2UgdGhpcyBpcyBmcmVlCiAgICAvLyBiZWNhdXNlIG9mIGFsaWdubWVudCByZXF1aXJlbWVudHMgb2YgdGhlIEdDLgogICAgcmV0dXJuIG5ldyBfTGlzdChjYXBhY2l0eSB8IDEpOwogIH0KCiAgLy8gR3JvdyBmcm9tIDAgdG8gMywgYW5kIHRoZW4gZG91YmxlICsgMS4KICBpbnQgX25leHRDYXBhY2l0eShpbnQgb2xkX2NhcGFjaXR5KSA9PiAob2xkX2NhcGFjaXR5ICogMikgfCAzOwoKICB2b2lkIF9ncm93KGludCBuZXdfY2FwYWNpdHkpIHsKICAgIHZhciBuZXdEYXRhID0gX2FsbG9jYXRlRGF0YShuZXdfY2FwYWNpdHkpOwogICAgLy8gVGhpcyBpcyBhIHdvcmstYXJvdW5kIGZvciBkYXJ0YnVnLmNvbS8zMDA5MDogYXJyYXktYm91bmQtY2hlY2sKICAgIC8vIGdlbmVyYWxpemF0aW9uIGNhdXNlcyBleGNlc3NpdmUgZGVvcHRpbWl6YXRpb25zIGJlY2F1c2UgaXQKICAgIC8vIGhvaXN0cyBDaGVja0FycmF5Qm91bmQoaSwgLi4uKSBvdXQgb2YgdGhlIGxvb3AgYmVsb3cgYW5kIHR1cm5zIGl0CiAgICAvLyBpbnRvIENoZWNrQXJyYXlCb3VuZChsZW5ndGggLSAxLCAuLi4pLiBXaGljaCBkZW9wdGltaXplcwogICAgLy8gaWYgbGVuZ3RoID09IDAuIEhvd2V2ZXIgdGhlIGxvb3AgaXRzZWxmIGRvZXMgbm90IGV4ZWN1dGUKICAgIC8vIGlmIGxlbmd0aCA9PSAwLgogICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIG5ld0RhdGFbaV0gPSB0aGlzW2ldOwogICAgICB9CiAgICB9CiAgICBfc2V0RGF0YShuZXdEYXRhKTsKICB9CgogIHZvaWQgX3NocmluayhpbnQgbmV3X2NhcGFjaXR5LCBpbnQgbmV3X2xlbmd0aCkgewogICAgdmFyIG5ld0RhdGEgPSBfYWxsb2NhdGVEYXRhKG5ld19jYXBhY2l0eSk7CiAgICAvLyBUaGlzIGlzIGEgd29yay1hcm91bmQgZm9yIGRhcnRidWcuY29tLzMwMDkwLiBTZWUgdGhlIGNvbW1lbnQgaW4gX2dyb3cuCiAgICBpZiAobmV3X2xlbmd0aCA+IDApIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdfbGVuZ3RoOyBpKyspIHsKICAgICAgICBuZXdEYXRhW2ldID0gdGhpc1tpXTsKICAgICAgfQogICAgfQogICAgX3NldERhdGEobmV3RGF0YSk7CiAgfQoKICAvLyBJdGVyYWJsZSBpbnRlcmZhY2UuCgogIEBwcmFnbWEoInZtOnByZWZlci1pbmxpbmUiKQogIHZvaWQgZm9yRWFjaChmKFQgZWxlbWVudCkpIHsKICAgIGludCBpbml0aWFsTGVuZ3RoID0gbGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBmKHRoaXNbaV0pOwogICAgICBpZiAobGVuZ3RoICE9IGluaXRpYWxMZW5ndGgpIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICB9CiAgfQoKICBTdHJpbmcgam9pbihbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgewogICAgZmluYWwgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gIiI7CiAgICBpZiAobGVuZ3RoID09IDEpIHJldHVybiAiJHt0aGlzWzBdfSI7CiAgICBpZiAoc2VwYXJhdG9yLmlzTm90RW1wdHkpIHJldHVybiBfam9pbldpdGhTZXBhcmF0b3Ioc2VwYXJhdG9yKTsKICAgIHZhciBpID0gMDsKICAgIHZhciBjb2RlVW5pdENvdW50ID0gMDsKICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7CiAgICAgIGZpbmFsIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICAvLyBXaGlsZSBsaXN0IGNvbnRhaW5zIG9uZS1ieXRlIHN0cmluZ3MuCiAgICAgIGlmIChlbGVtZW50IGlzIF9PbmVCeXRlU3RyaW5nKSB7CiAgICAgICAgY29kZVVuaXRDb3VudCArPSBlbGVtZW50Lmxlbmd0aDsKICAgICAgICBpKys7CiAgICAgICAgLy8gTG9vcCBiYWNrIHdoaWxlIHN0cmluZ3MgYXJlIG9uZS1ieXRlIHN0cmluZ3MuCiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgLy8gT3RoZXJ3aXNlLCBuZXZlciBsb29wIGJhY2sgdG8gdGhlIG91dGVyIGxvb3AsIGFuZAogICAgICAvLyBoYW5kbGUgdGhlIHJlbWFpbmluZyBzdHJpbmdzIGJlbG93LgoKICAgICAgLy8gTG9vcCB3aGlsZSBlbGVtZW50cyBhcmUgc3RyaW5ncywKICAgICAgZmluYWwgaW50IGZpcnN0Tm9uT25lQnl0ZVN0cmluZ0xpbWl0ID0gaTsKICAgICAgdmFyIG5leHRFbGVtZW50ID0gZWxlbWVudDsKICAgICAgd2hpbGUgKG5leHRFbGVtZW50IGlzIFN0cmluZykgewogICAgICAgIGkrKzsKICAgICAgICBpZiAoaSA9PSBsZW5ndGgpIHsKICAgICAgICAgIHJldHVybiBfU3RyaW5nQmFzZS5fY29uY2F0UmFuZ2VOYXRpdmUodGhpcywgMCwgbGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgbmV4dEVsZW1lbnQgPSB0aGlzW2ldOwogICAgICB9CgogICAgICAvLyBOb3QgYWxsIGVsZW1lbnRzIGFyZSBzdHJpbmdzLCBzbyBhbGxvY2F0ZSBhIG5ldyBiYWNraW5nIGFycmF5LgogICAgICBmaW5hbCBsaXN0ID0gbmV3IF9MaXN0KGxlbmd0aCk7CiAgICAgIGZvciAoaW50IGNvcHlJbmRleCA9IDA7IGNvcHlJbmRleCA8IGk7IGNvcHlJbmRleCsrKSB7CiAgICAgICAgbGlzdFtjb3B5SW5kZXhdID0gdGhpc1tjb3B5SW5kZXhdOwogICAgICB9CiAgICAgIC8vIElzIG5vbi16ZXJvIGlmIGxpc3QgY29udGFpbnMgYSBub24tb25lYnl0ZSBzdHJpbmcuCiAgICAgIHZhciBvbmVieXRlQ2FuYXJ5ID0gaSAtIGZpcnN0Tm9uT25lQnl0ZVN0cmluZ0xpbWl0OwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGZpbmFsIFN0cmluZyBlbGVtZW50U3RyaW5nID0gIiRuZXh0RWxlbWVudCI7CiAgICAgICAgb25lYnl0ZUNhbmFyeSB8PQogICAgICAgICAgICAoQ2xhc3NJRC5nZXRJRChlbGVtZW50U3RyaW5nKSBeIENsYXNzSUQuY2lkT25lQnl0ZVN0cmluZyk7CiAgICAgICAgbGlzdFtpXSA9IGVsZW1lbnRTdHJpbmc7CiAgICAgICAgY29kZVVuaXRDb3VudCArPSBlbGVtZW50U3RyaW5nLmxlbmd0aDsKICAgICAgICBpKys7CiAgICAgICAgaWYgKGkgPT0gbGVuZ3RoKSBicmVhazsKICAgICAgICBuZXh0RWxlbWVudCA9IHRoaXNbaV07CiAgICAgIH0KICAgICAgaWYgKG9uZWJ5dGVDYW5hcnkgPT0gMCkgewogICAgICAgIC8vIEFsbCBlbGVtZW50cyByZXR1cm5lZCBhIG9uZS1ieXRlIHN0cmluZyBmcm9tIHRvU3RyaW5nLgogICAgICAgIHJldHVybiBfT25lQnl0ZVN0cmluZy5fY29uY2F0QWxsKGxpc3QsIGNvZGVVbml0Q291bnQpOwogICAgICB9CiAgICAgIHJldHVybiBfU3RyaW5nQmFzZS5fY29uY2F0UmFuZ2VOYXRpdmUobGlzdCwgMCwgbGVuZ3RoKTsKICAgIH0KICAgIC8vIEFsbCBlbGVtZW50cyB3ZXJlIG9uZS1ieXRlIHN0cmluZ3MuCiAgICByZXR1cm4gX09uZUJ5dGVTdHJpbmcuX2NvbmNhdEFsbCh0aGlzLCBjb2RlVW5pdENvdW50KTsKICB9CgogIFN0cmluZyBfam9pbldpdGhTZXBhcmF0b3IoU3RyaW5nIHNlcGFyYXRvcikgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGJ1ZmZlci53cml0ZSh0aGlzWzBdKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewogICAgICBidWZmZXIud3JpdGUoc2VwYXJhdG9yKTsKICAgICAgYnVmZmVyLndyaXRlKHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgVCBlbGVtZW50QXQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gdGhpc1tpbmRleF07CiAgfQoKICBib29sIGdldCBpc0VtcHR5IHsKICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PSAwOwogIH0KCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKCiAgdm9pZCBjbGVhcigpIHsKICAgIHRoaXMubGVuZ3RoID0gMDsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+IExpc3RCYXNlLmxpc3RUb1N0cmluZyh0aGlzKTsKCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgSXRlcmF0b3I8VD4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBuZXcgTGlzdEl0ZXJhdG9yPFQ+KHRoaXMpOwogIH0KCiAgTGlzdDxUPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBpZiAobGVuZ3RoID4gMCkgewogICAgICBMaXN0IGxpc3QgPSBncm93YWJsZSA/IG5ldyBfTGlzdChsZW5ndGgpIDogbmV3IF9MaXN0PFQ+KGxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICBsaXN0W2ldID0gdGhpc1tpXTsKICAgICAgfQogICAgICBpZiAoIWdyb3dhYmxlKSByZXR1cm4gbGlzdDsKICAgICAgdmFyIHJlc3VsdCA9IG5ldyBfR3Jvd2FibGVMaXN0PFQ+Ll93aXRoRGF0YShsaXN0KTsKICAgICAgcmVzdWx0Ll9zZXRMZW5ndGgobGVuZ3RoKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBncm93YWJsZSA/IDxUPltdIDogbmV3IExpc3Q8VD4oMCk7CiAgfQoKICBTZXQ8VD4gdG9TZXQoKSB7CiAgICByZXR1cm4gbmV3IFNldDxUPi5mcm9tKHRoaXMpOwogIH0KfQqBjABOTjwBHgEaLSYrNAYgFA4GIU5MSzcTQRsEARoeJR1DBh0TBAEgLCAVFQgGEgQBNCc0BjpRJAYrTUxAJEEdBAExHDoNJCEIBgQBKTk7LwQBKj8eIyMnIQY3HxMEASYmNxYhBhMEATUoMQQBMU4BNB43ATQeMgEkIiMnGx4OBkFNG0sZIz0dKQ0yGAgGHAQBQwE8AT0BKh8EAUkBJB4WFhwhBhkXBAEmFikyMyw9Gy0lIhoNJCAUCBYpNwohNSwrChAIBiUgCSAeISAkUBYIJxQEAR4TGhoXEQQBECQsBAEPLSwEARElPSoEAUEwAS0ZKxkGQDQkBAEsQQEhL0ZCSUBAFxYpHggGFwQBMy9OGi0eCAYXBAEZAR4fICcSUAYEASkkICpEDxsZHy8nKQ05Egg7LQEqMCEmDRtCCh8IAUgmPCsIPDoVNRlHIS8NIB8IIEI/CD4GKzsEATAuGywfHQYeBAEbGAQBFR0EASMBERUEATQBHh0mBAEqHhZHKRsIIjkhFQYuBAETIgQCASNkYXJ0OmNvcmUtcGF0Y2gvZ3Jvd2FibGVfYXJyYXkuZGFydDJvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2ltbXV0YWJsZV9tYXAuZGFydJWdLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgovLy8gSW1tdXRhYmxlIG1hcCBjbGFzcyBmb3IgY29tcGlsZXIgZ2VuZXJhdGVkIG1hcCBsaXRlcmFscy4KLy8gVE9ETyhscm4pOiBFeHRlbmQgTWFwQmFzZSB3aXRoIFVubW9kaWZpYWJsZU1hcE1peGluIHdoZW4gbWl4aW5zCi8vIHN1cHBvcnQgZm9yd2FyZGluZyBjb25zdCBjb25zdHJ1Y3RvcnMuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ltbXV0YWJsZU1hcDxLLCBWPiBpbXBsZW1lbnRzIE1hcDxLLCBWPiB7CiAgZmluYWwgX0ltbXV0YWJsZUxpc3QgX2t2UGFpcnM7CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBjb25zdCBfSW1tdXRhYmxlTWFwLl9jcmVhdGUoX0ltbXV0YWJsZUxpc3Qga2V5VmFsdWVQYWlycykKICAgICAgOiBfa3ZQYWlycyA9IGtleVZhbHVlUGFpcnM7CgogIE1hcDxLMiwgVjI+IGNhc3Q8SzIsIFYyPigpID0+IE1hcC5jYXN0RnJvbTxLLCBWLCBLMiwgVjI+KHRoaXMpOwogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgewogICAgLy8gVG8gcHJlc2VydmUgdGhlIGtleS12YWx1ZSBvcmRlciBvZiB0aGUgbWFwIGxpdGVyYWwsIHRoZSBrZXlzIGFyZQogICAgLy8gbm90IHNvcnRlZC4gTmVlZCB0byBkbyBsaW5lYXIgc2VhcmNoIG9yIGltcGxlbWVudCBhbiBhZGRpdGlvbmFsCiAgICAvLyBsb29rdXAgdGFibGUuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9rdlBhaXJzLmxlbmd0aCAtIDE7IGkgKz0gMikgewogICAgICBpZiAoa2V5ID09IF9rdlBhaXJzW2ldKSB7CiAgICAgICAgcmV0dXJuIF9rdlBhaXJzW2kgKyAxXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBib29sIGdldCBpc0VtcHR5IHsKICAgIHJldHVybiBfa3ZQYWlycy5sZW5ndGggPT0gMDsKICB9CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CgogIGludCBnZXQgbGVuZ3RoIHsKICAgIHJldHVybiBfa3ZQYWlycy5sZW5ndGggfi8gMjsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9rdlBhaXJzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgIGYoX2t2UGFpcnNbaV0sIF9rdlBhaXJzW2kgKyAxXSk7CiAgICB9CiAgfQoKICBJdGVyYWJsZTxLPiBnZXQga2V5cyB7CiAgICByZXR1cm4gbmV3IF9JbW11dGFibGVNYXBLZXlJdGVyYWJsZTxLPih0aGlzKTsKICB9CgogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgewogICAgcmV0dXJuIG5ldyBfSW1tdXRhYmxlTWFwVmFsdWVJdGVyYWJsZTxWPih0aGlzKTsKICB9CgogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfa3ZQYWlycy5sZW5ndGg7IGkgKz0gMikgewogICAgICBpZiAoa2V5ID09IF9rdlBhaXJzW2ldKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgX2t2UGFpcnMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgaWYgKHZhbHVlID09IF9rdlBhaXJzW2ldKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHNldCB2YWx1ZSBpbiB1bm1vZGlmaWFibGUgTWFwIik7CiAgfQoKICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3Qgc2V0IHZhbHVlIGluIHVubW9kaWZpYWJsZSBNYXAiKTsKICB9CgogIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgaWZBYnNlbnQoKSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBzZXQgdmFsdWUgaW4gdW5tb2RpZmlhYmxlIE1hcCIpOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2xlYXIgdW5tb2RpZmlhYmxlIE1hcCIpOwogIH0KCiAgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSB1bm1vZGlmaWFibGUgTWFwIik7CiAgfQoKICBJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZ2V0IGVudHJpZXMgPT4KICAgICAgbmV3IF9JbW11dGFibGVNYXBFbnRyeUl0ZXJhYmxlPEssIFY+KHRoaXMpOwoKICBNYXA8SzIsIFYyPiBtYXA8SzIsIFYyPihNYXBFbnRyeTxLMiwgVjI+IGYoSyBrZXksIFYgdmFsdWUpKSB7CiAgICB2YXIgcmVzdWx0ID0gPEsyLCBWMj57fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2t2UGFpcnMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgdmFyIGVudHJ5ID0gZihfa3ZQYWlyc1tpXSwgX2t2UGFpcnNbaSArIDFdKTsKICAgICAgcmVzdWx0W2VudHJ5LmtleV0gPSBlbnRyeS52YWx1ZTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIGFkZEVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IG5ld0VudHJpZXMpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBNYXAiKTsKICB9CgogIFYgdXBkYXRlKEsga2V5LCBWIHVwZGF0ZShWIHZhbHVlKSwge1YgaWZBYnNlbnQoKX0pIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBNYXAiKTsKICB9CgogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIE1hcCIpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHByZWRpY2F0ZShLIGtleSwgViB2YWx1ZSkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBNYXAiKTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+IE1hcEJhc2UubWFwVG9TdHJpbmcodGhpcyk7Cn0KCmNsYXNzIF9JbW11dGFibGVNYXBLZXlJdGVyYWJsZTxFPiBleHRlbmRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHsKICBmaW5hbCBfSW1tdXRhYmxlTWFwIF9tYXA7CiAgX0ltbXV0YWJsZU1hcEtleUl0ZXJhYmxlKHRoaXMuX21hcCk7CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IF9JbW11dGFibGVNYXBLZXlJdGVyYXRvcjxFPihfbWFwKTsKICB9CgogIGludCBnZXQgbGVuZ3RoID0+IF9tYXAubGVuZ3RoOwp9CgpjbGFzcyBfSW1tdXRhYmxlTWFwVmFsdWVJdGVyYWJsZTxFPiBleHRlbmRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHsKICBmaW5hbCBfSW1tdXRhYmxlTWFwIF9tYXA7CiAgX0ltbXV0YWJsZU1hcFZhbHVlSXRlcmFibGUodGhpcy5fbWFwKTsKCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBuZXcgX0ltbXV0YWJsZU1hcFZhbHVlSXRlcmF0b3I8RT4oX21hcCk7CiAgfQoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbWFwLmxlbmd0aDsKfQoKY2xhc3MgX0ltbXV0YWJsZU1hcEVudHJ5SXRlcmFibGU8SywgVj4KICAgIGV4dGVuZHMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IHsKICBmaW5hbCBfSW1tdXRhYmxlTWFwIF9tYXA7CiAgX0ltbXV0YWJsZU1hcEVudHJ5SXRlcmFibGUodGhpcy5fbWFwKTsKCiAgSXRlcmF0b3I8TWFwRW50cnk8SywgVj4+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IF9JbW11dGFibGVNYXBFbnRyeUl0ZXJhdG9yPEssIFY+KF9tYXApOwogIH0KCiAgaW50IGdldCBsZW5ndGggPT4gX21hcC5sZW5ndGg7Cn0KCmNsYXNzIF9JbW11dGFibGVNYXBLZXlJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICBfSW1tdXRhYmxlTWFwIF9tYXA7CiAgaW50IF9uZXh0SW5kZXggPSAwOwogIEUgX2N1cnJlbnQ7CgogIF9JbW11dGFibGVNYXBLZXlJdGVyYXRvcih0aGlzLl9tYXApOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaW50IG5ld0luZGV4ID0gX25leHRJbmRleDsKICAgIGlmIChuZXdJbmRleCA8IF9tYXAubGVuZ3RoKSB7CiAgICAgIF9uZXh0SW5kZXggPSBuZXdJbmRleCArIDE7CiAgICAgIF9jdXJyZW50ID0gX21hcC5fa3ZQYWlyc1tuZXdJbmRleCAqIDJdOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9jdXJyZW50ID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEUgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7Cn0KCmNsYXNzIF9JbW11dGFibGVNYXBWYWx1ZUl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogIF9JbW11dGFibGVNYXAgX21hcDsKICBpbnQgX25leHRJbmRleCA9IDA7CiAgRSBfY3VycmVudDsKCiAgX0ltbXV0YWJsZU1hcFZhbHVlSXRlcmF0b3IodGhpcy5fbWFwKTsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGludCBuZXdJbmRleCA9IF9uZXh0SW5kZXg7CiAgICBpZiAobmV3SW5kZXggPCBfbWFwLmxlbmd0aCkgewogICAgICBfbmV4dEluZGV4ID0gbmV3SW5kZXggKyAxOwogICAgICBfY3VycmVudCA9IF9tYXAuX2t2UGFpcnNbbmV3SW5kZXggKiAyICsgMV07CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX2N1cnJlbnQgPSBudWxsOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRSBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKfQoKY2xhc3MgX0ltbXV0YWJsZU1hcEVudHJ5SXRlcmF0b3I8SywgVj4gaW1wbGVtZW50cyBJdGVyYXRvcjxNYXBFbnRyeTxLLCBWPj4gewogIF9JbW11dGFibGVNYXAgX21hcDsKICBpbnQgX25leHRJbmRleCA9IDA7CiAgTWFwRW50cnk8SywgVj4gX2N1cnJlbnQ7CgogIF9JbW11dGFibGVNYXBFbnRyeUl0ZXJhdG9yKHRoaXMuX21hcCk7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpbnQgbmV3SW5kZXggPSBfbmV4dEluZGV4OwogICAgaWYgKG5ld0luZGV4IDwgX21hcC5sZW5ndGgpIHsKICAgICAgX25leHRJbmRleCA9IG5ld0luZGV4ICsgMTsKICAgICAgX2N1cnJlbnQgPSBuZXcgTWFwRW50cnk8SywgVj4oCiAgICAgICAgICBfbWFwLl9rdlBhaXJzW25ld0luZGV4ICogMl0sIF9tYXAuX2t2UGFpcnNbbmV3SW5kZXggKiAyICsgMV0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9jdXJyZW50ID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIE1hcEVudHJ5PEssIFY+IGdldCBjdXJyZW50ID0+IF9jdXJyZW50Owp9CoDeAE5OPAEeAT1DKhoxIQEcPCIBQh5IRxU3ICAIBhEEARUhBAEjARMhBAEpMycGBAEZMgQBGzQEASEzIBUIBhIEASUzIhUIBhIEASZIBAEhSAQBJ0gEARFBBAEZRwQBKjIBQB0zMycGEwQBOUUEATdFBAEtRQQBNUUEATICAUccJwEdMgQBIQIBSRwpAR00BAEhAgEnNhwpASo3BAEhAgE7FhYOAScBFB8iIS4TBhUSBAEdAgE9FhYOASkBFB8iITITBhUSBAEdAgFNFhYbASkBFB8iISVJEwYVEgQBKgIBImRhcnQ6Y29yZS1wYXRjaC9pbW11dGFibGVfbWFwLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9pbnRlZ2Vycy5kYXJ0wABa0y8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKYWJzdHJhY3QgY2xhc3MgX0ludGVnZXJJbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRzIGludCB7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBAcHJhZ21hKCJ2bTpuZXZlci1pbmxpbmUiKQogIG51bSBvcGVyYXRvciArKG51bSBvdGhlcikgPT4gb3RoZXIuX2FkZEZyb21JbnRlZ2VyKHRoaXMpOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgQHByYWdtYSgidm06bmV2ZXItaW5saW5lIikKICBudW0gb3BlcmF0b3IgLShudW0gb3RoZXIpID0+IG90aGVyLl9zdWJGcm9tSW50ZWdlcih0aGlzKTsKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIEBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCiAgbnVtIG9wZXJhdG9yICoobnVtIG90aGVyKSA9PiBvdGhlci5fbXVsRnJvbUludGVnZXIodGhpcyk7CgogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgQHByYWdtYSgidm06bmV2ZXItaW5saW5lIikKICBpbnQgb3BlcmF0b3Igfi8obnVtIG90aGVyKSB7CiAgICBpZiAoKG90aGVyIGlzIGludCkgJiYgKG90aGVyID09IDApKSB7CiAgICAgIHRocm93IGNvbnN0IEludGVnZXJEaXZpc2lvbkJ5WmVyb0V4Y2VwdGlvbigpOwogICAgfQogICAgcmV0dXJuIG90aGVyLl90cnVuY0RpdkZyb21JbnRlZ2VyKHRoaXMpOwogIH0KCiAgZG91YmxlIG9wZXJhdG9yIC8obnVtIG90aGVyKSB7CiAgICByZXR1cm4gdGhpcy50b0RvdWJsZSgpIC8gb3RoZXIudG9Eb3VibGUoKTsKICB9CgogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgbnVtIG9wZXJhdG9yICUobnVtIG90aGVyKSB7CiAgICBpZiAoKG90aGVyIGlzIGludCkgJiYgKG90aGVyID09IDApKSB7CiAgICAgIHRocm93IGNvbnN0IEludGVnZXJEaXZpc2lvbkJ5WmVyb0V4Y2VwdGlvbigpOwogICAgfQogICAgcmV0dXJuIG90aGVyLl9tb2R1bG9Gcm9tSW50ZWdlcih0aGlzKTsKICB9CgogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgQHByYWdtYSgidm06bmV2ZXItaW5saW5lIikKICBpbnQgb3BlcmF0b3IgLSgpIHsKICAgIHJldHVybiAwIC0gdGhpczsKICB9CgogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgQHByYWdtYSgidm06bmV2ZXItaW5saW5lIikKICBpbnQgb3BlcmF0b3IgJihpbnQgb3RoZXIpID0+IG90aGVyLl9iaXRBbmRGcm9tSW50ZWdlcih0aGlzKTsKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIEBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCiAgaW50IG9wZXJhdG9yIHwoaW50IG90aGVyKSA9PiBvdGhlci5fYml0T3JGcm9tSW50ZWdlcih0aGlzKTsKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIEBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCiAgaW50IG9wZXJhdG9yIF4oaW50IG90aGVyKSA9PiBvdGhlci5fYml0WG9yRnJvbUludGVnZXIodGhpcyk7CgogIG51bSByZW1haW5kZXIobnVtIG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIuX3JlbWFpbmRlckZyb21JbnRlZ2VyKHRoaXMpOwogIH0KCiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgX2JpdEFuZEZyb21TbWkoX1NtaSBvdGhlcikgbmF0aXZlICJJbnRlZ2VyX2JpdEFuZEZyb21JbnRlZ2VyIjsKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBfYml0QW5kRnJvbUludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkludGVnZXJfYml0QW5kRnJvbUludGVnZXIiOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IF9iaXRPckZyb21JbnRlZ2VyKGludCBvdGhlcikgbmF0aXZlICJJbnRlZ2VyX2JpdE9yRnJvbUludGVnZXIiOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IF9iaXRYb3JGcm9tSW50ZWdlcihpbnQgb3RoZXIpIG5hdGl2ZSAiSW50ZWdlcl9iaXRYb3JGcm9tSW50ZWdlciI7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgX3NockZyb21JbnRlZ2VyKGludCBvdGhlcikgbmF0aXZlICJJbnRlZ2VyX3NockZyb21JbnRlZ2VyIjsKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBfc2hsRnJvbUludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkludGVnZXJfc2hsRnJvbUludGVnZXIiOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IF9hZGRGcm9tSW50ZWdlcihpbnQgb3RoZXIpIG5hdGl2ZSAiSW50ZWdlcl9hZGRGcm9tSW50ZWdlciI7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgX3N1YkZyb21JbnRlZ2VyKGludCBvdGhlcikgbmF0aXZlICJJbnRlZ2VyX3N1YkZyb21JbnRlZ2VyIjsKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBfbXVsRnJvbUludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkludGVnZXJfbXVsRnJvbUludGVnZXIiOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IF90cnVuY0RpdkZyb21JbnRlZ2VyKGludCBvdGhlcikgbmF0aXZlICJJbnRlZ2VyX3RydW5jRGl2RnJvbUludGVnZXIiOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IF9tb2R1bG9Gcm9tSW50ZWdlcihpbnQgb3RoZXIpIG5hdGl2ZSAiSW50ZWdlcl9tb2R1bG9Gcm9tSW50ZWdlciI7CiAgaW50IF9yZW1haW5kZXJGcm9tSW50ZWdlcihpbnQgb3RoZXIpIHsKICAgIHJldHVybiBvdGhlciAtIChvdGhlciB+LyB0aGlzKSAqIHRoaXM7CiAgfQoKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIEBwcmFnbWEoInZtOm5ldmVyLWlubGluZSIpCiAgaW50IG9wZXJhdG9yID4+KGludCBvdGhlcikgPT4gb3RoZXIuX3NockZyb21JbnRlZ2VyKHRoaXMpOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgQHByYWdtYSgidm06bmV2ZXItaW5saW5lIikKICBpbnQgb3BlcmF0b3IgPDwoaW50IG90aGVyKSA9PiBvdGhlci5fc2hsRnJvbUludGVnZXIodGhpcyk7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBAcHJhZ21hKCJ2bTpuZXZlci1pbmxpbmUiKQogIGJvb2wgb3BlcmF0b3IgPChudW0gb3RoZXIpIHsKICAgIHJldHVybiBvdGhlciA+IHRoaXM7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgQHByYWdtYSgidm06bmV2ZXItaW5saW5lIikKICBib29sIG9wZXJhdG9yID4obnVtIG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIuX2dyZWF0ZXJUaGFuRnJvbUludGVnZXIodGhpcyk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgQHByYWdtYSgidm06bmV2ZXItaW5saW5lIikKICBib29sIG9wZXJhdG9yID49KG51bSBvdGhlcikgewogICAgcmV0dXJuICh0aGlzID09IG90aGVyKSB8fCAodGhpcyA+IG90aGVyKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBAcHJhZ21hKCJ2bTpuZXZlci1pbmxpbmUiKQogIGJvb2wgb3BlcmF0b3IgPD0obnVtIG90aGVyKSB7CiAgICByZXR1cm4gKHRoaXMgPT0gb3RoZXIpIHx8ICh0aGlzIDwgb3RoZXIpOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgX2dyZWF0ZXJUaGFuRnJvbUludGVnZXIoaW50IG90aGVyKQogICAgICBuYXRpdmUgIkludGVnZXJfZ3JlYXRlclRoYW5Gcm9tSW50ZWdlciI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBAcHJhZ21hKCJ2bTpuZXZlci1pbmxpbmUiKQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMgbnVtKSB7CiAgICAgIHJldHVybiBvdGhlci5fZXF1YWxUb0ludGVnZXIodGhpcyk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBfZXF1YWxUb0ludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkludGVnZXJfZXF1YWxUb0ludGVnZXIiOwogIGludCBhYnMoKSB7CiAgICByZXR1cm4gdGhpcyA8IDAgPyAtdGhpcyA6IHRoaXM7CiAgfQoKICBpbnQgZ2V0IHNpZ24gewogICAgcmV0dXJuICh0aGlzID4gMCkgPyAxIDogKHRoaXMgPCAwKSA/IC0xIDogMDsKICB9CgogIGJvb2wgZ2V0IGlzRXZlbiA9PiAoKHRoaXMgJiAxKSA9PSAwKTsKICBib29sIGdldCBpc09kZCA9PiAhaXNFdmVuOwogIGJvb2wgZ2V0IGlzTmFOID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgPT4gdGhpcyA8IDA7CiAgYm9vbCBnZXQgaXNJbmZpbml0ZSA9PiBmYWxzZTsKICBib29sIGdldCBpc0Zpbml0ZSA9PiB0cnVlOwoKICBpbnQgdG9VbnNpZ25lZChpbnQgd2lkdGgpIHsKICAgIHJldHVybiB0aGlzICYgKCgxIDw8IHdpZHRoKSAtIDEpOwogIH0KCiAgaW50IHRvU2lnbmVkKGludCB3aWR0aCkgewogICAgLy8gVGhlIHZhbHVlIG9mIGJpbmFyeSBudW1iZXIgd2VpZ2h0cyBlYWNoIGJpdCBieSBhIHBvd2VyIG9mIHR3by4gIFRoZQogICAgLy8gdHdvcy1jb21wbGVtZW50IHZhbHVlIHdlaWdodHMgdGhlIHNpZ24gYml0IG5lZ2F0aXZlbHkuICBXZSBjb21wdXRlIHRoZQogICAgLy8gdmFsdWUgb2YgdGhlIG5lZ2F0aXZlIHdlaWdodGluZyBieSBpc29sYXRpbmcgdGhlIHNpZ24gYml0IHdpdGggdGhlCiAgICAvLyBjb3JyZWN0IHBvd2VyIG9mIHR3byB3ZWlnaHRpbmcgYW5kIHN1YnRyYWN0aW5nIGl0IGZyb20gdGhlIHZhbHVlIG9mIHRoZQogICAgLy8gbG93ZXIgYml0cy4KICAgIGludCBzaWduTWFzayA9IDEgPDwgKHdpZHRoIC0gMSk7CiAgICByZXR1cm4gKHRoaXMgJiAoc2lnbk1hc2sgLSAxKSkgLSAodGhpcyAmIHNpZ25NYXNrKTsKICB9CgogIGludCBjb21wYXJlVG8obnVtIG90aGVyKSB7CiAgICBjb25zdCBpbnQgRVFVQUwgPSAwLCBMRVNTID0gLTEsIEdSRUFURVIgPSAxOwogICAgaWYgKG90aGVyIGlzIGRvdWJsZSkgewogICAgICBjb25zdCBpbnQgTUFYX0VYQUNUX0lOVF9UT19ET1VCTEUgPSA5MDA3MTk5MjU0NzQwOTkyOyAvLyAyXjUzLgogICAgICBjb25zdCBpbnQgTUlOX0VYQUNUX0lOVF9UT19ET1VCTEUgPSAtTUFYX0VYQUNUX0lOVF9UT19ET1VCTEU7CiAgICAgIGNvbnN0IGJvb2wgbGltaXRJbnRzVG82NEJpdHMgPSAoKDEgPDwgNjQpID09IDApOwogICAgICBpZiAobGltaXRJbnRzVG82NEJpdHMpIHsKICAgICAgICAvLyBXaXRoIGludGVnZXJzIGxpbWl0ZWQgdG8gNjQgYml0cywgZG91YmxlLnRvSW50KCkgY2xhbXBzCiAgICAgICAgLy8gZG91YmxlIHZhbHVlIHRvIGZpdCBpbnRvIHRoZSBNSU5fSU5UNjQuLk1BWF9JTlQ2NCByYW5nZS4KICAgICAgICAvLyBDaGVjayBpZiB0aGUgZG91YmxlIHZhbHVlIGlzIG91dHNpZGUgb2YgdGhpcyByYW5nZS4KICAgICAgICAvLyBUaGlzIGNoZWNrIGhhbmRsZXMgKy8taW5maW5pdHkgYXMgd2VsbC4KICAgICAgICBjb25zdCBkb3VibGUgbWluSW50NjRBc0RvdWJsZSA9IC05MjIzMzcyMDM2ODU0Nzc1ODA4LjA7CiAgICAgICAgLy8gTUFYX0lOVDY0IGlzIG5vdCBwcmVjaXNlbHkgcmVwcmVzZW50YWJsZSBpbiBkb3VibGVzLCBzbwogICAgICAgIC8vIGNoZWNrIGFnYWluc3QgKE1BWF9JTlQ2NCArIDEpLgogICAgICAgIGNvbnN0IGRvdWJsZSBtYXhJbnQ2NFBsdXMxQXNEb3VibGUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA4LjA7CiAgICAgICAgaWYgKG90aGVyIDwgbWluSW50NjRBc0RvdWJsZSkgewogICAgICAgICAgcmV0dXJuIEdSRUFURVI7CiAgICAgICAgfSBlbHNlIGlmIChvdGhlciA+PSBtYXhJbnQ2NFBsdXMxQXNEb3VibGUpIHsKICAgICAgICAgIHJldHVybiBMRVNTOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAob3RoZXIuaXNJbmZpbml0ZSkgewogICAgICAgICAgcmV0dXJuIG90aGVyLmlzTmVnYXRpdmUgPyBHUkVBVEVSIDogTEVTUzsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG90aGVyLmlzTmFOKSB7CiAgICAgICAgcmV0dXJuIExFU1M7CiAgICAgIH0KICAgICAgaWYgKE1JTl9FWEFDVF9JTlRfVE9fRE9VQkxFIDw9IHRoaXMgJiYgdGhpcyA8PSBNQVhfRVhBQ1RfSU5UX1RPX0RPVUJMRSkgewogICAgICAgIC8vIExldCB0aGUgZG91YmxlIGltcGxlbWVudGF0aW9uIGRlYWwgd2l0aCAtMC4wLgogICAgICAgIHJldHVybiAtKG90aGVyLmNvbXBhcmVUbyh0aGlzLnRvRG91YmxlKCkpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBJZiBhYnMob3RoZXIpID4gTUFYX0VYQUNUX0lOVF9UT19ET1VCTEUsIHRoZW4gb3RoZXIgaGFzIGFuIGludGVnZXIKICAgICAgICAvLyB2YWx1ZSAobm8gYml0cyBiZWxvdyB0aGUgZGVjaW1hbCBwb2ludCkuCiAgICAgICAgb3RoZXIgPSBvdGhlci50b0ludCgpOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcyA8IG90aGVyKSB7CiAgICAgIHJldHVybiBMRVNTOwogICAgfSBlbHNlIGlmICh0aGlzID4gb3RoZXIpIHsKICAgICAgcmV0dXJuIEdSRUFURVI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gRVFVQUw7CiAgICB9CiAgfQoKICBpbnQgcm91bmQoKSB7CiAgICByZXR1cm4gdGhpczsKICB9CgogIGludCBmbG9vcigpIHsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgaW50IGNlaWwoKSB7CiAgICByZXR1cm4gdGhpczsKICB9CgogIGludCB0cnVuY2F0ZSgpIHsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgZG91YmxlIHJvdW5kVG9Eb3VibGUoKSB7CiAgICByZXR1cm4gdGhpcy50b0RvdWJsZSgpOwogIH0KCiAgZG91YmxlIGZsb29yVG9Eb3VibGUoKSB7CiAgICByZXR1cm4gdGhpcy50b0RvdWJsZSgpOwogIH0KCiAgZG91YmxlIGNlaWxUb0RvdWJsZSgpIHsKICAgIHJldHVybiB0aGlzLnRvRG91YmxlKCk7CiAgfQoKICBkb3VibGUgdHJ1bmNhdGVUb0RvdWJsZSgpIHsKICAgIHJldHVybiB0aGlzLnRvRG91YmxlKCk7CiAgfQoKICBudW0gY2xhbXAobnVtIGxvd2VyTGltaXQsIG51bSB1cHBlckxpbWl0KSB7CiAgICBpZiAobG93ZXJMaW1pdCBpcyEgbnVtKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKGxvd2VyTGltaXQsICJsb3dlckxpbWl0IiwgIm5vdCBhIG51bWJlciIpOwogICAgfQogICAgaWYgKHVwcGVyTGltaXQgaXMhIG51bSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSh1cHBlckxpbWl0LCAidXBwZXJMaW1pdCIsICJub3QgYSBudW1iZXIiKTsKICAgIH0KCiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGludGVnZXJzLgogICAgaWYgKGxvd2VyTGltaXQgaXMgaW50ICYmIHVwcGVyTGltaXQgaXMgaW50ICYmIGxvd2VyTGltaXQgPD0gdXBwZXJMaW1pdCkgewogICAgICBpZiAodGhpcyA8IGxvd2VyTGltaXQpIHJldHVybiBsb3dlckxpbWl0OwogICAgICBpZiAodGhpcyA+IHVwcGVyTGltaXQpIHJldHVybiB1cHBlckxpbWl0OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIC8vIEdlbmVyaWMgY2FzZSBpbnZvbHZpbmcgZG91YmxlcywgYW5kIGludmFsaWQgaW50ZWdlciByYW5nZXMuCiAgICBpZiAobG93ZXJMaW1pdC5jb21wYXJlVG8odXBwZXJMaW1pdCkgPiAwKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKGxvd2VyTGltaXQpOwogICAgfQogICAgaWYgKGxvd2VyTGltaXQuaXNOYU4pIHJldHVybiBsb3dlckxpbWl0OwogICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IG5lZWQgdG8gY2FyZSBmb3IgLTAuMCBmb3IgdGhlIGxvd2VyIGxpbWl0LgogICAgaWYgKHRoaXMgPCBsb3dlckxpbWl0KSByZXR1cm4gbG93ZXJMaW1pdDsKICAgIGlmICh0aGlzLmNvbXBhcmVUbyh1cHBlckxpbWl0KSA+IDApIHJldHVybiB1cHBlckxpbWl0OwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBpbnQgdG9JbnQoKSB7CiAgICByZXR1cm4gdGhpczsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgdG9Eb3VibGUoKSB7CiAgICByZXR1cm4gbmV3IF9Eb3VibGUuZnJvbUludGVnZXIodGhpcyk7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmdBc0ZpeGVkKGludCBmcmFjdGlvbkRpZ2l0cykgewogICAgcmV0dXJuIHRoaXMudG9Eb3VibGUoKS50b1N0cmluZ0FzRml4ZWQoZnJhY3Rpb25EaWdpdHMpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nQXNFeHBvbmVudGlhbChbaW50IGZyYWN0aW9uRGlnaXRzXSkgewogICAgcmV0dXJuIHRoaXMudG9Eb3VibGUoKS50b1N0cmluZ0FzRXhwb25lbnRpYWwoZnJhY3Rpb25EaWdpdHMpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nQXNQcmVjaXNpb24oaW50IHByZWNpc2lvbikgewogICAgcmV0dXJuIHRoaXMudG9Eb3VibGUoKS50b1N0cmluZ0FzUHJlY2lzaW9uKHByZWNpc2lvbik7CiAgfQoKICBzdGF0aWMgY29uc3QgX2RpZ2l0cyA9ICIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOwoKICBTdHJpbmcgdG9SYWRpeFN0cmluZyhpbnQgcmFkaXgpIHsKICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShyYWRpeCwgMiwgMzYsICJyYWRpeCIpOwogICAgfQogICAgaWYgKHJhZGl4ICYgKHJhZGl4IC0gMSkgPT0gMCkgewogICAgICByZXR1cm4gX3RvUG93MlN0cmluZyhyYWRpeCk7CiAgICB9CiAgICBpZiAocmFkaXggPT0gMTApIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7CiAgICBmaW5hbCBib29sIGlzTmVnYXRpdmUgPSB0aGlzIDwgMDsKICAgIGludCB2YWx1ZSA9IGlzTmVnYXRpdmUgPyAtdGhpcyA6IHRoaXM7CiAgICBpZiAodmFsdWUgPCAwKSB7CiAgICAgIC8vIFdpdGggaW50ZWdlcnMgbGltaXRlZCB0byA2NCBiaXRzLCB0aGUgdmFsdWUKICAgICAgLy8gTUlOX0lOVDY0ID0gLTB4ODAwMDAwMDAwMDAwMDAwMCBvdmVyZmxvd3MgYXQgbmVnYXRpb246CiAgICAgIC8vIC1NSU5fSU5UNjQgPT0gTUlOX0lOVDY0LCBzbyBpdCByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLgogICAgICByZXR1cm4gX21pbkludDY0VG9SYWRpeFN0cmluZyhyYWRpeCk7CiAgICB9CiAgICBMaXN0IHRlbXAgPSBuZXcgTGlzdCgpOwogICAgZG8gewogICAgICBpbnQgZGlnaXQgPSB2YWx1ZSAlIHJhZGl4OwogICAgICB2YWx1ZSB+Lz0gcmFkaXg7CiAgICAgIHRlbXAuYWRkKF9kaWdpdHMuY29kZVVuaXRBdChkaWdpdCkpOwogICAgfSB3aGlsZSAodmFsdWUgPiAwKTsKICAgIGlmIChpc05lZ2F0aXZlKSB0ZW1wLmFkZCgweDJkKTsgLy8gJy0nLgoKICAgIF9PbmVCeXRlU3RyaW5nIHN0cmluZyA9IF9PbmVCeXRlU3RyaW5nLl9hbGxvY2F0ZSh0ZW1wLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMCwgaiA9IHRlbXAubGVuZ3RoOyBqID4gMDsgaSsrKSB7CiAgICAgIHN0cmluZy5fc2V0QXQoaSwgdGVtcFstLWpdKTsKICAgIH0KICAgIHJldHVybiBzdHJpbmc7CiAgfQoKICBTdHJpbmcgX3RvUG93MlN0cmluZyhpbnQgcmFkaXgpIHsKICAgIGludCB2YWx1ZSA9IHRoaXM7CiAgICBpZiAodmFsdWUgPT0gMCkgcmV0dXJuICIwIjsKICAgIGFzc2VydChyYWRpeCAmIChyYWRpeCAtIDEpID09IDApOwogICAgdmFyIG5lZ2F0aXZlID0gdmFsdWUgPCAwOwogICAgdmFyIGJpdHNQZXJEaWdpdCA9IHJhZGl4LmJpdExlbmd0aCAtIDE7CiAgICB2YXIgbGVuZ3RoID0gMDsKICAgIGlmIChuZWdhdGl2ZSkgewogICAgICB2YWx1ZSA9IC12YWx1ZTsKICAgICAgbGVuZ3RoID0gMTsKICAgICAgaWYgKHZhbHVlIDwgMCkgewogICAgICAgIC8vIFdpdGggaW50ZWdlcnMgbGltaXRlZCB0byA2NCBiaXRzLCB0aGUgdmFsdWUKICAgICAgICAvLyBNSU5fSU5UNjQgPSAtMHg4MDAwMDAwMDAwMDAwMDAwIG92ZXJmbG93cyBhdCBuZWdhdGlvbjoKICAgICAgICAvLyAtTUlOX0lOVDY0ID09IE1JTl9JTlQ2NCwgc28gaXQgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZy4KICAgICAgICByZXR1cm4gX21pbkludDY0VG9SYWRpeFN0cmluZyhyYWRpeCk7CiAgICAgIH0KICAgIH0KICAgIC8vIEludGVnZXIgZGl2aXNpb24sIHJvdW5kaW5nIHVwLCB0byBmaW5kIG51bWJlciBvZiBfZGlnaXRzLgogICAgbGVuZ3RoICs9ICh2YWx1ZS5iaXRMZW5ndGggKyBiaXRzUGVyRGlnaXQgLSAxKSB+LyBiaXRzUGVyRGlnaXQ7CiAgICBfT25lQnl0ZVN0cmluZyBzdHJpbmcgPSBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUobGVuZ3RoKTsKICAgIHN0cmluZy5fc2V0QXQoMCwgMHgyZCk7IC8vICctJy4gSXMgb3ZlcndyaXR0ZW4gaWYgbm90IG5lZ2F0aXZlLgogICAgdmFyIG1hc2sgPSByYWRpeCAtIDE7CiAgICBkbyB7CiAgICAgIHN0cmluZy5fc2V0QXQoLS1sZW5ndGgsIF9kaWdpdHMuY29kZVVuaXRBdCh2YWx1ZSAmIG1hc2spKTsKICAgICAgdmFsdWUgPj49IGJpdHNQZXJEaWdpdDsKICAgIH0gd2hpbGUgKHZhbHVlID4gMCk7CiAgICByZXR1cm4gc3RyaW5nOwogIH0KCiAgLy8vIENvbnZlcnRzIG5lZ2F0aXZlIHZhbHVlIHRvIHJhZGl4IHN0cmluZy4KICAvLy8gVGhpcyBtZXRob2QgaXMgb25seSB1c2VkIHRvIGhhbmRsZSBjb3JuZXIgY2FzZSBvZgogIC8vLyBNSU5fSU5UNjQgPSAtMHg4MDAwMDAwMDAwMDAwMDAwLgogIFN0cmluZyBfbWluSW50NjRUb1JhZGl4U3RyaW5nKGludCByYWRpeCkgewogICAgTGlzdCB0ZW1wID0gbmV3IExpc3QoKTsKICAgIGludCB2YWx1ZSA9IHRoaXM7CiAgICBhc3NlcnQodmFsdWUgPCAwKTsKICAgIGRvIHsKICAgICAgaW50IGRpZ2l0ID0gLXZhbHVlLnJlbWFpbmRlcihyYWRpeCk7CiAgICAgIHZhbHVlIH4vPSByYWRpeDsKICAgICAgdGVtcC5hZGQoX2RpZ2l0cy5jb2RlVW5pdEF0KGRpZ2l0KSk7CiAgICB9IHdoaWxlICh2YWx1ZSAhPSAwKTsKICAgIHRlbXAuYWRkKDB4MmQpOyAvLyAnLScuCgogICAgX09uZUJ5dGVTdHJpbmcgc3RyaW5nID0gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKHRlbXAubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwLCBqID0gdGVtcC5sZW5ndGg7IGogPiAwOyBpKyspIHsKICAgICAgc3RyaW5nLl9zZXRBdChpLCB0ZW1wWy0tal0pOwogICAgfQogICAgcmV0dXJuIHN0cmluZzsKICB9CgogIC8vIFJldHVybnMgcG93KHRoaXMsIGUpICUgbS4KICBpbnQgbW9kUG93KGludCBlLCBpbnQgbSkgewogICAgaWYgKGUgaXMhIGludCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShlLCAiZXhwb25lbnQiLCAibm90IGFuIGludGVnZXIiKTsKICAgIH0KICAgIGlmIChtIGlzISBpbnQpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUobSwgIm1vZHVsdXMiLCAibm90IGFuIGludGVnZXIiKTsKICAgIH0KICAgIGlmIChlIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoZSwgMCwgbnVsbCwgImV4cG9uZW50Iik7CiAgICBpZiAobSA8PSAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShtLCAxLCBudWxsLCAibW9kdWx1cyIpOwogICAgaWYgKGUgPT0gMCkgcmV0dXJuIDE7CgogICAgLy8gVGhpcyBpcyBmbG9vcihzcXJ0KDJeNjMpKS4KICAgIGNvbnN0IGludCBtYXhWYWx1ZVRoYXRDYW5CZVNxdWFyZWRXaXRob3V0VHJ1bmNhdGlvbiA9IDMwMzcwMDA0OTk7CiAgICBpZiAobSA+IG1heFZhbHVlVGhhdENhbkJlU3F1YXJlZFdpdGhvdXRUcnVuY2F0aW9uKSB7CiAgICAgIC8vIFVzZSBCaWdJbnQgdmVyc2lvbiB0byBhdm9pZCB0cnVuY2F0aW9uIGluIG11bHRpcGxpY2F0aW9ucyBiZWxvdy4KICAgICAgcmV0dXJuIEJpZ0ludC5mcm9tKHRoaXMpLm1vZFBvdyhCaWdJbnQuZnJvbShlKSwgQmlnSW50LmZyb20obSkpLnRvSW50KCk7CiAgICB9CgogICAgaW50IGIgPSB0aGlzOwogICAgaWYgKGIgPCAwIHx8IGIgPiBtKSB7CiAgICAgIGIgJT0gbTsKICAgIH0KICAgIGludCByID0gMTsKICAgIHdoaWxlIChlID4gMCkgewogICAgICBpZiAoZS5pc09kZCkgewogICAgICAgIHIgPSAociAqIGIpICUgbTsKICAgICAgfQogICAgICBlID4+PSAxOwogICAgICBiID0gKGIgKiBiKSAlIG07CiAgICB9CiAgICByZXR1cm4gcjsKICB9CgogIC8vIElmIGludiBpcyBmYWxzZSwgcmV0dXJucyBnY2QoeCwgeSkuCiAgLy8gSWYgaW52IGlzIHRydWUgYW5kIGdjZCh4LCB5KSA9IDEsIHJldHVybnMgZCwgc28gdGhhdCBjKnggKyBkKnkgPSAxLgogIC8vIElmIGludiBpcyB0cnVlIGFuZCBnY2QoeCwgeSkgIT0gMSwgdGhyb3dzIEV4Y2VwdGlvbigiTm90IGNvcHJpbWUiKS4KICBzdGF0aWMgaW50IF9iaW5hcnlHY2QoaW50IHgsIGludCB5LCBib29sIGludikgewogICAgaW50IHMgPSAwOwogICAgaWYgKCFpbnYpIHsKICAgICAgd2hpbGUgKHguaXNFdmVuICYmIHkuaXNFdmVuKSB7CiAgICAgICAgeCA+Pj0gMTsKICAgICAgICB5ID4+PSAxOwogICAgICAgIHMrKzsKICAgICAgfQogICAgICBpZiAoeS5pc09kZCkgewogICAgICAgIHZhciB0ID0geDsKICAgICAgICB4ID0geTsKICAgICAgICB5ID0gdDsKICAgICAgfQogICAgfQogICAgZmluYWwgYm9vbCBhYyA9IHguaXNFdmVuOwogICAgaW50IHUgPSB4OwogICAgaW50IHYgPSB5OwogICAgaW50IGEgPSAxLCBiID0gMCwgYyA9IDAsIGQgPSAxOwogICAgZG8gewogICAgICB3aGlsZSAodS5pc0V2ZW4pIHsKICAgICAgICB1ID4+PSAxOwogICAgICAgIGlmIChhYykgewogICAgICAgICAgaWYgKCFhLmlzRXZlbiB8fCAhYi5pc0V2ZW4pIHsKICAgICAgICAgICAgYSArPSB5OwogICAgICAgICAgICBiIC09IHg7CiAgICAgICAgICB9CiAgICAgICAgICBhID4+PSAxOwogICAgICAgIH0gZWxzZSBpZiAoIWIuaXNFdmVuKSB7CiAgICAgICAgICBiIC09IHg7CiAgICAgICAgfQogICAgICAgIGIgPj49IDE7CiAgICAgIH0KICAgICAgd2hpbGUgKHYuaXNFdmVuKSB7CiAgICAgICAgdiA+Pj0gMTsKICAgICAgICBpZiAoYWMpIHsKICAgICAgICAgIGlmICghYy5pc0V2ZW4gfHwgIWQuaXNFdmVuKSB7CiAgICAgICAgICAgIGMgKz0geTsKICAgICAgICAgICAgZCAtPSB4OwogICAgICAgICAgfQogICAgICAgICAgYyA+Pj0gMTsKICAgICAgICB9IGVsc2UgaWYgKCFkLmlzRXZlbikgewogICAgICAgICAgZCAtPSB4OwogICAgICAgIH0KICAgICAgICBkID4+PSAxOwogICAgICB9CiAgICAgIGlmICh1ID49IHYpIHsKICAgICAgICB1IC09IHY7CiAgICAgICAgaWYgKGFjKSBhIC09IGM7CiAgICAgICAgYiAtPSBkOwogICAgICB9IGVsc2UgewogICAgICAgIHYgLT0gdTsKICAgICAgICBpZiAoYWMpIGMgLT0gYTsKICAgICAgICBkIC09IGI7CiAgICAgIH0KICAgIH0gd2hpbGUgKHUgIT0gMCk7CiAgICBpZiAoIWludikgcmV0dXJuIHYgPDwgczsKICAgIGlmICh2ICE9IDEpIHsKICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm90IGNvcHJpbWUiKTsKICAgIH0KICAgIGlmIChkIDwgMCkgewogICAgICBkICs9IHg7CiAgICAgIGlmIChkIDwgMCkgZCArPSB4OwogICAgfSBlbHNlIGlmIChkID4geCkgewogICAgICBkIC09IHg7CiAgICAgIGlmIChkID4geCkgZCAtPSB4OwogICAgfQogICAgcmV0dXJuIGQ7CiAgfQoKICAvLyBSZXR1cm5zIDEvdGhpcyAlIG0sIHdpdGggbSA+IDAuCiAgaW50IG1vZEludmVyc2UoaW50IG0pIHsKICAgIGlmIChtIGlzISBpbnQpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUobSwgIm1vZHVsdXMiLCAibm90IGFuIGludGVnZXIiKTsKICAgIH0KICAgIGlmIChtIDw9IDApIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKG0sIDEsIG51bGwsICJtb2R1bHVzIik7CiAgICBpZiAobSA9PSAxKSByZXR1cm4gMDsKICAgIGludCB0ID0gdGhpczsKICAgIGlmICgodCA8IDApIHx8ICh0ID49IG0pKSB0ICU9IG07CiAgICBpZiAodCA9PSAxKSByZXR1cm4gMTsKICAgIGlmICgodCA9PSAwKSB8fCAodC5pc0V2ZW4gJiYgbS5pc0V2ZW4pKSB7CiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5vdCBjb3ByaW1lIik7CiAgICB9CiAgICByZXR1cm4gX2JpbmFyeUdjZChtLCB0LCB0cnVlKTsKICB9CgogIC8vIFJldHVybnMgZ2NkIG9mIGFicyh0aGlzKSBhbmQgYWJzKG90aGVyKS4KICBpbnQgZ2NkKGludCBvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBpbnQpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUob3RoZXIsICJvdGhlciIsICJub3QgYW4gaW50ZWdlciIpOwogICAgfQogICAgaW50IHggPSB0aGlzLmFicygpOwogICAgaW50IHkgPSBvdGhlci5hYnMoKTsKICAgIGlmICh4ID09IDApIHJldHVybiB5OwogICAgaWYgKHkgPT0gMCkgcmV0dXJuIHg7CiAgICBpZiAoKHggPT0gMSkgfHwgKHkgPT0gMSkpIHJldHVybiAxOwogICAgcmV0dXJuIF9iaW5hcnlHY2QoeCwgeSwgZmFsc2UpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfU21pIGV4dGVuZHMgX0ludGVnZXJJbXBsZW1lbnRhdGlvbiB7CiAgZmFjdG9yeSBfU21pLl91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93ICJVbnJlYWNoYWJsZSI7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRoaXM7CiAgaW50IGdldCBfaWRlbnRpdHlIYXNoQ29kZSA9PiB0aGlzOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgb3BlcmF0b3IgfigpIG5hdGl2ZSAiU21pX2JpdE5lZ2F0ZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBnZXQgYml0TGVuZ3RoIG5hdGl2ZSAiU21pX2JpdExlbmd0aCI7CgogIGludCBvcGVyYXRvciAmKGludCBvdGhlcikgPT4gb3RoZXIuX2JpdEFuZEZyb21TbWkodGhpcyk7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgX2JpdEFuZEZyb21TbWkoX1NtaSBvdGhlcikgbmF0aXZlICJTbWlfYml0QW5kRnJvbVNtaSI7CgogIC8qKgogICAqIFRoZSBkaWdpdHMgb2YgJzAwJywgJzAxJywgLi4uICc5OScgYXMgYSBzaW5nbGUgYXJyYXkuCiAgICoKICAgKiBHZXQgdGhlIGRpZ2l0cyBvZiBgbmAsIHdpdGggYDAgPD0gbiA8IDEwMGAsIGFzCiAgICogYF9kaWdpdFRhYmxlW24gKiAyXWAgYW5kIGBfZGlnaXRUYWJsZVtuICogMiArIDFdYC4KICAgKi8KICBzdGF0aWMgY29uc3QgX2RpZ2l0VGFibGUgPSBjb25zdCBbCiAgICAweDMwLCAweDMwLCAweDMwLCAweDMxLCAweDMwLCAweDMyLCAweDMwLCAweDMzLCAvLwogICAgMHgzMCwgMHgzNCwgMHgzMCwgMHgzNSwgMHgzMCwgMHgzNiwgMHgzMCwgMHgzNywgLy8KICAgIDB4MzAsIDB4MzgsIDB4MzAsIDB4MzksIDB4MzEsIDB4MzAsIDB4MzEsIDB4MzEsIC8vCiAgICAweDMxLCAweDMyLCAweDMxLCAweDMzLCAweDMxLCAweDM0LCAweDMxLCAweDM1LCAvLwogICAgMHgzMSwgMHgzNiwgMHgzMSwgMHgzNywgMHgzMSwgMHgzOCwgMHgzMSwgMHgzOSwgLy8KICAgIDB4MzIsIDB4MzAsIDB4MzIsIDB4MzEsIDB4MzIsIDB4MzIsIDB4MzIsIDB4MzMsIC8vCiAgICAweDMyLCAweDM0LCAweDMyLCAweDM1LCAweDMyLCAweDM2LCAweDMyLCAweDM3LCAvLwogICAgMHgzMiwgMHgzOCwgMHgzMiwgMHgzOSwgMHgzMywgMHgzMCwgMHgzMywgMHgzMSwgLy8KICAgIDB4MzMsIDB4MzIsIDB4MzMsIDB4MzMsIDB4MzMsIDB4MzQsIDB4MzMsIDB4MzUsIC8vCiAgICAweDMzLCAweDM2LCAweDMzLCAweDM3LCAweDMzLCAweDM4LCAweDMzLCAweDM5LCAvLwogICAgMHgzNCwgMHgzMCwgMHgzNCwgMHgzMSwgMHgzNCwgMHgzMiwgMHgzNCwgMHgzMywgLy8KICAgIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzUsIDB4MzQsIDB4MzYsIDB4MzQsIDB4MzcsIC8vCiAgICAweDM0LCAweDM4LCAweDM0LCAweDM5LCAweDM1LCAweDMwLCAweDM1LCAweDMxLCAvLwogICAgMHgzNSwgMHgzMiwgMHgzNSwgMHgzMywgMHgzNSwgMHgzNCwgMHgzNSwgMHgzNSwgLy8KICAgIDB4MzUsIDB4MzYsIDB4MzUsIDB4MzcsIDB4MzUsIDB4MzgsIDB4MzUsIDB4MzksIC8vCiAgICAweDM2LCAweDMwLCAweDM2LCAweDMxLCAweDM2LCAweDMyLCAweDM2LCAweDMzLCAvLwogICAgMHgzNiwgMHgzNCwgMHgzNiwgMHgzNSwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNywgLy8KICAgIDB4MzYsIDB4MzgsIDB4MzYsIDB4MzksIDB4MzcsIDB4MzAsIDB4MzcsIDB4MzEsIC8vCiAgICAweDM3LCAweDMyLCAweDM3LCAweDMzLCAweDM3LCAweDM0LCAweDM3LCAweDM1LCAvLwogICAgMHgzNywgMHgzNiwgMHgzNywgMHgzNywgMHgzNywgMHgzOCwgMHgzNywgMHgzOSwgLy8KICAgIDB4MzgsIDB4MzAsIDB4MzgsIDB4MzEsIDB4MzgsIDB4MzIsIDB4MzgsIDB4MzMsIC8vCiAgICAweDM4LCAweDM0LCAweDM4LCAweDM1LCAweDM4LCAweDM2LCAweDM4LCAweDM3LCAvLwogICAgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOSwgMHgzOSwgMHgzMCwgMHgzOSwgMHgzMSwgLy8KICAgIDB4MzksIDB4MzIsIDB4MzksIDB4MzMsIDB4MzksIDB4MzQsIDB4MzksIDB4MzUsIC8vCiAgICAweDM5LCAweDM2LCAweDM5LCAweDM3LCAweDM5LCAweDM4LCAweDM5LCAweDM5LCAvLwogIF07CgogIC8qKgogICAqIFJlc3VsdCBvZiBpbnQudG9TdHJpbmcgZm9yIC05OSwgLTk4LCAuLi4sIDk4LCA5OS4KICAgKi8KICBzdGF0aWMgY29uc3QgX3NtYWxsTG9va3VwVGFibGUgPSBjb25zdCBbCiAgICAiLTk5IiwgIi05OCIsICItOTciLCAiLTk2IiwgIi05NSIsICItOTQiLCAiLTkzIiwgIi05MiIsICItOTEiLCAiLTkwIiwgLy8KICAgICItODkiLCAiLTg4IiwgIi04NyIsICItODYiLCAiLTg1IiwgIi04NCIsICItODMiLCAiLTgyIiwgIi04MSIsICItODAiLCAvLwogICAgIi03OSIsICItNzgiLCAiLTc3IiwgIi03NiIsICItNzUiLCAiLTc0IiwgIi03MyIsICItNzIiLCAiLTcxIiwgIi03MCIsIC8vCiAgICAiLTY5IiwgIi02OCIsICItNjciLCAiLTY2IiwgIi02NSIsICItNjQiLCAiLTYzIiwgIi02MiIsICItNjEiLCAiLTYwIiwgLy8KICAgICItNTkiLCAiLTU4IiwgIi01NyIsICItNTYiLCAiLTU1IiwgIi01NCIsICItNTMiLCAiLTUyIiwgIi01MSIsICItNTAiLCAvLwogICAgIi00OSIsICItNDgiLCAiLTQ3IiwgIi00NiIsICItNDUiLCAiLTQ0IiwgIi00MyIsICItNDIiLCAiLTQxIiwgIi00MCIsIC8vCiAgICAiLTM5IiwgIi0zOCIsICItMzciLCAiLTM2IiwgIi0zNSIsICItMzQiLCAiLTMzIiwgIi0zMiIsICItMzEiLCAiLTMwIiwgLy8KICAgICItMjkiLCAiLTI4IiwgIi0yNyIsICItMjYiLCAiLTI1IiwgIi0yNCIsICItMjMiLCAiLTIyIiwgIi0yMSIsICItMjAiLCAvLwogICAgIi0xOSIsICItMTgiLCAiLTE3IiwgIi0xNiIsICItMTUiLCAiLTE0IiwgIi0xMyIsICItMTIiLCAiLTExIiwgIi0xMCIsIC8vCiAgICAiLTkiLCAiLTgiLCAiLTciLCAiLTYiLCAiLTUiLCAiLTQiLCAiLTMiLCAiLTIiLCAiLTEiLCAiMCIsIC8vCiAgICAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiMTAiLCAvLwogICAgIjExIiwgIjEyIiwgIjEzIiwgIjE0IiwgIjE1IiwgIjE2IiwgIjE3IiwgIjE4IiwgIjE5IiwgIjIwIiwgLy8KICAgICIyMSIsICIyMiIsICIyMyIsICIyNCIsICIyNSIsICIyNiIsICIyNyIsICIyOCIsICIyOSIsICIzMCIsIC8vCiAgICAiMzEiLCAiMzIiLCAiMzMiLCAiMzQiLCAiMzUiLCAiMzYiLCAiMzciLCAiMzgiLCAiMzkiLCAiNDAiLCAvLwogICAgIjQxIiwgIjQyIiwgIjQzIiwgIjQ0IiwgIjQ1IiwgIjQ2IiwgIjQ3IiwgIjQ4IiwgIjQ5IiwgIjUwIiwgLy8KICAgICI1MSIsICI1MiIsICI1MyIsICI1NCIsICI1NSIsICI1NiIsICI1NyIsICI1OCIsICI1OSIsICI2MCIsIC8vCiAgICAiNjEiLCAiNjIiLCAiNjMiLCAiNjQiLCAiNjUiLCAiNjYiLCAiNjciLCAiNjgiLCAiNjkiLCAiNzAiLCAvLwogICAgIjcxIiwgIjcyIiwgIjczIiwgIjc0IiwgIjc1IiwgIjc2IiwgIjc3IiwgIjc4IiwgIjc5IiwgIjgwIiwgLy8KICAgICI4MSIsICI4MiIsICI4MyIsICI4NCIsICI4NSIsICI4NiIsICI4NyIsICI4OCIsICI4OSIsICI5MCIsIC8vCiAgICAiOTEiLCAiOTIiLCAiOTMiLCAiOTQiLCAiOTUiLCAiOTYiLCAiOTciLCAiOTgiLCAiOTkiIC8vCiAgXTsKCiAgLy8gUG93ZXJzIG9mIDEwIGFib3ZlIDEwMDAwMDAgYXJlIGluZGlzdGluZ3Vpc2hhYmxlIGJ5IGV5ZS4KICBzdGF0aWMgY29uc3QgaW50IF9QT1dfMTBfNyA9IDEwMDAwMDAwOwogIHN0YXRpYyBjb25zdCBpbnQgX1BPV18xMF84ID0gMTAwMDAwMDAwOwogIHN0YXRpYyBjb25zdCBpbnQgX1BPV18xMF85ID0gMTAwMDAwMDAwMDsKCiAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGluIGEgcG9zaXRpdmUgc21pLgogIC8vIE5ldmVyIGNhbGxlZCB3aXRoIG51bWJlcnMgPCAxMDAuIFRoZXNlIGFyZSBoYW5kbGVkIGJlZm9yZSBjYWxsaW5nLgogIHN0YXRpYyBpbnQgX3Bvc2l0aXZlQmFzZTEwTGVuZ3RoKHZhciBzbWkpIHsKICAgIC8vIEEgcG9zaXRpdmUgc21pIGhhcyBsZW5ndGggPD0gMTkgaWYgNjMtYml0LCAgPD0xMCBpZiAzMS1iaXQuCiAgICAvLyBBdm9pZCBjb21wYXJpbmcgYSAzMS1iaXQgc21pIHRvIGEgbm9uLXNtaS4KICAgIGlmIChzbWkgPCAxMDAwKSByZXR1cm4gMzsKICAgIGlmIChzbWkgPCAxMDAwMCkgcmV0dXJuIDQ7CiAgICBpZiAoc21pIDwgX1BPV18xMF83KSB7CiAgICAgIGlmIChzbWkgPCAxMDAwMDApIHJldHVybiA1OwogICAgICBpZiAoc21pIDwgMTAwMDAwMCkgcmV0dXJuIDY7CiAgICAgIHJldHVybiA3OwogICAgfQogICAgaWYgKHNtaSA8IF9QT1dfMTBfOCkgcmV0dXJuIDg7CiAgICBpZiAoc21pIDwgX1BPV18xMF85KSByZXR1cm4gOTsKICAgIHNtaSA9IHNtaSB+LyBfUE9XXzEwXzk7CiAgICAvLyBIYW5kbGUgbnVtYmVycyA8IDEwMCBiZWZvcmUgY2FsbGluZyByZWN1cnNpdmVseS4KICAgIGlmIChzbWkgPCAxMCkgcmV0dXJuIDEwOwogICAgaWYgKHNtaSA8IDEwMCkgcmV0dXJuIDExOwogICAgcmV0dXJuIDkgKyBfcG9zaXRpdmVCYXNlMTBMZW5ndGgoc21pKTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmICh0aGlzIDwgMTAwICYmIHRoaXMgPiAtMTAwKSByZXR1cm4gX3NtYWxsTG9va3VwVGFibGVbdGhpcyArIDk5XTsKICAgIGlmICh0aGlzIDwgMCkgcmV0dXJuIF9uZWdhdGl2ZVRvU3RyaW5nKHRoaXMpOwogICAgLy8gSW5zcGlyZWQgYnkgQW5kcmVpIEFsZXhhbmRyZXNjdTogIlRocmVlIE9wdGltaXphdGlvbiBUaXBzIGZvciBDKysiCiAgICAvLyBBdm9pZCBleHBlbnNpdmUgcmVtYWluZGVyIG9wZXJhdGlvbiBieSBkb2luZyBpdCBvbiBtb3JlIHRoYW4KICAgIC8vIG9uZSBkaWdpdCBhdCBhIHRpbWUuCiAgICBjb25zdCBpbnQgRElHSVRfWkVSTyA9IDB4MzA7CiAgICBpbnQgbGVuZ3RoID0gX3Bvc2l0aXZlQmFzZTEwTGVuZ3RoKHRoaXMpOwogICAgX09uZUJ5dGVTdHJpbmcgcmVzdWx0ID0gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKGxlbmd0aCk7CiAgICBpbnQgaW5kZXggPSBsZW5ndGggLSAxOwogICAgdmFyIHNtaSA9IHRoaXM7CiAgICBkbyB7CiAgICAgIC8vIFR3byBkaWdpdHMgYXQgYSB0aW1lLgogICAgICB2YXIgdHdvRGlnaXRzID0gc21pLnJlbWFpbmRlcigxMDApOwogICAgICBzbWkgPSBzbWkgfi8gMTAwOwogICAgICBpbnQgZGlnaXRJbmRleCA9IHR3b0RpZ2l0cyAqIDI7CiAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXgsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXggKyAxXSk7CiAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXggLSAxLCBfZGlnaXRUYWJsZVtkaWdpdEluZGV4XSk7CiAgICAgIGluZGV4IC09IDI7CiAgICB9IHdoaWxlIChzbWkgPj0gMTAwKTsKICAgIGlmIChzbWkgPCAxMCkgewogICAgICAvLyBDaGFyYWN0ZXIgY29kZSBmb3IgJzAnLgogICAgICByZXN1bHQuX3NldEF0KGluZGV4LCBESUdJVF9aRVJPICsgc21pKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vIHJlbWFpbmRlciBmb3IgdGhpcyBjYXNlLgogICAgICBpbnQgZGlnaXRJbmRleCA9IHNtaSAqIDI7CiAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXgsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXggKyAxXSk7CiAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXggLSAxLCBfZGlnaXRUYWJsZVtkaWdpdEluZGV4XSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGluIGEgbmVnYXRpdmUgc21pLgogIC8vIE5ldmVyIGNhbGxlZCB3aXRoIG51bWJlcnMgPiAtMTAwLiBUaGVzZSBhcmUgaGFuZGxlZCBiZWZvcmUgY2FsbGluZy4KICBzdGF0aWMgaW50IF9uZWdhdGl2ZUJhc2UxMExlbmd0aCh2YXIgbmVnU21pKSB7CiAgICAvLyBBIG5lZ2F0aXZlIHNtaSBoYXMgbGVuZ3RoIDw9IDE5IGlmIDYzLWJpdCwgPD0xMCBpZiAzMS1iaXQuCiAgICAvLyBBdm9pZCBjb21wYXJpbmcgYSAzMS1iaXQgc21pIHRvIGEgbm9uLXNtaS4KICAgIGlmIChuZWdTbWkgPiAtMTAwMCkgcmV0dXJuIDM7CiAgICBpZiAobmVnU21pID4gLTEwMDAwKSByZXR1cm4gNDsKICAgIGlmIChuZWdTbWkgPiAtX1BPV18xMF83KSB7CiAgICAgIGlmIChuZWdTbWkgPiAtMTAwMDAwKSByZXR1cm4gNTsKICAgICAgaWYgKG5lZ1NtaSA+IC0xMDAwMDAwKSByZXR1cm4gNjsKICAgICAgcmV0dXJuIDc7CiAgICB9CiAgICBpZiAobmVnU21pID4gLV9QT1dfMTBfOCkgcmV0dXJuIDg7CiAgICBpZiAobmVnU21pID4gLV9QT1dfMTBfOSkgcmV0dXJuIDk7CiAgICBuZWdTbWkgPSBuZWdTbWkgfi8gX1BPV18xMF85OwogICAgLy8gSGFuZGxlIG51bWJlcnMgPiAtMTAwIGJlZm9yZSBjYWxsaW5nIHJlY3Vyc2l2ZWx5LgogICAgaWYgKG5lZ1NtaSA+IC0xMCkgcmV0dXJuIDEwOwogICAgaWYgKG5lZ1NtaSA+IC0xMDApIHJldHVybiAxMTsKICAgIHJldHVybiA5ICsgX25lZ2F0aXZlQmFzZTEwTGVuZ3RoKG5lZ1NtaSk7CiAgfQoKICAvLyBDb252ZXJ0IGEgbmVnYXRpdmUgc21pIHRvIGEgc3RyaW5nLgogIC8vIERvZXNuJ3QgbmVnYXRlIHRoZSBzbWkgdG8gYXZvaWQgbmVnYXRpbmcgdGhlIG1vc3QgbmVnYXRpdmUgc21pLCB3aGljaAogIC8vIHdvdWxkIGJlY29tZSBhIG5vbi1zbWkuCiAgc3RhdGljIFN0cmluZyBfbmVnYXRpdmVUb1N0cmluZyhpbnQgbmVnU21pKSB7CiAgICAvLyBDaGFyYWN0ZXIgY29kZSBmb3IgJy0nCiAgICBjb25zdCBpbnQgTUlOVVNfU0lHTiA9IDB4MmQ7CiAgICAvLyBDaGFyYWN0ZXIgY29kZSBmb3IgJzAnLgogICAgY29uc3QgaW50IERJR0lUX1pFUk8gPSAweDMwOwogICAgaWYgKG5lZ1NtaSA+IC0xMCkgewogICAgICByZXR1cm4gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKDIpCiAgICAgICAgLi5fc2V0QXQoMCwgTUlOVVNfU0lHTikKICAgICAgICAuLl9zZXRBdCgxLCBESUdJVF9aRVJPIC0gbmVnU21pKTsKICAgIH0KICAgIGlmIChuZWdTbWkgPiAtMTAwKSB7CiAgICAgIGludCBkaWdpdEluZGV4ID0gMiAqIC1uZWdTbWk7CiAgICAgIHJldHVybiBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUoMykKICAgICAgICAuLl9zZXRBdCgwLCBNSU5VU19TSUdOKQogICAgICAgIC4uX3NldEF0KDEsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXhdKQogICAgICAgIC4uX3NldEF0KDIsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXggKyAxXSk7CiAgICB9CiAgICAvLyBOdW1iZXIgb2YgZGlnaXRzLCBub3QgaW5jbHVkaW5nIG1pbnVzLgogICAgaW50IGRpZ2l0Q291bnQgPSBfbmVnYXRpdmVCYXNlMTBMZW5ndGgobmVnU21pKTsKICAgIF9PbmVCeXRlU3RyaW5nIHJlc3VsdCA9IF9PbmVCeXRlU3RyaW5nLl9hbGxvY2F0ZShkaWdpdENvdW50ICsgMSk7CiAgICByZXN1bHQuX3NldEF0KDAsIE1JTlVTX1NJR04pOyAvLyAnLScuCiAgICBpbnQgaW5kZXggPSBkaWdpdENvdW50OwogICAgZG8gewogICAgICB2YXIgdHdvRGlnaXRzID0gbmVnU21pLnJlbWFpbmRlcigxMDApOwogICAgICBuZWdTbWkgPSBuZWdTbWkgfi8gMTAwOwogICAgICBpbnQgZGlnaXRJbmRleCA9IC10d29EaWdpdHMgKiAyOwogICAgICByZXN1bHQuX3NldEF0KGluZGV4LCBfZGlnaXRUYWJsZVtkaWdpdEluZGV4ICsgMV0pOwogICAgICByZXN1bHQuX3NldEF0KGluZGV4IC0gMSwgX2RpZ2l0VGFibGVbZGlnaXRJbmRleF0pOwogICAgICBpbmRleCAtPSAyOwogICAgfSB3aGlsZSAobmVnU21pIDw9IC0xMDApOwogICAgaWYgKG5lZ1NtaSA+IC0xMCkgewogICAgICByZXN1bHQuX3NldEF0KGluZGV4LCBESUdJVF9aRVJPIC0gbmVnU21pKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vIHJlbWFpbmRlciBuZWNlc3NhcnkgZm9yIHRoaXMgY2FzZS4KICAgICAgaW50IGRpZ2l0SW5kZXggPSAtbmVnU21pICogMjsKICAgICAgcmVzdWx0Ll9zZXRBdChpbmRleCwgX2RpZ2l0VGFibGVbZGlnaXRJbmRleCArIDFdKTsKICAgICAgcmVzdWx0Ll9zZXRBdChpbmRleCAtIDEsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXhdKTsKICAgIH0K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YXRpb25NaXJyb3IgaW1wbGVtZW50cyBJbnZvY2F0aW9uIHsKICAvLyBDb25zdGFudHMgZGVzY3JpYmluZyB0aGUgaW52b2NhdGlvbiBraW5kLgogIC8vIF9GSUVMRCBjYW5ub3QgYmUgZ2VuZXJhdGVkIGJ5IHJlZ3VsYXIgaW52b2NhdGlvbiBtaXJyb3JzLgogIHN0YXRpYyBjb25zdCBpbnQgX01FVEhPRCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBfR0VUVEVSID0gMTsKICBzdGF0aWMgY29uc3QgaW50IF9TRVRURVIgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgX0ZJRUxEID0gMzsKICBzdGF0aWMgY29uc3QgaW50IF9MT0NBTF9WQVIgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgX0tJTkRfU0hJRlQgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgX0tJTkRfQklUUyA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBfS0lORF9NQVNLID0gKDEgPDwgX0tJTkRfQklUUykgLSAxOwoKICAvLyBUaGVzZSB2YWx1ZXMsIGV4Y2VwdCBfRFlOQU1JQyBhbmQgX1NVUEVSLCBhcmUgb25seSB1c2VkIHdoZW4gdGhyb3dpbmcKICAvLyBOb1N1Y2hNZXRob2RFcnJvciBmb3IgY29tcGlsZS10aW1lIHJlc29sdXRpb24gZmFpbHVyZXMuCiAgc3RhdGljIGNvbnN0IGludCBfRFlOQU1JQyA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBfU1VQRVIgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRJQyA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBfQ09OU1RSVUNUT1IgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgX1RPUF9MRVZFTCA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBfTEVWRUxfU0hJRlQgPSBfS0lORF9CSVRTOwogIHN0YXRpYyBjb25zdCBpbnQgX0xFVkVMX0JJVFMgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgX0xFVkVMX01BU0sgPSAoMSA8PCBfTEVWRUxfQklUUykgLSAxOwoKICAvLyBBcmd1bWVudHNEZXNjcmlwdG9yIGxheW91dC4gS2VlcCBpbiBzeW5jIHdpdGggZW51bSBpbiBkYXJ0X2VudHJ5LmguCiAgc3RhdGljIGNvbnN0IGludCBfVFlQRV9BUkdTX0xFTiA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBfQ09VTlQgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgX1BPU0lUSU9OQUxfQ09VTlQgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgX0ZJUlNUX05BTUVEX0VOVFJZID0gMzsKCiAgLy8gSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGludm9jYXRpb24gbWlycm9yLgogIFN0cmluZyBfZnVuY3Rpb25OYW1lOwogIExpc3QgX2FyZ3VtZW50c0Rlc2NyaXB0b3I7CiAgTGlzdCBfYXJndW1lbnRzOwogIGJvb2wgX2lzU3VwZXJJbnZvY2F0aW9uOwogIGludCBfZGVsYXllZFR5cGVBcmd1bWVudHNMZW47CgogIC8vIEV4dGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnZvY2F0aW9uIG1pcnJvcjsgcG9wdWxhdGVkIG9uIGRlbWFuZC4KICBTeW1ib2wgX21lbWJlck5hbWU7CiAgaW50IF90eXBlOwogIExpc3Q8VHlwZT4gX3R5cGVBcmd1bWVudHM7CiAgTGlzdCBfcG9zaXRpb25hbEFyZ3VtZW50czsKICBNYXA8U3ltYm9sLCBkeW5hbWljPiBfbmFtZWRBcmd1bWVudHM7CgogIF9JbnZvY2F0aW9uTWlycm9yLl93aXRoVHlwZSh0aGlzLl9tZW1iZXJOYW1lLCB0aGlzLl90eXBlLCB0aGlzLl90eXBlQXJndW1lbnRzLAogICAgICB0aGlzLl9wb3NpdGlvbmFsQXJndW1lbnRzLCB0aGlzLl9uYW1lZEFyZ3VtZW50cykgewogICAgX3R5cGVBcmd1bWVudHMgPz89IGNvbnN0IDxUeXBlPltdOwogICAgX3Bvc2l0aW9uYWxBcmd1bWVudHMgPz89IGNvbnN0IFtdOwogICAgX25hbWVkQXJndW1lbnRzID8/PSBjb25zdCB7fTsKICB9CgogIHZvaWQgX3NldE1lbWJlck5hbWVBbmRUeXBlKCkgewogICAgX3R5cGUgPz89IDA7CiAgICBpZiAoX2Z1bmN0aW9uTmFtZS5zdGFydHNXaXRoKCJnZXQ6IikpIHsKICAgICAgX3R5cGUgfD0gX0dFVFRFUjsKICAgICAgX21lbWJlck5hbWUgPSBuZXcgaW50ZXJuYWwuU3ltYm9sLnVudmFsaWRhdGVkKF9mdW5jdGlvbk5hbWUuc3Vic3RyaW5nKDQpKTsKICAgIH0gZWxzZSBpZiAoX2Z1bmN0aW9uTmFtZS5zdGFydHNXaXRoKCJzZXQ6IikpIHsKICAgICAgX3R5cGUgfD0gX1NFVFRFUjsKICAgICAgX21lbWJlck5hbWUgPQogICAgICAgICAgbmV3IGludGVybmFsLlN5bWJvbC51bnZhbGlkYXRlZChfZnVuY3Rpb25OYW1lLnN1YnN0cmluZyg0KSArICI9Iik7CiAgICB9IGVsc2UgewogICAgICBfdHlwZSB8PQogICAgICAgICAgX2lzU3VwZXJJbnZvY2F0aW9uID8gKF9TVVBFUiA8PCBfTEVWRUxfU0hJRlQpIHwgX01FVEhPRCA6IF9NRVRIT0Q7CiAgICAgIF9tZW1iZXJOYW1lID0gbmV3IGludGVybmFsLlN5bWJvbC51bnZhbGlkYXRlZChfZnVuY3Rpb25OYW1lKTsKICAgIH0KICB9CgogIFN5bWJvbCBnZXQgbWVtYmVyTmFtZSB7CiAgICBpZiAoX21lbWJlck5hbWUgPT0gbnVsbCkgewogICAgICBfc2V0TWVtYmVyTmFtZUFuZFR5cGUoKTsKICAgIH0KICAgIHJldHVybiBfbWVtYmVyTmFtZTsKICB9CgogIGludCBnZXQgX3R5cGVBcmdzTGVuIHsKICAgIGludCB0eXBlQXJnc0xlbiA9IF9hcmd1bWVudHNEZXNjcmlwdG9yW19UWVBFX0FSR1NfTEVOXTsKICAgIHJldHVybiB0eXBlQXJnc0xlbiA9PSAwID8gX2RlbGF5ZWRUeXBlQXJndW1lbnRzTGVuIDogdHlwZUFyZ3NMZW47CiAgfQoKICBMaXN0PFR5cGU+IGdldCB0eXBlQXJndW1lbnRzIHsKICAgIGlmIChfdHlwZUFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIGlmIChfdHlwZUFyZ3NMZW4gPT0gMCkgewogICAgICAgIHJldHVybiBfdHlwZUFyZ3VtZW50cyA9IGNvbnN0IDxUeXBlPltdOwogICAgICB9CiAgICAgIC8vIEEgVHlwZUFyZ3VtZW50cyBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgRGFydCBjbGFzcyBhbmQKICAgICAgLy8gY2Fubm90IGJlIGFjY2Vzc2VkIGFzIGFuIGFycmF5IGluIERhcnQuIFRoZXJlZm9yZSwgd2UgbmVlZCBhIG5hdGl2ZQogICAgICAvLyBjYWxsIHRvIHVucGFjayB0aGUgaW5kaXZpZHVhbCB0eXBlcyBpbnRvIGEgbGlzdC4KICAgICAgX3R5cGVBcmd1bWVudHMgPSBfdW5wYWNrVHlwZUFyZ3VtZW50cyhfYXJndW1lbnRzWzBdLCBfdHlwZUFyZ3NMZW4pOwogICAgfQogICAgcmV0dXJuIF90eXBlQXJndW1lbnRzOwogIH0KCiAgLy8gVW5wYWNrIHRoZSBnaXZlbiBUeXBlQXJndW1lbnRzIG9iamVjdCBpbnRvIGEgbmV3IGxpc3Qgb2YgaW5kaXZpZHVhbCB0eXBlcy4KICBzdGF0aWMgTGlzdDxUeXBlPiBfdW5wYWNrVHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzLCBpbnQgbnVtVHlwZUFyZ3VtZW50cykKICAgICAgbmF0aXZlICJJbnZvY2F0aW9uTWlycm9yX3VucGFja1R5cGVBcmd1bWVudHMiOwoKICBMaXN0IGdldCBwb3NpdGlvbmFsQXJndW1lbnRzIHsKICAgIGlmIChfcG9zaXRpb25hbEFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIC8vIFRoZSBhcmd1bWVudCBkZXNjcmlwdG9yIGNvdW50cyB0aGUgcmVjZWl2ZXIsIGJ1dCBub3QgdGhlIHR5cGUgYXJndW1lbnRzCiAgICAgIC8vIGFzIHBvc2l0aW9uYWwgYXJndW1lbnRzLgogICAgICBpbnQgbnVtUG9zaXRpb25hbEFyZ3VtZW50cyA9IF9hcmd1bWVudHNEZXNjcmlwdG9yW19QT1NJVElPTkFMX0NPVU5UXSAtIDE7CiAgICAgIGlmIChudW1Qb3NpdGlvbmFsQXJndW1lbnRzID09IDApIHsKICAgICAgICByZXR1cm4gX3Bvc2l0aW9uYWxBcmd1bWVudHMgPSBjb25zdCBbXTsKICAgICAgfQogICAgICAvLyBFeGNsdWRlIHJlY2VpdmVyIGFuZCB0eXBlIGFyZ3MgaW4gdGhlIHJldHVybmVkIGxpc3QuCiAgICAgIGludCByZWNlaXZlckluZGV4ID0gX3R5cGVBcmdzTGVuID4gMCA/IDEgOiAwOwogICAgICBfcG9zaXRpb25hbEFyZ3VtZW50cyA9IG5ldyBfSW1tdXRhYmxlTGlzdC5fZnJvbSgKICAgICAgICAgIF9hcmd1bWVudHMsIHJlY2VpdmVySW5kZXggKyAxLCBudW1Qb3NpdGlvbmFsQXJndW1lbnRzKTsKICAgIH0KICAgIHJldHVybiBfcG9zaXRpb25hbEFyZ3VtZW50czsKICB9CgogIE1hcDxTeW1ib2wsIGR5bmFtaWM+IGdldCBuYW1lZEFyZ3VtZW50cyB7CiAgICBpZiAoX25hbWVkQXJndW1lbnRzID09IG51bGwpIHsKICAgICAgaW50IG51bUFyZ3VtZW50cyA9IF9hcmd1bWVudHNEZXNjcmlwdG9yW19DT1VOVF0gLSAxOyAvLyBFeGNsdWRlIHJlY2VpdmVyLgogICAgICBpbnQgbnVtUG9zaXRpb25hbEFyZ3VtZW50cyA9IF9hcmd1bWVudHNEZXNjcmlwdG9yW19QT1NJVElPTkFMX0NPVU5UXSAtIDE7CiAgICAgIGludCBudW1OYW1lZEFyZ3VtZW50cyA9IG51bUFyZ3VtZW50cyAtIG51bVBvc2l0aW9uYWxBcmd1bWVudHM7CiAgICAgIGlmIChudW1OYW1lZEFyZ3VtZW50cyA9PSAwKSB7CiAgICAgICAgcmV0dXJuIF9uYW1lZEFyZ3VtZW50cyA9IGNvbnN0IHt9OwogICAgICB9CiAgICAgIGludCByZWNlaXZlckluZGV4ID0gX3R5cGVBcmdzTGVuID4gMCA/IDEgOiAwOwogICAgICBfbmFtZWRBcmd1bWVudHMgPSBuZXcgTWFwPFN5bWJvbCwgZHluYW1pYz4oKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1OYW1lZEFyZ3VtZW50czsgaSsrKSB7CiAgICAgICAgaW50IG5hbWVkRW50cnlJbmRleCA9IF9GSVJTVF9OQU1FRF9FTlRSWSArIDIgKiBpOwogICAgICAgIFN0cmluZyBhcmdfbmFtZSA9IF9hcmd1bWVudHNEZXNjcmlwdG9yW25hbWVkRW50cnlJbmRleF07CiAgICAgICAgdmFyIGFyZ192YWx1ZSA9IF9hcmd1bWVudHNbCiAgICAgICAgICAgIHJlY2VpdmVySW5kZXggKyBfYXJndW1lbnRzRGVzY3JpcHRvcltuYW1lZEVudHJ5SW5kZXggKyAxXV07CiAgICAgICAgX25hbWVkQXJndW1lbnRzW25ldyBpbnRlcm5hbC5TeW1ib2wudW52YWxpZGF0ZWQoYXJnX25hbWUpXSA9IGFyZ192YWx1ZTsKICAgICAgfQogICAgICBfbmFtZWRBcmd1bWVudHMgPSBuZXcgTWFwLnVubW9kaWZpYWJsZShfbmFtZWRBcmd1bWVudHMpOwogICAgfQogICAgcmV0dXJuIF9uYW1lZEFyZ3VtZW50czsKICB9CgogIGJvb2wgZ2V0IGlzTWV0aG9kIHsKICAgIGlmIChfdHlwZSA9PSBudWxsKSB7CiAgICAgIF9zZXRNZW1iZXJOYW1lQW5kVHlwZSgpOwogICAgfQogICAgcmV0dXJuIChfdHlwZSAmIF9LSU5EX01BU0spID09IF9NRVRIT0Q7CiAgfQoKICBib29sIGdldCBpc0FjY2Vzc29yIHsKICAgIGlmIChfdHlwZSA9PSBudWxsKSB7CiAgICAgIF9zZXRNZW1iZXJOYW1lQW5kVHlwZSgpOwogICAgfQogICAgcmV0dXJuIChfdHlwZSAmIF9LSU5EX01BU0spICE9IF9NRVRIT0Q7CiAgfQoKICBib29sIGdldCBpc0dldHRlciB7CiAgICBpZiAoX3R5cGUgPT0gbnVsbCkgewogICAgICBfc2V0TWVtYmVyTmFtZUFuZFR5cGUoKTsKICAgIH0KICAgIHJldHVybiAoX3R5cGUgJiBfS0lORF9NQVNLKSA9PSBfR0VUVEVSOwogIH0KCiAgYm9vbCBnZXQgaXNTZXR0ZXIgewogICAgaWYgKF90eXBlID09IG51bGwpIHsKICAgICAgX3NldE1lbWJlck5hbWVBbmRUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gKF90eXBlICYgX0tJTkRfTUFTSykgPT0gX1NFVFRFUjsKICB9CgogIF9JbnZvY2F0aW9uTWlycm9yKHRoaXMuX2Z1bmN0aW9uTmFtZSwgdGhpcy5fYXJndW1lbnRzRGVzY3JpcHRvciwKICAgICAgdGhpcy5fYXJndW1lbnRzLCB0aGlzLl9pc1N1cGVySW52b2NhdGlvbiwgdGhpcy5fdHlwZSwKICAgICAgW3RoaXMuX2RlbGF5ZWRUeXBlQXJndW1lbnRzTGVuID0gMF0pOwoKICBfSW52b2NhdGlvbk1pcnJvci5fd2l0aG91dFR5cGUodGhpcy5fZnVuY3Rpb25OYW1lLCB0aGlzLl90eXBlQXJndW1lbnRzLAogICAgICB0aGlzLl9wb3NpdGlvbmFsQXJndW1lbnRzLCB0aGlzLl9uYW1lZEFyZ3VtZW50cywgdGhpcy5faXNTdXBlckludm9jYXRpb24sCiAgICAgIFt0aGlzLl9kZWxheWVkVHlwZUFyZ3VtZW50c0xlbiA9IDBdKTsKCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgc3RhdGljIF9hbGxvY2F0ZUludm9jYXRpb25NaXJyb3IoU3RyaW5nIGZ1bmN0aW9uTmFtZSwKICAgICAgTGlzdCBhcmd1bWVudHNEZXNjcmlwdG9yLCBMaXN0IGFyZ3VtZW50cywgYm9vbCBpc1N1cGVySW52b2NhdGlvbiwKICAgICAgW2ludCB0eXBlID0gbnVsbF0pIHsKICAgIHJldHVybiBuZXcgX0ludm9jYXRpb25NaXJyb3IoCiAgICAgICAgZnVuY3Rpb25OYW1lLCBhcmd1bWVudHNEZXNjcmlwdG9yLCBhcmd1bWVudHMsIGlzU3VwZXJJbnZvY2F0aW9uLCB0eXBlKTsKICB9CgogIC8vIFRoaXMgZmFjdG9yeSBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgYW4gYEludm9jYXRpb25gIGZvciBhIGNsb3N1cmUgY2FsbCB3aGljaAogIC8vIG1heSBoYXZlIGRlbGF5ZWQgdHlwZSBhcmd1bWVudHMuIEluIHRoYXQgY2FzZSwgdGhlIGFyZ3VtZW50cyBkZXNjcmlwdG9yIHdpbGwKICAvLyBpbmRpY2F0ZSAwIHR5cGUgYXJndW1lbnRzLCBidXQgdGhlIGFjdHVhbCBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgYXJlCiAgLy8gcGFzc2VkIGluIGBkZWxheWVkVHlwZUFyZ3VtZW50c0xlbmAuIElmIGFueSB0eXBlIGFyZ3VtZW50cyBhcmUgYXZhaWxhYmxlLAogIC8vIHRoZSB0eXBlIGFyZ3VtZW50cyB2ZWN0b3Igd2lsbCBiZSB0aGUgZmlyc3QgZW50cnkgaW4gYGFyZ3VtZW50c2AuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgc3RhdGljIF9hbGxvY2F0ZUludm9jYXRpb25NaXJyb3JGb3JDbG9zdXJlKAogICAgICBTdHJpbmcgZnVuY3Rpb25OYW1lLAogICAgICBMaXN0IGFyZ3VtZW50c0Rlc2NyaXB0b3IsCiAgICAgIExpc3QgYXJndW1lbnRzLAogICAgICBpbnQgdHlwZSwKICAgICAgaW50IGRlbGF5ZWRUeXBlQXJndW1lbnRzTGVuKSB7CiAgICByZXR1cm4gbmV3IF9JbnZvY2F0aW9uTWlycm9yKGZ1bmN0aW9uTmFtZSwgYXJndW1lbnRzRGVzY3JpcHRvciwgYXJndW1lbnRzLAogICAgICAgIGZhbHNlLCB0eXBlLCBkZWxheWVkVHlwZUFyZ3VtZW50c0xlbik7CiAgfQp9CoDMAE5OPAEeAT9GJDAvPyAgIB8jJCM3AUs9IR8gJSMuJDkBSScfKisBNxgdExsgAUwWDR0dKAFROScnIgQBIREsGFEzGBRNDQ9NRAYEARofHwYYBAEZPEYEASEiHzAITU06SgYbBAFQTjUBIShRIlApMAg+NDdCBiEEASwjUFBFJCsINDQ0OkEkSFAIPwYcBAEWGR8GLAQBGBkfBiwEARYZHwYsBAEWGR8GLAQBQzwsAUpQLAEkOEgbIlAEAVFSTE9HJC4bIBYQJU8vBAIBLGRhcnQ6Y29yZS1wYXRjaC9pbnZvY2F0aW9uX21pcnJvcl9wYXRjaC5kYXJ0L29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvbGliX3ByZWZpeC5kYXJ0jB4vLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCi8vIFRoaXMgdHlwZSBjb3JyZXNwb25kcyB0byB0aGUgVk0taW50ZXJuYWwgY2xhc3MgTGlicmFyeVByZWZpeC4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfTGlicmFyeVByZWZpeCB7CiAgZmFjdG9yeSBfTGlicmFyeVByZWZpeC5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyAiVW5yZWFjaGFibGUiOwogIH0KCiAgYm9vbCBfbG9hZCgpIG5hdGl2ZSAiTGlicmFyeVByZWZpeF9sb2FkIjsKICBPYmplY3QgX2xvYWRFcnJvcigpIG5hdGl2ZSAiTGlicmFyeVByZWZpeF9sb2FkRXJyb3IiOwogIGJvb2wgaXNMb2FkZWQoKSBuYXRpdmUgIkxpYnJhcnlQcmVmaXhfaXNMb2FkZWQiOwogIGJvb2wgX2ludmFsaWRhdGVEZXBlbmRlbnRDb2RlKCkKICAgICAgbmF0aXZlICJMaWJyYXJ5UHJlZml4X2ludmFsaWRhdGVEZXBlbmRlbnRDb2RlIjsKCiAgbG9hZExpYnJhcnkoKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9vdXRzdGFuZGluZ0xvYWRSZXF1ZXN0cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoX291dHN0YW5kaW5nTG9hZFJlcXVlc3RzW2ldWzBdID09IHRoaXMpIHsKICAgICAgICByZXR1cm4gX291dHN0YW5kaW5nTG9hZFJlcXVlc3RzW2ldWzFdLmZ1dHVyZTsKICAgICAgfQogICAgfQoKICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPGJvb2w+KCk7CiAgICB2YXIgcGFpciA9IG5ldyBMaXN0KCk7CiAgICBwYWlyLmFkZCh0aGlzKTsKICAgIHBhaXIuYWRkKGNvbXBsZXRlcik7CiAgICBfb3V0c3RhbmRpbmdMb2FkUmVxdWVzdHMuYWRkKHBhaXIpOwogICAgVGltZXIucnVuKCgpIHsKICAgICAgdmFyIGhhc0NvbXBsZXRlZCA9IHRoaXMuX2xvYWQoKTsKICAgICAgLy8gTG9hZGluZyBjYW4gY29tcGxldGUgaW1tZWRpYXRlbHksIGZvciBleGFtcGxlIHdoZW4gdGhlIHNhbWUKICAgICAgLy8gbGlicmFyeSBoYXMgYmVlbiBsb2FkZWQgZWFnZXJseSBvciB0aHJvdWdoIGFub3RoZXIgZGVmZXJyZWQKICAgICAgLy8gcHJlZml4LiBJZiB0aGF0IGlzIHRoZSBjYXNlLCB3ZSBtdXN0IGludmFsaWRhdGUgdGhlIGRlcGVuZGVudAogICAgICAvLyBjb2RlIGFuZCBjb21wbGV0ZSB0aGUgZnV0dXJlIG5vdyBzaW5jZSB0aGVyZSB3aWxsIGJlIG5vIGNhbGxiYWNrCiAgICAgIC8vIGZyb20gdGhlIFZNLgogICAgICBpZiAoaGFzQ29tcGxldGVkICYmICFjb21wbGV0ZXIuaXNDb21wbGV0ZWQpIHsKICAgICAgICBfaW52YWxpZGF0ZURlcGVuZGVudENvZGUoKTsKICAgICAgICBjb21wbGV0ZXIuY29tcGxldGUodHJ1ZSk7CiAgICAgICAgX291dHN0YW5kaW5nTG9hZFJlcXVlc3RzLnJlbW92ZShwYWlyKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKICB9Cn0KCi8vIEEgbGlzdCBvZiB0d28gZWxlbWVudCBsaXN0cy4gVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIF9MaWJyYXJ5UHJlZml4LiBUaGUKLy8gc2Vjb25kIGVsZW1lbnQgaXMgdGhlIENvbXBsZXRlciBmb3IgdGhlIGxvYWQgcmVxdWVzdC4KdmFyIF9vdXRzdGFuZGluZ0xvYWRSZXF1ZXN0cyA9IG5ldyBMaXN0PExpc3Q+KCk7CgovLyBDYWxsZWQgZnJvbSB0aGUgVk0gd2hlbiBhbiBvdXRzdGFuZGluZyBsb2FkIHJlcXVlc3QgaGFzIGZpbmlzaGVkLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKX2NvbXBsZXRlRGVmZXJyZWRMb2FkcygpIHsKICAvLyBEZXRlcm1pbmUgd2hpY2ggb3V0c3RhbmRpbmcgbG9hZCByZXF1ZXN0cyBoYXZlIGNvbXBsZXRlZCBhbmQgY29tcGxldGUKICAvLyB0aGVpciBjb21wbGV0ZXIgKHdpdGggYW4gZXJyb3Igb3IgdHJ1ZSkuIEZvciBvdXRzdGFuZGluZyBsb2FkIHJlcXVlc3RzCiAgLy8gd2hpY2ggaGF2ZSBub3QgY29tcGxldGVkLCByZW1lbWJlciB0aGVtIGZvciBuZXh0IHRpbWUgaW4KICAvLyBzdGlsbE91dHN0YW5kaW5nTG9hZFJlcXVlc3RzLgogIHZhciBzdGlsbE91dHN0YW5kaW5nTG9hZFJlcXVlc3RzID0gbmV3IExpc3Q8TGlzdD4oKTsKCiAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIG91dHN0YW5kaW5nUmVxdWVzdHMgYmVjYXVzZSB0aGUgY2FsbCB0byBfbG9hZCBiZWxvdwogIC8vIG1heSByZWN1cnNpdmVseSB0cmlnZ2VyIGFub3RoZXIgY2FsbCB0byB8X2NvbXBsZXRlRGVmZXJyZWRMb2Fkc3wsIHdoaWNoCiAgLy8gY2FuIGNhdXNlIHxfb3V0c3RhbmRpbmdMb2FkUmVxdWVzdHN8IHRvIGJlIG1vZGlmaWVkLgogIHZhciBvdXRzdGFuZGluZ1JlcXVlc3RzID0gX291dHN0YW5kaW5nTG9hZFJlcXVlc3RzLnRvTGlzdCgpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0c3RhbmRpbmdSZXF1ZXN0cy5sZW5ndGg7IGkrKykgewogICAgdmFyIHByZWZpeCA9IG91dHN0YW5kaW5nUmVxdWVzdHNbaV1bMF07CiAgICB2YXIgY29tcGxldGVyID0gb3V0c3RhbmRpbmdSZXF1ZXN0c1tpXVsxXTsKICAgIHZhciBlcnJvciA9IHByZWZpeC5fbG9hZEVycm9yKCk7CiAgICBpZiAoY29tcGxldGVyLmlzQ29tcGxldGVkKSB7CiAgICAgIC8vIEFscmVhZHkgY29tcGxldGVkLiBTa2lwLgogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmIChlcnJvciAhPSBudWxsKSB7CiAgICAgIGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGVycm9yKTsKICAgIH0gZWxzZSBpZiAocHJlZml4Ll9sb2FkKCkpIHsKICAgICAgcHJlZml4Ll9pbnZhbGlkYXRlRGVwZW5kZW50Q29kZSgpOwogICAgICBjb21wbGV0ZXIuY29tcGxldGUodHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBzdGlsbE91dHN0YW5kaW5nTG9hZFJlcXVlc3RzLmFkZChvdXRzdGFuZGluZ1JlcXVlc3RzW2ldKTsKICAgIH0KICB9CiAgX291dHN0YW5kaW5nTG9hZFJlcXVlc3RzID0gc3RpbGxPdXRzdGFuZGluZ0xvYWRSZXF1ZXN0czsKfQpWAE5OPAEeAUEaFy0ZBAEsODMiNgESQDQ2CAYBKxsUGSgTJ0VFR0oWNCQiLwgIHQQCAU05MQFFIhtLTD4jNwFMTTo/OSwvJSEiEAYZJiEpIA1ABgQ7AgEfZGFydDpjb3JlLXBhdGNoL2xpYl9wcmVmaXguZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3JlZ2V4cF9wYXRjaC5kYXJ0tRIvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBSZWdFeHAgewogIEBwYXRjaAogIGZhY3RvcnkgUmVnRXhwKFN0cmluZyBzb3VyY2UsCiAgICAgIHtib29sIG11bHRpTGluZTogZmFsc2UsCiAgICAgIGJvb2wgY2FzZVNlbnNpdGl2ZTogdHJ1ZSwKICAgICAgYm9vbCB1bmljb2RlOiBmYWxzZSwKICAgICAgYm9vbCBkb3RBbGw6IGZhbHNlfSkgewogICAgX1JlZ0V4cEhhc2hLZXkga2V5ID0KICAgICAgICBuZXcgX1JlZ0V4cEhhc2hLZXkoc291cmNlLCBtdWx0aUxpbmUsIGNhc2VTZW5zaXRpdmUsIHVuaWNvZGUsIGRvdEFsbCk7CiAgICBfUmVnRXhwSGFzaFZhbHVlIHZhbHVlID0gX2NhY2hlW2tleV07CgogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgaWYgKF9jYWNoZS5sZW5ndGggPiBfTUFYX0NBQ0hFX1NJWkUpIHsKICAgICAgICBfUmVnRXhwSGFzaEtleSBsYXN0S2V5ID0gX3JlY2VudGx5VXNlZC5sYXN0OwogICAgICAgIF9yZWNlbnRseVVzZWQucmVtb3ZlKGxhc3RLZXkpOwogICAgICAgIF9jYWNoZS5yZW1vdmUobGFzdEtleSk7CiAgICAgIH0KCiAgICAgIHZhbHVlID0gbmV3IF9SZWdFeHBIYXNoVmFsdWUoCiAgICAgICAgICBuZXcgX1JlZ0V4cChzb3VyY2UsCiAgICAgICAgICAgICAgbXVsdGlMaW5lOiBtdWx0aUxpbmUsCiAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogY2FzZVNlbnNpdGl2ZSwKICAgICAgICAgICAgICB1bmljb2RlOiB1bmljb2RlLAogICAgICAgICAgICAgIGRvdEFsbDogZG90QWxsKSwKICAgICAgICAgIGtleSk7CiAgICAgIF9jYWNoZVtrZXldID0gdmFsdWU7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZS5rZXkudW5saW5rKCk7CiAgICB9CgogICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwoKICAgIF9yZWNlbnRseVVzZWQuYWRkRmlyc3QodmFsdWUua2V5KTsKICAgIGFzc2VydChfcmVjZW50bHlVc2VkLmxlbmd0aCA9PSBfY2FjaGUubGVuZ3RoKTsKCiAgICAvLyBUT0RPKHplcm55KTogV2UgbWlnaHQgbm90IHdhbnQgdG8gY2Fub25pY2FsaXplIHJlZ2V4cCBvYmplY3RzLgogICAgcmV0dXJuIHZhbHVlLnJlZ2V4cDsKICB9CgogIC8qKgogICAqIEZpbmRzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgUmVnRXhwLXNpZ25pZmljYW50IGNoYXIgaW4gW3RleHRdLgogICAqCiAgICogU3RhcnRzIGxvb2tpbmcgZnJvbSBbc3RhcnRdLiBSZXR1cm5zIGB0ZXh0Lmxlbmd0aGAgaWYgbm8gY2hhcmFjdGVyCiAgICogaXMgZm91bmQgdGhhdCBoYXMgc3BlY2lhbCBtZWFuaW5nIGluIFJlZ0V4cCBzeW50YXguCiAgICovCiAgc3RhdGljIGludCBfZmluZEVzY2FwZUNoYXIoU3RyaW5nIHRleHQsIGludCBzdGFydCkgewogICAgLy8gVGFibGUgd2hlcmUgZWFjaCBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlIFUrMDAwMCB0byBVKzAwN2YgaXMgcmVwcmVzZW50ZWQKICAgIC8vIGJ5IHdoZXRoZXIgaXQgbmVlZHMgdG8gYmUgZXNjYXBlZCBpbiBhIHJlZ2V4cC4KICAgIC8vIFRoZSBceDAwIGNoYXJhY3RlcnMgbWVhbnMgZXNjYWNwZWQsIGFuZCBceDAxIG1lYW5zIG5vbi1lc2NhcGVkLgogICAgY29uc3QgZXNjYXBlcyA9CiAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiCiAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICQgICAgICAgICAgICAgICAoICAgKSAgICogICArICAgICAgICAgICAuCiAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAwXHgwMVx4MDFceDAxXHgwMFx4MDBceDAwXHgwMFx4MDFceDAxXHgwMFx4MDEiCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPwogICAgICAgICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAwIgogICAgICAgICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxIgogICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAgIFwgICBdICAgXgogICAgICAgICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDBceDAwXHgwMFx4MDBceDAxIgogICAgICAgICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxIgogICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgIHwgICB9CiAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMFx4MDBceDAwXHgwMVx4MDEiOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICBpbnQgY2hhciA9IHRleHQuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNoYXIgPD0gMHg3ZiAmJiBlc2NhcGVzLmNvZGVVbml0QXQoY2hhcikgPT0gMCkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gdGV4dC5sZW5ndGg7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgdGV4dCkgewogICAgaW50IGVzY2FwZUNoYXJJbmRleCA9IF9maW5kRXNjYXBlQ2hhcih0ZXh0LCAwKTsKICAgIC8vIElmIHRoZSB0ZXh0IGNvbnRhaW5zIG5vIGNoYXJhY3RlcnMgbmVlZGluZyBlc2NhcGUsIHJldHVybiBpdCBkaXJlY3RseS4KICAgIGlmIChlc2NhcGVDaGFySW5kZXggPT0gdGV4dC5sZW5ndGgpIHJldHVybiB0ZXh0OwoKICAgIHZhciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBpbnQgcHJldmlvdXNTbGljZUVuZEluZGV4ID0gMDsKICAgIGRvIHsKICAgICAgLy8gQ29weSBjaGFyYWN0ZXJzIGZyb20gcHJldmlvdXMgZXNjYXBlIHRvIGN1cnJlbnQgZXNjYXBlIGludG8gcmVzdWx0LgogICAgICAvLyBUaGlzIGluY2x1ZGVzIHRoZSBwcmV2aW91c2x5IGVzY2FwZWQgY2hhcmFjdGVyLgogICAgICBidWZmZXIud3JpdGUodGV4dC5zdWJzdHJpbmcocHJldmlvdXNTbGljZUVuZEluZGV4LCBlc2NhcGVDaGFySW5kZXgpKTsKICAgICAgLy8gUHJlcGFyZSB0aGUgY3VycmVudCBjaGFyYWN0ZXIgdG8gYmUgZXNjYXBlZCBieSBwcmVmaXhpbmcgaXQgd2l0aCBhICdcJy4KICAgICAgYnVmZmVyLndyaXRlKHIiXCIpOwogICAgICBwcmV2aW91c1NsaWNlRW5kSW5kZXggPSBlc2NhcGVDaGFySW5kZXg7CiAgICAgIGVzY2FwZUNoYXJJbmRleCA9IF9maW5kRXNjYXBlQ2hhcih0ZXh0LCBlc2NhcGVDaGFySW5kZXggKyAxKTsKICAgIH0gd2hpbGUgKGVzY2FwZUNoYXJJbmRleCA8IHRleHQubGVuZ3RoKTsKICAgIC8vIENvcHkgdGFpbCBvZiBzdHJpbmcgaW50byByZXN1bHQuCiAgICBidWZmZXIud3JpdGUodGV4dC5zdWJzdHJpbmcocHJldmlvdXNTbGljZUVuZEluZGV4LCBlc2NhcGVDaGFySW5kZXgpKTsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzIGFyZSBzdG9yZWQgaW4gYSBjYWNoZSBvZiB1cCB0byBfTUFYX0NBQ0hFX1NJWkUKICAvLyBlbGVtZW50cyB1c2luZyBhbiBMUlUgZXZpY3Rpb24gc3RyYXRlZ3kuCiAgLy8gVE9ETyh6ZXJueSk6IERvIG5vdCBpbXBvc2UgYSBmaXhlZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGNhY2hlZCBvYmplY3RzLgogIC8vIE90aGVyIHBvc3NpYmlsaXRpZXMgY291bGQgYmUgbGltaXRpbmcgYnkgdGhlIHNpemUgb2YgdGhlIHJlZ2V4cCBvYmplY3RzLAogIC8vIG9yIGltcG9zaW5nIGEgbG93ZXIgdGltZSBib3VuZCBmb3IgdGhlIG1vc3QgcmVjZW50IHVzZSB1bmRlciB3aGljaCBhIHJlZ2V4cAogIC8vIG1heSBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4KICAvLyBUT0RPKHplcm55KTogVXNlIHNlbGYtc2l6aW5nIGNhY2hlIHNpbWlsYXIgdG8gX0FjY2Vzc29yQ2FjaGUgaW4KICAvLyBtaXJyb3JzX2ltcGwuZGFydC4KICBzdGF0aWMgY29uc3QgaW50IF9NQVhfQ0FDSEVfU0laRSA9IDI1NjsKICBzdGF0aWMgZmluYWwgTWFwPF9SZWdFeHBIYXNoS2V5LCBfUmVnRXhwSGFzaFZhbHVlPiBfY2FjaGUgPQogICAgICBuZXcgSGFzaE1hcDxfUmVnRXhwSGFzaEtleSwgX1JlZ0V4cEhhc2hWYWx1ZT4oKTsKICBzdGF0aWMgZmluYWwgTGlua2VkTGlzdDxfUmVnRXhwSGFzaEtleT4gX3JlY2VudGx5VXNlZCA9CiAgICAgIG5ldyBMaW5rZWRMaXN0PF9SZWdFeHBIYXNoS2V5PigpOwoKICBpbnQgZ2V0IF9ncm91cENvdW50OwogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IF9ncm91cE5hbWVzOwogIGludCBfZ3JvdXBOYW1lSW5kZXgoU3RyaW5nIG5hbWUpOwp9CgovLyBSZXByZXNlbnRzIGJvdGggYSBrZXkgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjYWNoZSBhcyB3ZWxsIGFzIGl0cwovLyBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSBMUlUgbGlzdC4KY2xhc3MgX1JlZ0V4cEhhc2hLZXkgZXh0ZW5kcyBMaW5rZWRMaXN0RW50cnk8X1JlZ0V4cEhhc2hLZXk+IHsKICBmaW5hbCBTdHJpbmcgcGF0dGVybjsKICBmaW5hbCBib29sIG11bHRpTGluZTsKICBmaW5hbCBib29sIGNhc2VTZW5zaXRpdmU7CiAgZmluYWwgYm9vbCB1bmljb2RlOwogIGZpbmFsIGJvb2wgZG90QWxsOwoKICBfUmVnRXhwSGFzaEtleSh0aGlzLnBhdHRlcm4sIHRoaXMubXVsdGlMaW5lLCB0aGlzLmNhc2VTZW5zaXRpdmUsIHRoaXMudW5pY29kZSwKICAgICAgdGhpcy5kb3RBbGwpOwoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHBhdHRlcm4uaGFzaENvZGU7CiAgYm9vbCBvcGVyYXRvciA9PSh0aGF0KSB7CiAgICByZXR1cm4gKHRoYXQgaXMgX1JlZ0V4cEhhc2hLZXkpICYmCiAgICAgICAgKHRoaXMucGF0dGVybiA9PSB0aGF0LnBhdHRlcm4pICYmCiAgICAgICAgKHRoaXMubXVsdGlMaW5lID09IHRoYXQubXVsdGlMaW5lKSAmJgogICAgICAgICh0aGlzLmNhc2VTZW5zaXRpdmUgPT0gdGhhdC5jYXNlU2Vuc2l0aXZlKSAmJgogICAgICAgICh0aGlzLnVuaWNvZGUgPT0gdGhhdC51bmljb2RlKSAmJgogICAgICAgICh0aGlzLmRvdEFsbCA9PSB0aGF0LmRvdEFsbCk7CiAgfQp9CgovLyBSZXByZXNlbnRzIGEgdmFsdWUgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjYWNoZS4gQ29udGFpbnMgYSBwb2ludGVyCi8vIGJhY2sgdG8gdGhlIGtleSBpbiBvcmRlciB0byBhY2Nlc3MgdGhlIGNvcnJlc3BvbmRpbmcgTFJVIGVudHJ5LgpjbGFzcyBfUmVnRXhwSGFzaFZhbHVlIHsKICBmaW5hbCBfUmVnRXhwIHJlZ2V4cDsKICBmaW5hbCBfUmVnRXhwSGFzaEtleSBrZXk7CgogIF9SZWdFeHBIYXNoVmFsdWUodGhpcy5yZWdleHAsIHRoaXMua2V5KTsKfQoKY2xhc3MgX1JlZ0V4cE1hdGNoIGltcGxlbWVudHMgUmVnRXhwTWF0Y2ggewogIF9SZWdFeHBNYXRjaC5fKHRoaXMuX3JlZ2V4cCwgdGhpcy5pbnB1dCwgdGhpcy5fbWF0Y2gpOwoKICBpbnQgZ2V0IHN0YXJ0ID0+IF9zdGFydCgwKTsKICBpbnQgZ2V0IGVuZCA9PiBfZW5kKDApOwoKICBpbnQgX3N0YXJ0KGludCBncm91cElkeCkgewogICAgcmV0dXJuIF9tYXRjaFsoZ3JvdXBJZHggKiBfTUFUQ0hfUEFJUildOwogIH0KCiAgaW50IF9lbmQoaW50IGdyb3VwSWR4KSB7CiAgICByZXR1cm4gX21hdGNoWyhncm91cElkeCAqIF9NQVRDSF9QQUlSKSArIDFdOwogIH0KCiAgU3RyaW5nIGdyb3VwKGludCBncm91cElkeCkgewogICAgaWYgKGdyb3VwSWR4IDwgMCB8fCBncm91cElkeCA+IF9yZWdleHAuX2dyb3VwQ291bnQpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IudmFsdWUoZ3JvdXBJZHgpOwogICAgfQogICAgaW50IHN0YXJ0SW5kZXggPSBfc3RhcnQoZ3JvdXBJZHgpOwogICAgaW50IGVuZEluZGV4ID0gX2VuZChncm91cElkeCk7CiAgICBpZiAoc3RhcnRJbmRleCA9PSAtMSkgewogICAgICBhc3NlcnQoZW5kSW5kZXggPT0gLTEpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBpbnB1dC5fc3Vic3RyaW5nVW5jaGVja2VkKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKICB9CgogIFN0cmluZyBvcGVyYXRvciBbXShpbnQgZ3JvdXBJZHgpIHsKICAgIHJldHVybiB0aGlzLmdyb3VwKGdyb3VwSWR4KTsKICB9CgogIExpc3Q8U3RyaW5nPiBncm91cHMoTGlzdDxpbnQ+IGdyb3Vwc1NwZWMpIHsKICAgIHZhciBncm91cHNMaXN0ID0gbmV3IExpc3Q8U3RyaW5nPihncm91cHNTcGVjLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3Vwc1NwZWMubGVuZ3RoOyBpKyspIHsKICAgICAgZ3JvdXBzTGlzdFtpXSA9IGdyb3VwKGdyb3Vwc1NwZWNbaV0pOwogICAgfQogICAgcmV0dXJuIGdyb3Vwc0xpc3Q7CiAgfQoKICBpbnQgZ2V0IGdyb3VwQ291bnQgPT4gX3JlZ2V4cC5fZ3JvdXBDb3VudDsKCiAgUGF0dGVybiBnZXQgcGF0dGVybiA9PiBfcmVnZXhwOwoKICBTdHJpbmcgbmFtZWRHcm91cChTdHJpbmcgbmFtZSkgewogICAgdmFyIGlkeCA9IF9yZWdleHAuX2dyb3VwTmFtZUluZGV4KG5hbWUpOwogICAgaWYgKGlkeCA8IDApIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigiTm90IGEgY2FwdHVyZSBncm91cCBuYW1lOiAke25hbWV9Iik7CiAgICB9CiAgICByZXR1cm4gZ3JvdXAoaWR4KTsKICB9CgogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IGdyb3VwTmFtZXMgewogICAgcmV0dXJuIF9yZWdleHAuX2dyb3VwTmFtZXM7CiAgfQoKICBmaW5hbCBSZWdFeHAgX3JlZ2V4cDsKICBmaW5hbCBTdHJpbmcgaW5wdXQ7CiAgZmluYWwgTGlzdDxpbnQ+IF9tYXRjaDsKICBzdGF0aWMgY29uc3QgaW50IF9NQVRDSF9QQUlSID0gMjsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfUmVnRXhwIGltcGxlbWVudHMgUmVnRXhwIHsKICBmYWN0b3J5IF9SZWdFeHAoU3RyaW5nIHBhdHRlcm4sCiAgICAgIHtib29sIG11bHRpTGluZTogZmFsc2UsCiAgICAgIGJvb2wgY2FzZVNlbnNpdGl2ZTogdHJ1ZSwKICAgICAgYm9vbCB1bmljb2RlOiBmYWxzZSwKICAgICAgYm9vbCBkb3RBbGw6IGZhbHNlfSkgbmF0aXZlICJSZWdFeHBfZmFjdG9yeSI7CgogIFJlZ0V4cE1hdGNoIGZpcnN0TWF0Y2goU3RyaW5nIHN0cikgewogICAgaWYgKHN0ciBpcyEgU3RyaW5nKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihzdHIpOwogICAgTGlzdCBtYXRjaCA9IF9FeGVjdXRlTWF0Y2goc3RyLCAwKTsKICAgIGlmIChtYXRjaCA9PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIG5ldyBfUmVnRXhwTWF0Y2guXyh0aGlzLCBzdHIsIG1hdGNoKTsKICB9CgogIEl0ZXJhYmxlPFJlZ0V4cE1hdGNoPiBhbGxNYXRjaGVzKFN0cmluZyBzdHJpbmcsIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0cmluZyBpcyEgU3RyaW5nKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihzdHJpbmcpOwogICAgaWYgKHN0YXJ0IGlzISBpbnQpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHN0YXJ0KTsKICAgIGlmICgwID4gc3RhcnQgfHwgc3RhcnQgPiBzdHJpbmcubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKHN0YXJ0LCAwLCBzdHJpbmcubGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiBuZXcgX0FsbE1hdGNoZXNJdGVyYWJsZSh0aGlzLCBzdHJpbmcsIHN0YXJ0KTsKICB9CgogIFJlZ0V4cE1hdGNoIG1hdGNoQXNQcmVmaXgoU3RyaW5nIHN0cmluZywgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RyaW5nIGlzISBTdHJpbmcpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHN0cmluZyk7CiAgICBpZiAoc3RhcnQgaXMhIGludCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Ioc3RhcnQpOwogICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+IHN0cmluZy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIHN0cmluZy5sZW5ndGgpOwogICAgfQogICAgTGlzdDxpbnQ+IGxpc3QgPSBfRXhlY3V0ZU1hdGNoU3RpY2t5KHN0cmluZywgc3RhcnQpOwogICAgaWYgKGxpc3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmV3IF9SZWdFeHBNYXRjaC5fKHRoaXMsIHN0cmluZywgbGlzdCk7CiAgfQoKICBib29sIGhhc01hdGNoKFN0cmluZyBzdHIpIHsKICAgIGlmIChzdHIgaXMhIFN0cmluZykgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Ioc3RyKTsKICAgIExpc3QgbWF0Y2ggPSBfRXhlY3V0ZU1hdGNoKHN0ciwgMCk7CiAgICByZXR1cm4gKG1hdGNoID09IG51bGwpID8gZmFsc2UgOiB0cnVlOwogIH0KCiAgU3RyaW5nIHN0cmluZ01hdGNoKFN0cmluZyBzdHIpIHsKICAgIGlmIChzdHIgaXMhIFN0cmluZykgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Ioc3RyKTsKICAgIExpc3QgbWF0Y2ggPSBfRXhlY3V0ZU1hdGNoKHN0ciwgMCk7CiAgICBpZiAobWF0Y2ggPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBzdHIuX3N1YnN0cmluZ1VuY2hlY2tlZChtYXRjaFswXSwgbWF0Y2hbMV0pOwogIH0KCiAgU3RyaW5nIGdldCBwYXR0ZXJuIG5hdGl2ZSAiUmVnRXhwX2dldFBhdHRlcm4iOwoKICBib29sIGdldCBpc011bHRpTGluZSBuYXRpdmUgIlJlZ0V4cF9nZXRJc011bHRpTGluZSI7CgogIGJvb2wgZ2V0IGlzQ2FzZVNlbnNpdGl2ZSBuYXRpdmUgIlJlZ0V4cF9nZXRJc0Nhc2VTZW5zaXRpdmUiOwoKICBib29sIGdldCBpc1VuaWNvZGUgbmF0aXZlICJSZWdFeHBfZ2V0SXNVbmljb2RlIjsKCiAgYm9vbCBnZXQgaXNEb3RBbGwgbmF0aXZlICJSZWdFeHBfZ2V0SXNEb3RBbGwiOwoKICBpbnQgZ2V0IF9ncm91cENvdW50IG5hdGl2ZSAiUmVnRXhwX2dldEdyb3VwQ291bnQiOwoKICAvLyBSZXR1cm5zIGEgTGlzdCBbU3RyaW5nLCBpbnQsIFN0cmluZywgaW50LCAuLi5dIHdoZXJlIGVhY2gKICAvLyBTdHJpbmcgaXMgdGhlIG5hbWUgb2YgYSBjYXB0dXJlIGdyb3VwIGFuZCB0aGUgZm9sbG93aW5nCiAgLy8gaW50IGlzIHRoYXQgY2FwdHVyZSBncm91cCdzIGluZGV4LgogIExpc3QgZ2V0IF9ncm91cE5hbWVMaXN0IG5hdGl2ZSAiUmVnRXhwX2dldEdyb3VwTmFtZU1hcCI7CgogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IF9ncm91cE5hbWVzIHN5bmMqIHsKICAgIGZpbmFsIG5hbWVMaXN0ID0gX2dyb3VwTmFtZUxpc3Q7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVMaXN0Lmxlbmd0aDsgaSArPSAyKSB7CiAgICAgIHlpZWxkIG5hbWVMaXN0W2ldIGFzIFN0cmluZzsKICAgIH0KICB9CgogIGludCBfZ3JvdXBOYW1lSW5kZXgoU3RyaW5nIG5hbWUpIHsKICAgIHZhciBuYW1lTGlzdCA9IF9ncm91cE5hbWVMaXN0OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lTGlzdC5sZW5ndGg7IGkgKz0gMikgewogICAgICBpZiAobmFtZSA9PSBuYW1lTGlzdFtpXSkgewogICAgICAgIHJldHVybiBuYW1lTGlzdFtpICsgMV07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIC8vIEJ5dGUgbWFwIG9mIG9uZSBieXRlIGNoYXJhY3RlcnMgd2l0aCBhIDB4ZmYgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHdvcmQKICAvLyBjaGFyYWN0ZXIgKGRpZ2l0LCBsZXR0ZXIgb3IgdW5kZXJzY29yZSkgYW5kIDB4MDAgb3RoZXJ3aXNlLgogIC8vIFVzZWQgYnkgZ2VuZXJhdGVkIFJlZ0V4cCBjb2RlLgogIHN0YXRpYyBjb25zdCBMaXN0PGludD4gX3dvcmRDaGFyYWN0ZXJNYXAgPSBjb25zdCA8aW50PlsKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAvLyAnMCcgLSAnNycKICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vICc4JyAtICc5JwoKICAgIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIC8vICdBJyAtICdHJwogICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgLy8gJ0gnIC0gJ08nCiAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAvLyAnUCcgLSAnVycKICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIC8vICdYJyAtICdaJywgJ18nCgogICAgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgLy8gJ2EnIC0gJ2cnCiAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAvLyAnaCcgLSAnbycKICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIC8vICdwJyAtICd3JwogICAgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gJ3gnIC0gJ3onCiAgICAvLyBMYXRpbi0xIHJhbmdlCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogIF07CgogIExpc3QgX0V4ZWN1dGVNYXRjaChTdHJpbmcgc3RyLCBpbnQgc3RhcnRfaW5kZXgpIG5hdGl2ZSAiUmVnRXhwX0V4ZWN1dGVNYXRjaCI7CgogIExpc3QgX0V4ZWN1dGVNYXRjaFN0aWNreShTdHJpbmcgc3RyLCBpbnQgc3RhcnRfaW5kZXgpCiAgICAgIG5hdGl2ZSAiUmVnRXhwX0V4ZWN1dGVNYXRjaFN0aWNreSI7Cn0KCmNsYXNzIF9BbGxNYXRjaGVzSXRlcmFibGUgZXh0ZW5kcyBJdGVyYWJsZUJhc2U8UmVnRXhwTWF0Y2g+IHsKICBmaW5hbCBfUmVnRXhwIF9yZTsKICBmaW5hbCBTdHJpbmcgX3N0cjsKICBmaW5hbCBpbnQgX3N0YXJ0OwoKICBfQWxsTWF0Y2hlc0l0ZXJhYmxlKHRoaXMuX3JlLCB0aGlzLl9zdHIsIHRoaXMuX3N0YXJ0KTsKCiAgSXRlcmF0b3I8UmVnRXhwTWF0Y2g+IGdldCBpdGVyYXRvciA9PgogICAgICBuZXcgX0FsbE1hdGNoZXNJdGVyYXRvcihfcmUsIF9zdHIsIF9zdGFydCk7Cn0KCmNsYXNzIF9BbGxNYXRjaGVzSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxSZWdFeHBNYXRjaD4gewogIGZpbmFsIFN0cmluZyBfc3RyOwogIGludCBfbmV4dEluZGV4OwogIF9SZWdFeHAgX3JlOwogIFJlZ0V4cE1hdGNoIF9jdXJyZW50OwoKICBfQWxsTWF0Y2hlc0l0ZXJhdG9yKHRoaXMuX3JlLCB0aGlzLl9zdHIsIHRoaXMuX25leHRJbmRleCk7CgogIFJlZ0V4cE1hdGNoIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICBzdGF0aWMgYm9vbCBfaXNMZWFkU3Vycm9nYXRlKGludCBjKSB7CiAgICByZXR1cm4gYyA+PSAweGQ4MDAgJiYgYyA8PSAweGRiZmY7CiAgfQoKICBzdGF0aWMgYm9vbCBfaXNUcmFpbFN1cnJvZ2F0ZShpbnQgYykgewogICAgcmV0dXJuIGMgPj0gMHhkYzAwICYmIGMgPD0gMHhkZmZmOwogIH0KCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfcmUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAvLyBDbGVhcmVkIGFmdGVyIGEgZmFpbGVkIG1hdGNoLgogICAgaWYgKF9uZXh0SW5kZXggPD0gX3N0ci5sZW5ndGgpIHsKICAgICAgdmFyIG1hdGNoID0gX3JlLl9FeGVjdXRlTWF0Y2goX3N0ciwgX25leHRJbmRleCk7CiAgICAgIGlmIChtYXRjaCAhPSBudWxsKSB7CiAgICAgICAgX2N1cnJlbnQgPSBuZXcgX1JlZ0V4cE1hdGNoLl8oX3JlLCBfc3RyLCBtYXRjaCk7CiAgICAgICAgX25leHRJbmRleCA9IF9jdXJyZW50LmVuZDsKICAgICAgICBpZiAoX25leHRJbmRleCA9PSBfY3VycmVudC5zdGFydCkgewogICAgICAgICAgLy8gWmVyby13aWR0aCBtYXRjaC4gQWR2YW5jZSBieSBvbmUgbW9yZSwgdW5sZXNzIHRoZSByZWdleHAKICAgICAgICAgIC8vIGlzIGluIHVuaWNvZGUgbW9kZSBhbmQgaXQgd291bGQgcHV0IHVzIHdpdGhpbiBhIHN1cnJvZ2F0ZQogICAgICAgICAgLy8gcGFpci4gSW4gdGhhdCBjYXNlLCBhZHZhbmNlIHBhc3QgdGhlIGNvZGUgcG9pbnQgYXMgYSB3aG9sZS4KICAgICAgICAgIGlmIChfcmUuaXNVbmljb2RlICYmCiAgICAgICAgICAgICAgX25leHRJbmRleCArIDEgPCBfc3RyLmxlbmd0aCAmJgogICAgICAgICAgICAgIF9pc0xlYWRTdXJyb2dhdGUoX3N0ci5jb2RlVW5pdEF0KF9uZXh0SW5kZXgpKSAmJgogICAgICAgICAgICAgIF9pc1RyYWlsU3Vycm9nYXRlKF9zdHIuY29kZVVuaXRBdChfbmV4dEluZGV4ICsgMSkpKSB7CiAgICAgICAgICAgIF9uZXh0SW5kZXgrKzsKICAgICAgICAgIH0KICAgICAgICAgIF9uZXh0SW5kZXgrKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIF9jdXJyZW50ID0gbnVsbDsKICAgIF9yZSA9IG51bGw7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CoGVAE5OPAEeAQcPCSAeIBsdGU8qARktNScgCAEkHiQsIB8QGw0aBgEbASczAUYZBAEGRQVIOQY3TzZHFEtLRUtJS0tFS0tBTDAlQwYYBAEJJjRONQElIwlNOUxRGi9ELShKHgQBTy5PTlEoRRgqPjc6KAEXJCQCAUgoPxgYHBYVAVEUASgbJyouNiomBAIBSkMZGBwBKwIBLDkBHhoBHS0EARsxBAEfOiwGJyMcHhMGPAQBJSEEAS46MiwGFwQBLQEiASMtE0AGFwQBJCAEARgWGiQCARoiIh4gGzQBJzYoGRMGMQQBRTw3LjsGOQQBPjw3LjsGOSMzBAEeNigrBAEjNigZEwY4BAExATcBPwEzATEBNQE/PSg7ASslMyMGBAElIzMhIAgGDwQBTEEkOjQ0NDQBNDRBQQFBQUFGAUFBQUEVNDQ0NAE0NDQ0ATQ0NDQBNDQ0NAUBUAE4KgIBPhUVFAE5ASgyAgE9FRIPGAE9AScBKCcEASknBAEURCU3GzkjLEZHSR8uP0QaDBgKFQgGFRASBAIBIWRhcnQ6Y29yZS1wYXRjaC9yZWdleHBfcGF0Y2guZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3N0YWNrdHJhY2UuZGFydIGYLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgovLy8gVk0gaW50ZXJuYWwgU3RhY2tUcmFjZSBpbXBsZW1lbnRhdGlvbi4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfU3RhY2tUcmFjZSBpbXBsZW1lbnRzIFN0YWNrVHJhY2UgewogIC8vIHRvU3RyaW5nKCkgaXMgb3ZlcnJpZGRlbiBvbiB0aGUgQysrIHNpZGUuCn0KDQBOTjwBHgErGiovAgEfZGFydDpjb3JlLXBhdGNoL3N0YWNrdHJhY2UuZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3N0cmluZ19wYXRjaC5kYXJ0wAC10C8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKY29uc3QgaW50IF9tYXhBc2NpaSA9IDB4N2Y7CmNvbnN0IGludCBfbWF4TGF0aW4xID0gMHhmZjsKY29uc3QgaW50IF9tYXhVdGYxNiA9IDB4ZmZmZjsKY29uc3QgaW50IF9tYXhVbmljb2RlID0gMHgxMGZmZmY7CgpAcGF0Y2gKY2xhc3MgU3RyaW5nIHsKICBAcGF0Y2gKICBmYWN0b3J5IFN0cmluZy5mcm9tQ2hhckNvZGVzKEl0ZXJhYmxlPGludD4gY2hhckNvZGVzLAogICAgICBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIGlmIChjaGFyQ29kZXMgaXMhIEl0ZXJhYmxlKQogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShjaGFyQ29kZXMsICJjaGFyQ29kZXMiKTsKICAgIGlmIChzdGFydCBpcyEgaW50KSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShzdGFydCwgInN0YXJ0Iik7CiAgICBpZiAoZW5kICE9IG51bGwgJiYgZW5kIGlzISBpbnQpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKGVuZCwgImVuZCIpOwogICAgcmV0dXJuIF9TdHJpbmdCYXNlLmNyZWF0ZUZyb21DaGFyQ29kZXMoY2hhckNvZGVzLCBzdGFydCwgZW5kLCBudWxsKTsKICB9CgogIEBwYXRjaAogIGZhY3RvcnkgU3RyaW5nLmZyb21DaGFyQ29kZShpbnQgY2hhckNvZGUpIHsKICAgIGlmIChjaGFyQ29kZSA+PSAwKSB7CiAgICAgIGlmIChjaGFyQ29kZSA8PSAweGZmKSB7CiAgICAgICAgcmV0dXJuIF9PbmVCeXRlU3RyaW5nLl9hbGxvY2F0ZSgxKS4uX3NldEF0KDAsIGNoYXJDb2RlKTsKICAgICAgfQogICAgICBpZiAoY2hhckNvZGUgPD0gMHhmZmZmKSB7CiAgICAgICAgcmV0dXJuIF9TdHJpbmdCYXNlLl9jcmVhdGVGcm9tQ29kZVBvaW50cygKICAgICAgICAgICAgbmV3IF9MaXN0KDEpLi5bMF0gPSBjaGFyQ29kZSwgMCwgMSk7CiAgICAgIH0KICAgICAgaWYgKGNoYXJDb2RlIDw9IDB4MTBmZmZmKSB7CiAgICAgICAgdmFyIGxvdyA9IDB4REMwMCB8IChjaGFyQ29kZSAmIDB4M2ZmKTsKICAgICAgICBpbnQgYml0cyA9IGNoYXJDb2RlIC0gMHgxMDAwMDsKICAgICAgICB2YXIgaGlnaCA9IDB4RDgwMCB8IChiaXRzID4+IDEwKTsKICAgICAgICByZXR1cm4gX1N0cmluZ0Jhc2UuX2NyZWF0ZUZyb21Db2RlUG9pbnRzKAogICAgICAgICAgICBuZXcgX0xpc3QoMikKICAgICAgICAgICAgICAuLlswXSA9IGhpZ2gKICAgICAgICAgICAgICAuLlsxXSA9IGxvdywKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMik7CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGNoYXJDb2RlLCAwLCAweDEwZmZmZik7CiAgfQoKICBAcGF0Y2gKICBjb25zdCBmYWN0b3J5IFN0cmluZy5mcm9tRW52aXJvbm1lbnQoU3RyaW5nIG5hbWUsIHtTdHJpbmcgZGVmYXVsdFZhbHVlfSkKICAgICAgbmF0aXZlICJTdHJpbmdfZnJvbUVudmlyb25tZW50IjsKCiAgYm9vbCBnZXQgX2lzT25lQnl0ZTsKICBTdHJpbmcgX3N1YnN0cmluZ1VuY2hlY2tlZChpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KTsKfQoKLyoqCiAqIFtfU3RyaW5nQmFzZV0gY29udGFpbnMgY29tbW9uIG1ldGhvZHMgdXNlZCBieSBjb25jcmV0ZSBTdHJpbmcKICogaW1wbGVtZW50YXRpb25zLCBlLmcuLCBfT25lQnl0ZVN0cmluZy4KICovCmFic3RyYWN0IGNsYXNzIF9TdHJpbmdCYXNlIGltcGxlbWVudHMgU3RyaW5nIHsKICBib29sIF9pc1doaXRlc3BhY2UoaW50IGNvZGVVbml0KTsKCiAgLy8gQ29uc3RhbnRzIHVzZWQgYnkgcmVwbGFjZUFsbCBlbmNvZGluZyBvZiBzdHJpbmcgc2xpY2VzIGJldHdlZW4gbWF0Y2hlcy4KICAvLyBBIHN0cmluZyBzbGljZSAoc3RhcnQrbGVuZ3RoKSBpcyBlbmNvZGVkIGluIGEgc2luZ2xlIFNtaSB0byBzYXZlIG1lbW9yeQogIC8vIG92ZXJoZWFkIGluIHRoZSBjb21tb24gY2FzZS4KICAvLyBXZSB1c2UgZmV3ZXIgYml0cyBmb3IgbGVuZ3RoICgxMSBiaXRzKSB0aGFuIGZvciB0aGUgc3RhcnQgaW5kZXggKDE5KyBiaXRzKS4KICAvLyBGb3IgbG9uZyBzdHJpbmdzLCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgbWFueSBsYXJnZSBpbmRpY2VzLAogIC8vIGJ1dCBpdCdzIHVubGlrZWx5IHRvIGhhdmUgbWFueSBsb25nIGxlbmd0aHMgc2luY2Ugc2xpY2VzIGRvbid0IG92ZXJsYXAuCiAgLy8gSWYgdGhlcmUgYXJlIGZldyBtYXRjaGVzIGluIGEgbG9uZyBzdHJpbmcsIHRoZW4gdGhlcmUgYXJlIGZldyBsb25nIHNsaWNlcywKICAvLyBhbmQgaWYgdGhlcmUgYXJlIG1hbnkgbWF0Y2hlcywgdGhlcmUnbGwgbGlrZWx5IGJlIG1hbnkgc2hvcnQgc2xpY2VzLgogIC8vCiAgLy8gRW5jb2RpbmcgaXM6IDAoKHN0YXJ0IDw8IF9sZW5ndGhCaXRzKSB8IGxlbmd0aCkKCiAgLy8gTnVtYmVyIG9mIGJpdHMgdXNlZCBieSBsZW5ndGguCiAgLy8gVGhpcyBpcyB0aGUgc2hpZnQgdXNlZCB0byBlbmNvZGUgYW5kIGRlY29kZSB0aGUgc3RhcnQgaW5kZXguCiAgc3RhdGljIGNvbnN0IGludCBfbGVuZ3RoQml0cyA9IDExOwogIC8vIFRoZSBtYXhpbWFsIGFsbG93ZWQgbGVuZ3RoIHZhbHVlIGluIGFuIGVuY29kZWQgc2xpY2UuCiAgc3RhdGljIGNvbnN0IGludCBfbWF4TGVuZ3RoVmFsdWUgPSAoMSA8PCBfbGVuZ3RoQml0cykgLSAxOwogIC8vIE1hc2sgb2YgbGVuZ3RoIGluIGVuY29kZWQgc21pIHZhbHVlLgogIHN0YXRpYyBjb25zdCBpbnQgX2xlbmd0aE1hc2sgPSBfbWF4TGVuZ3RoVmFsdWU7CiAgc3RhdGljIGNvbnN0IGludCBfc3RhcnRCaXRzID0gX21heFVuc2lnbmVkU21pQml0cyAtIF9sZW5ndGhCaXRzOwogIC8vIE1heGltYWwgYWxsb3dlZCBzdGFydCBpbmRleCB2YWx1ZSBpbiBhbiBlbmNvZGVkIHNsaWNlLgogIHN0YXRpYyBjb25zdCBpbnQgX21heFN0YXJ0VmFsdWUgPSAoMSA8PCBfc3RhcnRCaXRzKSAtIDE7CiAgLy8gV2UgcGljayAzMCBhcyBhIHNhZmUgbG93ZXIgYm91bmQgb24gYXZhaWxhYmxlIGJpdHMgaW4gYSBuZWdhdGl2ZSBzbWkuCiAgLy8gVE9ETyhscm4pOiBDb25zaWRlciBhbGxvd2luZyBtb3JlIGJpdHMgZm9yIHN0YXJ0IG9uIDY0LWJpdCBzeXN0ZW1zLgogIHN0YXRpYyBjb25zdCBpbnQgX21heFVuc2lnbmVkU21pQml0cyA9IDMwOwoKICAvLyBGb3IgbG9uZ2VyIHN0cmluZ3MsIGNhbGxpbmcgaW50byBDKysgdG8gY3JlYXRlIHRoZSByZXN1bHQgb2YgYQogIC8vIFtyZXBsYWNlQWxsXSBpcyBmYXN0ZXIgdGhhbiBbX2pvaW5SZXBsYWNlQWxsT25lQnl0ZVJlc3VsdF0uCiAgLy8gVE9ETyhscm4pOiBTZWUgaWYgdGhpcyBsaW1pdCBjYW4gYmUgdHdlYWtlZC4KICBzdGF0aWMgY29uc3QgaW50IF9tYXhKb2luUmVwbGFjZU9uZUJ5dGVTdHJpbmdMZW5ndGggPSA1MDA7CgogIGZhY3RvcnkgX1N0cmluZ0Jhc2UuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIl9TdHJpbmdCYXNlIGNhbid0IGJlIGluc3RhbmlhdGVkIik7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBoYXNoQ29kZSBuYXRpdmUgIlN0cmluZ19nZXRIYXNoQ29kZSI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgZ2V0IF9pZGVudGl0eUhhc2hDb2RlIG5hdGl2ZSAiU3RyaW5nX2dldEhhc2hDb2RlIjsKCiAgYm9vbCBnZXQgX2lzT25lQnl0ZSB7CiAgICAvLyBBbHRlcm5hdGl2ZWx5IHJldHVybiBmYWxzZSBhbmQgb3ZlcnJpZGUgaXQgb24gb25lLWJ5dGUgc3RyaW5nIGNsYXNzZXMuCiAgICBpbnQgaWQgPSBDbGFzc0lELmdldElEKHRoaXMpOwogICAgcmV0dXJuIGlkID09IENsYXNzSUQuY2lkT25lQnl0ZVN0cmluZyB8fAogICAgICAgIGlkID09IENsYXNzSUQuY2lkRXh0ZXJuYWxPbmVCeXRlU3RyaW5nOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBtb3N0IGVmZmljaWVudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIHNwZWNpZmllZAogICAqIFtjaGFyQ29kZXNdLgogICAqCiAgICogT25seSB1c2VzIHRoZSBjaGFyYWN0ZXIgY29kZXMgYmV0d2VlbiBpbmRleCBbc3RhcnRdIGFuZCBpbmRleCBbZW5kXSBvZgogICAqIGBjaGFyQ29kZXNgLiBUaGV5IG11c3Qgc2F0aXNmeSBgMCA8PSBzdGFydCA8PSBlbmQgPD0gY2hhckNvZGVzLmxlbmd0aGAuCiAgICoKICAgKiBUaGUgW2xpbWl0XSBpcyBhbiB1cHBlciBsaW1pdCBvbiB0aGUgY2hhcmFjdGVyIGNvZGVzIGluIHRoZSBpdGVyYWJsZS4KICAgKiBJdCdzIGBudWxsYCBpZiB1bmtub3duLgogICAqLwogIHN0YXRpYyBTdHJpbmcgY3JlYXRlRnJvbUNoYXJDb2RlcygKICAgICAgSXRlcmFibGU8aW50PiBjaGFyQ29kZXMsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGxpbWl0KSB7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgic3RhcnQiKTsKICAgIGlmIChjaGFyQ29kZXMgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoY2hhckNvZGVzKTsKICAgIC8vIFRPRE8oc3JkamFuKTogQWxzbyBza2lwIGNvcHlpbmcgb2Ygd2lkZSB0eXBlZCBhcnJheXMuCiAgICBmaW5hbCBjY2lkID0gQ2xhc3NJRC5nZXRJRChjaGFyQ29kZXMpOwogICAgaWYgKChjY2lkICE9IENsYXNzSUQuY2lkQXJyYXkpICYmCiAgICAgICAgKGNjaWQgIT0gQ2xhc3NJRC5jaWRHcm93YWJsZU9iamVjdEFycmF5KSAmJgogICAgICAgIChjY2lkICE9IENsYXNzSUQuY2lkSW1tdXRhYmxlQXJyYXkpKSB7CiAgICAgIGlmIChjaGFyQ29kZXMgaXMgVWludDhMaXN0KSB7CiAgICAgICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgY2hhckNvZGVzLmxlbmd0aCk7CiAgICAgICAgcmV0dXJuIF9jcmVhdGVPbmVCeXRlU3RyaW5nKGNoYXJDb2Rlcywgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKICAgICAgfSBlbHNlIGlmIChjaGFyQ29kZXMgaXMhIFVpbnQxNkxpc3QpIHsKICAgICAgICByZXR1cm4gX2NyZWF0ZVN0cmluZ0Zyb21JdGVyYWJsZShjaGFyQ29kZXMsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICB9CiAgICBpbnQgY29kZUNvdW50ID0gY2hhckNvZGVzLmxlbmd0aDsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGNvZGVDb3VudCk7CiAgICBmaW5hbCBsZW4gPSBlbmQgLSBzdGFydDsKICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuICIiOwogICAgbGltaXQgPz89IF9zY2FuQ29kZVVuaXRzKGNoYXJDb2Rlcywgc3RhcnQsIGVuZCk7CiAgICBpZiAobGltaXQgPCAwKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKGNoYXJDb2Rlcyk7CiAgICB9CiAgICBpZiAobGltaXQgPD0gX21heExhdGluMSkgewogICAgICByZXR1cm4gX2NyZWF0ZU9uZUJ5dGVTdHJpbmcoY2hhckNvZGVzLCBzdGFydCwgbGVuKTsKICAgIH0KICAgIGlmIChsaW1pdCA8PSBfbWF4VXRmMTYpIHsKICAgICAgcmV0dXJuIF9Ud29CeXRlU3RyaW5nLl9hbGxvY2F0ZUZyb21Ud29CeXRlTGlzdChjaGFyQ29kZXMsIHN0YXJ0LCBlbmQpOwogICAgfQogICAgLy8gVE9ETyhscm4pOiBDb25zaWRlciBwYXNzaW5nIGxpbWl0IHRvIF9jcmVhdGVGcm9tQ29kZVBvaW50cywgYmVjYXVzZQogICAgLy8gdGhlIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSBmdWxseSBnZW5lcmljIGFuZCBkb2Vzbid0IGtub3cgdGhhdCBpdHMKICAgIC8vIGNoYXJDb2RlcyBhcmUgbm90IGFsbCBMYXRpbi0xIG9yIFV0Zi0xNi4KICAgIHJldHVybiBfY3JlYXRlRnJvbUNvZGVQb2ludHMoY2hhckNvZGVzLCBzdGFydCwgZW5kKTsKICB9CgogIHN0YXRpYyBpbnQgX3NjYW5Db2RlVW5pdHMoTGlzdDxpbnQ+IGNoYXJDb2RlcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBpbnQgYml0cyA9IDA7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICBpbnQgY29kZSA9IGNoYXJDb2Rlc1tpXTsKICAgICAgaWYgKGNvZGUgaXMhIF9TbWkpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKGNoYXJDb2Rlcyk7CiAgICAgIGJpdHMgfD0gY29kZTsKICAgIH0KICAgIHJldHVybiBiaXRzOwogIH0KCiAgc3RhdGljIFN0cmluZyBfY3JlYXRlU3RyaW5nRnJvbUl0ZXJhYmxlKAogICAgICBJdGVyYWJsZTxpbnQ+IGNoYXJDb2RlcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAvLyBUcmVhdCBjaGFyQ29kZXMgYXMgSXRlcmFibGUuCiAgICBpZiAoY2hhckNvZGVzIGlzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlKSB7CiAgICAgIGludCBsZW5ndGggPSBjaGFyQ29kZXMubGVuZ3RoOwogICAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsZW5ndGgpOwogICAgICBmaW5hbCBjaGFyQ29kZUxpc3QgPQogICAgICAgICAgbmV3IExpc3Q8aW50Pi5mcm9tKGNoYXJDb2Rlcy50YWtlKGVuZCkuc2tpcChzdGFydCksIGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIHJldHVybiBjcmVhdGVGcm9tQ2hhckNvZGVzKGNoYXJDb2RlTGlzdCwgMCwgY2hhckNvZGVMaXN0Lmxlbmd0aCwgbnVsbCk7CiAgICB9CiAgICAvLyBEb24ndCBrbm93IGxlbmd0aCBvZiBpdGVyYWJsZSwgc28gaXRlcmF0ZSBhbmQgc2VlIGlmIGFsbCB0aGUgdmFsdWVzCiAgICAvLyBhcmUgdGhlcmUuCiAgICBpZiAoc3RhcnQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgY2hhckNvZGVzLmxlbmd0aCk7CiAgICB2YXIgaXQgPSBjaGFyQ29kZXMuaXRlcmF0b3I7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXJ0OyBpKyspIHsKICAgICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIGkpOwogICAgICB9CiAgICB9CiAgICBMaXN0PGludD4gY2hhckNvZGVMaXN0OwogICAgaW50IGJpdHMgPSAwOyAvLyBCaXR3aXNlLW9yIG9mIGFsbCBjaGFyIGNvZGVzIGluIGxpc3QuCiAgICBpZiAoZW5kID09IG51bGwpIHsKICAgICAgdmFyIGxpc3QgPSA8aW50PltdOwogICAgICB3aGlsZSAoaXQubW92ZU5leHQoKSkgewogICAgICAgIGludCBjb2RlID0gaXQuY3VycmVudDsKICAgICAgICBiaXRzIHw9IGNvZGU7CiAgICAgICAgbGlzdC5hZGQoY29kZSk7CiAgICAgIH0KICAgICAgY2hhckNvZGVMaXN0ID0gbWFrZUxpc3RGaXhlZExlbmd0aDxpbnQ+KGxpc3QpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGVuZCA8IHN0YXJ0KSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoZW5kLCBzdGFydCwgY2hhckNvZGVzLmxlbmd0aCk7CiAgICAgIH0KICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OwogICAgICBjaGFyQ29kZUxpc3QgPSBuZXcgTGlzdDxpbnQ+KGxlbik7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHsKICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGVuZCwgc3RhcnQsIHN0YXJ0ICsgaSk7CiAgICAgICAgfQogICAgICAgIGludCBjb2RlID0gaXQuY3VycmVudDsKICAgICAgICBiaXRzIHw9IGNvZGU7CiAgICAgICAgY2hhckNvZGVMaXN0W2ldID0gY29kZTsKICAgICAgfQogICAgfQogICAgaW50IGxlbmd0aCA9IGNoYXJDb2RlTGlzdC5sZW5ndGg7CiAgICBpZiAoYml0cyA8IDApIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoY2hhckNvZGVzKTsKICAgIH0KICAgIGJvb2wgaXNPbmVCeXRlU3RyaW5nID0gKGJpdHMgPD0gX21heExhdGluMSk7CiAgICBpZiAoaXNPbmVCeXRlU3RyaW5nKSB7CiAgICAgIHJldHVybiBfY3JlYXRlT25lQnl0ZVN0cmluZyhjaGFyQ29kZUxpc3QsIDAsIGxlbmd0aCk7CiAgICB9CiAgICByZXR1cm4gY3JlYXRlRnJvbUNoYXJDb2RlcyhjaGFyQ29kZUxpc3QsIDAsIGxlbmd0aCwgYml0cyk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9jcmVhdGVPbmVCeXRlU3RyaW5nKExpc3Q8aW50PiBjaGFyQ29kZXMsIGludCBzdGFydCwgaW50IGxlbikgewogICAgLy8gSXQncyBhbHdheXMgZmFzdGVyIHRvIGRvIHRoaXMgaW4gRGFydCB0aGFuIHRvIGNhbGwgaW50byB0aGUgcnVudGltZS4KICAgIHZhciBzID0gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKGxlbik7CgogICAgLy8gU3BlY2lhbCBjYXNlIGZvciBfVWludDhBcnJheVZpZXcuCiAgICBpZiAoY2hhckNvZGVzIGlzIFVpbnQ4TGlzdCkgewogICAgICBpZiAoc3RhcnQgPj0gMCAmJiBsZW4gPj0gMCkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgIHMuX3NldEF0KGksIGNoYXJDb2Rlc1tzdGFydCArIGldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHM7CiAgICAgIH0KICAgIH0KCiAgICAvLyBGYWxsIHRocm91Z2ggdG8gbm9ybWFsIGNhc2UuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIHMuX3NldEF0KGksIGNoYXJDb2Rlc1tzdGFydCArIGldKTsKICAgIH0KICAgIHJldHVybiBzOwogIH0KCiAgc3RhdGljIFN0cmluZyBfY3JlYXRlRnJvbUNvZGVQb2ludHMoTGlzdDxpbnQ+IGNvZGVQb2ludHMsIGludCBzdGFydCwgaW50IGVuZCkKICAgICAgbmF0aXZlICJTdHJpbmdCYXNlX2NyZWF0ZUZyb21Db2RlUG9pbnRzIjsKCiAgU3RyaW5nIG9wZXJhdG9yIFtdKGludCBpbmRleCkgbmF0aXZlICJTdHJpbmdfY2hhckF0IjsKCiAgaW50IGNvZGVVbml0QXQoaW50IGluZGV4KTsgLy8gSW1wbGVtZW50ZWQgaW4gdGhlIHN1YmNsYXNzZXMuCgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBpbnQgZ2V0IGxlbmd0aCBuYXRpdmUgIlN0cmluZ19nZXRMZW5ndGgiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBnZXQgaXNFbXB0eSB7CiAgICByZXR1cm4gdGhpcy5sZW5ndGggPT0gMDsKICB9CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CgogIFN0cmluZyBvcGVyYXRvciArKFN0cmluZyBvdGhlcikgbmF0aXZlICJTdHJpbmdfY29uY2F0IjsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKG90aGVyIGlzIFN0cmluZyAmJiB0aGlzLmxlbmd0aCA9PSBvdGhlci5sZW5ndGgpIHsKICAgICAgZmluYWwgbGVuID0gdGhpcy5sZW5ndGg7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBpZiAodGhpcy5jb2RlVW5pdEF0KGkpICE9IG90aGVyLmNvZGVVbml0QXQoaSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBpbnQgY29tcGFyZVRvKFN0cmluZyBvdGhlcikgewogICAgaW50IHRoaXNMZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGludCBvdGhlckxlbmd0aCA9IG90aGVyLmxlbmd0aDsKICAgIGludCBsZW4gPSAodGhpc0xlbmd0aCA8IG90aGVyTGVuZ3RoKSA/IHRoaXNMZW5ndGggOiBvdGhlckxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgaW50IHRoaXNDb2RlVW5pdCA9IHRoaXMuY29kZVVuaXRBdChpKTsKICAgICAgaW50IG90aGVyQ29kZVVuaXQgPSBvdGhlci5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAodGhpc0NvZGVVbml0IDwgb3RoZXJDb2RlVW5pdCkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBpZiAodGhpc0NvZGVVbml0ID4gb3RoZXJDb2RlVW5pdCkgewogICAgICAgIHJldHVybiAxOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpc0xlbmd0aCA8IG90aGVyTGVuZ3RoKSByZXR1cm4gLTE7CiAgICBpZiAodGhpc0xlbmd0aCA+IG90aGVyTGVuZ3RoKSByZXR1cm4gMTsKICAgIHJldHVybiAwOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgX3N1YnN0cmluZ01hdGNoZXMoaW50IHN0YXJ0LCBTdHJpbmcgb3RoZXIpIHsKICAgIGlmIChvdGhlci5pc0VtcHR5KSByZXR1cm4gdHJ1ZTsKICAgIGZpbmFsIGxlbiA9IG90aGVyLmxlbmd0aDsKICAgIGlmICgoc3RhcnQgPCAwKSB8fCAoc3RhcnQgKyBsZW4gPiB0aGlzLmxlbmd0aCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBpZiAodGhpcy5jb2RlVW5pdEF0KGkgKyBzdGFydCkgIT0gb3RoZXIuY29kZVVuaXRBdChpKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIGVuZHNXaXRoKFN0cmluZyBvdGhlcikgewogICAgcmV0dXJuIF9zdWJzdHJpbmdNYXRjaGVzKHRoaXMubGVuZ3RoIC0gb3RoZXIubGVuZ3RoLCBvdGhlcik7CiAgfQoKICBib29sIHN0YXJ0c1dpdGgoUGF0dGVybiBwYXR0ZXJuLCBbaW50IGluZGV4ID0gMF0pIHsKICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPiB0aGlzLmxlbmd0aCkpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoaW5kZXgsIDAsIHRoaXMubGVuZ3RoKTsKICAgIH0KICAgIGlmIChwYXR0ZXJuIGlzIFN0cmluZykgewogICAgICByZXR1cm4gX3N1YnN0cmluZ01hdGNoZXMoaW5kZXgsIHBhdHRlcm4pOwogICAgfQogICAgcmV0dXJuIHBhdHRlcm4ubWF0Y2hBc1ByZWZpeCh0aGlzLCBpbmRleCkgIT0gbnVsbDsKICB9CgogIGludCBpbmRleE9mKFBhdHRlcm4gcGF0dGVybiwgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoKHN0YXJ0IDwgMCkgfHwgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKHN0YXJ0LCAwLCB0aGlzLmxlbmd0aCwgInN0YXJ0Iik7CiAgICB9CiAgICBpZiAocGF0dGVybiBpcyBTdHJpbmcpIHsKICAgICAgU3RyaW5nIG90aGVyID0gcGF0dGVybjsKICAgICAgaW50IG1heEluZGV4ID0gdGhpcy5sZW5ndGggLSBvdGhlci5sZW5ndGg7CiAgICAgIC8vIFRPRE86IFVzZSBhbiBlZmZpY2llbnQgc3RyaW5nIHNlYXJjaCAoZS5nLiBCTUgpLgogICAgICBmb3IgKGludCBpbmRleCA9IHN0YXJ0OyBpbmRleCA8PSBtYXhJbmRleDsgaW5kZXgrKykgewogICAgICAgIGlmIChfc3Vic3RyaW5nTWF0Y2hlcyhpbmRleCwgb3RoZXIpKSB7CiAgICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8PSB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIC8vIFRPRE8oMTEyNzYpOyBUaGlzIGhhcyBxdWFkcmF0aWMgYmVoYXZpb3IgYmVjYXVzZSBtYXRjaEFzUHJlZml4IHRyaWVzCiAgICAgIC8vIHRvIGZpbmQgYSBsYXRlciBtYXRjaCB0b28uIE9wdGltaXplIG1hdGNoQXNQcmVmaXggdG8gYXZvaWQgdGhpcy4KICAgICAgaWYgKHBhdHRlcm4ubWF0Y2hBc1ByZWZpeCh0aGlzLCBpKSAhPSBudWxsKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGludCBsYXN0SW5kZXhPZihQYXR0ZXJuIHBhdHRlcm4sIFtpbnQgc3RhcnQgPSBudWxsXSkgewogICAgaWYgKHN0YXJ0ID09IG51bGwpIHsKICAgICAgc3RhcnQgPSB0aGlzLmxlbmd0aDsKICAgIH0gZWxzZSBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIHRoaXMubGVuZ3RoKTsKICAgIH0KICAgIGlmIChwYXR0ZXJuIGlzIFN0cmluZykgewogICAgICBTdHJpbmcgb3RoZXIgPSBwYXR0ZXJuOwogICAgICBpbnQgbWF4SW5kZXggPSB0aGlzLmxlbmd0aCAtIG90aGVyLmxlbmd0aDsKICAgICAgaWYgKG1heEluZGV4IDwgc3RhcnQpIHN0YXJ0ID0gbWF4SW5kZXg7CiAgICAgIGZvciAoaW50IGluZGV4ID0gc3RhcnQ7IGluZGV4ID49IDA7IGluZGV4LS0pIHsKICAgICAgICBpZiAoX3N1YnN0cmluZ01hdGNoZXMoaW5kZXgsIG90aGVyKSkgewogICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPj0gMDsgaS0tKSB7CiAgICAgIC8vIFRPRE8oMTEyNzYpOyBUaGlzIGhhcyBxdWFkcmF0aWMgYmVoYXZpb3IgYmVjYXVzZSBtYXRjaEFzUHJlZml4IHRyaWVzCiAgICAgIC8vIHRvIGZpbmQgYSBsYXRlciBtYXRjaCB0b28uIE9wdGltaXplIG1hdGNoQXNQcmVmaXggdG8gYXZvaWQgdGhpcy4KICAgICAgaWYgKHBhdHRlcm4ubWF0Y2hBc1ByZWZpeCh0aGlzLCBpKSAhPSBudWxsKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIFN0cmluZyBzdWJzdHJpbmcoaW50IHN0YXJ0SW5kZXgsIFtpbnQgZW5kSW5kZXhdKSB7CiAgICBlbmRJbmRleCA/Pz0gdGhpcy5sZW5ndGg7CgogICAgaWYgKChzdGFydEluZGV4IDwgMCkgfHwgKHN0YXJ0SW5kZXggPiB0aGlzLmxlbmd0aCkpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IudmFsdWUoc3RhcnRJbmRleCk7CiAgICB9CiAgICBpZiAoKGVuZEluZGV4IDwgMCkgfHwgKGVuZEluZGV4ID4gdGhpcy5sZW5ndGgpKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnZhbHVlKGVuZEluZGV4KTsKICAgIH0KICAgIGlmIChzdGFydEluZGV4ID4gZW5kSW5kZXgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IudmFsdWUoc3RhcnRJbmRleCk7CiAgICB9CiAgICByZXR1cm4gX3N1YnN0cmluZ1VuY2hlY2tlZChzdGFydEluZGV4LCBlbmRJbmRleCk7CiAgfQoKICBTdHJpbmcgX3N1YnN0cmluZ1VuY2hlY2tlZChpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7CiAgICBhc3NlcnQoZW5kSW5kZXggIT0gbnVsbCk7CiAgICBhc3NlcnQoKHN0YXJ0SW5kZXggPj0gMCkgJiYgKHN0YXJ0SW5kZXggPD0gdGhpcy5sZW5ndGgpKTsKICAgIGFzc2VydCgoZW5kSW5kZXggPj0gMCkgJiYgKGVuZEluZGV4IDw9IHRoaXMubGVuZ3RoKSk7CiAgICBhc3NlcnQoc3RhcnRJbmRleCA8PSBlbmRJbmRleCk7CgogICAgaWYgKHN0YXJ0SW5kZXggPT0gZW5kSW5kZXgpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgaWYgKChzdGFydEluZGV4ID09IDApICYmIChlbmRJbmRleCA9PSB0aGlzLmxlbmd0aCkpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBpZiAoKHN0YXJ0SW5kZXggKyAxKSA9PSBlbmRJbmRleCkgewogICAgICByZXR1cm4gdGhpc1tzdGFydEluZGV4XTsKICAgIH0KICAgIHJldHVybiBfc3Vic3RyaW5nVW5jaGVja2VkTmF0aXZlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKICB9CgogIFN0cmluZyBfc3Vic3RyaW5nVW5jaGVja2VkTmF0aXZlKGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpCiAgICAgIG5hdGl2ZSAiU3RyaW5nQmFzZV9zdWJzdHJpbmdVbmNoZWNrZWQiOwoKICAvLyBDaGVja3MgZm9yIG9uZS1ieXRlIHdoaXRlc3BhY2VzIG9ubHkuCiAgc3RhdGljIGJvb2wgX2lzT25lQnl0ZVdoaXRlc3BhY2UoaW50IGNvZGVVbml0KSB7CiAgICBpZiAoY29kZVVuaXQgPD0gMzIpIHsKICAgICAgcmV0dXJuICgoY29kZVVuaXQgPT0gMzIpIHx8IC8vIFNwYWNlLgogICAgICAgICAgKChjb2RlVW5pdCA8PSAxMykgJiYgKGNvZGVVbml0ID49IDkpKSk7IC8vIENSLCBMRiwgVEFCLCBldGMuCiAgICB9CiAgICByZXR1cm4gKGNvZGVVbml0ID09IDB4ODUpIHx8IChjb2RlVW5pdCA9PSAweEEwKTsgLy8gTkVMLCBOQlNQLgogIH0KCiAgLy8gQ2hhcmFjdGVycyB3aXRoIFdoaXRlc3BhY2UgcHJvcGVydHkgKFVuaWNvZGUgNi4zKS4KICAvLyAwMDA5Li4wMDBEICAgIDsgV2hpdGVfU3BhY2UgIyBDYyAgICAgICA8Y29udHJvbC0wMDA5Pi4uPGNvbnRyb2wtMDAwRD4KICAvLyAwMDIwICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBacyAgICAgICBTUEFDRQogIC8vIDAwODUgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIENjICAgICAgIDxjb250cm9sLTAwODU+CiAgLy8gMDBBMCAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWnMgICAgICAgTk8tQlJFQUsgU1BBQ0UKICAvLyAxNjgwICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBacyAgICAgICBPR0hBTSBTUEFDRSBNQVJLCiAgLy8gMjAwMC4uMjAwQSAgICA7IFdoaXRlX1NwYWNlICMgWnMgICAgICAgRU4gUVVBRC4uSEFJUiBTUEFDRQogIC8vIDIwMjggICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpsICAgICAgIExJTkUgU0VQQVJBVE9SCiAgLy8gMjAyOSAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWnAgICAgICAgUEFSQUdSQVBIIFNFUEFSQVRPUgogIC8vIDIwMkYgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpzICAgICAgIE5BUlJPVyBOTy1CUkVBSyBTUEFDRQogIC8vIDIwNUYgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpzICAgICAgIE1FRElVTSBNQVRIRU1BVElDQUwgU1BBQ0UKICAvLyAzMDAwICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBacyAgICAgICBJREVPR1JBUEhJQyBTUEFDRQogIC8vCiAgLy8gQk9NOiAweEZFRkYKICBzdGF0aWMgYm9vbCBfaXNUd29CeXRlV2hpdGVzcGFjZShpbnQgY29kZVVuaXQpIHsKICAgIGlmIChjb2RlVW5pdCA8PSAzMikgewogICAgICByZXR1cm4gKGNvZGVVbml0ID09IDMyKSB8fCAoKGNvZGVVbml0IDw9IDEzKSAmJiAoY29kZVVuaXQgPj0gOSkpOwogICAgfQogICAgaWYgKGNvZGVVbml0IDwgMHg4NSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKChjb2RlVW5pdCA9PSAweDg1KSB8fCAoY29kZVVuaXQgPT0gMHhBMCkpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIChjb2RlVW5pdCA8PSAweDIwMEEpCiAgICAgICAgPyAoKGNvZGVVbml0ID09IDB4MTY4MCkgfHwgKDB4MjAwMCA8PSBjb2RlVW5pdCkpCiAgICAgICAgOiAoKGNvZGVVbml0ID09IDB4MjAyOCkgfHwKICAgICAgICAgICAgKGNvZGVVbml0ID09IDB4MjAyOSkgfHwKICAgICAgICAgICAgKGNvZGVVbml0ID09IDB4MjAyRikgfHwKICAgICAgICAgICAgKGNvZGVVbml0ID09IDB4MjA1RikgfHwKICAgICAgICAgICAgKGNvZGVVbml0ID09IDB4MzAwMCkgfHwKICAgICAgICAgICAgKGNvZGVVbml0ID09IDB4RkVGRikpOwogIH0KCiAgaW50IF9maXJzdE5vbldoaXRlc3BhY2UoKSB7CiAgICBmaW5hbCBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGludCBmaXJzdCA9IDA7CiAgICBmb3IgKDsgZmlyc3QgPCBsZW47IGZpcnN0KyspIHsKICAgICAgaWYgKCFfaXNXaGl0ZXNwYWNlKHRoaXMuY29kZVVuaXRBdChmaXJzdCkpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmaXJzdDsKICB9CgogIGludCBfbGFzdE5vbldoaXRlc3BhY2UoKSB7CiAgICBpbnQgbGFzdCA9IHRoaXMubGVuZ3RoIC0gMTsKICAgIGZvciAoOyBsYXN0ID49IDA7IGxhc3QtLSkgewogICAgICBpZiAoIV9pc1doaXRlc3BhY2UodGhpcy5jb2RlVW5pdEF0KGxhc3QpKSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbGFzdDsKICB9CgogIFN0cmluZyB0cmltKCkgewogICAgZmluYWwgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBpbnQgZmlyc3QgPSBfZmlyc3ROb25XaGl0ZXNwYWNlKCk7CiAgICBpZiAobGVuID09IGZpcnN0KSB7CiAgICAgIC8vIFN0cmluZyBjb250YWlucyBvbmx5IHdoaXRlc3BhY2VzLgogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBpbnQgbGFzdCA9IF9sYXN0Tm9uV2hpdGVzcGFjZSgpICsgMTsKICAgIGlmICgoZmlyc3QgPT0gMCkgJiYgKGxhc3QgPT0gbGVuKSkgewogICAgICAvLyBSZXR1cm5zIHRoaXMgc3RyaW5nIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZwogICAgICAvLyB3aGl0ZXNwYWNlcy4KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByZXR1cm4gX3N1YnN0cmluZ1VuY2hlY2tlZChmaXJzdCwgbGFzdCk7CiAgfQoKICBTdHJpbmcgdHJpbUxlZnQoKSB7CiAgICBmaW5hbCBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGludCBmaXJzdCA9IDA7CiAgICBmb3IgKDsgZmlyc3QgPCBsZW47IGZpcnN0KyspIHsKICAgICAgaWYgKCFfaXNXaGl0ZXNwYWNlKHRoaXMuY29kZVVuaXRBdChmaXJzdCkpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChsZW4gPT0gZmlyc3QpIHsKICAgICAgLy8gU3RyaW5nIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZXMuCiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGlmIChmaXJzdCA9PSAwKSB7CiAgICAgIC8vIFJldHVybnMgdGhpcyBzdHJpbmcgc2luY2UgaXQgZG9lcyBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nCiAgICAgIC8vIHdoaXRlc3BhY2VzLgogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJldHVybiBfc3Vic3RyaW5nVW5jaGVja2VkKGZpcnN0LCBsZW4pOwogIH0KCiAgU3RyaW5nIHRyaW1SaWdodCgpIHsKICAgIGZpbmFsIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgaW50IGxhc3QgPSBsZW4gLSAxOwogICAgZm9yICg7IGxhc3QgPj0gMDsgbGFzdC0tKSB7CiAgICAgIGlmICghX2lzV2hpdGVzcGFjZSh0aGlzLmNvZGVVbml0QXQobGFzdCkpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChsYXN0ID09IC0xKSB7CiAgICAgIC8vIFN0cmluZyBjb250YWlucyBvbmx5IHdoaXRlc3BhY2VzLgogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBpZiAobGFzdCA9PSAobGVuIC0gMSkpIHsKICAgICAgLy8gUmV0dXJucyB0aGlzIHN0cmluZyBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlIHRyYWlsaW5nIHdoaXRlc3BhY2VzLgogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJldHVybiBfc3Vic3RyaW5nVW5jaGVja2VkKDAsIGxhc3QgKyAxKTsKICB9CgogIFN0cmluZyBvcGVyYXRvciAqKGludCB0aW1lcykgewogICAgaWYgKHRpbWVzIDw9IDApIHJldHVybiAiIjsKICAgIGlmICh0aW1lcyA9PSAxKSByZXR1cm4gdGhpczsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHRoaXMpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCB0aW1lczsgaSsrKSB7CiAgICAgIGJ1ZmZlci53cml0ZSh0aGlzKTsKICAgIH0KICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIFN0cmluZyBwYWRMZWZ0KGludCB3aWR0aCwgW1N0cmluZyBwYWRkaW5nID0gJyAnXSkgewogICAgaW50IGRlbHRhID0gd2lkdGggLSB0aGlzLmxlbmd0aDsKICAgIGlmIChkZWx0YSA8PSAwKSByZXR1cm4gdGhpczsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhOyBpKyspIHsKICAgICAgYnVmZmVyLndyaXRlKHBhZGRpbmcpOwogICAgfQogICAgYnVmZmVyLndyaXRlKHRoaXMpOwogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgU3RyaW5nIHBhZFJpZ2h0KGludCB3aWR0aCwgW1N0cmluZyBwYWRkaW5nID0gJyAnXSkgewogICAgaW50IGRlbHRhID0gd2lkdGggLSB0aGlzLmxlbmd0aDsKICAgIGlmIChkZWx0YSA8PSAwKSByZXR1cm4gdGhpczsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHRoaXMpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YTsgaSsrKSB7CiAgICAgIGJ1ZmZlci53cml0ZShwYWRkaW5nKTsKICAgIH0KICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIGJvb2wgY29udGFpbnMoUGF0dGVybiBwYXR0ZXJuLCBbaW50IHN0YXJ0SW5kZXggPSAwXSkgewogICAgaWYgKHBhdHRlcm4gaXMgU3RyaW5nKSB7CiAgICAgIGlmIChzdGFydEluZGV4IDwgMCB8fCBzdGFydEluZGV4ID4gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydEluZGV4LCAwLCB0aGlzLmxlbmd0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluZGV4T2YocGF0dGVybiwgc3RhcnRJbmRleCkgPj0gMDsKICAgIH0KICAgIHJldHVybiBwYXR0ZXJuLmFsbE1hdGNoZXModGhpcy5zdWJzdHJpbmcoc3RhcnRJbmRleCkpLmlzTm90RW1wdHk7CiAgfQoKICBTdHJpbmcgcmVwbGFjZUZpcnN0KFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nIHJlcGxhY2VtZW50LAogICAgICBbaW50IHN0YXJ0SW5kZXggPSAwXSkgewogICAgaWYgKHBhdHRlcm4gaXMhIFBhdHRlcm4pIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIiR7cGF0dGVybn0gaXMgbm90IGEgUGF0dGVybiIpOwogICAgfQogICAgaWYgKHJlcGxhY2VtZW50IGlzISBTdHJpbmcpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIiR7cmVwbGFjZW1lbnR9IGlzIG5vdCBhIFN0cmluZyIpOwogICAgfQogICAgaWYgKHN0YXJ0SW5kZXggaXMhIGludCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiJHtzdGFydEluZGV4fSBpcyBub3QgYW4gaW50Iik7CiAgICB9CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsdWVJbkludGVydmFsKHN0YXJ0SW5kZXgsIDAsIHRoaXMubGVuZ3RoLCAic3RhcnRJbmRleCIpOwogICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBzdGFydEluZGV4ID09IDAKICAgICAgICA/IHBhdHRlcm4uYWxsTWF0Y2hlcyh0aGlzKS5pdGVyYXRvcgogICAgICAgIDogcGF0dGVybi5hbGxNYXRjaGVzKHRoaXMsIHN0YXJ0SW5kZXgpLml0ZXJhdG9yOwogICAgaWYgKCFpdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm4gdGhpczsKICAgIE1hdGNoIG1hdGNoID0gaXRlcmF0b3IuY3VycmVudDsKICAgIHJldHVybiByZXBsYWNlUmFuZ2UobWF0Y2guc3RhcnQsIG1hdGNoLmVuZCwgcmVwbGFjZW1lbnQpOwogIH0KCiAgU3RyaW5nIHJlcGxhY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFN0cmluZyByZXBsYWNlbWVudCkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgbGVuZ3RoKTsKICAgIGJvb2wgcmVwbGFjZW1lbnRJc09uZUJ5dGUgPSByZXBsYWNlbWVudC5faXNPbmVCeXRlOwogICAgaWYgKHN0YXJ0ID09IDAgJiYgZW5kID09IGxlbmd0aCkgcmV0dXJuIHJlcGxhY2VtZW50OwogICAgaW50IHJlcGxhY2VtZW50TGVuZ3RoID0gcmVwbGFjZW1lbnQubGVuZ3RoOwogICAgaW50IHRvdGFsTGVuZ3RoID0gc3RhcnQgKyAobGVuZ3RoIC0gZW5kKSArIHJlcGxhY2VtZW50TGVuZ3RoOwogICAgaWYgKHJlcGxhY2VtZW50SXNPbmVCeXRlICYmIHRoaXMuX2lzT25lQnl0ZSkgewogICAgICB2YXIgcmVzdWx0ID0gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKHRvdGFsTGVuZ3RoKTsKICAgICAgaW50IGluZGV4ID0gMDsKICAgICAgaW5kZXggPSByZXN1bHQuX3NldFJhbmdlKGluZGV4LCB0aGlzLCAwLCBzdGFydCk7CiAgICAgIGluZGV4ID0gcmVzdWx0Ll9zZXRSYW5nZShzdGFydCwgcmVwbGFjZW1lbnQsIDAsIHJlcGxhY2VtZW50TGVuZ3RoKTsKICAgICAgcmVzdWx0Ll9zZXRSYW5nZShpbmRleCwgdGhpcywgZW5kLCBsZW5ndGgpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgTGlzdCBzbGljZXMgPSBbXTsKICAgIF9hZGRSZXBsYWNlU2xpY2Uoc2xpY2VzLCAwLCBzdGFydCk7CiAgICBpZiAocmVwbGFjZW1lbnQubGVuZ3RoID4gMCkgc2xpY2VzLmFkZChyZXBsYWNlbWVudCk7CiAgICBfYWRkUmVwbGFjZVNsaWNlKHNsaWNlcywgZW5kLCBsZW5ndGgpOwogICAgcmV0dXJuIF9qb2luUmVwbGFjZUFsbFJlc3VsdCgKICAgICAgICB0aGlzLCBzbGljZXMsIHRvdGFsTGVuZ3RoLCByZXBsYWNlbWVudElzT25lQnl0ZSk7CiAgfQoKICBzdGF0aWMgaW50IF9hZGRSZXBsYWNlU2xpY2UoTGlzdCBtYXRjaGVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGlmIChsZW5ndGggPiAwKSB7CiAgICAgIGlmIChsZW5ndGggPD0gX21heExlbmd0aFZhbHVlICYmIHN0YXJ0IDw9IF9tYXhTdGFydFZhbHVlKSB7CiAgICAgICAgbWF0Y2hlcy5hZGQoLSgoc3RhcnQgPDwgX2xlbmd0aEJpdHMpIHwgbGVuZ3RoKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWF0Y2hlcy5hZGQoc3RhcnQpOwogICAgICAgIG1hdGNoZXMuYWRkKGVuZCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBsZW5ndGg7CiAgfQoKICBTdHJpbmcgcmVwbGFjZUFsbChQYXR0ZXJuIHBhdHRlcm4sIFN0cmluZyByZXBsYWNlbWVudCkgewogICAgaWYgKHBhdHRlcm4gPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgicGF0dGVybiIpOwogICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoInJlcGxhY2VtZW50Iik7CgogICAgaW50IHN0YXJ0SW5kZXggPSAwOwogICAgLy8gU3RyaW5nIGZyYWdtZW50cyB0aGF0IHJlcGxhY2UgdGhlIHRoZSBwcmVmaXggW3RoaXNdIHVwIHRvIFtzdGFydEluZGV4XS4KICAgIExpc3QgbWF0Y2hlcyA9IFtdOwogICAgaW50IGxlbmd0aCA9IDA7IC8vIExlbmd0aCBvZiBhbGwgZnJhZ21lbnRzLgogICAgaW50IHJlcGxhY2VtZW50TGVuZ3RoID0gcmVwbGFjZW1lbnQubGVuZ3RoOwoKICAgIGlmIChyZXBsYWNlbWVudExlbmd0aCA9PSAwKSB7CiAgICAgIGZvciAoTWF0Y2ggbWF0Y2ggaW4gcGF0dGVybi5hbGxNYXRjaGVzKHRoaXMpKSB7CiAgICAgICAgbGVuZ3RoICs9IF9hZGRSZXBsYWNlU2xpY2UobWF0Y2hlcywgc3RhcnRJbmRleCwgbWF0Y2guc3RhcnQpOwogICAgICAgIHN0YXJ0SW5kZXggPSBtYXRjaC5lbmQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoTWF0Y2ggbWF0Y2ggaW4gcGF0dGVybi5hbGxNYXRjaGVzKHRoaXMpKSB7CiAgICAgICAgbGVuZ3RoICs9IF9hZGRSZXBsYWNlU2xpY2UobWF0Y2hlcywgc3RhcnRJbmRleCwgbWF0Y2guc3RhcnQpOwogICAgICAgIG1hdGNoZXMuYWRkKHJlcGxhY2VtZW50KTsKICAgICAgICBsZW5ndGggKz0gcmVwbGFjZW1lbnRMZW5ndGg7CiAgICAgICAgc3RhcnRJbmRleCA9IG1hdGNoLmVuZDsKICAgICAgfQogICAgfQogICAgLy8gTm8gbWF0Y2gsIG9yIGEgemVyby1sZW5ndGggbWF0Y2ggYXQgc3RhcnQgd2l0aCB6ZXJvLWxlbmd0aCByZXBsYWNlbWVudC4KICAgIGlmIChzdGFydEluZGV4ID09IDAgJiYgbGVuZ3RoID09IDApIHJldHVybiB0aGlzOwogICAgbGVuZ3RoICs9IF9hZGRSZXBsYWNlU2xpY2UobWF0Y2hlcywgc3RhcnRJbmRleCwgdGhpcy5sZW5ndGgpOwogICAgYm9vbCByZXBsYWNlbWVudElzT25lQnl0ZSA9IHJlcGxhY2VtZW50Ll9pc09uZUJ5dGU7CiAgICBpZiAocmVwbGFjZW1lbnRJc09uZUJ5dGUgJiYKICAgICAgICBsZW5ndGggPCBfbWF4Sm9pblJlcGxhY2VPbmVCeXRlU3RyaW5nTGVuZ3RoICYmCiAgICAgICAgdGhpcy5faXNPbmVCeXRlKSB7CiAgICAgIC8vIFRPRE8obHJuKTogSXMgdGhlcmUgYSBjdXQtb2ZmIHBvaW50LCBvciBpcyBydW50aW1lIGFsd2F5cyBmYXN0ZXI/CiAgICAgIHJldHVybiBfam9pblJlcGxhY2VBbGxPbmVCeXRlUmVzdWx0KHRoaXMsIG1hdGNoZXMsIGxlbmd0aCk7CiAgICB9CiAgICByZXR1cm4gX2pvaW5SZXBsYWNlQWxsUmVzdWx0KHRoaXMsIG1hdGNoZXMsIGxlbmd0aCwgcmVwbGFjZW1lbnRJc09uZUJ5dGUpOwogIH0KCiAgLyoqCiAgICogQXMgW19qb2luUmVwbGFjZUFsbFJlc3VsdF0sIGJ1dCBrbm93aW5nIHRoYXQgdGhlIHJlc3VsdAogICAqIGlzIGFsd2F5cyBhIFtfT25lQnl0ZVN0cmluZ10uCiAgICovCiAgc3RhdGljIFN0cmluZyBfam9pblJlcGxhY2VBbGxPbmVCeXRlUmVzdWx0KAogICAgICBTdHJpbmcgYmFzZSwgTGlzdCBtYXRjaGVzLCBpbnQgbGVuZ3RoKSB7CiAgICBfT25lQnl0ZVN0cmluZyByZXN1bHQgPSBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUobGVuZ3RoKTsKICAgIGludCB3cml0ZUluZGV4ID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF0Y2hlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZW50cnkgPSBtYXRjaGVzW2ldOwogICAgICBpZiAoZW50cnkgaXMgX1NtaSkgewogICAgICAgIGludCBzbGljZVN0YXJ0ID0gZW50cnk7CiAgICAgICAgaW50IHNsaWNlRW5kOwogICAgICAgIGlmIChzbGljZVN0YXJ0IDwgMCkgewogICAgICAgICAgaW50IGJpdHMgPSAtc2xpY2VTdGFydDsKICAgICAgICAgIGludCBzbGljZUxlbmd0aCA9IGJpdHMgJiBfbGVuZ3RoTWFzazsKICAgICAgICAgIHNsaWNlU3RhcnQgPSBiaXRzID4+IF9sZW5ndGhCaXRzOwogICAgICAgICAgc2xpY2VFbmQgPSBzbGljZVN0YXJ0ICsgc2xpY2VMZW5ndGg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGkrKzsKICAgICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdpdGggdmFsaWQgbWF0Y2hlcyBsaXN0cy4KICAgICAgICAgIC8vIElmIHRoZSBsaXN0IGlzIHNob3J0LCBvciBzbGljZUVuZCBpcyBub3QgYW4gaW50ZWdlciwgb25lIG9mCiAgICAgICAgICAvLyB0aGUgbmV4dCBmZXcgbGluZXMgd2lsbCB0aHJvdyBhbnl3YXkuCiAgICAgICAgICBhc3NlcnQoaSA8IG1hdGNoZXMubGVuZ3RoKTsKICAgICAgICAgIHNsaWNlRW5kID0gbWF0Y2hlc1tpXTsKICAgICAgICB9CiAgICAgICAgZm9yIChpbnQgaiA9IHNsaWNlU3RhcnQ7IGogPCBzbGljZUVuZDsgaisrKSB7CiAgICAgICAgICByZXN1bHQuX3NldEF0KHdyaXRlSW5kZXgrKywgYmFzZS5jb2RlVW5pdEF0KGopKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gUmVwbGFjZW1lbnQgaXMgYSBvbmUtYnl0ZSBzdHJpbmcuCiAgICAgICAgU3RyaW5nIHJlcGxhY2VtZW50ID0gZW50cnk7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByZXBsYWNlbWVudC5sZW5ndGg7IGorKykgewogICAgICAgICAgcmVzdWx0Ll9zZXRBdCh3cml0ZUluZGV4KyssIHJlcGxhY2VtZW50LmNvZGVVbml0QXQoaikpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXNzZXJ0KHdyaXRlSW5kZXggPT0gbGVuZ3RoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvKioKICAgKiBDb21iaW5lIHRoZSByZXN1bHRzIG9mIGEgW3JlcGxhY2VBbGxdIG1hdGNoIGludG8gYSBuZXcgc3RyaW5nLgogICAqCiAgICogVGhlIFttYXRjaGVzXSBsaXN0cyBjb250YWlucyBTbWkgaW5kZXggcGFpcnMgcmVwcmVzZW50aW5nIHNsaWNlcyBvZgogICAqIFtiYXNlXSBhbmQgW1N0cmluZ11zIHRvIGJlIHB1dCBpbiBiZXR3ZWVuIHRoZSBzbGljZXMuCiAgICoKICAgKiBUaGUgdG90YWwgW2xlbmd0aF0gb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMga25vd24sIGFzIGlzCiAgICogd2hldGhlciB0aGUgcmVwbGFjZW1lbnQgc3RyaW5ncyBhcmUgb25lLWJ5dGUgc3RyaW5ncy4KICAgKiBJZiB0aGV5IGFyZSwgdGhlbiB3ZSBoYXZlIHRvIGNoZWNrIHRoZSBiYXNlIHN0cmluZyBzbGljZXMgdG8ga25vdwogICAqIHdoZXRoZXIgdGhlIHJlc3VsdCBtdXN0IGJlIGEgb25lLWJ5dGUgc3RyaW5nLgogICAqLwogIHN0YXRpYyBTdHJpbmcKICAgICAgX2pvaW5SZXBsYWNlQWxsUmVzdWx0KFN0cmluZyBiYXNlLCBMaXN0IG1hdGNoZXMsIGludCBsZW5ndGgsCiAgICAgICAgICBib29sIHJlcGxhY2VtZW50U3RyaW5nc0FyZU9uZUJ5dGUpCiAgICAgIG5hdGl2ZSAiU3RyaW5nQmFzZV9qb2luUmVwbGFjZUFsbFJlc3VsdCI7CgogIFN0cmluZyByZXBsYWNlQWxsTWFwcGVkKFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nIHJlcGxhY2UoTWF0Y2ggbWF0Y2gpKSB7CiAgICBpZiAocGF0dGVybiA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJwYXR0ZXJuIik7CiAgICBpZiAocmVwbGFjZSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJyZXBsYWNlIik7CiAgICBMaXN0IG1hdGNoZXMgPSBbXTsKICAgIGludCBsZW5ndGggPSAwOwogICAgaW50IHN0YXJ0SW5kZXggPSAwOwogICAgYm9vbCByZXBsYWNlbWVudFN0cmluZ3NBcmVPbmVCeXRlID0gdHJ1ZTsKICAgIGZvciAoTWF0Y2ggbWF0Y2ggaW4gcGF0dGVybi5hbGxNYXRjaGVzKHRoaXMpKSB7CiAgICAgIGxlbmd0aCArPSBfYWRkUmVwbGFjZVNsaWNlKG1hdGNoZXMsIHN0YXJ0SW5kZXgsIG1hdGNoLnN0YXJ0KTsKICAgICAgdmFyIHJlcGxhY2VtZW50ID0gIiR7cmVwbGFjZShtYXRjaCl9IjsKICAgICAgbWF0Y2hlcy5hZGQocmVwbGFjZW1lbnQpOwogICAgICBsZW5ndGggKz0gcmVwbGFjZW1lbnQubGVuZ3RoOwogICAgICByZXBsYWNlbWVudFN0cmluZ3NBcmVPbmVCeXRlID0KICAgICAgICAgIHJlcGxhY2VtZW50U3RyaW5nc0FyZU9uZUJ5dGUgJiYgcmVwbGFjZW1lbnQuX2lzT25lQnl0ZTsKICAgICAgc3RhcnRJbmRleCA9IG1hdGNoLmVuZDsKICAgIH0KICAgIGlmIChtYXRjaGVzLmlzRW1wdHkpIHJldHVybiB0aGlzOwogICAgbGVuZ3RoICs9IF9hZGRSZXBsYWNlU2xpY2UobWF0Y2hlcywgc3RhcnRJbmRleCwgdGhpcy5sZW5ndGgpOwogICAgaWYgKHJlcGxhY2VtZW50U3RyaW5nc0FyZU9uZUJ5dGUgJiYKICAgICAgICBsZW5ndGggPCBfbWF4Sm9pblJlcGxhY2VPbmVCeXRlU3RyaW5nTGVuZ3RoICYmCiAgICAgICAgdGhpcy5faXNPbmVCeXRlKSB7CiAgICAgIHJldHVybiBfam9pblJlcGxhY2VBbGxPbmVCeXRlUmVzdWx0KHRoaXMsIG1hdGNoZXMsIGxlbmd0aCk7CiAgICB9CiAgICByZXR1cm4gX2pvaW5SZXBsYWNlQWxsUmVzdWx0KAogICAgICAgIHRoaXMsIG1hdGNoZXMsIGxlbmd0aCwgcmVwbGFjZW1lbnRTdHJpbmdzQXJlT25lQnl0ZSk7CiAgfQoKICBTdHJpbmcgcmVwbGFjZUZpcnN0TWFwcGVkKFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nIHJlcGxhY2UoTWF0Y2ggbWF0Y2gpLAogICAgICBbaW50IHN0YXJ0SW5kZXggPSAwXSkgewogICAgaWYgKHBhdHRlcm4gPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgicGF0dGVybiIpOwogICAgaWYgKHJlcGxhY2UgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgicmVwbGFjZSIpOwogICAgaWYgKHN0YXJ0SW5kZXggPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgic3RhcnRJbmRleCIpOwogICAgUmFuZ2VFcnJvci5jaGVja1ZhbHVlSW5JbnRlcnZhbChzdGFydEluZGV4LCAwLCB0aGlzLmxlbmd0aCwgInN0YXJ0SW5kZXgiKTsKCiAgICB2YXIgbWF0Y2hlcyA9IHBhdHRlcm4uYWxsTWF0Y2hlcyh0aGlzLCBzdGFydEluZGV4KS5pdGVyYXRvcjsKICAgIGlmICghbWF0Y2hlcy5tb3ZlTmV4dCgpKSByZXR1cm4gdGhpczsKICAgIHZhciBtYXRjaCA9IG1hdGNoZXMuY3VycmVudDsKICAgIHZhciByZXBsYWNlbWVudCA9ICIke3JlcGxhY2UobWF0Y2gpfSI7CiAgICByZXR1cm4gcmVwbGFjZVJhbmdlKG1hdGNoLnN0YXJ0LCBtYXRjaC5lbmQsIHJlcGxhY2VtZW50KTsKICB9CgogIHN0YXRpYyBTdHJpbmcgX21hdGNoU3RyaW5nKE1hdGNoIG1hdGNoKSA9PiBtYXRjaFswXTsKICBzdGF0aWMgU3RyaW5nIF9zdHJpbmdJZGVudGl0eShTdHJpbmcgc3RyaW5nKSA9PiBzdHJpbmc7CgogIFN0cmluZyBfc3BsaXRNYXBKb2luRW1wdHlTdHJpbmcoCiAgICAgIFN0cmluZyBvbk1hdGNoKE1hdGNoIG1hdGNoKSwgU3RyaW5nIG9uTm9uTWF0Y2goU3RyaW5nIG5vbk1hdGNoKSkgewogICAgLy8gUGF0dGVybiBpcyB0aGUgZW1wdHkgc3RyaW5nLgogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGludCBpID0gMDsKICAgIGJ1ZmZlci53cml0ZShvbk5vbk1hdGNoKCIiKSk7CiAgICB3aGlsZSAoaSA8IGxlbmd0aCkgewogICAgICBidWZmZXIud3JpdGUob25NYXRjaChuZXcgX1N0cmluZ01hdGNoKGksIHRoaXMsICIiKSkpOwogICAgICAvLyBTcGVjaWFsIGNhc2UgdG8gYXZvaWQgc3BsaXR0aW5nIGEgc3Vycm9nYXRlIHBhaXIuCiAgICAgIGludCBjb2RlID0gdGhpcy5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoKGNvZGUgJiB+MHgzRkYpID09IDB4RDgwMCAmJiBsZW5ndGggPiBpICsgMSkgewogICAgICAgIC8vIExlYWRpbmcgc3Vycm9nYXRlOwogICAgICAgIGNvZGUgPSB0aGlzLmNvZGVVbml0QXQoaSArIDEpOwogICAgICAgIGlmICgoY29kZSAmIH4weDNGRikgPT0gMHhEQzAwKSB7CiAgICAgICAgICAvLyBNYXRjaGluZyB0cmFpbGluZyBzdXJyb2dhdGUuCiAgICAgICAgICBidWZmZXIud3JpdGUob25Ob25NYXRjaCh0aGlzLnN1YnN0cmluZyhpLCBpICsgMikpKTsKICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBidWZmZXIud3JpdGUob25Ob25NYXRjaCh0aGlzW2ldKSk7CiAgICAgIGkrKzsKICAgIH0KICAgIGJ1ZmZlci53cml0ZShvbk1hdGNoKG5ldyBfU3RyaW5nTWF0Y2goaSwgdGhpcywgIiIpKSk7CiAgICBidWZmZXIud3JpdGUob25Ob25NYXRjaCgiIikpOwogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgU3RyaW5nIHNwbGl0TWFwSm9pbihQYXR0ZXJuIHBhdHRlcm4sCiAgICAgIHtTdHJpbmcgb25NYXRjaChNYXRjaCBtYXRjaCksIFN0cmluZyBvbk5vbk1hdGNoKFN0cmluZyBub25NYXRjaCl9KSB7CiAgICBpZiAocGF0dGVybiBpcyEgUGF0dGVybikgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiJHtwYXR0ZXJufSBpcyBub3QgYSBQYXR0ZXJuIik7CiAgICB9CiAgICBvbk1hdGNoID8/PSBfbWF0Y2hTdHJpbmc7CiAgICBvbk5vbk1hdGNoID8/PSBfc3RyaW5nSWRlbnRpdHk7CiAgICBpZiAocGF0dGVybiBpcyBTdHJpbmcpIHsKICAgICAgU3RyaW5nIHN0cmluZ1BhdHRlcm4gPSBwYXR0ZXJuOwogICAgICBpZiAoc3RyaW5nUGF0dGVybi5pc0VtcHR5KSB7CiAgICAgICAgcmV0dXJuIF9zcGxpdE1hcEpvaW5FbXB0eVN0cmluZyhvbk1hdGNoLCBvbk5vbk1hdGNoKTsKICAgICAgfQogICAgfQogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGludCBzdGFydEluZGV4ID0gMDsKICAgIGZvciAoTWF0Y2ggbWF0Y2ggaW4gcGF0dGVybi5hbGxNYXRjaGVzKHRoaXMpKSB7CiAgICAgIGJ1ZmZlci53cml0ZShvbk5vbk1hdGNoKHRoaXMuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIG1hdGNoLnN0YXJ0KSkpOwogICAgICBidWZmZXIud3JpdGUob25NYXRjaChtYXRjaCkudG9TdHJpbmcoKSk7CiAgICAgIHN0YXJ0SW5kZXggPSBtYXRjaC5lbmQ7CiAgICB9CiAgICBidWZmZXIud3JpdGUob25Ob25NYXRjaCh0aGlzLnN1YnN0cmluZyhzdGFydEluZGV4KSkpOwogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgLy8gQ29udmVydCBzaW5nbGUgb2JqZWN0IHRvIHN0cmluZy4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBzdGF0aWMgU3RyaW5nIF9pbnRlcnBvbGF0ZVNpbmdsZShPYmplY3QgbykgewogICAgaWYgKG8gaXMgU3RyaW5nKSByZXR1cm4gbzsKICAgIGZpbmFsIHMgPSBvLnRvU3RyaW5nKCk7CiAgICBpZiAocyBpcyEgU3RyaW5nKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHMpOwogICAgfQogICAgcmV0dXJuIHM7CiAgfQoKICAvKioKICAgKiBDb252ZXJ0IGFsbCBvYmplY3RzIGluIFt2YWx1ZXNdIHRvIHN0cmluZ3MgYW5kIGNvbmNhdCB0aGVtCiAgICogaW50byBhIHJlc3VsdCBzdHJpbmcuCiAgICogTW9kaWZpZXMgdGhlIGlucHV0IGxpc3QgaWYgaXQgY29udGFpbnMgbm9uLWBTdHJpbmdgIHZhbHVlcy4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBzdGF0aWMgU3RyaW5nIF9pbnRlcnBvbGF0ZShmaW5hbCBMaXN0IHZhbHVlcykgewogICAgZmluYWwgbnVtVmFsdWVzID0gdmFsdWVzLmxlbmd0aDsKICAgIGludCB0b3RhbExlbmd0aCA9IDA7CiAgICBpbnQgaSA9IDA7CiAgICB3aGlsZSAoaSA8IG51bVZhbHVlcykgewogICAgICBmaW5hbCBlID0gdmFsdWVzW2ldOwogICAgICBmaW5hbCBzID0gZS50b1N0cmluZygpOwogICAgICB2YWx1ZXNbaV0gPSBzOwogICAgICBpZiAoQ2xhc3NJRC5nZXRJRChzKSA9PSBDbGFzc0lELmNpZE9uZUJ5dGVTdHJpbmcpIHsKICAgICAgICB0b3RhbExlbmd0aCArPSBzLmxlbmd0aDsKICAgICAgICBpKys7CiAgICAgIH0gZWxzZSBpZiAocyBpcyEgU3RyaW5nKSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iocyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gSGFuZGxlIHJlbWFpbmluZyBlbGVtZW50cyB3aXRob3V0IGNoZWNraW5nIGZvciBvbmUtYnl0ZS1uZXNzLgogICAgICAgIHdoaWxlICgrK2kgPCBudW1WYWx1ZXMpIHsKICAgICAgICAgIGZpbmFsIGUgPSB2YWx1ZXNbaV07CiAgICAgICAgICBmaW5hbCBzID0gZS50b1N0cmluZygpOwogICAgICAgICAgdmFsdWVzW2ldID0gczsKICAgICAgICAgIGlmIChzIGlzISBTdHJpbmcpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iocyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBfY29uY2F0UmFuZ2VOYXRpdmUodmFsdWVzLCAwLCBudW1WYWx1ZXMpOwogICAgICB9CiAgICB9CiAgICAvLyBBbGwgc3RyaW5ncyB3ZXJlIG9uZS1ieXRlIHN0cmluZ3MuCiAgICByZXR1cm4gX09uZUJ5dGVTdHJpbmcuX2NvbmNhdEFsbCh2YWx1ZXMsIHRvdGFsTGVuZ3RoKTsKICB9CgogIEl0ZXJhYmxlPE1hdGNoPiBhbGxNYXRjaGVzKFN0cmluZyBzdHJpbmcsIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+IHN0cmluZy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIHN0cmluZy5sZW5ndGgsICJzdGFydCIpOwogICAgfQogICAgcmV0dXJuIG5ldyBfU3RyaW5nQWxsTWF0Y2hlc0l0ZXJhYmxlKHN0cmluZywgdGhpcywgc3RhcnQpOwogIH0KCiAgTWF0Y2ggbWF0Y2hBc1ByZWZpeChTdHJpbmcgc3RyaW5nLCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPiBzdHJpbmcubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKHN0YXJ0LCAwLCBzdHJpbmcubGVuZ3RoKTsKICAgIH0KICAgIGlmIChzdGFydCArIHRoaXMubGVuZ3RoID4gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHN0cmluZy5jb2RlVW5pdEF0KHN0YXJ0ICsgaSkgIT0gdGhpcy5jb2RlVW5pdEF0KGkpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgX1N0cmluZ01hdGNoKHN0YXJ0LCBzdHJpbmcsIHRoaXMpOwogIH0KCiAgTGlzdDxTdHJpbmc+IHNwbGl0KFBhdHRlcm4gcGF0dGVybikgewogICAgaWYgKChwYXR0ZXJuIGlzIFN0cmluZykgJiYgcGF0dGVybi5pc0VtcHR5KSB7CiAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgTGlzdDxTdHJpbmc+KHRoaXMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcmVzdWx0W2ldID0gdGhpc1tpXTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXR0ZXJuLmFsbE1hdGNoZXModGhpcykuaXRlcmF0b3I7CiAgICBpZiAobGVuZ3RoID09IDAgJiYgaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAvLyBBIG1hdGNoZWQgZW1wdHkgc3RyaW5nIGlucHV0IHJldHVybnMgdGhlIGVtcHR5IGxpc3QuCiAgICAgIHJldHVybiA8U3RyaW5nPltdOwogICAgfQogICAgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBMaXN0PFN0cmluZz4oKTsKICAgIGludCBzdGFydEluZGV4ID0gMDsKICAgIGludCBwcmV2aW91c0luZGV4ID0gMDsKICAgIC8vICdwYXR0ZXJuJyBtYXkgbm90IGJlIGltcGxlbWVudGVkIGNvcnJlY3RseSBhbmQgdGhlcmVmb3JlIHdlIGNhbm5vdAogICAgLy8gY2FsbCBfc3Vic3RyaW5nVW5oY2hlY2tlZCB1bmxlc3MgaXQgaXMgYSB0cnVzdHdvcnRoeSB0eXBlIChlLmcuIFN0cmluZykuCiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoc3RhcnRJbmRleCA9PSBsZW5ndGggfHwgIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICByZXN1bHQuYWRkKHRoaXMuc3Vic3RyaW5nKHByZXZpb3VzSW5kZXgsIGxlbmd0aCkpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIE1hdGNoIG1hdGNoID0gaXRlcmF0b3IuY3VycmVudDsKICAgICAgaWYgKG1hdGNoLnN0YXJ0ID09IGxlbmd0aCkgewogICAgICAgIHJlc3VsdC5hZGQodGhpcy5zdWJzdHJpbmcocHJldmlvdXNJbmRleCwgbGVuZ3RoKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaW50IGVuZEluZGV4ID0gbWF0Y2guZW5kOwogICAgICBpZiAoc3RhcnRJbmRleCA9PSBlbmRJbmRleCAmJiBlbmRJbmRleCA9PSBwcmV2aW91c0luZGV4KSB7CiAgICAgICAgKytzdGFydEluZGV4OyAvLyBlbXB0eSBtYXRjaCwgYWR2YW5jZSBhbmQgcmVzdGFydAogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHJlc3VsdC5hZGQodGhpcy5zdWJzdHJpbmcocHJldmlvdXNJbmRleCwgbWF0Y2guc3RhcnQpKTsKICAgICAgc3RhcnRJbmRleCA9IHByZXZpb3VzSW5kZXggPSBlbmRJbmRleDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaXN0PGludD4gZ2V0IGNvZGVVbml0cyA9PiBuZXcgQ29kZVVuaXRzKHRoaXMpOwoKICBSdW5lcyBnZXQgcnVuZXMgPT4gbmV3IFJ1bmVzKHRoaXMpOwoKICBTdHJpbmcgdG9VcHBlckNhc2UoKSBuYXRpdmUgIlN0cmluZ190b1VwcGVyQ2FzZSI7CgogIFN0cmluZyB0b0xvd2VyQ2FzZSgpIG5hdGl2ZSAiU3RyaW5nX3RvTG93ZXJDYXNlIjsKCiAgLy8gQ29uY2F0ZW5hdGUgWydzdGFydCcsICdlbmQnWyBlbGVtZW50cyBvZiAnc3RyaW5ncycuCiAgc3RhdGljIFN0cmluZyBfY29uY2F0UmFuZ2UoTGlzdDxTdHJpbmc+IHN0cmluZ3MsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgaWYgKChlbmQgLSBzdGFydCkgPT0gMSkgewogICAgICByZXR1cm4gc3RyaW5nc1tzdGFydF07CiAgICB9CiAgICByZXR1cm4gX2NvbmNhdFJhbmdlTmF0aXZlKHN0cmluZ3MsIHN0YXJ0LCBlbmQpOwogIH0KCiAgLy8gQ2FsbCB0aGlzIG1ldGhvZCBpZiBhbGwgZWxlbWVudHMgb2YgW3N0cmluZ3NdIGFyZSBrbm93biB0byBiZSBzdHJpbmdzCiAgLy8gYnV0IG5vdCBhbGwgYXJlIGtub3duIHRvIGJlIE9uZUJ5dGVTdHJpbmcocykuCiAgc3RhdGljIFN0cmluZyBfY29uY2F0UmFuZ2VOYXRpdmUoTGlzdCBzdHJpbmdzLCBpbnQgc3RhcnQsIGludCBlbmQpCiAgICAgIG5hdGl2ZSAiU3RyaW5nX2NvbmNhdFJhbmdlIjsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfT25lQnl0ZVN0cmluZyBleHRlbmRzIF9TdHJpbmdCYXNlIHsKICBmYWN0b3J5IF9PbmVCeXRlU3RyaW5nLl91bmluc3RhbnRpYWJsZSgpIHsgdGhyb3cgIlVucmVhY2hhYmxlIjsgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBoYXNoQ29kZSBuYXRpdmUgIlN0cmluZ19nZXRIYXNoQ29kZSI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgY29kZVVuaXRBdChpbnQgaW5kZXgpIG5hdGl2ZSAiU3RyaW5nX2NvZGVVbml0QXQiOwoKICBib29sIF9pc1doaXRlc3BhY2UoaW50IGNvZGVVbml0KSB7CiAgICByZXR1cm4gX1N0cmluZ0Jhc2UuX2lzT25lQnl0ZVdoaXRlc3BhY2UoY29kZVVuaXQpOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICByZXR1cm4gc3VwZXIgPT0gb3RoZXI7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9PbmVCeXRlU3RyaW5nKQogIFN0cmluZyBfc3Vic3RyaW5nVW5jaGVja2VkTmF0aXZlKGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpCiAgICAgIG5hdGl2ZSAiT25lQnl0ZVN0cmluZ19zdWJzdHJpbmdVbmNoZWNrZWQiOwoKICBMaXN0PFN0cmluZz4gX3NwbGl0V2l0aENoYXJDb2RlKGludCBjaGFyQ29kZSkKICAgICAgbmF0aXZlICJPbmVCeXRlU3RyaW5nX3NwbGl0V2l0aENoYXJDb2RlIjsKCiAgTGlzdDxTdHJpbmc+IHNwbGl0KFBhdHRlcm4gcGF0dGVybikgewogICAgLy8gVE9ETyh2ZWdvcm92KSBpbnZlc3RpZ2F0ZSBpZiB0aGlzIGNhbiBiZSByZXdyaXR0ZW4gYXMgYGlzIF9PbmVCeXRlU3RyaW5nYAogICAgLy8gY2hlY2sgd2l0aG91dCBwZXJmb3JtYW5jZSBwZW5hbHR5LiBGcm9udC1lbmQgd291bGQgdGhlbiBwcm9tb3RlCiAgICAvLyBwYXR0ZXJuIHZhcmlhYmxlIHRvIF9PbmVCeXRlU3RyaW5nLgogICAgaWYgKENsYXNzSUQuZ2V0SUQocGF0dGVybikgPT0gQ2xhc3NJRC5jaWRPbmVCeXRlU3RyaW5nKSB7CiAgICAgIGZpbmFsIFN0cmluZyBwYXR0ZXJuQXNTdHJpbmcgPSBwYXR0ZXJuOwogICAgICBpZiAocGF0dGVybkFzU3RyaW5nLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgcmV0dXJuIF9zcGxpdFdpdGhDaGFyQ29kZShwYXR0ZXJuQXNTdHJpbmcuY29kZVVuaXRBdCgwKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdXBlci5zcGxpdChwYXR0ZXJuKTsKICB9CgogIC8vIEFsbCBlbGVtZW50IG9mICdzdHJpbmdzJyBtdXN0IGJlIE9uZUJ5dGVTdHJpbmdzLgogIHN0YXRpYyBfY29uY2F0QWxsKExpc3Qgc3RyaW5ncywgaW50IHRvdGFsTGVuZ3RoKSB7CiAgICBpZiAodG90YWxMZW5ndGggPiAxMjgpIHsKICAgICAgLy8gTmF0aXZlIGlzIHF1aWNrZXIuCiAgICAgIHJldHVybiBfU3RyaW5nQmFzZS5fY29uY2F0UmFuZ2VOYXRpdmUoc3RyaW5ncywgMCwgc3RyaW5ncy5sZW5ndGgpOwogICAgfQogICAgZmluYWwgcmVzID0gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKHRvdGFsTGVuZ3RoKTsKICAgIGZpbmFsIHN0cmluZ3NMZW5ndGggPSBzdHJpbmdzLmxlbmd0aDsKICAgIGludCBySXggPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdzTGVuZ3RoOyBpKyspIHsKICAgICAgZmluYWwgX09uZUJ5dGVTdHJpbmcgZSA9IHN0cmluZ3NbaV07CiAgICAgIGZpbmFsIGVMZW5ndGggPSBlLmxlbmd0aDsKICAgICAgZm9yIChpbnQgcyA9IDA7IHMgPCBlTGVuZ3RoOyBzKyspIHsKICAgICAgICByZXMuX3NldEF0KHJJeCsrLCBlLmNvZGVVbml0QXQocykpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0KCiAgaW50IGluZGV4T2YoUGF0dGVybiBwYXR0ZXJuLCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIC8vIFNwZWNpYWxpemUgZm9yIHNpbmdsZSBjaGFyYWN0ZXIgcGF0dGVybi4KICAgIGZpbmFsIHBDaWQgPSBDbGFzc0lELmdldElEKHBhdHRlcm4pOwogICAgaWYgKChwQ2lkID09IENsYXNzSUQuY2lkT25lQnl0ZVN0cmluZykgfHwKICAgICAgICAocENpZCA9PSBDbGFzc0lELmNpZFR3b0J5dGVTdHJpbmcpIHx8CiAgICAgICAgKHBDaWQgPT0gQ2xhc3NJRC5jaWRFeHRlcm5hbE9uZUJ5dGVTdHJpbmcpKSB7CiAgICAgIGZpbmFsIFN0cmluZyBwYXR0ZXJuQXNTdHJpbmcgPSBwYXR0ZXJuOwogICAgICBmaW5hbCBsZW4gPSB0aGlzLmxlbmd0aDsKICAgICAgaWYgKChwYXR0ZXJuQXNTdHJpbmcubGVuZ3RoID09IDEpICYmIChzdGFydCA+PSAwKSAmJiAoc3RhcnQgPCBsZW4pKSB7CiAgICAgICAgZmluYWwgcGF0dGVybkN1MCA9IHBhdHRlcm5Bc1N0cmluZy5jb2RlVW5pdEF0KDApOwogICAgICAgIGlmIChwYXR0ZXJuQ3UwID4gMHhGRikgewogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgaWYgKHRoaXMuY29kZVVuaXRBdChpKSA9PSBwYXR0ZXJuQ3UwKSB7CiAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdXBlci5pbmRleE9mKHBhdHRlcm4sIHN0YXJ0KTsKICB9CgogIGJvb2wgY29udGFpbnMoUGF0dGVybiBwYXR0ZXJuLCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGZpbmFsIHBDaWQgPSBDbGFzc0lELmdldElEKHBhdHRlcm4pOwogICAgaWYgKChwQ2lkID09IENsYXNzSUQuY2lkT25lQnl0ZVN0cmluZykgfHwKICAgICAgICAocENpZCA9PSBDbGFzc0lELmNpZFR3b0J5dGVTdHJpbmcpIHx8CiAgICAgICAgKHBDaWQgPT0gQ2xhc3NJRC5jaWRFeHRlcm5hbE9uZUJ5dGVTdHJpbmcpKSB7CiAgICAgIGZpbmFsIFN0cmluZyBwYXR0ZXJuQXNTdHJpbmcgPSBwYXR0ZXJuOwogICAgICBmaW5hbCBsZW4gPSB0aGlzLmxlbmd0aDsKICAgICAgaWYgKChwYXR0ZXJuQXNTdHJpbmcubGVuZ3RoID09IDEpICYmIChzdGFydCA+PSAwKSAmJiAoc3RhcnQgPCBsZW4pKSB7CiAgICAgICAgZmluYWwgcGF0dGVybkN1MCA9IHBhdHRlcm5Bc1N0cmluZy5jb2RlVW5pdEF0KDApOwogICAgICAgIGlmIChwYXR0ZXJuQ3UwID4gMHhGRikgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgaWYgKHRoaXMuY29kZVVuaXRBdChpKSA9PSBwYXR0ZXJuQ3UwKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdXBlci5jb250YWlucyhwYXR0ZXJuLCBzdGFydCk7CiAgfQoKICBTdHJpbmcgb3BlcmF0b3IgKihpbnQgdGltZXMpIHsKICAgIGlmICh0aW1lcyA8PSAwKSByZXR1cm4gIiI7CiAgICBpZiAodGltZXMgPT0gMSkgcmV0dXJuIHRoaXM7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBpZiAodGhpcy5pc0VtcHR5KSByZXR1cm4gdGhpczsgLy8gRG9uJ3QgY2xvbmUgZW1wdHkgc3RyaW5nLgogICAgX09uZUJ5dGVTdHJpbmcgcmVzdWx0ID0gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKGxlbmd0aCAqIHRpbWVzKTsKICAgIGludCBpbmRleCA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHRpbWVzOyBpKyspIHsKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgewogICAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXgrKywgdGhpcy5jb2RlVW5pdEF0KGopKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmluZyBwYWRMZWZ0KGludCB3aWR0aCwgW1N0cmluZyBwYWRkaW5nID0gJyAnXSkgewogICAgaW50IHBhZENpZCA9IENsYXNzSUQuZ2V0SUQocGFkZGluZyk7CiAgICBpZiAoKHBhZENpZCAhPSBDbGFzc0lELmNpZE9uZUJ5dGVTdHJpbmcpICYmCiAgICAgICAgKHBhZENpZCAhPSBDbGFzc0lELmNpZEV4dGVybmFsT25lQnl0ZVN0cmluZykpIHsKICAgICAgcmV0dXJuIHN1cGVyLnBhZExlZnQod2lkdGgsIHBhZGRpbmcpOwogICAgfQogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgaW50IGRlbHRhID0gd2lkdGggLSBsZW5ndGg7CiAgICBpZiAoZGVsdGEgPD0gMCkgcmV0dXJuIHRoaXM7CiAgICBpbnQgcGFkTGVuZ3RoID0gcGFkZGluZy5sZW5ndGg7CiAgICBpbnQgcmVzdWx0TGVuZ3RoID0gcGFkTGVuZ3RoICogZGVsdGEgKyBsZW5ndGg7CiAgICBfT25lQnl0ZVN0cmluZyByZXN1bHQgPSBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUocmVzdWx0TGVuZ3RoKTsKICAgIGludCBpbmRleCA9IDA7CiAgICBpZiAocGFkTGVuZ3RoID09IDEpIHsKICAgICAgaW50IHBhZENoYXIgPSBwYWRkaW5nLmNvZGVVbml0QXQoMCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGE7IGkrKykgewogICAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXgrKywgcGFkQ2hhcik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGE7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFkTGVuZ3RoOyBqKyspIHsKICAgICAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXgrKywgcGFkZGluZy5jb2RlVW5pdEF0KGopKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0Ll9zZXRBdChpbmRleCsrLCB0aGlzLmNvZGVVbml0QXQoaSkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmluZyBwYWRSaWdodChpbnQgd2lkdGgsIFtTdHJpbmcgcGFkZGluZyA9ICcgJ10pIHsKICAgIGludCBwYWRDaWQgPSBDbGFzc0lELmdldElEKHBhZGRpbmcpOwogICAgaWYgKChwYWRDaWQgIT0gQ2xhc3NJRC5jaWRPbmVCeXRlU3RyaW5nKSAmJgogICAgICAgIChwYWRDaWQgIT0gQ2xhc3NJRC5jaWRFeHRlcm5hbE9uZUJ5dGVTdHJpbmcpKSB7CiAgICAgIHJldHVybiBzdXBlci5wYWRSaWdodCh3aWR0aCwgcGFkZGluZyk7CiAgICB9CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBpbnQgZGVsdGEgPSB3aWR0aCAtIGxlbmd0aDsKICAgIGlmIChkZWx0YSA8PSAwKSByZXR1cm4gdGhpczsKICAgIGludCBwYWRMZW5ndGggPSBwYWRkaW5nLmxlbmd0aDsKICAgIGludCByZXN1bHRMZW5ndGggPSBsZW5ndGggKyBwYWRMZW5ndGggKiBkZWx0YTsKICAgIF9PbmVCeXRlU3RyaW5nIHJlc3VsdCA9IF9PbmVCeXRlU3RyaW5nLl9hbGxvY2F0ZShyZXN1bHRMZW5ndGgpOwogICAgaW50IGluZGV4ID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0Ll9zZXRBdChpbmRleCsrLCB0aGlzLmNvZGVVbml0QXQoaSkpOwogICAgfQogICAgaWYgKHBhZExlbmd0aCA9PSAxKSB7CiAgICAgIGludCBwYWRDaGFyID0gcGFkZGluZy5jb2RlVW5pdEF0KDApOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhOyBpKyspIHsKICAgICAgICByZXN1bHQuX3NldEF0KGluZGV4KyssIHBhZENoYXIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhZExlbmd0aDsgaisrKSB7CiAgICAgICAgICByZXN1bHQuX3NldEF0KGluZGV4KyssIHBhZGRpbmcuY29kZVVuaXRBdChqKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gTG93ZXItY2FzZSBjb252ZXJzaW9uIHRhYmxlIGZvciBMYXRpbi0xIGFzIHN0cmluZy4KICAvLyBVcHBlci1jYXNlIHJhbmdlczogMHg0MS0weDVhICgnQScgLSAnWicpLCAweGMwLTB4ZDYsIDB4ZDgtMHhkZS4KICAvLyBDb252ZXJzaW9uIHRvIGxvd2VyIGNhc2UgcGVyZm9ybWVkIGJ5IGFkZGluZyAweDIwLgogIHN0YXRpYyBjb25zdCBfTENfVEFCTEUgPQogICAgICAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKICAgICAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiCiAgICAgICJceDIwXHgyMVx4MjJceDIzXHgyNFx4MjVceDI2XHgyN1x4MjhceDI5XHgyYVx4MmJceDJjXHgyZFx4MmVceDJmIgogICAgICAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzdceDM4XHgzOVx4M2FceDNiXHgzY1x4M2RceDNlXHgzZiIKICAgICAgIlx4NDBceDYxXHg2Mlx4NjNceDY0XHg2NVx4NjZceDY3XHg2OFx4NjlceDZhXHg2Ylx4NmNceDZkXHg2ZVx4NmYiCiAgICAgICJceDcwXHg3MVx4NzJceDczXHg3NFx4NzVceDc2XHg3N1x4NzhceDc5XHg3YVx4NWJceDVjXHg1ZFx4NWVceDVmIgogICAgICAiXHg2MFx4NjFceDYyXHg2M1x4NjRceDY1XHg2Nlx4NjdceDY4XHg2OVx4NmFceDZiXHg2Y1x4NmRceDZlXHg2ZiIKICAgICAgIlx4NzBceDcxXHg3Mlx4NzNceDc0XHg3NVx4NzZceDc3XHg3OFx4NzlceDdhXHg3Ylx4N2NceDdkXHg3ZVx4N2YiCiAgICAgICJceDgwXHg4MVx4ODJceDgzXHg4NFx4ODVceDg2XHg4N1x4ODhceDg5XHg4YVx4OGJceDhjXHg4ZFx4OGVceDhmIgogICAgICAiXHg5MFx4OTFceDkyXHg5M1x4OTRceDk1XHg5Nlx4OTdceDk4XHg5OVx4OWFceDliXHg5Y1x4OWRceDllXHg5ZiIKICAgICAgIlx4YTBceGExXHhhMlx4YTNceGE0XHhhNVx4YTZceGE3XHhhOFx4YTlceGFhXHhhYlx4YWNceGFkXHhhZVx4YWYiCiAgICAgICJceGIwXHhiMVx4YjJceGIzXHhiNFx4YjVceGI2XHhiN1x4YjhceGI5XHhiYVx4YmJceGJjXHhiZFx4YmVceGJmIgogICAgICAiXHhlMFx4ZTFceGUyXHhlM1x4ZTRceGU1XHhlNlx4ZTdceGU4XHhlOVx4ZWFceGViXHhlY1x4ZWRceGVlXHhlZiIKICAgICAgIlx4ZjBceGYxXHhmMlx4ZjNceGY0XHhmNVx4ZjZceGQ3XHhmOFx4ZjlceGZhXHhmYlx4ZmNceGZkXHhmZVx4ZGYiCiAgICAgICJceGUwXHhlMVx4ZTJceGUzXHhlNFx4ZTVceGU2XHhlN1x4ZThceGU5XHhlYVx4ZWJceGVjXHhlZFx4ZWVceGVmIgogICAgICAiXHhmMFx4ZjFceGYyXHhmM1x4ZjRceGY1XHhmNlx4ZjdceGY4XHhmOVx4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZiI7CgogIC8vIFVwcGVyLWNhc2UgY29udmVyc2lvbiB0YWJsZSBmb3IgTGF0aW4tMSBhcyBzdHJpbmcuCiAgLy8gTG93ZXItY2FzZSByYW5nZXM6IDB4NjEtMHg3YSAoJ2EnIC0gJ3onKSwgMHhlMC0weGZmLgogIC8vIFRoZSBjaGFyYWN0ZXJzIDB4YjUgKMK1KSBhbmQgMHhmZiAow78pIGhhdmUgdXBwZXIgY2FzZSB2YXJpYW50cwogIC8vIHRoYXQgYXJlIG5vdCBMYXRpbi0xLiBUaGVzZSBhcmUgYm90aCBtYXJrZWQgYXMgMHgwMCBpbiB0aGUgdGFibGUuCiAgLy8gVGhlIEdlcm1hbiAic2hhcnAgcyIgXHhkZiAow58pIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byB0d28gY2hhcmFjdGVycyAoU1MpLAogIC8vIGFuZCBpcyBhbHNvIG1hcmtlZCB3aXRoIDB4MDAuCiAgLy8gQ29udmVyc2lvbiB0byBsb3dlciBjYXNlIHBlcmZvcm1lZCBieSBzdWJ0cmFjdGluZyAweDIwLgogIHN0YXRpYyBjb25zdCBfVUNfVEFCTEUgPQogICAgICAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKICAgICAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiCiAgICAgICJceDIwXHgyMVx4MjJceDIzXHgyNFx4MjVceDI2XHgyN1x4MjhceDI5XHgyYVx4MmJceDJjXHgyZFx4MmVceDJmIgogICAgICAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzdceDM4XHgzOVx4M2FceDNiXHgzY1x4M2RceDNlXHgzZiIKICAgICAgIlx4NDBceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDZceDQ3XHg0OFx4NDlceDRhXHg0Ylx4NGNceDRkXHg0ZVx4NGYiCiAgICAgICJceDUwXHg1MVx4NTJceDUzXHg1NFx4NTVceDU2XHg1N1x4NThceDU5XHg1YVx4NWJceDVjXHg1ZFx4NWVceDVmIgogICAgICAiXHg2MFx4NDFceDQyXHg0M1x4NDRceDQ1XHg0Nlx4NDdceDQ4XHg0OVx4NGFceDRiXHg0Y1x4NGRceDRlXHg0ZiIKICAgICAgIlx4NTBceDUxXHg1Mlx4NTNceDU0XHg1NVx4NTZceDU3XHg1OFx4NTlceDVhXHg3Ylx4N2NceDdkXHg3ZVx4N2YiCiAgICAgICJceDgwXHg4MVx4ODJceDgzXHg4NFx4ODVceDg2XHg4N1x4ODhceDg5XHg4YVx4OGJceDhjXHg4ZFx4OGVceDhmIgogICAgICAiXHg5MFx4OTFceDkyXHg5M1x4OTRceDk1XHg5Nlx4OTdceDk4XHg5OVx4OWFceDliXHg5Y1x4OWRceDllXHg5ZiIKICAgICAgIlx4YTBceGExXHhhMlx4YTNceGE0XHhhNVx4YTZceGE3XHhhOFx4YTlceGFhXHhhYlx4YWNceGFkXHhhZVx4YWYiCiAgICAgICJceGIwXHhiMVx4YjJceGIzXHhiNFx4MDBceGI2XHhiN1x4YjhceGI5XHhiYVx4YmJceGJjXHhiZFx4YmVceGJmIgogICAgICAiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzdceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZiIKICAgICAgIlx4ZDBceGQxXHhkMlx4ZDNceGQ0XHhkNVx4ZDZceGQ3XHhkOFx4ZDlceGRhXHhkYlx4ZGNceGRkXHhkZVx4MDAiCiAgICAgICJceGMwXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjN1x4YzhceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmIgogICAgICAiXHhkMFx4ZDFceGQyXHhkM1x4ZDRceGQ1XHhkNlx4ZjdceGQ4XHhkOVx4ZGFceGRiXHhkY1x4ZGRceGRlXHgwMCI7CgogIFN0cmluZyB0b0xvd2VyQ2FzZSgpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewogICAgICBmaW5hbCBjID0gdGhpcy5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoYyA9PSBfTENfVEFCTEUuY29kZVVuaXRBdChjKSkgY29udGludWU7CiAgICAgIC8vIFVwcGVyLWNhc2UgY2hhcmFjdGVyIGZvdW5kLgogICAgICBmaW5hbCByZXN1bHQgPSBfYWxsb2NhdGUodGhpcy5sZW5ndGgpOwogICAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgewogICAgICAgIHJlc3VsdC5fc2V0QXQoaiwgdGhpcy5jb2RlVW5pdEF0KGopKTsKICAgICAgfQogICAgICBmb3IgKGludCBqID0gaTsgaiA8IHRoaXMubGVuZ3RoOyBqKyspIHsKICAgICAgICByZXN1bHQuX3NldEF0KGosIF9MQ19UQUJMRS5jb2RlVW5pdEF0KHRoaXMuY29kZVVuaXRBdChqKSkpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CgogIFN0cmluZyB0b1VwcGVyQ2FzZSgpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewogICAgICBmaW5hbCBjID0gdGhpcy5jb2RlVW5pdEF0KGkpOwogICAgICAvLyBDb250aW51ZSBsb29wIGlmIGNoYXJhY3RlciBpcyB1bmNoYW5nZWQgYnkgdXBwZXItY2FzZSBjb252ZXJzaW9uLgogICAgICBpZiAoYyA9PSBfVUNfVEFCTEUuY29kZVVuaXRBdChjKSkgY29udGludWU7CgogICAgICAvLyBDaGVjayByZXN0IG9mIHN0cmluZyBmb3IgY2hhcmFjdGVycyB0aGF0IGRvIG5vdCBjb252ZXJ0IHRvCiAgICAgIC8vIHNpbmdsZS1jaGFyYWN0ZXJzIGluIHRoZSBMYXRpbi0xIHJhbmdlLgogICAgICBmb3IgKGludCBqID0gaTsgaiA8IHRoaXMubGVuZ3RoOyBqKyspIHsKICAgICAgICBmaW5hbCBjID0gdGhpcy5jb2RlVW5pdEF0KGopOwogICAgICAgIGlmICgoX1VDX1RBQkxFLmNvZGVVbml0QXQoYykgPT0gMHgwMCkgJiYgKGMgIT0gMHgwMCkpIHsKICAgICAgICAgIC8vIFdlIHVzZSB0aGUgMHgwMCB2YWx1ZSBmb3IgY2hhcmFjdGVycyBvdGhlciB0aGFuIHRoZSBudWxsIGNoYXJhY3RlciwKICAgICAgICAgIC8vIHRoYXQgZG9uJ3QgY29udmVydCB0byBhIHNpbmdsZSBMYXRpbi0xIGNoYXJhY3RlciB3aGVuIHVwcGVyLWNhc2VkLgogICAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCBjYWxsIHRoZSBnZW5lcmljIHN1cGVyLWNsYXNzIG1ldGhvZC4KICAgICAgICAgIHJldHVybiBzdXBlci50b1VwcGVyQ2FzZSgpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBTb21lIGxvd2VyLWNhc2UgY2hhcmFjdGVycyBmb3VuZCwgYnV0IGFsbCB1cHBlci1jYXNlIHRvIHNpbmdsZSBMYXRpbi0xCiAgICAgIC8vIGNoYXJhY3RlcnMuCiAgICAgIGZpbmFsIHJlc3VsdCA9IF9hbGxvY2F0ZSh0aGlzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7CiAgICAgICAgcmVzdWx0Ll9zZXRBdChqLCB0aGlzLmNvZGVVbml0QXQoaikpOwogICAgICB9CiAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgdGhpcy5sZW5ndGg7IGorKykgewogICAgICAgIHJlc3VsdC5fc2V0QXQoaiwgX1VDX1RBQkxFLmNvZGVVbml0QXQodGhpcy5jb2RlVW5pdEF0KGopKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KCiAgLy8gQWxsb2NhdGVzIGEgc3RyaW5nIG9mIGdpdmVuIGxlbmd0aCwgZXhwZWN0aW5nIGl0cyBjb250ZW50IHRvIGJlCiAgLy8gc2V0IHVzaW5nIF9zZXRBdC4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9PbmVCeXRlU3RyaW5nKQogIHN0YXRpYyBfT25lQnl0ZVN0cmluZyBfYWxsb2NhdGUoaW50IGxlbmd0aCkgbmF0aXZlICJPbmVCeXRlU3RyaW5nX2FsbG9jYXRlIjsKCiAgc3RhdGljIF9PbmVCeXRlU3RyaW5nIF9hbGxvY2F0ZUZyb21PbmVCeXRlTGlzdChMaXN0PGludD4gbGlzdCwgaW50IHN0YXJ0LAogICAgICBpbnQgZW5kKSBuYXRpdmUgIk9uZUJ5dGVTdHJpbmdfYWxsb2NhdGVGcm9tT25lQnl0ZUxpc3QiOwoKICAvLyBUaGlzIGlzIGludGVybmFsIGhlbHBlciBtZXRob2QuIENvZGUgcG9pbnQgdmFsdWUgbXVzdCBiZSBhIHZhbGlkCiAgLy8gTGF0aW4xIHZhbHVlICgwLi4weEZGKSwgaW5kZXggbXVzdCBiZSB2YWxpZC4KICB2b2lkIF9zZXRBdChpbnQgaW5kZXgsIGludCBjb2RlUG9pbnQpIG5hdGl2ZSAiT25lQnl0ZVN0cmluZ19zZXRBdCI7CgogIC8vIFNob3VsZCBiZSBvcHRpbWl6YWJsZSB0byBhIG1lbW9yeSBtb3ZlLgogIC8vIEFjY2VwdHMgYm90aCBfT25lQnl0ZVN0cmluZyBhbmQgX0V4dGVybmFsT25lQnl0ZVN0cmluZyBhcyBhcmd1bWVudC4KICAvLyBSZXR1cm5zIGluZGV4IGFmdGVyIGxhc3QgY2hhcmFjdGVyIHdyaXR0ZW4uCiAgaW50IF9zZXRSYW5nZShpbnQgaW5kZXgsIFN0cmluZyBvbmVCeXRlU3RyaW5nLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGFzc2VydChvbmVCeXRlU3RyaW5nLl9pc09uZUJ5dGUpOwogICAgYXNzZXJ0KDAgPD0gc3RhcnQpOwogICAgYXNzZXJ0KHN0YXJ0IDw9IGVuZCk7CiAgICBhc3NlcnQoZW5kIDw9IG9uZUJ5dGVTdHJpbmcubGVuZ3RoKTsKICAgIGFzc2VydCgwIDw9IGluZGV4KTsKICAgIGFzc2VydChpbmRleCArIChlbmQgLSBzdGFydCkgPD0gbGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIF9zZXRBdChpbmRleCwgb25lQnl0ZVN0cmluZy5jb2RlVW5pdEF0KGkpKTsKICAgICAgaW5kZXggKz0gMTsKICAgIH0KICAgIHJldHVybiBpbmRleDsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1R3b0J5dGVTdHJpbmcgZXh0ZW5kcyBfU3RyaW5nQmFzZSB7CiAgZmFjdG9yeSBfVHdvQnl0ZVN0cmluZy5fdW5pbnN0YW50aWFibGUoKSB7IHRocm93ICJVbnJlYWNoYWJsZSI7IH0KCiAgc3RhdGljIFN0cmluZyBfYWxsb2NhdGVGcm9tVHdvQnl0ZUxpc3QoTGlzdDxpbnQ+IGxpc3QsIGludCBzdGFydCwgaW50IGVuZCkKICAgICAgbmF0aXZlICJUd29CeXRlU3RyaW5nX2FsbG9jYXRlRnJvbVR3b0J5dGVMaXN0IjsKCiAgYm9vbCBfaXNXaGl0ZXNwYWNlKGludCBjb2RlVW5pdCkgewogICAgcmV0dXJuIF9TdHJpbmdCYXNlLl9pc1R3b0J5dGVXaGl0ZXNwYWNlKGNvZGVVbml0KTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgY29kZVVuaXRBdChpbnQgaW5kZXgpIG5hdGl2ZSAiU3RyaW5nX2NvZGVVbml0QXQiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIHJldHVybiBzdXBlciA9PSBvdGhlcjsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsT25lQnl0ZVN0cmluZyBleHRlbmRzIF9TdHJpbmdCYXNlIHsKICBmYWN0b3J5IF9FeHRlcm5hbE9uZUJ5dGVTdHJpbmcuX3VuaW5zdGFudGlhYmxlKCkgeyB0aHJvdyAiVW5yZWFjaGFibGUiOyB9CgogIGJvb2wgX2lzV2hpdGVzcGFjZShpbnQgY29kZVVuaXQpIHsKICAgIHJldHVybiBfU3RyaW5nQmFzZS5faXNPbmVCeXRlV2hpdGVzcGFjZShjb2RlVW5pdCk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGNvZGVVbml0QXQoaW50IGluZGV4KSBuYXRpdmUgIlN0cmluZ19jb2RlVW5pdEF0IjsKCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIHJldHVybiBzdXBlciA9PSBvdGhlcjsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsVHdvQnl0ZVN0cmluZyBleHRlbmRzIF9TdHJpbmdCYXNlIHsKICBmYWN0b3J5IF9FeHRlcm5hbFR3b0J5dGVTdHJpbmcuX3VuaW5zdGFudGlhYmxlKCkgeyB0aHJvdyAiVW5yZWFjaGFibGUiOyB9CgogIGJvb2wgX2lzV2hpdGVzcGFjZShpbnQgY29kZVVuaXQpIHsKICAgIHJldHVybiBfU3RyaW5nQmFzZS5faXNUd29CeXRlV2hpdGVzcGFjZShjb2RlVW5pdCk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGNvZGVVbml0QXQoaW50IGluZGV4KSBuYXRpdmUgIlN0cmluZ19jb2RlVW5pdEF0IjsKCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIHJldHVybiBzdXBlciA9PSBvdGhlcjsKICB9Cn0KCmNsYXNzIF9TdHJpbmdNYXRjaCBpbXBsZW1lbnRzIE1hdGNoIHsKICBjb25zdCBfU3RyaW5nTWF0Y2godGhpcy5zdGFydCwgdGhpcy5pbnB1dCwgdGhpcy5wYXR0ZXJuKTsKCiAgaW50IGdldCBlbmQgPT4gc3RhcnQgKyBwYXR0ZXJuLmxlbmd0aDsKICBTdHJpbmcgb3BlcmF0b3IgW10oaW50IGcpID0+IGdyb3VwKGcpOwogIGludCBnZXQgZ3JvdXBDb3VudCA9PiAwOwoKICBTdHJpbmcgZ3JvdXAoaW50IGdyb3VwKSB7CiAgICBpZiAoZ3JvdXAgIT0gMCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci52YWx1ZShncm91cCk7CiAgICB9CiAgICByZXR1cm4gcGF0dGVybjsKICB9CgogIExpc3Q8U3RyaW5nPiBncm91cHMoTGlzdDxpbnQ+IGdyb3VwcykgewogICAgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBMaXN0PFN0cmluZz4oKTsKICAgIGZvciAoaW50IGcgaW4gZ3JvdXBzKSB7CiAgICAgIHJlc3VsdC5hZGQoZ3JvdXAoZykpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGZpbmFsIGludCBzdGFydDsKICBmaW5hbCBTdHJpbmcgaW5wdXQ7CiAgZmluYWwgU3RyaW5nIHBhdHRlcm47Cn0KCmNsYXNzIF9TdHJpbmdBbGxNYXRjaGVzSXRlcmFibGUgZXh0ZW5kcyBJdGVyYWJsZTxNYXRjaD4gewogIGZpbmFsIFN0cmluZyBfaW5wdXQ7CiAgZmluYWwgU3RyaW5nIF9wYXR0ZXJuOwogIGZpbmFsIGludCBfaW5kZXg7CgogIF9TdHJpbmdBbGxNYXRjaGVzSXRlcmFibGUodGhpcy5faW5wdXQsIHRoaXMuX3BhdHRlcm4sIHRoaXMuX2luZGV4KTsKCiAgSXRlcmF0b3I8TWF0Y2g+IGdldCBpdGVyYXRvciA9PgogICAgICBuZXcgX1N0cmluZ0FsbE1hdGNoZXNJdGVyYXRvcihfaW5wdXQsIF9wYXR0ZXJuLCBfaW5kZXgpOwoKICBNYXRjaCBnZXQgZmlyc3QgewogICAgaW50IGluZGV4ID0gX2lucHV0LmluZGV4T2YoX3BhdHRlcm4sIF9pbmRleCk7CiAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICByZXR1cm4gbmV3IF9TdHJpbmdNYXRjaChpbmRleCwgX2lucHV0LCBfcGF0dGVybik7CiAgICB9CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9Cn0KCmNsYXNzIF9TdHJpbmdBbGxNYXRjaGVzSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxNYXRjaD4gewogIGZpbmFsIFN0cmluZyBfaW5wdXQ7CiAgZmluYWwgU3RyaW5nIF9wYXR0ZXJuOwogIGludCBfaW5kZXg7CiAgTWF0Y2ggX2N1cnJlbnQ7CgogIF9TdHJpbmdBbGxNYXRjaGVzSXRlcmF0b3IodGhpcy5faW5wdXQsIHRoaXMuX3BhdHRlcm4sIHRoaXMuX2luZGV4KTsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfaW5kZXggKyBfcGF0dGVybi5sZW5ndGggPiBfaW5wdXQubGVuZ3RoKSB7CiAg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Ij8BFDIWOAYsBAIBPRcZDhIBRgEUNBcUBjIVIhcUBic6OB4SEQQBIQIBIWRhcnQ6Y29yZS1wYXRjaC9zdHJpbmdfcGF0Y2guZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3R5cGVfcGF0Y2guZGFydIQnLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgovLyBUaGVzZSBEYXJ0IGNsYXNzZXMgY29ycmVzcG9uZCB0byB0aGUgVk0gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy4KCi8vIEVxdWl2YWxlbnQgb2YgUmF3QWJzdHJhY3RUeXBlLgphYnN0cmFjdCBjbGFzcyBfQWJzdHJhY3RUeXBlIGltcGxlbWVudHMgVHlwZSB7CiAgU3RyaW5nIHRvU3RyaW5nKCkgbmF0aXZlICJBYnN0cmFjdFR5cGVfdG9TdHJpbmciOwp9CgovLyBFcXVpdmFsZW50IG9mIFJhd1R5cGUuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1R5cGUgZXh0ZW5kcyBfQWJzdHJhY3RUeXBlIHsKICBmYWN0b3J5IF9UeXBlLl91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93ICJVbnJlYWNoYWJsZSI7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBoYXNoQ29kZSBuYXRpdmUgIlR5cGVfZ2V0SGFzaENvZGUiOwp9CgovLyBFcXVpdmFsZW50IG9mIFJhd1R5cGVSZWYuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1R5cGVSZWYgZXh0ZW5kcyBfQWJzdHJhY3RUeXBlIHsKICBmYWN0b3J5IF9UeXBlUmVmLl91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93ICJVbnJlYWNoYWJsZSI7CiAgfQp9CgovLyBFcXVpdmFsZW50IG9mIFJhd1R5cGVQYXJhbWV0ZXIuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1R5cGVQYXJhbWV0ZXIgZXh0ZW5kcyBfQWJzdHJhY3RUeXBlIHsKICBmYWN0b3J5IF9UeXBlUGFyYW1ldGVyLl91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93ICJVbnJlYWNoYWJsZSI7CiAgfQp9CikATk48AR4BTAEiLzQCARoaJCQZBAE0LgIBHRonJxkEAgEjGi0tGQQCAR9kYXJ0OmNvcmUtcGF0Y2gvdHlwZV9wYXRjaC5kYXJ0Mm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvd2Vha19wcm9wZXJ0eS5kYXJ0gpAvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1dlYWtQcm9wZXJ0eSB7CiAgZmFjdG9yeSBfV2Vha1Byb3BlcnR5KGtleSwgdmFsdWUpID0+IF9uZXcoa2V5LCB2YWx1ZSk7CgogIGdldCBrZXkgPT4gX2dldEtleSgpOwogIGdldCB2YWx1ZSA9PiBfZ2V0VmFsdWUoKTsKICBzZXQgdmFsdWUodmFsdWUpID0+IF9zZXRWYWx1ZSh2YWx1ZSk7CgogIHN0YXRpYyBfV2Vha1Byb3BlcnR5IF9uZXcoa2V5LCB2YWx1ZSkgbmF0aXZlICJXZWFrUHJvcGVydHlfbmV3IjsKCiAgX2dldEtleSgpIG5hdGl2ZSAiV2Vha1Byb3BlcnR5X2dldEtleSI7CiAgX2dldFZhbHVlKCkgbmF0aXZlICJXZWFrUHJvcGVydHlfZ2V0VmFsdWUiOwogIF9zZXRWYWx1ZSh2YWx1ZSkgbmF0aXZlICJXZWFrUHJvcGVydHlfc2V0VmFsdWUiOwp9ChYATk48AR4BGhY5ARgcKAFDASouMwIBImRhcnQ6Y29yZS1wYXRjaC93ZWFrX3Byb3BlcnR5LmRhcnQxb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvYW5ub3RhdGlvbnMuZGFydKNzLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIFRoZSBhbm5vdGF0aW9uIGBARGVwcmVjYXRlZCgnbWlncmF0aW9uJylgIG1hcmtzIGEgZmVhdHVyZSBhcyBkZXByZWNhdGVkLgogKgogKiBUaGUgYW5ub3RhdGlvbiBbZGVwcmVjYXRlZF0gaXMgYSBzaG9ydGhhbmQgZm9yIGRlcHJlY2F0aW5nIHVudGlsCiAqIGFuIHVuc3BlY2lmaWVkICJuZXh0IHJlbGVhc2UiIHdpdGhvdXQgbWlncmF0aW9uIGluc3RydWN0aW9ucy4KICoKICogVGhlIGludGVudCBvZiB0aGUgYEBEZXByZWNhdGVkYCBhbm5vdGF0aW9uIGlzIHRvIGluZm9ybSB1c2VycyBvZiBhIGZlYXR1cmUKICogdGhhdCB0aGV5IHNob3VsZCBjaGFuZ2UgdGhlaXIgY29kZSwgZXZlbiBpZiBpdCBpcyBjdXJyZW50bHkgc3RpbGwgd29ya2luZwogKiBjb3JyZWN0bHkuCiAqCiAqIEEgZGVwcmVjYXRlZCBmZWF0dXJlIGlzIHNjaGVkdWxlZCB0byBiZSByZW1vdmVkIGF0IGEgbGF0ZXIgdGltZSwgcG9zc2libHkKICogc3BlY2lmaWVkIGluIFttZXNzYWdlXS4gQSBkZXByZWNhdGVkIGZlYXR1cmUgc2hvdWxkIG5vdCBiZSB1c2VkLCBjb2RlIHVzaW5nCiAqIGl0IHdpbGwgYnJlYWsgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLiBJZiBleGlzdGluZyBjb2RlIGlzIHVzaW5nIHRoZQogKiBmZWF0dXJlIGl0IHNob3VsZCBiZSByZXdyaXR0ZW4gdG8gbm90IHVzZSB0aGUgZGVwcmVjYXRlZCBmZWF0dXJlLgogKgogKiBBIGRlcHJlY2F0ZWQgZmVhdHVyZSBzaG91bGQgZG9jdW1lbnQgaG93IHRoZSBzYW1lIGVmZmVjdCBjYW4gYmUgYWNoaWV2ZWQgaW4KICogW21lc3NhZ2VdLCBzbyB0aGUgcHJvZ3JhbW1lciBrbm93cyBob3cgdG8gcmV3cml0ZSB0aGUgY29kZS4KICoKICogVGhlIGBARGVwcmVjYXRlZGAgYW5ub3RhdGlvbiBhcHBsaWVzIHRvIGxpYnJhcmllcywgdG9wLWxldmVsIGRlY2xhcmF0aW9ucwogKiAodmFyaWFibGVzLCBnZXR0ZXJzLCBzZXR0ZXJzLCBmdW5jdGlvbnMsIGNsYXNzZXMgYW5kIHR5cGVkZWZzKSwKICogY2xhc3MtbGV2ZWwgZGVjbGFyYXRpb25zICh2YXJpYWJsZXMsIGdldHRlcnMsIHNldHRlcnMsIG1ldGhvZHMsIG9wZXJhdG9ycyBvcgogKiBjb25zdHJ1Y3RvcnMsIHdoZXRoZXIgc3RhdGljIG9yIG5vdCksIG5hbWVkIG9wdGlvbmFsIGFyZ3VtZW50cyBhbmQKICogdHJhaWxpbmcgb3B0aW9uYWwgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgogKgogKiBEZXByZWNhdGlvbiBpcyB0cmFuc2l0aXZlOgogKgogKiAgLSBJZiBhIGxpYnJhcnkgaXMgZGVwcmVjYXRlZCwgc28gaXMgZXZlcnkgbWVtYmVyIG9mIGl0LgogKiAgLSBJZiBhIGNsYXNzIGlzIGRlcHJlY2F0ZWQsIHNvIGlzIGV2ZXJ5IG1lbWJlciBvZiBpdC4KICogIC0gSWYgYSB2YXJpYWJsZSBpcyBkZXByZWNhdGVkLCBzbyBhcmUgaXRzIGltcGxpY2l0IGdldHRlciBhbmQgc2V0dGVyLgogKgogKgogKiBBIHRvb2wgdGhhdCBwcm9jZXNzZXMgRGFydCBzb3VyY2UgY29kZSBtYXkgcmVwb3J0IHdoZW46CiAqCiAqIC0gdGhlIGNvZGUgaW1wb3J0cyBhIGRlcHJlY2F0ZWQgbGlicmFyeS4KICogLSB0aGUgY29kZSBleHBvcnRzIGEgZGVwcmVjYXRlZCBsaWJyYXJ5LCBvciBhbnkgZGVwcmVjYXRlZCBtZW1iZXIgb2YKICogIMKgYSBub24tZGVwcmVjYXRlZCBsaWJyYXJ5LgogKiAtIHRoZSBjb2RlIHJlZmVycyBzdGF0aWNhbGx5IHRvIGEgZGVwcmVjYXRlZCBkZWNsYXJhdGlvbi4KICogLSB0aGUgY29kZSBkeW5hbWljYWxseSB1c2VzIGEgbWVtYmVyIG9mIGFuIG9iamVjdCB3aXRoIGEgc3RhdGljYWxseSBrbm93bgogKiAgIHR5cGUsIHdoZXJlIHRoZSBtZW1iZXIgaXMgZGVwcmVjYXRlZCBvbiB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIG9iamVjdC4KICogLSB0aGUgY29kZSBkeW5hbWljYWxseSBjYWxscyBhIG1ldGhvZCB3aXRoIGFuIGFyZ3VtZW50IHdoZXJlIHRoZQogKiAgIGNvcnJlc3BvbmRpbmcgb3B0aW9uYWwgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgb24gdGhlIG9iamVjdCdzIHN0YXRpYyB0eXBlLgogKgogKgogKiBJZiB0aGUgZGVwcmVjYXRlZCB1c2UgaXMgaW5zaWRlIGEgbGlicmFyeSwgY2xhc3Mgb3IgbWV0aG9kIHdoaWNoIGlzIGl0c2VsZgogKiBkZXByZWNhdGVkLCB0aGUgdG9vbCBzaG91bGQgbm90IGJvdGhlciB0aGUgdXNlciBhYm91dCBpdC4KICogQSBkZXByZWNhdGVkIGZlYXR1cmUgaXMgZXhwZWN0ZWQgdG8gdXNlIG90aGVyIGRlcHJlY2F0ZWQgZmVhdHVyZXMuCiAqLwpjbGFzcyBEZXByZWNhdGVkIHsKICAvKioKICAgKiBNZXNzYWdlIHByb3ZpZGVkIHRvIHRoZSB1c2VyIHdoZW4gdGhleSB1c2UgdGhlIGRlcHJlY2F0ZWQgZmVhdHVyZS4KICAgKgogICAqIFRoZSBtZXNzYWdlIHNob3VsZCBleHBsYWluIGhvdyB0byBtaWdyYXRlIGF3YXkgZnJvbSB0aGUgZmVhdHVyZSBpZiBhbgogICAqIGFsdGVybmF0aXZlIGlzIGF2YWlsYWJsZSwgYW5kIHdoZW4gdGhlIGRlcHJlY2F0ZWQgZmVhdHVyZSBpcyBleHBlY3RlZCB0byBiZQogICAqIHJlbW92ZWQuCiAgICovCiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CgogIC8qKgogICAqIENyZWF0ZSBhIGRlcHJlY2F0aW9uIGFubm90YXRpb24gd2hpY2ggc3BlY2lmaWVzIHRoZSBtaWdyYXRpb24gcGF0aCBhbmQKICAgKiBleHBpcmF0aW9uIG9mIHRoZSBhbm5vdGF0ZWQgZmVhdHVyZS4KICAgKgogICAqIFRoZSBbbWVzc2FnZV0gYXJndW1lbnQgc2hvdWxkIGJlIHJlYWRhYmxlIGJ5IHByb2dyYW1tZXJzLCBhbmQgc2hvdWxkIHN0YXRlCiAgICogYW4gYWx0ZXJuYXRpdmUgZmVhdHVyZSAoaWYgYXZhaWxhYmxlKSBhcyB3ZWxsIGFzIHdoZW4gYW4gYW5ub3RhdGVkIGZlYXR1cmUKICAgKiBpcyBleHBlY3RlZCB0byBiZSByZW1vdmVkLgogICAqLwogIGNvbnN0IERlcHJlY2F0ZWQodGhpcy5tZXNzYWdlKTsKCiAgQERlcHJlY2F0ZWQoJ1VzZSBgbWVzc2FnZWAgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIERhcnQgMy4wLjAnKQogIFN0cmluZyBnZXQgZXhwaXJlcyA9PiBtZXNzYWdlOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiRGVwcmVjYXRlZCBmZWF0dXJlOiAkbWVzc2FnZSI7Cn0KCi8qKgogKiBNYXJrcyBhIGZlYXR1cmUgYXMgW0RlcHJlY2F0ZWRdIHVudGlsIHRoZSBuZXh0IHJlbGVhc2UuCiAqLwpjb25zdCBEZXByZWNhdGVkIGRlcHJlY2F0ZWQgPSBEZXByZWNhdGVkKCJuZXh0IHJlbGVhc2UiKTsKCmNsYXNzIF9PdmVycmlkZSB7CiAgY29uc3QgX092ZXJyaWRlKCk7Cn0KCi8qKgogKiBUaGUgYW5ub3RhdGlvbiBgQG92ZXJyaWRlYCBtYXJrcyBhbiBpbnN0YW5jZSBtZW1iZXIgYXMgb3ZlcnJpZGluZyBhCiAqIHN1cGVyY2xhc3MgbWVtYmVyIHdpdGggdGhlIHNhbWUgbmFtZS4KICoKICogVGhlIGFubm90YXRpb24gYXBwbGllcyB0byBpbnN0YW5jZSBtZXRob2RzLCBnZXR0ZXJzIGFuZCBzZXR0ZXJzLCBhbmQgdG8KICogaW5zdGFuY2UgZmllbGRzLCB3aGVyZSBpdCBtZWFucyB0aGF0IHRoZSBpbXBsaWNpdCBnZXR0ZXIgYW5kIHNldHRlciBvZiB0aGUKICogZmllbGQgaXMgbWFya2VkIGFzIG92ZXJyaWRpbmcsIGJ1dCB0aGUgZmllbGQgaXRzZWxmIGlzIG5vdC4KICoKICogVGhlIGludGVudCBvZiB0aGUgYEBvdmVycmlkZWAgbm90YXRpb24gaXMgdG8gY2F0Y2ggc2l0dWF0aW9ucyB3aGVyZSBhCiAqIHN1cGVyY2xhc3MgcmVuYW1lcyBhIG1lbWJlciwgYW5kIGFuIGluZGVwZW5kZW50IHN1YmNsYXNzIHdoaWNoIHVzZWQgdG8KICogb3ZlcnJpZGUgdGhlIG1lbWJlciwgY291bGQgc2lsZW50bHkgY29udGludWUgd29ya2luZyB1c2luZyB0aGUKICogc3VwZXJjbGFzcyBpbXBsZW1lbnRhdGlvbi4KICoKICogVGhlIGVkaXRvciwgb3IgYSBzaW1pbGFyIHRvb2wgYWltZWQgYXQgdGhlIHByb2dyYW1tZXIsIG1heSByZXBvcnQgaWYgbm8KICogZGVjbGFyYXRpb24gb2YgYW4gYW5ub3RhdGVkIG1lbWJlciBpcyBpbmhlcml0ZWQgYnkgdGhlIGNsYXNzIGZyb20gZWl0aGVyIGEKICogc3VwZXJjbGFzcyBvciBhbiBpbnRlcmZhY2UuCiAqCiAqIFVzZSB0aGUgYEBvdmVycmlkZWAgYW5ub3RhdGlvbiBqdWRpY2lvdXNseSBhbmQgb25seSBmb3IgbWV0aG9kcyB3aGVyZQogKiB0aGUgc3VwZXJjbGFzcyBpcyBub3QgdW5kZXIgdGhlIHByb2dyYW1tZXIncyBjb250cm9sLCB0aGUgc3VwZXJjbGFzcyBpcyBpbiBhCiAqIGRpZmZlcmVudCBsaWJyYXJ5IG9yIHBhY2thZ2UsIGFuZCBpdCBpcyBub3QgY29uc2lkZXJlZCBzdGFibGUuCiAqIEluIGFueSBjYXNlLCB0aGUgdXNlIG9mIGBAb3ZlcnJpZGVgIGlzIG9wdGlvbmFsLgogKgogKiBGb3IgZXhhbXBsZSwgdGhlIGFubm90YXRpb24gaXMgaW50ZW50aW9uYWxseSBub3QgdXNlZCBpbiB0aGUgRGFydCBwbGF0Zm9ybQogKiBsaWJyYXJpZXMsIHNpbmNlIHRoZXkgb25seSBkZXBlbmQgb24gdGhlbXNlbHZlcy4KICovCmNvbnN0IE9iamVjdCBvdmVycmlkZSA9IF9PdmVycmlkZSgpOwoKLyoqCiAqIEFuIGFubm90YXRpb24gY2xhc3MgdGhhdCB3YXMgdXNlZCBkdXJpbmcgZGV2ZWxvcG1lbnQgb2YgRGFydCAyLgogKgogKiBTaG91bGQgbm90IGJlIHVzZWQgYW55IG1vcmUuCiAqLwpAZGVwcmVjYXRlZApjbGFzcyBQcm92aXNpb25hbCB7CiAgU3RyaW5nIGdldCBtZXNzYWdlID0+IG51bGw7CiAgY29uc3QgUHJvdmlzaW9uYWwoe1N0cmluZyBtZXNzYWdlfSk7Cn0KCi8qKgogKiBBbiBhbm5vdGF0aW9uIHRoYXQgd2FzIHVzZWQgZHVyaW5nIGRldmVsb3BtZW50IG9mIERhcnQgMi4KICoKICogU2hvdWxkIG5vdCBiZSB1c2VkIGFueSBtb3JlLgogKi8KQGRlcHJlY2F0ZWQKY29uc3QgTnVsbCBwcm92aXNpb25hbCA9IG51bGw7CgpjbGFzcyBfUHJveHkgewogIGNvbnN0IF9Qcm94eSgpOwp9CgovKioKICogVGhpcyBhbm5vdGF0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBEYXJ0IDIuCiAqCiAqIERhcnQgMiBoYXMgYSBtb3JlIHJlc3RyaWN0aXZlIHR5cGUgc3lzdGVtIHRoYW4gRGFydCAxLCBhbmQgaXQgcmVxdWlyZXMKICogbWV0aG9kIGFjY2VzcyB0byBiZSBlaXRoZXIgdGhyb3VnaCBhIGtub3duIGludGVyZmFjZSBvciBieSB1c2luZwogKiBkeW5hbWljIGludm9jYXRpb25zLiBUaGUgb3JpZ2luYWwgaW50ZW50IG9mIGBAcHJveHlgICh0byBpbXBsZW1lbnQgYSBjbGFzcwogKiB0aGF0IGlzbid0IGtub3duIHN0YXRpY2FsbHksIGFzIGRvY3VtZW50ZWQgYXQgdGhlIGVuZCBvZiB0aGlzIHRleHQpLAogKiBpcyBub3Qgc3VwcG9ydGVkIGJ5IERhcnQgMi4KICogVG8gY29udGludWUgdG8gcGVyZm9ybSBkeW5hbWljIGludm9jYXRpb25zIG9uIGFuIG9iamVjdCwKICogaXQgc2hvdWxkIGJlIGFjY2Vzc2VkIHRocm91Z2ggYSByZWZlcmVuY2Ugb2YgdHlwZSBgZHluYW1pY2AuCiAqCiAqIFRoZSBhbm5vdGF0aW9uIGBAcHJveHlgIG1hcmtzIGEgY2xhc3MgYXMgaW1wbGVtZW50aW5nIG1lbWJlcnMgZHluYW1pY2FsbHkKICogdGhyb3VnaCBgbm9TdWNoTWV0aG9kYC4KICoKICogVGhlIGFubm90YXRpb24gYXBwbGllcyB0byBhbnkgY2xhc3MuIEl0IGlzIGluaGVyaXRlZCBieSBzdWJjbGFzc2VzIGZyb20gYm90aAogKiBzdXBlcmNsYXNzIGFuZCBpbnRlcmZhY2VzLgogKgogKiBJZiBhIGNsYXNzIGlzIGFubm90YXRlZCB3aXRoIGBAcHJveHlgLCBvciBpdCBpbXBsZW1lbnRzIGFueSBjbGFzcyB0aGF0IGlzCiAqIGFubm90YXRlZCwgdGhlbiBhbGwgbWVtYmVyIGFjY2Vzc2VzIGFyZSBhbGxvd2VkIG9uIGFuIG9iamVjdCBvZiB0aGF0IHR5cGUuCiAqIEFzIHN1Y2gsIGl0IGlzIG5vdCBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgdG8gYWNjZXNzIGFueSBtZW1iZXIgb2YgdGhlIG9iamVjdAogKiB3aGljaCBpcyBub3QgaW1wbGVtZW50ZWQgYnkgdGhlIGNsYXNzLCBvciB0byBjYWxsIGEgbWV0aG9kIHdpdGggYSBkaWZmZXJlbnQKICogbnVtYmVyIG9mIHBhcmFtZXRlcnMgdGhhbiBpdCBpcyBkZWNsYXJlZCB3aXRoLgogKgogKiBUaGUgYW5ub3RhdGlvbiBkb2VzIG5vdCBjaGFuZ2Ugd2hpY2ggY2xhc3NlcyB0aGUgYW5ub3RhdGVkIGNsYXNzIGltcGxlbWVudHMsCiAqIGFuZCBkb2VzIG5vdCBwcmV2ZW50IHN0YXRpYyB3YXJuaW5ncyBmb3IgYXNzaWduaW5nIGFuIG9iamVjdCB0byBhIHZhcmlhYmxlCiAqIHdpdGggYSBzdGF0aWMgdHlwZSBub3QgaW1wbGVtZW50ZWQgYnkgdGhlIG9iamVjdC4KICoKICogVGhlIHN1cHByZXNzaW9uIG9mIHdhcm5pbmdzIG9ubHkgYWZmZWN0IHN0YXRpYyB0eXBlIHdhcm5pbmdzIGFib3V0CiAqIG1lbWJlciBhY2Nlc3MuCiAqIFRoZSBydW50aW1lIHR5cGUgb2YgdGhlIG9iamVjdCBpcyB1bmFmZmVjdGVkLgogKiBJdCBpcyBub3QgY29uc2lkZXJlZCB0byBpbXBsZW1lbnQgYW55IHNwZWNpYWwgaW50ZXJmYWNlcywKICogc28gYXNzaWduaW5nIGl0IHRvIGEgdHlwZWQgdmFyaWFibGUgbWF5IGZhaWwgaW4gY2hlY2tlZCBtb2RlLAogKiBhbmQgdGVzdGluZyBpdCB3aXRoIHRoZSBgaXNgIG9wZXJhdG9yCiAqIHdpbGwgb25seSByZXR1cm4gdHJ1ZSBmb3IgdHlwZXMgaXQgYWN0dWFsbHkgaW1wbGVtZW50cyBvciBleHRlbmRzLgogKiBBY2Nlc3NpbmcgYSBtZW1iZXIgd2hpY2ggaXNuJ3QgaW1wbGVtZW50ZWQgYnkgdGhlIGNsYXNzCiAqIHdpbGwgY2F1c2UgdGhlIGBub1N1Y2hNZXRob2RgIG1ldGhvZCB0byBiZSBjYWxsZWQgbm9ybWFsbHksCiAqIHRoZSBgQHByb3h5YCBhbm5vdGF0aW9uIG1lcmVseSBzdGF0ZXMgdGhlIGludGVudCB0byBoYW5kbGUgKHNvbWUgb2YpIHRob3NlCiAqIGBub1N1Y2hNZXRob2RgIGNhbGxzIGdyYWNlZnVsbHkuCiAqCiAqIEEgY2xhc3MgdGhhdCBtYXJrZWQgYXMgYEBwcm94eWAgc2hvdWxkIG92ZXJyaWRlIHRoZSBgbm9TdWNoTWV0aG9kYAogKiBkZWNsYXJlZCBvbiBbT2JqZWN0XS4KICoKICogVGhlIGludGVudCBvZiB0aGUgYEBwcm94eWAgbm90YXRpb24gaXMgdG8gY3JlYXRlIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgYQogKiB0eXBlIChvciBtdWx0aXBsZSB0eXBlcykgdGhhdCBhcmUgbm90IGtub3duIGF0IGNvbXBpbGUgdGltZS4gSWYgdGhlIHR5cGVzCiAqIGFyZSBrbm93biBhdCBjb21waWxlIHRpbWUsIGEgY2xhc3MgY2FuIGJlIHdyaXR0ZW4gdGhhdCBpbXBsZW1lbnRzIHRoZXNlCiAqIHR5cGVzLgogKi8KQGRlcHJlY2F0ZWQKY29uc3QgT2JqZWN0IHByb3h5ID0gX1Byb3h5KCk7CgovKioKICogQSBoaW50IHRvIHRvb2xzLgogKgogKiBUb29scyB0aGF0IHdvcmsgd2l0aCBEYXJ0IHByb2dyYW1zIG1heSBhY2NlcHQgaGludHMgdG8gZ3VpZGUgdGhlaXIgYmVoYXZpb3IKICogYXMgYHByYWdtYWAgYW5ub3RhdGlvbnMgb24gZGVjbGFyYXRpb25zLgogKiBFYWNoIHRvb2wgZGVjaWRlcyB3aGljaCBoaW50cyBpdCBhY2NlcHRzLCB3aGF0IHRoZXkgbWVhbiwgYW5kIHdoZXRoZXIgYW5kCiAqIGhvdyB0aGV5IGFwcGx5IHRvIHN1Yi1wYXJ0cyBvZiB0aGUgYW5ub3RhdGVkIGVudGl0eS4KICoKICogVG9vbHMgdGhhdCByZWNvZ25pemUgcHJhZ21hIGhpbnRzIHNob3VsZCBwaWNrIGEgcHJhZ21hIHByZWZpeCB0byBpZGVudGlmeQogKiB0aGUgdG9vbC4gVGhleSBzaG91bGQgcmVjb2duaXplIGFueSBoaW50IHdpdGggYSBbbmFtZV0gc3RhcnRpbmcgd2l0aCB0aGVpcgogKiBwcmVmaXggZm9sbG93ZWQgYnkgYDpgIGFzIGlmIGl0IHdhcyBpbnRlbmRlZCBmb3IgdGhhdCB0b29sLiBBIGhpbnQgd2l0aCBhCiAqIHByZWZpeCBmb3IgYW5vdGhlciB0b29sIHNob3VsZCBiZSBpZ25vcmVkICh1bmxlc3MgY29tcGF0aWJpbGl0eSB3aXRoIHRoYXQKICogb3RoZXIgdG9vbCBpcyBhIGdvYWwpLgogKgogKiBBIHRvb2wgbWF5IHJlY29nbml6ZSB1bnByZWZpeGVkIG5hbWVzIGFzIHdlbGwsIGlmIHRoZXkgd291bGQgcmVjb2duaXplIHRoYXQKICogbmFtZSB3aXRoIHRoZWlyIG93biBwcmVmaXggaW4gZnJvbnQuCiAqCiAqIElmIHRoZSBoaW50IGNhbiBiZSBwYXJhbWV0ZXJpemVkLCBhbiBleHRyYSBbb3B0aW9uc10gb2JqZWN0IGNhbiBiZSBhZGRlZCBhcyB3ZWxsLgogKgogKiBGb3IgZXhhbXBsZToKICoKICogYGBgZGFydAogKiBAcHJhZ21hKCdUb29sOnByYWdtYS1uYW1lJywgW3BhcmFtMSwgcGFyYW0yLCAuLi5dKQogKiBjbGFzcyBGb28geyB9CiAqCiAqIEBwcmFnbWEoJ090aGVyVG9vbDpvdGhlci1wcmFnbWEnKQogKiB2b2lkIGZvbygpIHsgfQogKiBgYGAKICoKICogSGVyZSBjbGFzcyBGb28gaXMgYW5ub3RhdGVkIHdpdGggYSBUb29sIHNwZWNpZmljIHByYWdtYSAncHJhZ21hLW5hbWUnIGFuZAogKiBmdW5jdGlvbiBmb28gaXMgYW5ub3RhdGVkIHdpdGggYSBwcmFnbWEgJ290aGVyLXByYWdtYScgc3BlY2lmaWMgdG8gT3RoZXJUb29sLgogKgogKi8KQHByYWdtYSgndm06ZW50cnktcG9pbnQnKQpjbGFzcyBwcmFnbWEgewogIC8qKgogICAqIFRoZSBuYW1lIG9mIHRoZSBoaW50LgogICAqCiAgICogQSBzdHJpbmcgdGhhdCBpcyByZWNvZ25pemVkIGJ5IG9uZSBvciBtb3JlIHRvb2xzLCBvciBzdWNoIGEgc3RyaW5nIHByZWZpeGVkCiAgICogYnkgYSB0b29sIGlkZW50aWZpZXIgYW5kIGEgY29sb24sIHdoaWNoIGlzIG9ubHkgcmVjb2duaXplZCBieSB0aGF0CiAgICogcGFydGljdWxhciB0b29sLgogICAqLwogIGZpbmFsIFN0cmluZyBuYW1lOwoKICAvKiogT3B0aW9uYWwgZXh0cmEgZGF0YSBwYXJhbWV0ZXJpemluZyB0aGUgaGludC4gKi8KICBmaW5hbCBPYmplY3Qgb3B0aW9uczsKCiAgLyoqIENyZWF0ZXMgYSBoaW50IG5hbWVkIFtuYW1lXSB3aXRoIG9wdGlvbmFsIFtvcHRpb25zXS4gKi8KICBjb25zdCBmYWN0b3J5IHByYWdtYShTdHJpbmcgbmFtZSwgW09iamVjdCBvcHRpb25zXSkgPSBwcmFnbWEuXzsKCiAgY29uc3QgcHJhZ21hLl8odGhpcy5uYW1lLCBbdGhpcy5vcHRpb25zXSk7Cn0KgPIATk48ARMBBEwDREEDTk0OA01PTEUDTz8DTUNQRiwDHgM8OkoDAzsDLEgfPU1MRFEDA049RgQTBkgFS1EOBhgBBkwqBVBQIAYiAUYhATcCAQQ7BDoBEhUCAQRHKQNLTj8DSUpCHgNLTh8DSVBCNANONAQlAQRDAyAEDBQeJwIBBD0DIAQMHwEPEgIBBEADSkROSB88QANNGwNQHgNNTk9PMgNQTjUDRhIxPUEpRjs/TiQDRhkDTU1LCgQMHwEEFANPLE04A01OTU0aA08oA1UDEAMLNhEDJRIHA01RAwQaDwYbBVFIFgYVATYYAT5CAS0CARpkYXJ0OmNvcmUvYW5ub3RhdGlvbnMuZGFydCxvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9iaWdpbnQuZGFydLGULy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIEFuIGFyYml0cmFyaWx5IGxhcmdlIGludGVnZXIuCiAqLwphYnN0cmFjdCBjbGFzcyBCaWdJbnQgaW1wbGVtZW50cyBDb21wYXJhYmxlPEJpZ0ludD4gewogIGV4dGVybmFsIHN0YXRpYyBCaWdJbnQgZ2V0IHplcm87CiAgZXh0ZXJuYWwgc3RhdGljIEJpZ0ludCBnZXQgb25lOwogIGV4dGVybmFsIHN0YXRpYyBCaWdJbnQgZ2V0IHR3bzsKCiAgLyoqCiAgICogUGFyc2VzIFtzb3VyY2VdIGFzIGEsIHBvc3NpYmx5IHNpZ25lZCwgaW50ZWdlciBsaXRlcmFsIGFuZCByZXR1cm5zIGl0cwogICAqIHZhbHVlLgogICAqCiAgICogVGhlIFtzb3VyY2VdIG11c3QgYmUgYSBub24tZW1wdHkgc2VxdWVuY2Ugb2YgYmFzZS1bcmFkaXhdIGRpZ2l0cywKICAgKiBvcHRpb25hbGx5IHByZWZpeGVkIHdpdGggYSBtaW51cyBvciBwbHVzIHNpZ24gKCctJyBvciAnKycpLgogICAqCiAgICogVGhlIFtyYWRpeF0gbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMi4uMzYuIFRoZSBkaWdpdHMgdXNlZCBhcmUKICAgKiBmaXJzdCB0aGUgZGVjaW1hbCBkaWdpdHMgMC4uOSwgYW5kIHRoZW4gdGhlIGxldHRlcnMgJ2EnLi4neicgd2l0aAogICAqIHZhbHVlcyAxMCB0aHJvdWdoIDM1LiBBbHNvIGFjY2VwdHMgdXBwZXItY2FzZSBsZXR0ZXJzIHdpdGggdGhlIHNhbWUKICAgKiB2YWx1ZXMgYXMgdGhlIGxvd2VyLWNhc2Ugb25lcy4KICAgKgogICAqIElmIG5vIFtyYWRpeF0gaXMgZ2l2ZW4gdGhlbiBpdCBkZWZhdWx0cyB0byAxMC4gSW4gdGhpcyBjYXNlLCB0aGUgW3NvdXJjZV0KICAgKiBkaWdpdHMgbWF5IGFsc28gc3RhcnQgd2l0aCBgMHhgLCBpbiB3aGljaCBjYXNlIHRoZSBudW1iZXIgaXMgaW50ZXJwcmV0ZWQKICAgKiBhcyBhIGhleGFkZWNpbWFsIGxpdGVyYWwsIHdoaWNoIGVmZmVjdGl2ZWx5IG1lYW5zIHRoYXQgdGhlIGAweGAgaXMgaWdub3JlZAogICAqIGFuZCB0aGUgcmFkaXggaXMgaW5zdGVhZCBzZXQgdG8gMTYuCiAgICoKICAgKiBGb3IgYW55IGludCBgbmAgYW5kIHJhZGl4IGByYCwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0CiAgICogYG4gPT0gaW50LnBhcnNlKG4udG9SYWRpeFN0cmluZyhyKSwgcmFkaXg6IHIpYC4KICAgKgogICAqIFRocm93cyBhIFtGb3JtYXRFeGNlcHRpb25dIGlmIHRoZSBbc291cmNlXSBpcyBub3QgYSB2YWxpZCBpbnRlZ2VyIGxpdGVyYWwsCiAgICogb3B0aW9uYWxseSBwcmVmaXhlZCBieSBhIHNpZ24uCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIEJpZ0ludCBwYXJzZShTdHJpbmcgc291cmNlLCB7aW50IHJhZGl4fSk7CgogIC8qKgogICAqIFBhcnNlcyBbc291cmNlXSBhcyBhLCBwb3NzaWJseSBzaWduZWQsIGludGVnZXIgbGl0ZXJhbCBhbmQgcmV0dXJucyBpdHMKICAgKiB2YWx1ZS4KICAgKgogICAqIEFzIFtwYXJzZV0gZXhjZXB0IHRoYXQgdGhpcyBtZXRob2QgcmV0dXJucyBgbnVsbGAgaWYgdGhlIGlucHV0IGlzIG5vdAogICAqIHZhbGlkCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIEJpZ0ludCB0cnlQYXJzZShTdHJpbmcgc291cmNlLCB7aW50IHJhZGl4fSk7CgogIC8vLyBBbGxvY2F0ZXMgYSBiaWcgaW50ZWdlciBmcm9tIHRoZSBwcm92aWRlZCBbdmFsdWVdIG51bWJlci4KICBleHRlcm5hbCBmYWN0b3J5IEJpZ0ludC5mcm9tKG51bSB2YWx1ZSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgaW50ZWdlci4KICAgKgogICAqIEZvciBhbnkgaW50ZWdlciBgeGAsIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMgYHggPCAwID8gLXggOiB4YC4KICAgKi8KICBCaWdJbnQgYWJzKCk7CgogIC8qKgogICAqIFJldHVybiB0aGUgbmVnYXRpdmUgdmFsdWUgb2YgdGhpcyBpbnRlZ2VyLgogICAqCiAgICogVGhlIHJlc3VsdCBvZiBuZWdhdGluZyBhbiBpbnRlZ2VyIGFsd2F5cyBoYXMgdGhlIG9wcG9zaXRlIHNpZ24sIGV4Y2VwdAogICAqIGZvciB6ZXJvLCB3aGljaCBpcyBpdHMgb3duIG5lZ2F0aW9uLgogICAqLwogIEJpZ0ludCBvcGVyYXRvciAtKCk7CgogIC8vLyBBZGRpdGlvbiBvcGVyYXRvci4KICBCaWdJbnQgb3BlcmF0b3IgKyhCaWdJbnQgb3RoZXIpOwoKICAvLy8gU3VidHJhY3Rpb24gb3BlcmF0b3IuCiAgQmlnSW50IG9wZXJhdG9yIC0oQmlnSW50IG90aGVyKTsKCiAgLy8vIE11bHRpcGxpY2F0aW9uIG9wZXJhdG9yLgogIEJpZ0ludCBvcGVyYXRvciAqKEJpZ0ludCBvdGhlcik7CgogIC8vLyBEaXZpc2lvbiBvcGVyYXRvci4KICBkb3VibGUgb3BlcmF0b3IgLyhCaWdJbnQgb3RoZXIpOwoKICAvKioKICAgKiBUcnVuY2F0aW5nIGRpdmlzaW9uIG9wZXJhdG9yLgogICAqCiAgICogUGVyZm9ybXMgYSB0cnVuY2F0aW5nIGludGVnZXIgZGl2aXNpb24sIHdoZXJlIHRoZSByZW1haW5kZXIgaXMgZGlzY2FyZGVkLgogICAqCiAgICogVGhlIHJlbWFpbmRlciBjYW4gYmUgY29tcHV0ZWQgdXNpbmcgdGhlIFtyZW1haW5kZXJdIG1ldGhvZC4KICAgKgogICAqIEV4YW1wbGVzOgogICAqIGBgYAogICAqIHZhciBzZXZlbiA9IG5ldyBCaWdJbnQuZnJvbSg3KTsKICAgKiB2YXIgdGhyZWUgPSBuZXcgQmlnSW50LmZyb20oMyk7CiAgICogc2V2ZW4gfi8gdGhyZWU7ICAgIC8vID0+IDIKICAgKiAoLXNldmVuKSB+LyB0aHJlZTsgLy8gPT4gLTIKICAgKiBzZXZlbiB+LyAtdGhyZWU7ICAgLy8gPT4gLTIKICAgKiBzZXZlbi5yZW1haW5kZXIodGhyZWUpOyAgICAvLyA9PiAxCiAgICogKC1zZXZlbikucmVtYWluZGVyKHRocmVlKTsgLy8gPT4gLTEKICAgKiBzZXZlbi5yZW1haW5kZXIoLXRocmVlKTsgICAvLyA9PiAxCiAgICogYGBgCiAgICovCiAgQmlnSW50IG9wZXJhdG9yIH4vKEJpZ0ludCBvdGhlcik7CgogIC8qKgogICAqIEV1Y2xpZGVhbiBtb2R1bG8gb3BlcmF0b3IuCiAgICoKICAgKiBSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgdGhlIEV1Y2xpZGVhbiBkaXZpc2lvbi4gVGhlIEV1Y2xpZGVhbiBkaXZpc2lvbiBvZgogICAqIHR3byBpbnRlZ2VycyBgYWAgYW5kIGBiYCB5aWVsZHMgdHdvIGludGVnZXJzIGBxYCBhbmQgYHJgIHN1Y2ggdGhhdAogICAqIGBhID09IGIgKiBxICsgcmAgYW5kIGAwIDw9IHIgPCBiLmFicygpYC4KICAgKgogICAqIFRoZSBzaWduIG9mIHRoZSByZXR1cm5lZCB2YWx1ZSBgcmAgaXMgYWx3YXlzIHBvc2l0aXZlLgogICAqCiAgICogU2VlIFtyZW1haW5kZXJdIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSB0cnVuY2F0aW5nIGRpdmlzaW9uLgogICAqLwogIEJpZ0ludCBvcGVyYXRvciAlKEJpZ0ludCBvdGhlcik7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHJlbWFpbmRlciBvZiB0aGUgdHJ1bmNhdGluZyBkaXZpc2lvbiBvZiBgdGhpc2AgYnkgW290aGVyXS4KICAgKgogICAqIFRoZSByZXN1bHQgYHJgIG9mIHRoaXMgb3BlcmF0aW9uIHNhdGlzZmllczoKICAgKiBgdGhpcyA9PSAodGhpcyB+LyBvdGhlcikgKiBvdGhlciArIHJgLgogICAqIEFzIGEgY29uc2VxdWVuY2UgdGhlIHJlbWFpbmRlciBgcmAgaGFzIHRoZSBzYW1lIHNpZ24gYXMgdGhlIGRpdmlkZXIgYHRoaXNgLgogICAqLwogIEJpZ0ludCByZW1haW5kZXIoQmlnSW50IG90aGVyKTsKCiAgLyoqCiAgICogU2hpZnQgdGhlIGJpdHMgb2YgdGhpcyBpbnRlZ2VyIHRvIHRoZSBsZWZ0IGJ5IFtzaGlmdEFtb3VudF0uCiAgICoKICAgKiBTaGlmdGluZyB0byB0aGUgbGVmdCBtYWtlcyB0aGUgbnVtYmVyIGxhcmdlciwgZWZmZWN0aXZlbHkgbXVsdGlwbHlpbmcKICAgKiB0aGUgbnVtYmVyIGJ5IGBwb3coMiwgc2hpZnRJbmRleClgLgogICAqCiAgICogVGhlcmUgaXMgbm8gbGltaXQgb24gdGhlIHNpemUgb2YgdGhlIHJlc3VsdC4gSXQgbWF5IGJlIHJlbGV2YW50IHRvCiAgICogbGltaXQgaW50ZXJtZWRpYXRlIHZhbHVlcyBieSB1c2luZyB0aGUgImFuZCIgb3BlcmF0b3Igd2l0aCBhIHN1aXRhYmxlCiAgICogbWFzay4KICAgKgogICAqIEl0IGlzIGFuIGVycm9yIGlmIFtzaGlmdEFtb3VudF0gaXMgbmVnYXRpdmUuCiAgICovCiAgQmlnSW50IG9wZXJhdG9yIDw8KGludCBzaGlmdEFtb3VudCk7CgogIC8qKgogICAqIFNoaWZ0IHRoZSBiaXRzIG9mIHRoaXMgaW50ZWdlciB0byB0aGUgcmlnaHQgYnkgW3NoaWZ0QW1vdW50XS4KICAgKgogICAqIFNoaWZ0aW5nIHRvIHRoZSByaWdodCBtYWtlcyB0aGUgbnVtYmVyIHNtYWxsZXIgYW5kIGRyb3BzIHRoZSBsZWFzdAogICAqIHNpZ25pZmljYW50IGJpdHMsIGVmZmVjdGl2ZWx5IGRvaW5nIGFuIGludGVnZXIgZGl2aXNpb24gYnkKICAgKmBwb3coMiwgc2hpZnRJbmRleClgLgogICAqCiAgICogSXQgaXMgYW4gZXJyb3IgaWYgW3NoaWZ0QW1vdW50XSBpcyBuZWdhdGl2ZS4KICAgKi8KICBCaWdJbnQgb3BlcmF0b3IgPj4oaW50IHNoaWZ0QW1vdW50KTsKCiAgLyoqCiAgICogQml0LXdpc2UgYW5kIG9wZXJhdG9yLgogICAqCiAgICogVHJlYXRpbmcgYm90aCBgdGhpc2AgYW5kIFtvdGhlcl0gYXMgc3VmZmljaWVudGx5IGxhcmdlIHR3bydzIGNvbXBvbmVudAogICAqIGludGVnZXJzLCB0aGUgcmVzdWx0IGlzIGEgbnVtYmVyIHdpdGggb25seSB0aGUgYml0cyBzZXQgdGhhdCBhcmUgc2V0IGluCiAgICogYm90aCBgdGhpc2AgYW5kIFtvdGhlcl0KICAgKgogICAqIE9mIGJvdGggb3BlcmFuZHMgYXJlIG5lZ2F0aXZlLCB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlLCBvdGhlcndpc2UKICAgKiB0aGUgcmVzdWx0IGlzIG5vbi1uZWdhdGl2ZS4KICAgKi8KICBCaWdJbnQgb3BlcmF0b3IgJihCaWdJbnQgb3RoZXIpOwoKICAvKioKICAgKiBCaXQtd2lzZSBvciBvcGVyYXRvci4KICAgKgogICAqIFRyZWF0aW5nIGJvdGggYHRoaXNgIGFuZCBbb3RoZXJdIGFzIHN1ZmZpY2llbnRseSBsYXJnZSB0d28ncyBjb21wb25lbnQKICAgKiBpbnRlZ2VycywgdGhlIHJlc3VsdCBpcyBhIG51bWJlciB3aXRoIHRoZSBiaXRzIHNldCB0aGF0IGFyZSBzZXQgaW4gZWl0aGVyCiAgICogb2YgYHRoaXNgIGFuZCBbb3RoZXJdCiAgICoKICAgKiBJZiBib3RoIG9wZXJhbmRzIGFyZSBub24tbmVnYXRpdmUsIHRoZSByZXN1bHQgaXMgbm9uLW5lZ2F0aXZlLAogICAqIG90aGVyd2lzZSB0aGUgcmVzdWx0IHVzIG5lZ2F0aXZlLgogICAqLwogIEJpZ0ludCBvcGVyYXRvciB8KEJpZ0ludCBvdGhlcik7CgogIC8qKgogICAqIEJpdC13aXNlIGV4Y2x1c2l2ZS1vciBvcGVyYXRvci4KICAgKgogICAqIFRyZWF0aW5nIGJvdGggYHRoaXNgIGFuZCBbb3RoZXJdIGFzIHN1ZmZpY2llbnRseSBsYXJnZSB0d28ncyBjb21wb25lbnQKICAgKiBpbnRlZ2VycywgdGhlIHJlc3VsdCBpcyBhIG51bWJlciB3aXRoIHRoZSBiaXRzIHNldCB0aGF0IGFyZSBzZXQgaW4gb25lLAogICAqIGJ1dCBub3QgYm90aCwgb2YgYHRoaXNgIGFuZCBbb3RoZXJdCiAgICoKICAgKiBJZiB0aGUgb3BlcmFuZHMgaGF2ZSB0aGUgc2FtZSBzaWduLCB0aGUgcmVzdWx0IGlzIG5vbi1uZWdhdGl2ZSwKICAgKiBvdGhlcndpc2UgdGhlIHJlc3VsdCBpcyBuZWdhdGl2ZS4KICAgKi8KICBCaWdJbnQgb3BlcmF0b3IgXihCaWdJbnQgb3RoZXIpOwoKICAvKioKICAgKiBUaGUgYml0LXdpc2UgbmVnYXRlIG9wZXJhdG9yLgogICAqCiAgICogVHJlYXRpbmcgYHRoaXNgIGFzIGEgc3VmZmljaWVudGx5IGxhcmdlIHR3bydzIGNvbXBvbmVudCBpbnRlZ2VyLAogICAqIHRoZSByZXN1bHQgaXMgYSBudW1iZXIgd2l0aCB0aGUgb3Bwb3NpdGUgYml0cyBzZXQuCiAgICoKICAgKiBUaGlzIG1hcHMgYW55IGludGVnZXIgYHhgIHRvIGAteCAtIDFgLgogICAqLwogIEJpZ0ludCBvcGVyYXRvciB+KCk7CgogIC8qKiBSZWxhdGlvbmFsIGxlc3MgdGhhbiBvcGVyYXRvci4gKi8KICBib29sIG9wZXJhdG9yIDwoQmlnSW50IG90aGVyKTsKCiAgLyoqIFJlbGF0aW9uYWwgbGVzcyB0aGFuIG9yIGVxdWFsIG9wZXJhdG9yLiAqLwogIGJvb2wgb3BlcmF0b3IgPD0oQmlnSW50IG90aGVyKTsKCiAgLyoqIFJlbGF0aW9uYWwgZ3JlYXRlciB0aGFuIG9wZXJhdG9yLiAqLwogIGJvb2wgb3BlcmF0b3IgPihCaWdJbnQgb3RoZXIpOwoKICAvKiogUmVsYXRpb25hbCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IuICovCiAgYm9vbCBvcGVyYXRvciA+PShCaWdJbnQgb3RoZXIpOwoKICAvKioKICAgKiBDb21wYXJlcyB0aGlzIHRvIGBvdGhlcmAuCiAgICoKICAgKiBSZXR1cm5zIGEgbmVnYXRpdmUgbnVtYmVyIGlmIGB0aGlzYCBpcyBsZXNzIHRoYW4gYG90aGVyYCwgemVybyBpZiB0aGV5IGFyZQogICAqIGVxdWFsLCBhbmQgYSBwb3NpdGl2ZSBudW1iZXIgaWYgYHRoaXNgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLgogICAqLwogIGludCBjb21wYXJlVG8oQmlnSW50IG90aGVyKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBzdG9yZSB0aGlzIGJpZyBpbnRlZ2VyLgogICAqCiAgICogVGhlIG51bWJlciBvZiBiaXRzIGV4Y2x1ZGVzIHRoZSBzaWduIGJpdCwgd2hpY2ggZ2l2ZXMgdGhlIG5hdHVyYWwgbGVuZ3RoCiAgICogZm9yIG5vbi1uZWdhdGl2ZSAodW5zaWduZWQpIHZhbHVlcy4gIE5lZ2F0aXZlIHZhbHVlcyBhcmUgY29tcGxlbWVudGVkIHRvCiAgICogcmV0dXJuIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJpdCB0aGF0IGRpZmZlcnMgZnJvbSB0aGUgc2lnbiBiaXQuCiAgICoKICAgKiBUbyBmaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gc3RvcmUgdGhlIHZhbHVlIGFzIGEgc2lnbmVkIHZhbHVlLAogICAqIGFkZCBvbmUsIGkuZS4gdXNlIGB4LmJpdExlbmd0aCArIDFgLgogICAqCiAgICogYGBgCiAgICogeC5iaXRMZW5ndGggPT0gKC14LTEpLmJpdExlbmd0aAogICAqCiAgICogbmV3IEJpZ0ludC5mcm9tKDMpLmJpdExlbmd0aCA9PSAyOyAgIC8vIDAwMDAwMDExCiAgICogbmV3IEJpZ0ludC5mcm9tKDIpLmJpdExlbmd0aCA9PSAyOyAgIC8vIDAwMDAwMDEwCiAgICogbmV3IEJpZ0ludC5mcm9tKDEpLmJpdExlbmd0aCA9PSAxOyAgIC8vIDAwMDAwMDAxCiAgICogbmV3IEJpZ0ludC5mcm9tKDApLmJpdExlbmd0aCA9PSAwOyAgIC8vIDAwMDAwMDAwCiAgICogbmV3IEJpZ0ludC5mcm9tKC0xKS5iaXRMZW5ndGggPT0gMDsgIC8vIDExMTExMTExCiAgICogbmV3IEJpZ0ludC5mcm9tKC0yKS5iaXRMZW5ndGggPT0gMTsgIC8vIDExMTExMTEwCiAgICogbmV3IEJpZ0ludC5mcm9tKC0zKS5iaXRMZW5ndGggPT0gMjsgIC8vIDExMTExMTAxCiAgICogbmV3IEJpZ0ludC5mcm9tKC00KS5iaXRMZW5ndGggPT0gMjsgIC8vIDExMTExMTAwCiAgICogYGBgCiAgICovCiAgaW50IGdldCBiaXRMZW5ndGg7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHNpZ24gb2YgdGhpcyBiaWcgaW50ZWdlci4KICAgKgogICAqIFJldHVybnMgMCBmb3IgemVybywgLTEgZm9yIHZhbHVlcyBsZXNzIHRoYW4gemVybyBhbmQKICAgKiArMSBmb3IgdmFsdWVzIGdyZWF0ZXIgdGhhbiB6ZXJvLgogICAqLwogIGludCBnZXQgc2lnbjsKCiAgLy8vIFdoZXRoZXIgdGhpcyBiaWcgaW50ZWdlciBpcyBldmVuLgogIGJvb2wgZ2V0IGlzRXZlbjsKCiAgLy8vIFdoZXRoZXIgdGhpcyBiaWcgaW50ZWdlciBpcyBvZGQuCiAgYm9vbCBnZXQgaXNPZGQ7CgogIC8vLyBXaGV0aGVyIHRoaXMgbnVtYmVyIGlzIG5lZ2F0aXZlLgogIGJvb2wgZ2V0IGlzTmVnYXRpdmU7CgogIC8qKgogICAqIFJldHVybnMgYHRoaXNgIHRvIHRoZSBwb3dlciBvZiBbZXhwb25lbnRdLgogICAqCiAgICogUmV0dXJucyBbb25lXSBpZiB0aGUgW2V4cG9uZW50XSBlcXVhbHMgMC4KICAgKgogICAqIFRoZSBbZXhwb25lbnRdIG11c3Qgb3RoZXJ3aXNlIGJlIHBvc2l0aXZlLgogICAqCiAgICogVGhlIHJlc3VsdCBpcyBhbHdheXMgZXF1YWwgdG8gdGhlIG1hdGhlbWF0aWNhbCByZXN1bHQgb2YgdGhpcyB0byB0aGUgcG93ZXIKICAgKiBbZXhwb25lbnRdLCBvbmx5IGxpbWl0ZWQgYnkgdGhlIGF2YWlsYWJsZSBtZW1vcnkuCiAgICovCiAgQmlnSW50IHBvdyhpbnQgZXhwb25lbnQpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoaXMgaW50ZWdlciB0byB0aGUgcG93ZXIgb2YgW2V4cG9uZW50XSBtb2R1bG8gW21vZHVsdXNdLgogICAqCiAgICogVGhlIFtleHBvbmVudF0gbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIFttb2R1bHVzXSBtdXN0IGJlCiAgICogcG9zaXRpdmUuCiAgICovCiAgQmlnSW50IG1vZFBvdyhCaWdJbnQgZXhwb25lbnQsIEJpZ0ludCBtb2R1bHVzKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbW9kdWxhciBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIHRoaXMgYmlnIGludGVnZXIKICAgKiBtb2R1bG8gW21vZHVsdXNdLgogICAqCiAgICogVGhlIFttb2R1bHVzXSBtdXN0IGJlIHBvc2l0aXZlLgogICAqCiAgICogSXQgaXMgYW4gZXJyb3IgaWYgbm8gbW9kdWxhciBpbnZlcnNlIGV4aXN0cy4KICAgKi8KICAvLyBSZXR1cm5zIDEvdGhpcyAlIG1vZHVsdXMsIHdpdGggbW9kdWx1cyA+IDAuCiAgQmlnSW50IG1vZEludmVyc2UoQmlnSW50IG1vZHVsdXMpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiB0aGlzIGJpZyBpbnRlZ2VyIGFuZCBbb3RoZXJdLgogICAqCiAgICogSWYgZWl0aGVyIG51bWJlciBpcyBub24temVybywgdGhlIHJlc3VsdCBpcyB0aGUgbnVtZXJpY2FsbHkgZ3JlYXRlc3QKICAgKiBpbnRlZ2VyIGRpdmlkaW5nIGJvdGggYHRoaXNgIGFuZCBgb3RoZXJgLgogICAqCiAgICogVGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIGlzIGluZGVwZW5kZW50IG9mIHRoZSBvcmRlciwKICAgKiBzbyBgeC5nY2QoeSlgIGlzICBhbHdheXMgdGhlIHNhbWUgYXMgYHkuZ2NkKHgpYC4KICAgKgogICAqIEZvciBhbnkgaW50ZWdlciBgeGAsIGB4LmdjZCh4KWAgaXMgYHguYWJzKClgLgogICAqCiAgICogSWYgYm90aCBgdGhpc2AgYW5kIGBvdGhlcmAgaXMgemVybywgdGhlIHJlc3VsdCBpcyBhbHNvIHplcm8uCiAgICovCiAgQmlnSW50IGdjZChCaWdJbnQgb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsZWFzdCBzaWduaWZpY2FudCBbd2lkdGhdIGJpdHMgb2YgdGhpcyBiaWcgaW50ZWdlciBhcyBhCiAgICogbm9uLW5lZ2F0aXZlIG51bWJlciAoaS5lLiB1bnNpZ25lZCByZXByZXNlbnRhdGlvbikuICBUaGUgcmV0dXJuZWQgdmFsdWUgaGFzCiAgICogemVyb3MgaW4gYWxsIGJpdCBwb3NpdGlvbnMgaGlnaGVyIHRoYW4gW3dpZHRoXS4KICAgKgogICAqIGBgYAogICAqIG5ldyBCaWdJbnQuZnJvbSgtMSkudG9VbnNpZ25lZCg1KSA9PSAzMSAgIC8vIDExMTExMTExICAtPiAgMDAwMTExMTEKICAgKiBgYGAKICAgKgogICAqIFRoaXMgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHRvIHNpbXVsYXRlIGFyaXRobWV0aWMgZnJvbSBsb3cgbGV2ZWwgbGFuZ3VhZ2VzLgogICAqIEZvciBleGFtcGxlLCB0byBpbmNyZW1lbnQgYW4gOCBiaXQgcXVhbnRpdHk6CiAgICoKICAgKiBgYGAKICAgKiBxID0gKHEgKyAxKS50b1Vuc2lnbmVkKDgpOwogICAqIGBgYAogICAqCiAgICogYHFgIHdpbGwgY291bnQgZnJvbSBgMGAgdXAgdG8gYDI1NWAgYW5kIHRoZW4gd3JhcCBhcm91bmQgdG8gYDBgLgogICAqCiAgICogSWYgdGhlIGlucHV0IGZpdHMgaW4gW3dpZHRoXSBiaXRzIHdpdGhvdXQgdHJ1bmNhdGlvbiwgdGhlIHJlc3VsdCBpcyB0aGUKICAgKiBzYW1lIGFzIHRoZSBpbnB1dC4gIFRoZSBtaW5pbXVtIHdpZHRoIG5lZWRlZCB0byBhdm9pZCB0cnVuY2F0aW9uIG9mIGB4YCBpcwogICAqIGdpdmVuIGJ5IGB4LmJpdExlbmd0aGAsIGkuZS4KICAgKgogICAqIGBgYAogICAqIHggPT0geC50b1Vuc2lnbmVkKHguYml0TGVuZ3RoKTsKICAgKiBgYGAKICAgKi8KICBCaWdJbnQgdG9VbnNpZ25lZChpbnQgd2lkdGgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsZWFzdCBzaWduaWZpY2FudCBbd2lkdGhdIGJpdHMgb2YgdGhpcyBpbnRlZ2VyLCBleHRlbmRpbmcgdGhlCiAgICogaGlnaGVzdCByZXRhaW5lZCBiaXQgdG8gdGhlIHNpZ24uICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRydW5jYXRpbmcgdGhlIHZhbHVlCiAgICogdG8gZml0IGluIFt3aWR0aF0gYml0cyB1c2luZyBhbiBzaWduZWQgMi1zIGNvbXBsZW1lbnQgcmVwcmVzZW50YXRpb24uICBUaGUKICAgKiByZXR1cm5lZCB2YWx1ZSBoYXMgdGhlIHNhbWUgYml0IHZhbHVlIGluIGFsbCBwb3NpdGlvbnMgaGlnaGVyIHRoYW4gW3dpZHRoXS4KICAgKgogICAqIGBgYAogICAqIHZhciBiaWcxNSA9IG5ldyBCaWdJbnQuZnJvbSgxNSk7CiAgICogdmFyIGJpZzE2ID0gbmV3IEJpZ0ludC5mcm9tKDE2KTsKICAgKiB2YXIgYmlnMjM5ID0gbmV3IEJpZ0ludC5mcm9tKDIzOSk7CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYtLXNpZ24gYml0LVYKICAgKiBiaWcxNi50b1NpZ25lZCg1KSA9PSAtYmlnMTYgICAvLyAgMDAwMTAwMDAgLT4gMTExMTAwMDAKICAgKiBiaWcyMzkudG9TaWduZWQoNSkgPT0gYmlnMTUgICAvLyAgMTExMDExMTEgLT4gMDAwMDExMTEKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgXgogICAqIGBgYAogICAqCiAgICogVGhpcyBvcGVyYXRpb24gY2FuIGJlIHVzZWQgdG8gc2ltdWxhdGUgYXJpdGhtZXRpYyBmcm9tIGxvdyBsZXZlbCBsYW5ndWFnZXMuCiAgICogRm9yIGV4YW1wbGUsIHRvIGluY3JlbWVudCBhbiA4IGJpdCBzaWduZWQgcXVhbnRpdHk6CiAgICoKICAgKiBgYGAKICAgKiBxID0gKHEgKyAxKS50b1NpZ25lZCg4KTsKICAgKiBgYGAKICAgKgogICAqIGBxYCB3aWxsIGNvdW50IGZyb20gYDBgIHVwIHRvIGAxMjdgLCB3cmFwIHRvIGAtMTI4YCBhbmQgY291bnQgYmFjayB1cCB0bwogICAqIGAxMjdgLgogICAqCiAgICogSWYgdGhlIGlucHV0IHZhbHVlIGZpdHMgaW4gW3dpZHRoXSBiaXRzIHdpdGhvdXQgdHJ1bmNhdGlvbiwgdGhlIHJlc3VsdCBpcwogICAqIHRoZSBzYW1lIGFzIHRoZSBpbnB1dC4gIFRoZSBtaW5pbXVtIHdpZHRoIG5lZWRlZCB0byBhdm9pZCB0cnVuY2F0aW9uIG9mIGB4YAogICAqIGlzIGB4LmJpdExlbmd0aCArIDFgLCBpLmUuCiAgICoKICAgKiBgYGAKICAgKiB4ID09IHgudG9TaWduZWQoeC5iaXRMZW5ndGggKyAxKTsKICAgKiBgYGAKICAgKi8KICBCaWdJbnQgdG9TaWduZWQoaW50IHdpZHRoKTsKCiAgLyoqCiAgICogV2hldGhlciB0aGlzIGJpZyBpbnRlZ2VyIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhbiBgaW50YCB3aXRob3V0IGxvc2luZwogICAqIHByZWNpc2lvbi4KICAgKgogICAqIFdhcm5pbmc6IHRoaXMgZnVuY3Rpb24gbWF5IGdpdmUgYSBkaWZmZXJlbnQgcmVzdWx0IG9uCiAgICogZGFydDJqcywgZGV2IGNvbXBpbGVyLCBhbmQgdGhlIFZNLCBkdWUgdG8gdGhlIGRpZmZlcmVuY2VzIGluCiAgICogaW50ZWdlciBwcmVjaXNpb24uCiAgICovCiAgYm9vbCBnZXQgaXNWYWxpZEludDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGlzIFtCaWdJbnRdIGFzIGFuIFtpbnRdLgogICAqCiAgICogSWYgdGhlIG51bWJlciBkb2VzIG5vdCBmaXQsIGNsYW1wcyB0byB0aGUgbWF4IChvciBtaW4pCiAgICogaW50ZWdlci4KICAgKgogICAqIFdhcm5pbmc6IHRoZSBjbGFtcGluZyBiZWhhdmVzIGRpZmZlcmVudGx5IG9uIGRhcnQyanMsIGRldgogICAqIGNvbXBpbGVyLCBhbmQgdGhlIFZNLCBkdWUgdG8gdGhlIGRpZmZlcmVuY2VzIGluIGludGVnZXIKICAgKiBwcmVjaXNpb24uCiAgICovCiAgaW50IHRvSW50KCk7CgogIC8qKgogICAqIFJldHVybnMgdGhpcyBbQmln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YW1lXS4KICAgKgogICAqIFRoZSBib29sZWFuIHZhbHVlIG9mIHRoZSBkZWNsYXJhdGlvbiBpcyBgdHJ1ZWAgaWYgdGhlIGRlY2xhcmVkIHZhbHVlIGlzCiAgICogdGhlIHN0cmluZyBgInRydWUiYCwgYW5kIGBmYWxzZWAgaWYgdGhlIHZhbHVlIGlzIGAiZmFsc2UiYC4KICAgKgogICAqIEluIGFsbCBvdGhlciBjYXNlcywgaW5jbHVkaW5nIHdoZW4gdGhlcmUgaXMgbm8gZGVjbGFyYXRpb24gZm9yIGBuYW1lYCwKICAgKiB0aGUgcmVzdWx0IGlzIHRoZSBbZGVmYXVsdFZhbHVlXS4KICAgKgogICAqIFRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMgd291bGQgYmUgcmV0dXJuZWQgYnk6CiAgICogYGBgZGFydAogICAqIChjb25zdCBTdHJpbmcuZnJvbUVudmlyb25tZW50KG5hbWUpID09ICJ0cnVlIikKICAgKiAgICAgPyB0cnVlCiAgICogICAgIDogKGNvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnQobmFtZSkgPT0gImZhbHNlIikKICAgKiAgICAgICAgID8gZmFsc2UKICAgKiAgICAgICAgIDogZGVmYXVsdFZhbHVlCiAgICogYGBgCiAgICogRXhhbXBsZToKICAgKiBgYGBkYXJ0CiAgICogY29uc3QgbG9nZ2luZ0ZsYWcgPSBjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgibG9nZ2luZyIpOwogICAqIGBgYAogICAqIElmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCB0cnV0aC1zdHJpbmcgdGhhbiBgInRydWUiYCwgeW91IGNhbiB1c2UgdGhlCiAgICogW1N0cmluZy5mcm9tRW52aXJvbm1lbnRdIGNvbnN0cnVjdG9yIGRpcmVjdGx5OgogICAqIGBgYGRhcnQKICAgKiBjb25zdCBpc0xvZ2dpbmdPbiA9IChjb25zdCBTdHJpbmcuZnJvbUVudmlyb25tZW50KCJsb2dnaW5nIikgPT0gIm9uIik7CiAgICogYGBgCiAgICovCiAgLy8gVGhlIC5mcm9tRW52aXJvbm1lbnQoKSBjb25zdHJ1Y3RvcnMgYXJlIHNwZWNpYWwgaW4gdGhhdCB3ZSBkbyBub3Qgd2FudAogIC8vIHVzZXJzIHRvIGNhbGwgdGhlbSB1c2luZyAibmV3Ii4gV2UgcHJvaGliaXQgdGhhdCBieSBnaXZpbmcgdGhlbSBib2RpZXMKICAvLyB0aGF0IHRocm93LCBldmVuIHRob3VnaCBjb25zdCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBhbGxvd2VkIHRvIGhhdmUgYm9kaWVzLgogIC8vIERpc2FibGUgdGhvc2Ugc3RhdGljIGVycm9ycy4KICAvL2lnbm9yZTogY29uc3RfY29uc3RydWN0b3Jfd2l0aF9ib2R5CiAgLy9pZ25vcmU6IGNvbnN0X2ZhY3RvcnkKICBleHRlcm5hbCBjb25zdCBmYWN0b3J5IGJvb2wuZnJvbUVudmlyb25tZW50KFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCBkZWZhdWx0VmFsdWUgPSBmYWxzZX0pOwoKICBleHRlcm5hbCBpbnQgZ2V0IGhhc2hDb2RlOwoKICAvLy8gVGhlIGxvZ2ljYWwgY29uanVuY3Rpb24gKCJhbmQiKSBvZiB0aGlzIGFuZCBbb3RoZXJdLgogIC8vLwogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBib3RoIHRoaXMgYW5kIFtvdGhlcl0gYXJlIGB0cnVlYCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLgogIC8vVE9ETyhscm4pOiBSZW1vdmUgImFzIGJvb2wiIGluIERhcnQgMi4KICBAU2luY2UoIjIuMSIpCiAgYm9vbCBvcGVyYXRvciAmKGJvb2wgb3RoZXIpID0+IChvdGhlciBhcyBib29sKSAmJiB0aGlzOwoKICAvLy8gVGhlIGxvZ2ljYWwgZGlzanVuY3Rpb24gKCJpbmNsdXNpdmUgb3IiKSBvZiB0aGlzIGFuZCBbb3RoZXJdLgogIC8vLwogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBlaXRoZXIgdGhpcyBvciBbb3RoZXJdIGlzIGB0cnVlYCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLgogIEBTaW5jZSgiMi4xIikKICBib29sIG9wZXJhdG9yIHwoYm9vbCBvdGhlcikgPT4gKG90aGVyIGFzIGJvb2wpIHx8IHRoaXM7CgogIC8vLyBUaGUgbG9naWNhbCBleGNsdXNpdmUgZGlzanVuY3Rpb24gKCJleGNsdXNpdmUgb3IiKSBvZiB0aGlzIGFuZCBbb3RoZXJdLgogIC8vLwogIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhbmQgW290aGVyXSBhcmUgbmVpdGhlciBib3RoIGB0cnVlYCBub3IgYm90aCBgZmFsc2VgLgogIEBTaW5jZSgiMi4xIikKICBib29sIG9wZXJhdG9yIF4oYm9vbCBvdGhlcikgPT4gIShvdGhlciBhcyBib29sKSA9PSB0aGlzOwoKICAvKioKICAgKiBSZXR1cm5zIGVpdGhlciBgInRydWUiYCBmb3IgYHRydWVgIGFuZCBgImZhbHNlImAgZm9yIGBmYWxzZWAuCiAgICovCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIHRoaXMgPyAidHJ1ZSIgOiAiZmFsc2UiOwogIH0KfQpRAE5OPAETAQROHANMCQQaDQZGBU1BBUwnBTUNNBA7FRwJDg1ACVA0DUwJBkxMUCIoGjskAR0BOwZRKxA6AUQGURA6AU4GURA7AQZDBhYkBAIBE2RhcnQ6Y29yZS9ib29sLmRhcnQvb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9ib29sX3BhdGNoLmRhcnSCDC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKQHBhdGNoCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgYm9vbCB7CiAgQHBhdGNoCiAgY29uc3QgZmFjdG9yeSBib29sLmZyb21FbnZpcm9ubWVudChTdHJpbmcgbmFtZSwge2Jvb2wgZGVmYXVsdFZhbHVlOiBmYWxzZX0pCiAgICAgIG5hdGl2ZSAiQm9vbF9mcm9tRW52aXJvbm1lbnQiOwoKICBAcGF0Y2gKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRoaXMgPyAxMjMxIDogMTIzNzsKCiAgaW50IGdldCBfaWRlbnRpdHlIYXNoQ29kZSA9PiB0aGlzID8gMTIzMSA6IDEyMzc7Cn0KFABOTjwBHgEHGg0JTiUBCSoBMwIBH2RhcnQ6Y29yZS1wYXRjaC9ib29sX3BhdGNoLmRhcnQvb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvZGF0ZV90aW1lLmRhcnTAAGvyLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIEFuIGluc3RhbnQgaW4gdGltZSwgc3VjaCBhcyBKdWx5IDIwLCAxOTY5LCA4OjE4cG0gR01ULgogKgogKiBEYXRlVGltZXMgY2FuIHJlcHJlc2VudCB0aW1lIHZhbHVlcyB0aGF0IGFyZSBhdCBhIGRpc3RhbmNlIG9mIGF0IG1vc3QKICogMTAwLDAwMCwwMDAgZGF5cyBmcm9tIGVwb2NoICgxOTcwLTAxLTAxIFVUQyk6IC0yNzE4MjEtMDQtMjAgdG8gMjc1NzYwLTA5LTEzLgogKgogKiBDcmVhdGUgYSBEYXRlVGltZSBvYmplY3QgYnkgdXNpbmcgb25lIG9mIHRoZSBjb25zdHJ1Y3RvcnMKICogb3IgYnkgcGFyc2luZyBhIGNvcnJlY3RseSBmb3JtYXR0ZWQgc3RyaW5nLAogKiB3aGljaCBjb21wbGllcyB3aXRoIGEgc3Vic2V0IG9mIElTTyA4NjAxLgogKiBOb3RlIHRoYXQgaG91cnMgYXJlIHNwZWNpZmllZCBiZXR3ZWVuIDAgYW5kIDIzLAogKiBhcyBpbiBhIDI0LWhvdXIgY2xvY2suCiAqIEZvciBleGFtcGxlOgogKgogKiBgYGAKICogdmFyIG5vdyA9IG5ldyBEYXRlVGltZS5ub3coKTsKICogdmFyIGJlcmxpbldhbGxGZWxsID0gbmV3IERhdGVUaW1lLnV0YygxOTg5LCAxMSwgOSk7CiAqIHZhciBtb29uTGFuZGluZyA9IERhdGVUaW1lLnBhcnNlKCIxOTY5LTA3LTIwIDIwOjE4OjA0WiIpOyAgLy8gODoxOHBtCiAqIGBgYAogKgogKiBBIERhdGVUaW1lIG9iamVjdCBpcyBhbmNob3JlZCBlaXRoZXIgaW4gdGhlIFVUQyB0aW1lIHpvbmUKICogb3IgaW4gdGhlIGxvY2FsIHRpbWUgem9uZSBvZiB0aGUgY3VycmVudCBjb21wdXRlcgogKiB3aGVuIHRoZSBvYmplY3QgaXMgY3JlYXRlZC4KICoKICogT25jZSBjcmVhdGVkLCBuZWl0aGVyIHRoZSB2YWx1ZSBub3IgdGhlIHRpbWUgem9uZQogKiBvZiBhIERhdGVUaW1lIG9iamVjdCBtYXkgYmUgY2hhbmdlZC4KICoKICogWW91IGNhbiB1c2UgcHJvcGVydGllcyB0byBnZXQKICogdGhlIGluZGl2aWR1YWwgdW5pdHMgb2YgYSBEYXRlVGltZSBvYmplY3QuCiAqCiAqIGBgYAogKiBhc3NlcnQoYmVybGluV2FsbEZlbGwubW9udGggPT0gMTEpOwogKiBhc3NlcnQobW9vbkxhbmRpbmcuaG91ciA9PSAyMCk7CiAqIGBgYAogKgogKiBGb3IgY29udmVuaWVuY2UgYW5kIHJlYWRhYmlsaXR5LAogKiB0aGUgRGF0ZVRpbWUgY2xhc3MgcHJvdmlkZXMgYSBjb25zdGFudCBmb3IgZWFjaCBkYXkgYW5kIG1vbnRoCiAqIG5hbWUgLSBmb3IgZXhhbXBsZSwgW2F1Z3VzdF0gYW5kIFtmcmlkYXldLgogKiBZb3UgY2FuIHVzZSB0aGVzZSBjb25zdGFudHMgdG8gaW1wcm92ZSBjb2RlIHJlYWRhYmlsaXR5OgogKgogKiBgYGAKICogdmFyIGJlcmxpbldhbGxGZWxsID0gbmV3IERhdGVUaW1lLnV0YygxOTg5LCBEYXRlVGltZS5ub3ZlbWJlciwgOSk7CiAqIGFzc2VydChiZXJsaW5XYWxsRmVsbC53ZWVrZGF5ID09IERhdGVUaW1lLnRodXJzZGF5KTsKICogYGBgCiAqCiAqIERheSBhbmQgbW9udGggdmFsdWVzIGJlZ2luIGF0IDEsIGFuZCB0aGUgd2VlayBzdGFydHMgb24gTW9uZGF5LgogKiBUaGF0IGlzLCB0aGUgY29uc3RhbnRzIFtqYW51YXJ5XSBhbmQgW21vbmRheV0gYXJlIGJvdGggMS4KICoKICogIyMgV29ya2luZyB3aXRoIFVUQyBhbmQgbG9jYWwgdGltZQogKgogKiBBIERhdGVUaW1lIG9iamVjdCBpcyBpbiB0aGUgbG9jYWwgdGltZSB6b25lCiAqIHVubGVzcyBleHBsaWNpdGx5IGNyZWF0ZWQgaW4gdGhlIFVUQyB0aW1lIHpvbmUuCiAqCiAqIGBgYAogKiB2YXIgZERheSA9IG5ldyBEYXRlVGltZS51dGMoMTk0NCwgNiwgNik7CiAqIGBgYAogKgogKiBVc2UgW2lzVXRjXSB0byBkZXRlcm1pbmUgd2hldGhlciBhIERhdGVUaW1lIG9iamVjdCBpcyBiYXNlZCBpbiBVVEMuCiAqIFVzZSB0aGUgbWV0aG9kcyBbdG9Mb2NhbF0gYW5kIFt0b1V0Y10KICogdG8gZ2V0IHRoZSBlcXVpdmFsZW50IGRhdGUvdGltZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIG90aGVyIHRpbWUgem9uZS4KICogVXNlIFt0aW1lWm9uZU5hbWVdIHRvIGdldCBhbiBhYmJyZXZpYXRlZCBuYW1lIG9mIHRoZSB0aW1lIHpvbmUKICogZm9yIHRoZSBEYXRlVGltZSBvYmplY3QuCiAqIFRvIGZpbmQgdGhlIGRpZmZlcmVuY2UKICogYmV0d2VlbiBVVEMgYW5kIHRoZSB0aW1lIHpvbmUgb2YgYSBEYXRlVGltZSBvYmplY3QKICogY2FsbCBbdGltZVpvbmVPZmZzZXRdLgogKgogKiAjIyBDb21wYXJpbmcgRGF0ZVRpbWUgb2JqZWN0cwogKgogKiBUaGUgRGF0ZVRpbWUgY2xhc3MgY29udGFpbnMgc2V2ZXJhbCBoYW5keSBtZXRob2RzLAogKiBzdWNoIGFzIFtpc0FmdGVyXSwgW2lzQmVmb3JlXSwgYW5kIFtpc0F0U2FtZU1vbWVudEFzXSwKICogZm9yIGNvbXBhcmluZyBEYXRlVGltZSBvYmplY3RzLgogKgogKiBgYGAKICogYXNzZXJ0KGJlcmxpbldhbGxGZWxsLmlzQWZ0ZXIobW9vbkxhbmRpbmcpID09IHRydWUpOwogKiBhc3NlcnQoYmVybGluV2FsbEZlbGwuaXNCZWZvcmUobW9vbkxhbmRpbmcpID09IGZhbHNlKTsKICogYGBgCiAqCiAqICMjIFVzaW5nIERhdGVUaW1lIHdpdGggRHVyYXRpb24KICoKICogVXNlIHRoZSBbYWRkXSBhbmQgW3N1YnRyYWN0XSBtZXRob2RzIHdpdGggYSBbRHVyYXRpb25dIG9iamVjdAogKiB0byBjcmVhdGUgYSBuZXcgRGF0ZVRpbWUgb2JqZWN0IGJhc2VkIG9uIGFub3RoZXIuCiAqIEZvciBleGFtcGxlLCB0byBmaW5kIHRoZSBkYXRlIHRoYXQgaXMgc2l4dHkgZGF5cyAoMjQgKiA2MCBob3VycykgYWZ0ZXIgdG9kYXksCiAqIHdyaXRlOgogKgogKiBgYGAKICogdmFyIG5vdyA9IG5ldyBEYXRlVGltZS5ub3coKTsKICogdmFyIHNpeHR5RGF5c0Zyb21Ob3cgPSBub3cuYWRkKG5ldyBEdXJhdGlvbihkYXlzOiA2MCkpOwogKiBgYGAKICoKICogVG8gZmluZCBvdXQgaG93IG11Y2ggdGltZSBpcyBiZXR3ZWVuIHR3byBEYXRlVGltZSBvYmplY3RzIHVzZQogKiBbZGlmZmVyZW5jZV0sIHdoaWNoIHJldHVybnMgYSBbRHVyYXRpb25dIG9iamVjdDoKICoKICogYGBgCiAqIHZhciBkaWZmZXJlbmNlID0gYmVybGluV2FsbEZlbGwuZGlmZmVyZW5jZShtb29uTGFuZGluZyk7CiAqIGFzc2VydChkaWZmZXJlbmNlLmluRGF5cyA9PSA3NDE2KTsKICogYGBgCiAqCiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGRhdGVzIGluIGRpZmZlcmVudCB0aW1lIHpvbmVzCiAqIGlzIGp1c3QgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyBiZXR3ZWVuIHRoZSB0d28gcG9pbnRzIGluIHRpbWUuCiAqIEl0IGRvZXNuJ3QgdGFrZSBjYWxlbmRhciBkYXlzIGludG8gYWNjb3VudC4KICogVGhhdCBtZWFucyB0aGF0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG1pZG5pZ2h0cyBpbiBsb2NhbCB0aW1lIG1heSBiZQogKiBsZXNzIHRoYW4gMjQgaG91cnMgdGltZXMgdGhlIG51bWJlciBvZiBkYXlzIGJldHdlZW4gdGhlbSwKICogaWYgdGhlcmUgaXMgYSBkYXlsaWdodCBzYXZpbmcgY2hhbmdlIGluIGJldHdlZW4uCiAqIElmIHRoZSBkaWZmZXJlbmNlIGFib3ZlIGlzIGNhbGN1bGF0ZWQgdXNpbmcgQXVzdHJhbGlhbiBsb2NhbCB0aW1lLCB0aGUKICogZGlmZmVyZW5jZSBpcyA3NDE1IGRheXMgYW5kIDIzIGhvdXJzLCB3aGljaCBpcyBvbmx5IDc0MTUgd2hvbGUgZGF5cyBhcwogKiByZXBvcnRlZCBieSBgaW5EYXlzYC4KICoKICogIyMgT3RoZXIgcmVzb3VyY2VzCiAqCiAqIFNlZSBbRHVyYXRpb25dIHRvIHJlcHJlc2VudCBhIHNwYW4gb2YgdGltZS4KICogU2VlIFtTdG9wd2F0Y2hdIHRvIG1lYXN1cmUgdGltZXNwYW5zLgogKgogKiBUaGUgRGF0ZVRpbWUgY2xhc3MgZG9lcyBub3QgcHJvdmlkZSBpbnRlcm5hdGlvbmFsaXphdGlvbi4KICogVG8gaW50ZXJuYXRpb25hbGl6ZSB5b3VyIGNvZGUsIHVzZQogKiB0aGUgW2ludGxdKGh0dHBzOi8vcHViLmRhcnRsYW5nLm9yZy9wYWNrYWdlcy9pbnRsKSBwYWNrYWdlLgogKgogKi8KY2xhc3MgRGF0ZVRpbWUgaW1wbGVtZW50cyBDb21wYXJhYmxlPERhdGVUaW1lPiB7CiAgLy8gV2Vla2RheSBjb25zdGFudHMgdGhhdCBhcmUgcmV0dXJuZWQgYnkgW3dlZWtkYXldIG1ldGhvZDoKICBzdGF0aWMgY29uc3QgaW50IG1vbmRheSA9IDE7CiAgc3RhdGljIGNvbnN0IGludCB0dWVzZGF5ID0gMjsKICBzdGF0aWMgY29uc3QgaW50IHdlZG5lc2RheSA9IDM7CiAgc3RhdGljIGNvbnN0IGludCB0aHVyc2RheSA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBmcmlkYXkgPSA1OwogIHN0YXRpYyBjb25zdCBpbnQgc2F0dXJkYXkgPSA2OwogIHN0YXRpYyBjb25zdCBpbnQgc3VuZGF5ID0gNzsKICBzdGF0aWMgY29uc3QgaW50IGRheXNQZXJXZWVrID0gNzsKCiAgLy8gTW9udGggY29uc3RhbnRzIHRoYXQgYXJlIHJldHVybmVkIGJ5IHRoZSBbbW9udGhdIGdldHRlci4KICBzdGF0aWMgY29uc3QgaW50IGphbnVhcnkgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgZmVicnVhcnkgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgbWFyY2ggPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgYXByaWwgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgbWF5ID0gNTsKICBzdGF0aWMgY29uc3QgaW50IGp1bmUgPSA2OwogIHN0YXRpYyBjb25zdCBpbnQganVseSA9IDc7CiAgc3RhdGljIGNvbnN0IGludCBhdWd1c3QgPSA4OwogIHN0YXRpYyBjb25zdCBpbnQgc2VwdGVtYmVyID0gOTsKICBzdGF0aWMgY29uc3QgaW50IG9jdG9iZXIgPSAxMDsKICBzdGF0aWMgY29uc3QgaW50IG5vdmVtYmVyID0gMTE7CiAgc3RhdGljIGNvbnN0IGludCBkZWNlbWJlciA9IDEyOwogIHN0YXRpYyBjb25zdCBpbnQgbW9udGhzUGVyWWVhciA9IDEyOwoKICAvKioKICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBEYXRlVGltZS4KICAgKgogICAqIFRoZSBjb250ZW50IG9mIHRoaXMgZmllbGQgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiBPbiBKYXZhU2NyaXB0IGl0IGlzCiAgICogZXF1YWwgdG8gW21pbGxpc2Vjb25kc1NpbmNlRXBvY2hdLiBPbiB0aGUgVk0gaXQgaXMgZXF1YWwgdG8KICAgKiBbbWljcm9zZWNvbmRzU2luY2VFcG9jaF0uCiAgICovCiAgZmluYWwgaW50IF92YWx1ZTsKCiAgLyoqCiAgICogVHJ1ZSBpZiB0aGlzIFtEYXRlVGltZV0gaXMgc2V0IHRvIFVUQyB0aW1lLgogICAqCiAgICogYGBgCiAgICogdmFyIGREYXkgPSBuZXcgRGF0ZVRpbWUudXRjKDE5NDQsIDYsIDYpOwogICAqIGFzc2VydChkRGF5LmlzVXRjKTsKICAgKiBgYGAKICAgKgogICAqLwogIGZpbmFsIGJvb2wgaXNVdGM7CgogIC8qKgogICAqIENvbnN0cnVjdHMgYSBbRGF0ZVRpbWVdIGluc3RhbmNlIHNwZWNpZmllZCBpbiB0aGUgbG9jYWwgdGltZSB6b25lLgogICAqCiAgICogRm9yIGV4YW1wbGUsCiAgICogdG8gY3JlYXRlIGEgbmV3IERhdGVUaW1lIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIDd0aCBvZiBTZXB0ZW1iZXIgMjAxNywKICAgKiA1OjMwcG0KICAgKgogICAqIGBgYAogICAqIHZhciBkZW50aXN0QXBwb2ludG1lbnQgPSBuZXcgRGF0ZVRpbWUoMjAxNywgOSwgNywgMTcsIDMwKTsKICAgKiBgYGAKICAgKi8KICBEYXRlVGltZShpbnQgeWVhciwKICAgICAgW2ludCBtb250aCA9IDEsCiAgICAgIGludCBkYXkgPSAxLAogICAgICBpbnQgaG91ciA9IDAsCiAgICAgIGludCBtaW51dGUgPSAwLAogICAgICBpbnQgc2Vjb25kID0gMCwKICAgICAgaW50IG1pbGxpc2Vjb25kID0gMCwKICAgICAgaW50IG1pY3Jvc2Vjb25kID0gMF0pCiAgICAgIDogdGhpcy5faW50ZXJuYWwoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kLAogICAgICAgICAgICBtaWNyb3NlY29uZCwgZmFsc2UpOwoKICAvKioKICAgKiBDb25zdHJ1Y3RzIGEgW0RhdGVUaW1lXSBpbnN0YW5jZSBzcGVjaWZpZWQgaW4gdGhlIFVUQyB0aW1lIHpvbmUuCiAgICoKICAgKiBgYGAKICAgKiB2YXIgbW9vbkxhbmRpbmcgPSBuZXcgRGF0ZVRpbWUudXRjKDE5NjksIDcsIDIwLCAyMCwgMTgsIDA0KTsKICAgKiBgYGAKICAgKgogICAqIFdoZW4gZGVhbGluZyB3aXRoIGRhdGVzIG9yIGhpc3RvcmljIGV2ZW50cyBwcmVmZXIgdG8gdXNlIFVUQyBEYXRlVGltZXMsCiAgICogc2luY2UgdGhleSBhcmUgdW5hZmZlY3RlZCBieSBkYXlsaWdodC1zYXZpbmcgY2hhbmdlcyBhbmQgYXJlIHVuYWZmZWN0ZWQKICAgKiBieSB0aGUgbG9jYWwgdGltZXpvbmUuCiAgICovCiAgRGF0ZVRpbWUudXRjKGludCB5ZWFyLAogICAgICBbaW50IG1vbnRoID0gMSwKICAgICAgaW50IGRheSA9IDEsCiAgICAgIGludCBob3VyID0gMCwKICAgICAgaW50IG1pbnV0ZSA9IDAsCiAgICAgIGludCBzZWNvbmQgPSAwLAogICAgICBpbnQgbWlsbGlzZWNvbmQgPSAwLAogICAgICBpbnQgbWljcm9zZWNvbmQgPSAwXSkKICAgICAgOiB0aGlzLl9pbnRlcm5hbCh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQsCiAgICAgICAgICAgIG1pY3Jvc2Vjb25kLCB0cnVlKTsKCiAgLyoqCiAgICogQ29uc3RydWN0cyBhIFtEYXRlVGltZV0gaW5zdGFuY2Ugd2l0aCBjdXJyZW50IGRhdGUgYW5kIHRpbWUgaW4gdGhlCiAgICogbG9jYWwgdGltZSB6b25lLgogICAqCiAgICogYGBgCiAgICogdmFyIHRoaXNJbnN0YW50ID0gbmV3IERhdGVUaW1lLm5vdygpOwogICAqIGBgYAogICAqLwogIERhdGVUaW1lLm5vdygpIDogdGhpcy5fbm93KCk7CgogIC8qKgogICAqIENvbnN0cnVjdHMgYSBuZXcgW0RhdGVUaW1lXSBpbnN0YW5jZSBiYXNlZCBvbiBbZm9ybWF0dGVkU3RyaW5nXS4KICAgKgogICAqIFRoZSBbZm9ybWF0dGVkU3RyaW5nXSBtdXN0IG5vdCBiZSBgbnVsbGAuCiAgICogVGhyb3dzIGEgW0Zvcm1hdEV4Y2VwdGlvbl0gaWYgdGhlIGlucHV0IHN0cmluZyBjYW5ub3QgYmUgcGFyc2VkLgogICAqCiAgICogVGhlIGZ1bmN0aW9uIHBhcnNlcyBhIHN1YnNldCBvZiBJU08gODYwMQogICAqIHdoaWNoIGluY2x1ZGVzIHRoZSBzdWJzZXQgYWNjZXB0ZWQgYnkgUkZDIDMzMzkuCiAgICoKICAgKiBUaGUgYWNjZXB0ZWQgaW5wdXRzIGFyZSBjdXJyZW50bHk6CiAgICoKICAgKiAqIEEgZGF0ZTogQSBzaWduZWQgZm91ci10by1zaXggZGlnaXQgeWVhciwgdHdvIGRpZ2l0IG1vbnRoIGFuZAogICAqICAgdHdvIGRpZ2l0IGRheSwgb3B0aW9uYWxseSBzZXBhcmF0ZWQgYnkgYC1gIGNoYXJhY3RlcnMuCiAgICogICBFeGFtcGxlczogIjE5NzAwMTAxIiwgIi0wMDA0LTEyLTI0IiwgIjgxMDMwLTA0LTAxIi4KICAgKiAqIEFuIG9wdGlvbmFsIHRpbWUgcGFydCwgc2VwYXJhdGVkIGZyb20gdGhlIGRhdGUgYnkgZWl0aGVyIGBUYCBvciBhIHNwYWNlLgogICAqICAgVGhlIHRpbWUgcGFydCBpcyBhIHR3byBkaWdpdCBob3VyLAogICAqICAgdGhlbiBvcHRpb25hbGx5IGEgdHdvIGRpZ2l0IG1pbnV0ZXMgdmFsdWUsCiAgICogICB0aGVuIG9wdGlvbmFsbHkgYSB0d28gZGlnaXQgc2Vjb25kcyB2YWx1ZSwgYW5kCiAgICogICB0aGVuIG9wdGlvbmFsbHkgYSAnLicgb3IgJywnIGZvbGxvd2VkIGJ5IGEgb25lLXRvLXNpeCBkaWdpdCBzZWNvbmQgZnJhY3Rpb24uCiAgICogICBUaGUgbWludXRlcyBhbmQgc2Vjb25kcyBtYXkgYmUgc2VwYXJhdGVkIGZyb20gdGhlIHByZXZpb3VzIHBhcnRzIGJ5IGEKICAgKiAgICc6Jy4KICAgKiAgIEV4YW1wbGVzOiAiMTIiLCAiMTI6MzA6MjQuMTI0IiwgIjEyOjMwOjI0LDEyNCIsICIxMjMwMTAuNTAiLgogICAqICogQW4gb3B0aW9uYWwgdGltZS16b25lIG9mZnNldCBwYXJ0LAogICAqICAgcG9zc2libHkgc2VwYXJhdGVkIGZyb20gdGhlIHByZXZpb3VzIGJ5IGEgc3BhY2UuCiAgICogICBUaGUgdGltZSB6b25lIGlzIGVpdGhlciAneicgb3IgJ1onLCBvciBpdCBpcyBhIHNpZ25lZCB0d28gZGlnaXQgaG91cgogICAqICAgcGFydCBhbmQgYW4gb3B0aW9uYWwgdHdvIGRpZ2l0IG1pbnV0ZSBwYXJ0LiBUaGUgc2lnbiBtdXN0IGJlIGVpdGhlcgogICAqICAgIisiIG9yICItIiwgYW5kIGNhbiBub3QgYmUgb21pdHRlZC4KICAgKiAgIFRoZSBtaW51dGVzIG1heSBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUgaG91cnMgYnkgYSAnOicuCiAgICogICBFeGFtcGxlczogIloiLCAiLTEwIiwgIiswMTozMCIsICIrMTEzMCIuCiAgICoKICAgKiBUaGlzIGluY2x1ZGVzIHRoZSBvdXRwdXQgb2YgYm90aCBbdG9TdHJpbmddIGFuZCBbdG9Jc284NjAxU3RyaW5nXSwgd2hpY2gKICAgKiB3aWxsIGJlIHBhcnNlZCBiYWNrIGludG8gYSBgRGF0ZVRpbWVgIG9iamVjdCB3aXRoIHRoZSBzYW1lIHRpbWUgYXMgdGhlCiAgICogb3JpZ2luYWwuCiAgICoKICAgKiBUaGUgcmVzdWx0IGlzIGFsd2F5cyBpbiBlaXRoZXIgbG9jYWwgdGltZSBvciBVVEMuCiAgICogSWYgYSB0aW1lIHpvbmUgb2Zmc2V0IG90aGVyIHRoYW4gVVRDIGlzIHNwZWNpZmllZCwKICAgKiB0aGUgdGltZSBpcyBjb252ZXJ0ZWQgdG8gdGhlIGVxdWl2YWxlbnQgVVRDIHRpbWUuCiAgICoKICAgKiBFeGFtcGxlcyBvZiBhY2NlcHRlZCBzdHJpbmdzOgogICAqCiAgICogKiBgIjIwMTItMDItMjcgMTM6Mjc6MDAiYAogICAqICogYCIyMDEyLTAyLTI3IDEzOjI3OjAwLjEyMzQ1NnoiYAogICAqICogYCIyMDEyLTAyLTI3IDEzOjI3OjAwLDEyMzQ1NnoiYAogICAqICogYCIyMDEyMDIyNyAxMzoyNzowMCJgCiAgICogKiBgIjIwMTIwMjI3VDEzMjcwMCJgCiAgICogKiBgIjIwMTIwMjI3ImAKICAgKiAqIGAiKzIwMTIwMjI3ImAKICAgKiAqIGAiMjAxMi0wMi0yN1QxNFoiYAogICAqICogYCIyMDEyLTAyLTI3VDE0KzAwOjAwImAKICAgKiAqIGAiLTEyMzQ1MDEwMSAwMDowMDowMCBaImA6IGluIHRoZSB5ZWFyIC0xMjM0NS4KICAgKiAqIGAiMjAwMi0wMi0yN1QxNDowMDowMC0wNTAwImA6IFNhbWUgYXMgYCIyMDAyLTAyLTI3VDE5OjAwOjAwWiJgCiAgICovCiAgLy8gVE9ETyhscm4pOiByZXN0cmljdCBpbmNvcnJlY3QgdmFsdWVzIGxpa2UgIDIwMDMtMDItMjlUNTA6NzA6ODAuCiAgLy8gT3Igbm90LCB0aGF0IG1heSBiZSBhIGJyZWFraW5nIGNoYW5nZS4KICBzdGF0aWMgRGF0ZVRpbWUgcGFyc2UoU3RyaW5nIGZvcm1hdHRlZFN0cmluZykgewogICAgdmFyIHJlID0gX3BhcnNlRm9ybWF0OwogICAgTWF0Y2ggbWF0Y2ggPSByZS5maXJzdE1hdGNoKGZvcm1hdHRlZFN0cmluZyk7CiAgICBpZiAobWF0Y2ggIT0gbnVsbCkgewogICAgICBpbnQgcGFyc2VJbnRPclplcm8oU3RyaW5nIG1hdGNoZWQpIHsKICAgICAgICBpZiAobWF0Y2hlZCA9PSBudWxsKSByZXR1cm4gMDsKICAgICAgICByZXR1cm4gaW50LnBhcnNlKG1hdGNoZWQpOwogICAgICB9CgogICAgICAvLyBQYXJzZXMgZnJhY3Rpb25hbCBzZWNvbmQgZGlnaXRzIG9mICcuKFxkezEsNn0pJyBpbnRvIHRoZSBjb21iaW5lZAogICAgICAvLyBtaWNyb3NlY29uZHMuCiAgICAgIGludCBwYXJzZU1pbGxpQW5kTWljcm9zZWNvbmRzKFN0cmluZyBtYXRjaGVkKSB7CiAgICAgICAgaWYgKG1hdGNoZWQgPT0gbnVsbCkgcmV0dXJuIDA7CiAgICAgICAgaW50IGxlbmd0aCA9IG1hdGNoZWQubGVuZ3RoOwogICAgICAgIGFzc2VydChsZW5ndGggPj0gMSk7CiAgICAgICAgYXNzZXJ0KGxlbmd0aCA8PSA2KTsKCiAgICAgICAgaW50IHJlc3VsdCA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKICAgICAgICAgIHJlc3VsdCAqPSAxMDsKICAgICAgICAgIGlmIChpIDwgbWF0Y2hlZC5sZW5ndGgpIHsKICAgICAgICAgICAgcmVzdWx0ICs9IG1hdGNoZWQuY29kZVVuaXRBdChpKSBeIDB4MzA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KCiAgICAgIGludCB5ZWFycyA9IGludC5wYXJzZShtYXRjaFsxXSk7CiAgICAgIGludCBtb250aCA9IGludC5wYXJzZShtYXRjaFsyXSk7CiAgICAgIGludCBkYXkgPSBpbnQucGFyc2UobWF0Y2hbM10pOwogICAgICBpbnQgaG91ciA9IHBhcnNlSW50T3JaZXJvKG1hdGNoWzRdKTsKICAgICAgaW50IG1pbnV0ZSA9IHBhcnNlSW50T3JaZXJvKG1hdGNoWzVdKTsKICAgICAgaW50IHNlY29uZCA9IHBhcnNlSW50T3JaZXJvKG1hdGNoWzZdKTsKICAgICAgYm9vbCBhZGRPbmVNaWxsaXNlY29uZCA9IGZhbHNlOwogICAgICBpbnQgbWlsbGlBbmRNaWNyb3NlY29uZHMgPSBwYXJzZU1pbGxpQW5kTWljcm9zZWNvbmRzKG1hdGNoWzddKTsKICAgICAgaW50IG1pbGxpc2Vjb25kID0KICAgICAgICAgIG1pbGxpQW5kTWljcm9zZWNvbmRzIH4vIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1Blck1pbGxpc2Vjb25kOwogICAgICBpbnQgbWljcm9zZWNvbmQgPQogICAgICAgICAgbWlsbGlBbmRNaWNyb3NlY29uZHMucmVtYWluZGVyKER1cmF0aW9uLm1pY3Jvc2Vjb25kc1Blck1pbGxpc2Vjb25kKTsKICAgICAgYm9vbCBpc1V0YyA9IGZhbHNlOwogICAgICBpZiAobWF0Y2hbOF0gIT0gbnVsbCkgewogICAgICAgIC8vIHRpbWV6b25lIHBhcnQKICAgICAgICBpc1V0YyA9IHRydWU7CiAgICAgICAgaWYgKG1hdGNoWzldICE9IG51bGwpIHsKICAgICAgICAgIC8vIHRpbWV6b25lIG90aGVyIHRoYW4gJ1onIGFuZCAneicuCiAgICAgICAgICBpbnQgc2lnbiA9IChtYXRjaFs5XSA9PSAnLScpID8gLTEgOiAxOwogICAgICAgICAgaW50IGhvdXJEaWZmZXJlbmNlID0gaW50LnBhcnNlKG1hdGNoWzEwXSk7CiAgICAgICAgICBpbnQgbWludXRlRGlmZmVyZW5jZSA9IHBhcnNlSW50T3JaZXJvKG1hdGNoWzExXSk7CiAgICAgICAgICBtaW51dGVEaWZmZXJlbmNlICs9IDYwICogaG91ckRpZmZlcmVuY2U7CiAgICAgICAgICBtaW51dGUgLT0gc2lnbiAqIG1pbnV0ZURpZmZlcmVuY2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIGludCB2YWx1ZSA9IF9icm9rZW5Eb3duRGF0ZVRvVmFsdWUoeWVhcnMsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwKICAgICAgICAgIHNlY29uZCwgbWlsbGlzZWNvbmQsIG1pY3Jvc2Vjb25kLCBpc1V0Yyk7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJUaW1lIG91dCBvZiByYW5nZSIsIGZvcm1hdHRlZFN0cmluZyk7CiAgICAgIH0KICAgICAgcmV0dXJuIERhdGVUaW1lLl93aXRoVmFsdWUodmFsdWUsIGlzVXRjOiBpc1V0Yyk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgZGF0ZSBmb3JtYXQiLCBmb3JtYXR0ZWRTdHJpbmcpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ29uc3RydWN0cyBhIG5ldyBbRGF0ZVRpbWVdIGluc3RhbmNlIGJhc2VkIG9uIFtmb3JtYXR0ZWRTdHJpbmddLgogICAqCiAgICogV29ya3MgbGlrZSBbcGFyc2VdIGV4Y2VwdCB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBgbnVsbGAKICAgKiB3aGVyZSBbcGFyc2VdIHdvdWxkIHRocm93IGEgW0Zvcm1hdEV4Y2VwdGlvbl0uCiAgICovCiAgc3RhdGljIERhdGVUaW1lIHRyeVBhcnNlKFN0cmluZyBmb3JtYXR0ZWRTdHJpbmcpIHsKICAgIC8vIFRPRE86IE9wdGltaXplIHRvIGF2b2lkIHRocm93aW5nLgogICAgdHJ5IHsKICAgICAgcmV0dXJuIHBhcnNlKGZvcm1hdHRlZFN0cmluZyk7CiAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgc3RhdGljIGNvbnN0IGludCBfbWF4TWlsbGlzZWNvbmRzU2luY2VFcG9jaCA9IDg2NDAwMDAwMDAwMDAwMDA7CgogIC8qKgogICAqIENvbnN0cnVjdHMgYSBuZXcgW0RhdGVUaW1lXSBpbnN0YW5jZQogICAqIHdpdGggdGhlIGdpdmVuIFttaWxsaXNlY29uZHNTaW5jZUVwb2NoXS4KICAgKgogICAqIElmIFtpc1V0Y10gaXMgZmFsc2UgdGhlbiB0aGUgZGF0ZSBpcyBpbiB0aGUgbG9jYWwgdGltZSB6b25lLgogICAqCiAgICogVGhlIGNvbnN0cnVjdGVkIFtEYXRlVGltZV0gcmVwcmVzZW50cwogICAqIDE5NzAtMDEtMDFUMDA6MDA6MDBaICsgW21pbGxpc2Vjb25kc1NpbmNlRXBvY2hdIG1zIGluIHRoZSBnaXZlbgogICAqIHRpbWUgem9uZSAobG9jYWwgb3IgVVRDKS4KICAgKi8KICBleHRlcm5hbCBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChpbnQgbWlsbGlzZWNvbmRzU2luY2VFcG9jaCwKICAgICAge2Jvb2wgaXNVdGMgPSBmYWxzZX0pOwoKICAvKioKICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFtEYXRlVGltZV0gaW5zdGFuY2UKICAgKiB3aXRoIHRoZSBnaXZlbiBbbWljcm9zZWNvbmRzU2luY2VFcG9jaF0uCiAgICoKICAgKiBJZiBbaXNVdGNdIGlzIGZhbHNlIHRoZW4gdGhlIGRhdGUgaXMgaW4gdGhlIGxvY2FsIHRpbWUgem9uZS4KICAgKgogICAqIFRoZSBjb25zdHJ1Y3RlZCBbRGF0ZVRpbWVdIHJlcHJlc2VudHMKICAgKiAxOTcwLTAxLTAxVDAwOjAwOjAwWiArIFttaWNyb3NlY29uZHNTaW5jZUVwb2NoXSB1cyBpbiB0aGUgZ2l2ZW4KICAgKiB0aW1lIHpvbmUgKGxvY2FsIG9yIFVUQykuCiAgICovCiAgZXh0ZXJuYWwgRGF0ZVRpbWUuZnJvbU1pY3Jvc2Vjb25kc1NpbmNlRXBvY2goaW50IG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gsCiAgICAgIHtib29sIGlzVXRjID0gZmFsc2V9KTsKCiAgLyoqCiAgICogQ29uc3RydWN0cyBhIG5ldyBbRGF0ZVRpbWVdIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHZhbHVlLgogICAqCiAgICogSWYgW2lzVXRjXSBpcyBmYWxzZSB0aGVuIHRoZSBkYXRlIGlzIGluIHRoZSBsb2NhbCB0aW1lIHpvbmUuCiAgICovCiAgRGF0ZVRpbWUuX3dpdGhWYWx1ZSh0aGlzLl92YWx1ZSwge3RoaXMuaXNVdGN9KSB7CiAgICBpZiAobWlsbGlzZWNvbmRzU2luY2VFcG9jaC5hYnMoKSA+IF9tYXhNaWxsaXNlY29uZHNTaW5jZUVwb2NoIHx8CiAgICAgICAgKG1pbGxpc2Vjb25kc1NpbmNlRXBvY2guYWJzKCkgPT0gX21heE1pbGxpc2Vjb25kc1NpbmNlRXBvY2ggJiYKICAgICAgICAgICAgbWljcm9zZWNvbmQgIT0gMCkpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigKICAgICAgICAgICJEYXRlVGltZSBpcyBvdXRzaWRlIHZhbGlkIHJhbmdlOiAkbWlsbGlzZWNvbmRzU2luY2VFcG9jaCIpOwogICAgfQogICAgaWYgKGlzVXRjID09IG51bGwpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigiJ2lzVXRjJyBmbGFnIG1heSBub3QgYmUgJ251bGwnIik7CiAgICB9CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgW290aGVyXSBpcyBhIFtEYXRlVGltZV0gYXQgdGhlIHNhbWUgbW9tZW50IGFuZCBpbiB0aGUKICAgKiBzYW1lIHRpbWUgem9uZSAoVVRDIG9yIGxvY2FsKS4KICAgKgogICAqIGBgYAogICAqIHZhciBkRGF5VXRjID0gbmV3IERhdGVUaW1lLnV0YygxOTQ0LCA2LCA2KTsKICAgKiB2YXIgZERheUxvY2FsID0gZERheVV0Yy50b0xvY2FsKCk7CiAgICoKICAgKiAvLyBUaGVzZSB0d28gZGF0ZXMgYXJlIGF0IHRoZSBzYW1lIG1vbWVudCwgYnV0IGFyZSBpbiBkaWZmZXJlbnQgem9uZXMuCiAgICogYXNzZXJ0KGREYXlVdGMgIT0gZERheUxvY2FsKTsKICAgKiBgYGAKICAgKgogICAqIFNlZSBbaXNBdFNhbWVNb21lbnRBc10gZm9yIGEgY29tcGFyaXNvbiB0aGF0IGNvbXBhcmVzIG1vbWVudHMgaW4gdGltZQogICAqIGluZGVwZW5kZW50bHkgb2YgdGhlaXIgem9uZXMuCiAgICovCiAgZXh0ZXJuYWwgYm9vbCBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIFt0aGlzXSBvY2N1cnMgYmVmb3JlIFtvdGhlcl0uCiAgICoKICAgKiBUaGUgY29tcGFyaXNvbiBpcyBpbmRlcGVuZGVudAogICAqIG9mIHdoZXRoZXIgdGhlIHRpbWUgaXMgaW4gVVRDIG9yIGluIHRoZSBsb2NhbCB0aW1lIHpvbmUuCiAgICoKICAgKiBgYGAKICAgKiB2YXIgbm93ID0gbmV3IERhdGVUaW1lLm5vdygpOwogICAqIHZhciBlYXJsaWVyID0gbm93LnN1YnRyYWN0KGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDUpKTsKICAgKiBhc3NlcnQoZWFybGllci5pc0JlZm9yZShub3cpKTsKICAgKiBhc3NlcnQoIW5vdy5pc0JlZm9yZShub3cpKTsKICAgKgogICAqIC8vIFRoaXMgcmVsYXRpb24gc3RheXMgdGhlIHNhbWUsIGV2ZW4gd2hlbiBjaGFuZ2luZyB0aW1lem9uZXMuCiAgICogYXNzZXJ0KGVhcmxpZXIuaXNCZWZvcmUobm93LnRvVXRjKCkpKTsKICAgKiBhc3NlcnQoZWFybGllci50b1V0YygpLmlzQmVmb3JlKG5vdykpOwogICAqCiAgICogYXNzZXJ0KCFub3cudG9VdGMoKS5pc0JlZm9yZShub3cpKTsKICAgKiBhc3NlcnQoIW5vdy5pc0JlZm9yZShub3cudG9VdGMoKSkpOwogICAqIGBgYAogICAqLwogIGV4dGVybmFsIGJvb2wgaXNCZWZvcmUoRGF0ZVRpbWUgb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgW3RoaXNdIG9jY3VycyBhZnRlciBbb3RoZXJdLgogICAqCiAgICogVGhlIGNvbXBhcmlzb24gaXMgaW5kZXBlbmRlbnQKICAgKiBvZiB3aGV0aGVyIHRoZSB0aW1lIGlzIGluIFVUQyBvciBpbiB0aGUgbG9jYWwgdGltZSB6b25lLgogICAqCiAgICogYGBgCiAgICogdmFyIG5vdyA9IG5ldyBEYXRlVGltZS5ub3coKTsKICAgKiB2YXIgbGF0ZXIgPSBub3cuYWRkKGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDUpKTsKICAgKiBhc3NlcnQobGF0ZXIuaXNBZnRlcihub3cpKTsKICAgKiBhc3NlcnQoIW5vdy5pc0JlZm9yZShub3cpKTsKICAgKgogICAqIC8vIFRoaXMgcmVsYXRpb24gc3RheXMgdGhlIHNhbWUsIGV2ZW4gd2hlbiBjaGFuZ2luZyB0aW1lem9uZXMuCiAgICogYXNzZXJ0KGxhdGVyLmlzQWZ0ZXIobm93LnRvVXRjKCkpKTsKICAgKiBhc3NlcnQobGF0ZXIudG9VdGMoKS5pc0FmdGVyKG5vdykpOwogICAqCiAgICogYXNzZXJ0KCFub3cudG9VdGMoKS5pc0JlZm9yZShub3cpKTsKICAgKiBhc3NlcnQoIW5vdy5pc0JlZm9yZShub3cudG9VdGMoKSkpOwogICAqIGBgYAogICAqLwogIGV4dGVybmFsIGJvb2wgaXNBZnRlcihEYXRlVGltZSBvdGhlcik7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiBbdGhpc10gb2NjdXJzIGF0IHRoZSBzYW1lIG1vbWVudCBhcyBbb3RoZXJdLgogICAqCiAgICogVGhlIGNvbXBhcmlzb24gaXMgaW5kZXBlbmRlbnQgb2Ygd2hldGhlciB0aGUgdGltZSBpcyBpbiBVVEMgb3IgaW4gdGhlIGxvY2FsCiAgICogdGltZSB6b25lLgogICAqCiAgICogYGBgCiAgICogdmFyIG5vdyA9IG5ldyBEYXRlVGltZS5ub3coKTsKICAgKiB2YXIgbGF0ZXIgPSBub3cuYWRkKGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDUpKTsKICAgKiBhc3NlcnQoIWxhdGVyLmlzQXRTYW1lTW9tZW50QXMobm93KSk7CiAgICogYXNzZXJ0KG5vdy5pc0F0U2FtZU1vbWVudEFzKG5vdykpOwogICAqCiAgICogLy8gVGhpcyByZWxhdGlvbiBzdGF5cyB0aGUgc2FtZSwgZXZlbiB3aGVuIGNoYW5naW5nIHRpbWV6b25lcy4KICAgKiBhc3NlcnQoIWxhdGVyLmlzQXRTYW1lTW9tZW50QXMobm93LnRvVXRjKCkpKTsKICAgKiBhc3NlcnQoIWxhdGVyLnRvVXRjKCkuaXNBdFNhbWVNb21lbnRBcyhub3cpKTsKICAgKgogICAqIGFzc2VydChub3cudG9VdGMoKS5pc0F0U2FtZU1vbWVudEFzKG5vdykpOwogICAqIGFzc2VydChub3cuaXNBdFNhbWVNb21lbnRBcyhub3cudG9VdGMoKSkpOwogICAqIGBgYAogICAqLwogIGV4dGVybmFsIGJvb2wgaXNBdFNhbWVNb21lbnRBcyhEYXRlVGltZSBvdGhlcik7CgogIC8qKgogICAqIENvbXBhcmVzIHRoaXMgRGF0ZVRpbWUgb2JqZWN0IHRvIFtvdGhlcl0sCiAgICogcmV0dXJuaW5nIHplcm8gaWYgdGhlIHZhbHVlcyBhcmUgZXF1YWwuCiAgICoKICAgKiBSZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhpcyBEYXRlVGltZSBbaXNCZWZvcmVdIFtvdGhlcl0uIEl0IHJldHVybnMgMAogICAqIGlmIGl0IFtpc0F0U2FtZU1vbWVudEFzXSBbb3RoZXJdLCBhbmQgcmV0dXJucyBhIHBvc2l0aXZlIHZhbHVlIG90aGVyd2lzZQogICAqICh3aGVuIHRoaXMgW2lzQWZ0ZXJdIFtvdGhlcl0pLgogICAqLwogIGV4dGVybmFsIGludCBjb21wYXJlVG8oRGF0ZVRpbWUgb3RoZXIpOwoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IChfdmFsdWUgXiAoX3ZhbHVlID4+IDMwKSkgJiAweDNGRkZGRkZGOwoKICAvKioKICAgKiBSZXR1cm5zIHRoaXMgRGF0ZVRpbWUgdmFsdWUgaW4gdGhlIGxvY2FsIHRpbWUgem9uZS4KICAgKgogICAqIFJldHVybnMgW3RoaXNdIGlmIGl0IGlzIGFscmVhZHkgaW4gdGhlIGxvY2FsIHRpbWUgem9uZS4KICAgKiBPdGhlcndpc2UgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0bzoKICAgKgogICAqIGBgYAogICAqIG5ldyBEYXRlVGltZS5mcm9tTWljcm9zZWNvbmRzU2luY2VFcG9jaChtaWNyb3NlY29uZHNTaW5jZUVwb2NoLAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1V0YzogZmFsc2UpCiAgICogYGBgCiAgICovCiAgRGF0ZVRpbWUgdG9Mb2NhbCgpIHsKICAgIGlmIChpc1V0YykgewogICAgICByZXR1cm4gRGF0ZVRpbWUuX3dpdGhWYWx1ZShfdmFsdWUsIGlzVXRjOiBmYWxzZSk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhpcyBEYXRlVGltZSB2YWx1ZSBpbiB0aGUgVVRDIHRpbWUgem9uZS4KICAgKgogICAqIFJldHVybnMgW3RoaXNdIGlmIGl0IGlzIGFscmVhZHkgaW4gVVRDLgogICAqIE90aGVyd2lzZSB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvOgogICAqCiAgICogYGBgCiAgICogbmV3IERhdGVUaW1lLmZyb21NaWNyb3NlY29uZHNTaW5jZUVwb2NoKG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gsCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVXRjOiB0cnVlKQogICAqIGBgYAogICAqLwogIERhdGVUaW1lIHRvVXRjKCkgewogICAgaWYgKGlzVXRjKSByZXR1cm4gdGhpczsKICAgIHJldHVybiBEYXRlVGltZS5fd2l0aFZhbHVlKF92YWx1ZSwgaXNVdGM6IHRydWUpOwogIH0KCiAgc3RhdGljIFN0cmluZyBfZm91ckRpZ2l0cyhpbnQgbikgewogICAgaW50IGFic04gPSBuLmFicygpOwogICAgU3RyaW5nIHNpZ24gPSBuIDwgMCA/ICItIiA6ICIiOwogICAgaWYgKGFic04gPj0gMTAwMCkgcmV0dXJuICIkbiI7CiAgICBpZiAoYWJzTiA+PSAxMDApIHJldHVybiAiJHtzaWdufTAkYWJzTiI7CiAgICBpZiAoYWJzTiA+PSAxMCkgcmV0dXJuICIke3NpZ259MDAkYWJzTiI7CiAgICByZXR1cm4gIiR7c2lnbn0wMDAkYWJzTiI7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9zaXhEaWdpdHMoaW50IG4pIHsKICAgIGFzc2VydChuIDwgLTk5OTkgfHwgbiA+IDk5OTkpOwogICAgaW50IGFic04gPSBuLmFicygpOwogICAgU3RyaW5nIHNpZ24gPSBuIDwgMCA/ICItIiA6ICIrIjsKICAgIGlmIChhYnNOID49IDEwMDAwMCkgcmV0dXJuICIkc2lnbiRhYnNOIjsKICAgIHJldHVybiAiJHtzaWdufTAkYWJzTiI7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF90aHJlZURpZ2l0cyhpbnQgbikgewogICAgaWYgKG4gPj0gMTAwKSByZXR1cm4gIiR7bn0iOwogICAgaWYgKG4gPj0gMTApIHJldHVybiAiMCR7bn0iOwogICAgcmV0dXJuICIwMCR7bn0iOwogIH0KCiAgc3RhdGljIFN0cmluZyBfdHdvRGlnaXRzKGludCBuKSB7CiAgICBpZiAobiA+PSAxMCkgcmV0dXJuICIke259IjsKICAgIHJldHVybiAiMCR7bn0iOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgdGhpcyBpbnN0YW5jZS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgY29uc3RydWN0ZWQgZm9yIHRoZSB0aW1lIHpvbmUgb2YgdGhpcyBpbnN0YW5jZS4KICAgKiBUaGUgYHRvU3RyaW5nKClgIG1ldGhvZCBwcm92aWRlcyBhIHNpbXBseSBmb3JtYXR0ZWQgc3RyaW5nLgogICAqIEl0IGRvZXMgbm90IHN1cHBvcnQgaW50ZXJuYXRpb25hbGl6ZWQgc3RyaW5ncy4KICAgKiBVc2UgdGhlIFtpbnRsXShodHRwczovL3B1Yi5kYXJ0bGFuZy5vcmcvcGFja2FnZXMvaW50bCkgcGFja2FnZQogICAqIGF0IHRoZSBwdWIgc2hhcmVkIHBhY2thZ2VzIHJlcG8uCiAgICoKICAgKiBUaGUgcmVzdWx0aW5nIHN0cmluZyBjYW4gYmUgcGFyc2VkIGJhY2sgdXNpbmcgW3BhcnNlXS4KICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmcgeSA9IF9mb3VyRGlnaXRzKHllYXIpOwogICAgU3RyaW5nIG0gPSBfdHdvRGlnaXRzKG1vbnRoKTsKICAgIFN0cmluZyBkID0gX3R3b0RpZ2l0cyhkYXkpOwogICAgU3RyaW5nIGggPSBfdHdvRGlnaXRzKGhvdXIpOwogICAgU3RyaW5nIG1pbiA9IF90d29EaWdpdHMobWludXRlKTsKICAgIFN0cmluZyBzZWMgPSBfdHdvRGlnaXRzKHNlY29uZCk7CiAgICBTdHJpbmcgbXMgPSBfdGhyZWVEaWdpdHMobWlsbGlzZWNvbmQpOwogICAgU3RyaW5nIHVzID0gbWljcm9zZWNvbmQgPT0gMCA/ICIiIDogX3RocmVlRGlnaXRzKG1pY3Jvc2Vjb25kKTsKICAgIGlmIChpc1V0YykgewogICAgICByZXR1cm4gIiR5LSRtLSRkICRoOiRtaW46JHNlYy4kbXMke3VzfVoiOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICIkeS0kbS0kZCAkaDokbWluOiRzZWMuJG1zJHVzIjsKICAgIH0KICB9CgogIC8qKgogICAqIFJldHVybnMgYW4gSVNPLTg2MDEgZnVsbC1wcmVjaXNpb24gZXh0ZW5kZWQgZm9ybWF0IHJlcHJlc2VudGF0aW9uLgogICAqCiAgICogVGhlIGZvcm1hdCBpcyBgeXl5eS1NTS1kZFRISDptbTpzcy5tbW11dXVaYCBmb3IgVVRDIHRpbWUsIGFuZAogICAqIGB5eXl5LU1NLWRkVEhIOm1tOnNzLm1tbXV1dWAgKG5vIHRyYWlsaW5nICJaIikgZm9yIGxvY2FsL25vbi1VVEMgdGltZSwKICAgKiB3aGVyZToKICAgKgogICAqICogYHl5eXlgIGlzIGEsIHBvc3NpYmx5IG5lZ2F0aXZlLCBmb3VyIGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB5ZWFyLAogICAqICAgaWYgdGhlIHllYXIgaXMgaW4gdGhlIHJhbmdlIC05OTk5IHRvIDk5OTksCiAgICogICBvdGhlcndpc2UgaXQgaXMgYSBzaWduZWQgc2l4IGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB5ZWFyLgogICAqICogYE1NYCBpcyB0aGUgbW9udGggaW4gdGhlIHJhbmdlIDAxIHRvIDEyLAogICAqICogYGRkYCBpcyB0aGUgZGF5IG9mIHRoZSBtb250aCBpbiB0aGUgcmFuZ2UgMDEgdG8gMzEsCiAgICogKiBgSEhgIGFyZSBob3VycyBpbiB0aGUgcmFuZ2UgMDAgdG8gMjMsCiAgICogKiBgbW1gIGFyZSBtaW51dGVzIGluIHRoZSByYW5nZSAwMCB0byA1OSwKICAgKiAqIGBzc2AgYXJlIHNlY29uZHMgaW4gdGhlIHJhbmdlIDAwIHRvIDU5IChubyBsZWFwIHNlY29uZHMpLAogICAqICogYG1tbWAgYXJlIG1pbGxpc2Vjb25kcyBpbiB0aGUgcmFuZ2UgMDAwIHRvIDk5OSwgYW5kCiAgICogKiBgdXV1YCBhcmUgbWljcm9zZWNvbmRzIGluIHRoZSByYW5nZSAwMDEgdG8gOTk5LiBJZiBbbWljcm9zZWNvbmRdIGVxdWFscwogICAqICAgMCwgdGhlbiB0aGlzIHBhcnQgaXMgb21pdHRlZC4KICAgKgogICAqIFRoZSByZXN1bHRpbmcgc3RyaW5nIGNhbiBiZSBwYXJzZWQgYmFjayB1c2luZyBbcGFyc2VdLgogICAqLwogIFN0cmluZyB0b0lzbzg2MDFTdHJpbmcoKSB7CiAgICBTdHJpbmcgeSA9CiAgICAgICAgKHllYXIgPj0gLTk5OTkgJiYgeWVhciA8PSA5OTk5KSA/IF9mb3VyRGlnaXRzKHllYXIpIDogX3NpeERpZ2l0cyh5ZWFyKTsKICAgIFN0cmluZyBtID0gX3R3b0RpZ2l0cyhtb250aCk7CiAgICBTdHJpbmcgZCA9IF90d29EaWdpdHMoZGF5KTsKICAgIFN0cmluZyBoID0gX3R3b0RpZ2l0cyhob3VyKTsKICAgIFN0cmluZyBtaW4gPSBfdHdvRGlnaXRzKG1pbnV0ZSk7CiAgICBTdHJpbmcgc2VjID0gX3R3b0RpZ2l0cyhzZWNvbmQpOwogICAgU3RyaW5nIG1zID0gX3RocmVlRGlnaXRzKG1pbGxpc2Vjb25kKTsKICAgIFN0cmluZyB1cyA9IG1pY3Jvc2Vjb25kID09IDAgPyAiIiA6IF90aHJlZURpZ2l0cyhtaWNyb3NlY29uZCk7CiAgICBpZiAoaXNVdGMpIHsKICAgICAgcmV0dXJuICIkeS0kbS0ke2R9VCRoOiRtaW46JHNlYy4kbXMke3VzfVoiOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICIkeS0kbS0ke2R9VCRoOiRtaW46JHNlYy4kbXMkdXMiOwogICAgfQogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBbRGF0ZVRpbWVdIGluc3RhbmNlIHdpdGggW2R1cmF0aW9uXSBhZGRlZCB0byBbdGhpc10uCiAgICoKICAgKiBgYGAKICAgKiB2YXIgdG9kYXkgPSBuZXcgRGF0ZVRpbWUubm93KCk7CiAgICogdmFyIGZpZnR5RGF5c0Zyb21Ob3cgPSB0b2RheS5hZGQobmV3IER1cmF0aW9uKGRheXM6IDUwKSk7CiAgICogYGBgCiAgICoKICAgKiBOb3RpY2UgdGhhdCB0aGUgZHVyYXRpb24gYmVpbmcgYWRkZWQgaXMgYWN0dWFsbHkgNTAgKiAyNCAqIDYwICogNjAKICAgKiBzZWNvbmRzLiBJZiB0aGUgcmVzdWx0aW5nIGBEYXRlVGltZWAgaGFzIGEgZGlmZmVyZW50IGRheWxpZ2h0IHNhdmluZyBvZmZzZXQKICAgKiB0aGFuIGB0aGlzYCwgdGhlbiB0aGUgcmVzdWx0IHdvbid0IGhhdmUgdGhlIHNhbWUgdGltZS1vZi1kYXkgYXMgYHRoaXNgLCBhbmQKICAgKiBtYXkgbm90IGV2ZW4gaGl0IHRoZSBjYWxlbmRhciBkYXRlIDUwIGRheXMgbGF0ZXIuCiAgICoKICAgKiBCZSBjYXJlZnVsIHdoZW4gd29ya2luZyB3aXRoIGRhdGVzIGluIGxvY2FsIHRpbWUuCiAgICovCiAgZXh0ZXJuYWwgRGF0ZVRpbWUgYWRkKER1cmF0aW9uIGR1cmF0aW9uKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBbRGF0ZVRpbWVdIGluc3RhbmNlIHdpdGggW2R1cmF0aW9uXSBzdWJ0cmFjdGVkIGZyb20gW3RoaXNdLgogICAqCiAgICogYGBgCiAgICogRGF0ZVRpbWUgdG9kYXkgPSBuZXcgRGF0ZVRpbWUubm93KCk7CiAgICogRGF0ZVRpbWUgZmlmdHlEYXlzQWdvID0gdG9kYXkuc3VidHJhY3QobmV3IER1cmF0aW9uKGRheXM6IDUwKSk7CiAgICogYGBgCiAgICoKICAgKiBOb3RpY2UgdGhhdCB0aGUgZHVyYXRpb24gYmVpbmcgc3VidHJhY3RlZCBpcyBhY3R1YWxseSA1MCAqIDI0ICogNjAgKiA2MAogICAqIHNlY29uZHMuIElmIHRoZSByZXN1bHRpbmcgYERhdGVUaW1lYCBoYXMgYSBkaWZmZXJlbnQgZGF5bGlnaHQgc2F2aW5nIG9mZnNldAogICAqIHRoYW4gYHRoaXNgLCB0aGVuIHRoZSByZXN1bHQgd29uJ3QgaGF2ZSB0aGUgc2FtZSB0aW1lLW9mLWRheSBhcyBgdGhpc2AsIGFuZAogICAqIG1heSBub3QgZXZlbiBoaXQgdGhlIGNhbGVuZGFyIGRhdGUgNTAgZGF5cyBlYXJsaWVyLgogICAqCiAgICogQmUgY2FyZWZ1bCB3aGVuIHdvcmtpbmcgd2l0aCBkYXRlcyBpbiBsb2NhbCB0aW1lLgogICAqLwogIGV4dGVybmFsIERhdGVUaW1lIHN1YnRyYWN0KER1cmF0aW9uIGR1cmF0aW9uKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIFtEdXJhdGlvbl0gd2l0aCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFt0aGlzXSBhbmQgW290aGVyXS4KICAgKgogICAqIGBgYAogICAqIHZhciBiZXJsaW5XYWxsRmVsbCA9IG5ldyBEYXRlVGltZS51dGMoMTk4OSwgRGF0ZVRpbWUubm92ZW1iZXIsIDkpOwogICAqIHZhciBkRGF5ID0gbmV3IERhdGVUaW1lLnV0YygxOTQ0LCBEYXRlVGltZS5qdW5lLCA2KTsKICAgKgogICAqIER1cmF0aW9uIGRpZmZlcmVuY2UgPSBiZXJsaW5XYWxsRmVsbC5kaWZmZXJlbmNlKGREYXkpOwogICAqIGFzc2VydChkaWZmZXJlbmNlLmluRGF5cyA9PSAxNjU5Mik7CiAgICogYGBgCiAgICoKICAgKiBUaGUgZGlmZmVyZW5jZSBpcyBtZWFzdXJlZCBpbiBzZWNvbmRzIGFuZCBmcmFjdGlvbnMgb2Ygc2Vjb25kcy4KICAgKiBUaGUgZGlmZmVyZW5jZSBhYm92ZSBjb3VudHMgdGhlIG51bWJlciBvZiBmcmFjdGlvbmFsIHNlY29uZHMgYmV0d2VlbgogICAqIG1pZG5pZ2h0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhvc2UgZGF0ZXMuCiAgICogSWYgdGhlIGRhdGVzIGFib3ZlIGhhZCBiZWVuIGluIGxvY2FsIHRpbWUsIG5vdCBVVEMsIHRoZW4gdGhlIGRpZmZlcmVuY2UKICAgKiBiZXR3ZWVuIHR3byBtaWRuaWdodHMgbWF5IG5vdCBiZSBhIG11bHRpcGxlIG9mIDI0IGhvdXJzIGR1ZSB0byBkYXlsaWdodAogICAqIHNhdmluZyBkaWZmZXJlbmNlcy4KICAgKgogICAqIEZvciBleGFtcGxlLCBpbiBBdXN0cmFsaWEsIHNpbWlsYXIgY29kZSB1c2luZyBsb2NhbCB0aW1lIGluc3RlYWQgb2YgVVRDOgogICAqCiAgICogYGBgCiAgICogdmFyIGJlcmxpbldhbGxGZWxsID0gbmV3IERhdGVUaW1lKDE5ODksIERhdGVUaW1lLm5vdmVtYmVyLCA5KTsKICAgKiB2YXIgZERheSA9IG5ldyBEYXRlVGltZSgxOTQ0LCBEYXRlVGltZS5qdW5lLCA2KTsKICAgKiBEdXJhdGlvbiBkaWZmZXJlbmNlID0gYmVybGluV2FsbEZlbGwuZGlmZmVyZW5jZShkRGF5KTsKICAgKiBhc3NlcnQoZGlmZmVyZW5jZS5pbkRheXMgPT0gMTY1OTIpOwogICAqIGBgYAogICAqIHdpbGwgZmFpbCBiZWNhdXNlIHRoZSBkaWZmZXJlbmNlIGlzIGFjdHVhbGx5IDE2NTkxIGRheXMgYW5kIDIzIGhvdXJzLCBhbmQKICAgKiBbRHVyYXRpb24uaW5EYXlzXSBvbmx5IHJldHVybnMgdGhlIG51bWJlciBvZiB3aG9sZSBkYXlzLgogICAqLwogIGV4dGVybmFsIER1cmF0aW9uIGRpZmZlcmVuY2UoRGF0ZVRpbWUgb3RoZXIpOwoKICBleHRlcm5hbCBEYXRlVGltZS5faW50ZXJuYWwoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwgaW50IGhvdXIsCiAgICAgIGludCBtaW51dGUsIGludCBzZWNvbmQsIGludCBtaWxsaXNlY29uZCwgaW50IG1pY3Jvc2Vjb25kLCBib29sIGlzVXRjKTsKCiAgZXh0ZXJuYWwgRGF0ZVRpbWUuX25vdygpOwoKICAvLy8gUmV0dXJucyB0aGUgdGltZSBhcyB2YWx1ZSAobWlsbGlzZWNvbmQgb3IgbWljcm9zZWNvbmQgc2luY2UgZXBvY2gpLCBvcgogIC8vLyBudWxsIGlmIHRoZSB2YWx1ZXMgYXJlIG91dCBvZiByYW5nZS4KICBleHRlcm5hbCBzdGF0aWMgaW50IF9icm9rZW5Eb3duRGF0ZVRvVmFsdWUoCiAgICAgIGludCB5ZWFyLAogICAgICBpbnQgbW9udGgsCiAgICAgIGludCBkYXksCiAgICAgIGludCBob3VyLAogICAgICBpbnQgbWludXRlLAogICAgICBpbnQgc2Vjb25kLAogICAgICBpbnQgbWlsbGlzZWNvbmQsCiAgICAgIGludCBtaWNyb3NlY29uZCwKICAgICAgYm9vbCBpc1V0Yyk7CgogIC8qKgogICAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlCiAgICogdGhlICJVbml4IGVwb2NoIiAxOTcwLTAxLTAxVDAwOjAwOjAwWiAoVVRDKS4KICAgKgogICAqIFRoaXMgdmFsdWUgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHRpbWUgem9uZS4KICAgKgogICAqIFRoaXMgdmFsdWUgaXMgYXQgbW9zdAogICAqIDgsNjQwLDAwMCwwMDAsMDAwLDAwMG1zICgxMDAsMDAwLDAwMCBkYXlzKSBmcm9tIHRoZSBVbml4IGVwb2NoLgogICAqIEluIG90aGVyIHdvcmRzOiBgbWlsbGlzZWNvbmRzU2luY2VFcG9jaC5hYnMoKSA8PSA4NjQwMDAwMDAwMDAwMDAwYC4KICAgKi8KICBleHRlcm5hbCBpbnQgZ2V0IG1pbGxpc2Vjb25kc1NpbmNlRXBvY2g7CgogIC8qKgogICAqIFRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIHNpbmNlCiAgICogdGhlICJVbml4IGVwb2NoIiAxOTcwLTAxLTAxVDAwOjAwOjAwWiAoVVRDKS4KICAgKgogICAqIFRoaXMgdmFsdWUgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHRpbWUgem9uZS4KICAgKgogICAqIFRoaXMgdmFsdWUgaXMgYXQgbW9zdAogICAqIDgsNjQwLDAwMCwwMDAsMDAwLDAwMCwwMDB1cyAoMTAwLDAwMCwwMDAgZGF5cykgZnJvbSB0aGUgVW5peCBlcG9jaC4KICAgKiBJbiBvdGhlciB3b3JkczogYG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2guYWJzKCkgPD0gODY0MDAwMDAwMDAwMDAwMDAwMGAuCiAgICoKICAgKiBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBkb2VzIG5vdCBmaXQgaW50byA1MyBiaXRzICh0aGUgc2l6ZSBvZiBhIElFRUUgZG91YmxlKS4KICAgKiBBIEphdmFTY3JpcHQgbnVtYmVyIGlzIG5vdCBhYmxlIHRvIGhvbGQgdGhpcyB2YWx1ZS4KICAgKi8KICBleHRlcm5hbCBpbnQgZ2V0IG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2g7CgogIC8qKgogICAqIFRoZSB0aW1lIHpvbmUgbmFtZS4KICAgKgogICAqIFRoaXMgdmFsdWUgaXMgcHJvdmlkZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYW5kIG1heSBiZSBhbgogICAqIGFiYnJldmlhdGlvbiBvciBhIGZ1bGwgbmFtZS4KICAgKgogICAqIEluIHRoZSBicm93c2VyIG9yIG9uIFVuaXgtbGlrZSBzeXN0ZW1zIGNvbW1vbmx5IHJldHVybnMgYWJicmV2aWF0aW9ucywKICAgKiBzdWNoIGFzICJDRVQiIG9yICJDRVNUIi4gT24gV2luZG93cyByZXR1cm5zIHRoZSBmdWxsIG5hbWUsIGZvciBleGFtcGxlCiAgICogIlBhY2lmaWMgU3RhbmRhcmQgVGltZSIuCiAgICovCiAgZXh0ZXJuYWwgU3RyaW5nIGdldCB0aW1lWm9uZU5hbWU7CgogIC8qKgogICAqIFRoZSB0aW1lIHpvbmUgb2Zmc2V0LCB3aGljaAogICAqIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gbG9jYWwgdGltZSBhbmQgVVRDLgogICAqCiAgICogVGhlIG9mZnNldCBpcyBwb3NpdGl2ZSBmb3IgdGltZSB6b25lcyBlYXN0IG9mIFVUQy4KICAgKgogICAqIE5vdGUsIHRoYXQgSmF2YVNjcmlwdCwgUHl0aG9uIGFuZCBDIHJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFVUQyBhbmQKICAgKiBsb2NhbCB0aW1lLiBKYXZhLCBDIyBhbmQgUnVieSByZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBsb2NhbCB0aW1lIGFuZAogICAqIFVUQy4KICAgKi8KICBleHRlcm5hbCBEdXJhdGlvbiBnZXQgdGltZVpvbmVPZmZzZXQ7CgogIC8qKgogICAqIFRoZSB5ZWFyLgogICAqCiAgICogYGBgCiAgICogdmFyIG1vb25MYW5kaW5nID0gRGF0ZVRpbWUucGFyc2UoIjE5NjktMDctMjAgMjA6MTg6MDRaIik7CiAgICogYXNzZXJ0KG1vb25MYW5kaW5nLnllYXIgPT0gMTk2OSk7CiAgICogYGBgCiAgICovCiAgZXh0ZXJuYWwgaW50IGdldCB5ZWFyOwoKICAvKioKICAgKiBUaGUgbW9udGggWzEuLjEyXS4KICAgKgogICAqIGBgYAogICAqIHZhciBtb29uTGFuZGluZyA9IERhdGVUaW1lLnBhcnNlKCIxOTY5LTA3LTIwIDIwOjE4OjA0WiIpOwogICAqIGFzc2VydChtb29uTGFuZGluZy5tb250aCA9PSA3KTsKICAgKiBhc3NlcnQobW9vbkxhbmRpbmcubW9udGggPT0gRGF0ZVRpbWUuanVseSk7CiAgICogYGBgCiAgICovCiAgZXh0ZXJuYWwgaW50IGdldCBtb250aDsKCiAgLyoqCiAgICogVGhlIGRheSBvZiB0aGUgbW9udGggWzEuLjMxXS4KICAgKgogICAqIGBgYAogICAqIHZhciBtb29uTGFuZGluZyA9IERhdGVUaW1lLnBhcnNlKCIxOTY5LTA3LTIwIDIwOjE4OjA0WiIpOwogICAqIGFzc2VydChtb29uTGFuZGluZy5kYXkgPT0gMjApOwogICAqIGBgYAogICAqLwogIGV4dGVybmFsIGludCBnZXQgZGF5OwoKICAvKioKICAgKiBUaGUgaG91ciBvZiB0aGUgZGF5LCBleHByZXNzZWQgYXMgaW4gYSAyNC1ob3VyIGNsb2NrIFswLi4yM10uCiAgICoKICAgKiBgYGAKICAgKiB2YXIgbW9vbkxhbmRpbmcgPSBEYXRlVGltZS5wYXJzZSgiMTk2OS0wNy0yMCAyMDoxODowNFoiKTsKICAgKiBhc3NlcnQobW9vbkxhbmRpbmcuaG91ciA9PSAyMCk7CiAgICogYGBgCiAgICovCiAgZXh0ZXJuYWwgaW50IGdldCBob3VyOwoKICAvKioKICAgKiBUaGUgbWludXRlIFswLi4uNTldLgogICAqCiAgICogYGBgCiAgICogdmFyIG1vb25MYW5kaW5nID0gRGF0ZVRpbWUucGFyc2UoIjE5NjktMDctMjAgMjA6MTg6MDRaIik7CiAgICogYXNzZXJ0KG1vb25MYW5kaW5nLm1pbnV0ZSA9PSAxOCk7CiAgICogYGBgCiAgICovCiAgZXh0ZXJuYWwgaW50IGdldCBtaW51dGU7CgogIC8qKgogICAqIFRoZSBzZWNvbmQgWzAuLi41OV0uCiAgICoKICAgKiBgYGAKICAgKiB2YXIgbW9vbkxhbmRpbmcgPSBEYXRlVGltZS5wYXJzZSgiMTk2OS0wNy0yMCAyMDoxODowNFoiKTsKICAgKiBhc3NlcnQobW9vbkxhbmRpbmcuc2Vjb25kID09IDQpOwogICAqIGBgYAogICAqLwogIGV4dGVybmFsIGludCBnZXQgc2Vjb25kOwoKICAvKioKICAgKiBUaGUgbWlsbGlzZWNvbmQgWzAuLi45OTldLgogICAqCiAgICogYGBgCiAgICogdmFyIG1vb25MYW5kaW5nID0gRGF0ZVRpbWUucGFyc2UoIjE5NjktMDctMjAgMjA6MTg6MDRaIik7CiAgICogYXNzZXJ0KG1vb25MYW5kaW5nLm1pbGxpc2Vjb25kID09IDApOwogICAqIGBgYAogICAqLwogIGV4dGVybmFsIGludCBnZXQgbWlsbGlzZWNvbmQ7CgogIC8qKgogICAqIFRoZSBtaWNyb3NlY29uZCBbMC4uLjk5OV0uCiAgICoKICAgKiBgYGAKICAgKiB2YXIgbW9vbkxhbmRpbmcgPSBEYXRlVGltZS5wYXJzZSgiMTk2OS0wNy0yMCAyMDoxODowNFoiKTsKICAgKiBhc3NlcnQobW9vbkxhbmRpbmcubWljcm9zZWNvbmQgPT0gMCk7CiAgICogYGBgCiAgICovCiAgZXh0ZXJuYWwgaW50IGdldCBtaWNyb3NlY29uZDsKCiAgLyoqCiAgICogVGhlIGRheSBvZiB0aGUgd2VlayBbbW9uZGF5XS4uW3N1bmRheV0uCiAgICoKICAgKiBJbiBhY2NvcmRhbmNlIHdpdGggSVNPIDg2MDEKICAgKiBhIHdlZWsgc3RhcnRzIHdpdGggTW9uZGF5LCB3aGljaCBoYXMgdGhlIHZhbHVlIDEuCiAgICoKICAgKiBgYGAKICAgKiB2YXIgbW9vbkxhbmRpbmcgPSBEYXRlVGltZS5wYXJzZSgiMTk2OS0wNy0yMCAyMDoxODowNFoiKTsKICAgKiBhc3NlcnQobW9vbkxhbmRpbmcud2Vla2RheSA9PSA3KTsKICAgKiBhc3NlcnQobW9vbkxhbmRpbmcud2Vla2RheSA9PSBEYXRlVGltZS5zdW5kYXkpOwogICAqIGBgYAogICAqLwogIGV4dGVybmFsIGludCBnZXQgd2Vla2RheTsKCiAgLyoKICAgKiBkYXRlIDo6PSB5ZWFyZGF0ZSB0aW1lX29wdCB0aW1lem9uZV9vcHQKICAgKiB5ZWFyZGF0ZSA6Oj0geWVhciBjb2xvbl9vcHQgbW9udGggY29sb25fb3B0IGRheQogICAqIHllYXIgOjo9IHNpZ25fb3B0IGRpZ2l0ezQsNn0KICAgKiBjb2xvbl9vcHQgOjogPGVtcHR5PiB8ICc6JwogICAqIHNpZ24gOjo9ICcrJyB8ICctJwogICAqIHNpZ25fb3B0IDo6PSAgPGVtcHR5PiB8IHNpZ24KICAgKiBtb250aCA6Oj0gZGlnaXR7Mn0KICAgKiBkYXkgOjo9IGRpZ2l0ezJ9CiAgICogdGltZV9vcHQgOjo9IDxlbXB0eT4gfCAoJyAnIHwgJ1QnKSBob3VyIG1pbnV0ZXNfb3B0CiAgICogbWludXRlc19vcHQgOjo9IDxlbXB0eT4gfCBjb2xvbl9vcHQgZGlnaXR7Mn0gc2Vjb25kc19vcHQKICAgKiBzZWNvbmRzX29wdCA6Oj0gPGVtcHR5PiB8IGNvbG9uX29wdCBkaWdpdHsyfSBtaWxsaXNfb3B0CiAgICogbWljcm9zX29wdCA6Oj0gPGVtcHR5PiB8ICgnLicgfCAnLCcpIGRpZ2l0ezEsNn0KICAgKiB0aW1lem9uZV9vcHQgOjo9IDxlbXB0eT4gfCBzcGFjZV9vcHQgdGltZXpvbmUKICAgKiBzcGFjZV9vcHQgOjogJyAnIHwgPGVtcHR5PgogICAqIHRpbWV6b25lIDo6PSAneicgfCAnWicgfCBzaWduIGRpZ2l0ezJ9IHRpbWV6b25lbWluc19vcHQKICAgKiB0aW1lem9uZW1pbnNfb3B0IDo6PSA8ZW1wdHk+IHwgY29sb25fb3B0IGRpZ2l0ezJ9CiAgICovCiAgc3RhdGljIGZpbmFsIFJlZ0V4cCBfcGFyc2VGb3JtYXQgPSBSZWdFeHAoCiAgICAgIHInXihbKy1dP1xkezQsNn0pLT8oXGRcZCktPyhcZFxkKScgLy8gRGF5IHBhcnQuCiAgICAgIHInKD86WyBUXShcZFxkKSg/Ojo/KFxkXGQpKD86Oj8oXGRcZCkoPzpbLixdKFxkezEsNn0pKT8pPyk/JyAvLyBUaW1lIHBhcnQuCiAgICAgIHInKCA/W3paXXwgPyhbLStdKShcZFxkKSg/Ojo/KFxkXGQpKT8pPyk/JCcpOyAvLyBUaW1lem9uZSBwYXJ0Lgp9CoNrAE5OPAETAQQ6A0lQAz0vLTMaEAMHITdIBwM9NR8DNSgDIS4DBycjBwMkQS48AwdGOAcDQz0DJgMvMwMHLAcDRylLQhwaNhoDIQM2OiMDBzg6BwMjA0E1UQoDByE7BwNBNAMHPCYHAzxFL009NEpKGQMWAy8pAz0mPwMEMT4fICIhHyEfJAE+ICEeHhwdHR8iISIiJwEGIQVQQR8GFAEGMQUJLhkJBQYUAQZIBRJNDAUJQAkGFRYTFBYWGxxMIQEGRgUJQgkFTU0cBhkWExQWFhscTCABBkgWBQkrCQYgAQZGBS9GBS41BSgFRD47UCoyNlRNDEQqOExLKz0wBU5MDwU3ODcFIwUfJycdGxQVGh82RgZFLDIbMhkrJyMIAUsXNiclHR0BGCYYJDQMChcIAScnJSstLSZGGEcYTxoeGRYgLjE1PDMtCghKNBtFCDcNRQYEAQZGBUE0BjUpCiUbEwYEAUIBBiouBUIFK0UfBksdAQYqLgVCBStFHwZLHQEGQAVCBjNFRyEbRwYZPQYEAQZLJAUJMSgFTCMJBUsjBiwBBjMFIz4FCSM9JCEFRCwsBSkpCQYqAQYyBSM+BQkjNiEhBUQpKQUpKQkGKQEGQgVREAUJIzYrKAVEMzMFMDAJBjIBBi8tBVBOJAYqAT4BBjkFPS0FCUU7CQYXETgGEQQBBjcFLS0FCUU6CQYVHDUEASUYJCMtLR4EASQjGCUtHAQBJiEhFQQBJCAUBAEGOAVMQTREJgU8BhYiIiAhJSUrQxEwDS0GBAEGSAVDTAwFTjJGMDstL0E7TyUFPAYdD1AiICElJStDETINLwYEAQZIBQklPwkFSFFRNwU3BiwBBk8FCSpFCQVNUVE5BTcGMQEGSgUJSDoFPCkJBUVKL01NGQVOBQlENjwpCU8+BjABRk0BHAFNKy4QEQ8QEhIXFxMBBiYyBTEFG0VJBisBBiYyBTEFG0lMBVE5BisBBhkFQiIFTEweBiQBBiEzBTgFT1AKBigBBg8FCT8nCQYZAQYYBQk/JTEJBhoBBiMFCT8kCQYYAQZDBQk/JQkGGQEGGgUJPycJBhsBBhoFCT8mCQYbAQYgBQk/KwkGIAEGIAUJPysJBiABBi0FITcFCT8nNQkGHAEFLTUiIBgiGBY5Pj01MyA9NwYtNlFGAgEYZGFydDpjb3JlL2RhdGVfdGltZS5kYXJ0L29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvZGF0ZV9wYXRjaC5kYXJ0vfUvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCi8vIFZNIGltcGxlbWVudGF0aW9uIG9mIERhdGVUaW1lLgpAcGF0Y2gKY2xhc3MgRGF0ZVRpbWUgewogIC8vIE5hdGl2ZXMuCiAgLy8gVGhlIG5hdGl2ZXMgaGF2ZSBiZWVuIG1vdmVkIHVwIGhlcmUgdG8gd29yayBhcm91bmQgSXNzdWUgMTA0MDEuCiAgc3RhdGljIGludCBfZ2V0Q3VycmVudE1pY3JvcygpIG5hdGl2ZSAiRGF0ZVRpbWVfY3VycmVudFRpbWVNaWNyb3MiOwoKICBzdGF0aWMgU3RyaW5nIF90aW1lWm9uZU5hbWVGb3JDbGFtcGVkU2Vjb25kcyhpbnQgc2Vjb25kc1NpbmNlRXBvY2gpCiAgICAgIG5hdGl2ZSAiRGF0ZVRpbWVfdGltZVpvbmVOYW1lIjsKCiAgc3RhdGljIGludCBfdGltZVpvbmVPZmZzZXRJblNlY29uZHNGb3JDbGFtcGVkU2Vjb25kcyhpbnQgc2Vjb25kc1NpbmNlRXBvY2gpCiAgICAgIG5hdGl2ZSAiRGF0ZVRpbWVfdGltZVpvbmVPZmZzZXRJblNlY29uZHMiOwoKICBzdGF0aWMgaW50IF9sb2NhbFRpbWVab25lQWRqdXN0bWVudEluU2Vjb25kcygpCiAgICAgIG5hdGl2ZSAiRGF0ZVRpbWVfbG9jYWxUaW1lWm9uZUFkanVzdG1lbnRJblNlY29uZHMiOwoKICBzdGF0aWMgY29uc3QgX01JQ1JPU0VDT05EX0lOREVYID0gMDsKICBzdGF0aWMgY29uc3QgX01JTExJU0VDT05EX0lOREVYID0gMTsKICBzdGF0aWMgY29uc3QgX1NFQ09ORF9JTkRFWCA9IDI7CiAgc3RhdGljIGNvbnN0IF9NSU5VVEVfSU5ERVggPSAzOwogIHN0YXRpYyBjb25zdCBfSE9VUl9JTkRFWCA9IDQ7CiAgc3RhdGljIGNvbnN0IF9EQVlfSU5ERVggPSA1OwogIHN0YXRpYyBjb25zdCBfV0VFS0RBWV9JTkRFWCA9IDY7CiAgc3RhdGljIGNvbnN0IF9NT05USF9JTkRFWCA9IDc7CiAgc3RhdGljIGNvbnN0IF9ZRUFSX0lOREVYID0gODsKCiAgTGlzdCBfX3BhcnRzOwoKICBAcGF0Y2gKICBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChpbnQgbWlsbGlzZWNvbmRzU2luY2VFcG9jaCwKICAgICAge2Jvb2wgaXNVdGM6IGZhbHNlfSkKICAgICAgOiB0aGlzLl93aXRoVmFsdWUoCiAgICAgICAgICAgIG1pbGxpc2Vjb25kc1NpbmNlRXBvY2ggKiBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZCwKICAgICAgICAgICAgaXNVdGM6IGlzVXRjKTsKCiAgQHBhdGNoCiAgRGF0ZVRpbWUuZnJvbU1pY3Jvc2Vjb25kc1NpbmNlRXBvY2goaW50IG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gsCiAgICAgIHtib29sIGlzVXRjOiBmYWxzZX0pCiAgICAgIDogdGhpcy5fd2l0aFZhbHVlKG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gsIGlzVXRjOiBpc1V0Yyk7CgogIEBwYXRjaAogIERhdGVUaW1lLl9pbnRlcm5hbChpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBpbnQgaG91ciwgaW50IG1pbnV0ZSwKICAgICAgaW50IHNlY29uZCwgaW50IG1pbGxpc2Vjb25kLCBpbnQgbWljcm9zZWNvbmQsIGJvb2wgaXNVdGMpCiAgICAgIDogdGhpcy5pc1V0YyA9IGlzVXRjLAogICAgICAgIHRoaXMuX3ZhbHVlID0gX2Jyb2tlbkRvd25EYXRlVG9WYWx1ZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsCiAgICAgICAgICAgIHNlY29uZCwgbWlsbGlzZWNvbmQsIG1pY3Jvc2Vjb25kLCBpc1V0YykgewogICAgaWYgKF92YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgaWYgKGlzVXRjID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCk7CiAgfQoKICBAcGF0Y2gKICBEYXRlVGltZS5fbm93KCkKICAgICAgOiBpc1V0YyA9IGZhbHNlLAogICAgICAgIF92YWx1ZSA9IF9nZXRDdXJyZW50TWljcm9zKCk7CgogIEBwYXRjaAogIFN0cmluZyBnZXQgdGltZVpvbmVOYW1lIHsKICAgIGlmIChpc1V0YykgcmV0dXJuICJVVEMiOwogICAgcmV0dXJuIF90aW1lWm9uZU5hbWUobWljcm9zZWNvbmRzU2luY2VFcG9jaCk7CiAgfQoKICBAcGF0Y2gKICBEdXJhdGlvbiBnZXQgdGltZVpvbmVPZmZzZXQgewogICAgaWYgKGlzVXRjKSByZXR1cm4gbmV3IER1cmF0aW9uKCk7CiAgICBpbnQgb2Zmc2V0SW5TZWNvbmRzID0gX3RpbWVab25lT2Zmc2V0SW5TZWNvbmRzKG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gpOwogICAgcmV0dXJuIG5ldyBEdXJhdGlvbihzZWNvbmRzOiBvZmZzZXRJblNlY29uZHMpOwogIH0KCiAgQHBhdGNoCiAgYm9vbCBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSA9PgogICAgICBvdGhlciBpcyBEYXRlVGltZSAmJgogICAgICBfdmFsdWUgPT0gb3RoZXIubWljcm9zZWNvbmRzU2luY2VFcG9jaCAmJgogICAgICBpc1V0YyA9PSBvdGhlci5pc1V0YzsKCiAgQHBhdGNoCiAgYm9vbCBpc0JlZm9yZShEYXRlVGltZSBvdGhlcikgPT4gX3ZhbHVlIDwgb3RoZXIubWljcm9zZWNvbmRzU2luY2VFcG9jaDsKCiAgQHBhdGNoCiAgYm9vbCBpc0FmdGVyKERhdGVUaW1lIG90aGVyKSA9PiBfdmFsdWUgPiBvdGhlci5taWNyb3NlY29uZHNTaW5jZUVwb2NoOwoKICBAcGF0Y2gKICBib29sIGlzQXRTYW1lTW9tZW50QXMoRGF0ZVRpbWUgb3RoZXIpID0+CiAgICAgIF92YWx1ZSA9PSBvdGhlci5taWNyb3NlY29uZHNTaW5jZUVwb2NoOwoKICBAcGF0Y2gKICBpbnQgY29tcGFyZVRvKERhdGVUaW1lIG90aGVyKSA9PgogICAgICBfdmFsdWUuY29tcGFyZVRvKG90aGVyLm1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gpOwoKICAvKiogVGhlIGZpcnN0IGxpc3QgY29udGFpbnMgdGhlIGRheXMgdW50aWwgZWFjaCBtb250aCBpbiBub24tbGVhcCB5ZWFycy4gVGhlCiAgICAqIHNlY29uZCBsaXN0IGNvbnRhaW5zIHRoZSBkYXlzIGluIGxlYXAgeWVhcnMuICovCiAgc3RhdGljIGNvbnN0IExpc3Q8TGlzdDxpbnQ+PiBfREFZU19VTlRJTF9NT05USCA9IGNvbnN0IFsKICAgIGNvbnN0IFswLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNF0sCiAgICBjb25zdCBbMCwgMzEsIDYwLCA5MSwgMTIxLCAxNTIsIDE4MiwgMjEzLCAyNDQsIDI3NCwgMzA1LCAzMzVdCiAgXTsKCiAgc3RhdGljIExpc3QgX2NvbXB1dGVVcHBlclBhcnQoaW50IGxvY2FsTWljcm9zKSB7CiAgICBjb25zdCBpbnQgREFZU19JTl80X1lFQVJTID0gNCAqIDM2NSArIDE7CiAgICBjb25zdCBpbnQgREFZU19JTl8xMDBfWUVBUlMgPSAyNSAqIERBWVNfSU5fNF9ZRUFSUyAtIDE7CiAgICBjb25zdCBpbnQgREFZU19JTl80MDBfWUVBUlMgPSA0ICogREFZU19JTl8xMDBfWUVBUlMgKyAxOwogICAgY29uc3QgaW50IERBWVNfMTk3MF9UT18yMDAwID0gMzAgKiAzNjUgKyA3OwogICAgY29uc3QgaW50IERBWVNfT0ZGU0VUID0KICAgICAgICAxMDAwICogREFZU19JTl80MDBfWUVBUlMgKyA1ICogREFZU19JTl80MDBfWUVBUlMgLSBEQVlTXzE5NzBfVE9fMjAwMDsKICAgIGNvbnN0IGludCBZRUFSU19PRkZTRVQgPSA0MDAwMDA7CgogICAgaW50IHJlc3VsdFllYXIgPSAwOwogICAgaW50IHJlc3VsdE1vbnRoID0gMDsKICAgIGludCByZXN1bHREYXkgPSAwOwoKICAgIC8vIEFsd2F5cyByb3VuZCBkb3duLgogICAgZmluYWwgaW50IGRheXNTaW5jZTE5NzAgPQogICAgICAgIF9mbG9vcmVkRGl2aXNpb24obG9jYWxNaWNyb3MsIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1BlckRheSk7CiAgICBpbnQgZGF5cyA9IGRheXNTaW5jZTE5NzA7CiAgICBkYXlzICs9IERBWVNfT0ZGU0VUOwogICAgcmVzdWx0WWVhciA9IDQwMCAqIChkYXlzIH4vIERBWVNfSU5fNDAwX1lFQVJTKSAtIFlFQVJTX09GRlNFVDsKICAgIGRheXMgPSBkYXlzLnJlbWFpbmRlcihEQVlTX0lOXzQwMF9ZRUFSUyk7CiAgICBkYXlzLS07CiAgICBpbnQgeWQxID0gZGF5cyB+LyBEQVlTX0lOXzEwMF9ZRUFSUzsKICAgIGRheXMgPSBkYXlzLnJlbWFpbmRlcihEQVlTX0lOXzEwMF9ZRUFSUyk7CiAgICByZXN1bHRZZWFyICs9IDEwMCAqIHlkMTsKICAgIGRheXMrKzsKICAgIGludCB5ZDIgPSBkYXlzIH4vIERBWVNfSU5fNF9ZRUFSUzsKICAgIGRheXMgPSBkYXlzLnJlbWFpbmRlcihEQVlTX0lOXzRfWUVBUlMpOwogICAgcmVzdWx0WWVhciArPSA0ICogeWQyOwogICAgZGF5cy0tOwogICAgaW50IHlkMyA9IGRheXMgfi8gMzY1OwogICAgZGF5cyA9IGRheXMucmVtYWluZGVyKDM2NSk7CiAgICByZXN1bHRZZWFyICs9IHlkMzsKCiAgICBib29sIGlzTGVhcCA9ICh5ZDEgPT0gMCB8fCB5ZDIgIT0gMCkgJiYgeWQzID09IDA7CiAgICBpZiAoaXNMZWFwKSBkYXlzKys7CgogICAgTGlzdDxpbnQ+IGRheXNVbnRpbE1vbnRoID0gX0RBWVNfVU5USUxfTU9OVEhbaXNMZWFwID8gMSA6IDBdOwogICAgZm9yIChyZXN1bHRNb250aCA9IDEyOwogICAgICAgIGRheXNVbnRpbE1vbnRoW3Jlc3VsdE1vbnRoIC0gMV0gPiBkYXlzOwogICAgICAgIHJlc3VsdE1vbnRoLS0pIHsKICAgICAgLy8gRG8gbm90aGluZy4KICAgIH0KICAgIHJlc3VsdERheSA9IGRheXMgLSBkYXlzVW50aWxNb250aFtyZXN1bHRNb250aCAtIDFdICsgMTsKCiAgICBpbnQgcmVzdWx0TWljcm9zZWNvbmQgPSBsb2NhbE1pY3JvcyAlIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1Blck1pbGxpc2Vjb25kOwogICAgaW50IHJlc3VsdE1pbGxpc2Vjb25kID0KICAgICAgICBfZmxvb3JlZERpdmlzaW9uKGxvY2FsTWljcm9zLCBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZCkgJQogICAgICAgICAgICBEdXJhdGlvbi5taWxsaXNlY29uZHNQZXJTZWNvbmQ7CiAgICBpbnQgcmVzdWx0U2Vjb25kID0KICAgICAgICBfZmxvb3JlZERpdmlzaW9uKGxvY2FsTWljcm9zLCBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJTZWNvbmQpICUKICAgICAgICAgICAgRHVyYXRpb24uc2Vjb25kc1Blck1pbnV0ZTsKCiAgICBpbnQgcmVzdWx0TWludXRlID0KICAgICAgICBfZmxvb3JlZERpdmlzaW9uKGxvY2FsTWljcm9zLCBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJNaW51dGUpOwogICAgcmVzdWx0TWludXRlICU9IER1cmF0aW9uLm1pbnV0ZXNQZXJIb3VyOwoKICAgIGludCByZXN1bHRIb3VyID0KICAgICAgICBfZmxvb3JlZERpdmlzaW9uKGxvY2FsTWljcm9zLCBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJIb3VyKTsKICAgIHJlc3VsdEhvdXIgJT0gRHVyYXRpb24uaG91cnNQZXJEYXk7CgogICAgLy8gSW4gYWNjb3JkYW5jZSB3aXRoIElTTyA4NjAxIGEgd2VlawogICAgLy8gc3RhcnRzIHdpdGggTW9uZGF5LiBNb25kYXkgaGFzIHRoZSB2YWx1ZSAxIHVwIHRvIFN1bmRheSB3aXRoIDcuCiAgICAvLyAxOTcwLTEtMSB3YXMgYSBUaHVyc2RheS4KICAgIGludCByZXN1bHRXZWVrZGF5ID0gKChkYXlzU2luY2UxOTcwICsgRGF0ZVRpbWUudGh1cnNkYXkgLSBEYXRlVGltZS5tb25kYXkpICUKICAgICAgICAgICAgRGF0ZVRpbWUuZGF5c1BlcldlZWspICsKICAgICAgICBEYXRlVGltZS5tb25kYXk7CgogICAgTGlzdCBsaXN0ID0gbmV3IExpc3QoX1lFQVJfSU5ERVggKyAxKTsKICAgIGxpc3RbX01JQ1JPU0VDT05EX0lOREVYXSA9IHJlc3VsdE1pY3Jvc2Vjb25kOwogICAgbGlzdFtfTUlMTElTRUNPTkRfSU5ERVhdID0gcmVzdWx0TWlsbGlzZWNvbmQ7CiAgICBsaXN0W19TRUNPTkRfSU5ERVhdID0gcmVzdWx0U2Vjb25kOwogICAgbGlzdFtfTUlOVVRFX0lOREVYXSA9IHJlc3VsdE1pbnV0ZTsKICAgIGxpc3RbX0hPVVJfSU5ERVhdID0gcmVzdWx0SG91cjsKICAgIGxpc3RbX0RBWV9JTkRFWF0gPSByZXN1bHREYXk7CiAgICBsaXN0W19XRUVLREFZX0lOREVYXSA9IHJlc3VsdFdlZWtkYXk7CiAgICBsaXN0W19NT05USF9JTkRFWF0gPSByZXN1bHRNb250aDsKICAgIGxpc3RbX1lFQVJfSU5ERVhdID0gcmVzdWx0WWVhcjsKICAgIHJldHVybiBsaXN0OwogIH0KCiAgZ2V0IF9wYXJ0cyB7CiAgICBfX3BhcnRzID8/PSBfY29tcHV0ZVVwcGVyUGFydChfbG9jYWxEYXRlSW5VdGNNaWNyb3MpOwogICAgcmV0dXJuIF9fcGFydHM7CiAgfQoKICBAcGF0Y2gKICBEYXRlVGltZSBhZGQoRHVyYXRpb24gZHVyYXRpb24pIHsKICAgIHJldHVybiBuZXcgRGF0ZVRpbWUuX3dpdGhWYWx1ZShfdmFsdWUgKyBkdXJhdGlvbi5pbk1pY3Jvc2Vjb25kcywKICAgICAgICBpc1V0YzogaXNVdGMpOwogIH0KCiAgQHBhdGNoCiAgRGF0ZVRpbWUgc3VidHJhY3QoRHVyYXRpb24gZHVyYXRpb24pIHsKICAgIHJldHVybiBuZXcgRGF0ZVRpbWUuX3dpdGhWYWx1ZShfdmFsdWUgLSBkdXJhdGlvbi5pbk1pY3Jvc2Vjb25kcywKICAgICAgICBpc1V0YzogaXNVdGMpOwogIH0KCiAgQHBhdGNoCiAgRHVyYXRpb24gZGlmZmVyZW5jZShEYXRlVGltZSBvdGhlcikgewogICAgcmV0dXJuIG5ldyBEdXJhdGlvbihtaWNyb3NlY29uZHM6IF92YWx1ZSAtIG90aGVyLl92YWx1ZSk7CiAgfQoKICBAcGF0Y2gKICBpbnQgZ2V0IG1pbGxpc2Vjb25kc1NpbmNlRXBvY2ggPT4KICAgICAgX3ZhbHVlIH4vIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1Blck1pbGxpc2Vjb25kOwoKICBAcGF0Y2gKICBpbnQgZ2V0IG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2ggPT4gX3ZhbHVlOwoKICBAcGF0Y2gKICBpbnQgZ2V0IG1pY3Jvc2Vjb25kID0+IF9wYXJ0c1tfTUlDUk9TRUNPTkRfSU5ERVhdOwoKICBAcGF0Y2gKICBpbnQgZ2V0IG1pbGxpc2Vjb25kID0+IF9wYXJ0c1tfTUlMTElTRUNPTkRfSU5ERVhdOwoKICBAcGF0Y2gKICBpbnQgZ2V0IHNlY29uZCA9PiBfcGFydHNbX1NFQ09ORF9JTkRFWF07CgogIEBwYXRjaAogIGludCBnZXQgbWludXRlID0+IF9wYXJ0c1tfTUlOVVRFX0lOREVYXTsKCiAgQHBhdGNoCiAgaW50IGdldCBob3VyID0+IF9wYXJ0c1tfSE9VUl9JTkRFWF07CgogIEBwYXRjaAogIGludCBnZXQgZGF5ID0+IF9wYXJ0c1tfREFZX0lOREVYXTsKCiAgQHBhdGNoCiAgaW50IGdldCB3ZWVrZGF5ID0+IF9wYXJ0c1tfV0VFS0RBWV9JTkRFWF07CgogIEBwYXRjaAogIGludCBnZXQgbW9udGggPT4gX3BhcnRzW19NT05USF9JTkRFWF07CgogIEBwYXRjaAogIGludCBnZXQgeWVhciA9PiBfcGFydHNbX1lFQVJfSU5ERVhdOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBhbW91bnQgb2YgbWljcm9zZWNvbmRzIGluIFVUQyB0aGF0IHJlcHJlc2VudCB0aGUgc2FtZSB2YWx1ZXMKICAgKiBhcyBbdGhpc10uCiAgICoKICAgKiBTYXkgYHRgIGlzIHRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiwgdGhlbgogICAqICogYHRoaXMueWVhciA9PSBuZXcgRGF0ZVRpbWUuZnJvbU1pY3Jvc2Vjb25kc1NpbmNlRXBvY2godCwgdHJ1ZSkueWVhcmAsCiAgICogKiBgdGhpcy5tb250aCA9PSBuZXcgRGF0ZVRpbWUuZnJvbU1pY3Jvc2Vjb25kc1NpbmNlRXBvY2godCwgdHJ1ZSkubW9udGhgLAogICAqICogYHRoaXMuZGF5ID09IG5ldyBEYXRlVGltZS5mcm9tTWljcm9zZWNvbmRzU2luY2VFcG9jaCh0LCB0cnVlKS5kYXlgLAogICAqICogYHRoaXMuaG91ciA9PSBuZXcgRGF0ZVRpbWUuZnJvbU1pY3Jvc2Vjb25kc1NpbmNlRXBvY2godCwgdHJ1ZSkuaG91cmAsCiAgICogKiAuLi4KICAgKgogICAqIERheWxpZ2h0IHNhdmluZ3MgaXMgY29tcHV0ZWQgYXMgaWYgdGhlIGRhdGUgd2FzIGNvbXB1dGVkIGluIFsxOTcwLi4yMDM3XS4KICAgKiBJZiBbdGhpc10gbGllcyBvdXRzaWRlIHRoaXMgcmFuZ2UgdGhlbiBpdCBpcyBhIHllYXIgd2l0aCBzaW1pbGFyCiAgICogcHJvcGVydGllcyAobGVhcCB5ZWFyLCB3ZWVrZGF5cykgaXMgdXNlZCBpbnN0ZWFkLgogICAqLwogIGludCBnZXQgX2xvY2FsRGF0ZUluVXRjTWljcm9zIHsKICAgIGludCBtaWNyb3MgPSBfdmFsdWU7CiAgICBpZiAoaXNVdGMpIHJldHVybiBtaWNyb3M7CiAgICBpbnQgb2Zmc2V0ID0KICAgICAgICBfdGltZVpvbmVPZmZzZXRJblNlY29uZHMobWljcm9zKSAqIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1BlclNlY29uZDsKICAgIHJldHVybiBtaWNyb3MgKyBvZmZzZXQ7CiAgfQoKICBzdGF0aWMgaW50IF9mbG9vcmVkRGl2aXNpb24oaW50IGEsIGludCBiKSB7CiAgICByZXR1cm4gKGEgLSAoYSA8IDAgPyBiIC0gMSA6IDApKSB+LyBiOwogIH0KCiAgLy8gUmV0dXJucyB0aGUgZGF5cyBzaW5jZSAxOTcwIGZvciB0aGUgc3RhcnQgb2YgdGhlIGdpdmVuIFt5ZWFyXS4KICAvLyBbeWVhcl0gbWF5IGJlIGJlZm9yZSBlcG9jaC4KICBzdGF0aWMgaW50IF9kYXlGcm9tWWVhcihpbnQgeWVhcikgewogICAgcmV0dXJuIDM2NSAqICh5ZWFyIC0gMTk3MCkgKwogICAgICAgIF9mbG9vcmVkRGl2aXNpb24oeWVhciAtIDE5NjksIDQpIC0KICAgICAgICBfZmxvb3JlZERpdmlzaW9uKHllYXIgLSAxOTAxLCAxMDApICsKICAgICAgICBfZmxvb3JlZERpdmlzaW9uKHllYXIgLSAxNjAxLCA0MDApOwogIH0KCiAgc3RhdGljIGJvb2wgX2lzTGVhcFllYXIoeSkgewogICAgLy8gKHkgJSAxNiA9PSAwKSBtYXRjaGVzIG11bHRpcGxlcyBvZiA0MDAsIGFuZCBpcyBmYXN0ZXIgdGhhbiAlIDQwMC4KICAgIHJldHVybiAoeSAlIDQgPT0gMCkgJiYgKCh5ICUgMTYgPT0gMCkgfHwgKHkgJSAxMDAgIT0gMCkpOwogIH0KCiAgLy8vIENvbnZlcnRzIHRoZSBnaXZlbiBicm9rZW4gZG93biBkYXRlIHRvIG1pY3Jvc2Vjb25kcy4KICBAcGF0Y2gKICBzdGF0aWMgaW50IF9icm9rZW5Eb3duRGF0ZVRvVmFsdWUoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwgaW50IGhvdXIsCiAgICAgIGludCBtaW51dGUsIGludCBzZWNvbmQsIGludCBtaWxsaXNlY29uZCwgaW50IG1pY3Jvc2Vjb25kLCBib29sIGlzVXRjKSB7CiAgICAvLyBTaW1wbGlmeSBjYWxjdWxhdGlvbnMgYnkgd29ya2luZyB3aXRoIHplcm8tYmFzZWQgbW9udGguCiAgICAtLW1vbnRoOwogICAgLy8gRGVhbCB3aXRoIHVuZGVyIGFuZCBvdmVyZmxvdy4KICAgIGlmIChtb250aCA+PSAxMikgewogICAgICB5ZWFyICs9IG1vbnRoIH4vIDEyOwogICAgICBtb250aCA9IG1vbnRoICUgMTI7CiAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMCkgewogICAgICBpbnQgcmVhbE1vbnRoID0gbW9udGggJSAxMjsKICAgICAgeWVhciArPSAobW9udGggLSByZWFsTW9udGgpIH4vIDEyOwogICAgICBtb250aCA9IHJlYWxNb250aDsKICAgIH0KCiAgICAvLyBGaXJzdCBjb21wdXRlIHRoZSBzZWNvbmRzIGluIFVUQywgaW5kZXBlbmRlbnQgb2YgdGhlIFtpc1V0Y10gZmxhZy4gSWYKICAgIC8vIG5lY2Vzc2FyeSB3ZSB3aWxsIGFkZCB0aGUgdGltZS16b25lIG9mZnNldCBsYXRlciBvbi4KICAgIGludCBkYXlzID0gZGF5IC0gMTsKICAgIGRheXMgKz0gX0RBWVNfVU5USUxfTU9OVEhbX2lzTGVhcFllYXIoeWVhcikgPyAxIDogMF1bbW9udGhdOwogICAgZGF5cyArPSBfZGF5RnJvbVllYXIoeWVhcik7CiAgICBpbnQgbWljcm9zZWNvbmRzU2luY2VFcG9jaCA9IGRheXMgKiBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJEYXkgKwogICAgICAgIGhvdXIgKiBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJIb3VyICsKICAgICAgICBtaW51dGUgKiBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJNaW51dGUgKwogICAgICAgIHNlY29uZCAqIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1BlclNlY29uZCArCiAgICAgICAgbWlsbGlzZWNvbmQgKiBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZCArCiAgICAgICAgbWljcm9zZWNvbmQ7CgogICAgLy8gU2luY2UgW190aW1lWm9uZU9mZnNldEluU2Vjb25kc10gd2lsbCBjcmFzaCBpZiB0aGUgaW5wdXQgaXMgZmFyIG91dCBvZgogICAgLy8gdGhlIHZhbGlkIHJhbmdlIHdlIGRvIGEgcHJlbGltaW5hcnkgdGVzdCB0aGF0IHdlZWRzIG91dCB2YWx1ZXMgdGhhdCBjYW4KICAgIC8vIG5vdCBiZWNvbWUgdmFsaWQgZXZlbiB3aXRoIHRpbWV6b25lIGFkanVzdG1lbnRzLgogICAgLy8gVGhlIHRpbWV6b25lIGFkanVzdG1lbnQgaXMgYWx3YXlzIGxlc3MgdGhhbiBhIGRheSwgc28gYWRkaW5nIGEgc2VjdXJpdHkKICAgIC8vIG1hcmdpbiBvZiBvbmUgZGF5IHNob3VsZCBiZSBlbm91Z2guCiAgICBpZiAobWljcm9zZWNvbmRzU2luY2VFcG9jaC5hYnMoKSA+CiAgICAgICAgX21heE1pbGxpc2Vjb25kc1NpbmNlRXBvY2ggKiAxMDAwICsgRHVyYXRpb24ubWljcm9zZWNvbmRzUGVyRGF5KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmICghaXNVdGMpIHsKICAgICAgLy8gTm90ZSB0aGF0IHdlIGNhbid0IGxpdGVyYWxseSBmb2xsb3cgdGhlIEVDTUFTY3JpcHQgc3BlYyAod2hpY2ggdGhpcwogICAgICAvLyBjb2RlIGlzIGJhc2VkIG9uKSwgYmVjYXVzZSBpdCBsZWFkcyB0byBpbmNvcnJlY3QgY29tcHV0YXRpb25zIGF0CiAgICAgIC8vIHRoZSBEU1QgdHJhbnNpdGlvbiBwb2ludHMuCiAgICAgIC8vCiAgICAgIC8vIFNlZSBWOCdzIGNvbW1lbnQgaGVyZToKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Y4L3Y4L2Jsb2IvMDg5ZGQ3ZDI0NDdkNmVhZjU3YzhiYTZkOGYzNzk1N2YzYTI2OTc3Ny9zcmMvZGF0ZS5oI0wxMTgKCiAgICAgIC8vIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBsb2NhbCB0aW1lem9uZSBhZGp1c3RtZW50IGJlZm9yZSBhc2tpbmcgZm9yIHRoZQogICAgICAvLyBjb3JyZWN0IHpvbmUgb2Zmc2V0LgogICAgICBpbnQgYWRqdXN0bWVudCA9CiAgICAgICAgICBfbG9jYWxUaW1lWm9uZUFkanVzdG1lbnRJblNlY29uZHMoKSAqIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1BlclNlY29uZDsKICAgICAgLy8gVGhlIGFkanVzdG1lbnQgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGFjdHVhbCBkYXRlIGFuZCBvZiB0aGUgZGF5bGlnaHQKICAgICAgLy8gc2F2aW5nIHRpbWUuIEl0IGlzIHBvc2l0aXZlIGVhc3Qgb2YgdGhlIFByaW1lIE1lcmlkaWFuIGFuZCBuZWdhdGl2ZQogICAgICAvLyB3ZXN0IG9mIGl0LCBlLmcuIC0yODgwMCBzZWMgZm9yIEFtZXJpY2EvTG9zX0FuZ2VsZXMgdGltZXpvbmUuCgogICAgICAvLyBXZSByZW1vdmUgb25lIGhvdXIgdG8gZW5zdXJlIHRoYXQgd2UgaGF2ZSB0aGUgY29ycmVjdCBvZmZzZXQgYXQKICAgICAgLy8gRFNUIHRyYW5zaXRpb25pbmcgcG9pbnRzLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHNvbHV0aW9uIGFuZCBvbmx5CiAgICAgIC8vIGNvcnJlY3QgaW4gdGltZXpvbmVzIHRoYXQgc2hpZnQgZm9yIGV4YWN0bHkgb25lIGhvdXIuCiAgICAgIGFkanVzdG1lbnQgKz0gRHVyYXRpb24ubWljcm9zZWNvbmRzUGVySG91cjsKICAgICAgaW50IHpvbmVPZmZzZXQgPQogICAgICAgICAgX3RpbWVab25lT2Zmc2V0SW5TZWNvbmRzKG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2ggLSBhZGp1c3RtZW50KTsKCiAgICAgIC8vIFRoZSB6b25lT2Zmc2V0IGRlcGVuZHMgb24gdGhlIGFjdHVhbCBkYXRlIGFuZCByZWZsZWN0cyBhbnkgZGF5bGlnaHQKICAgICAgLy8gc2F2aW5nIHRpbWUgYW5kL29yIGhpc3RvcmljYWwgZGV2aWF0aW9uIHJlbGF0aXZlIHRvIFVUQyB0aW1lLgogICAgICAvLyBJdCBpcyBwb3NpdGl2ZSBlYXN0IG9mIHRoZSBQcmltZSBNZXJpZGlhbiBhbmQgbmVnYXRpdmUgd2VzdCBvZiBpdCwKICAgICAgLy8gZS5nLiAtMjUyMDAgc2VjIGZvciBBbWVyaWNhL0xvc19BbmdlbGVzIHRpbWV6b25lIGR1cmluZyBEU1QuCiAgICAgIG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2ggLT0gem9uZU9mZnNldCAqIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1BlclNlY29uZDsKICAgICAgLy8gVGhlIHJlc3VsdGluZyBtaWNyb3NlY29uZHNTaW5jZUVwb2NoIHZhbHVlIGlzIHRoZXJlZm9yZSB0aGUgY2FsY3VsYXRlZAogICAgICAvLyBVVEMgdmFsdWUgZGVjcmVhc2VkIGJ5IGEgKHBvc2l0aXZlIGlmIGVhc3Qgb2YgR01UKSB0aW1lem9uZSBhZGp1c3RtZW50CiAgICAgIC8vIGFuZCBkZWNyZWFzZWQgYnkgdHlwaWNhbGx5IG9uZSBob3VyIGlmIERTVCBpcyBpbiBlZmZlY3QuCiAgICB9CiAgICBpZiAobWljcm9zZWNvbmRzU2luY2VFcG9jaC5hYnMoKSA+CiAgICAgICAgX21heE1pbGxpc2Vjb25kc1NpbmNlRXBvY2ggKiBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBtaWNyb3NlY29uZHNTaW5jZUVwb2NoOwogIH0KCiAgc3RhdGljIGludCBfd2Vla0RheSh5KSB7CiAgICAvLyAxLzEvMTk3MCB3YXMgYSBUaHVyc2RheS4KICAgIHJldHVybiAoX2RheUZyb21ZZWFyKHkpICsgNCkgJSA3OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIHllYXIgaW4gdGhlIHJhbmdlIDIwMDgtMjAzNSBtYXRjaGluZwogICAqICogbGVhcCB5ZWFyLCBhbmQKICAgKiAqIHdlZWsgZGF5IG9mIGZpcnN0IGRheS4KICAgKgogICAqIExlYXAgc2Vjb25kcyBhcmUgaWdub3JlZC4KICAgKiBBZGFwdGVkIGZyb20gVjgncyBkYXRlIGltcGxlbWVudGF0aW9uLiBTZWUgRUNNQSAyNjIgLSAxNS45LjEuOS4KICAgKi8KICBzdGF0aWMgaW50IF9lcXVpdmFsZW50WWVhcihpbnQgeWVhcikgewogICAgLy8gUmV0dXJucyB5ZWFyIHkgc28gdGhhdCBfd2Vla0RheSh5KSA9PSBfd2Vla0RheSh5ZWFyKS4KICAgIC8vIF93ZWVrRGF5IHJldHVybnMgdGhlIHdlZWsgZGF5IChpbiByYW5nZSAwIC0gNikuCiAgICAvLyAxLzEvMTk1NiB3YXMgYSBTdW5kYXkgKGkuZS4gd2Vla2RheSAwKS4gMTk1NiB3YXMgYSBsZWFwLXllYXIuCiAgICAvLyAxLzEvMTk2NyB3YXMgYSBTdW5kYXkgKGkuZS4gd2Vla2RheSAwKS4KICAgIC8vIFdpdGhvdXQgbGVhcCB5ZWFycyBhIHN1YnNlcXVlbnQgeWVhciBoYXMgYSB3ZWVrIGRheSArIDEgKGZvciBleGFtcGxlCiAgICAvLyAxLzEvMTk2OCB3YXMgYSBNb25kYXkpLiBXaXRoIGxlYXAteWVhcnMgaXQganVtcHMgb3ZlciBvbmUgd2VlayBkYXkKICAgIC8vIChlLmcuIDEvMS8xOTU3IHdhcyBhIFR1ZXNkYXkpLgogICAgLy8gQWZ0ZXIgMTIgeWVhcnMgdGhlIHdlZWtkYXlzIGhhdmUgYWR2YW5jZWQgYnkgMTIgZGF5cyArIDMgbGVhcCBkYXlzID0KICAgIC8vIDE1IGRheXMuIDE1ICUgNyA9IDEuIFNvIGFmdGVyIDEyIHllYXJzIHRoZSB3ZWVrIGRheSBoYXMgYWx3YXlzCiAgICAvLyAobm93IGluZGVwZW5kZW50bHkgb2YgbGVhcC15ZWFycykgYWR2YW5jZWQgYnkgb25lLgogICAgLy8gd2Vla0RheSAqIDEyIGdpdmVzIHRodXMgYSB5ZWFyIHN0YXJ0aW5nIHdpdGggdGhlIHdhbnRlZCB3ZWVrRGF5LgogICAgaW50IHJlY2VudFllYXIgPSAoX2lzTGVhcFllYXIoeWVhcikgPyAxOTU2IDogMTk2NykgKyAoX3dlZWtEYXkoeWVhcikgKiAxMik7CiAgICAvLyBDbG9zZSB0byB0aGUgeWVhciAyMDA4IHRoZSBjYWxlbmRhciBjeWNsZXMgZXZlcnkgNCAqIDcgeWVhcnMgKDQgZm9yIHRoZQogICAgLy8gbGVhcCB5ZWFycywgNyBmb3IgdGhlIHdlZWtkYXlzKS4KICAgIC8vIEZpbmQgdGhlIHllYXIgaW4gdGhlIHJhbmdlIDIwMDguLjIwMzcgdGhhdCBpcyBlcXVpdmFsZW50IG1vZCAyOC4KICAgIHJldHVybiAyMDA4ICsgKHJlY2VudFllYXIgLSAyMDA4KSAlIDI4OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgVVRDIHllYXIgZm9yIHRoZSBjb3JyZXNwb25kaW5nIFtzZWNvbmRzU2luY2VFcG9jaF0uCiAgICogSXQgaXMgcmVsYXRpdmVseSBmYXN0IGZvciB2YWx1ZXMgaW4gdGhlIHJhbmdlIDAgdG8geWVhciAyMDk4LgogICAqCiAgICogQ29kZSBpcyBhZGFwdGVkIGZyb20gVjguCiAgICovCiAgc3RhdGljIGludCBfeWVhcnNGcm9tU2Vjb25kc1NpbmNlRXBvY2goaW50IHNlY29uZHNTaW5jZUVwb2NoKSB7CiAgICBjb25zdCBpbnQgREFZU19JTl80X1lFQVJTID0gNCAqIDM2NSArIDE7CiAgICBjb25zdCBpbnQgREFZU19JTl8xMDBfWUVBUlMgPSAyNSAqIERBWVNfSU5fNF9ZRUFSUyAtIDE7CiAgICBjb25zdCBpbnQgREFZU19ZRUFSXzIwOTggPSBEQVlTX0lOXzEwMF9ZRUFSUyArIDYgKiBEQVlTX0lOXzRfWUVBUlM7CgogICAgaW50IGRheXMgPSBzZWNvbmRzU2luY2VFcG9jaCB+LyBEdXJhdGlvbi5zZWNvbmRzUGVyRGF5OwogICAgaWYgKGRheXMgPiAwICYmIGRheXMgPCBEQVlTX1lFQVJfMjA5OCkgewogICAgICAvLyBBY2NvcmRpbmcgdG8gVjggdGhpcyBmYXN0IGNhc2Ugd29ya3MgZm9yIGRhdGVzIGZyb20gMTk3MCB0byAyMDk5LgogICAgICByZXR1cm4gMTk3MCArICg0ICogZGF5cyArIDIpIH4vIERBWVNfSU5fNF9ZRUFSUzsKICAgIH0KICAgIGludCBtaWNyb3MgPSBzZWNvbmRzU2luY2VFcG9jaCAqIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1BlclNlY29uZDsKICAgIHJldHVybiBfY29tcHV0ZVVwcGVyUGFydChtaWNyb3MpW19ZRUFSX0lOREVYXTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBkYXRlIGluIHNlY29uZHMgdGhhdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBnaXZlbgogICAqIGRhdGUgaW4gbWljcm9zZWNvbmRzIFttaWNyb3NlY29uZHNTaW5jZUVwb2NoXS4gQW4gZXF1aXZhbGVudAogICAqIGRhdGUgaGFzIHRoZSBzYW1lIGZpZWxkcyAoYG1vbnRoYCwgYGRheWAsIGV0Yy4pIGFzIHRoZSBnaXZlbgogICAqIGRhdGUsIGJ1dCB0aGUgYHllYXJgIGlzIGluIHRoZSByYW5nZSBbMTkwMS4uMjAzOF0uCiAgICoKICAgKiAqIFRoZSB0aW1lIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHllYXIgaXMgdGhlIHNhbWUuCiAgICogKiBJZiB0aGUgZ2l2ZW4gZGF0ZSBpcyBpbiBhIGxlYXAgeWVhciB0aGVuIHRoZSByZXR1cm5lZAogICAqICAgc2Vjb25kcyBhcmUgaW4gYSBsZWFwIHllYXIsIHRvby4KICAgKiAqIFRoZSB3ZWVrIGRheSBvZiBnaXZlbiBkYXRlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgZm9yIHRoZQogICAqICAgcmV0dXJuZWQgZGF0ZS4KICAgKi8KICBzdGF0aWMgaW50IF9lcXVpdmFsZW50U2Vjb25kcyhpbnQgbWljcm9zZWNvbmRzU2luY2VFcG9jaCkgewogICAgY29uc3QgaW50IENVVF9PRkZfU0VDT05EUyA9IDB4N0ZGRkZGRkY7CgogICAgaW50IHNlY29uZHNTaW5jZUVwb2NoID0gX2Zsb29yZWREaXZpc2lvbigKICAgICAgICBtaWNyb3NlY29uZHNTaW5jZUVwb2NoLCBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJTZWNvbmQpOwoKICAgIGlmIChzZWNvbmRzU2luY2VFcG9jaC5hYnMoKSA+IENVVF9PRkZfU0VDT05EUykgewogICAgICBpbnQgeWVhciA9IF95ZWFyc0Zyb21TZWNvbmRzU2luY2VFcG9jaChzZWNvbmRzU2luY2VFcG9jaCk7CiAgICAgIGludCBkYXlzID0gX2RheUZyb21ZZWFyKHllYXIpOwogICAgICBpbnQgZXF1aXZhbGVudFllYXIgPSBfZXF1aXZhbGVudFllYXIoeWVhcik7CiAgICAgIGludCBlcXVpdmFsZW50RGF5cyA9IF9kYXlGcm9tWWVhcihlcXVpdmFsZW50WWVhcik7CiAgICAgIGludCBkaWZmRGF5cyA9IGVxdWl2YWxlbnREYXlzIC0gZGF5czsKICAgICAgc2Vjb25kc1NpbmNlRXBvY2ggKz0gZGlmZkRheXMgKiBEdXJhdGlvbi5zZWNvbmRzUGVyRGF5OwogICAgfQogICAgcmV0dXJuIHNlY29uZHNTaW5jZUVwb2NoOwogIH0KCiAgc3RhdGljIGludCBfdGltZVpvbmVPZmZzZXRJblNlY29uZHMoaW50IG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gpIHsKICAgIGludCBlcXVpdmFsZW50U2Vjb25kcyA9IF9lcXVpdmFsZW50U2Vjb25kcyhtaWNyb3NlY29uZHNTaW5jZUVwb2NoKTsKICAgIHJldHVybiBfdGltZVpvbmVPZmZzZXRJblNlY29uZHNGb3JDbGFtcGVkU2Vjb25kcyhlcXVpdmFsZW50U2Vjb25kcyk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF90aW1lWm9uZU5hbWUoaW50IG1pY3Jvc2Vjb25kc1NpbmNlRXBvY2gpIHsKICAgIGludCBlcXVpdmFsZW50U2Vjb25kcyA9IF9lcXVpdmFsZW50U2Vjb25kcyhtaWNyb3NlY29uZHNTaW5jZUVwb2NoKTsKICAgIHJldHVybiBfdGltZVpvbmVOYW1lRm9yQ2xhbXBlZFNlY29uZHMoZXF1aXZhbGVudFNlY29uZHMpOwogIH0KfQqBwABOTjwBHgEiBxEORUYBRiYBTjEBMToBJyciIiAfIyEgARABCUIbGUobAQlCGz8BCUlAHE03MzIEAQkSFyYBCRwdMgQBCSAmTDMEAQklGzAcAQlKAQlJAQkrLgEJIzYBTzY7Q0IFATMtPD0wHE4lARgZFwEaHkQeGUMuDCkuHQwnLBsMGyAXATYYAUIbMBkVBjwBTxxNLBdIJwEXRy0BFUUoASpHIFEkGQErMjIoKCQiKiYkEQQBDzoUBAEJJEUXBAEJKUUXBAEJKD4EAQkkNQEJLAEJNQEJNQEJKwEJKwEJJwEJJQEJLQEJKQEJJwEGThAFMk1PS00LBU9GNwYiGR4RSxwEAS4rBAFEISYhKy0sBAEfST4EATsJTE4/DSUXGxocIikZBgFNPBhBIEYuMjI8FQFOTzhPKydLEwYBEk1KJAkgYAFPHhdQTk1HAUlJPzIXSQFNR0xGTVBQQgYnTBMGIwQBGyAmBAEGNBYeBR9FBik9N0UvTEomTEY6SFBPKEgsBAEGRUMFHgZCLTxIATwtSzcGRTMEAQY/QkI4BT09KEEWBj4sAS5BATVBJTI5LD4GHgQBREhJBAE8SD4EAgEfZGFydDpjb3JlLXBhdGNoL2RhdGVfcGF0Y2guZGFydCxvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9kb3VibGUuZGFydJwRLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLy8gVE9ETzogQ29udmVydCB0aGlzIGFic3RyYWN0IGNsYXNzIGludG8gYSBjb25jcmV0ZSBjbGFzcyBkb3VibGUKLy8gdGhhdCB1c2VzIHRoZSBwYXRjaCBjbGFzcyBmdW5jdGlvbmFsaXR5IHRvIGFjY291bnQgZm9yIHRoZQovLyBkaWZmZXJlbnQgcGxhdGZvcm0gaW1wbGVtZW50YXRpb25zLgoKLyoqCiAqIEEgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXIuCiAqCiAqIFJlcHJlc2VudGF0aW9uIG9mIERhcnQgZG91YmxlcyBjb250YWluaW5nIGRvdWJsZSBzcGVjaWZpYyBjb25zdGFudHMKICogYW5kIG9wZXJhdGlvbnMgYW5kIHNwZWNpYWxpemF0aW9ucyBvZiBvcGVyYXRpb25zIGluaGVyaXRlZCBmcm9tCiAqIFtudW1dLiBEYXJ0IGRvdWJsZXMgYXJlIDY0LWJpdCBmbG9hdGluZy1wb2ludCBudW1iZXJzIGFzIHNwZWNpZmllZCBpbiB0aGUKICogSUVFRSA3NTQgc3RhbmRhcmQuCiAqCiAqIFRoZSBbZG91YmxlXSB0eXBlIGlzIGNvbnRhZ2lvdXMuIE9wZXJhdGlvbnMgb24gW2RvdWJsZV1zIHJldHVybgogKiBbZG91YmxlXSByZXN1bHRzLgogKgogKiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBmb3IgYSBjbGFzcyB0byBhdHRlbXB0IHRvIGV4dGVuZCBvciBpbXBsZW1lbnQKICogZG91YmxlLgogKi8KYWJzdHJhY3QgY2xhc3MgZG91YmxlIGV4dGVuZHMgbnVtIHsKICBzdGF0aWMgY29uc3QgZG91YmxlIG5hbiA9IDAuMCAvIDAuMDsKICBzdGF0aWMgY29uc3QgZG91YmxlIGluZmluaXR5ID0gMS4wIC8gMC4wOwogIHN0YXRpYyBjb25zdCBkb3VibGUgbmVnYXRpdmVJbmZpbml0eSA9IC1pbmZpbml0eTsKICBzdGF0aWMgY29uc3QgZG91YmxlIG1pblBvc2l0aXZlID0gNWUtMzI0OwogIHN0YXRpYyBjb25zdCBkb3VibGUgbWF4RmluaXRlID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7CgogIGRvdWJsZSByZW1haW5kZXIobnVtIG90aGVyKTsKCiAgLyoqIEFkZGl0aW9uIG9wZXJhdG9yLiAqLwogIGRvdWJsZSBvcGVyYXRvciArKG51bSBvdGhlcik7CgogIC8qKiBTdWJ0cmFjdGlvbiBvcGVyYXRvci4gKi8KICBkb3VibGUgb3BlcmF0b3IgLShudW0gb3RoZXIpOwoKICAvKiogTXVsdGlwbGljYXRpb24gb3BlcmF0b3IuICovCiAgZG91YmxlIG9wZXJhdG9yICoobnVtIG90aGVyKTsKCiAgZG91YmxlIG9wZXJhdG9yICUobnVtIG90aGVyKTsKCiAgLyoqIERpdmlzaW9uIG9wZXJhdG9yLiAqLwogIGRvdWJsZSBvcGVyYXRvciAvKG51bSBvdGhlcik7CgogIC8qKgogICAqIFRydW5jYXRpbmcgZGl2aXNpb24gb3BlcmF0b3IuCiAgICoKICAgKiBUaGUgcmVzdWx0IG9mIHRoZSB0cnVuY2F0aW5nIGRpdmlzaW9uIGBhIH4vIGJgIGlzIGVxdWl2YWxlbnQgdG8KICAgKiBgKGEgLyBiKS50cnVuY2F0ZSgpYC4KICAgKi8KICBpbnQgb3BlcmF0b3Igfi8obnVtIG90aGVyKTsKCiAgLyoqIE5lZ2F0ZSBvcGVyYXRvci4gKi8KICBkb3VibGUgb3BlcmF0b3IgLSgpOwoKICAvKiogUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBbZG91YmxlXS4gKi8KICBkb3VibGUgYWJzKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHNpZ24gb2YgdGhlIGRvdWJsZSdzIG51bWVyaWNhbCB2YWx1ZS4KICAgKgogICAqIFJldHVybnMgLTEuMCBpZiB0aGUgdmFsdWUgaXMgbGVzcyB0aGFuIHplcm8sCiAgICogKzEuMCBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHplcm8sCiAgICogYW5kIHRoZSB2YWx1ZSBpdHNlbGYgaWYgaXQgaXMgLTAuMCwgMC4wIG9yIE5hTi4KICAgKi8KICBkb3VibGUgZ2V0IHNpZ247CgogIC8qKgogICAqIFJldHVybnMgdGhlIGludGVnZXIgY2xvc2VzdCB0byBgdGhpc2AuCiAgICoKICAgKiBSb3VuZHMgYXdheSBmcm9tIHplcm8gd2hlbiB0aGVyZSBpcyBubyBjbG9zZXN0IGludGVnZXI6CiAgICogIGAoMy41KS5yb3VuZCgpID09IDRgIGFuZCBgKC0zLjUpLnJvdW5kKCkgPT0gLTRgLgogICAqCiAgICogSWYgYHRoaXNgIGlzIG5vdCBmaW5pdGUgKGBOYU5gIG9yIGluZmluaXR5KSwgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBpbnQgcm91bmQoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZ3JlYXRlc3QgaW50ZWdlciBubyBncmVhdGVyIHRoYW4gYHRoaXNgLgogICAqCiAgICogSWYgYHRoaXNgIGlzIG5vdCBmaW5pdGUgKGBOYU5gIG9yIGluZmluaXR5KSwgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBpbnQgZmxvb3IoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVhc3QgaW50ZWdlciBubyBzbWFsbGVyIHRoYW4gYHRoaXNgLgogICAqCiAgICogSWYgYHRoaXNgIGlzIG5vdCBmaW5pdGUgKGBOYU5gIG9yIGluZmluaXR5KSwgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBpbnQgY2VpbCgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIG9idGFpbmVkIGJ5IGRpc2NhcmRpbmcgYW55IGZyYWN0aW9uYWwKICAgKiBkaWdpdHMgZnJvbSBgdGhpc2AuCiAgICoKICAgKiBJZiBgdGhpc2AgaXMgbm90IGZpbml0ZSAoYE5hTmAgb3IgaW5maW5pdHkpLCB0aHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdLgogICAqLwogIGludCB0cnVuY2F0ZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIGRvdWJsZSB2YWx1ZSBjbG9zZXN0IHRvIGB0aGlzYC4KICAgKgogICAqIFJvdW5kcyBhd2F5IGZyb20gemVybyB3aGVuIHRoZXJlIGlzIG5vIGNsb3Nlc3QgaW50ZWdlcjoKICAgKiAgYCgzLjUpLnJvdW5kVG9Eb3VibGUoKSA9PSA0YCBhbmQgYCgtMy41KS5yb3VuZFRvRG91YmxlKCkgPT0gLTRgLgogICAqCiAgICogSWYgdGhpcyBpcyBhbHJlYWR5IGFuIGludGVnZXIgdmFsdWVkIGRvdWJsZSwgaW5jbHVkaW5nIGAtMC4wYCwgb3IgaXQgaXMgbm90CiAgICogYSBmaW5pdGUgdmFsdWUsIHRoZSB2YWx1ZSBpcyByZXR1cm5lZCB1bm1vZGlmaWVkLgogICAqCiAgICogRm9yIHRoZSBwdXJwb3NlIG9mIHJvdW5kaW5nLCBgLTAuMGAgaXMgY29uc2lkZXJlZCB0byBiZSBiZWxvdyBgMC4wYCwKICAgKiBhbmQgYC0wLjBgIGlzIHRoZXJlZm9yZSBjb25zaWRlcmVkIGNsb3NlciB0byBuZWdhdGl2ZSBudW1iZXJzIHRoYW4gYDAuMGAuCiAgICogVGhpcyBtZWFucyB0aGF0IGZvciBhIHZhbHVlLCBgZGAgaW4gdGhlIHJhbmdlIGAtMC41IDwgZCA8IDAuMGAsCiAgICogdGhlIHJlc3VsdCBpcyBgLTAuMGAuCiAgICovCiAgZG91YmxlIHJvdW5kVG9Eb3VibGUoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZ3JlYXRlc3QgaW50ZWdlciBkb3VibGUgdmFsdWUgbm8gZ3JlYXRlciB0aGFuIGB0aGlzYC4KICAgKgogICAqIElmIHRoaXMgaXMgYWxyZWFkeSBhbiBpbnRlZ2VyIHZhbHVlZCBkb3VibGUsIGluY2x1ZGluZyBgLTAuMGAsIG9yIGl0IGlzIG5vdAogICAqIGEgZmluaXRlIHZhbHVlLCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KICAgKgogICAqIEZvciB0aGUgcHVycG9zZSBvZiByb3VuZGluZywgYC0wLjBgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYmVsb3cgYDAuMGAuCiAgICogQSBudW1iZXIgYGRgIGluIHRoZSByYW5nZSBgMC4wIDwgZCA8IDEuMGAgd2lsbCByZXR1cm4gYDAuMGAuCiAgICovCiAgZG91YmxlIGZsb29yVG9Eb3VibGUoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVhc3QgaW50ZWdlciBkb3VibGUgdmFsdWUgbm8gc21hbGxlciB0aGFuIGB0aGlzYC4KICAgKgogICAqIElmIHRoaXMgaXMgYWxyZWFkeSBhbiBpbnRlZ2VyIHZhbHVlZCBkb3VibGUsIGluY2x1ZGluZyBgLTAuMGAsIG9yIGl0IGlzIG5vdAogICAqIGEgZmluaXRlIHZhbHVlLCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KICAgKgogICAqIEZvciB0aGUgcHVycG9zZSBvZiByb3VuZGluZywgYC0wLjBgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYmVsb3cgYDAuMGAuCiAgICogQSBudW1iZXIgYGRgIGluIHRoZSByYW5nZSBgLTEuMCA8IGQgPCAwLjBgIHdpbGwgcmV0dXJuIGAtMC4wYC4KICAgKi8KICBkb3VibGUgY2VpbFRvRG91YmxlKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGludGVnZXIgZG91YmxlIHZhbHVlIG9idGFpbmVkIGJ5IGRpc2NhcmRpbmcgYW55IGZyYWN0aW9uYWwKICAgKiBkaWdpdHMgZnJvbSBgdGhpc2AuCiAgICoKICAgKiBJZiB0aGlzIGlzIGFscmVhZHkgYW4gaW50ZWdlciB2YWx1ZWQgZG91YmxlLCBpbmNsdWRpbmcgYC0wLjBgLCBvciBpdCBpcyBub3QKICAgKiBhIGZpbml0ZSB2YWx1ZSwgdGhlIHZhbHVlIGlzIHJldHVybmVkIHVubW9kaWZpZWQuCiAgICoKICAgKiBGb3IgdGhlIHB1cnBvc2Ugb2Ygcm91bmRpbmcsIGAtMC4wYCBpcyBjb25zaWRlcmVkIHRvIGJlIGJlbG93IGAwLjBgLgogICAqIEEgbnVtYmVyIGBkYCBpbiB0aGUgcmFuZ2UgYC0xLjAgPCBkIDwgMC4wYCB3aWxsIHJldHVybiBgLTAuMGAsIGFuZAogICAqIGluIHRoZSByYW5nZSBgMC4wIDwgZCA8IDEuMGAgaXQgd2lsbCByZXR1cm4gMC4wLgogICAqLwogIGRvdWJsZSB0cnVuY2F0ZVRvRG91YmxlKCk7CgogIC8qKgogICAqIFByb3ZpZGUgYSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFtkb3VibGVdIHZhbHVlLgogICAqCiAgICogVGhlIHJlcHJlc2VudGF0aW9uIGlzIGEgbnVtYmVyIGxpdGVyYWwgc3VjaCB0aGF0IHRoZSBjbG9zZXN0IGRvdWJsZSB2YWx1ZQogICAqIHRvIHRoZSByZXByZXNlbnRhdGlvbidzIG1hdGhlbWF0aWNhbCB2YWx1ZSBpcyB0aGlzIFtkb3VibGVdLgogICAqCiAgICogUmV0dXJucyAiTmFOIiBmb3IgdGhlIE5vdC1hLU51bWJlciB2YWx1ZS4KICAgKiBSZXR1cm5zICJJbmZpbml0eSIgYW5kICItSW5maW5pdHkiIGZvciBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgSW5maW5pdHkuCiAgICogUmV0dXJucyAiLTAuMCIgZm9yIG5lZ2F0aXZlIHplcm8uCiAgICoKICAgKiBGb3IgYWxsIGRvdWJsZXMsIGBkYCwgY29udmVydGluZyB0byBhIHN0cmluZyBhbmQgcGFyc2luZyB0aGUgc3RyaW5nIGJhY2sKICAgKiBnaXZlcyB0aGUgc2FtZSB2YWx1ZSBhZ2FpbjogYGQgPT0gZG91YmxlLnBhcnNlKGQudG9TdHJpbmcoKSlgIChleGNlcHQgd2hlbgogICAqIGBkYCBpcyBOYU4pLgogICAqLwogIFN0cmluZyB0b1N0cmluZygpOwoKICAvKioKICAgKiBQYXJzZSBbc291cmNlXSBhcyBhbiBkb3VibGUgbGl0ZXJhbCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KICAgKgogICAqIEFjY2VwdHMgYW4gb3B0aW9uYWwgc2lnbiAoYCtgIG9yIGAtYCkgZm9sbG93ZWQgYnkgZWl0aGVyIHRoZSBjaGFyYWN0ZXJzCiAgICogIkluZmluaXR5IiwgdGhlIGNoYXJhY3RlcnMgIk5hTiIgb3IgYSBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbi4KICAgKiBBIGZsb2F0aW5nLXBvaW50IHJlcHJlc2VudGF0aW9uIGlzIGNvbXBvc2VkIG9mIGEgbWFudGlzc2EgYW5kIGFuIG9wdGlvbmFsCiAgICogZXhwb25lbnQgcGFydC4gVGhlIG1hbnRpc3NhIGlzIGVpdGhlciBhIGRlY2ltYWwgcG9pbnQgKGAuYCkgZm9sbG93ZWQgYnkgYQogICAqIHNlcXVlbmNlIG9mIChkZWNpbWFsKSBkaWdpdHMsIG9yIGEgc2VxdWVuY2Ugb2YgZGlnaXRzCiAgICogb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGRlY2ltYWwgcG9pbnQgYW5kIG9wdGlvbmFsbHkgbW9yZSBkaWdpdHMuIFRoZQogICAqIChvcHRpb25hbCkgZXhwb25lbnQgcGFydCBjb25zaXN0cyBvZiB0aGUgY2hhcmFjdGVyICJlIiBvciAiRSIsIGFuIG9wdGlvbmFsCiAgICogc2lnbiwgYW5kIG9uZSBvciBtb3JlIGRpZ2l0cy4KICAgKiBUaGUgW3NvdXJjZV0gbXVzdCBub3QgYmUgYG51bGxgLgogICAqCiAgICogTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBpZ25vcmVkLgogICAqCiAgICogSWYgdGhlIFtzb3VyY2VdIHN0cmluZyBpcyBub3QgYSB2YWxpZCBkb3VibGUgbGl0ZXJhbCwgdGhlIFtvbkVycm9yXQogICAqIGlzIGNhbGxlZCB3aXRoIHRoZSBbc291cmNlXSBhcyBhcmd1bWVudCwgYW5kIGl0cyByZXR1cm4gdmFsdWUgaXMKICAgKiB1c2VkIGluc3RlYWQuIElmIG5vIGBvbkVycm9yYCBpcyBwcm92aWRlZCwgYSBbRm9ybWF0RXhjZXB0aW9uXQogICAqIGlzIHRocm93biBpbnN0ZWFkLgogICAqCiAgICogVGhlIFtvbkVycm9yXSBmdW5jdGlvbiBpcyBvbmx5IGludm9rZWQgaWYgW3NvdXJjZV0gaXMgYSBbU3RyaW5nXSB3aXRoIGFuCiAgICogaW52YWxpZCBmb3JtYXQuIEl0IGlzIG5vdCBpbnZva2VkIGlmIFtzb3VyY2VdIGlzIGBudWxsYC4KICAgKgogICAqIEV4YW1wbGVzIG9mIGFjY2VwdGVkIHN0cmluZ3M6CiAgICoKICAgKiAgICAgIjMuMTQiCiAgICogICAgICIgIDMuMTQgXHhBMCIKICAgKiAgICAgIjAuIgogICAqICAgICAiLjAiCiAgICogICAgICItMS5lMyIKICAgKiAgICAgIjEyMzRFKzciCiAgICogICAgICIrLjEyZS05IgogICAqICAgICAiLU5hTiIKICAgKgogICAqIFRoZSBbb25FcnJvcl0gcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZC4KICAgKiBJbnN0ZWFkIG9mIGBkb3VibGUucGFyc2Uoc3RyaW5nLCAoc3RyaW5nKSB7IC4uLiB9KWAsCiAgICogeW91IHNob3VsZCB1c2UgYGRvdWJsZS50cnlQYXJzZShzdHJpbmcpID8/ICguLi4pYC4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgZG91YmxlIHBhcnNlKFN0cmluZyBzb3VyY2UsCiAgICAgIFtAZGVwcmVjYXRlZCBkb3VibGUgb25FcnJvcihTdHJpbmcgc291cmNlKV0pOwoKICAvKioKICAgKiBQYXJzZSBbc291cmNlXSBhcyBhbiBkb3VibGUgbGl0ZXJhbCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KICAgKgogICAqIExpa2UgW3BhcnNlXSBleGNlcHQgdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYG51bGxgIGZvciBpbnZhbGlkIGlucHV0cwogICAqIGluc3RlYWQgb2YgdGhyb3dpbmcsIGFuZCB0aGUgW3NvdXJjZV0gbXVzdCBzdGlsbCBub3QgYmUgYG51bGxgLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBkb3VibGUgdHJ5UGFyc2UoU3RyaW5nIHNvdXJjZSk7Cn0KgNwATk48ARMBQj4nAQQtA0dDTRYDQxUDTAsEJCcsNCw7AR8BHCABHyABIiABIAEcIAEGIwVFGwYeARoXATYQAQY3BTItNQYTAQYsBT03BVAGDwEGOgVQBg8BBjcFUAYOAQY/GQVQBhIBBjkFPUcFUTcFSk9FGwYaAQZHBVE3BUpCBhoBBkQFUTcFSkQGGQEGTBkFUTcFSkg2Bh0BBjYFT0IFL0wnBU5QEgYVAQY/BU1KT087TFAjJgUxBUlGRBgFTj4FIwUQFw4OERMTEAVAOjgGLjQBBj8FTkUGMgIBFWRhcnQ6Y29yZS9kb3VibGUuZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2RvdWJsZV9wYXRjaC5kYXJ0jq0vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCi8vIFZNIGltcGxlbWVudGF0aW9uIG9mIGRvdWJsZS4KCkBwYXRjaApjbGFzcyBkb3VibGUgewogIHN0YXRpYyBkb3VibGUgX25hdGl2ZVBhcnNlKFN0cmluZyBzdHIsIGludCBzdGFydCwgaW50IGVuZCkKICAgICAgbmF0aXZlICJEb3VibGVfcGFyc2UiOwoKICBzdGF0aWMgZG91YmxlIF90cnlQYXJzZURvdWJsZSh2YXIgc3RyLCB2YXIgc3RhcnQsIHZhciBlbmQpIHsKICAgIGFzc2VydChzdGFydCA8IGVuZCk7CiAgICBjb25zdCBpbnQgX0RPVCA9IDB4MmU7IC8vICcuJwogICAgY29uc3QgaW50IF9aRVJPID0gMHgzMDsgLy8gJzAnCiAgICBjb25zdCBpbnQgX01JTlVTID0gMHgyZDsgLy8gJy0nCiAgICBjb25zdCBpbnQgX04gPSAweDRlOyAvLyAnTicKICAgIGNvbnN0IGludCBfYSA9IDB4NjE7IC8vICdhJwogICAgY29uc3QgaW50IF9JID0gMHg0OTsgLy8gJ0knCiAgICBjb25zdCBpbnQgX2UgPSAweDY1OyAvLyAnZScKICAgIGludCBleHBvbmVudCA9IDA7CiAgICAvLyBTZXQgdG8gbm9uLXplcm8gaWYgYSBkaWdpdCBpcyBzZWVuLiBBdm9pZHMgYWNjZXB0aW5nICIuIi4KICAgIGJvb2wgZGlnaXRzU2VlbiA9IGZhbHNlOwogICAgLy8gQWRkZWQgdG8gZXhwb25lbnQgZm9yIGVhY2ggZGlnaXQuIFNldCB0byAtMSB3aGVuIHNlZWluZyAnLicuCiAgICBpbnQgZXhwb25lbnREZWx0YSA9IDA7CiAgICBkb3VibGUgZG91YmxlVmFsdWUgPSAwLjA7CiAgICBkb3VibGUgc2lnbiA9IDEuMDsKICAgIGludCBmaXJzdENoYXIgPSBzdHIuY29kZVVuaXRBdChzdGFydCk7CiAgICBpZiAoZmlyc3RDaGFyID09IF9NSU5VUykgewogICAgICBzaWduID0gLTEuMDsKICAgICAgc3RhcnQrKzsKICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgcmV0dXJuIG51bGw7CiAgICAgIGZpcnN0Q2hhciA9IHN0ci5jb2RlVW5pdEF0KHN0YXJ0KTsKICAgIH0KICAgIGlmIChmaXJzdENoYXIgPT0gX0kpIHsKICAgICAgaWYgKGVuZCA9PSBzdGFydCArIDggJiYgc3RyLnN0YXJ0c1dpdGgoIm5maW5pdHkiLCBzdGFydCArIDEpKSB7CiAgICAgICAgcmV0dXJuIHNpZ24gKiBkb3VibGUuaW5maW5pdHk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoZmlyc3RDaGFyID09IF9OKSB7CiAgICAgIGlmIChlbmQgPT0gc3RhcnQgKyAzICYmCiAgICAgICAgICBzdHIuY29kZVVuaXRBdChzdGFydCArIDEpID09IF9hICYmCiAgICAgICAgICBzdHIuY29kZVVuaXRBdChzdGFydCArIDIpID09IF9OKSB7CiAgICAgICAgcmV0dXJuIGRvdWJsZS5uYW47CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgaW50IGZpcnN0RGlnaXQgPSBmaXJzdENoYXIgXiBfWkVSTzsKICAgIGlmIChmaXJzdERpZ2l0IDw9IDkpIHsKICAgICAgc3RhcnQrKzsKICAgICAgZG91YmxlVmFsdWUgPSBmaXJzdERpZ2l0LnRvRG91YmxlKCk7CiAgICAgIGRpZ2l0c1NlZW4gPSB0cnVlOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgaW50IGMgPSBzdHIuY29kZVVuaXRBdChpKTsKICAgICAgaW50IGRpZ2l0ID0gYyBeIF9aRVJPOyAvLyAnMCctJzknIGNoYXJhY3RlcnMgYXJlIG5vdyAwLTkgaW50ZWdlcnMuCiAgICAgIGlmIChkaWdpdCA8PSA5KSB7CiAgICAgICAgZG91YmxlVmFsdWUgPSAxMC4wICogZG91YmxlVmFsdWUgKyBkaWdpdDsKICAgICAgICAvLyBEb3VibGVzIGF0IG9yIGFib3ZlIHRoaXMgdmFsdWUgKDIqKjUzKSBtaWdodCBoYXZlIGxvc3QgcHJlY2lzc2lvbi4KICAgICAgICBjb25zdCBkb3VibGUgTUFYX0VYQUNUX0RPVUJMRSA9IDkwMDcxOTkyNTQ3NDA5OTIuMDsKICAgICAgICBpZiAoZG91YmxlVmFsdWUgPj0gTUFYX0VYQUNUX0RPVUJMRSkgcmV0dXJuIG51bGw7CiAgICAgICAgZXhwb25lbnQgKz0gZXhwb25lbnREZWx0YTsKICAgICAgICBkaWdpdHNTZWVuID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChjID09IF9ET1QgJiYgZXhwb25lbnREZWx0YSA9PSAwKSB7CiAgICAgICAgZXhwb25lbnREZWx0YSA9IC0xOwogICAgICB9IGVsc2UgaWYgKChjIHwgMHgyMCkgPT0gX2UpIHsKICAgICAgICBpKys7CiAgICAgICAgaWYgKGkgPT0gZW5kKSByZXR1cm4gbnVsbDsKICAgICAgICAvLyBpbnQuX3RyeVBhcnNlU21pIHRyZWF0cyBpdHMgZW5kIGFyZ3VtZW50IGFzIGluY2x1c2l2ZS4KICAgICAgICBpbnQgZXhwUGFydCA9IGludC5fdHJ5UGFyc2VTbWkoc3RyLCBpLCBlbmQgLSAxKTsKICAgICAgICBpZiAoZXhwUGFydCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICBleHBvbmVudCArPSBleHBQYXJ0OwogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAoIWRpZ2l0c1NlZW4pIHJldHVybiBudWxsOyAvLyBObyBkaWdpdHMuCiAgICBpZiAoZXhwb25lbnQgPT0gMCkgcmV0dXJuIHNpZ24gKiBkb3VibGVWYWx1ZTsKICAgIGNvbnN0IFAxMCA9IFBPV0VSU19PRl9URU47IC8vIEZyb20gc2hhcmVkIGxpYnJhcnkKICAgIGlmIChleHBvbmVudCA8IDApIHsKICAgICAgaW50IG5lZ0V4cG9uZW50ID0gLWV4cG9uZW50OwogICAgICBpZiAobmVnRXhwb25lbnQgPj0gUDEwLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBzaWduICogKGRvdWJsZVZhbHVlIC8gUDEwW25lZ0V4cG9uZW50XSk7CiAgICB9CiAgICBpZiAoZXhwb25lbnQgPj0gUDEwLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gc2lnbiAqIChkb3VibGVWYWx1ZSAqIFAxMFtleHBvbmVudF0pOwogIH0KCiAgc3RhdGljIGRvdWJsZSBfcGFyc2UodmFyIHN0cikgewogICAgaW50IGxlbiA9IHN0ci5sZW5ndGg7CiAgICBpbnQgc3RhcnQgPSBzdHIuX2ZpcnN0Tm9uV2hpdGVzcGFjZSgpOwogICAgaWYgKHN0YXJ0ID09IGxlbikgcmV0dXJuIG51bGw7IC8vIEFsbCB3aGl0ZXNwYWNlLgogICAgaW50IGVuZCA9IHN0ci5fbGFzdE5vbldoaXRlc3BhY2UoKSArIDE7CiAgICBhc3NlcnQoc3RhcnQgPCBlbmQpOwogICAgdmFyIHJlc3VsdCA9IF90cnlQYXJzZURvdWJsZShzdHIsIHN0YXJ0LCBlbmQpOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSByZXR1cm4gcmVzdWx0OwogICAgcmV0dXJuIF9uYXRpdmVQYXJzZShzdHIsIHN0YXJ0LCBlbmQpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIGRvdWJsZSBwYXJzZShTdHJpbmcgc291cmNlLAogICAgICBbQGRlcHJlY2F0ZWQgZG91YmxlIG9uRXJyb3IoU3RyaW5nIHNvdXJjZSldKSB7CiAgICB2YXIgcmVzdWx0ID0gX3BhcnNlKHNvdXJjZSk7CiAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgaWYgKG9uRXJyb3IgPT0gbnVsbCkgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBkb3VibGUiLCBzb3VyY2UpOwogICAgICByZXR1cm4gb25FcnJvcihzb3VyY2UpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBkb3VibGUgdHJ5UGFyc2UoU3RyaW5nIHNvdXJjZSkgPT4gX3BhcnNlKHNvdXJjZSk7Cn0KeABOTjwBHgEgAQcPPR0BPxkiIyQgICAgFkEdRBseFysfEw8lKQYbRicIEwYbHi0tGwgTBgEoGw8rGQYoIUkYMk48OiMbNBwlDSNCOSodDw8VCAYwMjYYIzI2Bi0xBAEiGis2LBkzJyoEAQklNSEaUB4GEwQBCTsCASFkYXJ0OmNvcmUtcGF0Y2gvZG91YmxlX3BhdGNoLmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvZHVyYXRpb24uZGFydKagLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIEEgc3BhbiBvZiB0aW1lLCBzdWNoIGFzIDI3IGRheXMsIDQgaG91cnMsIDEyIG1pbnV0ZXMsIGFuZCAzIHNlY29uZHMuCiAqCiAqIEEgYER1cmF0aW9uYCByZXByZXNlbnRzIGEgZGlmZmVyZW5jZSBmcm9tIG9uZSBwb2ludCBpbiB0aW1lIHRvIGFub3RoZXIuIFRoZQogKiBkdXJhdGlvbiBtYXkgYmUgIm5lZ2F0aXZlIiBpZiB0aGUgZGlmZmVyZW5jZSBpcyBmcm9tIGEgbGF0ZXIgdGltZSB0byBhbgogKiBlYXJsaWVyLgogKgogKiBEdXJhdGlvbnMgYXJlIGNvbnRleHQgaW5kZXBlbmRlbnQuIEZvciBleGFtcGxlLCBhIGR1cmF0aW9uIG9mIDIgZGF5cyBpcwogKiBhbHdheXMgNDggaG91cnMsIGV2ZW4gd2hlbiBpdCBpcyBhZGRlZCB0byBhIGBEYXRlVGltZWAganVzdCB3aGVuIHRoZQogKiB0aW1lIHpvbmUgaXMgYWJvdXQgdG8gZG8gYSBkYXlsaWdodC1zYXZpbmdzIHN3aXRjaC4gKFNlZSBbRGF0ZVRpbWUuYWRkXSkuCiAqCiAqIERlc3BpdGUgdGhlIHNhbWUgbmFtZSwgYSBgRHVyYXRpb25gIG9iamVjdCBkb2VzIG5vdCBpbXBsZW1lbnQgIkR1cmF0aW9ucyIKICogYXMgc3BlY2lmaWVkIGJ5IElTTyA4NjAxLiBJbiBwYXJ0aWN1bGFyLCBhIGR1cmF0aW9uIG9iamVjdCBkb2VzIG5vdCBrZWVwCiAqIHRyYWNrIG9mIHRoZSBpbmRpdmlkdWFsbHkgcHJvdmlkZWQgbWVtYmVycyAoc3VjaCBhcyAiZGF5cyIgb3IgImhvdXJzIiksIGJ1dAogKiBvbmx5IHVzZXMgdGhlc2UgYXJndW1lbnRzIHRvIGNvbXB1dGUgdGhlIGxlbmd0aCBvZiB0aGUgY29ycmVzcG9uZGluZyB0aW1lCiAqIGludGVydmFsLgogKgogKiBUbyBjcmVhdGUgYSBuZXcgRHVyYXRpb24gb2JqZWN0LCB1c2UgdGhpcyBjbGFzcydzIHNpbmdsZSBjb25zdHJ1Y3RvcgogKiBnaXZpbmcgdGhlIGFwcHJvcHJpYXRlIGFyZ3VtZW50czoKICogYGBgZGFydAogKiBEdXJhdGlvbiBmYXN0ZXN0TWFyYXRob24gPSBuZXcgRHVyYXRpb24oaG91cnM6MiwgbWludXRlczozLCBzZWNvbmRzOjIpOwogKiBgYGAKICogVGhlIFtEdXJhdGlvbl0gaXMgdGhlIHN1bSBvZiBhbGwgaW5kaXZpZHVhbCBwYXJ0cy4KICogVGhpcyBtZWFucyB0aGF0IGluZGl2aWR1YWwgcGFydHMgY2FuIGJlIGxhcmdlciB0aGFuIHRoZSBuZXh0LWJpZ2dlciB1bml0LgogKiBGb3IgZXhhbXBsZSwgW2luTWludXRlc10gY2FuIGJlIGdyZWF0ZXIgdGhhbiA1OS4KICogYGBgZGFydAogKiBhc3NlcnQoZmFzdGVzdE1hcmF0aG9uLmluTWludXRlcyA9PSAxMjMpOwogKiBgYGAKICogQWxsIGluZGl2aWR1YWwgcGFydHMgYXJlIGFsbG93ZWQgdG8gYmUgbmVnYXRpdmUuCiAqCiAqIFVzZSBvbmUgb2YgdGhlIHByb3BlcnRpZXMsIHN1Y2ggYXMgW2luRGF5c10sCiAqIHRvIHJldHJpZXZlIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBEdXJhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIHRpbWUgdW5pdC4KICogTm90ZSB0aGF0IHRoZSByZXR1cm5lZCB2YWx1ZSBpcyByb3VuZGVkIGRvd24uCiAqIEZvciBleGFtcGxlLAogKiBgYGBkYXJ0CiAqIER1cmF0aW9uIGFMb25nV2Vla2VuZCA9IG5ldyBEdXJhdGlvbihob3Vyczo4OCk7CiAqIGFzc2VydChhTG9uZ1dlZWtlbmQuaW5EYXlzID09IDMpOwogKiBgYGAKICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNvbGxlY3Rpb24gb2YgYXJpdGhtZXRpYwogKiBhbmQgY29tcGFyaXNvbiBvcGVyYXRvcnMsCiAqIHBsdXMgYSBzZXQgb2YgY29uc3RhbnRzIHVzZWZ1bCBmb3IgY29udmVydGluZyB0aW1lIHVuaXRzLgogKgogKiBTZWUgW0RhdGVUaW1lXSB0byByZXByZXNlbnQgYSBwb2ludCBpbiB0aW1lLgogKiBTZWUgW1N0b3B3YXRjaF0gdG8gbWVhc3VyZSB0aW1lLXNwYW5zLgogKi8KY2xhc3MgRHVyYXRpb24gaW1wbGVtZW50cyBDb21wYXJhYmxlPER1cmF0aW9uPiB7CiAgc3RhdGljIGNvbnN0IGludCBtaWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZCA9IDEwMDA7CiAgc3RhdGljIGNvbnN0IGludCBtaWxsaXNlY29uZHNQZXJTZWNvbmQgPSAxMDAwOwogIHN0YXRpYyBjb25zdCBpbnQgc2Vjb25kc1Blck1pbnV0ZSA9IDYwOwogIHN0YXRpYyBjb25zdCBpbnQgbWludXRlc1BlckhvdXIgPSA2MDsKICBzdGF0aWMgY29uc3QgaW50IGhvdXJzUGVyRGF5ID0gMjQ7CgogIHN0YXRpYyBjb25zdCBpbnQgbWljcm9zZWNvbmRzUGVyU2Vjb25kID0KICAgICAgbWljcm9zZWNvbmRzUGVyTWlsbGlzZWNvbmQgKiBtaWxsaXNlY29uZHNQZXJTZWNvbmQ7CiAgc3RhdGljIGNvbnN0IGludCBtaWNyb3NlY29uZHNQZXJNaW51dGUgPQogICAgICBtaWNyb3NlY29uZHNQZXJTZWNvbmQgKiBzZWNvbmRzUGVyTWludXRlOwogIHN0YXRpYyBjb25zdCBpbnQgbWljcm9zZWNvbmRzUGVySG91ciA9IG1pY3Jvc2Vjb25kc1Blck1pbnV0ZSAqIG1pbnV0ZXNQZXJIb3VyOwogIHN0YXRpYyBjb25zdCBpbnQgbWljcm9zZWNvbmRzUGVyRGF5ID0gbWljcm9zZWNvbmRzUGVySG91ciAqIGhvdXJzUGVyRGF5OwoKICBzdGF0aWMgY29uc3QgaW50IG1pbGxpc2Vjb25kc1Blck1pbnV0ZSA9CiAgICAgIG1pbGxpc2Vjb25kc1BlclNlY29uZCAqIHNlY29uZHNQZXJNaW51dGU7CiAgc3RhdGljIGNvbnN0IGludCBtaWxsaXNlY29uZHNQZXJIb3VyID0gbWlsbGlzZWNvbmRzUGVyTWludXRlICogbWludXRlc1BlckhvdXI7CiAgc3RhdGljIGNvbnN0IGludCBtaWxsaXNlY29uZHNQZXJEYXkgPSBtaWxsaXNlY29uZHNQZXJIb3VyICogaG91cnNQZXJEYXk7CgogIHN0YXRpYyBjb25zdCBpbnQgc2Vjb25kc1BlckhvdXIgPSBzZWNvbmRzUGVyTWludXRlICogbWludXRlc1BlckhvdXI7CiAgc3RhdGljIGNvbnN0IGludCBzZWNvbmRzUGVyRGF5ID0gc2Vjb25kc1BlckhvdXIgKiBob3Vyc1BlckRheTsKCiAgc3RhdGljIGNvbnN0IGludCBtaW51dGVzUGVyRGF5ID0gbWludXRlc1BlckhvdXIgKiBob3Vyc1BlckRheTsKCiAgc3RhdGljIGNvbnN0IER1cmF0aW9uIHplcm8gPSBEdXJhdGlvbihzZWNvbmRzOiAwKTsKCiAgLyoKICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBEdXJhdGlvbiBvYmplY3QgaW4gbWljcm9zZWNvbmRzLgogICAqLwogIGZpbmFsIGludCBfZHVyYXRpb247CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgRHVyYXRpb24gb2JqZWN0IHdob3NlIHZhbHVlCiAgICogaXMgdGhlIHN1bSBvZiBhbGwgaW5kaXZpZHVhbCBwYXJ0cy4KICAgKgogICAqIEluZGl2aWR1YWwgcGFydHMgY2FuIGJlIGxhcmdlciB0aGFuIHRoZSBuZXh0LWJpZ2dlciB1bml0LgogICAqIEZvciBleGFtcGxlLCBbaG91cnNdIGNhbiBiZSBncmVhdGVyIHRoYW4gMjMuCiAgICoKICAgKiBBbGwgaW5kaXZpZHVhbCBwYXJ0cyBhcmUgYWxsb3dlZCB0byBiZSBuZWdhdGl2ZS4KICAgKiBBbGwgYXJndW1lbnRzIGFyZSAwIGJ5IGRlZmF1bHQuCiAgICovCiAgY29uc3QgRHVyYXRpb24oCiAgICAgIHtpbnQgZGF5cyA9IDAsCiAgICAgIGludCBob3VycyA9IDAsCiAgICAgIGludCBtaW51dGVzID0gMCwKICAgICAgaW50IHNlY29uZHMgPSAwLAogICAgICBpbnQgbWlsbGlzZWNvbmRzID0gMCwKICAgICAgaW50IG1pY3Jvc2Vjb25kcyA9IDB9KQogICAgICA6IHRoaXMuX21pY3Jvc2Vjb25kcyhtaWNyb3NlY29uZHNQZXJEYXkgKiBkYXlzICsKICAgICAgICAgICAgbWljcm9zZWNvbmRzUGVySG91ciAqIGhvdXJzICsKICAgICAgICAgICAgbWljcm9zZWNvbmRzUGVyTWludXRlICogbWludXRlcyArCiAgICAgICAgICAgIG1pY3Jvc2Vjb25kc1BlclNlY29uZCAqIHNlY29uZHMgKwogICAgICAgICAgICBtaWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZCAqIG1pbGxpc2Vjb25kcyArCiAgICAgICAgICAgIG1pY3Jvc2Vjb25kcyk7CgogIC8vIEZhc3QgcGF0aCBpbnRlcm5hbCBkaXJlY3QgY29uc3RydWN0b3IgdG8gYXZvaWRzIHRoZSBvcHRpb25hbCBhcmd1bWVudHMgYW5kCiAgLy8gW19taWNyb3NlY29uZHNdIHJlY29tcHV0YXRpb24uCiAgY29uc3QgRHVyYXRpb24uX21pY3Jvc2Vjb25kcyh0aGlzLl9kdXJhdGlvbik7CgogIC8qKgogICAqIEFkZHMgdGhpcyBEdXJhdGlvbiBhbmQgW290aGVyXSBhbmQKICAgKiByZXR1cm5zIHRoZSBzdW0gYXMgYSBuZXcgRHVyYXRpb24gb2JqZWN0LgogICAqLwogIER1cmF0aW9uIG9wZXJhdG9yICsoRHVyYXRpb24gb3RoZXIpIHsKICAgIHJldHVybiBEdXJhdGlvbi5fbWljcm9zZWNvbmRzKF9kdXJhdGlvbiArIG90aGVyLl9kdXJhdGlvbik7CiAgfQoKICAvKioKICAgKiBTdWJ0cmFjdHMgW290aGVyXSBmcm9tIHRoaXMgRHVyYXRpb24gYW5kCiAgICogcmV0dXJucyB0aGUgZGlmZmVyZW5jZSBhcyBhIG5ldyBEdXJhdGlvbiBvYmplY3QuCiAgICovCiAgRHVyYXRpb24gb3BlcmF0b3IgLShEdXJhdGlvbiBvdGhlcikgewogICAgcmV0dXJuIER1cmF0aW9uLl9taWNyb3NlY29uZHMoX2R1cmF0aW9uIC0gb3RoZXIuX2R1cmF0aW9uKTsKICB9CgogIC8qKgogICAqIE11bHRpcGxpZXMgdGhpcyBEdXJhdGlvbiBieSB0aGUgZ2l2ZW4gW2ZhY3Rvcl0gYW5kIHJldHVybnMgdGhlIHJlc3VsdAogICAqIGFzIGEgbmV3IER1cmF0aW9uIG9iamVjdC4KICAgKgogICAqIE5vdGUgdGhhdCB3aGVuIFtmYWN0b3JdIGlzIGEgZG91YmxlLCBhbmQgdGhlIGR1cmF0aW9uIGlzIGdyZWF0ZXIgdGhhbgogICAqIDUzIGJpdHMsIHByZWNpc2lvbiBpcyBsb3N0IGJlY2F1c2Ugb2YgZG91YmxlLXByZWNpc2lvbiBhcml0aG1ldGljLgogICAqLwogIER1cmF0aW9uIG9wZXJhdG9yICoobnVtIGZhY3RvcikgewogICAgcmV0dXJuIER1cmF0aW9uLl9taWNyb3NlY29uZHMoKF9kdXJhdGlvbiAqIGZhY3Rvcikucm91bmQoKSk7CiAgfQoKICAvKioKICAgKiBEaXZpZGVzIHRoaXMgRHVyYXRpb24gYnkgdGhlIGdpdmVuIFtxdW90aWVudF0gYW5kIHJldHVybnMgdGhlIHRydW5jYXRlZAogICAqIHJlc3VsdCBhcyBhIG5ldyBEdXJhdGlvbiBvYmplY3QuCiAgICoKICAgKiBUaHJvd3MgYW4gW0ludGVnZXJEaXZpc2lvbkJ5WmVyb0V4Y2VwdGlvbl0gaWYgW3F1b3RpZW50XSBpcyBgMGAuCiAgICovCiAgRHVyYXRpb24gb3BlcmF0b3Igfi8oaW50IHF1b3RpZW50KSB7CiAgICAvLyBCeSBkb2luZyB0aGUgY2hlY2sgaGVyZSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gIn4vIiBiZWxvdyB3ZSBnZXQgdGhlCiAgICAvLyBleGNlcHRpb24gZXZlbiB3aXRoIGRhcnQyanMuCiAgICBpZiAocXVvdGllbnQgPT0gMCkgdGhyb3cgSW50ZWdlckRpdmlzaW9uQnlaZXJvRXhjZXB0aW9uKCk7CiAgICByZXR1cm4gRHVyYXRpb24uX21pY3Jvc2Vjb25kcyhfZHVyYXRpb24gfi8gcXVvdGllbnQpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24KICAgKiBpcyBsZXNzIHRoYW4gdGhlIHZhbHVlIG9mIFtvdGhlcl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA8KER1cmF0aW9uIG90aGVyKSA9PiB0aGlzLl9kdXJhdGlvbiA8IG90aGVyLl9kdXJhdGlvbjsKCiAgLyoqCiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24KICAgKiBpcyBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mIFtvdGhlcl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA+KER1cmF0aW9uIG90aGVyKSA9PiB0aGlzLl9kdXJhdGlvbiA+IG90aGVyLl9kdXJhdGlvbjsKCiAgLyoqCiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24KICAgKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIFtvdGhlcl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA8PShEdXJhdGlvbiBvdGhlcikgPT4gdGhpcy5fZHVyYXRpb24gPD0gb3RoZXIuX2R1cmF0aW9uOwoKICAvKioKICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgb2YgdGhpcyBEdXJhdGlvbgogICAqIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgdmFsdWUgb2YgW290aGVyXS4KICAgKi8KICBib29sIG9wZXJhdG9yID49KER1cmF0aW9uIG90aGVyKSA9PiB0aGlzLl9kdXJhdGlvbiA+PSBvdGhlci5fZHVyYXRpb247CgogIC8qKgogICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3aG9sZSBkYXlzIHNwYW5uZWQgYnkgdGhpcyBEdXJhdGlvbi4KICAgKi8KICBpbnQgZ2V0IGluRGF5cyA9PiBfZHVyYXRpb24gfi8gRHVyYXRpb24ubWljcm9zZWNvbmRzUGVyRGF5OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2hvbGUgaG91cnMgc3Bhbm5lZCBieSB0aGlzIER1cmF0aW9uLgogICAqCiAgICogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSBncmVhdGVyIHRoYW4gMjMuCiAgICovCiAgaW50IGdldCBpbkhvdXJzID0+IF9kdXJhdGlvbiB+LyBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJIb3VyOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2hvbGUgbWludXRlcyBzcGFubmVkIGJ5IHRoaXMgRHVyYXRpb24uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIGdyZWF0ZXIgdGhhbiA1OS4KICAgKi8KICBpbnQgZ2V0IGluTWludXRlcyA9PiBfZHVyYXRpb24gfi8gRHVyYXRpb24ubWljcm9zZWNvbmRzUGVyTWludXRlOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2hvbGUgc2Vjb25kcyBzcGFubmVkIGJ5IHRoaXMgRHVyYXRpb24uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIGdyZWF0ZXIgdGhhbiA1OS4KICAgKi8KICBpbnQgZ2V0IGluU2Vjb25kcyA9PiBfZHVyYXRpb24gfi8gRHVyYXRpb24ubWljcm9zZWNvbmRzUGVyU2Vjb25kOwoKICAvKioKICAgKiBSZXR1cm5zIG51bWJlciBvZiB3aG9sZSBtaWxsaXNlY29uZHMgc3Bhbm5lZCBieSB0aGlzIER1cmF0aW9uLgogICAqCiAgICogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSBncmVhdGVyIHRoYW4gOTk5LgogICAqLwogIGludCBnZXQgaW5NaWxsaXNlY29uZHMgPT4gX2R1cmF0aW9uIH4vIER1cmF0aW9uLm1pY3Jvc2Vjb25kc1Blck1pbGxpc2Vjb25kOwoKICAvKioKICAgKiBSZXR1cm5zIG51bWJlciBvZiB3aG9sZSBtaWNyb3NlY29uZHMgc3Bhbm5lZCBieSB0aGlzIER1cmF0aW9uLgogICAqLwogIGludCBnZXQgaW5NaWNyb3NlY29uZHMgPT4gX2R1cmF0aW9uOwoKICAvKioKICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIFtEdXJhdGlvbl0gaGFzIHRoZSBzYW1lIHZhbHVlIGFzIFtvdGhlcl0uCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSA9PgogICAgICBvdGhlciBpcyBEdXJhdGlvbiAmJiBfZHVyYXRpb24gPT0gb3RoZXIuaW5NaWNyb3NlY29uZHM7CgogIGludCBnZXQgaGFzaENvZGUgPT4gX2R1cmF0aW9uLmhhc2hDb2RlOwoKICAvKioKICAgKiBDb21wYXJlcyB0aGlzIFtEdXJhdGlvbl0gdG8gW290aGVyXSwgcmV0dXJuaW5nIHplcm8gaWYgdGhlIHZhbHVlcyBhcmUgZXF1YWwuCiAgICoKICAgKiBSZXR1cm5zIGEgbmVnYXRpdmUgaW50ZWdlciBpZiB0aGlzIGBEdXJhdGlvbmAgaXMgc2hvcnRlciB0aGFuCiAgICogW290aGVyXSwgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIGl0IGlzIGxvbmdlci4KICAgKgogICAqIEEgbmVnYXRpdmUgYER1cmF0aW9uYCBpcyBhbHdheXMgY29uc2lkZXJlZCBzaG9ydGVyIHRoYW4gYSBwb3NpdGl2ZSBvbmUuCiAgICoKICAgKiBJdCBpcyBhbHdheXMgdGhlIGNhc2UgdGhhdCBgZHVyYXRpb24xLmNvbXBhcmVUbyhkdXJhdGlvbjIpIDwgMGAgaWZmCiAgICogYChzb21lRGF0ZSArIGR1cmF0aW9uMSkuY29tcGFyZVRvKHNvbWVEYXRlICsgZHVyYXRpb24yKSA8IDBgLgogICAqLwogIGludCBjb21wYXJlVG8oRHVyYXRpb24gb3RoZXIpID0+IF9kdXJhdGlvbi5jb21wYXJlVG8ob3RoZXIuX2R1cmF0aW9uKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGBEdXJhdGlvbmAuCiAgICoKICAgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBtaWNyb3NlY29uZHMsIGluIHRoZQogICAqIGZvbGxvd2luZyBmb3JtYXQ6IGBISDpNTTpTUy5tbW1tbW1gLiBGb3IgZXhhbXBsZSwKICAgKgogICAqICAgICB2YXIgZCA9IG5ldyBEdXJhdGlvbihkYXlzOjEsIGhvdXJzOjEsIG1pbnV0ZXM6MzMsIG1pY3Jvc2Vjb25kczogNTAwKTsKICAgKiAgICAgZC50b1N0cmluZygpOyAgLy8gIjI1OjMzOjAwLjAwMDUwMCIKICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmcgc2l4RGlnaXRzKGludCBuKSB7CiAgICAgIGlmIChuID49IDEwMDAwMCkgcmV0dXJuICIkbiI7CiAgICAgIGlmIChuID49IDEwMDAwKSByZXR1cm4gIjAkbiI7CiAgICAgIGlmIChuID49IDEwMDApIHJldHVybiAiMDAkbiI7CiAgICAgIGlmIChuID49IDEwMCkgcmV0dXJuICIwMDAkbiI7CiAgICAgIGlmIChuID49IDEwKSByZXR1cm4gIjAwMDAkbiI7CiAgICAgIHJldHVybiAiMDAwMDAkbiI7CiAgICB9CgogICAgU3RyaW5nIHR3b0RpZ2l0cyhpbnQgbikgewogICAgICBpZiAobiA+PSAxMCkgcmV0dXJuICIkbiI7CiAgICAgIHJldHVybiAiMCRuIjsKICAgIH0KCiAgICBpZiAoaW5NaWNyb3NlY29uZHMgPCAwKSB7CiAgICAgIHJldHVybiAiLSR7LXRoaXN9IjsKICAgIH0KICAgIFN0cmluZyB0d29EaWdpdE1pbnV0ZXMgPSB0d29EaWdpdHMoaW5NaW51dGVzLnJlbWFpbmRlcihtaW51dGVzUGVySG91cikpOwogICAgU3RyaW5nIHR3b0RpZ2l0U2Vjb25kcyA9IHR3b0RpZ2l0cyhpblNlY29uZHMucmVtYWluZGVyKHNlY29uZHNQZXJNaW51dGUpKTsKICAgIFN0cmluZyBzaXhEaWdpdFVzID0KICAgICAgICBzaXhEaWdpdHMoaW5NaWNyb3NlY29uZHMucmVtYWluZGVyKG1pY3Jvc2Vjb25kc1BlclNlY29uZCkpOwogICAgcmV0dXJuICIkaW5Ib3VyczokdHdvRGlnaXRNaW51dGVzOiR0d29EaWdpdFNlY29uZHMuJHNpeERpZ2l0VXMiOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYER1cmF0aW9uYCBpcyBuZWdhdGl2ZS4KICAgKgogICAqIEEgbmVnYXRpdmUgYER1cmF0aW9uYCByZXByZXNlbnRzIHRoZSBkaWZmZXJlbmNlIGZyb20gYSBsYXRlciB0aW1lIHRvIGFuCiAgICogZWFybGllciB0aW1lLgogICAqLwogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgPT4gX2R1cmF0aW9uIDwgMDsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBgRHVyYXRpb25gIHJlcHJlc2VudGluZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcwogICAqIGBEdXJhdGlvbmAuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgYER1cmF0aW9uYCBoYXMgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoaXMgb25lLCBidXQgaXMgYWx3YXlzCiAgICogcG9zaXRpdmUuCiAgICovCiAgRHVyYXRpb24gYWJzKCkgPT4gRHVyYXRpb24uX21pY3Jvc2Vjb25kcyhfZHVyYXRpb24uYWJzKCkpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGBEdXJhdGlvbmAgcmVwcmVzZW50aW5nIHRoaXMgYER1cmF0aW9uYCBuZWdhdGVkLgogICAqCiAgICogVGhlIHJldHVybmVkIGBEdXJhdGlvbmAgaGFzIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGlzIG9uZSwgYnV0IHdpbGwgaGF2ZSB0aGUKICAgKiBvcHBvc2l0ZSBzaWduIG9mIHRoaXMgb25lLgogICAqLwogIC8vIFVzaW5nIHN1YnRyYWN0aW9uIGhlbHBzIGRhcnQyanMgYXZvaWQgbmVnYXRpdmUgemVyb3MuCiAgRHVyYXRpb24gb3BlcmF0b3IgLSgpID0+IER1cmF0aW9uLl9taWNyb3NlY29uZHMoMCAtIF9kdXJhdGlvbik7Cn0KgScATk48ARMBBEgDT0sMA0tITQNNTE9NDQNIJQtLBzZNNAstBzQDME0xEAszJQcyHT0DMCoEMTYxKiglASs6KzBRSwErMFFLAUdBAUEBNQEFOAYXAQYvKQU/MgU2JQYSFRUXFxwdNyouLjgbAVAkMAEGKC8GKEAEAQYuNgYoQAQBBksfBUtIBiRBBAEGTSYFRgYnSyQ/OgQBBjIoBkcBBjIrBkcBBjI0BkkBBjI3BkkBBkAGPgEGQQUwBkABBkMFMAZEAQZDBTAGRAEGRAUxBk4BBkQGJwEGRgYlPgEqAQZSBUM1BU0FSUMGSQEGOQVNNwVPLQYWHiQkJCQkGAYBHiAUBgEeGgZNTxhERQQBBjIFTRMGKAEGRhEFTA8GPQEGRAVQIAY7QgIBF2RhcnQ6Y29yZS9kdXJhdGlvbi5kYXJ0LG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL2Vycm9ycy5kYXJ0wABL/S8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBFcnJvciBvYmplY3RzIHRocm93biBpbiB0aGUgY2FzZSBvZiBhIHByb2dyYW0gZmFpbHVyZS4KICoKICogQW4gYEVycm9yYCBvYmplY3QgcmVwcmVzZW50cyBhIHByb2dyYW0gZmFpbHVyZSB0aGF0IHRoZSBwcm9ncmFtbWVyCiAqIHNob3VsZCBoYXZlIGF2b2lkZWQuCiAqCiAqIEV4YW1wbGVzIGluY2x1ZGUgY2FsbGluZyBhIGZ1bmN0aW9uIHdpdGggaW52YWxpZCBhcmd1bWVudHMsCiAqIG9yIGV2ZW4gd2l0aCB0aGUgd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cywKICogb3IgY2FsbGluZyBpdCBhdCBhIHRpbWUgd2hlbiBpdCBpcyBub3QgYWxsb3dlZC4KICoKICogVGhlc2UgYXJlIG5vdCBlcnJvcnMgdGhhdCBhIGNhbGxlciBzaG91bGQgZXhwZWN0IG9yIGNhdGNoIC0KICogaWYgdGhleSBvY2N1ciwgdGhlIHByb2dyYW0gaXMgZXJyb25lb3VzLAogKiBhbmQgdGVybWluYXRpbmcgdGhlIHByb2dyYW0gbWF5IGJlIHRoZSBzYWZlc3QgcmVzcG9uc2UuCiAqCiAqIFdoZW4gZGVjaWRpbmcgdGhhdCBhIGZ1bmN0aW9uIHRocm93cyBhbiBlcnJvciwKICogdGhlIGNvbmRpdGlvbnMgd2hlcmUgaXQgaGFwcGVucyBzaG91bGQgYmUgY2xlYXJseSBkZXNjcmliZWQsCiAqIGFuZCB0aGV5IHNob3VsZCBiZSBkZXRlY3RhYmxlIGFuZCBwcmVkaWN0YWJsZSwKICogc28gdGhlIHByb2dyYW1tZXIgdXNpbmcgdGhlIGZ1bmN0aW9uIGNhbiBhdm9pZCB0cmlnZ2VyaW5nIHRoZSBlcnJvci4KICoKICogU3VjaCBkZXNjcmlwdGlvbnMgb2Z0ZW4gdXNlcyB3b3JkcyBsaWtlCiAqICJtdXN0IiBvciAibXVzdCBub3QiIHRvIGRlc2NyaWJlIHRoZSBjb25kaXRpb24sCiAqIGFuZCBpZiB5b3Ugc2VlIHdvcmRzIGxpa2UgdGhhdCBpbiBhIGZ1bmN0aW9uJ3MgZG9jdW1lbnRhdGlvbiwKICogdGhlbiBub3Qgc2F0aXNmeWluZyB0aGUgcmVxdWlyZW1lbnQKICogaXMgdmVyeSBsaWtlbHkgdG8gY2F1c2UgYW4gZXJyb3IgdG8gYmUgdGhyb3duLgogKgogKiBFeGFtcGxlIChmcm9tIFtTdHJpbmcuY29udGFpbnNdKToKICoKICogICAgICAgIGBzdGFydEluZGV4YCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gYGxlbmd0aGAuCiAqCiAqIEluIHRoaXMgY2FzZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYHN0YXJ0SW5kZXhgIGlzIG5lZ2F0aXZlCiAqIG9yIHRvbyBsYXJnZS4KICoKICogSWYgdGhlIGNvbmRpdGlvbnMgYXJlIG5vdCBkZXRlY3RhYmxlIGJlZm9yZSBjYWxsaW5nIGEgZnVuY3Rpb24sCiAqIHRoZSBjYWxsZWQgZnVuY3Rpb24gc2hvdWxkIG5vdCB0aHJvdyBhbiBgRXJyb3JgLgogKiBJdCBtYXkgc3RpbGwgdGhyb3cgYSB2YWx1ZSwKICogYnV0IHRoZSBjYWxsZXIgd2lsbCBoYXZlIHRvIGNhdGNoIHRoZSB0aHJvd24gdmFsdWUsCiAqIGVmZmVjdGl2ZWx5IG1ha2luZyBpdCBhbiBhbHRlcm5hdGl2ZSByZXN1bHQgcmF0aGVyIHRoYW4gYW4gZXJyb3IuCiAqIFRoZSB0aHJvd24gb2JqZWN0IGNhbiBjaG9vc2UgdG8gaW1wbGVtZW50IFtFeGNlcHRpb25dCiAqIHRvIGRvY3VtZW50IHRoYXQgaXQgcmVwcmVzZW50cyBhbiBleGNlcHRpb25hbCwgYnV0IG5vdCBlcnJvbmVvdXMsIG9jY3VycmVuY2UsCiAqIGJ1dCBpdCBoYXMgbm8gb3RoZXIgZWZmZWN0IHRoYW4gZG9jdW1lbnRhdGlvbi4KICoKICogQWxsIG5vbi1gbnVsbGAgdmFsdWVzIGNhbiBiZSB0aHJvd24gaW4gRGFydC4KICogT2JqZWN0cyBleHRlbmRpbmcgYEVycm9yYCBhcmUgaGFuZGxlZCBzcGVjaWFsbHk6CiAqIFRoZSBmaXJzdCB0aW1lIHRoZXkgYXJlIHRocm93biwKICogdGhlIHN0YWNrIHRyYWNlIGF0IHRoZSB0aHJvdyBwb2ludCBpcyByZWNvcmRlZAogKiBhbmQgc3RvcmVkIGluIHRoZSBlcnJvciBvYmplY3QuCiAqIEl0IGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgdGhlIFtzdGFja1RyYWNlXSBnZXR0ZXIuCiAqIEFuIGVycm9yIG9iamVjdCB0aGF0IG1lcmVseSBpbXBsZW1lbnRzIGBFcnJvcmAsIGFuZCBkb2Vzbid0IGV4dGVuZCBpdCwKICogd2lsbCBub3Qgc3RvcmUgdGhlIHN0YWNrIHRyYWNlIGF1dG9tYXRpY2FsbHkuCiAqCiAqIEVycm9yIG9iamVjdHMgYXJlIGFsc28gdXNlZCBmb3Igc3lzdGVtIHdpZGUgZmFpbHVyZXMKICogbGlrZSBzdGFjayBvdmVyZmxvdyBvciBhbiBvdXQtb2YtbWVtb3J5IHNpdHVhdGlvbi4KICoKICogU2luY2UgZXJyb3JzIGFyZSBub3QgY3JlYXRlZCB0byBiZSBjYXVnaHQsCiAqIHRoZXJlIGlzIG5vIG5lZWQgZm9yIHN1YmNsYXNzZXMgdG8gZGlzdGluZ3Vpc2ggdGhlIGVycm9ycy4KICogSW5zdGVhZCBzdWJjbGFzc2VzIGhhdmUgYmVlbiBjcmVhdGVkIGluIG9yZGVyIHRvIG1ha2UgZ3JvdXBzCiAqIG9mIHJlbGF0ZWQgZXJyb3JzIGVhc3kgdG8gY3JlYXRlIHdpdGggY29uc2lzdGVudCBlcnJvciBtZXNzYWdlcy4KICogRm9yIGV4YW1wbGUsIHRoZSBbU3RyaW5nLmNvbnRhaW5zXSBtZXRob2Qgd2lsbCB1c2UgYSBbUmFuZ2VFcnJvcl0KICogaWYgaXRzIGBzdGFydEluZGV4YCBpc24ndCBpbiB0aGUgcmFuZ2UgYDAuLmxlbmd0aGAsCiAqIHdoaWNoIGlzIGVhc2lseSBjcmVhdGVkIGJ5IGBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydEluZGV4LCAwLCBsZW5ndGgpYC4KICovCmNsYXNzIEVycm9yIHsKICBFcnJvcigpOyAvLyBQcmV2ZW50IHVzZSBhcyBtaXhpbi4KCiAgLyoqCiAgICogU2FmZWx5IGNvbnZlcnQgYSB2YWx1ZSB0byBhIFtTdHJpbmddIGRlc2NyaXB0aW9uLgogICAqCiAgICogVGhlIGNvbnZlcnNpb24gaXMgZ3VhcmFudGVlZCB0byBub3QgdGhyb3csIHNvIGl0IHdvbid0IHVzZSB0aGUgb2JqZWN0J3MKICAgKiB0b1N0cmluZyBtZXRob2QuCiAgICovCiAgc3RhdGljIFN0cmluZyBzYWZlVG9TdHJpbmcoT2JqZWN0IG9iamVjdCkgewogICAgaWYgKG9iamVjdCBpcyBudW0gfHwgb2JqZWN0IGlzIGJvb2wgfHwgbnVsbCA9PSBvYmplY3QpIHsKICAgICAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwogICAgfQogICAgaWYgKG9iamVjdCBpcyBTdHJpbmcpIHsKICAgICAgcmV0dXJuIF9zdHJpbmdUb1NhZmVTdHJpbmcob2JqZWN0KTsKICAgIH0KICAgIHJldHVybiBfb2JqZWN0VG9TdHJpbmcob2JqZWN0KTsKICB9CgogIC8qKiBDb252ZXJ0IHN0cmluZyB0byBhIHZhbGlkIHN0cmluZyBsaXRlcmFsIHdpdGggbm8gY29udHJvbCBjaGFyYWN0ZXJzLiAqLwogIGV4dGVybmFsIHN0YXRpYyBTdHJpbmcgX3N0cmluZ1RvU2FmZVN0cmluZyhTdHJpbmcgc3RyaW5nKTsKCiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBfb2JqZWN0VG9TdHJpbmcoT2JqZWN0IG9iamVjdCk7CgogIGV4dGVybmFsIFN0YWNrVHJhY2UgZ2V0IHN0YWNrVHJhY2U7Cn0KCi8qKgogKiBFcnJvciB0aHJvd24gYnkgdGhlIHJ1bnRpbWUgc3lzdGVtIHdoZW4gYW4gYXNzZXJ0IHN0YXRlbWVudCBmYWlscy4KICovCmNsYXNzIEFzc2VydGlvbkVycm9yIGV4dGVuZHMgRXJyb3IgewogIC8qKiBNZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGFzc2VydGlvbiBlcnJvci4gKi8KICBmaW5hbCBPYmplY3QgbWVzc2FnZTsKICBBc3NlcnRpb25FcnJvcihbdGhpcy5tZXNzYWdlXSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkFzc2VydGlvbiBmYWlsZWQiOwp9CgovKioKICogRXJyb3IgdGhyb3duIGJ5IHRoZSBydW50aW1lIHN5c3RlbSB3aGVuIGEgdHlwZSBhc3NlcnRpb24gZmFpbHMuCiAqLwpjbGFzcyBUeXBlRXJyb3IgZXh0ZW5kcyBBc3NlcnRpb25FcnJvciB7fQoKLyoqCiAqIEVycm9yIHRocm93biBieSB0aGUgcnVudGltZSBzeXN0ZW0gd2hlbiBhIGNhc3Qgb3BlcmF0aW9uIGZhaWxzLgogKi8KY2xhc3MgQ2FzdEVycm9yIGV4dGVuZHMgRXJyb3Ige30KCi8qKgogKiBFcnJvciB0aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHRocm93IFs6bnVsbDpdLgogKi8KY2xhc3MgTnVsbFRocm93bkVycm9yIGV4dGVuZHMgRXJyb3IgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBOdWxsVGhyb3duRXJyb3IoKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiVGhyb3cgb2YgbnVsbC4iOwp9CgovKioKICogRXJyb3IgdGhyb3duIHdoZW4gYSBmdW5jdGlvbiBpcyBwYXNzZWQgYW4gdW5hY2NlcHRhYmxlIGFyZ3VtZW50LgogKi8KY2xhc3MgQXJndW1lbnRFcnJvciBleHRlbmRzIEVycm9yIHsKICAvKiogV2hldGhlciB2YWx1ZSB3YXMgcHJvdmlkZWQuICovCiAgZmluYWwgYm9vbCBfaGFzVmFsdWU7CiAgLyoqIFRoZSBpbnZhbGlkIHZhbHVlLiAqLwogIGZpbmFsIGludmFsaWRWYWx1ZTsKICAvKiogTmFtZSBvZiB0aGUgaW52YWxpZCBhcmd1bWVudCwgaWYgYXZhaWxhYmxlLiAqLwogIGZpbmFsIFN0cmluZyBuYW1lOwogIC8qKiBNZXNzYWdlIGRlc2NyaWJpbmcgdGhlIHByb2JsZW0uICovCiAgZmluYWwgbWVzc2FnZTsKCiAgLyoqCiAgICogVGhlIFttZXNzYWdlXSBkZXNjcmliZXMgdGhlIGVycm9uZW91cyBhcmd1bWVudC4KICAgKgogICAqIEV4aXN0aW5nIGNvZGUgbWF5IGJlIHVzaW5nIGBtZXNzYWdlYCB0byBob2xkIHRoZSBpbnZhbGlkIHZhbHVlLgogICAqIElmIHRoZSBgbWVzc2FnZWAgaXMgbm90IGEgW1N0cmluZ10sIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSB2YWx1ZSBpbnN0ZWFkCiAgICogb2YgYSBtZXNzYWdlLgogICAqLwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBBcmd1bWVudEVycm9yKFt0aGlzLm1lc3NhZ2VdKQogICAgICA6IGludmFsaWRWYWx1ZSA9IG51bGwsCiAgICAgICAgX2hhc1ZhbHVlID0gZmFsc2UsCiAgICAgICAgbmFtZSA9IG51bGw7CgogIC8qKgogICAqIENyZWF0ZXMgZXJyb3IgY29udGFpbmluZyB0aGUgaW52YWxpZCBbdmFsdWVdLgogICAqCiAgICogQSBtZXNzYWdlIGlzIGJ1aWx0IGJ5IHN1ZmZpeGluZyB0aGUgW21lc3NhZ2VdIGFyZ3VtZW50IHdpdGgKICAgKiB0aGUgW25hbWVdIGFyZ3VtZW50IChpZiBwcm92aWRlZCkgYW5kIHRoZSB2YWx1ZS4gRXhhbXBsZQogICAqCiAgICogICAgIkludmFsaWQgYXJndW1lbnQgKGZvbyk6IG51bGwiCiAgICoKICAgKiBUaGUgYG5hbWVgIHNob3VsZCBtYXRjaCB0aGUgYXJndW1lbnQgbmFtZSBvZiB0aGUgZnVuY3Rpb24sIGJ1dCBpZgogICAqIHRoZSBmdW5jdGlvbiBpcyBhIG1ldGhvZCBpbXBsZW1lbnRpbmcgYW4gaW50ZXJmYWNlLCBhbmQgaXRzIGFyZ3VtZW50CiAgICogbmFtZXMgZGlmZmVyIGZyb20gdGhlIGludGVyZmFjZSwgaXQgbWlnaHQgYmUgbW9yZSB1c2VmdWwgdG8gdXNlIHRoZQogICAqIGludGVyZmFjZSBtZXRob2QncyBhcmd1bWVudCBuYW1lIChvciBqdXN0IHJlbmFtZSBhcmd1bWVudHMgdG8gbWF0Y2gpLgogICAqLwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBBcmd1bWVudEVycm9yLnZhbHVlKHZhbHVlLCBbdGhpcy5uYW1lLCB0aGlzLm1lc3NhZ2VdKQogICAgICA6IGludmFsaWRWYWx1ZSA9IHZhbHVlLAogICAgICAgIF9oYXNWYWx1ZSA9IHRydWU7CgogIC8qKgogICAqIENyZWF0ZSBhbiBhcmd1bWVudCBlcnJvciBmb3IgYSBgbnVsbGAgYXJndW1lbnQgdGhhdCBtdXN0IG5vdCBiZSBgbnVsbGAuCiAgICovCiAgQXJndW1lbnRFcnJvci5ub3ROdWxsKFt0aGlzLm5hbWVdKQogICAgICA6IF9oYXNWYWx1ZSA9IGZhbHNlLAogICAgICAgIG1lc3NhZ2UgPSAiTXVzdCBub3QgYmUgbnVsbCIsCiAgICAgICAgaW52YWxpZFZhbHVlID0gbnVsbDsKCiAgLyoqCiAgICogVGhyb3dzIGlmIFthcmd1bWVudF0gaXMgYG51bGxgLgogICAqLwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgdm9pZCBjaGVja05vdE51bGwoT2JqZWN0IGFyZ3VtZW50LCBbU3RyaW5nIG5hbWVdKSB7CiAgICBpZiAoYXJndW1lbnQgPT0gbnVsbCkgdGhyb3cgQXJndW1lbnRFcnJvci5ub3ROdWxsKG5hbWUpOwogIH0KCiAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdG9TdHJpbmcgb3ZlcnJpZGRlbiBpbiBzdWJjbGFzc2VzLgogIFN0cmluZyBnZXQgX2Vycm9yTmFtZSA9PiAiSW52YWxpZCBhcmd1bWVudCR7IV9oYXNWYWx1ZSA/ICIocykiIDogIiJ9IjsKICBTdHJpbmcgZ2V0IF9lcnJvckV4cGxhbmF0aW9uID0+ICIiOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmcgbmFtZVN0cmluZyA9ICIiOwogICAgaWYgKG5hbWUgIT0gbnVsbCkgewogICAgICBuYW1lU3RyaW5nID0gIiAoJG5hbWUpIjsKICAgIH0KICAgIHZhciBtZXNzYWdlID0gKHRoaXMubWVzc2FnZSA9PSBudWxsKSA/ICIiIDogIjogJHt0aGlzLm1lc3NhZ2V9IjsKICAgIFN0cmluZyBwcmVmaXggPSAiJF9lcnJvck5hbWUkbmFtZVN0cmluZyRtZXNzYWdlIjsKICAgIGlmICghX2hhc1ZhbHVlKSByZXR1cm4gcHJlZml4OwogICAgLy8gSWYgd2Uga25vdyB0aGUgaW52YWxpZCB2YWx1ZSwgd2UgY2FuIHRyeSB0byBkZXNjcmliZSB0aGUgcHJvYmxlbS4KICAgIFN0cmluZyBleHBsYW5hdGlvbiA9IF9lcnJvckV4cGxhbmF0aW9uOwogICAgU3RyaW5nIGVycm9yVmFsdWUgPSBFcnJvci5zYWZlVG9TdHJpbmcoaW52YWxpZFZhbHVlKTsKICAgIHJldHVybiAiJHByZWZpeCRleHBsYW5hdGlvbjogJGVycm9yVmFsdWUiOwogIH0KfQoKLyoqCiAqIEVycm9yIHRocm93biBkdWUgdG8gYW4gaW5kZXggYmVpbmcgb3V0c2lkZSBhIHZhbGlkIHJhbmdlLgogKi8KY2xhc3MgUmFuZ2VFcnJvciBleHRlbmRzIEFyZ3VtZW50RXJyb3IgewogIC8qKiBUaGUgbWluaW11bSB2YWx1ZSB0aGF0IFt2YWx1ZV0gaXMgYWxsb3dlZCB0byBhc3N1bWUuICovCiAgZmluYWwgbnVtIHN0YXJ0OwogIC8qKiBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IFt2YWx1ZV0gaXMgYWxsb3dlZCB0byBhc3N1bWUuICovCiAgZmluYWwgbnVtIGVuZDsKCiAgLy8gVE9ETyhscm4pOiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aXRoIHN0cmluZyB2YWx1ZXMuCiAgLy8gSXQgY3VycmVudGx5IGlzbid0IGluIGFsbCBjYXNlcy4KICAvKioKICAgKiBDcmVhdGUgYSBuZXcgW1JhbmdlRXJyb3JdIHdpdGggdGhlIGdpdmVuIFttZXNzYWdlXS4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgUmFuZ2VFcnJvcih2YXIgbWVzc2FnZSkKICAgICAgOiBzdGFydCA9IG51bGwsCiAgICAgICAgZW5kID0gbnVsbCwKICAgICAgICBzdXBlcihtZXNzYWdlKTsKCiAgLyoqCiAgICogQ3JlYXRlIGEgbmV3IFtSYW5nZUVycm9yXSB3aXRoIGEgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIFt2YWx1ZV0uCiAgICoKICAgKiBBbiBvcHRpb25hbCBbbmFtZV0gY2FuIHNwZWNpZnkgdGhlIGFyZ3VtZW50IG5hbWUgdGhhdCBoYXMgdGhlCiAgICogaW52YWxpZCB2YWx1ZSwgYW5kIHRoZSBbbWVzc2FnZV0gY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGVycm9yCiAgICogZGVzY3JpcHRpb24uCiAgICovCiAgUmFuZ2VFcnJvci52YWx1ZShudW0gdmFsdWUsIFtTdHJpbmcgbmFtZSwgU3RyaW5nIG1lc3NhZ2VdKQogICAgICA6IHN0YXJ0ID0gbnVsbCwKICAgICAgICBlbmQgPSBudWxsLAogICAgICAgIHN1cGVyLnZhbHVlKAogICAgICAgICAgICB2YWx1ZSwgbmFtZSwgKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIlZhbHVlIG5vdCBpbiByYW5nZSIpOwoKICAvKioKICAgKiBDcmVhdGUgYSBuZXcgW1JhbmdlRXJyb3JdIGZvciBhIHZhbHVlIGJlaW5nIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlLgogICAqCiAgICogVGhlIGFsbG93ZWQgcmFuZ2UgaXMgZnJvbSBbbWluVmFsdWVdIHRvIFttYXhWYWx1ZV0sIGluY2x1c2l2ZS4KICAgKiBJZiBgbWluVmFsdWVgIG9yIGBtYXhWYWx1ZWAgYXJlIGBudWxsYCwgdGhlIHJhbmdlIGlzIGluZmluaXRlIGluCiAgICogdGhhdCBkaXJlY3Rpb24uCiAgICoKICAgKiBGb3IgYSByYW5nZSBmcm9tIDAgdG8gdGhlIGxlbmd0aCBvZiBzb21ldGhpbmcsIGVuZCBleGNsdXNpdmUsIHVzZQogICAqIFtSYW5nZUVycm9yLmluZGV4XS4KICAgKgogICAqIEFuIG9wdGlvbmFsIFtuYW1lXSBjYW4gc3BlY2lmeSB0aGUgYXJndW1lbnQgbmFtZSB0aGF0IGhhcyB0aGUKICAgKiBpbnZhbGlkIHZhbHVlLCBhbmQgdGhlIFttZXNzYWdlXSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZXJyb3IKICAgKiBkZXNjcmlwdGlvbi4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgUmFuZ2VFcnJvci5yYW5nZShudW0gaW52YWxpZFZhbHVlLCBpbnQgbWluVmFsdWUsIGludCBtYXhWYWx1ZSwKICAgICAgW1N0cmluZyBuYW1lLCBTdHJpbmcgbWVzc2FnZV0pCiAgICAgIDogc3RhcnQgPSBtaW5WYWx1ZSwKICAgICAgICBlbmQgPSBtYXhWYWx1ZSwKICAgICAgICBzdXBlci52YWx1ZSgKICAgICAgICAgICAgaW52YWxpZFZhbHVlLCBuYW1lLCAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAiSW52YWxpZCB2YWx1ZSIpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IFtSYW5nZUVycm9yXSBzdGF0aW5nIHRoYXQgW2luZGV4XSBpcyBub3QgYSB2YWxpZCBpbmRleAogICAqIGludG8gW2luZGV4YWJsZV0uCiAgICoKICAgKiBBbiBvcHRpb25hbCBbbmFtZV0gY2FuIHNwZWNpZnkgdGhlIGFyZ3VtZW50IG5hbWUgdGhhdCBoYXMgdGhlCiAgICogaW52YWxpZCB2YWx1ZSwgYW5kIHRoZSBbbWVzc2FnZV0gY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGVycm9yCiAgICogZGVzY3JpcHRpb24uCiAgICoKICAgKiBUaGUgW2xlbmd0aF0gaXMgdGhlIGxlbmd0aCBvZiBbaW5kZXhhYmxlXSBhdCB0aGUgdGltZSBvZiB0aGUgZXJyb3IuCiAgICogSWYgYGxlbmd0aGAgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGluZGV4YWJsZS5sZW5ndGhgLgogICAqLwogIGZhY3RvcnkgUmFuZ2VFcnJvci5pbmRleChpbnQgaW5kZXgsIGR5bmFtaWMgaW5kZXhhYmxlLAogICAgICBbU3RyaW5nIG5hbWUsIFN0cmluZyBtZXNzYWdlLCBpbnQgbGVuZ3RoXSkgPSBJbmRleEVycm9yOwoKICAvKioKICAgKiBDaGVjayB0aGF0IGEgW3ZhbHVlXSBsaWVzIGluIGEgc3BlY2lmaWMgaW50ZXJ2YWwuCiAgICoKICAgKiBUaHJvd3MgaWYgW3ZhbHVlXSBpcyBub3QgaW4gdGhlIGludGVydmFsLgogICAqIFRoZSBpbnRlcnZhbCBpcyBmcm9tIFttaW5WYWx1ZV0gdG8gW21heFZhbHVlXSwgYm90aCBpbmNsdXNpdmUuCiAgICovCiAgc3RhdGljIHZvaWQgY2hlY2tWYWx1ZUluSW50ZXJ2YWwoaW50IHZhbHVlLCBpbnQgbWluVmFsdWUsIGludCBtYXhWYWx1ZSwKICAgICAgW1N0cmluZyBuYW1lLCBTdHJpbmcgbWVzc2FnZV0pIHsKICAgIGlmICh2YWx1ZSA8IG1pblZhbHVlIHx8IHZhbHVlID4gbWF4VmFsdWUpIHsKICAgICAgdGhyb3cgUmFuZ2VFcnJvci5yYW5nZSh2YWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlLCBuYW1lLCBtZXNzYWdlKTsKICAgIH0KICB9CgogIC8qKgogICAqIENoZWNrIHRoYXQgYSB2YWx1ZSBpcyBhIHZhbGlkIGluZGV4IGludG8gYW4gaW5kZXhhYmxlIG9iamVjdC4KICAgKgogICAqIFRocm93cyBpZiBbaW5kZXhdIGlzIG5vdCBhIHZhbGlkIGluZGV4IGludG8gW2luZGV4YWJsZV0uCiAgICoKICAgKiBBbiBpbmRleGFibGUgb2JqZWN0IGlzIG9uZSB0aGF0IGhhcyBhIGBsZW5ndGhgIGFuZCBhIGFuZCBpbmRleC1vcGVyYXRvcgogICAqIGBbXWAgdGhhdCBhY2NlcHRzIGFuIGluZGV4IGlmIGAwIDw9IGluZGV4IDwgbGVuZ3RoYC4KICAgKgogICAqIElmIFtsZW5ndGhdIGlzIHByb3ZpZGVkLCBpdCBpcyB1c2VkIGFzIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4YWJsZSBvYmplY3QsCiAgICogb3RoZXJ3aXNlIHRoZSBsZW5ndGggaXMgZm91bmQgYXMgYGluZGV4YWJsZS5sZW5ndGhgLgogICAqLwogIHN0YXRpYyB2b2lkIGNoZWNrVmFsaWRJbmRleChpbnQgaW5kZXgsIGR5bmFtaWMgaW5kZXhhYmxlLAogICAgICBbU3RyaW5nIG5hbWUsIGludCBsZW5ndGgsIFN0cmluZyBtZXNzYWdlXSkgewogICAgbGVuZ3RoID8/PSBpbmRleGFibGUubGVuZ3RoOwogICAgLy8gQ29tcGFyaW5nIHdpdGggYDBgIGFzIHJlY2VpdmVyIHByb2R1Y2VzIGJldHRlciBkYXJ0MmpzIHR5cGUgaW5mZXJlbmNlLgogICAgaWYgKDAgPiBpbmRleCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgbmFtZSA/Pz0gImluZGV4IjsKICAgICAgdGhyb3cgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgaW5kZXhhYmxlLCBuYW1lLCBtZXNzYWdlLCBsZW5ndGgpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ2hlY2sgdGhhdCBhIHJhbmdlIHJlcHJlc2VudHMgYSBzbGljZSBvZiBhbiBpbmRleGFibGUgb2JqZWN0LgogICAqCiAgICogVGhyb3dzIGlmIHRoZSByYW5nZSBpcyBub3QgdmFsaWQgZm9yIGFuIGluZGV4YWJsZSBvYmplY3Qgd2l0aAogICAqIHRoZSBnaXZlbiBbbGVuZ3RoXS4KICAgKiBBIHJhbmdlIGlzIHZhbGlkIGZvciBhbiBpbmRleGFibGUgb2JqZWN0IHdpdGggYSBnaXZlbiBbbGVuZ3RoXQogICAqCiAgICogaWYgYDAgPD0gW3N0YXJ0XSA8PSBbZW5kXSA8PSBbbGVuZ3RoXWAuCiAgICogQW4gYGVuZGAgb2YgYG51bGxgIGlzIGNvbnNpZGVyZWQgZXF1aXZhbGVudCB0byBgbGVuZ3RoYC4KICAgKgogICAqIFRoZSBbc3RhcnROYW1lXSBhbmQgW2VuZE5hbWVdIGRlZmF1bHRzIHRvIGAic3RhcnQiYCBhbmQgYCJlbmQiYCwKICAgKiByZXNwZWN0aXZlbHkuCiAgICoKICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgYGVuZGAgdmFsdWUsIHdoaWNoIGlzIGBsZW5ndGhgIGlmIGBlbmRgIGlzIGBudWxsYCwKICAgKiBhbmQgYGVuZGAgb3RoZXJ3aXNlLgogICAqLwogIHN0YXRpYyBpbnQgY2hlY2tWYWxpZFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgaW50IGxlbmd0aCwKICAgICAgW1N0cmluZyBzdGFydE5hbWUsIFN0cmluZyBlbmROYW1lLCBTdHJpbmcgbWVzc2FnZV0pIHsKICAgIC8vIENvbXBhcmluZyB3aXRoIGAwYCBhcyByZWNlaXZlciBwcm9kdWNlcyBiZXR0ZXIgZGFydDJqcyB0eXBlIGluZmVyZW5jZS4KICAgIC8vIERpdHRvIGBzdGFydCA+IGVuZGAgYmVsb3cuCiAgICBpZiAoMCA+IHN0YXJ0IHx8IHN0YXJ0ID4gbGVuZ3RoKSB7CiAgICAgIHN0YXJ0TmFtZSA/Pz0gInN0YXJ0IjsKICAgICAgdGhyb3cgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgbGVuZ3RoLCBzdGFydE5hbWUsIG1lc3NhZ2UpOwogICAgfQogICAgaWYgKGVuZCAhPSBudWxsKSB7CiAgICAgIGlmIChzdGFydCA+IGVuZCB8fCBlbmQgPiBsZW5ndGgpIHsKICAgICAgICBlbmROYW1lID8/PSAiZW5kIjsKICAgICAgICB0aHJvdyBSYW5nZUVycm9yLnJhbmdlKGVuZCwgc3RhcnQsIGxlbmd0aCwgZW5kTmFtZSwgbWVzc2FnZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGVuZDsKICAgIH0KICAgIHJldHVybiBsZW5ndGg7CiAgfQoKICAvKioKICAgKiBDaGVjayB0aGF0IGFuIGludGVnZXIgdmFsdWUgaXNuJ3QgbmVnYXRpdmUuCiAgICoKICAgKiBUaHJvd3MgaWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlLgogICAqLwogIHN0YXRpYyB2b2lkIGNoZWNrTm90TmVnYXRpdmUoaW50IHZhbHVlLCBbU3RyaW5nIG5hbWUsIFN0cmluZyBtZXNzYWdlXSkgewogICAgaWYgKHZhbHVlIDwgMCkgdGhyb3cgUmFuZ2VFcnJvci5yYW5nZSh2YWx1ZSwgMCwgbnVsbCwgbmFtZSwgbWVzc2FnZSk7CiAgfQoKICBTdHJpbmcgZ2V0IF9lcnJvck5hbWUgPT4gIlJhbmdlRXJyb3IiOwogIFN0cmluZyBnZXQgX2Vycm9yRXhwbGFuYXRpb24gewogICAgYXNzZXJ0KF9oYXNWYWx1ZSk7CiAgICBTdHJpbmcgZXhwbGFuYXRpb24gPSAiIjsKICAgIGlmIChzdGFydCA9PSBudWxsKSB7CiAgICAgIGlmIChlbmQgIT0gbnVsbCkgewogICAgICAgIGV4cGxhbmF0aW9uID0gIjogTm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byAkZW5kIjsKICAgICAgfQogICAgICAvLyBJZiBib3RoIGFyZSBudWxsLCB3ZSBkb24ndCBhZGQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbGltaXRzLgogICAgfSBlbHNlIGlmIChlbmQgPT0gbnVsbCkgewogICAgICBleHBsYW5hdGlvbiA9ICI6IE5vdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHN0YXJ0IjsKICAgIH0gZWxzZSBpZiAoZW5kID4gc3RhcnQpIHsKICAgICAgZXhwbGFuYXRpb24gPSAiOiBOb3QgaW4gcmFuZ2UgJHN0YXJ0Li4kZW5kLCBpbmNsdXNpdmUiOwogICAgfSBlbHNlIGlmIChlbmQgPCBzdGFydCkgewogICAgICBleHBsYW5hdGlvbiA9ICI6IFZhbGlkIHZhbHVlIHJhbmdlIGlzIGVtcHR5IjsKICAgIH0gZWxzZSB7CiAgICAgIC8vIGVuZCA9PSBzdGFydC4KICAgICAgZXhwbGFuYXRpb24gPSAiOiBPbmx5IHZhbGlkIHZhbHVlIGlzICRzdGFydCI7CiAgICB9CiAgICByZXR1cm4gZXhwbGFuYXRpb247CiAgfQp9CgovKioKICogQSBzcGVjaWFsaXplZCBbUmFuZ2VFcnJvcl0gdXNlZCB3aGVuIGFuIGluZGV4IGlzIG5vdCBpbiB0aGUgcmFuZ2UKICogYDAuLmluZGV4YWJsZS5sZW5ndGgtMWAuCiAqCiAqIEFsc28gY29udGFpbnMgdGhlIGluZGV4YWJsZSBvYmplY3QsIGl0cyBsZW5ndGggYXQgdGhlIHRpbWUgb2YgdGhlIGVycm9yLAogKiBhbmQgdGhlIGludmFsaWQgaW5kZXggaXRzZWxmLgogKi8KY2xhc3MgSW5kZXhFcnJvciBleHRlbmRzIEFyZ3VtZW50RXJyb3IgaW1wbGVtZW50cyBSYW5nZUVycm9yIHsKICAvKiogVGhlIGluZGV4YWJsZSBvYmplY3QgdGhhdCBbaW52YWxpZFZhbHVlXSB3YXMgbm90IGEgdmFsaWQgaW5kZXggaW50by4gKi8KICBmaW5hbCBpbmRleGFibGU7CiAgLyoqIFRoZSBsZW5ndGggb2YgW2luZGV4YWJsZV0gYXQgdGhlIHRpbWUgb2YgdGhlIGVycm9yLiAqLwogIGZpbmFsIGludCBsZW5ndGg7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgW0luZGV4RXJyb3JdIHN0YXRpbmcgdGhhdCBbaW52YWxpZFZhbHVlXSBpcyBub3QgYSB2YWxpZCBpbmRleAogICAqIGludG8gW2luZGV4YWJsZV0uCiAgICoKICAgKiBUaGUgW2xlbmd0aF0gaXMgdGhlIGxlbmd0aCBvZiBbaW5kZXhhYmxlXSBhdCB0aGUgdGltZSBvZiB0aGUgZXJyb3IuCiAgICogSWYgYGxlbmd0aGAgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGluZGV4YWJsZS5sZW5ndGhgLgogICAqCiAgICogVGhlIG1lc3NhZ2UgaXMgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yLgogICAqLwogIEluZGV4RXJyb3IoaW50IGludmFsaWRWYWx1ZSwgZHluYW1pYyBpbmRleGFibGUsCiAgICAgIFtTdHJpbmcgbmFtZSwgU3RyaW5nIG1lc3NhZ2UsIGludCBsZW5ndGhdKQogICAgICA6IHRoaXMuaW5kZXhhYmxlID0gaW5kZXhhYmxlLAogICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoID8/IGluZGV4YWJsZS5sZW5ndGgsCiAgICAgICAgc3VwZXIudmFsdWUoaW52YWxpZFZhbHVlLCBuYW1lLAogICAgICAgICAgICAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAiSW5kZXggb3V0IG9mIHJhbmdlIik7CgogIC8vIEdldHRlcnMgaW5oZXJpdGVkIGZyb20gUmFuZ2VFcnJvci4KICBpbnQgZ2V0IHN0YXJ0ID0+IDA7CiAgaW50IGdldCBlbmQgPT4gbGVuZ3RoIC0gMTsKCiAgU3RyaW5nIGdldCBfZXJyb3JOYW1lID0+ICJSYW5nZUVycm9yIjsKICBTdHJpbmcgZ2V0IF9lcnJvckV4cGxhbmF0aW9uIHsKICAgIGFzc2VydChfaGFzVmFsdWUpOwogICAgaW50IGludmFsaWRWYWx1ZSA9IHRoaXMuaW52YWxpZFZhbHVlOwogICAgaWYgKGludmFsaWRWYWx1ZSA8IDApIHsKICAgICAgcmV0dXJuICI6IGluZGV4IG11c3Qgbm90IGJlIG5lZ2F0aXZlIjsKICAgIH0KICAgIGlmIChsZW5ndGggPT0gMCkgewogICAgICByZXR1cm4gIjogbm8gaW5kaWNlcyBhcmUgdmFsaWQiOwogICAgfQogICAgcmV0dXJuICI6IGluZGV4IHNob3VsZCBiZSBsZXNzIHRoYW4gJGxlbmd0aCI7CiAgfQp9CgovKioKICogRXJyb3IgdGhyb3duIHdoZW4gY29udHJvbCByZWFjaGVzIHRoZSBlbmQgb2YgYSBzd2l0Y2ggY2FzZS4KICoKICogVGhlIERhcnQgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0aGlzIGVycm9yIHRvIGJlIHRocm93biB3aGVuCiAqIGNvbnRyb2wgcmVhY2hlcyB0aGUgZW5kIG9mIGEgc3dpdGNoIGNhc2UgKGV4Y2VwdCB0aGUgbGFzdCBjYXNlCiAqIG9mIGEgc3dpdGNoKSB3aXRob3V0IG1lZXRpbmcgYSBicmVhayBvciBzaW1pbGFyIGVuZCBvZiB0aGUgY29udHJvbAogKiBmbG93LgogKi8KY2xhc3MgRmFsbFRocm91Z2hFcnJvciBleHRlbmRzIEVycm9yIHsKICBGYWxsVGhyb3VnaEVycm9yKCk7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGV4dGVybmFsIEZhbGxUaHJvdWdoRXJyb3IuX2NyZWF0ZShTdHJpbmcgdXJsLCBpbnQgbGluZSk7CgogIGV4dGVybmFsIFN0cmluZyB0b1N0cmluZygpOwp9CgovKioKICogRXJyb3IgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGluc3RhbnRpYXRlIGFuIGFic3RyYWN0IGNsYXNzLgogKi8KY2xhc3MgQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHsKICBmaW5hbCBTdHJpbmcgX2NsYXNzTmFtZTsKICBBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yKFN0cmluZyBjbGFzc05hbWUpIDogX2NsYXNzTmFtZSA9IGNsYXNzTmFtZTsKCiAgZXh0ZXJuYWwgU3RyaW5nIHRvU3RyaW5nKCk7Cn0KCi8qKgogKiBFcnJvciB0aHJvd24gYnkgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgWzpub1N1Y2hNZXRob2Q6XSBvbiBbT2JqZWN0XS4KICovCmNsYXNzIE5vU3VjaE1ldGhvZEVycm9yIGV4dGVuZHMgRXJyb3IgewogIC8qKgogICAqIENyZWF0ZSBhIFtOb1N1Y2hNZXRob2RFcnJvcl0gY29ycmVzcG9uZGluZyB0byBhIGZhaWxlZCBtZXRob2QgY2FsbC4KICAgKgogICAqIFRoZSBbcmVjZWl2ZXJdIGlzIHRoZSByZWNlaXZlciBvZiB0aGUgbWV0aG9kIGNhbGwuCiAgICogVGhhdCBpcywgdGhlIG9iamVjdCBvbiB3aGljaCB0aGUgbWV0aG9kIHdhcyBhdHRlbXB0ZWQgY2FsbGVkLgogICAqCiAgICogVGhlIFtpbnZvY2F0aW9uXSByZXByZXNlbnRzIHRoZSBtZXRob2QgY2FsbCB0aGF0IGZhaWxlZC4gSXQKICAgKiBzaG91bGQgbm90IGJlIGBudWxsYC4KICAgKi8KICBleHRlcm5hbCBOb1N1Y2hNZXRob2RFcnJvci53aXRoSW52b2NhdGlvbigKICAgICAgT2JqZWN0IHJlY2VpdmVyLCBJbnZvY2F0aW9uIGludm9jYXRpb24pOwoKICAvLyBEZXByZWNhdGVkIGNvbnN0cnVjdG9yIHRvIGJlIHJlbW92ZWQgYWZ0ZXIgZGFydDJqcyB1cGRhdGVzIHRvIHRoZSBhYm92ZS4KICAvKioKICAgKiBDcmVhdGUgYSBbTm9TdWNoTWV0aG9kRXJyb3JdIGNvcnJlc3BvbmRpbmcgdG8gYSBmYWlsZWQgbWV0aG9kIGNhbGwuCiAgICoKICAgKiBUaGUgW3JlY2VpdmVyXSBpcyB0aGUgcmVjZWl2ZXIgb2YgdGhlIG1ldGhvZCBjYWxsLgogICAqIFRoYXQgaXMsIHRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgYXR0ZW1wdGVkIGNhbGxlZC4KICAgKiBJZiB0aGUgcmVjZWl2ZXIgaXMgYG51bGxgLCBpdCBpcyBpbnRlcnByZXRlZCBhcyBhIGNhbGwgdG8gYSB0b3AtbGV2ZWwKICAgKiBmdW5jdGlvbiBvZiBhIGxpYnJhcnkuCiAgICoKICAgKiBUaGUgW21lbWJlck5hbWVdIGlzIGEgW1N5bWJvbF0gcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoZSBjYWxsZWQgbWV0aG9kCiAgICogb3IgYWNjZXNzb3IuIEl0IHNob3VsZCBub3QgYmUgYG51bGxgLgogICAqCiAgICogVGhlIFtwb3NpdGlvbmFsQXJndW1lbnRzXSBpcyBhIGxpc3Qgb2YgdGhlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYXQgdGhlCiAgICogbWV0aG9kIHdhcyBjYWxsZWQgd2l0aC4gSWYgYG51bGxgLCBpdCBpcyBjb25zaWRlcmVkIGVxdWl2YWxlbnQgdG8gdGhlCiAgICogZW1wdHkgbGlzdC4KICAgKgogICAqIFRoZSBbbmFtZWRBcmd1bWVudHNdIGlzIGEgbWFwIGZyb20gW1N5bWJvbF1zIHRvIHRoZSB2YWx1ZXMgb2YgbmFtZWQKICAgKiBhcmd1bWVudHMgdGhhdCB0aGUgbWV0aG9kIHdhcyBjYWxsZWQgd2l0aC4KICAgKgogICAqIFRoaXMgY29uc3RydWN0b3IgZG9lcyBub3QgaGFuZGxlIHR5cGUgYXJndW1lbnRzLgogICAqIFRvIGluY2x1ZGUgdHlwZSB2YXJpYWJsZXMsIGNyZWF0ZSBhbiBbSW52b2NhdGlvbl0gYW5kIHVzZQogICAqIFtOb1N1Y2hNZXRob2RFcnJvci53aXRoSW52b2NhdGlvbl0uCiAgICovCiAgQERlcHJlY2F0ZWQoIlVzZSBOb1N1Y2hNZXRob2Qud2l0aEludm9jYXRpb24gaW5zdGVhZCIpCiAgZXh0ZXJuYWwgTm9TdWNoTWV0aG9kRXJyb3IoT2JqZWN0IHJlY2VpdmVyLCBTeW1ib2wgbWVtYmVyTmFtZSwKICAgICAgTGlzdCBwb3NpdGlvbmFsQXJndW1lbnRzLCBNYXA8U3ltYm9sLCBkeW5hbWljPiBuYW1lZEFyZ3VtZW50cywKICAgICAgW0BkZXByZWNhdGVkIExpc3QgZXhpc3RpbmdBcmd1bWVudE5hbWVzXSk7CgogIGV4dGVybmFsIFN0cmluZyB0b1N0cmluZygpOwp9CgovKioKICogVGhlIG9wZXJhdGlvbiB3YXMgbm90IGFsbG93ZWQgYnkgdGhlIG9iamVjdC4KICoKICogVGhpcyBbRXJyb3JdIGlzIHRocm93biB3aGVuIGFuIGluc3RhbmNlIGNhbm5vdCBpbXBsZW1lbnQgb25lIG9mIHRoZSBtZXRob2RzCiAqIGluIGl0cyBzaWduYXR1cmUuCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIFVuc3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIFVuc3VwcG9ydGVkRXJyb3IodGhpcy5tZXNzYWdlKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAkbWVzc2FnZSI7Cn0KCi8qKgogKiBUaHJvd24gYnkgb3BlcmF0aW9ucyB0aGF0IGhhdmUgbm90IGJlZW4gaW1wbGVtZW50ZWQgeWV0LgogKgogKiBUaGlzIFtFcnJvcl0gaXMgdGhyb3duIGJ5IHVuZmluaXNoZWQgY29kZSB0aGF0IGhhc24ndCB5ZXQgaW1wbGVtZW50ZWQKICogYWxsIHRoZSBmZWF0dXJlcyBpdCBuZWVkcy4KICoKICogSWYgYSBjbGFzcyBpcyBub3QgaW50ZW5kaW5nIHRvIGltcGxlbWVudCB0aGUgZmVhdHVyZSwgaXQgc2hvdWxkIHRocm93CiAqIGFuIFtVbnN1cHBvcnRlZEVycm9yXSBpbnN0ZWFkLiBUaGlzIGVycm9yIGlzIG9ubHkgaW50ZW5kZWQgZm9yCiAqIHVzZSBkdXJpbmcgZGV2ZWxvcG1lbnQuCiAqLwpjbGFzcyBVbmltcGxlbWVudGVkRXJyb3IgZXh0ZW5kcyBFcnJvciBpbXBsZW1lbnRzIFVuc3VwcG9ydGVkRXJyb3IgewogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIFVuaW1wbGVtZW50ZWRFcnJvcihbdGhpcy5tZXNzYWdlXSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gKHRoaXMubWVzc2FnZSAhPSBudWxsCiAgICAgID8gIlVuaW1wbGVtZW50ZWRFcnJvcjogJG1lc3NhZ2UiCiAgICAgIDogIlVuaW1wbGVtZW50ZWRFcnJvciIpOwp9CgovKioKICogVGhlIG9wZXJhdGlvbiB3YXMgbm90IGFsbG93ZWQgYnkgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG9iamVjdC4KICoKICogVGhpcyBpcyBhIGdlbmVyaWMgZXJyb3IgdXNlZCBmb3IgYSB2YXJpZXR5IG9mIGRpZmZlcmVudCBlcnJvbmVvdXMKICogYWN0aW9ucy4gVGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGRlc2NyaXB0aXZlLgogKi8KY2xhc3MgU3RhdGVFcnJvciBleHRlbmRzIEVycm9yIHsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKICBTdGF0ZUVycm9yKHRoaXMubWVzc2FnZSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkJhZCBzdGF0ZTogJG1lc3NhZ2UiOwp9CgovKioKICogRXJyb3Igb2NjdXJyaW5nIHdoZW4gYSBjb2xsZWN0aW9uIGlzIG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uCiAqCiAqIFNvbWUgbW9kaWZpY2F0aW9ucyBtYXkgYmUgYWxsb3dlZCBmb3Igc29tZSBjb2xsZWN0aW9ucywgc28gZWFjaCBjb2xsZWN0aW9uCiAqIChbSXRlcmFibGVdIG9yIHNpbWlsYXIgY29sbGVjdGlvbiBvZiB2YWx1ZXMpIHNob3VsZCBkZWNsYXJlIHdoaWNoIG9wZXJhdGlvbnMKICogYXJlIGFsbG93ZWQgZHVyaW5nIGFuIGl0ZXJhdGlvbi4KICovCmNsYXNzIENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHsKICAvKiogVGhlIG9iamVjdCB0aGF0IHdhcyBtb2RpZmllZCBpbiBhbiBpbmNvbXBhdGlibGUgd2F5LiAqLwogIGZpbmFsIE9iamVjdCBtb2RpZmllZE9iamVjdDsKCiAgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKFt0aGlzLm1vZGlmaWVkT2JqZWN0XSk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmIChtb2RpZmllZE9iamVjdCA9PSBudWxsKSB7CiAgICAgIHJldHVybiAiQ29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbi4iOwogICAgfQogICAgcmV0dXJuICJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRlcmF0aW9uOiAiCiAgICAgICAgIiR7RXJyb3Iuc2FmZVRvU3RyaW5nKG1vZGlmaWVkT2JqZWN0KX0uIjsKICB9Cn0KCmNsYXNzIE91dE9mTWVtb3J5RXJyb3IgaW1wbGVtZW50cyBFcnJvciB7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGNvbnN0IE91dE9mTWVtb3J5RXJyb3IoKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiT3V0IG9mIE1lbW9yeSI7CgogIFN0YWNrVHJhY2UgZ2V0IHN0YWNrVHJhY2UgPT4gbnVsbDsKfQoKY2xhc3MgU3RhY2tPdmVyZmxvd0Vycm9yIGltcGxlbWVudHMgRXJyb3IgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBjb25zdCBTdGFja092ZXJmbG93RXJyb3IoKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiU3RhY2sgT3ZlcmZsb3ciOwoKICBTdGFja1RyYWNlIGdldCBzdGFja1RyYWNlID0+IG51bGw7Cn0KCi8qKgogKiBFcnJvciB0aHJvd24gd2hlbiBhIGxhemlseSBpbml0aWFsaXplZCB2YXJpYWJsZSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuCiAqCiAqIEEgc3RhdGljL2xpYnJhcnkgdmFyaWFibGUgd2l0aCBhbiBpbml0aWFsaXplciBleHByZXNzaW9uIGlzIGluaXRpYWxpemVkCiAqIHRoZSBmaXJzdCB0aW1lIGl0IGlzIHJlYWQuIElmIGV2YWx1YXRpbmcgdGhlIGluaXRpYWxpemVyIGV4cHJlc3Npb24gY2F1c2VzCiAqIGFub3RoZXIgcmVhZCBvZiB0aGUgdmFyaWFibGUsIHRoaXMgZXJyb3IgaXMgdGhyb3duLgogKi8KY2xhc3MgQ3ljbGljSW5pdGlhbGl6YXRpb25FcnJvciBleHRlbmRzIEVycm9yIHsKICBmaW5hbCBTdHJpbmcgdmFyaWFibGVOYW1lOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBDeWNsaWNJbml0aWFsaXphdGlvbkVycm9yKFt0aGlzLnZhcmlhYmxlTmFtZV0pOwogIFN0cmluZyB0b1N0cmluZygpID0+IHZhcmlhYmxlTmFtZSA9PSBudWxsCiAgICAgID8gIlJlYWRpbmcgc3RhdGljIHZhcmlhYmxlIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24iCiAgICAgIDogIlJlYWRpbmcgc3RhdGljIHZhcmlhYmxlICckdmFyaWFibGVOYW1lJyBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uIjsKfQqCTgBOTjwBEwEEOgNGGAM/LzMDPyw7AzJAMkgDKzNBJzIDJQNGA0URA0M0HzdFOVEyAzA0IzIjNkoxAzg2Ay4+QERFN00EDiQBBjcFTRYGLj0gBhwqBiQEAU49ATkBJgIBBEYEJTEYIisCAQRDBCoBBEMEIQEEMwQmHBUpAgEERAQkJRgcFjUVKREBBjUFRU0TBhwgHRsVAQYzBUE+BScFR0pJSwYcOB4aAQZNBiUbJh0BBiUGED09BAE9SSYBFhwYHwZFNiNJLDovBAIBBD0EKT4TPhEBSyYGOQYcGhYUGAEGRQVDRRIGPRYUFU4BBkoFREYVBUcZBUNFEgYcQSUaGBVQAQZKFwVDRRIFSUAGOT8BBjcFL0QGSicwSAYEAQZDBT4FTToFUDoGPDMhTigYRwYEAQZDBUMZRAUtPgVGEwVLGgY9PE4iJx1EBhcpG0YIEgYTBAEGMQUmBktKBAEpIRcdGRk6CEUePR4+HjQNFzQGGAQCAQRFHANMIQQ/ThM9FAEGURcFSUAFTAYyMSQyKEEBKBYdASkhFyocLQYXJwYyBAIBBD8DQEJGCQQnFhw7AR4CAQQ+BDYbTgEeAgEETwQoBkkFOEMFQRsGLS8BTgZJBThDSxwFTysFTksRBUkwBTY/KQY5QUUxAR4CAQQwA08VBBonGBwiOgIBBDwDSR4DSUIbBEUYJi0nHwIBBEUDRS8EIRgcLgIBBEMDTlAkBDI+HwE2ARYiOgY4MgQCASocHCgBJQIBLBweKQElAgEESgNLTjcEMB0cMiw8TQIBFWRhcnQ6Y29yZS9lcnJvcnMuZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9leGNlcHRpb25zLmRhcnSXji8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8vIEV4Y2VwdGlvbnMgYXJlIHRocm93biBlaXRoZXIgYnkgdGhlIFZNIG9yIGZyb20gRGFydCBjb2RlLgoKLyoqCiAqIEEgbWFya2VyIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhbGwgY29yZSBsaWJyYXJ5IGV4Y2VwdGlvbnMuCiAqCiAqIEFuIFtFeGNlcHRpb25dIGlzIGludGVuZGVkIHRvIGNvbnZleSBpbmZvcm1hdGlvbiB0byB0aGUgdXNlciBhYm91dCBhIGZhaWx1cmUsCiAqIHNvIHRoYXQgdGhlIGVycm9yIGNhbiBiZSBhZGRyZXNzZWQgcHJvZ3JhbW1hdGljYWxseS4gSXQgaXMgaW50ZW5kZWQgdG8gYmUKICogY2F1Z2h0LCBhbmQgaXQgc2hvdWxkIGNvbnRhaW4gdXNlZnVsIGRhdGEgZmllbGRzLgogKgogKiBDcmVhdGluZyBpbnN0YW5jZXMgb2YgW0V4Y2VwdGlvbl0gZGlyZWN0bHkgd2l0aCBbOm5ldyBFeGNlcHRpb24oIm1lc3NhZ2UiKTpdCiAqIGlzIGRpc2NvdXJhZ2VkLCBhbmQgb25seSBpbmNsdWRlZCBhcyBhIHRlbXBvcmFyeSBtZWFzdXJlIGR1cmluZyBkZXZlbG9wbWVudCwKICogdW50aWwgdGhlIGFjdHVhbCBleGNlcHRpb25zIHVzZWQgYnkgYSBsaWJyYXJ5IGFyZSBkb25lLgogKi8KYWJzdHJhY3QgY2xhc3MgRXhjZXB0aW9uIHsKICBmYWN0b3J5IEV4Y2VwdGlvbihbdmFyIG1lc3NhZ2VdKSA9PiBfRXhjZXB0aW9uKG1lc3NhZ2UpOwp9CgovKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBbRXhjZXB0aW9uXSB3aGljaCBjYXJyaWVzIGEgbWVzc2FnZS4gKi8KY2xhc3MgX0V4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbiB7CiAgZmluYWwgbWVzc2FnZTsKCiAgX0V4Y2VwdGlvbihbdGhpcy5tZXNzYWdlXSk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmIChtZXNzYWdlID09IG51bGwpIHJldHVybiAiRXhjZXB0aW9uIjsKICAgIHJldHVybiAiRXhjZXB0aW9uOiAkbWVzc2FnZSI7CiAgfQp9CgovKioKICogRXhjZXB0aW9uIHRocm93biB3aGVuIGEgc3RyaW5nIG9yIHNvbWUgb3RoZXIgZGF0YSBkb2VzIG5vdCBoYXZlIGFuIGV4cGVjdGVkCiAqIGZvcm1hdCBhbmQgY2Fubm90IGJlIHBhcnNlZCBvciBwcm9jZXNzZWQuCiAqLwpjbGFzcyBGb3JtYXRFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb24gewogIC8qKgogICAqIEEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBmb3JtYXQgZXJyb3IuCiAgICovCiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CgogIC8qKgogICAqIFRoZSBhY3R1YWwgc291cmNlIGlucHV0IHdoaWNoIGNhdXNlZCB0aGUgZXJyb3IuCiAgICoKICAgKiBUaGlzIGlzIHVzdWFsbHkgYSBbU3RyaW5nXSwgYnV0IGNhbiBiZSBvdGhlciB0eXBlcyB0b28uCiAgICogSWYgaXQgaXMgYSBzdHJpbmcsIHBhcnRzIG9mIGl0IG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgW3RvU3RyaW5nXSBtZXNzYWdlLgogICAqCiAgICogVGhlIHNvdXJjZSBpcyBgbnVsbGAgaWYgb21pdHRlZCBvciB1bmtub3duLgogICAqLwogIGZpbmFsIHNvdXJjZTsKCiAgLyoqCiAgICogVGhlIG9mZnNldCBpbiBbc291cmNlXSB3aGVyZSB0aGUgZXJyb3Igd2FzIGRldGVjdGVkLgogICAqCiAgICogQSB6ZXJvLWJhc2VkIG9mZnNldCBpbnRvIHRoZSBzb3VyY2UgdGhhdCBtYXJrcyB0aGUgZm9ybWF0IGVycm9yIGNhdXNpbmcKICAgKiB0aGlzIGV4Y2VwdGlvbiB0byBiZSBjcmVhdGVkLiBJZiBgc291cmNlYCBpcyBhIHN0cmluZywgdGhpcyBzaG91bGQgYmUgYQogICAqIHN0cmluZyBpbmRleCBpbiB0aGUgcmFuZ2UgYDAgPD0gb2Zmc2V0IDw9IHNvdXJjZS5sZW5ndGhgLgogICAqCiAgICogSWYgaW5wdXQgaXMgYSBzdHJpbmcsIHRoZSBbdG9TdHJpbmddIG1ldGhvZCBtYXkgcmVwcmVzZW50IHRoaXMgb2Zmc2V0IGFzCiAgICogYSBsaW5lIGFuZCBjaGFyYWN0ZXIgcG9zaXRpb24uIFRoZSBvZmZzZXQgc2hvdWxkIGJlIGluc2lkZSB0aGUgc3RyaW5nLAogICAqIG9yIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KICAgKgogICAqIE1heSBiZSBvbWl0dGVkLiBJZiBwcmVzZW50LCBbc291cmNlXSBzaG91bGQgYWxzbyBiZSBwcmVzZW50IGlmIHBvc3NpYmxlLgogICAqLwogIGZpbmFsIGludCBvZmZzZXQ7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgRm9ybWF0RXhjZXB0aW9uIHdpdGggYW4gb3B0aW9uYWwgZXJyb3IgW21lc3NhZ2VdLgogICAqCiAgICogT3B0aW9uYWxseSBhbHNvIHN1cHBseSB0aGUgYWN0dWFsIFtzb3VyY2VdIHdpdGggdGhlIGluY29ycmVjdCBmb3JtYXQsCiAgICogYW5kIHRoZSBbb2Zmc2V0XSBpbiB0aGUgZm9ybWF0IHdoZXJlIGEgcHJvYmxlbSB3YXMgZGV0ZWN0ZWQuCiAgICovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGNvbnN0IEZvcm1hdEV4Y2VwdGlvbihbdGhpcy5tZXNzYWdlID0gIiIsIHRoaXMuc291cmNlLCB0aGlzLm9mZnNldF0pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdCBleGNlcHRpb24uCiAgICoKICAgKiBUaGUgZGVzY3JpcHRpb24gYWx3YXlzIGNvbnRhaW5zIHRoZSBbbWVzc2FnZV0uCiAgICoKICAgKiBJZiBbc291cmNlXSBpcyBwcmVzZW50IGFuZCBpcyBhIHN0cmluZywgdGhlIGRlc2NyaXB0aW9uIHdpbGwgY29udGFpbgogICAqIChhdCBsZWFzdCBhIHBhcnQgb2YpIHRoZSBzb3VyY2UuCiAgICogSWYgW29mZnNldF0gaXMgYWxzbyBwcm92aWRlZCwgdGhlIHBhcnQgb2YgdGhlIHNvdXJjZSBpbmNsdWRlZCB3aWxsCiAgICogY29udGFpbiB0aGF0IG9mZnNldCwgYW5kIHRoZSBvZmZzZXQgd2lsbCBiZSBtYXJrZWQuCiAgICoKICAgKiBJZiB0aGUgc291cmNlIGlzIGEgc3RyaW5nIGFuZCBpdCBjb250YWlucyBhIGxpbmUgYnJlYWsgYmVmb3JlIG9mZnNldCwKICAgKiBvbmx5IHRoZSBsaW5lIGNvbnRhaW5pbmcgb2Zmc2V0IHdpbGwgYmUgaW5jbHVkZWQsIGFuZCBpdHMgbGluZSBudW1iZXIKICAgKiB3aWxsIGFsc28gYmUgcGFydCBvZiB0aGUgZGVzY3JpcHRpb24uIExpbmUgYW5kIGNoYXJhY3RlciBvZmZzZXRzIGFyZQogICAqIDEtYmFzZWQuCiAgICovCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nIHJlcG9ydCA9ICJGb3JtYXRFeGNlcHRpb24iOwogICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiAiIiAhPSBtZXNzYWdlKSB7CiAgICAgIHJlcG9ydCA9ICIkcmVwb3J0OiAkbWVzc2FnZSI7CiAgICB9CiAgICBpbnQgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7CiAgICBPYmplY3Qgb2JqZWN0U291cmNlID0gdGhpcy5zb3VyY2U7CiAgICBpZiAob2JqZWN0U291cmNlIGlzIFN0cmluZykgewogICAgICBTdHJpbmcgc291cmNlID0gb2JqZWN0U291cmNlOwogICAgICBpZiAob2Zmc2V0ICE9IG51bGwgJiYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gc291cmNlLmxlbmd0aCkpIHsKICAgICAgICBvZmZzZXQgPSBudWxsOwogICAgICB9CiAgICAgIC8vIFNvdXJjZSBpcyBzdHJpbmcgYW5kIG9mZnNldCBpcyBudWxsIG9yIHZhbGlkLgogICAgICBpZiAob2Zmc2V0ID09IG51bGwpIHsKICAgICAgICBpZiAoc291cmNlLmxlbmd0aCA+IDc4KSB7CiAgICAgICAgICBzb3VyY2UgPSBzb3VyY2Uuc3Vic3RyaW5nKDAsIDc1KSArICIuLi4iOwogICAgICAgIH0KICAgICAgICByZXR1cm4gIiRyZXBvcnRcbiRzb3VyY2UiOwogICAgICB9CiAgICAgIGludCBsaW5lTnVtID0gMTsKICAgICAgaW50IGxpbmVTdGFydCA9IDA7CiAgICAgIGJvb2wgcHJldmlvdXNDaGFyV2FzQ1IgPSBmYWxzZTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXQ7IGkrKykgewogICAgICAgIGludCBjaGFyID0gc291cmNlLmNvZGVVbml0QXQoaSk7CiAgICAgICAgaWYgKGNoYXIgPT0gMHgwYSkgewogICAgICAgICAgaWYgKGxpbmVTdGFydCAhPSBpIHx8ICFwcmV2aW91c0NoYXJXYXNDUikgewogICAgICAgICAgICBsaW5lTnVtKys7CiAgICAgICAgICB9CiAgICAgICAgICBsaW5lU3RhcnQgPSBpICsgMTsKICAgICAgICAgIHByZXZpb3VzQ2hhcldhc0NSID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09IDB4MGQpIHsKICAgICAgICAgIGxpbmVOdW0rKzsKICAgICAgICAgIGxpbmVTdGFydCA9IGkgKyAxOwogICAgICAgICAgcHJldmlvdXNDaGFyV2FzQ1IgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobGluZU51bSA+IDEpIHsKICAgICAgICByZXBvcnQgKz0gIiAoYXQgbGluZSAkbGluZU51bSwgY2hhcmFjdGVyICR7b2Zmc2V0IC0gbGluZVN0YXJ0ICsgMX0pXG4iOwogICAgICB9IGVsc2UgewogICAgICAgIHJlcG9ydCArPSAiIChhdCBjaGFyYWN0ZXIgJHtvZmZzZXQgKyAxfSlcbiI7CiAgICAgIH0KICAgICAgaW50IGxpbmVFbmQgPSBzb3VyY2UubGVuZ3RoOwogICAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaW50IGNoYXIgPSBzb3VyY2UuY29kZVVuaXRBdChpKTsKICAgICAgICBpZiAoY2hhciA9PSAweDBhIHx8IGNoYXIgPT0gMHgwZCkgewogICAgICAgICAgbGluZUVuZCA9IGk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaW50IGxlbmd0aCA9IGxpbmVFbmQgLSBsaW5lU3RhcnQ7CiAgICAgIGludCBzdGFydCA9IGxpbmVTdGFydDsKICAgICAgaW50IGVuZCA9IGxpbmVFbmQ7CiAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKICAgICAgU3RyaW5nIHBvc3RmaXggPSAiIjsKICAgICAgaWYgKGxlbmd0aCA+IDc4KSB7CiAgICAgICAgLy8gQ2FuJ3Qgc2hvdyBlbnRpcmUgbGluZS4gVHJ5IHRvIGFuY2hvciBhdCB0aGUgbmVhcmVzdCBlbmQsIGlmCiAgICAgICAgLy8gb25lIGlzIHdpdGhpbiByZWFjaC4KICAgICAgICBpbnQgaW5kZXggPSBvZmZzZXQgLSBsaW5lU3RhcnQ7CiAgICAgICAgaWYgKGluZGV4IDwgNzUpIHsKICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgNzU7CiAgICAgICAgICBwb3N0Zml4ID0gIi4uLiI7CiAgICAgICAgfSBlbHNlIGlmIChlbmQgLSBvZmZzZXQgPCA3NSkgewogICAgICAgICAgc3RhcnQgPSBlbmQgLSA3NTsKICAgICAgICAgIHByZWZpeCA9ICIuLi4iOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBOZWl0aGVyIGVuZCBpcyBuZWFyLCBqdXN0IHBpY2sgYW4gYXJlYSBhcm91bmQgdGhlIG9mZnNldC4KICAgICAgICAgIHN0YXJ0ID0gb2Zmc2V0IC0gMzY7CiAgICAgICAgICBlbmQgPSBvZmZzZXQgKyAzNjsKICAgICAgICAgIHByZWZpeCA9IHBvc3RmaXggPSAiLi4uIjsKICAgICAgICB9CiAgICAgIH0KICAgICAgU3RyaW5nIHNsaWNlID0gc291cmNlLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKICAgICAgaW50IG1hcmtPZmZzZXQgPSBvZmZzZXQgLSBzdGFydCArIHByZWZpeC5sZW5ndGg7CiAgICAgIHJldHVybiAiJHJlcG9ydCRwcmVmaXgkc2xpY2UkcG9zdGZpeFxuJHsiICIgKiBtYXJrT2Zmc2V0fV5cbiI7CiAgICB9IGVsc2UgewogICAgICAvLyBUaGUgc291cmNlIGlzIG5vdCBhIHN0cmluZy4KICAgICAgaWYgKG9mZnNldCAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0ICs9ICIgKGF0IG9mZnNldCAkb2Zmc2V0KSI7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlcG9ydDsKICAgIH0KICB9Cn0KCi8vIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBkb2luZyBpbnRlZ2VyIGRpdmlzaW9uIHdpdGggYSB6ZXJvIGRpdmlzb3IuCmNsYXNzIEludGVnZXJEaXZpc2lvbkJ5WmVyb0V4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbiB7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGNvbnN0IEludGVnZXJEaXZpc2lvbkJ5WmVyb0V4Y2VwdGlvbigpOwogIFN0cmluZyB0b1N0cmluZygpID0+ICJJbnRlZ2VyRGl2aXNpb25CeVplcm9FeGNlcHRpb24iOwp9CoC6AE5OPAETAT0BBEIDUU01A1BQOwQbOwIBRigRAR4BFi0iBAIBBE8tBC0GLAYYAQY1BT1PBTEGEAEGOgVNTT8FTkwiBU4GFAEGRQVLQgYcSAEGNAU0BUomSDkFS0tKDgYWJywkBh4nIiRGFwg3HCI0CiMIFxkmKSkcNhcMHSUjFR0kCggZUA81CCM1KSwXEQoIKB0ZGhsZSCAoGhwbKBwaEUcfHSQKCDM3RQ0lHCoIFQYEAgFFPBwqOQIBGWRhcnQ6Y29yZS9leGNlcHRpb25zLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvZXhwYW5kby5kYXJ0iIgvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQW4gW0V4cGFuZG9dIGFsbG93cyBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gb2JqZWN0cy4KICoKICogRG9lcyBub3Qgd29yayBvbiBudW1iZXJzLCBzdHJpbmdzLCBib29sZWFucyBvciBudWxsLgogKgogKiBBbiBgRXhwYW5kb2AgZG9lcyBub3QgaG9sZCBvbiB0byB0aGUgYWRkZWQgcHJvcGVydHkgdmFsdWUgYWZ0ZXIgYW4gb2JqZWN0CiAqIGJlY29tZXMgaW5hY2Nlc3NpYmxlLgogKgogKiBTaW5jZSB5b3UgY2FuIGFsd2F5cyBjcmVhdGUgYSBuZXcgbnVtYmVyIHRoYXQgaXMgaWRlbnRpY2FsIHRvIGFuIGV4aXN0aW5nCiAqIG51bWJlciwgaXQgbWVhbnMgdGhhdCBhbiBleHBhbmRvIHByb3BlcnR5IG9uIGEgbnVtYmVyIGNvdWxkIG5ldmVyIGJlCiAqIHJlbGVhc2VkLiBUbyBhdm9pZCB0aGlzLCBleHBhbmRvIHByb3BlcnRpZXMgY2Fubm90IGJlIGFkZGVkIHRvIG51bWJlcnMuCiAqIFRoZSBzYW1lIGFyZ3VtZW50IGFwcGxpZXMgdG8gc3RyaW5ncywgYm9vbGVhbnMgYW5kIG51bGwsIHdoaWNoIGFsc28gaGF2ZQogKiBsaXRlcmFscyB0aGF0IGV2YWx1YXRlIHRvIGlkZW50aWNhbCB2YWx1ZXMgd2hlbiB0aGV5IG9jY3VyIG1vcmUgdGhhbiBvbmNlLgogKgogKiBUaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiBvdGhlciBjbGFzc2VzLCBldmVuIGZvciBjb21waWxlIHRpbWUgY29uc3RhbnQKICogb2JqZWN0cy4gQmUgY2FyZWZ1bCBpZiBhZGRpbmcgZXhwYW5kbyBwcm9wZXJ0aWVzIHRvIGNvbXBpbGUgdGltZSBjb25zdGFudHMsCiAqIHNpbmNlIHRoZXkgd2lsbCBzdGF5IGFsaXZlIGZvcmV2ZXIuCiAqLwpjbGFzcyBFeHBhbmRvPFQ+IHsKICAvKioKICAgKiBUaGUgbmFtZSBvZiB0aGUgdGhpcyBbRXhwYW5kb10gYXMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4gSWYKICAgKiBubyBuYW1lIHdhcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCB0aGUgbmFtZSBpcyBbOm51bGw6XS4KICAgKi8KICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBbRXhwYW5kb10uIFRoZSBvcHRpb25hbCBuYW1lIGlzIG9ubHkgdXNlZCBmb3IKICAgKiBkZWJ1Z2dpbmcgcHVycG9zZXMgYW5kIGNyZWF0aW5nIHR3byBkaWZmZXJlbnQgW0V4cGFuZG9dcyB3aXRoIHRoZQogICAqIHNhbWUgbmFtZSB5aWVsZHMgdHdvIFtFeHBhbmRvXXMgdGhhdCB3b3JrIG9uIGRpZmZlcmVudCBwcm9wZXJ0aWVzCiAgICogb2YgdGhlIG9iamVjdHMgdGhleSBhcmUgdXNlZCBvbi4KICAgKi8KICBleHRlcm5hbCBFeHBhbmRvKFtTdHJpbmcgbmFtZV0pOwoKICAvKioKICAgKiBFeHBhbmRvIHRvU3RyaW5nIG1ldGhvZCBvdmVycmlkZS4KICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiRXhwYW5kbzokbmFtZSI7CgogIC8qKgogICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoaXMgW0V4cGFuZG9dJ3MgcHJvcGVydHkgb24gdGhlIGdpdmVuCiAgICogb2JqZWN0LiBJZiB0aGUgb2JqZWN0IGhhc24ndCBiZWVuIGV4cGFuZGVkLCB0aGUgbWV0aG9kIHJldHVybnMKICAgKiBbOm51bGw6XS4KICAgKgogICAqIFRoZSBvYmplY3QgbXVzdCBub3QgYmUgYSBudW1iZXIsIGEgc3RyaW5nLCBhIGJvb2xlYW4gb3IgbnVsbC4KICAgKi8KICBleHRlcm5hbCBUIG9wZXJhdG9yIFtdKE9iamVjdCBvYmplY3QpOwoKICAvKioKICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIFtFeHBhbmRvXSdzIHByb3BlcnR5IG9uIHRoZSBnaXZlbgogICAqIG9iamVjdC4gUHJvcGVydGllcyBjYW4gZWZmZWN0aXZlbHkgYmUgcmVtb3ZlZCBhZ2FpbiBieSBzZXR0aW5nCiAgICogdGhlaXIgdmFsdWUgdG8gbnVsbC4KICAgKgogICAqIFRoZSBvYmplY3QgbXVzdCBub3QgYmUgYSBudW1iZXIsIGEgc3RyaW5nLCBhIGJvb2xlYW4gb3IgbnVsbC4KICAgKi8KICBleHRlcm5hbCB2b2lkIG9wZXJhdG9yIFtdPShPYmplY3Qgb2JqZWN0LCBUIHZhbHVlKTsKfQpAAE5OPAETAQQ5AzgDTRkDTUhLTE4DTE8nBBMGRUIGFQEGQUdHJgYjAQYnBigBBj5EDwVDBikBBj5EGgVDBjYCARZkYXJ0OmNvcmUvZXhwYW5kby5kYXJ0Mm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvZXhwYW5kb19wYXRjaC5kYXJ0j2YvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBFeHBhbmRvPFQ+IHsKICBAcGF0Y2gKICBFeHBhbmRvKFtTdHJpbmcgbmFtZV0pCiAgICAgIDogbmFtZSA9IG5hbWUsCiAgICAgICAgX2RhdGEgPSBuZXcgTGlzdChfbWluU2l6ZSksCiAgICAgICAgX3VzZWQgPSAwOwoKICBzdGF0aWMgY29uc3QgX21pblNpemUgPSA4OwogIHN0YXRpYyBmaW5hbCBfZGVsZXRlZEVudHJ5ID0gbmV3IF9XZWFrUHJvcGVydHkobnVsbCwgbnVsbCk7CgogIEBwYXRjaAogIFQgb3BlcmF0b3IgW10oT2JqZWN0IG9iamVjdCkgewogICAgX2NoZWNrVHlwZShvYmplY3QpOwoKICAgIHZhciBtYXNrID0gX3NpemUgLSAxOwogICAgdmFyIGlkeCA9IG9iamVjdC5faWRlbnRpdHlIYXNoQ29kZSAmIG1hc2s7CiAgICB2YXIgd3AgPSBfZGF0YVtpZHhdOwoKICAgIHdoaWxlICh3cCAhPSBudWxsKSB7CiAgICAgIGlmIChpZGVudGljYWwod3Aua2V5LCBvYmplY3QpKSB7CiAgICAgICAgcmV0dXJuIHdwLnZhbHVlOwogICAgICB9IGVsc2UgaWYgKHdwLmtleSA9PSBudWxsKSB7CiAgICAgICAgLy8gVGhpcyBlbnRyeSBoYXMgYmVlbiBjbGVhcmVkIGJ5IHRoZSBHQy4KICAgICAgICBfZGF0YVtpZHhdID0gX2RlbGV0ZWRFbnRyeTsKICAgICAgfQogICAgICBpZHggPSAoaWR4ICsgMSkgJiBtYXNrOwogICAgICB3cCA9IF9kYXRhW2lkeF07CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAcGF0Y2gKICB2b2lkIG9wZXJhdG9yIFtdPShPYmplY3Qgb2JqZWN0LCBUIHZhbHVlKSB7CiAgICBfY2hlY2tUeXBlKG9iamVjdCk7CgogICAgdmFyIG1hc2sgPSBfc2l6ZSAtIDE7CiAgICB2YXIgaWR4ID0gb2JqZWN0Ll9pZGVudGl0eUhhc2hDb2RlICYgbWFzazsKICAgIHZhciBlbXB0eV9pZHggPSAtMTsKICAgIHZhciB3cCA9IF9kYXRhW2lkeF07CgogICAgd2hpbGUgKHdwICE9IG51bGwpIHsKICAgICAgaWYgKGlkZW50aWNhbCh3cC5rZXksIG9iamVjdCkpIHsKICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgLy8gVXBkYXRlIHRoZSBhc3NvY2lhdGVkIHZhbHVlLgogICAgICAgICAgd3AudmFsdWUgPSB2YWx1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gTWFyayB0aGUgZW50cnkgYXMgZGVsZXRlZC4KICAgICAgICAgIF9kYXRhW2lkeF0gPSBfZGVsZXRlZEVudHJ5OwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAoKGVtcHR5X2lkeCA8IDApICYmIGlkZW50aWNhbCh3cCwgX2RlbGV0ZWRFbnRyeSkpIHsKICAgICAgICBlbXB0eV9pZHggPSBpZHg7IC8vIEluc2VydCBhdCB0aGlzIGxvY2F0aW9uIGlmIG5vdCBmb3VuZC4KICAgICAgfSBlbHNlIGlmICh3cC5rZXkgPT0gbnVsbCkgewogICAgICAgIC8vIFRoaXMgZW50cnkgaGFzIGJlZW4gY2xlYXJlZCBieSB0aGUgR0MuCiAgICAgICAgX2RhdGFbaWR4XSA9IF9kZWxldGVkRW50cnk7CiAgICAgICAgaWYgKGVtcHR5X2lkeCA8IDApIHsKICAgICAgICAgIGVtcHR5X2lkeCA9IGlkeDsgLy8gSW5zZXJ0IGF0IHRoaXMgbG9jYXRpb24gaWYgbm90IGZvdW5kLgogICAgICAgIH0KICAgICAgfQogICAgICBpZHggPSAoaWR4ICsgMSkgJiBtYXNrOwogICAgICB3cCA9IF9kYXRhW2lkeF07CiAgICB9CgogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgLy8gTm90IGVudGVyaW5nIGEgbnVsbCB2YWx1ZS4gV2UganVzdCBuZWVkZWQgdG8gbWFrZSBzdXJlIHRvIGNsZWFyIGFuCiAgICAgIC8vIGV4aXN0aW5nIHZhbHVlIGlmIGl0IGV4aXN0ZWQuCiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoZW1wdHlfaWR4ID49IDApIHsKICAgICAgLy8gV2Ugd2lsbCBiZSByZXVzaW5nIHRoZSBlbXB0eSBzbG90IGJlbG93LgogICAgICBfdXNlZC0tOwogICAgICBpZHggPSBlbXB0eV9pZHg7CiAgICB9CgogICAgaWYgKF91c2VkIDwgX2xpbWl0KSB7CiAgICAgIF9kYXRhW2lkeF0gPSBuZXcgX1dlYWtQcm9wZXJ0eShvYmplY3QsIHZhbHVlKTsKICAgICAgX3VzZWQrKzsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIEdyb3cvcmVhbGxvY2F0ZSBpZiB0b28gbWFueSBzbG90cyBoYXZlIGJlZW4gdXNlZC4KICAgIF9yZWhhc2goKTsKICAgIHRoaXNbb2JqZWN0XSA9IHZhbHVlOyAvLyBSZWN1cnNpdmVseSBhZGQgdGhlIHZhbHVlLgogIH0KCiAgX3JlaGFzaCgpIHsKICAgIC8vIERldGVybWluZSB0aGUgcG9wdWxhdGlvbiBjb3VudCBvZiB0aGUgbWFwIHRvIGFsbG9jYXRlIGFuIGFwcHJvcHJpYXRlbHkKICAgIC8vIHNpemVkIG1hcCBiZWxvdy4KICAgIHZhciBjb3VudCA9IDA7CiAgICB2YXIgb2xkX2RhdGEgPSBfZGF0YTsKICAgIHZhciBsZW4gPSBvbGRfZGF0YS5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIHZhciBlbnRyeSA9IG9sZF9kYXRhW2ldOwogICAgICBpZiAoKGVudHJ5ICE9IG51bGwpICYmIChlbnRyeS5rZXkgIT0gbnVsbCkpIHsKICAgICAgICAvLyBPbmx5IGNvdW50IG5vbi1jbGVhcmVkIGVudHJpZXMuCiAgICAgICAgY291bnQrKzsKICAgICAgfQogICAgfQoKICAgIHZhciBuZXdfc2l6ZSA9IF9zaXplOwogICAgaWYgKGNvdW50IDw9IChuZXdfc2l6ZSA+PiAyKSkgewogICAgICBuZXdfc2l6ZSA9IG5ld19zaXplID4+IDE7CiAgICB9IGVsc2UgaWYgKGNvdW50ID4gKG5ld19zaXplID4+IDEpKSB7CiAgICAgIG5ld19zaXplID0gbmV3X3NpemUgPDwgMTsKICAgIH0KICAgIG5ld19zaXplID0gKG5ld19zaXplIDwgX21pblNpemUpID8gX21pblNpemUgOiBuZXdfc2l6ZTsKCiAgICAvLyBSZXNldCB0aGUgbWFwcGluZ3MgdG8gZW1wdHkgc28gdGhhdCB3ZSBjYW4ganVzdCBhZGQgdGhlIGV4aXN0aW5nCiAgICAvLyB2YWxpZCBlbnRyaWVzLgogICAgX2RhdGEgPSBuZXcgTGlzdChuZXdfc2l6ZSk7CiAgICBfdXNlZCA9IDA7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGRfZGF0YS5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZW50cnkgPSBvbGRfZGF0YVtpXTsKICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgZW50cnkua2V5IGlzIG5vdCBjbGVhcmVkIGJldHdlZW4gY2hlY2tpbmcgZm9yIGl0IGFuZAogICAgICAgIC8vIGluc2VydGluZyBpdCBpbnRvIHRoZSBuZXcgdGFibGUuCiAgICAgICAgdmFyIHZhbCA9IGVudHJ5LnZhbHVlOwogICAgICAgIHZhciBrZXkgPSBlbnRyeS5rZXk7CiAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7CiAgICAgICAgICB0aGlzW2tleV0gPSB2YWw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBzdGF0aWMgX2NoZWNrVHlwZShvYmplY3QpIHsKICAgIGlmICgob2JqZWN0ID09IG51bGwpIHx8CiAgICAgICAgKG9iamVjdCBpcyBib29sKSB8fAogICAgICAgIChvYmplY3QgaXMgbnVtKSB8fAogICAgICAgIChvYmplY3QgaXMgU3RyaW5nKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShvYmplY3QsCiAgICAgICAgICAiRXhwYW5kb3MgYXJlIG5vdCBhbGxvd2VkIG9uIHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zIG9yIG51bGwiKTsKICAgIH0KICB9CgogIGdldCBfc2l6ZSA9PiBfZGF0YS5sZW5ndGg7CiAgZ2V0IF9saW1pdCA9PiAoMyAqIChfc2l6ZSB+LyA0KSk7CgogIExpc3QgX2RhdGE7CiAgaW50IF91c2VkOyAvLyBOdW1iZXIgb2YgdXNlZCAoYWN0aXZlIGFuZCBkZWxldGVkKSBzbG90cy4KfQqAmQBOTjwBHgEHEwkZFSQTAR0+AQkhGAEaLxkBGScZIzIkCB4XBgERBAEJLhgBGi8YGQEZJx0qHBEoJgoQREIjMiQdRAoIHhcGARlMJw4GARoyDxcGARo1Dw4GATkPOAQBDk4YExofJB80KxEIBgEaJCAqIAY8AUgWIA8BMB8bUCwfHRsbCggGBAEeHBwbHixNBgQBHSQBDjsCASJkYXJ0OmNvcmUtcGF0Y2gvZXhwYW5kb19wYXRjaC5kYXJ0Lm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL2Z1bmN0aW9uLmRhcnSJoS8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIGZ1bmN0aW9uIHR5cGVzLgogKgogKiBBIGZ1bmN0aW9uIHZhbHVlLCBvciBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHdpdGggYSAiY2FsbCIgbWV0aG9kLCBpcyBhCiAqIHN1YnR5cGUgb2YgYSBmdW5jdGlvbiB0eXBlLCBhbmQgYXMgc3VjaCwgYSBzdWJ0eXBlIG9mIFtGdW5jdGlvbl0uCiAqLwphYnN0cmFjdCBjbGFzcyBGdW5jdGlvbiB7CiAgLyoqCiAgICogRHluYW1pY2FsbHkgY2FsbCBbZnVuY3Rpb25dIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuCiAgICoKICAgKiBBY3RzIHRoZSBzYW1lIGFzIGNhbGxpbmcgZnVuY3Rpb24gd2l0aCBwb3NpdGlvbmFsIGFyZ3VtZW50cwogICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnRzIG9mIFtwb3NpdGlvbmFsQXJndW1lbnRzXSBhbmQKICAgKiBuYW1lZCBhcmd1bWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudHMgb2YgW25hbWVkQXJndW1lbnRzXS4KICAgKgogICAqIFRoaXMgaW5jbHVkZXMgZ2l2aW5nIHRoZSBzYW1lIGVycm9ycyBpZiBbZnVuY3Rpb25dIGlzbid0IGNhbGxhYmxlIG9yCiAgICogaWYgaXQgZXhwZWN0cyBkaWZmZXJlbnQgcGFyYW1ldGVycy4KICAgKgogICAqIEV4YW1wbGU6CiAgICogYGBgCiAgICogRnVuY3Rpb24uYXBwbHkoZm9vLCBbMSwyLDNdLCB7I2Y6IDQsICNnOiA1fSk7CiAgICogYGBgCiAgICoKICAgKiBnaXZlcyBleGFjdGx5IHRoZSBzYW1lIHJlc3VsdCBhcwogICAqIGBgYAogICAqIGZvbygxLCAyLCAzLCBmOiA0LCBnOiA1KS4KICAgKiBgYGAKICAgKgogICAqIElmIFtwb3NpdGlvbmFsQXJndW1lbnRzXSBpcyBudWxsLCBpdCdzIGNvbnNpZGVyZWQgYW4gZW1wdHkgbGlzdC4KICAgKiBJZiBbbmFtZWRBcmd1bWVudHNdIGlzIG9taXR0ZWQgb3IgbnVsbCwgaXQgaXMgY29uc2lkZXJlZCBhbiBlbXB0eSBtYXAuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIGFwcGx5KEZ1bmN0aW9uIGZ1bmN0aW9uLCBMaXN0IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIFtNYXA8U3ltYm9sLCBkeW5hbWljPiBuYW1lZEFyZ3VtZW50c10pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIHZhbHVlIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIGBvcGVyYXRvcj09YC4KICAgKi8KICBpbnQgZ2V0IGhhc2hDb2RlOwoKICAvKioKICAgKiBUZXN0IHdoZXRoZXIgYW5vdGhlciBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBmdW5jdGlvbi4KICAgKgogICAqIFN5c3RlbS1jcmVhdGVkIGZ1bmN0aW9uIG9iamVjdHMgYXJlIG9ubHkgZXF1YWwgdG8gb3RoZXIgZnVuY3Rpb25zLgogICAqCiAgICogVHdvIGZ1bmN0aW9uIG9iamVjdHMgYXJlIGtub3duIHRvIHJlcHJlc2VudCB0aGUgc2FtZSBmdW5jdGlvbiBpZgogICAqCiAgICogLSBJdCBpcyB0aGUgc2FtZSBvYmplY3QuIFN0YXRpYyBhbmQgdG9wLWxldmVsIGZ1bmN0aW9ucyBhcmUgY29tcGlsZSB0aW1lCiAgICogICBjb25zdGFudHMgd2hlbiB1c2VkIGFzIHZhbHVlcywgc28gcmVmZXJyaW5nIHRvIHRoZSBzYW1lIGZ1bmN0aW9uIHR3aWNlCiAgICogICBhbHdheXMgZ2l2ZSB0aGUgc2FtZSBvYmplY3QsCiAgICogLSBvciBpZiB0aGV5IHJlZmVyIHRvIHRoZSBzYW1lIG1lbWJlciBtZXRob2QgZXh0cmFjdGVkIGZyb20gdGhlIHNhbWUgb2JqZWN0LgogICAqICAgRXh0cmFjdGluZyBhIG1lbWJlciBtZXRob2QgYXMgYSBmdW5jdGlvbiB2YWx1ZSB0d2ljZSBnaXZlcyBlcXVhbCwgYnV0CiAgICogICBub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsLCBmdW5jdGlvbiB2YWx1ZXMuCiAgICoKICAgKiBGdW5jdGlvbiBleHByZXNzaW9ucyBuZXZlciBnaXZlIHJpc2UgdG8gZXF1YWwgZnVuY3Rpb24gb2JqZWN0cy4gRWFjaCB0aW1lCiAgICogYSBmdW5jdGlvbiBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCwgaXQgY3JlYXRlcyBhIG5ldyBjbG9zdXJlIHZhbHVlIHRoYXQKICAgKiBpcyBub3Qga25vd24gdG8gYmUgZXF1YWwgdG8gb3RoZXIgY2xvc3VyZXMgY3JlYXRlZCBieSB0aGUgc2FtZSBleHByZXNzaW9uLgogICAqCiAgICogQ2xhc3NlcyBpbXBsZW1lbnRpbmcgYEZ1bmN0aW9uYCBieSBoYXZpbmcgYSBgY2FsbGAgbWV0aG9kIHNob3VsZCBoYXZlIHRoZWlyCiAgICogb3duIGBvcGVyYXRvcj09YCBhbmQgYGhhc2hDb2RlYCBkZXBlbmRpbmcgb24gdGhlIG9iamVjdC4KICAgKi8KICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcik7Cn0KRQBOTjwBEwEEKgNKRQQaBj8FQUBIBUopBQ4JMwkFJgkfCQVGTAZFLgEGRQYUAQY8BUgFRgVOTiRSTTMFT01QBVE+BiICARdkYXJ0OmNvcmUvZnVuY3Rpb24uZGFydDNvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2Z1bmN0aW9uX3BhdGNoLmRhcnSFOS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIEZ1bmN0aW9uIHsKICAvLyBUT0RPKHJlZ2lzKTogUGFzcyB0eXBlIGFyZ3VtZW50cyB0byBnZW5lcmljIGZ1bmN0aW9ucy4gV2FpdCBmb3IgQVBJIHNwZWMuCiAgc3RhdGljIF9hcHBseShMaXN0IGFyZ3VtZW50cywgTGlzdCBuYW1lcykgbmF0aXZlICJGdW5jdGlvbl9hcHBseSI7CgogIEBwYXRjaAogIHN0YXRpYyBhcHBseShGdW5jdGlvbiBmdW5jdGlvbiwgTGlzdCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBbTWFwPFN5bWJvbCwgZHluYW1pYz4gbmFtZWRBcmd1bWVudHNdKSB7CiAgICBpbnQgbnVtUG9zaXRpb25hbEFyZ3VtZW50cyA9IDEgKyAvLyBGdW5jdGlvbiBpcyBmaXJzdCBpbXBsaWNpdCBhcmd1bWVudC4KICAgICAgICAocG9zaXRpb25hbEFyZ3VtZW50cyAhPSBudWxsID8gcG9zaXRpb25hbEFyZ3VtZW50cy5sZW5ndGggOiAwKTsKICAgIGludCBudW1OYW1lZEFyZ3VtZW50cyA9IG5hbWVkQXJndW1lbnRzICE9IG51bGwgPyBuYW1lZEFyZ3VtZW50cy5sZW5ndGggOiAwOwogICAgaW50IG51bUFyZ3VtZW50cyA9IG51bVBvc2l0aW9uYWxBcmd1bWVudHMgKyBudW1OYW1lZEFyZ3VtZW50czsKICAgIExpc3QgYXJndW1lbnRzID0gbmV3IExpc3QobnVtQXJndW1lbnRzKTsKICAgIGFyZ3VtZW50c1swXSA9IGZ1bmN0aW9uOwogICAgYXJndW1lbnRzLnNldFJhbmdlKDEsIG51bVBvc2l0aW9uYWxBcmd1bWVudHMsIHBvc2l0aW9uYWxBcmd1bWVudHMpOwogICAgTGlzdCBuYW1lcyA9IG5ldyBMaXN0KG51bU5hbWVkQXJndW1lbnRzKTsKICAgIGludCBhcmd1bWVudEluZGV4ID0gbnVtUG9zaXRpb25hbEFyZ3VtZW50czsKICAgIGludCBuYW1lSW5kZXggPSAwOwogICAgaWYgKG51bU5hbWVkQXJndW1lbnRzID4gMCkgewogICAgICBuYW1lZEFyZ3VtZW50cy5mb3JFYWNoKChuYW1lLCB2YWx1ZSkgewogICAgICAgIGFyZ3VtZW50c1thcmd1bWVudEluZGV4KytdID0gdmFsdWU7CiAgICAgICAgbmFtZXNbbmFtZUluZGV4KytdID0gaW50ZXJuYWwuU3ltYm9sLmdldE5hbWUobmFtZSk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIF9hcHBseShhcmd1bWVudHMsIG5hbWVzKTsKICB9Cn0KIwBOTjwBHgEHEU9FAQk8L01IUEMtHUguMBchLSw8CgYlBAIBI2RhcnQ6Y29yZS1wYXRjaC9mdW5jdGlvbl9wYXRjaC5kYXJ0KW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL2ludC5kYXJ0risvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQW4gaW50ZWdlciBudW1iZXIuCiAqCiAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGBpbnRgIGlzIDY0LWJpdCB0d28ncyBjb21wbGVtZW50IGludGVnZXJzCiAqIHdpdGggb3BlcmF0aW9ucyB0aGF0IHdyYXAgdG8gdGhhdCByYW5nZSBvbiBvdmVyZmxvdy4KICoKICogKipOb3RlOioqIFdoZW4gY29tcGlsaW5nIHRvIEphdmFTY3JpcHQsIGludGVnZXJzIGFyZSByZXN0cmljdGVkIHRvIHZhbHVlcwogKiB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBleGFjdGx5IGJ5IGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWVzLgogKiBUaGUgYXZhaWxhYmxlIGludGVnZXIgdmFsdWVzIGluY2x1ZGUgYWxsIGludGVnZXJzIGJldHdlZW4gLTJeNTMgYW5kIDJeNTMsCiAqIGFuZCBzb21lIGludGVnZXJzIHdpdGggbGFyZ2VyIG1hZ25pdHVkZS4gVGhhdCBpbmNsdWRlcyBzb21lIGludGVnZXJzIGxhcmdlcgogKiB0aGFuIDJeNjMuCiAqIFRoZSBiZWhhdmlvciBvZiB0aGUgb3BlcmF0b3JzIGFuZCBtZXRob2RzIGluIHRoZSBbaW50XQogKiBjbGFzcyB0aGVyZWZvcmUgc29tZXRpbWVzIGRpZmZlcnMgYmV0d2VlbiB0aGUgRGFydCBWTSBhbmQgRGFydCBjb2RlCiAqIGNvbXBpbGVkIHRvIEphdmFTY3JpcHQuIEZvciBleGFtcGxlLCB0aGUgYml0d2lzZSBvcGVyYXRvcnMgdHJ1bmNhdGUgdGhlaXIKICogb3BlcmFuZHMgdG8gMzItYml0IGludGVnZXJzIHdoZW4gY29tcGlsZWQgdG8gSmF2YVNjcmlwdC4KICoKICogQ2xhc3NlcyBjYW5ub3QgZXh0ZW5kLCBpbXBsZW1lbnQsIG9yIG1peCBpbiBgaW50YC4KICovCmFic3RyYWN0IGNsYXNzIGludCBleHRlbmRzIG51bSB7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgZGVjbGFyYXRpb24gW25hbWVdLgogICAqCiAgICogVGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBhcyB3b3VsZCBiZSByZXR1cm5lZCBieToKICAgKiBgYGAKICAgKiBpbnQudHJ5UGFyc2UoY29uc3QgU3RyaW5nLmZyb21FbnZpcm9ubWVudChuYW1lLCBkZWZhdWx0VmFsdWU6ICIiKSkKICAgKiAgICAgPz8gZGVmYXVsdFZhbHVlCiAgICogYGBgCiAgICogRXhhbXBsZToKICAgKiBgYGAKICAgKiBjb25zdCBpbnQuZnJvbUVudmlyb25tZW50KCJkZWZhdWx0UG9ydCIsIGRlZmF1bHRWYWx1ZTogODApCiAgICogYGBgCiAgICovCiAgLy8gVGhlIC5mcm9tRW52aXJvbm1lbnQoKSBjb25zdHJ1Y3RvcnMgYXJlIHNwZWNpYWwgaW4gdGhhdCB3ZSBkbyBub3Qgd2FudAogIC8vIHVzZXJzIHRvIGNhbGwgdGhlbSB1c2luZyAibmV3Ii4gV2UgcHJvaGliaXQgdGhhdCBieSBnaXZpbmcgdGhlbSBib2RpZXMKICAvLyB0aGF0IHRocm93LCBldmVuIHRob3VnaCBjb25zdCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBhbGxvd2VkIHRvIGhhdmUgYm9kaWVzLgogIC8vIERpc2FibGUgdGhvc2Ugc3RhdGljIGVycm9ycy4KICAvL2lnbm9yZTogY29uc3RfY29uc3RydWN0b3Jfd2l0aF9ib2R5CiAgLy9pZ25vcmU6IGNvbnN0X2ZhY3RvcnkKICBleHRlcm5hbCBjb25zdCBmYWN0b3J5IGludC5mcm9tRW52aXJvbm1lbnQoU3RyaW5nIG5hbWUsIHtpbnQgZGVmYXVsdFZhbHVlfSk7CgogIC8qKgogICAqIEJpdC13aXNlIGFuZCBvcGVyYXRvci4KICAgKgogICAqIFRyZWF0aW5nIGJvdGggYHRoaXNgIGFuZCBbb3RoZXJdIGFzIHN1ZmZpY2llbnRseSBsYXJnZSB0d28ncyBjb21wb25lbnQKICAgKiBpbnRlZ2VycywgdGhlIHJlc3VsdCBpcyBhIG51bWJlciB3aXRoIG9ubHkgdGhlIGJpdHMgc2V0IHRoYXQgYXJlIHNldCBpbgogICAqIGJvdGggYHRoaXNgIGFuZCBbb3RoZXJdCiAgICoKICAgKiBPZiBib3RoIG9wZXJhbmRzIGFyZSBuZWdhdGl2ZSwgdGhlIHJlc3VsdCBpcyBuZWdhdGl2ZSwgb3RoZXJ3aXNlCiAgICogdGhlIHJlc3VsdCBpcyBub24tbmVnYXRpdmUuCiAgICovCiAgaW50IG9wZXJhdG9yICYoaW50IG90aGVyKTsKCiAgLyoqCiAgICogQml0LXdpc2Ugb3Igb3BlcmF0b3IuCiAgICoKICAgKiBUcmVhdGluZyBib3RoIGB0aGlzYCBhbmQgW290aGVyXSBhcyBzdWZmaWNpZW50bHkgbGFyZ2UgdHdvJ3MgY29tcG9uZW50CiAgICogaW50ZWdlcnMsIHRoZSByZXN1bHQgaXMgYSBudW1iZXIgd2l0aCB0aGUgYml0cyBzZXQgdGhhdCBhcmUgc2V0IGluIGVpdGhlcgogICAqIG9mIGB0aGlzYCBhbmQgW290aGVyXQogICAqCiAgICogSWYgYm90aCBvcGVyYW5kcyBhcmUgbm9uLW5lZ2F0aXZlLCB0aGUgcmVzdWx0IGlzIG5vbi1uZWdhdGl2ZSwKICAgKiBvdGhlcndpc2UgdGhlIHJlc3VsdCBpcyBuZWdhdGl2ZS4KICAgKi8KICBpbnQgb3BlcmF0b3IgfChpbnQgb3RoZXIpOwoKICAvKioKICAgKiBCaXQtd2lzZSBleGNsdXNpdmUtb3Igb3BlcmF0b3IuCiAgICoKICAgKiBUcmVhdGluZyBib3RoIGB0aGlzYCBhbmQgW290aGVyXSBhcyBzdWZmaWNpZW50bHkgbGFyZ2UgdHdvJ3MgY29tcG9uZW50CiAgICogaW50ZWdlcnMsIHRoZSByZXN1bHQgaXMgYSBudW1iZXIgd2l0aCB0aGUgYml0cyBzZXQgdGhhdCBhcmUgc2V0IGluIG9uZSwKICAgKiBidXQgbm90IGJvdGgsIG9mIGB0aGlzYCBhbmQgW290aGVyXQogICAqCiAgICogSWYgdGhlIG9wZXJhbmRzIGhhdmUgdGhlIHNhbWUgc2lnbiwgdGhlIHJlc3VsdCBpcyBub24tbmVnYXRpdmUsCiAgICogb3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgbmVnYXRpdmUuCiAgICovCiAgaW50IG9wZXJhdG9yIF4oaW50IG90aGVyKTsKCiAgLyoqCiAgICogVGhlIGJpdC13aXNlIG5lZ2F0ZSBvcGVyYXRvci4KICAgKgogICAqIFRyZWF0aW5nIGB0aGlzYCBhcyBhIHN1ZmZpY2llbnRseSBsYXJnZSB0d28ncyBjb21wb25lbnQgaW50ZWdlciwKICAgKiB0aGUgcmVzdWx0IGlzIGEgbnVtYmVyIHdpdGggdGhlIG9wcG9zaXRlIGJpdHMgc2V0LgogICAqCiAgICogVGhpcyBtYXBzIGFueSBpbnRlZ2VyIGB4YCB0byBgLXggLSAxYC4KICAgKi8KICBpbnQgb3BlcmF0b3IgfigpOwoKICAvKioKICAgKiBTaGlmdCB0aGUgYml0cyBvZiB0aGlzIGludGVnZXIgdG8gdGhlIGxlZnQgYnkgW3NoaWZ0QW1vdW50XS4KICAgKgogICAqIFNoaWZ0aW5nIHRvIHRoZSBsZWZ0IG1ha2VzIHRoZSBudW1iZXIgbGFyZ2VyLCBlZmZlY3RpdmVseSBtdWx0aXBseWluZwogICAqIHRoZSBudW1iZXIgYnkgYHBvdygyLCBzaGlmdEluZGV4KWAuCiAgICoKICAgKiBUaGVyZSBpcyBubyBsaW1pdCBvbiB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0LiBJdCBtYXkgYmUgcmVsZXZhbnQgdG8KICAgKiBsaW1pdCBpbnRlcm1lZGlhdGUgdmFsdWVzIGJ5IHVzaW5nIHRoZSAiYW5kIiBvcGVyYXRvciB3aXRoIGEgc3VpdGFibGUKICAgKiBtYXNrLgogICAqCiAgICogSXQgaXMgYW4gZXJyb3IgaWYgW3NoaWZ0QW1vdW50XSBpcyBuZWdhdGl2ZS4KICAgKi8KICBpbnQgb3BlcmF0b3IgPDwoaW50IHNoaWZ0QW1vdW50KTsKCiAgLyoqCiAgICogU2hpZnQgdGhlIGJpdHMgb2YgdGhpcyBpbnRlZ2VyIHRvIHRoZSByaWdodCBieSBbc2hpZnRBbW91bnRdLgogICAqCiAgICogU2hpZnRpbmcgdG8gdGhlIHJpZ2h0IG1ha2VzIHRoZSBudW1iZXIgc21hbGxlciBhbmQgZHJvcHMgdGhlIGxlYXN0CiAgICogc2lnbmlmaWNhbnQgYml0cywgZWZmZWN0aXZlbHkgZG9pbmcgYW4gaW50ZWdlciBkaXZpc2lvbiBieQogICAqYHBvdygyLCBzaGlmdEluZGV4KWAuCiAgICoKICAgKiBJdCBpcyBhbiBlcnJvciBpZiBbc2hpZnRBbW91bnRdIGlzIG5lZ2F0aXZlLgogICAqLwogIGludCBvcGVyYXRvciA+PihpbnQgc2hpZnRBbW91bnQpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoaXMgaW50ZWdlciB0byB0aGUgcG93ZXIgb2YgW2V4cG9uZW50XSBtb2R1bG8gW21vZHVsdXNdLgogICAqCiAgICogVGhlIFtleHBvbmVudF0gbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIFttb2R1bHVzXSBtdXN0IGJlCiAgICogcG9zaXRpdmUuCiAgICovCiAgaW50IG1vZFBvdyhpbnQgZXhwb25lbnQsIGludCBtb2R1bHVzKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbW9kdWxhciBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIHRoaXMgaW50ZWdlcgogICAqIG1vZHVsbyBbbW9kdWx1c10uCiAgICoKICAgKiBUaGUgW21vZHVsdXNdIG11c3QgYmUgcG9zaXRpdmUuCiAgICoKICAgKiBJdCBpcyBhbiBlcnJvciBpZiBubyBtb2R1bGFyIGludmVyc2UgZXhpc3RzLgogICAqLwogIGludCBtb2RJbnZlcnNlKGludCBtb2R1bHVzKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3Igb2YgdGhpcyBpbnRlZ2VyIGFuZCBbb3RoZXJdLgogICAqCiAgICogSWYgZWl0aGVyIG51bWJlciBpcyBub24temVybywgdGhlIHJlc3VsdCBpcyB0aGUgbnVtZXJpY2FsbHkgZ3JlYXRlc3QKICAgKiBpbnRlZ2VyIGRpdmlkaW5nIGJvdGggYHRoaXNgIGFuZCBgb3RoZXJgLgogICAqCiAgICogVGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIGlzIGluZGVwZW5kZW50IG9mIHRoZSBvcmRlciwKICAgKiBzbyBgeC5nY2QoeSlgIGlzICBhbHdheXMgdGhlIHNhbWUgYXMgYHkuZ2NkKHgpYC4KICAgKgogICAqIEZvciBhbnkgaW50ZWdlciBgeGAsIGB4LmdjZCh4KWAgaXMgYHguYWJzKClgLgogICAqCiAgICogSWYgYm90aCBgdGhpc2AgYW5kIGBvdGhlcmAgaXMgemVybywgdGhlIHJlc3VsdCBpcyBhbHNvIHplcm8uCiAgICovCiAgaW50IGdjZChpbnQgb3RoZXIpOwoKICAvKiogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgaW50ZWdlciBpcyBldmVuLiAqLwogIGJvb2wgZ2V0IGlzRXZlbjsKCiAgLyoqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIGludGVnZXIgaXMgb2RkLiAqLwogIGJvb2wgZ2V0IGlzT2RkOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHN0b3JlIHRoaXMgaW50ZWdlci4KICAgKgogICAqIFRoZSBudW1iZXIgb2YgYml0cyBleGNsdWRlcyB0aGUgc2lnbiBiaXQsIHdoaWNoIGdpdmVzIHRoZSBuYXR1cmFsIGxlbmd0aAogICAqIGZvciBub24tbmVnYXRpdmUgKHVuc2lnbmVkKSB2YWx1ZXMuICBOZWdhdGl2ZSB2YWx1ZXMgYXJlIGNvbXBsZW1lbnRlZCB0bwogICAqIHJldHVybiB0aGUgYml0IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBiaXQgdGhhdCBkaWZmZXJzIGZyb20gdGhlIHNpZ24gYml0LgogICAqCiAgICogVG8gZmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHN0b3JlIHRoZSB2YWx1ZSBhcyBhIHNpZ25lZCB2YWx1ZSwKICAgKiBhZGQgb25lLCBpLmUuIHVzZSBgeC5iaXRMZW5ndGggKyAxYC4KICAgKiBgYGAKICAgKiB4LmJpdExlbmd0aCA9PSAoLXgtMSkuYml0TGVuZ3RoCiAgICoKICAgKiAzLmJpdExlbmd0aCA9PSAyOyAgICAgLy8gMDAwMDAwMTEKICAgKiAyLmJpdExlbmd0aCA9PSAyOyAgICAgLy8gMDAwMDAwMTAKICAgKiAxLmJpdExlbmd0aCA9PSAxOyAgICAgLy8gMDAwMDAwMDEKICAgKiAwLmJpdExlbmd0aCA9PSAwOyAgICAgLy8gMDAwMDAwMDAKICAgKiAoLTEpLmJpdExlbmd0aCA9PSAwOyAgLy8gMTExMTExMTEKICAgKiAoLTIpLmJpdExlbmd0aCA9PSAxOyAgLy8gMTExMTExMTAKICAgKiAoLTMpLmJpdExlbmd0aCA9PSAyOyAgLy8gMTExMTExMDEKICAgKiAoLTQpLmJpdExlbmd0aCA9PSAyOyAgLy8gMTExMTExMDAKICAgKiBgYGAKICAgKi8KICBpbnQgZ2V0IGJpdExlbmd0aDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgW3dpZHRoXSBiaXRzIG9mIHRoaXMgaW50ZWdlciBhcyBhCiAgICogbm9uLW5lZ2F0aXZlIG51bWJlciAoaS5lLiB1bnNpZ25lZCByZXByZXNlbnRhdGlvbikuICBUaGUgcmV0dXJuZWQgdmFsdWUgaGFzCiAgICogemVyb3MgaW4gYWxsIGJpdCBwb3NpdGlvbnMgaGlnaGVyIHRoYW4gW3dpZHRoXS4KICAgKiBgYGAKICAgKiAoLTEpLnRvVW5zaWduZWQoNSkgPT0gMzEgICAvLyAxMTExMTExMSAgLT4gIDAwMDExMTExCiAgICogYGBgCiAgICogVGhpcyBvcGVyYXRpb24gY2FuIGJlIHVzZWQgdG8gc2ltdWxhdGUgYXJpdGhtZXRpYyBmcm9tIGxvdyBsZXZlbCBsYW5ndWFnZXMuCiAgICogRm9yIGV4YW1wbGUsIHRvIGluY3JlbWVudCBhbiA4IGJpdCBxdWFudGl0eToKICAgKiBgYGAKICAgKiBxID0gKHEgKyAxKS50b1Vuc2lnbmVkKDgpOwogICAqIGBgYAogICAqIGBxYCB3aWxsIGNvdW50IGZyb20gYDBgIHVwIHRvIGAyNTVgIGFuZCB0aGVuIHdyYXAgYXJvdW5kIHRvIGAwYC4KICAgKgogICAqIElmIHRoZSBpbnB1dCBmaXRzIGluIFt3aWR0aF0gYml0cyB3aXRob3V0IHRydW5jYXRpb24sIHRoZSByZXN1bHQgaXMgdGhlCiAgICogc2FtZSBhcyB0aGUgaW5wdXQuICBUaGUgbWluaW11bSB3aWR0aCBuZWVkZWQgdG8gYXZvaWQgdHJ1bmNhdGlvbiBvZiBgeGAgaXMKICAgKiBnaXZlbiBieSBgeC5iaXRMZW5ndGhgLCBpLmUuCiAgICogYGBgCiAgICogeCA9PSB4LnRvVW5zaWduZWQoeC5iaXRMZW5ndGgpOwogICAqIGBgYAogICAqLwogIGludCB0b1Vuc2lnbmVkKGludCB3aWR0aCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGxlYXN0IHNpZ25pZmljYW50IFt3aWR0aF0gYml0cyBvZiB0aGlzIGludGVnZXIsIGV4dGVuZGluZyB0aGUKICAgKiBoaWdoZXN0IHJldGFpbmVkIGJpdCB0byB0aGUgc2lnbi4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdHJ1bmNhdGluZyB0aGUgdmFsdWUKICAgKiB0byBmaXQgaW4gW3dpZHRoXSBiaXRzIHVzaW5nIGFuIHNpZ25lZCAyLXMgY29tcGxlbWVudCByZXByZXNlbnRhdGlvbi4gIFRoZQogICAqIHJldHVybmVkIHZhbHVlIGhhcyB0aGUgc2FtZSBiaXQgdmFsdWUgaW4gYWxsIHBvc2l0aW9ucyBoaWdoZXIgdGhhbiBbd2lkdGhdLgogICAqCiAgICogYGBgCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYtLXNpZ24gYml0LVYKICAgKiAxNi50b1NpZ25lZCg1KSA9PSAtMTYgICAvLyAgMDAwMTAwMDAgLT4gMTExMTAwMDAKICAgKiAyMzkudG9TaWduZWQoNSkgPT0gMTUgICAvLyAgMTExMDExMTEgLT4gMDAwMDExMTEKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgXgogICAqIGBgYAogICAqIFRoaXMgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHRvIHNpbXVsYXRlIGFyaXRobWV0aWMgZnJvbSBsb3cgbGV2ZWwgbGFuZ3VhZ2VzLgogICAqIEZvciBleGFtcGxlLCB0byBpbmNyZW1lbnQgYW4gOCBiaXQgc2lnbmVkIHF1YW50aXR5OgogICAqIGBgYAogICAqIHEgPSAocSArIDEpLnRvU2lnbmVkKDgpOwogICAqIGBgYAogICAqIGBxYCB3aWxsIGNvdW50IGZyb20gYDBgIHVwIHRvIGAxMjdgLCB3cmFwIHRvIGAtMTI4YCBhbmQgY291bnQgYmFjayB1cCB0bwogICAqIGAxMjdgLgogICAqCiAgICogSWYgdGhlIGlucHV0IHZhbHVlIGZpdHMgaW4gW3dpZHRoXSBiaXRzIHdpdGhvdXQgdHJ1bmNhdGlvbiwgdGhlIHJlc3VsdCBpcwogICAqIHRoZSBzYW1lIGFzIHRoZSBpbnB1dC4gIFRoZSBtaW5pbXVtIHdpZHRoIG5lZWRlZCB0byBhdm9pZCB0cnVuY2F0aW9uIG9mIGB4YAogICAqIGlzIGB4LmJpdExlbmd0aCArIDFgLCBpLmUuCiAgICogYGBgCiAgICogeCA9PSB4LnRvU2lnbmVkKHguYml0TGVuZ3RoICsgMSk7CiAgICogYGBgCiAgICovCiAgaW50IHRvU2lnbmVkKGludCB3aWR0aCk7CgogIC8qKgogICAqIFJldHVybiB0aGUgbmVnYXRpdmUgdmFsdWUgb2YgdGhpcyBpbnRlZ2VyLgogICAqCiAgICogVGhlIHJlc3VsdCBvZiBuZWdhdGluZyBhbiBpbnRlZ2VyIGFsd2F5cyBoYXMgdGhlIG9wcG9zaXRlIHNpZ24sIGV4Y2VwdAogICAqIGZvciB6ZXJvLCB3aGljaCBpcyBpdHMgb3duIG5lZ2F0aW9uLgogICAqLwogIGludCBvcGVyYXRvciAtKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgaW50ZWdlci4KICAgKgogICAqIEZvciBhbnkgaW50ZWdlciBgeGAsIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMgYHggPCAwID8gLXggOiB4YC4KICAgKi8KICBpbnQgYWJzKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHNpZ24gb2YgdGhpcyBpbnRlZ2VyLgogICAqCiAgICogUmV0dXJucyAwIGZvciB6ZXJvLCAtMSBmb3IgdmFsdWVzIGxlc3MgdGhhbiB6ZXJvIGFuZAogICAqICsxIGZvciB2YWx1ZXMgZ3JlYXRlciB0aGFuIHplcm8uCiAgICovCiAgaW50IGdldCBzaWduOwoKICAvKiogUmV0dXJucyBgdGhpc2AuICovCiAgaW50IHJvdW5kKCk7CgogIC8qKiBSZXR1cm5zIGB0aGlzYC4gKi8KICBpbnQgZmxvb3IoKTsKCiAgLyoqIFJldHVybnMgYHRoaXNgLiAqLwogIGludCBjZWlsKCk7CgogIC8qKiBSZXR1cm5zIGB0aGlzYC4gKi8KICBpbnQgdHJ1bmNhdGUoKTsKCiAgLyoqIFJldHVybnMgYHRoaXMudG9Eb3VibGUoKWAuICovCiAgZG91YmxlIHJvdW5kVG9Eb3VibGUoKTsKCiAgLyoqIFJldHVybnMgYHRoaXMudG9Eb3VibGUoKWAuICovCiAgZG91YmxlIGZsb29yVG9Eb3VibGUoKTsKCiAgLyoqIFJldHVybnMgYHRoaXMudG9Eb3VibGUoKWAuICovCiAgZG91YmxlIGNlaWxUb0RvdWJsZSgpOwoKICAvKiogUmV0dXJucyBgdGhpcy50b0RvdWJsZSgpYC4gKi8KICBkb3VibGUgdHJ1bmNhdGVUb0RvdWJsZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaW50ZWdlci4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgcGFyc2FibGUgYnkgW3BhcnNlXS4KICAgKiBGb3IgYW55IGBpbnRgIGBpYCwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0CiAgICogYGkgPT0gaW50LnBhcnNlKGkudG9TdHJpbmcoKSlgLgogICAqLwogIFN0cmluZyB0b1N0cmluZygpOwoKICAvKioKICAgKiBDb252ZXJ0cyBbdGhpc10gdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW4gdGhlIGdpdmVuIFtyYWRpeF0uCiAgICoKICAgKiBJbiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLCBsb3dlci1jYXNlIGxldHRlcnMgYXJlIHVzZWQgZm9yIGRpZ2l0cyBhYm92ZQogICAqICc5Jywgd2l0aCAnYScgYmVpbmcgMTAgYW4gJ3onIGJlaW5nIDM1LgogICAqCiAgICogVGhlIFtyYWRpeF0gYXJndW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAyIHRvIDM2LgogICAqLwogIFN0cmluZyB0b1JhZGl4U3RyaW5nKGludCByYWRpeCk7CgogIC8qKgogICAqIFBhcnNlIFtzb3VyY2VdIGFzIGEsIHBvc3NpYmx5IHNpZ25lZCwgaW50ZWdlciBsaXRlcmFsIGFuZCByZXR1cm4gaXRzIHZhbHVlLgogICAqCiAgICogVGhlIFtzb3VyY2VdIG11c3QgYmUgYSBub24tZW1wdHkgc2VxdWVuY2Ugb2YgYmFzZS1bcmFkaXhdIGRpZ2l0cywKICAgKiBvcHRpb25hbGx5IHByZWZpeGVkIHdpdGggYSBtaW51cyBvciBwbHVzIHNpZ24gKCctJyBvciAnKycpLgogICAqIEl0IG11c3Qgbm90IGJlIGBudWxsYC4KICAgKgogICAqIFRoZSBbcmFkaXhdIG11c3QgYmUgaW4gdGhlIHJhbmdlIDIuLjM2LiBUaGUgZGlnaXRzIHVzZWQgYXJlCiAgICogZmlyc3QgdGhlIGRlY2ltYWwgZGlnaXRzIDAuLjksIGFuZCB0aGVuIHRoZSBsZXR0ZXJzICdhJy4uJ3onIHdpdGgKICAgKiB2YWx1ZXMgMTAgdGhyb3VnaCAzNS4gQWxzbyBhY2NlcHRzIHVwcGVyLWNhc2UgbGV0dGVycyB3aXRoIHRoZSBzYW1lCiAgICogdmFsdWVzIGFzIHRoZSBsb3dlci1jYXNlIG9uZXMuCiAgICoKICAgKiBJZiBubyBbcmFkaXhdIGlzIGdpdmVuIHRoZW4gaXQgZGVmYXVsdHMgdG8gMTAuIEluIHRoaXMgY2FzZSwgdGhlIFtzb3VyY2VdCiAgICogZGlnaXRzIG1heSBhbHNvIHN0YXJ0IHdpdGggYDB4YCwgaW4gd2hpY2ggY2FzZSB0aGUgbnVtYmVyIGlzIGludGVycHJldGVkCiAgICogYXMgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyIGxpdGVyYWwsCiAgICogV2hlbiBgaW50YCBpcyBpbXBsZW1lbnRlZCBieSA2NC1iaXQgc2lnbmVkIGludGVnZXJzLAogICAqIGhleGFkZWNpbWFsIGludGVnZXIgbGl0ZXJhbHMgbWF5IHJlcHJlc2VudCB2YWx1ZXMgbGFyZ2VyIHRoYW4KICAgKiAyPHN1cD42Mzwvc3VwPiwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgaXMgcGFyc2VkIGFzIGlmIGl0IGlzIGFuCiAgICogKnVuc2lnbmVkKiBudW1iZXIsIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlIGlzIHRoZSBjb3JyZXNwb25kaW5nCiAgICogc2lnbmVkIGludGVnZXIgdmFsdWUuCiAgICoKICAgKiBGb3IgYW55IGludCBgbmAgYW5kIHZhbGlkIHJhZGl4IGByYCwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0CiAgICogYG4gPT0gaW50LnBhcnNlKG4udG9SYWRpeFN0cmluZyhyKSwgcmFkaXg6IHIpYC4KICAgKgogICAqIElmIHRoZSBbc291cmNlXSBzdHJpbmcgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGludGVnZXIgbGl0ZXJhbCwKICAgKiBvcHRpb25hbGx5IHByZWZpeGVkIGJ5IGEgc2lnbiwgYSBbRm9ybWF0RXhjZXB0aW9uXSBpcyB0aHJvd24KICAgKiAodW5sZXNzIHRoZSBkZXByZWNhdGVkIFtvbkVycm9yXSBwYXJhbWV0ZXIgaXMgdXNlZCwgc2VlIGJlbG93KS4KICAgKgogICAqIEluc3RlYWQgb2YgdGhyb3dpbmcgYW5kIGltbWVkaWF0ZWx5IGNhdGNoaW5nIHRoZSBbRm9ybWF0RXhjZXB0aW9uXSwKICAgKiBpbnN0ZWFkIHVzZSBbdHJ5UGFyc2VdIHRvIGhhbmRsZSBhIHBhcnNpbmcgZXJyb3IuCiAgICogRXhhbXBsZToKICAgKiBgYGBkYXJ0CiAgICogdmFyIHZhbHVlID0gaW50LnRyeVBhcnNlKHRleHQpOwogICAqIGlmICh2YWx1ZSA9PSBudWxsKSAuLi4gaGFuZGxlIHRoZSBwcm9ibGVtCiAgICogYGBgCiAgICoKICAgKiBUaGUgW29uRXJyb3JdIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQuCiAgICogSW5zdGVhZCBvZiBgaW50LnBhcnNlKHN0cmluZywgb25FcnJvcjogKHN0cmluZykgPT4gLi4uKWAsCiAgICogeW91IHNob3VsZCB1c2UgYGludC50cnlQYXJzZShzdHJpbmcpID8/ICguLi4pYC4KICAgKgogICAqIFdoZW4gdGhlIHNvdXJjZSBzdHJpbmcgaXMgbm90IHZhbGlkIGFuZCBbb25FcnJvcl0gaXMgcHJvdmlkZWQsCiAgICogd2hlbmV2ZXIgYSBbRm9ybWF0RXhjZXB0aW9uXSB3b3VsZCBiZSB0aHJvd24sCiAgICogW29uRXJyb3JdIGlzIGluc3RlYWQgY2FsbGVkIHdpdGggW3NvdXJjZV0gYXMgYXJndW1lbnQsCiAgICogYW5kIHRoZSByZXN1bHQgb2YgdGhhdCBjYWxsIGlzIHJldHVybmVkIGJ5IFtwYXJzZV0uCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIGludCBwYXJzZShTdHJpbmcgc291cmNlLAogICAgICB7aW50IHJhZGl4LCBAZGVwcmVjYXRlZCBpbnQgb25FcnJvcihTdHJpbmcgc291cmNlKX0pOwoKICAvKioKICAgKiBQYXJzZSBbc291cmNlXSBhcyBhLCBwb3NzaWJseSBzaWduZWQsIGludGVnZXIgbGl0ZXJhbCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KICAgKgogICAqIExpa2UgW3BhcnNlXSBleGNlcHQgdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYG51bGxgIHdoZXJlIGEKICAgKiBzaW1pbGFyIGNhbGwgdG8gW3BhcnNlXSB3b3VsZCB0aHJvdyBhIFtGb3JtYXRFeGNlcHRpb25dLAogICAqIGFuZCB0aGUgW3NvdXJjZV0gbXVzdCBzdGlsbCBub3QgYmUgYG51bGxgLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBpbnQgdHJ5UGFyc2UoU3RyaW5nIHNvdXJjZSwge2ludCByYWRpeH0pOwp9CoFlAE5OPAETAQQWA0s4A01OTU8OOkdNPAM2BCEGTAU1CUgZCQ4JQAkGTExQIigaTwEGHAVMTR0FRiEGHQEGGwVMTxsFRCcGHQEGJQVMTSkFRScGHQEGIwVGOAUsBhQBBkIFSykFSEsLBTIGJAEGQwVIQBoFMgYkAQZHBT8PBikBBkAXBSUFMgYfAQZGBUovBT42BTMFQgYWATsTAToSAQZIBU5OTgVNKgklBScnJycnJycnCQYVAQZFUTUJOglRMgkgCUYFTVAiCSUJBh0BBk9RUFEFCTI2NjIJUTkJHglODAVPUSAJJwkGGwEGMAVMKgYUAQYxBUYGDQEGJwU6JgYQARkPARkPARkOARkSASQaASQaASQZASQdAQY2BTEuJQYVAQZGBVAtBUMGIwEGUQVHQRwFQUdJJAVPTic6Q0ZFGwVANQVGQkUFSTcODSUvCQVAPzUFRDM8OQYrPAEGUQVDPjAGPAIBEmRhcnQ6Y29yZS9pbnQuZGFydDNvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2ludGVnZXJzX3BhdGNoLmRhcnSsIy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKLy8vIFZNIGltcGxlbWVudGF0aW9uIG9mIGludC4KQHBhdGNoCmNsYXNzIGludCB7CiAgQHBhdGNoCiAgY29uc3QgZmFjdG9yeSBpbnQuZnJvbUVudmlyb25tZW50KFN0cmluZyBuYW1lLCB7aW50IGRlZmF1bHRWYWx1ZX0pCiAgICAgIG5hdGl2ZSAiSW50ZWdlcl9mcm9tRW52aXJvbm1lbnQiOwoKICBpbnQgX2JpdEFuZEZyb21TbWkoX1NtaSBvdGhlcik7CiAgaW50IF9iaXRBbmRGcm9tSW50ZWdlcihpbnQgb3RoZXIpOwogIGludCBfYml0T3JGcm9tSW50ZWdlcihpbnQgb3RoZXIpOwogIGludCBfYml0WG9yRnJvbUludGVnZXIoaW50IG90aGVyKTsKICBpbnQgX3NockZyb21JbnRlZ2VyKGludCBvdGhlcik7CiAgaW50IF9zaGxGcm9tSW50ZWdlcihpbnQgb3RoZXIpOwoKICBzdGF0aWMgaW50IF90cnlQYXJzZVNtaShTdHJpbmcgc3RyLCBpbnQgZmlyc3QsIGludCBsYXN0KSB7CiAgICBhc3NlcnQoZmlyc3QgPD0gbGFzdCk7CiAgICB2YXIgaXggPSBmaXJzdDsKICAgIHZhciBzaWduID0gMTsKICAgIHZhciBjID0gc3RyLmNvZGVVbml0QXQoaXgpOwogICAgLy8gQ2hlY2sgZm9yIGxlYWRpbmcgJysnIG9yICctJy4KICAgIGlmICgoYyA9PSAweDJiKSB8fCAoYyA9PSAweDJkKSkgewogICAgICBpeCsrOwogICAgICBzaWduID0gMHgyYyAtIGM7IC8vIC0xIGZvciAnLScsICsxIGZvciAnKycuCiAgICAgIGlmIChpeCA+IGxhc3QpIHsKICAgICAgICByZXR1cm4gbnVsbDsgLy8gRW1wdHkuCiAgICAgIH0KICAgIH0KICAgIHZhciBzbWlMaW1pdCA9IGlzNjRCaXQgPyAxOCA6IDk7CiAgICBpZiAoKGxhc3QgLSBpeCkgPj0gc21pTGltaXQpIHsKICAgICAgcmV0dXJuIG51bGw7IC8vIE1heSBub3QgZml0IGludG8gYSBTbWkuCiAgICB9CiAgICB2YXIgcmVzdWx0ID0gMDsKICAgIGZvciAoaW50IGkgPSBpeDsgaSA8PSBsYXN0OyBpKyspIHsKICAgICAgdmFyIGMgPSAweDMwIF4gc3RyLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmICg5IDwgYykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJlc3VsdCA9IDEwICogcmVzdWx0ICsgYzsKICAgIH0KICAgIHJldHVybiBzaWduICogcmVzdWx0OwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIGludCBwYXJzZShTdHJpbmcgc291cmNlLCB7aW50IHJhZGl4LCBpbnQgb25FcnJvcihTdHJpbmcgc291cmNlKX0pIHsKICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSBzb3VyY2UgbXVzdCBub3QgYmUgbnVsbCIpOwogICAgaWYgKHNvdXJjZS5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBfdGhyb3dGb3JtYXRFeGNlcHRpb24ob25FcnJvciwgc291cmNlLCAwLCByYWRpeCwgbnVsbCk7CiAgICB9CiAgICBpZiAocmFkaXggPT0gbnVsbCB8fCByYWRpeCA9PSAxMCkgewogICAgICAvLyBUcnkgcGFyc2luZyBpbW1lZGlhdGVseSwgd2l0aG91dCB0cmltbWluZyB3aGl0ZXNwYWNlLgogICAgICBpbnQgcmVzdWx0ID0gX3RyeVBhcnNlU21pKHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCAtIDEpOwogICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CiAgICB9IGVsc2UgaWYgKHJhZGl4IDwgMiB8fCByYWRpeCA+IDM2KSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJSYWRpeCAkcmFkaXggbm90IGluIHJhbmdlIDIuLjM2Iik7CiAgICB9CiAgICAvLyBTcGxpdCBoZXJlIHNvIGltcHJvdmUgb2RkcyBvZiBwYXJzZSBiZWluZyBpbmxpbmVkIGFuZCB0aGUgY2hlY2tzIG9taXR0ZWQuCiAgICByZXR1cm4gX3BhcnNlKHNvdXJjZSwgcmFkaXgsIG9uRXJyb3IpOwogIH0KCiAgc3RhdGljIGludCBfcGFyc2UoX1N0cmluZ0Jhc2Ugc291cmNlLCBpbnQgcmFkaXgsIG9uRXJyb3IpIHsKICAgIGludCBlbmQgPSBzb3VyY2UuX2xhc3ROb25XaGl0ZXNwYWNlKCkgKyAxOwogICAgaWYgKGVuZCA9PSAwKSB7CiAgICAgIHJldHVybiBfdGhyb3dGb3JtYXRFeGNlcHRpb24ob25FcnJvciwgc291cmNlLCBzb3VyY2UubGVuZ3RoLCByYWRpeCwgbnVsbCk7CiAgICB9CiAgICBpbnQgc3RhcnQgPSBzb3VyY2UuX2ZpcnN0Tm9uV2hpdGVzcGFjZSgpOwoKICAgIGludCBmaXJzdCA9IHNvdXJjZS5jb2RlVW5pdEF0KHN0YXJ0KTsKICAgIGludCBzaWduID0gMTsKICAgIGlmIChmaXJzdCA9PSAweDJiIC8qICsgKi8gfHwgZmlyc3QgPT0gMHgyZCAvKiAtICovKSB7CiAgICAgIHNpZ24gPSAweDJjIC0gZmlyc3Q7IC8vIC0xIGlmICctJywgKzEgaWYgJysnLgogICAgICBzdGFydCsrOwogICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CiAgICAgICAgcmV0dXJuIF90aHJvd0Zvcm1hdEV4Y2VwdGlvbihvbkVycm9yLCBzb3VyY2UsIGVuZCwgcmFkaXgsIG51bGwpOwogICAgICB9CiAgICAgIGZpcnN0ID0gc291cmNlLmNvZGVVbml0QXQoc3RhcnQpOwogICAgfQogICAgaWYgKHJhZGl4ID09IG51bGwpIHsKICAgICAgLy8gY2hlY2sgZm9yIDB4IHByZWZpeC4KICAgICAgaW50IGluZGV4ID0gc3RhcnQ7CiAgICAgIGlmIChmaXJzdCA9PSAweDMwIC8qIDAgKi8pIHsKICAgICAgICBpbmRleCsrOwogICAgICAgIGlmIChpbmRleCA9PSBlbmQpIHJldHVybiAwOwogICAgICAgIGZpcnN0ID0gc291cmNlLmNvZGVVbml0QXQoaW5kZXgpOwogICAgICAgIGlmICgoZmlyc3QgfCAweDIwKSA9PSAweDc4IC8qIHggKi8pIHsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBpZiAoaW5kZXggPT0gZW5kKSB7CiAgICAgICAgICAgIHJldHVybiBfdGhyb3dGb3JtYXRFeGNlcHRpb24ob25FcnJvciwgc291cmNlLCBpbmRleCwgbnVsbCwgbnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gX3BhcnNlUmFkaXgoc291cmNlLCAxNiwgaW5kZXgsIGVuZCwgc2lnbiwgc2lnbiA+IDAsIG9uRXJyb3IpOwogICAgICAgIH0KICAgICAgfQogICAgICByYWRpeCA9IDEwOwogICAgfQogICAgcmV0dXJuIF9wYXJzZVJhZGl4KHNvdXJjZSwgcmFkaXgsIHN0YXJ0LCBlbmQsIHNpZ24sIGZhbHNlLCBvbkVycm9yKTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBpbnQgdHJ5UGFyc2UoU3RyaW5nIHNvdXJjZSwge2ludCByYWRpeH0pIHsKICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSBzb3VyY2UgbXVzdCBub3QgYmUgbnVsbCIpOwogICAgaWYgKHNvdXJjZS5pc0VtcHR5KSByZXR1cm4gbnVsbDsKICAgIGlmIChyYWRpeCA9PSBudWxsIHx8IHJhZGl4ID09IDEwKSB7CiAgICAgIC8vIFRyeSBwYXJzaW5nIGltbWVkaWF0ZWx5LCB3aXRob3V0IHRyaW1taW5nIHdoaXRlc3BhY2UuCiAgICAgIGludCByZXN1bHQgPSBfdHJ5UGFyc2VTbWkoc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoIC0gMSk7CiAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgcmV0dXJuIHJlc3VsdDsKICAgIH0gZWxzZSBpZiAocmFkaXggPCAyIHx8IHJhZGl4ID4gMzYpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlJhZGl4ICRyYWRpeCBub3QgaW4gcmFuZ2UgMi4uMzYiKTsKICAgIH0KICAgIHRyeSB7CiAgICAgIHJldHVybiBfcGFyc2Uoc291cmNlLCByYWRpeCwgX2tOdWxsKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBzdGF0aWMgTnVsbCBfa051bGwoXykgPT4gbnVsbDsKCiAgc3RhdGljIGludCBfdGhyb3dGb3JtYXRFeGNlcHRpb24ob25FcnJvciwgc291cmNlLCBpbmRleCwgcmFkaXgsIG1lc3NhZ2UpIHsKICAgIGlmIChvbkVycm9yICE9IG51bGwpIHJldHVybiBvbkVycm9yKHNvdXJjZSk7CiAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24obWVzc2FnZSwgc291cmNlLCBpbmRleCk7CiAgICB9CiAgICBpZiAocmFkaXggPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIG51bWJlciIsIHNvdXJjZSwgaW5kZXgpOwogICAgfQogICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCByYWRpeC0kcmFkaXggbnVtYmVyIiwgc291cmNlLCBpbmRleCk7CiAgfQoKICBzdGF0aWMgaW50IF9wYXJzZVJhZGl4KFN0cmluZyBzb3VyY2UsIGludCByYWRpeCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgc2lnbiwKICAgICAgYm9vbCBhbGxvd1U2NCwgb25FcnJvcikgewogICAgaW50IHRhYmxlSW5kZXggPSAocmFkaXggLSAyKSAqIDQgKyAoaXM2NEJpdCA/IDIgOiAwKTsKICAgIGludCBibG9ja1NpemUgPSBfUEFSU0VfTElNSVRTW3RhYmxlSW5kZXhdOwogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGxlbmd0aCA8PSBibG9ja1NpemUpIHsKICAgICAgX1NtaSBzbWkgPSBfcGFyc2VCbG9jayhzb3VyY2UsIHJhZGl4LCBzdGFydCwgZW5kKTsKICAgICAgaWYgKHNtaSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIF90aHJvd0Zvcm1hdEV4Y2VwdGlvbihvbkVycm9yLCBzb3VyY2UsIHN0YXJ0LCByYWRpeCwgbnVsbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNpZ24gKiBzbWk7CiAgICB9CgogICAgLy8gT2Z0ZW4gY2hlYXBlciB0aGFuOiBpbnQgc21hbGxCbG9ja1NpemUgPSBsZW5ndGggJSBibG9ja1NpemU7CiAgICAvLyBiZWNhdXNlIGRpZ2l0IGNvdW50IGdlbmVyYWxseSB0ZW5kcyB0b3dhcmRzIHNtYWxsZXIuIHJhdGhlcgogICAgLy8gdGhhbiBsYXJnZXIuCiAgICBpbnQgc21hbGxCbG9ja1NpemUgPSBsZW5ndGg7CiAgICB3aGlsZSAoc21hbGxCbG9ja1NpemUgPj0gYmxvY2tTaXplKSBzbWFsbEJsb2NrU2l6ZSAtPSBibG9ja1NpemU7CiAgICBpbnQgcmVzdWx0ID0gMDsKICAgIGlmIChzbWFsbEJsb2NrU2l6ZSA+IDApIHsKICAgICAgaW50IGJsb2NrRW5kID0gc3RhcnQgKyBzbWFsbEJsb2NrU2l6ZTsKICAgICAgX1NtaSBzbWkgPSBfcGFyc2VCbG9jayhzb3VyY2UsIHJhZGl4LCBzdGFydCwgYmxvY2tFbmQpOwogICAgICBpZiAoc21pID09IG51bGwpIHsKICAgICAgICByZXR1cm4gX3Rocm93Rm9ybWF0RXhjZXB0aW9uKG9uRXJyb3IsIHNvdXJjZSwgc3RhcnQsIHJhZGl4LCBudWxsKTsKICAgICAgfQogICAgICByZXN1bHQgPSBzaWduICogc21pOwogICAgICBzdGFydCA9IGJsb2NrRW5kOwogICAgfQogICAgaW50IG11bHRpcGxpZXIgPSBfUEFSU0VfTElNSVRTW3RhYmxlSW5kZXggKyAxXTsKICAgIGludCBwb3NpdGl2ZU92ZXJmbG93TGltaXQgPSAwOwogICAgaW50IG5lZ2F0aXZlT3ZlcmZsb3dMaW1pdCA9IDA7CiAgICB0YWJsZUluZGV4ID0gdGFibGVJbmRleCA8PCAxOyAvLyBwcmUtbXVsdGlwbHkgYnkgMiBmb3Igc2ltcGxlciBpbmRleGluZwogICAgcG9zaXRpdmVPdmVyZmxvd0xpbWl0ID0gX2ludDY0T3ZlcmZsb3dMaW1pdHNbdGFibGVJbmRleF07CiAgICBpZiAocG9zaXRpdmVPdmVyZmxvd0xpbWl0ID09IDApIHsKICAgICAgcG9zaXRpdmVPdmVyZmxvd0xpbWl0ID0gX2luaXRJbnQ2NE92ZXJmbG93TGltaXRzKHRhYmxlSW5kZXgsIG11bHRpcGxpZXIpOwogICAgfQogICAgbmVnYXRpdmVPdmVyZmxvd0xpbWl0ID0gX2ludDY0T3ZlcmZsb3dMaW1pdHNbdGFibGVJbmRleCArIDFdOwogICAgaW50IGJsb2NrRW5kID0gc3RhcnQgKyBibG9ja1NpemU7CiAgICBkbyB7CiAgICAgIF9TbWkgc21pID0gX3BhcnNlQmxvY2soc291cmNlLCByYWRpeCwgc3RhcnQsIGJsb2NrRW5kKTsKICAgICAgaWYgKHNtaSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIF90aHJvd0Zvcm1hdEV4Y2VwdGlvbihvbkVycm9yLCBzb3VyY2UsIHN0YXJ0LCByYWRpeCwgbnVsbCk7CiAgICAgIH0KICAgICAgaWYgKHJlc3VsdCA+PSBwb3NpdGl2ZU92ZXJmbG93TGltaXQpIHsKICAgICAgICBpZiAoKHJlc3VsdCA+IHBvc2l0aXZlT3ZlcmZsb3dMaW1pdCkgfHwKICAgICAgICAgICAgKHNtaSA+IF9pbnQ2NE92ZXJmbG93TGltaXRzW3RhYmxlSW5kZXggKyAyXSkpIHsKICAgICAgICAgIC8vIEFsdGhvdWdoIHRoZSB1bnNpZ25lZCBvdmVyZmxvdyBsaW1pdHMgZG8gbm90IGRlcGVuZCBvbiB0aGUKICAgICAgICAgIC8vIHBsYXRmb3JtLCB0aGUgbXVsdGlwbGllciBhbmQgYmxvY2sgc2l6ZSwgd2hpY2ggYXJlIHVzZWQgdG8KICAgICAgICAgIC8vIGNvbXB1dGUgaXQsIGRvLgogICAgICAgICAgaW50IFggPSBpczY0Qml0ID8gMSA6IDA7CiAgICAgICAgICBpZiAoYWxsb3dVNjQgJiYKICAgICAgICAgICAgICAhKHJlc3VsdCA+PSBfaW50NjRVbnNpZ25lZE92ZXJmbG93TGltaXRzW1hdICYmCiAgICAgICAgICAgICAgICAgIChyZXN1bHQgPiBfaW50NjRVbnNpZ25lZE92ZXJmbG93TGltaXRzW1hdIHx8CiAgICAgICAgICAgICAgICAgICAgICBzbWkgPiBfaW50NjRVbnNpZ25lZFNtaU92ZXJmbG93TGltaXRzW1hdKSkgJiYKICAgICAgICAgICAgICBibG9ja0VuZCArIGJsb2NrU2l6ZSA+IGVuZCkgewogICAgICAgICAgICByZXR1cm4gKHJlc3VsdCAqIG11bHRpcGxpZXIpICsgc21pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIF90aHJvd0Zvcm1hdEV4Y2VwdGlvbihvbkVycm9yLCBzb3VyY2UsIG51bGwsIHJhZGl4LAogICAgICAgICAgICAgICJQb3NpdGl2ZSBpbnB1dCBleGNlZWRzIHRoZSBsaW1pdCBvZiBpbnRlZ2VyIik7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHJlc3VsdCA8PSBuZWdhdGl2ZU92ZXJmbG93TGltaXQpIHsKICAgICAgICBpZiAoKHJlc3VsdCA8IG5lZ2F0aXZlT3ZlcmZsb3dMaW1pdCkgfHwKICAgICAgICAgICAgKHNtaSA+IF9pbnQ2NE92ZXJmbG93TGltaXRzW3RhYmxlSW5kZXggKyAzXSkpIHsKICAgICAgICAgIHJldHVybiBfdGhyb3dGb3JtYXRFeGNlcHRpb24ob25FcnJvciwgc291cmNlLCBudWxsLCByYWRpeCwKICAgICAgICAgICAgICAiTmVnYXRpdmUgaW5wdXQgZXhjZWVkcyB0aGUgbGltaXQgb2YgaW50ZWdlciIpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXN1bHQgPSAocmVzdWx0ICogbXVsdGlwbGllcikgKyAoc2lnbiAqIHNtaSk7CiAgICAgIHN0YXJ0ID0gYmxvY2tFbmQ7CiAgICAgIGJsb2NrRW5kID0gc3RhcnQgKyBibG9ja1NpemU7CiAgICB9IHdoaWxlIChibG9ja0VuZCA8PSBlbmQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIFBhcnNlIGJsb2NrIG9mIGRpZ2l0cyBpbnRvIGEgU21pLgogIHN0YXRpYyBfU21pIF9wYXJzZUJsb2NrKFN0cmluZyBzb3VyY2UsIGludCByYWRpeCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBfU21pIHJlc3VsdCA9IDA7CiAgICBpZiAocmFkaXggPD0gMTApIHsKICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICBpbnQgZGlnaXQgPSBzb3VyY2UuY29kZVVuaXRBdChpKSBeIDB4MzA7CiAgICAgICAgaWYgKGRpZ2l0ID49IHJhZGl4KSByZXR1cm4gbnVsbDsKICAgICAgICByZXN1bHQgPSByYWRpeCAqIHJlc3VsdCArIGRpZ2l0OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgIGludCBjaGFyID0gc291cmNlLmNvZGVVbml0QXQoaSk7CiAgICAgICAgaW50IGRpZ2l0ID0gY2hhciBeIDB4MzA7CiAgICAgICAgaWYgKGRpZ2l0ID4gOSkgewogICAgICAgICAgZGlnaXQgPSAoY2hhciB8IDB4MjApIC0gKDB4NjEgLSAxMCk7CiAgICAgICAgICBpZiAoZGlnaXQgPCAxMCB8fCBkaWdpdCA+PSByYWRpeCkgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJhZGl4ICogcmVzdWx0ICsgZGlnaXQ7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBGb3IgZWFjaCByYWRpeCwgMi0zNiwgaG93IG1hbnkgZGlnaXRzIGFyZSBndWFyYW50ZWVkIHRvIGZpdCBpbiBhIHNtaSwKICAvLyBhbmQgbWFnbml0dWRlIG9mIHN1Y2ggYSBibG9jayAocmFkaXggKiogZGlnaXQtY291bnQpLgogIC8vIDMyLWJpdCBsaW1pdC9tdWx0aXBsaWVyIGF0IChyYWRpeCAtIDIpKjQsIDY0LWJpdCBsaW1pdCBhdCAocmFkaXgtMikqNCsyCiAgc3RhdGljIGNvbnN0IF9QQVJTRV9MSU1JVFMgPSBjb25zdCBbCiAgICAzMCwgMTA3Mzc0MTgyNCwgNjIsIDQ2MTE2ODYwMTg0MjczODc5MDQsIC8vIHJhZGl4OiAyCiAgICAxOCwgMzg3NDIwNDg5LCAzOSwgNDA1MjU1NTE1MzAxODk3NjI2NywKICAgIDE1LCAxMDczNzQxODI0LCAzMCwgMTE1MjkyMTUwNDYwNjg0Njk3NiwKICAgIDEyLCAyNDQxNDA2MjUsIDI2LCAxNDkwMTE2MTE5Mzg0NzY1NjI1LCAvLyAgcmFkaXg6IDUKICAgIDExLCAzNjI3OTcwNTYsIDIzLCA3ODk3MzAyMjMwNTM2MDI4MTYsCiAgICAxMCwgMjgyNDc1MjQ5LCAyMiwgMzkwOTgyMTA0ODU4Mjk4ODA0OSwKICAgIDEwLCAxMDczNzQxODI0LCAyMCwgMTE1MjkyMTUwNDYwNjg0Njk3NiwKICAgIDksIDM4NzQyMDQ4OSwgMTksIDEzNTA4NTE3MTc2NzI5OTIwODksCiAgICA5LCAxMDAwMDAwMDAwLCAxOCwgMTAwMDAwMDAwMDAwMDAwMDAwMCwgLy8gIHJhZGl4OiAxMAogICAgOCwgMjE0MzU4ODgxLCAxNywgNTA1NDQ3MDI4NDk5MjkzNzcxLAogICAgOCwgNDI5OTgxNjk2LCAxNywgMjIxODYxMTEwNjc0MDQzNjk5MiwKICAgIDgsIDgxNTczMDcyMSwgMTYsIDY2NTQxNjYwOTE4MzE3OTg0MSwKICAgIDcsIDEwNTQxMzUwNCwgMTYsIDIxNzc5NTMzMzc4MDkzNzExMzYsCiAgICA3LCAxNzA4NTkzNzUsIDE1LCA0Mzc4OTM4OTAzODA4NTkzNzUsIC8vICAgIHJhZGl4OiAxNQogICAgNywgMjY4NDM1NDU2LCAxNSwgMTE1MjkyMTUwNDYwNjg0Njk3NiwKICAgIDcsIDQxMDMzODY3MywgMTUsIDI4NjI0MjMwNTE1MDk4MTU3OTMsCiAgICA3LCA2MTIyMjAwMzIsIDE0LCAzNzQ4MTMzNjc1ODIwODEwMjQsCiAgICA3LCA4OTM4NzE3MzksIDE0LCA3OTkwMDY2ODU3ODI4ODQxMjEsCiAgICA2LCA2NDAwMDAwMCwgMTQsIDE2Mzg0MDAwMDAwMDAwMDAwMDAsIC8vICAgIHJhZGl4OiAyMAogICAgNiwgODU3NjYxMjEsIDE0LCAzMjQzOTE5OTMyNTIxNTA4NjgxLAogICAgNiwgMTEzMzc5OTA0LCAxMywgMjgyODEwMDU3ODgzMDgyNzUyLAogICAgNiwgMTQ4MDM1ODg5LCAxMywgNTA0MDM2MzYxOTM2NDY3MzgzLAogICAgNiwgMTkxMTAyOTc2LCAxMywgODc2NDg4MzM4NDY1MzU3ODI0LAogICAgNiwgMjQ0MTQwNjI1LCAxMywgMTQ5MDExNjExOTM4NDc2NTYyNSwgLy8gICByYWRpeDogMjUKICAgIDYsIDMwODkxNTc3NiwgMTMsIDI0ODExNTI4NzMyMDM3MzY1NzYsCiAgICA2LCAzODc0MjA0ODksIDEzLCA0MDUyNTU1MTUzMDE4OTc2MjY3LAogICAgNiwgNDgxODkwMzA0LCAxMiwgMjMyMjE4MjY1MDg5MjEyNDE2LAogICAgNiwgNTk0ODIzMzIxLCAxMiwgMzUzODE0NzgzMjA1NDY5MDQxLAogICAgNiwgNzI5MDAwMDAwLCAxMiwgNTMxNDQxMDAwMDAwMDAwMDAwLCAvLyAgICByYWRpeDogMzAKICAgIDYsIDg4NzUwMzY4MSwgMTIsIDc4NzY2Mjc4Mzc4ODU0OTc2MSwKICAgIDYsIDEwNzM3NDE4MjQsIDEyLCAxMTUyOTIxNTA0NjA2ODQ2OTc2LAogICAgNSwgMzkxMzUzOTMsIDEyLCAxNjY3ODg5NTE0OTUyOTg0OTYxLAogICAgNSwgNDU0MzU0MjQsIDEyLCAyMzg2NDIwNjgzNjkzMTAxMDU2LAogICAgNSwgNTI1MjE4NzUsIDEyLCAzMzc5MjIwNTA4MDU2NjQwNjI1LCAvLyAgICByYWRpeDogMzUKICAgIDUsIDYwNDY2MTc2LCAxMSwgMTMxNjIxNzAzODQyMjY3MTM2LAogIF07CgogIHN0YXRpYyBjb25zdCBfbWF4SW50NjQgPSAweDdmZmZmZmZmZmZmZmZmZmY7CiAgc3RhdGljIGNvbnN0IF9taW5JbnQ2NCA9IC0weDgwMDAwMDAwMDAwMDAwMDA7CgogIHN0YXRpYyBjb25zdCBfaW50NjRVbnNpZ25lZE92ZXJmbG93TGltaXRzID0gY29uc3QgWzB4ZmZmZmZmZmZmLCAweGZdOwogIHN0YXRpYyBjb25zdCBfaW50NjRVbnNpZ25lZFNtaU92ZXJmbG93TGltaXRzID0gY29uc3QgWwogICAgMHhmZmZmZmZmLAogICAgMHhmZmZmZmZmZmZmZmZmZmYKICBdOwoKICAvLy8gQ2FsY3VsYXRpb24gb2YgdGhlIGV4cHJlc3Npb24KICAvLy8KICAvLy8gICByZXN1bHQgPSAocmVzdWx0ICogbXVsdGlwbGllcikgKyAoc2lnbiAqIHNtaSkKICAvLy8KICAvLy8gaW4gYF9wYXJzZVJhZGl4KClgIG1heSBvdmVyZmxvdyA2NC1iaXQgaW50ZWdlcnMuIEluIHN1Y2ggY2FzZSwKICAvLy8gYGludC5wYXJzZSgpYCBzaG91bGQgc3RvcCB3aXRoIGFuIGVycm9yLgogIC8vLwogIC8vLyBUaGlzIHRhYmxlIGlzIGxhemlseSBmaWxsZWQgd2l0aCBpbnQ2NCBvdmVyZmxvdyBsaW1pdHMgZm9yIHJlc3VsdCBhbmQgc21pLgogIC8vLyBGb3IgZWFjaCBtdWx0aXBsaWVyIGZyb20gYF9QQVJTRV9MSU1JVFNbdGFibGVJbmRleCArIDFdYCB0aGlzIHRhYmxlCiAgLy8vIGNvbnRhaW5zCiAgLy8vCiAgLy8vICogYFt0YWJsZUluZGV4KjJdYCA9IHBvc2l0aXZlIGxpbWl0IGZvciByZXN1bHQKICAvLy8gKiBgW3RhYmxlSW5kZXgqMiArIDFdYCA9IG5lZ2F0aXZlIGxpbWl0IGZvciByZXN1bHQKICAvLy8gKiBgW3RhYmxlSW5kZXgqMiArIDJdYCA9IGxpbWl0IGZvciBzbWkgaWYgcmVzdWx0IGlzIGV4YWN0bHkgYXQgcG9zaXRpdmUgbGltaXQKICAvLy8gKiBgW3RhYmxlSW5kZXgqMiArIDNdYCA9IGxpbWl0IGZvciBzbWkgaWYgcmVzdWx0IGlzIGV4YWN0bHkgYXQgbmVnYXRpdmUgbGltaXQKICBzdGF0aWMgZmluYWwgSW50NjRMaXN0IF9pbnQ2NE92ZXJmbG93TGltaXRzID0KICAgICAgbmV3IEludDY0TGlzdChfUEFSU0VfTElNSVRTLmxlbmd0aCAqIDIpOwoKICBzdGF0aWMgaW50IF9pbml0SW50NjRPdmVyZmxvd0xpbWl0cyhpbnQgdGFibGVJbmRleCwgaW50IG11bHRpcGxpZXIpIHsKICAgIF9pbnQ2NE92ZXJmbG93TGltaXRzW3RhYmxlSW5kZXhdID0gX21heEludDY0IH4vIG11bHRpcGxpZXI7CiAgICBfaW50NjRPdmVyZmxvd0xpbWl0c1t0YWJsZUluZGV4ICsgMV0gPSBfbWluSW50NjQgfi8gbXVsdGlwbGllcjsKICAgIF9pbnQ2NE92ZXJmbG93TGltaXRzW3RhYmxlSW5kZXggKyAyXSA9IF9tYXhJbnQ2NC5yZW1haW5kZXIobXVsdGlwbGllcik7CiAgICBfaW50NjRPdmVyZmxvd0xpbWl0c1t0YWJsZUluZGV4ICsgM10gPSAtKF9taW5JbnQ2NC5yZW1haW5kZXIobXVsdGlwbGllcikpOwogICAgcmV0dXJuIF9pbnQ2NE92ZXJmbG93TGltaXRzW3RhYmxlSW5kZXhdOwogIH0KfQqBNABOTjwBHgEeBwwJRSgBIiUkJSIiAT0bFBIgJSYMMhcfCAYlIy4GFCcoExUIIAYaBAEJTVAaRQYoPz8pKj8GUSsEAT4vFFEGLgEqEjo0DxpJCCgGGR4ZIxEkKi4THk4MTwoIEgZJBAEJNFAlKD8/KSo/BgosEhMGBAEhAU0xGzkGGUIGTQQBUSA6Lx4fORlLCBkGAURDFCFFFB4tPhlLCBsYBjQjI0w+JlAGQiYJPhlLCC0wPEhIHSMaPT9ELDAMRT4KNDA8RT4KCDUYJB8TBAEnShUXKjEpKQgNKikhGS85CikIBhMEAUs7TSc5LC05KywtKzoqKyorOisrKio6KioqKjorKyoqOiosKio6KQUBLzABSDkPFgUBJAY2BkUvBlFKDwY1OVRUMC8BSEBETE8tBAIBI2RhcnQ6Y29yZS1wYXRjaC9pbnRlZ2Vyc19wYXRjaC5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL2ludm9jYXRpb24uZGFydJUXLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIFJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnZvY2F0aW9uIG9mIGEgbWVtYmVyIG9uIGFuIG9iamVjdC4KICoKICogVGhpcyBpcyB0aGUgdHlwZSBvZiBvYmplY3RzIHBhc3NlZCB0byBbT2JqZWN0Lm5vU3VjaE1ldGhvZF0gd2hlbgogKiBhbiBvYmplY3QgZG9lc24ndCBzdXBwb3J0IHRoZSBtZW1iZXIgaW52b2NhdGlvbiB0aGF0IHdhcyBhdHRlbXB0ZWQKICogb24gaXQuCiAqLwphYnN0cmFjdCBjbGFzcyBJbnZvY2F0aW9uIHsKICBJbnZvY2F0aW9uKCk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW52b2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEgbWV0aG9kIGludm9jYXRpb24uCiAgICoKICAgKiBUaGUgbWV0aG9kIGludm9jYXRpb24gaGFzIG5vIHR5cGUgYXJndW1lbnRzLgogICAqIElmIHRoZSBuYW1lZCBhcmd1bWVudHMgYXJlIG9taXR0ZWQsIHRoZXkgZGVmYXVsdCB0byBubyBuYW1lZCBhcmd1bWVudHMuCiAgICovCiAgZmFjdG9yeSBJbnZvY2F0aW9uLm1ldGhvZCgKICAgICAgICAgIFN5bWJvbCBtZW1iZXJOYW1lLCBJdGVyYWJsZTxPYmplY3Q+IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgICBbTWFwPFN5bWJvbCwgT2JqZWN0PiBuYW1lZEFyZ3VtZW50c10pID0+CiAgICAgIF9JbnZvY2F0aW9uLm1ldGhvZChtZW1iZXJOYW1lLCBudWxsLCBwb3NpdGlvbmFsQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW52b2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEgZ2VuZXJpYyBtZXRob2QgaW52b2NhdGlvbi4KICAgKgogICAqIElmIFt0eXBlQXJndW1lbnRzXSBpcyBgbnVsbGAgb3IgZW1wdHksIHRoZSBjb25zdHJ1Y3RvciBpcyBlcXVpdmFsZW50IHRvCiAgICogY2FsbGluZyBbSW52b2NhdGlvbi5tZXRob2RdIHdpdGggdGhlIHJlbWFpbmluZyBhcmd1bWVudHMuCiAgICogQWxsIHRoZSBpbmRpdmlkdWFsIHR5cGUgYXJndW1lbnRzIG11c3QgYmUgbm9uLW51bGwuCiAgICoKICAgKiBJZiB0aGUgbmFtZWQgYXJndW1lbnRzIGFyZSBvbWl0dGVkLCB0aGV5IGRlZmF1bHQgdG8gbm8gbmFtZWQgYXJndW1lbnRzLgogICAqLwogIGZhY3RvcnkgSW52b2NhdGlvbi5nZW5lcmljTWV0aG9kKFN5bWJvbCBtZW1iZXJOYW1lLAogICAgICAgICAgSXRlcmFibGU8VHlwZT4gdHlwZUFyZ3VtZW50cywgSXRlcmFibGU8T2JqZWN0PiBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICAgICAgW01hcDxTeW1ib2wsIE9iamVjdD4gbmFtZWRBcmd1bWVudHNdKSA9PgogICAgICBfSW52b2NhdGlvbi5tZXRob2QoCiAgICAgICAgICBtZW1iZXJOYW1lLCB0eXBlQXJndW1lbnRzLCBwb3NpdGlvbmFsQXJndW1lbnRzLCBuYW1lZEFyZ3VtZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW52b2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEgZ2V0dGVyIGludm9jYXRpb24uCiAgICovCiAgZmFjdG9yeSBJbnZvY2F0aW9uLmdldHRlcihTeW1ib2wgbmFtZSkgPSBfSW52b2NhdGlvbi5nZXR0ZXI7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW52b2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEgc2V0dGVyIGludm9jYXRpb24uCiAgICoKICAgKiBUaGlzIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW55IFtTeW1ib2xdIGFzIFttZW1iZXJOYW1lXSwgYnV0IHJlbWVtYmVyIHRoYXQKICAgKiAqYWN0dWFsIHNldHRlciBuYW1lcyogZW5kIGluIGA9YCwgc28gdGhlIGludm9jYXRpb24gY29ycmVzcG9uZGluZwogICAqIHRvIGBvYmplY3QubWVtYmVyID0gdmFsdWVgIGlzCiAgICogYGBgZGFydAogICAqIEludm9jYXRpb24uc2V0dGVyKGNvbnN0IFN5bWJvbCgibWVtYmVyPSIpLCB2YWx1ZSkKICAgKiBgYGAKICAgKi8KICBmYWN0b3J5IEludm9jYXRpb24uc2V0dGVyKFN5bWJvbCBtZW1iZXJOYW1lLCBPYmplY3QgYXJndW1lbnQpID0KICAgICAgX0ludm9jYXRpb24uc2V0dGVyOwoKICAvKiogVGhlIG5hbWUgb2YgdGhlIGludm9rZWQgbWVtYmVyLiAqLwogIFN5bWJvbCBnZXQgbWVtYmVyTmFtZTsKCiAgLyoqCiAgICogQW4gdW5tb2RpZmlhYmxlIHZpZXcgb2YgdGhlIHR5cGUgYXJndW1lbnRzIG9mIHRoZSBjYWxsLgogICAqCiAgICogSWYgdGhlIG1lbWJlciBpcyBhIGdldHRlciwgc2V0dGVyIG9yIG9wZXJhdG9yLAogICAqIHRoZSB0eXBlIGFyZ3VtZW50IGxpc3QgaXMgYWx3YXlzIGVtcHR5LgogICAqLwogIExpc3Q8VHlwZT4gZ2V0IHR5cGVBcmd1bWVudHMgPT4gY29uc3QgPFR5cGU+W107CgogIC8qKgogICAqIEFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBvZiB0aGUgY2FsbC4KICAgKgogICAqIElmIHRoZSBtZW1iZXIgaXMgYSBnZXR0ZXIsIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBsaXN0IGlzCiAgICogYWx3YXlzIGVtcHR5LgogICAqLwogIExpc3Q8ZHluYW1pYz4gZ2V0IHBvc2l0aW9uYWxBcmd1bWVudHM7CgogIC8qKgogICAqIEFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSBuYW1lZCBhcmd1bWVudHMgb2YgdGhlIGNhbGwuCiAgICoKICAgKiBJZiB0aGUgbWVtYmVyIGlzIGEgZ2V0dGVyLCBzZXR0ZXIgb3Igb3BlcmF0b3IsCiAgICogdGhlIG5hbWVkIGFyZ3VtZW50cyBtYXAgaXMgYWx3YXlzIGVtcHR5LgogICAqLwogIE1hcDxTeW1ib2wsIGR5bmFtaWM+IGdldCBuYW1lZEFyZ3VtZW50czsKCiAgLyoqIFdoZXRoZXIgdGhlIGludm9jYXRpb24gd2FzIGEgbWV0aG9kIGNhbGwuICovCiAgYm9vbCBnZXQgaXNNZXRob2Q7CgogIC8qKgogICAqIFdoZXRoZXIgdGhlIGludm9jYXRpb24gd2FzIGEgZ2V0dGVyIGNhbGwuCiAgICogSWYgc28sIGFsbCB0aHJlZSB0eXBlcyBvZiBhcmd1bWVudHMgbGlzdHMgYXJlIGVtcHR5LgogICAqLwogIGJvb2wgZ2V0IGlzR2V0dGVyOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBpbnZvY2F0aW9uIHdhcyBhIHNldHRlciBjYWxsLgogICAqCiAgICogSWYgc28sIFtwb3NpdGlvbmFsQXJndW1lbnRzXSBoYXMgZXhhY3RseSBvbmUgcG9zaXRpb25hbAogICAqIGFyZ3VtZW50LCBbbmFtZWRBcmd1bWVudHNdIGlzIGVtcHR5LCBhbmQgdHlwZUFyZ3VtZW50cyBpcwogICAqIGVtcHR5LgogICAqLwogIGJvb2wgZ2V0IGlzU2V0dGVyOwoKICAvKiogV2hldGhlciB0aGUgaW52b2NhdGlvbiB3YXMgYSBnZXR0ZXIgb3IgYSBzZXR0ZXIgY2FsbC4gKi8KICBib29sIGdldCBpc0FjY2Vzc29yID0+IGlzR2V0dGVyIHx8IGlzU2V0dGVyOwp9CgovKiogSW1wbGVtZW50YXRpb24gb2YgW0ludm9jYXRpb25dIHVzZWQgYnkgaXRzIGZhY3RvcnkgY29uc3RydWN0b3JzLiAqLwpjbGFzcyBfSW52b2NhdGlvbiBpbXBsZW1lbnRzIEludm9jYXRpb24gewogIGZpbmFsIFN5bWJvbCBtZW1iZXJOYW1lOwogIGZpbmFsIExpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50czsKICAvLyBQb3NpdGlvbmFsIGFyZ3VtZW50cyBpcyBgbnVsbGAgZm9yIGdldHRlcnMgb25seS4KICBmaW5hbCBMaXN0PE9iamVjdD4gX3Bvc2l0aW9uYWw7CiAgLy8gTmFtZWQgYXJndW1lbnRzIGlzIGBudWxsYCBmb3IgYWNjZXNzb3JzIG9ubHkuCiAgZmluYWwgTWFwPFN5bWJvbCwgT2JqZWN0PiBfbmFtZWQ7CgogIF9JbnZvY2F0aW9uLm1ldGhvZCh0aGlzLm1lbWJlck5hbWUsIEl0ZXJhYmxlPFR5cGU+IHR5cGVzLAogICAgICBJdGVyYWJsZTxPYmplY3Q+IHBvc2l0aW9uYWwsIE1hcDxTeW1ib2wsIE9iamVjdD4gbmFtZWQpCiAgICAgIDogdHlwZUFyZ3VtZW50cyA9IF9lbnN1cmVOb25OdWxsVHlwZXMoX21ha2VVbm1vZGlmaWFibGU8VHlwZT4odHlwZXMpKSwKICAgICAgICBfcG9zaXRpb25hbCA9IF9tYWtlVW5tb2RpZmlhYmxlPE9iamVjdD4ocG9zaXRpb25hbCkgPz8gY29uc3QgPE9iamVjdD5bXSwKICAgICAgICBfbmFtZWQgPSAobmFtZWQgPT0gbnVsbCB8fCBuYW1lZC5pc0VtcHR5KQogICAgICAgICAgICA/IGNvbnN0IDxTeW1ib2wsIE9iamVjdD57fQogICAgICAgICAgICA6IE1hcDxTeW1ib2wsIE9iamVjdD4udW5tb2RpZmlhYmxlKG5hbWVkKTsKCiAgX0ludm9jYXRpb24uZ2V0dGVyKHRoaXMubWVtYmVyTmFtZSkKICAgICAgOiB0eXBlQXJndW1lbnRzID0gY29uc3QgPFR5cGU+W10sCiAgICAgICAgX3Bvc2l0aW9uYWwgPSBudWxsLAogICAgICAgIF9uYW1lZCA9IG51bGw7CgogIF9JbnZvY2F0aW9uLnNldHRlcih0aGlzLm1lbWJlck5hbWUsIE9iamVjdCBhcmd1bWVudCkKICAgICAgOiB0eXBlQXJndW1lbnRzID0gY29uc3QgPFR5cGU+W10sCiAgICAgICAgX3Bvc2l0aW9uYWwgPSBMaXN0PE9iamVjdD4udW5tb2RpZmlhYmxlKFthcmd1bWVudF0pLAogICAgICAgIF9uYW1lZCA9IG51bGw7CgogIExpc3Q8ZHluYW1pYz4gZ2V0IHBvc2l0aW9uYWxBcmd1bWVudHMgPT4gX3Bvc2l0aW9uYWwgPz8gY29uc3QgPE9iamVjdD5bXTsKCiAgTWFwPFN5bWJvbCwgZHluYW1pYz4gZ2V0IG5hbWVkQXJndW1lbnRzID0+IF9uYW1lZCA/PyBjb25zdCA8U3ltYm9sLCBPYmplY3Q+e307CgogIGJvb2wgZ2V0IGlzTWV0aG9kID0+IF9uYW1lZCAhPSBudWxsOwogIGJvb2wgZ2V0IGlzR2V0dGVyID0+IF9wb3NpdGlvbmFsID09IG51bGw7CiAgYm9vbCBnZXQgaXNTZXR0ZXIgPT4gX3Bvc2l0aW9uYWwgIT0gbnVsbCAmJiBfbmFtZWQgPT0gbnVsbDsKICBib29sIGdldCBpc0FjY2Vzc29yID0+IF9uYW1lZCA9PSBudWxsOwoKICAvLy8gQ2hlY2tzIHRoYXQgdGhlIGVsZW1lbnRzIG9mIFt0eXBlc10gYXJlIG5vdCBudWxsLgogIHN0YXRpYyBMaXN0PFR5cGU+IF9lbnN1cmVOb25OdWxsVHlwZXMoTGlzdDxUeXBlPiB0eXBlcykgewogICAgaWYgKHR5cGVzID09IG51bGwpIHJldHVybiBjb25zdCA8VHlwZT5bXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHR5cGVzW2ldID09IG51bGwpIHsKICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKAogICAgICAgICAgICAiVHlwZSBhcmd1bWVudHMgbXVzdCBiZSBub24tbnVsbCwgd2FzIG51bGwgYXQgaW5kZXggJGkuIik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0eXBlczsKICB9CgogIHN0YXRpYyBMaXN0PFQ+IF9tYWtlVW5tb2RpZmlhYmxlPFQ+KEl0ZXJhYmxlPFQ+IGVsZW1lbnRzKSB7CiAgICBpZiAoZWxlbWVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gTGlzdDxUPi51bm1vZGlmaWFibGUoZWxlbWVudHMpOwogIH0KfQqApABOTjwBEwEEPgNERgoEHBABBkEFMk0GHUMzUQEGSQVNPzkFTQY2TjMaSwEGQQY/AQZBBU5HIw03CQZCGgEpGQEGPQU0LQYyAQZDBUETBikBBj4FNC4GKwEzFQEGLzoGFQEGLwU9PwwGFQE/LwIBSCobIjYiMyQBPD5NUTInNwEmKBwXATcoPRcBTAFRAScsPikBODwuLR4dRwgGEgQBPicrBAIBGWRhcnQ6Y29yZS9pbnZvY2F0aW9uLmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvaXRlcmF0b3IuZGFydIjTLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIEFuIGludGVyZmFjZSBmb3IgZ2V0dGluZyBpdGVtcywgb25lIGF0IGEgdGltZSwgZnJvbSBhbiBvYmplY3QuCiAqCiAqIFRoZSBmb3ItaW4gY29uc3RydWN0IHRyYW5zcGFyZW50bHkgdXNlcyBgSXRlcmF0b3JgIHRvIHRlc3QgZm9yIHRoZSBlbmQKICogb2YgdGhlIGl0ZXJhdGlvbiwgYW5kIHRvIGdldCBlYWNoIGl0ZW0gKG9yIF9lbGVtZW50XykuCiAqCiAqIElmIHRoZSBvYmplY3QgaXRlcmF0ZWQgb3ZlciBpcyBjaGFuZ2VkIGR1cmluZyB0aGUgaXRlcmF0aW9uLCB0aGUKICogYmVoYXZpb3IgaXMgdW5zcGVjaWZpZWQuCiAqCiAqIFRoZSBgSXRlcmF0b3JgIGlzIGluaXRpYWxseSBwb3NpdGlvbmVkIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudC4KICogQmVmb3JlIGFjY2Vzc2luZyB0aGUgZmlyc3QgZWxlbWVudCB0aGUgaXRlcmF0b3IgbXVzdCB0aHVzIGJlIGFkdmFuY2VkIHVzaW5nCiAqIFttb3ZlTmV4dF0gdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGVsZW1lbnQuCiAqIElmIG5vIGVsZW1lbnQgaXMgbGVmdCwgdGhlbiBbbW92ZU5leHRdIHJldHVybnMgZmFsc2UsIFtjdXJyZW50XQogKiByZXR1cm5zIGBudWxsYCwgYW5kIGFsbCBmdXJ0aGVyIGNhbGxzIHRvIFttb3ZlTmV4dF0gd2lsbCBhbHNvIHJldHVybiBmYWxzZS4KICoKICogQSB0eXBpY2FsIHVzYWdlIG9mIGFuIEl0ZXJhdG9yIGxvb2tzIGFzIGZvbGxvd3M6CiAqCiAqICAgICB2YXIgaXQgPSBvYmouaXRlcmF0b3I7CiAqICAgICB3aGlsZSAoaXQubW92ZU5leHQoKSkgewogKiAgICAgICB1c2UoaXQuY3VycmVudCk7CiAqICAgICB9CiAqCiAqICoqU2VlIGFsc286KioKICogW0l0ZXJhdGlvbl0oaHR0cDovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NvbnRlbnRzL2NoMDMuaHRtbCNpdGVyYXRpb24pCiAqIGluIHRoZSBbbGlicmFyeSB0b3VyXShodHRwOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvY29udGVudHMvY2gwMy5odG1sKQogKi8KYWJzdHJhY3QgY2xhc3MgSXRlcmF0b3I8RT4gewogIC8qKgogICAqIE1vdmVzIHRvIHRoZSBuZXh0IGVsZW1lbnQuCiAgICoKICAgKiBSZXR1cm5zIHRydWUgaWYgW2N1cnJlbnRdIGNvbnRhaW5zIHRoZSBuZXh0IGVsZW1lbnQuCiAgICogUmV0dXJucyBmYWxzZSBpZiBubyBlbGVtZW50cyBhcmUgbGVmdC4KICAgKgogICAqIEl0IGlzIHNhZmUgdG8gaW52b2tlIFttb3ZlTmV4dF0gZXZlbiB3aGVuIHRoZSBpdGVyYXRvciBpcyBhbHJlYWR5CiAgICogcG9zaXRpb25lZCBhZnRlciB0aGUgbGFzdCBlbGVtZW50LgogICAqIEluIHRoaXMgY2FzZSBbbW92ZU5leHRdIHJldHVybnMgZmFsc2UgYWdhaW4gYW5kIGhhcyBubyBlZmZlY3QuCiAgICoKICAgKiBBIGNhbGwgdG8gYG1vdmVOZXh0YCBtYXkgdGhyb3cgaWYgaXRlcmF0aW9uIGhhcyBiZWVuIGJyb2tlbiBieQogICAqIGNoYW5naW5nIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24uCiAgICovCiAgYm9vbCBtb3ZlTmV4dCgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGVsZW1lbnQuCiAgICoKICAgKiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgaXRlcmF0b3IgaGFzIG5vdCB5ZXQgYmVlbiBtb3ZlZCB0byB0aGUgZmlyc3QKICAgKiBlbGVtZW50LCBvciBpZiB0aGUgaXRlcmF0b3IgaGFzIGJlZW4gbW92ZWQgcGFzdCB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZQogICAqIFtJdGVyYWJsZV0uCiAgICoKICAgKiBUaGUgYGN1cnJlbnRgIGdldHRlciBzaG91bGQga2VlcCBpdHMgdmFsdWUgdW50aWwgdGhlIG5leHQgY2FsbCB0bwogICAqIFttb3ZlTmV4dF0sIGV2ZW4gaWYgYW4gdW5kZXJseWluZyBjb2xsZWN0aW9uIGNoYW5nZXMuCiAgICogQWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYG1vdmVOZXh0YCwgdGhlIHVzZXIgZG9lc24ndCBuZWVkIHRvIGNhY2hlCiAgICogdGhlIGN1cnJlbnQgdmFsdWUsIGJ1dCBjYW4ga2VlcCByZWFkaW5nIGl0IGZyb20gdGhlIGl0ZXJhdG9yLgogICAqLwogIEUgZ2V0IGN1cnJlbnQ7Cn0KQABOTjwBEwEEQgNKOgNEHANETy1DTwM0Ax4fGgkDEV5eBB0GIAU6LAVHKEQFRCkGEwEGIgVITREFRztLQwYRAgEXZGFydDpjb3JlL2l0ZXJhdG9yLmRhcnQqb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvbGlzdC5kYXJ0wABgWC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBBbiBpbmRleGFibGUgY29sbGVjdGlvbiBvZiBvYmplY3RzIHdpdGggYSBsZW5ndGguCiAqCiAqIFN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBpbXBsZW1lbnQgZGlmZmVyZW50IGtpbmRzIG9mIGxpc3RzLgogKiBUaGUgbW9zdCBjb21tb24ga2luZHMgb2YgbGlzdHMgYXJlOgogKgogKiAqIEZpeGVkLWxlbmd0aCBsaXN0LgogKiAgIEFuIGVycm9yIG9jY3VycyB3aGVuIGF0dGVtcHRpbmcgdG8gdXNlIG9wZXJhdGlvbnMKICogICB0aGF0IGNhbiBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdC4KICoKICogKiBHcm93YWJsZSBsaXN0LiBGdWxsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkgZGVmaW5lZCBpbiB0aGlzIGNsYXNzLgogKgogKiBUaGUgZGVmYXVsdCBncm93YWJsZSBsaXN0LCBhcyByZXR1cm5lZCBieSBgbmV3IExpc3QoKWAgb3IgYFtdYCwga2VlcHMKICogYW4gaW50ZXJuYWwgYnVmZmVyLCBhbmQgZ3Jvd3MgdGhhdCBidWZmZXIgd2hlbiBuZWNlc3NhcnkuIFRoaXMgZ3VhcmFudGVlcwogKiB0aGF0IGEgc2VxdWVuY2Ugb2YgW2FkZF0gb3BlcmF0aW9ucyB3aWxsIGVhY2ggZXhlY3V0ZSBpbiBhbW9ydGl6ZWQgY29uc3RhbnQKICogdGltZS4gU2V0dGluZyB0aGUgbGVuZ3RoIGRpcmVjdGx5IG1heSB0YWtlIHRpbWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBuZXcKICogbGVuZ3RoLCBhbmQgbWF5IGNoYW5nZSB0aGUgaW50ZXJuYWwgY2FwYWNpdHkgc28gdGhhdCBhIGZvbGxvd2luZyBhZGQKICogb3BlcmF0aW9uIHdpbGwgbmVlZCB0byBpbW1lZGlhdGVseSBpbmNyZWFzZSB0aGUgYnVmZmVyIGNhcGFjaXR5LgogKiBPdGhlciBsaXN0IGltcGxlbWVudGF0aW9ucyBtYXkgaGF2ZSBkaWZmZXJlbnQgcGVyZm9ybWFuY2UgYmVoYXZpb3IuCiAqCiAqIFRoZSBmb2xsb3dpbmcgY29kZSBpbGx1c3RyYXRlcyB0aGF0IHNvbWUgTGlzdCBpbXBsZW1lbnRhdGlvbnMgc3VwcG9ydAogKiBvbmx5IGEgc3Vic2V0IG9mIHRoZSBBUEkuCiAqCiAqICAgICBMaXN0PGludD4gZml4ZWRMZW5ndGhMaXN0ID0gbmV3IExpc3QoNSk7CiAqICAgICBmaXhlZExlbmd0aExpc3QubGVuZ3RoID0gMDsgIC8vIEVycm9yCiAqICAgICBmaXhlZExlbmd0aExpc3QuYWRkKDQ5OSk7ICAgIC8vIEVycm9yCiAqICAgICBmaXhlZExlbmd0aExpc3RbMF0gPSA4NzsKICogICAgIExpc3Q8aW50PiBncm93YWJsZUxpc3QgPSBbMSwgMl07CiAqICAgICBncm93YWJsZUxpc3QubGVuZ3RoID0gMDsKICogICAgIGdyb3dhYmxlTGlzdC5hZGQoNDk5KTsKICogICAgIGdyb3dhYmxlTGlzdFswXSA9IDg3OwogKgogKiBMaXN0cyBhcmUgW0l0ZXJhYmxlXS4gSXRlcmF0aW9uIG9jY3VycyBvdmVyIHZhbHVlcyBpbiBpbmRleCBvcmRlci4gQ2hhbmdpbmcKICogdGhlIHZhbHVlcyBkb2VzIG5vdCBhZmZlY3QgaXRlcmF0aW9uLCBidXQgY2hhbmdpbmcgdGhlIHZhbGlkCiAqIGluZGljZXMmbWRhc2g7dGhhdCBpcywgY2hhbmdpbmcgdGhlIGxpc3QncyBsZW5ndGgmbWRhc2g7YmV0d2VlbiBpdGVyYXRpb24KICogc3RlcHMgY2F1c2VzIGEgW0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcl0uIFRoaXMgbWVhbnMgdGhhdCBvbmx5IGdyb3dhYmxlCiAqIGxpc3RzIGNhbiB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IuIElmIHRoZSBsZW5ndGggY2hhbmdlcwogKiB0ZW1wb3JhcmlseSBhbmQgaXMgcmVzdG9yZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlIGl0ZXJhdGlvbiwgdGhlIGl0ZXJhdG9yCiAqIGRvZXMgbm90IGRldGVjdCBpdC4KICoKICogSXQgaXMgZ2VuZXJhbGx5IG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgbGlzdCdzIGxlbmd0aCAoYWRkaW5nIG9yIHJlbW92aW5nCiAqIGVsZW1lbnRzKSB3aGlsZSBhbiBvcGVyYXRpb24gb24gdGhlIGxpc3QgaXMgYmVpbmcgcGVyZm9ybWVkLAogKiBmb3IgZXhhbXBsZSBkdXJpbmcgYSBjYWxsIHRvIFtmb3JFYWNoXSBvciBbc29ydF0uCiAqIENoYW5naW5nIHRoZSBsaXN0J3MgbGVuZ3RoIHdoaWxlIGl0IGlzIGJlaW5nIGl0ZXJhdGVkLCBlaXRoZXIgYnkgaXRlcmF0aW5nIGl0CiAqIGRpcmVjdGx5IG9yIHRocm91Z2ggaXRlcmF0aW5nIGFuIFtJdGVyYWJsZV0gdGhhdCBpcyBiYWNrZWQgYnkgdGhlIGxpc3QsIHdpbGwKICogYnJlYWsgdGhlIGl0ZXJhdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIExpc3Q8RT4gaW1wbGVtZW50cyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPiB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIGxpc3Qgb2YgdGhlIGdpdmVuIGxlbmd0aC4KICAgKgogICAqIFRoZSBjcmVhdGVkIGxpc3QgaXMgZml4ZWQtbGVuZ3RoIGlmIFtsZW5ndGhdIGlzIHByb3ZpZGVkLgogICAqCiAgICogICAgIExpc3QgZml4ZWRMZW5ndGhMaXN0ID0gbmV3IExpc3QoMyk7CiAgICogICAgIGZpeGVkTGVuZ3RoTGlzdC5sZW5ndGg7ICAgICAvLyAzCiAgICogICAgIGZpeGVkTGVuZ3RoTGlzdC5sZW5ndGggPSAxOyAvLyBFcnJvcgogICAqCiAgICogVGhlIGxpc3QgaGFzIGxlbmd0aCAwIGFuZCBpcyBncm93YWJsZSBpZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLgogICAqCiAgICogICAgIExpc3QgZ3Jvd2FibGVMaXN0ID0gbmV3IExpc3QoKTsKICAgKiAgICAgZ3Jvd2FibGVMaXN0Lmxlbmd0aDsgLy8gMDsKICAgKiAgICAgZ3Jvd2FibGVMaXN0Lmxlbmd0aCA9IDM7CiAgICoKICAgKiBUbyBjcmVhdGUgYSBncm93YWJsZSBsaXN0IHdpdGggYSBnaXZlbiBsZW5ndGgsIGp1c3QgYXNzaWduIHRoZSBsZW5ndGgKICAgKiByaWdodCBhZnRlciBjcmVhdGlvbjoKICAgKgogICAqICAgICBMaXN0IGdyb3dhYmxlTGlzdCA9IG5ldyBMaXN0KCkuLmxlbmd0aCA9IDUwMDsKICAgKgogICAqIFRoZSBbbGVuZ3RoXSBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBvciBudWxsLCBpZiBpdCBpcyBwcm92aWRlZC4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IExpc3QoW2ludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGxpc3Qgb2YgdGhlIGdpdmVuIGxlbmd0aCB3aXRoIFtmaWxsXSBhdCBlYWNoIHBvc2l0aW9uLgogICAqCiAgICogVGhlIFtsZW5ndGhdIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4KICAgKgogICAqIEV4YW1wbGU6CiAgICogYGBgZGFydAogICAqIG5ldyBMaXN0PGludD4uZmlsbGVkKDMsIDAsIGdyb3dhYmxlOiB0cnVlKTsgLy8gWzAsIDAsIDBdCiAgICogYGBgCiAgICoKICAgKiBUaGUgY3JlYXRlZCBsaXN0IGlzIGZpeGVkLWxlbmd0aCBpZiBbZ3Jvd2FibGVdIGlzIGZhbHNlICh0aGUgZGVmYXVsdCkKICAgKiBhbmQgZ3Jvd2FibGUgaWYgW2dyb3dhYmxlXSBpcyB0cnVlLgogICAqIElmIHRoZSBsaXN0IGlzIGdyb3dhYmxlLCBjaGFuZ2luZyBpdHMgbGVuZ3RoIHdpbGwgbm90IGluaXRpYWxpemUgbmV3CiAgICogZW50cmllcyB3aXRoIFtmaWxsXS4KICAgKiBBZnRlciBiZWluZyBjcmVhdGVkIGFuZCBmaWxsZWQsIHRoZSBsaXN0IGlzIG5vIGRpZmZlcmVudCBmcm9tIGFueSBvdGhlcgogICAqIGdyb3dhYmxlIG9yIGZpeGVkLWxlbmd0aCBsaXN0IGNyZWF0ZWQgdXNpbmcgW0xpc3RdLgogICAqCiAgICogQWxsIGVsZW1lbnRzIG9mIHRoZSByZXR1cm5lZCBsaXN0IHNoYXJlIHRoZSBzYW1lIFtmaWxsXSB2YWx1ZS4KICAgKiBgYGAKICAgKiB2YXIgc2hhcmVkID0gbmV3IExpc3QuZmlsbGVkKDMsIFtdKTsKICAgKiBzaGFyZWRbMF0uYWRkKDQ5OSk7CiAgICogcHJpbnQoc2hhcmVkKTsgIC8vID0+IFtbNDk5XSwgWzQ5OV0sIFs0OTldXQogICAqIGBgYAogICAqCiAgICogWW91IGNhbiB1c2UgW0xpc3QuZ2VuZXJhdGVdIHRvIGNyZWF0ZSBhIGxpc3Qgd2l0aCBhIG5ldyBvYmplY3QgYXQKICAgKiBlYWNoIHBvc2l0aW9uLgogICAqIGBgYAogICAqIHZhciB1bmlxdWUgPSBuZXcgTGlzdC5nZW5lcmF0ZSgzLCAoXykgPT4gW10pOwogICAqIHVuaXF1ZVswXS5hZGQoNDk5KTsKICAgKiBwcmludCh1bmlxdWUpOyAvLyA9PiBbWzQ5OV0sIFtdLCBbXV0KICAgKiBgYGAKICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IExpc3QuZmlsbGVkKGludCBsZW5ndGgsIEUgZmlsbCwge2Jvb2wgZ3Jvd2FibGUgPSBmYWxzZX0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbGlzdCBjb250YWluaW5nIGFsbCBbZWxlbWVudHNdLgogICAqCiAgICogVGhlIFtJdGVyYXRvcl0gb2YgW2VsZW1lbnRzXSBwcm92aWRlcyB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzLgogICAqCiAgICogQWxsIHRoZSBbZWxlbWVudHNdIHNob3VsZCBiZSBpbnN0YW5jZXMgb2YgW0VdLgogICAqIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBtYXkgaGF2ZSBhbnkgZWxlbWVudCB0eXBlLCBzbyB0aGlzCiAgICogY29uc3RydWN0b3IgY2FuIGJlIHVzZWQgdG8gZG93bi1jYXN0IGEgYExpc3RgLCBmb3IgZXhhbXBsZSBhczoKICAgKiBgYGBkYXJ0CiAgICogTGlzdDxTdXBlclR5cGU+IHN1cGVyTGlzdCA9IC4uLjsKICAgKiBMaXN0PFN1YlR5cGU+IHN1Ykxpc3QgPQogICAqICAgICBuZXcgTGlzdDxTdWJUeXBlPi5mcm9tKHN1cGVyTGlzdC53aGVyZVR5cGU8U3ViVHlwZT4oKSk7CiAgICogYGBgCiAgICoKICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBncm93YWJsZSBsaXN0IHdoZW4gW2dyb3dhYmxlXSBpcyB0cnVlOwogICAqIG90aGVyd2lzZSwgaXQgcmV0dXJucyBhIGZpeGVkLWxlbmd0aCBsaXN0LgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgTGlzdC5mcm9tKEl0ZXJhYmxlIGVsZW1lbnRzLCB7Ym9vbCBncm93YWJsZSA9IHRydWV9KTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGxpc3QgZnJvbSBbZWxlbWVudHNdLgogICAqCiAgICogVGhlIFtJdGVyYXRvcl0gb2YgW2VsZW1lbnRzXSBwcm92aWRlcyB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzLgogICAqCiAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgZ3Jvd2FibGUgbGlzdCB3aGVuIFtncm93YWJsZV0gaXMgdHJ1ZTsKICAgKiBvdGhlcndpc2UsIGl0IHJldHVybnMgYSBmaXhlZC1sZW5ndGggbGlzdC4KICAgKi8KICBmYWN0b3J5IExpc3Qub2YoSXRlcmFibGU8RT4gZWxlbWVudHMsIHtib29sIGdyb3dhYmxlID0gdHJ1ZX0pID0+CiAgICAgIExpc3Q8RT4uZnJvbShlbGVtZW50cywgZ3Jvd2FibGU6IGdyb3dhYmxlKTsKCiAgLyoqCiAgICogR2VuZXJhdGVzIGEgbGlzdCBvZiB2YWx1ZXMuCiAgICoKICAgKiBDcmVhdGVzIGEgbGlzdCB3aXRoIFtsZW5ndGhdIHBvc2l0aW9ucyBhbmQgZmlsbHMgaXQgd2l0aCB2YWx1ZXMgY3JlYXRlZCBieQogICAqIGNhbGxpbmcgW2dlbmVyYXRvcl0gZm9yIGVhY2ggaW5kZXggaW4gdGhlIHJhbmdlIGAwYCAuLiBgbGVuZ3RoIC0gMWAKICAgKiBpbiBpbmNyZWFzaW5nIG9yZGVyLgogICAqCiAgICogICAgIG5ldyBMaXN0PGludD4uZ2VuZXJhdGUoMywgKGludCBpbmRleCkgPT4gaW5kZXggKiBpbmRleCk7IC8vIFswLCAxLCA0XQogICAqCiAgICogVGhlIGNyZWF0ZWQgbGlzdCBpcyBmaXhlZC1sZW5ndGggdW5sZXNzIFtncm93YWJsZV0gaXMgdHJ1ZS4KICAgKi8KICBmYWN0b3J5IExpc3QuZ2VuZXJhdGUoaW50IGxlbmd0aCwgRSBnZW5lcmF0b3IoaW50IGluZGV4KSwKICAgICAge2Jvb2wgZ3Jvd2FibGUgPSB0cnVlfSkgewogICAgTGlzdDxFPiByZXN1bHQ7CiAgICBpZiAoZ3Jvd2FibGUpIHsKICAgICAgcmVzdWx0ID0gPEU+W10uLmxlbmd0aCA9IGxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IExpc3Q8RT4obGVuZ3RoKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0W2ldID0gZ2VuZXJhdG9yKGkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYW4gdW5tb2RpZmlhYmxlIGxpc3QgY29udGFpbmluZyBhbGwgW2VsZW1lbnRzXS4KICAgKgogICAqIFRoZSBbSXRlcmF0b3JdIG9mIFtlbGVtZW50c10gcHJvdmlkZXMgdGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cy4KICAgKgogICAqIEFuIHVubW9kaWZpYWJsZSBsaXN0IGNhbm5vdCBoYXZlIGl0cyBsZW5ndGggb3IgZWxlbWVudHMgY2hhbmdlZC4KICAgKiBJZiB0aGUgZWxlbWVudHMgYXJlIHRoZW1zZWx2ZXMgaW1tdXRhYmxlLCB0aGVuIHRoZSByZXN1bHRpbmcgbGlzdAogICAqIGlzIGFsc28gaW1tdXRhYmxlLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgTGlzdC51bm1vZGlmaWFibGUoSXRlcmFibGUgZWxlbWVudHMpOwoKICAvKioKICAgKiBBZGFwdHMgW3NvdXJjZV0gdG8gYmUgYSBgTGlzdDxUPmAuCiAgICoKICAgKiBBbnkgdGltZSB0aGUgbGlzdCB3b3VsZCBwcm9kdWNlIGFuIGVsZW1lbnQgdGhhdCBpcyBub3QgYSBbVF0sCiAgICogdGhlIGVsZW1lbnQgYWNjZXNzIHdpbGwgdGhyb3cuCiAgICoKICAgKiBBbnkgdGltZSBhIFtUXSB2YWx1ZSBpcyBhdHRlbXB0ZWQgc3RvcmVkIGludG8gdGhlIGFkYXB0ZWQgbGlzdCwKICAgKiB0aGUgc3RvcmUgd2lsbCB0aHJvdyB1bmxlc3MgdGhlIHZhbHVlIGlzIGFsc28gYW4gaW5zdGFuY2Ugb2YgW1NdLgogICAqCiAgICogSWYgYWxsIGFjY2Vzc2VkIGVsZW1lbnRzIG9mIFtzb3VyY2VdIGFyZSBhY3R1YWxseSBpbnN0YW5jZXMgb2YgW1RdLAogICAqIGFuZCBpZiBhbGwgZWxlbWVudHMgc3RvcmVkIGludG8gdGhlIHJldHVybmVkIGxpc3QgYXJlIGFjdHVhbGx5IGluc3RhbmNlCiAgICogb2YgW1NdLAogICAqIHRoZW4gdGhlIHJldHVybmVkIGxpc3QgY2FuIGJlIHVzZWQgYXMgYSBgTGlzdDxUPmAuCiAgICovCiAgc3RhdGljIExpc3Q8VD4gY2FzdEZyb208UywgVD4oTGlzdDxTPiBzb3VyY2UpID0+IENhc3RMaXN0PFMsIFQ+KHNvdXJjZSk7CgogIC8qKgogICAqIENvcHkgYSByYW5nZSBvZiBvbmUgbGlzdCBpbnRvIGFub3RoZXIgbGlzdC4KICAgKgogICAqIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IG1ldGhvZHMgbGlrZQogICAqIFtzZXRSYW5nZV0uCiAgICoKICAgKiBUaGUgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIG11c3QgYmUgYSB2YWxpZCByYW5nZSBvZiBbc291cmNlXSwKICAgKiBhbmQgdGhlcmUgbXVzdCBiZSByb29tIGZvciBgZW5kIC0gc3RhcnRgIGVsZW1lbnRzIGZyb20gcG9zaXRpb24gW2F0XS4KICAgKiBJZiBbc3RhcnRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHplcm8uCiAgICogSWYgW2VuZF0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gW3NvdXJjZS5sZW5ndGhdLgogICAqCiAgICogSWYgW3NvdXJjZV0gYW5kIFt0YXJnZXRdIGlzIHRoZSBzYW1lIGxpc3QsIG92ZXJsYXBwaW5nIHNvdXJjZSBhbmQgdGFyZ2V0CiAgICogcmFuZ2VzIGFyZSByZXNwZWN0ZWQgc28gdGhhdCB0aGUgdGFyZ2V0IHJhbmdlIGVuZHMgdXAgY29udGFpbmluZyB0aGUKICAgKiBpbml0aWFsIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSByYW5nZS4KICAgKiBPdGhlcndpc2UgdGhlIG9yZGVyIG9mIGVsZW1lbnQgY29weWluZyBpcyBub3QgZ3VhcmFudGVlZC4KICAgKi8KICBzdGF0aWMgdm9pZCBjb3B5UmFuZ2U8VD4oTGlzdDxUPiB0YXJnZXQsIGludCBhdCwgTGlzdDxUPiBzb3VyY2UsCiAgICAgIFtpbnQgc3RhcnQsIGludCBlbmRdKSB7CiAgICBzdGFydCA/Pz0gMDsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHNvdXJjZS5sZW5ndGgpOwogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKHRhcmdldC5sZW5ndGggPCBhdCArIGxlbmd0aCkgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKHRhcmdldCwgInRhcmdldCIsCiAgICAgICAgICAiTm90IGJpZyBlbm91Z2ggdG8gaG9sZCAkbGVuZ3RoIGVsZW1lbnRzIGF0IHBvc2l0aW9uICRhdCIpOwogICAgfQogICAgaWYgKCFpZGVudGljYWwoc291cmNlLCB0YXJnZXQpIHx8IHN0YXJ0ID49IGF0KSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICB0YXJnZXRbYXQgKyBpXSA9IHNvdXJjZVtzdGFydCArIGldOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gbGVuZ3RoOyAtLWkgPj0gMDspIHsKICAgICAgICB0YXJnZXRbYXQgKyBpXSA9IHNvdXJjZVtzdGFydCArIGldOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBXcml0ZSB0aGUgZWxlbWVudHMgb2YgYW4gaXRlcmFibGUgaW50byBhIGxpc3QuCiAgICoKICAgKiBUaGlzIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBtZXRob2RzIGxpa2UKICAgKiBbc2V0QWxsXS4KICAgKgogICAqIFRoZSBlbGVtZW50cyBvZiBbc291cmNlXSBhcmUgd3JpdHRlbiBpbnRvIFt0YXJnZXRdIGZyb20gcG9zaXRpb24gW2F0XS4KICAgKiBUaGUgW3NvdXJjZV0gbXVzdCBub3QgY29udGFpbiBtb3JlIGVsZW1lbnRzIGFmdGVyIHdyaXRpbmcgdGhlIGxhc3QKICAgKiBwb3NpdGlvbiBvZiBbdGFyZ2V0XS4KICAgKgogICAqIElmIHRoZSBzb3VyY2UgaXMgYSBsaXN0LCB0aGUgW2NvcHlSYW5nZV0gZnVuY3Rpb24gaXMgbGlrZWx5IHRvIGJlIG1vcmUKICAgKiBlZmZpY2llbnQuCiAgICovCiAgc3RhdGljIHZvaWQgd3JpdGVJdGVyYWJsZTxUPihMaXN0PFQ+IHRhcmdldCwgaW50IGF0LCBJdGVyYWJsZTxUPiBzb3VyY2UpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWx1ZUluSW50ZXJ2YWwoYXQsIDAsIHRhcmdldC5sZW5ndGgsICJhdCIpOwogICAgaW50IGluZGV4ID0gYXQ7CiAgICBpbnQgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0Lmxlbmd0aDsKICAgIGZvciAodmFyIGVsZW1lbnQgaW4gc291cmNlKSB7CiAgICAgIGlmIChpbmRleCA9PSB0YXJnZXRMZW5ndGgpIHsKICAgICAgICB0aHJvdyBJbmRleEVycm9yKHRhcmdldExlbmd0aCwgdGFyZ2V0KTsKICAgICAgfQogICAgICB0YXJnZXRbaW5kZXhdID0gZWxlbWVudDsKICAgICAgaW5kZXgrKzsKICAgIH0KICB9CgogIC8qKgogICAqIFJldHVybnMgYSB2aWV3IG9mIHRoaXMgbGlzdCBhcyBhIGxpc3Qgb2YgW1JdIGluc3RhbmNlcy4KICAgKgogICAqIElmIHRoaXMgbGlzdCBjb250YWlucyBvbmx5IGluc3RhbmNlcyBvZiBbUl0sIGFsbCByZWFkIG9wZXJhdGlvbnMKICAgKiB3aWxsIHdvcmsgY29ycmVjdGx5LiBJZiBhbnkgb3BlcmF0aW9uIHRyaWVzIHRvIGFjY2VzcyBhbiBlbGVtZW50CiAgICogdGhhdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgW1JdLCB0aGUgYWNjZXNzIHdpbGwgdGhyb3cgaW5zdGVhZC4KICAgKgogICAqIEVsZW1lbnRzIGFkZGVkIHRvIHRoZSBsaXN0IChlLmcuLCBieSB1c2luZyBbYWRkXSBvciBbYWRkQWxsXSkKICAgKiBtdXN0IGJlIGluc3RhbmNlIG9mIFtSXSB0byBiZSB2YWxpZCBhcmd1bWVudHMgdG8gdGhlIGFkZGluZyBmdW5jdGlvbiwKICAgKiBhbmQgdGhleSBtdXN0IGJlIGluc3RhbmNlcyBvZiBbRV0gYXMgd2VsbCB0byBiZSBhY2NlcHRlZCBieQogICAqIHRoaXMgbGlzdCBhcyB3ZWxsLgogICAqCiAgICogVHlwaWNhbGx5IGltcGxlbWVudGVkIGFzIGBMaXN0LmNhc3RGcm9tPEUsIFI+KHRoaXMpYC4KICAgKi8KICBMaXN0PFI+IGNhc3Q8Uj4oKTsKICAvKioKICAgKiBSZXR1cm5zIHRoZSBvYmplY3QgYXQgdGhlIGdpdmVuIFtpbmRleF0gaW4gdGhlIGxpc3QKICAgKiBvciB0aHJvd3MgYSBbUmFuZ2VFcnJvcl0gaWYgW2luZGV4XSBpcyBvdXQgb2YgYm91bmRzLgogICAqLwogIEUgb3BlcmF0b3IgW10oaW50IGluZGV4KTsKCiAgLyoqCiAgICogU2V0cyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIFtpbmRleF0gaW4gdGhlIGxpc3QgdG8gW3ZhbHVlXQogICAqIG9yIHRocm93cyBhIFtSYW5nZUVycm9yXSBpZiBbaW5kZXhdIGlzIG91dCBvZiBib3VuZHMuCiAgICovCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBFIHZhbHVlKTsKCiAgLyoqCiAgICogVXBkYXRlcyB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhlIGxpc3QgdG8gY29udGFpbiBbdmFsdWVdLgogICAqCiAgICogRXF1aXZhbGVudCB0byBgdGhlTGlzdFswXSA9IHZhbHVlO2AuCiAgICoKICAgKiBUaGUgbGlzdCBtdXN0IGJlIG5vbi1lbXB0eS4KICAgKi8KICB2b2lkIHNldCBmaXJzdChFIHZhbHVlKTsKCiAgLyoqCiAgICogVXBkYXRlcyB0aGUgbGFzdCBwb3NpdGlvbiBvZiB0aGUgbGlzdCB0byBjb250YWluIFt2YWx1ZV0uCiAgICoKICAgKiBFcXVpdmFsZW50IHRvIGB0aGVMaXN0W3RoZUxpc3QubGVuZ3RoIC0gMV0gPSB2YWx1ZTtgLgogICAqCiAgICogVGhlIGxpc3QgbXVzdCBiZSBub24tZW1wdHkuCiAgICovCiAgdm9pZCBzZXQgbGFzdChFIHZhbHVlKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhpcyBsaXN0LgogICAqCiAgICogVGhlIHZhbGlkIGluZGljZXMgZm9yIGEgbGlzdCBhcmUgYDBgIHRocm91Z2ggYGxlbmd0aCAtIDFgLgogICAqLwogIGludCBnZXQgbGVuZ3RoOwoKICAvKioKICAgKiBDaGFuZ2VzIHRoZSBsZW5ndGggb2YgdGhpcyBsaXN0LgogICAqCiAgICogSWYgW25ld0xlbmd0aF0gaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGN1cnJlbnQgbGVuZ3RoLCBlbnRyaWVzIGFyZSBpbml0aWFsaXplZCB0byBbOm51bGw6XS4KICAgKgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaWYgdGhlIGxpc3QgaXMgZml4ZWQtbGVuZ3RoLgogICAqLwogIHNldCBsZW5ndGgoaW50IG5ld0xlbmd0aCk7CgogIC8qKgogICAqIEFkZHMgW3ZhbHVlXSB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdCwKICAgKiBleHRlbmRpbmcgdGhlIGxlbmd0aCBieSBvbmUuCiAgICoKICAgKiBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdIGlmIHRoZSBsaXN0IGlzIGZpeGVkLWxlbmd0aC4KICAgKi8KICB2b2lkIGFkZChFIHZhbHVlKTsKCiAgLyoqCiAgICogQXBwZW5kcyBhbGwgb2JqZWN0cyBvZiBbaXRlcmFibGVdIHRvIHRoZSBlbmQgb2YgdGhpcyBsaXN0LgogICAqCiAgICogRXh0ZW5kcyB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGJ5IHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiBbaXRlcmFibGVdLgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaWYgdGhpcyBsaXN0IGlzIGZpeGVkLWxlbmd0aC4KICAgKi8KICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBpdGVyYWJsZSk7CgogIC8qKgogICAqIFJldHVybnMgYW4gW0l0ZXJhYmxlXSBvZiB0aGUgb2JqZWN0cyBpbiB0aGlzIGxpc3QgaW4gcmV2ZXJzZSBvcmRlci4KICAgKi8KICBJdGVyYWJsZTxFPiBnZXQgcmV2ZXJzZWQ7CgogIC8qKgogICAqIFNvcnRzIHRoaXMgbGlzdCBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyIHNwZWNpZmllZCBieSB0aGUgW2NvbXBhcmVdIGZ1bmN0aW9uLgogICAqCiAgICogVGhlIFtjb21wYXJlXSBmdW5jdGlvbiBtdXN0IGFjdCBhcyBhIFtDb21wYXJhdG9yXS4KICAgKgogICAqICAgICBMaXN0PFN0cmluZz4gbnVtYmVycyA9IFsndHdvJywgJ3RocmVlJywgJ2ZvdXInXTsKICAgKiAgICAgLy8gU29ydCBmcm9tIHNob3J0ZXN0IHRvIGxvbmdlc3QuCiAgICogICAgIG51bWJlcnMuc29ydCgoYSwgYikgPT4gYS5sZW5ndGguY29tcGFyZVRvKGIubGVuZ3RoKSk7CiAgICogICAgIHByaW50KG51bWJlcnMpOyAgLy8gW3R3bywgZm91ciwgdGhyZWVdCiAgICoKICAgKiBUaGUgZGVmYXVsdCBMaXN0IGltcGxlbWVudGF0aW9ucyB1c2UgW0NvbXBhcmFibGUuY29tcGFyZV0gaWYKICAgKiBbY29tcGFyZV0gaXMgb21pdHRlZC4KICAgKgogICAqICAgICBMaXN0PGludD4gbnVtcyA9IFsxMywgMiwgLTExXTsKICAgKiAgICAgbnVtcy5zb3J0KCk7CiAgICogICAgIHByaW50KG51bXMpOyAgLy8gWy0xMSwgMiwgMTNdCiAgICoKICAgKiBBIFtDb21wYXJhdG9yXSBtYXkgY29tcGFyZSBvYmplY3RzIGFzIGVxdWFsIChyZXR1cm4gemVybyksIGV2ZW4gaWYgdGhleQogICAqIGFyZSBkaXN0aW5jdCBvYmplY3RzLgogICAqIFRoZSBzb3J0IGZ1bmN0aW9uIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZSwgc28gZGlzdGluY3Qgb2JqZWN0cwogICAqIHRoYXQgY29tcGFyZSBhcyBlcXVhbCBtYXkgb2NjdXIgaW4gYW55IG9yZGVyIGluIHRoZSByZXN1bHQ6CiAgICoKICAgKiAgICAgTGlzdDxTdHJpbmc+IG51bWJlcnMgPSBbJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91ciddOwogICAqICAgICBudW1iZXJzLnNvcnQoKGEsIGIpID0+IGEubGVuZ3RoLmNvbXBhcmVUbyhiLmxlbmd0aCkpOwogICAqICAgICBwcmludChudW1iZXJzKTsgIC8vIFtvbmUsIHR3bywgZm91ciwgdGhyZWVdIE9SIFt0d28sIG9uZSwgZm91ciwgdGhyZWVdCiAgICovCiAgdm9pZCBzb3J0KFtpbnQgY29tcGFyZShFIGEsIEUgYildKTsKCiAgLyoqCiAgICogU2h1ZmZsZXMgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdCByYW5kb21seS4KICAgKi8KICB2b2lkIHNodWZmbGUoW1JhbmRvbSByYW5kb21dKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZmlyc3QgaW5kZXggb2YgW2VsZW1lbnRdIGluIHRoaXMgbGlzdC4KICAgKgogICAqIFNlYXJjaGVzIHRoZSBsaXN0IGZyb20gaW5kZXggW3N0YXJ0XSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAqIFRoZSBmaXJzdCB0aW1lIGFuIG9iamVjdCBbOm86XSBpcyBlbmNvdW50ZXJlZCBzbyB0aGF0IFs6byA9PSBlbGVtZW50Ol0sCiAgICogdGhlIGluZGV4IG9mIFs6bzpdIGlzIHJldHVybmVkLgogICAqCiAgICogICAgIExpc3Q8U3RyaW5nPiBub3RlcyA9IFsnZG8nLCAncmUnLCAnbWknLCAncmUnXTsKICAgKiAgICAgbm90ZXMuaW5kZXhPZigncmUnKTsgICAgLy8gMQogICAqICAgICBub3Rlcy5pbmRleE9mKCdyZScsIDIpOyAvLyAzCiAgICoKICAgKiBSZXR1cm5zIC0xIGlmIFtlbGVtZW50XSBpcyBub3QgZm91bmQuCiAgICoKICAgKiAgICAgbm90ZXMuaW5kZXhPZignZmEnKTsgICAgLy8gLTEKICAgKi8KICBpbnQgaW5kZXhPZihFIGVsZW1lbnQsIFtpbnQgc3RhcnQgPSAwXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZpcnN0IGluZGV4IGluIHRoZSBsaXN0IHRoYXQgc2F0aXNmaWVzIHRoZSBwcm92aWRlZCBbdGVzdF0uCiAgICoKICAgKiBTZWFyY2hlcyB0aGUgbGlzdCBmcm9tIGluZGV4IFtzdGFydF0gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KICAgKiBUaGUgZmlyc3QgdGltZSBhbiBvYmplY3QgYG9gIGlzIGVuY291bnRlcmVkIHNvIHRoYXQgYHRlc3QobylgIGlzIHRydWUsCiAgICogdGhlIGluZGV4IG9mIGBvYCBpcyByZXR1cm5lZC4KICAgKgogICAqIGBgYAogICAqIExpc3Q8U3RyaW5nPiBub3RlcyA9IFsnZG8nLCAncmUnLCAnbWknLCAncmUnXTsKICAgKiBub3Rlcy5pbmRleFdoZXJlKChub3RlKSA9PiBub3RlLnN0YXJ0c1dpdGgoJ3InKSk7ICAgICAgIC8vIDEKICAgKiBub3Rlcy5pbmRleFdoZXJlKChub3RlKSA9PiBub3RlLnN0YXJ0c1dpdGgoJ3InKSwgMik7ICAgIC8vIDMKICAgKiBgYGAKICAgKgogICAqIFJldHVybnMgLTEgaWYgW2VsZW1lbnRdIGlzIG5vdCBmb3VuZC4KICAgKiBgYGAKICAgKiBub3Rlcy5pbmRleFdoZXJlKChub3RlKSA9PiBub3RlLnN0YXJ0c1dpdGgoJ2snKSk7ICAgIC8vIC0xCiAgICogYGBgCiAgICovCiAgaW50IGluZGV4V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIFtpbnQgc3RhcnQgPSAwXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGxhc3QgaW5kZXggaW4gdGhlIGxpc3QgdGhhdCBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVkIFt0ZXN0XS4KICAgKgogICAqIFNlYXJjaGVzIHRoZSBsaXN0IGZyb20gaW5kZXggW3N0YXJ0XSB0byAwLgogICAqIFRoZSBmaXJzdCB0aW1lIGFuIG9iamVjdCBgb2AgaXMgZW5jb3VudGVyZWQgc28gdGhhdCBgdGVzdChvKWAgaXMgdHJ1ZSwKICAgKiB0aGUgaW5kZXggb2YgYG9gIGlzIHJldHVybmVkLgogICAqCiAgICogYGBgCiAgICogTGlzdDxTdHJpbmc+IG5vdGVzID0gWydkbycsICdyZScsICdtaScsICdyZSddOwogICAqIG5vdGVzLmxhc3RJbmRleFdoZXJlKChub3RlKSA9PiBub3RlLnN0YXJ0c1dpdGgoJ3InKSk7ICAgICAgIC8vIDMKICAgKiBub3Rlcy5sYXN0SW5kZXhXaGVyZSgobm90ZSkgPT4gbm90ZS5zdGFydHNXaXRoKCdyJyksIDIpOyAgICAvLyAxCiAgICogYGBgCiAgICoKICAgKiBSZXR1cm5zIC0xIGlmIFtlbGVtZW50XSBpcyBub3QgZm91bmQuCiAgICogYGBgCiAgICogbm90ZXMubGFzdEluZGV4V2hlcmUoKG5vdGUpID0+IG5vdGUuc3RhcnRzV2l0aCgnaycpKTsgICAgLy8gLTEKICAgKiBgYGAKICAgKi8KICBpbnQgbGFzdEluZGV4V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIFtpbnQgc3RhcnRdKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGFzdCBpbmRleCBvZiBbZWxlbWVudF0gaW4gdGhpcyBsaXN0LgogICAqCiAgICogU2VhcmNoZXMgdGhlIGxpc3QgYmFja3dhcmRzIGZyb20gaW5kZXggW3N0YXJ0XSB0byAwLgogICAqCiAgICogVGhlIGZpcnN0IHRpbWUgYW4gb2JqZWN0IFs6bzpdIGlzIGVuY291bnRlcmVkIHNvIHRoYXQgWzpvID09IGVsZW1lbnQ6XSwKICAgKiB0aGUgaW5kZXggb2YgWzpvOl0gaXMgcmV0dXJuZWQuCiAgICoKICAgKiAgICAgTGlzdDxTdHJpbmc+IG5vdGVzID0gWydkbycsICdyZScsICdtaScsICdyZSddOwogICAqICAgICBub3Rlcy5sYXN0SW5kZXhPZigncmUnLCAyKTsgLy8gMQogICAqCiAgICogSWYgW3N0YXJ0XSBpcyBub3QgcHJvdmlkZWQsIHRoaXMgbWV0aG9kIHNlYXJjaGVzIGZyb20gdGhlIGVuZCBvZiB0aGUKICAgKiBsaXN0Li9SZXR1cm5zCiAgICoKICAgKiAgICAgbm90ZXMubGFzdEluZGV4T2YoJ3JlJyk7ICAvLyAzCiAgICoKICAgKiBSZXR1cm5zIC0xIGlmIFtlbGVtZW50XSBpcyBub3QgZm91bmQuCiAgICoKICAgKiAgICAgbm90ZXMubGFzdEluZGV4T2YoJ2ZhJyk7ICAvLyAtMQogICAqLwogIGludCBsYXN0SW5kZXhPZihFIGVsZW1lbnQsIFtpbnQgc3RhcnRdKTsKCiAgLyoqCiAgICogUmVtb3ZlcyBhbGwgb2JqZWN0cyBmcm9tIHRoaXMgbGlzdDsKICAgKiB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGJlY29tZXMgemVyby4KICAgKgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0sIGFuZCByZXRhaW5zIGFsbCBvYmplY3RzLCBpZiB0aGlzCiAgICogaXMgYSBmaXhlZC1sZW5ndGggbGlzdC4KICAgKi8KICB2b2lkIGNsZWFyKCk7CgogIC8qKgogICAqIEluc2VydHMgdGhlIG9iamVjdCBhdCBwb3NpdGlvbiBbaW5kZXhdIGluIHRoaXMgbGlzdC4KICAgKgogICAqIFRoaXMgaW5jcmVhc2VzIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYnkgb25lIGFuZCBzaGlmdHMgYWxsIG9iamVjdHMKICAgKiBhdCBvciBhZnRlciB0aGUgaW5kZXggdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAqCiAgICogVGhlIGxpc3QgbXVzdCBiZSBncm93YWJsZS4KICAgKiBUaGUgW2luZGV4XSB2YWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbm8gZ3JlYXRlciB0aGFuIFtsZW5ndGhdLgogICAqLwogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRSBlbGVtZW50KTsKCiAgLyoqCiAgICogSW5zZXJ0cyBhbGwgb2JqZWN0cyBvZiBbaXRlcmFibGVdIGF0IHBvc2l0aW9uIFtpbmRleF0gaW4gdGhpcyBsaXN0LgogICAqCiAgICogVGhpcyBpbmNyZWFzZXMgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBieSB0aGUgbGVuZ3RoIG9mIFtpdGVyYWJsZV0gYW5kCiAgICogc2hpZnRzIGFsbCBsYXRlciBvYmplY3RzIHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgbGlzdC4KICAgKgogICAqIFRoZSBsaXN0IG11c3QgYmUgZ3Jvd2FibGUuCiAgICogVGhlIFtpbmRleF0gdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIG5vIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoXS4KICAgKi8KICB2b2lkIGluc2VydEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKTsKCiAgLyoqCiAgICogT3ZlcndyaXRlcyBvYmplY3RzIG9mIGB0aGlzYCB3aXRoIHRoZSBvYmplY3RzIG9mIFtpdGVyYWJsZV0sIHN0YXJ0aW5nCiAgICogYXQgcG9zaXRpb24gW2luZGV4XSBpbiB0aGlzIGxpc3QuCiAgICoKICAgKiAgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBbJ2EnLCAnYicsICdjJ107CiAgICogICAgIGxpc3Quc2V0QWxsKDEsIFsnYmVlJywgJ3NlYSddKTsKICAgKiAgICAgbGlzdC5qb2luKCcsICcpOyAvLyAnYSwgYmVlLCBzZWEnCiAgICoKICAgKiBUaGlzIG9wZXJhdGlvbiBkb2VzIG5vdCBpbmNyZWFzZSB0aGUgbGVuZ3RoIG9mIGB0aGlzYC4KICAgKgogICAqIFRoZSBbaW5kZXhdIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCBubyBncmVhdGVyIHRoYW4gW2xlbmd0aF0uCiAgICoKICAgKiBUaGUgW2l0ZXJhYmxlXSBtdXN0IG5vdCBoYXZlIG1vcmUgZWxlbWVudHMgdGhhbiB3aGF0IGNhbiBmaXQgZnJvbSBbaW5kZXhdCiAgICogdG8gW2xlbmd0aF0uCiAgICoKICAgKiBJZiBgaXRlcmFibGVgIGlzIGJhc2VkIG9uIHRoaXMgbGlzdCwgaXRzIHZhbHVlcyBtYXkgY2hhbmdlIC9kdXJpbmcvIHRoZQogICAqIGBzZXRBbGxgIG9wZXJhdGlvbi4KICAgKi8KICB2b2lkIHNldEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKTsKCiAgLyoqCiAgICogUmVtb3ZlcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBbdmFsdWVdIGZyb20gdGhpcyBsaXN0LgogICAqCiAgICogUmV0dXJucyB0cnVlIGlmIFt2YWx1ZV0gd2FzIGluIHRoZSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICoKICAgKiAgICAgTGlzdDxTdHJpbmc+IHBhcnRzID0gWydoZWFkJywgJ3Nob3VsZGVycycsICdrbmVlcycsICd0b2VzJ107CiAgICogICAgIHBhcnRzLnJlbW92ZSgnaGVhZCcpOyAvLyB0cnVlCiAgICogICAgIHBhcnRzLmpvaW4oJywgJyk7ICAgICAvLyAnc2hvdWxkZXJzLCBrbmVlcywgdG9lcycKICAgKgogICAqIFRoZSBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiBbdmFsdWVdIHdhcyBub3QgaW4gdGhlIGxpc3QuCiAgICoKICAgKiAgICAgLy8gTm90ZTogJ2hlYWQnIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZC4KICAgKiAgICAgcGFydHMucmVtb3ZlKCdoZWFkJyk7IC8vIGZhbHNlCiAgICogICAgIHBhcnRzLmpvaW4oJywgJyk7ICAgICAvLyAnc2hvdWxkZXJzLCBrbmVlcywgdG9lcycKICAgKgogICAqIEFuIFtVbnN1cHBvcnRlZEVycm9yXSBvY2N1cnMgaWYgdGhlIGxpc3QgaXMgZml4ZWQtbGVuZ3RoLgogICAqLwogIGJvb2wgcmVtb3ZlKE9iamVjdCB2YWx1ZSk7CgogIC8qKgogICAqIFJlbW92ZXMgdGhlIG9iamVjdCBhdCBwb3NpdGlvbiBbaW5kZXhdIGZyb20gdGhpcyBsaXN0LgogICAqCiAgICogVGhpcyBtZXRob2QgcmVkdWNlcyB0aGUgbGVuZ3RoIG9mIGB0aGlzYCBieSBvbmUgYW5kIG1vdmVzIGFsbCBsYXRlciBvYmplY3RzCiAgICogZG93biBieSBvbmUgcG9zaXRpb24uCiAgICoKICAgKiBSZXR1cm5zIHRoZSByZW1vdmVkIG9iamVjdC4KICAgKgogICAqIFRoZSBbaW5kZXhdIG11c3QgYmUgaW4gdGhlIHJhbmdlIGAwIOKJpCBpbmRleCA8IGxlbmd0aGAuCiAgICoKICAgKiBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdIGlmIHRoaXMgaXMgYSBmaXhlZC1sZW5ndGggbGlzdC4gSW4gdGhhdCBjYXNlCiAgICogdGhlIGxpc3QgaXMgbm90IG1vZGlmaWVkLgogICAqLwogIEUgcmVtb3ZlQXQoaW50IGluZGV4KTsKCiAgLyoqCiAgICogUG9wcyBhbmQgcmV0dXJucyB0aGUgbGFzdCBvYmplY3QgaW4gdGhpcyBsaXN0LgogICAqCiAgICogVGhlIGxpc3QgbXVzdCBub3QgYmUgZW1wdHkuCiAgICoKICAgKiBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdIGlmIHRoaXMgaXMgYSBmaXhlZC1sZW5ndGggbGlzdC4KICAgKi8KICBFIHJlbW92ZUxhc3QoKTsKCiAgLyoqCiAgICogUmVtb3ZlcyBhbGwgb2JqZWN0cyBmcm9tIHRoaXMgbGlzdCB0aGF0IHNhdGlzZnkgW3Rlc3RdLgogICAqCiAgICogQW4gb2JqZWN0IFs6bzpdIHNhdGlzZmllcyBbdGVzdF0gaWYgWzp0ZXN0KG8pOl0gaXMgdHJ1ZS4KICAgKgogICAqICAgICBMaXN0PFN0cmluZz4gbnVtYmVycyA9IFsnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJ107CiAgICogICAgIG51bWJlcnMucmVtb3ZlV2hlcmUoKGl0ZW0pID0+IGl0ZW0ubGVuZ3RoID09IDMpOwogICAqICAgICBudW1iZXJzLmpvaW4oJywgJyk7IC8vICd0aHJlZSwgZm91cicKICAgKgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaWYgdGhpcyBpcyBhIGZpeGVkLWxlbmd0aCBsaXN0LgogICAqLwogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpOwoKICAvKioKICAgKiBSZW1vdmVzIGFsbCBvYmplY3RzIGZyb20gdGhpcyBsaXN0IHRoYXQgZmFpbCB0byBzYXRpc2Z5IFt0ZXN0XS4KICAgKgogICAqIEFuIG9iamVjdCBbOm86XSBzYXRpc2ZpZXMgW3Rlc3RdIGlmIFs6dGVzdChvKTpdIGlzIHRydWUuCiAgICoKICAgKiAgICAgTGlzdDxTdHJpbmc+IG51bWJlcnMgPSBbJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91ciddOwogICAqICAgICBudW1iZXJzLnJldGFpbldoZXJlKChpdGVtKSA9PiBpdGVtLmxlbmd0aCA9PSAzKTsKICAgKiAgICAgbnVtYmVycy5qb2luKCcsICcpOyAvLyAnb25lLCB0d28nCiAgICoKICAgKiBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdIGlmIHRoaXMgaXMgYSBmaXhlZC1sZW5ndGggbGlzdC4KICAgKi8KICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGlzIGxpc3QgYW5kIFtvdGhlcl0uCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhpcyBsaXN0IGZvbGxvd2VkIGJ5CiAgICogdGhlIGVsZW1lbnRzIG9mIFtvdGhlcl0uCiAgICoKICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gYSBub3JtYWwgZ3Jvd2FibGUgbGlzdC4KICAgKiBTb21lIGxpc3QgdHlwZXMgbWF5IGNob29zZSB0byByZXR1cm4gYSBsaXN0IG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlbXNlbHZlcwogICAqIChzZWUgW1VpbnQ4TGlzdC4rXSk7CiAgICovCiAgTGlzdDxFPiBvcGVyYXRvciArKExpc3Q8RT4gb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgZWxlbWVudHMgYmV0d2VlbiBbc3RhcnRdIGFuZCBbZW5kXS4KICAgKgogICAqIFRoZSBuZXcgbGlzdCBpcyBhIGBMaXN0PEU+YCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGlzIGxpc3QgYXQKICAgKiBwb3NpdGlvbnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFtzdGFydF0gYW5kIGxlc3MgdGhhbiBbZW5kXSBpbiB0aGUgc2FtZQogICAqIG9yZGVyIGFzIHRoZXkgb2NjdXIgaW4gdGhpcyBsaXN0LgogICAqCiAgICogYGBgZGFydAogICAqIHZhciBjb2xvcnMgPSBbInJlZCIsICJncmVlbiIsICJibHVlIiwgIm9yYW5nZSIsICJwaW5rIl07CiAgICogcHJpbnQoY29sb3JzLnN1Ymxpc3QoMSwgMykpOyAvLyBbZ3JlZW4sIGJsdWVdCiAgICogYGBgCiAgICoKICAgKiBJZiBbZW5kXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byB0aGUgW2xlbmd0aF0gb2YgdGhpcyBsaXN0LgogICAqCiAgICogYGBgZGFydAogICAqIHByaW50KGNvbG9ycy5zdWJsaXN0KDEpKTsgLy8gW2dyZWVuLCBibHVlLCBvcmFuZ2UsIHBpbmtdCiAgICogYGBgCiAgICoKICAgKiBUaGUgYHN0YXJ0YCBhbmQgYGVuZGAgcG9zaXRpb25zIG11c3Qgc2F0aXNmeSB0aGUgcmVsYXRpb25zCiAgICogMCDiiaQgYHN0YXJ0YCDiiaQgYGVuZGAg4omkIGB0aGlzLmxlbmd0aGAKICAgKiBJZiBgZW5kYCBpcyBlcXVhbCB0byBgc3RhcnRgLCB0aGVuIHRoZSByZXR1cm5lZCBsaXN0IGlzIGVtcHR5LgogICAqLwogIExpc3Q8RT4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSk7CgogIC8qKgogICAqIFJldHVybnMgYW4gW0l0ZXJhYmxlXSB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIG9iamVjdHMgaW4gdGhlIHJhbmdlCiAgICogW3N0YXJ0XSBpbmNsdXNpdmUgdG8gW2VuZF0gZXhjbHVzaXZlLgogICAqCiAgICogVGhlIHByb3ZpZGVkIHJhbmdlLCBnaXZlbiBieSBbc3RhcnRdIGFuZCBbZW5kXSwgbXVzdCBiZSB2YWxpZCBhdCB0aGUgdGltZQogICAqIG9mIHRoZSBjYWxsLgogICAqCiAgICogQSByYW5nZSBmcm9tIFtzdGFydF0gdG8gW2VuZF0gaXMgdmFsaWQgaWYgYDAgPD0gc3RhcnQgPD0gZW5kIDw9IGxlbmAsIHdoZXJlCiAgICogYGxlbmAgaXMgdGhpcyBsaXN0J3MgYGxlbmd0aGAuIFRoZSByYW5nZSBzdGFydHMgYXQgYHN0YXJ0YCBhbmQgaGFzIGxlbmd0aAogICAqIGBlbmQgLSBzdGFydGAuIEFuIGVtcHR5IHJhbmdlICh3aXRoIGBlbmQgPT0gc3RhcnRgKSBpcyB2YWxpZC4KICAgKgogICAqIFRoZSByZXR1cm5lZCBbSXRlcmFibGVdIGJlaGF2ZXMgbGlrZSBgc2tpcChzdGFydCkudGFrZShlbmQgLSBzdGFydClgLgogICAqIFRoYXQgaXMsIGl0IGRvZXMgKm5vdCogdGhyb3cgaWYgdGhpcyBsaXN0IGNoYW5nZXMgc2l6ZS4KICAgKgogICAqICAgICBMaXN0PFN0cmluZz4gY29sb3JzID0gWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZScsICdvcmFuZ2UnLCAncGluayddOwogICAqICAgICBJdGVyYWJsZTxTdHJpbmc+IHJhbmdlID0gY29sb3JzLmdldFJhbmdlKDEsIDQpOwogICAqICAgICByYW5nZS5qb2luKCcsICcpOyAgLy8gJ2dyZWVuLCBibHVlLCBvcmFuZ2UnCiAgICogICAgIGNvbG9ycy5sZW5ndGggPSAzOwogICAqICAgICByYW5nZS5qb2luKCcsICcpOyAgLy8gJ2dyZWVuLCBibHVlJwogICAqLwogIEl0ZXJhYmxlPEU+IGdldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCk7CgogIC8qKgogICAqIENvcGllcyB0aGUgb2JqZWN0cyBvZiBbaXRlcmFibGVdLCBza2lwcGluZyBbc2tpcENvdW50XSBvYmplY3RzIGZpcnN0LAogICAqIGludG8gdGhlIHJhbmdlIFtzdGFydF0sIGluY2x1c2l2ZSwgdG8gW2VuZF0sIGV4Y2x1c2l2ZSwgb2YgdGhlIGxpc3QuCiAgICoKICAgKiAgICAgTGlzdDxpbnQ+IGxpc3QxID0gWzEsIDIsIDMsIDRdOwogICAqICAgICBMaXN0PGludD4gbGlzdDIgPSBbNSwgNiwgNywgOCwgOV07CiAgICogICAgIC8vIENvcGllcyB0aGUgNHRoIGFuZCA1dGggaXRlbXMgaW4gbGlzdDIgYXMgdGhlIDJuZCBhbmQgM3JkIGl0ZW1zCiAgICogICAgIC8vIG9mIGxpc3QxLgogICAqICAgICBsaXN0MS5zZXRSYW5nZSgxLCAzLCBsaXN0MiwgMyk7CiAgICogICAgIGxpc3QxLmpvaW4oJywgJyk7IC8vICcxLCA4LCA5LCA0JwogICAqCiAgICogVGhlIHByb3ZpZGVkIHJhbmdlLCBnaXZlbiBieSBbc3RhcnRdIGFuZCBbZW5kXSwgbXVzdCBiZSB2YWxpZC4KICAgKiBBIHJhbmdlIGZyb20gW3N0YXJ0XSB0byBbZW5kXSBpcyB2YWxpZCBpZiBgMCA8PSBzdGFydCA8PSBlbmQgPD0gbGVuYCwgd2hlcmUKICAgKiBgbGVuYCBpcyB0aGlzIGxpc3QncyBgbGVuZ3RoYC4gVGhlIHJhbmdlIHN0YXJ0cyBhdCBgc3RhcnRgIGFuZCBoYXMgbGVuZ3RoCiAgICogYGVuZCAtIHN0YXJ0YC4gQW4gZW1wdHkgcmFuZ2UgKHdpdGggYGVuZCA9PSBzdGFydGApIGlzIHZhbGlkLgogICAqCiAgICogVGhlIFtpdGVyYWJsZV0gbXVzdCBoYXZlIGVub3VnaCBvYmplY3RzIHRvIGZpbGwgdGhlIHJhbmdlIGZyb20gYHN0YXJ0YAogICAqIHRvIGBlbmRgIGFmdGVyIHNraXBwaW5nIFtza2lwQ291bnRdIG9iamVjdHMuCiAgICoKICAgKiBJZiBgaXRlcmFibGVgIGlzIHRoaXMgbGlzdCwgdGhlIG9wZXJhdGlvbiBjb3BpZXMgdGhlIGVsZW1lbnRzCiAgICogb3JpZ2luYWxseSBpbiB0aGUgcmFuZ2UgZnJvbSBgc2tpcENvdW50YCB0byBgc2tpcENvdW50ICsgKGVuZCAtIHN0YXJ0KWAgdG8KICAgKiB0aGUgcmFuZ2UgYHN0YXJ0YCB0byBgZW5kYCwgZXZlbiBpZiB0aGUgdHdvIHJhbmdlcyBvdmVybGFwLgogICAqCiAgICogSWYgYGl0ZXJhYmxlYCBkZXBlbmRzIG9uIHRoaXMgbGlzdCBpbiBzb21lIG90aGVyIHdheSwgbm8gZ3VhcmFudGVlcyBhcmUKICAgKiBtYWRlLgogICAqLwogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiBpdGVyYWJsZSwgW2ludCBza2lwQ291bnQgPSAwXSk7CgogIC8qKgogICAqIFJlbW92ZXMgdGhlIG9iamVjdHMgaW4gdGhlIHJhbmdlIFtzdGFydF0gaW5jbHVzaXZlIHRvIFtlbmRdIGV4Y2x1c2l2ZS4KICAgKgogICAqIFRoZSBwcm92aWRlZCByYW5nZSwgZ2l2ZW4gYnkgW3N0YXJ0XSBhbmQgW2VuZF0sIG11c3QgYmUgdmFsaWQuCiAgICogQSByYW5nZSBmcm9tIFtzdGFydF0gdG8gW2VuZF0gaXMgdmFsaWQgaWYgYDAgPD0gc3RhcnQgPD0gZW5kIDw9IGxlbmAsIHdoZXJlCiAgICogYGxlbmAgaXMgdGhpcyBsaXN0J3MgYGxlbmd0aGAuIFRoZSByYW5nZSBzdGFydHMgYXQgYHN0YXJ0YCBhbmQgaGFzIGxlbmd0aAogICAqIGBlbmQgLSBzdGFydGAuIEFuIGVtcHR5IHJhbmdlICh3aXRoIGBlbmQgPT0gc3RhcnRgKSBpcyB2YWxpZC4KICAgKgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaWYgdGhpcyBpcyBhIGZpeGVkLWxlbmd0aCBsaXN0LiBJbiB0aGF0IGNhc2UKICAgKiB0aGUgbGlzdCBpcyBub3QgbW9kaWZpZWQuCiAgICovCiAgdm9pZCByZW1vdmVSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpOwoKICAvKioKICAgKiBTZXRzIHRoZSBvYmplY3RzIGluIHRoZSByYW5nZSBbc3RhcnRdIGluY2x1c2l2ZSB0byBbZW5kXSBleGNsdXNpdmUKICAgKiB0byB0aGUgZ2l2ZW4gW2ZpbGxWYWx1ZV0uCiAgICoKICAgKiBUaGUgcHJvdmlkZWQgcmFuZ2UsIGdpdmVuIGJ5IFtzdGFydF0gYW5kIFtlbmRdLCBtdXN0IGJlIHZhbGlkLgogICAqIEEgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIGlzIHZhbGlkIGlmIGAwIDw9IHN0YXJ0IDw9IGVuZCA8PSBsZW5gLCB3aGVyZQogICAqIGBsZW5gIGlzIHRoaXMgbGlzdCdzIGBsZW5ndGhgLiBUaGUgcmFuZ2Ugc3RhcnRzIGF0IGBzdGFydGAgYW5kIGhhcyBsZW5ndGgKICAgKiBgZW5kIC0gc3RhcnRgLiBBbiBlbXB0eSByYW5nZSAod2l0aCBgZW5kID09IHN0YXJ0YCkgaXMgdmFsaWQuCiAgICoKICAgKiBFeGFtcGxlOgogICAqIGBgYGRhcnQKICAgKiAgTGlzdDxpbnQ+IGxpc3QgPSBuZXcgTGlzdCgzKTsKICAgKiAgICAgbGlzdC5maWxsUmFuZ2UoMCwgMiwgMSk7CiAgICogICAgIHByaW50KGxpc3QpOyAvLyAgWzEsIDEsIG51bGxdCiAgICogYGBgCiAgICoKICAgKi8KICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtFIGZpbGxWYWx1ZV0pOwoKICAvKioKICAgKiBSZW1vdmVzIHRoZSBvYmplY3RzIGluIHRoZSByYW5nZSBbc3RhcnRdIGluY2x1c2l2ZSB0byBbZW5kXSBleGNsdXNpdmUKICAgKiBhbmQgaW5zZXJ0cyB0aGUgY29udGVudHMgb2YgW3JlcGxhY2VtZW50XSBpbiBpdHMgcGxhY2UuCiAgICoKICAgKiAgICAgTGlzdDxpbnQ+IGxpc3QgPSBbMSwgMiwgMywgNCwgNV07CiAgICogICAgIGxpc3QucmVwbGFjZVJhbmdlKDEsIDQsIFs2LCA3XSk7CiAgICogICAgIGxpc3Quam9pbignLCAnKTsgLy8gJzEsIDYsIDcsIDUnCiAgICoKICAgKiBUaGUgcHJvdmlkZWQgcmFuZ2UsIGdpdmVuIGJ5IFtzdGFydF0gYW5kIFtlbmRdLCBtdXN0IGJlIHZhbGlkLgogICAqIEEgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIGlzIHZhbGlkIGlmIGAwIDw9IHN0YXJ0IDw9IGVuZCA8PSBsZW5gLCB3aGVyZQogICAqIGBsZW5gIGlzIHRoaXMgbGlzdCdzIGBsZW5ndGhgLiBUaGUgcmFuZ2Ugc3RhcnRzIGF0IGBzdGFydGAgYW5kIGhhcyBsZW5ndGgKICAgKiBgZW5kIC0gc3RhcnRgLiBBbiBlbXB0eSByYW5nZSAod2l0aCBgZW5kID09IHN0YXJ0YCkgaXMgdmFsaWQuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIG9uIGZpeGVkLWxlbmd0aCBsaXN0cywgZXZlbiB3aGVuIFtyZXBsYWNlbWVudF0KICAgKiBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzIGFzIHRoZSByZXBsYWNlZCByYW5nZS4gSW4gdGhhdCBjYXNlIHVzZQogICAqIFtzZXRSYW5nZV0gaW5zdGVhZC4KICAgKi8KICB2b2lkIHJlcGxhY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IHJlcGxhY2VtZW50KTsKCiAgLyoqCiAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgW01hcF0gdmlldyBvZiBgdGhpc2AuCiAgICoKICAgKiBUaGUgbWFwIHVzZXMgdGhl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IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICByZXN1bHRbaV0gPSBmaWxsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQHBhdGNoCiAgZmFjdG9yeSBMaXN0LmZyb20oSXRlcmFibGUgZWxlbWVudHMsIHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgaWYgKGVsZW1lbnRzIGlzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+KSB7CiAgICAgIGludCBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7CiAgICAgIHZhciBsaXN0ID0gZ3Jvd2FibGUgPyBuZXcgX0dyb3dhYmxlTGlzdDxFPihsZW5ndGgpIDogbmV3IF9MaXN0PEU+KGxlbmd0aCk7CiAgICAgIGlmIChsZW5ndGggPiAwKSB7CiAgICAgICAgLy8gQXZvaWQgY3JlYXRpbmcgaXRlcmF0b3IgdW5sZXNzIG5lY2Vzc2FyeS4KICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgZm9yICh2YXIgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICAgICAgbGlzdFtpKytdID0gZWxlbWVudDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGxpc3Q7CiAgICB9CiAgICAvLyBJZiBlbGVtZW50cyBpcyBhbiBJdGVyYWJsZTxFPiwgd2Ugd29uJ3QgbmVlZCBhIHR5cGUtdGVzdCBmb3IgZWFjaAogICAgLy8gZWxlbWVudC4gSW4gdGhlICJjb21tb24gY2FzZSIgdGhhdCBlbGVtZW50cyBpcyBhbiBJdGVyYWJsZTxFPiwgdGhpcwogICAgLy8gcmVwbGFjZXMgYSB0eXBlLXRlc3Qgb24gZXZlcnkgZWxlbWVudCB3aXRoIGEgc2luZ2xlIHR5cGUtdGVzdCBiZWZvcmUKICAgIC8vIHN0YXJ0aW5nIHRoZSBsb29wLgogICAgaWYgKGVsZW1lbnRzIGlzIEl0ZXJhYmxlPEU+KSB7CiAgICAgIExpc3Q8RT4gbGlzdCA9IG5ldyBfR3Jvd2FibGVMaXN0PEU+KDApOwogICAgICBmb3IgKEUgZSBpbiBlbGVtZW50cykgewogICAgICAgIGxpc3QuYWRkKGUpOwogICAgICB9CiAgICAgIGlmIChncm93YWJsZSkgcmV0dXJuIGxpc3Q7CiAgICAgIHJldHVybiBtYWtlTGlzdEZpeGVkTGVuZ3RoKGxpc3QpOwogICAgfSBlbHNlIHsKICAgICAgTGlzdDxFPiBsaXN0ID0gbmV3IF9Hcm93YWJsZUxpc3Q8RT4oMCk7CiAgICAgIGZvciAoRSBlIGluIGVsZW1lbnRzKSB7CiAgICAgICAgbGlzdC5hZGQoZSk7CiAgICAgIH0KICAgICAgaWYgKGdyb3dhYmxlKSByZXR1cm4gbGlzdDsKICAgICAgcmV0dXJuIG1ha2VMaXN0Rml4ZWRMZW5ndGgobGlzdCk7CiAgICB9CiAgfQoKICBAcGF0Y2gKICBmYWN0b3J5IExpc3QudW5tb2RpZmlhYmxlKEl0ZXJhYmxlIGVsZW1lbnRzKSB7CiAgICBmaW5hbCByZXN1bHQgPSBuZXcgTGlzdDxFPi5mcm9tKGVsZW1lbnRzLCBncm93YWJsZTogZmFsc2UpOwogICAgcmV0dXJuIG1ha2VGaXhlZExpc3RVbm1vZGlmaWFibGUocmVzdWx0KTsKICB9CgogIC8vIEZhY3RvcnkgY29uc3RydWN0aW5nIGEgbXV0YWJsZSBMaXN0IGZyb20gYSBwYXJzZXIgZ2VuZXJhdGVkIExpc3QgbGl0ZXJhbC4KICAvLyBbZWxlbWVudHNdIGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQgYXJlIGFscmVhZHkgdHlwZSBjaGVja2VkLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIGZhY3RvcnkgTGlzdC5fZnJvbUxpdGVyYWwoTGlzdCBlbGVtZW50cykgewogICAgaWYgKGVsZW1lbnRzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIG5ldyBfR3Jvd2FibGVMaXN0PEU+KDApOwogICAgfQogICAgdmFyIHJlc3VsdCA9IG5ldyBfR3Jvd2FibGVMaXN0PEU+Ll93aXRoRGF0YShlbGVtZW50cyk7CiAgICByZXN1bHQuX3NldExlbmd0aChlbGVtZW50cy5sZW5ndGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KTwBOTjwBHgEHEAkwAQlEUBVRGCkaCAYTBAEJQDIkURg1EygfCggTBklLTBojLh4VCCEoDS4eFQghKAYEAQkxQC4EAU9BJC0cJgY7KBMEAgEgZGFydDpjb3JlLXBhdGNoL2FycmF5X3BhdGNoLmRhcnQpb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvbWFwLmRhcnS0Zy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBBIGNvbGxlY3Rpb24gb2Yga2V5L3ZhbHVlIHBhaXJzLCBmcm9tIHdoaWNoIHlvdSByZXRyaWV2ZSBhIHZhbHVlCiAqIHVzaW5nIGl0cyBhc3NvY2lhdGVkIGtleS4KICoKICogVGhlcmUgaXMgYSBmaW5pdGUgbnVtYmVyIG9mIGtleXMgaW4gdGhlIG1hcCwKICogYW5kIGVhY2gga2V5IGhhcyBleGFjdGx5IG9uZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXQuCiAqCiAqIE1hcHMsIGFuZCB0aGVpciBrZXlzIGFuZCB2YWx1ZXMsIGNhbiBiZSBpdGVyYXRlZC4KICogVGhlIG9yZGVyIG9mIGl0ZXJhdGlvbiBpcyBkZWZpbmVkIGJ5IHRoZSBpbmRpdmlkdWFsIHR5cGUgb2YgbWFwLgogKiBFeGFtcGxlczoKICoKICogKiBUaGUgcGxhaW4gW0hhc2hNYXBdIGlzIHVub3JkZXJlZCAobm8gb3JkZXIgaXMgZ3VhcmFudGVlZCksCiAqICogdGhlIFtMaW5rZWRIYXNoTWFwXSBpdGVyYXRlcyBpbiBrZXkgaW5zZXJ0aW9uIG9yZGVyLAogKiAqIGFuZCBhIHNvcnRlZCBtYXAgbGlrZSBbU3BsYXlUcmVlTWFwXSBpdGVyYXRlcyB0aGUga2V5cyBpbiBzb3J0ZWQgb3JkZXIuCiAqCiAqIEl0IGlzIGdlbmVyYWxseSBub3QgYWxsb3dlZCB0byBtb2RpZnkgdGhlIG1hcCAoYWRkIG9yIHJlbW92ZSBrZXlzKSB3aGlsZQogKiBhbiBvcGVyYXRpb24gaXMgYmVpbmcgcGVyZm9ybWVkIG9uIHRoZSBtYXAsIGZvciBleGFtcGxlIGluIGZ1bmN0aW9ucyBjYWxsZWQKICogZHVyaW5nIGEgW2ZvckVhY2hdIG9yIFtwdXRJZkFic2VudF0gY2FsbC4KICogTW9kaWZ5aW5nIHRoZSBtYXAgd2hpbGUgaXRlcmF0aW5nIHRoZSBrZXlzIG9yIHZhbHVlcwogKiBtYXkgYWxzbyBicmVhayB0aGUgaXRlcmF0aW9uLgogKgogKiBJdCBpcyBnZW5lcmFsbHkgbm90IGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBlcXVhbGl0eSBvZiBrZXlzIChhbmQgdGh1cyBub3QKICogdGhlaXIgaGFzaGNvZGUpIHdoaWxlIHRoZXkgYXJlIGluIHRoZSBtYXAuIFNvbWUgc3BlY2lhbGl6ZWQgc3VidHlwZXMgbWF5IGJlCiAqIG1vcmUgcGVybWlzc2l2ZSwgaW4gd2hpY2ggY2FzZSB0aGV5IHNob3VsZCBkb2N1bWVudCB0aGlzIGJlaGF2aW9yLgogKi8KYWJzdHJhY3QgY2xhc3MgTWFwPEssIFY+IHsKICAvKioKICAgKiBDcmVhdGVzIGEgTWFwIGluc3RhbmNlIHdpdGggdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIFtMaW5rZWRIYXNoTWFwXS4KICAgKgogICAqIFRoaXMgY29uc3RydWN0b3IgaXMgZXF1aXZhbGVudCB0byB0aGUgbm9uLWNvbnN0IG1hcCBsaXRlcmFsIGA8SyxWPnt9YC4KICAgKgogICAqIEEgYExpbmtlZEhhc2hNYXBgIHJlcXVpcmVzIHRoZSBrZXlzIHRvIGltcGxlbWVudCBjb21wYXRpYmxlCiAgICogYG9wZXJhdG9yPT1gIGFuZCBgaGFzaENvZGVgLCBhbmQgaXQgYWxsb3dzIG51bGwgYXMgYSBrZXkuCiAgICogSXQgaXRlcmF0ZXMgaW4ga2V5IGluc2VydGlvbiBvcmRlci4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IE1hcCgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0xpbmtlZEhhc2hNYXBdIGluc3RhbmNlIHRoYXQgY29udGFpbnMgYWxsIGtleS92YWx1ZSBwYWlycyBvZgogICAqIFtvdGhlcl0uCiAgICoKICAgKiBUaGUga2V5cyBtdXN0IGFsbCBiZSBpbnN0YW5jZXMgb2YgW0tdIGFuZCB0aGUgdmFsdWVzIG9mIFtWXS4KICAgKiBUaGUgW290aGVyXSBtYXAgaXRzZWxmIGNhbiBoYXZlIGFueSB0eXBlLgogICAqCiAgICogQSBgTGlua2VkSGFzaE1hcGAgcmVxdWlyZXMgdGhlIGtleXMgdG8gaW1wbGVtZW50IGNvbXBhdGlibGUKICAgKiBgb3BlcmF0b3I9PWAgYW5kIGBoYXNoQ29kZWAsIGFuZCBpdCBhbGxvd3MgYG51bGxgIGFzIGEga2V5LgogICAqIEl0IGl0ZXJhdGVzIGluIGtleSBpbnNlcnRpb24gb3JkZXIuCiAgICovCiAgZmFjdG9yeSBNYXAuZnJvbShNYXAgb3RoZXIpID0gTGlua2VkSGFzaE1hcDxLLCBWPi5mcm9tOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0xpbmtlZEhhc2hNYXBdIHdpdGggdGhlIHNhbWUga2V5cyBhbmQgdmFsdWVzIGFzIFtvdGhlcl0uCiAgICoKICAgKiBBIGBMaW5rZWRIYXNoTWFwYCByZXF1aXJlcyB0aGUga2V5cyB0byBpbXBsZW1lbnQgY29tcGF0aWJsZQogICAqIGBvcGVyYXRvcj09YCBhbmQgYGhhc2hDb2RlYCwgYW5kIGl0IGFsbG93cyBgbnVsbGAgYXMgYSBrZXkuCiAgICogSXQgaXRlcmF0ZXMgaW4ga2V5IGluc2VydGlvbiBvcmRlci4KICAgKi8KICBmYWN0b3J5IE1hcC5vZihNYXA8SywgVj4gb3RoZXIpID0gTGlua2VkSGFzaE1hcDxLLCBWPi5vZjsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiB1bm1vZGlmaWFibGUgaGFzaCBiYXNlZCBtYXAgY29udGFpbmluZyB0aGUgZW50cmllcyBvZiBbb3RoZXJdLgogICAqCiAgICogVGhlIGtleXMgbXVzdCBhbGwgYmUgaW5zdGFuY2VzIG9mIFtLXSBhbmQgdGhlIHZhbHVlcyBvZiBbVl0uCiAgICogVGhlIFtvdGhlcl0gbWFwIGl0c2VsZiBjYW4gaGF2ZSBhbnkgdHlwZS4KICAgKgogICAqIFRoZSBtYXAgcmVxdWlyZXMgdGhlIGtleXMgdG8gaW1wbGVtZW50IGNvbXBhdGlibGUKICAgKiBgb3BlcmF0b3I9PWAgYW5kIGBoYXNoQ29kZWAsIGFuZCBpdCBhbGxvd3MgYG51bGxgIGFzIGEga2V5LgogICAqIFRoZSBjcmVhdGVkIG1hcCBpdGVyYXRlcyBrZXlzIGluIGEgZml4ZWQgb3JkZXIsCiAgICogcHJlc2VydmluZyB0aGUgb3JkZXIgcHJvdmlkZWQgYnkgW290aGVyXS4KICAgKgogICAqIFRoZSByZXN1bHRpbmcgbWFwIGJlaGF2ZXMgbGlrZSB0aGUgcmVzdWx0IG9mIFtNYXAuZnJvbV0sCiAgICogZXhjZXB0IHRoYXQgdGhlIG1hcCByZXR1cm5lZCBieSB0aGlzIGNvbnN0cnVjdG9yIGlzIG5vdCBtb2RpZmlhYmxlLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgTWFwLnVubW9kaWZpYWJsZShNYXAgb3RoZXIpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGlkZW50aXR5IG1hcCB3aXRoIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLCBbTGlua2VkSGFzaE1hcF0uCiAgICoKICAgKiBBbiBpZGVudGl0eSBtYXAgdXNlcyBbaWRlbnRpY2FsXSBmb3IgZXF1YWxpdHkgYW5kIFtpZGVudGl0eUhhc2hDb2RlXQogICAqIGZvciBoYXNoIGNvZGVzIG9mIGtleXMgaW5zdGVhZCBvZiB0aGUgaW50cmluc2ljIFtPYmplY3Qub3BlcmF0b3I9PV0gYW5kCiAgICogW09iamVjdC5oYXNoQ29kZV0gb2YgdGhlIGtleXMuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgbWFwIGFsbG93cyBgbnVsbGAgYXMgYSBrZXkuCiAgICogSXQgaXRlcmF0ZXMgaW4ga2V5IGluc2VydGlvbiBvcmRlci4KICAgKi8KICBmYWN0b3J5IE1hcC5pZGVudGl0eSgpID0gTGlua2VkSGFzaE1hcDxLLCBWPi5pZGVudGl0eTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIE1hcCBpbnN0YW5jZSBpbiB3aGljaCB0aGUga2V5cyBhbmQgdmFsdWVzIGFyZSBjb21wdXRlZCBmcm9tIHRoZQogICAqIFtpdGVyYWJsZV0uCiAgICoKICAgKiBUaGUgY3JlYXRlZCBtYXAgaXMgYSBbTGlua2VkSGFzaE1hcF0uCiAgICogQSBgTGlua2VkSGFzaE1hcGAgcmVxdWlyZXMgdGhlIGtleXMgdG8gaW1wbGVtZW50IGNvbXBhdGlibGUKICAgKiBgb3BlcmF0b3I9PWAgYW5kIGBoYXNoQ29kZWAsIGFuZCBpdCBhbGxvd3MgbnVsbCBhcyBhIGtleS4KICAgKiBJdCBpdGVyYXRlcyBpbiBrZXkgaW5zZXJ0aW9uIG9yZGVyLgogICAqCiAgICogRm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgW2l0ZXJhYmxlXSB0aGlzIGNvbnN0cnVjdG9yIGNvbXB1dGVzIGEga2V5L3ZhbHVlCiAgICogcGFpciwgYnkgYXBwbHlpbmcgW2tleV0gYW5kIFt2YWx1ZV0gcmVzcGVjdGl2ZWx5LgogICAqCiAgICogVGhlIGV4YW1wbGUgYmVsb3cgY3JlYXRlcyBhIG5ldyBNYXAgZnJvbSBhIExpc3QuIFRoZSBrZXlzIG9mIGBtYXBgIGFyZQogICAqIGBsaXN0YCB2YWx1ZXMgY29udmVydGVkIHRvIHN0cmluZ3MsIGFuZCB0aGUgdmFsdWVzIG9mIHRoZSBgbWFwYCBhcmUgdGhlCiAgICogc3F1YXJlcyBvZiB0aGUgYGxpc3RgIHZhbHVlczoKICAgKgogICAqICAgICBMaXN0PGludD4gbGlzdCA9IFsxLCAyLCAzXTsKICAgKiAgICAgTWFwPFN0cmluZywgaW50PiBtYXAgPSBuZXcgTWFwLmZyb21JdGVyYWJsZShsaXN0LAogICAqICAgICAgICAga2V5OiAoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpLAogICAqICAgICAgICAgdmFsdWU6IChpdGVtKSA9PiBpdGVtICogaXRlbSk7CiAgICoKICAgKiAgICAgbWFwWycxJ10gKyBtYXBbJzInXTsgLy8gMSArIDQKICAgKiAgICAgbWFwWyczJ10gLSBtYXBbJzInXTsgLy8gOSAtIDQKICAgKgogICAqIElmIG5vIHZhbHVlcyBhcmUgc3BlY2lmaWVkIGZvciBba2V5XSBhbmQgW3ZhbHVlXSB0aGUgZGVmYXVsdCBpcyB0aGUKICAgKiBpZGVudGl0eSBmdW5jdGlvbi4KICAgKgogICAqIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgdGhlIGtleXMgYW5kIGNvcnJlc3BvbmRpbmcgdmFsdWVzIG9mIGBtYXBgCiAgICogYXJlIGBsaXN0YCB2YWx1ZXM6CiAgICoKICAgKiAgICAgbWFwID0gbmV3IE1hcC5mcm9tSXRlcmFibGUobGlzdCk7CiAgICogICAgIG1hcFsxXSArIG1hcFsyXTsgLy8gMSArIDIKICAgKiAgICAgbWFwWzNdIC0gbWFwWzJdOyAvLyAzIC0gMgogICAqCiAgICogVGhlIGtleXMgY29tcHV0ZWQgYnkgdGhlIHNvdXJjZSBbaXRlcmFibGVdIGRvIG5vdCBuZWVkIHRvIGJlIHVuaXF1ZS4gVGhlCiAgICogbGFzdCBvY2N1cnJlbmNlIG9mIGEga2V5IHdpbGwgc2ltcGx5IG92ZXJ3cml0ZSBhbnkgcHJldmlvdXMgdmFsdWUuCiAgICovCiAgZmFjdG9yeSBNYXAuZnJvbUl0ZXJhYmxlKEl0ZXJhYmxlIGl0ZXJhYmxlLAogICAgICB7SyBrZXkoZWxlbWVudCksIFYgdmFsdWUoZWxlbWVudCl9KSA9IExpbmtlZEhhc2hNYXA8SywgVj4uZnJvbUl0ZXJhYmxlOwoKICAvKioKICAgKiBDcmVhdGVzIGEgTWFwIGluc3RhbmNlIGFzc29jaWF0aW5nIHRoZSBnaXZlbiBba2V5c10gdG8gW3ZhbHVlc10uCiAgICoKICAgKiBUaGUgY3JlYXRlZCBtYXAgaXMgYSBbTGlua2VkSGFzaE1hcF0uCiAgICogQSBgTGlua2VkSGFzaE1hcGAgcmVxdWlyZXMgdGhlIGtleXMgdG8gaW1wbGVtZW50IGNvbXBhdGlibGUKICAgKiBgb3BlcmF0b3I9PWAgYW5kIGBoYXNoQ29kZWAsIGFuZCBpdCBhbGxvd3MgbnVsbCBhcyBhIGtleS4KICAgKiBJdCBpdGVyYXRlcyBpbiBrZXkgaW5zZXJ0aW9uIG9yZGVyLgogICAqCiAgICogVGhpcyBjb25zdHJ1Y3RvciBpdGVyYXRlcyBvdmVyIFtrZXlzXSBhbmQgW3ZhbHVlc10gYW5kIG1hcHMgZWFjaCBlbGVtZW50IG9mCiAgICogW2tleXNdIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgW3ZhbHVlc10uCiAgICoKICAgKiAgICAgTGlzdDxTdHJpbmc+IGxldHRlcnMgPSBbJ2InLCAnYyddOwogICAqICAgICBMaXN0PFN0cmluZz4gd29yZHMgPSBbJ2JhZCcsICdjYXQnXTsKICAgKiAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgTWFwLmZyb21JdGVyYWJsZXMobGV0dGVycywgd29yZHMpOwogICAqICAgICBtYXBbJ2InXSArIG1hcFsnYyddOyAgLy8gYmFkY2F0CiAgICoKICAgKiBJZiBba2V5c10gY29udGFpbnMgdGhlIHNhbWUgb2JqZWN0IG11bHRpcGxlIHRpbWVzLCB0aGUgbGFzdCBvY2N1cnJlbmNlCiAgICogb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgdmFsdWUuCiAgICoKICAgKiBUaGUgdHdvIFtJdGVyYWJsZV1zIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguCiAgICovCiAgZmFjdG9yeSBNYXAuZnJvbUl0ZXJhYmxlcyhJdGVyYWJsZTxLPiBrZXlzLCBJdGVyYWJsZTxWPiB2YWx1ZXMpID0KICAgICAgTGlua2VkSGFzaE1hcDxLLCBWPi5mcm9tSXRlcmFibGVzOwoKICAvKioKICAgKiBBZGFwdHMgW3NvdXJjZV0gdG8gYmUgYSBgTWFwPEsyLCBWMj5gLgogICAqCiAgICogQW55IHRpbWUgdGhlIHNldCB3b3VsZCBwcm9kdWNlIGEga2V5IG9yIHZhbHVlIHRoYXQgaXMgbm90IGEgW0syXSBvciBbVjJdLAogICAqIHRoZSBhY2Nlc3Mgd2lsbCB0aHJvdy4KICAgKgogICAqIEFueSB0aW1lIFtLMl0ga2V5IG9yIFtWMl0gdmFsdWUgaXMgYXR0ZW1wdGVkIGFkZGVkIGludG8gdGhlIGFkYXB0ZWQgbWFwLAogICAqIHRoZSBzdG9yZSB3aWxsIHRocm93IHVubGVzcyB0aGUga2V5IGlzIGFsc28gYW4gaW5zdGFuY2Ugb2YgW0tdIGFuZAogICAqIHRoZSB2YWx1ZSBpcyBhbHNvIGFuIGluc3RhbmNlIG9mIFtWXS4KICAgKgogICAqIElmIGFsbCBhY2Nlc3NlZCBlbnRyaWVzIG9mIFtzb3VyY2VdIGFyZSBoYXZlIFtLMl0ga2V5cyBhbmQgW1YyXSB2YWx1ZXMKICAgKiBhbmQgaWYgYWxsIGVudHJpZXMgYWRkZWQgdG8gdGhlIHJldHVybmVkIG1hcCBoYXZlIFtLXSBrZXlzIGFuZCBbVl1dIHZhbHVlcywKICAgKiB0aGVuIHRoZSByZXR1cm5lZCBtYXAgY2FuIGJlIHVzZWQgYXMgYSBgTWFwPEsyLCBWMj5gLgogICAqLwogIHN0YXRpYyBNYXA8SzIsIFYyPiBjYXN0RnJvbTxLLCBWLCBLMiwgVjI+KE1hcDxLLCBWPiBzb3VyY2UpID0+CiAgICAgIENhc3RNYXA8SywgViwgSzIsIFYyPihzb3VyY2UpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IG1hcCBhbmQgYWRkcyBhbGwgZW50cmllcy4KICAgKgogICAqIFJldHVybnMgYSBuZXcgYE1hcDxLLCBWPmAgd2hlcmUgYWxsIGVudHJpZXMgb2YgW2VudHJpZXNdCiAgICogaGF2ZSBiZWVuIGFkZGVkIGluIGl0ZXJhdGlvbiBvcmRlci4KICAgKgogICAqIElmIG11bHRpcGxlIFtlbnRyaWVzXSBoYXZlIHRoZSBzYW1lIGtleSwKICAgKiBsYXRlciBvY2N1cnJlbmNlcyBvdmVyd3JpdGUgdGhlIGVhcmxpZXIgb25lcy4KICAgKi8KICBmYWN0b3J5IE1hcC5mcm9tRW50cmllcyhJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZW50cmllcykgPT4KICAgICAgPEssIFY+e30uLmFkZEVudHJpZXMoZW50cmllcyk7CgogIC8qKgogICAqIFByb3ZpZGVzIGEgdmlldyBvZiB0aGlzIG1hcCBhcyBoYXZpbmcgW1JLXSBrZXlzIGFuZCBbUlZdIGluc3RhbmNlcywKICAgKiBpZiBuZWNlc3NhcnkuCiAgICoKICAgKiBJZiB0aGlzIG1hcCBpcyBhbHJlYWR5IGEgYE1hcDxSSywgUlY+YCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgogICAqCiAgICogSWYgdGhpcyBzZXQgY29udGFpbnMgb25seSBrZXlzIG9mIHR5cGUgW1JLXSBhbmQgdmFsdWVzIG9mIHR5cGUgW1JWXSwKICAgKiBhbGwgcmVhZCBvcGVyYXRpb25zIHdpbGwgd29yayBjb3JyZWN0bHkuCiAgICogSWYgYW55IG9wZXJhdGlvbiBleHBvc2VzIGEgbm9uLVtSS10ga2V5IG9yIG5vbi1bUlZdIHZhbHVlLAogICAqIHRoZSBvcGVyYXRpb24gd2lsbCB0aHJvdyBpbnN0ZWFkLgogICAqCiAgICogRW50cmllcyBhZGRlZCB0byB0aGUgbWFwIG11c3QgYmUgdmFsaWQgZm9yIGJvdGggYSBgTWFwPEssIFY+YCBhbmQgYQogICAqIGBNYXA8UkssIFJWPmAuCiAgICovCiAgTWFwPFJLLCBSVj4gY2FzdDxSSywgUlY+KCk7CiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWFwIGNvbnRhaW5zIHRoZSBnaXZlbiBbdmFsdWVdLgogICAqCiAgICogUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgdmFsdWVzIGluIHRoZSBtYXAgYXJlIGVxdWFsIHRvIGB2YWx1ZWAKICAgKiBhY2NvcmRpbmcgdG8gdGhlIGA9PWAgb3BlcmF0b3IuCiAgICovCiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSk7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBjb250YWlucyB0aGUgZ2l2ZW4gW2tleV0uCiAgICoKICAgKiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBrZXlzIGluIHRoZSBtYXAgYXJlIGVxdWFsIHRvIGBrZXlgCiAgICogYWNjb3JkaW5nIHRvIHRoZSBlcXVhbGl0eSB1c2VkIGJ5IHRoZSBtYXAuCiAgICovCiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBba2V5XSBvciBudWxsIGlmIFtrZXldIGlzIG5vdCBpbiB0aGUgbWFwLgogICAqCiAgICogU29tZSBtYXBzIGFsbG93IGtleXMgdG8gaGF2ZSBgbnVsbGAgYXMgYSB2YWx1ZS4KICAgKiBGb3IgdGhvc2UgbWFwcywgYSBsb29rdXAgdXNpbmcgdGhpcyBvcGVyYXRvciBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhCiAgICoga2V5IG5vdCBiZWluZyBpbiB0aGUgbWFwIGFuZCB0aGUga2V5IGhhdmluZyBhIGBudWxsYCB2YWx1ZS4KICAgKiBNZXRob2RzIGxpa2UgW2NvbnRhaW5zS2V5XSBvciBbcHV0SWZBYnNlbnRdIGNhbiBiZSB1c2VkIGlmIHRoZSBkaXN0aW5jdGlvbgogICAqIGlzIGltcG9ydGFudC4KICAgKi8KICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpOwoKICAvKioKICAgKiBBc3NvY2lhdGVzIHRoZSBba2V5XSB3aXRoIHRoZSBnaXZlbiBbdmFsdWVdLgogICAqCiAgICogSWYgdGhlIGtleSB3YXMgYWxyZWFkeSBpbiB0aGUgbWFwLCBpdHMgYXNzb2NpYXRlZCB2YWx1ZSBpcyBjaGFuZ2VkLgogICAqIE90aGVyd2lzZSB0aGUga2V5L3ZhbHVlIHBhaXIgaXMgYWRkZWQgdG8gdGhlIG1hcC4KICAgKi8KICB2b2lkIG9wZXJhdG9yIFtdPShLIGtleSwgViB2YWx1ZSk7CgogIC8qKgogICAqIFRoZSBtYXAgZW50cmllcyBvZiBbdGhpc10uCiAgICovCiAgSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGdldCBlbnRyaWVzOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IG1hcCB3aGVyZSBhbGwgZW50cmllcyBvZiB0aGlzIG1hcCBhcmUgdHJhbnNmb3JtZWQgYnkKICAgKiB0aGUgZ2l2ZW4gW2ZdIGZ1bmN0aW9uLgogICAqLwogIE1hcDxLMiwgVjI+IG1hcDxLMiwgVjI+KE1hcEVudHJ5PEsyLCBWMj4gZihLIGtleSwgViB2YWx1ZSkpOwoKICAvKioKICAgKiBBZGRzIGFsbCBrZXkvdmFsdWUgcGFpcnMgb2YgW25ld0VudHJpZXNdIHRvIHRoaXMgbWFwLgogICAqCiAgICogSWYgYSBrZXkgb2YgW25ld0VudHJpZXNdIGlzIGFscmVhZHkgaW4gdGhpcyBtYXAsCiAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgb3ZlcndyaXR0ZW4uCiAgICoKICAgKiBUaGUgb3BlcmF0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZG9pbmcgYHRoaXNbZW50cnkua2V5XSA9IGVudHJ5LnZhbHVlYAogICAqIGZvciBlYWNoIFtNYXBFbnRyeV0gb2YgdGhlIGl0ZXJhYmxlLgogICAqLwogIHZvaWQgYWRkRW50cmllcyhJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gbmV3RW50cmllcyk7CgogIC8qKgogICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgW2tleV0uCiAgICoKICAgKiBSZXR1cm5zIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGtleS4KICAgKgogICAqIElmIHRoZSBrZXkgaXMgcHJlc2VudCwgaW52b2tlcyBbdXBkYXRlXSB3aXRoIHRoZSBjdXJyZW50IHZhbHVlIGFuZCBzdG9yZXMKICAgKiB0aGUgbmV3IHZhbHVlIGluIHRoZSBtYXAuCiAgICoKICAgKiBJZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50IGFuZCBbaWZBYnNlbnRdIGlzIHByb3ZpZGVkLCBjYWxscyBbaWZBYnNlbnRdCiAgICogYW5kIGFkZHMgdGhlIGtleSB3aXRoIHRoZSByZXR1cm5lZCB2YWx1ZSB0byB0aGUgbWFwLgogICAqCiAgICogSXQncyBhbiBlcnJvciBpZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50IGFuZCBbaWZBYnNlbnRdIGlzIG5vdCBwcm92aWRlZC4KICAgKi8KICBWIHVwZGF0ZShLIGtleSwgViB1cGRhdGUoViB2YWx1ZSksIHtWIGlmQWJzZW50KCl9KTsKCiAgLyoqCiAgICogVXBkYXRlcyBhbGwgdmFsdWVzLgogICAqCiAgICogSXRlcmF0ZXMgb3ZlciBhbGwgZW50cmllcyBpbiB0aGUgbWFwIGFuZCB1cGRhdGVzIHRoZW0gd2l0aCB0aGUgcmVzdWx0CiAgICogb2YgaW52b2tpbmcgW3VwZGF0ZV0uCiAgICovCiAgdm9pZCB1cGRhdGVBbGwoViB1cGRhdGUoSyBrZXksIFYgdmFsdWUpKTsKCiAgLyoqCiAgICogUmVtb3ZlcyBhbGwgZW50cmllcyBvZiB0aGlzIG1hcCB0aGF0IHNhdGlzZnkgdGhlIGdpdmVuIFtwcmVkaWNhdGVdLgogICAqLwogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCBwcmVkaWNhdGUoSyBrZXksIFYgdmFsdWUpKTsKCiAgLyoqCiAgICogTG9vayB1cCB0aGUgdmFsdWUgb2YgW2tleV0sIG9yIGFkZCBhIG5ldyB2YWx1ZSBpZiBpdCBpc24ndCB0aGVyZS4KICAgKgogICAqIFJldHVybnMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgdG8gW2tleV0sIGlmIHRoZXJlIGlzIG9uZS4KICAgKiBPdGhlcndpc2UgY2FsbHMgW2lmQWJzZW50XSB0byBnZXQgYSBuZXcgdmFsdWUsIGFzc29jaWF0ZXMgW2tleV0gdG8KICAgKiB0aGF0IHZhbHVlLCBhbmQgdGhlbiByZXR1cm5zIHRoZSBuZXcgdmFsdWUuCiAgICoKICAgKiAgICAgTWFwPFN0cmluZywgaW50PiBzY29yZXMgPSB7J0JvYic6IDM2fTsKICAgKiAgICAgZm9yICh2YXIga2V5IGluIFsnQm9iJywgJ1JvaGFuJywgJ1NvcGhlbmEnXSkgewogICAqICAgICAgIHNjb3Jlcy5wdXRJZkFic2VudChrZXksICgpID0+IGtleS5sZW5ndGgpOwogICAqICAgICB9CiAgICogICAgIHNjb3Jlc1snQm9iJ107ICAgICAgLy8gMzYKICAgKiAgICAgc2NvcmVzWydSb2hhbiddOyAgICAvLyAgNQogICAqICAgICBzY29yZXNbJ1NvcGhlbmEnXTsgIC8vICA3CiAgICoKICAgKiBDYWxsaW5nIFtpZkFic2VudF0gbXVzdCBub3QgYWRkIG9yIHJlbW92ZSBrZXlzIGZyb20gdGhlIG1hcC4KICAgKi8KICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpOwoKICAvKioKICAgKiBBZGRzIGFsbCBrZXkvdmFsdWUgcGFpcnMgb2YgW290aGVyXSB0byB0aGlzIG1hcC4KICAgKgogICAqIElmIGEga2V5IG9mIFtvdGhlcl0gaXMgYWxyZWFkeSBpbiB0aGlzIG1hcCwgaXRzIHZhbHVlIGlzIG92ZXJ3cml0dGVuLgogICAqCiAgICogVGhlIG9wZXJhdGlvbiBpcyBlcXVpdmFsZW50IHRvIGRvaW5nIGB0aGlzW2tleV0gPSB2YWx1ZWAgZm9yIGVhY2gga2V5CiAgICogYW5kIGFzc29jaWF0ZWQgdmFsdWUgaW4gb3RoZXIuIEl0IGl0ZXJhdGVzIG92ZXIgW290aGVyXSwgd2hpY2ggbXVzdAogICAqIHRoZXJlZm9yZSBub3QgY2hhbmdlIGR1cmluZyB0aGUgaXRlcmF0aW9uLgogICAqLwogIHZvaWQgYWRkQWxsKE1hcDxLLCBWPiBvdGhlcik7CgogIC8qKgogICAqIFJlbW92ZXMgW2tleV0gYW5kIGl0cyBhc3NvY2lhdGVkIHZhbHVlLCBpZiBwcmVzZW50LCBmcm9tIHRoZSBtYXAuCiAgICoKICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYGtleWAgYmVmb3JlIGl0IHdhcyByZW1vdmVkLgogICAqIFJldHVybnMgYG51bGxgIGlmIGBrZXlgIHdhcyBub3QgaW4gdGhlIG1hcC4KICAgKgogICAqIE5vdGUgdGhhdCB2YWx1ZXMgY2FuIGJlIGBudWxsYCBhbmQgYSByZXR1cm5lZCBgbnVsbGAgdmFsdWUgZG9lc24ndAogICAqIGFsd2F5cyBtZWFuIHRoYXQgdGhlIGtleSB3YXMgYWJzZW50LgogICAqLwogIFYgcmVtb3ZlKE9iamVjdCBrZXkpOwoKICAvKioKICAgKiBSZW1vdmVzIGFsbCBwYWlycyBmcm9tIHRoZSBtYXAuCiAgICoKICAgKiBBZnRlciB0aGlzLCB0aGUgbWFwIGlzIGVtcHR5LgogICAqLwogIHZvaWQgY2xlYXIoKTsKCiAgLyoqCiAgICogQXBwbGllcyBbZl0gdG8gZWFjaCBrZXkvdmFsdWUgcGFpciBvZiB0aGUgbWFwLgogICAqCiAgICogQ2FsbGluZyBgZmAgbXVzdCBub3QgYWRkIG9yIHJlbW92ZSBrZXlzIGZyb20gdGhlIG1hcC4KICAgKi8KICB2b2lkIGZvckVhY2godm9pZCBmKEsga2V5LCBWIHZhbHVlKSk7CgogIC8qKgogICAqIFRoZSBrZXlzIG9mIFt0aGlzXS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBpdGVyYWJsZSBoYXMgZWZmaWNpZW50IGBsZW5ndGhgIGFuZCBgY29udGFpbnNgIG9wZXJhdGlvbnMsCiAgICogYmFzZWQgb24gW2xlbmd0aF0gYW5kIFtjb250YWluc0tleV0gb2YgdGhlIG1hcC4KICAgKgogICAqIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgZGVmaW5lZCBieSB0aGUgaW5kaXZpZHVhbCBgTWFwYCBpbXBsZW1lbnRhdGlvbiwKICAgKiBidXQgbXVzdCBiZSBjb25zaXN0ZW50IGJldHdlZW4gY2hhbmdlcyB0byB0aGUgbWFwLgogICAqCiAgICogTW9kaWZ5aW5nIHRoZSBtYXAgd2hpbGUgaXRlcmF0aW5nIHRoZSBrZXlzCiAgICogbWF5IGJyZWFrIHRoZSBpdGVyYXRpb24uCiAgICovCiAgSXRlcmFibGU8Sz4gZ2V0IGtleXM7CgogIC8qKgogICAqIFRoZSB2YWx1ZXMgb2YgW3RoaXNdLgogICAqCiAgICogVGhlIHZhbHVlcyBhcmUgaXRlcmF0ZWQgaW4gdGhlIG9yZGVyIG9mIHRoZWlyIGNvcnJlc3BvbmRpbmcga2V5cy4KICAgKiBUaGlzIG1lYW5zIHRoYXQgaXRlcmF0aW5nIFtrZXlzXSBhbmQgW3ZhbHVlc10gaW4gcGFyYWxsZWwgd2lsbAogICAqIHByb3ZpZGUgbWF0Y2hpbmcgcGFpcnMgb2Yga2V5cyBhbmQgdmFsdWVzLgogICAqCiAgICogVGhlIHJldHVybmVkIGl0ZXJhYmxlIGhhcyBhbiBlZmZpY2llbnQgYGxlbmd0aGAgbWV0aG9kIGJhc2VkIG9uIHRoZQogICAqIFtsZW5ndGhdIG9mIHRoZSBtYXAuIEl0cyBbSXRlcmFibGUuY29udGFpbnNdIG1ldGhvZCBpcyBiYXNlZCBvbgogICAqIGA9PWAgY29tcGFyaXNvbi4KICAgKgogICAqIE1vZGlmeWluZyB0aGUgbWFwIHdoaWxlIGl0ZXJhdGluZyB0aGUKICAgKiB2YWx1ZXMgbWF5IGJyZWFrIHRoZSBpdGVyYXRpb24uCiAgICovCiAgSXRlcmFibGU8Vj4gZ2V0IHZhbHVlczsKCiAgLyoqCiAgICogVGhlIG51bWJlciBvZiBrZXkvdmFsdWUgcGFpcnMgaW4gdGhlIG1hcC4KICAgKi8KICBpbnQgZ2V0IGxlbmd0aDsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIG5vIGtleS92YWx1ZSBwYWlyIGluIHRoZSBtYXAuCiAgICovCiAgYm9vbCBnZXQgaXNFbXB0eTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBrZXkvdmFsdWUgcGFpciBpbiB0aGUgbWFwLgogICAqLwogIGJvb2wgZ2V0IGlzTm90RW1wdHk7Cn0KCi8qKgogKiBBIGtleS92YWx1ZSBwYWlyIHJlcHJlc2VudGluZyBhbiBlbnRyeSBpbiBhIFtNYXBdLgogKi8KY2xhc3MgTWFwRW50cnk8SywgVj4gewogIC8qKiBUaGUga2V5IG9mIHRoZSBlbnRyeS4gKi8KICBmaW5hbCBLIGtleTsKCiAgLyoqIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHRvIFtrZXldIGluIHRoZSBtYXAuICovCiAgZmluYWwgViB2YWx1ZTsKCiAgLyoqIENyZWF0ZXMgYW4gZW50cnkgd2l0aCBba2V5XSBhbmQgW3ZhbHVlXS4gKi8KICBjb25zdCBmYWN0b3J5IE1hcEVudHJ5KEsga2V5LCBWIHZhbHVlKSA9IE1hcEVudHJ5PEssIFY+Ll87CgogIGNvbnN0IE1hcEVudHJ5Ll8odGhpcy5rZXksIHRoaXMudmFsdWUpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiTWFwRW50cnkoJGtleTogJHZhbHVlKSI7Cn0KgZYATk48ARMBBEQdAzA6AzVEDQNAOk0DTE8tOCEDTE9GBBsGTgVMBUE/KQYaAQZNDgVCLwVBQSkGOgEGSQVBQSkGPAEGTwVCLwU3QTUvBT5JBjABBk8FSk0kBS4pBjkBBk8RBStBPykFTjcFTE0jBSU7LSwFJycFSRgFShgFKyMjBU5IBi5OAQZGBStBPykFUTYFLC5KKQVMJAU0BkQpAQYsBU8cBU5IKwVMUTsGQSUBBi0FPikFLjMGPyUBBkkTBUcFSi5AJwVJFAYeBjoFRyUGJAEGOAVDMAYgAQZPBTVPQVATBh0BBjIFSTcGJQEGIAYoAQZIHQY/AQY7BTYtBUoqBjgBBi8FJwVPHwVMOgVNBjYBBhkFSxsGLAEGSQY0AQZHBT1IMQUwODYLIyMjBUIGJgEGNgVLBUtJMAYgAQZHBUQxBUgqBhgBBiUFIwYQAQY0BTsGKAEGGQVNNQVPOAUwHgYYAQYbBUdEMAVJRRYFKyUGGgEGLwYSAQY8BhQBBkYGFwIBBDYEFx8PATMRATI9ASoBMQIBEmRhcnQ6Y29yZS9tYXAuZGFydC5vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL21hcF9wYXRjaC5kYXJ0g+EvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBNYXA8SywgVj4gewogIC8vIEZhY3RvcnkgY29uc3RydWN0aW5nIGEgTWFwIGZyb20gYSBwYXJzZXIgZ2VuZXJhdGVkIE1hcCBsaXRlcmFsLgogIC8vIFtlbGVtZW50c10gY29udGFpbnMgbiBrZXktdmFsdWUgcGFpcnMuCiAgLy8gVGhlIGtleXMgYXJlIGF0IHBvc2l0aW9uIDIqbiBhbmQgYXJlIGFscmVhZHkgdHlwZSBjaGVja2VkIGJ5IHRoZSBwYXJzZXIKICAvLyBpbiBjaGVja2VkIG1vZGUuCiAgLy8gVGhlIHZhbHVlcyBhcmUgYXQgcG9zaXRpb24gMipuKzEgYW5kIGFyZSBub3QgeWV0IHR5cGUgY2hlY2tlZC4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBmYWN0b3J5IE1hcC5fZnJvbUxpdGVyYWwoTGlzdCBlbGVtZW50cykgewogICAgdmFyIG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPEssIFY+KCk7CiAgICB2YXIgbGVuID0gZWxlbWVudHMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW47IGkgKz0gMikgewogICAgICBtYXBbZWxlbWVudHNbaSAtIDFdXSA9IGVsZW1lbnRzW2ldOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CgogIEBwYXRjaAogIGZhY3RvcnkgTWFwLnVubW9kaWZpYWJsZShNYXAgb3RoZXIpIHsKICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlTWFwVmlldzxLLCBWPihuZXcgTWFwPEssIFY+LmZyb20ob3RoZXIpKTsKICB9CgogIEBwYXRjaAogIGZhY3RvcnkgTWFwKCkgPT4gbmV3IExpbmtlZEhhc2hNYXA8SywgVj4oKTsKfQohAE5OPAEeAQcSRSxNFkQkLCkfJyoGEAQBCShFBAEJLgIBHmRhcnQ6Y29yZS1wYXRjaC9tYXBfcGF0Y2guZGFydCpvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9udWxsLmRhcnSCoC8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBUaGUgcmVzZXJ2ZWQgd29yZCBbOm51bGw6XSBkZW5vdGVzIGFuIG9iamVjdCB0aGF0IGlzIHRoZSBzb2xlIGluc3RhbmNlIG9mIAogKiB0aGlzIGNsYXNzLgogKiAKICogSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgZm9yIGEgY2xhc3MgdG8gYXR0ZW1wdCB0byBleHRlbmQgb3IgaW1wbGVtZW50CiAqIE51bGwuCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIE51bGwgewogIGZhY3RvcnkgTnVsbC5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCdjbGFzcyBOdWxsIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQnKTsKICB9CgogIGV4dGVybmFsIGludCBnZXQgaGFzaENvZGU7CgogIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgYCJudWxsImAuICovCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIm51bGwiOwp9ChoATk48ARMBBE4PBEwJBBoNI0EEAR0BJh8CARNkYXJ0OmNvcmUvbnVsbC5kYXJ0L29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvbnVsbF9wYXRjaC5kYXJ0gc4vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwYXRjaApAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIE51bGwgewogIHN0YXRpYyBjb25zdCBfSEFTSF9DT0RFID0gMjAxMTsgLy8gVGhlIHllYXIgRGFydCB3YXMgYW5ub3VuY2VkIGFuZCBhIHByaW1lLgoKICBAcGF0Y2gKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9IQVNIX0NPREU7CgogIGludCBnZXQgX2lkZW50aXR5SGFzaENvZGUgPT4gX0hBU0hfQ09ERTsKfQoSAE5OPAEeAQcaDU4BCSIBKwIBH2RhcnQ6Y29yZS1wYXRjaC9udWxsX3BhdGNoLmRhcnQpb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvbnVtLmRhcnTAAETWLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIEFuIGludGVnZXIgb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgogKgogKiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBmb3IgYW55IHR5cGUgb3RoZXIgdGhhbiBbaW50XSBvciBbZG91YmxlXQogKiB0byBhdHRlbXB0IHRvIGV4dGVuZCBvciBpbXBsZW1lbnQgbnVtLgogKi8KYWJzdHJhY3QgY2xhc3MgbnVtIGltcGxlbWVudHMgQ29tcGFyYWJsZTxudW0+IHsKICAvKioKICAgKiBUZXN0IHdoZXRoZXIgdGhpcyB2YWx1ZSBpcyBudW1lcmljYWxseSBlcXVhbCB0byBgb3RoZXJgLgogICAqCiAgICogSWYgYm90aCBvcGVyYW5kcyBhcmUgZG91YmxlcywgdGhleSBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lCiAgICogcmVwcmVzZW50YXRpb24sIGV4Y2VwdCB0aGF0OgogICAqCiAgICogICAqIHplcm8gYW5kIG1pbnVzIHplcm8gKDAuMCBhbmQgLTAuMCkgYXJlIGNvbnNpZGVyZWQgZXF1YWwuIFRoZXkKICAgKiAgICAgYm90aCBoYXZlIHRoZSBudW1lcmljYWwgdmFsdWUgemVyby4KICAgKiAgICogTmFOIGlzIG5vdCBlcXVhbCB0byBhbnl0aGluZywgaW5jbHVkaW5nIE5hTi4gSWYgZWl0aGVyIG9wZXJhbmQgaXMKICAgKiAgICAgTmFOLCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBmYWxzZS4KICAgKgogICAqIElmIG9uZSBvcGVyYW5kIGlzIGEgZG91YmxlIGFuZCB0aGUgb3RoZXIgaXMgYW4gaW50LCB0aGV5IGFyZSBlcXVhbCBpZgogICAqIHRoZSBkb3VibGUgaGFzIGFuIGludGVnZXIgdmFsdWUgKGZpbml0ZSB3aXRoIG5vIGZyYWN0aW9uYWwgcGFydCkgYW5kCiAgICogYGlkZW50aWNhbChkb3VibGVWYWx1ZS50b0ludCgpLCBpbnRWYWx1ZSlgIGlzIHRydWUuCiAgICoKICAgKiBJZiBib3RoIG9wZXJhbmRzIGFyZSBpbnRlZ2VycywgdGhleSBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIHZhbHVlLgogICAqCiAgICogUmV0dXJucyBmYWxzZSBpZiBgb3RoZXJgIGlzIG5vdCBhIFtudW1dLgogICAqCiAgICogTm90aWNlIHRoYXQgdGhlIGJlaGF2aW9yIGZvciBOYU4gaXMgbm9uLXJlZmxleGl2ZS4gVGhpcyBtZWFucyB0aGF0CiAgICogZXF1YWxpdHkgb2YgZG91YmxlIHZhbHVlcyBpcyBub3QgYSBwcm9wZXIgZXF1YWxpdHkgcmVsYXRpb24sIGFzIGlzCiAgICogb3RoZXJ3aXNlIHJlcXVpcmVkIG9mIGBvcGVyYXRvcj09YC4gVXNpbmcgTmFOIGluLCBlLmcuLCBhIFtIYXNoU2V0XQogICAqIHdpbGwgZmFpbCB0byB3b3JrLiBUaGUgYmVoYXZpb3IgaXMgdGhlIHN0YW5kYXJkIElFRUUtNzU0IGVxdWFsaXR5IG9mCiAgICogZG91Ymxlcy4KICAgKgogICAqIElmIHlvdSBjYW4gYXZvaWQgTmFOIHZhbHVlcywgdGhlIHJlbWFpbmluZyBkb3VibGVzIGRvIGhhdmUgYSBwcm9wZXIKICAgKiBlcXVhbGl0eSByZWxhdGlvbiwgYW5kIGNhbiBiZSB1c2VkIHNhZmVseS4KICAgKgogICAqIFVzZSBbY29tcGFyZVRvXSBmb3IgYSBjb21wYXJpc29uIHRoYXQgZGlzdGluZ3Vpc2hlcyB6ZXJvIGFuZCBtaW51cyB6ZXJvLAogICAqIGFuZCB0aGF0IGNvbnNpZGVycyBOYU4gdmFsdWVzIGFzIGVxdWFsLgogICAqLwogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIGhhc2ggY29kZSBmb3IgYSBudW1lcmljYWwgdmFsdWUuCiAgICoKICAgKiBUaGUgaGFzaCBjb2RlIGlzIGNvbXBhdGlibGUgd2l0aCBlcXVhbGl0eS4gSXQgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZQogICAqIGZvciBhbiBbaW50XSBhbmQgYSBbZG91YmxlXSB3aXRoIHRoZSBzYW1lIG51bWVyaWNhbCB2YWx1ZSwgYW5kIHRoZXJlZm9yZQogICAqIHRoZSBzYW1lIHZhbHVlIGZvciB0aGUgZG91YmxlcyB6ZXJvIGFuZCBtaW51cyB6ZXJvLgogICAqCiAgICogTm8gZ3VhcmFudGVlcyBhcmUgbWFkZSBhYm91dCB0aGUgaGFzaCBjb2RlIG9mIE5hTiB2YWx1ZXMuCiAgICovCiAgaW50IGdldCBoYXNoQ29kZTsKCiAgLyoqCiAgICogQ29tcGFyZXMgdGhpcyB0byBgb3RoZXJgLgogICAqCiAgICogUmV0dXJucyBhIG5lZ2F0aXZlIG51bWJlciBpZiBgdGhpc2AgaXMgbGVzcyB0aGFuIGBvdGhlcmAsIHplcm8gaWYgdGhleSBhcmUKICAgKiBlcXVhbCwgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIGlmIGB0aGlzYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYC4KICAgKgogICAqIFRoZSBvcmRlcmluZyByZXByZXNlbnRlZCBieSB0aGlzIG1ldGhvZCBpcyBhIHRvdGFsIG9yZGVyaW5nIG9mIFtudW1dCiAgICogdmFsdWVzLiBBbGwgZGlzdGluY3QgZG91YmxlcyBhcmUgbm9uLWVxdWFsLCBhcyBhcmUgYWxsIGRpc3RpbmN0IGludGVnZXJzLAogICAqIGJ1dCBpbnRlZ2VycyBhcmUgZXF1YWwgdG8gZG91YmxlcyBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgbnVtZXJpY2FsCiAgICogdmFsdWUuCiAgICoKICAgKiBGb3IgZG91YmxlcywgdGhlIGBjb21wYXJlVG9gIG9wZXJhdGlvbiBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgcGFydGlhbAogICAqIG9yZGVyaW5nIGdpdmVuIGJ5IFtvcGVyYXRvcj09XSwgW29wZXJhdG9yPF0gYW5kIFtvcGVyYXRvcj5dLiBGb3IgZXhhbXBsZSwKICAgKiBJRUVFIGRvdWJsZXMgaW1wb3NlIHRoYXQgYDAuMCA9PSAtMC4wYCBhbmQgYWxsIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBvbgogICAqIE5hTiByZXR1cm4gZmFsc2UuCiAgICoKICAgKiBUaGlzIGZ1bmN0aW9uIGltcG9zZXMgYSBjb21wbGV0ZSBvcmRlcmluZyBmb3IgZG91Ymxlcy4gV2hlbiB1c2luZwogICAqIGBjb21wYXJlVG9gIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBob2xkOgogICAqCiAgICogLSBBbGwgTmFOIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBlcXVhbCwgYW5kIGdyZWF0ZXIgdGhhbiBhbnkgbnVtZXJpYyB2YWx1ZS4KICAgKiAtIC0wLjAgaXMgbGVzcyB0aGFuIDAuMCAoYW5kIHRoZSBpbnRlZ2VyIDApLCBidXQgZ3JlYXRlciB0aGFuIGFueSBub24temVybwogICAqICAgIG5lZ2F0aXZlIHZhbHVlLgogICAqIC0gTmVnYXRpdmUgaW5maW5pdHkgaXMgbGVzcyB0aGFuIGFsbCBvdGhlciB2YWx1ZXMgYW5kIHBvc2l0aXZlIGluZmluaXR5IGlzCiAgICogICBncmVhdGVyIHRoYW4gYWxsIG5vbi1OYU4gdmFsdWVzLgogICAqIC0gQWxsIG90aGVyIHZhbHVlcyBhcmUgY29tcGFyZWQgdXNpbmcgdGhlaXIgbnVtZXJpYyB2YWx1ZS4KICAgKgogICAqIEV4YW1wbGVzOgogICAqIGBgYAogICAqIHByaW50KDEuY29tcGFyZVRvKDIpKTsgLy8gPT4gLTEKICAgKiBwcmludCgyLmNvbXBhcmVUbygxKSk7IC8vID0+IDEKICAgKiBwcmludCgxLmNvbXBhcmVUbygxKSk7IC8vID0+IDAKICAgKgogICAqIC8vIFRoZSBmb2xsb3dpbmcgY29tcGFyaXNvbnMgeWllbGQgZGlmZmVyZW50IHJlc3VsdHMgdGhhbiB0aGUKICAgKiAvLyBjb3JyZXNwb25kaW5nIGNvbXBhcmlzb24gb3BlcmF0b3JzLgogICAqIHByaW50KCgtMC4wKS5jb21wYXJlVG8oMC4wKSk7ICAvLyA9PiAtMQogICAqIHByaW50KGRvdWJsZS5uYW4uY29tcGFyZVRvKGRvdWJsZS5uYW4pKTsgIC8vID0+IDAKICAgKiBwcmludChkb3VibGUuaW5maW5pdHkuY29tcGFyZVRvKGRvdWJsZS5uYW4pKTsgLy8gPT4gLTEKICAgKgogICAqIC8vIC0wLjAsIGFuZCBOYU4gY29tcGFyaXNvbiBvcGVyYXRvcnMgaGF2ZSBydWxlcyBpbXBvc2VkIGJ5IHRoZSBJRUVFCiAgICogLy8gc3RhbmRhcmQuCiAgICogcHJpbnQoLTAuMCA9PSAwLjApOyAvLyA9PiB0cnVlCiAgICogcHJpbnQoZG91YmxlLm5hbiA9PSBkb3VibGUubmFuKTsgIC8vID0+IGZhbHNlCiAgICogcHJpbnQoZG91YmxlLmluZmluaXR5IDwgZG91YmxlLm5hbik7ICAvLyA9PiBmYWxzZQogICAqIHByaW50KGRvdWJsZS5uYW4gPCBkb3VibGUuaW5maW5pdHkpOyAgLy8gPT4gZmFsc2UKICAgKiBwcmludChkb3VibGUubmFuID09IGRvdWJsZS5pbmZpbml0eSk7ICAvLyA9PiBmYWxzZQogICAqIGBgYAogICAqLwogIGludCBjb21wYXJlVG8obnVtIG90aGVyKTsKCiAgLyoqIEFkZGl0aW9uIG9wZXJhdG9yLiAqLwogIG51bSBvcGVyYXRvciArKG51bSBvdGhlcik7CgogIC8qKiBTdWJ0cmFjdGlvbiBvcGVyYXRvci4gKi8KICBudW0gb3BlcmF0b3IgLShudW0gb3RoZXIpOwoKICAvKiogTXVsdGlwbGljYXRpb24gb3BlcmF0b3IuICovCiAgbnVtIG9wZXJhdG9yICoobnVtIG90aGVyKTsKCiAgLyoqCiAgICogRXVjbGlkZWFuIG1vZHVsbyBvcGVyYXRvci4KICAgKgogICAqIFJldHVybnMgdGhlIHJlbWFpbmRlciBvZiB0aGUgRXVjbGlkZWFuIGRpdmlzaW9uLiBUaGUgRXVjbGlkZWFuIGRpdmlzaW9uIG9mCiAgICogdHdvIGludGVnZXJzIGBhYCBhbmQgYGJgIHlpZWxkcyB0d28gaW50ZWdlcnMgYHFgIGFuZCBgcmAgc3VjaCB0aGF0CiAgICogYGEgPT0gYiAqIHEgKyByYCBhbmQgYDAgPD0gciA8IGIuYWJzKClgLgogICAqCiAgICogVGhlIEV1Y2xpZGVhbiBkaXZpc2lvbiBpcyBvbmx5IGRlZmluZWQgZm9yIGludGVnZXJzLCBidXQgY2FuIGJlIGVhc2lseQogICAqIGV4dGVuZGVkIHRvIHdvcmsgd2l0aCBkb3VibGVzLiBJbiB0aGF0IGNhc2UgYHJgIG1heSBoYXZlIGEgbm9uLWludGVnZXIKICAgKiB2YWx1ZSwgYnV0IGl0IHN0aWxsIHZlcmlmaWVzIGAwIDw9IHIgPCB8YnxgLgogICAqCiAgICogVGhlIHNpZ24gb2YgdGhlIHJldHVybmVkIHZhbHVlIGByYCBpcyBhbHdheXMgcG9zaXRpdmUuCiAgICoKICAgKiBTZWUgW3JlbWFpbmRlcl0gZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHRydW5jYXRpbmcgZGl2aXNpb24uCiAgICovCiAgbnVtIG9wZXJhdG9yICUobnVtIG90aGVyKTsKCiAgLyoqIERpdmlzaW9uIG9wZXJhdG9yLiAqLwogIGRvdWJsZSBvcGVyYXRvciAvKG51bSBvdGhlcik7CgogIC8qKgogICAqIFRydW5jYXRpbmcgZGl2aXNpb24gb3BlcmF0b3IuCiAgICoKICAgKiBJZiBlaXRoZXIgb3BlcmFuZCBpcyBhIFtkb3VibGVdIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgdHJ1bmNhdGluZyBkaXZpc2lvbgogICAqIGBhIH4vIGJgIGlzIGVxdWl2YWxlbnQgdG8gYChhIC8gYikudHJ1bmNhdGUoKS50b0ludCgpYC4KICAgKgogICAqIElmIGJvdGggb3BlcmFuZHMgYXJlIFtpbnRdcyB0aGVuIGBhIH4vIGJgIHBlcmZvcm1zIHRoZSB0cnVuY2F0aW5nCiAgICogaW50ZWdlciBkaXZpc2lvbi4KICAgKi8KICBpbnQgb3BlcmF0b3Igfi8obnVtIG90aGVyKTsKCiAgLyoqIE5lZ2F0ZSBvcGVyYXRvci4gKi8KICBudW0gb3BlcmF0b3IgLSgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgdGhlIHRydW5jYXRpbmcgZGl2aXNpb24gb2YgYHRoaXNgIGJ5IFtvdGhlcl0uCiAgICoKICAgKiBUaGUgcmVzdWx0IGByYCBvZiB0aGlzIG9wZXJhdGlvbiBzYXRpc2ZpZXM6CiAgICogYHRoaXMgPT0gKHRoaXMgfi8gb3RoZXIpICogb3RoZXIgKyByYC4KICAgKiBBcyBhIGNvbnNlcXVlbmNlIHRoZSByZW1haW5kZXIgYHJgIGhhcyB0aGUgc2FtZSBzaWduIGFzIHRoZSBkaXZpZGVyIGB0aGlzYC4KICAgKi8KICBudW0gcmVtYWluZGVyKG51bSBvdGhlcik7CgogIC8qKiBSZWxhdGlvbmFsIGxlc3MgdGhhbiBvcGVyYXRvci4gKi8KICBib29sIG9wZXJhdG9yIDwobnVtIG90aGVyKTsKCiAgLyoqIFJlbGF0aW9uYWwgbGVzcyB0aGFuIG9yIGVxdWFsIG9wZXJhdG9yLiAqLwogIGJvb2wgb3BlcmF0b3IgPD0obnVtIG90aGVyKTsKCiAgLyoqIFJlbGF0aW9uYWwgZ3JlYXRlciB0aGFuIG9wZXJhdG9yLiAqLwogIGJvb2wgb3BlcmF0b3IgPihudW0gb3RoZXIpOwoKICAvKiogUmVsYXRpb25hbCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IuICovCiAgYm9vbCBvcGVyYXRvciA+PShudW0gb3RoZXIpOwoKICAvKiogVHJ1ZSBpZiB0aGUgbnVtYmVyIGlzIHRoZSBkb3VibGUgTm90LWEtTnVtYmVyIHZhbHVlOyBvdGhlcndpc2UsIGZhbHNlLiAqLwogIGJvb2wgZ2V0IGlzTmFOOwoKICAvKioKICAgKiBUcnVlIGlmIHRoZSBudW1iZXIgaXMgbmVnYXRpdmU7IG90aGVyd2lzZSwgZmFsc2UuCiAgICoKICAgKiBOZWdhdGl2ZSBudW1iZXJzIGFyZSB0aG9zZSBsZXNzIHRoYW4gemVybywgYW5kIHRoZSBkb3VibGUgYC0wLjBgLgogICAqLwogIGJvb2wgZ2V0IGlzTmVnYXRpdmU7CgogIC8qKgogICAqIFRydWUgaWYgdGhlIG51bWJlciBpcyBwb3NpdGl2ZSBpbmZpbml0eSBvciBuZWdhdGl2ZSBpbmZpbml0eTsgb3RoZXJ3aXNlLAogICAqIGZhbHNlLgogICAqLwogIGJvb2wgZ2V0IGlzSW5maW5pdGU7CgogIC8qKgogICAqIFRydWUgaWYgdGhlIG51bWJlciBpcyBmaW5pdGU7IG90aGVyd2lzZSwgZmFsc2UuCiAgICoKICAgKiBUaGUgb25seSBub24tZmluaXRlIG51bWJlcnMgYXJlIE5hTiwgcG9zaXRpdmUgaW5maW5pdHksIGFuZAogICAqIG5lZ2F0aXZlIGluZmluaXR5LgogICAqLwogIGJvb2wgZ2V0IGlzRmluaXRlOwoKICAvKiogUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBbbnVtXS4gKi8KICBudW0gYWJzKCk7CgogIC8qKgogICAqIFJldHVybnMgbWludXMgb25lLCB6ZXJvIG9yIHBsdXMgb25lIGRlcGVuZGluZyBvbiB0aGUgc2lnbiBhbmQKICAgKiBudW1lcmljYWwgdmFsdWUgb2YgdGhlIG51bWJlci4KICAgKgogICAqIFJldHVybnMgbWludXMgb25lIGlmIHRoZSBudW1iZXIgaXMgbGVzcyB0aGFuIHplcm8sCiAgICogcGx1cyBvbmUgaWYgdGhlIG51bWJlciBpcyBncmVhdGVyIHRoYW4gemVybywKICAgKiBhbmQgemVybyBpZiB0aGUgbnVtYmVyIGlzIGVxdWFsIHRvIHplcm8uCiAgICoKICAgKiBSZXR1cm5zIE5hTiBpZiB0aGUgbnVtYmVyIGlzIHRoZSBkb3VibGUgTmFOIHZhbHVlLgogICAqCiAgICogUmV0dXJucyBhIG51bWJlciBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoaXMgbnVtYmVyLgogICAqIEZvciBkb3VibGVzLCBgLTAuMC5zaWduID09IC0wLjBgLgoKICAgKiBUaGUgcmVzdWx0IHNhdGlzZmllczoKICAgKgogICAqICAgICBuID09IG4uc2lnbiAqIG4uYWJzKCkKICAgKgogICAqIGZvciBhbGwgbnVtYmVycyBgbmAgKGV4Y2VwdCBOYU4sIGJlY2F1c2UgTmFOIGlzbid0IGA9PWAgdG8gaXRzZWxmKS4KICAgKi8KICBudW0gZ2V0IHNpZ247CgogIC8qKgogICAqIFJldHVybnMgdGhlIGludGVnZXIgY2xvc2VzdCB0byBgdGhpc2AuCiAgICoKICAgKiBSb3VuZHMgYXdheSBmcm9tIHplcm8gd2hlbiB0aGVyZSBpcyBubyBjbG9zZXN0IGludGVnZXI6CiAgICogIGAoMy41KS5yb3VuZCgpID09IDRgIGFuZCBgKC0zLjUpLnJvdW5kKCkgPT0gLTRgLgogICAqCiAgICogSWYgYHRoaXNgIGlzIG5vdCBmaW5pdGUgKGBOYU5gIG9yIGluZmluaXR5KSwgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBpbnQgcm91bmQoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZ3JlYXRlc3QgaW50ZWdlciBubyBncmVhdGVyIHRoYW4gYHRoaXNgLgogICAqCiAgICogSWYgYHRoaXNgIGlzIG5vdCBmaW5pdGUgKGBOYU5gIG9yIGluZmluaXR5KSwgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBpbnQgZmxvb3IoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVhc3QgaW50ZWdlciBubyBzbWFsbGVyIHRoYW4gYHRoaXNgLgogICAqCiAgICogSWYgYHRoaXNgIGlzIG5vdCBmaW5pdGUgKGBOYU5gIG9yIGluZmluaXR5KSwgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBpbnQgY2VpbCgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIG9idGFpbmVkIGJ5IGRpc2NhcmRpbmcgYW55IGZyYWN0aW9uYWwKICAgKiBkaWdpdHMgZnJvbSBgdGhpc2AuCiAgICoKICAgKiBJZiBgdGhpc2AgaXMgbm90IGZpbml0ZSAoYE5hTmAgb3IgaW5maW5pdHkpLCB0aHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdLgogICAqLwogIGludCB0cnVuY2F0ZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBkb3VibGUgaW50ZWdlciB2YWx1ZSBjbG9zZXN0IHRvIGB0aGlzYC4KICAgKgogICAqIFJvdW5kcyBhd2F5IGZyb20gemVybyB3aGVuIHRoZXJlIGlzIG5vIGNsb3Nlc3QgaW50ZWdlcjoKICAgKiAgYCgzLjUpLnJvdW5kVG9Eb3VibGUoKSA9PSA0YCBhbmQgYCgtMy41KS5yb3VuZFRvRG91YmxlKCkgPT0gLTRgLgogICAqCiAgICogSWYgdGhpcyBpcyBhbHJlYWR5IGFuIGludGVnZXIgdmFsdWVkIGRvdWJsZSwgaW5jbHVkaW5nIGAtMC4wYCwgb3IgaXQgaXMgYQogICAqIG5vbi1maW5pdGUgZG91YmxlIHZhbHVlLCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KICAgKgogICAqIEZvciB0aGUgcHVycG9zZSBvZiByb3VuZGluZywgYC0wLjBgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYmVsb3cgYDAuMGAsCiAgICogYW5kIGAtMC4wYCBpcyB0aGVyZWZvcmUgY29uc2lkZXJlZCBjbG9zZXIgdG8gbmVnYXRpdmUgbnVtYmVycyB0aGFuIGAwLjBgLgogICAqIFRoaXMgbWVhbnMgdGhhdCBmb3IgYSB2YWx1ZSwgYGRgIGluIHRoZSByYW5nZSBgLTAuNSA8IGQgPCAwLjBgLAogICAqIHRoZSByZXN1bHQgaXMgYC0wLjBgLgogICAqCiAgICogVGhlIHJlc3VsdCBpcyBhbHdheXMgYSBkb3VibGUuCiAgICogSWYgdGhpcyBpcyBhIG51bWVyaWNhbGx5IGxhcmdlIGludGVnZXIsIHRoZSByZXN1bHQgbWF5IGJlIGFuIGluZmluaXRlCiAgICogZG91YmxlLgogICAqLwogIGRvdWJsZSByb3VuZFRvRG91YmxlKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGdyZWF0ZXN0IGRvdWJsZSBpbnRlZ2VyIHZhbHVlIG5vIGdyZWF0ZXIgdGhhbiBgdGhpc2AuCiAgICoKICAgKiBJZiB0aGlzIGlzIGFscmVhZHkgYW4gaW50ZWdlciB2YWx1ZWQgZG91YmxlLCBpbmNsdWRpbmcgYC0wLjBgLCBvciBpdCBpcyBhCiAgICogbm9uLWZpbml0ZSBkb3VibGUgdmFsdWUsIHRoZSB2YWx1ZSBpcyByZXR1cm5lZCB1bm1vZGlmaWVkLgogICAqCiAgICogRm9yIHRoZSBwdXJwb3NlIG9mIHJvdW5kaW5nLCBgLTAuMGAgaXMgY29uc2lkZXJlZCB0byBiZSBiZWxvdyBgMC4wYC4KICAgKiBBIG51bWJlciBgZGAgaW4gdGhlIHJhbmdlIGAwLjAgPCBkIDwgMS4wYCB3aWxsIHJldHVybiBgMC4wYC4KICAgKgogICAqIFRoZSByZXN1bHQgaXMgYWx3YXlzIGEgZG91YmxlLgogICAqIElmIHRoaXMgaXMgYSBudW1lcmljYWxseSBsYXJnZSBpbnRlZ2VyLCB0aGUgcmVzdWx0IG1heSBiZSBhbiBpbmZpbml0ZQogICAqIGRvdWJsZS4KICAgKi8KICBkb3VibGUgZmxvb3JUb0RvdWJsZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsZWFzdCBkb3VibGUgaW50ZWdlciB2YWx1ZSBubyBzbWFsbGVyIHRoYW4gYHRoaXNgLgogICAqCiAgICogSWYgdGhpcyBpcyBhbHJlYWR5IGFuIGludGVnZXIgdmFsdWVkIGRvdWJsZSwgaW5jbHVkaW5nIGAtMC4wYCwgb3IgaXQgaXMgYQogICAqIG5vbi1maW5pdGUgZG91YmxlIHZhbHVlLCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KICAgKgogICAqIEZvciB0aGUgcHVycG9zZSBvZiByb3VuZGluZywgYC0wLjBgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYmVsb3cgYDAuMGAuCiAgICogQSBudW1iZXIgYGRgIGluIHRoZSByYW5nZSBgLTEuMCA8IGQgPCAwLjBgIHdpbGwgcmV0dXJuIGAtMC4wYC4KICAgKgogICAqIFRoZSByZXN1bHQgaXMgYWx3YXlzIGEgZG91YmxlLgogICAqIElmIHRoaXMgaXMgYSBudW1lcmljYWxseSBsYXJnZSBpbnRlZ2VyLCB0aGUgcmVzdWx0IG1heSBiZSBhbiBpbmZpbml0ZQogICAqIGRvdWJsZS4KICAgKi8KICBkb3VibGUgY2VpbFRvRG91YmxlKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGRvdWJsZSBpbnRlZ2VyIHZhbHVlIG9idGFpbmVkIGJ5IGRpc2NhcmRpbmcgYW55IGZyYWN0aW9uYWwKICAgKiBkaWdpdHMgZnJvbSB0aGUgZG91YmxlIHZhbHVlIG9mIGB0aGlzYC4KICAgKgogICAqIElmIHRoaXMgaXMgYWxyZWFkeSBhbiBpbnRlZ2VyIHZhbHVlZCBkb3VibGUsIGluY2x1ZGluZyBgLTAuMGAsIG9yIGl0IGlzIGEKICAgKiBub24tZmluaXRlIGRvdWJsZSB2YWx1ZSwgdGhlIHZhbHVlIGlzIHJldHVybmVkIHVubW9kaWZpZWQuCiAgICoKICAgKiBGb3IgdGhlIHB1cnBvc2Ugb2Ygcm91bmRpbmcsIGAtMC4wYCBpcyBjb25zaWRlcmVkIHRvIGJlIGJlbG93IGAwLjBgLgogICAqIEEgbnVtYmVyIGBkYCBpbiB0aGUgcmFuZ2UgYC0xLjAgPCBkIDwgMC4wYCB3aWxsIHJldHVybiBgLTAuMGAsIGFuZAogICAqIGluIHRoZSByYW5nZSBgMC4wIDwgZCA8IDEuMGAgaXQgd2lsbCByZXR1cm4gMC4wLgogICAqCiAgICogVGhlIHJlc3VsdCBpcyBhbHdheXMgYSBkb3VibGUuCiAgICogSWYgdGhpcyBpcyBhIG51bWVyaWNhbGx5IGxhcmdlIGludGVnZXIsIHRoZSByZXN1bHQgbWF5IGJlIGFuIGluZmluaXRlCiAgICogZG91YmxlLgogICAqLwogIGRvdWJsZSB0cnVuY2F0ZVRvRG91YmxlKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhpcyBbbnVtXSBjbGFtcGVkIHRvIGJlIGluIHRoZSByYW5nZSBbbG93ZXJMaW1pdF0tW3VwcGVyTGltaXRdLgogICAqCiAgICogVGhlIGNvbXBhcmlzb24gaXMgZG9uZSB1c2luZyBbY29tcGFyZVRvXSBhbmQgdGhlcmVmb3JlIHRha2VzIGAtMC4wYCBpbnRvCiAgICogYWNjb3VudC4gVGhpcyBhbHNvIGltcGxpZXMgdGhhdCBbZG91YmxlLm5hbl0gaXMgdHJlYXRlZCBhcyB0aGUgbWF4aW1hbAogICAqIGRvdWJsZSB2YWx1ZS4KICAgKgogICAqIFRoZSBhcmd1bWVudHMgW2xvd2VyTGltaXRdIGFuZCBbdXBwZXJMaW1pdF0gbXVzdCBmb3JtIGEgdmFsaWQgcmFuZ2Ugd2hlcmUKICAgKiBgbG93ZXJMaW1pdC5jb21wYXJlVG8odXBwZXJMaW1pdCkgPD0gMGAuCiAgICovCiAgbnVtIGNsYW1wKG51bSBsb3dlckxpbWl0LCBudW0gdXBwZXJMaW1pdCk7CgogIC8qKiBUcnVuY2F0ZXMgdGhpcyBbbnVtXSB0byBhbiBpbnRlZ2VyIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYW4gW2ludF0uICovCiAgaW50IHRvSW50KCk7CgogIC8qKgogICAqIFJldHVybiB0aGlzIFtudW1dIGFzIGEgW2RvdWJsZV0uCiAgICoKICAgKiBJZiB0aGUgbnVtYmVyIGlzIG5vdCByZXByZXNlbnRhYmxlIGFzIGEgW2RvdWJsZV0sIGFuCiAgICogYXBwcm94aW1hdGlvbiBpcyByZXR1cm5lZC4gRm9yIG51bWVyaWNhbGx5IGxhcmdlIGludGVnZXJzLCB0aGUKICAgKiBhcHByb3hpbWF0aW9uIG1heSBiZSBpbmZpbml0ZS4KICAgKi8KICBkb3VibGUgdG9Eb3VibGUoKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIGRlY2ltYWwtcG9pbnQgc3RyaW5nLXJlcHJlc2VudGF0aW9uIG9mIGB0aGlzYC4KICAgKgogICAqIENvbnZlcnRzIGB0aGlzYCB0byBhIFtkb3VibGVdIGJlZm9yZSBjb21wdXRpbmcgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KICAgKgogICAqIElmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBgdGhpc2AgaXMgZ3JlYXRlciBvciBlcXVhbCB0byBgMTBeMjFgIHRoZW4gdGhpcwogICAqIG1ldGhvZHMgcmV0dXJucyBhbiBleHBvbmVudGlhbCByZXByZXNlbnRhdGlvbiBjb21wdXRlZCBieQogICAqIGB0aGlzLnRvU3RyaW5nQXNFeHBvbmVudGlhbCgpYC4gT3RoZXJ3aXNlIHRoZSByZXN1bHQKICAgKiBpcyB0aGUgY2xvc2VzdCBzdHJpbmcgcmVwcmVzZW50YXRpb24gd2l0aCBleGFjdGx5IFtmcmFjdGlvbkRpZ2l0c10gZGlnaXRzCiAgICogYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuIElmIFtmcmFjdGlvbkRpZ2l0c10gZXF1YWxzIDAgdGhlbiB0aGUgZGVjaW1hbAogICAqIHBvaW50IGlzIG9taXR0ZWQuCiAgICoKICAgKiBUaGUgcGFyYW1ldGVyIFtmcmFjdGlvbkRpZ2l0c10gbXVzdCBiZSBhbiBpbnRlZ2VyIHNhdGlzZnlpbmc6CiAgICogYDAgPD0gZnJhY3Rpb25EaWdpdHMgPD0gMjBgLgogICAqCiAgICogRXhhbXBsZXM6CiAgICoKICAgKiAgICAgMS50b1N0cmluZ0FzRml4ZWQoMyk7ICAvLyAxLjAwMAogICAqICAgICAoNDMyMS4xMjM0NTY3OCkudG9TdHJpbmdBc0ZpeGVkKDMpOyAgLy8gNDMyMS4xMjMKICAgKiAgICAgKDQzMjEuMTIzNDU2NzgpLnRvU3RyaW5nQXNGaXhlZCg1KTsgIC8vIDQzMjEuMTIzNDYKICAgKiAgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxLnRvU3RyaW5nQXNGaXhlZCgzKTsgIC8vIDEyMzQ1Njc4OTAxMjM0NTY4Mzk2OC4wMDAKICAgKiAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMC50b1N0cmluZ0FzRml4ZWQoMyk7IC8vIDFlKzIxCiAgICogICAgIDUuMjUudG9TdHJpbmdBc0ZpeGVkKDApOyAvLyA1CiAgICovCiAgU3RyaW5nIHRvU3RyaW5nQXNGaXhlZChpbnQgZnJhY3Rpb25EaWdpdHMpOwoKICAvKioKICAgKiBSZXR1cm5zIGFuIGV4cG9uZW50aWFsIHN0cmluZy1yZXByZXNlbnRhdGlvbiBvZiBgdGhpc2AuCiAgICoKICAgKiBDb252ZXJ0cyBgdGhpc2AgdG8gYSBbZG91YmxlXSBiZWZvcmUgY29tcHV0aW5nIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCiAgICoKICAgKiBJZiBbZnJhY3Rpb25EaWdpdHNdIGlzIGdpdmVuIHRoZW4gaXQgbXVzdCBiZSBhbiBpbnRlZ2VyIHNhdGlzZnlpbmc6CiAgICogYDAgPD0gZnJhY3Rpb25EaWdpdHMgPD0gMjBgLiBJbiB0aGlzIGNhc2UgdGhlIHN0cmluZyBjb250YWlucyBleGFjdGx5CiAgICogW2ZyYWN0aW9uRGlnaXRzXSBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4gT3RoZXJ3aXNlLCB3aXRob3V0IHRoZSBwYXJhbWV0ZXIsCiAgICogdGhlIHJldHVybmVkIHN0cmluZyB1c2VzIHRoZSBzaG9ydGVzdCBudW1iZXIgb2YgZGlnaXRzIHRoYXQgYWNjdXJhdGVseQogICAqIHJlcHJlc2VudCBbdGhpc10uCiAgICoKICAgKiBJZiBbZnJhY3Rpb25EaWdpdHNdIGVxdWFscyAwIHRoZW4gdGhlIGRlY2ltYWwgcG9pbnQgaXMgb21pdHRlZC4KICAgKiBFeGFtcGxlczoKICAgKgogICAqICAgICAxLnRvU3RyaW5nQXNFeHBvbmVudGlhbCgpOyAgICAgICAvLyAxZSswCiAgICogICAgIDEudG9TdHJpbmdBc0V4cG9uZW50aWFsKDMpOyAgICAgIC8vIDEuMDAwZSswCiAgICogICAgIDEyMzQ1Ni50b1N0cmluZ0FzRXhwb25lbnRpYWwoKTsgIC8vIDEuMjM0NTZlKzUKICAgKiAgICAgMTIzNDU2LnRvU3RyaW5nQXNFeHBvbmVudGlhbCgzKTsgLy8gMS4yMzVlKzUKICAgKiAgICAgMTIzLnRvU3RyaW5nQXNFeHBvbmVudGlhbCgwKTsgICAgLy8gMWUrMgogICAqLwogIFN0cmluZyB0b1N0cmluZ0FzRXhwb25lbnRpYWwoW2ludCBmcmFjdGlvbkRpZ2l0c10pOwoKICAvKioKICAgKiBDb252ZXJ0cyBgdGhpc2AgdG8gYSBkb3VibGUgYW5kIHJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gd2l0aAogICAqIGV4YWN0bHkgW3ByZWNpc2lvbl0gc2lnbmlmaWNhbnQgZGlnaXRzLgogICAqCiAgICogVGhlIHBhcmFtZXRlciBbcHJlY2lzaW9uXSBtdXN0IGJlIGFuIGludGVnZXIgc2F0aXNmeWluZzoKICAgKiBgMSA8PSBwcmVjaXNpb24gPD0gMjFgLgogICAqCiAgICogRXhhbXBsZXM6CiAgICoKICAgKiAgICAgMS50b1N0cmluZ0FzUHJlY2lzaW9uKDIpOyAgICAgICAvLyAxLjAKICAgKiAgICAgMWUxNS50b1N0cmluZ0FzUHJlY2lzaW9uKDMpOyAgICAvLyAxLjAwZSsxNQogICAqICAgICAxMjM0NTY3LnRvU3RyaW5nQXNQcmVjaXNpb24oMyk7IC8vIDEuMjNlKzYKICAgKiAgICAgMTIzNDU2Ny50b1N0cmluZ0FzUHJlY2lzaW9uKDkpOyAvLyAxMjM0NTY3LjAwCiAgICogICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwLnRvU3RyaW5nQXNQcmVjaXNpb24oMjApOyAvLyAxMjM0NTY3ODkwMTIzNDU2NzE2OAogICAqICAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MC50b1N0cmluZ0FzUHJlY2lzaW9uKDE0KTsgLy8gMS4yMzQ1Njc4OTAxMjM1ZSsxOQogICAqICAgICAwLjAwMDAwMDEyMzQ1LnRvU3RyaW5nQXNQcmVjaXNpb24oMTUpOyAvLyAxLjIzNDUwMDAwMDAwMDAwZS03CiAgICogICAgIDAuMDAwMDAxMjM0NS50b1N0cmluZ0FzUHJlY2lzaW9uKDE1KTsgIC8vIDAuMDAwMDAxMjM0NTAwMDAwMDAwMDAKICAgKi8KICBTdHJpbmcgdG9TdHJpbmdBc1ByZWNpc2lvbihpbnQgcHJlY2lzaW9uKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc2hvcnRlc3Qgc3RyaW5nIHRoYXQgY29ycmVjdGx5IHJlcHJlc2VudCB0aGUgaW5wdXQgbnVtYmVyLgogICAqCiAgICogQWxsIFtkb3VibGVdcyBpbiB0aGUgcmFuZ2UgYDEwXi02YCAoaW5jbHVzaXZlKSB0byBgMTBeMjFgIChleGNsdXNpdmUpCiAgICogYXJlIGNvbnZlcnRlZCB0byB0aGVpciBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIHdpdGggYXQgbGVhc3Qgb25lIGRpZ2l0CiAgICogYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuIEZvciBhbGwgb3RoZXIgZG91YmxlcywKICAgKiBleGNlcHQgZm9yIHNwZWNpYWwgdmFsdWVzIGxpa2UgYE5hTmAgb3IgYEluZmluaXR5YCwgdGhpcyBtZXRob2QgcmV0dXJucyBhbgogICAqIGV4cG9uZW50aWFsIHJlcHJlc2VudGF0aW9uIChzZWUgW3RvU3RyaW5nQXNFeHBvbmVudGlhbF0pLgogICAqCiAgICogUmV0dXJucyBgIk5hTiJgIGZvciBbZG91YmxlLm5hbl0sIGAiSW5maW5pdHkiYCBmb3IgW2RvdWJsZS5pbmZpbml0eV0sIGFuZAogICAqIGAiLUluZmluaXR5ImAgZm9yIFtkb3VibGUubmVnYXRpdmVJbmZpbml0eV0uCiAgICoKICAgKiBBbiBbaW50XSBpcyBjb252ZXJ0ZWQgdG8gYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIHdpdGggbm8gZGVjaW1hbCBwb2ludC4KICAgKgogICAqIEV4YW1wbGVzOgogICAqCiAgICogICAgICgwLjAwMDAwMSkudG9TdHJpbmcoKTsgIC8vICIwLjAwMDAwMSIKICAgKiAgICAgKDAuMDAwMDAwMSkudG9TdHJpbmcoKTsgLy8gIjFlLTciCiAgICogICAgICgxMTExMTExMTExMTExMTExMTExMTEuMCkudG9TdHJpbmcoKTsgIC8vICIxMTExMTExMTExMTExMTExMTAwMDAuMCIKICAgKiAgICAgKDEwMDAwMDAwMDAwMDAwMDAwMDAwMC4wKS50b1N0cmluZygpOyAgLy8gIjEwMDAwMDAwMDAwMDAwMDAwMDAwMC4wIgogICAqICAgICAoMTAwMDAwMDAwMDAwMDAwMDAwMDAwMC4wKS50b1N0cmluZygpOyAvLyAiMWUrMjEiCiAgICogICAgICgxMTExMTExMTExMTExMTExMTExMTExLjApLnRvU3RyaW5nKCk7IC8vICIxLjExMTExMTExMTExMTExMTFlKzIxIgogICAqICAgICAxLnRvU3RyaW5nKCk7IC8vICIxIgogICAqICAgICAxMTExMTExMTExMTExMTExMTExMTEudG9TdHJpbmcoKTsgIC8vICIxMTExMTExMTExMTExMTExMTAwMDAiCiAgICogICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMC50b1N0cmluZygpOyAgLy8gIjEwMDAwMDAwMDAwMDAwMDAwMDAwMCIKICAgKiAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMC50b1N0cmluZygpOyAvLyAiMTAwMDAwMDAwMDAwMDAwMDAwMDAwMCIKICAgKiAgICAgMTExMTExMTExMTExMTExMTExMTExMS50b1N0cmluZygpOyAvLyAiMTExMTExMTExMTExMTExMTExMTExMSIKICAgKiAgICAgMS4yMzRlNS50b1N0cmluZygpOyAgIC8vIDEyMzQwMAogICAqICAgICAxMjM0LjVlNi50b1N0cmluZygpOyAgLy8gMTIzNDUwMDAwMAogICAqICAgICAxMi4zNDVlNjcudG9TdHJpbmcoKTsgLy8gMS4yMzQ1ZSs2OAogICAqCiAgICogTm90ZTogdGhlIGNvbnZlcnNpb24gbWF5IHJvdW5kIHRoZSBvdXRwdXQgaWYgdGhlIHJldHVybmVkIHN0cmluZwogICAqIGlzIGFjY3VyYXRlIGVub3VnaCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgaW5wdXQtbnVtYmVyLgogICAqIEZvciBleGFtcGxlIHRoZSBtb3N0IHByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIFtkb3VibGVdIGA5ZTU5YCBlcXVhbHMKICAgKiBgIjg5OTk5OTk5OTk5OTk5OTkxODc2NzIyOTQ0OTcxNzYxOTk1MzgxMDEzMTI3MzY3NDY5MDY1NjIwNjg0OCJgLCBidXQKICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzaG9ydGVyIChidXQgc3RpbGwgdW5pcXVlbHkgaWRlbnRpZnlpbmcpIGAiOWU1OSJgLgogICAqCiAgICovCiAgU3RyaW5nIHRvU3RyaW5nKCk7CgogIC8qKgogICAqIFBhcnNlcyBhIHN0cmluZyBjb250YWluaW5nIGEgbnVtYmVyIGxpdGVyYWwgaW50byBhIG51bWJlci4KICAgKgogICAqIFRoZSBtZXRob2QgZmlyc3QgdHJpZXMgdG8gcmVhZCB0aGUgW2lucHV0XSBhcyBpbnRlZ2VyIChzaW1pbGFyIHRvCiAgICogW2ludC5wYXJzZV0gd2l0aG91dCBhIHJhZGl4KS4KICAgKiBJZiB0aGF0IGZhaWxzLCBpdCB0cmllcyB0byBwYXJzZSB0aGUgW2lucHV0XSBhcyBhIGRvdWJsZSAoc2ltaWxhciB0bwogICAqIFtkb3VibGUucGFyc2VdKS4KICAgKiBJZiB0aGF0IGZhaWxzLCB0b28sIGl0IGludm9rZXMgW29uRXJyb3JdIHdpdGggW2lucHV0XSwgYW5kIHRoZSByZXN1bHQKICAgKiBvZiB0aGF0IGludm9jYXRpb24gYmVjb21lcyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYHBhcnNlYC4KICAgKgogICAqIElmIG5vIFtvbkVycm9yXSBpcyBzdXBwbGllZCwgaXQgZGVmYXVsdHMgdG8gYSBmdW5jdGlvbiB0aGF0IHRocm93cyBhCiAgICogW0Zvcm1hdEV4Y2VwdGlvbl0uCiAgICoKICAgKiBGb3IgYW55IG51bWJlciBgbmAsIHRoaXMgZnVuY3Rpb24gc2F0aXNmaWVzCiAgICogYGlkZW50aWNhbChuLCBudW0ucGFyc2Uobi50b1N0cmluZygpKSlgIChleGNlcHQgd2hlbiBgbmAgaXMgYSBOYU4gYGRvdWJsZWAKICAgKiB3aXRoIGEgcGF5bG9hZCkuCiAgICoKICAgKiBUaGUgW29uRXJyb3JdIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQuCiAgICogSW5zdGVhZCBvZiBgbnVtLnBhcnNlKHN0cmluZywgKHN0cmluZykgeyAuLi4gfSlgLAogICAqIHlvdSBzaG91bGQgdXNlIGBudW0udHJ5UGFyc2Uoc3RyaW5nKSA/PyAoLi4uKWAuCiAgICovCiAgc3RhdGljIG51bSBwYXJzZShTdHJpbmcgaW5wdXQsIFtAZGVwcmVjYXRlZCBudW0gb25FcnJvcihTdHJpbmcgaW5wdXQpXSkgewogICAgbnVtIHJlc3VsdCA9IHRyeVBhcnNlKGlucHV0KTsKICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChvbkVycm9yID09IG51bGwpIHRocm93IEZvcm1hdEV4Y2VwdGlvbihpbnB1dCk7CiAgICByZXR1cm4gb25FcnJvcihpbnB1dCk7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYSBzdHJpbmcgY29udGFpbmluZyBhIG51bWJlciBsaXRlcmFsIGludG8gYSBudW1iZXIuCiAgICoKICAgKiBMaWtlIFtwYXJzZV0gZXhjZXB0IHRoYXQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGBudWxsYCBmb3IgaW52YWxpZCBpbnB1dHMKICAgKiBpbnN0ZWFkIG9mIHRocm93aW5nLgogICAqLwogIHN0YXRpYyBudW0gdHJ5UGFyc2UoU3RyaW5nIGlucHV0KSB7CiAgICBTdHJpbmcgc291cmNlID0gaW5wdXQudHJpbSgpOwogICAgLy8gVE9ETyhscm4pOiBPcHRpbWl6ZSB0byBkZXRlY3QgZm9ybWF0IGFuZCByZXN1bHQgdHlwZSBpbiBvbmUgY2hlY2suCiAgICByZXR1cm4gaW50LnRyeVBhcnNlKHNvdXJjZSkgPz8gZG91YmxlLnRyeVBhcnNlKHNvdXJjZSk7CiAgfQoKICAvKiogSGVscGVyIGZ1bmN0aW9ucyBmb3IgW3BhcnNlXS4gKi8KICBzdGF0aWMgaW50IF9yZXR1cm5JbnROdWxsKFN0cmluZyBfKSA9PiBudWxsOwogIHN0YXRpYyBkb3VibGUgX3JldHVybkRvdWJsZU51bGwoU3RyaW5nIF8pID0+IG51bGw7Cn0Kge8ATk48ARMBBCgDSCoEMAY+BUgiBUctSyoFS0o5BVAFLgVISElKDgVJMAVOLQYiAQYwBUpOOQU/BhQBBh8FUEUFSk9HDAVKT00XBUcwBVBQGFAoQAUPCSUkJAVDLC03PAVKEiQzNzc4CQYcARwdAR8dASIdAQYgBVBILgVMTDIFPAVDBh0BHCABBiMFUD0FRxcGHgEaFAEGTAUxLFEGHAEoHgExHwErHgE0HwFQEgEGNwVHBhcBBk4MBhcBBjUFQRgGFQEzDQEGQyQFODIuBTgFNycBGwUfBUkGEAEGLAU9NwVQBg8BBjoFUAYPAQY3BVAGDgEGPxkFUAYSAQY5BT1HBU9ABUpPRRsFJEsNBhoBBkcFT0AFSkIFJEsNBhoBBkQFT0AFSkQFJEsNBhkBBkwtBU9ABUpINgUkSw0GHQEGTgVOTBMFTy4GLQFQDwEGJgU6RCQGFQEGPgVPBU4/Ok9MFwVDIgUPBSk6PFE9JwYuAQY9BU8FSUtRTBcFRQ8FMjY4NjIGNgEGSi0FPh0FDwUwNTQ3T05HSgYtAQZMBUtLNVA/BU8yBU4FDwUvK01NO0weR0dISCktLQVGP09LUAUGFQEGQAVHI0oWSz8FShgFMVAWBUA3NQZMIic3GwQBBkAFThoGJiJKPAQBJy81AgESZGFydDpjb3JlL251bS5kYXJ0LG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL29iamVjdC5kYXJ0kH8vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBEYXJ0IG9iamVjdHMuCiAqCiAqIEJlY2F1c2UgT2JqZWN0IGlzIHRoZSByb290IG9mIHRoZSBEYXJ0IGNsYXNzIGhpZXJhcmNoeSwKICogZXZlcnkgb3RoZXIgRGFydCBjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIE9iamVjdC4KICoKICogV2hlbiB5b3UgZGVmaW5lIGEgY2xhc3MsIHlvdSBzaG91bGQgb3ZlcnJpZGUgW3RvU3RyaW5nXQogKiB0byByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzLgogKiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRvIGRlZmluZSBbaGFzaENvZGVdIGFuZCBbb3BlcmF0b3IgPT1dLCBhcyBkZXNjcmliZWQgaW4gdGhlCiAqIFtJbXBsZW1lbnRpbmcgbWFwCiAqIGtleXNdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvY2gwMy5odG1sI2ltcGxlbWVudGluZy1tYXAta2V5cykKICogc2VjdGlvbiBvZiB0aGUgW2xpYnJhcnkKICogdG91cl0oaHR0cDovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NvbnRlbnRzL2NoMDMuaHRtbCkuCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIE9iamVjdCB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBbT2JqZWN0XSBpbnN0YW5jZS4KICAgKgogICAqIFtPYmplY3RdIGluc3RhbmNlcyBoYXZlIG5vIG1lYW5pbmdmdWwgc3RhdGUsIGFuZCBhcmUgb25seSB1c2VmdWwKICAgKiB0aHJvdWdoIHRoZWlyIGlkZW50aXR5LiBBbiBbT2JqZWN0XSBpbnN0YW5jZSBpcyBlcXVhbCB0byBpdHNlbGYKICAgKiBvbmx5LgogICAqLwogIGNvbnN0IE9iamVjdCgpOwoKICAvKioKICAgKiBUaGUgZXF1YWxpdHkgb3BlcmF0b3IuCiAgICoKICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYWxsIFtPYmplY3RdcyBpcyB0byByZXR1cm4gdHJ1ZSBpZiBhbmQKICAgKiBvbmx5IGlmIGB0aGlzYCBhbmQgW290aGVyXSBhcmUgdGhlIHNhbWUgb2JqZWN0LgogICAqCiAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBlcXVhbGl0eSByZWxhdGlvbiBvbgogICAqIGEgY2xhc3MuIFRoZSBvdmVycmlkaW5nIG1ldGhvZCBtdXN0IHN0aWxsIGJlIGFuIGVxdWl2YWxlbmNlIHJlbGF0aW9uLgogICAqIFRoYXQgaXMsIGl0IG11c3QgYmU6CiAgICoKICAgKiAgKiBUb3RhbDogSXQgbXVzdCByZXR1cm4gYSBib29sZWFuIGZvciBhbGwgYXJndW1lbnRzLiBJdCBzaG91bGQgbmV2ZXIgdGhyb3cKICAgKiAgICBvciByZXR1cm4gYG51bGxgLgogICAqCiAgICogICogUmVmbGV4aXZlOiBGb3IgYWxsIG9iamVjdHMgYG9gLCBgbyA9PSBvYCBtdXN0IGJlIHRydWUuCiAgICoKICAgKiAgKiBTeW1tZXRyaWM6IEZvciBhbGwgb2JqZWN0cyBgbzFgIGFuZCBgbzJgLCBgbzEgPT0gbzJgIGFuZCBgbzIgPT0gbzFgIG11c3QKICAgKiAgICBlaXRoZXIgYm90aCBiZSB0cnVlLCBvciBib3RoIGJlIGZhbHNlLgogICAqCiAgICogICogVHJhbnNpdGl2ZTogRm9yIGFsbCBvYmplY3RzIGBvMWAsIGBvMmAsIGFuZCBgbzNgLCBpZiBgbzEgPT0gbzJgIGFuZAogICAqICAgIGBvMiA9PSBvM2AgYXJlIHRydWUsIHRoZW4gYG8xID09IG8zYCBtdXN0IGJlIHRydWUuCiAgICoKICAgKiBUaGUgbWV0aG9kIHNob3VsZCBhbHNvIGJlIGNvbnNpc3RlbnQgb3ZlciB0aW1lLAogICAqIHNvIHdoZXRoZXIgdHdvIG9iamVjdHMgYXJlIGVxdWFsIHNob3VsZCBvbmx5IGNoYW5nZQogICAqIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgb2JqZWN0cyB3YXMgbW9kaWZpZWQuCiAgICoKICAgKiBJZiBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGUgZXF1YWxpdHkgb3BlcmF0b3IgaXQgc2hvdWxkIG92ZXJyaWRlCiAgICogdGhlIFtoYXNoQ29kZV0gbWV0aG9kIGFzIHdlbGwgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kuCiAgICovCiAgZXh0ZXJuYWwgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7CgogIC8qKgogICAqIFRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgb2JqZWN0LgogICAqCiAgICogQSBoYXNoIGNvZGUgaXMgYSBzaW5nbGUgaW50ZWdlciB3aGljaCByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiB0aGUgb2JqZWN0CiAgICogdGhhdCBhZmZlY3RzIFtvcGVyYXRvciA9PV0gY29tcGFyaXNvbnMuCiAgICoKICAgKiBBbGwgb2JqZWN0cyBoYXZlIGhhc2ggY29kZXMuCiAgICogVGhlIGRlZmF1bHQgaGFzaCBjb2RlIHJlcHJlc2VudHMgb25seSB0aGUgaWRlbnRpdHkgb2YgdGhlIG9iamVjdCwKICAgKiB0aGUgc2FtZSB3YXkgYXMgdGhlIGRlZmF1bHQgW29wZXJhdG9yID09XSBpbXBsZW1lbnRhdGlvbiBvbmx5IGNvbnNpZGVycyBvYmplY3RzCiAgICogZXF1YWwgaWYgdGhleSBhcmUgaWRlbnRpY2FsIChzZWUgW2lkZW50aXR5SGFzaENvZGVdKS4KICAgKgogICAqIElmIFtvcGVyYXRvciA9PV0gaXMgb3ZlcnJpZGRlbiB0byB1c2UgdGhlIG9iamVjdCBzdGF0ZSBpbnN0ZWFkLAogICAqIHRoZSBoYXNoIGNvZGUgbXVzdCBhbHNvIGJlIGNoYW5nZWQgdG8gcmVwcmVzZW50IHRoYXQgc3RhdGUuCiAgICoKICAgKiBIYXNoIGNvZGVzIG11c3QgYmUgdGhlIHNhbWUgZm9yIG9iamVjdHMgdGhhdCBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlcgogICAqIGFjY29yZGluZyB0byBbb3BlcmF0b3IgPT1dLgogICAqIFRoZSBoYXNoIGNvZGUgb2YgYW4gb2JqZWN0IHNob3VsZCBvbmx5IGNoYW5nZSBpZiB0aGUgb2JqZWN0IGNoYW5nZXMKICAgKiBpbiBhIHdheSB0aGF0IGFmZmVjdHMgZXF1YWxpdHkuCiAgICogVGhlcmUgYXJlIG5vIGZ1cnRoZXIgcmVxdWlyZW1lbnRzIGZvciB0aGUgaGFzaCBjb2Rlcy4KICAgKiBUaGV5IG5lZWQgbm90IGJlIGNvbnNpc3RlbnQgYmV0d2VlbiBleGVjdXRpb25zIG9mIHRoZSBzYW1lIHByb2dyYW0KICAgKiBhbmQgdGhlcmUgYXJlIG5vIGRpc3RyaWJ1dGlvbiBndWFyYW50ZWVzLgogICAqCiAgICogT2JqZWN0cyB0aGF0IGFyZSBub3QgZXF1YWwgYXJlIGFsbG93ZWQgdG8gaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUsCiAgICogaXQgaXMgZXZlbiB0ZWNobmljYWxseSBhbGxvd2VkIHRoYXQgYWxsIGluc3RhbmNlcyBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZSwKICAgKiBidXQgaWYgY2xhc2hlcyBoYXBwZW4gdG9vIG9mdGVuLCBpdCBtYXkgcmVkdWNlIHRoZSBlZmZpY2llbmN5IG9mIGhhc2gtYmFzZWQKICAgKiBkYXRhIHN0cnVjdHVyZXMgbGlrZSBbSGFzaFNldF0gb3IgW0hhc2hNYXBdLgogICAqCiAgICogSWYgYSBzdWJjbGFzcyBvdmVycmlkZXMgW2hhc2hDb2RlXSwgaXQgc2hvdWxkIG92ZXJyaWRlIHRoZQogICAqIFtvcGVyYXRvciA9PV0gb3BlcmF0b3IgYXMgd2VsbCB0byBtYWludGFpbiBjb25zaXN0ZW5jeS4KICAgKi8KICBleHRlcm5hbCBpbnQgZ2V0IGhhc2hDb2RlOwoKICAvKioKICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIGV4dGVybmFsIFN0cmluZyB0b1N0cmluZygpOwoKICAvKioKICAgKiBJbnZva2VkIHdoZW4gYSBub24tZXhpc3RlbnQgbWV0aG9kIG9yIHByb3BlcnR5IGlzIGFjY2Vzc2VkLgogICAqCiAgICogQ2xhc3NlcyBjYW4gb3ZlcnJpZGUgW25vU3VjaE1ldGhvZF0gdG8gcHJvdmlkZSBjdXN0b20gYmVoYXZpb3IuCiAgICoKICAgKiBJZiBhIHZhbHVlIGlzIHJldHVybmVkLCBpdCBiZWNvbWVzIHRoZSByZXN1bHQgb2YgdGhlIG9yaWdpbmFsIGludm9jYXRpb24uCiAgICoKICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byB0aHJvdyBhIFtOb1N1Y2hNZXRob2RFcnJvcl0uCiAgICovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGV4dGVybmFsIGR5bmFtaWMgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbik7CgogIC8qKgogICAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgb2JqZWN0LgogICAqLwogIGV4dGVybmFsIFR5cGUgZ2V0IHJ1bnRpbWVUeXBlOwp9CnUATk48ARMBBCgDOzMDOzxTFVwbTwQaDwYmBUZFCwYSAQYcBUU1BUZLGgVRGgU/BVEvBUw7BTU5MgVGPAYkAQYkBU4tBSJHVTsFRUEFSiFJJTtILwVIUFEyBUA9Bh0BBjUGHgEGQQVFBU8FPQYcOAEGOQYhAgEVZGFydDpjb3JlL29iamVjdC5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvb2JqZWN0X3BhdGNoLmRhcnSKVi8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQppbnQgX2dldEhhc2gob2JqKSBuYXRpdmUgIk9iamVjdF9nZXRIYXNoIjsKdm9pZCBfc2V0SGFzaChvYmosIGhhc2gpIG5hdGl2ZSAiT2JqZWN0X3NldEhhc2giOwoKQHBhdGNoCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgT2JqZWN0IHsKICAvLyBUaGUgVk0gaGFzIGl0cyBvd24gaW1wbGVtZW50YXRpb24gb2YgZXF1YWxzLgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICBib29sIG9wZXJhdG9yID09KG90aGVyKSBuYXRpdmUgIk9iamVjdF9lcXVhbHMiOwoKICAvLyBIZWxwZXJzIHVzZWQgdG8gaW1wbGVtZW50IGhhc2hDb2RlLiBJZiBhIGhhc2hDb2RlIGlzIHVzZWQsIHdlIHJlbWVtYmVyIGl0CiAgLy8gaW4gYSB3ZWFrIHRhYmxlIGluIHRoZSBWTSAoMzIgYml0KSBvciBpbiB0aGUgaGVhZGVyIG9mIHRoZSBvYmplY3QgKDY0CiAgLy8gYml0KS4gQSBuZXcgaGFzaENvZGUgdmFsdWUgaXMgY2FsY3VsYXRlZCB1c2luZyBhIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgogIHN0YXRpYyBmaW5hbCBfaGFzaENvZGVSbmQgPSBuZXcgUmFuZG9tKCk7CgogIHN0YXRpYyBpbnQgX29iamVjdEhhc2hDb2RlKG9iaikgewogICAgdmFyIHJlc3VsdCA9IF9nZXRIYXNoKG9iaik7CiAgICBpZiAocmVzdWx0ID09IDApIHsKICAgICAgLy8gV2Ugd2FudCB0aGUgaGFzaCB0byBiZSBhIFNtaSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4KICAgICAgcmVzdWx0ID0gX2hhc2hDb2RlUm5kLm5leHRJbnQoMHg0MDAwMDAwMCk7CiAgICAgIGRvIHsKICAgICAgICByZXN1bHQgPSBfaGFzaENvZGVSbmQubmV4dEludCgweDQwMDAwMDAwKTsKICAgICAgfSB3aGlsZSAocmVzdWx0ID09IDApOwogICAgICBfc2V0SGFzaChvYmosIHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQHBhdGNoCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfb2JqZWN0SGFzaENvZGUodGhpcyk7CiAgaW50IGdldCBfaWRlbnRpdHlIYXNoQ29kZSA9PiBfb2JqZWN0SGFzaENvZGUodGhpcyk7CgogIEBwYXRjaAogIFN0cmluZyB0b1N0cmluZygpIG5hdGl2ZSAiT2JqZWN0X3RvU3RyaW5nIjsKICAvLyBBIHN0YXRpY2FsbHkgZGlzcGF0Y2hlZCB2ZXJzaW9uIG9mIE9iamVjdC50b1N0cmluZy4KICBzdGF0aWMgU3RyaW5nIF90b1N0cmluZyhvYmopIG5hdGl2ZSAiT2JqZWN0X3RvU3RyaW5nIjsKCiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgZHluYW1pYyBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICAvLyBUT0RPKHJlZ2lzKTogUmVtb3ZlIHRlbXAgY29uc3RydWN0b3IgaWRlbnRpZmllciAnd2l0aEludm9jYXRpb24nLgogICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEVycm9yLndpdGhJbnZvY2F0aW9uKHRoaXMsIGludm9jYXRpb24pOwogIH0KCiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19UeXBlIikKICBUeXBlIGdldCBydW50aW1lVHlwZSBuYXRpdmUgIk9iamVjdF9ydW50aW1lVHlwZSI7CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBzdGF0aWMgYm9vbCBfaGF2ZVNhbWVSdW50aW1lVHlwZShhLCBiKSBuYXRpdmUgIk9iamVjdF9oYXZlU2FtZVJ1bnRpbWVUeXBlIjsKCiAgLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIGluc3RlYWQgb2YgaW5saW5pbmcgaW5zdGFuY2VvZiwgdGh1cyBjb2xsZWN0aW5nCiAgLy8gdHlwZSBmZWVkYmFjayBhbmQgcmVkdWNpbmcgY29kZSBzaXplIG9mIHVub3B0aW1pemVkIGNvZGUuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgYm9vbCBfaW5zdGFuY2VPZihpbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzLCBmdW5jdGlvblR5cGVBcmd1bWVudHMsIHR5cGUpCiAgICAgIG5hdGl2ZSAiT2JqZWN0X2luc3RhbmNlT2YiOwoKICAvLyBHcm91cCBvZiBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBmYXN0IHNpbXBsZSBpbnN0YW5jZSBvZi4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBib29sIF9zaW1wbGVJbnN0YW5jZU9mKHR5cGUpIG5hdGl2ZSAiT2JqZWN0X3NpbXBsZUluc3RhbmNlT2YiOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIGJvb2wgX3NpbXBsZUluc3RhbmNlT2ZUcnVlKHR5cGUpID0+IHRydWU7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgYm9vbCBfc2ltcGxlSW5zdGFuY2VPZkZhbHNlKHR5cGUpID0+IGZhbHNlOwp9Ck0ATk48AR4BMisyAQcaDzIJKB4yAU9LTywBJCAXPDELMx0dBhMEAQktNgEJLjk5AQkkMElCBAEJNTQBJChOAUg/JEsiAUIkQSQsJC4CASFkYXJ0OmNvcmUtcGF0Y2gvb2JqZWN0X3BhdGNoLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvcGF0dGVybi5kYXJ0j9AvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQW4gaW50ZXJmYWNlIGZvciBiYXNpYyBzZWFyY2hlcyB3aXRoaW4gc3RyaW5ncy4KICovCmFic3RyYWN0IGNsYXNzIFBhdHRlcm4gewogIC8vIE5PVEU6IFdoZW4gdXNpbmcgInN0YXJ0IiBpbmRleCBmcm9tIHRoZSBsYW5ndWFnZSBsaWJyYXJ5LCBjYWxsCiAgLy8gd2l0aG91dCBhbiBhcmd1bWVudCBpZiBzdGFydCBpcyB6ZXJvLiBUaGlzIGFsbG93cyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogIC8vIHdpdGggaW1wbGVtZW50YXRpb25zIG9mIHRoZSBvbGRlciBpbnRlcmZhY2UgdGhhdCBkaWRuJ3QgaGF2ZSB0aGUgc3RhcnQKICAvLyBpbmRleCBhcmd1bWVudC4KICAvKioKICAgKiBNYXRjaCB0aGlzIHBhdHRlcm4gYWdhaW5zdCB0aGUgc3RyaW5nIHJlcGVhdGVkbHkuCiAgICoKICAgKiBJZiBbc3RhcnRdIGlzIHByb3ZpZGVkLCBtYXRjaGluZyB3aWxsIHN0YXJ0IGF0IHRoYXQgaW5kZXguCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgaXRlcmFibGUgbGF6aWx5IGNvbXB1dGVzIGFsbCB0aGUgbm9uLW92ZXJsYXBwaW5nIG1hdGNoZXMKICAgKiBvZiB0aGUgcGF0dGVybiBvbiB0aGUgc3RyaW5nLCBvcmRlcmVkIGJ5IHN0YXJ0IGluZGV4LgogICAqIElmIGEgdXNlciBvbmx5IHJlcXVlc3RzIHRoZSBmaXJzdAogICAqIG1hdGNoLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgY29tcHV0ZSBhbGwgcG9zc2libGUgbWF0Y2hlcy4KICAgKgogICAqIFRoZSBtYXRjaGVzIGFyZSBmb3VuZCBieSByZXBlYXRlZGx5IGZpbmRpbmcgdGhlIGZpcnN0IG1hdGNoCiAgICogb2YgdGhlIHBhdHRlcm4gb24gdGhlIHN0cmluZywgc3RhcnRpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cwogICAqIG1hdGNoLCBhbmQgaW5pdGlhbGx5IHN0YXJ0aW5nIGZyb20gaW5kZXggemVyby4KICAgKgogICAqIElmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGVtcHR5IHN0cmluZyBhdCBzb21lIHBvaW50LCB0aGUgbmV4dAogICAqIG1hdGNoIGlzIGZvdW5kIGJ5IHN0YXJ0aW5nIGF0IHRoZSBwcmV2aW91cyBtYXRjaCdzIGVuZCBwbHVzIG9uZS4KICAgKi8KICBJdGVyYWJsZTxNYXRjaD4gYWxsTWF0Y2hlcyhTdHJpbmcgc3RyaW5nLCBbaW50IHN0YXJ0ID0gMF0pOwoKICAvKioKICAgKiBNYXRjaCB0aGlzIHBhdHRlcm4gYWdhaW5zdCB0aGUgc3RhcnQgb2YgYHN0cmluZ2AuCiAgICoKICAgKiBJZiBbc3RhcnRdIGlzIHByb3ZpZGVkLCBpdCBtdXN0IGJlIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIGAwYCAuLgogICAqIGBzdHJpbmcubGVuZ3RoYC4gSW4gdGhhdCBjYXNlLCB0aGlzIHBhdHRlbiBpcyB0ZXN0ZWQgYWdhaW5zdCB0aGUKICAgKiBzdHJpbmcgYXQgdGhlIFtzdGFydF0gcG9zaXRpb24uIFRoYXQgaXMsIGEgW01hdGNoXSBpcyByZXR1cm5lZCBpZiB0aGUKICAgKiBwYXR0ZXJuIGNhbiBtYXRjaCBhIHBhcnQgb2YgdGhlIHN0cmluZyBzdGFydGluZyBmcm9tIHBvc2l0aW9uIFtzdGFydF0uCiAgICogUmV0dXJucyBgbnVsbGAgaWYgdGhlIHBhdHRlcm4gZG9lc24ndCBtYXRjaC4KICAgKi8KICBNYXRjaCBtYXRjaEFzUHJlZml4KFN0cmluZyBzdHJpbmcsIFtpbnQgc3RhcnQgPSAwXSk7Cn0KCi8qKgogKiBBIHJlc3VsdCBmcm9tIHNlYXJjaGluZyB3aXRoaW4gYSBzdHJpbmcuCiAqCiAqIEEgTWF0Y2ggb3IgYW4gW0l0ZXJhYmxlXSBvZiBNYXRjaCBvYmplY3RzIGlzIHJldHVybmVkIGZyb20gW1BhdHRlcm5dCiAqIG1hdGNoaW5nIG1ldGhvZHMuCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBmaW5kcyBhbGwgbWF0Y2hlcyBvZiBhIFtSZWdFeHBdIGluIGEgW1N0cmluZ10KICogYW5kIGl0ZXJhdGVzIHRocm91Z2ggdGhlIHJldHVybmVkIGl0ZXJhYmxlIG9mIE1hdGNoIG9iamVjdHMuCiAqCiAqICAgICBSZWdFeHAgZXhwID0gbmV3IFJlZ0V4cChyIihcdyspIik7CiAqICAgICBTdHJpbmcgc3RyID0gIlBhcnNlIG15IHN0cmluZyI7CiAqICAgICBJdGVyYWJsZTxNYXRjaD4gbWF0Y2hlcyA9IGV4cC5hbGxNYXRjaGVzKHN0cik7CiAqICAgICBmb3IgKE1hdGNoIG0gaW4gbWF0Y2hlcykgewogKiAgICAgICBTdHJpbmcgbWF0Y2ggPSBtLmdyb3VwKDApOwogKiAgICAgICBwcmludChtYXRjaCk7CiAqICAgICB9CiAqCiAqIFRoZSBvdXRwdXQgb2YgdGhlIGV4YW1wbGUgaXM6CiAqCiAqICAgICBQYXJzZQogKiAgICAgbXkKICogICAgIHN0cmluZwogKgogKiBTb21lIHBhdHRlcm5zLCByZWd1bGFyIGV4cHJlc3Npb25zIGluIHBhcnRpY3VsYXIsIG1heSByZWNvcmQgc3Vic3RyaW5ncwogKiB0aGF0IHdlcmUgcGFydCBvZiB0aGUgbWF0Y2hpbmcuIFRoZXNlIGFyZSBjYWxsZWQgX2dyb3Vwc18gaW4gdGhlIE1hdGNoCiAqIG9iamVjdC4gU29tZSBwYXR0ZXJucyBtYXkgbmV2ZXIgaGF2ZSBhbnkgZ3JvdXBzLCBhbmQgdGhlaXIgbWF0Y2hlcyBhbHdheXMKICogaGF2ZSB6ZXJvIFtncm91cENvdW50XS4KICovCmFic3RyYWN0IGNsYXNzIE1hdGNoIHsKICAvKioKICAgKiBSZXR1cm5zIHRoZSBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHRoZSBtYXRjaCBzdGFydHMuCiAgICovCiAgaW50IGdldCBzdGFydDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgaW5kZXggaW4gdGhlIHN0cmluZyBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlCiAgICogbWF0Y2guCiAgICovCiAgaW50IGdldCBlbmQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN0cmluZyBtYXRjaGVkIGJ5IHRoZSBnaXZlbiBbZ3JvdXBdLgogICAqCiAgICogSWYgW2dyb3VwXSBpcyAwLCByZXR1cm5zIHRoZSBtYXRjaCBvZiB0aGUgcGF0dGVybi4KICAgKgogICAqIFRoZSByZXN1bHQgbWF5IGJlIGBudWxsYCBpZiB0aGUgcGF0dGVybiBkaWRuJ3QgYXNzaWduIGEgdmFsdWUgdG8gaXQKICAgKiBhcyBwYXJ0IG9mIHRoaXMgbWF0Y2guCiAgICovCiAgU3RyaW5nIGdyb3VwKGludCBncm91cCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN0cmluZyBtYXRjaGVkIGJ5IHRoZSBnaXZlbiBbZ3JvdXBdLgogICAqCiAgICogSWYgW2dyb3VwXSBpcyAwLCByZXR1cm5zIHRoZSBtYXRjaCBvZiB0aGUgcGF0dGVybi4KICAgKgogICAqIFNob3J0IGFsaWFzIGZvciBbTWF0Y2guZ3JvdXBdLgogICAqLwogIFN0cmluZyBvcGVyYXRvciBbXShpbnQgZ3JvdXApOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgZ3JvdXBzIHdpdGggdGhlIGdpdmVuIGluZGljZXMuCiAgICoKICAgKiBUaGUgbGlzdCBjb250YWlucyB0aGUgc3RyaW5ncyByZXR1cm5lZCBieSBbZ3JvdXBdIGZvciBlYWNoIGluZGV4IGluCiAgICogW2dyb3VwSW5kaWNlc10uCiAgICovCiAgTGlzdDxTdHJpbmc+IGdyb3VwcyhMaXN0PGludD4gZ3JvdXBJbmRpY2VzKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNhcHR1cmVkIGdyb3VwcyBpbiB0aGUgbWF0Y2guCiAgICoKICAgKiBTb21lIHBhdHRlcm5zIG1heSBjYXB0dXJlIHBhcnRzIG9mIHRoZSBpbnB1dCB0aGF0IHdhcyB1c2VkIHRvCiAgICogY29tcHV0ZSB0aGUgZnVsbCBtYXRjaC4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGNhcHR1cmVkIGdyb3VwcywKICAgKiB3aGljaCBpcyBhbHNvIHRoZSBtYXhpbWFsIGFsbG93ZWQgYXJndW1lbnQgdG8gdGhlIFtncm91cF0gbWV0aG9kLgogICAqLwogIGludCBnZXQgZ3JvdXBDb3VudDsKCiAgLyoqCiAgICogVGhlIHN0cmluZyBvbiB3aGljaCB0aGlzIG1hdGNoIHdhcyBjb21wdXRlZC4KICAgKi8KICBTdHJpbmcgZ2V0IGlucHV0OwoKICAvKioKICAgKiBUaGUgcGF0dGVybiB1c2VkIHRvIHNlYXJjaCBpbiBbaW5wdXRdLgogICAqLwogIFBhdHRlcm4gZ2V0IHBhdHRlcm47Cn0KgIUATk48ARMBBDMEGURPTBUGNwVABUs7J0MFQUk0BUVGBj4BBjcFR0ZLTDIGNwIBBCwDSBUDR0ADKic2IiQXCQMhAw0KDgNLSk0bBBcGPQYRAQZFDAYPAQY2BTgFSRwGGwEGNgU4BSQGIQEGOgVJFQYvAQY5BUNERwYWAQYyBhQBBiwGFwIBFmRhcnQ6Y29yZS9wYXR0ZXJuLmRhcnQsb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvcmVnZXhwLmRhcnSZIC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgogKgogKiBSZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBbUGF0dGVybl1zLCBhbmQgY2FuIGFzIHN1Y2ggYmUgdXNlZCB0byBtYXRjaCBzdHJpbmdzCiAqIG9yIHBhcnRzIG9mIHN0cmluZ3MuCiAqCiAqIERhcnQgcmVndWxhciBleHByZXNzaW9ucyBoYXZlIHRoZSBzYW1lIHN5bnRheCBhbmQgc2VtYW50aWNzIGFzCiAqIEphdmFTY3JpcHQgcmVndWxhciBleHByZXNzaW9ucy4gU2VlCiAqIDxodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOS4wLyNzZWMtcmVnZXhwLXJlZ3VsYXItZXhwcmVzc2lvbi1vYmplY3RzPgogKiBmb3IgdGhlIHNwZWNpZmljYXRpb24gb2YgSmF2YVNjcmlwdCByZWd1bGFyIGV4cHJlc3Npb25zLgogKgogKiBbZmlyc3RNYXRjaF0gaXMgdGhlIG1haW4gaW1wbGVtZW50YXRpb24gbWV0aG9kIHRoYXQgYXBwbGllcyBhIHJlZ3VsYXIKICogZXhwcmVzc2lvbiB0byBhIHN0cmluZyBhbmQgcmV0dXJucyB0aGUgZmlyc3QgW1JlZ0V4cE1hdGNoXS4gQWxsCiAqIG90aGVyIG1ldGhvZHMgaW4gW1JlZ0V4cF0gY2FuIGJ1aWxkIG9uIGl0LgogKgogKiBVc2UgW2FsbE1hdGNoZXNdIHRvIGxvb2sgZm9yIGFsbCBtYXRjaGVzIG9mIGEgcmVndWxhciBleHByZXNzaW9uIGluCiAqIGEgc3RyaW5nLgogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZmluZHMgYWxsIG1hdGNoZXMgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gaW4KICogYSBzdHJpbmcuCiAqIGBgYGRhcnQKICogUmVnRXhwIGV4cCA9IG5ldyBSZWdFeHAociIoXHcrKSIpOwogKiBTdHJpbmcgc3RyID0gIlBhcnNlIG15IHN0cmluZyI7CiAqIEl0ZXJhYmxlPFJlZ0V4cE1hdGNoPiBtYXRjaGVzID0gZXhwLmFsbE1hdGNoZXMoc3RyKTsKICogYGBgCiAqCiAqIE5vdGUgdGhlIHVzZSBvZiBhIF9yYXcgc3RyaW5nXyAoYSBzdHJpbmcgcHJlZml4ZWQgd2l0aCBgcmApCiAqIGluIHRoZSBleGFtcGxlIGFib3ZlLiBVc2UgYSByYXcgc3RyaW5nIHRvIHRyZWF0IGVhY2ggY2hhcmFjdGVyIGluIGEgc3RyaW5nCiAqIGFzIGEgbGl0ZXJhbCBjaGFyYWN0ZXIuCiAqLwphYnN0cmFjdCBjbGFzcyBSZWdFeHAgaW1wbGVtZW50cyBQYXR0ZXJuIHsKICAvKioKICAgKiBDb25zdHJ1Y3RzIGEgcmVndWxhciBleHByZXNzaW9uLgogICAqCiAgICogVGhyb3dzIGEgW0Zvcm1hdEV4Y2VwdGlvbl0gaWYgW3NvdXJjZV0gaXMgbm90IHZhbGlkIHJlZ3VsYXIKICAgKiBleHByZXNzaW9uIHN5bnRheC4KICAgKgogICAqIElmIGBtdWx0aUxpbmVgIGlzIGVuYWJsZWQsIHRoZW4gYF5gIGFuZCBgJGAgd2lsbCBtYXRjaCB0aGUgYmVnaW5uaW5nIGFuZAogICAqIGVuZCBvZiBhIF9saW5lXywgaW4gYWRkaXRpb24gdG8gbWF0Y2hpbmcgYmVnaW5uaW5nIGFuZCBlbmQgb2YgaW5wdXQsCiAgICogcmVzcGVjdGl2ZWx5LgogICAqCiAgICogSWYgYGNhc2VTZW5zaXRpdmVgIGlzIGRpc2FibGVkLCB0aGVuIGNhc2UgaXMgaWdub3JlZC4KICAgKgogICAqIElmIGB1bmljb2RlYCBpcyBlbmFibGVkLCB0aGVuIHRoZSBwYXR0ZXJuIGlzIHRyZWF0ZWQgYXMgYSBVbmljb2RlCiAgICogcGF0dGVybiBhcyBkZXNjcmliZWQgYnkgdGhlIEVDTUFTY3JpcHQgc3RhbmRhcmQuCiAgICoKICAgKiBJZiBgZG90QWxsYCBpcyBlbmFibGVkLCB0aGVuIHRoZSBgLmAgcGF0dGVybiB3aWxsIG1hdGNoIF9hbGxfIGNoYXJhY3RlcnMsCiAgICogaW5jbHVkaW5nIGxpbmUgdGVybWluYXRvcnMuCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogYGBgZGFydAogICAqIHZhciB3b3JkUGF0dGVybiA9IFJlZ0V4cChyIihcdyspIik7CiAgICogdmFyIGJyYWNrZXRlZE51bWJlclZhbHVlID0gUmVnRXhwKCIka2V5OiBcXFtcXGQrXFxdIik7CiAgICogYGBgCiAgICoKICAgKiBOb3RpY2UgdGhlIHVzZSBvZiBhIF9yYXcgc3RyaW5nXyBpbiB0aGUgZmlyc3QgZXhhbXBsZSwgYW5kIGEgcmVndWxhcgogICAqIHN0cmluZyBpbiB0aGUgc2Vjb25kLiBCZWNhdXNlIG9mIHRoZSBtYW55IGNoYXJhY3RlciBjbGFzc2VzIHVzZWQgaW4KICAgKiByZWd1bGFyIGV4cHJlc3Npb25zLCBpdCBpcyBjb21tb24gdG8gdXNlIGEgcmF3IHN0cmluZyBoZXJlLCB1bmxlc3Mgc3RyaW5nCiAgICogaW50ZXJwb2xhdGlvbiBpcyByZXF1aXJlZC4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFJlZ0V4cChTdHJpbmcgc291cmNlLAogICAgICB7Ym9vbCBtdWx0aUxpbmUgPSBmYWxzZSwKICAgICAgYm9vbCBjYXNlU2Vuc2l0aXZlID0gdHJ1ZSwKICAgICAgQFNpbmNlKCIyLjQiKSBib29sIHVuaWNvZGUgPSBmYWxzZSwKICAgICAgQFNpbmNlKCIyLjQiKSBib29sIGRvdEFsbCA9IGZhbHNlfSk7CgogIC8qKgogICAqIFJldHVybnMgYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIFt0ZXh0XS4KICAgKgogICAqIElmIFt0ZXh0XSBjb250YWlucyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG1lYW5pbmdmdWwgaW4gcmVndWxhciBleHByZXNzaW9ucywKICAgKiB0aGUgcmVzdWx0aW5nIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aWxsIG1hdGNoIHRob3NlIGNoYXJhY3RlcnMgbGl0ZXJhbGx5LgogICAqIElmIFt0ZXh0XSBjb250YWlucyBubyBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBzcGVjaWFsIG1lYW5pbmcgaW4gYSByZWd1bGFyCiAgICogZXhwcmVzc2lvbiwgaXQgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KICAgKgogICAqIFRoZSBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBzcGVjaWFsIG1lYW5pbmcgaW4gcmVndWxhciBleHByZXNzaW9ucyBhcmU6CiAgICogYChgLCBgKWAsIGBbYCwgYF1gLCBge2AsIGB9YCwgYCpgLCBgK2AsIGA/YCwgYC5gLCBgXmAsIGAkYCwgYHxgIGFuZCBgXGAuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHRleHQpOwoKICAvKioKICAgKiBTZWFyY2hlcyBmb3IgdGhlIGZpcnN0IG1hdGNoIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KICAgKiBpbiB0aGUgc3RyaW5nIFtpbnB1dF0uIFJldHVybnMgYG51bGxgIGlmIHRoZXJlIGlzIG5vIG1hdGNoLgogICAqLwogIFJlZ0V4cE1hdGNoIGZpcnN0TWF0Y2goU3RyaW5nIGlucHV0KTsKCiAgLyoqCiAgICogUmV0dXJucyBhbiBpdGVyYWJsZSBvZiB0aGUgbWF0Y2hlcyBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIG9uIFtpbnB1dF0uCiAgICoKICAgKiBJZiBbc3RhcnRdIGlzIHByb3ZpZGVkLCBvbmx5IHN0YXJ0IGxvb2tpbmcgZm9yIG1hdGNoZXMgYXQgYHN0YXJ0YC4KICAgKi8KICBJdGVyYWJsZTxSZWdFeHBNYXRjaD4gYWxsTWF0Y2hlcyhTdHJpbmcgaW5wdXQsIFtpbnQgc3RhcnQgPSAwXSk7CgogIC8qKgogICAqIFJldHVybnMgd2hldGhlciB0aGUgcmVndWxhciBleHByZXNzaW9uIGhhcyBhIG1hdGNoIGluIHRoZSBzdHJpbmcgW2lucHV0XS4KICAgKi8KICBib29sIGhhc01hdGNoKFN0cmluZyBpbnB1dCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZpcnN0IHN1YnN0cmluZyBtYXRjaCBvZiB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbiBbaW5wdXRdLgogICAqLwogIFN0cmluZyBzdHJpbmdNYXRjaChTdHJpbmcgaW5wdXQpOwoKICAvKioKICAgKiBUaGUgc291cmNlIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmcgdXNlZCB0byBjcmVhdGUgdGhpcyBgUmVnRXhwYC4KICAgKi8KICBTdHJpbmcgZ2V0IHBhdHRlcm47CgogIC8qKgogICAqIFdoZXRoZXIgdGhpcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlcyBtdWx0aXBsZSBsaW5lcy4KICAgKgogICAqIElmIHRoZSByZWdleHAgZG9lcyBtYXRjaCBtdWx0aXBsZSBsaW5lcywgdGhlICJeIiBhbmQgIiQiIGNoYXJhY3RlcnMKICAgKiBtYXRjaCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgbGluZXMuIElmIG5vdCwgdGhlIGNoYXJhY3RlciBtYXRjaCB0aGUKICAgKiBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgaW5wdXQuCiAgICovCiAgYm9vbCBnZXQgaXNNdWx0aUxpbmU7CgogIC8qKgogICAqIFdoZXRoZXIgdGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaXMgY2FzZSBzZW5zaXRpdmUuCiAgICoKICAgKiBJZiB0aGUgcmVndWxhciBleHByZXNzaW9uIGlzIG5vdCBjYXNlIHNlbnNpdGl2ZSwgaXQgd2lsbCBtYXRjaCBhbiBpbnB1dAogICAqIGxldHRlciB3aXRoIGEgcGF0dGVybiBsZXR0ZXIgZXZlbiBpZiB0aGUgdHdvIGxldHRlcnMgYXJlIGRpZmZlcmVudCBjYXNlCiAgICogdmVyc2lvbnMgb2YgdGhlIHNhbWUgbGV0dGVyLgogICAqLwogIGJvb2wgZ2V0IGlzQ2FzZVNlbnNpdGl2ZTsKCiAgLyoqCiAgICogV2hldGhlciB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBpbiBVbmljb2RlIG1vZGUuCiAgICoKICAgKiBJbiBVbmljb2RlIG1vZGUsIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMgaW4gdGhlIG9yaWdpbmFsIHN0cmluZyB3aWxsIGJlCiAgICogdHJlYXRlZCBhcyBhIHNpbmdsZSBjb2RlIHBvaW50IGFuZCB3aWxsIG5vdCBtYXRjaCBzZXBhcmF0ZWx5LiBPdGhlcndpc2UsCiAgICogdGhlIHRhcmdldCBzdHJpbmcgd2lsbCBiZSB0cmVhdGVkIHB1cmVseSBhcyBhIHNlcXVlbmNlIG9mIGluZGl2aWR1YWwgY29kZQogICAqIHVuaXRzIGFuZCBzdXJyb2dhdGVzIHdpbGwgbm90IGJlIHRyZWF0ZWQgc3BlY2lhbGx5LgogICAqCiAgICogSW4gVW5pY29kZSBtb2RlLCB0aGUgc3ludGF4IG9mIHRoZSBSZWdFeHAgcGF0dGVybiBpcyBtb3JlIHJlc3RyaWN0ZWQsIGJ1dAogICAqIHNvbWUgcGF0dGVybiBmZWF0dXJlcywgbGlrZSBVbmljb2RlIHByb3BlcnR5IGVzY2FwZXMsIGFyZSBvbmx5IGF2YWlsYWJsZSBpbgogICAqIHRoaXMgbW9kZS4KICAgKi8KICBAU2luY2UoIjIuNCIpCiAgYm9vbCBnZXQgaXNVbmljb2RlOwoKICAvKioKICAgKiBXaGV0aGVyICIuIiBpbiB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzIGxpbmUgdGVybWluYXRvcnMuCiAgICoKICAgKiBXaGVuIGZhbHNlLCB0aGUgIi4iIGNoYXJhY3RlciBtYXRjaGVzIGEgc2luZ2xlIGNoYXJhY3RlciwgdW5sZXNzIHRoYXQKICAgKiBjaGFyYWN0ZXIgaXMgYSBsaW5lIHRlcm1pbmF0b3IuIFdoZW4gdHJ1ZSwgdGhlbiB0aGUgIi4iIGNoYXJhY3RlciB3aWxsCiAgICogbWF0Y2ggYW55IHNpbmdsZSBjaGFyYWN0ZXIgaW5jbHVkaW5nIGxpbmUgdGVybWluYXRvcnMuCiAgICoKICAgKiBUaGlzIGZlYXR1cmUgaXMgZGlzdGluY3QgZnJvbSBbaXNNdWx0aWxpbmVdLCBhcyB0aGV5IGFmZmVjdCB0aGUgYmVoYXZpb3IKICAgKiBvZiBkaWZmZXJlbnQgcGF0dGVybiBjaGFyYWN0ZXJzLCBhbmQgc28gdGhleSBjYW4gYmUgdXNlZCB0b2dldGhlciBvcgogICAqIHNlcGFyYXRlbHkuCiAgICovCiAgQFNpbmNlKCIyLjQiKQogIGJvb2wgZ2V0IGlzRG90QWxsOwp9CgovKioKICogQSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2guCiAqCiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzIGFyZSBbTWF0Y2hdZXMsIGJ1dCBhbHNvIGluY2x1ZGUgdGhlIGFiaWxpdHkKICogdG8gcmV0cmlldmUgdGhlIG5hbWVzIGZvciBhbnkgbmFtZWQgY2FwdHVyZSBncm91cHMgYW5kIHRvIHJldHJpZXZlCiAqIG1hdGNoZXMgZm9yIG5hbWVkIGNhcHR1cmUgZ3JvdXBzIGJ5IG5hbWUgaW5zdGVhZCBvZiB0aGVpciBpbmRleC4KICovCkBTaW5jZSgiMi4zIikKYWJzdHJhY3QgY2xhc3MgUmVnRXhwTWF0Y2ggaW1wbGVtZW50cyBNYXRjaCB7CiAgLyoqCiAgICogVGhlIHN0cmluZyBtYXRjaGVkIGJ5IHRoZSBncm91cCBuYW1lZCBbbmFtZV0uCiAgICoKICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgbWF0Y2hlZCBieSB0aGUgY2FwdHVyZSBncm91cCBuYW1lZCBbbmFtZV0sIG9yCiAgICogYG51bGxgIGlmIG5vIHN0cmluZyB3YXMgbWF0Y2hlZCBieSB0aGF0IGNhcHR1cmUgZ3JvdXAgYXMgcGFydCBvZgogICAqIHRoaXMgbWF0Y2guCiAgICoKICAgKiBUaGUgW25hbWVdIG11c3QgYmUgdGhlIG5hbWUgb2YgYSBuYW1lZCBjYXB0dXJlIGdyb3VwIGluIHRoZSByZWd1bGFyCiAgICogZXhwcmVzc2lvbiBjcmVhdGluZyB0aGlzIG1hdGNoICh0aGF0IGlzLCB0aGUgbmFtZSBtdXN0IGJlIGluCiAgICogW2dyb3VwTmFtZXNdKS4KICAgKi8KICBTdHJpbmcgbmFtZWRHcm91cChTdHJpbmcgbmFtZSk7CgogIC8qKgogICAqIFRoZSBuYW1lcyBvZiB0aGUgY2FwdHVyZWQgZ3JvdXBzIGluIHRoZSBtYXRjaC4KICAgKi8KICBJdGVyYWJsZTxTdHJpbmc+IGdldCBncm91cE5hbWVzOwp9CoC/AE5OPAETAQQhA1AYA0InWDwDSUMuA0cNA0YNCyYjOAcDP04bBCsGJgVBGAVOShMFOwVHNgVPIQUOBQ0pPAkFSklPIAYpHyEqKwEGNwVPTU0sBUpOBi4BBjxBBigBBk4FSAZDAQZPBh8BBk4GJAEGSAYWAQY9BUlLJQYYAQY4BU1NIgYcAQY5BUxOTzkFT1EQBhAWAQZGBUtMPAVOShEGEBUCAQQfA0pGRAQOLgYzBUZGEQVJQhQGIgEGNAYjAgEVZGFydDpjb3JlL3JlZ2V4cC5kYXJ0KW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL3NldC5kYXJ0pTcvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgaW4gd2hpY2ggZWFjaCBvYmplY3QgY2FuIG9jY3VyIG9ubHkgb25jZS4KICoKICogVGhhdCBpcywgZm9yIGVhY2ggb2JqZWN0IG9mIHRoZSBlbGVtZW50IHR5cGUsIHRoZSBvYmplY3QgaXMgZWl0aGVyIGNvbnNpZGVyZWQKICogdG8gYmUgaW4gdGhlIHNldCwgb3IgdG8gX25vdF8gYmUgaW4gdGhlIHNldC4KICoKICogU2V0IGltcGxlbWVudGF0aW9ucyBtYXkgY29uc2lkZXIgc29tZSBlbGVtZW50cyBpbmRpc3Rpbmd1aXNoYWJsZS4gVGhlc2UKICogZWxlbWVudHMgYXJlIHRyZWF0ZWQgYXMgYmVpbmcgdGhlIHNhbWUgZm9yIGFueSBvcGVyYXRpb24gb24gdGhlIHNldC4KICoKICogVGhlIGRlZmF1bHQgW1NldF0gaW1wbGVtZW50YXRpb24sIFtMaW5rZWRIYXNoU2V0XSwgY29uc2lkZXJzIG9iamVjdHMKICogaW5kaXN0aW5ndWlzaGFibGUgaWYgdGhleSBhcmUgZXF1YWwgd2l0aCByZWdhcmQgdG8KICogb3BlcmF0b3IgW09iamVjdC49PV0uCiAqCiAqIEl0ZXJhdGluZyBvdmVyIGVsZW1lbnRzIG9mIGEgc2V0IG1heSBiZSBlaXRoZXIgdW5vcmRlcmVkCiAqIG9yIG9yZGVyZWQgaW4gc29tZSB3YXkuIEV4YW1wbGVzOgogKgogKiAqIEEgW0hhc2hTZXRdIGlzIHVub3JkZXJlZCwgd2hpY2ggbWVhbnMgdGhhdCBpdHMgaXRlcmF0aW9uIG9yZGVyIGlzCiAqICAgdW5zcGVjaWZpZWQsCiAqICogW0xpbmtlZEhhc2hTZXRdIGl0ZXJhdGVzIGluIHRoZSBpbnNlcnRpb24gb3JkZXIgb2YgaXRzIGVsZW1lbnRzLCBhbmQKICogKiBhIHNvcnRlZCBzZXQgbGlrZSBbU3BsYXlUcmVlU2V0XSBpdGVyYXRlcyB0aGUgZWxlbWVudHMgaW4gc29ydGVkIG9yZGVyLgogKgogKiBJdCBpcyBnZW5lcmFsbHkgbm90IGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBzZXQgKGFkZCBvciByZW1vdmUgZWxlbWVudHMpIHdoaWxlCiAqIGFuIG9wZXJhdGlvbiBvbiB0aGUgc2V0IGlzIGJlaW5nIHBlcmZvcm1lZCwgZm9yIGV4YW1wbGUgZHVyaW5nIGEgY2FsbCB0bwogKiBbZm9yRWFjaF0gb3IgW2NvbnRhaW5zQWxsXS4gTm9yIGlzIGl0IGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBzZXQgd2hpbGUKICogaXRlcmF0aW5nIGVpdGhlciB0aGUgc2V0IGl0c2VsZiBvciBhbnkgW0l0ZXJhYmxlXSB0aGF0IGlzIGJhY2tlZCBieSB0aGUgc2V0LAogKiBzdWNoIGFzIHRoZSBvbmVzIHJldHVybmVkIGJ5IG1ldGhvZHMgbGlrZSBbd2hlcmVdIGFuZCBbbWFwXS4KICoKICogSXQgaXMgZ2VuZXJhbGx5IG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgZXF1YWxpdHkgb2YgZWxlbWVudHMgKGFuZCB0aHVzIG5vdAogKiB0aGVpciBoYXNoY29kZSkgd2hpbGUgdGhleSBhcmUgaW4gdGhlIHNldC4gU29tZSBzcGVjaWFsaXplZCBzdWJ0eXBlcyBtYXkgYmUKICogbW9yZSBwZXJtaXNzaXZlLCBpbiB3aGljaCBjYXNlIHRoZXkgc2hvdWxkIGRvY3VtZW50IHRoaXMgYmVoYXZpb3IuCiAqLwphYnN0cmFjdCBjbGFzcyBTZXQ8RT4gZXh0ZW5kcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPiB7CiAgLyoqCiAgICogQ3JlYXRlcyBhbiBlbXB0eSBbU2V0XS4KICAgKgogICAqIFRoZSBjcmVhdGVkIFtTZXRdIGlzIGEgcGxhaW4gW0xpbmtlZEhhc2hTZXRdLgogICAqIEFzIHN1Y2gsIGl0IGNvbnNpZGVycyBlbGVtZW50cyB0aGF0IGFyZSBlcXVhbCAodXNpbmcgW29wZXJhdG9yID09XSkgdG8gYmUKICAgKiBpbmRpc3Rpbmd1aXNoYWJsZSwgYW5kIHJlcXVpcmVzIHRoZW0gdG8gaGF2ZSBhIGNvbXBhdGlibGUKICAgKiBbT2JqZWN0Lmhhc2hDb2RlXSBpbXBsZW1lbnRhdGlvbi4KICAgKgogICAqIFRoZSBzZXQgaXMgZXF1aXZhbGVudCB0byBvbmUgY3JlYXRlZCBieSBgbmV3IExpbmtlZEhhc2hTZXQ8RT4oKWAuCiAgICovCiAgZmFjdG9yeSBTZXQoKSA9IExpbmtlZEhhc2hTZXQ8RT47CgogIC8qKgogICAqIENyZWF0ZXMgYW4gZW1wdHkgaWRlbnRpdHkgW1NldF0uCiAgICoKICAgKiBUaGUgY3JlYXRlZCBbU2V0XSBpcyBhIFtMaW5rZWRIYXNoU2V0XSB0aGF0IHVzZXMgaWRlbnRpdHkgYXMgZXF1YWxpdHkKICAgKiByZWxhdGlvbi4KICAgKgogICAqIFRoZSBzZXQgaXMgZXF1aXZhbGVudCB0byBvbmUgY3JlYXRlZCBieSBgbmV3IExpbmtlZEhhc2hTZXQ8RT4uaWRlbnRpdHkoKWAuCiAgICovCiAgZmFjdG9yeSBTZXQuaWRlbnRpdHkoKSA9IExpbmtlZEhhc2hTZXQ8RT4uaWRlbnRpdHk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbU2V0XSB0aGF0IGNvbnRhaW5zIGFsbCBbZWxlbWVudHNdLgogICAqCiAgICogQWxsIHRoZSBbZWxlbWVudHNdIHNob3VsZCBiZSBpbnN0YW5jZXMgb2YgW0VdLgogICAqIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBjYW4gaGF2ZSBhbnkgdHlwZSwKICAgKiBzbyB0aGlzIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGRvd24tY2FzdCBhIGBTZXRgLCBmb3IgZXhhbXBsZSBhczoKICAgKgogICAqICAgICBTZXQ8U3VwZXJUeXBlPiBzdXBlclNldCA9IC4uLjsKICAgKiAgICAgU2V0PFN1YlR5cGU+IHN1YlNldCA9CiAgICogICAgICAgICBuZXcgU2V0PFN1YlR5cGU+LmZyb20oc3VwZXJTZXQud2hlcmUoKGUpID0+IGUgaXMgU3ViVHlwZSkpOwogICAqCiAgICogVGhlIGNyZWF0ZWQgW1NldF0gaXMgYSBbTGlua2VkSGFzaFNldF0uIEFzIHN1Y2gsIGl0IGNvbnNpZGVycyBlbGVtZW50cyB0aGF0CiAgICogYXJlIGVxdWFsICh1c2luZyBbb3BlcmF0b3IgPT1dKSB0byBiZSBpbmRpc3Rpbmd1aXNoYWJsZSwgYW5kIHJlcXVpcmVzIHRoZW0gdG8KICAgKiBoYXZlIGEgY29tcGF0aWJsZSBbT2JqZWN0Lmhhc2hDb2RlXSBpbXBsZW1lbnRhdGlvbi4KICAgKgogICAqIFRoZSBzZXQgaXMgZXF1aXZhbGVudCB0byBvbmUgY3JlYXRlZCBieQogICAqIGBuZXcgTGlua2VkSGFzaFNldDxFPi5mcm9tKGVsZW1lbnRzKWAuCiAgICovCiAgZmFjdG9yeSBTZXQuZnJvbShJdGVyYWJsZSBlbGVtZW50cykgPSBMaW5rZWRIYXNoU2V0PEU+LmZyb207CgogIC8qKgogICAqIENyZWF0ZXMgYSBbU2V0XSBmcm9tIFtlbGVtZW50c10uCiAgICoKICAgKiBUaGUgY3JlYXRlZCBbU2V0XSBpcyBhIFtMaW5rZWRIYXNoU2V0XS4gQXMgc3VjaCwgaXQgY29uc2lkZXJzIGVsZW1lbnRzIHRoYXQKICAgKiBhcmUgZXF1YWwgKHVzaW5nIFtvcGVyYXRvciA9PV0pIHRvIGJlIGluZGlzdGluZ3Vpc2hhYmxlLCBhbmQgcmVxdWlyZXMgdGhlbSB0bwogICAqIGhhdmUgYSBjb21wYXRpYmxlIFtPYmplY3QuaGFzaENvZGVdIGltcGxlbWVudGF0aW9uLgogICAqCiAgICogVGhlIHNldCBpcyBlcXVpdmFsZW50IHRvIG9uZSBjcmVhdGVkIGJ5CiAgICogYG5ldyBMaW5rZWRIYXNoU2V0PEU+Lm9mKGVsZW1lbnRzKWAuCiAgICovCiAgZmFjdG9yeSBTZXQub2YoSXRlcmFibGU8RT4gZWxlbWVudHMpID0gTGlua2VkSGFzaFNldDxFPi5vZjsKCiAgLyoqCiAgICogQWRhcHRzIFtzb3VyY2VdIHRvIGJlIGEgYFNldDxUPmAuCiAgICoKICAgKiBJZiBbbmV3U2V0XSBpcyBwcm92aWRlZCwgaXQgaXMgdXNlZCB0byBjcmVhdGUgdGhlIG5ldyBzZXRzIHJldHVybmVkCiAgICogYnkgW3RvU2V0XSwgW3VuaW9uXSwgYW5kIGlzIGFsc28gdXNlZCBmb3IgW2ludGVyc2VjdGlvbl0gYW5kIFtkaWZmZXJlbmNlXS4KICAgKiBJZiBbbmV3U2V0XSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBjcmVhdGluZyBhIG5ldyBzZXQgdXNpbmcgdGhlCiAgICogZGVmYXVsdCBbU2V0XSBjb25zdHJ1Y3RvciwgYW5kIFtpbnRlcnNlY3Rpb25dIGFuZCBbZGlmZmVyZW5jZV0KICAgKiByZXR1cm5zIGFuIGFkYXB0ZWQgdmVyc2lvbiBvZiBjYWxsaW5nIHRoZSBzYW1lIG1ldGhvZCBvbiB0aGUgc291cmNlLgogICAqCiAgICogQW55IHRpbWUgdGhlIHNldCB3b3VsZCBwcm9kdWNlIGFuIGVsZW1lbnQgdGhhdCBpcyBub3QgYSBbVF0sCiAgICogdGhlIGVsZW1lbnQgYWNjZXNzIHdpbGwgdGhyb3cuCiAgICoKICAgKiBBbnkgdGltZSBhIFtUXSB2YWx1ZSBpcyBhdHRlbXB0ZWQgYWRkZWQgaW50byB0aGUgYWRhcHRlZCBzZXQsCiAgICogdGhlIHN0b3JlIHdpbGwgdGhyb3cgdW5sZXNzIHRoZSB2YWx1ZSBpcyBhbHNvIGFuIGluc3RhbmNlIG9mIFtTXS4KICAgKgogICAqIElmIGFsbCBhY2Nlc3NlZCBlbGVtZW50cyBvZiBbc291cmNlXSBhcmUgYWN0dWFsbHkgaW5zdGFuY2VzIG9mIFtUXSwKICAgKiBhbmQgaWYgYWxsIGVsZW1lbnRzIGFkZGVkIHRvIHRoZSByZXR1cm5lZCBzZXQgYXJlIGFjdHVhbGx5IGluc3RhbmNlCiAgICogb2YgW1NdLAogICAqIHRoZW4gdGhlIHJldHVybmVkIHNldCBjYW4gYmUgdXNlZCBhcyBhIGBTZXQ8VD5gLgogICAqLwogIHN0YXRpYyBTZXQ8VD4gY2FzdEZyb208UywgVD4oU2V0PFM+IHNvdXJjZSwge1NldDxSPiBGdW5jdGlvbjxSPigpIG5ld1NldH0pID0+CiAgICAgIENhc3RTZXQ8UywgVD4oc291cmNlLCBuZXdTZXQpOwoKICAvKioKICAgKiBQcm92aWRlcyBhIHZpZXcgb2YgdGhpcyBzZXQgYXMgYSBzZXQgb2YgW1JdIGluc3RhbmNlcy4KICAgKgogICAqIElmIHRoaXMgc2V0IGNvbnRhaW5zIG9ubHkgaW5zdGFuY2VzIG9mIFtSXSwgYWxsIHJlYWQgb3BlcmF0aW9ucwogICAqIHdpbGwgd29yayBjb3JyZWN0bHkuIElmIGFueSBvcGVyYXRpb24gdHJpZXMgdG8gYWNjZXNzIGFuIGVsZW1lbnQKICAgKiB0aGF0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBbUl0sIHRoZSBhY2Nlc3Mgd2lsbCB0aHJvdyBpbnN0ZWFkLgogICAqCiAgICogRWxlbWVudHMgYWRkZWQgdG8gdGhlIHNldCAoZS5nLiwgYnkgdXNpbmcgW2FkZF0gb3IgW2FkZEFsbF0pCiAgICogbXVzdCBiZSBpbnN0YW5jZSBvZiBbUl0gdG8gYmUgdmFsaWQgYXJndW1lbnRzIHRvIHRoZSBhZGRpbmcgZnVuY3Rpb24sCiAgICogYW5kIHRoZXkgbXVzdCBiZSBpbnN0YW5jZXMgb2YgW0VdIGFzIHdlbGwgdG8gYmUgYWNjZXB0ZWQgYnkKICAgKiB0aGlzIHNldCBhcyB3ZWxsLgogICAqLwogIFNldDxSPiBjYXN0PFI+KCk7CiAgLyoqCiAgICogUHJvdmlkZXMgYW4gaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSBlbGVtZW50cyBvZiB0aGlzIHNldC4KICAgKgogICAqIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgZGVmaW5lZCBieSB0aGUgaW5kaXZpZHVhbCBgU2V0YCBpbXBsZW1lbnRhdGlvbiwKICAgKiBidXQgbXVzdCBiZSBjb25zaXN0ZW50IGJldHdlZW4gY2hhbmdlcyB0byB0aGUgc2V0LgogICAqLwogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvcjsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIFt2YWx1ZV0gaXMgaW4gdGhlIHNldC4KICAgKi8KICBib29sIGNvbnRhaW5zKE9iamVjdCB2YWx1ZSk7CgogIC8qKgogICAqIEFkZHMgW3ZhbHVlXSB0byB0aGUgc2V0LgogICAqCiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgW3ZhbHVlXSAob3IgYW4gZXF1YWwgdmFsdWUpIHdhcyBub3QgeWV0IGluIHRoZSBzZXQuCiAgICogT3RoZXJ3aXNlIHJldHVybnMgYGZhbHNlYCBhbmQgdGhlIHNldCBpcyBub3QgY2hhbmdlZC4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiAgICAgdmFyIHNldCA9IG5ldyBTZXQoKTsKICAgKiAgICAgdmFyIHRpbWUxID0gbmV3IERhdGVUaW1lLmZyb21NaWxsaXNlY29uZHNTaW5jZUVwb2NoKDApOwogICAqICAgICB2YXIgdGltZTIgPSBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2goMCk7CiAgICogICAgIC8vIHRpbWUxIGFuZCB0aW1lMiBhcmUgZXF1YWwsIGJ1dCBub3QgaWRlbnRpY2FsLgogICAqICAgICBFeHBlY3QuaXNUcnVlKHRpbWUxID09IHRpbWUyKTsKICAgKiAgICAgRXhwZWN0LmlzRmFsc2UoaWRlbnRpY2FsKHRpbWUxLCB0aW1lMikpOwogICAqICAgICBzZXQuYWRkKHRpbWUxKTsgIC8vID0+IHRydWUuCiAgICogICAgIC8vIEEgdmFsdWUgZXF1YWwgdG8gdGltZTIgZXhpc3RzIGFscmVhZHkgaW4gdGhlIHNldCwgYW5kIHRoZSBjYWxsIHRvCiAgICogICAgIC8vIGFkZCBkb2Vzbid0IGNoYW5nZSB0aGUgc2V0LgogICAqICAgICBzZXQuYWRkKHRpbWUyKTsgIC8vID0+IGZhbHNlLgogICAqICAgICBFeHBlY3QuaXNUcnVlKHNldC5sZW5ndGggPT0gMSk7CiAgICogICAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKHRpbWUxLCBzZXQuZmlyc3QpKTsKICAgKi8KICBib29sIGFkZChFIHZhbHVlKTsKCiAgLyoqCiAgICogQWRkcyBhbGwgW2VsZW1lbnRzXSB0byB0aGlzIFNldC4KICAgKgogICAqIEVxdWl2YWxlbnQgdG8gYWRkaW5nIGVhY2ggZWxlbWVudCBpbiBbZWxlbWVudHNdIHVzaW5nIFthZGRdLAogICAqIGJ1dCBzb21lIGNvbGxlY3Rpb25zIG1heSBiZSBhYmxlIHRvIG9wdGltaXplIGl0LgogICAqLwogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogUmVtb3ZlcyBbdmFsdWVdIGZyb20gdGhlIHNldC4gUmV0dXJucyB0cnVlIGlmIFt2YWx1ZV0gd2FzCiAgICogaW4gdGhlIHNldC4gUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuIFRoZSBtZXRob2QgaGFzIG5vIGVmZmVjdAogICAqIGlmIFt2YWx1ZV0gdmFsdWUgd2FzIG5vdCBpbiB0aGUgc2V0LgogICAqLwogIGJvb2wgcmVtb3ZlKE9iamVjdCB2YWx1ZSk7CgogIC8qKgogICAqIElmIGFuIG9iamVjdCBlcXVhbCB0byBbb2JqZWN0XSBpcyBpbiB0aGUgc2V0LCByZXR1cm4gaXQuCiAgICoKICAgKiBDaGVja3Mgd2hldGhlciBbb2JqZWN0XSBpcyBpbiB0aGUgc2V0LCBsaWtlIFtjb250YWluc10sIGFuZCBpZiBzbywKICAgKiByZXR1cm5zIHRoZSBvYmplY3QgaW4gdGhlIHNldCwgb3RoZXJ3aXNlIHJldHVybnMgYG51bGxgLgogICAqCiAgICogSWYgdGhlIGVxdWFsaXR5IHJlbGF0aW9uIHVzZWQgYnkgdGhlIHNldCBpcyBub3QgaWRlbnRpdHksCiAgICogdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IG1heSBub3QgYmUgKmlkZW50aWNhbCogdG8gW29iamVjdF0uCiAgICogU29tZSBzZXQgaW1wbGVtZW50YXRpb25zIG1heSBub3QgYmUgYWJsZSB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCiAgICogSWYgdGhlIFtjb250YWluc10gbWV0aG9kIGlzIGNvbXB1dGVkLAogICAqIHJhdGhlciB0aGFuIGJlaW5nIGJhc2VkIG9uIGFuIGFjdHVhbCBvYmplY3QgaW5zdGFuY2UsCiAgICogdGhlbiB0aGVyZSBtYXkgbm90IGJlIGEgc3BlY2lmaWMgb2JqZWN0IGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUKICAgKiBzZXQgZWxlbWVudC4KICAgKi8KICBFIGxvb2t1cChPYmplY3Qgb2JqZWN0KTsKCiAgLyoqCiAgICogUmVtb3ZlcyBlYWNoIGVsZW1lbnQgb2YgW2VsZW1lbnRzXSBmcm9tIHRoaXMgc2V0LgogICAqLwogIHZvaWQgcmVtb3ZlQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpOwoKICAvKioKICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBvZiB0aGlzIHNldCB0aGF0IGFyZSBub3QgZWxlbWVudHMgaW4gW2VsZW1lbnRzXS4KICAgKgogICAqIENoZWNrcyBmb3IgZWFjaCBlbGVtZW50IG9mIFtlbGVtZW50c10gd2hldGhlciB0aGVyZSBpcyBhbiBlbGVtZW50IGluIHRoaXMKICAgKiBzZXQgdGhhdCBpcyBlcXVhbCB0byBpdCAoYWNjb3JkaW5nIHRvIGB0aGlzLmNvbnRhaW5zYCksIGFuZCBpZiBzbywgdGhlCiAgICogZXF1YWwgZWxlbWVudCBpbiB0aGlzIHNldCBpcyByZXRhaW5lZCwgYW5kIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBlcXVhbAogICAqIHRvIGFueSBlbGVtZW50IGluIGBlbGVtZW50c2AgYXJlIHJlbW92ZWQuCiAgICovCiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cyk7CgogIC8qKgogICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIG9mIHRoaXMgc2V0IHRoYXQgc2F0aXNmeSBbdGVzdF0uCiAgICovCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSk7CgogIC8qKgogICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIG9mIHRoaXMgc2V0IHRoYXQgZmFpbCB0byBzYXRpc2Z5IFt0ZXN0XS4KICAgKi8KICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKTsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgU2V0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgW290aGVyXS4KICAgKi8KICBib29sIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPE9iamVjdD4gb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IHNldCB3aGljaCBpcyB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhpcyBzZXQgYW5kIFtvdGhlcl0uCiAgICoKICAgKiBUaGF0IGlzLCB0aGUgcmV0dXJuZWQgc2V0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhpcyBbU2V0XSB0aGF0CiAgICogYXJlIGFsc28gZWxlbWVudHMgb2YgW290aGVyXSBhY2NvcmRpbmcgdG8gYG90aGVyLmNvbnRhaW5zYC4KICAgKi8KICBTZXQ8RT4gaW50ZXJzZWN0aW9uKFNldDxPYmplY3Q+IG90aGVyKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBzZXQgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGlzIHNldCBhbmQgW290aGVyXS4KICAgKgogICAqIFRoYXQgaXMsIHRoZSByZXR1cm5lZCBzZXQgY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGlzIFtTZXRdIGFuZAogICAqIGFsbCB0aGUgZWxlbWVudHMgb2YgW290aGVyXS4KICAgKi8KICBTZXQ8RT4gdW5pb24oU2V0PEU+IG90aGVyKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBzZXQgd2l0aCB0aGUgZWxlbWVudHMgb2YgdGhpcyB0aGF0IGFyZSBub3QgaW4gW290aGVyXS4KICAgKgogICAqIFRoYXQgaXMsIHRoZSByZXR1cm5lZCBzZXQgY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGlzIFtTZXRdIHRoYXQKICAgKiBhcmUgbm90IGVsZW1lbnRzIG9mIFtvdGhlcl0gYWNjb3JkaW5nIHRvIGBvdGhlci5jb250YWluc2AuCiAgICovCiAgU2V0PEU+IGRpZmZlcmVuY2UoU2V0PE9iamVjdD4gb3RoZXIpOwoKICAvKioKICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2V0LgogICAqLwogIHZvaWQgY2xlYXIoKTsKCiAgLyogQ3JlYXRlcyBhIFtTZXRdIHdpdGggdGhlIHNhbWUgZWxlbWVudHMgYW5kIGJlaGF2aW9yIGFzIHRoaXMgYFNldGAuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc2V0IGJlaGF2ZXMgdGhlIHNhbWUgYXMgdGhpcyBzZXQKICAgKiB3aXRoIHJlZ2FyZCB0byBhZGRpbmcgYW5kIHJlbW92aW5nIGVsZW1lbnRzLgogICAqIEl0IGluaXRpYWxseSBjb250YWlucyB0aGUgc2FtZSBlbGVtZW50cy4KICAgKiBJZiB0aGlzIHNldCBzcGVjaWZpZXMgYW4gb3JkZXJpbmcgb2YgdGhlIGVsZW1lbnRzLAogICAqIHRoZSByZXR1cm5lZCBzZXQgd2lsbCBoYXZlIHRoZSBzYW1lIG9yZGVyLgogICAqLwogIFNldDxFPiB0b1NldCgpOwp9CoEKAE5OPAETAQRFA1EwA0tIA0g2GQM8JQNHEkpNA1BMSVBAA1BPRgQ7Bh0FM08/JwVHBiQBBiYFSw8FUAY2AQYzBTQ3SwUoH0kFUVM5BS0sBj8BBiYFUVM5BS0qBj4BBicFSVBJREoFQiQFQ0cFSUkNNgZQJQEGPAVFRkQFQktBFwYUBkcFTzgGHAEGLAYfAQYeBUs7BQ4FHkFBOigyJk4oJyk1BhUBBiYFQjYGJQEGP0MqBh0BBj4FSD4FP0JIKztHEgYbAQY3Bi0BBksFT0xMLwYtAQY7BioBBkMGKgEGRAYsAQZPBUxBBioBBlAFSyIGHgEGSgVMQAYoAQYmBhABSAUzMi44MAYSAgESZGFydDpjb3JlL3NldC5kYXJ0Km9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL3NpbmsuZGFydIMmLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIEEgZ2VuZXJpYyBkZXN0aW5hdGlvbiBmb3IgZGF0YS4KICoKICogTXVsdGlwbGUgZGF0YSB2YWx1ZXMgY2FuIGJlIHB1dCBpbnRvIGEgc2luaywgYW5kIHdoZW4gbm8gbW9yZSBkYXRhIGlzCiAqIGF2YWlsYWJsZSwgdGhlIHNpbmsgc2hvdWxkIGJlIGNsb3NlZC4KICoKICogVGhpcyBpcyBhIGdlbmVyaWMgaW50ZXJmYWNlIHRoYXQgb3RoZXIgZGF0YSByZWNlaXZlcnMgY2FuIGltcGxlbWVudC4KICovCmFic3RyYWN0IGNsYXNzIFNpbms8VD4gewogIC8qKgogICAqIEFkZHMgW2RhdGFdIHRvIHRoZSBzaW5rLgogICAqCiAgICogTXVzdCBub3QgYmUgY2FsbGVkIGFmdGVyIGEgY2FsbCB0byBbY2xvc2VdLgogICAqLwogIHZvaWQgYWRkKFQgZGF0YSk7CgogIC8qKgogICAqIENsb3NlcyB0aGUgc2luay4KICAgKgogICAqIFRoZSBbYWRkXSBtZXRob2QgbXVzdCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoaXMgbWV0aG9kLgogICAqCiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBtb3JlIHRoYW4gb25jZSBpcyBhbGxvd2VkLCBidXQgZG9lcyBub3RoaW5nLgogICAqLwogIHZvaWQgY2xvc2UoKTsKfQohAE5OPAETAQQjA0kpA0gEGQYeBTEGFAEGFgU8BUYGEAIBE2RhcnQ6Y29yZS9zaW5rLmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvc3RhY2t0cmFjZS5kYXJ0h7ovLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQW4gaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGFsbCBzdGFjayB0cmFjZSBvYmplY3RzLgogKgogKiBBIFtTdGFja1RyYWNlXSBpcyBpbnRlbmRlZCB0byBjb252ZXkgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgYWJvdXQgdGhlIGNhbGwKICogc2VxdWVuY2UgdGhhdCB0cmlnZ2VyZWQgYW4gZXhjZXB0aW9uLgogKgogKiBUaGVzZSBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IHRoZSBydW50aW1lLCBpdCBpcyBub3QgcG9zc2libGUgdG8gY3JlYXRlCiAqIHRoZW0gcHJvZ3JhbW1hdGljYWxseS4KICovCmFic3RyYWN0IGNsYXNzIFN0YWNrVHJhY2UgewogIFN0YWNrVHJhY2UoKTsgLy8gSW4gY2FzZSBleGlzdGluZyBjbGFzc2VzIGV4dGVuZCBTdGFja1RyYWNlLgoKICAvKioKICAgKiBDcmVhdGUgYSBgU3RhY2tUcmFjZWAgb2JqZWN0IGZyb20gW3N0YWNrVHJhY2VTdHJpbmddLgogICAqCiAgICogVGhlIGNyZWF0ZWQgc3RhY2sgdHJhY2Ugd2lsbCBoYXZlIGEgYHRvU3RyaW5nYCBtZXRob2QgcmV0dXJuaW5nCiAgICogYHN0YWNrVHJhY2VTdHJpbmdgLgogICAqCiAgICogVGhlIGBzdGFja1RyYWNlU3RyaW5nYCBjYW4gYmUgYSBzdHJpbmcgcmV0dXJuZWQgYnkgc29tZSBvdGhlcgogICAqIHN0YWNrIHRyYWNlLCBvciBpdCBjYW4gYmUgYW55IHN0cmluZyBhdCBhbGwuCiAgICogSWYgdGhlIHN0cmluZyBkb2Vzbid0IGxvb2sgbGlrZSBhIHN0YWNrIHRyYWNlLCBjb2RlIHRoYXQgaW50ZXJwcmV0cwogICAqIHN0YWNrIHRyYWNlcyBpcyBsaWtlbHkgdG8gZmFpbCwgc28gZmFrZSBzdGFjayB0cmFjZXMgc2hvdWxkIGJlIHVzZWQKICAgKiB3aXRoIGNhcmUuCiAgICovCiAgZmFjdG9yeSBTdGFja1RyYWNlLmZyb21TdHJpbmcoU3RyaW5nIHN0YWNrVHJhY2VTdHJpbmcpID0gX1N0cmluZ1N0YWNrVHJhY2U7CgogIC8qKgogICAqIFJldHVybnMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBzdGFjayB0cmFjZS4KICAgKgogICAqIFRoaXMgaXMgc2ltaWxhciB0byB3aGF0IGNhbiBiZSBhY2hpZXZlZCBieSBkb2luZzoKICAgKgogICAqICAgICB0cnkgeyB0aHJvdyAwOyB9IGNhdGNoIChfLCBzdGFjaykgeyByZXR1cm4gc3RhY2s7IH0KICAgKgogICAqIFRoZSBnZXR0ZXIgYWNoaWV2ZXMgdGhpcyB3aXRob3V0IHRocm93aW5nLCBleGNlcHQgb24gcGxhdGZvcm1zIHRoYXQKICAgKiBoYXZlIG5vIG90aGVyIHdheSB0byBnZXQgYSBzdGFjayB0cmFjZS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgU3RhY2tUcmFjZSBnZXQgY3VycmVudDsKCiAgLyoqCiAgICogUmV0dXJucyBhIFtTdHJpbmddIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdGFjayB0cmFjZS4KICAgKgogICAqIFRoZSBzdHJpbmcgcmVwcmVzZW50cyB0aGUgZnVsbCBzdGFjayB0cmFjZSBzdGFydGluZyBmcm9tCiAgICogdGhlIHBvaW50IHdoZXJlIGEgdGhyb3cgb2NjdXJyZWQgdG8gdGhlIHRvcCBvZiB0aGUgY3VycmVudCBjYWxsIHNlcXVlbmNlLgogICAqCiAgICogVGhlIGV4YWN0IGZvcm1hdCBvZiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlzIG5vdCBmaW5hbC4KICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKTsKfQoKY2xhc3MgX1N0cmluZ1N0YWNrVHJhY2UgaW1wbGVtZW50cyBTdGFja1RyYWNlIHsKICBmaW5hbCBTdHJpbmcgX3N0YWNrVHJhY2U7CiAgX1N0cmluZ1N0YWNrVHJhY2UodGhpcy5fc3RhY2tUcmFjZSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX3N0YWNrVHJhY2U7Cn0KPgBOTjwBEwEEOANPKQNKGgQcPwEGOwVFGQVDMklJEAZOAQY6BTcFPQVJLQYqAQY7BT5PBUEGFQIBMBwnJAIBGWRhcnQ6Y29yZS9zdGFja3RyYWNlLmRhcnQvb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvc3RvcHdhdGNoLmRhcnSMAi8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBBIHNpbXBsZSBzdG9wd2F0Y2ggaW50ZXJmYWNlIHRvIG1lYXN1cmUgZWxhcHNlZCB0aW1lLgogKi8KY2xhc3MgU3RvcHdhdGNoIHsKICAvKioKICAgKiBDYWNoZWQgZnJlcXVlbmN5IG9mIHRoZSBzeXN0ZW0gaW4gSHogKHRpY2tzIHBlciBzZWNvbmQpLgogICAqCiAgICogTXVzdCBiZSBpbml0aWFsaXplZCBpbiBbX2luaXRUaWNrZXJdOwogICAqLwogIHN0YXRpYyBpbnQgX2ZyZXF1ZW5jeTsKCiAgLy8gVGhlIF9zdGFydCBhbmQgX3N0b3AgZmllbGRzIGNhcHR1cmUgdGhlIHRpbWUgd2hlbiBbc3RhcnRdIGFuZCBbc3RvcF0KICAvLyBhcmUgY2FsbGVkIHJlc3BlY3RpdmVseS4KICAvLyBJZiBfc3RvcCBpcyBudWxsLCB0aGUgc3RvcHdhdGNoIGlzIHJ1bm5pbmcuCiAgaW50IF9zdGFydCA9IDA7CiAgaW50IF9zdG9wID0gMDsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtTdG9wd2F0Y2hdIGluIHN0b3BwZWQgc3RhdGUgd2l0aCBhIHplcm8gZWxhcHNlZCBjb3VudC4KICAgKgogICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gc3RhcnQgYSBbU3RvcHdhdGNoXQogICAqIGltbWVkaWF0ZWx5IGFmdGVyIGFsbG9jYXRpb24uCiAgICogYGBgCiAgICogdmFyIHN0b3B3YXRjaCA9IG5ldyBTdG9wd2F0Y2goKS4uc3RhcnQoKTsKICAgKiBgYGAKICAgKi8KICBTdG9wd2F0Y2goKSB7CiAgICBpZiAoX2ZyZXF1ZW5jeSA9PSBudWxsKSBfaW5pdFRpY2tlcigpOwogIH0KCiAgLyoqCiAgICogRnJlcXVlbmN5IG9mIHRoZSBlbGFwc2VkIGNvdW50ZXIgaW4gSHouCiAgICovCiAgaW50IGdldCBmcmVxdWVuY3kgPT4gX2ZyZXF1ZW5jeTsKCiAgLyoqCiAgICogU3RhcnRzIHRoZSBbU3RvcHdhdGNoXS4KICAgKgogICAqIFRoZSBbZWxhcHNlZF0gY291bnQgaXMgaW5jcmVhc2luZyBtb25vdG9uaWNhbGx5LiBJZiB0aGUgW1N0b3B3YXRjaF0gaGFzCiAgICogYmVlbiBzdG9wcGVkLCB0aGVuIGNhbGxpbmcgc3RhcnQgYWdhaW4gcmVzdGFydHMgaXQgd2l0aG91dCByZXNldHRpbmcgdGhlCiAgICogW2VsYXBzZWRdIGNvdW50LgogICAqCiAgICogSWYgdGhlIFtTdG9wd2F0Y2hdIGlzIGN1cnJlbnRseSBydW5uaW5nLCB0aGVuIGNhbGxpbmcgc3RhcnQgZG9lcyBub3RoaW5nLgogICAqLwogIHZvaWQgc3RhcnQoKSB7CiAgICBpZiAoX3N0b3AgIT0gbnVsbCkgewogICAgICAvLyAoUmUpc3RhcnQgdGhpcyBzdG9wd2F0Y2guCiAgICAgIC8vIERvbid0IGNvdW50IHRoZSB0aW1lIHdoaWxlIHRoZSBzdG9wd2F0Y2ggaGFzIGJlZW4gc3RvcHBlZC4KICAgICAgX3N0YXJ0ICs9IF9ub3coKSAtIF9zdG9wOwogICAgICBfc3RvcCA9IG51bGw7CiAgICB9CiAgfQoKICAvKioKICAgKiBTdG9wcyB0aGUgW1N0b3B3YXRjaF0uCiAgICoKICAgKiBUaGUgW2VsYXBzZWRUaWNrc10gY291bnQgc3RvcHMgaW5jcmVhc2luZyBhZnRlciB0aGlzIGNhbGwuIElmIHRoZQogICAqIFtTdG9wd2F0Y2hdIGlzIGN1cnJlbnRseSBub3QgcnVubmluZywgdGhlbiBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBubwogICAqIGVmZmVjdC4KICAgKi8KICB2b2lkIHN0b3AoKSB7CiAgICBfc3RvcCA/Pz0gX25vdygpOwogIH0KCiAgLyoqCiAgICogUmVzZXRzIHRoZSBbZWxhcHNlZF0gY291bnQgdG8gemVyby4KICAgKgogICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHN0b3Agb3Igc3RhcnQgdGhlIFtTdG9wd2F0Y2hdLgogICAqLwogIHZvaWQgcmVzZXQoKSB7CiAgICBfc3RhcnQgPSBfc3RvcCA/PyBfbm93KCk7CiAgfQoKICAvKioKICAgKiBUaGUgZWxhcHNlZCBudW1iZXIgb2YgY2xvY2sgdGlja3Mgc2luY2UgY2FsbGluZyBbc3RhcnRdIHdoaWxlIHRoZQogICAqIFtTdG9wd2F0Y2hdIGlzIHJ1bm5pbmcuCiAgICoKICAgKiBUaGlzIGlzIHRoZSBlbGFwc2VkIG51bWJlciBvZiBjbG9jayB0aWNrcyBiZXR3ZWVuIGNhbGxpbmcgW3N0YXJ0XSBhbmQKICAgKiBjYWxsaW5nIFtzdG9wXS4KICAgKgogICAqIElzIDAgaWYgdGhlIFtTdG9wd2F0Y2hdIGhhcyBuZXZlciBiZWVuIHN0YXJ0ZWQuCiAgICoKICAgKiBUaGUgZWxhcHNlZCBudW1iZXIgb2YgY2xvY2sgdGlja3MgaW5jcmVhc2VzIGJ5IFtmcmVxdWVuY3ldIGV2ZXJ5IHNlY29uZC4KICAgKi8KICBpbnQgZ2V0IGVsYXBzZWRUaWNrcyB7CiAgICByZXR1cm4gKF9zdG9wID8/IF9ub3coKSkgLSBfc3RhcnQ7CiAgfQoKICAvKioKICAgKiBUaGUgW2VsYXBzZWRUaWNrc10gY291bnRlciBjb252ZXJ0ZWQgdG8gYSBbRHVyYXRpb25dLgogICAqLwogIER1cmF0aW9uIGdldCBlbGFwc2VkIHsKICAgIHJldHVybiBEdXJhdGlvbihtaWNyb3NlY29uZHM6IGVsYXBzZWRNaWNyb3NlY29uZHMpOwogIH0KCiAgLyoqCiAgICogVGhlIFtlbGFwc2VkVGlja3NdIGNvdW50ZXIgY29udmVydGVkIHRvIG1pY3Jvc2Vjb25kcy4KICAgKi8KICBleHRlcm5hbCBpbnQgZ2V0IGVsYXBzZWRNaWNyb3NlY29uZHM7CgogIC8qKgogICAqIFRoZSBbZWxhcHNlZFRpY2tzXSBjb3VudGVyIGNvbnZlcnRlZCB0byBtaWxsaXNlY29uZHMuCiAgICovCiAgZXh0ZXJuYWwgaW50IGdldCBlbGFwc2VkTWlsbGlzZWNvbmRzOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBbU3RvcHdhdGNoXSBpcyBjdXJyZW50bHkgcnVubmluZy4KICAgKi8KICBib29sIGdldCBpc1J1bm5pbmcgPT4gX3N0b3AgPT0gbnVsbDsKCiAgLyoqCiAgICogSW5pdGlhbGl6ZXMgdGhlIHRpbWUtbWVhc3VyaW5nIHN5c3RlbS4gKk11c3QqIGluaXRpYWxpemUgdGhlIFtfZnJlcXVlbmN5XQogICAqIHZhcmlhYmxlLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyB2b2lkIF9pbml0VGlja2VyKCk7CiAgZXh0ZXJuYWwgc3RhdGljIGludCBfbm93KCk7Cn0KfQBOTjwBEwEEOQQSBj4FKwYZAUoeMRIRAQZHBTwjCS8JBhArBAEGLQYjAQYdBU1OFgVPBhEZI0QgFAYEAQYcBUdLDQYQFgQBBikFOQYRHgQBBkcdBUsVBTUFTgYZJwQBBjsGGTgEAQY7BigBBjsGKAEGMwYnAQZPDwYmHgIBGGRhcnQ6Y29yZS9zdG9wd2F0Y2guZGFydDRvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3N0b3B3YXRjaF9wYXRjaC5kYXJ0hyIvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBTdG9wd2F0Y2ggewogIHN0YXRpYyBjb25zdCBfbWF4SW50ID0gMHg3RkZGRkZGRkZGRkZGRkZGOwoKICBAcGF0Y2gKICBzdGF0aWMgdm9pZCBfaW5pdFRpY2tlcigpIHsKICAgIGlmIChfZnJlcXVlbmN5ID09IG51bGwpIHsKICAgICAgX2ZyZXF1ZW5jeSA9IF9jb21wdXRlRnJlcXVlbmN5KCk7CiAgICB9CiAgfQoKICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGNsb2NrIHRpY2suCiAgQHBhdGNoCiAgc3RhdGljIGludCBfbm93KCkgbmF0aXZlICJTdG9wd2F0Y2hfbm93IjsKCiAgLy8gUmV0dXJucyB0aGUgZnJlcXVlbmN5IG9mIGNsb2NrIHRpY2tzIGluIEh6LgogIHN0YXRpYyBpbnQgX2NvbXB1dGVGcmVxdWVuY3koKSBuYXRpdmUgIlN0b3B3YXRjaF9mcmVxdWVuY3kiOwoKICBAcGF0Y2gKICBpbnQgZ2V0IGVsYXBzZWRNaWNyb3NlY29uZHMgewogICAgaW50IHRpY2tzID0gZWxhcHNlZFRpY2tzOwogICAgLy8gU3BlY2lhbCBjYXNlIHRoZSBtb3JlIGxpa2VseSBmcmVxdWVuY2llcyB0byBhdm9pZCBkaXZpc2lvbiwKICAgIC8vIG9yIGRpdmlkZSBieSBhIGtub3duIHZhbHVlLgogICAgaWYgKF9mcmVxdWVuY3kgPT0gMTAwMDAwMDAwMCkgcmV0dXJuIHRpY2tzIH4vIDEwMDA7CiAgICBpZiAoX2ZyZXF1ZW5jeSA9PSAxMDAwMDAwKSByZXR1cm4gdGlja3M7CiAgICBpZiAoX2ZyZXF1ZW5jeSA9PSAxMDAwKSByZXR1cm4gdGlja3MgKiAxMDAwOwogICAgaWYgKHRpY2tzIDw9IChfbWF4SW50IH4vIDEwMDAwMDApKSB7CiAgICAgIHJldHVybiAodGlja3MgKiAxMDAwMDAwKSB+LyBfZnJlcXVlbmN5OwogICAgfQogICAgLy8gTXVsdGlwbGljYXRpb24gd291bGQgaGF2ZSBvdmVyZmxvd2VkLgogICAgaW50IHRpY2tzUGVyU2Vjb25kID0gdGlja3Mgfi8gX2ZyZXF1ZW5jeTsKICAgIGludCByZW1haW5pbmdUaWNrcyA9IHRpY2tzLnJlbWFpbmRlcihfZnJlcXVlbmN5KTsKICAgIHJldHVybiB0aWNrc1BlclNlY29uZCAqIDEwMDAwMDAgKyAocmVtYWluaW5nVGlja3MgKiAxMDAwMDAwKSB+LyBfZnJlcXVlbmN5OwogIH0KCiAgQHBhdGNoCiAgaW50IGdldCBlbGFwc2VkTWlsbGlzZWNvbmRzIHsKICAgIGludCB0aWNrcyA9IGVsYXBzZWRUaWNrczsKICAgIGlmIChfZnJlcXVlbmN5ID09IDEwMDAwMDAwMDApIHJldHVybiB0aWNrcyB+LyAxMDAwMDAwOwogICAgaWYgKF9mcmVxdWVuY3kgPT0gMTAwMDAwMCkgcmV0dXJuIHRpY2tzIH4vIDEwMDA7CiAgICBpZiAoX2ZyZXF1ZW5jeSA9PSAxMDAwKSByZXR1cm4gdGlja3M7CiAgICBpZiAodGlja3MgPD0gKF9tYXhJbnQgfi8gMTAwMCkpIHsKICAgICAgcmV0dXJuICh0aWNrcyAqIDEwMDApIH4vIF9mcmVxdWVuY3k7CiAgICB9CiAgICAvLyBNdWx0aXBsaWNhdGlvbiB3b3VsZCBoYXZlIG92ZXJmbG93ZWQuCiAgICBpbnQgdGlja3NQZXJTZWNvbmQgPSB0aWNrcyB+LyBfZnJlcXVlbmN5OwogICAgaW50IHJlbWFpbmluZ1RpY2tzID0gdGlja3MucmVtYWluZGVyKF9mcmVxdWVuY3kpOwogICAgcmV0dXJuIHRpY2tzUGVyU2Vjb25kICogMTAwMCArIChyZW1haW5pbmdUaWNrcyAqIDEwMDApIH4vIF9mcmVxdWVuY3k7CiAgfQp9CjoATk48AR4BBxItAQkeHigGBAElCSwBMT8BCSAeQyM4LTEpLgYtLjZQBAEJIB47NSomKwYtLjZKBAIBJGRhcnQ6Y29yZS1wYXRjaC9zdG9wd2F0Y2hfcGF0Y2guZGFydCxvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9zdHJpbmcuZGFydMAAcfQvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQSBzZXF1ZW5jZSBvZiBVVEYtMTYgY29kZSB1bml0cy4KICoKICogU3RyaW5ncyBhcmUgbWFpbmx5IHVzZWQgdG8gcmVwcmVzZW50IHRleHQuIEEgY2hhcmFjdGVyIG1heSBiZSByZXByZXNlbnRlZCBieQogKiBtdWx0aXBsZSBjb2RlIHBvaW50cywgZWFjaCBjb2RlIHBvaW50IGNvbnNpc3Rpbmcgb2Ygb25lIG9yIHR3byBjb2RlCiAqIHVuaXRzLiBGb3IgZXhhbXBsZSB0aGUgUGFwdWEgTmV3IEd1aW5lYSBmbGFnIGNoYXJhY3RlciByZXF1aXJlcyBmb3VyIGNvZGUKICogdW5pdHMgdG8gcmVwcmVzZW50IHR3byBjb2RlIHBvaW50cywgYnV0IHNob3VsZCBiZSB0cmVhdGVkIGxpa2UgYSBzaW5nbGUKICogY2hhcmFjdGVyOiAi8J+HtfCfh6wiLiBQbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUgZmxhZyBjaGFyYWN0ZXIgbWF5IHNob3cKICogdGhlIGxldHRlcnMgIlBHIiBpbnN0ZWFkLiBJZiB0aGUgY29kZSBwb2ludHMgYXJlIHN3YXBwZWQsIGl0IGluc3RlYWQgYmVjb21lcwogKiB0aGUgR3VhZGVsb3VwZSBmbGFnICLwn4es8J+HtSIgKCJHUCIpLgogKgogKiBBIHN0cmluZyBjYW4gYmUgZWl0aGVyIHNpbmdsZSBvciBtdWx0aWxpbmUuIFNpbmdsZSBsaW5lIHN0cmluZ3MgYXJlCiAqIHdyaXR0ZW4gdXNpbmcgbWF0Y2hpbmcgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMsIGFuZCBtdWx0aWxpbmUgc3RyaW5ncyBhcmUKICogd3JpdHRlbiB1c2luZyB0cmlwbGUgcXVvdGVzLiBUaGUgZm9sbG93aW5nIGFyZSBhbGwgdmFsaWQgRGFydCBzdHJpbmdzOgogKgogKiAgICAgJ1NpbmdsZSBxdW90ZXMnOwogKiAgICAgIkRvdWJsZSBxdW90ZXMiOwogKiAgICAgJ0RvdWJsZSBxdW90ZXMgaW4gInNpbmdsZSIgcXVvdGVzJzsKICogICAgICJTaW5nbGUgcXVvdGVzIGluICdkb3VibGUnIHF1b3RlcyI7CiAqCiAqICAgICAnJydBCiAqICAgICBtdWx0aWxpbmUKICogICAgIHN0cmluZycnJzsKICoKICogICAgICIiIgogKiAgICAgQW5vdGhlcgogKiAgICAgbXVsdGlsaW5lCiAqICAgICBzdHJpbmciIiI7CiAqCiAqIFN0cmluZ3MgYXJlIGltbXV0YWJsZS4gQWx0aG91Z2ggeW91IGNhbm5vdCBjaGFuZ2UgYSBzdHJpbmcsIHlvdSBjYW4gcGVyZm9ybQogKiBhbiBvcGVyYXRpb24gb24gYSBzdHJpbmcgYW5kIGFzc2lnbiB0aGUgcmVzdWx0IHRvIGEgbmV3IHN0cmluZzoKICoKICogICAgIHZhciBzdHJpbmcgPSAnRGFydCBpcyBmdW4nOwogKiAgICAgdmFyIG5ld1N0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcoMCwgNSk7CiAqCiAqIFlvdSBjYW4gdXNlIHRoZSBwbHVzIChgK2ApIG9wZXJhdG9yIHRvIGNvbmNhdGVuYXRlIHN0cmluZ3M6CiAqCiAqICAgICAnRGFydCAnICsgJ2lzICcgKyAnZnVuISc7IC8vICdEYXJ0IGlzIGZ1biEnCiAqCiAqIFlvdSBjYW4gYWxzbyB1c2UgYWRqYWNlbnQgc3RyaW5nIGxpdGVyYWxzIGZvciBjb25jYXRlbmF0aW9uOgogKgogKiAgICAgJ0RhcnQgJyAnaXMgJyAnZnVuISc7ICAgIC8vICdEYXJ0IGlzIGZ1biEnCiAqCiAqIFlvdSBjYW4gdXNlIGAke31gIHRvIGludGVycG9sYXRlIHRoZSB2YWx1ZSBvZiBEYXJ0IGV4cHJlc3Npb25zCiAqIHdpdGhpbiBzdHJpbmdzLiBUaGUgY3VybHkgYnJhY2VzIGNhbiBiZSBvbWl0dGVkIHdoZW4gZXZhbHVhdGluZyBpZGVudGlmaWVyczoKICoKICogICAgIHN0cmluZyA9ICdkYXJ0bGFuZyc7CiAqICAgICAnJHN0cmluZyBoYXMgJHtzdHJpbmcubGVuZ3RofSBsZXR0ZXJzJzsgLy8gJ2RhcnRsYW5nIGhhcyA4IGxldHRlcnMnCiAqCiAqIEEgc3RyaW5nIGlzIHJlcHJlc2VudGVkIGJ5IGEgc2VxdWVuY2Ugb2YgVW5pY29kZSBVVEYtMTYgY29kZSB1bml0cwogKiBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIFtjb2RlVW5pdEF0XSBvciB0aGUgW2NvZGVVbml0c10gbWVtYmVyczoKICoKICogICAgIHN0cmluZyA9ICdEYXJ0JzsKICogICAgIHN0cmluZy5jb2RlVW5pdEF0KDApOyAvLyA2OAogKiAgICAgc3RyaW5nLmNvZGVVbml0czsgICAgIC8vIFs2OCwgOTcsIDExNCwgMTE2XQogKgogKiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGNvZGUgdW5pdHMgaXMgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBpbmRleAogKiBvcGVyYXRvcjoKICoKICogICAgIHN0cmluZ1swXTsgICAgICAgICAgICAvLyAnRCcKICoKICogVGhlIGNoYXJhY3RlcnMgb2YgYSBzdHJpbmcgYXJlIGVuY29kZWQgaW4gVVRGLTE2LiBEZWNvZGluZyBVVEYtMTYsIHdoaWNoCiAqIGNvbWJpbmVzIHN1cnJvZ2F0ZSBwYWlycywgeWllbGRzIFVuaWNvZGUgY29kZSBwb2ludHMuIEZvbGxvd2luZyBhIHNpbWlsYXIKICogdGVybWlub2xvZ3kgdG8gR28sIHdlIHVzZSB0aGUgbmFtZSAncnVuZScgZm9yIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIGEKICogVW5pY29kZSBjb2RlIHBvaW50LiBVc2UgdGhlIFtydW5lc10gcHJvcGVydHkgdG8gZ2V0IHRoZSBydW5lcyBvZiBhIHN0cmluZzoKICoKICogICAgIHN0cmluZy5ydW5lcy50b0xpc3QoKTsgLy8gWzY4LCA5NywgMTE0LCAxMTZdCiAqCiAqIEZvciBhIGNoYXJhY3RlciBvdXRzaWRlIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUgKHBsYW5lIDApIHRoYXQgaXMKICogY29tcG9zZWQgb2YgYSBzdXJyb2dhdGUgcGFpciwgW3J1bmVzXSBjb21iaW5lcyB0aGUgcGFpciBhbmQgcmV0dXJucyBhCiAqIHNpbmdsZSBpbnRlZ2VyLiAgRm9yIGV4YW1wbGUsIHRoZSBVbmljb2RlIGNoYXJhY3RlciBmb3IgYQogKiBtdXNpY2FsIEctY2xlZiAoJ/CdhJ4nKSB3aXRoIHJ1bmUgdmFsdWUgMHgxRDExRSBjb25zaXN0cyBvZiBhIFVURi0xNiBzdXJyb2dhdGUKICogcGFpcjogYDB4RDgzNGAgYW5kIGAweEREMUVgLiBVc2luZyBbY29kZVVuaXRzXSByZXR1cm5zIHRoZSBzdXJyb2dhdGUgcGFpciwKICogYW5kIHVzaW5nIGBydW5lc2AgcmV0dXJucyB0aGVpciBjb21iaW5lZCB2YWx1ZToKICoKICogICAgIHZhciBjbGVmID0gJ1x1ezFEMTFFfSc7CiAqICAgICBjbGVmLmNvZGVVbml0czsgICAgICAgICAvLyBbMHhEODM0LCAweEREMUVdCiAqICAgICBjbGVmLnJ1bmVzLnRvTGlzdCgpOyAgICAvLyBbMHgxRDExRV0KICoKICogVGhlIFN0cmluZyBjbGFzcyBjYW4gbm90IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLiBBdHRlbXB0aW5nIHRvIGRvIHNvCiAqIHlpZWxkcyBhIGNvbXBpbGUtdGltZSBlcnJvci4KICoKICogIyMgT3RoZXIgcmVzb3VyY2VzCiAqCiAqIFNlZSBbU3RyaW5nQnVmZmVyXSB0byBlZmZpY2llbnRseSBidWlsZCBhIHN0cmluZyBpbmNyZW1lbnRhbGx5LiBTZWUKICogW1JlZ0V4cF0gdG8gd29yayB3aXRoIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCiAqCiAqIEFsc28gc2VlOgogKgogKiAqIFtEYXJ0IENvb2tib29rXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9jb29rYm9vay8jc3RyaW5ncykKICogICBmb3IgU3RyaW5nIGV4YW1wbGVzIGFuZCByZWNpcGVzLgogKiAqIFtEYXJ0IFVwIGFuZCBSdW5uaW5nXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NoMDMuaHRtbCNzdHJpbmdzLWFuZC1yZWd1bGFyLWV4cHJlc3Npb25zKQogKi8KYWJzdHJhY3QgY2xhc3MgU3RyaW5nIGltcGxlbWVudHMgQ29tcGFyYWJsZTxTdHJpbmc+LCBQYXR0ZXJuIHsKICAvKioKICAgKiBBbGxvY2F0ZXMgYSBuZXcgU3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIFtjaGFyQ29kZXNdLgogICAqCiAgICogVGhlIFtjaGFyQ29kZXNdIGNhbiBiZSBVVEYtMTYgY29kZSB1bml0cyBvciBydW5lcy4gSWYgYSBjaGFyLWNvZGUgdmFsdWUgaXMKICAgKiAxNi1iaXQsIGl0IGlzIGNvcGllZCB2ZXJiYXRpbToKICAgKgogICAqICAgICBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoWzY4XSk7IC8vICdEJwogICAqCiAgICogSWYgYSBjaGFyLWNvZGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDE2LWJpdHMsIGl0IGlzIGRlY29tcG9zZWQgaW50byBhCiAgICogc3Vycm9nYXRlIHBhaXI6CiAgICoKICAgKiAgICAgdmFyIGNsZWYgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoWzB4MUQxMUVdKTsKICAgKiAgICAgY2xlZi5jb2RlVW5pdEF0KDApOyAvLyAweEQ4MzQKICAgKiAgICAgY2xlZi5jb2RlVW5pdEF0KDEpOyAvLyAweEREMUUKICAgKgogICAqIElmIFtzdGFydF0gYW5kIFtlbmRdIGlzIHByb3ZpZGVkLCBvbmx5IHRoZSB2YWx1ZXMgb2YgW2NoYXJDb2Rlc10KICAgKiBhdCBwb3NpdGlvbnMgZnJvbSBgc3RhcnRgIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAsIGFyZSB1c2VkLgogICAqIFRoZSBgc3RhcnRgIGFuZCBgZW5kYCB2YWx1ZXMgbXVzdCBzYXRpc2Z5CiAgICogYDAgPD0gc3RhcnQgPD0gZW5kIDw9IGNoYXJDb2Rlcy5sZW5ndGhgLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgU3RyaW5nLmZyb21DaGFyQ29kZXMoSXRlcmFibGU8aW50PiBjaGFyQ29kZXMsCiAgICAgIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSk7CgogIC8qKgogICAqIEFsbG9jYXRlcyBhIG5ldyBTdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgW2NoYXJDb2RlXS4KICAgKgogICAqIElmIHRoZSBbY2hhckNvZGVdIGNhbiBiZSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBVVEYtMTYgY29kZSB1bml0LCB0aGUgbmV3CiAgICogc3RyaW5nIGNvbnRhaW5zIGEgc2luZ2xlIGNvZGUgdW5pdC4gT3RoZXJ3aXNlLCB0aGUgW2xlbmd0aF0gaXMgMiBhbmQKICAgKiB0aGUgY29kZSB1bml0cyBmb3JtIGEgc3Vycm9nYXRlIHBhaXIuIFNlZSBkb2N1bWVudGF0aW9uIGZvcgogICAqIFtmcm9tQ2hhckNvZGVzXS4KICAgKgogICAqIENyZWF0aW5nIGEgU3RyaW5nIHdpdGggaGFsZiBvZiBhIHN1cnJvZ2F0ZSBwYWlyIGlzIGFsbG93ZWQuCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBTdHJpbmcuZnJvbUNoYXJDb2RlKGludCBjaGFyQ29kZSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgZGVjbGFyYXRpb24gW25hbWVdLgogICAqCiAgICogRW52aXJvbm1lbnQgZGVjbGFyYXRpb25zIGFyZSBwcm92aWRlZCBieSB0aGUgc3Vycm91bmRpbmcgc3lzdGVtIGNvbXBpbGluZwogICAqIG9yIHJ1bm5pbmcgdGhlIERhcnQgcHJvZ3JhbS4gRGVjbGFyYXRpb25zIG1hcCBhIHN0cmluZyBrZXkgdG8gYSBzdHJpbmcKICAgKiB2YWx1ZS4KICAgKgogICAqIElmIFtuYW1lXSBpcyBub3QgZGVjbGFyZWQgaW4gdGhlIGVudmlyb25tZW50LCB0aGUgcmVzdWx0IGlzIGluc3RlYWQKICAgKiBbZGVmYXVsdFZhbHVlXS4KICAgKgogICAqIEV4YW1wbGUgb2YgZ2V0dGluZyBhIHZhbHVlOgogICAqCiAgICogICAgIGNvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnQoImRlZmF1bHRGbG9vIiwgZGVmYXVsdFZhbHVlOiAibm8gZmxvbyIpCiAgICoKICAgKiBFeGFtcGxlIG9mIGNoZWNraW5nIHdoZXRoZXIgYSBkZWNsYXJhdGlvbiBpcyB0aGVyZSBhdCBhbGw6CiAgICoKICAgKiAgICAgdmFyIGlzRGVjbGFyZWQgPSBjb25zdCBTdHJpbmcuZnJvbUVudmlyb25tZW50KCJtYXliZURlY2xhcmVkIikgIT0gbnVsbDsKICAgKi8KICAvLyBUaGUgLmZyb21FbnZpcm9ubWVudCgpIGNvbnN0cnVjdG9ycyBhcmUgc3BlY2lhbCBpbiB0aGF0IHdlIGRvIG5vdCB3YW50CiAgLy8gdXNlcnMgdG8gY2FsbCB0aGVtIHVzaW5nICJuZXciLiBXZSBwcm9oaWJpdCB0aGF0IGJ5IGdpdmluZyB0aGVtIGJvZGllcwogIC8vIHRoYXQgdGhyb3csIGV2ZW4gdGhvdWdoIGNvbnN0IGNvbnN0cnVjdG9ycyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBib2RpZXMuCiAgLy8gRGlzYWJsZSB0aG9zZSBzdGF0aWMgZXJyb3JzLgogIC8vaWdub3JlOiBjb25zdF9jb25zdHJ1Y3Rvcl93aXRoX2JvZHkKICAvL2lnbm9yZTogY29uc3RfZmFjdG9yeQogIGV4dGVybmFsIGNvbnN0IGZhY3RvcnkgU3RyaW5nLmZyb21FbnZpcm9ubWVudChTdHJpbmcgbmFtZSwKICAgICAge1N0cmluZyBkZWZhdWx0VmFsdWV9KTsKCiAgLyoqCiAgICogR2V0cyB0aGUgY2hhcmFjdGVyIChhcyBhIHNpbmdsZS1jb2RlLXVuaXQgW1N0cmluZ10pIGF0IHRoZSBnaXZlbiBbaW5kZXhdLgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmluZyByZXByZXNlbnRzIGV4YWN0bHkgb25lIFVURi0xNiBjb2RlIHVuaXQsIHdoaWNoIG1heSBiZQogICAqIGhhbGYgb2YgYSBzdXJyb2dhdGUgcGFpci4gQSBzaW5nbGUgbWVtYmVyIG9mIGEgc3Vycm9nYXRlIHBhaXIgaXMgYW4KICAgKiBpbnZhbGlkIFVURi0xNiBzdHJpbmc6CiAgICoKICAgKiAgICAgdmFyIGNsZWYgPSAnXHV7MUQxMUV9JzsKICAgKiAgICAgLy8gVGhlc2UgcmVwcmVzZW50IGludmFsaWQgVVRGLTE2IHN0cmluZ3MuCiAgICogICAgIGNsZWZbMF0uY29kZVVuaXRzOyAgICAgIC8vIFsweEQ4MzRdCiAgICogICAgIGNsZWZbMV0uY29kZVVuaXRzOyAgICAgIC8vIFsweEREMUVdCiAgICoKICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCiAgICogYG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuY29kZVVuaXRBdChpbmRleCkpYC4KICAgKi8KICBTdHJpbmcgb3BlcmF0b3IgW10oaW50IGluZGV4KTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgMTYtYml0IFVURi0xNiBjb2RlIHVuaXQgYXQgdGhlIGdpdmVuIFtpbmRleF0uCiAgICovCiAgaW50IGNvZGVVbml0QXQoaW50IGluZGV4KTsKCiAgLyoqCiAgICogVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLgogICAqCiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIFVURi0xNiBjb2RlIHVuaXRzIGluIHRoaXMgc3RyaW5nLiBUaGUgbnVtYmVyCiAgICogb2YgW3J1bmVzXSBtaWdodCBiZSBmZXdlciwgaWYgdGhlIHN0cmluZyBjb250YWlucyBjaGFyYWN0ZXJzIG91dHNpZGUKICAgKiB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIChwbGFuZSAwKToKICAgKgogICAqICAgICAnRGFydCcubGVuZ3RoOyAgICAgICAgICAvLyA0CiAgICogICAgICdEYXJ0Jy5ydW5lcy5sZW5ndGg7ICAgIC8vIDQKICAgKgogICAqICAgICB2YXIgY2xlZiA9ICdcdXsxRDExRX0nOwogICAqICAgICBjbGVmLmxlbmd0aDsgICAgICAgICAgICAvLyAyCiAgICogICAgIGNsZWYucnVuZXMubGVuZ3RoOyAgICAgIC8vIDEKICAgKi8KICBpbnQgZ2V0IGxlbmd0aDsKCiAgLyoqCiAgICogUmV0dXJucyBhIGhhc2ggY29kZSBkZXJpdmVkIGZyb20gdGhlIGNvZGUgdW5pdHMgb2YgdGhlIHN0cmluZy4KICAgKgogICAqIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIFtvcGVyYXRvciA9PV0uIFN0cmluZ3Mgd2l0aCB0aGUgc2FtZSBzZXF1ZW5jZQogICAqIG9mIGNvZGUgdW5pdHMgaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUuCiAgICovCiAgaW50IGdldCBoYXNoQ29kZTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIG90aGVyIGlzIGEgYFN0cmluZ2Agd2l0aCB0aGUgc2FtZSBzZXF1ZW5jZSBvZiBjb2RlIHVuaXRzLgogICAqCiAgICogVGhpcyBtZXRob2QgY29tcGFyZXMgZWFjaCBpbmRpdmlkdWFsIGNvZGUgdW5pdCBvZiB0aGUgc3RyaW5ncy4KICAgKiBJdCBkb2VzIG5vdCBjaGVjayBmb3IgVW5pY29kZSBlcXVpdmFsZW5jZS4KICAgKiBGb3IgZXhhbXBsZSwgYm90aCB0aGUgZm9sbG93aW5nIHN0cmluZ3MgcmVwcmVzZW50IHRoZSBzdHJpbmcgJ0Ftw6lsaWUnLAogICAqIGJ1dCBkdWUgdG8gdGhlaXIgZGlmZmVyZW50IGVuY29kaW5nLCBhcmUgbm90IGVxdWFsOgogICAqCiAgICogICAgICdBbVx4ZTlsaWUnID09ICdBbWVcdXszMDF9bGllJzsgLy8gZmFsc2UKICAgKgogICAqIFRoZSBmaXJzdCBzdHJpbmcgZW5jb2RlcyAnw6knIGFzIGEgc2luZ2xlIHVuaWNvZGUgY29kZSB1bml0IChhbHNvCiAgICogYSBzaW5nbGUgcnVuZSksIHdoZXJlYXMgdGhlIHNlY29uZCBzdHJpbmcgZW5jb2RlcyBpdCBhcyAnZScgd2l0aCB0aGUKICAgKiBjb21iaW5pbmcgYWNjZW50IGNoYXJhY3RlciAn4peMzIEnLgogICAqLwogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKTsKCiAgLyoqCiAgICogQ29tcGFyZXMgdGhpcyBzdHJpbmcgdG8gW290aGVyXS4KICAgKgogICAqIFJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZSBpZiBgdGhpc2AgaXMgb3JkZXJlZCBiZWZvcmUgYG90aGVyYCwKICAgKiBhIHBvc2l0aXZlIHZhbHVlIGlmIGB0aGlzYCBpcyBvcmRlcmVkIGFmdGVyIGBvdGhlcmAsCiAgICogb3IgemVybyBpZiBgdGhpc2AgYW5kIGBvdGhlcmAgYXJlIGVxdWl2YWxlbnQuCiAgICoKICAgKiBUaGUgb3JkZXJpbmcgaXMgdGhlIHNhbWUgYXMgdGhlIG9yZGVyaW5nIG9mIHRoZSBjb2RlIHBvaW50cyBhdCB0aGUgZmlyc3QKICAgKiBwb3NpdGlvbiB3aGVyZSB0aGUgdHdvIHN0cmluZ3MgZGlmZmVyLgogICAqIElmIG9uZSBzdHJpbmcgaXMgYSBwcmVmaXggb2YgdGhlIG90aGVyLAogICAqIHRoZW4gdGhlIHNob3J0ZXIgc3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlIHRoZSBsb25nZXIgc3RyaW5nLgogICAqIElmIHRoZSBzdHJpbmdzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBjb250ZW50LCB0aGV5IGFyZSBlcXVpdmFsZW50IHdpdGgKICAgKiByZWdhcmQgdG8gdGhlIG9yZGVyaW5nLgogICAqIE9yZGVyaW5nIGRvZXMgbm90IGNoZWNrIGZvciBVbmljb2RlIGVxdWl2YWxlbmNlLgogICAqIFRoZSBjb21wYXJpc29uIGlzIGNhc2Ugc2Vuc2l0aXZlLgogICAqLwogIGludCBjb21wYXJlVG8oU3RyaW5nIG90aGVyKTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RyaW5nIGVuZHMgd2l0aCBbb3RoZXJdLiBGb3IgZXhhbXBsZToKICAgKgogICAqICAgICAnRGFydCcuZW5kc1dpdGgoJ3QnKTsgLy8gdHJ1ZQogICAqLwogIGJvb2wgZW5kc1dpdGgoU3RyaW5nIG90aGVyKTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RyaW5nIHN0YXJ0cyB3aXRoIGEgbWF0Y2ggb2YgW3BhdHRlcm5dLgogICAqCiAgICogICAgIHZhciBzdHJpbmcgPSAnRGFydCc7CiAgICogICAgIHN0cmluZy5zdGFydHNXaXRoKCdEJyk7ICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlCiAgICogICAgIHN0cmluZy5zdGFydHNXaXRoKG5ldyBSZWdFeHAocidbQS1aXVthLXpdJykpOyAvLyB0cnVlCiAgICoKICAgKiBJZiBbaW5kZXhdIGlzIHByb3ZpZGVkLCB0aGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHN1YnN0cmluZyBzdGFydGluZwogICAqIGF0IHRoYXQgaW5kZXggc3RhcnRzIHdpdGggYSBtYXRjaCBvZiBbcGF0dGVybl06CiAgICoKICAgKiAgICAgc3RyaW5nLnN0YXJ0c1dpdGgoJ2FydCcsIDEpOyAgICAgICAgICAgICAgICAgIC8vIHRydWUKICAgKiAgICAgc3RyaW5nLnN0YXJ0c1dpdGgobmV3IFJlZ0V4cChyJ1x3ezN9JykpOyAgICAgIC8vIHRydWUKICAgKgogICAqIFtpbmRleF0gbXVzdCBub3QgYmUgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIFtsZW5ndGhdLgogICAqCiAgICogQSBbUmVnRXhwXSBjb250YWluaW5nICdeJyBkb2VzIG5vdCBtYXRjaCBpZiB0aGUgW2luZGV4XSBpcyBncmVhdGVyIHRoYW4KICAgKiB6ZXJvLiBUaGUgcGF0dGVybiB3b3JrcyBvbiB0aGUgc3RyaW5nIGFzIGEgd2hvbGUsIGFuZCBkb2VzIG5vdCBleHRyYWN0CiAgICogYSBzdWJzdHJpbmcgc3RhcnRpbmcgYXQgW2luZGV4XSBmaXJzdDoKICAgKgogICAqICAgICBzdHJpbmcuc3RhcnRzV2l0aChuZXcgUmVnRXhwKHInXmFydCcpLCAxKTsgICAgLy8gZmFsc2UKICAgKiAgICAgc3RyaW5nLnN0YXJ0c1dpdGgobmV3IFJlZ0V4cChyJ2FydCcpLCAxKTsgICAgIC8vIHRydWUKICAgKi8KICBib29sIHN0YXJ0c1dpdGgoUGF0dGVybiBwYXR0ZXJuLCBbaW50IGluZGV4ID0gMF0pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgbWF0Y2ggb2YgW3BhdHRlcm5dIGluIHRoaXMgc3RyaW5nLAogICAqIHN0YXJ0aW5nIGF0IFtzdGFydF0sIGluY2x1c2l2ZToKICAgKgogICAqICAgICB2YXIgc3RyaW5nID0gJ0RhcnRpc2Fucyc7CiAgICogICAgIHN0cmluZy5pbmRleE9mKCdhcnQnKTsgICAgICAgICAgICAgICAgICAgICAvLyAxCiAgICogICAgIHN0cmluZy5pbmRleE9mKG5ldyBSZWdFeHAocidbQS1aXVthLXpdJykpOyAvLyAwCiAgICoKICAgKiBSZXR1cm5zIC0xIGlmIG5vIG1hdGNoIGlzIGZvdW5kOgogICAqCiAgICogICAgIHN0cmluZy5pbmRleE9mKG5ldyBSZWdFeHAocidkYXJ0JykpOyAgICAgICAvLyAtMQogICAqCiAgICogW3N0YXJ0XSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbm90IGdyZWF0ZXIgdGhhbiBbbGVuZ3RoXS4KICAgKi8KICBpbnQgaW5kZXhPZihQYXR0ZXJuIHBhdHRlcm4sIFtpbnQgc3RhcnRdKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgbWF0Y2ggW3BhdHRlcm5dIGluIHRoaXMgc3RyaW5nLCBzZWFyY2hpbmcKICAgKiBiYWNrd2FyZCBzdGFydGluZyBhdCBbc3RhcnRdLCBpbmNsdXNpdmU6CiAgICoKICAgKiAgICAgdmFyIHN0cmluZyA9ICdEYXJ0aXNhbnMnOwogICAqICAgICBzdHJpbmcubGFzdEluZGV4T2YoJ2EnKTsgICAgICAgICAgICAgICAgICAgIC8vIDYKICAgKiAgICAgc3RyaW5nLmxhc3RJbmRleE9mKG5ldyBSZWdFeHAocidhKHJ8biknKSk7ICAvLyA2CiAgICoKICAgKiBSZXR1cm5zIC0xIGlmIFtwYXR0ZXJuXSBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhpcyBzdHJpbmcuCiAgICoKICAgKiAgICAgc3RyaW5nLmxhc3RJbmRleE9mKG5ldyBSZWdFeHAocidEQVJUJykpOyAgICAvLyAtMQogICAqCiAgICogVGhlIFtzdGFydF0gbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIG5vdCBncmVhdGVyIHRoYW4gW2xlbmd0aF0uCiAgICovCiAgaW50IGxhc3RJbmRleE9mKFBhdHRlcm4gcGF0dGVybiwgW2ludCBzdGFydF0pOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdHJpbmcgaXMgZW1wdHkuCiAgICovCiAgYm9vbCBnZXQgaXNFbXB0eTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RyaW5nIGlzIG5vdCBlbXB0eS4KICAgKi8KICBib29sIGdldCBpc05vdEVtcHR5OwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHN0cmluZyBieSBjb25jYXRlbmF0aW5nIHRoaXMgc3RyaW5nIHdpdGggW290aGVyXS4KICAgKgogICAqICAgICAnZGFydCcgKyAnbGFuZyc7IC8vICdkYXJ0bGFuZycKICAgKi8KICBTdHJpbmcgb3BlcmF0b3IgKyhTdHJpbmcgb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzdWJzdHJpbmcgb2YgdGhpcyBzdHJpbmcgdGhhdCBleHRlbmRzIGZyb20gW3N0YXJ0SW5kZXhdLAogICAqIGluY2x1c2l2ZSwgdG8gW2VuZEluZGV4XSwgZXhjbHVzaXZlLgogICAqCiAgICogICAgIHZhciBzdHJpbmcgPSAnZGFydGxhbmcnOwogICAqICAgICBzdHJpbmcuc3Vic3RyaW5nKDEpOyAgICAvLyAnYXJ0bGFuZycKICAgKiAgICAgc3RyaW5nLnN1YnN0cmluZygxLCA0KTsgLy8gJ2FydCcKICAgKi8KICBTdHJpbmcgc3Vic3RyaW5nKGludCBzdGFydEluZGV4LCBbaW50IGVuZEluZGV4XSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN0cmluZyB3aXRob3V0IGFueSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLgogICAqCiAgICogSWYgdGhlIHN0cmluZyBjb250YWlucyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGEgbmV3IHN0cmluZyB3aXRoIG5vCiAgICogbGVhZGluZyBhbmQgbm8gdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZXR1cm5lZDoKICAgKiBgYGBkYXJ0CiAgICogJ1x0RGFydCBpcyBmdW5cbicudHJpbSgpOyAvLyAnRGFydCBpcyBmdW4nCiAgICogYGBgCiAgICogT3RoZXJ3aXNlLCB0aGUgb3JpZ2luYWwgc3RyaW5nIGl0c2VsZiBpcyByZXR1cm5lZDoKICAgKiBgYGBkYXJ0CiAgICogdmFyIHN0cjEgPSAnRGFydCc7CiAgICogdmFyIHN0cjIgPSBzdHIxLnRyaW0oKTsKICAgKiBpZGVudGljYWwoc3RyMSwgc3RyMik7ICAgIC8vIHRydWUKICAgKiBgYGAKICAgKiBXaGl0ZXNwYWNlIGlzIGRlZmluZWQgYnkgdGhlIFVuaWNvZGUgV2hpdGVfU3BhY2UgcHJvcGVydHkgKGFzIGRlZmluZWQgaW4KICAgKiB2ZXJzaW9uIDYuMiBvciBsYXRlcikgYW5kIHRoZSBCT00gY2hhcmFjdGVyLCAweEZFRkYuCiAgICoKICAgKiBIZXJlIGlzIHRoZSBsaXN0IG9mIHRyaW1tZWQgY2hhcmFjdGVycyBhY2NvcmRpbmcgdG8gVW5pY29kZSB2ZXJzaW9uIDYuMzoKICAgKiBgYGAKICAgKiAgICAgMDAwOS4uMDAwRCAgICA7IFdoaXRlX1NwYWNlICMgQ2MgICA8Y29udHJvbC0wMDA5Pi4uPGNvbnRyb2wtMDAwRD4KICAgKiAgICAgMDAyMCAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWnMgICBTUEFDRQogICAqICAgICAwMDg1ICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBDYyAgIDxjb250cm9sLTAwODU+CiAgICogICAgIDAwQTAgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpzICAgTk8tQlJFQUsgU1BBQ0UKICAgKiAgICAgMTY4MCAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWnMgICBPR0hBTSBTUEFDRSBNQVJLCiAgICogICAgIDIwMDAuLjIwMEEgICAgOyBXaGl0ZV9TcGFjZSAjIFpzICAgRU4gUVVBRC4uSEFJUiBTUEFDRQogICAqICAgICAyMDI4ICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBabCAgIExJTkUgU0VQQVJBVE9SCiAgICogICAgIDIwMjkgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpwICAgUEFSQUdSQVBIIFNFUEFSQVRPUgogICAqICAgICAyMDJGICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBacyAgIE5BUlJPVyBOTy1CUkVBSyBTUEFDRQogICAqICAgICAyMDVGICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBacyAgIE1FRElVTSBNQVRIRU1BVElDQUwgU1BBQ0UKICAgKiAgICAgMzAwMCAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWnMgICBJREVPR1JBUEhJQyBTUEFDRQogICAqCiAgICogICAgIEZFRkYgICAgICAgICAgOyBCT00gICAgICAgICAgICAgICAgWkVSTyBXSURUSCBOT19CUkVBSyBTUEFDRQogICAqIGBgYAogICAqIFNvbWUgbGF0ZXIgdmVyc2lvbnMgb2YgVW5pY29kZSBkbyBub3QgaW5jbHVkZSBVKzAwODUgYXMgYSB3aGl0ZXNwYWNlCiAgICogY2hhcmFjdGVyLiBXaGV0aGVyIGl0IGlzIHRyaW1tZWQgZGVwZW5kcyBvbiB0aGUgVW5pY29kZSB2ZXJzaW9uCiAgICogdXNlZCBieSB0aGUgc3lzdGVtLgogICAqLwogIFN0cmluZyB0cmltKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN0cmluZyB3aXRob3V0IGFueSBsZWFkaW5nIHdoaXRlc3BhY2UuCiAgICoKICAgKiBBcyBbdHJpbV0sIGJ1dCBvbmx5IHJlbW92ZXMgbGVhZGluZyB3aGl0ZXNwYWNlLgogICAqLwogIFN0cmluZyB0cmltTGVmdCgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgd2l0aG91dCBhbnkgdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgKgogICAqIEFzIFt0cmltXSwgYnV0IG9ubHkgcmVtb3ZlcyB0cmFpbGluZyB3aGl0ZXNwYWNlLgogICAqLwogIFN0cmluZyB0cmltUmlnaHQoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBzdHJpbmcgYnkgY29uY2F0ZW5hdGluZyB0aGlzIHN0cmluZyB3aXRoIGl0c2VsZiBhIG51bWJlcgogICAqIG9mIHRpbWVzLgogICAqCiAgICogVGhlIHJlc3VsdCBvZiBgc3RyICogbmAgaXMgZXF1aXZhbGVudCB0bwogICAqIGBzdHIgKyBzdHIgKyAuLi5gKG4gdGltZXMpYC4uLiArIHN0cmAuCiAgICoKICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiBbdGltZXNdIGlzIHplcm8gb3IgbmVnYXRpdmUuCiAgICovCiAgU3RyaW5nIG9wZXJhdG9yICooaW50IHRpbWVzKTsKCiAgLyoqCiAgICogUGFkcyB0aGlzIHN0cmluZyBvbiB0aGUgbGVmdCBpZiBpdCBpcyBzaG9ydGVyIHRoYW4gW3dpZHRoXS4KICAgKgogICAqIFJldHVybiBhIG5ldyBzdHJpbmcgdGhhdCBwcmVwZW5kcyBbcGFkZGluZ10gb250byB0aGlzIHN0cmluZwogICAqIG9uZSB0aW1lIGZvciBlYWNoIHBvc2l0aW9uIHRoZSBsZW5ndGggaXMgbGVzcyB0aGFuIFt3aWR0aF0uCiAgICoKICAgKiBJZiBbd2lkdGhdIGlzIGFscmVhZHkgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIGB0aGlzLmxlbmd0aGAsCiAgICogbm8gcGFkZGluZyBpcyBhZGRlZC4gQSBuZWdhdGl2ZSBgd2lkdGhgIGlzIHRyZWF0ZWQgYXMgemVyby4KICAgKgogICAqIElmIFtwYWRkaW5nXSBoYXMgbGVuZ3RoIGRpZmZlcmVudCBmcm9tIDEsIHRoZSByZXN1bHQgd2lsbCBub3QKICAgKiBoYXZlIGxlbmd0aCBgd2lkdGhgLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHRoZQogICAqIHBhZGRpbmcgaXMgYSBsb25nZXIgc3RyaW5nIHJlcHJlc2VudGluZyBhIHNpbmdsZSBjaGFyYWN0ZXIsIGxpa2UKICAgKiBgIiZuYnNwOyJgIG9yIGAiXHV7MTAwMDJ9YCIuCiAgICogSW4gdGhhdCBjYXNlLCB0aGUgdXNlciBzaG91bGQgbWFrZSBzdXJlIHRoYXQgYHRoaXMubGVuZ3RoYCBpcwogICAqIHRoZSBjb3JyZWN0IG1lYXN1cmUgb2YgdGhlIHN0cmluZ3MgbGVuZ3RoLgogICAqLwogIFN0cmluZyBwYWRMZWZ0KGludCB3aWR0aCwgW1N0cmluZyBwYWRkaW5nID0gJyAnXSk7CgogIC8qKgogICAqIFBhZHMgdGhpcyBzdHJpbmcgb24gdGhlIHJpZ2h0IGlmIGl0IGlzIHNob3J0ZXIgdGhhbiBbd2lkdGhdLgogICAqCiAgICogUmV0dXJuIGEgbmV3IHN0cmluZyB0aGF0IGFwcGVuZHMgW3BhZGRpbmddIGFmdGVyIHRoaXMgc3RyaW5nCiAgICogb25lIHRpbWUgZm9yIGVhY2ggcG9zaXRpb24gdGhlIGxlbmd0aCBpcyBsZXNzIHRoYW4gW3dpZHRoXS4KICAgKgogICAqIElmIFt3aWR0aF0gaXMgYWxyZWFkeSBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gYHRoaXMubGVuZ3RoYCwKICAgKiBubyBwYWRkaW5nIGlzIGFkZGVkLiBBIG5lZ2F0aXZlIGB3aWR0aGAgaXMgdHJlYXRlZCBhcyB6ZXJvLgogICAqCiAgICogSWYgW3BhZGRpbmddIGhhcyBsZW5ndGggZGlmZmVyZW50IGZyb20gMSwgdGhlIHJlc3VsdCB3aWxsIG5vdAogICAqIGhhdmUgbGVuZ3RoIGB3aWR0aGAuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IgY2FzZXMgd2hlcmUgdGhlCiAgICogcGFkZGluZyBpcyBhIGxvbmdlciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgc2luZ2xlIGNoYXJhY3RlciwgbGlrZQogICAqIGAiJm5ic3A7ImAgb3IgYCJcdXsxMDAwMn1gIi4KICAgKiBJbiB0aGF0IGNhc2UsIHRoZSB1c2VyIHNob3VsZCBtYWtlIHN1cmUgdGhhdCBgdGhpcy5sZW5ndGhgIGlzCiAgICogdGhlIGNvcnJlY3QgbWVhc3VyZSBvZiB0aGUgc3RyaW5ncyBsZW5ndGguCiAgICovCiAgU3RyaW5nIHBhZFJpZ2h0KGludCB3aWR0aCwgW1N0cmluZyBwYWRkaW5nID0gJyAnXSk7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHN0cmluZyBjb250YWlucyBhIG1hdGNoIG9mIFtvdGhlcl06CiAgICoKICAgKiAgICAgdmFyIHN0cmluZyA9ICdEYXJ0IHN0cmluZ3MnOwogICAqICAgICBzdHJpbmcuY29udGFpbnMoJ0QnKTsgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlCiAgICogICAgIHN0cmluZy5jb250YWlucyhuZXcgUmVnRXhwKHInW0EtWl0nKSk7ICAgIC8vIHRydWUKICAgKgogICAqIElmIFtzdGFydEluZGV4XSBpcyBwcm92aWRlZCwgdGhpcyBtZXRob2QgbWF0Y2hlcyBvbmx5IGF0IG9yIGFmdGVyIHRoYXQKICAgKiBpbmRleDoKICAgKgogICAqICAgICBzdHJpbmcuY29udGFpbnMoJ1gnLCAxKTsgICAgICAgICAgICAgICAgICAvLyBmYWxzZQogICAqICAgICBzdHJpbmcuY29udGFpbnMobmV3IFJlZ0V4cChyJ1tBLVpdJyksIDEpOyAvLyBmYWxzZQogICAqCiAgICogW3N0YXJ0SW5kZXhdIG11c3Qgbm90IGJlIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoXS4KICAgKi8KICBib29sIGNvbnRhaW5zKFBhdHRlcm4gb3RoZXIsIFtpbnQgc3RhcnRJbmRleCA9IDBdKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBzdHJpbmcgaW4gd2hpY2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgW2Zyb21dIGluIHRoaXMgc3RyaW5nCiAgICogaXMgcmVwbGFjZWQgd2l0aCBbdG9dLCBzdGFydGluZyBmcm9tIFtzdGFydEluZGV4XToKICAgKgogICAqICAgICAnMC4wMDAxJy5yZXBsYWNlRmlyc3QobmV3IFJlZ0V4cChyJzAnKSwgJycpOyAvLyAnLjAwMDEnCiAgICogICAgICcwLjAwMDEnLnJlcGxhY2VGaXJzdChuZXcgUmVnRXhwKHInMCcpLCAnNycsIDEpOyAvLyAnMC43MDAxJwogICAqLwogIFN0cmluZyByZXBsYWNlRmlyc3QoUGF0dGVybiBmcm9tLCBTdHJpbmcgdG8sIFtpbnQgc3RhcnRJbmRleCA9IDBdKTsKCiAgLyoqCiAgICogUmVwbGFjZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBbZnJvbV0gaW4gdGhpcyBzdHJpbmcuCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IHN0cmluZywgd2hpY2ggaXMgdGhpcyBzdHJpbmcKICAgKiBleGNlcHQgdGhhdCB0aGUgZmlyc3QgbWF0Y2ggb2YgW2Zyb21dLCBzdGFydGluZyBmcm9tIFtzdGFydEluZGV4XSwKICAgKiBpcyByZXBsYWNlZCBieSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgW3JlcGxhY2VdIHdpdGggdGhlIG1hdGNoIG9iamVjdC4KICAgKgogICAqIFRoZSBvcHRpb25hbCBbc3RhcnRJbmRleF0gaXMgYnkgZGVmYXVsdCBzZXQgdG8gMC4gSWYgcHJvdmlkZWQsIGl0IG11c3QgYmUKICAgKiBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBgWzAgLi4gbGVuXWAsIHdoZXJlIGBsZW5gIGlzIHRoaXMgc3RyaW5nJ3MgbGVuZ3RoLgogICAqLwogIFN0cmluZyByZXBsYWNlRmlyc3RNYXBwZWQoUGF0dGVybiBmcm9tLCBTdHJpbmcgcmVwbGFjZShNYXRjaCBtYXRjaCksCiAgICAgIFtpbnQgc3RhcnRJbmRleCA9IDBdKTsKCiAgLyoqCiAgICogUmVwbGFjZXMgYWxsIHN1YnN0cmluZ3MgdGhhdCBtYXRjaCBbZnJvbV0gd2l0aCBbcmVwbGFjZV0uCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IHN0cmluZyBpbiB3aGljaCB0aGUgbm9uLW92ZXJsYXBwaW5nIHN1YnN0cmluZ3MgbWF0Y2hpbmcKICAgKiBbZnJvbV0gKHRoZSBvbmVzIGl0ZXJhdGVkIGJ5IGBmcm9tLmFsbE1hdGNoZXModGhpc1N0cmluZylgKSBhcmUgcmVwbGFjZWQKICAgKiBieSB0aGUgbGl0ZXJhbCBzdHJpbmcgW3JlcGxhY2VdLgogICAqCiAgICogICAgICdyZXN1bWUnLnJlcGxhY2VBbGwobmV3IFJlZ0V4cChyJ2UnKSwgJ8OpJyk7IC8vICdyw6lzdW3DqScKICAgKgogICAqIE5vdGljZSB0aGF0IHRoZSBbcmVwbGFjZV0gc3RyaW5nIGlzIG5vdCBpbnRlcnByZXRlZC4gSWYgdGhlIHJlcGxhY2VtZW50CiAgICogZGVwZW5kcyBvbiB0aGUgbWF0Y2ggKGZvciBleGFtcGxlIG9uIGEgW1JlZ0V4cF0ncyBjYXB0dXJlIGdyb3VwcyksIHVzZQogICAqIHRoZSBbcmVwbGFjZUFsbE1hcHBlZF0gbWV0aG9kIGluc3RlYWQuCiAgICovCiAgU3RyaW5nIHJlcGxhY2VBbGwoUGF0dGVybiBmcm9tLCBTdHJpbmcgcmVwbGFjZSk7CgogIC8qKgogICAqIFJlcGxhY2UgYWxsIHN1YnN0cmluZ3MgdGhhdCBtYXRjaCBbZnJvbV0gYnkgYSBzdHJpbmcgY29tcHV0ZWQgZnJvbSB0aGUKICAgKiBtYXRjaC4KICAgKgogICAqIFJldHVybnMgYSBuZXcgc3RyaW5nIGluIHdoaWNoIHRoZSBub24tb3ZlcmxhcHBpbmcgc3Vic3RyaW5ncyB0aGF0IG1hdGNoCiAgICogW2Zyb21dICh0aGUgb25lcyBpdGVyYXRlZCBieSBgZnJvbS5hbGxNYXRjaGVzKHRoaXNTdHJpbmcpYCkgYXJlIHJlcGxhY2VkCiAgICogYnkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFtyZXBsYWNlXSBvbiB0aGUgY29ycmVzcG9uZGluZyBbTWF0Y2hdIG9iamVjdC4KICAgKgogICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSBtYXRjaGVzIHdpdGggbmV3IGNvbnRlbnQgdGhhdCBkZXBlbmRzIG9uIHRoZQogICAqIG1hdGNoLCB1bmxpa2UgW3JlcGxhY2VBbGxdIHdoZXJlIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgaXMgYWx3YXlzIHRoZSBzYW1lLgogICAqCiAgICogVGhlIFtyZXBsYWNlXSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgW01hdGNoXSBnZW5lcmF0ZWQKICAgKiBieSB0aGUgcGF0dGVybiwgYW5kIGl0cyByZXN1bHQgaXMgdXNlZCBhcyByZXBsYWNlbWVudC4KICAgKgogICAqIFRoZSBmdW5jdGlvbiBkZWZpbmVkIGJlbG93IGNvbnZlcnRzIGVhY2ggd29yZCBpbiBhIHN0cmluZyB0byBzaW1wbGlmaWVkCiAgICogJ3BpZyBsYXRpbicgdXNpbmcgW3JlcGxhY2VBbGxNYXBwZWRdOgogICAqCiAgICogICAgIHBpZ0xhdGluKFN0cmluZyB3b3JkcykgPT4gd29yZHMucmVwbGFjZUFsbE1hcHBlZCgKICAgKiAgICAgICAgIG5ldyBSZWdFeHAocidcYihcdyo/KShbYWVpb3VdXHcqKScsIGNhc2VTZW5zaXRpdmU6IGZhbHNlKSwKICAgKiAgICAgICAgIChNYXRjaCBtKSA9PiAiJHttWzJdfSR7bVsxXX0ke21bMV0uaXNFbXB0eSA/ICd3YXknIDogJ2F5J30iKTsKICAgKgogICAqICAgICBwaWdMYXRpbignSSBoYXZlIGEgc2VjcmV0IG5vdyEnKTsgLy8gJ0l3YXkgYXZlaGF5IGF3YXkgZWNyZXRzYXkgb3duYXkhJwogICAqLwogIFN0cmluZyByZXBsYWNlQWxsTWFwcGVkKFBhdHRlcm4gZnJvbSwgU3RyaW5nIHJlcGxhY2UoTWF0Y2ggbWF0Y2gpKTsKCiAgLyoqCiAgICogUmVwbGFjZXMgdGhlIHN1YnN0cmluZyBmcm9tIFtzdGFydF0gdG8gW2VuZF0gd2l0aCBbcmVwbGFjZW1lbnRdLgogICAqCiAgICogUmV0dXJucyBhIG5ldyBzdHJpbmcgZXF1aXZhbGVudCB0bzoKICAgKgogICAqICAgICB0aGlzLnN1YnN0cmluZygwLCBzdGFydCkgKyByZXBsYWNlbWVudCArIHRoaXMuc3Vic3RyaW5nKGVuZCkKICAgKgogICAqIFRoZSBbc3RhcnRdIGFuZCBbZW5kXSBpbmRpY2VzIG11c3Qgc3BlY2lmeSBhIHZhbGlkIHJhbmdlIG9mIHRoaXMgc3RyaW5nLgogICAqIFRoYXQgaXMgYDAgPD0gc3RhcnQgPD0gZW5kIDw9IHRoaXMubGVuZ3RoYC4KICAgKiBJZiBbZW5kXSBpcyBgbnVsbGAsIGl0IGRlZmF1bHRzIHRvIFtsZW5ndGhdLgogICAqLwogIFN0cmluZyByZXBsYWNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmcgcmVwbGFjZW1lbnQpOwoKICAvKioKICAgKiBTcGxpdHMgdGhlIHN0cmluZyBhdCBtYXRjaGVzIG9mIFtwYXR0ZXJuXSBhbmQgcmV0dXJucyBhIGxpc3Qgb2Ygc3Vic3RyaW5ncy4KICAgKgogICAqIEZpbmRzIGFsbCB0aGUgbWF0Y2hlcyBvZiBgcGF0dGVybmAgaW4gdGhpcyBzdHJpbmcsCiAgICogYW5kIHJldHVybnMgdGhlIGxpc3Qgb2YgdGhlIHN1YnN0cmluZ3MgYmV0d2VlbiB0aGUgbWF0Y2hlcy4KICAgKgogICAqICAgICB2YXIgc3RyaW5nID0gIkhlbGxvIHdvcmxkISI7CiAgICogICAgIHN0cmluZy5zcGxpdCgiICIpOyAgICAgICAgICAgICAgICAgICAgICAvLyBbJ0hlbGxvJywgJ3dvcmxkISddOwogICAqCiAgICogRW1wdHkgbWF0Y2hlcyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIHN0cmluZ3MgYXJlIGlnbm9yZWQsCiAgICogYW5kIHNvIGFyZSBlbXB0eSBtYXRjaGVzIHJpZ2h0IGFmdGVyIGFub3RoZXIgbWF0Y2guCiAgICoKICAgKiAgICAgdmFyIHN0cmluZyA9ICJhYmJhIjsKICAgKiAgICAgc3RyaW5nLnNwbGl0KG5ldyBSZWdFeHAociJiKiIpKTsgICAgICAgIC8vIFsnYScsICdhJ10KICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBbJycsICdhJywgJ2EnLCAnJ10KICAgKgogICAqIElmIHRoaXMgc3RyaW5nIGlzIGVtcHR5LCB0aGUgcmVzdWx0IGlzIGFuIGVtcHR5IGxpc3QgaWYgYHBhdHRlcm5gIG1hdGNoZXMKICAgKiB0aGUgZW1wdHkgc3RyaW5nLCBhbmQgaXQgaXMgYFsiIl1gIGlmIHRoZSBwYXR0ZXJuIGRvZXNuJ3QgbWF0Y2guCiAgICoKICAgKiAgICAgdmFyIHN0cmluZyA9ICcnOwogICAqICAgICBzdHJpbmcuc3BsaXQoJycpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gW10KICAgKiAgICAgc3RyaW5nLnNwbGl0KCJhIik7ICAgICAgICAgICAgICAgICAgICAgIC8vIFsnJ10KICAgKgogICAqIFNwbGl0dGluZyB3aXRoIGFuIGVtcHR5IHBhdHRlcm4gc3BsaXRzIHRoZSBzdHJpbmcgaW50byBzaW5nbGUtY29kZSB1bml0CiAgICogc3RyaW5ncy4KICAgKgogICAqICAgICB2YXIgc3RyaW5nID0gJ1B1Yic7CiAgICogICAgIHN0cmluZy5zcGxpdCgnJyk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBbJ1AnLCAndScsICdiJ10KICAgKgogICAqICAgICBzdHJpbmcuY29kZVVuaXRzLm1hcCgodW5pdCkgewogICAqICAgICAgIHJldHVybiBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZSh1bml0KTsKICAgKiAgICAgfSkudG9MaXN0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFsnUCcsICd1JywgJ2InXQogICAqCiAgICogU3BsaXR0aW5nIGhhcHBlbnMgYXQgVVRGLTE2IGNvZGUgdW5pdCBib3VuZGFyaWVzLAogICAqIGFuZCBub3QgYXQgcnVuZSBib3VuZGFyaWVzOgogICAqCiAgICogICAgIC8vIFN0cmluZyBtYWRlIHVwIG9mIHR3byBjb2RlIHVuaXRzLCBidXQgb25lIHJ1bmUuCiAgICogICAgIHN0cmluZyA9ICdcdXsxRDExRX0nOwogICAqICAgICBzdHJpbmcuc3BsaXQoJycpLmxlbmd0aDsgICAgICAgICAgICAgICAgIC8vIDIgc3Vycm9nYXRlIHZhbHVlcwogICAqCiAgICogVG8gZ2V0IGEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGluZGl2aWR1YWwgcnVuZXMgb2YgYSBzdHJpbmcsCiAgICogeW91IHNob3VsZCBub3QgdXNlIHNwbGl0LiBZb3UgY2FuIGluc3RlYWQgbWFwIGVhY2ggcnVuZSB0byBhIHN0cmluZwogICAqIGFzIGZvbGxvd3M6CiAgICoKICAgKiAgICAgc3RyaW5nLnJ1bmVzLm1hcCgocnVuZSkgPT4gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGUocnVuZSkpLnRvTGlzdCgpOwogICAqLwogIExpc3Q8U3RyaW5nPiBzcGxpdChQYXR0ZXJuIHBhdHRlcm4pOwoKICAvKioKICAgKiBTcGxpdHMgdGhlIHN0cmluZywgY29udmVydHMgaXRzIHBhcnRzLCBhbmQgY29tYmluZXMgdGhlbSBpbnRvIGEgbmV3CiAgICogc3RyaW5nLgogICAqCiAgICogW3BhdHRlcm5dIGlzIHVzZWQgdG8gc3BsaXQgdGhlIHN0cmluZyBpbnRvIHBhcnRzIGFuZCBzZXBhcmF0aW5nIG1hdGNoZXMuCiAgICoKICAgKiBFYWNoIG1hdGNoIGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBieSBjYWxsaW5nIFtvbk1hdGNoXS4gSWYgW29uTWF0Y2hdCiAgICogaXMgb21pdHRlZCwgdGhlIG1hdGNoZWQgc3RyaW5nIGlzIHVzZWQuCiAgICoKICAgKiBFYWNoIG5vbi1tYXRjaGVkIHBhcnQgaXMgY29udmVydGVkIGJ5IGEgY2FsbCB0byBbb25Ob25NYXRjaF0uIElmCiAgICogW29uTm9uTWF0Y2hdIGlzIG9taXR0ZWQsIHRoZSBub24tbWF0Y2hpbmcgcGFydCBpcyB1c2VkLgogICAqCiAgICogVGhlbiBhbGwgdGhlIGNvbnZlcnRlZCBwYXJ0cyBhcmUgY29tYmluZWQgaW50byB0aGUgcmVzdWx0aW5nIHN0cmluZy4KICAgKgogICAqICAgICAnRWF0cyBzaG9vdHMgbGVhdmVzJy5zcGxpdE1hcEpvaW4oKG5ldyBSZWdFeHAocidzaG9vdHMnKSksCiAgICogICAgICAgICBvbk1hdGNoOiAgICAobSkgPT4gJyR7bS5ncm91cCgwKX0nLAogICAqICAgICAgICAgb25Ob25NYXRjaDogKG4pID0+ICcqJyk7IC8vICpzaG9vdHMqCiAgICovCiAgU3RyaW5nIHNwbGl0TWFwSm9pbihQYXR0ZXJuIHBhdHRlcm4sCiAgICAgIHtTdHJpbmcgb25NYXRjaChNYXRjaCBtYXRjaCksIFN0cmluZyBvbk5vbk1hdGNoKFN0cmluZyBub25NYXRjaCl9KTsKCiAgLyoqCiAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgbGlzdCBvZiB0aGUgVVRGLTE2IGNvZGUgdW5pdHMgb2YgdGhpcyBzdHJpbmcuCiAgICovCiAgTGlzdDxpbnQ+IGdldCBjb2RlVW5pdHM7CgogIC8qKgogICAqIFJldHVybnMgYW4gW0l0ZXJhYmxlXSBvZiBVbmljb2RlIGNvZGUtcG9pbnRzIG9mIHRoaXMgc3RyaW5nLgogICAqCiAgICogSWYgdGhlIHN0cmluZyBjb250YWlucyBzdXJyb2dhdGUgcGFpcnMsIHRoZXkgYXJlIGNvbWJpbmVkIGFuZCByZXR1cm5lZAogICAqIGFzIG9uZSBpbnRlZ2VyIGJ5IHRoaXMgaXRlcmF0b3IuIFVubWF0Y2hlZCBzdXJyb2dhdGUgaGFsdmVzIGFyZSB0cmVhdGVkCiAgICogbGlrZSB2YWxpZCAxNi1iaXQgY29kZS11bml0cy4KICAgKi8KICBSdW5lcyBnZXQgcnVuZXM7CgogIC8qKgogICAqIENvbnZlcnRzIGFsbCBjaGFyYWN0ZXJzIGluIHRoaXMgc3RyaW5nIHRvIGxvd2VyIGNhc2UuCiAgICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IGluIGFsbCBsb3dlciBjYXNlLCB0aGlzIG1ldGhvZCByZXR1cm5zIFs6dGhpczpdLgogICAqCiAgICogICAgICdBTFBIQUJFVCcudG9Mb3dlckNhc2UoKTsgLy8gJ2FscGhhYmV0JwogICAqICAgICAnYWJjJy50b0xvd2VyQ2FzZSgpOyAgICAgIC8vICdhYmMnCiAgICoKICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGxhbmd1YWdlIGluZGVwZW5kZW50IFVuaWNvZGUgbWFwcGluZyBhbmQgdGh1cyBvbmx5CiAgICogd29ya3MgaW4gc29tZSBsYW5ndWFnZXMuCiAgICovCiAgLy8gVE9ETyhmbG9pdHNjaCk6IGRvY3VtZW50IGJldHRlci4gKFNlZSBFY21hU2NyaXB0IGZvciBkZXNjcmlwdGlvbikuCiAgU3RyaW5nIHRvTG93ZXJDYXNlKCk7CgogIC8qKgogICAqIENvbnZlcnRzIGFsbCBjaGFyYWN0ZXJzIGluIHRoaXMgc3RyaW5nIHRvIHVwcGVyIGNhc2UuCiAgICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IGluIGFsbCB1cHBlciBjYXNlLCB0aGlzIG1ldGhvZCByZXR1cm5zIFs6dGhpczpdLgogICAqCiAgICogICAgICdhbHBoYWJldCcudG9VcHBlckNhc2UoKTsgLy8gJ0FMUEhBQkVUJwogICAqICAgICAnQUJDJy50b1VwcGVyQ2FzZSgpOyAgICAgIC8vICdBQkMnCiAgICoKICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGxhbmd1YWdlIGluZGVwZW5kZW50IFVuaWNvZGUgbWFwcGluZyBhbmQgdGh1cyBvbmx5CiAgICogd29ya3MgaW4gc29tZSBsYW5ndWFnZXMuCiAgICovCiAgLy8gVE9ETyhmbG9pdHNjaCk6IGRvY3VtZW50IGJldHRlci4gKFNlZSBFY21hU2NyaXB0IGZvciBkZXNjcmlwdGlvbikuCiAgU3RyaW5nIHRvVXBwZXJDYXNlKCk7Cn0KCi8qKgogKiBUaGUgcnVuZXMgKGludGVnZXIgVW5pY29kZSBjb2RlIHBvaW50cykgb2YgYSBbU3RyaW5nXS4KICovCmNsYXNzIFJ1bmVzIGV4dGVuZHMgSXRlcmFibGU8aW50PiB7CiAgZmluYWwgU3RyaW5nIHN0cmluZzsKICBSdW5lcyh0aGlzLnN0cmluZyk7CgogIFJ1bmVJdGVyYXRvciBnZXQgaXRlcmF0b3IgPT4gUnVuZUl0ZXJhdG9yKHN0cmluZyk7CgogIGludCBnZXQgbGFzdCB7CiAgICBpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoJ05vIGVsZW1lbnRzLicpOwogICAgfQogICAgaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7CiAgICBpbnQgY29kZSA9IHN0cmluZy5jb2RlVW5pdEF0KGxlbmd0aCAtIDEpOwogICAgaWYgKF9pc1RyYWlsU3Vycm9nYXRlKGNvZGUpICYmIHN0cmluZy5sZW5ndGggPiAxKSB7CiAgICAgIGludCBwcmV2aW91c0NvZGUgPSBzdHJpbmcuY29kZVVuaXRBdChsZW5ndGggLSAyKTsKICAgICAgaWYgKF9pc0xlYWRTdXJyb2dhdGUocHJldmlvdXNDb2RlKSkgewogICAgICAgIHJldHVybiBfY29tYmluZVN1cnJvZ2F0ZVBhaXIocHJldmlvdXNDb2RlLCBjb2RlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvZGU7CiAgfQp9CgovLyBJcyB0aGVuIGNvZGUgKGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIpIGEgVVRGLTE2IGxlYWQgc3Vycm9nYXRlLgpib29sIF9pc0xlYWRTdXJyb2dhdGUoaW50IGNvZGUpID0+IChjb2RlICYgMHhGQzAwKSA9PSAweEQ4MDA7CgovLyBJcyB0aGVuIGNvZGUgKGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIpIGEgVVRGLTE2IHRyYWlsIHN1cnJvZ2F0ZS4KYm9vbCBfaXNUcmFpbFN1cnJvZ2F0ZShpbnQgY29kZSkgPT4gKGNvZGUgJiAweEZDMDApID09IDB4REMwMDsKCi8vIENvbWJpbmUgYSBsZWFkIGFuZCBhIHRyYWlsIHN1cnJvZ2F0ZSB2YWx1ZSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQuCmludCBfY29tYmluZVN1cnJvZ2F0ZVBhaXIoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgcmV0dXJuIDB4MTAwMDAgKyAoKHN0YXJ0ICYgMHgzRkYpIDw8IDEwKSArIChlbmQgJiAweDNGRik7Cn0KCi8qKiBbSXRlcmF0b3JdIGZvciByZWFkaW5nIHJ1bmVzIChpbnRlZ2VyIFVuaWNvZGUgY29kZSBwb2ludHMpIG91dCBvZiBhIERhcnQKICAqIHN0cmluZy4KICAqLwpjbGFzcyBSdW5lSXRlcmF0b3IgaW1wbGVtZW50cyBCaWRpcmVjdGlvbmFsSXRlcmF0b3I8aW50PiB7CiAgLyoqIFN0cmluZyBiZWluZyBpdGVyYXRlZC4gKi8KICBmaW5hbCBTdHJpbmcgc3RyaW5nOwogIC8qKiBQb3NpdGlvbiBiZWZvcmUgdGhlIGN1cnJlbnQgY29kZSBwb2ludC4gKi8KICBpbnQgX3Bvc2l0aW9uOwogIC8qKiBQb3NpdGlvbiBhZnRlciB0aGUgY3VycmVudCBjb2RlIHBvaW50LiAqLwogIGludCBfbmV4dFBvc2l0aW9uOwogIC8qKgogICAqIEN1cnJlbnQgY29kZSBwb2ludC4KICAgKgogICAqIElmIHRoZSBpdGVyYXRvciBoYXMgaGl0IGVpdGhlciBlbmQsIHRoZSBbX2N1cnJlbnRDb2RlUG9pbnRdIGlzIG51bGwKICAgKiBhbmQgWzogX3Bvc2l0aW9uID09IF9uZXh0UG9zaXRpb24gOl0uCiAgICovCiAgaW50IF9jdXJyZW50Q29kZVBvaW50OwoKICAvKiogQ3JlYXRlIGFuIGl0ZXJhdG9yIHBvc2l0aW9uZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLiAqLwogIFJ1bmVJdGVyYXRvcihTdHJpbmcgc3RyaW5nKQogICAgICA6IHRoaXMuc3RyaW5nID0gc3RyaW5nLAogICAgICAgIF9wb3NpdGlvbiA9IDAsCiAgICAgICAgX25leHRQb3NpdGlvbiA9IDA7CgogIC8qKgogICAqIENyZWF0ZSBhbiBpdGVyYXRvciBwb3NpdGlvbmVkIGJlZm9yZSB0aGUgW2luZGV4XXRoIGNvZGUgdW5pdCBvZiB0aGUgc3RyaW5nLgogICAqCiAgICogV2hlbiBjcmVhdGVkLCB0aGVyZSBpcyBubyBbY3VycmVudF0gdmFsdWUuCiAgICogQSBbbW92ZU5leHRdIHdpbGwgdXNlIHRoZSBydW5lIHN0YXJ0aW5nIGF0IFtpbmRleF0gdGhlIGN1cnJlbnQgdmFsdWUsCiAgICogYW5kIGEgW21vdmVQcmV2aW91c10gd2lsbCB1c2UgdGhlIHJ1bmUgZW5kaW5nIGp1c3QgYmVmb3JlIFtpbmRleF0gYXMgdGhlCiAgICogdGhlIGN1cnJlbnQgdmFsdWUuCiAgICoKICAgKiBUaGUgW2luZGV4XSBwb3NpdGlvbiBtdXN0IG5vdCBiZSBpbiB0aGUgbWlkZGxlIG9mIGEgc3Vycm9nYXRlIHBhaXIuCiAgICovCiAgUnVuZUl0ZXJhdG9yLmF0KFN0cmluZyBzdHJpbmcsIGludCBpbmRleCkKICAgICAgOiBzdHJpbmcgPSBzdHJpbmcsCiAgICAgICAgX3Bvc2l0aW9uID0gaW5kZXgsCiAgICAgICAgX25leHRQb3NpdGlvbiA9IGluZGV4IHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWx1ZUluSW50ZXJ2YWwoaW5kZXgsIDAsIHN0cmluZy5sZW5ndGgpOwogICAgX2NoZWNrU3BsaXRTdXJyb2dhdGUoaW5kZXgpOwogIH0KCiAgLyoqIFRocm93IGFuIGVycm9yIGlmIHRoZSBpbmRleCBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgc3Vycm9nYXRlIHBhaXIuICovCiAgdm9pZCBfY2hlY2tTcGxpdFN1cnJvZ2F0ZShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA+IDAgJiYKICAgICAgICBpbmRleCA8IHN0cmluZy5sZW5ndGggJiYKICAgICAgICBfaXNMZWFkU3Vycm9nYXRlKHN0cmluZy5jb2RlVW5pdEF0KGluZGV4IC0gMSkpICYmCiAgICAgICAgX2lzVHJhaWxTdXJyb2dhdGUoc3RyaW5nLmNvZGVVbml0QXQoaW5kZXgpKSkgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCdJbmRleCBpbnNpZGUgc3Vycm9nYXRlIHBhaXI6ICRpbmRleCcpOwogICAgfQogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgcnVuZSBpbiB0aGUgc3RyaW5nLgogICAqCiAgICogUmV0dXJucyBudWxsIGlmIHRoZSBbY3VycmVudF0gcnVuZSBpcyBudWxsLgogICAqLwogIGludCBnZXQgcmF3SW5kZXggPT4gKF9wb3NpdGlvbiAhPSBfbmV4dFBvc2l0aW9uKSA/IF9wb3NpdGlvbiA6IG51bGw7CgogIC8qKgogICAqIFJlc2V0cyB0aGUgaXRlcmF0b3IgdG8gdGhlIHJ1bmUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGUgc3RyaW5nLgogICAqCiAgICogU2V0dGluZyBhIG5lZ2F0aXZlIFtyYXdJbmRleF0sIG9yIG9uZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KICAgKiBbOnN0cmluZy5sZW5ndGg6XSwKICAgKiBpcyBhbiBlcnJvci4gU28gaXMgc2V0dGluZyBpdCBpbiB0aGUgbWlkZGxlIG9mIGEgc3Vycm9nYXRlIHBhaXIuCiAgICoKICAgKiBTZXR0aW5nIHRoZSBwb3NpdGlvbiB0byB0aGUgZW5kIG9mIHRoZW4gc3RyaW5nIHdpbGwgc2V0IFtjdXJyZW50XSB0byBudWxsLgogICAqLwogIHZvaWQgc2V0IHJhd0luZGV4KGludCByYXdJbmRleCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkSW5kZXgocmF3SW5kZXgsIHN0cmluZywgInJhd0luZGV4Iik7CiAgICByZXNldChyYXdJbmRleCk7CiAgICBtb3ZlTmV4dCgpOwogIH0KCiAgLyoqCiAgICogUmVzZXRzIHRoZSBpdGVyYXRvciB0byB0aGUgZ2l2ZW4gaW5kZXggaW50byB0aGUgc3RyaW5nLgogICAqCiAgICogQWZ0ZXIgdGhpcyB0aGUgW2N1cnJlbnRdIHZhbHVlIGlzIHVuc2V0LgogICAqIFlvdSBtdXN0IGNhbGwgW21vdmVOZXh0XSBtYWtlIHRoZSBydW5lIGF0IHRoZSBwb3NpdGlvbiBjdXJyZW50LAogICAqIG9yIFttb3ZlUHJldmlvdXNdIGZvciB0aGUgbGFzdCBydW5lIGJlZm9yZSB0aGUgcG9zaXRpb24uCiAgICoKICAgKiBTZXR0aW5nIGEgbmVnYXRpdmUgW3Jhd0luZGV4XSwgb3Igb25lIGdyZWF0ZXIgdGhhbiBbOnN0cmluZy5sZW5ndGg6XSwKICAgKiBpcyBhbiBlcnJvci4gU28gaXMgc2V0dGluZyBpdCBpbiB0aGUgbWlkZGxlIG9mIGEgc3Vycm9nYXRlIHBhaXIuCiAgICovCiAgdm9pZCByZXNldChbaW50IHJhd0luZGV4ID0gMF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWx1ZUluSW50ZXJ2YWwocmF3SW5kZXgsIDAsIHN0cmluZy5sZW5ndGgsICJyYXdJbmRleCIpOwogICAgX2NoZWNrU3BsaXRTdXJyb2dhdGUocmF3SW5kZXgpOwogICAgX3Bvc2l0aW9uID0gX25leHRQb3NpdGlvbiA9IHJhd0luZGV4OwogICAgX2N1cnJlbnRDb2RlUG9pbnQgPSBudWxsOwogIH0KCiAgLyoqIFRoZSBydW5lIChpbnRlZ2VyIFVuaWNvZGUgY29kZSBwb2ludCkgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4KICAgKiAgdGhlIHN0cmluZy4KICAgKi8KICBpbnQgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnRDb2RlUG9pbnQ7CgogIC8qKgogICAqIFRoZSBudW1iZXIgb2YgY29kZSB1bml0cyBjb21wcmlzaW5nIHRoZSBjdXJyZW50IHJ1bmUuCiAgICoKICAgKiBSZXR1cm5zIHplcm8gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBydW5lIChbY3VycmVudF0gaXMgbnVsbCkuCiAgICovCiAgaW50IGdldCBjdXJyZW50U2l6ZSA9PiBfbmV4dFBvc2l0aW9uIC0gX3Bvc2l0aW9uOwoKICAvKioKICAgKiBBIHN0cmluZyBjb250YWluaW5nIHRoZSBjdXJyZW50IHJ1bmUuCiAgICoKICAgKiBGb3IgcnVuZXMgb3V0c2lkZSB0aGUgYmFzaWMgbXVsdGlsaW5ndWFsIHBsYW5lLCB0aGlzIHdpbGwgYmUKICAgKiBhIFN0cmluZyBvZiBsZW5ndGggMiwgY29udGFpbmluZyB0d28gY29kZSB1bml0cy4KICAgKgogICAqIFJldHVybnMgbnVsbCBpZiBbY3VycmVudF0gaXMgbnVsbC4KICAgKi8KICBTdHJpbmcgZ2V0IGN1cnJlbnRBc1N0cmluZyB7CiAgICBpZiAoX3Bvc2l0aW9uID09IF9uZXh0UG9zaXRpb24pIHJldHVybiBudWxsOwogICAgaWYgKF9wb3NpdGlvbiArIDEgPT0gX25leHRQb3NpdGlvbikgcmV0dXJuIHN0cmluZ1tfcG9zaXRpb25dOwogICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoX3Bvc2l0aW9uLCBfbmV4dFBvc2l0aW9uKTsKICB9CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBfcG9zaXRpb24gPSBfbmV4dFBvc2l0aW9uOwogICAgaWYgKF9wb3NpdGlvbiA9PSBzdHJpbmcubGVuZ3RoKSB7CiAgICAgIF9jdXJyZW50Q29kZVBvaW50ID0gbnVsbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaW50IGNvZGVVbml0ID0gc3RyaW5nLmNvZGVVbml0QXQoX3Bvc2l0aW9uKTsKICAgIGludCBuZXh0UG9zaXRpb24gPSBfcG9zaXRpb24gKyAxOwogICAgaWYgKF9pc0xlYWRTdXJyb2dhdGUoY29kZVVuaXQpICYmIG5leHRQb3NpdGlvbiA8IHN0cmluZy5sZW5ndGgpIHsKICAgICAgaW50IG5leHRDb2RlVW5pdCA9IHN0cmluZy5jb2RlVW5pdEF0KG5leHRQb3NpdGlvbik7CiAgICAgIGlmIChfaXNUcmFpbFN1cnJvZ2F0ZShuZXh0Q29kZVVuaXQpKSB7CiAgICAgICAgX25leHRQb3NpdGlvbiA9IG5leHRQb3NpdGlvbiArIDE7CiAgICAgICAgX2N1cnJlbnRDb2RlUG9pbnQgPSBfY29tYmluZVN1cnJvZ2F0ZVBhaXIoY29kZVVuaXQsIG5leHRDb2RlVW5pdCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIF9uZXh0UG9zaXRpb24gPSBuZXh0UG9zaXRpb247CiAgICBfY3VycmVudENvZGVQb2ludCA9IGNvZGVVbml0OwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIG1vdmVQcmV2aW91cygpIHsKICAgIF9uZXh0UG9zaXRpb24gPSBfcG9zaXRpb247CiAgICBpZiAoX3Bvc2l0aW9uID09IDApIHsKICAgICAgX2N1cnJlbnRDb2RlUG9pbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpbnQgcG9zaXRpb24gPSBfcG9zaXRpb24gLSAxOwogICAgaW50IGNvZGVVbml0ID0gc3RyaW5nLmNvZGVVbml0QXQocG9zaXRpb24pOwogICAgaWYgKF9pc1RyYWlsU3Vycm9nYXRlKGNvZGVVbml0KSAmJiBwb3NpdGlvbiA+IDApIHsKICAgICAgaW50IHByZXZDb2RlVW5pdCA9IHN0cmluZy5jb2RlVW5pdEF0KHBvc2l0aW9uIC0gMSk7CiAgICAgIGlmIChfaXNMZWFkU3Vycm9nYXRlKHByZXZDb2RlVW5pdCkpIHsKICAgICAgICBfcG9zaXRpb24gPSBwb3NpdGlvbiAtIDE7CiAgICAgICAgX2N1cnJlbnRDb2RlUG9pbnQgPSBfY29tYmluZVN1cnJvZ2F0ZVBhaXIocHJldkNvZGVVbml0LCBjb2RlVW5pdCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIF9wb3NpdGlvbiA9IHBvc2l0aW9uOwogICAgX2N1cnJlbnRDb2RlUG9pbnQgPSBjb2RlVW5pdDsKICAgIHJldHVybiB0cnVlOwogIH0KfQqDPwBOTjwBEwEEJANQR01LUFAmA0dNSgMYGCsrAwwREgMLDxESA09DAyMvAz8DMwNAAzIDQlADHEsDRkMDGCMzA0sNAyQDTE1LTgM0A0pJPVBOMwMfMywDTCADFgNHLgMNA0YmeAQ/BjsFUCQFMAVLFQU5JycFRkcvLgZBIQEGOgVQSkEWBUEGNgEGRQVPTAwFSRUFIQVOBUAFUQZMTFAiKBo9HgEGTwVPSRwFITQtLQUiOAYhAQY/Bh0BBh8FSEotBSYmBSEmJgYSAQZEBUssBhQBBk8FRDBMOQUyBUZKJgYiAQYmBUM6MwVOLC1CTB02JwYfAQZBBScGHwEGQwUePz8FSjUFPz8FPAVNTCwFQD8GNQEGSiUFIzk5BSYFOgVBBi0BBlAuBSM6OgVABTsFRQYxAQYrBhQBBi8GFwEGRQUoBiMBBkoqBSIuKgY0AQZFBVE1DTAJOA0YHScJTjoFTglLMjs7PUA7QEJGPgVGCUpFGQYRAQY4BTUGFQEGOQU2BhYBBkwPBS4sBT0GIAEGQQVCQQVDQQVDQUYiQzAGNQEGQgVCQQVDQQVDQUYiQzAGNgEGPgUmOzsFTAwFPDwFQQY2AQZROAVBRgZGAQY8BTBISwVPUAZHHQEGPwVLTiYFQQVNTCwGMwEGTAwFTU5NBU5RBUE8BU0rBTtISwVRBkYBBkYFKQVGBU4xMgY/AQZRBThBBSZJBUg5BR4/SwVPRgUaNzkFTQ4FHUQFJzFEBTchBTwfSAVLSREFTQYnAQZJDQVOBUwtBUY9BUoFRDEyBidKAQZLBhsBBkIFTE0jBhMBBjtPBTEsBU8eBkgYAQY7TwUxLAVPHgZIGAIBBDoEJBcWATUBER4oBiAuODgsOggGEQQCAUU+AUY/AUgwPAIBTQwFOyAXMREwFQYZBUkrBhkBRx4eFxsBBlEFMEtOGAVJBiwZGyA+IQQBSykVITo3QgYEAQZGBTEGRwEGSwVEGEYFUAYkPhUQBAEGPQUuRT4FS0YGI00kKh4EAVASBigBBjsFQwY0AQYrBUI2BSgGHzFCNwQBFB8mIBQGMSZGOi0qSxUIBiIiEQQBGB8aIBQGIjA3OiwiSxUIBhoiEQQCARVkYXJ0OmNvcmUvc3RyaW5nLmRhcnQzb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvc3RyaW5nX2J1ZmZlci5kYXJ0heovLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQSBjbGFzcyBmb3IgY29uY2F0ZW5hdGluZyBzdHJpbmdzIGVmZmljaWVudGx5LgogKgogKiBBbGxvd3MgZm9yIHRoZSBpbmNyZW1lbnRhbCBidWlsZGluZyBvZiBhIHN0cmluZyB1c2luZyB3cml0ZSooKSBtZXRob2RzLgogKiBUaGUgc3RyaW5ncyBhcmUgY29uY2F0ZW5hdGVkIHRvIGEgc2luZ2xlIHN0cmluZyBvbmx5IHdoZW4gW3RvU3RyaW5nXSBpcwogKiBjYWxsZWQuCiAqLwpjbGFzcyBTdHJpbmdCdWZmZXIgaW1wbGVtZW50cyBTdHJpbmdTaW5rIHsKICAvKiogQ3JlYXRlcyB0aGUgc3RyaW5nIGJ1ZmZlciB3aXRoIGFuIGluaXRpYWwgY29udGVudC4gKi8KICBleHRlcm5hbCBTdHJpbmdCdWZmZXIoW09iamVjdCBjb250ZW50ID0gIiJdKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZW50IHRoYXQgaGFzIGJlZW4gYWNjdW11bGF0ZWQgc28gZmFyLgogICAqIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KICAgKi8KICBleHRlcm5hbCBpbnQgZ2V0IGxlbmd0aDsKCiAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgYnVmZmVyIGlzIGVtcHR5LiBUaGlzIGlzIGEgY29uc3RhbnQtdGltZSBvcGVyYXRpb24uICovCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBsZW5ndGggPT0gMDsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBidWZmZXIgaXMgbm90IGVtcHR5LiBUaGlzIGlzIGEgY29uc3RhbnQtdGltZQogICAqIG9wZXJhdGlvbi4KICAgKi8KICBib29sIGdldCBpc05vdEVtcHR5ID0+ICFpc0VtcHR5OwoKICAvLy8gQWRkcyB0aGUgY29udGVudHMgb2YgW29ial0sIGNvbnZlcnRlZCB0byBhIHN0cmluZywgdG8gdGhlIGJ1ZmZlci4KICBleHRlcm5hbCB2b2lkIHdyaXRlKE9iamVjdCBvYmopOwoKICAvLy8gQWRkcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIFtjaGFyQ29kZV0gdG8gdGhlIGJ1ZmZlci4KICBleHRlcm5hbCB2b2lkIHdyaXRlQ2hhckNvZGUoaW50IGNoYXJDb2RlKTsKCiAgZXh0ZXJuYWwgdm9pZCB3cml0ZUFsbChJdGVyYWJsZSBvYmplY3RzLCBbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSk7CgogIGV4dGVybmFsIHZvaWQgd3JpdGVsbihbT2JqZWN0IG9iaiA9ICIiXSk7CgogIC8qKgogICAqIENsZWFycyB0aGUgc3RyaW5nIGJ1ZmZlci4KICAgKi8KICBleHRlcm5hbCB2b2lkIGNsZWFyKCk7CgogIC8vLyBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiBidWZmZXIgYXMgYSBjb25jYXRlbmF0ZWQgc3RyaW5nLgogIGV4dGVybmFsIFN0cmluZyB0b1N0cmluZygpOwp9CjQATk48ARMBBDIDS0sLBCs8MAEGSSgGGwFRIwEGRhAGIwFIIwFCLQFFASwBBh8GGQE/HgIBHGRhcnQ6Y29yZS9zdHJpbmdfYnVmZmVyLmRhcnQ4b3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9zdHJpbmdfYnVmZmVyX3BhdGNoLmRhcnSWWi8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIFN0cmluZ0J1ZmZlciB7CiAgc3RhdGljIGNvbnN0IGludCBfQlVGRkVSX1NJWkUgPSA2NDsKICBzdGF0aWMgY29uc3QgaW50IF9QQVJUU19UT19DT01QQUNUID0gMTI4OwogIHN0YXRpYyBjb25zdCBpbnQgX1BBUlRTX1RPX0NPTVBBQ1RfU0laRV9MSU1JVCA9IF9QQVJUU19UT19DT01QQUNUICogODsKCiAgLyoqCiAgICogV2hlbiBzdHJpbmdzIGFyZSB3cml0dGVuIHRvIHRoZSBzdHJpbmcgYnVmZmVyLCB3ZSBhZGQgdGhlbSB0byBhCiAgICogbGlzdCBvZiBzdHJpbmcgcGFydHMuCiAgICovCiAgTGlzdDxTdHJpbmc+IF9wYXJ0czsKCiAgLyoqCiAgICAqIFRvdGFsIG51bWJlciBvZiBjb2RlIHVuaXRzIGluIHRoZSBzdHJpbmcgcGFydHMuIERvZXMgbm90IGluY2x1ZGUKICAgICogdGhlIGNvZGUgdW5pdHMgYWRkZWQgdG8gdGhlIGJ1ZmZlci4KICAgICovCiAgaW50IF9wYXJ0c0NvZGVVbml0cyA9IDA7CgogIC8qKgogICAqIFRvIHByZXNlcnZlIG1lbW9yeSwgd2Ugc29tZXRpbWVzIGNvbXBhY3QgdGhlIHBhcnRzLiBUaGlzIGNvbWJpbmVzCiAgICogc2V2ZXJhbCBzbWFsbGVyIHBhcnRzIGludG8gYSBzaW5nbGUgbGFyZ2VyIHBhcnQgdG8gY3V0IGRvd24gb24gdGhlCiAgICogY29zdCB0aGF0IGNvbWVzIGZyb20gdGhlIHBlci1vYmplY3QgbWVtb3J5IG92ZXJoZWFkLiBXZSBrZWVwIHRyYWNrCiAgICogb2YgdGhlIGxhc3QgaW5kZXggd2hlcmUgd2UgZW5kZWQgb3VyIGNvbXBhY3Rpb24gYW5kIHRoZSBudW1iZXIgb2YKICAgKiBjb2RlIHVuaXRzIGFkZGVkIHNpbmNlIHRoZSBsYXN0IGNvbXBhY3Rpb24uCiAgICovCiAgaW50IF9wYXJ0c0NvbXBhY3Rpb25JbmRleCA9IDA7CiAgaW50IF9wYXJ0c0NvZGVVbml0c1NpbmNlQ29tcGFjdGlvbiA9IDA7CgogIC8qKgogICAqIFRoZSBidWZmZXIgaXMgdXNlZCB0byBidWlsZCB1cCBhIHN0cmluZyBmcm9tIGNvZGUgdW5pdHMuIEl0IGlzCiAgICogdXNlZCB3aGVuIHdyaXRpbmcgc2hvcnQgc3RyaW5ncyBvciBpbmRpdmlkdWFsIGNoYXIgY29kZXMgdG8gdGhlCiAgICogYnVmZmVyLiBUaGUgYnVmZmVyIGlzIGFsbG9jYXRlZCBvbiBkZW1hbmQuCiAgICovCiAgVWludDE2TGlzdCBfYnVmZmVyOwogIGludCBfYnVmZmVyUG9zaXRpb24gPSAwOwoKICAvKioKICAgKiBDb2xsZWN0cyB0aGUgYXBwcm94aW1hdGUgbWF4aW1hbCBtYWduaXR1ZGUgb2YgdGhlIGNvZGUgdW5pdHMgYWRkZWQKICAgKiB0byB0aGUgYnVmZmVyLgogICAqCiAgICogVGhlIHZhbHVlIG9mIGVhY2ggYWRkZWQgY29kZSB1bml0IGlzIG9yJ2VkIHdpdGggdGhpcyB2YXJpYWJsZSwgc28gdGhlCiAgICogbW9zdCBzaWduaWZpY2FudCBiaXQgc2V0IGluIGFueSBjb2RlIHVuaXQgaXMgYWxzbyBzZXQgaW4gdGhpcyB2YWx1ZS4KICAgKiBJZiBiZWxvdyAyNTYsIHRoZSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciBpcyBhIExhdGluLTEgc3RyaW5nLgogICAqLwogIGludCBfYnVmZmVyQ29kZVVuaXRNYWduaXR1ZGUgPSAwOwoKICAvLy8gQ3JlYXRlcyB0aGUgc3RyaW5nIGJ1ZmZlciB3aXRoIGFuIGluaXRpYWwgY29udGVudC4KICBAcGF0Y2gKICBTdHJpbmdCdWZmZXIoW09iamVjdCBjb250ZW50ID0gIiJdKSB7CiAgICB3cml0ZShjb250ZW50KTsKICB9CgogIEBwYXRjaAogIGludCBnZXQgbGVuZ3RoID0+IF9wYXJ0c0NvZGVVbml0cyArIF9idWZmZXJQb3NpdGlvbjsKCiAgQHBhdGNoCiAgdm9pZCB3cml0ZShPYmplY3Qgb2JqKSB7CiAgICBTdHJpbmcgc3RyID0gJyRvYmonOwogICAgaWYgKHN0ci5pc0VtcHR5KSByZXR1cm47CiAgICBfY29uc3VtZUJ1ZmZlcigpOwogICAgX2FkZFBhcnQoc3RyKTsKICB9CgogIEBwYXRjaAogIHZvaWQgd3JpdGVDaGFyQ29kZShpbnQgY2hhckNvZGUpIHsKICAgIGlmIChjaGFyQ29kZSA8PSAweEZGRkYpIHsKICAgICAgaWYgKGNoYXJDb2RlIDwgMCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGNoYXJDb2RlLCAwLCAweDEwRkZGRik7CiAgICAgIH0KICAgICAgX2Vuc3VyZUNhcGFjaXR5KDEpOwogICAgICBfYnVmZmVyW19idWZmZXJQb3NpdGlvbisrXSA9IGNoYXJDb2RlOwogICAgICBfYnVmZmVyQ29kZVVuaXRNYWduaXR1ZGUgfD0gY2hhckNvZGU7CiAgICB9IGVsc2UgewogICAgICBpZiAoY2hhckNvZGUgPiAweDEwRkZGRikgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGNoYXJDb2RlLCAwLCAweDEwRkZGRik7CiAgICAgIH0KICAgICAgX2Vuc3VyZUNhcGFjaXR5KDIpOwogICAgICBpbnQgYml0cyA9IGNoYXJDb2RlIC0gMHgxMDAwMDsKICAgICAgX2J1ZmZlcltfYnVmZmVyUG9zaXRpb24rK10gPSAweEQ4MDAgfCAoYml0cyA+PiAxMCk7CiAgICAgIF9idWZmZXJbX2J1ZmZlclBvc2l0aW9uKytdID0gMHhEQzAwIHwgKGJpdHMgJiAweDNGRik7CiAgICAgIF9idWZmZXJDb2RlVW5pdE1hZ25pdHVkZSB8PSAweEZGRkY7CiAgICB9CiAgfQoKICBAcGF0Y2gKICB2b2lkIHdyaXRlQWxsKEl0ZXJhYmxlIG9iamVjdHMsIFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSB7CiAgICBJdGVyYXRvciBpdGVyYXRvciA9IG9iamVjdHMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHJldHVybjsKICAgIGlmIChzZXBhcmF0b3IuaXNFbXB0eSkgewogICAgICBkbyB7CiAgICAgICAgd3JpdGUoaXRlcmF0b3IuY3VycmVudCk7CiAgICAgIH0gd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGUoaXRlcmF0b3IuY3VycmVudCk7CiAgICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgICAgd3JpdGUoc2VwYXJhdG9yKTsKICAgICAgICB3cml0ZShpdGVyYXRvci5jdXJyZW50KTsKICAgICAgfQogICAgfQogIH0KCiAgQHBhdGNoCiAgdm9pZCB3cml0ZWxuKFtPYmplY3Qgb2JqID0gIiJdKSB7CiAgICB3cml0ZShvYmopOwogICAgd3JpdGUoIlxuIik7CiAgfQoKICAvKiogTWFrZXMgdGhlIGJ1ZmZlciBlbXB0eS4gKi8KICBAcGF0Y2gKICB2b2lkIGNsZWFyKCkgewogICAgX3BhcnRzID0gbnVsbDsKICAgIF9wYXJ0c0NvZGVVbml0cyA9IF9idWZmZXJQb3NpdGlvbiA9IF9idWZmZXJDb2RlVW5pdE1hZ25pdHVkZSA9IDA7CiAgfQoKICAvKiogUmV0dXJucyB0aGUgY29udGVudHMgb2YgYnVmZmVyIGFzIGEgc3RyaW5nLiAqLwogIEBwYXRjaAogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIF9jb25zdW1lQnVmZmVyKCk7CiAgICByZXR1cm4gKF9wYXJ0c0NvZGVVbml0cyA9PSAwKQogICAgICAgID8gIiIKICAgICAgICA6IF9TdHJpbmdCYXNlLl9jb25jYXRSYW5nZShfcGFydHMsIDAsIF9wYXJ0cy5sZW5ndGgpOwogIH0KCiAgLyoqIEVuc3VyZXMgdGhhdCB0aGUgYnVmZmVyIGhhcyBlbm91Z2ggY2FwYWNpdHkgdG8gYWRkIG4gY29kZSB1bml0cy4gKi8KICB2b2lkIF9lbnN1cmVDYXBhY2l0eShpbnQgbikgewogICAgaWYgKF9idWZmZXIgPT0gbnVsbCkgewogICAgICBfYnVmZmVyID0gbmV3IFVpbnQxNkxpc3QoX0JVRkZFUl9TSVpFKTsKICAgIH0gZWxzZSBpZiAoX2J1ZmZlclBvc2l0aW9uICsgbiA+IF9idWZmZXIubGVuZ3RoKSB7CiAgICAgIF9jb25zdW1lQnVmZmVyKCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBDb25zdW1lcyB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyIGJ5IHR1cm5pbmcgaXQgaW50byBhIHN0cmluZwogICAqIGFuZCBhZGRpbmcgaXQgYXMgYSBwYXJ0LiBBZnRlciBjYWxsaW5nIHRoaXMgdGhlIGJ1ZmZlciBwb3NpdGlvbgogICAqIHdpbGwgYmUgcmVzZXQgdG8gemVyby4KICAgKi8KICB2b2lkIF9jb25zdW1lQnVmZmVyKCkgewogICAgaWYgKF9idWZmZXJQb3NpdGlvbiA9PSAwKSByZXR1cm47CiAgICBib29sIGlzTGF0aW4xID0gX2J1ZmZlckNvZGVVbml0TWFnbml0dWRlIDw9IDB4RkY7CiAgICBTdHJpbmcgc3RyID0gX2NyZWF0ZShfYnVmZmVyLCBfYnVmZmVyUG9zaXRpb24sIGlzTGF0aW4xKTsKICAgIF9idWZmZXJQb3NpdGlvbiA9IF9idWZmZXJDb2RlVW5pdE1hZ25pdHVkZSA9IDA7CiAgICBfYWRkUGFydChzdHIpOwogIH0KCiAgLyoqCiAgICogQWRkcyBhIG5ldyBwYXJ0IHRvIHRoaXMgc3RyaW5nIGJ1ZmZlciBhbmQga2VlcHMgdHJhY2sgb2YgaG93CiAgICogbWFueSBjb2RlIHVuaXRzIGFyZSBjb250YWluZWQgaW4gdGhlIHBhcnRzLgogICAqLwogIHZvaWQgX2FkZFBhcnQoU3RyaW5nIHN0cikgewogICAgaW50IGxlbmd0aCA9IHN0ci5sZW5ndGg7CiAgICBfcGFydHNDb2RlVW5pdHMgKz0gbGVuZ3RoOwogICAgX3BhcnRzQ29kZVVuaXRzU2luY2VDb21wYWN0aW9uICs9IGxlbmd0aDsKCiAgICBpZiAoX3BhcnRzID09IG51bGwpIHsKICAgICAgLy8gRW1waXJpY2FsbHkgdGhpcyBpcyBhIGdvb2QgY2FwYWNpdHkgdG8gbWluaW1pemUgdG90YWwgYnl0ZXMgYWxsb2NhdGVkLgogICAgICBfcGFydHMgPSBuZXcgX0dyb3dhYmxlTGlzdC53aXRoQ2FwYWNpdHkoMTApLi5hZGQoc3RyKTsKICAgIH0gZWxzZSB7CiAgICAgIF9wYXJ0cy5hZGQoc3RyKTsKICAgICAgaW50IHBhcnRzU2luY2VDb21wYWN0aW9uID0gX3BhcnRzLmxlbmd0aCAtIF9wYXJ0c0NvbXBhY3Rpb25JbmRleDsKICAgICAgaWYgKHBhcnRzU2luY2VDb21wYWN0aW9uID09IF9QQVJUU19UT19DT01QQUNUKSB7CiAgICAgICAgX2NvbXBhY3QoKTsKICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogQ29tcGFjdHMgdGhlIGxhc3QgTiBwYXJ0cyBpZiB0aGVpciBhdmVyYWdlIHNpemUgYWxsb3dzIHVzIHRvIHNhdmUgYQogICAqIGxvdCBvZiBtZW1vcnkgYnkgdHVybmluZyB0aGVtIGFsbCBpbnRvIGEgc2luZ2xlIHBhcnQuCiAgICovCiAgdm9pZCBfY29tcGFjdCgpIHsKICAgIGlmIChfcGFydHNDb2RlVW5pdHNTaW5jZUNvbXBhY3Rpb24gPCBfUEFSVFNfVE9fQ09NUEFDVF9TSVpFX0xJTUlUKSB7CiAgICAgIFN0cmluZyBjb21wYWN0ZWQgPSBfU3RyaW5nQmFzZS5fY29uY2F0UmFuZ2UoCiAgICAgICAgICBfcGFydHMsCiAgICAgICAgICBfcGFydHNDb21wYWN0aW9uSW5kZXgsIC8vIFN0YXJ0CiAgICAgICAgICBfcGFydHNDb21wYWN0aW9uSW5kZXggKyBfUEFSVFNfVE9fQ09NUEFDVCAvLyBFbmQKICAgICAgICAgICk7CiAgICAgIF9wYXJ0cy5sZW5ndGggPSBfcGFydHMubGVuZ3RoIC0gX1BBUlRTX1RPX0NPTVBBQ1Q7CiAgICAgIF9wYXJ0cy5hZGQoY29tcGFjdGVkKTsKICAgIH0KICAgIF9wYXJ0c0NvZGVVbml0c1NpbmNlQ29tcGFjdGlvbiA9IDA7CiAgICBfcGFydHNDb21wYWN0aW9uSW5kZXggPSBfcGFydHMubGVuZ3RoOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIGEgW1N0cmluZ10gZnJvbSB0aGUgVUZULTE2IGNvZGUgdW5pdHMgaW4gYnVmZmVyLgogICAqLwogIHN0YXRpYyBTdHJpbmcgX2NyZWF0ZShVaW50MTZMaXN0IGJ1ZmZlciwgaW50IGxlbmd0aCwgYm9vbCBpc0xhdGluMSkKICAgICAgbmF0aXZlICJTdHJpbmdCdWZmZXJfY3JlYXRlU3RyaW5nRnJvbVVpbnQxNkFycmF5IjsKfQqAxgBOTjwBHgEHFSYsSQEGRRsGFwEGRyoHGwEGR0hIRzEGISoBBkRFMAYWGwEGSBQFS0pBBiQBOQkoFAQBCTcBCRsZHRYTBAEJJR4aOwgaLSwNITsIGiU6PCoGBAEJPSomHQshJQ0fJBohCAYEAQkkEBEEASEJERNGBAE1CRYWIg0+BAFKIBsuNxgGBAEGREUcBhomNj40EwQBBkIxBh4dHy4BGlA9DRdINxQIBgQBBkk7BhRJMxIqOw05HQYoKwQBBj0GRjkCAShkYXJ0OmNvcmUtcGF0Y2gvc3RyaW5nX2J1ZmZlcl9wYXRjaC5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL3N0cmluZ19zaW5rLmRhcnSDdy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCmFic3RyYWN0IGNsYXNzIFN0cmluZ1NpbmsgewogIC8qKgogICAqIENvbnZlcnRzIFtvYmpdIHRvIGEgU3RyaW5nIGJ5IGludm9raW5nIFtPYmplY3QudG9TdHJpbmddIGFuZCAKICAgKiBhZGRzIHRoZSByZXN1bHQgdG8gYHRoaXNgLgogICAqLwogIHZvaWQgd3JpdGUoT2JqZWN0IG9iaik7CgogIC8qKgogICAqIEl0ZXJhdGVzIG92ZXIgdGhlIGdpdmVuIFtvYmplY3RzXSBhbmQgW3dyaXRlXXMgdGhlbSBpbiBzZXF1ZW5jZS4KICAgKi8KICB2b2lkIHdyaXRlQWxsKEl0ZXJhYmxlIG9iamVjdHMsIFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKTsKCiAgLyoqCiAgICogQ29udmVydHMgW29ial0gdG8gYSBTdHJpbmcgYnkgaW52b2tpbmcgW09iamVjdC50b1N0cmluZ10gYW5kIAogICAqIGFkZHMgdGhlIHJlc3VsdCB0byBgdGhpc2AsIGZvbGxvd2VkIGJ5IGEgbmV3bGluZS4KICAgKi8KICB2b2lkIHdyaXRlbG4oW09iamVjdCBvYmogPSAiIl0pOwoKICAvKioKICAgKiBXcml0ZXMgdGhlIFtjaGFyQ29kZV0gdG8gYHRoaXNgLgogICAqCiAgICogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgd3JpdGUobmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpKWAuCiAgICovCiAgdm9pZCB3cml0ZUNoYXJDb2RlKGludCBjaGFyQ29kZSk7Cn0KIQBOTjwBEwEcBkMgBhoBBkYGPAEGQzcGIwEGJgVOBiQCARpkYXJ0OmNvcmUvc3RyaW5nX3NpbmsuZGFydCxvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9zeW1ib2wuZGFydI5WLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLy8vIE9wYXF1ZSBuYW1lIHVzZWQgYnkgbWlycm9ycywgaW52b2NhdGlvbnMgYW5kIFtGdW5jdGlvbi5hcHBseV0uCmFic3RyYWN0IGNsYXNzIFN5bWJvbCB7CiAgLyoqIFRoZSBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgbmFtZSBvZiB0aGUgdW5hcnkgbWludXMgb3BlcmF0b3IuICovCiAgc3RhdGljIGNvbnN0IFN5bWJvbCB1bmFyeU1pbnVzID0gU3ltYm9sKCJ1bmFyeS0iKTsKCiAgLyoqCiAgICogVGhlIGVtcHR5IHN5bWJvbC4KICAgKgogICAqIFRoZSBlbXB0eSBzeW1ib2wgaXMgdGhlIG5hbWUgb2YgbGlicmFyaWVzIHdpdGggbm8gbGlicmFyeSBkZWNsYXJhdGlvbiwKICAgKiBhbmQgdGhlIGJhc2UtbmFtZSBvZiB0aGUgdW5uYW1lZCBjb25zdHJ1Y3Rvci4KICAgKi8KICBzdGF0aWMgY29uc3QgU3ltYm9sIGVtcHR5ID0gU3ltYm9sKCIiKTsKCiAgLyoqCiAgICogQ29uc3RydWN0cyBhIG5ldyBbU3ltYm9sXSByZXByZXNlbnRpbmcgdGhlIHByb3ZpZGVkIG5hbWUuCiAgICoKICAgKiBUaGUgbmFtZSBtdXN0IGJlIGEgdmFsaWQgcHVibGljIERhcnQgbWVtYmVyIG5hbWUsCiAgICogcHVibGljIGNvbnN0cnVjdG9yIG5hbWUsIG9yIGxpYnJhcnkgbmFtZSwgb3B0aW9uYWxseSBxdWFsaWZpZWQuCiAgICoKICAgKiBBIHF1YWxpZmllZCBuYW1lIGlzIGEgdmFsaWQgbmFtZSBwcmVjZWRlZCBieSBhIHB1YmxpYyBpZGVudGlmaWVyIG5hbWUKICAgKiBhbmQgYSAnYC5gJywgZS5nLiwgYGZvby5iYXIuYmF6PWAgaXMgYSBxdWFsaWZpZWQgdmVyc2lvbiBvZiBgYmF6PWAuCiAgICogVGhhdCBtZWFucyB0aGF0IHRoZSBjb250ZW50IG9mIHRoZSBbbmFtZV0gU3RyaW5nIG11c3QgYmUgZWl0aGVyCiAgICoKICAgKiAqIGEgdmFsaWQgcHVibGljIERhcnQgaWRlbnRpZmllcgogICAqICAgKHRoYXQgaXMsIGFuIGlkZW50aWZpZXIgbm90IHN0YXJ0aW5nIHdpdGggImBfYCIpLAogICAqICogc3VjaCBhbiBpZGVudGlmaWVyIGZvbGxvd2VkIGJ5ICI9IiAoYSBzZXR0ZXIgbmFtZSksCiAgICogKiB0aGUgbmFtZSBvZiBhIGRlY2xhcmFibGUgb3BlcmF0b3IKICAgKiAgIChvbmUgb2YgImArYCIsICJgLWAiLCAiYCpgIiwgImAvYCIsICJgJWAiLCAiYH4vYCIsICJgJmAiLCAiYHxgIiwKICAgKiAgICJgXmAiLCAiYH5gIiwgImA8PGAiLCAiYD4+YCIsICJgPGAiLCAiYDw9YCIsICJgPmAiLCAiYD49YCIsICJgPT1gIiwKICAgKiAgICJgW11gIiwgImBbXT1gIiwgb3IgImB1bmFyeS1gIiksCiAgICogKiBhbnkgb2YgdGhlIGFib3ZlIHByZWNlZGVkIGJ5IGFueSBudW1iZXIgb2YgcXVhbGlmaWVycywKICAgKiAgIHdoZXJlIGEgcXVhbGlmaWVyIGlzIGEgbm9uLXByaXZhdGUgaWRlbnRpZmllciBmb2xsb3dlZCBieSAnYC5gJywKICAgKiAqIG9yIHRoZSBlbXB0eSBzdHJpbmcgKHRoZSBkZWZhdWx0IG5hbWUgb2YgYSBsaWJyYXJ5IHdpdGggbm8gbGlicmFyeQogICAqICAgbmFtZSBkZWNsYXJhdGlvbikuCiAgICoKICAgKiBTeW1ib2wgaW5zdGFuY2VzIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBbbmFtZV0gYXJlIGVxdWFsLAogICAqIGJ1dCBub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsLCBidXQgc3ltYm9scyBjcmVhdGVkIGFzIGNvbXBpbGUtdGltZQogICAqIGNvbnN0YW50cyBhcmUgY2Fub25pY2FsaXplZCwgYXMgYWxsIG90aGVyIGNvbnN0YW50IG9iamVjdCBjcmVhdGlvbnMuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogYXNzZXJ0KG5ldyBTeW1ib2woImZvbyIpID09IG5ldyBTeW1ib2woImZvbyIpKTsKICAgKiBhc3NlcnQoaWRlbnRpY2FsKGNvbnN0IFN5bWJvbCgiZm9vIiksIGNvbnN0IFN5bWJvbCgiZm9vIikpKTsKICAgKiBgYGAKICAgKgogICAqIElmIFtuYW1lXSBpcyBhIHNpbmdsZSBpZGVudGlmaWVyIHRoYXQgZG9lcyBub3Qgc3RhcnQgd2l0aCBhbiB1bmRlcnNjb3JlLAogICAqIG9yIGl0IGlzIGEgcXVhbGlmaWVkIGlkZW50aWZpZXIsCiAgICogb3IgaXQgaXMgYW4gb3BlcmF0b3IgbmFtZSBkaWZmZXJlbnQgZnJvbSBgdW5hcnktYCwKICAgKiB0aGVuIHRoZSByZXN1bHQgb2YgYGNvbnN0IFN5bWJvbChuYW1lKWAgaXMgdGhlIHNhbWUgaW5zdGFuY2UgdGhhdAogICAqIHRoZSBzeW1ib2wgbGl0ZXJhbCBjcmVhdGVkIGJ5IHByZWZpeGluZyBgI2AgdG8gdGhlIGNvbnRlbnQgb2YgW25hbWVdCiAgICogd291bGQgZXZhbHVhdGUgdG8uCiAgICoKICAgKiBgYGBkYXJ0CiAgICogYXNzZXJ0KG5ldyBTeW1ib2woImZvbyIpID09ICNmb28pOwogICAqIGFzc2VydChuZXcgU3ltYm9sKCJbXT0iKSA9PSAjW109XSk7CiAgICogYXNzZXJ0KG5ldyBTeW1ib2woImZvby5iYXIiKSA9PSAjZm9vLmJhcik7CiAgICogYXNzZXJ0KGlkZW50aWNhbChjb25zdCBTeW1ib2woImZvbyIpLCAjZm9vKSk7CiAgICogYXNzZXJ0KGlkZW50aWNhbChjb25zdCBTeW1ib2woIltdPSIpLCAjW109XSkpOwogICAqIGFzc2VydChpZGVudGljYWwoY29uc3QgU3ltYm9sKCJmb28uYmFyIiksICNmb28uYmFyKSk7CiAgICogYGBgCiAgICoKICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbm5vdCBjcmVhdGUgYSBbU3ltYm9sXSBpbnN0YW5jZSB0aGF0IGlzIGVxdWFsIHRvCiAgICogYSBwcml2YXRlIHN5bWJvbCBsaXRlcmFsIGxpa2UgYCNfZm9vYC4KICAgKiBgYGBkYXJ0CiAgICogY29uc3QgU3ltYm9sKCJfZm9vIikgLy8gSW52YWxpZAogICAqIGBgYAogICAqCiAgICogVGhlIGNyZWF0ZWQgaW5zdGFuY2Ugb3ZlcnJpZGVzIFtPYmplY3QuPT1dLgogICAqCiAgICogVGhlIGZvbGxvd2luZyB0ZXh0IGlzIG5vbi1ub3JtYXRpdmU6CiAgICoKICAgKiBDcmVhdGluZyBub24tY29uc3QgU3ltYm9sIGluc3RhbmNlcyBtYXkgcmVzdWx0IGluIGxhcmdlciBvdXRwdXQuICBJZgogICAqIHBvc3NpYmxlLCB1c2UgYE1pcnJvcnNVc2VkYCBmcm9tICJkYXJ0Om1pcnJvcnMiIHRvIHNwZWNpZnkgd2hpY2ggbmFtZXMKICAgKiBtaWdodCBiZSBwYXNzZWQgdG8gdGhpcyBjb25zdHJ1Y3Rvci4KICAgKi8KICBjb25zdCBmYWN0b3J5IFN5bWJvbChTdHJpbmcgbmFtZSkgPSBpbnRlcm5hbC5TeW1ib2w7CgogIC8qKgogICAqIFJldHVybnMgYSBoYXNoIGNvZGUgY29tcGF0aWJsZSB3aXRoIFtvcGVyYXRvcj09XS4KICAgKgogICAqIEVxdWFsIHN5bWJvbHMgaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUuCiAgICovCiAgaW50IGdldCBoYXNoQ29kZTsKCiAgLyoqCiAgICogU3ltYm9scyBhcmUgZXF1YWwgdG8gb3RoZXIgc3ltYm9scyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHNhbWUgbWVtYmVyIG5hbWUuCiAgICoKICAgKiBRdWFsaWZpZWQgbWVtYmVyIG5hbWVzLCBsaWtlIGAjZm9vLmJhcmAgYXJlIGVxdWFsIG9ubHkgaWYgdGhleSBoYXZlIHRoZQogICAqIHNhbWUgaWRlbnRpZmllcnMgYmVmb3JlIHRoZSBzYW1lIGZpbmFsIG1lbWJlciBuYW1lLgogICAqLwogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpOwp9CmMATk48ARMBQxhLNQEGFwVMMwYqAQY/BTdFBUtJRQUmOTspSEsoPkhKGgU+SEoFDTVCCQVOJjhHShgFDSgpMDM0OwkFSSwNJQkFMQUqBUpMKgY3AQY3BSwGFAEGUQVNOQYbAgEVZGFydDpjb3JlL3N5bWJvbC5kYXJ0Km9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL3R5cGUuZGFydIExLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIFJ1bnRpbWUgcmVwcmVzZW50YXRpb24gb2YgYSB0eXBlLgogKi8KYWJzdHJhY3QgY2xhc3MgVHlwZSB7fQoMAE5OPAETAQQlBBcBE2RhcnQ6Y29yZS90eXBlLmRhcnQpb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvdXJpLmRhcnTAApSCLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLy8gRnJlcXVlbnRseSB1c2VkIGNoYXJhY3RlciBjb2Rlcy4KY29uc3QgaW50IF9TUEFDRSA9IDB4MjA7CmNvbnN0IGludCBfUEVSQ0VOVCA9IDB4MjU7CmNvbnN0IGludCBfQU1QRVJTQU5EID0gMHgyNjsKY29uc3QgaW50IF9QTFVTID0gMHgyQjsKY29uc3QgaW50IF9ET1QgPSAweDJFOwpjb25zdCBpbnQgX1NMQVNIID0gMHgyRjsKY29uc3QgaW50IF9DT0xPTiA9IDB4M0E7CmNvbnN0IGludCBfRVFVQUxTID0gMHgzZDsKY29uc3QgaW50IF9VUFBFUl9DQVNFX0EgPSAweDQxOwpjb25zdCBpbnQgX1VQUEVSX0NBU0VfWiA9IDB4NUE7CmNvbnN0IGludCBfTEVGVF9CUkFDS0VUID0gMHg1QjsKY29uc3QgaW50IF9CQUNLU0xBU0ggPSAweDVDOwpjb25zdCBpbnQgX1JJR0hUX0JSQUNLRVQgPSAweDVEOwpjb25zdCBpbnQgX0xPV0VSX0NBU0VfQSA9IDB4NjE7CmNvbnN0IGludCBfTE9XRVJfQ0FTRV9GID0gMHg2NjsKY29uc3QgaW50IF9MT1dFUl9DQVNFX1ogPSAweDdBOwoKY29uc3QgU3RyaW5nIF9oZXhEaWdpdHMgPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CgovKioKICogQSBwYXJzZWQgVVJJLCBzdWNoIGFzIGEgVVJMLgogKgogKiAqKlNlZSBhbHNvOioqCiAqCiAqICogW1VSSXNdW3VyaXNdIGluIHRoZSBbbGlicmFyeSB0b3VyXVtsaWJ0b3VyXQogKiAqIFtSRkMtMzk4Nl0oaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NikKICoKICogW3VyaXNdOiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NoMDMuaHRtbCN1cmlzCiAqIFtsaWJ0b3VyXTogaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RvY3MvZGFydC11cC1hbmQtcnVubmluZy9jb250ZW50cy9jaDAzLmh0bWwKICovCmFic3RyYWN0IGNsYXNzIFVyaSB7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgbmF0dXJhbCBiYXNlIFVSSSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uCiAgICoKICAgKiBXaGVuIHJ1bm5pbmcgaW4gYSBicm93c2VyIHRoaXMgaXMgdGhlIGN1cnJlbnQgVVJMIG9mIHRoZSBjdXJyZW50IHBhZ2UKICAgKiAoZnJvbSBgd2luZG93LmxvY2F0aW9uLmhyZWZgKS4KICAgKgogICAqIFdoZW4gbm90IHJ1bm5pbmcgaW4gYSBicm93c2VyIHRoaXMgaXMgdGhlIGZpbGUgVVJJIHJlZmVyZW5jaW5nCiAgICogdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIFVyaSBnZXQgYmFzZTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBVUkkgZnJvbSBpdHMgY29tcG9uZW50cy4KICAgKgogICAqIEVhY2ggY29tcG9uZW50IGlzIHNldCB0aHJvdWdoIGEgbmFtZWQgYXJndW1lbnQuIEFueSBudW1iZXIgb2YKICAgKiBjb21wb25lbnRzIGNhbiBiZSBwcm92aWRlZC4gVGhlIFtwYXRoXSBhbmQgW3F1ZXJ5XSBjb21wb25lbnRzIGNhbiBiZSBzZXQKICAgKiB1c2luZyBlaXRoZXIgb2YgdHdvIGRpZmZlcmVudCBuYW1lZCBhcmd1bWVudHMuCiAgICoKICAgKiBUaGUgc2NoZW1lIGNvbXBvbmVudCBpcyBzZXQgdGhyb3VnaCBbc2NoZW1lXS4gVGhlIHNjaGVtZSBpcwogICAqIG5vcm1hbGl6ZWQgdG8gYWxsIGxvd2VyY2FzZSBsZXR0ZXJzLiBJZiB0aGUgc2NoZW1lIGlzIG9taXR0ZWQgb3IgZW1wdHksCiAgICogdGhlIFVSSSB3aWxsIG5vdCBoYXZlIGEgc2NoZW1lIHBhcnQuCiAgICoKICAgKiBUaGUgdXNlciBpbmZvIHBhcnQgb2YgdGhlIGF1dGhvcml0eSBjb21wb25lbnQgaXMgc2V0IHRocm91Z2gKICAgKiBbdXNlckluZm9dLiBJdCBkZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCB3aWxsIGJlIG9taXR0ZWQKICAgKiBmcm9tIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFVSSS4KICAgKgogICAqIFRoZSBob3N0IHBhcnQgb2YgdGhlIGF1dGhvcml0eSBjb21wb25lbnQgaXMgc2V0IHRocm91Z2gKICAgKiBbaG9zdF0uIFRoZSBob3N0IGNhbiBlaXRoZXIgYmUgYSBob3N0bmFtZSwgYW4gSVB2NCBhZGRyZXNzIG9yIGFuCiAgICogSVB2NiBhZGRyZXNzLCBjb250YWluZWQgaW4gJ1snIGFuZCAnXScuIElmIHRoZSBob3N0IGNvbnRhaW5zIGEKICAgKiAnOicgY2hhcmFjdGVyLCB0aGUgJ1snIGFuZCAnXScgYXJlIGFkZGVkIGlmIG5vdCBhbHJlYWR5IHByb3ZpZGVkLgogICAqIFRoZSBob3N0IGlzIG5vcm1hbGl6ZWQgdG8gYWxsIGxvd2VyY2FzZSBsZXR0ZXJzLgogICAqCiAgICogVGhlIHBvcnQgcGFydCBvZiB0aGUgYXV0aG9yaXR5IGNvbXBvbmVudCBpcyBzZXQgdGhyb3VnaAogICAqIFtwb3J0XS4KICAgKiBJZiBbcG9ydF0gaXMgb21pdHRlZCBvciBgbnVsbGAsIGl0IGltcGxpZXMgdGhlIGRlZmF1bHQgcG9ydCBmb3IKICAgKiB0aGUgVVJJJ3Mgc2NoZW1lLCBhbmQgaXMgZXF1aXZhbGVudCB0byBwYXNzaW5nIHRoYXQgcG9ydCBleHBsaWNpdGx5LgogICAqIFRoZSByZWNvZ25pemVkIHNjaGVtZXMsIGFuZCB0aGVpciBkZWZhdWx0IHBvcnRzLCBhcmUgImh0dHAiICg4MCkgYW5kCiAgICogImh0dHBzIiAoNDQzKS4gQWxsIG90aGVyIHNjaGVtZXMgYXJlIGNvbnNpZGVyZWQgYXMgaGF2aW5nIHplcm8gYXMgdGhlCiAgICogZGVmYXVsdCBwb3J0LgogICAqCiAgICogSWYgYW55IG9mIGB1c2VySW5mb2AsIGBob3N0YCBvciBgcG9ydGAgYXJlIHByb3ZpZGVkLAogICAqIHRoZSBVUkkgaGFzIGFuIGF1dGhvcml0eSBhY2NvcmRpbmcgdG8gW2hhc0F1dGhvcml0eV0uCiAgICoKICAgKiBUaGUgcGF0aCBjb21wb25lbnQgaXMgc2V0IHRocm91Z2ggZWl0aGVyIFtwYXRoXSBvcgogICAqIFtwYXRoU2VnbWVudHNdLgogICAqIFdoZW4gW3BhdGhdIGlzIHVzZWQsIGl0IHNob3VsZCBiZSBhIHZhbGlkIFVSSSBwYXRoLAogICAqIGJ1dCBpbnZhbGlkIGNoYXJhY3RlcnMsIGV4Y2VwdCB0aGUgZ2VuZXJhbCBkZWxpbWl0ZXJzICc6L0BbXT8jJywKICAgKiB3aWxsIGJlIGVzY2FwZWQgaWYgbmVjZXNzYXJ5LgogICAqIFdoZW4gW3BhdGhTZWdtZW50c10gaXMgdXNlZCwgZWFjaCBvZiB0aGUgcHJvdmlkZWQgc2VnbWVudHMKICAgKiBpcyBmaXJzdCBwZXJjZW50LWVuY29kZWQgYW5kIHRoZW4gam9pbmVkIHVzaW5nIHRoZSBmb3J3YXJkIHNsYXNoCiAgICogc2VwYXJhdG9yLgogICAqCiAgICogVGhlIHBlcmNlbnQtZW5jb2Rpbmcgb2YgdGhlIHBhdGggc2VnbWVudHMgZW5jb2RlcyBhbGwKICAgKiBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgdGhlIHVucmVzZXJ2ZWQgY2hhcmFjdGVycyBhbmQgdGhlIGZvbGxvd2luZwogICAqIGxpc3Qgb2YgY2hhcmFjdGVyczogYCEkJicoKSorLDs9OkBgLiBJZiB0aGUgb3RoZXIgY29tcG9uZW50cwogICAqIG5lY2Vzc2l0YXRlIGFuIGFic29sdXRlIHBhdGgsIGEgbGVhZGluZyBzbGFzaCBgL2AgaXMgcHJlcGVuZGVkIGlmCiAgICogbm90IGFscmVhZHkgdGhlcmUuCiAgICoKICAgKiBUaGUgcXVlcnkgY29tcG9uZW50IGlzIHNldCB0aHJvdWdoIGVpdGhlciBbcXVlcnldIG9yIFtxdWVyeVBhcmFtZXRlcnNdLgogICAqIFdoZW4gW3F1ZXJ5XSBpcyB1c2VkLCB0aGUgcHJvdmlkZWQgc3RyaW5nIHNob3VsZCBiZSBhIHZhbGlkIFVSSSBxdWVyeSwKICAgKiBidXQgaW52YWxpZCBjaGFyYWN0ZXJzLCBvdGhlciB0aGFuIGdlbmVyYWwgZGVsaW1pdGVycywKICAgKiB3aWxsIGJlIGVzY2FwZWQgaWYgbmVjZXNzYXJ5LgogICAqIFdoZW4gW3F1ZXJ5UGFyYW1ldGVyc10gaXMgdXNlZCB0aGUgcXVlcnkgaXMgYnVpbHQgZnJvbSB0aGUKICAgKiBwcm92aWRlZCBtYXAuIEVhY2gga2V5IGFuZCB2YWx1ZSBpbiB0aGUgbWFwIGlzIHBlcmNlbnQtZW5jb2RlZAogICAqIGFuZCBqb2luZWQgdXNpbmcgZXF1YWwgYW5kIGFtcGVyc2FuZCBjaGFyYWN0ZXJzLgogICAqIEEgdmFsdWUgaW4gdGhlIG1hcCBtdXN0IGJlIGVpdGhlciBhIHN0cmluZywgb3IgYW4gW0l0ZXJhYmxlXSBvZiBzdHJpbmdzLAogICAqIHdoZXJlIHRoZSBsYXR0ZXIgY29ycmVzcG9uZHMgdG8gbXVsdGlwbGUgdmFsdWVzIGZvciB0aGUgc2FtZSBrZXkuCiAgICoKICAgKiBUaGUgcGVyY2VudC1lbmNvZGluZyBvZiB0aGUga2V5cyBhbmQgdmFsdWVzIGVuY29kZXMgYWxsIGNoYXJhY3RlcnMKICAgKiBleGNlcHQgZm9yIHRoZSB1bnJlc2VydmVkIGNoYXJhY3RlcnMsIGFuZCByZXBsYWNlcyBzcGFjZXMgd2l0aCBgK2AuCiAgICogSWYgYHF1ZXJ5YCBpcyB0aGUgZW1wdHkgc3RyaW5nLCBpdCBpcyBlcXVpdmFsZW50IHRvIG9taXR0aW5nIGl0LgogICAqIFRvIGhhdmUgYW4gYWN0dWFsIGVtcHR5IHF1ZXJ5IHBhcnQsCiAgICogdXNlIGFuIGVtcHR5IG1hcCBmb3IgYHF1ZXJ5UGFyYW1ldGVyc2AuCiAgICoKICAgKiBJZiBib3RoIGBxdWVyeWAgYW5kIGBxdWVyeVBhcmFtZXRlcnNgIGFyZSBvbWl0dGVkIG9yIGBudWxsYCwKICAgKiB0aGUgVVJJIGhhcyBubyBxdWVyeSBwYXJ0LgogICAqCiAgICogVGhlIGZyYWdtZW50IGNvbXBvbmVudCBpcyBzZXQgdGhyb3VnaCBbZnJhZ21lbnRdLgogICAqIEl0IHNob3VsZCBiZSBhIHZhbGlkIFVSSSBmcmFnbWVudCwgYnV0IGludmFsaWQgY2hhcmFjdGVycyBvdGhlciB0aGFuCiAgICogZ2VuZXJhbCBkZWxpbWl0ZXJzLCBhcmUgZXNjYXBlZCBpZiBuZWNlc3NhcnkuCiAgICogSWYgYGZyYWdtZW50YCBpcyBvbWl0dGVkIG9yIGBudWxsYCwgdGhlIFVSSSBoYXMgbm8gZnJhZ21lbnQgcGFydC4KICAgKi8KICBmYWN0b3J5IFVyaSgKICAgICAge1N0cmluZyBzY2hlbWUsCiAgICAgIFN0cmluZyB1c2VySW5mbywKICAgICAgU3RyaW5nIGhvc3QsCiAgICAgIGludCBwb3J0LAogICAgICBTdHJpbmcgcGF0aCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBwYXRoU2VnbWVudHMsCiAgICAgIFN0cmluZyBxdWVyeSwKICAgICAgTWFwPFN0cmluZywgZHluYW1pYyAvKlN0cmluZ3xJdGVyYWJsZTxTdHJpbmc+Ki8gPiBxdWVyeVBhcmFtZXRlcnMsCiAgICAgIFN0cmluZyBmcmFnbWVudH0pID0gX1VyaTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBgaHR0cGAgVVJJIGZyb20gYXV0aG9yaXR5LCBwYXRoIGFuZCBxdWVyeS4KICAgKgogICAqIEV4YW1wbGVzOgogICAqCiAgICogYGBgCiAgICogLy8gaHR0cDovL2V4YW1wbGUub3JnL3BhdGg/cT1kYXJ0LgogICAqIG5ldyBVcmkuaHR0cCgiZXhhbXBsZS5vcmciLCAiL3BhdGgiLCB7ICJxIiA6ICJkYXJ0IiB9KTsKICAgKgogICAqIC8vIGh0dHA6Ly91c2VyOnBhc3NAbG9jYWxob3N0OjgwODAKICAgKiBuZXcgVXJpLmh0dHAoInVzZXI6cGFzc0Bsb2NhbGhvc3Q6ODA4MCIsICIiKTsKICAgKgogICAqIC8vIGh0dHA6Ly9leGFtcGxlLm9yZy9hJTIwYgogICAqIG5ldyBVcmkuaHR0cCgiZXhhbXBsZS5vcmciLCAiYSBiIik7CiAgICoKICAgKiAvLyBodHRwOi8vZXhhbXBsZS5vcmcvYSUyNTJGCiAgICogbmV3IFVyaS5odHRwKCJleGFtcGxlLm9yZyIsICIvYSUyRiIpOwogICAqIGBgYAogICAqCiAgICogVGhlIGBzY2hlbWVgIGlzIGFsd2F5cyBzZXQgdG8gYGh0dHBgLgogICAqCiAgICogVGhlIGB1c2VySW5mb2AsIGBob3N0YCBhbmQgYHBvcnRgIGNvbXBvbmVudHMgYXJlIHNldCBmcm9tIHRoZQogICAqIFthdXRob3JpdHldIGFyZ3VtZW50LiBJZiBgYXV0aG9yaXR5YCBpcyBgbnVsbGAgb3IgZW1wdHksCiAgICogdGhlIGNyZWF0ZWQgYFVyaWAgaGFzIG5vIGF1dGhvcml0eSwgYW5kIGlzbid0IGRpcmVjdGx5IHVzYWJsZQogICAqIGFzIGFuIEhUVFAgVVJMLCB3aGljaCBtdXN0IGhhdmUgYSBub24tZW1wdHkgaG9zdC4KICAgKgogICAqIFRoZSBgcGF0aGAgY29tcG9uZW50IGlzIHNldCBmcm9tIHRoZSBbdW5lbmNvZGVkUGF0aF0KICAgKiBhcmd1bWVudC4gVGhlIHBhdGggcGFzc2VkIG11c3Qgbm90IGJlIGVuY29kZWQgYXMgdGhpcyBjb25zdHJ1Y3RvcgogICAqIGVuY29kZXMgdGhlIHBhdGguCiAgICoKICAgKiBUaGUgYHF1ZXJ5YCBjb21wb25lbnQgaXMgc2V0IGZyb20gdGhlIG9wdGlvbmFsIFtxdWVyeVBhcmFtZXRlcnNdCiAgICogYXJndW1lbnQuCiAgICovCiAgZmFjdG9yeSBVcmkuaHR0cChTdHJpbmcgYXV0aG9yaXR5LCBTdHJpbmcgdW5lbmNvZGVkUGF0aCwKICAgICAgW01hcDxTdHJpbmcsIFN0cmluZz4gcXVlcnlQYXJhbWV0ZXJzXSkgPSBfVXJpLmh0dHA7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgYGh0dHBzYCBVUkkgZnJvbSBhdXRob3JpdHksIHBhdGggYW5kIHF1ZXJ5LgogICAqCiAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB0aGUgc2FtZSBhcyBbVXJpLmh0dHBdIGV4Y2VwdCBmb3IgdGhlIHNjaGVtZQogICAqIHdoaWNoIGlzIHNldCB0byBgaHR0cHNgLgogICAqLwogIGZhY3RvcnkgVXJpLmh0dHBzKFN0cmluZyBhdXRob3JpdHksIFN0cmluZyB1bmVuY29kZWRQYXRoLAogICAgICBbTWFwPFN0cmluZywgU3RyaW5nPiBxdWVyeVBhcmFtZXRlcnNdKSA9IF9VcmkuaHR0cHM7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgZmlsZSBVUkkgZnJvbSBhbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBmaWxlIHBhdGguCiAgICoKICAgKiBUaGUgZmlsZSBwYXRoIGlzIHBhc3NlZCBpbiBbcGF0aF0uCiAgICoKICAgKiBUaGlzIHBhdGggaXMgaW50ZXJwcmV0ZWQgdXNpbmcgZWl0aGVyIFdpbmRvd3Mgb3Igbm9uLVdpbmRvd3MKICAgKiBzZW1hbnRpY3MuCiAgICoKICAgKiBXaXRoIG5vbi1XaW5kb3dzIHNlbWFudGljcyB0aGUgc2xhc2ggKGAvYCkgaXMgdXNlZCB0byBzZXBhcmF0ZQogICAqIHBhdGggc2VnbWVudHMgaW4gdGhlIGlucHV0IFtwYXRoXS4KICAgKgogICAqIFdpdGggV2luZG93cyBzZW1hbnRpY3MsIGJhY2tzbGFzaCAoYFxgKSBhbmQgZm9yd2FyZC1zbGFzaCAoYC9gKQogICAqIGFyZSB1c2VkIHRvIHNlcGFyYXRlIHBhdGggc2VnbWVudHMgaW4gdGhlIGlucHV0IFtwYXRoXSwKICAgKiBleGNlcHQgaWYgdGhlIHBhdGggc3RhcnRzIHdpdGggYFxcP1xgIGluIHdoaWNoIGNhc2UKICAgKiBvbmx5IGJhY2tzbGFzaCAoYFxgKSBzZXBhcmF0ZXMgcGF0aCBzZWdtZW50cyBpbiBbcGF0aF0uCiAgICoKICAgKiBJZiB0aGUgcGF0aCBzdGFydHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yLCBhbiBhYnNvbHV0ZSBVUkkgKHdpdGggdGhlCiAgICogYGZpbGVgIHNjaGVtZSBhbmQgYW4gZW1wdHkgYXV0aG9yaXR5KSBpcyBjcmVhdGVkLgogICAqIE90aGVyd2lzZSBhIHJlbGF0aXZlIFVSSSByZWZlcmVuY2Ugd2l0aCBubyBzY2hlbWUgb3IgYXV0aG9yaXR5IGlzIGNyZWF0ZWQuCiAgICogT25lIGV4Y2VwdGlvbiBmcm9tIHRoaXMgcnVsZSBpcyB0aGF0IHdoZW4gV2luZG93cyBzZW1hbnRpY3MgaXMgdXNlZAogICAqIGFuZCB0aGUgcGF0aCBzdGFydHMgd2l0aCBhIGRyaXZlIGxldHRlciBmb2xsb3dlZCBieSBhIGNvbG9uICgiOiIpIGFuZCBhCiAgICogcGF0aCBzZXBhcmF0b3IsIHRoZW4gYW4gYWJzb2x1dGUgVVJJIGlzIGNyZWF0ZWQuCiAgICoKICAgKiBUaGUgZGVmYXVsdCBmb3Igd2hldGhlciB0byB1c2UgV2luZG93cyBvciBub24tV2luZG93cyBzZW1hbnRpY3MKICAgKiBkZXRlcm1pbmVkIGZyb20gdGhlIHBsYXRmb3JtIERhcnQgaXMgcnVubmluZyBvbi4gV2hlbiBydW5uaW5nIGluCiAgICogdGhlIHN0YW5kYWxvbmUgVk0sIHRoaXMgaXMgZGV0ZWN0ZWQgYnkgdGhlIFZNIGJhc2VkIG9uIHRoZQogICAqIG9wZXJhdGluZyBzeXN0ZW0uIFdoZW4gcnVubmluZyBpbiBhIGJyb3dzZXIgbm9uLVdpbmRvd3Mgc2VtYW50aWNzCiAgICogaXMgYWx3YXlzIHVzZWQuCiAgICoKICAgKiBUbyBvdmVycmlkZSB0aGUgYXV0b21hdGljIGRldGVjdGlvbiBvZiB3aGljaCBzZW1hbnRpY3MgdG8gdXNlIHBhc3MKICAgKiBhIHZhbHVlIGZvciBbd2luZG93c10uIFBhc3NpbmcgYHRydWVgIHdpbGwgdXNlIFdpbmRvd3MKICAgKiBzZW1hbnRpY3MgYW5kIHBhc3NpbmcgYGZhbHNlYCB3aWxsIHVzZSBub24tV2luZG93cyBzZW1hbnRpY3MuCiAgICoKICAgKiBFeGFtcGxlcyB1c2luZyBub24tV2luZG93cyBzZW1hbnRpY3M6CiAgICoKICAgKiBgYGAKICAgKiAvLyB4eHgveXl5CiAgICogbmV3IFVyaS5maWxlKCJ4eHgveXl5Iiwgd2luZG93czogZmFsc2UpOwogICAqCiAgICogLy8geHh4L3l5eS8KICAgKiBuZXcgVXJpLmZpbGUoInh4eC95eXkvIiwgd2luZG93czogZmFsc2UpOwogICAqCiAgICogLy8gZmlsZTovLy94eHgveXl5CiAgICogbmV3IFVyaS5maWxlKCIveHh4L3l5eSIsIHdpbmRvd3M6IGZhbHNlKTsKICAgKgogICAqIC8vIGZpbGU6Ly8veHh4L3l5eS8KICAgKiBuZXcgVXJpLmZpbGUoIi94eHgveXl5LyIsIHdpbmRvd3M6IGZhbHNlKTsKICAgKgogICAqIC8vIEMlM0EKICAgKiBuZXcgVXJpLmZpbGUoIkM6Iiwgd2luZG93czogZmFsc2UpOwogICAqIGBgYAogICAqCiAgICogRXhhbXBsZXMgdXNpbmcgV2luZG93cyBzZW1hbnRpY3M6CiAgICoKICAgKiBgYGAKICAgKiAvLyB4eHgveXl5CiAgICogbmV3IFVyaS5maWxlKHIieHh4XHl5eSIsIHdpbmRvd3M6IHRydWUpOwogICAqCiAgICogLy8geHh4L3l5eS8KICAgKiBuZXcgVXJpLmZpbGUociJ4eHhceXl5XCIsIHdpbmRvd3M6IHRydWUpOwogICAqCiAgICogZmlsZTovLy94eHgveXl5CiAgICogbmV3IFVyaS5maWxlKHIiXHh4eFx5eXkiLCB3aW5kb3dzOiB0cnVlKTsKICAgKgogICAqIGZpbGU6Ly8veHh4L3l5eS8KICAgKiBuZXcgVXJpLmZpbGUociJceHh4XHl5eS8iLCB3aW5kb3dzOiB0cnVlKTsKICAgKgogICAqIC8vIGZpbGU6Ly8vQzoveHh4L3l5eQogICAqIG5ldyBVcmkuZmlsZShyIkM6XHh4eFx5eXkiLCB3aW5kb3dzOiB0cnVlKTsKICAgKgogICAqIC8vIFRoaXMgdGhyb3dzIGFuIGVycm9yLiBBIHBhdGggd2l0aCBhIGRyaXZlIGxldHRlciwgYnV0IG5vIGZvbGxvd2luZwogICAqIC8vIHBhdGgsIGlzIG5vdCBhbGxvd2VkLgogICAqIG5ldyBVcmkuZmlsZShyIkM6Iiwgd2luZG93czogdHJ1ZSk7CiAgICoKICAgKiAvLyBUaGlzIHRocm93cyBhbiBlcnJvci4gQSBwYXRoIHdpdGggYSBkcml2ZSBsZXR0ZXIgaXMgbm90IGFic29sdXRlLgogICAqIG5ldyBVcmkuZmlsZShyIkM6eHh4XHl5eSIsIHdpbmRvd3M6IHRydWUpOwogICAqCiAgICogLy8gZmlsZTovL3NlcnZlci9zaGFyZS9maWxlCiAgICogbmV3IFVyaS5maWxlKHIiXFxzZXJ2ZXJcc2hhcmVcZmlsZSIsIHdpbmRvd3M6IHRydWUpOwogICAqIGBgYAogICAqCiAgICogSWYgdGhlIHBhdGggcGFzc2VkIGlzIG5vdCBhIHZhbGlkIGZpbGUgcGF0aCwgYW4gZXJyb3IgaXMgdGhyb3duLgogICAqLwogIGZhY3RvcnkgVXJpLmZpbGUoU3RyaW5nIHBhdGgsIHtib29sIHdpbmRvd3N9KSA9IF9VcmkuZmlsZTsKCiAgLyoqCiAgICogTGlrZSBbVXJpLmZpbGVdIGV4Y2VwdCB0aGF0IGEgbm9uLWVtcHR5IFVSSSBwYXRoIGVuZHMgaW4gYSBzbGFzaC4KICAgKgogICAqIElmIFtwYXRoXSBpcyBub3QgZW1wdHksIGFuZCBpdCBkb2Vzbid0IGVuZCBpbiBhIGRpcmVjdG9yeSBzZXBhcmF0b3IsCiAgICogdGhlbiBhIHNsYXNoIGlzIGFkZGVkIHRvIHRoZSByZXR1cm5lZCBVUkkncyBwYXRoLgogICAqIEluIGFsbCBvdGhlciBjYXNlcywgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBhcyByZXR1cm5lZCBieSBgVXJpLmZpbGVgLgogICAqLwogIGZhY3RvcnkgVXJpLmRpcmVjdG9yeShTdHJpbmcgcGF0aCwge2Jvb2wgd2luZG93c30pID0gX1VyaS5kaXJlY3Rvcnk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBgZGF0YTpgIFVSSSBjb250YWluaW5nIHRoZSBbY29udGVudF0gc3RyaW5nLgogICAqCiAgICogQ29udmVydHMgdGhlIGNvbnRlbnQgdG8gYSBieXRlcyB1c2luZyBbZW5jb2RpbmddIG9yIHRoZSBjaGFyc2V0IHNwZWNpZmllZAogICAqIGluIFtwYXJhbWV0ZXJzXSAoZGVmYXVsdGluZyB0byBVUy1BU0NJSSBpZiBub3Qgc3BlY2lmaWVkIG9yIHVucmVjb2duaXplZCksCiAgICogdGhlbiBlbmNvZGVzIHRoZSBieXRlcyBpbnRvIHRoZSByZXN1bHRpbmcgZGF0YSBVUkkuCiAgICoKICAgKiBEZWZhdWx0cyB0byBlbmNvZGluZyB1c2luZyBwZXJjZW50LWVuY29kaW5nIChhbnkgbm9uLUFTQ0lJIG9yIG5vbi1VUkktdmFsaWQKICAgKiBieXRlcyBpcyByZXBsYWNlZCBieSBhIHBlcmNlbnQgZW5jb2RpbmcpLiBJZiBbYmFzZTY0XSBpcyB0cnVlLCB0aGUgYnl0ZXMKICAgKiBhcmUgaW5zdGVhZCBlbmNvZGVkIHVzaW5nIFtiYXNlNjRdLgogICAqCiAgICogSWYgW2VuY29kaW5nXSBpcyBub3QgcHJvdmlkZWQgYW5kIFtwYXJhbWV0ZXJzXSBoYXMgYSBgY2hhcnNldGAgZW50cnksCiAgICogdGhhdCBuYW1lIGlzIGxvb2tlZCB1cCB1c2luZyBbRW5jb2RpbmcuZ2V0QnlOYW1lXSwKICAgKiBhbmQgaWYgdGhlIGxvb2t1cCByZXR1cm5zIGFuIGVuY29kaW5nLCB0aGF0IGVuY29kaW5nIGlzIHVzZWQgdG8gY29udmVydAogICAqIFtjb250ZW50XSB0byBieXRlcy4KICAgKiBJZiBwcm92aWRpbmcgYm90aCBhbiBbZW5jb2RpbmddIGFuZCBhIGNoYXJzZXQgaW4gW3BhcmFtZXRlcnNdLCB0aGV5IHNob3VsZAogICAqIGFncmVlLCBvdGhlcndpc2UgZGVjb2Rpbmcgd29uJ3QgYmUgYWJsZSB0byB1c2UgdGhlIGNoYXJzZXQgcGFyYW1ldGVyCiAgICogdG8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZy4KICAgKgogICAqIElmIFttaW1lVHlwZV0gYW5kL29yIFtwYXJhbWV0ZXJzXSBhcmUgc3VwcGxpZWQsIHRoZXkgYXJlIGFkZGVkIHRvIHRoZQogICAqIGNyZWF0ZWQgVVJJLiBJZiBhbnkgb2YgdGhlc2UgY29udGFpbiBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBhbGxvd2VkCiAgICogaW4gdGhlIGRhdGEgVVJJLCB0aGUgY2hhcmFjdGVyIGlzIHBlcmNlbnQtZXNjYXBlZC4gSWYgdGhlIGNoYXJhY3RlciBpcwogICAqIG5vbi1BU0NJSSwgaXQgaXMgZmlyc3QgVVRGLTggZW5jb2RlZCBhbmQgdGhlbiB0aGUgYnl0ZXMgYXJlIHBlcmNlbnQKICAgKiBlbmNvZGVkLiBBbiBvbWl0dGVkIFttaW1lVHlwZV0gaW4gYSBkYXRhIFVSSSBtZWFucyBgdGV4dC9wbGFpbmAsIGp1c3QKICAgKiBhcyBhbiBvbWl0dGVkIGBjaGFyc2V0YCBwYXJhbWV0ZXIgZGVmYXVsdHMgdG8gbWVhbmluZyBgVVMtQVNDSUlgLgogICAqCiAgICogVG8gcmVhZCB0aGUgY29udGVudCBiYWNrLCB1c2UgW1VyaURhdGEuY29udGVudEFzU3RyaW5nXS4KICAgKi8KICBmYWN0b3J5IFVyaS5kYXRhRnJvbVN0cmluZyhTdHJpbmcgY29udGVudCwKICAgICAge1N0cmluZyBtaW1lVHlwZSwKICAgICAgRW5jb2RpbmcgZW5jb2RpbmcsCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywKICAgICAgYm9vbCBiYXNlNjQgPSBmYWxzZX0pIHsKICAgIFVyaURhdGEgZGF0YSA9IFVyaURhdGEuZnJvbVN0cmluZyhjb250ZW50LAogICAgICAgIG1pbWVUeXBlOiBtaW1lVHlwZSwKICAgICAgICBlbmNvZGluZzogZW5jb2RpbmcsCiAgICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycywKICAgICAgICBiYXNlNjQ6IGJhc2U2NCk7CiAgICByZXR1cm4gZGF0YS51cmk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgYGRhdGE6YCBVUkkgY29udGFpbmluZyBhbiBlbmNvZGluZyBvZiBbYnl0ZXNdLgogICAqCiAgICogRGVmYXVsdHMgdG8gQmFzZTY0IGVuY29kaW5nIHRoZSBieXRlcywgYnV0IGlmIFtwZXJjZW50RW5jb2RlZF0KICAgKiBpcyBgdHJ1ZWAsIHRoZSBieXRlcyB3aWxsIGluc3RlYWQgYmUgcGVyY2VudCBlbmNvZGVkIChhbnkgbm9uLUFTQ0lJCiAgICogb3Igbm9uLXZhbGlkLUFTQ0lJLWNoYXJhY3RlciBieXRlIGlzIHJlcGxhY2VkIGJ5IGEgcGVyY2VudCBlbmNvZGluZykuCiAgICoKICAgKiBUbyByZWFkIHRoZSBieXRlcyBiYWNrLCB1c2UgW1VyaURhdGEuY29udGVudEFzQnl0ZXNdLgogICAqCiAgICogSXQgZGVmYXVsdHMgdG8gaGF2aW5nIHRoZSBtaW1lLXR5cGUgYGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbWAuCiAgICogVGhlIFttaW1lVHlwZV0gYW5kIFtwYXJhbWV0ZXJzXSBhcmUgYWRkZWQgdG8gdGhlIGNyZWF0ZWQgVVJJLgogICAqIElmIGFueSBvZiB0aGVzZSBjb250YWluIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGFsbG93ZWQKICAgKiBpbiB0aGUgZGF0YSBVUkksIHRoZSBjaGFyYWN0ZXIgaXMgcGVyY2VudC1lc2NhcGVkLiBJZiB0aGUgY2hhcmFjdGVyIGlzCiAgICogbm9uLUFTQ0lJLCBpdCBpcyBmaXJzdCBVVEYtOCBlbmNvZGVkIGFuZCB0aGVuIHRoZSBieXRlcyBhcmUgcGVyY2VudAogICAqIGVuY29kZWQuCiAgICovCiAgZmFjdG9yeSBVcmkuZGF0YUZyb21CeXRlcyhMaXN0PGludD4gYnl0ZXMsCiAgICAgIHttaW1lVHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsCiAgICAgIHBlcmNlbnRFbmNvZGVkID0gZmFsc2V9KSB7CiAgICBVcmlEYXRhIGRhdGEgPSBVcmlEYXRhLmZyb21CeXRlcyhieXRlcywKICAgICAgICBtaW1lVHlwZTogbWltZVR5cGUsCiAgICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycywKICAgICAgICBwZXJjZW50RW5jb2RlZDogcGVyY2VudEVuY29kZWQpOwogICAgcmV0dXJuIGRhdGEudXJpOwogIH0KCiAgLyoqCiAgICogVGhlIHNjaGVtZSBjb21wb25lbnQgb2YgdGhlIFVSSS4KICAgKgogICAqIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGVyZSBpcyBubyBzY2hlbWUgY29tcG9uZW50LgogICAqCiAgICogQSBVUkkgc2NoZW1lIGlzIGNhc2UgaW5zZW5zaXRpdmUuCiAgICogVGhlIHJldHVybmVkIHNjaGVtZSBpcyBjYW5vbmljYWxpemVkIHRvIGxvd2VyY2FzZSBsZXR0ZXJzLgogICAqLwogIFN0cmluZyBnZXQgc2NoZW1lOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBhdXRob3JpdHkgY29tcG9uZW50LgogICAqCiAgICogVGhlIGF1dGhvcml0eSBpcyBmb3JtYXR0ZWQgZnJvbSB0aGUgW3VzZXJJbmZvXSwgW2hvc3RdIGFuZCBbcG9ydF0KICAgKiBwYXJ0cy4KICAgKgogICAqIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGVyZSBpcyBubyBhdXRob3JpdHkgY29tcG9uZW50LgogICAqLwogIFN0cmluZyBnZXQgYXV0aG9yaXR5OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSB1c2VyIGluZm8gcGFydCBvZiB0aGUgYXV0aG9yaXR5IGNvbXBvbmVudC4KICAgKgogICAqIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGVyZSBpcyBubyB1c2VyIGluZm8gaW4gdGhlCiAgICogYXV0aG9yaXR5IGNvbXBvbmVudC4KICAgKi8KICBTdHJpbmcgZ2V0IHVzZXJJbmZvOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBob3N0IHBhcnQgb2YgdGhlIGF1dGhvcml0eSBjb21wb25lbnQuCiAgICoKICAgKiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgaXMgbm8gYXV0aG9yaXR5IGNvbXBvbmVudCBhbmQKICAgKiBoZW5jZSBubyBob3N0LgogICAqCiAgICogSWYgdGhlIGhvc3QgaXMgYW4gSVAgdmVyc2lvbiA2IGFkZHJlc3MsIHRoZSBzdXJyb3VuZGluZyBgW2AgYW5kIGBdYCBpcwogICAqIHJlbW92ZWQuCiAgICoKICAgKiBUaGUgaG9zdCBzdHJpbmcgaXMgY2FzZS1pbnNlbnNpdGl2ZS4KICAgKiBUaGUgcmV0dXJuZWQgaG9zdCBuYW1lIGlzIGNhbm9uaWNhbGl6ZWQgdG8gbG93ZXItY2FzZQogICAqIHdpdGggdXBwZXItY2FzZSBwZXJjZW50LWVzY2FwZXMuCiAgICovCiAgU3RyaW5nIGdldCBob3N0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwb3J0IHBhcnQgb2YgdGhlIGF1dGhvcml0eSBjb21wb25lbnQuCiAgICoKICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHBvcnQgaWYgdGhlcmUgaXMgbm8gcG9ydCBudW1iZXIgaW4gdGhlIGF1dGhvcml0eQogICAqIGNvbXBvbmVudC4gVGhhdCdzIDgwIGZvciBodHRwLCA0NDMgZm9yIGh0dHBzLCBhbmQgMCBmb3IgZXZlcnl0aGluZyBlbHNlLgogICAqLwogIGludCBnZXQgcG9ydDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcGF0aCBjb21wb25lbnQuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgcGF0aCBpcyBlbmNvZGVkLiBUbyBnZXQgZGlyZWN0IGFjY2VzcyB0byB0aGUgZGVjb2RlZAogICAqIHBhdGggdXNlIFtwYXRoU2VnbWVudHNdLgogICAqCiAgICogUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIHBhdGggY29tcG9uZW50LgogICAqLwogIFN0cmluZyBnZXQgcGF0aDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcXVlcnkgY29tcG9uZW50LiBUaGUgcmV0dXJuZWQgcXVlcnkgaXMgZW5jb2RlZC4gVG8gZ2V0CiAgICogZGlyZWN0IGFjY2VzcyB0byB0aGUgZGVjb2RlZCBxdWVyeSB1c2UgW3F1ZXJ5UGFyYW1ldGVyc10uCiAgICoKICAgKiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgaXMgbm8gcXVlcnkgY29tcG9uZW50LgogICAqLwogIFN0cmluZyBnZXQgcXVlcnk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZyYWdtZW50IGlkZW50aWZpZXIgY29tcG9uZW50LgogICAqCiAgICogUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIGZyYWdtZW50IGlkZW50aWZpZXIKICAgKiBjb21wb25lbnQuCiAgICovCiAgU3RyaW5nIGdldCBmcmFnbWVudDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgVVJJIHBhdGggc3BsaXQgaW50byBpdHMgc2VnbWVudHMuIEVhY2ggb2YgdGhlIHNlZ21lbnRzIGluIHRoZQogICAqIHJldHVybmVkIGxpc3QgaGF2ZSBiZWVuIGRlY29kZWQuIElmIHRoZSBwYXRoIGlzIGVtcHR5IHRoZSBlbXB0eSBsaXN0IHdpbGwKICAgKiBiZSByZXR1cm5lZC4gQSBsZWFkaW5nIHNsYXNoIGAvYCBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlZ21lbnRzIHJldHVybmVkLgogICAqCiAgICogVGhlIHJldHVybmVkIGxpc3QgaXMgdW5tb2RpZmlhYmxlIGFuZCB3aWxsIHRocm93IFtVbnN1cHBvcnRlZEVycm9yXSBvbiBhbnkKICAgKiBjYWxscyB0aGF0IHdvdWxkIG11dGF0ZSBpdC4KICAgKi8KICBMaXN0PFN0cmluZz4gZ2V0IHBhdGhTZWdtZW50czsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgVVJJIHF1ZXJ5IHNwbGl0IGludG8gYSBtYXAgYWNjb3JkaW5nIHRvIHRoZSBydWxlcwogICAqIHNwZWNpZmllZCBmb3IgRk9STSBwb3N0IGluIHRoZSBbSFRNTCA0LjAxIHNwZWNpZmljYXRpb24gc2VjdGlvbgogICAqIDE3LjEzLjRdKGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvaW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjEzLjQgIkhUTUwgNC4wMSBzZWN0aW9uIDE3LjEzLjQiKS4KICAgKiBFYWNoIGtleSBhbmQgdmFsdWUgaW4gdGhlIHJldHVybmVkIG1hcCBoYXMgYmVlbiBkZWNvZGVkLgogICAqIElmIHRoZXJlIGlzIG5vIHF1ZXJ5IHRoZSBlbXB0eSBtYXAgaXMgcmV0dXJuZWQuCiAgICoKICAgKiBLZXlzIGluIHRoZSBxdWVyeSBzdHJpbmcgdGhhdCBoYXZlIG5vIHZhbHVlIGFyZSBtYXBwZWQgdG8gdGhlCiAgICogZW1wdHkgc3RyaW5nLgogICAqIElmIGEga2V5IG9jY3VycyBtb3JlIHRoYW4gb25jZSBpbiB0aGUgcXVlcnkgc3RyaW5nLCBpdCBpcyBtYXBwZWQgdG8KICAgKiBhbiBhcmJpdHJhcnkgY2hvaWNlIG9mIHBvc3NpYmxlIHZhbHVlLgogICAqIFRoZSBbcXVlcnlQYXJhbWV0ZXJzQWxsXSBnZXR0ZXIgY2FuIHByb3ZpZGUgYSBtYXAKICAgKiB0aGF0IG1hcHMga2V5cyB0byBhbGwgb2YgdGhlaXIgdmFsdWVzLgogICAqCiAgICogVGhlIHJldHVybmVkIG1hcCBpcyB1bm1vZGlmaWFibGUuCiAgICovCiAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXQgcXVlcnlQYXJhbWV0ZXJzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBVUkkgcXVlcnkgc3BsaXQgaW50byBhIG1hcCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzCiAgICogc3BlY2lmaWVkIGZvciBGT1JNIHBvc3QgaW4gdGhlIFtIVE1MIDQuMDEgc3BlY2lmaWNhdGlvbiBzZWN0aW9uCiAgICogMTcuMTMuNF0oaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9pbnRlcmFjdC9mb3Jtcy5odG1sI2gtMTcuMTMuNCAiSFRNTCA0LjAxIHNlY3Rpb24gMTcuMTMuNCIpLgogICAqIEVhY2gga2V5IGFuZCB2YWx1ZSBpbiB0aGUgcmV0dXJuZWQgbWFwIGhhcyBiZWVuIGRlY29kZWQuIElmIHRoZXJlIGlzIG5vCiAgICogcXVlcnkgdGhlIGVtcHR5IG1hcCBpcyByZXR1cm5lZC4KICAgKgogICAqIEtleXMgYXJlIG1hcHBlZCB0byBsaXN0cyBvZiB0aGVpciB2YWx1ZXMuIElmIGEga2V5IG9jY3VycyBvbmx5IG9uY2UsCiAgICogaXRzIHZhbHVlIGlzIGEgc2luZ2xldG9uIGxpc3QuIElmIGEga2V5IG9jY3VycyB3aXRoIG5vIHZhbHVlLCB0aGUKICAgKiBlbXB0eSBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoYXQgb2NjdXJyZW5jZS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBtYXAgYW5kIHRoZSBsaXN0cyBpdCBjb250YWlucyBhcmUgdW5tb2RpZmlhYmxlLgogICAqLwogIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0IHF1ZXJ5UGFyYW1ldGVyc0FsbDsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBVUkkgaXMgYWJzb2x1dGUuCiAgICoKICAgKiBBIFVSSSBpcyBhbiBhYnNvbHV0ZSBVUkkgaW4gdGhlIHNlbnNlIG9mIFJGQyAzOTg2IGlmIGl0IGhhcyBhIHNjaGVtZQogICAqIGFuZCBubyBmcmFnbWVudC4KICAgKi8KICBib29sIGdldCBpc0Fic29sdXRlOwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFVSSSBoYXMgYSBbc2NoZW1lXSBjb21wb25lbnQuCiAgICovCiAgYm9vbCBnZXQgaGFzU2NoZW1lID0+IHNjaGVtZS5pc05vdEVtcHR5OwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFVSSSBoYXMgYW4gW2F1dGhvcml0eV0gY29tcG9uZW50LgogICAqLwogIGJvb2wgZ2V0IGhhc0F1dGhvcml0eTsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBVUkkgaGFzIGFuIGV4cGxpY2l0IHBvcnQuCiAgICoKICAgKiBJZiB0aGUgcG9ydCBudW1iZXIgaXMgdGhlIGRlZmF1bHQgcG9ydCBudW1iZXIKICAgKiAoemVybyBmb3IgdW5yZWNvZ25pemVkIHNjaGVtZXMsIHdpdGggaHR0cCAoODApIGFuZCBodHRwcyAoNDQzKSBiZWluZwogICAqIHJlY29nbml6ZWQpLAogICAqIHRoZW4gdGhlIHBvcnQgaXMgbWFkZSBpbXBsaWNpdCBhbmQgb21pdHRlZCBmcm9tIHRoZSBVUkkuCiAgICovCiAgYm9vbCBnZXQgaGFzUG9ydDsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBVUkkgaGFzIGEgcXVlcnkgcGFydC4KICAgKi8KICBib29sIGdldCBoYXNRdWVyeTsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBVUkkgaGFzIGEgZnJhZ21lbnQgcGFydC4KICAgKi8KICBib29sIGdldCBoYXNGcmFnbWVudDsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBVUkkgaGFzIGFuIGVtcHR5IHBhdGguCiAgICovCiAgYm9vbCBnZXQgaGFzRW1wdHlQYXRoOwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFVSSSBoYXMgYW4gYWJzb2x1dGUgcGF0aCAoc3RhcnRpbmcgd2l0aCAnLycpLgogICAqLwogIGJvb2wgZ2V0IGhhc0Fic29sdXRlUGF0aDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgb3JpZ2luIG9mIHRoZSBVUkkgaW4gdGhlIGZvcm0gc2NoZW1lOi8vaG9zdDpwb3J0IGZvciB0aGUKICAgKiBzY2hlbWVzIGh0dHAgYW5kIGh0dHBzLgogICAqCiAgICogSXQgaXMgYW4gZXJyb3IgaWYgdGhlIHNjaGVtZSBpcyBub3QgImh0dHAiIG9yICJodHRwcyIsIG9yIGlmIHRoZSBob3N0IG5hbWUKICAgKiBpcyBtaXNzaW5nIG9yIGVtcHR5LgogICAqCiAgICogU2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1dELWh0bWw1LTIwMTEwNDA1L29yaWdpbi0wLmh0bWwjb3JpZ2luCiAgICovCiAgU3RyaW5nIGdldCBvcmlnaW47CgogIC8vLyBXaGV0aGVyIHRoZSBzY2hlbWUgb2YgdGhpcyBbVXJpXSBpcyBbc2NoZW1lXS4KICAvLy8KICAvLy8gVGhlIFtzY2hlbWVdIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgb25lIHJldHVybmVkIGJ5IFtVcmkuc2NoZW1lXSwKICAvLy8gYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZSBjYXNlLW5vcm1hbGl6ZWQgdG8gbG93ZXItY2FzZSBjaGFyYWN0ZXJzLgogIC8vLwogIC8vLyBFeGFtcGxlOgogIC8vLyBgYGBkYXJ0CiAgLy8vIHZhciB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKICAvLy8gcHJpbnQodXJpLmlzU2NoZW1lKCJIVFRQIikpOyAgLy8gUHJpbnRzIHRydWUuCiAgLy8vIGBgYAogIC8vLwogIC8vLyBBIGBudWxsYCBvciBlbXB0eSBbc2NoZW1lXSBzdHJpbmcgbWF0Y2hlcyBhIFVSSSB3aXRoIG5vIHNjaGVtZQogIC8vLyAob25lIHdoZXJlIFtoYXNTY2hlbWVdIHJldHVybnMgZmFsc2UpLgogIGJvb2wgaXNTY2hlbWUoU3RyaW5nIHNjaGVtZSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZpbGUgcGF0aCBmcm9tIGEgZmlsZSBVUkkuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgcGF0aCBoYXMgZWl0aGVyIFdpbmRvd3Mgb3Igbm9uLVdpbmRvd3MKICAgKiBzZW1hbnRpY3MuCiAgICoKICAgKiBGb3Igbm9uLVdpbmRvd3Mgc2VtYW50aWNzIHRoZSBzbGFzaCAoIi8iKSBpcyB1c2VkIHRvIHNlcGFyYXRlCiAgICogcGF0aCBzZWdtZW50cy4KICAgKgogICAqIEZvciBXaW5kb3dzIHNlbWFudGljcyB0aGUgYmFja3NsYXNoICgiXFwiKSBzZXBhcmF0b3IgaXMgdXNlZCB0bwogICAqIHNlcGFyYXRlIHBhdGggc2VnbWVudHMuCiAgICoKICAgKiBJZiB0aGUgVVJJIGlzIGFic29sdXRlIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGEgcGF0aCBzZXBhcmF0b3IKICAgKiB1bmxlc3MgV2luZG93cyBzZW1hbnRpY3MgaXMgdXNlZCBhbmQgdGhlIGZpcnN0IHBhdGggc2VnbWVudCBpcyBhCiAgICogZHJpdmUgbGV0dGVyLiBXaGVuIFdpbmRvd3Mgc2VtYW50aWNzIGlzIHVzZWQgYSBob3N0IGNvbXBvbmVudCBpbgogICAqIHRoZSB1cmkgaW4gaW50ZXJwcmV0ZWQgYXMgYSBmaWxlIHNlcnZlciBhbmQgYSBVTkMgcGF0aCBpcwogICAqIHJldHVybmVkLgogICAqCiAgICogVGhlIGRlZmF1bHQgZm9yIHdoZXRoZXIgdG8gdXNlIFdpbmRvd3Mgb3Igbm9uLVdpbmRvd3Mgc2VtYW50aWNzCiAgICogZGV0ZXJtaW5lZCBmcm9tIHRoZSBwbGF0Zm9ybSBEYXJ0IGlzIHJ1bm5pbmcgb24uIFdoZW4gcnVubmluZyBpbgogICAqIHRoZSBzdGFuZGFsb25lIFZNIHRoaXMgaXMgZGV0ZWN0ZWQgYnkgdGhlIFZNIGJhc2VkIG9uIHRoZQogICAqIG9wZXJhdGluZyBzeXN0ZW0uIFdoZW4gcnVubmluZyBpbiBhIGJyb3dzZXIgbm9uLVdpbmRvd3Mgc2VtYW50aWNzCiAgICogaXMgYWx3YXlzIHVzZWQuCiAgICoKICAgKiBUbyBvdmVycmlkZSB0aGUgYXV0b21hdGljIGRldGVjdGlvbiBvZiB3aGljaCBzZW1hbnRpY3MgdG8gdXNlIHBhc3MKICAgKiBhIHZhbHVlIGZvciBbd2luZG93c10uIFBhc3NpbmcgYHRydWVgIHdpbGwgdXNlIFdpbmRvd3MKICAgKiBzZW1hbnRpY3MgYW5kIHBhc3NpbmcgYGZhbHNlYCB3aWxsIHVzZSBub24tV2luZG93cyBzZW1hbnRpY3MuCiAgICoKICAgKiBJZiB0aGUgVVJJIGVuZHMgd2l0aCBhIHNsYXNoIChpLmUuIHRoZSBsYXN0IHBhdGggY29tcG9uZW50IGlzCiAgICogZW1wdHkpIHRoZSByZXR1cm5lZCBmaWxlIHBhdGggd2lsbCBhbHNvIGVuZCB3aXRoIGEgc2xhc2guCiAgICoKICAgKiBXaXRoIFdpbmRvd3Mgc2VtYW50aWNzIFVSSXMgc3RhcnRpbmcgd2l0aCBhIGRyaXZlIGxldHRlciBjYW5ub3QKICAgKiBiZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkcml2ZSBvbiB0aGUgZGVzaWduYXRlZCBkcml2ZS4gVGhhdCBpcwogICAqIGZvciB0aGUgVVJJIGBmaWxlOi8vL2M6YWJjYCBjYWxsaW5nIGB0b0ZpbGVQYXRoYCB3aWxsIHRocm93IGFzIGEKICAgKiBwYXRoIHNlZ21lbnQgY2Fubm90IGNvbnRhaW4gY29sb24gb24gV2luZG93cy4KICAgKgogICAqIEV4YW1wbGVzIHVzaW5nIG5vbi1XaW5kb3dzIHNlbWFudGljcyAocmVzdWx0aW5nIG9mIGNhbGxpbmcKICAgKiB0b0ZpbGVQYXRoIGluIGNvbW1lbnQpOgogICAqCiAgICogICAgIFVyaS5wYXJzZSgieHh4L3l5eSIpOyAgLy8geHh4L3l5eQogICAqICAgICBVcmkucGFyc2UoInh4eC95eXkvIik7ICAvLyB4eHgveXl5LwogICAqICAgICBVcmkucGFyc2UoImZpbGU6Ly8veHh4L3l5eSIpOyAgLy8gL3h4eC95eXkKICAgKiAgICAgVXJpLnBhcnNlKCJmaWxlOi8vL3h4eC95eXkvIik7ICAvLyAveHh4L3l5eS8KICAgKiAgICAgVXJpLnBhcnNlKCJmaWxlOi8vL0M6Iik7ICAvLyAvQzoKICAgKiAgICAgVXJpLnBhcnNlKCJmaWxlOi8vL0M6YSIpOyAgLy8gL0M6YQogICAqCiAgICogRXhhbXBsZXMgdXNpbmcgV2luZG93cyBzZW1hbnRpY3MgKHJlc3VsdGluZyBVUkkgaW4gY29tbWVudCk6CiAgICoKICAgKiAgICAgVXJpLnBhcnNlKCJ4eHgveXl5Iik7ICAvLyB4eHhceXl5CiAgICogICAgIFVyaS5wYXJzZSgieHh4L3l5eS8iKTsgIC8vIHh4eFx5eXlcCiAgICogICAgIFVyaS5wYXJzZSgiZmlsZTovLy94eHgveXl5Iik7ICAvLyBceHh4XHl5eQogICAqICAgICBVcmkucGFyc2UoImZpbGU6Ly8veHh4L3l5eS8iKTsgIC8vIFx4eHhceXl5XAogICAqICAgICBVcmkucGFyc2UoImZpbGU6Ly8vQzoveHh4L3l5eSIpOyAgLy8gQzpceHh4XHl5eQogICAqICAgICBVcmkucGFyc2UoImZpbGU6Qzp4eHgveXl5Iik7ICAvLyBUaHJvd3MgYXMgYSBwYXRoIHNlZ21lbnQKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IGNvbnRhaW4gY29sb24gb24gV2luZG93cy4KICAgKiAgICAgVXJpLnBhcnNlKCJmaWxlOi8vc2VydmVyL3NoYXJlL2ZpbGUiKTsgIC8vIFxcc2VydmVyXHNoYXJlXGZpbGUKICAgKgogICAqIElmIHRoZSBVUkkgaXMgbm90IGEgZmlsZSBVUkkgY2FsbGluZyB0aGlzIHRocm93cwogICAqIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKgogICAqIElmIHRoZSBVUkkgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIGZpbGUgcGF0aCBjYWxsaW5nIHRoaXMgdGhyb3dzCiAgICogW1Vuc3VwcG9ydGVkRXJyb3JdLgogICAqLwogIC8vIFRPRE8obHJuKTogRGVwcmVjYXRlIGFuZCBtb3ZlIGZ1bmN0aW9uYWxpdHkgdG8gRmlsZSBjbGFzcyBvciBzaW1pbGFyLgogIC8vIFRoZSBjb3JlIGxpYnJhcmllcyBzaG91bGQgbm90IHdvcnJ5IGFib3V0IHRoZSBwbGF0Zm9ybS4KICBTdHJpbmcgdG9GaWxlUGF0aCh7Ym9vbCB3aW5kb3dzfSk7CgogIC8qKgogICAqIEFjY2VzcyB0aGUgc3RydWN0dXJlIG9mIGEgYGRhdGE6YCBVUkkuCiAgICoKICAgKiBSZXR1cm5zIGEgW1VyaURhdGFdIG9iamVjdCBmb3IgYGRhdGE6YCBVUklzIGFuZCBgbnVsbGAgZm9yIGFsbCBvdGhlcgogICAqIFVSSXMuCiAgICogVGhlIFtVcmlEYXRhXSBvYmplY3QgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBtZWRpYSB0eXBlIGFuZCBkYXRhCiAgICogb2YgYSBgZGF0YTpgIFVSSS4KICAgKi8KICBVcmlEYXRhIGdldCBkYXRhOwoKICAvLy8gUmV0dXJucyBhIGhhc2ggY29kZSBjb21wdXRlZCBhcyBgdG9TdHJpbmcoKS5oYXNoQ29kZWAuCiAgLy8vCiAgLy8vIFRoaXMgZ3VhcmFudGVlcyB0aGF0IFVSSXMgd2l0aCB0aGUgc2FtZSBub3JtYWxpemVkCiAgaW50IGdldCBoYXNoQ29kZTsKCiAgLy8vIEEgVVJJIGlzIGVxdWFsIHRvIGFub3RoZXIgVVJJIHdpdGggdGhlIHNhbWUgbm9ybWFsaXplZCByZXByZXNlbnRhdGlvbi4KICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBub3JtYWxpemVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgVVJJLgogIFN0cmluZyB0b1N0cmluZygpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGBVcmlgIGJhc2VkIG9uIHRoaXMgb25lLCBidXQgd2l0aCBzb21lIHBhcnRzIHJlcGxhY2VkLgogICAqCiAgICogVGhpcyBtZXRob2QgdGFrZXMgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB0aGUgW25ldyBVcmldIGNvbnN0cnVjdG9yLAogICAqIGFuZCB0aGV5IGhhdmUgdGhlIHNhbWUgbWVhbmluZy4KICAgKgogICAqIEF0IG1vc3Qgb25lIG9mIFtwYXRoXSBhbmQgW3BhdGhTZWdtZW50c10gbXVzdCBiZSBwcm92aWRlZC4KICAgKiBMaWtld2lzZSwgYXQgbW9zdCBvbmUgb2YgW3F1ZXJ5XSBhbmQgW3F1ZXJ5UGFyYW1ldGVyc10gbXVzdCBiZSBwcm92aWRlZC4KICAgKgogICAqIEVhY2ggcGFydCB0aGF0IGlzIG5vdCBwcm92aWRlZCB3aWxsIGRlZmF1bHQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKICAgKiB2YWx1ZSBmcm9tIHRoaXMgYFVyaWAgaW5zdGVhZC4KICAgKgogICAqIFRoaXMgbWV0aG9kIGlzIGRpZmZlcmVudCBmcm9tIFtVcmkucmVzb2x2ZV0gd2hpY2ggb3ZlcnJpZGVzIGluIGEKICAgKiBoaWVyYXJjaGljYWwgbWFubmVyLAogICAqIGFuZCBjYW4gaW5zdGVhZCByZXBsYWNlIGVhY2ggcGFydCBvZiBhIGBVcmlgIGluZGl2aWR1YWxseS4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiAgICAgVXJpIHVyaTEgPSBVcmkucGFyc2UoImE6Ly9iQGM6NC9kL2U/ZiNnIik7CiAgICogICAgIFVyaSB1cmkyID0gdXJpMS5yZXBsYWNlKHNjaGVtZTogIkEiLCBwYXRoOiAiRC9FL0UiLCBmcmFnbWVudDogIkciKTsKICAgKiAgICAgcHJpbnQodXJpMik7ICAvLyBwcmludHMgImE6Ly9iQGM6NC9EL0UvRT9mI0ciCiAgICoKICAgKiBUaGlzIG1ldGhvZCBhY3RzIHNpbWlsYXJseSB0byB1c2luZyB0aGUgYG5ldyBVcmlgIGNvbnN0cnVjdG9yIHdpdGgKICAgKiBzb21lIG9mIHRoZSBhcmd1bWVudHMgdGFrZW4gZnJvbSB0aGlzIGBVcmlgLiBFeGFtcGxlOgogICAqCiAgICogICAgIFVyaSB1cmkzID0gbmV3IFVyaSgKICAgKiAgICAgICAgIHNjaGVtZTogIkEiLAogICAqICAgICAgICAgdXNlckluZm86IHVyaTEudXNlckluZm8sCiAgICogICAgICAgICBob3N0OiB1cmkxLmhvc3QsCiAgICogICAgICAgICBwb3J0OiB1cmkxLnBvcnQsCiAgICogICAgICAgICBwYXRoOiAiRC9FL0UiLAogICAqICAgICAgICAgcXVlcnk6IHVyaTEucXVlcnksCiAgICogICAgICAgICBmcmFnbWVudDogIkciKTsKICAgKiAgICAgcHJpbnQodXJpMyk7ICAvLyBwcmludHMgImE6Ly9iQGM6NC9EL0UvRT9mI0ciCiAgICogICAgIHByaW50KHVyaTIgPT0gdXJpMyk7ICAvLyBwcmludHMgdHJ1ZS4KICAgKgogICAqIFVzaW5nIHRoaXMgbWV0aG9kIGNhbiBiZSBzZWVuIGFzIGEgc2hvcnRoYW5kIGZvciB0aGUgYFVyaWAgY29uc3RydWN0b3IKICAgKiBjYWxsIGFib3ZlLCBidXQgbWF5IGFsc28gYmUgc2xpZ2h0bHkgZmFzdGVyIGJlY2F1c2UgdGhlIHBhcnRzIHRha2VuCiAgICogZnJvbSB0aGlzIGBVcmlgIG5lZWQgbm90IGJlIGNoZWNrZWQgZm9yIHZhbGlkaXR5IGFnYWluLgogICAqLwogIFVyaSByZXBsYWNlKAogICAgICB7U3RyaW5nIHNjaGVtZSwKICAgICAgU3RyaW5nIHVzZXJJbmZvLAogICAgICBTdHJpbmcgaG9zdCwKICAgICAgaW50IHBvcnQsCiAgICAgIFN0cmluZyBwYXRoLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IHBhdGhTZWdtZW50cywKICAgICAgU3RyaW5nIHF1ZXJ5LAogICAgICBNYXA8U3RyaW5nLCBkeW5hbWljIC8qU3RyaW5nfEl0ZXJhYmxlPFN0cmluZz4qLyA+IHF1ZXJ5UGFyYW1ldGVycywKICAgICAgU3RyaW5nIGZyYWdtZW50fSk7CgogIC8qKgogICAqIFJldHVybnMgYSBgVXJpYCB0aGF0IGRpZmZlcnMgZnJvbSB0aGlzIG9ubHkgaW4gbm90IGhhdmluZyBhIGZyYWdtZW50LgogICAqCiAgICogSWYgdGhpcyBgVXJpYCBkb2VzIG5vdCBoYXZlIGEgZnJhZ21lbnQsIGl0IGlzIGl0c2VsZiByZXR1cm5lZC4KICAgKi8KICBVcmkgcmVtb3ZlRnJhZ21lbnQoKTsKCiAgLyoqCiAgICogUmVzb2x2ZSBbcmVmZXJlbmNlXSBhcyBhbiBVUkkgcmVsYXRpdmUgdG8gYHRoaXNgLgogICAqCiAgICogRmlyc3QgdHVybiBbcmVmZXJlbmNlXSBpbnRvIGEgVVJJIHVzaW5nIFtVcmkucGFyc2VdLiBUaGVuIHJlc29sdmUgdGhlCiAgICogcmVzdWx0aW5nIFVSSSByZWxhdGl2ZSB0byBgdGhpc2AuCiAgICoKICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBVUkkuCiAgICoKICAgKiBTZWUgW3Jlc29sdmVVcmldIGZvciBkZXRhaWxzLgogICAqLwogIFVyaSByZXNvbHZlKFN0cmluZyByZWZlcmVuY2UpOwoKICAvKioKICAgKiBSZXNvbHZlIFtyZWZlcmVuY2VdIGFzIGFuIFVSSSByZWxhdGl2ZSB0byBgdGhpc2AuCiAgICoKICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBVUkkuCiAgICoKICAgKiBUaGUgYWxnb3JpdGhtICJUcmFuc2Zvcm0gUmVmZXJlbmNlIiBmb3IgcmVzb2x2aW5nIGEgcmVmZXJlbmNlIGlzIGRlc2NyaWJlZAogICAqIGluIFtSRkMtMzk4NiBTZWN0aW9uIDVdKGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi01ICJSRkMtMTEyMyIpLgogICAqCiAgICogVXBkYXRlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGJhc2UgVVJJIGlzIGp1c3QgYSByZWxhdGl2ZSBwYXRoIC0KICAgKiB0aGF0IGlzOiB3aGVuIGl0IGhhcyBubyBzY2hlbWUgYW5kIG5vIGF1dGhvcml0eSBhbmQgdGhlIHBhdGggZG9lcyBub3Qgc3RhcnQKICAgKiB3aXRoIGEgc2xhc2guCiAgICogSW4gdGhhdCBjYXNlLCB0aGUgcGF0aHMgYXJlIGNvbWJpbmVkIHdpdGhvdXQgcmVtb3ZpbmcgbGVhZGluZyAiLi4iLCBhbmQKICAgKiBhbiBlbXB0eSBwYXRoIGlzIG5vdCBjb252ZXJ0ZWQgdG8gIi8iLgogICAqLwogIFVyaSByZXNvbHZlVXJpKFVyaSByZWZlcmVuY2UpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgVVJJIHdoZXJlIHRoZSBwYXRoIGhhcyBiZWVuIG5vcm1hbGl6ZWQuCiAgICoKICAgKiBBIG5vcm1hbGl6ZWQgcGF0aCBkb2VzIG5vdCBjb250YWluIGAuYCBzZWdtZW50cyBvciBub24tbGVhZGluZyBgLi5gCiAgICogc2VnbWVudHMuCiAgICogT25seSBhIHJlbGF0aXZlIHBhdGggd2l0aCBubyBzY2hlbWUgb3IgYXV0aG9yaXR5IG1heSBjb250YWluCiAgICogbGVhZGluZyBgLi5gIHNlZ21lbnRzLAogICAqIGEgcGF0aCB0aGF0IHN0YXJ0cyB3aXRoIGAvYCB3aWxsIGFsc28gZHJvcCBhbnkgbGVhZGluZyBgLi5gIHNlZ21lbnRzLgogICAqCiAgICogVGhpcyB1c2VzIHRoZSBzYW1lIG5vcm1hbGl6YXRpb24gc3RyYXRlZ3kgYXMgYG5ldyBVcmkoKS5yZXNvbHZlKHRoaXMpYC4KICAgKgogICAqIERvZXMgbm90IGNoYW5nZSBhbnkgcGFydCBvZiB0aGUgVVJJIGV4Y2VwdCB0aGUgcGF0aC4KICAgKgogICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGBVcmlgIGFsd2F5cyBub3JtYWxpemVzIHBhdGhzLCBzbyBjYWxsaW5nCiAgICogdGhpcyBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0LgogICAqLwogIFVyaSBub3JtYWxpemVQYXRoKCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgYFVyaWAgb2JqZWN0IGJ5IHBhcnNpbmcgYSBVUkkgc3RyaW5nLgogICAqCiAgICogSWYgW3N0YXJ0XSBhbmQgW2VuZF0gYXJlIHByb3ZpZGVkLCB0aGV5IG11c3Qgc3BlY2lmeSBhIHZhbGlkIHN1YnN0cmluZwogICAqIG9mIFt1cmldLCBhbmQgb25seSB0aGUgc3Vic3RyaW5nIGZyb20gYHN0YXJ0YCB0byBgZW5kYCBpcyBwYXJzZWQgYXMgYSBVUkkuCiAgICoKICAgKiBUaGUgW3VyaV0gbXVzdCBub3QgYmUgYG51bGxgLgogICAqIElmIHRoZSBbdXJpXSBzdHJpbmcgaXMgbm90IHZhbGlkIGFzIGEgVVJJIG9yIFVSSSByZWZlcmVuY2UsCiAgICogYSBbRm9ybWF0RXhjZXB0aW9uXSBpcyB0aHJvd24uCiAgICovCiAgc3RhdGljIFVyaSBwYXJzZShTdHJpbmcgdXJpLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIC8vIFRoaXMgcGFyc2luZyB3aWxsIG5vdCB2YWxpZGF0ZSBwZXJjZW50LWVuY29kaW5nLCBJUHY2LCBldGMuCiAgICAvLyBXaGVuIGRvbmUgc3BsaXR0aW5nIGludG8gcGFydHMsIGl0IHdpbGwgY2FsbCwgZS5nLiwgW19tYWtlRnJhZ21lbnRdCiAgICAvLyB0byBkbyB0aGUgZmluYWwgcGFyc2luZy4KICAgIC8vCiAgICAvLyBJbXBvcnRhbnQgcGFydHMgb2YgdGhlIFJGQyAzOTg2IHVzZWQgaGVyZToKICAgIC8vIFVSSSAgICAgICAgICAgPSBzY2hlbWUgIjoiIGhpZXItcGFydCBbICI/IiBxdWVyeSBdIFsgIiMiIGZyYWdtZW50IF0KICAgIC8vCiAgICAvLyBoaWVyLXBhcnQgICAgID0gIi8vIiBhdXRob3JpdHkgcGF0aC1hYmVtcHR5CiAgICAvLyAgICAgICAgICAgICAgIC8gcGF0aC1hYnNvbHV0ZQogICAgLy8gICAgICAgICAgICAgICAvIHBhdGgtcm9vdGxlc3MKICAgIC8vICAgICAgICAgICAgICAgLyBwYXRoLWVtcHR5CiAgICAvLwogICAgLy8gVVJJLXJlZmVyZW5jZSA9IFVSSSAvIHJlbGF0aXZlLXJlZgogICAgLy8KICAgIC8vIGFic29sdXRlLVVSSSAgPSBzY2hlbWUgIjoiIGhpZXItcGFydCBbICI/IiBxdWVyeSBdCiAgICAvLwogICAgLy8gcmVsYXRpdmUtcmVmICA9IHJlbGF0aXZlLXBhcnQgWyAiPyIgcXVlcnkgXSBbICIjIiBmcmFnbWVudCBdCiAgICAvLwogICAgLy8gcmVsYXRpdmUtcGFydCA9ICIvLyIgYXV0aG9yaXR5IHBhdGgtYWJlbXB0eQogICAgLy8gICAgICAgICAgICAgICAvIHBhdGgtYWJzb2x1dGUKICAgIC8vICAgICAgICAgICAgICAgLyBwYXRoLW5vc2NoZW1lCiAgICAvLyAgICAgICAgICAgICAgIC8gcGF0aC1lbXB0eQogICAgLy8KICAgIC8vIHNjaGVtZSAgICAgICAgPSBBTFBIQSAqKCBBTFBIQSAvIERJR0lUIC8gIisiIC8gIi0iIC8gIi4iICkKICAgIC8vCiAgICAvLyBhdXRob3JpdHkgICAgID0gWyB1c2VyaW5mbyAiQCIgXSBob3N0IFsgIjoiIHBvcnQgXQogICAgLy8gdXNlcmluZm8gICAgICA9ICooIHVucmVzZXJ2ZWQgLyBwY3QtZW5jb2RlZCAvIHN1Yi1kZWxpbXMgLyAiOiIgKQogICAgLy8gaG9zdCAgICAgICAgICA9IElQLWxpdGVyYWwgLyBJUHY0YWRkcmVzcyAvIHJlZy1uYW1lCiAgICAvLyBJUC1saXRlcmFsICAgID0gIlsiICggSVB2NmFkZHJlc3MgLyBJUHY2YWRkcnogLyBJUHZGdXR1cmUgKSAiXSIKICAgIC8vIElQdjZhZGRyeiAgICAgPSBJUHY2YWRkcmVzcyAiJTI1IiBab25lSUQKICAgIC8vIFpvbmVJRCAgICAgICAgPSAxKiggdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkICkKICAgIC8vIHBvcnQgICAgICAgICAgPSAqRElHSVQKICAgIC8vIHJlZy1uYW1lICAgICAgPSAqKCB1bnJlc2VydmVkIC8gcGN0LWVuY29kZWQgLyBzdWItZGVsaW1zICkKICAgIC8vCiAgICAvLyBwYXRoICAgICAgICAgID0gcGF0aC1hYmVtcHR5ICAgIDsgYmVnaW5zIHdpdGggIi8iIG9yIGlzIGVtcHR5CiAgICAvLyAgICAgICAgICAgICAgIC8gcGF0aC1hYnNvbHV0ZSAgIDsgYmVnaW5zIHdpdGggIi8iIGJ1dCBub3QgIi8vIgogICAgLy8gICAgICAgICAgICAgICAvIHBhdGgtbm9zY2hlbWUgICA7IGJlZ2lucyB3aXRoIGEgbm9uLWNvbG9uIHNlZ21lbnQKICAgIC8vICAgICAgICAgICAgICAgLyBwYXRoLXJvb3RsZXNzICAgOyBiZWdpbnMgd2l0aCBhIHNlZ21lbnQKICAgIC8vICAgICAgICAgICAgICAgLyBwYXRoLWVtcHR5ICAgICAgOyB6ZXJvIGNoYXJhY3RlcnMKICAgIC8vCiAgICAvLyBwYXRoLWFiZW1wdHkgID0gKiggIi8iIHNlZ21lbnQgKQogICAgLy8gcGF0aC1hYnNvbHV0ZSA9ICIvIiBbIHNlZ21lbnQtbnogKiggIi8iIHNlZ21lbnQgKSBdCiAgICAvLyBwYXRoLW5vc2NoZW1lID0gc2VnbWVudC1uei1uYyAqKCAiLyIgc2VnbWVudCApCiAgICAvLyBwYXRoLXJvb3RsZXNzID0gc2VnbWVudC1ueiAqKCAiLyIgc2VnbWVudCApCiAgICAvLyBwYXRoLWVtcHR5ICAgID0gMDxwY2hhcj4KICAgIC8vCiAgICAvLyBzZWdtZW50ICAgICAgID0gKnBjaGFyCiAgICAvLyBzZWdtZW50LW56ICAgID0gMSpwY2hhcgogICAgLy8gc2VnbWVudC1uei1uYyA9IDEqKCB1bnJlc2VydmVkIC8gcGN0LWVuY29kZWQgLyBzdWItZGVsaW1zIC8gIkAiICkKICAgIC8vICAgICAgICAgICAgICAgOyBub24temVyby1sZW5ndGggc2VnbWVudCB3aXRob3V0IGFueSBjb2xvbiAiOiIKICAgIC8vCiAgICAvLyBwY2hhciAgICAgICAgID0gdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkIC8gc3ViLWRlbGltcyAvICI6IiAvICJAIgogICAgLy8KICAgIC8vIHF1ZXJ5ICAgICAgICAgPSAqKCBwY2hhciAvICIvIiAvICI/IiApCiAgICAvLwogICAgLy8gZnJhZ21lbnQgICAgICA9ICooIHBjaGFyIC8gIi8iIC8gIj8iICkKICAgIGVuZCA/Pz0gdXJpLmxlbmd0aDsKCiAgICAvLyBTcGVjaWFsIGNhc2UgZGF0YTpVUklzLiBJZ25vcmUgY2FzZSB3aGVuIHRlc3RpbmcuCiAgICBpZiAoZW5kID49IHN0YXJ0ICsgNSkgewogICAgICBpbnQgZGF0YURlbHRhID0gX3N0YXJ0c1dpdGhEYXRhKHVyaSwgc3RhcnQpOwogICAgICBpZiAoZGF0YURlbHRhID09IDApIHsKICAgICAgICAvLyBUaGUgY2FzZSBpcyByaWdodC4KICAgICAgICBpZiAoc3RhcnQgPiAwIHx8IGVuZCA8IHVyaS5sZW5ndGgpIHVyaSA9IHVyaS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgICAgICAgcmV0dXJuIFVyaURhdGEuX3BhcnNlKHVyaSwgNSwgbnVsbCkudXJpOwogICAgICB9IGVsc2UgaWYgKGRhdGFEZWx0YSA9PSAweDIwKSB7CiAgICAgICAgcmV0dXJuIFVyaURhdGEuX3BhcnNlKHVyaS5zdWJzdHJpbmcoc3RhcnQgKyA1LCBlbmQpLCAwLCBudWxsKS51cmk7CiAgICAgIH0KICAgICAgLy8gT3RoZXJ3aXNlIHRoZSBVUkkgZG9lc24ndCBzdGFydCB3aXRoICJkYXRhOiIgb3IgYW55IGNhc2UgdmFyaWFudCBvZiBpdC4KICAgIH0KCiAgICAvLyBUaGUgZm9sbG93aW5nIGluZGV4LW5vcm1hbGl6YXRpb24gYmVsb25ncyB3aXRoIHRoZSBzY2FubmluZywgYnV0IGlzCiAgICAvLyBlYXNpZXIgdG8gZG8gaGVyZSBiZWNhdXNlIHdlIGFscmVhZHkgaGF2ZSBleHRyYWN0ZWQgdmFyaWFibGVzIGZyb20gdGhlCiAgICAvLyBpbmRpY2VzIGxpc3QuCiAgICB2YXIgaW5kaWNlcyA9IExpc3Q8aW50Pig4KTsKCiAgICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGVhY2ggcG9zaXRpb24uCiAgICAvLyBUaGUgdmFsdWUgd2lsbCBlaXRoZXIgYmUgY29ycmVjdCBpbiBzb21lIGNhc2VzIHdoZXJlIGl0IGlzbid0IHNldAogICAgLy8gYnkgdGhlIHNjYW5uZXIsIG9yIGl0IGlzIGNsZWFybHkgcmVjb2duaXphYmxlIGFzIGFuIHVuc2V0IHZhbHVlLgogICAgaW5kaWNlcwogICAgICAuLlswXSA9IDAKICAgICAgLi5bX3NjaGVtZUVuZEluZGV4XSA9IHN0YXJ0IC0gMQogICAgICAuLltfaG9zdFN0YXJ0SW5kZXhdID0gc3RhcnQgLSAxCiAgICAgIC4uW19ub3RTaW1wbGVJbmRleF0gPSBzdGFydCAtIDEKICAgICAgLi5bX3BvcnRTdGFydEluZGV4XSA9IHN0YXJ0CiAgICAgIC4uW19wYXRoU3RhcnRJbmRleF0gPSBzdGFydAogICAgICAuLltfcXVlcnlTdGFydEluZGV4XSA9IGVuZAogICAgICAuLltfZnJhZ21lbnRTdGFydEluZGV4XSA9IGVuZDsKICAgIHZhciBzdGF0ZSA9IF9zY2FuKHVyaSwgc3RhcnQsIGVuZCwgX3VyaVN0YXJ0LCBpbmRpY2VzKTsKICAgIC8vIFNvbWUgc3RhdGVzIHRoYXQgc2hvdWxkIGJlIG5vbi1zaW1wbGUsIGJ1dCB0aGUgVVJJIGVuZGVkIGVhcmx5LgogICAgLy8gUGF0aHMgdGhhdCBlbmQgYXQgYSAiLi4iIG11c3QgYmUgbm9ybWFsaXplZCB0byBlbmQgaW4gIi4uLyIuCiAgICBpZiAoc3RhdGUgPj0gX25vblNpbXBsZUVuZFN0YXRlcykgewogICAgICBpbmRpY2VzW19ub3RTaW1wbGVJbmRleF0gPSBlbmQ7CiAgICB9CiAgICBpbnQgc2NoZW1lRW5kID0gaW5kaWNlc1tfc2NoZW1lRW5kSW5kZXhdOwogICAgaWYgKHNjaGVtZUVuZCA+PSBzdGFydCkgewogICAgICAvLyBSZXNjYW4gdGhlIHNjaGVtZSBwYXJ0IG5vdyB0aGF0IHdlIGtub3cgaXQncyBub3QgYSBwYXRoLgogICAgICBzdGF0ZSA9IF9zY2FuKHVyaSwgc3RhcnQsIHNjaGVtZUVuZCwgX3NjaGVtZVN0YXJ0LCBpbmRpY2VzKTsKICAgICAgaWYgKHN0YXRlID09IF9zY2hlbWVTdGFydCkgewogICAgICAgIC8vIEVtcHR5IHNjaGVtZS4KICAgICAgICBpbmRpY2VzW19ub3RTaW1wbGVJbmRleF0gPSBzY2hlbWVFbmQ7CiAgICAgIH0KICAgIH0KICAgIC8vIFRoZSByZXR1cm5lZCBwb3NpdGlvbnMgYXJlIGxpbWl0ZWQgYnkgdGhlIHNjYW5uZXJzIGFiaWxpdHkgdG8gd3JpdGUgb25seQogICAgLy8gb25lIHBvc2l0aW9uIHBlciBjaGFyYWN0ZXIsIGFuZCBvbmx5IHRoZSBjdXJyZW50IHBvc2l0aW9uLgogICAgLy8gU2Nhbm5pbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB3ZSBvbmx5IGtub3cgd2hldGhlciBzb21ldGhpbmcgaXMgYSBzY2hlbWUKICAgIC8vIG9yIGEgcGF0aCB3aGVuIHdlIHNlZSBhIGA6YCBvciBgL2AsIGFuZCBsaWtld2lzZSB3ZSBvbmx5IGtub3cgaWYgdGhlIGZpcnN0CiAgICAvLyBgL2AgaXMgcGFydCBvZiB0aGUgcGF0aCBvciBpcyBsZWFkaW5nIGFuIGF1dGhvcml0eSBjb21wb25lbnQgd2hlbiB3ZSBzZWUKICAgIC8vIHRoZSBuZXh0IGNoYXJhY3Rlci4KCiAgICBpbnQgaG9zdFN0YXJ0ID0gaW5kaWNlc1tfaG9zdFN0YXJ0SW5kZXhdICsgMTsKICAgIGludCBwb3J0U3RhcnQgPSBpbmRpY2VzW19wb3J0U3RhcnRJbmRleF07CiAgICBpbnQgcGF0aFN0YXJ0ID0gaW5kaWNlc1tfcGF0aFN0YXJ0SW5kZXhdOwogICAgaW50IHF1ZXJ5U3RhcnQgPSBpbmRpY2VzW19xdWVyeVN0YXJ0SW5kZXhdOwogICAgaW50IGZyYWdtZW50U3RhcnQgPSBpbmRpY2VzW19mcmFnbWVudFN0YXJ0SW5kZXhdOwoKICAgIC8vIFdlIG1heSBkaXNjb3ZlciBzY2hlbWUgd2hpbGUgaGFuZGxpbmcgc3BlY2lhbCBjYXNlcy4KICAgIFN0cmluZyBzY2hlbWU7CgogICAgLy8gRGVyaXZlIHNvbWUgcG9zaXRpb25zIHRoYXQgd2VyZW4ndCBzZXQgdG8gbm9ybWFsaXplIHRoZSBpbmRpY2VzLgogICAgaWYgKGZyYWdtZW50U3RhcnQgPCBxdWVyeVN0YXJ0KSBxdWVyeVN0YXJ0ID0gZnJhZ21lbnRTdGFydDsKICAgIC8vIElmIHBhdGhTdGFydCBpc24ndCBzZXQgKGl0J3MgYmVmb3JlIHNjaGVtZSBlbmQgb3IgaG9zdCBzdGFydCksIHRoZW4KICAgIC8vIHRoZSBwYXRoIGlzIGVtcHR5LCBvciB0aGVyZSBpcyBubyBhdXRob3JpdHkgcGFydCBhbmQgdGhlIHBhdGgKICAgIC8vIHN0YXJ0cyB3aXRoIGEgbm9uLXNpbXBsZSBjaGFyYWN0ZXIuCiAgICBpZiAocGF0aFN0YXJ0IDwgaG9zdFN0YXJ0KSB7CiAgICAgIC8vIFRoZXJlIGlzIGFuIGF1dGhvcml0eSwgYnV0IG5vIHBhdGguIFRoZSBwYXRoIHdvdWxkIHN0YXJ0IHdpdGggYC9gCiAgICAgIC8vIGlmIGl0IHdhcyB0aGVyZS4KICAgICAgcGF0aFN0YXJ0ID0gcXVlcnlTdGFydDsKICAgIH0gZWxzZSBpZiAocGF0aFN0YXJ0IDw9IHNjaGVtZUVuZCkgewogICAgICAvLyBUaGVyZSBpcyBhIHNjaGVtZSwgYnV0IG5vIGF1dGhvcml0eS4KICAgICAgcGF0aFN0YXJ0ID0gc2NoZW1lRW5kICsgMTsKICAgIH0KICAgIC8vIElmIHRoZXJlIGlzIGFuIGF1dGhvcml0eSB3aXRoIG5vIHBvcnQsIHNldCB0aGUgcG9ydCBwb3NpdGlvbgogICAgLy8gdG8gYmUgYXQgdGhlIGVuZCBvZiB0aGUgYXV0aG9yaXR5IChlcXVhbCB0byBwYXRoU3RhcnQpLgogICAgLy8gVGhpcyBhbHNvIGhhbmRsZXMgYSAiOiIgaW4gYSB1c2VyLWluZm8gY29tcG9uZW50IGluY29ycmVjdGx5IHNldHRpbmcKICAgIC8vIHRoZSBwb3J0IHN0YXJ0IHBvc2l0aW9uLgogICAgaWYgKHBvcnRTdGFydCA8IGhvc3RTdGFydCkgcG9ydFN0YXJ0ID0gcGF0aFN0YXJ0OwoKICAgIGFzc2VydChob3N0U3RhcnQgPT0gc3RhcnQgfHwgc2NoZW1lRW5kIDw9IGhvc3RTdGFydCk7CiAgICBhc3NlcnQoaG9zdFN0YXJ0IDw9IHBvcnRTdGFydCk7CiAgICBhc3NlcnQoc2NoZW1lRW5kIDw9IHBhdGhTdGFydCk7CiAgICBhc3NlcnQocG9ydFN0YXJ0IDw9IHBhdGhTdGFydCk7CiAgICBhc3NlcnQocGF0aFN0YXJ0IDw9IHF1ZXJ5U3RhcnQpOwogICAgYXNzZXJ0KHF1ZXJ5U3RhcnQgPD0gZnJhZ21lbnRTdGFydCk7CgogICAgYm9vbCBpc1NpbXBsZSA9IGluZGljZXNbX25vdFNpbXBsZUluZGV4XSA8IHN0YXJ0OwoKICAgIGlmIChpc1NpbXBsZSkgewogICAgICAvLyBDaGVjay9kbyBub3JtYWxpemF0aW9ucyB0aGF0IHdlcmVuJ3QgZGV0ZWN0ZWQgYnkgdGhlIHNjYW5uZXIuCiAgICAgIC8vIFRoaXMgaW5jbHVkZXMgcmVtb3ZhbCBvZiBlbXB0eSBwb3J0IG9yIHVzZXJJbmZvLAogICAgICAvLyBvciBzY2hlbWUgc3BlY2lmaWMgcG9ydCBhbmQgcGF0aCBub3JtYWxpemF0aW9ucy4KICAgICAgaWYgKGhvc3RTdGFydCA+IHNjaGVtZUVuZCArIDMpIHsKICAgICAgICAvLyBBbHdheXMgYmUgbm9uLXNpbXBsZSBpZiBVUkkgY29udGFpbnMgdXNlci1pbmZvLgogICAgICAgIC8vIFRoZSBzY2FubmVyIGRvZXNuJ3Qgc2V0IHRoZSBub3Qtc2ltcGxlIHBvc2l0aW9uIGluIHRoaXMgY2FzZSBiZWNhdXNlCiAgICAgICAgLy8gaXQncyBzZXR0aW5nIHRoZSBob3N0LXN0YXJ0IHBvc2l0aW9uIGluc3RlYWQuCiAgICAgICAgaXNTaW1wbGUgPSBmYWxzZTsKICAgICAgfSBlbHNlIGlmIChwb3J0U3RhcnQgPiBzdGFydCAmJiBwb3J0U3RhcnQgKyAxID09IHBhdGhTdGFydCkgewogICAgICAgIC8vIElmIHRoZSBwb3J0IGlzIGVtcHR5LCBpdCBzaG91bGQgYmUgb21pdHRlZC4KICAgICAgICAvLyBQYXRob2xvZ2ljYWwgY2FzZSwgZG9uJ3QgYm90aGVyIGNvcnJlY3RpbmcgaXQuCiAgICAgICAgaXNTaW1wbGUgPSBmYWxzZTsKICAgICAgfSBlbHNlIGlmIChxdWVyeVN0YXJ0IDwgZW5kICYmCiAgICAgICAgICAgICAgKHF1ZXJ5U3RhcnQgPT0gcGF0aFN0YXJ0ICsgMiAmJgogICAgICAgICAgICAgICAgICB1cmkuc3RhcnRzV2l0aCgiLi4iLCBwYXRoU3RhcnQpKSB8fAogICAgICAgICAgKHF1ZXJ5U3RhcnQgPiBwYXRoU3RhcnQgKyAyICYmCiAgICAgICAgICAgICAgdXJpLnN0YXJ0c1dpdGgoIi8uLiIsIHF1ZXJ5U3RhcnQgLSAzKSkpIHsKICAgICAgICAvLyBUaGUgcGF0aCBlbmRzIGluIGEgIi4uIiBzZWdtZW50LiBUaGlzIHNob3VsZCBiZSBub3JtYWxpemVkIHRvICIuLi8iLgogICAgICAgIC8vIFdlIGRpZG4ndCBkZXRlY3QgdGhpcyB3aGlsZSBzY2FubmluZyBiZWNhdXNlIGEgcXVlcnkgb3IgZnJhZ21lbnQgd2FzCiAgICAgICAgLy8gZGV0ZWN0ZWQgYXQgdGhlIHNhbWUgdGltZSAod2hpY2ggaXMgd2h5IHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGlzCiAgICAgICAgLy8gaWYgdGhlcmUgaXMgc29tZXRoaW5nIGFmdGVyIHRoZSBwYXRoKS4KICAgICAgICBpc1NpbXBsZSA9IGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoZXJlIGFyZSBhIGZldyBzY2hlbWUtYmFzZWQgbm9ybWFsaXphdGlvbnMgdGhhdAogICAgICAgIC8vIHRoZSBzY2FubmVyIGNvdWxkbid0IGNoZWNrLgogICAgICAgIC8vIFRoYXQgbWVhbnMgdGhhdCB0aGUgaW5wdXQgaXMgdmVyeSBjbG9zZSB0byBzaW1wbGUsIHNvIGp1c3QgZG8KICAgICAgICAvLyB0aGUgbm9ybWFsaXphdGlvbnMuCiAgICAgICAgaWYgKHNjaGVtZUVuZCA9PSBzdGFydCArIDQpIHsKICAgICAgICAgIC8vIERvIHNjaGVtZSBiYXNlZCBub3JtYWxpemF0aW9ucyBmb3IgZmlsZSwgaHR0cC4KICAgICAgICAgIGlmICh1cmkuc3RhcnRzV2l0aCgiZmlsZSIsIHN0YXJ0KSkgewogICAgICAgICAgICBzY2hlbWUgPSAiZmlsZSI7CiAgICAgICAgICAgIGlmIChob3N0U3RhcnQgPD0gc3RhcnQpIHsKICAgICAgICAgICAgICAvLyBGaWxlIFVSSXMgc2hvdWxkIGhhdmUgYW4gYXV0aG9yaXR5LgogICAgICAgICAgICAgIC8vIFBhdGhzIGFmdGVyIGFuIGF1dGhvcml0eSBzaG91bGQgYmUgYWJzb2x1dGUuCiAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtZUF1dGggPSAiZmlsZTovLyI7CiAgICAgICAgICAgICAgaW50IGRlbHRhID0gMjsKICAgICAgICAgICAgICBpZiAoIXVyaS5zdGFydHNXaXRoKCIvIiwgcGF0aFN0YXJ0KSkgewogICAgICAgICAgICAgICAgc2NoZW1lQXV0aCA9ICJmaWxlOi8vLyI7CiAgICAgICAgICAgICAgICBkZWx0YSA9IDM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHVyaSA9IHNjaGVtZUF1dGggKyB1cmkuc3Vic3RyaW5nKHBhdGhTdGFydCwgZW5kKTsKICAgICAgICAgICAgICBzY2hlbWVFbmQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgaG9zdFN0YXJ0ID0gNzsKICAgICAgICAgICAgICBwb3J0U3RhcnQgPSA3OwogICAgICAgICAgICAgIHBhdGhTdGFydCA9IDc7CiAgICAgICAgICAgICAgcXVlcnlTdGFydCArPSBkZWx0YSAtIHN0YXJ0OwogICAgICAgICAgICAgIGZyYWdtZW50U3RhcnQgKz0gZGVsdGEgLSBzdGFydDsKICAgICAgICAgICAgICBzdGFydCA9IDA7CiAgICAgICAgICAgICAgZW5kID0gdXJpLmxlbmd0aDsKICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoU3RhcnQgPT0gcXVlcnlTdGFydCkgewogICAgICAgICAgICAgIC8vIFVyaSBoYXMgYXV0aG9yaXR5IGFuZCBlbXB0eSBwYXRoLiBBZGQgIi8iIGFzIHBhdGguCiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID09IDAgJiYgZW5kID09IHVyaS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHVyaSA9IHVyaS5yZXBsYWNlUmFuZ2UocGF0aFN0YXJ0LCBxdWVyeVN0YXJ0LCAiLyIpOwogICAgICAgICAgICAgICAgcXVlcnlTdGFydCArPSAxOwogICAgICAgICAgICAgICAgZnJhZ21lbnRTdGFydCArPSAxOwogICAgICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVyaSA9ICIke3VyaS5zdWJzdHJpbmcoc3RhcnQsIHBhdGhTdGFydCl9LyIKICAgICAgICAgICAgICAgICAgICAiJHt1cmkuc3Vic3RyaW5nKHF1ZXJ5U3RhcnQsIGVuZCl9IjsKICAgICAgICAgICAgICAgIHNjaGVtZUVuZCAtPSBzdGFydDsKICAgICAgICAgICAgICAgIGhvc3RTdGFydCAtPSBzdGFydDsKICAgICAgICAgICAgICAgIHBvcnRTdGFydCAtPSBzdGFydDsKICAgICAgICAgICAgICAgIHBhdGhTdGFydCAtPSBzdGFydDsKICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnQgKz0gMSAtIHN0YXJ0OwogICAgICAgICAgICAgICAgZnJhZ21lbnRTdGFydCArPSAxIC0gc3RhcnQ7CiAgICAgICAgICAgICAgICBzdGFydCA9IDA7CiAgICAgICAgICAgICAgICBlbmQgPSB1cmkubGVuZ3RoOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmICh1cmkuc3RhcnRzV2l0aCgiaHR0cCIsIHN0YXJ0KSkgewogICAgICAgICAgICBzY2hlbWUgPSAiaHR0cCI7CiAgICAgICAgICAgIC8vIEhUVFAgVVJJcyBzaG91bGQgbm90IGhhdmUgYW4gZXhwbGljaXQgcG9ydCBvZiA4MC4KICAgICAgICAgICAgaWYgKHBvcnRTdGFydCA+IHN0YXJ0ICYmCiAgICAgICAgICAgICAgICBwb3J0U3RhcnQgKyAzID09IHBhdGhTdGFydCAmJgogICAgICAgICAgICAgICAgdXJpLnN0YXJ0c1dpdGgoIjgwIiwgcG9ydFN0YXJ0ICsgMSkpIHsKICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gMCAmJiBlbmQgPT0gdXJpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdXJpID0gdXJpLnJlcGxhY2VSYW5nZShwb3J0U3RhcnQsIHBhdGhTdGFydCwgIiIpOwogICAgICAgICAgICAgICAgcGF0aFN0YXJ0IC09IDM7CiAgICAgICAgICAgICAgICBxdWVyeVN0YXJ0IC09IDM7CiAgICAgICAgICAgICAgICBmcmFnbWVudFN0YXJ0IC09IDM7CiAgICAgICAgICAgICAgICBlbmQgLT0gMzsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXJpID0gdXJpLnN1YnN0cmluZyhzdGFydCwgcG9ydFN0YXJ0KSArCiAgICAgICAgICAgICAgICAgICAgdXJpLnN1YnN0cmluZyhwYXRoU3RhcnQsIGVuZCk7CiAgICAgICAgICAgICAgICBzY2hlbWVFbmQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgICBob3N0U3RhcnQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgICBwb3J0U3RhcnQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgICBwYXRoU3RhcnQgLT0gMyArIHN0YXJ0OwogICAgICAgICAgICAgICAgcXVlcnlTdGFydCAtPSAzICsgc3RhcnQ7CiAgICAgICAgICAgICAgICBmcmFnbWVudFN0YXJ0IC09IDMgKyBzdGFydDsKICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKICAgICAgICAgICAgICAgIGVuZCA9IHVyaS5sZW5ndGg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChzY2hlbWVFbmQgPT0gc3RhcnQgKyA1ICYmIHVyaS5zdGFydHNXaXRoKCJodHRwcyIsIHN0YXJ0KSkgewogICAgICAgICAgc2NoZW1lID0gImh0dHBzIjsKICAgICAgICAgIC8vIEhUVFBTIFVSSXMgc2hvdWxkIG5vdCBoYXZlIGFuIGV4cGxpY2l0IHBvcnQgb2YgNDQzLgogICAgICAgICAgaWYgKHBvcnRTdGFydCA+IHN0YXJ0ICYmCiAgICAgICAgICAgICAgcG9ydFN0YXJ0ICsgNCA9PSBwYXRoU3RhcnQgJiYKICAgICAgICAgICAgICB1cmkuc3RhcnRzV2l0aCgiNDQzIiwgcG9ydFN0YXJ0ICsgMSkpIHsKICAgICAgICAgICAgaWYgKHN0YXJ0ID09IDAgJiYgZW5kID09IHVyaS5sZW5ndGgpIHsKICAgICAgICAgICAgICB1cmkgPSB1cmkucmVwbGFjZVJhbmdlKHBvcnRTdGFydCwgcGF0aFN0YXJ0LCAiIik7CiAgICAgICAgICAgICAgcGF0aFN0YXJ0IC09IDQ7CiAgICAgICAgICAgICAgcXVlcnlTdGFydCAtPSA0OwogICAgICAgICAgICAgIGZyYWdtZW50U3RhcnQgLT0gNDsKICAgICAgICAgICAgICBlbmQgLT0gMzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKHN0YXJ0LCBwb3J0U3RhcnQpICsKICAgICAgICAgICAgICAgICAgdXJpLnN1YnN0cmluZyhwYXRoU3RhcnQsIGVuZCk7CiAgICAgICAgICAgICAgc2NoZW1lRW5kIC09IHN0YXJ0OwogICAgICAgICAgICAgIGhvc3RTdGFydCAtPSBzdGFydDsKICAgICAgICAgICAgICBwb3J0U3RhcnQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgcGF0aFN0YXJ0IC09IDQgKyBzdGFydDsKICAgICAgICAgICAgICBxdWVyeVN0YXJ0IC09IDQgKyBzdGFydDsKICAgICAgICAgICAgICBmcmFnbWVudFN0YXJ0IC09IDQgKyBzdGFydDsKICAgICAgICAgICAgICBzdGFydCA9IDA7CiAgICAgICAgICAgICAgZW5kID0gdXJpLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChpc1NpbXBsZSkgewogICAgICBpZiAoc3RhcnQgPiAwIHx8IGVuZCA8IHVyaS5sZW5ndGgpIHsKICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgICAgIHNjaGVtZUVuZCAtPSBzdGFydDsKICAgICAgICBob3N0U3RhcnQgLT0gc3RhcnQ7CiAgICAgICAgcG9ydFN0YXJ0IC09IHN0YXJ0OwogICAgICAgIHBhdGhTdGFydCAtPSBzdGFydDsKICAgICAgICBxdWVyeVN0YXJ0IC09IHN0YXJ0OwogICAgICAgIGZyYWdtZW50U3RhcnQgLT0gc3RhcnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIF9TaW1wbGVVcmkodXJpLCBzY2hlbWVFbmQsIGhvc3RTdGFydCwgcG9ydFN0YXJ0LCBwYXRoU3RhcnQsCiAgICAgICAgICBxdWVyeVN0YXJ0LCBmcmFnbWVudFN0YXJ0LCBzY2hlbWUpOwogICAgfQoKICAgIHJldHVybiBfVXJpLm5vdFNpbXBsZSh1cmksIHN0YXJ0LCBlbmQsIHNjaGVtZUVuZCwgaG9zdFN0YXJ0LCBwb3J0U3RhcnQsCiAgICAgICAgcGF0aFN0YXJ0LCBxdWVyeVN0YXJ0LCBmcmFnbWVudFN0YXJ0LCBzY2hlbWUpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBgVXJpYCBvYmplY3QgYnkgcGFyc2luZyBhIFVSSSBzdHJpbmcuCiAgICoKICAgKiBJZiBbc3RhcnRdIGFuZCBbZW5kXSBhcmUgcHJvdmlkZWQsIHRoZXkgbXVzdCBzcGVjaWZ5IGEgdmFsaWQgc3Vic3RyaW5nCiAgICogb2YgW3VyaV0sIGFuZCBvbmx5IHRoZSBzdWJzdHJpbmcgZnJvbSBgc3RhcnRgIHRvIGBlbmRgIGlzIHBhcnNlZCBhcyBhIFVSSS4KICAgKiBUaGUgW3VyaV0gbXVzdCBub3QgYmUgYG51bGxgLgogICAqCiAgICogUmV0dXJucyBgbnVsbGAgaWYgdGhlIFt1cmldIHN0cmluZyBpcyBub3QgdmFsaWQgYXMgYSBVUkkgb3IgVVJJIHJlZmVyZW5jZS4KICAgKi8KICBzdGF0aWMgVXJpIHRyeVBhcnNlKFN0cmluZyB1cmksIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgLy8gVE9ETzogT3B0aW1pemUgdG8gYXZvaWQgdGhyb3dpbmctYW5kLXJlY2F0Y2hpbmcuCiAgICB0cnkgewogICAgICByZXR1cm4gcGFyc2UodXJpLCBzdGFydCwgZW5kKTsKICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICAvKioKICAgKiBFbmNvZGUgdGhlIHN0cmluZyBbY29tcG9uZW50XSB1c2luZyBwZXJjZW50LWVuY29kaW5nIHRvIG1ha2UgaXQKICAgKiBzYWZlIGZvciBsaXRlcmFsIHVzZSBhcyBhIFVSSSBjb21wb25lbnQuCiAgICoKICAgKiBBbGwgY2hhcmFjdGVycyBleGNlcHQgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgbGV0dGVycywgZGlnaXRzIGFuZAogICAqIHRoZSBjaGFyYWN0ZXJzIGAtXy4hfionKClgIGFyZSBwZXJjZW50LWVuY29kZWQuIFRoaXMgaXMgdGhlCiAgICogc2V0IG9mIGNoYXJhY3RlcnMgc3BlY2lmaWVkIGluIFJGQyAyMzk2IGFuZCB0aGUgd2hpY2ggaXMKICAgKiBzcGVjaWZpZWQgZm9yIHRoZSBlbmNvZGVVcmlDb21wb25lbnQgaW4gRUNNQS0yNjIgdmVyc2lvbiA1LjEuCiAgICoKICAgKiBXaGVuIG1hbnVhbGx5IGVuY29kaW5nIHBhdGggc2VnbWVudHMgb3IgcXVlcnkgY29tcG9uZW50cyByZW1lbWJlcgogICAqIHRvIGVuY29kZSBlYWNoIHBhcnQgc2VwYXJhdGVseSBiZWZvcmUgYnVpbGRpbmcgdGhlIHBhdGggb3IgcXVlcnkKICAgKiBzdHJpbmcuCiAgICoKICAgKiBGb3IgZW5jb2RpbmcgdGhlIHF1ZXJ5IHBhcnQgY29uc2lkZXIgdXNpbmcKICAgKiBbZW5jb2RlUXVlcnlDb21wb25lbnRdLgogICAqCiAgICogVG8gYXZvaWQgdGhlIG5lZWQgZm9yIGV4cGxpY2l0bHkgZW5jb2RpbmcgdXNlIHRoZSBbcGF0aFNlZ21lbnRzXQogICAqIGFuZCBbcXVlcnlQYXJhbWV0ZXJzXSBvcHRpb25hbCBuYW1lZCBhcmd1bWVudHMgd2hlbiBjb25zdHJ1Y3RpbmcKICAgKiBhIFtVcmldLgogICAqLwogIHN0YXRpYyBTdHJpbmcgZW5jb2RlQ29tcG9uZW50KFN0cmluZyBjb21wb25lbnQpIHsKICAgIHJldHVybiBfVXJpLl91cmlFbmNvZGUoX1VyaS5fdW5yZXNlcnZlZDIzOTZUYWJsZSwgY29tcG9uZW50LCB1dGY4LCBmYWxzZSk7CiAgfQoKICAvKioKICAgKiBFbmNvZGUgdGhlIHN0cmluZyBbY29tcG9uZW50XSBhY2NvcmRpbmcgdG8gdGhlIEhUTUwgNC4wMSBydWxlcwogICAqIGZvciBlbmNvZGluZyB0aGUgcG9zdGluZyBvZiBhIEhUTUwgZm9ybSBhcyBhIHF1ZXJ5IHN0cmluZwogICAqIGNvbXBvbmVudC4KICAgKgogICAqIEVuY29kZSB0aGUgc3RyaW5nIFtjb21wb25lbnRdIGFjY29yZGluZyB0byB0aGUgSFRNTCA0LjAxIHJ1bGVzCiAgICogZm9yIGVuY29kaW5nIHRoZSBwb3N0aW5nIG9mIGEgSFRNTCBmb3JtIGFzIGEgcXVlcnkgc3RyaW5nCiAgICogY29tcG9uZW50LgoKICAgKiBUaGUgY29tcG9uZW50IGlzIGZpcnN0IGVuY29kZWQgdG8gYnl0ZXMgdXNpbmcgW2VuY29kaW5nXS4KICAgKiBUaGUgZGVmYXVsdCBpcyB0byB1c2UgW3V0ZjhdIGVuY29kaW5nLCB3aGljaCBwcmVzZXJ2ZXMgYWxsCiAgICogdGhlIGNoYXJhY3RlcnMgdGhhdCBkb24ndCBuZWVkIGVuY29kaW5nLgoKICAgKiBUaGVuIHRoZSByZXN1bHRpbmcgYnl0ZXMgYXJlICJwZXJjZW50LWVuY29kZWQiLiBUaGlzIHRyYW5zZm9ybXMKICAgKiBzcGFjZXMgKFUrMDAyMCkgdG8gYSBwbHVzIHNpZ24gKCcrJykgYW5kIGFsbCBieXRlcyB0aGF0IGFyZSBub3QKICAgKiB0aGUgQVNDSUkgZGVjaW1hbCBkaWdpdHMsIGxldHRlcnMgb3Igb25lIG9mICctLl9+JyBhcmUgd3JpdHRlbiBhcwogICAqIGEgcGVyY2VudCBzaWduICclJyBmb2xsb3dlZCBieSB0aGUgdHdvLWRpZ2l0IGhleGFkZWNpbWFsCiAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlIGJ5dGUuCgogICAqIE5vdGUgdGhhdCB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgd2hpY2ggYXJlIHBlcmNlbnQtZW5jb2RlZCBpcyBhCiAgICogc3VwZXJzZXQgb2Ygd2hhdCBIVE1MIDQuMDEgcmVxdWlyZXMsIHNpbmNlIGl0IHJlZmVycyB0byBSRkMgMTczOAogICAqIGZvciByZXNlcnZlZCBjaGFyYWN0ZXJzLgogICAqCiAgICogV2hlbiBtYW51YWxseSBlbmNvZGluZyBxdWVyeSBjb21wb25lbnRzIHJlbWVtYmVyIHRvIGVuY29kZSBlYWNoCiAgICogcGFydCBzZXBhcmF0ZWx5IGJlZm9yZSBidWlsZGluZyB0aGUgcXVlcnkgc3RyaW5nLgogICAqCiAgICogVG8gYXZvaWQgdGhlIG5lZWQgZm9yIGV4cGxpY2l0bHkgZW5jb2RpbmcgdGhlIHF1ZXJ5IHVzZSB0aGUKICAgKiBbcXVlcnlQYXJhbWV0ZXJzXSBvcHRpb25hbCBuYW1lZCBhcmd1bWVudHMgd2hlbiBjb25zdHJ1Y3RpbmcgYQogICAqIFtVcmldLgogICAqCiAgICogU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0MDEvaW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjEzLjQuMiBmb3IgbW9yZQogICAqIGRldGFpbHMuCiAgICovCiAgc3RhdGljIFN0cmluZyBlbmNvZGVRdWVyeUNvbXBvbmVudChTdHJpbmcgY29tcG9uZW50LAogICAgICB7RW5jb2RpbmcgZW5jb2RpbmcgPSB1dGY4fSkgewogICAgcmV0dXJuIF9VcmkuX3VyaUVuY29kZShfVXJpLl91bnJlc2VydmVkVGFibGUsIGNvbXBvbmVudCwgZW5jb2RpbmcsIHRydWUpOwogIH0KCiAgLyoqCiAgICogRGVjb2RlcyB0aGUgcGVyY2VudC1lbmNvZGluZyBpbiBbZW5jb2RlZENvbXBvbmVudF0uCiAgICoKICAgKiBOb3RlIHRoYXQgZGVjb2RpbmcgYSBVUkkgY29tcG9uZW50IG1pZ2h0IGNoYW5nZSBpdHMgbWVhbmluZyBhcwogICAqIHNvbWUgb2YgdGhlIGRlY29kZWQgY2hhcmFjdGVycyBjb3VsZCBiZSBjaGFyYWN0ZXJzIHdpdGggYXJlCiAgICogZGVsaW1pdGVycyBmb3IgYSBnaXZlbiBVUkkgY29tcG9uZW50IHR5cGUuIEFsd2F5cyBzcGxpdCBhIFVSSQogICAqIGNvbXBvbmVudCB1c2luZyB0aGUgZGVsaW1pdGVycyBmb3IgdGhlIGNvbXBvbmVudCBiZWZvcmUgZGVjb2RpbmcKICAgKiB0aGUgaW5kaXZpZHVhbCBwYXJ0cy4KICAgKgogICAqIEZvciBoYW5kbGluZyB0aGUgW3BhdGhdIGFuZCBbcXVlcnldIGNvbXBvbmVudHMgY29uc2lkZXIgdXNpbmcKICAgKiBbcGF0aFNlZ21lbnRzXSBhbmQgW3F1ZXJ5UGFyYW1ldGVyc10gdG8gZ2V0IHRoZSBzZXBhcmF0ZWQgYW5kCiAgICogZGVjb2RlZCBjb21wb25lbnQuCiAgICovCiAgc3RhdGljIFN0cmluZyBkZWNvZGVDb21wb25lbnQoU3RyaW5nIGVuY29kZWRDb21wb25lbnQpIHsKICAgIHJldHVybiBfVXJpLl91cmlEZWNvZGUoCiAgICAgICAgZW5jb2RlZENvbXBvbmVudCwgMCwgZW5jb2RlZENvbXBvbmVudC5sZW5ndGgsIHV0ZjgsIGZhbHNlKTsKICB9CgogIC8qKgogICAqIERlY29kZXMgdGhlIHBlcmNlbnQtZW5jb2RpbmcgaW4gW2VuY29kZWRDb21wb25lbnRdLCBjb252ZXJ0aW5nCiAgICogcGx1c2VzIHRvIHNwYWNlcy4KICAgKgogICAqIEl0IHdpbGwgY3JlYXRlIGEgYnl0ZS1saXN0IG9mIHRoZSBkZWNvZGVkIGNoYXJhY3RlcnMsIGFuZCB0aGVuIHVzZQogICAqIFtlbmNvZGluZ10gdG8gZGVjb2RlIHRoZSBieXRlLWxpc3QgdG8gYSBTdHJpbmcuIFRoZSBkZWZhdWx0IGVuY29kaW5nIGlzCiAgICogVVRGLTguCiAgICovCiAgc3RhdGljIFN0cmluZyBkZWNvZGVRdWVyeUNvbXBvbmVudChTdHJpbmcgZW5jb2RlZENvbXBvbmVudCwKICAgICAge0VuY29kaW5nIGVuY29kaW5nID0gdXRmOH0pIHsKICAgIHJldHVybiBfVXJpLl91cmlEZWNvZGUoCiAgICAgICAgZW5jb2RlZENvbXBvbmVudCwgMCwgZW5jb2RlZENvbXBvbmVudC5sZW5ndGgsIGVuY29kaW5nLCB0cnVlKTsKICB9CgogIC8qKgogICAqIEVuY29kZSB0aGUgc3RyaW5nIFt1cmldIHVzaW5nIHBlcmNlbnQtZW5jb2RpbmcgdG8gbWFrZSBpdAogICAqIHNhZmUgZm9yIGxpdGVyYWwgdXNlIGFzIGEgZnVsbCBVUkkuCiAgICoKICAgKiBBbGwgY2hhcmFjdGVycyBleGNlcHQgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgbGV0dGVycywgZGlnaXRzIGFuZAogICAqIHRoZSBjaGFyYWN0ZXJzIGAhIyQmJygpKissLS4vOjs9P0BffmAgYXJlIHBlcmNlbnQtZW5jb2RlZC4gVGhpcwogICAqIGlzIHRoZSBzZXQgb2YgY2hhcmFjdGVycyBzcGVjaWZpZWQgaW4gaW4gRUNNQS0yNjIgdmVyc2lvbiA1LjEgZm9yCiAgICogdGhlIGVuY29kZVVSSSBmdW5jdGlvbiAuCiAgICovCiAgc3RhdGljIFN0cmluZyBlbmNvZGVGdWxsKFN0cmluZyB1cmkpIHsKICAgIHJldHVybiBfVXJpLl91cmlFbmNvZGUoX1VyaS5fZW5jb2RlRnVsbFRhYmxlLCB1cmksIHV0ZjgsIGZhbHNlKTsKICB9CgogIC8qKgogICAqIERlY29kZXMgdGhlIHBlcmNlbnQtZW5jb2RpbmcgaW4gW3VyaV0uCiAgICoKICAgKiBOb3RlIHRoYXQgZGVjb2RpbmcgYSBmdWxsIFVSSSBtaWdodCBjaGFuZ2UgaXRzIG1lYW5pbmcgYXMgc29tZSBvZgogICAqIHRoZSBkZWNvZGVkIGNoYXJhY3RlcnMgY291bGQgYmUgcmVzZXJ2ZWQgY2hhcmFjdGVycy4gSW4gbW9zdAogICAqIGNhc2VzIGFuIGVuY29kZWQgVVJJIHNob3VsZCBiZSBwYXJzZWQgaW50byBjb21wb25lbnRzIHVzaW5nCiAgICogW1VyaS5wYXJzZV0gYmVmb3JlIGRlY29kaW5nIHRoZSBzZXBhcmF0ZSBjb21wb25lbnRzLgogICAqLwogIHN0YXRpYyBTdHJpbmcgZGVjb2RlRnVsbChTdHJpbmcgdXJpKSB7CiAgICByZXR1cm4gX1VyaS5fdXJpRGVjb2RlKHVyaSwgMCwgdXJpLmxlbmd0aCwgdXRmOCwgZmFsc2UpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgW3F1ZXJ5XSBzcGxpdCBpbnRvIGEgbWFwIGFjY29yZGluZyB0byB0aGUgcnVsZXMKICAgKiBzcGVjaWZpZWQgZm9yIEZPUk0gcG9zdCBpbiB0aGUgW0hUTUwgNC4wMSBzcGVjaWZpY2F0aW9uIHNlY3Rpb24KICAgKiAxNy4xMy40XShodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy4xMy40ICJIVE1MIDQuMDEgc2VjdGlvbiAxNy4xMy40IikuCiAgICogRWFjaCBrZXkgYW5kIHZhbHVlIGluIHRoZSByZXR1cm5lZCBtYXAgaGFzIGJlZW4gZGVjb2RlZC4gSWYgdGhlIFtxdWVyeV0KICAgKiBpcyB0aGUgZW1wdHkgc3RyaW5nIGFuIGVtcHR5IG1hcCBpcyByZXR1cm5lZC4KICAgKgogICAqIEtleXMgaW4gdGhlIHF1ZXJ5IHN0cmluZyB0aGF0IGhhdmUgbm8gdmFsdWUgYXJlIG1hcHBlZCB0byB0aGUKICAgKiBlbXB0eSBzdHJpbmcuCiAgICoKICAgKiBFYWNoIHF1ZXJ5IGNvbXBvbmVudCB3aWxsIGJlIGRlY29kZWQgdXNpbmcgW2VuY29kaW5nXS4gVGhlIGRlZmF1bHQgZW5jb2RpbmcKICAgKiBpcyBVVEYtOC4KICAgKi8KICBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBzcGxpdFF1ZXJ5U3RyaW5nKFN0cmluZyBxdWVyeSwKICAgICAge0VuY29kaW5nIGVuY29kaW5nID0gdXRmOH0pIHsKICAgIHJldHVybiBxdWVyeS5zcGxpdCgiJiIpLmZvbGQoe30sIChtYXAsIGVsZW1lbnQpIHsKICAgICAgaW50IGluZGV4ID0gZWxlbWVudC5pbmRleE9mKCI9Iik7CiAgICAgIGlmIChpbmRleCA9PSAtMSkgewogICAgICAgIGlmIChlbGVtZW50ICE9ICIiKSB7CiAgICAgICAgICBtYXBbZGVjb2RlUXVlcnlDb21wb25lbnQoZWxlbWVudCwgZW5jb2Rpbmc6IGVuY29kaW5nKV0gPSAiIjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaW5kZXggIT0gMCkgewogICAgICAgIHZhciBrZXkgPSBlbGVtZW50LnN1YnN0cmluZygwLCBpbmRleCk7CiAgICAgICAgdmFyIHZhbHVlID0gZWxlbWVudC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKICAgICAgICBtYXBbZGVjb2RlUXVlcnlDb21wb25lbnQoa2V5LCBlbmNvZGluZzogZW5jb2RpbmcpXSA9CiAgICAgICAgICAgIGRlY29kZVF1ZXJ5Q29tcG9uZW50KHZhbHVlLCBlbmNvZGluZzogZW5jb2RpbmcpOwogICAgICB9CiAgICAgIHJldHVybiBtYXA7CiAgICB9KTsKICB9CgogIC8qKgogICAqIFBhcnNlIHRoZSBbaG9zdF0gYXMgYW4gSVAgdmVyc2lvbiA0IChJUHY0KSBhZGRyZXNzLCByZXR1cm5pbmcgdGhlIGFkZHJlc3MKICAgKiBhcyBhIGxpc3Qgb2YgNCBieXRlcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKGJpZyBlbmRpYW4pLgogICAqCiAgICogVGhyb3dzIGEgW0Zvcm1hdEV4Y2VwdGlvbl0gaWYgW2hvc3RdIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcwogICAqIHJlcHJlc2VudGF0aW9uLgogICAqLwogIHN0YXRpYyBMaXN0PGludD4gcGFyc2VJUHY0QWRkcmVzcyhTdHJpbmcgaG9zdCkgPT4KICAgICAgX3BhcnNlSVB2NEFkZHJlc3MoaG9zdCwgMCwgaG9zdC5sZW5ndGgpOwoKICAvLy8gSW1wbGVtZW50YXRpb24gb2YgW3BhcnNlSVB2NEFkZHJlc3NdIHRoYXQgY2FuIHdvcmsgb24gYSBzdWJzdHJpbmcuCiAgc3RhdGljIExpc3Q8aW50PiBfcGFyc2VJUHY0QWRkcmVzcyhTdHJpbmcgaG9zdCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICB2b2lkIGVycm9yKFN0cmluZyBtc2csIGludCBwb3NpdGlvbikgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oJ0lsbGVnYWwgSVB2NCBhZGRyZXNzLCAkbXNnJywgaG9zdCwgcG9zaXRpb24pOwogICAgfQoKICAgIHZhciByZXN1bHQgPSBVaW50OExpc3QoNCk7CiAgICBpbnQgcGFydEluZGV4ID0gMDsKICAgIGludCBwYXJ0U3RhcnQgPSBzdGFydDsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIGludCBjaGFyID0gaG9zdC5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciAhPSBfRE9UKSB7CiAgICAgICAgaWYgKGNoYXIgXiAweDMwID4gOSkgewogICAgICAgICAgLy8gRmFpbCBvbiBhIG5vbi1kaWdpdCBjaGFyYWN0ZXIuCiAgICAgICAgICBlcnJvcigiaW52YWxpZCBjaGFyYWN0ZXIiLCBpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHBhcnRJbmRleCA9PSAzKSB7CiAgICAgICAgICBlcnJvcignSVB2NCBhZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0cycsIGkpOwogICAgICAgIH0KICAgICAgICBpbnQgcGFydCA9IGludC5wYXJzZShob3N0LnN1YnN0cmluZyhwYXJ0U3RhcnQsIGkpKTsKICAgICAgICBpZiAocGFydCA+IDI1NSkgewogICAgICAgICAgZXJyb3IoImVhY2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSAwLi4yNTUiLCBwYXJ0U3RhcnQpOwogICAgICAgIH0KICAgICAgICByZXN1bHRbcGFydEluZGV4KytdID0gcGFydDsKICAgICAgICBwYXJ0U3RhcnQgPSBpICsgMTsKICAgICAgfQogICAgfQoKICAgIGlmIChwYXJ0SW5kZXggIT0gMykgewogICAgICBlcnJvcignSVB2NCBhZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0cycsIGVuZCk7CiAgICB9CgogICAgaW50IHBhcnQgPSBpbnQucGFyc2UoaG9zdC5zdWJzdHJpbmcocGFydFN0YXJ0LCBlbmQpKTsKICAgIGlmIChwYXJ0ID4gMjU1KSB7CiAgICAgIGVycm9yKCJlYWNoIHBhcnQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMC4uMjU1IiwgcGFydFN0YXJ0KTsKICAgIH0KICAgIHJlc3VsdFtwYXJ0SW5kZXhdID0gcGFydDsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogUGFyc2UgdGhlIFtob3N0XSBhcyBhbiBJUCB2ZXJzaW9uIDYgKElQdjYpIGFkZHJlc3MsIHJldHVybmluZyB0aGUgYWRkcmVzcwogICAqIGFzIGEgbGlzdCBvZiAxNiBieXRlcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKGJpZyBlbmRpYW4pLgogICAqCiAgICogVGhyb3dzIGEgW0Zvcm1hdEV4Y2VwdGlvbl0gaWYgW2hvc3RdIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcwogICAqIHJlcHJlc2VudGF0aW9uLgogICAqCiAgICogQWN0cyBvbiB0aGUgc3Vic3RyaW5nIGZyb20gW3N0YXJ0XSB0byBbZW5kXS4gSWYgW2VuZF0gaXMgb21pdHRlZCwgaXQKICAgKiBkZWZhdWx0cyBvdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCiAgICoKICAgKiBTb21lIGV4YW1wbGVzIG9mIElQdjYgYWRkcmVzc2VzOgogICAqICAqIGA6OjFgCiAgICogICogYEZFREM6QkE5ODo3NjU0OjMyMTA6RkVEQzpCQTk4Ojc2NTQ6MzIxMGAKICAgKiAgKiBgM2ZmZToyYTAwOjEwMDo3MDMxOjoxYAogICAqICAqIGA6OkZGRkY6MTI5LjE0NC41Mi4zOGAKICAgKiAgKiBgMjAxMDo4MzZCOjQxNzk6OjgzNkI6NDE3OWAKICAgKi8KICBzdGF0aWMgTGlzdDxpbnQ+IHBhcnNlSVB2NkFkZHJlc3MoU3RyaW5nIGhvc3QsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgZW5kID8/PSBob3N0Lmxlbmd0aDsKICAgIC8vIEFuIElQdjYgYWRkcmVzcyBjb25zaXN0cyBvZiBleGFjdGx5IDggcGFydHMgb2YgMS00IGhleCBkaWdpdHMsIHNlcGFyYXRlZAogICAgLy8gYnkgYDpgJ3MsIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgogICAgLy8KICAgIC8vICAtIE9uZSAoYW5kIG9ubHkgb25lKSB3aWxkY2FyZCAoYDo6YCkgbWF5IGJlIHByZXNlbnQsIHJlcHJlc2VudGluZyBhIGZpbGwKICAgIC8vICAgIG9mIDAncy4gVGhlIElQdjYgYDo6YCBpcyB0aHVzIDE2IGJ5dGVzIG9mIGAwYC4KICAgIC8vICAtIFRoZSBsYXN0IHR3byBwYXJ0cyBtYXkgYmUgcmVwbGFjZWQgYnkgYW4gSVB2NCAiZG90dGVkLXF1YWQiIGFkZHJlc3MuCgogICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciByZXBvcnRpbmcgYSBiYWRseSBmb3JtYXR0ZWQgSVB2NiBhZGRyZXNzLgogICAgdm9pZCBlcnJvcihTdHJpbmcgbXNnLCBbcG9zaXRpb25dKSB7CiAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbignSWxsZWdhbCBJUHY2IGFkZHJlc3MsICRtc2cnLCBob3N0LCBwb3NpdGlvbik7CiAgICB9CgogICAgLy8gUGFyc2UgYSBoZXggYmxvY2suCiAgICBpbnQgcGFyc2VIZXgoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgIGlmIChlbmQgLSBzdGFydCA+IDQpIHsKICAgICAgICBlcnJvcignYW4gSVB2NiBwYXJ0IGNhbiBvbmx5IGNvbnRhaW4gYSBtYXhpbXVtIG9mIDQgaGV4IGRpZ2l0cycsIHN0YXJ0KTsKICAgICAgfQogICAgICBpbnQgdmFsdWUgPSBpbnQucGFyc2UoaG9zdC5zdWJzdHJpbmcoc3RhcnQsIGVuZCksIHJhZGl4OiAxNik7CiAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAweEZGRkYpIHsKICAgICAgICBlcnJvcignZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIGAweDAuLjB4RkZGRmAnLCBzdGFydCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQoKICAgIGlmIChob3N0Lmxlbmd0aCA8IDIpIGVycm9yKCdhZGRyZXNzIGlzIHRvbyBzaG9ydCcpOwogICAgTGlzdDxpbnQ+IHBhcnRzID0gW107CiAgICBib29sIHdpbGRjYXJkU2VlbiA9IGZhbHNlOwogICAgLy8gU2V0IGlmIHNlZWluZyBhICIuIiwgc3VnZ2VzdGluZyB0aGF0IHRoZXJlIGlzIGFuIElQdjQgYWRkcmVzcy4KICAgIGJvb2wgc2VlbkRvdCA9IGZhbHNlOwogICAgaW50IHBhcnRTdGFydCA9IHN0YXJ0OwogICAgLy8gUGFyc2UgYWxsIHBhcnRzLCBleGNlcHQgYSBwb3RlbnRpYWwgbGFzdCBvbmUuCiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICBpbnQgY2hhciA9IGhvc3QuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNoYXIgPT0gX0NPTE9OKSB7CiAgICAgICAgaWYgKGkgPT0gc3RhcnQpIHsKICAgICAgICAgIC8vIElmIHdlIHNlZSBhIGA6YCBpbiB0aGUgYmVnaW5uaW5nLCBleHBlY3Qgd2lsZGNhcmQuCiAgICAgICAgICBpKys7CiAgICAgICAgICBpZiAoaG9zdC5jb2RlVW5pdEF0KGkpICE9IF9DT0xPTikgewogICAgICAgICAgICBlcnJvcignaW52YWxpZCBzdGFydCBjb2xvbi4nLCBpKTsKICAgICAgICAgIH0KICAgICAgICAgIHBhcnRTdGFydCA9IGk7CiAgICAgICAgfQogICAgICAgIGlmIChpID09IHBhcnRTdGFydCkgewogICAgICAgICAgLy8gV2lsZGNhcmQuIFdlIG9ubHkgYWxsb3cgb25lLgogICAgICAgICAgaWYgKHdpbGRjYXJkU2VlbikgewogICAgICAgICAgICBlcnJvcignb25seSBvbmUgd2lsZGNhcmQgYDo6YCBpcyBhbGxvd2VkJywgaSk7CiAgICAgICAgICB9CiAgICAgICAgICB3aWxkY2FyZFNlZW4gPSB0cnVlOwogICAgICAgICAgcGFydHMuYWRkKC0xKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gRm91bmQgYSBzaW5nbGUgY29sb24uIFBhcnNlIFtwYXJ0U3RhcnQuLmldIGFzIGEgaGV4IGVudHJ5LgogICAgICAgICAgcGFydHMuYWRkKHBhcnNlSGV4KHBhcnRTdGFydCwgaSkpOwogICAgICAgIH0KICAgICAgICBwYXJ0U3RhcnQgPSBpICsgMTsKICAgICAgfSBlbHNlIGlmIChjaGFyID09IF9ET1QpIHsKICAgICAgICBzZWVuRG90ID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAwKSBlcnJvcigndG9vIGZldyBwYXJ0cycpOwogICAgYm9vbCBhdEVuZCA9IChwYXJ0U3RhcnQgPT0gZW5kKTsKICAgIGJvb2wgaXNMYXN0V2lsZGNhcmQgPSAocGFydHMubGFzdCA9PSAtMSk7CiAgICBpZiAoYXRFbmQgJiYgIWlzTGFzdFdpbGRjYXJkKSB7CiAgICAgIGVycm9yKCdleHBlY3RlZCBhIHBhcnQgYWZ0ZXIgbGFzdCBgOmAnLCBlbmQpOwogICAgfQogICAgaWYgKCFhdEVuZCkgewogICAgICBpZiAoIXNlZW5Eb3QpIHsKICAgICAgICBwYXJ0cy5hZGQocGFyc2VIZXgocGFydFN0YXJ0LCBlbmQpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBMaXN0PGludD4gbGFzdCA9IF9wYXJzZUlQdjRBZGRyZXNzKGhvc3QsIHBhcnRTdGFydCwgZW5kKTsKICAgICAgICBwYXJ0cy5hZGQobGFzdFswXSA8PCA4IHwgbGFzdFsxXSk7CiAgICAgICAgcGFydHMuYWRkKGxhc3RbMl0gPDwgOCB8IGxhc3RbM10pOwogICAgICB9CiAgICB9CiAgICBpZiAod2lsZGNhcmRTZWVuKSB7CiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiA3KSB7CiAgICAgICAgZXJyb3IoJ2FuIGFkZHJlc3Mgd2l0aCBhIHdpbGRjYXJkIG11c3QgaGF2ZSBsZXNzIHRoYW4gNyBwYXJ0cycpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBhcnRzLmxlbmd0aCAhPSA4KSB7CiAgICAgIGVycm9yKCdhbiBhZGRyZXNzIHdpdGhvdXQgYSB3aWxkY2FyZCBtdXN0IGNvbnRhaW4gZXhhY3RseSA4IHBhcnRzJyk7CiAgICB9CiAgICBMaXN0PGludD4gYnl0ZXMgPSBVaW50OExpc3QoMTYpOwogICAgZm9yIChpbnQgaSA9IDAsIGluZGV4ID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGludCB2YWx1ZSA9IHBhcnRzW2ldOwogICAgICBpZiAodmFsdWUgPT0gLTEpIHsKICAgICAgICBpbnQgd2lsZENhcmRMZW5ndGggPSA5IC0gcGFydHMubGVuZ3RoOwogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgd2lsZENhcmRMZW5ndGg7IGorKykgewogICAgICAgICAgYnl0ZXNbaW5kZXhdID0gMDsKICAgICAgICAgIGJ5dGVzW2luZGV4ICsgMV0gPSAwOwogICAgICAgICAgaW5kZXggKz0gMjsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnl0ZXNbaW5kZXhdID0gdmFsdWUgPj4gODsKICAgICAgICBieXRlc1tpbmRleCArIDFdID0gdmFsdWUgJiAweGZmOwogICAgICAgIGluZGV4ICs9IDI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBieXRlczsKICB9Cn0KCmNsYXNzIF9VcmkgaW1wbGVtZW50cyBVcmkgewogIC8vIFdlIHJlcHJlc2VudCB0aGUgbWlzc2luZyBzY2hlbWUgYXMgYW4gZW1wdHkgc3RyaW5nLgogIC8vIEEgdmFsaWQgc2NoZW1lIGNhbm5vdCBiZSBlbXB0eS4KICBmaW5hbCBTdHJpbmcgc2NoZW1lOwoKICAvKioKICAgKiBUaGUgdXNlci1pbmZvIHBhcnQgb2YgdGhlIGF1dGhvcml0eS4KICAgKgogICAqIERvZXMgbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYW4gZW1wdHkgdXNlci1pbmZvIGFuZCBhbiBhYnNlbnQgb25lLgogICAqIFRoZSB2YWx1ZSBpcyBhbHdheXMgbm9uLW51bGwuCiAgICogSXMgY29uc2lkZXJlZCBhYnNlbnQgaWYgW19ob3N0XSBpcyBgbnVsbGAuCiAgICovCiAgZmluYWwgU3RyaW5nIF91c2VySW5mbzsKCiAgLyoqCiAgICogVGhlIGhvc3QgbmFtZSBvZiB0aGUgVVJJLgogICAqCiAgICogU2V0IHRvIGBudWxsYCBpZiB0aGVyZSBpcyBubyBhdXRob3JpdHkgaW4gdGhlIFVSSS4KICAgKiBUaGUgaG9zdCBuYW1lIGlzIHRoZSBvbmx5IG1hbmRhdG9yeSBwYXJ0IG9mIGFuIGF1dGhvcml0eSwgc28gd2UgdXNlCiAgICogaXQgdG8gbWFyayB3aGV0aGVyIGFuIGF1dGhvcml0eSBwYXJ0IHdhcyBwcmVzZW50IG9yIG5vdC4KICAgKi8KICBmaW5hbCBTdHJpbmcgX2hvc3Q7CgogIC8qKgogICAqIFRoZSBwb3J0IG51bWJlciBwYXJ0IG9mIHRoZSBhdXRob3JpdHkuCiAgICoKICAgKiBUaGUgcG9ydC4gU2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gcG9ydC4gTm9ybWFsaXplZCB0byBudWxsIGlmCiAgICogdGhlIHBvcnQgaXMgdGhlIGRlZmF1bHQgcG9ydCBmb3IgdGhlIHNjaGVtZS4KICAgKi8KICBpbnQgX3BvcnQ7CgogIC8qKgogICAqIFRoZSBwYXRoIG9mIHRoZSBVUkkuCiAgICoKICAgKiBBbHdheXMgbm9uLW51bGwuCiAgICovCiAgZmluYWwgU3RyaW5nIHBhdGg7CgogIC8vIFRoZSBxdWVyeSBjb250ZW50LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHF1ZXJ5LgogIGZpbmFsIFN0cmluZyBfcXVlcnk7CgogIC8vIFRoZSBmcmFnbWVudCBjb250ZW50LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGZyYWdtZW50LgogIGZpbmFsIFN0cmluZyBfZnJhZ21lbnQ7CgogIC8qKgogICAqIENhY2hlIHRoZSBjb21wdXRlZCByZXR1cm4gdmFsdWUgb2YgW3BhdGhTZWdtZW50c10uCiAgICovCiAgTGlzdDxTdHJpbmc+IF9wYXRoU2VnbWVudHM7CgogIC8qKgogICAqIENhY2hlIG9mIHRoZSBmdWxsIG5vcm1hbGl6ZWQgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgVVJJLgogICAqLwogIFN0cmluZyBfdGV4dDsKCiAgLyoqCiAgICogQ2FjaGUgb2YgdGhlIGhhc2hDb2RlIG9mIFtfdGV4dF0uCiAgICoKICAgKiBJcyBudWxsIHVudGlsIGNvbXB1dGVkLgogICAqLwogIGludCBfaGFzaENvZGVDYWNoZTsKCiAgLyoqCiAgICogQ2FjaGUgdGhlIGNvbXB1dGVkIHJldHVybiB2YWx1ZSBvZiBbcXVlcnlQYXJhbWV0ZXJzXS4KICAgKi8KICBNYXA8U3RyaW5nLCBTdHJpbmc+IF9xdWVyeVBhcmFtZXRlcnM7CiAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBfcXVlcnlQYXJhbWV0ZXJMaXN0czsKCiAgLy8vIEludGVybmFsIG5vbi12ZXJpZnlpbmcgY29uc3RydWN0b3IuIE9ubHkgY2FsbCB3aXRoIHZhbGlkYXRlZCBhcmd1bWVudHMuCiAgLy8vCiAgLy8vIFRoZSBjb21wb25lbnRzIG11c3QgYmUgcHJvcGVybHkgbm9ybWFsaXplZC4KICAvLy8KICAvLy8gVXNlIGBudWxsYCBmb3IgW19ob3N0XSBpZiB0aGVyZSBpcyBubyBhdXRob3JpdHkuIEluIHRoYXQgY2FzZSwgYWx3YXlzCiAgLy8vIHBhc3MgYG51bGxgIGZvciBbX3BvcnRdIGFuZCBbX3VzZXJJbmZvXSBhcyB3ZWxsLgogIC8vLwogIC8vLyBVc2UgYG51bGxgIGZvciBbX3BvcnRdLCBbX3VzZXJJbmZvXSwgW19xdWVyeV0gYW5kIFtfZnJhZ21lbnRdIGlmIHRoZXJlIGlzCiAgLy8vIGNvbXBvbmVudCBvZiB0aGF0IHR5cGUuCiAgLy8vCiAgLy8vIFRoZSBbcGF0aF0gYW5kIFtzY2hlbWVdIGFyZSBuZXZlciBlbXB0eS4KICBfVXJpLl9pbnRlcm5hbCh0aGlzLnNjaGVtZSwgdGhpcy5fdXNlckluZm8sIHRoaXMuX2hvc3QsIHRoaXMuX3BvcnQsIHRoaXMucGF0aCwKICAgICAgdGhpcy5fcXVlcnksIHRoaXMuX2ZyYWdtZW50KTsKCiAgLy8vIENyZWF0ZSBhIFtfVXJpXSBmcm9tIHBhcnRzIG9mIFt1cmldLgogIC8vLwogIC8vLyBUaGUgcGFyYW1ldGVycyBzcGVjaWZ5IHRoZSBzdGFydC9lbmQgb2YgcGFydGljdWxhciBjb21wb25lbnRzIG9mIHRoZSBVUkkuCiAgLy8vIFRoZSBbc2NoZW1lXSBtYXkgY29udGFpbiBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBub3JtYWxpemVkIHNjaGVtZQogIC8vLyBjb21wb25lbnQgaWYgb25lIGhhcyBhbHJlYWR5IGJlZW4gZGlzY292ZXJlZC4KICBmYWN0b3J5IF9Vcmkubm90U2ltcGxlKAogICAgICBTdHJpbmcgdXJpLAogICAgICBpbnQgc3RhcnQsCiAgICAgIGludCBlbmQsCiAgICAgIGludCBzY2hlbWVFbmQsCiAgICAgIGludCBob3N0U3RhcnQsCiAgICAgIGludCBwb3J0U3RhcnQsCiAgICAgIGludCBwYXRoU3RhcnQsCiAgICAgIGludCBxdWVyeVN0YXJ0LAogICAgICBpbnQgZnJhZ21lbnRTdGFydCwKICAgICAgU3RyaW5nIHNjaGVtZSkgewogICAgaWYgKHNjaGVtZSA9PSBudWxsKSB7CiAgICAgIHNjaGVtZSA9ICIiOwogICAgICBpZiAoc2NoZW1lRW5kID4gc3RhcnQpIHsKICAgICAgICBzY2hlbWUgPSBfbWFrZVNjaGVtZSh1cmksIHN0YXJ0LCBzY2hlbWVFbmQpOwogICAgICB9IGVsc2UgaWYgKHNjaGVtZUVuZCA9PSBzdGFydCkgewogICAgICAgIF9mYWlsKHVyaSwgc3RhcnQsICJJbnZhbGlkIGVtcHR5IHNjaGVtZSIpOwogICAgICB9CiAgICB9CiAgICBTdHJpbmcgdXNlckluZm8gPSAiIjsKICAgIFN0cmluZyBob3N0OwogICAgaW50IHBvcnQ7CiAgICBpZiAoaG9zdFN0YXJ0ID4gc3RhcnQpIHsKICAgICAgaW50IHVzZXJJbmZvU3RhcnQgPSBzY2hlbWVFbmQgKyAzOwogICAgICBpZiAodXNlckluZm9TdGFydCA8IGhvc3RTdGFydCkgewogICAgICAgIHVzZXJJbmZvID0gX21ha2VVc2VySW5mbyh1cmksIHVzZXJJbmZvU3RhcnQsIGhvc3RTdGFydCAtIDEpOwogICAgICB9CiAgICAgIGhvc3QgPSBfbWFrZUhvc3QodXJpLCBob3N0U3RhcnQsIHBvcnRTdGFydCwgZmFsc2UpOwogICAgICBpZiAocG9ydFN0YXJ0ICsgMSA8IHBhdGhTdGFydCkgewogICAgICAgIC8vIFNob3VsZCB0aHJvdyBiZWNhdXNlIGludmFsaWQuCiAgICAgICAgcG9ydCA9IGludC5wYXJzZSh1cmkuc3Vic3RyaW5nKHBvcnRTdGFydCArIDEsIHBhdGhTdGFydCksIG9uRXJyb3I6IChfKSB7CiAgICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgcG9ydCIsIHVyaSwgcG9ydFN0YXJ0ICsgMSk7CiAgICAgICAgfSk7CiAgICAgICAgcG9ydCA9IF9tYWtlUG9ydChwb3J0LCBzY2hlbWUpOwogICAgICB9CiAgICB9CiAgICBTdHJpbmcgcGF0aCA9CiAgICAgICAgX21ha2VQYXRoKHVyaSwgcGF0aFN0YXJ0LCBxdWVyeVN0YXJ0LCBudWxsLCBzY2hlbWUsIGhvc3QgIT0gbnVsbCk7CiAgICBTdHJpbmcgcXVlcnk7CiAgICBpZiAocXVlcnlTdGFydCA8IGZyYWdtZW50U3RhcnQpIHsKICAgICAgcXVlcnkgPSBfbWFrZVF1ZXJ5KHVyaSwgcXVlcnlTdGFydCArIDEsIGZyYWdtZW50U3RhcnQsIG51bGwpOwogICAgfQogICAgU3RyaW5nIGZyYWdtZW50OwogICAgaWYgKGZyYWdtZW50U3RhcnQgPCBlbmQpIHsKICAgICAgZnJhZ21lbnQgPSBfbWFrZUZyYWdtZW50KHVyaSwgZnJhZ21lbnRTdGFydCArIDEsIGVuZCk7CiAgICB9CiAgICByZXR1cm4gX1VyaS5faW50ZXJuYWwoc2NoZW1lLCB1c2VySW5mbywgaG9zdCwgcG9ydCwgcGF0aCwgcXVlcnksIGZyYWdtZW50KTsKICB9CgogIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbVXJpLlVyaV0uCiAgZmFjdG9yeSBfVXJpKAogICAgICB7U3RyaW5nIHNjaGVtZSwKICAgICAgU3RyaW5nIHVzZXJJbmZvLAogICAgICBTdHJpbmcgaG9zdCwKICAgICAgaW50IHBvcnQsCiAgICAgIFN0cmluZyBwYXRoLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IHBhdGhTZWdtZW50cywKICAgICAgU3RyaW5nIHF1ZXJ5LAogICAgICBNYXA8U3RyaW5nLCBkeW5hbWljIC8qU3RyaW5nfEl0ZXJhYmxlPFN0cmluZz4qLyA+IHF1ZXJ5UGFyYW1ldGVycywKICAgICAgU3RyaW5nIGZyYWdtZW50fSkgewogICAgc2NoZW1lID0gX21ha2VTY2hlbWUoc2NoZW1lLCAwLCBfc3RyaW5nT3JOdWxsTGVuZ3RoKHNjaGVtZSkpOwogICAgdXNlckluZm8gPSBfbWFrZVVzZXJJbmZvKHVzZXJJbmZvLCAwLCBfc3RyaW5nT3JOdWxsTGVuZ3RoKHVzZXJJbmZvKSk7CiAgICBob3N0ID0gX21ha2VIb3N0KGhvc3QsIDAsIF9zdHJpbmdPck51bGxMZW5ndGgoaG9zdCksIGZhbHNlKTsKICAgIC8vIFNwZWNpYWwgY2FzZSB0aGlzIGNvbnN0cnVjdG9yIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgIGlmIChxdWVyeSA9PSAiIikgcXVlcnkgPSBudWxsOwogICAgcXVlcnkgPSBfbWFrZVF1ZXJ5KHF1ZXJ5LCAwLCBfc3RyaW5nT3JOdWxsTGVuZ3RoKHF1ZXJ5KSwgcXVlcnlQYXJhbWV0ZXJzKTsKICAgIGZyYWdtZW50ID0gX21ha2VGcmFnbWVudChmcmFnbWVudCwgMCwgX3N0cmluZ09yTnVsbExlbmd0aChmcmFnbWVudCkpOwogICAgcG9ydCA9IF9tYWtlUG9ydChwb3J0LCBzY2hlbWUpOwogICAgYm9vbCBpc0ZpbGUgPSAoc2NoZW1lID09ICJmaWxlIik7CiAgICBpZiAoaG9zdCA9PSBudWxsICYmICh1c2VySW5mby5pc05vdEVtcHR5IHx8IHBvcnQgIT0gbnVsbCB8fCBpc0ZpbGUpKSB7CiAgICAgIGhvc3QgPSAiIjsKICAgIH0KICAgIGJvb2wgaGFzQXV0aG9yaXR5ID0gKGhvc3QgIT0gbnVsbCk7CiAgICBwYXRoID0gX21ha2VQYXRoKAogICAgICAgIHBhdGgsIDAsIF9zdHJpbmdPck51bGxMZW5ndGgocGF0aCksIHBhdGhTZWdtZW50cywgc2NoZW1lLCBoYXNBdXRob3JpdHkpOwogICAgaWYgKHNjaGVtZS5pc0VtcHR5ICYmIGhvc3QgPT0gbnVsbCAmJiAhcGF0aC5zdGFydHNXaXRoKCcvJykpIHsKICAgICAgYm9vbCBhbGxvd1NjaGVtZSA9IHNjaGVtZS5pc05vdEVtcHR5IHx8IGhvc3QgIT0gbnVsbDsKICAgICAgcGF0aCA9IF9ub3JtYWxpemVSZWxhdGl2ZVBhdGgocGF0aCwgYWxsb3dTY2hlbWUpOwogICAgfSBlbHNlIHsKICAgICAgcGF0aCA9IF9yZW1vdmVEb3RTZWdtZW50cyhwYXRoKTsKICAgIH0KICAgIGlmIChob3N0ID09IG51bGwgJiYgcGF0aC5zdGFydHNXaXRoKCIvLyIpKSB7CiAgICAgIGhvc3QgPSAiIjsKICAgIH0KICAgIHJldHVybiBfVXJpLl9pbnRlcm5hbChzY2hlbWUsIHVzZXJJbmZvLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpOwogIH0KCiAgLy8vIEltcGxlbWVudGF0aW9uIG9mIFtVcmkuaHR0cF0uCiAgZmFjdG9yeSBfVXJpLmh0dHAoU3RyaW5nIGF1dGhvcml0eSwgU3RyaW5nIHVuZW5jb2RlZFBhdGgsCiAgICAgIFtNYXA8U3RyaW5nLCBTdHJpbmc+IHF1ZXJ5UGFyYW1ldGVyc10pIHsKICAgIHJldHVybiBfbWFrZUh0dHBVcmkoImh0dHAiLCBhdXRob3JpdHksIHVuZW5jb2RlZFBhdGgsIHF1ZXJ5UGFyYW1ldGVycyk7CiAgfQoKICAvLy8gSW1wbGVtZW50YXRpb24gb2YgW1VyaS5odHRwc10uCiAgZmFjdG9yeSBfVXJpLmh0dHBzKFN0cmluZyBhdXRob3JpdHksIFN0cmluZyB1bmVuY29kZWRQYXRoLAogICAgICBbTWFwPFN0cmluZywgU3RyaW5nPiBxdWVyeVBhcmFtZXRlcnNdKSB7CiAgICByZXR1cm4gX21ha2VIdHRwVXJpKCJodHRwcyIsIGF1dGhvcml0eSwgdW5lbmNvZGVkUGF0aCwgcXVlcnlQYXJhbWV0ZXJzKTsKICB9CgogIFN0cmluZyBnZXQgYXV0aG9yaXR5IHsKICAgIGlmICghaGFzQXV0aG9yaXR5KSByZXR1cm4gIiI7CiAgICB2YXIgc2IgPSBTdHJpbmdCdWZmZXIoKTsKICAgIF93cml0ZUF1dGhvcml0eShzYik7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIFN0cmluZyBnZXQgdXNlckluZm8gPT4gX3VzZXJJbmZvOwoKICBTdHJpbmcgZ2V0IGhvc3QgewogICAgaWYgKF9ob3N0ID09IG51bGwpIHJldHVybiAiIjsKICAgIGlmIChfaG9zdC5zdGFydHNXaXRoKCdbJykpIHsKICAgICAgcmV0dXJuIF9ob3N0LnN1YnN0cmluZygxLCBfaG9zdC5sZW5ndGggLSAxKTsKICAgIH0KICAgIHJldHVybiBfaG9zdDsKICB9CgogIGludCBnZXQgcG9ydCB7CiAgICBpZiAoX3BvcnQgPT0gbnVsbCkgcmV0dXJuIF9kZWZhdWx0UG9ydChzY2hlbWUpOwogICAgcmV0dXJuIF9wb3J0OwogIH0KCiAgLy8gVGhlIGRlZmF1bHQgcG9ydCBmb3IgdGhlIHNjaGVtZSBvZiB0aGlzIFVyaS4KICBzdGF0aWMgaW50IF9kZWZhdWx0UG9ydChTdHJpbmcgc2NoZW1lKSB7CiAgICBpZiAoc2NoZW1lID09ICJodHRwIikgcmV0dXJuIDgwOwogICAgaWYgKHNjaGVtZSA9PSAiaHR0cHMiKSByZXR1cm4gNDQzOwogICAgcmV0dXJuIDA7CiAgfQoKICBTdHJpbmcgZ2V0IHF1ZXJ5ID0+IF9xdWVyeSA/PyAiIjsKCiAgU3RyaW5nIGdldCBmcmFnbWVudCA9PiBfZnJhZ21lbnQgPz8gIiI7CgogIGJvb2wgaXNTY2hlbWUoU3RyaW5nIHNjaGVtZSkgewogICAgU3RyaW5nIHRoaXNTY2hlbWUgPSB0aGlzLnNjaGVtZTsKICAgIGlmIChzY2hlbWUgPT0gbnVsbCkgcmV0dXJuIHRoaXNTY2hlbWUuaXNFbXB0eTsKICAgIGlmIChzY2hlbWUubGVuZ3RoICE9IHRoaXNTY2hlbWUubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX2NvbXBhcmVTY2hlbWUoc2NoZW1lLCB0aGlzU2NoZW1lKTsKICB9CgogIC8vLyBDb21wYXJlcyBzY2hlbWUgY2hhcmFjdGVycyBpbiBbc2NoZW1lXSBhbmQgYXQgdGhlIHN0YXJ0IG9mIFt1cmldLgogIC8vLwogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbc2NoZW1lXSByZXByZXNlbnRzIHRoZSBzYW1lIHNjaGVtZSBhcyB0aGUgc3RhcnQgb2YKICAvLy8gW3VyaV0uIFRoYXQgbWVhbnMgaGF2aW5nIHRoZSBzYW1lIGNoYXJhY3RlcnMsIGJ1dCBwb3NzaWJseSBkaWZmZXJlbnQgY2FzZQogIC8vLyBmb3IgbGV0dGVycy4KICAvLy8KICAvLy8gVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIHRoYXQgdGhlIGNoYXJhY3RlcnMgYXJlIHZhbGlkIFVSSSBzY2hlbWUKICAvLy8gY2hhcmFjdGVycy4gVGhlIFt1cmldIGlzIGFzc3VtZWQgdG8gYmUgdmFsaWQsIHNvIGlmIFtzY2hlbWVdIG1hdGNoZXMKICAvLy8gaXQsIGl0IGhhcyB0byBiZSB2YWxpZCB0b28uCiAgLy8vCiAgLy8vIFRoZSBsZW5ndGggc2hvdWxkIGJlIHRlc3RlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLAogIC8vLyBzbyB0aGUgc2NoZW1lIHBhcnQgb2YgW3VyaV0gaXMga25vd24gdG8gaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgW3NjaGVtZV0uCiAgc3RhdGljIGJvb2wgX2NvbXBhcmVTY2hlbWUoU3RyaW5nIHNjaGVtZSwgU3RyaW5nIHVyaSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWUubGVuZ3RoOyBpKyspIHsKICAgICAgaW50IHNjaGVtZUNoYXIgPSBzY2hlbWUuY29kZVVuaXRBdChpKTsKICAgICAgaW50IHVyaUNoYXIgPSB1cmkuY29kZVVuaXRBdChpKTsKICAgICAgaW50IGRlbHRhID0gc2NoZW1lQ2hhciBeIHVyaUNoYXI7CiAgICAgIGlmIChkZWx0YSAhPSAwKSB7CiAgICAgICAgaWYgKGRlbHRhID09IDB4MjApIHsKICAgICAgICAgIC8vIE1pZ2h0IGJlIGEgY2FzZSBkaWZmZXJlbmNlLgogICAgICAgICAgaW50IGxvd2VyQ2hhciA9IHVyaUNoYXIgfCBkZWx0YTsKICAgICAgICAgIGlmICgweDYxIC8qYSovIDw9IGxvd2VyQ2hhciAmJiBsb3dlckNoYXIgPD0gMHg3YSAvKnoqLykgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vIFJlcG9ydCBhIHBhcnNlIGZhaWx1cmUuCiAgc3RhdGljIHZvaWQgX2ZhaWwoU3RyaW5nIHVyaSwgaW50IGluZGV4LCBTdHJpbmcgbWVzc2FnZSkgewogICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKG1lc3NhZ2UsIHVyaSwgaW5kZXgpOwogIH0KCiAgc3RhdGljIFVyaSBfbWFrZUh0dHBVcmkoU3RyaW5nIHNjaGVtZSwgU3RyaW5nIGF1dGhvcml0eSwgU3RyaW5nIHVuZW5jb2RlZFBhdGgsCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcXVlcnlQYXJhbWV0ZXJzKSB7CiAgICB2YXIgdXNlckluZm8gPSAiIjsKICAgIFN0cmluZyBob3N0OwogICAgaW50IHBvcnQ7CgogICAgaWYgKGF1dGhvcml0eSAhPSBudWxsICYmIGF1dGhvcml0eS5pc05vdEVtcHR5KSB7CiAgICAgIHZhciBob3N0U3RhcnQgPSAwOwogICAgICAvLyBTcGxpdCBvZmYgdGhlIHVzZXIgaW5mby4KICAgICAgYm9vbCBoYXNVc2VySW5mbyA9IGZhbHNlOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF1dGhvcml0eS5sZW5ndGg7IGkrKykgewogICAgICAgIGNvbnN0IGludCBhdFNpZ24gPSAweDQwOwogICAgICAgIGlmIChhdXRob3JpdHkuY29kZVVuaXRBdChpKSA9PSBhdFNpZ24pIHsKICAgICAgICAgIGhhc1VzZXJJbmZvID0gdHJ1ZTsKICAgICAgICAgIHVzZXJJbmZvID0gYXV0aG9yaXR5LnN1YnN0cmluZygwLCBpKTsKICAgICAgICAgIGhvc3RTdGFydCA9IGkgKyAxOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBob3N0RW5kID0gaG9zdFN0YXJ0OwogICAgICBpZiAoaG9zdFN0YXJ0IDwgYXV0aG9yaXR5Lmxlbmd0aCAmJgogICAgICAgICAgYXV0aG9yaXR5LmNvZGVVbml0QXQoaG9zdFN0YXJ0KSA9PSBfTEVGVF9CUkFDS0VUKSB7CiAgICAgICAgLy8gSVB2NiBob3N0LgogICAgICAgIGludCBlc2NhcGVGb3Jab25lSUQgPSAtMTsKICAgICAgICBmb3IgKDsgaG9zdEVuZCA8IGF1dGhvcml0eS5sZW5ndGg7IGhvc3RFbmQrKykgewogICAgICAgICAgaW50IGNoYXIgPSBhdXRob3JpdHkuY29kZVVuaXRBdChob3N0RW5kKTsKICAgICAgICAgIGlmIChjaGFyID09IF9QRVJDRU5UICYmIGVzY2FwZUZvclpvbmVJRCA8IDApIHsKICAgICAgICAgICAgZXNjYXBlRm9yWm9uZUlEID0gaG9zdEVuZDsKICAgICAgICAgICAgaWYgKGF1dGhvcml0eS5zdGFydHNXaXRoKCIyNSIsIGhvc3RFbmQgKyAxKSkgewogICAgICAgICAgICAgIGhvc3RFbmQgKz0gMjsgLy8gTWlnaHQgYXMgd2VsbCBza2lwIHRoZSBhbHJlYWR5IGNoZWNrZWQgZXNjYXBlLgogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gX1JJR0hUX0JSQUNLRVQpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChob3N0RW5kID09IGF1dGhvcml0eS5sZW5ndGgpIHsKICAgICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICAgICAiSW52YWxpZCBJUHY2IGhvc3QgZW50cnkuIiwgYXV0aG9yaXR5LCBob3N0U3RhcnQpOwogICAgICAgIH0KICAgICAgICBVcmkucGFyc2VJUHY2QWRkcmVzcyhhdXRob3JpdHksIGhvc3RTdGFydCArIDEsCiAgICAgICAgICAgIChlc2NhcGVGb3Jab25lSUQgPCAwKSA/IGhvc3RFbmQgOiBlc2NhcGVGb3Jab25lSUQpOwogICAgICAgIGhvc3RFbmQrKzsgLy8gU2tpcCB0aGUgY2xvc2luZyBicmFja2V0LgogICAgICAgIGlmIChob3N0RW5kICE9IGF1dGhvcml0eS5sZW5ndGggJiYKICAgICAgICAgICAgYXV0aG9yaXR5LmNvZGVVbml0QXQoaG9zdEVuZCkgIT0gX0NPTE9OKSB7CiAgICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgZW5kIG9mIGF1dGhvcml0eSIsIGF1dGhvcml0eSwgaG9zdEVuZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFNwbGl0IGhvc3QgYW5kIHBvcnQuCiAgICAgIGJvb2wgaGFzUG9ydCA9IGZhbHNlOwogICAgICBmb3IgKDsgaG9zdEVuZCA8IGF1dGhvcml0eS5sZW5ndGg7IGhvc3RFbmQrKykgewogICAgICAgIGlmIChhdXRob3JpdHkuY29kZVVuaXRBdChob3N0RW5kKSA9PSBfQ09MT04pIHsKICAgICAgICAgIHZhciBwb3J0U3RyaW5nID0gYXV0aG9yaXR5LnN1YnN0cmluZyhob3N0RW5kICsgMSk7CiAgICAgICAgICAvLyBXZSBhbGxvdyB0aGUgZW1wdHkgcG9ydCAtIGZhbGxpbmcgYmFjayB0byBpbml0aWFsIHZhbHVlLgogICAgICAgICAgaWYgKHBvcnRTdHJpbmcuaXNOb3RFbXB0eSkgcG9ydCA9IGludC5wYXJzZShwb3J0U3RyaW5nKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBob3N0ID0gYXV0aG9yaXR5LnN1YnN0cmluZyhob3N0U3RhcnQsIGhvc3RFbmQpOwogICAgfQogICAgcmV0dXJuIFVyaSgKICAgICAgICBzY2hlbWU6IHNjaGVtZSwKICAgICAgICB1c2VySW5mbzogdXNlckluZm8sCiAgICAgICAgaG9zdDogaG9zdCwKICAgICAgICBwb3J0OiBwb3J0LAogICAgICAgIHBhdGhTZWdtZW50czogdW5lbmNvZGVkUGF0aC5zcGxpdCgiLyIpLAogICAgICAgIHF1ZXJ5UGFyYW1ldGVyczogcXVlcnlQYXJhbWV0ZXJzKTsKICB9CgogIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbVXJpLmZpbGVdLgogIGZhY3RvcnkgX1VyaS5maWxlKFN0cmluZyBwYXRoLCB7Ym9vbCB3aW5kb3dzfSkgewogICAgd2luZG93cyA9ICh3aW5kb3dzID09IG51bGwpID8gX1VyaS5faXNXaW5kb3dzIDogd2luZG93czsKICAgIHJldHVybiB3aW5kb3dzCiAgICAgICAgPyBfbWFrZVdpbmRvd3NGaWxlVXJsKHBhdGgsIGZhbHNlKQogICAgICAgIDogX21ha2VGaWxlVXJpKHBhdGgsIGZhbHNlKTsKICB9CgogIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbVXJpLmRpcmVjdG9yeV0uCiAgZmFjdG9yeSBfVXJpLmRpcmVjdG9yeShTdHJpbmcgcGF0aCwge2Jvb2wgd2luZG93c30pIHsKICAgIHdpbmRvd3MgPSAod2luZG93cyA9PSBudWxsKSA/IF9VcmkuX2lzV2luZG93cyA6IHdpbmRvd3M7CiAgICByZXR1cm4gd2luZG93cyA/IF9tYWtlV2luZG93c0ZpbGVVcmwocGF0aCwgdHJ1ZSkgOiBfbWFrZUZpbGVVcmkocGF0aCwgdHJ1ZSk7CiAgfQoKICAvLy8gVXNlZCBpbnRlcm5hbGx5IGluIHBhdGgtcmVsYXRlZCBjb25zdHJ1Y3RvcnMuCiAgZXh0ZXJuYWwgc3RhdGljIGJvb2wgZ2V0IF9pc1dpbmRvd3M7CgogIHN0YXRpYyBfY2hlY2tOb25XaW5kb3dzUGF0aFJlc2VydmVkQ2hhcmFjdGVycygKICAgICAgTGlzdDxTdHJpbmc+IHNlZ21lbnRzLCBib29sIGFyZ3VtZW50RXJyb3IpIHsKICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZ21lbnQpIHsKICAgICAgaWYgKHNlZ21lbnQuY29udGFpbnMoIi8iKSkgewogICAgICAgIGlmIChhcmd1bWVudEVycm9yKSB7CiAgICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCJJbGxlZ2FsIHBhdGggY2hhcmFjdGVyICRzZWdtZW50Iik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIklsbGVnYWwgcGF0aCBjaGFyYWN0ZXIgJHNlZ21lbnQiKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgc3RhdGljIF9jaGVja1dpbmRvd3NQYXRoUmVzZXJ2ZWRDaGFyYWN0ZXJzKAogICAgICBMaXN0PFN0cmluZz4gc2VnbWVudHMsIGJvb2wgYXJndW1lbnRFcnJvciwKICAgICAgW2ludCBmaXJzdFNlZ21lbnQgPSAwXSkgewogICAgZm9yICh2YXIgc2VnbWVudCBpbiBzZWdtZW50cy5za2lwKGZpcnN0U2VnbWVudCkpIHsKICAgICAgaWYgKHNlZ21lbnQuY29udGFpbnMoUmVnRXhwKHInWyIqLzo8Pj9cXHxdJykpKSB7CiAgICAgICAgaWYgKGFyZ3VtZW50RXJyb3IpIHsKICAgICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoIklsbGVnYWwgY2hhcmFjdGVyIGluIHBhdGgiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigiSWxsZWdhbCBjaGFyYWN0ZXIgaW4gcGF0aDogJHNlZ21lbnQiKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHN0YXRpYyBfY2hlY2tXaW5kb3dzRHJpdmVMZXR0ZXIoaW50IGNoYXJDb2RlLCBib29sIGFyZ3VtZW50RXJyb3IpIHsKICAgIGlmICgoX1VQUEVSX0NBU0VfQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBfVVBQRVJfQ0FTRV9aKSB8fAogICAgICAgIChfTE9XRVJfQ0FTRV9BIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IF9MT1dFUl9DQVNFX1opKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChhcmd1bWVudEVycm9yKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAiSWxsZWdhbCBkcml2ZSBsZXR0ZXIgIiArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiSWxsZWdhbCBkcml2ZSBsZXR0ZXIgIiArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpKTsKICAgIH0KICB9CgogIHN0YXRpYyBfbWFrZUZpbGVVcmkoU3RyaW5nIHBhdGgsIGJvb2wgc2xhc2hUZXJtaW5hdGVkKSB7CiAgICBjb25zdCBTdHJpbmcgc2VwID0gIi8iOwogICAgdmFyIHNlZ21lbnRzID0gcGF0aC5zcGxpdChzZXApOwogICAgaWYgKHNsYXNoVGVybWluYXRlZCAmJiBzZWdtZW50cy5pc05vdEVtcHR5ICYmIHNlZ21lbnRzLmxhc3QuaXNOb3RFbXB0eSkgewogICAgICBzZWdtZW50cy5hZGQoIiIpOyAvLyBFeHRyYSBzZXBhcmF0b3IgYXQgZW5kLgogICAgfQogICAgaWYgKHBhdGguc3RhcnRzV2l0aChzZXApKSB7CiAgICAgIC8vIEFic29sdXRlIGZpbGU6Ly8gVVJJLgogICAgICByZXR1cm4gVXJpKHNjaGVtZTogImZpbGUiLCBwYXRoU2VnbWVudHM6IHNlZ21lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFJlbGF0aXZlIFVSSS4KICAgICAgcmV0dXJuIFVyaShwYXRoU2VnbWVudHM6IHNlZ21lbnRzKTsKICAgIH0KICB9CgogIHN0YXRpYyBfbWFrZVdpbmRvd3NGaWxlVXJsKFN0cmluZyBwYXRoLCBib29sIHNsYXNoVGVybWluYXRlZCkgewogICAgaWYgKHBhdGguc3RhcnRzV2l0aChyIlxcP1wiKSkgewogICAgICBpZiAocGF0aC5zdGFydHNXaXRoKHIiVU5DXCIsIDQpKSB7CiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZVJhbmdlKDAsIDcsIHInXCcpOwogICAgICB9IGVsc2UgewogICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyg0KTsKICAgICAgICBpZiAocGF0aC5sZW5ndGggPCAzIHx8CiAgICAgICAgICAgIHBhdGguY29kZVVuaXRBdCgxKSAhPSBfQ09MT04gfHwKICAgICAgICAgICAgcGF0aC5jb2RlVW5pdEF0KDIpICE9IF9CQUNLU0xBU0gpIHsKICAgICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAgICAgciJXaW5kb3dzIHBhdGhzIHdpdGggXFw/XCBwcmVmaXggbXVzdCBiZSBhYnNvbHV0ZSIpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZUFsbCgiLyIsIHInXCcpOwogICAgfQogICAgY29uc3QgU3RyaW5nIHNlcCA9IHInXCc7CiAgICBpZiAocGF0aC5sZW5ndGggPiAxICYmIHBhdGguY29kZVVuaXRBdCgxKSA9PSBfQ09MT04pIHsKICAgICAgX2NoZWNrV2luZG93c0RyaXZlTGV0dGVyKHBhdGguY29kZVVuaXRBdCgwKSwgdHJ1ZSk7CiAgICAgIGlmIChwYXRoLmxlbmd0aCA9PSAyIHx8IHBhdGguY29kZVVuaXRBdCgyKSAhPSBfQkFDS1NMQVNIKSB7CiAgICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigiV2luZG93cyBwYXRocyB3aXRoIGRyaXZlIGxldHRlciBtdXN0IGJlIGFic29sdXRlIik7CiAgICAgIH0KICAgICAgLy8gQWJzb2x1dGUgZmlsZTovL0M6LyBVUkkuCiAgICAgIHZhciBwYXRoU2VnbWVudHMgPSBwYXRoLnNwbGl0KHNlcCk7CiAgICAgIGlmIChzbGFzaFRlcm1pbmF0ZWQgJiYgcGF0aFNlZ21lbnRzLmxhc3QuaXNOb3RFbXB0eSkgewogICAgICAgIHBhdGhTZWdtZW50cy5hZGQoIiIpOyAvLyBFeHRyYSBzZXBhcmF0b3IgYXQgZW5kLgogICAgICB9CiAgICAgIF9jaGVja1dpbmRvd3NQYXRoUmVzZXJ2ZWRDaGFyYWN0ZXJzKHBhdGhTZWdtZW50cywgdHJ1ZSwgMSk7CiAgICAgIHJldHVybiBVcmkoc2NoZW1lOiAiZmlsZSIsIHBhdGhTZWdtZW50czogcGF0aFNlZ21lbnRzKTsKICAgIH0KCiAgICBpZiAocGF0aC5zdGFydHNXaXRoKHNlcCkpIHsKICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChzZXAsIDEpKSB7CiAgICAgICAgLy8gQWJzb2x1dGUgZmlsZTovLyBVUkkgd2l0aCBob3N0LgogICAgICAgIGludCBwYXRoU3RhcnQgPSBwYXRoLmluZGV4T2YocidcJywgMik7CiAgICAgICAgU3RyaW5nIGhvc3RQYXJ0ID0KICAgICAgICAgICAgKHBhdGhTdGFydCA8IDApID8gcGF0aC5zdWJzdHJpbmcoMikgOiBwYXRoLnN1YnN0cmluZygyLCBwYXRoU3RhcnQpOwogICAgICAgIFN0cmluZyBwYXRoUGFydCA9IChwYXRoU3RhcnQgPCAwKSA/ICIiIDogcGF0aC5zdWJzdHJpbmcocGF0aFN0YXJ0ICsgMSk7CiAgICAgICAgdmFyIHBhdGhTZWdtZW50cyA9IHBhdGhQYXJ0LnNwbGl0KHNlcCk7CiAgICAgICAgX2NoZWNrV2luZG93c1BhdGhSZXNlcnZlZENoYXJhY3RlcnMocGF0aFNlZ21lbnRzLCB0cnVlKTsKICAgICAgICBpZiAoc2xhc2hUZXJtaW5hdGVkICYmIHBhdGhTZWdtZW50cy5sYXN0LmlzTm90RW1wdHkpIHsKICAgICAgICAgIHBhdGhTZWdtZW50cy5hZGQoIiIpOyAvLyBFeHRyYSBzZXBhcmF0b3IgYXQgZW5kLgogICAgICAgIH0KICAgICAgICByZXR1cm4gVXJpKHNjaGVtZTogImZpbGUiLCBob3N0OiBob3N0UGFydCwgcGF0aFNlZ21lbnRzOiBwYXRoU2VnbWVudHMpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEFic29sdXRlIGZpbGU6Ly8gVVJJLgogICAgICAgIHZhciBwYXRoU2VnbWVudHMgPSBwYXRoLnNwbGl0KHNlcCk7CiAgICAgICAgaWYgKHNsYXNoVGVybWluYXRlZCAmJiBwYXRoU2VnbWVudHMubGFzdC5pc05vdEVtcHR5KSB7CiAgICAgICAgICBwYXRoU2VnbWVudHMuYWRkKCIiKTsgLy8gRXh0cmEgc2VwYXJhdG9yIGF0IGVuZC4KICAgICAgICB9CiAgICAgICAgX2NoZWNrV2luZG93c1BhdGhSZXNlcnZlZENoYXJhY3RlcnMocGF0aFNlZ21lbnRzLCB0cnVlKTsKICAgICAgICByZXR1cm4gVXJpKHNjaGVtZTogImZpbGUiLCBwYXRoU2VnbWVudHM6IHBhdGhTZWdtZW50cyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIFJlbGF0aXZlIFVSSS4KICAgICAgdmFyIHBhdGhTZWdtZW50cyA9IHBhdGguc3BsaXQoc2VwKTsKICAgICAgX2NoZWNrV2luZG93c1BhdGhSZXNlcnZlZENoYXJhY3RlcnMocGF0aFNlZ21lbnRzLCB0cnVlKTsKICAgICAgaWYgKHNsYXNoVGVybWluYXRlZCAmJgogICAgICAgICAgcGF0aFNlZ21lbnRzLmlzTm90RW1wdHkgJiYKICAgICAgICAgIHBhdGhTZWdtZW50cy5sYXN0LmlzTm90RW1wdHkpIHsKICAgICAgICBwYXRoU2VnbWVudHMuYWRkKCIiKTsgLy8gRXh0cmEgc2VwYXJhdG9yIGF0IGVuZC4KICAgICAgfQogICAgICByZXR1cm4gVXJpKHBhdGhTZWdtZW50czogcGF0aFNlZ21lbnRzKTsKICAgIH0KICB9CgogIFVyaSByZXBsYWNlKAogICAgICB7U3RyaW5nIHNjaGVtZSwKICAgICAgU3RyaW5nIHVzZXJJbmZvLAogICAgICBTdHJpbmcgaG9zdCwKICAgICAgaW50IHBvcnQsCiAgICAgIFN0cmluZyBwYXRoLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IHBhdGhTZWdtZW50cywKICAgICAgU3RyaW5nIHF1ZXJ5LAogICAgICBNYXA8U3RyaW5nLCBkeW5hbWljIC8qU3RyaW5nfEl0ZXJhYmxlPFN0cmluZz4qLyA+IHF1ZXJ5UGFyYW1ldGVycywKICAgICAgU3RyaW5nIGZyYWdtZW50fSkgewogICAgLy8gU2V0IHRvIHRydWUgaWYgdGhlIHNjaGVtZSBoYXMgKHBvdGVudGlhbGx5KSBjaGFuZ2VkLgogICAgLy8gSW4gdGhhdCBjYXNlLCB0aGUgZGVmYXVsdCBwb3J0IG1heSBhbHNvIGhhdmUgY2hhbmdlZCBhbmQgd2UgbmVlZAogICAgLy8gdG8gY2hlY2sgZXZlbiB0aGUgZXhpc3RpbmcgcG9ydC4KICAgIGJvb2wgc2NoZW1lQ2hhbmdlZCA9IGZhbHNlOwogICAgaWYgKHNjaGVtZSAhPSBudWxsKSB7CiAgICAgIHNjaGVtZSA9IF9tYWtlU2NoZW1lKHNjaGVtZSwgMCwgc2NoZW1lLmxlbmd0aCk7CiAgICAgIHNjaGVtZUNoYW5nZWQgPSAoc2NoZW1lICE9IHRoaXMuc2NoZW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHNjaGVtZSA9IHRoaXMuc2NoZW1lOwogICAgfQogICAgYm9vbCBpc0ZpbGUgPSAoc2NoZW1lID09ICJmaWxlIik7CiAgICBpZiAodXNlckluZm8gIT0gbnVsbCkgewogICAgICB1c2VySW5mbyA9IF9tYWtlVXNlckluZm8odXNlckluZm8sIDAsIHVzZXJJbmZvLmxlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICB1c2VySW5mbyA9IHRoaXMuX3VzZXJJbmZvOwogICAgfQogICAgaWYgKHBvcnQgIT0gbnVsbCkgewogICAgICBwb3J0ID0gX21ha2VQb3J0KHBvcnQsIHNjaGVtZSk7CiAgICB9IGVsc2UgewogICAgICBwb3J0ID0gdGhpcy5fcG9ydDsKICAgICAgaWYgKHNjaGVtZUNoYW5nZWQpIHsKICAgICAgICAvLyBUaGUgZGVmYXVsdCBwb3J0IG1pZ2h0IGhhdmUgY2hhbmdlZC4KICAgICAgICBwb3J0ID0gX21ha2VQb3J0KHBvcnQsIHNjaGVtZSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChob3N0ICE9IG51bGwpIHsKICAgICAgaG9zdCA9IF9tYWtlSG9zdChob3N0LCAwLCBob3N0Lmxlbmd0aCwgZmFsc2UpOwogICAgfSBlbHNlIGlmICh0aGlzLmhhc0F1dGhvcml0eSkgewogICAgICBob3N0ID0gdGhpcy5faG9zdDsKICAgIH0gZWxzZSBpZiAodXNlckluZm8uaXNOb3RFbXB0eSB8fCBwb3J0ICE9IG51bGwgfHwgaXNGaWxlKSB7CiAgICAgIGhvc3QgPSAiIjsKICAgIH0KCiAgICBib29sIGhhc0F1dGhvcml0eSA9IGhvc3QgIT0gbnVsbDsKICAgIGlmIChwYXRoICE9IG51bGwgfHwgcGF0aFNlZ21lbnRzICE9IG51bGwpIHsKICAgICAgcGF0aCA9IF9tYWtlUGF0aChwYXRoLCAwLCBfc3RyaW5nT3JOdWxsTGVuZ3RoKHBhdGgpLCBwYXRoU2VnbWVudHMsIHNjaGVtZSwKICAgICAgICAgIGhhc0F1dGhvcml0eSk7CiAgICB9IGVsc2UgewogICAgICBwYXRoID0gdGhpcy5wYXRoOwogICAgICBpZiAoKGlzRmlsZSB8fCAoaGFzQXV0aG9yaXR5ICYmICFwYXRoLmlzRW1wdHkpKSAmJgogICAgICAgICAgIXBhdGguc3RhcnRzV2l0aCgnLycpKSB7CiAgICAgICAgcGF0aCA9ICIvIiArIHBhdGg7CiAgICAgIH0KICAgIH0KCiAgICBpZiAocXVlcnkgIT0gbnVsbCB8fCBxdWVyeVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBxdWVyeSA9IF9tYWtlUXVlcnkocXVlcnksIDAsIF9zdHJpbmdPck51bGxMZW5ndGgocXVlcnkpLCBxdWVyeVBhcmFtZXRlcnMpOwogICAgfSBlbHNlIHsKICAgICAgcXVlcnkgPSB0aGlzLl9xdWVyeTsKICAgIH0KCiAgICBpZiAoZnJhZ21lbnQgIT0gbnVsbCkgewogICAgICBmcmFnbWVudCA9IF9tYWtlRnJhZ21lbnQoZnJhZ21lbnQsIDAsIGZyYWdtZW50Lmxlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICBmcmFnbWVudCA9IHRoaXMuX2ZyYWdtZW50OwogICAgfQoKICAgIHJldHVybiBfVXJpLl9pbnRlcm5hbChzY2hlbWUsIHVzZXJJbmZvLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpOwogIH0KCiAgVXJpIHJlbW92ZUZyYWdtZW50KCkgewogICAgaWYgKCF0aGlzLmhhc0ZyYWdtZW50KSByZXR1cm4gdGhpczsKICAgIHJldHVybiBfVXJpLl9pbnRlcm5hbChzY2hlbWUsIF91c2VySW5mbywgX2hvc3QsIF9wb3J0LCBwYXRoLCBfcXVlcnksIG51bGwpOwogIH0KCiAgTGlzdDxTdHJpbmc+IGdldCBwYXRoU2VnbWVudHMgewogICAgdmFyIHJlc3VsdCA9IF9wYXRoU2VnbWVudHM7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CgogICAgdmFyIHBhdGhUb1NwbGl0ID0gcGF0aDsKICAgIGlmIChwYXRoVG9TcGxpdC5pc05vdEVtcHR5ICYmIHBhdGhUb1NwbGl0LmNvZGVVbml0QXQoMCkgPT0gX1NMQVNIKSB7CiAgICAgIHBhdGhUb1NwbGl0ID0gcGF0aFRvU3BsaXQuc3Vic3RyaW5nKDEpOwogICAgfQogICAgcmVzdWx0ID0gKHBhdGhUb1NwbGl0ID09ICIiKQogICAgICAgID8gY29uc3QgPFN0cmluZz5bXQogICAgICAgIDogTGlzdDxTdHJpbmc+LnVubW9kaWZpYWJsZSgKICAgICAgICAgICAgcGF0aFRvU3BsaXQuc3BsaXQoIi8iKS5tYXAoVXJpLmRlY29kZUNvbXBvbmVudCkpOwogICAgX3BhdGhTZWdtZW50cyA9IHJlc3VsdDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldCBxdWVyeVBhcmFtZXRlcnMgewogICAgX3F1ZXJ5UGFyYW1ldGVycyA/Pz0KICAgICAgICBVbm1vZGlmaWFibGVNYXBWaWV3PFN0cmluZywgU3RyaW5nPihVcmkuc3BsaXRRdWVyeVN0cmluZyhxdWVyeSkpOwogICAgcmV0dXJuIF9xdWVyeVBhcmFtZXRlcnM7CiAgfQoKICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldCBxdWVyeVBhcmFtZXRlcnNBbGwgewogICAgaWYgKF9xdWVyeVBhcmFtZXRlckxpc3RzID09IG51bGwpIHsKICAgICAgTWFwIHF1ZXJ5UGFyYW1ldGVyTGlzdHMgPSBfc3BsaXRRdWVyeVN0cmluZ0FsbChxdWVyeSk7CiAgICAgIGZvciAodmFyIGtleSBpbiBxdWVyeVBhcmFtZXRlckxpc3RzLmtleXMpIHsKICAgICAgICBxdWVyeVBhcmFtZXRlckxpc3RzW2tleV0gPQogICAgICAgICAgICBMaXN0PFN0cmluZz4udW5tb2RpZmlhYmxlKHF1ZXJ5UGFyYW1ldGVyTGlzdHNba2V5XSk7CiAgICAgIH0KICAgICAgX3F1ZXJ5UGFyYW1ldGVyTGlzdHMgPQogICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+Pi51bm1vZGlmaWFibGUocXVlcnlQYXJhbWV0ZXJMaXN0cyk7CiAgICB9CiAgICByZXR1cm4gX3F1ZXJ5UGFyYW1ldGVyTGlzdHM7CiAgfQoKICBVcmkgbm9ybWFsaXplUGF0aCgpIHsKICAgIFN0cmluZyBwYXRoID0gX25vcm1hbGl6ZVBhdGgodGhpcy5wYXRoLCBzY2hlbWUsIGhhc0F1dGhvcml0eSk7CiAgICBpZiAoaWRlbnRpY2FsKHBhdGgsIHRoaXMucGF0aCkpIHJldHVybiB0aGlzOwogICAgcmV0dXJuIHRoaXMucmVwbGFjZShwYXRoOiBwYXRoKTsKICB9CgogIHN0YXRpYyBpbnQgX21ha2VQb3J0KGludCBwb3J0LCBTdHJpbmcgc2NoZW1lKSB7CiAgICAvLyBQZXJmb3JtIHNjaGVtZSBzcGVjaWZpYyBub3JtYWxpemF0aW9uLgogICAgaWYgKHBvcnQgIT0gbnVsbCAmJiBwb3J0ID09IF9kZWZhdWx0UG9ydChzY2hlbWUpKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBwb3J0OwogIH0KCiAgLyoqCiAgICogQ2hlY2sgYW5kIG5vcm1hbGl6ZSBhIGhvc3QgbmFtZS4KICAgKgogICAqIElmIHRoZSBob3N0IG5hbWUgc3RhcnRzIGFuZCBlbmRzIHdpdGggJ1snIGFuZCAnXScsIGl0IGlzIGNvbnNpZGVyZWQgYW4KICAgKiBJUHY2IGFkZHJlc3MuIElmIFtzdHJpY3RJUHY2XSBpcyBmYWxzZSwgdGhlIGFkZHJlc3MgaXMgYWxzbyBjb25zaWRlcmVkCiAgICogYW4gSVB2NiBhZGRyZXNzIGlmIGl0IGNvbnRhaW5zIGFueSAnOicgY2hhcmFjdGVyLgogICAqCiAgICogSWYgaXQgaXMgbm90IGFuIElQdjYgYWRkcmVzcywgaXQgaXMgY2FzZS0gYW5kIGVzY2FwZS1ub3JtYWxpemVkLgogICAqIFRoaXMgZXNjYXBlcyBhbGwgY2hhcmFjdGVycyBub3QgdmFsaWQgaW4gYSByZWctbmFtZSwKICAgKiBhbmQgY29udmVydHMgYWxsIG5vbi1lc2NhcGUgdXBwZXItY2FzZSBsZXR0ZXJzIHRvIGxvd2VyLWNhc2UuCiAgICovCiAgc3RhdGljIFN0cmluZyBfbWFrZUhvc3QoU3RyaW5nIGhvc3QsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBzdHJpY3RJUHY2KSB7CiAgICAvLyBUT0RPKGxybik6IFNob3VsZCB3ZSBub3JtYWxpemUgSVB2NiBhZGRyZXNzZXMgYWNjb3JkaW5nIHRvIFJGQyA1OTUyPwogICAgaWYgKGhvc3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gIiI7CiAgICAvLyBIb3N0IGlzIGFuIElQdjYgYWRkcmVzcyBpZiBpdCBzdGFydHMgd2l0aCAnWycgb3IgY29udGFpbnMgYSBjb2xvbi4KICAgIGlmIChob3N0LmNvZGVVbml0QXQoc3RhcnQpID09IF9MRUZUX0JSQUNLRVQpIHsKICAgICAgaWYgKGhvc3QuY29kZVVuaXRBdChlbmQgLSAxKSAhPSBfUklHSFRfQlJBQ0tFVCkgewogICAgICAgIF9mYWlsKGhvc3QsIHN0YXJ0LCAnTWlzc2luZyBlbmQgYF1gIHRvIG1hdGNoIGBbYCBpbiBob3N0Jyk7CiAgICAgIH0KICAgICAgU3RyaW5nIHpvbmVJRCA9ICIiOwogICAgICBpbnQgaW5kZXggPSBfY2hlY2tab25lSUQoaG9zdCwgc3RhcnQgKyAxLCBlbmQgLSAxKTsKICAgICAgaWYgKGluZGV4IDwgZW5kIC0gMSkgewogICAgICAgIGludCB6b25lSURzdGFydCA9CiAgICAgICAgICAgIChob3N0LnN0YXJ0c1dpdGgoIjI1IiwgaW5kZXggKyAxKSkgPyBpbmRleCArIDMgOiBpbmRleCArIDE7CiAgICAgICAgem9uZUlEID0gX25vcm1hbGl6ZVpvbmVJRChob3N0LCB6b25lSURzdGFydCwgZW5kIC0gMSwgIiUyNSIpOwogICAgICB9CiAgICAgIFVyaS5wYXJzZUlQdjZBZGRyZXNzKGhvc3QsIHN0YXJ0ICsgMSwgaW5kZXgpOwogICAgICAvLyBSRkMgNTk1MiByZXF1aXJlcyBoZXggZGlnaXRzIHRvIGJlIGxvd2VyIGNhc2UuCiAgICAgIHJldHVybiBob3N0LnN1YnN0cmluZyhzdGFydCwgaW5kZXgpLnRvTG93ZXJDYXNlKCkgKyB6b25lSUQgKyAnXSc7CiAgICB9CiAgICBpZiAoIXN0cmljdElQdjYpIHsKICAgICAgLy8gVE9ETyhscm4pOiBza2lwIGlmIHRvbyBzaG9ydCB0byBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcz8KICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICBpZiAoaG9zdC5jb2RlVW5pdEF0KGkpID09IF9DT0xPTikgewogICAgICAgICAgU3RyaW5nIHpvbmVJRCA9ICIiOwogICAgICAgICAgaW50IGluZGV4ID0gX2NoZWNrWm9uZUlEKGhvc3QsIHN0YXJ0LCBlbmQpOwogICAgICAgICAgaWYgKGluZGV4IDwgZW5kKSB7CiAgICAgICAgICAgIGludCB6b25lSURzdGFydCA9CiAgICAgICAgICAgICAgICAoaG9zdC5zdGFydHNXaXRoKCIyNSIsIGluZGV4ICsgMSkpID8gaW5kZXggKyAzIDogaW5kZXggKyAxOwogICAgICAgICAgICB6b25lSUQgPSBfbm9ybWFsaXplWm9uZUlEKGhvc3QsIHpvbmVJRHN0YXJ0LCBlbmQsICIlMjUiKTsKICAgICAgICAgIH0KICAgICAgICAgIFVyaS5wYXJzZUlQdjZBZGRyZXNzKGhvc3QsIHN0YXJ0LCBpbmRleCk7CiAgICAgICAgICByZXR1cm4gJ1ske2hvc3Quc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCl9JyArIHpvbmVJRCArICddJzsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfbm9ybWFsaXplUmVnTmFtZShob3N0LCBzdGFydCwgZW5kKTsKICB9CgogIC8vIFJGQyA2ODc0IGNoZWNrIGZvciBab25lSUQKICAvLyBSZXR1cm4gdGhlIGluZGV4IG9mIGZpcnN0IGFwcGVhcmVkIGAlYC4KICBzdGF0aWMgaW50IF9jaGVja1pvbmVJRChTdHJpbmcgaG9zdCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBpbnQgaW5kZXggPSBob3N0LmluZGV4T2YoJyUnLCBzdGFydCk7CiAgICBpbmRleCA9IChpbmRleCA+PSBzdGFydCAmJiBpbmRleCA8IGVuZCkgPyBpbmRleCA6IGVuZDsKICAgIHJldHVybiBpbmRleDsKICB9CgogIHN0YXRpYyBib29sIF9pc1pvbmVJRENoYXIoaW50IGNoYXIpIHsKICAgIHJldHVybiBjaGFyIDwgMTI3ICYmIChfem9uZUlEVGFibGVbY2hhciA+PiA0XSAmICgxIDw8IChjaGFyICYgMHhmKSkpICE9IDA7CiAgfQoKICAvKioKICAgKiBWYWxpZGF0ZXMgYW5kIGRvZXMgY2FzZS0gYW5kIHBlcmNlbnQtZW5jb2Rpbmcgbm9ybWFsaXphdGlvbi4KICAgKgogICAqIFRoZSBzYW1lIGFzIFtfbm9ybWFsaXplT3JTdWJzdHJpbmddCiAgICogZXhjZXB0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY29udmVydCBjaGFyYWN0ZXJzIHRvIGxvd2VyIGNhc2UuCiAgICogVGhlIFtob3N0XSBtdXN0IGJlIGFuIFJGQzY4NzQgIlpvbmVJRCIuCiAgICogWm9uZUlEID0gMSoodW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkKQogICAqLwogIHN0YXRpYyBTdHJpbmcgX25vcm1hbGl6ZVpvbmVJRChTdHJpbmcgaG9zdCwgaW50IHN0YXJ0LCBpbnQgZW5kLAogICAgICBbU3RyaW5nIHByZWZpeCA9ICcnXSkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKICAgIGlmIChwcmVmaXggIT0gJycpIHsKICAgICAgYnVmZmVyID0gU3RyaW5nQnVmZmVyKHByZWZpeCk7CiAgICB9CiAgICBpbnQgc2VjdGlvblN0YXJ0ID0gc3RhcnQ7CiAgICBpbnQgaW5kZXggPSBzdGFydDsKICAgIC8vIFdoZXRoZXIgYWxsIGNoYXJhY3RlcnMgYmV0d2VlbiBzZWN0aW9uU3RhcnQgYW5kIGluZGV4IGFyZSBub3JtYWxpemVkLAogICAgYm9vbCBpc05vcm1hbGl6ZWQgPSB0cnVlOwoKICAgIHdoaWxlIChpbmRleCA8IGVuZCkgewogICAgICBpbnQgY2hhciA9IGhvc3QuY29kZVVuaXRBdChpbmRleCk7CiAgICAgIGlmIChjaGFyID09IF9QRVJDRU5UKSB7CiAgICAgICAgU3RyaW5nIHJlcGxhY2VtZW50ID0gX25vcm1hbGl6ZUVzY2FwZShob3N0LCBpbmRleCwgdHJ1ZSk7CiAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwgJiYgaXNOb3JtYWxpemVkKSB7CiAgICAgICAgICBpbmRleCArPSAzOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGJ1ZmZlciA/Pz0gU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgU3RyaW5nIHNsaWNlID0gaG9zdC5zdWJzdHJpbmcoc2VjdGlvblN0YXJ0LCBpbmRleCk7CiAgICAgICAgYnVmZmVyLndyaXRlKHNsaWNlKTsKICAgICAgICBpbnQgc291cmNlTGVuZ3RoID0gMzsKICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCkgewogICAgICAgICAgcmVwbGFjZW1lbnQgPSBob3N0LnN1YnN0cmluZyhpbmRleCwgaW5kZXggKyAzKTsKICAgICAgICB9IGVsc2UgaWYgKHJlcGxhY2VtZW50ID09ICIlIikgewogICAgICAgICAgX2ZhaWwoaG9zdCwgaW5kZXgsICJab25lSUQgc2hvdWxkIG5vdCBjb250YWluICUgYW55bW9yZSIpOwogICAgICAgIH0KICAgICAgICBidWZmZXIud3JpdGUocmVwbGFjZW1lbnQpOwogICAgICAgIGluZGV4ICs9IHNvdXJjZUxlbmd0aDsKICAgICAgICBzZWN0aW9uU3RhcnQgPSBpbmRleDsKICAgICAgICBpc05vcm1hbGl6ZWQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKF9pc1pvbmVJRENoYXIoY2hhcikpIHsKICAgICAgICBpZiAoaXNOb3JtYWxpemVkICYmIF9VUFBFUl9DQVNFX0EgPD0gY2hhciAmJiBfVVBQRVJfQ0FTRV9aID49IGNoYXIpIHsKICAgICAgICAgIC8vIFB1dCBpbml0aWFsIHNsaWNlIGluIGJ1ZmZlciBhbmQgY29udGludWUgaW4gbm9uLW5vcm1hbGl6ZWQgbW9kZQogICAgICAgICAgYnVmZmVyID8/PSBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgIGlmIChzZWN0aW9uU3RhcnQgPCBpbmRleCkgewogICAgICAgICAgICBidWZmZXIud3JpdGUoaG9zdC5zdWJzdHJpbmcoc2VjdGlvblN0YXJ0LCBpbmRleCkpOwogICAgICAgICAgICBzZWN0aW9uU3RhcnQgPSBpbmRleDsKICAgICAgICAgIH0KICAgICAgICAgIGlzTm9ybWFsaXplZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpbmRleCsrOwogICAgICB9IGVsc2UgewogICAgICAgIGludCBzb3VyY2VMZW5ndGggPSAxOwogICAgICAgIGlmICgoY2hhciAmIDB4RkMwMCkgPT0gMHhEODAwICYmIChpbmRleCArIDEpIDwgZW5kKSB7CiAgICAgICAgICBpbnQgdGFpbCA9IGhvc3QuY29kZVVuaXRBdChpbmRleCArIDEpOwogICAgICAgICAgaWYgKCh0YWlsICYgMHhGQzAwKSA9PSAweERDMDApIHsKICAgICAgICAgICAgY2hhciA9IDB4MTAwMDAgfCAoKGNoYXIgJiAweDNmZikgPDwgMTApIHwgKHRhaWwgJiAweDNmZik7CiAgICAgICAgICAgIHNvdXJjZUxlbmd0aCA9IDI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJ1ZmZlciA/Pz0gU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgU3RyaW5nIHNsaWNlID0gaG9zdC5zdWJzdHJpbmcoc2VjdGlvblN0YXJ0LCBpbmRleCk7CiAgICAgICAgYnVmZmVyLndyaXRlKHNsaWNlKTsKICAgICAgICBidWZmZXIud3JpdGUoX2VzY2FwZUNoYXIoY2hhcikpOwogICAgICAgIGluZGV4ICs9IHNvdXJjZUxlbmd0aDsKICAgICAgICBzZWN0aW9uU3RhcnQgPSBpbmRleDsKICAgICAgfQogICAgfQogICAgaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm4gaG9zdC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgICBpZiAoc2VjdGlvblN0YXJ0IDwgZW5kKSB7CiAgICAgIFN0cmluZyBzbGljZSA9IGhvc3Quc3Vic3RyaW5nKHNlY3Rpb25TdGFydCwgZW5kKTsKICAgICAgYnVmZmVyLndyaXRlKHNsaWNlKTsKICAgIH0KICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIHN0YXRpYyBib29sIF9pc1JlZ05hbWVDaGFyKGludCBjaGFyKSB7CiAgICByZXR1cm4gY2hhciA8IDEyNyAmJiAoX3JlZ05hbWVUYWJsZVtjaGFyID4+IDRdICYgKDEgPDwgKGNoYXIgJiAweGYpKSkgIT0gMDsKICB9CgogIC8qKgogICAqIFZhbGlkYXRlcyBhbmQgZG9lcyBjYXNlLSBhbmQgcGVyY2VudC1lbmNvZGluZyBub3JtYWxpemF0aW9uLgogICAqCiAgICogVGhlIFtob3N0XSBtdXN0IGJlIGFuIFJGQzM5ODYgInJlZy1uYW1lIi4gSXQgaXMgY29udmVydGVkCiAgICogdG8gbG93ZXIgY2FzZSwgYW5kIHBlcmNlbnQgZXNjYXBlcyBhcmUgY29udmVydGVkIHRvIGVpdGhlcgogICAqIGxvd2VyIGNhc2UgdW5yZXNlcnZlZCBjaGFyYWN0ZXJzIG9yIHVwcGVyIGNhc2UgZXNjYXBlcy4KICAgKi8KICBzdGF0aWMgU3RyaW5nIF9ub3JtYWxpemVSZWdOYW1lKFN0cmluZyBob3N0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXI7CiAgICBpbnQgc2VjdGlvblN0YXJ0ID0gc3RhcnQ7CiAgICBpbnQgaW5kZXggPSBzdGFydDsKICAgIC8vIFdoZXRoZXIgYWxsIGNoYXJhY3RlcnMgYmV0d2VlbiBzZWN0aW9uU3RhcnQgYW5kIGluZGV4IGFyZSBub3JtYWxpemVkLAogICAgYm9vbCBpc05vcm1hbGl6ZWQgPSB0cnVlOwoKICAgIHdoaWxlIChpbmRleCA8IGVuZCkgewogICAgICBpbnQgY2hhciA9IGhvc3QuY29kZVVuaXRBdChpbmRleCk7CiAgICAgIGlmIChjaGFyID09IF9QRVJDRU5UKSB7CiAgICAgICAgLy8gVGhlIF9yZWdOYW1lVGFibGUgY29udGFpbnMgIiUiLCBzbyB3ZSBjaGVjayB0aGF0IGZpcnN0LgogICAgICAgIFN0cmluZyByZXBsYWNlbWVudCA9IF9ub3JtYWxpemVFc2NhcGUoaG9zdCwgaW5kZXgsIHRydWUpOwogICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsICYmIGlzTm9ybWFsaXplZCkgewogICAgICAgICAgaW5kZXggKz0gMzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBidWZmZXIgPz89IFN0cmluZ0J1ZmZlcigpOwogICAgICAgIFN0cmluZyBzbGljZSA9IGhvc3Quc3Vic3RyaW5nKHNlY3Rpb25TdGFydCwgaW5kZXgpOwogICAgICAgIGlmICghaXNOb3JtYWxpemVkKSBzbGljZSA9IHNsaWNlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgYnVmZmVyLndyaXRlKHNsaWNlKTsKICAgICAgICBpbnQgc291cmNlTGVuZ3RoID0gMzsKICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCkgewogICAgICAgICAgcmVwbGFjZW1lbnQgPSBob3N0LnN1YnN0cmluZyhpbmRleCwgaW5kZXggKyAzKTsKICAgICAgICB9IGVsc2UgaWYgKHJlcGxhY2VtZW50ID09ICIlIikgewogICAgICAgICAgcmVwbGFjZW1lbnQgPSAiJTI1IjsKICAgICAgICAgIHNvdXJjZUxlbmd0aCA9IDE7CiAgICAgICAgfQogICAgICAgIGJ1ZmZlci53cml0ZShyZXBsYWNlbWVudCk7CiAgICAgICAgaW5kZXggKz0gc291cmNlTGVuZ3RoOwogICAgICAgIHNlY3Rpb25TdGFydCA9IGluZGV4OwogICAgICAgIGlzTm9ybWFsaXplZCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoX2lzUmVnTmFtZUNoYXIoY2hhcikpIHsKICAgICAgICBpZiAoaXNOb3JtYWxpemVkICYmIF9VUFBFUl9DQVNFX0EgPD0gY2hhciAmJiBfVVBQRVJfQ0FTRV9aID49IGNoYXIpIHsKICAgICAgICAgIC8vIFB1dCBpbml0aWFsIHNsaWNlIGluIGJ1ZmZlciBhbmQgY29udGludWUgaW4gbm9uLW5vcm1hbGl6ZWQgbW9kZQogICAgICAgICAgYnVmZmVyID8/PSBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgIGlmIChzZWN0aW9uU3RhcnQgPCBpbmRleCkgewogICAgICAgICAgICBidWZmZXIud3JpdGUoaG9zdC5zdWJzdHJpbmcoc2VjdGlvblN0YXJ0LCBpbmRleCkpOwogICAgICAgICAgICBzZWN0aW9uU3RhcnQgPSBpbmRleDsKICAgICAgICAgIH0KICAgICAgICAgIGlzTm9ybWFsaXplZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpbmRleCsrOwogICAgICB9IGVsc2UgaWYgKF9pc0dlbmVyYWxEZWxpbWl0ZXIoY2hhcikpIHsKICAgICAgICBfZmFpbChob3N0LCBpbmRleCwgIkludmFsaWQgY2hhcmFjdGVyIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW50IHNvdXJjZUxlbmd0aCA9IDE7CiAgICAgICAgaWYgKChjaGFyICYgMHhGQzAwKSA9PSAweEQ4MDAgJiYgKGluZGV4ICsgMSkgPCBlbmQpIHsKICAgICAgICAgIGludCB0YWlsID0gaG9zdC5jb2RlVW5pdEF0KGluZGV4ICsgMSk7CiAgICAgICAgICBpZiAoKHRhaWwgJiAweEZDMDApID09IDB4REMwMCkgewogICAgICAgICAgICBjaGFyID0gMHgxMDAwMCB8ICgoY2hhciAmIDB4M2ZmKSA8PCAxMCkgfCAodGFpbCAmIDB4M2ZmKTsKICAgICAgICAgICAgc291cmNlTGVuZ3RoID0gMjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnVmZmVyID8/PSBTdHJpbmdCdWZmZXIoKTsKICAgICAgICBTdHJpbmcgc2xpY2UgPSBob3N0LnN1YnN0cmluZyhzZWN0aW9uU3RhcnQsIGluZGV4KTsKICAgICAgICBpZiAoIWlzTm9ybWFsaXplZCkgc2xpY2UgPSBzbGljZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGJ1ZmZlci53cml0ZShzbGljZSk7CiAgICAgICAgYnVmZmVyLndyaXRlKF9lc2NhcGVDaGFyKGNoYXIpKTsKICAgICAgICBpbmRleCArPSBzb3VyY2VMZW5ndGg7CiAgICAgICAgc2VjdGlvblN0YXJ0ID0gaW5kZXg7CiAgICAgIH0KICAgIH0KICAgIGlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuIGhvc3Quc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgaWYgKHNlY3Rpb25TdGFydCA8IGVuZCkgewogICAgICBTdHJpbmcgc2xpY2UgPSBob3N0LnN1YnN0cmluZyhzZWN0aW9uU3RhcnQsIGVuZCk7CiAgICAgIGlmICghaXNOb3JtYWxpemVkKSBzbGljZSA9IHNsaWNlLnRvTG93ZXJDYXNlKCk7CiAgICAgIGJ1ZmZlci53cml0ZShzbGljZSk7CiAgICB9CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICAvKioKICAgKiBWYWxpZGF0ZXMgc2NoZW1lIGNoYXJhY3RlcnMgYW5kIGRvZXMgY2FzZS1ub3JtYWxpemF0aW9uLgogICAqCiAgICogU2NoZW1lcyBhcmUgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuIFRoZXkgY2Fubm90IGNvbnRhaW4gZXNjYXBlcy4KICAgKi8KICBzdGF0aWMgU3RyaW5nIF9tYWtlU2NoZW1lKFN0cmluZyBzY2hlbWUsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgaWYgKHN0YXJ0ID09IGVuZCkgcmV0dXJuICIiOwogICAgZmluYWwgaW50IGZpcnN0Q29kZVVuaXQgPSBzY2hlbWUuY29kZVVuaXRBdChzdGFydCk7CiAgICBpZiAoIV9pc0FscGhhYmV0aWNDaGFyYWN0ZXIoZmlyc3RDb2RlVW5pdCkpIHsKICAgICAgX2ZhaWwoc2NoZW1lLCBzdGFydCwgIlNjaGVtZSBub3Qgc3RhcnRpbmcgd2l0aCBhbHBoYWJldGljIGNoYXJhY3RlciIpOwogICAgfQogICAgYm9vbCBjb250YWluc1VwcGVyQ2FzZSA9IGZhbHNlOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgZmluYWwgaW50IGNvZGVVbml0ID0gc2NoZW1lLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmICghX2lzU2NoZW1lQ2hhcmFjdGVyKGNvZGVVbml0KSkgewogICAgICAgIF9mYWlsKHNjaGVtZSwgaSwgIklsbGVnYWwgc2NoZW1lIGNoYXJhY3RlciIpOwogICAgICB9CiAgICAgIGlmIChfVVBQRVJfQ0FTRV9BIDw9IGNvZGVVbml0ICYmIGNvZGVVbml0IDw9IF9VUFBFUl9DQVNFX1opIHsKICAgICAgICBjb250YWluc1VwcGVyQ2FzZSA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHNjaGVtZSA9IHNjaGVtZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgICBpZiAoY29udGFpbnNVcHBlckNhc2UpIHNjaGVtZSA9IHNjaGVtZS50b0xvd2VyQ2FzZSgpOwogICAgcmV0dXJuIF9jYW5vbmljYWxpemVTY2hlbWUoc2NoZW1lKTsKICB9CgogIC8vIENhbm9uaWNhbGl6ZSBhIGZldyBvZnRlbi11c2VkIHNjaGVtZSBzdHJpbmdzLgogIC8vCiAgLy8gVGhpcyBpbXByb3ZlcyBtZW1vcnkgdXNhZ2UgYW5kIG1ha2VzIGNvbXBhcmlzb24gZmFzdGVyLgogIHN0YXRpYyBTdHJpbmcgX2Nhbm9uaWNhbGl6ZVNjaGVtZShTdHJpbmcgc2NoZW1lKSB7CiAgICBpZiAoc2NoZW1lID09ICJodHRwIikgcmV0dXJuICJodHRwIjsKICAgIGlmIChzY2hlbWUgPT0gImZpbGUiKSByZXR1cm4gImZpbGUiOwogICAgaWYgKHNjaGVtZSA9PSAiaHR0cHMiKSByZXR1cm4gImh0dHBzIjsKICAgIGlmIChzY2hlbWUgPT0gInBhY2thZ2UiKSByZXR1cm4gInBhY2thZ2UiOwogICAgcmV0dXJuIHNjaGVtZTsKICB9CgogIHN0YXRpYyBTdHJpbmcgX21ha2VVc2VySW5mbyhTdHJpbmcgdXNlckluZm8sIGludCBzdGFydCwgaW50IGVuZCkgewogICAgaWYgKHVzZXJJbmZvID09IG51bGwpIHJldHVybiAiIjsKICAgIHJldHVybiBfbm9ybWFsaXplT3JTdWJzdHJpbmcodXNlckluZm8sIHN0YXJ0LCBlbmQsIF91c2VyaW5mb1RhYmxlKTsKICB9CgogIHN0YXRpYyBTdHJpbmcgX21ha2VQYXRoKFN0cmluZyBwYXRoLCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgIEl0ZXJhYmxlPFN0cmluZz4gcGF0aFNlZ21lbnRzLCBTdHJpbmcgc2NoZW1lLCBib29sIGhhc0F1dGhvcml0eSkgewogICAgYm9vbCBpc0ZpbGUgPSAoc2NoZW1lID09ICJmaWxlIik7CiAgICBib29sIGVuc3VyZUxlYWRpbmdTbGFzaCA9IGlzRmlsZSB8fCBoYXNBdXRob3JpdHk7CiAgICBpZiAocGF0aCA9PSBudWxsICYmIHBhdGhTZWdtZW50cyA9PSBudWxsKSByZXR1cm4gaXNGaWxlID8gIi8iIDogIiI7CiAgICBpZiAocGF0aCAhPSBudWxsICYmIHBhdGhTZWdtZW50cyAhPSBudWxsKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ0JvdGggcGF0aCBhbmQgcGF0aFNlZ21lbnRzIHNwZWNpZmllZCcpOwogICAgfQogICAgU3RyaW5nIHJlc3VsdDsKICAgIGlmIChwYXRoICE9IG51bGwpIHsKICAgICAgcmVzdWx0ID0gX25vcm1hbGl6ZU9yU3Vic3RyaW5nKHBhdGgsIHN0YXJ0LCBlbmQsIF9wYXRoQ2hhck9yU2xhc2hUYWJsZSwKICAgICAgICAgIGVzY2FwZURlbGltaXRlcnM6IHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gcGF0aFNlZ21lbnRzCiAgICAgICAgICAubWFwKChzKSA9PiBfdXJpRW5jb2RlKF9wYXRoQ2hhclRhYmxlLCBzLCB1dGY4LCBmYWxzZSkpCiAgICAgICAgICAuam9pbigiLyIpOwogICAgfQogICAgaWYgKHJlc3VsdC5pc0VtcHR5KSB7CiAgICAgIGlmIChpc0ZpbGUpIHJldHVybiAiLyI7CiAgICB9IGVsc2UgaWYgKGVuc3VyZUxlYWRpbmdTbGFzaCAmJiAhcmVzdWx0LnN0YXJ0c1dpdGgoJy8nKSkgewogICAgICByZXN1bHQgPSAiLyIgKyByZXN1bHQ7CiAgICB9CiAgICByZXN1bHQgPSBfbm9ybWFsaXplUGF0aChyZXN1bHQsIHNjaGVtZSwgaGFzQXV0aG9yaXR5KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gUGVyZm9ybXMgcGF0aCBub3JtYWxpemF0aW9uIChyZW1vdmUgZG90IHNlZ21lbnRzKSBvbiBhIHBhdGguCiAgLy8vCiAgLy8vIElmIHRoZSBVUkkgaGFzIG5laXRoZXIgc2NoZW1lIG5vciBhdXRob3JpdHksIGl0J3MgY29uc2lkZXJlZCBhCiAgLy8vICJwdXJlIHBhdGgiIGFuZCBub3JtYWxpemF0aW9uIHdvbid0IHJlbW92ZSBsZWFkaW5nICIuLiIgc2VnbWVudHMuCiAgLy8vIE90aGVyd2lzZSBpdCBmb2xsb3dzIHRoZSBSRkMgMzk4NiAicmVtb3ZlIGRvdCBzZWdtZW50cyIgYWxnb3JpdGhtLgogIHN0YXRpYyBTdHJpbmcgX25vcm1hbGl6ZVBhdGgoU3RyaW5nIHBhdGgsIFN0cmluZyBzY2hlbWUsIGJvb2wgaGFzQXV0aG9yaXR5KSB7CiAgICBpZiAoc2NoZW1lLmlzRW1wdHkgJiYgIWhhc0F1dGhvcml0eSAmJiAhcGF0aC5zdGFydHNXaXRoKCcvJykpIHsKICAgICAgcmV0dXJuIF9ub3JtYWxpemVSZWxhdGl2ZVBhdGgocGF0aCwgc2NoZW1lLmlzTm90RW1wdHkgfHwgaGFzQXV0aG9yaXR5KTsKICAgIH0KICAgIHJldHVybiBfcmVtb3ZlRG90U2VnbWVudHMocGF0aCk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9tYWtlUXVlcnkoU3RyaW5nIHF1ZXJ5LCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgIE1hcDxTdHJpbmcsIGR5bmFtaWMgLypTdHJpbmd8SXRlcmFibGU8U3RyaW5nPiovID4gcXVlcnlQYXJhbWV0ZXJzKSB7CiAgICBpZiAocXVlcnkgIT0gbnVsbCkgewogICAgICBpZiAocXVlcnlQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCdCb3RoIHF1ZXJ5IGFuZCBxdWVyeVBhcmFtZXRlcnMgc3BlY2lmaWVkJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIF9ub3JtYWxpemVPclN1YnN0cmluZyhxdWVyeSwgc3RhcnQsIGVuZCwgX3F1ZXJ5Q2hhclRhYmxlLAogICAgICAgICAgZXNjYXBlRGVsaW1pdGVyczogdHJ1ZSk7CiAgICB9CiAgICBpZiAocXVlcnlQYXJhbWV0ZXJzID09IG51bGwpIHJldHVybiBudWxsOwoKICAgIHZhciByZXN1bHQgPSBTdHJpbmdCdWZmZXIoKTsKICAgIHZhciBzZXBhcmF0b3IgPSAiIjsKCiAgICB2b2lkIHdyaXRlUGFyYW1ldGVyKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewogICAgICByZXN1bHQud3JpdGUoc2VwYXJhdG9yKTsKICAgICAgc2VwYXJhdG9yID0gIiYiOwogICAgICByZXN1bHQud3JpdGUoVXJpLmVuY29kZVF1ZXJ5Q29tcG9uZW50KGtleSkpOwogICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5pc05vdEVtcHR5KSB7CiAgICAgICAgcmVzdWx0LndyaXRlKCI9Iik7CiAgICAgICAgcmVzdWx0LndyaXRlKFVyaS5lbmNvZGVRdWVyeUNvbXBvbmVudCh2YWx1ZSkpOwogICAgICB9CiAgICB9CgogICAgcXVlcnlQYXJhbWV0ZXJzLmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgaXMgU3RyaW5nKSB7CiAgICAgICAgd3JpdGVQYXJhbWV0ZXIoa2V5LCB2YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgSXRlcmFibGUgdmFsdWVzID0gdmFsdWU7CiAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgaW4gdmFsdWVzKSB7CiAgICAgICAgICB3cml0ZVBhcmFtZXRlcihrZXksIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogIH0KCiAgc3RhdGljIFN0cmluZyBfbWFrZUZyYWdtZW50KFN0cmluZyBmcmFnbWVudCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBpZiAoZnJhZ21lbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX25vcm1hbGl6ZU9yU3Vic3RyaW5nKGZyYWdtZW50LCBzdGFydCwgZW5kLCBfcXVlcnlDaGFyVGFibGUsCiAgICAgICAgZXNjYXBlRGVsaW1pdGVyczogdHJ1ZSk7CiAgfQoKICAvKioKICAgKiBQZXJmb3JtcyBSRkMgMzk4NiBQZXJjZW50LUVuY29kaW5nIE5vcm1hbGl6YXRpb24uCiAgICoKICAgKiBSZXR1cm5zIGEgcmVwbGFjZW1lbnQgc3RyaW5nIHRoYXQgc2hvdWxkIGJlIHJlcGxhY2UgdGhlIG9yaWdpbmFsIGVzY2FwZS4KICAgKiBSZXR1cm5zIG51bGwgaWYgbm8gcmVwbGFjZW1lbnQgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGVzY2FwZSBpcwogICAqIG5vdCBmb3IgYW4gdW5yZXNlcnZlZCBjaGFyYWN0ZXIgYW5kIGlzIGFscmVhZHkgbm9uLWxvd2VyLWNhc2UuCiAgICoKICAgKiBSZXR1cm5zICIlIiBpZiB0aGUgZXNjYXBlIGlzIGludmFsaWQgKG5vdCB0d28gdmFsaWQgaGV4IGRpZ2l0cyBmb2xsb3dpbmcKICAgKiB0aGUgcGVyY2VudCBzaWduKS4gVGhlIGNhbGxpbmcgY29kZSBzaG91bGQgcmVwbGFjZSB0aGUgcGVyY2VudAogICAqIHNpZ24gd2l0aCAiJTI1IiwgYnV0IGxlYXZlIHRoZSBmb2xsb3dpbmcgdHdvIGNoYXJhY3RlcnMgdW5tb2RpZmllZC4KICAgKgogICAqIElmIFtsb3dlckNhc2VdIGlzIHRydWUsIGEgc2luZ2xlIGNoYXJhY3RlciByZXR1cm5lZCBpcyBhbHdheXMgbG93ZXIgY2FzZSwKICAgKi8KICBzdGF0aWMgU3RyaW5nIF9ub3JtYWxpemVFc2NhcGUoU3RyaW5nIHNvdXJjZSwgaW50IGluZGV4LCBib29sIGxvd2VyQ2FzZSkgewogICAgYXNzZXJ0KHNvdXJjZS5jb2RlVW5pdEF0KGluZGV4KSA9PSBfUEVSQ0VOVCk7CiAgICBpZiAoaW5kZXggKyAyID49IHNvdXJjZS5sZW5ndGgpIHsKICAgICAgcmV0dXJuICIlIjsgLy8gTWFya3MgdGhlIGVzY2FwZSBhcyBpbnZhbGlkLgogICAgfQogICAgaW50IGZpcnN0RGlnaXQgPSBzb3VyY2UuY29kZVVuaXRBdChpbmRleCArIDEpOwogICAgaW50IHNlY29uZERpZ2l0ID0gc291cmNlLmNvZGVVbml0QXQoaW5kZXggKyAyKTsKICAgIGludCBmaXJzdERpZ2l0VmFsdWUgPSBoZXhEaWdpdFZhbHVlKGZpcnN0RGlnaXQpOwogICAgaW50IHNlY29uZERpZ2l0VmFsdWUgPSBoZXhEaWdpdFZhbHVlKHNlY29uZERpZ2l0KTsKICAgIGlmIChmaXJzdERpZ2l0VmFsdWUgPCAwIHx8IHNlY29uZERpZ2l0VmFsdWUgPCAwKSB7CiAgICAgIHJldHVybiAiJSI7IC8vIE1hcmtzIHRoZSBlc2NhcGUgYXMgaW52YWxpZC4KICAgIH0KICAgIGludCB2YWx1ZSA9IGZpcnN0RGlnaXRWYWx1ZSAqIDE2ICsgc2Vjb25kRGlnaXRWYWx1ZTsKICAgIGlmIChfaXNVbnJlc2VydmVkQ2hhcih2YWx1ZSkpIHsKICAgICAgaWYgKGxvd2VyQ2FzZSAmJiBfVVBQRVJfQ0FTRV9BIDw9IHZhbHVlICYmIF9VUFBFUl9DQVNFX1ogPj0gdmFsdWUpIHsKICAgICAgICB2YWx1ZSB8PSAweDIwOwogICAgICB9CiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlKTsKICAgIH0KICAgIGlmIChmaXJzdERpZ2l0ID49IF9MT1dFUl9DQVNFX0EgfHwgc2Vjb25kRGlnaXQgPj0gX0xPV0VSX0NBU0VfQSkgewogICAgICAvLyBFaXRoZXIgZGlnaXQgaXMgbG93ZXIgY2FzZS4KICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgMykudG9VcHBlckNhc2UoKTsKICAgIH0KICAgIC8vIEVzY2FwZSBpcyByZXRhaW5lZCwgYW5kIGlzIGFscmVhZHkgbm9uLWxvd2VyIGNhc2UsIHNvIHJldHVybiBudWxsIHRvCiAgICAvLyByZXByZXNlbnQgIm5vIHJlcGxhY2VtZW50IG5lY2Vzc2FyeSIuCiAgICByZXR1cm4gbnVsbDsKICB9CgogIHN0YXRpYyBTdHJpbmcgX2VzY2FwZUNoYXIoaW50IGNoYXIpIHsKICAgIGFzc2VydChjaGFyIDw9IDB4MTBmZmZmKTsgLy8gSXQncyBhIHZhbGlkIHVuaWNvZGUgY29kZSBwb2ludC4KICAgIExpc3Q8aW50PiBjb2RlVW5pdHM7CiAgICBpZiAoY2hhciA8IDB4ODApIHsKICAgICAgLy8gQVNDSUksIGEgc2luZ2xlIHBlcmNlbnQgZW5jb2RlZCBzZXF1ZW5jZS4KICAgICAgY29kZVVuaXRzID0gTGlzdCgzKTsKICAgICAgY29kZVVuaXRzWzBdID0gX1BFUkNFTlQ7CiAgICAgIGNvZGVVbml0c1sxXSA9IF9oZXhEaWdpdHMuY29kZVVuaXRBdChjaGFyID4+IDQpOwogICAgICBjb2RlVW5pdHNbMl0gPSBfaGV4RGlnaXRzLmNvZGVVbml0QXQoY2hhciAmIDB4Zik7CiAgICB9IGVsc2UgewogICAgICAvLyBEbyBVVEYtOCBlbmNvZGluZyBvZiBjaGFyYWN0ZXIsIHRoZW4gcGVyY2VudCBlbmNvZGUgYnl0ZXMuCiAgICAgIGludCBmbGFnID0gMHhjMDsgLy8gVGhlIGhpZ2gtYml0IG1hcmtlcnMgb24gdGhlIGZpcnN0IGJ5dGUgb2YgVVRGLTguCiAgICAgIGludCBlbmNvZGVkQnl0ZXMgPSAyOwogICAgICBpZiAoY2hhciA+IDB4N2ZmKSB7CiAgICAgICAgZmxhZyA9IDB4ZTA7CiAgICAgICAgZW5jb2RlZEJ5dGVzID0gMzsKICAgICAgICBpZiAoY2hhciA+IDB4ZmZmZikgewogICAgICAgICAgZW5jb2RlZEJ5dGVzID0gNDsKICAgICAgICAgIGZsYWcgPSAweGYwOwogICAgICAgIH0KICAgICAgfQogICAgICBjb2RlVW5pdHMgPSBMaXN0KDMgKiBlbmNvZGVkQnl0ZXMpOwogICAgICBpbnQgaW5kZXggPSAwOwogICAgICB3aGlsZSAoLS1lbmNvZGVkQnl0ZXMgPj0gMCkgewogICAgICAgIGludCBieXRlID0gKChjaGFyID4+ICg2ICogZW5jb2RlZEJ5dGVzKSkgJiAweDNmKSB8IGZsYWc7CiAgICAgICAgY29kZVVuaXRzW2luZGV4XSA9IF9QRVJDRU5UOwogICAgICAgIGNvZGVVbml0c1tpbmRleCArIDFdID0gX2hleERpZ2l0cy5jb2RlVW5pdEF0KGJ5dGUgPj4gNCk7CiAgICAgICAgY29kZVVuaXRzW2luZGV4ICsgMl0gPSBfaGV4RGlnaXRzLmNvZGVVbml0QXQoYnl0ZSAmIDB4Zik7CiAgICAgICAgaW5kZXggKz0gMzsKICAgICAgICBmbGFnID0gMHg4MDsgLy8gRm9sbG93aW5nIGJ5dGVzIGhhdmUgb25seSBoaWdoIGJpdCBzZXQuCiAgICAgIH0KICAgIH0KICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogIH0KCiAgLyoqCiAgICogTm9ybWFsaXplcyB1c2luZyBbX25vcm1hbGl6ZV0gb3IgcmV0dXJucyBzdWJzdHJpbmcgb2Ygb3JpZ2luYWwuCiAgICoKICAgKiBJZiBbX25vcm1hbGl6ZV0gcmV0dXJucyBgbnVsbGAgKG9yaWdpbmFsIGNvbnRlbnQgaXMgYWxyZWFkeSBub3JtYWxpemVkKSwKICAgKiB0aGlzIG1ldGhvZHMgcmV0dXJucyB0aGUgc3Vic3RyaW5nIGlmIFtjb21wb25lbnRdIGZyb20gW3N0YXJ0XSB0byBbZW5kXS4KICAgKi8KICBzdGF0aWMgU3RyaW5nIF9ub3JtYWxpemVPclN1YnN0cmluZygKICAgICAgU3RyaW5nIGNvbXBvbmVudCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBMaXN0PGludD4gY2hhclRhYmxlLAogICAgICB7Ym9vbCBlc2NhcGVEZWxpbWl0ZXJzID0gZmFsc2V9KSB7CiAgICByZXR1cm4gX25vcm1hbGl6ZShjb21wb25lbnQsIHN0YXJ0LCBlbmQsIGNoYXJUYWJsZSwKICAgICAgICAgICAgZXNjYXBlRGVsaW1pdGVyczogZXNjYXBlRGVsaW1pdGVycykgPz8KICAgICAgICBjb21wb25lbnQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogIH0KCiAgLyoqCiAgICogUnVucyB0aHJvdWdoIGNvbXBvbmVudCBjaGVja2luZyB0aGF0IGVhY2ggY2hhcmFjdGVyIGlzIHZhbGlkIGFuZAogICAqIG5vcm1hbGl6ZSBwZXJjZW50IGVzY2FwZXMuCiAgICoKICAgKiBVc2VzIFtjaGFyVGFibGVdIHRvIGNoZWNrIGlmIGEgbm9uLWAlYCBjaGFyYWN0ZXIgaXMgYWxsb3dlZC4KICAgKiBFYWNoIGAlYCBjaGFyYWN0ZXIgbXVzdCBiZSBmb2xsb3dlZCBieSB0d28gaGV4IGRpZ2l0cy4KICAgKiBJZiB0aGUgaGV4LWRpZ2l0cyBhcmUgbG93ZXIgY2FzZSBsZXR0ZXJzLCB0aGV5IGFyZSBjb252ZXJ0ZWQgdG8KICAgKiB1cHBlciBjYXNlLgogICAqCiAgICogUmV0dXJucyBgbnVsbGAgaWYgdGhlIG9yaWdpbmFsIGNvbnRlbnQgd2FzIGFscmVhZHkgbm9ybWFsaXplZC4KICAgKi8KICBzdGF0aWMgU3RyaW5nIF9ub3JtYWxpemUoCiAgICAgIFN0cmluZyBjb21wb25lbnQsIGludCBzdGFydCwgaW50IGVuZCwgTGlzdDxpbnQ+IGNoYXJUYWJsZSwKICAgICAge2Jvb2wgZXNjYXBlRGVsaW1pdGVycyA9IGZhbHNlfSkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKICAgIGludCBzZWN0aW9uU3RhcnQgPSBzdGFydDsKICAgIGludCBpbmRleCA9IHN0YXJ0OwogICAgLy8gTG9vcCB3aGlsZSBjaGFyYWN0ZXJzIGFyZSB2YWxpZCBhbmQgZXNjYXBlcyBjb3JyZWN0IGFuZCB1cHBlci1jYXNlLgogICAgd2hpbGUgKGluZGV4IDwgZW5kKSB7CiAgICAgIGludCBjaGFyID0gY29tcG9uZW50LmNvZGVVbml0QXQoaW5kZXgpOwogICAgICBpZiAoY2hhciA8IDEyNyAmJiAoY2hhclRhYmxlW2NoYXIgPj4gNF0gJiAoMSA8PCAoY2hhciAmIDB4MGYpKSkgIT0gMCkgewogICAgICAgIGluZGV4Kys7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgU3RyaW5nIHJlcGxhY2VtZW50OwogICAgICAgIGludCBzb3VyY2VMZW5ndGg7CiAgICAgICAgaWYgKGNoYXIgPT0gX1BFUkNFTlQpIHsKICAgICAgICAgIHJlcGxhY2VtZW50ID0gX25vcm1hbGl6ZUVzY2FwZShjb21wb25lbnQsIGluZGV4LCBmYWxzZSk7CiAgICAgICAgICAvLyBSZXR1cm5zIG51bGwgaWYgd2Ugc2hvdWxkIGtlZXAgdGhlIGV4aXN0aW5nIGVzY2FwZS4KICAgICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7CiAgICAgICAgICAgIGluZGV4ICs9IDM7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgLy8gUmV0dXJucyAiJSIgaWYgd2Ugc2hvdWxkIGVzY2FwZSB0aGUgZXhpc3RpbmcgcGVyY2VudC4KICAgICAgICAgIGlmICgiJSIgPT0gcmVwbGFjZW1lbnQpIHsKICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAiJTI1IjsKICAgICAgICAgICAgc291cmNlTGVuZ3RoID0gMTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNvdXJjZUxlbmd0aCA9IDM7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghZXNjYXBlRGVsaW1pdGVycyAmJiBfaXNHZW5lcmFsRGVsaW1pdGVyKGNoYXIpKSB7CiAgICAgICAgICBfZmFpbChjb21wb25lbnQsIGluZGV4LCAiSW52YWxpZCBjaGFyYWN0ZXIiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc291cmNlTGVuZ3RoID0gMTsKICAgICAgICAgIGlmICgoY2hhciAmIDB4RkMwMCkgPT0gMHhEODAwKSB7CiAgICAgICAgICAgIC8vIFBvc3NpYmxlIGxlYWQgc3Vycm9nYXRlLgogICAgICAgICAgICBpZiAoaW5kZXggKyAxIDwgZW5kKSB7CiAgICAgICAgICAgICAgaW50IHRhaWwgPSBjb21wb25lbnQuY29kZVVuaXRBdChpbmRleCArIDEpOwogICAgICAgICAgICAgIGlmICgodGFpbCAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7CiAgICAgICAgICAgICAgICAvLyBUYWlsIHN1cnJvZ2F0ZS4KICAgICAgICAgICAgICAgIHNvdXJjZUxlbmd0aCA9IDI7CiAgICAgICAgICAgICAgICBjaGFyID0gMHgxMDAwMCB8ICgoY2hhciAmIDB4M2ZmKSA8PCAxMCkgfCAodGFpbCAmIDB4M2ZmKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJlcGxhY2VtZW50ID0gX2VzY2FwZUNoYXIoY2hhcik7CiAgICAgICAgfQogICAgICAgIGJ1ZmZlciA/Pz0gU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgYnVmZmVyLndyaXRlKGNvbXBvbmVudC5zdWJzdHJpbmcoc2VjdGlvblN0YXJ0LCBpbmRleCkpOwogICAgICAgIGJ1ZmZlci53cml0ZShyZXBsYWNlbWVudCk7CiAgICAgICAgaW5kZXggKz0gc291cmNlTGVuZ3RoOwogICAgICAgIHNlY3Rpb25TdGFydCA9IGluZGV4OwogICAgICB9CiAgICB9CiAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoc2VjdGlvblN0YXJ0IDwgZW5kKSB7CiAgICAgIGJ1ZmZlci53cml0ZShjb21wb25lbnQuc3Vic3RyaW5nKHNlY3Rpb25TdGFydCwgZW5kKSk7CiAgICB9CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICBzdGF0aWMgYm9vbCBfaXNTY2hlbWVDaGFyYWN0ZXIoaW50IGNoKSB7CiAgICByZXR1cm4gY2ggPCAxMjggJiYgKChfc2NoZW1lVGFibGVbY2ggPj4gNF0gJiAoMSA8PCAoY2ggJiAweDBmKSkpICE9IDApOwogIH0KCiAgc3RhdGljIGJvb2wgX2lzR2VuZXJhbERlbGltaXRlcihpbnQgY2gpIHsKICAgIHJldHVybiBjaCA8PSBfUklHSFRfQlJBQ0tFVCAmJgogICAgICAgICgoX2dlbkRlbGltaXRlcnNUYWJsZVtjaCA+PiA0XSAmICgxIDw8IChjaCAmIDB4MGYpKSkgIT0gMCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFVSSSBpcyBhYnNvbHV0ZS4KICAgKi8KICBib29sIGdldCBpc0Fic29sdXRlID0+IHNjaGVtZSAhPSAiIiAmJiBmcmFnbWVudCA9PSAiIjsKCiAgU3RyaW5nIF9tZXJnZVBhdGhzKFN0cmluZyBiYXNlLCBTdHJpbmcgcmVmZXJlbmNlKSB7CiAgICAvLyBPcHRpbWl6ZSBmb3IgdGhlIGNhc2U6IGFic29sdXRlIGJhc2UsIHJlZmVyZW5jZSBiZWdpbm5pbmcgd2l0aCAiLi4vIi4KICAgIGludCBiYWNrQ291bnQgPSAwOwogICAgaW50IHJlZlN0YXJ0ID0gMDsKICAgIC8vIENvdW50IG51bWJlciBvZiAiLi4vIiBhdCBiZWdpbm5pbmcgb2YgcmVmZXJlbmNlLgogICAgd2hpbGUgKHJlZmVyZW5jZS5zdGFydHNXaXRoKCIuLi8iLCByZWZTdGFydCkpIHsKICAgICAgcmVmU3RhcnQgKz0gMzsKICAgICAgYmFja0NvdW50Kys7CiAgICB9CgogICAgLy8gRHJvcCBsYXN0IHNlZ21lbnQgLSBldmVyeXRoaW5nIGFmdGVyIGxhc3QgJy8nIG9mIGJhc2UuCiAgICBpbnQgYmFzZUVuZCA9IGJhc2UubGFzdEluZGV4T2YoJy8nKTsKICAgIC8vIERyb3AgZXh0cmEgc2VnbWVudHMgZm9yIGVhY2ggbGVhZGluZyAiLi4vIiBvZiByZWZlcmVuY2UuCiAgICB3aGlsZSAoYmFzZUVuZCA+IDAgJiYgYmFja0NvdW50ID4gMCkgewogICAgICBpbnQgbmV3RW5kID0gYmFzZS5sYXN0SW5kZXhPZignLycsIGJhc2VFbmQgLSAxKTsKICAgICAgaWYgKG5ld0VuZCA8IDApIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpbnQgZGVsdGEgPSBiYXNlRW5kIC0gbmV3RW5kOwogICAgICAvLyBJZiB3ZSBzZWUgYSAiLiIgb3IgIi4uIiBzZWdtZW50IGluIGJhc2UsIHN0b3AgaGVyZSBhbmQgbGV0CiAgICAgIC8vIF9yZW1vdmVEb3RTZWdtZW50cyBoYW5kbGUgaXQuCiAgICAgIGlmICgoZGVsdGEgPT0gMiB8fCBkZWx0YSA9PSAzKSAmJgogICAgICAgICAgYmFzZS5jb2RlVW5pdEF0KG5ld0VuZCArIDEpID09IF9ET1QgJiYKICAgICAgICAgIChkZWx0YSA9PSAyIHx8IGJhc2UuY29kZVVuaXRBdChuZXdFbmQgKyAyKSA9PSBfRE9UKSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGJhc2VFbmQgPSBuZXdFbmQ7CiAgICAgIGJhY2tDb3VudC0tOwogICAgfQogICAgcmV0dXJuIGJhc2UucmVwbGFjZVJhbmdlKAogICAgICAgIGJhc2VFbmQgKyAxLCBudWxsLCByZWZlcmVuY2Uuc3Vic3RyaW5nKHJlZlN0YXJ0IC0gMyAqIGJhY2tDb3VudCkpOwogIH0KCiAgLy8vIE1ha2UgYSBndWVzcyBhdCB3aGV0aGVyIGEgcGF0aCBjb250YWlucyBhIGAuLmAgb3IgYC5gIHNlZ21lbnQuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBwcmltaXRpdmUgdGVzdCB0aGF0IGNhbiBjYXVzZSBmYWxzZSBwb3NpdGl2ZXMuCiAgLy8vIEl0J3Mgb25seSB1c2VkIHRvIGF2b2lkIGEgbW9yZSBleHBlbnNpdmUgb3BlcmF0aW9uIGluIHRoZSBjYXNlIHdoZXJlCiAgLy8vIGl0J3Mgbm90IG5lY2Vzc2FyeS4KICBzdGF0aWMgYm9vbCBfbWF5Q29udGFpbkRvdFNlZ21lbnRzKFN0cmluZyBwYXRoKSB7CiAgICBpZiAocGF0aC5zdGFydHNXaXRoKCcuJykpIHJldHVybiB0cnVlOwogICAgaW50IGluZGV4ID0gcGF0aC5pbmRleE9mKCIvLiIpOwogICAgcmV0dXJuIGluZGV4ICE9IC0xOwogIH0KCiAgLy8vIFJlbW92ZXMgJy4nIGFuZCAnLi4nIHNlZ21lbnRzIGZyb20gYSBwYXRoLgogIC8vLwogIC8vLyBGb2xsb3dzIHRoZSBSRkMgMjk4NiAicmVtb3ZlIGRvdCBzZWdtZW50cyIgYWxnb3JpdGhtLgogIC8vLyBUaGlzIGFsZ29yaXRobSBpcyBvbmx5IHVzZWQgb24gcGF0aHMgb2YgVVJJcyB3aXRoIGEgc2NoZW1lLAogIC8vLyBhbmQgaXQgdHJlYXRzIHRoZSBwYXRoIGFzIGlmIGl0IGlzIGFic29sdXRlIChsZWFkaW5nICcuLicgYXJlIHJlbW92ZWQpLgogIHN0YXRpYyBTdHJpbmcgX3JlbW92ZURvdFNlZ21lbnRzKFN0cmluZyBwYXRoKSB7CiAgICBpZiAoIV9tYXlDb250YWluRG90U2VnbWVudHMocGF0aCkpIHJldHVybiBwYXRoOwogICAgYXNzZXJ0KHBhdGguaXNOb3RFbXB0eSk7IC8vIEFuIGVtcHR5IHBhdGggd291bGQgbm90IGhhdmUgZG90IHNlZ21lbnRzLgogICAgTGlzdDxTdHJpbmc+IG91dHB1dCA9IFtdOwogICAgYm9vbCBhcHBlbmRTbGFzaCA9IGZhbHNlOwogICAgZm9yIChTdHJpbmcgc2VnbWVudCBpbiBwYXRoLnNwbGl0KCIvIikpIHsKICAgICAgYXBwZW5kU2xhc2ggPSBmYWxzZTsKICAgICAgaWYgKHNlZ21lbnQgPT0gIi4uIikgewogICAgICAgIGlmIChvdXRwdXQuaXNOb3RFbXB0eSkgewogICAgICAgICAgb3V0cHV0LnJlbW92ZUxhc3QoKTsKICAgICAgICAgIGlmIChvdXRwdXQuaXNFbXB0eSkgewogICAgICAgICAgICBvdXRwdXQuYWRkKCIiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYXBwZW5kU2xhc2ggPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKCIuIiA9PSBzZWdtZW50KSB7CiAgICAgICAgYXBwZW5kU2xhc2ggPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIG91dHB1dC5hZGQoc2VnbWVudCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChhcHBlbmRTbGFzaCkgb3V0cHV0LmFkZCgiIik7CiAgICByZXR1cm4gb3V0cHV0LmpvaW4oIi8iKTsKICB9CgogIC8vLyBSZW1vdmVzIGFsbCBgLmAgc2VnbWVudHMgYW5kIGFueSBub24tbGVhZGluZyBgLi5gIHNlZ21lbnRzLgogIC8vLwogIC8vLyBJZiB0aGUgcGF0aCBzdGFydHMgd2l0aCBzb21ldGhpbmcgdGhhdCBsb29rcyBsaWtlIGEgc2NoZW1lLAogIC8vLyBhbmQgW2FsbG93U2NoZW1lXSBpcyBmYWxzZSwgdGhlIGNvbG9uIGlzIGVzY2FwZWQuCiAgLy8vCiAgLy8vIFJlbW92aW5nIHRoZSAiLi4iIGZyb20gYSAiYmFyL2Zvby8uLiIgc2VxdWVuY2UgcmVzdWx0cyBpbiAiYmFyLyIKICAvLy8gKHRyYWlsaW5nICIvIikuIElmIHRoZSBlbnRpcmUgcGF0aCBpcyByZW1vdmVkIChiZWNhdXNlIGl0IGNvbnRhaW5zIGFzCiAgLy8vIG1hbnkgIi4uIiBzZWdtZW50cyBhcyByZWFsIHNlZ21lbnRzKSwgdGhlIHJlc3VsdCBpcyAiLi8iLgogIC8vLyBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIGFuIGVtcHR5IHN0cmluZywgd2hpY2ggcmVwcmVzZW50cyAibm8gcGF0aCIsCiAgLy8vIHdoZW4geW91IHJlc29sdmUgaXQgYWdhaW5zdCBhIGJhc2UgVVJJIHdpdGggYSBwYXRoIHdpdGggYSBub24tZW1wdHkKICAvLy8gZmluYWwgc2VnbWVudC4KICBzdGF0aWMgU3RyaW5nIF9ub3JtYWxpemVSZWxhdGl2ZVBhdGgoU3RyaW5nIHBhdGgsIGJvb2wgYWxsb3dTY2hlbWUpIHsKICAgIGFzc2VydCghcGF0aC5zdGFydHNXaXRoKCcvJykpOyAvLyBPbmx5IGdldCBjYWxsZWQgZm9yIHJlbGF0aXZlIHBhdGhzLgogICAgaWYgKCFfbWF5Q29udGFpbkRvdFNlZ21lbnRzKHBhdGgpKSB7CiAgICAgIGlmICghYWxsb3dTY2hlbWUpIHBhdGggPSBfZXNjYXBlU2NoZW1lKHBhdGgpOwogICAgICByZXR1cm4gcGF0aDsKICAgIH0KICAgIGFzc2VydChwYXRoLmlzTm90RW1wdHkpOyAvLyBBbiBlbXB0eSBwYXRoIHdvdWxkIG5vdCBoYXZlIGRvdCBzZWdtZW50cy4KICAgIExpc3Q8U3RyaW5nPiBvdXRwdXQgPSBbXTsKICAgIGJvb2wgYXBwZW5kU2xhc2ggPSBmYWxzZTsKICAgIGZvciAoU3RyaW5nIHNlZ21lbnQgaW4gcGF0aC5zcGxpdCgiLyIpKSB7CiAgICAgIGFwcGVuZFNsYXNoID0gZmFsc2U7CiAgICAgIGlmICgiLi4iID09IHNlZ21lbnQpIHsKICAgICAgICBpZiAoIW91dHB1dC5pc0VtcHR5ICYmIG91dHB1dC5sYXN0ICE9ICIuLiIpIHsKICAgICAgICAgIG91dHB1dC5yZW1vdmVMYXN0KCk7CiAgICAgICAgICBhcHBlbmRTbGFzaCA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG91dHB1dC5hZGQoIi4uIik7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCIuIiA9PSBzZWdtZW50KSB7CiAgICAgICAgYXBwZW5kU2xhc2ggPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIG91dHB1dC5hZGQoc2VnbWVudCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChvdXRwdXQuaXNFbXB0eSB8fCAob3V0cHV0Lmxlbmd0aCA9PSAxICYmIG91dHB1dFswXS5pc0VtcHR5KSkgewogICAgICByZXR1cm4gIi4vIjsKICAgIH0KICAgIGlmIChhcHBlbmRTbGFzaCB8fCBvdXRwdXQubGFzdCA9PSAnLi4nKSBvdXRwdXQuYWRkKCIiKTsKICAgIGlmICghYWxsb3dTY2hlbWUpIG91dHB1dFswXSA9IF9lc2NhcGVTY2hlbWUob3V0cHV0WzBdKTsKICAgIHJldHVybiBvdXRwdXQuam9pbigiLyIpOwogIH0KCiAgLy8vIElmIFtwYXRoXSBzdGFydHMgd2l0aCBhIHZhbGlkIHNjaGVtZSwgZXNjYXBlIHRoZSBwZXJjZW50LgogIHN0YXRpYyBTdHJpbmcgX2VzY2FwZVNjaGVtZShTdHJpbmcgcGF0aCkgewogICAgaWYgKHBhdGgubGVuZ3RoID49IDIgJiYgX2lzQWxwaGFiZXRpY0NoYXJhY3RlcihwYXRoLmNvZGVVbml0QXQoMCkpKSB7CiAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgIGludCBjaGFyID0gcGF0aC5jb2RlVW5pdEF0KGkpOwogICAgICAgIGlmIChjaGFyID09IF9DT0xPTikgewogICAgICAgICAgcmV0dXJuICIke3BhdGguc3Vic3RyaW5nKDAsIGkpfSUzQSR7cGF0aC5zdWJzdHJpbmcoaSArIDEpfSI7CiAgICAgICAgfQogICAgICAgIGlmIChjaGFyID4gMTI3IHx8CiAgICAgICAgICAgICgoX3NjaGVtZVRhYmxlW2NoYXIgPj4gNF0gJiAoMSA8PCAoY2hhciAmIDB4MGYpKSkgPT0gMCkpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhdGg7CiAgfQoKICBVcmkgcmVzb2x2ZShTdHJpbmcgcmVmZXJlbmNlKSB7CiAgICByZXR1cm4gcmVzb2x2ZVVyaShVcmkucGFyc2UocmVmZXJlbmNlKSk7CiAgfQoKICBVcmkgcmVzb2x2ZVVyaShVcmkgcmVmZXJlbmNlKSB7CiAgICAvLyBGcm9tIFJGQyAzOTg2LgogICAgU3RyaW5nIHRhcmdldFNjaGVtZTsKICAgIFN0cmluZyB0YXJnZXRVc2VySW5mbyA9ICIiOwogICAgU3RyaW5nIHRhcmdldEhvc3Q7CiAgICBpbnQgdGFyZ2V0UG9ydDsKICAgIFN0cmluZyB0YXJnZXRQYXRoOwogICAgU3RyaW5nIHRhcmdldFF1ZXJ5OwogICAgaWYgKHJlZmVyZW5jZS5zY2hlbWUuaXNOb3RFbXB0eSkgewogICAgICB0YXJnZXRTY2hlbWUgPSByZWZlcmVuY2Uuc2NoZW1lOwogICAgICBpZiAocmVmZXJlbmNlLmhhc0F1dGhvcml0eSkgewogICAgICAgIHRhcmdldFVzZXJJbmZvID0gcmVmZXJlbmNlLnVzZXJJbmZvOwogICAgICAgIHRhcmdldEhvc3QgPSByZWZlcmVuY2UuaG9zdDsKICAgICAgICB0YXJnZXRQb3J0ID0gcmVmZXJlbmNlLmhhc1BvcnQgPyByZWZlcmVuY2UucG9ydCA6IG51bGw7CiAgICAgIH0KICAgICAgdGFyZ2V0UGF0aCA9IF9yZW1vdmVEb3RTZWdtZW50cyhyZWZlcmVuY2UucGF0aCk7CiAgICAgIGlmIChyZWZlcmVuY2UuaGFzUXVlcnkpIHsKICAgICAgICB0YXJnZXRRdWVyeSA9IHJlZmVyZW5jZS5xdWVyeTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0U2NoZW1lID0gdGhpcy5zY2hlbWU7CiAgICAgIGlmIChyZWZlcmVuY2UuaGFzQXV0aG9yaXR5KSB7CiAgICAgICAgdGFyZ2V0VXNlckluZm8gPSByZWZlcmVuY2UudXNlckluZm87CiAgICAgICAgdGFyZ2V0SG9zdCA9IHJlZmVyZW5jZS5ob3N0OwogICAgICAgIHRhcmdldFBvcnQgPQogICAgICAgICAgICBfbWFrZVBvcnQocmVmZXJlbmNlLmhhc1BvcnQgPyByZWZlcmVuY2UucG9ydCA6IG51bGwsIHRhcmdldFNjaGVtZSk7CiAgICAgICAgdGFyZ2V0UGF0aCA9IF9yZW1vdmVEb3RTZWdtZW50cyhyZWZlcmVuY2UucGF0aCk7CiAgICAgICAgaWYgKHJlZmVyZW5jZS5oYXNRdWVyeSkgdGFyZ2V0UXVlcnkgPSByZWZlcmVuY2UucXVlcnk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGFyZ2V0VXNlckluZm8gPSB0aGlzLl91c2VySW5mbzsKICAgICAgICB0YXJnZXRIb3N0ID0gdGhpcy5faG9zdDsKICAgICAgICB0YXJnZXRQb3J0ID0gdGhpcy5fcG9ydDsKICAgICAgICBpZiAocmVmZXJlbmNlLnBhdGggPT0gIiIpIHsKICAgICAgICAgIHRhcmdldFBhdGggPSB0aGlzLnBhdGg7CiAgICAgICAgICBpZiAocmVmZXJlbmNlLmhhc1F1ZXJ5KSB7CiAgICAgICAgICAgIHRhcmdldFF1ZXJ5ID0gcmVmZXJlbmNlLnF1ZXJ5OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGFyZ2V0UXVlcnkgPSB0aGlzLl9xdWVyeTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHJlZmVyZW5jZS5oYXNBYnNvbHV0ZVBhdGgpIHsKICAgICAgICAgICAgdGFyZ2V0UGF0aCA9IF9yZW1vdmVEb3RTZWdtZW50cyhyZWZlcmVuY2UucGF0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBSRkMgMzk4NiBiZWhhdmlvciBmb3IgbWVyZ2luZy4KICAgICAgICAgICAgaWYgKHRoaXMuaGFzRW1wdHlQYXRoKSB7CiAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0F1dGhvcml0eSkgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1NjaGVtZSkgewogICAgICAgICAgICAgICAgICAvLyBLZWVwIHRoZSBwYXRoIHJlbGF0aXZlIGlmIG5vIHNjaGVtZSBvciBhdXRob3JpdHkuCiAgICAgICAgICAgICAgICAgIHRhcmdldFBhdGggPSByZWZlcmVuY2UucGF0aDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBsZWFkaW5nIGRvdC1zZWdtZW50cyBpZiB0aGUgcGF0aCBpcyBwdXQKICAgICAgICAgICAgICAgICAgLy8gYmVuZWF0aCBhIHNjaGVtZS4KICAgICAgICAgICAgICAgICAgdGFyZ2V0UGF0aCA9IF9yZW1vdmVEb3RTZWdtZW50cyhyZWZlcmVuY2UucGF0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJGQyBhbGdvcml0aG0gZm9yIGJhc2Ugd2l0aCBhdXRob3JpdHkgYW5kIGVtcHR5IHBhdGguCiAgICAgICAgICAgICAgICB0YXJnZXRQYXRoID0gX3JlbW92ZURvdFNlZ21lbnRzKCIvIiArIHJlZmVyZW5jZS5wYXRoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdmFyIG1lcmdlZFBhdGggPSBfbWVyZ2VQYXRocyh0aGlzLnBhdGgsIHJlZmVyZW5jZS5wYXRoKTsKICAgICAgICAgICAgICBpZiAodGhpcy5oYXNTY2hlbWUgfHwgdGhpcy5oYXNBdXRob3JpdHkgfHwgdGhpcy5oYXNBYnNvbHV0ZVBhdGgpIHsKICAgICAgICAgICAgICAgIHRhcmdldFBhdGggPSBfcmVtb3ZlRG90U2VnbWVudHMobWVyZ2VkUGF0aCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIE5vbi1SRkMgMzk4NiBiZWhhdmlvci4KICAgICAgICAgICAgICAgIC8vIElmIGJvdGggYmFzZSBhbmQgcmVmZXJlbmNlIGFyZSByZWxhdGl2ZSBwYXRocywKICAgICAgICAgICAgICAgIC8vIGFsbG93IHRoZSBtZXJnZWQgcGF0aCB0byBzdGFydCB3aXRoICIuLiIuCiAgICAgICAgICAgICAgICAvLyBUaGUgUkZDIG9ubHkgc3BlY2lmaWVzIHRoZSBjYXNlIHdoZXJlIHRoZSBiYXNlIGhhcyBhIHNjaGVtZS4KICAgICAgICAgICAgICAgIHRhcmdldFBhdGggPSBfbm9ybWFsaXplUmVsYXRpdmVQYXRoKAogICAgICAgICAgICAgICAgICAgIG1lcmdlZFBhdGgsIHRoaXMuaGFzU2NoZW1lIHx8IHRoaXMuaGFzQXV0aG9yaXR5KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChyZWZlcmVuY2UuaGFzUXVlcnkpIHRhcmdldFF1ZXJ5ID0gcmVmZXJlbmNlLnF1ZXJ5OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgU3RyaW5nIGZyYWdtZW50ID0gcmVmZXJlbmNlLmhhc0ZyYWdtZW50ID8gcmVmZXJlbmNlLmZyYWdtZW50IDogbnVsbDsKICAgIHJldHVybiBfVXJpLl9pbnRlcm5hbCh0YXJnZXRTY2hlbWUsIHRhcmdldFVzZXJJbmZvLCB0YXJnZXRIb3N0LCB0YXJnZXRQb3J0LAogICAgICAgIHRhcmdldFBhdGgsIHRhcmdldFF1ZXJ5LCBmcmFnbWVudCk7CiAgfQoKICBib29sIGdldCBoYXNTY2hlbWUgPT4gc2NoZW1lLmlzTm90RW1wdHk7CgogIGJvb2wgZ2V0IGhhc0F1dGhvcml0eSA9PiBfaG9zdCAhPSBudWxsOwoKICBib29sIGdldCBoYXNQb3J0ID0+IF9wb3J0ICE9IG51bGw7CgogIGJvb2wgZ2V0IGhhc1F1ZXJ5ID0+IF9xdWVyeSAhPSBudWxsOwoKICBib29sIGdldCBoYXNGcmFnbWVudCA9PiBfZnJhZ21lbnQgIT0gbnVsbDsKCiAgYm9vbCBnZXQgaGFzRW1wdHlQYXRoID0+IHBhdGguaXNFbXB0eTsKCiAgYm9vbCBnZXQgaGFzQWJzb2x1dGVQYXRoID0+IHBhdGguc3RhcnRzV2l0aCgnLycpOwoKICBTdHJpbmcgZ2V0IG9yaWdpbiB7CiAgICBpZiAoc2NoZW1lID09ICIiKSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoIkNhbm5vdCB1c2Ugb3JpZ2luIHdpdGhvdXQgYSBzY2hlbWU6ICR0aGlzIik7CiAgICB9CiAgICBpZiAoc2NoZW1lICE9ICJodHRwIiAmJiBzY2hlbWUgIT0gImh0dHBzIikgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKAogICAgICAgICAgIk9yaWdpbiBpcyBvbmx5IGFwcGxpY2FibGUgc2NoZW1lcyBodHRwIGFuZCBodHRwczogJHRoaXMiKTsKICAgIH0KICAgIGlmIChfaG9zdCA9PSBudWxsIHx8IF9ob3N0ID09ICIiKSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoCiAgICAgICAgICAiQSAkc2NoZW1lOiBVUkkgc2hvdWxkIGhhdmUgYSBub24tZW1wdHkgaG9zdCBuYW1lOiAkdGhpcyIpOwogICAgfQogICAgaWYgKF9wb3J0ID09IG51bGwpIHJldHVybiAiJHNjaGVtZTovLyRfaG9zdCI7CiAgICByZXR1cm4gIiRzY2hlbWU6Ly8kX2hvc3Q6JF9wb3J0IjsKICB9CgogIFN0cmluZyB0b0ZpbGVQYXRoKHtib29sIHdpbmRvd3N9KSB7CiAgICBpZiAoc2NoZW1lICE9ICIiICYmIHNjaGVtZSAhPSAiZmlsZSIpIHsKICAgICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhICRzY2hlbWUgVVJJIik7CiAgICB9CiAgICBpZiAocXVlcnkgIT0gIiIpIHsKICAgICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdpdGggYSBxdWVyeSBjb21wb25lbnQiKTsKICAgIH0KICAgIGlmIChmcmFnbWVudCAhPSAiIikgewogICAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIGZyYWdtZW50IGNvbXBvbmVudCIpOwogICAgfQogICAgd2luZG93cyA/Pz0gX2lzV2luZG93czsKICAgIHJldHVybiB3aW5kb3dzID8gX3RvV2luZG93c0ZpbGVQYXRoKHRoaXMpIDogX3RvRmlsZVBhdGgoKTsKICB9CgogIFN0cmluZyBfdG9GaWxlUGF0aCgpIHsKICAgIGlmIChoYXNBdXRob3JpdHkgJiYgaG9zdCAhPSAiIikgewogICAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgIkNhbm5vdCBleHRyYWN0IGEgbm9uLVdpbmRvd3MgZmlsZSBwYXRoIGZyb20gYSBmaWxlIFVSSSAiCiAgICAgICAgICAid2l0aCBhbiBhdXRob3JpdHkiKTsKICAgIH0KICAgIC8vIFVzZSBwYXRoIHNlZ21lbnRzIHRvIGhhdmUgYW55IGVzY2FwZXMgdW5lc2NhcGVkLgogICAgdmFyIHBhdGhTZWdtZW50cyA9IHRoaXMucGF0aFNlZ21lbnRzOwogICAgX2NoZWNrTm9uV2luZG93c1BhdGhSZXNlcnZlZENoYXJhY3RlcnMocGF0aFNlZ21lbnRzLCBmYWxzZSk7CiAgICB2YXIgcmVzdWx0ID0gU3RyaW5nQnVmZmVyKCk7CiAgICBpZiAoaGFzQWJzb2x1dGVQYXRoKSByZXN1bHQud3JpdGUoIi8iKTsKICAgIHJlc3VsdC53cml0ZUFsbChwYXRoU2VnbWVudHMsICIvIik7CiAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF90b1dpbmRvd3NGaWxlUGF0aChVcmkgdXJpKSB7CiAgICBib29sIGhhc0RyaXZlTGV0dGVyID0gZmFsc2U7CiAgICB2YXIgc2VnbWVudHMgPSB1cmkucGF0aFNlZ21lbnRzOwogICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDAgJiYKICAgICAgICBzZWdtZW50c1swXS5sZW5ndGggPT0gMiAmJgogICAgICAgIHNlZ21lbnRzWzBdLmNvZGVVbml0QXQoMSkgPT0gX0NPTE9OKSB7CiAgICAgIF9jaGVja1dpbmRvd3NEcml2ZUxldHRlcihzZWdtZW50c1swXS5jb2RlVW5pdEF0KDApLCBmYWxzZSk7CiAgICAgIF9jaGVja1dpbmRvd3NQYXRoUmVzZXJ2ZWRDaGFyYWN0ZXJzKHNlZ21lbnRzLCBmYWxzZSwgMSk7CiAgICAgIGhhc0RyaXZlTGV0dGVyID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIF9jaGVja1dpbmRvd3NQYXRoUmVzZXJ2ZWRDaGFyYWN0ZXJzKHNlZ21lbnRzLCBmYWxzZSwgMCk7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gU3RyaW5nQnVmZmVyKCk7CiAgICBpZiAodXJpLmhhc0Fic29sdXRlUGF0aCAmJiAhaGFzRHJpdmVMZXR0ZXIpIHJlc3VsdC53cml0ZShyIlwiKTsKICAgIGlmICh1cmkuaGFzQXV0aG9yaXR5KSB7CiAgICAgIHZhciBob3N0ID0gdXJpLmhvc3Q7CiAgICAgIGlmIChob3N0LmlzTm90RW1wdHkpIHsKICAgICAgICByZXN1bHQud3JpdGUociJcIik7CiAgICAgICAgcmVzdWx0LndyaXRlKGhvc3QpOwogICAgICAgIHJlc3VsdC53cml0ZShyIlwiKTsKICAgICAgfQogICAgfQogICAgcmVzdWx0LndyaXRlQWxsKHNlZ21lbnRzLCByIlwiKTsKICAgIGlmIChoYXNEcml2ZUxldHRlciAmJiBzZWdtZW50cy5sZW5ndGggPT0gMSkgcmVzdWx0LndyaXRlKHIiXCIpOwogICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogIH0KCiAgYm9vbCBnZXQgX2lzUGF0aEFic29sdXRlIHsKICAgIHJldHVybiBwYXRoICE9IG51bGwgJiYgcGF0aC5zdGFydHNXaXRoKCcvJyk7CiAgfQoKICB2b2lkIF93cml0ZUF1dGhvcml0eShTdHJpbmdTaW5rIHNzKSB7CiAgICBpZiAoX3VzZXJJbmZvLmlzTm90RW1wdHkpIHsKICAgICAgc3Mud3JpdGUoX3VzZXJJbmZvKTsKICAgICAgc3Mud3JpdGUoIkAiKTsKICAgIH0KICAgIGlmIChfaG9zdCAhPSBudWxsKSBzcy53cml0ZShfaG9zdCk7CiAgICBpZiAoX3BvcnQgIT0gbnVsbCkgewogICAgICBzcy53cml0ZSgiOiIpOwogICAgICBzcy53cml0ZShfcG9ydCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBBY2Nlc3MgdGhlIHN0cnVjdHVyZSBvZiBhIGBkYXRhOmAgVVJJLgogICAqCiAgICogUmV0dXJucyBhIFtVcmlEYXRhXSBvYmplY3QgZm9yIGBkYXRhOmAgVVJJcyBhbmQgYG51bGxgIGZvciBhbGwgb3RoZXIKICAgKiBVUklzLgogICAqIFRoZSBbVXJpRGF0YV0gb2JqZWN0IGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgbWVkaWEgdHlwZSBhbmQgZGF0YQogICAqIG9mIGEgYGRhdGE6YCBVUkkuCiAgICovCiAgVXJpRGF0YSBnZXQgZGF0YSA9PiAoc2NoZW1lID09ICJkYXRhIikgPyBVcmlEYXRhLmZyb21VcmkodGhpcykgOiBudWxsOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gX3RleHQgPz89IF9pbml0aWFsaXplVGV4dCgpOwogIH0KCiAgU3RyaW5nIF9pbml0aWFsaXplVGV4dCgpIHsKICAgIGFzc2VydChfdGV4dCA9PSBudWxsKTsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IFN0cmluZ0J1ZmZlcigpOwogICAgaWYgKHNjaGVtZS5pc05vdEVtcHR5KSBzYi4ud3JpdGUoc2NoZW1lKS4ud3JpdGUoIjoiKTsKICAgIGlmIChoYXNBdXRob3JpdHkgfHwgKHNjaGVtZSA9PSAiZmlsZSIpKSB7CiAgICAgIC8vIEZpbGUgVVJJUyBhbHdheXMgaGF2ZSB0aGUgYXV0aG9yaXR5LCBldmVuIGlmIGl0IGlzIGVtcHR5LgogICAgICAvLyBUaGUgZW1wdHkgVVJJIG1lYW5zICJsb2NhbGhvc3QiLgogICAgICBzYi53cml0ZSgiLy8iKTsKICAgICAgX3dyaXRlQXV0aG9yaXR5KHNiKTsKICAgIH0KICAgIHNiLndyaXRlKHBhdGgpOwogICAgaWYgKF9xdWVyeSAhPSBudWxsKSBzYi4ud3JpdGUoIj8iKS4ud3JpdGUoX3F1ZXJ5KTsKICAgIGlmIChfZnJhZ21lbnQgIT0gbnVsbCkgc2IuLndyaXRlKCIjIikuLndyaXRlKF9mcmFnbWVudCk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gb3RoZXIgaXMgVXJpICYmCiAgICAgICAgc2NoZW1lID09IG90aGVyLnNjaGVtZSAmJgogICAgICAgIGhhc0F1dGhvcml0eSA9PSBvdGhlci5oYXNBdXRob3JpdHkgJiYKICAgICAgICB1c2VySW5mbyA9PSBvdGhlci51c2VySW5mbyAmJgogICAgICAgIGhvc3QgPT0gb3RoZXIuaG9zdCAmJgogICAgICAgIHBvcnQgPT0gb3RoZXIucG9ydCAmJgogICAgICAgIHBhdGggPT0gb3RoZXIucGF0aCAmJgogICAgICAgIGhhc1F1ZXJ5ID09IG90aGVyLmhhc1F1ZXJ5ICYmCiAgICAgICAgcXVlcnkgPT0gb3RoZXIucXVlcnkgJiYKICAgICAgICBoYXNGcmFnbWVudCA9PSBvdGhlci5oYXNGcmFnbWVudCAmJgogICAgICAgIGZyYWdtZW50ID09IG90aGVyLmZyYWdtZW50OwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gX2hhc2hDb2RlQ2FjaGUgPz89IHRvU3RyaW5nKCkuaGFzaENvZGU7CiAgfQoKICBzdGF0aWMgTGlzdDxTdHJpbmc+IF9jcmVhdGVMaXN0KCkgPT4gPFN0cmluZz5bXTsKCiAgc3RhdGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gX3NwbGl0UXVlcnlTdHJpbmdBbGwoU3RyaW5nIHF1ZXJ5LAogICAgICB7RW5jb2RpbmcgZW5jb2RpbmcgPSB1dGY4fSkgewogICAgdmFyIHJlc3VsdCA9IDxTdHJpbmcsIExpc3Q8U3RyaW5nPj57fTsKICAgIGludCBpID0gMDsKICAgIGludCBzdGFydCA9IDA7CiAgICBpbnQgZXF1YWxzSW5kZXggPSAtMTsKCiAgICB2b2lkIHBhcnNlUGFpcihpbnQgc3RhcnQsIGludCBlcXVhbHNJbmRleCwgaW50IGVuZCkgewogICAgICBTdHJpbmcga2V5OwogICAgICBTdHJpbmcgdmFsdWU7CiAgICAgIGlmIChzdGFydCA9PSBlbmQpIHJldHVybjsKICAgICAgaWYgKGVxdWFsc0luZGV4IDwgMCkgewogICAgICAgIGtleSA9IF91cmlEZWNvZGUocXVlcnksIHN0YXJ0LCBlbmQsIGVuY29kaW5nLCB0cnVlKTsKICAgICAgICB2YWx1ZSA9ICIiOwogICAgICB9IGVsc2UgewogICAgICAgIGtleSA9IF91cmlEZWNvZGUocXVlcnksIHN0YXJ0LCBlcXVhbHNJbmRleCwgZW5jb2RpbmcsIHRydWUpOwogICAgICAgIHZhbHVlID0gX3VyaURlY29kZShxdWVyeSwgZXF1YWxzSW5kZXggKyAxLCBlbmQsIGVuY29kaW5nLCB0cnVlKTsKICAgICAgfQogICAgICByZXN1bHQucHV0SWZBYnNlbnQoa2V5LCBfY3JlYXRlTGlzdCkuYWRkKHZhbHVlKTsKICAgIH0KCiAgICB3aGlsZSAoaSA8IHF1ZXJ5Lmxlbmd0aCkgewogICAgICBpbnQgY2hhciA9IHF1ZXJ5LmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjaGFyID09IF9FUVVBTFMpIHsKICAgICAgICBpZiAoZXF1YWxzSW5kZXggPCAwKSBlcXVhbHNJbmRleCA9IGk7CiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSBfQU1QRVJTQU5EKSB7CiAgICAgICAgcGFyc2VQYWlyKHN0YXJ0LCBlcXVhbHNJbmRleCwgaSk7CiAgICAgICAgc3RhcnQgPSBpICsgMTsKICAgICAgICBlcXVhbHNJbmRleCA9IC0xOwogICAgICB9CiAgICAgIGkrKzsKICAgIH0KICAgIHBhcnNlUGFpcihzdGFydCwgZXF1YWxzSW5kZXgsIGkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGV4dGVybmFsIHN0YXRpYyBTdHJpbmcgX3VyaUVuY29kZShMaXN0PGludD4gY2Fub25pY2FsVGFibGUsIFN0cmluZyB0ZXh0LAogICAgICBFbmNvZGluZyBlbmNvZGluZywgYm9vbCBzcGFjZVRvUGx1cyk7CgogIC8qKgogICAqIENvbnZlcnQgYSBieXRlICgyIGNoYXJhY3RlciBoZXggc2VxdWVuY2UpIGluIHN0cmluZyBbc10gc3RhcnRpbmcKICAgKiBhdCBwb3NpdGlvbiBbcG9zXSB0byBpdHMgb3JkaW5hbCB2YWx1ZQogICAqLwogIHN0YXRpYyBpbnQgX2hleENoYXJQYWlyVG9CeXRlKFN0cmluZyBzLCBpbnQgcG9zKSB7CiAgICBpbnQgYnl0ZSA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewogICAgICB2YXIgY2hhckNvZGUgPSBzLmNvZGVVbml0QXQocG9zICsgaSk7CiAgICAgIGlmICgweDMwIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4MzkpIHsKICAgICAgICBieXRlID0gYnl0ZSAqIDE2ICsgY2hhckNvZGUgLSAweDMwOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIENoZWNrIHJhbmdlcyBBLUYgKDB4NDEtMHg0NikgYW5kIGEtZiAoMHg2MS0weDY2KS4KICAgICAgICBjaGFyQ29kZSB8PSAweDIwOwogICAgICAgIGlmICgweDYxIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4NjYpIHsKICAgICAgICAgIGJ5dGUgPSBieXRlICogMTYgKyBjaGFyQ29kZSAtIDB4NTc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgVVJMIGVuY29kaW5nIik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gYnl0ZTsKICB9CgogIC8qKgogICAqIFVyaS1kZWNvZGUgYSBwZXJjZW50LWVuY29kZWQgc3RyaW5nLgogICAqCiAgICogSXQgdW5lc2NhcGVzIHRoZSBzdHJpbmcgW3RleHRdIGFuZCByZXR1cm5zIHRoZSB1bmVzY2FwZWQgc3RyaW5nLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSBKYXZhU2NyaXB0LWZ1bmN0aW9uIGBkZWNvZGVVUklgLgogICAqCiAgICogSWYgW3BsdXNUb1NwYWNlXSBpcyBgdHJ1ZWAsIHBsdXMgY2hhcmFjdGVycyB3aWxsIGJlIGNvbnZlcnRlZCB0byBzcGFjZXMuCiAgICoKICAgKiBUaGUgZGVjb2RlciB3aWxsIGNyZWF0ZSBhIGJ5dGUtbGlzdCBvZiB0aGUgcGVyY2VudC1lbmNvZGVkIHBhcnRzLCBhbmQgdGhlbgogICAqIGRlY29kZSB0aGUgYnl0ZS1saXN0IHVzaW5nIFtlbmNvZGluZ10uIFRoZSBkZWZhdWx0IGVuY29kaW5ncyBVVEYtOC4KICAgKi8KICBzdGF0aWMgU3RyaW5nIF91cmlEZWNvZGUoCiAgICAgIFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIEVuY29kaW5nIGVuY29kaW5nLCBib29sIHBsdXNUb1NwYWNlKSB7CiAgICBhc3NlcnQoMCA8PSBzdGFydCk7CiAgICBhc3NlcnQoc3RhcnQgPD0gZW5kKTsKICAgIGFzc2VydChlbmQgPD0gdGV4dC5sZW5ndGgpOwogICAgYXNzZXJ0KGVuY29kaW5nICE9IG51bGwpOwogICAgLy8gRmlyc3QgY2hlY2sgd2hldGhlciB0aGVyZSBpcyBhbnkgY2hhcmFjdGVycyB3aGljaCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcuCiAgICBib29sIHNpbXBsZSA9IHRydWU7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgY29kZVVuaXQgPSB0ZXh0LmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjb2RlVW5pdCA+IDEyNyB8fAogICAgICAgICAgY29kZVVuaXQgPT0gX1BFUkNFTlQgfHwKICAgICAgICAgIChwbHVzVG9TcGFjZSAmJiBjb2RlVW5pdCA9PSBfUExVUykpIHsKICAgICAgICBzaW1wbGUgPSBmYWxzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgTGlzdDxpbnQ+IGJ5dGVzOwogICAgaWYgKHNpbXBsZSkgewogICAgICBpZiAodXRmOCA9PSBlbmNvZGluZyB8fCBsYXRpbjEgPT0gZW5jb2RpbmcgfHwgYXNjaWkgPT0gZW5jb2RpbmcpIHsKICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnl0ZXMgPSB0ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKS5jb2RlVW5pdHM7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGJ5dGVzID0gTGlzdCgpOwogICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgIHZhciBjb2RlVW5pdCA9IHRleHQuY29kZVVuaXRBdChpKTsKICAgICAgICBpZiAoY29kZVVuaXQgPiAxMjcpIHsKICAgICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoIklsbGVnYWwgcGVyY2VudCBlbmNvZGluZyBpbiBVUkkiKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvZGVVbml0ID09IF9QRVJDRU5UKSB7CiAgICAgICAgICBpZiAoaSArIDMgPiB0ZXh0Lmxlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCdUcnVuY2F0ZWQgVVJJJyk7CiAgICAgICAgICB9CiAgICAgICAgICBieXRlcy5hZGQoX2hleENoYXJQYWlyVG9CeXRlKHRleHQsIGkgKyAxKSk7CiAgICAgICAgICBpICs9IDI7CiAgICAgICAgfSBlbHNlIGlmIChwbHVzVG9TcGFjZSAmJiBjb2RlVW5pdCA9PSBfUExVUykgewogICAgICAgICAgYnl0ZXMuYWRkKF9TUEFDRSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJ5dGVzLmFkZChjb2RlVW5pdCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZW5jb2RpbmcuZGVjb2RlKGJ5dGVzKTsKICB9CgogIHN0YXRpYyBib29sIF9pc0FscGhhYmV0aWNDaGFyYWN0ZXIoaW50IGNvZGVVbml0KSB7CiAgICB2YXIgbG93ZXJDYXNlID0gY29kZVVuaXQgfCAweDIwOwogICAgcmV0dXJuIChfTE9XRVJfQ0FTRV9BIDw9IGxvd2VyQ2FzZSAmJiBsb3dlckNhc2UgPD0gX0xPV0VSX0NBU0VfWik7CiAgfQoKICBzdGF0aWMgYm9vbCBfaXNVbnJlc2VydmVkQ2hhcihpbnQgY2hhcikgewogICAgcmV0dXJuIGNoYXIgPCAxMjcgJiYKICAgICAgICAoKF91bnJlc2VydmVkVGFibGVbY2hhciA+PiA0XSAmICgxIDw8IChjaGFyICYgMHgwZikpKSAhPSAwKTsKICB9CgogIC8vIFRhYmxlcyBvZiBjaGFyLWNvZGVzIG9yZ2FuaXplZCBhcyBhIGJpdCB2ZWN0b3Igb2YgMTI4IGJpdHMgd2hlcmUKICAvLyBlYWNoIGJpdCBpbmRpY2F0ZSB3aGV0aGVyIGEgY2hhcmFjdGVyIGNvZGUgb24gdGhlIDAtMTI3IG5lZWRzIHRvCiAgLy8gYmUgZXNjYXBlZCBvciBub3QuCgogIC8vIFRoZSB1bnJlc2VydmVkIGNoYXJhY3RlcnMgb2YgUkZDIDM5ODYuCiAgc3RhdGljIGNvbnN0IF91bnJlc2VydmVkVGFibGUgPSA8aW50PlsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgTVNCCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CiAgICAweDAwMDAsIC8vIDB4MDAgLSAweDBmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS4KICAgIDB4NjAwMCwgLy8gMHgyMCAtIDB4MmYgIDAwMDAwMDAwMDAwMDAxMTAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIDAxMjM0NTY3ODkKICAgIDB4MDNmZiwgLy8gMHgzMCAtIDB4M2YgIDExMTExMTExMTEwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBBQkNERUZHSElKS0xNTk8KICAgIDB4ZmZmZSwgLy8gMHg0MCAtIDB4NGYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFBRUlNUVVZXWFlaICAgIF8KICAgIDB4ODdmZiwgLy8gMHg1MCAtIDB4NWYgIDExMTExMTExMTExMDAwMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBhYmNkZWZnaGlqa2xtbm8KICAgIDB4ZmZmZSwgLy8gMHg2MCAtIDB4NmYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHBxcnN0dXZ3eHl6ICAgfgogICAgMHg0N2ZmLCAvLyAweDcwIC0gMHg3ZiAgMTExMTExMTExMTEwMDAxMAogIF07CgogIC8vIFRoZSB1bnJlc2VydmVkIGNoYXJhY3RlcnMgb2YgUkZDIDIzOTYuCiAgc3RhdGljIGNvbnN0IF91bnJlc2VydmVkMjM5NlRhYmxlID0gPGludD5bCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgMHgwMDAwLCAvLyAweDAwIC0gMHgwZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICEgICAgICcoKSogIC0uCiAgICAweDY3ODIsIC8vIDB4MjAgLSAweDJmICAwMTAwMDAwMTExMTAwMTEwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2Nzg5CiAgICAweDAzZmYsIC8vIDB4MzAgLSAweDNmICAxMTExMTExMTExMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgQUJDREVGR0hJSktMTU5PCiAgICAweGZmZmUsIC8vIDB4NDAgLSAweDRmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBQUVJTVFVWV1hZWiAgICBfCiAgICAweDg3ZmYsIC8vIDB4NTAgLSAweDVmICAxMTExMTExMTExMTAwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYWJjZGVmZ2hpamtsbW5vCiAgICAweGZmZmUsIC8vIDB4NjAgLSAweDZmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBwcXJzdHV2d3h5eiAgIH4KICAgIDB4NDdmZiwgLy8gMHg3MCAtIDB4N2YgIDExMTExMTExMTExMDAwMTAKICBdOwoKICAvLyBUYWJsZSBvZiByZXNlcnZlZCBjaGFyYWN0ZXJzIHNwZWNpZmllZCBieSBFQ01BU2NyaXB0IDUuCiAgc3RhdGljIGNvbnN0IF9lbmNvZGVGdWxsVGFibGUgPSA8aW50PlsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgTVNCCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CiAgICAweDAwMDAsIC8vIDB4MDAgLSAweDBmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgISAjJCAmJygpKissLS4vCiAgICAweGZmZGEsIC8vIDB4MjAgLSAweDJmICAwMTAxMTAxMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2Nzg5OjsgPSA/CiAgICAweGFmZmYsIC8vIDB4MzAgLSAweDNmICAxMTExMTExMTExMTEwMTAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBAQUJDREVGR0hJSktMTU5PCiAgICAweGZmZmYsIC8vIDB4NDAgLSAweDRmICAxMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBQUVJTVFVWV1hZWiAgICBfCiAgICAweDg3ZmYsIC8vIDB4NTAgLSAweDVmICAxMTExMTExMTExMTAwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYWJjZGVmZ2hpamtsbW5vCiAgICAweGZmZmUsIC8vIDB4NjAgLSAweDZmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBwcXJzdHV2d3h5eiAgIH4KICAgIDB4NDdmZiwgLy8gMHg3MCAtIDB4N2YgIDExMTExMTExMTExMDAwMTAKICBdOwoKICAvLyBDaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhlIHNjaGVtZS4KICBzdGF0aWMgY29uc3QgX3NjaGVtZVRhYmxlID0gPGludD5bCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgMHgwMDAwLCAvLyAweDAwIC0gMHgwZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC0uCiAgICAweDY4MDAsIC8vIDB4MjAgLSAweDJmICAwMDAwMDAwMDAwMDEwMTEwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2Nzg5CiAgICAweDAzZmYsIC8vIDB4MzAgLSAweDNmICAxMTExMTExMTExMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgQUJDREVGR0hJSktMTU5PCiAgICAweGZmZmUsIC8vIDB4NDAgLSAweDRmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBQUVJTVFVWV1hZWgogICAgMHgwN2ZmLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTExMTEwMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFiY2RlZmdoaWprbG1ubwogICAgMHhmZmZlLCAvLyAweDYwIC0gMHg2ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dnd4eXoKICAgIDB4MDdmZiwgLy8gMHg3MCAtIDB4N2YgIDExMTExMTExMTExMDAwMTAKICBdOwoKICAvLyBDaGFyYWN0ZXJzIGFsbG93ZWQgaW4gc2NoZW1lIGV4Y2VwdCBmb3IgdXBwZXIgY2FzZSBsZXR0ZXJzLgogIHN0YXRpYyBjb25zdCBfc2NoZW1lTG93ZXJUYWJsZSA9IDxpbnQ+WwogICAgLy8gICAgICAgICAgICAgICAgICAgICBMU0IgICAgICAgICAgICBNU0IKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIDB4MDAwMCwgLy8gMHgxMCAtIDB4MWYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAtLgogICAgMHg2ODAwLCAvLyAweDIwIC0gMHgyZiAgMDAwMDAwMDAwMDAxMDExMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgMDEyMzQ1Njc4OQogICAgMHgwM2ZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTExMTAwMDAwMAogICAgLy8KICAgIDB4MDAwMCwgLy8gMHg0MCAtIDB4NGYgIDAxMTExMTExMTExMTExMTEKICAgIC8vCiAgICAweDAwMDAsIC8vIDB4NTAgLSAweDVmICAxMTExMTExMTExMTAwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYWJjZGVmZ2hpamtsbW5vCiAgICAweGZmZmUsIC8vIDB4NjAgLSAweDZmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBwcXJzdHV2d3h5egogICAgMHgwN2ZmLCAvLyAweDcwIC0gMHg3ZiAgMTExMTExMTExMTEwMDAxMAogIF07CgogIC8vIFN1YiBkZWxpbWl0ZXIgY2hhcmFjdGVycyBjb21iaW5lZCB3aXRoIHVucmVzZXJ2ZWQgYXMgb2YgMzk4Ni4KICAvLyBzdWItZGVsaW1zICA9ICIhIiAvICIkIiAvICImIiAvICInIiAvICIoIiAvICIpIgogIC8vICAgICAgICAgLyAiKiIgLyAiKyIgLyAiLCIgLyAiOyIgLyAiPSIKICAvLyBSRkMgMzk4NiBzZWN0aW9uIDIuMy4KICAvLyB1bnJlc2VydmVkICA9IEFMUEhBIC8gRElHSVQgLyAiLSIgLyAiLiIgLyAiXyIgLyAifiIKICBzdGF0aWMgY29uc3QgX3N1YkRlbGltaXRlcnNUYWJsZSA9IDxpbnQ+WwogICAgLy8gICAgICAgICAgICAgICAgICAgICBMU0IgICAgICAgICAgICBNU0IKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIDB4MDAwMCwgLy8gMHgxMCAtIDB4MWYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAhICAkICYnKCkqKywtLgogICAgMHg3ZmQyLCAvLyAweDIwIC0gMHgyZiAgMDEwMDEwMTExMTExMTExMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgMDEyMzQ1Njc4OSA7ID0KICAgIDB4MmJmZiwgLy8gMHgzMCAtIDB4M2YgIDExMTExMTExMTEwMTAxMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBBQkNERUZHSElKS0xNTk8KICAgIDB4ZmZmZSwgLy8gMHg0MCAtIDB4NGYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFBRUlNUVVZXWFlaICAgIF8KICAgIDB4ODdmZiwgLy8gMHg1MCAtIDB4NWYgIDExMTExMTExMTExMDAwMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBhYmNkZWZnaGlqa2xtbm8KICAgIDB4ZmZmZSwgLy8gMHg2MCAtIDB4NmYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHBxcnN0dXZ3eHl6ICAgfgogICAgMHg0N2ZmLCAvLyAweDcwIC0gMHg3ZiAgMTExMTExMTExMTEwMDAxMAogIF07CgogIC8vIEdlbmVyYWwgZGVsaW1pdGVyIGNoYXJhY3RlcnMsIFJGQyAzOTg2IHNlY3Rpb24gMi4yLgogIC8vIGdlbi1kZWxpbXMgID0gIjoiIC8gIi8iIC8gIj8iIC8gIiMiIC8gIlsiIC8gIl0iIC8gIkAiCiAgLy8KICBzdGF0aWMgY29uc3QgX2dlbkRlbGltaXRlcnNUYWJsZSA9IDxpbnQ+WwogICAgLy8gICAgICAgICAgICAgICAgICAgICBMU0IgICAgICAgICAgICBNU0IKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIDB4MDAwMCwgLy8gMHgxMCAtIDB4MWYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgIC8KICAgIDB4ODAwOCwgLy8gMHgyMCAtIDB4MmYgIDAwMDEwMDAwMDAwMDAwMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgID8KICAgIDB4ODQwMCwgLy8gMHgzMCAtIDB4M2YgIDAwMDAwMDAwMDAxMDAwMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIEAKICAgIDB4MDAwMSwgLy8gMHg0MCAtIDB4NGYgIDEwMDAwMDAwMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBdCiAgICAweDI4MDAsIC8vIDB4NTAgLSAweDVmICAwMDAwMDAwMDAwMDEwMTAwCiAgICAvLwogICAgMHgwMDAwLCAvLyAweDYwIC0gMHg2ZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgLy8KICAgIDB4MDAwMCwgLy8gMHg3MCAtIDB4N2YgIDAwMDAwMDAwMDAwMDAwMDAKICBdOwoKICAvLyBDaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhlIHVzZXJpbmZvIGFzIG9mIFJGQyAzOTg2LgogIC8vIFJGQyAzOTg2IEFwcGVuZGl4IEEKICAvLyB1c2VyaW5mbyA9ICooIHVucmVzZXJ2ZWQgLyBwY3QtZW5jb2RlZCAvIHN1Yi1kZWxpbXMgLyAnOicpCiAgc3RhdGljIGNvbnN0IF91c2VyaW5mb1RhYmxlID0gPGludD5bCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgMHgwMDAwLCAvLyAweDAwIC0gMHgwZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICEgICQgJicoKSorLC0uCiAgICAweDdmZDIsIC8vIDB4MjAgLSAweDJmICAwMTAwMTAxMTExMTExMTEwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2Nzg5OjsgPQogICAgMHgyZmZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTExMTExMDEwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIEFCQ0RFRkdISUpLTE1OTwogICAgMHhmZmZlLCAvLyAweDQwIC0gMHg0ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgUFFSU1RVVldYWVogICAgXwogICAgMHg4N2ZmLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTExMTEwMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFiY2RlZmdoaWprbG1ubwogICAgMHhmZmZlLCAvLyAweDYwIC0gMHg2ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dnd4eXogICB+CiAgICAweDQ3ZmYsIC8vIDB4NzAgLSAweDdmICAxMTExMTExMTExMTAwMDEwCiAgXTsKCiAgLy8gQ2hhcmFjdGVycyBhbGxvd2VkIGluIHRoZSByZWctbmFtZSBhcyBvZiBSRkMgMzk4Ni4KICAvLyBSRkMgMzk4NiBBcHBlbmRpeCBBCiAgLy8gcmVnLW5hbWUgPSAqKCB1bnJlc2VydmVkIC8gcGN0LWVuY29kZWQgLyBzdWItZGVsaW1zICkKICBzdGF0aWMgY29uc3QgX3JlZ05hbWVUYWJsZSA9IDxpbnQ+WwogICAgLy8gICAgICAgICAgICAgICAgICAgICBMU0IgICAgICAgICAgICBNU0IKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIDB4MDAwMCwgLy8gMHgxMCAtIDB4MWYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAhICAkJSYnKCkqKywtLgogICAgMHg3ZmYyLCAvLyAweDIwIC0gMHgyZiAgMDEwMDExMTExMTExMTExMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgMDEyMzQ1Njc4OSA7ID0KICAgIDB4MmJmZiwgLy8gMHgzMCAtIDB4M2YgIDExMTExMTExMTEwMTAxMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBBQkNERUZHSElKS0xNTk8KICAgIDB4ZmZmZSwgLy8gMHg0MCAtIDB4NGYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFBRUlNUVVZXWFlaICAgIF8KICAgIDB4ODdmZiwgLy8gMHg1MCAtIDB4NWYgIDExMTExMTExMTExMDAwMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBhYmNkZWZnaGlqa2xtbm8KICAgIDB4ZmZmZSwgLy8gMHg2MCAtIDB4NmYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHBxcnN0dXZ3eHl6ICAgfgogICAgMHg0N2ZmLCAvLyAweDcwIC0gMHg3ZiAgMTExMTExMTExMTEwMDAxMAogIF07CgogIC8vIENoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGUgcGF0aCBhcyBvZiBSRkMgMzk4Ni4KICAvLyBSRkMgMzk4NiBzZWN0aW9uIDMuMy4KICAvLyBwY2hhciA9IHVucmVzZXJ2ZWQgLyBwY3QtZW5jb2RlZCAvIHN1Yi1kZWxpbXMgLyAiOiIgLyAiQCIKICBzdGF0aWMgY29uc3QgX3BhdGhDaGFyVGFibGUgPSA8aW50PlsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgTVNCCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CiAgICAweDAwMDAsIC8vIDB4MDAgLSAweDBmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgISAgJCAmJygpKissLS4KICAgIDB4N2ZkMiwgLy8gMHgyMCAtIDB4MmYgIDAxMDAxMDExMTExMTExMTAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIDAxMjM0NTY3ODk6OyA9CiAgICAweDJmZmYsIC8vIDB4MzAgLSAweDNmICAxMTExMTExMTExMTEwMTAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBAQUJDREVGR0hJSktMTU5PCiAgICAweGZmZmYsIC8vIDB4NDAgLSAweDRmICAxMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBQUVJTVFVWV1hZWiAgICBfCiAgICAweDg3ZmYsIC8vIDB4NTAgLSAweDVmICAxMTExMTExMTExMTAwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYWJjZGVmZ2hpamtsbW5vCiAgICAweGZmZmUsIC8vIDB4NjAgLSAweDZmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBwcXJzdHV2d3h5eiAgIH4KICAgIDB4NDdmZiwgLy8gMHg3MCAtIDB4N2YgIDExMTExMTExMTExMDAwMTAKICBdOwoKICAvLyBDaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhlIHBhdGggYXMgb2YgUkZDIDM5ODYuCiAgLy8gUkZDIDM5ODYgc2VjdGlvbiAzLjMgKmFuZCogc2xhc2guCiAgc3RhdGljIGNvbnN0IF9wYXRoQ2hhck9yU2xhc2hUYWJsZSA9IFsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgTVNCCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CiAgICAweDAwMDAsIC8vIDB4MDAgLSAweDBmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgISAgJCAmJygpKissLS4vCiAgICAweGZmZDIsIC8vIDB4MjAgLSAweDJmICAwMTAwMTAxMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2Nzg5OjsgPQogICAgMHgyZmZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTExMTExMDEwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgQEFCQ0RFRkdISUpLTE1OTwogICAgMHhmZmZmLCAvLyAweDQwIC0gMHg0ZiAgMTExMTExMTExMTExMTExMQoKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFBRUlNUVVZXWFlaICAgIF8KICAgIDB4ODdmZiwgLy8gMHg1MCAtIDB4NWYgIDExMTExMTExMTExMDAwMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBhYmNkZWZnaGlqa2xtbm8KICAgIDB4ZmZmZSwgLy8gMHg2MCAtIDB4NmYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHBxcnN0dXZ3eHl6ICAgfgogICAgMHg0N2ZmLCAvLyAweDcwIC0gMHg3ZiAgMTExMTExMTExMTEwMDAxMAogIF07CgogIC8vIENoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGUgcXVlcnkgYXMgb2YgUkZDIDM5ODYuCiAgLy8gUkZDIDM5ODYgc2VjdGlvbiAzLjQuCiAgLy8gcXVlcnkgPSAqKCBwY2hhciAvICIvIiAvICI/IiApCiAgc3RhdGljIGNvbnN0IF9xdWVyeUNoYXJUYWJsZSA9IFsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgTVNCCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CiAgICAweDAwMDAsIC8vIDB4MDAgLSAweDBmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgISAgJCAmJygpKissLS4vCiAgICAweGZmZDIsIC8vIDB4MjAgLSAweDJmICAwMTAwMTAxMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2Nzg5OjsgPSA/CiAgICAweGFmZmYsIC8vIDB4MzAgLSAweDNmICAxMTExMTExMTExMTEwMTAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBAQUJDREVGR0hJSktMTU5PCiAgICAweGZmZmYsIC8vIDB4NDAgLSAweDRmICAxMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBQUVJTVFVWV1hZWiAgICBfCiAgICAweDg3ZmYsIC8vIDB4NTAgLSAweDVmICAxMTExMTExMTExMTAwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYWJjZGVmZ2hpamtsbW5vCiAgICAweGZmZmUsIC8vIDB4NjAgLSAweDZmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBwcXJzdHV2d3h5eiAgIH4KICAgIDB4NDdmZiwgLy8gMHg3MCAtIDB4N2YgIDExMTExMTExMTExMDAwMTAKICBdOwoKICAvLyBDaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhlIFpvbmVJRCBhcyBvZiBSRkMgNjg3NC4KICAvLyBab25lSUQgPSAxKiggdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkICkKICBzdGF0aWMgY29uc3QgX3pvbmVJRFRhYmxlID0gPGludD5bCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgMHgwMDAwLCAvLyAweDAwIC0gMHgwZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICEgICQlJicoKSorLC0uCiAgICAweDYwMDAsIC8vIDB4MjAgLSAweDJmICAwMDAwMDAwMDAwMDAwMTEwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2Nzg5IDsgPQogICAgMHgwM2ZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTExMTAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIEFCQ0RFRkdISUpLTE1OTwogICAgMHhmZmZlLCAvLyAweDQwIC0gMHg0ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgUFFSU1RVVldYWVogICAgXwogICAgMHg4N2ZmLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTExMTEwMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFiY2RlZmdoaWprbG1ubwogICAgMHhmZmZlLCAvLyAweDYwIC0gMHg2ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dnd4eXogICB+CiAgICAweDQ3ZmYsIC8vIDB4NzAgLSAweDdmICAxMTExMTExMTExMTAwMDEwCiAgXTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRGF0YSBVUkkKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8qKgogKiBBIHdheSB0byBhY2Nlc3MgdGhlIHN0cnVjdHVyZSBvZiBhIGBkYXRhOmAgVVJJLgogKgogKiBEYXRhIFVSSXMgYXJlIG5vbi1oaWVyYXJjaGljYWwgVVJJcyB0aGF0IGNhbiBjb250YWluIGFueSBiaW5hcnkgZGF0YS4KICogVGhleSBhcmUgZGVmaW5lZCBieSBbUkZDIDIzOTddKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMzk3KS4KICoKICogVGhpcyBjbGFzcyBhbGxvd3MgcGFyc2luZyB0aGUgVVJJIHRleHQgYW5kIGV4dHJhY3RpbmcgaW5kaXZpZHVhbCBwYXJ0cyBvZiB0aGUKICogVVJJLCBhcyB3ZWxsIGFzIGJ1aWxkaW5nIHRoZSBVUkkgdGV4dCBmcm9tIHN0cnVjdHVyZWQgcGFydHMuCiAqLwpjbGFzcyBVcmlEYXRhIHsKICBzdGF0aWMgY29uc3QgaW50IF9ub1NjaGVtZSA9IC0xOwogIC8qKgogICAqIENvbnRhaW5zIHRoZSB0ZXh0IGNvbnRlbnQgb2YgYSBgZGF0YTpgIFVSSSwgd2l0aCBvciB3aXRob3V0IGEKICAgKiBsZWFkaW5nIGBkYXRhOmAuCiAgICoKICAgKiBJZiBbX3NlcGFyYXRvckluZGljZXNdIHN0YXJ0cyB3aXRoIGA0YCAodGhlIGluZGV4IG9mIHRoZSBgOmApLCB0aGVuCiAgICogdGhlcmUgaXMgYSBsZWFkaW5nIGBkYXRhOmAsIG90aGVyd2lzZSBbX3NlcGFyYXRvckluZGljZXNdIHN0YXJ0cyB3aXRoCiAgICogYC0xYC4KICAgKi8KICBmaW5hbCBTdHJpbmcgX3RleHQ7CgogIC8qKgogICAqIExpc3Qgb2YgdGhlIHNlcGFyYXRvcnMgKCc7JywgJz0nIGFuZCAnLCcpIGluIHRoZSB0ZXh0LgogICAqCiAgICogU3RhcnRzIHdpdGggdGhlIGluZGV4IG9mIHRoZSBgOmAgaW4gYGRhdGE6YCBvZiB0aGUgbWltZVR5cGUuCiAgICogVGhhdCBpcyBhbHdheXMgZWl0aGVyIC0xIG9yIDQsIGRlcGVuZGluZyBvbiB3aGV0aGVyIGBfdGV4dGAgaW5jbHVkZXMgdGhlCiAgICogYGRhdGE6YCBzY2hlbWUgb3Igbm90LgogICAqCiAgICogVGhlIGZpcnN0IHNwZXBhcmF0b3IgZW5kcyB0aGUgbWltZSB0eXBlLiBXZSBkb24ndCBib3RoZXIgd2l0aCBmaW5kaW5nCiAgICogdGhlICcvJyBpbnNpZGUgdGhlIG1pbWUgdHlwZS4KICAgKgogICAqIEVhY2ggdHdvIHNlcGFyYXRvcnMgYWZ0ZXIgdGhhdCBtYXJrcyBhIHBhcmFtZXRlciBrZXkgYW5kIHZhbHVlLgogICAqCiAgICogSWYgdGhlcmUgaXMgYSBzaW5nbGUgc2VwYXJhdG9yIGxlZnQsIGl0IGVuZHMgdGhlICJiYXNlNjQiIG1hcmtlci4KICAgKgogICAqIFNvIHRoZSBmb2xsb3dpbmcgc2VwYXJhdG9ycyBhcmUgZm91bmQgZm9yIGEgdGV4dDoKICAgKiBgYGAKICAgKiBkYXRhOnRleHQvcGxhaW47Zm9vPWJhcjtiYXNlNjQsQVJHTEVCQVJHTEU9CiAgICogICAgIF4gICAgICAgICAgXiAgIF4gICBeICAgICAgXgogICAqIGBgYAogICAqLwogIGZpbmFsIExpc3Q8aW50PiBfc2VwYXJhdG9ySW5kaWNlczsKCiAgLyoqCiAgICogQ2FjaGUgb2YgdGhlIHJlc3VsdCByZXR1cm5lZCBieSBbdXJpXS4KICAgKi8KICBVcmkgX3VyaUNhY2hlOwoKICBVcmlEYXRhLl8odGhpcy5fdGV4dCwgdGhpcy5fc2VwYXJhdG9ySW5kaWNlcywgdGhpcy5fdXJpQ2FjaGUpOwoKICAvLyBBdm9pZCBzaGFkb3dpbmcgYnkgYXJndW1lbnQuCiAgc3RhdGljIGNvbnN0IEJhc2U2NENvZGVjIF9iYXNlNjQgPSBiYXNlNjQ7CgogIC8qKgogICAqIENyZWF0ZXMgYSBgZGF0YTpgIFVSSSBjb250YWluaW5nIHRoZSBbY29udGVudF0gc3RyaW5nLgogICAqCiAgICogRXF1aXZhbGVudCB0byBgbmV3IFVyaS5kYXRhRnJvbVN0cmluZyguLi4pLmRhdGFgLCBidXQgbWF5CiAgICogYmUgbW9yZSBlZmZpY2llbnQgaWYgdGhlIFt1cmldIGl0c2VsZiBpc24ndCB1c2VkLgogICAqLwogIGZhY3RvcnkgVXJpRGF0YS5mcm9tU3RyaW5nKFN0cmluZyBjb250ZW50LAogICAgICB7U3RyaW5nIG1pbWVUeXBlLAogICAgICBFbmNvZGluZyBlbmNvZGluZywKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLAogICAgICBib29sIGJhc2U2NCA9IGZhbHNlfSkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IFN0cmluZ0J1ZmZlcigpOwogICAgTGlzdDxpbnQ+IGluZGljZXMgPSBbX25vU2NoZW1lXTsKICAgIFN0cmluZyBjaGFyc2V0TmFtZTsKICAgIFN0cmluZyBlbmNvZGluZ05hbWU7CiAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSBjaGFyc2V0TmFtZSA9IHBhcmFtZXRlcnNbImNoYXJzZXQiXTsKICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CiAgICAgIGlmIChjaGFyc2V0TmFtZSAhPSBudWxsKSB7CiAgICAgICAgZW5jb2RpbmcgPSBFbmNvZGluZy5nZXRCeU5hbWUoY2hhcnNldE5hbWUpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNoYXJzZXROYW1lID09IG51bGwpIHsKICAgICAgLy8gTm9uLW51bGwgb25seSBpZiBwYXJhbWV0ZXJzIGRvZXMgbm90IGNvbnRhaW4gImNoYXJzZXQiLgogICAgICBlbmNvZGluZ05hbWUgPSBlbmNvZGluZy5uYW1lOwogICAgfQogICAgZW5jb2RpbmcgPz89IGFzY2lpOwogICAgX3dyaXRlVXJpKG1pbWVUeXBlLCBlbmNvZGluZ05hbWUsIHBhcmFtZXRlcnMsIGJ1ZmZlciwgaW5kaWNlcyk7CiAgICBpbmRpY2VzLmFkZChidWZmZXIubGVuZ3RoKTsKICAgIGlmIChiYXNlNjQpIHsKICAgICAgYnVmZmVyLndyaXRlKCc7YmFzZTY0LCcpOwogICAgICBpbmRpY2VzLmFkZChidWZmZXIubGVuZ3RoIC0gMSk7CiAgICAgIGJ1ZmZlci53cml0ZShlbmNvZGluZy5mdXNlKF9iYXNlNjQpLmVuY29kZShjb250ZW50KSk7CiAgICB9IGVsc2UgewogICAgICBidWZmZXIud3JpdGUoJywnKTsKICAgICAgX3VyaUVuY29kZUJ5dGVzKF91cmljVGFibGUsIGVuY29kaW5nLmVuY29kZShjb250ZW50KSwgYnVmZmVyKTsKICAgIH0KICAgIHJldHVybiBVcmlEYXRhLl8oYnVmZmVyLnRvU3RyaW5nKCksIGluZGljZXMsIG51bGwpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIGBkYXRhOmAgVVJJIGNvbnRhaW5pbmcgYW4gZW5jb2Rpbmcgb2YgW2J5dGVzXS4KICAgKgogICAqIEVxdWl2YWxlbnQgdG8gYG5ldyBVcmkuZGF0YUZyb21CeXRlcyguLi4pLmRhdGFgLCBidXQgbWF5CiAgICogYmUgbW9yZSBlZmZpY2llbnQgaWYgdGhlIFt1cmldIGl0c2VsZiBpc24ndCB1c2VkLgogICAqLwogIGZhY3RvcnkgVXJpRGF0YS5mcm9tQnl0ZXMoTGlzdDxpbnQ+IGJ5dGVzLAogICAgICB7bWltZVR5cGUgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLAogICAgICBwZXJjZW50RW5jb2RlZCA9IGZhbHNlfSkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IFN0cmluZ0J1ZmZlcigpOwogICAgTGlzdDxpbnQ+IGluZGljZXMgPSBbX25vU2NoZW1lXTsKICAgIF93cml0ZVVyaShtaW1lVHlwZSwgbnVsbCwgcGFyYW1ldGVycywgYnVmZmVyLCBpbmRpY2VzKTsKICAgIGluZGljZXMuYWRkKGJ1ZmZlci5sZW5ndGgpOwogICAgaWYgKHBlcmNlbnRFbmNvZGVkKSB7CiAgICAgIGJ1ZmZlci53cml0ZSgnLCcpOwogICAgICBfdXJpRW5jb2RlQnl0ZXMoX3VyaWNUYWJsZSwgYnl0ZXMsIGJ1ZmZlcik7CiAgICB9IGVsc2UgewogICAgICBidWZmZXIud3JpdGUoJztiYXNlNjQsJyk7CiAgICAgIGluZGljZXMuYWRkKGJ1ZmZlci5sZW5ndGggLSAxKTsKICAgICAgX2Jhc2U2NC5lbmNvZGVyCiAgICAgICAgICAuc3RhcnRDaHVua2VkQ29udmVyc2lvbihTdHJpbmdDb252ZXJzaW9uU2luay5mcm9tU3RyaW5nU2luayhidWZmZXIpKQogICAgICAgICAgLmFkZFNsaWNlKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgsIHRydWUpOwogICAgfQoKICAgIHJldHVybiBVcmlEYXRhLl8oYnVmZmVyLnRvU3RyaW5nKCksIGluZGljZXMsIG51bGwpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIGBEYXRhVXJpYCBmcm9tIGEgW1VyaV0gd2hpY2ggbXVzdCBoYXZlIGBkYXRhYCBhcyBbVXJpLnNjaGVtZV0uCiAgICoKICAgKiBUaGUgW3VyaV0gbXVzdCBoYXZlIHNjaGVtZSBgZGF0YWAgYW5kIG5vIGF1dGhvcml0eSBvciBmcmFnbWVudCwKICAgKiBhbmQgdGhlIHBhdGggKGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBxdWVyeSwgaWYgdGhlcmUgaXMgb25lKSBtdXN0IGJlIHZhbGlkCiAgICogYXMgZGF0YSBVUkkgY29udGVudCB3aXRoIHRoZSBzYW1lIHJ1bGVzIGFzIFtwYXJzZV0uCiAgICovCiAgZmFjdG9yeSBVcmlEYXRhLmZyb21VcmkoVXJpIHVyaSkgewogICAgaWYgKHVyaS5zY2hlbWUgIT0gImRhdGEiKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IudmFsdWUodXJpLCAidXJpIiwgIlNjaGVtZSBtdXN0IGJlICdkYXRhJyIpOwogICAgfQogICAgaWYgKHVyaS5oYXNBdXRob3JpdHkpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvci52YWx1ZSh1cmksICJ1cmkiLCAiRGF0YSB1cmkgbXVzdCBub3QgaGF2ZSBhdXRob3JpdHkiKTsKICAgIH0KICAgIGlmICh1cmkuaGFzRnJhZ21lbnQpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICAgIHVyaSwgInVyaSIsICJEYXRhIHVyaSBtdXN0IG5vdCBoYXZlIGEgZnJhZ21lbnQgcGFydCIpOwogICAgfQogICAgaWYgKCF1cmkuaGFzUXVlcnkpIHsKICAgICAgcmV0dXJuIF9wYXJzZSh1cmkucGF0aCwgMCwgdXJpKTsKICAgIH0KICAgIC8vIEluY2x1ZGVzIHBhdGggYW5kIHF1ZXJ5IChhbmQgbGVhZGluZyAiZGF0YToiKS4KICAgIHJldHVybiBfcGFyc2UoIiR1cmkiLCA1LCB1cmkpOwogIH0KCiAgLyoqCiAgICogV3JpdGVzIHRoZSBpbml0aWFsIHBhcnQgb2YgYSBgZGF0YTpgIHVyaSwgZnJvbSBhZnRlciB0aGUgImRhdGE6IgogICAqIHVudGlsIGp1c3QgYmVmb3JlIHRoZSAnLCcgYmVmb3JlIHRoZSBkYXRhLCBvciBiZWZvcmUgYSBgO2Jhc2U2NCxgCiAgICogbWFya2VyLgogICAqCiAgICogT2YgYW4gW2luZGljZXNdIGxpc3QgaXMgcGFzc2VkLCBzZXBhcmF0b3IgaW5kaWNlcyBhcmUgc3RvcmVkIGluIHRoYXQKICAgKiBsaXN0LgogICAqLwogIHN0YXRpYyB2b2lkIF93cml0ZVVyaShTdHJpbmcgbWltZVR5cGUsIFN0cmluZyBjaGFyc2V0TmFtZSwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBMaXN0IGluZGljZXMpIHsKICAgIGlmIChtaW1lVHlwZSA9PSBudWxsIHx8IG1pbWVUeXBlID09ICJ0ZXh0L3BsYWluIikgewogICAgICBtaW1lVHlwZSA9ICIiOwogICAgfQogICAgaWYgKG1pbWVUeXBlLmlzRW1wdHkgfHwgaWRlbnRpY2FsKG1pbWVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIikpIHsKICAgICAgYnVmZmVyLndyaXRlKG1pbWVUeXBlKTsgLy8gQ29tbW9uIGNhc2VzIG5lZWQgbm8gZXNjYXBpbmcuCiAgICB9IGVsc2UgewogICAgICBpbnQgc2xhc2hJbmRleCA9IF92YWxpZGF0ZU1pbWVUeXBlKG1pbWVUeXBlKTsKICAgICAgaWYgKHNsYXNoSW5kZXggPCAwKSB7CiAgICAgICAgdGhyb3cgQXJndW1lbnRFcnJvci52YWx1ZShtaW1lVHlwZSwgIm1pbWVUeXBlIiwgIkludmFsaWQgTUlNRSB0eXBlIik7CiAgICAgIH0KICAgICAgYnVmZmVyLndyaXRlKF9VcmkuX3VyaUVuY29kZSgKICAgICAgICAgIF90b2tlbkNoYXJUYWJsZSwgbWltZVR5cGUuc3Vic3RyaW5nKDAsIHNsYXNoSW5kZXgpLCB1dGY4LCBmYWxzZSkpOwogICAgICBidWZmZXIud3JpdGUoIi8iKTsKICAgICAgYnVmZmVyLndyaXRlKF9VcmkuX3VyaUVuY29kZSgKICAgICAgICAgIF90b2tlbkNoYXJUYWJsZSwgbWltZVR5cGUuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxKSwgdXRmOCwgZmFsc2UpKTsKICAgIH0KICAgIGlmIChjaGFyc2V0TmFtZSAhPSBudWxsKSB7CiAgICAgIGlmIChpbmRpY2VzICE9IG51bGwpIHsKICAgICAgICBpbmRpY2VzLi5hZGQoYnVmZmVyLmxlbmd0aCkuLmFkZChidWZmZXIubGVuZ3RoICsgOCk7CiAgICAgIH0KICAgICAgYnVmZmVyLndyaXRlKCI7Y2hhcnNldD0iKTsKICAgICAgYnVmZmVyLndyaXRlKF9VcmkuX3VyaUVuY29kZShfdG9rZW5DaGFyVGFibGUsIGNoYXJzZXROYW1lLCB1dGY4LCBmYWxzZSkpOwogICAgfQogICAgcGFyYW1ldGVycz8uZm9yRWFjaCgoa2V5LCB2YWx1ZSkgewogICAgICBpZiAoa2V5LmlzRW1wdHkpIHsKICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKCIiLCAiUGFyYW1ldGVyIG5hbWVzIG11c3Qgbm90IGJlIGVtcHR5Iik7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlLmlzRW1wdHkpIHsKICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgICAgICAiIiwgIlBhcmFtZXRlciB2YWx1ZXMgbXVzdCBub3QgYmUgZW1wdHkiLCAncGFyYW1ldGVyc1siJGtleSJdJyk7CiAgICAgIH0KICAgICAgaWYgKGluZGljZXMgIT0gbnVsbCkgaW5kaWNlcy5hZGQoYnVmZmVyLmxlbmd0aCk7CiAgICAgIGJ1ZmZlci53cml0ZSgnOycpOwogICAgICAvLyBFbmNvZGUgYW55IG5vbi1SRkMyMDQ1LXRva2VuIGNoYXJhY3RlciBhbmQgYm90aCAnJScgYW5kICcjJy4KICAgICAgYnVmZmVyLndyaXRlKF9VcmkuX3VyaUVuY29kZShfdG9rZW5DaGFyVGFibGUsIGtleSwgdXRmOCwgZmFsc2UpKTsKICAgICAgaWYgKGluZGljZXMgIT0gbnVsbCkgaW5kaWNlcy5hZGQoYnVmZmVyLmxlbmd0aCk7CiAgICAgIGJ1ZmZlci53cml0ZSgnPScpOwogICAgICBidWZmZXIud3JpdGUoX1VyaS5fdXJpRW5jb2RlKF90b2tlbkNoYXJUYWJsZSwgdmFsdWUsIHV0ZjgsIGZhbHNlKSk7CiAgICB9KTsKICB9CgogIC8qKgogICAqIENoZWNrcyBtaW1lVHlwZSBpcyB2YWxpZC1pc2ggKGB0b2tlbiAnLycgdG9rZW5gKS4KICAgKgogICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzbGFzaCwgb3IgLTEgaWYgdGhlIG1pbWUgdHlwZSBpcyBub3QKICAgKiBjb25zaWRlcmVkIHZhbGlkLgogICAqCiAgICogQ3VycmVudGx5IG9ubHkgbG9va3MgZm9yIHNsYXNoZXMsIGFsbCBvdGhlciBjaGFyYWN0ZXJzIHdpbGwgYmUKICAgKiBwZXJjZW50LWVuY29kZWQgYXMgVVRGLTggaWYgbmVjZXNzYXJ5LgogICAqLwogIHN0YXRpYyBpbnQgX3ZhbGlkYXRlTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7CiAgICBpbnQgc2xhc2hJbmRleCA9IC0xOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW1lVHlwZS5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY2hhciA9IG1pbWVUeXBlLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjaGFyICE9IF9TTEFTSCkgY29udGludWU7CiAgICAgIGlmIChzbGFzaEluZGV4IDwgMCkgewogICAgICAgIHNsYXNoSW5kZXggPSBpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHJldHVybiBzbGFzaEluZGV4OwogIH0KCiAgLyoqCiAgICogUGFyc2VzIGEgc3RyaW5nIGFzIGEgYGRhdGFgIFVSSS4KICAgKgogICAqIFRoZSBzdHJpbmcgbXVzdCBoYXZlIHRoZSBmb3JtYXQ6CiAgICoKICAgKiBgYGAKICAgKiAnZGF0YTonICh0eXBlICcvJyBzdWJ0eXBlKT8gKCc7JyBhdHRyaWJ1dGUgJz0nIHZhbHVlKSogKCc7YmFzZTY0Jyk/ICcsJyBkYXRhCiAgICogYGBgYAogICAqCiAgICogd2hlcmUgYHR5cGVgLCBgc3VidHlwZWAsIGBhdHRyaWJ1dGVgIGFuZCBgdmFsdWVgIGFyZSBzcGVjaWZpZWQgaW4gUkZDLTIwNDUsCiAgICogYW5kIGBkYXRhYCBpcyBhIHNlcXVlbmNlIG9mIFVSSS1jaGFyYWN0ZXJzIChSRkMtMjM5NiBgdXJpY2ApLgogICAqCiAgICogVGhpcyBtZWFucyB0aGF0IGFsbCB0aGUgY2hhcmFjdGVycyBtdXN0IGJlIEFTQ0lJLCBidXQgdGhlIFVSSSBtYXkgY29udGFpbgogICAqIHBlcmNlbnQtZXNjYXBlcyBmb3Igbm9uLUFTQ0lJIGJ5dGUgdmFsdWVzIHRoYXQgbmVlZCBhbiBpbnRlcnByZXRhdGlvbgogICAqIHRvIGJlIGNvbnZlcnRlZCB0byB0aGUgY29ycmVzcG9uZGluZyBzdHJpbmcuCiAgICoKICAgKiBQYXJzaW5nIGNoZWNrcyB0aGF0IEJhc2U2NCBlbmNvZGVkIGRhdGEgaXMgdmFsaWQsIGFuZCBpdCBub3JtYWxpemVzIGl0CiAgICogdG8gdXNlIHRoZSBkZWZhdWx0IEJhc2U2NCBhbHBoYWJldCBhbmQgdG8gdXNlIHBhZGRpbmcuCiAgICogTm9uLUJhc2U2NCBkYXRhIGlzIGVzY2FwZWQgdXNpbmcgcGVyY2VudC1lc2NhcGVzIGFzIG5lY2Vzc2FyeSB0byBtYWtlCiAgICogaXQgdmFsaWQsIGFuZCBleGlzdGluZyBlc2NhcGVzIGFyZSBjYXNlIG5vcm1hbGl6ZWQuCiAgICoKICAgKiBBY2Nlc3NpbmcgdGhlIGluZGl2aWR1YWwgcGFydHMgbWF5IGZhaWwgbGF0ZXIgaWYgdGhleSB0dXJuIG91dCB0byBoYXZlCiAgICogY29udGVudCB0aGF0IGNhbid0IGJlIGRlY29kZWQgc3VjY2Vzc2Z1bGx5IGFzIGEgc3RyaW5nLCBmb3IgZXhhbXBsZSBpZgogICAqIGV4aXN0aW5nIHBlcmNlbnQgZXNjYXBlcyByZXByZXNlbnQgYnl0ZXMgdGhhdCBjYW5ub3QgYmUgZGVjb2RlZAogICAqIGJ5IHRoZSBjaG9zZW4gW0VuY29kaW5nXSAoc2VlIFtjb250ZW50QXNTdHJpbmddKS4KICAgKgogICAqIEEgW0Zvcm1hdEV4Y2VwdGlvbl0gaXMgdGhyb3duIGlmIFt1cmldIGlzIG5vdCBhIHZhbGlkIGRhdGEgVVJJLgogICAqLwogIHN0YXRpYyBVcmlEYXRhIHBhcnNlKFN0cmluZyB1cmkpIHsKICAgIGlmICh1cmkubGVuZ3RoID49IDUpIHsKICAgICAgaW50IGRhdGFEZWx0YSA9IF9zdGFydHNXaXRoRGF0YSh1cmksIDApOwogICAgICBpZiAoZGF0YURlbHRhID09IDApIHsKICAgICAgICAvLyBFeGFjdCBtYXRjaCBvbiAiZGF0YToiLgogICAgICAgIHJldHVybiBfcGFyc2UodXJpLCA1LCBudWxsKTsKICAgICAgfQogICAgICBpZiAoZGF0YURlbHRhID09IDB4MjApIHsKICAgICAgICAvLyBTdGFydHMgd2l0aCBhIG5vbi1ub3JtYWxpemVkICJkYXRhIiBzY2hlbWUgY29udGFpbmluZyB1cHBlci1jYXNlCiAgICAgICAgLy8gbGV0dGVycy4gUGFyc2UgYW55d2F5LCBidXQgdGhyb3cgYXdheSB0aGUgc2NoZW1lLgogICAgICAgIHJldHVybiBfcGFyc2UodXJpLnN1YnN0cmluZyg1KSwgMCwgbnVsbCk7CiAgICAgIH0KICAgIH0KICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiRG9lcyBub3Qgc3RhcnQgd2l0aCAnZGF0YTonIiwgdXJpLCAwKTsKICB9CgogIC8qKgogICAqIFRoZSBbVXJpXSB0aGF0IHRoaXMgYFVyaURhdGFgIGlzIGdpdmluZyBhY2Nlc3MgdG8uCiAgICoKICAgKiBSZXR1cm5zIGEgYFVyaWAgd2l0aCBzY2hlbWUgYGRhdGFgIGFuZCB0aGUgcmVtYWluZGVyIG9mIHRoZSBkYXRhIFVSSQogICAqIGFzIHBhdGguCiAgICovCiAgVXJpIGdldCB1cmkgewogICAgaWYgKF91cmlDYWNoZSAhPSBudWxsKSByZXR1cm4gX3VyaUNhY2hlOwogICAgU3RyaW5nIHBhdGggPSBfdGV4dDsKICAgIFN0cmluZyBxdWVyeTsKICAgIGludCBjb2xvbkluZGV4ID0gX3NlcGFyYXRvckluZGljZXNbMF07CiAgICBpbnQgcXVlcnlJbmRleCA9IF90ZXh0LmluZGV4T2YoJz8nLCBjb2xvbkluZGV4ICsgMSk7CiAgICBpbnQgZW5kID0gX3RleHQubGVuZ3RoOwogICAgaWYgKHF1ZXJ5SW5kZXggPj0gMCkgewogICAgICBxdWVyeSA9IF9VcmkuX25vcm1hbGl6ZU9yU3Vic3RyaW5nKAogICAgICAgICAgX3RleHQsIHF1ZXJ5SW5kZXggKyAxLCBlbmQsIF9VcmkuX3F1ZXJ5Q2hhclRhYmxlKTsKICAgICAgZW5kID0gcXVlcnlJbmRleDsKICAgIH0KICAgIHBhdGggPSBfVXJpLl9ub3JtYWxpemVPclN1YnN0cmluZygKICAgICAgICBfdGV4dCwgY29sb25JbmRleCArIDEsIGVuZCwgX1VyaS5fcGF0aENoYXJPclNsYXNoVGFibGUpOwogICAgX3VyaUNhY2hlID0gX0RhdGFVcmkodGhpcywgcGF0aCwgcXVlcnkpOwogICAgcmV0dXJuIF91cmlDYWNoZTsKICB9CgogIC8qKgogICAqIFRoZSBNSU1FIHR5cGUgb2YgdGhlIGRhdGEgVVJJLgogICAqCiAgICogQSBkYXRhIFVSSSBjb25zaXN0cyBvZiBhICJtZWRpYSB0eXBlIiBmb2xsb3dlZCBieSBkYXRhLgogICAqIFRoZSBtZWRpYSB0eXBlIHN0YXJ0cyB3aXRoIGEgTUlNRSB0eXBlIGFuZCBjYW4gYmUgZm9sbG93ZWQgYnkKICAgKiBleHRyYSBwYXJhbWV0ZXJzLgogICAqIElmIHRoZSBNSU1FIHR5cGUgcmVwcmVzZW50YXRpb24gaW4gdGhlIFVSSSB0ZXh0IGNvbnRhaW5zIFVSSSBlc2NhcGVzLAogICAqIHRoZXkgYXJlIHVuZXNjYXBlZCBpbiB0aGUgcmV0dXJuZWQgc3RyaW5nLgogICAqIElmIHRoZSB2YWx1ZSBjb250YWluIG5vbi1BU0NJSSBwZXJjZW50IGVzY2FwZXMsIHRoZXkgYXJlIGRlY29kZWQgYXMgVVRGLTguCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogICAgIGRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LEhlbGxvJTIwV29ybGQhCiAgICoKICAgKiBUaGlzIGRhdGEgVVJJIGhhcyB0aGUgbWVkaWEgdHlwZSBgdGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04YCwgd2hpY2ggaXMgdGhlCiAgICogTUlNRSB0eXBlIGB0ZXh0L3BsYWluYCB3aXRoIHRoZSBwYXJhbWV0ZXIgYGNoYXJzZXRgIHdpdGggdmFsdWUgYHV0Zi04YC4KICAgKiBTZWUgW1JGQyAyMDQ1XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjA0NSkgZm9yIG1vcmUgZGV0YWlsLgogICAqCiAgICogSWYgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGRhdGEgVVJJIGlzIGVtcHR5LCBpdCBkZWZhdWx0cyB0byBgdGV4dC9wbGFpbmAuCiAgICovCiAgU3RyaW5nIGdldCBtaW1lVHlwZSB7CiAgICBpbnQgc3RhcnQgPSBfc2VwYXJhdG9ySW5kaWNlc1swXSArIDE7CiAgICBpbnQgZW5kID0gX3NlcGFyYXRvckluZGljZXNbMV07CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gInRleHQvcGxhaW4iOwogICAgcmV0dXJuIF9VcmkuX3VyaURlY29kZShfdGV4dCwgc3RhcnQsIGVuZCwgdXRmOCwgZmFsc2UpOwogIH0KCiAgLyoqCiAgICogVGhlIGNoYXJzZXQgcGFyYW1ldGVyIG9mIHRoZSBtZWRpYSB0eXBlLgogICAqCiAgICogSWYgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIG1lZGlhIHR5cGUgY29udGFpbnMgYSBgY2hhcnNldGAgcGFyYW1ldGVyCiAgICogdGhlbiB0aGlzIHJldHVybnMgaXRzIHZhbHVlLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgVVMtQVNDSUlgLAogICAqIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGNoYXJzZXQgZm9yIGRhdGEgVVJJcy4KICAgKiBJZiB0aGUgdmFsdWUgY29udGFpbiBub24tQVNDSUkgcGVyY2VudCBlc2NhcGVzLCB0aGV5IGFyZSBkZWNvZGVkIGFzIFVURi04LgogICAqCiAgICogSWYgdGhlIE1JTUUgdHlwZSByZXByZXNlbnRhdGlvbiBpbiB0aGUgVVJJIHRleHQgY29udGFpbnMgVVJJIGVzY2FwZXMsCiAgICogdGhleSBhcmUgdW5lc2NhcGVkIGluIHRoZSByZXR1cm5lZCBzdHJpbmcuCiAgICovCiAgU3RyaW5nIGdldCBjaGFyc2V0IHsKICAgIGludCBwYXJhbWV0ZXJTdGFydCA9IDE7CiAgICBpbnQgcGFyYW1ldGVyRW5kID0gX3NlcGFyYXRvckluZGljZXMubGVuZ3RoIC0gMTsgLy8gVGhlICcsJyBiZWZvcmUgZGF0YS4KICAgIGlmIChpc0Jhc2U2NCkgewogICAgICAvLyBUaGVyZSBpcyBhICI7YmFzZTY0IiBzZXBhcmF0b3IsIHNvIHN1YnRyYWN0IG9uZSBmb3IgdGhhdCBhcyB3ZWxsLgogICAgICBwYXJhbWV0ZXJFbmQgLT0gMTsKICAgIH0KICAgIGZvciAoaW50IGkgPSBwYXJhbWV0ZXJTdGFydDsgaSA8IHBhcmFtZXRlckVuZDsgaSArPSAyKSB7CiAgICAgIHZhciBrZXlTdGFydCA9IF9zZXBhcmF0b3JJbmRpY2VzW2ldICsgMTsKICAgICAgdmFyIGtleUVuZCA9IF9zZXBhcmF0b3JJbmRpY2VzW2kgKyAxXTsKICAgICAgaWYgKGtleUVuZCA9PSBrZXlTdGFydCArIDcgJiYgX3RleHQuc3RhcnRzV2l0aCgiY2hhcnNldCIsIGtleVN0YXJ0KSkgewogICAgICAgIHJldHVybiBfVXJpLl91cmlEZWNvZGUoCiAgICAgICAgICAgIF90ZXh0LCBrZXlFbmQgKyAxLCBfc2VwYXJhdG9ySW5kaWNlc1tpICsgMl0sIHV0ZjgsIGZhbHNlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuICJVUy1BU0NJSSI7CiAgfQoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBkYXRhIGlzIEJhc2U2NCBlbmNvZGVkIG9yIG5vdC4KICAgKi8KICBib29sIGdldCBpc0Jhc2U2NCA9PiBfc2VwYXJhdG9ySW5kaWNlcy5sZW5ndGguaXNPZGQ7CgogIC8qKgogICAqIFRoZSBjb250ZW50IHBhcnQgb2YgdGhlIGRhdGEgVVJJLCBhcyBpdHMgYWN0dWFsIHJlcHJlc2VudGF0aW9uLgogICAqCiAgICogVGhpcyBzdHJpbmcgbWF5IGNvbnRhaW4gcGVyY2VudCBlc2NhcGVzLgogICAqLwogIFN0cmluZyBnZXQgY29udGVudFRleHQgPT4gX3RleHQuc3Vic3RyaW5nKF9zZXBhcmF0b3JJbmRpY2VzLmxhc3QgKyAxKTsKCiAgLyoqCiAgICogVGhlIGNvbnRlbnQgcGFydCBvZiB0aGUgZGF0YSBVUkkgYXMgYnl0ZXMuCiAgICoKICAgKiBJZiB0aGUgZGF0YSBpcyBCYXNlNjQgZW5jb2RlZCwgaXQgd2lsbCBiZSBkZWNvZGVkIHRvIGJ5dGVzLgogICAqCiAgICogSWYgdGhlIGRhdGEgaXMgbm90IEJhc2U2NCBlbmNvZGVkLCBpdCB3aWxsIGJlIGRlY29kZWQgYnkgdW5lc2NhcGluZwogICAqIHBlcmNlbnQtZXNjYXBlZCBjaGFyYWN0ZXJzIGFuZCByZXR1cm5pbmcgYnl0ZSB2YWx1ZXMgb2YgZWFjaCB1bmVzY2FwZWQKICAgKiBjaGFyYWN0ZXIuIFRoZSBieXRlcyB3aWxsIG5vdCBiZSwgZS5nLiwgVVRGLTggZGVjb2RlZC4KICAgKi8KICBVaW50OExpc3QgY29udGVudEFzQnl0ZXMoKSB7CiAgICBTdHJpbmcgdGV4dCA9IF90ZXh0OwogICAgaW50IHN0YXJ0ID0gX3NlcGFyYXRvckluZGljZXMubGFzdCArIDE7CiAgICBpZiAoaXNCYXNlNjQpIHsKICAgICAgcmV0dXJuIGJhc2U2NC5kZWNvZGVyLmNvbnZlcnQodGV4dCwgc3RhcnQpOwogICAgfQoKICAgIC8vIE5vdCBiYXNlNjQsIGRvIHBlcmNlbnQtZGVjb2RpbmcgYW5kIHJldHVybiB0aGUgcmVtYWluaW5nIGJ5dGVzLgogICAgLy8gQ29tcHV0ZSByZXN1bHQgc2l6ZS4KICAgIGNvbnN0IGludCBwZXJjZW50ID0gMHgyNTsKICAgIGludCBsZW5ndGggPSB0ZXh0Lmxlbmd0aCAtIHN0YXJ0OwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY29kZVVuaXQgPSB0ZXh0LmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjb2RlVW5pdCA9PSBwZXJjZW50KSB7CiAgICAgICAgaSArPSAyOwogICAgICAgIGxlbmd0aCAtPSAyOwogICAgICB9CiAgICB9CiAgICAvLyBGaWxsIHJlc3VsdCBhcnJheS4KICAgIFVpbnQ4TGlzdCByZXN1bHQgPSBVaW50OExpc3QobGVuZ3RoKTsKICAgIGlmIChsZW5ndGggPT0gdGV4dC5sZW5ndGgpIHsKICAgICAgcmVzdWx0LnNldFJhbmdlKDAsIGxlbmd0aCwgdGV4dC5jb2RlVW5pdHMsIHN0YXJ0KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGludCBpbmRleCA9IDA7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjb2RlVW5pdCA9IHRleHQuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNvZGVVbml0ICE9IHBlcmNlbnQpIHsKICAgICAgICByZXN1bHRbaW5kZXgrK10gPSBjb2RlVW5pdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaSArIDIgPCB0ZXh0Lmxlbmd0aCkgewogICAgICAgICAgaW50IGJ5dGUgPSBwYXJzZUhleEJ5dGUodGV4dCwgaSArIDEpOwogICAgICAgICAgaWYgKGJ5dGUgPj0gMCkgewogICAgICAgICAgICByZXN1bHRbaW5kZXgrK10gPSBieXRlOwogICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgcGVyY2VudCBlc2NhcGUiLCB0ZXh0LCBpKTsKICAgICAgfQogICAgfQogICAgYXNzZXJ0KGluZGV4ID09IHJlc3VsdC5sZW5ndGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBzdHJpbmcgY3JlYXRlZCBmcm9tIHRoZSBjb250ZW50IG9mIHRoZSBkYXRhIFVSSS4KICAgKgogICAqIElmIHRoZSBjb250ZW50IGlzIEJhc2U2NCBlbmNvZGVkLCBpdCB3aWxsIGJlIGRlY29kZWQgdG8gYnl0ZXMgYW5kIHRoZW4KICAgKiBkZWNvZGVkIHRvIGEgc3RyaW5nIHVzaW5nIFtlbmNvZGluZ10uCiAgICogSWYgZW5jb2RpbmcgaXMgb21pdHRlZCwgdGhlIHZhbHVlIG9mIGEgYGNoYXJzZXRgIHBhcmFtZXRlciBpcyB1c2VkCiAgICogaWYgaXQgaXMgcmVjb2duaXplZCBieSBbRW5jb2RpbmcuZ2V0QnlOYW1lXSwgb3RoZXJ3aXNlIGl0IGRlZmF1bHRzIHRvCiAgICogdGhlIFthc2NpaV0gZW5jb2RpbmcsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciBkYXRhIFVSSXMKICAgKiB0aGF0IGRvIG5vdCBzcGVjaWZ5IGFuIGVuY29kaW5nLgogICAqCiAgICogSWYgdGhlIGNvbnRlbnQgaXMgbm90IEJhc2U2NCBlbmNvZGVkLCBpdCB3aWxsIGZpcnN0IGhhdmUgcGVyY2VudC1lc2NhcGVzCiAgICogY29udmVydGVkIHRvIGJ5dGVzIGFuZCB0aGVuIHRoZSBjaGFyYWN0ZXIgY29kZXMgYW5kIGJ5dGUgdmFsdWVzIGFyZQogICAqIGRlY29kZWQgdXNpbmcgW2VuY29kaW5nXS4KICAgKi8KICBTdHJpbmcgY29udGVudEFzU3RyaW5nKHtFbmNvZGluZyBlbmNvZGluZ30pIHsKICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CiAgICAgIHZhciBjaGFyc2V0ID0gdGhpcy5jaGFyc2V0OyAvLyBSZXR1cm5zICJVUy1BU0NJSSIgaWYgbm90IHByZXNlbnQuCiAgICAgIGVuY29kaW5nID0gRW5jb2RpbmcuZ2V0QnlOYW1lKGNoYXJzZXQpOwogICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgewogICAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIlVua25vd24gY2hhcnNldDogJGNoYXJzZXQiKTsKICAgICAgfQogICAgfQogICAgU3RyaW5nIHRleHQgPSBfdGV4dDsKICAgIGludCBzdGFydCA9IF9zZXBhcmF0b3JJbmRpY2VzLmxhc3QgKyAxOwogICAgaWYgKGlzQmFzZTY0KSB7CiAgICAgIHZhciBjb252ZXJ0ZXIgPSBiYXNlNjQuZGVjb2Rlci5mdXNlKGVuY29kaW5nLmRlY29kZXIpOwogICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnQodGV4dC5zdWJzdHJpbmcoc3RhcnQpKTsKICAgIH0KICAgIHJldHVybiBfVXJpLl91cmlEZWNvZGUodGV4dCwgc3RhcnQsIHRleHQubGVuZ3RoLCBlbmNvZGluZywgZmFsc2UpOwogIH0KCiAgLyoqCiAgICogQSBtYXAgcmVwcmVzZW50aW5nIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBtZWRpYSB0eXBlLgogICAqCiAgICogQSBkYXRhIFVSSSBtYXkgY29udGFpbiBwYXJhbWV0ZXJzIGJldHdlZW4gdGhlIE1JTUUgdHlwZSBhbmQgdGhlCiAgICogZGF0YS4gVGhpcyBjb252ZXJ0cyB0aGVzZSBwYXJhbWV0ZXJzIHRvIGEgbWFwIGZyb20gcGFyYW1ldGVyIG5hbWUKICAgKiB0byBwYXJhbWV0ZXIgdmFsdWUuCiAgICogVGhlIG1hcCBvbmx5IGNvbnRhaW5zIHBhcmFtZXRlcnMgdGhhdCBhY3R1YWxseSBvY2N1ciBpbiB0aGUgVVJJLgogICAqIFRoZSBgY2hhcnNldGAgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUgZXZlbiBpZiBpdCBkb2Vzbid0IG9jY3VyCiAgICogaW4gdGhlIFVSSSwgd2hpY2ggaXMgcmVmbGVjdGVkIGJ5IHRoZSBbY2hhcnNldF0gZ2V0dGVyLiBUaGlzIG1lYW5zIHRoYXQKICAgKiBbY2hhcnNldF0gbWF5IHJldHVybiBhIHZhbHVlIGV2ZW4gaWYgYHBhcmFtZXRlcnNbImNoYXJzZXQiXWAgaXMgYG51bGxgLgogICAqCiAgICogSWYgdGhlIHZhbHVlcyBjb250YWluIG5vbi1BU0NJSSB2YWx1ZXMgb3IgcGVyY2VudCBlc2NhcGVzLAogICAqIHRoZXkgYXJlIGRlY29kZWQgYXMgVVRGLTguCiAgICovCiAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXQgcGFyYW1ldGVycyB7CiAgICB2YXIgcmVzdWx0ID0gPFN0cmluZywgU3RyaW5nPnt9OwogICAgZm9yIChpbnQgaSA9IDM7IGkgPCBfc2VwYXJhdG9ySW5kaWNlcy5sZW5ndGg7IGkgKz0gMikgewogICAgICB2YXIgc3RhcnQgPSBfc2VwYXJhdG9ySW5kaWNlc1tpIC0gMl0gKyAxOwogICAgICB2YXIgZXF1YWxzID0gX3NlcGFyYXRvckluZGljZXNbaSAtIDFdOwogICAgICB2YXIgZW5kID0gX3NlcGFyYXRvckluZGljZXNbaV07CiAgICAgIFN0cmluZyBrZXkgPSBfVXJpLl91cmlEZWNvZGUoX3RleHQsIHN0YXJ0LCBlcXVhbHMsIHV0ZjgsIGZhbHNlKTsKICAgICAgU3RyaW5nIHZhbHVlID0gX1VyaS5fdXJpRGVjb2RlKF90ZXh0LCBlcXVhbHMgKyAxLCBlbmQsIHV0ZjgsIGZhbHNlKTsKICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgVXJpRGF0YSBfcGFyc2UoU3RyaW5nIHRleHQsIGludCBzdGFydCwgVXJpIHNvdXJjZVVyaSkgewogICAgYXNzZXJ0KHN0YXJ0ID09IDAgfHwgc3RhcnQgPT0gNSk7CiAgICBhc3NlcnQoKHN0YXJ0ID09IDUpID09IHRleHQuc3RhcnRzV2l0aCgiZGF0YToiKSk7CgogICAgLy8vIENoYXJhY3RlciBjb2Rlcy4KICAgIGNvbnN0IGludCBjb21tYSA9IDB4MmM7CiAgICBjb25zdCBpbnQgc2xhc2ggPSAweDJmOwogICAgY29uc3QgaW50IHNlbWljb2xvbiA9IDB4M2I7CiAgICBjb25zdCBpbnQgZXF1YWxzID0gMHgzZDsKICAgIExpc3Q8aW50PiBpbmRpY2VzID0gW3N0YXJ0IC0gMV07CiAgICBpbnQgc2xhc2hJbmRleCA9IC0xOwogICAgdmFyIGNoYXI7CiAgICBpbnQgaSA9IHN0YXJ0OwogICAgZm9yICg7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGNoYXIgPSB0ZXh0LmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjaGFyID09IGNvbW1hIHx8IGNoYXIgPT0gc2VtaWNvbG9uKSBicmVhazsKICAgICAgaWYgKGNoYXIgPT0gc2xhc2gpIHsKICAgICAgICBpZiAoc2xhc2hJbmRleCA8IDApIHsKICAgICAgICAgIHNsYXNoSW5kZXggPSBpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBNSU1FIHR5cGUiLCB0ZXh0LCBpKTsKICAgICAgfQogICAgfQogICAgaWYgKHNsYXNoSW5kZXggPCAwICYmIGkgPiBzdGFydCkgewogICAgICAvLyBBbiBlbXB0eSBNSU1FIHR5cGUgaXMgYWxsb3dlZCwgYnV0IGlmIG5vbi1lbXB0eSBpdCBtdXN0IGNvbnRhaW4KICAgICAgLy8gZXhhY3RseSBvbmUgc2xhc2guCiAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBNSU1FIHR5cGUiLCB0ZXh0LCBpKTsKICAgIH0KICAgIHdoaWxlIChjaGFyICE9IGNvbW1hKSB7CiAgICAgIC8vIFBhcnNlIHBhcmFtZXRlcnMgYW5kL29yICJiYXNlNjQiLgogICAgICBpbmRpY2VzLmFkZChpKTsKICAgICAgaSsrOwogICAgICBpbnQgZXF1YWxzSW5kZXggPSAtMTsKICAgICAgZm9yICg7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY2hhciA9IHRleHQuY29kZVVuaXRBdChpKTsKICAgICAgICBpZiAoY2hhciA9PSBlcXVhbHMpIHsKICAgICAgICAgIGlmIChlcXVhbHNJbmRleCA8IDApIGVxdWFsc0luZGV4ID0gaTsKICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gc2VtaWNvbG9uIHx8IGNoYXIgPT0gY29tbWEpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZXF1YWxzSW5kZXggPj0gMCkgewogICAgICAgIGluZGljZXMuYWRkKGVxdWFsc0luZGV4KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBIYXZlIHRvIGJlIGZpbmFsICJiYXNlNjQiLgogICAgICAgIHZhciBsYXN0U2VwYXJhdG9yID0gaW5kaWNlcy5sYXN0OwogICAgICAgIGlmIChjaGFyICE9IGNvbW1hIHx8CiAgICAgICAgICAgIGkgIT0gbGFzdFNlcGFyYXRvciArIDcgLyogImJhc2U2NCwiLmxlbmd0aCAqLyB8fAogICAgICAgICAgICAhdGV4dC5zdGFydHNXaXRoKCJiYXNlNjQiLCBsYXN0U2VwYXJhdG9yICsgMSkpIHsKICAgICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiRXhwZWN0aW5nICc9JyIsIHRleHQsIGkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaW5kaWNlcy5hZGQoaSk7CiAgICBib29sIGlzQmFzZTY0ID0gaW5kaWNlcy5sZW5ndGguaXNPZGQ7CiAgICBpZiAoaXNCYXNlNjQpIHsKICAgICAgdGV4dCA9IGJhc2U2NC5ub3JtYWxpemUodGV4dCwgaSArIDEsIHRleHQubGVuZ3RoKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFZhbGlkYXRlICJkYXRhIiBwYXJ0LCBtdXN0IG9ubHkgY29udGFpbiBSRkMgMjM5NiAndXJpYycgY2hhcmFjdGVycwogICAgICAvLyAocmVzZXJ2ZWQsIHVucmVzZXJ2ZWQsIG9yIGVzY2FwZSBzZXF1ZW5jZXMpLgogICAgICAvLyBOb3JtYWxpemUgdG8gdGhpcyAodGhyb3dzIG9uIGEgZnJhZ21lbnQgc2VwYXJhdG9yKS4KICAgICAgdmFyIGRhdGEgPSBfVXJpLl9ub3JtYWxpemUodGV4dCwgaSArIDEsIHRleHQubGVuZ3RoLCBfdXJpY1RhYmxlLAogICAgICAgICAgZXNjYXBlRGVsaW1pdGVyczogdHJ1ZSk7CiAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlUmFuZ2UoaSArIDEsIHRleHQubGVuZ3RoLCBkYXRhKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIFVyaURhdGEuXyh0ZXh0LCBpbmRpY2VzLCBzb3VyY2VVcmkpOwogIH0KCiAgLyoqCiAgICogTGlrZSBbVXJpLl91cmlFbmNvZGVdIGJ1dCB0YWtlcyB0aGUgaW5wdXQgYXMgYnl0ZXMsIG5vdCBhIHN0cmluZy4KICAgKgogICAqIEVuY29kZXMgaW50byBbYnVmZmVyXSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGl0cyBvd24gYnVmZmVyLgogICAqLwogIHN0YXRpYyB2b2lkIF91cmlFbmNvZGVCeXRlcygKICAgICAgTGlzdDxpbnQ+IGNhbm9uaWNhbFRhYmxlLCBMaXN0PGludD4gYnl0ZXMsIFN0cmluZ1NpbmsgYnVmZmVyKSB7CiAgICAvLyBFbmNvZGUgdGhlIHN0cmluZyBpbnRvIGJ5dGVzIHRoZW4gZ2VuZXJhdGUgYW4gQVNDSUkgb25seSBzdHJpbmcKICAgIC8vIGJ5IHBlcmNlbnQgZW5jb2Rpbmcgc2VsZWN0ZWQgYnl0ZXMuCiAgICBpbnQgYnl0ZU9yID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaW50IGJ5dGUgPSBieXRlc1tpXTsKICAgICAgYnl0ZU9yIHw9IGJ5dGU7CiAgICAgIGlmIChieXRlIDwgMTI4ICYmCiAgICAgICAgICAoKGNhbm9uaWNhbFRhYmxlW2J5dGUgPj4gNF0gJiAoMSA8PCAoYnl0ZSAmIDB4MGYpKSkgIT0gMCkpIHsKICAgICAgICBidWZmZXIud3JpdGVDaGFyQ29kZShieXRlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWZmZXIud3JpdGVDaGFyQ29kZShfUEVSQ0VOVCk7CiAgICAgICAgYnVmZmVyLndyaXRlQ2hhckNvZGUoX2hleERpZ2l0cy5jb2RlVW5pdEF0KGJ5dGUgPj4gNCkpOwogICAgICAgIGJ1ZmZlci53cml0ZUNoYXJDb2RlKF9oZXhEaWdpdHMuY29kZVVuaXRBdChieXRlICYgMHgwZikpOwogICAgICB9CiAgICB9CiAgICBpZiAoKGJ5dGVPciAmIH4weEZGKSAhPSAwKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgYnl0ZSA9IGJ5dGVzW2ldOwogICAgICAgIGlmIChieXRlIDwgMCB8fCBieXRlID4gMjU1KSB7CiAgICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKGJ5dGUsICJub24tYnl0ZSB2YWx1ZSIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgKF9zZXBhcmF0b3JJbmRpY2VzWzBdID09IF9ub1NjaGVtZSkgPyAiZGF0YTokX3RleHQiIDogX3RleHQ7CgogIC8vIFRhYmxlIG9mIHRoZSBgdG9rZW5gIGNoYXJhY3RlcnMgb2YgUkZDIDIwNDUgaW4gYSBVUkkuCiAgLy8KICAvLyBBIHRva2VuIGlzIGFueSBVUy1BU0NJSSBjaGFyYWN0ZXIgZXhjZXB0IFNQQUNFLCBjb250cm9sIGNoYXJhY3RlcnMgYW5kCiAgLy8gYHRzcGVjaWFsYCBjaGFyYWN0ZXJzLiBUaGUgYHRzcGVjaWFsYCBjYXRlZ29yeSBpczoKICAvLyAnKCcsICcpJywgJzwnLCAnPicsICdAJywgJywnLCAnOycsICc6JywgJ1wnLCAnIicsICcvJywgJ1ssICddJywgJz8nLCAnPScuCiAgLy8KICAvLyBJbiBhIGRhdGEgVVJJLCB3ZSBhbHNvIG5lZWQgdG8gZXNjYXBlICclJyBhbmQgJyMnIGNoYXJhY3RlcnMuCiAgc3RhdGljIGNvbnN0IF90b2tlbkNoYXJUYWJsZSA9IFsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwIDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMCAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICEgICQgJicgICAqKyAtLgogICAgMHg2Y2QyLCAvLyAweDIwIC0gMHgyZiAgMDEwMDEwMTEgMDAxMTAxMTAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIDAxMjM0NTY3IDg5CiAgICAweDAzZmYsIC8vIDB4MzAgLSAweDNmICAxMTExMTExMSAxMTAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIEFCQ0RFRkcgSElKS0xNTk8KICAgIDB4ZmZmZSwgLy8gMHg0MCAtIDB4NGYgIDAxMTExMTExIDExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBQUVJTVFVWVyBYWVogICBeXwogICAgMHhjN2ZmLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTEgMTExMDAwMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGBhYmNkZWZnIGhpamtsbW5vCiAgICAweGZmZmYsIC8vIDB4NjAgLSAweDZmICAxMTExMTExMSAxMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dncgeHl6e3x9fgogICAgMHg3ZmZmLCAvLyAweDcwIC0gMHg3ZiAgMTExMTExMTEgMTExMTExMTAKICBdOwoKICAvLyBBbGwgbm9uLWVzY2FwZSBSRkMtMjM5NiB1cmljIGNoYXJhY3RlcnMuCiAgLy8KICAvLyAgdXJpYyAgICAgICAgPSAgcmVzZXJ2ZWQgfCB1bnJlc2VydmVkIHwgZXNjYXBlZAogIC8vICByZXNlcnZlZCAgICA9ICAiOyIgfCAiLyIgfCAiPyIgfCAiOiIgfCAiQCIgfCAiJiIgfCAiPSIgfCAiKyIgfCAiJCIgfCAiLCIKICAvLyAgdW5yZXNlcnZlZCAgPSAgYWxwaGFudW0gfCBtYXJrCiAgLy8gIG1hcmsgICAgICAgID0gICItIiB8ICJfIiB8ICIuIiB8ICIhIiB8ICJ+IiB8ICIqIiB8ICInIiB8ICIoIiB8ICIpIgogIC8vCiAgLy8gVGhpcyBpcyB0aGUgc2FtZSBjaGFyYWN0ZXJzIGFzIGluIGEgVVJJIHF1ZXJ5ICh3aGljaCBpcyBVUkkgcGNoYXIgcGx1cyAnPycpCiAgc3RhdGljIGNvbnN0IF91cmljVGFibGUgPSBfVXJpLl9xdWVyeUNoYXJUYWJsZTsKCiAgLy8gQ2hhcmFjdGVycyBhbGxvd2VkIGluIGJhc2UtNjQgZW5jb2RpbmcgKGFscGhhbnVtZXJpYywgJy8nLCAnKycgYW5kICc9JykuCiAgc3RhdGljIGNvbnN0IF9iYXNlNjRUYWJsZSA9IFsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwIDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMCAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIC8KICAgIDB4ODgwMCwgLy8gMHgyMCAtIDB4MmYgIDAwMDAwMDAwIDAwMDEwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2NyA4OQogICAgMHgwM2ZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTEgMTEwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBBQkNERUZHIEhJSktMTU5PCiAgICAweGZmZmUsIC8vIDB4NDAgLSAweDRmICAwMTExMTExMSAxMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgUFFSU1RVVlcgWFlaCiAgICAweDA3ZmYsIC8vIDB4NTAgLSAweDVmICAxMTExMTExMSAxMTEwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFiY2RlZmcgaGlqa2xtbm8KICAgIDB4ZmZmZSwgLy8gMHg2MCAtIDB4NmYgIDAxMTExMTExIDExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBwcXJzdHV2dyB4eXoKICAgIDB4MDdmZiwgLy8gMHg3MCAtIDB4N2YgIDExMTExMTExIDExMTAwMDAwCiAgXTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQ29uc3RhbnRzIHVzZWQgdG8gcmVhZCB0aGUgc2Nhbm5lciByZXN1bHQuCi8vIFRoZSBpbmRpY2VzIHBvaW50cyBpbnRvIHRoZSB0YWJsZSBmaWxsZWQgYnkgW19zY2FuXSB3aGljaCBjb250YWlucwovLyByZWNvZ25pemVkIHBvc2l0aW9ucyBpbiB0aGUgc2Nhbm5lZCBVUkkuCi8vIFRoZSBgMGAgaW5kZXggaXMgb25seSB1c2VkIGludGVybmFsbHkuCgovLy8gSW5kZXggb2YgdGhlIHBvc2l0aW9uIG9mIHRoYXQgYDpgIGFmdGVyIGEgc2NoZW1lLgpjb25zdCBpbnQgX3NjaGVtZUVuZEluZGV4ID0gMTsKCi8vLyBJbmRleCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciBqdXN0IGJlZm9yZSB0aGUgaG9zdCBuYW1lLgpjb25zdCBpbnQgX2hvc3RTdGFydEluZGV4ID0gMjsKCi8vLyBJbmRleCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGA6YCBiZWZvcmUgYSBwb3J0IHZhbHVlLgpjb25zdCBpbnQgX3BvcnRTdGFydEluZGV4ID0gMzsKCi8vLyBJbmRleCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIHBhdGguCmNvbnN0IGludCBfcGF0aFN0YXJ0SW5kZXggPSA0OwoKLy8vIEluZGV4IG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgYD9gIGJlZm9yZSBhIHF1ZXJ5Lgpjb25zdCBpbnQgX3F1ZXJ5U3RhcnRJbmRleCA9IDU7CgovLy8gSW5kZXggb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBgI2AgYmVmb3JlIGEgZnJhZ21lbnQuCmNvbnN0IGludCBfZnJhZ21lbnRTdGFydEluZGV4ID0gNjsKCi8vLyBJbmRleCBvZiBhIHBvc2l0aW9uIHdoZXJlIHRoZSBVUkkgd2FzIGRldGVybWluZWQgdG8gYmUgIm5vbi1zaW1wbGUiLgpjb25zdCBpbnQgX25vdFNpbXBsZUluZGV4ID0gNzsKCi8vIEluaXRpYWwgc3RhdGUgZm9yIHNjYW5uZXIuCmNvbnN0IGludCBfdXJpU3RhcnQgPSAwMDsKCi8vIElmIHNjYW5uaW5nIG9mIGEgVVJJIHRlcm1pbmF0ZXMgaW4gdGhpcyBzdGF0ZSBvciBhYm92ZSwKLy8gY29uc2lkZXIgdGhlIFVSSSBub24tc2ltcGxlCmNvbnN0IGludCBfbm9uU2ltcGxlRW5kU3RhdGVzID0gMTQ7CgovLyBJbml0aWFsIHN0YXRlIGZvciBzY2hlbWUgdmFsaWRhdGlvbi4KY29uc3QgaW50IF9zY2hlbWVTdGFydCA9IDIwOwoKLy8vIFRyYW5zaXRpb24gdGFibGVzIHVzZWQgdG8gc2NhbiBhIFVSSSB0byBkZXRlcm1pbmUgaXRzIHN0cnVjdHVyZS4KLy8vCi8vLyBUaGUgdGFibGVzIHJlcHJlc2VudCBhIHN0YXRlIG1hY2hpbmUgd2l0aCBvdXRwdXQuCi8vLwovLy8gVG8gc2NhbiB0aGUgVVJJLCBzdGFydCBpbiB0aGUgW191cmlTdGFydF0gc3RhdGUsIHRoZW4gcmVhZCBlYWNoIGNoYXJhY3RlcgovLy8gb2YgdGhlIFVSSSBpbiBvcmRlciwgZnJvbSBzdGFydCB0byBlbmQsIGFuZCBmb3IgZWFjaCBjaGFyYWN0ZXIgcGVyZm9ybSBhCi8vLyB0cmFuc2l0aW9uIHRvIGEgbmV3IHN0YXRlIHdoaWxlIHdyaXRpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUgb3V0cHV0Ci8vLyBidWZmZXIgYXQgYSBkZXNpZ25hdGVkIGluZGV4LgovLy8KLy8vIEVhY2ggc3RhdGUsIHJlcHJlc2VudGVkIGJ5IGFuIGludGVnZXIgd2hpY2ggaXMgYW4gaW5kZXggaW50bwovLy8gW19zY2FubmVyVGFibGVzXSwgaGFzIGEgc2V0IG9mIHRyYW5zaXRpb25zLCBvbmUgZm9yIGVhY2ggY2hhcmFjdGVyLgovLy8gVGhlIHRyYW5zaXRpb25zIGFyZSBlbmNvZGVkIGFzIGEgNS1iaXQgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG5leHQgc3RhdGUKLy8vIGFuZCBhIDMtYml0IGluZGV4IGludG8gdGhlIG91dHB1dCB0YWJsZS4KLy8vCi8vLyBGb3IgVVJJIHNjYW5uaW5nLCBvbmx5IGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFUrMDAyMCB0aHJvdWdoIFUrMDA3RSBhcmUKLy8vIGludGVyZXN0aW5nLCBhbGwgY2hhcmFjdGVycyBvdXRzaWRlIHRoYXQgcmFuZ2UgYXJlIHRyZWF0ZWQgdGhlIHNhbWUuCi8vLyBUaGUgdGFibGVzIG9ubHkgY29udGFpbiA5NiBlbnRyaWVzLCByZXByZXNlbnRpbmcgdGhhdCBjaGFyYWN0ZXJzIGluIHRoZQovLy8gaW50ZXJlc3RpbmcgcmFuZ2UsIHBsdXMgb25lIG1vcmUgdG8gcmVwcmVzZW50IGFsbCB2YWx1ZXMgb3V0c2lkZSB0aGUgcmFuZ2UuCi8vLyBUaGUgY2hhcmFjdGVyIGVudHJpZXMgYXJlIHN0b3JlZCBpbiBvbmUgYFVpbnQ4TGlzdGAgcGVyIHN0YXRlLCB3aXRoIHRoZQovLy8gdHJhbnNpdGlvbiBmb3IgYSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gYGNoYXJhY3RlciBeIDB4NjBgLAovLy8gd2hpY2ggbWFwcyB0aGUgcmFuZ2UgVSswMDIwIC4uIFUrMDA3RiBpbnRvIHBvc2l0aW9ucyAwIC4uIDk1LgovLy8gQWxsIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGFyZSBtYXBwZWQgdG8gcG9zaXRpb24gMzEgKGAweDdmIF4gMHg2MGApIHdoaWNoCi8vLyByZXByZXNlbnRzIHRoZSB0cmFuc2l0aW9uIGZvciBhbGwgcmVtYWluaW5nIGNoYXJhY3RlcnMuCmZpbmFsIExpc3Q8VWludDhMaXN0PiBfc2Nhbm5lclRhYmxlcyA9IF9jcmVhdGVUYWJsZXMoKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQ29kZSB0byBjcmVhdGUgdGhlIFVSSSBzY2FubmVyIHRhYmxlLgoKLy8vIENyZWF0ZXMgdGhlIHRhYmxlcyBmb3IgW19zY2FubmVyVGFibGVzXSB1c2VkIGJ5IFtVcmkucGFyc2VdLgovLy8KLy8vIFNlZSBbX3NjYW5uZXJUYWJsZXNdIGZvciB0aGUgZ2VuZXJhdGVkIGZvcm1hdC4KLy8vCi8vLyBUaGUgY29uY3JldGUgdGFibGVzIGFyZSBjaG9zZW4gYXMgYSB0cmFkZS1vZmYgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIHN0YXRlcwovLy8gbmVlZGVkIGFuZCB0aGUgcHJlY2lzaW9uIG9mIHRoZSByZXN1bHQuCi8vLyBUaGlzIGFsbG93cyBkZWZpbml0ZWx5IHJlY29nbml6aW5nIHRoZSBnZW5lcmFsIHN0cnVjdHVyZSBvZiB0aGUgVVJJCi8vLyAocHJlc2VuY2UgYW5kIGxvY2F0aW9uIG9mIHNjaGVtZSwgdXNlci1pbmZvLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSBhbmQKLy8vIGZyYWdtZW50KSB3aGlsZSBhdCB0aGUgc2FtZSB0aW1lIGRldGVjdGluZyB0aGF0IHNvbWUgY29tcG9uZW50cyBhcmUgbm90Ci8vLyBpbiBjYW5vbmljYWwgZm9ybSAoYW55dGhpbmcgY29udGFpbmluZyBhIGAlYCwgYSBob3N0LW5hbWUgY29udGFpbmluZyBhCi8vLyBjYXBpdGFsIGxldHRlcikuIFNpbmNlIHRoZSBzY2FubmVyIGRvZXNuJ3Qga25vdyB3aGV0aGVyIHNvbWV0aGluZyBpcyBhCi8vLyBzY2hlbWUgb3IgYSBwYXRoIHVudGlsIGl0IHNlZXMgYDpgLCBvciB1c2VyLWluZm8gb3IgaG9zdCB1bnRpbCBpdCBzZWVzCi8vLyBhIGBAYCwgYSBzZWNvbmQgcGFzcyBpcyBuZWVkZWQgdG8gdmFsaWRhdGUgdGhlIHNjaGVtZSBhbmQgYW55IHVzZXItaW5mbwovLy8gaXMgY29uc2lkZXJlZCBub24tY2Fub25pY2FsIGJ5IGRlZmF1bHQuCi8vLwovLy8gVGhlIHN0YXRlcyAoc3RhcnRpbmcgZnJvbSBbX3VyaVN0YXJ0XSkgd3JpdGUgcG9zaXRpb25zIHdoaWxlIHNjYW5uaW5nCi8vLyBhIHN0cmluZyBmcm9tIGBzdGFydGAgdG8gYGVuZGAgYXMgZm9sbG93czoKLy8vCi8vLyAtIFtfc2NoZW1lRW5kSW5kZXhdOiBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gYHN0YXJ0LTFgLgovLy8gICBJZiB0aGUgVVJJIGhhcyBhIHNjaGVtZSwgaXQgaXMgc2V0IHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgYDpgIGFmdGVyCi8vLyAgIHRoZSBzY2hlbWUuCi8vLyAtIFtfaG9zdFN0YXJ0SW5kZXhdOiBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gYHN0YXJ0IC0gMWAuCi8vLyAgIElmIHRoZSBVUkkgaGFzIGFuIGF1dGhvcml0eSwgaXQgaXMgc2V0IHRvIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZQovLy8gICBob3N0IG5hbWUgLSBlaXRoZXIgdGhlIHNlY29uZCBgL2AgaW4gdGhlIGAvL2AgbGVhZGluZyB0aGUgYXV0aG9yaXR5LAovLy8gICBvciB0aGUgYEBgIGFmdGVyIGEgdXNlci1pbmZvLiBDb21wYXJpbmcgdGhpcyB2YWx1ZSB0byB0aGUgc2NoZW1lIGVuZAovLy8gICBwb3NpdGlvbiBjYW4gYmUgdXNlZCB0byBkZXRlY3QgdGhhdCB0aGVyZSBpcyBhIHVzZXItaW5mbyBjb21wb25lbnQuCi8vLyAtIFtfcG9ydFN0YXJ0SW5kZXhdOiBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gYHN0YXJ0YC4KLy8vICAgU2V0IHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBgOmAgaW4gYW4gYXV0aG9yaXR5LCBhbmQgdW5jaGFuZ2VkCi8vLyAgIGlmIHRoZXJlIGlzIG5vIGF1dGhvcml0eSBvciBubyBgOmAgaW4gYW4gYXV0aG9yaXR5LgovLy8gICBJZiB0aGlzIHBvc2l0aW9uIGlzIGFmdGVyIHRoZSBob3N0IHN0YXJ0LCB0aGVyZSBpcyBhIHBvcnQsIG90aGVyd2lzZSBpdAovLy8gICBpcyBqdXN0IG1hcmtpbmcgYSBjb2xvbiBpbiB0aGUgdXNlci1pbmZvIGNvbXBvbmVudC4KLy8vIC0gW19wYXRoU3RhcnRJbmRleF06IFNob3VsZCBiZSBpbml0aWFsaXplZCB0byBgc3RhcnRgLgovLy8gICBJcyBzZXQgdG8gdGhlIGZpcnN0IHBhdGggY2hhcmFjdGVyIHVubGVzcyB0aGUgcGF0aCBpcyBlbXB0eS4KLy8vICAgSWYgdGhlIHBhdGggaXMgZW1wdHksIHRoZSBwb3NpdGlvbiBpcyBlaXRoZXIgdW5jaGFuZ2VkIChgc3RhcnRgKSBvcgovLy8gICB0aGUgZmlyc3Qgc2xhc2ggb2YgYW4gYXV0aG9yaXR5LiBTbywgaWYgdGhlIHBhdGggc3RhcnQgaXMgYmVmb3JlIGEKLy8vICAgaG9zdCBzdGFydCBvciBzY2hlbWUgZW5kLCB0aGUgcGF0aCBpcyBlbXB0eS4KLy8vIC0gW19xdWVyeVN0YXJ0SW5kZXhdOiBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gYGVuZGAuCi8vLyAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgYD9gIGxlYWRpbmcgYSBxdWVyeSBpZiB0aGUgVVJJIGNvbnRhaW5zIGEgcXVlcnkuCi8vLyAtIFtfZnJhZ21lbnRTdGFydEluZGV4XTogU2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIGBlbmRgLgovLy8gICBUaGUgcG9zaXRpb24gb2YgdGhlIGAjYCBsZWFkaW5nIGEgZnJhZ21lbnQgaWYgdGhlIFVSSSBjb250YWlucyBhIGZyYWdtZW50LgovLy8gLSBbX25vdFNpbXBsZUluZGV4XTogU2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIGBzdGFydCAtIDFgLgovLy8gICBTZXQgdG8gYW5vdGhlciB2YWx1ZSBpZiB0aGUgVVJJIGlzIGNvbnNpZGVyZWQgIm5vdCBzaW1wbGUiLgovLy8gICBUaGlzIGlzIGVsYWJvcmF0ZWQgYmVsb3cuCi8vLwovLy8gIyBTaW1wbGUgVVJJcwovLy8gQSBVUkkgaXMgY29uc2lkZXJlZCAic2ltcGxlIiBpZiBpdCBpcyBpbiBhIG5vcm1hbGl6ZWQgZm9ybSBjb250YWluaW5nIG5vCi8vLyBlc2NhcGVzLiBUaGlzIGFsbG93cyB1cyB0byBza2lwIG5vcm1hbGl6YXRpb24gYW5kIGNoZWNraW5nIHdoZXRoZXIgZXNjYXBlcwovLy8gYXJlIHZhbGlkLCBhbmQgdG8gZXh0cmFjdCBjb21wb25lbnRzIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgdW5lc2NhcGluZy4KLy8vCi8vLyBUaGUgc2Nhbm5lciBjb21wdXRlcyBhIGNvbnNlcnZhdGl2ZSBhcHByb3hpbWF0aW9uIG9mIGJlaW5nICJzaW1wbGUiLgovLy8gSXQgcmVqZWN0cyBhbnkgVVJJIHdpdGggYW4gZXNjYXBlLCB3aXRoIGEgdXNlci1pbmZvIGNvbXBvbmVudCAobWFpbmx5Ci8vLyBiZWNhdXNlIHRoZXkgYXJlIHJhcmUgYW5kIHdvdWxkIGluY3JlYXNlIHRoZSBudW1iZXIgb2Ygc3RhdGVzIGluIHRoZQovLy8gc2Nhbm5lciBzaWduaWZpY2FudGx5KSwgd2l0aCBhbiBJUFY2IGhvc3Qgb3Igd2l0aCBhIGNhcGl0YWwgbGV0dGVyIGluCi8vLyB0aGUgc2NoZW1lIG9yIGhvc3QgbmFtZSAodGhlIHNjaGVtZSBpcyBoYW5kbGVkIGluIGEgc2Vjb25kIHNjYW4gdXNpbmcKLy8vIGEgc2VwYXJhdGUgdHdvLXN0YXRlIHRhYmxlKS4KLy8vIEZ1cnRoZXIsIHBhdGhzIGNvbnRhaW5pbmcgYC4uYCBvciBgLmAgcGF0aCBzZWdtZW50cyBhcmUgY29uc2lkZXJlZAovLy8gbm9uLXNpbXBsZSBleGNlcHQgZm9yIHB1cmUgcmVsYXRpdmUgcGF0aHMgKG5vIHNjaGVtZSBvciBhdXRob3JpdHkpIHN0YXJ0aW5nCi8vLyB3aXRoIGEgc2VxdWVuY2Ugb2YgIi4uLyIgc2VnbWVudHMuCi8vLwovLy8gVGhlIHRyYW5zaXRpb24gdGFibGVzIGNhbm5vdCBkZXRlY3QgYSB0cmFpbGluZyAiLi4iIGluIHRoZSBwYXRoLAovLy8gZm9sbG93ZWQgYnkgYSBxdWVyeSBvciBmcmFnbWVudCwgYmVjYXVzZSB0aGUgc2VnbWVudCBpcyBub3Qga25vd24gdG8gYmUKLy8vIGNvbXBsZXRlIHVudGlsIHdlIGFyZSBwYXN0IGl0LCBhbmQgd2UgdGhlbiBuZWVkIHRvIHN0b3JlIHRoZSBxdWVyeS9mcmFnbWVudAovLy8gc3RhcnQgaW5zdGVhZC4gVGhpcyBjYXN0IGlzIGNoZWNrZWQgbWFudWFsbHkgcG9zdC1zY2FubmluZyAoc3VjaCBhIHBhdGgKLy8vIG5lZWRzIHRvIGJlIG5vcm1hbGl6ZWQgdG8gZW5kIGluICIuLi8iLCBzbyB0aGUgVVJJIHNob3VsZG4ndCBiZSBjb25zaWRlcmVkCi8vLyBzaW1wbGUpLgpMaXN0PFVpbnQ4TGlzdD4gX2NyZWF0ZVRhYmxlcygpIHsKICAvLyBUT0RPKGxybik6IFVzZSBhIHByZWNvbXB1dGVkIHRhYmxlLgoKICAvLyBUb3RhbCBudW1iZXIgb2Ygc3RhdGVzIGZvciB0aGUgc2Nhbm5lci4KICBjb25zdCBpbnQgc3RhdGVDb3VudCA9IDIyOwoKICAvLyBTdGF0ZXMgdXNlZCB0byBzY2FuIGEgVVJJIGZyb20gc2NyYXRjaC4KICBjb25zdCBpbnQgc2NoZW1lT3JQYXRoID0gMDE7CiAgY29uc3QgaW50IGF1dGhPclBhdGggPSAwMjsKICBjb25zdCBpbnQgYXV0aE9yUGF0aFNsYXNoID0gMDM7CiAgY29uc3QgaW50IHVpbmZvT3JIb3N0MCA9IDA0OwogIGNvbnN0IGludCB1aW5mb09ySG9zdCA9IDA1OwogIGNvbnN0IGludCB1aW5mb09yUG9ydDAgPSAwNjsKICBjb25zdCBpbnQgdWluZm9PclBvcnQgPSAwNzsKICBjb25zdCBpbnQgaXB2Nkhvc3QgPSAwODsKICBjb25zdCBpbnQgcmVsUGF0aFNlZyA9IDA5OwogIGNvbnN0IGludCBwYXRoU2VnID0gMTA7CiAgY29uc3QgaW50IHBhdGggPSAxMTsKICBjb25zdCBpbnQgcXVlcnkgPSAxMjsKICBjb25zdCBpbnQgZnJhZ21lbnQgPSAxMzsKICBjb25zdCBpbnQgc2NoZW1lT3JQYXRoRG90ID0gMTQ7CiAgY29uc3QgaW50IHNjaGVtZU9yUGF0aERvdDIgPSAxNTsKICBjb25zdCBpbnQgcmVsUGF0aFNlZ0RvdCA9IDE2OwogIGNvbnN0IGludCByZWxQYXRoU2VnRG90MiA9IDE3OwogIGNvbnN0IGludCBwYXRoU2VnRG90ID0gMTg7CiAgY29uc3QgaW50IHBhdGhTZWdEb3QyID0gMTk7CgogIC8vIFN0YXRlcyB1c2VkIHRvIHZhbGlkYXRlIGEgc2NoZW1lIGFmdGVyIGl0cyBlbmQgcG9zaXRpb24gaGFzIGJlZW4gZm91bmQuCiAgY29uc3QgaW50IHNjaGVtZTAgPSBfc2NoZW1lU3RhcnQ7CiAgY29uc3QgaW50IHNjaGVtZSA9IDIxOwoKICAvLyBDb25zdGFudHMgZW5jb2RpbmcgdGhlIHdyaXRlLWluZGV4IGZvciB0aGUgc3RhdGUgdHJhbnNpdGlvbiBpbnRvIHRoZSB0b3AgNQogIC8vIGJpdHMgb2YgYSBieXRlLgogIGNvbnN0IGludCBzY2hlbWVFbmQgPSBfc2NoZW1lRW5kSW5kZXggPDwgNTsKICBjb25zdCBpbnQgaG9zdFN0YXJ0ID0gX2hvc3RTdGFydEluZGV4IDw8IDU7CiAgY29uc3QgaW50IHBvcnRTdGFydCA9IF9wb3J0U3RhcnRJbmRleCA8PCA1OwogIGNvbnN0IGludCBwYXRoU3RhcnQgPSBfcGF0aFN0YXJ0SW5kZXggPDwgNTsKICBjb25zdCBpbnQgcXVlcnlTdGFydCA9IF9xdWVyeVN0YXJ0SW5kZXggPDwgNTsKICBjb25zdCBpbnQgZnJhZ21lbnRTdGFydCA9IF9mcmFnbWVudFN0YXJ0SW5kZXggPDwgNTsKICBjb25zdCBpbnQgbm90U2ltcGxlID0gX25vdFNpbXBsZUluZGV4IDw8IDU7CgogIC8vLyBUaGUgYHVucmVzZXJ2ZWRgIGNoYXJhY3RlcnMgb2YgUkZDIDM5ODYuCiAgY29uc3QgdW5yZXNlcnZlZCA9CiAgICAgICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei0uX34iOwoKICAvLy8gVGhlIGBzdWItZGVsaW1gIGNoYXJhY3RlcnMgb2YgUkZDIDM5ODYuCiAgY29uc3Qgc3ViRGVsaW1zID0gciIhJCYnKCkqKyw7PSI7CiAgLy8gVGhlIGBwY2hhcmAgY2hhcmFjdGVycyBvZiBSRkMgMzk4NjogY2hhcmFjdGVycyB0aGF0IG1heSBvY2N1ciBpbiBhIHBhdGgsCiAgLy8gZXhjbHVkaW5nIGVzY2FwZXMuCiAgY29uc3QgcGNoYXIgPSAiJHVucmVzZXJ2ZWQkc3ViRGVsaW1zIjsKCiAgdmFyIHRhYmxlcyA9IExpc3Q8VWludDhMaXN0Pi5nZW5lcmF0ZShzdGF0ZUNvdW50LCAoXykgPT4gVWludDhMaXN0KDk2KSk7CgogIC8vIEhlbHBlciBmdW5jdGlvbiB3aGljaCBpbml0aWFsaXplIHRoZSB0YWJsZSBmb3IgW3N0YXRlXSB3aXRoIGEgZGVmYXVsdAogIC8vIHRyYW5zaXRpb24gYW5kIHJldHVybnMgdGhlIHRhYmxlLgogIFVpbnQ4TGlzdCBidWlsZChzdGF0ZSwgZGVmYXVsdFRyYW5zaXRpb24pID0+CiAgICAgIHRhYmxlc1tzdGF0ZV0uLmZpbGxSYW5nZSgwLCA5NiwgZGVmYXVsdFRyYW5zaXRpb24pOwoKICAvLyBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggc2V0cyB0aGUgdHJhbnNpdGlvbiBmb3IgZWFjaCBjaGFyYWN0ZXIgaW4gW2NoYXJzXQogIC8vIHRvIFt0cmFuc2l0aW9uXSBpbiB0aGUgW3RhcmdldF0gdGFibGUuCiAgLy8gVGhlIFtjaGFyc10gc3RyaW5nIG11c3QgY29udGFpbiBvbmx5IGNoYXJhY3RlcnMgaW4gdGhlIFUrMDAyMCAuLiBVKzAwN0UKICAvLyByYW5nZS4KICB2b2lkIHNldENoYXJzKFVpbnQ4TGlzdCB0YXJnZXQsIFN0cmluZyBjaGFycywgaW50IHRyYW5zaXRpb24pIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGNoYXIgPSBjaGFycy5jb2RlVW5pdEF0KGkpOwogICAgICB0YXJnZXRbY2hhciBeIDB4NjBdID0gdHJhbnNpdGlvbjsKICAgIH0KICB9CgogIC8vLyBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggc2V0cyB0aGUgdHJhbnNpdGlvbiBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlCiAgLy8vIHJhbmdlIGZyb20gYHJhbmdlWzBdYCB0byBgcmFuZ2VbMV1gIHRvIFt0cmFuc2l0aW9uXSBpbiB0aGUgW3RhcmdldF0gdGFibGUuCiAgLy8vCiAgLy8vIFRoZSBbcmFuZ2VdIG11c3QgYmUgYSB0d28tY2hhcmFjdGVyIHN0cmluZyB3aGVyZSBib3RoIGNoYXJhY3RlcnMgYXJlIGluCiAgLy8vIHRoZSBVKzAwMjAgLi4gVSswMDdFIHJhbmdlIGFuZCB0aGUgZm9ybWVyIGNoYXJhY3RlciBtdXN0IGhhdmUgYSBsb3dlcgogIC8vLyBjb2RlIHBvaW50IHRoYW4gdGhlIGxhdHRlci4KICB2b2lkIHNldFJhbmdlKFVpbnQ4TGlzdCB0YXJnZXQsIFN0cmluZyByYW5nZSwgaW50IHRyYW5zaXRpb24pIHsKICAgIGZvciAoaW50IGkgPSByYW5nZS5jb2RlVW5pdEF0KDApLCBuID0gcmFuZ2UuY29kZVVuaXRBdCgxKTsgaSA8PSBuOyBpKyspIHsKICAgICAgdGFyZ2V0W2kgXiAweDYwXSA9IHRyYW5zaXRpb247CiAgICB9CiAgfQoKICAvLyBDcmVhdGUgdGhlIHRyYW5zaXRpb25zIGZvciBlYWNoIHN0YXRlLgogIHZhciBiOwoKICAvLyBWYWxpZGF0ZSBhcyBwYXRoLCBpZiBpdCBpcyBhIHNjaGVtZSwgd2UgaGFuZGxlIGl0IGxhdGVyLgogIGIgPSBidWlsZChfdXJpU3RhcnQsIHNjaGVtZU9yUGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHNjaGVtZU9yUGF0aCk7CiAgc2V0Q2hhcnMoYiwgIi4iLCBzY2hlbWVPclBhdGhEb3QpOwogIHNldENoYXJzKGIsICI6IiwgYXV0aE9yUGF0aCB8IHNjaGVtZUVuZCk7IC8vIEhhbmRsZSBsYXRlci4KICBzZXRDaGFycyhiLCAiLyIsIGF1dGhPclBhdGhTbGFzaCk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHNjaGVtZU9yUGF0aERvdCwgc2NoZW1lT3JQYXRoIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCBwY2hhciwgc2NoZW1lT3JQYXRoKTsKICBzZXRDaGFycyhiLCAiLiIsIHNjaGVtZU9yUGF0aERvdDIpOwogIHNldENoYXJzKGIsICc6JywgYXV0aE9yUGF0aCB8IHNjaGVtZUVuZCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCBwYXRoU2VnIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOwoKICBiID0gYnVpbGQoc2NoZW1lT3JQYXRoRG90Miwgc2NoZW1lT3JQYXRoIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCBwY2hhciwgc2NoZW1lT3JQYXRoKTsKICBzZXRDaGFycyhiLCAiJSIsIHNjaGVtZU9yUGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgJzonLCBhdXRoT3JQYXRoIHwgc2NoZW1lRW5kKTsKICBzZXRDaGFycyhiLCAiLyIsIHJlbFBhdGhTZWcpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZChzY2hlbWVPclBhdGgsIHNjaGVtZU9yUGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHNjaGVtZU9yUGF0aCk7CiAgc2V0Q2hhcnMoYiwgJzonLCBhdXRoT3JQYXRoIHwgc2NoZW1lRW5kKTsKICBzZXRDaGFycyhiLCAiLyIsIHBhdGhTZWcpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZChhdXRoT3JQYXRoLCBwYXRoIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCBwY2hhciwgcGF0aCB8IHBhdGhTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCBhdXRoT3JQYXRoU2xhc2ggfCBwYXRoU3RhcnQpOwogIHNldENoYXJzKGIsICIuIiwgcGF0aFNlZ0RvdCB8IHBhdGhTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKGF1dGhPclBhdGhTbGFzaCwgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGgpOwogIHNldENoYXJzKGIsICIvIiwgdWluZm9Pckhvc3QwIHwgaG9zdFN0YXJ0KTsKICBzZXRDaGFycyhiLCAiLiIsIHBhdGhTZWdEb3QpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZCh1aW5mb09ySG9zdDAsIHVpbmZvT3JIb3N0IHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCBwY2hhciwgdWluZm9Pckhvc3QpOwogIHNldFJhbmdlKGIsICJBWiIsIHVpbmZvT3JIb3N0IHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCAiOiIsIHVpbmZvT3JQb3J0MCB8IHBvcnRTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIkAiLCB1aW5mb09ySG9zdDAgfCBob3N0U3RhcnQpOwogIHNldENoYXJzKGIsICJbIiwgaXB2Nkhvc3QgfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsICIvIiwgcGF0aFNlZyB8IHBhdGhTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHVpbmZvT3JIb3N0LCB1aW5mb09ySG9zdCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHVpbmZvT3JIb3N0KTsKICBzZXRSYW5nZShiLCAiQVoiLCB1aW5mb09ySG9zdCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgIjoiLCB1aW5mb09yUG9ydDAgfCBwb3J0U3RhcnQpOwogIHNldENoYXJzKGIsICJAIiwgdWluZm9Pckhvc3QwIHwgaG9zdFN0YXJ0KTsKICBzZXRDaGFycyhiLCAiLyIsIHBhdGhTZWcgfCBwYXRoU3RhcnQpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZCh1aW5mb09yUG9ydDAsIHVpbmZvT3JQb3J0IHwgbm90U2ltcGxlKTsKICBzZXRSYW5nZShiLCAiMTkiLCB1aW5mb09yUG9ydCk7CiAgc2V0Q2hhcnMoYiwgIkAiLCB1aW5mb09ySG9zdDAgfCBob3N0U3RhcnQpOwogIHNldENoYXJzKGIsICIvIiwgcGF0aFNlZyB8IHBhdGhTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHVpbmZvT3JQb3J0LCB1aW5mb09yUG9ydCB8IG5vdFNpbXBsZSk7CiAgc2V0UmFuZ2UoYiwgIjA5IiwgdWluZm9PclBvcnQpOwogIHNldENoYXJzKGIsICJAIiwgdWluZm9Pckhvc3QwIHwgaG9zdFN0YXJ0KTsKICBzZXRDaGFycyhiLCAiLyIsIHBhdGhTZWcgfCBwYXRoU3RhcnQpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZChpcHY2SG9zdCwgaXB2Nkhvc3QpOwogIHNldENoYXJzKGIsICJdIiwgdWluZm9Pckhvc3QpOwoKICBiID0gYnVpbGQocmVsUGF0aFNlZywgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGgpOwogIHNldENoYXJzKGIsICIuIiwgcmVsUGF0aFNlZ0RvdCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCBwYXRoU2VnIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOwoKICBiID0gYnVpbGQocmVsUGF0aFNlZ0RvdCwgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGgpOwogIHNldENoYXJzKGIsICIuIiwgcmVsUGF0aFNlZ0RvdDIpOwogIHNldENoYXJzKGIsICIvIiwgcGF0aFNlZyB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHJlbFBhdGhTZWdEb3QyLCBwYXRoIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCBwY2hhciwgcGF0aCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCByZWxQYXRoU2VnKTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7IC8vIFRoaXMgc2hvdWxkIGJlIG5vbi1zaW1wbGUuCiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOyAvLyBUaGlzIHNob3VsZCBiZSBub24tc2ltcGxlLgoKICBiID0gYnVpbGQocGF0aFNlZywgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGgpOwogIHNldENoYXJzKGIsICIuIiwgcGF0aFNlZ0RvdCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCBwYXRoU2VnIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOwoKICBiID0gYnVpbGQocGF0aFNlZ0RvdCwgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGgpOwogIHNldENoYXJzKGIsICIuIiwgcGF0aFNlZ0RvdDIpOwogIHNldENoYXJzKGIsICIvIiwgcGF0aFNlZyB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHBhdGhTZWdEb3QyLCBwYXRoIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCBwY2hhciwgcGF0aCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCBwYXRoU2VnIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOwoKICBiID0gYnVpbGQocGF0aCwgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGgpOwogIHNldENoYXJzKGIsICIvIiwgcGF0aFNlZyk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHF1ZXJ5LCBxdWVyeSB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHF1ZXJ5KTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZChmcmFnbWVudCwgZnJhZ21lbnQgfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsIHBjaGFyLCBmcmFnbWVudCk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBmcmFnbWVudCk7CgogIC8vIEEgc2VwYXJhdGUgdHdvLXN0YXRlIHZhbGlkYXRvciBmb3IgbG93ZXItY2FzZSBzY2hlbWUgbmFtZXMuCiAgLy8gQW55IG5vbi1zY2hlbWUgY2hhcmFjdGVyIG9yIHVwcGVyLWNhc2UgbGV0dGVyIGlzIG1hcmtlZCBhcyBub24tc2ltcGxlLgogIGIgPSBidWlsZChzY2hlbWUwLCBzY2hlbWUgfCBub3RTaW1wbGUpOwogIHNldFJhbmdlKGIsICJheiIsIHNjaGVtZSk7CgogIGIgPSBidWlsZChzY2hlbWUsIHNjaGVtZSB8IG5vdFNpbXBsZSk7CiAgc2V0UmFuZ2UoYiwgImF6Iiwgc2NoZW1lKTsKICBzZXRSYW5nZShiLCAiMDkiLCBzY2hlbWUpOwogIHNldENoYXJzKGIsICIrLS4iLCBzY2hlbWUpOwoKICByZXR1cm4gdGFibGVzOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBDb2RlIHRoYXQgdXNlcyB0aGUgVVJJIHNjYW5uZXIgdGFibGUuCgovLy8gU2NhbiBhIHN0cmluZyB1c2luZyB0aGUgW19zY2FubmVyVGFibGVzXSBzdGF0ZSBtYWNoaW5lLgovLy8KLy8vIFNjYW5zIFt1cmldIGZyb20gW3N0YXJ0XSB0byBbZW5kXSwgc3RhcnRpbmcgaW4gc3RhdGUgW3N0YXRlXSBhbmQKLy8vIHdyaXRpbmcgb3V0cHV0IGludG8gW2luZGljZXNdLgovLy8KLy8vIFJldHVybnMgdGhlIGZpbmFsIHN0YXRlLgppbnQgX3NjYW4oU3RyaW5nIHVyaSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgc3RhdGUsIExpc3Q8aW50PiBpbmRpY2VzKSB7CiAgdmFyIHRhYmxlcyA9IF9zY2FubmVyVGFibGVzOwogIGFzc2VydChlbmQgPD0gdXJpLmxlbmd0aCk7CiAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgIHZhciB0YWJsZSA9IHRhYmxlc1tzdGF0ZV07CiAgICAvLyBYb3Igd2l0aCAweDYwIHRvIG1vdmUgcmFuZ2UgMHgyMC0weDdmIGludG8gMHgwMC0weDVmCiAgICBpbnQgY2hhciA9IHVyaS5jb2RlVW5pdEF0KGkpIF4gMHg2MDsKICAgIC8vIFVzZSAweDFmIChuZWUgMHg3ZikgdG8gcmVwcmVzZW50IGFsbCB1bmhhbmRsZWQgY2hhcmFjdGVycy4KICAgIGlmIChjaGFyID4gMHg1ZikgY2hhciA9IDB4MWY7CiAgICBpbnQgdHJhbnNpdGlvbiA9IHRhYmxlW2NoYXJdOwogICAgc3RhdGUgPSB0cmFuc2l0aW9uICYgMHgxZjsKICAgIGluZGljZXNbdHJhbnNpdGlvbiA+PiA1XSA9IGk7CiAgfQogIHJldHVybiBzdGF0ZTsKfQoKY2xhc3MgX1NpbXBsZVVyaSBpbXBsZW1lbnRzIFVyaSB7CiAgZmluYWwgU3RyaW5nIF91cmk7CiAgZmluYWwgaW50IF9zY2hlbWVFbmQ7CiAgZmluYWwgaW50IF9ob3N0U3RhcnQ7CiAgZmluYWwgaW50IF9wb3J0U3RhcnQ7CiAgZmluYWwgaW50IF9wYXRoU3RhcnQ7CiAgZmluYWwgaW50IF9xdWVyeVN0YXJ0OwogIGZpbmFsIGludCBfZnJhZ21lbnRTdGFydDsKCiAgLy8vIFRoZSBzY2hlbWUgaXMgb2Z0ZW4gdXNlZCB0byBkaXN0aW5ndWlzaCBVUklzLgogIC8vLyBUbyBtYWtlIGNvbXBhcmlzb25zIG1vcmUgZWZmaWNpZW50LCB3ZSBjYWNoZSB0aGUgdmFsdWUsIGFuZAogIC8vLyBjYW5vbmljYWxpemUgYSBmZXcga25vd24gdHlwZXMuCiAgU3RyaW5nIF9zY2hlbWVDYWNoZTsKICBpbnQgX2hhc2hDb2RlQ2FjaGU7CgogIF9TaW1wbGVVcmkoCiAgICAgIHRoaXMuX3VyaSwKICAgICAgdGhpcy5fc2NoZW1lRW5kLAogICAgICB0aGlzLl9ob3N0U3RhcnQsCiAgICAgIHRoaXMuX3BvcnRTdGFydCwKICAgICAgdGhpcy5fcGF0aFN0YXJ0LAogICAgICB0aGlzLl9xdWVyeVN0YXJ0LAogICAgICB0aGlzLl9mcmFnbWVudFN0YXJ0LAogICAgICB0aGlzLl9zY2hlbWVDYWNoZSk7CgogIGJvb2wgZ2V0IGhhc1NjaGVtZSA9PiBfc2NoZW1lRW5kID4gMDsKICBib29sIGdldCBoYXNBdXRob3JpdHkgPT4gX2hvc3RTdGFydCA+IDA7CiAgYm9vbCBnZXQgaGFzVXNlckluZm8gPT4gX2hvc3RTdGFydCA+IF9zY2hlbWVFbmQgKyA0OwogIGJvb2wgZ2V0IGhhc1BvcnQgPT4gX2hvc3RTdGFydCA+IDAgJiYgX3BvcnRTdGFydCArIDEgPCBfcGF0aFN0YXJ0OwogIGJvb2wgZ2V0IGhhc1F1ZXJ5ID0+IF9xdWVyeVN0YXJ0IDwgX2ZyYWdtZW50U3RhcnQ7CiAgYm9vbCBnZXQgaGFzRnJhZ21lbnQgPT4gX2ZyYWdtZW50U3RhcnQgPCBfdXJpLmxlbmd0aDsKCiAgYm9vbCBnZXQgX2lzRmlsZSA9PiBfc2NoZW1lRW5kID09IDQgJiYgX3VyaS5zdGFydHNXaXRoKCJmaWxlIik7CiAgYm9vbCBnZXQgX2lzSHR0cCA9PiBfc2NoZW1lRW5kID09IDQgJiYgX3VyaS5zdGFydHNXaXRoKCJodHRwIik7CiAgYm9vbCBnZXQgX2lzSHR0cHMgPT4gX3NjaGVtZUVuZCA9PSA1ICYmIF91cmkuc3RhcnRzV2l0aCgiaHR0cHMiKTsKICBib29sIGdldCBfaXNQYWNrYWdlID0+IF9zY2hlbWVFbmQgPT0gNyAmJiBfdXJpLnN0YXJ0c1dpdGgoInBhY2thZ2UiKTsKCiAgLy8vIExpa2UgW2lzU2NoZW1lXSBidXQgZXhwZWN0cyBhcmd1bWVudCB0byBiZSBjYXNlIG5vcm1hbGl6ZWQuCiAgYm9vbCBfaXNTY2hlbWUoU3RyaW5nIHNjaGVtZSkgPT4KICAgICAgX3NjaGVtZUVuZCA9PSBzY2hlbWUubGVuZ3RoICYmIF91cmkuc3RhcnRzV2l0aChzY2hlbWUpOwoKICBib29sIGdldCBoYXNBYnNvbHV0ZVBhdGggPT4gX3VyaS5zdGFydHNXaXRoKCIvIiwgX3BhdGhTdGFydCk7CiAgYm9vbCBnZXQgaGFzRW1wdHlQYXRoID0+IF9wYXRoU3RhcnQgPT0gX3F1ZXJ5U3RhcnQ7CgogIGJvb2wgZ2V0IGlzQWJzb2x1dGUgPT4gaGFzU2NoZW1lICYmICFoYXNGcmFnbWVudDsKCiAgYm9vbCBpc1NjaGVtZShTdHJpbmcgc2NoZW1lKSB7CiAgICBpZiAoc2NoZW1lID09IG51bGwgfHwgc2NoZW1lLmlzRW1wdHkpIHJldHVybiBfc2NoZW1lRW5kIDwgMDsKICAgIGlmIChzY2hlbWUubGVuZ3RoICE9IF9zY2hlbWVFbmQpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfVXJpLl9jb21wYXJlU2NoZW1lKHNjaGVtZSwgX3VyaSk7CiAgfQoKICBTdHJpbmcgZ2V0IHNjaGVtZSB7CiAgICBpZiAoX3NjaGVtZUVuZCA8PSAwKSByZXR1cm4gIiI7CiAgICBpZiAoX3NjaGVtZUNhY2hlICE9IG51bGwpIHJldHVybiBfc2NoZW1lQ2FjaGU7CiAgICBpZiAoX2lzSHR0cCkgewogICAgICBfc2NoZW1lQ2FjaGUgPSAiaHR0cCI7CiAgICB9IGVsc2UgaWYgKF9pc0h0dHBzKSB7CiAgICAgIF9zY2hlbWVDYWNoZSA9ICJodHRwcyI7CiAgICB9IGVsc2UgaWYgKF9pc0ZpbGUpIHsKICAgICAgX3NjaGVtZUNhY2hlID0gImZpbGUiOwogICAgfSBlbHNlIGlmIChfaXNQYWNrYWdlKSB7CiAgICAgIF9zY2hlbWVDYWNoZSA9ICJwYWNrYWdlIjsKICAgIH0gZWxzZSB7CiAgICAgIF9zY2hlbWVDYWNoZSA9IF91cmkuc3Vic3RyaW5nKDAsIF9zY2hlbWVFbmQpOwogICAgfQogICAgcmV0dXJuIF9zY2hlbWVDYWNoZTsKICB9CgogIFN0cmluZyBnZXQgYXV0aG9yaXR5ID0+CiAgICAgIF9ob3N0U3RhcnQgPiAwID8gX3VyaS5zdWJzdHJpbmcoX3NjaGVtZUVuZCArIDMsIF9wYXRoU3RhcnQpIDogIiI7CiAgU3RyaW5nIGdldCB1c2VySW5mbyA9PiAoX2hvc3RTdGFydCA+IF9zY2hlbWVFbmQgKyAzKQogICAgICA/IF91cmkuc3Vic3RyaW5nKF9zY2hlbWVFbmQgKyAzLCBfaG9zdFN0YXJ0IC0gMSkKICAgICAgOiAiIjsKICBTdHJpbmcgZ2V0IGhvc3QgPT4KICAgICAgX2hvc3RTdGFydCA+IDAgPyBfdXJpLnN1YnN0cmluZyhfaG9zdFN0YXJ0LCBfcG9ydFN0YXJ0KSA6ICIiOwogIGludCBnZXQgcG9ydCB7CiAgICBpZiAoaGFzUG9ydCkgcmV0dXJuIGludC5wYXJzZShfdXJpLnN1YnN0cmluZyhfcG9ydFN0YXJ0ICsgMSwgX3BhdGhTdGFydCkpOwogICAgaWYgKF9pc0h0dHApIHJldHVybiA4MDsKICAgIGlmIChfaXNIdHRwcykgcmV0dXJuIDQ0MzsKICAgIHJldHVybiAwOwogIH0KCiAgU3RyaW5nIGdldCBwYXRoID0+IF91cmkuc3Vic3RyaW5nKF9wYXRoU3RhcnQsIF9xdWVyeVN0YXJ0KTsKICBTdHJpbmcgZ2V0IHF1ZXJ5ID0+IChfcXVlcnlTdGFydCA8IF9mcmFnbWVudFN0YXJ0KQogICAgICA/IF91cmkuc3Vic3RyaW5nKF9xdWVyeVN0YXJ0ICsgMSwgX2ZyYWdtZW50U3RhcnQpCiAgICAgIDogIiI7CiAgU3RyaW5nIGdldCBmcmFnbWVudCA9PgogICAgICAoX2ZyYWdtZW50U3RhcnQgPCBfdXJpLmxlbmd0aCkgPyBfdXJpLnN1YnN0cmluZyhfZnJhZ21lbnRTdGFydCArIDEpIDogIiI7CgogIFN0cmluZyBnZXQgb3JpZ2luIHsKICAgIC8vIENoZWNrIG9yaWdpbmFsIGJlaGF2aW9yIC0gVzNDIHNwZWMgaXMgd29ua3khCiAgICBib29sIGlzSHR0cCA9IF9pc0h0dHA7CiAgICBpZiAoX3NjaGVtZUVuZCA8IDApIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigiQ2Fubm90IHVzZSBvcmlnaW4gd2l0aG91dCBhIHNjaGVtZTogJHRoaXMiKTsKICAgIH0KICAgIGlmICghaXNIdHRwICYmICFfaXNIdHRwcykgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKAogICAgICAgICAgIk9yaWdpbiBpcyBvbmx5IGFwcGxpY2FibGUgdG8gc2NoZW1lcyBodHRwIGFuZCBodHRwczogJHRoaXMiKTsKICAgIH0KICAgIGlmIChfaG9zdFN0YXJ0ID09IF9wb3J0U3RhcnQpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigKICAgICAgICAgICJBICRzY2hlbWU6IFVSSSBzaG91bGQgaGF2ZSBhIG5vbi1lbXB0eSBob3N0IG5hbWU6ICR0aGlzIik7CiAgICB9CiAgICBpZiAoX2hvc3RTdGFydCA9PSBfc2NoZW1lRW5kICsgMykgewogICAgICByZXR1cm4gX3VyaS5zdWJzdHJpbmcoMCwgX3BhdGhTdGFydCk7CiAgICB9CiAgICAvLyBOZWVkIHRvIGRyb3AgYW5vbi1lbXB0eSB1c2VySW5mby4KICAgIHJldHVybiBfdXJpLnN1YnN0cmluZygwLCBfc2NoZW1lRW5kICsgMykgKwogICAgICAgIF91cmkuc3Vic3RyaW5nKF9ob3N0U3RhcnQsIF9wYXRoU3RhcnQpOwogIH0KCiAgTGlzdDxTdHJpbmc+IGdldCBwYXRoU2VnbWVudHMgewogICAgaW50IHN0YXJ0ID0gX3BhdGhTdGFydDsKICAgIGludCBlbmQgPSBfcXVlcnlTdGFydDsKICAgIGlmIChfdXJpLnN0YXJ0c1dpdGgoIi8iLCBzdGFydCkpIHN0YXJ0Kys7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gY29uc3QgPFN0cmluZz5bXTsKICAgIExpc3Q8U3RyaW5nPiBwYXJ0cyA9IFtdOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGNoYXIgPSBfdXJpLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjaGFyID09IF9TTEFTSCkgewogICAgICAgIHBhcnRzLmFkZChfdXJpLnN1YnN0cmluZyhzdGFydCwgaSkpOwogICAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICAgIH0KICAgIH0KICAgIHBhcnRzLmFkZChfdXJpLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7CiAgICByZXR1cm4gTGlzdDxTdHJpbmc+LnVubW9kaWZpYWJsZShwYXJ0cyk7CiAgfQoKICBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldCBxdWVyeVBhcmFtZXRlcnMgewogICAgaWYgKCFoYXNRdWVyeSkgcmV0dXJuIGNvbnN0IDxTdHJpbmcsIFN0cmluZz57fTsKICAgIHJldHVybiBVbm1vZGlmaWFibGVNYXBWaWV3PFN0cmluZywgU3RyaW5nPihVcmkuc3BsaXRRdWVyeVN0cmluZyhxdWVyeSkpOwogIH0KCiAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXQgcXVlcnlQYXJhbWV0ZXJzQWxsIHsKICAgIGlmICghaGFzUXVlcnkpIHJldHVybiBjb25zdCA8U3RyaW5nLCBMaXN0PFN0cmluZz4+e307CiAgICBNYXAgcXVlcnlQYXJhbWV0ZXJMaXN0cyA9IF9VcmkuX3NwbGl0UXVlcnlTdHJpbmdBbGwocXVlcnkpOwogICAgZm9yICh2YXIga2V5IGluIHF1ZXJ5UGFyYW1ldGVyTGlzdHMua2V5cykgewogICAgICBxdWVyeVBhcmFtZXRlckxpc3RzW2tleV0gPQogICAgICAgICAgTGlzdDxTdHJpbmc+LnVubW9kaWZpYWJsZShxdWVyeVBhcmFtZXRlckxpc3RzW2tleV0pOwogICAgfQogICAgcmV0dXJuIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4udW5tb2RpZmlhYmxlKHF1ZXJ5UGFyYW1ldGVyTGlzdHMpOwogIH0KCiAgYm9vbCBfaXNQb3J0KFN0cmluZyBwb3J0KSB7CiAgICBpbnQgcG9ydERpZ2l0U3RhcnQgPSBfcG9ydFN0YXJ0ICsgMTsKICAgIHJldHVybiBwb3J0RGlnaXRTdGFydCArIHBvcnQubGVuZ3RoID09IF9wYXRoU3RhcnQgJiYKICAgICAgICBfdXJpLnN0YXJ0c1dpdGgocG9ydCwgcG9ydERpZ2l0U3RhcnQpOwogIH0KCiAgVXJpIG5vcm1hbGl6ZVBhdGgoKSA9PiB0aGlzOwoKICBVcmkgcmVtb3ZlRnJhZ21lbnQoKSB7CiAgICBpZiAoIWhhc0ZyYWdtZW50KSByZXR1cm4gdGhpczsKICAgIHJldHVybiBfU2ltcGxlVXJpKF91cmkuc3Vic3RyaW5nKDAsIF9mcmFnbWVudFN0YXJ0KSwgX3NjaGVtZUVuZCwgX2hvc3RTdGFydCwKICAgICAgICBfcG9ydFN0YXJ0LCBfcGF0aFN0YXJ0LCBfcXVlcnlTdGFydCwgX2ZyYWdtZW50U3RhcnQsIF9zY2hlbWVDYWNoZSk7CiAgfQoKICBVcmkgcmVwbGFjZSgKICAgICAge1N0cmluZyBzY2hlbWUsCiAgICAgIFN0cmluZyB1c2VySW5mbywKICAgICAgU3RyaW5nIGhvc3QsCiAgICAgIGludCBwb3J0LAogICAgICBTdHJpbmcgcGF0aCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBwYXRoU2VnbWVudHMsCiAgICAgIFN0cmluZyBxdWVyeSwKICAgICAgTWFwPFN0cmluZywgZHluYW1pYyAvKlN0cmluZ3xJdGVyYWJsZTxTdHJpbmc+Ki8gPiBxdWVyeVBhcmFtZXRlcnMsCiAgICAgIFN0cmluZyBmcmFnbWVudH0pIHsKICAgIGJvb2wgc2NoZW1lQ2hhbmdlZCA9IGZhbHNlOwogICAgaWYgKHNjaGVtZSAhPSBudWxsKSB7CiAgICAgIHNjaGVtZSA9IF9VcmkuX21ha2VTY2hlbWUoc2NoZW1lLCAwLCBzY2hlbWUubGVuZ3RoKTsKICAgICAgc2NoZW1lQ2hhbmdlZCA9ICFfaXNTY2hlbWUoc2NoZW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHNjaGVtZSA9IHRoaXMuc2NoZW1lOwogICAgfQogICAgYm9vbCBpc0ZpbGUgPSAoc2NoZW1lID09ICJmaWxlIik7CiAgICBpZiAodXNlckluZm8gIT0gbnVsbCkgewogICAgICB1c2VySW5mbyA9IF9VcmkuX21ha2VVc2VySW5mbyh1c2VySW5mbywgMCwgdXNlckluZm8ubGVuZ3RoKTsKICAgIH0gZWxzZSBpZiAoX2hvc3RTdGFydCA+IDApIHsKICAgICAgdXNlckluZm8gPSBfdXJpLnN1YnN0cmluZyhfc2NoZW1lRW5kICsgMywgX2hvc3RTdGFydCk7CiAgICB9IGVsc2UgewogICAgICB1c2VySW5mbyA9ICIiOwogICAgfQogICAgaWYgKHBvcnQgIT0gbnVsbCkgewogICAgICBwb3J0ID0gX1VyaS5fbWFrZVBvcnQocG9ydCwgc2NoZW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHBvcnQgPSB0aGlzLmhhc1BvcnQgPyB0aGlzLnBvcnQgOiBudWxsOwogICAgICBpZiAoc2NoZW1lQ2hhbmdlZCkgewogICAgICAgIC8vIFRoZSBkZWZhdWx0IHBvcnQgbWlnaHQgaGF2ZSBjaGFuZ2VkLgogICAgICAgIHBvcnQgPSBfVXJpLl9tYWtlUG9ydChwb3J0LCBzY2hlbWUpOwogICAgICB9CiAgICB9CiAgICBpZiAoaG9zdCAhPSBudWxsKSB7CiAgICAgIGhvc3QgPSBfVXJpLl9tYWtlSG9zdChob3N0LCAwLCBob3N0Lmxlbmd0aCwgZmFsc2UpOwogICAgfSBlbHNlIGlmIChfaG9zdFN0YXJ0ID4gMCkgewogICAgICBob3N0ID0gX3VyaS5zdWJzdHJpbmcoX2hvc3RTdGFydCwgX3BvcnRTdGFydCk7CiAgICB9IGVsc2UgaWYgKHVzZXJJbmZvLmlzTm90RW1wdHkgfHwgcG9ydCAhPSBudWxsIHx8IGlzRmlsZSkgewogICAgICBob3N0ID0gIiI7CiAgICB9CgogICAgYm9vbCBoYXNBdXRob3JpdHkgPSBob3N0ICE9IG51bGw7CiAgICBpZiAocGF0aCAhPSBudWxsIHx8IHBhdGhTZWdtZW50cyAhPSBudWxsKSB7CiAgICAgIHBhdGggPSBfVXJpLl9tYWtlUGF0aChwYXRoLCAwLCBfc3RyaW5nT3JOdWxsTGVuZ3RoKHBhdGgpLCBwYXRoU2VnbWVudHMsCiAgICAgICAgICBzY2hlbWUsIGhhc0F1dGhvcml0eSk7CiAgICB9IGVsc2UgewogICAgICBwYXRoID0gX3VyaS5zdWJzdHJpbmcoX3BhdGhTdGFydCwgX3F1ZXJ5U3RhcnQpOwogICAgICBpZiAoKGlzRmlsZSB8fCAoaGFzQXV0aG9yaXR5ICYmICFwYXRoLmlzRW1wdHkpKSAmJgogICAgICAgICAgIXBhdGguc3RhcnRzV2l0aCgnLycpKSB7CiAgICAgICAgcGF0aCA9ICIvIiArIHBhdGg7CiAgICAgIH0KICAgIH0KCiAgICBpZiAocXVlcnkgIT0gbnVsbCB8fCBxdWVyeVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBxdWVyeSA9IF9VcmkuX21ha2VRdWVyeSgKICAgICAgICAgIHF1ZXJ5LCAwLCBfc3RyaW5nT3JOdWxsTGVuZ3RoKHF1ZXJ5KSwgcXVlcnlQYXJhbWV0ZXJzKTsKICAgIH0gZWxzZSBpZiAoX3F1ZXJ5U3RhcnQgPCBfZnJhZ21lbnRTdGFydCkgewogICAgICBxdWVyeSA9IF91cmkuc3Vic3RyaW5nKF9xdWVyeVN0YXJ0ICsgMSwgX2ZyYWdtZW50U3RhcnQpOwogICAgfQoKICAgIGlmIChmcmFnbWVudCAhPSBudWxsKSB7CiAgICAgIGZyYWdtZW50ID0gX1VyaS5fbWFrZUZyYWdtZW50KGZyYWdtZW50LCAwLCBmcmFnbWVudC5sZW5ndGgpOwogICAgfSBlbHNlIGlmIChfZnJhZ21lbnRTdGFydCA8IF91cmkubGVuZ3RoKSB7CiAgICAgIGZyYWdtZW50ID0gX3VyaS5zdWJzdHJpbmcoX2ZyYWdtZW50U3RhcnQgKyAxKTsKICAgIH0KCiAgICByZXR1cm4gX1VyaS5faW50ZXJuYWwoc2NoZW1lLCB1c2VySW5mbywgaG9zdCwgcG9ydCwgcGF0aCwgcXVlcnksIGZyYWdtZW50KTsKICB9CgogIFVyaSByZXNvbHZlKFN0cmluZyByZWZlcmVuY2UpIHsKICAgIHJldHVybiByZXNvbHZlVXJpKFVyaS5wYXJzZShyZWZlcmVuY2UpKTsKICB9CgogIFVyaSByZXNvbHZlVXJpKFVyaSByZWZlcmVuY2UpIHsKICAgIGlmIChyZWZlcmVuY2UgaXMgX1NpbXBsZVVyaSkgewogICAgICByZXR1cm4gX3NpbXBsZU1lcmdlKHRoaXMsIHJlZmVyZW5jZSk7CiAgICB9CiAgICByZXR1cm4gX3RvTm9uU2ltcGxlKCkucmVzb2x2ZVVyaShyZWZlcmVuY2UpOwogIH0KCiAgLy8gTWVyZ2UgdHdvIHNpbXBsZSBVUklzLiBUaGlzIHNob3VsZCBhbHdheXMgcmVzdWx0IGluIGEgcHJlZml4IG9mCiAgLy8gb25lIGNvbmNhdGVuYXRlZCB3aXRoIGEgc3VmZml4IG9mIHRoZSBvdGhlciwgcG9zc2libHkgd2l0aCBhIGAvYCBpbgogIC8vIHRoZSBtaWRkbGUgb2YgdHdvIG1lcmdlZCBwYXRocywgd2hpY2ggaXMgYWdhaW4gc2ltcGxlLgogIC8vIEluIGEgZmV3IGNhc2VzLCB0aGVyZSBtaWdodCBiZSBhIG5lZWQgZm9yIGV4dHJhIG5vcm1hbGl6YXRpb24sIHdoZW4KICAvLyByZXNvbHZpbmcgb24gdG9wIG9mIGEga25vd24gc2NoZW1lLgogIFVyaSBfc2ltcGxlTWVyZ2UoX1NpbXBsZVVyaSBiYXNlLCBfU2ltcGxlVXJpIHJlZikgewogICAgaWYgKHJlZi5oYXNTY2hlbWUpIHJldHVybiByZWY7CiAgICBpZiAocmVmLmhhc0F1dGhvcml0eSkgewogICAgICBpZiAoIWJhc2UuaGFzU2NoZW1lKSByZXR1cm4gcmVmOwogICAgICBib29sIGlzU2ltcGxlID0gdHJ1ZTsKICAgICAgaWYgKGJhc2UuX2lzRmlsZSkgewogICAgICAgIGlzU2ltcGxlID0gIXJlZi5oYXNFbXB0eVBhdGg7CiAgICAgIH0gZWxzZSBpZiAoYmFzZS5faXNIdHRwKSB7CiAgICAgICAgaXNTaW1wbGUgPSAhcmVmLl9pc1BvcnQoIjgwIik7CiAgICAgIH0gZWxzZSBpZiAoYmFzZS5faXNIdHRwcykgewogICAgICAgIGlzU2ltcGxlID0gIXJlZi5faXNQb3J0KCI0NDMiKTsKICAgICAgfQogICAgICBpZiAoaXNTaW1wbGUpIHsKICAgICAgICB2YXIgZGVsdGEgPSBiYXNlLl9zY2hlbWVFbmQgKyAxOwogICAgICAgIHZhciBuZXdVcmkgPSBiYXNlLl91cmkuc3Vic3RyaW5nKDAsIGJhc2UuX3NjaGVtZUVuZCArIDEpICsKICAgICAgICAgICAgcmVmLl91cmkuc3Vic3RyaW5nKHJlZi5fc2NoZW1lRW5kICsgMSk7CiAgICAgICAgcmV0dXJuIF9TaW1wbGVVcmkoCiAgICAgICAgICAgIG5ld1VyaSwKICAgICAgICAgICAgYmFzZS5fc2NoZW1lRW5kLAogICAgICAgICAgICByZWYuX2hvc3RTdGFydCArIGRlbHRhLAogICAgICAgICAgICByZWYuX3BvcnRTdGFydCArIGRlbHRhLAogICAgICAgICAgICByZWYuX3BhdGhTdGFydCArIGRlbHRhLAogICAgICAgICAgICByZWYuX3F1ZXJ5U3RhcnQgKyBkZWx0YSwKICAgICAgICAgICAgcmVmLl9mcmFnbWVudFN0YXJ0ICsgZGVsdGEsCiAgICAgICAgICAgIGJhc2UuX3NjaGVtZUNhY2hlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGlzIHdpbGwgcmVxdWlyZSBub3JtYWxpemF0aW9uLCBzbyB1c2UgdGhlIF9VcmkgaW1wbGVtZW50YXRpb24uCiAgICAgICAgcmV0dXJuIF90b05vblNpbXBsZSgpLnJlc29sdmVVcmkocmVmKTsKICAgICAgfQogICAgfQogICAgaWYgKHJlZi5oYXNFbXB0eVBhdGgpIHsKICAgICAgaWYgKHJlZi5oYXNRdWVyeSkgewogICAgICAgIGludCBkZWx0YSA9IGJhc2UuX3F1ZXJ5U3RhcnQgLSByZWYuX3F1ZXJ5U3RhcnQ7CiAgICAgICAgdmFyIG5ld1VyaSA9IGJhc2UuX3VyaS5zdWJzdHJpbmcoMCwgYmFzZS5fcXVlcnlTdGFydCkgKwogICAgICAgICAgICByZWYuX3VyaS5zdWJzdHJpbmcocmVmLl9xdWVyeVN0YXJ0KTsKICAgICAgICByZXR1cm4gX1NpbXBsZVVyaSgKICAgICAgICAgICAgbmV3VXJpLAogICAgICAgICAgICBiYXNlLl9zY2hlbWVFbmQsCiAgICAgICAgICAgIGJhc2UuX2hvc3RTdGFydCwKICAgICAgICAgICAgYmFzZS5fcG9ydFN0YXJ0LAogICAgICAgICAgICBiYXNlLl9wYXRoU3RhcnQsCiAgICAgICAgICAgIHJlZi5fcXVlcnlTdGFydCArIGRlbHRhLAogICAgICAgICAgICByZWYuX2ZyYWdtZW50U3RhcnQgKyBkZWx0YSwKICAgICAgICAgICAgYmFzZS5fc2NoZW1lQ2FjaGUpOwogICAgICB9CiAgICAgIGlmIChyZWYuaGFzRnJhZ21lbnQpIHsKICAgICAgICBpbnQgZGVsdGEgPSBiYXNlLl9mcmFnbWVudFN0YXJ0IC0gcmVmLl9mcmFnbWVudFN0YXJ0OwogICAgICAgIHZhciBuZXdVcmkgPSBiYXNlLl91cmkuc3Vic3RyaW5nKDAsIGJhc2UuX2ZyYWdtZW50U3RhcnQpICsKICAgICAgICAgICAgcmVmLl91cmkuc3Vic3RyaW5nKHJlZi5fZnJhZ21lbnRTdGFydCk7CiAgICAgICAgcmV0dXJuIF9TaW1wbGVVcmkoCiAgICAgICAgICAgIG5ld1VyaSwKICAgICAgICAgICAgYmFzZS5fc2NoZW1lRW5kLAogICAgICAgICAgICBiYXNlLl9ob3N0U3RhcnQsCiAgICAgICAgICAgIGJhc2UuX3BvcnRTdGFydCwKICAgICAgICAgICAgYmFzZS5fcGF0aFN0YXJ0LAogICAgICAgICAgICBiYXNlLl9xdWVyeVN0YXJ0LAogICAgICAgICAgICByZWYuX2ZyYWdtZW50U3RhcnQgKyBkZWx0YSwKICAgICAgICAgICAgYmFzZS5fc2NoZW1lQ2FjaGUpOwogICAgICB9CiAgICAgIHJldHVybiBiYXNlLnJlbW92ZUZyYWdtZW50KCk7CiAgICB9CiAgICBpZiAocmVmLmhhc0Fic29sdXRlUGF0aCkgewogICAgICB2YXIgZGVsdGEgPSBiYXNlLl9wYXRoU3RhcnQgLSByZWYuX3BhdGhTdGFydDsKICAgICAgdmFyIG5ld1VyaSA9IGJhc2UuX3VyaS5zdWJzdHJpbmcoMCwgYmFzZS5fcGF0aFN0YXJ0KSArCiAgICAgICAgICByZWYuX3VyaS5zdWJzdHJpbmcocmVmLl9wYXRoU3RhcnQpOwogICAgICByZXR1cm4gX1NpbXBsZVVyaSgKICAgICAgICAgIG5ld1VyaSwKICAgICAgICAgIGJhc2UuX3NjaGVtZUVuZCwKICAgICAgICAgIGJhc2UuX2hvc3RTdGFydCwKICAgICAgICAgIGJhc2UuX3BvcnRTdGFydCwKICAgICAgICAgIGJhc2UuX3BhdGhTdGFydCwKICAgICAgICAgIHJlZi5fcXVlcnlTdGFydCArIGRlbHRhLAogICAgICAgICAgcmVmLl9mcmFnbWVudFN0YXJ0ICsgZGVsdGEsCiAgICAgICAgICBiYXNlLl9zY2hlbWVDYWNoZSk7CiAgICB9CiAgICBpZiAoYmFzZS5oYXNFbXB0eVBhdGggJiYgYmFzZS5oYXNBdXRob3JpdHkpIHsKICAgICAgLy8gcmVmIGhhcyByZWxhdGl2ZSBub24tZW1wdHkgcGF0aC4KICAgICAgLy8gQWRkIGEgIi8iIGluIGZyb250LCB0aGVuIGxlYWRpbmcgIi8uLi8iIHNlZ21lbnRzIGFyZSBmb2xkZWQgdG8gIi8iLgogICAgICBpbnQgcmVmU3RhcnQgPSByZWYuX3BhdGhTdGFydDsKICAgICAgd2hpbGUgKHJlZi5fdXJpLnN0YXJ0c1dpdGgoIi4uLyIsIHJlZlN0YXJ0KSkgewogICAgICAgIHJlZlN0YXJ0ICs9IDM7CiAgICAgIH0KICAgICAgdmFyIGRlbHRhID0gYmFzZS5fcGF0aFN0YXJ0IC0gcmVmU3RhcnQgKyAxOwogICAgICB2YXIgbmV3VXJpID0gIiR7YmFzZS5fdXJpLnN1YnN0cmluZygwLCBiYXNlLl9wYXRoU3RhcnQpfS8iCiAgICAgICAgICAiJHtyZWYuX3VyaS5zdWJzdHJpbmcocmVmU3RhcnQpfSI7CiAgICAgIHJldHVybiBfU2ltcGxlVXJpKAogICAgICAgICAgbmV3VXJpLAogICAgICAgICAgYmFzZS5fc2NoZW1lRW5kLAogICAgICAgICAgYmFzZS5faG9zdFN0YXJ0LAogICAgICAgICAgYmFzZS5fcG9ydFN0YXJ0LAogICAgICAgICAgYmFzZS5fcGF0aFN0YXJ0LAogICAgICAgICAgcmVmLl9xdWVyeVN0YXJ0ICsgZGVsdGEsCiAgICAgICAgICByZWYuX2ZyYWdtZW50U3RhcnQgKyBkZWx0YSwKICAgICAgICAgIGJhc2UuX3NjaGVtZUNhY2hlKTsKICAgIH0KICAgIC8vIE1lcmdlIHBhdGhzLgoKICAgIC8vIFRoZSBSRkMgMzk4NiBhbGdvcml0aG0gbWVyZ2VzIHRoZSBiYXNlIHBhdGggd2l0aG91dCBpdHMgZmluYWwgc2VnbWVudAogICAgLy8gKGFueXRoaW5nIGFmdGVyIHRoZSBmaW5hbCAiLyIsIG9yIGV2ZXJ5dGhpbmcgaWYgdGhlIGJhc2UgcGF0aCBkb2Vzbid0CiAgICAvLyBjb250YWluIGFueSAiLyIpLCBhbmQgdGhlIHJlZmVyZW5jZSBwYXRoLgogICAgLy8gVGhlbiBpdCByZW1vdmVzICIuIiBhbmQgIi4uIiBzZWdtZW50cyB1c2luZyB0aGUgcmVtb3ZlLWRvdC1zZWdtZW50CiAgICAvLyBhbGdvcml0aG0uCiAgICAvLyBUaGlzIGNvZGUgY29tYmluZXMgdGhlIHR3byBzdGVwcy4gSXQgaXMgc2ltcGxpZmllZCBieSBrbm93aW5nIHRoYXQKICAgIC8vIHRoZSBiYXNlIHBhdGggY29udGFpbnMgbm8gIi4iIG9yICIuLiIgc2VnbWVudHMsIGFuZCB0aGUgcmVmZXJlbmNlCiAgICAvLyBwYXRoIGNhbiBvbmx5IGNvbnRhaW4gbGVhZGluZyAiLi4iIHNlZ21lbnRzLgoKICAgIFN0cmluZyBiYXNlVXJpID0gYmFzZS5fdXJpOwogICAgU3RyaW5nIHJlZlVyaSA9IHJlZi5fdXJpOwogICAgaW50IGJhc2VTdGFydCA9IGJhc2UuX3BhdGhTdGFydDsKICAgIGludCBiYXNlRW5kID0gYmFzZS5fcXVlcnlTdGFydDsKICAgIHdoaWxlIChiYXNlVXJpLnN0YXJ0c1dpdGgoIi4uLyIsIGJhc2VTdGFydCkpIGJhc2VTdGFydCArPSAzOwogICAgaW50IHJlZlN0YXJ0ID0gcmVmLl9wYXRoU3RhcnQ7CiAgICBpbnQgcmVmRW5kID0gcmVmLl9xdWVyeVN0YXJ0OwoKICAgIC8vLyBDb3VudCBvZiBsZWFkaW5nICIuLiIgc2VnbWVudHMgaW4gcmVmZXJlbmNlIHBhdGguCiAgICAvLy8gVGhlIGNvdW50IGlzIGRlY3JlbWVudGVkIHdoZW4gdGhlIHNlZ21lbnQgaXMgbWF0Y2hlZCB3aXRoIGEKICAgIC8vLyBzZWdtZW50IG9mIHRoZSBiYXNlIHBhdGgsIGFuZCBib3RoIGFyZSB0aGVuIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0LgogICAgaW50IGJhY2tDb3VudCA9IDA7CgogICAgLy8vIENvdW50ICIuLi8iIHNlZ21lbnRzIGFuZCBhZHZhbmNlIGByZWZTdGFydGAgdG8gYWZ0ZXIgdGhlIHNlZ21lbnRzLgogICAgd2hpbGUgKHJlZlN0YXJ0ICsgMyA8PSByZWZFbmQgJiYgcmVmVXJpLnN0YXJ0c1dpdGgoIi4uLyIsIHJlZlN0YXJ0KSkgewogICAgICByZWZTdGFydCArPSAzOwogICAgICBiYWNrQ291bnQgKz0gMTsKICAgIH0KCiAgICAvLyBFeHRyYSBzbGFzaCBpbnNlcnRlZCBiZXR3ZWVuIGJhc2UgYW5kIHJlZmVyZW5jZSBwYXRoIHBhcnRzIGlmCiAgICAvLyB0aGUgYmFzZSBwYXRoIGNvbnRhaW5zIGFueSBzbGFzaGVzLCBvciBlbXB0eSBzdHJpbmcgaWYgbm9uZS4KICAgIC8vIChXZSBjb3VsZCB1c2UgYSBzbGFzaCBmcm9tIHRoZSBiYXNlIHBhdGggaW4gbW9zdCBjYXNlcywgYnV0IG5vdCBpZgogICAgLy8gd2UgcmVtb3ZlIHRoZSBlbnRpcmUgYmFzZSBwYXRoKS4KICAgIFN0cmluZyBpbnNlcnQgPSAiIjsKCiAgICAvLy8gUmVtb3ZlIHNlZ21lbnRzIGZyb20gdGhlIGJhc2UgcGF0aC4KICAgIC8vLyBTdGFydCB3aXRoIHRoZSBzZWdtZW50IHRyYWlsaW5nIHRoZSBsYXN0IHNsYXNoLAogICAgLy8vIHRoZW4gcmVtb3ZlIHNlZ21lbnRzIGZvciBlYWNoIGxlYWRpbmcgIi4uLyIgc2VnbWVudAogICAgLy8vIGZyb20gdGhlIHJlZmVyZW5jZSBwYXRoLCBvciBhcyBtYW55IG9mIHRoZW0gYXMgYXJlIGF2YWlsYWJsZS4KICAgIHdoaWxlIChiYXNlRW5kID4gYmFzZVN0YXJ0KSB7CiAgICAgIGJhc2VFbmQtLTsKICAgICAgaW50IGNoYXIgPSBiYXNlVXJpLmNvZGVVbml0QXQoYmFzZUVuZCk7CiAgICAgIGlmIChjaGFyID09IF9TTEFTSCkgewogICAgICAgIGluc2VydCA9ICIvIjsKICAgICAgICBpZiAoYmFja0NvdW50ID09IDApIGJyZWFrOwogICAgICAgIGJhY2tDb3VudC0tOwogICAgICB9CiAgICB9CgogICAgaWYgKGJhc2VFbmQgPT0gYmFzZVN0YXJ0ICYmICFiYXNlLmhhc1NjaGVtZSAmJiAhYmFzZS5oYXNBYnNvbHV0ZVBhdGgpIHsKICAgICAgLy8gSWYgdGhlIGJhc2UgaXMgKmp1c3QqIGEgcmVsYXRpdmUgcGF0aCAobm8gc2NoZW1lIG9yIGF1dGhvcml0eSksCiAgICAgIC8vIHRoZW4gbWVyZ2luZyB3aXRoIGFub3RoZXIgcmVsYXRpdmUgcGF0aCBkb2Vzbid0IGZvbGxvdyB0aGUKICAgICAgLy8gUkZDLTM5ODYgYmVoYXZpb3IuCiAgICAgIC8vIERvbid0IG5lZWQgdG8gY2hlY2sgYGJhc2UuaGFzQXV0aG9yaXR5YCBzaW5jZSB0aGUgYmFzZSBwYXRoIGlzCiAgICAgIC8vIG5vbi1lbXB0eSAtIGlmIHRoZXJlIGlzIGFuIGF1dGhvcml0eSwgYSBub24tZW1wdHkgcGF0aCBpcyBhYnNvbHV0ZS4KCiAgICAgIC8vIFdlIHJlYWNoZWQgdGhlIHN0YXJ0IG9mIHRoZSBiYXNlIHBhdGgsIGFuZCB3YW50IHRvIHN0YXkgcmVsYXRpdmUsCiAgICAgIC8vIHNvIGRvbid0IGluc2VydCBhIHNsYXNoLgogICAgICBpbnNlcnQgPSAiIjsKICAgICAgLy8gSWYgd2UgcmVhY2hlZCB0aGUgc3RhcnQgb2YgdGhlIGJhc2UgcGF0aCB3aXRoIG1vcmUgIi4uLyIgbGVmdCBvdmVyCiAgICAgIC8vIGluIHRoZSByZWZlcmVuY2UgcGF0aCwgaW5jbHVkZSB0aG9zZSBzZWdtZW50cyBpbiB0aGUgcmVzdWx0LgogICAgICByZWZTdGFydCAtPSBiYWNrQ291bnQgKiAzOwogICAgfQoKICAgIHZhciBkZWx0YSA9IGJhc2VFbmQgLSByZWZTdGFydCArIGluc2VydC5sZW5ndGg7CiAgICB2YXIgbmV3VXJpID0gIiR7YmFzZS5fdXJpLnN1YnN0cmluZygwLCBiYXNlRW5kKX0kaW5zZXJ0IgogICAgICAgICIke3JlZi5fdXJpLnN1YnN0cmluZyhyZWZTdGFydCl9IjsKCiAgICByZXR1cm4gX1NpbXBsZVVyaSgKICAgICAgICBuZXdVcmksCiAgICAgICAgYmFzZS5fc2NoZW1lRW5kLAogICAgICAgIGJhc2UuX2hvc3RTdGFydCwKICAgICAgICBiYXNlLl9wb3J0U3RhcnQsCiAgICAgICAgYmFzZS5fcGF0aFN0YXJ0LAogICAgICAgIHJlZi5fcXVlcnlTdGFydCArIGRlbHRhLAogICAgICAgIHJlZi5fZnJhZ21lbnRTdGFydCArIGRlbHRhLAogICAgICAgIGJhc2UuX3NjaGVtZUNhY2hlKTsKICB9CgogIFN0cmluZyB0b0ZpbGVQYXRoKHtib29sIHdpbmRvd3N9KSB7CiAgICBpZiAoX3NjaGVtZUVuZCA+PSAwICYmICFfaXNGaWxlKSB7CiAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSAkc2NoZW1lIFVSSSIpOwogICAgfQogICAgaWYgKF9xdWVyeVN0YXJ0IDwgX3VyaS5sZW5ndGgpIHsKICAgICAgaWYgKF9xdWVyeVN0YXJ0IDwgX2ZyYWdtZW50U3RhcnQpIHsKICAgICAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgICAiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgcXVlcnkgY29tcG9uZW50Iik7CiAgICAgIH0KICAgICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdpdGggYSBmcmFnbWVudCBjb21wb25lbnQiKTsKICAgIH0KICAgIHdpbmRvd3MgPz89IF9VcmkuX2lzV2luZG93czsKICAgIHJldHVybiB3aW5kb3dzID8gX1VyaS5fdG9XaW5kb3dzRmlsZVBhdGgodGhpcykgOiBfdG9GaWxlUGF0aCgpOwogIH0KCiAgU3RyaW5nIF90b0ZpbGVQYXRoKCkgewogICAgaWYgKF9ob3N0U3RhcnQgPCBfcG9ydFN0YXJ0KSB7CiAgICAgIC8vIEhhcyBhdXRob3JpdHkgYW5kIG5vbi1lbXB0eSBob3N0LgogICAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgIkNhbm5vdCBleHRyYWN0IGEgbm9uLVdpbmRvd3MgZmlsZSBwYXRoIGZyb20gYSBmaWxlIFVSSSAiCiAgICAgICAgICAid2l0aCBhbiBhdXRob3JpdHkiKTsKICAgIH0KICAgIHJldHVybiB0aGlzLnBhdGg7CiAgfQoKICBVcmlEYXRhIGdldCBkYXRhIHsKICAgIGFzc2VydChzY2hlbWUgIT0gImRhdGEiKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfaGFzaENvZGVDYWNoZSA/Pz0gX3VyaS5oYXNoQ29kZTsKCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBvdGhlciBpcyBVcmkgJiYgX3VyaSA9PSBvdGhlci50b1N0cmluZygpOwogIH0KCiAgVXJpIF90b05vblNpbXBsZSgpIHsKICAgIHJldHVybiBfVXJpLl9pbnRlcm5hbCgKICAgICAgICB0aGlzLnNjaGVtZSwKICAgICAgICB0aGlzLnVzZXJJbmZvLAogICAgICAgIHRoaXMuaGFzQXV0aG9yaXR5ID8gdGhpcy5ob3N0IDogbnVsbCwKICAgICAgICB0aGlzLmhhc1BvcnQgPyB0aGlzLnBvcnQgOiBudWxsLAogICAgICAgIHRoaXMucGF0aCwKICAgICAgICB0aGlzLmhhc1F1ZXJ5ID8gdGhpcy5xdWVyeSA6IG51bGwsCiAgICAgICAgdGhpcy5oYXNGcmFnbWVudCA/IHRoaXMuZnJhZ21lbnQgOiBudWxsKTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+IF91cmk7Cn0KCi8vLyBTcGVjaWFsIFtfVXJpXSBjcmVhdGVkIGZyb20gYW4gZXhpc3RpbmcgW1VyaURhdGFdLgpjbGFzcyBfRGF0YVVyaSBleHRlbmRzIF9VcmkgewogIGZpbmFsIFVyaURhdGEgX2RhdGE7CgogIF9EYXRhVXJpKHRoaXMuX2RhdGEsIFN0cmluZyBwYXRoLCBTdHJpbmcgcXVlcnkpCiAgICAgIDogc3VwZXIuX2ludGVybmFsKCJkYXRhIiwgbnVsbCwgbnVsbCwgbnVsbCwgcGF0aCwgcXVlcnksIG51bGwpOwoKICBVcmlEYXRhIGdldCBkYXRhID0+IF9kYXRhOwp9CgovLy8gQ2hlY2tzIHdoZXRoZXIgW3RleHRdIHN0YXJ0cyB3aXRoICJkYXRhOiIgYXQgcG9zaXRpb24gW3N0YXJ0XS4KLy8vCi8vLyBUaGUgdGV4dCBtdXN0IGJlIGxvbmcgZW5vdWdoIHRvIGFsbG93IHJlYWRpbmcgZml2ZSBjaGFyYWN0ZXJzCi8vLyBmcm9tIHRoZSBbc3RhcnRdIHBvc2l0aW9uLgovLy8KLy8vIFJldHVybnMgYW4gaW50ZWdlciB2YWx1ZSB3aGljaCBpcyB6ZXJvIGlmIHRleHQgc3RhcnRzIHdpdGggYWxsLWxvd2VyY2FzZQovLy8gImRhdGE6IiBhbmQgMHgyMCBpZiB0aGUgdGV4dCBzdGFydHMgd2l0aCAiZGF0YToiIHRoYXQgaXNuJ3QgYWxsIGxvd2VyLWNhc2UuCi8vLyBBbGwgb3RoZXIgdmFsdWVzIG1lYW5zIHRoZSB0ZXh0IHN0YXJ0cyB3aXRoIHNvbWUgb3RoZXIgY2hhcmFjdGVyLgppbnQgX3N0YXJ0c1dpdGhEYXRhKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQpIHsKICAvLyBNdWx0aXBseSBieSAzIHRvIGF2b2lkIGEgbm9uLWNvbG9uIGNoYXJhY3RlciBtYWtpbmcg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ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7Cgp0eXBlZGVmIFVyaSBfVXJpQmFzZUNsb3N1cmUoKTsKClVyaSBfdW5zdXBwb3J0ZWRVcmlCYXNlKCkgewogIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCInVXJpLmJhc2UnIGlzIG5vdCBzdXBwb3J0ZWQiKTsKfQoKLy8gX3VyaUJhc2VDbG9zdXJlIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgZW1iZWRkZXIgdG8gc3VwcGx5IGEgZGlmZmVyZW50Ci8vIHZhbHVlIGZvciBVcmkuYmFzZS4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpfVXJpQmFzZUNsb3N1cmUgX3VyaUJhc2VDbG9zdXJlID0gX3Vuc3VwcG9ydGVkVXJpQmFzZTsKCkBwYXRjaApjbGFzcyBVcmkgewogIEBwYXRjaAogIHN0YXRpYyBVcmkgZ2V0IGJhc2UgPT4gX3VyaUJhc2VDbG9zdXJlKCk7Cn0KCi8vLyBWTSBpbXBsZW1lbnRhdGlvbiBvZiBVcmkuCkBwYXRjaApjbGFzcyBfVXJpIHsKICBzdGF0aWMgZmluYWwgYm9vbCBfaXNXaW5kb3dzQ2FjaGVkID0gX2lzV2luZG93c1BsYXRmb3JtOwoKICBzdGF0aWMgYm9vbCBnZXQgX2lzV2luZG93c1BsYXRmb3JtIG5hdGl2ZSAiVXJpX2lzV2luZG93c1BsYXRmb3JtIjsKCiAgQHBhdGNoCiAgc3RhdGljIGJvb2wgZ2V0IF9pc1dpbmRvd3MgPT4gX2lzV2luZG93c0NhY2hlZDsKCiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBfdXJpRW5jb2RlKExpc3Q8aW50PiBjYW5vbmljYWxUYWJsZSwgU3RyaW5nIHRleHQsCiAgICAgIEVuY29kaW5nIGVuY29kaW5nLCBib29sIHNwYWNlVG9QbHVzKSB7CiAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGUgdGV4dCB3aWxsIGJlIGNoYW5nZWQgYnkgZW5jb2RpbmcuCiAgICBpbnQgaSA9IDA7CiAgICBpZiAoaWRlbnRpY2FsKGVuY29kaW5nLCB1dGY4KSB8fAogICAgICAgIGlkZW50aWNhbChlbmNvZGluZywgbGF0aW4xKSB8fAogICAgICAgIGlkZW50aWNhbChlbmNvZGluZywgYXNjaWkpKSB7CiAgICAgIC8vIEVuY29kaW5nIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3JpZ2luYWwgc3RyaW5nLgogICAgICAvLyBGaW5kIGZpcnN0IGNoYXJhY3RlciB0aGF0IG5lZWRzIGVuY29kaW5nLgogICAgICBmb3IgKDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgY2hhciA9IHRleHQuY29kZVVuaXRBdChpKTsKICAgICAgICBpZiAoY2hhciA+PSAxMjggfHwKICAgICAgICAgICAgY2Fub25pY2FsVGFibGVbY2hhciA+PiA0XSAmICgxIDw8IChjaGFyICYgMHgwZikpID09IDApIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGkgPT0gdGV4dC5sZW5ndGgpIHJldHVybiB0ZXh0OwoKICAgIC8vIEVuY29kZSB0aGUgc3RyaW5nIGludG8gYnl0ZXMgdGhlbiBnZW5lcmF0ZSBhbiBBU0NJSSBvbmx5IHN0cmluZwogICAgLy8gYnkgcGVyY2VudCBlbmNvZGluZyBzZWxlY3RlZCBieXRlcy4KICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgewogICAgICByZXN1bHQud3JpdGVDaGFyQ29kZSh0ZXh0LmNvZGVVbml0QXQoaikpOwogICAgfQoKICAgIC8vIFRPRE8obHJuKTogSXMgdGhlcmUgYSB3YXkgdG8gb25seSBlbmNvZGUgZnJvbSBpbmRleCBpIGFuZCBmb3J3YXJkcy4KICAgIHZhciBieXRlcyA9IGVuY29kaW5nLmVuY29kZSh0ZXh0KTsKICAgIGZvciAoOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaW50IGJ5dGUgPSBieXRlc1tpXTsKICAgICAgaWYgKGJ5dGUgPCAxMjggJiYKICAgICAgICAgICgoY2Fub25pY2FsVGFibGVbYnl0ZSA+PiA0XSAmICgxIDw8IChieXRlICYgMHgwZikpKSAhPSAwKSkgewogICAgICAgIHJlc3VsdC53cml0ZUNoYXJDb2RlKGJ5dGUpOwogICAgICB9IGVsc2UgaWYgKHNwYWNlVG9QbHVzICYmIGJ5dGUgPT0gX1NQQUNFKSB7CiAgICAgICAgcmVzdWx0LndyaXRlQ2hhckNvZGUoX1BMVVMpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IFN0cmluZyBoZXhEaWdpdHMgPSAnMDEyMzQ1Njc4OUFCQ0RFRic7CiAgICAgICAgcmVzdWx0CiAgICAgICAgICAuLndyaXRlQ2hhckNvZGUoX1BFUkNFTlQpCiAgICAgICAgICAuLndyaXRlQ2hhckNvZGUoaGV4RGlnaXRzLmNvZGVVbml0QXQoYnl0ZSA+PiA0KSkKICAgICAgICAgIC4ud3JpdGVDaGFyQ29kZShoZXhEaWdpdHMuY29kZVVuaXRBdChieXRlICYgMHgwZikpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAgfQp9ClIATk48AR4BHwEcPQIBTBcaNwEHDAksAgEeBw07AUUBCTIBCUItPA8lJyY6MyUnG0URCggGJwFHKy4iMAYBSyckGxhHJDIlDzUPJDs+CAYeBAIBHmRhcnQ6Y29yZS1wYXRjaC91cmlfcGF0Y2guZGFydDRvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2lkZW50aWNhbF9wYXRjaC5kYXJ0gdIvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwYXRjaApAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCmJvb2wgaWRlbnRpY2FsKE9iamVjdCBhLCBPYmplY3QgYikgbmF0aXZlICJJZGVudGljYWxfY29tcGFyaXNvbiI7CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCmludCBpZGVudGl0eUhhc2hDb2RlKE9iamVjdCBvYmplY3QpID0+IG9iamVjdC5faWRlbnRpdHlIYXNoQ29kZTsKDwBOTjwBHgEHJkIBByJBASRkYXJ0OmNvcmUtcGF0Y2gvaWRlbnRpY2FsX3BhdGNoLmRhcnQrb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvcHJpbnQuZGFydIHELy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLy8vIFByaW50cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0IHRvIHRoZSBjb25zb2xlLgp2b2lkIHByaW50KE9iamVjdCBvYmplY3QpIHsKICBTdHJpbmcgbGluZSA9ICIkb2JqZWN0IjsKICBpZiAocHJpbnRUb1pvbmUgPT0gbnVsbCkgewogICAgcHJpbnRUb0NvbnNvbGUobGluZSk7CiAgfSBlbHNlIHsKICAgIHByaW50VG9ab25lKGxpbmUpOwogIH0KfQoRAE5OPAETAUEcGx0aCxcEAgEUZGFydDpjb3JlL3ByaW50LmRhcnQrb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL19odHRwL2h0dHAuZGFydMABIRYvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0Ll9odHRwOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nCiAgICBzaG93CiAgICAgICAgSGFzaE1hcCwKICAgICAgICBIYXNoU2V0LAogICAgICAgIFF1ZXVlLAogICAgICAgIExpc3RRdWV1ZSwKICAgICAgICBMaW5rZWRMaXN0LAogICAgICAgIExpbmtlZExpc3RFbnRyeSwKICAgICAgICBVbm1vZGlmaWFibGVNYXBWaWV3OwppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDpkZXZlbG9wZXInIGhpZGUgbG9nOwppbXBvcnQgJ2RhcnQ6X2ludGVybmFsJyBzaG93IFNpbmNlLCBIdHRwU3RhdHVzOwppbXBvcnQgJ2RhcnQ6bWF0aCc7CmltcG9ydCAnZGFydDppbyc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCnBhcnQgJ2NyeXB0by5kYXJ0JzsKcGFydCAnaHR0cF9kYXRlLmRhcnQnOwpwYXJ0ICdodHRwX2hlYWRlcnMuZGFydCc7CnBhcnQgJ2h0dHBfaW1wbC5kYXJ0JzsKcGFydCAnaHR0cF9wYXJzZXIuZGFydCc7CnBhcnQgJ2h0dHBfc2Vzc2lvbi5kYXJ0JzsKcGFydCAnb3ZlcnJpZGVzLmRhcnQnOwpwYXJ0ICd3ZWJzb2NrZXQuZGFydCc7CnBhcnQgJ3dlYnNvY2tldF9pbXBsLmRhcnQnOwoKLyoqCiAqIEEgc2VydmVyIHRoYXQgZGVsaXZlcnMgY29udGVudCwgc3VjaCBhcyB3ZWIgcGFnZXMsIHVzaW5nIHRoZSBIVFRQIHByb3RvY29sLgogKgogKiBUaGUgSHR0cFNlcnZlciBpcyBhIFtTdHJlYW1dIHRoYXQgcHJvdmlkZXMgW0h0dHBSZXF1ZXN0XSBvYmplY3RzLiBFYWNoCiAqIEh0dHBSZXF1ZXN0IGhhcyBhbiBhc3NvY2lhdGVkIFtIdHRwUmVzcG9uc2VdIG9iamVjdC4KICogVGhlIHNlcnZlciByZXNwb25kcyB0byBhIHJlcXVlc3QgYnkgd3JpdGluZyB0byB0aGF0IEh0dHBSZXNwb25zZSBvYmplY3QuCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYmluZCBhbiBIdHRwU2VydmVyIHRvIGFuIElQdjYKICogW0ludGVybmV0QWRkcmVzc10gb24gcG9ydCA4MCAodGhlIHN0YW5kYXJkIHBvcnQgZm9yIEhUVFAgc2VydmVycykKICogYW5kIGhvdyB0byBsaXN0ZW4gZm9yIHJlcXVlc3RzLgogKiBQb3J0IDgwIGlzIHRoZSBkZWZhdWx0IEhUVFAgcG9ydC4gSG93ZXZlciwgb24gbW9zdCBzeXN0ZW1zIGFjY2Vzc2luZwogKiB0aGlzIHJlcXVpcmVzIHN1cGVyLXVzZXIgcHJpdmlsZWdlcy4gRm9yIGxvY2FsIHRlc3RpbmcgY29uc2lkZXIKICogdXNpbmcgYSBub24tcmVzZXJ2ZWQgcG9ydCAoMTAyNCBhbmQgYWJvdmUpLgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICoKICogICAgIG1haW4oKSB7CiAqICAgICAgIEh0dHBTZXJ2ZXIKICogICAgICAgICAgIC5iaW5kKEludGVybmV0QWRkcmVzcy5hbnlJUHY2LCA4MCkKICogICAgICAgICAgIC50aGVuKChzZXJ2ZXIpIHsKICogICAgICAgICAgICAgc2VydmVyLmxpc3RlbigoSHR0cFJlcXVlc3QgcmVxdWVzdCkgewogKiAgICAgICAgICAgICAgIHJlcXVlc3QucmVzcG9uc2Uud3JpdGUoJ0hlbGxvLCB3b3JsZCEnKTsKICogICAgICAgICAgICAgICByZXF1ZXN0LnJlc3BvbnNlLmNsb3NlKCk7CiAqICAgICAgICAgICAgIH0pOwogKiAgICAgICAgICAgfSk7CiAqICAgICB9CiAqCiAqIEluY29tcGxldGUgcmVxdWVzdHMsIGluIHdoaWNoIGFsbCBvciBwYXJ0IG9mIHRoZSBoZWFkZXIgaXMgbWlzc2luZywgYXJlCiAqIGlnbm9yZWQsIGFuZCBubyBleGNlcHRpb25zIG9yIEh0dHBSZXF1ZXN0IG9iamVjdHMgYXJlIGdlbmVyYXRlZCBmb3IgdGhlbS4KICogTGlrZXdpc2UsIHdoZW4gd3JpdGluZyB0byBhbiBIdHRwUmVzcG9uc2UsIGFueSBbU29ja2V0XSBleGNlcHRpb25zIGFyZQogKiBpZ25vcmVkIGFuZCBhbnkgZnV0dXJlIHdyaXRlcyBhcmUgaWdub3JlZC4KICoKICogVGhlIEh0dHBSZXF1ZXN0IGV4cG9zZXMgdGhlIHJlcXVlc3QgaGVhZGVycyBhbmQgcHJvdmlkZXMgdGhlIHJlcXVlc3QgYm9keSwKICogaWYgaXQgZXhpc3RzLCBhcyBhIFN0cmVhbSBvZiBkYXRhLiBJZiB0aGUgYm9keSBpcyB1bnJlYWQsIGl0IGlzIGRyYWluZWQKICogd2hlbiB0aGUgc2VydmVyIHdyaXRlcyB0byB0aGUgSHR0cFJlc3BvbnNlIG9yIGNsb3NlcyBpdC4KICoKICogIyMgQmluZCB3aXRoIGEgc2VjdXJlIEhUVFBTIGNvbm5lY3Rpb24KICoKICogVXNlIFtiaW5kU2VjdXJlXSB0byBjcmVhdGUgYW4gSFRUUFMgc2VydmVyLgogKgogKiBUaGUgc2VydmVyIHByZXNlbnRzIGEgY2VydGlmaWNhdGUgdG8gdGhlIGNsaWVudC4gVGhlIGNlcnRpZmljYXRlCiAqIGNoYWluIGFuZCB0aGUgcHJpdmF0ZSBrZXkgYXJlIHNldCBpbiB0aGUgW1NlY3VyaXR5Q29udGV4dF0KICogb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHRvIFtiaW5kU2VjdXJlXS4KICoKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqICAgICBpbXBvcnQgImRhcnQ6aXNvbGF0ZSI7CiAqCiAqICAgICBtYWluKCkgewogKiAgICAgICBTZWN1cml0eUNvbnRleHQgY29udGV4dCA9IG5ldyBTZWN1cml0eUNvbnRleHQoKTsKICogICAgICAgdmFyIGNoYWluID0KICogICAgICAgICAgIFBsYXRmb3JtLnNjcmlwdC5yZXNvbHZlKCdjZXJ0aWZpY2F0ZXMvc2VydmVyX2NoYWluLnBlbScpCiAqICAgICAgICAgICAudG9GaWxlUGF0aCgpOwogKiAgICAgICB2YXIga2V5ID0KICogICAgICAgICAgIFBsYXRmb3JtLnNjcmlwdC5yZXNvbHZlKCdjZXJ0aWZpY2F0ZXMvc2VydmVyX2tleS5wZW0nKQogKiAgICAgICAgICAgLnRvRmlsZVBhdGgoKTsKICogICAgICAgY29udGV4dC51c2VDZXJ0aWZpY2F0ZUNoYWluKGNoYWluKTsKICogICAgICAgY29udGV4dC51c2VQcml2YXRlS2V5KGtleSwgcGFzc3dvcmQ6ICdkYXJ0ZGFydCcpOwogKgogKiAgICAgICBIdHRwU2VydmVyCiAqICAgICAgICAgICAuYmluZFNlY3VyZShJbnRlcm5ldEFkZHJlc3MuYW55SVB2NiwKICogICAgICAgICAgICAgICAgICAgICAgIDQ0MywKICogICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpCiAqICAgICAgICAgICAudGhlbigoc2VydmVyKSB7CiAqICAgICAgICAgICAgIHNlcnZlci5saXN0ZW4oKEh0dHBSZXF1ZXN0IHJlcXVlc3QpIHsKICogICAgICAgICAgICAgICByZXF1ZXN0LnJlc3BvbnNlLndyaXRlKCdIZWxsbywgd29ybGQhJyk7CiAqICAgICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZS5jbG9zZSgpOwogKiAgICAgICAgICAgICB9KTsKICogICAgICAgICAgIH0pOwogKiAgICAgfQogKgogKiAgVGhlIGNlcnRpZmljYXRlcyBhbmQga2V5cyBhcmUgUEVNIGZpbGVzLCB3aGljaCBjYW4gYmUgY3JlYXRlZCBhbmQKICogIG1hbmFnZWQgd2l0aCB0aGUgdG9vbHMgaW4gT3BlblNTTC4KICoKICogIyMgQ29ubmVjdCB0byBhIHNlcnZlciBzb2NrZXQKICoKICogWW91IGNhbiB1c2UgdGhlIFtsaXN0ZW5Pbl0gY29uc3RydWN0b3IgdG8gYXR0YWNoIGFuIEhUVFAgc2VydmVyIHRvCiAqIGEgW1NlcnZlclNvY2tldF0uCiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nOwogKgogKiAgICAgbWFpbigpIHsKICogICAgICAgU2VydmVyU29ja2V0LmJpbmQoSW50ZXJuZXRBZGRyZXNzLmFueUlQdjYsIDgwKQogKiAgICAgICAgIC50aGVuKChzZXJ2ZXJTb2NrZXQpIHsKICogICAgICAgICAgIEh0dHBTZXJ2ZXIgaHR0cHNlcnZlciA9IG5ldyBIdHRwU2VydmVyLmxpc3Rlbk9uKHNlcnZlclNvY2tldCk7CiAqICAgICAgICAgICBzZXJ2ZXJTb2NrZXQubGlzdGVuKChTb2NrZXQgc29ja2V0KSB7CiAqICAgICAgICAgICAgIHNvY2tldC53cml0ZSgnSGVsbG8sIGNsaWVudC4nKTsKICogICAgICAgICAgIH0pOwogKiAgICAgICAgIH0pOwogKiAgICAgfQogKgogKiAjIyBPdGhlciByZXNvdXJjZXMKICoKICogKiBIdHRwU2VydmVyIGlzIGEgU3RyZWFtLiBSZWZlciB0byB0aGUgW1N0cmVhbV0gY2xhc3MgZm9yIGluZm9ybWF0aW9uCiAqIGFib3V0IHRoZSBzdHJlYW1pbmcgcXVhbGl0aWVzIG9mIGFuIEh0dHBTZXJ2ZXIuCiAqIFBhdXNpbmcgdGhlIHN1YnNjcmlwdGlvbiBvZiB0aGUgc3RyZWFtLCBwYXVzZXMgYXQgdGhlIE9TIGxldmVsLgogKgogKiAqIFRoZSBbc2hlbGZdKGh0dHBzOi8vcHViLmRhcnRsYW5nLm9yZy9wYWNrYWdlcy9zaGVsZikKICogcGFja2FnZSBvbiBwdWIuZGFydGxhbmcub3JnIGNvbnRhaW5zIGEgc2V0IG9mIGhpZ2gtbGV2ZWwgY2xhc3NlcyB0aGF0LAogKiB0b2dldGhlciB3aXRoIHRoaXMgY2xhc3MsIG1ha2VzIGl0IGVhc3kgdG8gcHJvdmlkZSBjb250ZW50IHRocm91Z2ggSFRUUAogKiBzZXJ2ZXJzLgogKi8KYWJzdHJhY3QgY2xhc3MgSHR0cFNlcnZlciBpbXBsZW1lbnRzIFN0cmVhbTxIdHRwUmVxdWVzdD4gewogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGBTZXJ2ZXJgIGhlYWRlciBmb3IgYWxsIHJlc3BvbnNlcwogICAqIGdlbmVyYXRlZCBieSB0aGlzIFtIdHRwU2VydmVyXS4KICAgKgogICAqIElmIFtzZXJ2ZXJIZWFkZXJdIGlzIGBudWxsYCwgbm8gYFNlcnZlcmAgaGVhZGVyIHdpbGwgYmUgYWRkZWQgdG8gZWFjaAogICAqIHJlc3BvbnNlLgogICAqCiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgYG51bGxgLgogICAqLwogIFN0cmluZyBzZXJ2ZXJIZWFkZXI7CgogIC8qKgogICAqIERlZmF1bHQgc2V0IG9mIGhlYWRlcnMgYWRkZWQgdG8gYWxsIHJlc3BvbnNlIG9iamVjdHMuCiAgICoKICAgKiBCeSBkZWZhdWx0IHRoZSBmb2xsb3dpbmcgaGVhZGVycyBhcmUgaW4gdGhpcyBzZXQ6CiAgICoKICAgKiAgICAgQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04CiAgICogICAgIFgtRnJhbWUtT3B0aW9uczogU0FNRU9SSUdJTgogICAqICAgICBYLUNvbnRlbnQtVHlwZS1PcHRpb25zOiBub3NuaWZmCiAgICogICAgIFgtWFNTLVByb3RlY3Rpb246IDE7IG1vZGU9YmxvY2sKICAgKgogICAqIElmIHRoZSBgU2VydmVyYCBoZWFkZXIgaXMgYWRkZWQgaGVyZSBhbmQgdGhlIGBzZXJ2ZXJIZWFkZXJgIGlzIHNldCBhcwogICAqIHdlbGwgdGhlbiB0aGUgdmFsdWUgb2YgYHNlcnZlckhlYWRlcmAgdGFrZXMgcHJlY2VkZW5jZS4KICAgKi8KICBIdHRwSGVhZGVycyBnZXQgZGVmYXVsdFJlc3BvbnNlSGVhZGVyczsKCiAgLyoqCiAgICogV2hldGhlciB0aGUgW0h0dHBTZXJ2ZXJdIHNob3VsZCBjb21wcmVzcyB0aGUgY29udGVudCwgaWYgcG9zc2libGUuCiAgICoKICAgKiBUaGUgY29udGVudCBjYW4gb25seSBiZSBjb21wcmVzc2VkIHdoZW4gdGhlIHJlc3BvbnNlIGlzIHVzaW5nCiAgICogY2h1bmtlZCBUcmFuc2Zlci1FbmNvZGluZyBhbmQgdGhlIGluY29taW5nIHJlcXVlc3QgaGFzIGBnemlwYAogICAqIGFzIGFuIGFjY2VwdGVkIGVuY29kaW5nIGluIHRoZSBBY2NlcHQtRW5jb2RpbmcgaGVhZGVyLgogICAqCiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYCAoY29tcHJlc3Npb24gZGlzYWJsZWQpLgogICAqIFRvIGVuYWJsZSwgc2V0IGBhdXRvQ29tcHJlc3NgIHRvIGB0cnVlYC4KICAgKi8KICBib29sIGF1dG9Db21wcmVzczsKCiAgLyoqCiAgICogR2V0cyBvciBzZXRzIHRoZSB0aW1lb3V0IHVzZWQgZm9yIGlkbGUga2VlcC1hbGl2ZSBjb25uZWN0aW9ucy4gSWYgbm8KICAgKiBmdXJ0aGVyIHJlcXVlc3QgaXMgc2VlbiB3aXRoaW4gW2lkbGVUaW1lb3V0XSBhZnRlciB0aGUgcHJldmlvdXMgcmVxdWVzdCB3YXMKICAgKiBjb21wbGV0ZWQsIHRoZSBjb25uZWN0aW9uIGlzIGRyb3BwZWQuCiAgICoKICAgKiBEZWZhdWx0IGlzIDEyMCBzZWNvbmRzLgogICAqCiAgICogTm90ZSB0aGF0IGl0IG1heSB0YWtlIHVwIHRvIGAyICogaWRsZVRpbWVvdXRgIGJlZm9yZSBhIGlkbGUgY29ubmVjdGlvbiBpcwogICAqIGFib3J0ZWQuCiAgICoKICAgKiBUbyBkaXNhYmxlLCBzZXQgW2lkbGVUaW1lb3V0XSB0byBgbnVsbGAuCiAgICovCiAgRHVyYXRpb24gaWRsZVRpbWVvdXQ7CgogIC8qKgogICAqIFN0YXJ0cyBsaXN0ZW5pbmcgZm9yIEhUVFAgcmVxdWVzdHMgb24gdGhlIHNwZWNpZmllZCBbYWRkcmVzc10gYW5kCiAgICogW3BvcnRdLgogICAqCiAgICogVGhlIFthZGRyZXNzXSBjYW4gZWl0aGVyIGJlIGEgW1N0cmluZ10gb3IgYW4KICAgKiBbSW50ZXJuZXRBZGRyZXNzXS4gSWYgW2FkZHJlc3NdIGlzIGEgW1N0cmluZ10sIFtiaW5kXSB3aWxsCiAgICogcGVyZm9ybSBhIFtJbnRlcm5ldEFkZHJlc3MubG9va3VwXSBhbmQgdXNlIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUKICAgKiBsaXN0LiBUbyBsaXN0ZW4gb24gdGhlIGxvb3BiYWNrIGFkYXB0ZXIsIHdoaWNoIHdpbGwgYWxsb3cgb25seQogICAqIGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20gdGhlIGxvY2FsIGhvc3QsIHVzZSB0aGUgdmFsdWUKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2NF0gb3IKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2Nl0uIFRvIGFsbG93IGZvciBpbmNvbWluZwogICAqIGNvbm5lY3Rpb24gZnJvbSB0aGUgbmV0d29yayB1c2UgZWl0aGVyIG9uZSBvZiB0aGUgdmFsdWVzCiAgICogW0ludGVybmV0QWRkcmVzcy5hbnlJUHY0XSBvciBbSW50ZXJuZXRBZGRyZXNzLmFueUlQdjZdIHRvCiAgICogYmluZCB0byBhbGwgaW50ZXJmYWNlcyBvciB0aGUgSVAgYWRkcmVzcyBvZiBhIHNwZWNpZmljIGludGVyZmFjZS4KICAgKgogICAqIElmIGFuIElQIHZlcnNpb24gNiAoSVB2NikgYWRkcmVzcyBpcyB1c2VkLCBib3RoIElQIHZlcnNpb24gNgogICAqIChJUHY2KSBhbmQgdmVyc2lvbiA0IChJUHY0KSBjb25uZWN0aW9ucyB3aWxsIGJlIGFjY2VwdGVkLiBUbwogICAqIHJlc3RyaWN0IHRoaXMgdG8gdmVyc2lvbiA2IChJUHY2KSBvbmx5LCB1c2UgW3Y2T25seV0gdG8gc2V0CiAgICogdmVyc2lvbiA2IG9ubHkuIEhvd2V2ZXIsIGlmIHRoZSBhZGRyZXNzIGlzCiAgICogW0ludGVybmV0QWRkcmVzcy5sb29wYmFja0lQdjZdLCBvbmx5IElQIHZlcnNpb24gNiAoSVB2NikgY29ubmVjdGlvbnMKICAgKiB3aWxsIGJlIGFjY2VwdGVkLgogICAqCiAgICogSWYgW3BvcnRdIGhhcyB0aGUgdmFsdWUgWzowOl0gYW4gZXBoZW1lcmFsIHBvcnQgd2lsbCBiZSBjaG9zZW4gYnkKICAgKiB0aGUgc3lzdGVtLiBUaGUgYWN0dWFsIHBvcnQgdXNlZCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHRoZQogICAqIFtwb3J0XSBnZXR0ZXIuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgW2JhY2tsb2ddIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxpc3RlbgogICAqIGJhY2tsb2cgZm9yIHRoZSB1bmRlcmx5aW5nIE9TIGxpc3RlbiBzZXR1cC4gSWYgW2JhY2tsb2ddIGhhcyB0aGUKICAgKiB2YWx1ZSBvZiBbOjA6XSAodGhlIGRlZmF1bHQpIGEgcmVhc29uYWJsZSB2YWx1ZSB3aWxsIGJlIGNob3NlbiBieQogICAqIHRoZSBzeXN0ZW0uCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgW3NoYXJlZF0gc3BlY2lmaWVzIHdoZXRoZXIgYWRkaXRpb25hbCBIdHRwU2VydmVyCiAgICogb2JqZWN0cyBjYW4gYmluZCB0byB0aGUgc2FtZSBjb21iaW5hdGlvbiBvZiBgYWRkcmVzc2AsIGBwb3J0YCBhbmQgYHY2T25seWAuCiAgICogSWYgYHNoYXJlZGAgaXMgYHRydWVgIGFuZCBtb3JlIGBIdHRwU2VydmVyYHMgZnJvbSB0aGlzIGlzb2xhdGUgb3Igb3RoZXIKICAgKiBpc29sYXRlcyBhcmUgYm91bmQgdG8gdGhlIHBvcnQsIHRoZW4gdGhlIGluY29taW5nIGNvbm5lY3Rpb25zIHdpbGwgYmUKICAgKiBkaXN0cmlidXRlZCBhbW9uZyBhbGwgdGhlIGJvdW5kIGBIdHRwU2VydmVyYHMuIENvbm5lY3Rpb25zIGNhbiBiZQogICAqIGRpc3RyaWJ1dGVkIG92ZXIgbXVsdGlwbGUgaXNvbGF0ZXMgdGhpcyB3YXkuCiAgICovCiAgc3RhdGljIEZ1dHVyZTxIdHRwU2VydmVyPiBiaW5kKGFkZHJlc3MsIGludCBwb3J0LAogICAgICAgICAge2ludCBiYWNrbG9nOiAwLCBib29sIHY2T25seTogZmFsc2UsIGJvb2wgc2hhcmVkOiBmYWxzZX0pID0+CiAgICAgIF9IdHRwU2VydmVyLmJpbmQoYWRkcmVzcywgcG9ydCwgYmFja2xvZywgdjZPbmx5LCBzaGFyZWQpOwoKICAvKioKICAgKiBUaGUgW2FkZHJlc3NdIGNhbiBlaXRoZXIgYmUgYSBbU3RyaW5nXSBvciBhbgogICAqIFtJbnRlcm5ldEFkZHJlc3NdLiBJZiBbYWRkcmVzc10gaXMgYSBbU3RyaW5nXSwgW2JpbmRdIHdpbGwKICAgKiBwZXJmb3JtIGEgW0ludGVybmV0QWRkcmVzcy5sb29rdXBdIGFuZCB1c2UgdGhlIGZpcnN0IHZhbHVlIGluIHRoZQogICAqIGxpc3QuIFRvIGxpc3RlbiBvbiB0aGUgbG9vcGJhY2sgYWRhcHRlciwgd2hpY2ggd2lsbCBhbGxvdyBvbmx5CiAgICogaW5jb21pbmcgY29ubmVjdGlvbnMgZnJvbSB0aGUgbG9jYWwgaG9zdCwgdXNlIHRoZSB2YWx1ZQogICAqIFtJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY0XSBvcgogICAqIFtJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY2XS4gVG8gYWxsb3cgZm9yIGluY29taW5nCiAgICogY29ubmVjdGlvbiBmcm9tIHRoZSBuZXR3b3JrIHVzZSBlaXRoZXIgb25lIG9mIHRoZSB2YWx1ZXMKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmFueUlQdjRdIG9yIFtJbnRlcm5ldEFkZHJlc3MuYW55SVB2Nl0gdG8KICAgKiBiaW5kIHRvIGFsbCBpbnRlcmZhY2VzIG9yIHRoZSBJUCBhZGRyZXNzIG9mIGEgc3BlY2lmaWMgaW50ZXJmYWNlLgogICAqCiAgICogSWYgYW4gSVAgdmVyc2lvbiA2IChJUHY2KSBhZGRyZXNzIGlzIHVzZWQsIGJvdGggSVAgdmVyc2lvbiA2CiAgICogKElQdjYpIGFuZCB2ZXJzaW9uIDQgKElQdjQpIGNvbm5lY3Rpb25zIHdpbGwgYmUgYWNjZXB0ZWQuIFRvCiAgICogcmVzdHJpY3QgdGhpcyB0byB2ZXJzaW9uIDYgKElQdjYpIG9ubHksIHVzZSBbdjZPbmx5XSB0byBzZXQKICAgKiB2ZXJzaW9uIDYgb25seS4KICAgKgogICAqIElmIFtwb3J0XSBoYXMgdGhlIHZhbHVlIFs6MDpdIGFuIGVwaGVtZXJhbCBwb3J0IHdpbGwgYmUgY2hvc2VuIGJ5CiAgICogdGhlIHN5c3RlbS4gVGhlIGFjdHVhbCBwb3J0IHVzZWQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUKICAgKiBbcG9ydF0gZ2V0dGVyLgogICAqCiAgICogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFtiYWNrbG9nXSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsaXN0ZW4KICAgKiBiYWNrbG9nIGZvciB0aGUgdW5kZXJseWluZyBPUyBsaXN0ZW4gc2V0dXAuIElmIFtiYWNrbG9nXSBoYXMgdGhlCiAgICogdmFsdWUgb2YgWzowOl0gKHRoZSBkZWZhdWx0KSBhIHJlYXNvbmFibGUgdmFsdWUgd2lsbCBiZSBjaG9zZW4gYnkKICAgKiB0aGUgc3lzdGVtLgogICAqCiAgICogSWYgW3JlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZV0gaXMgdHJ1ZSwgdGhlIHNlcnZlciB3aWxsCiAgICogcmVxdWVzdCBjbGllbnRzIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIGEgY2xpZW50IGNlcnRpZmljYXRlLgogICAqIFRoZSBzZXJ2ZXIgd2lsbCBhZHZlcnRpc2UgdGhlIG5hbWVzIG9mIHRydXN0ZWQgaXNzdWVycyBvZiBjbGllbnQKICAgKiBjZXJ0aWZpY2F0ZXMsIGdldHRpbmcgdGhlbSBmcm9tIGEgW1NlY3VyaXR5Q29udGV4dF0sIHdoZXJlIHRoZXkgaGF2ZSBiZWVuCiAgICogc2V0IHVzaW5nIFtTZWN1cml0eUNvbnRleHQuc2V0Q2xpZW50QXV0aG9yaXRpZXNdLgogICAqCiAgICogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFtzaGFyZWRdIHNwZWNpZmllcyB3aGV0aGVyIGFkZGl0aW9uYWwgSHR0cFNlcnZlcgogICAqIG9iamVjdHMgY2FuIGJpbmQgdG8gdGhlIHNhbWUgY29tYmluYXRpb24gb2YgYGFkZHJlc3NgLCBgcG9ydGAgYW5kIGB2Nk9ubHlgLgogICAqIElmIGBzaGFyZWRgIGlzIGB0cnVlYCBhbmQgbW9yZSBgSHR0cFNlcnZlcmBzIGZyb20gdGhpcyBpc29sYXRlIG9yIG90aGVyCiAgICogaXNvbGF0ZXMgYXJlIGJvdW5kIHRvIHRoZSBwb3J0LCB0aGVuIHRoZSBpbmNvbWluZyBjb25uZWN0aW9ucyB3aWxsIGJlCiAgICogZGlzdHJpYnV0ZWQgYW1vbmcgYWxsIHRoZSBib3VuZCBgSHR0cFNlcnZlcmBzLiBDb25uZWN0aW9ucyBjYW4gYmUKICAgKiBkaXN0cmlidXRlZCBvdmVyIG11bHRpcGxlIGlzb2xhdGVzIHRoaXMgd2F5LgogICAqLwoKICBzdGF0aWMgRnV0dXJlPEh0dHBTZXJ2ZXI+IGJpbmRTZWN1cmUoCiAgICAgICAgICBhZGRyZXNzLCBpbnQgcG9ydCwgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgICAgICB7aW50IGJhY2tsb2c6IDAsCiAgICAgICAgICBib29sIHY2T25seTogZmFsc2UsCiAgICAgICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgICAgICBib29sIHNoYXJlZDogZmFsc2V9KSA9PgogICAgICBfSHR0cFNlcnZlci5iaW5kU2VjdXJlKGFkZHJlc3MsIHBvcnQsIGNvbnRleHQsIGJhY2tsb2csIHY2T25seSwKICAgICAgICAgIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwgc2hhcmVkKTsKCiAgLyoqCiAgICogQXR0YWNoZXMgdGhlIEhUVFAgc2VydmVyIHRvIGFuIGV4aXN0aW5nIFtTZXJ2ZXJTb2NrZXRdLiBXaGVuIHRoZQogICAqIFtIdHRwU2VydmVyXSBpcyBjbG9zZWQsIHRoZSBbSHR0cFNlcnZlcl0gd2lsbCBqdXN0IGRldGFjaCBpdHNlbGYsCiAgICogY2xvc2luZyBjdXJyZW50IGNvbm5lY3Rpb25zIGJ1dCBub3QgY2xvc2luZyBbc2VydmVyU29ja2V0XS4KICAgKi8KICBmYWN0b3J5IEh0dHBTZXJ2ZXIubGlzdGVuT24oU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCkgPT4KICAgICAgbmV3IF9IdHRwU2VydmVyLmxpc3Rlbk9uKHNlcnZlclNvY2tldCk7CgogIC8qKgogICAqIFBlcm1hbmVudGx5IHN0b3BzIHRoaXMgW0h0dHBTZXJ2ZXJdIGZyb20gbGlzdGVuaW5nIGZvciBuZXcKICAgKiBjb25uZWN0aW9ucy4gIFRoaXMgY2xvc2VzIHRoZSBbU3RyZWFtXSBvZiBbSHR0cFJlcXVlc3RdcyB3aXRoIGEKICAgKiBkb25lIGV2ZW50LiBUaGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcyB3aGVuIHRoZSBzZXJ2ZXIgaXMKICAgKiBzdG9wcGVkLiBGb3IgYSBzZXJ2ZXIgc3RhcnRlZCB1c2luZyBbYmluZF0gb3IgW2JpbmRTZWN1cmVdIHRoaXMKICAgKiBtZWFucyB0aGF0IHRoZSBwb3J0IGxpc3RlbmVkIG9uIG5vIGxvbmdlciBpbiB1c2UuCiAgICoKICAgKiBJZiBbZm9yY2VdIGlzIGB0cnVlYCwgYWN0aXZlIGNvbm5lY3Rpb25zIHdpbGwgYmUgY2xvc2VkIGltbWVkaWF0ZWx5LgogICAqLwogIEZ1dHVyZSBjbG9zZSh7Ym9vbCBmb3JjZTogZmFsc2V9KTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9ydCB0aGF0IHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uLiBUaGlzIGNhbiBiZQogICAqIHVzZWQgdG8gZ2V0IHRoZSBhY3R1YWwgcG9ydCB1c2VkIHdoZW4gYSB2YWx1ZSBvZiAwIGZvciBbOnBvcnQ6XSBpcwogICAqIHNwZWNpZmllZCBpbiB0aGUgW2JpbmRdIG9yIFtiaW5kU2VjdXJlXSBjYWxsLgogICAqLwogIGludCBnZXQgcG9ydDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgYWRkcmVzcyB0aGF0IHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uLiBUaGlzIGNhbiBiZQogICAqIHVzZWQgdG8gZ2V0IHRoZSBhY3R1YWwgYWRkcmVzcyB1c2VkLCB3aGVuIHRoZSBhZGRyZXNzIGlzIGZldGNoZWQgYnkKICAgKiBhIGxvb2t1cCBmcm9tIGEgaG9zdG5hbWUuCiAgICovCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzOwoKICAvKioKICAgKiBTZXRzIHRoZSB0aW1lb3V0LCBpbiBzZWNvbmRzLCBmb3Igc2Vzc2lvbnMgb2YgdGhpcyBbSHR0cFNlcnZlcl0uCiAgICogVGhlIGRlZmF1bHQgdGltZW91dCBpcyAyMCBtaW51dGVzLgogICAqLwogIHNldCBzZXNzaW9uVGltZW91dChpbnQgdGltZW91dCk7CgogIC8qKgogICAqIFJldHVybnMgYW4gW0h0dHBDb25uZWN0aW9uc0luZm9dIG9iamVjdCBzdW1tYXJpemluZyB0aGUgbnVtYmVyIG9mCiAgICogY3VycmVudCBjb25uZWN0aW9ucyBoYW5kbGVkIGJ5IHRoZSBzZXJ2ZXIuCiAgICovCiAgSHR0cENvbm5lY3Rpb25zSW5mbyBjb25uZWN0aW9uc0luZm8oKTsKfQoKLyoqCiAqIFN1bW1hcnkgc3RhdGlzdGljcyBhYm91dCBhbiBbSHR0cFNlcnZlcl1zIGN1cnJlbnQgc29ja2V0IGNvbm5lY3Rpb25zLgogKi8KY2xhc3MgSHR0cENvbm5lY3Rpb25zSW5mbyB7CiAgLyoqCiAgICogVG90YWwgbnVtYmVyIG9mIHNvY2tldCBjb25uZWN0aW9ucy4KICAgKi8KICBpbnQgdG90YWwgPSAwOwoKICAvKioKICAgKiBOdW1iZXIgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIHdoZXJlIGFjdHVhbCByZXF1ZXN0L3Jlc3BvbnNlCiAgICogcHJvY2Vzc2luZyBpcyBhY3RpdmUuCiAgICovCiAgaW50IGFjdGl2ZSA9IDA7CgogIC8qKgogICAqIE51bWJlciBvZiBpZGxlIGNvbm5lY3Rpb25zIGhlbGQgYnkgY2xpZW50cyBhcyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLgogICAqLwogIGludCBpZGxlID0gMDsKCiAgLyoqCiAgICogTnVtYmVyIG9mIGNvbm5lY3Rpb25zIHdoaWNoIGFyZSBwcmVwYXJpbmcgdG8gY2xvc2UuIE5vdGU6IFRoZXNlCiAgICogY29ubmVjdGlvbnMgYXJlIGFsc28gcGFydCBvZiB0aGUgWzphY3RpdmU6XSBjb3VudCBhcyB0aGV5IG1pZ2h0CiAgICogc3RpbGwgYmUgc2VuZGluZyBkYXRhIHRvIHRoZSBjbGllbnQgYmVmb3JlIGZpbmFsbHkgY2xvc2luZy4KICAgKi8KICBpbnQgY2xvc2luZyA9IDA7Cn0KCi8qKgogKiBIZWFkZXJzIGZvciBIVFRQIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuCiAqCiAqIEluIHNvbWUgc2l0dWF0aW9ucywgaGVhZGVycyBhcmUgaW1tdXRhYmxlOgogKgogKiAqIEh0dHBSZXF1ZXN0IGFuZCBIdHRwQ2xpZW50UmVzcG9uc2UgYWx3YXlzIGhhdmUgaW1tdXRhYmxlIGhlYWRlcnMuCiAqCiAqICogSHR0cFJlc3BvbnNlIGFuZCBIdHRwQ2xpZW50UmVxdWVzdCBoYXZlIGltbXV0YWJsZSBoZWFkZXJzCiAqICAgZnJvbSB0aGUgbW9tZW50IHRoZSBib2R5IGlzIHdyaXR0ZW4gdG8uCiAqCiAqIEluIHRoZXNlIHNpdHVhdGlvbnMsIHRoZSBtdXRhdGluZyBtZXRob2RzIHRocm93IGV4Y2VwdGlvbnMuCiAqCiAqIEZvciBhbGwgb3BlcmF0aW9ucyBvbiBIVFRQIGhlYWRlcnMgdGhlIGhlYWRlciBuYW1lIGlzCiAqIGNhc2UtaW5zZW5zaXRpdmUuCiAqCiAqIFRvIHNldCB0aGUgdmFsdWUgb2YgYSBoZWFkZXIgdXNlIHRoZSBgc2V0KClgIG1ldGhvZDoKICoKICogICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoSHR0cEhlYWRlcnMuY2FjaGVDb250cm9sSGVhZGVyLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4LWFnZT0zNjAwLCBtdXN0LXJldmFsaWRhdGUnKTsKICoKICogVG8gcmV0cmlldmUgdGhlIHZhbHVlIG9mIGEgaGVhZGVyIHVzZSB0aGUgYHZhbHVlKClgIG1ldGhvZDoKICoKICogICAgIHByaW50KHJlcXVlc3QuaGVhZGVycy52YWx1ZShIdHRwSGVhZGVycy51c2VyQWdlbnRIZWFkZXIpKTsKICoKICogQW4gSHR0cEhlYWRlcnMgb2JqZWN0IGhvbGRzIGEgbGlzdCBvZiB2YWx1ZXMgZm9yIGVhY2ggbmFtZQogKiBhcyB0aGUgc3RhbmRhcmQgYWxsb3dzLiBJbiBtb3N0IGNhc2VzIGEgbmFtZSBob2xkcyBvbmx5IGEgc2luZ2xlIHZhbHVlLAogKiBUaGUgbW9zdCBjb21tb24gbW9kZSBvZiBvcGVyYXRpb24gaXMgdG8gdXNlIGBzZXQoKWAgZm9yIHNldHRpbmcgYSB2YWx1ZSwKICogYW5kIGB2YWx1ZSgpYCBmb3IgcmV0cmlldmluZyBhIHZhbHVlLgogKi8KYWJzdHJhY3QgY2xhc3MgSHR0cEhlYWRlcnMgewogIHN0YXRpYyBjb25zdCBhY2NlcHRIZWFkZXIgPSAiYWNjZXB0IjsKICBzdGF0aWMgY29uc3QgYWNjZXB0Q2hhcnNldEhlYWRlciA9ICJhY2NlcHQtY2hhcnNldCI7CiAgc3RhdGljIGNvbnN0IGFjY2VwdEVuY29kaW5nSGVhZGVyID0gImFjY2VwdC1lbmNvZGluZyI7CiAgc3RhdGljIGNvbnN0IGFjY2VwdExhbmd1YWdlSGVhZGVyID0gImFjY2VwdC1sYW5ndWFnZSI7CiAgc3RhdGljIGNvbnN0IGFjY2VwdFJhbmdlc0hlYWRlciA9ICJhY2NlcHQtcmFuZ2VzIjsKICBzdGF0aWMgY29uc3QgYWdlSGVhZGVyID0gImFnZSI7CiAgc3RhdGljIGNvbnN0IGFsbG93SGVhZGVyID0gImFsbG93IjsKICBzdGF0aWMgY29uc3QgYXV0aG9yaXphdGlvbkhlYWRlciA9ICJhdXRob3JpemF0aW9uIjsKICBzdGF0aWMgY29uc3QgY2FjaGVDb250cm9sSGVhZGVyID0gImNhY2hlLWNvbnRyb2wiOwogIHN0YXRpYyBjb25zdCBjb25uZWN0aW9uSGVhZGVyID0gImNvbm5lY3Rpb24iOwogIHN0YXRpYyBjb25zdCBjb250ZW50RW5jb2RpbmdIZWFkZXIgPSAiY29udGVudC1lbmNvZGluZyI7CiAgc3RhdGljIGNvbnN0IGNvbnRlbnRMYW5ndWFnZUhlYWRlciA9ICJjb250ZW50LWxhbmd1YWdlIjsKICBzdGF0aWMgY29uc3QgY29udGVudExlbmd0aEhlYWRlciA9ICJjb250ZW50LWxlbmd0aCI7CiAgc3RhdGljIGNvbnN0IGNvbnRlbnRMb2NhdGlvbkhlYWRlciA9ICJjb250ZW50LWxvY2F0aW9uIjsKICBzdGF0aWMgY29uc3QgY29udGVudE1ENUhlYWRlciA9ICJjb250ZW50LW1kNSI7CiAgc3RhdGljIGNvbnN0IGNvbnRlbnRSYW5nZUhlYWRlciA9ICJjb250ZW50LXJhbmdlIjsKICBzdGF0aWMgY29uc3QgY29udGVudFR5cGVIZWFkZXIgPSAiY29udGVudC10eXBlIjsKICBzdGF0aWMgY29uc3QgZGF0ZUhlYWRlciA9ICJkYXRlIjsKICBzdGF0aWMgY29uc3QgZXRhZ0hlYWRlciA9ICJldGFnIjsKICBzdGF0aWMgY29uc3QgZXhwZWN0SGVhZGVyID0gImV4cGVjdCI7CiAgc3RhdGljIGNvbnN0IGV4cGlyZXNIZWFkZXIgPSAiZXhwaXJlcyI7CiAgc3RhdGljIGNvbnN0IGZyb21IZWFkZXIgPSAiZnJvbSI7CiAgc3RhdGljIGNvbnN0IGhvc3RIZWFkZXIgPSAiaG9zdCI7CiAgc3RhdGljIGNvbnN0IGlmTWF0Y2hIZWFkZXIgPSAiaWYtbWF0Y2giOwogIHN0YXRpYyBjb25zdCBpZk1vZGlmaWVkU2luY2VIZWFkZXIgPSAiaWYtbW9kaWZpZWQtc2luY2UiOwogIHN0YXRpYyBjb25zdCBpZk5vbmVNYXRjaEhlYWRlciA9ICJpZi1ub25lLW1hdGNoIjsKICBzdGF0aWMgY29uc3QgaWZSYW5nZUhlYWRlciA9ICJpZi1yYW5nZSI7CiAgc3RhdGljIGNvbnN0IGlmVW5tb2RpZmllZFNpbmNlSGVhZGVyID0gImlmLXVubW9kaWZpZWQtc2luY2UiOwogIHN0YXRpYyBjb25zdCBsYXN0TW9kaWZpZWRIZWFkZXIgPSAibGFzdC1tb2RpZmllZCI7CiAgc3RhdGljIGNvbnN0IGxvY2F0aW9uSGVhZGVyID0gImxvY2F0aW9uIjsKICBzdGF0aWMgY29uc3QgbWF4Rm9yd2FyZHNIZWFkZXIgPSAibWF4LWZvcndhcmRzIjsKICBzdGF0aWMgY29uc3QgcHJhZ21hSGVhZGVyID0gInByYWdtYSI7CiAgc3RhdGljIGNvbnN0IHByb3h5QXV0aGVudGljYXRlSGVhZGVyID0gInByb3h5LWF1dGhlbnRpY2F0ZSI7CiAgc3RhdGljIGNvbnN0IHByb3h5QXV0aG9yaXphdGlvbkhlYWRlciA9ICJwcm94eS1hdXRob3JpemF0aW9uIjsKICBzdGF0aWMgY29uc3QgcmFuZ2VIZWFkZXIgPSAicmFuZ2UiOwogIHN0YXRpYyBjb25zdCByZWZlcmVySGVhZGVyID0gInJlZmVyZXIiOwogIHN0YXRpYyBjb25zdCByZXRyeUFmdGVySGVhZGVyID0gInJldHJ5LWFmdGVyIjsKICBzdGF0aWMgY29uc3Qgc2VydmVySGVhZGVyID0gInNlcnZlciI7CiAgc3RhdGljIGNvbnN0IHRlSGVhZGVyID0gInRlIjsKICBzdGF0aWMgY29uc3QgdHJhaWxlckhlYWRlciA9ICJ0cmFpbGVyIjsKICBzdGF0aWMgY29uc3QgdHJhbnNmZXJFbmNvZGluZ0hlYWRlciA9ICJ0cmFuc2Zlci1lbmNvZGluZyI7CiAgc3RhdGljIGNvbnN0IHVwZ3JhZGVIZWFkZXIgPSAidXBncmFkZSI7CiAgc3RhdGljIGNvbnN0IHVzZXJBZ2VudEhlYWRlciA9ICJ1c2VyLWFnZW50IjsKICBzdGF0aWMgY29uc3QgdmFyeUhlYWRlciA9ICJ2YXJ5IjsKICBzdGF0aWMgY29uc3QgdmlhSGVhZGVyID0gInZpYSI7CiAgc3RhdGljIGNvbnN0IHdhcm5pbmdIZWFkZXIgPSAid2FybmluZyI7CiAgc3RhdGljIGNvbnN0IHd3d0F1dGhlbnRpY2F0ZUhlYWRlciA9ICJ3d3ctYXV0aGVudGljYXRlIjsKCiAgQERlcHJlY2F0ZWQoIlVzZSBhY2NlcHRIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEFDQ0VQVCA9IGFjY2VwdEhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGFjY2VwdENoYXJzZXRIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEFDQ0VQVF9DSEFSU0VUID0gYWNjZXB0Q2hhcnNldEhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGFjY2VwdEVuY29kaW5nSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBBQ0NFUFRfRU5DT0RJTkcgPSBhY2NlcHRFbmNvZGluZ0hlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGFjY2VwdExhbmd1YWdlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBBQ0NFUFRfTEFOR1VBR0UgPSBhY2NlcHRMYW5ndWFnZUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGFjY2VwdFJhbmdlc0hlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQUNDRVBUX1JBTkdFUyA9IGFjY2VwdFJhbmdlc0hlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGFnZUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQUdFID0gYWdlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgYWxsb3dIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEFMTE9XID0gYWxsb3dIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBhdXRob3JpemF0aW9uSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBBVVRIT1JJWkFUSU9OID0gYXV0aG9yaXphdGlvbkhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGNhY2hlQ29udHJvbEhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQ0FDSEVfQ09OVFJPTCA9IGNhY2hlQ29udHJvbEhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGNvbm5lY3Rpb25IZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IENPTk5FQ1RJT04gPSBjb25uZWN0aW9uSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29udGVudEVuY29kaW5nSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBDT05URU5UX0VOQ09ESU5HID0gY29udGVudEVuY29kaW5nSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29udGVudExhbmd1YWdlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBDT05URU5UX0xBTkdVQUdFID0gY29udGVudExhbmd1YWdlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29udGVudExlbmd0aEhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQ09OVEVOVF9MRU5HVEggPSBjb250ZW50TGVuZ3RoSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29udGVudExvY2F0aW9uSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBDT05URU5UX0xPQ0FUSU9OID0gY29udGVudExvY2F0aW9uSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29udGVudE1ENUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQ09OVEVOVF9NRDUgPSBjb250ZW50TUQ1SGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29udGVudFJhbmdlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBDT05URU5UX1JBTkdFID0gY29udGVudFJhbmdlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29udGVudFR5cGVIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IENPTlRFTlRfVFlQRSA9IGNvbnRlbnRUeXBlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgZGF0ZUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgREFURSA9IGRhdGVIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBldGFnSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBFVEFHID0gZXRhZ0hlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGV4cGVjdEhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgRVhQRUNUID0gZXhwZWN0SGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgZXhwaXJlc0hlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgRVhQSVJFUyA9IGV4cGlyZXNIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBmcm9tSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBGUk9NID0gZnJvbUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGhvc3RIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEhPU1QgPSBob3N0SGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgaWZNYXRjaEhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgSUZfTUFUQ0ggPSBpZk1hdGNoSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgaWZNb2RpZmllZFNpbmNlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBJRl9NT0RJRklFRF9TSU5DRSA9IGlmTW9kaWZpZWRTaW5jZUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGlmTm9uZU1hdGNoSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBJRl9OT05FX01BVENIID0gaWZOb25lTWF0Y2hIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBpZlJhbmdlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBJRl9SQU5HRSA9IGlmUmFuZ2VIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBpZlVubW9kaWZpZWRTaW5jZUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgSUZfVU5NT0RJRklFRF9TSU5DRSA9IGlmVW5tb2RpZmllZFNpbmNlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgbGFzdE1vZGlmaWVkSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBMQVNUX01PRElGSUVEID0gbGFzdE1vZGlmaWVkSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgbG9jYXRpb25IZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IExPQ0FUSU9OID0gbG9jYXRpb25IZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBtYXhGb3J3YXJkc0hlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgTUFYX0ZPUldBUkRTID0gbWF4Rm9yd2FyZHNIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBwcmFnbWFIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFBSQUdNQSA9IHByYWdtYUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHByb3h5QXV0aGVudGljYXRlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQUk9YWV9BVVRIRU5USUNBVEUgPSBwcm94eUF1dGhlbnRpY2F0ZUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHByb3h5QXV0aG9yaXphdGlvbkhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUFJPWFlfQVVUSE9SSVpBVElPTiA9IHByb3h5QXV0aG9yaXphdGlvbkhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHJhbmdlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBSQU5HRSA9IHJhbmdlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgcmVmZXJlckhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUkVGRVJFUiA9IHJlZmVyZXJIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSByZXRyeUFmdGVySGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBSRVRSWV9BRlRFUiA9IHJldHJ5QWZ0ZXJIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBzZXJ2ZXJIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFNFUlZFUiA9IHNlcnZlckhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHRlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBURSA9IHRlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgdHJhaWxlckhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgVFJBSUxFUiA9IHRyYWlsZXJIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSB0cmFuc2ZlckVuY29kaW5nSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBUUkFOU0ZFUl9FTkNPRElORyA9IHRyYW5zZmVyRW5jb2RpbmdIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSB1cGdyYWRlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBVUEdSQURFID0gdXBncmFkZUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHVzZXJBZ2VudEhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgVVNFUl9BR0VOVCA9IHVzZXJBZ2VudEhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHZhcnlIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFZBUlkgPSB2YXJ5SGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgdmlhSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBWSUEgPSB2aWFIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSB3YXJuaW5nSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBXQVJOSU5HID0gd2FybmluZ0hlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHd3d0F1dGhlbnRpY2F0ZUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgV1dXX0FVVEhFTlRJQ0FURSA9IHd3d0F1dGhlbnRpY2F0ZUhlYWRlcjsKCiAgLy8gQ29va2llIGhlYWRlcnMgZnJvbSBSRkMgNjI2NS4KICBzdGF0aWMgY29uc3QgY29va2llSGVhZGVyID0gImNvb2tpZSI7CiAgc3RhdGljIGNvbnN0IHNldENvb2tpZUhlYWRlciA9ICJzZXQtY29va2llIjsKCiAgQERlcHJlY2F0ZWQoIlVzZSBjb29raWVIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IENPT0tJRSA9IGNvb2tpZUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHNldENvb2tpZUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgU0VUX0NPT0tJRSA9IHNldENvb2tpZUhlYWRlcjsKCiAgc3RhdGljIGNvbnN0IGdlbmVyYWxIZWFkZXJzID0gY29uc3QgWwogICAgY2FjaGVDb250cm9sSGVhZGVyLAogICAgY29ubmVjdGlvbkhlYWRlciwKICAgIGRhdGVIZWFkZXIsCiAgICBwcmFnbWFIZWFkZXIsCiAgICB0cmFpbGVySGVhZGVyLAogICAgdHJhbnNmZXJFbmNvZGluZ0hlYWRlciwKICAgIHVwZ3JhZGVIZWFkZXIsCiAgICB2aWFIZWFkZXIsCiAgICB3YXJuaW5nSGVhZGVyCiAgXTsKCiAgQERlcHJlY2F0ZWQoIlVzZSBnZW5lcmFsSGVhZGVycyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgR0VORVJBTF9IRUFERVJTID0gZ2VuZXJhbEhlYWRlcnM7CgogIHN0YXRpYyBjb25zdCBlbnRpdHlIZWFkZXJzID0gY29uc3QgWwogICAgYWxsb3dIZWFkZXIsCiAgICBjb250ZW50RW5jb2RpbmdIZWFkZXIsCiAgICBjb250ZW50TGFuZ3VhZ2VIZWFkZXIsCiAgICBjb250ZW50TGVuZ3RoSGVhZGVyLAogICAgY29udGVudExvY2F0aW9uSGVhZGVyLAogICAgY29udGVudE1ENUhlYWRlciwKICAgIGNvbnRlbnRSYW5nZUhlYWRlciwKICAgIGNvbnRlbnRUeXBlSGVhZGVyLAogICAgZXhwaXJlc0hlYWRlciwKICAgIGxhc3RNb2RpZmllZEhlYWRlcgogIF07CgogIEBEZXByZWNhdGVkKCJVc2UgZW50aXR5SGVhZGVycyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgRU5USVRZX0hFQURFUlMgPSBlbnRpdHlIZWFkZXJzOwoKICBzdGF0aWMgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gY29uc3QgWwogICAgYWNjZXB0UmFuZ2VzSGVhZGVyLAogICAgYWdlSGVhZGVyLAogICAgZXRhZ0hlYWRlciwKICAgIGxvY2F0aW9uSGVhZGVyLAogICAgcHJveHlBdXRoZW50aWNhdGVIZWFkZXIsCiAgICByZXRyeUFmdGVySGVhZGVyLAogICAgc2VydmVySGVhZGVyLAogICAgdmFyeUhlYWRlciwKICAgIHd3d0F1dGhlbnRpY2F0ZUhlYWRlcgogIF07CgogIEBEZXByZWNhdGVkKCJVc2UgcmVzcG9uc2VIZWFkZXJzIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBSRVNQT05TRV9IRUFERVJTID0gcmVzcG9uc2VIZWFkZXJzOwoKICBzdGF0aWMgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSBjb25zdCBbCiAgICBhY2NlcHRIZWFkZXIsCiAgICBhY2NlcHRDaGFyc2V0SGVhZGVyLAogICAgYWNjZXB0RW5jb2RpbmdIZWFkZXIsCiAgICBhY2NlcHRMYW5ndWFnZUhlYWRlciwKICAgIGF1dGhvcml6YXRpb25IZWFkZXIsCiAgICBleHBlY3RIZWFkZXIsCiAgICBmcm9tSGVhZGVyLAogICAgaG9zdEhlYWRlciwKICAgIGlmTWF0Y2hIZWFkZXIsCiAgICBpZk1vZGlmaWVkU2luY2VIZWFkZXIsCiAgICBpZk5vbmVNYXRjaEhlYWRlciwKICAgIGlmUmFuZ2VIZWFkZXIsCiAgICBpZlVubW9kaWZpZWRTaW5jZUhlYWRlciwKICAgIG1heEZvcndhcmRzSGVhZGVyLAogICAgcHJveHlBdXRob3JpemF0aW9uSGVhZGVyLAogICAgcmFuZ2VIZWFkZXIsCiAgICByZWZlcmVySGVhZGVyLAogICAgdGVIZWFkZXIsCiAgICB1c2VyQWdlbnRIZWFkZXIKICBdOwoKICBARGVwcmVjYXRlZCgiVXNlIHJlcXVlc3RIZWFkZXJzIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBSRVFVRVNUX0hFQURFUlMgPSByZXF1ZXN0SGVhZGVyczsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgZGF0ZS4gVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgd2lsbAogICAqIHJlZmxlY3QgdGhlICdkYXRlJyBoZWFkZXIuCiAgICovCiAgRGF0ZVRpbWUgZGF0ZTsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgZXhwaXJ5IGRhdGUuIFRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IHdpbGwKICAgKiByZWZsZWN0IHRoZSAnZXhwaXJlcycgaGVhZGVyLgogICAqLwogIERhdGVUaW1lIGV4cGlyZXM7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlICJpZi1tb2RpZmllZC1zaW5jZSIgZGF0ZS4gVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgd2lsbAogICAqIHJlZmxlY3QgdGhlICJpZi1tb2RpZmllZC1zaW5jZSIgaGVhZGVyLgogICAqLwogIERhdGVUaW1lIGlmTW9kaWZpZWRTaW5jZTsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgaG9zdCBwYXJ0IG9mIHRoZSAnaG9zdCcgaGVhZGVyIGZvciB0aGUKICAgKiBjb25uZWN0aW9uLgogICAqLwogIFN0cmluZyBob3N0OwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBwb3J0IHBhcnQgb2YgdGhlICdob3N0JyBoZWFkZXIgZm9yIHRoZQogICAqIGNvbm5lY3Rpb24uCiAgICovCiAgaW50IHBvcnQ7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIGNvbnRlbnQgdHlwZS4gTm90ZSB0aGF0IHRoZSBjb250ZW50IHR5cGUgaW4gdGhlCiAgICogaGVhZGVyIHdpbGwgb25seSBiZSB1cGRhdGVkIGlmIHRoaXMgZmllbGQgaXMgc2V0CiAgICogZGlyZWN0bHkuIE11dGF0aW5nIHRoZSByZXR1cm5lZCBjdXJyZW50IHZhbHVlIHdpbGwgaGF2ZSBubwogICAqIGVmZmVjdC4KICAgKi8KICBDb250ZW50VHlwZSBjb250ZW50VHlwZTsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgY29udGVudCBsZW5ndGggaGVhZGVyIHZhbHVlLgogICAqLwogIGludCBjb250ZW50TGVuZ3RoOwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gaGVhZGVyIHZhbHVlLgogICAqLwogIGJvb2wgcGVyc2lzdGVudENvbm5lY3Rpb247CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcgaGVhZGVyIHZhbHVlLgogICAqLwogIGJvb2wgY2h1bmtlZFRyYW5zZmVyRW5jb2Rpbmc7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdmFsdWVzIGZvciB0aGUgaGVhZGVyIG5hbWVkIFtuYW1lXS4gSWYgdGhlcmUKICAgKiBpcyBubyBoZWFkZXIgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgWzpudWxsOl0gd2lsbCBiZSByZXR1cm5lZC4KICAgKi8KICBMaXN0PFN0cmluZz4gb3BlcmF0b3IgW10oU3RyaW5nIG5hbWUpOwoKICAvKioKICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHRoZSB2YWx1ZSBmb3IgYSBzaW5nbGUgdmFsdWVkIGhlYWRlci4gSWYKICAgKiB0aGVyZSBpcyBubyBoZWFkZXIgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgWzpudWxsOl0gd2lsbCBiZQogICAqIHJldHVybmVkLiBJZiB0aGUgaGVhZGVyIGhhcyBtb3JlIHRoYW4gb25lIHZhbHVlIGFuIGV4Y2VwdGlvbiBpcwogICAqIHRocm93bi4KICAgKi8KICBTdHJpbmcgdmFsdWUoU3RyaW5nIG5hbWUpOwoKICAvKioKICAgKiBBZGRzIGEgaGVhZGVyIHZhbHVlLiBUaGUgaGVhZGVyIG5hbWVkIFtuYW1lXSB3aWxsIGhhdmUgdGhlIHZhbHVlCiAgICogW3ZhbHVlXSBhZGRlZCB0byBpdHMgbGlzdCBvZiB2YWx1ZXMuIFNvbWUgaGVhZGVycyBhcmUgc2luZ2xlCiAgICogdmFsdWVkLCBhbmQgZm9yIHRoZXNlIGFkZGluZyBhIHZhbHVlIHdpbGwgcmVwbGFjZSB0aGUgcHJldmlvdXMKICAgKiB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIG9mIHR5cGUgRGF0ZVRpbWUgYSBIVFRQIGRhdGUgZm9ybWF0IHdpbGwgYmUKICAgKiBhcHBsaWVkLiBJZiB0aGUgdmFsdWUgaXMgYSBbOkxpc3Q6XSBlYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3Qgd2lsbAogICAqIGJlIGFkZGVkIHNlcGFyYXRlbHkuIEZvciBhbGwgb3RoZXIgdHlwZXMgdGhlIGRlZmF1bHQgWzp0b1N0cmluZzpdCiAgICogbWV0aG9kIHdpbGwgYmUgdXNlZC4KICAgKi8KICB2b2lkIGFkZChTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKTsKCiAgLyoqCiAgICogU2V0cyBhIGhlYWRlci4gVGhlIGhlYWRlciBuYW1lZCBbbmFtZV0gd2lsbCBoYXZlIGFsbCBpdHMgdmFsdWVzCiAgICogY2xlYXJlZCBiZWZvcmUgdGhlIHZhbHVlIFt2YWx1ZV0gaXMgYWRkZWQgYXMgaXRzIHZhbHVlLgogICAqLwogIHZvaWQgc2V0KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpOwoKICAvKioKICAgKiBSZW1vdmVzIGEgc3BlY2lmaWMgdmFsdWUgZm9yIGEgaGVhZGVyIG5hbWUuIFNvbWUgaGVhZGVycyBoYXZlCiAgICogc3lzdGVtIHN1cHBsaWVkIHZhbHVlcyBhbmQgZm9yIHRoZXNlIHRoZSBzeXN0ZW0gc3VwcGxpZWQgdmFsdWVzCiAgICogd2lsbCBzdGlsbCBiZSBhZGRlZCB0byB0aGUgY29sbGVjdGlvbiBvZiB2YWx1ZXMgZm9yIHRoZSBoZWFkZXIuCiAgICovCiAgdm9pZCByZW1vdmUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSk7CgogIC8qKgogICAqIFJlbW92ZXMgYWxsIHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBoZWFkZXIgbmFtZS4gU29tZSBoZWFkZXJzCiAgICogaGF2ZSBzeXN0ZW0gc3VwcGxpZWQgdmFsdWVzIGFuZCBmb3IgdGhlc2UgdGhlIHN5c3RlbSBzdXBwbGllZAogICAqIHZhbHVlcyB3aWxsIHN0aWxsIGJlIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHZhbHVlcyBmb3IgdGhlCiAgICogaGVhZGVyLgogICAqLwogIHZvaWQgcmVtb3ZlQWxsKFN0cmluZyBuYW1lKTsKCiAgLyoqCiAgICogRW51bWVyYXRlcyB0aGUgaGVhZGVycywgYXBwbHlpbmcgdGhlIGZ1bmN0aW9uIFtmXSB0byBlYWNoCiAgICogaGVhZGVyLiBUaGUgaGVhZGVyIG5hbWUgcGFzc2VkIGluIFs6bmFtZTpdIHdpbGwgYmUgYWxsIGxvd2VyCiAgICogY2FzZS4KICAgKi8KICB2b2lkIGZvckVhY2godm9pZCBmKFN0cmluZyBuYW1lLCBMaXN0PFN0cmluZz4gdmFsdWVzKSk7CgogIC8qKgogICAqIERpc2FibGVzIGZvbGRpbmcgZm9yIHRoZSBoZWFkZXIgbmFtZWQgW25hbWVdIHdoZW4gc2VuZGluZyB0aGUgSFRUUAogICAqIGhlYWRlci4gQnkgZGVmYXVsdCwgbXVsdGlwbGUgaGVhZGVyIHZhbHVlcyBhcmUgZm9sZGVkIGludG8gYQogICAqIHNpbmdsZSBoZWFkZXIgbGluZSBieSBzZXBhcmF0aW5nIHRoZSB2YWx1ZXMgd2l0aCBjb21tYXMuIFRoZQogICAqICdzZXQtY29va2llJyBoZWFkZXIgaGFzIGZvbGRpbmcgZGlzYWJsZWQgYnkgZGVmYXVsdC4KICAgKi8KICB2b2lkIG5vRm9sZGluZyhTdHJpbmcgbmFtZSk7CgogIC8qKgogICAqIFJlbW92ZSBhbGwgaGVhZGVycy4gU29tZSBoZWFkZXJzIGhhdmUgc3lzdGVtIHN1cHBsaWVkIHZhbHVlcyBhbmQKICAgKiBmb3IgdGhlc2UgdGhlIHN5c3RlbSBzdXBwbGllZCB2YWx1ZXMgd2lsbCBzdGlsbCBiZSBhZGRlZCB0byB0aGUKICAgKiBjb2xsZWN0aW9uIG9mIHZhbHVlcyBmb3IgdGhlIGhlYWRlci4KICAgKi8KICB2b2lkIGNsZWFyKCk7Cn0KCi8qKgogKiBSZXByZXNlbnRhdGlvbiBvZiBhIGhlYWRlciB2YWx1ZSBpbiB0aGUgZm9ybToKICoKICogICBbOnZhbHVlOyBwYXJhbWV0ZXIxPXZhbHVlMTsgcGFyYW1ldGVyMj12YWx1ZTI6XQogKgogKiBbSGVhZGVyVmFsdWVdIGNhbiBiZSB1c2VkIHRvIGNvbnZlbmllbnRseSBidWlsZCBhbmQgcGFyc2UgaGVhZGVyCiAqIHZhbHVlcyBvbiB0aGlzIGZvcm0uCiAqCiAqIFRvIGJ1aWxkIGFuIFs6YWNjZXB0czpdIGhlYWRlciB3aXRoIHRoZSB2YWx1ZQogKgogKiAgICAgdGV4dC9wbGFpbjsgcT0wLjMsIHRleHQvaHRtbAogKgogKiB1c2UgY29kZSBsaWtlIHRoaXM6CiAqCiAqICAgICBIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0ID0gLi4uOwogKiAgICAgdmFyIHYgPSBuZXcgSGVhZGVyVmFsdWUoInRleHQvcGxhaW4iLCB7InEiOiAiMC4zIn0pOwogKiAgICAgcmVxdWVzdC5oZWFkZXJzLmFkZChIdHRwSGVhZGVycy5hY2NlcHRIZWFkZXIsIHYpOwogKiAgICAgcmVxdWVzdC5oZWFkZXJzLmFkZChIdHRwSGVhZGVycy5hY2NlcHRIZWFkZXIsICJ0ZXh0L2h0bWwiKTsKICoKICogVG8gcGFyc2UgdGhlIGhlYWRlciB2YWx1ZXMgdXNlIHRoZSBbOnBhcnNlOl0gc3RhdGljIG1ldGhvZC4KICoKICogICAgIEh0dHBSZXF1ZXN0IHJlcXVlc3QgPSAuLi47CiAqICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gcmVxdWVzdC5oZWFkZXJzW0h0dHBIZWFkZXJzLmFjY2VwdEhlYWRlcl07CiAqICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWUpIHsKICogICAgICAgSGVhZGVyVmFsdWUgdiA9IEhlYWRlclZhbHVlLnBhcnNlKHZhbHVlKTsKICogICAgICAgLy8gVXNlIHYudmFsdWUgYW5kIHYucGFyYW1ldGVycwogKiAgICAgfSk7CiAqCiAqIEFuIGluc3RhbmNlIG9mIFtIZWFkZXJWYWx1ZV0gaXMgaW1tdXRhYmxlLgogKi8KYWJzdHJhY3QgY2xhc3MgSGVhZGVyVmFsdWUgewogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgaGVhZGVyIHZhbHVlIG9iamVjdCBzZXR0aW5nIHRoZSB2YWx1ZSBhbmQgcGFyYW1ldGVycy4KICAgKi8KICBmYWN0b3J5IEhlYWRlclZhbHVlKFtTdHJpbmcgdmFsdWUgPSAiIiwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzXSkgewogICAgcmV0dXJuIG5ldyBfSGVhZGVyVmFsdWUodmFsdWUsIHBhcmFtZXRlcnMpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBoZWFkZXIgdmFsdWUgb2JqZWN0IGZyb20gcGFyc2luZyBhIGhlYWRlciB2YWx1ZQogICAqIHN0cmluZyB3aXRoIGJvdGggdmFsdWUgYW5kIG9wdGlvbmFsIHBhcmFtZXRlcnMuCiAgICovCiAgc3RhdGljIEhlYWRlclZhbHVlIHBhcnNlKFN0cmluZyB2YWx1ZSwKICAgICAge1N0cmluZyBwYXJhbWV0ZXJTZXBhcmF0b3I6ICI7IiwKICAgICAgU3RyaW5nIHZhbHVlU2VwYXJhdG9yOiBudWxsLAogICAgICBib29sIHByZXNlcnZlQmFja3NsYXNoOiBmYWxzZX0pIHsKICAgIHJldHVybiBfSGVhZGVyVmFsdWUucGFyc2UodmFsdWUsCiAgICAgICAgcGFyYW1ldGVyU2VwYXJhdG9yOiBwYXJhbWV0ZXJTZXBhcmF0b3IsCiAgICAgICAgdmFsdWVTZXBhcmF0b3I6IHZhbHVlU2VwYXJhdG9yLAogICAgICAgIHByZXNlcnZlQmFja3NsYXNoOiBwcmVzZXJ2ZUJhY2tzbGFzaCk7CiAgfQoKICAvKioKICAgKiBHZXRzIHRoZSBoZWFkZXIgdmFsdWUuCiAgICovCiAgU3RyaW5nIGdldCB2YWx1ZTsKCiAgLyoqCiAgICogR2V0cyB0aGUgbWFwIG9mIHBhcmFtZXRlcnMuCiAgICoKICAgKiBUaGlzIG1hcCBjYW5ub3QgYmUgbW9kaWZpZWQuIEludm9raW5nIGFueSBvcGVyYXRpb24gd2hpY2ggd291bGQKICAgKiBtb2RpZnkgdGhlIG1hcCB3aWxsIHRocm93IFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldCBwYXJhbWV0ZXJzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluIHRoZSBmb3JtOgogICAqCiAgICogICAgIHZhbHVlOyBwYXJhbWV0ZXIxPXZhbHVlMTsgcGFyYW1ldGVyMj12YWx1ZTIKICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKTsKfQoKYWJzdHJhY3QgY2xhc3MgSHR0cFNlc3Npb24gaW1wbGVtZW50cyBNYXAgewogIC8qKgogICAqIEdldHMgdGhlIGlkIGZvciB0aGUgY3VycmVudCBzZXNzaW9uLgogICAqLwogIFN0cmluZyBnZXQgaWQ7CgogIC8qKgogICAqIERlc3Ryb3lzIHRoZSBzZXNzaW9uLiBUaGlzIHdpbGwgdGVybWluYXRlIHRoZSBzZXNzaW9uIGFuZCBhbnkgZnVydGhlcgogICAqIGNvbm5lY3Rpb25zIHdpdGggdGhpcyBpZCB3aWxsIGJlIGdpdmVuIGEgbmV3IGlkIGFuZCBzZXNzaW9uLgogICAqLwogIHZvaWQgZGVzdHJveSgpOwoKICAvKioKICAgKiBTZXRzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIGlzIHRpbWVkIG91dC4KICAgKi8KICB2b2lkIHNldCBvblRpbWVvdXQodm9pZCBjYWxsYmFjaygpKTsKCiAgLyoqCiAgICogSXMgdHJ1ZSBpZiB0aGUgc2Vzc2lvbiBoYXMgbm90IGJlZW4gc2VudCB0byB0aGUgY2xpZW50IHlldC4KICAgKi8KICBib29sIGdldCBpc05ldzsKfQoKLyoqCiAqIFJlcHJlc2VudGF0aW9uIG9mIGEgY29udGVudCB0eXBlLiBBbiBpbnN0YW5jZSBvZiBbQ29udGVudFR5cGVdIGlzCiAqIGltbXV0YWJsZS4KICovCmFic3RyYWN0IGNsYXNzIENvbnRlbnRUeXBlIGltcGxlbWVudHMgSGVhZGVyVmFsdWUgewogIC8qKgogICAqIENvbnRlbnQgdHlwZSBmb3IgcGxhaW4gdGV4dCB1c2luZyBVVEYtOCBlbmNvZGluZy4KICAgKgogICAqICAgICB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04CiAgICovCiAgc3RhdGljIGZpbmFsIHRleHQgPSBuZXcgQ29udGVudFR5cGUoInRleHQiLCAicGxhaW4iLCBjaGFyc2V0OiAidXRmLTgiKTsKICBARGVwcmVjYXRlZCgiVXNlIHRleHQgaW5zdGVhZCIpCiAgc3RhdGljIGZpbmFsIFRFWFQgPSB0ZXh0OwoKICAvKioKICAgKiAgQ29udGVudCB0eXBlIGZvciBIVE1MIHVzaW5nIFVURi04IGVuY29kaW5nLgogICAqCiAgICogICAgIHRleHQvaHRtbDsgY2hhcnNldD11dGYtOAogICAqLwogIHN0YXRpYyBmaW5hbCBodG1sID0gbmV3IENvbnRlbnRUeXBlKCJ0ZXh0IiwgImh0bWwiLCBjaGFyc2V0OiAidXRmLTgiKTsKICBARGVwcmVjYXRlZCgiVXNlIGh0bWwgaW5zdGVhZCIpCiAgc3RhdGljIGZpbmFsIEhUTUwgPSBodG1sOwoKICAvKioKICAgKiAgQ29udGVudCB0eXBlIGZvciBKU09OIHVzaW5nIFVURi04IGVuY29kaW5nLgogICAqCiAgICogICAgIGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgKICAgKi8KICBzdGF0aWMgZmluYWwganNvbiA9IG5ldyBDb250ZW50VHlwZSgiYXBwbGljYXRpb24iLCAianNvbiIsIGNoYXJzZXQ6ICJ1dGYtOCIpOwogIEBEZXByZWNhdGVkKCJVc2UganNvbiBpbnN0ZWFkIikKICBzdGF0aWMgZmluYWwgSlNPTiA9IGpzb247CgogIC8qKgogICAqICBDb250ZW50IHR5cGUgZm9yIGJpbmFyeSBkYXRhLgogICAqCiAgICogICAgIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQogICAqLwogIHN0YXRpYyBmaW5hbCBiaW5hcnkgPSBuZXcgQ29udGVudFR5cGUoImFwcGxpY2F0aW9uIiwgIm9jdGV0LXN0cmVhbSIpOwogIEBEZXByZWNhdGVkKCJVc2UgYmluYXJ5IGluc3RlYWQiKQogIHN0YXRpYyBmaW5hbCBCSU5BUlkgPSBiaW5hcnk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgY29udGVudCB0eXBlIG9iamVjdCBzZXR0aW5nIHRoZSBwcmltYXJ5IHR5cGUgYW5kCiAgICogc3ViIHR5cGUuIFRoZSBjaGFyc2V0IGFuZCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgY2FuIGFsc28gYmUgc2V0CiAgICogdXNpbmcgW2NoYXJzZXRdIGFuZCBbcGFyYW1ldGVyc10uIElmIGNoYXJzZXQgaXMgcGFzc2VkIGFuZAogICAqIFtwYXJhbWV0ZXJzXSBjb250YWlucyBjaGFyc2V0IGFzIHdlbGwgdGhlIHBhc3NlZCBbY2hhcnNldF0gd2lsbAogICAqIG92ZXJyaWRlIHRoZSB2YWx1ZSBpbiBwYXJhbWV0ZXJzLiBLZXlzIHBhc3NlZCBpbiBwYXJhbWV0ZXJzIHdpbGwgYmUKICAgKiBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4gVGhlIGBjaGFyc2V0YCBlbnRyeSwgd2hldGhlciBwYXNzZWQgYXMgYGNoYXJzZXRgCiAgICogb3IgaW4gYHBhcmFtZXRlcnNgLCB3aWxsIGhhdmUgaXRzIHZhbHVlIGNvbnZlcnRlZCB0byBsb3dlci1jYXNlLgogICAqLwogIGZhY3RvcnkgQ29udGVudFR5cGUoU3RyaW5nIHByaW1hcnlUeXBlLCBTdHJpbmcgc3ViVHlwZSwKICAgICAge1N0cmluZyBjaGFyc2V0LCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnN9KSB7CiAgICByZXR1cm4gbmV3IF9Db250ZW50VHlwZShwcmltYXJ5VHlwZSwgc3ViVHlwZSwgY2hhcnNldCwgcGFyYW1ldGVycyk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IGNvbnRlbnQgdHlwZSBvYmplY3QgZnJvbSBwYXJzaW5nIGEgQ29udGVudC1UeXBlCiAgICogaGVhZGVyIHZhbHVlLiBBcyBwcmltYXJ5IHR5cGUsIHN1YiB0eXBlIGFuZCBwYXJhbWV0ZXIgbmFtZXMgYW5kCiAgICogdmFsdWVzIGFyZSBub3QgY2FzZSBzZW5zaXRpdmUgYWxsIHRoZXNlIHZhbHVlcyB3aWxsIGJlIGNvbnZlcnRlZAogICAqIHRvIGxvd2VyIGNhc2UuIFBhcnNpbmcgdGhpcyBzdHJpbmcKICAgKgogICAqICAgICB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgKICAgKgogICAqIHdpbGwgY3JlYXRlIGEgY29udGVudCB0eXBlIG9iamVjdCB3aXRoIHByaW1hcnkgdHlwZSBbOnRleHQ6XSwgc3ViCiAgICogdHlwZSBbOmh0bWw6XSBhbmQgcGFyYW1ldGVyIFs6Y2hhcnNldDpdIHdpdGggdmFsdWUgWzp1dGYtODpdLgogICAqLwogIHN0YXRpYyBDb250ZW50VHlwZSBwYXJzZShTdHJpbmcgdmFsdWUpIHsKICAgIHJldHVybiBfQ29udGVudFR5cGUucGFyc2UodmFsdWUpOwogIH0KCiAgLyoqCiAgICogR2V0cyB0aGUgbWltZS10eXBlLCB3aXRob3V0IGFueSBwYXJhbWV0ZXJzLgogICAqLwogIFN0cmluZyBnZXQgbWltZVR5cGU7CgogIC8qKgogICAqIEdldHMgdGhlIHByaW1hcnkgdHlwZS4KICAgKi8KICBTdHJpbmcgZ2V0IHByaW1hcnlUeXBlOwoKICAvKioKICAgKiBHZXRzIHRoZSBzdWIgdHlwZS4KICAgKi8KICBTdHJpbmcgZ2V0IHN1YlR5cGU7CgogIC8qKgogICAqIEdldHMgdGhlIGNoYXJhY3RlciBzZXQuCiAgICovCiAgU3RyaW5nIGdldCBjaGFyc2V0Owp9CgovKioKICogUmVwcmVzZW50YXRpb24gb2YgYSBjb29raWUuIEZvciBjb29raWVzIHJlY2VpdmVkIGJ5IHRoZSBzZXJ2ZXIgYXMgQ29va2llCiAqIGhlYWRlciB2YWx1ZXMgb25seSBbbmFtZV0gYW5kIFt2YWx1ZV0gcHJvcGVydGllcyB3aWxsIGJlIHNldC4gV2hlbiBidWlsZGluZyBhCiAqIGNvb2tpZSBmb3IgdGhlICdzZXQtY29va2llJyBoZWFkZXIgaW4gdGhlIHNlcnZlciBhbmQgd2hlbiByZWNlaXZpbmcgY29va2llcwogKiBpbiB0aGUgY2xpZW50IGFzICdzZXQtY29va2llJyBoZWFkZXJzIGFsbCBmaWVsZHMgY2FuIGJlIHVzZWQuCiAqLwphYnN0cmFjdCBjbGFzcyBDb29raWUgewogIC8qKgogICAqIFRoZSBuYW1lIG9mIHRoZSBjb29raWUuCiAgICoKICAgKiBNdXN0IGJlIGEgYHRva2VuYCBhcyBzcGVjaWZpZWQgaW4gUkZDIDYyNjUuCiAgICoKICAgKiBUaGUgYWxsb3dlZCBjaGFyYWN0ZXJzIGluIGEgYHRva2VuYCBhcmUgdGhlIHZpc2libGUgQVNDSUkgY2hhcmFjdGVycywKICAgKiBVKzAwMjEgKGAhYCkgdGhyb3VnaCBVKzAwN0UgKGB+YCksIGV4Y2VwdCB0aGUgc2VwYXJhdG9yIGNoYXJhY3RlcnM6CiAgICogYChgLCBgKWAsIGA8YCwgYD5gLCBgQGAsIGAsYCwgYDtgLCBgOmAsIGBcYCwgYCJgLCBgL2AsIGBbYCwgYF1gLCBgP2AsIGA9YCwKICAgKiBge2AsIGFuZCBgfWAuCiAgICovCiAgU3RyaW5nIG5hbWU7CgogIC8qKgogICAqIFRoZSB2YWx1ZSBvZiB0aGUgY29va2llLgogICAqCiAgICogTXVzdCBiZSBhIGBjb29raWUtdmFsdWVgIGFzIHNwZWNpZmllZCBpbiBSRkMgNjI2NS4KICAgKgogICAqIFRoZSBhbGxvd2VkIGNoYXJhY3RlcnMgaW4gYSBjb29raWUgdmFsdWUgYXJlIHRoZSB2aXNpYmxlIEFTQ0lJIGNoYXJhY3RlcnMsCiAgICogVSswMDIxIChgIWApIHRocm91Z2ggVSswMDdFIChgfmApIGV4Y2VwdCB0aGUgY2hhcmFjdGVyczoKICAgKiBgImAsIGAsYCwgYDtgIGFuZCBgXGAuCiAgICogQ29va2llIHZhbHVlcyBtYXkgYmUgd3JhcHBlZCBpbiBhIHNpbmdsZSBwYWlyIG9mIGRvdWJsZSBxdW90ZXMKICAgKiAoVSswMDIyLCBgImApLgogICAqLwogIFN0cmluZyB2YWx1ZTsKCiAgLyoqCiAgICogVGhlIHRpbWUgYXQgd2hpY2ggdGhlIGNvb2tpZSBleHBpcmVzLgogICAqLwogIERhdGVUaW1lIGV4cGlyZXM7CgogIC8qKgogICAqIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB1bnRpbCB0aGUgY29va2llIGV4cGlyZXMuIEEgemVybyBvciBuZWdhdGl2ZSB2YWx1ZQogICAqIG1lYW5zIHRoZSBjb29raWUgaGFzIGV4cGlyZWQuCiAgICovCiAgaW50IG1heEFnZTsKCiAgLyoqCiAgICogVGhlIGRvbWFpbiB0aGUgY29va2llIGFwcGxpZXMgdG8uCiAgICovCiAgU3RyaW5nIGRvbWFpbjsKCiAgLyoqCiAgICogVGhlIHBhdGggd2l0aGluIHRoZSBbZG9tYWluXSB0aGUgY29va2llIGFwcGxpZXMgdG8uCiAgICovCiAgU3RyaW5nIHBhdGg7CgogIC8qKgogICAqIFdoZXRoZXIgdG8gb25seSBzZW5kIHRoaXMgY29va2llIG9uIHNlY3VyZSBjb25uZWN0aW9ucy4KICAgKi8KICBib29sIHNlY3VyZTsKCiAgLyoqCiAgICogV2hldGhlciB0aGUgY29va2llIGlzIG9ubHkgc2VudCBpbiB0aGUgSFRUUCByZXF1ZXN0IGFuZCBpcyBub3QgbWFkZQogICAqIGF2YWlsYWJsZSB0byBjbGllbnQgc2lkZSBzY3JpcHRzLgogICAqLwogIGJvb2wgaHR0cE9ubHk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgY29va2llIHNldHRpbmcgdGhlIG5hbWUgYW5kIHZhbHVlLgogICAqCiAgICogW25hbWVdIGFuZCBbdmFsdWVdIG11c3QgYmUgY29tcG9zZWQgb2YgdmFsaWQgY2hhcmFjdGVycyBhY2NvcmRpbmcgdG8gUkZDCiAgICogNjI2NS4KICAgKgogICAqIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIG9mIGBodHRwT25seWAgd2lsbCBiZSBzZXQgdG8gYHRydWVgLgogICAqLwogIGZhY3RvcnkgQ29va2llKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpID0+IG5ldyBfQ29va2llKG5hbWUsIHZhbHVlKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBjb29raWUgYnkgcGFyc2luZyBhIGhlYWRlciB2YWx1ZSBmcm9tIGEgJ3NldC1jb29raWUnCiAgICogaGVhZGVyLgogICAqLwogIGZhY3RvcnkgQ29va2llLmZyb21TZXRDb29raWVWYWx1ZShTdHJpbmcgdmFsdWUpIHsKICAgIHJldHVybiBuZXcgX0Nvb2tpZS5mcm9tU2V0Q29va2llVmFsdWUodmFsdWUpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29va2llLiBUaGUKICAgKiBzdHJpbmcgcmVwcmVzZW50YXRpb24gY2FuIGJlIHVzZWQgZm9yIGZvciBzZXR0aW5nIHRoZSBDb29raWUgb3IKICAgKiAnc2V0LWNvb2tpZScgaGVhZGVycwogICAqLwogIFN0cmluZyB0b1N0cmluZygpOwp9CgovKioKICogQSBzZXJ2ZXItc2lkZSBvYmplY3QKICogdGhhdCBjb250YWlucyB0aGUgY29udGVudCBvZiBhbmQgaW5mb3JtYXRpb24gYWJvdXQgYW4gSFRUUCByZXF1ZXN0LgogKgogKiBfX05vdGVfXzogQ2hlY2sgb3V0IHRoZQogKiBbaHR0cF9zZXJ2ZXJdKGh0dHBzOi8vcHViLmRhcnRsYW5nLm9yZy9wYWNrYWdlcy9odHRwX3NlcnZlcikKICogcGFja2FnZSwgd2hpY2ggbWFrZXMgd29ya2luZyB3aXRoIHRoZSBsb3ctbGV2ZWwKICogZGFydDppbyBIVFRQIHNlcnZlciBzdWJzeXN0ZW0gZWFzaWVyLgogKgogKiBgSHR0cFJlcXVlc3RgIG9iamVjdHMgYXJlIGdlbmVyYXRlZCBieSBhbiBbSHR0cFNlcnZlcl0sCiAqIHdoaWNoIGxpc3RlbnMgZm9yIEhUVFAgcmVxdWVzdHMgb24gYSBzcGVjaWZpYyBob3N0IGFuZCBwb3J0LgogKiBGb3IgZWFjaCByZXF1ZXN0IHJlY2VpdmVkLCB0aGUgSHR0cFNlcnZlciwgd2hpY2ggaXMgYSBbU3RyZWFtXSwKICogZ2VuZXJhdGVzIGFuIGBIdHRwUmVxdWVzdGAgb2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBzdHJlYW0uCiAqCiAqIEFuIGBIdHRwUmVxdWVzdGAgb2JqZWN0IGRlbGl2ZXJzIHRoZSBib2R5IGNvbnRlbnQgb2YgdGhlIHJlcXVlc3QKICogYXMgYSBzdHJlYW0gb2YgYnl0ZSBsaXN0cy4KICogVGhlIG9iamVjdCBhbHNvIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0LAogKiBzdWNoIGFzIHRoZSBtZXRob2QsIFVSSSwgYW5kIGhlYWRlcnMuCiAqCiAqIEluIHRoZSBmb2xsb3dpbmcgY29kZSwgYW4gSHR0cFNlcnZlciBsaXN0ZW5zCiAqIGZvciBIVFRQIHJlcXVlc3RzLiBXaGVuIHRoZSBzZXJ2ZXIgcmVjZWl2ZXMgYSByZXF1ZXN0LAogKiBpdCB1c2VzIHRoZSBIdHRwUmVxdWVzdCBvYmplY3QncyBgbWV0aG9kYCBwcm9wZXJ0eSB0byBkaXNwYXRjaCByZXF1ZXN0cy4KICoKICogICAgIGZpbmFsIEhPU1QgPSBJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY0OwogKiAgICAgZmluYWwgUE9SVCA9IDgwOwogKgogKiAgICAgSHR0cFNlcnZlci5iaW5kKEhPU1QsIFBPUlQpLnRoZW4oKF9zZXJ2ZXIpIHsKICogICAgICAgX3NlcnZlci5saXN0ZW4oKEh0dHBSZXF1ZXN0IHJlcXVlc3QpIHsKICogICAgICAgICBzd2l0Y2ggKHJlcXVlc3QubWV0aG9kKSB7CiAqICAgICAgICAgICBjYXNlICdHRVQnOgogKiAgICAgICAgICAgICBoYW5kbGVHZXRSZXF1ZXN0KHJlcXVlc3QpOwogKiAgICAgICAgICAgICBicmVhazsKICogICAgICAgICAgIGNhc2UgJ1BPU1QnOgogKiAgICAgICAgICAgICAuLi4KICogICAgICAgICB9CiAqICAgICAgIH0sCiAqICAgICAgIG9uRXJyb3I6IGhhbmRsZUVycm9yKTsgICAgLy8gbGlzdGVuKCkgZmFpbGVkLgogKiAgICAgfSkuY2F0Y2hFcnJvcihoYW5kbGVFcnJvcik7CiAqCiAqIEFuIEh0dHBSZXF1ZXN0IG9iamVjdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGFzc29jaWF0ZWQgW0h0dHBSZXNwb25zZV0KICogb2JqZWN0IHRocm91Z2ggdGhlIHJlc3BvbnNlIHByb3BlcnR5LgogKiBUaGUgc2VydmVyIHdyaXRlcyBpdHMgcmVzcG9uc2UgdG8gdGhlIGJvZHkgb2YgdGhlIEh0dHBSZXNwb25zZSBvYmplY3QuCiAqIEZvciBleGFtcGxlLCBoZXJlJ3MgYSBmdW5jdGlvbiB0aGF0IHJlc3BvbmRzIHRvIGEgcmVxdWVzdDoKICoKICogICAgIHZvaWQgaGFuZGxlR2V0UmVxdWVzdChIdHRwUmVxdWVzdCByZXEpIHsKICogICAgICAgSHR0cFJlc3BvbnNlIHJlcyA9IHJlcS5yZXNwb25zZTsKICogICAgICAgcmVzLndyaXRlKCdSZWNlaXZlZCByZXF1ZXN0ICR7cmVxLm1ldGhvZH06ICR7cmVxLnVyaS5wYXRofScpOwogKiAgICAgICByZXMuY2xvc2UoKTsKICogICAgIH0KICovCmFic3RyYWN0IGNsYXNzIEh0dHBSZXF1ZXN0IGltcGxlbWVudHMgU3RyZWFtPFVpbnQ4TGlzdD4gewogIC8qKgogICAqIFRoZSBjb250ZW50IGxlbmd0aCBvZiB0aGUgcmVxdWVzdCBib2R5LgogICAqCiAgICogSWYgdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QgYm9keSBpcyBub3Qga25vd24gaW4gYWR2YW5jZSwKICAgKiB0aGlzIHZhbHVlIGlzIC0xLgogICAqLwogIGludCBnZXQgY29udGVudExlbmd0aDsKCiAgLyoqCiAgICogVGhlIG1ldGhvZCwgc3VjaCBhcyAnR0VUJyBvciAnUE9TVCcsIGZvciB0aGUgcmVxdWVzdC4KICAgKi8KICBTdHJpbmcgZ2V0IG1ldGhvZDsKCiAgLyoqCiAgICogVGhlIFVSSSBmb3IgdGhlIHJlcXVlc3QuCiAgICoKICAgKiBUaGlzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUKICAgKiBwYXRoIGFuZCBxdWVyeSBzdHJpbmcgZm9yIHRoZSByZXF1ZXN0LgogICAqLwogIFVyaSBnZXQgdXJpOwoKICAvKioKICAgKiBUaGUgcmVxdWVzdGVkIFVSSSBmb3IgdGhlIHJlcXVlc3QuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgVVJJIGlzIHJlY29uc3RydWN0ZWQgYnkgdXNpbmcgaHR0cC1oZWFkZXIgZmllbGRzLCB0byBhY2Nlc3MKICAgKiBvdGhlcndpc2UgbG9zdCBpbmZvcm1hdGlvbiwgZS5nLiBob3N0IGFuZCBzY2hlbWUuCiAgICoKICAgKiBUbyByZWNvbnN0cnVjdCB0aGUgc2NoZW1lLCBmaXJzdCAnWC1Gb3J3YXJkZWQtUHJvdG8nIGlzIGNoZWNrZWQsIGFuZCB0aGVuCiAgICogZmFsbGluZyBiYWNrIHRvIHNlcnZlciB0eXBlLgogICAqCiAgICogVG8gcmVjb25zdHJ1Y3QgdGhlIGhvc3QsIGZpcnN0ICdYLUZvcndhcmRlZC1Ib3N0JyBpcyBjaGVja2VkLCB0aGVuICdIb3N0JwogICAqIGFuZCBmaW5hbGx5IGNhbGxpbmcgYmFjayB0byBzZXJ2ZXIuCiAgICovCiAgVXJpIGdldCByZXF1ZXN0ZWRVcmk7CgogIC8qKgogICAqIFRoZSByZXF1ZXN0IGhlYWRlcnMuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgW0h0dHBIZWFkZXJzXSBhcmUgaW1tdXRhYmxlLgogICAqLwogIEh0dHBIZWFkZXJzIGdldCBoZWFkZXJzOwoKICAvKioKICAgKiBUaGUgY29va2llcyBpbiB0aGUgcmVxdWVzdCwgZnJvbSB0aGUgQ29va2llIGhlYWRlcnMuCiAgICovCiAgTGlzdDxDb29raWU+IGdldCBjb29raWVzOwoKICAvKioKICAgKiBUaGUgcGVyc2lzdGVudCBjb25uZWN0aW9uIHN0YXRlIHNpZ25hbGVkIGJ5IHRoZSBjbGllbnQuCiAgICovCiAgYm9vbCBnZXQgcGVyc2lzdGVudENvbm5lY3Rpb247CgogIC8qKgogICAqIFRoZSBjbGllbnQgY2VydGlmaWNhdGUgb2YgdGhlIGNsaWVudCBtYWtpbmcgdGhlIHJlcXVlc3QuCiAgICoKICAgKiBUaGlzIHZhbHVlIGlzIG51bGwgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGEgc2VjdXJlIFRMUyBvciBTU0wgY29ubmVjdGlvbiwKICAgKiBvciBpZiB0aGUgc2VydmVyIGRvZXMgbm90IHJlcXVlc3QgYSBjbGllbnQgY2VydGlmaWNhdGUsIG9yIGlmIHRoZSBjbGllbnQKICAgKiBkb2VzIG5vdCBwcm92aWRlIG9uZS4KICAgKi8KICBYNTA5Q2VydGlmaWNhdGUgZ2V0IGNlcnRpZmljYXRlOwoKICAvKioKICAgKiBUaGUgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIHJlcXVlc3QuCiAgICoKICAgKiBJZiB0aGUgc2Vzc2lvbiBpcwogICAqIGJlaW5nIGluaXRpYWxpemVkIGJ5IHRoaXMgY2FsbCwgWzppc05ldzpdIGlzIHRydWUgZm9yIHRoZSByZXR1cm5lZAogICAqIHNlc3Npb24uCiAgICogU2VlIFtIdHRwU2VydmVyLnNlc3Npb25UaW1lb3V0XSBvbiBob3cgdG8gY2hhbmdlIGRlZmF1bHQgdGltZW91dC4KICAgKi8KICBIdHRwU2Vzc2lvbiBnZXQgc2Vzc2lvbjsKCiAgLyoqCiAgICogVGhlIEhUVFAgcHJvdG9jb2wgdmVyc2lvbiB1c2VkIGluIHRoZSByZXF1ZXN0LAogICAqIGVpdGhlciAiMS4wIiBvciAiMS4xIi4KICAgKi8KICBTdHJpbmcgZ2V0IHByb3RvY29sVmVyc2lvbjsKCiAgLyoqCiAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsaWVudCBjb25uZWN0aW9uLgogICAqCiAgICogUmV0dXJucyBbOm51bGw6XSBpZiB0aGUgc29ja2V0IGlzIG5vdCBhdmFpbGFibGUuCiAgICovCiAgSHR0cENvbm5lY3Rpb25JbmZvIGdldCBjb25uZWN0aW9uSW5mbzsKCiAgLyoqCiAgICogVGhlIFtIdHRwUmVzcG9uc2VdIG9iamVjdCwgdXNlZCBmb3Igc2VuZGluZyBiYWNrIHRoZSByZXNwb25zZSB0byB0aGUKICAgKiBjbGllbnQuCiAgICoKICAgKiBJZiB0aGUgW2NvbnRlbnRMZW5ndGhdIG9mIHRoZSBib2R5IGlzbid0IDAsIGFuZCB0aGUgYm9keSBpc24ndCBiZWluZyByZWFkLAogICAqIGFueSB3cml0ZSBjYWxscyBvbiB0aGUgW0h0dHBSZXNwb25zZV0gYXV0b21hdGljYWxseSBkcmFpbiB0aGUgcmVxdWVzdAogICAqIGJvZHkuCiAgICovCiAgSHR0cFJlc3BvbnNlIGdldCByZXNwb25zZTsKfQoKLyoqCiAqIEFuIEhUVFAgcmVzcG9uc2UsIHdoaWNoIHJldHVybnMgdGhlIGhlYWRlcnMgYW5kIGRhdGEKICogZnJvbSB0aGUgc2VydmVyIHRvIHRoZSBjbGllbnQgaW4gcmVzcG9uc2UgdG8gYW4gSFRUUCByZXF1ZXN0LgogKgogKiBFdmVyeSBIdHRwUmVxdWVzdCBvYmplY3QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBhc3NvY2lhdGVkIFtIdHRwUmVzcG9uc2VdCiAqIG9iamVjdCB0aHJvdWdoIHRoZSBgcmVzcG9uc2VgIHByb3BlcnR5LgogKiBUaGUgc2VydmVyIHNlbmRzIGl0cyByZXNwb25zZSB0byB0aGUgY2xpZW50IGJ5IHdyaXRpbmcgdG8gdGhlCiAqIEh0dHBSZXNwb25zZSBvYmplY3QuCiAqCiAqICMjIFdyaXRpbmcgdGhlIHJlc3BvbnNlCiAqCiAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBbSU9TaW5rXS4KICogQWZ0ZXIgdGhlIGhlYWRlciBoYXMgYmVlbiBzZXQgdXAsIHRoZSBtZXRob2RzCiAqIGZyb20gSU9TaW5rLCBzdWNoIGFzIGB3cml0ZWxuKClgLCBjYW4gYmUgdXNlZCB0byB3cml0ZQogKiB0aGUgYm9keSBvZiB0aGUgSFRUUCByZXNwb25zZS4KICogVXNlIHRoZSBgY2xvc2UoKWAgbWV0aG9kIHRvIGNsb3NlIHRoZSByZXNwb25zZSBhbmQgc2VuZCBpdCB0byB0aGUgY2xpZW50LgogKgogKiAgICAgc2VydmVyLmxpc3RlbigoSHR0cFJlcXVlc3QgcmVxdWVzdCkgewogKiAgICAgICByZXF1ZXN0LnJlc3BvbnNlLndyaXRlKCdIZWxsbywgd29ybGQhJyk7CiAqICAgICAgIHJlcXVlc3QucmVzcG9uc2UuY2xvc2UoKTsKICogICAgIH0pOwogKgogKiBXaGVuIG9uZSBvZiB0aGUgSU9TaW5rIG1ldGhvZHMgaXMgdXNlZCBmb3IgdGhlCiAqIGZpcnN0IHRpbWUsIHRoZSByZXF1ZXN0IGhlYWRlciBpcyBzZW50LiBDYWxsaW5nIGFueSBtZXRob2RzIHRoYXQKICogY2hhbmdlIHRoZSBoZWFkZXIgYWZ0ZXIgaXQgaXMgc2VudCB0aHJvd3MgYW4gZXhjZXB0aW9uLgogKgogKiAjIyBTZXR0aW5nIHRoZSBoZWFkZXJzCiAqCiAqIFRoZSBIdHRwUmVzcG9uc2Ugb2JqZWN0IGhhcyBhIG51bWJlciBvZiBwcm9wZXJ0aWVzIGZvciBzZXR0aW5nIHVwCiAqIHRoZSBIVFRQIGhlYWRlcnMgb2YgdGhlIHJlc3BvbnNlLgogKiBXaGVuIHdyaXRpbmcgc3RyaW5nIGRhdGEgdGhyb3VnaCB0aGUgSU9TaW5rLCB0aGUgZW5jb2RpbmcgdXNlZAogKiBpcyBkZXRlcm1pbmVkIGZyb20gdGhlICJjaGFyc2V0IiBwYXJhbWV0ZXIgb2YgdGhlCiAqICJDb250ZW50LVR5cGUiIGhlYWRlci4KICoKICogICAgIEh0dHBSZXNwb25zZSByZXNwb25zZSA9IC4uLgogKiAgICAgcmVzcG9uc2UuaGVhZGVycy5jb250ZW50VHlwZQogKiAgICAgICAgID0gbmV3IENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbiIsICJqc29uIiwgY2hhcnNldDogInV0Zi04Iik7CiAqICAgICByZXNwb25zZS53cml0ZSguLi4pOyAgLy8gU3RyaW5ncyB3cml0dGVuIHdpbGwgYmUgVVRGLTggZW5jb2RlZC4KICoKICogSWYgbm8gY2hhcnNldCBpcyBwcm92aWRlZCB0aGUgZGVmYXVsdCBvZiBJU08tODg1OS0xIChMYXRpbiAxKSB3aWxsCiAqIGJlIHVzZWQuCiAqCiAqICAgICBIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSAuLi4KICogICAgIHJlc3BvbnNlLmhlYWRlcnMuYWRkKEh0dHBIZWFkZXJzLmNvbnRlbnRUeXBlSGVhZGVyLCAidGV4dC9wbGFpbiIpOwogKiAgICAgcmVzcG9uc2Uud3JpdGUoLi4uKTsgIC8vIFN0cmluZ3Mgd3JpdHRlbiB3aWxsIGJlIElTTy04ODU5LTEgZW5jb2RlZC4KICoKICogQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB5b3UgdXNlIHRoZSBgd3JpdGUoKWAgbWV0aG9kCiAqIHdoaWxlIGFuIHVuc3VwcG9ydGVkIGNvbnRlbnQtdHlwZSBpcyBzZXQuCiAqLwphYnN0cmFjdCBjbGFzcyBIdHRwUmVzcG9uc2UgaW1wbGVtZW50cyBJT1NpbmsgewogIC8vIFRPRE8oYWpvaG5zZW4pOiBBZGQgZG9jdW1lbnRhdGlvbiBvZiBob3cgdG8gcGlwZSBhIGZpbGUgdG8gdGhlIHJlc3BvbnNlLgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIGNvbnRlbnQgbGVuZ3RoIG9mIHRoZSByZXNwb25zZS4gSWYgdGhlIHNpemUgb2YKICAgKiB0aGUgcmVzcG9uc2UgaXMgbm90IGtub3duIGluIGFkdmFuY2Ugc2V0IHRoZSBjb250ZW50IGxlbmd0aCB0bwogICAqIC0xLCB3aGljaCBpcyBhbHNvIHRoZSBkZWZhdWx0IGlmIG5vdCBzZXQuCiAgICovCiAgaW50IGNvbnRlbnRMZW5ndGg7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIHN0YXR1cyBjb2RlLiBBbnkgaW50ZWdlciB2YWx1ZSBpcyBhY2NlcHRlZC4gRm9yCiAgICogdGhlIG9mZmljaWFsIEhUVFAgc3RhdHVzIGNvZGVzIHVzZSB0aGUgZmllbGRzIGZyb20KICAgKiBbSHR0cFN0YXR1c10uIElmIG5vIHN0YXR1cyBjb2RlIGlzIGV4cGxpY2l0bHkgc2V0IHRoZSBkZWZhdWx0CiAgICogdmFsdWUgW0h0dHBTdGF0dXMub2tdIGlzIHVzZWQuCiAgICoKICAgKiBUaGUgc3RhdHVzIGNvZGUgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBib2R5IGlzIHdyaXR0ZW4KICAgKiB0by4gU2V0dGluZyB0aGUgc3RhdHVzIGNvZGUgYWZ0ZXIgd3JpdGluZyB0byB0aGUgcmVzcG9uc2UgYm9keSBvcgogICAqIGNsb3NpbmcgdGhlIHJlc3BvbnNlIHdpbGwgdGhyb3cgYSBgU3RhdGVFcnJvcmAuCiAgICovCiAgaW50IHN0YXR1c0NvZGU7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIHJlYXNvbiBwaHJhc2UuIElmIG5vIHJlYXNvbiBwaHJhc2UgaXMgZXhwbGljaXRseQogICAqIHNldCBhIGRlZmF1bHQgcmVhc29uIHBocmFzZSBpcyBwcm92aWRlZC4KICAgKgogICAqIFRoZSByZWFzb24gcGhyYXNlIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgYm9keSBpcyB3cml0dGVuCiAgICogdG8uIFNldHRpbmcgdGhlIHJlYXNvbiBwaHJhc2UgYWZ0ZXIgd3JpdGluZyB0byB0aGUgcmVzcG9uc2UgYm9keQogICAqIG9yIGNsb3NpbmcgdGhlIHJlc3BvbnNlIHdpbGwgdGhyb3cgYSBgU3RhdGVFcnJvcmAuCiAgICovCiAgU3RyaW5nIHJlYXNvblBocmFzZTsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgcGVyc2lzdGVudCBjb25uZWN0aW9uIHN0YXRlLiBUaGUgaW5pdGlhbCB2YWx1ZQogICAqIG9mIHRoaXMgcHJvcGVydHkgaXMgdGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdGF0ZSBmcm9tIHRoZQogICAqIHJlcXVlc3QuCiAgICovCiAgYm9vbCBwZXJzaXN0ZW50Q29ubmVjdGlvbjsKCiAgLyoqCiAgICogU2V0IGFuZCBnZXQgdGhlIFtkZWFkbGluZV0gZm9yIHRoZSByZXNwb25zZS4gVGhlIGRlYWRsaW5lIGlzIHRpbWVkIGZyb20gdGhlCiAgICogdGltZSBpdCdzIHNldC4gU2V0dGluZyBhIG5ldyBkZWFkbGluZSB3aWxsIG92ZXJyaWRlIGFueSBwcmV2aW91cyBkZWFkbGluZS4KICAgKiBXaGVuIGEgZGVhZGxpbmUgaXMgZXhjZWVkZWQsIHRoZSByZXNwb25zZSB3aWxsIGJlIGNsb3NlZCBhbmQgYW55IGZ1cnRoZXIKICAgKiBkYXRhIGlnbm9yZWQuCiAgICoKICAgKiBUbyBkaXNhYmxlIGEgZGVhZGxpbmUsIHNldCB0aGUgW2RlYWRsaW5lXSB0byBgbnVsbGAuCiAgICoKICAgKiBUaGUgW2RlYWRsaW5lXSBpcyBgbnVsbGAgYnkgZGVmYXVsdC4KICAgKi8KICBEdXJhdGlvbiBkZWFkbGluZTsKCiAgLyoqCiAgICogR2V0cyBvciBzZXRzIGlmIHRoZSBbSHR0cFJlc3BvbnNlXSBzaG91bGQgYnVmZmVyIG91dHB1dC4KICAgKgogICAqIERlZmF1bHQgdmFsdWUgaXMgYHRydWVgLgogICAqCiAgICogX19Ob3RlX186IERpc2FibGluZyBidWZmZXJpbmcgb2YgdGhlIG91dHB1dCBjYW4gcmVzdWx0IGluIHZlcnkgcG9vcgogICAqIHBlcmZvcm1hbmNlLCB3aGVuIHdyaXRpbmcgbWFueSBzbWFsbCBjaHVua3MuCiAgICovCiAgYm9vbCBidWZmZXJPdXRwdXQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHJlc3BvbnNlIGhlYWRlcnMuCiAgICoKICAgKiBUaGUgcmVzcG9uc2UgaGVhZGVycyBjYW4gYmUgbW9kaWZpZWQgdW50aWwgdGhlIHJlc3BvbnNlIGJvZHkgaXMKICAgKiB3cml0dGVuIHRvIG9yIGNsb3NlZC4gQWZ0ZXIgdGhhdCB0aGV5IGJlY29tZSBpbW11dGFibGUuCiAgICovCiAgSHR0cEhlYWRlcnMgZ2V0IGhlYWRlcnM7CgogIC8qKgogICAqIENvb2tpZXMgdG8gc2V0IGluIHRoZSBjbGllbnQgKGluIHRoZSAnc2V0LWNvb2tpZScgaGVhZGVyKS4KICAgKi8KICBMaXN0PENvb2tpZT4gZ2V0IGNvb2tpZXM7CgogIC8qKgogICAqIFJlc3BvbmQgd2l0aCBhIHJlZGlyZWN0IHRvIFtsb2NhdGlvbl0uCiAgICoKICAgKiBUaGUgVVJJIGluIFtsb2NhdGlvbl0gc2hvdWxkIGJlIGFic29sdXRlLCBidXQgdGhlcmUgYXJlIG5vIGNoZWNrcwogICAqIHRvIGVuZm9yY2UgdGhhdC4KICAgKgogICAqIEJ5IGRlZmF1bHQgdGhlIEhUVFAgc3RhdHVzIGNvZGUgYEh0dHBTdGF0dXMubW92ZWRUZW1wb3JhcmlseWAKICAgKiAoYDMwMmApIGlzIHVzZWQgZm9yIHRoZSByZWRpcmVjdCwgYnV0IGFuIGFsdGVybmF0aXZlIG9uZSBjYW4gYmUKICAgKiBzcGVjaWZpZWQgdXNpbmcgdGhlIFtzdGF0dXNdIGFyZ3VtZW50LgogICAqCiAgICogVGhpcyBtZXRob2Qgd2lsbCBhbHNvIGNhbGwgYGNsb3NlYCwgYW5kIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMKICAgKiB0aGUgZnV0dXJlIHJldHVybmVkIGJ5IGBjbG9zZWAuCiAgICovCiAgRnV0dXJlIHJlZGlyZWN0KFVyaSBsb2NhdGlvbiwge2ludCBzdGF0dXM6IEh0dHBTdGF0dXMubW92ZWRUZW1wb3JhcmlseX0pOwoKICAvKioKICAgKiBEZXRhY2hlcyB0aGUgdW5kZXJseWluZyBzb2NrZXQgZnJvbSB0aGUgSFRUUCBzZXJ2ZXIuIFdoZW4gdGhlCiAgICogc29ja2V0IGlzIGRldGFjaGVkIHRoZSBIVFRQIHNlcnZlciB3aWxsIG5vIGxvbmdlciBwZXJmb3JtIGFueQogICAqIG9wZXJhdGlvbnMgb24gaXQuCiAgICoKICAgKiBUaGlzIGlzIG5vcm1hbGx5IHVzZWQgd2hlbiBhIEhUVFAgdXBncmFkZSByZXF1ZXN0IGlzIHJlY2VpdmVkCiAgICogYW5kIHRoZSBjb21tdW5pY2F0aW9uIHNob3VsZCBjb250aW51ZSB3aXRoIGEgZGlmZmVyZW50IHByb3RvY29sLgogICAqCiAgICogSWYgW3dyaXRlSGVhZGVyc10gaXMgYHRydWVgLCB0aGUgc3RhdHVzIGxpbmUgYW5kIFtoZWFkZXJzXSB3aWxsIGJlIHdyaXR0ZW4KICAgKiB0byB0aGUgc29ja2V0IGJlZm9yZSBpdCdzIGRldGFjaGVkLiBJZiBgZmFsc2VgLCB0aGUgc29ja2V0IGlzIGRldGFjaGVkCiAgICogaW1tZWRpYXRlbHksIHdpdGhvdXQgYW55IGRhdGEgd3JpdHRlbiB0byB0aGUgc29ja2V0LiBEZWZhdWx0IGlzIGB0cnVlYC4KICAgKi8KICBGdXR1cmU8U29ja2V0PiBkZXRhY2hTb2NrZXQoe2Jvb2wgd3JpdGVIZWFkZXJzOiB0cnVlfSk7CgogIC8qKgogICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsaWVudCBjb25uZWN0aW9uLiBSZXR1cm5zIFs6bnVsbDpdIGlmIHRoZQogICAqIHNvY2tldCBpcyBub3QgYXZhaWxhYmxlLgogICAqLwogIEh0dHBDb25uZWN0aW9uSW5mbyBnZXQgY29ubmVjdGlvbkluZm87Cn0KCi8qKgogKiBBIGNsaWVudCB0aGF0IHJlY2VpdmVzIGNvbnRlbnQsIHN1Y2ggYXMgd2ViIHBhZ2VzLCBmcm9tCiAqIGEgc2VydmVyIHVzaW5nIHRoZSBIVFRQIHByb3RvY29sLgogKgogKiBIdHRwQ2xpZW50IGNvbnRhaW5zIGEgbnVtYmVyIG9mIG1ldGhvZHMgdG8gc2VuZCBhbiBbSHR0cENsaWVudFJlcXVlc3RdCiAqIHRvIGFuIEh0dHAgc2VydmVyIGFuZCByZWNlaXZlIGFuIFtIdHRwQ2xpZW50UmVzcG9uc2VdIGJhY2suCiAqIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSB0aGUgW2dldF0sIFtnZXRVcmxdLCBbcG9zdF0sIGFuZCBbcG9zdFVybF0gbWV0aG9kcwogKiBmb3IgR0VUIGFuZCBQT1NUIHJlcXVlc3RzLCByZXNwZWN0aXZlbHkuCiAqCiAqICMjIE1ha2luZyBhIHNpbXBsZSBHRVQgcmVxdWVzdDogYW4gZXhhbXBsZQogKgogKiBBIGBnZXRVcmxgIHJlcXVlc3QgaXMgYSB0d28tc3RlcCBwcm9jZXNzLCB0cmlnZ2VyZWQgYnkgdHdvIFtGdXR1cmVdcy4KICogV2hlbiB0aGUgZmlyc3QgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGEgW0h0dHBDbGllbnRSZXF1ZXN0XSwgdGhlIHVuZGVybHlpbmcKICogbmV0d29yayBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLCBidXQgbm8gZGF0YSBoYXMgYmVlbiBzZW50LgogKiBJbiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBmaXJzdCBmdXR1cmUsIHRoZSBIVFRQIGhlYWRlcnMgYW5kIGJvZHkKICogY2FuIGJlIHNldCBvbiB0aGUgcmVxdWVzdC4gRWl0aGVyIHRoZSBmaXJzdCB3cml0ZSB0byB0aGUgcmVxdWVzdCBvYmplY3QKICogb3IgYSBjYWxsIHRvIFtjbG9zZV0gc2VuZHMgdGhlIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4KICoKICogV2hlbiB0aGUgSFRUUCByZXNwb25zZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIsCiAqIHRoZSBzZWNvbmQgZnV0dXJlLCB3aGljaCBpcyByZXR1cm5lZCBieSBjbG9zZSwKICogY29tcGxldGVzIHdpdGggYW4gW0h0dHBDbGllbnRSZXNwb25zZV0gb2JqZWN0LgogKiBUaGlzIG9iamVjdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGhlYWRlcnMgYW5kIGJvZHkgb2YgdGhlIHJlc3BvbnNlLgogKiBUaGUgYm9keSBpcyBhdmFpbGFibGUgYXMgYSBzdHJlYW0gaW1wbGVtZW50ZWQgYnkgSHR0cENsaWVudFJlc3BvbnNlLgogKiBJZiBhIGJvZHkgaXMgcHJlc2VudCwgaXQgbXVzdCBiZSByZWFkLiBPdGhlcndpc2UsIGl0IGxlYWRzIHRvIHJlc291cmNlCiAqIGxlYWtzLiBDb25zaWRlciB1c2luZyBbSHR0cENsaWVudFJlc3BvbnNlLmRyYWluXSBpZiB0aGUgYm9keSBpcyB1bnVzZWQuCiAqCiAqICAgICBIdHRwQ2xpZW50IGNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7CiAqICAgICBjbGllbnQuZ2V0VXJsKFVyaS5wYXJzZSgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKSkKICogICAgICAgICAudGhlbigoSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCkgewogKiAgICAgICAgICAgLy8gT3B0aW9uYWxseSBzZXQgdXAgaGVhZGVycy4uLgogKiAgICAgICAgICAgLy8gT3B0aW9uYWxseSB3cml0ZSB0byB0aGUgcmVxdWVzdCBvYmplY3QuLi4KICogICAgICAgICAgIC8vIFRoZW4gY2FsbCBjbG9zZS4KICogICAgICAgICAgIC4uLgogKiAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuY2xvc2UoKTsKICogICAgICAgICB9KQogKiAgICAgICAgIC50aGVuKChIdHRwQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UpIHsKICogICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHJlc3BvbnNlLgogKiAgICAgICAgICAgLi4uCiAqICAgICAgICAgfSk7CiAqCiAqIFRoZSBmdXR1cmUgZm9yIFtIdHRwQ2xpZW50UmVxdWVzdF0gaXMgY3JlYXRlZCBieSBtZXRob2RzIHN1Y2ggYXMKICogW2dldFVybF0gYW5kIFtvcGVuXS4KICoKICogIyMgSFRUUFMgY29ubmVjdGlvbnMKICoKICogQW4gSHR0cENsaWVudCBjYW4gbWFrZSBIVFRQUyByZXF1ZXN0cywgY29ubmVjdGluZyB0byBhIHNlcnZlciB1c2luZwogKiB0aGUgVExTIChTU0wpIHNlY3VyZSBuZXR3b3JraW5nIHByb3RvY29sLiBDYWxsaW5nIFtnZXRVcmxdIHdpdGggYW4KICogaHR0cHM6IHNjaGVtZSB3aWxsIHdvcmsgYXV0b21hdGljYWxseSwgaWYgdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlIGlzCiAqIHNpZ25lZCBieSBhIHJvb3QgQ0EgKGNlcnRpZmljYXRlIGF1dGhvcml0eSkgb24gdGhlIGRlZmF1bHQgbGlzdCBvZgogKiB3ZWxsLWtub3duIHRydXN0ZWQgQ0FzLCBjb21waWxlZCBieSBNb3ppbGxhLgogKgogKiBUbyBhZGQgYSBjdXN0b20gdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBhdXRob3JpdHksIG9yIHRvIHNlbmQgYSBjbGllbnQKICogY2VydGlmaWNhdGUgdG8gc2VydmVycyB0aGF0IHJlcXVlc3Qgb25lLCBwYXNzIGEgW1NlY3VyaXR5Q29udGV4dF0gb2JqZWN0CiAqIGFzIHRoZSBvcHRpb25hbCBgY29udGV4dGAgYXJndW1lbnQgdG8gdGhlIGBIdHRwQ2xpZW50YCBjb25zdHJ1Y3Rvci4KICogVGhlIGRlc2lyZWQgc2VjdXJpdHkgb3B0aW9ucyBjYW4gYmUgc2V0IG9uIHRoZSBbU2VjdXJpdHlDb250ZXh0XSBvYmplY3QuCiAqCiAqICMjIEhlYWRlcnMKICoKICogQWxsIEh0dHBDbGllbnQgcmVxdWVzdHMgc2V0IHRoZSBmb2xsb3dpbmcgaGVhZGVyIGJ5IGRlZmF1bHQ6CiAqCiAqICAgICBBY2NlcHQtRW5jb2Rpbmc6IGd6aXAKICoKICogVGhpcyBhbGxvd3MgdGhlIEhUVFAgc2VydmVyIHRvIHVzZSBnemlwIGNvbXByZXNzaW9uIGZvciB0aGUgYm9keSBpZgogKiBwb3NzaWJsZS4gSWYgdGhpcyBiZWhhdmlvciBpcyBub3QgZGVzaXJlZCBzZXQgdGhlCiAqIGBBY2NlcHQtRW5jb2RpbmdgIGhlYWRlciB0byBzb21ldGhpbmcgZWxzZS4KICogVG8gdHVybiBvZmYgZ3ppcCBjb21wcmVzc2lvbiBvZiB0aGUgcmVzcG9uc2UsIGNsZWFyIHRoaXMgaGVhZGVyOgogKgogKiAgICAgIHJlcXVlc3QuaGVhZGVycy5yZW1vdmVBbGwoSHR0cEhlYWRlcnMuYWNjZXB0RW5jb2RpbmdIZWFkZXIpCiAqCiAqICMjIENsb3NpbmcgdGhlIEh0dHBDbGllbnQKICoKICogVGhlIEh0dHBDbGllbnQgc3VwcG9ydHMgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBhbmQgY2FjaGVzIG5ldHdvcmsKICogY29ubmVjdGlvbnMgdG8gcmV1c2UgdGhlbSBmb3IgbXVsdGlwbGUgcmVxdWVzdHMgd2hlbmV2ZXIKICogcG9zc2libGUuIFRoaXMgbWVhbnMgdGhhdCBuZXR3b3JrIGNvbm5lY3Rpb25zIGNhbiBiZSBrZXB0IG9wZW4gZm9yCiAqIHNvbWUgdGltZSBhZnRlciBhIHJlcXVlc3QgaGFzIGNvbXBsZXRlZC4gVXNlIEh0dHBDbGllbnQuY2xvc2UKICogdG8gZm9yY2UgdGhlIEh0dHBDbGllbnQgb2JqZWN0IHRvIHNodXQgZG93biBhbmQgdG8gY2xvc2UgdGhlIGlkbGUKICogbmV0d29yayBjb25uZWN0aW9ucy4KICoKICogIyMgVHVybmluZyBwcm94aWVzIG9uIGFuZCBvZmYKICoKICogQnkgZGVmYXVsdCB0aGUgSHR0cENsaWVudCB1c2VzIHRoZSBwcm94eSBjb25maWd1cmF0aW9uIGF2YWlsYWJsZQogKiBmcm9tIHRoZSBlbnZpcm9ubWVudCwgc2VlIFtmaW5kUHJveHlGcm9tRW52aXJvbm1lbnRdLiBUbyB0dXJuIG9mZgogKiB0aGUgdXNlIG9mIHByb3hpZXMgc2V0IHRoZSBbZmluZFByb3h5XSBwcm9wZXJ0eSB0bwogKiBbOm51bGw6XS4KICoKICogICAgIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKICogICAgIGNsaWVudC5maW5kUHJveHkgPSBudWxsOwogKi8KYWJzdHJhY3QgY2xhc3MgSHR0cENsaWVudCB7CiAgc3RhdGljIGNvbnN0IGludCBkZWZhdWx0SHR0cFBvcnQgPSA4MDsKICBARGVwcmVjYXRlZCgiVXNlIGRlZmF1bHRIdHRwUG9ydCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfSFRUUF9QT1JUID0gZGVmYXVsdEh0dHBQb3J0OwoKICBzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRIdHRwc1BvcnQgPSA0NDM7CiAgQERlcHJlY2F0ZWQoIlVzZSBkZWZhdWx0SHR0cHNQb3J0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9IVFRQU19QT1JUID0gZGVmYXVsdEh0dHBzUG9ydDsKCiAgLy8vIEdldHMgYW5kIHNldHMgdGhlIGlkbGUgdGltZW91dCBvZiBub24tYWN0aXZlIHBlcnNpc3RlbnQgKGtlZXAtYWxpdmUpCiAgLy8vIGNvbm5lY3Rpb25zLgogIC8vLwogIC8vLyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBzZWNvbmRzLgogIER1cmF0aW9uIGlkbGVUaW1lb3V0OwoKICAvLy8gR2V0cyBhbmQgc2V0cyB0aGUgY29ubmVjdGlvbiB0aW1lb3V0LgogIC8vLwogIC8vLyBXaGVuIGNvbm5lY3RpbmcgdG8gYSBuZXcgaG9zdCBleGNlZWRzIHRoaXMgdGltZW91dCwgYSBbU29ja2V0RXhjZXB0aW9uXQogIC8vLyBpcyB0aHJvd24uIFRoZSB0aW1lb3V0IGFwcGxpZXMgb25seSB0byBjb25uZWN0aW9ucyBpbml0aWF0ZWQgYWZ0ZXIgdGhlCiAgLy8vIHRpbWVvdXQgaXMgc2V0LgogIC8vLwogIC8vLyBXaGVuIHRoaXMgaXMgYG51bGxgLCB0aGUgT1MgZGVmYXVsdCB0aW1lb3V0IGlzIHVzZWQuIFRoZSBkZWZhdWx0IGlzCiAgLy8vIGBudWxsYC4KICBEdXJhdGlvbiBjb25uZWN0aW9uVGltZW91dDsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGl2ZSBjb25uZWN0aW9ucywgdG8gYSBzaW5nbGUgaG9zdC4KICAgKgogICAqIEluY3JlYXNpbmcgdGhpcyBudW1iZXIgbWF5IGxvd2VyIHBlcmZvcm1hbmNlIGFuZCB0YWtlIHVwIHVud2FudGVkCiAgICogc3lzdGVtIHJlc291cmNlcy4KICAgKgogICAqIFRvIGRpc2FibGUsIHNldCB0byBgbnVsbGAuCiAgICoKICAgKiBEZWZhdWx0IGlzIGBudWxsYC4KICAgKi8KICBpbnQgbWF4Q29ubmVjdGlvbnNQZXJIb3N0OwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHdoZXRoZXIgdGhlIGJvZHkgb2YgYSByZXNwb25zZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKICAgKiB1bmNvbXByZXNzZWQuCiAgICoKICAgKiBUaGUgYm9keSBvZiBhbiBIVFRQIHJlc3BvbnNlIGNhbiBiZSBjb21wcmVzc2VkLiBJbiBtb3N0CiAgICogc2l0dWF0aW9ucyBwcm92aWRpbmcgdGhlIHVuLWNvbXByZXNzZWQgYm9keSBpcyBtb3N0CiAgICogY29udmVuaWVudC4gVGhlcmVmb3JlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHVuLWNvbXByZXNzIHRoZQogICAqIGJvZHkuIEhvd2V2ZXIgaW4gc29tZSBzaXR1YXRpb25zIChlLmcuIGltcGxlbWVudGluZyBhIHRyYW5zcGFyZW50CiAgICogcHJveHkpIGtlZXBpbmcgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0gaXMgcmVxdWlyZWQuCiAgICoKICAgKiBOT1RFOiBIZWFkZXJzIGluIHRoZSByZXNwb25zZSBhcmUgbmV2ZXIgbW9kaWZpZWQuIFRoaXMgbWVhbnMKICAgKiB0aGF0IHdoZW4gYXV0b21hdGljIHVuLWNvbXByZXNzaW9uIGlzIHR1cm5lZCBvbiB0aGUgdmFsdWUgb2YgdGhlCiAgICogaGVhZGVyIGBDb250ZW50LUxlbmd0aGAgd2lsbCByZWZsZWN0IHRoZSBsZW5ndGggb2YgdGhlIG9yaWdpbmFsCiAgICogY29tcHJlc3NlZCBib2R5LiBMaWtld2lzZSB0aGUgaGVhZGVyIGBDb250ZW50LUVuY29kaW5nYCB3aWxsIGFsc28KICAgKiBoYXZlIHRoZSBvcmlnaW5hbCB2YWx1ZSBpbmRpY2F0aW5nIGNvbXByZXNzaW9uLgogICAqCiAgICogTk9URTogQXV0b21hdGljIHVuLWNvbXByZXNzaW9uIGlzIG9ubHkgcGVyZm9ybWVkIGlmIHRoZQogICAqIGBDb250ZW50LUVuY29kaW5nYCBoZWFkZXIgdmFsdWUgaXMgYGd6aXBgLgogICAqCiAgICogVGhpcyB2YWx1ZSBhZmZlY3RzIGFsbCByZXNwb25zZXMgcHJvZHVjZWQgYnkgdGhpcyBjbGllbnQgYWZ0ZXIgdGhlCiAgICogdmFsdWUgaXMgY2hhbmdlZC4KICAgKgogICAqIFRvIGRpc2FibGUsIHNldCB0byBgZmFsc2VgLgogICAqCiAgICogRGVmYXVsdCBpcyBgdHJ1ZWAuCiAgICovCiAgYm9vbCBhdXRvVW5jb21wcmVzczsKCiAgLy8vIEdldHMgYW5kIHNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGBVc2VyLUFnZW50YCBoZWFkZXIgZm9yIGFsbCByZXF1ZXN0cwogIC8vLyBnZW5lcmF0ZWQgYnkgdGhpcyBbSHR0cENsaWVudF0uCiAgLy8vCiAgLy8vIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBEYXJ0Lzx2ZXJzaW9uPiAoZGFydDppbylgLgogIC8vLwogIC8vLyBJZiB0aGUgdXNlckFnZW50IGlzIHNldCB0byBgbnVsbGAsIG5vIGRlZmF1bHQgYFVzZXItQWdlbnRgIGhlYWRlciB3aWxsIGJlCiAgLy8vIGFkZGVkIHRvIGVhY2ggcmVxdWVzdC4KICBTdHJpbmcgdXNlckFnZW50OwoKICBmYWN0b3J5IEh0dHBDbGllbnQoe1NlY3VyaXR5Q29udGV4dCBjb250ZXh0fSkgewogICAgSHR0cE92ZXJyaWRlcyBvdmVycmlkZXMgPSBIdHRwT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBfSHR0cENsaWVudChjb250ZXh0KTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuY3JlYXRlSHR0cENsaWVudChjb250ZXh0KTsKICB9CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uLgogICAqCiAgICogVGhlIEhUVFAgbWV0aG9kIHRvIHVzZSBpcyBzcGVjaWZpZWQgaW4gW21ldGhvZF0sIHRoZSBzZXJ2ZXIgaXMKICAgKiBzcGVjaWZpZWQgdXNpbmcgW2hvc3RdIGFuZCBbcG9ydF0sIGFuZCB0aGUgcGF0aCAoaW5jbHVkaW5nCiAgICogYSBwb3NzaWJsZSBxdWVyeSkgaXMgc3BlY2lmaWVkIHVzaW5nIFtwYXRoXS4KICAgKiBUaGUgcGF0aCBtYXkgYWxzbyBjb250YWluIGEgVVJJIGZyYWdtZW50LCB3aGljaCB3aWxsIGJlIGlnbm9yZWQuCiAgICoKICAgKiBUaGUgYEhvc3RgIGhlYWRlciBmb3IgdGhlIHJlcXVlc3Qgd2lsbCBiZSBzZXQgdG8gdGhlIHZhbHVlIFtob3N0XTpbcG9ydF0KICAgKiAoaWYgW2hvc3RdIGlzIGFuIElQIGFkZHJlc3MsIGl0IHdpbGwgc3RpbGwgYmUgdXNlZCBpbiB0aGUgYEhvc3RgIGhlYWRlcikuCiAgICogVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB0aHJvdWdoIHRoZSBbSHR0cENsaWVudFJlcXVlc3RdIGludGVyZmFjZSBiZWZvcmUKICAgKiB0aGUgcmVxdWVzdCBpcyBzZW50LgogICAqCiAgICogRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlIHNlcXVlbmNlIG9mIGV2ZW50cyBkdXJpbmcgYW4KICAgKiBIVFRQIHRyYW5zYWN0aW9uLCBhbmQgdGhlIG9iamVjdHMgcmV0dXJuZWQgYnkgdGhlIGZ1dHVyZXMsIHNlZQogICAqIHRoZSBvdmVyYWxsIGRvY3VtZW50YXRpb24gZm9yIHRoZSBjbGFzcyBbSHR0cENsaWVudF0uCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBvcGVuKAogICAgICBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKTsKCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24uCiAgICoKICAgKiBUaGUgSFRUUCBtZXRob2QgaXMgc3BlY2lmaWVkIGluIFttZXRob2RdIGFuZCB0aGUgVVJMIHRvIHVzZSBpbgogICAqIFt1cmxdLgogICAqCiAgICogVGhlIGBIb3N0YCBoZWFkZXIgZm9yIHRoZSByZXF1ZXN0IHdpbGwgYmUgc2V0IHRvIHRoZSB2YWx1ZQogICAqIFtVcmkuaG9zdF06W1VyaS5wb3J0XSBmcm9tIFt1cmxdIChpZiBbdXJsLmhvc3RdIGlzIGFuIElQIGFkZHJlc3MsIGl0IHdpbGwKICAgKiBzdGlsbCBiZSB1c2VkIGluIHRoZSBgSG9zdGAgaGVhZGVyKS4gVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB0aHJvdWdoIHRoZQogICAqIFtIdHRwQ2xpZW50UmVxdWVzdF0gaW50ZXJmYWNlIGJlZm9yZSB0aGUgcmVxdWVzdCBpcyBzZW50LgogICAqCiAgICogRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlIHNlcXVlbmNlIG9mIGV2ZW50cyBkdXJpbmcgYW4KICAgKiBIVFRQIHRyYW5zYWN0aW9uLCBhbmQgdGhlIG9iamVjdHMgcmV0dXJuZWQgYnkgdGhlIGZ1dHVyZXMsIHNlZQogICAqIHRoZSBvdmVyYWxsIGRvY3VtZW50YXRpb24gZm9yIHRoZSBjbGFzcyBbSHR0cENsaWVudF0uCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBvcGVuVXJsKFN0cmluZyBtZXRob2QsIFVyaSB1cmwpOwoKICAvKioKICAgKiBPcGVucyBhIEhUVFAgY29ubmVjdGlvbiB1c2luZyB0aGUgR0VUIG1ldGhvZC4KICAgKgogICAqIFRoZSBzZXJ2ZXIgaXMgc3BlY2lmaWVkIHVzaW5nIFtob3N0XSBhbmQgW3BvcnRdLCBhbmQgdGhlIHBhdGgKICAgKiAoaW5jbHVkaW5nIGEgcG9zc2libGUgcXVlcnkpIGlzIHNwZWNpZmllZCB1c2luZwogICAqIFtwYXRoXS4KICAgKgogICAqIFNlZSBbb3Blbl0gZm9yIGRldGFpbHMuCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBnZXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcGF0aCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBHRVQgbWV0aG9kLgogICAqCiAgICogVGhlIFVSTCB0byB1c2UgaXMgc3BlY2lmaWVkIGluIFt1cmxdLgogICAqCiAgICogU2VlIFtvcGVuVXJsXSBmb3IgZGV0YWlscy4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IGdldFVybChVcmkgdXJsKTsKCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24gdXNpbmcgdGhlIFBPU1QgbWV0aG9kLgogICAqCiAgICogVGhlIHNlcnZlciBpcyBzcGVjaWZpZWQgdXNpbmcgW2hvc3RdIGFuZCBbcG9ydF0sIGFuZCB0aGUgcGF0aAogICAqIChpbmNsdWRpbmcgYSBwb3NzaWJsZSBxdWVyeSkgaXMgc3BlY2lmaWVkIHVzaW5nCiAgICogW3BhdGhdLgogICAqCiAgICogU2VlIFtvcGVuXSBmb3IgZGV0YWlscy4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IHBvc3QoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcGF0aCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBQT1NUIG1ldGhvZC4KICAgKgogICAqIFRoZSBVUkwgdG8gdXNlIGlzIHNwZWNpZmllZCBpbiBbdXJsXS4KICAgKgogICAqIFNlZSBbb3BlblVybF0gZm9yIGRldGFpbHMuCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwb3N0VXJsKFVyaSB1cmwpOwoKICAvKioKICAgKiBPcGVucyBhIEhUVFAgY29ubmVjdGlvbiB1c2luZyB0aGUgUFVUIG1ldGhvZC4KICAgKgogICAqIFRoZSBzZXJ2ZXIgaXMgc3BlY2lmaWVkIHVzaW5nIFtob3N0XSBhbmQgW3BvcnRdLCBhbmQgdGhlIHBhdGgKICAgKiAoaW5jbHVkaW5nIGEgcG9zc2libGUgcXVlcnkpIGlzIHNwZWNpZmllZCB1c2luZyBbcGF0aF0uCiAgICoKICAgKiBTZWUgW29wZW5dIGZvciBkZXRhaWxzLgogICAqLwogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gcHV0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHBhdGgpOwoKICAvKioKICAgKiBPcGVucyBhIEhUVFAgY29ubmVjdGlvbiB1c2luZyB0aGUgUFVUIG1ldGhvZC4KICAgKgogICAqIFRoZSBVUkwgdG8gdXNlIGlzIHNwZWNpZmllZCBpbiBbdXJsXS4KICAgKgogICAqIFNlZSBbb3BlblVybF0gZm9yIGRldGFpbHMuCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwdXRVcmwoVXJpIHVybCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBERUxFVEUgbWV0aG9kLgogICAqCiAgICogVGhlIHNlcnZlciBpcyBzcGVjaWZpZWQgdXNpbmcgW2hvc3RdIGFuZCBbcG9ydF0sIGFuZCB0aGUgcGF0aAogICAqIChpbmNsdWRpbmcgYSBwb3NzaWJsZSBxdWVyeSkgaXMgc3BlY2lmaWVkIHVzaW5nIFtwYXRoXS4KICAgKgogICAqIFNlZSBbb3Blbl0gZm9yIGRldGFpbHMuCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBkZWxldGUoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcGF0aCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBERUxFVEUgbWV0aG9kLgogICAqCiAgICogVGhlIFVSTCB0byB1c2UgaXMgc3BlY2lmaWVkIGluIFt1cmxdLgogICAqCiAgICogU2VlIFtvcGVuVXJsXSBmb3IgZGV0YWlscy4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IGRlbGV0ZVVybChVcmkgdXJsKTsKCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24gdXNpbmcgdGhlIFBBVENIIG1ldGhvZC4KICAgKgogICAqIFRoZSBzZXJ2ZXIgaXMgc3BlY2lmaWVkIHVzaW5nIFtob3N0XSBhbmQgW3BvcnRdLCBhbmQgdGhlIHBhdGgKICAgKiAoaW5jbHVkaW5nIGEgcG9zc2libGUgcXVlcnkpIGlzIHNwZWNpZmllZCB1c2luZyBbcGF0aF0uCiAgICoKICAgKiBTZWUgW29wZW5dIGZvciBkZXRhaWxzLgogICAqLwogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gcGF0Y2goU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcGF0aCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBQQVRDSCBtZXRob2QuCiAgICoKICAgKiBUaGUgVVJMIHRvIHVzZSBpcyBzcGVjaWZpZWQgaW4gW3VybF0uCiAgICoKICAgKiBTZWUgW29wZW5VcmxdIGZvciBkZXRhaWxzLgogICAqLwogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gcGF0Y2hVcmwoVXJpIHVybCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBIRUFEIG1ldGhvZC4KICAgKgogICAqIFRoZSBzZXJ2ZXIgaXMgc3BlY2lmaWVkIHVzaW5nIFtob3N0XSBhbmQgW3BvcnRdLCBhbmQgdGhlIHBhdGgKICAgKiAoaW5jbHVkaW5nIGEgcG9zc2libGUgcXVlcnkpIGlzIHNwZWNpZmllZCB1c2luZyBbcGF0aF0uCiAgICoKICAgKiBTZWUgW29wZW5dIGZvciBkZXRhaWxzLgogICAqLwogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gaGVhZChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKTsKCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24gdXNpbmcgdGhlIEhFQUQgbWV0aG9kLgogICAqCiAgICogVGhlIFVSTCB0byB1c2UgaXMgc3BlY2lmaWVkIGluIFt1cmxdLgogICAqCiAgICogU2VlIFtvcGVuVXJsXSBmb3IgZGV0YWlscy4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IGhlYWRVcmwoVXJpIHVybCk7CgogIC8qKgogICAqIFNldHMgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGEgc2l0ZSBpcyByZXF1ZXN0aW5nCiAgICogYXV0aGVudGljYXRpb24uIFRoZSBVUkwgcmVxdWVzdGVkIGFuZCB0aGUgc2VjdXJpdHkgcmVhbG0gZnJvbSB0aGUKICAgKiBzZXJ2ZXIgYXJlIHBhc3NlZCBpbiB0aGUgYXJndW1lbnRzIFt1cmxdIGFuZCBbcmVhbG1dLgogICAqCiAgICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBbRnV0dXJlXSB3aGljaCBzaG91bGQgY29tcGxldGUgd2hlbiB0aGUKICAgKiBhdXRoZW50aWNhdGlvbiBoYXMgYmVlbiByZXNvbHZlZC4gSWYgY3JlZGVudGlhbHMgY2Fubm90IGJlCiAgICogcHJvdmlkZWQgdGhlIFtGdXR1cmVdIHNob3VsZCBjb21wbGV0ZSB3aXRoIFs6ZmFsc2U6XS4gSWYKICAgKiBjcmVkZW50aWFscyBhcmUgYXZhaWxhYmxlIHRoZSBmdW5jdGlvbiBzaG91bGQgYWRkIHRoZXNlIHVzaW5nCiAgICogW2FkZENyZWRlbnRpYWxzXSBiZWZvcmUgY29tcGxldGluZyB0aGUgW0Z1dHVyZV0gd2l0aCB0aGUgdmFsdWUKICAgKiBbOnRydWU6XS4KICAgKgogICAqIElmIHRoZSBbRnV0dXJlXSBjb21wbGV0ZXMgd2l0aCBbOnRydWU6XSB0aGUgcmVxdWVzdCB3aWxsIGJlIHJldHJpZWQKICAgKiB1c2luZyB0aGUgdXBkYXRlZCBjcmVkZW50aWFscywgaG93ZXZlciwgdGhlIHJldHJpZWQgcmVxdWVzdCB3aWxsIG5vdAogICAqIGNhcnJ5IHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBheWxvYWQuIE90aGVyd2lzZSByZXNwb25zZSBwcm9jZXNzaW5nIHdpbGwKICAgKiBjb250aW51ZSBub3JtYWxseS4KICAgKgogICAqIElmIGl0IGlzIGtub3duIHRoYXQgdGhlIHJlbW90ZSBzZXJ2ZXIgcmVxdWlyZXMgYXV0aGVudGljYXRpb24gZm9yIGFsbAogICAqIHJlcXVlc3RzLCBpdCBpcyBhZHZpc2FibGUgdG8gdXNlIFthZGRDcmVkZW50aWFsc10gZGlyZWN0bHksIG9yIG1hbnVhbGx5CiAgICogc2V0IHRoZSBgJ2F1dGhvcml6YXRpb24nYCBoZWFkZXIgb24gdGhlIHJlcXVlc3QgdG8gYXZvaWQgdGhlIG92ZXJoZWFkCiAgICogb2YgYSBmYWlsZWQgcmVxdWVzdCwgb3IgaXNzdWVzIGR1ZSB0byBtaXNzaW5nIHJlcXVlc3QgcGF5bG9hZCBvbiByZXRyaWVkCiAgICogcmVxdWVzdC4KICAgKi8KICBzZXQgYXV0aGVudGljYXRlKEZ1dHVyZTxib29sPiBmKFVyaSB1cmwsIFN0cmluZyBzY2hlbWUsIFN0cmluZyByZWFsbSkpOwoKICAvKioKICAgKiBBZGQgY3JlZGVudGlhbHMgdG8gYmUgdXNlZCBmb3IgYXV0aG9yaXppbmcgSFRUUCByZXF1ZXN0cy4KICAgKi8KICB2b2lkIGFkZENyZWRlbnRpYWxzKFVyaSB1cmwsIFN0cmluZyByZWFsbSwgSHR0cENsaWVudENyZWRlbnRpYWxzIGNyZWRlbnRpYWxzKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZnVuY3Rpb24gdXNlZCB0byByZXNvbHZlIHRoZSBwcm94eSBzZXJ2ZXIgdG8gYmUgdXNlZCBmb3IKICAgKiBvcGVuaW5nIGEgSFRUUCBjb25uZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgW3VybF0uIElmIHRoaXMKICAgKiBmdW5jdGlvbiBpcyBub3Qgc2V0LCBkaXJlY3QgY29ubmVjdGlvbnMgd2lsbCBhbHdheXMgYmUgdXNlZC4KICAgKgogICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgW2ZdIG11c3QgYmUgaW4gdGhlIGZvcm1hdCB1c2VkIGJ5IGJyb3dzZXIKICAgKiBQQUMgKHByb3h5IGF1dG8tY29uZmlnKSBzY3JpcHRzLiBUaGF0IGlzIGVpdGhlcgogICAqCiAgICogICAgICJESVJFQ1QiCiAgICoKICAgKiBmb3IgdXNpbmcgYSBkaXJlY3QgY29ubmVjdGlvbiBvcgogICAqCiAgICogICAgICJQUk9YWSBob3N0OnBvcnQiCiAgICoKICAgKiBmb3IgdXNpbmcgdGhlIHByb3h5IHNlcnZlciBbOmhvc3Q6XSBvbiBwb3J0IFs6cG9ydDpdLgogICAqCiAgICogQSBjb25maWd1cmF0aW9uIGNhbiBjb250YWluIHNldmVyYWwgY29uZmlndXJhdGlvbiBlbGVtZW50cwogICAqIHNlcGFyYXRlZCBieSBzZW1pY29sb25zLCBlLmcuCiAgICoKICAgKiAgICAgIlBST1hZIGhvc3Q6cG9ydDsgUFJPWFkgaG9zdDI6cG9ydDI7IERJUkVDVCIKICAgKgogICAqIFRoZSBzdGF0aWMgZnVuY3Rpb24gW2ZpbmRQcm94eUZyb21FbnZpcm9ubWVudF0gb24gdGhpcyBjbGFzcyBjYW4KICAgKiBiZSB1c2VkIHRvIGltcGxlbWVudCBwcm94eSBzZXJ2ZXIgcmVzb2x2aW5nIGJhc2VkIG9uIGVudmlyb25tZW50CiAgICogdmFyaWFibGVzLgogICAqLwogIHNldCBmaW5kUHJveHkoU3RyaW5nIGYoVXJpIHVybCkpOwoKICAvKioKICAgKiBGdW5jdGlvbiBmb3IgcmVzb2x2aW5nIHRoZSBwcm94eSBzZXJ2ZXIgdG8gYmUgdXNlZCBmb3IgYSBIVFRQCiAgICogY29ubmVjdGlvbiBmcm9tIHRoZSBwcm94eSBjb25maWd1cmF0aW9uIHNwZWNpZmllZCB0aHJvdWdoCiAgICogZW52aXJvbm1lbnQgdmFyaWFibGVzLgogICAqCiAgICogVGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHRha2VuIGludG8gYWNjb3VudDoKICAgKgogICAqICAgICBodHRwX3Byb3h5CiAgICogICAgIGh0dHBzX3Byb3h5CiAgICogICAgIG5vX3Byb3h5CiAgICogICAgIEhUVFBfUFJPWFkKICAgKiAgICAgSFRUUFNfUFJPWFkKICAgKiAgICAgTk9fUFJPWFkKICAgKgogICAqIFs6aHR0cF9wcm94eTpdIGFuZCBbOkhUVFBfUFJPWFk6XSBzcGVjaWZ5IHRoZSBwcm94eSBzZXJ2ZXIgdG8gdXNlIGZvcgogICAqIGh0dHA6Ly8gdXJscy4gVXNlIHRoZSBmb3JtYXQgWzpob3N0bmFtZTpwb3J0Ol0uIElmIG5vIHBvcnQgaXMgdXNlZCBhCiAgICogZGVmYXVsdCBvZiAxMDgwIHdpbGwgYmUgdXNlZC4gSWYgYm90aCBhcmUgc2V0IHRoZSBsb3dlciBjYXNlIG9uZSB0YWtlcwogICAqIHByZWNlZGVuY2UuCiAgICoKICAgKiBbOmh0dHBzX3Byb3h5Ol0gYW5kIFs6SFRUUFNfUFJPWFk6XSBzcGVjaWZ5IHRoZSBwcm94eSBzZXJ2ZXIgdG8gdXNlIGZvcgogICAqIGh0dHBzOi8vIHVybHMuIFVzZSB0aGUgZm9ybWF0IFs6aG9zdG5hbWU6cG9ydDpdLiBJZiBubyBwb3J0IGlzIHVzZWQgYQogICAqIGRlZmF1bHQgb2YgMTA4MCB3aWxsIGJlIHVzZWQuIElmIGJvdGggYXJlIHNldCB0aGUgbG93ZXIgY2FzZSBvbmUgdGFrZXMKICAgKiBwcmVjZWRlbmNlLgogICAqCiAgICogWzpub19wcm94eTpdIGFuZCBbOk5PX1BST1hZOl0gc3BlY2lmeSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mCiAgICogcG9zdGZpeGVzIG9mIGhvc3RuYW1lcyBmb3Igd2hpY2ggbm90IHRvIHVzZSB0aGUgcHJveHkKICAgKiBzZXJ2ZXIuIEUuZy4gdGhlIHZhbHVlICJsb2NhbGhvc3QsMTI3LjAuMC4xIiB3aWxsIG1ha2UgcmVxdWVzdHMKICAgKiB0byBib3RoICJsb2NhbGhvc3QiIGFuZCAiMTI3LjAuMC4xIiBub3QgdXNlIGEgcHJveHkuIElmIGJvdGggYXJlIHNldAogICAqIHRoZSBsb3dlciBjYXNlIG9uZSB0YWtlcyBwcmVjZWRlbmNlLgogICAqCiAgICogVG8gYWN0aXZhdGUgdGhpcyB3YXkgb2YgcmVzb2x2aW5nIHByb3hpZXMgYXNzaWduIHRoaXMgZnVuY3Rpb24gdG8KICAgKiB0aGUgW2ZpbmRQcm94eV0gcHJvcGVydHkgb24gdGhlIFtIdHRwQ2xpZW50XS4KICAgKgogICAqICAgICBIdHRwQ2xpZW50IGNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7CiAgICogICAgIGNsaWVudC5maW5kUHJveHkgPSBIdHRwQ2xpZW50LmZpbmRQcm94eUZyb21FbnZpcm9ubWVudDsKICAgKgogICAqIElmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGUgc3lzdGVtIGVudmlyb25tZW50IHlvdSBjYW4gdXNlIGEKICAgKiBkaWZmZXJlbnQgb25lIGJ5IHdyYXBwaW5nIHRoZSBmdW5jdGlvbi4KICAgKgogICAqICAgICBIdHRwQ2xpZW50IGNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7CiAgICogICAgIGNsaWVudC5maW5kUHJveHkgPSAodXJsKSB7CiAgICogICAgICAgcmV0dXJuIEh0dHBDbGllbnQuZmluZFByb3h5RnJvbUVudmlyb25tZW50KAogICAqICAgICAgICAgICB1cmwsIGVudmlyb25tZW50OiB7Imh0dHBfcHJveHkiOiAuLi4sICJub19wcm94eSI6IC4uLn0pOwogICAqICAgICB9CiAgICoKICAgKiBJZiBhIHByb3h5IHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uIGl0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZQogICAqIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYXMgd2VsbC4gVXNlIHRoZSBmb3JtYXQKICAgKiBbOnVzZXJuYW1lOnBhc3N3b3JkQGhvc3RuYW1lOnBvcnQ6XSB0byBpbmNsdWRlIHRoZSB1c2VybmFtZSBhbmQKICAgKiBwYXNzd29yZC4gQWx0ZXJuYXRpdmVseSB0aGUgQVBJIFthZGRQcm94eUNyZWRlbnRpYWxzXSBjYW4gYmUgdXNlZAogICAqIHRvIHNldCBjcmVkZW50aWFscyBmb3IgcHJveGllcyB3aGljaCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLgogICAqLwogIHN0YXRpYyBTdHJpbmcgZmluZFByb3h5RnJvbUVudmlyb25tZW50KFVyaSB1cmwsCiAgICAgIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50fSkgewogICAgSHR0cE92ZXJyaWRlcyBvdmVycmlkZXMgPSBIdHRwT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9IdHRwQ2xpZW50Ll9maW5kUHJveHlGcm9tRW52aXJvbm1lbnQodXJsLCBlbnZpcm9ubWVudCk7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLmZpbmRQcm94eUZyb21FbnZpcm9ubWVudCh1cmwsIGVudmlyb25tZW50KTsKICB9CgogIC8qKgogICAqIFNldHMgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGEgcHJveHkgaXMgcmVxdWVzdGluZwogICAqIGF1dGhlbnRpY2F0aW9uLiBJbmZvcm1hdGlvbiBvbiB0aGUgcHJveHkgaW4gdXNlIGFuZCB0aGUgc2VjdXJpdHkKICAgKiByZWFsbSBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uIGFyZSBwYXNzZWQgaW4gdGhlIGFyZ3VtZW50cyBbaG9zdF0sCiAgICogW3BvcnRdIGFuZCBbcmVhbG1dLgogICAqCiAgICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBbRnV0dXJlXSB3aGljaCBzaG91bGQgY29tcGxldGUgd2hlbiB0aGUKICAgKiBhdXRoZW50aWNhdGlvbiBoYXMgYmVlbiByZXNvbHZlZC4gSWYgY3JlZGVudGlhbHMgY2Fubm90IGJlCiAgICogcHJvdmlkZWQgdGhlIFtGdXR1cmVdIHNob3VsZCBjb21wbGV0ZSB3aXRoIFs6ZmFsc2U6XS4gSWYKICAgKiBjcmVkZW50aWFscyBhcmUgYXZhaWxhYmxlIHRoZSBmdW5jdGlvbiBzaG91bGQgYWRkIHRoZXNlIHVzaW5nCiAgICogW2FkZFByb3h5Q3JlZGVudGlhbHNdIGJlZm9yZSBjb21wbGV0aW5nIHRoZSBbRnV0dXJlXSB3aXRoIHRoZSB2YWx1ZQogICAqIFs6dHJ1ZTpdLgogICAqCiAgICogSWYgdGhlIFtGdXR1cmVdIGNvbXBsZXRlcyB3aXRoIFs6dHJ1ZTpdIHRoZSByZXF1ZXN0IHdpbGwgYmUgcmV0cmllZAogICAqIHVzaW5nIHRoZSB1cGRhdGVkIGNyZWRlbnRpYWxzLiBPdGhlcndpc2UgcmVzcG9uc2UgcHJvY2Vzc2luZyB3aWxsCiAgICogY29udGludWUgbm9ybWFsbHkuCiAgICovCiAgc2V0IGF1dGhlbnRpY2F0ZVByb3h5KAogICAgICBGdXR1cmU8Ym9vbD4gZihTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBzY2hlbWUsIFN0cmluZyByZWFsbSkpOwoKICAvKioKICAgKiBBZGQgY3JlZGVudGlhbHMgdG8gYmUgdXNlZCBmb3IgYXV0aG9yaXppbmcgSFRUUCBwcm94aWVzLgogICAqLwogIHZvaWQgYWRkUHJveHlDcmVkZW50aWFscygKICAgICAgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcmVhbG0sIEh0dHBDbGllbnRDcmVkZW50aWFscyBjcmVkZW50aWFscyk7CgogIC8qKgogICAqIFNldHMgYSBjYWxsYmFjayB0aGF0IHdpbGwgZGVjaWRlIHdoZXRoZXIgdG8gYWNjZXB0IGEgc2VjdXJlIGNvbm5lY3Rpb24KICAgKiB3aXRoIGEgc2VydmVyIGNlcnRpZmljYXRlIHRoYXQgY2Fubm90IGJlIGF1dGhlbnRpY2F0ZWQgYnkgYW55IG9mIG91cgogICAqIHRydXN0ZWQgcm9vdCBjZXJ0aWZpY2F0ZXMuCiAgICoKICAgKiBXaGVuIGFuIHNlY3VyZSBIVFRQIHJlcXVlc3QgaWYgbWFkZSwgdXNpbmcgdGhpcyBIdHRwQ2xpZW50LCBhbmQgdGhlCiAgICogc2VydmVyIHJldHVybnMgYSBzZXJ2ZXIgY2VydGlmaWNhdGUgdGhhdCBjYW5ub3QgYmUgYXV0aGVudGljYXRlZCwgdGhlCiAgICogY2FsbGJhY2sgaXMgY2FsbGVkIGFzeW5jaHJvbm91c2x5IHdpdGggdGhlIFtYNTA5Q2VydGlmaWNhdGVdIG9iamVjdCBhbmQKICAgKiB0aGUgc2VydmVyJ3MgaG9zdG5hbWUgYW5kIHBvcnQuICBJZiB0aGUgdmFsdWUgb2YgW2JhZENlcnRpZmljYXRlQ2FsbGJhY2tdCiAgICogaXMgWzpudWxsOl0sIHRoZSBiYWQgY2VydGlmaWNhdGUgaXMgcmVqZWN0ZWQsIGFzIGlmIHRoZSBjYWxsYmFjawogICAqIHJldHVybmVkIFs6ZmFsc2U6XQogICAqCiAgICogSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSwgdGhlIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjY2VwdGVkIGFuZCB0aGUKICAgKiBbOkZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD46XSB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIG1ha2luZyB0aGUKICAgKiByZXF1ZXN0IGNvbXBsZXRlcyB3aXRoIGEgdmFsaWQgSHR0cFJlcXVlc3Qgb2JqZWN0LiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucwogICAqIGZhbHNlLCB0aGUgWzpGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+Ol0gY29tcGxldGVzIHdpdGggYW4gZXhjZXB0aW9uLgogICAqCiAgICogSWYgYSBiYWQgY2VydGlmaWNhdGUgaXMgcmVjZWl2ZWQgb24gYSBjb25uZWN0aW9uIGF0dGVtcHQsIHRoZSBsaWJyYXJ5IGNhbGxzCiAgICogdGhlIGZ1bmN0aW9uIHRoYXQgd2FzIHRoZSB2YWx1ZSBvZiBiYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrIGF0IHRoZSB0aW1lCiAgICogdGhlIHJlcXVlc3QgaXMgbWFkZSwgZXZlbiBpZiB0aGUgdmFsdWUgb2YgYmFkQ2VydGlmaWNhdGVDYWxsYmFjawogICAqIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZW4uCiAgICovCiAgc2V0IGJhZENlcnRpZmljYXRlQ2FsbGJhY2soCiAgICAgIGJvb2wgY2FsbGJhY2soWDUwOUNlcnRpZmljYXRlIGNlcnQsIFN0cmluZyBob3N0LCBpbnQgcG9ydCkpOwoKICAvLy8gU2h1dHMgZG93biB0aGUgSFRUUCBjbGllbnQuCiAgLy8vCiAgLy8vIElmIFtmb3JjZV0gaXMgYGZhbHNlYCAodGhlIGRlZmF1bHQpIHRoZSBbSHR0cENsaWVudF0gd2lsbCBiZSBrZXB0IGFsaXZlCiAgLy8vIHVudGlsIGFsbCBhY3RpdmUgY29ubmVjdGlvbnMgYXJlIGRvbmUuIElmIFtmb3JjZV0gaXMgYHRydWVgIGFueSBhY3RpdmUKICAvLy8gY29ubmVjdGlvbnMgd2lsbCBiZSBjbG9zZWQgdG8gaW1tZWRpYXRlbHkgcmVsZWFzZSBhbGwgcmVzb3VyY2VzLiBUaGVzZQogIC8vLyBjbG9zZWQgY29ubmVjdGlvbnMgd2lsbCByZWNlaXZlIGFuIGVycm9yIGV2ZW50IHRvIGluZGljYXRlIHRoYXQgdGhlIGNsaWVudAogIC8vLyB3YXMgc2h1dCBkb3duLiBJbiBib3RoIGNhc2VzIHRyeWluZyB0byBlc3RhYmxpc2ggYSBuZXcgY29ubmVjdGlvbiBhZnRlcgogIC8vLyBjYWxsaW5nIFtjbG9zZV0gd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCiAgdm9pZCBjbG9zZSh7Ym9vbCBmb3JjZTogZmFsc2V9KTsKfQoKLyoqCiAqIEhUVFAgcmVxdWVzdCBmb3IgYSBjbGllbnQgY29ubmVjdGlvbi4KICoKICogVG8gc2V0IHVwIGEgcmVxdWVzdCwgc2V0IHRoZSBoZWFkZXJzIHVzaW5nIHRoZSBoZWFkZXJzIHByb3BlcnR5CiAqIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MgYW5kIHdyaXRlIHRoZSBkYXRhIHRvIHRoZSBib2R5IG9mIHRoZSByZXF1ZXN0LgogKiBIdHRwQ2xpZW50UmVxdWVzdCBpcyBhbiBbSU9TaW5rXS4gVXNlIHRoZSBtZXRob2RzIGZyb20gSU9TaW5rLAogKiBzdWNoIGFzIHdyaXRlQ2hhckNvZGUoKSwgdG8gd3JpdGUgdGhlIGJvZHkgb2YgdGhlIEhUVFAKICogcmVxdWVzdC4gV2hlbiBvbmUgb2YgdGhlIElPU2luayBtZXRob2RzIGlzIHVzZWQgZm9yIHRoZSBmaXJzdAogKiB0aW1lLCB0aGUgcmVxdWVzdCBoZWFkZXIgaXMgc2VudC4gQ2FsbGluZyBhbnkgbWV0aG9kcyB0aGF0CiAqIGNoYW5nZSB0aGUgaGVhZGVyIGFmdGVyIGl0IGlzIHNlbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KICoKICogV2hlbiB3cml0aW5nIHN0cmluZyBkYXRhIHRocm91Z2ggdGhlIFtJT1NpbmtdIHRoZQogKiBlbmNvZGluZyB1c2VkIGlzIGRldGVybWluZWQgZnJvbSB0aGUgImNoYXJzZXQiIHBhcmFtZXRlciBvZgogKiB0aGUgIkNvbnRlbnQtVHlwZSIgaGVhZGVyLgogKgogKiAgICAgSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCA9IC4uLgogKiAgICAgcmVxdWVzdC5oZWFkZXJzLmNvbnRlbnRUeXBlCiAqICAgICAgICAgPSBuZXcgQ29udGVudFR5cGUoImFwcGxpY2F0aW9uIiwgImpzb24iLCBjaGFyc2V0OiAidXRmLTgiKTsKICogICAgIHJlcXVlc3Qud3JpdGUoLi4uKTsgIC8vIFN0cmluZ3Mgd3JpdHRlbiB3aWxsIGJlIFVURi04IGVuY29kZWQuCiAqCiAqIElmIG5vIGNoYXJzZXQgaXMgcHJvdmlkZWQgdGhlIGRlZmF1bHQgb2YgSVNPLTg4NTktMSAoTGF0aW4gMSkgaXMKICogYmUgdXNlZC4KICoKICogICAgIEh0dHBDbGllbnRSZXF1ZXN0IHJlcXVlc3QgPSAuLi4KICogICAgIHJlcXVlc3QuaGVhZGVycy5hZGQoSHR0cEhlYWRlcnMuY29udGVudFR5cGVIZWFkZXIsICJ0ZXh0L3BsYWluIik7CiAqICAgICByZXF1ZXN0LndyaXRlKC4uLik7ICAvLyBTdHJpbmdzIHdyaXR0ZW4gd2lsbCBiZSBJU08tODg1OS0xIGVuY29kZWQuCiAqCiAqIEFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgeW91IHVzZSBhbiB1bnN1cHBvcnRlZCBlbmNvZGluZyBhbmQgdGhlCiAqIGB3cml0ZSgpYCBtZXRob2QgYmVpbmcgdXNlZCB0YWtlcyBhIHN0cmluZyBwYXJhbWV0ZXIuCiAqLwphYnN0cmFjdCBjbGFzcyBIdHRwQ2xpZW50UmVxdWVzdCBpbXBsZW1lbnRzIElPU2luayB7CiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgcmVxdWVzdGVkIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdGF0ZS4KICAgKgogICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFs6dHJ1ZTpdLgogICAqLwogIGJvb2wgcGVyc2lzdGVudENvbm5lY3Rpb247CgogIC8qKgogICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIFs6dHJ1ZTpdIGlmIHRoaXMgcmVxdWVzdCBzaG91bGQKICAgKiBhdXRvbWF0aWNhbGx5IGZvbGxvdyByZWRpcmVjdHMuIFRoZSBkZWZhdWx0IGlzIFs6dHJ1ZTpdLgogICAqCiAgICogQXV0b21hdGljIHJlZGlyZWN0IHdpbGwgb25seSBoYXBwZW4gZm9yICJHRVQiIGFuZCAiSEVBRCIgcmVxdWVzdHMKICAgKiBhbmQgb25seSBmb3IgdGhlIHN0YXR1cyBjb2RlcyBbOkh0dHBTdGF0dXMubW92ZWRQZXJtYW5lbnRseTpdCiAgICogKDMwMSksIFs6SHR0cFN0YXR1cy5mb3VuZDpdICgzMDIpLAogICAqIFs6SHR0cFN0YXR1cy5tb3ZlZFRlbXBvcmFyaWx5Ol0gKDMwMiwgYWxpYXMgZm9yCiAgICogWzpIdHRwU3RhdHVzLmZvdW5kOl0pLCBbOkh0dHBTdGF0dXMuc2VlT3RoZXI6XSAoMzAzKSBhbmQKICAgKiBbOkh0dHBTdGF0dXMudGVtcG9yYXJ5UmVkaXJlY3Q6XSAoMzA3KS4gRm9yCiAgICogWzpIdHRwU3RhdHVzLnNlZU90aGVyOl0gKDMwMykgYXV0b21hdGljIHJlZGlyZWN0IHdpbGwgYWxzbyBoYXBwZW4KICAgKiBmb3IgIlBPU1QiIHJlcXVlc3RzIHdpdGggdGhlIG1ldGhvZCBjaGFuZ2VkIHRvICJHRVQiIHdoZW4KICAgKiBmb2xsb3dpbmcgdGhlIHJlZGlyZWN0LgogICAqCiAgICogQWxsIGhlYWRlcnMgYWRkZWQgdG8gdGhlIHJlcXVlc3Qgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVkaXJlY3Rpb24KICAgKiByZXF1ZXN0KHMpLiBIb3dldmVyLCBhbnkgYm9keSBzZW5kIHdpdGggdGhlIHJlcXVlc3Qgd2lsbCBub3QgYmUKICAgKiBwYXJ0IG9mIHRoZSByZWRpcmVjdGlvbiByZXF1ZXN0KHMpLgogICAqLwogIGJvb2wgZm9sbG93UmVkaXJlY3RzOwoKICAvKioKICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVkaXJlY3RzIHRvIGZvbGxvdwogICAqIHdoZW4gW2ZvbGxvd1JlZGlyZWN0c10gaXMgYHRydWVgLiBJZiB0aGlzIG51bWJlciBpcyBleGNlZWRlZAogICAqIGFuIGVycm9yIGV2ZW50IHdpbGwgYmUgYWRkZWQgd2l0aCBhIFtSZWRpcmVjdEV4Y2VwdGlvbl0uCiAgICoKICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1LgogICAqLwogIGludCBtYXhSZWRpcmVjdHM7CgogIC8qKgogICAqIFRoZSBtZXRob2Qgb2YgdGhlIHJlcXVlc3QuCiAgICovCiAgU3RyaW5nIGdldCBtZXRob2Q7CgogIC8qKgogICAqIFRoZSB1cmkgb2YgdGhlIHJlcXVlc3QuCiAgICovCiAgVXJpIGdldCB1cmk7CgogIC8vLyBHZXRzIGFuZCBzZXRzIHRoZSBjb250ZW50IGxlbmd0aCBvZiB0aGUgcmVxdWVzdC4KICAvLy8KICAvLy8gSWYgdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QgaXMgbm90IGtub3duIGluIGFkdmFuY2Ugc2V0IGNvbnRlbnQgbGVuZ3RoIHRvCiAgLy8vIC0xLCB3aGljaCBpcyBhbHNvIHRoZSBkZWZhdWx0LgogIGludCBjb250ZW50TGVuZ3RoOwoKICAvKioKICAgKiBHZXRzIG9yIHNldHMgaWYgdGhlIFtIdHRwQ2xpZW50UmVxdWVzdF0gc2hvdWxkIGJ1ZmZlciBvdXRwdXQuCiAgICoKICAgKiBEZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC4KICAgKgogICAqIF9fTm90ZV9fOiBEaXNhYmxpbmcgYnVmZmVyaW5nIG9mIHRoZSBvdXRwdXQgY2FuIHJlc3VsdCBpbiB2ZXJ5IHBvb3IKICAgKiBwZXJmb3JtYW5jZSwgd2hlbiB3cml0aW5nIG1hbnkgc21hbGwgY2h1bmtzLgogICAqLwogIGJvb2wgYnVmZmVyT3V0cHV0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjbGllbnQgcmVxdWVzdCBoZWFkZXJzLgogICAqCiAgICogVGhlIGNsaWVudCByZXF1ZXN0IGhlYWRlcnMgY2FuIGJlIG1vZGlmaWVkIHVudGlsIHRoZSBjbGllbnQKICAgKiByZXF1ZXN0IGJvZHkgaXMgd3JpdHRlbiB0byBvciBjbG9zZWQuIEFmdGVyIHRoYXQgdGhleSBiZWNvbWUKICAgKiBpbW11dGFibGUuCiAgICovCiAgSHR0cEhlYWRlcnMgZ2V0IGhlYWRlcnM7CgogIC8qKgogICAqIENvb2tpZXMgdG8gcHJlc2VudCB0byB0aGUgc2VydmVyIChpbiB0aGUgJ2Nvb2tpZScgaGVhZGVyKS4KICAgKi8KICBMaXN0PENvb2tpZT4gZ2V0IGNvb2tpZXM7CgogIC8vLyBBIFtIdHRwQ2xpZW50UmVzcG9uc2VdIGZ1dHVyZSB0aGF0IHdpbGwgY29tcGxldGUgb25jZSB0aGUgcmVzcG9uc2UgaXMKICAvLy8gYXZhaWxhYmxlLgogIC8vLwogIC8vLyBJZiBhbiBlcnJvciBvY2N1cnMgYmVmb3JlIHRoZSByZXNwb25zZSBpcyBhdmFpbGFibGUsIHRoaXMgZnV0dXJlIHdpbGwKICAvLy8gY29tcGxldGUgd2l0aCBhbiBlcnJvci4KICBGdXR1cmU8SHR0cENsaWVudFJlc3BvbnNlPiBnZXQgZG9uZTsKCiAgLyoqCiAgICogQ2xvc2UgdGhlIHJlcXVlc3QgZm9yIGlucHV0LiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBbZG9uZV0uCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXNwb25zZT4gY2xvc2UoKTsKCiAgLy8vIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsaWVudCBjb25uZWN0aW9uLgogIC8vLwogIC8vLyBSZXR1cm5zIFs6bnVsbDpdIGlmIHRoZSBzb2NrZXQgaXMgbm90IGF2YWlsYWJsZS4KICBIdHRwQ29ubmVjdGlvbkluZm8gZ2V0IGNvbm5lY3Rpb25JbmZvOwp9CgovKioKICogSFRUUCByZXNwb25zZSBmb3IgYSBjbGllbnQgY29ubmVjdGlvbi4KICoKICogVGhlIGJvZHkgb2YgYSBbSHR0cENsaWVudFJlc3BvbnNlXSBvYmplY3QgaXMgYQogKiBbU3RyZWFtXSBvZiBkYXRhIGZyb20gdGhlIHNlcnZlci4gTGlzdGVuIHRvIHRoZSBib2R5IHRvIGhhbmRsZQogKiB0aGUgZGF0YSBhbmQgYmUgbm90aWZpZWQgd2hlbiB0aGUgZW50aXJlIGJvZHkgaXMgcmVjZWl2ZWQuCiAqCiAqICAgICBuZXcgSHR0cENsaWVudCgpLmdldCgnbG9jYWxob3N0JywgODAsICcvZmlsZS50eHQnKQogKiAgICAgICAgICAudGhlbigoSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCkgPT4gcmVxdWVzdC5jbG9zZSgpKQogKiAgICAgICAgICAudGhlbigoSHR0cENsaWVudFJlc3BvbnNlIHJlc3BvbnNlKSB7CiAqICAgICAgICAgICAgcmVzcG9uc2UudHJhbnNmb3JtKHV0ZjguZGVjb2RlcikubGlzdGVuKChjb250ZW50cykgewogKiAgICAgICAgICAgICAgLy8gaGFuZGxlIGRhdGEKICogICAgICAgICAgICB9KTsKICogICAgICAgICAgfSk7CiAqLwphYnN0cmFjdCBjbGFzcyBIdHRwQ2xpZW50UmVzcG9uc2UgaW1wbGVtZW50cyBTdHJlYW08TGlzdDxpbnQ+PiB7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgc3RhdHVzIGNvZGUuCiAgICoKICAgKiBUaGUgc3RhdHVzIGNvZGUgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBib2R5IGlzIHdyaXR0ZW4KICAgKiB0by4gU2V0dGluZyB0aGUgc3RhdHVzIGNvZGUgYWZ0ZXIgd3JpdGluZyB0byB0aGUgYm9keSB3aWxsIHRocm93CiAgICogYSBgU3RhdGVFcnJvcmAuCiAgICovCiAgaW50IGdldCBzdGF0dXNDb2RlOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSByZWFzb24gcGhyYXNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGNvZGUuCiAgICoKICAgKiBUaGUgcmVhc29uIHBocmFzZSBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGJvZHkgaXMgd3JpdHRlbgogICAqIHRvLiBTZXR0aW5nIHRoZSByZWFzb24gcGhyYXNlIGFmdGVyIHdyaXRpbmcgdG8gdGhlIGJvZHkgd2lsbCB0aHJvdwogICAqIGEgYFN0YXRlRXJyb3JgLgogICAqLwogIFN0cmluZyBnZXQgcmVhc29uUGhyYXNlOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IGxlbmd0aCBvZiB0aGUgcmVzcG9uc2UgYm9keS4gUmV0dXJucyAtMSBpZiB0aGUgc2l6ZSBvZgogICAqIHRoZSByZXNwb25zZSBib2R5IGlzIG5vdCBrbm93biBpbiBhZHZhbmNlLgogICAqCiAgICogSWYgdGhlIGNvbnRlbnQgbGVuZ3RoIG5lZWRzIHRvIGJlIHNldCwgaXQgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZQogICAqIGJvZHkgaXMgd3JpdHRlbiB0by4gU2V0dGluZyB0aGUgY29udGVudCBsZW5ndGggYWZ0ZXIgd3JpdGluZyB0byB0aGUgYm9keQogICAqIHdpbGwgdGhyb3cgYSBgU3RhdGVFcnJvcmAuCiAgICovCiAgaW50IGdldCBjb250ZW50TGVuZ3RoOwoKICAvLy8gVGhlIGNvbXByZXNzaW9uIHN0YXRlIG9mIHRoZSByZXNwb25zZS4KICAvLy8KICAvLy8gVGhpcyBzcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzcG9uc2UgYnl0ZXMgd2VyZSBjb21wcmVzc2VkIHdoZW4gdGhleSB3ZXJlCiAgLy8vIHJlY2VpdmVkIGFjcm9zcyB0aGUgd2lyZSBhbmQgd2hldGhlciBjYWxsZXJzIHdpbGwgcmVjZWl2ZSBjb21wcmVzc2VkCiAgLy8vIG9yIHVuY29tcHJlc3NlZCBieXRlcyB3aGVuIHRoZXkgbGlzdGVkIHRvIHRoaXMgcmVzcG9uc2UncyBieXRlIHN0cmVhbS4KICBAU2luY2UoIjIuNCIpCiAgSHR0cENsaWVudFJlc3BvbnNlQ29tcHJlc3Npb25TdGF0ZSBnZXQgY29tcHJlc3Npb25TdGF0ZTsKCiAgLyoqCiAgICogR2V0cyB0aGUgcGVyc2lzdGVudCBjb25uZWN0aW9uIHN0YXRlIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIuCiAgICoKICAgKiBJZiB0aGUgcGVyc2lzdGVudCBjb25uZWN0aW9uIHN0YXRlIG5lZWRzIHRvIGJlIHNldCwgaXQgbXVzdCBiZQogICAqIHNldCBiZWZvcmUgdGhlIGJvZHkgaXMgd3JpdHRlbiB0by4gU2V0dGluZyB0aGUgcGVyc2lzdGVudCBjb25uZWN0aW9uIHN0YXRlCiAgICogYWZ0ZXIgd3JpdGluZyB0byB0aGUgYm9keSB3aWxsIHRocm93IGEgYFN0YXRlRXJyb3JgLgogICAqLwogIGJvb2wgZ2V0IHBlcnNpc3RlbnRDb25uZWN0aW9uOwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHN0YXR1cyBjb2RlIGlzIG9uZSBvZiB0aGUgbm9ybWFsIHJlZGlyZWN0CiAgICogY29kZXMgW0h0dHBTdGF0dXMubW92ZWRQZXJtYW5lbnRseV0sIFtIdHRwU3RhdHVzLmZvdW5kXSwKICAgKiBbSHR0cFN0YXR1cy5tb3ZlZFRlbXBvcmFyaWx5XSwgW0h0dHBTdGF0dXMuc2VlT3RoZXJdIGFuZAogICAqIFtIdHRwU3RhdHVzLnRlbXBvcmFyeVJlZGlyZWN0XS4KICAgKi8KICBib29sIGdldCBpc1JlZGlyZWN0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzZXJpZXMgb2YgcmVkaXJlY3RzIHRoaXMgY29ubmVjdGlvbiBoYXMgYmVlbiB0aHJvdWdoLiBUaGUKICAgKiBsaXN0IHdpbGwgYmUgZW1wdHkgaWYgbm8gcmVkaXJlY3RzIHdlcmUgZm9sbG93ZWQuIFtyZWRpcmVjdHNdIHdpbGwgYmUKICAgKiB1cGRhdGVkIGJvdGggaW4gdGhlIGNhc2Ugb2YgYW4gYXV0b21hdGljIGFuZCBhIG1hbnVhbCByZWRpcmVjdC4KICAgKi8KICBMaXN0PFJlZGlyZWN0SW5mbz4gZ2V0IHJlZGlyZWN0czsKCiAgLyoqCiAgICogUmVkaXJlY3RzIHRoaXMgY29ubmVjdGlvbiB0byBhIG5ldyBVUkwuIFRoZSBkZWZhdWx0IHZhbHVlIGZvcgogICAqIFttZXRob2RdIGlzIHRoZSBtZXRob2QgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuIFRoZSBkZWZhdWx0IHZhbHVlCiAgICogZm9yIFt1cmxdIGlzIHRoZSB2YWx1ZSBvZiB0aGUgW0h0dHBIZWFkZXJzLmxvY2F0aW9uSGVhZGVyXSBoZWFkZXIgb2YKICAgKiB0aGUgY3VycmVudCByZXNwb25zZS4gQWxsIGJvZHkgZGF0YSBtdXN0IGhhdmUgYmVlbiByZWFkIGZyb20gdGhlCiAgICogY3VycmVudCByZXNwb25zZSBiZWZvcmUgY2FsbGluZyBbcmVkaXJlY3RdLgogICAqCiAgICogQWxsIGhlYWRlcnMgYWRkZWQgdG8gdGhlIHJlcXVlc3Qgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVkaXJlY3Rpb24KICAgKiByZXF1ZXN0LiBIb3dldmVyLCBhbnkgYm9keSBzZW50IHdpdGggdGhlIHJlcXVlc3Qgd2lsbCBub3QgYmUKICAgKiBwYXJ0IG9mIHRoZSByZWRpcmVjdGlvbiByZXF1ZXN0LgogICAqCiAgICogSWYgW2ZvbGxvd0xvb3BzXSBpcyBzZXQgdG8gWzp0cnVlOl0sIHJlZGlyZWN0IHdpbGwgZm9sbG93IHRoZSByZWRpcmVjdCwKICAgKiBldmVuIGlmIHRoZSBVUkwgd2FzIGFscmVhZHkgdmlzaXRlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgWzpmYWxzZTpdLgogICAqCiAgICogVGhlIG1ldGhvZCB3aWxsIGlnbm9yZSBbSHR0cENsaWVudFJlcXVlc3QubWF4UmVkaXJlY3RzXQogICAqIGFuZCB3aWxsIGFsd2F5cyBwZXJmb3JtIHRoZSByZWRpcmVjdC4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlc3BvbnNlPiByZWRpcmVjdCgKICAgICAgW1N0cmluZyBtZXRob2QsIFVyaSB1cmwsIGJvb2wgZm9sbG93TG9vcHNdKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgY2xpZW50IHJlc3BvbnNlIGhlYWRlcnMuCiAgICoKICAgKiBUaGUgY2xpZW50IHJlc3BvbnNlIGhlYWRlcnMgYXJlIGltbXV0YWJsZS4KICAgKi8KICBIdHRwSGVhZGVycyBnZXQgaGVhZGVyczsKCiAgLyoqCiAgICogRGV0YWNoIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBmcm9tIHRoZSBIVFRQIGNsaWVudC4gV2hlbiB0aGUKICAgKiBzb2NrZXQgaXMgZGV0YWNoZWQgdGhlIEhUVFAgY2xpZW50IHdpbGwgbm8gbG9uZ2VyIHBlcmZvcm0gYW55CiAgICogb3BlcmF0aW9ucyBvbiBpdC4KICAgKgogICAqIFRoaXMgaXMgbm9ybWFsbHkgdXNlZCB3aGVuIGEgSFRUUCB1cGdyYWRlIGlzIG5lZ290aWF0ZWQgYW5kIHRoZQogICAqIGNvbW11bmljYXRpb24gc2hvdWxkIGNvbnRpbnVlIHdpdGggYSBkaWZmZXJlbnQgcHJvdG9jb2wuCiAgICovCiAgRnV0dXJlPFNvY2tldD4gZGV0YWNoU29ja2V0KCk7CgogIC8qKgogICAqIENvb2tpZXMgc2V0IGJ5IHRoZSBzZXJ2ZXIgKGZyb20gdGhlICdzZXQtY29va2llJyBoZWFkZXIpLgogICAqLwogIExpc3Q8Q29va2llPiBnZXQgY29va2llczsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgY2VydGlmaWNhdGUgb2YgdGhlIEhUVFBTIHNlcnZlciBwcm92aWRpbmcgdGhlIHJlc3BvbnNlLgogICAqIFJldHVybnMgbnVsbCBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgYSBzZWN1cmUgVExTIG9yIFNTTCBjb25uZWN0aW9uLgogICAqLwogIFg1MDlDZXJ0aWZpY2F0ZSBnZXQgY2VydGlmaWNhdGU7CgogIC8qKgogICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsaWVudCBjb25uZWN0aW9uLiBSZXR1cm5zIFs6bnVsbDpdIGlmIHRoZSBzb2NrZXQKICAgKiBpcyBub3QgYXZhaWxhYmxlLgogICAqLwogIEh0dHBDb25uZWN0aW9uSW5mbyBnZXQgY29ubmVjdGlvbkluZm87Cn0KCi8vLyBFbnVtIHRoYXQgc3BlY2lmaWVzIHRoZSBjb21wcmVzc2lvbiBzdGF0ZSBvZiB0aGUgYnl0ZSBzdHJlYW0gb2YgYW4KLy8vIFtIdHRwQ2xpZW50UmVzcG9uc2VdLgovLy8KLy8vIFRoZSB2YWx1ZXMgaGVyZWluIGFsbG93IGNhbGxlcnMgdG8gYW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zIGFzIHRoZXkKLy8vIHBlcnRhaW4gdG8gYW4gW0h0dHBDbGllbnRSZXNwb25zZV06Ci8vLwovLy8gICogQ2FuIHRoZSB2YWx1ZSBvZiB0aGUgcmVzcG9uc2UncyBgQ29udGVudC1MZW5ndGhgIEhUVFAgaGVhZGVyIGJlIHRydXN0ZWQ/Ci8vLyAgKiBEb2VzIHRoZSBjYWxsZXIgbmVlZCB0byBtYW51YWxseSBkZWNvbXByZXNzIHRoZSByZXNwb25zZSdzIGJ5dGUgc3RyZWFtPwovLy8KLy8vIFRoaXMgZW51bSBpcyBhY2Nlc3NlZCB2aWEgdGhlIFtIdHRwQ2xpZW50UmVzcG9uc2UuY29tcHJlc3Npb25TdGF0ZV0gdmFsdWUuCkBTaW5jZSgiMi40IikKZW51bSBIdHRwQ2xpZW50UmVzcG9uc2VDb21wcmVzc2lvblN0YXRlIHsKICAvLy8gVGhlIGJvZHkgb2YgdGhlIEhUVFAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkIGFuZCByZW1haW5zIGluIGFuIHVuY29tcHJlc3NlZAogIC8vLyBzdGF0ZS4KICAvLy8KICAvLy8gSW4gdGhpcyBzdGF0ZSwgdGhlIHZhbHVlIG9mIHRoZSBgQ29udGVudC1MZW5ndGhgIEhUVFAgaGVhZGVyLCBpZgogIC8vLyBzcGVjaWZpZWQgKG5vbi1uZWdhdGl2ZSksIHNob3VsZCBtYXRjaCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHByb2R1Y2VkIGJ5CiAgLy8vIHRoZSByZXNwb25zZSdzIGJ5dGUgc3RyZWFtLgogIG5vdENvbXByZXNzZWQsCgogIC8vLyBUaGUgYm9keSBvZiB0aGUgSFRUUCByZXNwb25zZSB3YXMgb3JpZ2luYWxseSBjb21wcmVzc2VkLCBidXQgYnkgdmlydHVlIG9mCiAgLy8vIHRoZSBbSHR0cENsaWVudC5hdXRvVW5jb21wcmVzc10gY29uZmlndXJhdGlvbiBvcHRpb24sIGl0IGhhcyBiZWVuCiAgLy8vIGF1dG9tYXRpY2FsbHkgdW5jb21wcmVzc2VkLgogIC8vLwogIC8vLyBIVFRQIGhlYWRlcnMgYXJlIG5vdCBtb2RpZmllZCwgc28gd2hlbiBhIHJlc3BvbnNlIGhhcyBiZWVuIHVuY29tcHJlc3NlZAogIC8vLyBpbiB0aGlzIHdheSwgdGhlIHZhbHVlIG9mIHRoZSBgQ29udGVudC1MZW5ndGhgIEhUVFAgaGVhZGVyIGNhbm5vdCBiZQogIC8vLyB0cnVzdGVkLCBhcyBpdCB3aWxsIGNvbnRhaW4gdGhlIGNvbXByZXNzZWQgY29udGVudCBsZW5ndGgsIHdoZXJlYXMgdGhlCiAgLy8vIHN0cmVhbSBvZiBieXRlcyBwcm9kdWNlZCBieSB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIHVuY29tcHJlc3NlZCBieXRlcy4KICBkZWNvbXByZXNzZWQsCgogIC8vLyBUaGUgYm9keSBvZiB0aGUgSFRUUCByZXNwb25zZSBjb250YWlucyBjb21wcmVzc2VkIGJ5dGVzLgogIC8vLwogIC8vLyBJbiB0aGlzIHN0YXRlLCB0aGUgdmFsdWUgb2YgdGhlIGBDb250ZW50LUxlbmd0aGAgSFRUUCBoZWFkZXIsIGlmCiAgLy8vIHNwZWNpZmllZCAobm9uLW5lZ2F0aXZlKSwgc2hvdWxkIG1hdGNoIHRoZSBudW1iZXIgb2YgYnl0ZXMgcHJvZHVjZWQgYnkKICAvLy8gdGhlIHJlc3BvbnNlJ3MgYnl0ZSBzdHJlYW0uCiAgLy8vCiAgLy8vIElmIHRoZSBjYWxsZXIgd2lzaGVzIHRvIG1hbnVhbGx5IHVuY29tcHJlc3MgdGhlIGJvZHkgb2YgdGhlIHJlc3BvbnNlLAogIC8vLyBpdCBzaG91bGQgY29uc3VsdCB0aGUgdmFsdWUgb2YgdGhlIGBDb250ZW50LUVuY29kaW5nYCBIVFRQIGhlYWRlciB0byBzZWUKICAvLy8gd2hhdCB0eXBlIG9mIGNvbXByZXNzaW9uIGhhcyBiZWVuIGFwcGxpZWQuIFNlZQogIC8vLyA8aHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI2MTYjc2VjdGlvbi0xNC4xMT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgY29tcHJlc3NlZCwKfQoKYWJzdHJhY3QgY2xhc3MgSHR0cENsaWVudENyZWRlbnRpYWxzIHt9CgovKioKICogUmVwcmVzZW50cyBjcmVkZW50aWFscyBmb3IgYmFzaWMgYXV0aGVudGljYXRpb24uCiAqLwphYnN0cmFjdCBjbGFzcyBIdHRwQ2xpZW50QmFzaWNDcmVkZW50aWFscyBleHRlbmRzIEh0dHBDbGllbnRDcmVkZW50aWFscyB7CiAgZmFjdG9yeSBIdHRwQ2xpZW50QmFzaWNDcmVkZW50aWFscyhTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgPT4KICAgICAgbmV3IF9IdHRwQ2xpZW50QmFzaWNDcmVkZW50aWFscyh1c2VybmFtZSwgcGFzc3dvcmQpOwp9CgovKioKICogUmVwcmVzZW50cyBjcmVkZW50aWFscyBmb3IgZGlnZXN0IGF1dGhlbnRpY2F0aW9uLiBEaWdlc3QKICogYXV0aGVudGljYXRpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIHNlcnZlcnMgdXNpbmcgdGhlIE1ENQogKiBhbGdvcml0aG0gYW5kIHF1YWxpdHkgb2YgcHJvdGVjdGlvbiAocW9wKSBvZiBlaXRoZXIgIm5vbmUiIG9yCiAqICJhdXRoIi4KICovCmFic3RyYWN0IGNsYXNzIEh0dHBDbGllbnREaWdlc3RDcmVkZW50aWFscyBleHRlbmRzIEh0dHBDbGllbnRDcmVkZW50aWFscyB7CiAgZmFjdG9yeSBIdHRwQ2xpZW50RGlnZXN0Q3JlZGVudGlhbHMoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpID0+CiAgICAgIG5ldyBfSHR0cENsaWVudERpZ2VzdENyZWRlbnRpYWxzKHVzZXJuYW1lLCBwYXNzd29yZCk7Cn0KCi8qKgogKiBJbmZvcm1hdGlvbiBhYm91dCBhbiBbSHR0cFJlcXVlc3RdLCBbSHR0cFJlc3BvbnNlXSwgW0h0dHBDbGllbnRSZXF1ZXN0XSwgb3IKICogW0h0dHBDbGllbnRSZXNwb25zZV0gY29ubmVjdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIEh0dHBDb25uZWN0aW9uSW5mbyB7CiAgSW50ZXJuZXRBZGRyZXNzIGdldCByZW1vdGVBZGRyZXNzOwogIGludCBnZXQgcmVtb3RlUG9ydDsKICBpbnQgZ2V0IGxvY2FsUG9ydDsKfQoKLyoqCiAqIFJlZGlyZWN0IGluZm9ybWF0aW9uLgogKi8KYWJzdHJhY3QgY2xhc3MgUmVkaXJlY3RJbmZvIHsKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzdGF0dXMgY29kZSB1c2VkIGZvciB0aGUgcmVkaXJlY3QuCiAgICovCiAgaW50IGdldCBzdGF0dXNDb2RlOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBtZXRob2QgdXNlZCBmb3IgdGhlIHJlZGlyZWN0LgogICAqLwogIFN0cmluZyBnZXQgbWV0aG9kOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBmb3IgdGhlIHJlZGlyZWN0LgogICAqLwogIFVyaSBnZXQgbG9jYXRpb247Cn0KCi8qKgogKiBXaGVuIGRldGFjaGluZyBhIHNvY2tldCBmcm9tIGVpdGhlciB0aGUgWzpIdHRwU2VydmVyOl0gb3IgdGhlCiAqIFs6SHR0cENsaWVudDpdIGR1ZSB0byBhIEhUVFAgY29ubmVjdGlvbiB1cGdyYWRlIHRoZXJlIG1pZ2h0IGJlCiAqIHVucGFyc2VkIGRhdGEgYWxyZWFkeSByZWFkIGZyb20gdGhlIHNvY2tldC4gVGhpcyB1bnBhcnNlZCBkYXRhCiAqIHRvZ2V0aGVyIHdpdGggdGhlIGRldGFjaGVkIHNvY2tldCBpcyByZXR1cm5lZCBpbiBhbiBpbnN0YW5jZSBvZgogKiB0aGlzIGNsYXNzLgogKi8KYWJzdHJhY3QgY2xhc3MgRGV0YWNoZWRTb2NrZXQgewogIFNvY2tldCBnZXQgc29ja2V0OwogIExpc3Q8aW50PiBnZXQgdW5wYXJzZWREYXRhOwp9CgpjbGFzcyBIdHRwRXhjZXB0aW9uIGltcGxlbWVudHMgSU9FeGNlcHRpb24gewogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIGZpbmFsIFVyaSB1cmk7CgogIGNvbnN0IEh0dHBFeGNlcHRpb24odGhpcy5tZXNzYWdlLCB7dGhpcy51cml9KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgdmFyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCkuLndyaXRlKCdIdHRwRXhjZXB0aW9uOiAnKS4ud3JpdGUobWVzc2FnZSk7CiAgICBpZiAodXJpICE9IG51bGwpIHsKICAgICAgYi53cml0ZSgnLCB1cmkgPSAkdXJpJyk7CiAgICB9CiAgICByZXR1cm4gYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgUmVkaXJlY3RFeGNlcHRpb24gaW1wbGVt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aW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5faHR0cDsKCmludCBfbmV4dFNlcnZpY2VJZCA9IDE7CgovLyBUT0RPKGFqb2huc2VuKTogVXNlIG90aGVyIHdheSBvZiBnZXR0aW5nIGEgdW5pcXVlIGlkLgphYnN0cmFjdCBjbGFzcyBfU2VydmljZU9iamVjdCB7CiAgaW50IF9fc2VydmljZUlkID0gMDsKICBpbnQgZ2V0IF9zZXJ2aWNlSWQgewogICAgaWYgKF9fc2VydmljZUlkID09IDApIF9fc2VydmljZUlkID0gX25leHRTZXJ2aWNlSWQrKzsKICAgIHJldHVybiBfX3NlcnZpY2VJZDsKICB9CgogIE1hcCBfdG9KU09OKGJvb2wgcmVmKTsKCiAgU3RyaW5nIGdldCBfc2VydmljZVBhdGggPT4gIiRfc2VydmljZVR5cGVQYXRoLyRfc2VydmljZUlkIjsKCiAgU3RyaW5nIGdldCBfc2VydmljZVR5cGVQYXRoOwoKICBTdHJpbmcgZ2V0IF9zZXJ2aWNlVHlwZU5hbWU7CgogIFN0cmluZyBfc2VydmljZVR5cGUoYm9vbCByZWYpIHsKICAgIGlmIChyZWYpIHJldHVybiAiQCRfc2VydmljZVR5cGVOYW1lIjsKICAgIHJldHVybiBfc2VydmljZVR5cGVOYW1lOwogIH0KfQoKY2xhc3MgX0NvcHlpbmdCeXRlc0J1aWxkZXIgaW1wbGVtZW50cyBCeXRlc0J1aWxkZXIgewogIC8vIFN0YXJ0IHdpdGggMTAyNCBieXRlcy4KICBzdGF0aWMgY29uc3QgaW50IF9JTklUX1NJWkUgPSAxMDI0OwoKICBzdGF0aWMgZmluYWwgX2VtcHR5TGlzdCA9IG5ldyBVaW50OExpc3QoMCk7CgogIGludCBfbGVuZ3RoID0gMDsKICBVaW50OExpc3QgX2J1ZmZlcjsKCiAgX0NvcHlpbmdCeXRlc0J1aWxkZXIoW2ludCBpbml0aWFsQ2FwYWNpdHkgPSAwXSkKICAgICAgOiBfYnVmZmVyID0gKGluaXRpYWxDYXBhY2l0eSA8PSAwKQogICAgICAgICAgICA/IF9lbXB0eUxpc3QKICAgICAgICAgICAgOiBuZXcgVWludDhMaXN0KF9wb3cycm91bmR1cChpbml0aWFsQ2FwYWNpdHkpKTsKCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGJ5dGVzKSB7CiAgICBpbnQgYnl0ZXNMZW5ndGggPSBieXRlcy5sZW5ndGg7CiAgICBpZiAoYnl0ZXNMZW5ndGggPT0gMCkgcmV0dXJuOwogICAgaW50IHJlcXVpcmVkID0gX2xlbmd0aCArIGJ5dGVzTGVuZ3RoOwogICAgaWYgKF9idWZmZXIubGVuZ3RoIDwgcmVxdWlyZWQpIHsKICAgICAgX2dyb3cocmVxdWlyZWQpOwogICAgfQogICAgYXNzZXJ0KF9idWZmZXIubGVuZ3RoID49IHJlcXVpcmVkKTsKICAgIGlmIChieXRlcyBpcyBVaW50OExpc3QpIHsKICAgICAgX2J1ZmZlci5zZXRSYW5nZShfbGVuZ3RoLCByZXF1aXJlZCwgYnl0ZXMpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgX2J1ZmZlcltfbGVuZ3RoICsgaV0gPSBieXRlc1tpXTsKICAgICAgfQogICAgfQogICAgX2xlbmd0aCA9IHJlcXVpcmVkOwogIH0KCiAgdm9pZCBhZGRCeXRlKGludCBieXRlKSB7CiAgICBpZiAoX2J1ZmZlci5sZW5ndGggPT0gX2xlbmd0aCkgewogICAgICAvLyBUaGUgZ3JvdyBhbGdvcml0aG0gYWx3YXlzIGF0IGxlYXN0IGRvdWJsZXMuCiAgICAgIC8vIElmIHdlIGFkZGVkIG9uZSB0byBfbGVuZ3RoIGl0IHdvdWxkIHF1YWRydXBsZSB1bm5lY2Vzc2FyaWx5LgogICAgICBfZ3JvdyhfbGVuZ3RoKTsKICAgIH0KICAgIGFzc2VydChfYnVmZmVyLmxlbmd0aCA+IF9sZW5ndGgpOwogICAgX2J1ZmZlcltfbGVuZ3RoXSA9IGJ5dGU7CiAgICBfbGVuZ3RoKys7CiAgfQoKICB2b2lkIF9ncm93KGludCByZXF1aXJlZCkgewogICAgLy8gV2Ugd2lsbCBjcmVhdGUgYSBsaXN0IGluIHRoZSByYW5nZSBvZiAyLTQgdGltZXMgbGFyZ2VyIHRoYW4KICAgIC8vIHJlcXVpcmVkLgogICAgaW50IG5ld1NpemUgPSByZXF1aXJlZCAqIDI7CiAgICBpZiAobmV3U2l6ZSA8IF9JTklUX1NJWkUpIHsKICAgICAgbmV3U2l6ZSA9IF9JTklUX1NJWkU7CiAgICB9IGVsc2UgewogICAgICBuZXdTaXplID0gX3BvdzJyb3VuZHVwKG5ld1NpemUpOwogICAgfQogICAgdmFyIG5ld0J1ZmZlciA9IG5ldyBVaW50OExpc3QobmV3U2l6ZSk7CiAgICBuZXdCdWZmZXIuc2V0UmFuZ2UoMCwgX2J1ZmZlci5sZW5ndGgsIF9idWZmZXIpOwogICAgX2J1ZmZlciA9IG5ld0J1ZmZlcjsKICB9CgogIFVpbnQ4TGlzdCB0YWtlQnl0ZXMoKSB7CiAgICBpZiAoX2xlbmd0aCA9PSAwKSByZXR1cm4gX2VtcHR5TGlzdDsKICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0LnZpZXcoX2J1ZmZlci5idWZmZXIsIDAsIF9sZW5ndGgpOwogICAgY2xlYXIoKTsKICAgIHJldHVybiBidWZmZXI7CiAgfQoKICBVaW50OExpc3QgdG9CeXRlcygpIHsKICAgIGlmIChfbGVuZ3RoID09IDApIHJldHVybiBfZW1wdHlMaXN0OwogICAgcmV0dXJuIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoCiAgICAgICAgbmV3IFVpbnQ4TGlzdC52aWV3KF9idWZmZXIuYnVmZmVyLCAwLCBfbGVuZ3RoKSk7CiAgfQoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbGVuZ3RoOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF9sZW5ndGggPT0gMDsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfbGVuZ3RoICE9IDA7CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfbGVuZ3RoID0gMDsKICAgIF9idWZmZXIgPSBfZW1wdHlMaXN0OwogIH0KCiAgc3RhdGljIGludCBfcG93MnJvdW5kdXAoaW50IHgpIHsKICAgIGFzc2VydCh4ID4gMCk7CiAgICAtLXg7CiAgICB4IHw9IHggPj4gMTsKICAgIHggfD0geCA+PiAyOwogICAgeCB8PSB4ID4+IDQ7CiAgICB4IHw9IHggPj4gODsKICAgIHggfD0geCA+PiAxNjsKICAgIHJldHVybiB4ICsgMTsKICB9Cn0KCmNvbnN0IGludCBfT1VUR09JTkdfQlVGRkVSX1NJWkUgPSA4ICogMTAyNDsKCnR5cGVkZWYgdm9pZCBfQnl0ZXNDb25zdW1lcihMaXN0PGludD4gYnl0ZXMpOwoKY2xhc3MgX0h0dHBJbmNvbWluZyBleHRlbmRzIFN0cmVhbTxVaW50OExpc3Q+IHsKICBmaW5hbCBpbnQgX3RyYW5zZmVyTGVuZ3RoOwogIGZpbmFsIENvbXBsZXRlciBfZGF0YUNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKICBTdHJlYW08VWludDhMaXN0PiBfc3RyZWFtOwoKICBib29sIGZ1bGxCb2R5UmVhZCA9IGZhbHNlOwoKICAvLyBDb21tb24gcHJvcGVydGllcy4KICBmaW5hbCBfSHR0cEhlYWRlcnMgaGVhZGVyczsKICBib29sIHVwZ3JhZGVkID0gZmFsc2U7CgogIC8vIENsaWVudFJlc3BvbnNlIHByb3BlcnRpZXMuCiAgaW50IHN0YXR1c0NvZGU7CiAgU3RyaW5nIHJlYXNvblBocmFzZTsKCiAgLy8gUmVxdWVzdCBwcm9wZXJ0aWVzLgogIFN0cmluZyBtZXRob2Q7CiAgVXJpIHVyaTsKCiAgYm9vbCBoYXNTdWJzY3JpYmVyID0gZmFsc2U7CgogIC8vIFRoZSB0cmFuc2ZlciBsZW5ndGggaWYgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSBib2R5IGFzIGl0CiAgLy8gYXBwZWFycyBpbiB0aGUgbWVzc2FnZSAoUkZDIDI2MTYgc2VjdGlvbiA0LjQpLiBUaGlzIGNhbiBiZSAtMSBpZgogIC8vIHRoZSBsZW5ndGggb2YgdGhlIG1hc3NhZ2UgYm9keSBpcyBub3Qga25vd24gZHVlIHRvIHRyYW5zZmVyCiAgLy8gY29kaW5ncy4KICBpbnQgZ2V0IHRyYW5zZmVyTGVuZ3RoID0+IF90cmFuc2Zlckxlbmd0aDsKCiAgX0h0dHBJbmNvbWluZyh0aGlzLmhlYWRlcnMsIHRoaXMuX3RyYW5zZmVyTGVuZ3RoLCB0aGlzLl9zdHJlYW0pOwoKICBTdHJlYW1TdWJzY3JpcHRpb248VWludDhMaXN0PiBsaXN0ZW4odm9pZCBvbkRhdGEoVWludDhMaXN0IGV2ZW50KSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIGhhc1N1YnNjcmliZXIgPSB0cnVlOwogICAgcmV0dXJuIF9zdHJlYW0uaGFuZGxlRXJyb3IoKGVycm9yKSB7CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UsIHVyaTogdXJpKTsKICAgIH0pLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgLy8gSXMgY29tcGxldGVkIG9uY2UgYWxsIGRhdGEgaGF2ZSBiZWVuIHJlY2VpdmVkLgogIEZ1dHVyZSBnZXQgZGF0YURvbmUgPT4gX2RhdGFDb21wbGV0ZXIuZnV0dXJlOwoKICB2b2lkIGNsb3NlKGJvb2wgY2xvc2luZykgewogICAgZnVsbEJvZHlSZWFkID0gdHJ1ZTsKICAgIGhhc1N1YnNjcmliZXIgPSB0cnVlOwogICAgX2RhdGFDb21wbGV0ZXIuY29tcGxldGUoY2xvc2luZyk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfSHR0cEluYm91bmRNZXNzYWdlTGlzdEludCBleHRlbmRzIFN0cmVhbTxMaXN0PGludD4+IHsKICBmaW5hbCBfSHR0cEluY29taW5nIF9pbmNvbWluZzsKICBMaXN0PENvb2tpZT4gX2Nvb2tpZXM7CgogIF9IdHRwSW5ib3VuZE1lc3NhZ2VMaXN0SW50KHRoaXMuX2luY29taW5nKTsKCiAgTGlzdDxDb29raWU+IGdldCBjb29raWVzIHsKICAgIGlmIChfY29va2llcyAhPSBudWxsKSByZXR1cm4gX2Nvb2tpZXM7CiAgICByZXR1cm4gX2Nvb2tpZXMgPSBoZWFkZXJzLl9wYXJzZUNvb2tpZXMoKTsKICB9CgogIF9IdHRwSGVhZGVycyBnZXQgaGVhZGVycyA9PiBfaW5jb21pbmcuaGVhZGVyczsKICBTdHJpbmcgZ2V0IHByb3RvY29sVmVyc2lvbiA9PiBoZWFkZXJzLnByb3RvY29sVmVyc2lvbjsKICBpbnQgZ2V0IGNvbnRlbnRMZW5ndGggPT4gaGVhZGVycy5jb250ZW50TGVuZ3RoOwogIGJvb2wgZ2V0IHBlcnNpc3RlbnRDb25uZWN0aW9uID0+IGhlYWRlcnMucGVyc2lzdGVudENvbm5lY3Rpb247Cn0KCmFic3RyYWN0IGNsYXNzIF9IdHRwSW5ib3VuZE1lc3NhZ2UgZXh0ZW5kcyBTdHJlYW08VWludDhMaXN0PiB7CiAgZmluYWwgX0h0dHBJbmNvbWluZyBfaW5jb21pbmc7CiAgTGlzdDxDb29raWU+IF9jb29raWVzOwoKICBfSHR0cEluYm91bmRNZXNzYWdlKHRoaXMuX2luY29taW5nKTsKCiAgTGlzdDxDb29raWU+IGdldCBjb29raWVzIHsKICAgIGlmIChfY29va2llcyAhPSBudWxsKSByZXR1cm4gX2Nvb2tpZXM7CiAgICByZXR1cm4gX2Nvb2tpZXMgPSBoZWFkZXJzLl9wYXJzZUNvb2tpZXMoKTsKICB9CgogIF9IdHRwSGVhZGVycyBnZXQgaGVhZGVycyA9PiBfaW5jb21pbmcuaGVhZGVyczsKICBTdHJpbmcgZ2V0IHByb3RvY29sVmVyc2lvbiA9PiBoZWFkZXJzLnByb3RvY29sVmVyc2lvbjsKICBpbnQgZ2V0IGNvbnRlbnRMZW5ndGggPT4gaGVhZGVycy5jb250ZW50TGVuZ3RoOwogIGJvb2wgZ2V0IHBlcnNpc3RlbnRDb25uZWN0aW9uID0+IGhlYWRlcnMucGVyc2lzdGVudENvbm5lY3Rpb247Cn0KCmNsYXNzIF9IdHRwUmVxdWVzdCBleHRlbmRzIF9IdHRwSW5ib3VuZE1lc3NhZ2UgaW1wbGVtZW50cyBIdHRwUmVxdWVzdCB7CiAgZmluYWwgSHR0cFJlc3BvbnNlIHJlc3BvbnNlOwoKICBmaW5hbCBfSHR0cFNlcnZlciBfaHR0cFNlcnZlcjsKCiAgZmluYWwgX0h0dHBDb25uZWN0aW9uIF9odHRwQ29ubmVjdGlvbjsKCiAgX0h0dHBTZXNzaW9uIF9zZXNzaW9uOwoKICBVcmkgX3JlcXVlc3RlZFVyaTsKCiAgX0h0dHBSZXF1ZXN0KHRoaXMucmVzcG9uc2UsIF9IdHRwSW5jb21pbmcgX2luY29taW5nLCB0aGlzLl9odHRwU2VydmVyLAogICAgICB0aGlzLl9odHRwQ29ubmVjdGlvbikKICAgICAgOiBzdXBlcihfaW5jb21pbmcpIHsKICAgIGlmIChoZWFkZXJzLnByb3RvY29sVmVyc2lvbiA9PSAiMS4xIikgewogICAgICByZXNwb25zZS5oZWFkZXJzCiAgICAgICAgLi5jaHVua2VkVHJhbnNmZXJFbmNvZGluZyA9IHRydWUKICAgICAgICAuLnBlcnNpc3RlbnRDb25uZWN0aW9uID0gaGVhZGVycy5wZXJzaXN0ZW50Q29ubmVjdGlvbjsKICAgIH0KCiAgICBpZiAoX2h0dHBTZXJ2ZXIuX3Nlc3Npb25NYW5hZ2VySW5zdGFuY2UgIT0gbnVsbCkgewogICAgICAvLyBNYXAgdG8gc2Vzc2lvbiBpZiBleGlzdHMuCiAgICAgIHZhciBzZXNzaW9uSWRzID0gY29va2llcwogICAgICAgICAgLndoZXJlKChjb29raWUpID0+IGNvb2tpZS5uYW1lLnRvVXBwZXJDYXNlKCkgPT0gX0RBUlRfU0VTU0lPTl9JRCkKICAgICAgICAgIC5tYXAoKGNvb2tpZSkgPT4gY29va2llLnZhbHVlKTsKICAgICAgZm9yICh2YXIgc2Vzc2lvbklkIGluIHNlc3Npb25JZHMpIHsKICAgICAgICBfc2Vzc2lvbiA9IF9odHRwU2VydmVyLl9zZXNzaW9uTWFuYWdlci5nZXRTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgICAgaWYgKF9zZXNzaW9uICE9IG51bGwpIHsKICAgICAgICAgIF9zZXNzaW9uLl9tYXJrU2VlbigpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb248VWludDhMaXN0PiBsaXN0ZW4odm9pZCBvbkRhdGEoVWludDhMaXN0IGV2ZW50KSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIHJldHVybiBfaW5jb21pbmcubGlzdGVuKG9uRGF0YSwKICAgICAgICBvbkVycm9yOiBvbkVycm9yLCBvbkRvbmU6IG9uRG9uZSwgY2FuY2VsT25FcnJvcjogY2FuY2VsT25FcnJvcik7CiAgfQoKICBVcmkgZ2V0IHVyaSA9PiBfaW5jb21pbmcudXJpOwoKICBVcmkgZ2V0IHJlcXVlc3RlZFVyaSB7CiAgICBpZiAoX3JlcXVlc3RlZFVyaSA9PSBudWxsKSB7CiAgICAgIHZhciBwcm90byA9IGhlYWRlcnNbJ3gtZm9yd2FyZGVkLXByb3RvJ107CiAgICAgIHZhciBzY2hlbWUgPSBwcm90byAhPSBudWxsCiAgICAgICAgICA/IHByb3RvLmZpcnN0CiAgICAgICAgICA6IF9odHRwQ29ubmVjdGlvbi5fc29ja2V0IGlzIFNlY3VyZVNvY2tldCA/ICJodHRwcyIgOiAiaHR0cCI7CiAgICAgIHZhciBob3N0TGlzdCA9IGhlYWRlcnNbJ3gtZm9yd2FyZGVkLWhvc3QnXTsKICAgICAgU3RyaW5nIGhvc3Q7CiAgICAgIGlmIChob3N0TGlzdCAhPSBudWxsKSB7CiAgICAgICAgaG9zdCA9IGhvc3RMaXN0LmZpcnN0OwogICAgICB9IGVsc2UgewogICAgICAgIGhvc3RMaXN0ID0gaGVhZGVyc1snaG9zdCddOwogICAgICAgIGlmIChob3N0TGlzdCAhPSBudWxsKSB7CiAgICAgICAgICBob3N0ID0gaG9zdExpc3QuZmlyc3Q7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhvc3QgPSAiJHtfaHR0cFNlcnZlci5hZGRyZXNzLmhvc3R9OiR7X2h0dHBTZXJ2ZXIucG9ydH0iOwogICAgICAgIH0KICAgICAgfQogICAgICBfcmVxdWVzdGVkVXJpID0gVXJpLnBhcnNlKCIkc2NoZW1lOi8vJGhvc3QkdXJpIik7CiAgICB9CiAgICByZXR1cm4gX3JlcXVlc3RlZFVyaTsKICB9CgogIFN0cmluZyBnZXQgbWV0aG9kID0+IF9pbmNvbWluZy5tZXRob2Q7CgogIEh0dHBTZXNzaW9uIGdldCBzZXNzaW9uIHsKICAgIGlmIChfc2Vzc2lvbiAhPSBudWxsKSB7CiAgICAgIGlmIChfc2Vzc2lvbi5fZGVzdHJveWVkKSB7CiAgICAgICAgLy8gSXQncyBkZXN0cm95ZWQsIGNsZWFyIGl0LgogICAgICAgIF9zZXNzaW9uID0gbnVsbDsKICAgICAgICAvLyBDcmVhdGUgbmV3IHNlc3Npb24gb2JqZWN0IGJ5IGNhbGxpbmcgcmVjdXJzaXZlLgogICAgICAgIHJldHVybiBzZXNzaW9uOwogICAgICB9CiAgICAgIC8vIEl0J3MgYWxyZWFkeSBtYXBwZWQsIHVzZSBpdC4KICAgICAgcmV0dXJuIF9zZXNzaW9uOwogICAgfQogICAgLy8gQ3JlYXRlIHNlc3Npb24sIHN0b3JlIGl0IGluIGNvbm5lY3Rpb24sIGFuZCByZXR1cm4uCiAgICByZXR1cm4gX3Nlc3Npb24gPSBfaHR0cFNlcnZlci5fc2Vzc2lvbk1hbmFnZXIuY3JlYXRlU2Vzc2lvbigpOwogIH0KCiAgSHR0cENvbm5lY3Rpb25JbmZvIGdldCBjb25uZWN0aW9uSW5mbyA9PiBfaHR0cENvbm5lY3Rpb24uY29ubmVjdGlvbkluZm87CgogIFg1MDlDZXJ0aWZpY2F0ZSBnZXQgY2VydGlmaWNhdGUgewogICAgdmFyIHNvY2tldCA9IF9odHRwQ29ubmVjdGlvbi5fc29ja2V0OwogICAgaWYgKHNvY2tldCBpcyBTZWN1cmVTb2NrZXQpIHJldHVybiBzb2NrZXQucGVlckNlcnRpZmljYXRlOwogICAgcmV0dXJuIG51bGw7CiAgfQp9CgpjbGFzcyBfSHR0cENsaWVudFJlc3BvbnNlIGV4dGVuZHMgX0h0dHBJbmJvdW5kTWVzc2FnZUxpc3RJbnQKICAgIGltcGxlbWVudHMgSHR0cENsaWVudFJlc3BvbnNlIHsKICBMaXN0PFJlZGlyZWN0SW5mbz4gZ2V0IHJlZGlyZWN0cyA9PiBfaHR0cFJlcXVlc3QuX3Jlc3BvbnNlUmVkaXJlY3RzOwoKICAvLyBUaGUgSHR0cENsaWVudCB0aGlzIHJlc3BvbnNlIGJlbG9uZ3MgdG8uCiAgZmluYWwgX0h0dHBDbGllbnQgX2h0dHBDbGllbnQ7CgogIC8vIFRoZSBIdHRwQ2xpZW50UmVxdWVzdCBvZiB0aGlzIHJlc3BvbnNlLgogIGZpbmFsIF9IdHRwQ2xpZW50UmVxdWVzdCBfaHR0cFJlcXVlc3Q7CgogIC8vIFRoZSBjb21wcmVzc2lvbiBzdGF0ZSBvZiB0aGlzIHJlc3BvbnNlLgogIGZpbmFsIEh0dHBDbGllbnRSZXNwb25zZUNvbXByZXNzaW9uU3RhdGUgY29tcHJlc3Npb25TdGF0ZTsKCiAgX0h0dHBDbGllbnRSZXNwb25zZSgKICAgICAgX0h0dHBJbmNvbWluZyBfaW5jb21pbmcsIHRoaXMuX2h0dHBSZXF1ZXN0LCB0aGlzLl9odHRwQ2xpZW50KQogICAgICA6IGNvbXByZXNzaW9uU3RhdGUgPSBfZ2V0Q29tcHJlc3Npb25TdGF0ZShfaHR0cENsaWVudCwgX2luY29taW5nLmhlYWRlcnMpLAogICAgICAgIHN1cGVyKF9pbmNvbWluZykgewogICAgLy8gU2V0IHVyaSBmb3IgcG90ZW50aWFsIGV4Y2VwdGlvbnMuCiAgICBfaW5jb21pbmcudXJpID0gX2h0dHBSZXF1ZXN0LnVyaTsKICB9CgogIHN0YXRpYyBIdHRwQ2xpZW50UmVzcG9uc2VDb21wcmVzc2lvblN0YXRlIF9nZXRDb21wcmVzc2lvblN0YXRlKAogICAgICBfSHR0cENsaWVudCBodHRwQ2xpZW50LCBfSHR0cEhlYWRlcnMgaGVhZGVycykgewogICAgaWYgKGhlYWRlcnMudmFsdWUoSHR0cEhlYWRlcnMuY29udGVudEVuY29kaW5nSGVhZGVyKSA9PSAiZ3ppcCIpIHsKICAgICAgcmV0dXJuIGh0dHBDbGllbnQuYXV0b1VuY29tcHJlc3MKICAgICAgICAgID8gSHR0cENsaWVudFJlc3BvbnNlQ29tcHJlc3Npb25TdGF0ZS5kZWNvbXByZXNzZWQKICAgICAgICAgIDogSHR0cENsaWVudFJlc3BvbnNlQ29tcHJlc3Npb25TdGF0ZS5jb21wcmVzc2VkOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIEh0dHBDbGllbnRSZXNwb25zZUNvbXByZXNzaW9uU3RhdGUubm90Q29tcHJlc3NlZDsKICAgIH0KICB9CgogIGludCBnZXQgc3RhdHVzQ29kZSA9PiBfaW5jb21pbmcuc3RhdHVzQ29kZTsKICBTdHJpbmcgZ2V0IHJlYXNvblBocmFzZSA9PiBfaW5jb21pbmcucmVhc29uUGhyYXNlOwoKICBYNTA5Q2VydGlmaWNhdGUgZ2V0IGNlcnRpZmljYXRlIHsKICAgIHZhciBzb2NrZXQgPSBfaHR0cFJlcXVlc3QuX2h0dHBDbGllbnRDb25uZWN0aW9uLl9zb2NrZXQ7CiAgICBpZiAoc29ja2V0IGlzIFNlY3VyZVNvY2tldCkgcmV0dXJuIHNvY2tldC5wZWVyQ2VydGlmaWNhdGU7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIExpc3Q8Q29va2llPiBnZXQgY29va2llcyB7CiAgICBpZiAoX2Nvb2tpZXMgIT0gbnVsbCkgcmV0dXJuIF9jb29raWVzOwogICAgX2Nvb2tpZXMgPSBuZXcgTGlzdDxDb29raWU+KCk7CiAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gaGVhZGVyc1tIdHRwSGVhZGVycy5zZXRDb29raWVIZWFkZXJdOwogICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7CiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSkgewogICAgICAgIF9jb29raWVzLmFkZChuZXcgQ29va2llLmZyb21TZXRDb29raWVWYWx1ZSh2YWx1ZSkpOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBfY29va2llczsKICB9CgogIGJvb2wgZ2V0IGlzUmVkaXJlY3QgewogICAgaWYgKF9odHRwUmVxdWVzdC5tZXRob2QgPT0gIkdFVCIgfHwgX2h0dHBSZXF1ZXN0Lm1ldGhvZCA9PSAiSEVBRCIpIHsKICAgICAgcmV0dXJuIHN0YXR1c0NvZGUgPT0gSHR0cFN0YXR1cy5tb3ZlZFBlcm1hbmVudGx5IHx8CiAgICAgICAgICBzdGF0dXNDb2RlID09IEh0dHBTdGF0dXMuZm91bmQgfHwKICAgICAgICAgIHN0YXR1c0NvZGUgPT0gSHR0cFN0YXR1cy5zZWVPdGhlciB8fAogICAgICAgICAgc3RhdHVzQ29kZSA9PSBIdHRwU3RhdHVzLnRlbXBvcmFyeVJlZGlyZWN0OwogICAgfSBlbHNlIGlmIChfaHR0cFJlcXVlc3QubWV0aG9kID09ICJQT1NUIikgewogICAgICByZXR1cm4gc3RhdHVzQ29kZSA9PSBIdHRwU3RhdHVzLnNlZU90aGVyOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRnV0dXJlPEh0dHBDbGllbnRSZXNwb25zZT4gcmVkaXJlY3QoCiAgICAgIFtTdHJpbmcgbWV0aG9kLCBVcmkgdXJsLCBib29sIGZvbGxvd0xvb3BzXSkgewogICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7CiAgICAgIC8vIFNldCBtZXRob2QgYXMgZGVmaW5lZCBieSBSRkMgMjYxNiBzZWN0aW9uIDEwLjMuNC4KICAgICAgaWYgKHN0YXR1c0NvZGUgPT0gSHR0cFN0YXR1cy5zZWVPdGhlciAmJiBfaHR0cFJlcXVlc3QubWV0aG9kID09ICJQT1NUIikgewogICAgICAgIG1ldGhvZCA9ICJHRVQiOwogICAgICB9IGVsc2UgewogICAgICAgIG1ldGhvZCA9IF9odHRwUmVxdWVzdC5tZXRob2Q7CiAgICAgIH0KICAgIH0KICAgIGlmICh1cmwgPT0gbnVsbCkgewogICAgICBTdHJpbmcgbG9jYXRpb24gPSBoZWFkZXJzLnZhbHVlKEh0dHBIZWFkZXJzLmxvY2F0aW9uSGVhZGVyKTsKICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpIHsKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiUmVzcG9uc2UgaGFzIG5vIExvY2F0aW9uIGhlYWRlciBmb3IgcmVkaXJlY3QiKTsKICAgICAgfQogICAgICB1cmwgPSBVcmkucGFyc2UobG9jYXRpb24pOwogICAgfQogICAgaWYgKGZvbGxvd0xvb3BzICE9IHRydWUpIHsKICAgICAgZm9yICh2YXIgcmVkaXJlY3QgaW4gcmVkaXJlY3RzKSB7CiAgICAgICAgaWYgKHJlZGlyZWN0LmxvY2F0aW9uID09IHVybCkgewogICAgICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IoCiAgICAgICAgICAgICAgbmV3IFJlZGlyZWN0RXhjZXB0aW9uKCJSZWRpcmVjdCBsb29wIGRldGVjdGVkIiwgcmVkaXJlY3RzKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2h0dHBDbGllbnQKICAgICAgICAuX29wZW5VcmxGcm9tUmVxdWVzdChtZXRob2QsIHVybCwgX2h0dHBSZXF1ZXN0KQogICAgICAgIC50aGVuKChyZXF1ZXN0KSB7CiAgICAgIHJlcXVlc3QuX3Jlc3BvbnNlUmVkaXJlY3RzCiAgICAgICAgLi5hZGRBbGwodGhpcy5yZWRpcmVjdHMpCiAgICAgICAgLi5hZGQobmV3IF9SZWRpcmVjdEluZm8oc3RhdHVzQ29kZSwgbWV0aG9kLCB1cmwpKTsKICAgICAgcmV0dXJuIHJlcXVlc3QuY2xvc2UoKTsKICAgIH0pOwogIH0KCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFVpbnQ4TGlzdD4gbGlzdGVuKHZvaWQgb25EYXRhKFVpbnQ4TGlzdCBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICBpZiAoX2luY29taW5nLnVwZ3JhZGVkKSB7CiAgICAgIC8vIElmIHVwZ3JhZGVkLCB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5ICdyZW1vdmVkJyBmb3JtIHRoZSBjbGllbnQuCiAgICAgIC8vIFNpbmNlIGxpc3RlbmluZyB0byB1cGdyYWRlZCBkYXRhIGlzICdib2d1cycsIHNpbXBseSBjbG9zZSBhbmQKICAgICAgLy8gcmV0dXJuIGVtcHR5IHN0cmVhbSBzdWJzY3JpcHRpb24uCiAgICAgIF9odHRwUmVxdWVzdC5faHR0cENsaWVudENvbm5lY3Rpb24uZGVzdHJveSgpOwogICAgICByZXR1cm4gbmV3IFN0cmVhbTxVaW50OExpc3Q+LmVtcHR5KCkubGlzdGVuKG51bGwsIG9uRG9uZTogb25Eb25lKTsKICAgIH0KICAgIFN0cmVhbTxVaW50OExpc3Q+IHN0cmVhbSA9IF9pbmNvbWluZzsKICAgIGlmIChjb21wcmVzc2lvblN0YXRlID09IEh0dHBDbGllbnRSZXNwb25zZUNvbXByZXNzaW9uU3RhdGUuZGVjb21wcmVzc2VkKSB7CiAgICAgIHN0cmVhbSA9IHN0cmVhbQogICAgICAgICAgLmNhc3Q8TGlzdDxpbnQ+PigpCiAgICAgICAgICAudHJhbnNmb3JtKGd6aXAuZGVjb2RlcikKICAgICAgICAgIC50cmFuc2Zvcm0oY29uc3QgX1RvVWludDhMaXN0KCkpOwogICAgfQogICAgcmV0dXJuIHN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIEZ1dHVyZTxTb2NrZXQ+IGRldGFjaFNvY2tldCgpIHsKICAgIF9odHRwQ2xpZW50Ll9jb25uZWN0aW9uQ2xvc2VkKF9odHRwUmVxdWVzdC5faHR0cENsaWVudENvbm5lY3Rpb24pOwogICAgcmV0dXJuIF9odHRwUmVxdWVzdC5faHR0cENsaWVudENvbm5lY3Rpb24uZGV0YWNoU29ja2V0KCk7CiAgfQoKICBIdHRwQ29ubmVjdGlvbkluZm8gZ2V0IGNvbm5lY3Rpb25JbmZvID0+IF9odHRwUmVxdWVzdC5jb25uZWN0aW9uSW5mbzsKCiAgYm9vbCBnZXQgX3Nob3VsZEF1dGhlbnRpY2F0ZVByb3h5IHsKICAgIC8vIE9ubHkgdHJ5IHRvIGF1dGhlbnRpY2F0ZSBpZiB0aGVyZSBpcyBhIGNoYWxsZW5nZSBpbiB0aGUgcmVzcG9uc2UuCiAgICBMaXN0PFN0cmluZz4gY2hhbGxlbmdlID0gaGVhZGVyc1tIdHRwSGVhZGVycy5wcm94eUF1dGhlbnRpY2F0ZUhlYWRlcl07CiAgICByZXR1cm4gc3RhdHVzQ29kZSA9PSBIdHRwU3RhdHVzLnByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZCAmJgogICAgICAgIGNoYWxsZW5nZSAhPSBudWxsICYmCiAgICAgICAgY2hhbGxlbmdlLmxlbmd0aCA9PSAxOwogIH0KCiAgYm9vbCBnZXQgX3Nob3VsZEF1dGhlbnRpY2F0ZSB7CiAgICAvLyBPbmx5IHRyeSB0byBhdXRoZW50aWNhdGUgaWYgdGhlcmUgaXMgYSBjaGFsbGVuZ2UgaW4gdGhlIHJlc3BvbnNlLgogICAgTGlzdDxTdHJpbmc+IGNoYWxsZW5nZSA9IGhlYWRlcnNbSHR0cEhlYWRlcnMud3d3QXV0aGVudGljYXRlSGVhZGVyXTsKICAgIHJldHVybiBzdGF0dXNDb2RlID09IEh0dHBTdGF0dXMudW5hdXRob3JpemVkICYmCiAgICAgICAgY2hhbGxlbmdlICE9IG51bGwgJiYKICAgICAgICBjaGFsbGVuZ2UubGVuZ3RoID09IDE7CiAgfQoKICBGdXR1cmU8SHR0cENsaWVudFJlc3BvbnNlPiBfYXV0aGVudGljYXRlKGJvb2wgcHJveHlBdXRoKSB7CiAgICBGdXR1cmU8SHR0cENsaWVudFJlc3BvbnNlPiByZXRyeSgpIHsKICAgICAgLy8gRHJhaW4gYm9keSBhbmQgcmV0cnkuCiAgICAgIHJldHVybiBkcmFpbigpLnRoZW4oKF8pIHsKICAgICAgICByZXR1cm4gX2h0dHBDbGllbnQKICAgICAgICAgICAgLl9vcGVuVXJsRnJvbVJlcXVlc3QoCiAgICAgICAgICAgICAgICBfaHR0cFJlcXVlc3QubWV0aG9kLCBfaHR0cFJlcXVlc3QudXJpLCBfaHR0cFJlcXVlc3QpCiAgICAgICAgICAgIC50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0LmNsb3NlKCkpOwogICAgICB9KTsKICAgIH0KCiAgICBMaXN0PFN0cmluZz4gYXV0aENoYWxsZW5nZSgpIHsKICAgICAgcmV0dXJuIHByb3h5QXV0aAogICAgICAgICAgPyBoZWFkZXJzW0h0dHBIZWFkZXJzLnByb3h5QXV0aGVudGljYXRlSGVhZGVyXQogICAgICAgICAgOiBoZWFkZXJzW0h0dHBIZWFkZXJzLnd3d0F1dGhlbnRpY2F0ZUhlYWRlcl07CiAgICB9CgogICAgX0NyZWRlbnRpYWxzIGZpbmRDcmVkZW50aWFscyhfQXV0aGVudGljYXRpb25TY2hlbWUgc2NoZW1lKSB7CiAgICAgIHJldHVybiBwcm94eUF1dGgKICAgICAgICAgID8gX2h0dHBDbGllbnQuX2ZpbmRQcm94eUNyZWRlbnRpYWxzKF9odHRwUmVxdWVzdC5fcHJveHksIHNjaGVtZSkKICAgICAgICAgIDogX2h0dHBDbGllbnQuX2ZpbmRDcmVkZW50aWFscyhfaHR0cFJlcXVlc3QudXJpLCBzY2hlbWUpOwogICAgfQoKICAgIHZvaWQgcmVtb3ZlQ3JlZGVudGlhbHMoX0NyZWRlbnRpYWxzIGNyKSB7CiAgICAgIGlmIChwcm94eUF1dGgpIHsKICAgICAgICBfaHR0cENsaWVudC5fcmVtb3ZlUHJveHlDcmVkZW50aWFscyhjcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2h0dHBDbGllbnQuX3JlbW92ZUNyZWRlbnRpYWxzKGNyKTsKICAgICAgfQogICAgfQoKICAgIEZ1dHVyZSByZXF1ZXN0QXV0aGVudGljYXRpb24oX0F1dGhlbnRpY2F0aW9uU2NoZW1lIHNjaGVtZSwgU3RyaW5nIHJlYWxtKSB7CiAgICAgIGlmIChwcm94eUF1dGgpIHsKICAgICAgICBpZiAoX2h0dHBDbGllbnQuX2F1dGhlbnRpY2F0ZVByb3h5ID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgdmFyIHByb3h5ID0gX2h0dHBSZXF1ZXN0Ll9wcm94eTsKICAgICAgICByZXR1cm4gX2h0dHBDbGllbnQuX2F1dGhlbnRpY2F0ZVByb3h5KAogICAgICAgICAgICBwcm94eS5ob3N0LCBwcm94eS5wb3J0LCBzY2hlbWUudG9TdHJpbmcoKSwgcmVhbG0pOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChfaHR0cENsaWVudC5fYXV0aGVudGljYXRlID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9odHRwQ2xpZW50Ll9hdXRoZW50aWNhdGUoCiAgICAgICAgICAgIF9odHRwUmVxdWVzdC51cmksIHNjaGVtZS50b1N0cmluZygpLCByZWFsbSk7CiAgICAgIH0KICAgIH0KCiAgICBMaXN0PFN0cmluZz4gY2hhbGxlbmdlID0gYXV0aENoYWxsZW5nZSgpOwogICAgYXNzZXJ0KGNoYWxsZW5nZSAhPSBudWxsIHx8IGNoYWxsZW5nZS5sZW5ndGggPT0gMSk7CiAgICBfSGVhZGVyVmFsdWUgaGVhZGVyID0KICAgICAgICBfSGVhZGVyVmFsdWUucGFyc2UoY2hhbGxlbmdlWzBdLCBwYXJhbWV0ZXJTZXBhcmF0b3I6ICIsIik7CiAgICBfQXV0aGVudGljYXRpb25TY2hlbWUgc2NoZW1lID0KICAgICAgICBuZXcgX0F1dGhlbnRpY2F0aW9uU2NoZW1lLmZyb21TdHJpbmcoaGVhZGVyLnZhbHVlKTsKICAgIFN0cmluZyByZWFsbSA9IGhlYWRlci5wYXJhbWV0ZXJzWyJyZWFsbSJdOwoKICAgIC8vIFNlZSBpZiBhbnkgbWF0Y2hpbmcgY3JlZGVudGlhbHMgYXJlIGF2YWlsYWJsZS4KICAgIF9DcmVkZW50aWFscyBjciA9IGZpbmRDcmVkZW50aWFscyhzY2hlbWUpOwogICAgaWYgKGNyICE9IG51bGwpIHsKICAgICAgLy8gRm9yIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGRvbid0IHJldHJ5IGFscmVhZHkgdXNlZCBjcmVkZW50aWFscwogICAgICAvLyBhcyB0aGV5IG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIHJlcXVlc3QgY2F1c2luZwogICAgICAvLyB0aGlzIGF1dGhlbnRpY2F0ZSByZXNwb25zZS4KICAgICAgaWYgKGNyLnNjaGVtZSA9PSBfQXV0aGVudGljYXRpb25TY2hlbWUuQkFTSUMgJiYgIWNyLnVzZWQpIHsKICAgICAgICAvLyBDcmVkZW50aWFscyB3aGVyZSBmb3VuZCwgcHJlcGFyZSBmb3IgcmV0cnlpbmcgdGhlIHJlcXVlc3QuCiAgICAgICAgcmV0dXJuIHJldHJ5KCk7CiAgICAgIH0KCiAgICAgIC8vIERpZ2VzdCBhdXRoZW50aWNhdGlvbiBvbmx5IHN1cHBvcnRzIHRoZSBNRDUgYWxnb3JpdGhtLgogICAgICBpZiAoY3Iuc2NoZW1lID09IF9BdXRoZW50aWNhdGlvblNjaGVtZS5ESUdFU1QgJiYKICAgICAgICAgIChoZWFkZXIucGFyYW1ldGVyc1siYWxnb3JpdGhtIl0gPT0gbnVsbCB8fAogICAgICAgICAgICAgIGhlYWRlci5wYXJhbWV0ZXJzWyJhbGdvcml0aG0iXS50b0xvd2VyQ2FzZSgpID09ICJtZDUiKSkgewogICAgICAgIGlmIChjci5ub25jZSA9PSBudWxsIHx8IGNyLm5vbmNlID09IGhlYWRlci5wYXJhbWV0ZXJzWyJub25jZSJdKSB7CiAgICAgICAgICAvLyBJZiB0aGUgbm9uY2UgaXMgbm90IHNldCB0aGVuIHRoaXMgaXMgdGhlIGZpcnN0IGF1dGhlbnRpY2F0ZQogICAgICAgICAgLy8gcmVzcG9uc2UgZm9yIHRoZXNlIGNyZWRlbnRpYWxzLiBTZXQgdXAgYXV0aGVudGljYXRpb24gc3RhdGUuCiAgICAgICAgICBpZiAoY3Iubm9uY2UgPT0gbnVsbCkgewogICAgICAgICAgICBjcgogICAgICAgICAgICAgIC4ubm9uY2UgPSBoZWFkZXIucGFyYW1ldGVyc1sibm9uY2UiXQogICAgICAgICAgICAgIC4uYWxnb3JpdGhtID0gIk1ENSIKICAgICAgICAgICAgICAuLnFvcCA9IGhlYWRlci5wYXJhbWV0ZXJzWyJxb3AiXQogICAgICAgICAgICAgIC4ubm9uY2VDb3VudCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDcmVkZW50aWFscyB3aGVyZSBmb3VuZCwgcHJlcGFyZSBmb3IgcmV0cnlpbmcgdGhlIHJlcXVlc3QuCiAgICAgICAgICByZXR1cm4gcmV0cnkoKTsKICAgICAgICB9IGVsc2UgaWYgKGhlYWRlci5wYXJhbWV0ZXJzWyJzdGFsZSJdICE9IG51bGwgJiYKICAgICAgICAgICAgaGVhZGVyLnBhcmFtZXRlcnNbInN0YWxlIl0udG9Mb3dlckNhc2UoKSA9PSAidHJ1ZSIpIHsKICAgICAgICAgIC8vIElmIHN0YWxlIGlzIHRydWUgcmV0cnkgd2l0aCBuZXcgbm9uY2UuCiAgICAgICAgICBjci5ub25jZSA9IGhlYWRlci5wYXJhbWV0ZXJzWyJub25jZSJdOwogICAgICAgICAgLy8gQ3JlZGVudGlhbHMgd2hlcmUgZm91bmQsIHByZXBhcmUgZm9yIHJldHJ5aW5nIHRoZSByZXF1ZXN0LgogICAgICAgICAgcmV0dXJuIHJldHJ5KCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gQXNrIGZvciBtb3JlIGNyZWRlbnRpYWxzIGlmIG5vbmUgZm91bmQgb3IgdGhlIG9uZSBmb3VuZCBoYXMKICAgIC8vIGFscmVhZHkgYmVlbiB1c2VkLiBJZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaXQgbXVzdCBub3cgYmUKICAgIC8vIGludmFsaWQgYW5kIGlzIHJlbW92ZWQuCiAgICBpZiAoY3IgIT0gbnVsbCkgewogICAgICByZW1vdmVDcmVkZW50aWFscyhjcik7CiAgICAgIGNyID0gbnVsbDsKICAgIH0KICAgIHJldHVybiByZXF1ZXN0QXV0aGVudGljYXRpb24oc2NoZW1lLCByZWFsbSkudGhlbigoY3JlZHNBdmFpbGFibGUpIHsKICAgICAgaWYgKGNyZWRzQXZhaWxhYmxlKSB7CiAgICAgICAgY3IgPSBfaHR0cENsaWVudC5fZmluZENyZWRlbnRpYWxzKF9odHRwUmVxdWVzdC51cmksIHNjaGVtZSk7CiAgICAgICAgcmV0dXJuIHJldHJ5KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTm8gY3JlZGVudGlhbHMgYXZhaWxhYmxlLCBjb21wbGV0ZSB3aXRoIG9yaWdpbmFsIHJlc3BvbnNlLgogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICB9KTsKICB9Cn0KCmNsYXNzIF9Ub1VpbnQ4TGlzdCBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIFVpbnQ4TGlzdD4gewogIGNvbnN0IF9Ub1VpbnQ4TGlzdCgpOwoKICBVaW50OExpc3QgY29udmVydChMaXN0PGludD4gaW5wdXQpID0+IFVpbnQ4TGlzdC5mcm9tTGlzdChpbnB1dCk7CgogIFNpbms8TGlzdDxpbnQ+PiBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8VWludDhMaXN0PiBzaW5rKSB7CiAgICByZXR1cm4gX1VpbnQ4TGlzdENvbnZlcnNpb25TaW5rKHNpbmspOwogIH0KfQoKY2xhc3MgX1VpbnQ4TGlzdENvbnZlcnNpb25TaW5rIGltcGxlbWVudHMgU2luazxMaXN0PGludD4+IHsKICBjb25zdCBfVWludDhMaXN0Q29udmVyc2lvblNpbmsodGhpcy5fdGFyZ2V0KTsKCiAgZmluYWwgU2luazxVaW50OExpc3Q+IF90YXJnZXQ7CgogIHZvaWQgYWRkKExpc3Q8aW50PiBkYXRhKSB7CiAgICBfdGFyZ2V0LmFkZChVaW50OExpc3QuZnJvbUxpc3QoZGF0YSkpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIF90YXJnZXQuY2xvc2UoKTsKICB9Cn0KCmNsYXNzIF9TdHJlYW1TaW5rSW1wbDxUPiBpbXBsZW1lbnRzIFN0cmVhbVNpbms8VD4gewogIGZpbmFsIFN0cmVhbUNvbnN1bWVyPFQ+IF90YXJnZXQ7CiAgZmluYWwgQ29tcGxldGVyIF9kb25lQ29tcGxldGVyID0gbmV3IENvbXBsZXRlcigpOwogIFN0cmVhbUNvbnRyb2xsZXI8VD4gX2NvbnRyb2xsZXJJbnN0YW5jZTsKICBDb21wbGV0ZXIgX2NvbnRyb2xsZXJDb21wbGV0ZXI7CiAgYm9vbCBfaXNDbG9zZWQgPSBmYWxzZTsKICBib29sIF9pc0JvdW5kID0gZmFsc2U7CiAgYm9vbCBfaGFzRXJyb3IgPSBmYWxzZTsKCiAgX1N0cmVhbVNpbmtJbXBsKHRoaXMuX3RhcmdldCk7CgogIHZvaWQgYWRkKFQgZGF0YSkgewogICAgaWYgKF9pc0Nsb3NlZCkgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCJTdHJlYW1TaW5rIGlzIGNsb3NlZCIpOwogICAgfQogICAgX2NvbnRyb2xsZXIuYWRkKGRhdGEpOwogIH0KCiAgdm9pZCBhZGRFcnJvcihlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigiU3RyZWFtU2luayBpcyBjbG9zZWQiKTsKICAgIH0KICAgIF9jb250cm9sbGVyLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIEZ1dHVyZSBhZGRTdHJlYW0oU3RyZWFtPFQ+IHN0cmVhbSkgewogICAgaWYgKF9pc0JvdW5kKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJTdHJlYW1TaW5rIGlzIGFscmVhZHkgYm91bmQgdG8gYSBzdHJlYW0iKTsKICAgIH0KICAgIF9pc0JvdW5kID0gdHJ1ZTsKICAgIGlmIChfaGFzRXJyb3IpIHJldHVybiBkb25lOwogICAgLy8gV2FpdCBmb3IgYW55IHN5bmMgb3BlcmF0aW9ucyB0byBjb21wbGV0ZS4KICAgIEZ1dHVyZSB0YXJnZXRBZGRTdHJlYW0oKSB7CiAgICAgIHJldHVybiBfdGFyZ2V0LmFkZFN0cmVhbShzdHJlYW0pLndoZW5Db21wbGV0ZSgoKSB7CiAgICAgICAgX2lzQm91bmQgPSBmYWxzZTsKICAgICAgfSk7CiAgICB9CgogICAgaWYgKF9jb250cm9sbGVySW5zdGFuY2UgPT0gbnVsbCkgcmV0dXJuIHRhcmdldEFkZFN0cmVhbSgpOwogICAgdmFyIGZ1dHVyZSA9IF9jb250cm9sbGVyQ29tcGxldGVyLmZ1dHVyZTsKICAgIF9jb250cm9sbGVySW5zdGFuY2UuY2xvc2UoKTsKICAgIHJldHVybiBmdXR1cmUudGhlbigoXykgPT4gdGFyZ2V0QWRkU3RyZWFtKCkpOwogIH0KCiAgRnV0dXJlIGZsdXNoKCkgewogICAgaWYgKF9pc0JvdW5kKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJTdHJlYW1TaW5rIGlzIGJvdW5kIHRvIGEgc3RyZWFtIik7CiAgICB9CiAgICBpZiAoX2NvbnRyb2xsZXJJbnN0YW5jZSA9PSBudWxsKSByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZSh0aGlzKTsKICAgIC8vIEFkZGluZyBhbiBlbXB0eSBzdHJlYW0tY29udHJvbGxlciB3aWxsIHJldHVybiBhIGZ1dHVyZSB0aGF0IHdpbGwgY29tcGxldGUKICAgIC8vIHdoZW4gYWxsIGRhdGEgaXMgZG9uZS4KICAgIF9pc0JvdW5kID0gdHJ1ZTsKICAgIHZhciBmdXR1cmUgPSBfY29udHJvbGxlckNvbXBsZXRlci5mdXR1cmU7CiAgICBfY29udHJvbGxlckluc3RhbmNlLmNsb3NlKCk7CiAgICByZXR1cm4gZnV0dXJlLndoZW5Db21wbGV0ZSgoKSB7CiAgICAgIF9pc0JvdW5kID0gZmFsc2U7CiAgICB9KTsKICB9CgogIEZ1dHVyZSBjbG9zZSgpIHsKICAgIGlmIChfaXNCb3VuZCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiU3RyZWFtU2luayBpcyBib3VuZCB0byBhIHN0cmVhbSIpOwogICAgfQogICAgaWYgKCFfaXNDbG9zZWQpIHsKICAgICAgX2lzQ2xvc2VkID0gdHJ1ZTsKICAgICAgaWYgKF9jb250cm9sbGVySW5zdGFuY2UgIT0gbnVsbCkgewogICAgICAgIF9jb250cm9sbGVySW5zdGFuY2UuY2xvc2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfY2xvc2VUYXJnZXQoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRvbmU7CiAgfQoKICB2b2lkIF9jbG9zZVRhcmdldCgpIHsKICAgIF90YXJnZXQuY2xvc2UoKS50aGVuKF9jb21wbGV0ZURvbmVWYWx1ZSwgb25FcnJvcjogX2NvbXBsZXRlRG9uZUVycm9yKTsKICB9CgogIEZ1dHVyZSBnZXQgZG9uZSA9PiBfZG9uZUNvbXBsZXRlci5mdXR1cmU7CgogIHZvaWQgX2NvbXBsZXRlRG9uZVZhbHVlKHZhbHVlKSB7CiAgICBpZiAoIV9kb25lQ29tcGxldGVyLmlzQ29tcGxldGVkKSB7CiAgICAgIF9kb25lQ29tcGxldGVyLmNvbXBsZXRlKHZhbHVlKTsKICAgIH0KICB9CgogIHZvaWQgX2NvbXBsZXRlRG9uZUVycm9yKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIGlmICghX2RvbmVDb21wbGV0ZXIuaXNDb21wbGV0ZWQpIHsKICAgICAgX2hhc0Vycm9yID0gdHJ1ZTsKICAgICAgX2RvbmVDb21wbGV0ZXIuY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICB9CiAgfQoKICBTdHJlYW1Db250cm9sbGVyPFQ+IGdldCBfY29udHJvbGxlciB7CiAgICBpZiAoX2lzQm91bmQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlN0cmVhbVNpbmsgaXMgYm91bmQgdG8gYSBzdHJlYW0iKTsKICAgIH0KICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlN0cmVhbVNpbmsgaXMgY2xvc2VkIik7CiAgICB9CiAgICBpZiAoX2NvbnRyb2xsZXJJbnN0YW5jZSA9PSBudWxsKSB7CiAgICAgIF9jb250cm9sbGVySW5zdGFuY2UgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxUPihzeW5jOiB0cnVlKTsKICAgICAgX2NvbnRyb2xsZXJDb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CiAgICAgIF90YXJnZXQuYWRkU3RyZWFtKF9jb250cm9sbGVyLnN0cmVhbSkudGhlbigoXykgewogICAgICAgIGlmIChfaXNCb3VuZCkgewogICAgICAgICAgLy8gQSBuZXcgc3RyZWFtIHRha2VzIG92ZXIgLSBmb3J3YXJkIHZhbHVlcyB0byB0aGF0IHN0cmVhbS4KICAgICAgICAgIF9jb250cm9sbGVyQ29tcGxldGVyLmNvbXBsZXRlKHRoaXMpOwogICAgICAgICAgX2NvbnRyb2xsZXJDb21wbGV0ZXIgPSBudWxsOwogICAgICAgICAgX2NvbnRyb2xsZXJJbnN0YW5jZSA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE5vIG5ldyBzdHJlYW0sIC5jbG9zZSB3YXMgY2FsbGVkLiBDbG9zZSBfdGFyZ2V0LgogICAgICAgICAgX2Nsb3NlVGFyZ2V0KCk7CiAgICAgICAgfQogICAgICB9LCBvbkVycm9yOiAoZXJyb3IsIHN0YWNrVHJhY2UpIHsKICAgICAgICBpZiAoX2lzQm91bmQpIHsKICAgICAgICAgIC8vIEEgbmV3IHN0cmVhbSB0YWtlcyBvdmVyIC0gZm9yd2FyZCBlcnJvcnMgdG8gdGhhdCBzdHJlYW0uCiAgICAgICAgICBfY29udHJvbGxlckNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgICAgIF9jb250cm9sbGVyQ29tcGxldGVyID0gbnVsbDsKICAgICAgICAgIF9jb250cm9sbGVySW5zdGFuY2UgPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBObyBuZXcgc3RyZWFtLiBObyBuZWVkIHRvIGNsb3NlIHRhcmdldCwgYXMgaXQgaGFzIGFscmVhZHkKICAgICAgICAgIC8vIGZhaWxlZC4KICAgICAgICAgIF9jb21wbGV0ZURvbmVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBfY29udHJvbGxlckluc3RhbmNlOwogIH0KfQoKY2xhc3MgX0lPU2lua0ltcGwgZXh0ZW5kcyBfU3RyZWFtU2lua0ltcGw8TGlzdDxpbnQ+PiBpbXBsZW1lbnRzIElPU2luayB7CiAgRW5jb2RpbmcgX2VuY29kaW5nOwogIGJvb2wgX2VuY29kaW5nTXV0YWJsZSA9IHRydWU7CgogIF9JT1NpbmtJbXBsKFN0cmVhbUNvbnN1bWVyPExpc3Q8aW50Pj4gdGFyZ2V0LCB0aGlzLl9lbmNvZGluZykgOiBzdXBlcih0YXJnZXQpOwoKICBFbmNvZGluZyBnZXQgZW5jb2RpbmcgPT4gX2VuY29kaW5nOwoKICB2b2lkIHNldCBlbmNvZGluZyhFbmNvZGluZyB2YWx1ZSkgewogICAgaWYgKCFfZW5jb2RpbmdNdXRhYmxlKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJJT1NpbmsgZW5jb2RpbmcgaXMgbm90IG11dGFibGUiKTsKICAgIH0KICAgIF9lbmNvZGluZyA9IHZhbHVlOwogIH0KCiAgdm9pZCB3cml0ZShPYmplY3Qgb2JqKSB7CiAgICBTdHJpbmcgc3RyaW5nID0gJyRvYmonOwogICAgaWYgKHN0cmluZy5pc0VtcHR5KSByZXR1cm47CiAgICBhZGQoX2VuY29kaW5nLmVuY29kZShzdHJpbmcpKTsKICB9CgogIHZvaWQgd3JpdGVBbGwoSXRlcmFibGUgb2JqZWN0cywgW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pIHsKICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gb2JqZWN0cy5pdGVyYXRvcjsKICAgIGlmICghaXRlcmF0b3IubW92ZU5leHQoKSkgcmV0dXJuOwogICAgaWYgKHNlcGFyYXRvci5pc0VtcHR5KSB7CiAgICAgIGRvIHsKICAgICAgICB3cml0ZShpdGVyYXRvci5jdXJyZW50KTsKICAgICAgfSB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZShpdGVyYXRvci5jdXJyZW50KTsKICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICB3cml0ZShzZXBhcmF0b3IpOwogICAgICAgIHdyaXRlKGl0ZXJhdG9yLmN1cnJlbnQpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlbG4oW09iamVjdCBvYmplY3QgPSAiIl0pIHsKICAgIHdyaXRlKG9iamVjdCk7CiAgICB3cml0ZSgiXG4iKTsKICB9CgogIHZvaWQgd3JpdGVDaGFyQ29kZShpbnQgY2hhckNvZGUpIHsKICAgIHdyaXRlKG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKSk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfSHR0cE91dGJvdW5kTWVzc2FnZTxUPiBleHRlbmRzIF9JT1NpbmtJbXBsIHsKICAvLyBVc2VkIHRvIG1hcmsgd2hlbiB0aGUgYm9keSBzaG91bGQgYmUgd3JpdHRlbi4gVGhpcyBpcyB1c2VkIGZvciBIRUFECiAgLy8gcmVxdWVzdHMgYW5kIGluIGVycm9yIGhhbmRsaW5nLgogIGJvb2wgX2VuY29kaW5nU2V0ID0gZmFsc2U7CgogIGJvb2wgX2J1ZmZlck91dHB1dCA9IHRydWU7CgogIGZpbmFsIFVyaSBfdXJpOwogIGZpbmFsIF9IdHRwT3V0Z29pbmcgX291dGdvaW5nOwoKICBmaW5hbCBfSHR0cEhlYWRlcnMgaGVhZGVyczsKCiAgX0h0dHBPdXRib3VuZE1lc3NhZ2UoVXJpIHVyaSwgU3RyaW5nIHByb3RvY29sVmVyc2lvbiwgX0h0dHBPdXRnb2luZyBvdXRnb2luZywKICAgICAge19IdHRwSGVhZGVycyBpbml0aWFsSGVhZGVyc30pCiAgICAgIDogX3VyaSA9IHVyaSwKICAgICAgICBoZWFkZXJzID0gbmV3IF9IdHRwSGVhZGVycyhwcm90b2NvbFZlcnNpb24sCiAgICAgICAgICAgIGRlZmF1bHRQb3J0Rm9yU2NoZW1lOiB1cmkuc2NoZW1lID09ICdodHRwcycKICAgICAgICAgICAgICAgID8gSHR0cENsaWVudC5kZWZhdWx0SHR0cHNQb3J0CiAgICAgICAgICAgICAgICA6IEh0dHBDbGllbnQuZGVmYXVsdEh0dHBQb3J0LAogICAgICAgICAgICBpbml0aWFsSGVhZGVyczogaW5pdGlhbEhlYWRlcnMpLAogICAgICAgIF9vdXRnb2luZyA9IG91dGdvaW5nLAogICAgICAgIHN1cGVyKG91dGdvaW5nLCBudWxsKSB7CiAgICBfb3V0Z29pbmcub3V0Ym91bmQgPSB0aGlzOwogICAgX2VuY29kaW5nTXV0YWJsZSA9IGZhbHNlOwogIH0KCiAgaW50IGdldCBjb250ZW50TGVuZ3RoID0+IGhlYWRlcnMuY29udGVudExlbmd0aDsKICB2b2lkIHNldCBjb250ZW50TGVuZ3RoKGludCBjb250ZW50TGVuZ3RoKSB7CiAgICBoZWFkZXJzLmNvbnRlbnRMZW5ndGggPSBjb250ZW50TGVuZ3RoOwogIH0KCiAgYm9vbCBnZXQgcGVyc2lzdGVudENvbm5lY3Rpb24gPT4gaGVhZGVycy5wZXJzaXN0ZW50Q29ubmVjdGlvbjsKICB2b2lkIHNldCBwZXJzaXN0ZW50Q29ubmVjdGlvbihib29sIHApIHsKICAgIGhlYWRlcnMucGVyc2lzdGVudENvbm5lY3Rpb24gPSBwOwogIH0KCiAgYm9vbCBnZXQgYnVmZmVyT3V0cHV0ID0+IF9idWZmZXJPdXRwdXQ7CiAgdm9pZCBzZXQgYnVmZmVyT3V0cHV0KGJvb2wgYnVmZmVyT3V0cHV0KSB7CiAgICBpZiAoX291dGdvaW5nLmhlYWRlcnNXcml0dGVuKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiSGVhZGVyIGFscmVhZHkgc2VudCIpOwogICAgX2J1ZmZlck91dHB1dCA9IGJ1ZmZlck91dHB1dDsKICB9CgogIEVuY29kaW5nIGdldCBlbmNvZGluZyB7CiAgICBpZiAoX2VuY29kaW5nU2V0ICYmIF9vdXRnb2luZy5oZWFkZXJzV3JpdHRlbikgewogICAgICByZXR1cm4gX2VuY29kaW5nOwogICAgfQogICAgdmFyIGNoYXJzZXQ7CiAgICBpZiAoaGVhZGVycy5jb250ZW50VHlwZSAhPSBudWxsICYmIGhlYWRlcnMuY29udGVudFR5cGUuY2hhcnNldCAhPSBudWxsKSB7CiAgICAgIGNoYXJzZXQgPSBoZWFkZXJzLmNvbnRlbnRUeXBlLmNoYXJzZXQ7CiAgICB9IGVsc2UgewogICAgICBjaGFyc2V0ID0gImlzby04ODU5LTEiOwogICAgfQogICAgcmV0dXJuIEVuY29kaW5nLmdldEJ5TmFtZShjaGFyc2V0KTsKICB9CgogIHZvaWQgYWRkKExpc3Q8aW50PiBkYXRhKSB7CiAgICBpZiAoZGF0YS5sZW5ndGggPT0gMCkgcmV0dXJuOwogICAgc3VwZXIuYWRkKGRhdGEpOwogIH0KCiAgdm9pZCB3cml0ZShPYmplY3Qgb2JqKSB7CiAgICBpZiAoIV9lbmNvZGluZ1NldCkgewogICAgICBfZW5jb2RpbmcgPSBlbmNvZGluZzsKICAgICAgX2VuY29kaW5nU2V0ID0gdHJ1ZTsKICAgIH0KICAgIHN1cGVyLndyaXRlKG9iaik7CiAgfQoKICB2b2lkIF93cml0ZUhlYWRlcigpOwoKICBib29sIGdldCBfaXNDb25uZWN0aW9uQ2xvc2VkID0+IGZhbHNlOwp9CgpjbGFzcyBfSHR0cFJlc3BvbnNlIGV4dGVuZHMgX0h0dHBPdXRib3VuZE1lc3NhZ2U8SHR0cFJlc3BvbnNlPgogICAgaW1wbGVtZW50cyBIdHRwUmVzcG9uc2UgewogIGludCBfc3RhdHVzQ29kZSA9IDIwMDsKICBTdHJpbmcgX3JlYXNvblBocmFzZTsKICBMaXN0PENvb2tpZT4gX2Nvb2tpZXM7CiAgX0h0dHBSZXF1ZXN0IF9odHRwUmVxdWVzdDsKICBEdXJhdGlvbiBfZGVhZGxpbmU7CiAgVGltZXIgX2RlYWRsaW5lVGltZXI7CgogIF9IdHRwUmVzcG9uc2UoVXJpIHVyaSwgU3RyaW5nIHByb3RvY29sVmVyc2lvbiwgX0h0dHBPdXRnb2luZyBvdXRnb2luZywKICAgICAgSHR0cEhlYWRlcnMgZGVmYXVsdEhlYWRlcnMsIFN0cmluZyBzZXJ2ZXJIZWFkZXIpCiAgICAgIDogc3VwZXIodXJpLCBwcm90b2NvbFZlcnNpb24sIG91dGdvaW5nLCBpbml0aWFsSGVhZGVyczogZGVmYXVsdEhlYWRlcnMpIHsKICAgIGlmIChzZXJ2ZXJIZWFkZXIgIT0gbnVsbCkgaGVhZGVycy5zZXQoJ3NlcnZlcicsIHNlcnZlckhlYWRlcik7CiAgfQoKICBib29sIGdldCBfaXNDb25uZWN0aW9uQ2xvc2VkID0+IF9odHRwUmVxdWVzdC5faHR0cENvbm5lY3Rpb24uX2lzQ2xvc2luZzsKCiAgTGlzdDxDb29raWU+IGdldCBjb29raWVzIHsKICAgIGlmIChfY29va2llcyA9PSBudWxsKSBfY29va2llcyA9IG5ldyBMaXN0PENvb2tpZT4oKTsKICAgIHJldHVybiBfY29va2llczsKICB9CgogIGludCBnZXQgc3RhdHVzQ29kZSA9PiBfc3RhdHVzQ29kZTsKICB2b2lkIHNldCBzdGF0dXNDb2RlKGludCBzdGF0dXNDb2RlKSB7CiAgICBpZiAoX291dGdvaW5nLmhlYWRlcnNXcml0dGVuKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiSGVhZGVyIGFscmVhZHkgc2VudCIpOwogICAgX3N0YXR1c0NvZGUgPSBzdGF0dXNDb2RlOwogIH0KCiAgU3RyaW5nIGdldCByZWFzb25QaHJhc2UgPT4gX2ZpbmRSZWFzb25QaHJhc2Uoc3RhdHVzQ29kZSk7CiAgdm9pZCBzZXQgcmVhc29uUGhyYXNlKFN0cmluZyByZWFzb25QaHJhc2UpIHsKICAgIGlmIChfb3V0Z29pbmcuaGVhZGVyc1dyaXR0ZW4pIHRocm93IG5ldyBTdGF0ZUVycm9yKCJIZWFkZXIgYWxyZWFkeSBzZW50Iik7CiAgICBfcmVhc29uUGhyYXNlID0gcmVhc29uUGhyYXNlOwogIH0KCiAgRnV0dXJlIHJlZGlyZWN0KFVyaSBsb2NhdGlvbiwge2ludCBzdGF0dXM6IEh0dHBTdGF0dXMubW92ZWRUZW1wb3JhcmlseX0pIHsKICAgIGlmIChfb3V0Z29pbmcuaGVhZGVyc1dyaXR0ZW4pIHRocm93IG5ldyBTdGF0ZUVycm9yKCJIZWFkZXIgYWxyZWFkeSBzZW50Iik7CiAgICBzdGF0dXNDb2RlID0gc3RhdHVzOwogICAgaGVhZGVycy5zZXQoImxvY2F0aW9uIiwgbG9jYXRpb24udG9TdHJpbmcoKSk7CiAgICByZXR1cm4gY2xvc2UoKTsKICB9CgogIEZ1dHVyZTxTb2NrZXQ+IGRldGFjaFNvY2tldCh7Ym9vbCB3cml0ZUhlYWRlcnM6IHRydWV9KSB7CiAgICBpZiAoX291dGdvaW5nLmhlYWRlcnNXcml0dGVuKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiSGVhZGVycyBhbHJlYWR5IHNlbnQiKTsKICAgIGRlYWRsaW5lID0gbnVsbDsgLy8gQmUgc3VyZSB0byBzdG9wIGFueSBkZWFkbGluZS4KICAgIHZhciBmdXR1cmUgPSBfaHR0cFJlcXVlc3QuX2h0dHBDb25uZWN0aW9uLmRldGFjaFNvY2tldCgpOwogICAgaWYgKHdyaXRlSGVhZGVycykgewogICAgICB2YXIgaGVhZGVyc0Z1dHVyZSA9CiAgICAgICAgICBfb3V0Z29pbmcud3JpdGVIZWFkZXJzKGRyYWluUmVxdWVzdDogZmFsc2UsIHNldE91dGdvaW5nOiBmYWxzZSk7CiAgICAgIGFzc2VydChoZWFkZXJzRnV0dXJlID09IG51bGwpOwogICAgfSBlbHNlIHsKICAgICAgLy8gSW1pdGF0ZSBoYXZpbmcgd3JpdHRlbiB0aGUgaGVhZGVycy4KICAgICAgX291dGdvaW5nLmhlYWRlcnNXcml0dGVuID0gdHJ1ZTsKICAgIH0KICAgIC8vIENsb3NlIGNvbm5lY3Rpb24gc28gdGhlIHNvY2tldCBpcyAnZnJlZScuCiAgICBjbG9zZSgpOwogICAgZG9uZS5jYXRjaEVycm9yKChfKSB7CiAgICAgIC8vIENhdGNoIGFueSBlcnJvciBvbiBkb25lLCBhcyB0aGV5IGF1dG9tYXRpY2FsbHkgd2lsbCBiZQogICAgICAvLyBwcm9wYWdhdGVkIHRvIHRoZSB3ZWJzb2NrZXQuCiAgICB9KTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICBIdHRwQ29ubmVjdGlvbkluZm8gZ2V0IGNvbm5lY3Rpb25JbmZvID0+IF9odHRwUmVxdWVzdC5jb25uZWN0aW9uSW5mbzsKCiAgRHVyYXRpb24gZ2V0IGRlYWRsaW5lID0+IF9kZWFkbGluZTsKCiAgdm9pZCBzZXQgZGVhZGxpbmUoRHVyYXRpb24gZCkgewogICAgaWYgKF9kZWFkbGluZVRpbWVyICE9IG51bGwpIF9kZWFkbGluZVRpbWVyLmNhbmNlbCgpOwogICAgX2RlYWRsaW5lID0gZDsKCiAgICBpZiAoX2RlYWRsaW5lID09IG51bGwpIHJldHVybjsKICAgIF9kZWFkbGluZVRpbWVyID0gbmV3IFRpbWVyKF9kZWFkbGluZSwgKCkgewogICAgICBfaHR0cFJlcXVlc3QuX2h0dHBDb25uZWN0aW9uLmRlc3Ryb3koKTsKICAgIH0pOwogIH0KCiAgdm9pZCBfd3JpdGVIZWFkZXIoKSB7CiAgICBCeXRlc0J1aWxkZXIgYnVmZmVyID0gbmV3IF9Db3B5aW5nQnl0ZXNCdWlsZGVyKF9PVVRHT0lOR19CVUZGRVJfU0laRSk7CgogICAgLy8gV3JpdGUgc3RhdHVzIGxpbmUuCiAgICBpZiAoaGVhZGVycy5wcm90b2NvbFZlcnNpb24gPT0gIjEuMSIpIHsKICAgICAgYnVmZmVyLmFkZChfQ29uc3QuSFRUUDExKTsKICAgIH0gZWxzZSB7CiAgICAgIGJ1ZmZlci5hZGQoX0NvbnN0LkhUVFAxMCk7CiAgICB9CiAgICBidWZmZXIuYWRkQnl0ZShfQ2hhckNvZGUuU1ApOwogICAgYnVmZmVyLmFkZChzdGF0dXNDb2RlLnRvU3RyaW5nKCkuY29kZVVuaXRzKTsKICAgIGJ1ZmZlci5hZGRCeXRlKF9DaGFyQ29kZS5TUCk7CiAgICBidWZmZXIuYWRkKHJlYXNvblBocmFzZS5jb2RlVW5pdHMpOwogICAgYnVmZmVyLmFkZEJ5dGUoX0NoYXJDb2RlLkNSKTsKICAgIGJ1ZmZlci5hZGRCeXRlKF9DaGFyQ29kZS5MRik7CgogICAgdmFyIHNlc3Npb24gPSBfaHR0cFJlcXVlc3QuX3Nlc3Npb247CiAgICBpZiAoc2Vzc2lvbiAhPSBudWxsICYmICFzZXNzaW9uLl9kZXN0cm95ZWQpIHsKICAgICAgLy8gTWFyayBhcyBub3QgbmV3LgogICAgICBzZXNzaW9uLl9pc05ldyA9IGZhbHNlOwogICAgICAvLyBNYWtlIHN1cmUgd2Ugb25seSBzZW5kIHRoZSBjdXJyZW50IHNlc3Npb24gaWQuCiAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGNvb2tpZXNbaV0ubmFtZS50b1VwcGVyQ2FzZSgpID09IF9EQVJUX1NFU1NJT05fSUQpIHsKICAgICAgICAgIGNvb2tpZXNbaV0KICAgICAgICAgICAgLi52YWx1ZSA9IHNlc3Npb24uaWQKICAgICAgICAgICAgLi5odHRwT25seSA9IHRydWUKICAgICAgICAgICAgLi5wYXRoID0gIi8iOwogICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgdmFyIGNvb2tpZSA9IG5ldyBDb29raWUoX0RBUlRfU0VTU0lPTl9JRCwgc2Vzc2lvbi5pZCk7CiAgICAgICAgY29va2llcy5hZGQoY29va2llCiAgICAgICAgICAuLmh0dHBPbmx5ID0gdHJ1ZQogICAgICAgICAgLi5wYXRoID0gIi8iKTsKICAgICAgfQogICAgfQogICAgLy8gQWRkIGFsbCB0aGUgY29va2llcyBzZXQgdG8gdGhlIGhlYWRlcnMuCiAgICBpZiAoX2Nvb2tpZXMgIT0gbnVsbCkgewogICAgICBfY29va2llcy5mb3JFYWNoKChjb29raWUpIHsKICAgICAgICBoZWFkZXJzLmFkZChIdHRwSGVhZGVycy5zZXRDb29raWVIZWFkZXIsIGNvb2tpZSk7CiAgICAgIH0pOwogICAgfQoKICAgIGhlYWRlcnMuX2ZpbmFsaXplKCk7CgogICAgLy8gV3JpdGUgaGVhZGVycy4KICAgIGhlYWRlcnMuX2J1aWxkKGJ1ZmZlcik7CiAgICBidWZmZXIuYWRkQnl0ZShfQ2hhckNvZGUuQ1IpOwogICAgYnVmZmVyLmFkZEJ5dGUoX0NoYXJDb2RlLkxGKTsKICAgIFVpbnQ4TGlzdCBoZWFkZXJCeXRlcyA9IGJ1ZmZlci50YWtlQnl0ZXMoKTsKICAgIF9vdXRnb2luZy5zZXRIZWFkZXIoaGVhZGVyQnl0ZXMsIGhlYWRlckJ5dGVzLmxlbmd0aCk7CiAgfQoKICBTdHJpbmcgX2ZpbmRSZWFzb25QaHJhc2UoaW50IHN0YXR1c0NvZGUpIHsKICAgIGlmIChfcmVhc29uUGhyYXNlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIF9yZWFzb25QaHJhc2U7CiAgICB9CgogICAgc3dpdGNoIChzdGF0dXNDb2RlKSB7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5jb250aW51ZV86CiAgICAgICAgcmV0dXJuICJDb250aW51ZSI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5zd2l0Y2hpbmdQcm90b2NvbHM6CiAgICAgICAgcmV0dXJuICJTd2l0Y2hpbmcgUHJvdG9jb2xzIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLm9rOgogICAgICAgIHJldHVybiAiT0siOwogICAgICBjYXNlIEh0dHBTdGF0dXMuY3JlYXRlZDoKICAgICAgICByZXR1cm4gIkNyZWF0ZWQiOwogICAgICBjYXNlIEh0dHBTdGF0dXMuYWNjZXB0ZWQ6CiAgICAgICAgcmV0dXJuICJBY2NlcHRlZCI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5ub25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb246CiAgICAgICAgcmV0dXJuICJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvbiI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5ub0NvbnRlbnQ6CiAgICAgICAgcmV0dXJuICJObyBDb250ZW50IjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnJlc2V0Q29udGVudDoKICAgICAgICByZXR1cm4gIlJlc2V0IENvbnRlbnQiOwogICAgICBjYXNlIEh0dHBTdGF0dXMucGFydGlhbENvbnRlbnQ6CiAgICAgICAgcmV0dXJuICJQYXJ0aWFsIENvbnRlbnQiOwogICAgICBjYXNlIEh0dHBTdGF0dXMubXVsdGlwbGVDaG9pY2VzOgogICAgICAgIHJldHVybiAiTXVsdGlwbGUgQ2hvaWNlcyI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5tb3ZlZFBlcm1hbmVudGx5OgogICAgICAgIHJldHVybiAiTW92ZWQgUGVybWFuZW50bHkiOwogICAgICBjYXNlIEh0dHBTdGF0dXMuZm91bmQ6CiAgICAgICAgcmV0dXJuICJGb3VuZCI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5zZWVPdGhlcjoKICAgICAgICByZXR1cm4gIlNlZSBPdGhlciI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5ub3RNb2RpZmllZDoKICAgICAgICByZXR1cm4gIk5vdCBNb2RpZmllZCI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy51c2VQcm94eToKICAgICAgICByZXR1cm4gIlVzZSBQcm94eSI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy50ZW1wb3JhcnlSZWRpcmVjdDoKICAgICAgICByZXR1cm4gIlRlbXBvcmFyeSBSZWRpcmVjdCI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5iYWRSZXF1ZXN0OgogICAgICAgIHJldHVybiAiQmFkIFJlcXVlc3QiOwogICAgICBjYXNlIEh0dHBTdGF0dXMudW5hdXRob3JpemVkOgogICAgICAgIHJldHVybiAiVW5hdXRob3JpemVkIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnBheW1lbnRSZXF1aXJlZDoKICAgICAgICByZXR1cm4gIlBheW1lbnQgUmVxdWlyZWQiOwogICAgICBjYXNlIEh0dHBTdGF0dXMuZm9yYmlkZGVuOgogICAgICAgIHJldHVybiAiRm9yYmlkZGVuIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLm5vdEZvdW5kOgogICAgICAgIHJldHVybiAiTm90IEZvdW5kIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLm1ldGhvZE5vdEFsbG93ZWQ6CiAgICAgICAgcmV0dXJuICJNZXRob2QgTm90IEFsbG93ZWQiOwogICAgICBjYXNlIEh0dHBTdGF0dXMubm90QWNjZXB0YWJsZToKICAgICAgICByZXR1cm4gIk5vdCBBY2NlcHRhYmxlIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDoKICAgICAgICByZXR1cm4gIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnJlcXVlc3RUaW1lb3V0OgogICAgICAgIHJldHVybiAiUmVxdWVzdCBUaW1lLW91dCI7CiAgICAgIGNhc2UgSHR0cFN0YXR1cy5jb25mbGljdDoKICAgICAgICByZXR1cm4gIkNvbmZsaWN0IjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLmdvbmU6CiAgICAgICAgcmV0dXJuICJHb25lIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLmxlbmd0aFJlcXVpcmVkOgogICAgICAgIHJldHVybiAiTGVuZ3RoIFJlcXVpcmVkIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnByZWNvbmRpdGlvbkZhaWxlZDoKICAgICAgICByZXR1cm4gIlByZWNvbmRpdGlvbiBGYWlsZWQiOwogICAgICBjYXNlIEh0dHBTdGF0dXMucmVxdWVzdEVudGl0eVRvb0xhcmdlOgogICAgICAgIHJldHVybiAiUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnJlcXVlc3RVcmlUb29Mb25nOgogICAgICAgIHJldHVybiAiUmVxdWVzdC1VUkkgVG9vIExvbmciOwogICAgICBjYXNlIEh0dHBTdGF0dXMudW5zdXBwb3J0ZWRNZWRpYVR5cGU6CiAgICAgICAgcmV0dXJuICJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnJlcXVlc3RlZFJhbmdlTm90U2F0aXNmaWFibGU6CiAgICAgICAgcmV0dXJuICJSZXF1ZXN0ZWQgcmFuZ2Ugbm90IHNhdGlzZmlhYmxlIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLmV4cGVjdGF0aW9uRmFpbGVkOgogICAgICAgIHJldHVybiAiRXhwZWN0YXRpb24gRmFpbGVkIjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLmludGVybmFsU2VydmVyRXJyb3I6CiAgICAgICAgcmV0dXJuICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiOwogICAgICBjYXNlIEh0dHBTdGF0dXMubm90SW1wbGVtZW50ZWQ6CiAgICAgICAgcmV0dXJuICJOb3QgSW1wbGVtZW50ZWQiOwogICAgICBjYXNlIEh0dHBTdGF0dXMuYmFkR2F0ZXdheToKICAgICAgICByZXR1cm4gIkJhZCBHYXRld2F5IjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLnNlcnZpY2VVbmF2YWlsYWJsZToKICAgICAgICByZXR1cm4gIlNlcnZpY2UgVW5hdmFpbGFibGUiOwogICAgICBjYXNlIEh0dHBTdGF0dXMuZ2F0ZXdheVRpbWVvdXQ6CiAgICAgICAgcmV0dXJuICJHYXRld2F5IFRpbWUtb3V0IjsKICAgICAgY2FzZSBIdHRwU3RhdHVzLmh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOgogICAgICAgIHJldHVybiAiSHR0cCBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQiOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAiU3RhdHVzICRzdGF0dXNDb2RlIjsKICAgIH0KICB9Cn0KCmNsYXNzIF9IdHRwQ2xpZW50UmVxdWVzdCBleHRlbmRzIF9IdHRwT3V0Ym91bmRNZXNzYWdlPEh0dHBDbGllbnRSZXNwb25zZT4KICAgIGltcGxlbWVudHMgSHR0cENsaWVudFJlcXVlc3QgewogIGZpbmFsIFN0cmluZyBtZXRob2Q7CiAgZmluYWwgVXJpIHVyaTsKICBmaW5hbCBMaXN0PENvb2tpZT4gY29va2llcyA9IG5ldyBMaXN0PENvb2tpZT4oKTsKCiAgLy8gVGhlIEh0dHBDbGllbnQgdGhpcyByZXF1ZXN0IGJlbG9uZ3MgdG8uCiAgZmluYWwgX0h0dHBDbGllbnQgX2h0dHBDbGllbnQ7CiAgZmluYWwgX0h0dHBDbGllbnRDb25uZWN0aW9uIF9odHRwQ2xpZW50Q29ubmVjdGlvbjsKCiAgZmluYWwgQ29tcGxldGVyPEh0dHBDbGllbnRSZXNwb25zZT4gX3Jlc3BvbnNlQ29tcGxldGVyID0KICAgICAgbmV3IENvbXBsZXRlcjxIdHRwQ2xpZW50UmVzcG9uc2U+KCk7CgogIGZpbmFsIF9Qcm94eSBfcHJveHk7CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVzcG9uc2U+IF9yZXNwb25zZTsKCiAgLy8gVE9ETyhham9obnNlbik6IEdldCBkZWZhdWx0IHZhbHVlIGZyb20gY2xpZW50PwogIGJvb2wgX2ZvbGxvd1JlZGlyZWN0cyA9IHRydWU7CgogIGludCBfbWF4UmVkaXJlY3RzID0gNTsKCiAgTGlzdDxSZWRpcmVjdEluZm8+IF9yZXNwb25zZVJlZGlyZWN0cyA9IFtdOwoKICBfSHR0cENsaWVudFJlcXVlc3QoX0h0dHBPdXRnb2luZyBvdXRnb2luZywgVXJpIHVyaSwgdGhpcy5tZXRob2QsIHRoaXMuX3Byb3h5LAogICAgICB0aGlzLl9odHRwQ2xpZW50LCB0aGlzLl9odHRwQ2xpZW50Q29ubmVjdGlvbikKICAgICAgOiB1cmkgPSB1cmksCiAgICAgICAgc3VwZXIodXJpLCAiMS4xIiwgb3V0Z29pbmcpIHsKICAgIC8vIEdFVCBhbmQgSEVBRCBoYXZlICdjb250ZW50LWxlbmd0aDogMCcgYnkgZGVmYXVsdC4KICAgIGlmIChtZXRob2QgPT0gIkdFVCIgfHwgbWV0aG9kID09ICJIRUFEIikgewogICAgICBjb250ZW50TGVuZ3RoID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGhlYWRlcnMuY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcgPSB0cnVlOwogICAgfQogIH0KCiAgRnV0dXJlPEh0dHBDbGllbnRSZXNwb25zZT4gZ2V0IGRvbmUgewogICAgaWYgKF9yZXNwb25zZSA9PSBudWxsKSB7CiAgICAgIF9yZXNwb25zZSA9CiAgICAgICAgICBGdXR1cmUud2FpdChbX3Jlc3BvbnNlQ29tcGxldGVyLmZ1dHVyZSwgc3VwZXIuZG9uZV0sIGVhZ2VyRXJyb3I6IHRydWUpCiAgICAgICAgICAgICAgLnRoZW4oKGxpc3QpID0+IGxpc3RbMF0pOwogICAgfQogICAgcmV0dXJuIF9yZXNwb25zZTsKICB9CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVzcG9uc2U+IGNsb3NlKCkgewogICAgc3VwZXIuY2xvc2UoKTsKICAgIHJldHVybiBkb25lOwogIH0KCiAgaW50IGdldCBtYXhSZWRpcmVjdHMgPT4gX21heFJlZGlyZWN0czsKICB2b2lkIHNldCBtYXhSZWRpcmVjdHMoaW50IG1heFJlZGlyZWN0cykgewogICAgaWYgKF9vdXRnb2luZy5oZWFkZXJzV3JpdHRlbikgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlJlcXVlc3QgYWxyZWFkeSBzZW50Iik7CiAgICBfbWF4UmVkaXJlY3RzID0gbWF4UmVkaXJlY3RzOwogIH0KCiAgYm9vbCBnZXQgZm9sbG93UmVkaXJlY3RzID0+IF9mb2xsb3dSZWRpcmVjdHM7CiAgdm9pZCBzZXQgZm9sbG93UmVkaXJlY3RzKGJvb2wgZm9sbG93UmVkaXJlY3RzKSB7CiAgICBpZiAoX291dGdvaW5nLmhlYWRlcnNXcml0dGVuKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiUmVxdWVzdCBhbHJlYWR5IHNlbnQiKTsKICAgIF9mb2xsb3dSZWRpcmVjdHMgPSBmb2xsb3dSZWRpcmVjdHM7CiAgfQoKICBIdHRwQ29ubmVjdGlvbkluZm8gZ2V0IGNvbm5lY3Rpb25JbmZvID0+IF9odHRwQ2xpZW50Q29ubmVjdGlvbi5jb25uZWN0aW9uSW5mbzsKCiAgdm9pZCBfb25JbmNvbWluZyhfSHR0cEluY29taW5nIGluY29taW5nKSB7CiAgICB2YXIgcmVzcG9uc2UgPSBuZXcgX0h0dHBDbGllbnRSZXNwb25zZShpbmNvbWluZywgdGhpcywgX2h0dHBDbGllbnQpOwogICAgRnV0dXJlPEh0dHBDbGllbnRSZXNwb25zZT4gZnV0dXJlOwogICAgaWYgKGZvbGxvd1JlZGlyZWN0cyAmJiByZXNwb25zZS5pc1JlZGlyZWN0KSB7CiAgICAgIGlmIChyZXNwb25zZS5yZWRpcmVjdHMubGVuZ3RoIDwgbWF4UmVkaXJlY3RzKSB7CiAgICAgICAgLy8gUmVkaXJlY3QgYW5kIGRyYWluIHJlc3BvbnNlLgogICAgICAgIGZ1dHVyZSA9IHJlc3BvbnNlCiAgICAgICAgICAgIC5kcmFpbigpCiAgICAgICAgICAgIC50aGVuPEh0dHBDbGllbnRSZXNwb25zZT4oKF8pID0+IHJlc3BvbnNlLnJlZGlyZWN0KCkpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEVuZCB3aXRoIGV4Y2VwdGlvbiwgdG9vIG1hbnkgcmVkaXJlY3RzLgogICAgICAgIGZ1dHVyZSA9IHJlc3BvbnNlLmRyYWluKCkudGhlbjxIdHRwQ2xpZW50UmVzcG9uc2U+KChfKSB7CiAgICAgICAgICByZXR1cm4gbmV3IEZ1dHVyZTxIdHRwQ2xpZW50UmVzcG9uc2U+LmVycm9yKG5ldyBSZWRpcmVjdEV4Y2VwdGlvbigKICAgICAgICAgICAgICAiUmVkaXJlY3QgbGltaXQgZXhjZWVkZWQiLCByZXNwb25zZS5yZWRpcmVjdHMpKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSBlbHNlIGlmIChyZXNwb25zZS5fc2hvdWxkQXV0aGVudGljYXRlUHJveHkpIHsKICAgICAgZnV0dXJlID0gcmVzcG9uc2UuX2F1dGhlbnRpY2F0ZSh0cnVlKTsKICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuX3Nob3VsZEF1dGhlbnRpY2F0ZSkgewogICAgICBmdXR1cmUgPSByZXNwb25zZS5fYXV0aGVudGljYXRlKGZhbHNlKTsKICAgIH0gZWxzZSB7CiAgICAgIGZ1dHVyZSA9IG5ldyBGdXR1cmU8SHR0cENsaWVudFJlc3BvbnNlPi52YWx1ZShyZXNwb25zZSk7CiAgICB9CiAgICBmdXR1cmUudGhlbigodikgPT4gX3Jlc3BvbnNlQ29tcGxldGVyLmNvbXBsZXRlKHYpLAogICAgICAgIG9uRXJyb3I6IF9yZXNwb25zZUNvbXBsZXRlci5jb21wbGV0ZUVycm9yKTsKICB9CgogIHZvaWQgX29uRXJyb3IoZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgX3Jlc3BvbnNlQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgLy8gR2VuZXJhdGUgdGhlIHJlcXVlc3QgVVJJIGJhc2VkIG9uIHRoZSBtZXRob2QgYW5kIHByb3h5LgogIFN0cmluZyBfcmVxdWVzdFVyaSgpIHsKICAgIC8vIEdlbmVyYXRlIHRoZSByZXF1ZXN0IFVSSSBzdGFydGluZyBmcm9tIHRoZSBwYXRoIGNvbXBvbmVudC4KICAgIFN0cmluZyB1cmlTdGFydGluZ0Zyb21QYXRoKCkgewogICAgICBTdHJpbmcgcmVzdWx0ID0gdXJpLnBhdGg7CiAgICAgIGlmIChyZXN1bHQuaXNFbXB0eSkgcmVzdWx0ID0gIi8iOwogICAgICBpZiAodXJpLmhhc1F1ZXJ5KSB7CiAgICAgICAgcmVzdWx0ID0gIiR7cmVzdWx0fT8ke3VyaS5xdWVyeX0iOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgaWYgKF9wcm94eS5pc0RpcmVjdCkgewogICAgICByZXR1cm4gdXJpU3RhcnRpbmdGcm9tUGF0aCgpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKG1ldGhvZCA9PSAiQ09OTkVDVCIpIHsKICAgICAgICAvLyBGb3IgdGhlIGNvbm5lY3QgbWV0aG9kIHRoZSByZXF1ZXN0IFVSSSBpcyB0aGUgaG9zdDpwb3J0IG9mCiAgICAgICAgLy8gdGhlIHJlcXVlc3RlZCBkZXN0aW5hdGlvbiBvZiB0aGUgdHVubmVsIChzZWUgUkZDIDI4MTcKICAgICAgICAvLyBzZWN0aW9uIDUuMikKICAgICAgICByZXR1cm4gIiR7dXJpLmhvc3R9OiR7dXJpLnBvcnR9IjsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoX2h0dHBDbGllbnRDb25uZWN0aW9uLl9wcm94eVR1bm5lbCkgewogICAgICAgICAgcmV0dXJuIHVyaVN0YXJ0aW5nRnJvbVBhdGgoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHVyaS5yZW1vdmVGcmFnbWVudCgpLnRvU3RyaW5nKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIF93cml0ZUhlYWRlcigpIHsKICAgIEJ5dGVzQnVpbGRlciBidWZmZXIgPSBuZXcgX0NvcHlpbmdCeXRlc0J1aWxkZXIoX09VVEdPSU5HX0JVRkZFUl9TSVpFKTsKCiAgICAvLyBXcml0ZSB0aGUgcmVxdWVzdCBtZXRob2QuCiAgICBidWZmZXIuYWRkKG1ldGhvZC5jb2RlVW5pdHMpOwogICAgYnVmZmVyLmFkZEJ5dGUoX0NoYXJDb2RlLlNQKTsKICAgIC8vIFdyaXRlIHRoZSByZXF1ZXN0IFVSSS4KICAgIGJ1ZmZlci5hZGQoX3JlcXVlc3RVcmkoKS5jb2RlVW5pdHMpOwogICAgYnVmZmVyLmFkZEJ5dGUoX0NoYXJDb2RlLlNQKTsKICAgIC8vIFdyaXRlIEhUVFAvMS4xLgogICAgYnVmZmVyLmFkZChfQ29uc3QuSFRUUDExKTsKICAgIGJ1ZmZlci5hZGRCeXRlKF9DaGFyQ29kZS5DUik7CiAgICBidWZmZXIuYWRkQnl0ZShfQ2hhckNvZGUuTEYpOwoKICAgIC8vIEFkZCB0aGUgY29va2llcyB0byB0aGUgaGVhZGVycy4KICAgIGlmICghY29va2llcy5pc0VtcHR5KSB7CiAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGkgPiAwKSBzYi53cml0ZSgiOyAiKTsKICAgICAgICBzYi4ud3JpdGUoY29va2llc1tpXS5uYW1lKS4ud3JpdGUoIj0iKS4ud3JpdGUoY29va2llc1tpXS52YWx1ZSk7CiAgICAgIH0KICAgICAgaGVhZGVycy5hZGQoSHR0cEhlYWRlcnMuY29va2llSGVhZGVyLCBzYi50b1N0cmluZygpKTsKICAgIH0KCiAgICBoZWFkZXJzLl9maW5hbGl6ZSgpOwoKICAgIC8vIFdyaXRlIGhlYWRlcnMuCiAgICBoZWFkZXJzLl9idWlsZChidWZmZXIpOwogICAgYnVmZmVyLmFkZEJ5dGUoX0NoYXJDb2RlLkNSKTsKICAgIGJ1ZmZlci5hZGRCeXRlKF9DaGFyQ29kZS5MRik7CiAgICBVaW50OExpc3QgaGVhZGVyQnl0ZXMgPSBidWZmZXIudGFrZUJ5dGVzKCk7CiAgICBfb3V0Z29pbmcuc2V0SGVhZGVyKGhlYWRlckJ5dGVzLCBoZWFkZXJCeXRlcy5sZW5ndGgpOwogIH0KfQoKLy8gVXNlZCBieSBfSHR0cE91dGdvaW5nIGFzIGEgdGFyZ2V0IG9mIGEgY2h1bmtlZCBjb252ZXJ0ZXIgZm9yIGd6aXAKLy8gY29tcHJlc3Npb24uCmNsYXNzIF9IdHRwR1ppcFNpbmsgZXh0ZW5kcyBCeXRlQ29udmVyc2lvblNpbmsgewogIGZpbmFsIF9CeXRlc0NvbnN1bWVyIF9jb25zdW1lOwogIF9IdHRwR1ppcFNpbmsodGhpcy5fY29uc3VtZSk7CgogIHZvaWQgYWRkKExpc3Q8aW50PiBjaHVuaykgewogICAgX2NvbnN1bWUoY2h1bmspOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGlmIChjaHVuayBpcyBVaW50OExpc3QpIHsKICAgICAgX2NvbnN1bWUobmV3IFVpbnQ4TGlzdC52aWV3KGNodW5rLmJ1ZmZlciwgc3RhcnQsIGVuZCAtIHN0YXJ0KSk7CiAgICB9IGVsc2UgewogICAgICBfY29uc3VtZShjaHVuay5zdWJsaXN0KHN0YXJ0LCBlbmQgLSBzdGFydCkpOwogICAgfQogIH0KCiAgdm9pZCBjbG9zZSgpIHt9Cn0KCi8vIFRoZSBfSHR0cE91dGdvaW5nIGhhbmRsZXMgYWxsIG9mIHRoZSBmb2xsb3dpbmc6Ci8vICAtIEJ1ZmZlcmluZwovLyAgLSBHWmlwIGNvbXByZXNzaW9uCi8vICAtIENvbnRlbnQtTGVuZ3RoIHZhbGlkYXRpb24uCi8vICAtIEVycm9ycy4KLy8KLy8gTW9zdCBub3RhYmxlIGlzIHRoZSBHWmlwIGNvbXByZXNzaW9uLCB0aGF0IHVzZXMgYSBkb3VibGUtYnVmZmVyaW5nIHN5c3RlbSwKLy8gb25lIGJlZm9yZSBnemlwIChfZ3ppcEJ1ZmZlcikgYW5kIG9uZSBhZnRlciAoX2J1ZmZlcikuCmNsYXNzIF9IdHRwT3V0Z29pbmcgaW1wbGVtZW50cyBTdHJlYW1Db25zdW1lcjxMaXN0PGludD4+IHsKICBzdGF0aWMgY29uc3QgTGlzdDxpbnQ+IF9mb290ZXJBbmRDaHVuazBMZW5ndGggPSBjb25zdCBbCiAgICBfQ2hhckNvZGUuQ1IsCiAgICBfQ2hhckNvZGUuTEYsCiAgICAweDMwLAogICAgX0NoYXJDb2RlLkNSLAogICAgX0NoYXJDb2RlLkxGLAogICAgX0NoYXJDb2RlLkNSLAogICAgX0NoYXJDb2RlLkxGCiAgXTsKCiAgc3RhdGljIGNvbnN0IExpc3Q8aW50PiBfY2h1bmswTGVuZ3RoID0gY29uc3QgWwogICAgMHgzMCwKICAgIF9DaGFyQ29kZS5DUiwKICAgIF9DaGFyQ29kZS5MRiwKICAgIF9DaGFyQ29kZS5DUiwKICAgIF9DaGFyQ29kZS5MRgogIF07CgogIGZpbmFsIENvbXBsZXRlcjxTb2NrZXQ+IF9kb25lQ29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxTb2NrZXQ+KCk7CiAgZmluYWwgU29ja2V0IHNvY2tldDsKCiAgYm9vbCBpZ25vcmVCb2R5ID0gZmFsc2U7CiAgYm9vbCBoZWFkZXJzV3JpdHRlbiA9IGZhbHNlOwoKICBVaW50OExpc3QgX2J1ZmZlcjsKICBpbnQgX2xlbmd0aCA9IDA7CgogIEZ1dHVyZSBfY2xvc2VGdXR1cmU7CgogIGJvb2wgY2h1bmtlZCA9IGZhbHNlOwogIGludCBfcGVuZGluZ0NodW5rZWRGb290ZXIgPSAwOwoKICBpbnQgY29udGVudExlbmd0aDsKICBpbnQgX2J5dGVzV3JpdHRlbiA9IDA7CgogIGJvb2wgX2d6aXAgPSBmYWxzZTsKICBCeXRlQ29udmVyc2lvblNpbmsgX2d6aXBTaW5rOwogIC8vIF9nemlwQWRkIGlzIHNldCBpZmYgdGhlIHNpbmsgaXMgYmVpbmcgYWRkZWQgdG8uIEl0J3MgdXNlZCB0byBzcGVjaWZ5IHdoZXJlCiAgLy8gZ3ppcHBlZCBkYXRhIHNob3VsZCBiZSB0YWtlbiAoc29tZXRpbWVzIGEgY29udHJvbGxlciwgc29tZXRpbWVzIGEgc29ja2V0KS4KICBfQnl0ZXNDb25zdW1lciBfZ3ppcEFkZDsKICBVaW50OExpc3QgX2d6aXBCdWZmZXI7CiAgaW50IF9nemlwQnVmZmVyTGVuZ3RoID0gMDsKCiAgYm9vbCBfc29ja2V0RXJyb3IgPSBmYWxzZTsKCiAgX0h0dHBPdXRib3VuZE1lc3NhZ2Ugb3V0Ym91bmQ7CgogIF9IdHRwT3V0Z29pbmcodGhpcy5zb2NrZXQpOwoKICAvLyBSZXR1cm5zIGVpdGhlciBhIGZ1dHVyZSBvciAnbnVsbCcsIGlmIGl0IHdhcyBhYmxlIHRvIHdyaXRlIGhlYWRlcnMKICAvLyBpbW1lZGlhdGVseS4KICBGdXR1cmUgd3JpdGVIZWFkZXJzKHtib29sIGRyYWluUmVxdWVzdDogdHJ1ZSwgYm9vbCBzZXRPdXRnb2luZzogdHJ1ZX0pIHsKICAgIGlmIChoZWFkZXJzV3JpdHRlbikgcmV0dXJuIG51bGw7CiAgICBoZWFkZXJzV3JpdHRlbiA9IHRydWU7CiAgICBGdXR1cmUgZHJhaW5GdXR1cmU7CiAgICBib29sIGd6aXAgPSBmYWxzZTsKICAgIGlmIChvdXRib3VuZCBpcyBfSHR0cFJlc3BvbnNlKSB7CiAgICAgIC8vIFNlcnZlciBzaWRlLgogICAgICBfSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gb3V0Ym91bmQ7CiAgICAgIGlmIChyZXNwb25zZS5faHR0cFJlcXVlc3QuX2h0dHBTZXJ2ZXIuYXV0b0NvbXByZXNzICYmCiAgICAgICAgICBvdXRib3VuZC5idWZmZXJPdXRwdXQgJiYKICAgICAgICAgIG91dGJvdW5kLmhlYWRlcnMuY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcpIHsKICAgICAgICBMaXN0IGFjY2VwdEVuY29kaW5ncyA9CiAgICAgICAgICAgIHJlc3BvbnNlLl9odHRwUmVxdWVzdC5oZWFkZXJzW0h0dHBIZWFkZXJzLmFjY2VwdEVuY29kaW5nSGVhZGVyXTsKICAgICAgICBMaXN0IGNvbnRlbnRFbmNvZGluZyA9CiAgICAgICAgICAgIG91dGJvdW5kLmhlYWRlcnNbSHR0cEhlYWRlcnMuY29udGVudEVuY29kaW5nSGVhZGVyXTsKICAgICAgICBpZiAoYWNjZXB0RW5jb2RpbmdzICE9IG51bGwgJiYKICAgICAgICAgICAgYWNjZXB0RW5jb2RpbmdzCiAgICAgICAgICAgICAgICAuZXhwYW5kKChsaXN0KSA9PiBsaXN0LnNwbGl0KCIsIikpCiAgICAgICAgICAgICAgICAuYW55KChlbmNvZGluZykgPT4gZW5jb2RpbmcudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT0gImd6aXAiKSAmJgogICAgICAgICAgICBjb250ZW50RW5jb2RpbmcgPT0gbnVsbCkgewogICAgICAgICAgb3V0Ym91bmQuaGVhZGVycy5zZXQoSHR0cEhlYWRlcnMuY29udGVudEVuY29kaW5nSGVhZGVyLCAiZ3ppcCIpOwogICAgICAgICAgZ3ppcCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChkcmFpblJlcXVlc3QgJiYgIXJlc3BvbnNlLl9odHRwUmVxdWVzdC5faW5jb21pbmcuaGFzU3Vic2NyaWJlcikgewogICAgICAgIGRyYWluRnV0dXJlID0gcmVzcG9uc2UuX2h0dHBSZXF1ZXN0LmRyYWluKCkuY2F0Y2hFcnJvcigoXykge30pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBkcmFpblJlcXVlc3QgPSBmYWxzZTsKICAgIH0KICAgIGlmICghaWdub3JlQm9keSkgewogICAgICBpZiAoc2V0T3V0Z29pbmcpIHsKICAgICAgICBpbnQgY29udGVudExlbmd0aCA9IG91dGJvdW5kLmhlYWRlcnMuY29udGVudExlbmd0aDsKICAgICAgICBpZiAob3V0Ym91bmQuaGVhZGVycy5jaHVua2VkVHJhbnNmZXJFbmNvZGluZykgewogICAgICAgICAgY2h1bmtlZCA9IHRydWU7CiAgICAgICAgICBpZiAoZ3ppcCkgdGhpcy5nemlwID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRMZW5ndGggPj0gMCkgewogICAgICAgICAgdGhpcy5jb250ZW50TGVuZ3RoID0gY29udGVudExlbmd0aDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRyYWluRnV0dXJlICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gZHJhaW5GdXR1cmUudGhlbigoXykgPT4gb3V0Ym91bmQuX3dyaXRlSGVhZGVyKCkpOwogICAgICB9CiAgICB9CiAgICBvdXRib3VuZC5fd3JpdGVIZWFkZXIoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgRnV0dXJlIGFkZFN0cmVhbShTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0pIHsKICAgIGlmIChfc29ja2V0RXJyb3IpIHsKICAgICAgc3RyZWFtLmxpc3RlbihudWxsKS5jYW5jZWwoKTsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUob3V0Ym91bmQpOwogICAgfQogICAgaWYgKGlnbm9yZUJvZHkpIHsKICAgICAgc3RyZWFtLmRyYWluKCkuY2F0Y2hFcnJvcigoXykge30pOwogICAgICB2YXIgZnV0dXJlID0gd3JpdGVIZWFkZXJzKCk7CiAgICAgIGlmIChmdXR1cmUgIT0gbnVsbCkgewogICAgICAgIHJldHVybiBmdXR1cmUudGhlbigoXykgPT4gY2xvc2UoKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNsb3NlKCk7CiAgICB9CiAgICBTdHJlYW1TdWJzY3JpcHRpb248TGlzdDxpbnQ+PiBzdWI7CiAgICAvLyBVc2UgbmV3IHN0cmVhbSBzbyB3ZSBhcmUgYWJsZSB0byBwYXVzZSAoc2VlIGJlbG93IGxpc3RlbikuIFRoZQogICAgLy8gYWx0ZXJuYXRpdmUgaXMgdG8gdXNlIHN0cmVhbS5leHRhbmQsIGJ1dCB0aGF0IHdvbid0IGdpdmUgdXMgYSB3YXkgb2YKICAgIC8vIHBhdXNpbmcuCiAgICB2YXIgY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPExpc3Q8aW50Pj4oCiAgICAgICAgb25QYXVzZTogKCkgPT4gc3ViLnBhdXNlKCksIG9uUmVzdW1lOiAoKSA9PiBzdWIucmVzdW1lKCksIHN5bmM6IHRydWUpOwoKICAgIHZvaWQgb25EYXRhKExpc3Q8aW50PiBkYXRhKSB7CiAgICAgIGlmIChfc29ja2V0RXJyb3IpIHJldHVybjsKICAgICAgaWYgKGRhdGEubGVuZ3RoID09IDApIHJldHVybjsKICAgICAgaWYgKGNodW5rZWQpIHsKICAgICAgICBpZiAoX2d6aXApIHsKICAgICAgICAgIF9nemlwQWRkID0gY29udHJvbGxlci5hZGQ7CiAgICAgICAgICBfYWRkR1ppcENodW5rKGRhdGEsIF9nemlwU2luay5hZGQpOwogICAgICAgICAgX2d6aXBBZGQgPSBudWxsOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBfYWRkQ2h1bmsoX2NodW5rSGVhZGVyKGRhdGEubGVuZ3RoKSwgY29udHJvbGxlci5hZGQpOwogICAgICAgIF9wZW5kaW5nQ2h1bmtlZEZvb3RlciA9IDI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggIT0gbnVsbCkgewogICAgICAgICAgX2J5dGVzV3JpdHRlbiArPSBkYXRhLmxlbmd0aDsKICAgICAgICAgIGlmIChfYnl0ZXNXcml0dGVuID4gY29udGVudExlbmd0aCkgewogICAgICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKG5ldyBIdHRwRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIkNvbnRlbnQgc2l6ZSBleGNlZWRzIHNwZWNpZmllZCBjb250ZW50TGVuZ3RoLiAiCiAgICAgICAgICAgICAgICAiJF9ieXRlc1dyaXR0ZW4gYnl0ZXMgd3JpdHRlbiB3aGlsZSBleHBlY3RlZCAiCiAgICAgICAgICAgICAgICAiJGNvbnRlbnRMZW5ndGguICIKICAgICAgICAgICAgICAgICJbJHtuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoZGF0YSl9XSIpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBfYWRkQ2h1bmsoZGF0YSwgY29udHJvbGxlci5hZGQpOwogICAgfQoKICAgIHN1YiA9IHN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IGNvbnRyb2xsZXIuYWRkRXJyb3IsCiAgICAgICAgb25Eb25lOiBjb250cm9sbGVyLmNsb3NlLAogICAgICAgIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgLy8gV3JpdGUgaGVhZGVycyBub3cgdGhhdCB3ZSBhcmUgbGlzdGVuaW5nIHRvIHRoZSBzdHJlYW0uCiAgICBpZiAoIWhlYWRlcnNXcml0dGVuKSB7CiAgICAgIHZhciBmdXR1cmUgPSB3cml0ZUhlYWRlcnMoKTsKICAgICAgaWYgKGZ1dHVyZSAhPSBudWxsKSB7CiAgICAgICAgLy8gV2hpbGUgaW5jb21pbmcgaXMgYmVpbmcgZHJhaW5lZCwgdGhlIHBhdXNlRnV0dXJlIGlzIG5vbi1udWxsLiBQYXVzZQogICAgICAgIC8vIG91dHB1dCB1bnRpbCBpdCdzIGRyYWluZWQuCiAgICAgICAgc3ViLnBhdXNlKGZ1dHVyZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzb2NrZXQuYWRkU3RyZWFtKGNvbnRyb2xsZXIuc3RyZWFtKS50aGVuKChfKSB7CiAgICAgIHJldHVybiBvdXRib3VuZDsKICAgIH0sIG9uRXJyb3I6IChlcnJvciwgc3RhY2tUcmFjZSkgewogICAgICAvLyBCZSBzdXJlIHRvIGNsb3NlIGl0IGluIGNhc2Ugb2YgYW4gZXJyb3IuCiAgICAgIGlmIChfZ3ppcCkgX2d6aXBTaW5rLmNsb3NlKCk7CiAgICAgIF9zb2NrZXRFcnJvciA9IHRydWU7CiAgICAgIF9kb25lQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICBpZiAoX2lnbm9yZUVycm9yKGVycm9yKSkgewogICAgICAgIHJldHVybiBvdXRib3VuZDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgfQogICAgfSk7CiAgfQoKICBGdXR1cmUgY2xvc2UoKSB7CiAgICAvLyBJZiB3ZSBhcmUgYWxyZWFkeSBjbG9zZWQsIHJldHVybiB0aGF0IGZ1dHVyZS4KICAgIGlmIChfY2xvc2VGdXR1cmUgIT0gbnVsbCkgcmV0dXJuIF9jbG9zZUZ1dHVyZTsKICAgIC8vIElmIHdlIGVhcmxpZXIgc2F3IGFuIGVycm9yLCByZXR1cm4gaW1tZWRpYXRlLiBUaGUgbm90aWZpY2F0aW9uIHRvCiAgICAvLyBfSHR0cCpDb25uZWN0aW9uIGlzIGFscmVhZHkgZG9uZS4KICAgIGlmIChfc29ja2V0RXJyb3IpIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKG91dGJvdW5kKTsKICAgIGlmIChvdXRib3VuZC5faXNDb25uZWN0aW9uQ2xvc2VkKSByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShvdXRib3VuZCk7CiAgICBpZiAoIWhlYWRlcnNXcml0dGVuICYmICFpZ25vcmVCb2R5KSB7CiAgICAgIGlmIChvdXRib3VuZC5oZWFkZXJzLmNvbnRlbnRMZW5ndGggPT0gLTEpIHsKICAgICAgICAvLyBJZiBubyBib2R5IHdhcyB3cml0dGVuLCBpZ25vcmVCb2R5IGlzIGZhbHNlIChpdCdzIG5vdCBhIEhFQUQKICAgICAgICAvLyByZXF1ZXN0KSBhbmQgdGhlIGNvbnRlbnQtbGVuZ3RoIGlzIHVuc3BlY2lmaWVkLCBzZXQgY29udGVudExlbmd0aCB0bwogICAgICAgIC8vIDAuCiAgICAgICAgb3V0Ym91bmQuaGVhZGVycy5jaHVua2VkVHJhbnNmZXJFbmNvZGluZyA9IGZhbHNlOwogICAgICAgIG91dGJvdW5kLmhlYWRlcnMuY29udGVudExlbmd0aCA9IDA7CiAgICAgIH0gZWxzZSBpZiAob3V0Ym91bmQuaGVhZGVycy5jb250ZW50TGVuZ3RoID4gMCkgewogICAgICAgIHZhciBlcnJvciA9IG5ldyBIdHRwRXhjZXB0aW9uKAogICAgICAgICAgICAiTm8gY29udGVudCBldmVuIHRob3VnaCBjb250ZW50TGVuZ3RoIHdhcyBzcGVjaWZpZWQgdG8gYmUgIgogICAgICAgICAgICAiZ3JlYXRlciB0aGFuIDA6ICR7b3V0Ym91bmQuaGVhZGVycy5jb250ZW50TGVuZ3RofS4iLAogICAgICAgICAgICB1cmk6IG91dGJvdW5kLl91cmkpOwogICAgICAgIF9kb25lQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IpOwogICAgICAgIHJldHVybiBfY2xvc2VGdXR1cmUgPSBuZXcgRnV0dXJlLmVycm9yKGVycm9yKTsKICAgICAgfQogICAgfQogICAgLy8gSWYgY29udGVudExlbmd0aCB3YXMgc3BlY2lmaWVkLCB2YWxpZGF0ZSBpdC4KICAgIGlmIChjb250ZW50TGVuZ3RoICE9IG51bGwpIHsKICAgICAgaWYgKF9ieXRlc1dyaXR0ZW4gPCBjb250ZW50TGVuZ3RoKSB7CiAgICAgICAgdmFyIGVycm9yID0gbmV3IEh0dHBFeGNlcHRpb24oCiAgICAgICAgICAgICJDb250ZW50IHNpemUgYmVsb3cgc3BlY2lmaWVkIGNvbnRlbnRMZW5ndGguICIKICAgICAgICAgICAgIiAkX2J5dGVzV3JpdHRlbiBieXRlcyB3cml0dGVuIGJ1dCBleHBlY3RlZCAiCiAgICAgICAgICAgICIkY29udGVudExlbmd0aC4iLAogICAgICAgICAgICB1cmk6IG91dGJvdW5kLl91cmkpOwogICAgICAgIF9kb25lQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IpOwogICAgICAgIHJldHVybiBfY2xvc2VGdXR1cmUgPSBuZXcgRnV0dXJlLmVycm9yKGVycm9yKTsKICAgICAgfQogICAgfQoKICAgIEZ1dHVyZSBmaW5hbGl6ZSgpIHsKICAgICAgLy8gSW4gY2FzZSBvZiBjaHVua2VkIGVuY29kaW5nIChhbmQgZ3ppcCksIGhhbmRsZSByZW1haW5pbmcgZ3ppcCBkYXRhIGFuZAogICAgICAvLyBhcHBlbmQgdGhlICdmb290ZXInIGZvciBjaHVua2VkIGVuY29kaW5nLgogICAgICBpZiAoY2h1bmtlZCkgewogICAgICAgIGlmIChfZ3ppcCkgewogICAgICAgICAgX2d6aXBBZGQgPSBzb2NrZXQuYWRkOwogICAgICAgICAgaWYgKF9nemlwQnVmZmVyTGVuZ3RoID4gMCkgewogICAgICAgICAgICBfZ3ppcFNpbmsuYWRkKAogICAgICAgICAgICAgICAgbmV3IFVpbnQ4TGlzdC52aWV3KF9nemlwQnVmZmVyLmJ1ZmZlciwgMCwgX2d6aXBCdWZmZXJMZW5ndGgpKTsKICAgICAgICAgIH0KICAgICAgICAgIF9nemlwQnVmZmVyID0gbnVsbDsKICAgICAgICAgIF9nemlwU2luay5jbG9zZSgpOwogICAgICAgICAgX2d6aXBBZGQgPSBudWxsOwogICAgICAgIH0KICAgICAgICBfYWRkQ2h1bmsoX2NodW5rSGVhZGVyKDApLCBzb2NrZXQuYWRkKTsKICAgICAgfQogICAgICAvLyBBZGQgYW55IHJlbWFpbmluZyBkYXRhIGluIHRoZSBidWZmZXIuCiAgICAgIGlmIChfbGVuZ3RoID4gMCkgewogICAgICAgIHNvY2tldC5hZGQobmV3IFVpbnQ4TGlzdC52aWV3KF9idWZmZXIuYnVmZmVyLCAwLCBfbGVuZ3RoKSk7CiAgICAgIH0KICAgICAgLy8gQ2xlYXIgcmVmZXJlbmNlcywgZm9yIGJldHRlciBHQy4KICAgICAgX2J1ZmZlciA9IG51bGw7CiAgICAgIC8vIEFuZCBmaW5hbGx5IGZsdXNoIGl0LiBBcyB3ZSBzdXBwb3J0IGtlZXAtYWxpdmUsIG5ldmVyIGNsb3NlIGl0IGZyb20KICAgICAgLy8gaGVyZS4gT25jZSB0aGUgc29ja2V0IGlzIGZsdXNoZWQsIHdlJ2xsIGJlIGFibGUgdG8gcmV1c2UgaXQgKHNpZ25hbGVkCiAgICAgIC8vIGJ5IHRoZSAnZG9uZScgZnV0dXJlKS4KICAgICAgcmV0dXJuIHNvY2tldC5mbHVzaCgpLnRoZW4oKF8pIHsKICAgICAgICBfZG9uZUNvbXBsZXRlci5jb21wbGV0ZShzb2NrZXQpOwogICAgICAgIHJldHVybiBvdXRib3VuZDsKICAgICAgfSwgb25FcnJvcjogKGVycm9yLCBzdGFja1RyYWNlKSB7CiAgICAgICAgX2RvbmVDb21wbGV0ZXIuY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgICAgaWYgKF9pZ25vcmVFcnJvcihlcnJvcikpIHsKICAgICAgICAgIHJldHVybiBvdXRib3VuZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICB2YXIgZnV0dXJlID0gd3JpdGVIZWFkZXJzKCk7CiAgICBpZiAoZnV0dXJlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIF9jbG9zZUZ1dHVyZSA9IGZ1dHVyZS53aGVuQ29tcGxldGUoZmluYWxpemUpOwogICAgfQogICAgcmV0dXJuIF9jbG9zZUZ1dHVyZSA9IGZpbmFsaXplKCk7CiAgfQoKICBGdXR1cmU8U29ja2V0PiBnZXQgZG9uZSA9PiBfZG9uZUNvbXBsZXRlci5mdXR1cmU7CgogIHZvaWQgc2V0SGVhZGVyKExpc3Q8aW50PiBkYXRhLCBpbnQgbGVuZ3RoKSB7CiAgICBhc3NlcnQoX2xlbmd0aCA9PSAwKTsKICAgIF9idWZmZXIgPSBkYXRhOwogICAgX2xlbmd0aCA9IGxlbmd0aDsKICB9CgogIHZvaWQgc2V0IGd6aXAoYm9vbCB2YWx1ZSkgewogICAgX2d6aXAgPSB2YWx1ZTsKICAgIGlmIChfZ3ppcCkgewogICAgICBfZ3ppcEJ1ZmZlciA9IG5ldyBVaW50OExpc3QoX09VVEdPSU5HX0JVRkZFUl9TSVpFKTsKICAgICAgYXNzZXJ0KF9nemlwU2luayA9PSBudWxsKTsKICAgICAgX2d6aXBTaW5rID0gbmV3IFpMaWJFbmNvZGVyKGd6aXA6IHRydWUpCiAgICAgICAgICAuc3RhcnRDaHVua2VkQ29udmVyc2lvbihuZXcgX0h0dHBHWmlwU2luaygoZGF0YSkgewogICAgICAgIC8vIFdlIGFyZSBjbG9zaW5nIGRvd24gcHJlbWF0dXJlbHksIGR1ZSB0byBhbiBlcnJvci4gRGlzY2FyZC4KICAgICAgICBpZiAoX2d6aXBBZGQgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgIF9hZGRDaHVuayhfY2h1bmtIZWFkZXIoZGF0YS5sZW5ndGgpLCBfZ3ppcEFkZCk7CiAgICAgICAgX3BlbmRpbmdDaHVua2VkRm9vdGVyID0gMjsKICAgICAgICBfYWRkQ2h1bmsoZGF0YSwgX2d6aXBBZGQpOwogICAgICB9KSk7CiAgICB9CiAgfQoKICBib29sIF9pZ25vcmVFcnJvcihlcnJvcikgPT4KICAgICAgKGVycm9yIGlzIFNvY2tldEV4Y2VwdGlvbiB8fCBlcnJvciBpcyBUbHNFeGNlcHRpb24pICYmCiAgICAgIG91dGJvdW5kIGlzIEh0dHBSZXNwb25zZTsKCiAgdm9pZCBfYWRkR1ppcENodW5rKExpc3Q8aW50PiBjaHVuaywgdm9pZCBhZGQoTGlzdDxpbnQ+IGRhdGEpKSB7CiAgICBpZiAoIW91dGJvdW5kLmJ1ZmZlck91dHB1dCkgewogICAgICBhZGQoY2h1bmspOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoY2h1bmsubGVuZ3RoID4gX2d6aXBCdWZmZXIubGVuZ3RoIC0gX2d6aXBCdWZmZXJMZW5ndGgpIHsKICAgICAgYWRkKG5ldyBVaW50OExpc3QudmlldyhfZ3ppcEJ1ZmZlci5idWZmZXIsIDAsIF9nemlwQnVmZmVyTGVuZ3RoKSk7CiAgICAgIF9nemlwQnVmZmVyID0gbmV3IFVpbnQ4TGlzdChfT1VUR09JTkdfQlVGRkVSX1NJWkUpOwogICAgICBfZ3ppcEJ1ZmZlckxlbmd0aCA9IDA7CiAgICB9CiAgICBpZiAoY2h1bmsubGVuZ3RoID4gX09VVEdPSU5HX0JVRkZFUl9TSVpFKSB7CiAgICAgIGFkZChjaHVuayk7CiAgICB9IGVsc2UgewogICAgICBfZ3ppcEJ1ZmZlci5zZXRSYW5nZSgKICAgICAgICAgIF9nemlwQnVmZmVyTGVuZ3RoLCBfZ3ppcEJ1ZmZlckxlbmd0aCArIGNodW5rLmxlbmd0aCwgY2h1bmspOwogICAgICBfZ3ppcEJ1ZmZlckxlbmd0aCArPSBjaHVuay5sZW5ndGg7CiAgICB9CiAgfQoKICB2b2lkIF9hZGRDaHVuayhMaXN0PGludD4gY2h1bmssIHZvaWQgYWRkKExpc3Q8aW50PiBkYXRhKSkgewogICAgaWYgKCFvdXRib3VuZC5idWZmZXJPdXRwdXQpIHsKICAgICAgaWYgKF9idWZmZXIgIT0gbnVsbCkgewogICAgICAgIC8vIElmIF9idWZmZXIgaXMgbm90IG51bGwsIHdlIGhhdmUgbm90IHdyaXR0ZW4gdGhlIGhlYWRlciB5ZXQuIFdyaXRlCiAgICAgICAgLy8gaXQgbm93LgogICAgICAgIGFkZChuZXcgVWludDhMaXN0LnZpZXcoX2J1ZmZlci5idWZmZXIsIDAsIF9sZW5ndGgpKTsKICAgICAgICBfYnVmZmVyID0gbnVsbDsKICAgICAgICBfbGVuZ3RoID0gMDsKICAgICAgfQogICAgICBhZGQoY2h1bmspOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoY2h1bmsubGVuZ3RoID4gX2J1ZmZlci5sZW5ndGggLSBfbGVuZ3RoKSB7CiAgICAgIGFkZChuZXcgVWludDhMaXN0LnZpZXcoX2J1ZmZlci5idWZmZXIsIDAsIF9sZW5ndGgpKTsKICAgICAgX2J1ZmZlciA9IG5ldyBVaW50OExpc3QoX09VVEdPSU5HX0JVRkZFUl9TSVpFKTsKICAgICAgX2xlbmd0aCA9IDA7CiAgICB9CiAgICBpZiAoY2h1bmsubGVuZ3RoID4gX09VVEdPSU5HX0JVRkZFUl9TSVpFKSB7CiAgICAgIGFkZChjaHVuayk7CiAgICB9IGVsc2UgewogICAgICBfYnVmZmVyLnNldFJhbmdlKF9sZW5ndGgsIF9sZW5ndGggKyBjaHVuay5sZW5ndGgsIGNodW5rKTsKICAgICAgX2xlbmd0aCArPSBjaHVuay5sZW5ndGg7CiAgICB9CiAgfQoKICBMaXN0PGludD4gX2NodW5rSGVhZGVyKGludCBsZW5ndGgpIHsKICAgIGNvbnN0IGhleERpZ2l0cyA9IGNvbnN0IFsKICAgICAgMHgzMCwKICAgICAgMHgzMSwKICAgICAgMHgzMiwKICAgICAgMHgzMywKICAgICAgMHgzNCwKICAgICAgMHgzNSwKICAgICAgMHgzNiwKICAgICAgMHgzNywKICAgICAgMHgzOCwKICAgICAgMHgzOSwKICAgICAgMHg0MSwKICAgICAgMHg0MiwKICAgICAgMHg0MywKICAgICAgMHg0NCwKICAgICAgMHg0NSwKICAgICAgMHg0NgogICAgXTsKICAgIGlmIChsZW5ndGggPT0gMCkgewogICAgICBpZiAoX3BlbmRpbmdDaHVua2VkRm9vdGVyID09IDIpIHJldHVybiBfZm9vdGVyQW5kQ2h1bmswTGVuZ3RoOwogICAgICByZXR1cm4gX2NodW5rMExlbmd0aDsKICAgIH0KICAgIGludCBzaXplID0gX3BlbmRpbmdDaHVua2VkRm9vdGVyOwogICAgaW50IGxlbiA9IGxlbmd0aDsKICAgIC8vIENvbXB1dGUgYSBmYXN0IGludGVnZXIgdmVyc2lvbiBvZiAobG9nKGxlbmd0aCArIDEpIC8gbG9nKDE2KSkuY2VpbCgpLgogICAgd2hpbGUgKGxlbiA+IDApIHsKICAgICAgc2l6ZSsrOwogICAgICBsZW4gPj49IDQ7CiAgICB9CiAgICB2YXIgZm9vdGVyQW5kSGVhZGVyID0gbmV3IFVpbnQ4TGlzdChzaXplICsgMik7CiAgICBpZiAoX3BlbmRpbmdDaHVua2VkRm9vdGVyID09IDIpIHsKICAgICAgZm9vdGVyQW5kSGVhZGVyWzBdID0gX0NoYXJDb2RlLkNSOwogICAgICBmb290ZXJBbmRIZWFkZXJbMV0gPSBfQ2hhckNvZGUuTEY7CiAgICB9CiAgICBpbnQgaW5kZXggPSBzaXplOwogICAgd2hpbGUgKGluZGV4ID4gX3BlbmRpbmdDaHVua2VkRm9vdGVyKSB7CiAgICAgIGZvb3RlckFuZEhlYWRlclstLWluZGV4XSA9IGhleERpZ2l0c1tsZW5ndGggJiAxNV07CiAgICAgIGxlbmd0aCA9IGxlbmd0aCA+PiA0OwogICAgfQogICAgZm9vdGVyQW5kSGVhZGVyW3NpemUgKyAwXSA9IF9DaGFyQ29kZS5DUjsKICAgIGZvb3RlckFuZEhlYWRlcltzaXplICsgMV0gPSBfQ2hhckNvZGUuTEY7CiAgICByZXR1cm4gZm9vdGVyQW5kSGVhZGVyOwogIH0KfQoKY2xhc3MgX0h0dHBDbGllbnRDb25uZWN0aW9uIHsKICBmaW5hbCBTdHJpbmcga2V5OwogIGZpbmFsIFNvY2tldCBfc29ja2V0OwogIGZpbmFsIGJvb2wgX3Byb3h5VHVubmVsOwogIGZpbmFsIFNlY3VyaXR5Q29udGV4dCBfY29udGV4dDsKICBmaW5hbCBfSHR0cFBhcnNlciBfaHR0cFBhcnNlcjsKICBTdHJlYW1TdWJzY3JpcHRpb24gX3N1YnNjcmlwdGlvbjsKICBmaW5hbCBfSHR0cENsaWVudCBfaHR0cENsaWVudDsKICBib29sIF9kaXNwb3NlID0gZmFsc2U7CiAgVGltZXIgX2lkbGVUaW1lcjsKICBib29sIGNsb3NlZCA9IGZhbHNlOwogIFVyaSBfY3VycmVudFVyaTsKCiAgQ29tcGxldGVyPF9IdHRwSW5jb21pbmc+IF9uZXh0UmVzcG9uc2VDb21wbGV0ZXI7CiAgRnV0dXJlPFNvY2tldD4gX3N0cmVhbUZ1dHVyZTsKCiAgX0h0dHBDbGllbnRDb25uZWN0aW9uKHRoaXMua2V5LCB0aGlzLl9zb2NrZXQsIHRoaXMuX2h0dHBDbGllbnQsCiAgICAgIFt0aGlzLl9wcm94eVR1bm5lbCA9IGZhbHNlLCB0aGlzLl9jb250ZXh0XSkKICAgICAgOiBfaHR0cFBhcnNlciA9IG5ldyBfSHR0cFBhcnNlci5yZXNwb25zZVBhcnNlcigpIHsKICAgIF9odHRwUGFyc2VyLmxpc3RlblRvU3RyZWFtKF9zb2NrZXQpOwoKICAgIC8vIFNldCB1cCBoYW5kbGVycyBvbiB0aGUgcGFyc2VyIGhlcmUsIHNvIHdlIGFyZSBzdXJlIHRvIGdldCAnb25Eb25lJyBmcm9tCiAgICAvLyB0aGUgcGFyc2VyLgogICAgX3N1YnNjcmlwdGlvbiA9IF9odHRwUGFyc2VyLmxpc3RlbigoaW5jb21pbmcpIHsKICAgICAgLy8gT25seSBoYW5kbGUgb25lIGluY29taW5nIHJlc3BvbnNlIGF0IHRoZSB0aW1lLiBLZWVwIHRoZQogICAgICAvLyBzdHJlYW0gcGF1c2VkIHVudGlsIHRoZSByZXNwb25zZSBoYXZlIGJlZW4gcHJvY2Vzc2VkLgogICAgICBfc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICAgIC8vIFdlIGFzc3VtZSB0aGUgcmVzcG9uc2UgaXMgbm90IGhlcmUsIHVudGlsIHdlIGhhdmUgc2VuZCB0aGUgcmVxdWVzdC4KICAgICAgaWYgKF9uZXh0UmVzcG9uc2VDb21wbGV0ZXIgPT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKAogICAgICAgICAgICAiVW5leHBlY3RlZCByZXNwb25zZSAodW5zb2xpY2l0ZWQgcmVzcG9uc2Ugd2l0aG91dCByZXF1ZXN0KS4iLAogICAgICAgICAgICB1cmk6IF9jdXJyZW50VXJpKTsKICAgICAgfQoKICAgICAgLy8gQ2hlY2sgZm9yIHN0YXR1cyBjb2RlICcxMDAgQ29udGludWUnLiBJbiB0aGF0IGNhc2UganVzdAogICAgICAvLyBjb25zdW1lIHRoYXQgcmVzcG9uc2UgYXMgdGhlIGZpbmFsIHJlc3BvbnNlIHdpbGwgZm9sbG93CiAgICAgIC8vIGl0LiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gQVBJIGZvciB0aGUgY2xpZW50IHRvIHdhaXQgZm9yCiAgICAgIC8vIHRoZSAnMTAwIENvbnRpbnVlJyByZXNwb25zZS4KICAgICAgaWYgKGluY29taW5nLnN0YXR1c0NvZGUgPT0gMTAwKSB7CiAgICAgICAgaW5jb21pbmcuZHJhaW4oKS50aGVuKChfKSB7CiAgICAgICAgICBfc3Vic2NyaXB0aW9uLnJlc3VtZSgpOwogICAgICAgIH0pLmNhdGNoRXJyb3IoKGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgICAgICAgX25leHRSZXNwb25zZUNvbXBsZXRlci5jb21wbGV0ZUVycm9yKAogICAgICAgICAgICAgIG5ldyBIdHRwRXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UsIHVyaTogX2N1cnJlbnRVcmkpLCBzdGFja1RyYWNlKTsKICAgICAgICAgIF9uZXh0UmVzcG9uc2VDb21wbGV0ZXIgPSBudWxsOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIF9uZXh0UmVzcG9uc2VDb21wbGV0ZXIuY29tcGxldGUoaW5jb21pbmcpOwogICAgICAgIF9uZXh0UmVzcG9uc2VDb21wbGV0ZXIgPSBudWxsOwogICAgICB9CiAgICB9LCBvbkVycm9yOiAoZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICAgIGlmIChfbmV4dFJlc3BvbnNlQ29tcGxldGVyICE9IG51bGwpIHsKICAgICAgICBfbmV4dFJlc3BvbnNlQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoCiAgICAgICAgICAgIG5ldyBIdHRwRXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UsIHVyaTogX2N1cnJlbnRVcmkpLCBzdGFja1RyYWNlKTsKICAgICAgICBfbmV4dFJlc3BvbnNlQ29tcGxldGVyID0gbnVsbDsKICAgICAgfQogICAgfSwgb25Eb25lOiAoKSB7CiAgICAgIGlmIChfbmV4dFJlc3BvbnNlQ29tcGxldGVyICE9IG51bGwpIHsKICAgICAgICBfbmV4dFJlc3BvbnNlQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IobmV3IEh0dHBFeGNlcHRpb24oCiAgICAgICAgICAgICJDb25uZWN0aW9uIGNsb3NlZCBiZWZvcmUgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkIiwKICAgICAgICAgICAgdXJpOiBfY3VycmVudFVyaSkpOwogICAgICAgIF9uZXh0UmVzcG9uc2VDb21wbGV0ZXIgPSBudWxsOwogICAgICB9CiAgICAgIGNsb3NlKCk7CiAgICB9KTsKICB9CgogIF9IdHRwQ2xpZW50UmVxdWVzdCBzZW5kKFVyaSB1cmksIGludCBwb3J0LCBTdHJpbmcgbWV0aG9kLCBfUHJveHkgcHJveHkpIHsKICAgIGlmIChjbG9zZWQpIHsKICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIlNvY2tldCBjbG9zZWQgYmVmb3JlIHJlcXVlc3Qgd2FzIHNlbnQiLAogICAgICAgICAgdXJpOiB1cmkpOwogICAgfQogICAgX2N1cnJlbnRVcmkgPSB1cmk7CiAgICAvLyBTdGFydCB3aXRoIHBhdXNpbmcgdGhlIHBhcnNlci4KICAgIF9zdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgIF9Qcm94eUNyZWRlbnRpYWxzIHByb3h5Q3JlZHM7IC8vIENyZWRlbnRpYWxzIHVzZWQgdG8gYXV0aG9yaXplIHByb3h5LgogICAgX1NpdGVDcmVkZW50aWFscyBjcmVkczsgLy8gQ3JlZGVudGlhbHMgdXNlZCB0byBhdXRob3JpemUgdGhpcyByZXF1ZXN0LgogICAgdmFyIG91dGdvaW5nID0gbmV3IF9IdHRwT3V0Z29pbmcoX3NvY2tldCk7CiAgICAvLyBDcmVhdGUgbmV3IHJlcXVlc3Qgb2JqZWN0LCB3cmFwcGluZyB0aGUgb3V0Z29pbmcgY29ubmVjdGlvbi4KICAgIHZhciByZXF1ZXN0ID0KICAgICAgICBuZXcgX0h0dHBDbGllbnRSZXF1ZXN0KG91dGdvaW5nLCB1cmksIG1ldGhvZCwgcHJveHksIF9odHRwQ2xpZW50LCB0aGlzKTsKICAgIC8vIEZvciB0aGUgSG9zdCBoZWFkZXIgYW4gSVB2NiBhZGRyZXNzIG11c3QgYmUgZW5jbG9zZWQgaW4gW10ncy4KICAgIHZhciBob3N0ID0gdXJpLmhvc3Q7CiAgICBpZiAoaG9zdC5jb250YWlucygnOicpKSBob3N0ID0gIlskaG9zdF0iOwogICAgcmVxdWVzdC5oZWFkZXJzCiAgICAgIC4uaG9zdCA9IGhvc3QKICAgICAgLi5wb3J0ID0gcG9ydAogICAgICAuLl9hZGQoSHR0cEhlYWRlcnMuYWNjZXB0RW5jb2RpbmdIZWFkZXIsICJnemlwIik7CiAgICBpZiAoX2h0dHBDbGllbnQudXNlckFnZW50ICE9IG51bGwpIHsKICAgICAgcmVxdWVzdC5oZWFkZXJzLl9hZGQoJ3VzZXItYWdlbnQnLCBfaHR0cENsaWVudC51c2VyQWdlbnQpOwogICAgfQogICAgaWYgKHByb3h5LmlzQXV0aGVudGljYXRlZCkgewogICAgICAvLyBJZiB0aGUgcHJveHkgY29uZmlndXJhdGlvbiBjb250YWlucyB1c2VyIGluZm9ybWF0aW9uIHVzZSB0aGF0CiAgICAgIC8vIGZvciBwcm94eSBiYXNpYyBhdXRob3JpemF0aW9uLgogICAgICBTdHJpbmcgYXV0aCA9IF9DcnlwdG9VdGlscy5ieXRlc1RvQmFzZTY0KAogICAgICAgICAgdXRmOC5lbmNvZGUoIiR7cHJveHkudXNlcm5hbWV9OiR7cHJveHkucGFzc3dvcmR9IikpOwogICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEh0dHBIZWFkZXJzLnByb3h5QXV0aG9yaXphdGlvbkhlYWRlciwgIkJhc2ljICRhdXRoIik7CiAgICB9IGVsc2UgaWYgKCFwcm94eS5pc0RpcmVjdCAmJiBfaHR0cENsaWVudC5fcHJveHlDcmVkZW50aWFscy5sZW5ndGggPiAwKSB7CiAgICAgIHByb3h5Q3JlZHMgPSBfaHR0cENsaWVudC5fZmluZFByb3h5Q3JlZGVudGlhbHMocHJveHkpOwogICAgICBpZiAocHJveHlDcmVkcyAhPSBudWxsKSB7CiAgICAgICAgcHJveHlDcmVkcy5hdXRob3JpemUocmVxdWVzdCk7CiAgICAgIH0KICAgIH0KICAgIGlmICh1cmkudXNlckluZm8gIT0gbnVsbCAmJiAhdXJpLnVzZXJJbmZvLmlzRW1wdHkpIHsKICAgICAgLy8gSWYgdGhlIFVSTCBjb250YWlucyB1c2VyIGluZm9ybWF0aW9uIHVzZSB0aGF0IGZvciBiYXNpYwogICAgICAvLyBhdXRob3JpemF0aW9uLgogICAgICBTdHJpbmcgYXV0aCA9IF9DcnlwdG9VdGlscy5ieXRlc1RvQmFzZTY0KHV0ZjguZW5jb2RlKHVyaS51c2VySW5mbykpOwogICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEh0dHBIZWFkZXJzLmF1dGhvcml6YXRpb25IZWFkZXIsICJCYXNpYyAkYXV0aCIpOwogICAgfSBlbHNlIHsKICAgICAgLy8gTG9vayBmb3IgY3JlZGVudGlhbHMuCiAgICAgIGNyZWRzID0gX2h0dHBDbGllbnQuX2ZpbmRDcmVkZW50aWFscyh1cmkpOwogICAgICBpZiAoY3JlZHMgIT0gbnVsbCkgewogICAgICAgIGNyZWRzLmF1dGhvcml6ZShyZXF1ZXN0KTsKICAgICAgfQogICAgfQogICAgLy8gU3RhcnQgc2VuZGluZyB0aGUgcmVxdWVzdCAobGF6eSwgZGVsYXllZCB1bnRpbCB0aGUgdXNlciBwcm92aWRlcwogICAgLy8gZGF0YSkuCiAgICBfaHR0cFBhcnNlci5pc0hlYWQgPSBtZXRob2QgPT0gIkhFQUQiOwogICAgX3N0cmVhbUZ1dHVyZSA9IG91dGdvaW5nLmRvbmUudGhlbjxTb2NrZXQ+KChTb2NrZXQgcykgewogICAgICAvLyBSZXF1ZXN0IHNlbnQsIHNldCB1cCByZXNwb25zZSBjb21wbGV0ZXIuCiAgICAgIF9uZXh0UmVzcG9uc2VDb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPF9IdHRwSW5jb21pbmc+KCk7CgogICAgICAvLyBMaXN0ZW4gZm9yIHJlc3BvbnNlLgogICAgICBfbmV4dFJlc3BvbnNlQ29tcGxldGVyLmZ1dHVyZS50aGVuKChpbmNvbWluZykgewogICAgICAgIF9jdXJyZW50VXJpID0gbnVsbDsKICAgICAgICBpbmNvbWluZy5kYXRhRG9uZS50aGVuKChjbG9zaW5nKSB7CiAgICAgICAgICBpZiAoaW5jb21pbmcudXBncmFkZWQpIHsKICAgICAgICAgICAgX2h0dHBDbGllbnQuX2Nvbm5lY3Rpb25DbG9zZWQodGhpcyk7CiAgICAgICAgICAgIHN0YXJ0VGltZXIoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNsb3NlZCkgcmV0dXJuOwogICAgICAgICAgaWYgKCFjbG9zaW5nICYmCiAgICAgICAgICAgICAgIV9kaXNwb3NlICYmCiAgICAgICAgICAgICAgaW5jb21pbmcuaGVhZGVycy5wZXJzaXN0ZW50Q29ubmVjdGlvbiAmJgogICAgICAgICAgICAgIHJlcXVlc3QucGVyc2lzdGVudENvbm5lY3Rpb24pIHsKICAgICAgICAgICAgLy8gUmV0dXJuIGNvbm5lY3Rpb24sIG5vdyB3ZSBhcmUgZG9uZS4KICAgICAgICAgICAgX2h0dHBDbGllbnQuX3JldHVybkNvbm5lY3Rpb24odGhpcyk7CiAgICAgICAgICAgIF9zdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkZXN0cm95KCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgLy8gRm9yIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBpZiBwcm94eSBjaGVjayBpZiB0aGUgcHJveHkKICAgICAgICAvLyByZXF1ZXN0cyB0aGUgY2xpZW50IHRvIHN0YXJ0IHVzaW5nIGEgbmV3IG5vbmNlIGZvciBwcm94eQogICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uLgogICAgICAgIGlmIChwcm94eUNyZWRzICE9IG51bGwgJiYKICAgICAgICAgICAgcHJveHlDcmVkcy5zY2hlbWUgPT0gX0F1dGhlbnRpY2F0aW9uU2NoZW1lLkRJR0VTVCkgewogICAgICAgICAgdmFyIGF1dGhJbmZvID0gaW5jb21pbmcuaGVhZGVyc1sicHJveHktYXV0aGVudGljYXRpb24taW5mbyJdOwogICAgICAgICAgaWYgKGF1dGhJbmZvICE9IG51bGwgJiYgYXV0aEluZm8ubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgdmFyIGhlYWRlciA9CiAgICAgICAgICAgICAgICBfSGVhZGVyVmFsdWUucGFyc2UoYXV0aEluZm9bMF0sIHBhcmFtZXRlclNlcGFyYXRvcjogJywnKTsKICAgICAgICAgICAgdmFyIG5leHRub25jZSA9IGhlYWRlci5wYXJhbWV0ZXJzWyJuZXh0bm9uY2UiXTsKICAgICAgICAgICAgaWYgKG5leHRub25jZSAhPSBudWxsKSBwcm94eUNyZWRzLm5vbmNlID0gbmV4dG5vbmNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBGb3IgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIGNoZWNrIGlmIHRoZSBzZXJ2ZXIgcmVxdWVzdHMgdGhlCiAgICAgICAgLy8gY2xpZW50IHRvIHN0YXJ0IHVzaW5nIGEgbmV3IG5vbmNlLgogICAgICAgIGlmIChjcmVkcyAhPSBudWxsICYmIGNyZWRzLnNjaGVtZSA9PSBfQXV0aGVudGljYXRpb25TY2hlbWUuRElHRVNUKSB7CiAgICAgICAgICB2YXIgYXV0aEluZm8gPSBpbmNvbWluZy5oZWFkZXJzWyJhdXRoZW50aWNhdGlvbi1pbmZvIl07CiAgICAgICAgICBpZiAoYXV0aEluZm8gIT0gbnVsbCAmJiBhdXRoSW5mby5sZW5ndGggPT0gMSkgewogICAgICAgICAgICB2YXIgaGVhZGVyID0KICAgICAgICAgICAgICAgIF9IZWFkZXJWYWx1ZS5wYXJzZShhdXRoSW5mb1swXSwgcGFyYW1ldGVyU2VwYXJhdG9yOiAnLCcpOwogICAgICAgICAgICB2YXIgbmV4dG5vbmNlID0gaGVhZGVyLnBhcmFtZXRlcnNbIm5leHRub25jZSJdOwogICAgICAgICAgICBpZiAobmV4dG5vbmNlICE9IG51bGwpIGNyZWRzLm5vbmNlID0gbmV4dG5vbmNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXF1ZXN0Ll9vbkluY29taW5nKGluY29taW5nKTsKICAgICAgfSkKICAgICAgICAgIC8vIElmIHdlIHNlZSBhIHN0YXRlIGVycm9yLCB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSAnZmlyc3QnCiAgICAgICAgICAvLyBlbGVtZW50LgogICAgICAgICAgLmNhdGNoRXJyb3IoKGVycm9yKSB7CiAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkNvbm5lY3Rpb24gY2xvc2VkIGJlZm9yZSBkYXRhIHdhcyByZWNlaXZlZCIsCiAgICAgICAgICAgIHVyaTogdXJpKTsKICAgICAgfSwgdGVzdDogKGVycm9yKSA9PiBlcnJvciBpcyBTdGF0ZUVycm9yKS5jYXRjaEVycm9yKChlcnJvciwgc3RhY2tUcmFjZSkgewogICAgICAgIC8vIFdlIGFyZSBkb25lIHdpdGggdGhlIHNvY2tldC4KICAgICAgICBkZXN0cm95KCk7CiAgICAgICAgcmVxdWVzdC5fb25FcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIH0pOwoKICAgICAgLy8gUmVzdW1lIHRoZSBwYXJzZXIgbm93IHdlIGhhdmUgYSBoYW5kbGVyLgogICAgICBfc3Vic2NyaXB0aW9uLnJlc3VtZSgpOwogICAgICByZXR1cm4gczsKICAgIH0sIG9uRXJyb3I6IChlKSB7CiAgICAgIGRlc3Ryb3koKTsKICAgIH0pOwogICAgcmV0dXJuIHJlcXVlc3Q7CiAgfQoKICBGdXR1cmU8U29ja2V0PiBkZXRhY2hTb2NrZXQoKSB7CiAgICByZXR1cm4gX3N0cmVhbUZ1dHVyZS50aGVuKAogICAgICAgIChfKSA9PiBuZXcgX0RldGFjaGVkU29ja2V0KF9zb2NrZXQsIF9odHRwUGFyc2VyLmRldGFjaEluY29taW5nKCkpKTsKICB9CgogIHZvaWQgZGVzdHJveSgpIHsKICAgIGNsb3NlZCA9IHRydWU7CiAgICBfaHR0cENsaWVudC5fY29ubmVjdGlvbkNsb3NlZCh0aGlzKTsKICAgIF9zb2NrZXQuZGVzdHJveSgpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIGNsb3NlZCA9IHRydWU7CiAgICBfaHR0cENsaWVudC5fY29ubmVjdGlvbkNsb3NlZCh0aGlzKTsKICAgIF9zdHJlYW1GdXR1cmUKICAgICAgICAudGltZW91dChfaHR0cENsaWVudC5pZGxlVGltZW91dCkKICAgICAgICAudGhlbigoXykgPT4gX3NvY2tldC5kZXN0cm95KCkpOwogIH0KCiAgRnV0dXJlPF9IdHRwQ2xpZW50Q29ubmVjdGlvbj4gY3JlYXRlUHJveHlUdW5uZWwoU3RyaW5nIGhvc3QsIGludCBwb3J0LAogICAgICBfUHJveHkgcHJveHksIGJvb2wgY2FsbGJhY2soWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlKSkgewogICAgX0h0dHBDbGllbnRSZXF1ZXN0IHJlcXVlc3QgPQogICAgICAgIHNlbmQobmV3IFVyaShob3N0OiBob3N0LCBwb3J0OiBwb3J0KSwgcG9ydCwgIkNPTk5FQ1QiLCBwcm94eSk7CiAgICBpZiAocHJveHkuaXNBdXRoZW50aWNhdGVkKSB7CiAgICAgIC8vIElmIHRoZSBwcm94eSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIHVzZXIgaW5mb3JtYXRpb24gdXNlIHRoYXQKICAgICAgLy8gZm9yIHByb3h5IGJhc2ljIGF1dGhvcml6YXRpb24uCiAgICAgIFN0cmluZyBhdXRoID0gX0NyeXB0b1V0aWxzLmJ5dGVzVG9CYXNlNjQoCiAgICAgICAgICB1dGY4LmVuY29kZSgiJHtwcm94eS51c2VybmFtZX06JHtwcm94eS5wYXNzd29yZH0iKSk7CiAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoSHR0cEhlYWRlcnMucHJveHlBdXRob3JpemF0aW9uSGVhZGVyLCAiQmFzaWMgJGF1dGgiKTsKICAgIH0KICAgIHJldHVybiByZXF1ZXN0LmNsb3NlKCkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT0gSHR0cFN0YXR1cy5vaykgewogICAgICAgIHRocm93ICJQcm94eSBmYWlsZWQgdG8gZXN0YWJsaXNoIHR1bm5lbCAiCiAgICAgICAgICAgICIoJHtyZXNwb25zZS5zdGF0dXNDb2RlfSAke3Jlc3BvbnNlLnJlYXNvblBocmFzZX0pIjsKICAgICAgfQogICAgICB2YXIgc29ja2V0ID0gKHJlc3BvbnNlIGFzIF9IdHRwQ2xpZW50UmVzcG9uc2UpCiAgICAgICAgICAuX2h0dHBSZXF1ZXN0CiAgICAgICAgICAuX2h0dHBDbGllbnRDb25uZWN0aW9uCiAgICAgICAgICAuX3NvY2tldDsKICAgICAgcmV0dXJuIFNlY3VyZVNvY2tldC5zZWN1cmUoc29ja2V0LAogICAgICAgICAgaG9zdDogaG9zdCwgY29udGV4dDogX2NvbnRleHQsIG9uQmFkQ2VydGlmaWNhdGU6IGNhbGxiYWNrKTsKICAgIH0pLnRoZW4oKHNlY3VyZVNvY2tldCkgewogICAgICBTdHJpbmcga2V5ID0gX0h0dHBDbGllbnRDb25uZWN0aW9uLm1ha2VLZXkodHJ1ZSwgaG9zdCwgcG9ydCk7CiAgICAgIHJldHVybiBuZXcgX0h0dHBDbGllbnRDb25uZWN0aW9uKAogICAgICAgICAga2V5LCBzZWN1cmVTb2NrZXQsIHJlcXVlc3QuX2h0dHBDbGllbnQsIHRydWUpOwogICAgfSk7CiAgfQoKICBIdHRwQ29ubmVjdGlvbkluZm8gZ2V0IGNvbm5lY3Rpb25JbmZvID0+IF9IdHRwQ29ubmVjdGlvbkluZm8uY3JlYXRlKF9zb2NrZXQpOwoKICBzdGF0aWMgbWFrZUtleShib29sIGlzU2VjdXJlLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKICAgIHJldHVybiBpc1NlY3VyZSA/ICJzc2g6JGhvc3Q6JHBvcnQiIDogIiRob3N0OiRwb3J0IjsKICB9CgogIHZvaWQgc3RvcFRpbWVyKCkgewogICAgaWYgKF9pZGxlVGltZXIgIT0gbnVsbCkgewogICAgICBfaWRsZVRpbWVyLmNhbmNlbCgpOwogICAgICBfaWRsZVRpbWVyID0gbnVsbDsKICAgIH0KICB9CgogIHZvaWQgc3RhcnRUaW1lcigpIHsKICAgIGFzc2VydChfaWRsZVRpbWVyID09IG51bGwpOwogICAgX2lkbGVUaW1lciA9IG5ldyBUaW1lcihfaHR0cENsaWVudC5pZGxlVGltZW91dCwgKCkgewogICAgICBfaWRsZVRpbWVyID0gbnVsbDsKICAgICAgY2xvc2UoKTsKICAgIH0pOwogIH0KfQoKY2xhc3MgX0Nvbm5lY3Rpb25JbmZvIHsKICBmaW5hbCBfSHR0cENsaWVudENvbm5lY3Rpb24gY29ubmVjdGlvbjsKICBmaW5hbCBfUHJveHkgcHJveHk7CgogIF9Db25uZWN0aW9uSW5mbyh0aGlzLmNvbm5lY3Rpb24sIHRoaXMucHJveHkpOwp9CgpjbGFzcyBfQ29ubmVjdGlvblRhcmdldCB7CiAgLy8gVW5pcXVlIGtleSBmb3IgdGhpcyBjb25uZWN0aW9uIHRhcmdldC4KICBmaW5hbCBTdHJpbmcga2V5OwogIGZpbmFsIFN0cmluZyBob3N0OwogIGZpbmFsIGludCBwb3J0OwogIGZpbmFsIGJvb2wgaXNTZWN1cmU7CiAgZmluYWwgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQ7CiAgZmluYWwgU2V0PF9IdHRwQ2xpZW50Q29ubmVjdGlvbj4gX2lkbGUgPSBuZXcgSGFzaFNldCgpOwogIGZpbmFsIFNldDxfSHR0cENsaWVudENvbm5lY3Rpb24+IF9hY3RpdmUgPSBuZXcgSGFzaFNldCgpOwogIGZpbmFsIFNldDxDb25uZWN0aW9uVGFzaz4gX3NvY2tldFRhc2tzID0gbmV3IEhhc2hTZXQoKTsKICBmaW5hbCBRdWV1ZSBfcGVuZGluZyA9IG5ldyBMaXN0UXVldWUoKTsKICBpbnQgX2Nvbm5lY3RpbmcgPSAwOwoKICBfQ29ubmVjdGlvblRhcmdldCgKICAgICAgdGhpcy5rZXksIHRoaXMuaG9zdCwgdGhpcy5wb3J0LCB0aGlzLmlzU2VjdXJlLCB0aGlzLmNvbnRleHQpOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF9pZGxlLmlzRW1wdHkgJiYgX2FjdGl2ZS5pc0VtcHR5ICYmIF9jb25uZWN0aW5nID09IDA7CgogIGJvb2wgZ2V0IGhhc0lkbGUgPT4gX2lkbGUuaXNOb3RFbXB0eTsKCiAgYm9vbCBnZXQgaGFzQWN0aXZlID0+IF9hY3RpdmUuaXNOb3RFbXB0eSB8fCBfY29ubmVjdGluZyA+IDA7CgogIF9IdHRwQ2xpZW50Q29ubmVjdGlvbiB0YWtlSWRsZSgpIHsKICAgIGFzc2VydChoYXNJZGxlKTsKICAgIF9IdHRwQ2xpZW50Q29ubmVjdGlvbiBjb25uZWN0aW9uID0gX2lkbGUuZmlyc3Q7CiAgICBfaWRsZS5yZW1vdmUoY29ubmVjdGlvbik7CiAgICBjb25uZWN0aW9uLnN0b3BUaW1lcigpOwogICAgX2FjdGl2ZS5hZGQoY29ubmVjdGlvbik7CiAgICByZXR1cm4gY29ubmVjdGlvbjsKICB9CgogIF9jaGVja1BlbmRpbmcoKSB7CiAgICBpZiAoX3BlbmRpbmcuaXNOb3RFbXB0eSkgewogICAgICBfcGVuZGluZy5yZW1vdmVGaXJzdCgpKCk7CiAgICB9CiAgfQoKICB2b2lkIGFkZE5ld0FjdGl2ZShfSHR0cENsaWVudENvbm5lY3Rpb24gY29ubmVjdGlvbikgewogICAgX2FjdGl2ZS5hZGQoY29ubmVjdGlvbik7CiAgfQoKICB2b2lkIHJldHVybkNvbm5lY3Rpb24oX0h0dHBDbGllbnRDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKICAgIGFzc2VydChfYWN0aXZlLmNvbnRhaW5zKGNvbm5lY3Rpb24pKTsKICAgIF9hY3RpdmUucmVtb3ZlKGNvbm5lY3Rpb24pOwogICAgX2lkbGUuYWRkKGNvbm5lY3Rpb24pOwogICAgY29ubmVjdGlvbi5zdGFydFRpbWVyKCk7CiAgICBfY2hlY2tQZW5kaW5nKCk7CiAgfQoKICB2b2lkIGNvbm5lY3Rpb25DbG9zZWQoX0h0dHBDbGllbnRDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKICAgIGFzc2VydCghX2FjdGl2ZS5jb250YWlucyhjb25uZWN0aW9uKSB8fCAhX2lkbGUuY29udGFpbnMoY29ubmVjdGlvbikpOwogICAgX2FjdGl2ZS5yZW1vdmUoY29ubmVjdGlvbik7CiAgICBfaWRsZS5yZW1vdmUoY29ubmVjdGlvbik7CiAgICBfY2hlY2tQZW5kaW5nKCk7CiAgfQoKICB2b2lkIGNsb3NlKGJvb2wgZm9yY2UpIHsKICAgIC8vIEFsd2F5cyBjYW5jZWwgcGVuZGluZyBzb2NrZXQgY29ubmVjdGlvbnMuCiAgICBmb3IgKHZhciB0IGluIF9zb2NrZXRUYXNrcy50b0xpc3QoKSkgewogICAgICAvLyBNYWtlIHN1cmUgdGhlIHNvY2tldCBpcyBkZXN0cm95ZWQgaWYgdGhlIENvbm5lY3Rpb25UYXNrIGlzIGNhbmNlbGxlZC4KICAgICAgdC5zb2NrZXQudGhlbigocykgewogICAgICAgIHMuZGVzdHJveSgpOwogICAgICB9LCBvbkVycm9yOiAoZSkge30pOwogICAgICB0LmNhbmNlbCgpOwogICAgfQogICAgaWYgKGZvcmNlKSB7CiAgICAgIGZvciAodmFyIGMgaW4gX2lkbGUudG9MaXN0KCkpIHsKICAgICAgICBjLmRlc3Ryb3koKTsKICAgICAgfQogICAgICBmb3IgKHZhciBjIGluIF9hY3RpdmUudG9MaXN0KCkpIHsKICAgICAgICBjLmRlc3Ryb3koKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yICh2YXIgYyBpbiBfaWRsZS50b0xpc3QoKSkgewogICAgICAgIGMuY2xvc2UoKTsKICAgICAgfQogICAgfQogIH0KCiAgRnV0dXJlPF9Db25uZWN0aW9uSW5mbz4gY29ubmVjdCgKICAgICAgU3RyaW5nIHVyaUhvc3QsIGludCB1cmlQb3J0LCBfUHJveHkgcHJveHksIF9IdHRwQ2xpZW50IGNsaWVudCkgewogICAgaWYgKGhhc0lkbGUpIHsKICAgICAgdmFyIGNvbm5lY3Rpb24gPSB0YWtlSWRsZSgpOwogICAgICBjbGllbnQuX2Nvbm5lY3Rpb25zQ2hhbmdlZCgpOwogICAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShuZXcgX0Nvbm5lY3Rpb25JbmZvKGNvbm5lY3Rpb24sIHByb3h5KSk7CiAgICB9CiAgICBpZiAoY2xpZW50Lm1heENvbm5lY3Rpb25zUGVySG9zdCAhPSBudWxsICYmCiAgICAgICAgX2FjdGl2ZS5sZW5ndGggKyBfY29ubmVjdGluZyA+PSBjbGllbnQubWF4Q29ubmVjdGlvbnNQZXJIb3N0KSB7CiAgICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPF9Db25uZWN0aW9uSW5mbz4oKTsKICAgICAgX3BlbmRpbmcuYWRkKCgpIHsKICAgICAgICBjb21wbGV0ZXIuY29tcGxldGUoY29ubmVjdCh1cmlIb3N0LCB1cmlQb3J0LCBwcm94eSwgY2xpZW50KSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKICAgIH0KICAgIHZhciBjdXJyZW50QmFkQ2VydGlmaWNhdGVDYWxsYmFjayA9IGNsaWVudC5fYmFkQ2VydGlmaWNhdGVDYWxsYmFjazsKCiAgICBib29sIGNhbGxiYWNrKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSkgewogICAgICBpZiAoY3VycmVudEJhZENlcnRpZmljYXRlQ2FsbGJhY2sgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gY3VycmVudEJhZENlcnRpZmljYXRlQ2FsbGJhY2soY2VydGlmaWNhdGUsIHVyaUhvc3QsIHVyaVBvcnQpOwogICAgfQoKICAgIEZ1dHVyZTxDb25uZWN0aW9uVGFzaz4gY29ubmVjdGlvblRhc2sgPSAoaXNTZWN1cmUgJiYgcHJveHkuaXNEaXJlY3QKICAgICAgICA/IFNlY3VyZVNvY2tldC5zdGFydENvbm5lY3QoaG9zdCwgcG9ydCwKICAgICAgICAgICAgY29udGV4dDogY29udGV4dCwgb25CYWRDZXJ0aWZpY2F0ZTogY2FsbGJhY2spCiAgICAgICAgOiBTb2NrZXQuc3RhcnRDb25uZWN0KGhvc3QsIHBvcnQpKTsKICAgIF9jb25uZWN0aW5nKys7CiAgICByZXR1cm4gY29ubmVjdGlvblRhc2sudGhlbigoQ29ubmVjdGlvblRhc2sgdGFzaykgewogICAgICBfc29ja2V0VGFza3MuYWRkKHRhc2spOwogICAgICBGdXR1cmUgc29ja2V0RnV0dXJlID0gdGFzay5zb2NrZXQ7CiAgICAgIGlmIChjbGllbnQuY29ubmVjdGlvblRpbWVvdXQgIT0gbnVsbCkgewogICAgICAgIHNvY2tldEZ1dHVyZSA9CiAgICAgICAgICAgIHNvY2tldEZ1dHVyZS50aW1lb3V0KGNsaWVudC5jb25uZWN0aW9uVGltZW91dCwgb25UaW1lb3V0OiAoKSB7CiAgICAgICAgICBfc29ja2V0VGFza3MucmVtb3ZlKHRhc2spOwogICAgICAgICAgdGFzay5jYW5jZWwoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gc29ja2V0RnV0dXJlLnRoZW4oKHNvY2tldCkgewogICAgICAgIF9jb25uZWN0aW5nLS07CiAgICAgICAgc29ja2V0LnNldE9wdGlvbihTb2NrZXRPcHRpb24udGNwTm9EZWxheSwgdHJ1ZSk7CiAgICAgICAgdmFyIGNvbm5lY3Rpb24gPQogICAgICAgICAgICBuZXcgX0h0dHBDbGllbnRDb25uZWN0aW9uKGtleSwgc29ja2V0LCBjbGllbnQsIGZhbHNlLCBjb250ZXh0KTsKICAgICAgICBpZiAoaXNTZWN1cmUgJiYgIXByb3h5LmlzRGlyZWN0KSB7CiAgICAgICAgICBjb25uZWN0aW9uLl9kaXNwb3NlID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uCiAgICAgICAgICAgICAgLmNyZWF0ZVByb3h5VHVubmVsKHVyaUhvc3QsIHVyaVBvcnQsIHByb3h5LCBjYWxsYmFjaykKICAgICAgICAgICAgICAudGhlbigodHVubmVsKSB7CiAgICAgICAgICAgIGNsaWVudAogICAgICAgICAgICAgICAgLl9nZXRDb25uZWN0aW9uVGFyZ2V0KHVyaUhvc3QsIHVyaVBvcnQsIHRydWUpCiAgICAgICAgICAgICAgICAuYWRkTmV3QWN0aXZlKHR1bm5lbCk7CiAgICAgICAgICAgIF9zb2NrZXRUYXNrcy5yZW1vdmUodGFzayk7CiAgICAgICAgICAgIHJldHVybiBuZXcgX0Nvbm5lY3Rpb25JbmZvKHR1bm5lbCwgcHJveHkpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFkZE5ld0FjdGl2ZShjb25uZWN0aW9uKTsKICAgICAgICAgIF9zb2NrZXRUYXNrcy5yZW1vdmUodGFzayk7CiAgICAgICAgICByZXR1cm4gbmV3IF9Db25uZWN0aW9uSW5mbyhjb25uZWN0aW9uLCBwcm94eSk7CiAgICAgICAgfQogICAgICB9LCBvbkVycm9yOiAoZXJyb3IpIHsKICAgICAgICBfY29ubmVjdGluZy0tOwogICAgICAgIF9zb2NrZXRUYXNrcy5yZW1vdmUodGFzayk7CiAgICAgICAgX2NoZWNrUGVuZGluZygpOwogICAgICAgIHRocm93IGVycm9yOwogICAgICB9KTsKICAgIH0pOwogIH0KfQoKdHlwZWRlZiBib29sIEJhZENlcnRpZmljYXRlQ2FsbGJhY2soWDUwOUNlcnRpZmljYXRlIGNyLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQpOwoKY2xhc3MgX0h0dHBDbGllbnQgaW1wbGVtZW50cyBIdHRwQ2xpZW50IHsKICBib29sIF9jbG9zaW5nID0gZmFsc2U7CiAgYm9vbCBfY2xvc2luZ0ZvcmNlZnVsbHkgPSBmYWxzZTsKICBmaW5hbCBNYXA8U3RyaW5nLCBfQ29ubmVjdGlvblRhcmdldD4gX2Nvbm5lY3Rpb25UYXJnZXRzID0KICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBfQ29ubmVjdGlvblRhcmdldD4oKTsKICBmaW5hbCBMaXN0PF9DcmVkZW50aWFscz4gX2NyZWRlbnRpYWxzID0gW107CiAgZmluYWwgTGlzdDxfUHJveHlDcmVkZW50aWFscz4gX3Byb3h5Q3JlZGVudGlhbHMgPSBbXTsKICBmaW5hbCBTZWN1cml0eUNvbnRleHQgX2NvbnRleHQ7CiAgRnVuY3Rpb24gX2F1dGhlbnRpY2F0ZTsKICBGdW5jdGlvbiBfYXV0aGVudGljYXRlUHJveHk7CiAgRnVuY3Rpb24gX2ZpbmRQcm94eSA9IEh0dHBDbGllbnQuZmluZFByb3h5RnJvbUVudmlyb25tZW50OwogIER1cmF0aW9uIF9pZGxlVGltZW91dCA9IGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDE1KTsKICBCYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrIF9iYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrOwoKICBEdXJhdGlvbiBnZXQgaWRsZVRpbWVvdXQgPT4gX2lkbGVUaW1lb3V0OwoKICBEdXJhdGlvbiBjb25uZWN0aW9uVGltZW91dDsKCiAgaW50IG1heENvbm5lY3Rpb25zUGVySG9zdDsKCiAgYm9vbCBhdXRvVW5jb21wcmVzcyA9IHRydWU7CgogIFN0cmluZyB1c2VyQWdlbnQgPSBfZ2V0SHR0cFZlcnNpb24oKTsKCiAgX0h0dHBDbGllbnQodGhpcy5fY29udGV4dCk7CgogIHZvaWQgc2V0IGlkbGVUaW1lb3V0KER1cmF0aW9uIHRpbWVvdXQpIHsKICAgIF9pZGxlVGltZW91dCA9IHRpbWVvdXQ7CiAgICBmb3IgKHZhciBjIGluIF9jb25uZWN0aW9uVGFyZ2V0cy52YWx1ZXMpIHsKICAgICAgZm9yICh2YXIgaWRsZSBpbiBjLl9pZGxlKSB7CiAgICAgICAgLy8gUmVzZXQgdGltZXIuIFRoaXMgaXMgZmluZSwgYXMgaXQncyBub3QgaGFwcGVuaW5nIG9mdGVuLgogICAgICAgIGlkbGUuc3RvcFRpbWVyKCk7CiAgICAgICAgaWRsZS5zdGFydFRpbWVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIHNldCBiYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrKAogICAgICBib29sIGNhbGxiYWNrKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0LCBTdHJpbmcgaG9zdCwgaW50IHBvcnQpKSB7CiAgICBfYmFkQ2VydGlmaWNhdGVDYWxsYmFjayA9IGNhbGxiYWNrOwogIH0KCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBvcGVuKAogICAgICBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKSB7CiAgICBjb25zdCBpbnQgaGFzaE1hcmsgPSAweDIzOwogICAgY29uc3QgaW50IHF1ZXN0aW9uTWFyayA9IDB4M2Y7CiAgICBpbnQgZnJhZ21lbnRTdGFydCA9IHBhdGgubGVuZ3RoOwogICAgaW50IHF1ZXJ5U3RhcnQgPSBwYXRoLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHZhciBjaGFyID0gcGF0aC5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciA9PSBoYXNoTWFyaykgewogICAgICAgIGZyYWdtZW50U3RhcnQgPSBpOwogICAgICAgIHF1ZXJ5U3RhcnQgPSBpOwogICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gcXVlc3Rpb25NYXJrKSB7CiAgICAgICAgcXVlcnlTdGFydCA9IGk7CiAgICAgIH0KICAgIH0KICAgIFN0cmluZyBxdWVyeSA9IG51bGw7CiAgICBpZiAocXVlcnlTdGFydCA8IGZyYWdtZW50U3RhcnQpIHsKICAgICAgcXVlcnkgPSBwYXRoLnN1YnN0cmluZyhxdWVyeVN0YXJ0ICsgMSwgZnJhZ21lbnRTdGFydCk7CiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBxdWVyeVN0YXJ0KTsKICAgIH0KICAgIFVyaSB1cmkgPSBuZXcgVXJpKAogICAgICAgIHNjaGVtZTogImh0dHAiLCBob3N0OiBob3N0LCBwb3J0OiBwb3J0LCBwYXRoOiBwYXRoLCBxdWVyeTogcXVlcnkpOwogICAgcmV0dXJuIF9vcGVuVXJsKG1ldGhvZCwgdXJpKTsKICB9CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gb3BlblVybChTdHJpbmcgbWV0aG9kLCBVcmkgdXJsKSA9PgogICAgICBfb3BlblVybChtZXRob2QsIHVybCk7CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gZ2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHBhdGgpID0+CiAgICAgIG9wZW4oImdldCIsIGhvc3QsIHBvcnQsIHBhdGgpOwoKICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IGdldFVybChVcmkgdXJsKSA9PiBfb3BlblVybCgiZ2V0IiwgdXJsKTsKCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwb3N0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHBhdGgpID0+CiAgICAgIG9wZW4oInBvc3QiLCBob3N0LCBwb3J0LCBwYXRoKTsKCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwb3N0VXJsKFVyaSB1cmwpID0+IF9vcGVuVXJsKCJwb3N0IiwgdXJsKTsKCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwdXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcGF0aCkgPT4KICAgICAgb3BlbigicHV0IiwgaG9zdCwgcG9ydCwgcGF0aCk7CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gcHV0VXJsKFVyaSB1cmwpID0+IF9vcGVuVXJsKCJwdXQiLCB1cmwpOwoKICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IGRlbGV0ZShTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKSA9PgogICAgICBvcGVuKCJkZWxldGUiLCBob3N0LCBwb3J0LCBwYXRoKTsKCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBkZWxldGVVcmwoVXJpIHVybCkgPT4gX29wZW5VcmwoImRlbGV0ZSIsIHVybCk7CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gaGVhZChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKSA9PgogICAgICBvcGVuKCJoZWFkIiwgaG9zdCwgcG9ydCwgcGF0aCk7CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gaGVhZFVybChVcmkgdXJsKSA9PiBfb3BlblVybCgiaGVhZCIsIHVybCk7CgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gcGF0Y2goU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcGF0aCkgPT4KICAgICAgb3BlbigicGF0Y2giLCBob3N0LCBwb3J0LCBwYXRoKTsKCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwYXRjaFVybChVcmkgdXJsKSA9PiBfb3BlblVybCgicGF0Y2giLCB1cmwpOwoKICB2b2lkIGNsb3NlKHtib29sIGZvcmNlOiBmYWxzZX0pIHsKICAgIF9jbG9zaW5nID0gdHJ1ZTsKICAgIF9jbG9zaW5nRm9yY2VmdWxseSA9IGZvcmNlOwogICAgX2Nsb3NlQ29ubmVjdGlvbnMoX2Nsb3NpbmdGb3JjZWZ1bGx5KTsKICAgIGFzc2VydCghX2Nvbm5lY3Rpb25UYXJnZXRzLnZhbHVlcy5hbnkoKHMpID0+IHMuaGFzSWRsZSkpOwogICAgYXNzZXJ0KAogICAgICAgICFmb3JjZSB8fCAhX2Nvbm5lY3Rpb25UYXJnZXRzLnZhbHVlcy5hbnkoKHMpID0+IHMuX2FjdGl2ZS5pc05vdEVtcHR5KSk7CiAgfQoKICBzZXQgYXV0aGVudGljYXRlKEZ1dHVyZTxib29sPiBmKFVyaSB1cmwsIFN0cmluZyBzY2hlbWUsIFN0cmluZyByZWFsbSkpIHsKICAgIF9hdXRoZW50aWNhdGUgPSBmOwogIH0KCiAgdm9pZCBhZGRDcmVkZW50aWFscyhVcmkgdXJsLCBTdHJpbmcgcmVhbG0sIEh0dHBDbGllbnRDcmVkZW50aWFscyBjcikgewogICAgX2NyZWRlbnRpYWxzLmFkZChuZXcgX1NpdGVDcmVkZW50aWFscyh1cmwsIHJlYWxtLCBjcikpOwogIH0KCiAgc2V0IGF1dGhlbnRpY2F0ZVByb3h5KAogICAgICBGdXR1cmU8Ym9vbD4gZihTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBzY2hlbWUsIFN0cmluZyByZWFsbSkpIHsKICAgIF9hdXRoZW50aWNhdGVQcm94eSA9IGY7CiAgfQoKICB2b2lkIGFkZFByb3h5Q3JlZGVudGlhbHMoCiAgICAgIFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHJlYWxtLCBIdHRwQ2xpZW50Q3JlZGVudGlhbHMgY3IpIHsKICAgIF9wcm94eUNyZWRlbnRpYWxzLmFkZChuZXcgX1Byb3h5Q3JlZGVudGlhbHMoaG9zdCwgcG9ydCwgcmVhbG0sIGNyKSk7CiAgfQoKICBzZXQgZmluZFByb3h5KFN0cmluZyBmKFVyaSB1cmkpKSA9PiBfZmluZFByb3h5ID0gZjsKCiAgRnV0dXJlPF9IdHRwQ2xpZW50UmVxdWVzdD4gX29wZW5VcmwoU3RyaW5nIG1ldGhvZCwgVXJpIHVyaSkgewogICAgaWYgKF9jbG9zaW5nKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJDbGllbnQgaXMgY2xvc2VkIik7CiAgICB9CgogICAgLy8gSWdub3JlIGFueSBmcmFnbWVudHMgb24gdGhlIHJlcXVlc3QgVVJJLgogICAgdXJpID0gdXJpLnJlbW92ZUZyYWdtZW50KCk7CgogICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKG1ldGhvZCk7CiAgICB9CiAgICBpZiAobWV0aG9kICE9ICJDT05ORUNUIikgewogICAgICBpZiAodXJpLmhvc3QuaXNFbXB0eSkgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJObyBob3N0IHNwZWNpZmllZCBpbiBVUkkgJHVyaSIpOwogICAgICB9IGVsc2UgaWYgKHVyaS5zY2hlbWUgIT0gImh0dHAiICYmIHVyaS5zY2hlbWUgIT0gImh0dHBzIikgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgICAiVW5zdXBwb3J0ZWQgc2NoZW1lICcke3VyaS5zY2hlbWV9JyBpbiBVUkkgJHVyaSIpOwogICAgICB9CiAgICB9CgogICAgYm9vbCBpc1NlY3VyZSA9ICh1cmkuc2NoZW1lID09ICJodHRwcyIpOwogICAgaW50IHBvcnQgPSB1cmkucG9ydDsKICAgIGlmIChwb3J0ID09IDApIHsKICAgICAgcG9ydCA9CiAgICAgICAgICBpc1NlY3VyZSA/IEh0dHBDbGllbnQuZGVmYXVsdEh0dHBzUG9ydCA6IEh0dHBDbGllbnQuZGVmYXVsdEh0dHBQb3J0OwogICAgfQogICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGEgcHJveHkgc2VydmVyIHNob3VsZCBiZSB1c2VkIGZvciB0aGlzIGNvbm5lY3Rpb24uCiAgICB2YXIgcHJveHlDb25mID0gY29uc3QgX1Byb3h5Q29uZmlndXJhdGlvbi5kaXJlY3QoKTsKICAgIGlmIChfZmluZFByb3h5ICE9IG51bGwpIHsKICAgICAgLy8gVE9ETyhzZ2plc3NlKTogS2VlcCBhIG1hcCBvZiB0aGVzZSBhcyBub3JtYWxseSBvbmx5IGEgZmV3CiAgICAgIC8vIGNvbmZpZ3VyYXRpb24gc3RyaW5ncyB3aWxsIGJlIHVzZWQuCiAgICAgIHRyeSB7CiAgICAgICAgcHJveHlDb25mID0gbmV3IF9Qcm94eUNvbmZpZ3VyYXRpb24oX2ZpbmRQcm94eSh1cmkpKTsKICAgICAgfSBjYXRjaCAoZXJyb3IsIHN0YWNrVHJhY2UpIHsKICAgICAgICByZXR1cm4gbmV3IEZ1dHVyZS5lcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfZ2V0Q29ubmVjdGlvbih1cmkuaG9zdCwgcG9ydCwgcHJveHlDb25mLCBpc1NlY3VyZSkKICAgICAgICAudGhlbigoX0Nvbm5lY3Rpb25JbmZvIGluZm8pIHsKICAgICAgX0h0dHBDbGllbnRSZXF1ZXN0IHNlbmQoX0Nvbm5lY3Rpb25JbmZvIGluZm8pIHsKICAgICAgICByZXR1cm4gaW5mby5jb25uZWN0aW9uCiAgICAgICAgICAgIC5zZW5kKHVyaSwgcG9ydCwgbWV0aG9kLnRvVXBwZXJDYXNlKCksIGluZm8ucHJveHkpOwogICAgICB9CgogICAgICAvLyBJZiB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGJlZm9yZSB0aGUgcmVxdWVzdCB3YXMgc2VudCwgY3JlYXRlCiAgICAgIC8vIGFuZCB1c2UgYW5vdGhlciBjb25uZWN0aW9uLgogICAgICBpZiAoaW5mby5jb25uZWN0aW9uLmNsb3NlZCkgewogICAgICAgIHJldHVybiBfZ2V0Q29ubmVjdGlvbih1cmkuaG9zdCwgcG9ydCwgcHJveHlDb25mLCBpc1NlY3VyZSkudGhlbihzZW5kKTsKICAgICAgfQogICAgICByZXR1cm4gc2VuZChpbmZvKTsKICAgIH0pOwogIH0KCiAgRnV0dXJlPF9IdHRwQ2xpZW50UmVxdWVzdD4gX29wZW5VcmxGcm9tUmVxdWVzdCgKICAgICAgU3RyaW5nIG1ldGhvZCwgVXJpIHVyaSwgX0h0dHBDbGllbnRSZXF1ZXN0IHByZXZpb3VzKSB7CiAgICAvLyBJZiB0aGUgbmV3IFVSSSBpcyByZWxhdGl2ZSAodG8gZWl0aGVyICcvJyBvciBzb21lIHN1Yi1wYXRoKSwKICAgIC8vIGNvbnN0cnVjdCBhIGZ1bGwgVVJJIGZyb20gdGhlIHByZXZpb3VzIG9uZS4KICAgIFVyaSByZXNvbHZlZCA9IHByZXZpb3VzLnVyaS5yZXNvbHZlVXJpKHVyaSk7CiAgICByZXR1cm4gX29wZW5VcmwobWV0aG9kLCByZXNvbHZlZCkudGhlbigoX0h0dHBDbGllbnRSZXF1ZXN0IHJlcXVlc3QpIHsKICAgICAgcmVxdWVzdAogICAgICAgIC8vIE9ubHkgZm9sbG93IHJlZGlyZWN0cyBpZiBpbml0aWFsIHJlcXVlc3QgZGlkLgogICAgICAgIC4uZm9sbG93UmVkaXJlY3RzID0gcHJldmlvdXMuZm9sbG93UmVkaXJlY3RzCiAgICAgICAgLy8gQWxsb3cgc2FtZSBudW1iZXIgb2YgcmVkaXJlY3RzLgogICAgICAgIC4ubWF4UmVkaXJlY3RzID0gcHJldmlvdXMubWF4UmVkaXJlY3RzOwogICAgICAvLyBDb3B5IGhlYWRlcnMuCiAgICAgIGZvciAodmFyIGhlYWRlciBpbiBwcmV2aW91cy5oZWFkZXJzLl9oZWFkZXJzLmtleXMpIHsKICAgICAgICBpZiAocmVxdWVzdC5oZWFkZXJzW2hlYWRlcl0gPT0gbnVsbCkgewogICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldChoZWFkZXIsIHByZXZpb3VzLmhlYWRlcnNbaGVhZGVyXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXF1ZXN0CiAgICAgICAgLi5oZWFkZXJzLmNodW5rZWRUcmFuc2ZlckVuY29kaW5nID0gZmFsc2UKICAgICAgICAuLmNvbnRlbnRMZW5ndGggPSAwOwogICAgfSk7CiAgfQoKICAvLyBSZXR1cm4gYSBsaXZlIGNvbm5lY3Rpb24gdG8gdGhlIGlkbGUgcG9vbC4KICB2b2lkIF9yZXR1cm5Db25uZWN0aW9uKF9IdHRwQ2xpZW50Q29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CiAgICBfY29ubmVjdGlvblRhcmdldHNbY29ubmVjdGlvbi5rZXldLnJldHVybkNvbm5lY3Rpb24oY29ubmVjdGlvbik7CiAgICBfY29ubmVjdGlvbnNDaGFuZ2VkKCk7CiAgfQoKICAvLyBSZW1vdmUgYSBjbG9zZWQgY29ubmVjdGlvbiBmcm9tIHRoZSBhY3RpdmUgc2V0LgogIHZvaWQgX2Nvbm5lY3Rpb25DbG9zZWQoX0h0dHBDbGllbnRDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKICAgIGNvbm5lY3Rpb24uc3RvcFRpbWVyKCk7CiAgICB2YXIgY29ubmVjdGlvblRhcmdldCA9IF9jb25uZWN0aW9uVGFyZ2V0c1tjb25uZWN0aW9uLmtleV07CiAgICBpZiAoY29ubmVjdGlvblRhcmdldCAhPSBudWxsKSB7CiAgICAgIGNvbm5lY3Rpb25UYXJnZXQuY29ubmVjdGlvbkNsb3NlZChjb25uZWN0aW9uKTsKICAgICAgaWYgKGNvbm5lY3Rpb25UYXJnZXQuaXNFbXB0eSkgewogICAgICAgIF9jb25uZWN0aW9uVGFyZ2V0cy5yZW1vdmUoY29ubmVjdGlvbi5rZXkpOwogICAgICB9CiAgICAgIF9jb25uZWN0aW9uc0NoYW5nZWQoKTsKICAgIH0KICB9CgogIHZvaWQgX2Nvbm5lY3Rpb25zQ2hhbmdlZCgpIHsKICAgIGlmIChfY2xvc2luZykgewogICAgICBfY2xvc2VDb25uZWN0aW9ucyhfY2xvc2luZ0ZvcmNlZnVsbHkpOwogICAgfQogIH0KCiAgdm9pZCBfY2xvc2VDb25uZWN0aW9ucyhib29sIGZvcmNlKSB7CiAgICBmb3IgKHZhciBjb25uZWN0aW9uVGFyZ2V0IGluIF9jb25uZWN0aW9uVGFyZ2V0cy52YWx1ZXMudG9MaXN0KCkpIHsKICAgICAgY29ubmVjdGlvblRhcmdldC5jbG9zZShmb3JjZSk7CiAgICB9CiAgfQoKICBfQ29ubmVjdGlvblRhcmdldCBfZ2V0Q29ubmVjdGlvblRhcmdldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGJvb2wgaXNTZWN1cmUpIHsKICAgIFN0cmluZyBrZXkgPSBfSHR0cENsaWVudENvbm5lY3Rpb24ubWFrZUtleShpc1NlY3VyZSwgaG9zdCwgcG9ydCk7CiAgICByZXR1cm4gX2Nvbm5lY3Rpb25UYXJnZXRzLnB1dElmQWJzZW50KGtleSwgKCkgewogICAgICByZXR1cm4gbmV3IF9Db25uZWN0aW9uVGFyZ2V0KGtleSwgaG9zdCwgcG9ydCwgaXNTZWN1cmUsIF9jb250ZXh0KTsKICAgIH0pOwogIH0KCiAgLy8gR2V0IGEgbmV3IF9IdHRwQ2xpZW50Q29ubmVjdGlvbiwgZnJvbSB0aGUgbWF0Y2hpbmcgX0Nvbm5lY3Rpb25UYXJnZXQuCiAgRnV0dXJlPF9Db25uZWN0aW9uSW5mbz4gX2dldENvbm5lY3Rpb24oU3RyaW5nIHVyaUhvc3QsIGludCB1cmlQb3J0LAogICAgICBfUHJveHlDb25maWd1cmF0aW9uIHByb3h5Q29uZiwgYm9vbCBpc1NlY3VyZSkgewogICAgSXRlcmF0b3I8X1Byb3h5PiBwcm94aWVzID0gcHJveHlDb25mLnByb3hpZXMuaXRlcmF0b3I7CgogICAgRnV0dXJlPF9Db25uZWN0aW9uSW5mbz4gY29ubmVjdChlcnJvcikgewogICAgICBpZiAoIXByb3hpZXMubW92ZU5leHQoKSkgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IoZXJyb3IpOwogICAgICBfUHJveHkgcHJveHkgPSBwcm94aWVzLmN1cnJlbnQ7CiAgICAgIFN0cmluZyBob3N0ID0gcHJveHkuaXNEaXJlY3QgPyB1cmlIb3N0IDogcHJveHkuaG9zdDsKICAgICAgaW50IHBvcnQgPSBwcm94eS5pc0RpcmVjdCA/IHVyaVBvcnQgOiBwcm94eS5wb3J0OwogICAgICByZXR1cm4gX2dldENvbm5lY3Rpb25UYXJnZXQoaG9zdCwgcG9ydCwgaXNTZWN1cmUpCiAgICAgICAgICAuY29ubmVjdCh1cmlIb3N0LCB1cmlQb3J0LCBwcm94eSwgdGhpcykKICAgICAgICAgIC8vIE9uIGVycm9yLCBjb250aW51ZSB3aXRoIG5leHQgcHJveHkuCiAgICAgICAgICAuY2F0Y2hFcnJvcihjb25uZWN0KTsKICAgIH0KCiAgICByZXR1cm4gY29ubmVjdChuZXcgSHR0cEV4Y2VwdGlvbigiTm8gcHJveGllcyBnaXZlbiIpKTsKICB9CgogIF9TaXRlQ3JlZGVudGlhbHMgX2ZpbmRDcmVkZW50aWFscyhVcmkgdXJsLCBbX0F1dGhlbnRpY2F0aW9uU2NoZW1lIHNjaGVtZV0pIHsKICAgIC8vIExvb2sgZm9yIGNyZWRlbnRpYWxzLgogICAgX1NpdGVDcmVkZW50aWFscyBjciA9CiAgICAgICAgX2NyZWRlbnRpYWxzLmZvbGQobnVsbCwgKF9TaXRlQ3JlZGVudGlhbHMgcHJldiwgdmFsdWUpIHsKICAgICAgdmFyIHNpdGVDcmVkZW50aWFscyA9IHZhbHVlIGFzIF9TaXRlQ3JlZGVudGlhbHM7CiAgICAgIGlmIChzaXRlQ3JlZGVudGlhbHMuYXBwbGllcyh1cmwsIHNjaGVtZSkpIHsKICAgICAgICBpZiAocHJldiA9PSBudWxsKSByZXR1cm4gdmFsdWU7CiAgICAgICAgcmV0dXJuIHNpdGVDcmVkZW50aWFscy51cmkucGF0aC5sZW5ndGggPiBwcmV2LnVyaS5wYXRoLmxlbmd0aAogICAgICAgICAgICA/IHNpdGVDcmVkZW50aWFscwogICAgICAgICAgICA6IHByZXY7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHByZXY7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIGNyOwogIH0KCiAgX1Byb3h5Q3JlZGVudGlhbHMgX2ZpbmRQcm94eUNyZWRlbnRpYWxzKF9Qcm94eSBwcm94eSwKICAgICAgW19BdXRoZW50aWNhdGlvblNjaGVtZSBzY2hlbWVdKSB7CiAgICAvLyBMb29rIGZvciBjcmVkZW50aWFscy4KICAgIHZhciBpdCA9IF9wcm94eUNyZWRlbnRpYWxzLml0ZXJhdG9yOwogICAgd2hpbGUgKGl0Lm1vdmVOZXh0KCkpIHsKICAgICAgaWYgKGl0LmN1cnJlbnQuYXBwbGllcyhwcm94eSwgc2NoZW1lKSkgewogICAgICAgIHJldHVybiBpdC5jdXJyZW50OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgX3JlbW92ZUNyZWRlbnRpYWxzKF9DcmVkZW50aWFscyBjcikgewogICAgaW50IGluZGV4ID0gX2NyZWRlbnRpYWxzLmluZGV4T2YoY3IpOwogICAgaWYgKGluZGV4ICE9IC0xKSB7CiAgICAgIF9jcmVkZW50aWFscy5yZW1vdmVBdChpbmRleCk7CiAgICB9CiAgfQoKICB2b2lkIF9yZW1vdmVQcm94eUNyZWRlbnRpYWxzKF9DcmVkZW50aWFscyBjcikgewogICAgaW50IGluZGV4ID0gX3Byb3h5Q3JlZGVudGlhbHMuaW5kZXhPZihjcik7CiAgICBpZiAoaW5kZXggIT0gLTEpIHsKICAgICAgX3Byb3h5Q3JlZGVudGlhbHMucmVtb3ZlQXQoaW5kZXgpOwogICAgfQogIH0KCiAgc3RhdGljIFN0cmluZyBfZmluZFByb3h5RnJvbUVudmlyb25tZW50KAogICAgICBVcmkgdXJsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50KSB7CiAgICBjaGVja05vUHJveHkoU3RyaW5nIG9wdGlvbikgewogICAgICBpZiAob3B0aW9uID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzID0gb3B0aW9uLnNwbGl0KCIsIikubWFwKChzKSA9PiBzLnRyaW0oKSkuaXRlcmF0b3I7CiAgICAgIHdoaWxlIChuYW1lcy5tb3ZlTmV4dCgpKSB7CiAgICAgICAgdmFyIG5hbWUgPSBuYW1lcy5jdXJyZW50OwogICAgICAgIGlmICgobmFtZS5zdGFydHNXaXRoKCJbIikgJiYKICAgICAgICAgICAgICAgIG5hbWUuZW5kc1dpdGgoIl0iKSAmJgogICAgICAgICAgICAgICAgIlske3VybC5ob3N0fV0iID09IG5hbWUpIHx8CiAgICAgICAgICAgIChuYW1lLmlzTm90RW1wdHkgJiYgdXJsLmhvc3QuZW5kc1dpdGgobmFtZSkpKSB7CiAgICAgICAgICByZXR1cm4gIkRJUkVDVCI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGNoZWNrUHJveHkoU3RyaW5nIG9wdGlvbikgewogICAgICBpZiAob3B0aW9uID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBvcHRpb24gPSBvcHRpb24udHJpbSgpOwogICAgICBpZiAob3B0aW9uLmlzRW1wdHkpIHJldHVybiBudWxsOwogICAgICBpbnQgcG9zID0gb3B0aW9uLmluZGV4T2YoIjovLyIpOwogICAgICBpZiAocG9zID49IDApIHsKICAgICAgICBvcHRpb24gPSBvcHRpb24uc3Vic3RyaW5nKHBvcyArIDMpOwogICAgICB9CiAgICAgIHBvcyA9IG9wdGlvbi5pbmRleE9mKCIvIik7CiAgICAgIGlmIChwb3MgPj0gMCkgewogICAgICAgIG9wdGlvbiA9IG9wdGlvbi5zdWJzdHJpbmcoMCwgcG9zKTsKICAgICAgfQogICAgICAvLyBBZGQgZGVmYXVsdCBwb3J0IGlmIG5vIHBvcnQgY29uZmlndXJlZC4KICAgICAgaWYgKG9wdGlvbi5pbmRleE9mKCJbIikgPT0gMCkgewogICAgICAgIHZhciBwb3MgPSBvcHRpb24ubGFzdEluZGV4T2YoIjoiKTsKICAgICAgICBpZiAob3B0aW9uLmluZGV4T2YoIl0iKSA+IHBvcykgb3B0aW9uID0gIiRvcHRpb246MTA4MCI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG9wdGlvbi5pbmRleE9mKCI6IikgPT0gLTEpIG9wdGlvbiA9ICIkb3B0aW9uOjEwODAiOwogICAgICB9CiAgICAgIHJldHVybiAiUFJPWFkgJG9wdGlvbiI7CiAgICB9CgogICAgLy8gRGVmYXVsdCB0byB1c2luZyB0aGUgcHJvY2VzcyBjdXJyZW50IGVudmlyb25tZW50LgogICAgaWYgKGVudmlyb25tZW50ID09IG51bGwpIGVudmlyb25tZW50ID0gX3BsYXRmb3JtRW52aXJvbm1lbnRDYWNoZTsKCiAgICBTdHJpbmcgcHJveHlDZmc7CgogICAgU3RyaW5nIG5vUHJveHkgPSBlbnZpcm9ubWVudFsibm9fcHJveHkiXTsKICAgIGlmIChub1Byb3h5ID09IG51bGwpIG5vUHJveHkgPSBlbnZpcm9ubWVudFsiTk9fUFJPWFkiXTsKICAgIGlmICgocHJveHlDZmcgPSBjaGVja05vUHJveHkobm9Qcm94eSkpICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHByb3h5Q2ZnOwogICAgfQoKICAgIGlmICh1cmwuc2NoZW1lID09ICJodHRwIikgewogICAgICBTdHJpbmcgcHJveHkgPSBlbnZpcm9ubWVudFsiaHR0cF9wcm94eSJdOwogICAgICBpZiAocHJveHkgPT0gbnVsbCkgcHJveHkgPSBlbnZpcm9ubWVudFsiSFRUUF9QUk9YWSJdOwogICAgICBpZiAoKHByb3h5Q2ZnID0gY2hlY2tQcm94eShwcm94eSkpICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gcHJveHlDZmc7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodXJsLnNjaGVtZSA9PSAiaHR0cHMiKSB7CiAgICAgIFN0cmluZyBwcm94eSA9IGVudmlyb25tZW50WyJodHRwc19wcm94eSJdOwogICAgICBpZiAocHJveHkgPT0gbnVsbCkgcHJveHkgPSBlbnZpcm9ubWVudFsiSFRUUFNfUFJPWFkiXTsKICAgICAgaWYgKChwcm94eUNmZyA9IGNoZWNrUHJveHkocHJveHkpKSAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHByb3h5Q2ZnOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gIkRJUkVDVCI7CiAgfQoKICBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBfcGxhdGZvcm1FbnZpcm9ubWVudENhY2hlID0gUGxhdGZvcm0uZW52aXJvbm1lbnQ7Cn0KCmNsYXNzIF9IdHRwQ29ubmVjdGlvbiBleHRlbmRzIExpbmtlZExpc3RFbnRyeTxfSHR0cENvbm5lY3Rpb24+CiAgICB3aXRoIF9TZXJ2aWNlT2JqZWN0IHsKICBzdGF0aWMgY29uc3QgX0FDVElWRSA9IDA7CiAgc3RhdGljIGNvbnN0IF9JRExFID0gMTsKICBzdGF0aWMgY29uc3QgX0NMT1NJTkcgPSAyOwogIHN0YXRpYyBjb25zdCBfREVUQUNIRUQgPSAzOwoKICAvLyBVc2UgSGFzaE1hcCwgYXMgd2UgZG9uJ3QgbmVlZCB0byBrZWVwIG9yZGVyLgogIHN0YXRpYyBNYXA8aW50LCBfSHR0cENvbm5lY3Rpb24+IF9jb25uZWN0aW9ucyA9CiAgICAgIG5ldyBIYXNoTWFwPGludCwgX0h0dHBDb25uZWN0aW9uPigpOwoKICBmaW5hbCAvKl9TZXJ2ZXJTb2NrZXQqLyBfc29ja2V0OwogIGZpbmFsIF9IdHRwU2VydmVyIF9odHRwU2VydmVyOwogIGZpbmFsIF9IdHRwUGFyc2VyIF9odHRwUGFyc2VyOwogIGludCBfc3RhdGUgPSBfSURMRTsKICBTdHJlYW1TdWJzY3JpcHRpb24gX3N1YnNjcmlwdGlvbjsKICBib29sIF9pZGxlTWFyayA9IGZhbHNlOwogIEZ1dHVyZSBfc3RyZWFtRnV0dXJlOwoKICBfSHR0cENvbm5lY3Rpb24odGhpcy5fc29ja2V0LCB0aGlzLl9odHRwU2VydmVyKQogICAgICA6IF9odHRwUGFyc2VyID0gbmV3IF9IdHRwUGFyc2VyLnJlcXVlc3RQYXJzZXIoKSB7CiAgICBfY29ubmVjdGlvbnNbX3NlcnZpY2VJZF0gPSB0aGlzOwogICAgX2h0dHBQYXJzZXIubGlzdGVuVG9TdHJlYW0oX3NvY2tldCk7CiAgICBfc3Vic2NyaXB0aW9uID0gX2h0dHBQYXJzZXIubGlzdGVuKChpbmNvbWluZykgewogICAgICBfaHR0cFNlcnZlci5fbWFya0FjdGl2ZSh0aGlzKTsKICAgICAgLy8gSWYgdGhlIGluY29taW5nIHdhcyBjbG9zZWQsIGNsb3NlIHRoZSBjb25uZWN0aW9uLgogICAgICBpbmNvbWluZy5kYXRhRG9uZS50aGVuKChjbG9zaW5nKSB7CiAgICAgICAgaWYgKGNsb3NpbmcpIGRlc3Ryb3koKTsKICAgICAgfSk7CiAgICAgIC8vIE9ubHkgaGFuZGxlIG9uZSBpbmNvbWluZyByZXF1ZXN0IGF0IHRoZSB0aW1lLiBLZWVwIHRoZQogICAgICAvLyBzdHJlYW0gcGF1c2VkIHVudGlsIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHNlbmQuCiAgICAgIF9zdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgICAgX3N0YXRlID0gX0FDVElWRTsKICAgICAgdmFyIG91dGdvaW5nID0gbmV3IF9IdHRwT3V0Z29pbmcoX3NvY2tldCk7CiAgICAgIHZhciByZXNwb25zZSA9IG5ldyBfSHR0cFJlc3BvbnNlKAogICAgICAgICAgaW5jb21pbmcudXJpLAogICAgICAgICAgaW5jb21pbmcuaGVhZGVycy5wcm90b2NvbFZlcnNpb24sCiAgICAgICAgICBvdXRnb2luZywKICAgICAgICAgIF9odHRwU2VydmVyLmRlZmF1bHRSZXNwb25zZUhlYWRlcnMsCiAgICAgICAgICBfaHR0cFNlcnZlci5zZXJ2ZXJIZWFkZXIpOwogICAgICB2YXIgcmVxdWVzdCA9IG5ldyBfSHR0cFJlcXVlc3QocmVzcG9uc2UsIGluY29taW5nLCBfaHR0cFNlcnZlciwgdGhpcyk7CiAgICAgIF9zdHJlYW1GdXR1cmUgPSBvdXRnb2luZy5kb25lLnRoZW4oKF8pIHsKICAgICAgICByZXNwb25zZS5kZWFkbGluZSA9IG51bGw7CiAgICAgICAgaWYgKF9zdGF0ZSA9PSBfREVUQUNIRUQpIHJldHVybjsKICAgICAgICBpZiAocmVzcG9uc2UucGVyc2lzdGVudENvbm5lY3Rpb24gJiYKICAgICAgICAgICAgcmVxdWVzdC5wZXJzaXN0ZW50Q29ubmVjdGlvbiAmJgogICAgICAgICAgICBpbmNvbWluZy5mdWxsQm9keVJlYWQgJiYKICAgICAgICAgICAgIV9odHRwUGFyc2VyLnVwZ3JhZGUgJiYKICAgICAgICAgICAgIV9odHRwU2VydmVyLmNsb3NlZCkgewogICAgICAgICAgX3N0YXRlID0gX0lETEU7CiAgICAgICAgICBfaWRsZU1hcmsgPSBmYWxzZTsKICAgICAgICAgIF9odHRwU2VydmVyLl9tYXJrSWRsZSh0aGlzKTsKICAgICAgICAgIC8vIFJlc3VtZSB0aGUgc3Vic2NyaXB0aW9uIGZvciBpbmNvbWluZyByZXF1ZXN0cyBhcyB0aGUKICAgICAgICAgIC8vIHJlcXVlc3QgaXMgbm93IHByb2Nlc3NlZC4KICAgICAgICAgIF9zdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIENsb3NlIHNvY2tldCwga2VlcC1hbGl2ZSBub3QgdXNlZCBvciBib2R5IHNlbnQgYmVmb3JlCiAgICAgICAgICAvLyByZWNlaXZlZCBkYXRhIHdhcyBoYW5kbGVkLgogICAgICAgICAgZGVzdHJveSgpOwogICAgICAgIH0KICAgICAgfSwgb25FcnJvcjogKF8pIHsKICAgICAgICBkZXN0cm95KCk7CiAgICAgIH0pOwogICAgICBvdXRnb2luZy5pZ25vcmVCb2R5ID0gcmVxdWVzdC5tZXRob2QgPT0gIkhFQUQiOwogICAgICByZXNwb25zZS5faHR0cFJlcXVlc3QgPSByZXF1ZXN0OwogICAgICBfaHR0cFNlcnZlci5faGFuZGxlUmVxdWVzdChyZXF1ZXN0KTsKICAgIH0sIG9uRG9uZTogKCkgewogICAgICBkZXN0cm95KCk7CiAgICB9LCBvbkVycm9yOiAoZXJyb3IpIHsKICAgICAgLy8gSWdub3JlIGZhaWxlZCByZXF1ZXN0cyB0aGF0IHdhcyBjbG9zZWQgYmVmb3JlIGhlYWRlcnMgd2FzIHJlY2VpdmVkLgogICAgICBkZXN0cm95KCk7CiAgICB9KTsKICB9CgogIHZvaWQgbWFya0lkbGUoKSB7CiAgICBfaWRsZU1hcmsgPSB0cnVlOwogIH0KCiAgYm9vbCBnZXQgaXNNYXJrZWRJZGxlID0+IF9pZGxlTWFyazsKCiAgdm9pZCBkZXN0cm95KCkgewogICAgaWYgKF9zdGF0ZSA9PSBfQ0xPU0lORyB8fCBfc3RhdGUgPT0gX0RFVEFDSEVEKSByZXR1cm47CiAgICBfc3RhdGUgPSBfQ0xPU0lORzsKICAgIF9zb2NrZXQuZGVzdHJveSgpOwogICAgX2h0dHBTZXJ2ZXIuX2Nvbm5lY3Rpb25DbG9zZWQodGhpcyk7CiAgICBfY29ubmVjdGlvbnMucmVtb3ZlKF9zZXJ2aWNlSWQpOwogIH0KCiAgRnV0dXJlPFNvY2tldD4gZGV0YWNoU29ja2V0KCkgewogICAgX3N0YXRlID0gX0RFVEFDSEVEOwogICAgLy8gUmVtb3ZlIGNvbm5lY3Rpb24gZnJvbSBzZXJ2ZXIuCiAgICBfaHR0cFNlcnZlci5fY29ubmVjdGlvbkNsb3NlZCh0aGlzKTsKCiAgICBfSHR0cERldGFjaGVkSW5jb21pbmcgZGV0YWNoZWRJbmNvbWluZyA9IF9odHRwUGFyc2VyLmRldGFjaEluY29taW5nKCk7CgogICAgcmV0dXJuIF9zdHJlYW1GdXR1cmUudGhlbigoXykgewogICAgICBfY29ubmVjdGlvbnMucmVtb3ZlKF9zZXJ2aWNlSWQpOwogICAgICByZXR1cm4gbmV3IF9EZXRhY2hlZFNvY2tldChfc29ja2V0LCBkZXRhY2hlZEluY29taW5nKTsKICAgIH0pOwogIH0KCiAgSHR0cENvbm5lY3Rpb25JbmZvIGdldCBjb25uZWN0aW9uSW5mbyA9PiBfSHR0cENvbm5lY3Rpb25JbmZvLmNyZWF0ZShfc29ja2V0KTsKCiAgYm9vbCBnZXQgX2lzQWN0aXZlID0+IF9zdGF0ZSA9PSBfQUNUSVZFOwogIGJvb2wgZ2V0IF9pc0lkbGUgPT4gX3N0YXRlID09IF9JRExFOwogIGJvb2wgZ2V0IF9pc0Nsb3NpbmcgPT4gX3N0YXRlID09IF9DTE9TSU5HOwogIGJvb2wgZ2V0IF9pc0RldGFjaGVkID0+IF9zdGF0ZSA9PSBfREVUQUNIRUQ7CgogIFN0cmluZyBnZXQgX3NlcnZpY2VUeXBlUGF0aCA9PiAnaW8vaHR0cC9zZXJ2ZXJjb25uZWN0aW9ucyc7CiAgU3RyaW5nIGdldCBfc2VydmljZVR5cGVOYW1lID0+ICdIdHRwU2VydmVyQ29ubmVjdGlvbic7CgogIE1hcCBfdG9KU09OKGJvb2wgcmVmKSB7CiAgICB2YXIgbmFtZSA9ICIke19zb2NrZXQuYWRkcmVzcy5ob3N0fToke19zb2NrZXQucG9ydH0gPC0+ICIKICAgICAgICAiJHtfc29ja2V0LnJlbW90ZUFkZHJlc3MuaG9zdH06JHtfc29ja2V0LnJlbW90ZVBvcnR9IjsKICAgIHZhciByID0gPFN0cmluZywgZHluYW1pYz57CiAgICAgICdpZCc6IF9zZXJ2aWNlUGF0aCwKICAgICAgJ3R5cGUnOiBfc2VydmljZVR5cGUocmVmKSwKICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAndXNlcl9uYW1lJzogbmFtZSwKICAgIH07CiAgICBpZiAocmVmKSB7CiAgICAgIHJldHVybiByOwogICAgfQogICAgclsnc2VydmVyJ10gPSBfaHR0cFNlcnZlci5fdG9KU09OKHRydWUpOwogICAgdHJ5IHsKICAgICAgclsnc29ja2V0J10gPSBfc29ja2V0Ll90b0pTT04odHJ1ZSk7CiAgICB9IGNhdGNoIChfKSB7CiAgICAgIHJbJ3NvY2tldCddID0gewogICAgICAgICdpZCc6IF9zZXJ2aWNlUGF0aCwKICAgICAgICAndHlwZSc6ICdAU29ja2V0JywKICAgICAgICAnbmFtZSc6ICdVc2VyU29ja2V0JywKICAgICAgICAndXNlcl9uYW1lJzogJ1VzZXJTb2NrZXQnLAogICAgICB9OwogICAgfQogICAgc3dpdGNoIChfc3RhdGUpIHsKICAgICAgY2FzZSBfQUNUSVZFOgogICAgICAgIHJbJ3N0YXRlJ10gPSAiQWN0aXZlIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBfSURMRToKICAgICAgICByWydzdGF0ZSddID0gIklkbGUiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIF9DTE9TSU5HOgogICAgICAgIHJbJ3N0YXRlJ10gPSAiQ2xvc2luZyI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgX0RFVEFDSEVEOgogICAgICAgIHJbJ3N0YXRlJ10gPSAiRGV0YWNoZWQiOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHJbJ3N0YXRlJ10gPSAnVW5rbm93bic7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gcjsKICB9Cn0KCi8vIEhUVFAgc2VydmVyIHdhaXRpbmcgZm9yIHNvY2tldCBjb25uZWN0aW9ucy4KY2xhc3MgX0h0dHBTZXJ2ZXIgZXh0ZW5kcyBTdHJlYW08SHR0cFJlcXVlc3Q+CiAgICB3aXRoIF9TZXJ2aWNlT2JqZWN0CiAgICBpbXBsZW1lbnRzIEh0dHBTZXJ2ZXIgewogIC8vIFVzZSBkZWZhdWx0IE1hcCBzbyB3ZSBrZWVwIG9yZGVyLgogIHN0YXRpYyBNYXA8aW50LCBfSHR0cFNlcnZlcj4gX3NlcnZlcnMgPSBuZXcgTWFwPGludCwgX0h0dHBTZXJ2ZXI+KCk7CgogIFN0cmluZyBzZXJ2ZXJIZWFkZXI7CiAgZmluYWwgSHR0cEhlYWRlcnMgZGVmYXVsdFJlc3BvbnNlSGVhZGVycyA9IF9pbml0RGVmYXVsdFJlc3BvbnNlSGVhZGVycygpOwogIGJvb2wgYXV0b0NvbXByZXNzID0gZmFsc2U7CgogIER1cmF0aW9uIF9pZGxlVGltZW91dDsKICBUaW1lciBfaWRsZVRpbWVyOwoKICBzdGF0aWMgRnV0dXJlPEh0dHBTZXJ2ZXI+IGJpbmQoCiAgICAgIGFkZHJlc3MsIGludCBwb3J0LCBpbnQgYmFja2xvZywgYm9vbCB2Nk9ubHksIGJvb2wgc2hhcmVkKSB7CiAgICByZXR1cm4gU2VydmVyU29ja2V0LmJpbmQoYWRkcmVzcywgcG9ydCwKICAgICAgICAgICAgYmFja2xvZzogYmFja2xvZywgdjZPbmx5OiB2Nk9ubHksIHNoYXJlZDogc2hhcmVkKQogICAgICAgIC50aGVuPEh0dHBTZXJ2ZXI+KChzb2NrZXQpIHsKICAgICAgcmV0dXJuIG5ldyBfSHR0cFNlcnZlci5fKHNvY2tldCwgdHJ1ZSk7CiAgICB9KTsKICB9CgogIHN0YXRpYyBGdXR1cmU8SHR0cFNlcnZlcj4gYmluZFNlY3VyZSgKICAgICAgYWRkcmVzcywKICAgICAgaW50IHBvcnQsCiAgICAgIFNlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICBpbnQgYmFja2xvZywKICAgICAgYm9vbCB2Nk9ubHksCiAgICAgIGJvb2wgcmVxdWVzdENsaWVudENlcnRpZmljYXRlLAogICAgICBib29sIHNoYXJlZCkgewogICAgcmV0dXJuIFNlY3VyZVNlcnZlclNvY2tldC5iaW5kKGFkZHJlc3MsIHBvcnQsIGNvbnRleHQsCiAgICAgICAgICAgIGJhY2tsb2c6IGJhY2tsb2csCiAgICAgICAgICAgIHY2T25seTogdjZPbmx5LAogICAgICAgICAgICByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU6IHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgc2hhcmVkOiBzaGFyZWQpCiAgICAgICAgLnRoZW48SHR0cFNlcnZlcj4oKHNvY2tldCkgewogICAgICByZXR1cm4gbmV3IF9IdHRwU2VydmVyLl8oc29ja2V0LCB0cnVlKTsKICAgIH0pOwogIH0KCiAgX0h0dHBTZXJ2ZXIuXyh0aGlzLl9zZXJ2ZXJTb2NrZXQsIHRoaXMuX2Nsb3NlU2VydmVyKSB7CiAgICBfY29udHJvbGxlciA9CiAgICAgICAgbmV3IFN0cmVhbUNvbnRyb2xsZXI8SHR0cFJlcXVlc3Q+KHN5bmM6IHRydWUsIG9uQ2FuY2VsOiBjbG9zZSk7CiAgICBpZGxlVGltZW91dCA9IGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDEyMCk7CiAgICBfc2VydmVyc1tfc2VydmljZUlkXSA9IHRoaXM7CiAgfQoKICBfSHR0cFNlcnZlci5saXN0ZW5Pbih0aGlzLl9zZXJ2ZXJTb2NrZXQpIDogX2Nsb3NlU2VydmVyID0gZmFsc2UgewogICAgX2NvbnRyb2xsZXIgPQogICAgICAgIG5ldyBTdHJlYW1Db250cm9sbGVyPEh0dHBSZXF1ZXN0PihzeW5jOiB0cnVlLCBvbkNhbmNlbDogY2xvc2UpOwogICAgaWRsZVRpbWVvdXQgPSBjb25zdCBEdXJhdGlvbihzZWNvbmRzOiAxMjApOwogICAgX3NlcnZlcnNbX3NlcnZpY2VJZF0gPSB0aGlzOwogIH0KCiAgc3RhdGljIEh0dHBIZWFkZXJzIF9pbml0RGVmYXVsdFJlc3BvbnNlSGVhZGVycygpIHsKICAgIHZhciBkZWZhdWx0UmVzcG9uc2VIZWFkZXJzID0gbmV3IF9IdHRwSGVhZGVycygnMS4xJyk7CiAgICBkZWZhdWx0UmVzcG9uc2VIZWFkZXJzLmNvbnRlbnRUeXBlID0gQ29udGVudFR5cGUudGV4dDsKICAgIGRlZmF1bHRSZXNwb25zZUhlYWRlcnMuc2V0KCdYLUZyYW1lLU9wdGlvbnMnLCAnU0FNRU9SSUdJTicpOwogICAgZGVmYXVsdFJlc3BvbnNlSGVhZGVycy5zZXQoJ1gtQ29udGVudC1UeXBlLU9wdGlvbnMnLCAnbm9zbmlmZicpOwogICAgZGVmYXVsdFJlc3BvbnNlSGVhZGVycy5zZXQoJ1gtWFNTLVByb3RlY3Rpb24nLCAnMTsgbW9kZT1ibG9jaycpOwogICAgcmV0dXJuIGRlZmF1bHRSZXNwb25zZUhlYWRlcnM7CiAgfQoKICBEdXJhdGlvbiBnZXQgaWRsZVRpbWVvdXQgPT4gX2lkbGVUaW1lb3V0OwoKICB2b2lkIHNldCBpZGxlVGltZW91dChEdXJhdGlvbiBkdXJhdGlvbikgewogICAgaWYgKF9pZGxlVGltZXIgIT0gbnVsbCkgewogICAgICBfaWRsZVRpbWVyLmNhbmNlbCgpOwogICAgICBfaWRsZVRpbWVyID0gbnVsbDsKICAgIH0KICAgIF9pZGxlVGltZW91dCA9IGR1cmF0aW9uOwogICAgaWYgKF9pZGxlVGltZW91dCAhPSBudWxsKSB7CiAgICAgIF9pZGxlVGltZXIgPSBuZXcgVGltZXIucGVyaW9kaWMoX2lkbGVUaW1lb3V0LCAoXykgewogICAgICAgIGZvciAodmFyIGlkbGUgaW4gX2lkbGVDb25uZWN0aW9ucy50b0xpc3QoKSkgewogICAgICAgICAgaWYgKGlkbGUuaXNNYXJrZWRJZGxlKSB7CiAgICAgICAgICAgIGlkbGUuZGVzdHJveSgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWRsZS5tYXJrSWRsZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb248SHR0cFJlcXVlc3Q+IGxpc3Rlbih2b2lkIG9uRGF0YShIdHRwUmVxdWVzdCBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICBfc2VydmVyU29ja2V0Lmxpc3RlbigoU29ja2V0IHNvY2tldCkgewogICAgICBzb2NrZXQuc2V0T3B0aW9uKFNvY2tldE9wdGlvbi50Y3BOb0RlbGF5LCB0cnVlKTsKICAgICAgLy8gQWNjZXB0IHRoZSBjbGllbnQgY29ubmVjdGlvbi4KICAgICAgX0h0dHBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBuZXcgX0h0dHBDb25uZWN0aW9uKHNvY2tldCwgdGhpcyk7CiAgICAgIF9pZGxlQ29ubmVjdGlvbnMuYWRkKGNvbm5lY3Rpb24pOwogICAgfSwgb25FcnJvcjogKGVycm9yLCBzdGFja1RyYWNlKSB7CiAgICAgIC8vIElnbm9yZSBIYW5kc2hha2VFeGNlcHRpb25zIGFzIHRoZXkgYXJlIGJvdW5kIHRvIGEgc2luZ2xlIHJlcXVlc3QsCiAgICAgIC8vIGFuZCBhcmUgbm90IGZhdGFsIGZvciB0aGUgc2VydmVyLgogICAgICBpZiAoZXJyb3IgaXMhIEhhbmRzaGFrZUV4Y2VwdGlvbikgewogICAgICAgIF9jb250cm9sbGVyLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgfQogICAgfSwgb25Eb25lOiBfY29udHJvbGxlci5jbG9zZSk7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuc3RyZWFtLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgRnV0dXJlIGNsb3NlKHtib29sIGZvcmNlOiBmYWxzZX0pIHsKICAgIGNsb3NlZCA9IHRydWU7CiAgICBGdXR1cmUgcmVzdWx0OwogICAgaWYgKF9zZXJ2ZXJTb2NrZXQgIT0gbnVsbCAmJiBfY2xvc2VTZXJ2ZXIpIHsKICAgICAgcmVzdWx0ID0gX3NlcnZlclNvY2tldC5jbG9zZSgpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gbmV3IEZ1dHVyZS52YWx1ZSgpOwogICAgfQogICAgaWRsZVRpbWVvdXQgPSBudWxsOwogICAgaWYgKGZvcmNlKSB7CiAgICAgIGZvciAodmFyIGMgaW4gX2FjdGl2ZUNvbm5lY3Rpb25zLnRvTGlzdCgpKSB7CiAgICAgICAgYy5kZXN0cm95KCk7CiAgICAgIH0KICAgICAgYXNzZXJ0KF9hY3RpdmVDb25uZWN0aW9ucy5pc0VtcHR5KTsKICAgIH0KICAgIGZvciAodmFyIGMgaW4gX2lkbGVDb25uZWN0aW9ucy50b0xpc3QoKSkgewogICAgICBjLmRlc3Ryb3koKTsKICAgIH0KICAgIF9tYXliZVBlcmZvcm1DbGVhbnVwKCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBfbWF5YmVQZXJmb3JtQ2xlYW51cCgpIHsKICAgIGlmIChjbG9zZWQgJiYKICAgICAgICBfaWRsZUNvbm5lY3Rpb25zLmlzRW1wdHkgJiYKICAgICAgICBfYWN0aXZlQ29ubmVjdGlvbnMuaXNFbXB0eSAmJgogICAgICAgIF9zZXNzaW9uTWFuYWdlckluc3RhbmNlICE9IG51bGwpIHsKICAgICAgX3Nlc3Npb25NYW5hZ2VySW5zdGFuY2UuY2xvc2UoKTsKICAgICAgX3Nlc3Npb25NYW5hZ2VySW5zdGFuY2UgPSBudWxsOwogICAgICBfc2VydmVycy5yZW1vdmUoX3NlcnZpY2VJZCk7CiAgICB9CiAgfQoKICBpbnQgZ2V0IHBvcnQgewogICAgaWYgKGNsb3NlZCkgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkh0dHBTZXJ2ZXIgaXMgbm90IGJvdW5kIHRvIGEgc29ja2V0Iik7CiAgICByZXR1cm4gX3NlcnZlclNvY2tldC5wb3J0OwogIH0KCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzIHsKICAgIGlmIChjbG9zZWQpIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJIdHRwU2VydmVyIGlzIG5vdCBib3VuZCB0byBhIHNvY2tldCIpOwogICAgcmV0dXJuIF9zZXJ2ZXJTb2NrZXQuYWRkcmVzczsKICB9CgogIHNldCBzZXNzaW9uVGltZW91dChpbnQgdGltZW91dCkgewogICAgX3Nlc3Npb25NYW5hZ2VyLnNlc3Npb25UaW1lb3V0ID0gdGltZW91dDsKICB9CgogIHZvaWQgX2hhbmRsZVJlcXVlc3QoX0h0dHBSZXF1ZXN0IHJlcXVlc3QpIHsKICAgIGlmICghY2xvc2VkKSB7CiAgICAgIF9jb250cm9sbGVyLmFkZChyZXF1ZXN0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlcXVlc3QuX2h0dHBDb25uZWN0aW9uLmRlc3Ryb3koKTsKICAgIH0KICB9CgogIHZvaWQgX2Nvbm5lY3Rpb25DbG9zZWQoX0h0dHBDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKICAgIC8vIFJlbW92ZSBpdHNlbGYgZnJvbSBlaXRoZXIgaWRsZSBvciBhY3RpdmUgY29ubmVjdGlvbnMuCiAgICBjb25uZWN0aW9uLnVubGluaygpOwogICAgX21heWJlUGVyZm9ybUNsZWFudXAoKTsKICB9CgogIHZvaWQgX21hcmtJZGxlKF9IdHRwQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CiAgICBfYWN0aXZlQ29ubmVjdGlvbnMucmVtb3ZlKGNvbm5lY3Rpb24pOwogICAgX2lkbGVDb25uZWN0aW9ucy5hZGQoY29ubmVjdGlvbik7CiAgfQoKICB2b2lkIF9tYXJrQWN0aXZlKF9IdHRwQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CiAgICBfaWRsZUNvbm5lY3Rpb25zLnJlbW92ZShjb25uZWN0aW9uKTsKICAgIF9hY3RpdmVDb25uZWN0aW9ucy5hZGQoY29ubmVjdGlvbik7CiAgfQoKICBfSHR0cFNlc3Npb25NYW5hZ2VyIGdldCBfc2Vzc2lvbk1hbmFnZXIgewogICAgLy8gTGF6eSBpbml0LgogICAgaWYgKF9zZXNzaW9uTWFuYWdlckluc3RhbmNlID09IG51bGwpIHsKICAgICAgX3Nlc3Npb25NYW5hZ2VySW5zdGFuY2UgPSBuZXcgX0h0dHBTZXNzaW9uTWFuYWdlcigpOwogICAgfQogICAgcmV0dXJuIF9zZXNzaW9uTWFuYWdlckluc3RhbmNlOwogIH0KCiAgSHR0cENvbm5lY3Rpb25zSW5mbyBjb25uZWN0aW9uc0luZm8oKSB7CiAgICBIdHRwQ29ubmVjdGlvbnNJbmZvIHJlc3VsdCA9IG5ldyBIdHRwQ29ubmVjdGlvbnNJbmZvKCk7CiAgICByZXN1bHQudG90YWwgPSBfYWN0aXZlQ29ubmVjdGlvbnMubGVuZ3RoICsgX2lkbGVDb25uZWN0aW9ucy5sZW5ndGg7CiAgICBfYWN0aXZlQ29ubmVjdGlvbnMuZm9yRWFjaCgoX0h0dHBDb25uZWN0aW9uIGNvbm4pIHsKICAgICAgaWYgKGNvbm4uX2lzQWN0aXZlKSB7CiAgICAgICAgcmVzdWx0LmFjdGl2ZSsrOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChjb25uLl9pc0Nsb3NpbmcpOwogICAgICAgIHJlc3VsdC5jbG9zaW5nKys7CiAgICAgIH0KICAgIH0pOwogICAgX2lkbGVDb25uZWN0aW9ucy5mb3JFYWNoKChfSHR0cENvbm5lY3Rpb24gY29ubikgewogICAgICByZXN1bHQuaWRsZSsrOwogICAgICBhc3NlcnQoY29ubi5faXNJZGxlKTsKICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmluZyBnZXQgX3NlcnZpY2VUeXBlUGF0aCA9PiAnaW8vaHR0cC9zZXJ2ZXJzJzsKICBTdHJpbmcgZ2V0IF9zZXJ2aWNlVHlwZU5hbWUgPT4gJ0h0dHBTZXJ2ZXInOwoKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBfdG9KU09OKGJvb2wgcmVmKSB7CiAgICB2YXIgciA9IDxTdHJpbmcsIGR5bmFtaWM+ewogICAgICAnaWQnOiBfc2VydmljZVBhdGgsCiAgICAgICd0eXBlJzogX3NlcnZpY2VUeXBlKHJlZiksCiAgICAgICduYW1lJzogJyR7YWRkcmVzcy5ob3N0fTokcG9ydCcsCiAgICAgICd1c2VyX25hbWUnOiAnJHthZGRyZXNzLmhvc3R9OiRwb3J0JywKICAgIH07CiAgICBpZiAocmVmKSB7CiAgICAgIHJldHVybiByOwogICAgfQogICAgdHJ5IHsKICAgICAgclsnc29ja2V0J10gPSBfc2VydmVyU29ja2V0Ll90b0pTT04odHJ1ZSk7CiAgICB9IGNhdGNoIChfKSB7CiAgICAgIHJbJ3NvY2tldCddID0gewogICAgICAgICdpZCc6IF9zZXJ2aWNlUGF0aCwKICAgICAgICAndHlwZSc6ICdAU29ja2V0JywKICAgICAgICAnbmFtZSc6ICdVc2VyU29ja2V0JywKICAgICAgICAndXNlcl9uYW1lJzogJ1VzZXJTb2NrZXQnLAogICAgICB9OwogICAgfQogICAgclsncG9ydCddID0gcG9ydDsKICAgIHJbJ2FkZHJlc3MnXSA9IGFkZHJlc3MuaG9zdDsKICAgIHJbJ2FjdGl2ZSddID0gX2FjdGl2ZUNvbm5lY3Rpb25zLm1hcCgoYykgPT4gYy5fdG9KU09OKHRydWUpKS50b0xpc3QoKTsKICAgIHJbJ2lkbGUnXSA9IF9pZGxlQ29ubmVjdGlvbnMubWFwKChjKSA9PiBjLl90b0pTT04odHJ1ZSkpLnRvTGlzdCgpOwogICAgclsnY2xvc2VkJ10gPSBjbG9zZWQ7CiAgICByZXR1cm4gcjsKICB9CgogIF9IdHRwU2Vzc2lvbk1hbmFnZXIgX3Nlc3Npb25NYW5hZ2VySW5zdGFuY2U7CgogIC8vIEluZGljYXRlZCBpZiB0aGUgaHR0cCBzZXJ2ZXIgaGFzIGJlZW4gY2xvc2VkLgogIGJvb2wgY2xvc2VkID0gZmFsc2U7CgogIC8vIFRoZSBzZXJ2ZXIgbGlzdGVuIHNvY2tldC4gVW50eXBlZCBhcyBpdCBjYW4gYmUgYm90aCBTZXJ2ZXJTb2NrZXQgYW5kCiAgLy8gU2VjdXJlU2VydmVyU29ja2V0LgogIGZpbmFsIGR5bmFtaWMgLypTZXJ2ZXJTb2NrZXR8U2VjdXJlU2VydmVyU29ja2V0Ki8gX3NlcnZlclNvY2tldDsKICBmaW5hbCBib29sIF9jbG9zZVNlcnZlcjsKCiAgLy8gU2V0IG9mIGN1cnJlbnRseSBjb25uZWN0ZWQgY2xpZW50cy4KICBmaW5hbCBMaW5rZWRMaXN0PF9IdHRwQ29ubmVjdGlvbj4gX2FjdGl2ZUNvbm5lY3Rpb25zID0KICAgICAgbmV3IExpbmtlZExpc3Q8X0h0dHBDb25uZWN0aW9uPigpOwogIGZpbmFsIExpbmtlZExpc3Q8X0h0dHBDb25uZWN0aW9uPiBfaWRsZUNvbm5lY3Rpb25zID0KICAgICAgbmV3IExpbmtlZExpc3Q8X0h0dHBDb25uZWN0aW9uPigpOwogIFN0cmVhbUNvbnRyb2xsZXI8SHR0cFJlcXVlc3Q+IF9jb250cm9sbGVyOwp9CgpjbGFzcyBfUHJveHlDb25maWd1cmF0aW9uIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIFBST1hZX1BSRUZJWCA9ICJQUk9YWSAiOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgRElSRUNUX1BSRUZJWCA9ICJESVJFQ1QiOwoKICBfUHJveHlDb25maWd1cmF0aW9uKFN0cmluZyBjb25maWd1cmF0aW9uKSA6IHByb3hpZXMgPSBuZXcgTGlzdDxfUHJveHk+KCkgewogICAgaWYgKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCBwcm94eSBjb25maWd1cmF0aW9uICRjb25maWd1cmF0aW9uIik7CiAgICB9CiAgICBMaXN0PFN0cmluZz4gbGlzdCA9IGNvbmZpZ3VyYXRpb24uc3BsaXQoIjsiKTsKICAgIGxpc3QuZm9yRWFjaCgoU3RyaW5nIHByb3h5KSB7CiAgICAgIHByb3h5ID0gcHJveHkudHJpbSgpOwogICAgICBpZiAoIXByb3h5LmlzRW1wdHkpIHsKICAgICAgICBpZiAocHJveHkuc3RhcnRzV2l0aChQUk9YWV9QUkVGSVgpKSB7CiAgICAgICAgICBTdHJpbmcgdXNlcm5hbWU7CiAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQ7CiAgICAgICAgICAvLyBTa2lwIHRoZSAiUFJPWFkgIiBwcmVmaXguCiAgICAgICAgICBwcm94eSA9IHByb3h5LnN1YnN0cmluZyhQUk9YWV9QUkVGSVgubGVuZ3RoKS50cmltKCk7CiAgICAgICAgICAvLyBMb29rIGZvciBwcm94eSBhdXRoZW50aWNhdGlvbi4KICAgICAgICAgIGludCBhdCA9IHByb3h5LmluZGV4T2YoIkAiKTsKICAgICAgICAgIGlmIChhdCAhPSAtMSkgewogICAgICAgICAgICBTdHJpbmcgdXNlcmluZm8gPSBwcm94eS5zdWJzdHJpbmcoMCwgYXQpLnRyaW0oKTsKICAgICAgICAgICAgcHJveHkgPSBwcm94eS5zdWJzdHJpbmcoYXQgKyAxKS50cmltKCk7CiAgICAgICAgICAgIGludCBjb2xvbiA9IHVzZXJpbmZvLmluZGV4T2YoIjoiKTsKICAgICAgICAgICAgaWYgKGNvbG9uID09IC0xIHx8IGNvbG9uID09IDAgfHwgY29sb24gPT0gcHJveHkubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAiSW52YWxpZCBwcm94eSBjb25maWd1cmF0aW9uICRjb25maWd1cmF0aW9uIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdXNlcm5hbWUgPSB1c2VyaW5mby5zdWJzdHJpbmcoMCwgY29sb24pLnRyaW0oKTsKICAgICAgICAgICAgcGFzc3dvcmQgPSB1c2VyaW5mby5zdWJzdHJpbmcoY29sb24gKyAxKS50cmltKCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBMb29rIGZvciBwcm94eSBob3N0IGFuZCBwb3J0LgogICAgICAgICAgaW50IGNvbG9uID0gcHJveHkubGFzdEluZGV4T2YoIjoiKTsKICAgICAgICAgIGlmIChjb2xvbiA9PSAtMSB8fCBjb2xvbiA9PSAwIHx8IGNvbG9uID09IHByb3h5Lmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAiSW52YWxpZCBwcm94eSBjb25maWd1cmF0aW9uICRjb25maWd1cmF0aW9uIik7CiAgICAgICAgICB9CiAgICAgICAgICBTdHJpbmcgaG9zdCA9IHByb3h5LnN1YnN0cmluZygwLCBjb2xvbikudHJpbSgpOwogICAgICAgICAgaWYgKGhvc3Quc3RhcnRzV2l0aCgiWyIpICYmIGhvc3QuZW5kc1dpdGgoIl0iKSkgewogICAgICAgICAgICBob3N0ID0gaG9zdC5zdWJzdHJpbmcoMSwgaG9zdC5sZW5ndGggLSAxKTsKICAgICAgICAgIH0KICAgICAgICAgIFN0cmluZyBwb3J0U3RyaW5nID0gcHJveHkuc3Vic3RyaW5nKGNvbG9uICsgMSkudHJpbSgpOwogICAgICAgICAgaW50IHBvcnQ7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBwb3J0ID0gaW50LnBhcnNlKHBvcnRTdHJpbmcpOwogICAgICAgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAiSW52YWxpZCBwcm94eSBjb25maWd1cmF0aW9uICRjb25maWd1cmF0aW9uLCAiCiAgICAgICAgICAgICAgICAiaW52YWxpZCBwb3J0ICckcG9ydFN0cmluZyciKTsKICAgICAgICAgIH0KICAgICAgICAgIHByb3hpZXMuYWRkKG5ldyBfUHJveHkoaG9zdCwgcG9ydCwgdXNlcm5hbWUsIHBhc3N3b3JkKSk7CiAgICAgICAgfSBlbHNlIGlmIChwcm94eS50cmltKCkgPT0gRElSRUNUX1BSRUZJWCkgewogICAgICAgICAgcHJveGllcy5hZGQobmV3IF9Qcm94eS5kaXJlY3QoKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIHByb3h5IGNvbmZpZ3VyYXRpb24gJGNvbmZpZ3VyYXRpb24iKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgY29uc3QgX1Byb3h5Q29uZmlndXJhdGlvbi5kaXJlY3QoKSA6IHByb3hpZXMgPSBjb25zdCBbY29uc3QgX1Byb3h5LmRpcmVjdCgpXTsKCiAgZmluYWwgTGlzdDxfUHJveHk+IHByb3hpZXM7Cn0KCmNsYXNzIF9Qcm94eSB7CiAgZmluYWwgU3RyaW5nIGhvc3Q7CiAgZmluYWwgaW50IHBvcnQ7CiAgZmluYWwgU3RyaW5nIHVzZXJuYW1lOwogIGZpbmFsIFN0cmluZyBwYXNzd29yZDsKICBmaW5hbCBib29sIGlzRGlyZWN0OwoKICBjb25zdCBfUHJveHkodGhpcy5ob3N0LCB0aGlzLnBvcnQsIHRoaXMudXNlcm5hbWUsIHRoaXMucGFzc3dvcmQpCiAgICAgIDogaXNEaXJlY3QgPSBmYWxzZTsKICBjb25zdCBfUHJveHkuZGlyZWN0KCkKICAgICAgOiBob3N0ID0gbnVsbCwKICAgICAgICBwb3J0ID0gbnVsbCwKICAgICAgICB1c2VybmFtZSA9IG51bGwsCiAgICAgICAgcGFzc3dvcmQgPSBudWxsLAogICAgICAgIGlzRGlyZWN0ID0gdHJ1ZTsKCiAgYm9vbCBnZXQgaXNBdXRoZW50aWNhdGVkID0+IHVzZXJuYW1lICE9IG51bGw7Cn0KCmNsYXNzIF9IdHRwQ29ubmVjdGlvbkluZm8gaW1wbGVtZW50cyBIdHRwQ29ubmVjdGlvbkluZm8gewogIEludGVybmV0QWRkcmVzcyByZW1vdGVBZGRyZXNzOwogIGludCByZW1vdGVQb3J0OwogIGludCBsb2NhbFBvcnQ7CgogIHN0YXRpYyBfSHR0cENvbm5lY3Rpb25JbmZvIGNyZWF0ZShTb2NrZXQgc29ja2V0KSB7CiAgICBpZiAoc29ja2V0ID09IG51bGwpIHJldHVybiBudWxsOwogICAgdHJ5IHsKICAgICAgX0h0dHBDb25uZWN0aW9uSW5mbyBpbmZvID0gbmV3IF9IdHRwQ29ubmVjdGlvbkluZm8oKTsKICAgICAgcmV0dXJuIGluZm8KICAgICAgICAuLnJlbW90ZUFkZHJlc3MgPSBzb2NrZXQucmVtb3RlQWRkcmVzcwogICAgICAgIC4ucmVtb3RlUG9ydCA9IHNvY2tldC5yZW1vdGVQb3J0CiAgICAgICAgLi5sb2NhbFBvcnQgPSBzb2NrZXQucG9ydDsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmNsYXNzIF9EZXRhY2hlZFNvY2tldCBleHRlbmRzIFN0cmVhbTxVaW50OExpc3Q+IGltcGxlbWVudHMgU29ja2V0IHsKICBmaW5hbCBTdHJlYW08VWludDhMaXN0PiBfaW5jb21pbmc7CiAgZmluYWwgU29ja2V0IF9zb2NrZXQ7CgogIF9EZXRhY2hlZFNvY2tldCh0aGlzLl9zb2NrZXQsIHRoaXMuX2luY29taW5nKTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFVpbnQ4TGlzdD4gbGlzdGVuKHZvaWQgb25EYXRhKFVpbnQ4TGlzdCBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX2luY29taW5nLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgRW5jb2RpbmcgZ2V0IGVuY29kaW5nID0+IF9zb2NrZXQuZW5jb2Rpbmc7CgogIHZvaWQgc2V0IGVuY29kaW5nKEVuY29kaW5nIHZhbHVlKSB7CiAgICBfc29ja2V0LmVuY29kaW5nID0gdmFsdWU7CiAgfQoKICB2b2lkIHdyaXRlKE9iamVjdCBvYmopIHsKICAgIF9zb2NrZXQud3JpdGUob2JqKTsKICB9CgogIHZvaWQgd3JpdGVsbihbT2JqZWN0IG9iaiA9ICIiXSkgewogICAgX3NvY2tldC53cml0ZWxuKG9iaik7CiAgfQoKICB2b2lkIHdyaXRlQ2hhckNvZGUoaW50IGNoYXJDb2RlKSB7CiAgICBfc29ja2V0LndyaXRlQ2hhckNvZGUoY2hhckNvZGUpOwogIH0KCiAgdm9pZCB3cml0ZUFsbChJdGVyYWJsZSBvYmplY3RzLCBbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgewogICAgX3NvY2tldC53cml0ZUFsbChvYmplY3RzLCBzZXBhcmF0b3IpOwogIH0KCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGJ5dGVzKSB7CiAgICBfc29ja2V0LmFkZChieXRlcyk7CiAgfQoKICB2b2lkIGFkZEVycm9yKGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgPT4KICAgICAgX3NvY2tldC5hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CgogIEZ1dHVyZSBhZGRTdHJlYW0oU3RyZWFtPExpc3Q8aW50Pj4gc3RyZWFtKSB7CiAgICByZXR1cm4gX3NvY2tldC5hZGRTdHJlYW0oc3RyZWFtKTsKICB9CgogIHZvaWQgZGVzdHJveSgpIHsKICAgIF9zb2NrZXQuZGVzdHJveSgpOwogIH0KCiAgRnV0dXJlIGZsdXNoKCkgPT4gX3NvY2tldC5mbHVzaCgpOwoKICBGdXR1cmUgY2xvc2UoKSA9PiBfc29ja2V0LmNsb3NlKCk7CgogIEZ1dHVyZSBnZXQgZG9uZSA9PiBfc29ja2V0LmRvbmU7CgogIGludCBnZXQgcG9ydCA9PiBfc29ja2V0LnBvcnQ7CgogIEludGVybmV0QWRkcmVzcyBnZXQgYWRkcmVzcyA9PiBfc29ja2V0LmFkZHJlc3M7CgogIEludGVybmV0QWRkcmVzcyBnZXQgcmVtb3RlQWRkcmVzcyA9PiBfc29ja2V0LnJlbW90ZUFkZHJlc3M7CgogIGludCBnZXQgcmVtb3RlUG9ydCA9PiBfc29ja2V0LnJlbW90ZVBvcnQ7CgogIGJvb2wgc2V0T3B0aW9uKFNvY2tldE9wdGlvbiBvcHRpb24sIGJvb2wgZW5hYmxlZCkgewogICAgcmV0dXJuIF9zb2NrZXQuc2V0T3B0aW9uKG9wdGlvbiwgZW5hYmxlZCk7CiAgfQoKICBVaW50OExpc3QgZ2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pIHsKICAgIHJldHVybiBfc29ja2V0LmdldFJhd09wdGlvbihvcHRpb24pOwogIH0KCiAgdm9pZCBzZXRSYXdPcHRpb24oUmF3U29ja2V0T3B0aW9uIG9wdGlvbikgewogICAgX3NvY2tldC5zZXRSYXdPcHRpb24ob3B0aW9uKTsKICB9CgogIE1hcCBfdG9KU09OKGJvb2wgcmVmKSB7CiAgICByZXR1cm4gKF9zb2NrZXQgYXMgZHluYW1pYykuX3RvSlNPTihyZWYpOwogIH0KfQoKY2xhc3MgX0F1dGhlbnRpY2F0aW9uU2NoZW1lIHsKICBmaW5hbCBpbnQgX3NjaGVtZTsKCiAgc3RhdGljIGNvbnN0IFVOS05PV04gPSBjb25zdCBfQXV0aGVudGljYXRpb25TY2hlbWUoLTEpOwogIHN0YXRpYyBjb25zdCBCQVNJQyA9IGNvbnN0IF9BdXRoZW50aWNhdGlvblNjaGVtZSgwKTsKICBzdGF0aWMgY29uc3QgRElHRVNUID0gY29uc3QgX0F1dGhlbnRpY2F0aW9uU2NoZW1lKDEpOwoKICBjb25zdCBfQXV0aGVudGljYXRpb25TY2hlbWUodGhpcy5fc2NoZW1lKTsKCiAgZmFjdG9yeSBfQXV0aGVudGljYXRpb25TY2hlbWUuZnJvbVN0cmluZyhTdHJpbmcgc2NoZW1lKSB7CiAgICBpZiAoc2NoZW1lLnRvTG93ZXJDYXNlKCkgPT0gImJhc2ljIikgcmV0dXJuIEJBU0lDOwogICAgaWYgKHNjaGVtZS50b0xvd2VyQ2FzZSgpID09ICJkaWdlc3QiKSByZXR1cm4gRElHRVNUOwogICAgcmV0dXJuIFVOS05PV047CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBpZiAodGhpcyA9PSBCQVNJQykgcmV0dXJuICJCYXNpYyI7CiAgICBpZiAodGhpcyA9PSBESUdFU1QpIHJldHVybiAiRGlnZXN0IjsKICAgIHJldHVybiAiVW5rbm93biI7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfQ3JlZGVudGlhbHMgewogIF9IdHRwQ2xpZW50Q3JlZGVudGlhbHMgY3JlZGVudGlhbHM7CiAgU3RyaW5nIHJlYWxtOwogIGJvb2wgdXNlZCA9IGZhbHNlOwoKICAvLyBEaWdlc3Qgc3BlY2lmaWMgZmllbGRzLgogIFN0cmluZyBoYTE7CiAgU3RyaW5nIG5vbmNlOwogIFN0cmluZyBhbGdvcml0aG07CiAgU3RyaW5nIHFvcDsKICBpbnQgbm9uY2VDb3VudDsKCiAgX0NyZWRlbnRpYWxzKHRoaXMuY3JlZGVudGlhbHMsIHRoaXMucmVhbG0pIHsKICAgIGlmIChjcmVkZW50aWFscy5zY2hlbWUgPT0gX0F1dGhlbnRpY2F0aW9uU2NoZW1lLkRJR0VTVCkgewogICAgICAvLyBDYWxjdWxhdGUgdGhlIEgoQTEpIHZhbHVlIG9uY2UuIFRoZXJlIGlzIG5vIG1lbnRpb25pbmcgb2YKICAgICAgLy8gdXNlcm5hbWUvcGFzc3dvcmQgZW5jb2RpbmcgaW4gUkZDIDI2MTcuIEhvd2V2ZXIgdGhlcmUgaXMgYW4KICAgICAgLy8gb3BlbiBkcmFmdCBmb3IgYWRkaW5nIGFuIGFkZGl0aW9uYWwgYWNjZXB0LWNoYXJzZXQgcGFyYW1ldGVyIHRvCiAgICAgIC8vIHRoZSBXV1ctQXV0aGVudGljYXRlIGFuZCBQcm94eS1BdXRoZW50aWNhdGUgaGVhZGVycywgc2VlCiAgICAgIC8vIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LXJlc2Noa2UtYmFzaWNhdXRoLWVuYy0wNi4gRm9yCiAgICAgIC8vIG5vdyBhbHdheXMgdXNlIFVURi04IGVuY29kaW5nLgogICAgICBfSHR0cENsaWVudERpZ2VzdENyZWRlbnRpYWxzIGNyZWRzID0gY3JlZGVudGlhbHM7CiAgICAgIHZhciBoYXNoZXIgPSBuZXcgX01ENSgpCiAgICAgICAgLi5hZGQodXRmOC5lbmNvZGUoY3JlZHMudXNlcm5hbWUpKQogICAgICAgIC4uYWRkKFtfQ2hhckNvZGUuQ09MT05dKQogICAgICAgIC4uYWRkKHJlYWxtLmNvZGVVbml0cykKICAgICAgICAuLmFkZChbX0NoYXJDb2RlLkNPTE9OXSkKICAgICAgICAuLmFkZCh1dGY4LmVuY29kZShjcmVkcy5wYXNzd29yZCkpOwogICAgICBoYTEgPSBfQ3J5cHRvVXRpbHMuYnl0ZXNUb0hleChoYXNoZXIuY2xvc2UoKSk7CiAgICB9CiAgfQoKICBfQXV0aGVudGljYXRpb25TY2hlbWUgZ2V0IHNjaGVtZSA9PiBjcmVkZW50aWFscy5zY2hlbWU7CgogIHZvaWQgYXV0aG9yaXplKEh0dHBDbGllbnRSZXF1ZXN0IHJlcXVlc3QpOwp9CgpjbGFzcyBfU2l0ZUNyZWRlbnRpYWxzIGV4dGVuZHMgX0NyZWRlbnRpYWxzIHsKICBVcmkgdXJpOwoKICBfU2l0ZUNyZWRlbnRpYWxzKHRoaXMudXJpLCByZWFsbSwgX0h0dHBDbGllbnRDcmVkZW50aWFscyBjcmVkcykKICAgICAgOiBzdXBlcihjcmVkcywgcmVhbG0pOwoKICBib29sIGFwcGxpZXMoVXJpIHVyaSwgX0F1dGhlbnRpY2F0aW9uU2NoZW1lIHNjaGVtZSkgewogICAgaWYgKHNjaGVtZSAhPSBudWxsICYmIGNyZWRlbnRpYWxzLnNjaGVtZSAhPSBzY2hlbWUpIHJldHVybiBmYWxzZTsKICAgIGlmICh1cmkuaG9zdCAhPSB0aGlzLnVyaS5ob3N0KSByZXR1cm4gZmFsc2U7CiAgICBpbnQgdGhpc1BvcnQgPQogICAgICAgIHRoaXMudXJpLnBvcnQgPT0gMCA/IEh0dHBDbGllbnQuZGVmYXVsdEh0dHBQb3J0IDogdGhpcy51cmkucG9ydDsKICAgIGludCBvdGhlclBvcnQgPSB1cmkucG9ydCA9PSAwID8gSHR0cENsaWVudC5kZWZhdWx0SHR0cFBvcnQgOiB1cmkucG9ydDsKICAgIGlmIChvdGhlclBvcnQgIT0gdGhpc1BvcnQpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB1cmkucGF0aC5zdGFydHNXaXRoKHRoaXMudXJpLnBhdGgpOwogIH0KCiAgdm9pZCBhdXRob3JpemUoSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCkgewogICAgLy8gRGlnZXN0IGNyZWRlbnRpYWxzIGNhbm5vdCBiZSB1c2VkIHdpdGhvdXQgYSBub25jZSBmcm9tIHRoZQogICAgLy8gc2VydmVyLgogICAgaWYgKGNyZWRlbnRpYWxzLnNjaGVtZSA9PSBfQXV0aGVudGljYXRpb25TY2hlbWUuRElHRVNUICYmIG5vbmNlID09IG51bGwpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY3JlZGVudGlhbHMuYXV0aG9yaXplKHRoaXMsIHJlcXVlc3QpOwogICAgdXNlZCA9IHRydWU7CiAgfQp9CgpjbGFzcyBfUHJveHlDcmVkZW50aWFscyBleHRlbmRzIF9DcmVkZW50aWFscyB7CiAgU3RyaW5nIGhvc3Q7CiAgaW50IHBvcnQ7CgogIF9Qcm94eUNyZWRlbnRpYWxzKHRoaXMuaG9zdCwgdGhpcy5wb3J0LCByZWFsbSwgX0h0dHBDbGllbnRDcmVkZW50aWFscyBjcmVkcykKICAgICAgOiBzdXBlcihjcmVkcywgcmVhbG0pOwoKICBib29sIGFwcGxpZXMoX1Byb3h5IHByb3h5LCBfQXV0aGVudGljYXRpb25TY2hlbWUgc2NoZW1lKSB7CiAgICBpZiAoc2NoZW1lICE9IG51bGwgJiYgY3JlZGVudGlhbHMuc2NoZW1lICE9IHNjaGVtZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHByb3h5Lmhvc3QgPT0gaG9zdCAmJiBwcm94eS5wb3J0ID09IHBvcnQ7CiAgfQoKICB2b2lkIGF1dGhvcml6ZShIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSB7CiAgICAvLyBEaWdlc3QgY3JlZGVudGlhbHMgY2Fubm90IGJlIHVzZWQgd2l0aG91dCBhIG5vbmNlIGZyb20gdGhlCiAgICAvLyBzZXJ2ZXIuCiAgICBpZiAoY3JlZGVudGlhbHMuc2NoZW1lID09IF9BdXRoZW50aWNhdGlvblNjaGVtZS5ESUdFU1QgJiYgbm9uY2UgPT0gbnVsbCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjcmVkZW50aWFscy5hdXRob3JpemVQcm94eSh0aGlzLCByZXF1ZXN0KTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9IdHRwQ2xpZW50Q3JlZGVudGlhbHMgaW1wbGVtZW50cyBIdHRwQ2xpZW50Q3JlZGVudGlhbHMgewogIF9BdXRoZW50aWNhdGlvblNjaGVtZSBnZXQgc2NoZW1lOwogIHZvaWQgYXV0aG9yaXplKF9DcmVkZW50aWFscyBjcmVkZW50aWFscywgSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCk7CiAgdm9pZCBhdXRob3JpemVQcm94eShfUHJveHlDcmVkZW50aWFscyBjcmVkZW50aWFscywgSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCk7Cn0KCmNsYXNzIF9IdHRwQ2xpZW50QmFzaWNDcmVkZW50aWFscyBleHRlbmRzIF9IdHRwQ2xpZW50Q3JlZGVudGlhbHMKICAgIGltcGxlbWVudHMgSHR0cENsaWVudEJhc2ljQ3JlZGVudGlhbHMgewogIFN0cmluZyB1c2VybmFtZTsKICBTdHJpbmcgcGFzc3dvcmQ7CgogIF9IdHRwQ2xpZW50QmFzaWNDcmVkZW50aWFscyh0aGlzLnVzZXJuYW1lLCB0aGlzLnBhc3N3b3JkKTsKCiAgX0F1dGhlbnRpY2F0aW9uU2NoZW1lIGdldCBzY2hlbWUgPT4gX0F1dGhlbnRpY2F0aW9uU2NoZW1lLkJBU0lDOwoKICBTdHJpbmcgYXV0aG9yaXphdGlvbigpIHsKICAgIC8vIFRoZXJlIGlzIG5vIG1lbnRpb25pbmcgb2YgdXNlcm5hbWUvcGFzc3dvcmQgZW5jb2RpbmcgaW4gUkZDCiAgICAvLyAyNjE3LiBIb3dldmVyIHRoZXJlIGlzIGFuIG9wZW4gZHJhZnQgZm9yIGFkZGluZyBhbiBhZGRpdGlvbmFsCiAgICAvLyBhY2NlcHQtY2hhcnNldCBwYXJhbWV0ZXIgdG8gdGhlIFdXVy1BdXRoZW50aWNhdGUgYW5kCiAgICAvLyBQcm94eS1BdXRoZW50aWNhdGUgaGVhZGVycywgc2VlCiAgICAvLyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1yZXNjaGtlLWJhc2ljYXV0aC1lbmMtMDYuIEZvcgogICAgLy8gbm93IGFsd2F5cyB1c2UgVVRGLTggZW5jb2RpbmcuCiAgICBTdHJpbmcgYXV0aCA9CiAgICAgICAgX0NyeXB0b1V0aWxzLmJ5dGVzVG9CYXNlNjQodXRmOC5lbmNvZGUoIiR1c2VybmFtZTokcGFzc3dvcmQiKSk7CiAgICByZXR1cm4gIkJhc2ljICRhdXRoIjsKICB9CgogIHZvaWQgYXV0aG9yaXplKF9DcmVkZW50aWFscyBfLCBIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSB7CiAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEh0dHBIZWFkZXJzLmF1dGhvcml6YXRpb25IZWFkZXIsIGF1dGhvcml6YXRpb24oKSk7CiAgfQoKICB2b2lkIGF1dGhvcml6ZVByb3h5KF9Qcm94eUNyZWRlbnRpYWxzIF8sIEh0dHBDbGllbnRSZXF1ZXN0IHJlcXVlc3QpIHsKICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoSHR0cEhlYWRlcnMucHJveHlBdXRob3JpemF0aW9uSGVhZGVyLCBhdXRob3JpemF0aW9uKCkpOwogIH0KfQoKY2xhc3MgX0h0dHBDbGllbnREaWdlc3RDcmVkZW50aWFscyBleHRlbmRzIF9IdHRwQ2xpZW50Q3JlZGVudGlhbHMKICAgIGltcGxlbWVudHMgSHR0cENsaWVudERpZ2VzdENyZWRlbnRpYWxzIHsKICBTdHJpbmcgdXNlcm5hbWU7CiAgU3RyaW5nIHBhc3N3b3JkOwoKICBfSHR0cENsaWVudERpZ2VzdENyZWRlbnRpYWxzKHRoaXMudXNlcm5hbWUsIHRoaXMucGFzc3dvcmQpOwoKICBfQXV0aGVudGljYXRpb25TY2hlbWUgZ2V0IHNjaGVtZSA9PiBfQXV0aGVudGljYXRpb25TY2hlbWUuRElHRVNUOwoKICBTdHJpbmcgYXV0aG9yaXphdGlvbihfQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMsIF9IdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSB7CiAgICBTdHJpbmcgcmVxdWVzdFVyaSA9IHJlcXVlc3QuX3JlcXVlc3RVcmkoKTsKICAgIF9NRDUgaGFzaGVyID0gbmV3IF9NRDUoKQogICAgICAuLmFkZChyZXF1ZXN0Lm1ldGhvZC5jb2RlVW5pdHMpCiAgICAgIC4uYWRkKFtfQ2hhckNvZGUuQ09MT05dKQogICAgICAuLmFkZChyZXF1ZXN0VXJpLmNvZGVVbml0cyk7CiAgICB2YXIgaGEyID0gX0NyeXB0b1V0aWxzLmJ5dGVzVG9IZXgoaGFzaGVyLmNsb3NlKCkpOwoKICAgIFN0cmluZyBxb3A7CiAgICBTdHJpbmcgY25vbmNlOwogICAgU3RyaW5nIG5jOwogICAgdmFyIHg7CiAgICBoYXNoZXIgPSBuZXcgX01ENSgpLi5hZGQoY3JlZGVudGlhbHMuaGExLmNvZGVVbml0cykuLmFkZChbX0NoYXJDb2RlLkNPTE9OXSk7CiAgICBpZiAoY3JlZGVudGlhbHMucW9wID09ICJhdXRoIikgewogICAgICBxb3AgPSBjcmVkZW50aWFscy5xb3A7CiAgICAgIGNub25jZSA9IF9DcnlwdG9VdGlscy5ieXRlc1RvSGV4KF9DcnlwdG9VdGlscy5nZXRSYW5kb21CeXRlcyg0KSk7CiAgICAgICsrY3JlZGVudGlhbHMubm9uY2VDb3VudDsKICAgICAgbmMgPSBjcmVkZW50aWFscy5ub25jZUNvdW50LnRvUmFkaXhTdHJpbmcoMTYpOwogICAgICBuYyA9ICIwMDAwMDAwMCIuc3Vic3RyaW5nKDAsIDggLSBuYy5sZW5ndGggKyAxKSArIG5jOwogICAgICBoYXNoZXIKICAgICAgICAuLmFkZChjcmVkZW50aWFscy5ub25jZS5jb2RlVW5pdHMpCiAgICAgICAgLi5hZGQoW19DaGFyQ29kZS5DT0xPTl0pCiAgICAgICAgLi5hZGQobmMuY29kZVVuaXRzKQogICAgICAgIC4uYWRkKFtfQ2hhckNvZGUuQ09MT05dKQogICAgICAgIC4uYWRkKGNub25jZS5jb2RlVW5pdHMpCiAgICAgICAgLi5hZGQoW19DaGFyQ29kZS5DT0xPTl0pCiAgICAgICAgLi5hZGQoY3JlZGVudGlhbHMucW9wLmNvZGVVbml0cykKICAgICAgICAuLmFkZChbX0NoYXJDb2RlLkNPTE9OXSkKICAgICAgICAuLmFkZChoYTIuY29kZVVuaXRzKTsKICAgIH0gZWxzZSB7CiAgICAgIGhhc2hlcgogICAgICAgIC4uYWRkKGNyZWRlbnRpYWxzLm5vbmNlLmNvZGVVbml0cykKICAgICAgICAuLmFkZChbX0NoYXJDb2RlLkNPTE9OXSkKICAgICAgICAuLmFkZChoYTIuY29kZVVuaXRzKTsKICAgIH0KICAgIHZhciByZXNwb25zZSA9IF9DcnlwdG9VdGlscy5ieXRlc1RvSGV4KGhhc2hlci5jbG9zZSgpKTsKCiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpCiAgICAgIC4ud3JpdGUoJ0RpZ2VzdCAnKQogICAgICAuLndyaXRlKCd1c2VybmFtZT0iJHVzZXJuYW1lIicpCiAgICAgIC4ud3JpdGUoJywgcmVhbG09IiR7Y3JlZGVudGlhbHMucmVhbG19IicpCiAgICAgIC4ud3JpdGUoJywgbm9uY2U9IiR7Y3JlZGVudGlhbHMubm9uY2V9IicpCiAgICAgIC4ud3JpdGUoJywgdXJpPSIkcmVxdWVzdFVyaSInKQogICAgICAuLndyaXRlKCcsIGFsZ29yaXRobT0iJHtjcmVkZW50aWFscy5hbGdvcml0aG19IicpOwogICAgaWYgKHFvcCA9PSAiYXV0aCIpIHsKICAgICAgYnVmZmVyCiAgICAgICAgLi53cml0ZSgnLCBxb3A9IiRxb3AiJykKICAgICAgICAuLndyaXRlKCcsIGNub25jZT0iJGNub25jZSInKQogICAgICAgIC4ud3JpdGUoJywgbmM9IiRuYyInKTsKICAgIH0KICAgIGJ1ZmZlci53cml0ZSgnLCByZXNwb25zZT0iJHJlc3BvbnNlIicpOwogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgdm9pZCBhdXRob3JpemUoX0NyZWRlbnRpYWxzIGNyZWRlbnRpYWxzLCBIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSB7CiAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KAogICAgICAgIEh0dHBIZWFkZXJzLmF1dGhvcml6YXRpb25IZWFkZXIsIGF1dGhvcml6YXRpb24oY3JlZGVudGlhbHMsIHJlcXVlc3QpKTsKICB9CgogIHZvaWQgYXV0aG9yaXplUHJveHkoCiAgICAgIF9Qcm94eUNyZWRlbnRpYWxzIGNyZWRlbnRpYWxzLCBIdHRwQ2xpZW50UmVxdWVzdCBy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OB4rIR8hLDUGBAE6AS0CAS4LAUIdAThGMRNJSy0vBAEuQg9PDgYqEQQCAS8PDAFPHQE9RjUEAS5CD08OBi8EAgFJJEdRAgFBLBMTAT0BQwEbQ0U8J0YmEkgaBAE+SwQBSFAEAgFCLRMTAT4BRAFPLx0mHyM3ARATDwtRJR1IIDU8DSshHCEgISkhHg0NKyEeBjwBLRkmMDAlORkNICYfBiweBAFIGU8EARdCPi4EAgEuGBcWRAIBGyIzPikkAgEZZGFydDpfaHR0cC9odHRwX2ltcGwuZGFydDVvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvX2h0dHAvd2Vic29ja2V0X2ltcGwuZGFydMAAoJUvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll9odHRwOwoKY29uc3QgU3RyaW5nIF93ZWJTb2NrZXRHVUlEID0gIjI1OEVBRkE1LUU5MTQtNDdEQS05NUNBLUM1QUIwREM4NUIxMSI7CmNvbnN0IFN0cmluZyBfY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIgPSAiY2xpZW50X25vX2NvbnRleHRfdGFrZW92ZXIiOwpjb25zdCBTdHJpbmcgX3NlcnZlck5vQ29udGV4dFRha2VvdmVyID0gInNlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyIjsKY29uc3QgU3RyaW5nIF9jbGllbnRNYXhXaW5kb3dCaXRzID0gImNsaWVudF9tYXhfd2luZG93X2JpdHMiOwpjb25zdCBTdHJpbmcgX3NlcnZlck1heFdpbmRvd0JpdHMgPSAic2VydmVyX21heF93aW5kb3dfYml0cyI7CgovLyBNYXRjaGVzIF9XZWJTb2NrZXRPcGNvZGUuCmNsYXNzIF9XZWJTb2NrZXRNZXNzYWdlVHlwZSB7CiAgc3RhdGljIGNvbnN0IGludCBOT05FID0gMDsKICBzdGF0aWMgY29uc3QgaW50IFRFWFQgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgQklOQVJZID0gMjsKfQoKY2xhc3MgX1dlYlNvY2tldE9wY29kZSB7CiAgc3RhdGljIGNvbnN0IGludCBDT05USU5VQVRJT04gPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgVEVYVCA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBCSU5BUlkgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgUkVTRVJWRURfMyA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBSRVNFUlZFRF80ID0gNDsKICBzdGF0aWMgY29uc3QgaW50IFJFU0VSVkVEXzUgPSA1OwogIHN0YXRpYyBjb25zdCBpbnQgUkVTRVJWRURfNiA9IDY7CiAgc3RhdGljIGNvbnN0IGludCBSRVNFUlZFRF83ID0gNzsKICBzdGF0aWMgY29uc3QgaW50IENMT1NFID0gODsKICBzdGF0aWMgY29uc3QgaW50IFBJTkcgPSA5OwogIHN0YXRpYyBjb25zdCBpbnQgUE9ORyA9IDEwOwogIHN0YXRpYyBjb25zdCBpbnQgUkVTRVJWRURfQiA9IDExOwogIHN0YXRpYyBjb25zdCBpbnQgUkVTRVJWRURfQyA9IDEyOwogIHN0YXRpYyBjb25zdCBpbnQgUkVTRVJWRURfRCA9IDEzOwogIHN0YXRpYyBjb25zdCBpbnQgUkVTRVJWRURfRSA9IDE0OwogIHN0YXRpYyBjb25zdCBpbnQgUkVTRVJWRURfRiA9IDE1Owp9CgpjbGFzcyBfRW5jb2RlZFN0cmluZyB7CiAgZmluYWwgTGlzdDxpbnQ+IGJ5dGVzOwogIF9FbmNvZGVkU3RyaW5nKHRoaXMuYnl0ZXMpOwp9CgovKioKICogIFN0b3JlcyB0aGUgaGVhZGVyIGFuZCBpbnRlZ2VyIHZhbHVlIGRlcml2ZWQgZnJvbSBuZWdvdGlhdGlvbiBvZgogKiAgY2xpZW50X21heF93aW5kb3dfYml0cyBhbmQgc2VydmVyX21heF93aW5kb3dfYml0cy4gaGVhZGVyVmFsdWUgd2lsbCBiZQogKiAgc2V0IGluIHRoZSBXZWJzb2NrZXQgcmVzcG9uc2UgaGVhZGVycy4KICovCmNsYXNzIF9Db21wcmVzc2lvbk1heFdpbmRvd0JpdHMgewogIFN0cmluZyBoZWFkZXJWYWx1ZTsKICBpbnQgbWF4V2luZG93Qml0czsKICBfQ29tcHJlc3Npb25NYXhXaW5kb3dCaXRzKFt0aGlzLmhlYWRlclZhbHVlLCB0aGlzLm1heFdpbmRvd0JpdHNdKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBoZWFkZXJWYWx1ZTsKfQoKLyoqCiAqIFRoZSB3ZWIgc29ja2V0IHByb3RvY29sIHRyYW5zZm9ybWVyIGhhbmRsZXMgdGhlIHByb3RvY29sIGJ5dGUgc3RyZWFtCiAqIHdoaWNoIGlzIHN1cHBsaWVkIHRocm91Z2ggdGhlIGBoYW5kbGVEYXRhYC4gQXMgdGhlIHByb3RvY29sIGlzIHByb2Nlc3NlZCwKICogaXQnbGwgb3V0cHV0IGZyYW1lIGRhdGEgYXMgZWl0aGVyIGEgTGlzdDxpbnQ+IG9yIFN0cmluZy4KICoKICogSW1wb3J0YW50IGluZm9ybWF0aW9uIGFib3V0IHVzYWdlOiBCZSBzdXJlIHlvdSB1c2UgY2FuY2VsT25FcnJvciwgc28gdGhlCiAqIHNvY2tldCB3aWxsIGJlIGNsb3NlZCB3aGVuIHRoZSBwcm9jZXNzb3IgZW5jb3VudGVyIGFuIGVycm9yLiBOb3QgdXNpbmcgaXQKICogd2lsbCBsZWFkIHRvIHVuZGVmaW5lZCBiZWhhdmlvdXIuCiAqLwpjbGFzcyBfV2ViU29ja2V0UHJvdG9jb2xUcmFuc2Zvcm1lciBleHRlbmRzIFN0cmVhbVRyYW5zZm9ybWVyQmFzZTxMaXN0PGludD4sCiAgICAgICAgZHluYW1pYyAvKkxpc3Q8aW50PnxfV2ViU29ja2V0UGluZ3xfV2ViU29ja2V0UG9uZyovID4KICAgIGltcGxlbWVudHMgRXZlbnRTaW5rPExpc3Q8aW50Pj4gewogIHN0YXRpYyBjb25zdCBpbnQgU1RBUlQgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgTEVOX0ZJUlNUID0gMTsKICBzdGF0aWMgY29uc3QgaW50IExFTl9SRVNUID0gMjsKICBzdGF0aWMgY29uc3QgaW50IE1BU0sgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgUEFZTE9BRCA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBDTE9TRUQgPSA1OwogIHN0YXRpYyBjb25zdCBpbnQgRkFJTFVSRSA9IDY7CiAgc3RhdGljIGNvbnN0IGludCBGSU4gPSAweDgwOwogIHN0YXRpYyBjb25zdCBpbnQgUlNWMSA9IDB4NDA7CiAgc3RhdGljIGNvbnN0IGludCBSU1YyID0gMHgyMDsKICBzdGF0aWMgY29uc3QgaW50IFJTVjMgPSAweDEwOwogIHN0YXRpYyBjb25zdCBpbnQgT1BDT0RFID0gMHhGOwoKICBpbnQgX3N0YXRlID0gU1RBUlQ7CiAgYm9vbCBfZmluID0gZmFsc2U7CiAgYm9vbCBfY29tcHJlc3NlZCA9IGZhbHNlOwogIGludCBfb3Bjb2RlID0gLTE7CiAgaW50IF9sZW4gPSAtMTsKICBib29sIF9tYXNrZWQgPSBmYWxzZTsKICBpbnQgX3JlbWFpbmluZ0xlbkJ5dGVzID0gLTE7CiAgaW50IF9yZW1haW5pbmdNYXNraW5nS2V5Qnl0ZXMgPSA0OwogIGludCBfcmVtYWluaW5nUGF5bG9hZEJ5dGVzID0gLTE7CiAgaW50IF91bm1hc2tpbmdJbmRleCA9IDA7CiAgaW50IF9jdXJyZW50TWVzc2FnZVR5cGUgPSBfV2ViU29ja2V0TWVzc2FnZVR5cGUuTk9ORTsKICBpbnQgY2xvc2VDb2RlID0gV2ViU29ja2V0U3RhdHVzLk5PX1NUQVRVU19SRUNFSVZFRDsKICBTdHJpbmcgY2xvc2VSZWFzb24gPSAiIjsKCiAgRXZlbnRTaW5rPGR5bmFtaWMgLypMaXN0PGludD58X1dlYlNvY2tldFBpbmd8X1dlYlNvY2tldFBvbmcqLyA+IF9ldmVudFNpbms7CgogIGZpbmFsIGJvb2wgX3NlcnZlclNpZGU7CiAgZmluYWwgTGlzdCBfbWFza2luZ0J5dGVzID0gbmV3IExpc3QoNCk7CiAgZmluYWwgQnl0ZXNCdWlsZGVyIF9wYXlsb2FkID0gbmV3IEJ5dGVzQnVpbGRlcihjb3B5OiBmYWxzZSk7CgogIF9XZWJTb2NrZXRQZXJNZXNzYWdlRGVmbGF0ZSBfZGVmbGF0ZTsKICBfV2ViU29ja2V0UHJvdG9jb2xUcmFuc2Zvcm1lcihbdGhpcy5fc2VydmVyU2lkZSA9IGZhbHNlLCB0aGlzLl9kZWZsYXRlXSk7CgogIFN0cmVhbTxkeW5hbWljIC8qTGlzdDxpbnQ+fF9XZWJTb2NrZXRQaW5nfF9XZWJTb2NrZXRQb25nKi8gPiBiaW5kKAogICAgICBTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0pIHsKICAgIHJldHVybiBuZXcgU3RyZWFtLmV2ZW50VHJhbnNmb3JtZWQoc3RyZWFtLCAoRXZlbnRTaW5rIGV2ZW50U2luaykgewogICAgICBpZiAoX2V2ZW50U2luayAhPSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIldlYlNvY2tldCB0cmFuc2Zvcm1lciBhbHJlYWR5IHVzZWQuIik7CiAgICAgIH0KICAgICAgX2V2ZW50U2luayA9IGV2ZW50U2luazsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICB9CgogIHZvaWQgYWRkRXJyb3IoT2JqZWN0IGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgX2V2ZW50U2luay5hZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgX2V2ZW50U2luay5jbG9zZSgpOwogIH0KCiAgLyoqCiAgICogUHJvY2VzcyBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHVuZGVybHlpbmcgY29tbXVuaWNhdGlvbiBjaGFubmVsLgogICAqLwogIHZvaWQgYWRkKExpc3Q8aW50PiBieXRlcykgewogICAgdmFyIGJ1ZmZlciA9IGJ5dGVzIGlzIFVpbnQ4TGlzdCA/IGJ5dGVzIDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChieXRlcyk7CiAgICBpbnQgaW5kZXggPSAwOwogICAgaW50IGxhc3RJbmRleCA9IGJ1ZmZlci5sZW5ndGg7CiAgICBpZiAoX3N0YXRlID09IENMT1NFRCkgewogICAgICB0aHJvdyBuZXcgV2ViU29ja2V0RXhjZXB0aW9uKCJEYXRhIG9uIGNsb3NlZCBjb25uZWN0aW9uIik7CiAgICB9CiAgICBpZiAoX3N0YXRlID09IEZBSUxVUkUpIHsKICAgICAgdGhyb3cgbmV3IFdlYlNvY2tldEV4Y2VwdGlvbigiRGF0YSBvbiBmYWlsZWQgY29ubmVjdGlvbiIpOwogICAgfQogICAgd2hpbGUgKChpbmRleCA8IGxhc3RJbmRleCkgJiYgX3N0YXRlICE9IENMT1NFRCAmJiBfc3RhdGUgIT0gRkFJTFVSRSkgewogICAgICBpbnQgYnl0ZSA9IGJ1ZmZlcltpbmRleF07CiAgICAgIGlmIChfc3RhdGUgPD0gTEVOX1JFU1QpIHsKICAgICAgICBpZiAoX3N0YXRlID09IFNUQVJUKSB7CiAgICAgICAgICBfZmluID0gKGJ5dGUgJiBGSU4pICE9IDA7CgogICAgICAgICAgaWYgKChieXRlICYgKFJTVjIgfCBSU1YzKSkgIT0gMCkgewogICAgICAgICAgICAvLyBUaGUgUlNWMiwgUlNWMyBiaXRzIG11c3QgYm90aCBiZSB6ZXJvLgogICAgICAgICAgICB0aHJvdyBuZXcgV2ViU29ja2V0RXhjZXB0aW9uKCJQcm90b2NvbCBlcnJvciIpOwogICAgICAgICAgfQoKICAgICAgICAgIF9vcGNvZGUgPSAoYnl0ZSAmIE9QQ09ERSk7CgogICAgICAgICAgaWYgKF9vcGNvZGUgIT0gX1dlYlNvY2tldE9wY29kZS5DT05USU5VQVRJT04pIHsKICAgICAgICAgICAgaWYgKChieXRlICYgUlNWMSkgIT0gMCkgewogICAgICAgICAgICAgIF9jb21wcmVzc2VkID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfY29tcHJlc3NlZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKF9vcGNvZGUgPD0gX1dlYlNvY2tldE9wY29kZS5CSU5BUlkpIHsKICAgICAgICAgICAgaWYgKF9vcGNvZGUgPT0gX1dlYlNvY2tldE9wY29kZS5DT05USU5VQVRJT04pIHsKICAgICAgICAgICAgICBpZiAoX2N1cnJlbnRNZXNzYWdlVHlwZSA9PSBfV2ViU29ja2V0TWVzc2FnZVR5cGUuTk9ORSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNvY2tldEV4Y2VwdGlvbigiUHJvdG9jb2wgZXJyb3IiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYXNzZXJ0KF9vcGNvZGUgPT0gX1dlYlNvY2tldE9wY29kZS5URVhUIHx8CiAgICAgICAgICAgICAgICAgIF9vcGNvZGUgPT0gX1dlYlNvY2tldE9wY29kZS5CSU5BUlkpOwogICAgICAgICAgICAgIGlmIChfY3VycmVudE1lc3NhZ2VUeXBlICE9IF9XZWJTb2NrZXRNZXNzYWdlVHlwZS5OT05FKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU29ja2V0RXhjZXB0aW9uKCJQcm90b2NvbCBlcnJvciIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBfY3VycmVudE1lc3NhZ2VUeXBlID0gX29wY29kZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChfb3Bjb2RlID49IF9XZWJTb2NrZXRPcGNvZGUuQ0xPU0UgJiYKICAgICAgICAgICAgICBfb3Bjb2RlIDw9IF9XZWJTb2NrZXRPcGNvZGUuUE9ORykgewogICAgICAgICAgICAvLyBDb250cm9sIGZyYW1lcyBjYW5ub3QgYmUgZnJhZ21lbnRlZC4KICAgICAgICAgICAgaWYgKCFfZmluKSB0aHJvdyBuZXcgV2ViU29ja2V0RXhjZXB0aW9uKCJQcm90b2NvbCBlcnJvciIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNvY2tldEV4Y2VwdGlvbigiUHJvdG9jb2wgZXJyb3IiKTsKICAgICAgICAgIH0KICAgICAgICAgIF9zdGF0ZSA9IExFTl9GSVJTVDsKICAgICAgICB9IGVsc2UgaWYgKF9zdGF0ZSA9PSBMRU5fRklSU1QpIHsKICAgICAgICAgIF9tYXNrZWQgPSAoYnl0ZSAmIDB4ODApICE9IDA7CiAgICAgICAgICBfbGVuID0gYnl0ZSAmIDB4N0Y7CiAgICAgICAgICBpZiAoX2lzQ29udHJvbEZyYW1lKCkgJiYgX2xlbiA+IDEyNSkgewogICAgICAgICAgICB0aHJvdyBuZXcgV2ViU29ja2V0RXhjZXB0aW9uKCJQcm90b2NvbCBlcnJvciIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKF9sZW4gPT0gMTI2KSB7CiAgICAgICAgICAgIF9sZW4gPSAwOwogICAgICAgICAgICBfcmVtYWluaW5nTGVuQnl0ZXMgPSAyOwogICAgICAgICAgICBfc3RhdGUgPSBMRU5fUkVTVDsKICAgICAgICAgIH0gZWxzZSBpZiAoX2xlbiA9PSAxMjcpIHsKICAgICAgICAgICAgX2xlbiA9IDA7CiAgICAgICAgICAgIF9yZW1haW5pbmdMZW5CeXRlcyA9IDg7CiAgICAgICAgICAgIF9zdGF0ZSA9IExFTl9SRVNUOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXNzZXJ0KF9sZW4gPCAxMjYpOwogICAgICAgICAgICBfbGVuZ3RoRG9uZSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhc3NlcnQoX3N0YXRlID09IExFTl9SRVNUKTsKICAgICAgICAgIF9sZW4gPSBfbGVuIDw8IDggfCBieXRlOwogICAgICAgICAgX3JlbWFpbmluZ0xlbkJ5dGVzLS07CiAgICAgICAgICBpZiAoX3JlbWFpbmluZ0xlbkJ5dGVzID09IDApIHsKICAgICAgICAgICAgX2xlbmd0aERvbmUoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKF9zdGF0ZSA9PSBNQVNLKSB7CiAgICAgICAgICBfbWFza2luZ0J5dGVzWzQgLSBfcmVtYWluaW5nTWFza2luZ0tleUJ5dGVzLS1dID0gYnl0ZTsKICAgICAgICAgIGlmIChfcmVtYWluaW5nTWFza2luZ0tleUJ5dGVzID09IDApIHsKICAgICAgICAgICAgX21hc2tEb25lKCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFzc2VydChfc3RhdGUgPT0gUEFZTE9BRCk7CiAgICAgICAgICAvLyBUaGUgcGF5bG9hZCBpcyBub3QgaGFuZGxlZCBvbmUgYnl0ZSBhdCBhIHRpbWUgYnV0IGluIGJsb2Nrcy4KICAgICAgICAgIGludCBwYXlsb2FkTGVuZ3RoID0gbWluKGxhc3RJbmRleCAtIGluZGV4LCBfcmVtYWluaW5nUGF5bG9hZEJ5dGVzKTsKICAgICAgICAgIF9yZW1haW5pbmdQYXlsb2FkQnl0ZXMgLT0gcGF5bG9hZExlbmd0aDsKICAgICAgICAgIC8vIFVubWFzayBwYXlsb2FkIGlmIG1hc2tlZC4KICAgICAgICAgIGlmIChfbWFza2VkKSB7CiAgICAgICAgICAgIF91bm1hc2soaW5kZXgsIHBheWxvYWRMZW5ndGgsIGJ1ZmZlcik7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDb250cm9sIGZyYW1lIGFuZCBkYXRhIGZyYW1lIHNoYXJlIF9wYXlsb2Fkcy4KICAgICAgICAgIF9wYXlsb2FkLmFkZChuZXcgVWludDhMaXN0LnZpZXcoYnVmZmVyLmJ1ZmZlciwgaW5kZXgsIHBheWxvYWRMZW5ndGgpKTsKICAgICAgICAgIGluZGV4ICs9IHBheWxvYWRMZW5ndGg7CiAgICAgICAgICBpZiAoX2lzQ29udHJvbEZyYW1lKCkpIHsKICAgICAgICAgICAgaWYgKF9yZW1haW5pbmdQYXlsb2FkQnl0ZXMgPT0gMCkgX2NvbnRyb2xGcmFtZUVuZCgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKF9jdXJyZW50TWVzc2FnZVR5cGUgIT0gX1dlYlNvY2tldE1lc3NhZ2VUeXBlLlRFWFQgJiYKICAgICAgICAgICAgICAgIF9jdXJyZW50TWVzc2FnZVR5cGUgIT0gX1dlYlNvY2tldE1lc3NhZ2VUeXBlLkJJTkFSWSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTb2NrZXRFeGNlcHRpb24oIlByb3RvY29sIGVycm9yIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKF9yZW1haW5pbmdQYXlsb2FkQnl0ZXMgPT0gMCkgX21lc3NhZ2VGcmFtZUVuZCgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIEhhY2sgLSBhcyB3ZSBhbHdheXMgZG8gaW5kZXgrKyBiZWxvdy4KICAgICAgICAgIGluZGV4LS07CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IGJ5dGUuCiAgICAgIGluZGV4Kys7CiAgICB9CiAgfQoKICB2b2lkIF91bm1hc2soaW50IGluZGV4LCBpbnQgbGVuZ3RoLCBVaW50OExpc3QgYnVmZmVyKSB7CiAgICBjb25zdCBpbnQgQkxPQ0tfU0laRSA9IDE2OwogICAgLy8gU2tpcCBJbnQzMng0LXZlcnNpb24gaWYgbWVzc2FnZSBpcyBzbWFsbC4KICAgIGlmIChsZW5ndGggPj0gQkxPQ0tfU0laRSkgewogICAgICAvLyBTdGFydCBieSBhbGlnbmluZyB0byAxNiBieXRlcy4KICAgICAgZmluYWwgaW50IHN0YXJ0T2Zmc2V0ID0gQkxPQ0tfU0laRSAtIChpbmRleCAmIDE1KTsKICAgICAgZmluYWwgaW50IGVuZCA9IGluZGV4ICsgc3RhcnRPZmZzZXQ7CiAgICAgIGZvciAoaW50IGkgPSBpbmRleDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgYnVmZmVyW2ldIF49IF9tYXNraW5nQnl0ZXNbX3VubWFza2luZ0luZGV4KysgJiAzXTsKICAgICAgfQogICAgICBpbmRleCArPSBzdGFydE9mZnNldDsKICAgICAgbGVuZ3RoIC09IHN0YXJ0T2Zmc2V0OwogICAgICBmaW5hbCBpbnQgYmxvY2tDb3VudCA9IGxlbmd0aCB+LyBCTE9DS19TSVpFOwogICAgICBpZiAoYmxvY2tDb3VudCA+IDApIHsKICAgICAgICAvLyBDcmVhdGUgbWFzayBibG9jay4KICAgICAgICBpbnQgbWFzayA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDM7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICBtYXNrID0gKG1hc2sgPDwgOCkgfCBfbWFza2luZ0J5dGVzWyhfdW5tYXNraW5nSW5kZXggKyBpKSAmIDNdOwogICAgICAgIH0KICAgICAgICBJbnQzMng0IGJsb2NrTWFzayA9IG5ldyBJbnQzMng0KG1hc2ssIG1hc2ssIG1hc2ssIG1hc2spOwogICAgICAgIEludDMyeDRMaXN0IGJsb2NrQnVmZmVyID0KICAgICAgICAgICAgbmV3IEludDMyeDRMaXN0LnZpZXcoYnVmZmVyLmJ1ZmZlciwgaW5kZXgsIGJsb2NrQ291bnQpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tCdWZmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGJsb2NrQnVmZmVyW2ldIF49IGJsb2NrTWFzazsKICAgICAgICB9CiAgICAgICAgZmluYWwgaW50IGJ5dGVzID0gYmxvY2tDb3VudCAqIEJMT0NLX1NJWkU7CiAgICAgICAgaW5kZXggKz0gYnl0ZXM7CiAgICAgICAgbGVuZ3RoIC09IGJ5dGVzOwogICAgICB9CiAgICB9CiAgICAvLyBIYW5kbGUgZW5kLgogICAgZmluYWwgaW50IGVuZCA9IGluZGV4ICsgbGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgZW5kOyBpKyspIHsKICAgICAgYnVmZmVyW2ldIF49IF9tYXNraW5nQnl0ZXNbX3VubWFza2luZ0luZGV4KysgJiAzXTsKICAgIH0KICB9CgogIHZvaWQgX2xlbmd0aERvbmUoKSB7CiAgICBpZiAoX21hc2tlZCkgewogICAgICBpZiAoIV9zZXJ2ZXJTaWRlKSB7CiAgICAgICAgdGhyb3cgbmV3IFdlYlNvY2tldEV4Y2VwdGlvbigiUmVjZWl2ZWQgbWFza2VkIGZyYW1lIGZyb20gc2VydmVyIik7CiAgICAgIH0KICAgICAgX3N0YXRlID0gTUFTSzsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChfc2VydmVyU2lkZSkgewogICAgICAgIHRocm93IG5ldyBXZWJTb2NrZXRFeGNlcHRpb24oIlJlY2VpdmVkIHVubWFza2VkIGZyYW1lIGZyb20gY2xpZW50Iik7CiAgICAgIH0KICAgICAgX3JlbWFpbmluZ1BheWxvYWRCeXRlcyA9IF9sZW47CiAgICAgIF9zdGFydFBheWxvYWQoKTsKICAgIH0KICB9CgogIHZvaWQgX21hc2tEb25lKCkgewogICAgX3JlbWFpbmluZ1BheWxvYWRCeXRlcyA9IF9sZW47CiAgICBfc3RhcnRQYXlsb2FkKCk7CiAgfQoKICB2b2lkIF9zdGFydFBheWxvYWQoKSB7CiAgICAvLyBJZiB0aGVyZSBpcyBubyBhY3R1YWwgcGF5bG9hZCBwZXJmb3JtIHBlcmZvcm0gY2FsbGJhY2tzIHdpdGhvdXQKICAgIC8vIGdvaW5nIHRocm91Z2ggdGhlIFBBWUxPQUQgc3RhdGUuCiAgICBpZiAoX3JlbWFpbmluZ1BheWxvYWRCeXRlcyA9PSAwKSB7CiAgICAgIGlmIChfaXNDb250cm9sRnJhbWUoKSkgewogICAgICAgIHN3aXRjaCAoX29wY29kZSkgewogICAgICAgICAgY2FzZSBfV2ViU29ja2V0T3Bjb2RlLkNMT1NFOgogICAgICAgICAgICBfc3RhdGUgPSBDTE9TRUQ7CiAgICAgICAgICAgIF9ldmVudFNpbmsuY2xvc2UoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF9XZWJTb2NrZXRPcGNvZGUuUElORzoKICAgICAgICAgICAgX2V2ZW50U2luay5hZGQobmV3IF9XZWJTb2NrZXRQaW5nKCkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX1dlYlNvY2tldE9wY29kZS5QT05HOgogICAgICAgICAgICBfZXZlbnRTaW5rLmFkZChuZXcgX1dlYlNvY2tldFBvbmcoKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBfcHJlcGFyZUZvck5leHRGcmFtZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIF9tZXNzYWdlRnJhbWVFbmQoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgX3N0YXRlID0gUEFZTE9BRDsKICAgIH0KICB9CgogIHZvaWQgX21lc3NhZ2VGcmFtZUVuZCgpIHsKICAgIGlmIChfZmluKSB7CiAgICAgIHZhciBieXRlcyA9IF9wYXlsb2FkLnRha2VCeXRlcygpOwogICAgICBpZiAoX2RlZmxhdGUgIT0gbnVsbCAmJiBfY29tcHJlc3NlZCkgewogICAgICAgIGJ5dGVzID0gX2RlZmxhdGUucHJvY2Vzc0luY29taW5nTWVzc2FnZShieXRlcyk7CiAgICAgIH0KCiAgICAgIHN3aXRjaCAoX2N1cnJlbnRNZXNzYWdlVHlwZSkgewogICAgICAgIGNhc2UgX1dlYlNvY2tldE1lc3NhZ2VUeXBlLlRFWFQ6CiAgICAgICAgICBfZXZlbnRTaW5rLmFkZCh1dGY4LmRlY29kZShieXRlcykpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBfV2ViU29ja2V0TWVzc2FnZVR5cGUuQklOQVJZOgogICAgICAgICAgX2V2ZW50U2luay5hZGQoYnl0ZXMpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgX2N1cnJlbnRNZXNzYWdlVHlwZSA9IF9XZWJTb2NrZXRNZXNzYWdlVHlwZS5OT05FOwogICAgfQogICAgX3ByZXBhcmVGb3JOZXh0RnJhbWUoKTsKICB9CgogIHZvaWQgX2NvbnRyb2xGcmFtZUVuZCgpIHsKICAgIHN3aXRjaCAoX29wY29kZSkgewogICAgICBjYXNlIF9XZWJTb2NrZXRPcGNvZGUuQ0xPU0U6CiAgICAgICAgY2xvc2VDb2RlID0gV2ViU29ja2V0U3RhdHVzLk5PX1NUQVRVU19SRUNFSVZFRDsKICAgICAgICB2YXIgcGF5bG9hZCA9IF9wYXlsb2FkLnRha2VCeXRlcygpOwogICAgICAgIGlmIChwYXlsb2FkLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGlmIChwYXlsb2FkLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBXZWJTb2NrZXRFeGNlcHRpb24oIlByb3RvY29sIGVycm9yIik7CiAgICAgICAgICB9CiAgICAgICAgICBjbG9zZUNvZGUgPSBwYXlsb2FkWzBdIDw8IDggfCBwYXlsb2FkWzFdOwogICAgICAgICAgaWYgKGNsb3NlQ29kZSA9PSBXZWJTb2NrZXRTdGF0dXMuTk9fU1RBVFVTX1JFQ0VJVkVEKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBXZWJTb2NrZXRFeGNlcHRpb24oIlByb3RvY29sIGVycm9yIik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGF5bG9hZC5sZW5ndGggPiAyKSB7CiAgICAgICAgICAgIGNsb3NlUmVhc29uID0gdXRmOC5kZWNvZGUocGF5bG9hZC5zdWJsaXN0KDIpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX3N0YXRlID0gQ0xPU0VEOwogICAgICAgIF9ldmVudFNpbmsuY2xvc2UoKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgX1dlYlNvY2tldE9wY29kZS5QSU5HOgogICAgICAgIF9ldmVudFNpbmsuYWRkKG5ldyBfV2ViU29ja2V0UGluZyhfcGF5bG9hZC50YWtlQnl0ZXMoKSkpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBfV2ViU29ja2V0T3Bjb2RlLlBPTkc6CiAgICAgICAgX2V2ZW50U2luay5hZGQobmV3IF9XZWJTb2NrZXRQb25nKF9wYXlsb2FkLnRha2VCeXRlcygpKSk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBfcHJlcGFyZUZvck5leHRGcmFtZSgpOwogIH0KCiAgYm9vbCBfaXNDb250cm9sRnJhbWUoKSB7CiAgICByZXR1cm4gX29wY29kZSA9PSBfV2ViU29ja2V0T3Bjb2RlLkNMT1NFIHx8CiAgICAgICAgX29wY29kZSA9PSBfV2ViU29ja2V0T3Bjb2RlLlBJTkcgfHwKICAgICAgICBfb3Bjb2RlID09IF9XZWJTb2NrZXRPcGNvZGUuUE9ORzsKICB9CgogIHZvaWQgX3ByZXBhcmVGb3JOZXh0RnJhbWUoKSB7CiAgICBpZiAoX3N0YXRlICE9IENMT1NFRCAmJiBfc3RhdGUgIT0gRkFJTFVSRSkgX3N0YXRlID0gU1RBUlQ7CiAgICBfZmluID0gZmFsc2U7CiAgICBfb3Bjb2RlID0gLTE7CiAgICBfbGVuID0gLTE7CiAgICBfcmVtYWluaW5nTGVuQnl0ZXMgPSAtMTsKICAgIF9yZW1haW5pbmdNYXNraW5nS2V5Qnl0ZXMgPSA0OwogICAgX3JlbWFpbmluZ1BheWxvYWRCeXRlcyA9IC0xOwogICAgX3VubWFza2luZ0luZGV4ID0gMDsKICB9Cn0KCmNsYXNzIF9XZWJTb2NrZXRQaW5nIHsKICBmaW5hbCBMaXN0PGludD4gcGF5bG9hZDsKICBfV2ViU29ja2V0UGluZyhbdGhpcy5wYXlsb2FkID0gbnVsbF0pOwp9CgpjbGFzcyBfV2ViU29ja2V0UG9uZyB7CiAgZmluYWwgTGlzdDxpbnQ+IHBheWxvYWQ7CiAgX1dlYlNvY2tldFBvbmcoW3RoaXMucGF5bG9hZCA9IG51bGxdKTsKfQoKdHlwZWRlZiAvKlN0cmluZ3xGdXR1cmU8U3RyaW5nPiovIF9Qcm90b2NvbFNlbGVjdG9yKExpc3Q8U3RyaW5nPiBwcm90b2NvbHMpOwoKY2xhc3MgX1dlYlNvY2tldFRyYW5zZm9ybWVySW1wbAogICAgZXh0ZW5kcyBTdHJlYW1UcmFuc2Zvcm1lckJhc2U8SHR0cFJlcXVlc3QsIFdlYlNvY2tldD4KICAgIGltcGxlbWVudHMgV2ViU29ja2V0VHJhbnNmb3JtZXIgewogIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8V2ViU29ja2V0PiBfY29udHJvbGxlciA9CiAgICAgIG5ldyBTdHJlYW1Db250cm9sbGVyPFdlYlNvY2tldD4oc3luYzogdHJ1ZSk7CiAgZmluYWwgX1Byb3RvY29sU2VsZWN0b3IgX3Byb3RvY29sU2VsZWN0b3I7CiAgZmluYWwgQ29tcHJlc3Npb25PcHRpb25zIF9jb21wcmVzc2lvbjsKCiAgX1dlYlNvY2tldFRyYW5zZm9ybWVySW1wbCh0aGlzLl9wcm90b2NvbFNlbGVjdG9yLCB0aGlzLl9jb21wcmVzc2lvbik7CgogIFN0cmVhbTxXZWJTb2NrZXQ+IGJpbmQoU3RyZWFtPEh0dHBSZXF1ZXN0PiBzdHJlYW0pIHsKICAgIHN0cmVhbS5saXN0ZW4oKHJlcXVlc3QpIHsKICAgICAgX3VwZ3JhZGUocmVxdWVzdCwgX3Byb3RvY29sU2VsZWN0b3IsIF9jb21wcmVzc2lvbikKICAgICAgICAgIC50aGVuKChXZWJTb2NrZXQgd2ViU29ja2V0KSA9PiBfY29udHJvbGxlci5hZGQod2ViU29ja2V0KSkKICAgICAgICAgIC5jYXRjaEVycm9yKF9jb250cm9sbGVyLmFkZEVycm9yKTsKICAgIH0sIG9uRG9uZTogKCkgewogICAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgfSk7CgogICAgcmV0dXJuIF9jb250cm9sbGVyLnN0cmVhbTsKICB9CgogIHN0YXRpYyBMaXN0PFN0cmluZz4gX3Rva2VuaXplRmllbGRWYWx1ZShTdHJpbmcgaGVhZGVyVmFsdWUpIHsKICAgIExpc3Q8U3RyaW5nPiB0b2tlbnMgPSBuZXcgTGlzdDxTdHJpbmc+KCk7CiAgICBpbnQgc3RhcnQgPSAwOwogICAgaW50IGluZGV4ID0gMDsKICAgIHdoaWxlIChpbmRleCA8IGhlYWRlclZhbHVlLmxlbmd0aCkgewogICAgICBpZiAoaGVhZGVyVmFsdWVbaW5kZXhdID09ICIsIikgewogICAgICAgIHRva2Vucy5hZGQoaGVhZGVyVmFsdWUuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCkpOwogICAgICAgIHN0YXJ0ID0gaW5kZXggKyAxOwogICAgICB9IGVsc2UgaWYgKGhlYWRlclZhbHVlW2luZGV4XSA9PSAiICIgfHwgaGVhZGVyVmFsdWVbaW5kZXhdID09ICJcdCIpIHsKICAgICAgICBzdGFydCsrOwogICAgICB9CiAgICAgIGluZGV4Kys7CiAgICB9CiAgICB0b2tlbnMuYWRkKGhlYWRlclZhbHVlLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpKTsKICAgIHJldHVybiB0b2tlbnM7CiAgfQoKICBzdGF0aWMgRnV0dXJlPFdlYlNvY2tldD4gX3VwZ3JhZGUoSHR0cFJlcXVlc3QgcmVxdWVzdCwKICAgICAgX1Byb3RvY29sU2VsZWN0b3IgX3Byb3RvY29sU2VsZWN0b3IsIENvbXByZXNzaW9uT3B0aW9ucyBjb21wcmVzc2lvbikgewogICAgdmFyIHJlc3BvbnNlID0gcmVxdWVzdC5yZXNwb25zZTsKICAgIGlmICghX2lzVXBncmFkZVJlcXVlc3QocmVxdWVzdCkpIHsKICAgICAgLy8gU2VuZCBlcnJvciByZXNwb25zZS4KICAgICAgcmVzcG9uc2UKICAgICAgICAuLnN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzLmJhZFJlcXVlc3QKICAgICAgICAuLmNsb3NlKCk7CiAgICAgIHJldHVybiBuZXcgRnV0dXJlLmVycm9yKAogICAgICAgICAgbmV3IFdlYlNvY2tldEV4Y2VwdGlvbigiSW52YWxpZCBXZWJTb2NrZXQgdXBncmFkZSByZXF1ZXN0IikpOwogICAgfQoKICAgIEZ1dHVyZTxXZWJTb2NrZXQ+IHVwZ3JhZGUoU3RyaW5nIHByb3RvY29sKSB7CiAgICAgIC8vIFNlbmQgdGhlIHVwZ3JhZGUgcmVzcG9uc2UuCiAgICAgIHJlc3BvbnNlCiAgICAgICAgLi5zdGF0dXNDb2RlID0gSHR0cFN0YXR1cy5zd2l0Y2hpbmdQcm90b2NvbHMKICAgICAgICAuLmhlYWRlcnMuYWRkKEh0dHBIZWFkZXJzLmNvbm5lY3Rpb25IZWFkZXIsICJVcGdyYWRlIikKICAgICAgICAuLmhlYWRlcnMuYWRkKEh0dHBIZWFkZXJzLnVwZ3JhZGVIZWFkZXIsICJ3ZWJzb2NrZXQiKTsKICAgICAgU3RyaW5nIGtleSA9IHJlcXVlc3QuaGVhZGVycy52YWx1ZSgiU2VjLVdlYlNvY2tldC1LZXkiKTsKICAgICAgX1NIQTEgc2hhMSA9IG5ldyBfU0hBMSgpOwogICAgICBzaGExLmFkZCgiJGtleSRfd2ViU29ja2V0R1VJRCIuY29kZVVuaXRzKTsKICAgICAgU3RyaW5nIGFjY2VwdCA9IF9DcnlwdG9VdGlscy5ieXRlc1RvQmFzZTY0KHNoYTEuY2xvc2UoKSk7CiAgICAgIHJlc3BvbnNlLmhlYWRlcnMuYWRkKCJTZWMtV2ViU29ja2V0LUFjY2VwdCIsIGFjY2VwdCk7CiAgICAgIGlmIChwcm90b2NvbCAhPSBudWxsKSB7CiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5hZGQoIlNlYy1XZWJTb2NrZXQtUHJvdG9jb2wiLCBwcm90b2NvbCk7CiAgICAgIH0KCiAgICAgIHZhciBkZWZsYXRlID0gX25lZ290aWF0ZUNvbXByZXNzaW9uKHJlcXVlc3QsIHJlc3BvbnNlLCBjb21wcmVzc2lvbik7CgogICAgICByZXNwb25zZS5oZWFkZXJzLmNvbnRlbnRMZW5ndGggPSAwOwogICAgICByZXR1cm4gcmVzcG9uc2UuZGV0YWNoU29ja2V0KCkudGhlbjxXZWJTb2NrZXQ+KChzb2NrZXQpID0+CiAgICAgICAgICBuZXcgX1dlYlNvY2tldEltcGwuX2Zyb21Tb2NrZXQoCiAgICAgICAgICAgICAgc29ja2V0LCBwcm90b2NvbCwgY29tcHJlc3Npb24sIHRydWUsIGRlZmxhdGUpKTsKICAgIH0KCiAgICB2YXIgcHJvdG9jb2xzID0gcmVxdWVzdC5oZWFkZXJzWydTZWMtV2ViU29ja2V0LVByb3RvY29sJ107CiAgICBpZiAocHJvdG9jb2xzICE9IG51bGwgJiYgX3Byb3RvY29sU2VsZWN0b3IgIT0gbnVsbCkgewogICAgICAvLyBUaGUgc3VnZ2VzdGVkIHByb3RvY29scyBjYW4gYmUgc3ByZWFkIG92ZXIgbXVsdGlwbGUgbGluZXMsIGVhY2gKICAgICAgLy8gY29uc2lzdGluZyBvZiBtdWx0aXBsZSBwcm90b2NvbHMuIFRvIHVuaWZ5IGFsbCBvZiB0aGVtLCBmaXJzdCBqb2luCiAgICAgIC8vIHRoZSBsaXN0cyB3aXRoICcsICcgYW5kIHRoZW4gdG9rZW5pemUuCiAgICAgIHByb3RvY29scyA9IF90b2tlbml6ZUZpZWxkVmFsdWUocHJvdG9jb2xzLmpvaW4oJywgJykpOwogICAgICByZXR1cm4gbmV3IEZ1dHVyZTxTdHJpbmc+KCgpID0+IF9wcm90b2NvbFNlbGVjdG9yKHByb3RvY29scykpCiAgICAgICAgICAudGhlbjxTdHJpbmc+KChwcm90b2NvbCkgewogICAgICAgIGlmIChwcm90b2NvbHMuaW5kZXhPZihwcm90b2NvbCkgPCAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgV2ViU29ja2V0RXhjZXB0aW9uKAogICAgICAgICAgICAgICJTZWxlY3RlZCBwcm90b2NvbCBpcyBub3QgaW4gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHByb3RvY29scyIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvdG9jb2w7CiAgICAgIH0pLmNhdGNoRXJyb3IoKGVycm9yKSB7CiAgICAgICAgcmVzcG9uc2UKICAgICAgICAgIC4uc3RhdHVzQ29kZSA9IEh0dHBTdGF0dXMuaW50ZXJuYWxTZXJ2ZXJFcnJvcgogICAgICAgICAgLi5jbG9zZSgpOwogICAgICAgIHRocm93IGVycm9yOwogICAgICB9KS50aGVuPFdlYlNvY2tldD4odXBncmFkZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdXBncmFkZShudWxsKTsKICAgIH0KICB9CgogIHN0YXRpYyBfV2ViU29ja2V0UGVyTWVzc2FnZURlZmxhdGUgX25lZ290aWF0ZUNvbXByZXNzaW9uKEh0dHBSZXF1ZXN0IHJlcXVlc3QsCiAgICAgIEh0dHBSZXNwb25zZSByZXNwb25zZSwgQ29tcHJlc3Npb25PcHRpb25zIGNvbXByZXNzaW9uKSB7CiAgICB2YXIgZXh0ZW5zaW9uSGVhZGVyID0gcmVxdWVzdC5oZWFkZXJzLnZhbHVlKCJTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMiKTsKCiAgICBleHRlbnNpb25IZWFkZXIgPz89ICIiOwoKICAgIHZhciBodiA9IEhlYWRlclZhbHVlLnBhcnNlKGV4dGVuc2lvbkhlYWRlciwgdmFsdWVTZXBhcmF0b3I6ICcsJyk7CiAgICBpZiAoY29tcHJlc3Npb24uZW5hYmxlZCAmJiBodi52YWx1ZSA9PSBfV2ViU29ja2V0SW1wbC5QRVJfTUVTU0FHRV9ERUZMQVRFKSB7CiAgICAgIHZhciBpbmZvID0gY29tcHJlc3Npb24uX2NyZWF0ZUhlYWRlcihodik7CgogICAgICByZXNwb25zZS5oZWFkZXJzLmFkZCgiU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zIiwgaW5mby5oZWFkZXJWYWx1ZSk7CiAgICAgIHZhciBzZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlciA9CiAgICAgICAgICAoaHYucGFyYW1ldGVycy5jb250YWluc0tleShfc2VydmVyTm9Db250ZXh0VGFrZW92ZXIpICYmCiAgICAgICAgICAgICAgY29tcHJlc3Npb24uc2VydmVyTm9Db250ZXh0VGFrZW92ZXIpOwogICAgICB2YXIgY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIgPQogICAgICAgICAgKGh2LnBhcmFtZXRlcnMuY29udGFpbnNLZXkoX2NsaWVudE5vQ29udGV4dFRha2VvdmVyKSAmJgogICAgICAgICAgICAgIGNvbXByZXNzaW9uLmNsaWVudE5vQ29udGV4dFRha2VvdmVyKTsKICAgICAgdmFyIGRlZmxhdGUgPSBuZXcgX1dlYlNvY2tldFBlck1lc3NhZ2VEZWZsYXRlKAogICAgICAgICAgc2VydmVyTm9Db250ZXh0VGFrZW92ZXI6IHNlcnZlck5vQ29udGV4dFRha2VvdmVyLAogICAgICAgICAgY2xpZW50Tm9Db250ZXh0VGFrZW92ZXI6IGNsaWVudE5vQ29udGV4dFRha2VvdmVyLAogICAgICAgICAgc2VydmVyTWF4V2luZG93Qml0czogaW5mby5tYXhXaW5kb3dCaXRzLAogICAgICAgICAgY2xpZW50TWF4V2luZG93Qml0czogaW5mby5tYXhXaW5kb3dCaXRzLAogICAgICAgICAgc2VydmVyU2lkZTogdHJ1ZSk7CgogICAgICByZXR1cm4gZGVmbGF0ZTsKICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9CgogIHN0YXRpYyBib29sIF9pc1VwZ3JhZGVSZXF1ZXN0KEh0dHBSZXF1ZXN0IHJlcXVlc3QpIHsKICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCAhPSAiR0VUIikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAocmVxdWVzdC5oZWFkZXJzW0h0dHBIZWFkZXJzLmNvbm5lY3Rpb25IZWFkZXJdID09IG51bGwpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgYm9vbCBpc1VwZ3JhZGUgPSBmYWxzZTsKICAgIHJlcXVlc3QuaGVhZGVyc1tIdHRwSGVhZGVycy5jb25uZWN0aW9uSGVhZGVyXS5mb3JFYWNoKChTdHJpbmcgdmFsdWUpIHsKICAgICAgaWYgKHZhbHVlLnRvTG93ZXJDYXNlKCkgPT0gInVwZ3JhZGUiKSBpc1VwZ3JhZGUgPSB0cnVlOwogICAgfSk7CiAgICBpZiAoIWlzVXBncmFkZSkgcmV0dXJuIGZhbHNlOwogICAgU3RyaW5nIHVwZ3JhZGUgPSByZXF1ZXN0LmhlYWRlcnMudmFsdWUoSHR0cEhlYWRlcnMudXBncmFkZUhlYWRlcik7CiAgICBpZiAodXBncmFkZSA9PSBudWxsIHx8IHVwZ3JhZGUudG9Mb3dlckNhc2UoKSAhPSAid2Vic29ja2V0IikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBTdHJpbmcgdmVyc2lvbiA9IHJlcXVlc3QuaGVhZGVycy52YWx1ZSgiU2VjLVdlYlNvY2tldC1WZXJzaW9uIik7CiAgICBpZiAodmVyc2lvbiA9PSBudWxsIHx8IHZlcnNpb24gIT0gIjEzIikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBTdHJpbmcga2V5ID0gcmVxdWVzdC5oZWFkZXJzLnZhbHVlKCJTZWMtV2ViU29ja2V0LUtleSIpOwogICAgaWYgKGtleSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfQoKY2xhc3MgX1dlYlNvY2tldFBlck1lc3NhZ2VEZWZsYXRlIHsKICBib29sIHNlcnZlck5vQ29udGV4dFRha2VvdmVyOwogIGJvb2wgY2xpZW50Tm9Db250ZXh0VGFrZW92ZXI7CiAgaW50IGNsaWVudE1heFdpbmRvd0JpdHM7CiAgaW50IHNlcnZlck1heFdpbmRvd0JpdHM7CiAgYm9vbCBzZXJ2ZXJTaWRlOwoKICBSYXdaTGliRmlsdGVyIGRlY29kZXI7CiAgUmF3WkxpYkZpbHRlciBlbmNvZGVyOwoKICBfV2ViU29ja2V0UGVyTWVzc2FnZURlZmxhdGUoCiAgICAgIHt0aGlzLmNsaWVudE1heFdpbmRvd0JpdHM6IF9XZWJTb2NrZXRJbXBsLkRFRkFVTFRfV0lORE9XX0JJVFMsCiAgICAgIHRoaXMuc2VydmVyTWF4V2luZG93Qml0czogX1dlYlNvY2tldEltcGwuREVGQVVMVF9XSU5ET1dfQklUUywKICAgICAgdGhpcy5zZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlcjogZmFsc2UsCiAgICAgIHRoaXMuY2xpZW50Tm9Db250ZXh0VGFrZW92ZXI6IGZhbHNlLAogICAgICB0aGlzLnNlcnZlclNpZGU6IGZhbHNlfSk7CgogIHZvaWQgX2Vuc3VyZURlY29kZXIoKSB7CiAgICBpZiAoZGVjb2RlciA9PSBudWxsKSB7CiAgICAgIGRlY29kZXIgPSBuZXcgUmF3WkxpYkZpbHRlci5pbmZsYXRlRmlsdGVyKAogICAgICAgICAgd2luZG93Qml0czogc2VydmVyU2lkZSA/IGNsaWVudE1heFdpbmRvd0JpdHMgOiBzZXJ2ZXJNYXhXaW5kb3dCaXRzLAogICAgICAgICAgcmF3OiB0cnVlKTsKICAgIH0KICB9CgogIHZvaWQgX2Vuc3VyZUVuY29kZXIoKSB7CiAgICBpZiAoZW5jb2RlciA9PSBudWxsKSB7CiAgICAgIGVuY29kZXIgPSBuZXcgUmF3WkxpYkZpbHRlci5kZWZsYXRlRmlsdGVyKAogICAgICAgICAgd2luZG93Qml0czogc2VydmVyU2lkZSA/IHNlcnZlck1heFdpbmRvd0JpdHMgOiBjbGllbnRNYXhXaW5kb3dCaXRzLAogICAgICAgICAgcmF3OiB0cnVlKTsKICAgIH0KICB9CgogIFVpbnQ4TGlzdCBwcm9jZXNzSW5jb21pbmdNZXNzYWdlKExpc3Q8aW50PiBtc2cpIHsKICAgIF9lbnN1cmVEZWNvZGVyKCk7CgogICAgdmFyIGRhdGEgPSA8aW50PltdOwogICAgZGF0YS5hZGRBbGwobXNnKTsKICAgIGRhdGEuYWRkQWxsKGNvbnN0IFsweDAwLCAweDAwLCAweGZmLCAweGZmXSk7CgogICAgZGVjb2Rlci5wcm9jZXNzKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKICAgIHZhciByZXN1bHQgPSA8aW50PltdOwogICAgTGlzdDxpbnQ+IG91dDsKCiAgICB3aGlsZSAoKG91dCA9IGRlY29kZXIucHJvY2Vzc2VkKCkpICE9IG51bGwpIHsKICAgICAgcmVzdWx0LmFkZEFsbChvdXQpOwogICAgfQoKICAgIGlmICgoc2VydmVyU2lkZSAmJiBjbGllbnROb0NvbnRleHRUYWtlb3ZlcikgfHwKICAgICAgICAoIXNlcnZlclNpZGUgJiYgc2VydmVyTm9Db250ZXh0VGFrZW92ZXIpKSB7CiAgICAgIGRlY29kZXIgPSBudWxsOwogICAgfQoKICAgIHJldHVybiBuZXcgVWludDhMaXN0LmZyb21MaXN0KHJlc3VsdCk7CiAgfQoKICBMaXN0PGludD4gcHJvY2Vzc091dGdvaW5nTWVzc2FnZShMaXN0PGludD4gbXNnKSB7CiAgICBfZW5zdXJlRW5jb2RlcigpOwogICAgdmFyIHJlc3VsdCA9IDxpbnQ+W107CiAgICBVaW50OExpc3QgYnVmZmVyOwoKICAgIGlmIChtc2cgaXMhIFVpbnQ4TGlzdCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChtc2dbaV0gPCAwIHx8IDI1NSA8IG1zZ1tpXSkgewogICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkxpc3QgZWxlbWVudCBpcyBub3QgYSBieXRlIHZhbHVlICIKICAgICAgICAgICAgICAiKHZhbHVlICR7bXNnW2ldfSBhdCBpbmRleCAkaSkiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChtc2cpOwogICAgfSBlbHNlIHsKICAgICAgYnVmZmVyID0gbXNnOwogICAgfQoKICAgIGVuY29kZXIucHJvY2VzcyhidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOwoKICAgIExpc3Q8aW50PiBvdXQ7CiAgICB3aGlsZSAoKG91dCA9IGVuY29kZXIucHJvY2Vzc2VkKCkpICE9IG51bGwpIHsKICAgICAgcmVzdWx0LmFkZEFsbChvdXQpOwogICAgfQoKICAgIGlmICgoIXNlcnZlclNpZGUgJiYgY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIpIHx8CiAgICAgICAgKHNlcnZlclNpZGUgJiYgc2VydmVyTm9Db250ZXh0VGFrZW92ZXIpKSB7CiAgICAgIGVuY29kZXIgPSBudWxsOwogICAgfQoKICAgIGlmIChyZXN1bHQubGVuZ3RoID4gNCkgewogICAgICByZXN1bHQgPSByZXN1bHQuc3VibGlzdCgwLCByZXN1bHQubGVuZ3RoIC0gNCk7CiAgICB9CgogICAgLy8gUkZDIDc2OTIgNy4yLjMuNi4gIkdlbmVyYXRpbmcgYW4gRW1wdHkgRnJhZ21lbnQiIHNheXMgdGhhdCBpZiB0aGUKICAgIC8vIGNvbXByZXNzaW9uIGxpYnJhcnkgZG9lc24ndCBnZW5lcmF0ZSBhbnkgZGF0YSB3aGVuIHRoZSBidWZlciBpcyBlbXB0eSwKICAgIC8vIHRoZW4gYW4gZW1wdHkgdW5jb21wcmVzc2VkIGRlZmxhdGUgYmxvY2sgaXMgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLiBUaGUKICAgIC8vIDB4MDAgYmxvY2sgaGFzIHRoZSBCRklOQUwgaGVhZGVyIGJpdCBzZXQgdG8gMCBhbmQgdGhlIEJUWVBFIGhlYWRlciBzZXQgdG8KICAgIC8vIDAwIGFsb25nIHdpdGggNSBiaXRzIG9mIHBhZGRpbmcuIFRoaXMgYmxvY2sgZGVjb2RlcyB0byB6ZXJvIGJ5dGVzLgogICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkgewogICAgICByZXR1cm4gWzB4MDBdOwogICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgovLyBUT0RPKGFqb2huc2VuKTogTWFrZSB0aGlzIHRyYW5zZm9ybWVyIHJldXNhYmxlLgpjbGFzcyBfV2ViU29ja2V0T3V0Z29pbmdUcmFuc2Zvcm1lcgogICAgZXh0ZW5kcyBTdHJlYW1UcmFuc2Zvcm1lckJhc2U8ZHluYW1pYywgTGlzdDxpbnQ+PiBpbXBsZW1lbnRzIEV2ZW50U2luayB7CiAgZmluYWwgX1dlYlNvY2tldEltcGwgd2ViU29ja2V0OwogIEV2ZW50U2luazxMaXN0PGludD4+IF9ldmVudFNpbms7CgogIF9XZWJTb2NrZXRQZXJNZXNzYWdlRGVmbGF0ZSBfZGVmbGF0ZUhlbHBlcjsKCiAgX1dlYlNvY2tldE91dGdvaW5nVHJhbnNmb3JtZXIodGhpcy53ZWJTb2NrZXQpIHsKICAgIF9kZWZsYXRlSGVscGVyID0gd2ViU29ja2V0Ll9kZWZsYXRlOwogIH0KCiAgU3RyZWFtPExpc3Q8aW50Pj4gYmluZChTdHJlYW0gc3RyZWFtKSB7CiAgICByZXR1cm4gbmV3IFN0cmVhbTxMaXN0PGludD4+LmV2ZW50VHJhbnNmb3JtZWQoc3RyZWFtLAogICAgICAgIChFdmVudFNpbms8TGlzdDxpbnQ+PiBldmVudFNpbmspIHsKICAgICAgaWYgKF9ldmVudFNpbmsgIT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJXZWJTb2NrZXQgdHJhbnNmb3JtZXIgYWxyZWFkeSB1c2VkIik7CiAgICAgIH0KICAgICAgX2V2ZW50U2luayA9IGV2ZW50U2luazsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICB9CgogIHZvaWQgYWRkKG1lc3NhZ2UpIHsKICAgIGlmIChtZXNzYWdlIGlzIF9XZWJTb2NrZXRQb25nKSB7CiAgICAgIGFkZEZyYW1lKF9XZWJTb2NrZXRPcGNvZGUuUE9ORywgbWVzc2FnZS5wYXlsb2FkKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG1lc3NhZ2UgaXMgX1dlYlNvY2tldFBpbmcpIHsKICAgICAgYWRkRnJhbWUoX1dlYlNvY2tldE9wY29kZS5QSU5HLCBtZXNzYWdlLnBheWxvYWQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBMaXN0PGludD4gZGF0YTsKICAgIGludCBvcGNvZGU7CiAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7CiAgICAgIGlmIChtZXNzYWdlIGlzIFN0cmluZykgewogICAgICAgIG9wY29kZSA9IF9XZWJTb2NrZXRPcGNvZGUuVEVYVDsKICAgICAgICBkYXRhID0gdXRmOC5lbmNvZGUobWVzc2FnZSk7CiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZSBpcyBMaXN0PGludD4pIHsKICAgICAgICBvcGNvZGUgPSBfV2ViU29ja2V0T3Bjb2RlLkJJTkFSWTsKICAgICAgICBkYXRhID0gbWVzc2FnZTsKICAgICAgfSBlbHNlIGlmIChtZXNzYWdlIGlzIF9FbmNvZGVkU3RyaW5nKSB7CiAgICAgICAgb3Bjb2RlID0gX1dlYlNvY2tldE9wY29kZS5URVhUOwogICAgICAgIGRhdGEgPSBtZXNzYWdlLmJ5dGVzOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKG1lc3NhZ2UpOwogICAgICB9CgogICAgICBpZiAoX2RlZmxhdGVIZWxwZXIgIT0gbnVsbCkgewogICAgICAgIGRhdGEgPSBfZGVmbGF0ZUhlbHBlci5wcm9jZXNzT3V0Z29pbmdNZXNzYWdlKGRhdGEpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBvcGNvZGUgPSBfV2ViU29ja2V0T3Bjb2RlLlRFWFQ7CiAgICB9CiAgICBhZGRGcmFtZShvcGNvZGUsIGRhdGEpOwogIH0KCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBfZXZlbnRTaW5rLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBpbnQgY29kZSA9IHdlYlNvY2tldC5fb3V0Q2xvc2VDb2RlOwogICAgU3RyaW5nIHJlYXNvbiA9IHdlYlNvY2tldC5fb3V0Q2xvc2VSZWFzb247CiAgICBMaXN0PGludD4gZGF0YTsKICAgIGlmIChjb2RlICE9IG51bGwpIHsKICAgICAgZGF0YSA9IG5ldyBMaXN0PGludD4oKTsKICAgICAgZGF0YS5hZGQoKGNvZGUgPj4gOCkgJiAweEZGKTsKICAgICAgZGF0YS5hZGQoY29kZSAmIDB4RkYpOwogICAgICBpZiAocmVhc29uICE9IG51bGwpIHsKICAgICAgICBkYXRhLmFkZEFsbCh1dGY4LmVuY29kZShyZWFzb24pKTsKICAgICAgfQogICAgfQogICAgYWRkRnJhbWUoX1dlYlNvY2tldE9wY29kZS5DTE9TRSwgZGF0YSk7CiAgICBfZXZlbnRTaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZEZyYW1lKGludCBvcGNvZGUsIExpc3Q8aW50PiBkYXRhKSB7CiAgICBjcmVhdGVGcmFtZSgKICAgICAgICAgICAgb3Bjb2RlLAogICAgICAgICAgICBkYXRhLAogICAgICAgICAgICB3ZWJTb2NrZXQuX3NlcnZlclNpZGUsCiAgICAgICAgICAgIF9kZWZsYXRlSGVscGVyICE9IG51bGwgJiYKICAgICAgICAgICAgICAgIChvcGNvZGUgPT0gX1dlYlNvY2tldE9wY29kZS5URVhUIHx8CiAgICAgICAgICAgICAgICAgICAgb3Bjb2RlID09IF9XZWJTb2NrZXRPcGNvZGUuQklOQVJZKSkKICAgICAgICAuZm9yRWFjaCgoZSkgewogICAgICBfZXZlbnRTaW5rLmFkZChlKTsKICAgIH0pOwogIH0KCiAgc3RhdGljIEl0ZXJhYmxlPExpc3Q8aW50Pj4gY3JlYXRlRnJhbWUoCiAgICAgIGludCBvcGNvZGUsIExpc3Q8aW50PiBkYXRhLCBib29sIHNlcnZlclNpZGUsIGJvb2wgY29tcHJlc3NlZCkgewogICAgYm9vbCBtYXNrID0gIXNlcnZlclNpZGU7IC8vIE1hc2tpbmcgbm90IGltcGxlbWVudGVkIGZvciBzZXJ2ZXIuCiAgICBpbnQgZGF0YUxlbmd0aCA9IGRhdGEgPT0gbnVsbCA/IDAgOiBkYXRhLmxlbmd0aDsKICAgIC8vIERldGVybWluZSB0aGUgaGVhZGVyIHNpemUuCiAgICBpbnQgaGVhZGVyU2l6ZSA9IChtYXNrKSA/IDYgOiAyOwogICAgaWYgKGRhdGFMZW5ndGggPiA2NTUzNSkgewogICAgICBoZWFkZXJTaXplICs9IDg7CiAgICB9IGVsc2UgaWYgKGRhdGFMZW5ndGggPiAxMjUpIHsKICAgICAgaGVhZGVyU2l6ZSArPSAyOwogICAgfQogICAgVWludDhMaXN0IGhlYWRlciA9IG5ldyBVaW50OExpc3QoaGVhZGVyU2l6ZSk7CiAgICBpbnQgaW5kZXggPSAwOwoKICAgIC8vIFNldCBGSU4gYW5kIG9wY29kZS4KICAgIHZhciBob2MgPSBfV2ViU29ja2V0UHJvdG9jb2xUcmFuc2Zvcm1lci5GSU4gfAogICAgICAgIChjb21wcmVzc2VkID8gX1dlYlNvY2tldFByb3RvY29sVHJhbnNmb3JtZXIuUlNWMSA6IDApIHwKICAgICAgICAob3Bjb2RlICYgX1dlYlNvY2tldFByb3RvY29sVHJhbnNmb3JtZXIuT1BDT0RFKTsKCiAgICBoZWFkZXJbaW5kZXgrK10gPSBob2M7CiAgICAvLyBEZXRlcm1pbmUgc2l6ZSBhbmQgcG9zaXRpb24gb2YgbGVuZ3RoIGZpZWxkLgogICAgaW50IGxlbmd0aEJ5dGVzID0gMTsKICAgIGlmIChkYXRhTGVuZ3RoID4gNjU1MzUpIHsKICAgICAgaGVhZGVyW2luZGV4KytdID0gMTI3OwogICAgICBsZW5ndGhCeXRlcyA9IDg7CiAgICB9IGVsc2UgaWYgKGRhdGFMZW5ndGggPiAxMjUpIHsKICAgICAgaGVhZGVyW2luZGV4KytdID0gMTI2OwogICAgICBsZW5ndGhCeXRlcyA9IDI7CiAgICB9CiAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoIGluIG5ldHdvcmsgYnl0ZSBvcmRlciBpbnRvIHRoZSBoZWFkZXIuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aEJ5dGVzOyBpKyspIHsKICAgICAgaGVhZGVyW2luZGV4KytdID0gZGF0YUxlbmd0aCA+PiAoKChsZW5ndGhCeXRlcyAtIDEpIC0gaSkgKiA4KSAmIDB4RkY7CiAgICB9CiAgICBpZiAobWFzaykgewogICAgICBoZWFkZXJbMV0gfD0gMSA8PCA3OwogICAgICB2YXIgbWFza0J5dGVzID0gX0NyeXB0b1V0aWxzLmdldFJhbmRvbUJ5dGVzKDQpOwogICAgICBoZWFkZXIuc2V0UmFuZ2UoaW5kZXgsIGluZGV4ICsgNCwgbWFza0J5dGVzKTsKICAgICAgaW5kZXggKz0gNDsKICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewogICAgICAgIFVpbnQ4TGlzdCBsaXN0OwogICAgICAgIC8vIElmIHRoaXMgaXMgYSB0ZXh0IG1lc3NhZ2UganVzdCBkbyB0aGUgbWFza2luZyBpbnNpZGUgdGhlCiAgICAgICAgLy8gZW5jb2RlZCBkYXRhLgogICAgICAgIGlmIChvcGNvZGUgPT0gX1dlYlNvY2tldE9wY29kZS5URVhUICYmIGRhdGEgaXMgVWludDhMaXN0KSB7CiAgICAgICAgICBsaXN0ID0gZGF0YTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGRhdGEgaXMgVWludDhMaXN0KSB7CiAgICAgICAgICAgIGxpc3QgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KGRhdGEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGlzdCA9IG5ldyBVaW50OExpc3QoZGF0YS5sZW5ndGgpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBpZiAoZGF0YVtpXSA8IDAgfHwgMjU1IDwgZGF0YVtpXSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkxpc3QgZWxlbWVudCBpcyBub3QgYSBieXRlIHZhbHVlICIKICAgICAgICAgICAgICAgICAgICAiKHZhbHVlICR7ZGF0YVtpXX0gYXQgaW5kZXggJGkpIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxpc3RbaV0gPSBkYXRhW2ldOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGludCBCTE9DS19TSVpFID0gMTY7CiAgICAgICAgaW50IGJsb2NrQ291bnQgPSBsaXN0Lmxlbmd0aCB+LyBCTE9DS19TSVpFOwogICAgICAgIGlmIChibG9ja0NvdW50ID4gMCkgewogICAgICAgICAgLy8gQ3JlYXRlIG1hc2sgYmxvY2suCiAgICAgICAgICBpbnQgbWFzayA9IDA7CiAgICAgICAgICBmb3IgKGludCBpID0gMzsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgbWFzayA9IChtYXNrIDw8IDgpIHwgbWFza0J5dGVzW2ldOwogICAgICAgICAgfQogICAgICAgICAgSW50MzJ4NCBibG9ja01hc2sgPSBuZXcgSW50MzJ4NChtYXNrLCBtYXNrLCBtYXNrLCBtYXNrKTsKICAgICAgICAgIEludDMyeDRMaXN0IGJsb2NrQnVmZmVyID0KICAgICAgICAgICAgICBuZXcgSW50MzJ4NExpc3QudmlldyhsaXN0LmJ1ZmZlciwgMCwgYmxvY2tDb3VudCk7CiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrQnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGJsb2NrQnVmZmVyW2ldIF49IGJsb2NrTWFzazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gSGFuZGxlIGVuZC4KICAgICAgICBmb3IgKGludCBpID0gYmxvY2tDb3VudCAqIEJMT0NLX1NJWkU7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsaXN0W2ldIF49IG1hc2tCeXRlc1tpICYgM107CiAgICAgICAgfQogICAgICAgIGRhdGEgPSBsaXN0OwogICAgICB9CiAgICB9CiAgICBhc3NlcnQoaW5kZXggPT0gaGVhZGVyU2l6ZSk7CiAgICBpZiAoZGF0YSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBbaGVhZGVyXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBbaGVhZGVyLCBkYXRhXTsKICAgIH0KICB9Cn0KCmNsYXNzIF9XZWJTb2NrZXRDb25zdW1lciBpbXBsZW1lbnRzIFN0cmVhbUNvbnN1bWVyIHsKICBmaW5hbCBfV2ViU29ja2V0SW1wbCB3ZWJTb2NrZXQ7CiAgZmluYWwgU29ja2V0IHNvY2tldDsKICBTdHJlYW1Db250cm9sbGVyIF9jb250cm9sbGVyOwogIFN0cmVhbVN1YnNjcmlwdGlvbiBfc3Vic2NyaXB0aW9uOwogIGJvb2wgX2lzc3VlZFBhdXNlID0gZmFsc2U7CiAgYm9vbCBfY2xvc2VkID0gZmFsc2U7CiAgQ29tcGxldGVyIF9jbG9zZUNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8V2ViU29ja2V0PigpOwogIENvbXBsZXRlciBfY29tcGxldGVyOwoKICBfV2ViU29ja2V0Q29uc3VtZXIodGhpcy53ZWJTb2NrZXQsIHRoaXMuc29ja2V0KTsKCiAgdm9pZCBfb25MaXN0ZW4oKSB7CiAgICBpZiAoX3N1YnNjcmlwdGlvbiAhPSBudWxsKSB7CiAgICAgIF9zdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICB9CiAgfQoKICB2b2lkIF9vblBhdXNlKCkgewogICAgaWYgKF9zdWJzY3JpcHRpb24gIT0gbnVsbCkgewogICAgICBfc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICB9IGVsc2UgewogICAgICBfaXNzdWVkUGF1c2UgPSB0cnVlOwogICAgfQogIH0KCiAgdm9pZCBfb25SZXN1bWUoKSB7CiAgICBpZiAoX3N1YnNjcmlwdGlvbiAhPSBudWxsKSB7CiAgICAgIF9zdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICB9IGVsc2UgewogICAgICBfaXNzdWVkUGF1c2UgPSBmYWxzZTsKICAgIH0KICB9CgogIHZvaWQgX2NhbmNlbCgpIHsKICAgIGlmIChfc3Vic2NyaXB0aW9uICE9IG51bGwpIHsKICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IF9zdWJzY3JpcHRpb247CiAgICAgIF9zdWJzY3JpcHRpb24gPSBudWxsOwogICAgICBzdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICB9CiAgfQoKICBfZW5zdXJlQ29udHJvbGxlcigpIHsKICAgIGlmIChfY29udHJvbGxlciAhPSBudWxsKSByZXR1cm47CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyKAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25QYXVzZTogX29uUGF1c2UsCiAgICAgICAgb25SZXN1bWU6IF9vblJlc3VtZSwKICAgICAgICBvbkNhbmNlbDogX29uTGlzdGVuKTsKICAgIHZhciBzdHJlYW0gPSBfY29udHJvbGxlci5zdHJlYW0KICAgICAgICAudHJhbnNmb3JtKG5ldyBfV2ViU29ja2V0T3V0Z29pbmdUcmFuc2Zvcm1lcih3ZWJTb2NrZXQpKTsKICAgIHNvY2tldC5hZGRTdHJlYW0oc3RyZWFtKS50aGVuKChfKSB7CiAgICAgIF9kb25lKCk7CiAgICAgIF9jbG9zZUNvbXBsZXRlci5jb21wbGV0ZSh3ZWJTb2NrZXQpOwogICAgfSwgb25FcnJvcjogKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgICAgX2Nsb3NlZCA9IHRydWU7CiAgICAgIF9jYW5jZWwoKTsKICAgICAgaWYgKGVycm9yIGlzIEFyZ3VtZW50RXJyb3IpIHsKICAgICAgICBpZiAoIV9kb25lKGVycm9yLCBzdGFja1RyYWNlKSkgewogICAgICAgICAgX2Nsb3NlQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBfZG9uZSgpOwogICAgICAgIF9jbG9zZUNvbXBsZXRlci5jb21wbGV0ZSh3ZWJTb2NrZXQpOwogICAgICB9CiAgICB9KTsKICB9CgogIGJvb2wgX2RvbmUoW2Vycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBpZiAoX2NvbXBsZXRlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewogICAgICBfY29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgfSBlbHNlIHsKICAgICAgX2NvbXBsZXRlci5jb21wbGV0ZSh3ZWJTb2NrZXQpOwogICAgfQogICAgX2NvbXBsZXRlciA9IG51bGw7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEZ1dHVyZSBhZGRTdHJlYW0odmFyIHN0cmVhbSkgewogICAgaWYgKF9jbG9zZWQpIHsKICAgICAgc3RyZWFtLmxpc3RlbihudWxsKS5jYW5jZWwoKTsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUod2ViU29ja2V0KTsKICAgIH0KICAgIF9lbnN1cmVDb250cm9sbGVyKCk7CiAgICBfY29tcGxldGVyID0gbmV3IENvbXBsZXRlcigpOwogICAgX3N1YnNjcmlwdGlvbiA9IHN0cmVhbS5saXN0ZW4oKGRhdGEpIHsKICAgICAgX2NvbnRyb2xsZXIuYWRkKGRhdGEpOwogICAgfSwgb25Eb25lOiBfZG9uZSwgb25FcnJvcjogX2RvbmUsIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgaWYgKF9pc3N1ZWRQYXVzZSkgewogICAgICBfc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICAgIF9pc3N1ZWRQYXVzZSA9IGZhbHNlOwogICAgfQogICAgcmV0dXJuIF9jb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgRnV0dXJlIGNsb3NlKCkgewogICAgX2Vuc3VyZUNvbnRyb2xsZXIoKTsKICAgIEZ1dHVyZSBjbG9zZVNvY2tldCgpIHsKICAgICAgcmV0dXJuIHNvY2tldC5jbG9zZSgpLmNhdGNoRXJyb3IoKF8pIHt9KS50aGVuKChfKSA9PiB3ZWJTb2NrZXQpOwogICAgfQoKICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICByZXR1cm4gX2Nsb3NlQ29tcGxldGVyLmZ1dHVyZS50aGVuKChfKSA9PiBjbG9zZVNvY2tldCgpKTsKICB9CgogIHZvaWQgYWRkKGRhdGEpIHsKICAgIGlmIChfY2xvc2VkKSByZXR1cm47CiAgICBfZW5zdXJlQ29udHJvbGxlcigpOwogICAgLy8gU3RvcCBzZW5kaW5nIG1lc3NhZ2UgaWYgX2NvbnRyb2xsZXIgaGFzIGJlZW4gY2xvc2VkLgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzM3NDQxCiAgICBpZiAoX2NvbnRyb2xsZXIuaXNDbG9zZWQpIHJldHVybjsKICAgIF9jb250cm9sbGVyLmFkZChkYXRhKTsKICB9CgogIHZvaWQgY2xvc2VTb2NrZXQoKSB7CiAgICBfY2xvc2VkID0gdHJ1ZTsKICAgIF9jYW5jZWwoKTsKICAgIGNsb3NlKCk7CiAgfQp9CgpjbGFzcyBfV2ViU29ja2V0SW1wbCBleHRlbmRzIFN0cmVhbSB3aXRoIF9TZXJ2aWNlT2JqZWN0IGltcGxlbWVudHMgV2ViU29ja2V0IHsKICAvLyBVc2UgZGVmYXVsdCBNYXAgc28gd2Uga2VlcCBvcmRlci4KICBzdGF0aWMgTWFwPGludCwgX1dlYlNvY2tldEltcGw+IF93ZWJTb2NrZXRzID0gbmV3IE1hcDxpbnQsIF9XZWJTb2NrZXRJbXBsPigpOwogIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9XSU5ET1dfQklUUyA9IDE1OwogIHN0YXRpYyBjb25zdCBTdHJpbmcgUEVSX01FU1NBR0VfREVGTEFURSA9ICJwZXJtZXNzYWdlLWRlZmxhdGUiOwoKICBmaW5hbCBTdHJpbmcgcHJvdG9jb2w7CgogIFN0cmVhbUNvbnRyb2xsZXIgX2NvbnRyb2xsZXI7CiAgU3RyZWFtU3Vic2NyaXB0aW9uIF9zdWJzY3JpcHRpb247CiAgU3RyZWFtU2luayBfc2luazsKCiAgZmluYWwgX3NvY2tldDsKICBmaW5hbCBib29sIF9zZXJ2ZXJTaWRlOwogIGludCBfcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5jb25uZWN0aW5nOwogIGJvb2wgX3dyaXRlQ2xvc2VkID0gZmFsc2U7CiAgaW50IF9jbG9zZUNvZGU7CiAgU3RyaW5nIF9jbG9zZVJlYXNvbjsKICBEdXJhdGlvbiBfcGluZ0ludGVydmFsOwogIFRpbWVyIF9waW5nVGltZXI7CiAgX1dlYlNvY2tldENvbnN1bWVyIF9jb25zdW1lcjsKCiAgaW50IF9vdXRDbG9zZUNvZGU7CiAgU3RyaW5nIF9vdXRDbG9zZVJlYXNvbjsKICBUaW1lciBfY2xvc2VUaW1lcjsKICBfV2ViU29ja2V0UGVyTWVzc2FnZURlZmxhdGUgX2RlZmxhdGU7CgogIHN0YXRpYyBmaW5hbCBIdHRwQ2xpZW50IF9odHRwQ2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKCiAgc3RhdGljIEZ1dHVyZTxXZWJTb2NrZXQ+IGNvbm5lY3QoCiAgICAgIFN0cmluZyB1cmwsIEl0ZXJhYmxlPFN0cmluZz4gcHJvdG9jb2xzLCBNYXA8U3RyaW5nLCBkeW5hbWljPiBoZWFkZXJzLAogICAgICB7Q29tcHJlc3Npb25PcHRpb25zIGNvbXByZXNzaW9uOiBDb21wcmVzc2lvbk9wdGlvbnMuY29tcHJlc3Npb25EZWZhdWx0fSkgewogICAgVXJpIHVyaSA9IFVyaS5wYXJzZSh1cmwpOwogICAgaWYgKHVyaS5zY2hlbWUgIT0gIndzIiAmJiB1cmkuc2NoZW1lICE9ICJ3c3MiKSB7CiAgICAgIHRocm93IG5ldyBXZWJTb2NrZXRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIFVSTCBzY2hlbWUgJyR7dXJpLnNjaGVtZX0nIik7CiAgICB9CgogICAgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKICAgIC8vIEdlbmVyYXRlIDE2IHJhbmRvbSBieXRlcy4KICAgIFVpbnQ4TGlzdCBub25jZURhdGEgPSBuZXcgVWludDhMaXN0KDE2KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICBub25jZURhdGFbaV0gPSByYW5kb20ubmV4dEludCgyNTYpOwogICAgfQogICAgU3RyaW5nIG5vbmNlID0gX0NyeXB0b1V0aWxzLmJ5dGVzVG9CYXNlNjQobm9uY2VEYXRhKTsKCiAgICB1cmkgPSBuZXcgVXJpKAogICAgICAgIHNjaGVtZTogdXJpLnNjaGVtZSA9PSAid3NzIiA/ICJodHRwcyIgOiAiaHR0cCIsCiAgICAgICAgdXNlckluZm86IHVyaS51c2VySW5mbywKICAgICAgICBob3N0OiB1cmkuaG9zdCwKICAgICAgICBwb3J0OiB1cmkucG9ydCwKICAgICAgICBwYXRoOiB1cmkucGF0aCwKICAgICAgICBxdWVyeTogdXJpLnF1ZXJ5LAogICAgICAgIGZyYWdtZW50OiB1cmkuZnJhZ21lbnQpOwogICAgcmV0dXJuIF9odHRwQ2xpZW50Lm9wZW5VcmwoIkdFVCIsIHVyaSkudGhlbigocmVxdWVzdCkgewogICAgICBpZiAodXJpLnVzZXJJbmZvICE9IG51bGwgJiYgIXVyaS51c2VySW5mby5pc0VtcHR5KSB7CiAgICAgICAgLy8gSWYgdGhlIFVSTCBjb250YWlucyB1c2VyIGluZm9ybWF0aW9uIHVzZSB0aGF0IGZvciBiYXNpYwogICAgICAgIC8vIGF1dGhvcml6YXRpb24uCiAgICAgICAgU3RyaW5nIGF1dGggPSBfQ3J5cHRvVXRpbHMuYnl0ZXNUb0Jhc2U2NCh1dGY4LmVuY29kZSh1cmkudXNlckluZm8pKTsKICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEh0dHBIZWFkZXJzLmF1dGhvcml6YXRpb25IZWFkZXIsICJCYXNpYyAkYXV0aCIpOwogICAgICB9CiAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKICAgICAgICBoZWFkZXJzLmZvckVhY2goKGZpZWxkLCB2YWx1ZSkgPT4gcmVxdWVzdC5oZWFkZXJzLmFkZChmaWVsZCwgdmFsdWUpKTsKICAgICAgfQogICAgICAvLyBTZXR1cCB0aGUgaW5pdGlhbCBoYW5kc2hha2UuCiAgICAgIHJlcXVlc3QuaGVhZGVycwogICAgICAgIC4uc2V0KEh0dHBIZWFkZXJzLmNvbm5lY3Rpb25IZWFkZXIsICJVcGdyYWRlIikKICAgICAgICAuLnNldChIdHRwSGVhZGVycy51cGdyYWRlSGVhZGVyLCAid2Vic29ja2V0IikKICAgICAgICAuLnNldCgiU2VjLVdlYlNvY2tldC1LZXkiLCBub25jZSkKICAgICAgICAuLnNldCgiQ2FjaGUtQ29udHJvbCIsICJuby1jYWNoZSIpCiAgICAgICAgLi5zZXQoIlNlYy1XZWJTb2NrZXQtVmVyc2lvbiIsICIxMyIpOwogICAgICBpZiAocHJvdG9jb2xzICE9IG51bGwpIHsKICAgICAgICByZXF1ZXN0LmhlYWRlcnMuYWRkKCJTZWMtV2ViU29ja2V0LVByb3RvY29sIiwgcHJvdG9jb2xzLnRvTGlzdCgpKTsKICAgICAgfQoKICAgICAgaWYgKGNvbXByZXNzaW9uLmVuYWJsZWQpIHsKICAgICAgICByZXF1ZXN0LmhlYWRlcnMKICAgICAgICAgICAgLmFkZCgiU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zIiwgY29tcHJlc3Npb24uX2NyZWF0ZUhlYWRlcigpKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHJlcXVlc3QuY2xvc2UoKTsKICAgIH0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKICAgICAgICAvLyBGbHVzaCBkYXRhLgogICAgICAgIHJlc3BvbnNlLmRldGFjaFNvY2tldCgpLnRoZW4oKHNvY2tldCkgewogICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTsKICAgICAgICB9KTsKICAgICAgICB0aHJvdyBuZXcgV2ViU29ja2V0RXhjZXB0aW9uKG1lc3NhZ2UpOwogICAgICB9CgogICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPSBIdHRwU3RhdHVzLnN3aXRjaGluZ1Byb3RvY29scyB8fAogICAgICAgICAgcmVzcG9uc2UuaGVhZGVyc1tIdHRwSGVhZGVycy5jb25uZWN0aW9uSGVhZGVyXSA9PSBudWxsIHx8CiAgICAgICAgICAhcmVzcG9uc2UuaGVhZGVyc1tIdHRwSGVhZGVycy5jb25uZWN0aW9uSGVhZGVyXQogICAgICAgICAgICAgIC5hbnkoKHZhbHVlKSA9PiB2YWx1ZS50b0xvd2VyQ2FzZSgpID09ICJ1cGdyYWRlIikgfHwKICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMudmFsdWUoSHR0cEhlYWRlcnMudXBncmFkZUhlYWRlcikudG9Mb3dlckNhc2UoKSAhPQogICAgICAgICAgICAgICJ3ZWJzb2NrZXQiKSB7CiAgICAgICAgZXJyb3IoIkNvbm5lY3Rpb24gdG8gJyR1cmknIHdhcyBub3QgdXBncmFkZWQgdG8gd2Vic29ja2V0Iik7CiAgICAgIH0KICAgICAgU3RyaW5nIGFjY2VwdCA9IHJlc3BvbnNlLmhlYWRlcnMudmFsdWUoIlNlYy1XZWJTb2NrZXQtQWNjZXB0Iik7CiAgICAgIGlmIChhY2NlcHQgPT0gbnVsbCkgewogICAgICAgIGVycm9yKCJSZXNwb25zZSBkaWQgbm90IGNvbnRhaW4gYSAnU2VjLVdlYlNvY2tldC1BY2NlcHQnIGhlYWRlciIpOwogICAgICB9CiAgICAgIF9TSEExIHNoYTEgPSBuZXcgX1NIQTEoKTsKICAgICAgc2hhMS5hZGQoIiRub25jZSRfd2ViU29ja2V0R1VJRCIuY29kZVVuaXRzKTsKICAgICAgTGlzdDxpbnQ+IGV4cGVjdGVkQWNjZXB0ID0gc2hhMS5jbG9zZSgpOwogICAgICBMaXN0PGludD4gcmVjZWl2ZWRBY2NlcHQgPSBfQ3J5cHRvVXRpbHMuYmFzZTY0U3RyaW5nVG9CeXRlcyhhY2NlcHQpOwogICAgICBpZiAoZXhwZWN0ZWRBY2NlcHQubGVuZ3RoICE9IHJlY2VpdmVkQWNjZXB0Lmxlbmd0aCkgewogICAgICAgIGVycm9yKCJSZXNwb25zZSBoZWFkZXIgJ1NlYy1XZWJTb2NrZXQtQWNjZXB0JyBpcyB0aGUgd3JvbmcgbGVuZ3RoIik7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZEFjY2VwdC5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChleHBlY3RlZEFjY2VwdFtpXSAhPSByZWNlaXZlZEFjY2VwdFtpXSkgewogICAgICAgICAgZXJyb3IoIkJhZCByZXNwb25zZSAnU2VjLVdlYlNvY2tldC1BY2NlcHQnIGhlYWRlciIpOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgcHJvdG9jb2wgPSByZXNwb25zZS5oZWFkZXJzLnZhbHVlKCdTZWMtV2ViU29ja2V0LVByb3RvY29sJyk7CgogICAgICBfV2ViU29ja2V0UGVyTWVzc2FnZURlZmxhdGUgZGVmbGF0ZSA9CiAgICAgICAgICBuZWdvdGlhdGVDbGllbnRDb21wcmVzc2lvbihyZXNwb25zZSwgY29tcHJlc3Npb24pOwoKICAgICAgcmV0dXJuIHJlc3BvbnNlLmRldGFjaFNvY2tldCgpLnRoZW48V2ViU29ja2V0Pigoc29ja2V0KSA9PgogICAgICAgICAgbmV3IF9XZWJTb2NrZXRJbXBsLl9mcm9tU29ja2V0KAogICAgICAgICAgICAgIHNvY2tldCwgcHJvdG9jb2wsIGNvbXByZXNzaW9uLCBmYWxzZSwgZGVmbGF0ZSkpOwogICAgfSk7CiAgfQoKICBzdGF0aWMgX1dlYlNvY2tldFBlck1lc3NhZ2VEZWZsYXRlIG5lZ290aWF0ZUNsaWVudENvbXByZXNzaW9uKAogICAgICBIdHRwQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UsIENvbXByZXNzaW9uT3B0aW9ucyBjb21wcmVzc2lvbikgewogICAgU3RyaW5nIGV4dGVuc2lvbkhlYWRlciA9IHJlc3BvbnNlLmhlYWRlcnMudmFsdWUoJ1NlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucycpOwoKICAgIGlmIChleHRlbnNpb25IZWFkZXIgPT0gbnVsbCkgewogICAgICBleHRlbnNpb25IZWFkZXIgPSAiIjsKICAgIH0KCiAgICB2YXIgaHYgPSBIZWFkZXJWYWx1ZS5wYXJzZShleHRlbnNpb25IZWFkZXIsIHZhbHVlU2VwYXJhdG9yOiAnLCcpOwoKICAgIGlmIChjb21wcmVzc2lvbi5lbmFibGVkICYmIGh2LnZhbHVlID09IFBFUl9NRVNTQUdFX0RFRkxBVEUpIHsKICAgICAgdmFyIHNlcnZlck5vQ29udGV4dFRha2VvdmVyID0KICAgICAgICAgIGh2LnBhcmFtZXRlcnMuY29udGFpbnNLZXkoX3NlcnZlck5vQ29udGV4dFRha2VvdmVyKTsKICAgICAgdmFyIGNsaWVudE5vQ29udGV4dFRha2VvdmVyID0KICAgICAgICAgIGh2LnBhcmFtZXRlcnMuY29udGFpbnNLZXkoX2NsaWVudE5vQ29udGV4dFRha2VvdmVyKTsKCiAgICAgIGludCBnZXRXaW5kb3dCaXRzKFN0cmluZyB0eXBlKSB7CiAgICAgICAgdmFyIG8gPSBodi5wYXJhbWV0ZXJzW3R5cGVdOwogICAgICAgIGlmIChvID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBERUZBVUxUX1dJTkRPV19CSVRTOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGludC5wYXJzZShvLCBvbkVycm9yOiAocykgPT4gREVGQVVMVF9XSU5ET1dfQklUUyk7CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgX1dlYlNvY2tldFBlck1lc3NhZ2VEZWZsYXRlKAogICAgICAgICAgY2xpZW50TWF4V2luZG93Qml0czogZ2V0V2luZG93Qml0cyhfY2xpZW50TWF4V2luZG93Qml0cyksCiAgICAgICAgICBzZXJ2ZXJNYXhXaW5kb3dCaXRzOiBnZXRXaW5kb3dCaXRzKF9zZXJ2ZXJNYXhXaW5kb3dCaXRzKSwKICAgICAgICAgIGNsaWVudE5vQ29udGV4dFRha2VvdmVyOiBjbGllbnROb0NvbnRleHRUYWtlb3ZlciwKICAgICAgICAgIHNlcnZlck5vQ29udGV4dFRha2VvdmVyOiBzZXJ2ZXJOb0NvbnRleHRUYWtlb3Zlcik7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBfV2ViU29ja2V0SW1wbC5fZnJvbVNvY2tldCgKICAgICAgdGhpcy5fc29ja2V0LCB0aGlzLnByb3RvY29sLCBDb21wcmVzc2lvbk9wdGlvbnMgY29tcHJlc3Npb24sCiAgICAgIFt0aGlzLl9zZXJ2ZXJTaWRlID0gZmFsc2UsIF9XZWJTb2NrZXRQZXJNZXNzYWdlRGVmbGF0ZSBkZWZsYXRlXSkgewogICAgX2NvbnN1bWVyID0gbmV3IF9XZWJTb2NrZXRDb25zdW1lcih0aGlzLCBfc29ja2V0KTsKICAgIF9zaW5rID0gbmV3IF9TdHJlYW1TaW5rSW1wbChfY29uc3VtZXIpOwogICAgX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQub3BlbjsKICAgIF9kZWZsYXRlID0gZGVmbGF0ZTsKCiAgICB2YXIgdHJhbnNmb3JtZXIgPSBuZXcgX1dlYlNvY2tldFByb3RvY29sVHJhbnNmb3JtZXIoX3NlcnZlclNpZGUsIF9kZWZsYXRlKTsKICAgIF9zdWJzY3JpcHRpb24gPSB0cmFuc2Zvcm1lci5iaW5kKF9zb2NrZXQpLmxpc3RlbigoZGF0YSkgewogICAgICBpZiAoZGF0YSBpcyBfV2ViU29ja2V0UGluZykgewogICAgICAgIGlmICghX3dyaXRlQ2xvc2VkKSBfY29uc3VtZXIuYWRkKG5ldyBfV2ViU29ja2V0UG9uZyhkYXRhLnBheWxvYWQpKTsKICAgICAgfSBlbHNlIGlmIChkYXRhIGlzIF9XZWJTb2NrZXRQb25nKSB7CiAgICAgICAgLy8gU2ltcGx5IHNldCBwaW5nSW50ZXJ2YWwsIGFzIGl0J2xsIGNhbmNlbCBhbnkgdGltZXJzLgogICAgICAgIHBpbmdJbnRlcnZhbCA9IF9waW5nSW50ZXJ2YWw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2NvbnRyb2xsZXIuYWRkKGRhdGEpOwogICAgICB9CiAgICB9LCBvbkVycm9yOiAoZXJyb3IsIHN0YWNrVHJhY2UpIHsKICAgICAgaWYgKF9jbG9zZVRpbWVyICE9IG51bGwpIF9jbG9zZVRpbWVyLmNhbmNlbCgpOwogICAgICBpZiAoZXJyb3IgaXMgRm9ybWF0RXhjZXB0aW9uKSB7CiAgICAgICAgX2Nsb3NlKFdlYlNvY2tldFN0YXR1cy5JTlZBTElEX0ZSQU1FX1BBWUxPQURfREFUQSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2Nsb3NlKFdlYlNvY2tldFN0YXR1cy5QUk9UT0NPTF9FUlJPUik7CiAgICAgIH0KICAgICAgLy8gQW4gZXJyb3IgaGFwcGVuZWQsIHNldCB0aGUgY2xvc2UgY29kZSBzZXQgYWJvdmUuCiAgICAgIF9jbG9zZUNvZGUgPSBfb3V0Q2xvc2VDb2RlOwogICAgICBfY2xvc2VSZWFzb24gPSBfb3V0Q2xvc2VSZWFzb247CiAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICB9LCBvbkRvbmU6ICgpIHsKICAgICAgaWYgKF9jbG9zZVRpbWVyICE9IG51bGwpIF9jbG9zZVRpbWVyLmNhbmNlbCgpOwogICAgICBpZiAoX3JlYWR5U3RhdGUgPT0gV2ViU29ja2V0Lm9wZW4pIHsKICAgICAgICBfcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5jbG9zaW5nOwogICAgICAgIGlmICghX2lzUmVzZXJ2ZWRTdGF0dXNDb2RlKHRyYW5zZm9ybWVyLmNsb3NlQ29kZSkpIHsKICAgICAgICAgIF9jbG9zZSh0cmFuc2Zvcm1lci5jbG9zZUNvZGUsIHRyYW5zZm9ybWVyLmNsb3NlUmVhc29uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX2Nsb3NlKCk7CiAgICAgICAgfQogICAgICAgIF9yZWFkeVN0YXRlID0gV2ViU29ja2V0LmNsb3NlZDsKICAgICAgfQogICAgICAvLyBQcm90b2NvbCBjbG9zZSwgdXNlIGNsb3NlIGNvZGUgZnJvbSB0cmFuc2Zvcm1lci4KICAgICAgX2Nsb3NlQ29kZSA9IHRyYW5zZm9ybWVyLmNsb3NlQ29kZTsKICAgICAgX2Nsb3NlUmVhc29uID0gdHJhbnNmb3JtZXIuY2xvc2VSZWFzb247CiAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICB9LCBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIF9zdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgIF9jb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIoCiAgICAgICAgc3luYzogdHJ1ZSwKICAgICAgICBvbkxpc3RlbjogX3N1YnNjcmlwdGlvbi5yZXN1bWUsCiAgICAgICAgb25DYW5jZWw6ICgpIHsKICAgICAgICAgIF9zdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICAgICAgICBfc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICB9LAogICAgICAgIG9uUGF1c2U6IF9zdWJzY3JpcHRpb24ucGF1c2UsCiAgICAgICAgb25SZXN1bWU6IF9zdWJzY3JpcHRpb24ucmVzdW1lKTsKCiAgICBfd2ViU29ja2V0c1tfc2VydmljZUlkXSA9IHRoaXM7CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb24gbGlzdGVuKHZvaWQgb25EYXRhKG1lc3NhZ2UpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgcmV0dXJuIF9jb250cm9sbGVyLnN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIER1cmF0aW9uIGdldCBwaW5nSW50ZXJ2YWwgPT4gX3BpbmdJbnRlcnZhbDsKCiAgdm9pZCBzZXQgcGluZ0ludGVydmFsKER1cmF0aW9uIGludGVydmFsKSB7CiAgICBpZiAoX3dyaXRlQ2xvc2VkKSByZXR1cm47CiAgICBpZiAoX3BpbmdUaW1lciAhPSBudWxsKSBfcGluZ1RpbWVyLmNhbmNlbCgpOwogICAgX3BpbmdJbnRlcnZhbCA9IGludGVydmFsOwoKICAgIGlmIChfcGluZ0ludGVydmFsID09IG51bGwpIHJldHVybjsKCiAgICBfcGluZ1RpbWVyID0gbmV3IFRpbWVyKF9waW5nSW50ZXJ2YWwsICgpIHsKICAgICAgaWYgKF93cml0ZUNsb3NlZCkgcmV0dXJuOwogICAgICBfY29uc3VtZXIuYWRkKG5ldyBfV2ViU29ja2V0UGluZygpKTsKICAgICAgX3BpbmdUaW1lciA9IG5ldyBUaW1lcihfcGluZ0ludGVydmFsLCAoKSB7CiAgICAgICAgLy8gTm8gcG9uZyByZWNlaXZlZC4KICAgICAgICBfY2xvc2UoV2ViU29ja2V0U3RhdHVzLkdPSU5HX0FXQVkpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgaW50IGdldCByZWFkeVN0YXRlID0+IF9yZWFkeVN0YXRlOwoKICBTdHJpbmcgZ2V0IGV4dGVuc2lvbnMgPT4gbnVsbDsKICBpbnQgZ2V0IGNsb3NlQ29kZSA9PiBfY2xvc2VDb2RlOwogIFN0cmluZyBnZXQgY2xvc2VSZWFzb24gPT4gX2Nsb3NlUmVhc29uOwoKICB2b2lkIGFkZChkYXRhKSB7CiAgICBfc2luay5hZGQoZGF0YSk7CiAgfQoKICB2b2lkIGFkZFV0ZjhUZXh0KExpc3Q8aW50PiBieXRlcykgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoYnl0ZXMsICJieXRlcyIpOwogICAgX3NpbmsuYWRkKG5ldyBfRW5jb2RlZFN0cmluZyhieXRlcykpOwogIH0KCiAgdm9pZCBhZGRFcnJvcihlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIF9zaW5rLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIEZ1dHVyZSBhZGRTdHJlYW0oU3RyZWFtIHN0cmVhbSkgPT4gX3NpbmsuYWRkU3RyZWFtKHN0cmVhbSk7CiAgRnV0dXJlIGdldCBkb25lID0+IF9zaW5rLmRvbmU7CgogIEZ1dHVyZSBjbG9zZShbaW50IGNvZGUsIFN0cmluZyByZWFzb25dKSB7CiAgICBpZiAoX2lzUmVzZXJ2ZWRTdGF0dXNDb2RlKGNvZGUpKSB7CiAgICAgIHRocm93IG5ldyBXZWJTb2NrZXRFeGNlcHRpb24oIlJlc2VydmVkIHN0YXR1cyBjb2RlICRjb2RlIik7CiAgICB9CiAgICBpZiAoX291dENsb3NlQ29kZSA9PSBudWxsKSB7CiAgICAgIF9vdXRDbG9zZUNvZGUgPSBjb2RlOwogICAgICBfb3V0Q2xvc2VSZWFzb24gPSByZWFzb247CiAgICB9CiAgICBpZiAoIV9jb250cm9sbGVyLmlzQ2xvc2VkKSB7CiAgICAgIC8vIElmIGEgY2xvc2UgaGFzIG5vdCB5ZXQgYmVlbiByZWNlaXZlZCBmcm9tIHRoZSBvdGhlciBlbmQgdGhlbgogICAgICAvLyAgIDEpIG1ha2Ugc3VyZSB0byBsaXN0ZW4gb24gdGhlIHN0cmVhbSBzbyB0aGUgY2xvc2UgZnJhbWUgd2lsbCBiZQogICAgICAvLyAgICAgIHByb2Nlc3NlZCBpZiByZWNlaXZlZC4KICAgICAgLy8gICAyKSBzZXQgYSB0aW1lciB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24gaWYgYSBjbG9zZSBmcmFtZSBpcwogICAgICAvLyAgICAgIG5vdCByZWNlaXZlZC4KICAgICAgaWYgKCFfY29udHJvbGxlci5oYXNMaXN0ZW5lciAmJiBfc3Vic2NyaXB0aW9uICE9IG51bGwpIHsKICAgICAgICBfY29udHJvbGxlci5zdHJlYW0uZHJhaW4oKS5jYXRjaEVycm9yKChfKSA9PiB7fSk7CiAgICAgIH0KICAgICAgaWYgKF9jbG9zZVRpbWVyID09IG51bGwpIHsKICAgICAgICAvLyBXaGVuIGNsb3NpbmcgdGhlIHdlYi1zb2NrZXQsIHdlIG5vIGxvbmdlciBhY2NlcHQgZGF0YS4KICAgICAgICBfY2xvc2VUaW1lciA9IG5ldyBUaW1lcihjb25zdCBEdXJhdGlvbihzZWNvbmRzOiA1KSwgKCkgewogICAgICAgICAgLy8gUmV1c2UgY29kZSBhbmQgcmVhc29uIGZyb20gdGhlIGxvY2FsIGNsb3NlLgogICAgICAgICAgX2Nsb3NlQ29kZSA9IF9vdXRDbG9zZUNvZGU7CiAgICAgICAgICBfY2xvc2VSZWFzb24gPSBfb3V0Q2xvc2VSZWFzb247CiAgICAgICAgICBpZiAoX3N1YnNjcmlwdGlvbiAhPSBudWxsKSBfc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgICAgIF93ZWJTb2NrZXRzLnJlbW92ZShfc2VydmljZUlkKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9zaW5rLmNsb3NlKCk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIGdldCB1c2VyQWdlbnQgPT4gX2h0dHBDbGllbnQudXNlckFnZW50OwoKICBzdGF0aWMgc2V0IHVzZXJBZ2VudChTdHJpbmcgdXNlckFnZW50KSB7CiAgICBfaHR0cENsaWVudC51c2VyQWdlbnQgPSB1c2VyQWdlbnQ7CiAgfQoKICB2b2lkIF9jbG9zZShbaW50IGNvZGUsIFN0cmluZyByZWFzb25dKSB7CiAgICBpZiAoX3dyaXRlQ2xvc2VkKSByZXR1cm47CiAgICBpZiAoX291dENsb3NlQ29kZSA9PSBudWxsKSB7CiAgICAgIF9vdXRDbG9zZUNvZGUgPSBjb2RlOwogICAgICBfb3V0Q2xvc2VSZWFzb24gPSByZWFzb247CiAgICB9CiAgICBfd3JpdGVDbG9zZWQgPSB0cnVlOwogICAgX2NvbnN1bWVyLmNsb3NlU29ja2V0KCk7CiAgICBfd2ViU29ja2V0cy5yZW1vdmUoX3NlcnZpY2VJZCk7CiAgfQoKICBTdHJpbmcgZ2V0IF9zZXJ2aWNlVHlwZVBhdGggPT4gJ2lvL3dlYnNvY2tldHMnOwogIFN0cmluZyBnZXQgX3NlcnZpY2VUeXBlTmFtZSA9PiAnV2ViU29ja2V0JzsKCiAgTWFwPFN0cmluZywgZHluYW1pYz4gX3RvSlNPTihib29sIHJlZikgewogICAgdmFyIG5hbWUgPSAnJHtfc29ja2V0LmFkZHJlc3MuaG9zdH06JHtfc29ja2V0LnBvcnR9JzsKICAgIHZhciByID0gPFN0cmluZywgZHluYW1pYz57CiAgICAgICdpZCc6IF9zZXJ2aWNlUGF0aCwKICAgICAgJ3R5cGUnOiBfc2VydmljZVR5cGUocmVmKSwKICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAndXNlcl9uYW1lJzogbmFtZSwKICAgIH07CiAgICBpZiAocmVmKSB7CiAgICAgIHJldHVybiByOwogICAgfQogICAgdHJ5IHsKICAgICAgclsnc29ja2V0J10gPSBfc29ja2V0Ll90b0pTT04odHJ1ZSk7CiAgICB9IGNhdGNoIChfKSB7CiAgICAgIHJbJ3NvY2tldCddID0gewogICAgICAgICdpZCc6IF9zZXJ2aWNlUGF0aCwKICAgICAgICAndHlwZSc6ICdAU29ja2V0JywKICAgICAgICAnbmFtZSc6ICdVc2VyU29ja2V0JywKICAgICAgICAndXNlcl9uYW1lJzogJ1VzZXJTb2NrZXQnLAogICAgICB9OwogICAgfQogICAgcmV0dXJuIHI7CiAgfQoKICBzdGF0aWMgYm9vbCBfaXNSZXNlcnZlZFN0YXR1c0NvZGUoaW50IGNvZGUpIHsKICAgIHJldHVybiBjb2RlICE9IG51bGwgJiYKICAgICAgICAoY29kZSA8IFdlYlNvY2tldFN0YXR1cy5OT1JNQUxfQ0xPU1VSRSB8fAogICAgICAgICAgICBjb2RlID09IFdlYlNvY2tldFN0YXR1cy5SRVNFUlZFRF8xMDA0IHx8CiAgICAgICAgICAgIGNvZGUgPT0gV2ViU29ja2V0U3RhdHVzLk5PX1NUQVRVU19SRUNFSVZFRCB8fAogICAgICAgICAgICBjb2RlID09IFdlYlNvY2tldFN0YXR1cy5BQk5PUk1BTF9DTE9TVVJFIHx8CiAgICAgICAgICAgIChjb2RlID4gV2ViU29ja2V0U3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUiAmJgogICAgICAgICAgICAgICAgY29kZSA8IFdlYlNvY2tldFN0YXR1cy5SRVNFUlZFRF8xMDE1KSB8fAogICAgICAgICAgICAoY29kZSA+PSBXZWJTb2NrZXRTdGF0dXMuUkVTRVJWRURfMTAxNSAmJiBjb2RlIDwgMzAwMCkpOwogIH0KfQqFJwBOTjwBFAFGRkY+PgEd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bnN0IFN0cmluZyBfZW5jb2RlVGFibGUgPQogICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CgogIHN0YXRpYyBjb25zdCBTdHJpbmcgX2VuY29kZVRhYmxlVXJsU2FmZSA9CiAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIjsKCiAgLy8gTG9va3VwIHRhYmxlIHVzZWQgZm9yIGZpbmRpbmcgQmFzZSA2NCBhbHBoYWJldCBpbmRleCBvZiBhIGdpdmVuIGJ5dGUuCiAgLy8gLTIgOiBPdXRzaWRlIEJhc2UgNjQgYWxwaGFiZXQuCiAgLy8gLTEgOiAnXHInIG9yICdcbicKICAvLyAgMCA6ID0gKFBhZGRpbmcgY2hhcmFjdGVyKS4KICAvLyA+MCA6IEJhc2UgNjQgYWxwaGFiZXQgaW5kZXggb2YgZ2l2ZW4gYnl0ZS4KICBzdGF0aWMgY29uc3QgTGlzdDxpbnQ+IF9kZWNvZGVUYWJsZSA9IGNvbnN0IFsKICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMSwgLTIsIC0yLCAtMSwgLTIsIC0yLCAvLwogICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC8vCiAgICAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIDYyLCAtMiwgNjIsIC0yLCA2MywgLy8KICAgIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCAtMiwgLTIsIC0yLCAwMCwgLTIsIC0yLCAvLwogICAgLTIsIDAwLCAwMSwgMDIsIDAzLCAwNCwgMDUsIDA2LCAwNywgMDgsIDA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIC8vCiAgICAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIC0yLCAtMiwgLTIsIC0yLCA2MywgLy8KICAgIC0yLCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCAvLwogICAgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC8vCiAgICAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLy8KICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAvLwogICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC8vCiAgICAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLy8KICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAvLwogICAgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC8vCiAgICAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLy8KICAgIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yCiAgXTsKCiAgc3RhdGljIFJhbmRvbSBfcm5nID0gbmV3IFJhbmRvbS5zZWN1cmUoKTsKCiAgc3RhdGljIFVpbnQ4TGlzdCBnZXRSYW5kb21CeXRlcyhpbnQgY291bnQpIHsKICAgIGZpbmFsIFVpbnQ4TGlzdCByZXN1bHQgPSBuZXcgVWludDhMaXN0KGNvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICByZXN1bHRbaV0gPSBfcm5nLm5leHRJbnQoMHhmZik7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIFN0cmluZyBieXRlc1RvSGV4KExpc3Q8aW50PiBieXRlcykgewogICAgdmFyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAodmFyIHBhcnQgaW4gYnl0ZXMpIHsKICAgICAgcmVzdWx0LndyaXRlKCcke3BhcnQgPCAxNiA/ICcwJyA6ICcnfSR7cGFydC50b1JhZGl4U3RyaW5nKDE2KX0nKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICB9CgogIHN0YXRpYyBTdHJpbmcgYnl0ZXNUb0Jhc2U2NChMaXN0PGludD4gYnl0ZXMsCiAgICAgIFtib29sIHVybFNhZmUgPSBmYWxzZSwgYm9vbCBhZGRMaW5lU2VwYXJhdG9yID0gZmFsc2VdKSB7CiAgICBpbnQgbGVuID0gYnl0ZXMubGVuZ3RoOwogICAgaWYgKGxlbiA9PSAwKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGZpbmFsIFN0cmluZyBsb29rdXAgPSB1cmxTYWZlID8gX2VuY29kZVRhYmxlVXJsU2FmZSA6IF9lbmNvZGVUYWJsZTsKICAgIC8vIFNpemUgb2YgMjQgYml0IGNodW5rcy4KICAgIGZpbmFsIGludCByZW1haW5kZXJMZW5ndGggPSBsZW4ucmVtYWluZGVyKDMpOwogICAgZmluYWwgaW50IGNodW5rTGVuZ3RoID0gbGVuIC0gcmVtYWluZGVyTGVuZ3RoOwogICAgLy8gU2l6ZSBvZiBiYXNlIG91dHB1dC4KICAgIGludCBvdXRwdXRMZW4gPSAoKGxlbiB+LyAzKSAqIDQpICsgKChyZW1haW5kZXJMZW5ndGggPiAwKSA/IDQgOiAwKTsKICAgIC8vIEFkZCBleHRyYSBmb3IgbGluZSBzZXBhcmF0b3JzLgogICAgaWYgKGFkZExpbmVTZXBhcmF0b3IpIHsKICAgICAgb3V0cHV0TGVuICs9ICgob3V0cHV0TGVuIC0gMSkgfi8gTElORV9MRU5HVEgpIDw8IDE7CiAgICB9CiAgICBMaXN0PGludD4gb3V0ID0gbmV3IExpc3Q8aW50PihvdXRwdXRMZW4pOwoKICAgIC8vIEVuY29kZSAyNCBiaXQgY2h1bmtzLgogICAgaW50IGogPSAwLCBpID0gMCwgYyA9IDA7CiAgICB3aGlsZSAoaSA8IGNodW5rTGVuZ3RoKSB7CiAgICAgIGludCB4ID0gKChieXRlc1tpKytdIDw8IDE2KSAmIDB4RkZGRkZGKSB8CiAgICAgICAgICAoKGJ5dGVzW2krK10gPDwgOCkgJiAweEZGRkZGRikgfAogICAgICAgICAgYnl0ZXNbaSsrXTsKICAgICAgb3V0W2orK10gPSBsb29rdXAuY29kZVVuaXRBdCh4ID4+IDE4KTsKICAgICAgb3V0W2orK10gPSBsb29rdXAuY29kZVVuaXRBdCgoeCA+PiAxMikgJiAweDNGKTsKICAgICAgb3V0W2orK10gPSBsb29rdXAuY29kZVVuaXRBdCgoeCA+PiA2KSAmIDB4M0YpOwogICAgICBvdXRbaisrXSA9IGxvb2t1cC5jb2RlVW5pdEF0KHggJiAweDNmKTsKICAgICAgLy8gQWRkIG9wdGlvbmFsIGxpbmUgc2VwYXJhdG9yIGZvciBlYWNoIDc2IGNoYXIgb3V0cHV0LgogICAgICBpZiAoYWRkTGluZVNlcGFyYXRvciAmJiArK2MgPT0gMTkgJiYgaiA8IG91dHB1dExlbiAtIDIpIHsKICAgICAgICBvdXRbaisrXSA9IENSOwogICAgICAgIG91dFtqKytdID0gTEY7CiAgICAgICAgYyA9IDA7CiAgICAgIH0KICAgIH0KCiAgICAvLyBJZiBpbnB1dCBsZW5ndGggaWYgbm90IGEgbXVsdGlwbGUgb2YgMywgZW5jb2RlIHJlbWFpbmluZyBieXRlcyBhbmQKICAgIC8vIGFkZCBwYWRkaW5nLgogICAgaWYgKHJlbWFpbmRlckxlbmd0aCA9PSAxKSB7CiAgICAgIGludCB4ID0gYnl0ZXNbaV07CiAgICAgIG91dFtqKytdID0gbG9va3VwLmNvZGVVbml0QXQoeCA+PiAyKTsKICAgICAgb3V0W2orK10gPSBsb29rdXAuY29kZVVuaXRBdCgoeCA8PCA0KSAmIDB4M0YpOwogICAgICBvdXRbaisrXSA9IFBBRDsKICAgICAgb3V0W2orK10gPSBQQUQ7CiAgICB9IGVsc2UgaWYgKHJlbWFpbmRlckxlbmd0aCA9PSAyKSB7CiAgICAgIGludCB4ID0gYnl0ZXNbaV07CiAgICAgIGludCB5ID0gYnl0ZXNbaSArIDFdOwogICAgICBvdXRbaisrXSA9IGxvb2t1cC5jb2RlVW5pdEF0KHggPj4gMik7CiAgICAgIG91dFtqKytdID0gbG9va3VwLmNvZGVVbml0QXQoKCh4IDw8IDQpIHwgKHkgPj4gNCkpICYgMHgzRik7CiAgICAgIG91dFtqKytdID0gbG9va3VwLmNvZGVVbml0QXQoKHkgPDwgMikgJiAweDNGKTsKICAgICAgb3V0W2orK10gPSBQQUQ7CiAgICB9CgogICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhvdXQpOwogIH0KCiAgc3RhdGljIExpc3Q8aW50PiBiYXNlNjRTdHJpbmdUb0J5dGVzKFN0cmluZyBpbnB1dCwKICAgICAgW2Jvb2wgaWdub3JlSW52YWxpZENoYXJhY3RlcnMgPSB0cnVlXSkgewogICAgaW50IGxlbiA9IGlucHV0Lmxlbmd0aDsKICAgIGlmIChsZW4gPT0gMCkgewogICAgICByZXR1cm4gbmV3IExpc3Q8aW50PigwKTsKICAgIH0KCiAgICAvLyBDb3VudCAnXHInLCAnXG4nIGFuZCBpbGxlZ2FsIGNoYXJhY3RlcnMsIEZvciBpbGxlZ2FsIGNoYXJhY3RlcnMsCiAgICAvLyBpZiBbaWdub3JlSW52YWxpZENoYXJhY3RlcnNdIGlzIGZhbHNlLCB0aHJvdyBhbiBleGNlcHRpb24uCiAgICBpbnQgZXh0cmFzTGVuID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgaW50IGMgPSBfZGVjb2RlVGFibGVbaW5wdXQuY29kZVVuaXRBdChpKV07CiAgICAgIGlmIChjIDwgMCkgewogICAgICAgIGV4dHJhc0xlbisrOwogICAgICAgIGlmIChjID09IC0yICYmICFpZ25vcmVJbnZhbGlkQ2hhcmFjdGVycykgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbignSW52YWxpZCBjaGFyYWN0ZXI6ICR7aW5wdXRbaV19Jyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKChsZW4gLSBleHRyYXNMZW4pICUgNCAhPSAwKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oJycnU2l6ZSBvZiBCYXNlIDY0IGNoYXJhY3RlcnMgaW4gSW5wdXQKICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiBJbnB1dDogJGlucHV0JycnKTsKICAgIH0KCiAgICAvLyBDb3VudCBwYWQgY2hhcmFjdGVycywgaWdub3JlIGlsbGVnYWwgY2hhcmFjdGVycyBhdCB0aGUgZW5kLgogICAgaW50IHBhZExlbmd0aCA9IDA7CiAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgaW50IGN1cnJlbnRDb2RlVW5pdCA9IGlucHV0LmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChfZGVjb2RlVGFibGVbY3VycmVudENvZGVVbml0XSA+IDApIGJyZWFrOwogICAgICBpZiAoY3VycmVudENvZGVVbml0ID09IFBBRCkgcGFkTGVuZ3RoKys7CiAgICB9CiAgICBpbnQgb3V0cHV0TGVuID0gKCgobGVuIC0gZXh0cmFzTGVuKSAqIDYpID4+IDMpIC0gcGFkTGVuZ3RoOwogICAgTGlzdDxpbnQ+IG91dCA9IG5ldyBMaXN0PGludD4ob3V0cHV0TGVuKTsKCiAgICBmb3IgKGludCBpID0gMCwgbyA9IDA7IG8gPCBvdXRwdXRMZW47KSB7CiAgICAgIC8vIEFjY3VtdWxhdGUgNCB2YWxpZCA2IGJpdCBCYXNlIDY0IGNoYXJhY3RlcnMgaW50byBhbiBpbnQuCiAgICAgIGludCB4ID0gMDsKICAgICAgZm9yIChpbnQgaiA9IDQ7IGogPiAwOykgewogICAgICAgIGludCBjID0gX2RlY29kZVRhYmxlW2lucHV0LmNvZGVVbml0QXQoaSsrKV07CiAgICAgICAgaWYgKGMgPj0gMCkgewogICAgICAgICAgeCA9ICgoeCA8PCA2KSAmIDB4RkZGRkZGKSB8IGM7CiAgICAgICAgICBqLS07CiAgICAgICAgfQogICAgICB9CiAgICAgIG91dFtvKytdID0geCA+PiAxNjsKICAgICAgaWYgKG8gPCBvdXRwdXRMZW4pIHsKICAgICAgICBvdXRbbysrXSA9ICh4ID4+IDgpICYgMHhGRjsKICAgICAgICBpZiAobyA8IG91dHB1dExlbikgb3V0W28rK10gPSB4ICYgMHhGRjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG91dDsKICB9Cn0KCi8vIENvbnN0YW50cy4KY29uc3QgX01BU0tfOCA9IDB4ZmY7CmNvbnN0IF9NQVNLXzMyID0gMHhmZmZmZmZmZjsKY29uc3QgX0JJVFNfUEVSX0JZVEUgPSA4Owpjb25zdCBfQllURVNfUEVSX1dPUkQgPSA0OwoKLy8gQmFzZSBjbGFzcyBlbmNhcHN1bGF0aW5nIGNvbW1vbiBiZWhhdmlvciBmb3IgY3J5cHRvZ3JhcGhpYyBoYXNoCi8vIGZ1bmN0aW9ucy4KYWJzdHJhY3QgY2xhc3MgX0hhc2hCYXNlIHsKICAvLyBIYXNoZXIgc3RhdGUuCiAgZmluYWwgaW50IF9jaHVua1NpemVJbldvcmRzOwogIGZpbmFsIGludCBfZGlnZXN0U2l6ZUluV29yZHM7CiAgZmluYWwgYm9vbCBfYmlnRW5kaWFuV29yZHM7CiAgaW50IF9sZW5ndGhJbkJ5dGVzID0gMDsKICBMaXN0PGludD4gX3BlbmRpbmdEYXRhOwogIExpc3Q8aW50PiBfY3VycmVudENodW5rOwogIExpc3Q8aW50PiBfaDsKICBib29sIF9kaWdlc3RDYWxsZWQgPSBmYWxzZTsKCiAgX0hhc2hCYXNlKAogICAgICB0aGlzLl9jaHVua1NpemVJbldvcmRzLCB0aGlzLl9kaWdlc3RTaXplSW5Xb3JkcywgdGhpcy5fYmlnRW5kaWFuV29yZHMpCiAgICAgIDogX3BlbmRpbmdEYXRhID0gW10gewogICAgX2N1cnJlbnRDaHVuayA9IG5ldyBMaXN0KF9jaHVua1NpemVJbldvcmRzKTsKICAgIF9oID0gbmV3IExpc3QoX2RpZ2VzdFNpemVJbldvcmRzKTsKICB9CgogIC8vIFVwZGF0ZSB0aGUgaGFzaGVyIHdpdGggbW9yZSBkYXRhLgogIGFkZChMaXN0PGludD4gZGF0YSkgewogICAgaWYgKF9kaWdlc3RDYWxsZWQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoCiAgICAgICAgICAnSGFzaCB1cGRhdGUgbWV0aG9kIGNhbGxlZCBhZnRlciBkaWdlc3Qgd2FzIHJldHJpZXZlZCcpOwogICAgfQogICAgX2xlbmd0aEluQnl0ZXMgKz0gZGF0YS5sZW5ndGg7CiAgICBfcGVuZGluZ0RhdGEuYWRkQWxsKGRhdGEpOwogICAgX2l0ZXJhdGUoKTsKICB9CgogIC8vIEZpbmlzaCB0aGUgaGFzaCBjb21wdXRhdGlvbiBhbmQgcmV0dXJuIHRoZSBkaWdlc3Qgc3RyaW5nLgogIExpc3Q8aW50PiBjbG9zZSgpIHsKICAgIGlmIChfZGlnZXN0Q2FsbGVkKSB7CiAgICAgIHJldHVybiBfcmVzdWx0QXNCeXRlcygpOwogICAgfQogICAgX2RpZ2VzdENhbGxlZCA9IHRydWU7CiAgICBfZmluYWxpemVEYXRhKCk7CiAgICBfaXRlcmF0ZSgpOwogICAgYXNzZXJ0KF9wZW5kaW5nRGF0YS5sZW5ndGggPT0gMCk7CiAgICByZXR1cm4gX3Jlc3VsdEFzQnl0ZXMoKTsKICB9CgogIC8vIFJldHVybnMgdGhlIGJsb2NrIHNpemUgb2YgdGhlIGhhc2ggaW4gYnl0ZXMuCiAgaW50IGdldCBibG9ja1NpemUgewogICAgcmV0dXJuIF9jaHVua1NpemVJbldvcmRzICogX0JZVEVTX1BFUl9XT1JEOwogIH0KCiAgLy8gQ3JlYXRlIGEgZnJlc2ggaW5zdGFuY2Ugb2YgdGhpcyBIYXNoLgogIG5ld0luc3RhbmNlKCk7CgogIC8vIE9uZSByb3VuZCBvZiB0aGUgaGFzaCBjb21wdXRhdGlvbi4KICBfdXBkYXRlSGFzaChMaXN0PGludD4gbSk7CgogIC8vIEhlbHBlciBtZXRob2RzLgogIF9hZGQzMih4LCB5KSA9PiAoeCArIHkpICYgX01BU0tfMzI7CiAgX3JvdW5kVXAodmFsLCBuKSA9PiAodmFsICsgbiAtIDEpICYgLW47CgogIC8vIFJvdGF0ZSBsZWZ0IGxpbWl0aW5nIHRvIHVuc2lnbmVkIDMyLWJpdCB2YWx1ZXMuCiAgaW50IF9yb3RsMzIoaW50IHZhbCwgaW50IHNoaWZ0KSB7CiAgICB2YXIgbW9kX3NoaWZ0ID0gc2hpZnQgJiAzMTsKICAgIHJldHVybiAoKHZhbCA8PCBtb2Rfc2hpZnQpICYgX01BU0tfMzIpIHwKICAgICAgICAoKHZhbCAmIF9NQVNLXzMyKSA+PiAoMzIgLSBtb2Rfc2hpZnQpKTsKICB9CgogIC8vIENvbXB1dGUgdGhlIGZpbmFsIHJlc3VsdCBhcyBhIGxpc3Qgb2YgYnl0ZXMgZnJvbSB0aGUgaGFzaCB3b3Jkcy4KICBMaXN0PGludD4gX3Jlc3VsdEFzQnl0ZXMoKSB7CiAgICB2YXIgcmVzdWx0ID0gPGludD5bXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX2gubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0LmFkZEFsbChfd29yZFRvQnl0ZXMoX2hbaV0pKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBDb252ZXJ0cyBhIGxpc3Qgb2YgYnl0ZXMgdG8gYSBjaHVuayBvZiAzMi1iaXQgd29yZHMuCiAgX2J5dGVzVG9DaHVuayhMaXN0PGludD4gZGF0YSwgaW50IGRhdGFJbmRleCkgewogICAgYXNzZXJ0KChkYXRhLmxlbmd0aCAtIGRhdGFJbmRleCkgPj0gKF9jaHVua1NpemVJbldvcmRzICogX0JZVEVTX1BFUl9XT1JEKSk7CgogICAgZm9yICh2YXIgd29yZEluZGV4ID0gMDsgd29yZEluZGV4IDwgX2NodW5rU2l6ZUluV29yZHM7IHdvcmRJbmRleCsrKSB7CiAgICAgIHZhciB3MyA9IF9iaWdFbmRpYW5Xb3JkcyA/IGRhdGFbZGF0YUluZGV4XSA6IGRhdGFbZGF0YUluZGV4ICsgM107CiAgICAgIHZhciB3MiA9IF9iaWdFbmRpYW5Xb3JkcyA/IGRhdGFbZGF0YUluZGV4ICsgMV0gOiBkYXRhW2RhdGFJbmRleCArIDJdOwogICAgICB2YXIgdzEgPSBfYmlnRW5kaWFuV29yZHMgPyBkYXRhW2RhdGFJbmRleCArIDJdIDogZGF0YVtkYXRhSW5kZXggKyAxXTsKICAgICAgdmFyIHcwID0gX2JpZ0VuZGlhbldvcmRzID8gZGF0YVtkYXRhSW5kZXggKyAzXSA6IGRhdGFbZGF0YUluZGV4XTsKICAgICAgZGF0YUluZGV4ICs9IDQ7CiAgICAgIHZhciB3b3JkID0gKHczICYgMHhmZikgPDwgMjQ7CiAgICAgIHdvcmQgfD0gKHcyICYgX01BU0tfOCkgPDwgMTY7CiAgICAgIHdvcmQgfD0gKHcxICYgX01BU0tfOCkgPDwgODsKICAgICAgd29yZCB8PSAodzAgJiBfTUFTS184KTsKICAgICAgX2N1cnJlbnRDaHVua1t3b3JkSW5kZXhdID0gd29yZDsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYSAzMi1iaXQgd29yZCB0byBmb3VyIGJ5dGVzLgogIExpc3Q8aW50PiBfd29yZFRvQnl0ZXMoaW50IHdvcmQpIHsKICAgIExpc3Q8aW50PiBieXRlcyA9IG5ldyBMaXN0KF9CWVRFU19QRVJfV09SRCk7CiAgICBieXRlc1swXSA9ICh3b3JkID4+IChfYmlnRW5kaWFuV29yZHMgPyAyNCA6IDApKSAmIF9NQVNLXzg7CiAgICBieXRlc1sxXSA9ICh3b3JkID4+IChfYmlnRW5kaWFuV29yZHMgPyAxNiA6IDgpKSAmIF9NQVNLXzg7CiAgICBieXRlc1syXSA9ICh3b3JkID4+IChfYmlnRW5kaWFuV29yZHMgPyA4IDogMTYpKSAmIF9NQVNLXzg7CiAgICBieXRlc1szXSA9ICh3b3JkID4+IChfYmlnRW5kaWFuV29yZHMgPyAwIDogMjQpKSAmIF9NQVNLXzg7CiAgICByZXR1cm4gYnl0ZXM7CiAgfQoKICAvLyBJdGVyYXRlIHRocm91Z2ggZGF0YSB1cGRhdGluZyB0aGUgaGFzaCBjb21wdXRhdGlvbiBmb3IgZWFjaAogIC8vIGNodW5rLgogIF9pdGVyYXRlKCkgewogICAgdmFyIGxlbiA9IF9wZW5kaW5nRGF0YS5sZW5ndGg7CiAgICB2YXIgY2h1bmtTaXplSW5CeXRlcyA9IF9jaHVua1NpemVJbldvcmRzICogX0JZVEVTX1BFUl9XT1JEOwogICAgaWYgKGxlbiA+PSBjaHVua1NpemVJbkJ5dGVzKSB7CiAgICAgIHZhciBpbmRleCA9IDA7CiAgICAgIGZvciAoOyAobGVuIC0gaW5kZXgpID49IGNodW5rU2l6ZUluQnl0ZXM7IGluZGV4ICs9IGNodW5rU2l6ZUluQnl0ZXMpIHsKICAgICAgICBfYnl0ZXNUb0NodW5rKF9wZW5kaW5nRGF0YSwgaW5kZXgpOwogICAgICAgIF91cGRhdGVIYXNoKF9jdXJyZW50Q2h1bmspOwogICAgICB9CiAgICAgIF9wZW5kaW5nRGF0YSA9IF9wZW5kaW5nRGF0YS5zdWJsaXN0KGluZGV4LCBsZW4pOwogICAgfQogIH0KCiAgLy8gRmluYWxpemUgdGhlIGRhdGEuIEFkZCBhIDEgYml0IHRvIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UuIEV4cGFuZCB3aXRoCiAgLy8gMCBiaXRzIGFuZCBhZGQgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZS4KICBfZmluYWxpemVEYXRhKCkgewogICAgX3BlbmRpbmdEYXRhLmFkZCgweDgwKTsKICAgIHZhciBjb250ZW50c0xlbmd0aCA9IF9sZW5ndGhJbkJ5dGVzICsgOTsKICAgIHZhciBjaHVua1NpemVJbkJ5dGVzID0gX2NodW5rU2l6ZUluV29yZHMgKiBfQllURVNfUEVSX1dPUkQ7CiAgICB2YXIgZmluYWxpemVkTGVuZ3RoID0gX3JvdW5kVXAoY29udGVudHNMZW5ndGgsIGNodW5rU2l6ZUluQnl0ZXMpOwogICAgdmFyIHplcm9QYWRkaW5nID0gZmluYWxpemVkTGVuZ3RoIC0gY29udGVudHNMZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHplcm9QYWRkaW5nOyBpKyspIHsKICAgICAgX3BlbmRpbmdEYXRhLmFkZCgwKTsKICAgIH0KICAgIHZhciBsZW5ndGhJbkJpdHMgPSBfbGVuZ3RoSW5CeXRlcyAqIF9CSVRTX1BFUl9CWVRFOwogICAgYXNzZXJ0KGxlbmd0aEluQml0cyA8IHBvdygyLCAzMikpOwogICAgaWYgKF9iaWdFbmRpYW5Xb3JkcykgewogICAgICBfcGVuZGluZ0RhdGEuYWRkQWxsKF93b3JkVG9CeXRlcygwKSk7CiAgICAgIF9wZW5kaW5nRGF0YS5hZGRBbGwoX3dvcmRUb0J5dGVzKGxlbmd0aEluQml0cyAmIF9NQVNLXzMyKSk7CiAgICB9IGVsc2UgewogICAgICBfcGVuZGluZ0RhdGEuYWRkQWxsKF93b3JkVG9CeXRlcyhsZW5ndGhJbkJpdHMgJiBfTUFTS18zMikpOwogICAgICBfcGVuZGluZ0RhdGEuYWRkQWxsKF93b3JkVG9CeXRlcygwKSk7CiAgICB9CiAgfQp9CgovLyBUaGUgTUQ1IGhhc2hlciBpcyB1c2VkIHRvIGNvbXB1dGUgYW4gTUQ1IG1lc3NhZ2UgZGlnZXN0LgpjbGFzcyBfTUQ1IGV4dGVuZHMgX0hhc2hCYXNlIHsKICBfTUQ1KCkgOiBzdXBlcigxNiwgNCwgZmFsc2UpIHsKICAgIF9oWzBdID0gMHg2NzQ1MjMwMTsKICAgIF9oWzFdID0gMHhlZmNkYWI4OTsKICAgIF9oWzJdID0gMHg5OGJhZGNmZTsKICAgIF9oWzNdID0gMHgxMDMyNTQ3NjsKICB9CgogIC8vIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBIYXNoLgogIF9NRDUgbmV3SW5zdGFuY2UoKSB7CiAgICByZXR1cm4gbmV3IF9NRDUoKTsKICB9CgogIHN0YXRpYyBjb25zdCBfayA9IGNvbnN0IFsKICAgIDB4ZDc2YWE0NzgsIDB4ZThjN2I3NTYsIDB4MjQyMDcwZGIsIDB4YzFiZGNlZWUsIDB4ZjU3YzBmYWYsIDB4NDc4N2M2MmEsIC8vCiAgICAweGE4MzA0NjEzLCAweGZkNDY5NTAxLCAweDY5ODA5OGQ4LCAweDhiNDRmN2FmLCAweGZmZmY1YmIxLCAweDg5NWNkN2JlLCAvLwogICAgMHg2YjkwMTEyMiwgMHhmZDk4NzE5MywgMHhhNjc5NDM4ZSwgMHg0OWI0MDgyMSwgMHhmNjFlMjU2MiwgMHhjMDQwYjM0MCwgLy8KICAgIDB4MjY1ZTVhNTEsIDB4ZTliNmM3YWEsIDB4ZDYyZjEwNWQsIDB4MDI0NDE0NTMsIDB4ZDhhMWU2ODEsIDB4ZTdkM2ZiYzgsIC8vCiAgICAweDIxZTFjZGU2LCAweGMzMzcwN2Q2LCAweGY0ZDUwZDg3LCAweDQ1NWExNGVkLCAweGE5ZTNlOTA1LCAweGZjZWZhM2Y4LCAvLwogICAgMHg2NzZmMDJkOSwgMHg4ZDJhNGM4YSwgMHhmZmZhMzk0MiwgMHg4NzcxZjY4MSwgMHg2ZDlkNjEyMiwgMHhmZGU1MzgwYywgLy8KICAgIDB4YTRiZWVhNDQsIDB4NGJkZWNmYTksIDB4ZjZiYjRiNjAsIDB4YmViZmJjNzAsIDB4Mjg5YjdlYzYsIDB4ZWFhMTI3ZmEsIC8vCiAgICAweGQ0ZWYzMDg1LCAweDA0ODgxZDA1LCAweGQ5ZDRkMDM5LCAweGU2ZGI5OWU1LCAweDFmYTI3Y2Y4LCAweGM0YWM1NjY1LCAvLwogICAgMHhmNDI5MjI0NCwgMHg0MzJhZmY5NywgMHhhYjk0MjNhNywgMHhmYzkzYTAzOSwgMHg2NTViNTljMywgMHg4ZjBjY2M5MiwgLy8KICAgIDB4ZmZlZmY0N2QsIDB4ODU4NDVkZDEsIDB4NmZhODdlNGYsIDB4ZmUyY2U2ZTAsIDB4YTMwMTQzMTQsIDB4NGUwODExYTEsIC8vCiAgICAweGY3NTM3ZTgyLCAweGJkM2FmMjM1LCAweDJhZDdkMmJiLCAweGViODZkMzkxCiAgXTsKCiAgc3RhdGljIGNvbnN0IF9yID0gY29uc3QgWwogICAgNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNSwgOSwgMTQsIC8vCiAgICAyMCwgNSwgOSwgMTQsIDIwLCA1LCA5LCAxNCwgMjAsIDUsIDksIDE0LCAyMCwgNCwgMTEsIDE2LCAyMywgNCwgMTEsIC8vCiAgICAxNiwgMjMsIDQsIDExLCAxNiwgMjMsIDQsIDExLCAxNiwgMjMsIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjEsIDYsIC8vCiAgICAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxCiAgXTsKCiAgLy8gQ29tcHV0ZSBvbmUgaXRlcmF0aW9uIG9mIHRoZSBNRDUgYWxnb3JpdGhtIHdpdGggYSBjaHVuayBvZgogIC8vIDE2IDMyLWJpdCBwaWVjZXMuCiAgdm9pZCBfdXBkYXRlSGFzaChMaXN0PGludD4gbSkgewogICAgYXNzZXJ0KG0ubGVuZ3RoID09IDE2KTsKCiAgICB2YXIgYSA9IF9oWzBdOwogICAgdmFyIGIgPSBfaFsxXTsKICAgIHZhciBjID0gX2hbMl07CiAgICB2YXIgZCA9IF9oWzNdOwoKICAgIHZhciB0MDsKICAgIHZhciB0MTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY0OyBpKyspIHsKICAgICAgaWYgKGkgPCAxNikgewogICAgICAgIHQwID0gKGIgJiBjKSB8ICgofmIgJiBfTUFTS18zMikgJiBkKTsKICAgICAgICB0MSA9IGk7CiAgICAgIH0gZWxzZSBpZiAoaSA8IDMyKSB7CiAgICAgICAgdDAgPSAoZCAmIGIpIHwgKCh+ZCAmIF9NQVNLXzMyKSAmIGMpOwogICAgICAgIHQxID0gKCg1ICogaSkgKyAxKSAlIDE2OwogICAgICB9IGVsc2UgaWYgKGkgPCA0OCkgewogICAgICAgIHQwID0gYiBeIGMgXiBkOwogICAgICAgIHQxID0gKCgzICogaSkgKyA1KSAlIDE2OwogICAgICB9IGVsc2UgewogICAgICAgIHQwID0gYyBeIChiIHwgKH5kICYgX01BU0tfMzIpKTsKICAgICAgICB0MSA9ICg3ICogaSkgJSAxNjsKICAgICAgfQoKICAgICAgdmFyIHRlbXAgPSBkOwogICAgICBkID0gYzsKICAgICAgYyA9IGI7CiAgICAgIGIgPSBfYWRkMzIoCiAgICAgICAgICBiLCBfcm90bDMyKF9hZGQzMihfYWRkMzIoYSwgdDApLCBfYWRkMzIoX2tbaV0sIG1bdDFdKSksIF9yW2ldKSk7CiAgICAgIGEgPSB0ZW1wOwogICAgfQoKICAgIF9oWzBdID0gX2FkZDMyKGEsIF9oWzBdKTsKICAgIF9oWzFdID0gX2FkZDMyKGIsIF9oWzFdKTsKICAgIF9oWzJdID0gX2FkZDMyKGMsIF9oWzJdKTsKICAgIF9oWzNdID0gX2FkZDMyKGQsIF9oWzNdKTsKICB9Cn0KCi8vIFRoZSBTSEExIGhhc2hlciBpcyB1c2VkIHRvIGNvbXB1dGUgYW4gU0hBMSBtZXNzYWdlIGRpZ2VzdC4KY2xhc3MgX1NIQTEgZXh0ZW5kcyBfSGFzaEJhc2UgewogIC8vIENvbnN0cnVjdCBhIFNIQTEgaGFzaGVyIG9iamVjdC4KICBfU0hBMSgpCiAgICAgIDogX3cgPSBuZXcgTGlzdCg4MCksCiAgICAgICAgc3VwZXIoMTYsIDUsIHRydWUpIHsKICAgIF9oWzBdID0gMHg2NzQ1MjMwMTsKICAgIF9oWzFdID0gMHhFRkNEQUI4OTsKICAgIF9oWzJdID0gMHg5OEJBRENGRTsKICAgIF9oWzNdID0gMHgxMDMyNTQ3NjsKICAgIF9oWzRdID0gMHhDM0QyRTFGMDsKICB9CgogIC8vIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBIYXNoLgogIF9TSEExIG5ld0luc3RhbmNlKCkgewogICAgcmV0dXJuIG5ldyBfU0hBMSgpOwogIH0KCiAgLy8gQ29tcHV0ZSBvbmUgaXRlcmF0aW9uIG9mIHRoZSBTSEExIGFsZ29yaXRobSB3aXRoIGEgY2h1bmsgb2YKICAvLyAxNiAzMi1iaXQgcGllY2VzLgogIHZvaWQgX3VwZGF0ZUhhc2goTGlzdDxpbnQ+IG0pIHsKICAgIGFzc2VydChtLmxlbmd0aCA9PSAxNik7CgogICAgdmFyIGEgPSBfaFswXTsKICAgIHZhciBiID0gX2hbMV07CiAgICB2YXIgYyA9IF9oWzJdOwogICAgdmFyIGQgPSBfaFszXTsKICAgIHZhciBlID0gX2hbNF07CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4MDsgaSsrKSB7CiAgICAgIGlmIChpIDwgMTYpIHsKICAgICAgICBfd1tpXSA9IG1baV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG4gPSBfd1tpIC0gM10gXiBfd1tpIC0gOF0gXiBfd1tpIC0gMTRdIF4gX3dbaSAtIDE2XTsKICAgICAgICBfd1tpXSA9IF9yb3RsMzIobiwgMSk7CiAgICAgIH0KICAgICAgdmFyIHQgPSBfYWRkMzIoX2FkZDMyKF9yb3RsMzIoYSwgNSksIGUpLCBfd1tpXSk7CiAgICAgIGlmIChpIDwgMjApIHsKICAgICAgICB0ID0gX2FkZDMyKF9hZGQzMih0LCAoYiAmIGMpIHwgKH5iICYgZCkpLCAweDVBODI3OTk5KTsKICAgICAgfSBlbHNlIGlmIChpIDwgNDApIHsKICAgICAgICB0ID0gX2FkZDMyKF9hZGQzMih0LCAoYiBeIGMgXiBkKSksIDB4NkVEOUVCQTEpOwogICAgICB9IGVsc2UgaWYgKGkgPCA2MCkgewogICAgICAgIHQgPSBfYWRkMzIoX2FkZDMyKHQsIChiICYgYykgfCAoYiAmIGQpIHwgKGMgJiBkKSksIDB4OEYxQkJDREMpOwogICAgICB9IGVsc2UgewogICAgICAgIHQgPSBfYWRkMzIoX2FkZDMyKHQsIGIgXiBjIF4gZCksIDB4Q0E2MkMxRDYpOwogICAgICB9CgogICAgICBlID0gZDsKICAgICAgZCA9IGM7CiAgICAgIGMgPSBfcm90bDMyKGIsIDMwKTsKICAgICAgYiA9IGE7CiAgICAgIGEgPSB0ICYgX01BU0tfMzI7CiAgICB9CgogICAgX2hbMF0gPSBfYWRkMzIoYSwgX2hbMF0pOwogICAgX2hbMV0gPSBfYWRkMzIoYiwgX2hbMV0pOwogICAgX2hbMl0gPSBfYWRkMzIoYywgX2hbMl0pOwogICAgX2hbM10gPSBfYWRkMzIoZCwgX2hbM10pOwogICAgX2hbNF0gPSBfYWRkMzIoZSwgX2hbNF0pOwogIH0KCiAgTGlzdDxpbnQ+IF93Owp9CoHMAE5OPAEUARUkJCQlASVKASxKAUskFyEwMEdHR0dHR0dHR0dHR0dHR0MFASwBLzMmJgYTBAEuJR5IBh4EAS8/HBQRBkgeMjMcSCYcOgYuAR0dHjArFi02NS4+QBcXDwgGAUoUIBgsNRYWJxgcLEI1FgYBKgQBNS8cFB8GAUhCFyQxExUzRwoIBgEmRzYGAUMXKTE0LwZALgEtQhEgNRYpDwoIGhskMAgGEAQCAQ4WHRobAUMOGxMfIB4aGhsQHgENTRwxJwQBJxgZHEMGIx8QBAE/FhkfBhoVECYdBAEyFjAEASsRASgcARUmKgE1JCAtMAQBRh8aKioGEwQBOjFQAUpITExIFiQkIx4nBgQBKiUxPz8/PxIEAUEMDyNAIxVNLCQINwYEAUsvFBwtQEY4LBsGOCcbLEINQiwGBAIBPB8hGBgYGAQBKhcXBAEcT09PT09PT09PTzMFARxNS04eBQFAFyIcARMTExMBDAwBIxQuEBsuIRsYIQ8oGwgBFA0NEksQBgEeHh4eBAIBPiAlChsdGBgYGBgEASoYGAQBQRciHAETExMTEwEjFBYPQR8INxQ/GzgbSA82CAENDRoNGAYBHh4eHh4EARACARZkYXJ0Ol9odHRwL2NyeXB0by5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9faHR0cC9odHRwX2RhdGUuZGFydKoCLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5faHR0cDsKCi8qKgogKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igd29ya2luZyB3aXRoIGRhdGVzIHdpdGggSFRUUCBzcGVjaWZpYyBkYXRlCiAqIGZvcm1hdHMuCiAqLwpjbGFzcyBIdHRwRGF0ZSB7CiAgLy8gRnJvbSBSRkMtMjYxNiBzZWN0aW9uICIzLjMuMSBGdWxsIERhdGUiLAogIC8vIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI2MTYjc2VjdGlvbi0zLjMuMQogIC8vCiAgLy8gSFRUUC1kYXRlICAgID0gcmZjMTEyMy1kYXRlIHwgcmZjODUwLWRhdGUgfCBhc2N0aW1lLWRhdGUKICAvLyByZmMxMTIzLWRhdGUgPSB3a2RheSAiLCIgU1AgZGF0ZTEgU1AgdGltZSBTUCAiR01UIgogIC8vIHJmYzg1MC1kYXRlICA9IHdlZWtkYXkgIiwiIFNQIGRhdGUyIFNQIHRpbWUgU1AgIkdNVCIKICAvLyBhc2N0aW1lLWRhdGUgPSB3a2RheSBTUCBkYXRlMyBTUCB0aW1lIFNQIDRESUdJVAogIC8vIGRhdGUxICAgICAgICA9IDJESUdJVCBTUCBtb250aCBTUCA0RElHSVQKICAvLyAgICAgICAgICAgICAgICA7IGRheSBtb250aCB5ZWFyIChlLmcuLCAwMiBKdW4gMTk4MikKICAvLyBkYXRlMiAgICAgICAgPSAyRElHSVQgIi0iIG1vbnRoICItIiAyRElHSVQKICAvLyAgICAgICAgICAgICAgICA7IGRheS1tb250aC15ZWFyIChlLmcuLCAwMi1KdW4tODIpCiAgLy8gZGF0ZTMgICAgICAgID0gbW9udGggU1AgKCAyRElHSVQgfCAoIFNQIDFESUdJVCApKQogIC8vICAgICAgICAgICAgICAgIDsgbW9udGggZGF5IChlLmcuLCBKdW4gIDIpCiAgLy8gdGltZSAgICAgICAgID0gMkRJR0lUICI6IiAyRElHSVQgIjoiIDJESUdJVAogIC8vICAgICAgICAgICAgICAgIDsgMDA6MDA6MDAgLSAyMzo1OTo1OQogIC8vIHdrZGF5ICAgICAgICA9ICJNb24iIHwgIlR1ZSIgfCAiV2VkIgogIC8vICAgICAgICAgICAgICB8ICJUaHUiIHwgIkZyaSIgfCAiU2F0IiB8ICJTdW4iCiAgLy8gd2Vla2RheSAgICAgID0gIk1vbmRheSIgfCAiVHVlc2RheSIgfCAiV2VkbmVzZGF5IgogIC8vICAgICAgICAgICAgICB8ICJUaHVyc2RheSIgfCAiRnJpZGF5IiB8ICJTYXR1cmRheSIgfCAiU3VuZGF5IgogIC8vIG1vbnRoICAgICAgICA9ICJKYW4iIHwgIkZlYiIgfCAiTWFyIiB8ICJBcHIiCiAgLy8gICAgICAgICAgICAgIHwgIk1heSIgfCAiSnVuIiB8ICJKdWwiIHwgIkF1ZyIKICAvLyAgICAgICAgICAgICAgfCAiU2VwIiB8ICJPY3QiIHwgIk5vdiIgfCAiRGVjIgoKICAvKioKICAgKiBGb3JtYXQgYSBkYXRlIGFjY29yZGluZyB0bwogICAqIFtSRkMtMTEyM10oaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTEyMyAiUkZDLTExMjMiKSwKICAgKiBlLmcuIGBUaHUsIDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UYC4KICAgKi8KICBzdGF0aWMgU3RyaW5nIGZvcm1hdChEYXRlVGltZSBkYXRlKSB7CiAgICBjb25zdCBMaXN0IHdrZGF5ID0gY29uc3QgWyJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIsICJTdW4iXTsKICAgIGNvbnN0IExpc3QgbW9udGggPSBjb25zdCBbCiAgICAgICJKYW4iLAogICAgICAiRmViIiwKICAgICAgIk1hciIsCiAgICAgICJBcHIiLAogICAgICAiTWF5IiwKICAgICAgIkp1biIsCiAgICAgICJKdWwiLAogICAgICAiQXVnIiwKICAgICAgIlNlcCIsCiAgICAgICJPY3QiLAogICAgICAiTm92IiwKICAgICAgIkRlYyIKICAgIF07CgogICAgRGF0ZVRpbWUgZCA9IGRhdGUudG9VdGMoKTsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKQogICAgICAuLndyaXRlKHdrZGF5W2Qud2Vla2RheSAtIDFdKQogICAgICAuLndyaXRlKCIsICIpCiAgICAgIC4ud3JpdGUoZC5kYXkgPD0gOSA/ICIwIiA6ICIiKQogICAgICAuLndyaXRlKGQuZGF5LnRvU3RyaW5nKCkpCiAgICAgIC4ud3JpdGUoIiAiKQogICAgICAuLndyaXRlKG1vbnRoW2QubW9udGggLSAxXSkKICAgICAgLi53cml0ZSgiICIpCiAgICAgIC4ud3JpdGUoZC55ZWFyLnRvU3RyaW5nKCkpCiAgICAgIC4ud3JpdGUoZC5ob3VyIDw9IDkgPyAiIDAiIDogIiAiKQogICAgICAuLndyaXRlKGQuaG91ci50b1N0cmluZygpKQogICAgICAuLndyaXRlKGQubWludXRlIDw9IDkgPyAiOjAiIDogIjoiKQogICAgICAuLndyaXRlKGQubWludXRlLnRvU3RyaW5nKCkpCiAgICAgIC4ud3JpdGUoZC5zZWNvbmQgPD0gOSA/ICI6MCIgOiAiOiIpCiAgICAgIC4ud3JpdGUoZC5zZWNvbmQudG9TdHJpbmcoKSkKICAgICAgLi53cml0ZSgiIEdNVCIpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICAvKioKICAgKiBQYXJzZSBhIGRhdGUgc3RyaW5nIGluIGVpdGhlciBvZiB0aGUgZm9ybWF0cwogICAqIFtSRkMtMTEyM10oaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTEyMyAiUkZDLTExMjMiKSwKICAgKiBbUkZDLTg1MF0oaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjODUwICJSRkMtODUwIikgb3IKICAgKiBBTlNJIEMncyBhc2N0aW1lKCkgZm9ybWF0LiBUaGVzZSBmb3JtYXRzIGFyZSBsaXN0ZWQgaGVyZS4KICAgKgogICAqICAgICBUaHUsIDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UCiAgICogICAgIFRodXJzZGF5LCAxLUphbi0xOTcwIDAwOjAwOjAwIEdNVAogICAqICAgICBUaHUgSmFuICAxIDAwOjAwOjAwIDE5NzAKICAgKgogICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBbUkZDLTI2MTYgc2VjdGlvbgogICAqIDMuMS4xXShodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyNjE2I3NlY3Rpb24tMy4zLjEKICAgKiAiUkZDLTI2MTYgc2VjdGlvbiAzLjEuMSIpLgogICAqLwogIHN0YXRpYyBEYXRlVGltZSBwYXJzZShTdHJpbmcgZGF0ZSkgewogICAgZmluYWwgaW50IFNQID0gMzI7CiAgICBjb25zdCBMaXN0IHdrZGF5cyA9IGNvbnN0IFsiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiLCAiU3VuIl07CiAgICBjb25zdCBMaXN0IHdlZWtkYXlzID0gY29uc3QgWwogICAgICAiTW9uZGF5IiwKICAgICAgIlR1ZXNkYXkiLAogICAgICAiV2VkbmVzZGF5IiwKICAgICAgIlRodXJzZGF5IiwKICAgICAgIkZyaWRheSIsCiAgICAgICJTYXR1cmRheSIsCiAgICAgICJTdW5kYXkiCiAgICBdOwogICAgY29uc3QgTGlzdCBtb250aHMgPSBjb25zdCBbCiAgICAgICJKYW4iLAogICAgICAiRmViIiwKICAgICAgIk1hciIsCiAgICAgICJBcHIiLAogICAgICAiTWF5IiwKICAgICAgIkp1biIsCiAgICAgICJKdWwiLAogICAgICAiQXVnIiwKICAgICAgIlNlcCIsCiAgICAgICJPY3QiLAogICAgICAiTm92IiwKICAgICAgIkRlYyIKICAgIF07CiAgICBjb25zdCBMaXN0IHdrZGF5c0xvd2VyQ2FzZSA9IGNvbnN0IFsKICAgICAgIm1vbiIsCiAgICAgICJ0dWUiLAogICAgICAid2VkIiwKICAgICAgInRodSIsCiAgICAgICJmcmkiLAogICAgICAic2F0IiwKICAgICAgInN1biIKICAgIF07CiAgICBjb25zdCBMaXN0IHdlZWtkYXlzTG93ZXJDYXNlID0gY29uc3QgWwogICAgICAibW9uZGF5IiwKICAgICAgInR1ZXNkYXkiLAogICAgICAid2VkbmVzZGF5IiwKICAgICAgInRodXJzZGF5IiwKICAgICAgImZyaWRheSIsCiAgICAgICJzYXR1cmRheSIsCiAgICAgICJzdW5kYXkiCiAgICBdOwogICAgY29uc3QgTGlzdCBtb250aHNMb3dlckNhc2UgPSBjb25zdCBbCiAgICAgICJqYW4iLAogICAgICAiZmViIiwKICAgICAgIm1hciIsCiAgICAgICJhcHIiLAogICAgICAibWF5IiwKICAgICAgImp1biIsCiAgICAgICJqdWwiLAogICAgICAiYXVnIiwKICAgICAgInNlcCIsCiAgICAgICJvY3QiLAogICAgICAibm92IiwKICAgICAgImRlYyIKICAgIF07CgogICAgZmluYWwgaW50IGZvcm1hdFJmYzExMjMgPSAwOwogICAgZmluYWwgaW50IGZvcm1hdFJmYzg1MCA9IDE7CiAgICBmaW5hbCBpbnQgZm9ybWF0QXNjdGltZSA9IDI7CgogICAgaW50IGluZGV4ID0gMDsKICAgIFN0cmluZyB0bXA7CiAgICBpbnQgZm9ybWF0OwoKICAgIHZvaWQgZXhwZWN0KFN0cmluZyBzKSB7CiAgICAgIGlmIChkYXRlLmxlbmd0aCAtIGluZGV4IDwgcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCBIVFRQIGRhdGUgJGRhdGUiKTsKICAgICAgfQogICAgICBTdHJpbmcgdG1wID0gZGF0ZS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgcy5sZW5ndGgpOwogICAgICBpZiAodG1wICE9IHMpIHsKICAgICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCBIVFRQIGRhdGUgJGRhdGUiKTsKICAgICAgfQogICAgICBpbmRleCArPSBzLmxlbmd0aDsKICAgIH0KCiAgICBpbnQgZXhwZWN0V2Vla2RheSgpIHsKICAgICAgaW50IHdlZWtkYXk7CiAgICAgIC8vIFRoZSBmb3JtYXR0aW5nIG9mIHRoZSB3ZWVrZGF5IHNpZ25hbHMgdGhlIGZvcm1hdCBvZiB0aGUgZGF0ZSBzdHJpbmcuCiAgICAgIGludCBwb3MgPSBkYXRlLmluZGV4T2YoIiwiLCBpbmRleCk7CiAgICAgIGlmIChwb3MgPT0gLTEpIHsKICAgICAgICBpbnQgcG9zID0gZGF0ZS5pbmRleE9mKCIgIiwgaW5kZXgpOwogICAgICAgIGlmIChwb3MgPT0gLTEpIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIEhUVFAgZGF0ZSAkZGF0ZSIpOwogICAgICAgIHRtcCA9IGRhdGUuc3Vic3RyaW5nKGluZGV4LCBwb3MpOwogICAgICAgIGluZGV4ID0gcG9zICsgMTsKICAgICAgICB3ZWVrZGF5ID0gd2tkYXlzLmluZGV4T2YodG1wKTsKICAgICAgICBpZiAod2Vla2RheSAhPSAtMSkgewogICAgICAgICAgZm9ybWF0ID0gZm9ybWF0QXNjdGltZTsKICAgICAgICAgIHJldHVybiB3ZWVrZGF5OwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0bXAgPSBkYXRlLnN1YnN0cmluZyhpbmRleCwgcG9zKTsKICAgICAgICBpbmRleCA9IHBvcyArIDE7CiAgICAgICAgd2Vla2RheSA9IHdrZGF5cy5pbmRleE9mKHRtcCk7CiAgICAgICAgaWYgKHdlZWtkYXkgIT0gLTEpIHsKICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdFJmYzExMjM7CiAgICAgICAgICByZXR1cm4gd2Vla2RheTsKICAgICAgICB9CiAgICAgICAgd2Vla2RheSA9IHdlZWtkYXlzLmluZGV4T2YodG1wKTsKICAgICAgICBpZiAod2Vla2RheSAhPSAtMSkgewogICAgICAgICAgZm9ybWF0ID0gZm9ybWF0UmZjODUwOwogICAgICAgICAgcmV0dXJuIHdlZWtkYXk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIEhUVFAgZGF0ZSAkZGF0ZSIpOwogICAgfQoKICAgIGludCBleHBlY3RNb250aChTdHJpbmcgc2VwYXJhdG9yKSB7CiAgICAgIGludCBwb3MgPSBkYXRlLmluZGV4T2Yoc2VwYXJhdG9yLCBpbmRleCk7CiAgICAgIGlmIChwb3MgLSBpbmRleCAhPSAzKSB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCBIVFRQIGRhdGUgJGRhdGUiKTsKICAgICAgdG1wID0gZGF0ZS5zdWJzdHJpbmcoaW5kZXgsIHBvcyk7CiAgICAgIGluZGV4ID0gcG9zICsgMTsKICAgICAgaW50IG1vbnRoID0gbW9udGhzLmluZGV4T2YodG1wKTsKICAgICAgaWYgKG1vbnRoICE9IC0xKSByZXR1cm4gbW9udGg7CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIEhUVFAgZGF0ZSAkZGF0ZSIpOwogICAgfQoKICAgIGludCBleHBlY3ROdW0oU3RyaW5nIHNlcGFyYXRvcikgewogICAgICBpbnQgcG9zOwogICAgICBpZiAoc2VwYXJhdG9yLmxlbmd0aCA+IDApIHsKICAgICAgICBwb3MgPSBkYXRlLmluZGV4T2Yoc2VwYXJhdG9yLCBpbmRleCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9zID0gZGF0ZS5sZW5ndGg7CiAgICAgIH0KICAgICAgU3RyaW5nIHRtcCA9IGRhdGUuc3Vic3RyaW5nKGluZGV4LCBwb3MpOwogICAgICBpbmRleCA9IHBvcyArIHNlcGFyYXRvci5sZW5ndGg7CiAgICAgIHRyeSB7CiAgICAgICAgaW50IHZhbHVlID0gaW50LnBhcnNlKHRtcCk7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIEhUVFAgZGF0ZSAkZGF0ZSIpOwogICAgICB9CiAgICB9CgogICAgdm9pZCBleHBlY3RFbmQoKSB7CiAgICAgIGlmIChpbmRleCAhPSBkYXRlLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIEhUVFAgZGF0ZSAkZGF0ZSIpOwogICAgICB9CiAgICB9CgogICAgaW50IHdlZWtkYXkgPSBleHBlY3RXZWVrZGF5KCk7CiAgICBpbnQgZGF5OwogICAgaW50IG1vbnRoOwogICAgaW50IHllYXI7CiAgICBpbnQgaG91cnM7CiAgICBpbnQgbWludXRlczsKICAgIGludCBzZWNvbmRzOwogICAgaWYgKGZvcm1hdCA9PSBmb3JtYXRBc2N0aW1lKSB7CiAgICAgIG1vbnRoID0gZXhwZWN0TW9udGgoIiAiKTsKICAgICAgaWYgKGRhdGUuY29kZVVuaXRBdChpbmRleCkgPT0gU1ApIGluZGV4Kys7CiAgICAgIGRheSA9IGV4cGVjdE51bSgiICIpOwogICAgICBob3VycyA9IGV4cGVjdE51bSgiOiIpOwogICAgICBtaW51dGVzID0gZXhwZWN0TnVtKCI6Iik7CiAgICAgIHNlY29uZHMgPSBleHBlY3ROdW0oIiAiKTsKICAgICAgeWVhciA9IGV4cGVjdE51bSgiIik7CiAgICB9IGVsc2UgewogICAgICBleHBlY3QoIiAiKTsKICAgICAgZGF5ID0gZXhwZWN0TnVtKGZvcm1hdCA9PSBmb3JtYXRSZmMxMTIzID8gIiAiIDogIi0iKTsKICAgICAgbW9udGggPSBleHBlY3RNb250aChmb3JtYXQgPT0gZm9ybWF0UmZjMTEyMyA/ICIgIiA6ICItIik7CiAgICAgIHllYXIgPSBleHBlY3ROdW0oIiAiKTsKICAgICAgaG91cnMgPSBleHBlY3ROdW0oIjoiKTsKICAgICAgbWludXRlcyA9IGV4cGVjdE51bSgiOiIpOwogICAgICBzZWNvbmRzID0gZXhwZWN0TnVtKCIgIik7CiAgICAgIGV4cGVjdCgiR01UIik7CiAgICB9CiAgICBleHBlY3RFbmQoKTsKICAgIHJldHVybiBuZXcgRGF0ZVRpbWUudXRjKHllYXIsIG1vbnRoICsgMSwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcywgMCk7CiAgfQoKICAvLyBQYXJzZSBhIGNvb2tpZSBkYXRlIHN0cmluZy4KICBzdGF0aWMgRGF0ZVRpbWUgX3BhcnNlQ29va2llRGF0ZShTdHJpbmcgZGF0ZSkgewogICAgY29uc3QgTGlzdCBtb250aHNMb3dlckNhc2UgPSBjb25zdCBbCiAgICAgICJqYW4iLAogICAgICAiZmViIiwKICAgICAgIm1hciIsCiAgICAgICJhcHIiLAogICAgICAibWF5IiwKICAgICAgImp1biIsCiAgICAgICJqdWwiLAogICAgICAiYXVnIiwKICAgICAgInNlcCIsCiAgICAgICJvY3QiLAogICAgICAibm92IiwKICAgICAgImRlYyIKICAgIF07CgogICAgaW50IHBvc2l0aW9uID0gMDsKCiAgICB2b2lkIGVycm9yKCkgewogICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCBjb29raWUgZGF0ZSAkZGF0ZSIpOwogICAgfQoKICAgIGJvb2wgaXNFbmQoKSA9PiBwb3NpdGlvbiA9PSBkYXRlLmxlbmd0aDsKCiAgICBib29sIGlzRGVsaW1pdGVyKFN0cmluZyBzKSB7CiAgICAgIGludCBjaGFyID0gcy5jb2RlVW5pdEF0KDApOwogICAgICBpZiAoY2hhciA9PSAweDA5KSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGNoYXIgPj0gMHgyMCAmJiBjaGFyIDw9IDB4MkYpIHJldHVybiB0cnVlOwogICAgICBpZiAoY2hhciA+PSAweDNCICYmIGNoYXIgPD0gMHg0MCkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChjaGFyID49IDB4NUIgJiYgY2hhciA8PSAweDYwKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGNoYXIgPj0gMHg3QiAmJiBjaGFyIDw9IDB4N0UpIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgYm9vbCBpc05vbkRlbGltaXRlcihTdHJpbmcgcykgewogICAgICBpbnQgY2hhciA9IHMuY29kZVVuaXRBdCgwKTsKICAgICAgaWYgKGNoYXIgPj0gMHgwMCAmJiBjaGFyIDw9IDB4MDgpIHJldHVybiB0cnVlOwogICAgICBpZiAoY2hhciA+PSAweDBBICYmIGNoYXIgPD0gMHgxRikgcmV0dXJuIHRydWU7CiAgICAgIGlmIChjaGFyID49IDB4MzAgJiYgY2hhciA8PSAweDM5KSByZXR1cm4gdHJ1ZTsgLy8gRGlnaXQKICAgICAgaWYgKGNoYXIgPT0gMHgzQSkgcmV0dXJuIHRydWU7IC8vICc6JwogICAgICBpZiAoY2hhciA+PSAweDQxICYmIGNoYXIgPD0gMHg1QSkgcmV0dXJuIHRydWU7IC8vIEFscGhhCiAgICAgIGlmIChjaGFyID49IDB4NjEgJiYgY2hhciA8PSAweDdBKSByZXR1cm4gdHJ1ZTsgLy8gQWxwaGEKICAgICAgaWYgKGNoYXIgPj0gMHg3RiAmJiBjaGFyIDw9IDB4RkYpIHJldHVybiB0cnVlOyAvLyBBbHBoYQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgYm9vbCBpc0RpZ2l0KFN0cmluZyBzKSB7CiAgICAgIGludCBjaGFyID0gcy5jb2RlVW5pdEF0KDApOwogICAgICBpZiAoY2hhciA+IDB4MkYgJiYgY2hhciA8IDB4M0EpIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaW50IGdldE1vbnRoKFN0cmluZyBtb250aCkgewogICAgICBpZiAobW9udGgubGVuZ3RoIDwgMykgcmV0dXJuIC0xOwogICAgICByZXR1cm4gbW9udGhzTG93ZXJDYXNlLmluZGV4T2YobW9udGguc3Vic3RyaW5nKDAsIDMpKTsKICAgIH0KCiAgICBpbnQgdG9JbnQoU3RyaW5nIHMpIHsKICAgICAgaW50IGluZGV4ID0gMDsKICAgICAgZm9yICg7IGluZGV4IDwgcy5sZW5ndGggJiYgaXNEaWdpdChzW2luZGV4XSk7IGluZGV4KyspOwogICAgICByZXR1cm4gaW50LnBhcnNlKHMuc3Vic3RyaW5nKDAsIGluZGV4KSk7CiAgICB9CgogICAgdmFyIHRva2VucyA9IFtdOwogICAgd2hpbGUgKCFpc0VuZCgpKSB7CiAgICAgIHdoaWxlICghaXNFbmQoKSAmJiBpc0RlbGltaXRlcihkYXRlW3Bvc2l0aW9uXSkpIHBvc2l0aW9uKys7CiAgICAgIGludCBzdGFydCA9IHBvc2l0aW9uOwogICAgICB3aGlsZSAoIWlzRW5kKCkgJiYgaXNOb25EZWxpbWl0ZXIoZGF0ZVtwb3NpdGlvbl0pKSBwb3NpdGlvbisrOwogICAgICB0b2tlbnMuYWRkKGRhdGUuc3Vic3RyaW5nKHN0YXJ0LCBwb3NpdGlvbikudG9Mb3dlckNhc2UoKSk7CiAgICAgIHdoaWxlICghaXNFbmQoKSAmJiBpc0RlbGltaXRlcihkYXRlW3Bvc2l0aW9uXSkpIHBvc2l0aW9uKys7CiAgICB9CgogICAgU3RyaW5nIHRpbWVTdHI7CiAgICBTdHJpbmcgZGF5T2ZNb250aFN0cjsKICAgIFN0cmluZyBtb250aFN0cjsKICAgIFN0cmluZyB5ZWFyU3RyOwoKICAgIGZvciAodmFyIHRva2VuIGluIHRva2VucykgewogICAgICBpZiAodG9rZW4ubGVuZ3RoIDwgMSkgY29udGludWU7CiAgICAgIGlmICh0aW1lU3RyID09IG51bGwgJiYKICAgICAgICAgIHRva2VuLmxlbmd0aCA+PSA1ICYmCiAgICAgICAgICBpc0RpZ2l0KHRva2VuWzBdKSAmJgogICAgICAgICAgKHRva2VuWzFdID09ICI6IiB8fCAoaXNEaWdpdCh0b2tlblsxXSkgJiYgdG9rZW5bMl0gPT0gIjoiKSkpIHsKICAgICAgICB0aW1lU3RyID0gdG9rZW47CiAgICAgIH0gZWxzZSBpZiAoZGF5T2ZNb250aFN0ciA9PSBudWxsICYmIGlzRGlnaXQodG9rZW5bMF0pKSB7CiAgICAgICAgZGF5T2ZNb250aFN0ciA9IHRva2VuOwogICAgICB9IGVsc2UgaWYgKG1vbnRoU3RyID09IG51bGwgJiYgZ2V0TW9udGgodG9rZW4pID49IDApIHsKICAgICAgICBtb250aFN0ciA9IHRva2VuOwogICAgICB9IGVsc2UgaWYgKHllYXJTdHIgPT0gbnVsbCAmJgogICAgICAgICAgdG9rZW4ubGVuZ3RoID49IDIgJiYKICAgICAgICAgIGlzRGlnaXQodG9rZW5bMF0pICYmCiAgICAgICAgICBpc0RpZ2l0KHRva2VuWzFdKSkgewogICAgICAgIHllYXJTdHIgPSB0b2tlbjsKICAgICAgfQogICAgfQoKICAgIGlmICh0aW1lU3RyID09IG51bGwgfHwKICAgICAgICBkYXlPZk1vbnRoU3RyID09IG51bGwgfHwKICAgICAgICBtb250aFN0ciA9PSBudWxsIHx8CiAgICAgICAgeWVhclN0ciA9PSBudWxsKSB7CiAgICAgIGVycm9yKCk7CiAgICB9CgogICAgaW50IHllYXIgPSB0b0ludCh5ZWFyU3RyKTsKICAgIGlmICh5ZWFyID49IDcwICYmIHllYXIgPD0gOTkpCiAgICAgIHllYXIgKz0gMTkwMDsKICAgIGVsc2UgaWYgKHllYXIgPj0gMCAmJiB5ZWFyIDw9IDY5KSB5ZWFyICs9IDIwMDA7CiAgICBpZiAoeWVhciA8IDE2MDEpIGVycm9yKCk7CgogICAgaW50IGRheU9mTW9udGggPSB0b0ludChkYXlPZk1vbnRoU3RyKTsKICAgIGlmIChkYXlPZk1vbnRoIDwgMSB8fCBkYXlPZk1vbnRoID4gMzEpIGVycm9yKCk7CgogICAgaW50IG1vbnRoID0gZ2V0TW9udGgobW9udGhTdHIpICsgMTsKCiAgICB2YXIgdGltZUxpc3QgPSB0aW1lU3RyLnNwbGl0KCI6Iik7CiAgICBpZiAodGltZUxpc3QubGVuZ3RoICE9IDMpIGVycm9yKCk7CiAgICBpbnQgaG91ciA9IHRvSW50KHRpbWVMaXN0WzBdKTsKICAgIGludCBtaW51dGUgPSB0b0ludCh0aW1lTGlzdFsxXSk7CiAgICBpbnQgc2Vjb25kID0gdG9JbnQodGltZUxpc3RbMl0pOwogICAgaWYgKGhvdXIgPiAyMykgZXJyb3IoKTsKICAgIGlmIChtaW51dGUgPiA1OSkgZXJyb3IoKTsKICAgIGlmIChzZWNvbmQgPiA1OSkgZXJyb3IoKTsKCiAgICByZXR1cm4gbmV3IERhdGVUaW1lLnV0Yyh5ZWFyLCBtb250aCwgZGF5T2ZNb250aCwgaG91ciwgbWludXRlLCBzZWNvbmQsIDApOwogIH0KfQqBhgBOTjwBFAEERAwEES42BT44OjUuOTA3Ny8xKioyN0IyMjIBBiBAKgYoUB8NDQ0NDQ0NDQ0NDQwHAR8pJBQlIBMiEyEoISojKiMXGgQBBjJAPz8FJisiBTA9IAYnF1EiEBETEhASDwcgDQ0NDQ0NDQ0NDQ0MBykNDQ0NDQ0MBysQERMSEBIPBykNDQ0NDQ0NDQ0NDQwHASEgIQETEBABHCw8CDwWPAgZBgEaE04qFyxLKhknHSIaCg8qGScdIhoKKR0hGgoIOgYBKDBQKBcnJToGASYPIi4PGwgvJgwkFic8CAYBFyI8CAYBIw0PDg8RESMgMRweICAcDRM8QB0eICAVBhFPBAEhMikNDQ0NDQ0NDQ0NDQwHARYBEzwGAS0BISIlNTU1NRQGASQiNTU+LD4+PhQGAR0iMxQGASEnPQYBGhU+LwYBFRdCHEVBQgYBFBoVFAEgJh0fH0kZPx89GiQfHx8ZCAYBGyEcGw8GAR8iFDQeASs0ASgBJycjJSUcHh4BTwQCARlkYXJ0Ol9odHRwL2h0dHBfZGF0ZS5kYXJ0M29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9faHR0cC9odHRwX2hlYWRlcnMuZGFydMAAblcvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll9odHRwOwoKY2xhc3MgX0h0dHBIZWFkZXJzIGltcGxlbWVudHMgSHR0cEhlYWRlcnMgewogIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gX2hlYWRlcnM7CiAgZmluYWwgU3RyaW5nIHByb3RvY29sVmVyc2lvbjsKCiAgYm9vbCBfbXV0YWJsZSA9IHRydWU7IC8vIEFyZSB0aGUgaGVhZGVycyBjdXJyZW50bHkgbXV0YWJsZT8KICBMaXN0PFN0cmluZz4gX25vRm9sZGluZ0hlYWRlcnM7CgogIGludCBfY29udGVudExlbmd0aCA9IC0xOwogIGJvb2wgX3BlcnNpc3RlbnRDb25uZWN0aW9uID0gdHJ1ZTsKICBib29sIF9jaHVua2VkVHJhbnNmZXJFbmNvZGluZyA9IGZhbHNlOwogIFN0cmluZyBfaG9zdDsKICBpbnQgX3BvcnQ7CgogIGZpbmFsIGludCBfZGVmYXVsdFBvcnRGb3JTY2hlbWU7CgogIF9IdHRwSGVhZGVycyh0aGlzLnByb3RvY29sVmVyc2lvbiwKICAgICAge2ludCBkZWZhdWx0UG9ydEZvclNjaGVtZTogSHR0cENsaWVudC5kZWZhdWx0SHR0cFBvcnQsCiAgICAgIF9IdHRwSGVhZGVycyBpbml0aWFsSGVhZGVyc30pCiAgICAgIDogX2hlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKSwKICAgICAgICBfZGVmYXVsdFBvcnRGb3JTY2hlbWUgPSBkZWZhdWx0UG9ydEZvclNjaGVtZSB7CiAgICBpZiAoaW5pdGlhbEhlYWRlcnMgIT0gbnVsbCkgewogICAgICBpbml0aWFsSGVhZGVycy5faGVhZGVycy5mb3JFYWNoKChuYW1lLCB2YWx1ZSkgPT4gX2hlYWRlcnNbbmFtZV0gPSB2YWx1ZSk7CiAgICAgIF9jb250ZW50TGVuZ3RoID0gaW5pdGlhbEhlYWRlcnMuX2NvbnRlbnRMZW5ndGg7CiAgICAgIF9wZXJzaXN0ZW50Q29ubmVjdGlvbiA9IGluaXRpYWxIZWFkZXJzLl9wZXJzaXN0ZW50Q29ubmVjdGlvbjsKICAgICAgX2NodW5rZWRUcmFuc2ZlckVuY29kaW5nID0gaW5pdGlhbEhlYWRlcnMuX2NodW5rZWRUcmFuc2ZlckVuY29kaW5nOwogICAgICBfaG9zdCA9IGluaXRpYWxIZWFkZXJzLl9ob3N0OwogICAgICBfcG9ydCA9IGluaXRpYWxIZWFkZXJzLl9wb3J0OwogICAgfQogICAgaWYgKHByb3RvY29sVmVyc2lvbiA9PSAiMS4wIikgewogICAgICBfcGVyc2lzdGVudENvbm5lY3Rpb24gPSBmYWxzZTsKICAgICAgX2NodW5rZWRUcmFuc2ZlckVuY29kaW5nID0gZmFsc2U7CiAgICB9CiAgfQoKICBMaXN0PFN0cmluZz4gb3BlcmF0b3IgW10oU3RyaW5nIG5hbWUpID0+IF9oZWFkZXJzW25hbWUudG9Mb3dlckNhc2UoKV07CgogIFN0cmluZyB2YWx1ZShTdHJpbmcgbmFtZSkgewogICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBfaGVhZGVyc1tuYW1lXTsKICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDEpIHsKICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIk1vcmUgdGhhbiBvbmUgdmFsdWUgZm9yIGhlYWRlciAkbmFtZSIpOwogICAgfQogICAgcmV0dXJuIHZhbHVlc1swXTsKICB9CgogIHZvaWQgYWRkKFN0cmluZyBuYW1lLCB2YWx1ZSkgewogICAgX2NoZWNrTXV0YWJsZSgpOwogICAgX2FkZEFsbChfdmFsaWRhdGVGaWVsZChuYW1lKSwgdmFsdWUpOwogIH0KCiAgdm9pZCBfYWRkQWxsKFN0cmluZyBuYW1lLCB2YWx1ZSkgewogICAgYXNzZXJ0KG5hbWUgPT0gX3ZhbGlkYXRlRmllbGQobmFtZSkpOwogICAgaWYgKHZhbHVlIGlzIEl0ZXJhYmxlKSB7CiAgICAgIGZvciAodmFyIHYgaW4gdmFsdWUpIHsKICAgICAgICBfYWRkKG5hbWUsIF92YWxpZGF0ZVZhbHVlKHYpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgX2FkZChuYW1lLCBfdmFsaWRhdGVWYWx1ZSh2YWx1ZSkpOwogICAgfQogIH0KCiAgdm9pZCBzZXQoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewogICAgX2NoZWNrTXV0YWJsZSgpOwogICAgbmFtZSA9IF92YWxpZGF0ZUZpZWxkKG5hbWUpOwogICAgX2hlYWRlcnMucmVtb3ZlKG5hbWUpOwogICAgaWYgKG5hbWUgPT0gSHR0cEhlYWRlcnMudHJhbnNmZXJFbmNvZGluZ0hlYWRlcikgewogICAgICBfY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcgPSBmYWxzZTsKICAgIH0KICAgIF9hZGRBbGwobmFtZSwgdmFsdWUpOwogIH0KCiAgdm9pZCByZW1vdmUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewogICAgX2NoZWNrTXV0YWJsZSgpOwogICAgbmFtZSA9IF92YWxpZGF0ZUZpZWxkKG5hbWUpOwogICAgdmFsdWUgPSBfdmFsaWRhdGVWYWx1ZSh2YWx1ZSk7CiAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gX2hlYWRlcnNbbmFtZV07CiAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKICAgICAgaW50IGluZGV4ID0gdmFsdWVzLmluZGV4T2YodmFsdWUpOwogICAgICBpZiAoaW5kZXggIT0gLTEpIHsKICAgICAgICB2YWx1ZXMucmVtb3ZlUmFuZ2UoaW5kZXgsIGluZGV4ICsgMSk7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gMCkgX2hlYWRlcnMucmVtb3ZlKG5hbWUpOwogICAgfQogICAgaWYgKG5hbWUgPT0gSHR0cEhlYWRlcnMudHJhbnNmZXJFbmNvZGluZ0hlYWRlciAmJiB2YWx1ZSA9PSAiY2h1bmtlZCIpIHsKICAgICAgX2NodW5rZWRUcmFuc2ZlckVuY29kaW5nID0gZmFsc2U7CiAgICB9CiAgfQoKICB2b2lkIHJlbW92ZUFsbChTdHJpbmcgbmFtZSkgewogICAgX2NoZWNrTXV0YWJsZSgpOwogICAgbmFtZSA9IF92YWxpZGF0ZUZpZWxkKG5hbWUpOwogICAgX2hlYWRlcnMucmVtb3ZlKG5hbWUpOwogIH0KCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihTdHJpbmcgbmFtZSwgTGlzdDxTdHJpbmc+IHZhbHVlcykpIHsKICAgIF9oZWFkZXJzLmZvckVhY2goZik7CiAgfQoKICB2b2lkIG5vRm9sZGluZyhTdHJpbmcgbmFtZSkgewogICAgaWYgKF9ub0ZvbGRpbmdIZWFkZXJzID09IG51bGwpIF9ub0ZvbGRpbmdIZWFkZXJzID0gbmV3IExpc3Q8U3RyaW5nPigpOwogICAgX25vRm9sZGluZ0hlYWRlcnMuYWRkKG5hbWUpOwogIH0KCiAgYm9vbCBnZXQgcGVyc2lzdGVudENvbm5lY3Rpb24gPT4gX3BlcnNpc3RlbnRDb25uZWN0aW9uOwoKICB2b2lkIHNldCBwZXJzaXN0ZW50Q29ubmVjdGlvbihib29sIHBlcnNpc3RlbnRDb25uZWN0aW9uKSB7CiAgICBfY2hlY2tNdXRhYmxlKCk7CiAgICBpZiAocGVyc2lzdGVudENvbm5lY3Rpb24gPT0gX3BlcnNpc3RlbnRDb25uZWN0aW9uKSByZXR1cm47CiAgICBpZiAocGVyc2lzdGVudENvbm5lY3Rpb24pIHsKICAgICAgaWYgKHByb3RvY29sVmVyc2lvbiA9PSAiMS4xIikgewogICAgICAgIHJlbW92ZShIdHRwSGVhZGVycy5jb25uZWN0aW9uSGVhZGVyLCAiY2xvc2UiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoX2NvbnRlbnRMZW5ndGggPT0gLTEpIHsKICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKAogICAgICAgICAgICAgICJUcnlpbmcgdG8gc2V0ICdDb25uZWN0aW9uOiBLZWVwLUFsaXZlJyBvbiBIVFRQIDEuMCBoZWFkZXJzIHdpdGggIgogICAgICAgICAgICAgICJubyBDb250ZW50TGVuZ3RoIik7CiAgICAgICAgfQogICAgICAgIGFkZChIdHRwSGVhZGVycy5jb25uZWN0aW9uSGVhZGVyLCAia2VlcC1hbGl2ZSIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAocHJvdG9jb2xWZXJzaW9uID09ICIxLjEiKSB7CiAgICAgICAgYWRkKEh0dHBIZWFkZXJzLmNvbm5lY3Rpb25IZWFkZXIsICJjbG9zZSIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlbW92ZShIdHRwSGVhZGVycy5jb25uZWN0aW9uSGVhZGVyLCAia2VlcC1hbGl2ZSIpOwogICAgICB9CiAgICB9CiAgICBfcGVyc2lzdGVudENvbm5lY3Rpb24gPSBwZXJzaXN0ZW50Q29ubmVjdGlvbjsKICB9CgogIGludCBnZXQgY29udGVudExlbmd0aCA9PiBfY29udGVudExlbmd0aDsKCiAgdm9pZCBzZXQgY29udGVudExlbmd0aChpbnQgY29udGVudExlbmd0aCkgewogICAgX2NoZWNrTXV0YWJsZSgpOwogICAgaWYgKHByb3RvY29sVmVyc2lvbiA9PSAiMS4wIiAmJgogICAgICAgIHBlcnNpc3RlbnRDb25uZWN0aW9uICYmCiAgICAgICAgY29udGVudExlbmd0aCA9PSAtMSkgewogICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigKICAgICAgICAgICJUcnlpbmcgdG8gY2xlYXIgQ29udGVudExlbmd0aCBvbiBIVFRQIDEuMCBoZWFkZXJzIHdpdGggIgogICAgICAgICAgIidDb25uZWN0aW9uOiBLZWVwLUFsaXZlJyBzZXQiKTsKICAgIH0KICAgIGlmIChfY29udGVudExlbmd0aCA9PSBjb250ZW50TGVuZ3RoKSByZXR1cm47CiAgICBfY29udGVudExlbmd0aCA9IGNvbnRlbnRMZW5ndGg7CiAgICBpZiAoX2NvbnRlbnRMZW5ndGggPj0gMCkgewogICAgICBpZiAoY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcpIGNodW5rZWRUcmFuc2ZlckVuY29kaW5nID0gZmFsc2U7CiAgICAgIF9zZXQoSHR0cEhlYWRlcnMuY29udGVudExlbmd0aEhlYWRlciwgY29udGVudExlbmd0aC50b1N0cmluZygpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlbW92ZUFsbChIdHRwSGVhZGVycy5jb250ZW50TGVuZ3RoSGVhZGVyKTsKICAgICAgaWYgKHByb3RvY29sVmVyc2lvbiA9PSAiMS4xIikgewogICAgICAgIGNodW5rZWRUcmFuc2ZlckVuY29kaW5nID0gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KCiAgYm9vbCBnZXQgY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcgPT4gX2NodW5rZWRUcmFuc2ZlckVuY29kaW5nOwoKICB2b2lkIHNldCBjaHVua2VkVHJhbnNmZXJFbmNvZGluZyhib29sIGNodW5rZWRUcmFuc2ZlckVuY29kaW5nKSB7CiAgICBfY2hlY2tNdXRhYmxlKCk7CiAgICBpZiAoY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcgJiYgcHJvdG9jb2xWZXJzaW9uID09ICIxLjAiKSB7CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKAogICAgICAgICAgIlRyeWluZyB0byBzZXQgJ1RyYW5zZmVyLUVuY29kaW5nOiBDaHVua2VkJyBvbiBIVFRQIDEuMCBoZWFkZXJzIik7CiAgICB9CiAgICBpZiAoY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcgPT0gX2NodW5rZWRUcmFuc2ZlckVuY29kaW5nKSByZXR1cm47CiAgICBpZiAoY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcpIHsKICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IF9oZWFkZXJzW0h0dHBIZWFkZXJzLnRyYW5zZmVyRW5jb2RpbmdIZWFkZXJdOwogICAgICBpZiAoKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5sYXN0ICE9ICJjaHVua2VkIikpIHsKICAgICAgICAvLyBIZWFkZXJzIGRvZXMgbm90IHNwZWNpZnkgY2h1bmtlZCBlbmNvZGluZyAtIGFkZCBpdCBpZiBzZXQuCiAgICAgICAgX2FkZFZhbHVlKEh0dHBIZWFkZXJzLnRyYW5zZmVyRW5jb2RpbmdIZWFkZXIsICJjaHVua2VkIik7CiAgICAgIH0KICAgICAgY29udGVudExlbmd0aCA9IC0xOwogICAgfSBlbHNlIHsKICAgICAgLy8gSGVhZGVycyBkb2VzIHNwZWNpZnkgY2h1bmtlZCBlbmNvZGluZyAtIHJlbW92ZSBpdCBpZiBub3Qgc2V0LgogICAgICByZW1vdmUoSHR0cEhlYWRlcnMudHJhbnNmZXJFbmNvZGluZ0hlYWRlciwgImNodW5rZWQiKTsKICAgIH0KICAgIF9jaHVua2VkVHJhbnNmZXJFbmNvZGluZyA9IGNodW5rZWRUcmFuc2ZlckVuY29kaW5nOwogIH0KCiAgU3RyaW5nIGdldCBob3N0ID0+IF9ob3N0OwoKICB2b2lkIHNldCBob3N0KFN0cmluZyBob3N0KSB7CiAgICBfY2hlY2tNdXRhYmxlKCk7CiAgICBfaG9zdCA9IGhvc3Q7CiAgICBfdXBkYXRlSG9zdEhlYWRlcigpOwogIH0KCiAgaW50IGdldCBwb3J0ID0+IF9wb3J0OwoKICB2b2lkIHNldCBwb3J0KGludCBwb3J0KSB7CiAgICBfY2hlY2tNdXRhYmxlKCk7CiAgICBfcG9ydCA9IHBvcnQ7CiAgICBfdXBkYXRlSG9zdEhlYWRlcigpOwogIH0KCiAgRGF0ZVRpbWUgZ2V0IGlmTW9kaWZpZWRTaW5jZSB7CiAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gX2hlYWRlcnNbSHR0cEhlYWRlcnMuaWZNb2RpZmllZFNpbmNlSGVhZGVyXTsKICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgewogICAgICB0cnkgewogICAgICAgIHJldHVybiBIdHRwRGF0ZS5wYXJzZSh2YWx1ZXNbMF0pOwogICAgICB9IG9uIEV4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgc2V0IGlmTW9kaWZpZWRTaW5jZShEYXRlVGltZSBpZk1vZGlmaWVkU2luY2UpIHsKICAgIF9jaGVja011dGFibGUoKTsKICAgIC8vIEZvcm1hdCAiaWZNb2RpZmllZFNpbmNlIiBoZWFkZXIgd2l0aCBkYXRlIGluIEdyZWVud2ljaCBNZWFuIFRpbWUgKEdNVCkuCiAgICBTdHJpbmcgZm9ybWF0dGVkID0gSHR0cERhdGUuZm9ybWF0KGlmTW9kaWZpZWRTaW5jZS50b1V0YygpKTsKICAgIF9zZXQoSHR0cEhlYWRlcnMuaWZNb2RpZmllZFNpbmNlSGVhZGVyLCBmb3JtYXR0ZWQpOwogIH0KCiAgRGF0ZVRpbWUgZ2V0IGRhdGUgewogICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IF9oZWFkZXJzW0h0dHBIZWFkZXJzLmRhdGVIZWFkZXJdOwogICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIEh0dHBEYXRlLnBhcnNlKHZhbHVlc1swXSk7CiAgICAgIH0gb24gRXhjZXB0aW9uIGNhdGNoIChlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBzZXQgZGF0ZShEYXRlVGltZSBkYXRlKSB7CiAgICBfY2hlY2tNdXRhYmxlKCk7CiAgICAvLyBGb3JtYXQgIkRhdGVUaW1lIiBoZWFkZXIgd2l0aCBkYXRlIGluIEdyZWVud2ljaCBNZWFuIFRpbWUgKEdNVCkuCiAgICBTdHJpbmcgZm9ybWF0dGVkID0gSHR0cERhdGUuZm9ybWF0KGRhdGUudG9VdGMoKSk7CiAgICBfc2V0KCJkYXRlIiwgZm9ybWF0dGVkKTsKICB9CgogIERhdGVUaW1lIGdldCBleHBpcmVzIHsKICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBfaGVhZGVyc1tIdHRwSGVhZGVycy5leHBpcmVzSGVhZGVyXTsKICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgewogICAgICB0cnkgewogICAgICAgIHJldHVybiBIdHRwRGF0ZS5wYXJzZSh2YWx1ZXNbMF0pOwogICAgICB9IG9uIEV4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgc2V0IGV4cGlyZXMoRGF0ZVRpbWUgZXhwaXJlcykgewogICAgX2NoZWNrTXV0YWJsZSgpOwogICAgLy8gRm9ybWF0ICJFeHBpcmVzIiBoZWFkZXIgd2l0aCBkYXRlIGluIEdyZWVud2ljaCBNZWFuIFRpbWUgKEdNVCkuCiAgICBTdHJpbmcgZm9ybWF0dGVkID0gSHR0cERhdGUuZm9ybWF0KGV4cGlyZXMudG9VdGMoKSk7CiAgICBfc2V0KEh0dHBIZWFkZXJzLmV4cGlyZXNIZWFkZXIsIGZvcm1hdHRlZCk7CiAgfQoKICBDb250ZW50VHlwZSBnZXQgY29udGVudFR5cGUgewogICAgdmFyIHZhbHVlcyA9IF9oZWFkZXJzWyJjb250ZW50LXR5cGUiXTsKICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgewogICAgICByZXR1cm4gQ29udGVudFR5cGUucGFyc2UodmFsdWVzWzBdKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgdm9pZCBzZXQgY29udGVudFR5cGUoQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKICAgIF9jaGVja011dGFibGUoKTsKICAgIF9zZXQoSHR0cEhlYWRlcnMuY29udGVudFR5cGVIZWFkZXIsIGNvbnRlbnRUeXBlLnRvU3RyaW5nKCkpOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIF9jaGVja011dGFibGUoKTsKICAgIF9oZWFkZXJzLmNsZWFyKCk7CiAgICBfY29udGVudExlbmd0aCA9IC0xOwogICAgX3BlcnNpc3RlbnRDb25uZWN0aW9uID0gdHJ1ZTsKICAgIF9jaHVua2VkVHJhbnNmZXJFbmNvZGluZyA9IGZhbHNlOwogICAgX2hvc3QgPSBudWxsOwogICAgX3BvcnQgPSBudWxsOwogIH0KCiAgLy8gW25hbWVdIG11c3QgYmUgYSBsb3dlci1jYXNlIHZlcnNpb24gb2YgdGhlIG5hbWUuCiAgdm9pZCBfYWRkKFN0cmluZyBuYW1lLCB2YWx1ZSkgewogICAgYXNzZXJ0KG5hbWUgPT0gX3ZhbGlkYXRlRmllbGQobmFtZSkpOwogICAgLy8gVXNlIHRoZSBsZW5ndGggYXMgaW5kZXggb24gd2hhdCBtZXRob2QgdG8gY2FsbC4gVGhpcyBpcyBub3RhYmxlCiAgICAvLyBmYXN0ZXIgdGhhbiBjb21wdXRpbmcgaGFzaCBhbmQgbG9va2luZyB1cCBpbiBhIGhhc2gtbWFwLgogICAgc3dpdGNoIChuYW1lLmxlbmd0aCkgewogICAgICBjYXNlIDQ6CiAgICAgICAgaWYgKEh0dHBIZWFkZXJzLmRhdGVIZWFkZXIgPT0gbmFtZSkgewogICAgICAgICAgX2FkZERhdGUobmFtZSwgdmFsdWUpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoSHR0cEhlYWRlcnMuaG9zdEhlYWRlciA9PSBuYW1lKSB7CiAgICAgICAgICBfYWRkSG9zdChuYW1lLCB2YWx1ZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDc6CiAgICAgICAgaWYgKEh0dHBIZWFkZXJzLmV4cGlyZXNIZWFkZXIgPT0gbmFtZSkgewogICAgICAgICAgX2FkZEV4cGlyZXMobmFtZSwgdmFsdWUpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAxMDoKICAgICAgICBpZiAoSHR0cEhlYWRlcnMuY29ubmVjdGlvbkhlYWRlciA9PSBuYW1lKSB7CiAgICAgICAgICBfYWRkQ29ubmVjdGlvbihuYW1lLCB2YWx1ZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDEyOgogICAgICAgIGlmIChIdHRwSGVhZGVycy5jb250ZW50VHlwZUhlYWRlciA9PSBuYW1lKSB7CiAgICAgICAgICBfYWRkQ29udGVudFR5cGUobmFtZSwgdmFsdWUpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAxNDoKICAgICAgICBpZiAoSHR0cEhlYWRlcnMuY29udGVudExlbmd0aEhlYWRlciA9PSBuYW1lKSB7CiAgICAgICAgICBfYWRkQ29udGVudExlbmd0aChuYW1lLCB2YWx1ZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE3OgogICAgICAgIGlmIChIdHRwSGVhZGVycy50cmFuc2ZlckVuY29kaW5nSGVhZGVyID09IG5hbWUpIHsKICAgICAgICAgIF9hZGRUcmFuc2ZlckVuY29kaW5nKG5hbWUsIHZhbHVlKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKEh0dHBIZWFkZXJzLmlmTW9kaWZpZWRTaW5jZUhlYWRlciA9PSBuYW1lKSB7CiAgICAgICAgICBfYWRkSWZNb2RpZmllZFNpbmNlKG5hbWUsIHZhbHVlKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBfYWRkVmFsdWUobmFtZSwgdmFsdWUpOwogIH0KCiAgdm9pZCBfYWRkQ29udGVudExlbmd0aChTdHJpbmcgbmFtZSwgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpcyBpbnQpIHsKICAgICAgY29udGVudExlbmd0aCA9IHZhbHVlOwogICAgfSBlbHNlIGlmICh2YWx1ZSBpcyBTdHJpbmcpIHsKICAgICAgY29udGVudExlbmd0aCA9IGludC5wYXJzZSh2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0eXBlIGZvciBoZWFkZXIgbmFtZWQgJG5hbWUiKTsKICAgIH0KICB9CgogIHZvaWQgX2FkZFRyYW5zZmVyRW5jb2RpbmcoU3RyaW5nIG5hbWUsIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gImNodW5rZWQiKSB7CiAgICAgIGNodW5rZWRUcmFuc2ZlckVuY29kaW5nID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIF9hZGRWYWx1ZShIdHRwSGVhZGVycy50cmFuc2ZlckVuY29kaW5nSGVhZGVyLCB2YWx1ZSk7CiAgICB9CiAgfQoKICB2b2lkIF9hZGREYXRlKFN0cmluZyBuYW1lLCB2YWx1ZSkgewogICAgaWYgKHZhbHVlIGlzIERhdGVUaW1lKSB7CiAgICAgIGRhdGUgPSB2YWx1ZTsKICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgU3RyaW5nKSB7CiAgICAgIF9zZXQoSHR0cEhlYWRlcnMuZGF0ZUhlYWRlciwgdmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdHlwZSBmb3IgaGVhZGVyIG5hbWVkICRuYW1lIik7CiAgICB9CiAgfQoKICB2b2lkIF9hZGRFeHBpcmVzKFN0cmluZyBuYW1lLCB2YWx1ZSkgewogICAgaWYgKHZhbHVlIGlzIERhdGVUaW1lKSB7CiAgICAgIGV4cGlyZXMgPSB2YWx1ZTsKICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgU3RyaW5nKSB7CiAgICAgIF9zZXQoSHR0cEhlYWRlcnMuZXhwaXJlc0hlYWRlciwgdmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdHlwZSBmb3IgaGVhZGVyIG5hbWVkICRuYW1lIik7CiAgICB9CiAgfQoKICB2b2lkIF9hZGRJZk1vZGlmaWVkU2luY2UoU3RyaW5nIG5hbWUsIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgaXMgRGF0ZVRpbWUpIHsKICAgICAgaWZNb2RpZmllZFNpbmNlID0gdmFsdWU7CiAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIFN0cmluZykgewogICAgICBfc2V0KEh0dHBIZWFkZXJzLmlmTW9kaWZpZWRTaW5jZUhlYWRlciwgdmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdHlwZSBmb3IgaGVhZGVyIG5hbWVkICRuYW1lIik7CiAgICB9CiAgfQoKICB2b2lkIF9hZGRIb3N0KFN0cmluZyBuYW1lLCB2YWx1ZSkgewogICAgaWYgKHZhbHVlIGlzIFN0cmluZykgewogICAgICBpbnQgcG9zID0gdmFsdWUuaW5kZXhPZigiOiIpOwogICAgICBpZiAocG9zID09IC0xKSB7CiAgICAgICAgX2hvc3QgPSB2YWx1ZTsKICAgICAgICBfcG9ydCA9IEh0dHBDbGllbnQuZGVmYXVsdEh0dHBQb3J0OwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChwb3MgPiAwKSB7CiAgICAgICAgICBfaG9zdCA9IHZhbHVlLnN1YnN0cmluZygwLCBwb3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfaG9zdCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChwb3MgKyAxID09IHZhbHVlLmxlbmd0aCkgewogICAgICAgICAgX3BvcnQgPSBIdHRwQ2xpZW50LmRlZmF1bHRIdHRwUG9ydDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgX3BvcnQgPSBpbnQucGFyc2UodmFsdWUuc3Vic3RyaW5nKHBvcyArIDEpKTsKICAgICAgICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIGNhdGNoIChlKSB7CiAgICAgICAgICAgIF9wb3J0ID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgX3NldChIdHRwSGVhZGVycy5ob3N0SGVhZGVyLCB2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0eXBlIGZvciBoZWFkZXIgbmFtZWQgJG5hbWUiKTsKICAgIH0KICB9CgogIHZvaWQgX2FkZENvbm5lY3Rpb24oU3RyaW5nIG5hbWUsIHZhbHVlKSB7CiAgICB2YXIgbG93ZXJDYXNlVmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwogICAgaWYgKGxvd2VyQ2FzZVZhbHVlID09ICdjbG9zZScpIHsKICAgICAgX3BlcnNpc3RlbnRDb25uZWN0aW9uID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKGxvd2VyQ2FzZVZhbHVlID09ICdrZWVwLWFsaXZlJykgewogICAgICBfcGVyc2lzdGVudENvbm5lY3Rpb24gPSB0cnVlOwogICAgfQogICAgX2FkZFZhbHVlKG5hbWUsIHZhbHVlKTsKICB9CgogIHZvaWQgX2FkZENvbnRlbnRUeXBlKFN0cmluZyBuYW1lLCB2YWx1ZSkgewogICAgX3NldChIdHRwSGVhZGVycy5jb250ZW50VHlwZUhlYWRlciwgdmFsdWUpOwogIH0KCiAgdm9pZCBfYWRkVmFsdWUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewogICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IF9oZWFkZXJzW25hbWVdOwogICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CiAgICAgIHZhbHVlcyA9IG5ldyBMaXN0PFN0cmluZz4oKTsKICAgICAgX2hlYWRlcnNbbmFtZV0gPSB2YWx1ZXM7CiAgICB9CiAgICBpZiAodmFsdWUgaXMgRGF0ZVRpbWUpIHsKICAgICAgdmFsdWVzLmFkZChIdHRwRGF0ZS5mb3JtYXQodmFsdWUpKTsKICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgU3RyaW5nKSB7CiAgICAgIHZhbHVlcy5hZGQodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgdmFsdWVzLmFkZChfdmFsaWRhdGVWYWx1ZSh2YWx1ZS50b1N0cmluZygpKSk7CiAgICB9CiAgfQoKICB2b2lkIF9zZXQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewogICAgYXNzZXJ0KG5hbWUgPT0gX3ZhbGlkYXRlRmllbGQobmFtZSkpOwogICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG5ldyBMaXN0PFN0cmluZz4oKTsKICAgIF9oZWFkZXJzW25hbWVdID0gdmFsdWVzOwogICAgdmFsdWVzLmFkZCh2YWx1ZSk7CiAgfQoKICBfY2hlY2tNdXRhYmxlKCkgewogICAgaWYgKCFfbXV0YWJsZSkgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkhUVFAgaGVhZGVycyBhcmUgbm90IG11dGFibGUiKTsKICB9CgogIF91cGRhdGVIb3N0SGVhZGVyKCkgewogICAgYm9vbCBkZWZhdWx0UG9ydCA9IF9wb3J0ID09IG51bGwgfHwgX3BvcnQgPT0gX2RlZmF1bHRQb3J0Rm9yU2NoZW1lOwogICAgX3NldCgiaG9zdCIsIGRlZmF1bHRQb3J0ID8gaG9zdCA6ICIkaG9zdDokX3BvcnQiKTsKICB9CgogIF9mb2xkSGVhZGVyKFN0cmluZyBuYW1lKSB7CiAgICBpZiAobmFtZSA9PSBIdHRwSGVhZGVycy5zZXRDb29raWVIZWFkZXIgfHwKICAgICAgICAoX25vRm9sZGluZ0hlYWRlcnMgIT0gbnVsbCAmJiBfbm9Gb2xkaW5nSGVhZGVycy5pbmRleE9mKG5hbWUpICE9IC0xKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgX2ZpbmFsaXplKCkgewogICAgX211dGFibGUgPSBmYWxzZTsKICB9CgogIHZvaWQgX2J1aWxkKEJ5dGVzQnVpbGRlciBidWlsZGVyKSB7CiAgICBmb3IgKFN0cmluZyBuYW1lIGluIF9oZWFkZXJzLmtleXMpIHsKICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IF9oZWFkZXJzW25hbWVdOwogICAgICBib29sIGZvbGQgPSBfZm9sZEhlYWRlcihuYW1lKTsKICAgICAgdmFyIG5hbWVEYXRhID0gbmFtZS5jb2RlVW5pdHM7CiAgICAgIGJ1aWxkZXIuYWRkKG5hbWVEYXRhKTsKICAgICAgYnVpbGRlci5hZGRCeXRlKF9DaGFyQ29kZS5DT0xPTik7CiAgICAgIGJ1aWxkZXIuYWRkQnl0ZShfQ2hhckNvZGUuU1ApOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgaWYgKGZvbGQpIHsKICAgICAgICAgICAgYnVpbGRlci5hZGRCeXRlKF9DaGFyQ29kZS5DT01NQSk7CiAgICAgICAgICAgIGJ1aWxkZXIuYWRkQnl0ZShfQ2hhckNvZGUuU1ApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnVpbGRlci5hZGRCeXRlKF9DaGFyQ29kZS5DUik7CiAgICAgICAgICAgIGJ1aWxkZXIuYWRkQnl0ZShfQ2hhckNvZGUuTEYpOwogICAgICAgICAgICBidWlsZGVyLmFkZChuYW1lRGF0YSk7CiAgICAgICAgICAgIGJ1aWxkZXIuYWRkQnl0ZShfQ2hhckNvZGUuQ09MT04pOwogICAgICAgICAgICBidWlsZGVyLmFkZEJ5dGUoX0NoYXJDb2RlLlNQKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnVpbGRlci5hZGQodmFsdWVzW2ldLmNvZGVVbml0cyk7CiAgICAgIH0KICAgICAgYnVpbGRlci5hZGRCeXRlKF9DaGFyQ29kZS5DUik7CiAgICAgIGJ1aWxkZXIuYWRkQnl0ZShfQ2hhckNvZGUuTEYpOwogICAgfQogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgX2hlYWRlcnMuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKICAgICAgc2IuLndyaXRlKG5hbWUpLi53cml0ZSgiOiAiKTsKICAgICAgYm9vbCBmb2xkID0gX2ZvbGRIZWFkZXIobmFtZSk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGkgPiAwKSB7CiAgICAgICAgICBpZiAoZm9sZCkgewogICAgICAgICAgICBzYi53cml0ZSgiLCAiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNiLi53cml0ZSgiXG4iKS4ud3JpdGUobmFtZSkuLndyaXRlKCI6ICIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzYi53cml0ZSh2YWx1ZXNbaV0pOwogICAgICB9CiAgICAgIHNiLndyaXRlKCJcbiIpOwogICAgfSk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIExpc3Q8Q29va2llPiBfcGFyc2VDb29raWVzKCkgewogICAgLy8gUGFyc2UgYSBDb29raWUgaGVhZGVyIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcnVsZXMgaW4gUkZDIDYyNjUuCiAgICB2YXIgY29va2llcyA9IG5ldyBMaXN0PENvb2tpZT4oKTsKICAgIHZvaWQgcGFyc2VDb29raWVTdHJpbmcoU3RyaW5nIHMpIHsKICAgICAgaW50IGluZGV4ID0gMDsKCiAgICAgIGJvb2wgZG9uZSgpID0+IGluZGV4ID09IC0xIHx8IGluZGV4ID09IHMubGVuZ3RoOwoKICAgICAgdm9pZCBza2lwV1MoKSB7CiAgICAgICAgd2hpbGUgKCFkb25lKCkpIHsKICAgICAgICAgIGlmIChzW2luZGV4XSAhPSAiICIgJiYgc1tpbmRleF0gIT0gIlx0IikgcmV0dXJuOwogICAgICAgICAgaW5kZXgrKzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIFN0cmluZyBwYXJzZU5hbWUoKSB7CiAgICAgICAgaW50IHN0YXJ0ID0gaW5kZXg7CiAgICAgICAgd2hpbGUgKCFkb25lKCkpIHsKICAgICAgICAgIGlmIChzW2luZGV4XSA9PSAiICIgfHwgc1tpbmRleF0gPT0gIlx0IiB8fCBzW2luZGV4XSA9PSAiPSIpIGJyZWFrOwogICAgICAgICAgaW5kZXgrKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHMuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCk7CiAgICAgIH0KCiAgICAgIFN0cmluZyBwYXJzZVZhbHVlKCkgewogICAgICAgIGludCBzdGFydCA9IGluZGV4OwogICAgICAgIHdoaWxlICghZG9uZSgpKSB7CiAgICAgICAgICBpZiAoc1tpbmRleF0gPT0gIiAiIHx8IHNbaW5kZXhdID09ICJcdCIgfHwgc1tpbmRleF0gPT0gIjsiKSBicmVhazsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwogICAgICB9CgogICAgICBib29sIGV4cGVjdChTdHJpbmcgZXhwZWN0ZWQpIHsKICAgICAgICBpZiAoZG9uZSgpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKHNbaW5kZXhdICE9IGV4cGVjdGVkKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaW5kZXgrKzsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgd2hpbGUgKCFkb25lKCkpIHsKICAgICAgICBza2lwV1MoKTsKICAgICAgICBpZiAoZG9uZSgpKSByZXR1cm47CiAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJzZU5hbWUoKTsKICAgICAgICBza2lwV1MoKTsKICAgICAgICBpZiAoIWV4cGVjdCgiPSIpKSB7CiAgICAgICAgICBpbmRleCA9IHMuaW5kZXhPZignOycsIGluZGV4KTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBza2lwV1MoKTsKICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJzZVZhbHVlKCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvb2tpZXMuYWRkKG5ldyBfQ29va2llKG5hbWUsIHZhbHVlKSk7CiAgICAgICAgfSBjYXRjaCAoXykgewogICAgICAgICAgLy8gU2tpcCBpdCwgaW52YWxpZCBjb29raWUgZGF0YS4KICAgICAgICB9CiAgICAgICAgc2tpcFdTKCk7CiAgICAgICAgaWYgKGRvbmUoKSkgcmV0dXJuOwogICAgICAgIGlmICghZXhwZWN0KCI7IikpIHsKICAgICAgICAgIGluZGV4ID0gcy5pbmRleE9mKCc7JywgaW5kZXgpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IF9oZWFkZXJzW0h0dHBIZWFkZXJzLmNvb2tpZUhlYWRlcl07CiAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKICAgICAgdmFsdWVzLmZvckVhY2goKGhlYWRlclZhbHVlKSA9PiBwYXJzZUNvb2tpZVN0cmluZyhoZWFkZXJWYWx1ZSkpOwogICAgfQogICAgcmV0dXJuIGNvb2tpZXM7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF92YWxpZGF0ZUZpZWxkKFN0cmluZyBmaWVsZCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZC5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIV9IdHRwUGFyc2VyLl9pc1Rva2VuQ2hhcihmaWVsZC5jb2RlVW5pdEF0KGkpKSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICJJbnZhbGlkIEhUVFAgaGVhZGVyIGZpZWxkIG5hbWU6ICR7anNvbi5lbmNvZGUoZmllbGQpfSIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmllbGQudG9Mb3dlckNhc2UoKTsKICB9CgogIHN0YXRpYyBfdmFsaWRhdGVWYWx1ZSh2YWx1ZSkgewogICAgaWYgKHZhbHVlIGlzISBTdHJpbmcpIHJldHVybiB2YWx1ZTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFfSHR0cFBhcnNlci5faXNWYWx1ZUNoYXIodmFsdWUuY29kZVVuaXRBdChpKSkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAiSW52YWxpZCBIVFRQIGhlYWRlciBmaWVsZCB2YWx1ZTogJHtqc29uLmVuY29kZSh2YWx1ZSl9Iik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9Cn0KCmNsYXNzIF9IZWFkZXJWYWx1ZSBpbXBsZW1lbnRzIEhlYWRlclZhbHVlIHsKICBTdHJpbmcgX3ZhbHVlOwogIE1hcDxTdHJpbmcsIFN0cmluZz4gX3BhcmFtZXRlcnM7CiAgTWFwPFN0cmluZywgU3RyaW5nPiBfdW5tb2RpZmlhYmxlUGFyYW1ldGVyczsKCiAgX0hlYWRlclZhbHVlKFt0aGlzLl92YWx1ZSA9ICIiLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnNdKSB7CiAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIF9wYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+LmZyb20ocGFyYW1ldGVycyk7CiAgICB9CiAgfQoKICBzdGF0aWMgX0hlYWRlclZhbHVlIHBhcnNlKFN0cmluZyB2YWx1ZSwKICAgICAge3BhcmFtZXRlclNlcGFyYXRvcjogIjsiLAogICAgICB2YWx1ZVNlcGFyYXRvcjogbnVsbCwKICAgICAgcHJlc2VydmVCYWNrc2xhc2g6IGZhbHNlfSkgewogICAgLy8gUGFyc2UgdGhlIHN0cmluZy4KICAgIHZhciByZXN1bHQgPSBuZXcgX0hlYWRlclZhbHVlKCk7CiAgICByZXN1bHQuX3BhcnNlKHZhbHVlLCBwYXJhbWV0ZXJTZXBhcmF0b3IsIHZhbHVlU2VwYXJhdG9yLCBwcmVzZXJ2ZUJhY2tzbGFzaCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU3RyaW5nIGdldCB2YWx1ZSA9PiBfdmFsdWU7CgogIHZvaWQgX2Vuc3VyZVBhcmFtZXRlcnMoKSB7CiAgICBpZiAoX3BhcmFtZXRlcnMgPT0gbnVsbCkgewogICAgICBfcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwogICAgfQogIH0KCiAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXQgcGFyYW1ldGVycyB7CiAgICBfZW5zdXJlUGFyYW1ldGVycygpOwogICAgaWYgKF91bm1vZGlmaWFibGVQYXJhbWV0ZXJzID09IG51bGwpIHsKICAgICAgX3VubW9kaWZpYWJsZVBhcmFtZXRlcnMgPSBuZXcgVW5tb2RpZmlhYmxlTWFwVmlldyhfcGFyYW1ldGVycyk7CiAgICB9CiAgICByZXR1cm4gX3VubW9kaWZpYWJsZVBhcmFtZXRlcnM7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZShfdmFsdWUpOwogICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCAmJiBwYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgX3BhcmFtZXRlcnMuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewogICAgICAgIHNiLi53cml0ZSgiOyAiKS4ud3JpdGUobmFtZSkuLndyaXRlKCI9IikuLndyaXRlKHZhbHVlKTsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIHZvaWQgX3BhcnNlKFN0cmluZyBzLCBTdHJpbmcgcGFyYW1ldGVyU2VwYXJhdG9yLCBTdHJpbmcgdmFsdWVTZXBhcmF0b3IsCiAgICAgIGJvb2wgcHJlc2VydmVCYWNrc2xhc2gpIHsKICAgIGludCBpbmRleCA9IDA7CgogICAgYm9vbCBkb25lKCkgPT4gaW5kZXggPT0gcy5sZW5ndGg7CgogICAgdm9pZCBza2lwV1MoKSB7CiAgICAgIHdoaWxlICghZG9uZSgpKSB7CiAgICAgICAgaWYgKHNbaW5kZXhdICE9ICIgIiAmJiBzW2luZGV4XSAhPSAiXHQiKSByZXR1cm47CiAgICAgICAgaW5kZXgrKzsKICAgICAgfQogICAgfQoKICAgIFN0cmluZyBwYXJzZVZhbHVlKCkgewogICAgICBpbnQgc3RhcnQgPSBpbmRleDsKICAgICAgd2hpbGUgKCFkb25lKCkpIHsKICAgICAgICBpZiAoc1tpbmRleF0gPT0gIiAiIHx8CiAgICAgICAgICAgIHNbaW5kZXhdID09ICJcdCIgfHwKICAgICAgICAgICAgc1tpbmRleF0gPT0gdmFsdWVTZXBhcmF0b3IgfHwKICAgICAgICAgICAgc1tpbmRleF0gPT0gcGFyYW1ldGVyU2VwYXJhdG9yKSBicmVhazsKICAgICAgICBpbmRleCsrOwogICAgICB9CiAgICAgIHJldHVybiBzLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwogICAgfQoKICAgIHZvaWQgZXhwZWN0KFN0cmluZyBleHBlY3RlZCkgewogICAgICBpZiAoZG9uZSgpIHx8IHNbaW5kZXhdICE9IGV4cGVjdGVkKSB7CiAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBoZWFkZXIgdmFsdWUiKTsKICAgICAgfQogICAgICBpbmRleCsrOwogICAgfQoKICAgIHZvaWQgbWF5YmVFeHBlY3QoU3RyaW5nIGV4cGVjdGVkKSB7CiAgICAgIGlmIChzW2luZGV4XSA9PSBleHBlY3RlZCkgaW5kZXgrKzsKICAgIH0KCiAgICB2b2lkIHBhcnNlUGFyYW1ldGVycygpIHsKICAgICAgdmFyIHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKICAgICAgX3BhcmFtZXRlcnMgPSBuZXcgVW5tb2RpZmlhYmxlTWFwVmlldyhwYXJhbWV0ZXJzKTsKCiAgICAgIFN0cmluZyBwYXJzZVBhcmFtZXRlck5hbWUoKSB7CiAgICAgICAgaW50IHN0YXJ0ID0gaW5kZXg7CiAgICAgICAgd2hpbGUgKCFkb25lKCkpIHsKICAgICAgICAgIGlmIChzW2luZGV4XSA9PSAiICIgfHwKICAgICAgICAgICAgICBzW2luZGV4XSA9PSAiXHQiIHx8CiAgICAgICAgICAgICAgc1tpbmRleF0gPT0gIj0iIHx8CiAgICAgICAgICAgICAgc1tpbmRleF0gPT0gcGFyYW1ldGVyU2VwYXJhdG9yIHx8CiAgICAgICAgICAgICAgc1tpbmRleF0gPT0gdmFsdWVTZXBhcmF0b3IpIGJyZWFrOwogICAgICAgICAgaW5kZXgrKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHMuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCkudG9Mb3dlckNhc2UoKTsKICAgICAgfQoKICAgICAgU3RyaW5nIHBhcnNlUGFyYW1ldGVyVmFsdWUoKSB7CiAgICAgICAgaWYgKCFkb25lKCkgJiYgc1tpbmRleF0gPT0gIlwiIikgewogICAgICAgICAgLy8gUGFyc2UgcXVvdGVkIHZhbHVlLgogICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgIHdoaWxlICghZG9uZSgpKSB7CiAgICAgICAgICAgIGlmIChzW2luZGV4XSA9PSAiXFwiKSB7CiAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA9PSBzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBoZWFkZXIgdmFsdWUiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHByZXNlcnZlQmFja3NsYXNoICYmIHNbaW5kZXggKyAxXSAhPSAiXCIiKSB7CiAgICAgICAgICAgICAgICBzYi53cml0ZShzW2luZGV4XSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc1tpbmRleF0gPT0gIlwiIikgewogICAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2Iud3JpdGUoc1tpbmRleF0pOwogICAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFBhcnNlIG5vbi1xdW90ZWQgdmFsdWUuCiAgICAgICAgICB2YXIgdmFsID0gcGFyc2VWYWx1ZSgpOwogICAgICAgICAgcmV0dXJuIHZhbCA9PSAiIiA/IG51bGwgOiB2YWw7CiAgICAgICAgfQogICAgICB9CgogICAgICB3aGlsZSAoIWRvbmUoKSkgewogICAgICAgIHNraXBXUygpOwogICAgICAgIGlmIChkb25lKCkpIHJldHVybjsKICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlUGFyYW1ldGVyTmFtZSgpOwogICAgICAgIHNraXBXUygpOwogICAgICAgIGlmIChkb25lKCkpIHsKICAgICAgICAgIHBhcmFtZXRlcnNbbmFtZV0gPSBudWxsOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBtYXliZUV4cGVjdCgiPSIpOwogICAgICAgIHNraXBXUygpOwogICAgICAgIGlmIChkb25lKCkpIHsKICAgICAgICAgIHBhcmFtZXRlcnNbbmFtZV0gPSBudWxsOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJzZVBhcmFtZXRlclZhbHVlKCk7CiAgICAgICAgaWYgKG5hbWUgPT0gJ2NoYXJzZXQnICYmIHRoaXMgaXMgX0NvbnRlbnRUeXBlICYmIHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgIC8vIENoYXJzZXQgcGFyYW1ldGVyIG9mIENvbnRlbnRUeXBlcyBhcmUgYWx3YXlzIGxvd2VyLWNhc2UuCiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgfQogICAgICAgIHBhcmFtZXRlcnNbbmFtZV0gPSB2YWx1ZTsKICAgICAgICBza2lwV1MoKTsKICAgICAgICBpZiAoZG9uZSgpKSByZXR1cm47CiAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHN1cHBvcnQgZm9yIG11bHRpLXZhbHVlZCBwYXJhbWV0ZXJzLgogICAgICAgIGlmIChzW2luZGV4XSA9PSB2YWx1ZVNlcGFyYXRvcikgcmV0dXJuOwogICAgICAgIGV4cGVjdChwYXJhbWV0ZXJTZXBhcmF0b3IpOwogICAgICB9CiAgICB9CgogICAgc2tpcFdTKCk7CiAgICBfdmFsdWUgPSBwYXJzZVZhbHVlKCk7CiAgICBza2lwV1MoKTsKICAgIGlmIChkb25lKCkpIHJldHVybjsKICAgIG1heWJlRXhwZWN0KHBhcmFtZXRlclNlcGFyYXRvcik7CiAgICBwYXJzZVBhcmFtZXRlcnMoKTsKICB9Cn0KCmNsYXNzIF9Db250ZW50VHlwZSBleHRlbmRzIF9IZWFkZXJWYWx1ZSBpbXBsZW1lbnRzIENvbnRlbnRUeXBlIHsKICBTdHJpbmcgX3ByaW1hcnlUeXBlID0gIiI7CiAgU3RyaW5nIF9zdWJUeXBlID0gIiI7CgogIF9Db250ZW50VHlwZShTdHJpbmcgcHJpbWFyeVR5cGUsIFN0cmluZyBzdWJUeXBlLCBTdHJpbmcgY2hhcnNldCwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKQogICAgICA6IF9wcmltYXJ5VHlwZSA9IHByaW1hcnlUeXBlLAogICAgICAgIF9zdWJUeXBlID0gc3ViVHlwZSwKICAgICAgICBzdXBlcigiIikgewogICAgaWYgKF9wcmltYXJ5VHlwZSA9PSBudWxsKSBfcHJpbWFyeVR5cGUgPSAiIjsKICAgIGlmIChfc3ViVHlwZSA9PSBudWxsKSBfc3ViVHlwZSA9ICIiOwogICAgX3ZhbHVlID0gIiRfcHJpbWFyeVR5cGUvJF9zdWJUeXBlIjsKICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgX2Vuc3VyZVBhcmFtZXRlcnMoKTsKICAgICAgcGFyYW1ldGVycy5mb3JFYWNoKChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKICAgICAgICBTdHJpbmcgbG93ZXJDYXNlS2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgaWYgKGxvd2VyQ2FzZUtleSA9PSAiY2hhcnNldCIpIHsKICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcGFyYW1ldGVyc1tsb3dlckNhc2VLZXldID0gdmFsdWU7CiAgICAgIH0pOwogICAgfQogICAgaWYgKGNoYXJzZXQgIT0gbnVsbCkgewogICAgICBfZW5zdXJlUGFyYW1ldGVycygpOwogICAgICB0aGlzLl9wYXJhbWV0ZXJzWyJjaGFyc2V0Il0gPSBjaGFyc2V0LnRvTG93ZXJDYXNlKCk7CiAgICB9CiAgfQoKICBfQ29udGVudFR5cGUuXygpOwoKICBzdGF0aWMgX0NvbnRlbnRUeXBlIHBhcnNlKFN0cmluZyB2YWx1ZSkgewogICAgdmFyIHJlc3VsdCA9IG5ldyBfQ29udGVudFR5cGUuXygpOwogICAgcmVzdWx0Ll9wYXJzZSh2YWx1ZSwgIjsiLCBudWxsLCBmYWxzZSk7CiAgICBpbnQgaW5kZXggPSByZXN1bHQuX3ZhbHVlLmluZGV4T2YoIi8iKTsKICAgIGlmIChpbmRleCA9PSAtMSB8fCBpbmRleCA9PSAocmVzdWx0Ll92YWx1ZS5sZW5ndGggLSAxKSkgewogICAgICByZXN1bHQuX3ByaW1hcnlUeXBlID0gcmVzdWx0Ll92YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgcmVzdWx0Ll9zdWJUeXBlID0gIiI7CiAgICB9IGVsc2UgewogICAgICByZXN1bHQuX3ByaW1hcnlUeXBlID0KICAgICAgICAgIHJlc3VsdC5fdmFsdWUuc3Vic3RyaW5nKDAsIGluZGV4KS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgcmVzdWx0Ll9zdWJUeXBlID0gcmVzdWx0Ll92YWx1ZS5zdWJzdHJpbmcoaW5kZXggKyAxKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTdHJpbmcgZ2V0IG1pbWVUeXBlID0+ICckcHJpbWFyeVR5cGUvJHN1YlR5cGUnOwoKICBTdHJpbmcgZ2V0IHByaW1hcnlUeXBlID0+IF9wcmltYXJ5VHlwZTsKCiAgU3RyaW5nIGdldCBzdWJUeXBlID0+IF9zdWJUeXBlOwoKICBTdHJpbmcgZ2V0IGNoYXJzZXQgPT4gcGFyYW1ldGVyc1siY2hhcnNldCJdOwp9CgpjbGFzcyBfQ29va2llIGltcGxlbWVudHMgQ29va2llIHsKICBTdHJpbmcgX25hbWU7CiAgU3RyaW5nIF92YWx1ZTsKICBEYXRlVGltZSBleHBpcmVzOwogIGludCBtYXhBZ2U7CiAgU3RyaW5nIGRvbWFpbjsKICBTdHJpbmcgcGF0aDsKICBib29sIGh0dHBPbmx5ID0gZmFsc2U7CiAgYm9vbCBzZWN1cmUgPSBmYWxzZTsKCiAgX0Nvb2tpZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQogICAgICA6IF9uYW1lID0gX3ZhbGlkYXRlTmFtZShuYW1lKSwKICAgICAgICBfdmFsdWUgPSBfdmFsaWRhdGVWYWx1ZSh2YWx1ZSksCiAgICAgICAgaHR0cE9ubHkgPSB0cnVlOwoKICBTdHJpbmcgZ2V0IG5hbWUgPT4gX25hbWU7CiAgU3RyaW5nIGdldCB2YWx1ZSA9PiBfdmFsdWU7CgogIHNldCBuYW1lKFN0cmluZyBuZXdOYW1lKSB7CiAgICBfdmFsaWRhdGVOYW1lKG5ld05hbWUpOwogICAgX25hbWUgPSBuZXdOYW1lOwogIH0KCiAgc2V0IHZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewogICAgX3ZhbGlkYXRlVmFsdWUobmV3VmFsdWUpOwogICAgX3ZhbHVlID0gbmV3VmFsdWU7CiAgfQoKICBfQ29va2llLmZyb21TZXRDb29raWVWYWx1ZShTdHJpbmcgdmFsdWUpIHsKICAgIC8vIFBhcnNlIHRoZSAnc2V0LWNvb2tpZScgaGVhZGVyIHZhbHVlLgogICAgX3BhcnNlU2V0Q29va2llVmFsdWUodmFsdWUpOwogIH0KCiAgLy8gUGFyc2UgYSAnc2V0LWNvb2tpZScgaGVhZGVyIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcnVsZXMgaW4gUkZDIDYyNjUuCiAgdm9pZCBfcGFyc2VTZXRDb29raWVWYWx1ZShTdHJpbmcgcykgewogICAgaW50IGluZGV4ID0gMDsKCiAgICBib29sIGRvbmUoKSA9PiBpbmRleCA9PSBzLmxlbmd0aDsKCiAgICBTdHJpbmcgcGFyc2VOYW1lKCkgewogICAgICBpbnQgc3RhcnQgPSBpbmRleDsKICAgICAgd2hpbGUgKCFkb25lKCkpIHsKICAgICAgICBpZiAoc1tpbmRleF0gPT0gIj0iKSBicmVhazsKICAgICAgICBpbmRleCsrOwogICAgICB9CiAgICAgIHJldHVybiBzLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpLnRyaW0oKTsKICAgIH0KCiAgICBTdHJpbmcgcGFyc2VWYWx1ZSgpIHsKICAgICAgaW50IHN0YXJ0ID0gaW5kZXg7CiAgICAgIHdoaWxlICghZG9uZSgpKSB7CiAgICAgICAgaWYgKHNbaW5kZXhdID09ICI7IikgYnJlYWs7CiAgICAgICAgaW5kZXgrKzsKICAgICAgfQogICAgICByZXR1cm4gcy5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KS50cmltKCk7CiAgICB9CgogICAgdm9pZCBleHBlY3QoU3RyaW5nIGV4cGVjdGVkKSB7CiAgICAgIGlmIChkb25lKCkpIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgaGVhZGVyIHZhbHVlIFskc10iKTsKICAgICAgaWYgKHNbaW5kZXhdICE9IGV4cGVjdGVkKSB7CiAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBoZWFkZXIgdmFsdWUgWyRzXSIpOwogICAgICB9CiAgICAgIGluZGV4Kys7CiAgICB9CgogICAgdm9pZCBwYXJzZUF0dHJpYnV0ZXMoKSB7CiAgICAgIFN0cmluZyBwYXJzZUF0dHJpYnV0ZU5hbWUoKSB7CiAgICAgICAgaW50IHN0YXJ0ID0gaW5kZXg7CiAgICAgICAgd2hpbGUgKCFkb25lKCkpIHsKICAgICAgICAgIGlmIChzW2luZGV4XSA9PSAiPSIgfHwgc1tpbmRleF0gPT0gIjsiKSBicmVhazsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICB9CgogICAgICBTdHJpbmcgcGFyc2VBdHRyaWJ1dGVWYWx1ZSgpIHsKICAgICAgICBpbnQgc3RhcnQgPSBpbmRleDsKICAgICAgICB3aGlsZSAoIWRvbmUoKSkgewogICAgICAgICAgaWYgKHNbaW5kZXhdID09ICI7IikgYnJlYWs7CiAgICAgICAgICBpbmRleCsrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcy5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgfQoKICAgICAgd2hpbGUgKCFkb25lKCkpIHsKICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlQXR0cmlidXRlTmFtZSgpOwogICAgICAgIFN0cmluZyB2YWx1ZSA9ICIiOwogICAgICAgIGlmICghZG9uZSgpICYmIHNbaW5kZXhdID09ICI9IikgewogICAgICAgICAgaW5kZXgrKzsgLy8gU2tpcCB0aGUgPSBjaGFyYWN0ZXIuCiAgICAgICAgICB2YWx1ZSA9IHBhcnNlQXR0cmlidXRlVmFsdWUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKG5hbWUgPT0gImV4cGlyZXMiKSB7CiAgICAgICAgICBleHBpcmVzID0gSHR0cERhdGUuX3BhcnNlQ29va2llRGF0ZSh2YWx1ZSk7CiAgICAgICAgfSBlbHNlIGlmIChuYW1lID09ICJtYXgtYWdlIikgewogICAgICAgICAgbWF4QWdlID0gaW50LnBhcnNlKHZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gImRvbWFpbiIpIHsKICAgICAgICAgIGRvbWFpbiA9IHZhbHVlOwogICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAicGF0aCIpIHsKICAgICAgICAgIHBhdGggPSB2YWx1ZTsKICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gImh0dHBvbmx5IikgewogICAgICAgICAgaHR0cE9ubHkgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAic2VjdXJlIikgewogICAgICAgICAgc2VjdXJlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkb25lKCkpIGluZGV4Kys7IC8vIFNraXAgdGhlIDsgY2hhcmFjdGVyCiAgICAgIH0KICAgIH0KCiAgICBfbmFtZSA9IF92YWxpZGF0ZU5hbWUocGFyc2VOYW1lKCkpOwogICAgaWYgKGRvbmUoKSB8fCBfbmFtZS5sZW5ndGggPT0gMCkgewogICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIGhlYWRlciB2YWx1ZSBbJHNdIik7CiAgICB9CiAgICBpbmRleCsrOyAvLyBTa2lwIHRoZSA9IGNoYXJhY3Rlci4KICAgIF92YWx1ZSA9IF92YWxpZGF0ZVZhbHVlKHBhcnNlVmFsdWUoKSk7CiAgICBpZiAoZG9uZSgpKSByZXR1cm47CiAgICBpbmRleCsrOyAvLyBTa2lwIHRoZSA7IGNoYXJhY3Rlci4KICAgIHBhcnNlQXR0cmlidXRlcygpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2IuLndyaXRlKF9uYW1lKS4ud3JpdGUoIj0iKS4ud3JpdGUoX3ZhbHVlKTsKICAgIGlmIChleHBpcmVzICE9IG51bGwpIHsKICAgICAgc2IuLndyaXRlKCI7IEV4cGlyZXM9IikuLndyaXRlKEh0dHBEYXRlLmZvcm1hdChleHBpcmVzKSk7CiAgICB9CiAgICBpZiAobWF4QWdlICE9IG51bGwpIHsKICAgICAgc2IuLndyaXRlKCI7IE1heC1BZ2U9IikuLndyaXRlKG1heEFnZSk7CiAgICB9CiAgICBpZiAoZG9tYWluICE9IG51bGwpIHsKICAgICAgc2IuLndyaXRlKCI7IERvbWFpbj0iKS4ud3JpdGUoZG9tYWluKTsKICAgIH0KICAgIGlmIChwYXRoICE9IG51bGwpIHsKICAgICAgc2IuLndyaXRlKCI7IFBhdGg9IikuLndyaXRlKHBhdGgpOwogICAgfQogICAgaWYgKHNlY3VyZSkgc2Iud3JpdGUoIjsgU2VjdXJlIik7CiAgICBpZiAoaHR0cE9ubHkpIHNiLndyaXRlKCI7IEh0dHBPbmx5Iik7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIHN0YXRpYyBTdHJpbmcgX3ZhbGlkYXRlTmFtZShTdHJpbmcgbmV3TmFtZSkgewogICAgY29uc3Qgc2VwYXJhdG9ycyA9IGNvbnN0IFsKICAgICAgIigiLAogICAgICAiKSIsCiAgICAgICI8IiwKICAgICAgIj4iLAogICAgICAiQCIsCiAgICAgICIsIiwKICAgICAgIjsiLAogICAgICAiOiIsCiAgICAgICJcXCIsCiAgICAgICciJywKICAgICAgIi8iLAogICAgICAiWyIsCiAgICAgICJdIiwKICAgICAgIj8iLAogICAgICAiPSIsCiAgICAgICJ7IiwKICAgICAgIn0iCiAgICBdOwogICAgaWYgKG5ld05hbWUgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgibmFtZSIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdOYW1lLmxlbmd0aDsgaSsrKSB7CiAgICAgIGludCBjb2RlVW5pdCA9IG5ld05hbWUuY29kZVVuaXRzW2ldOwogICAgICBpZiAoY29kZVVuaXQgPD0gMzIgfHwKICAgICAgICAgIGNvZGVVbml0ID49IDEyNyB8fAogICAgICAgICAgc2VwYXJhdG9ycy5pbmRleE9mKG5ld05hbWVbaV0pID49IDApIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAiSW52YWxpZCBjaGFyYWN0ZXIgaW4gY29va2llIG5hbWUsIGNvZGUgdW5pdDogJyRjb2RlVW5pdCciLAogICAgICAgICAgICBuZXdOYW1lLAogICAgICAgICAgICBpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ld05hbWU7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF92YWxpZGF0ZVZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewogICAgaWYgKG5ld1ZhbHVlID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoInZhbHVlIik7CiAgICAvLyBQZXIgUkZDIDYyNjUsIGNvbnNpZGVyIHN1cnJvdW5kaW5nICIiIGFzIHBhcnQgb2YgdGhlIHZhbHVlLCBidXQgb3RoZXJ3aXNlCiAgICAvLyBkb3VibGUgcXVvdGVzIGFyZSBub3QgYWxsb3dlZC4KICAgIGludCBzdGFydCA9IDA7CiAgICBpbnQgZW5kID0gbmV3VmFsdWUubGVuZ3RoOwogICAgaWYgKDIgPD0gbmV3VmFsdWUubGVuZ3RoICYmCiAgICAgICAgbmV3VmFsdWUuY29kZVVuaXRzW3N0YXJ0XSA9PSAweDIyICYmCiAgICAgICAgbmV3VmFsdWUuY29kZVVuaXRzW2VuZCAtIDFdID09IDB4MjIpIHsKICAgICAgc3RhcnQrKzsKICAgICAgZW5kLS07CiAgICB9CgogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgaW50IGNvZGVVbml0ID0gbmV3VmFsdWUuY29kZVVuaXRzW2ldOwogICAgICBpZiAoIShjb2RlVW5pdCA9PSAweDIxIHx8CiAgICAgICAgICAoY29kZVVuaXQgPj0gMHgyMyAmJiBjb2RlVW5pdCA8PSAweDJCKSB8fAogICAgICAgICAgKGNvZGVVbml0ID49IDB4MkQgJiYgY29kZVVuaXQgPD0gMHgzQSkgfHwKICAgICAgICAgIChjb2RlVW5pdCA+PSAweDNDICYmIGNvZGVVbml0IDw9IDB4NUIpIHx8CiAgICAgICAgICAoY29kZVVuaXQgPj0gMHg1RCAmJiBjb2RlVW5pdCA8PSAweDdFKSkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhj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XTsKICAvLyBCeXRlcyBmb3IgIkhUVFAvMS4xIi4KICBzdGF0aWMgY29uc3QgSFRUUDExID0gY29uc3QgWzcyLCA4NCwgODQsIDgwLCA0NywgNDksIDQ2LCA0OV07CgogIHN0YXRpYyBjb25zdCBib29sIFQgPSB0cnVlOwogIHN0YXRpYyBjb25zdCBib29sIEYgPSBmYWxzZTsKICAvLyBMb29wdXAtbWFwIGZvciB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6ICcoKTw+QCw7OlxcIi9bXT89e30gXHQnLgogIHN0YXRpYyBjb25zdCBTRVBBUkFUT1JfTUFQID0gY29uc3QgWwogICAgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgVCwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgLy8KICAgIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIFQsIEYsIFQsIEYsIEYsIEYsIEYsIEYsIFQsIFQsIEYsIEYsIFQsIEYsIEYsIFQsIC8vCiAgICBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBULCBULCBULCBULCBULCBULCBULCBGLCBGLCBGLCBGLCBGLCBGLCBGLCAvLwogICAgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgVCwgVCwgVCwgRiwgRiwgLy8KICAgIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIC8vCiAgICBGLCBGLCBGLCBULCBGLCBULCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCAvLwogICAgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgLy8KICAgIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIC8vCiAgICBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCBGLCAvLwogICAgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgRiwgLy8KICAgIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYsIEYKICBdOwp9CgovLyBGcmVxdWVudGx5IHVzZWQgY2hhcmFjdGVyIGNvZGVzLgpjbGFzcyBfQ2hhckNvZGUgewogIHN0YXRpYyBjb25zdCBpbnQgSFQgPSA5OwogIHN0YXRpYyBjb25zdCBpbnQgTEYgPSAxMDsKICBzdGF0aWMgY29uc3QgaW50IENSID0gMTM7CiAgc3RhdGljIGNvbnN0IGludCBTUCA9IDMyOwogIHN0YXRpYyBjb25zdCBpbnQgQU1QRVJTQU5EID0gMzg7CiAgc3RhdGljIGNvbnN0IGludCBDT01NQSA9IDQ0OwogIHN0YXRpYyBjb25zdCBpbnQgREFTSCA9IDQ1OwogIHN0YXRpYyBjb25zdCBpbnQgU0xBU0ggPSA0NzsKICBzdGF0aWMgY29uc3QgaW50IFpFUk8gPSA0ODsKICBzdGF0aWMgY29uc3QgaW50IE9ORSA9IDQ5OwogIHN0YXRpYyBjb25zdCBpbnQgQ09MT04gPSA1ODsKICBzdGF0aWMgY29uc3QgaW50IFNFTUlfQ09MT04gPSA1OTsKICBzdGF0aWMgY29uc3QgaW50IEVRVUFMID0gNjE7Cn0KCi8vIFN0YXRlcyBvZiB0aGUgSFRUUCBwYXJzZXIgc3RhdGUgbWFjaGluZS4KY2xhc3MgX1N0YXRlIHsKICBzdGF0aWMgY29uc3QgaW50IFNUQVJUID0gMDsKICBzdGF0aWMgY29uc3QgaW50IE1FVEhPRF9PUl9SRVNQT05TRV9IVFRQX1ZFUlNJT04gPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgUkVTUE9OU0VfSFRUUF9WRVJTSU9OID0gMjsKICBzdGF0aWMgY29uc3QgaW50IFJFUVVFU1RfTElORV9NRVRIT0QgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgUkVRVUVTVF9MSU5FX1VSSSA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBSRVFVRVNUX0xJTkVfSFRUUF9WRVJTSU9OID0gNTsKICBzdGF0aWMgY29uc3QgaW50IFJFUVVFU1RfTElORV9FTkRJTkcgPSA2OwogIHN0YXRpYyBjb25zdCBpbnQgUkVTUE9OU0VfTElORV9TVEFUVVNfQ09ERSA9IDc7CiAgc3RhdGljIGNvbnN0IGludCBSRVNQT05TRV9MSU5FX1JFQVNPTl9QSFJBU0UgPSA4OwogIHN0YXRpYyBjb25zdCBpbnQgUkVTUE9OU0VfTElORV9FTkRJTkcgPSA5OwogIHN0YXRpYyBjb25zdCBpbnQgSEVBREVSX1NUQVJUID0gMTA7CiAgc3RhdGljIGNvbnN0IGludCBIRUFERVJfRklFTEQgPSAxMTsKICBzdGF0aWMgY29uc3QgaW50IEhFQURFUl9WQUxVRV9TVEFSVCA9IDEyOwogIHN0YXRpYyBjb25zdCBpbnQgSEVBREVSX1ZBTFVFID0gMTM7CiAgc3RhdGljIGNvbnN0IGludCBIRUFERVJfVkFMVUVfRk9MRElOR19PUl9FTkRJTkcgPSAxNDsKICBzdGF0aWMgY29uc3QgaW50IEhFQURFUl9WQUxVRV9GT0xEX09SX0VORCA9IDE1OwogIHN0YXRpYyBjb25zdCBpbnQgSEVBREVSX0VORElORyA9IDE2OwoKICBzdGF0aWMgY29uc3QgaW50IENIVU5LX1NJWkVfU1RBUlRJTkdfQ1IgPSAxNzsKICBzdGF0aWMgY29uc3QgaW50IENIVU5LX1NJWkVfU1RBUlRJTkdfTEYgPSAxODsKICBzdGF0aWMgY29uc3QgaW50IENIVU5LX1NJWkUgPSAxOTsKICBzdGF0aWMgY29uc3QgaW50IENIVU5LX1NJWkVfRVhURU5TSU9OID0gMjA7CiAgc3RhdGljIGNvbnN0IGludCBDSFVOS19TSVpFX0VORElORyA9IDIxOwogIHN0YXRpYyBjb25zdCBpbnQgQ0hVTktFRF9CT0RZX0RPTkVfQ1IgPSAyMjsKICBzdGF0aWMgY29uc3QgaW50IENIVU5LRURfQk9EWV9ET05FX0xGID0gMjM7CiAgc3RhdGljIGNvbnN0IGludCBCT0RZID0gMjQ7CiAgc3RhdGljIGNvbnN0IGludCBDTE9TRUQgPSAyNTsKICBzdGF0aWMgY29uc3QgaW50IFVQR1JBREVEID0gMjY7CiAgc3RhdGljIGNvbnN0IGludCBGQUlMVVJFID0gMjc7CgogIHN0YXRpYyBjb25zdCBpbnQgRklSU1RfQk9EWV9TVEFURSA9IENIVU5LX1NJWkVfU1RBUlRJTkdfQ1I7Cn0KCi8vIEhUVFAgdmVyc2lvbiBvZiB0aGUgcmVxdWVzdCBvciByZXNwb25zZSBiZWluZyBwYXJzZWQuCmNsYXNzIF9IdHRwVmVyc2lvbiB7CiAgc3RhdGljIGNvbnN0IGludCBVTkRFVEVSTUlORUQgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgSFRUUDEwID0gMTsKICBzdGF0aWMgY29uc3QgaW50IEhUVFAxMSA9IDI7Cn0KCi8vIFN0YXRlcyBvZiB0aGUgSFRUUCBwYXJzZXIgc3RhdGUgbWFjaGluZS4KY2xhc3MgX01lc3NhZ2VUeXBlIHsKICBzdGF0aWMgY29uc3QgaW50IFVOREVURVJNSU5FRCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBSRVFVRVNUID0gMTsKICBzdGF0aWMgY29uc3QgaW50IFJFU1BPTlNFID0gMDsKfQoKLyoqCiAqIFRoZSBfSHR0cERldGFjaGVkU3RyZWFtU3Vic2NyaXB0aW9uIHRha2VzIGEgc3Vic2NyaXB0aW9uIGFuZCBzb21lIGV4dHJhIGRhdGEsCiAqIGFuZCBtYWtlcyBpdCBwb3NzaWJsZSB0byAiaW5qZWN0IiB0aGUgZGF0YSBpbiBmcm9tIG9mIG90aGVyIGRhdGEgZXZlbnRzCiAqIGZyb20gdGhlIHN1YnNjcmlwdGlvbi4KICoKICogSXQgZG9lcyBzbyBieSBvdmVycmlkaW5nIHBhdXNlL3Jlc3VtZSwgc28gdGhhdCBvbmNlIHRoZQogKiBfSHR0cERldGFjaGVkU3RyZWFtU3Vic2NyaXB0aW9uIGlzIHJlc3VtZWQsIGl0J2xsIGRlbGl2ZXIgdGhlIGRhdGEgYmVmb3JlCiAqIHJlc3VtaW5nIHRoZSB1bmRlcmxheWluZyBzdWJzY3JpcHRpb24uCiAqLwpjbGFzcyBfSHR0cERldGFjaGVkU3RyZWFtU3Vic2NyaXB0aW9uIGltcGxlbWVudHMgU3RyZWFtU3Vic2NyaXB0aW9uPFVpbnQ4TGlzdD4gewogIFN0cmVhbVN1YnNjcmlwdGlvbjxVaW50OExpc3Q+IF9zdWJzY3JpcHRpb247CiAgVWludDhMaXN0IF9pbmplY3REYXRhOwogIGJvb2wgX2lzQ2FuY2VsZWQgPSBmYWxzZTsKICBpbnQgX3BhdXNlQ291bnQgPSAxOwogIEZ1bmN0aW9uIF91c2VyT25EYXRhOwogIGJvb2wgX3NjaGVkdWxlZCA9IGZhbHNlOwoKICBfSHR0cERldGFjaGVkU3RyZWFtU3Vic2NyaXB0aW9uKAogICAgICB0aGlzLl9zdWJzY3JpcHRpb24sIHRoaXMuX2luamVjdERhdGEsIHRoaXMuX3VzZXJPbkRhdGEpOwoKICBib29sIGdldCBpc1BhdXNlZCA9PiBfc3Vic2NyaXB0aW9uLmlzUGF1c2VkOwoKICBGdXR1cmU8VD4gYXNGdXR1cmU8VD4oW1QgZnV0dXJlVmFsdWVdKSA9PgogICAgICBfc3Vic2NyaXB0aW9uLmFzRnV0dXJlPFQ+KGZ1dHVyZVZhbHVlKTsKCiAgRnV0dXJlIGNhbmNlbCgpIHsKICAgIF9pc0NhbmNlbGVkID0gdHJ1ZTsKICAgIF9pbmplY3REYXRhID0gbnVsbDsKICAgIHJldHVybiBfc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogIH0KCiAgdm9pZCBvbkRhdGEodm9pZCBoYW5kbGVEYXRhKFVpbnQ4TGlzdCBkYXRhKSkgewogICAgX3VzZXJPbkRhdGEgPSBoYW5kbGVEYXRhOwogICAgX3N1YnNjcmlwdGlvbi5vbkRhdGEoaGFuZGxlRGF0YSk7CiAgfQoKICB2b2lkIG9uRG9uZSh2b2lkIGhhbmRsZURvbmUoKSkgewogICAgX3N1YnNjcmlwdGlvbi5vbkRvbmUoaGFuZGxlRG9uZSk7CiAgfQoKICB2b2lkIG9uRXJyb3IoRnVuY3Rpb24gaGFuZGxlRXJyb3IpIHsKICAgIF9zdWJzY3JpcHRpb24ub25FcnJvcihoYW5kbGVFcnJvcik7CiAgfQoKICB2b2lkIHBhdXNlKFtGdXR1cmUgcmVzdW1lU2lnbmFsXSkgewogICAgaWYgKF9pbmplY3REYXRhID09IG51bGwpIHsKICAgICAgX3N1YnNjcmlwdGlvbi5wYXVzZShyZXN1bWVTaWduYWwpOwogICAgfSBlbHNlIHsKICAgICAgX3BhdXNlQ291bnQrKzsKICAgICAgaWYgKHJlc3VtZVNpZ25hbCAhPSBudWxsKSB7CiAgICAgICAgcmVzdW1lU2lnbmFsLndoZW5Db21wbGV0ZShyZXN1bWUpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHJlc3VtZSgpIHsKICAgIGlmIChfaW5qZWN0RGF0YSA9PSBudWxsKSB7CiAgICAgIF9zdWJzY3JpcHRpb24ucmVzdW1lKCk7CiAgICB9IGVsc2UgewogICAgICBfcGF1c2VDb3VudC0tOwogICAgICBfbWF5YmVTY2hlZHVsZURhdGEoKTsKICAgIH0KICB9CgogIHZvaWQgX21heWJlU2NoZWR1bGVEYXRhKCkgewogICAgaWYgKF9zY2hlZHVsZWQpIHJldHVybjsKICAgIGlmIChfcGF1c2VDb3VudCAhPSAwKSByZXR1cm47CiAgICBfc2NoZWR1bGVkID0gdHJ1ZTsKICAgIHNjaGVkdWxlTWljcm90YXNrKCgpIHsKICAgICAgX3NjaGVkdWxlZCA9IGZhbHNlOwogICAgICBpZiAoX3BhdXNlQ291bnQgPiAwIHx8IF9pc0NhbmNlbGVkKSByZXR1cm47CiAgICAgIHZhciBkYXRhID0gX2luamVjdERhdGE7CiAgICAgIF9pbmplY3REYXRhID0gbnVsbDsKICAgICAgLy8gVG8gZW5zdXJlIHRoYXQgJ3N1YnNjcmlwdGlvbi5pc1BhdXNlZCcgaXMgZmFsc2UsIHdlIHJlc3VtZSB0aGUKICAgICAgLy8gc3Vic2NyaXB0aW9uIGhlcmUuIFRoaXMgaXMgZmluZSBhcyBwb3RlbnRpYWwgZXZlbnRzIGFyZSBkZWxheWVkLgogICAgICBfc3Vic2NyaXB0aW9uLnJlc3VtZSgpOwogICAgICBpZiAoX3VzZXJPbkRhdGEgIT0gbnVsbCkgewogICAgICAgIF91c2VyT25EYXRhKGRhdGEpOwogICAgICB9CiAgICB9KTsKICB9Cn0KCmNsYXNzIF9IdHRwRGV0YWNoZWRJbmNvbWluZyBleHRlbmRzIFN0cmVhbTxVaW50OExpc3Q+IHsKICBmaW5hbCBTdHJlYW1TdWJzY3JpcHRpb248VWludDhMaXN0PiBzdWJzY3JpcHRpb247CiAgZmluYWwgVWludDhMaXN0IGJ1ZmZlcmVkRGF0YTsKCiAgX0h0dHBEZXRhY2hlZEluY29taW5nKHRoaXMuc3Vic2NyaXB0aW9uLCB0aGlzLmJ1ZmZlcmVkRGF0YSk7CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxVaW50OExpc3Q+IGxpc3Rlbih2b2lkIG9uRGF0YShVaW50OExpc3QgZXZlbnQpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgaWYgKHN1YnNjcmlwdGlvbiAhPSBudWxsKSB7CiAgICAgIHN1YnNjcmlwdGlvbgogICAgICAgIC4ub25EYXRhKG9uRGF0YSkKICAgICAgICAuLm9uRXJyb3Iob25FcnJvcikKICAgICAgICAuLm9uRG9uZShvbkRvbmUpOwogICAgICBpZiAoYnVmZmVyZWREYXRhID09IG51bGwpIHsKICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uLi5yZXN1bWUoKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IF9IdHRwRGV0YWNoZWRTdHJlYW1TdWJzY3JpcHRpb24oCiAgICAgICAgICBzdWJzY3JpcHRpb24sIGJ1ZmZlcmVkRGF0YSwgb25EYXRhKQogICAgICAgIC4ucmVzdW1lKCk7CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKDI2Mzc5KTogYWRkIHRlc3QgZm9yIHRoaXMgYnJhbmNoLgogICAgICByZXR1cm4gbmV3IFN0cmVhbTxVaW50OExpc3Q+LmZyb21JdGVyYWJsZShbYnVmZmVyZWREYXRhXSkubGlzdGVuKG9uRGF0YSwKICAgICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICAgIH0KICB9Cn0KCi8qKgogKiBIVFRQIHBhcnNlciB3aGljaCBwYXJzZXMgdGhlIGRhdGEgc3RyZWFtIGdpdmVuIHRvIFtjb25zdW1lXS4KICoKICogSWYgYW4gSFRUUCBwYXJzZXIgZXJyb3Igb2NjdXJzLCB0aGUgcGFyc2VyIHdpbGwgc2lnbmFsIGFuIGVycm9yIHRvIGVpdGhlcgogKiB0aGUgY3VycmVudCBfSHR0cEluY29taW5nIG9yIHRoZSBfcGFyc2VyIGl0c2VsZi4KICoKICogVGhlIGNvbm5lY3Rpb24gdXBncmFkZXMgKGUuZy4gc3dpdGNoaW5nIGZyb20gSFRUUC8xLjEgdG8gdGhlCiAqIFdlYlNvY2tldCBwcm90b2NvbCkgaXMgaGFuZGxlZCBpbiBhIHNwZWNpYWwgd2F5LiBJZiBjb25uZWN0aW9uCiAqIHVwZ3JhZGUgaXMgc3BlY2lmaWVkIGluIHRoZSBoZWFkZXJzLCB0aGVuIG9uIHRoZSBjYWxsYmFjayB0bwogKiBbOnJlc3BvbnNlU3RhcnQ6XSB0aGUgWzp1cGdyYWRlOl0gcHJvcGVydHkgb24gdGhlIFs6SHR0cFBhcnNlcjpdCiAqIG9iamVjdCB3aWxsIGJlIFs6dHJ1ZTpdIGluZGljYXRpbmcgdGhhdCBmcm9tIG5vdyBvbiB0aGUgcHJvdG9jb2wgaXMKICogbm90IEhUVFAgYW55bW9yZSBhbmQgbm8gbW9yZSBjYWxsYmFja3Mgd2lsbCBoYXBwZW4sIHRoYXQgaXMKICogWzpkYXRhUmVjZWl2ZWQ6XSBhbmQgWzpkYXRhRW5kOl0gYXJlIG5vdCBjYWxsZWQgaW4gdGhpcyBjYXNlIGFzCiAqIHRoZXJlIGlzIG5vIG1vcmUgSFRUUCBkYXRhLiBBZnRlciB0aGUgdXBncmFkZSB0aGUgbWV0aG9kCiAqIFs6cmVhZFVucGFyc2VkRGF0YTpdIGNhbiBiZSB1c2VkIHRvIHJlYWQgYW55IHJlbWFpbmluZyBieXRlcyBpbiB0aGUKICogSFRUUCBwYXJzZXIgd2hpY2ggYXJlIHBhcnQgb2YgdGhlIHByb3RvY29sIHRoZSBjb25uZWN0aW9uIGlzCiAqIHVwZ3JhZGluZyB0by4gVGhlc2UgYnl0ZXMgY2Fubm90IGJlIHByb2Nlc3NlZCBieSB0aGUgSFRUUCBwYXJzZXIKICogYW5kIHNob3VsZCBiZSBoYW5kbGVkIGFjY29yZGluZyB0byB3aGF0ZXZlciBwcm90b2NvbCBpcyBiZWluZwogKiB1cGdyYWRlZCB0by4KICovCmNsYXNzIF9IdHRwUGFyc2VyIGV4dGVuZHMgU3RyZWFtPF9IdHRwSW5jb21pbmc+IHsKICAvLyBTdGF0ZS4KICBib29sIF9wYXJzZXJDYWxsZWQgPSBmYWxzZTsKCiAgLy8gVGhlIGRhdGEgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgcGFyc2VkLgogIFVpbnQ4TGlzdCBfYnVmZmVyOwogIGludCBfaW5kZXg7CgogIGZpbmFsIGJvb2wgX3JlcXVlc3RQYXJzZXI7CiAgaW50IF9zdGF0ZTsKICBpbnQgX2h0dHBWZXJzaW9uSW5kZXg7CiAgaW50IF9tZXNzYWdlVHlwZTsKICBpbnQgX3N0YXR1c0NvZGUgPSAwOwogIGludCBfc3RhdHVzQ29kZUxlbmd0aCA9IDA7CiAgZmluYWwgTGlzdDxpbnQ+IF9tZXRob2QgPSBbXTsKICBmaW5hbCBMaXN0PGludD4gX3VyaV9vcl9yZWFzb25fcGhyYXNlID0gW107CiAgZmluYWwgTGlzdDxpbnQ+IF9oZWFkZXJGaWVsZCA9IFtdOwogIGZpbmFsIExpc3Q8aW50PiBfaGVhZGVyVmFsdWUgPSBbXTsKCiAgaW50IF9odHRwVmVyc2lvbjsKICBpbnQgX3RyYW5zZmVyTGVuZ3RoID0gLTE7CiAgYm9vbCBfcGVyc2lzdGVudENvbm5lY3Rpb247CiAgYm9vbCBfY29ubmVjdGlvblVwZ3JhZGU7CiAgYm9vbCBfY2h1bmtlZDsKCiAgYm9vbCBfbm9NZXNzYWdlQm9keSA9IGZhbHNlOwogIGludCBfcmVtYWluaW5nQ29udGVudCA9IC0xOwoKICBfSHR0cEhlYWRlcnMgX2hlYWRlcnM7CgogIC8vIFRoZSBjdXJyZW50IGluY29taW5nIGNvbm5lY3Rpb24uCiAgX0h0dHBJbmNvbWluZyBfaW5jb21pbmc7CiAgU3RyZWFtU3Vic2NyaXB0aW9uPFVpbnQ4TGlzdD4gX3NvY2tldFN1YnNjcmlwdGlvbjsKICBib29sIF9wYXVzZWQgPSB0cnVlOwogIGJvb2wgX2JvZHlQYXVzZWQgPSBmYWxzZTsKICBTdHJlYW1Db250cm9sbGVyPF9IdHRwSW5jb21pbmc+IF9jb250cm9sbGVyOwogIFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PiBfYm9keUNvbnRyb2xsZXI7CgogIGZhY3RvcnkgX0h0dHBQYXJzZXIucmVxdWVzdFBhcnNlcigpIHsKICAgIHJldHVybiBuZXcgX0h0dHBQYXJzZXIuXyh0cnVlKTsKICB9CgogIGZhY3RvcnkgX0h0dHBQYXJzZXIucmVzcG9uc2VQYXJzZXIoKSB7CiAgICByZXR1cm4gbmV3IF9IdHRwUGFyc2VyLl8oZmFsc2UpOwogIH0KCiAgX0h0dHBQYXJzZXIuXyh0aGlzLl9yZXF1ZXN0UGFyc2VyKSB7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPF9IdHRwSW5jb21pbmc+KAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46ICgpIHsKICAgICAgICAgIF9wYXVzZWQgPSBmYWxzZTsKICAgICAgICB9LAogICAgICAgIG9uUGF1c2U6ICgpIHsKICAgICAgICAgIF9wYXVzZWQgPSB0cnVlOwogICAgICAgICAgX3BhdXNlU3RhdGVDaGFuZ2VkKCk7CiAgICAgICAgfSwKICAgICAgICBvblJlc3VtZTogKCkgewogICAgICAgICAgX3BhdXNlZCA9IGZhbHNlOwogICAgICAgICAgX3BhdXNlU3RhdGVDaGFuZ2VkKCk7CiAgICAgICAgfSwKICAgICAgICBvbkNhbmNlbDogKCkgewogICAgICAgICAgaWYgKF9zb2NrZXRTdWJzY3JpcHRpb24gIT0gbnVsbCkgewogICAgICAgICAgICBfc29ja2V0U3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgX3Jlc2V0KCk7CiAgfQoKICBTdHJlYW1TdWJzY3JpcHRpb248X0h0dHBJbmNvbWluZz4gbGlzdGVuKHZvaWQgb25EYXRhKF9IdHRwSW5jb21pbmcgZXZlbnQpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgcmV0dXJuIF9jb250cm9sbGVyLnN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIHZvaWQgbGlzdGVuVG9TdHJlYW0oU3RyZWFtPFVpbnQ4TGlzdD4gc3RyZWFtKSB7CiAgICAvLyBMaXN0ZW4gdG8gdGhlIHN0cmVhbSBhbmQgaGFuZGxlIGRhdGEgYWNjb3JkaW5nbHkuIFdoZW4gYQogICAgLy8gX0h0dHBJbmNvbWluZyBpcyBjcmVhdGVkLCBfZGF0YVBhdXNlLCBfZGF0YVJlc3VtZSwgX2RhdGFEb25lIGlzCiAgICAvLyBnaXZlbiB0byBwcm92aWRlIGEgd2F5IG9mIGNvbnRyb2xsaW5nIHRoZSBwYXJzZXIuCiAgICAvLyBUT0RPKGFqb2huc2VuKTogUmVtb3ZlIF9kYXRhUGF1c2UsIF9kYXRhUmVzdW1lIGFuZCBfZGF0YURvbmUgYW5kIGNsZWFuIHVwCiAgICAvLyBob3cgdGhlIF9IdHRwSW5jb21pbmcgc2lnbmFscyB0aGUgcGFyc2VyLgogICAgX3NvY2tldFN1YnNjcmlwdGlvbiA9CiAgICAgICAgc3RyZWFtLmxpc3Rlbihfb25EYXRhLCBvbkVycm9yOiBfY29udHJvbGxlci5hZGRFcnJvciwgb25Eb25lOiBfb25Eb25lKTsKICB9CgogIHZvaWQgX3BhcnNlKCkgewogICAgdHJ5IHsKICAgICAgX2RvUGFyc2UoKTsKICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgX3N0YXRlID0gX1N0YXRlLkZBSUxVUkU7CiAgICAgIF9yZXBvcnRFcnJvcihlLCBzKTsKICAgIH0KICB9CgogIC8vIFByb2Nlc3MgZW5kIG9mIGhlYWRlcnMuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFyc2VyIHNob3VsZCBzdG9wCiAgLy8gcGFyc2luZyBhbmQgcmV0dXJuLiBUaGlzIHdpbGwgYmUgaW4gY2FzZSBvZiBlaXRoZXIgYW4gdXBncmFkZQogIC8vIHJlcXVlc3Qgb3IgYSByZXF1ZXN0IG9yIHJlc3BvbnNlIHdpdGggYW4gZW1wdHkgYm9keS4KICBib29sIF9oZWFkZXJzRW5kKCkgewogICAgX2hlYWRlcnMuX211dGFibGUgPSBmYWxzZTsKCiAgICBfdHJhbnNmZXJMZW5ndGggPSBfaGVhZGVycy5jb250ZW50TGVuZ3RoOwogICAgLy8gSWdub3JlIHRoZSBDb250ZW50LUxlbmd0aCBoZWFkZXIgaWYgVHJhbnNmZXItRW5jb2RpbmcKICAgIC8vIGlzIGNodW5rZWQgKFJGQyAyNjE2IHNlY3Rpb24gNC40KQogICAgaWYgKF9jaHVua2VkKSBfdHJhbnNmZXJMZW5ndGggPSAtMTsKCiAgICAvLyBJZiBhIHJlcXVlc3QgbWVzc2FnZSBoYXMgbmVpdGhlciBDb250ZW50LUxlbmd0aCBub3IKICAgIC8vIFRyYW5zZmVyLUVuY29kaW5nIHRoZSBtZXNzYWdlIG11c3Qgbm90IGhhdmUgYSBib2R5IChSRkMKICAgIC8vIDI2MTYgc2VjdGlvbiA0LjMpLgogICAgaWYgKF9tZXNzYWdlVHlwZSA9PSBfTWVzc2FnZVR5cGUuUkVRVUVTVCAmJgogICAgICAgIF90cmFuc2Zlckxlbmd0aCA8IDAgJiYKICAgICAgICBfY2h1bmtlZCA9PSBmYWxzZSkgewogICAgICBfdHJhbnNmZXJMZW5ndGggPSAwOwogICAgfQogICAgaWYgKF9jb25uZWN0aW9uVXBncmFkZSkgewogICAgICBfc3RhdGUgPSBfU3RhdGUuVVBHUkFERUQ7CiAgICAgIF90cmFuc2Zlckxlbmd0aCA9IDA7CiAgICB9CiAgICBfY3JlYXRlSW5jb21pbmcoX3RyYW5zZmVyTGVuZ3RoKTsKICAgIGlmIChfcmVxdWVzdFBhcnNlcikgewogICAgICBfaW5jb21pbmcubWV0aG9kID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKF9tZXRob2QpOwogICAgICBfaW5jb21pbmcudXJpID0KICAgICAgICAgIFVyaS5wYXJzZShuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoX3VyaV9vcl9yZWFzb25fcGhyYXNlKSk7CiAgICB9IGVsc2UgewogICAgICBfaW5jb21pbmcuc3RhdHVzQ29kZSA9IF9zdGF0dXNDb2RlOwogICAgICBfaW5jb21pbmcucmVhc29uUGhyYXNlID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKF91cmlfb3JfcmVhc29uX3BocmFzZSk7CiAgICB9CiAgICBfbWV0aG9kLmNsZWFyKCk7CiAgICBfdXJpX29yX3JlYXNvbl9waHJhc2UuY2xlYXIoKTsKICAgIGlmIChfY29ubmVjdGlvblVwZ3JhZGUpIHsKICAgICAgX2luY29taW5nLnVwZ3JhZGVkID0gdHJ1ZTsKICAgICAgX3BhcnNlckNhbGxlZCA9IGZhbHNlOwogICAgICB2YXIgdG1wID0gX2luY29taW5nOwogICAgICBfY2xvc2VJbmNvbWluZygpOwogICAgICBfY29udHJvbGxlci5hZGQodG1wKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoX3RyYW5zZmVyTGVuZ3RoID09IDAgfHwKICAgICAgICAoX21lc3NhZ2VUeXBlID09IF9NZXNzYWdlVHlwZS5SRVNQT05TRSAmJiBfbm9NZXNzYWdlQm9keSkpIHsKICAgICAgX3Jlc2V0KCk7CiAgICAgIHZhciB0bXAgPSBfaW5jb21pbmc7CiAgICAgIF9jbG9zZUluY29taW5nKCk7CiAgICAgIF9jb250cm9sbGVyLmFkZCh0bXApOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgaWYgKF9jaHVua2VkKSB7CiAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5DSFVOS19TSVpFOwogICAgICBfcmVtYWluaW5nQ29udGVudCA9IDA7CiAgICB9IGVsc2UgaWYgKF90cmFuc2Zlckxlbmd0aCA+IDApIHsKICAgICAgX3JlbWFpbmluZ0NvbnRlbnQgPSBfdHJhbnNmZXJMZW5ndGg7CiAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5CT0RZOwogICAgfSBlbHNlIHsKICAgICAgLy8gTmVpdGhlciBjaHVua2VkIG5vciBjb250ZW50IGxlbmd0aC4gRW5kIG9mIGJvZHkKICAgICAgLy8gaW5kaWNhdGVkIGJ5IGNsb3NlLgogICAgICBfc3RhdGUgPSBfU3RhdGUuQk9EWTsKICAgIH0KICAgIF9wYXJzZXJDYWxsZWQgPSBmYWxzZTsKICAgIF9jb250cm9sbGVyLmFkZChfaW5jb21pbmcpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLyBGcm9tIFJGQyAyNjE2LgogIC8vIGdlbmVyaWMtbWVzc2FnZSA9IHN0YXJ0LWxpbmUKICAvLyAgICAgICAgICAgICAgICAgICAqKG1lc3NhZ2UtaGVhZGVyIENSTEYpCiAgLy8gICAgICAgICAgICAgICAgICAgQ1JMRgogIC8vICAgICAgICAgICAgICAgICAgIFsgbWVzc2FnZS1ib2R5IF0KICAvLyBzdGFydC1saW5lICAgICAgPSBSZXF1ZXN0LUxpbmUgfCBTdGF0dXMtTGluZQogIC8vIFJlcXVlc3QtTGluZSAgICA9IE1ldGhvZCBTUCBSZXF1ZXN0LVVSSSBTUCBIVFRQLVZlcnNpb24gQ1JMRgogIC8vIFN0YXR1cy1MaW5lICAgICA9IEhUVFAtVmVyc2lvbiBTUCBTdGF0dXMtQ29kZSBTUCBSZWFzb24tUGhyYXNlIENSTEYKICAvLyBtZXNzYWdlLWhlYWRlciAgPSBmaWVsZC1uYW1lICI6IiBbIGZpZWxkLXZhbHVlIF0KICB2b2lkIF9kb1BhcnNlKCkgewogICAgYXNzZXJ0KCFfcGFyc2VyQ2FsbGVkKTsKICAgIF9wYXJzZXJDYWxsZWQgPSB0cnVlOwogICAgaWYgKF9zdGF0ZSA9PSBfU3RhdGUuQ0xPU0VEKSB7CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJEYXRhIG9uIGNsb3NlZCBjb25uZWN0aW9uIik7CiAgICB9CiAgICBpZiAoX3N0YXRlID09IF9TdGF0ZS5GQUlMVVJFKSB7CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJEYXRhIG9uIGZhaWxlZCBjb25uZWN0aW9uIik7CiAgICB9CiAgICB3aGlsZSAoX2J1ZmZlciAhPSBudWxsICYmCiAgICAgICAgX2luZGV4IDwgX2J1ZmZlci5sZW5ndGggJiYKICAgICAgICBfc3RhdGUgIT0gX1N0YXRlLkZBSUxVUkUgJiYKICAgICAgICBfc3RhdGUgIT0gX1N0YXRlLlVQR1JBREVEKSB7CiAgICAgIC8vIERlcGVuZGluZyBvbiBfaW5jb21pbmcsIHdlIGVpdGhlciBicmVhayBvbiBfYm9keVBhdXNlZCBvciBfcGF1c2VkLgogICAgICBpZiAoKF9pbmNvbWluZyAhPSBudWxsICYmIF9ib2R5UGF1c2VkKSB8fAogICAgICAgICAgKF9pbmNvbWluZyA9PSBudWxsICYmIF9wYXVzZWQpKSB7CiAgICAgICAgX3BhcnNlckNhbGxlZCA9IGZhbHNlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpbnQgYnl0ZSA9IF9idWZmZXJbX2luZGV4KytdOwogICAgICBzd2l0Y2ggKF9zdGF0ZSkgewogICAgICAgIGNhc2UgX1N0YXRlLlNUQVJUOgogICAgICAgICAgaWYgKGJ5dGUgPT0gX0NvbnN0LkhUVFBbMF0pIHsKICAgICAgICAgICAgLy8gU3RhcnQgcGFyc2luZyBtZXRob2Qgb3IgSFRUUCB2ZXJzaW9uLgogICAgICAgICAgICBfaHR0cFZlcnNpb25JbmRleCA9IDE7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5NRVRIT0RfT1JfUkVTUE9OU0VfSFRUUF9WRVJTSU9OOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU3RhcnQgcGFyc2luZyBtZXRob2QuCiAgICAgICAgICAgIGlmICghX2lzVG9rZW5DaGFyKGJ5dGUpKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkludmFsaWQgcmVxdWVzdCBtZXRob2QiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfbWV0aG9kLmFkZChieXRlKTsKICAgICAgICAgICAgaWYgKCFfcmVxdWVzdFBhcnNlcikgewogICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIHJlc3BvbnNlIGxpbmUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuUkVRVUVTVF9MSU5FX01FVEhPRDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5NRVRIT0RfT1JfUkVTUE9OU0VfSFRUUF9WRVJTSU9OOgogICAgICAgICAgaWYgKF9odHRwVmVyc2lvbkluZGV4IDwgX0NvbnN0LkhUVFAubGVuZ3RoICYmCiAgICAgICAgICAgICAgYnl0ZSA9PSBfQ29uc3QuSFRUUFtfaHR0cFZlcnNpb25JbmRleF0pIHsKICAgICAgICAgICAgLy8gQ29udGludWUgcGFyc2luZyBIVFRQIHZlcnNpb24uCiAgICAgICAgICAgIF9odHRwVmVyc2lvbkluZGV4Kys7CiAgICAgICAgICB9IGVsc2UgaWYgKF9odHRwVmVyc2lvbkluZGV4ID09IF9Db25zdC5IVFRQLmxlbmd0aCAmJgogICAgICAgICAgICAgIGJ5dGUgPT0gX0NoYXJDb2RlLlNMQVNIKSB7CiAgICAgICAgICAgIC8vIEhUVFAvIHBhcnNlZC4gQXMgbWV0aG9kIGlzIGEgdG9rZW4gdGhpcyBjYW5ub3QgYmUgYQogICAgICAgICAgICAvLyBtZXRob2QgYW55bW9yZS4KICAgICAgICAgICAgX2h0dHBWZXJzaW9uSW5kZXgrKzsKICAgICAgICAgICAgaWYgKF9yZXF1ZXN0UGFyc2VyKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkludmFsaWQgcmVxdWVzdCBsaW5lIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLlJFU1BPTlNFX0hUVFBfVkVSU0lPTjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIERpZCBub3QgcGFyc2UgSFRUUCB2ZXJzaW9uLiBFeHBlY3QgbWV0aG9kIGluc3RlYWQuCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2h0dHBWZXJzaW9uSW5kZXg7IGkrKykgewogICAgICAgICAgICAgIF9tZXRob2QuYWRkKF9Db25zdC5IVFRQW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuU1ApIHsKICAgICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuUkVRVUVTVF9MSU5FX1VSSTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfbWV0aG9kLmFkZChieXRlKTsKICAgICAgICAgICAgICBfaHR0cFZlcnNpb24gPSBfSHR0cFZlcnNpb24uVU5ERVRFUk1JTkVEOwogICAgICAgICAgICAgIGlmICghX3JlcXVlc3RQYXJzZXIpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIHJlc3BvbnNlIGxpbmUiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLlJFUVVFU1RfTElORV9NRVRIT0Q7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5SRVNQT05TRV9IVFRQX1ZFUlNJT046CiAgICAgICAgICBpZiAoX2h0dHBWZXJzaW9uSW5kZXggPCBfQ29uc3QuSFRUUDFET1QubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIENvbnRpbnVlIHBhcnNpbmcgSFRUUCB2ZXJzaW9uLgogICAgICAgICAgICBfZXhwZWN0KGJ5dGUsIF9Db25zdC5IVFRQMURPVFtfaHR0cFZlcnNpb25JbmRleF0pOwogICAgICAgICAgICBfaHR0cFZlcnNpb25JbmRleCsrOwogICAgICAgICAgfSBlbHNlIGlmIChfaHR0cFZlcnNpb25JbmRleCA9PSBfQ29uc3QuSFRUUDFET1QubGVuZ3RoICYmCiAgICAgICAgICAgICAgYnl0ZSA9PSBfQ2hhckNvZGUuT05FKSB7CiAgICAgICAgICAgIC8vIEhUVFAvMS4xIHBhcnNlZC4KICAgICAgICAgICAgX2h0dHBWZXJzaW9uID0gX0h0dHBWZXJzaW9uLkhUVFAxMTsKICAgICAgICAgICAgX3BlcnNpc3RlbnRDb25uZWN0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgX2h0dHBWZXJzaW9uSW5kZXgrKzsKICAgICAgICAgIH0gZWxzZSBpZiAoX2h0dHBWZXJzaW9uSW5kZXggPT0gX0NvbnN0LkhUVFAxRE9ULmxlbmd0aCAmJgogICAgICAgICAgICAgIGJ5dGUgPT0gX0NoYXJDb2RlLlpFUk8pIHsKICAgICAgICAgICAgLy8gSFRUUC8xLjAgcGFyc2VkLgogICAgICAgICAgICBfaHR0cFZlcnNpb24gPSBfSHR0cFZlcnNpb24uSFRUUDEwOwogICAgICAgICAgICBfcGVyc2lzdGVudENvbm5lY3Rpb24gPSBmYWxzZTsKICAgICAgICAgICAgX2h0dHBWZXJzaW9uSW5kZXgrKzsKICAgICAgICAgIH0gZWxzZSBpZiAoX2h0dHBWZXJzaW9uSW5kZXggPT0gX0NvbnN0LkhUVFAxRE9ULmxlbmd0aCArIDEpIHsKICAgICAgICAgICAgX2V4cGVjdChieXRlLCBfQ2hhckNvZGUuU1ApOwogICAgICAgICAgICAvLyBIVFRQIHZlcnNpb24gcGFyc2VkLgogICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuUkVTUE9OU0VfTElORV9TVEFUVVNfQ09ERTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIHJlc3BvbnNlIGxpbmUiKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5SRVFVRVNUX0xJTkVfTUVUSE9EOgogICAgICAgICAgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLlNQKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5SRVFVRVNUX0xJTkVfVVJJOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKF9Db25zdC5TRVBBUkFUT1JfTUFQW2J5dGVdIHx8CiAgICAgICAgICAgICAgICBieXRlID09IF9DaGFyQ29kZS5DUiB8fAogICAgICAgICAgICAgICAgYnl0ZSA9PSBfQ2hhckNvZGUuTEYpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCByZXF1ZXN0IG1ldGhvZCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9tZXRob2QuYWRkKGJ5dGUpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLlJFUVVFU1RfTElORV9VUkk6CiAgICAgICAgICBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuU1ApIHsKICAgICAgICAgICAgaWYgKF91cmlfb3JfcmVhc29uX3BocmFzZS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIHJlcXVlc3QgVVJJIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLlJFUVVFU1RfTElORV9IVFRQX1ZFUlNJT047CiAgICAgICAgICAgIF9odHRwVmVyc2lvbkluZGV4ID0gMDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChieXRlID09IF9DaGFyQ29kZS5DUiB8fCBieXRlID09IF9DaGFyQ29kZS5MRikgewogICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIHJlcXVlc3QgVVJJIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3VyaV9vcl9yZWFzb25fcGhyYXNlLmFkZChieXRlKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5SRVFVRVNUX0xJTkVfSFRUUF9WRVJTSU9OOgogICAgICAgICAgaWYgKF9odHRwVmVyc2lvbkluZGV4IDwgX0NvbnN0LkhUVFAxRE9ULmxlbmd0aCkgewogICAgICAgICAgICBfZXhwZWN0KGJ5dGUsIF9Db25zdC5IVFRQMTFbX2h0dHBWZXJzaW9uSW5kZXhdKTsKICAgICAgICAgICAgX2h0dHBWZXJzaW9uSW5kZXgrKzsKICAgICAgICAgIH0gZWxzZSBpZiAoX2h0dHBWZXJzaW9uSW5kZXggPT0gX0NvbnN0LkhUVFAxRE9ULmxlbmd0aCkgewogICAgICAgICAgICBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuT05FKSB7CiAgICAgICAgICAgICAgLy8gSFRUUC8xLjEgcGFyc2VkLgogICAgICAgICAgICAgIF9odHRwVmVyc2lvbiA9IF9IdHRwVmVyc2lvbi5IVFRQMTE7CiAgICAgICAgICAgICAgX3BlcnNpc3RlbnRDb25uZWN0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICBfaHR0cFZlcnNpb25JbmRleCsrOwogICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLlpFUk8pIHsKICAgICAgICAgICAgICAvLyBIVFRQLzEuMCBwYXJzZWQuCiAgICAgICAgICAgICAgX2h0dHBWZXJzaW9uID0gX0h0dHBWZXJzaW9uLkhUVFAxMDsKICAgICAgICAgICAgICBfcGVyc2lzdGVudENvbm5lY3Rpb24gPSBmYWxzZTsKICAgICAgICAgICAgICBfaHR0cFZlcnNpb25JbmRleCsrOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJJbnZhbGlkIHJlc3BvbnNlIGxpbmUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLkNSKSB7CiAgICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLlJFUVVFU1RfTElORV9FTkRJTkc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX2V4cGVjdChieXRlLCBfQ2hhckNvZGUuTEYpOwogICAgICAgICAgICAgIF9tZXNzYWdlVHlwZSA9IF9NZXNzYWdlVHlwZS5SRVFVRVNUOwogICAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfU1RBUlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5SRVFVRVNUX0xJTkVfRU5ESU5HOgogICAgICAgICAgX2V4cGVjdChieXRlLCBfQ2hhckNvZGUuTEYpOwogICAgICAgICAgX21lc3NhZ2VUeXBlID0gX01lc3NhZ2VUeXBlLlJFUVVFU1Q7CiAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuSEVBREVSX1NUQVJUOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLlJFU1BPTlNFX0xJTkVfU1RBVFVTX0NPREU6CiAgICAgICAgICBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuU1ApIHsKICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLlJFU1BPTlNFX0xJTkVfUkVBU09OX1BIUkFTRTsKICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuQ1IpIHsKICAgICAgICAgICAgLy8gU29tZSBIVFRQIHNlcnZlcnMgZG9lcyBub3QgZm9sbG93IHRoZSBzcGVjLiBhbmQgc2VuZAogICAgICAgICAgICAvLyBcclxuIHJpZ2h0IGFmdGVyIHRoZSBzdGF0dXMgY29kZS4KICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLlJFU1BPTlNFX0xJTkVfRU5ESU5HOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3N0YXR1c0NvZGVMZW5ndGgrKzsKICAgICAgICAgICAgaWYgKChieXRlIDwgMHgzMCAmJiAweDM5IDwgYnl0ZSkgfHwgX3N0YXR1c0NvZGVMZW5ndGggPiAzKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGUiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfc3RhdHVzQ29kZSA9IF9zdGF0dXNDb2RlICogMTAgKyBieXRlIC0gMHgzMDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLlJFU1BPTlNFX0xJTkVfUkVBU09OX1BIUkFTRToKICAgICAgICAgIGlmIChieXRlID09IF9DaGFyQ29kZS5DUikgewogICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuUkVTUE9OU0VfTElORV9FTkRJTkc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuQ1IgfHwgYnl0ZSA9PSBfQ2hhckNvZGUuTEYpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCByZXNwb25zZSByZWFzb24gcGhyYXNlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3VyaV9vcl9yZWFzb25fcGhyYXNlLmFkZChieXRlKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5SRVNQT05TRV9MSU5FX0VORElORzoKICAgICAgICAgIF9leHBlY3QoYnl0ZSwgX0NoYXJDb2RlLkxGKTsKICAgICAgICAgIF9tZXNzYWdlVHlwZSA9PSBfTWVzc2FnZVR5cGUuUkVTUE9OU0U7CiAgICAgICAgICBpZiAoX3N0YXR1c0NvZGUgPCAxMDAgfHwgX3N0YXR1c0NvZGUgPiA1OTkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGUiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyByZXNwb25zZSB3aWxsIG5ldmVyIGhhdmUgYSBib2R5LgogICAgICAgICAgICBpZiAoX3N0YXR1c0NvZGUgPD0gMTk5IHx8CiAgICAgICAgICAgICAgICBfc3RhdHVzQ29kZSA9PSAyMDQgfHwKICAgICAgICAgICAgICAgIF9zdGF0dXNDb2RlID09IDMwNCkgewogICAgICAgICAgICAgIF9ub01lc3NhZ2VCb2R5ID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkhFQURFUl9TVEFSVDsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5IRUFERVJfU1RBUlQ6CiAgICAgICAgICBfaGVhZGVycyA9IG5ldyBfSHR0cEhlYWRlcnModmVyc2lvbik7CiAgICAgICAgICBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuQ1IpIHsKICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkhFQURFUl9FTkRJTkc7CiAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLkxGKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfRU5ESU5HOwogICAgICAgICAgICBfaW5kZXgtLTsgLy8gTWFrZSB0aGUgbmV3IHN0YXRlIHNlZSB0aGUgTEYgYWdhaW4uCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBTdGFydCBvZiBuZXcgaGVhZGVyIGZpZWxkLgogICAgICAgICAgICBfaGVhZGVyRmllbGQuYWRkKF90b0xvd2VyQ2FzZUJ5dGUoYnl0ZSkpOwogICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuSEVBREVSX0ZJRUxEOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLkhFQURFUl9GSUVMRDoKICAgICAgICAgIGlmIChieXRlID09IF9DaGFyQ29kZS5DT0xPTikgewogICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuSEVBREVSX1ZBTFVFX1NUQVJUOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFfaXNUb2tlbkNoYXIoYnl0ZSkpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiSW52YWxpZCBoZWFkZXIgZmllbGQgbmFtZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9oZWFkZXJGaWVsZC5hZGQoX3RvTG93ZXJDYXNlQnl0ZShieXRlKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBfU3RhdGUuSEVBREVSX1ZBTFVFX1NUQVJUOgogICAgICAgICAgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLkNSKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfVkFMVUVfRk9MRElOR19PUl9FTkRJTkc7CiAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLkxGKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfVkFMVUVfRk9MRF9PUl9FTkQ7CiAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgIT0gX0NoYXJDb2RlLlNQICYmIGJ5dGUgIT0gX0NoYXJDb2RlLkhUKSB7CiAgICAgICAgICAgIC8vIFN0YXJ0IG9mIG5ldyBoZWFkZXIgdmFsdWUuCiAgICAgICAgICAgIF9oZWFkZXJWYWx1ZS5hZGQoYnl0ZSk7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfVkFMVUU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBfU3RhdGUuSEVBREVSX1ZBTFVFOgogICAgICAgICAgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLkNSKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfVkFMVUVfRk9MRElOR19PUl9FTkRJTkc7CiAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLkxGKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfVkFMVUVfRk9MRF9PUl9FTkQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfaGVhZGVyVmFsdWUuYWRkKGJ5dGUpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLkhFQURFUl9WQUxVRV9GT0xESU5HX09SX0VORElORzoKICAgICAgICAgIF9leHBlY3QoYnl0ZSwgX0NoYXJDb2RlLkxGKTsKICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfVkFMVUVfRk9MRF9PUl9FTkQ7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBfU3RhdGUuSEVBREVSX1ZBTFVFX0ZPTERfT1JfRU5EOgogICAgICAgICAgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLlNQIHx8IGJ5dGUgPT0gX0NoYXJDb2RlLkhUKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfVkFMVUVfU1RBUlQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBTdHJpbmcgaGVhZGVyRmllbGQgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoX2hlYWRlckZpZWxkKTsKICAgICAgICAgICAgU3RyaW5nIGhlYWRlclZhbHVlID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKF9oZWFkZXJWYWx1ZSk7CiAgICAgICAgICAgIGlmIChoZWFkZXJGaWVsZCA9PSAidHJhbnNmZXItZW5jb2RpbmciICYmCiAgICAgICAgICAgICAgICBfY2FzZUluc2Vuc2l0aXZlQ29tcGFyZSgiY2h1bmtlZCIuY29kZVVuaXRzLCBfaGVhZGVyVmFsdWUpKSB7CiAgICAgICAgICAgICAgX2NodW5rZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChoZWFkZXJGaWVsZCA9PSAiY29ubmVjdGlvbiIpIHsKICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gdG9rZW5zID0gX3Rva2VuaXplRmllbGRWYWx1ZShoZWFkZXJWYWx1ZSk7CiAgICAgICAgICAgICAgZmluYWwgYm9vbCBpc1Jlc3BvbnNlID0gX21lc3NhZ2VUeXBlID09IF9NZXNzYWdlVHlwZS5SRVNQT05TRTsKICAgICAgICAgICAgICBmaW5hbCBib29sIGlzVXBncmFkZUNvZGUgPQogICAgICAgICAgICAgICAgICAoX3N0YXR1c0NvZGUgPT0gSHR0cFN0YXR1cy51cGdyYWRlUmVxdWlyZWQpIHx8CiAgICAgICAgICAgICAgICAgICAgICAoX3N0YXR1c0NvZGUgPT0gSHR0cFN0YXR1cy5zd2l0Y2hpbmdQcm90b2NvbHMpOwogICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBmaW5hbCBib29sIGlzVXBncmFkZSA9IF9jYXNlSW5zZW5zaXRpdmVDb21wYXJlKAogICAgICAgICAgICAgICAgICAgICJ1cGdyYWRlIi5jb2RlVW5pdHMsIHRva2Vuc1tpXS5jb2RlVW5pdHMpOwogICAgICAgICAgICAgICAgaWYgKChpc1VwZ3JhZGUgJiYgIWlzUmVzcG9uc2UpIHx8CiAgICAgICAgICAgICAgICAgICAgKGlzVXBncmFkZSAmJiBpc1Jlc3BvbnNlICYmIGlzVXBncmFkZUNvZGUpKSB7CiAgICAgICAgICAgICAgICAgIF9jb25uZWN0aW9uVXBncmFkZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfaGVhZGVycy5fYWRkKGhlYWRlckZpZWxkLCB0b2tlbnNbaV0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfaGVhZGVycy5fYWRkKGhlYWRlckZpZWxkLCBoZWFkZXJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2hlYWRlckZpZWxkLmNsZWFyKCk7CiAgICAgICAgICAgIF9oZWFkZXJWYWx1ZS5jbGVhcigpOwoKICAgICAgICAgICAgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLkNSKSB7CiAgICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkhFQURFUl9FTkRJTkc7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSBfQ2hhckNvZGUuTEYpIHsKICAgICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuSEVBREVSX0VORElORzsKICAgICAgICAgICAgICBfaW5kZXgtLTsgLy8gTWFrZSB0aGUgbmV3IHN0YXRlIHNlZSB0aGUgTEYgYWdhaW4uCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gU3RhcnQgb2YgbmV3IGhlYWRlciBmaWVsZC4KICAgICAgICAgICAgICBfaGVhZGVyRmllbGQuYWRkKF90b0xvd2VyQ2FzZUJ5dGUoYnl0ZSkpOwogICAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5IRUFERVJfRklFTEQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5IRUFERVJfRU5ESU5HOgogICAgICAgICAgX2V4cGVjdChieXRlLCBfQ2hhckNvZGUuTEYpOwogICAgICAgICAgaWYgKF9oZWFkZXJzRW5kKCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm47CgogICAgICAgIGNhc2UgX1N0YXRlLkNIVU5LX1NJWkVfU1RBUlRJTkdfQ1I6CiAgICAgICAgICBfZXhwZWN0KGJ5dGUsIF9DaGFyQ29kZS5DUik7CiAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuQ0hVTktfU0laRV9TVEFSVElOR19MRjsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5DSFVOS19TSVpFX1NUQVJUSU5HX0xGOgogICAgICAgICAgX2V4cGVjdChieXRlLCBfQ2hhckNvZGUuTEYpOwogICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkNIVU5LX1NJWkU7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBfU3RhdGUuQ0hVTktfU0laRToKICAgICAgICAgIGlmIChieXRlID09IF9DaGFyQ29kZS5DUikgewogICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuQ0hVTktfU0laRV9FTkRJTkc7CiAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gX0NoYXJDb2RlLlNFTUlfQ09MT04pIHsKICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkNIVU5LX1NJWkVfRVhURU5TSU9OOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW50IHZhbHVlID0gX2V4cGVjdEhleERpZ2l0KGJ5dGUpOwogICAgICAgICAgICBfcmVtYWluaW5nQ29udGVudCA9IF9yZW1haW5pbmdDb250ZW50ICogMTYgKyB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5DSFVOS19TSVpFX0VYVEVOU0lPTjoKICAgICAgICAgIGlmIChieXRlID09IF9DaGFyQ29kZS5DUikgewogICAgICAgICAgICBfc3RhdGUgPSBfU3RhdGUuQ0hVTktfU0laRV9FTkRJTkc7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBfU3RhdGUuQ0hVTktfU0laRV9FTkRJTkc6CiAgICAgICAgICBfZXhwZWN0KGJ5dGUsIF9DaGFyQ29kZS5MRik7CiAgICAgICAgICBpZiAoX3JlbWFpbmluZ0NvbnRlbnQgPiAwKSB7CiAgICAgICAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5CT0RZOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkNIVU5LRURfQk9EWV9ET05FX0NSOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLkNIVU5LRURfQk9EWV9ET05FX0NSOgogICAgICAgICAgX2V4cGVjdChieXRlLCBfQ2hhckNvZGUuQ1IpOwogICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkNIVU5LRURfQk9EWV9ET05FX0xGOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLkNIVU5LRURfQk9EWV9ET05FX0xGOgogICAgICAgICAgX2V4cGVjdChieXRlLCBfQ2hhckNvZGUuTEYpOwogICAgICAgICAgX3Jlc2V0KCk7CiAgICAgICAgICBfY2xvc2VJbmNvbWluZygpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgX1N0YXRlLkJPRFk6CiAgICAgICAgICAvLyBUaGUgYm9keSBpcyBub3QgaGFuZGxlZCBvbmUgYnl0ZSBhdCBhIHRpbWUgYnV0IGluIGJsb2Nrcy4KICAgICAgICAgIF9pbmRleC0tOwogICAgICAgICAgaW50IGRhdGFBdmFpbGFibGUgPSBfYnVmZmVyLmxlbmd0aCAtIF9pbmRleDsKICAgICAgICAgIGlmIChfcmVtYWluaW5nQ29udGVudCA+PSAwICYmIGRhdGFBdmFpbGFibGUgPiBfcmVtYWluaW5nQ29udGVudCkgewogICAgICAgICAgICBkYXRhQXZhaWxhYmxlID0gX3JlbWFpbmluZ0NvbnRlbnQ7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBBbHdheXMgcHJlc2VudCB0aGUgZGF0YSBhcyBhIHZpZXcuIFRoaXMgd2F5IHdlIGNhbiBoYW5kbGUgYWxsCiAgICAgICAgICAvLyBjYXNlcyBsaWtlIHRoaXMsIGFuZCB0aGUgdXNlciB3aWxsIG5vdCBleHBlcmllbmNlIGRpZmZlcmVudCBkYXRhCiAgICAgICAgICAvLyB0eXBlZCAod2hpY2ggY291bGQgbGVhZCB0byBwb2x5bW9ycGhpYyB1c2VyIGNvZGUpLgogICAgICAgICAgVWludDhMaXN0IGRhdGEgPSBuZXcgVWludDhMaXN0LnZpZXcoCiAgICAgICAgICAgICAgX2J1ZmZlci5idWZmZXIsIF9idWZmZXIub2Zmc2V0SW5CeXRlcyArIF9pbmRleCwgZGF0YUF2YWlsYWJsZSk7CiAgICAgICAgICBfYm9keUNvbnRyb2xsZXIuYWRkKGRhdGEpOwogICAgICAgICAgaWYgKF9yZW1haW5pbmdDb250ZW50ICE9IC0xKSB7CiAgICAgICAgICAgIF9yZW1haW5pbmdDb250ZW50IC09IGRhdGEubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgX2luZGV4ICs9IGRhdGEubGVuZ3RoOwogICAgICAgICAgaWYgKF9yZW1haW5pbmdDb250ZW50ID09IDApIHsKICAgICAgICAgICAgaWYgKCFfY2h1bmtlZCkgewogICAgICAgICAgICAgIF9yZXNldCgpOwogICAgICAgICAgICAgIF9jbG9zZUluY29taW5nKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX3N0YXRlID0gX1N0YXRlLkNIVU5LX1NJWkVfU1RBUlRJTkdfQ1I7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIF9TdGF0ZS5GQUlMVVJFOgogICAgICAgICAgLy8gU2hvdWxkIGJlIHVucmVhY2hhYmxlLgogICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgLy8gU2hvdWxkIGJlIHVucmVhY2hhYmxlLgogICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgX3BhcnNlckNhbGxlZCA9IGZhbHNlOwogICAgaWYgKF9idWZmZXIgIT0gbnVsbCAmJiBfaW5kZXggPT0gX2J1ZmZlci5sZW5ndGgpIHsKICAgICAgLy8gSWYgYWxsIGRhdGEgaXMgcGFyc2VkIHJlbGVhc2UgdGhlIGJ1ZmZlciBhbmQgcmVzdW1lIHJlY2VpdmluZwogICAgICAvLyBkYXRhLgogICAgICBfcmVsZWFzZUJ1ZmZlcigpOwogICAgICBpZiAoX3N0YXRlICE9IF9TdGF0ZS5VUEdSQURFRCAmJiBfc3RhdGUgIT0gX1N0YXRlLkZBSUxVUkUpIHsKICAgICAgICBfc29ja2V0U3Vic2NyaXB0aW9uLnJlc3VtZSgpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIF9vbkRhdGEoVWludDhMaXN0IGJ1ZmZlcikgewogICAgX3NvY2tldFN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgYXNzZXJ0KF9idWZmZXIgPT0gbnVsbCk7CiAgICBfYnVmZmVyID0gYnVmZmVyOwogICAgX2luZGV4ID0gMDsKICAgIF9wYXJzZSgpOwogIH0KCiAgdm9pZCBfb25Eb25lKCkgewogICAgLy8gb25Eb25lIGNhbmNlbHMgdGhlIHN1YnNjcmlwdGlvbi4KICAgIF9zb2NrZXRTdWJzY3JpcHRpb24gPSBudWxsOwogICAgaWYgKF9zdGF0ZSA9PSBfU3RhdGUuQ0xPU0VEIHx8IF9zdGF0ZSA9PSBfU3RhdGUuRkFJTFVSRSkgcmV0dXJuOwoKICAgIGlmIChfaW5jb21pbmcgIT0gbnVsbCkgewogICAgICBpZiAoX3N0YXRlICE9IF9TdGF0ZS5VUEdSQURFRCAmJgogICAgICAgICAgIShfc3RhdGUgPT0gX1N0YXRlLlNUQVJUICYmICFfcmVxdWVzdFBhcnNlcikgJiYKICAgICAgICAgICEoX3N0YXRlID09IF9TdGF0ZS5CT0RZICYmICFfY2h1bmtlZCAmJiBfdHJhbnNmZXJMZW5ndGggPT0gLTEpKSB7CiAgICAgICAgX2JvZHlDb250cm9sbGVyLmFkZEVycm9yKAogICAgICAgICAgICBuZXcgSHR0cEV4Y2VwdGlvbigiQ29ubmVjdGlvbiBjbG9zZWQgd2hpbGUgcmVjZWl2aW5nIGRhdGEiKSk7CiAgICAgIH0KICAgICAgX2Nsb3NlSW5jb21pbmcodHJ1ZSk7CiAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIElmIHRoZSBjb25uZWN0aW9uIGlzIGlkbGUgdGhlIEhUVFAgc3RyZWFtIGlzIGNsb3NlZC4KICAgIGlmIChfc3RhdGUgPT0gX1N0YXRlLlNUQVJUKSB7CiAgICAgIGlmICghX3JlcXVlc3RQYXJzZXIpIHsKICAgICAgICBfcmVwb3J0RXJyb3IobmV3IEh0dHBFeGNlcHRpb24oCiAgICAgICAgICAgICJDb25uZWN0aW9uIGNsb3NlZCBiZWZvcmUgZnVsbCBoZWFkZXIgd2FzIHJlY2VpdmVkIikpOwogICAgICB9CiAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoX3N0YXRlID09IF9TdGF0ZS5VUEdSQURFRCkgewogICAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKF9zdGF0ZSA8IF9TdGF0ZS5GSVJTVF9CT0RZX1NUQVRFKSB7CiAgICAgIF9zdGF0ZSA9IF9TdGF0ZS5GQUlMVVJFOwogICAgICAvLyBSZXBvcnQgdGhlIGVycm9yIHRocm91Z2ggdGhlIGVycm9yIGNhbGxiYWNrIGlmIGFueS4gT3RoZXJ3aXNlCiAgICAgIC8vIHRocm93IHRoZSBlcnJvci4KICAgICAgX3JlcG9ydEVycm9yKG5ldyBIdHRwRXhjZXB0aW9uKAogICAgICAgICAgIkNvbm5lY3Rpb24gY2xvc2VkIGJlZm9yZSBmdWxsIGhlYWRlciB3YXMgcmVjZWl2ZWQiKSk7CiAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIV9jaHVua2VkICYmIF90cmFuc2Zlckxlbmd0aCA9PSAtMSkgewogICAgICBfc3RhdGUgPSBfU3RhdGUuQ0xPU0VEOwogICAgfSBlbHNlIHsKICAgICAgX3N0YXRlID0gX1N0YXRlLkZBSUxVUkU7CiAgICAgIC8vIFJlcG9ydCB0aGUgZXJyb3IgdGhyb3VnaCB0aGUgZXJyb3IgY2FsbGJhY2sgaWYgYW55LiBPdGhlcndpc2UKICAgICAgLy8gdGhyb3cgdGhlIGVycm9yLgogICAgICBfcmVwb3J0RXJyb3IoCiAgICAgICAgICBuZXcgSHR0cEV4Y2VwdGlvbigiQ29ubmVjdGlvbiBjbG9zZWQgYmVmb3JlIGZ1bGwgYm9keSB3YXMgcmVjZWl2ZWQiKSk7CiAgICB9CiAgICBfY29udHJvbGxlci5jbG9zZSgpOwogIH0KCiAgU3RyaW5nIGdldCB2ZXJzaW9uIHsKICAgIHN3aXRjaCAoX2h0dHBWZXJzaW9uKSB7CiAgICAgIGNhc2UgX0h0dHBWZXJzaW9uLkhUVFAxMDoKICAgICAgICByZXR1cm4gIjEuMCI7CiAgICAgIGNhc2UgX0h0dHBWZXJzaW9uLkhUVFAxMToKICAgICAgICByZXR1cm4gIjEuMSI7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGludCBnZXQgbWVzc2FnZVR5cGUgPT4gX21lc3NhZ2VUeXBlOwogIGludCBnZXQgdHJhbnNmZXJMZW5ndGggPT4gX3RyYW5zZmVyTGVuZ3RoOwogIGJvb2wgZ2V0IHVwZ3JhZGUgPT4gX2Nvbm5lY3Rpb25VcGdyYWRlICYmIF9zdGF0ZSA9PSBfU3RhdGUuVVBHUkFERUQ7CiAgYm9vbCBnZXQgcGVyc2lzdGVudENvbm5lY3Rpb24gPT4gX3BlcnNpc3RlbnRDb25uZWN0aW9uOwoKICB2b2lkIHNldCBpc0hlYWQoYm9vbCB2YWx1ZSkgewogICAgaWYgKHZhbHVlKSBfbm9NZXNzYWdlQm9keSA9IHRydWU7CiAgfQoKICBfSHR0cERldGFjaGVkSW5jb21pbmcgZGV0YWNoSW5jb21pbmcoKSB7CiAgICAvLyBTaW11bGF0ZSBkZXRhY2hlZCBieSBtYXJraW5nIGFzIHVwZ3JhZGVkLgogICAgX3N0YXRlID0gX1N0YXRlLlVQR1JBREVEOwogICAgcmV0dXJuIG5ldyBfSHR0cERldGFjaGVkSW5jb21pbmcoX3NvY2tldFN1YnNjcmlwdGlvbiwgcmVhZFVucGFyc2VkRGF0YSgpKTsKICB9CgogIFVpbnQ4TGlzdCByZWFkVW5wYXJzZWREYXRhKCkgewogICAgaWYgKF9idWZmZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAoX2luZGV4ID09IF9idWZmZXIubGVuZ3RoKSByZXR1cm4gbnVsbDsKICAgIHZhciByZXN1bHQgPSBfYnVmZmVyLnN1Ymxpc3QoX2luZGV4KTsKICAgIF9yZWxlYXNlQnVmZmVyKCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBfcmVzZXQoKSB7CiAgICBpZiAoX3N0YXRlID09IF9TdGF0ZS5VUEdSQURFRCkgcmV0dXJuOwogICAgX3N0YXRlID0gX1N0YXRlLlNUQVJUOwogICAgX21lc3NhZ2VUeXBlID0gX01lc3NhZ2VUeXBlLlVOREVURVJNSU5FRDsKICAgIF9oZWFkZXJGaWVsZC5jbGVhcigpOwogICAgX2hlYWRlclZhbHVlLmNsZWFyKCk7CiAgICBfbWV0aG9kLmNsZWFyKCk7CiAgICBfdXJpX29yX3JlYXNvbl9waHJhc2UuY2xlYXIoKTsKCiAgICBfc3RhdHVzQ29kZSA9IDA7CiAgICBfc3RhdHVzQ29kZUxlbmd0aCA9IDA7CgogICAgX2h0dHBWZXJzaW9uID0gX0h0dHBWZXJzaW9uLlVOREVURVJNSU5FRDsKICAgIF90cmFuc2Zlckxlbmd0aCA9IC0xOwogICAgX3BlcnNpc3RlbnRDb25uZWN0aW9uID0gZmFsc2U7CiAgICBfY29ubmVjdGlvblVwZ3JhZGUgPSBmYWxzZTsKICAgIF9jaHVua2VkID0gZmFsc2U7CgogICAgX25vTWVzc2FnZUJvZHkgPSBmYWxzZTsKICAgIF9yZW1haW5pbmdDb250ZW50ID0gLTE7CgogICAgX2hlYWRlcnMgPSBudWxsOwogIH0KCiAgdm9pZCBfcmVsZWFzZUJ1ZmZlcigpIHsKICAgIF9idWZmZXIgPSBudWxsOwogICAgX2luZGV4ID0gbnVsbDsKICB9CgogIHN0YXRpYyBib29sIF9pc1Rva2VuQ2hhcihpbnQgYnl0ZSkgewogICAgcmV0dXJuIGJ5dGUgPiAzMSAmJiBieXRlIDwgMTI4ICYmICFfQ29uc3QuU0VQQVJBVE9SX01BUFtieXRlXTsKICB9CgogIHN0YXRpYyBib29sIF9pc1ZhbHVlQ2hhcihpbnQgYnl0ZSkgewogICAgcmV0dXJuIChieXRlID4gMzEgJiYgYnl0ZSA8IDEyOCkgfHwKICAgICAgICAoYnl0ZSA9PSBfQ2hhckNvZGUuU1ApIHx8CiAgICAgICAgKGJ5dGUgPT0gX0NoYXJDb2RlLkhUKTsKICB9CgogIHN0YXRpYyBMaXN0PFN0cmluZz4gX3Rva2VuaXplRmllbGRWYWx1ZShTdHJpbmcgaGVhZGVyVmFsdWUpIHsKICAgIExpc3Q8U3RyaW5nPiB0b2tlbnMgPSBuZXcgTGlzdDxTdHJpbmc+KCk7CiAgICBpbnQgc3RhcnQgPSAwOwogICAgaW50IGluZGV4ID0gMDsKICAgIHdoaWxlIChpbmRleCA8IGhlYWRlclZhbHVlLmxlbmd0aCkgewogICAgICBpZiAoaGVhZGVyVmFsdWVbaW5kZXhdID09ICIsIikgewogICAgICAgIHRva2Vucy5hZGQoaGVhZGVyVmFsdWUuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCkpOwogICAgICAgIHN0YXJ0ID0gaW5kZXggKyAxOwogICAgICB9IGVsc2UgaWYgKGhlYWRlclZhbHVlW2luZGV4XSA9PSAiICIgfHwgaGVhZGVyVmFsdWVbaW5kZXhdID09ICJcdCIpIHsKICAgICAgICBzdGFydCsrOwogICAgICB9CiAgICAgIGluZGV4Kys7CiAgICB9CiAgICB0b2tlbnMuYWRkKGhlYWRlclZhbHVlLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpKTsKICAgIHJldHVybiB0b2tlbnM7CiAgfQoKICBzdGF0aWMgaW50IF90b0xvd2VyQ2FzZUJ5dGUoaW50IHgpIHsKICAgIC8vIE9wdGltaXplZCB2ZXJzaW9uOgogICAgLy8gIC0gIDB4NDEgaXMgJ0EnCiAgICAvLyAgLSAgMHg3ZiBpcyBBU0NJSSBtYXNrCiAgICAvLyAgLSAgMjYgaXMgdGhlIG51bWJlciBvZiBhbHBoYSBjaGFyYWN0ZXJzLgogICAgLy8gIC0gIDB4MjAgaXMgdGhlIGRlbHRhIGJldHdlZW4gbG93ZXIgYW5kIHVwcGVyIGNoYXJzLgogICAgcmV0dXJuICgoKHggLSAweDQxKSAmIDB4N2YpIDwgMjYpID8gKHggfCAweDIwKSA6IHg7CiAgfQoKICAvLyBleHBlY3RlZCBzaG91bGQgYWxyZWFkeSBiZSBsb3dlcmNhc2UuCiAgYm9vbCBfY2FzZUluc2Vuc2l0aXZlQ29tcGFyZShMaXN0PGludD4gZXhwZWN0ZWQsIExpc3Q8aW50PiB2YWx1ZSkgewogICAgaWYgKGV4cGVjdGVkLmxlbmd0aCAhPSB2YWx1ZS5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGV4cGVjdGVkW2ldICE9IF90b0xvd2VyQ2FzZUJ5dGUodmFsdWVbaV0pKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGludCBfZXhwZWN0KGludCB2YWwxLCBpbnQgdmFsMikgewogICAgaWYgKHZhbDEgIT0gdmFsMikgewogICAgICB0aHJvdyBuZXcgSHR0cEV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIEhUVFAiKTsKICAgIH0KICB9CgogIGludCBfZXhwZWN0SGV4RGlnaXQoaW50IGJ5dGUpIHsKICAgIGlmICgweDMwIDw9IGJ5dGUgJiYgYnl0ZSA8PSAweDM5KSB7CiAgICAgIHJldHVybiBieXRlIC0gMHgzMDsgLy8gMCAtIDkKICAgIH0gZWxzZSBpZiAoMHg0MSA8PSBieXRlICYmIGJ5dGUgPD0gMHg0NikgewogICAgICByZXR1cm4gYnl0ZSAtIDB4NDEgKyAxMDsgLy8gQSAtIEYKICAgIH0gZWxzZSBpZiAoMHg2MSA8PSBieXRlICYmIGJ5dGUgPD0gMHg2NikgewogICAgICByZXR1cm4gYnl0ZSAtIDB4NjEgKyAxMDsgLy8gYSAtIGYKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgSFRUUCIpOwogICAgfQogIH0KCiAgdm9pZCBfY3JlYXRlSW5jb21pbmcoaW50IHRyYW5zZmVyTGVuZ3RoKSB7CiAgICBhc3NlcnQoX2luY29taW5nID09IG51bGwpOwogICAgYXNzZXJ0KF9ib2R5Q29udHJvbGxlciA9PSBudWxsKTsKICAgIGFzc2VydCghX2JvZHlQYXVzZWQpOwogICAgdmFyIGluY29taW5nOwogICAgX2JvZHlDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PigKICAgICAgICBzeW5jOiB0cnVlLAogICAgICAgIG9uTGlzdGVuOiAoKSB7CiAgICAgICAgICBpZiAoaW5jb21pbmcgIT0gX2luY29taW5nKSByZXR1cm47CiAgICAgICAgICBhc3NlcnQoX2JvZHlQYXVzZWQpOwogICAgICAgICAgX2JvZHlQYXVzZWQgPSBmYWxzZTsKICAgICAgICAgIF9wYXVzZVN0YXRlQ2hhbmdlZCgpOwogICAgICAgIH0sCiAgICAgICAgb25QYXVzZTogKCkgewogICAgICAgICAgaWYgKGluY29taW5nICE9IF9pbmNvbWluZykgcmV0dXJuOwogICAgICAgICAgYXNzZXJ0KCFfYm9keVBhdXNlZCk7CiAgICAgICAgICBfYm9keVBhdXNlZCA9IHRydWU7CiAgICAgICAgICBfcGF1c2VTdGF0ZUNoYW5nZWQoKTsKICAgICAgICB9LAogICAgICAgIG9uUmVzdW1lOiAoKSB7CiAgICAgICAgICBpZiAoaW5jb21pbmcgIT0gX2luY29taW5nKSByZXR1cm47CiAgICAgICAgICBhc3NlcnQoX2JvZHlQYXVzZWQpOwogICAgICAgICAgX2JvZHlQYXVzZWQgPSBmYWxzZTsKICAgICAgICAgIF9wYXVzZVN0YXRlQ2hhbmdlZCgpOwogICAgICAgIH0sCiAgICAgICAgb25DYW5jZWw6ICgpIHsKICAgICAgICAgIGlmIChpbmNvbWluZyAhPSBfaW5jb21pbmcpIHJldHVybjsKICAgICAgICAgIGlmIChfc29ja2V0U3Vic2NyaXB0aW9uICE9IG51bGwpIHsKICAgICAgICAgICAgX3NvY2tldFN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgICAgICAgIH0KICAgICAgICAgIF9jbG9zZUluY29taW5nKHRydWUpOwogICAgICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgICB9KTsKICAgIGluY29taW5nID0gX2luY29taW5nID0KICAgICAgICBuZXcgX0h0dHBJbmNvbWluZyhfaGVhZGVycywgdHJhbnNmZXJMZW5ndGgsIF9ib2R5Q29udHJvbGxlci5zdHJlYW0pOwogICAgX2JvZHlQYXVzZWQgPSB0cnVlOwogICAgX3BhdXNlU3RhdGVDaGFuZ2VkKCk7CiAgfQoKICB2b2lkIF9jbG9zZUluY29taW5nKFtib29sIGNsb3NpbmcgPSBmYWxzZV0pIHsKICAgIC8vIElnbm9yZSBtdWx0aXBsZSBjbG9zZSAoY2FuIGhhcHBlbiBpbiByZS1lbnRyYW5jZSkuCiAgICBpZiAoX2luY29taW5nID09IG51bGwpIHJldHVybjsKICAgIHZhciB0bXAgPSBfaW5jb21pbmc7CiAgICB0bXAuY2xvc2UoY2xvc2luZyk7CiAgICBfaW5jb21pbmcgPSBudWxsOwogICAgaWYgKF9ib2R5Q29udHJvbGxlciAhPSBudWxsKSB7CiAgICAgIF9ib2R5Q29udHJvbGxlci5jbG9zZSgpOwogICAgICBfYm9keUNvbnRyb2xsZXIgPSBudWxsOwogICAgfQogICAgX2JvZHlQYXVzZWQgPSBmYWxzZTsKICAgIF9wYXVzZVN0YXRlQ2hhbmdlZCgpOwogIH0KCiAgdm9pZCBf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YXJ0Ll9odHRwOwoKY29uc3QgU3RyaW5nIF9EQVJUX1NFU1NJT05fSUQgPSAiREFSVFNFU1NJRCI7CgovLyBBIF9IdHRwU2Vzc2lvbiBpcyBhIG5vZGUgaW4gYSBkb3VibGUtbGlua2VkIGxpc3QsIHdpdGggX25leHQgYW5kIF9wcmV2IGJlaW5nCi8vIHRoZSBwcmV2aW91cyBhbmQgbmV4dCBwb2ludGVycy4KY2xhc3MgX0h0dHBTZXNzaW9uIGltcGxlbWVudHMgSHR0cFNlc3Npb24gewogIC8vIERlc3Ryb3llZCBtYXJrZWQuIFVzZWQgYnkgdGhlIGh0dHAgY29ubmVjdGlvbiB0byBzZWUgaWYgYSBzZXNzaW9uIGlzIHZhbGlkLgogIGJvb2wgX2Rlc3Ryb3llZCA9IGZhbHNlOwogIGJvb2wgX2lzTmV3ID0gdHJ1ZTsKICBEYXRlVGltZSBfbGFzdFNlZW47CiAgRnVuY3Rpb24gX3RpbWVvdXRDYWxsYmFjazsKICBfSHR0cFNlc3Npb25NYW5hZ2VyIF9zZXNzaW9uTWFuYWdlcjsKICAvLyBQb2ludGVycyBpbiB0aW1lb3V0IHF1ZXVlLgogIF9IdHRwU2Vzc2lvbiBfcHJldjsKICBfSHR0cFNlc3Npb24gX25leHQ7CiAgZmluYWwgU3RyaW5nIGlkOwoKICBmaW5hbCBNYXAgX2RhdGEgPSBuZXcgSGFzaE1hcCgpOwoKICBfSHR0cFNlc3Npb24odGhpcy5fc2Vzc2lvbk1hbmFnZXIsIHRoaXMuaWQpIDogX2xhc3RTZWVuID0gbmV3IERhdGVUaW1lLm5vdygpOwoKICB2b2lkIGRlc3Ryb3koKSB7CiAgICBfZGVzdHJveWVkID0gdHJ1ZTsKICAgIF9zZXNzaW9uTWFuYWdlci5fcmVtb3ZlRnJvbVRpbWVvdXRRdWV1ZSh0aGlzKTsKICAgIF9zZXNzaW9uTWFuYWdlci5fc2Vzc2lvbnMucmVtb3ZlKGlkKTsKICB9CgogIC8vIE1hcmsgdGhlIHNlc3Npb24gYXMgc2Vlbi4gVGhpcyB3aWxsIHJlc2V0IHRoZSB0aW1lb3V0IGFuZCBtb3ZlIHRoZSBub2RlIHRvCiAgLy8gdGhlIGVuZCBvZiB0aGUgdGltZW91dCBxdWV1ZS4KICB2b2lkIF9tYXJrU2VlbigpIHsKICAgIF9sYXN0U2VlbiA9IG5ldyBEYXRlVGltZS5ub3coKTsKICAgIF9zZXNzaW9uTWFuYWdlci5fYnVtcFRvRW5kKHRoaXMpOwogIH0KCiAgRGF0ZVRpbWUgZ2V0IGxhc3RTZWVuID0+IF9sYXN0U2VlbjsKCiAgYm9vbCBnZXQgaXNOZXcgPT4gX2lzTmV3OwoKICB2b2lkIHNldCBvblRpbWVvdXQodm9pZCBjYWxsYmFjaygpKSB7CiAgICBfdGltZW91dENhbGxiYWNrID0gY2FsbGJhY2s7CiAgfQoKICAvLyBNYXAgaW1wbGVtZW50YXRpb246CiAgYm9vbCBjb250YWluc1ZhbHVlKHZhbHVlKSA9PiBfZGF0YS5jb250YWluc1ZhbHVlKHZhbHVlKTsKICBib29sIGNvbnRhaW5zS2V5KGtleSkgPT4gX2RhdGEuY29udGFpbnNLZXkoa2V5KTsKICBvcGVyYXRvciBbXShrZXkpID0+IF9kYXRhW2tleV07CiAgdm9pZCBvcGVyYXRvciBbXT0oa2V5LCB2YWx1ZSkgewogICAgX2RhdGFba2V5XSA9IHZhbHVlOwogIH0KCiAgcHV0SWZBYnNlbnQoa2V5LCBpZkFic2VudCkgPT4gX2RhdGEucHV0SWZBYnNlbnQoa2V5LCBpZkFic2VudCk7CiAgYWRkQWxsKE1hcCBvdGhlcikgPT4gX2RhdGEuYWRkQWxsKG90aGVyKTsKICByZW1vdmUoa2V5KSA9PiBfZGF0YS5yZW1vdmUoa2V5KTsKICB2b2lkIGNsZWFyKCkgewogICAgX2RhdGEuY2xlYXIoKTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoa2V5LCB2YWx1ZSkpIHsKICAgIF9kYXRhLmZvckVhY2goZik7CiAgfQoKICBJdGVyYWJsZTxNYXBFbnRyeT4gZ2V0IGVudHJpZXMgPT4gX2RhdGEuZW50cmllczsKCiAgdm9pZCBhZGRFbnRyaWVzKEl0ZXJhYmxlPE1hcEVudHJ5PiBlbnRyaWVzKSB7CiAgICBfZGF0YS5hZGRFbnRyaWVzKGVudHJpZXMpOwogIH0KCiAgTWFwPEssIFY+IG1hcDxLLCBWPihNYXBFbnRyeTxLLCBWPiB0cmFuc2Zvcm0oa2V5LCB2YWx1ZSkpID0+CiAgICAgIF9kYXRhLm1hcCh0cmFuc2Zvcm0pOwoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChrZXksIHZhbHVlKSkgewogICAgX2RhdGEucmVtb3ZlV2hlcmUodGVzdCk7CiAgfQoKICBNYXA8SywgVj4gY2FzdDxLLCBWPigpID0+IF9kYXRhLmNhc3Q8SywgVj4oKTsKICB1cGRhdGUoa2V5LCB1cGRhdGUodmFsdWUpLCB7aWZBYnNlbnQoKX0pID0+CiAgICAgIF9kYXRhLnVwZGF0ZShrZXksIHVwZGF0ZSwgaWZBYnNlbnQ6IGlmQWJzZW50KTsKCiAgdm9pZCB1cGRhdGVBbGwodXBkYXRlKGtleSwgdmFsdWUpKSB7CiAgICBfZGF0YS51cGRhdGVBbGwodXBkYXRlKTsKICB9CgogIEl0ZXJhYmxlIGdldCBrZXlzID0+IF9kYXRhLmtleXM7CiAgSXRlcmFibGUgZ2V0IHZhbHVlcyA9PiBfZGF0YS52YWx1ZXM7CiAgaW50IGdldCBsZW5ndGggPT4gX2RhdGEubGVuZ3RoOwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2RhdGEuaXNFbXB0eTsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9kYXRhLmlzTm90RW1wdHk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICdIdHRwU2Vzc2lvbiBpZDokaWQgJF9kYXRhJzsKfQoKLy8gUHJpdmF0ZSBjbGFzcyB1c2VkIHRvIG1hbmFnZSBhbGwgdGhlIGFjdGl2ZSBzZXNzaW9ucy4gVGhlIHNlc3Npb25zIGFyZSBzdG9yZWQKLy8gaW4gdHdvIHdheXM6Ci8vCi8vICAqIEluIGEgbWFwLCBtYXBwaW5nIGZyb20gSUQgdG8gSHR0cFNlc3Npb24uCi8vICAqIEluIGEgbGlua2VkIGxpc3QsIHVzZWQgYXMgYSB0aW1lb3V0IHF1ZXVlLgpjbGFzcyBfSHR0cFNlc3Npb25NYW5hZ2VyIHsKICBNYXA8U3RyaW5nLCBfSHR0cFNlc3Npb24+IF9zZXNzaW9uczsKICBpbnQgX3Nlc3Npb25UaW1lb3V0ID0gMjAgKiA2MDsgLy8gMjAgbWlucy4KICBfSHR0cFNlc3Npb24gX2hlYWQ7CiAgX0h0dHBTZXNzaW9uIF90YWlsOwogIFRpbWVyIF90aW1lcjsKCiAgX0h0dHBTZXNzaW9uTWFuYWdlcigpIDogX3Nlc3Npb25zID0ge307CgogIFN0cmluZyBjcmVhdGVTZXNzaW9uSWQoKSB7CiAgICBjb25zdCBpbnQgX0tFWV9MRU5HVEggPSAxNjsgLy8gMTI4IGJpdHMuCiAgICB2YXIgZGF0YSA9IF9DcnlwdG9VdGlscy5nZXRSYW5kb21CeXRlcyhfS0VZX0xFTkdUSCk7CiAgICByZXR1cm4gX0NyeXB0b1V0aWxzLmJ5dGVzVG9IZXgoZGF0YSk7CiAgfQoKICBfSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbihTdHJpbmcgaWQpID0+IF9zZXNzaW9uc1tpZF07CgogIF9IdHRwU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKCkgewogICAgdmFyIGlkID0gY3JlYXRlU2Vzc2lvbklkKCk7CiAgICAvLyBUT0RPKGFqb2huc2VuKTogQ29uc2lkZXIgYWRkaW5nIGEgbGltaXQgYW5kIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KICAgIC8vIFNob3VsZCBiZSB2ZXJ5IHVubGlrZWx5IGhvd2V2ZXIuCiAgICB3aGlsZSAoX3Nlc3Npb25zLmNvbnRhaW5zS2V5KGlkKSkgewogICAgICBpZCA9IGNyZWF0ZVNlc3Npb25JZCgpOwogICAgfQogICAgdmFyIHNlc3Npb24gPSBfc2Vzc2lvbnNbaWRdID0gbmV3IF9IdHRwU2Vzc2lvbih0aGlzLCBpZCk7CiAgICBfYWRkVG9UaW1lb3V0UXVldWUoc2Vzc2lvbik7CiAgICByZXR1cm4gc2Vzc2lvbjsKICB9CgogIHZvaWQgc2V0IHNlc3Npb25UaW1lb3V0KGludCB0aW1lb3V0KSB7CiAgICBfc2Vzc2lvblRpbWVvdXQgPSB0aW1lb3V0OwogICAgX3N0b3BUaW1lcigpOwogICAgX3N0YXJ0VGltZXIoKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfc3RvcFRpbWVyKCk7CiAgfQoKICB2b2lkIF9idW1wVG9FbmQoX0h0dHBTZXNzaW9uIHNlc3Npb24pIHsKICAgIF9yZW1vdmVGcm9tVGltZW91dFF1ZXVlKHNlc3Npb24pOwogICAgX2FkZFRvVGltZW91dFF1ZXVlKHNlc3Npb24pOwogIH0KCiAgdm9pZCBfYWRkVG9UaW1lb3V0UXVldWUoX0h0dHBTZXNzaW9uIHNlc3Npb24pIHsKICAgIGlmIChfaGVhZCA9PSBudWxsKSB7CiAgICAgIGFzc2VydChfdGFpbCA9PSBudWxsKTsKICAgICAgX3RhaWwgPSBfaGVhZCA9IHNlc3Npb247CiAgICAgIF9zdGFydFRpbWVyKCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoX3RpbWVyICE9IG51bGwpOwogICAgICBhc3NlcnQoX3RhaWwgIT0gbnVsbCk7CiAgICAgIC8vIEFkZCB0byBlbmQuCiAgICAgIF90YWlsLl9uZXh0ID0gc2Vzc2lvbjsKICAgICAgc2Vzc2lvbi5fcHJldiA9IF90YWlsOwogICAgICBfdGFpbCA9IHNlc3Npb247CiAgICB9CiAgfQoKICB2b2lkIF9yZW1vdmVGcm9tVGltZW91dFF1ZXVlKF9IdHRwU2Vzc2lvbiBzZXNzaW9uKSB7CiAgICBpZiAoc2Vzc2lvbi5fbmV4dCAhPSBudWxsKSB7CiAgICAgIHNlc3Npb24uX25leHQuX3ByZXYgPSBzZXNzaW9uLl9wcmV2OwogICAgfQogICAgaWYgKHNlc3Npb24uX3ByZXYgIT0gbnVsbCkgewogICAgICBzZXNzaW9uLl9wcmV2Ll9uZXh0ID0gc2Vzc2lvbi5fbmV4dDsKICAgIH0KICAgIGlmIChfaGVhZCA9PSBzZXNzaW9uKSB7CiAgICAgIC8vIFdlIHJlbW92ZWQgdGhlIGhlYWQgZWxlbWVudCwgc3RhcnQgbmV3IHRpbWVyLgogICAgICBfaGVhZCA9IHNlc3Npb24uX25leHQ7CiAgICAgIF9zdG9wVGltZXIoKTsKICAgICAgX3N0YXJ0VGltZXIoKTsKICAgIH0KICAgIGlmIChfdGFpbCA9PSBzZXNzaW9uKSB7CiAgICAgIF90YWlsID0gc2Vzc2lvbi5fcHJldjsKICAgIH0KICAgIHNlc3Npb24uX25leHQgPSBzZXNzaW9uLl9wcmV2ID0gbnVsbDsKICB9CgogIHZvaWQgX3RpbWVyVGltZW91dCgpIHsKICAgIF9zdG9wVGltZXIoKTsgLy8gQ2xlYXIgdGltZXIuCiAgICBhc3NlcnQoX2hlYWQgIT0gbnVsbCk7CiAgICB2YXIgc2Vzc2lvbiA9IF9oZWFkOwogICAgc2Vzc2lvbi5kZXN0cm95KCk7IC8vIFdpbGwgcmVtb3ZlIHRoZSBzZXNzaW9uIGZyb20gdGltZW91dCBxdWV1ZSBhbmQgbWFwLgogICAgaWYgKHNlc3Npb24uX3RpbWVvdXRDYWxsYmFjayAhPSBudWxsKSB7CiAgICAgIHNlc3Npb24uX3RpbWVvdXRDYWxsYmFjaygpOwogICAgfQogIH0KCiAgdm9pZCBfc3RhcnRUaW1lcigpIHsKICAgIGFzc2VydChfdGltZXIgPT0gbnVsbCk7CiAgICBpZiAoX2hlYWQgIT0gbnVsbCkgewogICAgICBpbnQgc2Vjb25kcyA9IG5ldyBEYXRlVGltZS5ub3coKS5kaWZmZXJlbmNlKF9oZWFkLmxhc3RTZWVuKS5pblNlY29uZHM7CiAgICAgIF90aW1lciA9IG5ldyBUaW1lcigKICAgICAgICAgIG5ldyBEdXJhdGlvbihzZWNvbmRzOiBfc2Vzc2lvblRpbWVvdXQgLSBzZWNvbmRzKSwgX3RpbWVyVGltZW91dCk7CiAgICB9CiAgfQoKICB2b2lkIF9zdG9wVGltZXIoKSB7CiAgICBpZiAoX3RpbWVyICE9IG51bGwpIHsKICAgICAgX3RpbWVyLmNhbmNlbCgpOwogICAgICBfdGltZXIgPSBudWxsOwogICAgfQogIH0KfQqAzwBOTjwBFAEuAVAjLFEbFhYdJyAWFhMBIwFQARMXMyoEAVAjFSQmBAEmARwBKCEEARk7MyIiGAQBQiwkERMEASUWBAEzATAfBAE/HAEsHQQBMC41AScdBAEjJyIlKwE0AgFREAMwMRwnLRYWEAEqAR0tOSoEATcBISBKKCgeBj4hFAQBKR8SEwQBERIEASomIQQBMhkdHxUNHh0VHR0XBgQBNyErBiErBhw3HRQVBhwdBioEARkiGxlOLCIGBAEXHBlNGkwGBAEWGhcVBgQCARxkYXJ0Ol9odHRwL2h0dHBfc2Vzc2lvbi5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9faHR0cC9vdmVycmlkZXMuZGFydJCDLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5faHR0cDsKCmZpbmFsIF9odHRwT3ZlcnJpZGVzVG9rZW4gPSBuZXcgT2JqZWN0KCk7Cgpjb25zdCBfYXN5bmNSdW5ab25lZCA9IHJ1blpvbmVkOwoKLy8vIFRoaXMgY2xhc3MgZmFjaWxpdGF0ZXMgb3ZlcnJpZGluZyBbSHR0cENsaWVudF0gd2l0aCBhIG1vY2sgaW1wbGVtZW50YXRpb24uCi8vLyBJdCBzaG91bGQgYmUgZXh0ZW5kZWQgYnkgYW5vdGhlciBjbGFzcyBpbiBjbGllbnQgY29kZSB3aXRoIG92ZXJyaWRlcwovLy8gdGhhdCBjb25zdHJ1Y3QgYSBtb2NrIGltcGxlbWVudGF0aW9uLiBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhpcyBiYXNlIGNsYXNzCi8vLyBkZWZhdWx0cyB0byB0aGUgYWN0dWFsIFtIdHRwQ2xpZW50XSBpbXBsZW1lbnRhdGlvbi4gRm9yIGV4YW1wbGU6Ci8vLwovLy8gYGBgCi8vLyBjbGFzcyBNeUh0dHBDbGllbnQgaW1wbGVtZW50cyBIdHRwQ2xpZW50IHsKLy8vICAgLi4uCi8vLyAgIC8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBIdHRwQ2xpZW50IGludGVyZmFjZQovLy8gICAuLi4KLy8vIH0KLy8vCi8vLyBtYWluKCkgewovLy8gICBIdHRwT3ZlcnJpZGVzLnJ1blpvbmVkKCgpIHsKLy8vICAgICAuLi4KLy8vICAgICAvLyBPcGVyYXRpb25zIHdpbGwgdXNlIE15SHR0cENsaWVudCBpbnN0ZWFkIG9mIHRoZSByZWFsIEh0dHBDbGllbnQKLy8vICAgICAvLyBpbXBsZW1lbnRhdGlvbiB3aGVuZXZlciBIdHRwQ2xpZW50IGlzIHVzZWQuCi8vLyAgICAgLi4uCi8vLyAgIH0sIGNyZWF0ZUh0dHBDbGllbnQ6IChTZWN1cml0eUNvbnRleHQgYykgPT4gbmV3IE15SHR0cENsaWVudChjKSk7Ci8vLyB9Ci8vLyBgYGAKYWJzdHJhY3QgY2xhc3MgSHR0cE92ZXJyaWRlcyB7CiAgc3RhdGljIEh0dHBPdmVycmlkZXMgX2dsb2JhbDsKCiAgc3RhdGljIEh0dHBPdmVycmlkZXMgZ2V0IGN1cnJlbnQgewogICAgcmV0dXJuIFpvbmUuY3VycmVudFtfaHR0cE92ZXJyaWRlc1Rva2VuXSA/PyBfZ2xvYmFsOwogIH0KCiAgLy8vIFRoZSBbSHR0cE92ZXJyaWRlc10gdG8gdXNlIGluIHRoZSByb290IFtab25lXS4KICAvLy8KICAvLy8gVGhlc2UgYXJlIHRoZSBbSHR0cE92ZXJyaWRlc10gdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHJvb3QgWm9uZSwgYW5kIGluCiAgLy8vIFpvbmUncyB0aGF0IGRvIG5vdCBzZXQgW0h0dHBPdmVycmlkZXNdIGFuZCB3aG9zZSBhbmNlc3RvcnMgdXAgdG8gdGhlIHJvb3QKICAvLy8gWm9uZSBkbyBub3Qgc2V0IFtIdHRwT3ZlcnJpZGVzXS4KICBzdGF0aWMgc2V0IGdsb2JhbChIdHRwT3ZlcnJpZGVzIG92ZXJyaWRlcykgewogICAgX2dsb2JhbCA9IG92ZXJyaWRlczsKICB9CgogIC8vLyBSdW5zIFtib2R5XSBpbiBhIGZyZXNoIFtab25lXSB1c2luZyB0aGUgcHJvdmlkZWQgb3ZlcnJpZGVzLgogIHN0YXRpYyBSIHJ1blpvbmVkPFI+KFIgYm9keSgpLAogICAgICB7SHR0cENsaWVudCBGdW5jdGlvbihTZWN1cml0eUNvbnRleHQpIGNyZWF0ZUh0dHBDbGllbnQsCiAgICAgIFN0cmluZyBGdW5jdGlvbihVcmkgdXJpLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50KQogICAgICAgICAgZmluZFByb3h5RnJvbUVudmlyb25tZW50LAogICAgICBab25lU3BlY2lmaWNhdGlvbiB6b25lU3BlY2lmaWNhdGlvbiwKICAgICAgRnVuY3Rpb24gb25FcnJvcn0pIHsKICAgIEh0dHBPdmVycmlkZXMgb3ZlcnJpZGVzID0KICAgICAgICBuZXcgX0h0dHBPdmVycmlkZXNTY29wZShjcmVhdGVIdHRwQ2xpZW50LCBmaW5kUHJveHlGcm9tRW52aXJvbm1lbnQpOwogICAgcmV0dXJuIF9hc3luY1J1blpvbmVkPFI+KGJvZHksCiAgICAgICAgem9uZVZhbHVlczoge19odHRwT3ZlcnJpZGVzVG9rZW46IG92ZXJyaWRlc30sCiAgICAgICAgem9uZVNwZWNpZmljYXRpb246IHpvbmVTcGVjaWZpY2F0aW9uLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IpOwogIH0KCiAgLy8vIFJ1bnMgW2JvZHldIGluIGEgZnJlc2ggW1pvbmVdIHVzaW5nIHRoZSBvdmVycmlkZXMgZm91bmQgaW4gW292ZXJyaWRlc10uCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCBbb3ZlcnJpZGVzXSBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGV4dGVuZHMKICAvLy8gW0h0dHBPdmVycmlkZXNdLgogIHN0YXRpYyBSIHJ1bldpdGhIdHRwT3ZlcnJpZGVzPFI+KFIgYm9keSgpLCBIdHRwT3ZlcnJpZGVzIG92ZXJyaWRlcywKICAgICAge1pvbmVTcGVjaWZpY2F0aW9uIHpvbmVTcGVjaWZpY2F0aW9uLCBGdW5jdGlvbiBvbkVycm9yfSkgewogICAgcmV0dXJuIF9hc3luY1J1blpvbmVkPFI+KGJvZHksCiAgICAgICAgem9uZVZhbHVlczoge19odHRwT3ZlcnJpZGVzVG9rZW46IG92ZXJyaWRlc30sCiAgICAgICAgem9uZVNwZWNpZmljYXRpb246IHpvbmVTcGVjaWZpY2F0aW9uLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IpOwogIH0KCiAgLy8vIFJldHVybnMgYSBuZXcgW0h0dHBDbGllbnRdIHVzaW5nIHRoZSBnaXZlbiBbY29udGV4dF0uCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgbmV3IEh0dHBDbGllbnRgLgogIEh0dHBDbGllbnQgY3JlYXRlSHR0cENsaWVudChTZWN1cml0eUNvbnRleHQgY29udGV4dCkgewogICAgcmV0dXJuIG5ldyBfSHR0cENsaWVudChjb250ZXh0KTsKICB9CgogIC8vLyBSZXNvbHZlcyB0aGUgcHJveHkgc2VydmVyIHRvIGJlIHVzZWQgZm9yIEhUVFAgY29ubmVjdGlvbnMuCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgSHR0cENsaWVudC5maW5kUHJveHlGcm9tRW52aXJvbm1lbnRgLgogIFN0cmluZyBmaW5kUHJveHlGcm9tRW52aXJvbm1lbnQoVXJpIHVybCwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCkgewogICAgcmV0dXJuIF9IdHRwQ2xpZW50Ll9maW5kUHJveHlGcm9tRW52aXJvbm1lbnQodXJsLCBlbnZpcm9ubWVudCk7CiAgfQp9CgpjbGFzcyBfSHR0cE92ZXJyaWRlc1Njb3BlIGV4dGVuZHMgSHR0cE92ZXJyaWRlcyB7CiAgZmluYWwgSHR0cE92ZXJyaWRlcyBfcHJldmlvdXMgPSBIdHRwT3ZlcnJpZGVzLmN1cnJlbnQ7CgogIGZpbmFsIEh0dHBDbGllbnQgRnVuY3Rpb24oU2VjdXJpdHlDb250ZXh0KSBfY3JlYXRlSHR0cENsaWVudDsKICBmaW5hbCBTdHJpbmcgRnVuY3Rpb24oVXJpIHVyaSwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCkKICAgICAgX2ZpbmRQcm94eUZyb21FbnZpcm9ubWVudDsKCiAgX0h0dHBPdmVycmlkZXNTY29wZSh0aGlzLl9jcmVhdGVIdHRwQ2xpZW50LCB0aGlzLl9maW5kUHJveHlGcm9tRW52aXJvbm1lbnQpOwoKICBAb3ZlcnJpZGUKICBIdHRwQ2xpZW50IGNyZWF0ZUh0dHBDbGllbnQoU2VjdXJpdHlDb250ZXh0IGNvbnRleHQpIHsKICAgIGlmIChfY3JlYXRlSHR0cENsaWVudCAhPSBudWxsKSByZXR1cm4gX2NyZWF0ZUh0dHBDbGllbnQoY29udGV4dCk7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuY3JlYXRlSHR0cENsaWVudChjb250ZXh0KTsKICAgIHJldHVybiBzdXBlci5jcmVhdGVIdHRwQ2xpZW50KGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGZpbmRQcm94eUZyb21FbnZpcm9ubWVudChVcmkgdXJsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50KSB7CiAgICBpZiAoX2ZpbmRQcm94eUZyb21FbnZpcm9ubWVudCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfZmluZFByb3h5RnJvbUVudmlyb25tZW50KHVybCwgZW52aXJvbm1lbnQpOwogICAgfQogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfcHJldmlvdXMuZmluZFByb3h5RnJvbUVudmlyb25tZW50KHVybCwgZW52aXJvbm1lbnQpOwogICAgfQogICAgcmV0dXJuIHN1cGVyLmZpbmRQcm94eUZyb21FbnZpcm9ubWVudCh1cmwsIGVudmlyb25tZW50KTsKICB9Cn0KeABOTjwBFAEqASEBT0lQRQQILwo3CgYEDSIMSzcMSAYIHyABJTkEATUGT1AnLxkEAUIhPkAkKxseTSM2LhsEAU4GShdGQSM2LhsEATwGTxg5JQQBQQZPLU5EBAIBMjkBQEIhAU8BDDlGRywEAQxOLToGHUMGPQQCARlkYXJ0Ol9odHRwL292ZXJyaWRlcy5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9faHR0cC93ZWJzb2NrZXQuZGFydMAASScvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll9odHRwOwoKLyoqCiAqIFdlYlNvY2tldCBzdGF0dXMgY29kZXMgdXNlZCB3aGVuIGNsb3NpbmcgYSBXZWJTb2NrZXQgY29ubmVjdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIFdlYlNvY2tldFN0YXR1cyB7CiAgc3RhdGljIGNvbnN0IGludCBub3JtYWxDbG9zdXJlID0gMTAwMDsKICBzdGF0aWMgY29uc3QgaW50IGdvaW5nQXdheSA9IDEwMDE7CiAgc3RhdGljIGNvbnN0IGludCBwcm90b2NvbEVycm9yID0gMTAwMjsKICBzdGF0aWMgY29uc3QgaW50IHVuc3VwcG9ydGVkRGF0YSA9IDEwMDM7CiAgc3RhdGljIGNvbnN0IGludCByZXNlcnZlZDEwMDQgPSAxMDA0OwogIHN0YXRpYyBjb25zdCBpbnQgbm9TdGF0dXNSZWNlaXZlZCA9IDEwMDU7CiAgc3RhdGljIGNvbnN0IGludCBhYm5vcm1hbENsb3N1cmUgPSAxMDA2OwogIHN0YXRpYyBjb25zdCBpbnQgaW52YWxpZEZyYW1lUGF5bG9hZERhdGEgPSAxMDA3OwogIHN0YXRpYyBjb25zdCBpbnQgcG9saWN5VmlvbGF0aW9uID0gMTAwODsKICBzdGF0aWMgY29uc3QgaW50IG1lc3NhZ2VUb29CaWcgPSAxMDA5OwogIHN0YXRpYyBjb25zdCBpbnQgbWlzc2luZ01hbmRhdG9yeUV4dGVuc2lvbiA9IDEwMTA7CiAgc3RhdGljIGNvbnN0IGludCBpbnRlcm5hbFNlcnZlckVycm9yID0gMTAxMTsKICBzdGF0aWMgY29uc3QgaW50IHJlc2VydmVkMTAxNSA9IDEwMTU7CgogIEBEZXByZWNhdGVkKCJVc2Ugbm9ybWFsQ2xvc3VyZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE5PUk1BTF9DTE9TVVJFID0gbm9ybWFsQ2xvc3VyZTsKICBARGVwcmVjYXRlZCgiVXNlIGdvaW5nQXdheSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IEdPSU5HX0FXQVkgPSBnb2luZ0F3YXk7CiAgQERlcHJlY2F0ZWQoIlVzZSBwcm90b2NvbEVycm9yIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUFJPVE9DT0xfRVJST1IgPSBwcm90b2NvbEVycm9yOwogIEBEZXByZWNhdGVkKCJVc2UgdW5zdXBwb3J0ZWREYXRhIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgVU5TVVBQT1JURURfREFUQSA9IHVuc3VwcG9ydGVkRGF0YTsKICBARGVwcmVjYXRlZCgiVXNlIHJlc2VydmVkMTAwNCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFJFU0VSVkVEXzEwMDQgPSByZXNlcnZlZDEwMDQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBub1N0YXR1c1JlY2VpdmVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTk9fU1RBVFVTX1JFQ0VJVkVEID0gbm9TdGF0dXNSZWNlaXZlZDsKICBARGVwcmVjYXRlZCgiVXNlIGFibm9ybWFsQ2xvc3VyZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IEFCTk9STUFMX0NMT1NVUkUgPSBhYm5vcm1hbENsb3N1cmU7CiAgQERlcHJlY2F0ZWQoIlVzZSBpbnZhbGlkRnJhbWVQYXlsb2FkRGF0YSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IElOVkFMSURfRlJBTUVfUEFZTE9BRF9EQVRBID0gaW52YWxpZEZyYW1lUGF5bG9hZERhdGE7CiAgQERlcHJlY2F0ZWQoIlVzZSBwb2xpY3lWaW9sYXRpb24gaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBQT0xJQ1lfVklPTEFUSU9OID0gcG9saWN5VmlvbGF0aW9uOwogIEBEZXByZWNhdGVkKCJVc2UgbWVzc2FnZVRvb0JpZyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE1FU1NBR0VfVE9PX0JJRyA9IG1lc3NhZ2VUb29CaWc7CiAgQERlcHJlY2F0ZWQoIlVzZSBtaXNzaW5nTWFuZGF0b3J5RXh0ZW5zaW9uIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTUlTU0lOR19NQU5EQVRPUllfRVhURU5TSU9OID0gbWlzc2luZ01hbmRhdG9yeUV4dGVuc2lvbjsKICBARGVwcmVjYXRlZCgiVXNlIGludGVybmFsU2VydmVyRXJyb3IgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBJTlRFUk5BTF9TRVJWRVJfRVJST1IgPSBpbnRlcm5hbFNlcnZlckVycm9yOwogIEBEZXByZWNhdGVkKCJVc2UgcmVzZXJ2ZWQxMDE1IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUkVTRVJWRURfMTAxNSA9IHJlc2VydmVkMTAxNTsKfQoKLy8vIE9wdGlvbnMgY29udHJvbGxpbmcgY29tcHJlc3Npb24gaW4gYSBbV2ViU29ja2V0XS4KLy8vCi8vLyBBIFtDb21wcmVzc2lvbk9wdGlvbnNdIGluc3RhbmNlIGNhbiBiZSBwYXNzZWQgdG8gW1dlYlNvY2tldC5jb25uZWN0XSwgb3IKLy8vIHVzZWQgaW4gb3RoZXIgc2ltaWxhciBwbGFjZXMgd2hlcmUgW1dlYlNvY2tldF0gY29tcHJlc3Npb24gaXMgY29uZmlndXJlZC4KLy8vCi8vLyBJbiBtb3N0IGNhc2VzIHRoZSBkZWZhdWx0IFtjb21wcmVzc2lvbkRlZmF1bHRdIGlzIHN1ZmZpY2llbnQsIGJ1dCBpbiBzb21lCi8vLyBzaXR1YXRpb25zLCBpdCBtaWdodCBiZSBkZXNpcmFibGUgdG8gdXNlIGRpZmZlcmVudCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLAovLy8gZm9yIGV4YW1wbGUgdG8gcHJlc2VydmUgbWVtb3J5IG9uIHNtYWxsIGRldmljZXMuCmNsYXNzIENvbXByZXNzaW9uT3B0aW9ucyB7CiAgLy8vIERlZmF1bHQgW1dlYlNvY2tldF0gY29tcHJlc3Npb24gY29uZmlndXJhdGlvbi4KICAvLy8KICAvLy8gRW5hYmxlcyBjb21wcmVzc2lvbiB3aXRoIGRlZmF1bHQgd2luZG93IHNpemVzIGFuZCBubyByZXVzZS4gVGhpcyBpcyB0aGUKICAvLy8gZGVmYXVsdCBvcHRpb25zIHVzZWQgYnkgW1dlYlNvY2tldC5jb25uZWN0XSBpZiBubyBbQ29tcHJlc3Npb25PcHRpb25zXSBpcwogIC8vLyBzdXBwbGllZC4KICAvLy8KICAvLy8gKiBgY2xpZW50Tm9Db250ZXh0VGFrZW92ZXJgOiBmYWxzZQogIC8vLyAqIGBzZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlcmA6IGZhbHNlCiAgLy8vICogYGNsaWVudE1heFdpbmRvd0JpdHNgOiBudWxsIChkZWZhdWx0IG1heGltYWwgd2luZG93IHNpemUgb2YgMTUgYml0cykKICAvLy8gKiBgc2VydmVyTWF4V2luZG93Qml0c2A6IG51bGwgKGRlZmF1bHQgbWF4aW1hbCB3aW5kb3cgc2l6ZSBvZiAxNSBiaXRzKQogIHN0YXRpYyBjb25zdCBDb21wcmVzc2lvbk9wdGlvbnMgY29tcHJlc3Npb25EZWZhdWx0ID0KICAgICAgY29uc3QgQ29tcHJlc3Npb25PcHRpb25zKCk7CiAgQERlcHJlY2F0ZWQoIlVzZSBjb21wcmVzc2lvbkRlZmF1bHQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IENvbXByZXNzaW9uT3B0aW9ucyBERUZBVUxUID0gY29tcHJlc3Npb25EZWZhdWx0OwoKICAvLy8gTm8tY29tcHJlc3Npb24gY29uZmlndXJhdGlvbi4KICAvLy8KICAvLy8gRGlzYWJsZXMgY29tcHJlc3Npb24gd2hlbiB1c2VkIGFzIGNvbXByZXNzaW9uIGNvbmZpZ3VyYXRpb24gZm9yIGEKICAvLy8gW1dlYlNvY2tldF0uCiAgc3RhdGljIGNvbnN0IENvbXByZXNzaW9uT3B0aW9ucyBjb21wcmVzc2lvbk9mZiA9CiAgICAgIGNvbnN0IENvbXByZXNzaW9uT3B0aW9ucyhlbmFibGVkOiBmYWxzZSk7CiAgQERlcHJlY2F0ZWQoIlVzZSBjb21wcmVzc2lvbk9mZiBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQ29tcHJlc3Npb25PcHRpb25zIE9GRiA9IGNvbXByZXNzaW9uT2ZmOwoKICAvLy8gV2hldGhlciB0aGUgY2xpZW50IHdpbGwgcmV1c2UgaXRzIGNvbXByZXNzaW9uIGluc3RhbmNlcy4KICBmaW5hbCBib29sIGNsaWVudE5vQ29udGV4dFRha2VvdmVyOwoKICAvLy8gV2hldGhlciB0aGUgc2VydmVyIHdpbGwgcmV1c2UgaXRzIGNvbXByZXNzaW9uIGluc3RhbmNlcy4KICBmaW5hbCBib29sIHNlcnZlck5vQ29udGV4dFRha2VvdmVyOwoKICAvLy8gVGhlIG1heGltYWwgd2luZG93IHNpemUgYml0IGNvdW50IHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LgogIC8vLwogIC8vLyBUaGUgd2luZG93cyBzaXplIGZvciB0aGUgY29tcHJlc3Npb24gaXMgYWx3YXlzIGEgcG93ZXIgb2YgdHdvLCBzbyB0aGUKICAvLy8gbnVtYmVyIG9mIGJpdHMgcHJlY2lzZWx5IGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLgogIC8vLwogIC8vLyBJZiBzZXQgdG8gYG51bGxgLCB0aGUgY2xpZW50IGhhcyBubyBwcmVmZXJlbmNlLCBhbmQgdGhlIGNvbXByZXNzaW9uIGNhbgogIC8vLyB1c2UgdXAgdG8gaXRzIGRlZmF1bHQgbWF4aW11bSB3aW5kb3cgc2l6ZSBvZiAxNSBiaXRzIGRlcGVuZGluZyBvbiB0aGUKICAvLy8gc2VydmVyJ3MgcHJlZmVyZW5jZS4KICBmaW5hbCBpbnQgY2xpZW50TWF4V2luZG93Qml0czsKCiAgLy8vIFRoZSBtYXhpbWFsIHdpbmRvdyBzaXplIGJpdCBjb3VudCByZXF1ZXN0ZWQgYnkgdGhlIHNlcnZlci4KICAvLy8KICAvLy8gVGhlIHdpbmRvd3Mgc2l6ZSBmb3IgdGhlIGNvbXByZXNzaW9uIGlzIGFsd2F5cyBhIHBvd2VyIG9mIHR3bywgc28gdGhlCiAgLy8vIG51bWJlciBvZiBiaXRzIHByZWNpc2VseSBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4KICAvLy8KICAvLy8gSWYgc2V0IHRvIGBudWxsYCwgdGhlIHNlcnZlciBoYXMgbm8gcHJlZmVyZW5jZSwgYW5kIHRoZSBjb21wcmVzc2lvbiBjYW4KICAvLy8gdXNlIHVwIHRvIGl0cyBkZWZhdWx0IG1heGltdW0gd2luZG93IHNpemUgb2YgMTUgYml0cyBkZXBlbmRpbmcgb24gdGhlCiAgLy8vIGNsaWVudCdzIHByZWZlcmVuY2UuCiAgZmluYWwgaW50IHNlcnZlck1heFdpbmRvd0JpdHM7CgogIC8vLyBXaGV0aGVyIFdlYlNvY2tldCBjb21wcmVzc2lvbiBpcyBlbmFibGVkLgogIC8vLwogIC8vLyBJZiBub3QgZW5hYmxlZCwgdGhlIHJlbWFpbmluZyBmaWVsZHMgaGF2ZSBubyBlZmZlY3QsIGFuZCB0aGUKICAvLy8gW2NvbXByZXNzaW9uT2ZmXSBpbnN0YW5jZSBjYW4sIGFuZCBzaG91bGQsIGJlIHJldXNlZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEKICAvLy8gbmV3IGluc3RhbmNlIHdpdGggY29tcHJlc3Npb24gZGlzYWJsZWQuCiAgZmluYWwgYm9vbCBlbmFibGVkOwoKICBjb25zdCBDb21wcmVzc2lvbk9wdGlvbnMoCiAgICAgIHt0aGlzLmNsaWVudE5vQ29udGV4dFRha2VvdmVyID0gZmFsc2UsCiAgICAgIHRoaXMuc2VydmVyTm9Db250ZXh0VGFrZW92ZXIgPSBmYWxzZSwKICAgICAgdGhpcy5jbGllbnRNYXhXaW5kb3dCaXRzLAogICAgICB0aGlzLnNlcnZlck1heFdpbmRvd0JpdHMsCiAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWV9KTsKCiAgLy8vIFBhcnNlcyBsaXN0IG9mIHJlcXVlc3RlZCBzZXJ2ZXIgaGVhZGVycyB0byByZXR1cm4gc2VydmVyIGNvbXByZXNzaW9uCiAgLy8vIHJlc3BvbnNlIGhlYWRlcnMuCiAgLy8vCiAgLy8vIFVzZXMgW3NlcnZlck1heFdpbmRvd0JpdHNdIHZhbHVlIGlmIHNldCwgb3RoZXJ3aXNlIHdpbGwgYXR0ZW1wdCB0byB1c2UKICAvLy8gdmFsdWUgZnJvbSBoZWFkZXJzLiBEZWZhdWx0cyB0byBbV2ViU29ja2V0LkRFRkFVTFRfV0lORE9XX0JJVFNdLiBSZXR1cm5zIGEKICAvLy8gW19Db21wcmVzc2lvbk1heFdpbmRvd0JpdHNdIG9iamVjdCB3aGljaCBjb250YWlucyB0aGUgcmVzcG9uc2UgaGVhZGVycyBhbmQKICAvLy8gbmVnb3RpYXRlZCBtYXggd2luZG93IGJpdHMuCiAgX0NvbXByZXNzaW9uTWF4V2luZG93Qml0cyBfY3JlYXRlU2VydmVyUmVzcG9uc2VIZWFkZXIoSGVhZGVyVmFsdWUgcmVxdWVzdGVkKSB7CiAgICB2YXIgaW5mbyA9IG5ldyBfQ29tcHJlc3Npb25NYXhXaW5kb3dCaXRzKCk7CgogICAgaW50IG13YjsKICAgIFN0cmluZyBwYXJ0OwogICAgaWYgKHJlcXVlc3RlZD8ucGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIHBhcnQgPSByZXF1ZXN0ZWQucGFyYW1ldGVyc1tfc2VydmVyTWF4V2luZG93Qml0c107CiAgICB9CiAgICBpZiAocGFydCAhPSBudWxsKSB7CiAgICAgIGlmIChwYXJ0Lmxlbmd0aCA+PSAyICYmIHBhcnQuc3RhcnRzV2l0aCgnMCcpKSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIklsbGVnYWwgMCBwYWRkaW5nIG9uIHZhbHVlLiIpOwogICAgICB9IGVsc2UgewogICAgICAgIG13YiA9IHNlcnZlck1heFdpbmRvd0JpdHMgPT0gbnVsbAogICAgICAgICAgICA/IGludC5wYXJzZShwYXJ0LAogICAgICAgICAgICAgICAgb25FcnJvcjogKHNvdXJjZSkgPT4gX1dlYlNvY2tldEltcGwuREVGQVVMVF9XSU5ET1dfQklUUykKICAgICAgICAgICAgOiBzZXJ2ZXJNYXhXaW5kb3dCaXRzOwogICAgICAgIGluZm8uaGVhZGVyVmFsdWUgPSAiOyBzZXJ2ZXJfbWF4X3dpbmRvd19iaXRzPSR7bXdifSI7CiAgICAgICAgaW5mby5tYXhXaW5kb3dCaXRzID0gbXdiOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpbmZvLmhlYWRlclZhbHVlID0gIiI7CiAgICAgIGluZm8ubWF4V2luZG93Qml0cyA9IF9XZWJTb2NrZXRJbXBsLkRFRkFVTFRfV0lORE9XX0JJVFM7CiAgICB9CiAgICByZXR1cm4gaW5mbzsKICB9CgogIC8vLyBSZXR1cm5zIGRlZmF1bHQgdmFsdWVzIGZvciBjbGllbnQgY29tcHJlc3Npb24gcmVxdWVzdCBoZWFkZXJzLgogIFN0cmluZyBfY3JlYXRlQ2xpZW50UmVxdWVzdEhlYWRlcihIZWFkZXJWYWx1ZSByZXF1ZXN0ZWQsIGludCBzaXplKSB7CiAgICB2YXIgaW5mbyA9ICIiOwoKICAgIC8vIElmIHJlc3BvbmRpbmcgdG8gYSB2YWxpZCByZXF1ZXN0LCBzcGVjaWZ5IHNpemUKICAgIGlmIChyZXF1ZXN0ZWQgIT0gbnVsbCkgewogICAgICBpbmZvID0gIjsgY2xpZW50X21heF93aW5kb3dfYml0cz0kc2l6ZSI7CiAgICB9IGVsc2UgewogICAgICAvLyBDbGllbnQgcmVxdWVzdC4gU3BlY2lmeSBkZWZhdWx0CiAgICAgIGlmIChjbGllbnRNYXhXaW5kb3dCaXRzID09IG51bGwpIHsKICAgICAgICBpbmZvID0gIjsgY2xpZW50X21heF93aW5kb3dfYml0cyI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5mbyA9ICI7IGNsaWVudF9tYXhfd2luZG93X2JpdHM9JGNsaWVudE1heFdpbmRvd0JpdHMiOwogICAgICB9CiAgICAgIGlmIChzZXJ2ZXJNYXhXaW5kb3dCaXRzICE9IG51bGwpIHsKICAgICAgICBpbmZvICs9ICI7IHNlcnZlcl9tYXhfd2luZG93X2JpdHM9JHNlcnZlck1heFdpbmRvd0JpdHMiOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGluZm87CiAgfQoKICAvLy8gQ3JlYXRlIGEgQ29tcHJlc3Npb24gSGVhZGVyLgogIC8vLwogIC8vLyBJZiBbcmVxdWVzdGVkXSBpcyBudWxsIG9yIGNvbnRhaW5zIGNsaWVudCByZXF1ZXN0IGhlYWRlcnMsIHJldHVybnMgQ2xpZW50CiAgLy8vIGNvbXByZXNzaW9uIHJlcXVlc3QgaGVhZGVycyB3aXRoIGRlZmF1bHQgc2V0dGluZ3MgZm9yCiAgLy8vIGBjbGllbnRfbWF4X3dpbmRvd19iaXRzYCBoZWFkZXIgdmFsdWUuICBJZiBbcmVxdWVzdGVkXSBjb250YWlucyBzZXJ2ZXIKICAvLy8gcmVzcG9uc2UgaGVhZGVycyB0aGlzIG1ldGhvZCByZXR1cm5zIGEgU2VydmVyIGNvbXByZXNzaW9uIHJlc3BvbnNlIGhlYWRlcgogIC8vLyBuZWdvdGlhdGluZyB0aGUgbWF4IHdpbmRvdyBiaXRzIGZvciBib3RoIGNsaWVudCBhbmQgc2VydmVyIGFzIHJlcXVlc3RlZAogIC8vLyBgc2VydmVyX21heF93aW5kb3dfYml0c2AgdmFsdWUuICBUaGlzIG1ldGhvZCByZXR1cm5zIGEKICAvLy8gW19Db21wcmVzc2lvbk1heFdpbmRvd0JpdHNdIG9iamVjdCB3aXRoIHRoZSByZXNwb25zZSBoZWFkZXJzIGFuZAogIC8vLyBuZWdvdGlhdGVkIGBtYXhXaW5kb3dCaXRzYCB2YWx1ZS4KICBfQ29tcHJlc3Npb25NYXhXaW5kb3dCaXRzIF9jcmVhdGVIZWFkZXIoW0hlYWRlclZhbHVlIHJlcXVlc3RlZF0pIHsKICAgIHZhciBpbmZvID0gbmV3IF9Db21wcmVzc2lvbk1heFdpbmRvd0JpdHMoIiIsIDApOwogICAgaWYgKCFlbmFibGVkKSB7CiAgICAgIHJldHVybiBpbmZvOwogICAgfQoKICAgIGluZm8uaGVhZGVyVmFsdWUgPSBfV2ViU29ja2V0SW1wbC5QRVJfTUVTU0FHRV9ERUZMQVRFOwoKICAgIGlmIChjbGllbnROb0NvbnRleHRUYWtlb3ZlciAmJgogICAgICAgIChyZXF1ZXN0ZWQgPT0gbnVsbCB8fAogICAgICAgICAgICAocmVxdWVzdGVkICE9IG51bGwgJiYKICAgICAgICAgICAgICAgIHJlcXVlc3RlZC5wYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KF9jbGllbnROb0NvbnRleHRUYWtlb3ZlcikpKSkgewogICAgICBpbmZvLmhlYWRlclZhbHVlICs9ICI7IGNsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyIjsKICAgIH0KCiAgICBpZiAoc2VydmVyTm9Db250ZXh0VGFrZW92ZXIgJiYKICAgICAgICAocmVxdWVzdGVkID09IG51bGwgfHwKICAgICAgICAgICAgKHJlcXVlc3RlZCAhPSBudWxsICYmCiAgICAgICAgICAgICAgICByZXF1ZXN0ZWQucGFyYW1ldGVycy5jb250YWluc0tleShfc2VydmVyTm9Db250ZXh0VGFrZW92ZXIpKSkpIHsKICAgICAgaW5mby5oZWFkZXJWYWx1ZSArPSAiOyBzZXJ2ZXJfbm9fY29udGV4dF90YWtlb3ZlciI7CiAgICB9CgogICAgdmFyIGhlYWRlckxpc3QgPSBfY3JlYXRlU2VydmVyUmVzcG9uc2VIZWFkZXIocmVxdWVzdGVkKTsKICAgIGluZm8uaGVhZGVyVmFsdWUgKz0gaGVhZGVyTGlzdC5oZWFkZXJWYWx1ZTsKICAgIGluZm8ubWF4V2luZG93Qml0cyA9IGhlYWRlckxpc3QubWF4V2luZG93Qml0czsKCiAgICBpbmZvLmhlYWRlclZhbHVlICs9CiAgICAgICAgX2NyZWF0ZUNsaWVudFJlcXVlc3RIZWFkZXIocmVxdWVzdGVkLCBpbmZvLm1heFdpbmRvd0JpdHMpOwoKICAgIHJldHVybiBpbmZvOwogIH0KfQoKLyoqCiAqIFRoZSBbV2ViU29ja2V0VHJhbnNmb3JtZXJdIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHVwZ3JhZGUgYQogKiBbSHR0cFJlcXVlc3RdIHRvIGEgW1dlYlNvY2tldF0gY29ubmVjdGlvbi4gSXQgc3VwcG9ydHMgYm90aAogKiB1cGdyYWRpbmcgYSBzaW5nbGUgW0h0dHBSZXF1ZXN0XSBhbmQgdXBncmFkaW5nIGEgc3RyZWFtIG9mCiAqIFtIdHRwUmVxdWVzdF1zLgogKgogKiBUbyB1cGdyYWRlIGEgc2luZ2xlIFtIdHRwUmVxdWVzdF0gdXNlIHRoZSBzdGF0aWMgW3VwZ3JhZGVdIG1ldGhvZC4KICoKICogICAgIEh0dHBTZXJ2ZXIgc2VydmVyOwogKiAgICAgc2VydmVyLmxpc3RlbigocmVxdWVzdCkgewogKiAgICAgICBpZiAoLi4uKSB7CiAqICAgICAgICAgV2ViU29ja2V0VHJhbnNmb3JtZXIudXBncmFkZShyZXF1ZXN0KS50aGVuKCh3ZWJzb2NrZXQpIHsKICogICAgICAgICAgIC4uLgogKiAgICAgICAgIH0pOwogKiAgICAgICB9IGVsc2UgewogKiAgICAgICAgIC8vIERvIG5vcm1hbCBIVFRQIHJlcXVlc3QgcHJvY2Vzc2luZy4KICogICAgICAgfQogKiAgICAgfSk7CiAqCiAqIFRvIHRyYW5zZm9ybSBhIHN0cmVhbSBvZiBbSHR0cFJlcXVlc3RdIGV2ZW50cyBhcyBpdCBpbXBsZW1lbnRzIGEKICogc3RyZWFtIHRyYW5zZm9ybWVyIHRoYXQgdHJhbnNmb3JtcyBhIHN0cmVhbSBvZiBIdHRwUmVxdWVzdCBpbnRvIGEKICogc3RyZWFtIG9mIFdlYlNvY2tldHMgYnkgdXBncmFkaW5nIGVhY2ggSHR0cFJlcXVlc3QgZnJvbSB0aGUgSFRUUCBvcgogKiBIVFRQUyBzZXJ2ZXIsIHRvIHRoZSBXZWJTb2NrZXQgcHJvdG9jb2wuCiAqCiAqICAgICBzZXJ2ZXIudHJhbnNmb3JtKG5ldyBXZWJTb2NrZXRUcmFuc2Zvcm1lcigpKS5saXN0ZW4oKHdlYlNvY2tldCkgPT4gLi4uKTsKICoKICogVGhpcyB0cmFuc2Zvcm1lciBzdHJpdmVzIHRvIGltcGxlbWVudCBXZWJTb2NrZXRzIGFzIHNwZWNpZmllZCBieSBSRkM2NDU1LgogKi8KYWJzdHJhY3QgY2xhc3MgV2ViU29ja2V0VHJhbnNmb3JtZXIKICAgIGltcGxlbWVudHMgU3RyZWFtVHJhbnNmb3JtZXI8SHR0cFJlcXVlc3QsIFdlYlNvY2tldD4gewogIC8qKgogICAqIENyZWF0ZSBhIG5ldyBbV2ViU29ja2V0VHJhbnNmb3JtZXJdLgogICAqCiAgICogSWYgW3Byb3RvY29sU2VsZWN0b3JdIGlzIHByb3ZpZGVkLCBbcHJvdG9jb2xTZWxlY3Rvcl0gd2lsbCBiZSBjYWxsZWQgdG8KICAgKiBzZWxlY3Qgd2hhdCBwcm90b2NvbCB0byB1c2UsIGlmIGFueSB3ZXJlIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQuCiAgICogW3Byb3RvY29sU2VsZWN0b3JdIGlzIHNob3VsZCByZXR1cm4gZWl0aGVyIGEgW1N0cmluZ10gb3IgYSBbRnV0dXJlXQogICAqIGNvbXBsZXRpbmcgd2l0aCBhIFtTdHJpbmddLiBUaGUgW1N0cmluZ10gbXVzdCBleGlzdCBpbiB0aGUgbGlzdCBvZgogICAqIHByb3RvY29scy4KICAgKgogICAqIElmIFtjb21wcmVzc2lvbl0gaXMgcHJvdmlkZWQsIHRoZSBbV2ViU29ja2V0XSBjcmVhdGVkIHdpbGwgYmUgY29uZmlndXJlZAogICAqIHRvIG5lZ290aWF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgW0NvbXByZXNzaW9uT3B0aW9uc10uIElmIG5vbmUgaXMgc3BlY2lmaWVkCiAgICogdGhlbiB0aGUgW1dlYlNvY2tldF0gd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGRlZmF1bHQgW0NvbXByZXNzaW9uT3B0aW9uc10uCiAgICovCiAgZmFjdG9yeSBXZWJTb2NrZXRUcmFuc2Zvcm1lcigKICAgICAgey8qU3RyaW5nfEZ1dHVyZTxTdHJpbmc+Ki8gcHJvdG9jb2xTZWxlY3RvcihMaXN0PFN0cmluZz4gcHJvdG9jb2xzKSwKICAgICAgQ29tcHJlc3Npb25PcHRpb25zIGNvbXByZXNzaW9uOiBDb21wcmVzc2lvbk9wdGlvbnMuY29tcHJlc3Npb25EZWZhdWx0fSkgewogICAgcmV0dXJuIG5ldyBfV2ViU29ja2V0VHJhbnNmb3JtZXJJbXBsKHByb3RvY29sU2VsZWN0b3IsIGNvbXByZXNzaW9uKTsKICB9CgogIC8qKgogICAqIFVwZ3JhZGVzIGEgW0h0dHBSZXF1ZXN0XSB0byBhIFtXZWJTb2NrZXRdIGNvbm5lY3Rpb24uIElmIHRoZQogICAqIHJlcXVlc3QgaXMgbm90IGEgdmFsaWQgV2ViU29ja2V0IHVwZ3JhZGUgcmVxdWVzdCBhbiBIVFRQIHJlc3BvbnNlCiAgICogd2l0aCBzdGF0dXMgY29kZSA1MDAgd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSByZXR1cm5lZAogICAqIGZ1dHVyZSB3aWxsIGNvbXBsZXRlIHdpdGggdGhlIFtXZWJTb2NrZXRdIHdoZW4gdGhlIHVwZ3JhZGUgcHJvY2VzcwogICAqIGlzIGNvbXBsZXRlLgogICAqCiAgICogSWYgW3Byb3RvY29sU2VsZWN0b3JdIGlzIHByb3ZpZGVkLCBbcHJvdG9jb2xTZWxlY3Rvcl0gd2lsbCBiZSBjYWxsZWQgdG8KICAgKiBzZWxlY3Qgd2hhdCBwcm90b2NvbCB0byB1c2UsIGlmIGFueSB3ZXJlIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQuCiAgICogW3Byb3RvY29sU2VsZWN0b3JdIGlzIHNob3VsZCByZXR1cm4gZWl0aGVyIGEgW1N0cmluZ10gb3IgYSBbRnV0dXJlXQogICAqIGNvbXBsZXRpbmcgd2l0aCBhIFtTdHJpbmddLiBUaGUgW1N0cmluZ10gbXVzdCBleGlzdCBpbiB0aGUgbGlzdCBvZgogICAqIHByb3RvY29scy4KICAgKgogICAqIElmIFtjb21wcmVzc2lvbl0gaXMgcHJvdmlkZWQsIHRoZSBbV2ViU29ja2V0XSBjcmVhdGVkIHdpbGwgYmUgY29uZmlndXJlZAogICAqIHRvIG5lZ290aWF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgW0NvbXByZXNzaW9uT3B0aW9uc10uIElmIG5vbmUgaXMgc3BlY2lmaWVkCiAgICogdGhlbiB0aGUgW1dlYlNvY2tldF0gd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGRlZmF1bHQgW0NvbXByZXNzaW9uT3B0aW9uc10uCiAgICovCiAgc3RhdGljIEZ1dHVyZTxXZWJTb2NrZXQ+IHVwZ3JhZGUoSHR0cFJlcXVlc3QgcmVxdWVzdCwKICAgICAge3Byb3RvY29sU2VsZWN0b3IoTGlzdDxTdHJpbmc+IHByb3RvY29scyksCiAgICAgIENvbXByZXNzaW9uT3B0aW9ucyBjb21wcmVzc2lvbjogQ29tcHJlc3Npb25PcHRpb25zLmNvbXByZXNzaW9uRGVmYXVsdH0pIHsKICAgIHJldHVybiBfV2ViU29ja2V0VHJhbnNmb3JtZXJJbXBsLl91cGdyYWRlKAogICAgICAgIHJlcXVlc3QsIHByb3RvY29sU2VsZWN0b3IsIGNvbXByZXNzaW9uKTsKICB9CgogIC8qKgogICAqIENoZWNrcyB3aGV0aGVyIHRoZSByZXF1ZXN0IGlzIGEgdmFsaWQgV2ViU29ja2V0IHVwZ3JhZGUgcmVxdWVzdC4KICAgKi8KICBzdGF0aWMgYm9vbCBpc1VwZ3JhZGVSZXF1ZXN0KEh0dHBSZXF1ZXN0IHJlcXVlc3QpIHsKICAgIHJldHVybiBfV2ViU29ja2V0VHJhbnNmb3JtZXJJbXBsLl9pc1VwZ3JhZGVSZXF1ZXN0KHJlcXVlc3QpOwogIH0KfQoKLyoqCiAqIEEgdHdvLXdheSBIVFRQIGNvbW11bmljYXRpb24gb2JqZWN0IGZvciBjbGllbnQgb3Igc2VydmVyIGFwcGxpY2F0aW9ucy4KICoKICogVGhlIHN0cmVhbSBleHBvc2VzIHRoZSBtZXNzYWdlcyByZWNlaXZlZC4gQSB0ZXh0IG1lc3NhZ2Ugd2lsbCBiZSBvZiB0eXBlCiAqIGBTdHJpbmdgIGFuZCBhIGJpbmFyeSBtZXNzYWdlIHdpbGwgYmUgb2YgdHlwZSBgTGlzdDxpbnQ+YC4KICovCmFic3RyYWN0IGNsYXNzIFdlYlNvY2tldAogICAgaW1wbGVtZW50cwogICAgICAgIFN0cmVhbTxkeW5hbWljIC8qU3RyaW5nfExpc3Q8aW50PiovID4sCiAgICAgICAgU3RyZWFtU2luazxkeW5hbWljIC8qU3RyaW5nfExpc3Q8aW50PiovID4gewogIC8qKgogICAqIFBvc3NpYmxlIHN0YXRlcyBvZiB0aGUgY29ubmVjdGlvbi4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IGNvbm5lY3RpbmcgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgb3BlbiA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBjbG9zaW5nID0gMjsKICBzdGF0aWMgY29uc3QgaW50IGNsb3NlZCA9IDM7CgogIEBEZXByZWNhdGVkKCJVc2UgY29ubmVjdGluZyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IENPTk5FQ1RJTkcgPSBjb25uZWN0aW5nOwogIEBEZXByZWNhdGVkKCJVc2Ugb3BlbiBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE9QRU4gPSBvcGVuOwogIEBEZXByZWNhdGVkKCJVc2UgY2xvc2luZyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IENMT1NJTkcgPSBjbG9zaW5nOwogIEBEZXByZWNhdGVkKCJVc2UgY2xvc2VkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgQ0xPU0VEID0gY2xvc2VkOwoKICAvKioKICAgKiBTZXQgYW5kIGdldCB0aGUgaW50ZXJ2YWwgZm9yIHNlbmRpbmcgcGluZyBzaWduYWxzLiBJZiBhIHBpbmcgbWVzc2FnZSBpcyBub3QKICAgKiBhbnN3ZXJlZCBieSBhIHBvbmcgbWVzc2FnZSBmcm9tIHRoZSBwZWVyLCB0aGUgYFdlYlNvY2tldGAgaXMgYXNzdW1lZAogICAqIGRpc2Nvbm5lY3RlZCBhbmQgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIHdpdGggYQogICAqIFtXZWJTb2NrZXRTdGF0dXMuR09JTkdfQVdBWV0gY2xvc2UgY29kZS4gV2hlbiBhIHBpbmcgc2lnbmFsIGlzIHNlbnQsIHRoZQogICAqIHBvbmcgbWVzc2FnZSBtdXN0IGJlIHJlY2VpdmVkIHdpdGhpbiBbcGluZ0ludGVydmFsXS4KICAgKgogICAqIFRoZXJlIGFyZSBuZXZlciB0d28gb3V0c3RhbmRpbmcgcGluZ3MgYXQgYW55IGdpdmVuIHRpbWUsIGFuZCB0aGUgbmV4dCBwaW5nCiAgICogdGltZXIgc3RhcnRzIHdoZW4gdGhlIHBvbmcgaXMgcmVjZWl2ZWQuCiAgICoKICAgKiBTZXQgdGhlIFtwaW5nSW50ZXJ2YWxdIHRvIGBudWxsYCB0byBkaXNhYmxlIHNlbmRpbmcgcGluZyBtZXNzYWdlcy4KICAgKgogICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBudWxsYC4KICAgKi8KICBEdXJhdGlvbiBwaW5nSW50ZXJ2YWw7CgogIC8qKgogICAqIENyZWF0ZSBhIG5ldyBXZWJTb2NrZXQgY29ubmVjdGlvbi4gVGhlIFVSTCBzdXBwbGllZCBpbiBbdXJsXQogICAqIG11c3QgdXNlIHRoZSBzY2hlbWUgYHdzYCBvciBgd3NzYC4KICAgKgogICAqIFRoZSBbcHJvdG9jb2xzXSBhcmd1bWVudCBpcyBzcGVjaWZ5aW5nIHRoZSBzdWJwcm90b2NvbHMgdGhlCiAgICogY2xpZW50IGlzIHdpbGxpbmcgdG8gc3BlYWsuCiAgICoKICAgKiBUaGUgW2hlYWRlcnNdIGFyZ3VtZW50IGlzIHNwZWNpZnlpbmcgYWRkaXRpb25hbCBIVFRQIGhlYWRlcnMgZm9yCiAgICogc2V0dGluZyB1cCB0aGUgY29ubmVjdGlvbi4gVGhpcyB3b3VsZCB0eXBpY2FsbHkgYmUgdGhlIGBPcmlnaW5gCiAgICogaGVhZGVyIGFuZCBwb3RlbnRpYWxseSBjb29raWVzLiBUaGUga2V5cyBvZiB0aGUgbWFwIGFyZSB0aGUgaGVhZGVyCiAgICogZmllbGRzIGFuZCB0aGUgdmFsdWVzIGFyZSBlaXRoZXIgU3RyaW5nIG9yIExpc3Q8U3RyaW5nPi4KICAgKgogICAqIElmIFtoZWFkZXJzXSBpcyBwcm92aWRlZCwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGhlYWRlcnMKICAgKiB3aGljaCBhcmUgY29udHJvbGxlZCBieSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gcHJvY2Vzcy4gVGhlc2UKICAgKiBoZWFkZXJzIGFyZToKICAgKgogICAqICAgLSBgY29ubmVjdGlvbmAKICAgKiAgIC0gYHNlYy13ZWJzb2NrZXQta2V5YAogICAqICAgLSBgc2VjLXdlYnNvY2tldC1wcm90b2NvbGAKICAgKiAgIC0gYHNlYy13ZWJzb2NrZXQtdmVyc2lvbmAKICAgKiAgIC0gYHVwZ3JhZGVgCiAgICoKICAgKiBJZiBhbnkgb2YgdGhlc2UgYXJlIHBhc3NlZCBpbiB0aGUgYGhlYWRlcnNgIG1hcCB0aGV5IHdpbGwgYmUgaWdub3JlZC4KICAgKgogICAqIElmIHRoZSBgdXJsYCBjb250YWlucyB1c2VyIGluZm9ybWF0aW9uIHRoaXMgd2lsbCBiZSBwYXNzZWQgYXMgYmFzaWMKICAgKiBhdXRoZW50aWNhdGlvbiB3aGVuIHNldHRpbmcgdXAgdGhlIGNvbm5lY3Rpb24uCiAgICovCiAgc3RhdGljIEZ1dHVyZTxXZWJTb2NrZXQ+IGNvbm5lY3QoU3RyaW5nIHVybCwKICAgICAgICAgIHtJdGVyYWJsZTxTdHJpbmc+IHByb3RvY29scywKICAgICAgICAgIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGhlYWRlcnMsCiAgICAgICAgICBDb21wcmVzc2lvbk9wdGlvbnMgY29tcHJlc3Npb246CiAgICAgICAgICAgICAgQ29tcHJlc3Npb25PcHRpb25zLmNvbXByZXNzaW9uRGVmYXVsdH0pID0+CiAgICAgIF9XZWJTb2NrZXRJbXBsLmNvbm5lY3QodXJsLCBwcm90b2NvbHMsIGhlYWRlcnMsIGNvbXByZXNzaW9uOiBjb21wcmVzc2lvbik7CgogIEBEZXByZWNhdGVkKCdUaGlzIGNvbnN0cnVjdG9yIHdpbGwgYmUgcmVtb3ZlZCBpbiBEYXJ0IDIuMC4gVXNlIGBpbXBsZW1lbnRzYCcKICAgICAgJyBpbnN0ZWFkIG9mIGBleHRlbmRzYCBpZiBpbXBsZW1lbnRpbmcgdGhpcyBhYnN0cmFjdCBjbGFzcy4nKQogIFdlYlNvY2tldCgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgV2ViU29ja2V0IGZyb20gYW4gYWxyZWFkeS11cGdyYWRlZCBzb2NrZXQuCiAgICoKICAgKiBUaGUgaW5pdGlhbCBXZWJTb2NrZXQgaGFuZHNoYWtlIG11c3QgaGF2ZSBvY2N1cnJlZCBwcmlvciB0byB0aGlzIGNhbGwuIEEKICAgKiBXZWJTb2NrZXQgY2xpZW50IGNhbiBhdXRvbWF0aWNhbGx5IHBlcmZvcm0gdGhlIGhhbmRzaGFrZSB1c2luZwogICAqIFtXZWJTb2NrZXQuY29ubmVjdF0sIHdoaWxlIGEgc2VydmVyIGNhbiBkbyBzbyB1c2luZwogICAqIFtXZWJTb2NrZXRUcmFuc2Zvcm1lci51cGdyYWRlXS4gVG8gbWFudWFsbHkgdXBncmFkZSBhbiBbSHR0cFJlcXVlc3RdLAogICAqIFtIdHRwUmVzcG9uc2UuZGV0YWNoU29ja2V0XSBtYXkgYmUgY2FsbGVkLgogICAqCiAgICogW3Byb3RvY29sXSBzaG91bGQgYmUgdGhlIHByb3RvY29sIG5lZ290aWF0ZWQgYnkgdGhpcyBoYW5kc2hha2UsIGlmIGFueS4KICAgKgogICAqIFtzZXJ2ZXJTaWRlXSBtdXN0IGJlIHBhc3NlZCBleHBsaWNpdGx5LiBJZiBpdCdzIGBmYWxzZWAsIHRoZSBXZWJTb2NrZXQgd2lsbAogICAqIGFjdCBhcyB0aGUgY2xpZW50IGFuZCBtYXNrIHRoZSBtZXNzYWdlcyBpdCBzZW5kcy4gSWYgaXQncyBgdHJ1ZWAsIGl0IHdpbGwKICAgKiBhY3QgYXMgdGhlIHNlcnZlciBhbmQgd2lsbCBub3QgbWFzayBpdHMgbWVzc2FnZXMuCiAgICoKICAgKiBJZiBbY29tcHJlc3Npb25dIGlzIHByb3ZpZGVkLCB0aGUgW1dlYlNvY2tldF0gY3JlYXRlZCB3aWxsIGJlIGNvbmZpZ3VyZWQKICAgKiB0byBuZWdvdGlhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIFtDb21wcmVzc2lvbk9wdGlvbnNdLiBJZiBub25lIGlzIHNwZWNpZmllZAogICAqIHRoZW4gdGhlIFtXZWJTb2NrZXRdIHdpbGwgYmUgY3JlYXRlZCB3aXRoIHRoZSBkZWZhdWx0IFtDb21wcmVzc2lvbk9wdGlvbnNdLgogICAqLwogIGZhY3RvcnkgV2ViU29ja2V0LmZyb21VcGdyYWRlZFNvY2tldChTb2NrZXQgc29ja2V0LAogICAgICB7U3RyaW5nIHByb3RvY29sLAogICAgICBib29sIHNlcnZlclNpZGUsCiAgICAgIENvbXByZXNzaW9uT3B0aW9ucyBjb21wcmVzc2lvbjogQ29tcHJlc3Npb25PcHRpb25zLmNvbXByZXNzaW9uRGVmYXVsdH0pIHsKICAgIGlmIChzZXJ2ZXJTaWRlID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSBzZXJ2ZXJTaWRlIGFyZ3VtZW50IG11c3QgYmUgcGFzc2VkICIKICAgICAgICAgICJleHBsaWNpdGx5IHRvIFdlYlNvY2tldC5mcm9tVXBncmFkZWRTb2NrZXQuIik7CiAgICB9CiAgICByZXR1cm4gbmV3IF9XZWJTb2NrZXRJbXBsLl9mcm9tU29ja2V0KAogICAgICAgIHNvY2tldCwgcHJvdG9jb2wsIGNvbXByZXNzaW9uLCBzZXJ2ZXJTaWRlKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb24uCiAgICovCiAgaW50IGdldCByZWFkeVN0YXRlOwoKICAvKioKICAgKiBUaGUgZXh0ZW5zaW9ucyBwcm9wZXJ0eSBpcyBpbml0aWFsbHkgdGhlIGVtcHR5IHN0cmluZy4gQWZ0ZXIgdGhlCiAgICogV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgdGhpcyBzdHJpbmcgcmVmbGVjdHMgdGhlCiAgICogZXh0ZW5zaW9ucyB1c2VkIGJ5IHRoZSBzZXJ2ZXIuCiAgICovCiAgU3RyaW5nIGdldCBleHRlbnNpb25zOwoKICAvKioKICAgKiBUaGUgcHJvdG9jb2wgcHJvcGVydHkgaXMgaW5pdGlhbGx5IHRoZSBlbXB0eSBzdHJpbmcuIEFmdGVyIHRoZQogICAqIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIHRoZSB2YWx1ZSBpcyB0aGUgc3VicHJvdG9jb2wKICAgKiBzZWxlY3RlZCBieSB0aGUgc2VydmVyLiBJZiBubyBzdWJwcm90b2NvbCBpcyBuZWdvdGlhdGVkIHRoZQogICAqIHZhbHVlIHdpbGwgcmVtYWluIFs6bnVsbDpdLgogICAqLwogIFN0cmluZyBnZXQgcHJvdG9jb2w7CgogIC8qKgogICAqIFRoZSBjbG9zZSBjb2RlIHNldCB3aGVuIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBjbG9zZWQuIElmCiAgICogdGhlcmUgaXMgbm8gY2xvc2UgY29kZSBhdmFpbGFibGUgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIFs6bnVsbDpdCiAgICovCiAgaW50IGdldCBjbG9zZUNvZGU7CgogIC8qKgogICAqIFRoZSBjbG9zZSByZWFzb24gc2V0IHdoZW4gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGNsb3NlZC4gSWYKICAgKiB0aGVyZSBpcyBubyBjbG9zZSByZWFzb24gYXZhaWxhYmxlIHRoaXMgcHJvcGVydHkgd2lsbCBiZSBbOm51bGw6XQogICAqLwogIFN0cmluZyBnZXQgY2xvc2VSZWFzb247CgogIC8qKgogICAqIENsb3NlcyB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uIFNldCB0aGUgb3B0aW9uYWwgW2NvZGVdIGFuZCBbcmVhc29uXQogICAqIGFyZ3VtZW50cyB0byBzZW5kIGNsb3NlIGluZm9ybWF0aW9uIHRvIHRoZSByZW1vdGUgcGVlci4gSWYgdGhleSBhcmUKICAgKiBvbWl0dGVkLCB0aGUgcGVlciB3aWxsIHNlZSBbV2ViU29ja2V0U3RhdHVzLk5PX1NUQVRVU19SRUNFSVZFRF0gY29kZQogICAqIHdpdGggbm8gcmVhc29uLgogICAqLwogIEZ1dHVyZSBjbG9zZShbaW50IGNvZGUsIFN0cmluZyByZWFzb25dKTsKCiAgLyoqCiAgICogU2VuZHMgZGF0YSBvbiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uIFRoZSBkYXRhIGluIFtkYXRhXSBtdXN0CiAgICogYmUgZWl0aGVyIGEgYFN0cmluZ2AsIG9yIGEgYExpc3Q8aW50PmAgaG9sZGluZyBieXRlcy4KICAgKi8KICB2b2lkIGFkZCgvKlN0cmluZ3xMaXN0PGludD4qLyBkYXRhKTsKCiAgLyoqCiAgICogU2VuZHMgZGF0YSBmcm9tIGEgc3RyZWFtIG9uIFdlYlNvY2tldCBjb25uZWN0aW9uLiBFYWNoIGRhdGEgZXZlbnQgZnJvbQogICAqIFtzdHJlYW1dIHdpbGwgYmUgc2VuZCBhcyBhIHNpbmdsZSBXZWJTb2NrZXQgZnJhbWUuIFRoZSBkYXRhIGZyb20gW3N0cmVhbV0KICAgKiBtdXN0IGJlIGVpdGhlciBgU3RyaW5nYHMsIG9yIGBMaXN0PGludD5gcyBob2xkaW5nIGJ5dGVzLgogICAqLwogIEZ1dHVyZSBhZGRTdHJlYW0oU3RyZWFtIHN0cmVhbSk7CgogIC8qKgogICAqIFNlbmRzIGEgdGV4dCBtZXNzYWdlIHdpdGggdGhlIHRleHQgcmVwcmVzZW50ZWQgYnkgW2J5dGVzXS4KICAgKgogICAqIFRoZSBbYnl0ZXNdIHNob3VsZCBiZSB2YWxpZCBVVEYtOCBlbmNvZGVkIFVuaWNvZGUgY2hhcmFjdGVycy4gSWYgdGhleSBhcmUKICAgKiBub3QsIHRoZSByZWNlaXZpbmcgZW5kIHdpbGwgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCiAgICovCiAgdm9pZCBhZGRVdGY4VGV4dChMaXN0PGludD4gYnl0ZXMpOwoKICAvKioKICAgKiBHZXRzIHRoZSB1c2VyIGFnZW50IHVzZWQgZm9yIFdlYlNvY2tldCBjb25uZWN0aW9ucy4KICAgKi8KICBzdGF0aWMgU3RyaW5nIGdldCB1c2VyQWdlbnQgPT4gX1dlYlNvY2tldEltcGwudXNlckFnZW50OwoKICAvKioKICAgKiBTZXRzIHRoZSB1c2VyIGFnZW50IHRvIHVzZSBmb3IgV2ViU29ja2V0IGNvbm5lY3Rpb25zLgogICAqLwogIHN0YXRpYyBzZXQgdXNlckFnZW50KFN0cmluZyB1c2VyQWdlbnQpIHsKICAgIF9XZWJTb2NrZXRJbXBsLnVzZXJBZ2VudCA9IHVzZXJBZ2VudDsKICB9Cn0KCmNsYXNzIFdlYlNvY2tldEV4Y2VwdGlvbiBpbXBsZW1lbnRzIElPRXhjZXB0aW9uIHsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgY29uc3QgV2ViU29ja2V0RXhjZXB0aW9uKFt0aGlzLm1lc3NhZ2UgPSAiIl0pOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiV2ViU29ja2V0RXhjZXB0aW9uOiAkbWVzc2FnZSI7Cn0KgfMATk48ARQBBEQEISklKSsoLCszKyk1LygBKzMnKyszLTcqMS46LTc1SS03KzQ3TDFAKjECATYETU4ETk81GzUGTlAQBikpTU03IjBAASQGSBMzMCw4AT8mAT8mAUEGTDsGTkwbIQFBBkw7Bk5MGyEBMAZDUS4WARwtLCAgHQFLGAZNUVEiUTABDREpOQYYNkAPKh5JIz4iCA0dPwYRBAFFRxMBNh0vDSkpKw9ACClBCAYB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gwgogwYpgwaExYMGhMaDBoTHgwaEyIMGhMmDBZiRgxAjgwWYl4MSAIIuhMqDFJiTgxWEy4MVhMyDFYTNgxWEY4MVgL2DFYTOgxWEz4MVhNCDFYTRgxWE0oMVhNODFYR8gxWEYYMVhLiDFYTUgxWE1YMVhNaDFYSDgxWE14MVhIKDFYTYgxXAAJAJgyuE2YMrhNqDK4TbgxSYlIMvhBqDL4Tdgy+E3IMvhN6DL4Tfgy+E5oMvhOeDL4Togy+E6YMvhOqDL4Trgy+E7IMvhIiDL4Ttgy+EpYMvhPGDL4Tygy+E84MvhPSDL4S8gy+E9YMUmJWDRYQag0WE3YNFhNyDRYTeg0WE34MUmJGDS4Tgg0uEk4NLhIqDS4Rkg0uETYNLhO+DSyODS4ROg0uEVINLwACQCYNVhFyDFJiXg1cAgi6E94NZmJODWoTMg1qEY4NagL2DWoRhg1qE+INZmJSDYIT5g2CEpYNghPGDYIQag2CEHYNghPqDYIT7g2CE/INghB+DYIJqg2CE/YNghP6DYIT/g1mYkYNuhE2DboTvg24jg26EZINZmJWDc4Qfg1mYl4N1AIIuhQCDd5iTg3iCkIN4hHyDeIUBg3iFAoN4hQODeIUEg3iFBYN4hQaDeIUHg3iFCIN3mJSDg4Qgg4OEG4ODhB2Dg4QZg4OFCYODhQqDg4ULg4OFDIODhPyDg4T6g4OE+4ODhB+Dg4T9g4OE/oN3mJWDkoQgg5KEG4OShB2DkoQZg5KFCYOShQqDkoULg5KEH4N3mJGDm4RNg5uE74ObhE6Dm4RUg5vAAJAJg6CEXIN3mJeDogCCLoUQg6SYk4OlhMuDpYR8g6WCaoOlhRGDpYUDg6WFEoOlhRODpJiUg62EHYOthB+DrYSHg62E/IOthPqDrYT7g62E/YOthP6DpJiVg7aEHYO2hB+DtoSHg6SYkYO6hE2DuoTvg7qEToO6hFSDusAAkAmDv4Rcg6SYl4PBAIIuhRaDw5iTg8SEfIPEhReDxIUYg8SEuIPEhLqDxIUZg8SEu4PEhQODxIUSg8OYlIPOhB2DzoQfg86E/IPOhPqDzoT7g86FGoPOgkWDzoT9g86E/oPDmJWD2IQdg9iEH4PYgkWDw5iRg9yETYPchO+D3IROg9yEVIPcwACQCYPhhFyDw5iXg+MAgi6FHYPlmJOD5oTLg+aCZ4PmhHyD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/AAAwACQEYv+mJOL/4ili/6CDYwBmJOMAnqMAobUjAKIkowCgM+MAoiTjAKIlIwBmJSMCYJPjAlejAmIn4wJgIaMAZiRjA6IlYwOgcOMDof7jA6H84wOiJaMDof4jA6Il4wOiKCMDoijjA6IpIwOgkKMAZiXjBoAAMAAkBKMHJiSjB2IqowcmJOMH4fQjB+Iv4wfiMGMH4jEjB+IyIwfiMmMH4jNjB+IzowfiNCMH4jTjB+I1YwfiNeMH4jZjB+I3IwfiOCMH4jhjB+I5IwfiOWMH4jojB+I64wfiO2MH4jwjB+I84wfiPSMH4j3jB+I+IwfiPyMH4j9jB+JAowfiQOMH4kHjB+JCIwfiQqMH4kMjB+JD4wfiRKMH4kVjB+JF4wfiRmMH4kbjB+JH4wfiSCMH4kijB+JJIwfiSeMH4kqjB+JLIwfiS+MH4kyjB+JM4wfiTaMH4k3jB+JOYwfiTuMH4k/jB+JQIwfiUSMH4fRjB+JRYwfiUeMH4lKjB+JS4wfiU+MH4lQjB+HzIwfiVGMH4fNjB+JUowfiVWMH4lYjB+JW4wfiV6MH4lgjB+H0owfiWKMH4lljB+JZ4wfiWqMH4ltjB+JcIwfiXSMH4l1jB+JeYwfiXqMH4l+jB+Jf4wfiYGMH4mCjB+JhowfiYeMH4mLjB+JjIwfiY+MH4mSjB+JlYwfiZeMH4mZjB+JnIwfiZ6MH4mgjB+JoowfiaWMH4mmjB+JqIwfiaqMH4msjB+JrYwfia+MH4mxjB+JtIwfibeMH4m4jB+JvIwfib2MH4nBjB+JwowficaMH4nHjB+JyowficuMH4nOjB+Jz4wfidSMH4nVjB+J2YwfidqMH4ndjB+J3owfieGMH4nijB+J5IwfieeMH4npjB+J7Iwfie6MH4nxjB+J84wfifaMH4n6jB+J+4wfif2MH4n/jB+KAYwfigOMH4oFjB+KB4wfigmMH4oLjB+KDYwfihCMH4oSjB+KFIwfihaMH4oZjB+KG4wfih6MH4ogjB+KIowfiiSMH4omjB+KKIwfiiuMH4otjB+KL4wfijGMH4o0jB+KNowfijmMH4o9jB+KPowfikKMH4pDjB+KRowfikeMH4pKjB+KS4wfik2MH4pQjB+KVIwfilWMH4pajB+KW4wfil6MH4phjB+KZowfimeMH4prjB+KbIwfinGMH4pyjB+KdIwfineMH4p7jB+KfIwfioCMH4qBjB+KhowfioeMH4qLjB+KjIwfipCMH4qRjB+Kk4wfipWMH4qZjB+Kmowfip6MH4qfjB+KoYwfiqOMH4qnjB+KqIwfiqqMH4qsjB+KsIwfirGMH4q1jB+KtowfirmMH4q8jB+KvowfisGMH4rDjB+KxowfisiMH4rLjB+Kz4wfitCMH4rTjB+K1IwfiteMH4rajB+K3owfit+MH4rhjB+K5IwfiuaMH4rojB+K64wfiu6MH4rwjB+K8owfivSMH4r2jB+K+owfivuMH4r/jB+LAIwfiwOMH4sFjB+LCYwfiwqMH4sMjB+LD4wfixGMH4sTjB+LFYwfixeMH4sZjB+LG4wfix2MH4sgjB+LIYwfiyOMH4sljB+LJ4wfiyiMH4srjB+LLYwfizCMH4syjB+LNIwfizaMH4s5jB+LO4wfiz2MH4tAjB+LQowfi0SMH4tHjB+LSYwfi0uMH4tNjB+LUIwfi1KMH4tUjB+LVowfi1iMH4tdjB+LXowfi2KMH4tjjB+LZowfi2eMH4tpjB+LbIwfi3CMH4txjB+LdYwfi3aMH4t6jB+Le4wfi3+MH4uAjB+Lgowfi4WMH4uIjB+LiYwfi42MH4uOjB+Lkowfi5OMH4uVjB+Llowfi5iMH4uajB+LnIwfi5+MH4uijB+LpIwfi6aMH4upjB+LrIwfi62MH4uwjB+Ls4wfi7WMH4u3jB+Lu4wfi7yMH4u+jB+LwIwfi8KMH4vEjB+LyIwfi8mMH4vMjB+LzYwfi9CMH4vRjB+L1Iwfi9WMH4vXjB+L2owfi9yMH4vejB+L4Iwfi+OMH4vmjB+L54wfi+qMH4vsjB+L8Iwfi/GMH4vzjB+L9Ywfi/iMH4v5jB+L+4wfi/6MH4wAjB+MA4wfjAeMH4wIjB+MDIwfjA2MH4wSjB+ME4wfjBaMH4wXjB+MG4wfjByMH4wgjB+MIYwfjCSMH4wljB+MKIwfjCmMH4wsjB+MLYwfjDCMH4wyjB+MNowfjDeMH4w7jB+MPIwfjD6MH4xAjB+MQ4wfjESMH4xHjB+MSIwfjEqMH4xMjB+MTowfjFCMH4xSjB+MVIwfjFaMH4xYjB+MWowfjFyMH4xejB+MYIwfjGKMH4xkjB+MZowfjGiMH4xqjB+MbIwfjG6MH4xwjB+McowfjHSMH4x4jB+MeYwfjH2MH4x+jB+MgowfjIOMH4yHjB+MiIwfjIuMH4yOjB+MkYwfjJSMH4yWjB+MmIwfjJqMH4ydjB+Mn4wfjKGMH4ykjB+Mp4wfjKqMH4yrjB+MrowfjK+MH4yxjB+MtIwfjLmMH4y6jB+MvowfjL+MH4zEjB+MxYwfjMmMH4zKjB+MzowfjM+MH4zSjB+M1YwfjNmMH4zajB+M3IwfjN+MH4zkjB+M5YwfjOiMH4zpjB+M7YwfjO6MH4zxjB+M8owfjPaMH4z3jB+M+YwfjPyMH4z+jB+NAYwfjQOMH40FjB+NB4wfjQmMH40NjB+NDowfjRGMH40SjB+NFowfjReMH40bjB+NHIwfjSCMH40hjB+NJIwfjSWMH40ojB+NK4wfjS6MH40xjB+NNIwfjTeMH405jB+NO4wfjT+MH41AjB+NQowfjUSMH41GjB+NSYwfjUyMH41PjB+NUYwfjVOMH41VjB+NV4wfjVqMH41cjB+NXowfjWCMH41ijB+NZIwfjWaMH41ojB+Na4wfjWyMH41ujB+NcIwfjXSMH411jB+NeIwfjXmMH418jB+NfYwfjX+MH42BjB+Ng4wfjYWMH42HjB+NiYwfjYuMH42NjB+NkYwfjZKMH42UjB+Nl4wfjZmMH42cjB+Nn4wfjaKMH42ljB+H04wfjaaMH42ojB+Nq4wfja6MH42wjB+NsowfjbWMH422jB+NuYwfjbqMH428jB+NvowfjcCMH43CjB+NxIwfjcaMH43JjB+Nyowfjc2MH43OjB+IkYwfjc+MH43RjB+N04wfjdWMH43XjB+N2YwfjduMH43ejB+N34wfjeGMH43jjB+HzowfjeSMH43mjB+N6IwfjeqMH43sjB+N7owfjfCMH43yjB+N9IwfjfaMH4fUjB+N+IwfjfqMH438jB+N/owfjgCMH44CjB+OBowfjgeMH44KjB+ODIwfjg6MH44RjB+OFYwfjhaMH44YjB+OGowfjh2MH44gjB+OI4wfjiaMH44pjB+OLIwfji+MH44yjB+ONYwfjjiMH447jB+OPowfjkGMH45EjB+ORowfjkiMH45MjB+OTYwfjlGMH45SjB+OVIwfjlaMH45ZjB+OWowfjl2MH45ejB+OY4wfjmSMH45mjB+OaIwfjmqMH45sjB+Ob4wfjnCMH451jB+OdowfjnmMH456jB+OfYwfjn6MH46DjB+OhIwfjoiMH46JjB+Oi4wfjo6MH46RjB+Ok4wfjpeMH46YjB+OnIwfjp2MH46gjB+OoowfjqaMH46njB+OqYwfjquMH46tjB+Or4wfjrOMH460jB+Ot4wfjriMH468jB+OvYwfjr+MH47CjB+OxYwfjsaMH47KjB+Oy4wfjs6MH47PjB+O04wfjtSMH47WjB+O2Iwfjt2MH47ejB+O4owfjuOMH47ojB+O6YwfjuuMH47tjB+O8IwfjvOMH4fPjB+O9Iwfgg6MH471jB+O+owfjvuMH47/jB+PAIwfjwKMH48FjB+PCYwfjwqMH48PjB+PEIwfjxKMH48VjB+PF4wfjxqMH48djB+PH4wfjyOMH48kjB+PKIwfjymMH48ujB+PL4wfjzOMH480jB+POIwfjzmMH489jB+PPowfj0KMH49DjB+PRYwfj0eMH49LjB+PTIwfj0+MH49RjB+PU4wfj1aMH49ZjB+PWowfj12MH49fjB+PYYwfj2OMH49njB+PaIwfj2uMH49sjB+PcIwfj3GMH490jB+PdYwfj3qMH497jB+PfYwfj3+MH4+BjB+Pg4wfj4aMH4+HjB+PiYwfj4yMH4+OjB+PkIwfj5OMH4+UjB+Pl4wfj5iMH4+ajB+PnIwfj56MH4+gjB+Po4wfj6SMH4+njB+PqIwfj6uMH4+sjB+PsIwfj7GMH4+0jB+Pt4wfj7mMH4+7jB+PvYwfj8CMH4/CjB+PxIwfj8eMH4/IjB+Pyowfj8yMH4/OjB+P0Ywfj9OMH4/WjB+P2Iwfj9qMH4/cjB+P34wfj+KMH4/kjB+P54wfj+mMH4/rjB+P7owfj/CMH4fVjB+P8owfj/SMH4/4jB+P+Ywfj/yMH4/9jB+QAYwfkAKMH5AFjB+QBowfkAmMH5AMjB+QDowfkBGMH5AUjB+QFYwfkBmMH5AajB+QHowfkB+MH5AijB+QI4wfkCWMH5AnjB+QKowfkC2MH5AxjB+QMowfkDSMH5A3jB+QOowfkDuMH5A+jB+QP4wfkEKMH5BDjB+QRowfkEeMH5BKjB+QTIwfkFCMH5BRjB+QVYwfkFaMH5BbjB+QXIwfkGGMH5BijB+QZowfkGeMH5BrjB+QbIwfkHCMH5BxjB+QdIwfkHaMH5B6jB+Qe4wfkH2MH5CAjB+QhYwfkIaMH5CKjB+Qi4wfkI+MH5CQjB+Qk4wfkJSMH5CYjB+H1owfkJmMH4fXjB+Qm4wfh9iMH5CdjB+Qn4wfkKKMH5CjjB+QpowfkKeMH5CpjB+QrIwfkLCMH5CxjB+QtYwfkLaMH5C4jB+QuowfkLyMH5C+jB+QwYwfkMKMH5DEjB+Qx4wfkMqMH5DLjB+QzYwfkNCMH5DSjB+Q1YwfkNeMH5DZjB+Q24wfkN2MH5DhjB+Q4owfkOaMH5DnjB+Q6owfkOuMH5DvjB+Q8IwfkPOMH5D0jB+Q+YwfkPqMH5D9jB+Q/owfkQKMH5EDjB+RB4wfkQiMH5EKjB+RDowfkRCMH5ETjB+RFYwfkRiMH5EajB+RHYwfkR+MH5EijB+RJIwfkSaMH5EpjB+RKowfkSyMH5EvjB+RMYwfkTOMH5E3jB+ROIwfkTqMH5E9jB+RQIwfkUGMH5FFjB+RRowfkUqMH5FLjB+RTowfkU+MH5FRjB+RVIwfkViMH5FZjB+RXYwfkV6MH5FgjB+RY4wfkWWMH5FojB+Ra4wfkW2MH5FxjB+RcowfkXaMH5F3jB+ReYwfkXyMH5F/jB+RgYwfkYWMH5GGjB+RiIwfkYuMH5GNjB+Rj4wfkZGMH5GTjB+RlowfkZeMH5GZjB+Rm4wfkZ+MH5GgjB+Ro4wfkaSMH5GojB+RqYwfka2MH5GujB+RsowfkbOMH5G2jB+RuIwfkbuMH5G9jB+RwIwfkcKMH5HHjB+RyIwfkcqMH5HNjB+Rz4wfkdGMH5HTjB+R1YwfkdeMH5HZjB+R24wfkd6MH5HijB+R44wfkeeMH5HojB+R6owfke2MH5HwjB+R8YwfkfOMH5H1jB+R94wfkfmMH5H8jB+R/YwfkgGMH5ICjB+SBowfkgeMH5IKjB+SDIwfkhCMH5IRjB+SFIwfkhWMH5IZjByYkZAvgkCQL5IakC/AAJASkDKSHJAykiCQMpIjkDKSJZAykjCQMpI0kDKSPJAykkCQMpJFkDKSSJAykkqQMpJNkDKSUZAyklSQMpJWkDKSWZAyklyQMpJfkDKSYZAykmWQMpJnkDKSaZAykm+QMpJykDKSdJAyknaQMpJ4kDKSeZAyknuQMpJ8kDKSfpAykn+QMpKFkDKSiJAykoqQMpKMkDKSj5AykpSQMpKXkDKSm5Aykp6QMpKhkDKSpJAykqaQMpKpkDKSqpAykq2QMpKwkDKSs5AykrWQMpK4kDKSupAykryQMpK+kDKSwZAyksSQMpLGkDKSyJAyksuQMpLOkDKS0ZAyktOQMpLZkDKS6ZAykuuQMpLukDKS8JAykvKQMpL0kDKS9pAykvqQMpL7kDKS/ZAykv6QMpMBkDKTA5AykwWQMpMHkDKTCpAykw2QMpMPkDKTEZAykxOQMpMVkDKTGJAykxuQMpMdkDKTH5AykyKQMpMkkDKTJpAykyiQMpMqkDKTLJAyky6QMpMwkDKTMpAykzWQMpM5kDKTO5Aykz2QMpNAkDKTQpAyk0SQMpNGkDKTSZAyk0uQMpNNkDKTT5Ayk1KQMpNVkDKTW5Ayk1+QMpNikDKTZZAyk2eQMpNpkDKTa5Ayk22QMpNwkDKTcpAyk3WQMpN3kDKTeZAyk3uQMpN+kDKTgJAyk4SQMpOGkDKTiZAyk4yQMpOPkDKTkpAyk5aQMpOYkDKTnZAyk5+QMpOgkDKToZAyk6KQMpOkkDKTqJAyk6qQMpOukDKTsJAyk7KQMpO1kDKTu5Ayk72QMpPAkDKTwpAyk8WQMpPHkDKTypAyk8yQMpPOkDKTz5Ayk9GQMpPTkDKT1pAyk9iQMpPakDKT3JAyk96QMpPhkDKT45Ayk+aQMpPokDKT6ZAyk+yQMpPukDKT8JAyk/KQMpP1kDKT95Ayk/mQMpP7kDKT/JAyk/+QMpQBkDKUA5AylAWQMpQIkDKUC5AylA2QMpQPkDKUEpAylBSQMpQZkDKUG5AylB6QMpQikDKUJJAylCaQMpQqkDKULJAylDOQMpQ1kDKUN5AylDqQMpQ9kDKUP5AylEGQMpRDkDKURpAylEiQMpRKkDKUTJAylE+QMpRRkDKUU5AylFaQMpRYkDKUYJAylGaQMpRpkDKUa5AylG2QMpRykDKUdpAylHmQMpR6kDKUfJAylH+QMpSBkDKUg5AylIWQMpSHkDKUiZAylIuQMpSPkDKUkZAylJSQMpSXkDKUmpAylJ2QMpSfkDKUoZAylKSQMpSmkDKUqJAylKqQMpStkDKUr5AylLGQMpS0kDKUtpAylLmQMpS9kDKUwZAylMSQMpTGkDKUyJAylMqQMpTLkDKUzZAylNGQMpTTkDKU1pAylNiQMpTbkDKU3ZAylN6QMpTgkDKU45AylOWQMpTnjByHp5E+mJORP4C9kT8nkT+Iq5E/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N5S0lziUtJc5lLSXQ5SzmJGU18AAkCmU2JdFlNiXgZTYl4iU2Jd3lNiXiZTYl42U2Je8lNiXy5TXhumU14brlNeG7ZTXhuyU14bulNeG6JTXl0yU14bwlNeXVJTXl1aU15dXlNeXWZTXhvKU15dilNeIPpTXl2WU15dnlNeXaZTXl2uU15dtlNeXb5TXl3GU15dzlNeXdZTXhvOU15d4lNeXeZTXl3qU15dolNeXapTXl2yU15dulNeXcJTXl3KU15d0lNeXdpTXl3uU15d8lNeXfZTXl3+U14STlNeXgJTXl36U14RAlNeXh5TXhvSU14b3lNeXi5TXl46U15eMlNeXnpTXl6KU15delNeXppTXl4qU14bvlNeXYJTXl6qU15etlNeXX5TXhvGU14SalNeXsJTXl7GU15e2lNeEtpTXl7KU15e5lNeEvZTXl7uU15evlNeE7pTXhRSU14UylNeFDpTXhRuU14VAlNeFQ5TXhUWU14VHlNeFSZTXhUyU14ValNeFcpTXhXWU14V3lNeFgpTXhYSU14WQlNeFkpTXhYaU14WIlNeFlJTXhZaU14WglNeFopTXhYqU14WklNeFppTXhZqU14WclNeFrZTXl8OU14WylNeFt5TXhbuU14XAlNeFxJTXhcqU14XQlNeF1JTXhdiU14XblNeF3ZTXl1yU14XglNeXXZTXheKU14XklNeF55TXhemU14XrlNeF7ZTXhe+U14XxlNeF85TXhfWU14X3lNeF+pTXhf2U14YDlNeGBZTXhaqU14YIlNeGC5TXl8qU14YOlNeGEpTXhhWU14YXlNeGG5TXhh2U14YAlNeGH5TXhiGU14YjlNeGJ5TXhiuU14YulNeGM5TXhjWU14Y3lNeGOZTXhjyU14ZAlNeGQ5TXhkmU14ZRlNeXwJTXl7qU15fNlNeGU5TXhnKU14ZrlNeGbpTXhnCU14Z2lNeE9pTXhnyU14aJlNeGjZTXhoaU14aTlNeXz5TXl9GU15fTlNeX1ZTXl9eU15fZlNeX25TXl92U15fflNeX4ZTXhwWU14aflNeGoJTXhPCU14UVlNeGpZTXhqaU14UPlNeGvZTXhr6U14ailNeGo5TXhKuU14SulNeGt5TXhriU14a6lNeGu5TXhrKU14azlNeGWJTXhpyU14adlNeFM5TXht6U14UclNeGqZTXhqqU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mVmXeIc2l3iZW5d4mV2XeIc1l3iZX5d4mWCXeJlil3iZY5d4mWWXeJlml3iERJd4mXSXeJlxl3iXsZd4hECXeJdXl3iZhZd4goqXeJmGl3iZh5d4mYiXeJmAl3iZiZd4mW6XeJmKl3iZi5d4hvOXeJd7l3iZgpd4mZOXeJmUl3iZlpd4hPaXeIaGl3iZmpd4hvGXeJlpl3iZnZd4maKXeJmll3iZspd4mbGXeJmhl3iZn5d4maCXeIg+l3iZmJd4mbqXeJmBl3iZvZd4mbuXeJmZl3iZxJd4mcWXeJmwl3iXu5d4l6+XeISal3iFDpd4hTKXeIUUl3iFG5d4hO6XeIS9l3iFcpd4haCXeIWKl3iFopd4haSXeIWml3iFrZd4hbKXeIW3l3iZ5pd4mdyXeIW7l3iFwJd4hcSXeIXKl3iF0Jd4hdSXeIXYl3iF55d4hemXeIXrl3iF7Zd4he+XeIXxl3iF85d4hfWXeIX3l3iF+pd4hf2XeIXbl3iF3Zd4heCXeIXil3iF5Jd4hgOXeIYFl3iFqpd4hgiXeIYLl3iErpd4hKuXeJfZl3iFdZd4hXeXeJndl3iZ5Zd4hYKXeIWEl3iFkJd4hZKXeIWGl3iFiJd4hZSXeIWWl3iGDpd4mfiXeIYSl3iGFZd4hheXeIYbl3iGHZd4hh+XeIYhl3iGI5d4hieXeIYrl3iGLpd4hjOXeIY1l3iGN5d4hjmXeIY8l3iGQJd4hkOXeIZJl3iGUZd4hlOXeJfAl3iFmpd4hZyXeJfhl3iFQJd4hUOXeIVFl3iFR5d4hUmXeIVMl3iX25d4mbiXeIZrl3iGbpd4hnCXeIZ2l3iGfJd4homXeIaNl3iGk5d4l1aXeIYAl3iX0Zd4hreXeIa6l3iGspd4hr2XeIbDl3iGqZd4hsqXeIbQl3iXz5dmmJeYLQCXDJodmC+Yk5gwlXGYMJoemDCaH5gwmiCYMJohmDCaIpgwmiOYMJokmDCaJZgwmiaYMJonmDCaKJgwmimYMJoqmDCaK5gwmiyYMJotmDCaLpgwmi+YMJowmC+YkZhFmjGYRZoymEWX2ZhFhXKYRYWgmEWFophFhYqYRYWkmEWFpphFha2YRYWymEWFt5hFhbuYRYXUmEWF2JhFheeYRYXpmEWF65hFhe2YRYXvmEWF8ZhFhfOYRYX1mEWF+phFhf2YRYXbmEWF3ZhFheCYRYXimEWF5JhFhXWYRYV3mEWFgphFhYSYRYWQmEWFkphFhYaYRYWImEWFlJhFhZaYRYYDmC+Yl5hvAJcMmjOYcZiTmHKaNJhymcaYcZiXmHUAAMAAkCyYd5pEmHiYkZh5l9mYeZfTmHmFcph5hXWYeYV3mHmFgph5hYSYeYWGmHmFiJh5hZCYeYWSmHmFlJh5hZaYeYWgmHmFiph5haKYeYWkmHmFpph5ha2YeYWymHmFt5h5hbuYeYXAmHmFxJh5hcqYeYXQmHmF1Jh5hdiYeYXnmHmF6Zh5heuYeYXtmHmF75h5hfGYeYXzmHmF9Zh5hfqYeYX9mHmGAJh5hduYeYXdmHmF4Jh5heKYeYXkmHmGA5h5hgWYeYWqmHmGCJh5hguYeJiXmKsAmHeaRZitmJGYrpfhmK6GDpiuhhKYroYVmK6GF5iuhhuYroYdmK6GH5iuhiGYroYjmK6GJ5iuhiuYroYumK6GNZiuhjeYroY5mK6GPJiuhkOYroZJmK6GUZiuhlOYrZiXmMQAmHeaRpjGmJGYx5fdmMeFFJjHhTKYx4UOmMeFG5jGmJeYzQCYd5pHmM+YkZjQl9uY0IVAmNCFQ5jQhUWY0IVHmNCFSZjQhUyYz5iXmNgAmHeaSJjamJGY24cFmNuX2Zjbl9OY24VymNuFdZjbhXeY24WCmNuFhJjbhYaY24WImNuFkJjbhZKY24WUmNuFlpjbhaCY24WKmNuFopjbhaSY24WmmNuFrZjbhbKY24W3mNuFu5jbhcCY24XEmNuFypjbhdCY24XUmNuF2JjbheeY24XpmNuF65jbhe2Y24XvmNuF8ZjbhfOY24X1mNuF+pjbhf2Y24YAmNuF25jbhd2Y24XgmNuF4pjbheSY24YDmNuGBZjbhaqY24YImNuGC5jbl+GY24YOmNuGEpjbhhWY24YXmNuGG5jbhh2Y24YfmNuGIZjbhiOY24YnmNuGK5jbhi6Y24Y1mNuGN5jbhjmY24Y8mNuGQ5jbhkmY24ZRmNuGU5jbl92Y24UUmNuFMpjbhQ6Y24UbmNuE7pjbl9uY24VAmNuFQ5jbhUWY24VHmNuFSZjbhUyY24SamNuEq5jbhLaY24SumNuEvZjbhpOY24VamNuFmpjbhZyY24YzmNuGQJjbhfeY24bemNqYl5k9AJh3mkmZP5iRmUCX15lAhmuZQIZumUCGcJlAhnKZQIZ2mUCGfJlAho2ZQIaGmT+Yl5lKAJh3mkqZTJiRmU2X15lNhmuZTYZumU2GcJlNhnKZTYZ2mU2GfJlNho2ZTYaGmUyYl5lXAJh3mkuZWZiRmVqX0ZlahpyZWoafmVqGoplahqWZWoapmVqGrZlahrKZWoa3mVqGuplahr2ZWobDmVqGyplahs2ZWobQmVmYl5lqAJh3mkyZbJiRmW2X0ZlthpyZbYafmW2GoplthqWZbYapmW2GrZlthrKZbYa3mW2Guplthr2ZbYbDmW2Gyplths2ZbYbQmWyYl5l9AJh3mk2Zf5iTmYDAAJAsmYGaTpl/mJGZg4bQmYOGzZmDhsqZg4bDmYOGvZmDhrqZg4a3mYOGspmDhq2Zg4apmYOGpZmDhqKZg4afmYOGnJmDl9GZf5iXmZMAmHeaT5mVmJOZlsAAkCyZl5pQmZaaUZmVmJGZmoYBmZqX0ZmahpyZmoafmZqGopmahqWZmoapmZqGrZmahrKZmoa3mZqGupmahr2ZmobDmZqGypmahs2ZmobQmZWYl5mrAJh3mlKZrZiTma7AAJAsma+aUJmumlGZrZiRmbKGAZmyl9GZsoacmbKGn5myhqKZsoalmbKGqZmyhq2ZsoaymbKGt5myhrqZsoa9mbKGw5myhsqZsobNmbKG0JmtmJeZwwCYd5pTmcWYkZnGl9+ZxoUPmcaFFZnGhTOZxoUcmcWYl5nMAJh3mlSZzpiRmc+Xz5nPhwWZz5fXmc+Ga5nPhm6Zz4Zwmc+GcpnPhnaZz4Z8mc+GjZnPhoaZz5fRmc+GnJnPhp+Zz4aimc+GpZnPhqmZz4atmc+GspnPhreZz4a6mc+GvZnPhsOZz4bKmc+GzZnPhtCZz4Twmc+Gh5nPl9WZz4admc+GoJnPhqOZz4ammc+GqpnPhq6Zz4azmc+GuJnPhruZz4a+mc+GxJnPhsuZz4bOmc+G0ZnPl9+Zz4UPmc+FFZnPhTOZz4Ucmc+GWJnPhPaZz4aJmc6Yl5oDAJh3mlWaBZiRmgaXz5oFmJeaCACYd5pWmgqYkZoLhL6aC4YBmguE9poLhwWaCpiXmhAAmHeaV5oSmJGaE5fZmhOX05oThXKaE4V1mhOFd5oThYKaE4WEmhOFhpoThYiaE4WQmhOFkpoThZSaE4WWmhOFoJoThYqaE4WimhOFpJoT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AJBAnaiYk52pnPydqZa6namWvJ2plr6dqZbAnamWwp2plsSdqZbGnamWyJ2pnI+dqZyQnaiYkZ21lsqdtZbLnbWWzJ21ls2dtZbOnbWWz521ltCdtZbRnbWW0p21wACQQJ2/nP6dtYiQAMAAkD+dwpiTncOd953Dnfidw535ncOd+p3Dnfudw538ncOd/Z3Dnf6dw53/ncOeAJ3DngGdw54CncOeA53DngSdw54FncOeBp3Dngedw54IncKdA53WmJOd150EndaYkZ3ZnOud1piUndudDZ3WmJWd3Z0NndaYl53fAJ3CnPGd4ZiTneKEUp3hmJGd5JzrneSEWZ3hmJed5wCdwp0OnemYkZ3qnOud6ZiXnewAncKVMp3umJOd750Pne+dEJ3vnRGd750Sne+dE53vnRSd750Vne+dFp3vnRed750Yne+dGZ3vnRqd750bne+dHJ3vnR2d750ene+dH53vnSCd750ine+dI53vnSSd750lne+dJp3vnSed750pne+dKp3vnSud750sne+dLZ3vnS6d750vne+dMJ3vnTGd750yne+dM53vnTWd7502ne+dOJ3vnTmd7506ne+dPJ3vnT2d750+ne+dP53vnUCd751Bne+dQp3vnUSd751Gne+dR53vnUid751Jne+dSp3vnUud751Mne+dTZ3vnU6d751Pne+dUJ3vnVGd751Sne+dU53vnVSd751Vne+dVp3vnVed751Yne8pne+dWZ3vnVqd751bne6YlJ43nV6eN51fnjeAvZ43nWCd7piRnjwjnjzAAJA/nj6dYZ3umJeeQACdwp1jnkKYk55DnWKeQpiRnkWc655FgJaeQpiUnkic6J5InWSeSJ1lnkKYl55MAJ3CnWaeTpiTnk+CkJ5Pg1yeT5zynk+DsJ5PwACQP55UnWeeTpiUnladaZ5Wh06eVp1qnlada55WgoyeVp0NnladbJ5WnOieVp1knladZZ5WnVyeVp1unlaEh55WnV2eVoIonladYp5WgmeeVmGeVoJenlac455WnW+eTpiVnmyda55snOOeTpiRnm+c655vnOyeb51xnm+dcJ5vnPOebyOeb4CWnm/AAJA/nnedaJ5OmJeeeQCdwoISnnuYk558wACQP559lwaee5iUnn+c6J5/gl6ee5iRnoKc656CgJaee5iXnoUAncKdcp6HmJGeiJzrnoeYlJ6KhIeeimGeh5iXno0AncKdc56PmJSekGGej5iRnpKc656PmJeelACdwpzvnpaYk56XwACQP56YnPCelpiUnpqEh56aYZ6WmJGenZzrnpaYl56fAJ3CkU2eoZiTnqKda56hmJSepISHnqRhnqGYkZ6nnOueoZiXnqkAncKCE56rmJOerMAAkD+erZZCnquYlp6vAJ6vnXWeq5iUnrKdaZ6yh06esp1qnrKda56ygoyesp0NnrKdbJ6ynOiesp1knrKdZZ6ynVyesp1unrKEh56ynV2esoIonrKdYp6ygmeesmGesoJenrKDsJ6yg1yespzjnrKc8p6ynW+esoKQnquYlZ7MnWuezIOwnsyDXJ7MnPKeq5iRntGc657RnOye0Z1xntGdcJ7RnPOe0SOe0YCWntGddp3CnXee2piTntudeJ7bnXme2516ntude57bnXye2519ntudfp7bnX+e252AntudgZ7bnYKe252DntudhJ7bnYWe252Gntudh57bnYie24C9ntuZ4p7amJGe7yOe2piXnvEAncKc3J7zmJOe9J1tnvSdiZ70nYqe9J2MnvSdjp70nY+e9J2QnvSc9p70nZGe9J2SnvSdk570nZSe9J2WnvSdmJ70nZme9J2anvSdm570nZ2e9J2envSdn570naGe9J2jnvSdpJ70naWe9J2mnvSdqJ70name9J2qnvSdq570naye9J2tnvSdLJ70na+e9J2wnvSdsZ70nbKe9J20nvSdtZ70nbee9J24nvSduZ70nQae9J26nvSdu570nbye9J2+nvSdv570ncGe9J0HnvSdCJ70nQme9J3DnvSdxJ70ncae9J3HnvSdyJ70ncme9J3LnvSdzZ70nc6e9J3QnvSd0Z70ndOe9J3UnvSd1Z70ndee9J3YnvSdDJ70ndqe9J3cnvSd3Z70nd6e9J3gnvSd4p70neOe9J3knvSdC570nRCe9J01nvSd5p70neie9J3qnvSCZ570nVye9J1unvSdXZ70giie9IJenvSAvZ70meKe9J1vnvOYlJ9QneyfUJ3tn1Cd7p9QnVqfUJ3vn1Cd8J9QnWSfUJ1bn1Cd8Z9QnfKfUJ3zn1Cd9J9QnfWfUJ32n1CAlp7zmJGfYCOe85iXn2IAAMAAkEGfZJiTn2WeHp9kngqfZ5iTn2iEsZ9ongufaIF2n2eY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ogagoqIGoKOiBqCkogagpaIGoKaiBqCnogagqKIGoKmiBqCqogagq6IGnq6iBqCsogagrqIGoK+iBp7EogagsKIGoLGiBqCyogags6IFmJSiKqC7oiqgvKIqhsaiKqC+ogWYkaIvoL+iL6DAoi+gw6IvoMWiL6DBoi+gxKIvoMmiL6DKoi+gy6IvoM6iL6DPoi+g0aIvoNOiL6DZoi+g26IvoNyiL6Ddoi+g4KIvoOOiL6Dvoi+g8qIvoPmiL6D7oi+hAqIvoQOiL6EHoi+hEKIvoRKiL6EToi+hFaIvoRaiL8AAkE6iT6Eaok+hnaJPoaGiL6Eboi+VXaIvlVeiL6EAoi+hAaIvoT2iL6E/oi+hSKIvoUqiL6FLoi+hK6IvoVGiL6FSoi+hVKIvoVeiL6Faoi+hY6IvoWeiL6Fpoi+hbKIvoW6iL6Fwoi+hc6IvoXuiL6F2oi+hd6IvoXiiL6F1oi+hhaIvoTmiL6GIoi+hiqIvoYuiL6GQoi+hkaIvoU2iL6GSoi+hlqIvoayiL6Gwoi+hsaIvobOiL6G4oi+hvaIvob+iL6HCoi+hx6IvocqiL6HMoi+h0KIvodKiL6HUoi+h26IvoeCiL6Heoi+h5KIvoeWiL6Hmoi+h6aIvoeyiL6Hvoi+h8qIvofOiL6H0oi+h9qIvofuiL6H8oi+iAKIvogOiL6IFoi+iB6IvogyiL6IXoi+iIKIvoiKiL6Ijoi+iJqIvoi6iL6Izoi+iO6Ivoj6iL6JBoi+iOqIvokWiL6JIoi+iSaIvok+iL6JSoi+iWaIvoUKiL6Jgoi+iY6IvomWiL6Jpoi+icKIvonOiL6J0oi+id6IvonqiL6J8oi+iiKIvooyiL6KNoi+ij6IvopCiL6KToi+ilaIvopeiL6KYoi+inaIvop6iL6Kgoi+iq6IvorSiL6K4oi+iu6IvoryiL6K/oi+iwaIvoOaiL6E6oi+hT6Ivos6iL6LPoi+i0aIvotKiL6LToi+i1KIvotaiL6Dnoi+i26Ivot2iL6Lgoi+i4aIvouKiL6Ljoi+i5KIvoueiL6Lqoi+i76IvovGiL6Lzoi+i9KIvovaiL6L4oi+i+6IvovyiL6L+oi+i/6IvowGiL6MCoi+jCKIvowmiL6MLoi+jDKIvoxGiL6MSoi+jFKIvoxmiL6Mdoi+jHqIvoyCiL6Mmoi+jKKIv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UqckpnyYk6Z9hFKmfYSMpn3AAJBbpoCnJaZ8mJSmgoRDpoKEiKaCpx+mfJiRpoanJqaGhIqmhpwLpoanHKZ8mJemiwCmi6cSAMAAkFymjpiTpo+nL6aPpzCmj6cxpo+nMqaPpzOmj6c0po+nNaaPpzamj6c3po+nOKaPpzmmj6c6po+nO6aPpzymj6c9po+nPqaPpz+mj6dApo+nQaaPp0Kmj6dDpo+nRKaPp0Wmj6dGpo+nR6aPp0imj6dJpo+nSqaPp0umj6dMpo+nTaaPp06mj6dPpo+nUKaPp1Gmj6dSpo+nU6aPp1Smj6dVpo+nVqaPp1emj4Iqpo+nWKaPp1mmj6dapo+nW6aPp1ymj6ddpo+nXqaPp1+mj6dgpo+nYaaPp2Kmj6djpo+nZKaPp2Wmj6dmpo+nZ6aPp2imj6dppo+naqaPp2umj6dspo+nbaaPp26mj4Irpo+VyqaPlcumj5XMpo+VzaaPlc6mj5XPpo+V0KaPldGmj4Ispo+nb6aPp3Cmj6dxpo+ncqaPp3Omj6d0po+ndaaPp3amj6d3po+neKaPp3mmj6d6po+ne6aPgi2mj5XZpo+V2qaPldumj5Xcpo+V3aaPld6mj5Xfpo+V4KaPleGmj5Xipo+V46aPleSmj5Xlpo+V5qaPleemj5Xopo+V6aaPleqmj5Xrpo+V7KaPle2mj5Xupo+V76aPlfCmj4I3po+nfKaPp32mj6d+po+nf6aPp4Cmj6eBpo+ngqaPp4Omj4I4po+nhKaPp4Wmj6eGpo+nh6aPgjmmj5X1po+V9qaPlfemj5X4po+V+aaPgjqmj5X6po+V+6aPlfymj5X9po+V/qaPlf+mj5YApo+WAaaPlgKmj5YDpo+WBKaPgjumj5YFpo+WBqaPlgemj5YIpo+WCaaPlgqmj4I8po+niKaPp4mmj6eKpo+ni6aPp4ymj6eNpo+njgDAAJBdpzCYk6cxwACQXacyp5CnMJiRpzScZKc0wACQXac2p5KnNJx/AMAAkF6nOYRMpzqYk6c7Eqc7aqc7goynO6ehpzuDsKc6mJenQQCnOaeip0OYk6dEp6OnRKekp0TAAJBep0enpadHp6anR6enp0OYkadLhwqnS6eop0unqadLp6qnS5zip0uCQqdDmJenUgAAwACQX6dUp62nVZiUp1aCjKdWYadWg1ynVZiXp1oA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c6j5noSo+aD+qPmg36j5h3Ko+Yd0qPmj9Kj5nyGo+Z8iqOaYl6kpAKjgqNOpK5iTqSyZwqksgdWpLIJKqSuYl6kwAADAAJBrqTKYkakzqYepM55VqTPAAJBrqTapiakyqNqpOJiTqTmo26k4mJGpO4aYqTsjqTiYl6k+AKk+qNypPqjdqT6o36kyqOGpQ5iTqUSnwKlEqOKpRIbGqUSo46lEqOSpRKjlqUSezKlEh5apQ5iRqU2o56lNhK6pTYSrqU2E7qlNhTKpTYUUqU2EvalNhRupTYaTqU2o6KlNqOqpTYVaqU2GUalNhQ6pTYXnqU2FlKlNhjOpTYV1qU2F8alNhcCpTYXzqU2FxKlNhfWpTYXKqU2FpqlNhaSpTYYAqU2o66lNqO2pTajvqU2o8KlDmJepbQCpMqjzqW+Yk6lwp8CpcIdXqXCHlalwh5apcIdhqXCGxqlwqOapcJ7MqXCo9KlwqPWpcKj2qXCo96lwnq6pcKj4qXCo+alwqPqpcKj7qXCo/KlwqP2pcJZ1qXCo/qlwqP+pcKkAqXCpAalwqQKpcKkEqW+YlKmLqQmpi6kKqW+YkamOnMKpjqkLqY6e3qmOgcOpjqkQqY6pEamOqRKpjqkTqY6pFKmOhn6pjqkVqY6HVKmOh1WpjodWqY7AAJBrqZ2pDKmdqRepjqjyqY6pG6mOqRmpjqkaqY6HBamOheSpjoXiqY6F3amOheCpjoXbqY6F6amOhgCpjoXxqY6FwKmOhfOpjoXEqY6F9amOhcqpjoX9qY6FpqmOhdCpjqkwqY6pOKmOqTOpjqk2qY6FcqmOhaCpjoWyqY6Ft6mOhYKpjoYDqY6FdamOhZSpjoW7qY6FpKmOhdipjoXUqY6FramOheepjoWqqY6GC6mOqUGpjoanqY6pXKmOqV2pjqkeqY6pH6mOqVapjqlVqY6pMamOqT6pjqlYqY6pIKmOqSypjqktqY6pLqmOnOKpjqkyqY6o6amOqUWpjqlIqY6pSqmOqVepb5iXqd8AqTKpZ6nhmJOp4qloqeKpJanihRep4oSDqeKFzqnihc+p4ZiRqempN6npqTWp6ak0qeGYl6ntAKkyqWmp75iTqfDAAJBrqfGpaqnxqWup8alsqe+YlKn1gVWp9alAqe+Ykan4qTyp+Kjuqfipban4qU6p+IV9qe+Yl6n+AKkyqW6qAJiT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qoCta6qCrWuqhq1rqoyta6qPrWuqka1rqpOta4XUrWuGHa1rqzeta6s5rWurQq1rqpWta4WyrWurSa1rq0uta6tarWuqma1rqpyta6qerWuFra1rqqGta6qlrWuF5K1rhgOta6qrrWuFgq1rqq2ta4XtrWuqsK1rqpeta6qzrWuFlK1rhaSta4W7rWuF261rqrWta6q3rWuqua1rqr+ta6rBrWuqw61rqsWta6rGrWuF661rhe+ta6uArWuqz61rqtGta6rbrWuq6a1rqu2ta6rwrWuq8q1rqvata6r4rWuq+q1rqvyta6r+rWuGC61jmJetyQCrAquJrcuYka3Ml9mtzIXdrcyF4K3MhXKtzIXYrcyF+q3MheutzIXircyFt63MhaatzIXUrcyF/a3MhbKtzIWtrcyF5K3MhYKtzIXtrcyFu63MhdutzIYDrcyFlK3MhaStzIXvrcyGC63LmJet5QAAwACQcgDAAJBzreifKa3pmJOt6sAAkHOt66unremYka3tg7Ct7Z+Rre2rqa3pmJSt8Z1irfGrqK3pmJet9ACt6KuurfaYk633mGCt951irfaYka36g7Ct+p+RrfojrfaYl63+AK3oq7GuAJiRrgGDsK4Bn5GuAJiXrgQAreirsq4GmJGuB4Owrgefka4GmJeuCgCt6KuzrgyYk64NnWKuDJiRrg+DsK4Pn5GuDyOuDJiXrhMAAMAAkHSuFaBSrhaYk64XJ64XwACQdK4ZKK4XKa4Xh4auF6sVrhedRa4WmJGuHyOuFpiXriEAAMAAkHWuI5iTriSoEq4koFWuJKBWriSoE64koFeuJKgUriSry64kq8yuJKvNriSrzq4kq8+uJKvQriSr0a4kq76uJKu/riSrwK4kq8GuJKvCriSrw64kq8SuI6u2rjmYk646J646wACQda48KK46Ka46q76uOqu/rjqrwK46q8GuOqvCrjqrw646q8SuOZiRrkYjrjmYl65IAK4joFSuSpiTrkuCZ65Lq8WuSpiWrk6c4a5KmJGuUCOuUIMPrlCrya5KmJeuVAAAwACQdq5WmJOuV6vTrler1K5XoFiuV6vVrler1q5Xq9euV6vYrler2a5XmVCuV6varler265Xq9yuV6vdrlegWa5XoFquV6verler365Xq+CuV6vhrlegW65Xq+KuV6vjrler5K5Xq+WuV6vmrlegXK5Xq+euV6vorler6a5Xq+oAwACQd652mJGud4MHrnar7655mJOueqvwrnmYka58ohGueZiXrn4AAMAAkHiugJiRroGgZ66BrASugawFroGsBq6BoGmugaBqroGga66BoGiugawIroCgZq6LmJOujCeujMAAkHiujiiujCmujKv6royr+66Mq/yujKv9royr/q6Mq/+ujKwAroysAa6LmJGumSOui5iXrpsAroCsAq6dmJGunqwDrp2Yl66gAADAAJB5rqKgb66jmJOupCeupMAAkHmupiiupCmupKwNrqSsDq6krA+uo5iRrqwjrqOYl66uAK6ioHKusJiTrrGewq6xofiusaH6rrCYka61oNyutawRrrWsEq61o1GutaFDrrWhBq61ofeutaH5rrWiGa61ohiutaH2rrWsFa61rBeutawZrrWsG661o0autawcrrWsHa61rB6utawgrrWsIa61rCOutawkrrWsJq61rCeutawprrWh0K61odKutawqrrWsK66wmJeu1AAAwACQeq7WmJGu16w7rtesPK7WrCyu2piTrtusLa7bhWWu26uWrtusLq7boH2u24ZUrtusL67brDGu26wyrtugca7boGyu24ITrtusM67brDWu255drtusNq7amJGu7KOZrtqYl67uAK7WrDeu8JiTrvGsOK7wmJGu86OZrvCYl671AK7WrDmu95iTrvisOq73mJGu+qOZrveYl678AADAAJB7rv6Yka7/rKqu/6yrrv+srK7+rEGvA5iTrwSGKq8Eq3avBKt3rwSsQq8EwACQe68JrEOvCaxErwSsRa8ErEavBKxHrwOYlq8PAK8DmJGvEaxKrxGreK8Rq4ivEaxRrxHAAJB7rxasT68DmJevGMAAkHuvGYC1rv6sU68bmJOvHCevHMAAkHuvHiivHCmvHIeGrxysV68crFivG5iRryQjrxuYl68mAK7+oHOvKJiTrymHYa8pwACQe68rlkKvKJiWry0AryiYlK8vhEOvL6Cgry+gva8vgKyvKJiRrzSg/K80oSKvNKEZrzSg3q80qyuvNKEhryiYl687qtSu/qoErz2Yk68+rFmvPqrVrz6ArK8+h3qvPqpbrz6oW68+oL2vPoS8rz6EQ68+rFqvPpVWrz6rda8+rFuvPqxcrz2Yka9Nqw6vTauLr02rNq9Nqz6vTapM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DLCruAywrLgMsK64DLCwuAywsrgMsLS4DLC2uAywuLgMsLq4DLC8uAywvrgMsMC4DLDCuAywxLgMsMa4C5iXuCUAAMAAkJq4J6R+uCiYlLgpliC4KJiRuCuCm7gomJe4LQAAwACQm7gvsM24MJiUuDGaxLgxmsa4MZrJuDGax7gxmsq4MZrLuDGaz7gxsM64MZrMuDGaxbgxms24MZxHuDGa0rgxmtO4MZrUuDGwz7gxmta4MZrZuDGa2LgxnCq4MZwIuDGcO7gxsNC4MbDRuDGw0rgxsNO4MbDUuDGw1bgxsNa4MbDXuDGw2bgxnmK4MYYKuDGFn7gxmsi4MYV/uDGF37gxhbq4MYXmuDGFNbgxhWq4MYWBuDGw27gxrW+4MbDkuDGw5bgxsOa4MbDnuDGw6LgxsOm4MbDquDGw67gxsOy4MbDtuDGw7rgxsO+4MbDwuDGw8rgxsPO4MbD0uDGw9bgxsPa4MbD3uDGw+LgxsPm4MbD6uDGw+7gxsPy4MbD9uDGw/rgxsP+4MbEAuDGxAbgxsQK4MbEDuDGxBLgxsQW4MbEGuDGxB7gxsQi4MbEJuDGxCrgxsQu4MbEMuDGxDbgxsQ64MbEPuDGxELgxsRG4MbESuDGxE7gxsRS4MbEVuDGxFrgxsRe4MbEYuDGxGbgxsRu4MbEcuDGxHrgxsR+4MbEguDGxIbgxsSK4MbEjuDGxJLgxsSW4MbEmuDGxJ7gxsSi4MbEpuDGxKrgxsSu4MbEsuDGxLbgxsS64MbEvuDGxMLgxsTG4MbEyuDGxM7gxsTS4MbE1uDGxNrgxsTe4MbE4uDGxObgxsTq4MbE7uDGxPLgxsT24MbE+uDGxP7gxsUC4MbFBuDGxQrgxsUO4MbFEuDGxRbgxsUa4MbFHuDGxSLgxsUm4MbFKuDGxS7gxsUy4MbFNuDGxTrgxsU+4MbFQuDGxUbgxsVK4MbFTuDGxVLgxsVW4MbFWuDGxV7gxsVi4MbFZuDGxWrgxsVu4MbFcuDGxXbgxsV64MbFfuDGxYLgxsWG4MbFiuDGxZrgxsWe4MbFouDGxabgxsWq4MbFruDGxbLgxsW24MbFuuDGxb7gxsXC4MbFxuDGxcrgxsXO4MbF0uDGxdbgxsXa4MbF3uDGxeLgxsXm4MbF6uDGxe7gxsXy4MbF9uDGxfrgxsX+4MbGAuDGxgbgxsYK4MbGDuDGxhLgxsYW4MbGGuDGxh7gwmJG4/LDYuPyw2rj8q0O4/KtruPyrXbj8mtW4/IYHuPya17j8sNy4/LDduPyw3rj8sN+4/LDjuPyw8bj8sRq4/LEduPyxY7j8sWS4/LFluPyxiLj8sYm4MJiXuRIAuC+xi7kUmJS5FbGMuRWxjbkVnEK5FbGOuRWxj7kVsZK5FbGTuRSYkbkdsZC5HbGRuR2xlLkUmJe5IQC4L7GVuSOYkbkksZa5JLGXuSSxmLkksZm5JLGcuSSxnbkksaK5JLGjuSSxpLkksaW5JLGpuSSxqrkjmJS5MbGauTGxm7kxsZ65MbGfuTGxoLkxsaG5MbGmuTGxp7kxsai5I5iXuTsAuC+xq7k9mJO5PsAAkJu5P7GsuT+xrbk/m9O5P5vVuT+b17k/m9a5P5vYuT+b2bk/m+G5P7GuuT+b37k/m9S5P5vguT+b77k/m9q5P5vbuT+b3Lk/sa+5P5vduT+b7rk/m/C5P5vSuT+b7bk/nAC5P7GwuT+xsbk/sbK5P7GzuT+xtLk/sbW5P7G2uT+xt7k/sbi5P7G5uT+xurk/sbu5P7G8uT+xvbk/sb65P7G/uT+xwLk/scG5P7HCuT+xw7k/scS5P7HFuT+xxrk/sce5P7HIuT+xybk/scq5P7HLuT+xzLk/sc25P7HOuT+xz7k/sdC5P7HRuT+x0rk/sdO5P7HUuT+x1bk/sda5P7HXuT+x2Lk/sdm5P7HauT+x27k/sdy5P7HduT+x3rk/sd+5P7HguT+x4bk/seK5P7HjuT+x5Lk/seW5P7HmuT+x57k/sei5P7HpuT+x6rk/seu5P7HsuT+x7bk/nAG5P7HuuT+x77k/sfC5P7HxuT+x8rk/sfO5P7H0uT+x9bk/sfa5P7H3uT+x+Lk/sfm5P7H6uT+x+7k/sfy5P7H9uT+x/rk/sf+5P7IAuT+yAbk/sgK5P7IDuT+yBLk/sgW5P7IGuT+yB7k/sgi5P7IJuT+yCrk/sgu5P7IMuT+yDbk/sg65P7IPuT+yELk/shG5P7ISuT+yE7k9mJS5vZrEub2axrm9msm5vZrHub2ayrm9msu5vZrPub2wzrm9msy5vZrFub2azbm9nEe5vZrSub2a07m9mtS5vbDPub2a1rm9mtm5vZrYub2cKrm9nAi5vZw7ub2w0Lm9sNG5vbDSub2w07m9sNS5vbDVub2w1rm9sNe5vbDZub2eYrm9hgq5vYWfub2ayLm9hX+5vYXfub2Furm9hea5vYU1ub2Farm9hYG5vbDbub2tb7m9sOS5vbDlub2w5rm9sOe5vbDoub2w6bm9sOq5vbDrub2w7Lm9sO25vbDuub2w77m9sPC5vbDyub2w87m9sPS5vbD1ub2w9rm9sPe5vbD4ub2w+bm9sPq5vbD7ub2w/Lm9sP25vbD+ub2w/7m9sQC5vbEBub2xArm9sQO5vbEEub2xBbm9sQa5vbEHub2xCLm9sQm5vbEKub2xC7m9sQy5vbENub2xDrm9sQ+5vbEQub2xEbm9sRK5vbETub2xFLm9sRW5vbEWub2xF7m9sRi5vbEZub2xG7m9sRy5vbGaub2xm7m9sZ65vbGfub2xoLm9saG5vbGMub2xjbm9sR65vbEfub2xILm9sSG5vbEiub2xI7m9nEK5vbGOub2xj7m9sSS5vbElub2xJrm9sSe5vbEoub2xKbm9sSq5vbErub2xLLm9sS25vbEuub2xL7m9sTC5vbExub2xMrm9sTO5vbE0ub2xNbm9sTa5vbE3ub2xOLm9sTm5vbE6ub2xO7m9sTy5vbE9ub2xPrm9sT+5vbFAub2xQbm9sUK5vbFDub2xRLm9sUW5vbFGub2xR7m9sUi5vbFJub2xSrm9sUu5vbFMub2xTbm9sU65vbFPub2xULm9sVG5vbFSub2xU7m9sVS5vbFVub2xVrm9sVe5vbFYub2xWbm9sVq5vbFbub2xXLm9sV25vbFeub2xX7m9sWC5vbFhub2xYrm9sWa5vbFnub2xaLm9sWm5vbFqub2xa7m9wACQm7p3soy6d7KOub2xbLm9sW65vbFtub2xb7m9sXC5vbFxub2xcrm9sXO5vbF0ub2xdbm9sXa5vbF3ub2xeLm9sXm5vbF6ub2xe7m9sXy5vbF9ub2xfrm9sX+5vbGAub2xgbm9sYK5vbGDub2xhLm9sYW5vbGGub2yJ7m9saa5vbGnub2xh7m9sai5vbGSub2xk7k9mJG6nMAAkJu6nbIZup2yFLqdshq6nbIiup2yGLqdshy6nbIdup2yKbqdsi+6nbIwup2yMbqdskK6nbJDup2yXbqdsmO6nbJkup2yibqdsme6nbKDup2ykLqdsqq6nLDYupyw2rqcsZa6nLGXupyrQ7qc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pJ29WbSXvVm0mL1ZtJm9VKUavVS0eL1TmJS9ZKTCvWS0e71km329ZKUivWSlHL1ktHq9U5iRvWulHr1rpO+9a8AAkKC9brScvW60p71utKC9brSzvW60qb1utLe9brSovW60u71rpR29a7SLvWu0jr1rtI+9a7SMvWu0jb1rg/i9a58PvWsjvWu0vr1TmJe9gQC9DLTDvYOYk72EpKi9g5iRvYau+r2Grvm9hq77vYau/L2DmJe9iwC9DLTEvY2Ykb2OtMC9jZiXvZAAAMAAkKG9krTGvZOYkb2UpNC9lKS8vZSk472UpOK9lKT0vZSk6r2UpT29k5iUvZyk5b2csvu9nLGKvZy0x72TmJe9oQC9krTJvaOYkb2ktMq9pLTLvaS0zL2jmJe9qAC9krTOvaqYkb2rpVi9q6VZvaqYl72uAADAAJCivbC00b2xmJO9ssAAkKK9s5cGvbK00r2ytNO9srTUvbGYlL24s/G9uLJgvbi01b24tNa9sZiRvb201729tNi9vbTZvb0jvbGYl73CwACQor3DgLW9sKSHvcWYkb3GtNu9xrTcvcWYl73JAL2wtN29y5iXvcwAvbC03r3OmJO9z7Tfvc+04L3OmJG90iO9zpiXvdQAvbC0473WmJS9155ivdeFgb3XhTW914WfvdeFf73Xhd+915rIvdeFur3Xq0O916trvderXb3XtOS914Vqvde05b3XtOa917Tnvde06L3XtOm917Tqvde0673XtOy917Ttvde07r3XtO+917TwvdaYkb3xtPG98bT0vfG09b3xtPa98bT3vfG0+L3xtPm98bT6vfG0+73xtPy98bT9vfG0/r3xtP+98bUAvfGBVb3xtQG98bUCvfG1A73xrGm98bNbvfG1BL3xtQW98bUGvfG1B73xtQi98bUJvfG1Cr3xtQu98bUMvfG1Db3xtQ698bUPvfG1EL3xtRG98bUSvfG1E73xtRS98bUVvfG1Fr3xtRe98bUYvfG1Gb3xtRq98bUbvfG1HL3xtR298Zb8vfG1Hr3xlv298bUfvfGEAr3xtSC98bUhvfG1Ir3xtSa98bUnvfGiOL3xtSi98bUpvfGrVr3xtSq98bUrvfG1LL3xtS298bUuvfG1ML3xtTG98bUyvfG1Nb3xtTa98bU3vfG1OL3xtTm98bU6vfG1O73xsl+98bU8vfG1Pb3xgxe98bVAvfG1Qb3xsTy98bVCvfG1Q73xtUS98bB5vfGwgL3WmJe+SQAAwACQo75LtUW+TJiRvk0jvkyYl75PAL5LtUa+UZiUvlKeYr5StPC+UrTvvlK07r5StO2+UrTsvlK0675StOq+UrTpvlK06L5StOe+UrTmvlK05b5ShWq+UrTkvlKrXb5Sq2u+UqtDvlKFur5Smsi+UoXfvlKFf75ShZ++UoU1vlKFgb5RmJG+bLCAvmyweb5stUS+bLVDvmy1Qr5ssTy+bLVBvmy1QL5sgxe+bLU8vmyyX75stTu+bLU6vmy1Ob5stTi+bLU3vmy1Nr5stTW+bLUyvmy1Mb5stTC+bLUuvmy1Lb5stSy+bLUrvmy1Kr5sq1a+bLUpvmy1KL5soji+bLUnvmy1Jr5stSK+bLUhvmy1IL5stT2+bIQCvmy1H75slv2+bLUevmyW/L5stR2+bLUcvmy1G75stRq+bLUZvmy1GL5stRe+bLUWvmy1Fb5stRS+bLUTvmy1Er5stRG+bLUQvmy1D75stQ6+bLUNvmy1DL5stQu+bLUKvmy1Cb5stQi+bLUHvmy1Br5stQW+bLUEvmyzW75srGm+bLUDvmy1Ar5stQG+bIFVvmy1AL5stP++bLT+vmy0/b5stPy+bLT7vmy0+r5stPm+bLT4vmy0975stPa+bLT1vmy09L5stPG+UZiXvsQAvkukiL7GmJG+x7Tbvse03L7GmJe+ygC+S7VNvsyYkb7NtU6+zbVQvsyYl77QAL5LtVO+0piRvtO1VL7TtTy+07VVvtMjvtKYl77YAADAAJCkvtqYkb7btl2+2rVkvt2Yk77ewACQpL7ftWW+37Vmvt+1Z77ftWi+37Vpvt+1ar7ftWu+37Vsvt+1bb7ftW6+37Vvvt+1cL7ftXG+37Vyvt+1c77ftXS+37V1vt+1dr7ftXe+37V4vt+1eb7ftXq+37V7vt+1fL7ftX2+37V+vt+1f77ftYC+37WBvt+1gr7ftYO+3ZiUvv+y+77/nmK+/7Tkvv+Ff77/tOi+/7Tnvv+06b7/hd++/5rIvv+Fn77/hTW+/6tDvv+06r7/tOa+/7Tlvv+ra77/tOu+/6tdvv+07L7/hbq+/4WBvv+07r7/tO++/7Twvv+Far7/tO2+/7WHvv+1iL7/tYm+/7WKvv+1i77dmJG/H7WEvx+0+b8f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wABBybanwABBybaowABBybapwABBybaqwABBybRqwABBxZiXwABB0QDAAEHBtqvAAEHTmJPAAEHUg+fAAEHUtq3AAEHUtq7AAEHTmJbAAEHYrs7AAEHTmJHAAEHars/AAEHaI8AAQdOYl8AAQd0AwABBwbawwABB35iRwABB4LaxwABB4LaywABB4LazwABB35iXwABB5ADAAEHBtrTAAEHmmJHAAEHntrXAAEHntrbAAEHntrfAAEHntrjAAEHntrnAAEHntrrAAEHntrvAAEHntrzAAEHntr3AAEHntr7AAEHntr/AAEHntsDAAEHntsHAAEHntsLAAEHntsPAAEHnoyTAAEHntsTAAEHntsXAAEHntsbAAEHntsfAAEHntsjAAEHntsnAAEHntsrAAEHntsvAAEHntszAAEHnts3AAEHnts7AAEHnts/AAEHnttDAAEHnttHAAEHnttLAAEHnttPAAEHnttTAAEHnttXAAEHnttbAAEHnttfAAEHnttjAAEHnttnAAEHnttrAAEHmmJfAAEIPAMAAQcG228AAQhGYk8AAQhKD58AAQhGYlMAAQhS23cAAQhSDXMAAQhSB+sAAQhSG48AAQhS23sAAQhSDwcAAQhS0asAAQhGYkcAAQhyuzsAAQhyuz8AAQhxIwABCHCPAAEIRmJfAAEIhAMAAQcG25MAAQiOYk8AAQiS23cAAQiSDXMAAQiSB+sAAQiSG48AAQiS23sAAQiOYl8AAQioAwABBwbblwABCLJiTwABCLcAAkKbAAEIutubAAEIutufAAEIsmJTAAEIxtt3AAEIxg1zAAEIxgfrAAEIxhuPAAEIxtt7AAEIxtGrAAEIsmJHAAEI4I8AAQiyYl8AAQjoAwABCOrbrwABCOrbswABBwbbtwABCPpiTwABCP4NcwABCP7bewABCPpiUwABCQrRqwABCPpiRwABCRCPAAEI+mJfAAEJGAMAAQcG27sAAQkiYlMAAQkm23cAAQkm23sAAQkmG48AAQkmB+sAAQkmDXMAAQkm278AAQkiYkcAAQlAjwABCSJiXwABCUgDAAEHBtvHAAEJUmJPAAEJVtvLAAEJVtq7AAEJVtvPAAEJUmJTAAEJZtvTAAEJZtvXAAEJUmJfAAEJcoL/AAEJcoMIAwACQp8AAQl+2/MAAQmCYkcAAQmG2/cAAQmFnwABCYJiUwABCZJZuwABCYJiXwABCZgDAAEJftv7AAEJomJPAAEJpwACQp8AAQmq2/8AAQmq3AMAAQmq3AcAAQmq3AsAAQmq3A8AAQmq3BMAAQmq3BcAAQmq3BsAAQmq3B8AAQmiYkcAAQnS3DMAAQnS3DsAAQnS3D8AAQnS3EsAAQnS3F8AAQnS3CcAAQnS3GMAAQnS3C8AAQnS3GcAAQmiYl8AAQn4AwABCX6SOwABCgJiTwABCgaS+wABCgaSqwABCgaTswABCgaTuwABCgJiRwABChrMMwABChqUbwABCgJiXwABCiQDAAEJfpI3AAEKLmJTAAEKMtxrAAEKMtxvAAEKMtxzAAEKMtx3AAEKMtx7AAEKMtx/AAEKMtyDAAEKLmJfAAEKUAMAAQl+3IcAAQpaYk8AAQpe3GsAAQpe3G8AAQpe3HMAAQpe3HcAAQpe3HsAAQpe3H8AAQpe3IMAAQpaYl8AAQp8AAMAAkKjAAEKhtyLAAEKimJbAAEKjrs7AAEKimJHAAEKlrs/AAEKltAbAAEKltyPAAEKltyTAAEKltyXAAEKltybAAEKhtyfAAEKsmJHAAEKttyjAAEKttynAAEKttyrAAEKttyvAAEKttyzAAEKtty3AAEKtgojAAEKsmJfAAEK1AMAAQqG3LsAAQreYk8AAQriD58AAQrjAAJCowABCurVlwABCurcwwABCurcxwABCurcywABCurczwABCurc0wABCt5iWwABCwa7OwABCt5iRwABCw67PwABCw7cjwABCw7QGwABCw8AAkKjAAELHtz/AAELDtyXAAELDtyTAAELDtybAAEK3mJfAAELMAMAAQqG3QMAAQs6Yk8AAQs/AAJCowABC0LcwwABC0LdBwABC0LcywABC0LczwABC0Lc0wABCz7dCwABCzpiRwABC17cpwABC17cowABC14KIwABC17dIwABC17cswABC17ctwABC17cqwABC17crwABCzpiXwABC4ADAAEKht0vAAELimJPAAELjwACQqMAAQuS3TMAAQuKYkcAAQuauz8AAQua0BsAAQua3JsAAQua3JcAAQua3JMAAQua3I8AAQuKYl8AAQu0AAMAAkKnAAELvt1PAAELwmJPAAELxwACQqcAAQvKlMsAAQvK3VMAAQvK3VcAAQvK3VsAAQvK3V8AAQvK3WMAAQvK3WcAA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C7hFwABEC7hGwABEC7hHwABEC7hIwABEC7hJwABEC7hKwABEC7hLwABEC7hMwABEC7hNwABEC7hOwABEC7hPwABEC7hQwABEC7hRwABEC7hSwABEC7hTwABEC7hUwABEC7hVwABEC7hWwABEC7hXwABEC7hYwABEC7hZwABEC7hawABEC7hbwABEC7hcwABEC4WtwABEC7hdwABEC7hewABEC7hfwABEC7hgwABEC7hhwABEC7hiwABEC7hjwABEC7BmwABEC7hkwABEC7hlwABEC7hmwABEC7hnwABEC7howABEC7hpwABEC7hqwABEC7BiwABEC7BOwABEC4XvwABEC7hrwABEC7hswABEC7BjwABEC7htwABEC7huwABEC7hvwABEC7hwwABEC7hxwABEC7hywABEC7hzwABEC7h0wABEC7h1wABEC7h2wABEC7h3wABEC7h4wABEC7h5wABEC7h6wABEC7h7wABEC7h8wABECpiXwABEYwDAAEQJuH3AAERlmJHAAERmuH7AAERmuILAAERmuIDAAERlmJfAAERqAMAARAm4g8AARGyYk8AARG2c8sAARG2DsMAARG2Z98AARG0nwABEbJiXwABEcgDAAEQJuITAAER0mJPAAER1uIXAAER0mJHAAER3uIbAAER3uIDAAER0mJfAAER6AMAARAm4icAARHyYk8AARH2WIMAARH2Dz8AARH0GwABEfbiKwABEfbiLwABEfbiMwABEfbiNwABEfbiOwABEfbiPwABEfbiQwABEfbiRwABEfaVOwABEfZkswABEfJiRwABEi7iTwABEi7iSwABEi7iUwABEi6l5wABEi7iYwABEi7iZwABEi7iawABEi7ibwABEi7icwABEi7idwABEi7iewABEi7ifwABEi7igwABEi6FrwABEi7ihwABEi7ilwABEi7ipwABEiyPAAER8mJfAAESeAMAARAm4rcAARKCYk8AARKG4hcAARKCYkcAARKO4gMAARKO4hsAARKO4rsAARKO4sMAARKO4scAARKO4r8AARKO4ssAARKO4s8AARKO4tMAARKO4tcAARKO4tsAARKO4t8AARKO4uMAARKO4McAARKO4MsAARKO4M8AARKO4NMAARKO4NcAARKO4NsAARKO4N8AARKOwZ8AARKOwacAARKO4ucAARKOGAcAARKO4OMAARKO4OcAARKO4OsAARKO4O8AARKO4PMAARKO4PcAARKO4PsAARKO4P8AARKO4QMAARKO4QcAARKO4QsAARKO4Q8AARKO4RMAARKOwbsAARKO4RcAARKO4RsAARKO4R8AARKO4SMAARKO4TsAARKO4T8AARKO4SsAARKO4ScAARKO4S8AARKO4TMAARKO4TcAARKO4usAARKO4U8AARKO4VMAARKO4VcAARKO4VsAARKO4u8AARKO4V8AARKO4WMAARKO4WcAARKO4WsAARKO4XMAARKOFrcAARKO4XcAARKO4X8AARKO4W8AARKO4XsAARKO4YMAARKO4YcAARKO4YsAARKO4Y8AARKOwZsAARKO4ZMAARKO4ZcAARKO4asAARKOwYsAARKO4ZsAARKO4Z8AARKO4aMAARKO4acAARKOwTsAARKOF78AARKO4a8AARKO4bMAARKOwY8AARKO4UMAARKO4UsAARKO4UcAARKO4bcAARKO4b8AARKO4bsAARKO4cMAARKOwNsAARKO4ccAARKO4csAARKO4c8AARKO4dMAARKO4dcAARKO4dsAARKO4d8AARKO4eMAARKO4ecAARKO4esAARKO4e8AARKO4fMAARKCYl8AARQsAwABECbi8wABFDZiTwABFDmrAAEUOgozAAEUNmJHAAEURgxfAAEUNmJfAAEUTAMAARAm4vcAARRWYlMAARRa4vsAARRWYl8AARRgAwABECbi/wABFGpiTwABFG4MZwABFG4HowABFGpiUwABFHoFVwABFGpiRwABFILjAwABFILjCwABFILjDwABFIIRZwABFIIMXwABFIMAAkK7AAEUmuMTAAEUamJfAAEUoAMAARAm4x8AARSqYk8AARSuzVcAARSu4yMAARSu4ycAARSu4ysAARSu4y8AARSu4zMAARSu4lcAARSu4zcAARSu4zsAARSu4z8AARSu4osAARSu40MAARSu40cAARSu4gcAARSu4p8AARSu4qMAARSqYlMAARTyDwcAARTy42sAARSqYkcAART+408AART+41MAART+41cAART+4o8AART+41sAART+42cAART+lF8AART+CiMAART+43MAART+4l8AART+43sAART9WwABFP7jfwABFP7jhwABFP7jbwABFP7jjwABFP4RZwABFP7jkwABFP7jlwABFP7jnwABFP7jpwABFP7jtwABFP7juwABFP7jvwABFP7ikwABFP7jzwABFP7j1wABFP7ipwABFP7jswABFPyPAAEUqmJfAAEVeAMAARV640sAARAmkksAARWGYk8AARWKlTcAARWKlTsAARWKzVcAARWK498AARWKCUcAARWK4xsAARWKZ98AARWKc8sAARWKDsMAARWK0BcAARWLAAJCuwABFbbj4wABFYrj5wABFYrj6wABFYrj7wABFYrj8wABFYrj9wABFYrj+wABFYrj/wABFYrkAwABFYrkBwABFYrkCwABFYrkDwABFYrkEwABFYrkFwABFYrkGwABFYrkHwABFYrkIwABFYrkJwABFYrkKwABFYrkLwABFYrkMwABFYrkNwABFYrkOwABFYrkPwABFYrkQwABFYrkRwABFYrkSwABFYrkTwABFYrkUwABFYrkVwABFYrkWwABFYrkXwABFYrkYwABFYrkZwABFYrkawABFYrkbwABFYrkcwABFYrkdwABFYrkewABFYrkfwABFYrkgwABFYrkhwABFYrkiwABFYrkjwABFYrkkwABFYrklwABFYrkmwABFYrknwABFYrkowABFYrkpwABFYrkqwABFYrkrwABFYZiUwABFooPBwABForkvwABFoqTewABFYZiRwABFprktwABFprkuwABFprkwwABFprk0wABFprk1wABFprkzwABFprk2wABFprWbwABFpqxpwABFprk3wABFprNbwABFprUEwABFprUFwABFprUGwABFprUHwABFprUIwABFprUJwABFprUKwABFprULwABFprUMwABFprUNwABFprUPwABFprUQwABFprURwABFprUSwABFprUTwABFprUUwABFprUVwABFprUWwABFprUXwABFprUYwABFprUZwABFprUawABFprUbwABFprUcwABFprUdwABFprk4wABFprk5wABFprjFwABFprk6wABFprlBwABFprk9wABFprk8wABFprlAwABFpoRNwABFprjdwABFprjiwABFprjowABFprlEwABFprlDwABFprlFwABFprlIwABFprlKwABFpriWwABFprlLwABFprlMwABFprlNwABFprlOwABFprlPwABFprlQwABFprlRwABFprlSwABFprlTwABFprUOwABFpripwABFprlUwABFprlVwABFprjswABFprlWwABFprldwABFpiPAAEVhmJfAAEXuAMAARAm5X8AARfCYk8AARfHAAJCuwABF8rlgwABF8rlhwABF8rliwABF8JiRwABF9poxwABF9oRYwABF9sAAkK7AAEX5uW3AAEX5uWXAAEXwmJTAAEX8gVXAAEX8g7LAAEX8YcAARfy5a8AARfyAw8AARfy5bMAARfCYl8AARgPAAJCuwABGBIC1wABECblxwABGBpiUwABGB4CWwABGBpiRwABGCblWwABGCYRNwABGCSPAAEYGmJfAAEYNAMAARAm5dMAARg+Yl8AARhAAwABECbl1wABGEpiUwABGE7jrwABGEpiRwABGFblVwABGFbkzwABGFbk1wABGEpiXwABGGQDAAEQJuXbAAEYbmJPAAEYcuXfAAEYcuXjAAEYcuXnAAEYcuXrAAEYcuXvAAEYcuXzAAEYbmJTAAEYjYcAARiMnwABGI5/IwABGI7l9wABGG5iRwABGKLk2wABGKIRNwABGKLk9wABGKLk8wABGKLlAwABGG5iXwABGLgDAAEQJuX7AAEYwmJTAAEYxhbTAAEYxuX/AAEYxuYDAAEYwmJfAAEY1AMAARAm5gcAARjeYkcAARji5NsAARji5VcAARjeYl8AARjsAwABECbmCwABGPZiTwABGPpYgwABGPrmDwABGPrmEwABGPrQBwABGPZiRwABGQ7k0wABGQ4RNwABGQyPAAEY9mJTAAEZHuYXAAEY9mJfAAEZJAMAARAm5h8AARkuYkcAARky5NMAARkyETcAARkwjwABGS5iXwABGUADAAEQJuYnAAEZSmJPAAEZTwACQrsAARlS5isAARlO5i8AARlO5jMAARlKYkcAARli5M8AARli5NMAARli5jsAARlKYl8AARlwAwABECbmPwABGXpiTwABGX7mQwABGX6TewABGX8AAkK7AAEZiuZHAAEZiuZLAAEZfliDAAEZemJTAAEZmhXzAAEZmhXnAAEZmhRfAAEZemJHAAEZquZTAAEZqI8AARmq5OMAARmq5l8AARmq5PcAARmq5PMAARmq5QMAARl6Yl8AARnIAwABECbmYwABGdJiTwABGdYUXwABGdJiRwABGd4RNwABGdJiXwABGeQDAAEQJuZnAAEZ7mJPAAEZ8hRfAAEZ7mJHAAEZ+I8AARn6ETcAARnuYl8AARoEAwABECbmbwABGg5iRwABGhCPAAEaDmJfAAEaGAMAARAm5ncAARoiYkcAARomETcAARom5M8AARokjwABGiJiUwABGjbmewABGjYUXwABGiJiXwABGkADAAEQJuaDAAEaSmJPAAEaTuaHAAEaSmJHAAEaVhE3AAEaVI8AARpKYlMAARpiFF8AARpKYl8AARpoAwABECbmkwABGnJiTwABGnZYgwABGnYUXwABGnbmlwABGnbmEwABGnJiRwABGorkzwABGooRNwABGork9wABGoiPAAEacmJfAAEanAMAARAm5p8AARqmYk8AARqq5qMAARqqFL8AARqqk3sAARqmYlMAARq6FecAARq6AlsAARqmYkcAARrG5OMAARrG5l8AARrEjwABGsYRNwABGqZiXwABGtgDAAEQJuarAAEa4mJHAAEa5I8AARrmETcAARriYl8AARrwAwABECbmswABGvpiRwABGvyPAAEa/hE3AAEa+mJfAAEbCAMAARAm5rsAARsSYk8AARsWWIMAARsSYlMAARseFecAARsSYl8AARskAwABECbmvwABGy5iTwABGzKs+wABGy5iRwABGzrUOwABGzrkzwABGzrk4wABGzrk5wABGzoRNwABGzrk9wABGzrk8wABGzrlAwABGziPAAEbLmJTAAEbYubTAAEbLmJfAAEbaAMAARAm5t8AARtyYkcAARt25M8AARt25OMAARt25OcAARt2ETcAARt25VcAARt0jwABG3JiUwABG5ICWwABG3JiXwABG5gDAAEQJubnAAEbomJPAAEbpqz7AAEbomJTAAEbrhXnAAEbomJHAAEbtuTPAAEbtuTjAAEbtuTnAAEbthE3AAEbtuT3AAEbtuTzAAEbtuUDAAEbtI8AARuiYl8AARvYAwABECbm7wABG+JiTwABG+bm8wABG+bm9wABG+bm+wABG+ZYgwABG+bm/wABG+bnAwABG+JiUwABHAIV5wABHALnEwABHALnFwABHALnGwABHAICWwABG+JiRwABHBrkzwABHBrk4wABHBrk5wABHBoRNwABHBrlVwABHBiPAAEb4mJfAAEcNwACQrsAARw6AtcAARw25wcAARw25wsAARw25w8AARAm5yMAARxOYk8AARxSCbMAARxOYlMAARxaFecAARxOYl8AARxgAwABECbnJwABHGpiRwABHG4RNwABHGpiUwABHHZ7DwABHGpiXwABHHwDAAEQJucrAAEchmJHAAEcihE3AAEciuVXAAEchmJTAAEclnsPAAEclgJbAAEchmJfAAEcoAMAARAm5y8AARyqYlMAARyu5zMAARyuvBMAARyqYkcAARy65M8AARyqYl8AARzAAwABECbnNwABHMpiTwABHM7nOwABHM7nMwABHM68EwABHM7nPwABHM7nQwABHMpiRwABHOYRNwABHOblVwABHObkzwABHObk5wABHObk0wABHObk9wABHObk8wABHOblAwABHOSPAAEcymJfAAEdDAMAAR0OFS8AARAm51sAAR0aYk8AAR0ek3sAAR0aYlMAAR0mFr8AAR0mFscAAR0aYkcAAR0ycwcAAR0aYl8AAR04AwABECbnXwABHUJiRwABHUZzBwABHUJiXwABHUwDAAEQJudjAAEdVmJHAAEdWhE3AAEdWnMHAAEdWuT3AAEdWuTzAAEdWuUDAAEdVmJfAAEdcAMAARAm52cAAR16YkcAAR1+ETcAAR1+cwcAAR1+5PcAAR1+5PMAAR1+5QMAAR16Yl8AAR2UAwABECbnawABHZ5iRwABHaIRNwABHaJzBwABHaLk9wABHaLk8wABHaLlAwABHZ5iXwABHbgDAAEQJudvAAEdwmJHAAEdxhE3AAEdxnMHAAEdxuT3AAEdxuTzAAEdxuUDAAEdwmJfAAEd3AMAARAm53MAAR3mYkcAAR3qETcAAR3qcwcAAR3q5PcAAR3q5PMAAR3q5QMAAR3mYl8AAR4AAwABECbndwABHgpiRwABHg4RNwABHg5zBwABHg7k9wABHg7k8wABHg7lAwABHgpiXwABHiQDAAEQJud7AAEeLmJHAAEeMhf/AAEeMhE3AAEeMI8AAR4uYlMAAR5CCa8AAR5C538AAR4uYl8AAR5MAwABECbnhwABHlZiXwABHlgDAAEQJueLAAEeYmJHAAEeZhE3AAEeZnMHAAEeZuT3AAEeZuTzAAEeZuUDAAEeYmJfAAEefAMAARAm548AAR6GYkcAAR6KETcAAR6KcwcAAR6K5PcAAR6K5PMAAR6K5QMAAR6GYl8AAR6gAwABECbnkwABHqpiRwABHq4RNwABHq5zBwABHq7k9wABHq7k8wABHq7lAwABHqpiXwABHsQDAAEQJueXAAEezmJHAAEe0hE3AAEe0nMHAAEe0uT3AAEe0uTzAAEe0uUDAAEezmJfAAEe6AMAARAm55sAAR7yYkcAAR72ETcAAR72cwcAAR725PcAAR725PMAAR725QMAAR7yYl8AAR8MAwABECbnnwABHxZiTwABHxqTewABHxZiUwABHyIWswABHxZiRwABHypzBwABHxZiXwABHzADAAEQJuejAAEfOmJHAAEfPhE3AAEfPnMHAAEfPuT3AAEfPuTzAAEfPuUDAAEfOmJfAAEfVAMAARAm56cAAR9eYkcAAR9iETcAAR9icwcAAR9i5PcAAR9i5PMAAR9i5QMAAR9eYl8AAR94AwABECbnqwABH4JiRwABH4YRNwABH4ZzBwABH4bk9wABH4bk8wABH4blAwABH4JiXwABH5wDAAEQJuevAAEfpmJHAAEfqI8AAR+qETcAAR+mYl8AAR+0AwABECbnswABH75iRwABH8CPAAEfwhE3AAEfvmJfAAEfzAMAARAm57sAAR/WYk8AAR/aCRcAAR/aY+8AAR/WYl8AAR/kAwABH+bnvwABECbnwwABH/JiTwABH/bnxwABH/JiRwABH/yPAAEf/hE3AAEf8mJfAAEgCAMAASAK578AARAm588AASAWYkcAASAYjwABIBoRNwABIBZiXwABICQDAAEgJue/AAEQJufXAAEgMmJPAAEgNgezAAEgNufbAAEgNoq/AAEgMmJHAAEgRI8AASBGETcAASAyYlMAASBS598AASAyYl8AASBYAwABECbn4wABIGJiRwABIGSPAAEgZhE3AAEgYmJTAAEgcufrAAEgYmJfAAEgeAMAARAm5+8AASCCYk8AASCG5/MAASCCYkcAASCMjwABII4RNwABIIJiUwABIJrn9wABIJrn+wABIJrn3wABIIJiXwABIKgDAAEQJuf/AAEgsmJPAAEgtugDAAEgtugHAAEgtgmfAAEgsmJHAAEgxI8AASDGETcAASCyYl8AASDQAwABECboDwABINpiTwABIN4X/wABINpiRwABIOSPAAEg5hE3AAEg5uJbAAEg5uUvAAEg5uUzAAEg5uU3AAEg5uU7AAEg5uU/AAEg5uVDAAEg5uVHAAEg5uVLAAEg5uVPAAEg5tQ7AAEg5uVTAAEg2mJXAAEhIuSvAAEg2mJfAAEhKlUnAAEQJugvAAEhMmJHAAEhNhE3AAEhNuT3AAEhNuTzAAEhNuUDAAEhMmJfAAEhSAMAARAm6DMAASFSYkcAASFUjwABIVYRNwABIVJiXwABIWADAAEQJug7AAEhamJHAAEhbug/AAEhbI8AASFuETcAASFqYl8AASF8AwABECboRwABIYZiUwABIYqVNwABIYZiVwABIZKVNwABIYZiRwABIZoRNwABIZrlUwABIZrUOwABIZiPAAEhhmJfAAEhrAMAARAm6EsAASG2Yk8AASG66E8AASG66FMAASG66FcAASG66FsAASG2YkcAASHO6GsAASHMjwABIc4RNwABIbZiXwABIdwDAAEh3uhfAAEh3uhjAAEh3uhnAAEQJuhzAAEh8mJPAAEh9uh3AAEh8mJfAAEh/AMAARAm6HsAASIGYk8AASIK6H8AASIGYkcAASISETcAASIScwcAASIS5PcAASIS5PMAASIS5QMAASIGYl8AASIoAwABECbogwABIjJiRwABIjYRNwABIjZzBwABIjbk9wABIjbk8wABIjblAwABIjJiXwABIkwDAAEQJuiHAAEiVmJHAAEiWhE3AAEiWnMHAAEiWuT3AAEiWuTzAAEiWuUDAAEiVmJfAAEicAMAARAm6IsAASJ6YkcAASJ+ETcAASJ+cwcAASJ+5PcAASJ+5PMAASJ+5QMAASJ6Yl8AASKUAwABECbojwABIp5iRwABIqIRNwABIqJzBwABIqLk9wABIqLk8wABIqLlAwABIp5iXwABIrgDAAEQJuiTAAEiwmJHAAEixI8AASLGETcAASLCYl8AASLQAwABECbolwABItpiRwABItyPAAEi3hE3AAEi3uTPAAEi2mJfAAEi7AMAARAm6J8AASL2Yk8AASL60BcAASL2YkcAASMAjwABIwIRNwABIwLkzwABIvZiXwABIxADAAEQJuijAAEjGmJPAAEjHsF7AAEjHtAXAAEjGmJHAAEjKI8AASMqETcAASMq5M8AASMaYl8AASM4AwABECbopwABI0JiTwABI0boqwABI0JiRwABI0yPAAEjThE3AAEjQmJfAAEjWAMAARAm6K8AASNiYk8AASNmWIMAASNiYkcAASNsjwABI24RNwABI27lBwABI27k9wABI27k8wABI27lAwABI27lUwABI2JiXwABI4wDAAEQJui7AAEjlmJPAAEjmui/AAEjlmJHAAEjoI8AASOiETcAASOi1DsAASOi5PcAASOi5PMAASOi5QMAASOWYlMAASO+FecAASO+6McAASO+6MsAASOWYlcAASPO6MsAASOWYl8AASPUAwABECbozwABI95iTwABI+IUXwABI+LovwABI95iRwABI+7mXwABI+yPAAEj7hE3AAEj3mJfAAEj/AMAARAm6NcAASQGYk8AASQKWIMAASQGYkcAASQQjwABJBIRNwABJBLk9wABJBLlUwABJBLkzwABJAZiXwABJCgDAAEQJujfAAEkMmJPAAEkNliDAAEkMmJHAAEkPI8AASQ+ETcAASQ+5PcAASQ+5PMAASQ+5QMAASQ+5VcAASQyYlMAASRaAlsAASQyYl8AASRgAwABECbo6wABJGpiRwABJGyPAAEkbhE3AAEkbuTTAAEkamJfAAEkfAMAARAm6PMAASSGYk8AASSKk3sAASSGYkcAASSQjwABJJIRNwABJJLk4wABJJLk5wABJJLkzwABJJLk9wABJJLk8wABJJLlAwABJIZiUwABJLYV5wABJLSfAAEktuS/AAEkhmJfAAEkxAMAARAm6P8AASTOYk8AASTSk3sAASTOYkcAASTYjwABJNoRNwABJNrk4wABJNrk5wABJNrkzwABJM5iUwABJPIV5wABJPCfAAEk8gJbAAEk8uS/AAEkzmJfAAElBAMAARAm6QsAASUOYk8AASUS6Q8AASUS6RMAASUS6RcAASUS6RsAASUSCZ8AASUS6R8AASUOYlsAASUufk8AASUOYlMAASU2Ca8AASU26S8AASU26TcAASU26TsAASU26T8AASU26UMAASUOYkcAASVSETcAASVQjwABJVLk9wABJVLk8wABJVLlAwABJQ5iXwABJWrpIwABJWrpJwABJWrpKwABJWoJswABJWpVJwABECbpSwABJYJiTwABJYbpGwABJYJiUwABJY7pLwABJYJiRwABJZYRNwABJZSPAAElluT3AAElluTzAAElluUDAAElgmJfAAElrAMAARAm6U8AASW2YlMAASW6CRcAASW2YkcAASXCETcAASXAjwABJbZiXwABJcwDAAEQJulXAAEl1mJPAAEl2ulbAAEl2ulfAAEl2ukbAAEl2gmfAAEl2rN7AAEl2uljAAEl1mJTAAEl9ulzAAEl9ulvAAEl9uOvAAEl9ul3AAEl9ul7AAEl1mJHAAEmDuVbAAEmDhE3AAEmDuVXAAEmDuTbAAEmDuT3AAEmDuTzAAEmDuVTAAEmDuUDAAEmDul/AAEmDI8AASXWYl8AASY4AwABJjrpawABECbpkwABJkZiTwABJkrplwABJkrpmwABJkrpGwABJkoJnwABJkrpnwABJkqzewABJkrpYwABJkZiRwABJmrlWwABJmoRNwABJmrlVwABJmrk2wABJmrk9wABJmrk8wABJmrlUwABJmrlAwABJmrpfwABJmiPAAEmRmJTAAEmlumnAAEmlumjAAEmRmJfAAEmoAMAARAm6a8AASaqYkcAASau5VcAASau5VMAASauETcAASau5PcAASau5PMAASau5QMAASau6X8AASasjwABJqpiXwABJtADAAEQJum3AAEm2mJPAAEm3um7AAEm3wACQrsAASbm6b8AASbaYkcAASbsjwABJu4RNwABJu7lVwABJu7k2wABJu7kzwABJu7k9wABJu7k8wABJu7lUwABJu7lAwABJu7pfwABJtpiUwABJxrp0wABJxrpywABJxrkvwABJtpiXwABJyrpwwABJyrpxwABECbp1wABJzZiUwABJzrkvwABJzZiRwABJ0IRNwABJzZiXwABJ0gDAAEQJunbAAEnUmJTAAEnVha/AAEnVhbHAAEnUmJHAAEnYhE3AAEnYI8AASdSYl8AASdsAwABECbp4wABJ3ZiRwABJ3oRNwABJ3iPAAEndmJfAAEnhAMAARAm6esAASeOYk8AASeSZaMAASeS4kMAASeS6e8AASeSZKsAASeSCRcAASeS6fMAASeOYkcAASeu45sAASeu4k8AASeOYl8AASe4AwABECbp/wABJ8JiTwABJ8YJpwABJ8bjYwABJ8JiXwABJ9ADAAEQJuoDAAEn2mJTAAEn3asAASfeCjMAASfaYkcAASfqETcAASfaYl8AASfwAwABECbqBwABJ/piRwABJ/4RNwABJ/piXwABKAQDAAEQJuoLAAEoDmJHAAEoEhE3AAEoDmJTAAEoGuL7AAEoDmJfAAEoIAMAARAm6g8AASgqYkcAASgu6hMAASgu6hcAASgu6hsAASgu6h8AASgu6iMAASgu6icAASgu6isAASgqYl8AAShMAwABECbqLwABKFZiRwABKFrqMwABKFrqNwABKFZiXwABKGQDAAEQJuo7AAEobmJfAAEocAMAARAm6j8AASh6Yk8AASh+6kMAASh6YlMAASiFqwABKIYKMwABKHpiRwABKJIRNwABKHpiXwABKJgDAAEQJupHAAEoomJPAAEopupLAAEoomJTAAEorasAASiuCjMAASiu4vsAASiiYkcAASi+ETcAASiiYl8AASjEAwABECbqTwABKM5iTwABKNIYQwABKM5iUwABKNmrAAEo2gozAAEozmJHAAEo5hE3AAEozmJfAAEo7AMAARAm6lMAASj2Yk8AASj6CacAASj6ZKsAASj6CRcAASj66lcAASj2YlMAASkNqwABKQ4KMwABKPZiRwABKRoRNwABKPZiXwABKSADAAEpIrPrAAEQJupbAAEpLmJPAAEpMupfAAEpMupjAAEpMugHAAEpMupnAAEpMuprAAEpMupvAAEpMgmfAAEpMhQHAAEpMhbTAAEpMgmnAAEpMhibAAEpMgkXAAEpMmSrAAEpMpU7AAEpLmJTAAEpbasAASlu6nMAASluCjMAASkuYkcAASl+ETcAASkuYl8AASmEAwABECbqdwABKY5iTwABKZIW0wABKZLqewABKZLqfwABKY5iUwABKaGrAAEpogozAAEpjmJHAAEprhE3AAEpjmJfAAEptAMAARAm6oMAASm+Yk8AASnCsv8AASnCFr8AASnCFscAASm+YlMAASnRqwABKdIKMwABKdLi+wABKb5iRwABKeIRNwABKb5iXwABKegDAAEQJuqHAAEp8mJPAAEp9gmnAAEp9uqLAAEp9ufbAAEp9oq/AAEp8mJTAAEqCasAASoKCjMAASnyYkcAASoWETcAASnyYl8AASocAwABECbqjwABKiZiTwABKioJrwABKioYQwABKioJFwABKipkqwABKiqVOwABKiZiUwABKkGrAAEqQgozAAEqJmJHAAEqThE3AAEqJmJfAAEqVAMAARAm6pMAASpeYkcAASpiETcAASpi5M8AASpi5PcAASpi5PMAASpi5QMAASpeYl8AASp4AwABECbqlwABKoJiTwABKoYJswABKobmTwABKoJiUwABKpLpLwABKpIPAwABKoJiRwABKp4RNwABKp7kzwABKp7k9wABKp7k8wABKp7lAwABKpyPAAEqgmJfAAEquuqbAAEquuqfAAEQJuqnAAEqxmJPAAEqyJ8AASrLAAJCuwABKtCjAAEqyKcAASrK6rMAASrK6rcAASrGYkcAASrkjwABKsZiXwABKuwDAAEQJuq7AAEq9mJPAAEq+gmfAAEq+uq/AAEq+urDAAEq9mJHAAErChE3AAErCuTPAAErCuT3AAErCuTzAAErCuUDAAErCI8AASr2YlMAASsm6ssAASr2Yl8AASssAwABECbqzwABKzZiTwABKzrqvwABKzZiUwABK0Lq1wABK0LjrwABKzZiRwABK04RNwABK07k9wABK07k8wABK07lAwABK0yPAAErNmJfAAErZAMAARAm6t8AAStuYk8AAStys3sAASty6uMAAStyF18AAStuYlMAASuC6tcAASuC468AAStuYkcAASuO5VcAASuOETcAASuO5PcAASuO5PMAASuO5QMAASuO6X8AASuMjwABK25iXwABK6wDAAEQJurzAAErtmJPAAEruuq/AAErurN7AAEruhdfAAErulkHAAErtmJTAAErzuOvAAErtmJHAAEr1uVXAAEr1hE3AAEr1ul/AAEr1uT3AAEr1uTzAAEr1uUDAAEr1I8AASu2Yl8AASv0AwABECbq9wABK/5iUwABLALq1wABK/5iRwABLAoRNwABLArk9wABLArk8wABLArlAwABLAiPAAEr/mJfAAEsIAMAARAm6v8AASwqYl8AASwsAwABECbrAwABLDZiTwABLDrpGwABLDZiRwABLEIRNwABLELk9wABLELk8wABLELlAwABLECPAAEsNmJfAAEsWAMAARAm6wsAASxiYkcAASxmETcAASxm5PcAASxm5PMAASxm5QMAASxkjwABLGJiXwABLHwDAAEQJusTAAEshmJPAAEsiusXAAEsiukbAAEshmJHAAEslhE3AAEsluT3AAEsluTzAAEsluUDAAEslI8AASyGYl8AASysAwABECbrHwABLLZiRwABLLoRNwABLLrk9wABLLrk8wABLLrlAwABLLiPAAEstmJfAAEs0AADAAJCvwABLNrrLwABLN5iTwABLOIC9wABLOIPBwABLOLrMwABLOLrNwABLOLrOwABLOJ1AwABLOJ24wABLOLrPwABLOCnAAEs3mJTAAEtCJ8AASzeYkcAAS0QjwABLN5iXwABLRgDAAEs2pJPAAEtImJPAAEtJg+fAAEtJgmfAAEtJpxvAAEtJtGnAAEtJg8HA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NcAATHC7ScAATGu7pcAATGuvFsAATGu0tcAATGuvGsAATGuvFMAATGu0ocAATGu7ssAATGu0g8AATGuzAcAATGu7s8AATGu7uMAATGuk58AATGu7u8AATGu7vcAATGulD8AATDmYl8AATIwAAMAAkLLAAEyOmJLAAEyPu8vAAEyOpJXAAEyRmJTAAEySgmbAAEySruTAAEySruXAAEySrubAAEySrufAAEySgVXAAEyRmJHAAEyZrvjAAEyZI8AATJmzU8AATJmELMAATJGYl8AATJ4AwABMjrvRwABMoJiRwABMoa8WwABMoa8YwABMoa8UwABMoa8awABMoJiXwABMpgDAAEyOpJbAAEyomJPAAEypwACQssAATKq70sAATKq708AATKq71MAATKq71cAATKiYlMAATK+BVcAATK+u5MAATK+u5sAATK+u5cAATK+u58AATKiYkcAATLW71sAATLWvFsAATLWvGMAATLWvFMAATLWvGsAATKiYl8AATLsAwABMu5VJwABMjrvXwABMvpiTwABMv7vYwABMv8AAkLLAAEzBu9nAAEzBu9rAAEy+mJHAAEzEwACQssAATMW728AATMSvGMAATMSvFsAATMSvFMAATMSvGsAATMSEQcAATL6YlMAATMy73MAATL6Yl8AATM4AwABMjrvdwABM0JiTwABM0bMLwABM0cAAkLLAAEzTu9PAAEzTu9TAAEzTu9LAAEzTu9XAAEzQmJTAAEzYgmbAAEzYgVXAAEzYruTAAEzYrubAAEzYruXAAEzYrufAAEzQmJHAAEzfrxbAAEzfrxjAAEzfrxTAAEzfrxrAAEzfrvjAAEzfI8AATNCYl8AATOYAwABMjrLiwABM6JiTwABM6YC9wABM6JiRwABM6yPAAEzomJfAAEztAMAATI6klMAATO+YkcAATPCzDMAATPClG8AATO+Yl8AATPMAwABMjq7MwABM9ZiRwABM9q75wABM9q76wABM9q77wABM9q78wABM9ZiXwABM+wDAAEyOsuPAAEz9mJPAAEz+wACQssAATP+74cAATP+74sAATP+748AATP+75MAATP2YkcAATQSu+cAATQSu+sAATQSu+8AATQSu/MAATP2Yl8AATQkAAMAAkLPAAE0Lu+vAAE0MmJfAAE0NAMAATQukl8AATQ+YlMAATRCz9cAATRCzR8AATRC3b8AATRC3c8AATRCk5cAATRC3d8AATRCy+8AATRCweMAATRC3cMAATRC2d8AATRC3eMAATRC0vcAATRCqW8AATRCk+sAATRCy2sAATRC77MAATRCuv8AATRC77cAATQ+YkcAATSO1lcAATSO2JcAATSO2JsAATSO2R8AATSO1rMAATSObDsAATSO1+8AATSO1+cAATSO2AMAATSO1/8AATSO1+sAATSO1/cAATSO1+MAATSO3OcAATSO1/sAATSO778AATSO0H8AATSO1QcAATSO7TcAATQ+Yl8AATTcAwABNC7t5wABNOZiRwABNOrSDwABNOqUPwABNOruywABNOru7wABNOZiXwABNPwDAAE0Lu/DAAE1BmJHAAE1Cu2PAAE1Cu2TAAE1Cu2vAAE1Cu2zAAE1BmJTAAE1Hu1TAAE1HuYTAAE1Hu2jAAE1Hu2rAAE1Hu1PAAE1Hu2XAAE1Hu2fAAE1BmJfAAE1PAMAATQukmMAATVGYlMAATVK3d8AATVKz9cAATVKzR8AATVK3b8AATVK3c8AATVKk5cAATVKy+8AATVKqW8AATVK7yMAATVK1/MAATVK7tMAATVK7ucAATVK3eMAATVK3aMAATVK3cMAATVK2d8AATVKk+sAATVK7ycAATVKzEMAATVGYkcAATWa1lcAATWazAcAATVGYl8AATWkAAMAAkLTAAE1rmJPAAE1sphEAwACQtcAATW678sAATW+Yk8AATXAnwABNcMAAkLXAAE1yKMAATXApwABNcJ0QwABNcLwQwABNcLwRwABNcLwSwABNcLwTwABNcJofwABNcLwUwABNcJ2JwABNcLwVwABNcJ0swABNcLwWwABNcLwXwABNcJ2OwABNcLwYwABNcLwZwABNcJ1IwABNcLwawABNcJ09wABNcJ2RwABNcLwbwABNcLwcwABNcJlNwABNcLwdwABNcLwewABNcLwfwABNcLwgwABNcLwhwABNcJ0RwABNcLwiwABNb5iRwABNkiPAAE1vmJfAAE2UAMAATW6F/sAATZaYk8AATZfAAJC1wABNmIZ5wABNlpiUwABNmoJnwABNmpniwABNmoPBwABNmrwpwABNmrwqwABNlpiRwABNoIRNwABNoK74wABNoJ7ewABNoLwjwABNoKbBwABNoK+PwABNoMAAkLXAAE2nvCTAAE2nhlvAAE2nvCXAAE2gSMAATaAjwABNlpiXwABNrQDAAE1uvCvAAE2vmJTAAE2wgmfAAE2vmJHAAE2yhE3AAE2ynt7AAE2ywACQtcAATbW8JMAATbWGW8AATbW8JcAATa+Yl8AATbkAwABNbrwtwABNu5iTwABNvJznwABNu5iUwABNvoJnwABNu5iRwABNwIRNwABNwMAAkLXAAE3CvCTAAE3ChlvAAE3CvCXAAE3Ant7AAE3AvCPAAE27mJfAAE3IAMAATW68MMAATcqYk8AATcupVMAATcqYlMAATc2CZ8AATcqYkcAATc+ETcAATc/AAJC1wABN0bwkwABN0YZbwABN0bwlwABNz57ewABNz7wjwABNypiXwABN1wDAAE1uvDPAAE3ZmJPAAE3aqovAAE3ZmJTAAE3cgmfAAE3ZmJHAAE3ehE3AAE3ewACQtcAATeC8JMAATeCGW8AATeC8JcAATd6e3sAATd68I8AATdmYl8AATeYAwABNbrw2wABN6JiTwABN6Z1vwABN6JiUwABN64JnwABN6JiRwABN7YRNwABN7cAAkLXAAE3vvCTAAE3vhlvAAE3vvCXAAE3tnt7AAE3tvCPAAE3omJfAAE31AMAATW68OcAATfeYlMAATfiCZ8AATfeYkcAATfqETcAATfrAAJC1wABN/LwkwABN/IZbwABN/LwlwABN+p7ewABN+rwjwABN95iXwABOAgDAAE1uvDzAAE4EmJPAAE4FgpDAAE4FKcAATgSYlMAATgiCZ8AATgi8KcAATgi8KsAATgSYkcAATgyETcAATgzAAJC1wABODrwkwABODoZbwABODrwlwABODJ7ewABODK74wABODLwjwABOBJiXwABOFQDAAE1uvEHAAE4XmJPAAE4YgpDAAE4YKcAATheYlMAAThuCZ8AAThu8KcAAThu8KsAATheYkcAATh+ETcAATh+u+MAATh+e3sAATh+8I8AATh/AAJC1wABOJLwkwABOJIZbwABOJLwlwABOF5iXwABOKADAAE1uvETAAE4qmJPAAE4rgpDAAE4rg2LAAE4rKcAATiqYlMAATi+CZ8AATi+8KcAATi+8KsAATiqYkcAATjOETcAATjPAAJC1wABONbwkwABONYZbwABONbwlwABOM57ewABOM674wABOM7wjwABOKpiXwABOPADAAE1uvErAAE4+mJPAAE4/gpDAAE4/gkXAAE4/tGnAAE4/W8AATj6YlMAATkSCZ8AATkS8KcAATkS8KsAATj6YkcAATkiETcAATkjAAJC1wABOSrwkwABOSoZbwABOSrwlwABOSLxQwABOSLxUwABOSK74wABOSJ7ewABOPpiXwABOUgDAAE1uvFzAAE5UmJPAAE5VhbnAAE5UmJTAAE5XgmfAAE5XvCrAAE5UmJHAAE5ahE3AAE5awACQtcAATly8JMAATlyGW8AATly8JcAATlqu+MAATlqe3sAATlq8I8AATlSYl8AATmMAwABNbrxfwABOZZiTwABOZoC9wABOZZiUwABOaIJnwABOZZiRwABOaoRNwABOasAAkLXAAE5svCTAAE5shlvAAE5svCXAAE5qnt7AAE5qvCPAAE5lmJfAAE5yAMAATW68YsAATnSYk8AATnWCkMAATnWAvcAATnSYlMAATniCZ8AATnSYkcAATnqETcAATnrAAJC1wABOfLwkwABOfIZbwABOfLwlwABOep7ewABOerwjwABOdJiXwABOggDAAE1uvGXAAE6EmJPAAE6FgmvAAE6FgpDAAE6EmJTAAE6IgmfAAE6EmJHAAE6KhE3AAE6KwACQtcAAToy8JMAAToyGW8AAToy8JcAAToqe3sAAToqu+MAAToq8I8AAToSYl8AATpMAwABNbrxtwABOlZiTwABOlpYgwABOlZiUwABOmIJnwABOlZiRwABOmoRNwABOmsAAkLXAAE6cvCTAAE6chlvAAE6cvCXAAE6ant7AAE6VmJfAAE6hAMAATW68ccAATqOYk8AATqSWIMAATqOYlMAATqaCZ8AATqOYkcAATqiETcAATqjAAJC1wABOqrwkwABOqoZbwABOqrwlwABOqJ7ewABOo5iXwABOrwDAAE1uvHXAAE6xmJPAAE6yliDAAE6ygpDAAE6xmJTAAE61gmfAAE6xmJHAAE63hE3AAE63wACQtcAATrm8JMAATrmGW8AATrm8JcAATree3sAATre8I8AATrGYl8AATr8AwABNbrx3wABOwZiTwABOwoWvwABOwoWwwABOwoWxwABOwrx4wABOwZiRwABOx7yQwABOx4RNwABOx8AAkLXAAE7KvCTAAE7KhlvAAE7KvCXAAE7Hnt7AAE7HrvjAAE7HvCPAAE7BmJTAAE7RgmfAAE7RmeLAAE7RvCrAAE7BmJfAAE7VAMAATW68nsAATteYk8AATtiFr8AATtiFscAATteYlMAATtuCZ8AATtuZ4sAATtu8KsAATteYkcAATt+ETcAATt/AAJC1wABO4bwkwABO4YZbwABO4bwlwABO357ewABO3674wABO37wjwABO15iXwABO6ADAAE1uvKHAAE7qmJPAAE7rhbDAAE7rgmvAAE7rvHjAAE7qmJTAAE7vgmfAAE7vmeLAAE7vvCrAAE7qmJHAAE7zhE3AAE7zwACQtcAATvW8JMAATvWGW8AATvW8JcAATvOe3sAATvOu+MAATvO8I8AATuqYl8AATvwAwABNbrymwABO/piTwABO/4JrwABO/piUwABPAYJnwABPAZniwABPAbwqwABO/piRwABPBYRNwABPBcAAkLXAAE8HvCTAAE8HhlvAAE8HvCXAAE8Fnt7AAE8FrvjAAE8FvCPAAE7+mJfAAE8OAMAATW68qcAATxCYk8AATxGFtMAATxG8qsAATxG8q8AATxCYlMAATxWCZ8AATxWZ4sAATxW8KsAATxCYkcAATxmETcAATxnAAJC1wABPG7wkwABPG4ZbwABPG7wlwABPGa74wABPGZ7ewABPGbwjwABPEJiXwABPIgDAAE1uvLTAAE8kmJPAAE8lJ8AATySYlMAATyeCZ8AATye8KsAATySYkcAATyqETcAATyrAAJC1wABPLLwkwABPLIZbwABPLLwlwABPKq74wABPKp7ewABPJJiXwABPMgDAAE1uvLjAAE80mJPAAE81gL3AAE80mJTAAE83gmfAAE83vCrAAE80mJHAAE86hE3AAE86wACQtcAATzy8JMAATzyGW8AATzy8JcAATzqu+MAATzqe3sAATzSYl8AAT0IAwABNbry8wABPRJiTwABPRYC9wABPRYMlwABPRJiRwABPSMAAkLXAAE9JvL3AAE9JhlvAAE9JvCXAAE9EmJTAAE9NvCnAAE9NvCrAAE9EmJfAAE9QAMAATW68vsAAT1KYlMAAT1OCZ8AAT1KYkcAAT1WETcAAT1XAAJC1wABPV7wkwABPVZ7ewABPVa74wABPVbwjwABPUpiXwABPXADAAE1uvMbAAE9emJTAAE9fgmfAAE9emJHAAE9hhE3AAE9hwACQtcAAT2O8JMAAT2Ge3sAAT2Gu+MAAT2G8I8AAT16Yl8AAT2gAwABNbrzJwABPapiUwABPa4JnwABPapiRwABPbYRNwABPbcAAkLXAAE9vvCTAAE9tnt7AAE9trvjAAE9tvCPAAE9qmJfAAE90AMAATW68zMAAT3aYk8AAT3eFtMAAT3ciwABPdpiUwABPeoJnwABPdpiRwABPfMAAkLXAAE99vCXAAE99hlvAAE99vCTAAE98nt7AAE98hE3AAE98rvjAAE92mJfAAE+EAMAATW680cAAT4aYk8AAT4eFF8AAT4eCa8AAT4aYlMAAT4qCZ8AAT4q8KsAAT4aYkcAAT43AAJC1wABPjrwkwABPjoZbwABPjrwlwABPjZ7ewABPja74wABPjYRNwABPhpiXwABPlQDAAE1uvNTAAE+XmJHAAE+YmofAAE+YvGbAAE+YvC7AAE+YvDHAAE+YvDTAAE+YvDfAAE+YvDrAAE+Yhy3AAE+YvELAAE+YvEXAAE+YvEvAAE+YvF3AAE+YvGDAAE+YnuTAAE+YvHLAAE+YhQ7AAE+Ys+fAAE+YsFLAAE+YvJ/AAE+YvKPAAE+YvKfAAE+YsFXAAE+YvL/AAE+YvMfAAE+YvMrAAE+YvNDAAE+YharAAE+YvLXAAE+YvLnAAE+XmJfAAE+2AMAATW681sAAT7iYk8AAT7mD5MAAT7iYkcAAT7uCisAAT7u82MAAT7uah8AAT7u8ZsAAT7u8LsAAT7u8NMAAT7u8McAAT7u8OsAAT7u8N8AAT7uHLcAAT7u8QsAAT7u8RcAAT7u8S8AAT7u8XcAAT7u8YMAAT7ue5MAAT7uFDsAAT7u8csAAT7uz58AAT7uwUsAAT7u8n8AAT7u8o8AAT7u8p8AAT7uwVcAAT7u8tcAAT7u8ucAAT7u8v8AAT7u8x8AAT7u8ysAAT7u80MAAT7uFqsAAT7sjwABPuJiXwABP3AAAwACQtsAAT96mxcAAT9+YkcAAT+CmyMAAT+CDicAAT9+Yl8AAT+MAwABP3rzmwABP5ZiUwABP5oC9wABP5rzuwABP5ZiRwABP6bznwABP6bzqwABP6bzswABP6bztwABP5ZiXwABP7gDAAE/evO/AAE/wmJPAAE/xgL3AAE/xgZvAAE/xvPDAAE/xvO7AAE/wmJHAAE/2vOfAAE/2vOrAAE/2vOzAAE/2vO3AAE/2wACQtsAAT/u88sAAT/CYl8AAT/0A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Lb3iwABRLJiRwABRLyPAAFEvvejAAFEvvenAAFEvo5nAAFEvvYHAAFEvtejAAFEsmJfAAFE2AMAAUEe9+sAAUTiYlMAAUTm95MAAUTm9+8AAUTiYkcAAUTyjmcAAUTy9gcAAUTy9/MAAUTy9/cAAUTiYl8AAUUEAAMAAkLrAAFFDp7TAAFFEmJPAAFFFgmbAAFFFrhHAAFFFvhHAAFFEmJTAAFFJhmfAAFFEmJHAAFFLhE3AAFFLhW/AAFFLhE7AAFFEmJfAAFFPAADAAJC7wABRUZ5YwABRUpiTwABRU4SOwABRU4bVwABRU4KQwABRU64SwABRU71CwABRUpiVwABRWYUBwABRUpiUwABRW74UwABRW4JFwABRW6D9wABRUpiRwABRX6KGwABRX56MwABRX6jOwABRX74YwABRUpiXwABRZAAAwACQvMAAUWantcAAUWeYk8AAUWifQMAAUWeYlMAAUWqHTsAAUWeYkcAAUWy+GsAAUWeYl8AAUW4AAMAAkL3AAFFwp7bAAFFxmJPAAFFyhLTAAFFyrjTAAFFxmJfAAFF1AADAAJC+wABRd6e3wABReJiTwABReYRSwABReYRhwABReYJswABReJiUwABRfYdOwABRfaGmwABRfYQdwABRfYQbwABRfYJFwABRfaFQwABReJiXwABRhAAAwACQv8AAUYanuMAAUYeYk8AAUYiEUsAAUYitNMAAUYiHTsAAUYiaG8AAUYeYlMAAUY2EYcAAUY2hUMAAUYeYkcAAUZCtNsAAUZCtNcAAUYeYl8AAUZMAAMAAkMDAAFGVvh/AAFGWmJHAAFGXqCvAAFGWmJfAAFGZAMAAUZWnucAAUZuYk8AAUZyAvcAAUZyoLMAAUZyHTsAAUZyEYcAAUZuYlMAAUaGEUsAAUaGhUMAAUZuYl8AAUaQAAMAAkMHAAFGmmJHAAFGnp8EAwACQwsAAUamCB8AAUaqYk8AAUauH6cAAUaqYkcAAUa2VGcAAUa2VCsAAUaqYl8AAUbAAAMAAkMPAAFGymJHAAFGzqBbAAFGznyLAAFGzvirAAFGyp9PAAFG3mJPAAFG4mcLAAFG3mJTAAFG6olrAAFG6hGHAAFG6hNTAAFG6qEDAAFG6rUDAAFG6hOnAAFG6hNXAAFG6nnLAAFG3mJHAAFHDhIrAAFHDvijAAFG3mJXAAFHGhNXA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AEEJwABYAsAAQQ/AAFgCwABBC8AAWALAAEENwABYAsAAQNTAAFgCwABA+MAAWALAAEEfwABYAr52wABYAsAAQM/AAFgCwABAzsAAWALAAEEjwABYAsAAQSTAAFgCwABBJsAAWALAAEEnwABYAsAAQSrAAFgCwABBK8AAWALAAEDSwABYAsAAQTLAAFgCwABBM8AAWALAAEE1wABYAsAAQTfAAFgCwABA0MAAWALAAEE5wABYAsAAQMfAAFgCwABA2cAAWALAAEE9wABYAsAAQT7AAFgCvwPAAFgCwABAxcAAWAK+5sAAWALAAEFCwABYAsAAQUfAAFgCwABBRMAAWALAAEFKwABYAr8BwABYAqFIwABYAsAAQUvAAFgCwABBTsAAWALAAEFPwABYAsAAQSDAAFgCwABBUsAAWALAAEEMwABYAsAAQVXAAFgCwABA28AAWALAAEDWwABYAsAAQRDAAFgCwABBDsAAWALAAEDkwABYAsAAQSzAAFgCwABBXMAAWALAAEEpwABYAsAAQQjAAFgCvwTAAFgCwABBXcAAWALAAEFhwABYAsAAQWDAAFgCwABBZMAAWALAAEFswABYAsAAQW/AAFgCwABBccAAWALAAEFuwABYAsAAQXTAAFgCwABBaMAAWAK+dMAAWAK+csAAWALAAEF5wABYAsAAQXjAAFgCvwLAAFgCwABBe8AAWALAAEF9wABYAsAAQY/AAFgCwABBgcAAWALAAEGUwABYAsAAQX7AAFgCwABBk8AAWAKhRcAAWALAAEGYwABYAsAAQZnAAFgCwABBl8AAWALAAJDuwABYd8AAQZ3AAFgCwABBn8AAWALAAEGbwABYAsAAQaHAAFgCwABBoMAAWALAAEGzwABYAsAAQbjAAFgCwABBt8AAWALAAEG6wABYAsAAQbnAAFgCwABBr8AAWALAAEGwwABYAsAAQbTAAFgCwABBtcAAWALAAEHCwABYAsAAQbbAAFgCwABBxMAAWALAAEGpwABYAsAAQcbAAFgCwABByMAAWALAAEGxwABYAsAAQajAAFgCwABBssAAWALAAEGqwABYAsAAQavAAFgCwABBWMAAWALAAEGswABYAsAAQcnAAFgCvmzAAFgCwABBrcAAWALAAEGuwABYAsAAQaXAAFgCvnHAAFgCvnDAAFgCwABA+sAAWALAAEHHwABYAsAAQaLAAFgCwABBzsAAWALAAEGjwABYAsAAQc/AAFgCwABB0cAAWALAAEHFwABYAsAAQZHAAFgCwABBg8AAWALAAEF/wABYAsAAQdnAAFgCwABB28AAWALAAEGEwABYAsAAQYXAAFgCwABB3cAAWALAAEHewABYAsAAQeDAAFgCwABB4cAAWALAAEHfwABYAsAAQeLAAFgCwABBh8AAWALAAEGIwABYAsAAQYDAAFgCvnXAAFgCwABBksAAWALAAEGnwABYAsAAQZbAAFgCwABBhsAAWALAAEGJwABYAsAAQYrAAFgCwABB78AAWALAAEHzwABYAsAAQfTAAFgCwABBi8AAWALAAEFNwABYAsAAQY3AAFgCwABBjMAAWALAAEGOwABYAsAAQfbAAFgCwABBYsAAWALAAEFjwABYAsAAQXzAAFgCwABAxsAAWALAAEC3wABYAsAAQLjAAFgCwABAssAAWALAAEDJwABYAsAAQffAAFgCwABB+MAAWALAAEH5wABYApYjwABYAqFGwABYAsAAQfrAAFgCwABB/MAAWALAAEH+wABYAsAAQf3AAFgCwABCBMAAWALAAEIKwABYAsAAQg3AAFgCwABCDsAAWALAAEILwABX8JiXwABY2AAAwACQ78AAWNqr7cAAWNuYk8AAWNzAAEISwABY3Ji3wABY3CLAAFjbmJHAAFjgI8AAWNuYl8AAWOIAwABY4sAAQhMAwACQ8MAAWOWgXcAAWOaYk8AAWOcnwABY58AAkPDAAFjpKMAAWOcpwABY54VlwABY54U+wABY54YMwABY5piRwABY7yPAAFjmmJfAAFjxAADAAJDxwABY85iRwABY9L/2wABY9L/3wABY9L/4wABY86BfwABY+JiTwABY+SfAAFj5wACQ8cAAWPsowABY+SnAAFj5wABCFsAAWPnAAEIXwABY+cAAQhjAAFj4mJHAAFkBI8AAWPiYl8AAWQMAAMAAkPLAAFkFmJLAAFkGwABApcAAWQWYkcAAWQjAAECLwABZCMAAQiTAAFkFoGDAAFkLmJPAAFkMwABA2sAAWQyudMAAWQzAAEDqwABZDKQcwABZDMAAQPfAAFkMwABA+cAAWQzAAED7wABZDMAAQP7AAFkMwABBGMAAWQzAAEEXwABZDMAAQenAAFkMhlbAAFkMwABA1cAAWQzAAED0wABZ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AFomhobAAFomhnzAAFomho3AAFoimJfAAFowAMAAWg6t2cAAWjKYk8AAWjMfwABaM56ywABaM65OwABaMpiXwABaNwDAAFoOqD7AAFo5mJPAAFo6wABCfcAAWjqEKsAAWjqahsAAWjq/W8AAWjmYkcAAWj/AAEJ+wABaP4cXwABaOZiXwABaQgAAwACQ+MAAWkSsPsAAWkWYk8AAWkbAAJD4wABaR8AAQovAAFpHwABCjMAAWkWYlsAAWkoAwABaRZiUwABaTJrEwABaTJrPwABaTJrQwABaTJrFwABaRZiRwABaUb3YwABaUb3XwABaUZsJwABaUYVswABaUYYHwABaUaymwABaUaylwABaUcAAkPjAAFpZwABCksAAWlnAAEKTwABaWcAAQpTAAFpZwABCmcAAWlm1mcAAWlnAAEKRwABaWcAAQpvAAFpZwABCmMAAWkWYl8AAWmK9wsAAWkTAAEKkwABaZJiTwABaZYCJwABaZJiUwABaZ5rEwABaZ5rPwABaZ5rQwABaZ5rFwABaZJiRwABabL3YwABabL3XwABabJsJwABabIVswABabIYHwABaZJiXwABacgDAAFpEwABCpcAAWnSYk8AAWnWA7cAAWnWFacAAWnXAAEKOwABadJiRwABaeSPAAFp0mJfAAFp7hn7AAFp7hn8AwACQ+cAAWn6YkcAAWn+thsAAWn6thcAAWoGYlMAAWoKkLcAAWoGYkcAAWoSkDMAAWoGYl8AAWoYAAMAAkPrAAFqImJHAAFqJrl8AwACQ+8AAWouuYMAAWoyYk8AAWo2HTsAAWo2udMAAWo2FtMAAWo2Ed8AAWoyYl8AAWpIAAMAAkPzAAFqUmJLAAFqVwABCrsAAWpXAAEKvwABalJiUwABamIHtwABamMAAQtnAAFqYwABC2sAAWpSYkcAAWpzAAJD8wABancAAQtbAAFqdwABC28AAWpzAAELXwABanIY/wABanMAAQtzAAFqcwABC3cAAWpTAAEKwwABapJiTwABapZbmwABapcAAQrHAAFqlwABCssAAWqXAAEKzwABapJiWwABaqsAAQrXAAFqkmJHAAFqswABCx8AAWqzAAELIwABarCPAAFqkmJfAAFqwwABCtMAAWpTAAELQwABaspiTwABasyfAAFqzgbvAAFqzwABCwsAAWrPAAELDwABas5ZBwABaspiRwABauYQswABauUjAAFq5I8AAWrKYlMAAWr2DwcAAWrKYl8AAWr8AAMAAkP3AAFrBmJLAAFrCwABC4cAAWsGYkcAAWsTAAEL8wABawcAAQuTAAFrGmJPAAFrHgoPAAFrHwABC5cAAWsfAAELmwABax8AAQufAAFrGmJXAAFrMwABC6MAAWsaYkcAAWs6WMsAAWs7AAELrwABazodBwABazkvAAFrOgL/AAFrOmRXAAFrOgKXAAFrOhFnAAFrOgkLAAFrOg/jAAFrOwABC7cAAWs6Aq8AAWs6rJsAAWs7AAELwwABazpb4wABaxpiUwABa3oNiwABa3inAAFreg9DAAFreYcAAWt6BVcAAWt6DssAAWsaYl8AAWuUAwABawcAAQvHAAFrnmJPAAFrog8zAAFrnmJTAAFrqXMAAWuphwABa6oFVwABa6oOywABa6oMZwABa6oHowABa6oDDwABa55iRwABa8pYywABa8oCrwABa8oGlwABa8oSJwABa8oMXwABa8oP4wABa8pY6wABa8oNZwABa8pYwwABa8ljAAFrygdTAAFrygK3AAFrylRPAAFrylj7AAFrylj/AAFrylinAAFrylj3AAFryljTAAFryljnAAFryljzAAFryljPAAFryljfAAFrylkDAAFryI8AAWueYl8AAWwsAwABawcAAQvLAAFsNmJPAAFsOwABC6MAAWw7AAELzwABbDZiUwABbEYNbwABbEWHAAFsRmILAAFsNmJHAAFsVljLAAFsVZMAAWxVLwABbFYC/wABbFVbAAFsVgKXAAFsVgK7AAFsVn7DAAFsVgLvAAFsVn8HAAFsVllrAAFsVn8LAAFsVgkLAAFsVnsrAAFsVn8TAAFsVn8bAAFsVhFnAAFsVn8PAAFsVhhHAAFsVlvjAAFsVlvvAAFsVgVjAAFsVn7bAAFsVg17AAFsVn7fAAFsVm6nAAFsVn7zAAFsVnGLAAFsNmJXAAFsygxnAAFsygejAAFsyYcAAWw2Yl8AAWzYAwABawcAAQvXAAFs4mJPAAFs5wABC6MAAWziYlMAAWzuXHsAAWziYkcAAWz2WMsAAWz2DF8AAWz1WwABbPYClwABbPYRZwABbPZb2wABbPZb3wABbPZb6wABbPZb4wABbPZb7wABbPYQCwABbPZb9wABbPZb8wABbPZb+wABbPYJCwABb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AEPqwABdK8AAQ+vAAF0rs5jAAF0rwABD7MAAXSvAAEPtwABdK7OVwABdK7OawABdK7B3wABdK7B7wABdK7B6wABdK68qwABdKpiXwABdeADAAFzVwABD7sAAXXqYkcAAXXvAAEPvwABde8AAQ/DAAF17wABD8cAAXXvAAEPywABde8AAQ/PAAF16mJfAAF2BAMAAXNXAAEP0wABdg5iRwABdhMAAQ/XAAF2EwABD9sAAXYTAAEP3wABdhMAAQ/jAAF2EwABD+cAAXYOYl8AAXYoAwABc1cAAQ/rAAF2MmJHAAF2NwABD+8AAXY3AAEP8wABdjcAAQ/7AAF2NwABEAMAAXY3AAEQBwABdjJiXwABdkwDAAFzVwABEA8AAXZWYkcAAXZbAAEQEwABdlZiXwABdmADAAFzVwABEBcAAXZqYkcAAXZuwd8AAXZuwe8AAXZuwesAAXZqYl8AAXZ8AwABc1cAARAbAAF2hmJHAAF2isH/AAF2isILAAF2isIHAAF2hmJfAAF2mAMAAXNXAAEQHwABdqJiTwABdqbd+wABdqcAAkQTAAF2rwABECMAAXavAAEQJwABdq8AARArAAF2rwABEC8AAXavAAEQMwABdq8AARA3AAF2rwABEDsAAXauzbMAAXavAAEQPwABdq8AARBDAAF2rwABEEcAAXavAAEQSwABdq8AARBTAAF2rwABEFcAAXanAAEQTwABdqJiRwABdu4KUwABdu4KMwABdu8AAQ83AAF27sCnAAF27wABDwcAAXbuG8sAAXbvAAJEEwABdwsAARCTAAF3CwABEKcAAXcLAAEQtwABdwsAARC7AAF3CwABEMcAAXcLAAEQ3wABdwsAARDTAAF3CwABEO8AAXcLAAERDwABdwsAAREDAAF3CwABEScAAXcLAAERLwABdwsAARB/AAF3CwABEZcAAXcLAAERpwABdwsAARGPAAF3CwABEasAAXcLAAEQywABdwsAARCHAAF3CwABEg8AAXcLAAESEwABdwsAARBbAAF3CwABEF8AAXcLAAESBwABdwsAARIDAAF3CwABEIsAAXcLAAEQvwABdu8AAQ7/AAF27wABDssAAXbuXbMAAXbuXdsAAXbuXesAAXbuvdsAAXbuu88AAXbu24sAAXbuBucAAXbuwg8AAXbvAAEO3wABdu8AAQ7jAAF27wABEQcAAXbvAAEO5wABdu8AAQ7rAAF27wABDu8AAXbvAAEO8wABdu6+KwABdu693wABdu694wABdu6sjwABdu695wABdu8AAQ8PAAF27r4vAAF27wABDyMAAXbvAAEPJwABdu8AAQ8rAAF27uB/AAF27t3/AAF27sILAAF27sH/AAF27sIHAAF2omJTAAF3+wABEHcAAXaiYl8AAXgAAwABc1cAARInAAF4CmJPAAF4Dt37AAF4DwACRBMAAXgXAAESKwABeBbeQwABeBbePwABeBcAARIvAAF4FwABEjMAAXgXAAEQMwABeBcAARA3AAF4FwABEDsAAXgWzbMAAXgXAAEQPwABeBcAARBDAAF4FwABEFMAAXgXAAEQVwABeApiRwABeE4KUwABeE4KMwABeE7eCwABeE7eBwABeE8AAQ8/AAF4Tt4bAAF4Tt4DAAF4TuCLAAF4TwABDzcAAXhOwdcAAXhOYrMAAXhOYv8AAXhOYvsAAXhOrMsAAXhOvdMAAXhPAAJEEwABeI8AARI3AAF4jwABEj8AAXiPAAESOwABeI8AARJDAAF4jwABErMAAXiPAAEStwABeI8AARK/AAF4jwABEtcAAXiPAAESywABeI8AARJLAAF4jwABEucAAXiPAAESwwABeI8AAREPAAF4jwABEwsAAXiPAAETFwABeI8AARMHAAF4jwABExsAAXiPAAES7wABeI8AARMjAAF4jwABEycAAXiPAAESRwABeI8AARNfAAF4jwABE2MAAXiPAAEQWwABeI8AARBfAAF4jwABEusAAXiPAAESTwABeI8AARLjAAF4jwABErsAAXhPAAEPjwABeE4cCwABeE8AAQ+HAAF4TwABD1MAAXhPAAEPSwABeE8AAQ9PAAF4TwABD0cAAXhOvcsAAXhO24MAAXhOu7MAAXhOvdcAAXhOwfcAAXhPAAEPZwABeE8AAQ9rAAF4TwABEwMAAXhPAAEPbwABeE8AAQ9zAAF4TwABD3cAAXhOvicAAXhPAAEPpwABeE8AAQ+rAAF4TwABD3sAAXhPAAEPlwABeE8AAQ+zAAF4TsHvAAF4TsHfAAF4TsHrAAF4CmJTAAF5ct33AAF5ct3zAAF5cwABD0MAAXlzAAEQdwABeXMAAkQTAAF5hwABEzsAAXgKYl8AAXmMAwABc1YbnwABeZZiTwABeZoQ7wABeZsAAkQTAAF5owABE3cAAXmic8MAAXmWYkcAAXmvAAJEEwABebMAARBbAAF5swABEF8AAXmzAAESBwABebMAARIDAAF5swABEIsAAXmzAAEQvwABea4KIwABeZZiUwABedGHAAF5lmJfAAF52AMAAXNXAAETewABeeJiTwABeecAAkQTAAF56mEzAAF56mEvAAF54mJHAAF59wACRBMAAXn7AAEQWwABefsAARBfAAF5+wABE38AAXn7AAES6wABefsAARJPAAF5+wABEuMAAXn7AAESuwABeeJiUwABehsAAkQTAAF6HwABEzsAAXniYl8AAXokAwABc1cAAROTAAF6LmJPAAF6MJ8AAXozAAJEEwABejijAAF6MKcAAXoybwsAAXozAAETlwABejIPswABejMAARObAAF6MgKzAAF6MvszAAF6MhOLAAF6MhoXAAF6MwABE58AAXozAAETLwABejMAAROjAAF6Muq/AAF6MwABE6cAAXoyWp8AAXoyF/8AAXoyEosAAXoybxcAAXoybw8AAXouYkcAAXqMjwABei5iXwABepQDAAFzVwABE6sAAXqeYk8AAXqgnwABeqMAAkQTAAF6qKMAAXqgpwABeqIRDwABeqJnCwABep5iRwABeryPAAF6nmJfAAF6xAMAAXNXAAETrwABes5iTwABetCfAAF60wACRBMAAXrYowABetCnAAF60wABE7MAAXrS5ssAAXrTAAETtwABetMAARO7AAF60wABE78AAXrOYkcAAXr4jwABes5iXwABewADAAFzVwABE8MAAXsKYk8AAXsMnwABew8AAkQTAAF7FKMAAXsMpwABew5nCwABew4JmwABew4PuwABew8AAQAzAAF7DnrLAAF7DwABE8cAAXsOF/8AAXsKYkcAAXs8jwABewpiXwABe0QDAAFzVwABE8sAAXtOYk8AAXtQnwABe1MAAkQTAAF7WKMAAXtQpwABe1ISQwABe1JjVwABe1MAARNDAAF7Ur+XAAF7TmJHAAF7dI8AAXtOYl8AAXt8AwABc1cAARPPAAF7hmJPAAF7iJ8AAXuLAAJEEwABe5CjAAF7iKcAAXuKZwsAAXuLAAEAMwABe4ZiRwABe6SPAAF7hmJfAAF7rAMAAXNWmzMAAXu2Yk8AAXu6AlsAAXu2YlMAAXvCDwcAAXu2YkcAAXvJIwABe8iPA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dsAAYImYk8AAYIonwABgisAAkQfAAGCMKMAAYIopwABgip0swABgip09wABgip2OwABgip2JwABgirwRwABgip2RwABgirwZwABgip1IwABgirwawABgirwUwABgirwdwABgisAARXfAAGCKwABFeMAAYIrAAEV5wABgisAARXrAAGCKvCLAAGCKwABFe8AAYIrAAEV8wABgiZiRwABgoSPAAGCJmJfAAGCjAMAAYIjAAEV9wABgpZiRwABgprPnwABgprw6wABgprwxwABgprw0wABgprwuwABgprw3wABgpoctwABgprxCwABgprxFwABgprxLwABgpp7kwABgprhHwABgpsAARX7AAGCmwABFf8AAYKbAAEWAwABgpsAARYHAAGCmwABFgsAAYKaFqsAAYKWYl8AAYLkAwABgiLLcwABgu5iUwABgvLiWwABgvKxpwABgvLoFwABgvLoKwABgvLoJwABgvLoHwABgvLUXwABgvLoGwABgvLUbwABgvLoIwABgvKI4wABgvKtWwABgvMAARYPAAGC8snzAAGC8s1vAAGC8nhDAAGC8wABFhMAAYLy1DsAAYLzAAEWFwABgvIanwABgvMAARYbAAGC8qUHAAGC8wABFh8AAYLzAAEWIwABgvMAARYnAAGC8gmfAAGC7mJHAAGDXhpjAAGDXsyvAAGDXhE3AAGDXpsHAAGDXr4/AAGDXI8AAYLuYl8AAYN4AwABgiMAARY3AAGDgmJPAAGDhliDAAGDhgpDAAGDgmJTAAGDksnzAAGDkg8HAAGDkgmfAAGDgmJHAAGDoSMAAYOizK8AAYOiGmMAAYOiETcAAYOimwcAAYOivj8AAYOCYl8AAYO8AwABgiLTQwABg8ZiUwABg8rNbwABg8oPBwABg8ZiRwABg9UjAAGD1syvAAGDxmJfAAGD4AMAAYIjAAEWSwABg+piTwABg+8AARZPAAGD7wACRB8AAYP2WQsAAYPqYlsAAYP8AwABg+piUwABhAaxpwABhAYPBwABhAYJnwABg+piRwABhBYaYwABhBUjAAGEFhE3AAGEFr4/AAGEFpsHAAGD6mJfAAGELwACRB8AAYQyGVcAAYIjAAEWUwABhDpiUwABhD6qLwABhD7oGwABhDpiXwABhEgDAAGCIwABFlcAAYRSYk8AAYRWpVMAAYRXAAJEHwABhF8AA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AEXLwABiPpiUwABiP7iWwABiP4JnwABiPpiRwABiQoRNwABiQrMrwABiQoaYwABiQq+PwABiQqbBwABiPpiXwABiSAAAwACRCMAAYkqYkcAAYkvAAJEIwABiTMAARizAAGJMwABGLcAAYkqGZsAAYk+YlMAAYlCzwcAAYlCyJsAAYlDAAEXOwABiUId4wABiULlYwABiULMXwABiULpZwABiULlXwABiUKOTwABiUMAARc/AAGJQuVnAAGJQu6bAAGJQwABF0MAAYlCeEMAAYk+YkcAAYl/AAEXSwABiX72ewABiX4RNwABiX8AAkQjAAGJjvCXAAGJjwABF0cAAYk+Yl8AAYmYAwABiSsAARdXAAGJomJPAAGJpwACRCMAAYmrAAEXWwABiaJiRwABibMAAkQjAAGJtwABF18AAYm3AAEXZwABibMAARdjAAGJswABF2sAAYmzAAEXbwABibCPAAGJomJfAAGJ0AMAAYkqGc8AAYnaYk8AAYneWIMAAYneFF8AAYnaYlMAAYnqzF8AAYnqeEMAAYnq7psAAYnqyJsAAYnqDwcAAYnaYkcAAYoDAAEXSwABigMAAkQjAAGKCwABF0cAAYoK8JcAAYoLAAEXfwABigL2ewABigIRNwABigEjAAGKAI8AAYnaYl8AAYooAwABiSoaEwABijJiTwABijZYgwABijYUXwABijbPBwABijJiUwABikbpZwABikbumwABikbImwABikYPBwABijJiRwABilsAARdLAAGKWwACRCMAAYpjAAEXRwABimLwlwABimMAARd/AAGKWvZ7AAGKWhE3AAGKWSMAAYpYjwABijJiXwABioADAAGJKwABF4cAAYqKYk8AAYqOWIMAAYqKYlMAAYqWjk8AAYqW7psAAYqWDwcAAYqKYkcAAYqnAAEXSwABiqcAAkQjAAGKrwABF0cAAYqu8JcAAYqm9nsAAYqmETcAAYqlIwABiqSPAAGKimJfAAGKyAMAAYkrAAEXiwABitJiTwABitSfAAGK1wACRCMAAYrfAAEXjwABitJiUwABiuYVpwABiucAARc/AAGK5g8HAAGK0mJXAAGK9hWnAAGK0mJHAAGK/wACRCMAAYsDAAEXRwABiwLwlwABiv72ewABiv0jAAGK/hE3AAGK/I8AAYrSYl8AAYscAwABiSoZvwABiyZiUwABiyrlYwABiyoPBwABiyZiRwABizb2ewABizYRNwABizcAAkQjAAGLQvCXAAGLNI8AAYsmYl8AAYtMAwABiSoZtwABi1ZiUwABi1od4wABi1sAARc7AAGLWg8HAAGLVmJHAAGLavZ7AAGLahE3AAGLawACRCMAAYt28JcAAYtojwABi1ZiXwABi4ADAAGJKhnfAAGLimJPAAGLjhTTAAGLjs8LAAGLjs8PAAGLjhLvAAGLjs8TAAGLjolrAAGLimJTAAGLqu6bAAGLquVfAAGLqg8HAAGLimJHAAGLuwABF0sAAYu7AAJEIwABi8MAARdHAAGLwvCXAAGLwwABF38AAYu69nsAAYu6wmMAAYu6ETcAAYu5IwABi7iPAAGLimJfAAGL5AMAAYkrAAEX1wABi+5iTwABi/IW9wABi+5iUwABi/rlZwABi/rumwABi/oPBwABi+5iRwABjAr2ewABjAsAARdLAAGMCwACRCMAAYwXAAEXRwABjBbwlwABjBcAARd/AAGMChE3AAGMCSMAAYwIjwABi+5iXwABjDADAAGJKmknAAGMOmJHAAGMPmofAAGMPhnDAAGMPs8bAAGMPs8XAAGMPhnzAAGMPhnbAAGMPhobAAGMPhm7AAGMPs8DAAGMOmJfAAGMZAMAAYkrAAEX3wABjG5iRwABjHJ7kwABjHIZwwABjHLPGwABjHLPFwABjHIZ8wABjHIZ2wABjHIZuwABjHLPAwABjG5iXwABjJQDAAGJKwABF+MAAYyeYk8AAYyjAAEXTwABjJ5iUwABjKrL7wABjJ5iRwABjLMAARfnAAGMswABF+sAAYyzAAEX7wABjLMAARfzAAGMssr3AAGMsnuTAAGMshnDAAGMswABF/sAAYyzAAEX/wABjLMAARgDAAGMswABGAcAAYyzAAEYCwABjLIZ2wABjLIZ8wABjLMAARgjAAGMswABGCcAAYyyzxsAAYyyzxcAAYyeYl8AAYz8AwABiSsAARhjAAGNBmJHAAGNCvenAAGNCwABF/sAAY0LAAEX/wABjQsAARgDAAGNCwABGAcAAY0LAAEYCwABjQrPAwABjQZiXwABjSgDAAGJKwABGGcAAY0yYkcAAY02pVsAAY02rPsAAY03AAEX+wABjTcAARf/AAGNNwABGAMAAY03AAEYBwABjTcAARgLAAGNNs8DAAGNMmJfAAGNWAMAAYkrAAEYcwABjWJiTwABjWcAAkQjAAGNawABGHcAAY1iYkcAAY1ypVsAAY1zAAEYIwABjXMAARh7AAGNYmJfAAGNgAMAAYkrAAEYgwABjYpiTwABjY8AARiHAAGNjwABGIsAAY2PAAEYjwABjYpiUwABjZ7L7wABjYpiRwABjaalWwABjaas+wABjacAARh7AAGNpwABGJMAAY2nAAEX7wABjacAARiXAAGNpsrrAAGNpwABGJsAAY2m7t8AAY2nAAEYnwABjacAARfzAAGNpwABGKMAAY2nAAEYqwABjYpiXwABjdwAAwACRCcAAY3mYkcAAY3rAAEZDwABjesAARkjAAGN6wABGTMAAY3rAAEZNwABjecAARi7AAGN/mJPAAGOAwABGL8AAY4DAAEYwwABjgMAARjHAAGN/mJHAAGOEgcXAAGOEtCTAAGOEtCPAAGOEtCbAAGN/mJfAAGOJAMAAY3nAAEY1wABji5iUwABjjK98wABji5iXwABjjgDAAGN5wABGNsAAY5CYkcAAY5HAAEY3wABjkJiXwABjkwDAAGN5wABGOMAAY5WYkcAAY5bAAEY5wABjlsAARjvAAGOVmJfAAGOZAMAAY3nAAEY8wABjm5iRwABjnMAARjrAAGObmJfAAGOeAMAAY3nAAEY9wABjoJiTwABjocAAQ1jAAGOhwACRCcAAY6PAAEY+wABjo8AARj/AAGOjwABGQMAAY6CYlMAAY6evfMAAY6fAAJEJwABjqbIqwABjp4CWwABjoJiXwABjrAAAwACRCsAAY66YkcAAY6/AAEl3wABjrpkTwABjsZiTwABjssAARljAAGOywABGX8AAY7LAAEZiwABjssAAR0XAAGOywABHUMAAY7LAAEdRwABjssAAkQrAAGO5wABHUsAAY7nAAEdiwABjucAAR2TAAGO5wABHZcAAY7nAAEdnwABjucAAR2jAAGO5wABHacAAY7nAAEdqwABjucAAR2vAAGO5tWXAAGO5wABHe8AAY7nAAEd8wABjucAAR33AAGO5wABHgMAAY7nAAEeBwABjucAAR4LAAGO5wABHhMAAY7nAAEeFwABjucAAR4jAAGOywABHU8AAY7LAAEdVwABjssAAR1fAAGOywABHWMAAY7LAAEdawABjssAAR1zAAGOywABHXsAAY7LAAEdgwABjsrcfwABjsrcgwABjssAAR2bAAGOywABHbMAAY7KdjMAAY7LAAEduwABjssAAR3DAAGOywABHccAAY7LAAEdywABjssAAR3PAAGOywABHdMAAY7LAAEd1wABjssAAR3bAAGOywABHd8AAY7LAAEd4wABjssAAR3nAAGOywABHesAAY7LAAEd+wABjssAAR3/AAGOywABHg8AAY7LAAEeHwABjsZiUwABj6sAAR4nAAGPqwABHisAAY+qvMMAAY+rAAJEKwABj7q8NwABj7rO/wABj7sAAR5TAAGPqwABHlcAAY+rAAEeXwABj6sAAR5nAAGPqwABHmsAAY+qr5cAAY+rAAEecwABj6sAAR57AAGPqwABHn8AAY+rAAEe9wABj6sAAR/jAAGOxmJHAAGP8wACRCsAAY/3AAEeMwABj/cAAR6DAAGP9wABHosAAY/3AAEepwABj/cAAR8TAAGP9wABHyMAAY/3AAEfJwABj/cAAR9HAAGP9wABH1MAAY/3AAEfBwABj/cAAR8PAAGP9wABH1sAAY/3AAEe2wABj/cAAR9zAAGP9wABHrcAAY/3AAEe6wABj/cAAR+PAAGP9wABH5MAAY/3AAEflwABj/cAAR9jAAGP9wABH18AAY/3AAEfqwABj/cAAR+jAAGP9wABHqMAAY/3AAEfvwABj/cAAR/LAAGP9wABH5sAAY/zAAEeSwABj/MAAR5PAAGP8wABHo8AAY/zAAEelwABj/MAAR6fAAGP8wABHq8AAY/zAAEeuwABj/K9BwABj/MAAR7HAAGP8wABHs8AAY/zAAEeqwABj/K9FwABj/MAAR7vAAGP8wABHv8AAY/zAAEfAwABj/MAAR8LAAGP8r03AAGP8r0nAAGP8r0vAAGP8r0/AAGP8r0PAAGP8wABHzsAAY/zAAEe4wABj/MAAR7fAAGP8wABHz8AAY/zAAEfQwABj/MAAR9PAAGP8wABH3cAAY/zAAEemwABj/K9RwABj/K9TwABj/K8ywABj/IZ0wABj/K81wABj/K85wABj/K+FwABj/K9ewABj/K+DwABj/K9awABj/K+EwABj/K9cwABj/K+CwABj/K9XwABj/K9HwABj/K83wABj/MAAR/XAAGP8wABH9sAAY/zAAEf6wABj/K89wABj/K87wABj/K8/wABj/K9VwABj/MAAR6/AAGP8wABIEMAA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aIEjwABodpiXwABohgDAAGhlwABK4cAAaIiYk8AAaImEQ8AAaIiYlMAAaIuhp8AAaIubBsAAaIuGV8AAaIuDwcAAaIiYkcAAaJDAAErcwABokEjAAGiQI8AAaIiYl8AAaJQAAMAAkRDAAGiWsIbAAGiXmJPAAGiYg+fAAGiYwABK5MAAaJjAAErlwABomMAASubAAGiYwABK58AAaJjAAErowABomJViwABomLrVwABol5iUwABoobrWwABoobb5wABoobrswABooaOtwABoocAASuvAAGihqTvAAGihuu/AAGihtGrAAGihwABK78AAaKGDwcAAaJeYlsAAaKwAwABorK7OwABol5iRwABor67PwABor7rrwABor8AASurAAGivtvrAAGivuurAAGivI8AAaK9fwABor0jAAGivuufAAGivwABK8sAAaJeYl8AAaLrAAErpwABolsAASvPAAGi8mJPAAGi9qTvAAGi9wACREMAAaL/AAEr0wABovJiUwABowaOtwABowcAASuvAAGjButbAAGjBtvnAAGjBuuzAAGi8mJHAAGjHuuvAAGjHtvrAAGjHuurAAGi8mJfAAGjLAMAAaMuVSQDAAJERwABozpiTwABoz8AAkRHAAGjQwABLTMAAaM9WwABoz8AAS03AAGjPwABLTsAAaM/AAEtPwABoz8AAS1DAAGjPwABLUcAAaM/AAEtSwABoz5WfwABoz8AAQR3AAGjPwABLU8AAaM/AAEtUwABoz8AAS1XAAGjPwABLVsAAaM/AAEtXwABoz8AAS1jAAGjPlajAAGjPlanAAGjPoXzAAGjPomrAAGjPmCrAAGjPwABLWcAAaM/AAEtawABoz5WrwABoz5WswABoz4QLwABoz8AASzPAAGjPl8jAAGjOmJHAAGjtwACREcAAaO7AAEtbwABo7sAAS1zAAGjuwABLYsAAaO3AAEtgwABo7cAAS2HAAGjtwABLY8AAaO3AAEtkwABo7cAAS2XAAGjtwABLZsAAaO3AAEtnwABo7cAAS2jAAGjtugfAAGjttRfAAGjttRvAAGjtugXAAGjtrGnAAGjtqVbAAGjtwABLacAAaO3AAEtrwABo7cAAS27AAGjtwABLb8AAaO3AAEtwwABozsAASvfAAGkFmJTAAGkGgL3AAGkFmJfAAGkIAMAAaM7AAEr4wABpCpiRwABpC4NZwABpCpiXwABpDQDAAGjOwABK+cAAaQ+YkcAAaRCDWcAAaRCu+MAAaQ+Yl8AAaRMAwABozsAASvrAAGkVmJPAAGkWgL3AAGkVmJHAAGkYg1nAAGkVmJfAAGkaAMAAaM7AAEr8wABpHJiTwABpHYC9wABpHJiRwABpH4NZwABpHJiXwABpIQDAAGjOwABK/8AAaSOYk8AAaSSAvcAAaSOYkcAAaSaDWcAAaSOYl8AAaSgAwABozsAASwDAAGkqmJHAAGkrg1nAAGkrwABLBMAAaSqYl8AAaS4AwABozsAASwXAAGkwmJPAAGkxgL3AAGkwmJHAAGkzwABLBMAAaTOu+MAAaTCYl8AAaTYAwABozsAASwbAAGk4mJPAAGk5gL3AAGk4mJHAAGk7wABLBMAAaTuu+MAAaTiYl8AAaT4AwABozsAASwfAAGlAmJPAAGlBgL3AAGlAmJHAAGlDwABLBMAAaUOu+MAAaUCYl8AAaUYAwABozsAASwjAAGlImJPAAGlJgL3AAGlImJHAAGlLwABLBMAAaUuu+MAAaUiYl8AAaU4AwABozsAASwnAAGlQmJPAAGlRgL3AAGlQmJHAAGlTg1nAAGlTwABLBMAAaVOu+MAAaVCYl8AAaVcAwABozsAASwzAAGlZmJHAAGlag1nAAGlawABLD8AAaVmYl8AAaV0AwABozsAASxDAAGlfmJPAAGlggL3AAGlfmJHAAGliwABLD8AAaWKu+MAAaV+Yl8AAaWUAwABozsAASxHAAGlnmJPAAGlogL3AAGlnmJHAAGlqwABLD8AAaWqu+MAAaWeYl8AAaW0AwABozsAASxLAAGlvmJHAAGlwg1nAAGlwwABLF8AAaXDAAEsYwABpcMAASwTAAGlwwABLFsAAaW+Yl8AAaXYAwABozsAASxnAAGl4mJPAAGl5gL3AAGl4mJHAAGl7wABLBMAAaXvAAEsWwABpe674wABpeJiXwABpfwDAAGjOwABLGsAAaYGYk8AAaYKAvcAAaYGYkcAAaYTAAEsEwABphMAASxbAAGmErvjAAGmBmJfAAGmIAMAAaM7AAEsbwABpipiTwABpi4C9wABpipiRwABpjcAASwTAAGmNwABLFsAAaY2u+MAAaYqYl8AAaZEAwABozsAASxzAAGmTmJPAAGmUgL3AAGmTmJHAAGmWwABLBMAAaZbAAEsWwABplq74wABpk5iXwABpmgDAAGjOwABLHcAAaZyYk8AAaZ2AvcAAaZyYkcAAaZ/AAEsEwABpn8AASxbAAGmfrvjAAGmfwABLGMAAaZyYl8AAaaQAwABozsAASyDAAGmmmJPAAGmngL3AAGmmmJHAAGmpwABLBMAAaanAAEsWwABpqcAASxfAAGmprvjAAGmmmJfAAGmuAMAAaM7AAEshwABpsJiTwABpsYC9wABpsJiRwABps4NZwABps674wABpsJiXwABptgDAAGjOwABLJMAAabiYkcAAabmDWcAAabnAAEsEwABpucAASxbAAGm4mJfAAGm9AMAAaM7AAEslwABpv5iTwABpwIC9wABpv5iRwABpwsAASwTAAGnCwABLFsAAacKu+MAAab+Yl8AAacYAwABozsAASybAAGnImJPAAGnJgL3AAGnImJHAAGnLwABLBMAAacvAAEsWwABpy674wABpyJiXwABpzwDAAGjOwABLJ8AAadGYk8AAadKAvcAAadGYkcAAadTAAEsEwABp1MAASxbAAGnUrvjAAGnRmJfAAGnYAMAAaM7AAEsowABp2piTwABp24C9wABp2piRwABp3cAASwTAAGndwABLFsAAad2u+MAAadqYl8AAaeEAwABozsAASynAAGnjmJPAAGnkgL3AAGnjmJHAAGnmg1nAAGnmrvjAAGnjmJfAAGnpAMAAaM7AAEsqwABp65iTwABp7IC9wABp65iRwABp7oNZwABp7q74wABp65iXwABp8QDAAGjOwABLLcAAafOYk8AAafSAvcAAafOYkcAAafaDWcAAafau+MAAafOYl8AAafkAwABozsAASy7AAGn7mJPAAGn8gL3AAGn7mJHAAGn+g1nAAGn+rvjAAGn7mJfAAGoBAMAAaM7AAEsywABqA5iTwABqBIC9wABqA5iRwABqBoNZwABqA5iXwABqCADAAGjOwABLO8AAagqYk8AAaguAvcAAagqYkcAAag2DWcAAagqYl8AAag8AwABozsAASzzAAGoRmJPAAGoSg9DAAGoRmJHAAGoUsyvAAGoRmJfAAGoWAMAAaM7AAEs9wABqGJiTwABqGcAASz7AAGoZwABLP8AAahnAAEtAwABqGcAAS0HAAGoZwABLQsAAahnAAEtDwABqGcAAS0TAAGoZwABLRsAAahnAAEtIwABqGcAAS0rAAGoZwABEdMAAahnAAER1wABqGbDiwABqGJiUwABqJ6tWwABqGJiRwABqKbMrwABqGJiXwABqKwAAwACREsAAai2wzMAAai6Yk8AAai/AAJESwABqMJZCwABqLpiWwABqMq7OwABqLpiRwABqNK7PwABqNLKwwABqNMAAS3LAAGo0wABLc8AAajTAAEfNwABqNMAAS3XAAGo0sq/AAGo0wABLdsAAai6YlMAAaj3AAEt0wABqLbvowABqP5iTwABqQMAAkRLAAGpBlkLAAGo/mJbAAGpDrs7AAGo/mJHAAGpFrs/AAGpFwABLd8AAakXAAEt4wABqRcAAS3nAAGpFwABLesAAakXAAEfFwABqRcAAR8bAAGpFwABLe8AAakXAAEt2wABqRcAAS3zAAGpFwABLfcAAakXAAEt+wABqRcAAS3/AAGpFwABLgMAAai3AAEuBwABqVJiRwABqVcAAS4LAAGpVwABLhMAAalXAAEuFwABqVcAAS4fAAGpVgojAAGpUmJfAAGpbAMAAai27eMAAal2YkcAAal7AAEuIwABqXsAAS4nAAGpewABLisAAal7AAEuLwABqXoKIwABqXZiXwABqZADAAGotwABLjMAAamaYk8AAamfAAJESwABqaLuewABqZ8AAS43AAGpnwABLjsAAamfAAEuPwABqZ8AAS5DAAGpnwABLkcAAamaYkcAAam/AAEuCwABqb8AAS4TAAGpvwABLhcAAam/AAEuHwABqb4KIwABqb8AAS5zAAGpmmJfAAGp2AMAAai3AAEudwABqeJiTwABqeYPnwABqecAAkRLAAGp7sazAAGp5wABLjcAAannAAEuOwABqecAAS4/AAGp5wABLkMAAannAAEuRwABqeJiWwABqgsAAS5/AAGqCrs7AAGp4mJHAAGqFrs/AAGqFsrDAAGqFwABLcsAAaoXAAEtzwABqhcAAS3XAAGqFsq/AAGqFwACREsAAaozAAEulwABqhcAAS3bAAGqFwABHzcAAaniYlMAAapDAAEt0wABqeJiXwABqkgDAAGotwABLpsAAapSYk8AAapXAAJESwABqlrewwABqlcAAS6fAAGqVwABLqMAAapXAAEupwABqlcAAS6rAAGqUmJHAAGqcwABLi8AAapzAAEuIwABqnMAAS4nAAGqcwABLisAAapyCiMAAapSYl8AAaqIAwABqLcAAS67AAGqkmJPAAGqlg+fAAGqlwACREsAAaqfAAEuwwABqp7ewwABqpcAAS6fAAGqlwABLqMAAaqXAAEupwABqpcAAS6rAAGqkmJbAAGquwABLn8AAaq6uzsAAaqSYkcAAarGuz8AAarHAAEt9wABqsbKwwABqscAAS3LAAGqxwABLc8AAarHAAEt1wABqsbKvwABqscAAR83AAGqxwABLfMAAarHAAEt+wABqscAAS3/AAGqxwACREsAAar3AAEulwABqvcAAS7nAAGq9wABLt8AAar3AAEu4wABqvcAAS73AAGqxwABLdsAAarHAAEfFwABqscAAR8bAAGqxwABLe8AAarHAAEt3wABqscAAS3jAAGqxwABLecAAarHAAEt6wABqscAAS4DAAGqkmJTAAGrMwABLjsAAaszAAEuQwABqzMAAS4/AAGrMwABLkcAAaszAAEt0wABqzMAAS43AAGrMwACREsAAatOxrMAAaqSYl8AAatUAwABqLcAAS8LAAGrXmJPAAGrYhLHAAGrYwABLpMAAateYlsAAatsAwABq15iUwABq3YGwwABq3YPBwABq15iRwABq4EjAAGrgI8AAateYl8AAauOVSQDAAJETwABq5ZiRwABq5sAATAvAAGrlwABLxcAAauiYk8AAaumD58AAaunAAJETwABq68AAS8fAAGromJbAAGrtrs7AAGromJHAAGrvrs/AAGrvwABLy8AAau/AAEvMwABq6JiXwABq8wDAAGrzlUnAAGrlwABLz8AAavaYk8AAaveD58AAavfAAJETwABq+cAAS9HAAGr5wABL0sAAavnAAEvTwABq+cAAS9TAAGr5wABL1cAAavaYkcAAav+uz8AAav/AAJETwABrAcAAS9vAAGr/wABEBMAAav/AAEvewABq/8AAS+DAAGr/wABL4cAAav/AAEviwABq/8AAS+PAAGr/wABL5MAAav/AAEvlwABq/8AAS+bAAGr/wABL58AAav/AAEvowABq/8AAS+nAAGr/wABL68AAav/AAEvtwABq/8AAS+/AAGr2mJTAAGsSqZ/AAGr2mJfAAGsUAMAAaxSuzsAAauXAAEvxwABrF5iTwABrGMAAS/LAAGsYo0vAAGsYgmbAAGsYwABL3MAAaxjAAEvdwABrF5iRwABrHsAAkRPAAGsfwABL88AAax/AAEv2wABrHpfPwABrHsAAS/jAAGsewABL+cAAax6GH8AAax6GNcAAax6GLsAAaxeYl8AAaygAwABq5cAAS/vAAGsqmJPAAGsrg+fAAGsrs1jAAGsrqC/AAGsrwACRE8AAay/AAEv9wABrK8AAS/TAAGsrwABL9cAAayujZ8AAayujc8AAayqYlsAAazWuzsAAayqYkcAAazeuz8AAazfAAEv3wABrNyPAAGsqmJTAAGs7mSrAAGsqmJfAAGs9AMAAauXAAEwGwABrP5iTwABrQIJFwABrQKNOwABrQKNnwABrQKNzwABrP5iUwABrRYC9wABrP5iRwABrRyPAAGs/mJfAAGtJAMAAauXAAEwJwABrS5iTwABrTIC9wABrTLNYwABrTMAAS9fAAGtLmJTAAGtQwACRE8AAa1HAAElawABrS5iRwABrUyPAAGtLmJfAAGtVAMAAauXAAEwKwABrV5iTwABrWIPuwABrWMAAkRPAAGtakibAAGtXmJHAAGtcwABL8MAAa1eYlMAAa17AAEAMwABrV5iXwABrYAAAwACRFMAAa2KYk8AAa2PAAJEUwABrZMAATBrAAGtkwABMHMAAa2KYkcAAa2fAAEwdwABrYrf/wABraZiTwABraoR8wABraoC9wABraZiUwABrbYJMwABrbYddwABrbYdawABrbYdvwABrbYdwwABraZiRwABrc4dnwABrc4dqwABrc4duwABrc4dkwABrc4dywABrc4d0wABrc4eDwABraZiXwABrewDAAGtiwABMGcAAa32Yk8AAa36HWcAAa32YlMAAa4CHV8AAa32Yl8AAa4IAAMAAkRXAAGuEmJPAAGuFwABMOsAAa4TAAEwjwABrh5iTwABriIC9wABriKUYwABrh5iRwABriyPAAGuHmJfAAGuNAMAAa4TAAEwmwABrj5iTwABrkIRDwABrkIC9wABrkIQawABrj5iUwABrlLRVwABrj5iRwABrliPAAGuPmJfAAGuYAMAAa4TAAEwowABrmpiTwABrm4RDwABrm4C9wABrmpiRwABrniPAAGuamJfAAGugAMAAa4TAAEwqwABropiTwABro4RDwABro4T5wABro8AAkRXAAGumKMAAa6bAAEwrwABropiUwABrqYC9wABrqacbwABrqas+wABrqYQdwABrqYQawABrqYUvwABrqYUtwABrqbJ8wABrqYd2wABrqYd5wABrqYT8wABrqYQZwABrqYd6wABrqcAAkRXAAGu3wABJWsAAa6KYkcAAa7kjwABropiXwABruwDAAGuEwABMLMAAa72Yk8AAa760W8AAa76EH8AAa76FTsAAa72Yl8AAa8IAwABrhMAATC3AAGvEmJPAAGvFhB3AAGvEmJTAAGvHh3nAAGvHhPzAAGvHhBnAAGvHh3rAAGvHsq3AAGvHwACRFcAAa83AAElawABrxJiXwABrzwDAAGuEwABMLsAAa9GYlMAAa9K0AsAAa9KzCMAAa9GYl8AAa9UAwABrhMAATC/AAGvXmJPAAGvYsq3AAGvXmJTAAGvatALAAGvaswjAAGvXmJfAAGvdAMAAa4TAAEwwwABr35iTwABr4IQawABr35iUwABr4rJ8wABr4sAAkRXAAGvkwABJWsAAa9+Yl8AAa+YAwABrhMAATDHAAGvomJPAAGvphBrAAGvomJTAAGvrhS3AAGvrwACRFcAAa+3AAElawABr6JiXwABr7wDAAGuEwABMMsAAa/GYk8AAa/KEGsAAa/GYlMAAa/SrPsAAa/SFL8AAa/TAAJEVwABr98AASVrAAGvxmJfAAGv5AMAAa4TAAEwzwABr+5iTwABr/Ks+wABr/IQdwABr+5iUwABr/4d2wABr/8AAkRXAAGwBwABJWsAAa/uYl8AAbAMAwABrhMAATDTAAGwFmJPAAGwGtFjAAGwGgL3AAGwGJ8AAbAWYkcAAbAojwABsBZiXwABsDADAAGuEsuHAAGwOmJPAAGwPgL3AAGwPs1jAAGwPwABMNsAAbA+D7sAAbA+FNcAAbA6YkcAAbBUjwABsDpiXwABsFwDAAGuEwABMOMAAbBmYk8AAbBq0WMAAbBqAvcAAbBonwABsGoVpwABsGoaSwABsGZiRwABsICPAAGwZmJfAAGwiAADAAJEWwABsJJiRwABsJcAATF/AAGwlwABMYMAAbCTAAEw8wABsKJiTwABsKYC9wABsKbP3wABsKZiAwABsKYRSwABsKJiUwABsLoJnwABsKJiRwABsMIRNwABsKJiXwABsMgDAAGwkwABMPcAAbDSYk8AAbDWCZ8AAbDWz98AAbDWYgMAAbDWEUsAAbDWAvcAAbDWzRcAAbDSYkcAAbDwjwABsNJiXwABsPgDAAGw+lUnAAGwkwABMPsAAbEGYk8AAbEKtmMAAbEGYl8AAbEQAwABsJMAATD/AAGxGmJPAAGxHr+rAAGxHhtPAAGxHs/vAAGxHhIDAAGxHhIHAAGxHhIPAAGxHmSzAAGxHs/3AAGxHsHzAAGxHtD/AAGxHgM/AAGxHgePAAGxHwABMQMAAbEaYkcAAbFWETcAAbEaYl8AAbFcAwABsJMAATELAAGxZmJPAAGxatEDAAGxamIDAAGxatEHAAGxatELAAGxatEPAAGxatETAAGxatEXAAGxatEbAAGxatEjAAGxatEnAAGxatErAAGxatEvAAGxatEzAAGxZmJHAAGxohE3AAGxZmJfAAGxqAMAAbCSIjMAAbGyYk8AAbG2ArMAAbG2z6MAAbG2z6sAAbG2EgcAAbG2EgMAAbGyYlMAAbHOBVcAAbGyYkcAAbHWETcAAbGyYl8AAbHcAwABsd5VJwABsJMAATETAAGx6mJPAAGx7guPAAGx7mW/AAGx6mJHAAGx+hE3AAGx6mJfAAGyAAMAAbICVScAAbCTAAExHwABsg5iTwABshIQawABshLP7wABshISDwABsg5iRwABsiIRNwABsg5iXwABsigDAAGyKlUnAAGwkwABMScAAbI2Yk8AAbI5qwABsjoKMwABsjoGwwABsjZiXwABskgDAAGwkwABMSsAAbJSYk8AAbJWCk8AAbJSYkcAAbJeETcAAbJSYl8AAbJkAwABsmZVJwABsJMAATEzAAGycmJPAAGydrZjAAGycmJfAAGyfAMAAbJ+VScAAbCSujsAAbKKYk8AAbKOCkMAAbKOhL8AAbKOz/cAAbKOCk8AAbKOEHcAAbKOFAcAAbKKYkcAAbKqETcAAbKKYl8AAbKwAwABsrJVJwABsJMAATE7AAGyvmJPAAGywgpDAAGyvmJHAAGyyhE3AAGyvmJfAAGy0AMAAbLSVScAAbCTAAExQwABst5iTwABsuK2YwABst5iXwABsugDAAGy6lUnAAGwkwABMUcAAbL2Yk8AAbL7AAExSwABsvsAATFPAAGy+wABMVMAAbL7AAExVwABsvrQIwABsvqHtwABsvrP9wABsvoKQwABsvoU0wABsvqyGwABsvpqAwABsvrQFwABsvrQHwABsvoKTwABsvZiRwABszYRNwABsvZiXwABszwDAAGzPlUnAAGwkwABMV8AAbNKYk8AAbNOCasAAbNKYkcAAbNWETcAAbNKYl8AAbNcAwABs15VJwABsJLO7wABs2piTwABs24JFwABs26vFwABs2piXwABs3gDAAGwkwABMWsAAbOCYk8AAbOGAvcAAbOGCkMAAbOGrgsAAbOCYl8AAbOUAwABsJMAATFvAAGznmJPAAGzohBnAAGzohB3AAGzohB7AAGzohB/AAGznmJfAAGztAMAAbCTAAExcwABs75iTwABs8CfAAGzwwACRFsAAbPIowABs8CnAAGzwhEPAAGzws+vAAGzwgmrAAGzwhI7AAGzwhf/AAGzws0XAAGzwhnvAAGzwtArAAGzvmJHAAGz9I8AAbO+Yl8AAbP8AwABsJMAATF3AAG0BmJHAAG0CwABMQcAAbQKwb8AAbQKEmsAAbQKE7sAAbQKFDsAAbQKGAcAAbQKz58AAbQKEvcAAbQLAAExZwABtAsAATEbAAG0BmJfAAG0NAMAAbCTAAExewABtD5iRwABtEMAATEHAAG0QsG/AAG0QhJrAAG0QhO7AAG0QhQ7AAG0QhgHAAG0Qs+fAAG0QhL3AAG0QwABMRsAAbRDAAExZwABtD5iXwABtGwAAwACRF8AAbR2YkcAAbR7AAJEXwABtH8AATJ3AAG0dwABMYcAAbSGYk8AAbSK3mMAAbSGYkcAAbSSIuMAAbSTAAExowABtJMAATGLAAG0kwABBJMAAbSTAAExlwABtJMAATGbAAG0kwABA0cAAbSTAAExpwABtJMAAkRfAAG0twABMb8AAbSTAAExjwABtJMAATHTAAG0kwABMdcAAbSTAAExkwABtJMAATGzAAG0kwABMbcAAbSGYl8AAbTUAwABtHcAATIDAAG03mJPAAG04tDDAAG04wABMgcAAbTjAAEyCwABtN5iRwABtPMAATIPAAG08iLjAAG08wACRF8AAbT/AAEyGwABtP8AATIfAAG0/wABMj8AAbT/AAEyQwABtP8AATJHAAG0/wABMlsAAbT/AAEyYwABtP8AATJrAAG0/wABMl8AAbTzAAExBwABtPLBvwABtPISawABtPITuwABtPIUOwABtPIYBwABtPLPnwABtPMAATFnAAG08hL3AAG08wABMRsAAbTeYl8AAbVMAwABtHcAATJvAAG1VmJPAAG1WiLfAAG1WgffAAG1VmJfAAG1ZAMAAbR3AAEycwABtW5iTwABtXIJnwABtXLNVwABtW5iUwABtX8AATHbAAG1bmJfAAG1hAADAAJEYwABtY5iTwABtZMAAkRjAAG1lwABMvcAAbWXAAEy+wABtZcAATL/AAG1lwABMwMAAbWOYkcAAbWqVRMAAbWqHCsAAbWOXJcAAbW2Yk8AAbW6EO8AAbW2YkcAAbXDAAEyfwABtcMAATKLAAG1wwABMo8AAbXDAAExBwABtcLBvwABtcMAAkRjAAG12wABMlsAAbXbAAEynwABtdsAATKjAAG12wABMmMAAbXbAAEyawABtdsAATKXAAG12wABMpsAAbXCEmsAAbXCE7sAAbXCFDsAAbXCGAcAAbXCz58AAbXDAAExZwABtcIS9wABtcMAATEbAAG1tmJfAAG2GAMAAbWPAAEypwABtiJiTwABtiYNEwABtiJiRwABti8AATKrAAG2LwABMq8AAbYvAAEyswABti4OdwABti8AATLXAAG2LwACRGMAAbZHAAEy2wABtkcAATLjAAG2RwABMucAAbZHAAEy7wABtkcAATLzAAG2RwABMs8AAbZHAAEy3wABti5iswABti5i/wABti5jAwABti6+JwABti8AATK3AAG2LwABMr8AAbYuYvsAAbYvAAEyuwABtiJiXwABtoQAAwACRGcAAbaO3rMAAbaSYk8AAbaXAAJEZwABtprdUwABtpsAATMLAAG2mwABMw8AAbaSYkcAAbaqvEcAAbaq348AAbarAAEzQwABtqsAATNHAAG2kmJfAAG2vAMAAbaPAAEzSwABtsZiTwABtsoTXwABtsrP0wABtsZiXwABttQDAAG2jwABM08AAbbeYk8AAbbiWNsAAbbjAAEzPwABtt5iUwABtu8AATNTAAG23mJfAAG29AMAAbaPAAEzVwABtv5iTwABtwJY2wABtwIURwABtv5iRwABtwyPAAG2/mJfAAG3FAMAAbaPAAEzYwABtx5iTwABtyCfAAG3IwACRGcAAbcoowABtyCnAAG3IukjAAG3IhY3AAG3IhVfAAG3IwABM3MAAbceYkcAAbdEjwABtx5iXwABt0wDAAG2jhT7AAG3VmJPAAG3WgmfAAG3WJ8AAbdaAvcAAbdaAlsAAbdWYlMAAbdu0asAAbdWYkcAAbd0jwABt1ZiXwABt37pIwABt34WNwABt34VXwABt38AATNzAAG2ju+bAAG3kmJPAAG3lg+fAAG3lwACRGcAAbefAAEzfwABt5JiWwABt6a7OwABt6ZYowABt5JiRwABt7K7PwABt7LP2wABt5JiXwABt78AAkRnAAG3wgLXAAG2jwABNAMAAbfKYk8AAbfOD58AAbfOWNsAAbfPAAEztwABt88AATO/AAG3zwABIIsAAbfPAAEz3wABt88AATPXAAG3zwABM/cAAbfKYlsAAbfzAAE0CwABt8piRwABt/q7PwABt/iPAAG3ymJTAAG4BwABM/MAAbgHAAEzswABuAcAATM7AAG3ymJfAAG4FAADAAJEawABuB8AATQrAAG4ImJPAAG4JgZPAAG4ImJHAAG4LVsAAbguCiMAAbgiYl8AAbg4AAMAAkRvAAG4QmJHAAG4RwABNKsAAbhHAAE0uwABuEMAATQzAAG4UmJPAAG4VwACRG8AAbhaXFsAAbhWAvcAAbhXAAE0NwABuFcAATQ7AAG4VwABND8AAbhW36MAAbhW36cAAbhW36sAAbhW368AAbhW37MAAbhW37cAAbhW37sAAbhXAAE0QwABuFcAATRHAAG4VwABNEsAAbhXAAE0TwABuFcAATRTAAG4VwABKu8AAbhXAAE0VwABuFcAATRbAAG4VKcAAbhXAAE0XwABuFcAATRjAAG4VwABNGcAAbhSYlMAAbi8nwABuFJiXwABuMQDAAG4QwABNGsAAbjOYk8AAbjTAAJEbwABuNZZCwABuM5iWwABuN67OwABuM5iRwABuOa7PwABuOcAATRvAAG45wABNHMAAbjnAAE0dwABuOcAATR7AAG45wABM4cAAbjnAAE0fwABuOcAATSDAAG45twjAAG45twrAAG45t0PAAG45t0TAAG45syLAAG45syDAAG45wABNIcAAbjmzHsAAbhDAAE0iwABuSpiTwABuS4PnwABuS8AAkRvAAG5NwABNJMAAbk3AAE0lwABuTcAATSbAAG5NwABNJ8AAbku3ysAAbkqYlsAAblOuzsAAbkqYkcAAblWuz8AAblXAAJEbwABuV8AATSjAAG5VwABNG8AAblXAAE0cwABuVcAATR3AAG5VwABNHsAAblXAAEzhwABuVcAATR/AAG5VwABNIMAAblW3CMAAblW3CsAAblW3Q8AAblW3RMAAblWzIsAAblWzIMAAblXAAE0hwABuVbMewABuSpiXwABuaADAAG4QwABNKcAAbmqYk8AAbmu3ysAAbmqYkcAAbm233sAAbm2CiMAAbmqYl8AAbnAAAMAAkRzAAG5ymJLAAG5zwABNPsAAbnPAAE0/wABucsAATUDAAG52mJPAAG53wACRHMAAbnjAAE1BwABudpiUwABuesAAkRzAAG57wABNQ8AAbnvAAE1CwABuertSwABudpiRwABuf8AATUTAAG52mJfAAG6Bv6vAAG6BAMAAbnLAAE1FwABuhJiTwABuhcAATUbAAG6FpBDAAG6EmJbAAG6IAMAAboSYlMAAborAAE1QwABuisAATOfAAG6Ku2nAAG6KwABNTcAAboq7bcAAborAAEzuwABuisAATU7AAG6Ku3DAAG6KwABNUcAAborAAE1PwABuirt0wABuisAATOrAAG6Ku67AAG6Kuy/AAG6KuzHAAG6KuzPAAG6KwACRHMAAbpvAAE1CwABuioPBwABuhJiRwABunqk9wABunrtEwABunp5rwABunoKKwABunrstwABunkjAAG6enqvAAG6euUDAAG6EmJfAAG6nlUnAAG6nv6vAAG5ywABNU8AAbqqYk8AAbqvAAE1NwABuq8AATU7AAG6rwABNT8AAbqu7bcAAbqu7cMAAbqu7dMAAbqqYkcAAbrKea8AAbrKCisAAbrK7LcAAbrKeq8AAbrIjwABuqpiXwABuuL+rwABuuADAAG5ywABNX8AAbruYk8AAbrzAAE1QwABuvMAATU3AAG68wABNTsAAbrzAAE1PwABuvLttwABuvLt0wABuvLtwwABuvMAAkRzAAG7EwABNYMAAbruYlMAAbsbAAEznwABuxrtpwABuxsAATO7AAG67mJHAAG7KqT3AAG7Ku0TAAG7KnmvAAG7KgorAAG7Kuy3AAG7KnqvAAG7KI8AAbruYl8AAbtK/q8AAbtIAwABucsAATWPAAG7VmJPAAG7WwABNTcAAbtbAAE1PwABu1rttwABu1rt0wABu1sAATWTAAG7VmJTAAG7cwABNUcAAbtzAAJEcwABu3sAATULAAG7cwABM6sAAbty7L8AAbtWYkcAAbuKea8AAbuK7LcAAbuKeq8AAbuIjwABu1ZiXwABu57+rwABu5wDAAG5ywABNasAAbuqYk8AAbusnwABu68AAkRzAAG7tKMAAbuspwABu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AJEfwABwBMAATb7AAHAEwABNv8AAcATAAE3BwABwBITawABwBMAATcLAAHAEwABNw8AAcATAAE3EwABwBMAATcXAAHAEwABNxsAAcASb6sAAcAPAAE3AwABwA4dlwABwApiRwABwEcAATcfAAHARwABNyMAAcBGXz8AAcBGG3sAAcBGEmsAAcBGE7sAAcBHAAE3NwABwEYVswABwEcAAkR/AAHAawABNzsAAcBrAAE3fwABwGsAATdHAAHAawABN4MAAcBrAAE3kwABwGsAATe/AAHAawABN3MAAcBrAAE4CwABwGsAATgrAAHAawABOCcAAcBHAAE3PwABwEcAATdDAAHARhYLAAHARwABN1sAAcBGFhMAAcBHAAE3ZwABwEYWGwABwEcAATdrAAHARhYrAAHARwABN3cAAcBGFiMAAcBHAAE3ewABwEcAATfDAAHARhaDAAHARwABN7sAAcBGFdcAAcBHAAE31wABwEYV3wABwEcAATfbAAHARhZTAAHARwABN98AAcBGFlsAAcBHAAE34wABwEYWkwABwEakzwABwEYWmwABwEcAATfnAAHARhZDAAHARwABN+sAAcBGFksAAcBHAAE37wABwEYWiwABwEYWywABwEYWtwABwEYW3wABwEcAATgfAAHARhdTAAHARhgPAAHARhgXAAHARwABOC8AAcBGFqsAAcBGGEsAAcBGGDsAAcBHAAE3YwABwEYXYwABwEcAATg7AAHARhbvAAHARwABOD8AAcBGF3cAAcBHAAE4QwABwEYXgwABwEcAAThHAAHARheLAAHARwABOEsAAcBGF28AAcBHAAE4TwABwEYXnwABwEcAAThTAAHARheTAAHARwABOFcAAcBGF8cAAcBHAAE4WwABwEYXzwABwEcAAThfAAHARhfXAAHARhffAAHARwABOGMAAcBGF/cAAcBHAAE4ewABwEYXvwABwEYYzwABwEYY1wABwEYYdwABwEYYfwABwEYZJwABwEYVMwABwEcAATh/AAHARhUPAAHARwABOIMAAcBGFR8AAcBHAAE4hwABwEYVFwABwEYVJwABwEYWcwABwEYYXwABwEYYnwABwEcAATiPAAHARhivAAHARhiPAAHARhiHAAHARwABOJ8AAcBGGLsAAcBGGOcAAcBGGN8AAcBGGPMAAcBHAAE4rwABwEYZAwABwEYZDwABwEcAATizAAHARhenAAHARwABOLcAAcBGGCMAAcBHAAE4uwABwEYYbwABwEcAATjDAAHARhlPAAHARwABOMcAAcBGwTcAAcBHAAE4ywABwEcAATh3AAHARwABOM8AAcBGFMsAAcBHAAE40wABwEYUUwABwEcAATjXAAHARhQ7AAHARwABN7cAAcBGGUcAAcBHAAE42wABwEYYAwABwApiUwABwnbf6wABwnbf7wABwnbfnwABwnYS8wABwnbXCwABwncAATcnAAHCdwABNysAAcJ2cQcAAcAKYlcAAcKaEvMAAcKa1wsAAcKbAAE3JwABwpsAATcrAAHACmJfAAHCrAMAAb/LAAE43wABwrZiTwABwroWNwABwroVXwABwrZiXwABwsQDAAG/ywABOOMAAcLOYk8AAcLSrgsAAcLTAAE45wABwtMAATjrAAHC0wACRH8AAcLiGecAAcLOYkcAAcLrAAE3zwABwukjAAHC6wACRH8AAcL3AAE47wABwuiPAAHCzmJTAAHDAg8HAAHCzmJfAAHDCAMAAb/LAAE5BwABwxJiTwABwxauCwABwxcAATkLAAHDFwABOQ8AAcMSYkcAAcMnAAE3ywABwyVjAAHDJwABN88AAcMnAAJEfwABwzcAATjvAAHDJI8AAcMSYl8AAcNAAwABv8sAATlXAAHDSmJPAAHDTwACRH8AAcNTAAE5WwABw0piRwABw1sAATfLAAHDWWMAAcNaEWcAAcNaWOsAAcNbAAE3zwABw1rz7wABw1iPAAHDSmJfAAHDeAADAAJEgwABw4Jr6wABw4ZiTwABw4sAAkSDAAHDjlkLAAHDhmJbAAHDlrs7AAHDhmJHAAHDnrs/AAHDnqPXAAHDnu4fAAHDnu4jAAHDntkzAAHDnwABOXsAAcOebDMAAcOea38AAcOfAAE5fwABw57XzwABw57ZNwABw58AATmDAAHDnwABOYcAAcOfAAE5iwABw57X0wABw57ZOwABw58AATmPAAHDnwABOZMAAcOfAAE5lwABw57WrwABw57XVwABw57XWwABw57XpwABw58AATmrAAHDnwABOa8AAcOezU8AAcODAAE5swABxApiTwABxA4PnwABxA8AAkSDAAHEFs7/AAHEFwABObsAAcQXAAE5vwABxApiWwABxCa7OwABxApiRwABxC67PwABxC6j1wABxC7uHwABxC7uIwABxC7ZMwABxC8AATl7AAHELmt/AAHELmwzAAHELwABOX8AAcQu188AAcQu2TcAAcQvAAE5gwABxC8AATmHAAHELwABOYsAAcQu19MAAcQu2TsAAcQvAAE5jwABxC8AATmTAAHELwABOZcAAcQu1q8AAcQu11cAAcQu11sAAcQu16cAAcQvAAE5qwABxC8AATmvAAHELs1PAAHECmJfAAHEmAMAAcOCjvcAAcSiYk8AAcSnAAJEgwABxKsAATm7AAHEqwABOb8AAcSqzv8AAcSq7ncAAcSrAAE6OwABxKsAATo/AAHEptfzAAHEomJHAAHEygojAAHEypOfAAHEywACRIMAAcTXAAE6TwABxNcAATpHAAHE1wABOnMAAcTXAAE6ewABxMrunwABxMsAATprAAHEyu7/AAHEyu8DAAHEyu8HAAHEomJfAAHE/AMAAcODAAE6nwABxQZiTwABxQsAAkSDAAHFDwABOqMAAcUOpCMAAcUGYkcAAcUbAAE6mwABxRsAAkSDAAHFIwABOqcAAcUGYl8AAcUoAwABw4MAATrLAAHFMmJPAAHFNwACRIMAAcU6pCMAAcUyYkcAAcVC7wcAAcVDAAJEgwABxUsAATrPAAHFMmJfAAHFUAMAAcODAAE61wABxVpiTwABxV8AAkSDAAHFYwABOtsAAcVibtcAAcVaYkcAAcVvAAE6qwABxVpiXwABxXQDAAHDgu3rAAHFfmJHAAHFgwABOksAAcWDAAE6ZwABxYMAATpXAAHFgwABOncAAcWCytMAAcWC7t8AAcV+Yl8AAcWcAwABw4MAATrfAAHFpmJPAAHFqJ8AAcWrAAJEgwABxbCjAAHFqKcAAcWq1zcAAcWq1zsAAcWq1z8AAcWmYkcAAcXIjwABxaZiXwABxdADAAHDgwABOuMAAcXaYk8AAcXcnwABxd8AAkSDAAHF5KMAAcXcpwABxd7XMwABxd8AATrnAAHF3wABOusAAcXfAAE67wABxd8AATrzAAHF3wABOvcAAcXfAAE6+wABxd51IwABxdpiRwABxhCPAAHF2mJfAAHGGAMAAcODAAE6/wABxiJiTwABxiYJnwABxiYSBwABxibXMwABxicAATrnAAHGJwABOusAAcYnAAE67wABxicAATrzAAHGJwABOvcAAcYnAAE6+wABxiJiRwABxkyPAAHGImJfAAHGVAMAAcZWVSQDAAJEhwABxmLN5wABxmZiTwABxmrMowABxmZiRwABxnFbAAHGcgKXAAHGchFnAAHGZmJTAAHGggVXAAHGgYcAAcZmYl8AAcaMAwABxmLVawABxpZiTwABxpqo+wABxpqTMwABxpsAAkSHAAHGppTLAAHGpwABOxcAAcaWYlMAAcayAvcAAcayweMAAcaWYkcAAca+2bMAAca/AAE7HwABxr8AATsrAAHGvwABOycAAcaWYl8AAcbQAAMAAkSLAAHG2mJHAAHG3wABO2MAAcbbAAE7XwABxuZiRwABxurxLwABxusAARYHAAHG6vDTAAHG6wABFfsAAcbrAAEV/wABxusAARYDAAHG6vC7AAHG6s+fAAHG6harAAHG6vDHAAHG6uEfAAHG6hy3AAHG6vELAAHG6vEXAAHG6vDrAAHG6wABFgsAAcbq8N8AAcbqe5MAAcbmYl8AAcc0AAMAAkSPAAHHPmJHAAHHQwABPDsAAcdCq1sAAcdDAAE8PwABx0MAATxHAAHHPwABO2sAAcdWYlMAAcday+8AAcdaFZ8AAcdak5cAAcdWYkcAAcdrAAEvwwABx2sAATtvAAHHawABL7MAAcdqyvsAAcdqyJMAAcdrAAE7cwABx2sAATt3AAHHanAvAAHHawABO3sAAcdqnyMAAcdrAAEzHwABx2pwSwABx2sAATt/AAHHawABO4MAAcdrAAE2wwABx2pkUwABx2sAATuHAAHHawABO4sAAcdrAAE7jwABx2sAATMjAAHHawABO5MAAcdrAAE7lwABx2sAATubAAHHawABO58AAcdq2g8AAcdq3msAAcdrAAE7owABx2pwJwABx2sAATunAAHHawABO6sAAcdrAAE7rwABx2sAATuzAAHHawABO7cAAcdWYl8AAcfwAwABxz8AATu7AAHH+mJHAAHH/t57AAHH/t5/AAHH/t6DAAHH/t6HAAHH/t6LAAHH/tnHAAHH/tmbAAHH/tmjAAHH/tmfAAHH/t6TAAHH/t6XAAHH/t6bAAHH/t6fAAHH/tm7AAHH/t6jAAHH+mJfAAHIPAMAAcc/AAE7vwAByEZiUwAByEqmfwAByEZiRwAByFMAAS+nAAHIUwABL68AAchTAAEvtwAByFMAAS+/AAHIUwABL3sAAchTAAEvgwAByFMAAS+TAAHIUwABL5cAAchTAAEvhwAByFMAAS+LAAHIUwABL48AAchTAAEvmwAByFMAAS+fAAHIUwABL6MAAchSuz8AAchGYl8AAciQAwABxz6BhwAByJpiTwAByJyfAAHInwACRI8AAcikowAByJynAAHInwABO98AAcieY1cAAcifAAE74wAByJ8AASqDAAHInwABO+cAAciesbsAAcifAAE76wAByJpiRwAByMyPAAHImmJfAAHI1AMAAcc/AAE77wAByN5iUwAByOIJnwAByOIPuwAByOIRbwAByN5iWwAByPK7OwAByN5iRwAByPq7PwABxz8AATv3AAHJAmJPAAHJBJ8AAckHAAJEjwAByQyjAAHJBKcAAckHAAE73wAByQbQKwAByQaivwAByQJiRwABySSPAAHJAmJfAAHJLAMAAcc/AAE8BwAByTZiTwAByToPnwAByToPuwAByTZiWwAByUa7OwAByTZiRwAByU67PwAByUyPAAHJNmJTAAHJWhFvAAHJWgmfAAHJNmJfAAHJZAMAAcc/AAE8GwAByW5iTwAByXIPnwAByXIPuwAByXIJnwAByW5iWwAByYK7OwAByW5iRwAByYq7PwAByYiPAAHJbmJTAAHJlhFvAAHJbmJfAAHJnAMAAcc/AAE8JwAByaZiUwAByaoJnwAByaoPuwAByaoRbwAByaZiWwABybq7OwAByaZiRwABycK7PwABxz8AATwvAAHJymJPAAHJzg+fAAHJzg+7AAHJymJbAAHJ2rs7AAHJymJHAAHJ4rs/AAHJ4I8AAcnKYlMAAcnuEW8AAcnuCZ8AAcnKYl8AAcn4AAMAAkSTAAHKAmJHAAHKBwACRJMAAcoLAAE+rwABygMAATxPAAHKEmJPAAHKFtoHAAHKEmJTAAHKHesAAcoekzMAAcoekusAAcoeweMAAcoey+8AAcoe2d8AAcoeFZ8AAcofAAE8UwAByh6T5wAByh7Z1wAByhJiRwAByksAATsjAAHKSwABJ3cAAcpLAAE8VwAByksAATxbAAHKSwABPF8AAcpLAAE8YwAByksAATxrAAHKSwABPG8AAcpLAAE8cwAByksAATx3AAHKSwABOysAAcpLAAE7NwAByksAATx7AAHKSwABPH8AAcpLAAE8hwAByksAATyLAAHKSwABPI8AAcpLAAE8kwAByksAATyXAAHKSwABPJ8AAcpLAAE8pwAByksAATyvAAHKSwABPLcAAcpLAAE8uwABykraRwAByksAATy/AAHKSwABPMMAAcpLAAE8xwABykraPwABykraQwABykoKIwABykoJCwAByksAATzLAAHKSwABPM8AAcpK37sAAcoSYl8AAcrYAwABygMAATzTAAHK4mJPAAHK5wABPNcAAcrm6fcAAcrm2dcAAcrnAAE82wAByucAATzfAAHK5wABPOMAAcrnAAE85wAByuXrAAHK5gs7AAHK5pLrAAHK5wACRJMAAcsS4AcAAcsTAAEQLwAByuaTMwAByuaT5wAByuYVnwAByucAATxTAAHK5wABPOsAAcrm0x8AAcriYlMAAcs3AAJEkwAByzq8NwAByuJiRwABy0MAATxrAAHLQwABOzcAActDAAE87wABy0MAATzHAAHLQwABPLcAActDAAE8ewABy0MAATx/AAHLQto/AAHLQtpDAAHLQwABPFcAActDAAE8WwABy0MAATxfAAHLQwABOyMAActDAAE9TwABy0MAAT3vAAHLQwABPZMAActDAAEndwABy0MAAT33AAHLQwABPgsAActC8cMAActDAAE+DwABy0MAAT3fAAHLQwABPVsAActDAAE9VwABy0MAATyvAAHLQwABPHcAActDAAE8bwABy0MAATxzAAHLQwABPMMAActDAAE8vwABy0MAATy7AAHLQwABPIsAActDAAE8hwABy0MAATxjAAHLQwABPJ8AActDAAE8pwABy0MAATyPAAHLQwABPJMAActDAAE8lwABy0IKIwABy0IJCwABy0MAATsrAAHLQtpHAAHLQwABPMsAActDAAE8zwABy0LfuwAByuJiXwABy/wDAAHKAwABPlsAAcwGYk8AAcwLAAJEkwABzA7VlwABzAZiUwABzBcAAkSTAAHMGrw3AAHMBmJHAAHMIwABPl8AAcwjAAE+YwABzCMAAT5nAAHMIwABPmsAAcwjAAE+bwABzCMAAT5zAAHMIstjAAHMIwABPncAAcwjAAE+gwABzAZiXwABzEgDAAHKAwABPocAAcxSYk8AAcxWD58AAcxXAAJEkwABzF8AAT6PAAHMXwABPpMAAcxfAAE+lwABzF8AAT6bAAHMUmJbAAHMcrs7AAHMUmJHAAHMers/AAHMetmrAAHMetmTAAHMewABPQ8AAcx7AAE9EwABzHsAAT0LAAHMetmjAAHMetmfAAHMetmbAAHMewABPQMAAcx62ZcAAcxSYl8AAcyoAwABzKpVJAMAAkSXAAHMtmJHAAHMuwABQTcAAcy3AAE+twABzMJiTwABzMYPnwABzMbamwABzMbanwABzMbaqwABzMJiWwABzNq7OwABzMJiRwABzOLalwABzOEjAAHM4wACRJcAAczvAAE+vwABzOCPAAHMwmJTAAHM+tqnAAHM+lqfAAHM+g8HAAHM+tGrAAHMwmJfAAHNDAMAAcy3AAE+ywABzRZiRwABzRsAARkrAAHNGtrPAAHNGtrLAAHNFmJfAAHNKAMAAcy3AAE+zwABzTJiUwABzTbRqwABzTbapwABzTZanwABzTJiXwABzUQDAAHMtwABPtMAAc1OYk8AAc1S2psAAc1S2qMAAc1TAAEYzwABzU5iRwABzWMAAT7XAAHNYI8AAc1OYl8AAc1sAwABzLcAAT7zAAHNdmJHAAHNeS8AAc12Yl8AAc2AAwABzLcAAT73AAHNimJPAAHNjwACRJcAAc2TAAE++wABzYpiRwABzZsAAT7/AAHNmwABPwMAAc2ZLwABzYpiXwABzagDAAHMtwABPwsAAc2yYk8AAc20nwABzbcAAkSXAAHNvKMAAc20pwABzbcAAT8XAAHNtwABPxsAAc2yYkcAAc3QjwABzbJiXwABzdgDAAHMtwABPx8AAc3iYk8AAc3knwABzecAAkSXAAHN7KMAAc3kpwABzecAAT8XAAHN5wABPyMAAc3nAAE/JwABzeJiRwABzgSPAAHN4mJfAAHODAMAAcy3AAE/KwABzhZiTwABzhrNVwABzhsAAT8zAAHOGuCHAAHOGwABPzcAAc4bAAE/OwABzhsAAT8/AAHOFmJHAAHONwABGS8AAc43AAEY0wABzhZiXwABzkADAAHMtwABP08AAc5KYk8AAc5O4IcAAc5KYkcAAc5Wah8AAc5XAAEY5wABzlYYOwABzlbBawABzlbBWwABzlbBXwABzkpiXwABznADAAHMtwABP1cAAc56YlMAAc5+4IcAAc56YkcAAc6HAAE/WwABznpiXwABzowDAAHMtwABP18AAc6WYlMAAc6a4IcAAc6WYkcAAc6jAAE/WwABzpZiXwABzqgDAAHMtwABP2MAAc6yYk8AAc63AAE/RwABzrbghwABzrcAAkSXAAHOwwABP2cAAc6yYkcAAc7LAAE/awABzsocYwABzrJiXwABztQDAAHMtwABP4sAAc7eYlMAAc7i4IcAAc7eYkcAAc7rAAE/WwABzt5iXwABzvADAAHMtwABP48AAc76Yk8AAc7/AAE/RwABzv7ghwABzvpiRwABzwsAAT9rAAHO+mJfAAHPEAMAAcy3AAE/4wABzxpiTwABzx4PuwABzx8AAT/nAAHPHwABP5sAAc8aYkcAAc8vAAE/6wABzxpiXwABzzQDAAHMtwABP/sAAc8+Yk8AAc9DAAE//wABz0MAAUADAAHPQwABQAcAAc8+YlMAAc9SAlsAAc8+YkcAAc9YjwABzz5iXwABz2ADAAHMtwABQBcAAc9qYk8AAc9snwABz28AAkSXAAHPdKMAAc9spwABz28AAUAvAAHPbwABQDMAAc9udFsAAc9udKsAAc9udFcAAc9qYkcAAc+UjwABz2piXwABz5wDAAHMtwABQDcAAc+mYk8AAc+onwABz6sAAkSXAAHPsKMAAc+opwABz6sAAUA7AAHPqwABQD8AAc+q6zsAAc+qdPMAAc+rAAFAQwABz6p1HwABz6p0UwABz6p0ZwABz6p1QwABz6sAAUBHAAHPqwABQEsAAc+rAAFATwABz6sAAUBTAAHPqwABQFcAAc+rAAFAWwABz6sAAUBfAAHPqwABQGMAAc+rAAFAZwABz6ZiRwAB0ASPAAHPpmJfAAHQDAMAAcy3AAFAawAB0BZiRwAB0BsAAUBvAAHQGwABQHMAAdAbAAFAdwAB0BsAAUB7AAHQGwABP2sAAdAWYl8AAdAwAwABzLcAAUB/AAHQOmJPAAHQPwABQIMAAdA+4IcAAdA/AAFAhwAB0D79MwAB0D8AAT//AAHQPwABQAcAAdA/AAFAiwAB0D8AAUCPAAHQOmJHAAHQYwABQJMAAdBjAAFAlwAB0GMAAUCbAAHQYwABQJ8AAdBjAAFAowAB0GK74wAB0GMAARjnAAHQYmofAAHQYhy3AAHQYwACRJcAAdCLAAFAtwAB0GLBKwAB0GLBLwAB0GIYSwAB0GMAAUCnAAHQYwABQMcAAdBiGDsAAdBiGF8AAdBiwU8AAdBiwVMAAdBiwTMAAdBiwT8AAdBiwRMAAdBiwQ8AAdBiwQsAAdBiwQcAAdBiGWMAAdBiwWsAAdBiGUcAAdBiwVsAAdBiwV8AAdBiwbsAAdBiwbcAAdBiwa8AAdBiwasAAdBiwUsAAdBiwTsAAdBiwZsAAdBiF78AAdBiwacAAdBiwZ8AAdBiwY8AAdBiGQMAAdBiwVcAAdBiwUcAAdBiwUMAAdBiwOcAAdBiwOMAAdBiwN8AAdBiwYsAAdBiwYcAAdBiwYMAAdBiwPcAAdBiwPMAAdBiGHcAAdBiwScAAdBjAAFAqwAB0DpiXwAB0UgDAAHMtwABQN8AAdFSYk8AAdFXAAJElwAB0VsAAUDjAAHRWwABQOcAAdFbAAFA6wAB0VsAAUDvAAHRWwABQPMAAdFbAAFA9wAB0VsAAUD7AAHRUmJHAAHRewABQP8AAdF7AAFBAwAB0XsAAUEHAAHRewABQQsAAdF7AAFBDwAB0XiPAAHRUmJfAAHRlAMAAcy3AAFBKwAB0Z5iUwAB0aLghwAB0Z5iRwAB0asAAT9bAAHRnmJfAAHRsAMAAcy3AAFBLwAB0bpiTwAB0b8AAT9DAAHRvuCHAAHRumJHAAHRywABP2sAAdHLAAFAcwAB0bpiXwAB0dQDAAHMtwABQTMAAdHeYk8AAdHjAAFAgwAB0eMAAT9DAAHR3mJHAAHR7S8AAdHeYl8AAdH0AAMAAkSbAAHR/mJPAAHSAwABQh8AAdH/AAFBQwAB0gpiTwAB0g4PnwAB0g4C9wAB0g6UYwAB0gpiWwAB0h67OwAB0gpiRwAB0ia7PwAB0iSPAAHSCmJfAAHSMAMAAdH/AAFBRwAB0jpiTwAB0jyfAAHSPwACRJsAAdJEowAB0jynAAHSPg+7AAHSPtArAAHSPqK/AAHSOmJHAAHSXI8AAdI6Yl8AAdJkAwAB0f8AAUFXAAHSbmJPAAHScwACRJ8AAdJ3AAFBWwAB0m5iXwAB0nwDAAHR/wABQV8AAdKGYk8AAdKKD58AAdKKEQ8AAdKKAvcAAdKKEGsAAdKGYlsAAdKeuzsAAdKGYkcAAdKmuz8AAdKkjwAB0oZiUwAB0rLRVwAB0oZiXwAB0rgDAAHR/wABQWMAAdLCYk8AAdLGD58AAdLGEQ8AAdLGAvcAAdLCYlsAAdLWuzsAAdLCYkcAAdLeuz8AAdLcjwAB0sJiXwAB0ugDAAHR/wABQWcAAdLyYk8AAdL0nwAB0vcAAkSbAAHS/KMAAdL0pwAB0vcAAUGbAAHS9wABQZ8AAdL3AAE74wAB0vYSOwAB0vaGnwAB0vZsGwAB0vZZBwAB0vcAATvnAAHS9wABQaMAAdL3AAE76wAB0vcAAUGnAAHS9wABQasAAdLyYkcAAdM4jwAB0vJiXwAB00ADAAHR/wABQa8AAdNKYk8AAdNOEQ8AAdNOE+cAAdNPAAJEmwAB01ijAAHTWwABMK8AAdNKYlsAAdNmuzsAAdNKYkcAAdNuuz8AAdNsjwAB00piUwAB03oC9wAB03qcbwAB03qs+wAB03oQdwAB03oQawAB03oUvwAB03oUtwAB03rJ8wAB03od2wAB03od5wAB03oT8wAB03oQZwAB03od6wAB03sAAkSbAAHTswABJWsAAdNKYl8AAdO4AwAB0f8AAUG3AAHTwmJPAAHTxtFvAAHTxhB/AAHTxhU7AAHTwmJfAAHT1AMAAdH/AAFBuwAB095iTwAB0+IQdwAB095iUwAB0+od5wAB0+oT8wAB0+oQZwAB0+od6wAB0+rKtwAB0+sAAkSbAAHUAwABJWsAAdPeYl8AAdQIAwAB0f8AAUG/AAHUEmJPAAHUFg+fAAHUEmJbAAHUHrs7AAHUEmJHAAHUJrs/AAHUEmJTAAHULtALAAHULswjAAHUEmJfAAHUOAMAAdH/AAFBxwAB1EJiTwAB1EYPnwAB1EbKtwAB1EJiWwAB1FK7OwAB1EJiRwAB1Fq7PwAB1EJiUwAB1GLQCwAB1GLMIwAB1EJiXwAB1GwDAAHR/wABQc8AAdR2Yk8AAdR6D58AAdR6Y1cAAdR2YlsAAdSGuzsAAdR2YkcAAdSOuz8AAdR2YlMAAdSXAAJEmwAB1JsAASVrAAHUdmJfAAHUoAMAAdH/AAFB2wAB1KpiTwAB1K4PnwAB1K4QawAB1KpiWwAB1Lq7OwAB1KpiRwAB1MK7PwAB1KpiUwAB1MrJ8wAB1MsAAkSbAAHU0wABJWsAAdSqYl8AAdTYAwAB0f8AARlPAAHU4mJPAAHU5g+fAAHU5gmrAAHU5mtHAAHU5g8HAAHU4mJbAAHU+rs7AAHU4mJHAAHVArs/AAHU4mJTAAHVCwACRJsAAdUPAAElawAB1OJiXwAB1RQDAAHR/wABQecAAdUeYk8AAdUiD58AAdUiEGsAAdUeYlsAAdUuuzsAAdUeYkcAAdU2uz8AAdUeYlMAAdU+FLcAAdU/AAJEmwAB1UcAASVrAAHVHmJfAAHVTAMAAdH/AAFB6wAB1VZiTwAB1VoPnwAB1VoQawAB1VZiWwAB1Wa7OwAB1VZiRwAB1W67PwAB1VZiUwAB1Xas+wAB1XYUvwAB1XcAAkSbAAHVgwABJWsAAdVWYl8AAdWIAwAB0f8AATMHAAHVkmJPAAHVlg+fAAHVlqz7AAHVlhB3AAHVkmJbAAHVprs7AAHVkmJHAAHVrrs/AAHVkmJTAAHVth3bAAHVtwACRJsAAdW/AAElawAB1ZJiXwAB1cQDAAHR/wABOw8AAdXOYk8AAdXSD58AAdXOYlsAAdXauzsAAdXOYkcAAdXiuz8AAdXOYlMAAdXrAAJEmwAB1e8AASVrAAHVzmJfAAHV9AMAAdH/AAFB9wAB1f5iTwAB1gIPnwAB1f5iWwAB1gq7OwAB1f5iRwAB1hK7PwAB1f5iUwAB1hsAAkSbAAHWHwABJWsAAdX+Yl8AAdYkAwAB0f8AAUH/AAHWLmJPAAHWMJ8AAdYzAAJEmwAB1jijAAHWMKcAAdYyZwsAAdYyCZsAAdYyGe8AAdYyew8AAdYuYkcAAdZUjwAB1i5iXwAB1lwDAAHR/wABQhMAAdZmYk8AAdZqD58AAdZq0WMAAdZqAvcAAdZonwAB1mZiWwAB1n67OwAB1mZiRwAB1oa7PwAB1oSPAAHWZmJfAAHWkAADAAJEowAB1ppiTwAB1p8AAUJ3AAHWnwABQnsAAdaaYlMAAdarAAFCfwAB1psAAUInAAHWsmJPAAHWtpMzAAHWtwABQisAAda2Bk8AAda3AAFCLwAB1rJiUwAB1ssAAUI3AAHWsmJHAAHW0wABQjsAAdbTAAFCSwAB1tIKIwAB1rJiXwAB1uADAAHWmwABQlMAAdbqYk8AAdbvAAJEowAB1vMAAUJXAAHW6mJTAAHW+gZPAAHW6mJHAAHXAg+fAAHXAnJLAAHXAwABQmsAAdcDAAFCbwAB1wMAAUJDAAHXAVsAAdcDAAFCZwAB1upiXwAB1yAAAwACRKcAAdcrAAFChwAB1y5iTwAB1zIC9wAB1y5iRwAB1zsAAUKLAAHXOwABQo8AAdcuYlMAAddG0acAAdcuYl8AAddMAwAB1ysAAUKTAAHXVmJTAAHXWtGnAAHXVmJHAAHXYwABQo8AAddWYl8AAddoAwAB1ysAAUKfAAHXcmJTAAHXdtGnAAHXcmJHAAHXfwABQo8AAddyYl8AAdeEAwAB1ysAAUKjAAHXjmJTAAHXktGnAAHXjmJHAAHXmwABQo8AAdeOYl8AAdegAwAB1ysAAUKnAAHXqmJTAAHXrtGnAAHXqmJHAAHXtwABQo8AAdeqYl8AAde8AwAB1ysAAUKrAAHXxmJTAAHXytGnAAHXxmJHAAHX0wABQo8AAdfGYl8AAdfYAwAB1ysAAUKvAAHX4mJPAAHX5wABQrMAAdfnAAFDNwAB1+JiRwAB1/MAAUM7AAHX8wABQ0sAAdfzAAFDQwAB1/MAAUNPAAHX4mJfAAHYBAADAAJEqwAB2A5iSwAB2BMAAUN/AAHYEwABQ4MAAdgOYkcAAdgfAAJEqwAB2CMAAUWrAAHYDwABQ4cAAdgqYlMAAdgvAAFDiwAB2C5u+wAB2CpiXwAB2DgDAAHYDwABQ48AAdhCYk8AAdhHAAJEqwAB2EsAAUOTAAHYSwABQ5cAAdhCYlMAAdhXAAFDiwAB2FZu+wAB2EJiXwAB2GADAAHYDwABQ5sAAdhqYkcAAdhuu/cAAdhuvAsAAdhvAAFDnwAB2GpiUwAB2H7dmwAB2GpiXwAB2IQDAAHYDwABQ6MAAdiOYk8AAdiTAAJEqwAB2JbVlwAB2JcAAUOnAAHYkt2bAAHYjmJTAAHYpwACRKsAAdiqvDcAAdiOYkcAAdiyu/cAAdiyvAsAAdizAAFDnwAB2LMAAUPHAAHYswABQ88AAdiOYl8AAdjIAwAB2A8AAUPTAAHY0mJTAAHY1wACRKsAAdja1ZcAAdjbAAFDvwAB2Nq8NwAB2NsAAUPXAAHY2wABQ9sAAdjSYkcAAdjzAAJEqwAB2PcAAUPDAAHY8wABRC8AAdjzAAFD9wAB2PMAAUQ/AAHY8wABQ/sAAdjSYl8AAdkMAwAB2A8AAURHAAHZFmJPAAHZGwACRKsAAdke1ZcAAdkfAAFDvwAB2RZiXwAB2SgDAAHYDwABREsAAdkyYkcAAdk3AAFETwAB2TcAARVPAAHZNwABRHMAAdkyYlMAAdlHAAFEVwAB2UcAAURbAAHZRwABRF8AAdlHAAFEYwAB2UcAAURnAAHZRtx/AAHZMmJfAAHZYAMAAdgPAAFEdwAB2WpiTwAB2W8AAkSrAAHZcwABQ6cAAdlzAAFEewAB2XMAASj3AAHZbwABQ4sAAdlqYlMAAdmGbvsAAdlqYl8AAdmMAwAB2A8AAUR/AAHZlmJTAAHZmwACRKsAAdme1ZcAAdmfAAFDvwAB2Z68NwAB2Z8AAUPXAAHZnwABQ9sAAdmWYkcAAdm3AAJEqwAB2bsAAUPDAAHZtwABRC8AAdm3AAFD9wAB2bcAAUQ/AAHZtwABQ/sAAdmWYl8AAdnQAwAB2A8AAUSDAAHZ2mJPAAHZ3wACRKsAAdni1ZcAAdniu4MAAdnfAAFEhwAB2d8AAUSLAAHZ3wABRI8AAdne3ZsAAdnfAAFEkwAB2dpiUwAB2gMAAkSrAAHaBs7/AAHaBrw3AAHaBwABQ9sAAdoHAAFDvwAB2dpiRwAB2hq79wAB2hq8CwAB2hsAAUOfAAHZ2mJfAAHaKAMAAdgPAAFE3wAB2jJiTwAB2jcAAkSrAAHaOrw3AAHaOwABROMAAdo7AAFD2wAB2jbL7wAB2jbcfwAB2jJiUwAB2lMAAURXAAHaUwABRFsAAdpTAAFEXwAB2lMAAURjAAHaUwABRGcAAdoyYkcAAdprAAEVTwAB2msAAUTnAAHaawABROsAAdprAAFETwAB2msAAURzAAHaMmJfAAHagAMAAdgPAAEZSwAB2opiUwAB2o8AASHbAAHajwABIeMAAdqPAAEh8wAB2o8AASH7AAHajwABIgMAAdqPAAEiCwAB2o8AASITAAHajwABIesAAdqPAAEiGwAB2o8AASIjAAHaimJfAAHauAMAAdgPAAFFCwAB2sJiTwAB2scAAkSrAAHaywABRQ8AAdrLAAEeUwAB2scAAURrAAHaxwABRG8AAdrHAAFFEwAB2scAARCXAAHawmJHAAHa5wABFU8AAdrnAAFFHwAB2ucAAUUjAAHa5wABRScAAdrnAAFFLwAB2uZqHwAB2ubPGwAB2ubPFwAB2uYZuwAB2ucAAURzAAHa5hnbAAHa5hy3AAHa5hnzAAHa5hnDAAHa5hobAAHa5s8DAAHawmJTAAHbKwABRFcAAdsrAAFEWwAB2ysAAURfAAHbKwABRGMAAdsrAAFEZwAB2sJiXwAB20ADAAHYDwABRWMAAdtKYk8AAdtOAq8AAdtKYkcAAdtVLwAB21YC/wAB21SPAAHbSmJTAAHbZhIHAAHbSmJfAAHbbAMAAdgPAAFFawAB23ZiTwAB23oSBwAB23ZiRwAB24ISLwAB24MAAUVvAAHbgwABRDsAAduCGhsAAduCGdsAAduCGfMAAdt2Yl8AAducAwAB2A8AAUV3AAHbpmJPAAHbqhIHAAHbpmJHAAHbswABRW8AAduzAAFEOwAB27IaGwAB27IZ2wAB27IZ8wAB26ZiXwAB28gDAAHYDwABRXsAAdvSYk8AAdvUnwAB29cAAkSrAAHb3KMAAdvUpwAB29bpIwAB29cAAUV/AAHb1wABRYMAAdvWyi8AAdvSYkcAAdv4jwAB29JiXwAB3AADAAHYDwABRYcAAdwKYk8AAdwPAAJEqwAB3BMAAUWLAAHcDwABRK8AAdwPAAFFjwAB3A8AAUWTAAHcCmJHAAHcJnuTAAHcJwABRZcAAdwnAAFFnwAB3CcAARPrAAHcJs8bAAHcJhnbAAHcJhnzAAHcJhobAAHcJs8XAAHcCmJfAAHcTAMAAdgPAAE11wAB3FZiTwAB3FpVxwAB3FsAAUOzAAHcWwABQ7cAAdxaFvcAAdxbAAFDuwAB3FrKLwAB3FoU1wAB3FZiUwAB3HrjPwAB3FZiRwAB3ICPAAHcVmJfAAHciAADAAJErwAB3JMAAUW7AAHclmJPAAHcmwABRbMAAdyascsAAdybAAFFrwAB3JZiXwAB3KgDAAHckwABQ18AAdyyYk8AAdy2ZwsAAdy3AAFD/wAB3LYTkwAB3LYPBwAB3LcAAkSvAAHcywABRb8AAdyyYkcAAdzQjwAB3LJiXwAB3NgDAAHckwABRc8AAdziYk8AAdznAAJErwAB3OqkIwAB3OYU1wAB3OJiRwAB3PVbAAHc9S8AAdz0jwAB3OJiUwAB3QcAAUPrAAHc4mJfAAHdDAMAAd0OFmMAAdyTAAFF1wAB3RpiRwAB3R0vAAHdGmJTAAHdJhIHAAHdGmJfAAHdLAMAAdySVRsAAd02Yk8AAd062bcAAd06yfMAAd05bwAB3TpqAwAB3TmHAAHdNmJTAAHdUwABJ6MAAd02YkcAAd1YjwAB3TZiXwAB3WMAAUXbAAHdYg1vAAHdYgmrAAHdYwABRd8AAdyTAAFF9wAB3XZiRwAB3XsAAUP3AAHdewABRD8AAd17AAFELwAB3XsAAUX7AAHddmJfAAHdjAADAAJEswAB3ZbdPwAB3ZpiRwAB3Z8AAUYDAAHdnwABFV8AAd2fAAFGCwAB3Z8AAUYPAAHdnwABRhMAAd2aYl8AAd20AwAB3ZbdQwAB3b5iTwAB3cMAAkSzAAHdxtWXAAHdxwABRhcAAd3HAAEeUwAB3ca8NwAB3ccAAUPbAAHdwsvvAAHdvmJHAAHd4wABRgMAAd3jAAEVXwAB3eMAAUYLAAHd4wABRg8AAd3jAAFGEwAB3b5iXwAB3fgDAAHdlwABRiMAAd4CYk8AAd4HAAJEswAB3gsAAUYnAAHeCwABDiMAAd4LAAFGKwAB3gsAAUYvAAHeCwABRjMAAd4LAAFGNwAB3gcAAUYbAAHeBwABEJcAAd4CYlMAAd4vAAJEswAB3jLVlwAB3jMAAR5TAAHeMwABRhcAAd4CYkcAAd5CCm8AAd5DAAJEswAB3kqRWwAB3ksAAUY/AAHeSwABRkcAAd5LAAFGOwAB3ksAAUZLAAHeSwABRk8AAd5LAAFGUwAB3ksAAUZXAAHeSwABRlsAAd5Cah8AAd5CzxsAAd5CzxcAAd5CGbsAAd5CGdsAAd5CGfMAAd5CGcMAAd5CGhsAAd5CzwMAAd4CYl8AAd6UAwAB3ZcAAUZjAAHenmJPAAHeowACRLMAAd6m7l8AAd6nAAEOIwAB3qcAAUZnAAHepwABRmsAAd6nAAFGcwAB3qcAAUZ3AAHepwABRnsAAd6nAAFGfwAB3qcAAUaDAAHepwABRocAAd6eYlMAAd7TAAJEswAB3tbO/wAB3tZvTwAB3p5iRwAB3uMAAkSzAAHe5wABRosAAd7nAAFGnwAB3ucAAUanAAHe5wABRqsAAd7nAAFGrwAB3ucAAUbDAAHe5wABRrcAAd7jAAFGjwAB3p5iXwAB3wgAAwACRLcAAd8S4L8AAd8WYk8AAd8aD58AAd8bAAFGzwAB3xsAAUbTAAHfGwABRtcAAd8bAAFG2wAB3xsAAUbfAAHfGwABRuMAAd8bAAFG5wAB3xsAAUbrAAHfGwACRLcAAd9DAAFG7wAB3xZiWwAB30q7OwAB3xZiRwAB31K7PwAB31EjAAHfUwACRLcAAd9fAAFG+wAB318AAUb/AAHfXwABRwMAAd9TAAFHBwAB31MAAUcLAAHfUuTHAAHfUuTLAAHfUtzzAAHfUubDAAHfUtz3AAHfUubHAAHfUwABRw8AAd9S6LMAAd9TAAEnWwAB31Lo4wAB31MAASdDAAHfUwABRxMAAd9TAAFHFwAB31Lo9wAB31MAASdTAAHfUukDAAHfUwABJzMAAd9TAAFHGwAB31MAAUcfAAHfUtzrAAHfUwABJ1cAAd9S3O8AAd9TAAEnOwAB31MAAUcjAAHfUwABRycAAd9TAAFHKwAB31FbAAHfUwABJ28AAd9SDF8AAd9QjwAB3xZiUwAB3+4PBwAB3+4R8wAB3xZiXwAB3/gDAAHf+hZjAAHf+wABRvMAAd8TAAFHTwAB4ApiTwAB4A8AAkS3AAHgEwABR1MAAeAS3McAAeATAAFHVwAB4BMAAUdbAAHgCmJHAAHgJtzvAAHgJtzrAAHgJujjAAHgJuizAAHgJwABPPMAAeAm3PMAAeAm6GsAAeAlWwAB4CSPAAHgCmJTAAHgTtAXAAHgTt0rAAHgTgmbAAHgCmJfAAHgXAMAAeBfAAFHXAMAAkS7AAHgamJHAAHgbwABR6sAAeBq3TsAAeB2Yk8AAeB7AAJEuwAB4H7eNwAB4HZiRwAB4IbaxwAB4HZiXwAB4IwDAAHgawABR3cAAeCWYk8AAeCbAAJEuwAB4J7dUwAB4J8AAUdTAAHgnKMAAeCa2qsAAeCWYkcAAeCzAAJEuwAB4LcAAUd/AAHgtwABR4cAAeC3AAFHjwAB4LcAAUeTAAHgtwABR5cAAeC3AAFHmwAB4LcAAUefAAHgtwABR4sAAeCy2tcAAeCy22MAAeCy218AAeCy21sAAeCy21cAAeCy208AAeCy21MAAeCy20cAAeCy20sAAeCy20MAAeCy2z8AAeCy2zsAAeCy2zcAAeCy2zMAAeCy2y8AAeCy2ysAAeCy2ycAAeCy2xMAAeCy2xcAAeCy2xsAAeCy2x8AAeCy2yMAAeCyjJMAAeCy2wsAAeCy2w8AAeCy2wcAAeCy2wMAAeCy2v8AAeCy2vcAAeCy2vsAAeCy2vMAAeCy2u8AAeCy2usAAeCy2ucAAeCy22cAAeCy2uMAAeCy2tsAAeCy2t8AAeCy22sAAeCWYl8AAeF0AwAB4XcAAUd7AAHgawABR6cAAeGCYk8AAeGGDXMAAeGG23sAAeGG23cAAeGCYl8AAeGUAwAB4ZbbsAMAAkS/AAHhowABR8MAAeGmYkcAAeGrAAEZKwAB4aZiXwAB4bADAAHhowABR8sAAeG6YkcAAeG/AAE/UwAB4bpiXwAB4cQDAAHhowABR88AAeHOYkcAAeHTAAEYywAB4dMAARjTAAHhzmJfAAHh3AMAAeGjAAFH0wAB4eZiRwAB4esAAT9LAAHh5mJfAAHh8AMAAeGjAAFH1wAB4fpiTwAB4f4NlwAB4fpiRwAB4gcAAT9LAAHh+mJfAAHiDAMAAeGjAAFH2wAB4hZiRwAB4hsAAS+rAAHiGwABP4cAAeIbAAE/gwAB4hZiXwAB4igDAAHhowABR98AAeIyYk8AAeI22qcAAeIyYkcAAeI/AAEvqwAB4j8AAT+HAAHiPwABP4MAAeIyYl8AAeJMAwAB4aMAAUfjAAHiVmJHAAHiWwABGS8AAeJWYl8AAeJgAAMAAkTDAAHiawABR+sAAeJuYk8AAeJwnwAB4nMAAkTDAAHieKMAAeJwpwAB4nMAAUf3AAHicwABR/sAAeJuYkcAAeKMjwAB4m5iXwAB4pQDAAHiawABR/8AAeKeYk8AAeKiu5cAAeKjAAFIAwAB4qK7kwAB4qLmEwAB4qLr+wAB4qMAAUgHAAHiowABSAsAAeKjAAJEwwAB4sMAAUgPAAHinmJTAAHiywABSBMAAeKeYkcAAeLTAAFIFwAB4tLQbwAB4p5iXwAB4twDAAHiawABSCMAAeLmYk8AAeLrAAJEwwAB4u7O/wAB4u8AAUgnAAHi7wABSCsAAeLvAAFILwAB4u8AAUgzAAHi7wABSDcAAeLvAAFIOwAB4u8AAUg/AAHi7wABSEMAAeLvAAFIRwAB4u8AAUhLAAHi7wABSE8AAeLvAAFIUwAB4u8AAUhXAAHi7wABSFsAAeLvAAFIXwAB4u8AAUhjAAHi7wABSGcAAeLvAAFIawAB4u8AAUhvAAHi7wABSHMAAeLvAAFIdwAB4u8AAUh7AAHi7wABSH8AAeLvAAFIgwAB4u8AAUiHAAHi7wABSIsAAeLvAAFIjwAB4u8AAUiTAAHi7wABSJcAAeLvAAFImwAB4u8AAUifAAHi7wABSKMAAeLvAAFIpwAB4u8AAUirAAHi7wABSK8AAeLvAAFIswAB4u8AAUi3AAHi7wABSLsAAeLvAAFIvwAB4u8AAUjDAAHi7wABSMcAAeLvAAFIywAB4u8AAUjPAAHi7wABSNMAAeLvAAFI1wAB4u8AAUjbAAHi7wABSN8AAeLub4cAAeLub3MAAeLub28AAeLux6cAAeLvAAFI4wAB4u7G7wAB4u7HAwAB4u7HowAB4u8AAUjnAAHi7wABSOsAAeLvAAFI7wAB4u8AAUjzAAHi7wABSPcAAeLvAAFI+wAB4u8AAUj/AAHi7wABSQMAAeLvAAFJBwAB4u8AAUkLAAHi7wABSQ8AAeLvAAFJEwAB4u8AAUkXAAHi5mJTAAHkBsVDAAHkBsU7AAHkBwABSSMAAeQHAAFJJwAB5AcAAUkrAAHkBwABSS8AAeQHAAFJMwAB5AcAAUk3AAHkBsV7AAHkBwABNEcAAeQGxXMAAeQHAAFJTwAB5AcAAUlTAAHkBwABSVcAAeQHAAFJWwAB5AcAAUlfAAHkBrDjAAHkBwABSR8AAeQGxQMAAeQGxQcAAeQHAAFJYwAB5AcAAUl3AAHkBwABSXsAAeQHAAFJfwAB5AcAAUmDAAHkBwABSYcAAeQHAAFJiwAB5AcAAUmPAAHkBwABSZMAAeQHAAFJmwAB5AcAAUmjAAHkBwABSacAAeQHAAFJqwAB5AcAAUmvAAHkBwABSbMAAeQHAAFJtwAB5AaGMwAB5AcAAUm7AAHkBsovAAHkBwABSb8AAeQHAAFJwwAB5AcAAUnHAAHkBrGjAAHkBwABSc8AAeQHAAFJ0wAB5AcAAUnXAAHkBwABQysAAeQHAAFJ2wAB5AcAAUnfAAHkBtArAAHkBwABSeMAAeQHAAFJ5wAB5AcAAUnrAAHkBms/AAHkBmtTAAHkBmtPAAHkBsR/AAHkBwABSe8AAeQGw5sAAeQGw68AAeQGxHsAAeQHAAFJ8wAB5AcAAUn3AAHkBsTrAAHkBsnXAAHkBwABSfsAAeQHAAFJ/wAB5AcAAUoDAAHkBrTPAAHkBwABSgcAAeQGva8AAeQHAAFKCwAB5AcAAUoTAAHi5mJHAAHlLwACRMMAAeUzAAFJZwAB5TMAAUlDAAHlMwABSTsAAeUvAAFKDwAB5S8AAUkbAAHi5mJfAAHlSAADAAJExwAB5VMAAUofAAHlVmJPAAHlWwACRMcAAeVexrcAAeVevDcAAeVezv8AAeVfAAFKIwAB5V8AAUonAAHlXwABQ9sAAeVfAAFKKwAB5V8AAUovAAHlXwABSjMAAeVfAAFKNwAB5VZiRwAB5YrSCwAB5YrSBwAB5YsAAkTHAAHllwABSj8AAeWXAAFKRwAB5ZcAAUpTAAHllwABSlcAAeWXAAFKWwAB5ZcAAUpjAAHlitH3AAHlitIXAAHlitIbAAHlitIjAAHlitITAAHlitIPAAHlitIDAAHlirxHAAHlinw/AAHlVmJfAAHl1AADAAJEywAB5d8AAUpnAAHl4mJPAAHl5wACRMsAAeXrAAEeUwAB5eq8NwAB5erO/wAB5eJiUwAB5fljAAHl4mJHAAHmArxHAAHmArxTAAHmAhEHAAHl4mJfAAHmEAMAAeXfAAFKbwAB5hpiTwAB5h1jAAHmGmJHAAHmJwABSnsAAeYaYl8AAeYsAwAB5d8AAUqDAAHmNmJPAAHmOWMAAeY2YkcAAeZDAAFKXwAB5kMAAUqLAAHmQhNfAAHmNmJTAAHmUwABSocAAeY2Yl8AAeZYAwAB5d8AAUqXAAHmYmJPAAHmZwACRMsAAeZqvDcAAeZqzv8AAeZrAAEeUwAB5mre3wAB5mcAAUqbAAHmZtMjAAHmZuv7AAHmZwABSn8AAeZnAAFKdwAB5mcAAUprAAHmZwABSo8AAeZiYkcAAeaaEQcAAeabAAJEywAB5qMAAUqrAAHmmwABSpMAAeZiYl8AAeasAAMAAkTPAAHmtwABSrsAAea6Yk8AAea/AAJEzwAB5sK8NwAB5sLO/wAB5sMAAUojAAHmwt7DAAHmwt7jAAHmwt7fAAHmwt7nAAHmwu5nAAHmwu5zAAHmwtJfAAHmumJHAAHm7t/fAAHm7wABSs8AAea6Yl8AAeb4AwAB5rcAAUsXAAHnAmJPAAHnBwACRM8AAecK1ZcAAecKvDcAAecKzv8AAecLAAFKIwAB5wsAAR5TAAHnCwABSicAAecLAAFD2wAB5wrdWwAB5wrdXwAB5wrsHwAB5wrdawAB5wsAAQ4fAAHnAmJHAAHnPwABSxsAAec+3g8AAecCYl8AAedIAAMAAkTTAAHnUu+fAAHnVmJPAAHnWwACRNMAAedeWQsAAedWYlsAAedmuzsAAedWYkcAAeduuz8AAedu5s8AAedvAAFLJwAB528AAUsrAAHnbwABSy8AAedvAAFLMwAB528AAUs3AAHnbwABSzsAAedvAAFLPwAB528AAUtDAAHnbwABS0cAAedWYlMAAeee6L8AAedS7d8AAeemYkcAAeerAAFLSwAB56sAAUtPAAHnqgojAAHnpmJfAAHnuAMAAedTAAFLUwAB58JiTwAB58YPnwAB58cAAkTTAAHnzwABHlMAAefOzv8AAefPAAFLYwAB588AAUtnAAHnzwABS2sAAefHAAFLWwAB58bovwAB58cAAUtfAAHnwmJbAAHn8rs7AAHnwmJHAAHn+rs/AAHn+wABSycAAef7AAFLKwAB5/sAAUsvAAHn+wABSzMAAef7AAFLNwAB5/sAAUs7AAHn+wACRNMAAegbAAFLcwAB5/sAAUtDAAHn+wABS3sAAef65s8AAef7AAFLPwAB5/sAAUtHAAHnwmJfAAHoNAMAAedTAAFLfwAB6D5iTwAB6EMAAkTTAAHoRwABHlMAAehGvDcAAehGzv8AAehHAAFLgwAB6EcAAUuHAAHoRwABS4sAAeg+YkcAAehiCiMAAehjAAFLTwAB6GMAAUtLAAHoPmJfAAHocAMAAedS68MAAeh6Yk8AAeh/AAJE0wAB6IMAAUuPAAHogs7/AAHogwABHlMAAeiCu48AAeiCu3cAAeh6YlMAAeiau2MAAeiau08AAeh6YkcAAeimvBsAAeimu/8AAeh6Yl8AAeiwAwAB51MAAUuXAAHoumJPAAHovpN7AAHovg9HAAHovhIHAAHoumJHAAHozI8AAei6Yl8AAejUAwAB51MAAUujAAHo3mJPAAHo4g9HAAHo4hIHAAHo3mJHAAHo7I8AAejeYl8AAej0AAMAAkTUAwACRNsAAekDAAFLswAB6QZiRwAB6QsAAUpDAAHpCwABSksAAekKvA8AAekKfD8AAekGYlMAAekfAAFLHwAB6QZiXwAB6SQDAAHpAwABS7sAAekuYk8AAekzAAJE2wAB6TcAAUu/AAHpNwABS8MAAek3AAFLxwAB6TbGtwAB6Ta8NwAB6TbuXwAB6TbO/wAB6S5iUwAB6VcAAUsfAAHpVwABS8sAAekuYkcAAeljAAFKQwAB6WMAAkTbAAHpawABS88AAelrAAFL0wAB6WsAAUvfAAHpawABS/MAAelrAAFL+wAB6WK8DwAB6WJ8PwAB6S5iXwAB6YgDAAHpAt63AAHpkmJPAAHplwACRNsAAembAAFMAwAB6ZsAAUwHAAHpkmJTAAHppwABTAsAAemnAAFMDwAB6abd4wAB6ZJiRwAB6bcAAUpLAAHptnw/AAHpkmJfAAHpwAMAAekDAAFMJwAB6cpiTwAB6c8AAkTbAAHp0wABDiMAAenTAAFMBwAB6dMAAR5TAAHp0wABTCsAAenKYkcAAennAAFKSwAB6ecAAkTbAAHp7wABS88AAenvAAFMMwAB6eZ8PwAB6cpiXwAB6fwAAwACRN8AAeoHAAFMRwAB6gpiTwAB6g4RSwAB6g4JmwAB6g4VOwAB6g8AAS8nAAHqDwABTEsAAeoPAAFMTwAB6g8AARUrAAHqDwABTFMAAeoKYl8AAeowAwAB6gcAAUxXAAHqOmJPAAHqPpArAAHqPwACRN8AAepHAAFMWwAB6kcAAQ4jAAHqRt1fAAHqRwABTG8AAepHAAFMcwAB6kcAAUx3AAHqRwABTHsAAepHAAFMfwAB6kcAAUyDAAHqRwABTIcAAepG3lcAAepG3VMAAepHAAFMiwAB6kcAAUyPAAHqRwABTJMAAepHAAFMlwAB6kcAAUybAAHqRwABTJ8AAepHAAFMowAB6kcAAUynAAHqRt5bAAHqRt5fAAHqRiLXAAHqRwABTK8AAepHAAFMuwAB6j8AAUxfAAHqPoM3AAHqPwABTGMAAeo/AAFMZwAB6j3rAAHqPpLrAAHqPwABTGsAAeo+kzMAAeo+3mMAAeo+k/MAAeo/AAFMqwAB6j8AAUyzAAHqPmoDAAHqPwABTLcAAeo6YlMAAernAAJE3wAB6usAAUzHAAHq6wABTMsAAerqzv8AAerqvDcAAerq3usAAerrAAFMzwAB6usAAUzDAAHq6wABTNMAAerrAAEeUwAB6usAAUuPAAHq6wABQ9sAAerrAAFM1wAB6usAAVUvAAHq5hWfAAHq5XsAAermlTcAAeo6YkcAAesugv8AAesugwsAAesvAAFM2wAB6y7iSwAB6y6UXwAB6y4KIwAB6y8AAkTfAAHrSwABTN8AAetLAAFM+wAB60sAAUz/AAHrSwABTQ8AAetLAAFNEwAB60sAAU0rAAHrSwABTS8AAetLAAFNNwAB60sAAUy/AAHrSwABTT8AAetLAAFNdwAB60sAAU1HAAHrSwABTU8AAetLAAFNlwAB60sAAU2zAAHrSwABTcsAAetLAAFNVwAB60sAAU4vAAHrSwABTicAAetLAAFOBwAB60sAAU43AAHrSwABTj8AAetLAAFOSwAB60sAAU3bAAHrSwABTm8AAetLAAFOWwAB60sAAU5XAAHrSwABToMAAetLAAFNbwAB60sAAU1rAAHrSwABTVsAAetLAAFNSwAB60sAAU6zAAHrSwABTpcAAetLAAFNcwAB60sAAU6/AAHrSwABTsMAAetLAAFOzwAB60sAAU1DAAHrSwABTe8AAetLAAFN9wAB60sAAU6bAAHrSwABTYsAAetLAAFNpwAB60sAAU9zAAHrSwABT3cAAetLAAFPbwAB60sAAU0LAAHrSwABTp8AAetLAAFQZwAB60sAAVBXAAHrSwABUG8AAetLAAFQiwAB60sAAVCnAAHrSwABUKsAAetLAAFQrwAB60sAAVCfAAHrSwABUKMAAetLAAFQvwAB60sAAVD7AAHrSwABUQsAAetLAAFRSwAB60sAAVFTAAHrSwABUVcAAetLAAFRXwAB60sAAVFjAAHrSwABUWsAAetLAAFRbwAB60sAAVFzAAHrSwABUXcAAetLAAFPpwAB60sAAU8rAAHrSwABUYMAAetLAAFRfwAB60sAAVF7AAHrSwABUhsAAetLAAFSVwAB60sAAVKjAAHrSwABUcsAAetLAAFR0wAB60sAAVHbAAHrSwABUeMAAetLAAFR6wAB60sAAVLPAAHrSwABUscAAetLAAFR7wAB60sAAVHzAAHrSwABUucAAetLAAFS7wAB60sAAVH7AAHrSwABUgMAAetLAAFSCwAB60sAAVITAAHrSwABUccAAetLAAFSFwAB60sAAU8TAAHrSwABT58AAetLAAFTiwAB60sAAVG/AAHrSwABU98AAetLAAFRQwAB60sAAVFHAAHrSwABTvMAAetKx/8AAetLAAFUFwAB60sAAVQzAAHrSwABVB8AAetLAAFPSwAB60sAAU4jAAHrSwABVKsAAetLAAFUvwAB60sAAU3TAAHrSwABVK8AAetLAAFU5wAB60sAAVS3AAHrSwABVQcAAetLAAFUuwAB60sAAU9TAAHrSwABVLMAAetLAAFVHwAB60sAAVUjAAHrSwABVJsAAetLAAFUcwAB60sAAU8vAAHrLue3AAHrLwABTOMAAesvAAFM5wAB6y1bAAHrLwABTO8AAesvAAFM8wAB6y8AAUz3AAHrLoobAAHrLwABTasAAesuXz8AAesuGC8AAesuGCMAAesuGEsAAesuGF8AAesuGDsAAesuGAMAAesuGOcAAesuGJ8AAesuGK8AAesuGIcAAesuGI8AAesuGN8AAesuF2MAAesuGG8AAesvAAFQcwAB6y4YfwAB6y4YdwAB6y4Y1wAB6y4YuwAB6y4W3wAB6y4WywAB6y4XdwAB6y4XgwAB6y4XiwAB6y4XbwAB6y4XnwAB6y4XkwAB6y4XxwAB6y4XzwAB6y4X1wAB6y4X3wAB6y4XpwAB6y4WUwAB6y4WWwAB6y4WCwAB6y4V1wAB6y4WEwAB6y4WGwAB6y4WIwAB6y4WKwAB6y4WSwAB6y4V3wAB6y4ZRwAB6y4YDwAB6y4YFwAB6y4WkwAB6y4VawAB6y4ZTwAB6y4X9wAB6y4WqwAB6y4WgwAB6y4WQwAB6y4WiwAB6y4WmwAB6y4XUwAB6y4XvwAB6y4ZJwAB6y4X6wAB6y4XtwAB6y4XrwAB6y4WtwAB6y4W7wAB6y4Y8wAB6y4ZDwAB6jpiVwAB7mV7AAHqOmJfAAHubAMAAeoHAAFVOwAB7nZiTwAB7nsAAU37AAHuehc3AAHuewABTjsAAe52Yl8AAe6IAwAB6gcAAVU/AAHukmJPAAHulgmrAAHulwABVQ8AAe6XAAFVFwAB7pcAAVUbAAHulwABVQsAAe6XAAFVEwAB7pcAAVUzAAHukmJHAAHutI8AAe6SYl8AAe68AwAB6gcAAVVLAAHuxmJPAAHuywABVU8AAe7LAAFVUwAB7ssAAVVXAAHuywABVVsAAe7LAAFVXwAB7ssAAVVjAAHuywABVWcAAe7LAAFVawAB7ssAAVVvAAHuywABVXMAAe7LAAFVdwAB7soHswAB7ssAAVV7AAHuywABUB8AAe7LAAFVfwAB7ssAAVWDAAHuywABVYcAAe7GYkcAAe8TAAJE3wAB7xcAAVWLAAHvFwABVZMAAe8XAAFVmwAB7xMAAU+3AAHvEwABT7MAAe8S21MAAe8TAAFPuwAB7sZiXwAB7zQDAAHqBwABVccAAe8+Yk8AAe9DAAJE3wAB70bdUwAB7z5iUwAB704QhwAB7z5iRwAB71cAAVXLAAHvPmJfAAHvXAMAAeoHAAFVzwAB72ZiRwAB72qOZwAB72pfbwAB72oVAwAB72oVJwAB72pfZwAB72oXvwAB72ZiXwAB74QDAAHqBwABVdMAAe+OYl8AAe+QAwAB6gcAAVXbAAHvmmJPAAHvngpDAAHvnu7zAAHvmmJTAAHvqg8HAAHvmmJHAAHvsSMAAe+wjwAB75piXwAB77wDAAHqBwABVeMAAe/GYk8AAe/KHecAAe/LAAFV5wAB78sAAVXrAAHvywABVe8AAe/LAAFV8wAB78sAAVX3AAHvywABVfsAAe/LAAFV/wAB78sAAVYDAAHvywABRfsAAe/LAAFWBwAB78sAAVYLAAHvywABVg8AAe/LAAFWEwAB78sAAVYXAAHvywABVhsAAe/LAAFWHwAB78ZiRwAB8BMAAVRnAAHwEwABVIMAAfATAAFUdwAB8BMAAVYvAAHwEI8AAe/GYl8AAfAoAwAB8CpVJwAB6gcAAVZfAAHwNmJPAAHwOgvrAAHwOt5nAAHwOwACRN8AAfBHAAEUEwAB8DZiRwAB8E8AAVR/AAHwNmJfAAHwVAMAAeoHAAFWYwAB8F5iTwAB8GMAAVZnAAHwYwABVmsAAfBjAAFWbwAB8GMAAVZzAAHwYgvrAAHwYt5nAAHwYEsAAfBjAAFWdwAB8GMAAVZ7AAHwYwABVn8AAfBeYkcAAfCPAAFWgwAB8I8AAVaLAAHwjwABVocAAfCPAAFWlwAB8I8AAVabAAHwjwABVp8AAfCOah8AAfCOHLcAAfCOXz8AAfCOGAMAAfCOGOcAAfCOF78AAfCPAAJE3wAB8MMAAVajAAHwwwABVrcAAfCOGJ8AAfCOGK8AAfCOGIcAAfCOGI8AAfCOGPMAAfCOGQ8AAfCOF/cAAfCOGU8AAfCOFWsAAfCOFt8AAfCOFTMAAfCOGG8AAfCPAAFWswAB8I4YXwAB8I4YOwAB8I4YSwAB8I4XbwAB8I4WCwAB8I4WGwAB8I4WEwAB8I4WIwAB8I4V1wAB8I4XrwAB8I4WUwAB8I4WmwAB8I4WkwAB8I4WgwAB8I4XYwAB8I4ZRwAB8I4Y3wAB8F5iXwAB8UQAAwACROMAAfFPAAFWuwAB8VJiRwAB8VcAAVa/AAHxVwABVsMAAfFXAAFWxwAB8VcAAVbLAAHxVwABVs8AAfFSYl8AAfFsAAMAAkTnAAHxdmJHAAHxewACROcAAfF/AAFY6wAB8XcAAVbfAAHxhmJPAAHxig+fAAHxiwACROcAAfGS3VMAAfGTAAFW5wAB8ZMAAVbrAAHxkwABVu8AAfGTAAFW8wAB8YZiWwAB8aq7OwAB8YZiRwAB8bK7PwAB8bMAATtDAAHxswABThMAAfGzAAFPawAB8bMAAT57AAHxhmJfAAHxyAMAAfF3AAFXFwAB8dJiTwAB8dcAAkTnAAHx2t1TAAHx2t2nAAHx2tJfAAHx2wABVucAAfHbAAFW6wAB8dsAAVbvAAHx2wABVvMAAfHSYkcAAfH7AAJE5wAB8f8AAVcbAAHx/wABV5cAAfH7AAFXewAB8dJiXwAB8gwDAAHxdwABV6sAAfIWYk8AAfIaD58AAfIbAAFXswAB8hrmywAB8hsAAVeLAAHyGwABOzsAAfIWYkcAAfIzAAFXuwAB8jMAAVe/AAHyMI8AAfIzAAFO2wAB8jK7PwAB8hZiWwAB8kq7OwAB8hZiXwAB8lJVJwAB8lJYowAB8XcAAVfPAAHyXmJPAAHyYg+fAAHyYglPAAHyXmJTAAHybwABThcAAfJeYlsAAfJ2uzsAAfJeYkcAAfJ+uz8AAfJeYl8AAfKGVScAAfKGWKMAAfF3AAFX2wAB8pJiTwAB8pYPnwAB8pcAAVfjAAHykmJTAAHyowABV+cAAfKSYlsAAfKquzsAAfKSYkcAAfKyuz8AAfKSYl8AAfK6VScAAfK6WKMAAfF3AAFX7wAB8sZiTwAB8soPnwAB8srQBwAB8ssAAUGnAAHyywABV/cAAfLK5ssAAfLLAAFTvwAB8ssAAVf7AAHyxmJbAAHy6rs7AAHyxmJHAAHy8rs/AAHy8wABU8cAAfLzAAE7RwAB8sZiUwAB8wMAAVgLAAHzAwABWBcAAfMC0VcAAfLGYl8AAfMSVScAAfMTAAFX/wAB8XcAAVgbAAHzHmJPAAHzIg+fAAHzHmJbAAHzKrs7AAHzHmJHAAHzMrs/AAHzMI8AAfMeYlMAAfM+0VcAAfMeYl8AAfNEAwAB8XcAAVgnAAHzTmJPAAHzUsR7AAHzTmJTAAHzWgL3AAHzWg8HAAHzTmJHAAHzZSMAAfNkjwAB805iXwAB83ADAAHxdwABWC8AAfN6Yk8AAfN+D58AAfN/AAEfHwAB83piWwAB84q7OwAB83piRwAB85K7PwAB83piUwAB85sAAR6HAAHzemJfAAHzoAMAAfOiVScAAfF3AAFYNwAB865iTwAB87IPnwAB87MAAS/7AAHzshLzAAHzswABWD8AAfOyE1MAAfOuYlsAAfPKuzsAAfOuYkcAAfPSuz8AAfOuYlMAAfPaE6cAAfPayw8AAfPascsAAfPaecsAAfPaE1cAAfPaE9MAAfOuYl8AAfP0AwAB8XcAAVhHAAHz/mJPAAH0Ag+fAAHz/mJbAAH0Crs7AAHz/mJHAAH0Ers/AAH0EI8AAfP+YlMAAfQe0VcAAfP+Yl8AAfQkAwAB8XcAATtnAAH0LmJPAAH0Mg+fAAH0MwABIk8AAfQuYlsAAfQ+uzsAAfQuYkcAAfRGuz8AAfQuYlMAAfROE/MAAfROHesAAfROEGcAAfQuYl8AAfRcAwAB8XcAAVhTAAH0ZmJPAAH0ag+fAAH0arHLAAH0ZmJbAAH0drs7AAH0ZmJHAAH0frs/AAH0ZmJfAAH0hAMAAfF3AAFYXwAB9I5iTwAB9JIPnwAB9JIRbwAB9I5iWwAB9J67OwAB9I5iRwAB9Ka7PwAB9KSPAAH0jmJTAAH0sgmfAAH0sg+7AAH0jmJfAAH0vAMAAfF3AAFYbwAB9MZiTwAB9MsAAS/7AAH0ywABWHMAAfTGYlMAAfTXAAFYdwAB9MZiRwAB9N7eawAB9MZiXwAB9OQDAAHxdwABWH8AAfTuYk8AAfTzAAJE6wAB9PalqwAB9O5iUwAB9P8AAQAzAAH07mJHAAH1Bsr/AAH07mJfAAH1DAMAAfF3AAFYgwAB9RZiRwAB9RrK/wAB9RrLYwAB9RZiUwAB9ScAAQAzAAH1FmJfAAH1LAMAAfF3AAFYhwAB9TZiTwAB9ToPnwAB9ToU1wAB9TsAAQAzAAH1OwABWI8AAfU2YlsAAfVOuzsAAfU2YkcAAfVWuz8AAfVWyvsAAfVWyv8AAfU2Yl8AAfVkAwAB8XcAAVinAAH1bmJPAAH1cg+fAAH1cwACROcAAfV6SJsAAfVuYlsAAfWCuzsAAfVuYkcAAfWKuz8AAfWKywcAAfWLAAFYvwAB9W5iUwAB9ZsAAViPAAH1bmJfAAH1oAMAAfF3AAFYywAB9apiTwAB9a4PnwAB9a4RbwAB9a4JnwAB9a4PuwAB9apiWwAB9cK7OwAB9apiRwAB9cq7PwAB9ciPAAH1qmJfAAH11AMAAfF3AAFY1wAB9d5iTwAB9eIPnwAB9eIRbwAB9d5iWwAB9e67OwAB9d5iRwAB9fa7PwAB9fSPAAH13mJTAAH2AgmfAAH2Ag+7AAH13mJfAAH2DAMAAfF3AAFY5wAB9hZiRwAB9hsAAUQbAAH2GwABRNsAAfYbAAFKOwAB9hsAAVdDAAH2GwABV08AAfYbAAFRZwAB9hsAAVPTAAH2FmJfAAH2OAADAAJE7wAB9kMAAVj/AAH2RmJPAAH2Sg+fAAH2SwABWQcAAfZLAAFZCwAB9ksAASHbAAH2SwABWQ8AAfZLAAFZEwAB9ksAAVkbAAH2SwABWSMAAfZLAAFZKwAB9ksAAVkzAAH2SwABWTsAAfZLAAFZQwAB9knrAAH2SpLrAAH2SwACRO8AAfaGzv8AAfaGvDcAAfaHAAFZSwAB9ocAAVlPAAH2hwABQ9cAAfaHAAFZUwAB9ocAAVlXAAH2hwABWVsAAfaHAAFZbwAB9ocAAVlzAAH2hwABWXcAAfaHAAFZewAB9ocAAVl/AAH2St3XAAH2ShtPAAH2ShIHAAH2ShIjAAH2SolrAAH2ShIDAAH2SpAfAAH2Ss0vAAH2SwABWV8AAfZLAAFZYwAB9ksAAVlnAAH2SwABWWsAAfZK8WMAAfZKzTcAAfZK3b8AAfZK3bsAAfZGYkcAAfb+3iMAAfb+uz8AAfb+3hcAAfb+yFsAAfb/AAJE7wAB9xMAAVoXAAH3EwABWiMAAfcTAAFaLwAB9xMAAVo7AAH3EwABWjcAAfcSyHMAAfcTAAFamwAB9xMAAVqfAAH3EwABWqMAAfcTAAFaqwAB9xMAAVqzAAH3EwABWrcAAfcTAAFauwAB9xMAAVq/AAH3EwABWsMAAfcTAAFaxwAB9xMAAVrLAAH3EwABWs8AAfcTAAFa0wAB9xMAAVsPAAH3EwABWycAAfcTAAFbhwAB9xMAAVubAAH3EwABW7MAAfcTAAFbiwAB9xMAAVvLAAH3EwABW98AAfcTAAFbzwAB9xMAAVvjAAH3EwABW8MAAfcTAAFb7wAB9v7IhwAB9v7IgwAB9v7KzwAB9v6FNwAB9v7IkwAB9v5wJwAB9v5wSwAB9v8AAVozAAH2/wABWkMAAfb/AAE7fwAB9v5wLwAB9v8AATuDAAH2/p8jAAH2/wABWm8AAfb/AAE7ewAB9v8AATMfAAH2/wABL8MAAfb/AAEvswAB9v8AATubAAH2/wABO28AAfb+yvsAAfb/AAFajwAB9v8AARiXAAH2/wABF/MAAfb+yusAAfb+yvcAAfb/AAE6ZwAB9v8AARfvAAH2/wABWtcAAfb/AAE6VwAB9v8AARifAAH2/wABWt8AAfb/AAFa4wAB9v8AATuTAAH2/wABO7cAAfb+ZFMAAfb/AAE7cwAB9v8AATt3AAH2/wABWvsAAfb/AAFa8wAB9v8AAVr3AAH2/wABWwcAAfb/AAE7hwAB9v8AATuLAAH2/wABO48AAfb/AAEzIwAB9v8AAVtLAAH2/wABNsMAAfb/AAFZ0wAB9v8AAVtTAAH2/wABW1cAAfb+y0MAAfb+3msAAfb/AAE7owAB9v8AAVobAAH2/wABO6cAAfb/AAFaBwAB9v8AAVorAAH2/wABWl8AAfb/AAFZ/wAB9v8AAVpjAAH2/wABWj8AAfb/AAFaWwAB9v8AATurAAH2/wABO58AAfb+2g8AAfb/AAE7lwAB9v7LYwAB9v7LPwAB9v7LOwAB9v8AATuzAAH2/wABW7sAAfb/AAE7rwAB9kZiUwAB+LYVnwAB+LaTlwAB+LbL7wAB+LcAAkTvAAH4xwABWfsAAfjHAAFaAwAB+LYbGwAB+LapbwAB+LcAAVtjAAH2RmJfAAH43AMAAfjeuzsAAfZDAAFb/wAB+OpiTwAB+O7NUwAB+OpiUwAB+PZ5iwAB+PbKxwAB+PaTpwAB+PYbTwAB+OpiRwAB+QplVwAB+QrK6wAB+Qq8TwAB+QrK7wAB+QoTpwAB+QrK8wAB+QrLRwAB+QrLSwAB+QrK9wAB+QrLTwAB+QrIkwAB+QrK+wAB+QrK/wAB+QrLVwAB+QrLUwAB+QrLBwAB+QrLAwAB+QrLCwAB+QqFNwAB+QrIjwAB+QrK0wAB+QrK5wAB+QrK1wAB+QrLOwAB+QrK2wAB+QrK3wAB+QrLPwAB+QrLQwAB+QrKywAB+QrIhwAB+QrIgwAB+QqTmwAB+QrIWwAB+QrLDwAB+QrLYwAB+QrLZwAB+QrLWwAB+QrLXwAB+OpiXwAB+aQDAAH2QwABXCcAAfmuYk8AAfmyk5cAAfmyy+8AAfmykusAAfmyxisAAfmzAAJE7wAB+cbGtwAB+a5iUwAB+c4LKwAB+a5iXwAB+dQDAAH2QwABXCsAAfneYk8AAfnjAAJE7wAB+ebdUwAB+ecAAUYrAAH55wABXC8AAfneYkcAAfn3AAJE7wAB+fsAAVqTAAH53mJfAAH6AAMAAfZDAAFcMwAB+gpiTwAB+g8AAkTvAAH6Et1TAAH6EwABRisAAfoKYlMAAfoey+8AAfoeFZ8AAfoekusAAfoe8z8AAfoKYkcAAfozAAEYlwAB+jLxSwAB+jLxwwAB+jLx0wAB+jLzFwAB+gpiXwAB+kgDAAH2QwABXDsAAfpSYk8AAfpXAAJE7wAB+loiJwAB+lpu1wAB+lsAARRHAAH6WpyXAAH6WqWrAAH6UmJHAAH6cwABWZMAAfpyk58AAfpzAAFZ3wAB+nMAAVnjAAH6cwABWecAAfpzAAFZ6wAB+nKTmwAB+nMAAVnvAAH6cwABWfMAAfpzAAEXSwAB+nMAAQ+/AAH6cwABD8MAAfpzAAEPxwAB+nMAAQ/LAAH6cwABD88AAfpSYl8AAfqwAwAB9kMAAVxrAAH6umJPAAH6vwACRO8AAfrC3VMAAfq6YkcAAfrLAAEPzwAB+ssAAQ/LAAH6ywABD8cAAfrLAAEPwwAB+ssAAQ+/AAH6umJfAAH64AMAAfZDAAFcbwAB+upiTwAB+uyfAAH67wACRO8AAfr0owAB+uynAAH67wABO+MAAfrvAAE76wAB+upiRwAB+wiPAAH66mJfAAH7EAMAAfZDAAFcewAB+xpiTwAB+x8AAkTvAAH7It1TAAH7GmJHAAH7KwABD+MAAfsrAAJE7wAB+zMAAVx/AAH7GmJfAAH7OAMAAfZDAAFchwAB+0JiTwAB+0cAAkTvAAH7SwABXIsAAftK3VMAAftCYkcAAftXAAEQAwAB+1cAAkTvAAH7XwABXI8AAftCYl8AAftkAAMAAkTzAAH7bwABXJsAAftyYk8AAft2D58AAft23b8AAft23c8AAft2zR8AAft22d8AAft3AAJE8wAB+48AAVyjAAH7jwABXKcAAfuPAAFcqwAB+48AAUzTAAH7jwABXK8AAft21/MAAft27tMAAft27x8AAft27yMAAft27ucAAft23eMAAft20vcAAft2qW8AAft2zVMAAft23cMAAft2z9cAAft2k+sAAft2y2sAAft277MAAft2uv8AAft3AAFcswAB+3JiWwAB++a7OwAB+3JiRwAB++67PwAB++7WVwAB++7YlwAB++7YmwAB++5sOwAB++7X7wAB++7X/wAB++7X6wAB++7X9wAB++7ZHwAB++7WswAB++7X5wAB++7YAwAB++8AAkTzAAH8JwABXQMAAfwnAAFcywAB/CcAAVz7AAH77tf7AAH77u+/AAH77tB/AAH77wABXQcAAfvu1QcAAfvu3OcAAfvu1+MAAfvu7TcAAftyYlMAAfxWk5cAAfxWy+8AAfxW3d8AAfxW77cAAfxWweMAAftyYl8AAfxsAwAB+28AAV0PAAH8dmJPAAH8es1TAAH8dmJHAAH8gwACRPMAAfyHAAFdEwAB/IcAAV0XAAH8gwABXSsAAfyDAAFdLwAB/IMAAV03AAH8gwABXUsAAfyDAAFdTwAB/IMAAV1DAAH8gwABXVsAAfyDAAFdMwAB/HZiXwAB/LADAAH7bwABXWMAAfy6Yk8AAfy/AAJE8wAB/MLdpwAB/LpiRwAB/MsAARATAAH8umJfAAH80AADAAJE9wAB/NpiSwAB/N8AAV1nAAH82mJHAAH85wABLVcAAfznAAFenwAB/NsAAVbbAAH88mJPAAH89wACRPcAAfz63VMAAfz7AAE5uwAB/PsAATm/AAH8+t2nAAH8+wABXWsAAfz6xrcAAfz7AAFdbwAB/PJiUwAB/RsAAkT3AAH9Hrw3AAH9Hs7/AAH88mJHAAH9Kt2zAAH9KwACRPcAAf0zAAFddwAB/TMAAV33AAH9MwABXXsAAf0zAAFdfwAB/TMAAV3DAAH9MwABXeMAAf0rAAFXpwAB/PJiXwAB/VADAAH82wABXisAAf1aYkcAAf1fAAFXTwAB/V8AAUQbAAH9XwABRNsAAf1fAAFXQwAB/V8AAVFnAAH9XwABSjsAAf1fAAFT0wAB/VpiXwAB/XwDAAH82wABXi8AAf2GYk8AAf2K3cMAAf2LAAFdtwAB/YsAAV2vAAH9hmJHAAH9mwABV08AAf2bAAFEGwAB/ZsAAUTbAAH9mwABV0MAAf2bAAFRZwAB/ZsAAUo7AAH9mwABU9MAAf2GYl8AAf24AwAB/NsAAV4zAAH9wmJHAAH9xwABXhsAAf3HAAFdhwAB/ccAATOTAAH9xwABXe8AAf3HAAEzrwAB/ccAAV43AAH9xwABXaMAAf3HAAFdmwAB/ccAAV47AAH9xwABXdsAAf3HAAFd+wAB/ccAAV2fAAH9xwABXacAAf3CYl8AAf38AwAB/NsAAV5LAAH+BmJPAAH+CwACRPcAAf4PAAFeTwAB/gZiRwAB/hcAAV3vAAH+FwABXlMAAf4XAAFeGwAB/hcAAV2HAAH+FwABM5MAAf4XAAFeVwAB/hcAAV5bAAH+FwABM68AAf4GYl8AAf44AwAB/NsAAV5vAAH+QmJPAAH+RwABXgMAAf5HAAJE9wAB/k8AAV5zAAH+QmJHAAH+VwABXncAAf5Wah8AAf5WHLcAAf5WGbsAAf5WGdsAAf5WGhsAAf5WzxsAAf5WGfMAAf5WzxcAAf5WGcMAAf5WzwMAAf5CYl8AAf6EAwAB/NsAAV6HAAH+jmJPAAH+kwABXlMAAf6TAAFeiwAB/o5iRwAB/p7w6wAB/p7wxwAB/p7w0wAB/p7wuwAB/p7w3wAB/p8AARX7AAH+nwABFf8AAf6fAAEWAwAB/p8AARYLAAH+ns+fAAH+nhy3AAH+nvELAAH+nvEXAAH+nvEvAAH+nnuTAAH+nuEfAAH+nwABFgcAAf6eFqsAAf6fAAJE9wAB/usAAV6PAAH+jmJfAAH+8AADAAJE+wAB/vsAAUqzAAH+/mJHAAH/At/fAAH+/mJfAAH/CAADAAJE/wAB/xMAAUq3AAH/FmJTAAH/GwABSBMAAf8bAAFK4wAB/xsAAUrrAAH/GwABSvMAAf8bAAFLAwAB/xsAAUsHAAH/GwABSxMAAf8bAAFK+wAB/xrdvwAB/xq7WwAB/xZiXwAB/0QAAwACRQMAAf9OYkcAAf9TAAFe/wAB/1MAAkUDAAH/WwABXxMAAf9bAAFfFwAB/1sAAV8bAAH/WwABXx8AAf9bAAFfIwAB/1sAAV8nAAH/WwABXysAAf9bAAFfLwAB/1MAAV8zAAH/TwABXrsAAf+CYk8AAf+HAAJFAwAB/4sAAV6/AAH/iwABXsMAAf+LAAFexwAB/4sAAV7LAAH/iwABXs8AAf+LAAFe0wAB/4sAAV7XAAH/iwABXtsAAf+LAAFe3wAB/4sAAV7jAAH/gmJHAAH/twABXucAAf+3AAFe6wAB/7cAAV7vAAH/twABJ8sAAf+3AAEnzwAB/7cAAS3zAAH/twABLfsAAf+3AAEt9wAB/7cAAS3/AAH/twABXvMAAf+3AAEugwAB/7cAAS6HAAH/twABLosAAf+3AAEujwAB/7cAAS7LAAH/twABLtMAAf+CYl8AAf/4AwAB/08AAV73AAIAAmJPAAIABn6TAAIABwABNLcAAgACYlMAAgASAvcAAgACYkcAAgAYjwACAAJiXwACACAAAwACRQcAAgAq3qsAAgAuYk8AAgAzAAFOjwACADMAAVb7AAIAMwABV48AAgAuYkcAAgBAjwACAC5iXwACAEgDAAIAKwABXz8AAgBSYk8AAgBXAAFXswACAFcAAVe3AAIAVwABV4sAAgBXAAFbpwACAFcAATs7AAIAVwABV3cAAgBXAAFXcwACAFcAAVdvAAIAUmJHAAIAeI8AAgBSYl8AAgCAAwACAIJYowACAIMAAV9DAAIAKwABX1MAAgCSYk8AAgCXAAJFBwACAJrIrwACAJJiUwACAKMAAU4XAAIAkmJfAAIAqAMAAgCrAAFfVwACACsAAV9bAAIAtmJPAAIAuwABV+MAAgC2YlMAAgDDAAFX5wACALZiXwACAMgDAAIAKwABX18AAgDSYk8AAgDWAvcAAgDXAAEw2wACANJiXwACAOADAAIAKwABX2MAAgDqYk8AAgDsnwACAO8AAkUHAAIA9KMAAgDspwACAO8AAV9nAAIA7wABX2sAAgDvAAEq8wACAO7ejwACAO6tgwACAO8AAV9vAAIA7wABX3MAAgDvAAFfdwACAO8AAV97AAIA7wABX38AAgDvAAFfgwACAO8AAV+HAAIA7wABX4sAAgDvAAFfjwACAO8AAV+TAAIA7wABX5cAAgDqYkcAAgFAjwACAOpiXwACAUgDAAIAKwABX5sAAgFSYk8AAgFWCZ8AAgFWCZsAAgFWzD8AAgFWhLsAAgFWu9cAAgFXAAFfZwACAVcAAV9rAAIBVwABKvMAAgFW3o8AAgFWrYMAAgFXAAFfbwACAVcAAV+TAAIBUmJTAAIBig8HAAIBUmJHAAIBkSMAAgGQjwACAVJiXwACAZ8AAkUHAAIBowABX58AAgGfAAFfgwACAZ8AAV+HAAIBnwABX4sAAgGfAAFfjwACAZ8AAV9zAAIBnwABX3cAAgGfAAFfewACAZ8AAV9/AAIBnwABX5cAAgArAAFftwACAc5iTwACAdCfAAIB0wACRQcAAgHYowACAdCnAAIB0mcLAAIB0lkHAAIB0nsPAAIB0gmrAAIBzmJHAAIB9I8AAgHOYl8AAgH8AwACACsAAV/LAAICBmJPAAICCglPAAICCgpDAAICCgmfAAICCtFjAAICBmJbAAICHAMAAgIGYkcAAgImETcAAgImETsAAgIlIwACAiSPAAICBmJTAAICOg8HAAICBmJfAAICQlUkAwACRQsAAgJKYkcAAgJPAAJFCwACAlMAAWHPAAICSwABX+cAAgJaYkcAAgJfAAFf6wACAl8AAV/vAAICXwABX/MAAgJfAAFf9wACAl8AAV/7AAICXwABX/8AAgJfAAFgAwACAl8AAWAHAAICXwABYAsAAgJfAAFgDwACAl8AAWATAAICXwABYBcAAgJfAAFgGwACAl68CwACAl8AAWAjAAICXwABYCcAAgJfAAFgKwACAl8AAWAvAAICXwABYDMAAgJfAAFgNwACAl7S1wACAl8AAWA7AAICXwABYD8AAgJfAAFgQwACAl8AAWBHAAICXwABYE8AAgJfAAFgUwACAl8AAWBXAAICXwABYFsAAgJfAAFKewACAl8AAWBfAAICXwABYGMAAgJfAAFgZwACAl8AAWBrAAICXwABYG8AAgJfAAFgcwACAl8AAWB3AAICXwABYHsAAgJe7O8AAgJfAAFgfwACAl7srwACAl8AAWCDAAICXwABYIcAAgJfAAFgiwACAl8AAWCPAAICXwABYJMAAgJfAAFglwACAl8AAWCbAAICXwABYJ8AAgJfAAFgowACAl8AAWCnAAICXwABSv8AAgJfAAFgqwACAl8AAWCvAAICXwABYLMAAgJfAAFgtwACAl8AAWC7AAICXwABYL8AAgJaYl8AAgNIAwACAksAAWDDAAIDUmJPAAIDVt+fAAIDUmJHAAIDXwABOD8AAgNfAAE4QwACA18AAThHAAIDXwABOEsAAgNfAAE4TwACA18AAThTAAIDXwABOFcAAgNfAAE4WwACA18AAThfAAIDXwABN9sAAgNfAAE33wACA18AATi7AAIDXwABOC8AAgNfAAFgxwACA18AATg7AAIDXwABOMMAAgNfAAE4YwACA18AATe3AAIDXwABOB8AAgNfAAE3YwACA18AATh7AAIDXwABOI8AAgNfAAE4rwACA18AATizAAIDXwABOH8AAgNfAAE4twACA18AATiDAAIDXwABOMcAAgNfAAE4ywACA18AATjTAAIDXwABONcAAgNfAAE4zwACA16kzwACA18AATfjAAIDXwABN8MAAgNfAAE3awACA18AATc/AAIDXwABN2cAAgNfAAE3WwACA18AATd3AAIDXwABN+8AAgNfAAE35wACA18AATfrAAIDXwABOIcAAgNeGLsAAgNfAAE3QwACA18AATjbAAIDUmJfAAIEHAMAAgJLAAFg0wACBCZiTwACBCsAAkUPAAIELtpfAAIEJmJTAAIENwABYNcAAgQmYkcAAgQ/AAJFDwACBEMAAWDbAAIEQwABYN8AAgQ/AAFgpwACBD8AAWCjAAIEPwABYJ8AAgQ/AAFgmwACBD8AAWCXAAIEPwABYJMAAgQ/AAFgjwACBD8AAWCLAAIEPwABYIcAAgQ/AAFggwACBD7srwACBD8AAWB/AAIEPuzvAAIEPwABYHcAAgQ/AAFgewACBD8AAWBzAAIEPwABYG8AAgQ/AAFgawACBD8AAWBnAAIEPwABYF8AAgQ/AAFgYwACBD8AAUp7AAIEPwABYFsAAgQ/AAFgVwACBD8AAWBTAAIEPwABYE8AAgQ/AAFgRwACBD8AAWBDAAIEPwABYD8AAgQ/AAFgOwACBD7S1wACBD8AAWA3AAIEPwABYDMAAgQ/AAFgLwACBD8AAWArAAIEPwABYCcAAgQ/AAFgIwACBD68CwACBD8AAWAbAAIEPwABYBcAAgQ/AAFgEwACBD8AAWAPAAIEPwABYAsAAgQ/AAFgAwACBD8AAWAHAAIEPwABX/8AAgQ/AAFf+wACBD8AAV/3AAIEPwABX/MAAgQ/AAFf7wACBD8AAV/rAAIEPwABSv8AAgQ/AAFgqwACBD8AAWCvAAIEPwABYLMAAgQ/AAFgtwACBD8AAWC7AAIEPwABYL8AAgQmYl8AAgU0AwACAksAAWG/AAIFPmJPAAIFQt/rAAIFQt/vAAIFPmJHAAIFTt/zAAIFPmJfAAIFVAMAAgJLAAFhwwACBV5iTwACBWMAAWDXAAIFYwABNwMAAgVjAAFa6wACBV5iXwACBXADAAICSwABYccAAgV6Yk8AAgV+3mMAAgV+EosAAgV+Ca8AAgV6YkcAAgWOX0cAAgWOG0MAAgWOGzcAAgWOGysAAgWOGw8AAgWOGvcAAgWOGusAAgWOGt8AAgWOGssAAgWOGrcAAgWOGqcAAgWOGpcAAgWOGosAAgWOGn8AAgWOGnMAAgV6Yl8AAgXMAAMAAkUTAAIF1wABYdMAAgXaYk8AAgXeCVcAAgXeo4sAAgXaYl8AAgXoAwACBdcAAWHXAAIF8mJPAAIF9t+HAAIF9t+XAAIF8mJfAAIGAAMAAgXXAAFh2wACBgpiRwACBg7fdwACBg7fgwACBgpiXwACBhgAAwACRRcAAgYi3q8AAgYmYk8AAgYq34sAAgYq358AAgYq35MAAgYmYlsAAgY6WKMAAgYmYl8AAgZAAwACBiMAAWHjAAIGSmJHAAIGTwABOGsAAgZPAAEzvwACBkpiUwACBlsAAThvAAIGSmJfAAIGYAMAAgYjAAFh5wACBmpiTwACBm8AAkUXAAIGcwABVucAAgZzAAFh6wACBmpiRwACBn8AAWHvAAIGfwABYfMAAgZ/AAE4awACBn8AATO/AAIGamJTAAIGkwABOG8AAgZqYl8AAgaYAwACBiMAAWH3AAIGomJTAAIGpwABOG8AAganAAE4qwACBqJiXwACBrADAAIGIwABYfsAAga6Yk8AAga/AAJFFwACBsMAAWH/AAIGwwABYesAAga/AAE4qwACBrpiRwACBtMAAWIDAAIG0wABYfMAAga6YlMAAgbfAAE4bwACBrpiXwACBuQDAAIGIwABYgsAAgbuYk8AAgbzAAFiDwACBvLfnwACBu5iRwACBv8AAWITAAIG/wABYfMAAgb/AAFiGwACBu5iXwACBwwAAwACRRsAAgcW7dcAAgcaYk8AAgcfAAFH9wACBx8AAUf7AAIHHwACRRsAAgcqWQsAAgcaYlsAAgcyuzsAAgcaYkcAAgc6uz8AAgc7AAE+VwACBzsAAT5TAAIHGmJTAAIHSs0jAAIHSs0nAAIHSwABXesAAgdLAAFK+wACB0rJ3wACB0rRIwACB0rRKwACB0rRLwACB0rRHwACB0sAAV3zAAIHFu3bAAIHdmJPAAIHetErAAIHetEfAAIHdmJHAAIHhwABYh8AAgeHAAFiIwACB4cAAUqnAAIHhwABYicAAgeHAAFKvwACB4cAAWIvAAIHhwABSv8AAgeG30MAAgeGCiMAAgd2Yl8AAgesAwACBxcAAWIzAAIHtmJPAAIHuwACRRsAAge/AAFiNwACB78AAWI7AAIHvwABYj8AAge/AAFiQwACB78AAWJHAAIHvwABYaMAAge/AAFiSwACB78AAWJPAAIHusnfAAIHutErAAIHutEvAAIHutEfAAIHuwABXfMAAge2YlMAAgf3AAJFGwACB/rO/wACB7ZiRwACCAMAAWIfAAIIAwABYiMAAggDAAJFGwACCA8AAWJTAAIIDwABYlsAAggPAAFiYwACCA8AAWJnAAIIAwABSr8AAggDAAFiLwACCAMAAUqnAAIIAwABYicAAggDAAFK/wACCALfQwACCAIKIwACB7ZiXwACCDwDAAIHFwABYmsAAghGYk8AAghKD58AAghLAAJFGwACCFMAAWI7AAIIUwABYj8AAghTAAFiQwACCFMAAWJHAAIIUwABYaMAAghLAAFH9wACCEsAAUf7AAIISsnfAAIIStErAAIIStEvAAIIStEfAAIISwABXfMAAghGYlsAAgiGuzsAAghGYkcAAgiOuz8AAgiPAAE+VwACCI8AAT5TAAIIRmJTAAIIns0jAAIIns0nAAIInwABXecAAgifAAFd6wACCJ7RIwACCJ8AAUr7AAIIRmJfAAIIuAADAAJFHwACCMMAAWJ3AAIIxmJPAAIIywACRR8AAgjPAAFiewACCM7GtwACCM68NwACCM7O/wACCM8AAUojAAIIzwABHlMAAgjPAAFLjwACCM8AAUonAAIIzu5vAAIIzwABSisAAgjPAAFKLwACCM7e6wACCM8AAWJ/AAIIxmJHAAIJBwACRR8AAgkLAAFigwACCQsAAWKHAAIJCwABSj8AAgkLAAFKRwACCQsAAWKLAAIJCwABSlMAAgkLAAFKVwACCQsAAUpbAAIJCwABYqMAAgkLAAFKYwACCQsAAWKnAAIJBtILAAIJBtIHAAIJBtH3AAIJBtIXAAIJBtIbAAIJBtIjAAIJBtITAAIJBtIPAAIJBtIDAAIJBrxHAAIJBwABYpsAAgkGfD8AAgjGYl8AAgloAAMAAkUjAAIJcwABYq8AAgl2Yk8AAgl7AAJFIwACCX7O9wACCX8AAWKzAAIJfwABYrcAAgl2YlMAAgmOkEMAAgmOAz8AAgmPAAFiuwACCY8AAWK/AAIJjwABYsMAAgmPAAFixwACCY8AAWLLAAIJjwABYs8AAgmO7UsAAgmOCZ8AAgl2YkcAAgm6EmMAAgm7AAFi0wACCbsAAWLbAAIJuwABYt8AAgm7AAFi1wACCbsAAWLjAAIJuwABYusAAgm7AAFi5wACCbiPAAIJdmJfAAIJ4AMAAglzAAFi7wACCepiTwACCe5nCwACCepiUwACCfaQQwACCfYJnwACCepiXwACCgADAAIJcwABYvMAAgoKYk8AAgoOCasAAgoO0W8AAgoPAAFi9wACCg8AAWL7AAIKDwABYv8AAgoKYlMAAgomkEMAAgomCZ8AAgoKYkcAAgozAAFjAwACCjCPAAIKCmJfAAIKPAMAAglzAAFjGwACCkZiTwACCksAAkUjAAIKTp6fAAIKTm7XAAIKTwABYx8AAgpPAAFjIwACCk8AAWMnAAIKSwABRJ8AAgpLAAFDywACCkZiUwACCm8AAWM7AAIKbwABYz8AAgpvAAFjQwACCm8AAWNHAAIKRmJHAAIKgwABY0sAAgqDAAFjTwACCoMAAWNTAAIKgwACRSMAAgqTAAFjVwACCpMAAWNbAAIKkwABYysAAgqTAAFjLwACCpMAAWMzAAIKkwABYzcAAgqCzU8AAgpGYl8AAgqwAwACCXLvqwACCrpiWwACCr67OwACCrpiRwACCsa7PwACCscAAUQbAAIKxwABRNsAAgrHAAFKOwACCscAAVFnAAIKxwABU9MAAglzAAFjmwACCuJiRwACCua7PwACCucAAUQbAAIK5wABSjsAAgrnAAFE2wACCucAAVFnAAIK5wABU9MAAgriYl8AAgsAAwACCXMAAWOfAAILCmJPAAILDg+fAAILDwACRSMAAgsWvDcAAgsPAAFeEwACCw8AAV3PAAILDwABXdMAAgsPAAFdswACCw8AAV27AAILDwABXhcAAgsPAAFeHwACCwpiWwACCzq7OwACCwpiRwACC0K7PwACC0LSLwACC0MAAUQbAAILQwABSjsAAgtDAAFE2wACC0MAAVFnAAILQwABU9MAAgsKYl8AAgtgAwACCXMAAWOnAAILamJHAAILbwABStMAAgtvAAFK1wACC28AAUrbAAILbrwLAAILbwABY6sAAgtqYl8AAguEAwACCXMAAWOvAAILjmJHAAILkwABStMAAguTAAFK1wACC5MAAUrbAAILkrwLAAILkwABY6sAAguOYl8AAguoAwACCXMAAWOzAAILsmJPAAILtwACRSMAAgu6vDcAAgu6u4MAAgu3AAFjtwACC7cAAWO7AAILtwABY78AAgu3AAFjwwACC7cAAWPHAAILtwABY8sAAguyYkcAAgvfAAFK0wACC98AAUrXAAIL3wABStsAAgvevAsAAgvfAAFjqwACC7JiXwACC/QAAwACRScAAgv+YkcAAgwDAAFkVwACDAMAAWRfAAIL/wABZBcAAgwOYkcAAgwS328AAgwOYl8AAgwYAwACC/8AAUuvAAIMImJHAAIMJwABTBcAAgwiYl8AAgwsAwACC/8AAWQfAAIMNmJPAAIMOwACRScAAgw+vDcAAgw+3sMAAgw/AAFkIwACDDZiRwACDE8AAUwXAAIMTwACRScAAgxXAAFkJwACDFcAAWQvAAIMVwABZDcAAgxXAAFkKwACDDZiXwACDGgAAwACRSsAAgxyYkcAAgx3AAJFKwACDHsAAWSDAAIMcwABZGcAAgyCYk8AAgyHAAJFKwACDIrdUwACDIsAAWRrAAIMgmJHAAIMlwACRSsAAgybAAFkbwACDJbL9wACDJbL/wACDJbL+wACDJbNRwACDJbMJwACDJbMDwACDJYR+wACDJbNPwACDIJiXwACDMADAAIMcwABZH8AAgzKYk8AAgzOzVMAAgzOAz8AAgzKYlMAAgzay+8AAgzKYkcAAgzhWwACDOIXdwACDOIXgwACDOIXiwACDOIXbwACDOIXnwACDOIXkwACDOIXxwACDOIXzwACDOIX1wACDOIWmwACDOIaTwACDOIZRwACDOIXpwACDOIWqwACDOIYAwACDMpiXwACDSQAAwACRS8AAg0vAAFkhwACDTJiUwACDTaTlwACDTbGKwACDTbL7wACDTYVnwACDTYbGwACDTapbwACDTJiRwACDVMAAS/DAAINUwABO28AAg1TAAEvswACDVLK+wACDVLIkwACDVMAATtzAAINUwABWvsAAg1ScC8AAg1TAAE7ewACDVKfIwACDVMAATMfAAINUnBLAAINUwABO38AAg1TAAE7gwACDVMAATbDAAINUmRTAAINUwABO4cAAg1TAAE7iwACDVMAATuPAAINUwABIYcAAg1TAAEzIwACDVMAATuTAAINUwABMxcAAg1S3z8AAg1TAAFabwACDVMAAS7XAAINUwABLtsAAg1TAAEuzwACDVMAAWSLAAINUwABZI8AAg1TAAFkkwACDVMAAWR3AAINUwABZHsAAg1S32sAAg0yYl8AAg3cAwACDS8AAWSXAAIN5mJPAAIN6J8AAg3rAAJFLwACDfCjAAIN6KcAAg3qwi8AAg3qwjMAAg3qwjcAAg3qwjsAAg3rAAEjtwACDeZiRwACDhCPAAIN5mJfAAIOGAADAAJFMwACDiJiRwACDicAAkUzAAIOKwABZgsAAg4nAAFmDwACDiMAAWS7AAIONmJPAAIOOesAAg46kusAAg47AAJFMwACDkcAAUYrAAIORs7/AAIORrw3AAIORwABWUsAAg5HAAFZTwACDkcAAUPXAAIORwABWVMAAg5HAAFZVwACDkcAAWS/AAIORwABWVsAAg5HAAFkwwACDkcAAWI3AAIORwABWXsAAg5HAAFZfwACDjpZ1wACDjobTwACDjoSBwACDjoSIwACDjqJawACDjoSAwACDjsAAVnXAAIOOpAfAAIOOs0vAAIOOwABWV8AAg47AAFZYwACDjsAAVlnAAIOOwABWWsAAg468WMAAg46zTcAAg47AAE3AwACDjZiUwACDsIVnwACDsKTlwACDsLL7wACDsMAAkUzAAIO0wABWfsAAg7TAAFaAwACDsIbGwACDsKpbwACDsKjiwACDsMAAVtjAAIOwsYrAAIOwwABZWMAAg42YkcAAg723hcAAg72yFsAAg73AAJFMwACDwMAAVoXAAIPAwABWiMAAg8DAAFaLwACDwMAAVo7AAIPAwABWjcAAg8CyHMAAg8DAAFaowACDwMAAVqbAAIPAwABWp8AAg8DAAFaswACDwMAAVq3AAIPAwABWr8AAg8DAAFkzwACDwMAAVrDAAIPAwABWscAAg8DAAFaywACDwMAAVrPAAIPAwABWtMAAg8DAAFk1wACDwMAAVsPAAIPAwABWycAAg8DAAFk5wACDwMAAWT7AAIPAwABZQcAAg8DAAFlEwACDwMAAWUnAAIPAwABZT8AAg8DAAFlVwACDwMAAWVvAAIPAwABZXMAAg72yIcAAg72yIMAAg73AAFkxwACDvbKzwACDvaFNwACDvbIkwACDvZwJwACDvZwSwACDvcAAVozAAIO9wABWkMAAg73AAE7fwACDvZwLwACDvcAATuDAAIO9p8jAAIO9wABWm8AAg73AAE7ewACDvcAATMfAAIO9wABL8MAAg73AAEvswACDvcAATubAAIO9wABO28AAg72yvsAAg73AAFajwACDvcAARiXAAIO9wABF/MAAg72yusAAg72yvcAAg73AAE6ZwACDvbLOwACDvcAARfvAAIO9wABWtcAAg73AAE6VwACDvcAARifAAIO9t9rAAIO9wABMxcAAg73AAE7kwACDvZkUwACDvcAATtzAAIO9wABZNsAAg73AAFa+wACDvcAAVrzAAIO9wABWvcAAg73AAFbBwACDvcAATuHAAIO9wABO4sAAg73AAE7jwACDvcAASGHAAIO9wABZOMAAg73AAEzIwACDvcAAVtLAAIO9wABNsMAAg73AAFaBwACDvcAAVorAAIO9wABWlsAAg73AAFaPwACDvcAAVpjAAIO9wABWf8AAg73AAFaXwACDvcAAVobAAIO9t8/AAIO9t+bAAIO9wABZWcAAg73AAFlawACDvcAAWR3AAIO9wABZJMAAg73AAFkewACDvcAAWSLAAIO9wABZI8AAg73AAEu1wACDvcAAS7bAAIO9wABLs8AAg73AAFk9wACDvcAAWUDAAIO9wABZQ8AAg73AAFZ0wACDvcAAWUvAAIO9wABZTcAAg73AAFlSwACDvcAAWVPAAIO9wABZVMAAg73AAFlXwACDjZiXwACEMADAAIOIwABZXsAAhDKYk8AAhDOzVMAAhDKYlMAAhDWeYsAAhDWyscAAhDWk6cAAhDWG08AAhDKYkcAAhDqZVcAAhDqyusAAhDqvE8AAhDqyu8AAhDqE6cAAhDqyvMAAhDqyvcAAhDqyJMAAhDqyvsAAhDqyv8AAhDqywcAAhDqywMAAhDqyxsAAhDqywsAAhDqhTcAAhDqyI8AAhDqytMAAhDqyucAAhDqyxcAAhDqytcAAhDqytsAAhDqyt8AAhDqyssAAhDqyIcAAhDqyIMAAhDqk5sAAhDqyFsAAhDqyx8AAhDqyycAAhDqyyMAAhDqyysAAhDqyy8AAhDqyw8AAhDKYl8AAhFwAwACDiMAAWV/AAIRemJPAAIRfpOXAAIRfsvvAAIRfpLrAAIRfsYrAAIRfwACRTMAAhGSxrcAAhF6YlMAAhGaCysAAhF6Yl8AAhGgAwACDiMAAWWDAAIRqmJPAAIRrwACRTMAAhGy3VMAAhGzAAFGKwACEbMAAVwvAAIRqmJHAAIRwwACRTMAAhHHAAFakwACEapiXwACEcwDAAIOIwABZYcAAhHWYk8AAhHbAAJFMwACEd7dUwACEd8AAUYrAAIR2vGnAAIR1mJTAAIR7svvAAIR7hWfAAIR7pLrAAIR7vM/AAIR1mJHAAISAwABGJcAAhIC8UsAAhIC8cMAAhIC8dMAAhIC8xcAAhHWYl8AAhIYAwACDiMAAWWLAAISImJPAAISJwACRTMAAhIrAAFljwACEirdUwACEirewwACEire2wACEiJiUwACEj8AAkUzAAISQrw3AAISQs7/AAISImJHAAISTt9vAAISTwACRTMAAhJXAAFlnwACElcAAWWXAAISVwABZbMAAhJXAAFlwwACElcAAWXHAAISVwABZbcAAhJXAAFlr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zcAAhjHAAFnKwACGMJiXwACGNgDAAIWjwABZ88AAhjiYkcAAhjmcwcAAhjnAAFm7wACGOcAAWc3AAIY5wABZysAAhjiYl8AAhj4AwACFo8AAWfXAAIZAmJHAAIZBnMHAAIZBwABZu8AAhkHAAFnNwACGQcAAWcrAAIZAmJfAAIZGAMAAhaPAAFn3wACGSJiRwACGScAAWbvAAIZJwABZvMAAhknAAFnNwACGScAAWcrAAIZImJfAAIZOAMAAhaPAAFn4wACGUJiRwACGUcAAWbzAAIZRnMHAAIZRwABZzcAAhlHAAFnKwACGUJiXwACGVgDAAIWjwABZ+sAAhliYkcAAhlmcwcAAhlnAAFnNwACGWcAAWcrAAIZYmJfAAIZdAMAAhaPAAFn8wACGX5iRwACGYJzBwACGYMAAWc3AAIZgwABZysAAhl+Yl8AAhmQAwACFo8AAWf7AAIZmmJHAAIZnnMHAAIZnwABZzcAAhmfAAFnKwACGZpiXwACGawDAAIWjwABaAMAAhm2YkcAAhm6cwcAAhm7AAFnNwACGbsAAWcrAAIZtmJfAAIZyAMAAhaPAAFoCwACGdJiRwACGdZzBwACGdcAAWbzAAIZ0mJfAAIZ4AMAAhaPAAFoFwACGepiRwACGe8AAWbzAAIZ6mJfAAIZ9AMAAhaPAAFoHwACGf5iRwACGgMAAWbzAAIaAwABZysAAhn+Yl8AAhoMAwACFo8AAWgjAAIaFmJHAAIaGwABZysAAhoWYl8AAhogAwACFo8AAWgrAAIaKmJHAAIaLwABZysAAhoqYl8AAho0AwACFo8AAWgzAAIaPmJHAAIaQwABZvMAAho+Yl8AAhpIAwACFo8AAWg7AAIaUmJHAAIaVnMHAAIaVwABZvMAAhpSYl8AAhpgAAMAAkVLAAIaawABaEMAAhpuYk8AAhpy4qcAAhpykCsAAhpuYkcAAhp+4q8AAhp/AAFoSwACGn7iAwACGn8AAWijAAIafwABaKcAAhp+4hsAAhpuYl8AAhqYAAMAAkVPAAIaomJHAAIapwABaMcAAhqnAAJFTwACGq8AAWjPAAIapwABaOsAAhqnAAFo7wACGqcAAWkLAAIapwABaQ8AAhqnAAEevwACGqcAAWlnAAIapwABaWwDAAJFUwACGtMAAWl7AAIa1mJPAAIa2J8AAhrbAAJFUwACGuCjAAIa2KcAAhrbAAFpfwACGtsAAWmDAAIa2wABaYcAAhrWYkcAAhr4jwACGtZiXwACGwADAAIa0wABaYsAAhsKYk8AAhsOCZ8AAhsOAvcAAhsO62cAAhsPAAFpfwACGw8AAWmDAAIbDwABaYcAAhsKYlMAAhsrAAFpjwACGyqTewACGwpiRwACGzSPAAIbNgwfAAIbNwABaZMAAhsKYl8AAhtEAwACGtMAAWmXAAIbTmJPAAIbUJ8AAhtTAAJFUwACG1ijAAIbUKcAAhtSdq8AAhtTAAFpmwACG1J24wACG1MAAWmfAAIbUwABaaMAAhtTAAFppwACG1MAAWmrAAIbUwABaa8AAhtTAAFpswACG1MAAWm3AAIbUwABabsAAhtTAAFpvwACG1MAAWnDAAIbUna/AAIbUwABaccAAhtSdBsAAhtTAAFpywACG1MAAWnPAAIbUwABadMAAhtSaIsAAhtSaIcAAhtTAAFp1wACG05iRwACG7yPAAIbTmJfAAIbxAMAAhrTAAFp2wACG85iTwACG9IJnwACG9IC9wACG9J2rwACG9MAAWmbAAIb0nbjAAIb0wABaZ8AAhvTAAFpowACG9MAAWmnAAIb0wABaasAAhvTAAFprwACG9MAAWmzAAIb0wABabcAAhvTAAFpuwACG9MAAWm/AAIb0wABacMAAhvSdr8AAhvTAAFpxwACG9J0GwACG9MAAWnLAAIb0wABac8AAhvTAAFp0wACG9JoiwACG9JohwACG9MAAWnXAAIbzmJTAAIcNwABaY8AAhw262cAAhvOYkcAAhxAjwACHEIMHwACHEMAAWnfAAIcQwABaZMAAhvOYl8AAhxXAAJFUwACHFoC1wACGtMAAWnjAAIcYmJTAAIcZwABaY8AAhxm62cAAhxiYl8AAhxwAwACGtMAAWnnAAIcemJTAAIcfwABaY8AAhx+62cAAhx6Yl8AAhyIAwACGtMAAWnrAAIckmJTAAIclwABaY8AAhyW62cAAhySYl8AAhygAAMAAkVXAAIcqmJPAAIcrwABae8AAhyvAAFp8wACHK8AAWn0AwACRVsAAhy/AAFp+wACHMJiTwACHMbNUwACHMaTlwACHMbd3wACHMbL7wACHMbdvwACHMbdzwACHMbNHwACHMbZ3wACHMbX8wACHMbu0wACHMcAAkVbAAIc8uwrAAIc8wABQ9sAAhzy7X8AAhzy7YMAAhzy7YcAAhzG7yMAAhzG7ucAAhzGz9cAAhzG3eMAAhzG3aMAAhzGqW8AAhzGk+sAAhzG7VMAAhzG7WcAAhzG7WsAAhzG7U8AAhzG7Z8AAhzG7ycAAhzGzEMAAhzG5hMAAhzCYlMAAh1G3cMAAh1G0vcAAh1G7ZcAAh1G7aMAAh1G7asAAhzCYkcAAh1e1lcAAh1e7a8AAh1e7bMAAh1ezAcAAh1e7Y8AAh1e7ZMAAhzCYl8AAh14AAMAAkSfAAIdgmJLAAIdhwABagcAAh2CFqMAAh2OYk8AAh2QnwACHZMAAkSfAAIdmKMAAh2QpwACHZMAAWoPAAIdkwABahMAAh2TAAFqFwACHZMAAWobAAIdjmJHAAIdtI8AAh2OYl8AAh28AwACHYL2swACHcZiTwACHcoPnwACHcsAATXbAAIdywABaiMAAh3KwnMAAh3LAAE6UwACHcsAAkSfAAId4wABK2sAAh3jAAFqJwACHeMAAWorAAId4wABai8AAh3KZwsAAh3LAAFdiwACHcZiRwACHf7WFwACHf8AAkSfAAIeBwABakcAAh4HAAFqSwACHgcAAWp3AAId/rs/AAId/wABajMAAh3+DF8AAh3/AAE55wACHf8AATnrAAId/wABOfsAAh3/AAE5zwACHf7YlwACHf4QswACHf7NTwACHfyPAAIdxmJTAAIeQu4fAAIeQu4jAAIeQtkzAAIeQwABOXsAAh5DAAE59wACHkMAAWpjAAIeQqPXAAIdxmJXAAIeYu4fAAIeYu4jAAIdxmJbAAIebrs7AAIdxmJfAAIedAMAAh2CbtMAAh5+Yk8AAh6CD58AAh6CD7sAAh6DAAJEnwACHo8AAWqTAAIejwABapcAAh6PAAFqmwACHn5iWwACHp67OwACHn5iRwACHqa7PwACHqcAATnnAAIepwABOeMAAh6nAAE56wACHqZtCwACHqcAATn/AAIepwABOfsAAh6nAAE5zwACHqcAAToLAAIepwABOgcAAh6nAAE6XwACHqa3mwACHqbYmwACHqcAAkSfAAIe3wABarMAAh6kjwACHn5iUwACHupnCwACHusAAToDAAIe6wABOh8AAh7rAAFc3wACHusAATqTAAIefmJfAAIfAAMAAh2DAAFqxwACHwpiTwACHw4bSwACHw6vFwACHw8AAWpnAAIfCmJTAAIfHXMAAh8KYl8AAh8kAwACHYMAAWrPAAIfLmJPAAIfMg8zAAIfMwABVE8AAh8ygzcAAh8uYlMAAh9CG0sAAh9DAAFqZwACH0KvFwACH0MAAWo/AAIfQXsAAh8uYkcAAh9ZdwACH1sAAkSfAAIfYwABatMAAh9jAAFq1wACHy5iXwACH2wDAAIdgwABatsAAh92Yk8AAh97AAE6WwACH3qvFwACH3sAAWpnAAIfdmJTAAIfiXMAAh92Yl8AAh+TAAFq3wACHYMAAWrfAAIfmmJPAAIfng8zAAIfniD/AAIfnwABauMAAh+aYlMAAh+vAAFqZwACH66vFwACH617AAIfmmJHAAIfvXcAAh+aYl8AAh/EAwACHYMAAWrnAAIfzmJPAAIf0J8AAh/TAAJEnwACH9ijAAIf0KcAAh/SdGcAAh/TAAFq6wACH9MAAWrvAAIfzmJHAAIf8I8AAh/OYl8AAh/4AwACHYMAAWrzAAIgAmJHAAIgBS8AAiAGAv8AAiAGZFcAAiAGEWcAAiAGCQsAAiACYlMAAiAeDYsAAiACYl8AAiAkAwACHYMAAUE/AAIgLmJPAAIgMwACRJ8AAiA3AAFBWwACIC5iXwACIDwAAwACRV8AAiBHAAFrCwACIEpiRwACIE8AAV0rAAIgTwABXTcAAiBPAAFdSwACIE8AAV0vAAIgTwABXU8AAiBPAAFdQwACIE8AAV1bAAIgTwABXTMAAiBKYl8AAiBwAAMAAkVjAAIgewABaxMAAiB+Yk8AAiCAnwACIIMAAkVjAAIgiKMAAiCApwACIIMAAWsnAAIggwABaysAAiCDAAFrLwACIILwVwACIH5iRwACIKSPAAIgfmJfAAIgrAMAAiB7AAFrMwACILZiTwACILrxYwACILrxbwACILZiXwACIMQDAAIgewABazcAAiDOYlMAAiDSCZ8AAiDOYkcAAiDa8VMAAiDa8UMAAiDaETcAAiDOYl8AAiDoAwACIHsAAWs7AAIg8mJHAAIg9mofAAIg9wABaz8AAiD3AAFrQwACIPcAAWtHAAIg9wABa0sAAiDyYl8AAiEMAwACIHsAAWtPAAIhFmJPAAIhGgpDAAIhGwABa1MAAiEa8WMAAiEa8W8AAiEbAAFrVwACIRZiUwACITIJnwACITIPBwACIRZiRwACIT7xUwACIT7xQwACIT4RNwACIT0jAAIhPI8AAiE+HQMAAiE/AAFrdwACIRZiXwACIVwDAAIgewABa4cAAiFmYk8AAiFrAAFrUwACIWsAAWuLAAIhZmJTAAIhdgmfAAIhdg8HAAIhZmJHAAIhgvFTAAIhgvFDAAIhghE3AAIhgSMAAiGAjwACIWZiXwACIZgDAAIgewABa5MAAiGiYk8AAiGnAAFrlwACIaJiUwACIa4JnwACIa4PBwACIaJiRwACIbrxUwACIbrxQwACIboRNwACIbkjAAIhuI8AAiGiYl8AAiHQAwACIHsAAWufAAIh2mJTAAIh3gmfAAIh2mJHAAIh5hE3AAIh5vFDAAIh5vFTAAIh2mJfAAIh9AADAAJFZwACIf6lpwACIgJiUwACIgbL7wACIgYVnwACIgcAAWurAAIiBvM/AAIiBvGnAAIiAmJHAAIiHvMXAAIiHvHTAAIiHvHDAAIiHvFLAAIiHwABGJcAAiIe8a8AAiIehicAAiIelPsAAiIe8VcAAiIe8ScAAiIe8b8AAiICYl8AAiJMAwACIf8AAWuvAAIiVmJPAAIiWwACRWcAAiJfAAFrswACIl8AAWu3AAIiWwABa6sAAiJbAAFalwACIlZiUwACInLxpwACInKS6wACInMAAkVnAAIifwABa7sAAiJWYkcAAiKG8b8AAiKG8VcAAiKG8ScAAiKGlPsAAiKGhicAAiKG8a8AAiJWYl8AAiKgAwACIf8AAWu/AAIiqmJPAAIirwABa1MAAiKu0acAAiKtbwACIqpiRwACIr7y7wACIr7y3wACIryPAAIiqmJfAAIizAADAAJC5wACItb0FwACItpiUwACIt5rPwACIt4VqwACIt4YKwACIt5rOwACItpiRwACIvJrfwACIvJsCwACIvL3DwACIvKpWwACIvMAAkLnAAIjBvcTAAIjBvcfAAIjBvcbAAIjBvcXAAIi2mJfAAIjGAADAAJFawACIyL0HwACIyZiTwACIyodlwACIyoRSwACIyr3iwACIyoJnwACIysAAkVrAAIjPwABa+MAAiMmYlMAAiNGAvcAAiNGE+cAAiMmYkcAAiNSha8AAiNTAAJFawACI1sAAWvnAAIjWwABbA8AAiNbAAFr8wACI1sAAWxHAAIjWwABa+sAAiNTAAFr7wACI1MAAWv7AAIjUwABbDsAAiNTAAFsPwACIyZiXwACI4AAAwACRW8AAiOK9CMAAiOOYk8AAiOSHZcAAiOOYkcAAiOa92cAAiObAAFsUwACI5sAAWyHAAIjmwABbI8AAiOOYl8AAiOsAwACI4sAAWyTAAIjtmJHAAIjuwABbF8AAiO7AAFsYwACI7sAAWxrAAIjuwABbHcAAiO7AAFsbwACI7sAAWxnAAIjuwABbHMAAiO7AAFsewACI7ZiXwACI9wDAAIjiwABbJ8AAiPmYkcAAiPrAAFsawACI+sAAWxzAAIj6wABbGcAAiPrAAFsdwACI+sAAWxfAAIj6wABbG8AAiPrAAFsewACI+sAAWxjAAIj5mJfAAIkDAMAAiOLAAFspwACJBZiRwACJBsAAWxvAAIkGwABbGsAAiQbAAFsXwACJBsAAWxnAAIkGwABbHcAAiQbAAFscwACJBsAAWx7AAIkGwABbGMAAiQWYl8AAiQ8AwACI4sAAWzbAAIkRmJHAAIkSwABbHMAAiRLAAFsdwACJEsAAWxrAAIkSwABbF8AAiRLAAFsbwACJEsAAWxnAAIkSwABbHsAAiRLAAFsYwACJEZiXwACJGwDAAIjiwABbN8AAiR2YkcAAiR7AAFsawACJHsAAWxfAAIkewABbG8AAiR7AAFsZwACJHsAAWx3AAIkewABbHMAAiR7AAFsewACJHsAAWxjAAIkdmJfAAIknAMAAiOLAAFs4wACJKZiRwACJKsAAWxrAAIkqwABbGcAAiSrAAFsXwACJKsAAWxjAAIkqwABbHMAAiSrAAFsbwACJKsAAWx3AAIkqwABbHsAAiSmYl8AAiTMAwACI4sAAWzzAAIk1mJHAAIk2wABbHcAAiTbAAFscwACJNsAAWxrAAIk2wABbF8AAiTbAAFsbwACJNsAAWxnAAIk2wABbHsAAiTbAAFsYwACJNZiXwACJPwAAwACRXMAAiUG+acAAiUKYk8AAiUOt18AAiUKYkcAAiUWiEcAAiUKYl8AAiUcAAMAAkV3AAIlJmJHAAIlKvngAwACRXsAAiUzAAFtCwACJTZiTwACJToJOwACJTZiRwACJUMAAQLTAAIlQwABAxMAAiVDAAEC9wACJUMAAQLvAAIlQwABAv8AAiVDAAEDywACJUMAAQPDAAIlNmJfAAIlYAMAAiUzAAFtLwACJWpiTwACJWyfAAIlbwACRXsAAiV0owACJWynAAIlbwABbTMAAiVuhvsAAiVuEdsAAiVvAAFtNwACJW77RwACJW76BwACJW8AAW07AAIlamJHAAIlnI8AAiVqYl8AAiWkAAMAAkV/AAIlrwABAisAAiWyYk8AAiW2ob8AAiW3AAEHlwACJbJiVwACJcMAAQDTAAIlsmJTAAIlygKzAAIlsmJHAAIl0wABANcAAiXSjOcAAiXTAAEA2wACJdKFwwACJdKwbwACJdKwVwACJdKFnwACJdKFswACJdKKdwACJdL7twACJdL7pwACJdL8qwACJdMAAQEPAAIl0wABARMAAiXSicMAAiXTAAEBbwACJdMAAQFrAAIl0otHAAIl0otLAAIl0wABAScAAiXSsHMAAiXSsHsAAiXSsKsAAiXTAAEBMwACJdMAAQE3AAIl0vvPAAIl0v0/AAIl0oeTAAIl0rBnAAIl0rCfAAIl0oxHAAIl0onrAAIl0oo/AAIl0opfAAIl0rBfAAIl0rCTAAIl0owHAAIl0wABAUsAAiXSiWcAAiXS/SMAAiXSijMAAiXTAAEBTwACJdKLhwACJdMAAQFXAAIl0otPAAIl0wABAWMAAiXTAAEBcwACJdKEVwACJdKESwACJdKMqwACJdMAAQGPAAIl0obDAAIl0wABAccAAiXSi/sAAiXTAAEBnwACJdKDgwACJdMAAQGjAAIl0v0DAAIl0vvDAAIl0ov/AAIl0vyzAAIl0os/AAIl0wABAacAAiXTAAEBqwACJdMAAQGvAAIl0wABAbMAAiXTAAEBywACJdMAAQG3AAIl0wABAb8AAiXSjRsAAiXSjSMAAiXTAAEBwwACJdKLiwACJdKHQwACJdMAAQHXAAIl0vzrAAIl0wABAdsAAiXTAAEB7wACJdMAAQFTAAIl0o3bAAIl0wABAfMAAiXTAAEBdwACJdKHswACJdKwdwACJdKwhwACJdMAAQH/AAIl0wABAgcAAiXShUsAAiXSjO8AAiXSiIMAAiXSiIsAAiXShc8AAiXSh8sAAiXShA8AAiXShacAAiXShbsAAiXSinsAAiXS+78AAiXS+6sAAiXS+wcAAiXTAAEBGwACJdKJ0wACJdL6vwACJdL6ywACJdKLgwACJdKLUwACJdKLBwACJdKMMwACJdKwgwACJdKwrwACJdL73wACJdL7OwACJdL72wACJdL7SwACJdKHlwACJdKD5wACJdKIMwACJdKMmwACJdKwpwACJdKMZwACJdKMSwACJdKJ8wACJdKKQwACJdKKYwACJdKIXwACJdKwmwACJdKMLwACJdKL4wACJdKJgwACJdL6YwACJdKKNwACJdL6+wACJdKLkwACJdKLnwACJdKHUwACJdKLbwACJdL7JwACJdKHpwACJdKEWwACJdKETwACJdKMuwACJdL6qwACJdKGzwACJdKJJwACJdKMJwACJdKECwACJdKDjwACJdKDvwACJdL7ewACJdL7ywACJdKMIwACJdL76wACJdKLWwACJdKKIwACJdL7QwACJdL5+wACJdL7XwACJdKMvwACJdKHMwACJdL67wACJdKNawACJdKNUwACJdKNYwACJdKHSwACJdMAAQHPAAIl0oPLAAIl0vqHAAIl0oqvAAIl0ou/AAIl0vo3AAIl0o3jAAIl0o3vAAIl0odvAAIl0oe/AAIl0ozXAAIl0rCPAAIl0o0PAAIl0omXAAIl0ofTAAIl0oiPAAIl0o2TAAIl0o2LAAIl0oqDAAIl0vzPAAIl0v1LAAIl0vpTAAIl0vy3AAIl0vpLAAIl0wABAhsAAiXTAAECCwACJdKJzwACJdKNtwACJdMAAQEXAAIl0vqzAAIl0ouPAAIl0ocfAAIl0ozfAAIl0wABAgMAAiXShysAAiXShUcAAiXTAAEBOwACJdKMzwACJdKIAwACJdKIDwACJdKIFwACJdKMUwACJdKIHwACJdKKVwACJdL8+wACJdKGSwACJdL65wACJdL7DwACJdKK0wACJdMAAQGXAAIl0wABAX8AAiXSjj8AAiXS+58AAiXS+t8AAiXSjg8AAiXSh88AAiXS+gsAAiXSi8cAAiXTAAEBhwACJdKJpwACJdKMowACJdKI7wACJdKI+wACJdKHCwACJdKImwACJdKJFwACJdKJBwACJdKIzwACJdL9UwACJdL81wACJdKL2wACJdL6PwACJdKG4wACJdL7YwACJdL7awACJdL7cwACJdL6EwACJdMAAQIjAAIl0vojAAIl0oebAAIl0vpbAAIl0vqjAAIl0oRDAAIl0vyTAAIl0ok/AAIl0vorAAIl0vobAAIl0o3/AAIl0oeDAAIl0o4zAAIl0vrTAAIl0oVTAAIl0oVfAAIl0oazAAIl0ohHAAIl0vzHAAIl0vs3AAIl0vzLAAIl0ob3AAIl0oVrAAIl0ourAAIl0ob/AAIl0obHAAIl0ovTAAIl0o43AAIl0ovPAAIl0onfAAIl0olLAAIl0o3fAAIl0or/AAIl0orzAAIl0orjAAIl0rAPAAIl0opPAAIl0omPAAIl0wABAM8AAiXSiVMAAiXSg+MAAiXSiUcAAiWyYl8AAipAAAMAAkWDAAIqSmJPAAIqTwABAj8AAipKYkcAAipXAAECNwACKlcAAQI7AAIqSwABAjMAAipiYk8AAipnAAEG+wACKmcAAQb/AAIqYmJHAAIqcgwfAAIqcwABBwMAAipiYl8AAip8AAMAAkWHAAIqhwABAkMAAiqKYk8AAiqMnwACKo8AAkWHAAIqlKMAAiqMpwACKo8AAW1LAAIqjwABbU8AAiqPAAFtUwACKopiRwACKqyPAAIqimJfAAIqtAADAAJFiwACKr5iRwACKsJ1cwACKr8AAQJHAAIqymJPAAIqzoUDAAIqzvu7AAIqzv1DAAIqzoPTAAIqzvzvAAIqzwABbVcAAirOg9cAAirOie8AAirOg88AAirPAAFtWwACKs8AAW1fAAIqymJXAAIq/wABBacAAir+g9sAAirKYlMAAisKg9sAAirKYkcAAisTAAEFfwACKxMAAQRPAAIrEwABBasAAisTAAEFAwACKxMAAQdPAAIrEwABMdcAAisTAAFtcwACKxMAAW13AAIrEwABbXsAAisTAAFtfwACKxMAAW2DAAIrEwABbYcAAisTAAFtiwACKxMAAW2PAAIrEwABbZMAAisTAAFtnwACKxMAAW1vAAIrEwABbZsAAirKYl8AAitcAAMAAkWPAAIrZwABAksAAitqYk8AAitu/NMAAitu+/MAAitu+kMAAitqYkcAAit+CQsAAit+/M8AAit+/LcAAit++ksAAitqYl8AAiuQAwACK2cAAQJPAAIrmmJPAAIrnvsXAAIrnvsTAAIrnrXLAAIrnwABA48AAiuaYkcAAiuyCQsAAiuy+r8AAiuy+vsAAiuy+u8AAiuy+w8AAiuaYl8AAivIAwACK2cAAQJTAAIr0mJPAAIr1oqHAAIr1vvzAAIr0mJHAAIr4gkLAAIr4vy3AAIr4vzXAAIr0mJfAAIr8AADAAJFkwACK/sAAW2zAAIr/mJHAAIsAwABAx8AAiwDAAEEEwACLAMAAQUXAAIsAwABBOsAAiv+Yl8AAiwUAwACK/sAAQJXAAIsHmJHAAIsIwABA5sAAiwjAAEE6wACLCMAAQOnAAIsIwABBWcAAiwjAAJFkwACLDcAAW3LAAIsHmJfAAIsPAMAAiv7AAFtzwACLEZiRwACLEsAAQMfAAIsSwABBBMAAixLAAEFFwACLEsAAQTrAAIsRmJfAAIsXAMAAiv7AAFt0wACLGZiRwACLGsAAQObAAIsawABBOsAAixrAAEDpwACLGsAAQVnAAIsawACRZMAAix/AAFtywACLGZiXwACLIQDAAIr+wABbd8AAiyOYkcAAiyTAAEDHwACLJMAAQQTAAIskwABBRcAAiyTAAEE6AMAAkWXAAIspmJPAAIsqwABAnMAAiyrAAECdwACLKsAARPbAAIspmJHAAIsuwABbfMAAiy7AAECbwACLLsAAQJnAAIsuwABAmsAAiy7AAECYwACLKcAAQJbAAIs0mJTAAIs1wABB0MAAizXAAEHVwACLNbWYwACLNJiRwACLOcAAQSXAAIs5wABA78AAiznAAFt5wACLOcAAQQDAAIs5wABA/cAAizSYl8AAiz8AwACLKcAAQJfAAItBmJTAAItCwABbesAAi0KVYsAAi0LAAED8wACLQZiRwACLRsAAQPrAAItGwABA/8AAi0aWKcAAi0GYl8AAi0oAAMAAkWbAAItMmJHAAItNwABbocAAi03AAFuiwACLTcAAW6PAAItMwABbhcAAi1GYkcAAi1LAAEDZwACLUZiXwACLVADAAItMwABbhsAAi1aYkcAAi1fAAEDZwACLVpiXwACLWQDAAItMwABbh8AAi1uYkcAAi1zAAEDZwACLW5iXwACLXgDAAItMwABbiMAAi2CYkcAAi2HAAEDZwACLYJiXwACLYwDAAItjuNjAAItjwABbicAAi0zAAFuKwACLZ5iRwACLaMAAQNnAAItnmJfAAItqAMAAi2q42MAAi0zAAFuLwACLbZiRwACLbsAAQNnAAIttmJfAAItwAMAAi0zAAFuMwACLcpiRwACLc8AAQNnAAItymJfAAIt1AMAAi0zAAFuNwACLd5iRwACLeMAAQNnAAIt3mJfAAIt6AMAAi3q42MAAi0zAAFuOwACLfZiRwACLfsAAQNnAAIt9mJfAAIuAAMAAi0zAAFuPwACLgpiRwACLg8AAQNnAAIuCmJfAAIuFAMAAi0zAAFuQwACLh5iRwACLiMAAQNnAAIuHmJfAAIuKAMAAi0zAAFuRwACLjJiRwACLjcAAQNnAAIuMmJfAAIuPAMAAi0zAAFuSwACLkZiRwACLksAAQNnAAIuRmJfAAIuUAMAAi5S42MAAi0zAAFuTwACLl5iRwACLmMAAQNnAAIuXmJfAAIuaAMAAi5q42MAAi0zAAFuUwACLnZiRwACLnsAAQNnAAIudmJfAAIugAMAAi0zAAFuVwACLopiRwACLo8AAQNnAAIuimJfAAIulAMAAi0zAAFuWwACLp5iRwACLqMAAQNnAAIunmJfAAIuqAMAAi6q42MAAi6rAAED0wACLqsAAQPXAAItMwABbl8AAi6+YkcAAi7DAAEDZwACLr5iXwACLsgDAAItMwABbmMAAi7SYkcAAi7XAAEDZwACLtJiXwACLtwDAAIu3uNjAAIu3wABbicAAi0zAAFuZwACLu5iRwACLvMAAQNnAAIu7mJfAAIu+AMAAi7642MAAi77AAEIewACLTMAAW5rAAIvCmJHAAIvDwABA2cAAi8KYl8AAi8UAwACLTMAAW5vAAIvHmJPAAIvIwABbnMAAi8eYkcAAi8rAAEDZwACLx5iXwACLzADAAItMwABbncAAi86YkcAAi8/AAEDZwACLzpiXwACL0QDAAItMwABbnsAAi9OYkcAAi9TAAEDZwACL05iXwACL1gDAAIvWuNjAAIvWwABbn8AAi0zAAFugwACL2piRwACL28AAQNnAAIvamJfAAIvdAADAAJFnwACL35iSwACL4MAAW6/AAIvfwABbtMAAi+KYk8AAi+PAAJFnwACL5LGtwACL5KSdwACL5K8NwACL5LO/wACL5LODwACL5MAAW7XAAIvkt1bAAIvkwABSicAAi+TAAEeUwACL5MAAUPbAAIvkwABS48AAi+TAAFu2wACL5MAAUx7AAIvkwABbt8AAi+S7B8AAi+S3VcAAi+TAAFu4wACL5LdXwACL5LeTwACL5LVlwACL5Le6wACL5MAAUzXAAIvkt5XAAIvkwABXK8AAi+TAAEiPwACL5MAAVn7AAIvkwABbucAAi+TAAFu6wACL5Ju1wACL5MAAW7vAAIvkwABbvMAAi+TAAFu9wACL5MAAW77AAIvjwABCesAAi+KYkcAAjAfAAFu/wACMB8AAkWfAAIwJwABb3cAAjAnAAFvBwACMCcAAW+LAAIwJwABb48AAjAnAAFvYwACMCcAAW/PAAIwJwABb28AAjAnAAFv3wACMCcAAW/XAAIwJwABb+sAAjAnAAFv2wACMCcAAW//AAIwJwABb9MAAjAnAAFvVwACMCcAAXADAAIwJwABcFsAAjAnAAFvLwACMCcAAXDTAAIwJwABcNcAAjAnAAFw2wACMCcAAXB7AAIwJwABcP8AAjAnAAFxBwACMCcAAXCbAAIwJwABcA8AAjAnAAFvmwACMCcAAXBHAAIwJwABcFcAAjAnAAFwSwACMCcAAXBDAAIwJwABbyMAAjAnAAFvKwACL4piXwACMKgDAAIvfwABcV8AAjCyYk8AAjC3AAJFnwACMLrGtwACMLrO/wACMLq8NwACMLrODwACMLsAAW7XAAIwut1fAAIwuwABDiMAAjC7AAEeUwACMLsAAUuPAAIwuuwfAAIwutWXAAIwuwABbucAAjC7AAFu4wACMLsAAVyvAAIwts//AAIwtwABcGMAAjC3AAFvDwACMLcAAW8fAAIwtwABbxcAAjC3AAFvJwACMLcAAXFjAAIwtwABb5MAAjC3AAFkOwACMLJiRwACMRsAAW9PAAIxGwABcWsAAjEbAAFxewACMRsAAXF/AAIxGwABcYcAAjEbAAFxmwACMRsAAXGjAAIxGwABcb8AAjEbAAFFbwACMLJiXwACMUADAAIvfwABccMAAjFKYk8AAjFPAAJFnwACMVLGtwACMVK8NwACMVLO/wACMVMAAW7XAAIxUwABHlMAAjFS3V8AAjFS1ZcAAjFKYkcAAjFzAAFxRwACMXMAAXHTAAIxcwABcdcAAjFzAAFx3wACMXMAAXHbAAIxSmJfAAIxiAMAAi9/AAFx4wACMZJiTwACMZYSBwACMZYSIwACMZJiXwACMaADAAIvfwABcecAAjGqYk8AAjGvAAJFnwACMbJyGwACMbMAAXHrAAIxswABce8AAjGuAvcAAjGuzRcAAjGqYkcAAjHLAAJFnwACMc8AAXHzAAIxyhIvAAIxyhIrAAIxyg/jAAIxqmJTAAIx4YcAAjGqYl8AAjHqB58AAjHqZ+sAAi9/AAFx9wACMfZiTwACMfsAAkWfAAIx/suzAAIx/wABXK8AAjH/AAFx+wACMf8AAXH/AAIx/wABcgMAAjH/AAFyBwACMfsAAW9bAAIx9mJTAAIyHwABb3sAAjIfAAFvawACMh8AAW9zAAIx9mJHAAIyLwACRZ8AAjIzAAFyCwACMi8AAW8LAAIyLwABbxMAAjIvAAFvGwACMi8AAXFTAAIyLwABb+8AAjH2Yl8AAjJMAAMAAkWjAAIyVwABchsAAjJaYk8AAjJfAAJFowACMmLdXwACMlpiRwACMmsAAXIfAAIyawABcicAAjJrAAFyKwACMmsAAQ5vAAIyawABDmcAAjJrAAEOXwACMmsAAQ5jAAIyawABDlcAAjJrAAEOcwACMmsAAQ53AAIyawABDnsAAjJrAAEOawACMmsAAQ6DAAIyWmJfAAIyoAMAAjJXAAEVDwACMqpiTwACMq8AAkWjAAIyswABIj8AAjKzAAFyNwACMqpiRwACMr69gwACMr69iwACMqpiXwACMsgDAAIyVwABcj8AAjLSYk8AAjLXAAJFowACMtqSdwACMtrVlwACMtsAAUx7AAIy2wABbt8AAjLa3k8AAjLbAAEOIwACMtcAAQ6HAAIy0mJTAAIy+wACRaMAAjL+3V8AAjLSYkcAAjMHAAEOUwACMwcAAQ6PAAIzBwABDpsAAjMHAAEOlwACMwa9gwACMwa9iwACMwcAAQ6TAAIzBwABDosAAjMG0DMAAjLSYl8AAjMsAAMAAkWnAAIzNwABcmMAAjM6YlMAAjM+Dz8AAjM+AlsAAjM/AAJFpwACM0sAASSDAAIzOmJHAAIzUwABGOsAAjM6Yl8AAjNYAwACMzcAAXJnAAIzYmJPAAIzZwACRacAAjNqXBsAAjNrAAEkgwACM2YPPwACM2JiUwACM3sAAR4/AAIzegJbAAIzewABH38AAjNiYkcAAjOKha8AAjOLAAEY6wACM4oJLwACM4iPAAIzYmJfAAIznAMAAjM3AAFydwACM6ZiTwACM6sAAkWnAAIzrlwbAAIzpmJHAAIztwABcnsAAjOmYlMAAjO+AlsAAjO+vjMAAjOmYl8AAjPIAwACMzZ5gwACM9JiTwACM9cAAkWnAAIz2sa3AAIz2wABDiMAAjPbAAFMewACM9sAAW7fAAIz2rw3AAIz2wABcn8AAjPbAAFygwACM9sAAXKHAAIz2wABcosAAjPWkusAAjPSYkcAAjQHAAFyjwACNAcAAXKTAAI0BwABcpcAAjQHAAFxFwACNAcAAXKjAAI0BwABcqcAAjQHAAJFpwACNCMAAXKbAAI0IwABcrMAAjQjAAFywwACNAcAAXKfAAI0BwABGN8AAjPSYl8AAjQ4AAMAAkWrAAI0QwABct8AAjRGYk8AAjRLAAEgYwACNEsAAW97AAI0SwABb5MAAjRLAAFvfwACNEsAAW+XAAI0SwABb78AAjRLAAFy4wACNEsAAkWrAAI0awABcucAAjRLAAFvgwACNEZiRwACNHcAAXLrAAI0dwABcu8AAjRGYlMAAjSDAAFy8wACNIMAAW9nAAI0gwABb18AAjRGYl8AAjSQAwACNEMAAXL3AAI0mmJPAAI0ngL3AAI0nJ8AAjSfAAFxWwACNJ8AAW/zAAI0mmJHAAI0sI8AAjSaYl8AAjS4AwACNEMAAXL/AAI0wmJPAAI0xs0XAAI0xhtPAAI0xmSzAAI0xwABb+cAAjTHAAFzAwACNMcAAXMHAAI0wmJTAAI04wABcwsAAjTCYl8AAjToAwACNEMAAXMPAAI08mJPAAI09wABcxMAAjTyYlMAAjT/AAFzCwACNPJiRwACNQSPAAI08mJfAAI1DAMAAjRDAAFzGwACNRZiTwACNRoC9wACNRZiUwACNSMAAXMLAAI1FmJHAAI1KI8AAjUWYl8AAjUwAwACNEIaXwACNTpiTwACNT4C9wACNT8AAUVnAAI1PgJbAAI1OmJHAAI1TI8AAjU6Yl8AAjVUAwACNEMAAXMnAAI1XmJTAAI1YwABcFMAAjVeYl8AAjVoAwACNEIR2wACNXJiTwACNXZYgwACNXYCswACNXcAAXA/AAI1dhIHAAI1dwABcFMAAjVyYkcAAjWMjwACNXJiXwACNZQDAAI0QwABCLsAAjWeYk8AAjWiWIMAAjWiAvcAAjWjAAEeQwACNaMAAUVnAAI1ogpPAAI1ohBvAAI1owABM/MAAjWjAAFv9wACNZ5iRwACNcSPAAI1nmJfAAI1zAMAAjRCEysAAjXWYk8AAjXaWIMAAjXaAvcAAjXbAAFFZwACNdsAAkWrAAI16wABczcAAjXrAAFzOwACNdsAASCPAAI12hIPAAI12u1TAAI12wABcz8AAjXbAAFwswACNdsAAXALAAI12wABcIsAAjXbAAFwUwACNdsAAXBnAAI12wABcF8AAjXa7h8AAjXaGSMAAjXbAAFwawACNdsAAXDPAAI12stHAAI12wABcMsAAjXbAAEz3wACNdsAAXNDAAI12wABc0cAAjXbAAFzSwACNdZiUwACNkcAAW87AAI2RhObAAI2RrJvAAI2RwABc08AAjZHAAFzUwACNdZiRwACNl8AAW8zAAI2XwABb0MAAjZcjwACNdZiXwACNmwDAAI0QwABc1sAAjZ2YlMAAjZ7AAFvOwACNnZiRwACNoCPAAI2dmJfAAI2iAMAAjRCFAMAAjaSYk8AAjaWWIMAAjaWAvcAAjaXAAFuwwACNpcAAXE7AAI2lwABcT8AAjaXAAFuzwACNpcAAXFDAAI2lwABMzsAAjaXAAEgiwACNpJiUwACNr8AAW7HAAI2vwABcLsAAja/AAFzYwACNr8AAXNnAAI2vwABc2sAAja/AAFzbwACNr8AAXNzAAI2vwABc3cAAjaSYkcAAjbgjwACNpJiXwACNugDAAI0QhTnAAI28mJPAAI29liDAAI29gL3AAI29gpPAAI28mJfAAI3BAMAAjRDAAFzfwACNw5iTwACNxMAAXELAAI3EwABcOcAAjcTAAFzgwACNxMAAXDzAAI3EwABcQMAAjcSFNcAAjcSFGcAAjcTAAFw3wACNxKBYwACNw5iUwACNzoQZwACNw5iXwACN0ADAAI0QwABc4cAAjdKYk8AAjdPAAFw9wACN08AAXDrAAI3TuZPAAI3SmJTAAI3XhBnAAI3SmJHAAI3ZI8AAjdKYl8AAjdsAwACNEMAAXOTAAI3dmJHAAI3eI8AAjd2Yl8AAjeAAwACNEMAAXObAAI3imJPAAI3joFjAAI3imJHAAI3lI8AAjeKYl8AAjecAwACNEMAAQizAAI3pmJTAAI3qwABRWcAAjemYl8AAjewAwACNEMAAXOrAAI3umJPAAI3vwABRWcAAje6YlMAAjfGEGcAAje6YkcAAjfMjwACN7piXwACN9QDAAI0QwABc7MAAjfeYk8AAjfjAAFFZwACN95iRwACN+iPAAI33mJfAAI38AADAAJFrwACN/sAAQ4TAAI3/mJPAAI4AwACRa8AAjgG3WcAAjgG1ZcAAjgG3VsAAjgDAAFzvwACOAJtCwACOAMAAUw3AAI4Ard/AAI3/mJTAAI4JwACRa8AAjgqzv8AAjgqvDcAAjgrAAEeUwACOCsAAUuPAAI3/mJHAAI4PwABb1MAAjg/AAFz1wACOD8AAXPbAAI4PwABc/8AAjg/AAF0DwACOD8AAXQfAAI4PwABdCMAAjf+Yl8AAjhcAAMAAkWzAAI4ZwABDhcAAjhqYk8AAjhvAAJFswACOHK8NwACOHMAAW7nAAI4csa3AAI4cwABbtsAAjhqYlMAAjiHAAEOSwACOIcAAQ5PAAI4amJHAAI4kwABDj8AAjiTAAEOOwACOGpiXwACOJwAAwACRbcAAjinAAF0NwACOKpiTwACOK8AAkW3AAI4slxbAAI4qmJfAAI4uAMAAjinAAF0OwACOMJiUwACOMacYwACOMYPBwACOMJiXwACONADAAI4pwABagMAAjjaYlMAAjjfAAEP9wACON4PBwACONpiXwACOOgDAAI4pwABdD8AAjjyYlMAAjj23isAAjj2DwcAAjjyYl8AAjkAAwACOKcAAXRDAAI5CmJfAAI5DAMAAjinAAF0RwACORZiXwACORgDAAI4pwABdEsAAjkiYl8AAjkkAwACOKcAAXRPAAI5LmJTAAI5MwABEAsAAjkuYl8AAjk4AwACOKcAAXRTAAI5QmJTAAI5RwABD/8AAjlCYl8AAjlMAwACOKcAAXRXAAI5VmJTAAI5WwABEXMAAjlWYl8AAjlgAwACOKcAAXRbAAI5amJPAAI5bwACRbcAAjly7nsAAjlynpcAAjlyXFMAAjlqYkcAAjmC3i8AAjmCCiMAAjlqYlMAAjmOYgMAAjmNhwACOWpiXwACOZgDAAI4pwABdF8AAjmiYkcAAjmnAAEvqwACOacAAS9jAAI5pg/jAAI5omJfAAI5tAMAAjinAAF0bwACOb5iTwACOcMAAkW3AAI5xtpfAAI5vmJHAAI5zwABL7sAAjm+Yl8AAjnUAwACOKcAAXR3AAI53mJHAAI54wABWasAAjnjAAEvqwACOeMAAS9jAAI54g/jAAI53mJfAAI59AMAAjinAAF0jwACOf5iTwACOgMAAkW3AAI6BsazAAI5/mJHAAI6DwABWYcAAjn+Yl8AAjoUAwACOKcAAXSXAAI6HmJHAAI6IwABL6sAAjojAAEvYwACOiIP4wACOh5iXwACOjAAAwACRbsAAjo6YksAAjo/AAF0pwACOjsAAXSrAAI6RmJPAAI6SwACRbsAAjpPAAF0rwACOksAAXSzAAI6RmJTAAI6WqObAAI6RmJHAAI6Ynt7AAI6RmJfAAI6aAMAAjo6pcMAAjpyYk8AAjp3AAJFuwACOnoiFwACOncAAXSzAAI6cmJHAAI6hqQ/AAI6hgcPAAI6cmJfAAI6kAMAAjo7AAF0vwACOppiRwACOp5fRwACOp4bQwACOp4bDwACOp4a9wACOp4a6wACOp4a3wACOp4aywACOppiXwACOrwDAAI6OwABdMMAAjrGYk8AAjrKCa8AAjrKF/8AAjrGYkcAAjrWETsAAjrWETcAAjrWEVMAAjrVIwACOtSPAAI6xmJTAAI67g8HAAI6xmJfAAI69AADAAJFvwACOv8AAXTXAAI7AmJHAAI7BI8AAjsCYl8AAjsMAwACOv8AAXTfAAI7FmJbAAI7GlijAAI7FmJHAAI7II8AAjsWYl8AAjsoAwACOv8AAXTjAAI7MmJbAAI7NlijAAI7MmJHAAI7PI8AAjsyYl8AAjtEAwACOv8AAXTnAAI7TmJPAAI7UwACRb8AAjtXAAFZUwACO05iRwACO14HCwACO15fPwACO18AARjnAAI7XwABNzMAAjteX2cAAjteF2MAAjteF+sAAjteF4sAAjteGC8AAjteF28AAjteFu8AAjteF5MAAjteF3cAAjteF4MAAjteF58AAjteF8cAAjteF88AAjteF9cAAjteFd8AAjteFhMAAjteFiMAAjteF68AAjteFlMAAjteFlsAAjteFksAAjteF78AAjteF7cAAjteFssAAjteFrcAAjteFt8AAjteF1MAAjteF6cAAjteF/cAAjteGA8AAjteGBcAAjteFcsAAjteGCMAAjteGAMAAjtOYlMAAjv6GxsAAjv6EvMAAjtOYl8AAjwEAAMAAkXDAAI8DmJHAAI8EwACRcMAAjwXAAF46wACPA8AAXTzAAI8HmJPAAI8IwABdPcAAjwjAAF0+wACPCMAAXT/AAI8IwABdQMAAjwjAAF1BwACPCMAAXULAAI8IwABdQ8AAjwjAAFMZwACPCMAAXUTAAI8IwABdRcAAjwjAAF1GwACPCMAAXUfAAI8IwABdSMAAjwjAAEVhwACPCMAAXUnAAI8IwABdSsAAjwjAAEVjwACPCMAAXUvAAI8IwABdTMAAjwjAAF1NwACPCMAAXU7AAI8IwABdT8AAjwjAAF1QwACPCMAAXVHAAI8IwABdUsAAjwjAAF1TwACPCKS6wACPCMAAkXDAAI8kwABa7sAAjyTAAF1UwACPCMAAXVXAAI8IwABdVsAAjwjAAF1XwACPCMAAXVjAAI8IwABdWcAAjwjAAF1awACPCMAAXVvAAI8IwABdXMAAjwjAAF1dwACPCMAAXV7AAI8HmJTAAI8xgXbAAI8xue3AAI8xVcAAjzGDsMAAjzHAAEaSwACPMcAAXV/AAI8xmXjAAI8xpTvAAI8xhirAAI8xwABdYMAAjzHAAF1hwACPMcAAXWTAAI8HmJHAAI8+wABdYsAAjz6458AAjz7AAF1lwACPPsAAXWbAAI8+wABJMsAAjz7AAF1owACPPsAAXWnAAI8+wABdasAAjz7AAF1rwACPPsAAXWzAAI8+o3LAAI8+hhPAAI8+wABdbsAAjz7AAF1vwACPPpzAwACPPsAASCXAAI8+wABddMAAjz7AAF11wACPPsAAXXbAAI8+wACRcMAAj1LAAF13wACPUsAAXcPAAI8+wABdecAAjz7AAF18wACPPsAAXX7AAI8+wABdf8AAjz7AAF2BwACPPsAAXYLAAI8+wABdg8AAjz6hG8AAjz7AAF2HwACPPsAAXWPAAI8+sErAAI8+sEzAAI8+sDzAAI8+sD3AAI8+sFfAAI8+wABdksAAjz6wNsAAjz7AAF2VwACPPrBSwACPPoYSwACPPrBnwACPPrBTwACPPrBhwACPPoZAwACPPrA1wACPPrBVwACPPrBpwACPPqNrwACPPsAAXZrAAI8+sGDAAI8+sGrAAI8+hhfAAI8+hg7AAI8+sG3AAI8+sGzAAI8+hlPAAI8+wABdssAAjz7AAF2kwACPPsAAXbXAAI8+sG7AAI8+sDPAAI8+sCrAAI8+sDHAAI8+sC/AAI8+sC7AAI8+sCzAAI8+hh3AAI8+sETAAI8+sFzAAI8+sEHAAI8+sELAAI8+sF/AAI8+sEPAAI8+hbvAAI8+hljAAI8+sD7AAI8+sEvAAI8+sEnAAI8+sEfAAI8+sEXAAI8+sFTAAI8+sDnAAI8+sE3AAI8+sFDAAI8+sFHAAI8+sG/AAI8+sDjAAI8+sDfAAI8+sGbAAI8+sGLAAI8+sE7AAI8+he/AAI8+wABdwsAAjz6wY8AAjz6GUcAAjz6wWsAAjz6wVsAAjz6wT8AAjz6wa8AAjz7AAF3UwACPPrBdwACPB5iXwACPpgDAAI8DwABd1sAAj6iYk8AAj6nAAF3XwACPqcAARVzAAI+pwABFXcAAj6nAAEVewACPqcAARV/AAI+pwABFWsAAj6nAAEVgwACPqbD2wACPqJiUwACPsoYqwACPssAAXdjAAI+omJHAAI+1wABd1MAAj7XAAF2CwACPtcAAXYHAAI+1wABdh8AAj7XAAF1iwACPtcAAXZLAAI+1oRvAAI+omJfAAI+9AMAAjwPAAF3xwACPv5iTwACPwMAARWXAAI/AwABFZsAAj8Cw/MAAj8DAAEVnwACPwMAARWjAAI+/mJTAAI/GwABdYMAAj7+YkcAAj8jAAF3UwACPyKEbwACPyMAAXYLAAI/IwABdgcAAj8jAAF2HwACPyMAAXZLAAI/IwABdYsAAj7+Yl8AAj9AAwACPA8AAXgzAAI/SmJPAAI/TwABeDcAAj9PAAF4OwACP07D6wACP08AARWnAAI/TwABFasAAj9Ow+8AAj9PAAEVrwACP08AARWfAAI/TsPbAAI/SmJTAAI/dwABdYcAAj93AAF4PwACP3cAAXhDAAI/SmJHAAI/hwABd1MAAj+GhG8AAj+HAAF2CwACP4cAAXYHAAI/hwABdh8AAj+HAAF1iwACP4cAAXZLAAI/SmJfAAI/pAMAAjwPAAF4ywACP65iTwACP7MAAXXDAAI/sh4jAAI/swABeM8AAj+zAAF40wACP7IQwwACP7MAAXYnAAI/sriXAAI/swABdjcAAj+zAAF2MwACP7MAAXjXAAI/snMDAAI/rmJHAAI/4mofAAI/4wABJ3cAAj/iwTMAAj/iwPMAAj/iwPcAAj/iwV8AAj/iwNsAAj/iwUsAAj/iGEsAAj/iwZ8AAj/iwU8AAj/iwYcAAj/iGQMAAj/iwNcAAj/iwVcAAj/iwacAAj/iwYMAAj/iwasAAj/iGF8AAj/iGDsAAj/iwbcAAj/iwbMAAj/iwSsAAj/iGU8AAj/iwbsAAj/iwM8AAj/iwKsAAj/iwMcAAj/iwL8AAj/iwLsAAj/iwLMAAj/iGHcAAj/iwScAAj/iwR8AAj/iwRcAAj/iwRMAAj/iwXMAAj/iwQcAAj/iwQsAAj/iwX8AAj/iwQ8AAj/iFu8AAj/iGWMAAj/iwPsAAj/iwS8AAj/iwVMAAj/iwOcAAj/iwTcAAj/iwUMAAj/iwUcAAj/iwb8AAj/iwOMAAj/iwN8AAj/iwZsAAj/iwYsAAj/iwTsAAj/iF78AAj/iwY8AAj/iGUcAAj/iwWsAAj/iwVsAAj/iwT8AAj/iwa8AAj/iwXcAAj+uYl8AAkDkAAMAAkXHAAJA7wABePMAAkDyYlMAAkD2AvcAAkDyYkcAAkD+4q8AAkDyYl8AAkEEAwACQO8AAXj3AAJBDmJPAAJBEwACRccAAkEWxrcAAkESuwsAAkEOYlMAAkEiAvcAAkEOYkcAAkErAAF4/wACQSrd7wACQSsAAXkDAAJBKwABeQcAAkEOYl8AAkE8AwACQO8AAUKDAAJBRmJPAAJBSwABeQ8AAkFLAAF5EwACQUsAAXkXAAJBSwABeRsAAkFLAAJFxwACQV8AAXkfAAJBXsa3AAJBXwABDiMAAkFfAAF5IwACQV8AAUYXAAJBXwABTHsAAkFfAAFu3wACQV7dXwACQV8AAUx3AAJBXtWXAAJBXwABIj8AAkFLAAF5JwACQUsAAXkrAAJBSwABeS8AAkFLAAF5MwACQUsAAXk3AAJBSmoDAAJBSwABeTsAAkFLAAF5PwACQUsAAXlDAAJBSwABeUcAAkFLAAF5SwACQUsAAXlPAAJBSwABeVMAAkFLAAF5VwACQUsAAXlbAAJBSupDAAJBSwABeV8AAkFGYlMAAkHSCacAAkHTAAJFxwACQdrO/wACQdsAAR5TAAJB2wABS48AAkHbAAFM0wACQUZiRwACQe8AAXljAAJB7wABeWcAAkHvAAF5bwACQe8AAXl/AAJB7wABeYMAAkHvAAF5hwACQe8AAXmLAAJB7oL/AAJB7oMLAAJB7wABeY8AAkHvAAF5qwACQe8AAkXHAAJCHwABebMAAkIfAAF7KwACQh8AAXxbAAJB7uKvAAJB7wABeb8AAkHurfcAAkHvAAF52wACQe8AAXnfAAJB7wABeeMAAkHvAAF55wACQe8AAXnvAAJB7wABefMAAkHuFmsAAkHvAAF6BwACQe8AAXoLAAJB7wABeg8AAkHvAAF6EwACQe67wwACQe5qHwACQe8AAXXbAAJB7wABddMAAkHvAAF6GwACQe8AAXofAAJB7wABeiMAAkHvAAF6JwACQe7qGwACQe7qIwACQe7qJwACQe7qKwACQe7qNwACQe7qMwACQe7qHwACQe8AAXo3AAJB7uoXAAJB7uoTAAJB7wABen8AAkHvAAF6owACQe8AAXnPAAJB7wABeqsAAkHvAAF6swACQe8AAXq7AAJB7wABeksAAkHvAAF6rwACQe8AAXrnAAJB7uFLAAJB7uK/AAJB7uLjAAJB7wABeu8AAkHu4tMAAkHvAAF68wACQe8AAXr3AAJB7uETAAJB7uDLAAJB7uDrAAJB7uFvAAJB7uGrAAJB7uDPAAJB7uDTAAJB7uDXAAJB7uDbAAJB7uGTAAJB7uGXAAJB7uGzAAJB7uGPAAJB7uFzAAJB7uDHAAJB7uFTAAJB7uFXAAJB7uELAAJB7uEPAAJB7uDvAAJB7uEHAAJB7uFrAAJB7sGfAAJB7sGnAAJB7uDzAAJB7sGPAAJB7wABexsAAkHvAAF7IwACQe7BuwACQe7hHwACQe7hKwACQe7hOwACQe7hPwACQe7hdwACQe8AAXtDAAJB7wABezcAAkHvAAF7PwACQe8AAXs7AAJB7uEvAAJB7uEnAAJB7uEjAAJB7uEzAAJB7uE3AAJB7uD3AAJB7uD7AAJB7uEDAAJB7uGHAAJB7uFfAAJB7uFjAAJB7wABe3MAAkHu4P8AAkHu4OMAAkHu4OcAAkHvAAF6bwACQe8AAXt/AAJB7hgHAAJB7ha3AAJB7wABe4cAAkHvAAF7JwACQe7hewACQe7hZwACQe7hfwACQe7BmwACQe7BOwACQe4XvwACQe7A2wACQe7hxwACQe7hgwACQe7g3wACQe8AAXunAAJB7uGvAAJB7sGLAAJB7uGbAAJB7uFPAAJB7uGfAAJB7uGjAAJB7uGnAAJB7uFbAAJB7wABe8sAAkHu4RcAAkHu4RsAAkHuyfcAAkHvAAF70wACQe8AAXvjAAJB7sn7AAJB7wABe+cAAkHuyf8AAkHvAAF76wACQe8AAXvzAAJB7wABe/8AAkHvAAF8AwACQe8AAXwHAAJB7wABfAsAAkHvAAF8EwACQe8AAXwXAAJB7wABfB8AAkHvAAF8IwACQe8AAXwnAAJB7rofAAJB7wABfCsAAkHvAAF8LwACQe8AAXw3AAJB7wABfEsAAkHvAAF8TwACQe7hQwACQe7hRwACQe8AAXubAAJB7wABe58AAkHu4bcAAkHu4bsAAkHu4b8AAkHu4cMAAkHu4csAAkHu4c8AAkHu4dMAAkHvAAF8ZwACQe7hiwACQe7h1wACQe7h2wACQe7h3wACQe7h4wACQe7h5wACQe7h6wACQe7h7wACQe7h8wACQUZiXwACROAAAwACRcsAAkTqYkcAAkTvAAF/swACROsAAXyHAAJE9mJTAAJE+gL3AAJE9mJHAAJFAuKvAAJE9mJfAAJFCAMAAkTrAAF8iwACRRJiTwACRRcAAkXLAAJFGsa3AAJFFwABfI8AAkUXAAF8kwACRRJiUwACRSoC9wACRRJiRwACRTMAARUnAAJFEmJfAAJFOAMAAkTrAAF8uwACRUJiTwACRUcAAXy/AAJFRgL3AAJFRwACRcsAAkVSz2sAAkVSxrcAAkVTAAFGFwACRVLVlwACRVMAASI/AAJFUwABfMMAAkVTAAF8xwACRUJiUwACRXLL7wACRXMAAkXLAAJFewABTNMAAkV7AAEeUwACRUJiRwACRYbirwACRYbiAwACRYcAAXzLAAJFhwACRcsAAkWXAAF88wACRZcAAXzvAAJFlwABfPcAAkWXAAF9owACRYbiGwACRYcAAXz/AAJFhwABfQMAAkWG4XsAAkWGFrcAAkWG4tMAAkWHAAF9CwACRYcAAX0PAAJFhwABfRsAAkWHAAF9IwACRYbhKwACRYcAAX07AAJFhuDfAAJFhwABfR8AAkWG4MsAAkWG4W8AAkWG4r8AAkWG4uMAAkWHAAF9ZwACRYbhEwACRYcAAX13AAJFhsG7AAJFhuFDAAJFhuG3AAJFhuG7AAJFhuG/AAJFhuHDAAJFhwABfYsAAkWG4PcAAkWG4QMAAkWG4RcAAkWG4ScAAkWG4S8AAkWG4SMAAkWG4TMAAkWHAAF9qwACRYbhowACRYbhpwACRYbhdwACRYcAAX3DAAJFhuHTAAJFhuHPAAJFhuHvAAJFhuHbAAJFhuHfAAJFQmJfAAJGXAMAAkTrAAF99wACRmZiTwACRmsAAXybAAJGagsnAAJGapMzAAJGagL3AAJGapArAAJGZmJTAAJGgwACRcsAAkaHAAFM0wACRmZiRwACRo7irwACRo7iAwACRo8AAX37AAJGjuEXAAJGjuEbAAJGjuErAAJGZmJfAAJGqAMAAkTrAAF+CwACRrJiTwACRrYC9wACRraTMwACRrcAARUfAAJGtwACRcsAAkbHAAF8xwACRrZzbwACRrcAAX4PAAJGtwABfLMAAka3AAF+EwACRrJiUwACRt8AAkXLAAJG4wABTNMAAkbfAAF+FwACRrJiRwACRu8AAX4bAAJG7wABfh8AAkbvAAF+JwACRu8AAX4zAAJG7wABfi8AAkbu4q8AAkbu4gMAAkbvAAF+QwACRu8AAX47AAJG7wABflcAAkbvAAF+RwACRu8AAX43AAJG7wABfmMAAkbvAAF+PwACRu8AAX5vAAJGsmJfAAJHLAMAAkTrAAF+cwACRzZiTwACRzqQKwACRzsAAX53AAJHOm37AAJHOwABFR8AAkc6kzMAAkc2YlMAAkdTAAJFywACR1cAAUzTAAJHUwABfI8AAkc2YkcAAkdjAAF+IwACR2MAASd3AAJHYwABfnsAAkdi4tsAAkdiwbsAAkdiwYsAAkc2Yl8AAkd8AwACROsAAX6PAAJHhmJPAAJHigL3AAJHhmJHAAJHkuKvAAJHhmJfAAJHmAMAAkTrAAF+lwACR6JiTwACR6YC9wACR6JiRwACR67irwACR6JiXwACR7QDAAJE6wABfpsAAke+Yk8AAkfCZ98AAkfDAAF+nwACR75iXwACR8wDAAJE6wABfqMAAkfWYk8AAkfbAAJFywACR98AAUzTAAJH2gL3AAJH2raXAAJH2wABfqcAAkfbAAF+qwACR9ZiRwACR/birwACR/cAAX6zAAJH9wABfrsAAkf3AAF+zwACR/biAwACR/cAAX6vAAJH9wABft8AAkfWYl8AAkgUAwACROsAAX7jAAJIHmJPAAJIIwACRcsAAkgnAAFM0wACSCIC9wACSCMAAXyvAAJIIKcAAkgeYkcAAkg64q8AAkg64gMAAkgeYl8AAkhEAwACROsAAX73AAJITmJPAAJIUgL3AAJIUpMzAAJITmJTAAJIXwACRcsAAkhjAAFM0wACSE5iRwACSGrirwACSGsAAX7/AAJIauFDAAJIauETAAJIawABfxMAAkhOYl8AAkiAAwACROsAAX8XAAJIimJPAAJIjwACRcsAAkiS1ZcAAkiS3usAAkiTAAF8xwACSI4C9wACSI8AAX8bAAJIjwABfx8AAkiPAAF8twACSIpiUwACSLMAAkXLAAJItwABTNMAAkiKYkcAAki+4q8AAki+4gMAAki/AAF/JwACSL7g9wACSL7hAwACSL8AAkXLAAJI1wABfy8AAki+4PsAAki+4OMAAki/AAF/RwACSL7iGwACSL7hTwACSL8AAX9XAAJIvuGbAAJIvuGfAAJIvuFbAAJIvuEXAAJIvuEbAAJIvuK7AAJIvuDfAAJIvhgHAAJIvsG7AAJIvuEfAAJIvuFDAAJIvuFHAAJIvha3AAJIvuF7AAJIvuLjAAJIvuGjAAJIvuHDAAJIvuHLAAJIvuHPAAJIvuHTAAJIimJfAAJJRAMAAkTrAAF/ZwACSU5iTwACSVCfAAJJUwACRcsAAklYowACSVCnAAJJUYcAAklOYkcAAklojwACSU5iXwACSXADAAJE6wABf2sAAkl6Yk8AAkl+kzMAAkl+FzcAAkl/AAF/bwACSX8AAX9zAAJJemJTAAJJkwACRcsAAkmXAAFM0wACSXpiRwACSZ8AAX93AAJJnwABf3sAAkmeEG8AAkmfAAF/fwACSZ7T6wACSZ8AAX+DAAJJnwABf0MAAkmfAAF/PwACSZ8AAX87AAJJnwABfzMAAkmfAAF/SwACSZ8AAX9bAAJJnwABf18AAkmfAAF/YwACSZ8AAX+bAAJJnwABfyMAAkmeeq8AAkl6Yl8AAknkAAMAAkJjAAJJ7mJLAAJJ8wABf9MAAknzAAF/1wACSe5iTwACSf8AAYaDAAJJ/goHAAJJ7mJHAAJKCg+zAAJKCwABQpsAAkoLAAFGbwACSgsAAUabAAJKCwABRpcAAkoLAAFFNwACSgsAAYGbAAJKCwABgZ8AAkoLAAGBowACSgsAAYGnAAJKCwABhocAAkoKuoMAAknvAAF/2wACSj5iRwACSkLBvwACSkIYSwACSkIYOwACSkIYXwACSkLBuwACSkLBtwACSkLBswACSkLBrwACSkLBqwACSkLBpwACSkLBnwACSkLBmwACSkIXvwACSkLBjwACSkIZAwACSkLBiwACSkLBhwACSkLBgwACSkIZTwACSkIYdwACSkLBfwACSkLBdwACSkLBcwACSkLBawACSkLBXwACSkLBWwACSkLBVwACSkLBUwACSkLBTwACSkLBSwACSkLBRwACSkLBQwACSkLBPwACSkLBOwACSkIZRwACSkLBNwACSkLBMwACSkLBLwACSkLBKwACSkLBJwACSkLBHwACSkLBFwACSkLBEwACSkLBDwACSkLBCwACSkLBBwACSkIW7wACSkIZYwACSkLA+wACSkLA9wACSkLA8wACSkLA5wACSkLA4wACSkLA3wACSkLA2wACSkLA1wACSkLAzwACSkLAxwACSkLAvwACSkLAuwACSkLAswACSkLAqwACSj5iXwACSzwDAAJJ7wABf+MAAktGYkcAAktLAAEY5wACS0rBvwACS0sAAXXTAAJLSwABf+cAAktK4usAAktKGEsAAktKGDsAAktKGF8AAktKwbsAAktKwbcAAktKwbMAAktKwa8AAktKwasAAktKwacAAktKwZ8AAktKwZsAAktKF78AAktKwY8AAktKwYsAAktKGU8AAktKGHcAAktKwX8AAktKGQMAAktKwYcAAktKwYMAAktLAAF12wACS0sAAX/rAAJLSsFzAAJLSsFrAAJLSsFfAAJLSsFbAAJLSsFXAAJLSsFTAAJLSsFPAAJLSsFLAAJLSsFHAAJLSsFDAAJLSsEzAAJLSsE/AAJLShlHAAJLSsE3AAJLSsE7AAJLSsEvAAJLSsErAAJLSwABf+8AAktKwScAAktKwR8AAktKwRcAAktLAAF/8wACS0rBEwACS0rBDwACS0rBCwACS0rBBwACS0oW7wACS0oZYwACS0rA+wACS0rA9wACS0rA8wACS0rA5wACS0rA4wACS0rA3wACS0sAAX/3AAJLSsDPAAJLSsDHAAJLSsC/AAJLSsC7AAJLSsCzAAJLSsCrAAJLSsDXAAJLSsDbAAJLSsF3AAJLRmJfAAJMaAMAAknvAAF/+wACTHJiRwACTHbBvwACTHYYSwACTHYYOwACTHYYXwACTHbBuwACTHbBtwACTHbBswACTHbBrwACTHbBqwACTHbBpwACTHbBnwACTHbBmwACTHYXvwACTHbBjwACTHYZAwACTHbBiwACTHbBhwACTHbBgwACTHYZTwACTHYYdwACTHbBfwACTHbBdwACTHbBcwACTHbBawACTHbBXwACTHbBWwACTHbBVwACTHbBUwACTHbBTwACTHbBSwACTHbBRwACTHbBQwACTHbBPwACTHbBOwACTHYZRwACTHbBNwACTHbBMwACTHbBLwACTHbBKwACTHbBJwACTHbBHwACTHbBFwACTHbBEwACTHbBDwACTHbBCwACTHbBBwACTHYW7wACTHYZYwACTHbA+wACTHbA9wACTHbA8wACTHbA5wACTHbA4wACTHbA3wACTHbA2wACTHbA1wACTHbAzwACTHbAxwACTHbAvwACTHbAuwACTHbAswACTHbAqwACTHJiXwACTXADAAJJ7wABf/8AAk16YkcAAk1/AAEY5wACTX7BvwACTX8AAXXTAAJNfwABf+cAAk1+4usAAk1+GEsAAk1+GDsAAk1+GF8AAk1+wbsAAk1+wbcAAk1+wbMAAk1+wa8AAk1+wasAAk1+wacAAk1+wZ8AAk1+wZsAAk1+F78AAk1+wY8AAk1+wYsAAk1+GU8AAk1+GHcAAk1+wX8AAk1+GQMAAk1+wYcAAk1+wYMAAk1/AAF12wACTX8AAX/rAAJNfsFzAAJNfsFrAAJNfsFfAAJNfsFbAAJNfsFXAAJNfsFTAAJNfsFPAAJNfsFLAAJNfsFHAAJNfsFDAAJNfsEzAAJNfsE/AAJNfhlHAAJNfsE3AAJNfsE7AAJNfsEvAAJNfsErAAJNfwABf+8AAk1+wScAAk1+wR8AAk1+wRcAAk1/AAF/8wACTX7BEwACTX7BDwACTX7BCwACTX7BBwACTX4W7wACTX4ZYwACTX7A+wACTX7A9wACTX7A8wACTX7A5wACTX7A4wACTX7A3wACTX8AAX/3AAJNfsDPAAJNfsDHAAJNfsC/AAJNfsC7AAJNfsCzAAJNfsCrAAJNfsDXAAJNfsDbAAJNfsF3AAJNemJfAAJOnAMAAknu2osAAk6mYl8AAk6oAwACSe4RMwACTrJiTwACTrcAAkJjAAJOuwABgAcAAk6yYlMAAk7ClTsAAk7DAAF6XwACTrJiRwACTs4RNwACTs4ROwACTs4VvwACTs8AAYADAAJOzwACQmMAAk7ivgMAAk7OvWMAAk7PAAGACwACTs8AAYAPAAJOzrqrAAJOsmJfAAJO+AMAAknvAAFy3wACTwJiTwACTwYJpwACTwJiRwACTw4RNwACTw4VvwACTw4ROwACTw8AAYADAAJPDwACQmMAAk8ivgMAAk8CYl8AAk8oAwACSe4YMwACTzJiRwACTzcAAYAPAAJPMmJfAAJPPAMAAknuGD8AAk9GYk8AAk9KGEMAAk9GYkcAAk9SETcAAk9SFb8AAk9SETsAAk9TAAGAAwACT1MAAkJjAAJPZr4DAAJPRmJfAAJPbAMAAk9uFmMAAknuGDcAAk96Yk8AAk9+Ca8AAk96YkcAAk+GETcAAk+GFb8AAk+GETsAAk+HAAGAAwACT4cAAkJjAAJPmr4DAAJPemJfAAJPoAMAAknuGFsAAk+qYkcAAk+uETcAAk+uFb8AAk+uETsAAk+vAAGAAwACT68AAkJjAAJPwr4DAAJPqmJfAAJPyAMAAknvAAGAEwACT9JiTwACT9YW0wACT9YGtwACT9YW1wACT9JiUwACT+cAAYAbAAJP0mJHAAJP7hE3AAJP7hW/AAJP7hE7AAJP7wABgAMAAk/vAAJCYwACUAK+AwACT9JiXwACUAgDAAJQCwABgBcAAknvAAGAHwACUBZiTwACUBoJpwACUBZiXwACUCADAAJJ7wABgCMAAlAqYk8AAlAupPcAAlAuFtMAAlAurJsAAlAqYkcAAlA+ETcAAlA+Fb8AAlA+ETsAAlA/AAGAAwACUD8AAkJjAAJQUr4DAAJQKmJfAAJQWAMAAknujJ8AAlBiYk8AAlBmwWMAAlBmDwMAAlBiYkcAAlByETcAAlByFb8AAlByETsAAlBzAAGAAwACUHMAAkJjAAJQhr4DAAJQYmJfAAJQjAMAAknvAAGAJwACUJZiTwACUJoW0wACUJZiRwACUKIRNwACUKIVvwACUKIROwACUKMAAYADAAJQowACQmMAAlC2vgMAAlCWYl8AAlC8AwACSe8AAYArAAJQxmJPAAJQyhbTAAJQxmJHAAJQ0hE3AAJQ0hW/AAJQ0hE7AAJQ0wABgAMAAlDTAAJCYwACUOa+AwACUMZiXwACUOwDAAJJ7rA7AAJQ9mJPAAJQ+sGjAAJQ9mJHAAJRAhE3AAJRAhW/AAJRAhE7AAJRAwABgAMAAlEDAAJCYwACURa+AwACUPZiXwACURwDAAJJ7rA3AAJRJmJPAAJRKsGjAAJRJmJHAAJRMhE3AAJRMhW/AAJRMhE7AAJRMwABgAMAAlEzAAJCYwACUUa+AwACUSZiXwACUUwDAAJJ7wABgC8AAlFWYk8AAlFaAlsAAlFWYkcAAlFiETcAAlFiFb8AAlFiETsAAlFjAAGAAwACUWMAAkJjAAJRdr4DAAJRVmJfAAJRfAMAAknuF7sAAlGGYk8AAlGKCa8AAlGGYkcAAlGSETcAAlGSFb8AAlGSETsAAlGTAAGAAwACUZMAAkJjAAJRpr4DAAJRhmJfAAJRrAMAAknvAAGAMwACUbZiTwACUboJpwACUbrBkwACUbrBlwACUbZiRwACUcoRNwACUcoVvwACUcoROwACUcsAAYADAAJRywACQmMAAlHevgMAAlG2Yl8AAlHkAwACSe4Y9wACUe5iTwACUfJ6awACUfIJpwACUe5iRwACUf4RNwACUf4VvwACUf4ROwACUf8AAYADAAJR/wACQmMAAlISvgMAAlHuYl8AAlIYAwACSe8AAYA3AAJSImJPAAJSJg9HAAJSJhi3AAJSImJHAAJSMhE3AAJSMhW/AAJSMhE7AAJSMwABgAMAAlIzAAJCYwACUka+AwACUiJiXwACUkwDAAJJ7wABgDsAAlJWYk8AAlJaCacAAlJWYl8AAlJgAwACSe8AAYA/AAJSamJPAAJSbgmvAAJSamJHAAJSdhE3AAJSdhW/AAJSdhE7AAJSdwABgAMAAlJ3AAJCYwACUoq+AwACUmpiXwACUpADAAJJ7wABgEMAAlKaYkcAAlKeETcAAlKeFb8AAlKeETsAAlKfAAGAAwACUp8AAkJjAAJSsr4DAAJSmmJfAAJSuAMAAknuGUsAAlLCYk8AAlLGAvcAAlLGCasAAlLCYkcAAlLSETcAAlLSFb8AAlLSETsAAlLTAAGAAwACUtMAAkJjAAJS5r4DAAJSwmJfAAJS7AMAAknuGHMAAlL2Yk8AAlL6Y+8AAlL6CacAAlL2YkcAAlMGETcAAlMGFb8AAlMGETsAAlMHAAGAAwACUwcAAkJjAAJTGr4DAAJS9mJfAAJTIAMAAknvAAGARwACUypiTwACUy4KTwACUypiRwACUzYRNwACUzYVvwACUzYROwACUzcAAYADAAJTNwACQmMAAlNKvgMAAlMqYl8AAlNQAwACSe8AAYBLAAJTWmJPAAJTXgmvAAJTXsF7AAJTWmJHAAJTahE3AAJTahW/AAJTahE7AAJTawABgAMAAlNrAAJCYwACU36+AwACU1piXwACU4QDAAJJ7hWXAAJTjmJTAAJTkr4zAAJTjmJHAAJTmwABgA8AAlOOYl8AAlOgAwACSe55WwACU6piXwACU6wDAAJJ7hlTAAJTtmJHAAJTuhE3AAJTuhW/AAJTuwACQmMAAlPGvgMAAlO2YlMAAlPOD0cAAlPOve8AAlO2Yl8AAlPYAwACSe8AAYBPAAJT4mJPAAJT5gL3AAJT4mJTAAJT7gJbAAJT4mJHAAJT9hE7AAJT9wABgAMAAlPiYl8AAlQAAwACSe8AAYBTAAJUCmJPAAJUDiKvAAJUDglHAAJUCmJHAAJUGhE3AAJUGhW/AAJUGhE7AAJUGwABgAMAAlQbAAJCYwACVC6+AwACVApiUwACVDa+MwACVApiXwACVDwDAAJUPwABgFcAAknvAAGAWwACVEpiTwACVE61swACVE7BbwACVEpiRwACVFoRNwACVFoVvwACVFoROwACVFsAAYADAAJUWwACQmMAAlRuvgMAAlRKYlMAAlR2vjMAAlRKYl8AAlR8AwACSe8AAYBfAAJUhmJPAAJUisD/AAJUhmJHAAJUkhE3AAJUkhW/AAJUkhE7AAJUkwABgAMAAlSTAAJCYwACVKa+AwACVIZiUwACVK6+MwACVIZiXwACVLQDAAJJ7wABgGMAAlS+Yk8AAlTCwWMAAlTCpQsAAlTCAlsAAlS+YlMAAlTSvjMAAlTSjocAAlS+YkcAAlTeETcAAlTeFb8AAlTeETsAAlTfAAGAAwACVN8AAkJjAAJU8r4DAAJUvmJfAAJU+AMAAlT66SsAAknvAAGAZwACVQZiUwACVQp6awACVQZiRwACVRIRNwACVRIVvwACVRMAAkJjAAJVHr4DAAJVBmJfAAJVJAMAAknvAAGAawACVS5iTwACVTIW0wACVTIGtwACVTIW1wACVS5iRwACVUIRNwACVUIVvwACVUIROwACVUMAAYADAAJVQwACQmMAAlVWvgMAAlUuYlMAAlVevjMAAlUuYl8AAlVkAwACSe8AAYBvAAJVbmJPAAJVcgkXAAJVcW8AAlVuYkcAAlV+ETcAAlV+Fb8AAlV+ETsAAlV/AAGAAwACVX8AAkJjAAJVkr4DAAJVbmJTAAJVmr4zAAJVbmJfAAJVoAMAAknvAAGAcwACVapiRwACVa4RNwACVa4VvwACVa8AAkJjAAJVur4DAAJVqmJfAAJVwAMAAknuW78AAlXKYk8AAlXOpQsAAlXOFr8AAlXOFscAAlXKYkcAAlXeETcAAlXeFb8AAlXfAAJCYwACVeq+AwACVd4ROwACVd8AAYADAAJVymJTAAJV+wABel8AAlX6vjMAAlXKYl8AAlYEAwACSe8AAQmLAAJWDmJPAAJWEqULAAJWEH8AAlYOYkcAAlYeETcAAlYeFb8AAlYfAAJCYwACViq+AwACVh4ROwACVh8AAYADAAJWDmJTAAJWOr4zAAJWDmJfAAJWQAMAAknvAAGAewACVkpiTwACVk6lCwACVkx/AAJWSmJHAAJWWhE3AAJWWhW/AAJWWwACQmMAAlZmvgMAAlZaETsAAlZbAAGAAwACVkpiUwACVna+MwACVkpiXwACVnwDAAJJ7wABgH8AAlaGYk8AAlaKAvcAAlaLAAJCYwACVpMAAYCDAAJWhmJHAAJWmhE3AAJWmhE7AAJWmwABgAMAAlaGYlMAAlaqvjMAAlaGYl8AAlawAwACSe8AAV+bAAJWumJHAAJWvhE3AAJWvhW/AAJWvwACQmMAAlbKvgMAAla/AAGACwACVryPAAJWumJfAAJW2AMAAknuGSsAAlbiYk8AAlbmve8AAlbiYkcAAlbuETcAAlbuFb8AAlbvAAJCYwACVvq+AwACVuJiXwACVwADAAJJ7wABgJMAAlcKYkcAAlcOETcAAlcOFb8AAlcPAAJCYwACVxq+AwACVwpiXwACVyADAAJJ7wABgJcAAlcqYkcAAlcuETcAAlcuFb8AAlcvAAJCYwACVzq+AwACVypiXwACV0ADAAJJ7wABgJsAAldKYk8AAldOAvcAAldOCasAAldKYkcAAldaETcAAldaFb8AAldaETsAAldbAAGAAwACV1sAAkJjAAJXbr4DAAJXSmJTAAJXdr4zAAJXSmJfAAJXfAMAAknvAAGAnwACV4ZiTwACV4oPvwACV4oJpwACV4qEcwACV4ZiRwACV5oRNwACV5oVvwACV5oROwACV5sAAYADAAJXmwACQmMAAleuvgMAAleGYlMAAle2vjMAAleGYl8AAle8AwACSe4InwACV8ZiTwACV8ifAAJXyhirAAJXytF7AAJXylpfAAJXymafAAJXymanAAJXywABgKMAAlfLAAGApwACV8inAAJXxmJHAAJX8I8AAlfGYl8AAlf4AwACSe8AAYCrAAJYAmJPAAJYBhXnAAJYBpN7AAJYAmJHAAJYEhE3AAJYEhW/AAJYEhE7AAJYEwABgAMAAlgTAAJCYwACWCa+AwACWAJiUwACWC6+MwACWAJiXwACWDQDAAJYNhI7AAJYNwABgK8AAknvAAGAswACWEZiRwACWEoROwACWEsAAYADAAJYSwACQmMAAlhWvgMAAlhGYl8AAlhcAwACSe8AAYC3AAJYZmJHAAJYahE3AAJYahW/AAJYZmJTAAJYdgJbAAJYdr4zAAJYZmJfAAJYgAMAAknvAAGAuwACWIpiRwACWI4RNwACWI4VvwACWIpiUwACWJoCWwACWJq+MwACWIpiXwACWKQDAAJJ7wABgL8AAliuYkcAAliyETcAAliyFb8AAliuYlMAAli+AlsAAliuYl8AAljEAwACSe8AAYDDAAJYzmJHAAJY0hE7AAJY0wABgAMAAljOYlMAAljevjMAAljOYl8AAljkAwACSe6I8wACWO5iTwACWPICWwACWO5iRwACWPoRNwACWPoVvwACWPsAAkJjAAJZBr4DAAJY7mJfAAJZDAMAAknuiQsAAlkWYkcAAlkaETcAAlkaFb8AAlkbAAJCYwACWSa+AwACWRZiXwACWSwDAAJJ7wABAZsAAlk2Yk8AAlk6AlsAAlk2YkcAAllCETcAAllCFb8AAllDAAJCYwACWU6+AwACWTZiXwACWVQDAAJJ7hbjAAJZXmJPAAJZYhH/AAJZXmJHAAJZahE3AAJZahW/AAJZahE7AAJZawABgAMAAllrAAJCYwACWX6+AwACWV5iXwACWYQDAAJJ7wABgMcAAlmOYk8AAlmSAlsAAlmOYlMAAlmavjMAAlmOYkcAAlmiETcAAlmiFb8AAlmjAAJCYwACWa6+AwACWY5iXwACWbQDAAJJ7wABgMsAAlm+Yk8AAlnCIP8AAlm+YkcAAlnKETcAAlnKFb8AAlnKETsAAlnLAAGAAwACWcsAAkJjAAJZ3r4DAAJZvmJTAAJZ5r4zAAJZvmJfAAJZ7AMAAknvAAGAzwACWfZiRwACWfoRNwACWfoVvwACWfoROwACWfsAAYADAAJZ+wACQmMAAloOvgMAAln2YlMAAloWvjMAAln2Yl8AAlocAwACSe8AAYDTAAJaJmJPAAJaKsDrAAJaKsDvAAJaJmJHAAJaNhE3AAJaNhW/AAJaNhE7AAJaNwABgAMAAlo3AAJCYwACWkq+AwACWiZiUwACWlK+MwACWiZiXwACWlgDAAJJ7wABgNcAAlpiYk8AAlpmAvcAAlpmAlsAAlpiYkcAAlpyETcAAlpyFb8AAlpyETsAAlpzAAGAAwACWnMAAkJjAAJahr4DAAJaYmJfAAJajAMAAknvAAGA2wACWpZiUwACWpsAARk/AAJamo63AAJamvp/AAJalmJfAAJaqAMAAknvAAGA3wACWrJiUwACWrcAARk/AAJato63AAJatvp/AAJasmJfAAJaxAMAAknvAAGA4wACWs5iTwACWtMAARk/AAJazmJHAAJa2hE3AAJa2hW/AAJa2hE7AAJa2wABgAMAAlrbAAJCYwACWu6+AwACWs5iUwACWva+MwACWs5iXwACWvwDAAJJ7wABgOcAAlsGYlMAAlsLAAEZPwACWwqOtwACWwr6fwACWwZiXwACWxgDAAJJ7wABgOsAAlsiYk8AAlsnAAEZPwACWyJiRwACWy4RNwACWy4VvwACWy4ROwACWy8AAYADAAJbLwACQmMAAltCvgMAAlsiYl8AAltIAwACSe8AAYDvAAJbUmJTAAJbVwABGT8AAltWjrcAAltW+n8AAltSYl8AAltkAwACSe8AAYDzAAJbbmJPAAJbcwABGT8AAltuYlMAAlt6AvcAAlt6ve8AAlt6vjMAAltuYkcAAluKETcAAluKFb8AAluKETsAAluLAAGAAwACW4sAAkJjAAJbnr4DAAJbbmJfAAJbpAMAAknvAAGA+wACW65iUwACW7MAARk/AAJbso63AAJbsvp/AAJbrmJfAAJbwAMAAknvAAGA/wACW8piTwACW88AARk/AAJbymJHAAJb1hE3AAJb1hW/AAJb1hE7AAJb1wABgAMAAlvXAAJCYwACW+q+AwACW8piUwACW/K+MwACW8piXwACW/gDAAJJ7wABgQMAAlwCYlMAAlwHAAEZPwACXAaOtwACXAb6fwACXAJiXwACXBQDAAJJ7wABgQcAAlweYk8AAlwjAAEZPwACXB5iRwACXCoRNwACXCoVvwACXCoROwACXCsAAYADAAJcKwACQmMAAlw+vgMAAlweYl8AAlxEAwACSe8AAYELAAJcTmJTAAJcUwABGT8AAlxSjrcAAlxS+n8AAlxOYl8AAlxgAwACSe8AAYEPAAJcamJPAAJcbwABGT8AAlxqYkcAAlx2ETcAAlx2Fb8AAlx2ETsAAlx3AAGAAwACXHcAAkJjAAJcir4DAAJcamJTAAJckgL3AAJckr4zAAJcamJfAAJcnAMAAknvAAGBFwACXKZiTwACXKhvAAJcpmJHAAJcshE3AAJcshW/AAJcshE7AAJcswABgAMAAlyzAAJCYwACXMa+AwACXKZiUwACXM6+MwACXKZiXwACXNQDAAJJ7wABgRsAAlzeYk8AAlziCa8AAlzeYlMAAlzqvjMAAlzeYkcAAlzyETcAAlzyFb8AAlzyETsAAlzzAAGAAwACXPMAAkJjAAJdBr4DAAJc3mJfAAJdDAMAAknvAAEcQwACXRZiTwACXRpxwwACXRZiRwACXSIRNwACXSIVvwACXSMAAkJjAAJdLr4DAAJdIhE7AAJdIwABgAMAAl0WYl8AAl08AwACSe8AAYEfAAJdRmJHAAJdSIMAAl1KFS8AAl1LAAEmZwACXUsAAkJjAAJdWwABgSMAAl1bAAGBJwACXVsAAYFHAAJdWwABgYcAAl1bAAGBjwACXUsAAUU7AAJdSwABTxsAAl1LAAGBQwACXUsAAVK7AAJdSwABTrsAAl1LAAEZCwACXUoPswACXUsAAUZvAAJdSwABRpcAAl1LAAFGmwACXUsAAUKbAAJdSwABRTcAAl1LAAF77wACXUsAAYGbAAJdSwABgZ8AAl1KccMAAl1LAAGBowACXUsAAYGnAAJdRmJfAAJduAMAAknvAAGBqwACXcJiTwACXcaFAwACXcSLAAJdwmJHAAJd0I8AAl3CYl8AAl3YAwACSe8AAYHLAAJd4mJPAAJd5wABgc8AAl3nAAGB0wACXecAAYGvAAJd5gbHAAJd5wABgdcAAl3nAAEjKwACXecAAYHbAAJd5wABI7cAAl3nAAGB3wACXecAAYHjAAJd5nZHAAJd5mU3AAJd5wABFcMAAl3nAAGB5wACXecAAYHrAAJd5wABge8AAl3nAAGB8wACXecAAYH3AAJd5wABgfsAAl3nAAGB/wACXeZ2kwACXecAAYIDAAJd5naPAAJd5ndPAAJd5nbfAAJd5wABggcAAl3nAAE26wACXecAAYILAAJd5wABgg8AAl3nAAGCEwACXecAAYIXAAJd5wABghsAAl3iYlMAAl5rAAGCIwACXmsAAYInAAJd4mJHAAJedwABgisAAl53AAGCLwACXncAAYI7AAJedwABDUsAAl53AAGCQwACXncAAYIfAAJedwABgmsAAl53AAGCbwACXncAAYJzAAJedwABgncAAl53AAGCgwACXnYHFwACXncAAYKHAAJedwABBoMAAl53AAEFswACXncAAYKnAAJedwABgpMAAl53AAGCtwACXncAAYLDAAJedwABgrsAAl53AAGCzwACXncAAYLTAAJedwABgtcAAl53AAGC2wACXncAAYLvAAJedwABgpcAAl52hRcAAl53AAGC8wACXncAAYL7AAJedwABgv8AAl52Ca8AAl52FS8AAl53AAEGAwACXncAAQXvAAJedwABgwcAAl53AAGDNwACXncAAYMLAAJedwABgw8AAl53AAGDEwACXncAAYMXAAJedwABgqMAAl53AAGDGwACXncAAYMfAAJedwABg1cAAl53AAGDIwACXncAAYMnAAJedwABgysAAl53AAGDTwACXeJiXwACXzgDAAJJ7wABg2MAAl9CYk8AAl9GDRMAAl9GBr8AAl9HAAGDZwACX0cAAYNrAAJfQmJHAAJfWXcAAl9CYlMAAl9hewACX0JiXwACX2gDAAJJ7wABg28AAl9yYk8AAl92DRMAAl92Br8AAl9yYlMAAl+BcwACX3JiXwACX4gDAAJJ7wABg3MAAl+SYk8AAl+XAAEZGwACX5cAARkfAAJflwABg3cAAl+XAAEZFwACX5JiRwACX6sAAYN7AAJfkmJfAAJfsAMAAknvAAGDfwACX7piRwACX74HFwACX77QkwACX77QjwACX77QmwACX7piXwACX9ADAAJJ7wABg4MAAl/aYk8AAl/eCi8AAl/aYkcAAl/m0JMAAl/m8+8AAl/aYl8AAl/wAwACSe5lHwACX/piTwACX/3rAAJf/glPAAJf/wABGRsAAl//AAGDhwACX/8AAYOLAAJf/wACQmMAAmAXAAGDjwACYBYPZwACYBYPawACX/8AAYOTAAJf/wABg5cAAl//AAGDmwACX/8AAYOfAAJf/wABg6MAAl//AAGDqwACX/8AAYOzAAJf/wABVE8AAl/6YkcAAmBHAAGDtwACYEYPfwACYEYPgwACYEcAAYO7AAJgRwABg78AAmBHAAGDwwACYEW/AAJgRwABg88AAmBHAAGD0wACYEcAAYPXAAJgRwABg9sAAmBGoMcAAmBHAAJCYwACYHsAAYPLAAJgewABhE8AAmB7AAGEUwACYEcAAYPfAAJgRtCPAAJgRwABg+cAAmBGah8AAmBHAAGD6wACYEcAATEHAAJgRsG/AAJgRwABg/8AAmBHAAGEAwACYEcAAYQXAAJgRwABhA8AAmBGGEsAAmBGGDsAAmBGGF8AAmBHAAGEGwACYEbBuwACYEbBtwACYEbBswACYEbBrwACYEbBqwACYEbBpwACYEbBnwACYEbBmwACYEbBdwACYEYXvwACYEbBjwACYEYZAwACYEbBiwACYEbBhwACYEbBgwACYEYYdwACYEcAAYQvAAJgRhlPAAJgRwABg/sAAmBGwWsAAmBGwV8AAmBGwVsAAmBGwVcAAmBGwVMAAmBGwU8AAmBGwUsAAmBGwUcAAmBGwUMAAmBGwT8AAmBGwTsAAmBGGUcAAmBGwTcAAmBGWE8AAmBHAAGEfwACYEbBMwACYEbBLwACYEbBKwACYEbBJwACYEcAAYSPAAJgRsEfAAJgRsEXAAJgRsETAAJgRsEPAAJgRhbvAAJgRhljAAJgRsD7AAJgRsELAAJgRsEHAAJgRsD3AAJgRsDzAAJgRsDnAAJgRsDjAAJgRsDfAAJgRsFzAAJgRsF/AAJgRwABf/cAAmBGwM8AAmBGwMcAAmBGwL8AAmBGwLsAAmBGwLMAAmBGwKsAAmBGwNcAAmBGwNsAAl/6YlMAAmHGD3cAAmHHAAGDxwACX/piXwACYdADAAJJ7wABhKcAAmHaYk8AAmHeXHsAAmHeDW8AAmHaYkcAAmHpWwACYeoP4wACYdpiXwACYfQDAAJJ7wABhKsAAmH+Yk8AAmICoIMAAmIDAAGErwACYgMAAYQzAAJiAg+/AAJiAwABhLMAAmIDAAGEuwACYf5iRwACYh8AAYTDAAJiHwABhMcAAmIfAAGEywACYh4ZTwACYh7BLwACYh7BKwACYh7BOwACYh7A1wACYh4ZRwACYf5iXwACYkQDAAJJ7wABhM8AAmJOYk8AAmJSCU8AAmJOYkcAAmJawb8AAmJbAAEY5wACYloYSwACYloYOwACYloYXwACYlrBuwACYlrBtwACYlrBswACYlrBrwACYlrBqwACYlrBpwACYlrBnwACYlrBmwACYloXvwACYlrBjwACYloZAwACYlrBiwACYlrBhwACYlrBgwACYloZTwACYloYdwACYlrBfwACYlsAAXXbAAJiTmJfAAJiuAMAAknvAAGE1wACYsJiRwACYsZkUwACYsaDbwACYscAAYTfAAJixhvTAAJixhvfAAJiwmJfAAJi3AMAAknvAAGE4wACYuZiRwACYupkUwACYuqDbwACYusAAYTfAAJi6hvTAAJi6hvfAAJi5mJfAAJjAAMAAknvAAGE5wACYwpiTwACYw4XIwACYw8AAYTrAAJjDwABhO8AAmMPAAGE8wACYw8AAYT3AAJjDwABhPsAAmMPAAGE/wACYw8AAYUDAAJjCmJHAAJjMhvTAAJjMhvfAAJjMmRTAAJjMwABhQcAAmMyg28AAmMzAAGE3wACYzMAAYULAAJjMwABhQ8AAmMKYl8AAmNUAwACSe8AAYUfAAJjXmJPAAJjYhFLAAJjYg+7AAJjYtqbAAJjYwABGM8AAmNeYkcAAmN3AAGD4wACY3bQmwACY15iXwACY4ADAAJJ7wABhSMAAmOKYk8AAmOPAAGFJwACY48AAYUrAAJjimJHAAJjmwABgS8AAmObAAGBMwACY5sAAYE3AAJjmwABgTsAAmOKYl8AAmOsAwACSe4iuwACY7ZiTwACY7oNEwACY7qJtwACY7sAAYE/AAJjutCnAAJjumqvAAJjutvnAAJjuwABhS8AAmO2YlMAAmPa+n8AAmO2YkcAAmPjAAJCYwACY+cAAYU7AAJj5wABhTMAAmPiwmMAAmO2Yl8AAmP0AwACY/cAAYU3AAJj9wABhT8AAknvAAGFVwACZAZiTwACZAsAAYE/AAJkCwABdSMAAmQLAAGFWwACZAZiRwACZBmfAAJkGgcXAAJkGpwHAAJkGwABhV8AAmQaah8AAmQbAAGFZwACZBsAAYVrAAJkGwABGOcAAmQbAAGFcwACZBsAAYV3AAJkGsDPAAJkGsCrAAJkGwABhYcAAmQawMcAAmQawL8AAmQawLsAAmQawLMAAmQbAAGFrwACZBrBvwACZBoYSwACZBoYOwACZBoYXwACZBrBuwACZBsAAYW7AAJkGwABhb8AAmQawbcAAmQawbMAAmQbAAGF6wACZBrBrwACZBrBqwACZBrBpwACZBrBnwACZBrBmwACZBrBdwACZBoXvwACZBrBjwACZBoZAwACZBrBiwACZBrBhwACZBrBgwACZBoZTwACZBoYdwACZBrBfwACZBrBcwACZBrBawACZBrBXwACZBrBWwACZBrBVwACZBrBUwACZBrBTwACZBsAAYYbAAJkGsFLAAJkGsFHAAJkGsFDAAJkGsE/AAJkGsE7AAJkGhlHAAJkGsE3AAJkGsEzAAJkGsEvAAJkGsErAAJkGsEnAAJkGsEfAAJkGsEXAAJkGsETAAJkGsEPAAJkGsELAAJkGsEHAAJkGhbvAAJkGhljAAJkGsD7AAJkGsD3AAJkGsDzAAJkGsDnAAJkGsDjAAJkGsDfAAJkGsDXAAJkGsDbAAJkBmJfAAJlVAMAAknvAAGGUwACZV5iTwACZWMAAYZXAAJlYwABhS8AAmViA7sAAmVeYkcAAmVzAAGFYwACZXJqHwACZXMAARjnAAJlcwABf/cAAmVeYl8AAmWEAwACSe8AAYZbAAJljmJHAAJlkwABhl8AAmWTAAGGYwACZZMAAYZnAAJlkwABhnMAAmWTAAGGdwACZZLBvwACZZLAqwACZZLAswACZZLAuwACZZLAvwACZZLAxwACZZLAzwACZZLA1wACZZLA2wACZZLA3wACZZLA4wACZZLA5wACZZLA8wACZZLA9wACZZIZYwACZZLA+wACZZIW7wACZZLBBwACZZLBCwACZZLBDwACZZLBEwACZZLBFwACZZLBHwACZZLBJwACZZLBKwACZZLBLwACZZLBMwACZZLBNwACZZIZRwACZZLBOwACZZLBPwACZZLBQwACZZLBRwACZZLBSwACZZLBTwACZZLBUwACZZLBVwACZZLBWwACZZLBXwACZZLBawACZZLBcwACZZLBdwACZZLBfwACZZIYdwACZZIZTwACZZLBgwACZZLBhwACZZLBiwACZZIZAwACZZLBjwACZZIXvwACZZLBmwACZZLBnwACZZLBpwACZZLBqwACZZLBrwACZZLBswACZZLBtwACZZLBuwACZZIYXwACZZIYOwACZZIYSwACZY5iXwACZqAAAwACRc8AAmaqYkcAAmavAAFy2wACZqsAAYaPAAJmtmJPAAJmuwACQB8AAma+D2cAAma+D2sAAma+D28AAma2YlMAAmbOD3cAAmbOD3sAAma2YlcAAmbaD3sAAma2YkcAAmbiD38AAmbiD4MAAmbiD4cAAma2Yl8AAmbwAwACZqsAAYaTAAJm+mJPAAJm/g+TAAJm/g+XAAJm+mJHAAJnCg+bAAJnCg+nAAJnCVsAAmcKD7cAAmcKD8MAAmcKD9MAAmcKD9sAAmcKD8sAAmcKD8cAAmcKD+8AAmb6Yl8AAmc0AwACZqsAAYaXAAJnPmJPAAJnQg+TAAJnPmJHAAJnSwABhpsAAmdLAAEY5wACZ0oZYwACZ0rBSwACZ0rBDwACZ0sAARkPAAJnPmJfAAJnZAMAAmarAAGGnwACZ25iRwACZ3IHFwACZ25iXwACZ3gAAwACRdMAAmeCYk8AAmeHAAGHewACZ4cAAYeDAAJnhwABh4sAAmeHAAGHkwACZ4cAAYebAAJnhwABh58AAmeHAAGHowACZ4cAAYerAAJnhwABh7MAAmeHAAGHuwACZ4cAAYfDAAJnhwABh8cAAmeHAAGHzwACZ4cAAYfXAAJnhwABh98AAmeHAAGH4wACZ4cAAYfrAAJnhwABh/MAAmeHAAGH+wACZ4cAAYgDAAJnhwABiAsAAmeHAAGIEwACZ4cAAYgbAAJnhwABiCMAAmeHAAGIKwACZ4cAAYgzAAJnhwABiDsAAmeHAAGIQwACZ4cAAYhHAAJnhwABiEsAAmeHAAGITwACZ4LKowACaAZiTwACaAifAAJoCwACRdMAAmgQowACaAinAAJoCwABhq8AAmgLAAGGswACaAsAAYa3AAJoCwABhrsAAmgLAAGGvwACaAsAAYbDAAJoCwABhscAAmgLAAGGywACaAsAAYbPAAJoCwABhtMAAmgLAAGG1wACaAsAAYbbAAJoCwABht8AAmgLAAGG4wACaAsAAYbnAAJoCwABhusAAmgLAAGG7wACaAsAAYbzAAJoCwABhvcAAmgLAAGG+wACaAsAAYb/AAJoCwABhwMAAmgLAAGHBwACaAsAAYcLAAJoCwABhw8AAmgLAAGHEwACaAsAAYcXAAJoCwABhxsAAmgLAAGHHwACaAsAAYcjAAJoCwABhycAAmgLAAGHKwACaAsAAYcvAAJoCwABhzMAAmgGYkcAAmikjwACaAZiXwACaKwDAAJngsqnAAJotmJPAAJouJ8AAmi7AAJF0wACaMCjAAJouKcAAmi7AAGHNwACaLsAAYc7AAJouwABhz8AAmi65V8AAmi7AAGHQwACaLsAAYdHAAJouwABh0sAAmi7AAGHTwACaLsAAYdTAAJouwABh1cAAmi6pVsAAmi7AAGHWwACaLsAAVtLAAJouhpjAAJotmJHAAJpBI8AAmi2Yl8AAmkMAwACZ4MAAYdfAAJpFmJPAAJpGwABh2MAAmkbAAGHawACaRsAAYdzAAJpFmJfAAJpKAADAAJF1wACaTMAAYhXAAJpNmJPAAJpOwABiFsAAmk6etcAAmk2YkcAAmlGjmcAAmlGwSsAAmlHAAF/9wACaTZiXwACaVcAAkXXAAJpWgLXAAJpMwABiF8AAmliYk8AAmlm0BcAAmliYkcAAmluah8AAmluwXMAAmluwX8AAmluwV8AAmluwVsAAmluwU8AAmluwUsAAmluF78AAmluwVMAAmluwUcAAmluwT8AAmluwUMAAmluwTMAAmliYl8AAmmkAwACaTMAAYhjAAJprmJHAAJpswABJ3cAAmmzAAGIZwACabJ9KwACabJqHwACabMAARjnAAJpswABf/MAAmmywM8AAmmywLsAAmmywPcAAmmywPMAAmmywOcAAmmywOMAAmmywV8AAmmywU8AAmmywVMAAmmywUsAAmmyF78AAmmywUcAAmmywT8AAmmywTMAAmmzAAJF1wACagcAAYhrAAJprmJfAAJqDAADAAJF2wACahZiRwACahsAAYiTAAJqFwABiG8AAmoiYk8AAmoknwACaicAAkXbAAJqLKMAAmokpwACaiZ4fwACaiZWgwACaiYPswACaiJiRwACakSPAAJqImJfAAJqTAMAAmoXAAGIcwACalZiTwACaloJnwACalsAATdLAAJqWhXnAAJqWhXzAAJqWwABN08AAmpYfwACalsAASivAAJqVmJTAAJqewABN1cAAmpWYkcAAmqAjwACalZiXwACaogAAwACRdwDAAJF4wACapZiRwACapsAAYjLAAJqmwABHpMAAmqbAAELdAMAAkXnAAJqqwABDscAAmquYlMAAmqxhwACaq5iRwACaroKIwACarrApwACarraYwACarog+wACarq7zwACarrCDwACarq70wACaroG5wACarrBZwACarq7xwACarrOiwACarq92wACarrbiwACaq5iXwACavADAAJqqwABFKsAAmr6YkcAAmr+u9MAAmr+wWcAAmr+u8cAAmr+zosAAmr+IPsAAmr+2mMAAmr6Yl8AAmsYAwACaqsAARQPAAJrImJPAAJrJwACRecAAmsrAAGI6wACaysAARQTAAJrImJHAAJrNgorAAJrImJfAAJrPAMAAmqrAAEQHwACa0ZiTwACa0sAAkXnAAJrTwABEDMAAmtPAAEQNwACa08AARBDAAJrRmJHAAJrXsCnAAJrXr3bAAJrXrvPAAJrXtuLAAJrXgbnAAJrXsIPAAJrXwACRecAAmt7AAEQywACa3sAARCHAAJrewABEgcAAmt7AAESAwACa3sAARCLAAJrewABEL8AAmtGYl8AAmuUAwACaqobnwACa55iTwACa6IQ7wACa6MAAkXnAAJrqwABE3cAAmuqc8MAAmueYkcAAmu3AAJF5wACa7sAARIHAAJruwABEgMAAmu7AAEQiwACa7sAARC/AAJrtgojAAJrnmJTAAJr0YcAAmueYl8AAmvYAwACaqpgcwACa+JiTwACa+ZgdwACa+ZgewACa+ZgfwACa+cAAkXnAAJr9lzbAAJr9mCDAAJr9mCLAAJr9mCPAAJr5YcAAmvmYIcAAmviYlMAAmwSDXMAAmviYkcAAmwaXycAAmwaXR8AAmwaXScAAmwaXSsAAmwaXSMAAmwaEQcAAmwaXRsAAmviYl8AAmw4AAMAAkXrAAJsQwABDzsAAmxGYkcAAmxKwdcAAmxKwc8AAmxKu6MAAmxKu7MAAmxKwfcAAmxKu7sAAmxKvdcAAmxKwdMAAmxKu6sAAmxKzm8AAmxKvcsAAmxK24MAAmxGYl8AAmx8AwACbEMAARSjAAJshmJHAAJsisHPAAJsirujAAJsiru7AAJsisHTAAJsirurAAJsis5vAAJshmJfAAJspAMAAmxDAAEUHwACbK5iTwACbLMAAkXrAAJstwABiO8AAmy3AAEUEwACbLcAAYjzAAJsrmJHAAJsxnmvAAJsrmJfAAJszAMAAmxDAAESJwACbNZiTwACbNsAAkXrAAJs3wABEDMAAmzfAAEQNwACbN8AARBDAAJs1mJHAAJs7sHXAAJs7r3LAAJs7tuDAAJs7wACResAAmz/AAESSwACbP8AARLDAAJs/wABEusAAmz/AAESTwACbP8AARLjAAJs/wABErsAAmzuu7MAAmzuvdcAAmzuwfcAAmzWYl8AAm0kAwACbEIb4wACbS5iTwACbTMAAkXrAAJtNmEzAAJtNmEvAAJtLmJHAAJtQwACResAAm1HAAETfwACbUcAARLrAAJtRwABEk8AAm1HAAES4wACbUcAARK7AAJtLmJfAAJtXAADAAJF7wACbWcAAYj7AAJtamJPAAJtbwABYg8AAm1u358AAm1qYkcAAm17AAFiEwACbXsAAWHzAAJtewABYhsAAm1qYl8AAm2IAwACbWcAAYj/AAJtkmJPAAJtlwACRe8AAm2bAAFkvwACbZsAAYkDAAJtmwABiQcAAm2bAAGJCwACbZsAAYkPAAJtmwABiRMAAm2bAAGJFwACbZsAAYkbAAJtmwABiR8AAm2bAAGJIwACbZsAAYknAAJtmwABiSsAAm2bAAGJLwACbZJiUwACbdMAAkXvAAJt1wABiTMAAm3XAAGJNwACbZJiRwACbeMAAWHfAAJt4l8/AAJt4wABGOcAAm3jAAE3MwACbeMAAYlDAAJt4wABiU8AAm3jAAGJUwACbeIWcwACbeIY8wACbeIZDwACbeIV1wACbeIV3wACbeMAAkXvAAJuFwABiWsAAm4XAAGJYwACbhcAAYlzAAJuFwABiW8AAm4XAAGJpwACbhcAAYmbAAJuFwABiXcAAm3iGUcAAm3iF68AAm3iGk8AAm3iGK8AAm3iGIcAAm3iGI8AAm3iGJ8AAm3iFosAAm3iFksAAm3iFkMAAm3jAAGJfwACbeIUOwACbeIUUwACbeIUywACbeIX9wACbeIZTwACbeIZuwACbeIZywACbeIZrwACbeIZwwACbeIZ2wACbeIZ8wACbeIaJwACbeIaNwACbeMAAYlnAAJt4wABiXsAAm3iF6cAAm3iF1MAAm3iF2MAAm3iF+sAAm3iGScAAm3iGCMAAm3iGC8AAm3iFWsAAm3iF8cAAm3iF88AAm3iF9cAAm3iF98AAm3iF5MAAm3iF28AAm3iF3cAAm3iF4MAAm3iF58AAm3iF4sAAm3iFu8AAm3iFlMAAm3iFlsAAm3iFpMAAm3iFpsAAm3iFt8AAm3iFoMAAm3iFgsAAm3iFhMAAm3iFhsAAm3iFiMAAm3iFrcAAm3iFssAAm3iGA8AAm3iGBcAAm3iGQMAAm3iFqsAAm3iF78AAm3iF7cAAm3iGEsAAm3iGG8AAm3iGOcAAm3iGF8AAm3iGDsAAm3iGLsAAm3iGM8AAm3iGNcAAm3iGH8AAm3iGHcAAm3iFQ8AAm3iFScAAm3iFRcAAm3iFR8AAm3iFTMAAm3iGN8AAm3iGAMAAm2SYl8AAm90AwACbWcAAYmrAAJvfmJPAAJvgJ8AAm+DAAJF7wACb4ijAAJvgKcAAm+CF/8AAm+DAAGJswACb4MAAYm3AAJvfmJHAAJvoI8AAm9+Yl8AAm+oAwACbWcAAYm7AAJvsmJPAAJvthM3AAJvthIPAAJvsmJHAAJvwhxfAAJvwwABiaMAAm/AjwACb7JiUwACb9LiWwACb9MAATPfAAJv0wABM/MAAm/S0asAAm+yYl8AAm/mF/8AAm/nAAGJvwACb+cAAYnAAwACRfMAAm/2YkcAAm/7AAGJ4wACb/sAAYnvAAJv+wABifMAAm/7AAGJ9wACb/r7+wACb/sAAYn/AAJv+wABigMAAm/7AAGKBwACb/cAAYnTAAJwHmJPAAJwIwABidcAAnAiCa8AAnAeYlMAAnAuFecAAnAuEUsAAnAuZ9cAAnAeYkcAAnA8jwACcB5iXwACcEQDAAJv9wABidsAAnBOYkcAAnBSah8AAnBSHLcAAnBSGhsAAnBSGjcAAnBSGfMAAnBSGdsAAnBSGcsAAnBSGcMAAnBSGbsAAnBSGa8AAnBSX18AAnBOYl8AAnCAAAMAAkX3AAJwiwABigsAAnCOYk8AAnCSD58AAnCTAAJF9wACcJsAAYoTAAJwmwABihcAAnCOYlsAAnCmuzsAAnCOYkcAAnCuuz8AAnCtLwACcK8AAU0zAAJwjmJfAAJwvAADAAJF+wACcMZiRwACcMsAAYzDAAJwywACRfsAAnDTAAGMywACcMcAAYorAAJw2mJPAAJw3oNbAAJw3wACRfsAAnDnAAGKLwACcOcAAYo3AAJw3gpDAAJw3glPAAJw3wABPhsAAnDfAAE9swACcN7dJwACcN8AATsTAAJw3wABijMAAnDeDwcAAnDfAAGKOwACcNpiUwACcRcAAYpLAAJxFwABPSsAAnEXAAGKTwACcRcAAX9/AAJxFrffAAJw2mJHAAJxLwABilMAAnEvAAE+PwACcS7lDwACcS8AAYpXAAJxLwABPS8AAnEvAAE+LwACcS8AAT1bAAJxLwABAmcAAnEvAAGKWwACcS8AAT17AAJxLgkLAAJxLnMjAAJxLhE3AAJxLwABPiMAAnEvAAGKXwACcS8AAT4nAAJxLwABPYMAAnEuzT8AAnEuvj8AAnEvAAJF+wACcX8AAYpjAAJw2mJfAAJxhAMAAnGHAAGKPwACcYcAAYpDAAJxhwABikcAAnDHAAGKZwACcZpiTwACcZ8AAT2LAAJxmmJfAAJxpAMAAnDHAAGKawACca5iRwACcbIRNwACcbMAAQJnAAJxsI8AAnGuYl8AAnHAAwACcMcAAYp7AAJxymJPAAJxzwABPSsAAnHKYkcAAnHWEWcAAnHVWwACcdYg7wACcdYGlwACcdYMXwACcdSPAAJxymJTAAJx8XMAAnHKYl8AAnH4AwACcMcAAYp/AAJyAmJPAAJyBwABioMAAnICYkcAAnIPAAE9twACcgJiUwACchaOzwACcgJiXwACch8AAkX7AAJyIhlXAAJyIwABiocAAnDHAAGKiwACci5iTwACcjMAAT2LAAJyLmJfAAJyOwACRfsAAnI+GVcAAnI/AAGKhwACcMcAAYqPAAJySmJPAAJyTwACRfsAAnJTAAFHUwACclMAAVRzAAJyUwABipMAAnJPAAE+MwACckpiUwACcmYJmwACcmaOzwACcmcAAT5PAAJyZwABiqsAAnJnAAGKMwACckpiRwACcn8AAYqXAAJyfwABipsAAnJ+2YsAAnJ/AAJF+wACco8AAYqjAAJyjwABirMAAnKPAAGKuwACcn8AATtPAAJyfwABiq8AAnJ/AAGKtwACcn8AAQJnAAJyfwABilsAAnJ8jwACcn4RNwACcn7NPwACcn8AAT23AAJySmJfAAJywwACRfsAAnLGGVcAAnDHAAGKwwACcs5iTwACctMAAkX7AAJy1kibAAJyzmJTAAJy3wACRfsAAnLjAAGKxwACcs5iRwACcusAAYqvAAJy6wACRfsAAnLzAAGKuwACcusAAT4jAAJyzmJfAAJy/AMAAnDHAAGKywACcwZiTwACcwsAAkX7AAJzDkibAAJzBmJTAAJzFwACRfsAAnMbAAGKzwACcwZiRwACcyMAAYqvAAJzIwACRfsAAnMrAAGKuwACcwZiXwACczADAAJwxwABitMAAnM6YlMAAnM/AAJF+wACc0MAAYrXAAJzOmJHAAJzSwABiq8AAnNLAAJF+wACc1MAAYq7AAJzOmJfAAJzWAMAAnDHAAGK2wACc2JiTwACc2cAAkX7AAJzakibAAJzYmJTAAJzcwACRfsAAnN3AAGK3wACc2JiRwACc38AAYqvAAJzfwACRfsAAnOHAAGKuwACc38AAT4jAAJzYmJfAAJzkAMAAnDHAAGK4wACc5piTwACc58AAkX7AAJzokibAAJzmmJTAAJzqwACRfsAAnOvAAGK5wACc5piRwACc7cAAYqvAAJztwACRfsAAnO/AAGKuwACc7cAAT4jAAJzmmJfAAJzyAMAAnDHAAGK6wACc9JiUwACc9cAAkX7AAJz2wABiucAAnPSYkcAAnPjAAGKrwACc+MAAkX7AAJz6wABirsAAnPjAAE+IwACc9JiXwACc/QDAAJwxwABiu8AAnP+Yk8AAnQDAAJF+wACdAcAAYrzAAJ0BkibAAJ0BwABit8AAnQHAAGK9wACdAcAAYr7AAJ0BwABi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wACekifAAJ6SwACRgMAAnpQowACekinAAJ6Sh4bAAJ6Sr8zAAJ6SgO3AAJ6Sr27AAJ6RmJHAAJ6bI8AAnpGYl8AAnp0AwACekJ5dwACen5iTwACeoIQhwACen5iUwACeosAAkYDAAJ6jtWXAAJ6jwABTNMAAnp+YkcAAnqbAAFTewACepsAAkYDAAJ6owABjNsAAnqjAAGM3wACeqMAAYzjAAJ6owABjQMAAnqbAAFO7wACepsAAU2TAAJ6mwABTaMAAnqbAAFNrwACepsAAVXLAAJ6mwABVBsAAnqavdMAAnqbAAFUJwACepsAAU4fAAJ6mwABTfMAAnqbAAFQYwACepsAAY0bAAJ6fmJfAAJ65AMAAnpDAAGNJwACeu5iTwACevIJrwACevMAAWbDAAJ67mJfAAJ6/AADAAJGBwACewcAAY0rAAJ7CmJPAAJ7DwACRgcAAnsSxrcAAnsS1ZcAAnsTAAGNLwACexMAAUPXAAJ7EwABjTMAAnsTAAGNNwACexMAAUzHAAJ7EwABEC8AAnsTAAGNOwACexMAAY0/AAJ7EwABjUMAAnsTAAGNRwACexMAAY1LAAJ7EwABjU8AAnsTAAGNUwACexMAAUyfAAJ7EwABiRsAAnsTAAGNVwACexMAAY1bAAJ7EwABjV8AAnsTAAGNYwACexITawACewpiUwACe28AAkYHAAJ7cwABjWsAAntzAAGNcwACe3MAAY13AAJ7ct1TAAJ7cwABTHMAAntvAAE8mwACe24S8wACewpiVwACe5MAAkYHAAJ7lwABjWsAAnsKYkcAAnufAAJGBwACe6MAAY17AAJ7owABTSsAAnujAAGNhwACe6MAAY2LAAJ7owABjocAAnujAAGN4wACe6MAAY3vAAJ7owABjesAAnujAAGOqwACe6MAAY6zAAJ7owABjrsAAnujAAGO1wACe6MAAY57AAJ7ngpvAAJ7nwABjZcAAnufAAE8hwACe55qHwACe54ctwACe58AATjHAAJ7nhRTAAJ7nhUPAAJ7nhUXAAJ7nhUfAAJ7nhUnAAJ7nwABjacAAnueFWsAAnueFqsAAnufAAGNuwACe55fZwACe55fhwACe54XkwACe58AAY3HAAJ7nhhLAAJ7nhg7AAJ7nhhfAAJ7nhhvAAJ7nhh/AAJ7nhh3AAJ7nhi7AAJ7nhjPAAJ7nhjXAAJ7nhfHAAJ7nwABjg8AAnueF88AAnufAAGOJwACe54X1wACe58AAY4vAAJ7nhjnAAJ7nheLAAJ7nwABjkcAAnueF3cAAnufAAGOTwACe54XgwACe58AAY5XAAJ7nhdvAAJ7nwABjlsAAnueFu8AAnueF58AAnufAAGOYwACe54XpwACe58AAY5nAAJ7nhlHAAJ7nhXXAAJ7nhXfAAJ7nwABja8AAnueFoMAAnufAAGOjwACe58AAY6TAAJ7nwABjoMAAnueGA8AAnueGBcAAnueGK8AAnufAAFPZwACe54WmwACe58AAY2zAAJ7nwABjnMAAnufAAGOwwACe58AAY7HAAJ7nhaTAAJ7nhgjAAJ7nhZTAAJ7nwABjs8AAnueFlsAAnufAAE3PwACe54WCwACe54WGwACe54WEwACe54XrwACe58AAY3TAAJ7nhjfAAJ7nhdTAAJ7nha3AAJ7nhbLAAJ7nhbfAAJ7nwABjysAAnueGU8AAnueF/cAAnueGIcAAnueGI8AAnueGJ8AAnueGPMAAnueGQ8AAnueGQMAAnueF78AAnueF7cAAnufAAGPRwACe54WQwACe54WSwACe54WiwACe54XYwACe54X6wACe54ZJwACe54YLwACe54VywACe54YAwACewpiXwACfXADAAJ7BwABj1cAAn16Yk8AAn1+EIcAAn1+Ca8AAn16YkcAAn2KX0cAAn2KGnMAAn2KGn8AAn2KGosAAn2KGpcAAn2KGqcAAn2KGrcAAn2KGssAAn2KGt8AAn2KGusAAn2KGvcAAn2KGw8AAn2KGysAAn2KGzcAAn2KG0MAAn16Yl8AAn3IAwACewcAAY9fAAJ90mJPAAJ91pN7AAJ91q8XAAJ90mJfAAJ94AMAAnsHAAGPYwACfepiTwACfe8AAkYHAAJ98wABL0sAAn3zAAGPZwACffMAAY9rAAJ97wABjbcAAn3vAAGN3wACfepiWwACfgqKywACfepiUwACfhMAAY3LAAJ+EwABjY8AAn3qYkcAAn4fAAGNkwACfh8AAY5DAAJ+HmMDAAJ+HwABjasAAn4fAAEPlwACfh8AAU4rAAJ+HwABjuMAAn4fAAGPOwACfh8AAY3bAAJ+HwABjecAAn4fAAGN/wACfh8AAU/fAAJ+HwABUDcAAn4evj8AAn4fAAJGBwACflsAAYpjAAJ+HI8AA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wAChlMAAZWPAAKGUou/AAKGUwABlZMAAoZTAAGVlwAChlMAAZWbAAKGUwABlZ8AAoZTAAGVowAChlMAAZWnAAKGUwABlasAAoZTAAGVrwAChlMAAZWzAAKGUwABlbcAAoZTAAGVuwAChlMAAZW/AAKGUwABlcMAAoZTAAGVxwAChlMAAZXLAAKGUwABlc8AAoZTAAGV0wAChlMAAZXXAAKGUwABldsAAoZTAAGV3wAChlMAAZXjAAKGUwABlecAAoZTAAGV6wAChlKDqwAChlMAAkYvAAKG+wABle8AAob7AAGV8wAChvsAAZX3AAKG+wABlfsAAob7AAGV/wAChvsAAZYDAAKG+wABlgcAAob7AAEgrwAChvsAAZYLAAKG+wABlg8AAob7AAGWEwAChvsAAZYXAAKG+wABlhsAAob7AAGWHwAChvsAAZYjAAKG+wABlicAAob7AAGWKwAChvsAAZYvAAKG+wABljMAAob7AAGWNwAChvsAAZY7AAKG+wABlj8AAob7AAGWQwAChvsAAZZHAAKG+wABRoMAAob7AAGWSwAChvsAAZZPAAKG+wABllMAAob7AAGWVwAChvsAAZZbAAKG+wABll8AAob7AAGWYwAChvsAAZZnAAKG+wABlmsAAob7AAFGfwAChvsAAZZvAAKG+wABlnMAAob7AAGWdwAChvsAAZZ7AAKG+wABln8AAob68JcAAob7AAGWgwAChvsAAZaHAAKG+wABlosAAob7AAGWjwAChvsAAZaTAAKG+wABlpcAAob7AAGWmwAChvsAAZafAAKG+wABlqMAAob7AAFGdwAChvsAAZanAAKG+wABlqsAAob7AAGWrwAChvsAAUZ7AAKG+wABlrMAAob7AAGWtwAChvsAAZa7AAKG+wABlr8AAob7AAGWwwAChvsAAZbHAAKG+wABlssAAob7AAGWzwAChvsAAZbTAAKG+wABRmsAAob7AAGW1wAChvsAAZbbAAKG+wABlt8AAob7AAFGcwAChvsAAZbjAAKG+wABlucAAob7AAGW6wAChk5iRwACiB5YTwACiB8AAZbvAAKIHwABlvMAAogfAAGW9wAChk5iXwACiDMAAkYvAAKINgLUAwACRjMAAog+YkcAAohDAAGXbwACiD8AAW6XAAKISmJPAAKITwACRjMAAohS3V8AAohTAAFu1wACiFLVlwACiFMAAQ4jAAKIUs7/AAKITgvfAAKISmJTAAKIbwACRjMAAohzAAFLjwACiEpiRwACiHsAAZcPAAKIewABlyMAAoh7AAGXKwACiHsAAXCDAAKIewABcI8AAoh7AAFwkwACiEpiXwACiJQAAwACRjcAAoifAAFumwACiKJiTwACiKcAAkY3AAKIqt1nAAKIqt1fAAKIqwABbtcAAoiq1ZcAAoiq3lcAAoiiYlMAAojDAAJGNwACiMcAAQ4jAAKIxs7/AAKIxrw3AAKIomJHAAKI1wACRjcAAojbAAGXowACiNsAAZe3AAKI1wABcSMAAoiiYl8AAojoAAMAAkY7AAKI8wABbp8AAoj2Yk8AAoj7AAJGOwACiP7O/wACiP8AAQ4jAAKI/t1bAAKI/t1fAAKI/t1XAAKI/wABbtcAAoj+1ZcAAoj2YlMAAokfAAJGOwACiSMAAR5TAAKJIwABS48AAoj2YkcAAokvAAFxNwACiS8AAkY7AAKJNwABmFcAAok3AAGYawACiS8AAXFLAAKJLwABb8cAAoj2Yl8AAolIAAMAAkY/AAKJUwABbqMAAolWYkcAAolbAAGYzwACiVZiXwACiWAAAwACRkMAAolrAAGY4wACiW5iRwACiXMAAZjnAAKJcwABmOsAAolzAAGZCwACiXMAAZkTAAKJcwABmScAAoluYl8AAomIAAMAAkZHAAKJkwABbqcAAomWYk8AAombAAGZUwACiZsAAkZHAAKJowABDiMAAomjAAEOHwACiaLdXwACiaMAAUx7AAKJowABbt8AAomjAAEeUwACiaMAAUuPAAKJowABbtcAAomi1ZcAAomi3lcAAomWYlMAAonPAAJGRwACidK8NwACiZZiRwACidsAAZlXAAKJ2wABmVsAAonbAAFxGwACiZZiXwACiegAAwACRksAAonyYksAAon3AAGZqwACifMAAZmzAAKJ/mJPAAKKAgL3AAKKAgmvAAKJ/mJfAAKKDAMAAonzAAGZtwACihZiTwACihsAAZm7AAKKGhOTAAKKGrG7AAKKFmJfAAKKKAMAAonzAAFurwACijJiTwACijcAAXDLAAKKNwACRksAAoo/AAGZvwACijJiRwACikcAAZnDAAKKRwABmccAAopHAAGZywACikcAAXC3AAKKMmJfAAKKWAMAAonzAAFuqwACimJiTwACimcAAkZLAAKKas7/AAKKas4PAAKKat1fAAKKawABbtsAAoprAAFMewACimsAAZnXAAKKZrr7AAKKYmJHAAKKiwABcKsAAoqLAAJGSwACipMAAZnnAAKKkwABmfcAAoqTAAGZ8wACipMAAZnrAAKKYmJfAAKKpAMAAonzAAGaAwACiq5iTwACirMAAkZLAAKKts7/AAKKts4PAAKKrmJHAAKKwwABmd8AAorCah8AAorCHLcAAorCzwMAAorCGbsAAorCGhsAAorCGdsAAorCGfMAAorCzxcAAorCzxsAAorCGcMAAoquYl8AAorwAAMAAkZPAAKK+wABTEMAAor+Yk8AAosCHhsAAosDAAGaCwACiwMAAZoPAAKLAwACRk8AAosTAAGaEwACixMAAZoXAAKLEwABmhsAAor+YlMAAosjAAFOywACiyMAAU7rAAKLIwABTucAAor+Yl8AAoszAAJGTwACizYC1AMAAkZTAAKLPwABmh8AAotCYk8AAotHAAGaIwACi0cAAVAXAAKLQmJHAAKLUo2zAAKLUupXAAKLQmJfAAKLXAMAAos/AAGaJwACi2ZiTwACi2oJFwACi2ZiWwACi3ADAAKLZmJHAAKLewABUH8AAot7AAFQewACi3sAAVBDAAKLewABUBMAAot7AAGaKwACi3sAAVA/AAKLegojAAKLZmJTAAKLmmSrAAKLPwABmi8AAouiYk8AAoumkusAAouiYkcAAouvAAFQfwACi68AAVB7AAKLrwABUEMAAouvAAFQEwACi64KIwACi68AAZorAAKLrwABUD8AAouiYlMAAovOZKsAAovOCRcAAouiYl8AAovYAwACiz8AAZo7AAKL4mJPAAKL5hCHAAKL5gkXAAKL5wABmj8AAoviYlMAAov3AAJGUwACi/sAAUzTAAKL9mSrAAKL4mJHAAKMBwABUH8AAowHAAFQewACjAcAAVBDAAKMBwABUBMAAowHAAGaKwACjAcAAVA/AAKMBgojAAKL4mJfAAKMJAMAAos/AAGaRwACjC5iTwACjDMAAVXXAAKMLmJHAAKMOwABUH8AAow7AAGaSwACjDsAAVB7AAKMOgojAAKMLmJfAAKMTAADAAJGVwACjFcAAZpPAAKMWmJPAAKMXhCHAAKMXgXbAAKMWmJTAAKMawACRlcAAoxvAAFM0wACjFpiR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AKQnwABnCMAApCfAAGb7wACkJ8AAZvzAAKQnpyXAAKQnwABnCcAApCSy0cAApCOYlsAApC6uzsAApCOYkcAApDCuz8AApDDAAFaHwACkMMAAVnzAAKQwoU3AAKQwsrfAAKQwwABW48AApDCyz8AApCOYlMAApDiyvMAApCOYl8AApDoAwACj2sAAZwrAAKQ8mJPAAKQ9g+fAAKQ9wACROsAApD/AAGb7wACkPJiWwACkQa7OwACkPJiRwACkQ67PwACkQ7LPwACkQ7K3wACkQ6FNwACkQ8AAVnzAAKRDwABWh8AApDyYlMAApEqyvMAApEqy0cAApEqZwsAApDyYl8AApE4AwACj2sAAZwzAAKRQmJPAAKRRg+fAAKRQmJbAAKRTrs7AAKRQmJHAAKRVrs/AAKRVwABWh8AApFCYl8AApFgAwACj2sAAZw7AAKRamJPAAKRbJ8AApFvAAJE6wACkXSjAAKRbKcAApFuD7sAApFu0CsAApFuor8AApFqYkcAApGMjwACkWpiXwACkZQDAAKPawABnEMAApGeYlsAApGiuzsAApGeYkcAApGquz8AApGeYlMAApGzAAEv+wACkbIS8wACkbIT0wACkbITUwACkbITVwACkbJ5ywACkbMAAVg/AAKRsrHLAAKRsssPAAKRshOnAAKPawABnEsAApHeYk8AApHiD58AApHiZwsAApHjAAEv+wACkeITpwACkeMAAZxPAAKR4hLzAAKR4hPTAAKR4hNTAAKR4hNXAAKR4nnLAAKR4wABWD8AApHeYlsAApISuzsAApHeYkcAApIauz8AApHeYlMAApIiyw8AApIiscsAApHeYl8AApIsAwACj2sAAZxTAAKSNmJPAAKSOJ8AApI7AAJE6wACkkCjAAKSOKcAApI6CasAApI6EjsAApI6Y1cAApI7AAE74wACkjqxuwACkjsAATvrAAKSOwABnG8AApI7AAE75wACkjZiRwACkmyPAAKSNmJfAAKSdAMAAo9rAAGccwACkn5iUwACkoMAAS/7AAKSgwABWI8AApKDAAFYdwACkn5iRwACkpLeawACkpK7PwACkn5iWwACkp67OwACkn5iXwACkqQDAAKPawABnHsAApKuYk8AApKyD7sAApKzAAEv+wACkrMAAVh3AAKSrmJHAAKSwt5rAAKSrmJfAAKSyAMAAo9rAAGcfwACktJiRwACktbK+wACktbK/wACktbLYwACktJiXwACkuQDAAKPawABnIMAApLuYk8AApLzAAJE6wACkvalqwACku5iUwACkv8AAQAzAAKS7mJHAAKTBsr/AAKS7mJfAAKTDAMAAo9rAAGchwACkxZiUwACkxsAAQAzAAKTFmJHAAKTIstjAAKTFmJfAAKTKAMAAo9rAAGciwACkzJiTwACkzcAAkTrAAKTOqWrAAKTMmJTAAKTQwABADMAApMyYkcAApNKyv8AApMyYl8AApNQAwACj2sAAZyPAAKTWmJHAAKTXsr/AAKTXstjAAKTWmJTAAKTawABADMAApNaYl8AApNwAwACj2sAAZyTAAKTemJPAAKTfg+fAAKTfwABADMAApN/AAJE6wACk4pImwACk3piWwACk5K7OwACk3piRwACk5q7PwACk5rK+wACk5rK/wACk3piUwACk6sAAViPAAKTemJfAAKTsAMAAo9rAAGcnwACk7piTwACk74PnwACk78AAS/7AAKTvwABWHMAApO/AAFYjwACk74S4wACk7piWwACk9a7OwACk7piRwACk967PwACk97K+wACk97K/wACk97LYwACk97eawACk7piUwACk/cAAVh3AAKTumJfAAKT/AMAAo9rAAGcrwAClAZiTwAClAsAAZyzAAKUBmJHAAKUEsr7AAKUEsr/AAKUEstjAAKUEt5rAAKUBmJTAAKUJwABWI8AApQGYl8AApQsAwACj2sAAZy3AAKUNmJPAAKUOg+fAAKUOwABL/sAApQ2YlsAApRGuzsAApQ2YkcAApROuz8AApQ2YlMAApRXAAFYdwAClDZiXwAClFwDAAKPawABnL8AApRmYkcAApRq8UsAApRmYl8AApRwAwACj2sAAZzDAAKUemJPAAKUfg+fAAKUfwACROsAApSHAAGcywAClH8AATvjAAKUemJbAAKUkrs7AAKUemJHAAKUmrs/AAKUmvFLAAKUmsr7AAKUmsr/AAKUemJTAAKUrwABWI8AApR6Yl8AApS0AwACj2sAAZzbAAKUvmJPAAKUwg+fAAKUvmJbAAKUyrs7AAKUvmJHAAKU0rs/AAKU0sr/AAKUvmJTAAKU3wABWI8AApS+Yl8AApTkAwACj2sAAZzjAAKU7mJHAAKU8ssHAAKU8wABWL8AApTuYl8AApT8AwACj2sAAZznAAKVBmJPAAKVCg+fAAKVCwACROsAApUSSJsAApUTAAGc7wAClQZiWwAClR67OwAClQZiRwAClSa7PwAClSbLBwAClScAAVi/AAKVBmJTAAKVNg+7AAKVNwABWI8AApUGYl8AApVAAwACj2sAAZz3AAKVSmJPAAKVTg+fAAKVTg+7AAKVThPTAAKVSmJbAAKVXrs7AAKVSmJHAAKVZrs/AAKVSmJfAAKVbAMAAo9rAAGc+wAClXZiTwAClXoPnwAClXoPuwAClXsAAkTrAAKVhwABF48AApWHAAGc/wAClXZiWwAClZK7OwAClXZiRwAClZq7PwAClZsAAVqnAAKVmwABWq8AApV2Yl8AApWoAAMAAkZvAAKVswABnQcAApW2Yk8AApW6D58AApW7AAJGbwAClcMAAZ0PAAKVuhWfAAKVtmJbAAKVzrs7AAKVzszzAAKVtmJHAAKV2rs/AAKV2wABW68AApXZLwACldoP4wACldsAARfvAAKV2I8AApW2YlMAApX2bdsAApX3AAGdIwAClfcAAVrbAAKV9wABnT8AApW2Yl8AApYKVScAApWzAAGdQwAClhJiRwAClhcAAVpXAAKWEmJfAAKWHAMAApWzAAGdRwACliZiTwAClioCrwAClisAAVrbAAKWKmcLAAKWJmJHAAKWOsrrAAKWOwABGJcAApY7AAE6VwACljsAAVrXAAKWOwABWlcAApY7AAJGbwACllMAAZ1LAAKWUwABnVsAApY5WwACljsAAZ1PAAKWOI8AApYmYl8AApZoAAMAAkZzAAKWcwABnW8AApZ2Yl8AApZ4AwAClnMAAZ1zAAKWgmJHAAKWhwABnXcAApaCYl8AApaMAwAClnMAAZ17AAKWlmJfAAKWmAADAAJGdwAClqMAAZ1/AAKWpmJPAAKWqwACRncAApavAAEUEwAClqoS8wAClqZiRwAClroVmwAClrsAAU0zAAKWuwACRncAApbHAAFNKwAClroV1wAClroWCwAClroWGwAClroWQwAClroWgwAClroWKwAClroWkwAClroWiwAClroWmwAClroWqwAClqZiXwAClvQAAwACRnsAApb/AAGdkwAClwJiTwAClwcAAkAfAAKXCg9nAAKXCg9rAAKXCg9vAAKXAmJTAAKXGg93AAKXGg97AAKXAmJXAAKXJg97AAKXAmJHAAKXLg9/AAKXLg+DAAKXLg+HAAKXAmJfAAKXPAMAApb/AAGdlwACl0ZiTwACl0oPkwACl0oPlwACl0ZiRwACl1YPmwACl1YPpwACl1VbAAKXVg+3AAKXVg/DAAKXVg/TAAKXVg/bAAKXVg/LAAKXVg/HAAKXVg/vAAKXRmJfAAKXgAMAApb/AAGGlwACl4piTwACl44PkwACl4piRwACl5cAAYabAAKXll8/AAKXlhljAAKXlhd3AAKXlhXXAAKXlhZTAAKXlhlHAAKXlhnbAAKXlwABGQ8AApeKYl8AApe8AAMAAkZ/AAKXxwABnZ8AApfKYk8AApfOzVMAApfPAAGdowACl88AAZ2nAAKXymJHAAKX3wABGHsAApferPsAApfepVsAApfeyusAApffAAEYmwACl97u3wACl98AARifAAKX3wABF+8AApffAAEYlwACl98AARfzAAKX3wABGKMAApfKYlMAApgOy+8AApfKYl8AApgUAwACl8cAAZ2rAAKYHmJPAAKYIs1TAAKYHmJHAAKYKsrrAAKYKwABGJcAApgrAAE6VwACmCsAAVrXAAKYHmJfAAKYPAMAApfHAAGdrwACmEZiUwACmErNUwACmErL7wACmEZiRwACmFbK9wACmFcAARfzAAKYVwABF+8AAphGYl8AAphkAwACl8cAAZ2zAAKYbmJTAAKYcs1TAAKYcsvvAAKYbmJHAAKYfsr3AAKYfwABF/MAAph/AAEX7wACmG5iXwACmIwDAAKXxwABnbcAApiWYk8AApiazVMAApiWYl8AApigAwACl8cAAZ27AAKYqmJTAAKYrs1TAAKYrsvvAAKYqmJHAAKYusr3AAKYuwABF/MAApi7AAEX7wACmKpiXwACmMgDAAKXxwABnb8AApjSYk8AApjWzVMAApjSYl8AApjcAAMAAkaDAAKY5wABncMAApjqYkcAApjuF28AApjuFu8AApjqYl8AApj4AwACmOcAAZ3HAAKZAmJPAAKZBwABMycAApkGzVMAApkHAAGdywACmQcAAkaDAAKZFwABnc8AApkCYlMAApkfAAJGgwACmSLO/wACmQJiRwACmSpqHwACmSpfZwACmSsAAkaDAAKZNwABndMAApk3AAGd1wACmTcAAZ3bAAKZKhabAAKZKhXXAAKZKhZTAAKZKheTAAKZKheLAAKZKhd3AAKZKheDAAKZKhdvAAKZKhefAAKZKhbvAAKZKhfXAAKZKhfPAAKZKhfHAAKZKhenAAKZKhdjAAKZKharAAKZKha3AAKZKhbfAAKZKhYLAAKZKhaDAAKZKhaTAAKZKhbLAAKZKhgPAAKZKhgXAAKZKwABnM8AApkCYl8AApmoAwACmOcAAZ3nAAKZsmJPAAKZts1TAAKZtwABnesAApm2nEsAApmyYkcAApnGIuMAApnGe5MAApnGE9sAApnHAAET6wACmcYaNwACmcYZ8wACmcYZ2wACmcYZwwACmcYZuwACmcYZrwACmcYZywACmbJiXwACmfQDAAKY5wABne8AApn+Yk8AApoCzVMAApn+YkcAApoKX0cAApoKG0MAApoKGzcAApoKGysAApoKGw8AApoKGvcAApoKGt8AApoKGusAApoKGssAApoKGrcAApoKGqcAApoKGpcAApoKGosAApoKGn8AApoKGnMAApn+Yl8AAppIAAMAAkaHAAKaUmJHAAKaVwABnpMAAppTAAGd/wACml5iTwACmmMAAkaHAAKaZwABm98AAppnAAEUMwACml5iUwACmnIJWwACmnLd2wACmnGHAAKaXmJHAAKagt8/AAKagwACRocAApqLAAGeAwACmosAAZ4HAAKagshbAAKagwABWesAApqCIuMAAppeYl8AApqgAwACmlMAAZ4LAAKaqmJPAAKarhEPAAKarwACRocAApq3AAGb6wACmrcAAZvvAAKatwABm/MAApqqYkcAAprHAAJGhwACmssAAZ4PAAKaywABnhMAAprGyIMAAprGk5sAAprHAAFaHwACmscAAVnzAAKaxiLjAAKaqmJfAAKa6AMAAppTAAGeGwACmvJiTwACmvYRDwACmvcAAkaHAAKa/wABnh8AApr2Zb8AApryYkcAApsLAAFbSwACmwrLIwACmwoi4wACmvJiXwACmxgDAAKaUwABniMAApsiYlMAApsmZwsAApsmyvMAApsmy0cAApsiYkcAAps3AAFkywACmzcAAVofAAKbNwABWfMAAps2hTcAAps2yt8AAps2yz8AAps2IuMAApsiYl8AAptUAwACmlMAAZ4nAAKbXmJPAAKbYmcLAAKbYwACRocAAptrAAGcIwACm2sAAZvvAAKbawABm/MAAptqnJcAAptrAAFauwACm2sAAZwnAAKbXmJTAAKbhsrzAAKbhstHAAKbXmJHAAKbkwACRocAApuXAAGeKwACm5cAARSLAAKbkwABZMsAApuTAAFaHwACm5MAAVnzAAKbkoU3AAKbksrfAAKbkwABW48AApuSyz8AApuSIuMAApteYl8AApvAAwACm8JVJwACmlMAAZ5bAAKbzmJTAAKb0g+7AAKb0hLzAAKb0hPTAAKb0hNTAAKb0hNXAAKb0nnLAAKb0wABWD8AApvSscsAApvSyw8AApvSE6cAApvOYkcAApv/AAFbSwACm/4i4wACm85iXwACnAgDAAKaUwABnl8AApwSYk8AApwWD7sAApwWE6cAApwXAAGcTwACnBYS8wACnBYT0wACnBYTUwACnBYTVwACnBZ5ywACnBcAAVg/AAKcFwACRocAApw/AAGeHwACnBJiUwACnEbLDwACnEaxywACnBJiRwACnFMAAVtLAAKcUiLjAAKcEmJfAAKcXAMAAppTAAGeYwACnGZiTwACnGsAAVh3AAKcZmJTAAKccg+7AAKccwABWI8AApxmYkcAApx/AAFbSwACnH7eawACnH4i4wACnGZiXwACnIwDAAKaUwABnmcAApyWYk8AApyaD7sAApybAAJGhwACnKMAAZ4fAAKcmwABWHcAApyWYkcAApyvAAFbSwACnK7eawACnJZiXwACnLgDAAKaUwABnmsAApzCYkcAApzGyvsAApzGyv8AApzGy2MAApzCYl8AApzUAwACmlMAAZ5vAAKc3mJPAAKc4wACRocAApzmpasAApzeYlMAApzvAAEAMwACnN5iRwACnPbK/wACnN5iXwACnPwDAAKaUwABnnMAAp0GYk8AAp0LAAJGhwACnQ6lqwACnQZiRwACnRcAAVtLAAKdFsr/AAKdBmJTAAKdIwABADMAAp0GYl8AAp0oAwACmlMAAZ53AAKdMmJPAAKdNwABADMAAp03AAJGhwACnT5ImwACnTJiRwACnUbK+wACnUbLYwACnUYi4wACnUbK/wACnUcAAVtLAAKdMmJTAAKdXwABWI8AAp0yYl8AAp1kAwACmlMAAZ57AAKdbmJHAAKdcvFLAAKdbmJfAAKdeAMAAppTAAGefwACnYJiTwACnYcAAkaHAAKdiwABnMsAAp2HAAE74wACnYJiRwACnZbxSwACnZYi4wACnZbK+wACnZbK/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wACoacAATQLAAKhjmJHAAKhswABnvMAAqGOYl8AAqG6VScAAp9/AAGe/wACocJiTwACocYPnwACocYNEwACocYJFwACocbRpwACocJiWwACodsAATQLAAKhwmJHAAKh4wABnvMAAqHCYl8AAqHoAwACn38AAZ8LAAKh8mJPAAKh9g+fAAKh9gL3AAKh9tGnAAKh8mJbAAKiBwABNAsAAqHyYkcAAqIPAAGe8wACofJiXwACohQDAAKffwABnw8AAqIeYk8AAqIiD58AAqIiFfMAAqIi08sAAqIiCRcAAqIeYlsAAqI3AAE0CwACoh5iRwACoj8AAZ7zAAKiHmJfAAKiRAMAAp9/AAGfEwACok5iTwAColIPnwAColIV8wAColLTywAColIC9wACok5iWwAComcAATQLAAKiTmJHAAKibwABnvMAAqJOYl8AAqJ0AwACn38AAZ8XAAKifmJPAAKigg+fAAKighXzAAKigtGnAAKifmJbAAKikwABNAsAAqJ+YkcAAqKbAAGe8wACon5iXwACoqADAAKffwABnxsAAqKqYk8AAqKuD58AAqKuFfMAAqKu08sAAqKuCRcAAqKu0acAAqKqYlsAAqLHAAE0CwACoqpiRwACos8AAZ7zAAKiqmJfAAKi1AMAAp9/AAGfHwACot5iTwACouIPnwACouIV8wACouLTywACouIC9wACouLRpwACot5iWwACovsAATQLAAKi3mJHAAKjAwABnvMAAqLeYl8AAqMIAwACn38AAZ8jAAKjEmJPAAKjFg+fAAKjFsw/AAKjFtGnAAKjEmJbAAKjJwABNAsAAqMSYkcAAqMvAAGe8wACoxJiXwACozQDAAKffwABnycAAqM+Yk8AAqNCD58AAqNCCRcAAqNC0acAAqNCEosAAqM+YlsAAqNXAAE0CwACoz5iRwACo18AAZ7zAAKjPmJfAAKjZAMAAp9/AAGfKwACo25iTwACo3IPnwACo3JjVwACo3IKQwACo3LRpwACo3ISiwACo3IQdwACo25iWwACo48AATQLAAKjbmJHAAKjlwABnvMAAqNuYl8AAqOcAwACn38AAZ8vAAKjpmJPAAKjqg+fAAKjqmcLAAKjqhRfAAKjqhKLAAKjpmJbAAKjvwABNAsAAqOmYkcAAqPHAAGe8wACo6ZiXwACo8wDAAKffwABnzMAAqPWY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VMAAqfmpn8AAqfm0yMAAqfmGxsAAqfmy+8AAqfiYkcAAqgTAAJGkwACqBcAAZ93AAKoFwABn38AAqgXAAFRfwACqBMAAWBvAAKoEwABYHMAAqgTAAFgrwACqBMAAWCrAAKoEwABYCMAAqgTAAFgJwACqBMAAWArAAKoEwABYLMAAqgTAAFf6wACqBMAAV/vAAKoEwABX/MAAqgTAAFf9wACqBMAAV/7AAKoEwABX/8AAqgTAAFgAwACqBMAAWAHAAKoEwABYAsAAqgTAAFgdwACqBMAAWB7AAKoEwABYL8AAqgTAAFgpwACqBLs7wACqBMAAWC3AAKoEwABYA8AAqgTAAFgEwACqBMAAWAXAAKoEwABYJsAAqgTAAFgnwACqBMAAWCjAAKoEwABYH8AAqgS7K8AAqgTAAFghwACqBMAAWCDAAKoEwABYIsAAqgTAAFgjwACqBMAAWCTAAKoEwABYJcAAqgTAAFK/wACqBMAAWAbAAKoErwLAAKoEwABYC8AAqgTAAFgMwACqBMAAWA3AAKoEtLXAAKoEwABYDsAAqgTAAFgPwACqBMAAWBDAAKoEwABYEcAAqgTAAFgTwACqBMAAWBTAAKoEwABYFcAAqgTAAFgWwACqBMAAUp7AAKoEwABYF8AAqgTAAFgYwACqBMAAWBrAAKoEwABYGcAAqgTAAFguwACp+JiXwACqQwAAwACRpcAAqkXAAGfvwACqRpiTwACqR4PQwACqR8AAkaXAAKpJwABn8MAAqkaYkcAAqkvAAJGlwACqTMAARTDAAKpMwABn98AAqkvAAF9mwACqS8AAX2nAAKpLwABfUcAAqkvAAF9nwACqS8AAX1LAAKpLwABZwcAAqkvAAFnDwACqS8AAWcXAAKpLwABZx8AAqkvAAFnJwACqS8AAWdLAAKpLwABZ1MAAqkvAAFnZwACqS8AAWdvAAKpLwABZ3cAAqkvAAFnfwACqS8AAWeXAAKpLwABZ68AAqkvAAFnwwACqS8AAWfLAAKpLwABZ9MAAqkvAAFn2wACqS8AAWfnAAKpLwABZ+8AAqkvAAFn9wACqS8AAWgHAAKpLwABZ/8AAqkvAAFoEwACqS8AAWgbAAKpLwABaCcAAqkvAAFoLwACqS8AAWg3AAKpLwABaD8AAqkvAAGgNwACqS7z7wACqSyPAAKpGmJfAAKpzAMAAqkXA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wABoO8AAq3fAAGg6wACrcpiXwACrfQDAAKriwABoPMAAq3+YlMAAq4DAAED8wACrf5iRwACrgsAAaDvAAKuCwABoOsAAq3+Yl8AAq4UAwACq4sAAaD7AAKuHmJTAAKuIwABA/MAAq4eYkcAAq4rAAGg7wACrisAAaDrAAKuHmJfAAKuNAMAAquLAAGg/wACrj5iTwACrkGrAAKuQoZfAAKuQlWLAAKuQwABoQMAAq4+YkcAAq5XAAFuEwACrlcAAQPrAAKuVwABA/8AAq5XAAGhCwACrlcAAaEHAAKuVlinAAKuPmJfAAKucAADAAJGowACrnpiSwACrn8AAaFvAAKufwABoXMAAq57AAGhdwACropiTwACro8AAkajAAKuksa3AAKukwABoXsAAq6KYkcAAq6fAAFyOwACrp8AAkajAAKupwABIGcAAq6nAAGhkwACrp7PnwACrp7w6wACrp8AARYLAAKunvDHAAKunvDTAAKunvC7AAKunvDfAAKunwABFfsAAq6fAAEV/wACrp8AARYDAAKunharAAKunwABFgcAAq6e4R8AAq6ee5MAAq6e8S8AAq6e8RcAAq6e8QsAAq6eHLcAAq6KYl8AAq74AwACrnsAAaHLAAKvAmJPAAKvBwABoc8AAq8HAAJGowACrw7O/wACrw68NwACrw8AAUPbAAKvDwABTHsAAq8PAAFu3wACrw7e6wACrw8AAQ4jAAKvDwABodsAAq8PAAGh3wACrwJiRwACrzYctwACrzbxCwACrzbxFwACrzcAAaIXAAKvNnuTAAKvNuEfAAKvNvEvAAKvNharAAKvNwABoicAAq83AAGh5wACrzcAAaHjAAKvNwACRqMAAq9nAAGh8wACr2cAAaHvAAKvNwABFgcAAq8CYl8AAq90AAMAAkanAAKvfmJPAAKvgwABposAAq+DAAGmkwACr4MAAaabAAKvgwABo4MAAq+DAAGmnwACr4MAAaajAAKvfwABokcAAq+eYk8AAq+jAAJGpwACr6bGtwACr6aSdwACr6aRCwACr6beUwACr6bdXwACr6beTwACr6cAAQ4jAAKvpwABcjcAAq+nAAGiSwACr6bVlwACr6cAAaJPAAKvpt5XAAKvowABclcAAq+jAAFyUwACr6MAAaJTAAKvowABolsAAq+jAAGiXwACr6MAAaJnAAKvnmJHAAKv8wABom8AAq/zAAEOmwACr/MAAQ6XAAKv8wABck8AAq/zAAEOUwACr/MAAaKzAAKv8wABoqMAAq/zAAGi2wACr/MAAaKrAAKv8wABotcAAq/zAAGirwACr55iXwACsCADAAKvfwABoz8AArAqYk8AArAvAAJGpwACsDLGtwACsDLeUwACsDLdXwACsDMAAQ4jAAKwMwABcjcAArAzAAGjQwACsDLVlwACsDMAAW7XAAKwMwABRmcAArAzAAGjRwACsDMAAaNLAAKwMwABo08AArAzAAGjUwACsCpiUwACsGsAAkanAAKwbu5fAAKwbrw3AAKwawABo1cAArBrAAGjWwACsGsAAaNfAAKwKmJHAAKwhr2LAAKwhwABck8AArCGFzMAArCG0IMAArCHAAGiiwACsIcAAaQnAAKwhwABopcAArCHAAGjcwACsIcAAaOvAAKwhwABpGcAArCHAAGkawACsIcAAaPHAAKwhwABpMMAArCHAAGXIwACsIcAAZcrAAKwhwABpMsAArCHAAGk0wACsIcAAaPPAAKwhwABo9cAArCHAAJGpwACsNcAAaUPAAKwhwABpUMAArCGiFMAArCHAAGj3wACsIcAAaPjAAKwhwABo+cAArCHAAGj7wACsIcAAaXbAAKwhwABoqcAArCHAAGmJwACsIcAAaYvAAKwhwABpjcAArCHAAGj9wACsIcAAaP/AAKwhwABpAMAArCHAAGmRwACsIcAAaQLAAKwKmJfAAKxHAMAAq9/AAGmdwACsSZiTwACsSsAAkanAAKxLwABL0sAArEmYlMAArE2BVcAArE2DssAArEmYkcAArFDAAEapwACsUMAAYAPAAKxJmJfAAKxTAMAAq9/AAGmfwACsVZiTwACsVsAAaQ3AAKxWhhDAAKxVmJfAAKxZAMAAq9/AAGmgwACsW5iTwACsXMAAYfvAAKxcwABh/cAArFzAAGH/wACsW5iXwACsYADAAKvfwABpocAArGKYk8AArGPAAJGpwACsZJcGwACsYpiRwACsZsAAaYjAAKximJTAAKxogJbAAKxor4zAAKximJfAAKxrAADAAJGqwACsbZiTwACsbsAAaanAAKxulPDAAKxuwABeHwDAAJGrwACscpiRwACsc8AAae7AAKxywABpqsAArHWYlMAArHaAvcAArHWYkcAArHi4q8AArHWYl8AArHoAwACscsAAaavAAKx8mJPAAKx9wACRq8AArH61ZcAArH7AAFLjwACsfrGtwACsfaQKwACsfJiUwACsg8AAkavAAKyEwABTNMAArHyYkcAArIa4q8AArIa4gMAArIa4hsAArIa4UMAArIa4RMAArIbAAGmswACshsAAkavAAKyNwABprcAArIa4ssAArIa4TcAArIa4XcAArIbAAGmuwACshrg+wACshrBuwACsfJiXwACslQDAAKxywABpu8AArJeYlMAArJiAvcAArJeYkcAArJq4q8AArJeYl8AArJwAwACscsAAabzAAKyemJHAAKyfuKvAAKyfuIDAAKyfuHDAAKyemJfAAKyjAMAArHLAAGm9wACspZiUwACspoC9wACspZiRwACsqLirwACspZiXwACsqgDAAKxywABpvsAArKyYk8AArK3AAJGrwACsrrGtwACsrJiRwACssLirwACssLiAwACssLhuwACssLhvwACsrJiXwACstQDAAKxywABpv8AArLeYlMAArLiAvcAArLeYkcAArLq4q8AArLeYl8AArLwAwACscsAAacDAAKy+mJPAAKy/wACRq8AArMC1ZcAArMCxrcAArL6YlMAArMPAAJGrwACsxMAAUzTAAKy+mJHAAKzGuKvAAKzGuIDAAKzGuIbAAKzGuD7AAKzGuGfAAKzGwABpwcAArL6Yl8AArM0AwACscsAAacXAAKzPmJTAAKzQgL3AAKzPmJHAAKzSuKvAAKzPmJfAAKzUAMAArHLAAGnGwACs1piTwACs18AAkavAAKzYwABTNMAArNfAAGnHwACs18AAacjAAKzXwABeScAArNaYkcAArN3AAGnJwACs3birwACs3cAAacrAAKzdwABpy8AArN3AAGnMwACs3biGwACs3bhNwACs3bhQwACs3bg3wACs3bhEwACs3bhtwACs3bh2wACs3bh3wACs3bh7wACs3bhuwACs3bhwwACs3cAAac/AAKzdwABp0MAArN24gMAArN3AAGnRwACs1piXwACs8gDAAKxywABp1sAArPSYlMAArPWAvcAArPSYkcAArPe4q8AArPSYl8AArPkAwACscsAAadfAAKz7mJPAAKz8wABeScAArPzAAF5KwACs+5iRwACs/8AAacnAAKz/uKvAAKz/wABp2MAArP/AAGnZwACs/7iAwACs+5iXwACtBQDAAKxywABp4cAArQeYlMAArQiAvcAArQeYkcAArQq4q8AArQeYl8AArQwAwACscsAAaeLAAK0OmJPAAK0PwACRq8AArRCxrcAArQ6YkcAArRK4q8AArRK4gMAArRLAAJGrwACtFcAAaePAAK0VwABFBMAArRXAAGnnwACtFcAAaejAAK0VwABp6cAArRKwTsAArRKGAcAArQ6Yl8AArR0AwACscsAAae3AAK0fmJPAAK0ggL3AAK0fmJfAAK0iAADAAJGswACtJMAAae/AAK0lmJPAAK0masAArSaCjMAArSWYkcAArSkjwACtJZiXwACtKwDAAK0kwABp8MAArS2Yk8AArS5qwACtLsAAXyPAAK0tmJHAAK0xwABp88AArTFWwACtMcAAafbAAK0xI8AArS2Yl8AArTYAwACtNsAAafHAAK0kwABp+MAArTmYk8AArTrAAGn5wACtOsAAafrAAK06wABp+8AArTrAAF5owACtOsAAXmnAAK05mJHAAK1AhFnAAK1AVsAArUDAAGa4wACtQMAAaf7AAK1AwABp/8AArUCDF8AArUAjwACtOZiUwACtSIFVwACtOZiXwACtSgDAAK0kwABqAMAArUyYlMAArU2AvcAArUyYkcAArU+4q8AArUyYl8AArVEAwACtJMAAagHAAK1TmJPAAK1UwABeScAArVTAAF5KwACtVMAAagLAAK1UwABeaMAArVTAAF5pwACtU5iRwACtWrirwACtWsAAagTAAK1awABqBsAArVrAAGoFwACtWsAAagfAAK1auIDAAK1awABqCsAArVOYl8AArWIAwACtJMAAagvAAK1kmJPAAK1lg0TAAK1lwABercAArWSYkcAArWgjwACtZJiXwACtagDAAK0kwABqDcAArWyYk8AArW3AAEL/wACtbcAAT0rAAK1smJHAAK1wwABqDsAArXDAAE9LwACtcCPAAK1smJTAAK10gVXAAK1smJfAAK12AMAArSTAAGoRwACteJiTwACtecAAahLAAK15wABqE8AArXnAAGoUwACtecAAahXAAK14mJHAAK1+wABeuMAArX6ZFMAArX7AAF63wACtfsAAahfAAK1+obrAAK1+wABqDsAArX7AAE9LwACteJiUwACthpgNwACteJiXwACtiADAAK0kwABqGMAArYqYk8AArYuEscAArYvAAJGswACtjbdXwACti4QwwACti8AAahnAAK2LwABqGsAArYvAAGCmwACtipiRwACtk8AAahzAAK2TwABqHcAArZPAAGoewACtk8AAah/AAK2TwABqIMAArZPAAGohwACtipiXwACtmgDAAK0kwABqIsAArZyYlMAArZ2AvcAArZyYkcAArZ+4q8AArZyYl8AAraEAwACtJMAAaiPAAK2jmJPAAK2kwACRrMAAraW3V8AAraTAAF5owACtpMAAXmnAAK2kwABeScAAraSEscAAraOYkcAArau4q8AArau4gMAAravAAGonwACtq8AAafbAAK2rwABqKsAAravAAGomwACtq8AAaiXAAK2jmJfAAK2zAADAAJGtwACttcAAaivAAK22mJHAAK23wABqLMAArbfAAJGtwACtucAAai3AAK22mJfAAK27AADAAJGuwACtvcAAai7AAK2+mJPAAK2/gL3AAK2/wACRrsAArcG1ZcAArcHAAGovwACtwcAAXzHAAK2+mJTAAK3FwACRrsAArcazv8AArcbAAFLjwACtxsAAUzTAAK2+mJHAAK3KuKvAAK3KuIDAAK3KuIbAAK3KuLHAAK3KwABqMsAArcrAAGoxwACtysAAajTAAK3KwABqNcAArcrAAGnlwACtyrhHwACtysAAajbAAK3KuF3AAK2+mJfAAK3XAADAAJGvwACt2cAAajzAAK3amJPAAK3bwABqPcAArdubfsAArdvAAGo+wACt27Z2wACt27L7wACt26TMwACt28AAka/AAK3iwABfMMAArdqYlMAAreSAvcAAreSweMAArdqYkcAArefAAECZwACt58AAaj/AAK3nuKvAAK3nuIDAAK3nwABqQMAArefAAGpBwACt57iuwACt58AAakTAAK3nuFvAAK3nuDLAAK3nuDrAAK3nuGzAAK3nuGPAAK3nuFzAAK3nuDHAAK3nuIbAAK3nuF/AAK3nuG3AAK3nwACRr8AArfrAAGpGwACt57huwACt57hwwACt58AAakfAAK3nwABqSMAArefAAGpJwACt58AAakrAAK3nwABqQ8AArefAAGpCwACt58AAakvAAK3nuLLAAK3nuHbAAK3amJfAAK4HAADAAJGwwACuCcAAak3AAK4KmJPAAK4LwABqTsAArgvAAGpPwACuCpiRwACuDsAAalDAAK4OwABqUcAArg7AAGpSwACuDsAAalPAAK4OwABqVMAArg7AAGpVwACuDsAAalbAAK4OwABqV8AArg7AAGpZwACuCpiXwACuGADAAK4JwABqWsAArhqYk8AArhuBVMAArhqYkcAArh1kwACuHYGNwACuHYHEwACuHYN3wACuHZynwACuHcAASMPAAK4amJTAAK4kqUfAAK4kwABFmMAAriSpQcAArhqYl8AArigAwACuCcAAalvAAK4qmJPAAK4rwABqXMAAriqYkcAAri1kwACuLYGNwACuKpiXwACuMADAAK4JwABqXcAArjKYk8AArjOAlsAArjKYkcAArjVkwACuNYGNwACuNYHEwACuNYN3wACuNZynwACuNcAASMPAAK41SMAArjUjwACuMpiUwACuPoPBwACuPqlHwACuPsAARZjAAK4+qUHAAK4ymJfAAK5DAMAArgnAAGpgwACuRZiRwACuRmTAAK5GgY3AAK5GgcTAAK5GnKfAAK5GwABIw8AArkYjwACuRZiUwACuTalHwACuTcAARZjAAK5FmJfAAK5QAMAArgnAAGpiwACuUpiRwACuU2TAAK5TgY3AAK5TgcTAAK5TnKfAAK5TwABIw8AArlMjwACuUpiUwACuWqlHwACuWsAARZjAAK5SmJfAAK5dAMAArgnAAGpkwACuX5iRwACuYGTAAK5ggY3AAK5ggcTAAK5gnKfAAK5gwABIw8AArmAjwACuX5iUwACuZ6lHwACuZ8AARZjAAK5fmJfAAK5qAMAArgnAAGplwACubJiTwACubbiIwACubJiRwACub0jAAK5vZMAArm+BjcAArm+BxMAArm8jwACubJiUwACudYPBwACudalHwACudcAARZjAAK5smJfAAK55AMAArgnAAGpowACue5iUwACufMAARZjAAK57mJfAAK5+AMAArgnAAGppwACugJiTwACugYWvwACugYWxwACugJiXwACuhADAAK4JwABqasAAroaYkcAArodIwACuh4HEwACuh2TAAK6HgY3AAK6HI8AAroaYlMAAro2DwcAAro2pR8AAro3AAEWYwACuhpiXwACukQDAAK4JwABqbMAArpOYkcAArpRIwACulIHEwACulGTAAK6UgY3AAK6UI8AArpOYlMAArpqDwcAArpqpR8AArprAAEWYwACuk5iXwACungDAAK4JwABqbsAArqCYk8AArqGAlsAArqCYkcAArqNIwACuo2TAAK6jg3fAAK6jgY3AAK6jgcTAAK6jI8AArqCYlMAArqqDwcAArqqpR8AArqrAAEWYwACuoJiXwACurgDAAK4JwABHLcAArrCYk8AArrGGfsAArrGGf8AArrGBVMAArrCYkcAArrWW/MAArrWW/cAArrVkwACutYGNwACutYHEwACutYN3wACutUjAAK61Y8AArrWAl8AArrWBa8AArrWBbcAArrUjwACusJiUwACuwoPBwACuwqlHwACuwsAARZjAAK7CwABqccAArrCYl8AArscAwACux8AAanDAAK7HllTAAK4JwABqc8AArsuYk8AArszAAGp0wACuzMAAXyPAAK7MpMzAAK7MgVTAAK7MwABFR8AArsykCsAArsuYlMAArtOAvcAArsuYkcAArtW4q8AArtXAAGp2wACu1biAwACu1biGwACu1bhfwACu1YYBwACu1bg9wACu1bhAwACu1bg3wACu1bi4wACu1cAAaoDAAK7VwABqgcAArtW4Y8AArtW4SsAArtXAAGqEwACu1bgywACu1bhqwACu1bgzwACu1bi5wACu1cAAanzAAK7VwABqhsAArtXAAGqHwACu1cAAaojAAK7VuLXAAK7VuGDAAK7LmJfAAK7vAMAArgnAAGqLwACu8ZiTwACu8qTMwACu8sAAXyPAAK7ygVTAAK7xmJHAAK72gpvAAK72mofAAK72uF/AAK72uLnAAK72uDLAAK72uGrAAK72wABqhMAArvGYl8AArv4AAMAAkbHAAK8AwABqkcAArwGYk8AArwKYgMAArwKYYMAArwLAAGqSwACvAZiUwACvBoFVwACvBmHAAK8BmJHAAK8JVsAArwmW9sAArwnAAF+1wACvCZzrwACvCYCtwACvCZcJwACvCZb9wACvCcAAapTAAK8BmJfAAK8SAMAArwDAAGqZwACvFJiTwACvFYCWwACvFYPIwACvFYOwwACvFJiUwACvGYPBwACvFJiXwACvGwAAwACRssAArx2Yk8AArx6VuMAArx6VucAArx6VusAArx6CNsAArx6CM8AArx6Vu8AArx6VvMAArx6CL8AArx6VvcAArx6VvsAArx6CMcAArx6CMsAArx6CKsAArx6Vv8AArx6VwMAArx6VwcAArx6VwsAArx6Vw8AArx6VxMAArx6VxcAArx6VxsAArx6Vx8AArx6VyMAArx6VycAArx6CK8AArx6VysAArx6Vy8AArx6VzMAArx6VzcAArx6VzsAArx6Vz8AArx6V0MAArx6V0cAArx6CLMAArx6V0sAArx6V08AArx6V1MAArx6V1cAArx6V1sAArx6V18AArx6V2MAArx6CLcAArx6V2cAArx6V2sAArx6V28AArx6V3MAArx6V3cAArx6V3sAArx6V38AArx6V4MAArx6V4cAArx6V4sAArx6V48AArx6V5MAArx6V5cAArx6V5sAArx6V58AArx6V6MAArx6V6cAArx6V6sAArx6V68AArx6V7MAArx6V7cAArx6V7sAArx6V78AArx6V8MAArx6CN8AArx6V8cAArx6CLsAArx6V8sAArx6V88AArx6COMAArx6V9MAArx6COcAArx6V9cAArx6V9sAArx6V98AArx6V+MAArx6V+cAArx6COsAArx6V+sAArx6V+8AArx6V/MAArx6V/cAArx6V/sAArx6V/8AArx6WAMAArx6WAcAArx6WAsAArx6WA8AArx6WBMAArx6CO8AArx6WBcAArx6WBsAArx6WB8AArx6WCMAArx6WCcAArx6WCsAArx6CPMAArx6WC8AArx6WDMAArx6WDcAArx6WDsAArx6CMMAArx6WD8AArx6CNMAArx6CNcAArx6WEMAArx6WEcAArx6WEgDAAJGzwACvjZiTwACvjsAAkbPAAK+PwABqm8AAr42YkcAAr5HAAGqcwACvkcAAap/AAK+Rn7DAAK+RlibAAK+RwACRs8AAr5bAAGqhwACvlsAAaqTAAK+WwABqpcAAr5a88sAAr5HAAGqiwACvkcAAZ34AwACRtMAAr52YksAAr57AAGqxwACvnsAAarLAAK+dmJPAAK+hwACRtMAAr6LAAGq5wACvnZiRwACvpMAAkbTAAK+lwABqusAAr53AAGqzwACvp5iTwACvqMAAkbTAAK+pwABqtMAAr6nAAGq1wACvqcAAarbAAK+nmJHAAK+tS8AAr62Av8AAr62ApcAAr63AAELtwACvrZYywACvrYJCwACvrYdBwACvrcAAQuvAAK+tg/jAAK+tgKvAAK+tmRXAAK+thFnAAK+tlvjAAK+tljvAAK+tqybAAK+twABC8MAAr60jwACvrcAAkbTAAK+/wABqt8AAr6eYlMAAr8GD0MAAr8GBVcAAr8GDssAAr8GDYsAAr8FhwACvwSnAAK+nmJfAAK/IAMAAr8iWKADAAJG1wACvy8AAarvAAK/MmJPAAK/NwACRtcAAr87AAGq8wACvzJiUwACv0FzAAK/QgVXAAK/QYcAAr8yYkcAAr9SDF8AAr8yYl8AAr9YAwACvy8AAar3AAK/YmJPAAK/ZwACRtcAAr9rAAGq+wACv2JiUwACv3F7AAK/YmJHAAK/eXcAAr9iYl8AAr+AAAMAAkbbAAK/iwABqv8AAr+OYk8AAr+TAAJG2wACv5cAAasDAAK/jmJHAAK/nwACRtsAAr+jAAGrBwACv50vAAK/ngL/AAK/ngkLAAK/nhFnAAK/nlvjAAK/nlvvAAK/jmJXAAK/wYcAAr+OYlMAAr/JhwACv8p60wACv9LlgwACv45iXwACv9gAAwACRt8AAr/jAAGrEwACv+ZiTwACv+sAAkbfAAK/7wABC/sAAr/mYkcAAr/1LwACv+ZiUwACv/4NiwACv+ZiXwACwAQAAwACRuMAAsAOYk8AAsATAAJG4wACwBcAAasXAALAFwABqxsAAsAXAAGrHwACwBcAAasjAALAFwABqycAAsAXAAGrKwACwA5iRwACwDMAAasvAALAMwABqz8AAsAzAAGrQwACwDMAAatTAALAMwABq18AAsAzAAGrYwACwDMAAatnAALAMwACRuMAAsBTAAGrawACwFMAAat3AALAUwABq3sAAsBTAAGrfwACwFMAAauAAwACRucAAsBqYksAAsBvAAGrhwACwGpiTwACwHcAAkbnAALAewABrB8AAsBrAAGriwACwIJiTwACwIcAAkbnAALAilkLAALAgmJbAALAkAMAAsCCYkcAAsCaVoMAAsCaDyMAAsCbAAENqwACwGsAAauXAALAqmJPAALArwACRucAAsCzAAGrmwACwLMAAaufAALAqmJHAALAvlaDAALAvg8jAALAvwABDasAAsCqYl8AAsDMAwACwGsAAaunAALA1mJHAALA2laDAALA2g8jAALA2wABDasAAsDWYl8AAsDoAwACwGsAAaurAALA8mJHAALA9laDAALA9g8jAALA9wABDasAAsDyYl8AAsEEAwACwGsAAauvAALBDmJPAALBEwACRucAAsEXAAGrswACwQ5iRwACwR5WgwACwR4PIwACwR8AAQ2rAALBDmJfAALBLAMAAsBrAAGrzwACwTZiTwACwTsAAkbnAALBPwABq7MAAsE2YkcAAsFGVoMAAsFGDyMAAsFHAAENqwACwTZiXwACwVQDAALAawABq9MAAsFeYk8AAsFjAAJG5wACwWcAAauzAALBXmJHAALBblaDAALBbg8jAALBXmJfAALBeAMAAsBrAAGr1wACwYJiRwACwYcAAQ2rAALBgmJfAALBjAMAAsBrAAGr2wACwZZiRwACwZsAAQ2rAALBlmJfAALBoAMAAsBrAAGr3wACwapiTwACwa8AAavjAALBrg9HAALBrgJbAALBqmJTAALBvg8HAALBqmJHAALBxSMAAsGqYl8AAsHMAwACwGsAAavvAALB1mJPAALB2wACRucAAsHfAAGr5wACwd8AAavrAALB1mJHAALB6laDAALB6g8jAALB6wABDasAAsHWYl8AAsH4AwACwGsAAav/AALCAmJPAALCBwACRucAAsILAAGsAwACwgJiRwACwhJWgwACwhIPIwACwhMAAQ2rAALCAmJfAALCIAMAAsBrAAGsDwACwipiTwACwi8AAkbnAALCMwABqtsAAsIzAAGsEwACwipiRwACwj5WgwACwj4PIwACwj8AAQ2rAALCKmJfAALCTAMAAsJObAMAAsBrAAGsFwACwlpiRwACwl5WgwACwl4PIwACwl8AAQ2rAALCWmJfAALCbAADAAJG6wACwncAAawjAALCemJfAALCfAMAAsJ+WKADAAJG7wACwosAAawnAALCjmJfAALCkAMAAsKSWKADAAJG8wACwp5iRwACwqMAAawrAALCowABrDsAAsKjAAGsPwACwqMAAaxDAALCowABrFcAAsKjAAGsYwACwqMAAaxwAwACRvcAAsLDAAGshwACwsZiTwACwssAAkb3AALCzwABqvMAAsLGYlMAAsLVcwACwsZiXwACwtwDAALCwwABrJMAAsLmYk8AAsLrAAJG9wACwu8AAar7AALC7iLXAALC5mJHAALC+XcAAsLmYlMAAsMBewACwuZiXwACwwgAAwACRvsAAsMTAAGslwACwxZiTwACwxsAAkb7AALDHlkLAALDFmJbAALDJAMAAsMWYlMAAsMthwACwy4FVwACwy4OywACwy4MZwACwxZiRwACw0IMXwACw0FbAALDQgKXAALDQnxDAALDQhFnAALDQlvfAALDQgkLAALDQgK3AALDQlRPAALDEwABrJsAAsNqYk8AAsNvAAJG+wACw3MAAayfAALDctJnAALDcnPDAALDbhoPAALDamJHAALDhVsAAsOGApcAAsOGCQsAAsOGDF8AAsOGEWcAAsOGW98AAsOGfEMAAsOGArcAAsOGVE8AAsOEjwACw4cAAkb7AALDss27AALDswABrKMAAsOzAAGsqwACw7MAAayvAALDswABrLMAAsOzAAEJzwACw2piUwACw84MZwACw84FVwACw84OywACw82HAALDamJfAALD4AADAAJG/wACw+sAAazfAALD7mJTAALD8XMAAsPyBVcAAsPyDssAAsPyDGcAAsPyB6MAAsPyAw8AAsPyYgsAAsPuYkcAAsQSWM8AAsQSWN8AAsQSD+MAAsQSDF8AAsQSWMMAAsQSB1MAAsQSWNMAAsQSWOcAAsQSWPMAAsQRYwACxBIGlwACxBJZAwACxBICrwACxBISJwACxBJY6wACxBINZwACxBJYpwACxBJY9wACxBJY+wACxBJY/wACxBICtwACxBJUTwACxBFbAALEEgKXAALEEhFnAALEEnrTAALEen6vAALEen6zAALEen6/AALEElvjAALEElvvAALEEgkLAALEEljLAALEEhhHAALEEgK7AALEEn7DAALEEnGLAALEEZMAAsQSBWMAAsQSftsAAsQSft8AAsQSbqcAAsQSDXsAAsQSfvMAAsQSAu8AAsQSfwcAAsQSWWsAAsQSfwsAAsQSeysAAsQSfw8AAsQSfxMAAsQSfxsAAsQQjwACw+5iVwACxOoMZwACxOoHowACw+5iXwACxPQDAALD6wABrOMAAsT+Yk8AAsUDAAJG/wACxQcAAayfAALFBwABrOcAAsUHAAGs6wACxQcAAazvAALE/mJHAALFGwACRv8AAsUfAAGs9wACxR8AAa0nAALFHwABrSsAAsUezbsAAsUfAAEJzwACxR8AAa03AALFHwABrQMAAsUZWwACxRoClwACxRpYywACxRpY7wACxRiPAALFGhCLAALFGwABrQ8AAsUafEMAAsUaGEcAAsUZLwACxRoC/wACxP5iWwACxWpYowACxP5iUwACxXGHAALE/mJXAALFeYcAAsT+Yl8AAsWAAwACxYMAAkb/AALFigLXAALD6wABrUMAAsWSYk8AAsWXAAJG/wACxZq3VwACxZJiUwACxaMAAkb/AALFpwABrOsAAsWnAAGs7wACxZJiVwACxbMAAkb/AALFtwABrOsAAsW3AAGs7wACxZJiXwACxcAAAwACRwMAAsXLAAGtRwACxc5iRwACxdMAAkcHAALF1wABqwcAAsXRWwACxdIClwACxdIRZwACxdJb3wACxdJb6wACxdJb4wACxdJb7wACxdIJCwACxc5iXwACxfwDAALFywABrU8AAsYGYk8AAsYLAAJHAwACxg8AAQwTAALGDwABrVMAAsYGYlMAAsYZhwACxhlzAALGGwACRwMAAsYnAAGtVwACxicAAa1bAALGBmJHAALGMgxfAALGMlvbAALGMlRPAALGBmJfAALGQAMAAsZCWKADAAJHCwACxk8AAa1fAALGUmJPAALGVwACRwsAAsZbAAGtYwACxlsAAQwTAALGUmJTAALGZlx7AALGUmJHAALGbVsAAsZuEWcAAsZSYl8AAsZ4AAMAAkcHAALGgwABrWsAAsaGYkcAAsaLAAJHBwACxo8AAasHAALGiVsAAsaKApcAAsaKeysAAsaKfxMAAsaKEWcAAsaKfw8AAsaKGEcAAsaKW+MAAsaKW+8AAsaKft8AAsaKfvMAAsaKCQsAAsaGYlcAAsbFhwACxoZiXwACxswDAALGgwABrXMAAsbWYl8AAsbYAwACxoMAAa17AALG4mJHAALG5wACRwcAAsbrAAGrBwACxuVbAALG5gKXAALG5nsrAALG5n8TAALG5hFnAALG5n8PAALG5hhHAALG5lvjAALG5lvvAALG5n7fAALG5n7zAALG5gkLAALG4mJXAALHIYcAAsbiYl8AAscoAwACxoMAAa1/AALHMmJHAALHNwACRwcAAsc7AAGrBwACxzVbAALHNgKXAALHNhFnAALHNlvfAALHNlvrAALHNlvjAALHNlvvAALHNgkLAALHMmJfAALHYAMAAsaDAAGtgwACx2piTwACx28AAkcHAALHclkLAALHamJbAALHehZjAALHamJfAALHgAMAAsaDAAGtiwACx4piRwACx48AAkcHAALHkwABqwcAAseNWwACx44ClwACx44RZwACx45b3wACx45b6wACx45b4wACx45b7wACx44JCwACx4piXwACx7gDAALGgwABrY8AAsfCYkcAAsfHAAJHBwACx8sAAasHAALHxgL/AALHxmRXAALHxgKXAALHxhFnAALHxgkLAALHwmJXAALH5gxnAALH5gejAALHwmJfAALH8AADAAJHDwACx/piSwACx/8AAa2XAALH+wABrZsAAsgGYlMAAsgLAAJHDwACyA8AAarbAALICgxnAALICgVXAALICg7LAALICXMAAsgKB6MAAsgJhwACyAoDDwACyAZiRwACyDIHUwACyDJYywACyDIMXwACyDJYzwACyDJYwwACyDISJwACyDJY0wACyDINZwACyDJY3wACyDIP4wACyDFjAALIMljnAALIMgKvAALIMljrAALIMljvAALIMljzAALIMlinAALIMlj3AALIMlj7AALIMlj/AALIMgK3AALIMlRPAALIMgaXAALIMlkDAALIMI8AAsgGYl8AAsiYAwACx/sAAa2fAALIomJPAALIpwACRw8AAsirAAGq2wACyKJiRwACyLLJcwACyKJiXwACyLgDAALH+wABracAAsjCYkcAAsjGyXMAAsjFLwACyMYC/wACyMWTAALIxVsAAsjGApcAAsjGcYsAAsjGWMsAAsjGCQsAAsjGbqcAAsjGftsAAsjGAu8AAsjGfwcAAsjGeysAAsjGfxMAAsjGWWsAAsjGfwsAAsjGEWcAAsjGfw8AAsjGGEcAAsjGft8AAsjGW+MAAsjGfvMAAsjGW+8AAsjGWO8AAsjGfxsAAsjGDXsAAsjGfsMAAsjGArsAAsjGBWMAAsjCYlMAAslDAAJHDwACyUcAAa2vAALJQmILAALIwmJXAALJUgxnAALJUgejAALJUYcAAsjCYl8AAslgAwACx/sAAa2zAALJamJHAALJbslzAALJbVsAAsluApcAAsluWMsAAsluCQsAAsluEAsAAsluW/sAAsluW/cAAsluW9sAAsluEWcAAsluW98AAsluW+MAAsluW+sAAsluWO8AAsluW+8AAsluW/MAAsluVE8AAslqYlMAAsm3AAJHDwACybsAAa27AALJamJfAALJwAMAAsf7AAGtvwACycpiRwACyc7JcwACyc1bAALJzgKXAALJzwABrQ8AAsnOEIsAAsnOWMsAAsnOCQsAAsnOEWcAAsnOW+MAAsnOW+8AAsnOWO8AAsnOfEMAAsnOGEcAAsnKYlMAAsoHAAJHDwACygsAAa3HAALJymJfAALKEAMAAsf7AAGtywACyhpiTwACyh8AAkcPAALKIwABqtsAAsoaYkcAAsoqyXMAAsopLwACyioC/wACyioClwACyisAAQu3AALKKgkLAALKKljLAALKKh0HAALKKwABC68AAsoqD+MAAsoqAq8AAsoqZFcAAsoqEWcAAsoqW+MAAsoqWO8AAsoojwACyiqsmwACyisAAQvDAALKGmJTAALKdg9DAALKdgVXAALKdg7LAALKdg2LAALKdYcAAsp0pwACyhpiXwACypADAALH+wABrdMAAsqaYkcAAsqeWMsAAsqfAAJHBwACyqcAAasHAALKnVsAAsqeApcAAsqeEWcAAsqeW98AAsqeW+sAAsqeW+MAAsqeW+8AAsqeCQsAAsqaYl8AAsrMAwACx/sAAa3XAALK1mJPAALK2wACRw8AAsrfAAGt2wACytZiUwACyucAAkcPAALK6wABqtsAAsrmBVcAAsrmDssAAsrlhwACytZiRwACyv5YywACyv4MXwACyvyPAALK/hALAALK/lv7AALK/lv3AALK/lvbAALK/ljvAALK/lvzAALK1mJfAALLJAMAAsf7AAGt4wACyy5iTwACyzMAAkcPAALLNwABrdsAAss3AAGt5wACyy5iUwACy0MAAkcPAALLRwABqtsAAstCBVcAAstCDssAAstBhwACyy5iRwACy1pYywACy1oMXwACy1iPAALLWVsAAstaApcAAstaCQsAAstaEAsAAstaW/sAAstaW/cAAstaW9sAAstaEWcAAstaW98AAstaW+MAAstaW+sAAstaW+8AAstaWO8AAstaW/MAAssuYl8AAsugAAMAAkcTAALLqrYXAALLrmJTAALLshyzAALLsgVXAALLswABrf8AAsuuYkcAAsvDAAGuAwACy8MAAa4HAALLwwABrgsAAsvDAAGuEwACy8MAAa4XAALLwwABc8cAAsvDAAGuGwACy8MAAa4jAALLrmJfAALL5AMAAsurAAGuLwACy+5iTwACy/MAAkcTAALL9wABrjMAAsv3AAGuNwACy/bIrwACy+5iUwACzAYcswACzAYFVwACzAcAAa3/AALL7mJHAALMFwABrgMAAswXAAGuBwACzBcAAYjXAALMFwABY28AAswXAAGuOwACzBcAAa4/AALMFwABrkMAAsvuYl8AAsw0AwACy6sAAa5HAALMPmJPAALMQJ8AAsxDAAGuSwACzEMAAax/AALMQglXAALMPmJfAALMVAMAAsurAAGuTwACzF5iTwACzGMAAkcTAALMZwABfMcAAsxmXFsAAsxm0GcAAsxnAAE9pwACzGcAAa5TAALMXmJHAALMfwACRxMAAsyDAAGuHwACzIMAAa5fAALMgwABrmMAAsyDAAGuVwACzH8AAa4LAALMXmJfAALMmAMAAsurAAGucwACzKJiTwACzKcAAkcTAALMqwABfMcAAsynAAGuKwACzKcAAa53AALMomJHAALMugpvAALMuwACRxMAAszDAAGuhwACzKJiXwACzMgAAwACRxcAAszSYk8AAszXAAGvRwACzNcAAa9LAALM1wABr08AAszTAAGulwACzOZiTwACzOsAAT2HAALM6qj7AALM6wABrpsAAszrAAE82wACzOqQuwACzOsAAa6fAALM6wABrqMAAszrAAGupwACzOsAAYvnAALM6wABj98AAszrAAE9bwACzOZiRwACzRsAAZADAALNGwACRxcAAs0jAAGuqwACzRsAASd3AALNGwABj+MAAs0bAAGMrwACzRsAAYy7AALNGwABi9MAAs0bAAGMjwACzRsAAYwHAALNGwABjCMAAs0bAAGMZwACzRsAAYxzAALNGwABi/sAAs0bAAGMFwACzRsAAYxLAALNGwABi6MAAs0bAAGLrwACzRsAAYu3AALNGwABjJ8AAs0bAAGLlwACzRsAAYs7AALNGwABrrsAAs0bAAGuvwACzRsAAa7DAALNGwABrvcAAs0bAAGu+wACzRsAAa7/AALNGwABrwMAAs0bAAGvBwACzRsAAYuHAALNGwABryMAAs0bAAGvJwACzRrRVwACzRsAAYq/AALNGwABiwcAAszmYl8AAs2sAAMAAkcbAALNtmJHAALNuwABr1cAAs27AAGvZAMAAkcfAALNxwABn28AAs3KYk8AAs3OCZsAAs3PAAJHHwACzdcAAUgPAALN1wABYX8AAs3XAAFhhwACzdcAAWGDAALN1wABr28AAs3XAAGvcwACzdcAAR5TAALN1wABr3cAAs3XAAFhowACzda7gwACzcpiUwACzgIFVwACzgMAAUrjAALOAwABSusAAs4DAAFK8wACzgMAAUr7AALOAwABSwMAAs4DAAFIEwACzgMAAUsHAALOAt2/AALOAwABSxMAAs4Cu1sAAs3KYkcAAs4zAAFgCwACzjMAAWAHAALOMwABYAMAAs4zAAFK/wACzjMAAZ+PAALOMwABn4MAAs4zAAGfiwACzjMAAZ+HAALOMwABr3sAAs4yvEsAAs4wjwACzcpiXwACzmAAAwACRyMAAs5rAAGvpwACzm5iTwACznMAAkcjAALOdwABSA8AAs53AAGvqwACzm5iRwACzoFbAALOgwABr68AAs6DAAGvswACzoIdBwACzoIC/wACzoEvAALOghFnAALOgg/jAALOgvPvAALOgI8AAs6DAAGvuwACzm5iUwACzrIFVwACzrIOywACzm5iXwACzrwDAALOawABr9MAAs7GYkcAAs7LAAGv1wACzsrz7wACzsoFVwACzsZiXwACztgAAwACRycAAs7jAAGiNwACzuZiTwACzusAAkcnAALO7wABsD8AAs7vAAGwQwACzuZiWwACzvgDAALO5mJHAALPAg4nAALPApsjAALPAwABIHsAAs7mYl8AAs8TAAJHJwACzxYC1wACzuMAAbBHAALPHmJPAALPIwACRycAAs8mXBsAAs8eYlMAAs8uAlsAAs8eYkcAAs81WwACzzYKIwACzx5iXwACz0AAAwACRysAAs9LAAGiOwACz05iTwACz1IHjwACz1IL9wACz1MAAbBPAALPUwABsFMAAs9SD0MAAs9TAAGwVwACz1MAAbBbAALPUvPHAALPTmJHAALPdwABsF8AAs93AAGwYwACz3aKGwACz3cAAkcrAALPhwABsHsAAs93AAGwjwACz3cAAbDHAALPdwABsNcAAs93AAGxIwACz3cAAbEvAALPTmJfAALPoAMAAs9LAAGxRwACz6piTwACz68AAkcrAALPslwbAALPrwABsUsAAs+vAAGxTwACz68AAbFTAALPrwABsVcAAs+vAAGxWwACz6piRwACz85zIwACz85VEwACz88AAbFjAALPqmJfAALP3AMAAs9LAAGxawACz+ZiTwACz+rbhwACz+rzowACz+ZiXwACz/QDAALPSwABsW8AAs/+Yk8AAtADAAJHKwAC0AakIwACz/5iRwAC0A8AAkcrAALQEwABsXMAAtANWwAC0A8AAa0PAALQDwABsXsAAtAPAAGxfwAC0A8AAbGHAALQDg/jAALQDwABsIcAAs/+Yl8AAtA0AwACz0sAAbGLAALQPmJPAALQQgKvAALQPmJHAALQSwABL6sAAtBJLwAC0D5iUwAC0FYg/wAC0D5iXwAC0FwAAwACRywDAAJHMwAC0GsAAaI/AALQbmJPAALQcwACRzMAAtB2WQsAAtBuYlsAAtB8AwAC0G5iRwAC0IZsZwAC0GsAAbGXAALQjmJPAALQkwACRzMAAtCXAAFcrwAC0JcAAbGbAALQjmJHAALQomxnAALQowABsZ8AAtCjAAGxowAC0KMAAbGnAALQowABsasAAtCibGsAAtCjAAGxrwAC0KMAAbGzAALQos+fAALQovDrAALQowABFgsAAtCi8McAAtCi8NMAAtCi8LsAAtCi8N8AAtCiHLcAAtCi8QsAAtCi8RcAAtCi8S8AAtCie5MAAtCi4R8AAtCjAAEV+wAC0KMAARX/AALQowABFgMAAtCjAAEWBwAC0KIWqwAC0I5iXwAC0QwDAALQawABsc8AAtEWYkcAAtEaCZ8AAtEaGcMAAtEazxsAAtEaGfMAAtEaGdsAAtEaGhsAAtEaGbsAAtEWYl8AAtE4AwAC0GsAAbHTAALRQmJPAALRRwACRzMAAtFLAAGiTwAC0UsAAbHXAALRQmJHAALRVmxnAALRVhnDAALRVs8bAALRVhnzAALRVhnbAALRVhobAALRVhm7AALRVwACRzMAAtF3AAGx3wAC0UJiXwAC0XwAAwACRzcAAtGGYk8AAtGLAAGx7wAC0YZiRwAC0ZMAAbHwAwACRzsAAtGaYkcAAtGfAAGyAwAC0ZoPTwAC0aZiTwAC0aoMZwAC0aoHowAC0aZiXwAC0bQAAwACRz8AAtG/AAGyBwAC0cJiRwAC0ccAAkc/AALRywABqwcAAtHGWMsAAtHGDF8AAtHGEAsAAtHGWN8AAtHGW9sAAtHGWO8AAtHGWPMAAtHGWQMAAtHGVE8AAtHGW/MAAtHGW/cAAtHGW/sAAtHFWwAC0cYClwAC0cYJCwAC0cYRZwAC0cZb3wAC0cZb4wAC0cZb7wAC0cZb6wAC0cJiUwAC0iFzAALSIYcAAtIjAAJHDwAC0i8AAarbAALSLwABrbsAAtHCYl8AAtI4AAMAAkdDAALSQmJLAALSRwABsgsAAtJCYk8AAtJPAAGymwAC0k8AAbKjAALSTwABsqcAAtJPAAGyqwAC0k8AAbKvAALSQmJHAALSZwABsrMAAtJnAAGytwAC0mcAAbK7AALSZwABsr8AAtJnAAGywwAC0mcAAbLHAALSZwABsssAAtJnAAGyzwAC0mcAAbLTAALSZwABsvMAAtJnAAGzQwAC0mcAAbNHAALSZwABs88AAtJDAAGyHwAC0p5iTwAC0qMAAkdDAALSpwABsicAAtKjAAGyKwAC0p5iRwAC0rIC/wAC0rIP4wAC0rEvAALSsI8AAtKeYl8AAtLEAwAC0kMAAbI/AALSzmJPAALS0wABskMAAtLSBrMAAtLTAAGyRwAC0tIKTwAC0tMAAbJLAALS0wABsk8AAtLOYlMAAtLuAvcAAtLOYl8AAtL0AwAC0kMAAbJTAALS/mJPAALTAwABWxsAAtMDAAGyVwAC0wMAAbIrAALS/mJHAALTEwABslsAAtMTAAGyYwAC0xMAAbJzAALTEpT7AALS/mJfAALTJAMAAtJDAAGydwAC0y5iRwAC0zMAAa/XAALTMgVXAALTMvPvAALTLmJfAALTQAMAAtJDAAGyewAC00piRwAC008AAa/XAALTTgVXAALTTvPvAALTSmJfAALTXAMAAtJDAAGyfwAC02ZiTwAC02oKTwAC02sAAbJLAALTawACR0MAAtN3AAGygwAC03cAAbKHAALTZmJTAALTgwABWxsAAtODAAGyVwAC02ZiRwAC048AAbKLAALTjwABso8AAtOPAAGycwAC02ZiXwAC05wAAwACR0QDAAJHSwAC06piTwAC068AAkdLAALTswABtGMAAtOzAAG0ZwAC068AAbRrAALTrwABtG8AAtOvAAG0cwAC068AAbR7AALTqmJHAALTzwABtIMAAtOrAAG0IwAC09ZiTwAC09sAAQsLAALT2wABCw8AAtPaDXMAAtPaBsMAAtPWYkcAAtPsjwAC09ZiXwAC0/QDAALTqwABtDcAAtP+Yk8AAtQCYr8AAtQCEY8AAtQDAAJHSwAC1A8AAbQ7AALT/mJbAALUFwABr7sAAtP+YkcAAtQfAAJHSwAC1CMAAbRbAALUHhGTAALUHwABtF8AAtP+Yl8AAtQwAwAC1DJVJAMAAkdPAALUPwABtJcAAtRCYk8AAtREnwAC1EcAAkdPAALUTKMAAtREpwAC1EYJmwAC1EZnCwAC1EYRDwAC1EYPuwAC1EbstwAC1EasmwAC1EVzAALURXsAAtRFdwAC1EcAAbTHAALURgcXAALUQmJHAALUhI8AAtRCYl8AAtSMAwAC1D8AATJzAALUlmJTAALUmgmfAALUmtH7AALUmwABs4MAAtSWYl8AAtSoAwAC1D8AAbTLAALUsmJPAALUts1XAALUtgJbAALUtwABtM8AAtS3AAG01wAC1LcAAbTbAALUtwABH3sAAtS3AAG05wAC1LcAAbTvAALUtwABtPcAAtS3AAG0/wAC1LcAAbUHAALUtwABtQ8AAtS3AAG1FwAC1LJiUwAC1O4PBwAC1LJiRwAC1PUjAALU9I8AAtT3AAG1HwAC1PYcKwAC1LJiXwAC1QgDAALUPwABtT8AAtUSYk8AAtUWGdMAAtUWnG8AAtUW0fsAAtUSYlsAAtUkAwAC1RJiUwAC1S4PBwAC1S4JnwAC1S4C9wAC1S8AAbODAALVEmJHAALVQSMAAtVAjwAC1RJiXwAC1U5VJwAC1D8AAbVLAALVVmJPAALVWhnTAALVWtH7AALVVmJTAALVZg8HAALVZgmfAALVZgL3AALVZwABs4MAAtVWYkcAAtV5IwAC1XiPAALVVmJfAALVhAMAAtQ/AAG1UwAC1Y5iTwAC1ZICswAC1Y5iUwAC1ZrR+wAC1ZoPBwAC1ZoJnwAC1ZoC9wAC1ZsAAbODAALVjmJHAALVsSMAAtWwjwAC1Y5iXwAC1bwDAALUPwABtV8AAtXGYk8AAtXKAlsAAtXKCZ8AAtXGYlMAAtXW0fsAAtXWDwcAAtXXAAGzgwAC1cZiRwAC1eUjAALV5I8AAtXGYl8AAtXwAwAC1D8AAbVnAALV+mJPAALV/s1XAALV/gJbAALV/gKzAALV/wACR08AAtYPAAG1awAC1f4PAwAC1fpiUwAC1hoNcwAC1hsAAbOPAALV+mJHAALWJI8AAtX6Yl8AAtYsAwAC1D8AAbWDAALWNmJTAALWOwABsl8AAtY2YkcAAtZDAAG1hwAC1kIHDwAC1kIHCwAC1jZiXwAC1lAAAwACR1MAAtZbAAG1mwAC1l5iTwAC1mIQ0wAC1l5iRwAC1mkjAALWaI8AAtZeYlMAAtZ2DwcAAtZeYl8AAtZ8AAMAAkdXAALWhwABtZ8AAtaKYlMAAtaPAAG1owAC1opiRwAC1pYi4wAC1pbQvwAC1opiXwAC1qAAAwACR1sAAtarAAG1rwAC1q5iTwAC1rMAAkdbAALWtwABlgcAAta2XBcAAtauYkcAAtbCIuMAAtbC0L8AAtauYl8AAtbMAwAC1qsAAbWzAALW1mJPAALW2wACR1sAAtbfAAG1twAC1t8AAbW7AALW3wABtb8AAtbfAAG1wwAC1tZiRwAC1vFbAALW8wABtcsAAtbyCiMAAtbWYl8AAtcAAAMAAkdfAALXCmJPAALXDwABts8AAtcPAAJHXwAC1xcAAbbTAALXFwABttcAAtcLAAG10wAC1yJiTwAC1ycAAbWjAALXImJHAALXLtC/AALXImJfAALXNwACR18AAtc6AtcAAtcLAAG11wAC10JiTwAC10ZVowAC10JiRwAC108AAbXrAALXQmJfAALXVAADAAJHYwAC115iTwAC12MAAbb/AALXXwABttsAAtdqYk8AAtdvAAG1owAC12piRwAC13bQvwAC12piXwAC138AAkdjAALXggLXAALXXwABtt8AAteKYk8AAteOVaMAAtePAAJHYwAC15cAAbbjAALXimJHAALXnwABtesAAteKYl8AAtekAAMAAkdnAALXrmJPAALXswABuAcAAtezAAJHZwAC17sAAbbTAALXrwABtwMAAtfCYk8AAtfHAAG1owAC18JiRwAC188AAVG3AALXztC/AALXwmJfAALX2wACR2cAAtfeAtcAAtevAAG3BwAC1+ZiTwAC1+pVowAC1+sAAkdnAALX8wABtuMAAtfmYkcAAtf7AAJHZwAC1/8AAbcjAALX/wABtycAAtf/AAG3KwAC1/8AAbcvAALX/wABtzMAAtf/AAG3NwAC1/8AAbc7AALX+wABtesAAtfmYl8AAtggAAMAAkdoAwACR28AAtgvAAG4CwAC2DJiTwAC2DcAAkdvAALYOlwbAALYMmJTAALYQgJbAALYMmJHAALYSVsAAthKCiMAAtgyYl8AAthUAAMAAkdzAALYXwABuA8AAthiYk8AAthnAAJHcwAC2Gpc2wAC2GsAAbgTAALYawABuBcAAthrAAG4GwAC2GsAAbgjAALYawABuCcAAthrAAG1wwAC2GJiUwAC2IpVowAC2GJiRwAC2JMAAbXrAALYkVsAAtiSCiMAAtiTAAJHcwAC2KMAAbg7AALYowABuDMAAtijAAG4NwAC2KMAAbhnAALYYmJfAALYtAADAAJHdwAC2L5iTwAC2MMAAbh7AALYwwABuH8AAtjDAAG4gwAC2L5iRwAC2NMAAbiHAALY0wABuIgDAAJHewAC2N8AAbiTAALY4mJPAALY5wACR3sAAtjrAAG4lwAC2OsAAbXDAALY4mJTAALY9m6/AALY9uNXAALY4mJHAALZAgkLAALZAVsAAtkCCiMAAtjiYl8AAtkQAAMAAkd/AALZGwABuJ8AAtkeYk8AAtkjAAJHfwAC2SZggwAC2ScAAbXDAALZHmJTAALZMhDTAALZMuNXAALZHmJHAALZPgkLAALZPVsAAtk/AAG1ywAC2T4KIwAC2R5iXwAC2VAAAwACR4MAAtlaYk8AAtlfAAG4swAC2VsAAbivAALZZmJTAALZaiLfAALZagffAALZZmJfAALZdwACR4MAAtl6AtQDAAJHhwAC2YJiTwAC2YZaawAC2YMAAbjDAALZjmJTAALZkiLfAALZkgffAALZjmJfAALZnwACR4cAAtmiAtQDAAJHiwAC2asAAbjHAALZrmJPAALZswACR4sAAtm2YIMAAtm3AAG1wwAC2a5iUwAC2cIPswAC2cLjVwAC2a5iRwAC2c4JCwAC2c1bAALZzwABtcsAAtnOCiMAAtmuYl8AAtngAAMAAkeMAwACR5MAAtnuYk8AAtnzAAG4pwAC2e5iRwAC2fsAAkeTAALZ/wABuNcAAtn/AAG45wAC2e8AAbjPAALaCmJHAALaDiLjAALaDtC/AALaCmJfAALaGwACR5MAAtoeAtcAAtnvAAG40wAC2iZiTwAC2isAAkeTAALaLlzbAALaJmJHAALaNVsAAto3AAG1ywAC2jYKIwAC2iZiXwAC2kQAAwACR5cAAtpOYk8AAtpTAAG4qwAC2k5iRwAC2lsAAkeXAALaXwABuRsAAtpPAAG47wAC2mZiRwAC2moi4wAC2mrQvwAC2mZiXwAC2ncAAkeXAALaegLXAALaTwABuPsAAtqCYk8AAtqHAAJHlwAC2opc2wAC2osAAbj/AALagmJHAALalwABtcsAAtqXAAG5DwAC2pYKIwAC2pcAAkeXAALapwABuQMAAtqCYl8AAtqsAwAC2k8AAbkXAALatmJPAALauwACR5cAAtq+XNsAAtq/AAG4/wAC2rZiRwAC2slbAALaywABtcsAAtrKCiMAAtrLAAJHlwAC2tsAAbkDAALatmJfAALa4AADAAJHmwAC2upiTwAC2u8AAbi7AALa6mJHAALa9wACR5sAAtr7AAG41wAC2vsAAbjnAALa6wABuTsAAtsGYkcAAtsKIuMAAtsK0L8AAtsGYl8AAtsXAAJHmwAC2xoC1wAC2usAAbk/AALbImJPAALbJwACR5sAAtsqXNsAAtsiYkcAAtsxWwAC2zMAAbXLAALbMgojAALbImJfAALbQAADAAJHnwAC20piTwAC208AAbi/AALbTwACR58AAttXAAG5VwAC20piRwAC218AAkefAALbYwABuRsAAttjAAG5YwAC20sAAblHAALbbmJHAALbciLjAALbctC/AALbbmJfAALbfwACR58AAtuCAtcAAttLAAG5TwAC24piTwAC248AAkefAALbklzbAALbkwABuP8AAtuKYkcAAtufAAG1ywAC258AAbkPAALbngojAALbnwACR58AAtuvAAG5AwAC24piXwAC27QDAALbSwABuVMAAtu+Yk8AAtvDAAJHnwAC28Zc2wAC28cAAbj/AALbvmJHAALb0VsAAtvTAAG1ywAC29IKIwAC29MAAkefAALb4wABuQMAAtu+Yl8AAtvoAAMAAkejAALb8wABuXMAAtv2Yk8AAtv7AAG5dwAC2/sAAkejAALcAmCDAALcAnPDAALb9mJTAALcDwACR6MAAtwTAAG5ewAC3BMAAbl/AALcDYcAAtwPAAG5rwAC3A8AAbhDAALcDqG7AALcDgovAALb9mJHAALcMS8AAtwyAv8AAtwzAAJHowAC3D7NuwAC3D8AAaqHAALcPwABuY8AAtw/AAG5kwAC3D8AAbmjAALcPwABuYsAAtw/AAEJzwAC3D8AAbmrAALcPwABuYcAAtwxWwAC3DIClwAC3DJ/EwAC3DJ7KwAC3DINewAC2/ZiVwAC3HmHAALb9mJfAALcgAMAAtvzAAG5swAC3IpiUwAC3I8AAkejAALckwABuX8AAtyKYl8AAtyYAwAC2/MAAbm3AALcomJTAALcpwACR6MAAtyrAAG5fwAC3KJiXwAC3LADAALb8wABubsAAty6YkcAAty/AAJHowAC3MMAAbmHAALcumJfAALcyAMAAtvzAAG5wwAC3NJiRwAC3NcAAkejAALc2wABuYcAAtzSYl8AAtzgAwAC2/MAAbnHAALc6mJHAALc7wACR6MAAtzzAAG5hwAC3OpiXwAC3PgDAALb8wABucsAAt0CYkcAAt0HAAJHowAC3QsAAbmHAALdAmJfAALdEAMAAtvzAAG5zwAC3RpiRwAC3R8AAkejAALdIwABuYcAAt0aYl8AAt0oAwAC2/MAAbnTAALdMmJHAALdNwACR6MAAt07AAG5hwAC3TJiXwAC3UADAALb8wABudcAAt1KYkcAAt1PAAJHowAC3VMAAbmHAALdSmJfAALdWAMAAtvzAAG52wAC3WJiRwAC3WcAAkejAALdawABuYcAAt1iYl8AAt1wAwAC2/MAAbnfAALdemJHAALdfwACR6MAAt2DAAG5hwAC3XpiXwAC3YgDAALb8wABueMAAt2SYkcAAt2XAAJHowAC3ZsAAbmHAALdkmJfAALdoAMAAtvzAAG55wAC3apiRwAC3a8AAkejAALdswABuYcAAt2qYl8AAt24AwAC2/MAAbnrAALdwmJPAALdxwACR6MAAt3LAAGrFwAC3cJiUwAC3dMAAkejAALd1wABuX8AAt3CYkcAAt3fAAJHowAC3eMAAbmHAALdwmJfAALd6AMAAtvzAAG57wAC3fJiUwAC3fcAAkejAALd+wABuX8AAt3yYkcAAt4DAAJHowAC3gcAAbmHAALd8mJfAALeDAADAAJHpwAC3hZiRwAC3hsAAbn0Am9DAALeImJLAALeJwABulcAAt4nAAG6WwAC3icAAbpjAALeJwABumcAAt4nAAG6awAC3icAAbpvAALeJwABunMAAt4nAAG6dwAC3icAAbp7AALeJwABun8AAt4nAAG6gwAC3icAAbqHAALeJwABuosAAt4nAAG6jwAC3icAAbqTAALeJwABupcAAt4nAAG6mwAC3icAAbqfAALeJwABuqMAAt4nAAG6pwAC3icAAbqrAALeJwABuq8AAt4nAAG6swAC3icAAbq3AALeJwABur8AAt4nAAG6wwAC3icAAbrHAALeJwABussAAt4nAAG6zwAC3icAAbrTAALeJwAButcAAt4nAAG62wAC3icAAbrfAALeJwABuuMAAt4nAAG65wAC3icAAbrrAALeJwABuu8AAt4nAAG68wAC3icAAbr3AALeJwABuvsAAt4iYk8AAt7Kb0MAAt7PAAHCRwAC3s8AAcJLAALezwABwk8AAt7PAAHCUwAC3s8AAcJXAALezwABwlsAAt4iYkcAAt7qb0MAAt7vAAHCXwAC3u5wewAC3u5wHwAC3u5wgwAC3u5wYwAC3u5wawAC3u5wlwAC3u5wcwAC3u8AAcJ3AALe7wABwn8AAt7vAAHChwAC3u8AAcKPAALe7wABwpMAAt7vAAHClwAC3u8AAcKfAALe7wABwqMAAt7vAAHCpwAC3u8AAcKrAALe7wABwrcAAt7vAAHCuwAC3u8AAcK/AALe7wABwscAAt7vAAHCywAC3u8AAcLTAALe7wABwtcAAt7vAAHC2wAC3u8AAcLfAALe7wABwucAAt7vAAHC6wAC3u8AAcLvAALe7wABwvMAAt7vAAHC9wAC3u8AAcL7AALe7wABwv8AAt7vAAHDAwAC3u8AAcMLAALe7wABww8AAt7vAAHDEwAC3u8AAcMXAALe7wABwxsAAt7vAAHDHwAC3u8AAcMjAALe7wABwycAAt7vAAHDLwAC3u8AAcMzAALe7wABwzcAAt7vAAHDOwAC3u8AAcM/AALe7wABw1sAAt7rAAG91wAC3uoiPwAC3iJwiwAC375iTwAC38JvQwAC38cAAbsDAALfwwABuwcAAt++YkcAAt/TAAG7CwAC39IHbwAC39GrAALfvmJTAALf4gdzAALf4wABuw8AAt++Yl8AAt/sAwAC3iJwMwAC3/ZiTwAC3/sAAXhDAALf+wABSS8AAt/7AAG7FwAC3/sAAbsbAALf+wABux8AAt/7AAG7IwAC3/sAAbsnAALf9mJTAALgGgfXAALf9mJHAALgIwABuzsAAuAjAAG7PwAC4CFbAALgInBDAALgInA7AALgIgojAALgIwABuysAAuAjAAG7LwAC4CMAAbszAALf9mJfAALgSAMAAt4jAAG7VwAC4FJiTwAC4FZvQwAC4FsAAUjTAALgUmJfAALgYAMAAt4jAAG7WwAC4GpiTwAC4G5vQwAC4HMAAbtfAALgamJfAALgeAMAAt4jAAG7YwAC4IJiUwAC4IcAAbtnAALggmJfAALgjAMAAt4jAAG7awAC4JZiTwAC4JpvQwAC4J8AAbtvAALgnwABu3MAAuCfAAG7dwAC4J8AAbt7AALgnwABu38AAuCfAAG7gwAC4JZiRwAC4LpvQwAC4L8AAbuLAALgvwABu5MAAuC/AAG7mwAC4L8AAbujAALgvwABu6cAAuCWYlMAAuDWb0MAAuDbAAG7lwAC4NsAAbufAALglmJfAALg5AMAAt4jAAG7qwAC4O5iTwAC4PJvQwAC4PcAAbuvAALg9wABu28AAuD3AAG7cwAC4PcAAbuzAALg9wABu7cAAuD3AAGNawAC4PcAAbu7AALg9wABu78AAuD3AAG7wwAC4PcAAbvHAALg8wABuysAAuDzAAG7MwAC4O5iUwAC4SsAAbvLAALhKwABuy8AAuEqB9cAAuEqEO8AAuEq41cAAuErAAG7QwAC4SsAAbtPAALhKm9DAALhSwABu98AAuFLAAG7lwAC4UsAAbvjAALhSwABu+cAAuFLAAG72wAC4Sp9+wAC4O5iVwAC4WcAAbvLAALhZwABuy8AAuDuYkcAAuFyb0MAAuF3AAG76wAC4XcAAbvvAALhdwABu/cAAuF3AAG7/wAC4XcAAbwDAALhdwABvAsAAuF3AAG8DwAC4XcAAbwTAALhds27AALhdwABvDcAAuF3AAG5AwAC4XcAAbw/AALhdwABvAcAAuFxWwAC4XJwOwAC4XIKIwAC4XJwQwAC4O5iXwAC4bwDAALeIwABvE8AAuHGYlMAAuHKb0MAAuHPAAG75wAC4cZiRwAC4dZvQwAC4dsAAbwTAALh2wABvB8AAuHbAAG8JwAC4dsAAbwvAALhxmJfAALh7AMAAt4jAAG8UwAC4fZiRwAC4fpvQwAC4f8AAbwfAALh/wABvCcAAuH/AAG8LwAC4fZiXwAC4gwDAALeIwABvFsAAuIWYk8AAuIab0MAAuIfAAGI8wAC4hZiUwAC4iZvQwAC4isAAbxfAALiFmJHAALiMm9DAALiNwABvGMAAuI3AAG8BwAC4jFbAALiMnA7AALiMgojAALiFmJfAALiTAMAAt4jAAG8awAC4lZiTwAC4loZWwAC4loCswAC4lZiRwAC4maTOwAC4lZiXwAC4mwDAALeIwABvHMAAuJ2Yk8AAuJ6b0MAAuJ/AAGnswAC4nZiRwAC4oSPAALidmJfAALijAMAAt4icLMAAuKWYl8AAuKab0MAAuKeAtcAAt4gDwAC4qZiTwAC4qpvQwAC4q8AAbx/AALirwABvIMAAuKmYlsAAuK4AwAC4rsAAbyPAALiumafAALiugJbAALiugcXAALiuwABvJcAAuKmYkcAAuLXAAG8mwAC4tYHUwAC4tYP4wAC4tZvQwAC4ucAAby/AALi1wABvMMAAuLWBrcAAuLWB8cAAuLWB/sAAuLXAAG81wAC4tcAAbzbAALeIwABvOcAAuMGYk8AAuMIiwAC4woGzwAC4wZiRwAC4xSPAALjBmJfAALjHAMAAt4icJ8AAuMmYlsAAuMoAwAC4ypmnwAC4yZiUwAC4zYHcwAC4zcAAbsPAALjJmJHAALjQwABuwsAAuNCB28AAt4jAAG87wAC405iTwAC41IHcwAC405iRwAC41sAAbsLAALjWgdvAALjWm9DAALjZwABvLMAAuNOYlMAAuNvAAG7DwAC405iXwAC43QDAALeIwABvPcAAuN+YkcAAuODAAG7CwAC44JvQwAC44sAAbyzAALjfmJfAALjkAMAAt4jAAG8+wAC45piRwAC458AAbsLAALjnm9DAALjpwABvLMAAuOaYl8AAuOsAwAC3iMAAbz/AALjtmJPAALjuwABal8AAuO7AAG9AwAC47sAAb0HAALjuwABvQsAAuO7AAG9DwAC47sAAb0TAALjuwABvRcAAuO7AAG9GwAC47sAAb0fAALjuwABvSMAAuO6b0MAAuPnAAG9JwAC47oF2wAC47oJOwAC47pm5wAC47sAAbwjAALjtmJTAALj/m9DAALkAwABvSsAAuQDAAG9PwAC5AMAAb1DAALkAwABvUcAAuQDAAG9SwAC4/8AAb0vAALj/wABvTMAAuP/AAG9NwAC4/8AAb07AALj/wABvU8AAuO2YkcAAuQvAAG9UwAC5C8AAb1bAALkLwABvKcAAuQvAAG9YwAC47ZiXwAC5EIGtwAC5EIHxwAC5EIH+wAC3iLI8wAC5FJiTwAC5FZvQwAC5FsAAb1nAALkWwABvWsAAuRbAAG9bwAC5FsAAb1zAALkWwABvXcAAuRbAAG9ewAC5FsAAY1rAALkWwABvSsAAuRbAAG9fwAC5FJiUwAC5IJvQwAC5IcAAbxHAALkhwABvZMAAuSHAAG9lwAC5IcAAb2bAALkhwABvZ8AAuSHAAG9owAC5IcAAb3DAALkhwABvccAAuRSYkcAAuSqb0MAAuSvAAG9pwAC5K8AAb2zAALkrwABvbsAAuSvAAG9vwAC5K8AAb2LAALkrwABvcsAAuSvAAG9zwAC5K8AAb3TAALkrwABu+8AAuSvAAG92wAC5K8AAb3nAALkrwABveMAAuSvAAG96wAC5K8AAb3vAALkrwABvIsAAuSvAAG8twAC5K8AAbyzAALkrwABvEsAAuSvAAG98wAC5K8AAbyTAALkrwABvfcAAuSqBrcAAuSqB8cAAuSqB/sAAuSrAAG81wAC5KsAAbzbAALkUmJfAALlGAMAAuUbAAG9gwAC5RsAAb2HAALlGwABvY8AAuUaAlsAAt4jAAG+LwAC5TJiTwAC5TZm5wAC5TYOwwAC5TJiXwAC5UADAALeIwABvjMAAuVKYkcAAuVOb0MAAuVTAAG+NwAC5UpiXwAC5VgDAALeIm9HAALlYmJPAALlZm9DAALlalkLAALlYmJbAALlchZjAALlcgJbAALlcgcXAALlcwABvkcAAuVzAAG+SwAC5XMAAb5PAALlcwABvlMAAuVzAAG+ZwAC5WJiRwAC5ZcAAb5vAALllwABvnMAAuWWB+cAAuWWBpcAAuWWAq8AAuWXAAG+dwAC5ZcAAb57AALllwABvKcAAuWWEicAAuWXAAG+gwAC5ZYH2wAC5ZZY6wAC5ZYNZwAC5ZVjAALllgxfAALllg/jAALllljDAALllgdTAALllljLAALllgK3AALlllRPAALllwABvpcAAuWWWPsAAuWWWP8AAuWWWKcAAuWWWPcAAuWXAAG+owAC5ZZY0wAC5ZZY5wAC5ZZY8wAC5ZZYzwAC5ZcAAbzbAALlYmJTAALmGwABu2cAAuYZhwAC5hoFVwAC5hoMZwAC5hoHowAC5hoDDwAC5WJiXwAC5jQDAALmNm9DAALmPhlXAALeIwABvr8AAuZGYkcAAuZKcTcAAuZLAAG7hwAC5koHrwAC5koOJwAC5koH7wAC5koIEwAC5ksAAb6fAALmRmJTAALmawABu0MAAuZGYl8AAuZwAwAC3iKQ4wAC5npiRwAC5n1bAALmfnA7AALmfgojAALmemJfAALmjAMAAt4jAAG+zwAC5pZiTwAC5ppvQwAC5p8AAb7TAALmlmJTAALmpwABu2cAAuaWYkcAAuavAAG+cwAC5q4H5wAC5pZiXwAC5rgDAALeIwABvtcAAubCYkcAAubGcEMAAubGCiMAAubCYl8AAubQAwAC3iMAAb7bAALm2mJHAALm3gojAALm2mJTAALm5n37AALm2mJfAALm7AMAAt4jAAG+3wAC5vZiTwAC5vpvQwAC5v5ZCwAC5vZiWwAC5wQDAALnBwABvucAAucHAAG+6wAC5vZiRwAC5xcAAb5vAALnFnnDAALnFljLAALeIwABvwsAAucmYkcAAucqWMsAAucmYl8AAucwAwAC3iLI+wAC5zpiWwAC5zwDAALnOmJHAALnRXcAAudGcTcAAuc6YlMAAudRewAC3iMAAb8PAALnWmJPAALnXm9DAALnYlzbAALnWmJHAALnaVsAAudqcDsAAudqCiMAAudaYl8AAud4AwAC3iMAAb8TAALngmJTAALnhgfXAALnhwABuysAAueHAAG7ywAC54cAAbsvAALnhwABuzMAAueGEO8AAueG41cAAueHAAG7QwAC54cAAbtPAALngmJbAALnrAMAAuevAAG/FwAC54JiVwAC57sAAbsrAALnuwABu8sAAue7AAG7LwAC57sAAbszAALngmJHAALnzVsAAufOcDsAAufOCiMAAufOcEMAAt4jAAG/IwAC5+JiRwAC5+VbAALn5nA7AALn5gojAALn4mJfAALn9AMAAt4jAAG/JwAC5/5iRwAC6AJvQwAC6AcAAbv/AALoBwABvAsAAugHAAG8DwAC6AcAAbwDAALn/mJfAALoGAMAAt4jAAG/KwAC6CJiXwAC6CQDAALeIwABvy8AAuguYk8AAugyb0MAAug3AAG7rwAC6DcAAb8zAALoNwABvzcAAug3AAG/OwAC6DcAAbuzAALoNwABu7cAAug3AAG/PwAC6DcAAY1rAALoNwABu8cAAugzAAG7KwAC6DMAAbvLAALoMwABuy8AAugzAAG7MwAC6C5iUwAC6G4H1wAC6G4Q7wAC6G5vQwAC6HsAAb9DAALoewABv0cAAuh7AAG74wAC6HsAAbvnAALoewABv08AAuh6cS8AAuhvAAG7TwAC6G7jVwAC6G8AAbtDAALobn37AALoLmJHAALopm9DAALoqwABv1cAAuirAAG/WwAC6KsAAbvrAALoqwABvkMAAuiqzbsAAuirAAG8NwAC6KsAAbkDAALoqwABu/8AAuirAAG8AwAC6KsAAbwLAALoqwABvA8AAuimcEMAAuilWwAC6KZwOwAC6KYKIwAC6C5iXwAC6OgDAALeIwABv3cAAujyYlMAAuj2b0MAAuj7AAGNawAC6PJiVwAC6QJvQwAC6QcAAY1rAALo8mJHAALpDm9DAALpEwABvB8AAukTAAG8JwAC6RMAAbwvAALo8mJfAALpIAMAAt4jAAG/ewAC6SpiRwAC6S5vQwAC6TMAAbwfAALpMwABvCcAAukzAAG8LwAC6SpiXwAC6UADAALeIwABv38AAulKYl8AAulMAwAC6UpiRwAC6VZvQwAC6VsAAbwfAALpWwABvCcAAulbAAG8LwAC3iMAAb+DAALpamJfAALpbAMAAulqYlMAAul2b0MAAul7AAGNawAC6WpiVwAC6YJvQwAC6YcAAY1rAALpamJHAALpjm9DAALpkwABvB8AAumTAAG8JwAC6ZMAAbwvAALeIsj3AALpomJPAALppm9DAALpqwABu/sAAumiYkcAAumyb0MAAum3AAG/hwAC6bEjAALpomJTAALpwg8HAALpomJfAALpyAMAAt4jAAG/iwAC6dJiTwAC6dZvQwAC6dsAAbv7AALp0mJHAALp4m9DAALp5wABv48AAunnAAG7owAC6ecAAbunAALp0mJfAALp9AMAAt4jAAG/kwAC6f5iTwAC6gJvQwAC6gYfrwAC6f5iRwAC6g1bAALqDnA7AALqDgojAALqDnBDAALp/mJTAALqIn37AALp/mJfAALqKAMAAt4jAAG/lwAC6jJiTwAC6jcAAbwzAALqNwABv5sAAuoyYkcAAupDAAG/nwAC6kIH7wAC6kIIEwAC6kJxNwAC6kMAAbsLAALqMmJfAALqWAMAAt4jAAG/owAC6mJiTwAC6mcAAb9TAALqYmJfAALqbAMAAt4jAAG/pwAC6nZiRwAC6npvQwAC6n7NuwAC6n8AAbw3AALqfwABuQMAAup2Yl8AAuqMAwAC3iMAAb+rAALqlmJHAALqmm9DAALqnwABvB8AAuqfAAG8JwAC6p8AAbwvAALqlmJfAALqrAMAAt4jAAG/rwAC6rZiTwAC6rpvQwAC6r8AAb+zAALqvwABu7MAAuq/AAG/twAC6r8AAb83AALqvwABv7sAAuq/AAG/vwAC6r8AAb/DAALqvwABv8cAAuq/AAG/ywAC6r8AAb1DAALqvwABv88AAuq/AAG9KwAC6r8AAY1rAALqvwABv9MAAuq/AAGI8wAC6rZiRwAC6v5vQwAC6wMAAb9vAALrAwABwAMAAusDAAG/+wAC6wLNuwAC6wMAAbw3AALrAwABuQMAAusDAAG7owAC6wMAAbunAALrAwABv48AAusDAAG8VwAC6wMAAbwfAALrAwABvCcAAusDAAG8LwAC6wMAAb9zAALrAwABwBsAAur/AAG7hwAC6v4HrwAC6v4OJwAC6v4H7wAC6v4IEwAC6v5xNwAC6v8AAb6fAALqtmJTAALrXm9DAALrYwABv0sAAutjAAG1wwAC62MAAb9DAALrYwABwAsAAutjAAG/9wAC62MAAbxfAALrYwABv+sAAutjAAHADwAC62MAAb//AALrYwABwBMAAutfAAG7QwAC6rZiXwAC65ADAALeIwABwDMAAuuaYk8AAuueb0MAAuujAAG9ZwAC66MAAbs3AALrmmJHAALrrgfnAALrrm9DAALrtwABv4cAAuu3AAHANwAC65piXwAC68ADAALeIwABwDsAAuvKYk8AAuvOb0MAAuvTAAGI8wAC69MAAcA/AALrymJHAALr3m9DAALr4wABv4cAAuvKYl8AAuvoAwAC3iMAAcBDAALr8mJPAALr9m9DAALr+wABwEcAAuvyYlMAAuwCBVcAAuvyYkcAAuwLAAG8ZwAC7AoJCwAC6/JiXwAC7BQDAALeIwABwFMAAuweYk8AAuwiDsMAAuweYkcAAuwrAAHAVwAC7B5iXwAC7DADAALeIwABwFsAAuw6Yk8AAuw+AlsAAuw6YkcAAuxHAAHAVwAC7DpiXwAC7EwDAALeIwABwF8AAuxWYk8AAuxaBxcAAuxaGP8AAuxWYkcAAuxnAAHAVwAC7FZiXwAC7GwDAALeIwABwGMAAux2YkcAAux7AAHAVwAC7HZiUwAC7IIOwwAC7HZiVwAC7IoOwwAC7HZiXwAC7JADAALeIwABwGsAAuyaYk8AAuyeb0MAAuyjAAHAbwAC7KMAAcBzAALsowABvzcAAuyjAAGNawAC7JpiUwAC7LYFVwAC7LcAAbsfAALstm9DAALswwABwHcAAuyaYkcAAuzLAAG/1wAC7MsAAb/zAALsywABvGcAAuzKCQsAAuyaYl8AAuzcAwAC3iMAAcB7AALs5mJPAALs6wABwH8AAuzrAAHAgwAC7OZiUwAC7PYFVwAC7OZiRwAC7P1bAALs/wABvGcAAuz+CQsAAuzmYl8AAu0MAwAC3iMAAcCHAALtFmJPAALtGm9DAALtHwABwIsAAu0fAAHAjwAC7R8AAcCTAALtHwABvSsAAu0fAAGNawAC7R8AAb/PAALtFmJTAALtOm9DAALtPwABwJsAAu0/AAHAnwAC7TsAAbtDAALtFmJHAALtTm9DAALtUwABwJcAAu1TAAG8LwAC7U8AAbuHAALtTgevAALtTg4nAALtTgfvAALtTggTAALtTnE3AALtTwABvp8AAu0WYl8AAu14AwAC3iMAAcCjAALtgmJPAALthm9DAALtiuWDAALtiwABwKcAAu2LAAHAqwAC7YsAAb0rAALtiwABu/sAAu2KcS8AAu2CYlMAAu2nAAG7ZwAC7aZvQwAC7a8AAcC/AALtgmJHAALttgfnAALttm9DAALtvwABv48AAu2/AAHANwAC7b8AAcCzAALtvwABwLcAAu2/AAHAuwAC7YJiXwAC7dQDAALeIwABwMMAAu3eYk8AAu3ib0MAAu3nAAG+0wAC7d5iRwAC7e8AAbuHAALt7gevAALt7g4nAALt7gfvAALt7ggTAALt7nE3AALt7wABvp8AAu3eYlMAAu4PAAG7QwAC7d5iXwAC7hQDAALeInErAALuHmJPAALuIm9DAALuJnEvAALuJwABwMsAAu4nAAG/6wAC7h5iUwAC7jV7AALuHmJHAALuPXcAAu4+b0MAAu5HAAHA0wAC7kcAAb/LAALuRwABvUMAAu5HAAG/zwAC7j5xNwAC7h5iXwAC7lwDAALeIwABwN8AAu5mYlMAAu5rAAG7ZwAC7mZiRwAC7nIH5wAC7mZiXwAC7ngDAALeIwABwOMAAu6CYk8AAu6Gb0MAAu6K5YMAAu6CYlMAAu6TAAG7ZwAC7oJiRwAC7poH5wAC7ppvQwAC7qMAAb+HAALuowABwOcAAu6jAAHA6wAC7qMAAcDvAALugmJfAALutAMAAt4jAAHA8wAC7r5iTwAC7sJvQwAC7scAAb7TAALuxnEvAALuvmJHAALu0m9DAALu1s27AALu1wABvDcAAu7XAAG7owAC7tcAAbunAALu1wABv48AAu7XAAHA5wAC7tcAAcDrAALu1wABwO8AAu6+Yl8AAu74AwAC3iMAAcD3AALvAmJPAALvBm9DAALvCwABwPsAAu8CYkcAAu8Sb0MAAu8XAAHA5wAC7wJiXwAC7xwDAALeIwABwQMAAu8mYk8AAu8qb0MAAu8vAAHBBwAC7yZiRwAC7zZvQwAC7zsAAcDnAALvJmJfAALvQAMAAt4jAAHBDwAC70piTwAC705vQwAC71MAAcETAALvSmJHAALvWm9DAALvXwABwOcAAu9KYl8AAu9kAwAC3iMAAcEXAALvbmJPAALvcm9DAALvdwABwQcAAu93AAHA+wAC725iRwAC74JvQwAC74cAAcDrAALvbmJfAALvjAMAAt4jAAHBGwAC75ZiTwAC75pvQwAC756emwAC75ZiRwAC76ZvQwAC76sAAb+HAALvqwABwOcAAu+WYl8AAu+0AwAC3iMAAcEfAALvvmJPAALvwm9DAALvxwABwSMAAu++YlMAAu/Ob0MAAu/TAAHBJwAC79KemwAC79JcGwAC775iVwAC7+JvQwAC7+cAAcEnAALv5p6bAALv5lwbAALvvmJfAALv9AMAAt4jAAHBKwAC7/5iTwAC8AJvQwAC8AcAAcD7AALv/mJHAALwDm9DAALwEwABwOcAAu/+Yl8AAvAYAwAC3iMAAcEvAALwImJPAALwJm9DAALwKp6bAALwImJHAALwMm9DAALwNwABv4cAAvA3AAHA5wAC8CJiXwAC8EADAALeIwABwTMAAvBKYk8AAvBOb0MAAvBTAAHA+wAC8EpiRwAC8FpvQwAC8F8AAb+HAALwXwABwOcAAvBKYl8AAvBoAwAC3iMAAcE7AALwcmJPAALwdm9DAALwewABwT8AAvB68JcAAvByYkcAAvCGb0MAAvCLAAG/hwAC8IsAAcDnAALwcmJfAALwlAMAAt4jAAHBSwAC8J5iTwAC8KJvQwAC8KZc2wAC8J5iRwAC8K1bAALwrnA7AALwrgojAALwnmJfAALwvAMAAt4jAAHBTwAC8MZiTwAC8MpvQwAC8M8AAcFTAALwznEvAALwxmJTAALw2m9DAALw3wABwV8AAvDGYkcAAvDmb0MAAvDqzbsAAvDrAAG8NwAC8OsAAbkDAALw6wABu6MAAvDrAAG7pwAC8OsAAb+PAALw6wABwOcAAvDrAAHA6wAC8OsAAcDvAALwxmJfAALxEAMAAt4jAAHBZwAC8RpiTwAC8R5vQwAC8SMAAcFrAALxGmJHAALxKnnDAALxGmJfAALxMAMAAt4jAAHBbwAC8TpiTwAC8T5vQwAC8UMAAcFrAALxQwABvtMAAvE6YlMAAvFPAAG7ZwAC8TpiRwAC8VYH5wAC8TpiXwAC8VwDAALeIwABwXMAAvFmYk8AAvFqb0MAAvFvAAHA5wAC8W8AAcDrAALxbwABwO8AAvFuXNsAAvFmYlMAAvGCb0MAAvGHAAG1wwAC8WZiRwAC8Y1bAALxjnA7AALxjgojAALxZmJfAALxnAMAAt4jAAHBfwAC8aZiRwAC8ap5wwAC8aZiXwAC8bADAALeIwABwYcAAvG6Yk8AAvG+b0MAAvHCylcAAvG6YkcAAvHKecMAAvG6Yl8AAvHQAwAC3iMAAcGLAALx2mJPAALx3m9DAALx4wABwDcAAvHaYkcAAvHqecMAAvHaYl8AAvHwAwAC3iMAAcGPAALx+mJPAALx/m9DAALyAwABwDcAAvIDAAG+0wAC8fpiUwAC8g8AAbtnAALx+mJHAALyFgfnAALx+mJfAALyHAMAAt4jAAHBkwAC8iZiWwAC8igDAALyKwABvlMAAvImYkcAAvI2Cm8AAvI2cTcAAvI2b0MAAvJDAAHBpwAC8kMAAcGvAALyJmJTAALyTwABwaMAAvJOIn8AAt4jAAHBswAC8lpiTwAC8l4HFwAC8l4Y/wAC8lpiRwAC8miPAALyWmJTAALycm7/AALydwABwbcAAvJaYlcAAvJ+bv8AAvKDAAHBtwAC8lpiXwAC8ogDAALeIwABwb8AAvKSYk8AAvKWkYsAAvKWCasAAvKSYl8AAvKgAwAC3iKRIwAC8qpiTwAC8q5vQwAC8rJZCwAC8qpiWwAC8rgDAALyulijAALyqmJTAALyxwABvf8AAvLGCm8AAvLGkXsAAvLGkYMAAvLHAAG9twAC8scAAb2vAALyxwABv9sAAvLHAAG8IwAC8scAAb3XAALyxwABvq8AAvLHAAHBmwAC8scAARrjAALyxwABwcMAAt4jAAHBxwAC8v5iTwAC8wMAAb3/AALzAgpvAALzApF7AALzApGDAALzAwABvbcAAvMDAAG9rwAC8wMAAb/bAALzAwABvCMAAvMDAAG91wAC8wMAAb6vAALzAwABwZsAAvMDAAEa4wAC8wMAAcHDAALy/mJfAALzOAMAAt4ikR8AAvNCYkcAAvNHAAG9/wAC80YKbwAC80aRewAC80aRgwAC80cAAb23AALzRwABva8AAvNHAAG/2wAC80cAAbwjAALzRwABvdcAAvNHAAG+rwAC80cAAcGbAALzRwABGuMAAvNHAAHBwwAC80JiXwAC83wDAALeIiI7AALzhmJPAALzihtLAALzim9DAALzkiLXAALzhmJTAALzmXsAAvOaEUsAAvObAAHBywAC84ZiRwAC86sAAb3/AALzqwABvgsAAvOrAAHBwwAC86oKbwAC86qRewAC86qRgwAC86sAAcArAALzqwABvrsAAvOrAAHAIwAC86sAAb23AALzqwABva8AAvOrAAG/2wAC86sAAcHbAALzqwABwd8AAvOrAAHB4wAC86sAAcGXAALzqwABvM8AAvOrAAHB5wAC86sAAbwjAALzqwABvdcAAvOrAAG+rwAC86sAAcGbAALzqwABGuMAAvOqb0MAAvQLAAHB6wAC9AsAAcHvAALzqS8AAvOGYl8AAvQab0MAAvQeAtcAAt4jAAHB8wAC9CZiTwAC9CpvQwAC9C8AAcH3AAL0JmJHAAL0NwABvf8AAvQ2Cm8AAvQ2kXsAAvQ2kYMAAvQ3AAG9twAC9DcAAb2vAAL0NwABv9sAAvQ3AAG8IwAC9DcAAb3XAAL0NwABvq8AAvQ3AAHBmwAC9DcAARrjAAL0NwABwcMAAvQmYl8AAvRsAwAC3iMAAcIjAAL0dmJTAAL0em9DAAL0fpF3AAL0fpF/AAL0fpGHAAL0fwABwgcAAvR/AAHCCwAC9H8AAcIPAAL0fwABwhMAAvR/AAHCFwAC9H8AAcGnAAL0fwABwa8AAvR/AAHCGwAC9H8AAcIfAAL0fwABwf8AAvR+t1cAAvR+pCMAAvR6EUsAAvR2YkcAAvTDAAG+CwAC9HZiXwAC9MgDAALeIwABwicAAvTSYk8AAvTWb0MAAvTakXcAAvTakX8AAvTakYcAAvTbAAHCBwAC9NsAAcILAAL02wABwg8AAvTbAAHCEwAC9NsAAcIXAAL02wABwacAAvTbAAHBrwAC9NsAAcIbAAL02wABwh8AAvTbAAHB/wAC9NsAAcIrAAL02qQjAAL01hFLAAL00mJTAAL1Hm9DAAL1IrdXAAL1HwABwcsAAvTSYkcAAvUvAAHAKwAC9S8AAb67AAL1LwABwCMAAvUvAAHB2wAC9S8AAcHfAAL1LwABweMAAvUvAAHBlwAC9S8AAbzPAAL1LwABwecAAvUtLwAC9S8AAb3/AAL1LwABwcMAAvUuCm8AAvUukXsAAvUukYMAAvUvAAG9twAC9S8AAb2vAAL1LwABv9sAAvUvAAG8IwAC9S8AAb3XAAL1LwABvq8AAvUvAAHBmwAC9S8AARrjAAL00mJfAAL1jAMAAt4jAAHCOwAC9ZZiTwAC9ZpvQwAC9Z8AAcI/AAL1nwABwkMAAvWWYlMAAvWqb0MAAvWukXcAAvWukX8AAvWukYcAAvWvAAHCBwAC9a8AAcILAAL1rwABwg8AAvWvAAHCEwAC9a8AAcIXAAL1rwABwacAAvWvAAHBrwAC9a8AAcIbAAL1rwABwh8AAvWvAAHB/wAC9a6kIwAC9a63VwAC9aoRSwAC9asAAcHLAAL1lmJHAAL19wABwCsAAvX3AAG+uwAC9fcAAcAjAAL19wABwdsAAvX3AAHB3wAC9fcAAcHjAAL19wABwZcAAvX3AAG8zwAC9fcAAcHnAAL19S8AAvX3AAG9/wAC9fcAAcHDAAL19gpvAAL19pF7AAL19pGDAAL19wABvbcAAvX3AAG9rwAC9fcAAb/bAAL19wABvCMAAvX3AAG91wAC9fcAAb6vAAL19wABwZsAAvX3AAEa4wAC9ZZiXwAC9lQAAnrTAAL2XmJLAAL2YwABuqMAAvZjAAHDlwAC9mMAAbqXAAL2XmJPAAL2cnrTAAL2dwABx4MAAvZ3AAGq5wAC9l5iRwAC9oJ60wAC9ocAAceHAAL2hwABx4sAAvaHAAHHjwAC9ocAAarrAAL2hwABx5MAAvaHAAHHqwAC9ocAAcevAAL2XwABw5sAAvamYk8AAvaqetMAAvavAAGsnwAC9q8AAcOfAAL2rwABw6MAAvavAAHDpwAC9qZiUwAC9sGHAAL2wgVXAAL2wg7LAAL2wg2LAAL2wKcAAvamYkcAAvbaHQcAAvbbAAELrwAC9tkvAAL22gL/AAL22mRXAAL22gKXAAL22g/jAAL22hFnAAL22gkLAAL22nrTAAL3AwABw7cAAvcDAAHDrwAC9wMAAcPHAAL3AwABw9MAAvamYl8AAvcUAwAC9l8AAcPXAAL3HmJPAAL3InrTAAL3JvCXAAL3JhnnAAL3JwABw9sAAvceYkcAAvc2HQcAAvc1LwAC9zYC/wAC9zZkVwAC9zYRZwAC9zZ60wAC908AAcPTAAL3HmJfAAL3VAMAAvZfAAHD4wAC915iRwAC92IdBwAC92EvAAL3YgL/AAL3YmRXAAL3YhFnAAL3YnrTAAL3ewABw9MAAvdeYl8AAveAAwAC9l8AAcPnAAL3imJPAAL3jg9HAAL3jgJbAAL3jg8HAAL3jg7DAAL3imJfAAL3oAMAAvZfAAHD6wAC96piTwAC96560wAC97KkIwAC96piUwAC97mHAAL3ugVXAAL3ug7LAAL3qmJfAAL3yAMAAvZfAAHD7wAC99JiUwAC99VzAAL30mJHAAL33gxfAAL33g/jAAL33lRPAAL30mJfAAL37AMAAvZfAAHD8wAC9/ZiUwAC9/lzAAL39mJHAAL4AgxfAAL4Ag/jAAL39mJfAAL4DAMAAvZfAAHD9wAC+BZiTwAC+Bp60wAC+B6kIwAC+B8AAcP7AAL4HlxbAAL4HwABw/8AAvgWYkcAAvgxdwAC+BZiXwAC+DgDAAL2XwABxAMAAvhCYlMAAvhFewAC+EJiXwAC+EwDAAL2XwABxAcAAvhWYlMAAvhZewAC+FZiXwAC+GADAAL2XwABxAsAAvhqYk8AAvhuetMAAvhzAAGsnwAC+HMAAcOjAAL4cwABw58AAvhzAAHDpwAC+GpiRwAC+IZ60wAC+IrwlwAC+IoZ5wAC+IsAAcQPAAL4iwABxBMAAviLAAHEFwAC+IsAAcOvAAL4iwABw8cAAviKXG8AAviLAAHEJwAC+IYMXwAC+IZb2wAC+IVbAAL4hgKXAAL4hhFnAAL4hlvfAAL4hlvjAAL4hlvvAAL4hgkLAAL4amJTAAL41XMAAvjVhwAC+NYFVwAC+NYOywAC+NYMZwAC+NYHowAC+GpiXwAC+PADAAL2XwABxCsAAvj6YkcAAvj+etMAAvkCGecAAvkC8JcAAvkCXG8AAvkDAAHEJwAC+PpiXwAC+RQDAAL2XwABxC8AAvkeYk8AAvkietMAAvknAAHEMwAC+ScAASBbAAL5JwABw9sAAvkeYkcAAvk2EWcAAvk2DF8AAvk2W9sAAvk2EAsAAvk2W98AAvk2etMAAvlO8JcAAvlOGecAAvlOXG8AAvlPAAHEJwAC+R5iXwAC+WADAAL2XwABxDcAAvlqYk8AAvluD0cAAvluDwcAAvluDsMAAvlqYkcAAvl+EWcAAvlqYl8AAvmEAwAC9l8AAcQ7AAL5jmJPAAL5knrTAAL5lwABrWMAAvmXAAHDpwAC+ZZcWwAC+ZcAAbt/AAL5liLXAAL5jmJHAAL5rXcAAvmOYlMAAvm1ewAC+Y5iXwAC+bwDAAL2XwABxD8AAvnGYk8AAvnKetMAAvnOXFsAAvnPAAHEQwAC+c7aXwAC+c8AAcRHAAL5zwABxEsAAvnGYl8AAvnkAwAC9l8AAcRTAAL57mJTAAL58nrTAAL59lxbAAL59wABxEMAAvn22l8AAvn3AAHERwAC+fcAAcRLAAL57mJXAAL6DnrTAAL6ElxbAAL6EwABxEMAAvoS2l8AAvoTAAHERwAC+hMAAcRLAAL57mJfAAL6KAMAAvZfAAHEjwAC+jJiTwAC+jZ60wAC+jsAAcSTAAL6OwABxJcAAvo7AAHEmwAC+jsAAcSfAAL6MmJHAAL6TnrTAAL6UwABxKMAAvpTAAHErwAC+lMAAcS/AAL6UwABxMcAAvpTAAHEywAC+lMAAcTTAAL6UwABxNsAAvoyYlMAAvpyetMAAvp3AAHE1wAC+nGHAAL6MmJfAAL6gAMAAvZfAAHE5wAC+opiRwAC+o560wAC+pIZ5wAC+pLwlwAC+opiXwAC+pwDAAL2XwABxOsAAvqmYkcAAvqqetMAAvquGecAAvqu8JcAAvqmYl8AAvq4AwAC9l8AAcTvAAL6wmJfAAL6xAMAAvrCYlMAAvrODYsAAvrOD0MAAvrNhwAC+s4FVwAC+s4OywAC+synAAL6wmJHAAL66S8AAvrqAv8AAvrqEWcAAvrqCQsAAvrqWMsAAvrqD+MAAvrqApcAAvrrAAELrwAC+upkVwAC+uqsmwAC+usAAQvDAAL66gKvAAL66wABC7cAAvrqW+MAAvrqHQcAAvrojwAC9l8AAcT7AAL7LmJfAAL7MAMAAvsuYkcAAvs6etMAAvs+GecAAvs+8JcAAvs/AAHE2wAC+z8AAcT/AAL7PwABxQMAAvs/AAHFCwAC+z8AAcUTAAL7PwABxRsAAvs/AAHFJwAC+zoJCwAC+zoC/wAC+zpkVwAC+zoRZwAC+zodBwAC+zkvAAL7OwABC68AAvs6D+MAAvsuYlMAAvuGetMAAvuLAAHE1wAC+4WHAAL7hgVXAAL7hg7LAAL7hg2LAAL7hKcAAvZfAAHFMwAC+6ZiXwAC+6gDAAL7pmJPAAL7snrTAAL7twABxJMAAvu3AAHElwAC+7cAAcSbAAL7twABxJ8AAvumYkcAAvvKetMAAvvPAAHEowAC+88AAcSvAAL7zwABxL8AAvvPAAHExwAC+88AAcTLAAL7zwABxNMAAvvPAAHE2wAC+6ZiUwAC++560wAC+/MAAcTXAAL77YcAAvZfAAHFNwAC+/5iXwAC/AADAAL7/mJHAAL8CnrTAAL8DhnnAAL8DvCXAAL2XwABxTsAAvwaYl8AAvwcAwAC9l8AAcU/AAL8JmJHAAL8KnrTAAL8LhnnAAL8LvCXAAL8LwABxNsAAvwvAAHE/wAC/C8AAcUDAAL8LwABxQsAAvwvAAHFEwAC/C8AAcUbAAL8LwABxScAAvwqCQsAAvwqAv8AAvwqZFcAAvwqEWcAAvwqHQcAAvwpLwAC/CsAAQuvAAL8Kg/jAAL8JmJTAAL8dnrTAAL8ewABxNcAAvx1hwAC/HYFVwAC/HYOywAC/HYNiwAC/HSnAAL8JmJfAAL8lAMAAvZfAAHFQwAC/J5iXwAC/KADAAL8nmJTAAL8qg2LAAL8qg9DAAL8qYcAAvyqBVcAAvyqDssAAvyopwAC/J5iRwAC/MUvAAL8xgL/AAL8xhFnAAL8xgkLAAL8xljLAAL8xg/jAAL8xgKXAAL8xwABC68AAvzGZFcAAvzGrJsAAvzHAAELwwAC/MYCrwAC/McAAQu3AAL8xlvjAAL8xh0HAAL8xI8AAvZfAAHFRwAC/QpiXwAC/QwDAAL9CmJHAAL9FnrTAAL9GhnnAAL9GvCXAAL9GwABxNsAAv0bAAHE/wAC/RsAAcUDAAL9GwABxQsAAv0bAAHFEwAC/RsAAcUbAAL9GwABxScAAv0WCQsAAv0WAv8AAv0WZFcAAv0WEWcAAv0WHQcAAv0VLwAC/RcAAQuvAAL9Fg/jAAL9CmJTAAL9YnrTAAL9ZwABxNcAAv1hhwAC/WIFVwAC/WIOywAC/WINiwAC/WCnAAL2XwABxUsAAv2CYl8AAv2EAwAC/YJiTwAC/Y560wAC/ZMAAcSTAAL9kwABxJcAAv2TAAHEmwAC/ZMAAcSfAAL9gmJHAAL9pnrTAAL9qwABxKMAAv2rAAHErwAC/asAAcS/AAL9qwABxMcAAv2rAAHEywAC/asAAcTTAAL9qwABxNsAAv2CYlMAAv3KetMAAv3PAAHE1wAC/cmHAAL2XwABxU8AAv3aYl8AAv3cAwAC/dpiRwAC/eZ60wAC/eoZ5wAC/erwlwAC9l8AAcVTAAL99mJfAAL9+AMAAvZfAAHFVwAC/gJiXwAC/gQDAAL+AmJTAAL+Dg2LAAL+Dg9DAAL+DYcAAv4OBVcAAv4ODssAAv4MpwAC/gJiRwAC/ikvAAL+KgL/AAL+KhFnAAL+KgkLAAL+KljLAAL+Kg/jAAL+KgKXAAL+KwABC68AAv4qZFcAAv4qrJsAAv4rAAELwwAC/ioCrwAC/isAAQu3AAL+KlvjAAL+Kh0HAAL+KI8AAvZfAAHFWwAC/m5iXwAC/nADAAL+bmJHAAL+enrTAAL+fhnnAAL+fvCXAAL+fwABxNsAAv5/AAHE/wAC/n8AAcUDAAL+fwABxQsAAv5/AAHFEwAC/n8AAcUbAAL+fwABxScAAv56CQsAAv56Av8AAv56ZFcAAv56EWcAAv56HQcAAv55LwAC/nsAAQuvAAL+eg/jAAL+bmJTAAL+xnrTAAL+ywABxNcAAv7FhwAC/sYFVwAC/sYOywAC/sYNiwAC/sSnAAL2XwABxV8AAv7mYl8AAv7oAwAC/uZiTwAC/vJ60wAC/vcAAcSTAAL+9wABxJcAAv73AAHEmwAC/vcAAcSfAAL+5mJHAAL/CnrTAAL/DwABxKMAAv8PAAHErwAC/w8AAcS/AAL/DwABxMcAAv8PAAHEywAC/w8AAcTTAAL/DwABxNsAAv7mYlMAAv8uetMAAv8zAAHE1wAC/y2HAAL2XwABxWMAAv8+Yk8AAv9CetMAAv9HAAHEMwAC/0cAASBbAAL/RwABw9sAAv8+YkcAAv9WetMAAv9aGecAAv9a8JcAAv9WHQcAAv9VLwAC/1YRZwAC/z5iXwAC/3ADAAL2XwABxWcAAv96Yk8AAv9+etMAAv+DAAGs5wAC/4LaXwAC/4MAAcVrAAL/gwABtWsAAv+DAAHFbwAC/3piUwAC/5lzAAL/mYcAAv+aBVcAAv+aDssAAv96Yl8AAv+sAwAC9l8AAcVzAAL/tmJPAAL/unrTAAL/vwABrOcAAv++2l8AAv+/AAHFawAC/78AAbVrAAL/vwABxW8AAv+/AAHE1wAC/7l7AAL/tmJHAAL/3XcAAv+2Yl8AAv/kAwAC9l8AAcV3AAL/7mJfAAL/8AMAAv/uYk8AAv/6etMAAv//AAHEkwAC//8AAcSXAAL//wABxJsAAv//AAHEnwAC/+5iRwADABJ60wADABcAAcSjAAMAFwABxK8AAwAXAAHEvwADABcAAcTHAAMAFwABxMsAAwAXAAHE0wADABcAAcTbAAL/7mJTAAMANnrTAAMAOwABxNcAAwA1hwAC9l8AAcV7AAMARmJfAAMASAMAAwBGYkcAAwBSetMAAwBWGecAAwBW8JcAAvZfAAHFfwADAGJiXwADAGQDAAMAYmJHAAMAbVsAAwBuDF8AAwBuW9sAAwBuEWcAAwBuVE8AAwBuWMsAAwBuWN8AAwBuWQMAAwBuCQsAAwBuApcAAwBuW98AAwBuW+sAAwBuW+MAAwBuW+8AAwBuEAsAAwBuW/MAAwBuW/cAAwBuW/sAAwBuArcAAwBuAq8AAwBsjwADAG4GlwADAG4SJwADAG4P4wADAG5Y6wADAG4NZwADAG5YwwADAG1jAAMAbgdTAAMAblj7AAMAblj/AAMAblinAAMAblj3AAMAbljTAAMAbljnAAMAbljzAAMAbljPAAMAYmJTAAMBBXMAAwEFhwADAQYFVwADAQYOywADAQYDDwADAQYMZwADAQYHowAC9l8AAcWLAAMBJmJHAAMBKnrTAAMBLwABxA8AAwEvAAHE/wADAS8AAcUDAAMBLwABxY8AAwEvAAHFCwADASpYywADASoJCwADASlbAAMBKlvbAAMBKgxfAAMBKhFnAAMBKlRPAAMBJmJTAAMBYYcAAwFiDGcAAwFiB6MAAwFhcwADASZiXwADAXQDAAL2XwABxZMAAwF+Yl8AAwGAAwADAX5iRwADAYp60wADAY4Z5wADAY7wlwAC9l8AAcWXAAMBmmJHAAMBnlRPAAMBnnrTAAMBpwABxA8AAwGeWMsAAwGaYl8AAwGwAwAC9l8AAcWbAAMBumJPAAMBvnrTAAMBwwABxDMAAwHDAAEgWwADAcMAAcPbAAMBumJHAAMB0nrTAAMB1hnnAAMB1vCXAAMB0gxfAAMB0lvbAAMB0hFnAAMB0ljLAAMB0lRPAAMBumJfAAMB9AMAAvZfAAGtZwADAf5iTwADAgJ60wADAgblgwADAf5iRwADAg5YywADAg0vAAMB/mJTAAMCGYcAAwH+Yl8AAwIgAwAC9l8AARlHAAMCKmJHAAMCLnrTAAMCMwABw9MAAwIqYlsAAwI4AwADAjsAAS1XAAMCOlijAAMCOmjHAAMCOwABvk8AAwI7AAHFnwADAjsAAcWjAAL2XwABxacAAwJaYlsAAwJcAwADAl8AAS1XAAMCXlijAAMCXmjHAAMCWmJTAAMCcXMAAvZfA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wADCS5iXwADCVADAAL2XwABxmMAAwlaYk8AAwleWIMAAwlaYkcAAwlnAAGRvwADCWYPowADCWYRZwADCWcAAcZnAAMJZwABxmsAAwlaYl8AAwl8AwAC9l8AAcZvAAMJhmJPAAMJinrTAAMJjtJnAAMJhmJHAAMJlnrTAAMJmwABxnMAAwmbAAHGdwADCZsAAcZ7AAMJmwABxBMAAwmXAAHGawADCZcAAcZnAAMJhmJTAAMJtnrTAAMJulxLAAMJhmJfAAMJwAMAAvZfAAHGfwADCcpiRwADCc8AAZG/AAMJzg+jAAMJznrTAAMJ2wABxBMAAwnbAAHGcwADCc4RZwADCcpiXwADCegDAAL2XwABxoMAAwnyYkcAAwn2etMAAwn7AAHGcwADCfsAAcQTAAMJ8mJTAAMKBnrTAAMKClxLAAMJ8mJfAAMKEAMAAvZfAAHGhwADChpiTwADCh560wADCiMAAcaLAAMKIwABw58AAwoaYlsAAwouWKMAAwouaMcAAwoaYkcAAwo6WMsAAwo6EIsAAwo7AAGtDwADCjlbAAMKOgKXAAMKOhhHAAMKOnxDAAMKOhFnAAMKOnrTAAMKXn6zAAMKOlvjAAMKOlvvAAMKOwABxpMAAwo7AAHGjwADCjoJCwADCjsAAcaXAAMKOI8AAwoaYlMAAwqBhwADCoIMZwADCoIHowADCoIDDwADCoIFVwADCoFzAAMKGmJfAAMKnAMAAvZfAAHGmwADCqZiTwADCqp60wADCq8AAcaLAAMKrwABxp8AAwquItcAAwqmYkcAAwq9dwADCqZiUwADCsV7AAMKpmJfAAMKzAMAAvZfAAHGpwADCtZiTwADCtp60wADCt8AAayfAAMK3wABrOcAAwrfAAGs6wADCt8AAazvAAMK3wABw6cAAwrWYlsAAwr2WKMAAwr2aMcAAwrWYkcAAwsCWMsAAwsCD+MAAwsCWM8AAwsCArcAAwsBWwADCwIClwADCwIRZwADCwJ60wADCyMAAcQXAAMLIwABrScAAwsjAAGtKwADCyMAAcarAAMLIs27AAMLIwABxBMAAwsjAAEJzwADCyMAAa03AAMLIwABrQMAAwsCW+MAAwsCW+8AAwsCCQsAAwsAjwADCwIQiwADCwMAAa0PAAMLAnxDAAMLAhhHAAMK1mJTAAMLaXMAAwtqBVcAAwtphwADC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CcAAxQvAAHIKwADFC8AAcgvAAMULwAByDMAAxQWYlMAAxRmBdsAAxQWYl8AAxRsAwADEw8AAchDAAMUdmJPAAMUewAByEcAAxR2YkcAAxSDAAHILwADFIMAAcgjAAMUdmJTAAMUjgXbAAMUdmJfAAMUlAMAAxMPAAHISwADFJ5iTwADFKMAAchPAAMUowAByFMAAxSiDW8AAxShhwADFJ5iUwADFLcAAapPAAMUnmJHAAMUvwACR6sAAxTDAAHIVwADFL8AAchbAAMUvwABfbMAAxS/AAHIXwADFL8AAchjAAMUnmJfAAMU2AMAAxMPAAHIZwADFOJiTwADFOcAAchrAAMU5wAByG8AAxTnAAHIcwADFOcAAch3AAMU5wAByHsAAxTnAAHIfwADFOcAAciDAAMU5wAByIcAAxTnAAHIiwADFObXMwADFOcAAciPAAMU5wAByJMAAxTnAAHIlwADFOcAAcibAAMU5wAByJ8AAxTnAAHIowADFOcAAcinAAMU5wAByKsAAxTnAAHIrwADFOcAAcizAAMU5wAByLcAAxTnAAHIuwADFOcAAci/AAMU5wAByMMAAxTnAAHIxwADFOcAAcjLAAMU5wAByM8AAxTnAAHI0wADFOZlLwADFOcAAcjXAAMU5ncjAAMU5naTAAMU5nb7AAMU5wAByNsAAxTmd1MAAxTnAAHI3wADFOcAAcjjAAMU5naPAAMU5wAByOcAAxTnAAHI6wADFOZ3iwADFOcAAcjvAAMU5wAByPMAAxTnAAHI9wADFOcAAcj7AAMU5wAByP8AAxTnAAHJAwADFOcAAckHAAMU5wAByQsAAxTnAAHJDwADFOcAAckTAAMU5wAByRcAAxTnAAGB8wADFOcAAYH3AAMU5wAByRsAAxTnAAHJHwADFOcAAckjAAMU5wAByScAAxTnAAHJKwADFOcAAckvAAMU5wAByTMAAxTnAAHJNwADFOcAAck7AAMU5wAByT8AAxTnAAHJQwADFOcAAclHAAMU5wAByUsAAxTnAAHJTwADFOcAAclTAAMU5wAByVcAAxTnAAHJWwADFOcAAclfAAMU5wAByWMAAxTnAAHJZwADFOcAAclrAAMU5wAByW8AAxTnAAHJcwADFOcAAcl3AAMU5wAByXsAAxTnAAHJfwADFOcAAcmDAAMU5qG/AAMU5gk7AAMU5wABj48AAxTnAAHJhwADFOYKLwADFOJiRwADFkMAAcmLAAMWQwAByY8AAxZCCiMAAxZDAAHJowADFkMAAcmnAAMWQwAByasAAxZDAAHJrwADFkMAAcmzAAMWQwABybcAAxZDAAF9swADFkMAAchfAAMWQwAByGMAAxZDAAHJuwADFkMAAcnDAAMWQwAByb8AAxZDAAHJxwADFkMAAcnbAAMWQgwfAAMWQwAByf8AAxZDAAHJ+wADFkMAAcn3AAMWQwABygcAAxZDAAHJ8wADFkMAAcoXAAMWQwABydcAAxZDAAHJzwADFkMAAcnTAAMWQwAByi8AAxZDAAHKMwADFkMAAcnLAAMWQwAByZsAAxZDAAHKAwADFkIHCwADFOJiUwADFsoF2wADFssAAcgHAAMWyq6vAAMU4mJXAAMW2q6vAAMU4mJfAAMW4AMAAxMPAAHKwwADFupiTwADFu6urwADFu8AAcgHAAMW6mJHAAMW+wAByaMAAxb7AAF9swADFvsAAcmrAAMW+wABybMAAxb7AAHJrwADFvsAAcm3AAMW+wAByacAAxb7AAHIYwADFupiXwADFxwDAAMTDwAByscAAxcmYk8AAxcrAAJHqwADFy8AAcrLAAMXLwABx/8AAxcuXNsAAxcmYkcAAxc/AAJHqwADF0MAAcrPAAMXPwABtcsAAxc9WwADFz4KIwADFz8AAbkPAAMXJmJfAAMXWAMAAxMPAAHK0wADF2JiTwADF2cAAcrXAAMXZwABytsAAxdnAAHK3wADF2cAAcrjAAMXZwAByucAAxdnAAHJGwADF2cAAcrrAAMXZwAByu8AAxdnAAHK8wADF2cAAcr3AAMXZwAByvsAAxdnAAHK/wADF2cAAcsDAAMXZwABywcAAxdnAAHLCwADF2cAAcsPAAMXZwAByxMAAxdnAAHLFwADF2cAAcsbAAMXZwAByx8AAxdmCi8AAxdlhwADF2cAAcmHAAMXZwAByyMAAxdmHC8AAxdiYkcAAxfPAAHLJwADF88AAcszAAMXzwACR6sAAxfbAAHLTwADF9sAAQnPAAMXzwABtcsAAxfMjwADF2JiXwADF+wDAAMTDwABy2MAAxf2Yk8AAxf6HC8AAxf6rq8AAxf7AAHIBwADF/ZiRwADGAsAAcmjAAMYCwABfbMAAxgLAAHJqwADGAsAAcmzAAMYCwABya8AAxgLAAHJtwADGAsAAcmnAAMYCwAByGMAAxf2Yl8AAxgsAwADEw8AActnAAMYNmJPAAMYOwACR6sAAxg/AAHKywADGD5c2wADGDZiRwADGEsAAkerAAMYTwABys8AAxhPAAHLawADGEsAAbXLAAMYSVsAAxhKCiMAAxg2Yl8AAxhkAwADEw8AActvAAMYbmJPAAMYcwACR6sAAxh3AAHLcwADGG5iUwADGH4C9wADGH4i3wADGH4H3wADGG5iRwADGI5VEwADGI4cKwADGG5iXwADGJgDAAMTDwABy38AAxiiYk8AAxinAAJHqwADGKsAAcuDAAMYomJHAAMYsiLjAAMYstC/AAMYsnnDAAMYomJfAAMYwAMAAxMPAAHLjwADGMpiXwADGMwDAAMTDwABy5MAAxjWYk8AAxjbAAJHqwADGN5c2wADGN8AAcuDAAMY1mJHAAMY6gojAAMY6wABtcsAAxjWYl8AAxj0AwADEw8AAcubAAMY/mJPAAMZAwACR6sAAxkHAAHLcwADGQcAAcuDAAMY/mJHAAMZEiLjAAMZEwACR6sAAxkbAAHLowADGRLQvwADGRJ5wwADGP5iXwADGSgDAAMTDwABy6cAAxkyYkcAAxk20L8AAxkyYl8AAxk8AwADEw8AAcuvAAMZRmJPAAMZSwACR6sAAxlPAAHLswADGUZiRwADGVYKIwADGVVbAAMZVwABtcsAAxlGYl8AAxlkAwADEw8AAcu3AAMZbmJPAAMZcwACR6sAAxl2XNsAAxluYkcAAxl+CiMAAxl9WwADGX8AAbXLAAMZbmJfAAMZjAMAAxMPAAHLvwADGZZiTwADGZsAAkerAAMZnwABRicAAxmWYlMAAxmmIt8AAxmmB98AAxmWYkcAAxmyHCsAAxmyWVMAAxmzAAJHqwADGb8AAcvrAAMZlmJfAAMZxAMAAxnHAAHLwwADEw8AAcwDAAMZ0mJPAAMZ1wACR6sAAxnbAAHMBwADGdJiRwADGeIi4wADGeLQvwADGdJiXwADGewDAAMZ7wABy8MAAxMPAAHMCwADGfpiTwADGf8AAkerAAMaAwABzA8AAxoDAAHMEwADGgMAAcwbAAMaAwABzB8AAxoDAAHMIwADGgMAAY1rAAMaAwABzCcAAxn6YkcAAxojAAJHqwADGicAAcwrAAMaJwABzC8AAxonAAHMMwADGiMAAcw3AAMaIlUTAAMaIwABzEMAAxojAAHMVwADGfpiXwADGkQDAAMTDwABzFsAAxpOYk8AAxpTAAHMXwADGk5iRwADGlsAAcw3AAMaTmJfAAMaYAMAAxMPAAHMYwADGmpiRwADGm1bAAMabgojAAMabwABtcsAAxpvAAJHqwADGn7NuwADGmpiXwADGoQDAAMTDwABzGcAAxqOYk8AAxqTAAJHqwADGpZc2wADGpcAAUYnAAMajmJHAAMaowACR6sAAxqmzbsAAxqOYl8AAxqsAwADEw8AAcxrAAMatmJPAAMauwACR6sAAxq+XNsAAxq/AAFGJwADGrZiRwADGssAAkerAAMazs27AAMatmJfAAMa1AMAAxMPAAHMbwADGt5iRwADGuIi4wADGuLQvwADGt5iXwADGuwDAAMTDwABzHMAAxr2Yk8AAxr7AAJHqwADGv8AAcwbAAMa/wABzB8AAxr/AAHMdwADGv8AAcx7AAMa/wABWfcAAxr/AAHMfwADGv8AAcyDAAMa/wABzIcAAxr/AAHMiwADGv8AAcyPAAMa/wABjWsAAxr2YkcAAxsvAAJHqwADGzMAAcyTAAMbMwABzDMAAxszAAHMLwADGzMAAcyXAAMbMwABzJ8AAxszAAHMowADGzMAAczDAAMbMwABzM8AAxszAAHL6wADGy4cKwADGy4KIwADGy8AAcyvAAMa9mJfAAMbZAMAAxMPAAHM3wADG25iTwADG3MAAkerAAMbdlzbAAMbdwABzOMAAxtuYkcAAxuBWwADG4IKIwADG4MAAbXLAAMbbmJfAAMbkAMAAxMPAAHM5wADG5piTwADG58AAkerAAMbolkLAAMbmmJbAAMbqwABzOsAAxuqWKMAAxuaYkcAAxu3AAG1ywADG5piXwADG7wDAAMTDwABzO8AAxvGYkcAAxvJWwADG8oKIwADG8sAAbXLAAMbxmJfAAMb2AMAAxMPAAHM8wADG+JiTwADG+cAAkerAAMb6lzbAAMb4mJHAAMb8VsAAxvyCiMAAxviYl8AAxv8AwADEw8AAcz3AAMcBmJPAAMcCwACR6sAAxwPAAHM+wADHA5pOwADHA5ggwADHA8AAcz/AAMcBmJHAAMcIVsAAxwjAAJHqwADHCsAAc0LAAMcIgojAAMcBmJfAAMcNAMAAxMOz1MAAxw+Yk8AAxxDAAJHqwADHEZZCwADHD5iWwADHE8AAczrAAMcPmJHAAMcVVsAAxxWCiMAAxw+Yl8AAxxgAwADEw8AAc0PAAMcamJPAAMcbwACR6sAAxxyaTsAAxxzAAHNEwADHGpiRwADHH1bAAMcfgojAAMcamJfAAMciAMAAxMPAAHNFwADHJJiTwADHJcAAkerAAMcmwABzRsAAxybAAHNHwADHJJiRwADHKVbAAMcpnA7AAMcpgojAAMckmJfAAMctAMAAxMPAAHNIwADHL5iRwADHMJVEwADHMIcKwADHMMAAc0nAAMcvmJTAAMc0iLfAAMc0gffAAMc0wABzSsAAxy+Yl8AAxzgAwADEw8AAc0vAAMc6mJPAAMc7wACR6sAAxzzAAHF2wADHPMAAc0zAAMc6mJTAAMc/iLfAAMc/gffAAMc6mJfAAMdCAMAAxMPAAHNNwADHRJiTwADHRcAAkerAAMdGwABzTsAAx0SYlMAAx0iIt8AAx0iB98AAx0jAAHNKwADHRJiXwADHTADAAMTDwABzUMAAx06YkcAAx0/AAG+bwADHT4i4wADHT8AAc0nAAMdPtC/AAMdPnnDAAMdPljLAAMdOmJfAAMdWAMAAxMPAAHNSwADHWJiTwADHWcAAkerAAMdawABxdsAAx1rAAHNMwADHWJiRwADHXYi4wADHXbQvwADHWJiXwADHYADAAMTDi2XAAMdimJPAAMdjwACR6sAAx2TAAHNTwADHYpiUwADHZoi3wADHZoH3wADHZoC9wADHYpiRwADHasAAc2jAAMdqwABzasAAx2KYl8AAx20AwADEw8AAc2vAAMdvmJPAAMdwwACR6sAAx3EowADHcMAAc2zAAMdwwABzbcAAx3DAAHNuwADHcMAAc2/AAMdwnh/AAMdwwABzcMAAx3DAAHNxwADHcJYgwADHb5iRwADHeyPAAMdvmJfAAMd9wACR6sAAx36AtcAAx30AwADEw8AAc3PAAMeBmJPAAMeCgb/AAMeBmJHAAMeEiLjAAMeEwACR6sAAx4bAAG41wADHhLQvwADHgZiXwADHiQDAAMTDwABzeMAAx4uYk8AAx4zAAJHqwADHjcAASefAAMeNlzbAAMeLmJHAAMeQwABtcsAAx5CCiMAAx4uYl8AAx5MAwADEw8AAc3nAAMeVmJPAAMeWwABzesAAx5bAAFLtwADHlsAAc3vAAMeVmJHAAMeaI8AAx5WYl8AAx5wAwADEw8AAc3/AAMeemJHAAMefI8AAx56Yl8AAx6EAwADEw8AAc4HAAMejmJPAAMekwACR6sAAx6XAAHH/wADHpcAAc4LAAMejmJHAAMeohwrAAMeolUTAAMejmJTAAMeriLfAAMergffAAMejmJfAAMeuAMAAx67AAHOEwADEw4inwADHsZiTwADHsqgxwADHssAAkerAAMe0wABzgsAAx7GYkcAAx7aIuMAAx7a0L8AAx7aecMAAx7bAAHNJwADHsZiXwADHuwDAAMe7wABzhcAAxMPAAHOGwADHvpiTwADHv8AAkerAAMfAwABzh8AAx8DAAHOJwADHwMAAc4LAAMfAwABzisAAx7/AAHOIwADHvpiRwADHxsAAkerAAMfHwABzjMAAx8aIuMAAx8a0L8AAx8aecMAAx76Yl8AAx8wAwADEw8AAc4/AAMfOmJPAAMfPwACR6sAAx9DAAHOJwADH0MAAc4LAAMfQlzbAAMfQwABzkMAAx86YkcAAx9VWwADH1YKIwADHzpiXwADH2ADAAMTDwABzk8AAx9qYk8AAx9vAAJHqwADH3Jc2wADH3MAAc4nAAMfcwABzgsAAx9zAAHOKwADH3MAAc5DAAMfamJHAAMfiwACR6sAAx+PAAHLawADH4lbAAMfigojAAMfamJfAAMfnAMAAxMPAAHOUwADH6ZiTwADH6sAAkerAAMfrwABx/8AAx+mYkcAAx+2IuMAAx+20L8AAx+2ecMAAx+mYl8AAx/EAwADEw8AAc5XAAMfzmJPAAMf0wABzlsAAx/TAAHOXwADH9MAAc5jAAMf0wABzmcAAx/TAAHOawADH9KG2wADH9MAAc5vAAMf0wABznMAAx/TAAHOdwADH9MAAc57AAMf0wABzn8AAx/TAAHOgwADH9MAAc6HAAMf0wABzosAAx/TAAJHqwADIA8AAc6PAAMgDwABzgsAAx/OYlMAAyAbAAJHqwADIB8AAc6TAAMfzmJHAAMgJgbnAAMgJwABzpsAAyAmEEcAAyAnAAHOnwADICZYXwADICcAAc6jAAMgJwACR6sAAyBDAAHOpwADIEMAAc6rAAMgJwABzq8AAyAnAAHOswADICYg+wADICcAAc67AAMfzmJfAAMgXAMAAxMPAAHOzwADIGZiTwADIGsAAkerAAMgbg9nAAMgZmJHAAMgdmYvAAMgdiD7AAMgdwABzrsAAyBmYl8AAyCEAwADEw8AAc7XAAMgjmJPAAMgkwACR6sAAyCWXNsAAyCOYkcAAyCe6ecAAyCeELMAAyCfAAHOnwADIJ4G5wADIJ8AAc6bAAMgnhBHAAMgjmJTAAMguwACR6sAAyC/AAHOkwADII5iXwADIMQDAAMTDwABztsAAyDOYl8AAyDQAwADIM5iTwADINsAAkerAAMg3g9nAAMgzmJHAAMg5mYvAAMg5iD7AAMg5wABzrsAAxMPAAHO3wADIPZiTwADIPsAAkerAAMg/wABzicAAyD2YkcAAyEGZi8AAyD2Yl8AAyEMAwADEw8AAc7jAAMhFmJPAAMhGwABzi8AAyEbAAHONwADIRoKLwADIRifAAMhFmJHAAMhLunnAAMhLhEHAAMhLwABzp8AAyEvAAHO5wADIS4G5wADIS8AAc6bAAMhLhBHAAMhLwABzu8AAyEvAAHO6wADIS4bpwADIRZiUwADIVsAAkerAAMhXwABzpMAAyEWYl8AAyFkAwADEw8AAc7zAAMhbmJfAAMhcAMAAyFuYk8AAyF7AAJHqwADIX4PZwADIW5iRwADIYZmLwADIYYg+wADIYcAAc67AAMTDwABzvcAAyGWYk8AAyGaoMcAAyGWYkcAAyGiZi8AAyGWYl8AAyGoAwADEw8AAc77AAMhsmJPAAMhtwACR6sAAyG7AAHLcwADIbJiUwADIcIC9wADIcIi3wADIcIH3wADIbJiRwADIdJVEwADIdIcKwADIbJiXwADIdwDAAMTDwABzv8AAyHmYl8AAyHoAwADEw8AAc8DAAMh8mJHAAMh9tC/AAMh8mJfAAMh/AMAAxMPAAHPBwADIgZiTwADIgsAAkerAAMiDlzbAAMiBmJHAAMiFgojAAMiFVsAAyIXAAJHqwADIiMAAc8LAAMiIwABzw8AAyIjAAHPEwADIhcAAbXLAAMiBmJfAAMiNAMAAxMPAAHPGwADIj5iRwADIkMAAbXLAAMiPmJfAAMiSAMAAxMMFwADIlJiRwADIlYCmwADIlYi4wADIlbQvwADIlZ5wwADIlJiXwADImgDAAMTDwABzyMAAyJyYk8AAyJ3AAJHqwADInpc2wADInsAAc8nAAMiewABzysAAyJyYkcAAyKLAAG1ywADIooKIwADIosAAkerAAMilwABzy8AAyJyYl8AAyKcAwADEw8AAc8zAAMipmJPAAMiqwACR6sAAyKvAAHNGwADIqZiRwADIrZwOwADIqZiXwADIrwDAAMTDs9XAAMixmJPAAMiywACR6sAAyLOWQsAAyLGYlsAAyLXAAHM6wADItZYowADItcAAc83AAMixmJHAAMi5wABtcsAAyLnAAG5DwADIucAAc5LAAMixmJfAAMi9AMAAxMPAAHPOwADIv5iTwADIwMAAkerAAMjBlkLAAMi/mJbAAMjDwABzzcAAyL+YkcAAyMWCiMAAxMPAAHPPwADIx5iTwADIyMAAkerAAMjJmk7AAMjJlzbAAMjHmJHAAMjMgojAAMjMhBHAAMjMgorAAMjMggLAAMjMn6rAAMjHmJfAAMjSAMAAxMPAAHPQwADI1JiTwADI1cAAkerAAMjWwABz0cAAyNaYIMAAyNbAAHNHwADI1JiRwADI2oKIwADI2oQRwADI2oKKwADI2oICwADI2p+qwADI2sAAkerAAMjgl0XAAMjUmJfAAMjiAMAAxMPAAHPSwADI5JiXwADI5QDAAMTDwABz08AAyOeYkcAAyOjAAG1ywADI6IKIwADI6FbAAMjowABuQ8AAyOjAAHOSwADI55iXwADI7gDAAMTDwABz1MAAyPCYk8AAyPHAAJHqwADI8sAAc9bAAMjwmJHAAMj0gojAAMj0wABtcsAAyPRWwADI9MAAbkPAAMj0wABzksAAyPCYl8AAyPoAwADEw8AAc9fAAMj8mJPAAMj9wACR6sAAyP6aTsAAyPyYkcAAyQCCiMAAyQDAAG5DwADI/JiXwADJAwDAAMTDwABz2MAAyQWYk8AAyQbAAJHqwADJB5c2wADJBZiRwADJCVbAAMkJwABtcsAAyQmCiMAAyQWYl8AAyQ0AwADEw8AAc9nAAMkPmJPAAMkQwACR6sAAyRHAAHM4wADJEZc2wADJD5iRwADJFIKIwADJFFbAAMkUwABtcsAAyQ+Yl8AAyRgAwADEw8AAc9vAAMkamJPAAMkbwACR6sAAyRzAAHM4wADJHMAAc0fAAMkcmCDAAMkamJHAAMkggojAAMkgVsAAySDAAG1ywADJGpiXwADJJADAAMkkwACR6sAAySaAtcAAxMPAAHPdwADJKJiTwADJKcAAkerAAMkqwAByAMAAySiYlMAAySyAvcAAySyIt8AAySyB98AAySiYkcAAyTCHCsAAySiYl8AAyTIAwADEw8AAc97AAMk0mJHAAMk1iLjAAMk1tC/AAMk1nnDAAMk0mJfAAMk5AMAAxMPAAHPjwADJO5iTwADJPMAAkerAAMk9wABzycAAyT3AAHM/wADJPZggwADJPcAAc+TAAMk7mJHAAMlCwACR6sAAyUPAAG5hwADJQ8AAc+LAAMlDwABz38AAyTuYl8AAyUcAwADJR8AAc+XAAMTDwABz6cAAyUqYl8AAyUsAwADJS8AAc+XAAMlKmJHAAMlOwABtcsAAyU6CiMAAyU5WwADJTsAAbkPAAMlOwABzksAAxMPAAHPqwADJVJiTwADJVcAAkerAAMlWlzbAAMlUmJHAAMlYgojAAMlYwABtcsAAyVSYl8AAyVsAwADEw8AAc+3AAMldmJPAAMlewACR6sAAyV/AAHIAwADJXZiRwADJYYi4wADJYbQvwADJYZ5wwADJYcAAc0nAAMlhwACR6sAAyWbAAHPywADJXZiXwADJaADAAMTDwABz88AAyWqYk8AAyWvAAJHqwADJbMAAcgDAAMlswABz1sAAyWzAAHPxwADJbJcGwADJbMAAc/TAAMlswABz9cAAyWzAAHP2wADJapiUwADJdMAAc/fAAMlqmJHAAMl2gojAAMl2hEHAAMl2iLjAAMlqmJfAAMl6AADAAJHrwADJfJiSwADJfcAAdCHAAMl9wAB0IsAAyX3AAHQjwADJfJiTwADJgcAAkevAAMmCwAB0cMAAyYLAAHRxwADJfJiRwADJhcAAkevAAMmGwABfMMAAyYbAAHR0wADJhsAAdHzAAMmGwAB0hsAAyYbAAHSIwADJhsAAdJjAAMmGwAB0msAAyYbAAHScwADJhsAAdJ/AAMmGwAB0ocAAyYbAAHSjwADJhsAAdKXAAMmGwAB0p8AAyYbAAHSpwADJhsAAdKrAAMmGwAB0rMAAyYbAAHSuwADJhsAAdLDAAMmGwAB0ssAAyYbAAHS1wADJhsAAdLjAAMmGwAB0usAAyYXAAEZbwADJhcAAdIzAAMmFlnLAAMmFwAB0kMAAyYXAAHSUwADJhcAAdJ7AAMl8wAB0JMAAyaOYlsAAyaQAwADJo5iUwADJppj7wADJo5iRwADJqMAAdCfAAMl8wAB0KcAAyaqYk8AAyauBdsAAyauB9MAAyavAAHQqwADJq8AAdCvAAMmrwAB0LMAAyavAAHQtwADJq8AAdC7AAMmrwAB0L8AAyavAAHQwwADJq8AAdDHAAMmrwAB0MsAAyaqYkcAAybfAAJHrwADJuMAAdDPAAMm4wAB0NsAAybjAAHQ5wADJt8AAdDjAAMmqmJfAAMm9gXbAAMm9gcXAAMl8wAB0OsAAycCYk8AAycHAAHQ7wADJwJiWwADJwwDAAMnAmJTAAMnFmPvAAMnFwAB0PMAAycCYkcAAycjAAHQnwADJfMAAdD3AAMnKmJPAAMnLgL3AAMnLlpfAAMnKmJHAAMnOwACR68AAyc/AAHQ/wADJypiXwADJ0QDAAMl8wAB0QMAAydOYk8AAydScp8AAydTAAEjDwADJ1MAAkevAAMnXlwbAAMnTmJTAAMnZgJbAAMnTmJXAAMnbgJbAAMnTmJHAAMndwACR68AAyd7AAHQ/wADJ05iXwADJ4ADAAMl8wAB0Q8AAyeKYk8AAyePAAJHrwADJ5JcGwADJ4piUwADJ5oCWwADJ4piVwADJ6ICWwADJ4piRwADJ6sAAkevAAMnrwAB0P8AAyeKYl8AAye0AwADJfMAAdETAAMnvmJPAAMnwwACR68AAyfHAAHRFwADJ75iRwADJ88AAS+rAAMnzwAB0SMAAyfPAAJHrwADJ9sAAdEnAAMn2wAB0SsAAye+Yl8AAyfkAwADJfMAAdE3AAMn7mJPAAMn8wAB0TsAAyfzAAExAwADJ/J4ywADJ+5iRwADKACPAAMn7mJfAAMoCAMAAyXzAAHRRwADKBJiRwADKBcAAdFLAAMoFwAB0VsAAygXAAHRYwADKBJiXwADKCQDAAMl8wAB0WsAAyguYk8AAygzAAJHrwADKDcAARBbAAMoNwABxW8AAyg3AAEQXwADKDZImwADKDLNVwADKC5iRwADKE4KUwADKE8AAQznAAMoTgozAAMoLmJfAAMoXwACR68AAyhiAtcAAyXzAAHRbwADKGpiTwADKG8AAkevAAMoctBnAAMoamJHAAMoewAB0XMAAyh7AAHRewADKHsAAdGDAAMoewAB0YsAAyhqYlMAAyiPAAEjEwADKGpiXwADKJQDAAMl8wAB0Y8AAyieYk8AAyijAAJHrwADKKcAAdGTAAMoptBnAAMonmJHAAMosasAAyizAAHRnwADKLIcYwADKLMAAdGnAAMonmJfAAMoxAMAAyjHAAHRlwADJfMAAdGzAAMo0mJPAAMo1wABDUsAAyjWAvcAAyjXAAJHrwADKOMAAdGTAAMo4wAB0XcAAyjSYkcAAyjvAAJHrwADKPKRWwADKPK0DwADKNJiXwADKP8AAkevAAMpAgLXAAMl8wAB0bcAAykKYk8AAykPAAENSwADKQ4C9wADKQ8AAkevAAMpGwAB0XcAAykakVsAAykbAAHRuwADKRsAAdG/AAMpCmJHAAMpLhxjAAMpCmJXAAMpNwABrt8AAykKYl8AAyk/AAJHrwADKUIC1AMAAkezAAMpSmJPAAMpTwAB07sAAylPAAHTvwADKUpiRwADKVsAAkezAAMpXwAB08MAAylfAAHTywADKV8AAdPTAAMpXwAB09sAAylaz5cAAylLAAHTBwADKXZiWwADKXsAAdMLAAMpewAB0w8AAyl2YkcAAymHAAHTFwADKYcAAXXrAAMphpM7AAMphljPAAMphwAB0zcAAymGWMsAAymHAAHTQwADKYcAAUdfAAMphSMAAyl2YlMAAymvAAHTKwADKa4PBwADKUsAAdNPAAMpumJfAAMpvAMAAylLAAHTUwADKcZiXwADKcgDAAMpSwAB01cAAynSYl8AAynUAwADKUsAAdNbAAMp3mJfAAMp4AMAAylLAAHTXwADKepiXwADKewDAAMpSwAB02MAAyn2Yl8AAyn4AwADKUsAAdNnAAMqAmJfAAMqBAMAAylLAAHTawADKg5iXwADKhADAAMpSwAB028AAyoaYl8AAyocAwADKUsAAdNzAAMqJmJfAAMqKAMAAylLAAHTdwADKjJiXwADKjQDAAMpSwAB03sAAyo+Yl8AAypAAwADKUsAAdN/AAMqSmJfAAMqTAMAAylKr+8AAypWYl8AAypYAwADKUsAAdODAAMqYmJfAAMqZAMAAylLAAHThwADKm5iXwADKnADAAMpSwAB04sAAyp6Yl8AAyp8AwADKUsAAdOPAAMqhmJfAAMqiAMAAylLAAHTkwADKpJiRwADKpcAAdOXAAMqllvbAAMqlwAB06cAAyqVIwADKpJiWwADKqqUXwADKpJiUwADKrIPBwADKrB7AAMpSwAB068AAyq+Yk8AAyrDAAHTswADKr5iXwADKsgDAAMqywAB07QCbz8AAyrWYksAAyrbAAHUCwADKtsAAbqbAAMq2wAB1A8AAyrbAAHUEwADKtZiTwADKu8AAdj3AAMq7m8/AAMq9wAB2PsAAyrudQ8AAyrvAAHHtwADKu8AAboXAAMq1mJHAAMrCm8/AAMrDwAB2P8AAysPAAHZBwADKw8AAdkXAAMrDwAB2S8AAysPAAHZNwADKw8AAdlHAAMrDwAB2VsAAysLAAHZPwADKwpYWwADKwsAAcfDAAMrCsojAAMrCwAB2V8AAysLAAHZawADKwsAAbobAAMq1wABugMAAytKYk8AAytPAAHUFwADK08AAdQbAAMrTwAB1B8AAytPAAHUIwADK08AAdQnAAMrTwAB1CsAAytPAAHULwADK08AAdQzAAMrTwAB1DcAAytObz8AAyt3AAHUOwADK3cAAdQ/AAMrSmJXAAMrgwAB1EMAAytKYlMAAyuLAAHUQwADK0piXwADK5ADAAMq1wAB1EcAAyuaYkcAAyuec68AAyuaYl8AAyukAwADKtcAAce7AAMrrmJPAAMrswAB1FMAAyuzAAHUVwADK7MAAdRbAAMrswAB1F8AAyuzAAHUYwADK7MAAdRnAAMrswAB1GsAAyuuYkcAAyvTAAHUbwADK65iXwADK9gDAAMq1wAB1HcAAyviYl8AAyvkAwADKtcAAdR7AAMr7mJPAAMr8m8/AAMr9wAB1H8AAyvuYlMAAyv9hwADK+5iRwADLAUvAAMsBwAB1IMAAyvuYl8AAywQAwADKtafNwADLBpiTwADLB4C9wADLBpiXwADLCQDAAMq1wABuh8AAywuYk8AAywyB48AAywuYl8AAyw4AwADKtcAAdSLAAMsQmJPAAMsRwAB1I8AAyxHAAHUkwADLEcAAdSXAAMsRwAB1JsAAyxHAAHUnwADLEcAAdSjAAMsRwAB1KcAAyxHAAHUqwADLEcAAdSvAAMsRwAB1LMAAyxHAAHUtwADLEcAAdS7AAMsRwAB1L8AAyxHAAHUwwADLEcAAdTHAAMsRnrXAAMsRwAB1MsAAyxHAAHUzwADLEcAAdTTAAMsRwAB1NcAAyxHAAHU2wADLEcAAdTfAAMsRwAB1OMAAyxHAAHU5wADLEcAAdTrAAMsRwAB1O8AAyxGcYcAAyxHAAHU8wADLEcAAdT3AAMsRwAB1PsAAyxHAAHU/wADLEcAAdUDAAMsRwAB1QcAAyxHAAHVCwADLEcAAdUPAAMsRwAB1RMAAyxHAAHVFwADLEcAAdUbAAMsRwAB1R8AAyxHAAHVIwADLEcAAdUnAAMsRwAB1SsAAyxHAAHVLwADLEcAAdUzAAMsRwAB1TcAAyxHAAHVOwADLEcAAdU/AAMsRwAB1UMAAyxHAAHVRwADLEcAAdVLAAMsRwAB1U8AAyxHAAHVUwADLEcAAdVXAAMsRwAB1VsAAyxHAAHVXwADLEcAAdVjAAMsRwAB1WcAAyxHAAHVawADLEcAAdVvAAMsRwAB1XMAAyxHAAHVdwADLEcAAdV7AAMsRwAB1X8AAyxGdGcAAyxHAAHVhwADLEcAAdWPAAMsRwAB1ZcAAyxHAAHVnwADLEcAAdWnAAMsRwAB1a8AAyxHAAHVtwADLEcAAdW/AAMsRwAB1ccAAyxHAAHVzwADLEcAAdXXAAMsRwAB1d8AAyxHAAHV5wADLEcAAdXvAAMsRwAB1fcAAyxHAAHV/wADLEcAAdYHAAMsRwAB1g8AAyxHAAHWFwADLEcAAdYfAAMsRwAB1icAAyxHAAHWLwADLEcAAdY3AAMsRwAB1j8AAyxHAAHWRwADLEcAAdZPAAMsRwAB1lcAAyxHAAHWXwADLEcAAdZnAAMsRwAB1m8AAyxHAAHWdwADLEcAAdZ/AAMsRwAB1ocAAyxHAAHWjwADLEcAAdaXAAMsRwAB1p8AAyxHAAHWpwADLEcAAdavAAMsRwAB1rcAAyxHAAHWvwADLEcAAdbHAAMsRwAB1s8AAyxCYl8AAy3wAwADKtcAAboHAAMt+mJPAAMt/m8/AAMuAuWDAAMt+mJTAAMuCwABu2cAAy36YkcAAy4SB+cAAy4SWMsAAy36Yl8AAy4cAwADKtcAAdbXAAMuJmJPAAMuKm8/AAMuLuWDAAMuLwABvSsAAy4vAAHA5wADLi8AAcDrAAMuJmJHAAMuQnE3AAMuQwABu4cAAy5CB68AAy5CDicAAy5Cbz8AAy5XAAG/ywADLkIH7wADLkIIEwADLkMAAb6fAAMuJmJTAAMuawABu0MAAy4mYl8AAy5wAwADKtcAAboLAAMuemJPAAMufm8/AAMuguWDAAMuemJHAAMuiljLAAMuinnDAAMuemJfAAMulAMAAyrXAAHHvwADLp5iTwADLqJvPwADLqblgwADLp5iRwADLq4i4wADLq55wwADLq5YywADLp5iXwADLrwDAAMq1wAB1tsAAy7GYlMAAy7Kbz8AAy7O5YMAAy7JcwADLsmHAAMuygVXAAMuyg7LAAMuygxnAAMuygejAAMuygMPAAMuxmJHAAMu8linAAMu8lj7AAMu8ljPAAMu8gxfAAMu8ljnAAMu8I8AAy7GYl8AAy8MAwADKtcAAdbfAAMvFmJPAAMvGm8/AAMvHuWDAAMvFmJHAAMvJXcAAy8WYlMAAy8tewADLxZiXwADLzQDAAMq1wAB1uMAAy8+Yk8AAy9Cbz8AAy9G5YMAAy8+YlsAAy9MAwADLz5iRwADL1ZYywADLz5iXwADL15vPwADL2IC1wADKtcAAdbnAAMvamJfAAMvbAMAAyrXAAHW6wADL3ZiXwADL3gDAAMvdmJTAAMvgXMAAy+CBVcAAy+CDssAAy+CDGcAAy+CB6MAAy+CAw8AAy+CYgsAAy92YkcAAy+iWM8AAy+iWN8AAy+iD+MAAy+iDF8AAy+iWMMAAy+iB1MAAy+iWNMAAy+iWOcAAy+iWPMAAy+hYwADL6IGlwADL6JZAwADL6ICrwADL6ISJwADL6JY6wADL6INZwADL6JYpwADL6JY9wADL6JY+wADL6JY/wADL6ICtwADL6JUTwADL6FbAAMvogKXAAMvohFnAAMvonrTAAMwCn6vAAMwCn6zAAMwCn6/AAMvolvjAAMvolvvAAMvogkLAAMvoljLAAMvohhHAAMvogK7AAMvon7DAAMvonGLAAMvoZMAAy+iBWMAAy+iftsAAy+ift8AAy+ibqcAAy+iDXsAAy+ifvMAAy+iAu8AAy+ifwcAAy+iWWsAAy+ifwsAAy+ieysAAy+ifw8AAy+ifxMAAy+ifxsAAy+gjwADL3ZiVwADMHoMZwADMHoHowADKtcAAdbvAAMwhmJTAAMwim8/AAMwjuWDAAMwhmJHAAMwlS8AAzCWAv8AAzCVWwADMJYClwADMJYCuwADMJZ+wwADMJZ7KwADMJZ/EwADMJZ/GwADMJYRZwADMJZ/DwADMJYYRwADMJZb4wADMJZb7wADMJZ+2wADMJYNewADMJZ+3wADMJZupwADMJZ+8wADMIZiVwADMOWHAAMwhmJfAAMw7AMAAyrXAAHW9wADMPZiTwADMPpvPwADMP7lgwADMPZiRwADMQZYywADMPZiXwADMQwDAAMq1wAB1vsAAzEWYk8AAzEabz8AAzEe5YMAAzEezbcAAzEWYkcAAzEqbz8AAzEvAAHW/wADMS8AAdcDAAMxLr4DAAMxKljLAAMxKVsAAzEqApcAAzEqEWcAAzEqW98AAzEqW+sAAzEqW+MAAzEqW+8AAzEqEAsAAzEqW/cAAzEqW/sAAzEqW/MAAzEqCQsAAzEqVE8AAzEqW9sAAzEWYl8AAzF4AwADKtcAAdcPAAMxgmJPAAMxhm8/AAMxiuWDAAMxgmJHAAMxkljLAAMxkwABC68AAzGSHQcAAzGRLwADMZIC/wADMZJkVwADMZIClwADMZIRZwADMZIJCwADMZIP4wADMZKsmwADMZMAAQvDAAMxkwABC7cAAzGSW+MAAzGCYlMAAzHODYsAAzHMpwADMc2HAAMxzgVXAAMxzg7LAAMxzg9DAAMxgmJfAAMx6AMAAyrXAAHXGwADMfJiTwADMfZvPwADMfrlgwADMfJiRwADMgJYywADMgJ8QwADMgIYRwADMgFbAAMyAwABrQ8AAzICEIsAAzICEWcAAzICApcAAzICW+MAAzICW+8AAzICCQsAAzHyYl8AAzIwAwADKtcAAdcfAAMyOmJTAAMyPYcAAzI6Yl8AAzJEAwADKtcAAdcjAAMyTmJTAAMyUYcAAzJRcwADMlIFVwADMlIMZwADMlIHowADMlIDDwADMk5iRwADMm5YzwADMm4P4wADMm4MXwADMm5YwwADMm4HUwADMm5Y0wADMm5Y5wADMm5Y8wADMm1jAAMybgaXAAMybgKvAAMybljrAAMybg1nAAMyblinAAMyblj3AAMyblj7AAMyblj/AAMybgK3AAMyblRPAAMyTmJfAAMyvAMAAyrXAAHXJwADMsZiTwADMspvPwADMs8AAa1XAAMyzpFbAAMyzwAB1ysAAzLGYlMAAzLebz8AAzLjAAHXLwADMuMAASVDAAMy3YcAAzLGYkcAAzLyWM8AAzLyWKcAAzLyWPsAAzLyArcAAzLGYl8AAzMEAwADKtcAAdc7AAMzDmJPAAMzEm8/AAMzFwABrVcAAzMWc8MAAzMWXFsAAzMWItcAAzMOYlMAAzMpewADMw5iRwADMzF3AAMzDmJfAAMzOAMAAyrXAAHXPwADM0JiTwADM0ZvPwADM0sAAa1XAAMzSwAB10MAAzNCYlsAAzNUAwADM0JiUwADM11zAAMzXYcAAzNeBVcAAzNeDGcAAzNeB6MAAzNeAw8AAzNCYkcAAzN6WM8AAzNCYl8AAzOCbz8AAzOGAtcAAyrXAAHXRwADM45iXwADM5ADAAMq1wAB10sAAzOaYk8AAzOebz8AAzOiItcAAzOjAAHARwADM6MAAddDAAMzmmJHAAMzsXcAAzOaYlMAAzO5ewADM5piXwADM8ADAAMq1wAB108AAzPKYk8AAzPObz8AAzPS5YMAAzPTAAHXQwADM8piUwADM92HAAMzymJHAAMz5ljPAAMzymJfAAMz7AMAAyrXAAHXUwADM/ZiTwADM/pvPwADM/8AAa1XAAMz/wAB10MAAzP2YlMAAzQJcwADM/ZiRwADNBICrwADM/ZiXwADNBgDAAMq1wAB11cAAzQiYk8AAzQmbz8AAzQrAAHARwADNCsAAddDAAM0ImJHAAM0NXcAAzQiYlMAAzQ9ewADNCJiXwADNEQDAAMq1wAB11sAAzROYk8AAzRSbz8AAzRXAAGtVwADNFcAAddDAAM0TmJTAAM0YXMAAzROYl8AAzRoAwADKtcAAddfAAM0cmJPAAM0dm8/AAM0ewABwEcAAzR7AAHXQwADNHsAAddjAAM0eiLXAAM0cmJTAAM0jXsAAzRyYkcAAzSVdwADNHJiXwADNJwDAAMq1wAB12cAAzSmYk8AAzSqbz8AAzSvAAGtVwADNK8AAddrAAM0pmJbAAM0uAMAAzSmYlMAAzTBcwADNKZiXwADNMpvPwADNM4C1wADKtcAAddzAAM01mJTAAM02YcAAzTWYl8AAzTgAwADKtcAAdd7AAM06mJPAAM07m8/AAM08wABwEcAAzTyXFcAAzTqYkcAAzT9dwADNOpiUwADNQV7AAM06mJfAAM1DAMAAyrXAAHXfwADNRZiTwADNRpvPwADNR8AAa1XAAM1HwAB10MAAzUWYlMAAzUpcwADNRZiXwADNTADAAMq1wAB14MAAzU6Yk8AAzU+bz8AAzVDAAHARwADNUMAAddDAAM1QwAB14cAAzU6YkcAAzVRdwADNTpiUwADNVl7AAM1OmJfAAM1YAMAAyrXAAHXiwADNWpiTwADNW5vPwADNXMAAa1XAAM1cwAB148AAzVqYlsAAzV8AwADNWpiRwADNYZYpwADNWpiUwADNY1zAAM1amJfAAM1lm8/AAM1mgLXAAMq1wAB15MAAzWiYlsAAzWkAwADNaJiUwADNa2HAAM1omJHAAM1tlinAAM1omJfAAM1vm8/AAM1wgLXAAMq1wAB15cAAzXKYk8AAzXObz8AAzXTAAHARwADNdMAAdePAAM1ymJHAAM13XcAAzXKYlMAAzXlewADNcpiXwADNewDAAMq1wAB15sAAzX2Yk8AAzX6bz8AAzX/AAGtVwADNf8AAddDAAM19mJTAAM2CXMAAzX2Yl8AAzYQAwADKtcAAdefAAM2GmJPAAM2Hm8/AAM2IwABwEcAAzYjAAHXQwADNiMAAdejAAM2GmJHAAM2MXcAAzYaYlMAAzY5ewADNhpiXwADNkADAAMq1wAB16cAAzZKYlMAAzZNcwADNk4FVwADNk2HAAM2TgxnAAM2TgejAAM2TgMPAAM2SmJHAAM2ag/jAAM2aljPAAM2agxfAAM2aljDAAM2agdTAAM2aljTAAM2aljnAAM2aljzAAM2aWMAAzZqBpcAAzZqAq8AAzZqWOsAAzZqDWcAAzZqWKcAAzZqWPcAAzZqWPsAAzZqWP8AAzZqArcAAzZqVE8AAzZKYl8AAza4AwADKtcAAboPAAM2wmJHAAM2xXcAAzbCYlMAAzbNewADNsJiXwADNtQDAAMq1wAB16sAAzbeYk8AAzbibz8AAzbnAAHF2wADNucAAc0zAAM23mJbAAM28wAB168AAzbeYlMAAzb5cwADNvmHAAM2+gVXAAM2+g7LAAM2+gxnAAM2+gejAAM23mJHAAM3FgxfAAM23mJfAAM3HAMAAyrXAAHXswADNyZiRwADNypYpwADNypY+wADNypYzwADNyZiUwADNzoMZwADNzoHowADNyZiXwADN0QDAAMq1wAB17cAAzdOYk8AAzdSbz8AAzdXAAGQtwADN1cAAde7AAM3TmJHAAM3YXcAAzdOYlMAAzdpewADN05iXwADN3ADAAMq1wAB178AAzd6Yk8AAzd+bz8AAzeC5YMAAzd6YlMAAzeJcwADN3piXwADN5ADAAMq1wAB18MAAzeaYk8AAzeebz8AAzei5YMAAzeaYkcAAzepdwADN5piUwADN7F7AAM3mmJfAAM3uAMAAyrXAAG6EwADN8JiRwADN8cAAdfHAAM3xwAB18sAAzfHAAHXzwADN8JiXwADN9QDAAMq1wAB19MAAzfeYlcAAzfhhwADN95iRwADN+lbAAM36nsrAAM36n8TAAM36gKXAAM36hFnAAM36lvjAAM36lvvAAM36gkLAAM36n8PAAM36hhHAAM36n7fAAM36n7zAAM33mJfAAM4HAMAAyrXAAHX4wADOCZiRwADOCoC/wADOCp/GwADOClbAAM4KnsrAAM4Kn8TAAM4KgKXAAM4KhFnAAM4KlvjAAM4KlvvAAM4KgK7AAM4Kn7DAAM4KgkLAAM4Kn8PAAM4KhhHAAM4Kg17AAM4Kn7fAAM4Kn7zAAM4Km6nAAM4JmJXAAM4dYcAAzh2DGcAAzh2B6MAAzgmYl8AAziEAwADKtcAAdf7AAM4jmJfAAM4kAMAAziOYlcAAziZhwADOI5iRwADOKFbAAM4onsrAAM4on8TAAM4ogKXAAM4ohFnAAM4olvjAAM4olvvAAM4ogkLAAM4on8PAAM4ohhHAAM4on7fAAM4on7zAAMq1wAB1/8AAzjWYl8AAzjYAwADONZiRwADOOIC/wADOOJ/GwADOOFbAAM44nsrAAM44n8TAAM44gKXAAM44hFnAAM44lvjAAM44lvvAAM44gK7AAM44n7DAAM44gkLAAM44n8PAAM44hhHAAM44g17AAM44n7fAAM44n7zAAM44m6nAAM41mJXAAM5LYcAAzkuDGcAAzkuB6MAAyrXAAHYAwADOT5iTwADOUJvPwADOUcAAdgHAAM5PmJTAAM5TYcAAzk+YkcAAzlWWM8AAzk+Yl8AAzlcAwADKtcAAdgLAAM5ZmJPAAM5am8/AAM5bwABK2MAAzlmYkcAAzl1LwADOXcAAQuvAAM5dh0HAAM5dg/jAAM5ZmJTAAM5iYcAAzmIpwADOYoNiwADOYoFVwADOYoOywADOWZiXwADOaADAAMq1wAB2A8AAzmqYk8AAzmubz8AAzmy5YMAAzmqYlMAAzm5hwADOapiRwADOcJYzwADOapiXwADOcgDAAMq1wAB2BMAAznSYkcAAznVWwADOdcAAWpPAAM51YcAAznWEWcAAznSYl8AAznoAwADKtcAAdgnAAM58mJHAAM59VsAAzn1hwADOfYRZwADOfJiXwADOgQDAAMq1wAB2DcAAzoOYk8AAzoSbz8AAzoXAAHYOwADOg5iRwADOh4CuwADOh8AAdg/AAM6Hm8/AAM6KwAB2EcAAzorAAHYSwADOisAAdhTAAM6DmJfAAM6OAMAAyrWby8AAzpCYk8AAzpGbz8AAzpIowADOkcAAdifAAM6RwAB2KcAAzpHAAGFWwADOkcAAdizAAM6RwAB2LsAAzpHAAHYywADOkJiRwADOmkjAAM6aI8AAzpqZFMAAzprAAHY1wADOmsAAdjjAAM6awAB2OcAAzpCYlMAAzqGDwcAAzpCYl8AAzqMAwADOo8AAdjPAAM6jsqXAAMq1wABxdcAAzqeYk8AAzqiDGcAAzqiB6MAAzqhhwADOp5iUwADOrIFVwADOrFzAAM6nmJHAAM6vVsAAzq/AAGtDwADOr4RZwADOp5iXwADOswDAAMq1wABxfsAAzrWYk8AAzrabz8AAzrfAAG7fwADOt8AAbuDAAM63lxTAAM61mJHAAM67wABxf8AAzrWYl8AAzr0AwADKtcAAcXzAAM6/mJPAAM7AXsAAzsCbz8AAzsKXFMAAzr+YkcAAzsRdwADOv5iXwADOxgAAwACR7cAAzsiYksAAzsnAAHZhwADOycAAdmLAAM7JwAB2Y8AAzsnAAHZkwADOyJiTwADOzsAAke3AAM7PwAB3CMAAzsiYkcAAztHAAJHtwADO0sAAdwnAAM7SwAB3CsAAztLAAHcLwADO0sAAdwzAAM7SwAB3DcAAztLAAHcOwADO0sAAdw/AAM7SwAB3EsAAzsjAAHZlwADO25iWwADO3ADAAM7bmJHAAM7eSMAAzt7AAJHtwADO4LwlwADO4MAAdmfAAM7bmJTAAM7jg8HAAM7IwAB2asAAzuWYk8AAzubAAJHtwADO58AAdmvAAM7nwABu/sAAzuWYlMAAzurAAHRVwADO5ZiRwADO7IH5wADO7IKIwADO5ZiXwADO7wDAAM7vwAB2bMAAzsjAAHZtwADO8piTwADO88AAke3AAM70wAB2bsAAzvKYlsAAzvYAwADO8piRwADO+IKIwADO+EjAAM74wACR7cAAzvvAAHZywADO+8AAdnHAAM77wAB2dcAAzvvAAHZ2wADO+8AAdnDAAM77wAB2eMAAzvKYlMAAzwLAAHRVwADPAoPBwADO8piVwADPBVXAAM7IwAB2esAAzweYlsAAzwjAAJHtwADPCcAAdnvAAM8HmJHAAM8LoYLAAM8LSMAAzwvAAJHtwADPDsAAdnLAAM8OwAB2Z8AAzw7AAHZ8wADPB5iUwADPEoPBwADOyMAAdoDAAM8UmJbAAM8VAMAAzxSYkcAAzxfAAHaCwADPF8AAke3AAM8ZwAB2g8AAzsjAAHaFwADPG5iTwADPHMAAke3AAM8dlxTAAM8dwAB2hsAAzxuYlMAAzyCBVcAAzyCDGcAAzxuYkcAAzyOZfsAAzyNWwADPI58QwADPI4RZwADPI8AAke3AAM8owABw8cAAzyjAAGsrwADPKMAAayzAAM8owAB2isAAzyiaW8AAzyjAAHaNwADPKMAAdo7AAM8opwbAAM8owAB2j8AAzyjAAHaQwADPG5iXwADPMwDAAM7IwAB2kcAAzzWYk8AAzzbAAJHtwADPN8AAdpLAAM83wAB2k8AAzzfAAHaUwADPN8AAdpXAAM83wAB2lsAAzzfAAHaXwADPN8AAdpjAAM83wAB2mcAAzzfAAHaawADPN8AAdpvAAM83wAB2nMAAzzfAAHadwADPN5pOwADPN8AAdp7AAM83wAB2n8AAzzfAAHagwADPN8AAdojAAM83wABxhcAAzzfAAHahwADPNZiRwADPS8AAke3AAM9MwAB2osAAz0zAAHBpwADPTMAAdonAAM9MwAB2p8AAz0zAAHalwADPTMAAdqjAAM9MwAB2qcAAz0zAAHarwADPTMAAdqzAAM9MwAB2rsAAz0zAAHZ2wADPTMAAdrLAAM9MwAB2s8AAz0zAAHa0wADPTMAAdrXAAM9MwABu18AAz0ucTcAAzzWYlsAAz14AwADPXsAAb5TAAM81mJTAAM9hwACR7cAAz2LAAHamwADPYYifwADPYcAAcGjAAM81mJfAAM9mwACR7cAAz2eGVcAAzsjAAHa2wADPaZiTwADPaiLAAM9pmJHAAM9sI8AAz2mYl8AAz24AwADOyAzAAM9wmJPAAM9xwACR7cAAz3LAAHa4wADPcsAAdrnAAM9ywAB2usAAz3LAAHa7wADPcsAAdrzAAM9ywAB2vcAAz3LAAHa+wADPcsAAdr/AAM9ywAB2wMAAz3LAAHbBwADPcsAAdsLAAM9xwABvYMAAz3HAAHbDwADPccAAdFnAAM9xwAB2xMAAz3HAAHbFwADPcJiRwADPg8AAke3AAM+EwAB2xsAAz4TAAHbHwADPhMAAds3AAM+EwAB208AAz4TAAHbVwADPhMAAdtfAAM+EwAB22cAAz4TAAHbbwADPhMAAdt3AAM+EwAB23sAAz4TAAHbzwADPg8AAduXAAM+DwAB258AAz4PAAHbpwADPg4H7wADPg4IEwADPg8AAdvTAAM+DwAB29sAAz4PAAHb3wADPg8AAX7XAAM+DwABI8MAAz4PAAHb5wADPg8AAdvrAAM9wmJTAAM+co7PAAM+cXsAAz5x5wADPnHjAAM+ciJLAAM9wmJfAAM+iAMAAzsjAAHQbwADPpJiRwADPpaGCwADPpUjAAM+kmJTAAM+og8HAAM+kmJfAAM+qAMAAzsjAAHb+wADPrJiWwADPrQDAAM+twAB2bMAAz6yYkcAAz7CB+cAAz7CCiMAAz6yYlMAAz7PAAHRVwADOyMAAdBzAAM+1mJbAAM+2AMAAz7WYlcAAz7hVwADPtZiRwADPuoKIwADPtZiUwADPvMAAdFXAAM7IwAB3AcAAz76Yk8AAz7/AAJHtwADPwMAAdwLAAM+/hj/AAM++mJHAAM/DI8AAz76YlMAAz8Wbv8AAz8bAAHBtwADPvpiVwADPyJu/wADPycAAcG3AAM++mJfAAM/LAMAAzsjAAHcDwADPzZiWwADPzsAAdwXAAM/NmJHAAM/QwAB2gsAAzsjAAHcHwADP0piWwADP0wAAwACR7sAAz9WYk8AAz9aDTcAAz9bAAHdNwADP1sAAd0/AAM/WwAB3UcAAz9bAAHdTwADP1sAAd1XAAM/WwAB3V8AAz9bAAHdZwADP1ZiRwADP38AAke7AAM/gwAB3W8AAz+DAAHddwADP4MAAd1/AAM/gwAB3YMAAz+DAAHdiwADP4MAAd2TAAM/gwAB3ZsAAz+DAAHdowADP4MAAd2rAAM/gwAB3bMAAz+DAAHduwADP4MAAd3DAAM/gwABfMMAAz+DAAHd+wADP35ynwADP38AASMPAAM/fwAB3c8AAz9/AAHd1wADP38AAd3bAAM/fwAB3eMAAz9/AAHd5wADP38AAd3rAAM/fwAB3e8AAz9/AAHd8wADP38AAd33AAM/fvNXAAM/flnLAAM/VwAB3GMAAz/yYk8AAz/3AAJHuwADP/sAAY1rAAM/+wAB3GcAAz/7AAHcawADP/sAAdxvAAM/+wAB3HMAAz/7AAHcdwADP/sAAdx/AAM/8mJHAANAGwACR7sAA0AfAAHchwADQB8AAdyfAANAHwAB3KcAA0AfAAHcrwADQBp+zwADQBsAAdyXAANAGwAB3JsAAz/yYl8AA0A/AAJHuwADQEMAAdyDAAM/VwAB3LMAA0BKYk8AA0BPAAJHuwADQFMAAdxvAANAUwAB3HMAA0BKYkcAA0BfAAJHuwADQGMAAdy3AANAXn7PAANAXwAB3JcAA0BfAAHcmwADQEpiXwADQHQDAAM/VwAB3MMAA0B+YkcAA0CCHF8AA0CCHGMAA0CCHHsAA0CDAAHcxwADQH5iXwADQJQDAAM/VwAB3MsAA0CeYk8AA0CiDe8AA0Ci77sAA0CeYkcAA0CsjwADQK0jAANArZMAA0CuBjcAA0CuDiMAA0CvAAHc1wADQK8AAdzbAANAnmJTAANAzg8HAANAzwABIM8AA0CeYl8AA0DYAwADP1cAAaIzAANA4mJbAANA5AMAA0DnAAHc3wADQOJiRwADQPJ+zwADQPMAAdyXAANA8wAB3JsAAz9XAAHc4wADQQJiUwADQQYWvwADQQafXwADQQYG0wADQQcAAdznAANBBhbHAANBBwAB3OsAA0EGDwcAA0EHAAHdDwADQQcAAd0TAANBBwAB3RcAA0EHAAHdGwADQQJiRwADQTSPAANBNSMAA0E2W/cAA0E21jcAA0E3AAHc/wADQTcAAd0DAANBNwAB3QsAA0ECYl8AA0FUAwADP1cAAd0fAANBXmJPAANBYha/AANBYp9fAANBYgbTAANBYwAB3OcAA0FeYlsAA0F3AAHdIwADQV5iXwADQXwDAAM/VwAB3ScAA0GGYk8AA0GKFr8AA0GKn18AA0GLAAJHuwADQZcAAd0rAANBlwAB3S8AA0GGYlsAA0GjAAHdIwADQYZiUwADQaoG0wADQasAAdznAANBhmJXAANBtgbTAANBtwAB3OcAA0GGYl8AA0HAAAJw9wADQcpiTwADQc5w9wADQdMAAeILAANBymJHAANB2nD3AANB3wAB4g8AA0HfAAGnswADQd8AAeITAANB3wAB4hcAA0He258AA0HfAAGeHwADQd8AAeIrAANB3wAB4jMAA0HbAAHhVwADQdsAAeFbAANB2wAB4XcAA0HbAAHhfwADQcsAAd4DAANCEmJPAANCFnD3AANCGwAB3gcAA0ISYkcAA0IgjwADQhJiXwADQigDAANBywAB3gsAA0IyYk8AA0I2eYsAA0I3AAET2wADQjZw9wADQkIiJwADQkMAAd4PAANCMmJTAANCThtPAANCTsKjAANCMmJHAANCWnD3AANCXwAB3hMAA0JfAAHeGwADQliPAANCMmJfAANCbAMAA0HLAAHeJwADQnZiTwADQnoH6wADQnobjwADQnrbdwADQnZiRwADQoiPAANCdmJfAANCknD3AANClgLXAANBywAB3isAA0KeYl8AA0KgAwADQcsAAd4vAANCqmJPAANCro7PAANCrwAB3jMAA0KqYlMAA0K7AAHeNwADQqpiRwADQsCPAANCwwAB3j8AA0LCcPcAA0LPAAHeRwADQqpiXwADQtZw9wADQtoC1wADQcsAAd5PAANC4mJPAANC5rffAANC5wAB3lMAA0LmFLcAA0LmEGcAA0LmHesAA0LmcPcAA0L+H68AA0LiYlMAA0MGEh8AA0MGhqMAA0MGdbsAA0MGHecAA0MHAAHeVwADQwbMIwADQwbQCwADQwYQfwADQwcAAd5bAANDBhBrAANDBhS/AANDBhlfAANDBwABpIsAA0MGuFMAA0MGFNMAA0MGagMAA0MGEW8AA0MGG1cAA0MGDRMAA0LiYl8AA0NUAwADQcsAAd5fAANDXmJPAANDYrffAANDYnD3AANDah+vAANDXmJTAANDcwAB3lMAA0NzAAGkiwADQ3IKQwADQ3KEewADQ3KOtwADQ3IQZwADQ3Id6wADQ3IQdwADQ3IQbwADQ3IZXwADQ3MAAd5jAANDcgyXAANDchFvAANDchtXAANDXmJfAANDrAMAA0HLAAHeZwADQ7ZiTwADQ7pw9wADQ78AAd5rAANDtmJHAANDxnD3AANDywAB3m8AA0PLAAHedwADQ8sAAd57AANDxuy3AANDxwABMx8AA0PHAAHehwADQ8a3XwADQ7ZiXwADQ+pw9wADQ+4C1wADQcsAAd6TAAND9mJPAAND+nD3AAND/kibAAND9mJTAANEBgpDAANEBwAB3pcAA0QHAAHecwADRAYPBwADQ/ZiRwADRBiPAANEGSMAA0QbAAEzHwADRBsAAd6HAANEGuy3AANEGnD3AANEMwAB3m8AA0QzAAHedwADRDMAAd57AANEMwAB3qsAA0P2Yl8AA0RGcPcAA0RKAtcAA0HLAAHeswADRFJiTwADRFZw9wADRFsAAd63AANEUmJTAANEYgmrAANEUmJHAANEarvjAANEaI8AA0RqcPcAA0R3AAHevwADRFJiXwADRH5w9wADRIIC1wADQcsAAd7HAANEimJTAANEjnD3AANEkwAB3ssAA0SKYl8AA0SYAwADQcsAAd7PAANEomJPAANEpnD3AANEqwAB3ssAA0SrAAHe0wADRKsAAd7XAANEqwAB3tsAA0SrAAHe3wADRKsAAd7jAANEqwAB3ucAA0SrAAHe6wADRKsAAd7vAANEqwAB3vMAA0SrAAGlHwADRKsAAd73AANEqwAB3vsAA0SrAAHe/wADRKqlqwADRKsAASj3AANEphBrAANEphN3AANEomJTAANE9wAB3wcAA0T3AAHfAwADRPcAAd5TAANE9wABpIsAA0T2t98AA0T2GV8AA0T2HesAA0T2EW8AA0T2cPcAA0UbAAHfEwADRRsAAd8PAANFGwAB30cAA0T2E5sAA0T3AAHfGwADRPYTowADRPcAAd8rAANE9wAB3y8AA0T2tbMAA0T2iWsAA0T2FF8AA0T3AAHfFwADRPcAAd9LAANE9htXAANE9g8HAANEomJHAANFWI8AA0VbAAFRtwADRVkjAANFWmt/AANFWwAB31cAA0VabDMAA0VacPcAA0V3AAHfYwADRXcAAd9rAANFdwAB33MAA0V3AAHfewADRXcAAd+DAANFdwAB34sAA0V3AAHfkwADRXcAAd83AANFdwAB3zsAA0V3AAHebwADRXcAAd53AANFdwAB3nsAA0V3AAHfrwADRXcAAd+3AANFdwAB378AA0SiYl8AA0W2cPcAA0W6AtcAA0HLAAHfxwADRcJiTwADRcZw9wADRcsAAd/LAANFywAB3tMAA0XLAAHfzwADRcsAAUyfAANFywAB39MAA0XCYlMAA0XicPcAA0XnAAHfRwADReMAAd5TAANF4tAHAANF4hTTAANF4moDAANF4wAB3xcAA0XjAAHfSwADReKJawADReIUXwADReIbVwADReIRbwADRcJiRwADRhSPAANGFnD3AANGHwAB39cAA0YfAAHf6wADRh8AAd/bAANFwmJfAANGLnD3AANGMgLXAANBywAB3/cAA0Y6Yk8AA0Y+cPcAA0ZDAAHeawADRkMAAd7TAANGQwAB3usAA0Y6YlMAA0ZTAAHeUwADRlMAAaSLAANGUhlfAANGUhFvAANGUhtXAANGUg8HAANGOmJHAANGbSMAA0Y6Yl8AA0Z2cPcAA0Z6AtcAA0HLAAHf+wADRoJiTwADRoZw9wADRosAAd7XAANGiwAB3/8AA0aCYlMAA0aWt98AA0aWEGcAA0aWHesAA0aWahcAA0aXAAHfBwADRpcAAd8DAANGlnD3AANGswAB3ssAA0aWiWsAA0aWFF8AA0aXAAHfFwADRpcAAd9LAANGlg8HAANGgmJHAANGzI8AA0bNIwADRs5rfwADRs8AAd9XAANGznD3AANG4wAB4AsAA0bjAAHgEwADRoJiXwADRu5w9wADRvIC1wADQcsAAeAbAANG+mJPAANG/nD3AANHAwAB3ssAA0cDAAHe2wADRwMAAd7jAANHAwAB3tcAA0cDAAHgHwADRwKlqwADRwMAASj3AANG+mJTAANHIh3rAANHIrffAANHIwAB4CMAA0cjAAHfBwADRyMAAd8DAANHIwAB3xcAA0cjAAHfSwADRyKJawADRyIUXwADRvpiRwADR0iPAANHSmt/AANHSwAB31cAA0dKcPcAA0dbAAHgKwADR1sAAeAzAANG+mJfAANHZAMAA0HLAAHgOwADR25iTwADR3MAAd5TAANHcgKzAANHcnD3AANHfwAB3v8AA0d/AAHgPwADR25iUwADR4sAAaSLAANHirffAANHihlfAANHih3rAANHinD3AANHnwAB3ucAA0eKtbMAA0eKEW8AA0eKG1cAA0eKDwcAA0eLAAHgRwADR25iRwADR7kjAANHuI8AA0e6cPcAA0fHAAHgSwADR8cAAd5vAANHxwAB3ncAA0fHAAHeewADR8cAAd83AANHbmJfAANH3nD3AANH4gLXAANBywAB4GMAA0fqYk8AA0fuof8AA0fucPcAA0f3AAHgZwADR+4SdwADR+4MkwADR+4SowADR+4SpwADR+4bVwADR+piUwADSBISnwADSBISmwADSBIRbwADR+piRwADSCK0zwADSCJw9wADSCsAAeB/AANH6mJfAANIMnD3AANINgLXAANBywAB4IcAA0g+Yk8AA0hDAAHgiwADSEISwwADSD5iUwADSE4S1wADSD5iXwADSFZw9wADSFoC1wADQcsAAeCTAANIYmJPAANIZnD3AANIawAB3ucAA0hrAAHglwADSGsAAeDDAANIawAB3tcAA0hrAAFMnwADSGsAAd/TAANIawAB4McAA0hmEGcAA0hnAAHgmwADSGcAAeCfAANIZwAB4KMAA0hnAAHgpwADSGcAAeCrAANIZwAB4K8AA0hnAAHgswADSGcAAeC3AANIZwAB4LsAA0hnAAHgvwADSGJiUwADSLYQawADSLYUtwADSLYUvwADSLYd5wADSLcAAd5XAANItswjAANItwAB3lsAA0i20AsAA0i2EH8AA0i2Eh8AA0i2dbsAA0i2t98AA0i2GV8AA0i2HesAA0i2FNMAA0i2agMAA0i2hqMAA0i2uFMAA0i2DRMAA0hiYkcAA0kGcPcAA0kLAAHfQwADSQsAAeDnAANJCwAB4O8AA0kLAAHgywADSQsAAeD7AANJBI8AA0hiYl8AA0kmcPcAA0kqAtcAA0HLAAHhAwADSTJiTwADSTa33wADSTYQZwADSTYQbwADSTYQdwADSTZw9wADSUpImwADSTJiUwADSVId6wADSVJw9wADSVsAAd7nAANJUgpDAANJMmJHAANJZI8AA0lmcPcAA0lvAAHhDwADSTJiXwADSXZw9wADSXoC1wADQcsAAeEXAANJgmJPAANJhnD3AANJiwABxsMAA0mLAAHhGwADSYsAAeEfAANJiwABuX8AA0mKSJsAA0mGhHsAA0mGjrcAA0mCYlMAA0mqDJcAA0mrAAHeYwADSaoRbwADSaobVwADSaoKQwADSYJiRwADScCPAANJwnD3AANJywAB4SsAA0mCYl8AA0nScPcAA0nWAtcAA0HLAAHhMwADSd5iTwADSeMAAd5TAANJ3mJTAANJ6hlfAANJ6h3rAANJ6rffAANJ6hFvAANJ6htXAANJ6wAB3wcAA0nrAAHfAwADSeqJawADSeoUXwADSesAAd8XAANJ6wAB30sAA0nrAAGkiwADSeoPBwADSd5iRwADSiEjAANKII8AA0oia38AA0ojAAHfVwADSd5iXwADSjZw9wADSjoC1wADQcsAAeE/AANKQmJPAANKRnD3AANKSwAB4UMAA0pLAAHhRwADSksAAeFPAANKQmJHAANKWwAB4VcAA0pbAAHhWwADSlpw9wADSmcAAeFfAANKZwAB4WcAA0pnAAHhbwADSmcAAeGHAANKWwAB4XcAA0pbAAHhfwADSkJiXwADSoADAANBywAB4Y8AA0qKYlsAA0qOcPcAA0qTAAHZ7wADSopiRwADSpkjAANBywAB4ZcAA0qiYkcAA0qmcPcAA0qrAAHhmwADSqcAAeGjAANKpmRTAANKpwAB4a8AA0qiYlMAA0q+G08AA0q+wqMAA0q+eYsAA0q/AAET2wADSqJiXwADStADAANBywAB4bMAA0raYl8AA0rcAwADQcsAAeG3AANK5mJTAANK6o7PAANK6wAB3jcAA0rrAAHeMwADSuZiRwADSvkjAANK+wAB3j8AA0rmYl8AA0sEAwADQcsAAeG7AANLDmJTAANLEwAB3lMAA0sTAAGkiwADSxK33wADSxIZXwADSxId6wADSxIRbwADSxIbVwADSw5iXwADSzADAANBywAB4b8AA0s6YkcAA0s+7LcAA0s/AAEzHwADSz8AAd6HAANLPrdfAANLOmJfAANLUAMAA0HLAAHhwwADS1piUwADS14KQwADS18AAd6XAANLXwAB3nMAA0taYkcAA0ttIwADS1piXwADS3QDAANBywAB4ccAA0t+YlMAA0uCCasAA0t+YkcAA0uKu+MAA0t+Yl8AA0uQAwADQcsAAeHLAANLmmJTAANLngKzAANLnrWzAANLnwAB4EcAA0uaYkcAA0utIwADS5piXwADS7QDAANBywAB4c8AA0u+YlMAA0vCEqMAA0vCEp8AA0vCEqcAA0vCof8AA0vCEpsAA0vCDJMAA0vCEncAA0vCEW8AA0vCG1cAA0u+YkcAA0vqtM8AA0u+Yl8AA0vwAwADQcsAAeHTAANL+mJTAANL/wAB4IsAA0v+EsMAA0v+EtcAA0v6Yl8AA0wMAwADQcsAAeFTAANMFmJTAANMGwAB3wcAA0wbAAHfAwADTBqJawADTBoUXwADTBsAAd8XAANMGwAB30sAA0wWYkcAA0w2a38AA0w3AAHfVwADTBZiXwADTEADAANBywAB4UsAA0xKYlMAA0xOE5sAA0xPAAHfGwADTE4QawADTE4TdwADTE61swADTE8AAd8vAANMTwAB3ysAA0xOE6MAA0xKYkcAA0xzAAFRtwADTHEjAANMcmwzAANMSmJfAANMgAMAA0HLAAHh1wADTIpiUwADTI4U0wADTI5qAwADTI7QBwADTIpiXwADTJwDAANBywAB4dsAA0ymYlMAA0yqahcAA0yqEGcAA0ymYkcAA0y1IwADTKZiXwADTLwDAANBywAB4d8AA0zGYlMAA0zLAAHgIwADTMZiXwADTNADAANBywAB4eMAA0zaYlMAA0zeFNMAA0zeDRMAA0zeagMAA0zeEGcAA0zeEGsAA0zeEh8AA0zehqMAA0zedbsAA0zeFLcAA0zeFL8AA0zeHecAA0zeuFMAA0zfAAHeVwADTN7MIwADTN8AAd5bAANM3tALAANM2mJHAANNISMAA0zaYl8AA00oAwADQcsAAeHnAANNMmJTAANNNgpDAANNNhBnAANNNhBvAANNNhB3AANNMmJHAANNSSMAA00yYl8AA01QAwADQcsAAeHrAANNWmJTAANNXgpDAANNXoR7AANNXo63AANNXwAB3mMAA01eDJcAA01aYl8AA010AwADQcrbbwADTX5iUwADTYIH6wADTYIbjwADTYLbdwADTX5iXwADTZADAANBywABHEMAA02aYk8AA02eBsMAA02fAAHh7wADTZ8AAeHzAANNmmJfAANNrAMAA0HLAAHh9wADTbZiTwADTbsAAeH/AANNuh4jAANNuwAB4gMAA027AAHiBwADTbZiXwADTcwAAwACR7wDAAJHwwADTdpiTwADTd8AAkfDAANN4wAB7WsAA03jAAHtbwADTeMAAe1zAANN4wAB7XcAA03aYkcAA033AAJHwwADTfsAAe17AANN+wAB7X8AA037AAHtiwADTfsAAe2PAANN+wAB7ZMAA037AAHtlwADTfsAAe2bAANN+wAB7Z8AA037AAHtowADTfsAAe2nAANN+wAB7asAA037AAHtrwADTfsAAe2zAANN2wAB4kcAA04yYlMAA041hwADTjcAAbmvAANONqG7AANONgovAANONgVXAANONg7LAANOMmJHAANOUWMAA05SCQsAA05SEWcAA05Sft8AA05SfvMAA05QjwADTlMAAkfDAANObwABuasAA04yYlcAA051hwADTjJiXwADTnwDAANN2wAB4mMAA06GYlMAA06LAAG5rwADToqhuwADTooKLwADTopiCwADTolzAANOigxnAANOigejAANOigMPAANOhmJHAANOrlkDAANOrljfAANOrljLAANOrn8HAANOrn8LAANOrZMAA06uDF8AA06ufsMAA06uBpcAA06uWPsAA06uWP8AA06uWKcAA06uWPcAA06ucYsAA06uftsAA06uArcAA06uVE8AA06uD+MAA06uWOsAA06uDWcAA06uAq8AA06uEicAA06uWMMAA06uB1MAA06uWNMAA06uWOcAA06uWPMAA06uWM8AA06tWwADTq4ClwADTq57KwADTq5/EwADTq4CuwADTq4C7wADTq5ZawADTq4YRwADTq5/DwADTq5b4wADTq5b7wADTq5/GwADTq5upwADToZiVwADT1YMZwADT1YHowADTdsAAeJrAANPYmJHAANPZwACR8MAA09rAAHicwADT2YNewADT2YFYwADTdsAAeKDAANPemJTAANPfwABua8AA09+obsAA09+Ci8AA09+YgsAA099cwADT34MZwADT34HowADT34DDwADT3piRwADT6JZAwADT6JY3wADT6JYywADT6J/BwADT6J/CwADT6GTAANPogxfAANPon7DAANPogaXAANPolj7AANPolj/AANPolinAANPolj3AANPonGLAANPon7bAANPogK3AANPolRPAANPog/jAANPoljrAANPog1nAANPogKvAANPohInAANPoljDAANPogdTAANPoljTAANPoljnAANPoljzAANPoljPAANPoVsAA0+iApcAA0+ieysAA0+ifxMAA0+iArsAA0+iAu8AA0+iWWsAA0+iGEcAA0+ifw8AA0+iW+MAA0+iW+8AA0+ifxsAA0+ibqcAA096YlcAA1BKDGcAA1BKB6MAA03bAAHihwADUFZiRwADUFsAAkfDAANQXwAB4nMAA1BaDXsAA1BaBWMAA03bAAHiiwADUG5iUwADUHMAAbmvAANQcqG7AANQcgovAANQcmILAANQcXMAA1ByDGcAA1ByB6MAA1ByAw8AA1BuYkcAA1CXAAJHwwADUJsAAeJzAANQllkDAANQlljfAANQlljLAANQln8HAANQln8LAANQlZMAA1CWDF8AA1CWfsMAA1CWDXsAA1CWBpcAA1CWWPsAA1CWWP8AA1CWWKcAA1CWWPcAA1CWcYsAA1CWftsAA1CWArcAA1CWVE8AA1CWD+MAA1CWWOsAA1CWDWcAA1CWAq8AA1CWEicAA1CWWMMAA1CWB1MAA1CWWNMAA1CWWOcAA1CWWPMAA1CWWM8AA1CVWwADUJYClwADUJZ7KwADUJZ/EwADUJYCuwADUJYC7wADUJZZawADUJYYRwADUJZ/DwADUJZb4wADUJZb7wADUJYFYwADUJZ/GwADUJZupwADUG5iVwADUU4MZwADUU4HowADUG5iXwADUVgDAANN2wAB4pMAA1FiYlMAA1FnAAG5rwADUWahuwADUWYKLwADUWZiCwADUWVzAANRZgxnAANRZgejAANRZgMPAANRYmJHAANRiwACR8MAA1GPAAHicwADUYpZAwADUYpY3wADUYpYywADUYp/BwADUYp/CwADUYmTAANRigxfAANRin7DAANRig17AANRigaXAANRilj7AANRilj/AANRilinAANRilj3AANRinGLAANRin7bAANRigK3AANRilRPAANRig/jAANRiljrAANRig1nAANRigKvAANRihInAANRiljDAANRigdTAANRiljTAANRiljnAANRiljzAANRiljPAANRiVsAA1GKApcAA1GKeysAA1GKfxMAA1GKArsAA1GKAu8AA1GKWWsAA1GKGEcAA1GKfw8AA1GKW+MAA1GKW+8AA1GKBWMAA1GKfxsAA1GKbqcAA1FiYlcAA1JCDGcAA1JCB6MAA1FiYl8AA1JMAwADTdsAAeKXAANSVmJTAANSWwABua8AA1JaobsAA1JaCi8AA1JaYgsAA1JZcwADUloMZwADUloHowADUloDDwADUlZiRwADUn8AAkfDAANSgwAB4nMAA1J+WQMAA1J+WN8AA1J+WMsAA1J+fwcAA1J+fwsAA1J9kwADUn4MXwADUn5+wwADUn4NewADUn4GlwADUn5Y+wADUn5Y/wADUn5YpwADUn5Y9wADUn5xiwADUn5+2wADUn4CtwADUn5UTwADUn4P4wADUn5Y6wADUn4NZwADUn4CrwADUn4SJwADUn5YwwADUn4HUwADUn5Y0wADUn5Y5wADUn5Y8wADUn5YzwADUn1bAANSfgKXAANSfnsrAANSfn8TAANSfgK7AANSfgLvAANSfllrAANSfhhHAANSfn8PAANSflvjAANSflvvAANSfgVjAANSfn8bAANSfm6nAANSVmJXAANTNgxnAANTNgejAANSVmJfAANTQAMAA03bAAHimwADU0piTwADU08AAkfDAANTUtpfAANTSmJbAANTWwACR8MAA1NfAAHinwADU0piUwADU2cAAbhDAANTZg8HAANTSmJHAANTcSMAA1NzAAG4SwADU3MAAeKjAANTcmCTAANTcwAB4qcAA1NzAAHiqwADU3MAAeKvAANTcwAB4rMAA1NzAAHitwADU3MAAeK7AANTcwAB4r8AA1NzAAHiwwADU3MAAeLHAANTcwAB4ssAA1NzAAHizwADU3MAAeLTAANTSmJfAANTtAMAA03bAAHi1wADU75iUwADU8MAAbmvAANTwqG7AANTwwABuEMAA1PCCi8AA1PBhwADU75iRwADU9sAAkfDAANT3wAB4t8AA1PfAAHi5wADU98AAeLvAANT3wAB4vcAA1PfAAHi/wADU98AAeMHAANT3wAB4w8AA1PfAAHjFwADU98AAeMfAANT3wAB4ycAA1PfAAHjLwADU98AAeM3AANT3wAB4z8AA1PfAAHjRwADU98AAeNPAANT3wAB41cAA1PfAAHjXwADU98AAeNnAANT3wAB428AA1PfAAHjdwADU98AAeN/AANT3wAB44cAA1PfAAHjjwADU98AAeOXAANT3wAB458AA1PfAAHjpwADU98AAeOvAANTvmJfAANUTAMAA03bAAHjuwADVFZiRwADVFp+8wADVFpZAwADVFpY3wADVFpYywADVFp/BwADVFp/CwADVFmTAANUWgxfAANUWn7DAANUWgaXAANUWlj7AANUWlj/AANUWlinAANUWlj3AANUWnGLAANUWn7bAANUWgK3AANUWlRPAANUWg/jAANUWljrAANUWg1nAANUWgKvAANUWhInAANUWljDAANUWgdTAANUWljTAANUWljnAANUWljzAANUWljPAANUWVsAA1RaApcAA1RaeysAA1RafxMAA1RaArsAA1RaAu8AA1RaWWsAA1RaGEcAA1Rafw8AA1RaW+MAA1RaW+8AA1RafxsAA1RabqcAA1RWYl8AA1UEAwADVFZiUwADVQ8AAbmvAANVDqG7AANVDgovAANVDmILAANVDXMAA1UODGcAA1UOB6MAA1UOAw8AA1RWYlcAA1UyDGcAA1UyB6MAA03bAAHjvwADVT5iRwADVUJ+8wADVUMAAkfDAANVSwAB4nMAA1VCDXsAA1VCBWMAA1U+Yl8AA1VYAwADTdsAAePDAANVYmJbAANVZwACR8MAA1VrAAHZ7wADVWJiRwADVXEvAANVcgL/AANVcwACR8MAA1V/AAHicwADVXJ+8wADVWJiUwADVYsAAbmvAANN2wAB48cAA1WSYkcAA1WWfvMAA1WWWQMAA1WWWN8AA1WWWMsAA1WWfwcAA1WWfwsAA1WVkwADVZYMXwADVZZ+wwADVZYGlwADVZZY+wADVZZY/wADVZZYpwADVZZY9wADVZZxiwADVZZ+2wADVZYCtwADVZZUTwADVZYP4wADVZZY6wADVZYNZwADVZYCrwADVZYSJwADVZZYwwADVZYHUwADVZZY0wADVZZY5wADVZZY8wADVZZYzwADVZVbAANVlgKXAANVlnsrAANVln8TAANVlgK7AANVlgLvAANVlllrAANVlhhHAANVln8PAANVllvjAANVllvvAANVln8bAANVlm6nAANVkmJfAANWQAMAA1WSYlMAA1ZLAAG5rwADVkqhuwADVkoKLwADVkpiCwADVklzAANWSgxnAANWSgejAANWSgMPAANVkmJXAANWbgxnAANWbgejAANN2wAB48sAA1Z6YkcAA1Z+fvMAA1Z/AAJHwwADVocAAeJzAANWfg17AANWfgVjAANWemJfAANWlAMAA03bAAHjzwADVp5iWwADVqMAAkfDAANWpwAB2e8AA1aeYkcAA1atLwADVq4C/wADVq8AAkfDAANWuwAB4nMAA1aufvMAA1aeYlMAA1bHAAG5rwADTdsAAePTAANWzmJHAANW0n7zAANW0lkDAANW0ljfAANW0ljLAANW0n8HAANW0n8LAANW0ZMAA1bSDF8AA1bSfsMAA1bSBpcAA1bSWPsAA1bSWP8AA1bSWKcAA1bSWPcAA1bScYsAA1bSftsAA1bSArcAA1bSVE8AA1bSD+MAA1bSWOsAA1bSDWcAA1bSAq8AA1bSEicAA1bSWMMAA1bSB1MAA1bSWNMAA1bSWOcAA1bSWPMAA1bSWM8AA1bRWwADVtIClwADVtJ7KwADVtJ/EwADVtICuwADVtIC7wADVtJZawADVtIYRwADVtJ/DwADVtJb4wADVtJb7wADVtJ/GwADVtJupwADVs5iXwADV3wDAANWzmJTAANXhwABua8AA1eGobsAA1eGCi8AA1eGYgsAA1eFcwADV4YMZwADV4YHowADV4YDDwADVs5iVwADV6oMZwADV6oHowADTdsAAePXAANXtmJHAANXun7zAANXuwACR8MAA1fDAAHicwADV7oNewADV7oFYwADV7ZiXwADV9ADAANN2wAB49sAA1faYlsAA1ffAAJHwwADV+MAAdnvAANX2mJHAANX6S8AA1fqAv8AA1frAAJHwwADV/cAAeJzAANX6n7zAANX2mJTAANYAwABua8AA03bAAHj3wADWApiRwADWA5+8wADWA5ZAwADWA5Y3wADWA5YywADWA5/BwADWA5/CwADWA2TAANYDgxfAANYDn7DAANYDgaXAANYDlj7AANYDlj/AANYDlinAANYDlj3AANYDnGLAANYDn7bAANYDgK3AANYDlRPAANYDg/jAANYDljrAANYDg1nAANYDgKvAANYDhInAANYDljDAANYDgdTAANYDljTAANYDljnAANYDljzAANYDljPAANYDVsAA1gOApcAA1gOeysAA1gOfxMAA1gOArsAA1gOAu8AA1gOWWsAA1gOGEcAA1gOfw8AA1gOW+MAA1gOW+8AA1gOfxsAA1gObqcAA1gKYl8AA1i4AwADWApiUwADWMMAAbmvAANYwqG7AANYwgovAANYwmILAANYwXMAA1jCDGcAA1jCB6MAA1jCAw8AA1gKYlcAA1jmDGcAA1jmB6MAA03bAAHj4wADWPJiRwADWPZ+8wADWPcAAkfDAANY/wAB4nMAA1j2DXsAA1j2BWMAA1jyYl8AA1kMAwADTdsAAePnAANZFmJbAANZGwACR8MAA1kfAAHZ7wADWRZiRwADWSUvAANZJgL/AANZJg17AANZJwACR8MAA1k3AAHicwADWTcAAePrAANZNwAB4+8AA1kmfvMAA1kWYlMAA1lLAAG5rwADTdsAAePzAANZUmJHAANZVn7zAANZVlkDAANZVljfAANZVljLAANZVn8HAANZVn8LAANZVZMAA1lWDF8AA1lWfsMAA1lWBpcAA1lWWPsAA1lWWP8AA1lWWKcAA1lWWPcAA1lWcYsAA1lWftsAA1lWArcAA1lWVE8AA1lWD+MAA1lWWOsAA1lWDWcAA1lWAq8AA1lWEicAA1lWWMMAA1lWB1MAA1lWWNMAA1lWWOcAA1lWWPMAA1lWWM8AA1lVWwADWVYClwADWVZ7KwADWVZ/EwADWVYCuwADWVYC7wADWVZZawADWVYYRwADWVZ/DwADWVZb4wADWVZb7wADWVZ/GwADWVZupwADWVJiXwADWgADAANZUmJTAANaCwABua8AA1oKobsAA1oKCi8AA1oKYgsAA1oJcwADWgoMZwADWgoHowADWgoDDwADWVJiVwADWi4MZwADWi4HowADTdsAAeP3AANaOmJHAANaPn7zAANaPwACR8MAA1pHAAHicwADWj4NewADWj4FYwADWjpiXwADWlQDAANN2wAB4/sAA1peYlsAA1pjAAJHwwADWmcAAdnvAANaXmJHAANabS8AA1puAv8AA1puDXsAA1pvAAJHwwADWn8AAeJzAANafwAB4/8AA1p/AAHkAwADWm5+8wADWl5iUwADWpMAAbmvAANN2wAB5AcAA1qaYkcAA1qefvMAA1qeWQMAA1qeWN8AA1qeWMsAA1qefwcAA1qefwsAA1qdkwADWp4MXwADWp5+wwADWp4GlwADWp5Y+wADWp5Y/wADWp5YpwADWp5Y9wADWp5xiwADWp5+2wADWp4CtwADWp5UTwADWp4P4wADWp5Y6wADWp4NZwADWp4CrwADWp4SJwADWp5YwwADWp4HUwADWp5Y0wADWp5Y5wADWp5Y8wADWp5YzwADWp1bAANangKXAANannsrAANann8TAANangK7AANangLvAANanllrAANanhhHAANann8PAANanlvjAANanlvvAANann8bAANanm6nAANammJfAANbSAMAA1qaYlMAA1tTAAG5rwADW1KhuwADW1IKLwADW1JiCwADW1FzAANbUgxnAANbUgejAANbUgMPAANammJXAANbdgxnAANbdgejAANN2wAB5AsAA1uCYkcAA1uGfvMAA1uHAAJHwwADW48AAeJzAANbhg17AANbhgVjAANbgmJfAANbnAMAA03bAAHkDwADW6ZiWwADW6sAAkfDAANbrwAB2e8AA1umYkcAA1u1LwADW7YC/wADW7cAAkfDAANbwwAB4nMAA1vDAAHkEwADW8MAAeQXAANbtn7zAANbpmJTAANb1wABua8AA03bAAHkGwADW95iRwADW+J+8wADW+JZAwADW+JY3wADW+JYywADW+J/BwADW+J/CwADW+GTAANb4gxfAANb4n7DAANb4gaXAANb4lj7AANb4lj/AANb4linAANb4lj3AANb4nGLAANb4n7bAANb4gK3AANb4lRPAANb4g/jAANb4ljrAANb4g1nAANb4gKvAANb4hInAANb4ljDAANb4gdTAANb4ljTAANb4ljnAANb4ljzAANb4ljPAANb4VsAA1viApcAA1vieysAA1vifxMAA1viArsAA1viAu8AA1viWWsAA1viGEcAA1vifw8AA1viW+MAA1viW+8AA1vifxsAA1vibqcAA1veYl8AA1yMAwADW95iUwADXJcAAbmvAANclqG7AANclgovAANclmILAANclXMAA1yWDGcAA1yWB6MAA1yWAw8AA1veYlcAA1y6DGcAA1y6B6MAA03bAAHkHwADXMZiRwADXMp+8wADXMsAAkfDAANc0wAB4nMAA1zKDXsAA1zKBWMAA1zGYl8AA1zgAwADTdsAAeQjAANc6mJbAANc7wACR8MAA1zzAAHZ7wADXOpiRwADXPkvAANc+gL/AANc+wACR8MAA10HAAHicwADXQcAAeQnAANdBwAB5CsAA1z6fvMAA1zqYlMAA10bAAG5rwADTdsAAeQvAANdImJHAANdJn7zAANdJlkDAANdJljfAANdJljLAANdJn8HAANdJn8LAANdJZMAA10mDF8AA10mfsMAA10mBpcAA10mWPsAA10mWP8AA10mWKcAA10mWPcAA10mcYsAA10mftsAA10mArcAA10mVE8AA10mD+MAA10mWOsAA10mDWcAA10mAq8AA10mEicAA10mWMMAA10mB1MAA10mWNMAA10mWOcAA10mWPMAA10mWM8AA10lWwADXSYClwADXSZ7KwADXSZ/EwADXSYCuwADXSYC7wADXSZZawADXSYYRwADXSZ/DwADXSZb4wADXSZb7wADXSZ/GwADXSZupwADXSJiXwADXdADAANdImJTAANd2wABua8AA13aobsAA13aCi8AA13aYgsAA13ZcwADXdoMZwADXdoHowADXdoDDwADXSJiVwADXf4MZwADXf4HowADTdsAAeQzAANeCmJHAANeDn7zAANeDwACR8MAA14XAAHicwADXg4NewADXg4FYwADXgpiXwADXiQDAANN2wAB5DcAA14uYlsAA14zAAJHwwADXjcAAdnvAANeLmJHAANePS8AA14+Av8AA14/AAJHwwADXksAAeJzAANeSwAB5DsAA15LAAHkPwADXj5+8wADXi5iUwADXl8AAbmvAANN2wAB5EMAA15mYkcAA15qfvMAA15qWQMAA15qWN8AA15qWMsAA15qfwcAA15qfwsAA15pkwADXmoMXwADXmp+wwADXmoGlwADXmpY+wADXmpY/wADXmpYpwADXmpY9wADXmpxiwADXmp+2wADXmoCtwADXmpUTwADXmoP4wADXmpY6wADXmoNZwADXmoCrwADXmoSJwADXmpYwwADXmoHUwADXmpY0wADXmpY5wADXmpY8wADXmpYzwADXmlbAANeagKXAANeansrAANean8TAANeagK7AANeagLvAANeallrAANeahhHAANean8PAANealvjAANealvvAANean8bAANeam6nAANeZmJfAANfFAMAA15mYlMAA18fAAG5rwADXx6huwADXx4KLwADXx5iCwADXx1zAANfHgxnAANfHgejAANfHgMPAANeZmJXAANfQgxnAANfQgejAANN2wAB5EcAA19OYkcAA19SfvMAA19TAAJHwwADX1sAAeJzAANfUg17AANfUgVjAANfTmJfAANfaAMAA03bAAHkSwADX3JiWwADX3cAAkfDAANfewAB2e8AA19yYkcAA1+BLwADX4IC/wADX4MAAkfDAANfjwAB4nMAA1+PAAHkTwADX48AAeRTAANfgn7zAANfcmJTAANfowABua8AA03bAAHkVwADX6piRwADX65+8wADX65ZAwADX65Y3wADX65YywADX65/BwADX65/CwADX62TAANfrgxfAANfrn7DAANfrgaXAANfrlj7AANfrlj/AANfrlinAANfrlj3AANfrnGLAANfrn7bAANfrgK3AANfrlRPAANfrg/jAANfrljrAANfrg1nAANfrgKvAANfrhInAANfrljDAANfrgdTAANfrljTAANfrljnAANfrljzAANfrljPAANfrVsAA1+uApcAA1+ueysAA1+ufxMAA1+uArsAA1+uAu8AA1+uWWsAA1+uGEcAA1+ufw8AA1+uW+MAA1+uW+8AA1+ufxsAA1+ubqcAA1+qYl8AA2BYAwADX6piUwADYGMAAbmvAANgYqG7AANgYgovAANgYmILAANgYXMAA2BiDGcAA2BiB6MAA2BiAw8AA1+qYlcAA2CGDGcAA2CGB6MAA03bAAHkWwADYJJiRwADYJZ+8wADYJcAAkfDAANgnwAB4nMAA2CWDXsAA2CWBWMAA2CSYl8AA2CsAwADTdsAAeRfAANgtmJbAANguwACR8MAA2C/AAHZ7wADYLZiRwADYMUvAANgxgL/AANgxwACR8MAA2DTAAHicwADYNMAAeRjAANg0wAB5GcAA2DGfvMAA2C2YlMAA2DnAAG5rwADTdsAAeRrAANg7mJHAANg8n7zAANg8lkDAANg8ljfAANg8ljLAANg8n8HAANg8n8LAANg8ZMAA2DyDF8AA2DyfsMAA2DyBpcAA2DyWPsAA2DyWP8AA2DyWKcAA2DyWPcAA2DycYsAA2DyftsAA2DyArcAA2DyVE8AA2DyD+MAA2DyWOsAA2DyDWcAA2DyAq8AA2DyEicAA2DyWMMAA2DyB1MAA2DyWNMAA2DyWOcAA2DyWPMAA2DyWM8AA2DxWwADYPIClwADYPJ7KwADYPJ/EwADYPICuwADYPIC7wADYPJZawADYPIYRwADYPJ/DwADYPJb4wADYPJb7wADYPJ/GwADYPJupwADYO5iXwADYZwDAANg7mJTAANhpwABua8AA2GmobsAA2GmCi8AA2GmYgsAA2GlcwADYaYMZwADYaYHowADYaYDDwADYO5iVwADYcoMZwADYcoHowADTdsAAeRvAANh1mJHAANh2n7zAANh2wACR8MAA2HjAAHicwADYdoNewADYdoFYwADYdZiXwADYfADAANN2wAB5HMAA2H6YlsAA2H/AAJHwwADYgMAAdnvAANh+mJHAANiCS8AA2IKAv8AA2ILAAJHwwADYhcAAeJzAANiFwAB5HcAA2IXAAHkewADYgp+8wADYfpiUwADYisAAbmvAANN2wAB5H8AA2IyYkcAA2I2fvMAA2I3AAJHwwADYj8AAeJzAANiNlkDAANiNljfAANiNljLAANiNn8HAANiNn8LAANiNZMAA2I2DF8AA2I2fsMAA2I2DXsAA2I2BpcAA2I2WPsAA2I2WP8AA2I2WKcAA2I2WPcAA2I2cYsAA2I2ftsAA2I2ArcAA2I2VE8AA2I2D+MAA2I2WOsAA2I2DWcAA2I2Aq8AA2I2EicAA2I2WMMAA2I2B1MAA2I2WNMAA2I2WOcAA2I2WPMAA2I2WM8AA2I1WwADYjYClwADYjZ7KwADYjZ/EwADYjYCuwADYjYC7wADYjZZawADYjYYRwADYjZ/DwADYjZb4wADYjZb7wADYjYFYwADYjZ/GwADYjZupwADYjJiXwADYvADAANiMmJTAANi+wABua8AA2L6obsAA2L6Ci8AA2L6YgsAA2L5cwADYvoMZwADYvoHowADYvoDDwADYjJiVwADYx4MZwADYx4HowADTdsAAeSDAANjKmJbAANjLwACR8MAA2MzAAHZ7wADYypiRwADYzkvAANjOgL/AANjOwACR8MAA2NHAAHicwADY0cAAeSHAANjRwAB5IsAA2M6fvMAA2MqYlMAA2NbAAG5rwADTdsAAeSPAANjYmJHAANjZn7zAANjZwACR8MAA2NvAAHicwADY2ZZAwADY2ZY3wADY2ZYywADY2Z/BwADY2Z/CwADY2WTAANjZgxfAANjZn7DAANjZg17AANjZgaXAANjZlj7AANjZlj/AANjZlinAANjZlj3AANjZnGLAANjZn7bAANjZgK3AANjZlRPAANjZg/jAANjZljrAANjZg1nAANjZgKvAANjZhInAANjZljDAANjZgdTAANjZljTAANjZljnAANjZljzAANjZljPAANjZVsAA2NmApcAA2NmeysAA2NmfxMAA2NmArsAA2NmAu8AA2NmWWsAA2NmGEcAA2Nmfw8AA2NmW+MAA2NmW+8AA2NmBWMAA2NmfxsAA2NmbqcAA2NiYl8AA2QgAwADY2JiUwADZCsAAbmvAANkKqG7AANkKgovAANkKmILAANkKXMAA2QqDGcAA2QqB6MAA2QqAw8AA2NiYlcAA2RODGcAA2ROB6MAA03bAAHkkwADZFpiWwADZF8AAkfDAANkYwAB2e8AA2RaYkcAA2RpLwADZGoC/wADZGsAAkfDAANkdwAB4nMAA2R3AAHklwADZHcAAeSbAANkan7zAANkWmJTAANkiwABua8AA03bAAHknwADZJJiRwADZJZ+8wADZJcAAkfDAANknwAB4nMAA2SWWQMAA2SWWN8AA2SWWMsAA2SWfwcAA2SWfwsAA2SVkwADZJYMXwADZJZ+wwADZJYNewADZJYGlwADZJZY+wADZJZY/wADZJZYpwADZJZY9wADZJZxiwADZJZ+2wADZJYCtwADZJZUTwADZJYP4wADZJZY6wADZJYNZwADZJYCrwADZJYSJwADZJZYwwADZJYHUwADZJZY0wADZJZY5wADZJZY8wADZJZYzwADZJVbAANklgKXAANklnsrAANkln8TAANklgK7AANklgLvAANklllrAANklhhHAANkln8PAANkllvjAANkllvvAANklgVjAANkln8bAANklm6nAANkkmJfAANlUAMAA2SSYlMAA2VbAAG5rwADZVqhuwADZVoKLwADZVpiCwADZVlzAANlWgxnAANlWgejAANlWgMPAANkkmJXAANlfgxnAANlfgejAANN2wAB5KMAA2WKYlsAA2WPAAJHwwADZZMAAdnvAANlimJHAANlmS8AA2WaAv8AA2WbAAJHwwADZacAAeJzAANlpwAB5KcAA2WnAAHkqwADZZp+8wADZYpiUwADZbsAAbmvAANN2wAB5K8AA2XCYkcAA2XGfvMAA2XGWQMAA2XGWN8AA2XGWMsAA2XGfwcAA2XGfwsAA2XFkwADZcYMXwADZcZ+wwADZcYGlwADZcZY+wADZcZY/wADZcZYpwADZcZY9wADZcZxiwADZcZ+2wADZcYCtwADZcZUTwADZcYP4wADZcZY6wADZcYNZwADZcYCrwADZcYSJwADZcZYwwADZcYHUwADZcZY0wADZcZY5wADZcZY8wADZcZYzwADZcVbAANlxgKXAANlxnsrAANlxn8TAANlxgK7AANlxgLvAANlxllrAANlxhhHAANlxn8PAANlxlvjAANlxlvvAANlxn8bAANlxm6nAANlwmJfAANmcAMAA2XCYlMAA2Z7AAG5rwADZnqhuwADZnoKLwADZnpiCwADZnlzAANmegxnAANmegejAANmegMPAANlwmJXAANmngxnAANmngejAANN2wAB5LMAA2aqYkcAA2aufvMAA2avAAJHwwADZrcAAeJzAANmrg17AANmrgVjAANmqmJfAANmxAMAA03bAAHktwADZs5iWwADZtMAAkfDAANm1wAB2e8AA2bOYkcAA2bdLwADZt4C/wADZt8AAkfDAANm6wAB4nMAA2befvMAA2bOYlMAA2b3AAG5rwADTdsAAeS7AANm/mJHAANnAn7zAANnAlkDAANnAljfAANnAljLAANnAn8HAANnAn8LAANnAZMAA2cCDF8AA2cCfsMAA2cCBpcAA2cCWPsAA2cCWP8AA2cCWKcAA2cCWPcAA2cCcYsAA2cCftsAA2cCArcAA2cCVE8AA2cCD+MAA2cCWOsAA2cCDWcAA2cCAq8AA2cCEicAA2cCWMMAA2cCB1MAA2cCWNMAA2cCWOcAA2cCWPMAA2cCWM8AA2cBWwADZwIClwADZwJ7KwADZwJ/EwADZwICuwADZwIC7wADZwJZawADZwIYRwADZwJ/DwADZwJb4wADZwJb7wADZwJ/GwADZwJupwADZv5iXwADZ6wDAANm/mJTAANntwABua8AA2e2obsAA2e2Ci8AA2e2YgsAA2e1cwADZ7YMZwADZ7YHowADZ7YDDwADZv5iVwADZ9oMZwADZ9oHowADTdsAAeS/AANn5mJHAANn6n7zAANn6wACR8MAA2fzAAHicwADZ+oNewADZ+oFYwADZ+ZiXwADaAADAANN2wAB5MMAA2gKYlsAA2gPAAJHwwADaBMAAdnvAANoCmJHAANoGS8AA2gaAv8AA2gbAAJHwwADaCcAAeJzAANoGn7zAANoCmJTAANoMwABua8AA03bAAHkxwADaDpiRwADaD5+8wADaD5ZAwADaD5Y3wADaD5YywADaD5/BwADaD5/CwADaD2TAANoPgxfAANoPn7DAANoPgaXAANoPlj7AANoPlj/AANoPlinAANoPlj3AANoPnGLAANoPn7bAANoPgK3AANoPlRPAANoPg/jAANoPljrAANoPg1nAANoPgKvAANoPhInAANoPljDAANoPgdTAANoPljTAANoPljnAANoPljzAANoPljPAANoPVsAA2g+ApcAA2g+eysAA2g+fxMAA2g+ArsAA2g+Au8AA2g+WWsAA2g+GEcAA2g+fw8AA2g+W+MAA2g+W+8AA2g+fxsAA2g+bqcAA2g6Yl8AA2joAwADaDpiUwADaPMAAbmvAANo8qG7AANo8govAANo8mILAANo8XMAA2jyDGcAA2jyB6MAA2jyAw8AA2g6YlcAA2kWDGcAA2kWB6MAA03bAAHkywADaSJiRwADaSZ+8wADaScAAkfDAANpLwAB4nMAA2kmDXsAA2kmBWMAA2kiYl8AA2k8AwADTdsAAeTPAANpRmJbAANpSwACR8MAA2lPAAHZ7wADaUZiRwADaVUvAANpVgL/AANpVwACR8MAA2ljAAHicwADaVZ+8wADaUZiUwADaW8AAbmvAANN2wAB5NMAA2l2YkcAA2l6fvMAA2l6WQMAA2l6WN8AA2l6WMsAA2l6fwcAA2l6fwsAA2l5kwADaXoMXwADaXp+wwADaXoGlwADaXpY+wADaXpY/wADaXpYpwADaXpY9wADaXpxiwADaXp+2wADaXoCtwADaXpUTwADaXoP4wADaXpY6wADaXoNZwADaXoCrwADaXoSJwADaXpYwwADaXoHUwADaXpY0wADaXpY5wADaXpY8wADaXpYzwADaXlbAANpegKXAANpensrAANpen8TAANpegK7AANpegLvAANpellrAANpehhHAANpen8PAANpelvjAANpelvvAANpen8bAANpem6nAANpdmJfAANqJAMAA2l2YlMAA2ovAAG5rwADai6huwADai4KLwADai5iCwADai1zAANqLgxnAANqLgejAANqLgMPAANpdmJXAANqUgxnAANqUgejAANN2wAB5NcAA2peYkcAA2pifvMAA2pjAAJHwwADamsAAeJzAANqYg17AANqYgVjAANqXmJfAANqeAMAA03bAAHk2wADaoJiWwADaocAAkfDAANqiwAB2e8AA2qCYkcAA2qRLwADapIC/wADapMAAkfDAANqnwAB4nMAA2qfAAHj6wADap8AAePvAANqkn7zAANqgmJTAANqswABua8AA03bAAHk3wADarpiRwADar5+8wADar5ZAwADar5Y3wADar5YywADar5/BwADar5/CwADar2TAANqvgxfAANqvn7DAANqvgaXAANqvlj7AANqvlj/AANqvlinAANqvlj3AANqvnGLAANqvn7bAANqvgK3AANqvlRPAANqvg/jAANqvljrAANqvg1nAANqvgKvAANqvhInAANqvljDAANqvgdTAANqvljTAANqvljnAANqvljzAANqvljPAANqvVsAA2q+ApcAA2q+eysAA2q+fxMAA2q+ArsAA2q+Au8AA2q+WWsAA2q+GEcAA2q+fw8AA2q+W+MAA2q+W+8AA2q+fxsAA2q+bqcAA2q6Yl8AA2toAwADarpiUwADa3MAAbmvAANrcqG7AANrcgovAANrcmILAANrcXMAA2tyDGcAA2tyB6MAA2tyAw8AA2q6YlcAA2uWDGcAA2uWB6MAA03bAAHk4wADa6JiRwADa6Z+8wADa6cAAkfDAANrrwAB4nMAA2umDXsAA2umBWMAA2uiYl8AA2u8AwADTdsAAeTnAANrxmJbAANrywACR8MAA2vPAAHZ7wADa8ZiRwADa9UvAANr1gL/AANr1wACR8MAA2vjAAHicwADa+MAAeP/AANr4wAB5AMAA2vWfvMAA2vGYlMAA2v3AAG5rwADTdsAAeTrAANr/mJHAANsAn7zAANsAlkDAANsAljfAANsAljLAANsAn8HAANsAn8LAANsAZMAA2wCDF8AA2wCfsMAA2wCBpcAA2wCWPsAA2wCWP8AA2wCWKcAA2wCWPcAA2wCcYsAA2wCftsAA2wCArcAA2wCVE8AA2wCD+MAA2wCWOsAA2wCDWcAA2wCAq8AA2wCEicAA2wCWMMAA2wCB1MAA2wCWNMAA2wCWOcAA2wCWPMAA2wCWM8AA2wBWwADbAIClwADbAJ7KwADbAJ/EwADbAICuwADbAIC7wADbAJZawADbAIYRwADbAJ/DwADbAJb4wADbAJb7wADbAJ/GwADbAJupwADa/5iXwADbKwDAANr/mJTAANstwABua8AA2y2obsAA2y2Ci8AA2y2YgsAA2y1cwADbLYMZwADbLYHowADbLYDDwADa/5iVwADbNoMZwADbNoHowADTdsAAeTvAANs5mJHAANs6n7zAANs6wACR8MAA2zzAAHicwADbOoNewADbOoFYwADbOZiXwADbQADAANN2wAB5PMAA20KYlsAA20PAAJHwwADbRMAAdnvAANtCmJHAANtGS8AA20aAv8AA20bAAJHwwADbScAAeJzAANtJwAB5BMAA20nAAHkFwADbRp+8wADbQpiUwADbTsAAbmvAANN2wAB5PcAA21CYkcAA21GfvMAA21GWQMAA21GWN8AA21GWMsAA21GfwcAA21GfwsAA21FkwADbUYMXwADbUZ+wwADbUYGlwADbUZY+wADbUZY/wADbUZYpwADbUZY9wADbUZxiwADbUZ+2wADbUYCtwADbUZUTwADbUYP4wADbUZY6wADbUYNZwADbUYCrwADbUYSJwADbUZYwwADbUYHUwADbUZY0wADbUZY5wADbUZY8wADbUZYzwADbUVbAANtRgKXAANtRnsrAANtRn8TAANtRgK7AANtRgLvAANtRllrAANtRhhHAANtRn8PAANtRlvjAANtRlvvAANtRn8bAANtRm6nAANtQmJfAANt8AMAA21CYlMAA237AAG5rwADbfqhuwADbfoKLwADbfpiCwADbflzAANt+gxnAANt+gejAANt+gMPAANtQmJXAANuHgxnAANuHgejAANN2wAB5PsAA24qYkcAA24ufvMAA24vAAJHwwADbjcAAeJzAANuLg17AANuLgVjAANuKmJfAANuRAMAA03bAAHk/wADbk5iWwADblMAAkfDAANuVwAB2e8AA25OYkcAA25dLwADbl4C/wADbl8AAkfDAANuawAB4nMAA25rAAHkJwADbmsAAeQrAANuXn7zAANuTmJTAANufwABua8AA03bAAHlAwADboZiRwADbop+8wADbopZAwADbopY3wADbopYywADbop/BwADbop/CwADbomTAANuigxfAANuin7DAANuigaXAANuilj7AANuilj/AANuilinAANuilj3AANuinGLAANuin7bAANuigK3AANuilRPAANuig/jAANuiljrAANuig1nAANuigKvAANuihInAANuiljDAANuigdTAANuiljTAANuiljnAANuiljzAANuiljPAANuiVsAA26KApcAA26KeysAA26KfxMAA26KArsAA26KAu8AA26KWWsAA26KGEcAA26Kfw8AA26KW+MAA26KW+8AA26KfxsAA26KbqcAA26GYl8AA280AwADboZiUwADbz8AAbmvAANvPqG7AANvPgovAANvPmILAANvPXMAA28+DGcAA28+B6MAA28+Aw8AA26GYlcAA29iDGcAA29iB6MAA03bAAHlBwADb25iRwADb3J+8wADb3MAAkfDAANvewAB4nMAA29yDXsAA29yBWMAA29uYl8AA2+IAwADTdsAAeULAANvkmJbAANvlwACR8MAA2+bAAHZ7wADb5JiRwADb6EvAANvogL/AANvowACR8MAA2+vAAHicwADb68AAeQ7AANvrwAB5D8AA2+ifvMAA2+SYlMAA2/DAAG5rwADTdsAAeUPAANvymJHAANvzn7zAANvzlkDAANvzljfAANvzljLAANvzn8HAANvzn8LAANvzZMAA2/ODF8AA2/OfsMAA2/OBpcAA2/OWPsAA2/OWP8AA2/OWKcAA2/OWPcAA2/OcYsAA2/OftsAA2/OArcAA2/OVE8AA2/OD+MAA2/OWOsAA2/ODWcAA2/OAq8AA2/OEicAA2/OWMMAA2/OB1MAA2/OWNMAA2/OWOcAA2/OWPMAA2/OWM8AA2/NWwADb84ClwADb857KwADb85/EwADb84CuwADb84C7wADb85ZawADb84YRwADb85/DwADb85b4wADb85b7wADb85/GwADb85upwADb8piXwADcHgDAANvymJTAANwgwABua8AA3CCobsAA3CCCi8AA3CCYgsAA3CBcwADcIIMZwADcIIHowADcIIDDwADb8piVwADcKYMZwADcKYHowADTdsAAeUTAANwsmJHAANwtn7zAANwtwACR8MAA3C/AAHicwADcLYNewADcLYFYwADcLJiXwADcMwDAANN2wAB5RcAA3DWYlsAA3DbAAJHwwADcN8AAdnvAANw1mJHAANw5S8AA3DmAv8AA3DnAAJHwwADcPMAAeJzAANw8wAB5E8AA3DzAAHkUwADcOZ+8wADcNZiUwADcQcAAbmvAANN2wAB5RsAA3EOYkcAA3ESfvMAA3ESWQMAA3ESWN8AA3ESWMsAA3ESfwcAA3ESfwsAA3ERkwADcRIMXwADcRJ+wwADcRIGlwADcRJY+wADcRJY/wADcRJYpwADcRJY9wADcRJxiwADcRJ+2wADcRICtwADcRJUTwADcRIP4wADcRJY6wADcRINZwADcRICrwADcRISJwADcRJYwwADcRIHUwADcRJY0wADcRJY5wADcRJY8wADcRJYzwADcRFbAANxEgKXAANxEnsrAANxEn8TAANxEgK7AANxEgLvAANxEllrAANxEhhHAANxEn8PAANxElvjAANxElvvAANxEn8bAANxEm6nAANxDmJfAANxvAMAA3EOYlMAA3HHAAG5rwADccahuwADccYKLwADccZiCwADccVzAANxxgxnAANxxgejAANxxgMPAANxDmJXAANx6gxnAANx6gejAANN2wAB5R8AA3H2YkcAA3H6fvMAA3H7AAJHwwADcgMAAeJzAANx+g17AANx+gVjAANx9mJfAANyEAMAA03bAAHlIwADchpiWwADch8AAkfDAANyIwAB2e8AA3IaYkcAA3IpLwADcioC/wADcisAAkfDAANyNwAB4nMAA3I3AAHkYwADcjcAAeRnAANyKn7zAANyGmJTAANySwABua8AA03bAAHlJwADclJiRwADclZ+8wADclZZAwADclZY3wADclZYywADclZ/BwADclZ/CwADclWTAANyVgxfAANyVn7DAANyVgaXAANyVlj7AANyVlj/AANyVlinAANyVlj3AANyVnGLAANyVn7bAANyVgK3AANyVlRPAANyVg/jAANyVljrAANyVg1nAANyVgKvAANyVhInAANyVljDAANyVgdTAANyVljTAANyVljnAANyVljzAANyVljPAANyVVsAA3JWApcAA3JWeysAA3JWfxMAA3JWArsAA3JWAu8AA3JWWWsAA3JWGEcAA3JWfw8AA3JWW+MAA3JWW+8AA3JWfxsAA3JWbqcAA3JSYl8AA3MAAwADclJiUwADcwsAAbmvAANzCqG7AANzCgovAANzCmILAANzCXMAA3MKDGcAA3MKB6MAA3MKAw8AA3JSYlcAA3MuDGcAA3MuB6MAA03bAAHlKwADczpiRwADcz5+8wADcz8AAkfDAANzRwAB4nMAA3M+DXsAA3M+BWMAA3M6Yl8AA3NUAwADTdsAAeUvAANzXmJbAANzYwACR8MAA3NnAAHZ7wADc15iRwADc20vAANzbgL/AANzbwACR8MAA3N7AAHicwADc3sAAeR3AANzewAB5HsAA3NufvMAA3NeYlMAA3OPAAG5rwADTdsAAeUzAANzlmJHAANzmn7zAANzmwACR8MAA3OjAAHicwADc5pZAwADc5pY3wADc5pYywADc5p/BwADc5p/CwADc5mTAANzmgxfAANzmn7DAANzmg17AANzmgaXAANzmlj7AANzmlj/AANzmlinAANzmlj3AANzmnGLAANzmn7bAANzmgK3AANzmlRPAANzmg/jAANzmljrAANzmg1nAANzmgKvAANzmhInAANzmljDAANzmgdTAANzmljTAANzmljnAANzmljzAANzmljPAANzmVsAA3OaApcAA3OaeysAA3OafxMAA3OaArsAA3OaAu8AA3OaWWsAA3OaGEcAA3Oafw8AA3OaW+MAA3OaW+8AA3OaBWMAA3OafxsAA3OabqcAA3OWYl8AA3RUAwADc5ZiUwADdF8AAbmvAAN0XqG7AAN0XgovAAN0XmILAAN0XXMAA3ReDGcAA3ReB6MAA3ReAw8AA3OWYlcAA3SCDGcAA3SCB6MAA03bAAHlNwADdI5iWwADdJMAAkfDAAN0lwAB2e8AA3SOYkcAA3SdLwADdJ4C/wADdJ8AAkfDAAN0qwAB4nMAA3SrAAHkhwADdKsAAeSLAAN0nn7zAAN0jmJTAAN0vwABua8AA03bAAHlOwADdMZiRwADdMp+8wADdMsAAkfDAAN00wAB4nMAA3TKWQMAA3TKWN8AA3TKWMsAA3TKfwcAA3TKfwsAA3TJkwADdMoMXwADdMp+wwADdMoNewADdMoGlwADdMpY+wADdMpY/wADdMpYpwADdMpY9wADdMpxiwADdMp+2wADdMoCtwADdMpUTwADdMoP4wADdMpY6wADdMoNZwADdMoCrwADdMoSJwADdMpYwwADdMoHUwADdMpY0wADdMpY5wADdMpY8wADdMpYzwADdMlbAAN0y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33SWNMAA33SWOcAA33SWPMAA33SWM8AA33RWwADfdIClwADfdJ7KwADfdJ/EwADfdICuwADfdIC7wADfdJZawADfdIYRwADfdJ/DwADfdJb4wADfdJb7wADfdJ/GwADfdJupwADfc5iXwADfnwDAAN9zmJTAAN+hwABua8AA36GobsAA36GCi8AA36GYgsAA36FcwADfoYMZwADfoYHowADfoYDDwADfc5iVwADfqoMZwADfqoHowADTdsAAecvAAN+tmJHAAN+un7zAAN+uwACR8MAA37DAAHicwADfroNewADfroFYwADfrZiXwADftADAANN2wAB5zMAA37aYlsAA37fAAJHwwADfuIC1wADftpiRwADfukvAAN+6gL/AAN+6g17AAN+6wACR8MAA377AAHicwADfup+8wADftpiUwADfwcAAbmvAANN2wAB5zsAA38OYkcAA38SfvMAA38SWQMAA38SWN8AA38SWMsAA38SfwcAA38SfwsAA38RkwADfxIMXwADfxJ+wwADfxIGlwADfxJY+wADfxJY/wADfxJYpwADfxJY9wADfxJxiwADfxJ+2wADfxICtwADfxJUTwADfxIP4wADfxJY6wADfxINZwADfxICrwADfxISJwADfxJYwwADfxIHUwADfxJY0wADfxJY5wADfxJY8wADfxJYzwADfxFbAAN/EgKXAAN/EnsrAAN/En8TAAN/EgK7AAN/EgLvAAN/EllrAAN/EhhHAAN/En8PAAN/ElvjAAN/ElvvAAN/En8bAAN/Em6nAAN/DmJfAAN/vAMAA38OYlMAA3/HAAG5rwADf8ahuwADf8YKLwADf8ZiCwADf8VzAAN/xgxnAAN/xgejAAN/xgMPAAN/DmJXAAN/6gxnAAN/6gejAANN2wAB5z8AA3/2YkcAA3/6fvMAA3/7AAJHwwADgAMAAeJzAAN/+g17AAN/+gVjAAN/9mJfAAOAEAMAA03bAAHnQwADgBpiWwADgB8AAkfDAAOAIgLXAAOAGmJHAAOAKS8AA4AqAv8AA4ArAAJHwwADgDcAAeJzAAOAKn7zAAOAGmJTAAOAQwABua8AA03bAAHnSwADgEpiRwADgE5+8wADgE5ZAwADgE5Y3wADgE5YywADgE5/BwADgE5/CwADgE2TAAOATgxfAAOATn7DAAOATgaXAAOATlj7AAOAT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z4MZwADhz4HowADhz4DDwADhnZiVwADh2IMZwADh2IHowADTdsAAeefAAOHbmJbAAOHcwACR8MAA4d2AtcAA4duYkcAA4d9LwADh34C/wADh38AAkfDAAOHiwAB4nMAA4d+fvMAA4duYlMAA4eXAAG5rwADTdsAAeenAAOHnmJHAAOHon7zAAOHowACR8MAA4erAAHicwADh6JZAwADh6JY3wADh6JYywADh6J/BwADh6J/CwADh6GTAAOHogxfAAOHon7DAAOHog17AAOHogaXAAOHolj7AAOHolj/AAOHolinAAOHolj3AAOHonGLAAOHon7bAAOHogK3AAOHolRPAAOHog/jAAOHoljrAAOHog1nAAOHogKvAAOHohInAAOHoljDAAOHogdTAAOHoljTAAOHoljnAAOHoljzAAOHoljPAAOHoVsAA4eiApcAA4eieysAA4eifxMAA4eiArsAA4eiAu8AA4eiWWsAA4eiGEcAA4eifw8AA4eiW+MAA4eiW+8AA4eiBWMAA4eifxsAA4eibqcAA4eeYl8AA4hcAwADh55iUwADiGcAAbmvAAOIZqG7AAOIZgovAAOIZmILAAOIZXMAA4hmDGcAA4hmB6MAA4hmAw8AA4eeYlcAA4iKDGcAA4iKB6MAA03bAAHnqwADiJZiWwADiJsAAkfDAAOIngLXAAOIlmJHAAOIpS8AA4imAv8AA4inAAJHwwADiLMAAeJzAAOIpn7zAAOIlmJTAAOIvwABua8AA03bAAHnswADiMZiRwADiMp+8wADiMsAAkfDAAOI0wAB4nMAA4jKWQMAA4jKWN8AA4jKWMsAA4jKfwcAA4jKfwsAA4jJkwADiMoMXwADiMp+wwADiMoNewADiMoGlwADiMpY+wADiMpY/wADiMpYpwADiMpY9wADiMpxiwADiMp+2wADiMoCtwADiMpUTwADiMoP4wADiMpY6wADiMoNZwADiMoCrwADiMoSJwADiMpYwwADiMoHUwADiMpY0wADiMpY5wADiMpY8wADiMpYzwADiMlbAAOIygKXAAOIynsrAAOIyn8TAAOIygK7AAOIygLvAAOIyllrAAOIyhhHAAOIyn8PAAOIylvjAAOIylvvAAOIygVjAAOIyn8bAAOIym6nAAOIxmJfAAOJhAMAA4jGYlMAA4mPAAG5rwADiY6huwADiY4KLwADiY5iCwADiY1zAAOJjgxnAAOJjgejAAOJjgMPAAOIxmJXAAOJsgxnAAOJsgejAANN2wAB57cAA4m+YlsAA4nDAAJHwwADicYC1wADib5iRwADic0vAAOJzgL/AAOJzwACR8MAA4nbAAHicwADic5+8wADib5iUwADiecAAbmvAANN2wAB578AA4nuYlsAA4nzAAJHwwADifYC1wADie5iUwADif4KLwADif8AAbhDAAOJ/wABua8AA4n/AAJHwwADig8AAebXAAOJ/qG7AAOJ/YcAA4nuYkcAA4ofAAHnxwADih8AAefLAAOKHwAB588AA4ofAAHn0wADih8AAefXAAOKHwAB59sAA4ofAAERnwADih8AARMPAAOKHwAB598AA4ofAAHn4wADih8AAbhbAAOKHwABuE8AA4ofAAHn5wADih8AAefrAAOKHwAB5+8AA4ofAAHn8wADih8AAef3AAOKHwAB5/sAA4ofAAETEwADih8AARGbAAOKHwAB5/8AA4ofAAHoAwADTdsAAdl7AAOKemJTAAOKfwABuEMAA4p6YkcAA4qGYJMAA4qHAAHiowADiocAAeKnAAOKhwAB4q8AA4qHAAHiqwADiocAAeK3AAOKhwAB4rMAA4qHAAHivwADiocAAeK7AAOKhwAB4s8AA4qHAAHiwwADiocAAeLHAAOKhwAB4ssAA4qHAAHi0wADiocAAbhLAAOKemJfAAOKxAMAA03bAAHZfwADis5iUwADitMAAbmvAAOK0qG7AAOK0wABuEMAA4rSCi8AA4rOYl8AA4rkAwADTdsAAegHAAOK7mJHAAOK8ZMAA4ruYl8AA4r4AwADTdsAAegLAAOLAmJHAAOLBZMAA4sCYl8AA4sMAwADTdsAAegPAAOLFmJPAAOLGwACR8MAA4sfAAHoEwADixsAAegXAAOLGwAB6BsAA4saWVsAA4sWYl8AA4szAAJHwwADizYC1wADTdsAAegfAAOLPmJbAAOLQwACR8MAA4tHAAHoIwADi0ADAAOLQwABI/sAA4s+YkcAA4tXAAHnxwADi1cAAefLAAOLVwAB588AA4tXAAHn0wADi1cAAefXAAOLVwAB59sAA4tXAAERnwADi1cAARMPAAOLVwAB598AA4tXAAHn4wADi1cAAbhbAAOLVwABuE8AA4tXAAHn5wADi1cAAefrAAOLVwAB5+8AA4tXAAHn8wADi1cAAef3AAOLVwAB5/sAA4tXAAETEwADi1cAARGbAANN2wAB6CsAA4uqYk8AA4uvAAHoLwADi6piWwADi7QDAAOLtwAB3BcAA4u3AAEj+wADi6piRwADi8YFYwADTdofEwADi85iTwADi9MAAegvAAOLzmJbAAOL2AMAA4vbAAHcFwADi9sAASP7AAOLzmJHAAOL6ZMAA4vqBWMAA03bAAHoOwADi/ZiTwADi/sAAegvAAOL9mJbAAOMAAMAA4wDAAHcFwADjAMAASP7AAOL9mJHAAOMEgVjAANN2wAB6EMAA4waYk8AA4wfAAHoLwADjBpiWwADjCQDAAOMJwAB3BcAA4wnAAEj+wADjBpiRwADjDYFYwADTdp8mwADjD5iTwADjEMAAegvAAOMPmJbAAOMSAMAA4xLAAHcFwADjEsAASP7AAOMPmJHAAOMWgVjAANN2wAB0/MAA4xiYk8AA4xnAAHoLwADjGJiWwADjGwDAAOMbwAB3BcAA4xvAAEj+wADjGJiRwADjH4FYwADTdp8nwADjIZiTwADjIsAAegvAAOMhmJbAAOMkAMAA4yTAAHcFwADjJMAASP7AAOMhmJHAAOMogVjAANN2wAB6FcAA4yqYk8AA4yvAAHoLwADjKpiWwADjLQDAAOMtwAB3BcAA4y3AAEj+wADjKpiRwADjMYFYwADTdsAAehfAAOMzmJPAAOM0wAB6C8AA4zOYlsAA4zYAwADjNsAAdwXAAOM2wABI/sAA4zOYkcAA4zqBWMAA03bAAHoZwADjPJiTwADjPcAAegvAAOM8mJbAAOM/AMAA4z/AAHcFwADjP8AASP7AAOM8mJHAAONDgVjAANN2wAB6G8AA40WYk8AA40bAAHoLwADjRZiWwADjSADAAONIwAB3BcAA40jAAEj+wADjRZiRwADjTIFYwADTdsAAeh3AAONOmJPAAONPwAB6C8AA406YlsAA41EAwADjUcAAdwXAAONRwABI/sAA406YkcAA41VkwADjVYFYwADTdsAAeh/AAONYmJPAAONZwAB6C8AA41iYlsAA41sAwADjW8AAdwXAAONbwABI/sAA41iYkcAA419kwADjX4FYwADTdsAAeiHAAONimJPAAONjwAB6C8AA42KYlsAA42UAwADjZcAAdwXAAONlwABI/sAA42KYkcAA42lkwADjaYFYwADTdsAAeiPAAONsmJPAAONtwAB6JMAA423AAHolwADjbcAAeibAAONtwAB6J8AA423AAHoowADjbcAAeinAAONtwAB6KsAA423AAHorwADjbcAAeizAAONtwAB6LcAA423AAHouwADjbcAAei/AAONtwAB6MMAA423AAHoxwADjbcAAejLAAONtwAB6M8AA423AAHo0wADjbcAAejXAAONtwAB6NsAA423AAHo3wADjbcAAejjAAONtwAB6OcAA423AAHo6wADjbcAAejvAAONtwAB6PMAA423AAHo9wADjbcAAej7AAONtwAB6P8AA423AAHpAwADjbcAAekHAAONtwAB6QsAA423AAHpDwADjbcAAekTAAONtwAB6RcAA423AAHpGwADjbcAAekfAAONtwAB6SMAA423AAHpJwADjbcAAekrAAONtwAB6S8AA423AAHpMwADjbcAAek3AAONtwAB6TsAA423AAHpPwADjbcAAelDAAONtwAB6UcAA423AAHpSwADjbcAAelPAAONtwAB6VMAA423AAHpVwADjbcAAelbAAONtwAB6V8AA423AAHpYwADjbcAAelnAAONtwAB6WsAA423AAHpbwADjbcAAelzAAONtwAB6XcAA423AAHpewADjbcAAel/AAONtwAB6YMAA423AAHphwADjbcAAemLAAONtwAB6Y8AA423AAHpkwADjbcAAemXAAONtwAB6ZsAA423AAHpnwADjbcAAemjAAONtwAB6acAA423AAHpqwADjbcAAemvAAONtwAB6bMAA423AAHptwADjbcAAem7AAONtwAB6b8AA423AAHpwwADjbcAAenHAAONtwAB6csAA423AAHpzwADjbcAAenTAAONtwAB6dcAA423AAHp2wADjbcAAenfAAONtwAB6eMAA423AAHp5wADjbcAAenrAAONtwAB6e8AA423AAHp8wADjbcAAen3AAONtwAB6fsAA423AAHp/wADjbcAAeoDAAONtwAB6gcAA423AAHqCwADjbcAAeoPAAONtwAB6hMAA423AAHqFwADjbcAAeobAAONtwAB6h8AA423AAHqIwADjbcAAeonAAONtwAB6isAA423AAHqLwADjbcAAeozAAONtwAB6jcAA423AAHqOwADjbcAAeo/AAONtwAB6kMAA423AAHqRwADjbcAAepLAAONtwAB6k8AA423AAHqUwADjbcAAepXAAONtwAB6lsAA423AAHqXwADjbcAAepjAAONtwAB6mcAA423AAHqawADjbcAAepvAAONtwAB6nMAA423AAHqdwADjbcAAep7AAONtwAB6n8AA423AAHqgwADjbcAAeqHAAONtwAB6osAA423AAHqjwADjbcAAeqTAAONtwAB6pcAA423AAHqmwADjbcAAeqfAAONtwAB6qMAA423AAHqpwADjbcAAeqrAAONtwAB6q8AA423AAHqswADjbcAAeq3AAONtwAB6rsAA423AAHqvwADjbcAAerDAAONtwAB6scAA423AAHqywADjbcAAerPAAONtwAB6tMAA423AAHq1wADjbcAAerbAAONtwAB6t8AA423AAHq4wADjbcAAernAAONtwAB6usAA423AAHq7wADjbcAAerzAAONtwAB6vcAA423AAHq+wADjbcAAer/AAONtwAB6wMAA423AAHrBwADjbcAAesLAAONtwAB6w8AA423AAHrEwADjbcAAesXAAONtwAB6xsAA423AAHrHwADjbcAAesjAAONtwAB6ycAA423AAHrKwADjbcAAesvAAONtwAB6zMAA423AAHrNwADjbcAAes7AAONtwAB6z8AA423AAHrQwADjbcAAetHAAONtwAB60sAA423AAHrTwADjbcAAetTAAONtwAB61cAA423AAHrWwADjbcAAetfAAONtwAB62MAA423AAHrZwADjbcAAetrAAONtwAB628AA423AAHrcwADjbcAAet3AAONtwAB63sAA423AAHrfwADjbcAAeuDAAONtwAB64cAA423AAHriwADjbcAAeuPAAONtwAB65MAA423AAHrlwADjbcAAeubAAONtwAB658AA423AAHrowADjbcAAeunAAONtwAB66sAA423AAHrrwADjbcAAeuzAAONtwAB67cAA423AAHruwADjbcAAeu/AAONtwAB68MAA423AAHrxwADjbcAAevLAAONtwAB688AA423AAHr0wADjbcAAevXAAONtwAB69sAA423AAHr3wADjbcAAevjAAONtwAB6+cAA423AAHr6wADjbcAAevvAAONtwAB6/MAA423AAHr9wADjbcAAev7AAONtwAB6/8AA423AAHsAwADjbcAAewHAAONtwAB7AsAA423AAHsDwADjbcAAewTAAONtwAB7BcAA423AAHsGwADjbcAAewfAAONtwAB7CMAA423AAHsJwADjbcAAewrAAONtwAB7C8AA423AAHsMwADjbcAAew3AAONtwAB7DsAA423AAHsPwADjbcAAexDAAONtwAB7EcAA423AAHsSwADjbcAAexPAAONtwAB7FMAA423AAHsVwADjbcAAexbAAONtwAB7F8AA423AAHsYwADjbcAAexnAAONtwAB7GsAA423AAHsbwADjbcAAexzAAONtwAB7HcAA423AAHsewADjbcAAex/AAONtwAB7IMAA423AAHshwADjbcAAeyLAAONtwAB7I8AA42yYlsAA5G4AwADkbsAAeyXAAORuwAB7J8AA5G7AAHspwADkbsAAeyvAAONsmJHAAOR0ZMAA5HSBxMAA5HSBjcAA5HSDiMAA5HRQwADkdJWmwADkdMAAeVnAAOR0laHAAOR0wAB5XMAA5HTAAEEdwADkdMAAeV/AAOR0wAB5YcAA5HSXyMAA5HTAAHlkwADkdJ+wwADkdMAAeW3AAOR0wAB5cMAA5HTAAHlywADkdMAAeXTAAOR0wAB5dsAA5HScp8AA5HTAAEjDwADkdMAAd33AAOR0wAB5e8AA5HTAAHl9wADjbJiUwADkjoN7wADkjrvuwADkjsAAR/DAAOSOwABrmsAA5I7AAHlqwADTdsAAey3AAOSUmJPAAOSVwAB6JMAA5JXAAHolwADklcAAeibAAOSVwAB6J8AA5JXAAHoowADklcAAeinAAOSVwAB6KsAA5JXAAHorwADklcAAeizAAOSVwAB6LcAA5JXAAHouwADklcAAei/AAOSVwAB6MMAA5JXAAHoxwADklcAAejLAAOSVwAB6M8AA5JXAAHo0wADklcAAejXAAOSVwAB6NsAA5JXAAHo3wADklcAAejjAAOSVwAB6OcAA5JXAAHo6wADklcAAejvAAOSVwAB6PMAA5JXAAHo9wADklcAAej7AAOSVwAB6P8AA5JXAAHpAwADklcAAekHAAOSVwAB6QsAA5JXAAHpDwADklcAAekTAAOSVwAB6RcAA5JXAAHpGwADklcAAekfAAOSVwAB6SMAA5JXAAHpJwADklcAAekrAAOSVwAB6S8AA5JXAAHpMwADklcAAek3AAOSVwAB6TsAA5JXAAHpPwADklcAAelDAAOSVwAB6UcAA5JXAAHpSwADklcAAelPAAOSVwAB6VMAA5JXAAHpVwADklcAAelbAAOSVwAB6V8AA5JXAAHpYwADklcAAelnAAOSVwAB6WsAA5JXAAHpbwADklcAAelzAAOSVwAB6XcAA5JXAAHpewADklcAAel/AAOSVwAB6YMAA5JXAAHphwADklcAAemLAAOSVwAB6Y8AA5JXAAHpkwADklcAAemXAAOSVwAB6ZsAA5JXAAHpnwADklcAAemjAAOSVwAB6acAA5JXAAHpqwADklcAAemvAAOSVwAB6bMAA5JXAAHptwADklcAAem7AAOSVwAB6b8AA5JXAAHpwwADklcAAenHAAOSVwAB6csAA5JXAAHpzwADklcAAenTAAOSVwAB6dcAA5JXAAHp2wADklcAAenfAAOSVwAB6eMAA5JXAAHp5wADklcAAenrAAOSVwAB6e8AA5JXAAHp8wADklcAAen3AAOSVwAB6fsAA5JXAAHp/wADklcAAeoDAAOSVwAB6gcAA5JXAAHqCwADklcAAeoPAAOSVwAB6hMAA5JXAAHqFwADklcAAeobAAOSVwAB6h8AA5JXAAHqIwADklcAAeonAAOSVwAB6isAA5JXAAHqLwADklcAAeozAAOSVwAB6jcAA5JXAAHqOwADklcAAeo/AAOSVwAB6kMAA5JXAAHqRwADklcAAepLAAOSVwAB6k8AA5JXAAHqUwADklcAAepXAAOSVwAB6lsAA5JXAAHqXwADklcAAepjAAOSVwAB6mcAA5JXAAHqawADklcAAepvAAOSVwAB6nMAA5JXAAHqdwADklcAAep7AAOSVwAB6n8AA5JXAAHqgwADklcAAeqHAAOSVwAB6osAA5JXAAHqjwADklcAAeqTAAOSVwAB6pcAA5JXAAHqmwADklcAAeqfAAOSVwAB6qMAA5JXAAHqpwADklcAAeqrAAOSVwAB6q8AA5JXAAHqswADklcAAeq3AAOSVwAB6rsAA5JXAAHqvwADklcAAerDAAOSVwAB6scAA5JXAAHqywADklcAAerPAAOSVwAB6tMAA5JXAAHq1wADklcAAerbAAOSVwAB6t8AA5JXAAHq4wADklcAAernAAOSVwAB6usAA5JXAAHq7wADklcAAerzAAOSVwAB6vcAA5JXAAHq+wADklcAAer/AAOSVwAB6wMAA5JXAAHrBwADklcAAesLAAOSVwAB6w8AA5JXAAHrEwADklcAAesXAAOSVwAB6xsAA5JXAAHrHwADklcAAesjAAOSVwAB6ycAA5JXAAHrKwADklcAAesvAAOSVwAB6zMAA5JXAAHrNwADklcAAes7AAOSVwAB6z8AA5JXAAHrQwADklcAAetHAAOSVwAB60sAA5JXAAHrTwADklcAAetTAAOSVwAB61cAA5JXAAHrWwADklcAAetfAAOSVwAB62MAA5JXAAHrZwADklcAAetrAAOSVwAB628AA5JXAAHrcwADklcAAet3AAOSVwAB63sAA5JXAAHrfwADklcAAeuDAAOSVwAB64cAA5JXAAHriwADklcAAeuPAAOSVwAB65MAA5JXAAHrlwADklcAAeubAAOSVwAB658AA5JXAAHrowADklcAAeunAAOSVwAB66sAA5JXAAHrrwADklcAAeuzAAOSVwAB67cAA5JXAAHruwADklcAAeu/AAOSVwAB68MAA5JXAAHrxwADklcAAevLAAOSVwAB688AA5JXAAHr0wADklcAAevXAAOSVwAB69sAA5JXAAHr3wADklcAAevjAAOSVwAB6+cAA5JXAAHr6wADklcAAevvAAOSVwAB6/MAA5JXAAHr9wADklcAAev7AAOSVwAB6/8AA5JXAAHsAwADklcAAewHAAOSVwAB7AsAA5JXAAHsDwADklcAAewTAAOSVwAB7BcAA5JXAAHsGwADklcAAewfAAOSVwAB7CMAA5JXAAHsJwADklcAAewrAAOSVwAB7C8AA5JXAAHsMwADklcAAew3AAOSVwAB7DsAA5JXAAHsPwADklcAAexDAAOSVwAB7EcAA5JXAAHsSwADklcAAexPAAOSVwAB7FMAA5JXAAHsVwADklcAAexbAAOSVwAB7F8AA5JXAAHsYwADklcAAexnAAOSVwAB7GsAA5JXAAHsbwADklcAAexzAAOSVwAB7HcAA5JXAAHsewADklcAAex/AAOSVwAB7IMAA5JXAAHshwADklcAAeyLAAOSVwAB7I8AA5JSYlsAA5ZYAwADllpvCwADllsAAezDAAOSUmJHAAOWagQbAAOWag3fAAOWag7vAAOWaZMAA5ZqBjcAA5ZqfsMAA5ZrAAHltwADlmsAAeXDAAOWawAB5csAA5ZrA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wADnMsAAeJzAAOctmJfAAOc0AMAA03bAAHtUwADnNpiXwADnNwDAAOc2mJTAAOc5wACR8MAA5zqXFMAA5zq2l8AA5zlhwADnOcAAbmvAAOc5qG7AAOc5wABuEMAA5zmCi8AA5zaYkcAA50JLwADnQsAAkfDAAOdEwAB4nMAA50KBWMAA03bAAHtVwADnR5iTwADnSMAAkfDAAOdJlxTAAOdHmJHAAOdLwACR8MAA50zAAHicwADnR5iXwADnTgDAANN2wAB7VsAA51CYl8AA51EAwADnUJiUwADnU8AAkfDAAOdUlxTAAOdUtpfAAOdTYcAA51PAAG5rwADnU6huwADnU8AAbhDAAOdTgovAAOdQmJHAAOdcS8AA51zAAJHwwADnXsAAeJzAAOdcgVjAANN2wAB7V8AA52GYk8AA52LAAJHwwADnY5cUwADnYZiRwADnZcAAkfDAAOdmwAB4nMAA52GYl8AA52gAwADTdsAAe1jAAOdqmJfAAOdrAMAA52qYlMAA523AAJHwwADnbpcUwADnbraXwADnbWHAAOdtwABua8AA522obsAA523AAG4QwADnbYKLwADnapiRwADndkvAAOd2wACR8MAA53jAAHicwADndoFYwADTdsAAe1nAAOd7mJPAAOd8wACR8MAA532XFMAA53uYkcAA53/AAJHwwADngMAAeJzAAOd7mJfAAOeCAADAAJHxwADnhJiTwADnhcAAkfHAAOeGwAB74cAA54bAAHvgwADnhsAAfCLAAOeGwAB748AA54bAAHviwADnhsAAfCPAAOeGwAB8JMAA54bAAHwlwADnhsAAfCbAAOeGwAB8KcAA54bAAHwqwADnhsAAfCvAAOeGwAB8LMAA54bAAG0YwADnhsAAbRnAAOeGwAB8LcAA54bAAHwuwADnhsAAfC/AAOeGwAB8MMAA54bAAHwxwADnhsAAfDLAAOeGwAB8M8AA54bAAHw0wADnhsAAfDXAAOeGwAB8NsAA54bAAHw3wADnhsAAfDjAAOeGwAB8OcAA54bAAHw6wADnhsAAfDvAAOeGwAB8PMAA54bAAHw9wADnhcAAfCfAAOeFwAB8KMAA54XAAHw+wADnhJiRwADnqsAAkfHAAOerwAB8QMAA56vAAHxCwADnq8AAfEPAAOerwABfMMAA56vAAHxFwADnq8AAfEnAAOer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XsAA7hGArMAA7hHAAICkwADuEcAAgJ3AAO4MmJHAAO4XwABMFMAA7hiItcAA7hjAAICrwADuGMAAgK3AAO4YwACAr8AA7hjAAICxwADuGJxbwADuGMAAgLTAAO4YwACAtsAA7hjAAIC4wADuGMAAgMjAAO4YwACAysAA7hjAAIC/wADuGMAAgMDAAO4Xg5vAAO4Xg5zAAO4XwAB7dsAA7hfAAHwcwADuF8AAfKfAAO4Xrc/AAO4XwACAocAA7hfAAICjwADuF4NbwADuF8AAbMXAAO4XI8AA7gyYlcAA7jFewADuDJiXwADuMwDAAO4zwACAmsAA6fnAAIDOwADuNpiWwADuNwDAAO42mJHAAO45wAB+QMAA6fnAAIDPwADuO5iTwADuPMAAgNDAAO48wACA0cAA7jzAAIDSwADuPMAAgNPAAO48wACA1MAA7jzAAIDVwADuPMAAgNbAAO48wACA18AA7jzAAIDYwADuPMAAgKjAAO48wABsxsAA7jzAAIClwADuPMAAXhDAAO48wACA2cAA7jzAAIDawADuPMAARnbAAO48wABMFMAA7k3AAIDbwADuPMAAfxfAAO47mJHAAO5QwABMFMAA7lHAAH/0wADuUcAAgNzAAO5QwABuysAA7lDAAG7LwADuUMAAbszAAO5Qg7DAAO5QgojAAO5QgcXAAO47mJTAAO5agfXAAO47mJfAAO5cAMAA6fnAAIDhwADuXpiTwADuX8AATBTAAO5gwACA4sAA7mDAAIDjwADuYMAAgOTAAO5gwACA5cAA7mDAAIDmwADuXpiXwADuZgDAAOn5wACA58AA7miYkcAA7mnAAEwUwADuasAAgOjAAO5qwABvB8AA7miYl8AA7m0AwADp+QjAAO5vmJPAAO5wnmvAAO5wwACA7MAA7nCCisAA7nDAAIDuwADucMAAZG/AAO5wwACA8MAA7nDAAIDywADucMAAgPPAAO5wwACA9cAA7nDAAID2wADucMAATBTAAO57wAB+kMAA7m+Yl8AA7n3AAEwUwADufoZVwADp+cAAgPjAAO6AmJPAAO6BwAB/RcAA7oHAAID5wADugcAAgPvAAO6BwACA/MAA7oHAAID+wADugcAAgP/AAO6BwACBAcAA7oHAAIECwADugcAATBTAAO6KkibAAO6AmJfAAO6MwABMFMAA7o2GVcAA6fkHwADuj5iWwADukADAAO6Qlu3AAO6QwACAmsAA7o+YkcAA7pTAAHt2wADulMAAfBzAAO6UwACAocAA7pTAAICjwADulJzrwADulMAAgQXAAO6UYcAA7pSDnsAA7pTAAIEGwADulMAAgQfAAO6UwACBCMAA7pTAAIEJwADulMAAgQrAAO6UwACBC8AA7pTAAIEMwADulMAAgQ3AAO6UpRfAAO6Ugb7AAO6UwACBDsAA7pSEP8AA7pSHwMAA7pSENcAA7pSHwcAA7pTAAFvswADulMAAgQ/AAO6UwACBEMAA7pTAAHt3wADulK3EwADulMAAgRHAAO6UhEXAAO6PmJTAAO6zwACApMAA7rNOwADp+cAAgRLAAO62mJHAAO63gojAAO63gcHAAO63hvrAAO63wACBE8AA7reea8AA7rfAAIAswADut8AAfkjAAO63g6DAAO63hunAAO63wACBFMAA7rfAAH5LwADut4OMwADut4G5wADut4HAwADut4GxwADut8AAgRXAAO63wAB+TsAA7rfAAIEWwADut8AASx/AAO63wACBF8AA7rdhwADut4OewADut4RBwADut8AAgRjAAO63wAB+U8AA7rfAAIEZwADut8AAgRrAAO63wACBG8AA7rcjwADutpiUwADu1U7AAO62mJfAAO7XAMAA6fmCIcAA7tmYk8AA7toiwADu2k7AAO7ag0fAAO7ZmJHAAO7eI8AA7tmYl8AA7uAAwADp+cAAgR3AAO7imJPAAO7jwABMFMAA7uTAAG7+wADu5MAAfo/AAO7kwACBHsAA7uTAAHGwwADu5MAARBfAAO7kwACBH8AA7uTAAIEgwADu5MAAgSHAAO7ku57AAO7kwACBIsAA7uKYkcAA7u+B+cAA7u/AAEwUwADu8cAAgSTAAO7xwACBJsAA7vHAAIElwADu8aRWwADu4piXwADu9gDAAO72wACBI8AA6fnAAIEswADu+ZiTwADu+sAATBTAAO77wACBLcAA7vvAAIEuwADu+ZiRwADu/pwQwADu/oKIwADu+ZiXwADvAQDAAO8BwACBL8AA6fnAAIExwADvBJiTwADvBcAATBTAAO8GwAB+j8AA7wbAAICnwADvBJiUwADvCU7AAO8JwACApMAA7wSYkcAA7wzAAEwUwADvDcAAfn/AAO8NwACBMsAA7w3AAICxwADvDZxbwADvDcAAgTjAAO8NwACBOsAA7w3AAIDIwADvDcAAgLTAAO8NwACBPsAA7w3AAIDKwADvDcAAgLbAAO8NwACBQ8AA7w3AAIFGwADvDcAAgUvAAO8NwACBTsAA7w3AAIFSwADvDcAAgVbAAO8NwACBWcAA7w3AAHTwwADvDcAAgV3AAO8NwACBX8AA7w3AAIFjwADvDIObwADvDIOcwADvDMAAe3bAAO8MwAB8HMAA7wzAAIChwADvDMAAgKPAAO8MnOvAAO8MwACBBcAA7wylF8AA7wxhwADvDIOewADvDMAAgQbAAO8MwACBB8AA7wzAAIEIwADvDMAAgQnAAO8MwACBCsAA7wzAAIELwADvDMAAgQzAAO8MwACBDcAA7wyBvsAA7wzAAIEOwADvDIQ/wADvDIfAwADvDIQ1wADvDIfBwADvDMAAW+zAAO8MwACBD8AA7wzAAIEQwADvDMAAe3fAAO8MrcTAAO8MwACBEcAA7wyERcAA7wwjwADvDMAAgWbAAO8EmJfAAO9GAMAA70bAAICawADp+cAAgWfAAO9JmJbAAO9KAMAA70mYkcAA70zAAH5AwADvTIKIwADvTIb6wADvTJ5rwADvTMAAfkjAAO9MhunAAO9MwAB+S8AA70yBscAA70zAAH5OwADvTMAASx/AAO9MYcAA70yEQcAA70zAAH5TwADp+cAAgWjAAO9amJPAAO9bwABMFMAA71zAAIFpwADvXMAAgWrAAO9cwACBa8AA71zAAH6NwADvXMAAgNvAAO9bTsAA71vAAIFswADvW8AARnbAAO9amJHAAO9lwABMFMAA72bAAIFuwADvZsAAgW3AAO9mwACBgMAA72bAAH/0wADvZsAAgXHAAO9mwACANcAA72WCiMAA72WBwcAA72WG+sAA72XAAIETwADvZZ5rwADvZcAAgCzAAO9lwAB+SMAA72WDoMAA72WG6cAA72XAAIEUwADvZcAAfkvAAO9lg4zAAO9lgbnAAO9lgcDAAO9lgbHAAO9lwACBFcAA72XAAH5OwADvZcAAgRbAAO9lwABLH8AA72XAAIEXwADvZWHAAO9lg57AAO9lhEHAAO9lwACBGMAA72XAAH5TwADvZcAAgRrAAO9lwACBGcAA72XAAIEbwADvWpiXwADviQDAAOn5wACBhsAA74uYk8AA74yBu8AA74zAAIGHwADvjMAAgYnAAO+MwACBisAA74yWI8AA74zAAIGMwADvjJxhwADvjMAAdYnAAO+MwABMFMAA75XAAIGOwADvlZImwADvi5iRwADvmMAATBTAAO+ZwACBj8AA75gjwADvi5iXwADvnMAATBTAAO+dhlXAAOn5wACBkMAA75+Yk8AA76DAAEwUwADvoZImwADvocAAgZHAAO+hwACBksAA76HAAIGTwADvocAAfpDAAO+hp6XAAO+hwACBlMAA76CtksAA76DAAHyxwADvoMAAgZXAAO+ggpDAAO+ggb/AAO+gmIDAAO+fmJHAAO+vwABMFMAA77DAAIGXwADvsMAAgZrAAO+wwACBm8AA76/AAIGZwADvr8AASPzAAO+vI8AA76/AAIGhwADvn5iXwADvuMAATBTAAO+5hlXAAO+5wACBlsAA6fmCIMAA77yYk8AA773AAEwUwADvvsAAfo/AAO++wACAp8AA777AAIGuwADvvsAAgbDAAO+8mJTAAO/DTsAA78OArMAA78ODO8AA78PAAICkwADvw8AATBTAAO/IwACAwsAA78jAAIG7wADvw8AAgcDAAO/DhFLAAO+8mJHAAO/Ng5vAAO/Ng5zAAO/NwACAocAA783AAICjwADvzcAAgJ/AAO/NwACAoMAA783AAEj8wADvzcAAgZnAAO/NwABGXMAA783AAHwewADvzcAAb5bAAO/NwABMFMAA79nAAIDIwADv2cAAgMrAAO/ZwACBtsAA79nAAIG8wADv2cAAgcLAAO/ZwACBw8AA79nAAIHEwADv2cAAgcjAAO/ZwACBy8AA79nAAIHOwADv2cAAgdDAAO/ZwACB0sAA79nAAIHXwADv2cAAgdnAAO/ZwACB28AA79nAAIHdwADv2cAAgd/AAO/ZwACB4MAA79nAAIHhwADvzZwuwADvzcAAgb7AAO/NgpDAAO/NwACBxsAA783AAIHHwADvzcAAgcnAAO/NTcAA783AAIHKwADvzcAAgczAAO/NwACBzcAA783AAIHUwADvvJiXwADv+ADAAOn5wACB4sAA7/qYk8AA7/vAAHt2wADv+8AAgePAAO/7wACB5cAA7/vAAIHmwADv+8AARlzAAO/7wACB6MAA7/vAAIHqwADv+8AAgevAAO/7nerAAO/7sJzAAO/7wABMFMAA8AbAAIHuwADwBsAAge/AAPAGwACB8MAA7/uCkMAA7/tOwADv+03AAO/6mJfAAPANwABMFMAA8A6AtcAA6fnAAIHxwADwEJiRwADwESPAAPAQmJfAAPATwABMFMAA8BSAtcAA6fnAAIHzwADwFpiTwADwF8AAgfTAAPAWmJHAAPAZI8AA8BaYl8AA8BvAAEwUwADwHIC1wADp+cAAgffAAPAemJHAAPAfI8AA8B6Yl8AA8CHAAEwUwADwIoC1wADp+cAAgfnAAPAkmJPAAPAlwABercAA8CSYkcAA8CcjwADwJJiXwADwKcAATBTAAPAqgLXAAOn5wACB/MAA8CyYk8AA8C3AAEwUwADwLsAAcYXAAPAuwAB+WMAA8C7AAH6PwADwLsAAbiXAAPAuwACB/cAA8C7AAH5cwADwLsAAgf7AAPAsmJHAAPA2wABMFMAA8DfAAH5dwADwN8AAfoHAAPA3wABwAMAA8DfAAH5ZwADwN8AAflrAAPA3wAB+W8AA8DfAAIICwADwN8AAggPAAPA3wACCBMAA8DfAAIIKwADwN8AAggzAAPA3wACCDsAA8DfAAIIQwADwN8AAghPAAPA3wACCFcAA8DekS8AA8CyYlMAA8EjAAEwUwADwScAAb7TAAPBIgmTAAPAsmJfAAPBMwABMFMAA8E2AtcAA6fnAAIIYwADwT5iTwADwUIKQwADwULNVwADwUMAATBTAAPBTp6bAAPBTwACCGcAA8FPAAIIawADwT5iUwADwV4C9wADwV8AAdHPAAPBXwACCHMAA8FfAAIIdwADwT5iRwADwXMAAgh7AAPBPmJfAAPBeAMAA6fnAAIIfwADwYJiTwADwYcAAf1nAAPBhwACCIMAA8GHAAIIhwADwYcAAgiLAAPBhwACCI8AA8GHAAIIkwADwYJiRwADwaMAAf2jAAPBowAB/WsAA8GjAAH9jwADwYJiUwADwbMAAghzAAPBgmJfAAPBuAMAA6fnAAIIlwADwcJiTwADwccAATBTAAPBykibAAPBxgbvAAPBxwACCJsAA8HCYkcAA8HbAAIInwADwdsAAgijAAPB2wACCKcAA8HbAAIIqwADwdsAAgi3AAPB2wACCLsAA8HCYlMAA8H2AvcAA8HCYl8AA8H8AwADp+cAAgi/AAPCBmJPAAPCCwABMFMAA8IOSJsAA8ILAAEZLwADwgsAAgjDAAPCCwACCMcAA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8kLAAILvwADyQsAAgzfAAPJCwACDOcAA8kLAAEwUwADyfcAAfoLAAPJ9KMAA8kGYkcAA8oAjwADygMAAb5bAAPJBmJfAAPKDwABMFMAA8oSAtcAA6fnAAINXwADyhpiTwADyhyLAAPKHg0fAAPKGmJHAAPKKI8AA8oaYl8AA8owAwADp+cAAg1rAAPKOmJPAAPKPwAB+rcAA8o9bwADyjyLAAPKPgfTAAPKOmJHAAPKUI8AA8o6Yl8AA8pYAwADp+cAAg17AAPKYmJPAAPKZwABMFMAA8prAAH+qwADymJiRwADynJ5wwADynIH5wADynIKIwADymJiUwADyoJZXwADyoMAAdMrAAPKYmJXAAPKjwABMFMAA8qTAAHe1wADymJiXwADypsAATBTAAPKngLXAAOn5wACDYcAA8qmYk8AA8qrAAEwUwADyq8AAf6rAAPKrwABu/sAA8qucS8AA8qvAAINiwADyq7uewADyqsAAf9jAAPKqwAB/2cAA8qrAAINfwADyqZiRwADytJ5wwADytIH5wADytIKIwADytMAATBTAAPK4wABv8sAA8rjAAH+wwADyuMAAf6/AAPKpmJTAAPK8llfAAPK8wAB0ysAA8qmYlcAA8r/AAEwUwADywMAAd7XAAPKpmJfAAPLCwABMFMAA8sOAtcAA6fnAAINlwADyxZiWwADyxsAATBTAAPLHgLXAAPLFmJHAAPLJwAB/P8AA8snAAH8xwADyycAAdzfAAPLJwACDacAA8snAAH/WwADyxZiUwADyz8AAf9rAAPLPwAB/3MAA6fnAAINrwADy0piRwADy08AAfz/AAPLTwAB/McAA8tPAAHc3wADy08AAg2nAAPLTwAB/1sAA8tKYlMAA8tnAAH/awADy2cAAf9zAAPLSmJfAAPLcAMAA6fnAAINswADy3piWwADy38AATBTAAPLggLXAAPLemJTAAPLiwACAGcAA8uLAAIAcwADy4sAAbb/AAPLiwACAH8AA8uLAAIAhwADy4sAAgCPAAPLiwACAJsAA6fnAAINtwADy6piTwADy64LOwADy68AAg27AAPLrwACDb8AA8uvAAINwwADy68AAg3HAAPLrwACDcsAA8uvAAINzwADy6piXwADy8wDAAOn5wACDdMAA8vWYk8AA8vbAAIN1wADy9sAAg3bAAPL2wACDd8AA8vbAAIN4wADy9sAAg3nAAPL2wACDesAA8vbAAIN7wADy9sAAg3zAAPL2wABMFMAA8v/AAH+qwADy/8AAg33AAPL/wABu/sAA8v/AAG+0wADy/8AAg37AAPL/wACDf8AA8v/AAIOAwADy/8AAg4HAAPL/wAB/tMAA8v/AAH+zwADy/8AAg4LAAPL/wACDg8AA8v/AAIOEwADy/8AAg4XAAPL/wACDhsAA8v/AAIOHwADy/8AAgR/AAPL/wACDiMAA8v/AAIOJwADy/8AAg4rAAPL/wACDi8AA8v/AAIOMwADy/8AAg43AAPL2wAB0ysAA8vbAAH/jwADy9oJTwADy9sAAf9jAAPL2wAB/2cAA8vbAAINmwADy9ZiRwADzHcAATBTAAPMewACDlcAA8x7AAIOXwADzHsAAg5rAAPMewABuQMAA8x7AAIOQwADzHsAAg5HAAPMewACDpcAA8x7AAIOmwADzHsAAg5LAAPMeiIXAAPMewACDp8AA8x7AAIOUwADzHsAAg4/AAPMewAB/sMAA8x7AAH+vwADzHsAAg57AAPMewACDrMAA8x7AAIOuwADzHsAAg6jAAPMewACDqcAA8x7AAIObwADzHsAAg7HAAPMewACDlsAA8x7AAIOtwADzHcAAfz/AAPMdgfnAAPMdwAB/HcAA8x2CiMAA8x3AAHArwADzHZ5rwADzHYKKwADzHcAAf3/AAPMdwAB/gcAA8x3AAH+EwADzHcAAf9bAAPL1mJTAAPNCllfAAPNCnjnAAPNCnjrAAPNCwAB/tsAA80LAAH+9wADzQsAAf9rAAPNCwAB/3MAA8vWYlcAA80rAAEwUwADzS8AAd7XAAPNKwAB/tsAA80rAAH+9wADy9ZiXwADzTwDAAOn5wACDt8AA81GYk8AA81ISwADzUmrAAPNSgozAAPNSmIDAAPNRmJHAAPNXwACDuMAA81fAAIO5wADzV55rwADzV4KKwADzV8AAg6/AAPNXwACDsMAA81GYlMAA816BVcAA815hwADzXsAAg7rAAPNewABR18AA817AAIO7wADzUZiXwADzZADAAOn5wACDwMAA82aYlsAA82fAAEwUwADzaIC1wADzZpiRwADzasAAfz/AAPNqwAB+vMAA82rAAH/nwADzasAAf9zAAPNqwAB/6cAA82rAAH/WwADzaqk9wADzasAAf+rAAPNqwAB/78AA82rAAH/xwADzasAATBTAAPN1wAB/9MAA82aYlMAA83fAAH/awADzd8AAf+DAAOn5wACDwcAA83qYk8AA83uCkMAA83siwADze4NHwADzepiRwADzfyPAAPN6mJfAAPOBAMAA84HAAEwUwADzg4C1wADp+cAAg8LAAPOFmJfAAPOGAMAA6fnAAIPDwADziJiXwADziQDAAOn5wACDxMAA84uYlsAA84wAwADzi5iUwADzjsAAf/fAAPOOwACDxcAA84uYkcAA85HAAH/8wADzkcAAf/7AAPORwACAAcAA85HAAIACwADzkcAAgAXAAPORwACABsAA85HAAIAJwADzkcAAgArAAPORwACADcAA85HAAEwUwADzm8AAg8bAAPObwACDzMAA6fnAAIPQwADznpiTwADzn8AATBTAAPOgwAB+5cAA856YlMAA86LAAEwUwADzo8AAfubAAPOjwAB+58AA86PAAH7owADzo8AAfunAAPOemJHAAPOowABMFMAA86nAAHQ/wADzqcAAfurAAPOemJfAAPOsAMAA6fnAAIPRwADzrpiTwADzr8AAg9LAAPOvwACD08AA86+B1MAA86/AAIPUwADzr8AAg9bAAPOvwACD2MAA86/AAEwUwADztpcGwADzrpiWwADzuMAATBTAAPO5wACD2sAA866YlMAA87uAvcAA866YkcAA870jwADzrpiXwADzv8AATBTAAPPAgLXAAOn5wACD3sAA88KYlMAA88PAAH7QwADzw8AAg9/AAPPDwAB+0cAA88PAAIPhwADzw8AAftLAAPPDwACD48AA88PAAH7TwADzw8AAg+XAAPPDgpDAAPPDwAB0ysAA88OWVsAA88PAAH7WwADzw8AAftfAAPPDwAB+2MAA88PAAH7ZwADzwpiWwADz0wDAAPPCmJHAAPPVlibAAPPVlvbAAPPVwABMFMAA89jAAH7dwADp+cAAg+fAAPPamJHAAPPbwABMFMAA89zAAIPowADz24NbwADz2piUwADz34C9wADz3yfAAPPfwAB8EMAA89/AAIPqwADz2piXwADz5ADAAOn5wACD68AA8+aYkcAA8+eecMAA8+eCiMAA8+aYlMAA8+qWV8AA8+rAAHTKwADz5piXwADz7QDAAOn5wACD7MAA8++YkcAA8/CecMAA8/CCiMAA8++YlMAA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a8AA/2iYlcAA/3jAAItswAD/UMAAi27AAP96mJPAAP97pFPAAP97wABQI8AA/3vAAItvwAD/e7QnwAD/epiXwAD/gADAAP9QwACLcMAA/4KYk8AA/4PAAItxwAD/g8AAi3LAAP+DwACLdMAA/4PAAIt2wAD/g8AAi3jAAP+DwACLesAA/4PAAIt8wAD/g8AAi37AAP+DwACLgMAA/4PAAIuCwAD/g8AAi4PAAP+DwACLhcAA/4PAAIuHwAD/g8AAi4nAAP+DwACLi8AA/4PAAIuNwAD/g8AAi4/AAP+DwACLkcAA/4PAAIuSwAD/g8AAi5TAAP+DwACLlsAA/4PAAIuXwAD/g8AAi5jAAP+DwACLmcAA/4PAAIubwAD/g8AAi53AAP+DwACLn8AA/4PAAIuhwAD/g8AAi6PAAP+DwACLpcAA/4PAAIumwAD/g8AAi6jAAP+DwACLqcAA/4PAAIurwAD/g8AAi63AAP+DwACLrsAA/4PAAIuwwAD/g8AAi2bAAP+DwACLssAA/4PAAIu0wAD/g8AAi7bAAP+DwACLuMAA/4PAAIu6wAD/g8AAi7zAAP+DwACLvsAA/4PAAIu/wAD/g8AAi8DAAP+DwACLwsAA/4PAAIvEwAD/g8AAi8bAAP+DwACLyMAA/4PAAIvKwAD/g8AAi8zAAP+DwACLzsAA/4PAAIvQwAD/g8AAi9LAAP+DwACL1MAA/4PAAIvWwAD/g8AAi9jAAP+DwACL2sAA/4PAAIvcwAD/g8AAi97AAP+DwACL4MAA/4PAAIviwAD/g8AAi+TAAP+DwACL5sAA/4PAAIvowAD/g8AAi+rAAP+DwACL7MAA/4PAAIvuwAD/g8AAi/DAAP+DwACL8sAA/4PAAIv0wAD/g8AAi/bAAP+DwACL+MAA/4PAAIv6wAD/g8AAi/zAAP+DwACL/sAA/4PAAIwAwAD/g8AAjALAAP+DwACMBMAA/4PAAIwGwAD/g8AAjAjAAP+DwACMCsAA/4PAAIwMwAD/g8AAjA7AAP+DwACMEMAA/4PAAIwSwAD/g8AAjBTAAP+DwACMFsAA/4PAAIwYwAD/g8AAjBrAAP+DlPTAAP+DwACMHcAA/4PAAIwfwAD/g8AAjCHAAP+DwACMI8AA/4PAAIwlwAD/g8AAjCfAAP+DwACMKMAA/4PAAIwqwAD/g8AAjCvAAP+DwACMLcAA/4PAAIwuwAD/g8AAjDDAAP+DwACMMcAA/4PAAEygwAD/g8AAiC3AAP+DwACMM8AA/4OWVsAA/4OWV8AA/4OePMAA/4PAAIw0wAD/g542wAD/g8AAjDXAAP+CmJHAAP/3S8AA//eAlsAA//dWwAD/95cewAD/94RZwAD/95b3wAD/94P4wAD/98AAjDbAAP/3gkLAAP+CmJfAAQABAMAA/1DAAIw3wAEAA5iWwAEABADAAQADmJHAAQAGgwfAAQAGI8ABAAOYlMABAAmAlsABAAmagMAA/1DAAIw7wAEADJiUwAEADbNVwAEADbjTwAEADJiRwAEAEMAAfrzAAQAMmJXAAQASwABvOMABAAyYl8ABABQAwAD/UJ4hwAEAFpiTwAEAF4GwwAEAF8AAjD3AAQAXsKLAAQAXwACMP8ABABeCYMABABfAAIxBwAEAF4J0wAEAF7wQwAEAFpiWwAEAIADAAQAWmJHAAQAigwfAAQAWmJTAAQAkwAB8CsABACTAAIxFwAEAJMAAjEbAAQAkwAB718AA/1DAAIxHwAEAKZiTwAEAKoC9wAEAKoCWwAEAKsAAiC3AAQAqwACMSMABACq2nsABACpOwAEAKsAAdzfAAQAqwACMScABACmYlsABADMAwAEAM8AAjErAAQApmJHAAQA2I8AA/1DAAIxLwAEAOJiUwAEAOcAAjDTAAQA5lkHAAQA5gKzAAQA5wACMTMABADmeO8ABADnAAIxNwAEAOZ42wAEAOcAAg6PAAQA5wACMTsABADnAAIxPwAEAOZ44wAEAOYNRwAEAOJiXwAEARgDAAP9QwACMUMABAEiYk8ABAEnAAIw0wAEASYNSwAEASYNWwAEASZ42wAEAScAAjFHAAQBJnjfAAQBImJTAAQBQnjvAAQBQwACMTcABAFCeOMABAEiYkcABAFS/jcABAFTAAIxSwAEASJiXwAEAVwDAAP9QniLAAQBZmJPAAQBawACMVMABAFrAAIxVwAEAWsAAjFfAAQBawACMWMABAFrAAItowAEAWsAAjFrAAQBawAB8TMABAFrAAIxbwAEAWsAAjFzAAQBZmJbAAQBkAMABAFmYkcABAGalF8ABAGbAAIxewAEAZppBwAEAZoNPwAEAZsAAe9DAAQBmnjPAAQBml1PAAQBmwACMX8ABAGbAAEZcwAEAZsAAjGDAAQBmnUPAAQBmwACMYcABAGaD6sABAGbAAIxiwAEAZsAAjGTAAQBmwACMaMABAGbAAIxqwAEAZoKIwAEAWZiVwAEAecAAjGPAAQB5wACMZ8ABAHnAAIxpwAEAecAAjGvAAP9QniPAAQB+mJPAAQB/njbAAQB/wACMbMABAH/AAIxtwAEAf8AAjDTAAQB/njfAAQB+mJTAAQCFlkHAAQCFgKzAAQCFnjvAAQCFwACMTcABAIWffsABAIWeOMABAH6YkcABAIyCiMABAH6Yl8ABAI4AwAD/UMAAjG7AAQCQmJTAAQCRg1LAAQCRg1bAAQCRwACMNMABAJHAAIxvwAEAkZ42wAEAkcAAjHDAAQCRwACMccABAJGeO8ABAJHAAIxNwAEAkcAAg6PAAQCRnjjAAQCQmJHAAQCdv43AAQCdwACMUsABAJCYl8ABAKAAwAD/UMAAjHPAAQCimJPAAQCjJ8ABAKPAAJH2wAEApSjAAQCjKcABAKPAAIx3wAEAo8AAjHjAAQCjwACMecABAKKYkcABAKsjwAEAopiXwAEArQDAAP9QwACMesABAK+Yl8ABALAAwAD/UMAAjHvAAQCymJbAAQCzAMAA/1DAAIx9wAEAtZiWwAEAtgDAAP9QwACMfsABALiYlMABALmeOcABALmeOsABALnAAH8bwAEAuJiXwAEAvQDAAP9QwACMf8ABAL+YlMABAMCDUsABAMCWQcABAMCEW8ABAL+Yl8ABAMQAwAD/UMAAjIDAAQDGmJTAAQDHwAB7wsABAMfAAIyBwAEAxpiXwAEAygDAAP9QwACMgsABAMyYk8ABAM0iwAEAzYCswAEAzJiRwAEA0CPAAQDMmJfAAQDSAMAA/1DAAIyFwAEA1JiTwAEA1SLAAQDVwACMccABANSYkcABANgjwAEA1JiUwAEA2oCswAEA1JiXwAEA3ADAAP9QwACMh8ABAN6Yk8ABAN/AAIyIwAEA38AAjInAAQDfwACMisABAN/AAIyLwAEA38AAkfbAAQDkwACMjMABAOTAAIyNwAEA5MAAjI7AAQDkwACMj8ABAN6YkcABAOnAAIBfwAEA6cAAjJDAAQDpwACMkcABAOnAAIyVwAEA3piXwAEA7gDAAP9QwABxI8ABAPCYk8ABAPHAAJH2wAEA8sAAjJvAAQDywACMnMABAPLAAIydwAEA8sAAbgjAAQDywABuCcABAPLAAG4FwAEA8sAAjJ7AAQDywACMn8ABAPCYkcABAPtWwAEA+4KIwAEA+8AAVG3AAQD7wACR9sABAP/AAIyiwAEA/8AAjKPAAQD/wABuGcABAP/AAIykwAEA/8AAjKHAAQD/wACMp8ABAP/AAIymwAEA/8AAbgzAAQD/wABuDcABAPCYlMABAQnAAG1owAEA8JiXwAEBCwDAAP9QwACMscABAQ2Yk8ABAQ7AAJH2wAEBD8AAjLLAAQEPwACMs8ABAQ2YkcABARLAAFRtwAEBEsAAkfbAAQEUwACMosABAQ2Yl8ABARYAwAD/UMAAjLXAAQEYmJPAAQEZwACR9sABARrAAIy2wAEBGJiRwAEBHMAAVG3AAQEcwACR9sABAR7AAIyiwAEBGJiXwAEBIADAAP9QwACMt8ABASKYkcABASOH88ABASODB8ABASPAAJH2wAEBJsAAjN/AAQEimJfAAQEoAMAA/1DAAIz1wAEBKpiTwAEBK8AAkfbAAQEswACM9sABASzAAIz3wAEBLMAAjPjAAQEswACM+cABASzAAIz6wAEBLMAAjPvAAQEswAB+1MABASzAAHvhwAEBLMAAjPzAAQErwACMT8ABASqYkcABATdLwAEBN4CWwAEBN1bAAQE3wACR9sABATvAAG5jwAEBO7NuwAEBO8AAjRDAAQE7wACNEcABATvAAI0LwAEBO8AAjQ3AAQE7wACNEsABATvAAI0MwAEBO8AAjQ7AAQE7wACND8ABATvAAI0JwAEBO8AAa1jAAQE7wACNAMABATvAAI0KwAEBO8AAjRfAAQE7wACCicABATvAAGwewAEBO8AAjRnAAQE7wACNH8ABATvAAI0hwAEBN5cewAEBN4RZwAEBN5b3wAEBN4P4wAEBN8AAjDbAAQE3gkLAAQE3I8ABASqYlMABAVeeNsABAVfAAIw0wAEBV8AAjDXAAQFXllbAAQFXllfAAQFXwACMM8ABAVfAAEygwAEBV8AAiC3AAQFXnjzAAQEqmJXAAQFhnjbAAQFhwACMNMABAWHAAIw1wAEBYZZWwAEBYZZXwAEBYcAAjDPAAQFhwABMoMABAWHAAIgtwAEBYZ48wAEBKpiXwAEBawDAAP9QwACNI8ABAW2Yk8ABAW7AAJH2wAEBb5cGwAEBb8AAd/TAAQFvwACNJMABAW2YkcABAXODB8ABAXPAAJH2wAEBdcAAjSXAAQF1wAB+38ABAXMjwAEBbZiUwAEBeYCWwAEBeZqAwAEBbZiXwAEBfADAAP9QwACNK8ABAX6Yk8ABAX/AAJH2wAEBgMAAjSzAAQGAwACNLcABAX6YkcABAYODB8ABAX6YlMABAYXAAHwKwAEBhcAAjEXAAQGFwACMRsABAYXAAHvXwAEBfpiXwAEBigDAAQGKwACR9sABAYyAtcAA/1DAAI0vwAEBjpiTwAEBj8AAkfbAAQGQKMABAZCXBsABAY/AAIgtwAEBj8AAjEjAAQGPtp7AAQGPTsABAY/AAIxJwAEBj8AAdzfAAQGOmJTAAQGZgL3AAQGZgJbAAQGOmJXAAQGcgL3AAQGcgJbAAQGOmJHAAQGfwACR9sABAaDAAI0wwAEBoMAAjT3AAQGgwACNIcABAZ8jwAEBjpiXwAEBpQDAAQGlwACMSsAA/1DAAIPQwAEBqJiTwAEBqcAAkfbAAQGqwAB+5cABAaiYlMABAazAAJH2wAEBrcAAfubAAQGtwAB+58ABAa3AAH7owAEBrcAAfunAAQGomJHAAQGywACR9sABAbPAAHQ/wAEBs8AAfurAAQGomJfAAQG2AMAA/1DAAIBQwAEBuJiTwAEBucAAkfbAAQG6wACNQMABAbrAAIBSwAEBupzwwAEBupggwAEBuJiRwAEBv1bAAQG/l0fAAQG/wACR9sABAcLAAEJzwAEBwsAAgFPAAQG/l1jAAQG/wACAT8ABAb+CQsABAbiYlMABAchhwAEByIFVwAEByIOywAEBuJiXwAEBzADAAP9QwACNQcABAc6Yk8ABAc/AAJH2wAEB0MAAjULAAQHQwACNQ8ABAdDAAG+0wAEBz8AAjUTAAQHPnjvAAQHPwACNRcABAc+DUsABAc+DVsABAc+WQcABAc+ArMABAc/AAI1GwAEBzpiUwAEB3MAAjUfAAQHcwACNSMABAc6YkcABAd+B+cABAd+CiMABAc6Yl8ABAeIAwAD/UMAAjUnAAQHkmJPAAQHlwACR9sABAebAAI1KwAEB5sAAjUvAAQHkmJTAAQHpwACMTcABAemeO8ABAenAAIxPwAEB6cAAjDTAAQHpnjbAAQHkmJfAAQHvAMAA/1DAAI1MwAEB8ZiTwAEB8sAAkfbAAQHzwACNSsABAfPAAI1LwAEB8ZiUwAEB9sAAjE3AAQH2njvAAQH2wACMT8ABAfbAAIw0wAEB9p42wAEB8ZiXwAEB/ADAAP9QwACNTcABAf6Yk8ABAf+DUcABAf/AAJH2wAECAcAAjU7AAQIBwACNT8ABAgHAAI1QwAECAcAAjVHAAQH+mJHAAQIGgfnAAQH+mJTAAQIIgKzAAQIIwACMTMABAgiWQcABAgjAAIxOwAECCJ44wAECCMAAg6PAAQH+mJfAAQIPAMAA/1DAAI1ewAECEZiTwAECEsAAkfbAAQITwAB8LMABAhPAAI1fwAECEsAAjG/AAQIRmJTAAQIXwACMccABAheDUsABAheDVsABAhfAAIOjwAECF8AAjE3AAQIXwACMcMABAheeOMABAhfAAJH2wAECH8AAjWrAAQIfwACNbMABAhGYkcABAiLAAJH2wAECI8AAjWHAAQIjwACNbcABAiK/jcABAiKB+cABAiLAAIxSwAECEZiXwAECKQDAAP9QwACNgMABAiuYkcABAiyIuMABAiy0L8ABAiuYl8ABAi8AwAD/UMAAjYHAAQIxmJPAAQIywACR9sABAjOH68ABAjGYkcABAjVWwAECNYKIwAECMZiXwAECOADAAP9QwACCS8ABAjqYk8ABAjvAAJH2wAECPIfrwAECPMAAgkzAAQI8wACCTcABAjzAAIJOwAECPMAAbXDAAQI8wACCT8ABAjzAAG9owAECOpiRwAECRFbAAQJEnA7AAQJEnBDAAQJEhEHAAQJEgojAAQJEwACR9sABAkrAAIJTwAECSsAAglTAAQJKwACCVcABAjqYlMABAk6ffsABAk7AAJH2wAECUMAAbv7AAQI6mJfAAQJSAMAA/1DAAIJWwAECVJiTwAECVcAAkfbAAQJWwACCV8ABAlbAAIJYwAECVJiUwAECWcAAUTvAAQJUmJXAAQJbwABRO8ABAlSYkcABAl2CisABAl2fqsABAl2CAsABAl2EEcABAlSYl8ABAmIAwAD/UMAAjYPAAQJkmJPAAQJlwACR9sABAmbAAI2EwAECZsAAjYXAAQJmrQLAAQJmwACNhsABAmWeO8ABAmSYlMABAmzAAIw0wAECbJ42wAECbJ43wAECbMAAUTvAAQJswACR9sABAnHAAI2MwAECZJiVwAECc8AAjDTAAQJznjbAAQJznjfAAQJkmJHAAQJ3VsABAneCisABAnfAAJH2wAECesAAjYvAAQJkmJfAAQJ8AMAA/1DAAI2NwAECfpiTwAECf8AAkfbAAQKAwACNjsABAoDAAI2PwAECgMAAjUvAAQKAwACNX8ABAoDAAI2QwAECgMAAjZHAAQJ+mJTAAQKHwACR9sABAojAAI2MwAECh8AAjE3AAQKHg1LAAQKHg1bAAQKHnjjAAQKHwACMUcABAn6YlcABAo+DUsABAo+DVsABAo/AAIxRwAECfpiRwAECk7+NwAECk8AAjFLAAQKTwACR9sABApbAAI2LwAEClsAAjZTAAQJ+mJfAAQKZAMAA/1DAAI3DwAECm5iTwAECnJZBwAECnICswAECnMAAjE3AAQKcwACR9sABAqDAAHwswAECoMAAjWPAAQKgwACNxMABAqDAAI1zwAECoMAAjcXAAQKgwACNxsABAqDAAI3HwAECoMAAjWDAAQKbmJTAAQKpn37AAQKpwACMbcABAqnAAIxswAECqZ44wAECm5iRwAECroKIwAECrsAAkfbAAQKwwACNycABArDAAG9QwAECsMAAjczAAQKwwACNi8ABApuYlcABArXAAIxtwAECtcAAjGzAAQKbmJfAAQK4AMAA/1DAAI3RwAECupiTwAECu8AAkfbAAQK8wACN0sABArqYkcABAr5WwAECvsAAbXLAAQK+gojAAQK6mJfAAQLCAMAA/1DAAI3TwAECxJiTwAECxcAAkfbAAQLGwACN1MABAsbAAI3VwAECxsAAgkzAAQLGmCDAAQLGnPDAAQLGwACN18ABAsbAAI3YwAECxsAAjdnAAQLGwACN2sABAsbAAI3bwAECxsAAjdzAAQLGwACN3cABAsbAAI3ewAECxsAAjd/AAQLFwAB7wsABAsXAAI3WwAECxcAAjYnAAQLFwACNAcABAsXAAIw0wAECxcAAjYjAAQLEmJHAAQLbwACMU8ABAtucEMABAtuCiMABAtvAAI2bwAEC28AAkfbAAQLgwACN58ABAuDAAI3jwAEC4MAActrAAQLgwACN5MABAsSYlMABAuWffsABAsSYlcABAufAAH5pwAECxJiXwAEC6QDAAP9QwACN7cABAuuYk8ABAuyD0cABAuzAAJH2wAEC7sAAf6rAAQLuwACN0MABAu7AAINiwAEC7sAAje7AAQLunEvAAQLuwAB8LMABAu7AAI3vwAEC7sAAjfDAAQLuwACN8cABAu7AAI3ywAEC7sAAjfPAAQLswABGdsABAuuYkcABAvuhgsABAvvAAIxSwAEC+8AAfrzAAQL7gojAAQL7wACOCMABAvvAAGF/wAEC+8AAjg3AAQL7wACOAMABAuuYlMABAwSeOMABAuuYl8ABAwYAwAD/UMAAjg7AAQMImJPAAQMJwACDY8ABAwnAAIsjwAEDCJiXwAEDDADAAP9QwACOD8ABAw6Yk8ABAw+D0cABAw+WVsABAw+WV8ABAw/AAI4LwAEDD4JTwAEDD8AAkfbAAQMVwACOEMABAxXAAI4RwAEDFcAAjhLAAQMVwABiPMABAxXAAI4TwAEDDpiUwAEDG4FVwAEDG8AAjhTAAQMbwACOFcABAw6YkcABAx/AAI4WwAEDH8AAkfbAAQMhwACOF8ABAx/AAI4YwAEDH8AAjhnAAQMfwACOGsABAx+CiMABAx/AAH8/wAEDDpiXwAEDKADAAP9QwACOI8ABAyqYk8ABAyvAAJH2wAEDLMAAjiTAAQMswACOJcABAyzAAI4mwAEDLMAAjifAAQMswACN/cABAyzAAINiwAEDLMAAjW3AAQMswACNecABAyzAAI4owAEDLMAAjinAAQMswACOH8ABAyzAAI4qwAEDK8AAjFrAAQMrwAB8TMABAyvAAIxbwAEDK8AAjFzAAQMqmJTAAQM9wACLaMABAyqYlcABAz/AAItowAEDP8AAjGvAAQM/wACMY8ABAz/AAIxpwAEDP8AAjGfAAQMqmJHAAQNFpRfAAQNFwACMXsABA0WaQcABA0WDT8ABA0XAAHvQwAEDRZ4zwAEDRZdTwAEDRcAAjF/AAQNFwABGXMABA0XAAIxgwAEDRYPqwAEDRcAAjGLAAQNFnUPAAQNFwACMYcABA0WCiMABA0XAAIxkwAEDRcAAjGrAAQNFwACR9sABA1fAAI4rwAEDV8AAjWjAAQNXwACOAcABA1fAAI1pwAEDV8AAjh3AAQNXwACOLMABA1fAAI4iwAEDV8AAjjLAAQNXwACNdMABA1fAAI1ywAEDV8AAjXfAAQNXwACNdsABA1fAAI43wAEDKpiXwAEDZQDAAP9QwACORcABA2eYl8ABA2gAwAEDZ5iTwAEDasAAkfbAAQNrwAB+5cABA2eYlMABA23AAJH2wAEDbsAAfubAAQNuwAB+58ABA27AAH7owAEDbsAAfunAAQNnmJHAAQNzwACR9sABA3TAAHQ/wAEDdMAAfurAAP9QwACORsABA3eYk8ABA3jAAJH2wAEDecAAjkfAAQN5wACOSMABA3nAAI5JwAEDecAAjkrAAQN5wACOS8ABA3nAAH+qwAEDecAAjU7AAQN5wACN7sABA3nAAGNawAEDeZxLwAEDecAAjkzAAQN5wACN88ABA3eYkcABA4bAAI5QwAEDhsAAfrzAAQOGwACMUsABA4bAAJH2wAEDisAAdD/AAQN3mJTAAQOMwACOUcABA4yeOMABA4zAAJH2wAEDj8AAjlPAAQOPwACOVMABA4/AAI2TwAEDj8AAjlXAAQOPwAB+6MABA4/AAH7pwAEDd5iXwAEDlgDAAP9QwACOYMABA5iYl8ABA5kAwAEDmZvQwAEDm4ZVwAEDmJiTwAEDncAAkfbAAQOewAB+5cABA5iYlMABA6DAAJH2wAEDocAAfubAAQOhwAB+58ABA6HAAH7owAEDocAAfunAAQOYmJHAAQOmwACR9sABA6fAAHQ/wAEDp8AAfurAAP9QwACOYcABA6qYk8ABA6vAAJH2wAEDrMAAjmLAAQOswACOKcABA6zAAI3wwAEDrMAAjVLAAQOswACOY8ABA6zAAI5kwAEDrMAAjmXAAQOswACOZsABA6zAAG7+wAEDq8AAi2bAAQOrwACLacABA6vAAItnwAEDq8AARnbAAQOqmJHAAQO6nnDAAQO6wACLasABA7rAAJH2wAEDvcAAjmfAAQO9wACBbsABA73AAI5PwAEDvcAAjWnAAQO9wACOTsABA73AAI5NwAEDvcAAdD/AAQO6gfnAAQO6gojAAQO6wACLbcABA6qYlMABA8jAAItowAEDyJZXwAEDyMAAdMrAAQPIwACR9sABA8zAAI1WwAEDzMAAfujAAQPMwAB+6cABA6qYlcABA9DAAItowAED0MAAi2zAAQOqmJfAAQPTwACR9sABA9SAtcABA9PAAItrwAD/UMAAjnHAAQPXmJPAAQPYwACOcsABA9jAAI5zwAED2MAAjjTAAQPXmJfAAQPcAMABA9y6SMAA/1DAAIgywAED35iTwAED4JZWwAED4JZXwAED4MAAjHzAAQPgwAB//cABA+DAAI3OwAED35iUwAED5sAAjfrAAQPfmJfAAQPoAMABA+i6SMAA/1DAAI53wAED65iTwAED7J45wAED7J46wAED7MAAfxvAAQPrmJHAAQPwwAB7dsABA+uYl8ABA/IAwAD/UMAAjnjAAQP0mJPAAQP1wACR9sABA/bAAI1KwAED9sAAf6rAAQP0mJHAAQP5gfnAAQP5gorAAQP5ggLAAQP5hBHAAQP5n6rAAQP5VsABA/mcDsABA/mcEMABA/nAAH68wAED+YRBwAED+YKIwAED+cAAf3/AAQP5wAB/gcABA/nAAH+EwAED+cAAkfbAAQQIwAB0P8ABA/SYlMABBArAAFE7wAEECp9+wAEECpZXwAEECsAAdMrAAQQKnjnAAQQKnjrAAQP0mJXAAQQRwABRO8ABA/SYl8ABBBMAwAD/UMAAjnnAAQQVmJPAAQQWwACR9sABBBfAAI56wAEEFsAAjnvAAQQWwACOfMABBBbAAI59wAEEFZiWwAEEHJzhwAEEFZiRwAEEHiPAAQQVmJfAAQQgAMAA/1DAAI6AwAEEIpiTwAEEI8AAjGbAAQQjwACMZcABBCObTcABBCPAAI6BwAEEI8AAjXvAAQQjwACNesABBCPAAI18wAEEI8AAjX3AAQQimJTAAQQsgbrAAQQimJHAAQQuwACN/sABBCKYl8ABBDAAwAD/UMAAjoLAAQQymJPAAQQzgKzAAQQymJHAAQQ1sl7AAQQ1wACN/sABBDKYl8ABBDgAwAD/UMAAjoXAAQQ6mJPAAQQ7llbAAQQ7llfAAQQ6mJHAAQQ+sl7AAQQ+wACN/sABBDqYl8ABBEEAwAD/UMAAjofAAQRDmJTAAQREgbrAAQRDmJHAAQRGwACN/sABBEbAAI6GwAEEQ5iXwAEESQDAAP9QwACOiMABBEuYk8ABBEzAAIx8wAEETMAAf/3AAQRLmJTAAQRPgbrAAQRLmJHAAQRRwACLf8ABBFHAAI3+wAEEUcAAjobAAQRLmJfAAQRVAMAA/1DAAI6JwAEEV5iTwAEEWMAAjHzAAQRYwAB//cABBFeYlMABBFuBusABBFeYkcABBF3AAIt/wAEEXcAAjf7AAQRdwACOhsABBFeYl8ABBGEAwAD/UMAAjpfAAQRjmJPAAQRkg1LAAQRklkHAAQRkhFvAAQRjmJfAAQRoAMAA/1DAAI6YwAEEapiTwAEEa8AAjpnAAQRrwACOmsABBGvAAI6bwAEEa8AAjpzAAQRrgnbAAQRrwABHR8ABBGvAAI6dwAEEapiXwAEEcwDAAP9QwACOnsABBHWYk8ABBHbAAI6fwAEEdsAAjIrAAQR2wACMicABBHbAAIzOwAEEdp2SwAEEdp2kwAEEdsAAjqDAAQR2ndTAAQR2wABJAMABBHbAAEjFwAEEdp2jwAEEdsAAjqHAAQR2wACOosABBHWYl8ABBIQAwAD/UMAAjqPAAQSGmJPAAQSHwABPxcABBIfAAI6kwAEEh8AAjqXAAQSHwACOpsABBIfAAI6nwAEEh8AAjqjAAQSHwACOqcABBIfAAI6qwAEEh8AAjqvAAQSHwACOrMABBIfAAI6twAEEh8AAjq7AAQSHwACOr8ABBIfAAI6wwAEEh8AAjrHAAQSHwACOssABBIfAAI6zwAEEh8AAjrTAAQSHwACOtcABBIfAAI62wAEEh8AAjrfAAQSHwACOuMABBIfAAI65wAEEh8AAjrrAAQSHwACOu8ABBIfAAIQcwAEEh8AAjrzAAQSHwACOvcABBIfAAI6+wAEEhpiXwAEEpQDAAP9QwACOv8ABBKeYk8ABBKjAAI7AwAEEqMAAjpvAAQSowACOnMABBKeYl8ABBKwAwAD/UMAAjsHAAQSumJPAAQSvwACOwMABBK/AAI7CwAEEr8AAjsPAAQSumJfAAQSzAMAA/1DAAI7EwAEEtZiTwAEEtsAAkfbAAQS3nEvAAQS3wACOxcABBLfAAG/QwAEEt8AAg4LAAQS3wACOxsABBLfAAI7HwAEEtZiUwAEEvsAAbtDAAQS1mJHAAQTAwABvp8ABBMCcTcABBMDAAG7hwAEEwIOJwAEEwIHrwAEEwIH7wAEEwIIEwAEEwMAAkfbAAQTIwACOyMABBLWYl8ABBMoAwAD/UMAAjsnAAQTMmJPAAQTNgfjAAQTNwACDasABBMyYkcABBNCB+cABBMyYl8ABBNIAwAD/UMAAjsrAAQTUmJPAAQTVwACR9sABBNbAAI7LwAEE1pggwAEE1pcWwAEE1sAAjszAAQTWwABjWsABBNbAAI7NwAEE1sAAjs7AAQTWwACNjsABBNbAAI7PwAEE1sAAYrfAAQTWwACO0MABBNbAAI7RwAEE1sAAjtLAAQTWwACO08ABBNbAAI1CwAEE1sAAjPrAAQTWwACO1MABBNbAAI7VwAEE1sAAjtbAAQTWwACO18ABBNbAAIz2wAEE1sAAjUrAAQTWwACDfsABBNbAAI7YwAEE1sAAjtnAAQTWwABu/sABBNbAAI7awAEE1JiWwAEE8sAAjt3AAQTywACO3sABBNSYkcABBPWB+cABBPXAAI30wAEE9cAAkfbAAQT4wAB+38ABBPjAAI7gwAEE+MAAjt/AAQT4wABv8sABBPjAAG/zwAEE+MAAjtzAAQT4wACO9MABBPjAAI76wAEE+MAAjvvAAQT4wACO/MABBPjAAI79wAEE+MAAju7AAQT4wACO6MABBPjAAI7ywAEE+MAAjuHAAQT4wACO4sABBPjAAI7bwAEE+IiFwAEE9cAAjgfAAQT1wACO+cABBNSYlMABBQ2B48ABBQ3AAI74wAEFDcAAjUfAAQUNwACLucABBQ2eNsABBNSYlcABBRPAAI3/wAEE1JiXwAEFFcAAkfbAAQUWgLXAAP9QwACPAcABBRiYk8ABBRnAAJH2wAEFGsAAjVzAAQUawACNmcABBRrAAI8CwAEFGsAAjwPAAQUawACNVsABBRrAAI8EwAEFGsAAbt/AAQUatpfAAQUZs1XAAQUYmJHAAQUkwAB+vMABBSTAAJH2wAEFJsAAjVjAAQUkwABC68ABBSSHQcABBSRLwAEFJIC/wAEFJJkVwAEFJIClwAEFJIRZwAEFJIJCwAEFJIP4wAEFJMAAQu3AAQUkgKvAAQUklvjAAQUkljLAAQUkqybAAQUkwABC8MABBSQjwAEFGJiUwAEFOMAAjwjAAQU4uNPAAQU4g9DAAQU4g2LAAQU4KcABBThhwAEFOIFVwAEFOIOywAEFGJiVwAEFQcAAbzjAAQUYmJfAAQVDAMAA/1DAAI8KwAEFRZiTwAEFRsAAkfbAAQVHwACPBsABBUfAAI8LwAEFR8AAazrAAQVHwABrO8ABBUfAAI8MwAEFRZiRwAEFTcAAjw3AAQVNwACNV8ABBU3AAI1dwAEFTYKIwAEFTcAAkfbAAQVSwACPB8ABBVLAAI8OwAEFUsAAjwXAAQVSwACPEcABBVLAAI8QwAEFUsAAjw/AAQVFmJXAAQVZwACLbMABBUWYl8ABBVsAwAD/UMAAjxLAAQVdmJPAAQVewACR9sABBV/AAIKbwAEFXZiUwAEFYV7AAQVdmJXAAQVjwABDn8ABBV2YkcABBWWIj8ABBWXAAI8TwAEFZcAAjF3AAQVlwACMaMABBV2Yl8ABBWoAwAD/UMAAjxTAAQVsmJPAAQVtwACR9sABBW7AAG7gwAEFbsAAjxXAAQVuwACON8ABBWyYkcABBXLAAIxdwAEFcsAAjGjAAQVsmJfAAQV1AMAA/1DAAI8WwAEFd5iTwAEFeMAAjxfAAQV4wACPGMABBXjAAI8ZwAEFeMAAjxrAAQV4wACPG8ABBXjAAI8cwAEFeMAAjx3AAQV4wACPHsABBXjAAI8fwAEFeMAAjyDAAQV4wACPIcABBXjAAHVUwAEFeMAAjyLAAQV4wACPI8ABBXjAAI8lwAEFeMAAjyfAAQV4wACPKcABBXjAAI8rwAEFeMAAjy3AAQV4wACPL8ABBXjAAI8xwAEFeMAAjzPAAQV4wACPNcABBXjAAI83wAEFeMAAdafAAQV4wACPOcABBXeYl8ABBZMAwAD/UMAAjzvAAQWVmJPAAQWWwACPPMABBZadG8ABBZbAAI8+wAEFlsAAjz/AAQWWwACPQcABBZbAAI9CwAEFlsAAj0PAAQWWwACPRMABBZbAAH++wAEFlZiRwAEFoMAAkfbAAQWhwACPRcABBaHAAI9LwAEFocAAj07AAQWVmJfAAQWlAMAA/1DAAI9VwAEFp5iWwAEFqADAAQWnmJHAAQWqwACLucABBarAAI9YwAD/UMAAj1nAAQWtmJPAAQWuwAB/M8ABBa6lF8ABBa60J8ABBa7AAEZ2wAEFrsAAj1rAAQWuwABI78ABBa7AAE/IwAEFrsAAhBzAAQWuwACPXsABBa2YkcABBbjAAH8/wAEFuIKIwAEFuFbAAQW4nBDAAQW4wAB71MABBa2YlsABBb7AAI9gwAEFrZiUwAEFwMAAj2TAAQXAwABfIMABBcDAAH+jwAEFwMAAj2XAAQXAwACPZsABBcDAAIxcwAEFrZiVwAEFx8AAjFzAAQWtmJfAAQXJAMAA/1DAAI9nwAEFy5iTwAEFzCLAAQXLmJHAAQXOI8ABBcuYl8ABBdAAwAD/UMAAj2nAAQXSmJPAAQXTwABI7cABBdPAAIw9wAEF07wQwAEF0piXwAEF1wDAAP9QwACPasABBdmYk8ABBdrAAI9rwAEF2sAAjD3AAQXavBDAAQXawACPbMABBdrAAI9twAEF2sAAj27AAQXawACPb8ABBdrAAI9wwAEF2sAAj3HAAQXawACPcsABBdrAAI9zwAEF2sAAj3TAAQXawACPdcABBdrAAI92wAEF2sAAj3fAAQXawACPeMABBdmYl8ABBesAwAD/UMAAj3nAAQXtmJPAAQXuhDTAAQXtmJfAAQXwAMAA/1DAAI96wAEF8piTwAEF88AAjR7AAQXzwACAZcABBfKYkcABBfYjwAEF8piXwAEF+ADAAP9QwACPe8ABBfqYk8ABBfvAAE/FwAEF+8AAj3zAAQX7wACPfcABBfuno8ABBfvAAI9+wAEF+8AAhBzAAQX7wACOvcABBfvAAI9/wAEF+8AAj4DAAQX7wACPgcABBfvAAI+CwAEF+8AAj4PAAQX7wACR9sABBgjAAGNawAEGCMAAj4TAAQYIwACPhcABBgjAAI+GwAEGCMAAcVrAAQYIwACPh8ABBgjAAI+IwAEGCMAAj4nAAQYIwACPisABBgjAAI+LwAEGCMAAj4zAAQYIwABzRsABBgjAAI+NwAEGCMAAj47AAQYIwACPj8ABBgjAAI+QwAEF+8AAj2XAAQX7wACPZsABBfqYkcABBhuecMABBhucDsABBhuCiMABBhtWwAEGG8AAkfbAAQYgwACPmMABBiDAAI+VwAEGIMAAj5bAAQYgwACPoMABBiDAAI+awAEGIMAAj5nAAQYgwACPlMABBiDAAI+hwAEF+piXwAEGKQDAAP9QwACPo8ABBiuYk8ABBiynocABBiuYl8ABBi4AwAD/UMAAj6TAAQYwmJPAAQYxp6HAAQYwmJfAAQYzAMAA/1DAAI+lwAEGNZiTwAEGNsAAkfbAAQY3wABu/sABBjfAAI+mwAEGN8AAj6fAAQY1mJHAAQY7nnDAAQY7wACR9sABBj3AAI78wAEGPcAAj6jAAQY9wACPssABBj3AAI+2wAEGNZiXwAEGQgDAAP9QwACPuMABBkSYk8ABBkXAAI9CwAEGRcAAj0HAAQZFwACPQ8ABBkXAAI9EwAEGRcAAj2HAAQZFgffAAQZFiLfAAQZEmJHAAQZNwACR9sABBk7AAI+5wAEGTsAAj7rAAQZNwACPosABBk3AAI+7wAEGRJiXwAEGUwDAAP9QwACPv8ABBlWYk8ABBlbAAHwHwAEGVsAAkfbAAQZYwABzRsABBljAAI/AwAEGVZiRwAEGW55wwAEGW1bAAQZbnA7AAQZbgojAAQZbwACPwsABBlvAAI/FwAEGVZiXwAEGYgDAAP9QwACPy8ABBmSYk8ABBmXAAHwHwAEGZcAAe8LAAQZlwACR9sABBmjAAG7+wAEGaJxLwAEGaMAAj8zAAQZou57AAQZowACBH8ABBmjAAG7AwAEGZJiRwAEGb8AAkfbAAQZwwABwDcABBnDAAG7owAEGcMAAbunAAQZwwABwAMABBnDAAI/NwAEGcMAAj87AAQZvnBDAAQZvgojAAQZvVsABBm/AAI/PwAEGZJiXwAEGewDAAP9QwACP0MABBn2Yl8ABBn4AwAEGfpvQwAEGgIZVwAEGfZiTwAEGgsAAkfbAAQaDwAB+5cABBn2YlMABBoXAAJH2wAEGhsAAfubAAQaGwAB+58ABBobAAH7owAEGhsAAfunAAQZ9mJHAAQaLwACR9sABBozAAHQ/wAEGjMAAfurAAP9QwACP0cABBo+Yk8ABBpDAAJH2wAEGkcAAj9LAAQaRwABu/sABBpGcS8ABBpGXNsABBpHAAH+qwAEGkcAAj43AAQaRwACP1MABBpHAAI/VwAEGkcAAj9bAAQaRwACP18ABBpHAAI/YwAEGkcAAj9nAAQaRwAB/ysABBpHAAI/DwAEGkcAAj8TAAQaRwACP2sABBpHAAI+QwAEGkcAAfCzAAQaQwACAacABBpDAAI/TwAEGkMAAf6PAAQaPmJHAAQanwAB/P8ABBqfAAI/pwAEGp4H5wAEGp1bAAQanwAB71MABBqecDsABBqecEMABBqeCiMABBqfAAJH2wAEGsMAAbkDAAQawwAB0P8ABBrDAAI/uwAEGj5iUwAEGtMAAj17AAQa0wACPZMABBrTAAF8gwAEGtMAAj2XAAQa0wACPZsABBrSffsABBrTAAIxcwAEGtMAAkfbAAQa8wAB+6MABBrzAAH7pwAEGj5iVwAEGv8AAj17AAQa/wACMXMABBo+Yl8ABBsLAAJH2wAEGw8AAj9sAAABbXcAA/HQBYMAA/bZdwAD8dAFgwAD9tmEBYMAA/bZcXcAA/HQBYMAA/bZhAWDAAP22XGEBYMAA/bZcXcAA/KUCYMAA/bZgwAD9tl3AAPx0AWDAAP22YQFgwAD9tlxdwAD8dAFgwAD9tl3AAPx0AWDAAP22YQFgwAD9tlxhAWDAAP22XGEBW1xhAWDAAP22XGEBYMAA/bZcYQFgwAD9tlxhAWDAAP22XGEBYMAA/bZcXcAA/HQBYMAA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AABfAQBdmUwCXwAAXwEAXZlMAl8AAF8BAF3AAPylAmCJbl8AAF3AAP1nAWCJbl2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aEgJfAABfAQBdmhICXwAAXwEAXZoSAl8AAF8BAF2aRwJfAABfAQBdmkcCXwAAXwEAXZpHAl8AAF8BAF2aRwJfAABfAQBdmkcCXwAAXwEAXZpHAl8AAF8BAF2aRwJfAABfAQBdmkcCXwAAXwEAXZpHAl8AAF8BAF2aRwJfAABfAQBdmkcCXwAAXwEAXZpHAl8AAF8BAF2aRwJfAABfAQBdmkcCXwAAXwEAXZpHAl8AAF8BAF2aRwJfAABfAQBdmkcCXwAAXwEAXZpHAl8AAF8BAF2aRwJfAABfAQBdmkcCXwAAXwEAXZpgAl8AAF8BAF2aYAJfAABfAQBdmmACXwAAXwEAXZpgAl8AAF8BAF2aYAJfAABfAQBdmmACXwAAXwEAXZpgAl8AAF8BAF2aYAJfAABfAQBdmmACXwAAXwEAXZpgAl8AAF8BAF2aYAJfAABfAQBdmmACXwAAXwEAXZpgAl8AAF8BAF2aYAJfAABfAQBdmmACXwAAXwEAXZpgAl8AAF8BAF2aYAJfAABfAQBdmmAC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wABoCwFgwABu6l3AAGgLAWDAAG7qXcAA/WcBYMAAboRdwAD8pQJgwAD9tl3AAP1nAWDAAG6EXcAA/WcBYMAAboRdwAD8pQJgwAD9tl3AAP1nAWDAAG6EXcAA/WcBYMAAboRdwAD8pQJgwAD9tl3AAP1nAWDAAG6EXcAAaAsBYMAAbupdwAD8pQJgvLdgwABuhF4AAgICYLy3XcAAaAsBYMAAbuoAAVfAAG50AFxdwABoCwFgwABu6l3AAGgLAWDAAG7qXcAAaAsBYMAAbupeAAICAmC8t13AAGgLAWDAAG7qAAFXwABudABcXcAA/WcBYLy3XcAA/KUCYLylXcAA/WcBYLylXcAA/WcBYLylXcAA/WcBYLy3XcAA/WcBYLy3XcAA/KUCYLy3YMAAboRdwAD9ZwFgwABidmECYMAA/bZdwAD8MgFbXGECYMAA/bZdwAD8MgFbXGECYMAA/bZdwAD8MgFbXGECYMAA/bZdwAD8MgFbXF3AAP1nAWDAAGdeXcAA/WcBYMAAZ9ldwAD9ZwFgwABnkF3AAP1nAWDAAGf2XcAA/HQBYMAATKhdlHEBYMAAZ15dlHEBYMAAZ15dlHEBYMAAZ9ldlHEBYMAAZ9ldlHEBYMAAZ5BdlHEBYMAAZ5BdlHEBYMAAZ/ZdlHEBYMAAZ/ZdwABPlwJbW13AAE+XAltbXcAAT5cCW1tdwABPlwJbW13AAE+XAltbXcAAT5cCW1tdwABPlwJbW13AAP1nAWDAAGC7XcAAT5cCW1tdwAD8pQJgwABgu2DAAGC7XcAAT5cCW1tdwAD8pQJgvMlgwABgu13AAE+XAltbXcAAT5cCW1tdwABPlwJbW13AAE+XAltbXcAAT5cCW1tdwABPlwJbW13AAE+XAltbXcAAT5cCW1tdwABPlwJbW13AAE+XAltbXcAAT5cCW1tdwABPlwJbW13AAE+XAltbXcAAT5cCW1tdwABPlwJbW13AAE+XAltbXcAAT5cCW1tdwABPlwJbW13AAE+XAltbYMAAT7hgwABPuGDAAE+4YMAAT7hgwABPuGDAAE+4YMAAT7hgwABPuGDAAE+4YMAAT7hgwABPuGDAAE+4YMAAT7hgwABPuGDAAE+4YMAAT7hgwABPuGDAAE+4XcAA/KUCYMAA+9BdwAD8dAFgwABCEV3AAPx0AWDAAEIRXcAA/KUCYMAA+9BdwAD8dAFgwABCVF3AAPx0AWDAAEJUXcAA/KUCYMAA+9BdwAD8dAFgwABCVF3AAPx0AWDAAEJUYQJgwAD70GDAAEIRXF3AAPx0AWDAAEIRXcAA/KUCYMAA+9BdwAD8dAFgwABCEV3AAPx0AWDAAEJUXcAA/KUCYMAA+9BdwAD8dAFgwABCVF3AAPylAmDAAP22YMAAT/BdwAD8pQJggxRgwABQqF3AAPx0AWDAAFCoXcAA/KUCYIMUYMAAUKhdwAD8dAFgwABRD13AAPx0AWDAAFEPXcAA/HQBYMAAUQZdwAD8dAFgwABRBl3AAPx0AWDAAFEGXcAA/HQBYMAAUQ9dwAD8dAFgiLNdwAD8dAFgwABRBl3AAPx0AWDAAFEGXcAA/HQBYMAAUVJdwAD8dAFgwABRD13AAPx0AWDAAFStXcAA/HQBYMAAVK1dwAD8dAFgwABWdV3AAPx0AWDAAFZ1XcAA/HQBYMAAVnVdwAD8pQJggxRgmrpdwAD8dAFgiUpdwAD8dAFgiLNdwAD8pQJggxRgmrpdwAD8pQJgwABWm2DAAFZ1XcAA/HQBYMAAVnVdwAD8dAFgwABWdV3AAPx0AWDAAFZ1XcAA/HQBXcAA/HQBYMAAVK1dwAD8dAFdwAD8dAFgwABUrV3AAPx0AV3AAPx0AWDAAFStXcAA/HQBXcAA/HQBYMAAVK1dwAD8dAFdwAD8dAFgwABUrV3AAPx0AV3AAPx0AWDAAFStXcAA/HQBXcAA/HQBYMAAVK1dwAD8dAFdwAD8dAFgwABUrV3AAPx0AV3AAPx0AWDAAFStXcAA/HQBXcAA/HQBYMAAVK1dwAD8dAFgwABUrV3AAPx0AWDAAFStXcAA/HQBYMAAVK1dwAD8dAFgwABUrV3AAPx0AWDAAFStXcAA/KUCYMAA/bZgkWddwAD8dAFgkWddwAD8dAFgwABUrV3AAPx0AWDAAFStXcAA/HQBYMAAVK1dwAD8dAFgwABUrV3AAPx0AWDAAFStXcAA/HQBYMAAVnVdwAD8dAFgwABQqF3AAPx0AWDAAFCoXcAA/HQBYMAAUKhgwAD70F3AAPx0AWCIs13AAPx0AWCIs13AAPx0AWCIs2DAAP22XcAA/HQBYIksXcAA/HQBYIksXcAA/HQBYIksXcAA/HQBYIksXcAA/HQBYIksXcAA/HQBYIizYMAA/bZdwAD8dAFgiSxdwAD8dAFgiLNhA2CDWWCDWWDAAPoKXF3AAPx0AWDAAFStXcAA/HQBYIPlXcAA/HQBYIPlXcAA/HQBYMAAVK1dwAD8dAFgiLNgwAD9tmDAAPvQXcAA/HQBYMAAVK1gwAD9tl3AAPx0AWCIs13AAPx0AWCIs13AAPx0AWDAAFZ1XcAA/HQBYMAAVptdwAD8dAFgiLNdwAD8dAFgiLNdwAD8dAFgwABWdV3AAPx0AWDAAFUAXcAA/HQBYMAAVQBhAmDAAP22YMAAVK1cXcAA/HQBYISpXcAA/HQBYIdfXcAA/HQBYIdfXcAA/HQBYIdfXcAA/HQBYIdfXcAA/HQBYIdfXcAA/HQBYIdfXcAA/HQBYIdfXcAA/HQBYIcAXcAA/HQBYIdfXcAA/HQBYIdfXcAA/HQBYIdfXcAA/HQBYIdfXcAA/HQBYIdfXcAA/HQBYIdfXcAA/HQBYIdfXcAA/HQBYISpXcAA/HQBYISpYQFdwAD8dAFghKlghKldwAD8dAFghKlhAV3AAPx0AWCEqWCEqV3AAPx0AWCEqV3AAPx0AWCEqWEBXcAA/HQBYISpYISpYQFdwAD8dAFghKlghKlhAV3AAPx0AWCEqWCEqWEBXcAA/HQBYISpYISpXcAA/HQBYISpXcAA/HQBYISpXcAA/HQBYISpYQFdwAD8dAFghKlghKldwAD8dAFghwBdwAD8dAFghKlhAV3AAPx0AWCHAGCG8l3AAPx0AWCEqWEBXcAA/HQBYIcAYIbyXcAA/HQBYISpXcAA/HQBYISpYQFdwAD8dAFghwBghvJhAV3AAPx0AWCHAGCG8mEBXcAA/HQBYIcAYIbyYQFdwAD8dAFghwBghvJdwAD8dAFghKldwAD8dAFghwBdwAD8dAFghKlhAV3AAPx0AWCHAGCG8l3AAPx0AWCHAF3AAPx0AWCeq13AAPx0AWDAAP22XcAA/HQBYMAA/bZdwAD8dAFgrkpdwAD8dAFgrkpdwAD8dAFgrkpdwAD8dAFgrkpdwAD8dAFgrkpdwAD8dAFgrkpdwAD8dAFgwABVAF3AAPx0AWDAAFUAXcAA/HQBYMAAVQBdwAD8pQJgwAD9tmDAAFUAXcAA/HQBYLVcXcAA/KUCYMAA/bZgwABWm13AAPx0AWDAAP22XcAA/HQBYIizXcAA/HQBYIksXcAA/HQBYIizXcAA/HQBYIizXcAA/HQBYIizXcAA/HQBYIizYMAA/bZdwAD8dAFgiSxdwAD8dAFgiSxdwAD8dAFgiSxdwAD8dAFgiSxdwAD8dAFgiSxdwAD8dAFgiLNgwAD9tl3AAPx0AWCJLF3AAPx0AWCIs13AAPx0AWCIs13AAPx0AWCIs13AAPylAmCJSmCIs13AAPylAmDAAP22YMAAVJddwAD8dAFgiLNdwAD9ZwFgiLNdwAD8dAFgiLNdwAD8pQJgwABUSmDAAPvQXcAA/KUCYMAAVEpgwAD70F3AAPylAmDAAFRKYMAA+9BdwAD9ZwFgwABUSl3AAPylAmDAAP22YMAAVK1dwAD8dAFghKlhA2CDWWCDWWDAAPoKW13AAPx0AWCD5V3AAPx0AWCD5V3AAPx0AWCD5V3AAPx0AWCD5V3AAPx0AWCD5WCCi13AAP1nAWCIfl3AAP1nAWCIfmCCi13AAP1nAWCIfl3AAP1nAWCIfl3AAP1nAWCIfl3AAP1nAWCIfl3AAPx0AWCRZ13AAPylAmCJSmCIs13AAPx0AWCRZ13AAPx0AWCRZ13AAPx0AWCRZ13AAPx0AWCRZ13AAPx0AWCRZ2DAAP22XcAA/HQBYJFnXcAA/KUCYIlKYIizYQFgwABUSmDAAFRKYQJgiH5gwAD6CmCDpF3AAPylAmDAAP22YMAAVeldwAD8pQJgwAD9tmDAAFXpXcAA/KUCYMAA/bZgwABV6V3AAPylAmDAAP22YMAAVeldwAD8pQJgwAD9tmDAAFXpXcAA/HQBYMAAVOldwAD8pQJgwAD9tmDAAFXpXcAA/HQBYISpXcAA/HQBYIQxXcAA/HQBYIQxXcAA/HQBYIQxXcAA/KUCYMAA/bZgwABUrV3AAPylAmDAAP22YMAAVK1dwAD8pQJgwAD9tmDAAFStXcAA/HQBYIlKXcAA/HQBYIhOXcAA/HQBYIhOXcAA/HQBYIhOXcAA/HQBYIhOXcAA/KUCYIlKYIizYQFgiLNgiLNhAWCIs2CIs2EBYIizYIizXcAA/KUCYIOkYMAAVaZdwAD8dAFgiLNdwAD8dAFghDFdwAD8dAFghDFdwAD8dAFghDFdwAD8dAFghDFdwAD8dAFghDFdwAD8dAFghDFdwAD8pQJgiUpgiLNdwAD8dAFgiLNdwAD8dAFgiLNdwAD8dAFgiLNdwAD8dAFgiSxdwAD8dAFgiUpdwAD8dAFgwABWm13AAPx0AWDAAFUAXcAA/HQBYMAAVnVdwAD8dAFgwABSEF3AAPylAmDAAP22YMAAVK1dwAD8pQJgwAD9tmDAAFStXcAA/HQBYMAAVnVdwAD8dAFgwABWdV3AAPx0AWDAAFZ1XcAA/KUCYMAA/bZgwABUrV3AAPylAmDAAP22YMAAVK1dwAD8dAFgiUpdwAD8dAFgiUpdwAD8dAFgiE5dwAD8dAFgiE5dwAD8pQJgiUpgiLNdwAD8dAFgiLNdwAD9ZwFgiLNdwAD8dAFgiLNdwAD8dAFgiUphAmCu2mDAAP0cYMAA+gphAWDAAP0cYMAA/bZhAWDAAP0cYMAA/bZhAmDAAP0cYMAA+9BgwAD9tmECYMAA/RxgwAD70GDAAP22YQJgwAD9HGDAAPvQYMAA/bZhAmCu2mDAAP0cYMAA+gphAWDAAP0cYMAA/bZdwAD8dAFgwAD9HF3AAPx0AWDAAP0cXcAA/HQBYMAA/RxdwAD8dAFgwAD9HF3AAPx0AWDAAP0cXcAA/HQBYMAA/RxdwAD8dAFgwAD9HF3AAPx0AWDAAPvQXcAA/KUCYIlKYMAA+9BdwAD8dAFdwAD8dAFgwAD70F3AAPx0AWDAAPvQXcAA/WcBYIlKXcAA/HQBYIizXcAA/KUCYIlKYIizXcAA/KUCYIlKYIizXcAA/HQBYIizXcAA/KUCYIlKYIizXcAA/KUCYIlKYIizXcAA/HQBYIizXcAA/HQBYMAAWjJdwAD8dAFgwABaMl3AAPx0AWDAAFoyXcAA/HQBYMAAWjJdwAD8dAFgwABaMl3AAPx0AWDAAFoyXcAA/HQBYMAAWjJdwAD8dAFgwABaMl3AAPx0AWDAAFoyXcAA/HQBYMAAWjJdwAD8dAFgwABaMl3AAPx0AWDAAFoyXcAA/HQBYMAAWjJdwAD8pQJgiUpgiLNdwAD8dAFgwABaMl3AAPx0AWDAAFoyXcAA/HQBYMAAWjJdwAD8dAFgwABaMl3AAPx0AWCIs13AAPx0AWCIs13AAPx0AWCIs13AAPx0AWCJLF3AAPylAmCJSmDAAFPHXcAA/HQBYMAAWnRdwAD8dAFgwABadF3AAPx0AWCJSl3AAPylAmCJSmCIs13AAPylAmCJSmCIs13AAPylAl8AAGDAAPvQXcAA/HQBXwAAXcAA/HQBXwAAXcAAWoEBXwAAYQFfAABcXcAA/HQBXwAAXcAA/WcBXwAAXcAA/HQBXcAA/HQBXwAAYQFfAABcXcAA/HQBYMAAWrJdwAD8dAFgwABasmEBYMAA/bZgwAD6Cl4AAQQBYMAA/bYDhbRhAWDAAP22YMAA+gquuGDAAPvQrrlgwAD6CgFXwABalgBcYQFgwAD9tmDAAPoKXgADAwNgtYdgtblgwAD9tgABV7XPAFtdwAD8pQJfAABfAQBdwAD8pQJfAABfAQBhAF8BAF3AAPylAl8AAF8BAF3AAPylAl8AAF8BAF3AAPylAl8AAF8BAF3AAPylAl8AAF8BAF3AAPwyAV8AAF3AAPwyAV8AAF3AAPwyAV8AAF3AAPwyAV8AAF3AAPwyAV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAP1nAV8AAF3AAP1nAV8AAF3AAPx0AVthAF8BAF3AAFtlAl8AAF8BAF3AAPx0AVtdwABbhAFfAABhAV8AAGDAAPoKYQFfAABgwAD6Cl3AAP1nAV8AAF3AAP1nAV8AAF3AAP1nAVtdwAD9ZwFbXcAA/WcBXwAAXcAA/HQBW14AAQEBWwABV7XNAFtdwAC5ngFgwAD9tl3AALmeAWDAAP22YQBcYQBcXcAA/HQBYMAA/bZgwAD7xmDAAMeBXcAA/HQBYMAAXA5dwAD8dAFgwABcDl3AAPylAltdwAD8pQJbW13AAPylAltbYQFbW13AAPylAltbXcAA/KUCW13AAPylAltdwAD8dAFbXcAA/KUCW13AAPx0AVtdwAD8dAFbXcAA/KUCW13AAPylAltdwAD8dAFbXcAA/KUCW13AAPx0AVtdwAD8dAFbXcAA/KUCW13AAPylAltdwAD8dAFbXcAA/HQBW13AAPylAltdwAD8dAFbXcAA/KUCW1tdwAD8pQJbXcAA/KUCW1tdwAD8pQJbYMAAXCBhAFxdwAD8pQJbYMAA+9BdwAD8pQJbYMAA+9BhAVtgwAD6Cl3AAPylAmDAAP22W13AAPylAmDAAP22W13AAPylAmDAAP22W14AAgICYMAA/bZgwAD9tgABV5NvAF3AALmeAWDAAP22YQFfAQBgwAD6Cl3AAP1nAV8AAF3AAPylAl8BAF3AAP1nAV8AAGDAAP22XcAA/KUCXwAAXwEAXcAA/KUCYMAA/bZdwAD8dAFgwAD70F3AAPx0AVtdwAD8pQJfAABfAQBhAF8BAF3AAFxKAl8AAF8BAF3AAFxKAl8AAF8BAF3AAFxKAl8AAF8BAF3AAPylAl8AAF8BAF3AAPylAl8AAF8BAF3AAPx0AVtdwAD8dAFbXcAA/HQBW13AAMI2AWC4KF3AAGgLAWDAAG7qXcAAaAsBYMAAbw9dwAD9ZwFgvKVdwABoCwFgwABvD13AAGgLAWDAAG7qXcAAaAsBYMAAbupdwABoCwFgwABu6mEBYLgoXF3AAP1nAWC8t13AAP1nAWC8pWEBYMAA/bZcXcAA/KUCYMAA/bZgwAD70F3AAPylAmDAAP22YMAA+9BdwAD8dAFgwAD9tmEAXF3AAPylAmCDWWDAAF+BXcAA/KUCYMAA/jRdwABfQwFbXcAAX0MBW2EBXwAAXGDAAF8KXcAAX0MBYINZYQFfAABcXcAA/KUCYINZYMAAX4FdwAD8dAFgiUpdwAD8dAFgiUpdwABfQwFgwABgu13AAF9DAWDAAP22XcAAX0MBYMAA/jddwABfQwFgvJthAF8AAF3AAPylAmDAAP40XcAAX0wBW13AAF9MAVtdwAD8dAFgwABiT13AAPx0AWCIs13AAPx0AWDAAGK0XcAA/HQBYMAA/bZdwAD8dAFgiUpdwAD8dAFgiSxdwABfTAFgwABfgV3AAF9MAWDAAP43XcAAX0wBYMAA/bZdwAD8dAFfAABhAF8BAF3AAPylAl8AAF8BAF3AAF9MAWDAAGC7XcAAX0wBYLybYMAAyShdwAD8dAFgwAD70GDAAMkoXcAA/HQBYMAAYrRdwAD8dAFgwABitF3AAPx0AWCJSl3AAPx0AWCJSl3AAPylAl8AAGDAAPvQYQFfAABcXcAA/KUCXwAAYMAA+9BdwAD8dAFfAABhAF8AAF3AAPx0AV8AAF3AAPylAmDAAP43YMAAX15dwAD8pQJggxRgwABfc13AAPylAmDAAP22YMAAX3NdwAD8pQJgwAD9tmCC713AAPylAmCDWWDAAF+BXcAA/KUCYMAA/bZgwABfgV3AAPylAmCDWWDAAF+BXcAA/KUCYMAA/bZgwABfgV3AAPylAmCHJWDAAGAJXcAA/KUCYIclYMAAYAlhAF8AAF3AAPx0AV8AAGEAXwAAXcAA/HQBYMAA/bZdwAD8dAFgwABiT13AAPx0AWCJSl3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAGEAXwEAXcAA/KUCXwAAXwEAYQBfAQBdwAD8pQJfAABfAQBhAWC8t18BAF3AAPylAl8AAF8BAGEAXwEAXcAA/KUCXwAAXwEAYQBfAQBdwAD8pQJfAABfAQBdwAD8dAFfAABhAF8BAF3AAPylAl8AAF8BAF3AAPx0AV8AAGEAXwAAXcAA/KUCYMAA/bZfAABdwAD8dAFfAABhAF8BAF3AAPylAl8AAF8BAF3AAPx0AWC8m2EAXwAAXcAA/KUCYLybXwAAXcAA/HQBYIizYQFfAABcYQFfAABcYQJgvLdfAABcYQFfAABcYQFfAABcYQFfAABcYQFfAABcYQFfAABcYQFfAABcYQFfAABcXcAA/HQBYIK7XcAA/KUCYMAA+9BgglJdwAD8pQJgglJgwAD70F3AAPylAmDAAPvQYIluXcAA/KUCYIluYMAA+9BdwAD9ZwFgiW5dwAD8dAFbXcAA/HQBW13AAPx0AVtdwAD8dAFbXcAA/HQBW13AAPx0AVtgwACXUV3AAGClAltbXcAAYKUCW1tdwAD8pQJgwAD53GDAAGEUXcAAYKUCW1tdwABgpQJbW13AAGClAltbXcAAYKUCW1tdwABgpQJbW13AAGClAltbXcAAYKUCW1tdwAD8dAFgwABgu13AAPx0AWDAAGC7XcAAYKUCW1tdwABgpQJbW13AAGClAltbXcAAYKUCW1tdwABgpQJbW13AAGClAltbYMAA/bZdwABgpQJbW13AAGClAltbXcAAYKUCW1tdwAD9ZwFgwABitF3AAPylAmDAAGK0XcAA/WcBYMAAYrRdwABjDgJfAABfAQBdwABjDgJfAABfAQBhAWDAAGKiW13AAPx0AWDAAGJPXcAAYw4CXwAAXwEAXcAA/HQBYMAAYrRdwAD8dAFgwABiT13AAGMOAl8AAF8BAF3AAGMOAl8AAF8BAF3AAGMOAl8AAF8BAF3AAPx0AWDAAGK0YQFgwABiT2DAAPoKYQFgwABiT2DAAPoKXcAA/HQBYMAAYrRdwABjDgJfAABfAQBdwABjDgJfAABfAQBdwABjGwJfAABfAQBdwABjGwJfAABfAQBdwABjGwJfAABfAQBdwABjGwJfAABfAQBdwABjGwJfAABfAQBdwABjGwJfAABfAQBdwABjGwJfAABfAQBdwABjJwFfAABhAmDAAGJ2YMAAYnZgwAD6Cl3AAGMnAV8AAF3AAGMnAV8AAGEAYMAA+gphAGDAAPoKYQBgwAD6Cl3AAGMnAV8AAGEAYMAA+gphAGDAAPoKYQBgwAD6CmEAYMAA+gpdwAD9ZwFgvLFdwAD9ZwFgvLFdwABjJwFfAABdwABjQQFfAABdwABjQQFfAABdwABjQQFfAABdwABjQQFfAABdwABjQQFfAABdwABjQQFfAABdwABjQQFfAABdwABjTAFfAABdwAD9ZwFgwAD9tl3AAP1nAWDAAP22XcAA/KUCYMAA/bZgwAD9tl3AAPylAmDAAP22YMAA/bZdwAD8pQJgwAD9tmDAAP22XcAA/KUCYLyRYMAAZLldwAD8pQJgwABgu2DAAJTtXcAA/KUCYMAAYLtgwAD9tl3AAPylAmDAAP22YLyWXcAA/HQBYMAA/bZdwAD8dAFgwAD9tl3AAPx0AWDAAP22XcAA/HQBYMAA/bZdwAD8pQJgvLFgwACU7V3AAPylAmDAAJTtYMAAlO1dwAD8pQJgwACU7WDAAJTtXcAA/KUCYMAA/bZgwACU7V3AAPylAmC8lmDAAP22YQFfAABgwAD9tl3AAPylAmC8kWDAAJTtXcAA/KUCYMAA/bZgwACU7V3AAPylAmDAAP22YMAA/bZhAGDAAP22XcAA/KUCYMAA/bZgwACU7V3AAPylAmDAAP22YMAA/bZdwAD8pQJgwAD9tmDAAJTtXcAA/KUCYMAA/bZgwAD9tmEAYMAA/bZdwAD8pQJgvLdgwACU7V3AAPylAmC8t2DAAJTtXcAA/KUCYMAA/bZgwACU7V3AAPylAmDAAP22YMAA+9BdwAD8pQJgvJZgwAD9tl3AAPylAmDAAGLiYMAAlO1dwAD8dAFgwAD9tl3AAPylAmDAAGC7YMAA+9BgwABkqmDAAGSqYMAAZKpgwABkqmDAAGSqXcAA/WcBYMAA/bZdwAD8pQJgwAD9tmDAAP22XcAA/WcBYMAA/bZdwAD9ZwFgwAD9tl3AAP1nAWDAAP22XcAA/WcBYMAA/bZdwAD9ZwFgwAD9tl3AAPx0AWDAAJTtXcAA/HQBYMAAlO1dwAD8pQJgvJFgwABlTV3AAPylAmC8kWDAAGVNXcAA/KUCYLyRYMAAlO1dwAD9ZwFgwAD9tl3AAP1nAWDAAP22XcAA/KUCYMAAZLlgwABlnV3AAPx0AWDAAGZgYMAA/bZdwAD8dAFgwAD70F3AAPx0AWDAAPvQXcAA/HQBYMAA+9BdwAD8pQJgwAD70GDAAPvQXcAA/KUCYMAA+9BgwAD70F3AAPylAmC8pWDAAGXZXcAA/HQBYLzkYMAA/bZgwACU7WDAAJTtYMAAlO1dwAD8dAFgwABl92DAAGX3YMAA/bZgwABl913AAPx0AWDAAP22XcAA/HQBYMAAZpxdwAD8dAFbXcAA/HQBW2EAXcAA/HQBW2EAXcAA/HQBW13AAPx0AVtdwAD8dAFbXcAA/HQBYMAAYk9dwAD8dAFgwABmkGEBXcAA/HQBW1xhAV3AAPx0AVtcYQBbYQBbYQFbW14AAQQBYMAA/bYDwABJr2EBW1vAAEmwYQBbwABJsWEAWwBcXcAA/HQBW13AAPx0AVtdwAD8dAFbXcAA/HQBW2EBYMAA/bZcXcAA/KUCYMAA/bZgwAD9tmEBYMAA/bZcYQFgwAD9tlxhAWDAAP22XGEBYMAA/bZcXgABBAFgwAD9tgPAAEmvYQFbW8AASbBhAFvAAEmxYQBbAFxdwAD8dAFbXcAA/HQBW13AAPx0AVteAAEEAWDAAP22A8AASa9hAVtbwABJsGEAW8AASbFhAFsAXGEBYMAA/bZcXcAA/HQBW14AAQQBYMAA/bYDwABJr2EBW1vAAEmwYQBbwABJsWEAWwBcXcAA/HQBW2ECYMAA/bZdwAD8pQJgwAD9tltbYQJgwAD9tl3AAPylAmDAAP22W1thAmDAAP22XcAA/KUCYMAA/bZbW2EBYMAA/bZcYQFgwAB3xVxhAWDAAGacXGEBYMAA+gpcYQFgwAD6ClxhAWDAAP22XGEBYMAA/bZcYQFgwAD9tlxhAWDAAP22XGEBYMAA/bZcXgABAgFgwAD9tgGdRWDAAPoKAVfAAGaKAFteAAECAWDAAP22AZ1FYMAA+goBV8AAZooAW13AAPx0AVtdwAD8dAFbXcAA/HQBW13AAPx0AVtdwAD8dAFbXcAA/HQBW13AAPx0AVtdwAD8dAFbXcAA/HQBW13AAPx0AWDAAP22XcAAaFcBXwAAXcAAaFcBXwAAXcAA/HQBYMAA/bZgwAD9tmEBYMAAYLtgwABgu2ECYMAAYLtgwABgu2DAAGC7YQJgwABgu2DAAGC7YMAAYLthAmDAAGC7YMAAYLtgwABgu2ECYMAAYLtgwABgu2DAAGFGYQFgwAD6gmDAAGC7YQFgwAD6gmDAAGC7XcAA/HQBYMAAYLtdwAD8dAFgwABgu13AAPx0AWDAAGC7XcAA/KUCYLylYMAAatddwAD8pQJgvJZgwAD9tl3AAPylAmC8pWDAAP22XcAA/WcBYLylXcAA/KUCYLy3YMAA/bZdwAD8pQJgvKVgwABq113AAPylAmC8lmDAAP22XcAA/KUCYLylYMAA/bZdwAD9ZwFgvKVdwAD8pQJgvLdgwAD9tl3AAPylAmC8t2DAAP22XcAA/KUCYLzMYMAAZrRdwAD8pQJgvLdgwABmtF3AAPylAmC8t2DAAGa0XcAA/KUCYLy3YMAA/bZdwAD8pQJgvMxgwABmtF3AAPylAmC8t2DAAP22XcAA/KUCYLy3YMAAZrRdwAD8pQJgvLdgwABmtF3AAPylAmC8t2DAAP22XcAA/KUCYLy3YMAAchFdwAD8dAFgvLddwAD8pQJgwAByEV3AAPx0AWC8t13AAPylAmC8t2DAAHIRXcAA/KUCYLy3YMAAchFdwAD8pQJgiE5gwABrS13AAPylAmCCUmDAAGsqXcAA/HQBYIJSXcAA/KUCYMAAaypdwAD8dAFgglJdwAD8pQJgiE5gwABrS13AAI53AmDAAGtLYMAAa1ddwACOdwJgwABrS2DAAGtXXcAA/KUCYIJSYMAAaypdwAD9ZwFgh6RdwAD8pQJgglJgwABrKl3AAPylAmCCUmDAAGsqXcAA/HQBYMAAhVFeAAECAWC88AHAAEgiYMAA+goAXGEAYMAA+gphAGDAAPoKXcAA/HQBYMAAbGxdwAD8dAFgwABsg13AAPx0AWDAAGy9XcAA/HQBYMAAbNJdwAD8dAFgwABsol3AAPx0AWDAAGyvXcAA/HQBYMAAbJRdwAD8dAFgwABs2l3AAPylAmDAAGwoXcAA/HQBYMAAbChdwAD8dAFgwABsel3AAPylAmDAAP22W13AAPylAmDAAP22W13AAPx0AWDAAP22XcAA/HQBYMAAbL1dwAD8dAFgwABsol3AAPx0AWDAAGyDXcAA/HQBYMAAbK9dwAD8dAFgwABsvV3AAPx0AWDAAGyiXcAA/KUCYMAA/bZgwABsKF3AAP1nAWDAAPvQXcAA/KUCYMAAbChgwABtW13AAMPlAmDAAP22XcAA/KUCW1tdwADD5QJgwAD9tl3AAPx0AVtdwADD5QJgwAD9tl3AAPx0AVtdwAD8pQJgwAD9tmDAAP0cXcAA/KUCYMAA/bZgwAD9HF3AAPylAmDAAP22YMAA/RxdwAD8pQJbW13AAPylAltbXcAA/KUCW1tdwAD8pQJbW13AAPylAltbXcAA/KUCW1tdwAD8pQJbW13AAPylAltbXcAA/KUCW1tdwAD8pQJbW13AAPylAltbYQFgwABsKGDAAG1bXcAA/KUCYMAAbChdwAD8dAFgwABsKF3AAPylAmDAAP22W13AAPylAmDAAP22W13AAPylAmDAAGv7YMAAbb9dwAD8dAFgwABrxF3AAPx0AWCITl3AAPx0AWCITl3AAPylAmDAAGvEYMAAbdVdwAD8pQJgwABrj2DAAG2xXcAA/KUCYMAAa/tgwABtt2EBYLzJYMAA+gpdwAD8pQJgvMlgwABt8mEBYMAAYLtcYQFgwABgu1xhAWDAAGC7XGEBYMAAYLtcYQFgvMlgwAD6Cl3AAPylAmC8yWDAAG3yXcAA/HQBYMAAa/tdwAD8dAFgwABr+13AAP1nAWDAAGv7YQFgvMlgwAD6Cl3AAPylAmC8yWDAAG3yYQFgvMlgwAD6CmEBYMAAa/tgwABt8l3AAPx0AWC8yV3AAPylAmC8yWDAAG3yXcAA/WcBYMAAa/tgwAD70GDAAPvQXcAA/HQBYMAAbhRdwABoCwFgwABuFF3AAGgLAWDAAG4UYQFgvMxcXcAAaAsBYMAAbhRhAWC8zFxdwABoCwFgwABuFGEBYLzMXF3AAGgLAWDAAG4UYQFgvMxcXcAAaAsBYMAAbhRdwABoCwFgwABuFF3AAGgLAWDAAG4UXcAAaAsBYMAAbhRdwABoCwFgwABuFF3AAGgLAWDAAG4UXcAAaAsBYMAAbhRdwABoCwFgwABuFF3AAGgLAWDAAG4UXcAAaAsBYMAAbhRdwABoCwFgwABuFF3AAGgLAWDAAG4UXcAAaAsBYMAAbhRdwABoCwFgwABuFF3AAPylAmC8t13AAGgLAWDAAG4UXcAA/HQBYMAAgABdwAD8dAFgwACAAF3AAPx0AWDAAIAAXcAAaAsBYMAAbhRdwABoCwFgwABuFF3AAGgLAWDAAG4UXcAAaAsBYMAAbhRdwABoCwFgwABuFF3AAGgLAWDAAG4UXcAA/KUCYMAAbhRdwABoCwFgwABuFF3AAGgLAWDAAG4UXcAAaAsBXwAAXcAAaAsBXwAAYQFdwABoCwFgwABvN13AAGgLAWDAAG83YQFdwABoCwFgwABvN13AAGgLAWDAAG83YQFdwABoCwFgwABvN13AAGgLAWDAAG83YQBdwABoCwFgwABvN2EAXcAAaAsBYMAAbzdhAF3AAGgLAWDAAG83YQBdwABoCwFgwABvN2EAXcAAaAsBYMAAbzdhAF3AAGgLAWDAAG83YQBdwABoCwFgwABvN2EAXcAAaAsBYMAAbzdhAF3AAGgLAWDAAG83YQBdwABoCwFgwABvN2EAXcAAaAsBYMAAbzddwABoCwFgwABvN13AAGgLAWDAAG83XcAAaAsBYMAAbzddwABoCwFgwABvN13AAGgLAWDAAG83XcAAaAsBYMAAbupdwABoCwFgwABvN13AAGgLAWDAAG83XcAAaAsBYMAAbupdwABoCwFgwABvN13AAGgLAWDAAG83XcAAaAsBYMAAbzddwABoCwFgwABvN13AAGgLAWDAAG7qXcAAaAsBYMAAbzddwABoCwFgwABvN13AAGgLAWDAAG83XcAAaAsBYMAAbzddwABoCwFgwABvN13AAGgLAWDAAG83XcAAaAsBYMAAbupdwABoCwFgwABu6l3AAPx0AWDAAGC7XcAAaAsBYMAAbzddwABoCwFgwABvN13AAGgLAWDAAG7qXcAAaAsBYMAAbzddwABoCwFgwABvN13AAGgLAWDAAG7qXcAAaAsBYMAAbzddwABoCwFgwABvN13AAGgLAWDAAG83XcAAaAsBYMAAbzddwABoCwFgwABu6l3AAGgLAWDAAG83XcAAaAsBYMAAbzddwABoCwFgwABvN13AAGgLAWDAAG83XcAAaAsBYMAAbzddwABoCwFgwABvN13AAGgLAWDAAG7qXcAAaAsBYMAAbzddwABoCwFgwABvN13AAGgLAWDAAG83XcAAaAsBYMAAbzddwABoCwFgwABu6l3AAGgLAWDAAG7qXcAAaAsBYMAAbupdwABoCwFgwABvN13AAGgL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AWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxhAWC8pVxdwAD9ZwFgvKVdwAD9ZwFgvKVdwAD9ZwFgvKVdwAD9ZwFgvKVdwAD9ZwFgvKVdwAD8dAFgvORhAWDAAHinXGEBYMAAeKdcYQFgwAB4p1xhAWDAAHinXGEBYMAAeKdcYQFgwAB4p1xhAWDAAHinXGEBYMAAeKdcYQFgwAB4p1xhAWDAAHinXGEBYMAAeKdcYQFgwAB4p1xhAWDAAHinXGEBYMAAeKdcYQFgwAB4p1xhAWDAAHinXGEBYMAAeKdcYQFgwAB4p1xhAWDAAHinXGEBYMAAeKdcYQFgwAB4p1xhAWDAAHinXGEBYMAAeKdcYQFgwAB4p1xhAWDAAHinXGEBYMAAeKdcYQFgwAB4p1xhAWDAAHinXGEBYMAAeKdcYQFgwAB4p1xhAWDAAHinXGEBYMAAeKdcYQFgwAB4p1xhAWDAAHinXGEBYMAAeKdcYQFgwAB4p1xhAWDAAHinXGEBYMAAeKdcYQFgwAB4p1xhAWDAAHinXGEBYMAAeKdcYQFgwAB4p1xhAWDAAHinXF3AAP1nAWC8zF3AAPylAmDAAP22XcAA/WcBYLy3XcAA/KUCYMAA/bZdwAD9ZwFgvLddwAD8pQJgwAD9tl3AAP1nAWC8pV3AAP1nAWC8pV3AAP1nAWC8pV3AAP1nAWC8pV3AAPylAmDAAP22XcAA/WcBYLy3XcAA/WcBYLy3XcAA/WcBYLylXcAA/WcBYLylXcAA/KUCYMAA/bZdwAD9ZwFgvLddwAD9ZwFgvLddwAD9ZwFgvKVdwAD8dAFgwAB6Ll3AAPylAmDAAEtIXcAA/KUCYMAA/bZgwAB6Ll3AAPylAmDAAP22YMAAei5dwAD9ZwFgvKVdwAD8pQJgwAD9tmDAAHo3XcAA/WcBYLylXcAA/WcBYLylYQFgwABidlxhAWDAAGJ2XGEBYMAAYnZcYQFgwABidlxdwAD9ZwFgvKVdwAD9ZwFgvKVdwAD9ZwFgvKVhAWDAAP22XF3AAP1nAWC8pV3AAP1nAWC8pWEBYMAA/bZcXcAA/WcB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YV3AAPylAmDAAEVhYMAARWFdwAD8pQJgwABFYWDAAEVhXcAA/KUCYMAA/RxdwAD8pQJgwABFYWDAAEVhXcAA/KUCYMAARWFgwABFYV3AAPx0AWDAAEVhXcAA/HQBYMAA/RxdwAD8pQJgwABFYWDAAEVhXcAA/KUCYMAARWFdwAD8pQJgwABFYWDAAEVhXcAA/KUCYMAARWFgwABFYV3AAPylAmDAAEVhYMAARWFdwAD8pQJgwABFYV3AAPylAmDAAEVhYMAARWFdwAD8pQJgwABFYWDAAEVhXZRxAWDAAEVhXZRxAWDAAEVhXcAA/KUCYMAA/RxdwAD8pQJgwABFYWDAAEVhXcAA/KUCYMAARWFdwAD8pQJgwABFYWDAAEVhXZRxAWDAAEVhXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAk14CXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAXcAAkxwCXwAAXwEAYQJgwAD9tmDAAP22YMAAlk1hAmDAAP22YMAA/bZgwACWTWECYMAA/bZgwAD9tmDAAJZNXcAA/HQBYMAAljNdwAD8dAFgwACWM13AAPx0AWDAAJaYXcAA/HQBYMAAlONdwAD8dAFgwACU413AAPx0AWDAAJalXcAA/HQBYMAAlqVdwAD8dAFgwACVwl3AAPx0AWDAAJXCXcAA/HQBYMAAlqVdwAD8dAFgwACWmF3AAPx0AWDAAJTjXcAA/HQBYMAAlqVdwAD8dAFgwACVQWEBYMAAlOpcYQFgwACU6lxdwAD8dAFgwACTzF3AAPx0AWDAAJalW1thAWDAAJTjYMAAk8xhAWDAAJTjYMAAk8xhAWDAAJTjYMAAk8xdwAD8dAFgwACWpV3AAPx0AVtdwAD8dAFgwACUlV3AAPx0AWDAAP22YQFgwACU42DAAPoKXcAA/WcBXwAAXcAA/HQBXwAAXcAAmHYBYMAA/bZdwACYdgFgwAD9tl3AAPx0AV3AAPylAmDAAP22YMAA/bZdwAD8dAFgwAD70F3AAPx0AWDAAPvQXcAA/HQBYMAA+9BdwAD8dAFgwAD70F3AAPylAmDAAP22YMAA/bZdwAD8pQJgwAD9tmDAAJjtXcAA/KUCYMAA/bZgwACY7WEBW2DAAJTjYQFbYMAAlcJhAVtgwACTzF3AAPx0AWDAAJPMXcAA/HQBYMAAk8xhAVtcXgABAQFbAAFXwACSfgBbXcAA/HQBYMAAk8xdwAD8dAFgwACTzF3AAPx0AWDAAJPMYQFbXF4AAQEBWwABV8AAkn4AW14AAQEBWwABV8AAkn4AW2EBYMAAlrNhAVtgwAD9HGEBW2DAAP0cXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXcAA/HQBYMAAlUFeAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFtdwAD8dAFgwACU413AAPx0AWDAAJTjYQJbW1teAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFteAAEBAVsAAVfAAJJ+AFtdwAD8dAFgwACVwl3AAPx0AWDAAJXCXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXgABAQFbAAFXwACSfgBbXcAA/HQBYMAAlphdwAD8dAFgwACWmF4AAQEBWwABV8AAkn4AW14AAQEBWwABV8AAkn4AW14AAQEBWwABV8AAkn4AW13AAP1nAWDAAJOsXcAA/WcBYMAAk6xdwAD9ZwFgwAD9tl3AAPx0AWDAAP22YMAA+8ZdkuIBYMAA/bZgwACZvmDAAJm+YMAAmc9gwACZz2DAAJnPYQFgglJgwAD6CmEBYIJSYMAA+gphAWCCUmDAAPoKYQFgglJghNRhAWCCUmDAAPoKYQFgglJgwAD6CmEBYIJSYITUYQFgglJgwAD6CmEBYIJSYMAA+gphAWCCUmCE1GEBYIJSYMAA+gphAWCCUmDAAPoKYQFgglJghNRhAWCCUmDAAPoKXcAA/KUCYITUYMAAmpVdwAD8pQJghNRgwACalV3AALL7AWDAAGwoXcAAsvsBYMAAbChdwACy+wFgwABsKF3AALL7AWDAAGwoXcAAsvsBYMAAbChdwACy+wFgwABsKF3AAPx0AVthAV8AAFxhAV8AAFxdwAD8pQJfAABgwAD70GEBXwAAXF3AAPylAmDAAP40XcAAmsgBW13AAJrIAVthAV8AAFxdwACayAFgwAD9tl3AAJrIAWDAAP43YMAAyShgwADjRWDAAOLzXcAA/YQBXcAA/HQBYMAA+9BgwADi82DAAOLzYMAA4vNgwADi82DAAOLzYMAA4vNgwADi82DAAOLzXcAA/YQBXcAA/HQBYMAA+9BgwADi813AAP2EAV3AAPx0AWDAAPvQXcAA/YQBXcAA/HQBYMAA+9BdwAD9hAFdwAD8dAFgwAD70GEAXwAAXcAA/HQBXwAAYQBfAABdwAD8dAFgwAD9tmEAXwAAXcAA/KUCYMAA/bZfAABdwAD9ZwFgwAD70F3AAPx0AV8AAGEAXwAAXcAA/HQBXwAAXcAA/KUCYMAA/jRdwACbKwFbXcAAmysBW13AAJsrAWDAAP43XcAAmysBYMAA/bZdwAD8dAFgwAD70GDAAMkoYQBcXcAA/WcBYIhOXcAA/KUCYIJLYMAAgCRhAFxdwAD9ZwFgiE5dwAD8dAFggktdwAD9ZwFggktdwAD9ZwFgwACAVF3AAPylAmDAAICBXcAA/WcBYMAAgFRdwAD9ZwFgiE5dwAD9ZwFgwACAVF3AAPx0AWCITl3AAPylAmCCS2DAAIAkXcAA/KUCYIJSYMAAgBRdwAD9ZwFggktdwAD9ZwFgwACAVF3AAP1nAWCDd13AAP1nAWCDd2DAAP22YMAA+9BdwAD9ZwFgwACcNl3AAP1nAWDAAJw2XcAA/KUCYMAAnDZgwAD70F3AAPylAmDAAJw2YMAA+9BdwAD8pQJgwACcNmDAAPvQXcAA/KUCYMAAnDZgwAD70F2UcQFgwAD9HF3AAPylAmC8t12UcQFgwAD9HGEBW2DAAPoKYQBgwACcNmEBW2DAAPoKYQFbYMAA+gphAVtgwAD6CmEBW2DAAPoKYQFbYMAA+gphAVtgwAD6CmEAYMAAnDZhAVtgwAD6CmEBW2DAAPoKYQFbYMAA+gphAGDAAJw2YQFbYMAA+gphAVtgwAD6CmEAYMAAnDZhAVtgwAD6CmEBW2DAAPoKYQFbYMAA+gphAGDAAJw2YQFbYMAA+gpdwAD9ZwFgwACcNl3AAP1nAWDAAJw2XcAA/WcBYMAAnDZdwAD8pQJgwAD9tmDAAJ4fXcAA/KUCYMAA/bZgwACeH13AAPx0AWDAAJw2XcAA/KUCYMAA/bZgvctdwAD9ZwFgwACcNl3AAP1nAWDAAJw2YQBgwABFYWEAYMAARWFhAGDAAEVhYQBgwABFYV3AAPx0AWDAAEVhXcAA/HQBYMAARWFdwAD9ZwFgwABiol3AAP1nAWDAAGKiXcAA/HQBYMAAYqJdwAD8dAFgwABiol3AAPylAmC88GC8yV3AAPx0AWDAAJ96XcAA/HQBYMAAn3pdwAD8dAFgwACFWl3AAPx0AWDAAJ96XcAA/HQBYMAAn3pdwAD8pQJgglJgwACcNl3AAPylAmCCUmDAAJw2XcAA/KUCYIJSYMAAnDZdwAD8dAFbXcAA/HQBW13AAPx0AWDAAJw2XcAA/KUCYMAA/bZgwACcNl3AAPylAmDAAIVaXcAA/HQBYMAAn3pdwAD8pQJgwACFWl3AAPx0AWDAAJ96XcAA/HQBYMAAn3pdwAD8dAFgwACfemEAXGEBYMAA+9BgwAD70GEBYMAA+9BgwAD70GEBYMAA+9BgwAD70F3AAPylAmCCUmDAAJw2XcAA/KUCYIJSYMAAnDZdwAD8pQJgglJgwACcNl3AAPylAmCCUmDAAJw2XcAA/WcBYLzwXcAA/KUCYIJSYMAAnDZdwAD8dAFgwACdMF3AAPylAmC88GDAAJw2XZRxAWC88GECYLzwYMAAnDZcXcAA/KUCYLzJYMAAnDZhAWC88FxhAWC88FxdwAD9ZwFgvPBdwAD9ZwFgwACcNl3AAP1nAWDAAJw2XcAA/WcBYMAAnDZdwAD9ZwFgwACcNl3AAPx0AWDAAJ4BXcAA/HQBYMAAnDZdwAD8dAFgwACcNl3AAPx0AWDAAJw2XcAA/HQBYMAAnDZdwAD8dAFgwACcNl3AAPylAmDAAJw2XcAA/WcBYMAAnDZdwAD8pQJgwACcNl3AAP1nAWDAAJw2XcAA/HQBYMAAnDZdwAD8pQJgvLddwAD8dAFgwACcNl3AAPx0AWDAAP22XcAA/HQBYMAA/bZdwAD8dAFgwAD9tl3AAPx0AWDAAP22XcAA/HQBYMAA/bZdwAD8dAFgwAD9tl3AAPx0AWDAAP22XcAA/WcBYMAA/bZdwAD9ZwFgwAD9tl3AAPylAmDAAJw2YMAA+9BdwAD8dAFgwACcNl3AAP1nAWDAAJw2XcAA/KUCYMAA/bZgwACcNl3AAPylAmDAAP22YMAAnDZhAFxdwAD8dAFgwACcNl3AAPylAmC88GDAAJz/XcAA/HQBYMAAnDZdwAD8pQJgvLdgwACckl3AAPx0AWDAAJw2XcAA/KUCYL3LYMAAnDZdwAD8dAFgwACcNl3AAPylAmCCUmDAAJ26XcAA/WcBYMAAnDZdwAD8dAFgwACcNl3AAPylAmCCUmDAAJ3fXcAA/HQBYMAAnDZdwAD8dAFgwACcNl3AAPx0AWDAAJw2XcAA/KUCYIJSYMAAnDZdwAD8dAFgwACcNl3AAPx0AWDAAJw2XcAA/HQBW2EDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGEDYMAA/bZgwAD70GDAAP22XGDAAJdRYMAAl1FgwACXUWDAAJdRYMAAl1FgwACXUWDAAJdRYMAAl1FgwACXUV3AAP1nAWDAAEtIXcAA/HQBYMAAlcJdwAD8dAFgwACVwl3AAPx0AWDAAJTjYMAAl1FgwACXUWEAYMAAlONdwAD8pQJgwACU7WDAAJTjXcAA/KUCYMAAlO1gwABLSF3AAPx0AWDAAP22YMAAl1FgwACXUWDAAJdRYMAAl1FgwACXUV3AAPx0AWDAAJTjYMAAl1FdwAD8dAFgwACVwl3AAPx0AWDAAJTjYMAAl1FgwACXUWDAAJdRXcAA/WcBYLzzYQBdwAD9ZwFgvPNdwAD8dAFgwACN3V3AAPx0AWDAAI3dYMAAl1FgwACXUWDAAJdRYMAAl1FhAWC8pWDAAJTjYQFgvKVgwACU42EBYLylYMAAlONdwAD8dAFgwACTzF3AAPx0AWDAAJPMYQFgvKVgwACTzF3AAPx0AWDAAJPMYQFgvKVgwACTzF3AAPx0AWDAAJPMXcAA/HQBYMAAk8xhAWC8pWDAAJPMXcAA/HQBYMAAk8xhAWC8pWDAAJPMXcAA/HQBYMAAk8xhAWC8pWDAAJTjXcAA/HQBYMAAk8xhAWC8pWDAAJTjXcAA/HQBYMAAk8xgwACXUWDAAJdRYMAAl1FgwACXUWDAAJdRYMAAl1FgwACXUWECW1tgwACU42DAAJdRYQJbW2DAAJTjYQBgwACU42ECW1tgwACU42EAYMAAlONdwAD8dAFgwAD9tl3AAPx0AWDAAP22XcAA/HQBYMAA/bZdwAD8dAFgwAD9tmDAAJdRXcAA/HQBYMAAlONdwAD8dAFgwACU413AAPx0AWDAAJaYXcAA/HQBYMAAlONhAWDAAP22YMAAlONhAWDAAP22YMAAlONhAWDAAP22YMAAlONhAV3AAPwyAWDAAP22YMAA/bZhAV3AAPwyAWDAAP22YMAA/bZdwAD8dAFgwACWM13AAPx0AWDAAJYzYQFgwACU42DAAJTjYMAAl1FdwAD8dAFgwACVwl3AAPx0AWDAAJTjYMAAl1FdwAD8dAFgwACVwl3AAPx0AWDAAJTjYMAAl1FdwAD8dAFgwAD9tl3AAPx0AWDAAJTjYMAAl1FdwAD8dAFgwACVwl3AAPx0AWDAAJTjXcAA/HQBYMAAlONdwAD8dAFgwACU413AAPx0AWDAAJTjXcAA/HQBYMAAlcJdwAD8dAFgwACU42DAAJdRYMAAl1FdwAD9ZwFgwABLSF3AAP1nAWDAAEtIXcAA/HQBYMAAjeJdwAD9ZwFgwABLSF3AAP1nAWDAAEtIXcAA/HQBYMAAjeJdwAD9ZwFgwABLSF3AAP1nAWDAAEtIXcAA/HQBYMAAjeJdwAD9ZwFgwABLSF3AAPx0AWDAAI3iXcAA/KUCYLylYMAAooVdwAD8pQJgvKVgwACihV3AAPylAmC8pWDAAKKFYQJgwACU7WDAAJOsXGEBYMAAon9cYQFgwACif1xhAWDAAKJ/XGDAAJdRYMAAl1FhAWDAAGKiYMAAlONgwACXUWDAAJdRYQFgwAB3LFxdlHEBYLylXgABAQFgwAB3JQABV8AAon4AXGDAAKKrYMAAoqtgwACiq2DAAKKrYMAAoqtgwACiq13AAPylAmDAAIVaYMAAotldwAD8dAFgwACi0F3AAPx0AWDAAKLQYMAA+8ZgwAD7xl3AAPx0AWDAAIVRXcAA/HQBYMAAotBdwAD8dAFgwACi0F3AAPylAmC88GC8yV3AAPylAmC88GDAAEVhXcAA/KUCYLzwYMAARWFdwAD8pQJgvPBgwABFYV3AAPylAmC88GDAAEVhXcAA/KUCYLzwYMAARWFdwAD8pQJgvPBgwABIVF3AAPylAmDAAGKiYMAAhTtdwAD8pQJgvPBgwABFYV3AAPylAmC88GDAAEVhXcAA/KUCYLzwYMAARWFdwAD8pQJgvPBgwABFYV3AAPylAmC88GDAAEVhXcAA/KUCYLzwYMAARWFdwAD8pQJgvPBgwABFYV3AAPylAmC88GDAAEVhXcAA/KUCYLzwYMAARWFdwAD8pQJgvMlgvcthAFxhAGDAAEVhYQBcXcAA/HQBYMAAoyddwAD8dAFgwACjJ2EAXF3AAPx0AWDAAKMnXcAA/HQBYMAAoydhAFxhAFxhAFxdwAD8dAFgwABFYWEAXF3AAPx0AWDAAEVhYQBcXcAA/HQBYMAARWFdwAD8dAFgwABFYV3AAPylAmDAAP43YMAAo+pdwAD8pQJgwAD9tmDAAKQVYQFgg1lcXcAA/KUCYIK7YLybYQFgvLdcYQFgvORcXcAA/HQBYLzrYQNgwABiT2DAAP22YMAAYLtcXgABAgFgiE4BoR5gwAD6CgBcYQNgwABiT2DAAP22YMAAYLtcXgABAgFgiE4BoR5gwAD6CgBcXcAA/HQBXZLiAWDAAGJ2XZMTAWDAAGJ2XZMTAWDAAGJ2XcAA/HQBXZLiAWDAAGJ2XcAA/HQBXZLiAWDAAGJ2XcAA/HQBXZLiAWDAAGJ2XcAA/HQBYMAA+9BdwAD8dAFdkuIBYMAAYnZdwAD8dAFdkuIBYMAAYnZdwAD8dAFdkuIBYMAAYnZdwAD8dAFgwAD70GEBYMAAYnZcXZNFAWDAAGJ2XcAA/KUCYMAA+9Bdk0UBYMAAYnZdk0UBYMAAYnZdwAD8dAFdkuIBYMAAYnZdwAD8dAFdkuIBYMAAYnZdk0UBYMAAYnZdwAD8dAFgwAD9tmDAAPvGXZLiAWDAAP22YMAApdFgwACl0WDAAKXiYMAApeJgwACl4mDAAKXiYMAApeJgwACl4mDAAKXiYQRfAABgwABiT2DAAGKiYMAAYk9cXcAA/HQBYMAATZZdwAD8dAFgwABNll3AAPx0AWDAAE2WXcAA/HQBYIhOXcAA/HQBYMAATZZdwAD8dAFgwABNll3AAPx0AWDAAE2WXcAA/HQBYMAATZZdwAD8pQJbYMAATZZdwAD8pQJbYMAATZZdwAD8pQJgvMlgwABNlmECYIN3YMAATZZcYQJgg3dgwABNllxdwAD8dAFgwABPdl3AAPylAmCITmDAAE2WXcAA/KUCYIlKYMAAYk9dwAD8dAFgwABitF3AAPx0AWDAAGJPXcAA/KUCYLzJYMAAYLtdwAD8dAFgwABgu13AAPx0AWDAAGC7XcAA/HQBYMAAYLtdwAD8dAFgwABgu13AAP1nAWCKSF3AAPylAmDAAP43YMAApqpdwAD8pQJgwAD9tmDAAKbIXcAA/KUCYMAA/bZgg1ldwAD8pQJgwAD9tmCDWV3AAPylAmDAAP22YINZXcAA/KUCYMAA/bZgg1lhAWCDWVxdwAD8pQJgwAD9tmCDWV3AAPylAmDAAP22YINZXcAA/KUCYIK7YLybXcAA/HQBYISpXcAA/HQBYIWBXcAA/KUCYMAA/bZgg1ldwAD8pQJgwAD9tmCDWV3AAPx0AWCDWV3AAPylAmDAAP22YINZXcAA/KUCYMAA/bZgg1ldwAD8dAFgg1ldwAD8pQJgwAD9tmCDWV3AAPx0AWCDWV3AAPylAmDAAP22YINZXgABAgFgg3cBwABnjmDAAPoKAFxeAAEDAWCD5QLAAGePYMAA+grAAGeOYMAA+goAXF4AAQIBYIN3AcAAZ45gwAD6CgBcYQFggxRcXgABAwFgg+UCwABnj2DAAPoKwABnjmDAAPoKAFxdwAD8pQJgwAD9tmCDWWEBYLy3XGEBYLzkXF3AAPx0AWC8613AAPylAmDAAP22YINZXcAA/KUCYMAA/bZgg1ldwAD8pQJgwAD9tmCDWV3AAPx0AWCDWWEDYMAAYk9gwAD9tmDAAGC7XF4AAQIBYIhOAaEeYMAA+goAXGDAAP22YMAA+9BdwAD8pQJgwAD9tmDAAKe2XcAA/HQBYLy3XcAA/WcBYLy3XcAA/HQBYLy3XcAA/HQBYLy3XZRxAWC8t12UcQFgvLddwAD8pQJgwACnqGDAAKfGXcAAaAsBYMAAqPVdwAD8dAFgwACpCV3AAPx0AWDAAKhwXcAA/HQBYIh+XcAA/HQBYIh+XcAA/HQBYMAAqHxdwAD8dAFgwACoh13AAPx0AWDAAKiTXcAA/HQBYMAAqIddwAD8dAFgwACok13AAPx0AWDAAKifXcAA/HQBYMAAqKpdwAD8dAFgwACot13AAPx0AWDAAKjEXcAA/HQBYMAAqM9dwAD8dAFgwACo213AAPx0AWDAAKjpXcAA/HQBYMAAqSZdwAD8dAFgg3ddwAD8dAFgwACOsV3AAPylAmCDd13AAPx0AWDAAI6xXcAA/HQBYMAAqTFdwAD8dAFgwACpeF3AAPx0AWDAAKl4XcAA/HQBYIJSXcAA/HQBYMAAqTxdwAD8dAFgwACpR13AAPx0AWDAAKlHXcAA/HQBYMAAqUddwAD8dAFgwACpUl3AAPx0AWDAAKlfXcAA/HQBYMAAqV9dwAD8dAFgwAD9tl3AAPx0AWDAAP22XcAA/HQBYMAA+gpdwAD8dAFgwAD6gl3AAPx0AWDAAPvQXcAA/HQBYMAAqWtdwAD8dAFgg6RdwAD8dAFgg3ddwAD8dAFgg+VdwAD8dAFghbhdwAD8dAFgh99dwAD8dAFghctdwABoCwFgwACo9WEBYMAAYnZgwAD6Cl3AAPx0AWC1m13AAPx0AWC1m2EBYMAAYnZgwAD6Cl3AAPx0AWC1m13AAPx0AWC1m13AAPylAmDAAP22XcAA/WcBYMAARWFdwAD9ZwFgwABFYWEBYMAAs5tcXcAA/HQBYMAAqnVdwAD8dAFgwACqdV3AAPx0AWDAAKp1XcAA/HQBYMAAqnVdwAD8dAFgwACqdV3AAPx0AWDAAKp1XcAA/HQBYMAAqnVdwAD8dAFgwACqdV3AAPx0AWDAAKp1XcAA/HQBYMAAqnVdwAD8dAFgwACqdV3AAPx0AWDAAKp1XcAA/HQBYJ6rXZLiAWCeq12S4gFgnqtdkuIBYMAAizRdkuIBYMAAizRgwACXUWDAAJdRYMAAl1FgwACXUWDAAJdRYMAAl1FgwACXUV3AAPx0AWDAAJTjXcAA/HQBYMAAlONdwAD8dAFgwACWmF3AAPx0AWDAAJTjXcAA/HQBYMAAlONdwAD8dAFgwACU413AAPx0AWDAAJTjYQBgwACU413AAPx0AWDAAJTjXcAA/HQBYMAAlONdwAD8dAFgwACU42EAYMAAlONdwAD8dAFgwACU413AAPx0AWDAAJTjYMAAl1FdwAD8dAFgwACU413AAPx0AWDAAJTjXcAA/HQBYMAAlONdwAD8dAFgwACU413AAPx0AWDAAJTjXcAA/HQBYMAAlONgwACXUWDAAJdRYMAA/bZgwACXUV3AAPylAmDAAI1FYMAAlONdwAD9ZwFgwACNMF3AAPylAmDAAI1FYMAA/bZdwAD8pQJgwACNMGDAAFAGXcAA/HQBYMAAT99dwAD8dAFgwABP313AAPylAmDAAI0wYMAAUAZdwAD8dAFgwAD9tl3AAPx0AWDAAP22XcAA/KUCYMAA/bZbXcAA/KUCYMAA/bZbYMAAx7FgwACXUWDAAJdRYMAAl1FgwACXUV3AAPx0AWDAAJPMYMAAl1FdwAD8dAFgwACTzF3AAPx0AWDAAJPMYMAAl1FgwACXUV3AAPylAmDAAI0mXcAA/HQBYMAAlphdwAD8dAFgwACWmF3AAPx0AWDAAJaYXcAA/HQBYMAAlUFdwAD8dAFgwACNJl3AAPx0AWDAAJVBXcAA/HQBYMAAk8xdwAD8dAFgwACTzF3AAPx0AWDAAI0mYQBgwAD6Cl3AAPylAmDAAJTtYMAAlONgwACXUV3AAPx0AWDAAJPMXcAA/HQBYMAAk8xdwAD8dAFgwACTzGDAAJdRXcAA/HQBYMAAk8xgwACXUWEAXGDAAJdRYQBcXcAA/HQBYMAAlcJdwAD8dAFgwACTzGEAXF3AAPx0AWDAAJXCXcAA/HQBYMAAk8xgwACXUV3AAPx0AWDAAJaYXcAA/HQBYMAAlphdwAD8dAFgwACWmF3AAPx0AWDAAJaYXcAA/HQBYMAAlphdwAD8dAFgwACWmGDAAJdRYMAAl1FgwACXUWDAAJdRXcAA/KUCYMAAlONgwACU413AAPylAmDAAJTjYMAAlONdwAD8pQJgwACU42DAAJTjXcAA/KUCYMAAlONgwACU413AAPylAmDAAJTjYMAAlONdwAD9ZwFgwACNdWEBW1xdwAD8dAFgwACNdV3AAPylAmDAAI11XcAA/HQBYMAAjXVdwAD9ZwFgwACNdWEBW1xdwAD8dAFgwACTzF3AAPx0AWDAAJPMXcAA/HQBYMAAlONdwAD8dAFgwACTzF3AAPx0AWDAAJPMXcAA/HQBYMAAk8xdwAD8dAFgwACTzF3AAPx0AWDAAJPMXcAA/HQBYMAAk8xgwACXUV3AAPx0AWDAAJaYYMAAl1FdwAD8dAFgwACU413AAPx0AWDAAJTjXcAA/HQBYMAAlO1dwAD8dAFgwACU413AAPx0AWDAAJTtYQFgwACN3VxhAWDAAPvQYMAAk8xhAWDAAPvQYMAAk8xhAWDAAPvQYMAAk8xhAWDAAPvQYMAAk8xhAWDAAPvQYMAAk8xhAWDAAPvQYMAAk8xhAmDAAJTjYMAAjcNgwACTzF3AAPx0AWDAAJPMYMAAl1FdwAD8dAFgwACTzGDAAJdRYMAAl1FhAmDAAJTjYMAAjcNgwACTzF3AAPx0AWDAAJPMXcAA/HQBYMAAk8xdwAD8dAFgwACTzF3AAPx0AWDAAJPMXcAA/HQBYMAAk8xdwAD8dAFgwACTzF3AAPx0AWDAAJaYYMAAl1FgwACXUV3AAPx0AWDAAJaYYMAAl1FdwAD8dAFgwACWmGDAAJdRXcAA/HQBYMAAlphdwAD8dAFgwACWmF3AAPx0AWDAAJaYXcAA/HQBYMAAlphdwAD8pQJgwACNMGDAAPvQXcAA/HQBYMAA/bZdwAD8dAFgwAD9tl3AAPx0AWDAAJTjXcAA/HQBYMAAlphdwAD8dAFgwACWmGDAAJdRXcAA/HQBYMAAlphhAmDAAJTjYMAA/bZgwACWmF3AAPx0AWDAAJaYYQJgwACU42DAAP22YMAAlphdwAD8dAFgwACWmF3AAPx0AWDAAJaYXcAA/HQBYMAAlphdwAD8dAFgwACWmF3AAPx0AWDAAJaYXcAA/HQBYMAAlphdwAD8dAFgwACWmF3AAPx0AWDAAJaYXcAA/HQBYMAAlphdwAD8dAFgwACTzF3AAPylAmDAAGJ2XcAA/DIBYMAAYnZdwAD8dAFgwACWmGDAAJdRYQJgwAD9tmDAAP22XGECYMAA/bZgwAD9tlxhAmDAAP22YMAA/bZcXcAA/HQBYMAAk8xgwACXUV3AAPylAmDAAP22YMAAlONdwAD8pQJgwAD9tmDAAJTjXcAA/KUCYMAA/bZgwACU413AAPylAmDAAP22YMAAlONdwAD8dAFgwACTzF3AAPx0AWDAAJPMXcAA/HQBYMAAk8xdwAD8dAFgwACTzGDAAJdRXcAA/KUCYMAA/bZgwACU413AAPx0AWDAAJVBXcAA/HQBYMAARWFdwAD8dAFgwABFYWEBYMAARWFgwAD6CmECYMAARWFgwABFYWDAAEVhYQJgwABFYWDAAEVhYMAARWFhAGDAAEVhYQFgwABFYWDAAPoKYQJgwABFYWDAAEVhYMAARWFhAGDAAEVhYQNgwAD9tmDAAEVhYMAARWFgwABFYWEBYMAA/bZgwABFYWEAYMAARWFhAmDAAP22YMAA/bZgwABFYWECYMAA/bZgwAD9tmDAAEVhYQNgwAD9tmDAAEVhYMAARWFgwABFYWEBYMAA/bZgwABFYWEBYMAA/bZgwABFYWEBYMAA/bZgwABFYWEBYMAA/bZgwABFYWEBYMAA/bZgwABFYWEAYMAARWFdwAD9ZwFgwABFYV3AAP1nAWDAAEVhXcAA/HQBYMAARWFdwAD8dAFgwABFYV3AAPx0AWDAAEVhYQFgwABFYWDAAPoKXcAA/WcBYMAARWFdwAD9ZwFgwABFYWEBYMAARWFgwAD6Cl3AAPx0AWDAAK0lXcAA/HQBYMAA/bZdwAD8pQJgwABFYWDAAK0tXcAA/KUCYMAARWFgwAD70F3AAPylAmDAAEVhYMAArS1dwAD8pQJgwABFYWDAAPvQXcAA/KUCYMAARSpgwAD70F3AAPylAmDAAEUqYMAA+9BdwAD8pQJgwABFYWDAAK0tXcAA/KUCYMAARWFgwACtLV3AAPx0AWDAAEUqXcAA/KUCYMAARSpgwACtOV3AAPylAmDAAEVhYMAArS1dwAD8pQJgwABFYWDAAPvQXcAA/KUCYMAARWFgwAD70F3AAPylAmDAAEUqYMAA+9BdwAD8dAFdwACtZAFgwABFYV3AAPx0AV3AAK1kAWDAAEVhXcAA/WcBYMAA/bZdwAD9ZwFgwAD9tl3AAPylAmDAAEUqYMAArWxdwAD8pQJgwABFKmDAAK1sXcAA/WcBYMAA/bZdwAD9ZwFgwAD9tl3AAP1nAWDAAP22XcAA/KUCYMAARWFgwAD9tl3AAPx0AWDAAP22XcAA/WcBYLylXcAA/WcBYLylXcAA/WcBYLylXcAA/WcBYLylXcAA/WcBYLylXcAA/WcBYLylXcAA/HQBYMAARWFhAWDAAEVhYMAA+gpdwAD8dAFgwABFYWEBYMAARWFgwAD6CmECYMAARlJgwABLSGDAAPzZYQJgwABGUmDAAEtIYMAA/NldwAD8dAFgwABFYV3AAPx0AWDAAPvQXcAA/KUCYMAA+9BgwABFYWDAAPvGXcAA/KUCYMAARWFgwAD7xl3AAPylAmDAAEVhYMAArrBdwAD8pQJgwABFYWDAAK6wXcAA/KUCYMAARWFgwACusGEBYMAARWFgwACusGEBYMAARWFgwACusF3AAPx0AWDAAEnNXcAA/KUCYMAARWFgwACusF3AAPylAmDAAEVhYMAArrBdwAD8pQJgwABFYWDAAK6wXcAA/KUCYMAARWFgwACusF3AAPylAmDAAEVhYMAArrBdwAD8pQJgwABFYWDAAK6wXcAA/HQBYMAARWFdwAD8dAFgwABFYWECXwAAXwAAYMAA+9BhAl8AAF8AAGDAAPvQXcAA/HQBW13AAPx0AVtdwAD8dAFbXcAA/HQBW2ECXwAAXwAAYMAA+9BdwAD8dAFfAABdwAD8dAFfAABdwAD8dAFfAABhAl8AAF8AAGDAAPvQXcAA/HQBXwAAXcAA/HQBXwAAYQJfAABfAABgwAD70F3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAK+nA18AAF8BAF8CAF3AAPylAl8AAF3AALRpAl8BAF8CAF3AAK+nA18AAF8BAF8CAF3AAPylAl8AAF3AALRpAl8BAF8CAGECXwEAXwIAXGECXwEAXwIAXcAA/MwCXwMAXwQAXcAA/KUCXwAAXcAAtGkCXwEAXwIAYQBfAgBhAl8BAF8CAGDAAPoKXcAA/KUCXwAAXcAAtGkCXwEAXwIAYQFfAgBfAgBhAF8CAF3AAPylAl8AAF3AALRpAl8BAF8CAGECXwEAXwIAXwIAXcAA/HQBW13AALAgAV8BAF3AALAgAV8BAF3AALAgAV8AAF3AALAgAV8AAF3AALAgAV8AAF3AALAgAV8AAF3AAMCKAl8AAGDAAPvQXcAAwIoCXwAAYMAA+9BdwACwIAFfAABdwACwIAFbXcAAsCABW13AALAgAVtdwACwIAFbXcAA/KUCYMAAsGpgwAD70F3AAPylAmDAALBqYMAA+9BdwACwIAFfAABdwACwIAFfAQBdwACwIAFfAABdwACwIAFfAABdwACwZQFbXcAAsHUCW1tdwACwTQFbXcAAsEMBW13AALBgAVtdwACwIAFbXcAAsGUBW13AALB1AltbXcAAsE0BW13AALBDAVtdwACwYAFbXcAAsCABW13AALCeAl8AAF8BAF3AALCjAV8AAF3AAPylAl8CAF8DAGECXwAAXwEAXwIAYQJfAABfAQBfAwBdwAD8pQJfAABfAQBdwAD8pQJfAABfAQBhAl8BAF8BAF8BAF3AAPylAl8BAF3AAPx0AV8AAGEBXwAAXwEAXcAA/HQBXwAAYQFfAABfAQBhAl8BAF8BAGDAAPvQYQFfAABfAQBhAl8BAF8BAGDAAPvQXcAA/KUCXwAAXcAA/WcBXwAAXcAA/WcBXwAAXcAAwIoCXwAAYMAA+9BdwADAigJfAABgwAD70F3AAPx0AV8AAF3AAMCWAV8AAGEBXwAAYMAA/NldwADAigJfAABgwAD70F3AAMCKAl8AAGDAAPvQXcAA/WcBXwAAXcAA/HQBXcAA/WcBXwAAYQFfAABgwAD82V3AALC5AV8AAF3AALC5AV8AAF3AAPx0AV8AAF3AALDaAV8AAF3AALDaAV8AAF3AALDaAV8AAF3AALDaAV8AAF3AALDaAV8AAF3AALDaAV8AAF3AALDaAV8AAF3AALDaAV8AAF3AALDaAV8AAF3AAPx0AV8AAF3AAP1nAV8AAF3AALDaAV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AALDaAV8AAGEBXwAAXF3AALD7AV8AAF3AALD7AV8AAGEBXwAAYMAA+gphAV8AAGDAAPoKYQFfAABgwAD6CmEAXwAAYQFfAABgwAD6CmEAXwAAYQFfAABgwAD6CmEAXwAAYQJfAABfAABfAABhAl8BAF8AAF8BAF3AAPx0AV8AAF3AAP1nAV8AAF3AALD7AV8AAF3AALD7AV8AAF3AALD7AV8AAGEBXwAAYMAA+gpdwAD8dAFfAABdwACw+wFfAABdwACw+wFfAABdwACw+wFfAABdwAD8dAFfAABdwAD8dAFfAABdwAD8dAFfAABdwACw+wFfAABdwACw+wFfAABdwACw+wFfAABdwACw+wFfAABdwACw+wFfAABdwACw+wFfAABhAV8AAGDAAPoKYQFfAABgwAD6Cl3AALD7AV8AAF3AALD7AV8AAF3AALD7AV8AAF3AALD7AV8AAF3AALD7AV8AAF3AALD7AV8AAF3AALD7AV8AAF3AALE/AV8AAF3AAPx0AV8BAF3AALE/AV8BAF3AALE/AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AALE/AV8AAF3AALE/AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AALE/AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AALE/AV8AAF3AALE/AV8AAF3AALFkAl8AAF8BAF3AAP1nAV8AAF3AAPwyAV8AAF3AAP1nAV8AAF3AALGUAV8AAF3AAP1nAV3AAP1nAV8AAF3AAPwyAV8AAF3AAPwyAV8AAF3AAPwyAV8AAF3AAPwyAV8AAF3AAPwyAV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AALIwAV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AALIwAV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAPx0AV8AAF3AAP1nAV8AAF3AAP1nAV8AAF3AAP1nAV8AAF3AAMI2AV8AAF3AAMI2AV8AAF3AAMI2AV8AAF3AAMI2AV8AAF3AAPylAl8AAF8BAF3AAPylAl8AAF8BAF3AAPylAl8AAF8BAF3AAPylAl8AAF8BAF3AAPylAl8AAF8BAF3AAPylAl8AAF8BAF3AAP1nAV8AAF3AAPylAl8AAF8BAGEBXwEAYMAA+gpdwAD8dAFbXcAA/WcBXwEAXcAA/HQBW2EBXwEAYMAA+gpdwAD9ZwFfAQBdwAD9ZwFfAABdwACy6wFfAABhAV8AAGDAAPoKXcAA/WcBXwAAXcAAsusBXwAAXcAA9bwBXwAAYQFfAABdwAD8MgFfAABdwAD1vAFfAABdwAD1vAFfAABhAV8AAF3AAPwyAV8AAF3AAP1nAV8AAF3AAPW8AV8AAF3AAPx0AV8AAF3AALLrAV8AAF3AALMXAV8AAF3AALMoAV8AAF3AALL7AV8AAF3AALL7AV8AAF3AALL7AV8AAF3AAP1nAV8AAF3AAP1nAV8AAF3AAPylAl8AAF3AAP1nAV8AAF3AAPylAl8AAF3AAP1nAV8AAF3AALMXAV8AAF3AALMXAV8AAF3AAPx0AV8AAF3AAPylAl8AAF3AALMPAV8A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AAATJAAKyxYAABMuAArLggAAEzgACsvuAAATQgAKzFoAABNMAArMxgAAE1YACs0yAAATYAAKzZ4AABNqAArOCgAAE3QACs52AAATfgAKzuIAABOIAArPTgAAE5IACs+6AAATnAAK0CQAABOmAArQmQAAE7AACtEFAAATugAK0XEAABPEAArR3QAAE84ACtJJAAAT2AAK0rUAABPiAArTIQAAE+wACtONAAAT9gAK0/kAABQAAArUZQAAFAoACtTRAAAUFAAK1T0AABQeAArVqQAAFCgACtYVAAAUMgAK1oEAABQ8AArW7QAAFEYACtdZAAAUUAAK2VMAABRaAArZvwAAFGQACtorAAAUbgAK2pcAABR4AArbAwAAFIIACttvAAAUjAAK29sAABSWAArcRwAAFKAACtyzAAAUqgAK3R8AABS0AArdiwAAFL4ACt33AAAUyAAK3mMAABTSAArezwAAFNwACt87AAAU5gAK36cAABTwAArgEwAAFPoACuB/AAAVBAAK4OsAABUOAArhVwAAFRgACuLuAAAVIgAK41oAABUsAArjxgAAFTYACuQyAAAVQAAK5J4AABVKAArlCgAAFVQACuV2AAAVXgAK5eIAABVoAArmTgAAFXIACua6AAAVfAAK5yYAABWGAArnkgAAFZAACuf+AAAVmgAK6GoAABWkAAro1gAAFa4ACulCAAAVuAAK6a4AABXCAArqGgAAFcwACuqGAAAV1gAK6vIAABXgAArw/wAAFeoACvRSAAAV+AALAnoAABYGAAsCvgAAFhIACw3+AAAWHgALHQYAABYqAAsfEwAAFjYACyEPAAAWQgALKaoAABZOAAsp+gAAFloACypKAAAWZgALMcIAABZvAAsyTwAAFnsACzpVAAAWhwALOpkAABaTAAs9+QAAFp8AC00FAAAWqwALVQkAABa2AAtj4QAAFsIAC2SZAAAWywALZTsAABbUAAtmCAAAFt0AC2lHAAAW5gALbzkAABbpAAtw2QAAFvUAC3a1AAAW/gALeb4AABcHAAt6YgAAFxwAC3qRAAAXLgALerIAABc3AAt8NAAAF0AAC4H8AAAXSQALgtsAABdMAAuDaAAAF1UAC4PDAAAXWAALhBAAABdeAAuWoQAAF2QAC59gAAAXcgALoPsAABd7AAuhZAAAF4QAC6GHAAAXjQALobIAABeW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AAAkygAQ+VwAACTVABD5swAAJOAAEPp7AAAk6wAQ+rIAACT2ABD7KgAAJQEAEPw2AAAlDAARAksAACUXABEG3QAAJRwAEQtQAAAlJwARDakAACUsABES0QAAJTEAERSLAAAlPAARFT8AACVBABEV9gAAJU8AERaqAAAlWgARI+cAACVoABElzwAAJXwAETMuAAAlhQARMzEAACWQABE6ogAAJaYAETx5AAAlrwARPwEAACW2ABFUiQAAJbwAEVgsAAAlygARe/kAACXNABF8KAAAJdcAEX9JAAAl4QARh8gAACXoABGJKQAAJfMAEZpWAAAl/gARnU4AACYMABGdbAAAJhcAEZ2KAAAmIAARoPkAACYuABGhHwAAJjYAEaZ3AAAmPgARpqoAACZJABGm+gAAJlQAEap3AAAmXwARqpcAACZmABGq2gAAJm8AEauCAAAmeAARrcQAACZ/ABGuEAAAJoYAEa4wAAAmjQARrnsAACaWABGwYAAAJp8AEbGsAAAmrQARsj8AACa7ABG4XQAAJskAEbisAAAm1wARuTEAACblABHAYAAAJvMAEd5TAAAnAQAR4zUAACcGABHnLQAAJw8AEewtAAAnGAAR7IYAACcdABHucgAAJyIAEhGxAAAnKwASEdIAACc3ABISCAAAJ0AAEhKTAAAnSwASEuIAACdUABIpogAAJ2IAEjVNAAAnbgASOR4AACd6ABJARQAAJ4YAEkokAAAnkgASaqoAACeeABJrzAAAJ64AEnJ3AAAnvgASc1YAACfOABJ2fQAAJ94AEnfkAAAn7gASeAwAACgEABJ9PQAAKBQAEn50AAAoJAASf/AAACg0ABKAVwAAKEQAEpawAAAoVAASl2IAAChfABKgQgAAKGgAEqMmAAAocQASo2QAACh8ABKkNQAAKIcAEqSLAAAokgASpQMAACidABKlWgAAKKIAEq70AAAopwASrzgAACisABKw1QAAKMIAErEZAAAoxwASsvYAACjdABKzLAAAKOgAErXEAAAo8wAStf0AACj4ABK2NgAAKP0AErZvAAApAgAStpoAACkHABLERQAAKQwAEsRiAAApFwASx3kAACkgABLHuAAAKSsAEsg+AAApNgASy1QAACk/ABLMGgAAKUoAEtpBAAApVQAS2wYAACleABLeVAAAKWkAEt6hAAApcgAS4BoAACl7ABLpVwAAKYQAEumhAAApmgAS6xQAACmlABLudAAAKa4AEu6+AAApxAAS8EEAACnPABLykgAAKdgAEvQ1AAAp4QAS9GMAACnqABL1CAAAKfMAEvU0AAAp/AAS9YQAACoFABL2iAAAKg4AEv/nAAAqFwATAwQAACogABMJUwAAKikAEwzyAAAqNAATDkQAACo9ABMjrAAAKkYAEz95AAAqTwATQCQAACpYABNDmAAAKmEAE0PpAAAqagATRbsAACpzABNJpAAAKn8AE0otAAAqjQATS/AAACqbABNMsgAAKqAAE00AAAAqpQATXpEAACquABNiaAAAKrcAE23ZAAAqwAATbykAACrJABNwawAAKtIAE50sAAAq2wATnWsAACrmABOe7AAAKvEAE59SAAAq+gATtp4AACsDABO3bQAAKxEAE8CVAAArHwATwj0AACstABPC7QAAKzYAE8PvAAArPwATxN8AACtLABPFfAAAK04AE9JeAAArUQAT02UAACtdABPUlAAAK2kAE9bkAAArdQAT11gAACuBABPXngAAK40AE+N8AAArlgAT5ygAACufABPoHgAAK6oAE+ssAAArtQAT608AACvAABPscAAAK8kAE+zCAAAr0gAT7uEAACvbABPvmgAAK+QAE++9AAAr7wAT8TYAACv4ABPyuwAALAEAE/MNAAAsCgAT9VwAACwTABP2mAAALB4AE/g+AAAsKQAT+MMAACw0ABP5IAAALD0AE/pyAAAsRgAT+swAACxPABQTDAAALFgAFBScAAAsYQAUFjgAACxqABQWnwAALHMAFBlGAAAsfAAUGgUAACyIABQhBQAALJQAFELzAAAslwAUSuEAACydABRQSQAALKYAFFRCAAAsrwAUVH8AACy6ABRUvAAALMUAFFT5AAAs0AAUVTYAACzbABRVdQAALOYAFFWkAAAs8QAUVccAACz8ABRfRgAALQcAFF+BAAAtEgAUeGoAAC0dABSPBgAALSgAFNq3AAAtMwAVDJUAAC1BABUfyAAALU0AFR/9AAAtVgAVJnUAAC1fABUmuAAALWgAFSddAAAtcQAVJ9YAAC16ABUoIwAALYMAFSiYAAAtjAAVKg4AAC2VABUqbgAALaEAFSqHAAAtqgAVMiUAAC2zABUywAAALbwAFTL3AAAtxQAVOCsAAC3OABU4vgAALdcAFTl3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AABClwAgd/oAAEKiACB5dgAAQq0AIHmeAABCuAAgevIAAELDACB7bwAAQs4AIINrAABC2QAhLEsAAELkACEsvwAAQu8AIUxAAABC+gAhmwAAAEMFACGcqwAAQxAAIZzvAABDGwAhnRMAAEMmACH0ZwAAQzEAIfW/AABDRwAiF9MAAENSACIYEgAAQ10AIhhYAABDZgAiGHwAAENvACIY/gAAQ4sAIhkrAABDlAAiHCcAAEOwACIgGQAAQ7sAIiA5AABD1wAiIFgAAEPpACIg/wAAQ/UAIiH5AABELAAiIuMAAERjACIlEwAARJoAIiWhAABEtQAiJj0AAETFACInXQAARNAAIif2AABE2wAiKG0AAETmACIozgAARPEAIikfAABE/AAiKXAAAEUHACIpwQAARRIAIioSAABFHQAiKmMAAEUoACIqtAAARTMAIirzAABFPgAiK1AAAEVJACIr1QAARVQAIi10AABFXwAiL+0AAEV7ACIyCAAARZcAIjJUAABFogAiMuIAAEWtACIzYgAARbgAIjQfAABFwwAiNL8AAEXOACI0xAAARdkAIjVrAABF7wAiNXAAAEX6ACI2FwAARhAAIjYcAABGGwAiNu8AAEYxACI3MgAARjwAIjh+AABGSgAiOQUAAEZgACI5IwAARmwAIjlFAABGdwAiOccAAEaCACI7FwAARpAAIjuGAABGrAAiPGwAAEa2ACI9AAAARsEAIj1xAABGzAAiPdcAAEbXACI+1gAARuIAIkfOAABG8AAiSQcAAEb2ACJKQQAARvsAIkvDAABHAAAiTWYAAEcFACJPUQAARw4AIlDmAABHFwAiVeAAAEcgACJWwQAARysAIleiAABHNgAiXDIAAEdBACJcUwAAR0wAIl37AABHVwAiXi0AAEdiACJo3gAAR20AImjhAABHeAAidc4AAEeMACJ3WAAAR5UAIngIAABHngAieNMAAEenACJ6dAAAR7UAInqYAABHvgAiex4AAEfaACJ7UwAAR+MAIn1yAABH/wAig50AAEgKACKDxQAASCYAIoPsAABIOAAihLcAAEhEACKF8gAASHsAIocOAABIsgAiiN0AAEjpACKJmwAASQQAIopmAABJFAAiiuAAAEkfACKMRgAASSoAIoxvAABJMwAijpsAAEk8ACKPJQAASUUAIo+rAABJTgAij/AAAElZACKQSAAASWIAIpCEAABJawAikOUAAEl2ACKRRgAASYEAIpGnAABJjAAikggAAEmXACKSaQAASaIAIpLKAABJrQAikxcAAEm4ACKTkgAAScMAIpQhAABJzgAilKgAAEnZACKVtgAASeQAIpaQAABKAAAil+kAAEoOACKYWAAASioAIpqdAABKNAAimyQAAEpKACKbRAAASlYAIptmAABKYQAinUwAAEpsACKePwAASncAIp6sAABKgAAin2cAAEqLACKgFQAASpYAIqCHAABKoQAioIwAAEqsACKhMQAASsIAIqE2AABKzQAiodsAAErjACKh4AAASu4AIqKmAABLBAAioukAAEsPACKlIQAASx0AIqYlAABLOQAipuIAAEtEACKnkAAAS08AIqoyAABLWgAiq7cAAEt2ACKuZQAAS38AIq79AABLkQAisD0AAEuaACKwXwAAS6MAIrTrAABLrAAitz4AAEu6ACLAvQAAS8UAIsDhAABL1AAiwQUAAEvjACLBKQAAS/IAIsZgAABMAQAix6MAAEwMACLI5gAATBcAIsopAABMIgAizD4AAEwtACLSHgAATDgAItJMAABMQQAi0uQAAExKACLTEgAATFMAItQwAABMXAAi1F4AAExlACLWAgAATG4AItYwAABMdwAjADMAAEyAACMDVgAATIgAIwZ5AABMkAAjCZwAAEyYACMMkQAATKAAIw+KAABMqAAjFuYAAEywACMY4AAATLgAIx7bAABMwwAjIpkAAEzLACMqbAAATNsAIzDLAABM4wAjN3MAAEzxACNB1wAATPkAI0ZVAABNAQAjSmoAAE0JACNRBwAATREAI1TxAABNGQAjWMgAAE0hACNeSAAATSkAI30oAABNMQAjhNAAAE05ACOOFAAATUEAI5TOAABNSQAjnhIAAE1RACOiKgAATVkAI6pZAABNYQAjsawAAE1pACO5IAAATXEAI8WqAABNeQAjy74AAE2BACPZ9gAATYkAI95PAABNjgAj4RQAAE2TACPhbwAATZgAI+QrAABNnQAj5YUAAE2iACPnXwAATacAI+1lAABNrAAj7akAAE2xACPyJAAATbYAI/KTAABNuwAj81MAAE3AACPzwgAATcUAI/SCAABNygAj9PEAAE3PACP1sQAATdQAI/YfAABN2QAj9z0AAE3eACP9XQAATeMAI/2k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ACwh/gAAXF4ALCzqAABcaQAsL2EAAFx1ACwv1AAAXKQALC//AABcsAAsOdAAAFzHACw6QwAAXNMALDp+AABc3wAsOyQAAFzkACw+EAAAXPAALD/8AABc/AAsQHAAAF0IACxE5AAAXRQALEsIAABdHQAsS4oAAF0mACxMCgAAXS8ALEzWAABdOAAsUDkAAF1BACxQ9gAAXUoALFFVAABdUwAsUakAAF1cACxS0AAAXWUALFNpAABdbgAsVPQAAF13ACxV7AAAXYAALFceAABdiQAsV48AAF2SACxYAQAAXZsALFtNAABdpAAsXEoAAF2tACxczwAAXbYALGAyAABdvwAsZAEAAF3IACxtBAAAXdEALHKEAABd2AAscpUAAF3dACx8vAAAXekALIFnAABd8AAshEwAAF35ACyE8gAAXgMALIbEAABeDQAshxoAAF4WACyHuAAAXh8ALIfVAABeJgAsiK0AAF4tACyKWwAAXjYALJGLAABePQAskncAAF5KACySlQAAXlUALJO3AABeYAAslQYAAF5jACyXBQAAXmYALJkFAABecQAsol8AAF52ACyodgAAXnsALKjUAABehgAssksAAF6RACyywwAAXqAALLLZAABeqAAsswsAAF6sACyz+wAAXrQALLRKAABeyQAstIYAAF7XACy1HAAAXt4ALLWqAABe8wAsteYAAF8BACy3uwAAXwgALLgaAABfHQAsuB8AAF8kACy44QAAXzIALLjmAABfOgAsufkAAF9JACy8IwAAX1UALMLPAABfWAAsw0AAAF9kACzGigAAX3AALM+uAABfeAAsz9UAAF+EACzQCgAAX5AALNTMAABfnAAs1xwAAF+8ACzXPAAAX8YALNdBAABfzwAs2ZIAAF/hACzbcwAAX+YALN2zAABf8gAs3kQAAGAIACzlOQAAYA8ALOXrAABgGwAs5fwAAGAgACznegAAYCwALOlZAABgOAAs6oQAAGBEACzq/AAAYFAALOyiAABgXAAs7UQAAGBjACzthgAAYGoALPQEAABgcQAs9rUAAGB6ACz3LwAAYIUALPdSAABgkAAs99MAAGCZACz4awAAYKQALPirAABgrwAs+PIAAGC6AC0A4wAAYMUALQD7AABgywAtAaEAAGDUAC0DPwAAYN0ALU4sAABg5QAtTpEAAGD1AC1PKQAAYQUALVD3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ADKT7gAAbvUAMpR2AABvAwAylP4AAG8RADKZ5AAAbx8AMppNAABvLQAym38AAG87ADKb6AAAb0kAMpxdAABvVwAyrckAAG9lADLBJgAAb3MAMsJPAABvgQAywlIAAG+KADLD6QAAb54AMsTYAABvrAAyyIYAAG+6ADLJvQAAb8gAMsy1AABv1gAyzLgAAG/fADLVrgAAb/MAMtc9AABwAQAy18AAAHARADLZggAAcCEAMt7kAABwLwAy4GoAAHA4ADLhIQAAcEYAMurRAABwVAAy94EAAHBfADME+QAAcHMAMwUKAABwegAzT68AAHCBADNQSwAAcIwAM1DnAABwlwAzUakAAHCiADNSRgAAcK0AM1LiAABwuAAzU34AAHDDADNVKwAAcM4AM1YPAABw2QAzVrcAAHDvADNY6gAAcPoAM1kvAABxBgAzWskAAHESADNdggAAcR0AM13BAABxKAAzXgAAAHEzADNeQgAAcT4AM2C4AABxSQAzYPoAAHFUADN2twAAcV8AM303AABxbwAzffcAAHF6ADN/JAAAcYoAM4L/AABxnQAzhVcAAHGvADOKGwAAccEAM4qAAABx0QAzisoAAHHhADOLjAAAcfEAM40uAABx+QAzjskAAHIBADOPoAAAcgkAM4/oAAByEQAzkMkAAHIZADOS+QAAciEAM5U7AAByKQAzliEAAHIxADOW2gAAcjkAM5cRAAByQQAznDgAAHJJADO7OwAAclUAM70EAAByawAzvU0AAHJ3ADPWggAAcoMAM9cWAABykwAz2N8AAHKeADPaBgAAcqcAM9r7AABysAAz2yoAAHLAADPcewAActAAM+sNAABy4AAz6ycAAHLqADPt9QAAcvgAM+5jAABzAAAz7t8AAHMIADPvQwAAcxAAM/AZAABzGAAz8JsAAHMiADPyCgAAczAAM/IwAABzOwAz9D0AAHNGADP0pwAAc1EAM/UcAABzWwAz9icAAHNpADP4UwAAc3MAM/l2AABzfwAz+yoAAHOIADP7hgAAc5YAM/3RAABzoQAz/kAAAHOmADQO8wAAc6sANBd8AABztgA0GvYAAHPBADQbGQAAc8wANBvOAABz0gA0G/cAAHPdADQcyAAAc+MANBzxAABz7gA0HcIAAHP0ADQd6wAAc/8ANB7hAAB0BQA0Hx4AAHQQADQfWwAAdBsANB+Y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AAB/DAA2Z70AAH8aADZoigAAfyUANnCEAAB/MwA2cNcAAH8+ADZ0UAAAf0kANnVfAAB/VAA2dmoAAH9fADZ4IAAAf2oANoaqAAB/dQA2mzcAAH97ADacBQAAf4cANpzTAAB/kwA2n5MAAH+fADambwAAf6sANqarAAB/tgA2slkAAH/BADa33gAAf9EANsJEAAB/3AA2wnUAAH/yADbLeAAAgAgANsu3AACAEAA2zCwAAIAYADbNXQAAgCAANvASAACAKAA28cUAAIAvADby4gAAgDYANxA/AACAPQA3EKkAAIBIADcREwAAgFMANxLlAACAXgA3E6oAAIBuADcT/QAAgH4ANxSeAACAjgA3GSsAAICeADeFfwAAgKMAN4cWAACArgA3iJ8AAIC5ADeKKAAAgMQAN4vcAACAzwA3jDcAAIDaADeMiQAAgOUAN55+AACA8AA3op4AAID+ADej+AAAgQcAN6V5AACBEQA3pdEAAIEaADeqYAAAgSMAN6rqAACBKwA3q98AAIEzADetfwAAgT0AN7k7AACBRgA3uWYAAIFPADe5kQAAgVgAN7xPAACBYQA3vakAAIFqADe/KgAAgXQAN7+CAACBfQA3xBAAAIGGADfEmgAAgY4AN8WOAACBlgA3xywAAIGgADfQqgAAgakAN9DQAACBtAA30T8AAIG/ADfT4QAAgcoAN9RzAACB2AA31OYAAIHhADfVPwAAgeoAN9X/AACB8wA31qsAAIIBADfXBAAAggoAN9feAACCEwA32R4AAIIhADfa6QAAgi8AN90BAACCOAA33vMAAII9ADfgtQAAgkgAN+G4AACCVgA340kAAIJfADfjawAAgmcAN+wMAACCbAA37bkAAIJxADf0+AAAgnYAN/YfAACCewA39ncAAIKAADf20QAAgoUAN/j6AACCigA3+rwAAIKVADf7OwAAgqAAN/3vAACCqwA3/kYAAIK2ADf+gwAAgrsAN/6qAACCxgA4AeIAAILRADgCNgAAgtwAOALpAACC6QA4Aw8AAIL0ADgEAQAAgwEAOAQyAACDDgA4BIoAAIMTADgFEwAAgyAAOAcPAACDLQA4BzgAAIM4ADgHeAAAgz0AOApWAACDSgA4Cy8AAINaADgMWQAAg18AOAykAACDagA4DMkAAIN2ADgM2wAAg4IAOA3QAACDhwA4DiQAAIOSADgOoQAAg58AOA7SAACDrAA4ERAAAIOxADgTowAAg78AOBQjAACDyAA4FMsAAIPNADgYSAAAg9IAOBjwAACD1wA4GgsAAIPcADgnVgAAg+UAOCmvAACD8AA4KeAAAIP7ADgqEwAAhAYAOCpEAACEEQA4KnUAAIQcADgqpgAAhCcAOCrnAACEMgA4MZIAAIQ9ADg+zQAAhEsAOEPSAACEUAA4RAkAAIRbADhEIQAAhGYAOESNAACEcQA4RMgAAIR2ADhFzwAAhHsAOEawAACEgAA4R3oAAISFADhH6gAAhJAAOEpHAACEmwA4TFsAAISmADhPsQAAhLEAOFJsAACEvAA4U0AAAITBADhTYQAAhMwAOFQLAACE0QA4VMwAAITWADhWmgAAhNsAOFcSAACE4AA4WAMAAIT5ADhZcwAAhP4AOFndAACFAwA4Xm8AAIUIADhekQAAhRMAOF/iAACFHgA4X/oAAIUpADhgHAAAhTQAOGDOAACFPwA4YSoAAIVKADhhTAAAhVUAOGJXAACFYAA4Ym8AAIVrADhjMQAAhXYAOGOVAACFgQA4ZEwAAIWMADhkqAAAhZcAOGTKAACFogA4ZZEAAIWtADhlqQAAhbgAOGgmAACFwwA4hoUAAIXOADidDgAAhdkAOL4WAACF5AA40AIAAIXvADjQKQAAhfgAONBjAACGAQA45e8AAIYKADjmKQAAhhMAOQMwAACGHAA5Es8AAIYsADkb9gAAhjcAORzxAACGPQA5HRcAAIZDADkdPQAAhkkAOR1jAACGTwA5HYkAAIZVADkeBgAAhlsAOR4sAACGYQA5HlIAAIZnADkeeAAAhm0AOR6eAACGcwA5HxsAAIZ5ADkfQQAAhn8AOR++AACGhQA5IDsAAIaLADkguAAAhpEAOSDeAACGlwA5IQQAAIadADkhKgAAhqMAOSFQAACGqQA5IXYAAIavADkhyQAAhrUAOSIcAACGuwA5Im8AAIbBADkiwgAAhscAOSdbAACGzQA5KcUAAIbWADkrQgAAht8AOS/4AACG6AA5MSwAAIbxADkzPwAAhvoAOThYAACHAwA5OJoAAIcLADk43AAAhxMAOTkeAACHGwA5OWAAAIcjADk5ogAAhysAOTnkAACHMwA5OiYAAIc7ADk6qQAAh0MAOTrrAACHSwA5Oy0AAIdTADk7bwAAh1sAOTuxAACHYwA5O/MAAIdrADk8NQAAh3MAOTx3AACHewA5PLkAAIeDADk8+wAAh4sAOT07AACHkwA5PXsAAIebADk9uwAAh6MAOT37AACHqwA5Pj0AAIezADlCHQAAh7sAOUKsAACHwwA5QxoAAIfLADlDggAAh9MAOUQdAACH2wA5RUAAAIfjADlFuAAAh+sAOUZNAACH8wA5Rs0AAIf7ADlHDwAAiAMAOUdRAACICwA5R5MAAIgTADlH1QAAiBsAOUk3AACIIwA5SpYAAIgrADlK+gAAiDMAOUs7AACIOwA5S30AAIhDADlL8gAAiEsAOUwzAACIUwA5WBQAAIhbADlhuAAAiGQAOWcpAACIeAA5azYAAIiMADlsNAAAiKAAOWzAAACIqQA5bi0AAIiyADl0lgAAiLsAOXTOAACIzwA5dSwAAIjYADl1kAAAiOEAOXbsAACI6gA5dyQAAIj+ADl3QwAAiQcAOXlvAACJEAA5e6kAAIkbADl8lAAAiTYAOXzOAACJRgA5frsAAIlPADl+7wAAiV8AOYdqAACJaAA5ikUAAIlxADmKuQAAiXkAOYrfAACJgQA5jFYAAImJADmMdgAAiZEAOY2BAACJmgA5jg0AAImjADmQ5wAAiawAOZOQAACJtAA5k7UAAIm9ADmUfAAAicYAOZa6AACJzgA5l6cAAInXADmX8wAAieAAOZnHAACJ6QA5mxsAAInyADmbUwAAigQAOZzaAACKDQA5nRIAAIofADmdgAAAiigAOa3AAACKMAA5zXYAAIo7ADnNnAAAikYAOdJKAACKUQA51UkAAIpfADnVhgAAim0AOdmTAACKdgA52igAAIp/ADndYgAAiooAOd56AACKlQA53xsAAIqgADnhOwAAiqsAOeFhAACKtgA542MAAIrBADnkPgAAiswAOeXjAACK1wA56kkAAIriADnq3wAAiuUAOfCRAACK7gA58XMAAIr8ADnzkQAAiwoAOfUfAACLEwA59tkAAIshADn52QAAiy8AOfrOAACLOgA5+90AAItFADn8xAAAi04AOf27AACLWQA6A6AAAItkADoH6AAAi3IAOhL5AACLfQA6E1cAAIuIADoT5AAAi5MAOhRPAACLngA6FRsAAIupADoVagAAi7QAOh19AACLvwA6I+cAAIvNADokgwAAi9gAOiZOAACL4wA6JuEAAIvu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AACxXgBDG4MAALFjAEMcEAAAsWwAQxyGAACxdQBDHYcAALF+AEMdxAAAsYcAQyAGAACxkABDIYwAALGZAEMiHQAAsZ4AQyV3AACxpwBDLisAALGwAEMv7QAAsbMAQzImAACxvQBDMlAAALHAAEMyugAAscMAQzLkAACxxgBDM8sAALHJAEM10AAAsdMAQzX6AACx1gBDNmQAALHZAEM2jgAAsdwAQzd1AACx3wBDOW8AALHpAEM5mQAAsewAQ0HTAACx7wBDQfgAALH4AENNuAAAsgQAQ04XAACyCQBDTqkAALIOAENO8gAAshMAQ09XAACyGABDT9UAALIdAENQHgAAsiIAQ1CDAACyJwBDUOUAALIsAENRRAAAsjEAQ1HWAACyNgBDUh8AALI7AENShAAAskAAQ1MCAACyRQBDU0sAALJKAENTsAAAsk8AQ1QiAACyVABDVIEAALJZAENVEwAAsl4AQ1VcAACyYwBDVcEAALJoAENWPwAAsm0AQ1aIAACycgBDVu0AALJ3AENXggAAsnwAQ1fhAACygQBDWHMAALKGAENYvAAAsosAQ1khAACykABDWZ8AALKVAENZ6AAAspoAQ1pNAACynwBDWq8AALKkAENbDgAAsqkAQ1ugAACyrgBDW+kAALKzAENcTgAAsrgAQ1zMAACyvQBDXRUAALLCAENdegAAsscAQ13sAACyzABDXksAALLRAENe3QAAstYAQ18mAACy2wBDX4sAALLgAENgCQAAsuUAQ2BSAACy6gBDYLcAALLvAENvtQAAsvQAQ46CAACy/QBDkOYAALMCAEOR9AAAswcARP9MAACzDABE/2kAALMXAEUAmAAAsyIARQPQAACzLQBFBBAAALM2AEUEiwAAszwARQXUAACzQgBFBuEAALNIAEUJOQAAs14ARQrsAACzbABFELkAALN6AEUUMQAAs4MARRWUAACzjgBFFgcAALOZAEUZbQAAs54ARRmdAACzqQBFGd4AALO0AEUbPwAAs7kARRtvAACzxABFG7AAALPPAEUfgAAAs9QARSAuAACz3wBFIG8AALPqAEUidwAAs+8ARSKmAACz+gBFKNAAALQFAEUqVgAAtBAARSsMAAC0GwBFLJgAALQhAEUtUgAAtCwARS15AAC0MQBFLgIAALQ8AEUvFAAAtEcARTPVAAC0UABFNaEAALRb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AADNnQBLuFAAAM2oAEvF9QAAzbMAS8YsAADNvgBLxpYAAM3GAEvJ/QAAzc4AS9DaAADN2QBL1CUAAM3kAEvUZwAAzeUAS9ffAADN5gBL2WUAAM3yAEvZzQAAzf4AS9qRAADOCgBL3vgAAM4VAEvi7QAAzhwAS/CpAADOJwBMTuwAAM4yAExd2AAAzj4ATF3+AADORwBMYb4AAM5QAExk0gAAzlsATHPFAADOZgBMc/cAAM58AEx0IgAAzocATH6RAADOkgBMfvQAAM6dAEx/gwAAzqgATIRrAADOuABMhW4AAM7IAEyXLwAAztgATJn3AADO4ABMngAAAM7oAEyfbQAAzvAATJ+jAADO+wBMn/gAAM8GAEygBgAAzwoATKFxAADPGQBMobkAAM8kAEyh5wAAzy8ATKI8AADPOgBMokoAAM8+AEyjFgAAz00ATKXaAADPXABMpqMAAM9rAEym8gAAz3MATKcPAADPggBMp0kAAM+RAEynaQAAz6AATKioAADPrwBMqMgAAM++AEyo6AAAz80ATKpkAADP3ABMqoQAAM/rAEyqpAAAz/oATKrEAADQCQBMrAEAANAYAEysIQAA0CcATKxBAADQNgBMrZcAANBFAEyttwAA0FQATK67AADQYwBMrtsAANByAEywogAA0IEATLFrAADQkABMskQAANCfAEyzgwAA0K4ATLOjAADQvQBMs8MAANDMAEy0xQAA0NsATLTlAADQ6gBMtgcAAND5AEy2cAAA0QgATLePAADRFwBMt7cAANEmAEy4rgAA0TUATLnmAADRRABMug4AANFTAEy7FwAA0WIATL15AADRcQBMvZcAANGAAEy/HgAA0YsATL9PAADRmgBMwIsAANGpAEzAswAA0bgATMIwAADRxwBMwlgAANHWAEzCgAAA0eUATMWwAADR9ABMxjQAANIDAEzGcAAA0hIATMauAADSHQBMxuEAANIoAEzIXgAA0i0ATMiGAADSPABMyaoAANJLAEzKzgAA0loATM5iAADSaQBMzooAANJ4AEzPwgAA0ocATM/qAADSlgBM0Z0AANKlAEzR1wAA0rQATNIVAADSvwBM0lkAANLKAEzXswAA0tkATNlEAADS6ABM2uYAANL3AEzdNAAA0wYATN1uAADTFQBM3awAANMgAEzfFQAA0ysATN89AADTOgBM4UkAANNJAEzk+wAA01gATOViAADTYwBM5aEAANNuAE0xBwAA03kATTMHAADThABNNB4AANOJAE02CgAA05IATTcOAADTlwBNOxMAANOcAE07/QAA06EATTz5AADTpgBNaoYAANOrAE1rHgAA07UATWzTAADTvwBNbeIAANPJAE1vCwAA09EATW+uAADT2wBNcPQAANPlAE1x4gAA0+0ATXOiAADT9wBNdJoAANQBAE11oQAA1AkATXZAAADUEwBNd2cAANQdAE14UAAA1CUATXnaAADULwBNehsAANQ9AE19ygAA1EsATX4MAADUVgBNfqcAANRhAE1+8QAA1GwATX8zAADUdwBNf84AANSCAE2AmQAA1I0ATYuuAADUlABNjToAANSaAE2O6AAA1KAATY8wAADUrgBNkbMAANS0AE2R6QAA1MYATZIdAADUzQBNlN0AANTTAE2VSgAA1N4ATZgqAADU6QBNnr0AANTuAE2gDAAA1PMATaCYAADU+ABNoYUAANUJAE2h6wAA1Q4ATaL+AADVEwBNo2QAANUYAE2jygAA1R0ATaQwAADVIgBNpbUAANUnAE2mXwAA1SwATaaXAADVMQBNp0kAANVCAE2nygAA1UcATahBAADVWABNqQEAANVpAE2toAAA1XoATa7RAADVfwBNrucAANWIAE2w9gAA1Y0ATbJvAADVmABNsoAAANWdAE20eAAA1asATbScAADVtgBNtMYAANW/AE20/AAA1cQATbefAADVzQBNt9wAANXfAE245AAA1eYATborAADV8QBNvWcAANX8AE294wAA1gcATcL4AADWDABNy+MAANYPAE3OhgAA1hgATc+4AADWJgBN01AAANYpAE3UgQAA1jIATdY5AADWOwBN1moAANZEAE3WbQAA1k8ATdcKAADWZQBN2iEAANZuAE3f3gAA1nkATeBLAADWggBN5ZcAANaQAE3nZgAA1p4ATejpAADWpwBOA/wAANayAE4nYAAA1rsATjWMAADWxABONfoAANbJAE5G5wAA1s4ATkc5AADW2QBOU0AAANbkAE5T7gAA1vQATlQSAADXBABOVTcAANcUAE5bwQAA1yQATlvEAADXLQBOoXIAANc/AE6hlwAA10cATqG0AADXTgBOodcAANdWAE6iHQAA114ATqI+AADXZgBOorAAANduAE6jKwAA13YATqNQAADXfgBOo20AANeFAE6jjgAA140ATqP3AADXlQBOpBwAANedAE6kOAAA16QATqSiAADXrABOpMcAANe0AE6k5AAA17sATqUFAADXwwBOpW4AANfLAE6lkwAA19MATqWvAADX2gBOzi0AANfiAE7YxAAA1+0ATuJcAADX+ABO5ZsAANgDAE7oRwAA2BMATui/AADYIwBO7FsAANguAE77gAAA2DwATwSEAADYRwBPJE4AANhSAE8kogAA2FkATyS3AADYYABPJN0AANhnAE8oTQAA2G4ATyreAADYeQBPL40AANiEAE8v7AAA2I8ATzUXAADYmgBPNTMAANilAE9NywAA2LAAT2kwAADYvABPaYkAANjHAE9tAwAA2NIAT3BiAADY3QBPcjMAANjoAE9z8wAA2PMAT3fwAADZAQBPfAoAANkPAE98ygAA2R0AT3z0AADZJABPjAAAANkrAE+M/wAA2TYAT6TiAADZRgBPpTQAANlcAE+nCwAA2XIAT6hZAADZfQBPqfYAANmIAE+vKAAA2YsAT69kAADZlwBPsPoAANmjAE+0QQAA2a8AT7VhAADZvQBPtvEAANnLAE+4tQAA2dkAT+QnAADZ5wBP5GoAANnwAFAwPQAA2f4AUEKEAADaCQBQRAoAANoXAFBEIwAA2h4AUEyeAADaKQBQZgIAANo3AFBmpAAA2j0AUGtOAADaQwBQfOEAANpMAFB9VAAA2lcAUH3EAADaYgBQfp4AANptAFCE7gAA2ngAUIVIAADagwBQhYYAANqOAFCF+gAA2pkAUIY4AADapABQi8AAANqvAFCPzQAA2roAUJCZAADa0ABQkXAAANrmAFCRcwAA2vEAUJOmAADbBQBQk+EAANsQAFCURQAA2xsAUJSDAADbJgBQlN0AANsxAFCU+AAA2zwAUJUcAADbRwBQleMAANtSAFCWJAAA210AUJ1aAADbaABQnY0AANt4AFCjdAAA24MAULD9AADbjgBQsYIAANueAFDBHQAA264AUNTpAADbsQBQ1UsAANu8AFDVwAAA28oAUNdbAADb1QBQ2GUAANvjAFDY7AAA2+4AUOBKAADb/ABQ4QkAANwHAFDhyAAA3BUAUOQCAADcIABQ5KIAANwrAFDqfAAA3DkAUOqkAADcRABQ7EEAANxPAFDslgAA3FoAUO5KAADcaABQ708AANxz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gWmBdIGAgYWBioGQgaWBuoHSgdqB4oHtgfqCEIIkgjuCTYJVgluCZIJogoCCooK2grqCwoLTgtuC5oL3gwODE4MlgyaDPINGg0iDWINag1yDZ4Nyg3aDfoN/g4+Dl4Obg6ODqoOtg6+Ds4O4g7qDw4PLg9OD2oPfg+mD74Pwg/GD8oQDhBKEGYQ3hECERYRehGWEd4SGhImElYSghKyEuoTJhNWE4oTshPmFBIULhROFHoUyhT2FR4VMhVOFX4VwhXyFhYWRhaKFsoW9hcmF1oXhhe2F+IYShiCGMIY5hjuGX4ZzhniGeYaghqOGxobThuWG/Yc6h2OHa4eYh8KHz4fUh9qH34fgh+2H+IgBiASIB4gNiBGIEogqiDKIS4heiGiIaYhyiImIl4iniK6ItYi2iLqIw4jGiNOI3YjpiO+I9YkyiU6JW4loiX6JvYnQiduJ5on5igWKFIogiieKMYoyikWKT4paimSKZYqOirqKyIrWiuKLGosmizWLcouBi5CLoIuri7aLu4vCi+eMDIwejCeMLIw+jEqMVYxWjFeMWIxZjG6Mdox/jJuMroy+jM6NCo0WjSyNTY1ljW6Nf42SjZWNlo2ljbWNzY3ajd6N9o4EjhuON45CjlGOYY58jpaOu47LjuOO9Y8ljzKPP49Vj2WPeo+Kj5iPu4/Kj9yP85ALkC6QSJBPkGCQdJCTkKmQ25EFkQqRJ5E3kT+RT5FlkXSRkJGpkbmR0ZHfkfySCZIxkkiSXZJokoiSp5K6ks2S4JMBkxWTHJMfky+TMZMzk0CTXZN3k4GTlJOsk7CTtJO7k9KT15Pek++UBJQRlEaUUJRWlF6UhpSxlLaU65UOlTOVOJVwlaeV15XYldqV9pX4lg+WFZYZliaWNJY6lkOWUpZYlmGWdJZ5loaWi5aUlp+WqJaylsOWzZbUluOW9Zb/lwmXEpcdlyKXK5ctlzCXMZczlzuXUJdwl42Xk5erl7eXx5fZl+OX7ZgKmBSYMJg0mDiYP5hHmEqYT5hdmGSYaZhqmG2YepiMmJKYoZirmK+YxJjNmNGY2ZjxmPmY/pkFmROZGZkomTOZOZk9mU6ZWJlgmWSZc5l8mYCZhpmMmZGZmJmkmbSZwZnTmeGZ8Jn/mg2aJJotmjSaPppKmk2aTppYmmmacZp4moWakpqYmpybjJuXtUu1T7VatWG1cLWftaq1rrWytbm1xbXMtdW12rXwtfe2K7Y1tj62TLZVtlu2ZLZrtne2fbaBtoa2iraRtp22qLa2tsO2yrbYtt6257bptu+3B7cXtyG3MbdHt1a3aLdwt4a3kLebt6C3q7fDt8231rfst/24EbgluDW4UbheuHa4hriZuKm4vbjcuOq4/LkJuSC5L7kxuTO5Nbk3uUG5RLlIuUu5ULlTuVa5WblduV+5YbljuWW5Z7lpuW25eLmBuY65q7mwucK5yrnQueK58boCugi6CboSuhy6Kbouuji6RLpKul66Zbpzuny6hrqdus662brnuvO7ALsQuxa7Lrsyu0K7TrtPu1q7brt0u3i7jbuRu5m7o7uru7+7y7vVu9677Lv8vAC8BrwLvAy8FbwivC28N7xEvFW8abx8vJK8orykvKq8s7y7vMa8y7zVvNq86rzvvPW8+L0GvRa9H70jvTO9Rr1KvU+9YL1ovYi9pr3Kvem97L3zvf++F74uvjO+R75cvmu+fr6VvrK+z77jvvm/DL8dvyq/QL9cv3e/i7+lv7i/1b/lv/7AAEARwABAHMAAQCnAAEBKwABAVsAAQGjAAEBzwABAicAAQI/AAECrwABAs8AAQL/AAEDLwABA3sAAQPXAAEECwABBEsAAQRfAAEEfwABBLsAAQUvAAEFjwABBdcAAQYXAAEGNwABBncAAQaXAAEGuwABBucAAQcXAAEHMwABB4MAAQerAAEH6wABCHMAAQjLAAEJIwABCXcAAQnDAAEKIwABCk8AAQpnAAEKowABCuMAAQsfAAELPwABC2cAAQtrAAELbwABC6sAAQvXAAEMAwABDE8AAQyTAAEM0wABDSsAAQ13AAENzwABDhsAAQ43AAEOxwABDwcAAQ8/AAEPjwABD+sAARAzAAEQgwABEPMAARFDAAERhwABEasAARHbAAESRwABEs8AARM7AAETswABE/cAARRHAAEUgwABFQ8AARU3AAEVSwABFecAARZrAAEW2wABF2MAARfTAAEYDwABGF8AARh/AAEZDwABGccAARp7AAEarwABGysAARtvAAEbowABG8MAARvzAAEcBwABHDMAARxXAAEcewABHJcAARyzAAEdCwABHTMAAR03AAEdjwABHd8AAR33AAEeJwABHj8AAR6DAAEexwABHu8AAR9TAAEfYwABH7cAAR/fAAEgKwABIFcAASCnAAEgtwABIM8AASELAAEhUwABIXcAASGDAAEhvwABIgMAASJDAAEibwABIpcAASK/AAEi8wABIwMAASMXAAEjSwABI6cAASOrAAEj7wABJAcAASQ/AAEkRwABJGMAASR7AAEkgwABJL8AASTHAAElBwABJQsAASUjAAElOwABJVcAASV3AAElnwABJasAASXrAAEl8wABJiMAASZTAAEmfwABJo8AASabAAEmqwABJsMAASbvAAEnDwABJ0MAASeHAAEnlwABJ6cAASgPAAEoewABKJsAASjDAAEo4wABKQsAASkfAAEpMwABKU8AASlfAAEpjwABKaMAASm7AAEp7wABKgsAASovAAEqRwABKocAASr3AAErCwABKw8AASsnAAErOwABK3MAASt3AAEriwABK9MAASvzAAEr9wABK/8AASx3AAEszwABLPMAAS1HAAEtgwABLccAAS3rAAEt7wABLgcAAS43AAEubwABLqMAAS8TAAEvWwABL28AAS+LAAEv6wABMAcAATBPAAEwXwABMIsAATCrAAEw1wABMQMAATEzAAExPwABMVcAATF/AAExmwABMcMAATHzAAEyIwABMocAATK/AAEywwABMscAATLLAAEyzwABMtMAATLXAAEy2wABMt8AATMDAAEzIwABM1MAATNXAAEzowABM7MAATPLAAEz8wABNDcAATRnAAE0pwABNMMAATTjAAE1HwABNT8AATVHAAE1SwABNVMAATVjAAE1bwABNZcAATWvAAE1zwABNfsAATYLAAE2GwABNisAATY7AAE2SwABNlsAATZ7AAE2lwABNpsAATa7AAE2+wABNx8AATczAAE3TwABN1sAATd3AAE3hwABN4sAATePAAE3owABN6cAATfTAAE4AwABOC8AAThvAAE4dwABOKMAATjfAAE5BwABOS8AATlbAAE5dwABOXsAATmDAAE5owABOb8AATnLAAE55wABOf8AAToPAAE6HwABOjcAATqHAAE6lwABOq8AATrPAAE7DwABO1MAATtbAAE7mwABO6cAATvLAAE70wABO+8AATvzAAE7/wABPDMAATxDAAE8UwABPGsAATxzAAE8pwABPMsAATz3AAE8+wABPP8AAT1bAAE9owABPasAAT2vAAE94wABPhsAAT5DAAE+SwABPlMAAT5bAAE+YwABPmsAAT6fAAE+2wABPu8AAT8DAAE/FwABPysAAT8/AAE/gwABP6MAAT/LAAE/5wABP/sAAUAXAAFAOwABQGMAAUCPAAFAqwABQMcAAUDfAAFA/wABQRMAAUEfAAFBMwABQU8AAUFvAAFBkwABQasAAUHHAAFCKwABQlMAAUKHAAFCqwABQscAAULfAAFDOwABQ08AAUOLAAFD4wABRBcAAUSHAAFE0wABRSsAAUU7AAFFSwABRWMAAUWPAAFFswABRfsAAUYPAAFGVwABRnMAAUazAAFG9wABR0cAAUd3AAFHowABR9MAAUf7AAFILwABSD8AAUhXAAFIiwABSKsAAUjbAAFI+wABSRMAAUk7AAFJfwABSa8AAUnDAAFJ7wABShsAAUozAAFKewABSpsAAUsHAAFLKwABS08AAUuDAAFLrwABS8sAAUv3AAFMIwABTFcAAUx7AAFMrwABTPMAAU0XAAFN5wABTgMAAU7LAAFO6wABT7cAAU/TAAFQmwABUM8AAVGvAAFR2wABUrMAAVLXAAFTpwABU8MAAVPnAAFUNwABVIcAAVS3AAFU6wABVP8AAVU3AAFVewABVY8AAVWvAAFVywABVfMAAVYLAAFWTwABVncAAVZ7AAFWpwABVsMAAVbbAAFW/wABVx8AAVc3AAFXVwABV2sAAVebAAFXvwABV+cAAVgHAAFYWwABWKcAAVi/AAFZBwABWScAAVlbAAFZdwABWacAAVnrAAFaSwABWncAAVqfAAFazwABWwsAAVtDAAFbWwABW3MAAVufAAFb3wABXBMAAVwzAAFcUwABXHsAAVyjAAFc+wABXScAAV1DAAFdgwABXasAAV3DAAFd1wABXecAAV33AAFeHwABXjcAAV5zAAFejwABXscAAV83AAFfhwABX8MAAV/jAAFgEwABYEcAAWBvAAFgvwABYPsAAWFLAAFhiwABYccAAWHrAAFh+wABYh8AAWIzAAFiQwABYlcAAWKTAAFixwABYtsAAWL/AAFjLwABY08AAWOXAAFj4wABZDMAAWRXAAFkgwABZMMAAWTzAAFlawABZYsAAWWvAAFl2wABZhsAAWYzAAFmdwABZr8AAWcTAAFnPwABZ2MAAWeTAAFnwwABaA8AAWg3AAFoZwABaHsAAWjDAAFo9wABaU8AAWnHAAFp3wABagcAAWpDAAFqjwABatsAAWsTAAFrTwABa2sAAWuTAAFrywABa+MAAWwjAAFsWwABbH8AAWyjAAFs4wABbQsAAW0zAAFtewABbY8AAW27AAFt3wABbgMAAW4rAAFufwABbtMAAW8HAAFvZwABb6sAAW/vAAFwRwABcGsAAXDPAAFw9wABcUMAAXFvAAFxnwABcc8AAXIDAAFyQwABcqcAAXMbAAFzTwABc4sAAXPjAAF0EwABdJsAAXVHAAF1awABdfMAAXaLAAF20wABdysAAXevAAF4EwABeFMAAXijAAF5BwABeXsAAXmbAAF6LwABeqsAAXr7AAF7VwABe3cAAXvHAAF75wABfDcAAXxfAAF8lwABfPMAAX0bAAF9SwABfX8AAX3PAAF+JwABfj8AAX5XAAF+bwABfo8AAX6rAAF+1wABfx8AAX97AAF/uwABf/MAAYBHAAGAhwABgNsAAYEzAAGBnwABgd8AAYIzAAGCdwABgpsAAYLzAAGDIwABg08AAYOLAAGDnwABg8sAAYQLAAGEMwABhHMAAYS7AAGFFwABhSsAAYVLAAGFkwABhdcAAYYDAAGGUwABhpcAAYbrAAGHSwABh1sAAYd7AAGHjwABh7MAAYfjAAGICwABiD8AAYhTAAGItwABiMsAAYjrAAGJEwABiV8AAYmDAAGJ1wABifMAAYn/AAGKQwABipsAAYrHAAGK9wABizcAAYtjAAGLowABi88AAYvvAAGMTwABjIsAAYy7AAGM8wABjRsAAY03AAGNYwABjYMAAY3DAAGN7wABji8AAY5zAAGOywABjw8AAY9nAAGPvwABkCsAAZCjAAGRFwABkT8AAZF/AAGRtwABkgsAAZJLAAGSnwABksMAAZL7AAGTHwABk1cAAZN7AAGTjwABk7MAAZPrAAGUJwABlHcAAZTHAAGVBwABlScAAZV7AAGVzwABljcAAZZ3AAGWywABlx8AAZeHAAGXwwABl/cAAZhLAAGYkwABmJ8AAZi7AAGY2wABmR8AAZkvAAGZTwABmWMAAZm7AAGaDwABmjMAAZpXAAGafwABmucAAZszAAGbXwABm4cAAZvnAAGcKwABnFsAAZxvAAGcqwABnQMAAZ1DAAGdUwABnYsAAZ3fAAGeHwABnjsAAZ5fAAGebwABnqcAAZ77AAGfOwABn3MAAZ+fAAGfuwABn/cAAaBLAAGgawABoJcAAaDHAAGhCwABoTsAAaFvAAGhmwABod8AAaIPAAGiQwABoosAAaKzAAGi7wABoyMAAaNLAAGjkwABo78AAaP/AAGkKwABpGsAAaSfAAGkxwABpQ8AAaU7AAGlewABpbMAAaX/AAGmGwABpksAAaZfAAGmhwABprMAAabzAAGnGwABp1cAAad/AAGnuwABp9sAAagPAAGoSwABqHsAAajLAAGo/wABqUcAAamjAAGp6wABqgsAAapnAAGqmwABqqcAAarHAAGrAwABq1MAAat/AAGrpwABq+cAAaw3AAGsXwABrMMAAaznAAGtMwABrZMAAa2nAAGtzwABrfcAAa4fAAGuTwABrnsAAa67AAGu8wABrz8AAa97AAGvywABsBMAAbBjAAGwowABsPcAAbEvAAGxewABsbMAAbH/AAGyKwABsmsAAbKbAAGyvwABstsAAbMfAAGzVwABs38AAbObAAGz5wABtCMAAbQ3AAG0hwABtK8AAbTzAAG1FwABtUMAAbV/AAG12wABtksAAbZ3AAG2twABtvMAAbdDAAG3YwABt38AAbezAAG3xwABt9sAAbgDAAG4KwABuFMAAbh3AAG4swABuOsAAbkfAAG5RwABuXMAAbmTAAG53wABuisAAbprAAG6rwABuusAAbsXAAG7SwABu2sAAbvLAAG8FwABvHcAAbyHAAG8qwABvNcAAbz7AAG9HwABvU8AAb1XAAG9lwABvcMAAb3vAAG+NwABvocAAb7jAAG/LwABv0cAAb9nAAG/kwABv68AAb/PAAG/+wABwBcAAcBDAAHAbwABwK8AAcFDAAHBbwABwa8AAcHPAAHCAwABwisAAcJnAAHCmwABwr8AAcMTAAHDWwABw4sAAcO3AAHD2wABxBsAAcQ3AAHEewABxL8AAcTTAAHE5wABxPsAAcUDAAHFOwABxWMAAcWPAAHFuwABxfsAAcZPAAHGcwABxqsAAcbvAAHHOwABx28AAcfHAAHH/wAByDcAAch3AAHIqwAByNcAAckfAAHJiwABya8AAcnrAAHKCwAByicAAcpXAAHKmwAByssAAcsPAAHLdwABy6cAAcvrAAHMUwABzH8AAcy/AAHNIwABzVsAAc2nAAHOFwABzisAAc5jAAHOrwABzx8AAc9XAAHPlwABz+MAAdBTAAHQVwAB0IMAAdC/AAHQ/wAB0WMAAdFrAAHRqwAB0dsAAdIfAAHShwAB0rMAAdLzAAHTVwAB05cAAdPrAAHUYwAB1GsAAdRvAAHU3wAB1RsAAdWfAAHWRwAB1k8AAdaLAAHWpwAB1uMAAdcrAAHXewAB1+8AAdg7AAHYmwAB2R8AAdlrAAHZywAB2k8AAdpfAAHagwAB2q8AAdrPAAHbBwAB2ycAAdtbAAHbgwAB2/8AAdw7AAHciwAB3K8AAdznAAHdEwAB3WcAAd2PAAHdrwAB3ccAAd4PAAHeQwAB3nsAAd6jAAHe3wAB3wMAAd8TAAHfOwAB32cAAd+TAAHfxwAB4F8AAeCvAAHg0wAB4QcAAeErAAHhUwAB4X8AAeGzAAHh2wAB4gsAAeI/AAHiXwAB4oMAAeKjAAHiywAB4vsAAeNjAAHjrwAB488AAeP/AAHkPwAB5HcAAeSzAAHkywAB5PMAAeUbAAHlRwAB5V8AAeWXAAHluwAB5fMAAeX/AAHmIwAB5kcAAeZvAAHmnwAB5rMAAea3AAHnBwAB5y8AAedLAAHnYwAB55cAAee3AAHnzwAB5+cAAegfAAHoMwAB6E8AAehrAAHopwAB6LcAAejjAAHo+wAB6VcAAemDAAHplwAB6eMAAeo/AAHqawAB6pMAAeqnAAHqywAB6ucAAesbAAHrXwAB64cAAevfAAHsEwAB7F8AAeynAAHs6wAB7UsAAe2jAAHt/wAB7mMAAe6TAAHuvwAB7wcAAe9XAAHvfwAB76MAAe/PAAHwMwAB8I8AAfD/AAHxIwAB8TsAAfHLAAHyHwAB8lcAAfKDAAHyzwAB8xcAAfMbAAHzQwAB838AAfPHAAH0DwAB9BcAAfRXAAH0mwAB9NsAAfUbAAH1VwAB9acAAfYXAAH2bwAB9scAAfcPAAH3fwAB98MAAfg3AAH44wAB+QcAAflPAAH5ZwAB+gcAAforAAH6rwAB+wsAAfsbAAH7KwAB+68AAfvPAAH77wAB/CcAAfxXAAH8xwAB/TcAAf2DAAH91wAB/fMAAf5jAAH+gwAB/p8AAf7bAAH+/wAB/zMAAf9bAAH/owAB/78AAgAfAAIAkwACAO8AAgFfAAIBuwACAiMAAgJjAAICswACAtsAAgLrAAIDFwACAzMAAgNXAAIDvwACBBMAAgRbAAIEdwACBK8AAgTXAAIFGwACBUMAAgWHAAIFtwACBesAAgYzAAIGmwACBr8AAgbvAAIHPwACB3sAAgffAAIISwACCGsAAgjDAAII6wACCPcAAglHAAIJtwACCkcAAgr/AAILUwACC8MAAgvTAAIMNwACDHcAAgyrAAIM8wACDRMAAg1jAAINmwACDecAAg4vAAIOdwACDs8AAg8PAAIPUwACD38AAg+rAAIP+wACEFsAAhCfAAIQzwACERcAAhFHAAIRdwACEcsAAhH7AAISJwACElcAAhK3AAIS3wACEwMAAhM3AAITVwACE48AAhO7AAIUEwACFGsAAhSHAAIVHwACFbcAAhabAAIW5wACFwcAAhePAAIX3wACGEMAAhjLAAIZMwACGY8AAhoPAAIadwACGp8AAhq3AAIa6wACG2cAAhvXAAIb5wACHAsAAhw7AAIccwACHMMAAh0nAAIdcwACHZMAAh2/AAId/wACHmcAAh5/AAIeqwACHscAAh8XAAIfOwACH2cAAh+vAAIf+wACICsAAiBjAAIgewACIJ8AAiDfAAIhHwACIVcAAiF3AAIh0wACIlMAAiKnAAIi4wACIx8AAiNrAAIjswACI/sAAiQnAAIkwwACJPMAAiV/AAIlswACJiMAAicTAAIn2wACKDsAAiinAAIo6wACKTcAAilvAAIpowACKe8AAioPAAIqdwACKr8AAirfAAIrPwACK2cAAiwHAAIsVwACLLsAAi0DAAItQwACLW8AAi2DAAIt+wACLmsAAi63AAIu5wACLwcAAi9PAAIvqwACL8MAAjBzAAIx6wACMfsAAjMDAAIzWwACNEsAAjVDAAI1vwACNqsAAjcnAAI3WwACN3sAAjgDAAI4vwACOOMAAjlfAAI56wACOhMAAjo3AAI6WwACOn8AAjqHAAI6owACOxsAAjt3AAI7mwACO7sAAjvfAAI74wACO/MAAjwTAAI8MwACPNcAAjzfAAI86wACPRsAAj1HAAI9gwACPc8AAj4HAAI+LwACPmMAAj6LAAI+uwACPwcAAj87AAI/bwACP48AAj/7AAJAbwACQLMAAkDvAAJBGwACQT8AAkFfAAJBpwACQdsAAkIXAAJCcwACQrsAAkODAAJENwACRF8AAkSHAAJEpwACRM8AAkVjAAJFfwACRZ8AAkYvAAJGVwACRn8AAkafAAJHBwACRz8AAkeTAAJHpwACSCcAAkhbAAJIrwACSPcAAkkrAAJJZwACSYsAAkm3AAJJ+wACSjcAAko/AAJKewACSpcAAkrjAAJLTwACS3MAAkwXAAJMMwACTEMAAkxzAAJMowACTMcAAkzjAAJNCwACTRcAAk1PAAJNewACTdMAAk3jAAJOAwACTk8AAk7fAAJO9wACTz8AAk9zAAJPpwACT/sAAlA7AAJQtwACUXMAAlJ7AAJS7wACUvsAAlNDAAJTWwACU3sAAlOrAAJTwwACU+sAAlQjAAJUdwACVL8AAlTrAAJVFwACVScAAlWPAAJVywACVesAAlYfAAJWSwACVmsAAlanAAJW0wACVwcAAlc/AAJXXwACV4MAAlejAAJXuwACV9cAAlfzAAJYEwACWDsAAlhXAAJYwwACWQMAAllDAAJZywACWqsAAlsjAAJbiwACW+cAAlxDAAJdGwACXq8AAl77AAJfYwACX68AAmCTAAJgzwACYS8AAmGHAAJiNwACY3cAAmQXAAJkpwACZTMAAmV/AAJl1wACZhMAAmY/AAJmqwACZ28AAmfLAAJoFwACaGcAAmkDAAJpwwACak8AAmqfAAJrRwACa+8AAmy7AAJtUwACbgcAAm6LAAJvtwACcOcAAnFbAAJxvwACci8AAnKjAAJzwwACdCcAAnR7AAJ0vwACdRcAAnW3AAJ1/wACdmMAAnbTAAJ3gwACd+MAAnhfAAJ4swACefMAAno3AAJ6twACexcAAntnAAJ8vwACfmsAAn6rAAJ/EwACf28AAn+zAAKAkwACgMcAAoEfAAKBbwACgfcAAoLXAAKDTwACg7cAAoRTAAKGkwACiFcAAojjAAKJXwACibcAAopPAAKL1wACjIsAAo0TAAKNiwACjkcAAo+TAAKQPwACkNsAApEzAAKSSwACks8AApMXAAKTewAClAMAApS/AAKVNwAClZ8AApYbAAKXAwACl8sAApg3AAKYkwACmP8AApmXAAKaIwACmqsAApsjAAKbqwACnE8AAp0TAAKdpwACnlcAAp6fAAKfbwACn6cAAp/7AAKgowACoZMAAqIrAAKiswACo1cAAqQDAAKklwACpS8AAqXfAAKmOwACppMAAqbfAAKnEwACp3sAAqfzAAKoWwACqPsAAqoXAAKqpwACq1MAAqvzAAKtMwACrl8AAq7vAAKvmwACsCcAArCzAAKxhwACsvcAArNnAAK0KwACtN8AArU7AAK1zwACtvsAArdrAAK37wACuGMAArjfAAK5mwACuu8AArubAAK8NwACvHcAArynAAK87wACvZ8AAr5rAAK/CwACv5sAAr/3AALAkwACwo8AAsP7AALEhwACxQMAAsVTAALFxwACxmcAAsbLAALHXwACx98AAshXAALJGwACyhMAAsp7AALK/wACyzsAAsxfAALNqwACzdcAAs4fAALOlwACzv8AAs+DAALPwwAC0H8AAtEXAALRRwAC0ZMAAtHjAALSiwAC00MAAtODAALT3wAC1HMAAtXDAALWgwAC1wcAAtd7AALX2wAC2EsAAtlDAALZxwAC2icAAtp3AALa9wAC24MAAtvzAALcUwAC3LsAAt0rAALdpwAC3gcAAt5XAALewwAC3zsAAt+XAALf4wAC4DcAAuC/AALhNwAC4Z8AAuILAALigwAC4t8AAuMrAALjswAC5CsAAuSTAALlFwAC5asAAuYfAALmgwAC5xMAAuebAALoAwAC6HsAAukPAALpUwAC6jcAAusDAALrNwAC64cAAuu/AALsXwAC7vMAAu8bAALvXwAC7+MAAvDLAALxPwAC8dcAAvJnAALy/wAC87cAAvQ/AAL04wAC9YcAAvZ7AAL3DwAC978AAvgvAAL4xwAC+ZcAAvn3AAL6YwAC+t8AAvtzAAL8cwAC/PcAAv2PAAL+LwAC/o8AAv8nAAL/dwAC/+MAAwAzAAMAcwADALMAAwEPAAMBjwADA4MAAwPzAAMEUwADBRMAAwWXAAMGwwADBzcAAwebAAMIBwADCHsAAwmHAAMJ6wADCj8AAwqbAAMLNwADDDcAAwzDAAMNPwADDd8AAw5PAAMOpwADDwcAAw9zAAMP7wADEJsAAxFHAAMR4wADEm8AAxL3AAMUswADFSsAAxWTAAMWNwADF8cAAxhbAAMY3wADGYMAAxurAAMcPwADHMMAAx1jAAMekwADHyMAAx+jAAMf6wADIHcAAyGzAAMiLwADIpsAAyM7AAMkOwADJMsAAyVLAAMl7wADJrcAAylLAAMqAwADKqsAAysnAAMrrwADLeMAAy5bAAMuwwADLzMAAzBrAAMwywADMRsAAzGnAAMylwADMxMAAzN/AAM0OwADNLMAAzYbAAM2gwADNtsAAzdnAAM4awADOOcAAzlTAAM5uwADOlcAAzuXAAM8IwADPJ8AAz0jAAM9pwADPr8AAz8zAAM/twADQEcAA0CzAANBewADQdcAA0I7AANCswADQwsAA0OjAAND6wADRE8AA0SvAANFSwADRZsAA0YHAANGdwADR9MAA0gzAANIgwADSN8AA0kfAANKLwADS58AA0vPAANMGwADTK8AA03XAANPKwADT68AA1AzAANQ0wADUWMAA1IfAANTHwADU58AA1QPAANUYwADVLsAA1VrAANWfwADVscAA1cXAANXewADV7cAA1irAANZLwADWVsAA1mjAANZ9wADWpsAA1vjAANcJwADXJ8AA1z/AANdawADXfMAA15PAANemwADXu8AA19HAANgMwADYHsAA2DLAANhLwADYaMAA2I7AANirwADYxMAA2OTAANkEwADZT8AA2YHAANmdwADZx8AA2erAANoLwADaM8AA2lDAANptwADakcAA2q3AANrywADbCsAA2yLAANtBwADbaMAA25PAANu2wADb1cAA2+/AANwSwADcKMAA3DfAANxUwADcbcAA3LbAANzawADc78AA3QvAAN0wwADdYsAA3YPAAN2gwADdvsAA3gfAAN5cwADedsAA3pfAAN6vwADe2MAA3uzAAN78wADfEsAA31DAAN+IwADfmsAA37PAAN/GwADgB8AA4CzAAOA7wADgUcAA4G3AAOCdwADg8sAA4QrAAOEewADhQ8AA4V/AAOGAwADhmMAA4azAAOHLwADh98AA4hzAAOJEwADiaMAA4oLAAOKXwADixcAA4tbAAOLjwADjBcAA4zPAAONvwADjmcAA48HAAOPywADkJcAA5ELAAORxwADkp8AA5NrAAOU2wADlVcAA5YTAAOWvwADl38AA5fbAAOZDwADmdcAA5ojAAOaiwADmwsAA5xPAAOcvwADnR8AA513AAOeCwADnl8AA57jAAOfVwADn88AA6FHAAOi2wADo0MAA6ObAAOkEwADpHsAA6ZDAAOmmwADpuMAA6drAAOoDwADqIcAA6jvAAOpYwADqh8AA6rjAAOrRwADq8cAA6wbAAOs/wADra8AA63zAAOuUwADru8AA6/fAAOwkwADsR8AA7GbAAOx5wADstMAA7NTAAOzjwADs+cAA7RbAAO1AwADtWcAA7W7AAO2CwADtpMAA7cTAAO3iwADt/MAA7ifAAO5lwADujMAA7q/AAO7PwADvB8AA7yPAAO87wADvU8AA74TAAO+YwADvqMAA77jAAO/WwADv8MAA8AbAAPAewADwT8AA8GPAAPBzwADwkcAA8KvAAPDBwADw0cAA8PDAAPEnwADxQsAA8VnAAPF4wADxnsAA8bzAAPHewADx/MAA8hvAAPJSwADybcAA8oTAAPKjwADyycAA8ufAAPMJwADzJ8AA80HAAPNuwADzocAA87fAAPPJwADz7cAA9C3AAPRNwAD0acAA9IbAAPSvwAD0x8AA9OzAAPUNwAD1LMAA9U7AAPVpwAD1gMAA9ZjAAPW3wAD12cAA9fTAAPYLwAD2L8AA9k3AAPZtwAD2icAA9qTAAPbKwAD288AA9wrAAPccwAD3OsAA91jAAPeBwAD3rsAA98jAAPfpwAD39cAA+BXAAPgdwAD4LMAA+FPAAPiawAD4vcAA+NzAAPj4wAD5EMAA+TPAAPlHwAD5VsAA+XHAAPmAwAD5p8AA+czAAPnXwAD56cAA+f7AAPoawAD6K8AA+jvAAPpTwAD6dsAA+sDAAPrewAD6/cAA+yPAAPs+wAD7XMAA+3PAAPuGwAD7lMAA+63AAPvFwAD72sAA+/bAAPwHwAD8GMAA/CbAAPwzwAD8R8AA/F7AAPx/wAD8ksAA/KfAAPzBwAD80cAA/N3AAPzwwAD9BsAA/SXAAP03wAD9RcAA/WDAAP2LwAD9osAA/bXAAP3KwAD96sAA/hrAAP4zwAD+T8AA/mfAAP6CwAD+rMAA/sPAAP7WwAD+6cAA/wDAAP8ZwAD/LMAA/0bAAP9ewAD/hsAA/8rAAP/ewAD/7sAA///AAQAbwAEAR8ABAF/AAQBzwAEAh8ABALHAAQDBwAEA0sABAOnAAQEDwAEBLcABAUPAAQFVwAEBbMABAY/AAQGiwAEBscABAcrAAQHiwAEB98ABAhHAAQItwAECRsABAnrAAQKPwAECq8ABAsHAAQLOwAEC4MABAvnAAQMOwAEDI8ABAzTAAQNMwAEDYsABA4fAAQOZwAEDp8ABA77AAQPTwAED7sABA//AAQQMwAEEIMABBEPAAQRTwAEEX8ABBHHAAQSAwAEEj8ABBJrAAQSswAEEyMABBP3AAQVWwAEFbsABBYLAAQWVwAEFxMABBgDAAQYPwAEGJcABBj7AAQZ4wAEGjcABBp7AAQa3wAEHP8ABB1TAAQdwwAEHhcABB73AAQfOwAEH28ABB+fAAQgCwAEIPcABCFTAAQhnwAEIf8ABCJDAAQi7wAEI38ABCOzAAQkAwAEJH8ABCUfAAQmUwAEJr8ABCdHAAQn9wAEKLcABCnXAAQqdwAEKycABCvjAAQsIwAELMcABCz3AAQtQwAELbsABC5bAAQu7wAEL1cABC/bAAQwRwAEMNsABDH/AAQyWwAEMtMABDMXAAQzvwAEM/MABDRDAAQ0qwAENWcABDW/AAQ2MwAENn8ABDcvAAQ3awAEN8MABDgrAAQ4twAEORMABDlrAAQ5swAEOfsABDrXAAQ7DwAEO08ABDujAAQ8GwAEPP8ABD2LAAQ98wAEPncABD73AAQ/awAEP9sABEA7AARAgwAEaysABGtjAARrtwAEbAMABG5PAARuiwAEbuMABG9PAARwAwAEcF8ABHCrAARxTwAEcg8ABHKjAARzJwAEc48ABHXHAAR2HwAEdmcABHbTAAR4rwAEeQsABHlXAAR5xwAEe9cABHw3AAR8hwAEfNcABH5/AAR+vwAEfu8ABH9PAAR/4wAEgDMABIBzAASAywAEgf8ABIJHAASCfwAEgtsABIQ3AASEgwAEhL8ABIUXAASGawAEhrMABIbrAASHbwAEiDMABIinAASJCwAEia8ABIqLAASMOwAEjM8ABI1/AASOFwAEjv8ABI9TAASP2wAEkH8ABJDTAASRxwAEkqMABJLnAASTRwAEk4MABJRfAASU2wAElQcABJVPAASVzwAElmsABJeHAASX9wAEmFcABJirAASZXwAEmksABJuLAAScLwAEnMMABJ1PAASd3wAEnpsABJ8bAASfiwAEoEcABKFjAASiDwAEoqsABKMrAASj+wAEpG8ABKUvAASl3wAEpoMABKenAASoPwAEqNMABKlXAASpzwAEqksABKsfAASriwAErBMABKx7AAStZwAErb8ABK4zAASuswAEr7MABLAjAASwgwAEsNsABLFTAASx8wAEsnsABLLjAASzSwAEs88ABLQ/AAS09wAEtVcABLXPAAS2SwAEtr8ABLgvAAS44wAEuUcABLm3AAS6NwAEupsABLtDAAS7lwAEu+MABLxTAAS8ywAEvc8ABL43AAS+ywAEv08ABMArAATBPwAEwhMABMLfAATDmwAExDsABMT3AATF3wAExncABMcjAATH6wAEyEMABMirAATI8wAEySsABMlrAATJvwAEylcABMqrAATK7wAEy0cABMunAATMNwAEzPcABM13AATOEwAEzp8ABM/DAATQPwAE0MsABNFjAATR/wAE0t8ABNNrAATUEwAE1HsABNWbAATV8wAE1lcABNbLAATXGwAE16cABNfnAATYFwAE2EsABNjfAATZwwAE2kcABNq7AATbIwAE28sABNyXAATdLwAE3bcABN4nAATeowAE3wMABN9TAATf2wAE4QMABOF7AATiAwAE4pcABOMvAATkCwAE5JMABOU3AATlowAE5oMABOdvAATnywAE6EMABOibAATpZwAE6j8ABOqHAATq6wAE60sABOwfAATs/wAE7U8ABO27AATuEwAE7t8ABO8nAATviwAE7/MABPCHAATxIwAE8XsABPHDAATyDwAE8n8ABPODAAT0EwAE9HMABPTDAAT1GwAE9ZcABPcnAAT4FwAE+IMABPjfAAT5SwAE+dsABPr3AAT7dwAE++cABPwzAAT87wAE/d8ABP4bAAT+cwAE/tcABP+/AAUAEwAFAFcABQD/AAUCBwAFAp8ABQMnAAUDhwAFA/sABQWPAAUGiwAFBu8ABQdDAAUHxwAFCGsABQpLAAUK3wAFC2MABQwDAAUORwAFDtcABQ9XAAUQFwAFEn8ABROvAAUUXwAFFP8ABRWTAAUXSwAFF88ABRhDAAUY2wAFGosABRsTAAUbiwAFHEMABR4XAAUevwAFH1cABR/bAAUgvwAFITMABSHDAAUiKwAFIs8ABSMnAAUjbwAFI98ABSSvAAUlDwAFJYsABSYHAAUmjwAFJwMABSd7AAUoDwAFKJcABSkjAAUpmwAFKi8ABSrXAAUy1wAFM28ABTP3AAU0twAFOGcABTkXAAU5twAFOlcABULzAAVDgwAFRAMABUS7AAVJBwAFSa8ABUpHAAVKxwAFS68ABUyvAAVNHwAFTasABU4vAAVO5wAFT1sABU+/AAVQLwAFUMMABVHrAAVSbwAFUuMABVNfAAVT9wAFVYcABVaXAAVXHwAFV5cABVgLAAVYpwAFWVcABVnjAAVaiwAFWt8ABVsjAAVbqwAFXJsABV6bAAVfEwAFX3sABV/rAAVgXwAFYVMABWG3AAViCwAFYp8ABWN/AAVkAwAFZKMABWU/AAVl5wAFZnMABWcbAAVnwwAFaF8ABWj3AAVpfwAFahcABWrbAAVrYwAFa9sABWxfAAVtLwAFbaMABW4HAAVuuwAFb0cABW/rAAVwqwAFcXcABXJfAAVzGwAFc/MABXR3AAV1IwAFdbcABXZTAAV23wAFd1sABXezAAV4HwAFeHsABXj/AAV5hwAFefsABXpfAAV6/wAFe3MABXwDAAV8rwAFfWsABX4PAAV+uwAFf1cABYAvAAWAvwAFgUcABYHHAAWCNwAFgwMABYPfAAWEmwAFhUcABYXLAAWGZwAFhtsABYc/AAWHvwAFiDcABYinAAWJBwAFiZcABYnvAAWKbwAFit8ABYtXAAWLvwAFjFsABYzPAAWNWwAFjdcABY53AAWPSwAFj9sABZBbAAWQswAFkVMABZGbAAWSGwAFkn8ABZMXAAWUKwAFlQsABZWTAAWWCwAFlm8ABZfPAAWYIwAFmGcABZivAAWY+wAFmfcABZrPAAWbCwAFm2MABZvLAAWcJwAFnH8ABZzHAAWdQwAFnlcABZ+PAAWf+wAFoFcABaC/AAWhNwAFoi8ABaNLAAWjswAFpAsABaRvAAWk4wAFpdcABabvAAWnUwAFp6cABagHAAWoewAFqW8ABaqHAAWq6wAFqz8ABaufAAWsHwAFrUMABa5PAAWuvwAFrx8ABa9zAAWv2wAFsQMABbJPAAWypwAFsu8ABbNDAAWzvwAFtN8ABbXjAAW2TwAFtqsABbb3AAW3gwAFuLcABbkzAAW5nwAFugMABbpjAAW6twAFuxMABbuDAAW70wAFvNMABb0TAAW9WwAFvbcABb4rAAW+kwAFvvcABb9LAAW/mwAFwNcABcEXAAXBcwAFwcsABcIrAAXC/wAFw2MABcPXAAXFEwAFx0MABcenAAXIFwAFyJcABcjzAAXJxwAFyhMABcpPAAXKswAFy0sABcufAAXL4wAFzFcABc5HAAXOqwAFzysABc+HAAXP5wAF0G8ABdC7AAXRFwAF0X8ABdHvAAXUdwAF1NcABdVTAAXVswAF15cABdfnAAXYUwAF2M8ABdkjAAXZWwAF2ccABdpHAAXazwAF2wsABdwDAAXdJwAF3VMABd2bAAXd/wAF3t8ABd8zAAXfdwAF398ABeAzAAXglwAF4b8ABeIDAAXiNwAF4qcABeOfAAXkkwAF5PMABeVvAAXl+wAF5rsABec3AAXntwAF6E8ABejHAAXrhwAF7AsABexzAAXsywAF7UcABe3LAAXuNwAF7rMABe87AAXvwwAF8JcABfEPAAXxdwAF8f8ABfLTAAXzSwAF87MABfQ7AAX1AwAF9XsABfX3AAX2iwAF9v8ABff7AAX4XwAF+N8ABflDAAX6CwAF+l8ABfrXAAX7RwAF+58ABfwHAAX8TwAF/IcABfzHAAX9IwAF/e8ABf47AAX+owAF/xcABf/fAAYANwAGAJsABgEbAAYBowAGAlMABgLLAAYDXwAGA9cABgUrAAYGPwAGBqcABgcrAAYHuwAGCGsABgjrAAYJWwAGCacABgtXAAYMZwAGDKMABgzXAAYNLwAGDZ8ABg4jAAYPUwAGD7MABhAvAAYQowAGEZMABhJzAAYS1wAGE0MABhPDAAYUSwAGFKsABhUjAAYViwAGFisABhd3AAYaQwAGGtMABhtTAAYb3wAGHB8ABhxbAAYcxwAGHa8ABh6HAAYe4wAGH0cABh+/AAYgJwAGISsABiGzAAYiCwAGIn8ABiLTAAYj4wAGJCcABiRbAAYkmwAGJR8ABiW3AAYmPwAGJrMABidDAAYnswAGKG8ABikbAAYpewAGKeMABipfAAYrEwAGLCcABizLAAYtXwAGLgsABi6fAAYwwwAGMUcABjG7AAYyWwAGMsMABjPDAAY0OwAGNJMABjTbAAY1bwAGNksABjbPAAY3TwAGN+8ABjg7AAY5IwAGOnsABjq3AAY7DwAGO2cABjxbAAY9XwAGPacABj4TAAY+dwAGPusABj+/AAZAiwAGQO8ABkFvAAZBwwAGQpcABkN7AAZDvwAGRB8ABkRfAAZFOwAGRicABkZXAAZGowAGRw8ABkevAAZICwAGSG8ABkjnAAZJawAGSmcABkrbAAZLPwAGS8cABkxrAAZOAwAGTnsABk8PAAZPUwAGT/cABlFDAAZRdwAGUZsABlILAAZSrwAGUw8ABlNfAAZTwwAGVEMABlTTAAZVQwAGVc8ABlY3AAZX4wAGWS8ABlmHAAZZzwAGWjcABlt3AAZbzwAGXBcABlxzAAZdpwAGXnMABl6/AAZfJwAGX3MABmCXAAZg0wAGYSsABmGjAAZiYwAGYssABmNXAAZj2wAGZEsABmT3AAZlVwAGZdMABmZDAAZnLwAGaJcABmj3AAZpawAGaecABmpvAAZrOwAGa7MABmwbAAZsnwAGbdMABm5HAAZuqwAGbxMABm97AAZv0wAGcEcABnDPAAZyMwAGcqsABnMTAAZzOwAGc3sABnPPAAZz/wAGdB8ABnRrAAZ0swAGdO8ABnVHAAZ1gwAGddcABnYDAAZ2SwAGdq8ABnc3AAZ3iwAGd88ABnhDAAZ41wAGeTsABnmPAAZ50wAGen8ABnqzAAZ7AwAGe1MABnwDAAZ8QwAGfJ8ABnzjAAZ9cwAGfacABn33AAZ+IwAGfzsABoBfAAaAewAGgLMABoFLAAaCFwAGhJMABoUbAAaFkwAGhkcABobPAAaHiwAGiAMABohrAAaI8wAGib8ABoo3AAaKnwAGizsABovDAAaMkwAGjQsABo1zAAaN7wAGjpsABo8HAAaPjwAGkAMABpCjAAaRBwAGkVsABpHnAAaTPwAGk7sABpQnAAaUfwAGlR8ABpaLAAaXGwAGl5sABpgHAAaYnwAGmgsABpqTAAabCwAGm58ABpz/AAadgwAGnfcABp5bAAae7wAGoVMABqKDAAajBwAGo3sABqQTAAamJwAGpqcABqcvAAanpwAGqDsABqmPAAaqEwAGqocABqsjAAarfwAGrD8ABqyLAAasxwAGrR8ABq1nAAatnwAGrqsABq7TAAavJwAGr2sABq+/AAawXwAGsKMABrEDAAaxOwAGsiMABrMTAAazOwAGs38ABrPvAAa0awAGtMsABrVHAAa1owAGtpMABrebAAa35wAGuCMABrh3AAa4+wAGuisABrqfAAa7AwAGu2cABrufAAa8IwAGvEsABryPAAa8ywAGvZ8ABr5rAAa+lwAGvt8ABr83AAa/7wAGwSMABsFrAAbBzwAGwkMABsK/AAbDIwAGw6MABsQHAAbFMwAGxYcABsXLAAbGGwAGx0cABshTAAbIkwAGyMMABskfAAbJVwAGygcABsqjAAbKywAGyw8ABstTAAbL+wAGzC8ABsxTAAbMiwAGzNsABs0/AAbNfwAGzdsABs5nAAbPnwAG0BsABtCzAAbRIwAG0dMABtIzAAbSrwAG0xcABtOTAAbT6wAG1F8ABtTPAAbVUwAG1aMABtYDAAbWUwAG1qMABtejAAbYYwAG2KMABtj/AAbZfwAG2hcABtqHAAba4wAG228ABtvvAAbctwAG3isABt6bAAbfFwAG36MABuAnAAbhRwAG4bMABuInAAbixwAG41cABuO7AAbk0wAG5YcABuXbAAbmSwAG5q8ABudzAAbnxwAG6C8ABuifAAbpJwAG6dMABurjAAbrWwAG6+8ABuy3AAbtWwAG7fcABu6vAAbvVwAG78MABvCXAAbxmwAG8fcABvJvAAby8wAG87cABvQrAAb0jwAG9QsABvWLAAb2VwAG91cABvfHAAb4OwAG+McABvkTAAb5wwAG+f8ABvpTAAb6qwAG+xMABvu7AAb8EwAG/GsABvzfAAb9XwAG/hsABv6LAAb/FwAG/4MABwBjAAcAvwAHAQ8ABwGHAAcB0wAHAg8ABwJ/AAcC3wAHAzcABwN/AAcEBwAHBMsABwVDAAcF1wAHBnMABwerAAcINwAHCN8ABwk3AAcJnwAHCecABwofAAcKXwAHCqMABwtjAAcLlwAHC/8ABwxPAAcM1wAHDZ8ABw4XAAcOqwAHDz8ABw+jAAcRywAHEh8ABxJjAAcS0wAHFQMABxVjAAcVswAHFfcABxY3AAcWawAHFrsABxc/AAcYkwAHGQcABxlrAAcZ6wAHGjsABxpnAAcapwAHGwMABxuzAAcc+wAHHZsABx4rAAcelwAHH08AByCnAAchTwAHIecAByJbAAci4wAHJBMABySLAAck8wAHJVsAByZ7AAcm0wAHJxsABydfAAcoOwAHKJ8AByjTAAcpIwAHKZcAByprAAcqzwAHK0sAByvLAAcsUwAHLMMABy07AActzwAHLiMABy6XAAcvHwAHL2MABy/DAAcwCwAHMHMABzCrAAcw/wAHMVMABzHfAAczOwAHM38ABzPLAAc0KwAHNH8ABzUTAAc1VwAHNbcABzYjAAc2uwAHNxcABzd3AAc37wAHODcABzlrAAc51wAHOg8ABzpjAAc66wAHO5sABzwTAAc8ewAHPQsABz27AAc+XwAHP48AB0AjAAdApwAHQTsAB0GvAAdCSwAHQq8AB0MDAAdDWwAHQ88AB0RrAAdEzwAHRSMAB0V7AAdF7wAHRosAB0bvAAdHQwAHR5sAB0g7AAdJVwAHSecAB0pnAAdKwwAHS18AB0urAAdMEwAHTHsAB00rAAdNgwAHTcsAB04PAAdOiwAHT18AB0/LAAdQJwAHUIsAB1FDAAdRlwAHUfsAB1JrAAdS/wAHVI8AB1UTAAdVhwAHVgcAB1afAAdXF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wAIM/MACDRTAAg05wAINVsACDYLAAg2awAINusACDcjAAg3gwAIOCsACDhnAAg5FwAIOdMACDoXAAg6qwAIOxcACDurAAg8FwAIPL8ACD0bAAg9zwAIPisACD7XAAg/WwAIP4MACD+3AAhAJwAIQF8ACEDjAAhBawAIQgMACEILAAhCpwAIQysACEOvAAhEJwAIRKMACEUrAAhFtwAIRjcACEa7AAhHLwAIR3cACEfnAAhIVwAISMMACEkLAAhJcwAISdsACEpjAAhKrwAISxsACEuXAAhLwwAIS+cACEw/AAhMqwAITXMACE33AAhOywAIT0sACE+fAAhP1wAIUG8ACFDHAAhRSwAIUaMACFJfAAhS7wAIU28ACFOLAAhVkwAIVhcACFfDAAhYSwAIWisACFqTAAhcJwAIXJ8ACFy/AAhdHwAIXY8ACF3LAAherwAIXyMACF87AAhfYwAIX3cACF+bAAhgSwAIYLsACGDbAAhhfwAIYecACGKDAAhi8wAIYv8ACGOXAAhjywAIZB8ACGTrAAhljwAIZjcACGaHAAhnWwAIaF8ACGlHAAhpowAIal8ACGqjAAhrTwAIa+cACGyLAAhtfwAIbgcACG5/AAhu7wAIbzsACG+jAAhv8wAIcJ8ACHFDAAhyAwAIcocACHK7AAhzQwAIc6MACHQjAAh0nwAIdNMACHUjAAh1qwAIdpcACHcrAAh3owAIeKcACHlPAAh57wAIejcACHqzAAh63wAIezcACHv3AAh8cwAIfMsACH1XAAh9kwAIfhMACH5zAAh/LwAIf4MACIA7AAiATwAIgGMACICzAAiA4wAIgbsACIIbAAiCxwAIg3cACIRHAAiExwAIhVMACIYTAAiG1wAIi0sACI3nAAiOvwAIkY8ACJJHAAiS1wAIkzcACJcXAAiX5wAImiMACJq/AAibXwAInAsACJzDAAidHwAInc8ACJ4rAAieOwAInxcACJ+nAAif8wAIoG8ACKDHAAihZwAIobcACKI7AAiixwAIo58ACKRfAAiktwAIpM8ACKV/AAimJwAIpsMACKdLAAinYwAIqCcACKifAAipMwAIqW8ACKoLAAiq3wAIq2cACKwPAAisZwAIrUsACK3XAAit9wAIrpMACK7DAAivWwAIr4MACLArAAiwYwAIsQMACLFjAAiyFwAIsjsACLJ7AAizMwAIs+sACLSbAAi07wAItQcACLWDAAi2wwAIt0MACLfXAAi4TwAIuLcACLlHAAi5owAIui8ACLqHAAi7EwAIu2sACLwDAAi8dwAIvPMACL1zAAi96wAIvn8ACL7vAAi/kwAIwBcACMCjAAjBFwAIwUcACMHPAAjCSwAIwp8ACMMbAAjD4wAIxE8ACMSXAAjFJwAIxVsACMfXAAjIdwAIyMsACMkfAAjJvwAIyhMACMqDAAjKzwAIy3cACMvnAAjMDwAIzK8ACMz3AAjNrwAIzccACM4LAAjOawAIzysACM+XAAjQawAI0TcACNGLAAjR+wAI0qcACNN7AAjTpwAI1IMACNUDAAjVhwAI1iMACNcDAAjXXwAI17sACNgbAAjYcwAI2PsACNmDAAjaAwAI2icACNo7AAjafwAI2uMACNrvAAjb4wAI3GMACNzbAAjdewAI3isACN7HAAjfdwAI3+cACOCHAAjhEwAI4aMACOH7AAjiNwAI4rMACOMbAAjjpwAI5B8ACOTPAAjk9wAI5YcACOYnAAjmpwAI50cACOfXAAjodwAI6QsACOmXAAjqFwAI6iMACOrHAAjruwAI7HMACO17AAjuKwAI7rsACO8bAAjvxwAI8MMACPFvAAjxqwAI8e8ACPIfAAjy4wAI81sACPPDAAj0cwAI9SMACPWfAAj1twAI9l8ACPbXAAj3NwAI9+MACPhTAAj5AwAI+XcACPnzAAj6cwAI+xMACPuHAAj7vwAI/GcACP0vAAj9XwAI/fsACP4XAAj+TwAI/ucACP9jAAj/dwAI/4cACP/vAAkASwAJALcACQE/AAkBdwAJAZcACQJ3AAkCvwAJA1sACQQHAAkEewAJBPMACQWLAAkGJwAJBqcACQcDAAkHcwAJB78ACQg7AAkIfwAJCM8ACQkjAAkJqwAJCfcACQqTAAkLKwAJC7MACQx7AAkNGwAJDY8ACQ5fAAkPBwAJD4MACRAjAAkQZwAJET8ACRG/AAkShwAJEycACRO7AAkUdwAJFLsACRWTAAkWHwAJFp8ACRcrAAkXqwAJGDcACRi3AAkZbwAJGg8ACRp3AAka9wAJG2sACRv/AAkcSwAJHPcACR3bAAkeQwAJHusACR+7AAkgfwAJILcACSEbAAkhjwAJIgcACSIzAAkiTwAJIscACSNDAAkjewAJI5cACSQfAAkkQwAJJIMACSUnAAkl2wAJJkMACSZzAAkm0wAJJv8ACSeLAAkoPwAJKLsACSkvAAkpXwAJKdsACStbAAkrzwAJLSsACS2fAAktzwAJL08ACS/DAAkwCwAJMHsACTCrAAkw2wAJMZMACTHTAAkyNwAJMrsACTMrAAkzqwAJM/8ACTQ7AAk0twAJNOcACTWDAAk1wwAJNosACTc7AAk4pwAJOX8ACTm3AAk5/wAJOjsACTp/AAk6mwAJOq8ACTr/AAk7GwAJO1sACTt3AAk7vwAJO/8ACTwTAAk8UwAJPG8ACTyLAAk8vwAJPP8ACT17AAk9wwAJPesACT4bAAk+YwAJPqsACT7nAAk+/wAJPzcACT9HAAk/nwAJP9cACUAHAAlAPwAJQHsACUCzAAlBAwAJQQsACUE7AAlBbwAJQZcACUHHAAlB2wAJQfsACUITAAlCTwAJQmcACUKXAAlCywAJQvsACUMzAAlDcwAJQ6cACUPjAAlEPwAJRIsACUTDAAlFBwAJRVMACUW/AAlF8wAJRm8ACUbHAAlHFwAJR0sACUeLAAlHxwAJSBcACUhXAAlImwAJSNcACUlLAAlJbwAJSYsACUmnAAlJvwAJSdsACUn/AAlKMwAJSksACUprAAlKnwAJSwsACUsbAAlLVwAJS68ACUw/AAlMWwAJTIMACUzfAAlNKwAJTUMACU27AAlN6wAJThsACU5zAAlOkwAJTrsACU7zAAlPKwAJT0sACU+HAAlP0wAJUAcACVAnAAlQcwAJUI8ACVDTAAlQ7wAJUQcACVEnAAlRiwAJUdsACVH7AAlSKwAJUjsACVJrAAlSiwAJUrsACVL/AAlTCwAJU08ACVOjAAlT7wAJVC8ACVR7AAlUywAJVOMACVUTAAlVewAJVdsACVX7AAlWQwAJVl8ACVbXAAlW3wAJVv8ACVfbAAlYJwAJWH8ACVijAAlY2wAJWRcACVlLAAlZdwAJWYsACVmjAAlZ5wAJWhcACVpXAAlaawAJWncACVrPAAla3wAJWz8ACVt3AAlbswAJW+MACVwvAAlcewAJXMMACV0PAAldSwAJXYcACV3XAAlePwAJXoMACV7HAAlfDwAJX1MACV+vAAlf6wAJYC8ACWB7AAlgywAJYQ8ACWFzAAlhvwAJYecACWIPAAliMwAJYlsACWJzAAliiwAJYrcACWL7AAljGwAJYzsACWNfAAljfwAJY7cACWPPAAlj7wAJZBcACWQ3AAlkdwAJZJ8ACWSjAAlkrwAJZO8ACWVjAAllzwAJZhcACWZvAAlmuwAJZxcACWd3AAlnhwAJZ5cACWejAAlntwAJZ8MACWfbAAln7wAJaA8ACWg3AAloQwAJaG8ACWifAAloswAJaMcACWjfAAlo9wAJaRMACWkrAAlpMwAJaTsACWlDAAlpSwAJaVMACWlbAAlpYwAJaWsACWmDAAlpqwAJabcACWnDAAlpzwAJafMACWn/AAlqBwAJag8ACWoXAAlqHwAJaicACWovAAlqNwAJaj8ACWpHAAlqTwAJalcACWpfAAlqZwAJam8ACWp3AAlqfwAJaocACWqPAAlqlwAJap8ACWqnAAlqrwAJarcACWq/AAlrDwAJa2MACWt7AAlrnwAJa6cACWuvAAlrtwAJa78ACWvHAAlrzwAJa9cACWvfAAlr5wAJa+8ACWv3AAlr/wAJbAcACWwPAAlsFwAJbB8ACWwnAAlsLwAJbDcACWw/AAlsRwAJbE8ACWybAAlsqwAJbPsACW0TAAltJwAJbWcACW2jAAlt4wAJbf8ACW4zAAluWwAJbo8ACW6vAAlu/wAJb08ACW+jAAlv3wAJcEMACXBzAAlwuwAJcOcACXEDAAlxLwAJcVcACXFnAAlxbwAJcZMACXGvAAlx8wAJcgMACXITAAlyKwAJcl8ACXKTAAlyuwAJcucACXM7AAlzTwAJc38ACXOPAAlzswAJc9sACXPzAAl0IwAJdEsACXRrAAl0jwAJdKcACXS/AAl06wAJdQ8ACXUfAAl1QwAJdWcACXV/AAl1swAJddcACXZPAAl2fwAJdrcACXa7AAl2zwAJdxcACXdTAAl3WwAJd2MACXeLAAl30wAJd/MACXhHAAl4VwAJeHsACXinAAl4ywAJeOsACXj7AAl5CwAJeR8ACXk/AAl5awAJeYsACXmvAAl5xwAJeeMACXo3AAl6ewAJetMACXsXAAl7JwAJe1cACXtrAAl7lwAJe8MACXvjAAl8EwAJfDMACXxvAAl8rwAJfN8ACXzzAAl9OwAJfXMACX3LAAl91wAJfhMACX4zAAl+PwAJfocACX7HAAl+5wAJfx8ACX87AAl/bwAJf68ACX/PAAmABwAJgCcACYBDAAmAewAJgJ8ACYCnAAmAxwAJgPsACYEvAAmBgwAJgccACYHvAAmB/wAJghsACYI/AAmCbwAJgnsACYKXAAmCtwAJgtMACYMLAAmDVwAJg2MACYOrAAmDrwAJg9sACYP3AAmELwAJhEsACYRTAAmEnwAJhPsACYT/AAmFGwAJhTcACYVrAAmFqwAJhb8ACYYfAAmGYwAJhnMACYabAAmGtwAJhwsACYerAAmH6wAJiA8ACYifAAmIzwAJiPsACYkrAAmJRwAJiXsACYmLAAmJnwAJicsACYo/AAmKdwAJiosACYqbAAmKxwAJitsACYr/AAmLEwAJiz8ACYtTAAmLgwAJi5cACYu/AAmL0wAJjAcACYwbAAmMQwAJjFcACYyDAAmMlwAJjKcACYy7AAmMxwAJjNsACYzzAAmNAwAJjR8ACY0vAAmNQwAJjZsACY3bAAmOAwAJjksACY6HAAmOtwAJjyMACY9zAAmPiwAJj78ACZADAAmQNwAJkGMACZCPAAmQqwAJkM8ACZDbAAmQ+wAJkRsACZEvAAmRewAJkc8ACZH7AAmSFwAJkn8ACZK/AAmS2wAJkvsACZMTAAmTdwAJk8sACZQPAAmUEwAJlE8ACZSjAAmUuwAJlN8ACZULAAmVGwAJlT8ACZVrAAmVfwAJla8ACZXXAAmWGwAJlmcACZaDAAmWmwAJlrcACZbXAAmW5wAJlv8ACZcXAAmXOwAJl1MACZdzAAmXjwAJl7MACZfbAAmYDwAJmFcACZhvAAmYwwAJmOMACZkvAAmZQwAJmWsACZmDAAmZzwAJmesACZoDAAmaJwAJmkMACZpbAAmaawAJmncACZqrAAma/wAJm0sACZubAAmbywAJm/8ACZwzAAmccwAJnKcACZzvAAmdQwAJnXcACZ23AAmd+wAJnm8ACZ7nAAmfgwAJn98ACaAvAAmgUwAJoIcACaDTAAmhCwAJoR8ACaFXAAmhhwAJoccACaIzAAmilwAJoxcACaOXAAmkAwAJpHcACaS/AAmlNwAJpZcACaXrAAmmEwAJpisACaZnAAmmgwAJpqMACabDAAmm4wAJpwcACadHAAmnYwAJp6cACafrAAmoCwAJqC8ACahTAAmoXwAJqL8ACajbAAmpMwAJqXsACamfAAmp+wAJqhcACapLAAmqewAJqqcACasLAAmrVwAJq98ACawzAAmsdwAJrIsACayvAAms4wAJrO8ACa1HAAmtjwAJrdcACa4PAAmuVwAJro8ACa7vAAmvPwAJr+cACbB/AAmw2wAJsScACbFvAAmxpwAJsfcACbI3AAmyfwAJssMACbMLAAmzSwAJs48ACbPzAAm0KwAJtIcACbS/AAm1PwAJtZsACbW7AAm18wAJtgsACbZHAAm2bwAJtrcACbb3AAm3TwAJt5cACbfPAAm4DwAJuGMACbivAAm41wAJuP8ACbk3AAm5iwAJukcACbpzAAm6kwAJus8ACbrjAAm7BwAJuycACbtbAAm7uwAJu+8ACbwbAAm8bwAJvLMACby3AAm8+wAJvXcACb33AAm+KwAJvpcACb7rAAm/MwAJv1sACcAvAAnAgwAJwKcACcGHAAnBswAJwosACcLXAAnDNwAJw48ACcPTAAnEKwAJxH8ACcSnAAnE/wAJxQsACcUrAAnFawAJxdsACcYXAAnGWwAJxoMACcazAAnHNwAJx5cACce7AAnH2wAJyCsACcgzAAnIOwAJyJsACcjHAAnI0wAJyPcACclLAAnJmwAJydcACcpXAAnKcwAJyp8ACcsXAAnLUwAJy9sACcwnAAnMvwAJzR8ACc3PAAnOCwAJzpMACc7XAAnPZwAJz68ACdBDAAnQdwAJ0PcACdFPAAnR9wAJ0jcACdLDAAnTSwAJ08MACdRjAAnU5wAJ1YMACdYDAAnWqwAJ1y8ACde3AAnYZwAJ2NsACdl3AAnaAwAJ2ncACdrvAAnbjwAJ3AMACdyfAAndEwAJ3a8ACd4HAAnefwAJ3x8ACd+zAAngHwAJ4QMACeGDAAniKwAJ4qsACeNTAAnkDwAJ5O8ACeV3AAnmIwAJ5rcACedzAAnn/wAJ6JMACelPAAnpiwAJ6aMACenPAAnqEwAJ6kMACeqHAAnqpwAJ6uMACer/AAnrJwAJ60cACetrAAnrjwAJ698ACewbAAnsVwAJ7IsACeyzAAns4wAJ7PMACe0XAAntKwAJ7UcACe17AAntrwAJ7fcACe4jAAnuNwAJ7ksACe5fAAnucwAJ7qsACe7PAAnvGwAJ7z8ACe93AAnvmwAJ77sACe/bAAnwMwAJ8FsACfB/AAnwjwAJ8PMACfFbAAnxgwAJ8YsACfHTAAnyJwAJ8mMACfKvAAnzFwAJ84sACfQHAAn0gwAJ9OsACfVbAAn1pwAJ9dcACfY3AAn2awAJ9pMACfbLAAn3BwAJ908ACfdnAAn3kwAJ98MACff/AAn4NwAJ+F8ACfijAAn43wAJ+TMACflXAAn50wAJ+h8ACfpHAAn6bwAJ+qsACfrLAAn7DwAJ+xsACftvAAn7twAJ+/MACfwHAAn8LwAJ/FsACfyfAAn89wAJ/SMACf1bAAn9qwAJ/f8ACf5HAAn+gwAJ/rMACf8XAAn/VwAJ/7MACgAPAAoAYwAKAL8ACgEHAAoBSwAKAXcACgHHAAoB+wAKAiMACgJvAAoClwAKAssACgL/AAoDHwAKA2MACgOjAAoD3wAKA+8ACgSLAAoEqwAKBPcACgULAAoFowAKBesACgYzAAoGdwAKBuMACgc/AAoHmwAKB/MACgjbAAoJDwAKCbsACgnzAAoKEwAKCjcACgpTAAoKcwAKCpMACgq7AAoK7wAKCzcACguTAAoL0wAKC98ACgyLAAoM1wAKDQMACg0rAAoNPwAKDYsACg3PAAoOBwAKDx8ACg9/AAoP7wAKEIsAChC/AAoQ+wAKET8AChGDAAoRrwAKEhMAChIzAAoSWwAKEn8AChK3AAoTNwAKE68AChP7AAoU1wAKFScAChVLAAoVgwAKFasAChXnAAoWRwAKFp8AChbjAAoXDwAKFzMAChdXAAoXiwAKF98AChgHAAoYTwAKGHcAChi/AAoZDwAKGT8AChl3AAoZswAKGiMAChqrAAoa2wAKGycAChtbAAoblwAKHBsAChyHAAoczwAKHR8ACh1LAAodqwAKHecACh4LAAoeSwAKHpcACh7vAAofawAKH6sACiALAAogVwAKIIsACiEDAAohNwAKIacACiHXAAoiDwAKIlMACiKfAAoi7wAKIz8ACiN3AAoj0wAKJCcACiSTAAok7wAKJXsACiWXAAol3wAKJgsACiZLAAompwAKJusACidXAAonhwAKJ+8ACigTAAooTwAKKGMACiirAAoo3wAKKUcACilrAAop+wAKKj8ACiqDAAoqtwAKKwMACitrAAorrwAKK98ACiw7AAoshwAKLOsACi0bAAotVwAKLYcACi2/AAot8wAKLh8ACi4zAAouewAKLo8ACi6rAAou1wAKLwMACi+XAAovywAKL/8ACjADAAowGwAKMDMACjBjAAowcwAKMIMACjCvAAow1wAKMQcACjFTAAoxewAKMYMACjGLAAoxowAKMbMACjG7AAox0wAKMdsACjH/AAoyBwAKMicACjJbAAoyawAKMpcACjKnAAoy1wAKMv8ACjMjAAozTwAKM5MACjPLAAo0GwAKNEsACjSPAAo0xwAKNPcACjT7AAo1ewAKNY8ACjWbAAo1vwAKNf8ACjYbAAo2UwAKNocACjajAAo22wAKNv8ACjcrAAo3PwAKN08ACjdnAAo3owAKN68ACjfTAAo3/wAKODsACjhzAAo4owAKONsACjknAAo5VwAKOY8ACjm/AAo55wAKOjMACjpjAAo6lwAKOsMACjr/AAo7TwAKO68ACjv/AAo8YwAKPKsACj0DAAo9TwAKPaMACj27AAo91wAKPd8ACj3rAAo+BwAKPisACj5PAAo+awAKPn8ACj7rAAo/GwAKP1MACj+vAAo/8wAKQBsACkBPAApAXwAKQJsACkC7AApAzwAKQRsACkFvAApBiwAKQbcACkHjAApCZwAKQpsACkKjAApCywAKQv8ACkMnAApDUwAKQ38ACkOnAApD7wAKRC8ACkRHAApEawAKRG8ACkRzAApEewAKRKsACkSzAApE+wAKRR8ACkVTAApFlwAKRc8ACkZPAApGowAKRtcACkbzAApHCwAKRz8ACkdzAApHywAKSBMACkhPAApIowAKSNcACkjfAApJIwAKSTsACklLAApJXwAKSXMACkmLAApJqwAKSgcACkoPAApKEwAKShsACkpXAApKewAKSr8ACksDAApLMwAKS38ACkuXAApLowAKS+MACkwDAApMewAKTNMACk1nAApN4wAKTh8ACk5PAApOgwAKTq8ACk67AApO0wAKTysACk+XAApP2wAKUBcAClBLAApQowAKUMMAClDjAApRDwAKUTsAClFbAApRZwAKUaMAClHzAApSUwAKUncAClLDAApS1wAKUucAClMDAApTKwAKU18AClODAApTywAKU/sAClRLAApUVwAKVGsAClR3AApUewAKVKMAClSrAApUswAKVO8AClU7AApVQwAKVUsAClVTAApVYwAKVWsAClWHAApVowAKVdsAClXjAApWFwAKVicAClZDAApWVwAKVmsAClZ3AApWfwAKVpMAClbLAApW1wAKVvcAClcPAApXFwAKVysAClc/AApXRwAKV1MACleHAApXnwAKV6sACle7AApX1wAKV/cAClf/AApYDwAKWCcAClgzAApYOwAKWE8ACliPAApYqwAKWMMACljfAApY8wAKWQMAClkfAApZawAKWZsAClm3AApZxwAKWc8AClnXAApaKwAKWkcAClpXAApafwAKWqcAClrTAApbGwAKW0MACltvAApbjwAKW7cAClvfAApcCwAKXDcAClxLAApcawAKXKMACly7AApc1wAKXQcACl0jAApdOwAKXXsACl2DAApd7wAKXjMACl5PAApenwAKXt8ACl8XAApfcwAKX68ACmAPAApgZwAKYOMACmFTAAphlwAKYdsACmIvAApiOwAKYpcACmLfAApjIwAKY2MACmOXAApj3wAKZAsACmRHAApkhwAKZMMACmUHAAplZwAKZYsACmXzAApmEwAKZicACmaHAApm3wAKZvsACmc7AApnZwAKZ68ACmfzAApoIwAKaHcACmiTAApovwAKaOMACmkDAAppZwAKacsACmojAApqpwAKatcACmsDAAprRwAKa3cACmvrAApsAwAKbCcACmxvAApsuwAKbSsACm1nAAptjwAKbccACm4TAApuXwAKbmMACm6vAApu+wAKb0cACm9vAApvqwAKb+cACnADAApwIwAKcH8ACnCzAApw9wAKcTMACnFXAApxfwAKcbcACnH/AApyFwAKcksACnJzAApypwAKcrsACnL/AApzRwAKc4cACnPLAAp0BwAKdD8ACnSHAAp1BwAKdWcACnW7AAp2DwAKdi8ACnaDAAp2lwAKdqsACnbrAAp3KwAKd1MACnefAAp3twAKd/sACnhLAAp4XwAKeIcACnjHAAp5EwAKeY8ACnmjAAp5uwAKefcACnoXAAp6uwAKes8ACnr/AAp7MwAKe2MACnujAAp7ywAKe/cACnw3AAp8bwAKfLcACn0DAAp9SwAKfbsACn3zAAp+HwAKfm8ACn6XAAp+swAKfwsACn9HAAp/owAKgBcACoBHAAqAgwAKgKcACoDvAAqBHwAKgU8ACoF7AAqBnwAKgcMACoHjAAqB/wAKgh8ACoJLAAqCdwAKgqMACoLHAAqDAwAKgzcACoNrAAqDlwAKg7sACoPbAAqD+wAKhCsACoRfAAqEhwAKhLMACoTfAAqFEwAKhTsACoVPAAqFnwAKhbsACoXnAAqGDwAKhj8ACoZzAAqGrwAKhv8ACocvAAqHZwAKh4cACofPAAqIDwAKiE8ACoiPAAqIpwAKiOcACojzAAqJCwAKiR8ACok3AAqJWwAKiXMAComjAAqJwwAKihsACop/AAqKswAKiscACor/AAqLUwAKi4cACovfAAqMCwAKjE8ACoxzAAqMvwAKjR8ACo1vAAqNswAKjfcACo4PAAqOVwAKjnMACo67AAqPBwAKj08ACo9/AAqPnwAKj9MACpAfAAqQXwAKkJ8ACpDvAAqRYwAKkasACpHnAAqSJwAKklMACpKDAAqSnwAKktcACpMHAAqTKwAKk1MACpN3AAqTnwAKk8sACpP7AAqUJwAKlFcACpSHAAqUuwAKlN8ACpUHAAqVGwAKlVsACpWzAAqV5wAKlnsACpa/AAqW4wAKlxMACpdfAAqX5wAKmD8ACphfAAqYiwAKmM8ACpj3AAqZOwAKmVcACpmbAAqZywAKmgcACpozAAqabwAKmp8ACprnAAqbKwAKm8cACpvnAAqb7wAKnFMACpyrAAqdKwAKnWMACp3TAAqeRwAKnnsACp6bAAqetwAKnscACp7/AAqfIwAKn18ACp/HAAqf9wAKoFsACqCrAAqguwAKoM8ACqDvAAqhDwAKoTMACqFHAAqhWwAKoXsACqGbAAqhowAKoasACqHbAAqiOwAKok8ACqJ3AAqiuwAKouMACqMzAAqjVwAKo38ACqPHAAqkLwAKpIcACqTDAAqlHwAKpWsACqWbAAqlywAKpgsACqY7AAqmbwAKpo8ACqazAAqm2wAKpusACqczAAqnewAKp88ACqf7AAqojwAKqM8ACqjvAAqpLwAKqYMACqnjAAqqIwAKqoMACqsTAAqrbwAKq4sACqvjAAqsYwAKrLsACqz/AAqtLwAKrUcACq27AAqtywAKrdMACq3jAAquEwAKrocACq6vAAqu0wAKrv8ACq8/AAqvfwAKr8sACrAXAAqwQwAKsH8ACrC3AAqw8wAKsWsACrHDAAqyEwAKsl8ACrKTAAqy6wAKsz8ACrN7AAqzxwAKs+sACrQPAAq0MwAKtH8ACrSTAAq09wAKtQMACrVTAAq1awAKtZcACrXDAAq11wAKtf8ACrYfAAq2PwAKtl8ACraLAAq2zwAKtyMACrdTAAq3lwAKt9sACrf/AAq4OwAKuF8ACrh3AAq4hwAKuJcACrijAAq4rwAKuMcACrjfAAq47wAKuPsACrkbAAq5OwAKuVMACrlzAAq5mwAKudsACroTAAq6OwAKulMACrqDAAq6swAKutsACrsDAAq7JwAKu0sACrt7AAq7qwAKu9MACrv3AAq8GwAKvFMACryLAAq8uwAKvOMACr0bAAq9WwAKvbMACr5DAAq+0wAKvyMACr+TAAq/3wAKwHcACsCrAArA6wAKwTsACsFvAArBnwAKwd8ACsIPAArCcwAKwqsACsMnAArDowAKw/8ACsR7AArE/wAKxa8ACsYrAArGrwAKxysACserAArILwAKyIMACsjTAArJDwAKyT8ACslrAArJowAKyesACsprAArKrwAKyw8ACss/AArLZwAKy9cACsv7AArMYwAKzOcACs0HAArNjwAKzbMACs4rAArOSwAKzsMACs9vAArP6wAK0BMACtBnAArQvwAK0RsACtF7AArR8wAK0ksACtLHAArTIwAK03MACtOjAArUAwAK1FMACtTLAArVHwAK1XcACtXPAArV8wAK1i8ACtZXAArWgwAK1q8ACtbPAArXFwAK1zsACteHAArXwwAK2BcACthbAArY5wAK2QsACtk/AArZiwAK2fcACtonAAraMwAK2m8ACtqnAAra2wAK2wsACtuXAArb2wAK3BMACtxDAArcbwAK3IcACtyvAArc4wAK3ScACt1jAArdiwAK3fMACt4vAAreYwAK3rMACt7LAArfFwAK35cACt/vAArgQwAK4G8ACuDnAArhGwAK4V8ACuGTAArh3wAK4lMACuKbAArjLwAK40sACuOXAArj0wAK5C8ACuRXAArkfwAK5J8ACuSzAArlIwAK5WsACuWbAArlvwAK5fcACuYHAArmVwAK5o8ACua7AArnGwAK51cACufXAAroDwAK6CsACuhrAArolwAK6J8ACulDAArptwAK6mMACuqPAArqrwAK6tsACusLAArrPwAK60cACuu3AArsAwAK7FMACux7AArswwAK7PMACu0fAArtOwAK7WcACu2HAAruBwAK7jcACu6HAAru8wAK7zsACu+7AArv1wAK8AsACvAvAArwgwAK8NMACvDvAArxPwAK8YsACvI/AArywwAK8t8ACvLnAArzVwAK9AcACvQ7AAr1YwAK9Y8ACvYzAAr2+wAK9zMACvf/AAr4HwAK+N8ACvmXAAr51wAK+kcACvpTAAr6ZwAK+pcACvrLAAr67wAK+x8ACvtHAAr7dwAK+78ACvvbAAr8DwAK/BsACvx3AAr8lwAK/MsACv0TAAr9SwAK/ZMACv3fAAr+FwAK/kcACv5XAAr+fwAK/p8ACv63AAr+4wAK/wcACv8vAAr/XwAK/2cACv+XAAr/vwAK/8sACv/fAAsALwALAGMACwCbAAsA+wALAR8ACwFTAAsBlwALAecACwIvAAsCewALAucACwLzAAsDLwALA08ACwNjAAsDawALA9cACwQjAAsEQwALBGcACwSnAAsE3wALBS8ACwVjAAsFiwALBbsACwX/AAsGMwALBmcACwaLAAsGrwALBt8ACwcrAAsHUwALB2MACweTAAsHwwALB98ACwgvAAsISwALCHsACwibAAsJDwALCSMACwk3AAsJgwALCasACwnbAAsKEwALCmcACwqvAAsK4wALCwMACwtTAAsLowALC/MACwzXAAsNuwALDeMACw4DAAsOQwALDksACw6TAAsOuwALDwcACw8TAAsPnwALEBsACxA7AAsQnwALEL8ACxDHAAsQ3wALEPMACxEHAAsRGwALESsACxE/AAsRUwALEWcACxGHAAsRqwALEccACxHnAAsR7wALEgsACxIbAAsSKwALEjsACxJTAAsSbwALEpMACxKzAAsSzwALEuMACxL3AAsTCwALEycACxMzAAsTUwALE18ACxNvAAsTdwALE58ACxO3AAsTvwALE+MACxQHAAsUDwALFB8ACxQvAAsUSwALFF8ACxR3AAsUjwALFJsACxSrAAsUswALFLsACxTbAAsU6wALFP8ACxUTAAsVMwALFVMACxVvAAsVhwALFZMACxWjAAsVuwALFdMACxXnAAsV/wALFg8ACxYfAAsWMwALFkMACxZPAAsWawALFncACxaHAAsWmwALFqsACxa/AAsW3wALFwMACxcjAAsXSwALF48ACxfTAAsYDwALGCcACxhrAAsYhwALGLcACxjbAAsZLwALGVsACxmfAAsZ4wALGgcACxojAAsaXwALGnMACxp/AAsapwALGtMACxrvAAsbFwALG2MACxu3AAsb+wALHAcACxw/AAscZwALHIcACxzLAAsdFwALHWcACx2zAAseAwALHkMACx6TAAse1wALHxcACx9nAAsfswALIA8ACyBbAAsgkwALIOsACyE/AAshVwALIYMACyGvAAsh1wALIf8ACyILAAsiUwALInsACyKTAAsitwALIwMACyNbAAsjZwALI5cACyOfAAsjpwALI7cACyPTAAsj+wALJAcACyQTAAskLwALJFcACyRjAAskewALJIMACySXAAskqwALJL8ACyTfAAsk5wALJTMACyVfAAslrwALJbcACyXLAAsl6wALJfcACyX/AAsmEwALJicACyZHAAsmUwALJnMACyafAAsmrwALJr8ACybTAAsm8wALJwcACycbAAsnOwALJ0cACydbAAsnewALJ4MACyevAAsntwALJ9MACyf7AAsoAwALKBsACyhPAAsoXwALKHsACyiDAAsopwALKK8ACyjPAAspCwALKRMACylXAAsppwALKbMACynXAAsp6wALKgsACyoTAAsqIwALKj8ACypHAAsqwwALKscACyrbAAsrBwALKz8ACytLAAsrawALK28ACyuTAAsr4wALLFcACyxnAAssiwALLMcACyznAAstBwALLRMACy0/AAsthwALLdcACy4rAAsucwALLr8ACy8fAAsvbwALL6sACzADAAswVwALMJ8ACzDTAAsxJwALMW8ACzHHAAsyDwALMmMACzK7AAszBwALM1sACzOvAAs0BwALNF8ACzSfAAs06wALNU8ACzWTAAs12wALNicACzZ/AAs2qwALNscACzbrAAs3HwALNz8ACzdzAAs3kwALN8cACzfnAAs4GwALOE8ACzh7AAs4nwALOMMACzjfAAs5VwALOYMACzmvAAs5twALOccACznvAAs6CwALOjcACzpjAAs6iwALOs8ACzsLAAs7XwALO7cACzwHAAs8YwALPIsACzzDAAs9DwALPTsACz2XAAs9wwALPfcACz4HAAs+OwALPl8ACz57AAs+jwALPvcACz9HAAs/dwALP68ACz/jAAtACwALQCcAC0BTAAtAiwALQJcAC0DvAAtBGwALQUMAC0GHAAtBtwALQgcAC0JPAAtCdwALQrMAC0LnAAtDNwALQ3MAC0PDAAtD2wALRAMAC0QrAAtEdwALRKcAC0TrAAtFKwALRXMAC0WjAAtF6wALRhcAC0ZfAAtGpwALRvcAC0c3AAtHdwALR68AC0fbAAtIMwALSJ8AC0jjAAtJJwALSVMAC0mHAAtJuwALSesAC0oXAAtKQwALSmMAC0qDAAtKqwALSrsAC0rbAAtK+wALSzsAC0tXAAtLZwALS68AC0vXAAtMOwALTH8AC0y3AAtM5wALTTcAC01nAAtNswALTdcAC04PAAtOWwALTscAC08nAAtPlwALT+MAC1AjAAtQbwALUK8AC1EPAAtRSwALUXcAC1GvAAtR/wALUmMAC1LHAAtS8wALU08AC1O7AAtUCwALVFMAC1R/AAtU1wALVT8AC1WvAAtV+wALVkMAC1aXAAtW8wALVzMAC1dbAAtXhwALV7MAC1fPAAtYGwALWFsAC1ibAAtZNwALWWMAC1nXAAtaOwALWrsAC1rLAAtbJwALW38AC1u7AAtcNwALXF8AC1xzAAtc1wALXPcAC10PAAtdTwALXc8AC14XAAteSwALXocAC17DAAte1wALXvMAC18fAAtfXwALX6cAC1/7AAtgRwALYH8AC2DvAAthGwALYU8AC2GbAAthywALYd8AC2HzAAtiNwALYlsAC2J7AAti1wALYx8AC2NXAAtjbwALY88AC2P7AAtkRwALZLMAC2T7AAtlMwALZV8AC2WDAAtl4wALZj8AC2ZXAAtmpwALZscAC2cDAAtnLwALZ38AC2efAAtoKwALaFcAC2h3AAtomwALaL8AC2jnAAtpCwALaScAC2lLAAtpkwALacsAC2oLAAtqTwALansAC2rnAAtrOwALa2sAC2uPAAtrwwALbAMAC2xPAAtsnwALbN8AC20rAAttqwALbo8AC26rAAtu4wALbzcAC293AAtwHwALcLcAC3DXAAtxBwALcRsAC3FfAAtxkwALcc8AC3H/AAtyIwALcnsAC3KzAAty0wALcwMAC3N/AAtz5wALdFMAC3SDAAt0mwALdN8AC3UDAAt1KwALdVcAC3WHAAt1vwALdecAC3YnAAt2TwALdnsAC3afAAt20wALdvsAC3cnAAt3XwALd7cAC3g/AAt4iwALeRMAC3lfAAt55wALei8AC3qLAAt7AwALeycAC3tPAAt7dwALe9MAC3wDAAt8PwALfHsAC3zXAAt9MwALfXsAC33DAAt95wALfgcAC343AAt+awALfq8AC38HAAt/SwALf48AC3+rAAt/6wALf/sAC4AvAAuAawALgJMAC4DDAAuA6wALgRMAC4FjAAuBjwALgbsAC4ILAAuCfwALgrcAC4MrAAuDfwALg5cAC4OvAAuD9wALhCsAC4RjAAuErwALhO8AC4U7AAuFewALhbMAC4XTAAuGKwALhksAC4ZzAAuGtwALhv8AC4dHAAuHrwALh+MAC4gzAAuIXwALiHsAC4i3AAuI2wALiTMAC4nbAAuJ/wALio8AC4r7AAuLSwALi4MAC4u7AAuL+wALjEcAC4yTAAuM9wALjR8AC41XAAuNmwALjecAC44nAAuOUwALjoMAC463AAuO9wALjysAC49fAAuPmwALj8cAC5AXAAuQNwALkGMAC5CHAAuQlwALkLcAC5D7AAuRWwALkb8AC5IzAAuSWwALkoMAC5LbAAuS9wALkysAC5NfAAuTnwALk9cAC5QHAAuUIwALlGcAC5SPAAuUuwALlOcAC5UvAAuVOwALlV8AC5W7AAuWJwALlocAC5avAAuXGwALl2MAC5ePAAuXowALmBsAC5iTAAuY+wALmTcAC5lrAAuZkwALmbcAC5nPAAuZ9wALmisAC5qbAAua2wALmwMAC5sjAAubRwALm2MAC5ubAAubuwALm+cAC5wDAAucGwALnCcAC5xDAAucTwALnHcAC5yXAAucwwALnNMAC5z3AAudGwALnUMAC51zAAudnwALnc8AC53/AAueIwALnksAC56DAAueowALnscAC58DAAufGwALn0MAC59XAAufgwALn9cAC5/nAAugHwALoF8AC6B/AAugmwALoN8AC6EjAAuhmwALoe8AC6HzAAuiNwALol8AC6LfAAujOwALo18AC6ObAAujvwALpAMAC6RfAAukkwALpMcAC6TnAAulKwALpTcAC6WLAAumewALprcAC6bbAAunDwALpzMAC6dnAAuniwALp5cAC6ejAAunqwALp7MAC6fDAAun0wALqDMAC6hTAAuokwALqLsAC6kPAAupVwALqacAC6oHAAuqYwALqsMAC6srAAurlwALq+cAC6wzAAusewALrLcAC60rAAutXwALrY8AC63LAAut+wALrh8AC65XAAuumwALrssAC68HAAuvPwALr3sAC6+jAAuvxwALr/MAC7AfAAuwPwALsF8AC7CHAAuw5wALsUsAC7GLAAuxqwALsdcAC7IHAAuyLwALsmcAC7KHAAuy6wALs1MAC7OXAAuz0wALs/8AC7QrAAu0UwALtIcAC7SzAAu1GwALtUcAC7V/AAu1twALth8AC7ZrAAu2owALts8AC7cHAAu3M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wANE0cADRPHAA0UkwANFRMADRWzAA0WowANFycADRe/AA0YbwANGR8ADRnnAA0alwANG0sADRvrAA0cawANHPMADR2vAA0eTwANHuMADR+TAA0gNwANIPMADSF7AA0iMwANIx8ADSPPAA0kewANJQMADSV/AA0mdwANJ0sADSgfAA0o3wANKYcADSovAA0q1wANK6sADSxzAA0tfwANLgcADS57AA0vFwANL+MADTBjAA0w3wANMXsADTHjAA0yMwANMrcADTNnAA0z4wANNIcADTUvAA01mwANNgsADTbLAA03OwANN7MADTgjAA042wANOZMADTobAA06nwANOzsADTvbAA08swANPTcADT3vAA0+iwANPzsADT93AA0/rwANP+8ADUBDAA1AkwANQMcADUE3AA1BqwANQf8ADUJLAA1ChwANQtMADUM/AA1DjwANQ6sADUPbAA1EFwANRGsADUUHAA1FVwANRccADUaHAA1G2wANR0MADUfDAA1IQwANSNsADUlbAA1J3wANSk8ADUqfAA1K9wANS4MADUvzAA1MVwANTNcADU1LAA1N1wANTi8ADU63AA1PcwANT/MADVBvAA1QrwANUQ8ADVFnAA1RswANUnsADVMfAA1TwwANVFMADVTLAA1VQwANVbsADVZfAA1W9wANV9MADVgrAA1YbwANWP8ADVlrAA1aBwANWlcADVqjAA1bDwANW0cADVujAA1bwwANXEMADVy3AA1dLwANXWsADV37AA1egwANXwsADV9fAA1fywANYDsADWDjAA1hNwANYb8ADWIrAA1iqwANYssADWLrAA1jDwANY58ADWRTAA1lmwANZwcADWhvAA1pCwANaXcADWnXAA1qMwANaocADWrjAA1rSwANa6sADWwTAA1sbwANbMsADW0zAA1tkwANbfsADW8LAA1vTwANb6cADW/3AA1wTwANcPcADXFTAA1x7wANcyMADXNvAA1z8wANdPcADXabAA134wANeVcADXpnAA17cwANfC8ADX2rAA1/ZwANf8cADYDjAA2CZwANg4MADYQDAA2EawANhacADYZbAA2HfwANiAcADYkjAA2JuwANirsADYvrAA2OAwANjoMADY77AA2PewANkIMADZGvAA2SiwANk2cADZP3AA2UfwANlJsADZT/AA2VbwANlisADZaDAA2XWwANmLMADZk3AA2cjwANnW8ADZ5nAA2hMwANpC8ADaX7AA2nHwANqRMADamrAA2qswANrDsADa1jAA2uGwANrxsADa+/AA2zJwANtN8ADbbLAA26mwANu1cADbxPAA283wANvWsADb4/AA2+gwANv08ADcCHAA3BlwANwssADcOnAA3FfwANxjcADcbnAA3H4wANyN8ADcn/AA3K0wANzLcADc4DAA3ORwANzocADc+7AA3RGwAN0dsADdKvAA3T1wAN1JcADdUfAA3VnwAN1mMADdcnAA3gKwAN4S8ADeHfAA3idwAN5KMADeYrAA3oWwAN6v8ADe0bAA3u4wAN7/MADfDfAA3zEwAN9BMADfdjAA35mwAN+6MADf2rAA3/3wAOAeMADgLLAA4EdwAOBpMADginAA4K0wAODF8ADg3nAA4O+wAOD3sADg/rAA4SowAOFJsADhWjAA4YiwAOGnsADhtPAA4eKwAOH+MADiMrAA4j7wAOJT8ADiY7AA4nHwAOJ9sADiijAA4pMwAOKV8ADimXAA4pnwAOKbsADipPAA4qjwAOKssADirzAA4rQwAOK28ADivfAA4sJwAOLGsADiyLAA4sowAOLM8ADizvAA4tMwAOLT8ADi1bAA4tfwAOLdMADi47AA4uZwAOLpcADi7fAA4vJwAOL1sADi+bAA4v1wAOMBMADjBfAA4wqwAOMPMADjEnAA4xXwAOMZsADjIPAA4yYwAOMqsADjMDAA4zWwAOM7MADjQHAA40awAONJ8ADjTrAA41FwAONWMADjWPAA413wAONhMADjZbAA42iwAONtMADjb/AA43SwAON4sADjfLAA43+wAOOB8ADjjXAA45JwAOOY8ADjoDAA46LwAOOsMADjsHAA47QwAOO3sADjunAA47twAOO8cADjxjAA48cwAOPIsADjy7AA480wAOPPcADj03AA49XwAOPYMADj3TAA4+AwAOPjMADj5DAA4+cwAOPoMADj6jAA4+zwAOPwMADj8XAA4/SwAOP4sADj+7AA5AEwAOQE8ADkB3AA5ApwAOQPcADkEjAA5BVwAOQZ8ADkHDAA5B+wAOQjcADkJnAA5ChwAOQtcADkMLAA5DJwAOQzsADkPDAA5EAwAOREMADkRLAA5ExwAORNcADkTnAA5E9wAORQcADkUXAA5FJwAORTcADkVHAA5FUwAORV8ADkVvAA5FewAORYcADkWTAA5FnwAORasADkW3AA5FxwAORdcADkXnAA5F9wAORgcADkYXAA5GJwAORjcADkZHAA5GUwAORmMADkZzAA5GfwAORosADkaXAA5GowAORrMADkbLAA5G+wAORw8ADkcnAA5HWwAOR4MADkeXAA5HswAOR9MADkfjAA5ICwAOSB8ADkhLAA5IfwAOSJsADkjHAA5JCwAOSScADklXAA5JnwAOScMADknXAA5J7wAOSgcADkobAA5KKwAOSk8ADkpnAA5KhwAOSqsADkrDAA5K6wAOSvcADksfAA5LOwAOS2cADkt/AA5LiwAOS78ADkvbAA5MCwAOTC8ADkw7AA5MXwAOTJMADky7AA5M3wAOTRcADk1DAA5NWwAOTWsADk2XAA5NvwAOTecADk3/AA5OGwAOTkcADk5bAA5OawAOTocADk63AA5OzwAOTxsADk+HAA5RhwAOUdsADlHzAA5SOwAOUtMADlNvAA5UFwAOVK8ADlWrAA5VywAOVkMADlcnAA5XUwAOV28ADlfrAA5YcwAOWI8ADljbAA5Y6wAOWRsADlkvAA5ZRwAOWV8ADlmDAA5ZqwAOWcMADlnfAA5Z/wAOWjsADlp3AA5alwAOWq8ADlr/AA5bMwAOW4MADlvHAA5cGwAOXGcADly7AA5dAwAOXU8ADl2TAA5eUwAOXp8ADl7fAA5e/wAOX2sADl+HAA5fwwAOYFcADmCvAA5hQwAOYZsADmHzAA5ibwAOYqcADmMjAA5jZwAOY7cADmQ3AA5kZwAOZJ8ADmTfAA5lRwAOZY8ADmWjAA5l4wAOZjMADmZzAA5mqwAOZrcADmcDAA5nVwAOZ7MADmfrAA5oSwAOaGcADmiLAA5oxwAOaRMADmmLAA5qCwAOajMADmpfAA5qgwAOaqcADmrvAA5rFwAOa4MADmurAA5rswAOa/sADmxrAA5slwAObNcADm0fAA5tXwAObaMADm3vAA5uNwAObn8ADm67AA5u7wAObx8ADm9LAA5viwAOb8MADm/3AA5wkwAOcScADnFnAA5xrwAOceMADnInAA5yUwAOcnsADnKrAA5y3wAOczMADnOHAA50MwAOdOMADnV/AA52JwAOdt8ADncXAA53VwAOd7sADnfvAA54HwAOeE8ADnh3AA54/wAOeT8ADnlfAA55iwAOebsADnoHAA56NwAOeocADnqfAA568wAOexcADnsvAA57XwAOe5cADnuvAA57zwAOe+sADnwbAA58XwAOfH8ADny3AA582wAOfPsADn03AA59SwAOfXcADn2nAA59wwAOfdsADn4fAA5+QwAOfnMADn67AA5/LwAOf7MADn/bAA6ABwAOgG8ADoDbAA6BFwAOgVMADoFzAA6BrwAOgdMADoInAA6CQwAOgn8ADoKzAA6C5wAOgx8ADoNXAA6DswAOg9MADoQHAA6EMwAOhI8ADoTLAA6FFwAOhVMADoVrAA6FgwAOhecADoYTAA6GQwAOhpcADobrAA6HLwAOh18ADoeHAA6HvwAOh/sADohPAA6IowAOiPcADolLAA6JwwAOiecADopPAA6KmwAOirsADosDAA6LJwAOi2MADot7AA6YzwAOpeMADqcrAA6n4wAOp+8ADqgjAA6oQwAOqGcADqivAA6o4wAOqRMADqlfAA6pgwAOqbsADqnfAA6qDwAOqj8ADqp3AA6qpwAOquMADqsHAA6rKwAOq18ADqunAA6rxwAOq9cADqv3AA6sNwAOrF8ADqx/AA6s2wAOrR8ADq07AA6tXwAOrYMADq2bAA6txwAOre8ADq5DAA6uwwAOrwMADq9jAA6vjwAOr8MADrAXAA6wgwAOsL8ADrDjAA6xHwAOsVcADrG7AA6yDwAOslcADrK/AA6y/wAOsz8ADrOXAA6z5wAOtCsADrSHAA60vwAOtO8ADrUjAA61UwAOtYcADrW3AA62cwAOtq8ADrb/AA63UwAOt2sADrfPAA64LwAOuJMADrjfAA65EwAOuVsADrmrAA66dwAOuq8ADrrPAA669wAOu3sADrvvAA68OwAOvHMADryXAA69AwAOvSMADr2TAA6+BwAOvnsADr7PAA6/IwAOv7sADr/7AA7ATwAOwIsADsDrAA7BPwAOwaMADsHHAA7CIwAOwpcADsLPAA7C+wAOw0sADsOfAA7D9wAOxGMADsTHAA7FJwAOxasADsX/AA7GKwAOxlMADsZ7AA7GmwAOxsMADsbrAA7HOwAOx38ADsenAA7H2wAOyCcADshbAA7IkwAOyOMADskrAA7JewAOyfcADspXAA7KowAOyuMADss7AA7LawAOy5cADsvXAA7MGwAOzGMADsybAA7M7wAOzRMADs1fAA7NjwAOzb8ADs3zAA7OIwAOzl8ADs6fAA7OuwAOzwsADs8vAA7PhwAOz+sADtAvAA7RMwAO0hMADtJTAA7SYwAO0q8ADtL7AA7TLwAO04cADtPDAA7T3wAO1DsADtRvAA7UmwAO1LcADtTbAA7U/wAO1RsADtVTAA7VywAO1dcADtYDAA7WKwAO1pcADtbDAA7XXwAO158ADtfnAA7YJwAO2EcADtiHAA7YqwAO2LsADtjPAA7Y7wAO2XMADtmnAA7aAwAO2ncADtqjAA7bDwAO22cADtu3AA7b2wAO3B8ADtxzAA7cywAO3TcADt2XAA7dywAO3fcADt4rAA7ehwAO3qcADt7zAA7fKwAO338ADt+PAA7f9wAO4KcADuEPAA7hJwAO4S8ADuFXAA7hawAO4dMADuHzAA7iGwAO4osADuLLAA7jQwAO4+cADuRbAA7ktwAO5O8ADuWDAA7lvwAO5gMADuYzAA7mYwAO5oMADua/AA7m4wAO5wcADudLAA7oVwAO6SMADun7AA7qPwAO6pcADuqvAA7q3wAO6u8ADusnAA7rSwAO62MADuuLAA7rqwAO7D8ADux7AA7snwAO7PMADu0rAA7tUwAO7b8ADu4PAA7uTwAO7r8ADu7zAA7vPwAO71sADu/LAA7wHwAO8GsADvEXAA7xewAO8acADvHTAA7yEwAO8isADvJ3AA7ylwAO8wsADvNTAA7zYwAO89MADvQbAA70OwAO9GMADvSTAA71AwAO9UsADvWbAA714wAO9jsADvabAA729wAO9xsADvdjAA73owAO99cADvgbAA74bwAO+L8ADvjnAA748wAO+Q8ADvk/AA75gwAO+ecADvn3AA76JwAO+nsADvqrAA77HwAO+1MADvuHAA77swAO/CMADvxPAA78VwAO/IsADvyvAA781wAO/RsADv1nAA79mwAO/bsADv5HAA7+gwAO/qsADv8TAA7/ZwAO/+8ADwAvAA8AYwAPAL8ADwEPAA8BXwAPAYMADwGzAA8B+wAPAkcADwJzAA8CxwAPAw8ADwNTAA8DlwAPBF8ADwTzAA8FzwAPBd8ADwZDAA8GewAPBr8ADwcvAA8HkwAPB8sADwgPAA8IawAPCL8ADwk3AA8JZwAPCc8ADwoPAA8KVwAPCt8ADws3AA8LxwAPC98ADwxjAA8MuwAPDPcADw07AA8NvwAPDhcADw5bAA8O+wAPD5sADxAnAA8QPwAPEHMADxCbAA8Q7wAPEXcADxHTAA8SDwAPElsADxKrAA8S7wAPE2MADxN3AA8TnwAPFDcADxRnAA8UqwAPFUsADxWXAA8V4wAPFfMADxYvAA8WcwAPFrcADxbzAA8XJwAPF28ADxeLAA8XowAPF+sADxhfAA8YywAPGUcADxmDAA8aEwAPGl8ADxrDAA8bAwAPG0MADxt/AA8b0wAPHDsADxyHAA8crwAPHN8ADx0TAA8dPwAPHWMADx2LAA8dywAPHecADx4/AA8epwAPHu8ADx8zAA8fdwAPH7sADyAfAA8gawAPIN8ADyFfAA8hwwAPIeMADyIfAA8ilwAPIvMADyM3AA8jcwAPI+MADyQXAA8kOwAPJIMADyS/AA8k6wAPJSMADyVjAA8lfwAPJacADyXTAA8mIwAPJocADyanAA8m6wAPJxsADydHAA8niwAPJ7MADyfHAA8n1wAPJ+8ADygTAA8oWwAPKJ8ADyjfAA8pAwAPKSMADylDAA8pcwAPKasADynbAA8qQwAPKnMADysHAA8rIwAPK1MADyunAA8r2wAPLBcADyxHAA8shwAPLKsADy0rAA8tawAPLeMADy4nAA8uWwAPLo8ADy67AA8u+wAPL08ADy/jAA8wBwAPMDcADzBvAA8wpwAPMP8ADzFrAA8xvwAPMicADzJPAA8yiwAPMsMADzMPAA8zVwAPM68ADzQbAA80hwAPNQcADzWXAA812wAPNn8ADzbXAA83QwAPN28ADzerAA836wAPODsADzinAA84/wAPOT8ADzl/AA85/wAPOl8ADzrbAA87HwAPO68ADzvnAA88FwAPPEsADzyXAA88vwAPPPsADz1fAA891wAPPjMADz6PAA8+pwAPPxcADz9jAA8/jwAPP68ADz/LAA8/9wAPQDcAD0CLAA9ApwAPQQ8AD0FvAA9B4wAPQlcAD0LfAA9DKwAPQ4sAD0PTAA9ELwAPRHcAD0TTAA9FMwAPRW8AD0XjAA9GXwAPRu8AD0dzAA9HwwAPSFsAD0jLAA9I/wAPST8AD0nDAA9KKwAPSmMAD0qfAA9LBwAPS1sAD0vXAA9MTwAPTNsAD00TAA9NXwAPTasAD03vAA9OTwAPTsMAD08jAA9PlwAPUAsAD1CTAA9Q8wAPUWcAD1GvAA9R+wAPUlcAD1KfAA9S0wAPU0MAD1OXAA9T/wAPVI8AD1UzAA9VgwAPVecAD1ZnAA9WuwAPVusAD1djAA9XlwAPV9sAD1gjAA9YYwAPWJsAD1jvAA9ZNwAPWZMAD1n7AA9aQwAPWl8AD1p3AA9awwAPWusAD1svAA9bZwAPW7MAD1wTAA9cWwAPXNcAD10rAA9dewAPXd8AD14fAA9eWwAPXsMAD18DAA9fbwAPX7MAD2AbAA9ggwAPYP8AD2E/AA9hYwAPYa8AD2IvAA9icwAPYvsAD2OXAA9kJwAPZMsAD2UXAA9lKwAPZUMAD2WjAA9l1wAPZh8AD2ZTAA9mmwAPZucAD2dHAA9nrwAPaCsAD2ivAA9o9wAPaUsAD2mXAA9p7wAPaj8AD2qXAA9q1wAPawsAD2tDAA9rfwAPa88AD2wXAA9sTwAPbI8AD2zTAA9tBwAPbTcAD22TAA9t8wAPbi8AD25rAA9uiwAPbusAD28nAA9vlwAPb9cAD3AfAA9wOwAPcGcAD3CnAA9wxwAPcR8AD3FvAA9x1wAPch8AD3JLAA9yfwAPcwsAD3MjAA9zhwAPc7sAD3Q3AA90fwAPdOcAD3VLAA91ZwAPdY8AD3XzAA92IwAPdkcAD3ZvAA92twAPdwMAD3czAA93bwAPd78AD3fnAA94FwAPeGcAD3izAA947wAPeTMAD3ljAA95lwAPebcAD3nrAA96GwAPejsAD3pvAA96mwAPescAD3svAA97TwAPe8sAD3wTAA98RwAPfIMAD3zHAA98+wAPfT8AD31zAA99rwAPffMAD34TAA9+OwAPfl8AD35zAA9+mwAPftsAD38LAA9/PwAPf2MAD3+PAA9/qwAPf+sAD4A/AA+AZwAPgI8AD4C/AA+A6wAPgRsAD4FfAA+BowAPgcMAD4HjAA+CDwAPglMAD4JvAA+CuwAPgw8AD4NPAA+DjwAPg78AD4PvAA+EQwAPhL8AD4ULAA+FQwAPhW8AD4W/AA+F7wAPhjcAD4ZzAA+GmwAPhssAD4cDAA+HOwAPh4MAD4fLAA+H4wAPiBMAD4hjAA+IrwAPiO8AD4lHAA+JkwAPib8AD4oLAA+KRwAPiocAD4rDAA+K8wAPi2MAD4vDAA+MRwAPjFsAD4x3AA+MfwAPjIcAD4y7AA+M4wAPjRcAD41zAA+NnwAPjecAD44nAA+OfwAPjscAD48rAA+PdwAPj9MAD5APAA+QQwAPkIMAD5C7AA+Q9wAPkU8AD5GHAA+RuwAPkhsAD5JHAA+SWwAPkoMAD5KbAA+S3wAPkusAD5LzAA+TWwAPk8MAD5QDAA+UWwAPlJMAD5TDAA+VFwAPlV8AD5W3AA+WCwAPllMAD5afAA+W3wAPlv8AD5cTAA+XNwAPl1cAD5drAA+XgwAPl48AD5efAA+X6wAPmA8AD5hDAA+YnwAPmR8AD5mDAA+Z0wAPmjMAD5p7AA+a0wAPmy8AD5tLAA+brwAPm+MAD5v/AA+cIwAPnFMAD5yfAA+c0wAPnRsAD51DAA+dfwAPndsAD54PAA+eQwAPnmsAD56bAA+e6wAPnxsAD59LAA+fewAPn7sAD5/nAA+gHwAPoFsAD6B/AA+gtwAPoOcAD6EHAA+hMwAPoWsAD6HHAA+iCwAPojcAD6JnAA+ilwAPousAD6M/AA+jewAPo7cAD6QXAA+kdwAPpI8AD6SnAA+k4wAPpR8AD6VDAA+lZwAPpa8AD6X3AA+mSwAPppcAD6cXAA+nVwAPp5MAD6fjAA+oJwAPqFcAD6hrAA+ouwAPqO8AD6kDAA+pIwAPqTMAD6k3AA+pewAPqcsAD6ofAA+qfwAPqtcAD6sjAA+rZwAPq5cAD6vjAA+sLwAPrFcAD6yrAA+s9wAPrVsAD623AA+uEwAPrm8AD66/AA+vEwAPr2cAD6+vAA+v+wAPsDMAD7BfAA+wjwAPsNcAD7EXAA+xOwAPsXcAD7GTAA+xuwAPsfMAD7JDAA+yiwAPsrcAD7LzAA+zPwAPs5cAD7PXAA+z+wAPtDcAD7RLAA+0fwAPtK8AD7T7AA+1UwAPtacAD7X/AA+2NwAPtn8AD7bXAA+3YwAPt38AD7e/AA+4EwAPuGcAD7irAA+46wAPuTcAD7mTAA+51wAPugsAD7pfAA+6vwAPuvsAD7szAA+7pwAPvC8AD7zrAA+9pwAPvesAD74vAA++awAPvqsAD78LAA+/QwAPv2sAD7+3AA/ACwAPwFcAD8B/AA/AxwAPwOsAD8EHAA/BMwAPwVcAD8HHAA/B6wAPwgMAD8JPAA/CgwAPws8AD8MPAA/DMwAPw18AD8OLAA/DswAPw9MAD8P/AA/EUwAPxIcAD8THAA/FEwAPxT8AD8WHAA/F1wAPxisAD8ZrAA/GswAPxtcAD8cPAA/HOwAPx4cAD8fLAA/IIwAPyG8AD8izAA/I+wAPyRcAD8lfAA/JnwAPyhMAD8o/AA/KfwAPyyMAD8s/AA/LewAPy8MAD8v7AA/MGwAPzC8AD8xDAA/MjwAPzMsAD81LAA/NawAPzZ8AD83rAA/OEwAPzjMAD85rAA/OpwAPz5MAD8/7AA/QKwAP0DMAD9A7AA/QQwAP0H8AD9DHAA/Q7wAP0QMAD9EbAA/RUwAP0Z8AD9IfAA/SPwAP0ncAD9LHAA/S7wAP0xcAD9NTAA/ThwAP09cAD9RXAA/UiwAP1OcAD9U3AA/VWwAP1YMAD9WnAA/V3wAP1gcAD9ZDAA/WVwAP1n8AD9arAA/XEwAP10cAD9efAA/XuwAP1/MAD9grAA/YdwAP2JcAD9jTAA/Y/wAP2SMAD9k7AA/ZSwAP2asAD9nfAA/Z9wAP2hMAD9pTAA/auwAP2tsAD9szAA/bhwAP258AD9vDAA/b9wAP3DsAD9xfAA/cfwAP3KsAD9zLAA/dGwAP3VcAD92DAA/dswAP3ecAD94LAA/evwAP3vcAD987AA/fgwAP4DMAD+DTAA/hdwAP4iMAD+KbAA/iqwAP4yMAD+OjAA/kIwAP5NMAD+VzAA/mFwAP5sMAD+b/AA/nMwAP518AD+d/AA/n5wAP6BMAD+hjAA/ofwAP6JsAD+jfAA/pBwAP6RcAD+kzAA/pbwAP6ZMAD+nXAA/qLwAP6m8AD+qXAA/q9wAP61MAD+uLAA/r3wAP7AsAD+wfAA/sXwAP7KMAD+zbAA/tGwAP7T8AD+1vAA/trwAP7fMAD+4rAA/ufwAP7q8AD+7PAA/u9wAP7x8AD+8vAA/vrwAP7/cAD/BHAA/wnwAP8L8AD/EvAA/xYwAP8Y8AD/HbAA/yDwAP8jMAD/KDAA/yxwAP8y8AD/NbAA/zhwAP87sAD/Q/AA/0dwAP9LMAD/TfAA/1HwAP9WsAD/WvAA/12wAP9jcAD/ZzAA/2rwAP9ucAD/drAA/3twAP+AMAD/hDAA/4iwAP+MsAD/kHAA/5VwAP+YMAD/m7AA/53wAP+k8AD/p3AA/6/wAP+1MAD/uPAA/7zwAP/CcAD/xvAA/8uwAP/M8AD/z3AA/9JwAP/aMAD/3XAA/+CwAP/k8AD/63AA//IwAP/0MAD/+TAA//1wAQAC8AEABbABABkwAQAb8AEAKXABACywAQA9sAEAQDABAETwAQBKMAEATfABAFYwAQBZcAEAXbABAGIwAQBkcAEAZ3ABAGvwAQBwsAEAdDABAHYwAQB6MAEAfHABAH+wAQCCcAEAhbABAIhwAQCMcAEAjzABAJIwAQCVsAEAmPABAJvwAQCcMAEAnzABAKIwAQCjMAEApHABAKmwAQCssAEAs7ABALTwAQC6sAEAvzABAMBwAQDEMAEAyXABAMxwAQDQ8AEA1PABANiwAQDc8AEA4TABAOXwAQDnsAEA6/ABAPCwAQD0sAEA9/ABAP1wAQD+cAEBArABAQfwAQEN8AEBEDABARKwAQEa8AEBH/ABASJwAQEosAEBKjABATFwAQE4sAEBOnABAT3wAQFCMAEBQ7ABAUswAQFMcAEBUXABAVrwAQFj8AEBaPABAWxwAQFx8AEBdjABAXjwAQF+MAEBgPABAYbwAQGK8AEBj7ABAZSwAQGbsAEBnTABAaAwAQGgsAEBpPABAapwAQGuMAEBr7ABAbJwAQGzsAEBt7ABAbuwAQG9cAEBwXABAcYwAQHK8AEBzvABAdEwAQHTcAEB1bABAdwwAQHd8AEB4XABAeIwAQHqMAEB7DABAe5wAQHz8AEB9jABAfbwAQH48AEB//ABAgQwAQIJsAECEnABAhbwAQIbcAECHnABAiGwAQInMAECK3ABAi4wAQI0sAECN7ABAjlwAQI+MAECP7ABAkJwAQJHcAECSfABAk2wAQJSsAECVzABAlmwAQJbMAECXzABAmHwAQJmsAECazABAm1wAQJz8AECdHABAnWwAQJ7cAECfrABAoEwAQKEMAECinABAo0wAQKS8AEClzABAptwAQKdsAECn7ABAqWwAQKrsAECsTABArVwAQK5sAECvjABAsAwAQLB8AECxfABAsuwAQLOcAECz/ABAtXwAQLZ8AEC3fABAuMwAQLmsAEC6nABAu8wAQLzMAEC9vABAvrwAQL/cAEDAzABAwZwAQMOsAEDErABAxRwAQMYsAEDHbABAx+wAQMjcAEDJvABAytwAQMtMAEDMPABAzPwAQM4sAEDPLABA0BwAQNDMAEDRfABA0kwAQNMcAEDTrABA1CwAQNTsAEDVfABA1mwAQNeMAEDYHABA2QwAQNosAEDbHABA2/wAQNysAEDdjABA3kwAQOA8AEDhbABA4q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wAQ6f8AEOorABDqiwAQ6scAEOsbABDrgwAQ69sAEOxHABDsgwAQ7NcAEO0/ABDtlwAQ7gMAEO5LABDu1wAQ7ycAEO9nABDvqwAQ7/MAEPATABDwNwAQ8GMAEPC3ABDw8wAQ8TsAEPFzABDxswAQ8gMAEPJDABDyewAQ8t8AEPM7ABDzowAQ9CMAEPRrABD0nwAQ9M8AEPUDABD1KwAQ9V8AEPWLABD1twAQ9icAEPafABD3AwAQ918AEPefABD3+wAQ+EcAEPiLABD44wAQ+UMAEPmLABD5vwAQ+fMAEPpzABD62wAQ+zcAEPt/ABD7rwAQ+/MAEPwzABD8gwAQ/NMAEP0XABD9cwAQ/eMAEP5PABD+owAQ/uMAEP87ABD/jwAQ/+sAEQBDABEAmwARAO8AEQFDABEBnwARAccAEQHzABECIwARAn8AEQLrABEDQwARA4sAEQPXABEEIwARBE8AEQSXABEEywARBT8AEQWzABEF+wARBj8AEQaTABEGywARB1sAEQfbABEIWwARCL8AEQkLABEJXwARCZ8AEQnnABEKLwARCncAEQrPABELDwARC2sAEQvDABEMRwARDIMAEQyzABEM5wARDRMAEQ1TABENgwARDecAEQ5PABEOrwARDwMAEQ9HABEPiwARD8sAERAjABEQnwAREOMAEREbABERcwAREccAERIfABESmwAREy8AERNPABETfwARE78AERP3ABEUHwARFFMAERR7ABEUrwARFOMAERUnABEVkwARFgMAERZ7ABEWvwARFyMAEReTABEX/wARGHcAERi3ABEZFwARGYMAERnDABEaIwARGo8AERrbABEbRwARG78AERwjABEcZwARHKcAER0PABEdQwARHX8AER3PABEeCwARHkcAER6LABEeywARHxsAER93ABEf7wARIF8AESCjABEg6wARIS8AESFrABEhywARIicAESKjABEjCwARI08AESN3ABEjswARJAsAESQ/ABEkfwARJMsAEST7ABElIwARJUsAESV/ABElzwARJh8AESZ7ABEmrwARJtMAESdHABEnjwARJ58AESe/ABEn9wARKEsAESiPABEozwARKR8AESlbABEphwARKccAESoDABEqYwARKvsAESuTABEr2wARLBsAESxzABEs3wARLTsAES2rABEt6wARLkMAES6vABEvCwARL3sAES/HABEwJwARMJMAETEXABExYwARMZsAETHPABEyBwARMjMAETJrABEymwARMssAETM/ABEzuwARNCMAETSDABE0xwARNScAETV3ABE1vwARNhsAETZ/ABE2ywARNwMAETc7ABE3pwAROAcAEThPABE4ewAROLMAETj3ABE5RwAROXsAETnDABE6BwAROjsAETqDABE6xwAROxsAETtvABE7twARPAsAETxrABE8ywARPT8AET2vABE+BwARPmcAET6TABE+wwARPvcAET9XABE/xwARQCMAEUC/ABFA4wARQRcAEUFbABFBlwARQcMAEUHvABFCJwARQl8AEUKXABFC3wARQ08AEUPDABFEPwARRKcAEUTvABFFVwARRcMAEUYXABFGdwARRq8AEUbnABFHPwARR4cAEUfTABFH+wARSBsAEUhPABFIiwARSMsAEUlbABFJowARSbsAEUnnABFKNwARSl8AEUp7ABFKpwARSvMAEUszABFLiwARS9cAEUwHABFMLwARTJMAEUzHABFNJwARTUcAEU1fABFNjwARTbcAEU3rABFOSwARTp8AEU7/ABFPOwART2cAEU+XABFPywARUCcAEVBnABFQmwARUNsAEVEnABFRawARUYcAEVHLABFSAwARUlcAEVK3ABFTLwARU4cAEVPrABFUFwARVDcAEVRTABFUcwARVIcAEVSnABFUvwARVNcAEVUrABFVhwARVc8AEVYPABFWOwARVoMAEVa7ABFW6wARVy8AEVd7ABFXrwARV88AEVfvABFYZwARWLcAEVjPABFY4wARWSMAEVk/ABFZgwARWccAEVnnABFaDwARWlsAEVqbABFatwARWucAEVsbABFbLwARW08AEVt7ABFbwwARXCsAEVxXABFcmwARXNsAEV0jABFdPwARXVsAEV1zABFdiwARXc8AEV4jABFeYwARXq8AEV67ABFezwARXwsAEV8zABFfUwARX3MAEV+fABFf0wARYCsAEWB/ABFgvwARYQcAEWFTABFhrwARYesAEWI7ABFilwARYz8AEWNrABFjnwARY6sAEWPvABFkEwARZFsAEWRnABFkcwARZIsAEWSfABFkswARZNMAEWTvABFlKwARZXMAEWW3ABFmBwARZh8AEWZXABFmmwARZrMAEWbrABFnLwARZ1MAEWeXABFn5wARaAsAEWhfABFovwARaOMAEWkHABFpXwARaYMAEWmrABFqGwARamsAEWqrABFq3wARawsAEWtbABFrnwARa9MAEWwvABFsdwARbL8AEW0vABFtbwARbZsAEW3TABFuNwARbocAEW7DABFvIwARb3MAEW+jABFv4wARcA8AEXBbABFwiwARcPMAEXFfABFxhwARcc8AEXIPABFyUwARcrMAEXL/ABFzZwARc78AEXQPABF0awARdMMAEXUrABF1nwARdjMAEXaDABF26wARdysAEXeHABF3wwARd/cAEXgrABF4iwAReM8AEXk7ABF5owARedsAEXoPABF6ZwAReo8AEXq/ABF63wARewMAEXszABF7PwARe4MAEXuvABF76wARfCcAEXxPABF8gwARfMMAEXzvABF9HwARfWsAEX2jABF+DwARfjcAEX5TABF+YwARfqMAEX7vABF/JwARf3sAEX+zABF/7wARgC8AEYCvABGA3wARgVcAEYGvABGCbwARgsMAEYMjABGD5wARhEMAEYSzABGFMwARhV8AEYWLABGFswARhgsAEYY/ABGGdwARhvcAEYePABGH+wARiGMAEYjPABGJLwARiWsAEYnnABGKSwARissAEYsbABGLcwARi78AEYwnABGMiwARjQMAEY1vABGNywARjh8AEY6DABGO1wARjzcAEY9PABGPYwARj4sAEY/fABGQGwARkFsAEZCrABGRHwARkW8AEZHHABGSFwARkocAEZLPABGTewARlFcAEZSzABGVEwARlXsAEZW3ABGWBwARlicAEZZLABGWkwARlq8AEZbTABGXFwARl0MAEZd/ABGX1wARmBsAEZhDABGYcwARmKMAEZkLABGZZwARmYcAEZmnABGZywARmgsAEZo3ABGaUwARmm8AEZrXABGbHwARmy8AEZtXABGbXwARm28AEZuLABGbvwARm+sAEZwDABGcLwARnE8AEZx/ABGcowARnO8AEZz/ABGdKwARnVsAEZ3jABGeFwARnlsAEZ6LABGezwARnw8AEZ9HABGfgwARn8MAEZ/zABGgFwARoCcAEaA7ABGgWwARoHsAEaCjABGgywARoOcAEaEDABGhJwARoVcAEaGXABGhuwARofMAEaIrABGiawARopcAEaLHABGi+wARozMAEaNzABGj1wARpBMAEaRzABGkqwARpM8AEaUDABGlTwARpY8AEaXHABGl9wARpkcAEaaDABGmvwARpv8AEadHABGncwARp6MAEafbABGoQwARqG8AEaifABGo0wARqQ8AEalLABGpfwARqbMAEan3ABGqJwARqlsAEaqTABGq0wARqwsAEatDABGrhwARq88AEawzABGsowARrQsAEa1/ABGtywARrh8AEa6bABGu1wARr0sAEa+DABGvswARsE8AEbC7ABGxAwARsVcAEbGPABGx1wARsgcAEbIrABGyXwARso8AEbLHABGy/wARs1MAEbOHABGzowARs98AEbQjABG0RwARtH8AEbTXABG1IwARtYcAEbXbABG2KwARtlsAEbZ3ABG2kwARtrMAEbc3ABG3ZwARt48AEbfHABG4AwARuC8AEbhbABG4fwARuNMAEbkjABG5gwARuf8AEboTABG6YwARur8AEbrzABG7LwARu2MAEbufABG7wwARvBMAEbw7ABG8VwARvIMAEbyfABG8twARvOcAEb0bABG9XwARvYMAEb3HABG92wARvhcAEb5PABG+lwARvtsAEb8XABG/VwARv28AEb+3ABG/2wARwA8AEcA/ABHAZwARwJMAEcDPABHBEwARwTcAEcFjABHBgwARwhMAEcJHABHCiwARwrMAEcMDABHDWwARw5MAEcO/ABHEGwARxEsAEcR7ABHEswARxM8AEcUbABHFTwARxXMAEcWrABHF8wARxiMAEcZXABHGgwARxqcAEcbjABHHFwARx0cAEcd/ABHHowARx7sAEcffABHIFwARyFcAEciHABHIrwARyOMAEcknABHJcwARyasAEcnPABHJ3wARyfMAEcoTABHKLwARylcAEcpjABHKfwARysMAEcr7ABHLKwARy1MAEcurABHL+wARzB8AEcyrABHNawARzZMAEc5/ABHOvwARzuMAEc8jABHPRwARz2MAEc+PABHPswARz88AEc/7ABHQLwAR0FcAEdCPABHQ0wAR0R8AEdFXABHRlwAR0eMAEdIrABHSbwAR0qcAEdLzABHTJwAR00cAEdNrABHTiwAR06MAEdPXABHUBwAR1CMAEdRHABHUcwAR1JcAEdTLABHVEwAR1U8AEdV7ABHVswAR1fsAEdYfABHWRwAR1m8AEdavABHW8wAR10cAEddbABHXowAR1+8AEdg3ABHYVwAR2J8AEdjbABHZDwAR2TMAEdl/ABHZywAR2h8AEdpjABHaawAR2qcAEdrjABHbFwAR20MAEdtvABHb0wAR2+8AEdyfABHc4wAR3U8AEd2TABHdwwAR3gMAEd5jABHegwAR3q8AEd8PABHfewAR39sAEeAnABHgdwAR4KMAEeDTABHhBwAR4TsAEeFrABHhpwAR4c8AEeIPABHiRwAR4osAEeLTABHjMwAR43MAEePfABHkFwAR5FcAEeSLABHkywAR5QsAEeVDABHlWwAR5acAEeX3ABHmWwAR5psAEebjABHnRwAR538AEefLABHn4wAR6CsAEehrABHo2wAR6UMAEel/ABHptwAR6hsAEepzABHqxwAR6w8AEetfABHrowAR6/cAEexPABHsfwAR7M8AEe0PABHtiwAR7ccAEe4LABHuKwAR7m8AEe7LABHu5wAR7xsAEe8/ABHvfwAR7/8AEfAfABHwVwAR8Q8AEfE/ABHxowAR8d8AEfJDABHygwAR8tMAEfMHABHzUwAR87MAEfQfABH0iwAR9M8AEfUXABH1iwAR9eMAEfYTABH2IwAR9jcAEfZLABH2jwAR9tcAEfcDABH3LwAR918AEfeTABH3wwAR+BsAEfhPABH4twAR+OsAEfkPABH5ewAR+a8AEfn7ABH6JwAR+mcAEfqbABH6wwAR+usAEfsnABH7WwAR+4sAEfu7ABH73wAR/C8AEfxrABH8twAR/QcAEf07ABH9jwAR/dcAEf4jABH+dwAR/scAEf8bABH/SwAR/48AEf+7ABH/5wASABcAEgBXABIAnwASAM8AEgDrABIBHwASAVMAEgGXABIB3wASAh8AEgJvABICnwASAuMAEgMbABIDYwASA38AEgPDABID9wASBBsAEgQ7ABIEWwASBJ8AEgT7ABIFNwASBVcAEgWPABIFrwASBecAEgYLABIGRwASBmcAEgafABIG4wASBw8AEgc7ABIHtwASB+MAEggzABIIZwASCJ8AEgjjABIJPwASCYcAEgm/ABIKAwASCjsAEgpvABIKqwASCtsAEgsvABILTwASC6MAEgwDABIMSwASDIMAEgy7ABIM/wASDUMAEg2TABIN0wASDiMAEg5nABIOowASDwcAEg+3ABIP1wASD+8AEg//ABIQRwASEKcAEhEHABIRPwASEY8AEhH3ABISwwASE4MAEhQrABIUywASFXsAEhZDABIWnwASFwMAEhdHABIXfwASF5MAEhfLABIYUwASGKcAEhi/ABIZSwASGV8AEhnLABIaNwASGnsAEhrbABIbPwASG4sAEhvvABIcNwASHH8AEhy3ABIdBwASHVcAEh2DABIdswASHeMAEh4TABIeNwASHlcAEh6DABIerwASHu8AEh8bABIfOwASH18AEh+TABIftwASH+8AEiAnABIgawASIIsAEiC/ABIg3wASIRMAEiE/ABIhYwASIbcAEiH3ABIiRwASIqMAEiLrABIjLwASI4cAEiPHABIkIwASJFcAEiR/ABIkqwASJQMAEiVHABIlhwASJdsAEiYXABImOwASJmMAEiavABInHwASJz8AEidzABIntwASJ+cAEigzABIoZwASKJ8AEijHABIo7wASKQsAEik3ABIpUwASKXcAEinLABIqGwASKnMAEirHABIrGwASK2MAEiufABIr2wASLBcAEixfABIsnwASLN8AEi0nABItSwASLZsAEi3HABIt9wASLhcAEi5PABIukwASLt8AEi8nABIvZwASL78AEjALABIwTwASMJsAEjDnABIxGwASMVMAEjGDABIxqwASMdcAEjH/ABIyRwASMpcAEjK3ABIy0wASMy8AEjNXABIzhwASM7MAEjPPABIz6wASNAcAEjQ3ABI0bwASNIMAEjSXABI0twASNNMAEjUDABI1MwASNW8AEjWnABI1zwASNhsAEjZfABI2iwASNscAEjcLABI3SwASN3cAEje3ABI33wASOCsAEjhzABI4jwASOL8AEjkfABI5QwASOWcAEjmLABI51wASOh8AEjo/ABI6fwASOt8AEjtDABI7pwASPBcAEjyHABI88wASPV8AEj23ABI9+wASPkMAEj6DABI+wwASPysAEj9vABI/nwASP/sAEkBrABJBAwASQScAEkFrABJBtwASQkcAEkKfABJCwwASQt8AEkLzABJDCwASQy8AEkNPABJDlwASRDsAEkSDABJErwASROMAEkUjABJFWwASRWsAEkWXABJFywASRgsAEkYbABJGbwASRoMAEkabABJGrwASRscAEkcnABJHVwASR58AEkfnABJH9wASSBsAEkhDABJIYwASSScAEkkvABJJXwASSi8AEkpLABJKwwASSzMAEkt/ABJLmwASS/sAEkw/ABJMhwASTNcAEk0vABJNRwASTZsAEk2/ABJONwASTlcAEk6rABJOxwASTvsAEk8vABJPTwAST5cAEk/LABJQBwASUEcAElC3ABJQ1wASUQsAElErABJRVwASUXMAElGPABJRqwASUdcAElH/ABJSJwASUm8AElKbABJSuwASUtsAElNLABJTqwASU/cAElQ/ABJUWwASVI8AElS7ABJU/wASVT8AElWDABJVswASVdcAElaHABJWswASVssAElb/ABJXOwASV1MAEld7ABJXjwASV68AElfLABJX1wASWAcAElg3ABJYXwASWI8AEljHABJZHwASWXMAElnrABJaCwASWj8AElprABJajwASWt8AEltXABJbiwASW88AElwHABJcWwASXJ8AElzLABJc5wASXScAEl2nABJeHwASXpMAEl7TABJfFwASX3MAEl+nABJf5wASYEMAEmCnABJg4wASYTMAEmFjABJhlwASYc8AEmILABJiPwASYncAEmK3ABJjiwASZHcAEmSrABJk0wASZSsAEmV3ABJl1wASZfMAEmY7ABJmWwASZucAEmdzABJnhwASZ8cAEmhLABJomwASaTMAEmoLABJqkwASaqsAEmtzABJr/wASbGcAEmzjABJtMwASbZcAEm3zABJuJwASblsAEm6HABJuwwASbv8AEm8vABJvYwASb58AEm/jABJwHwAScIMAEnDfABJxOwAScWMAEnHDABJx6wAScisAEnJPABJyfwAScqsAEnLXABJzIwASc0cAEnNnABJzhwASc6sAEnPHABJz5wASdA8AEnQ7ABJ0mwASdMMAEnTrABJ1IwASdVsAEnWbABJ1+wASdkMAEnaLABJ2zwASdwMAEncrABJ3XwASd4sAEnezABJ30wASd/sAEngXABJ4MwASeF8AEnibABJ42wASeP8AEnk3ABJ5cwASeZcAEnm/ABJ6AwASeh8AEnpXABJ6dwASen8AEnrPABJ7JwASe1MAEnt3ABJ74wASe/8AEnwjABJ8UwASfHcAEnzHABJ9HwASfUMAEn13ABJ9nwASfc8AEn33ABJ+DwASfiMAEn6fABJ+4wASfyMAEn9/ABJ/3wASgCcAEoBnABKAjwASgNsAEoD7ABKBMwASgasAEoIjABKCowASgssAEoMLABKDUwASg58AEoPbABKEEwAShFMAEoSPABKEwwAShMsAEoVPABKFcwAShZsAEoW7ABKF9wAShiMAEoZPABKG6wAShxMAEodbABKHmwASh98AEognABKIZwASiI8AEojPABKI5wASiQMAEokrABKJbwASiZ8AEon/ABKKNwASim8AEorLABKLFwASi3MAEovHABKMNwASjMsAEo0nABKNcwASjbMAEo3nABKOPwASjm8AEo7PABKPLwASj7cAEpALABKQZwASkMMAEpFHABKRiwASkg8AEpJ3ABKSuwASkw8AEpOvABKT7wASlEsAEpSbABKVBwASlUMAEpWTABKWMwASln8AEpbHABKW+wASlxcAEpc7ABKXhwASl8MAEpgnABKYowASmNcAEpkbABKZUwASmY8AEpnTABKZ/wASmncAEprPABKa5wASm0sAEpt7ABKbvwASm/MAEpxTABKcjwASnOMAEp1LABKdswASnosAEp7/ABKf2wASoBsAEqDnABKhPwASofMAEqIvABKibwASorcAEqL/ABKjRwASo3sAEqPfABKkBwASpCMAEqRjABKkuwASpPcAEqVTABKlewASpa8AEqXTABKmFwASpksAEqZ/ABKmrwASpt8AEqcbABKnSwASp58AEqfzABKoQwASqJ8AEqj3ABKpLwASqWMAEqmzABKqBwASqn8AEqqvABKq2wASqv8AEqtvABKrrwASq+sAEqwfABKsXwASrLMAEqzzABKtBwASrTsAEq2jABKt0wASrhMAEq4zABKudwASrrsAEq8rABKvYwASr4cAEq/DABKwIwASsGcAErDDABKxBwASsTMAErGHABKxywASsg8AErJ3ABKyzwASs08AErOTABKzuwASs/MAErRTABK0qwAStQMAErVDABK1dwAStdcAErYnABK2ZwAStqsAErbzABK3QwASt6cAErgrABK4YwASuKcAErkvABK5iwASukMAErqDABK6xwASuuMAErsvABK7NwASu08AEruHABK7/wASvC8AEryDABK82wASvR8AEr13ABK+GwASvsMAEr7zABK/IwASv3MAEr/bABLAPwASwMMAEsEXABLBXwASwbMAEsIPABLCRwASwn8AEsKzABLC/wASw08AEsOrABLEDwASxFMAEsSjABLEywASxQ8AEsVbABLFrwASxfMAEsY7ABLGgwASxqMAEsbHABLG9wASxxsAEsc7ABLHbwASx6MAEsfDABLH4wASyA8AEsg7ABLIdwASyLMAEsjrABLJIwASyYcAEsnDABLKFwASyj8AEsrHABLK+wASy1cAEsuvABLL4wASzBsAEsxXABLMnwASzNMAEs0LABLNIwASzTcAEs1vABLNrwASzdcAEs3vABLOEwASzisAEs43ABLOVwASzmsAEs6XABLO2wASzv8AEs8zABLPawASz6sAEs/rABLQMwAS0FcAEtCXABLQ3wAS0PMAEtELABLRPwAS0YMAEtHTABLSHwAS0jcAEtKTABLSywAS01cAEtPrABLUIwAS1F8AEtSzABLVOwAS1bsAEtXjABLWcwAS1tMAEtb7ABLXJwAS10cAEtdnABLXhwAS17MAEtffABLYBwAS2DMAEthzABLYnwAS2NcAEtkDABLZJwAS2VcAEtmLABLZvwAS2f8AEto3ABLaWwAS2osAEtrPABLbAwAS2ysAEttrABLbqwAS2/MAEtxTABLcswAS3RMAEt1XABLdlwAS3f8AEt5fABLeewAS3s8AEt8HABLfQwAS32cAEt+fABLf3wAS4BMAEuBHABLggwAS4L8AEuDzABLhHwAS4XsAEuHHABLh5wAS4jcAEuKHABLipwAS4t8AEuMXABLjUwAS438AEuO/ABLkAwAS5DsAEuRvABLkvwAS5RMAEuVfABLlqwAS5fcAEuYvABLmVwAS5qcAEucLABLnZwAS55MAEufDABLoCwAS6E8AEuiDABLo4wAS6RcAEulLABLpfwAS6ccAEunbABLqFwAS6lMAEuqrABLqwwAS6w8AEus/ABLrfwAS688AEuv7ABLsEwAS7E8AEuyTABLs0wAS7TcAEu17ABLtqwAS7cMAEu4PABLuOwAS7lsAEu6vABLu6wAS7xMAEu83ABLvgwAS77sAEvAbABLwXwAS8KMAEvEHABLxQwAS8X8AEvHXABLyFwAS8kcAEvJ3ABLyywAS8x8AEvNDABLzewAS87cAEvPTABLz9wAS9B8AEvQ7ABL0awAS9L8AEvUDABL1QwAS9W8AEvW3ABL2EwAS9lMAEvarABL26wAS9ysAEvdnABL3jwAS97MAEvfzABL4EwAS+EcAEviTABL40wAS+RMAEvkrABL5bwAS+YcAEvnzABL6KwAS+kMAEvpvABL6lwAS+sMAEvr3ABL7DwAS+x8AEvtDABL7gwAS+5sAEvvDABL75wAS+/8AEvwTABL8KwAS/EsAEvx7ABL8nwAS/M8AEv0HABL9UwAS/XMAEv2bABL94wAS/gsAEv4jABL+LwAS/lMAEv6rABL+zwAS/v8AEv9TABL/fwAS/5sAEv/LABMAHwATADcAEwBnABMAiwATALcAEwD7ABMBSwATAXcAEwGPABMBpwATAc8AEwHjABMCKwATAlsAEwJ/ABMCmwATAuMAEwMvABMDgwATA9sAEwQrABMEWwATBJcAEwTbABMFHwATBWsAEwWnABMF5wATBicAEwZjABMGowATBtMAEwcXABMHVwATB68AEwfjABMILwATCGsAEwi/ABMJBwATCWcAEwmzABMKCwATCkMAEwpvABMKywATCxsAEwuDABML7wATDFsAEwzbABMNTwATDaMAEw3rABMONwATDmcAEw7HABMPJwATD2cAEw+rABMQCwATEGMAExCrABMRHwATEWcAExGvABMR6wATEgsAExIjABMSRwATEmsAExKDABMSuwATEwMAExMjABMTUwATE3MAExOnABMT2wATFBcAExRLABMUbwATFJsAExTDABMU4wATFRMAExU/ABMVZwATFZMAExW/ABMV5wATFh8AExZDABMWYwATFoMAExbrABMXIwATF0sAExePABMXxwATGAcAExhLABMYiwATGMMAExj3ABMZMwATGWsAExm/ABMZ8wATGh8AExpXABMabwATGpcAExsDABMbJwATG1sAExunABMbrwATG+MAExv/ABMcMwATHFMAExyTABMc2wATHPsAEx0zABMdSwATHW8AEx2XABMdywATHfcAEx4nABMeQwATHmsAEx63ABMe7wATHv8AEx8nABMfOwATH3sAEx+TABMfwwATH/MAEyAbABMgXwATIKsAEyDXABMhBwATITsAEyGDABMhqwATIdcAEyIHABMiIwATIk8AEyKTABMiswATItMAEyL7ABMjKwATI0cAEyN7ABMjvwATI/8AEyQnABMkWwATJJMAEyS/ABMk8wATJUcAEyV7ABMlwwATJicAEyZDABMmjwATJscAEycXABMnlwATJ+MAEyhfABMorwATKNMAEylTABMpowATKcsAEypLABMqcwATKqcAEyrfABMrGwATK0sAEytjABMrmwATK/MAEyxXABMspwATLPsAEy0rABMtTwATLZsAEy3rABMuDwATLlcAEy6DABMuxwATLt8AEy8DABMvRwATL28AEy+bABMv2wATL/8AEzAXABMwMwATMEMAEzBbABMwewATMI8AEzCnABMwwwATMOMAEzELABMxSwATMXsAEzGfABMxwwATMeMAEzIPABMyPwATMm8AEzKjABMy3wATMvsAEzMfABMzZwATM58AEzOnABMz2wATNB8AEzQvABM0SwATNG8AEzSTABM01wATNP8AEzUbABM1TwATNY8AEzW/ABM15wATNhMAEzYrABM2RwATNmMAEzaTABM2rwATNr8AEzbbABM27wATNwMAEzcTABM3JwATN0MAEzdbABM3twATN88AEzfzABM4FwATOCcAEzhPABM4cwATOJMAEzizABM48wATOP8AEzk/ABM5YwATOYcAEzmzABM6AwATOjcAEzpjABM6hwATOqsAEzrDABM61wATOusAEzsDABM7HwATOzcAEztHABM7cwATO4sAEzvHABM7/wATPCcAEzw7ABM8SwATPKcAEzy/ABM80wATPR8AEz0/ABM9awATPZMAEz2zABM9wwATPe8AEz5PABM+cwATPrsAEz7bABM/DwATPyMAEz9LABM/ZwATP6cAEz/nABM//wATQBcAE0AvABNAUwATQG8AE0DrABNBBwATQTcAE0F/ABNBuwATQjsAE0KzABNC/wATQ3sAE0OnABND1wATRAcAE0RnABNEmwATRMsAE0T7ABNFEwATRWsAE0WjABNF0wATRg8AE0ZjABNGbwATRpMAE0bLABNHAwATRzsAE0dvABNHhwATR68AE0fPABNH+wATSG8AE0iTABNIuwATSPcAE0kzABNJQwATSYcAE0mvABNJ2wATShcAE0o/ABNKZwATSosAE0qvABNLBwATS08AE0ujABNLzwATS/sAE0wnABNMewATTJcAE0zTABNNBwATTUMAE02PABNN2wATTj8AE06LABNO1wATT0cAE0+DABNPwwATT+sAE1APABNQNwATUE8AE1BzABNQjwATULcAE1DXABNRFwATUUsAE1F/ABNRpwATUcsAE1ILABNSLwATUn8AE1KjABNS0wATUvsAE1M/ABNTkwATU+sAE1RbABNUrwATVOMAE1UPABNVPwATVXsAE1W/ABNWAwATVncAE1avABNXBwATV2cAE1fLABNX6wATWGMAE1iXABNZCwATWWsAE1mTABNZ5wATWg8AE1ovABNaWwATWqsAE1rTABNa+wATW0cAE1trABNbjwATW+cAE1w3ABNcawATXMcAE10HABNdWwATXYcAE127ABNeEwATXmsAE17nABNfYwATX4MAE1+jABNf7wATYA8AE2BzABNgwwATYPMAE2EPABNhGwATYT8AE2FjABNhgwATYdcAE2H7ABNiHwATYkMAE2J7ABNirwATYusAE2MnABNjSwATY3MAE2PDABNkGwATZD8AE2RvABNklwATZLsAE2TnABNlJwATZTsAE2VrABNlgwATZZsAE2WrABNlxwATZeMAE2YvABNmQwATZnMAE2avABNm4wATZysAE2djABNnwwATZ/MAE2hjABNojwATaO8AE2kjABNpTwATaWMAE2mfABNp2wATajMAE2p3ABNqvwATaycAE2t3ABNrtwATbBsAE2w/ABNsgwATbLMAE2zjABNtGwATbUsAE21zABNtywATbgMAE25PABNu0wATbwMAE29/ABNvvwATb/8AE3BDABNwnwATcPsAE3FDABNxkwATceMAE3IvABNyiwATctMAE3MXABNzWwATc7cAE3PvABN0PwATdJsAE3T3ABN1ZwATda8AE3X7ABN2LwATdmsAE3anABN26wATdxsAE3eXABN4DwATeIcAE3irABN5GwATeVcAE3mfABN55wATei8AE3p/ABN6owATewcAE3s/ABN7YwATe7MAE3vXABN8PwATfHcAE3znABN9KwATfW8AE32XABN9twATffMAE34fABN+MwATfocAE37rABN/OwATf1MAE39XABN/swATf/sAE4BPABOAlwATgO8AE4EbABOBVwATgcsAE4JLABOCywATgy8AE4OXABOD9wAThGsAE4TjABOFQwAThbMAE4YPABOGbwAThs8AE4dTABOHgwATh9sAE4gvABOIWwATiN8AE4lbABOJqwATihMAE4pPABOKiwATirsAE4snABOLhwATi9cAE4vvABOMTwATjG8AE4yzABOM4wATjRsAE41TABONywATjkcAE46HABOOxwATj0MAE4/DABOQHwATkHsAE5DXABOQ8wATkUMAE5GzABOR9wATkiMAE5J3ABOSuwATktcAE5MbABOTfwATk+cAE5P7ABOUSwATlJMAE5SrABOU5wATlRsAE5UzABOVTwATlX8AE5XLABOWIwATlmcAE5aLABOWuwATlxMAE5dnABOX3wATl/8AE5iLABOYrwATmUMAE5lvABOZ3wATmfMAE5o3ABOadwATms8AE5svABObbwATm6cAE5vnABOcJwATnG8AE5yXABOcuwATnSMAE51rABOd0wATnjsAE55vABOeqwATn0cAE59vABOfywAToAcAE6BPABOgowAToPsAE6EvABOhSwAToY8AE6HfABOiNwATonsAE6LPABOjdwATo8MAE6QXABOklwATpOcAE6U/ABOmBwATppcAE6bbABOnBwATp1cAE6djABOngwATp6cAE6ffABOoNwATqKcAE6jTABOpVwATqYsAE6oDABOqXwATqpcAE6rLABOq6wATqzMAE6t7ABOr1wATrC8AE6yHABOs6wATrVsAE63LABOuSwATrm8AE663ABOvAwATr5sAE7APABOwLwATsE8AE7B/ABOwqwATsM8AE7EDABOxSwATsXsAE7GnABOxywATsf8AE7IjABOygwATsrsAE7L3ABOzGwATs1MAE7ODABOz2wATtDcAE7RvABO0owATtN8AE7UfABO1UwATtZcAE7XLABO2AwATtj8AE7ZnABO2pwATtucAE7b7ABO3PwATt1cAE7dbABO3pwATt88AE7hDABO4mwATuP8AE7lzABO53wATuo8AE7sXABO7nwATvCcAE7ybABO9GwATvZcAE74HABO+hwATvu8AE7+bABPABwATwG8AE8DXABPBQwATwbcAE8JvABPC/wATw3MAE8PfABPETwATxOMAE8WPABPGJwATxpsAE8crABPHQwATx1MAE8enABPH0wATx/8AE8gjABPINwATyFsAE8irABPIuwATyMcAE8kjABPJVwATyWcAE8l7ABPJswATygMAE8o/ABPKcwATyqMAE8r3ABPLEwATy68AE8xzABPM5wATzQ8AE807ABPNpwATzdMAE84rABPOTwATznsAE87PABPO7wATzxcAE893ABPPowATz9cAE9A3ABPQYwAT0JcAE9DvABPREwAT0SsAE9GDABPRqwAT0c8AE9HzABPR+wAT0k8AE9JvABPSkwAT0ucAE9MHABPTKwAT01MAE9NbABPTlwAT1AsAE9RLABPUjwAT1MMAE9T7ABPVKwAT1XcAE9XDABPWGwAT1q8AE9b7ABPXRwAT13cAE9e7ABPX2wAT2DMAE9hXABPYfwAT2PMAE9kzABPZlwAT2fcAE9ojABPaUwAT2qsAE9snABPbTwAT258AE9u7ABPb3wAT3BsAE9xDABPcdwAT3LcAE9zXABPdMwAT3WsAE92fABPd3wAT3lsAE96jABPe+wAT3zsAE9+jABPf5wAT4EcAE+B/ABPg0wAT4TcAE+GvABPiIwAT4nsAE+LTABPjJwAT438AE+PXABPkMwAT5IsAE+TjABPlOwAT5ZMAE+XvABPmQwAT5pcAE+bzABPnTwAT56cAE+gPABPobwAT6RcAE+lbABPpiwAT6ZsAE+m3ABPp2wAT6gMAE+ozABPqUwAT6ocAE+qrABPqvwAT6vMAE+srABPrvwAT7CsAE+xjABPsnwAT7PsAE+1PABPtdwAT7ZsAE+3LABPuQwAT7ocAE+7nABPvWwAT73cAE++XABPv7wAT8AcAE/AjABPwWwAT8H8AE/CnABPwxwAT8OsAE/FXABPxkwAT8dcAE/IrABPygwAT8qsAE/LXABPzFwAT85sAE/P/ABP0kwAT9PMAE/VbABP1kwAT9dcAE/YnABP2gwAT9s8AE/dfABP3uwAT+B8AE/i7ABP5IwAT+ZMAE/nzABP6FwAT+kMAE/qDABP6rwAT+ysAE/ubABP78wAT/FcAE/xjABP8nwAT/NsAE/0jABP9MwAT/UsAE/13ABP9nwAT/bsAE/3HABP90wAT/ecAE/5TABP+kwAT/vsAE/9vABP/uwAT//cAFAA7ABQAawAUAKMAFAC/ABQA7wAUAQcAFAFbABQBiwAUAdsAFAH3ABQCDwAUAicAFAKDABQC1wAUAv8AFAMjABQDawAUA7MAFAPjABQEgwAUBJ8AFAUXABQFXwAUBYcAFAZ/ABQGvwAUBucAFAcHABQHNwAUB6sAFAfjABQIGwAUCFMAFAhnABQIkwAUCNcAFAkbABQJZwAUCbMAFAnvABQKLwAUCmsAFArDABQK9wAUCxMAFAtHABQLdwAUC8cAFAwrABQMowAUDLcAFAzLABQM4wAUDTMAFA1LABQNcwAUDZsAFA3jABQOQwAUDp8AFA8DABQPPwAUD3sAFA+vABQP+wAUEB8AFBBzABQQ0wAUET8AFBGrABQSJwAUEm8AFBK/ABQTEwAUE4MAFBPzABQULwAUFG8AFBTbABQVRwAUFbMAFBYfABQWmwAUFusAFBcbABQXfwAUF+cAFBgPABQYTwAUGIsAFBjHABQZBwAUGRcAFBlLABQZWwAUGY8AFBm3ABQZ4wAUGgsAFBovABQaUwAUGo8AFBrLABQbEwAUGz8AFBurABQbwwAUG9sAFBwHABQcMwAUHF8AFByLABQctwAUHOMAFB0PABQdOwAUHWMAFB2LABQd5wAUHfsAFB4PABQeOwAUHlMAFB5rABQelwAUHscAFB7fABQe9wAUHycAFB9XABQfpwAUH88AFB/rABQgVwAUIHMAFCDzABQhjwAUIfMAFCJzABQi3wAUI18AFCOrABQjxwAUJEcAFCR7ABQk+wAUJUcAFCXPABQl5wAUJf8AFCYvABQmUwAUJn8AFCarABQm0wAUJvcAFCdLABQnewAUJ6sAFCfjABQoEwAUKEMAFCiDABQovwAUKPsAFCk7ABQpcwAUKcMAFCn/ABQqMwAUKmcAFCqXABQq0wAUKwcAFCtXABQrnwAUK6sAFCvvABQsWwAULJcAFCzXABQtEwAULS8AFC1DABQtewAULZcAFC3XABQuAwAULi8AFC5XABQuawAULpMAFC67ABQuzwAULuMAFC8nABQvawAUL7MAFDAbABQwVwAUMGMAFDCXABQwxwAUMOMAFDDzABQxGwAUMX8AFDGrABQxzwAUMhMAFDJXABQymwAUMt8AFDMjABQzZwAUM68AFDP3ABQ0RwAUNVcAFDWDABQ11wAUNkMAFDbDABQ3MwAUN58AFDe/ABQ35wAUN+sAFDgnABQ4OwAUOE8AFDiDABQ4lwAUOKsAFDi/ABQ43wAUOPcAFDkPABQ5IwAUOZcAFDnLABQ5/wAUOkMAFDp3ABQ6twAUOx8AFDs3ABQ7bwAUO4MAFDuzABQ8UwAUPMcAFD1rABQ9wwAUPgMAFD5HABQ+jwAUPtMAFD8LABQ/LwAUP2MAFD+XABRAAwAUQBMAFEAnABRAuwAUQNcAFEETABRBSwAUQbcAFEIrABRCfwAUQo8AFELDABRDCwAUQ6MAFEPbABREEwAUREsAFESXABRE0wAURScAFEVbABRFrwAURgMAFEZDABRGgwAURuMAFEdbABRHvwAUSBcAFEhfABRIzwAUSTMAFEmTABRJ5wAUSmsAFEq3ABRK2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wAVQq8AFUMTABVDhwAVQ/8AFUQzABVEgwAVRKsAFUTzABVFVwAVRa8AFUXfABVGPwAVRosAFUbXABVHEwAVRzcAFUdHABVHlwAVSBMAFUh7ABVItwAVSP8AFUlHABVJhwAVSccAFUoTABVKYwAVSqsAFUr7ABVLrwAVTAcAFUxvABVM7wAVTV8AFU3PABVOTwAVTr8AFU7jABVPCwAVTycAFU9HABVPhwAVT7MAFU/bABVQQwAVUHsAFVDLABVRHwAVUVsAFVGjABVSLwAVUo8AFVLDABVTJwAVU3cAFVPPABVUJwAVVIcAFVS7ABVVEwAVVZcAFVYbABVWTwAVVpMAFVbPABVXDwAVV0sAFVe/ABVX/wAVWI8AFVjvABVZRwAVWZcAFVnPABVZ/wAVWlMAFVqvABVa1wAVWvMAFVsnABVbWwAVW4MAFVu3ABVb7wAVXBMAFVxTABVcgwAVXLsAFV0TABVdUwAVXX8AFV2/ABVd4wAVXhsAFV6HABVevwAVXvMAFV9XABVftwAVYCMAFWBPABVgewAVYNMAFWFfABVh4wAVYhMAFWI/ABViYwAVYm8AFWKHABVi9wAVYxMAFWNDABVjSwAVY1MAFWOLABVjywAVY/MAFWQjABVkgwAVZPMAFWVDABVlawAVZc8AFWX7ABVmIwAVZm8AFWb3ABVnGwAVZ08AFWeXABVoHwAVaHsAFWjPABVpAwAVaWcAFWmXABVqJwAVapcAFWq3ABVq7wAVa1cAFWuzABVsEwAVbHcAFWzPABVtLwAVbYcAFW3jABVuHwAVbk8AFW6HABVuswAVbucAFW9bABVvnwAVb/8AFXAnABVwVwAVcHsAFXCfABVwywAVcQ8AFXFTABVxnwAVccsAFXIbABVySwAVcq8AFXL3ABVziwAVdC8AFXSzABV1owAVdhsAFXZ3ABV29wAVd3MAFXfLABV4RwAVeKMAFXjrABV5QwAVebsAFXoLABV6EwAVejsAFXpnABV6owAVesMAFXsvABV7qwAVfAcAFXzPABV9BwAVfScAFX13ABV9qwAVfdsAFX4zABV+hwAVfp8AFX7DABV/FwAVfy8AFX9bABV/lwAVf+cAFYAPABWANwAVgF8AFYB/ABWAiwAVgK8AFYEHABWBMwAVgVsAFYGnABWBuwAVggsAFYIfABWCMwAVgk8AFYJ3ABWCnwAVgt8AFYMjABWDcwAVg5cAFYO3ABWEHwAVhEMAFYRTABWEfwAVhKsAFYTzABWFMwAVhW8AFYWzABWGBwAVhpMAFYbnABWHLwAVh58AFYf7ABWIPwAViJcAFYjTABWI7wAViVMAFYlvABWJqwAViecAFYojABWKfwAVissAFYsfABWLZwAVi6sAFYwLABWMcwAVjIsAFYynABWMwwAVjPcAFY0rABWNQwAVjXcAFY2PABWNpwAVjhcAFY5XABWOgwAVjr8AFY7nABWPBwAVj0sAFY+jABWP0wAVkB8AFZAzABWQawAVkKcAFZDbABWRFwAVkVsAFZF/ABWRowAVkcsAFZHrABWSEwAVkisAFZJbABWSdwAVkqcAFZMLABWTOwAVk28AFZOTABWTzwAVk+cAFZQHABWUUwAVlJ8AFZSrABWUywAVlOsAFZUbABWVOwAVlUsAFZVzABWVewAVlasAFZXjABWWGwAVljsAFZZjABWWkwAVlp8AFZanABWWvwAVlvsAFZcjABWXWwAVl5MAFZfPABWYFwAVmCMAFZhbABWYgwAVmKcAFZjbABWY6wAVmPsAFZkbABWZWwAVmacAFZnfABWaCwAVmhMAFZobABWaTwAVmm8AFZqXABWanwAVmqcAFZrLABWa/wAVmyMAFZtbABWbfwAVm58AFZvbABWcCwAVnDcAFZxjABWccwAVnMsAFZzzABWdIwAVnTcAFZ1PABWdVwAVnV8AFZ2HABWdtwAVncsAFZ3nABWeIwAVnl8AFZ6DABWelwAVnrsAFZ7rABWfAwAVnzcAFZ9TABWfjwAVn6sAFZ/vABWgOwAVoG8AFaCbABWg1wAVoTsAFaFfABWhiwAVoccAFaHTABWh3wAVofMAFaIHABWiMwAVol8AFaKHABWitwAVossAFaMTABWjWwAVo4MAFaOjABWkNwAVpGMAFaSbABWkwwAVpNcAFaULABWlMwAVpUsAFaVjABWl+wAVpjcAFaZnABWmiwAVppsAFabHABWnDwAVpzcAFadrABWnewAVp58AFaevABWn6wAVqBMAFagrABWoVwAVqIsAFainABWo0wAVqPMAFakjABWpNwAVqXMAFamTABWpwwAVqfMAFaoPABWqOwAVql8AFaqTABWqtwAVqtcAFasDABWrHwAVqz8AFatzABWrjwAVq78AFavXABWr+wAVrAsAFawbABWsKwAVrFsAFaxrABWsfwAVrJ8AFay/ABWs6wAVrPsAFa0PABWtMwAVrW8AFa2HABWtywAVrdcAFa5nABWujwAVrrcAFa7fABWu+wAVrxsAFa83ABWvXwAVr3cAFa+vABWvvwAVr9MAFa/3ABWwIwAVsDcAFbBrABWwuwAVsQMAFbE/ABWxhwAVsccAFbJzABWyrwAVsvcAFbM7ABWzhwAVtBcAFbRfABW0kwAVtNMAFbUTABW1SwAVtWsAFbWzABW2TwAVttMAFbcDABW3MwAVt5cAFbfzABW4IwAVuFsAFbh/ABW4vwAVuOsAFbknABW5cwAVucMAFboHABW6dwAVusMAFbsHABW7LwAVu28AFbvPABW75wAVvG8AFbyzABW9GwAVvXMAFb3vABW+LwAVvrMAFb77ABW/SwAVv4sAFb/TABXAAwAVwEMAFcBvABXAswAVwPMAFcE7ABXBWwAVwZcAFcHXABXCHwAVwocAFcMHABXDOwAVw5MAFcQDABXEXwAVxMMAFcUbABXFdwAVxa8AFcXzABXGOwAVxncAFcazABXG2wAVxxsAFcdHABXHkwAVx8sAFcgLABXITwAVyHsAFci/ABXI1wAVyRMAFck7ABXJhwAVybMAFcnvABXKIwAVyl8AFcqXABXK0wAVyxcAFct7ABXL9wAVzCcAFcx7ABXM5wAVzT8AFc2fABXN8wAVzksAFc5/ABXOvwAVzwMAFc87ABXPcwAVz5cAFc/TABXP+wAV0EMAFdB/ABXQvwAV0PMAFdEbABXRWwAV0YsAFdHPABXSCwAV0k8AFdKPABXS5wAV0xcAFdN7ABXT1wAV1DsAFdSbABXVEwAV1UMAFdWbABXV6wAV1hMAFdZrABXWmwAV1u8AFddbABXXnwAV18sAFdgHABXYOwAV2G8AFdivABXY6wAV2TcAFdlLABXZdwAV2acAFdnLABXaCwAV2kMAFdp7ABXarwAV2ucAFdsjABXbdwAV278AFdvXABXb5wAV3BMAFdyHABXcpwAV3OcAFd0bABXdXwAV3fsAFd4zABXefwAV3qMAFd7nABXfKwAV32MAFd+3ABXgNwAV4HsAFeDPABXhFwAV4bcAFeILABXiVwAV4pcAFeL3ABXjPwAV45MAFePPABXj/wAV5GMAFeSnABXk7wAV5T8AFeWDABXl0wAV5hsAFeZPABXmdwAV5qcAFebjABXnHwAV52MAFeebABXoEwAV6DsAFehzABXo8wAV6TcAFemHABXqKwAV6pMAFerbABXrRwAV65MAFevrABXsMwAV7HsAFezDABXtMwAV7VcAFe3DABXuNwAV7scAFe9bABXv2wAV8EMAFfCbABXxFwAV8ZsAFfHbABXyAwAV8k8AFfKXABXzEwAV838AFfPHABX0CwAV9EMAFfR/ABX0wwAV9OsAFfUPABX1PwAV9W8AFfXHABX2HwAV9nMAFfbTABX3MwAV94sAFffzABX4SwAV+J8AFfjzABX5DwAV+TcAFfmrABX6AwAV+n8AFfr3ABX7awAV++8AFfwXABX8owAV/RcAFf17ABX9ywAV/g8AFf5LABX+ewAV/ssAFf9zABYAAwAWAR8AFgIfABYCZwAWApsAFgLLABYDAwAWAzsAFgNvABYDtwAWA/sAFgQzABYEUwAWBJMAFgTnABYFSwAWBc8AFgYzABYGmwAWBusAFgdLABYHnwAWB+MAFghDABYIpwAWCS8AFgmjABYKNwAWCq8AFgsPABYLfwAWC+sAFgxbABYM4wAWDW8AFg3vABYONwAWDoMAFg6/ABYPGwAWD18AFg+XABYPwwAWEBsAFhBbABYQuwAWEP8AFhE/ABYRcwAWEb8AFhH/ABYSIwAWEm8AFhKjABYSzwAWEvMAFhM3ABYTjwAWFAMAFhQ3ABYUdwAWFJsAFhTDABYU7wAWFUMAFhW/ABYWAwAWFksAFhaTABYWswAWFvsAFhdrABYXnwAWGAMAFhhLABYYvwAWGUsAFhl7ABYZowAWGe8AFhpHABYacwAWGr8AFhtvABYb/wAWHJMAFh2bABYdzwAWHg8AFh4zABYelwAWHtcAFh8PABYfLwAWH08AFh9nABYfiwAWH7MAFh/3ABYgJwAWIGsAFiCPABYgpwAWIMcAFiEbABYhXwAWIZMAFiH/ABYiQwAWIosAFiKbABYiywAWIusAFiM7ABYjWwAWI5MAFiO7ABYj+wAWJD8AFiRrABYkrwAWJPcAFiUzABYlewAWJdcAFiYDABYmGwAWJkMAFibPABYnAwAWJycAFidjABYnnwAWJ8cAFifzABYoRwAWKHcAFiivABYo5wAWKQsAFilDABYpewAWKbMAFin3ABYqLwAWKnsAFiqzABYq+wAWKy8AFis3ABYrXwAWK4sAFiu3ABYr8wAWLC8AFixzABYsnwAWLPcAFi0jABYtQwAWLY8AFi2/ABYt+wAWLhsAFi5PABYuqwAWLt8AFi8PABYvewAWL9cAFi/7ABYwWwAWMLsAFjEPABYxNwAWMU8AFjF/ABYxkwAWMcsAFjH3ABYyGwAWMnMAFjLDABYyzwAWMxsAFjNjABYzbwAWM58AFjPfABY0JwAWNHcAFjTDABY04wAWNQcAFjUnABY1RwAWNacAFjXbABY2IwAWNncAFjbLABY3EwAWN2cAFje/ABY39wAWOEsAFjibABY4zwAWOOcAFjkvABY5PwAWOXMAFjmzABY5+wAWOiMAFjpLABY6dwAWOqcAFjsbABY7WwAWO98AFjv/ABY8SwAWPIcAFjz3ABY9QwAWPZ8AFj3TABY+OwAWPncAFj6fABY+1wAWPzsAFj9nABY/jwAWP6cAFj/DABY/3wAWQBcAFkB3ABZAuwAWQOcAFkEDABZBRwAWQXMAFkGvABZB3wAWQi8AFkKDABZCwwAWQu8AFkM7ABZDewAWQ8cAFkPfABZD+wAWRCcAFkQ7ABZEgwAWRMsAFkVTABZF1wAWRmcAFka7ABZG4wAWRycAFkd3ABZH3wAWSCMAFkg7ABZIewAWSLsAFkjvABZJJwAWSU8AFklvABZJnwAWSesAFkn3ABZKFwAWSjsAFkpHABZKUwAWSn8AFkq7ABZK/wAWSzMAFkt3ABZLvwAWTAsAFkw3ABZMZwAWTKMAFkzvABZNQwAWTXcAFk27ABZN7wAWTi8AFk5PABZOfwAWTocAFk7HABZO7wAWTw8AFk8zABZPYwAWT5MAFk/jABZQLwAWUE8AFlCLABZQ/wAWUUcAFlGrABZSCwAWUj8AFlKTABZSswAWUv8AFlNPABZTpwAWU9MAFlQTABZUbwAWVK8AFlTbABZVGwAWVVMAFlWrABZWDwAWVncAFlbDABZW7wAWVw8AFlc/ABZXdwAWV68AFlfHABZYCwAWWCMAFlhHABZYewAWWIcAFli3ABZY8wAWWSMAFlljABZZswAWWcsAFlojABZajwAWWusAFltXABZb5wAWXFcAFlzbABZdQwAWXV8AFl17ABZdvwAWXiMAFl57ABZeuwAWXtsAFl8jABZfXwAWX48AFl/LABZgFwAWYGcAFmCfABZgzwAWYP8AFmErABZhnwAWYe8AFmJXABZiywAWYy8AFmN7ABZjwwAWY+cAFmQLABZkEwAWZBsAFmSHABZk6wAWZPcAFmUDABZlJwAWZUsAFmVfABZlcwAWZcsAFmXjABZl+wAWZhMAFmYrABZmQwAWZlsAFmafABZm6wAWZyMAFmdHABZnbwAWZ8sAFmgfABZoZwAWaLcAFmjbABZpAwAWaTcAFmljABZpuwAWafMAFmojABZqVwAWarMAFmsLABZrRwAWa3cAFmujABZrzwAWbE8AFmxrABZsjwAWbN8AFm0bABZtVwAWbYMAFm2zABZt6wAWbiMAFm5TABZudwAWbpcAFm7DABZvHwAWb08AFm+bABZv1wAWcA8AFnAzABZwZwAWcJMAFnD3ABZxMwAWcYMAFnHTABZyEwAWcnsAFnK3ABZy0wAWcxsAFnODABZzkwAWc8sAFnQLABZ0JwAWdGMAFnSbABZ09wAWdUcAFnWLABZ1ywAWdhMAFnY7ABZ2UwAWdnMAFnaLABZ2owAWdscAFncjABZ3RwAWd2sAFne/ABZ34wAWeAMAFngrABZ4TwAWeJcAFni7ABZ5AwAWeRcAFnkzABZ5SwAWeVsAFnlzABZ5lwAWeb8AFnn3ABZ6IwAWekMAFnpTABZ6kwAWeqsAFnrTABZ6/wAWexcAFntLABZ7hwAWe7MAFnvTABZ8AwAWfCsAFnxfABZ8ewAWfKcAFnzPABZ8+wAWfSsAFn1HABZ9gwAWfb8AFn4nABZ+SwAWfmMAFn6PABZ+twAWfuMAFn8PABZ/OwAWf1MAFn9/ABZ/lwAWf78AFn/nABaADwAWgEcAFoBjABaAhwAWgKMAFoC7ABaAzwAWgQ8AFoEfABaBLwAWgT8AFoFPABaBgwAWgbcAFoHnABaCAwAWglsAFoKPABaC4wAWgvMAFoMHABaDIwAWg2sAFoObABaEAwAWhEMAFoRzABaEgwAWhKMAFoTDABaE2wAWhPMAFoUbABaFRwAWhVsAFoVzABaFqwAWhd8AFoYrABaGSwAWhmsAFoaTABaGqwAWhssAFob/ABaHMwAWh1MAFod/ABaHswAWh9sAFogXABaISwAWiGsAFoijABaI4wAWiTsAFolXABaJjwAWia8AFonLABaJ5wAWihsAFopDABaKXwAWinsAFoqrABaKzwAWivcAFosTABaLKwAWi1cAFouDABaLqwAWi9cAFov7ABaMOwAWjFcAFoxzABaMkwAWjLMAFozTABaM8wAWjRMAFo1HABaNbwAWjZsAFo3LABaOAwAWjj8AFo5vABaOhwAWjr8AFo7rABaPLwAWj2MAFo+PABaPvwAWj+cAFpALABaQNwAWkGcAFpCvABaQ4wAWkR8AFpFPABaRZwAWkZMAFpGnABaRzwAWkecAFpH7ABaSLwAWkksAFpJjABaSewAWkosAFpKjABaS2wAWkw8AFpNvABaTnwAWk9MAFpPvABaUJwAWlEMAFpR3ABaUlwAWlNcAFpUHABaVNwAWlXsAFpWfABaVuwAWlc8AFpYTABaWPwAWlk8AFpZjABaWfwAWlrcAFpbnABaXEwAWlysAFpdLABaXawAWl4sAFpezABaX1wAWl/cAFpgPABaYYwAWmHcAFpivABaYxwAWmN8AFpjzABaZFwAWmTcAFplvABaZfwAWmZ8AFpm7ABaZ0wAWmgsAFpo/ABaadwAWmqMAFprXABaa5wAWmwcAFpsTABabOwAWm18AFpuDABabqwAWnA8AFpwTABacFwAWnBsAFpwfABacIwAWnCcAFpwrABacLwAWnDMAFpw3ABacqwAWnO8AFp0bABadWwAWnW8AFp2bABadswAWnecAFp4bABaePwAWnosAFp7HABafEwAWn08AFp+XABafzwAWoFMAFqDHABahCwAWoR8AFqFXABahnwAWocsAFqIHABaiVwAWoqcAFqL3ABajMwAWo3sAFqPjABakLwAWpGcAFqSTABakvwAWpRMAFqVPABalgwAWpc8AFqZLABampwAWpvsAFqcnABanUwAWp5sAFqfTABaoIwAWqG8AFqivABao5wAWqS8AFqlrABapwwAWqfMAFqozABaqawAWqrcAFqr/ABarJwAWq3MAFquPABarwwAWq9sAFqwLABasNwAWrF8AFqyHABas8wAWrWcAFq2TABat4wAWriMAFq5nABaumwAWrscAFq8bABavYwAWr8MAFq/XABawSwAWsHsAFrDHABaw8wAWsScAFrFXABaxdwAWsbcAFrHnABayEwAWsmsAFrLjABazOwAWs4cAFrOXABa0AwAWtH8AFrTfABa09wAWtUcAFrVvABa1xwAWtecAFrYrABa2dwAWtrcAFrb3ABa3PwAWt5MAFrffABa4RwAWuK8AFrkjABa5kwAWudcAFro7ABa6fwAWutsAFrtnABa7swAWu/8AFrwvABa8hwAWvPMAFr0XABa9SwAWvXcAFr3TABa+DwAWvk8AFr6LABa+9wAWvxMAFr9LABa/lwAWv7MAFr//ABbAUwAWwJ8AFsC7ABbA4wAWwTsAFsGbABbB9wAWwisAFsJDABbCbwAWwrcAFsLvABbDWwAWw7cAFsQDABbEUwAWxHMAFsTbABbE7wAWxWsAFsWLABbFywAWxdsAFsYPABbGiwAWxo8AFsbLABbHQwAWx4cAFsenABbIJwAWyIMAFsizABbI7wAWyRsAFslnABbJkwAWydMAFsoTABbKHwAWyi8AFspHABbKawAWynsAFsqLABbKmwAWyq8AFsq/ABbKzwAWyt8AFsrzABbK/wAWywsAFssbABbLKwAWyzcAFstTABbL4wAWy/MAFsxHABbMewAWzLsAFs0DABbNHwAWzTcAFs1bABbNcwAWzZMAFs27ABbNwwAWzeMAFs3/ABbO9wAWzxMAFs9HABbPZwAWz4MAFs/HABbP8wAW0E8AFtBjABbQlwAW0L8AFtDbABbRBwAW0SsAFtILABbSWwAW0ycAFtPfABbT/wAW1CsAFtRPABbUXwAW1H8AFtSfABbU4wAW1TcAFtVjABbVnwAW1ccAFtXzABbWJwAW1k8AFtaDABbWswAW1tsAFtbrABbW+wAW1zsAFtdPABbXgwAW16cAFtfnABbYFwAW2HMAFti7ABbY8wAW2SsAFtlnABbZcwAW2X8AFtnDABbZ6wAW2kMAFtqHABbakwAW2tsAFtsHABbbIwAW228AFtvPABbcBwAW3F8AFtyjABbcqwAW3Q8AFt1bABbdpwAW3gMAFt5fABbeswAW3wsAFt9jABbfuwAW4BMAFuBrABbgwwAW4SMAFuF3ABbiAwAW4pcAFuMbABbjiwAW5BMAFuSDABbk4wAW5SsAFuV/ABblpwAW5hMAFuZPABbm9wAW52cAFugDABboZwAW6QMAFulnABbqIwAW6qcAFutjABbr5wAW7JcAFu0PABbtawAW7ZcAFu4rABbuZwAW7usAFu9jABbv4wAW8GsAFvDrABbxYwAW8YcAFvHTABbyBwAW8o8AFvKbABbyzwAW8x8AFvNLABbzdwAW85sAFvOjABbzqwAW87MAFvO7ABbzwwAW88sAFvPTABbz2wAW8+MAFvPrABbz8wAW8/sAFvQDABb0CwAW9BMAFvQbABb0IwAW9CsAFvQzABb0OwAW9EMAFvRPABb0WwAW9GcAFvRzABb0fwAW9IsAFvSXABb0owAW9K8AFvS7ABb0xwAW9NMAFvTfABb06wAW9PcAFvUDABb1DwAW9RsAFvUnABb1MwAW9T8AFvVLABb1VwAW9WMAFvVvABb1ewAW9YcAFvWTABb1nwAW9asAFvW3ABb1wwAW9dMAFvXjABb18wAW9gMAFvYTABb2IwAW9jMAFvZDABb2UwAW9mMAFvZzABb2gwAW9pMAFvajABb2swAW9sMAFvbTABb24wAW9vMAFvcDABb3EwAW9yMAFvczABb3QwAW91MAFvdjABb3cwAW94MAFveTABb3owAW97MAFvfDABb30wAW9+MAFvfzABb4AwAW+BMAFvgjABb4MwAW+EMAFvhTABb4YwAW+HMAFviDABb4kwAW+KMAFvizABb4wwAW+NMAFvjjABb48wAW+TcAFvlfABb5owAW+ccAFvnjABb6YwAW+rsAFvrHABb65wAW+wcAFvsfABb7UwAW+3cAFvvPABb76wAW/AsAFvxbABb9EwAW/k8AFv5fABb+bwAW/pcAFv7HABb/EwAW/0MAFv9HABb/cwAW/6MAFv+/ABb/5wAXADsAFwBHABcAbwAXALcAFwDXABcBDwAXATsAFwFbABcB8wAXAvsAFwNTABcDpwAXBTMAFwVfABcFqwAXBgcAFwZrABcGjwAXBtsAFwb/ABcHNwAXB5MAFwenABcHswAXB88AFwf3ABcICwAXCEMAFwhrABcIrwAXCOcAFwkTABcJLwAXCWcAFwnvABcKfwAXCr8AFwrrABcLAwAXCzsAFwtPABcLgwAXC4sAFwvXABcL9wAXDDcAFwxfABcMiwAXDPcAFw0jABcNVwAXDacAFw3zABcOUwAXDpcAFw7jABcPTwAXD88AFw/3ABcQCwAXEB8AFxCjABcQ3wAXEU8AFxGnABcR/wAXElMAFxKzABcTBwAXEzcAFxNXABcTlwAXE88AFxQDABcUNwAXFF8AFxSHABcUqwAXFNsAFxTzABcVHwAXFUMAFxVrABcVzwAXFfcAFxX/ABcWbwAXFqcAFxcDABcXKwAXF1MAFxd7ABcXpwAXF8cAFxfjABcYNwAXGIMAFxiXABcYowAXGMMAFxkHABcZGwAXGVMAFxlnABcZcwAXGY8AFxm7ABcaCwAXGjsAFxpLABcaUwAXGosAFxrHABca+wAXGz8AFxt/ABcbjwAXG8sAFxv/ABccMwAXHFcAFxyHABccvwAXHOcAFx0XABcdUwAXHXcAFx2jABcd3wAXHgcAFx4/ABceXwAXHoMAFx7HABcfCwAXH08AFx93ABcfmwAXH9MAFx/3ABcgMwAXIFsAFyB/ABcgxwAXIN8AFyDzABchCwAXITcAFyFLABchZwAXIYMAFyGfABchtwAXIcMAFyHvABciXwAXIpsAFyKvABci/wAXIzMAFyNrABcjjwAXI7MAFyP7ABckbwAXJJcAFyUXABclTwAXJf8AFyYvABcmkwAXJqsAFybLABcnDwAXJzsAFyerABcnzwAXKDcAFyi3ABco+wAXKYsAFynrABcqdwAXKvsAFysbABcrQwAXK8cAFyvvABcsAwAXLG8AFyyLABctOwAXLXcAFy3PABct9wAXLjMAFy5XABcutwAXLv8AFy9HABcvYwAXL48AFy+vABcwBwAXMGMAFzCvABcw8wAXMS8AFzFzABcx6wAXMjMAFzKHABcy2wAXMz8AFzNbABcz6wAXNCMAFzSPABc0wwAXNRMAFzVbABc1twAXNh8AFzajABc26wAXN28AFze/ABc4LwAXOJ8AFzkPABc5fwAXOecAFzozABc6dwAXOtcAFztHABc7swAXPC8AFzy3ABc9JwAXPXMAFz2jABc93wAXPicAFz6LABc+swAXPxcAFz9HABc/lwAXP+cAF0A3ABdAhwAXQM8AF0D7ABdBOwAXQYsAF0HXABdCMwAXQpsAF0LPABdDBwAXQzcAF0NbABdDjwAXQ8cAF0P/ABdEOwAXRHMAF0SjABdFBwAXRSMAF0WHABdFowAXRgsAF0YrABdGewAXRqMAF0bLABdHGwAXR28AF0f3ABdILwAXSH8AF0jPABdI5wAXSRMAF0lLABdJ9wAXSgsAF0o/ABdKcwAXSvcAF0sPABdLIwAXSzsAF0t3ABdLrwAXS+sAF0wPABdMTwAXTH8AF0zHABdNDwAXTSsAF01bABdNhwAXTc8AF04vABdOYwAXToMAF063ABdO3wAXTwcAF08vABdPewAXT6MAF0//ABdQwwAXUQMAF1FTABdRZwAXUXcAF1GnABdR/wAXUlMAF1KXABdS4wAXUzMAF1P/ABdUMwAXVJMAF1S3ABdVHwAXVZMAF1W3ABdWAwAXVpcAF1cLABdXMwAXV4MAF1fHABdX8wAXWEcAF1i3ABdZfwAXWZ8AF1nnABdaGwAXWmMAF1qbABda4wAXWxMAF1trABdb1wAXXAMAF1xfABddVwAXXasAF16fABde6wAXXxsAF19zABdf4wAXYCsAF2BPABdgmwAXYL8AF2ELABdhTwAXYcsAF2InABdjBwAXY18AF2QPABdkowAXZPsAF2VTABdl5wAXZgsAF2ZXABdmwwAXZwcAF2cnABdntwAXZ9cAF2gDABdoOwAXaIcAF2i/ABdo5wAXaQcAF2kjABdpSwAXaZsAF2nnABdqGwAXalcAF2p7ABdqrwAXas8AF2rbABdq5wAXav8AF2sPABdrIwAXazsAF2tXABdrawAXa4MAF2uTABdrswAXa8sAF2wDABdsMwAXbFcAF2yfABds6wAXbSsAF213ABdtlwAXbccAF23/ABduLwAXbn8AF26bABduvwAXbtMAF277ABdvDwAXbzMAF283ABdvVwAXb4sAF2/DABdv7wAXcCcAF3BbABdwkwAXcNcAF3EXABdxNwAXcVMAF3GTABdxpwAXcf8AF3I/ABdyawAXcqcAF3LbABdzCwAXczcAF3OPABdzxwAXc+MAF3P/ABd0HwAXdEcAF3RrABd0hwAXdNsAF3T/ABd1FwAXdTcAF3VvABd1nwAXdfcAF3YbABd2PwAXdocAF3bfABd3AwAXd18AF3eDABd3uwAXd/cAF3gzABd4XwAXeJsAF3ivABd45wAXeRcAF3lfABd5ewAXeZsAF3nHABd55wAXeiMAF3pbABd6lwAXet8AF3srABd7YwAXe4MAF3vPABd77wAXfBMAF3w3ABd8gwAXfMsAF30jABd9PwAXfV8AF32LABd9qwAXfcsAF34TABd+VwAXfpsAF37XABd/HwAXf4MAF3+XABd/twAXf/MAF4AjABeASwAXgHcAF4DPABeBAwAXgUsAF4GLABeB3wAXghsAF4JfABeChwAXgrMAF4LvABeDOwAXg2MAF4ObABeDzwAXhAcAF4QbABeEQwAXhF8AF4STABeEswAXhMcAF4TnABeFQwAXhZsAF4XvABeGQwAXhnsAF4ajABeG5wAXhycAF4dvABeHmwAXh9MAF4f3ABeIGwAXiC8AF4hbABeIhwAXiLcAF4jTABeI7wAXiQcAF4kfABeJMwAXiUsAF4lzABeJlwAXiccAF4njABeKAwAXihsAF4o/ABeKTwAXinMAF4qbABeLCwAXi3sAF4ujABeL0wAXi/cAF4wbABeMWwAXjIsAF4y7ABeM6wAXjRMAF407ABeNYwAXjYsAF42vABeNwwAXjecAF44HABeOJwAXjlcAF46DABeOswAXjwsAF49bABePwwAXj/8AF5BHABeQiwAXkMMAF5EfABeRhwAXkfMAF5JXABeSswAXkxcAF5NrABeTwwAXlDcAF5SPABeU4wAXlP8AF5VXABeVpwAXldMAF5YnABeWgwAXlusAF5dXABeXowAXmAsAF5hTABeYmwAXmNsAF5k/ABeZfwAXmZsAF5ojABeaXwAXmqsAF5tDABebjwAXm8cAF5wrABechwAXnOcAF50nABedcwAXnbcAF53PABeeFwAXnnMAF57HABefHwAXn0MAF5+LABef3wAXoB8AF6BvABegywAXoSsAF6HPABeiCwAXojMAF6JrABeilwAXou8AF6L7ABejVwAXo78AF6QXABekiwAXpQMAF6VLABellwAXpecAF6YbABem1wAXpw8AF6dnABeoJwAXqMMAF6j3ABepywAXqgMAF6ojABeqfwAXqrsAF6r/ABerKwAXq0sAF6tvABerlwAXq8cAF6v3ABesQwAXrL8AF60TABetOwAXrXMAF62PABetvwAXrfcAF647ABeuZwAXrq8AF67rABevDwAXrzsAF69zABevpwAXr+cAF7A7ABewcwAXsNMAF7FLABexswAXsfsAF7JPABeypwAXsvMAF7NHABezmwAXs9sAF7P7ABe0SwAXtJcAF7UDABe1HwAXtU8AF7V7ABe1pwAXtcsAF7YDABe2IwAXtlMAF7aXABe2twAXtvcAF7dDABe3awAXt5cAF7fDABe33wAXuAcAF7hDABe4cwAXuKsAF7jjABe5HwAXuWcAF7mHABe5xwAXugsAF7o3ABe6TwAXunMAF7rrABe7cwAXu6MAF7vzABe8TwAXvIsAF7zDABe9AwAXvT8AF71bABe9iwAXvcMAF73vABe+HwAXvnsAF77XABe+8wAXvzsAF79/ABe/xwAXwDsAF8CrABfBUwAXwZsAF8G7ABfBwwAXweMAF8H7ABfCEwAXwjMAF8JTABfCbwAXwpMAF8K3ABfC5wAXwz8AF8OLABfDpwAXw8MAF8PfABfD9wAXxCsAF8RjABfEpwAXxN8AF8UnABfFdwAXxa8AF8XzABfGAwAXxicAF8ZHABfGYwAXxpMAF8azABfG3wAXxx8AF8dXABfHowAXx88AF8fzABfIKwAXyEsAF8h7ABfIvwAXyTMAF8lrABfJlwAXydcAF8pXABfKhwAXyuMAF8s3ABfLhwAXy+sAF8wvABfMWwAXzJsAF8zLABfM/wAXzUMAF81jABfNjwAXzd8AF84PABfORwAXzp8AF87PABfPAwAXzzMAF89bABfPjwAXz6sAF8/nABfQFwAX0FcAF9B7ABfQlwAX0LsAF9DnABfRHwAX0U8AF9FjABfRfwAX0asAF9HjABfSGwAX0ksAF9JvABfSjwAX0q8AF9LHABfS3wAX0wMAF9MjABfTTwAX028AF9PHABfT0wAX0+8AF9QDABfUNwAX1EsAF9RzABfUxwAX1PsAF9UnABfVWwAX1YsAF9WzABfV5wAX1hcAF9ZnABfWtwAX1xsAF9dHABfXhwAX17cAF9f/ABfYOwAX2HMAF9jPABfY3wAX2SsAF9lrABfZcwAX2csAF9nfABfaAwAX2hMAF9pPABfagwAX2scAF9sLABfbWwAX26MAF9vbABfcKwAX3FsAF9x7ABfcqwAX3OsAF90bABfdQwAX3W8AF94nABfecwAX3rMAF97/ABffQwAX328AF9+nABff6wAX4B8AF+BrABfgjwAX4OcAF+EvABfhWwAX4YMAF+GzABfh5wAX4f8AF+InABfiZwAX4p8AF+LPABfi/wAX4x8AF+NfABfjmwAX48sAF+QTABfkUwAX5K8AF+TjABflCwAX5XMAF+XjABfmBwAX5kMAF+Z/ABfmswAX5x8AF+dTABfnjwAX5+cAF+hPABfoowAX6L8AF+j/ABfpNwAX6V8AF+mLABfpuwAX6dMAF+nrABfqJwAX6lcAF+qjABfq4wAX6ycAF+tnABfrqwAX6+8AF+xDABfsowAX7MMAF+0LABftTwAX7YsAF+3HABfuAwAX7jcAF+5/ABfurwAX7ssAF+8jABfvVwAX738AF++jABfvuwAX8DsAF/BfABfwgwAX8McAF/ETABfxSwAX8ccAF/IrABfydwAX8p8AF/K/ABfzDwAX82sAF/PHABf0PwAX9H8AF/S/ABf08wAX9SMAF/U/ABf1WwAX9YMAF/WrABf14wAX9hcAF/ZLABf2ZwAX9ocAF/anABf24wAX9yMAF/dPABf3fwAX97sAF/fnABf4JwAX+IMAF/jPABf5DwAX+X8AF/oLABf6ewAX+vcAF/sfABf7dwAX++MAF/wDABf8MwAX/FsAF/y7ABf9IwAX/UcAF/3TABf+UwAX/scAF/7zABf/hwAYAAcAGABPABgAkwAYAL8AGAEPABgBZwAYAbcAGAIzABgCewAYAr8AGALzABgDHwAYA08AGAN7ABgDqwAYA9cAGAP3ABgEHwAYBH8AGATLABgFGwAYBW8AGAXHABgF/wAYBjsAGAZ7ABgGlwAYBrsAGAbbABgHDwAYB0cAGAeDABgHuwAYB9MAGAfvABgIDwAYCEsAGAiLABgIzwAYCPsAGAk/ABgJZwAYCasAGAnXABgJ+wAYCicAGApfABgKnwAYCr8AGArrABgLGwAYC1cAGAt7ABgLkwAYC9sAGAwbABgMQwAYDG8AGAzLABgNHwAYDU8AGA13ABgNnwAYDb8AGA3vABgOGwAYDj8AGA6DABgOwwAYDvsAGA9HABgPbwAYD+MAGBBXABgQvwAYES8AGBGfABgSAwAYEn8AGBLzABgTLwAYE1sAGBPTABgUSwAYFLcAGBTPABgU/wAYFTMAGBVfABgVfwAYFa8AGBXjABgWLwAYFosAGBbzABgXIwAYF3cAGBenABgX5wAYGHsAGBkTABgZYwAYGbMAGBn/ABgaWwAYGrMAGBsTABgbQwAYG3cAGBu/ABgb5wAYHDMAGByHABgcqwAYHRMAGB1PABgdmwAYHesAGB4vABgelwAYHuMAGB8HABgfVwAYH5sAGB+/ABggDwAYIFsAGCCrABgg/wAYISsAGCFLABghgwAYIZcAGCHnABgiGwAYIl8AGCKvABgjCwAYI1MAGCO7ABgj/wAYJFMAGCSDABgkwwAYJQcAGCVPABglcwAYJa8AGCXvABgmKwAYJlMAGCabABgm9wAYJzsAGCeLABgn5wAYKEsAGCizABgpOwAYKWMAGCmnABgp9wAYKj8AGCqbABgrCwAYKz8AGCt7ABgr1wAYLEcAGCxvABgsowAYLQMAGC1LABgti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wAZU9sAGVQLABlUPwAZVJcAGVT/ABlVLwAZVaMAGVXLABlWtwAZV48AGVe/ABlX4wAZWAcAGVg3ABlYXwAZWKMAGVjHABlZswAZWocAGVtHABlbjwAZW9cAGVwbABlcRwAZXJcAGVzbABldAwAZXU8AGV2fABld6wAZXkMAGV5vABlemwAZXsMAGV73ABlfKwAZX2MAGV+HABlfywAZX+8AGWBHABlhGwAZYVsAGWGTABlh5wAZYisAGWJnABlinwAZYscAGWMTABljYwAZY48AGWPXABlkHwAZZFsAGWSnABlk2wAZZSMAGWV/ABllqwAZZj8AGWbLABlnJwAZZ0cAGWd7ABln1wAZaBMAGWhfABlokwAZaOMAGWlHABlpjwAZadcAGWonABlqVwAZaucAGWuXABlsOwAZbIsAGWy/ABltJwAZbUcAGW3HABluEwAZblsAGW6nABlu4wAZb1cAGW9/ABlvpwAZb9sAGXBHABlwrwAZcOMAGXEjABlxcwAZcfMAGXI3ABlyywAZcw8AGXNPABlzuwAZdAsAGXQnABl0SwAZdIMAGXSnABl1OwAZddMAGXaHABl2uwAZducAGXcbABl3RwAZd38AGXevABl35wAZeCMAGXh7ABl4uwAZePsAGXlvABl5mwAZeccAGXonABl6cwAZeuMAGXtPABl7mwAZe/8AGXxjABl8pwAZfPsAGX1jABl9zwAZfisAGX6TABl+zwAZf18AGX+rABl/6wAZgDMAGYC7ABmBHwAZgX8AGYGnABmCAwAZgl8AGYKfABmC+wAZg2MAGYOzABmD/wAZhIsAGYTLABmE+wAZhUMAGYWzABmFxwAZhisAGYajABmG6wAZhy8AGYdnABmHewAZh8MAGYgLABmIQwAZiH8AGYjXABmJGwAZiXMAGYmjABmJ3wAZikcAGYpzABmKmwAZirsAGYrPABmLGwAZi7cAGYwLABmMLwAZjHcAGYyvABmNCwAZjXcAGY2rABmN+wAZjhMAGY5vABmOxwAZjxsAGY9bABmPiwAZj7sAGY/zABmQNwAZkJcAGZDHABmQ7wAZkRsAGZFbABmRowAZkfcAGZIzABmSZwAZkosAGZK3ABmS6wAZkz8AGZOHABmTowAZk88AGZRHABmUewAZlM8AGZT/ABmVLwAZlX8AGZW3ABmV5wAZlhMAGZaDABmWtwAZlvMAGZcjABmXawAZl6sAGZgbABmYRwAZmKsAGZjTABmZAwAZmUcAGZmXABmZywAZmf8AGZpDABmaZwAZmpcAGZq3ABma5wAZmy8AGZt7ABmbvwAZnF8AGZyDABmcpwAZnQMAGZ1XABmdiwAZnasAGZ3LABmeGwAZnocAGZ6zABme6wAZn1cAGZ+nABmgDwAZoGMAGaCPABmg9wAZoWcAGaGvABmh2wAZonMAGaK3ABmjCwAZo1cAGaPTABmkLwAZpJsAGaTvABmlOwAZpXcAGaW/ABml2wAZpi8AGaaTABmmxwAZpucAGad/ABmnywAZp/MAGagzABmozwAZqQcAGak3ABmpzwAZqkcAGaqPABmqwwAZqwMAGatbABmriwAZrA8AGaxbABms2wAZrRcAGa1fABmtrwAZresAGa5nABmunwAZrwMAGa9nABmv1wAZsBcAGbBPABmwlwAZsMcAGbDjABmxBwAZsUcAGbGPABmx6wAZsjcAGbJ3ABmyzwAZsvsAGbM/ABmzcwAZs/8AGbQ7ABm0hwAZtPsAGbVXABm1uwAZteMAGbZDABm2nwAZtxMAGbeXABm3+wAZuP8AGbk/ABm5qwAZueMAGbofABm6ZwAZus8AGbs/ABm7awAZu5sAGbu/ABm77wAZvCsAGbxzABm8lwAZvM8AGbzzABm9FwAZvVMAGb1/ABm9zwAZvjMAGb6LABm/MwAZv2MAGb+vABnADwAZwGMAGcCjABnA3wAZwQ8AGcF7ABnBwwAZwiMAGcJzABnCpwAZwvMAGcOvABnD/wAZxCcAGcRnABnEqwAZxLMAGcUHABnFEwAZxXsAGcWrABnF8wAZxl8AGcbDABnHDwAZxzMAGcdLABnHgwAZx68AGcgfABnIiwAZyN8AGckfABnJSwAZyYsAGcnDABnJ7wAZyhcAGco/ABnKjwAZys8AGcsfABnLawAZy5cAGcufABnLuwAZy/MAGcwrABnMvwAZzQMAGc0PABnNRwAZzZ8AGc3nABnOKwAZzlMAGc6XABnOxwAZzwsAGc8nABnPZwAZz+MAGdAHABnQXwAZ0J8AGdC/ABnQ6wAZ0ScAGdFLABnRdwAZ0bMAGdHTABnSCwAZ0kMAGdJzABnSpwAZ0tsAGdMTABnTUwAZ04sAGdPLABnUBwAZ1B8AGdRTABnUdwAZ1JcAGdTnABnVKwAZ1W8AGdW3ABnV0wAZ1gcAGdYzABnWYwAZ1qMAGdbXABnW9wAZ10sAGdeTABnXwwAZ19sAGdgnABnYXwAZ2I8AGdjzABnZNwAZ2V8AGdmfABnZ0wAZ2gMAGdo3ABnamwAZ2scAGdrrABnbFwAZ2z8AGdurABncGwAZ3FMAGdyTABnc3wAZ3Q8AGd1LABndewAZ3a8AGd3fABneMwAZ3k8AGd5/ABneswAZ3u8AGd8zABnfZwAZ34sAGd+7ABngOwAZ4HMAGeCTABng1wAZ4TcAGeFfABnhgwAZ4c8AGeJLABnibwAZ4qsAGeLHABni7wAZ4ycAGeNjABnkIwAZ5IMAGeSzABnlGwAZ5UMAGeWTABnl9wAZ5l8AGeajABnm5wAZ5ycAGeeLABnoBwAZ6DMAGejDABnpJwAZ6Y8AGen/ABnqVwAZ6rMAGesrABnrkwAZ6/8AGex7ABntFwAZ7UMAGe2rABnuHwAZ7oMAGe7bABnvMwAZ768AGe/bABnwCwAZ8CcAGfB/ABnwqwAZ8M8AGfELABnxUwAZ8ZMAGfIHABnyWwAZ8ssAGfMXABnzjwAZ89sAGfRTABn0fwAZ9NsAGfVTABn1rwAZ9dsAGfY3ABn2WwAZ9ssAGfcDABn3cwAZ98MAGfhLABn4nwAZ+RMAGflXABn5gwAZ+dMAGfo7ABn6jwAZ+rsAGfuvABn7/wAZ/DMAGfxjABn8swAZ/RMAGf1DABn9cwAZ/d8AGf4TABn+RwAZ/o8AGf6zABn+vwAZ/s8AGf7fABn+6wAZ/v8AGf8fABn/PwAZ/1cAGf9vABn/kwAZ//8AGgAfABoAjwAaAQ8AGgGHABoCEwAaAjcAGgJHABoC9wAaAycAGgOPABoEVwAaBGcAGgS3ABoFUwAaBdsAGgYDABoGHwAaBncAGgaTABoGwwAaBxcAGgezABoH/wAaCHsAGgj7ABoJqwAaCgsAGgprABoKuwAaCxcAGgubABoMJwAaDIcAGgzTABoNMwAaDYcAGg3LABoN5wAaDh8AGg5PABoOZwAaDpsAGg67ABoOwwAaDxcAGg9HABoPfwAaD4sAGg+3ABoQAwAaEHsAGhDHABoRBwAaETMAGhHPABoSMwAaEl8AGhKTABoTZwAaE6cAGhPfABoUPwAaFIcAGhSrABoVLwAaFU8AGhWnABoVywAaFg8AGhZPABoWgwAaFpcAGhavABoWtwAaFv8AGhdDABoXgwAaF7sAGhgHABoYgwAaGU8AGhmLABoZywAaGfMAGhozABoaewAaGo8AGhrfABobIwAaG2MAGhunABob4wAaHBMAGhxTABocrwAaHNcAGh0DABodYwAaHb8AGh37ABoeewAaHqcAGh7TABofGwAaHzcAGh/XABogBwAaIDsAGiBbABognwAaIMsAGiETABohYwAaIecAGiIvABoiVwAaIocAGiLHABojDwAaI0MAGiOXABoj5wAaJBsAGiRvABoklwAaJM8AGiUDABolPwAaJWcAGiW7ABol4wAaJlcAGiabABonAwAaJ08AGidzABonvwAaKEsAGijPABopIwAaKXcAGinXABoqIwAaKn8AGirHABorUwAaK5sAGivfABosNwAaLKcAGiy/ABos5wAaLTcAGi1LABotxwAaLfMAGi4nABouZwAaLp8AGi7XABovCwAaLysAGi9/ABowFwAaMIsAGjDLABoxQwAaMZsAGjHDABox/wAaMksAGjKbABoy9wAaM08AGjODABoz0wAaM/sAGjQvABo0WwAaNJcAGjTLABo1DwAaNUsAGjVvABo1pwAaNgcAGjYvABo2XwAaNqsAGjb7ABo3HwAaN3MAGjeLABo31wAaOA8AGjhrABo4swAaOOMAGjkXABo5WwAaOZsAGjnPABo58wAaOhsAGjpfABo6wwAaOzMAGjufABo71wAaO/8AGjwrABo8UwAaPI8AGjyrABo80wAaPOsAGj0fABo9PwAaPXMAGj37ABo+TwAaPmsAGj5/ABo+twAaPvcAGj8bABo/YwAaP6cAGj/TABpAEwAaQIsAGkDDABpA7wAaQVcAGkGPABpB2wAaQisAGkJXABpClwAaQtsAGkMDABpDTwAaQ4sAGkO7ABpEJwAaRL8AGkUnABpFuwAaReMAGkYjABpGawAaRq8AGkb3ABpHNwAaR4MAGkfXABpIIwAaSHcAGkjTABpI/wAaSUMAGklnABpJiwAaSbsAGkn/ABpKTwAaSr8AGksTABpLcwAaS+cAGkwvABpMZwAaTO8AGk0/ABpNewAaTasAGk3PABpOFwAaTosAGk8DABpPIwAaT2cAGk/XABpQSwAaUKcAGlDHABpRbwAaUbsAGlIDABpSawAaUqcAGlLbABpTOwAaU6sAGlQPABpUqwAaVTMAGlXDABpWRwAaVsMAGlc/ABpXtwAaWCMAGlijABpZHwAaWYMAGlnvABpaVwAaWr8AGltjABpb4wAaXDsAGlyHABpc2wAaXQcAGl0bABpdXwAaXZcAGl3fABpeHwAaXoMAGl7XABpfCwAaX2MAGl+nABpf0wAaX/sAGmBPABpgfwAaYM8AGmEnABphOwAaYZcAGmHzABpiLwAaYmcAGmLTABpjHwAaY2sAGmOzABpkBwAaZIMAGmTbABplRwAaZXsAGmW3ABpl6wAaZi8AGmbLABpnGwAaZ08AGmd7ABpntwAaZ+sAGmgfABpoVwAaaKsAGmkLABppPwAaaXMAGmmvABpp8wAaaisAGmp/ABpqmwAaat8AGmsPABprTwAaa5cAGmvvABpsRwAabKcAGm0nABptlwAabdsAGm4TABpuPwAabrMAGm/HABpxYwAaca8AGnIDABpyXwAacs8AGnNPABpz0wAadGcAGnTjABp1IwAadWsAGnXbABp2AwAadlcAGnbLABp3MwAad3cAGngjABp4fwAaeOMAGnlXABp5uwAaef8AGnqLABp7BwAaez8AGntjABp7/wAafPsAGn0bABp9PwAafY8AGn3vABp+FwAafjcAGn5bABp+lwAafs8AGn8HABp/NwAaf2cAGn+PABp/xwAaf/cAGoArABqAVwAagKMAGoDrABqBLwAagWsAGoGjABqB8wAagjMAGoJvABqCtwAagt8AGoMbABqDUwAag3cAGoO7ABqD+wAahE8AGoSfABqE8wAahRsAGoUzABqFWwAahXMAGoWvABqFzwAahe8AGoYXABqGPwAahmMAGoaHABqGqwAahwcAGoczABqHXwAah6sAGofnABqIMwAaiHsAGoi3ABqI/wAaiSsAGolbABqJlwAaic8AGoofABqKVwAaio8AGorDABqKywAaiv8AGotDABqLcwAai7sAGovvABqMHwAajEcAGoyDABqMrwAajN8AGo0zABqNUwAajZMAGo3HABqN9wAajjsAGo6PABqO6wAajycAGo9LABqPdwAaj7sAGo/jABqQMwAakHsAGpC7ABqREwAakcsAGpH3ABqSQwAakmsAGpKXABqSwwAakxsAGpNHABqThwAak9sAGpQrABqUbwAalK8AGpTvABqVUwAalYcAGpWnABqWEwAalksAGpaXABqW/wAal18AGpejABqX7wAamE8AGpibABqY9wAamWMAGpmnABqZxwAamjMAGpqbABqa2wAamx8AGpuLABqbzwAanBMAGpxnABqdYwAanXsAGp2jABqd0wAanf8AGp5TABqejwAanqsAGp7fABqe9wAanz8AGp/HABqgMwAaoJsAGqFDABqhzwAaooMAGqLvABqjLwAao1sAGqPzABqkRwAapJMAGqTbABqlIwAapW8AGqXHABqmFwAapmcAGqbDABqnKwAap5sAGqerABqoAwAaqE8AGqjnABqpLwAaqWsAGqnHABqqLwAaqlcAGqqDABqq5wAaqxsAGqtHABqrcwAaq9sAGqwvABqsdwAarMMAGqzvABqtTwAarbMAGq3fABquEwAarlMAGq7PABqvJwAar5cAGq+rABqwBwAasCsAGrBTABqwgwAasNMAGrEbABqxXwAasccAGrHzABqyIwAasm8AGrLfABqzUwAas5MAGrPXABq0KwAatE8AGrSrABq1RwAatXsAGrXDABq2KwAatmsAGrazABq29wAat1cAGrfDABq4JwAauJMAGrj7ABq5fwAauccAGrn/ABq6dwAauucAGrsvABq7owAavBcAGrxfABq8twAavR8AGr17ABq9pwAavdsAGr4LABq+PwAavncAGr7PABq+6wAavxsAGr9fABq/gwAav+sAGsALABrALwAawHMAGsCzABrA+wAawT8AGsFrABrBmwAawbcAGsHrABrCEwAawkMAGsKDABrCqwAawwsAGsM7ABrDgwAaw98AGsRLABrEewAaxL8AGsULABrFJwAaxVMAGsVvABrFmwAaxc8AGsX7ABrGWwAaxocAGsa/ABrG8wAax1MAGserABrH2wAayEMAGshvABrImwAayP8AGsnPABrKCwAayksAGsqXABrK7wAayysAGst7ABrLwwAazB8AGsyDABrMuwAazPMAGs0vABrNWwAazYMAGs3LABrODwAazlMAGs6bABrOzwAaz1sAGs/TABrQbwAa0PcAGtEXABrRdwAa0eMAGtJfABrSuwAa0ycAGtNzABrTwwAa1AsAGtRjABrUrwAa1PMAGtUnABrVVwAa1bMAGtX/ABrWYwAa1qsAGtb/ABrXKwAa118AGtfLABrYPwAa2H8AGtkHABrZcwAa2acAGtn7ABraOwAa2ncAGtrDABrbBwAa2zcAGttzABrbewAa28cAGtvnABrcIwAa3GMAGty3ABrc/wAa3b8AGt4LABrelwAa3s8AGt8nABrfVwAa33sAGt/XABrgDwAa4FcAGuCLABrgvwAa4RMAGuGDABriHwAa4kcAGuJvABrinwAa4rcAGuLPABrjGwAa438AGuO/ABrkAwAa5DsAGuSDABrkzwAa5RsAGuVzABrlwwAa5isAGuZ/ABrm3wAa5ycAGudbABrnpwAa6BsAGuhrABrovwAa6QcAGukzABrpZwAa6acAGunjABrqLwAa6msAGuq7ABrrDwAa62MAGuunABrr+wAa7EsAGuzPABrtFwAa7aMAGu3fABruJwAa7nsAGu6vABrvAwAa708AGu9/ABrv2wAa7/cAGvAzABrwUwAa8HcAGvCfABrw+wAa8UMAGvGTABrx1wAa8hMAGvJLABryiwAa8scAGvLrABrzTwAa83sAGvOXABrz2wAa8/sAGvQzABr0YwAa9JsAGvTbABr1KwAa9YcAGvXfABr2QwAa9q8AGvcjABr3qwAa+E8AGvjTABr49wAa+TsAGvlzABr5uwAa+g8AGvpbABr6rwAa+wMAGvtPABr7mwAa++MAGvwrABr8fwAa/MMAGv0HABr9PwAa/WsAGv2rABr93wAa/iMAGv6PABr+4wAa/18AGv+vABr/5wAbABsAGwBfABsAswAbAPsAGwEvABsBdwAbAbsAGwInABsCswAbAv8AGwN3ABsDzwAbBBMAGwQ/ABsEpwAbBSMAGwWLABsF8wAbBjsAGwaHABsGzwAbBxsAGwd3ABsHtwAbB/cAGwhXABsIswAbCPcAGwlLABsJuwAbCicAGwq/ABsLAwAbC0cAGwurABsL7wAbDL8AGwznABsNJwAbDWcAGw2vABsN1wAbDf8AGw5DABsOdwAbDqcAGw7bABsPCwAbD1sAGw+rABsP9wAbEFsAGxCjABsQ/wAbEU8AGxGXABsSAwAbEmMAGxKzABsS+wAbE2MAGxO7ABsUBwAbFFcAGxR/ABsU3wAbFSsAGxWPABsV3wAbFl8AGxbPABsXPwAbF58AGxgLABsYcwAbGOcAGxkTABsZPwAbGXsAGxmrABsZ3wAbGg8AGxpfABsamwAbGtcAGxsLABsbRwAbG3cAGxu3ABsb+wAbHCcAGxxjABscuwAbHQ8AGx2PABsdwwAbHgcAGx5bABseqwAbHvMAGx8fABsfYwAbH58AGx/PABsgFwAbIG8AGyC3ABsg7wAbIU8AGyGDABshxwAbIe8AGyIbABsiOwAbIpMAGyLjABsjMwAbI1MAGyOrABskEwAbJG8AGyTjABslFwAbJV8AGyW7ABsl/wAbJmsAGybLABsnGwAbJ2MAGyfvABsocwAbKLsAGyj3ABspLwAbKZMAGynzABsqYwAbKqMAGyrXABsrbwAbK9cAGywbABsskwAbLOsAGy0rABstnwAbLdMAGy4LABsuNwAbLocAGy7LABsvGwAbL4cAGzATABswLwAbMFcAGzCLABswvwAbMPsAGzEXABsxVwAbMZ8AGzHHABsx5wAbMhcAGzJPABsyjwAbMtMAGzMPABszWwAbM38AGzOnABsz1wAbNAcAGzQ/ABs0ewAbNKcAGzTLABs1GwAbNVMAGzWLABs1zwAbNe8AGzY7ABs2fwAbNscAGzcDABs3SwAbN4cAGzfXABs4PwAbOJMAGzj/ABs5awAbOcMAGzovABs6YwAbOpsAGzrrABs7HwAbO3sAGzunABs7wwAbO/MAGzwrABs8ZwAbPKsAGzzLABs86wAbPTMAGz17ABs9uwAbPf8AGz5bABs+qwAbPvMAGz9PABs/qwAbQCMAG0CPABtBDwAbQY8AG0IrABtCxwAbQ3cAG0PjABtEUwAbRIcAG0TPABtFEwAbRWsAG0XPABtGAwAbRg8AG0Y7ABtGfwAbRwMAG0c7ABtHewAbR7cAG0fzABtIJwAbSFsAG0jLABtJGwAbSVMAG0mnABtJywAbSkMAG0rHABtLEwAbS2cAG0vDABtMKwAbTGsAG0yXABtM4wAbTSsAG02HABtNxwAbTfcAG04zABtOewAbTt8AG083ABtPjwAbT8cAG0/3ABtQLwAbUGcAG1CrABtQ0wAbURsAG1FTABtR4wAbUiMAG1JPABtShwAbUt8AG1NXABtT4wAbVCMAG1SLABtU4wAbVVMAG1WrABtV8wAbVksAG1aTABtWxwAbVvsAG1fDABtX/wAbWFMAG1inABtZKwAbWW8AG1mrABtaHwAbWk8AG1qDABtavwAbWucAG1sTABtbVwAbW4cAG1u7ABtcEwAbXFsAG10HABtdGwAbXa8AG14DABteQwAbXq8AG17zABtfUwAbX8cAG2AHABtgOwAbYMMAG2DzABthIwAbYVMAG2GPABthtwAbYeMAG2I3ABtihwAbYtsAG2MbABtjZwAbY8MAG2QjABtkdwAbZNsAG2VHABtlrwAbZdsAG2ZDABtmpwAbZxcAG2d3ABtnuwAbaDcAG2h/ABto/wAbaTcAG2mbABtqiwAbascAG2s7ABtrbwAba5sAG2yHABtsqwAbbR8AG21nABttywAbbicAG25fABtuxwAbbwcAG29jABtvvwAbb+sAG3BvABtw1wAbcQ8AG3FvABtxvwAbckMAG3KLABty7wAbcycAG3N7ABtzrwAbc+sAG3QXABt0YwAbdI8AG3TDABt1BwAbdWsAG3WPABt18wAbdjMAG3ZnABt23wAbdyMAG3erABt4DwAbeLcAG3jbABt5HwAbeW8AG3mPABt55wAbeh8AG3pbABt6ewAbeusAG3szABt7VwAbe3sAG3v/ABt8hwAbfPcAG31rABt9owAbfb8AG33nABt+AwAbfisAG35TABt+dwAbfssAG38fABt/lwAbgBMAG4B3ABuAjwAbgKcAG4C/ABuBJwAbgYcAG4HrABuCNwAbgpsAG4LfABuDNwAbg78AG4QLABuESwAbhH8AG4TDABuE+wAbhVMAG4WfABuF1wAbhgMAG4ZTABuGvwAbhuMAG4cnABuHVwAbh7sAG4f3ABuILwAbiFsAG4ifABuI1wAbiRsAG4lfABuJcwAbibcAG4nvABuKPwAbioMAG4rPABuLDwAbi1sAG4ubABuMBwAbjEMAG4xnABuMnwAbjMMAG40jABuNewAbjcMAG43/ABuOTwAbjn8AG47DABuPFwAbj1cAG4+nABuP6wAbkDMAG5BzABuQpwAbkOsAG5EjABuRZwAbkZ8AG5HzABuSNwAbkm8AG5KrABuS2wAbkyMAG5NfABuTuwAblAsAG5RbABuUnwAblPMAG5UfABuVZwAblbcAG5X7ABuWiwAbltsAG5cfABuXWwAbl4sAG5fnABuYNwAbmHcAG5irABuY0wAbmO8AG5kbABuZRwAbmb8AG5o3ABua0wAbmysAG5vPABucbwAbnR8AG52/ABueJwAbnosAG58LABufSwAbn5sAG6BTABug1wAboO8AG6ETABuhlwAbokMAG6LDABujAwAbo0MAG6ODABujswAbo+sAG6RTABukkwAbpMsAG6T7ABulSwAbpZMAG6XjABumBwAbpisAG6YzABumOwAbplsAG6Z7ABumvwAbpvsAG6cbABunLwAbp0sAG6drABunfwAbp5sAG6gDABuomwAbqMcAG6j3ABupLwAbqXMAG6mjABup0wAbqgMAG6o3ABuqZwAbqpcAG6rHABuq+wAbqycAG6tTABurfwAbq6sAG6vbABusCwAbrDcAG6xnABusowAbrQ8AG60rAButfwAbrc8AG64TABuuVwAbrmMAG657ABuuowAbrtcAG68TABuvMwAbr3sAG6+TABuvnwAbr6sAG6+3ABuvwwAbr9MAG6/fABuv6wAbr/cAG7AHABuwFwAbsCcAG7AzABuwOwAbsEcAG7BjABuwmwAbsOMAG7ErABuxawAbsacAG7IPABuydwAbst8AG7MfABuzewAbs6sAG7PnABu0ewAbtLMAG7UHABu1YwAbtb8AG7YPABu2awAbtucAG7dPABu3kwAbt9cAG7hDABu4twAbuQsAG7l/ABu6FwAbupcAG7qvABu6wwAbut8AG7tzABu7lwAbu9cAG7wDABu8HwAbvD8AG7xnABu8/wAbvSsAG71PABu9cwAbvZ8AG72nABu9ywAbvkMAG75nABu+rwAbvvMAG78fABu/MwAbv2MAG7+vABvAQwAbwF8AG8BnABvAlwAbwO8AG8FXABvBqwAbwhMAG8I3ABvCVwAbwpcAG8LXABvDDwAbw0MAG8NTABvDjwAbw+cAG8RTABvEvwAbxTMAG8WjABvGBwAbxh8AG8aXABvG8wAbx3sAG8gzABvI3wAbyWMAG8mLABvJ4wAbyi8AG8pfABvKqwAbyxMAG8tPABvLtwAbzBMAG8xLABvMvwAbzPMAG81bABvNpwAbzcsAG837ABvOIwAbzmcAG853ABvOhwAbzssAG88fABvPWwAbz58AG9A/ABvQowAb0OsAG9F/ABvR6wAb0icAG9KXABvTVwAb08cAG9QnABvUiwAb1McAG9UrABvVUwAb1Z8AG9YzABvWpwAb10sAG9fPABvYHwAb2FsAG9ibABvYowAb2M8AG9krABvZawAb2aMAG9n3ABvaawAb2scAG9sjABvbawAb258AG9vnABvcWwAb3IcAG9zrABvdIwAb3WsAG923ABvd/wAb3jMAG96DABve2wAb3ycAG9+LABvfvwAb3+sAG+BfABvglwAb4MMAG+EzABvhYwAb4ZMAG+HTABviBwAb4ksAG+KTABvi1wAb4y8AG+ODABvjwwAb5AMAG+RzABvkvwAb5VcAG+WXABvlxwAb5iMAG+ZvABvmvwAb5usAG+c3ABvnbwAb56cAG+gHABvoYwAb6JcAG+jLABvo9wAb6SMAG+k7ABvpUwAb6WsAG+mDABvp4wAb6isAG+p3ABvqxwAb6usAG+s7ABvrlwAb68sAG+wrABvsXwAb7L8AG+0rABvtawAb7cMAG+4XABvurwAb7wMAG+9vABvv5wAb8DMAG/CLABvwwwAb8N8AG/EbABvxSwAb8d8AG/I7ABvylwAb8sMAG/LzABvzGwAb80MAG/NjABvzkwAb89MAG/RLABv0+wAb9VsAG/WPABv1twAb9e8AG/YjABv2SwAb9m8AG/ajABv2zwAb9u8AG/d/ABv33wAb+EcAG/j3ABv5hwAb+cMAG/n7ABv6rwAb+t8AG/tnABv7qwAb++sAG/wfABv8YwAb/SMAG/17ABv9owAb/c8AG/4TABv+awAb/qsAG/77ABv/bwAb/9MAHAA3ABwAgwAcALsAHAD7ABwBcwAcAcMAHAIzABwCTwAcAssAHANrABwD1wAcBGsAHATjABwFTwAcBc8AHAZjABwGzwAcB1MAHAfXABwIgwAcCPcAHAlvABwKEwAcCpcAHAsTABwLcwAcDBcAHAyfABwNJwAcDcMAHA5TABwOjwAcDxsAHA+TABwPswAcEFMAHBDTABwRTwAcEesAHBJzABwSuwAcEyMAHBODABwT1wAcFC8AHBR/ABwUxwAcFP8AHBVHABwVewAcFacAHBXXABwWAwAcFi8AHBZ3ABwWrwAcFuMAHBcLABwXTwAcF4cAHBfLABwYPwAcGF8AHBiHABwY3wAcGR8AHBlPABwZvwAcGicAHBpvABwarwAcGusAHBsvABwbawAcG7cAHBv/ABwcdwAcHN8AHB0LABwdPwAcHfMAHB5TABwenwAcHtMAHB9HABwf0wAcIHsAHCDLABwhEwAcIVMAHCGDABwhywAcIg8AHCJfABwitwAcIvsAHCM/ABwjWwAcI6MAHCPLABwkBwAcJDsAHCSjABwlCwAcJWMAHCXTABwmIwAcJkcAHCa/ABwnMwAcJ/cAHCg3ABwohwAcKMcAHCjjABwpFwAcKYcAHCm3ABwp9wAcKjMAHCqbABwrJwAcK2MAHCubABwr6wAcLC8AHCxnABwsqwAcLQcAHC0vABwtawAcLZ8AHC3nABwuCwAcLksAHC7TABwu9wAcLysAHC9LABwvwwAcMFcAHDCPABwwqwAcMMcAHDF/ABwxtwAcMdMAHDIbABwykwAcMwMAHDMzABwzlwAcM8cAHDQDABw0KwAcNIcAHDSzABw0+wAcNUMAHDWTABw13wAcNg8AHDZXABw2vwAcNusAHDcvABw3pwAcOBMAHDh/ABw46wAcOSMAHDmDABw5pwAcOeMAHDpPABw6hwAcOsMAHDsTABw7ewAcO68AHDvXABw8GwAcPFMAHDyXABw84wAcPVsAHD3TABw9+wAcPicAHD5zABw+swAcPuMAHD8HABw/LwAcP4MAHD+rABxABwAcQDcAHEBfABxAlwAcQLsAHEETABxBWwAcQY8AHEHHABxCbwAcQp8AHEK3ABxDJwAcQ1MAHEN/ABxD1wAcRAMAHERrABxEnwAcRN8AHEUXABxFYwAcRYcAHEXPABxGGwAcRmMAHEarABxG5wAcRv8AHEdTABxHqwAcR9sAHEg/ABxInwAcSQcAHEk3ABxJawAcSbsAHEn7ABxKfwAcSrsAHErnABxLDwAcSzcAHEtPABxLZwAcS78AHEvvABxMEwAcTLsAHE0DABxNQwAcTYMAHE37ABxOUwAcTo8AHE6/ABxO7wAcTx8AHE9LABxPawAcT5cAHE/rABxQJwAcUGsAHFDDABxQ6wAcUTMAHFG7ABxSAwAcUnMAHFJ7ABxS5wAcU1sAHFOHABxTmwAcU9sAHFP7ABxUJwAcVIMAHFS3ABxU5wAcVUsAHFWLABxVvwAcVlMAHFaHABxWvwAcVwsAHFdbABxXawAcV4sAHFe/ABxX8wAcWC8AHFhfABxYjwAcWLMAHFkTABxZZwAcWbsAHFoDABxaTwAcWnMAHFqvABxa0wAcWu8AHFtXABxb7wAcXDcAHFzHABxdRwAcXY8AHF27ABxd5wAcXgcAHF53ABxepwAcXsMAHF8TABxfWwAcX68AHGAXABxgMwAcYEsAHGB7ABxgmwAcYQ8AHGFHABxhfwAcYa8AHGHXABxiDwAcYk8AHGKnABxi3wAcYxcAHGNHABxjawAcY68AHGPbABxkBwAcZEsAHGSDABxkxwAcZQcAHGU/ABxlkwAcZb8AHGX/ABxmKwAcZoMAHGbbABxnWwAcZ9sAHGhLABxouwAcaOcAHGkPABxpRwAcaX8AHGnPABxp5wAcag8AHGpPABxqmwAcav8AHGsrABxrRwAca4cAHGvfABxsHwAcbHcAHGz7ABxtOwAcbYcAHG2nABxttwAcbe8AHG4rABxugwAcbrsAHG7bABxvBwAcby8AHG9/ABxvtwAcb/cAHHAvABxwYwAccOsAHHEjABxxVwAccXsAHHH3ABxyMwAccs8AHHMDABxzYwAcc7cAHHRLABx0/wAcdasAHHXXABx19wAcdi8AHHZjABx2nwAcducAHHcXABx3YwAcd5sAHHfLABx3/wAceCMAHHgrABx4dwAceKsAHHjvABx5nwAcedMAHHnbABx6HwAcelcAHHq3ABx7VwAce6cAHHxTABx8kwAcfJsAHHzbABx9dwAcfcMAHH4jABx+mwAcftsAHH9PABx/rwAcgBMAHIBXAByA0wAcgTMAHIG/AByCKwAcgncAHILLAByDDwAcg1cAHIOPAByDwwAcg+8AHIQzAByEawAchKMAHITPAByFAwAchTcAHIVbAByFiwAchb8AHIXnAByGEwAchlcAHIZ3AByGnwAchtMAHIbzAByHHwAch18AHId/AByHuwAch/sAHIgzAByIUwAciJcAHIjLAByJFwAciWcAHImXAByJywAcif8AHIovAByKmwAcivcAHIsnAByLfwAci68AHIvXAByMAwAcjD8AHIx7AByMxwAcjQMAHI0rAByNSwAcjZsAHI27AByN4wAcjh8AHI5PAByOYwAcjrsAHI73AByPMwAcj0cAHJAXAByQlwAckM8AHJE7AByRdwAckbsAHJHTABySCwAckh8AHJJbABySuwAckvMAHJMvAByTawAck7MAHJPrAByUGwAclFsAHJSPAByU3wAclUMAHJWfAByV1wAclh8AHJY7AByWewAclqMAHJbDAByXfwAcl48AHJezAByYRwAcmH8AHJinAByY+wAcmRsAHJk/AByZYwAcmYsAHJnPAByaAwAcmi8AHJpTAByadwAcmq8AHJrTABya/wAcmysAHJujAByb4wAcnDMAHJxbABycdwAcnKsAHJzbABydAwAcnSMAHJ1DABydlwAcncsAHJ3zAByeFwAcnlsAHJ9fAByfzwAcn/MAHKAjABygYwAcoJsAHKDTAByg+wAcoUcAHKGPAByh1wAcof8AHKIXAByiRwAcorcAHKLnAByjNwAco3MAHKP3ABykJwAcpFcAHKSLABykqwAcpO8AHKUjABylSwAcpXcAHKW/AByl4wAcpmMAHKaTABymywAcpusAHKcnABynUwAcp3MAHKefAByn0wAcqAcAHKgrAByowwAcqPsAHKmTABypuwAcqfcAHKo7AByq2wAcqw8AHKtLAByrxwAcq/MAHKwzABysuwAcrQMAHK0rABywIwAcsFcAHLHDAByx+wAcsoMAHLLDAByy8wAcs1cAHLXfABy2HwActmcAHLarABy21wActw8AHLdLABy3pwAct8MAHLgDABy4OwAcueMAHLorABy77wAcvBcAHLx3ABy/MwAcv2cAHL+DABy/zwAcwGsAHMDPABzDowAcw8cAHMQzABzEewAcxIcAHMVHABzFiwAcxdsAHMYTABzGUwAcxnsAHMbTABzHHwAcx5MAHMffABzI1wAcyP8AHMljABzJfwAcyasAHMnfABzKHwAcyksAHMpvABzN5wAczjMAHM5PABzPvwAcz+cAHNFvABzS+wAc0zcAHNOvABzUBwAc1IcAHNT3ABzXewAc2EsAHNiLABzZQwAc2XMAHNmfABzZuwAc2msAHNrDABzbAwAc20sAHNuHABzbuwAc28cAHNwDABzcKwAc3IsAHNyvABzc3wAc3S8AHN13ABzd0wAc3i8AHN5nABzemwAc3tMAHN8PABzfTwAc36cAHN/XABzgIwAc4GcAHOC3ABzg4wAc4RsAHOFzABzhswAc4e8AHOIzABziZwAc4s8AHONDABzjewAc46sAHOQHABzkLwAc5HsAHOS3ABzkzwAc5O8AHOUDABzlJwAc5U8AHOWnABzl2wAc5jMAHOaXABzm2wAc5vsAHOdTABznjwAc57MAHOfzABzoJwAc6KsAHOjfABzpJwAc6VsAHOmXABzpywAc6fcAHOojABzqVwAc6osAHOqjABzqywAc6wMAHOs3ABzrfwAc6+8AHOwfABzsWwAc7KMAHO0HABztTwAc7Y8AHO3XABzuHwAc7o8AHO7HABzu3wAc7xsAHO9XABzvswAc8AsAHPBDABzwgwAc8LsAHPDzABzxRwAc8WMAHPG3ABzx/wAc8jcAHPKPABzywwAc8wMAHPNXABzzp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wAdXHMAHVyjAB1c6wAdXPsAHV03AB1dPwAdXVsAHV17AB1dywAdXfMAHV4zAB1eOwAdXl8AHV5/AB1eqwAdXtsAHV8PAB1fUwAdX4MAHV+rAB1f3wAdX/cAHWALAB1gZwAdYG8AHWCfAB1gzwAdYPMAHWErAB1hcwAdYYcAHWGjAB1hrwAdYccAHWHfAB1h9wAdYg8AHWIrAB1iRwAdYlsAHWKDAB1iqwAdYycAHWNrAB1jpwAdZDcAHWRXAB1kiwAdZNMAHWUbAB1lWwAdZWcAHWWLAB1luwAdZdMAHWYDAB1mLwAdZn8AHWdLAB1newAdZ8sAHWgTAB1oKwAdaG8AHWivAB1o5wAdaR8AHWlbAB1plwAdad8AHWqzAB1q4wAdawcAHWsnAB1rwwAdbBsAHWxXAB1sbwAdbNsAHW07AB1tWwAdbe8AHW47AB1ukwAdbr8AHW7jAB1vAwAdbycAHW+nAB1wJwAdcFcAHXCPAB1wwwAdcO8AHXEjAB1xVwAdcX8AHXGXAB1x1wAdckcAHXJ7AB1y7wAdc2sAHXOnAB1z0wAdc/sAHXRLAB10hwAddKcAHXUHAB11JwAddU8AHXVrAB11lwAddecAHXZDAB12awAdduMAHXdXAB136wAdeA8AHXhPAB14dwAdeL8AHXkDAB15YwAdedMAHXofAB16WwAdeo8AHXrbAB17PwAde98AHXwbAB18fwAdfPsAHX1HAB19bwAdfZcAHX27AB19+wAdfjsAHX5rAB1+zwAdfwcAHX93AB1/kwAdf88AHYAPAB2AMwAdgE8AHYBvAB2AnwAdgLMAHYDHAB2A/wAdgSMAHYFPAB2BcwAdgZcAHYGzAB2B/wAdgjsAHYJrAB2CtwAdgwsAHYN7AB2DnwAdg9sAHYQLAB2EKwAdhFsAHYSvAB2EwwAdhO8AHYUfAB2FKwAdhUsAHYV3AB2FhwAdhc8AHYYPAB2GHwAdhkMAHYZrAB2GjwAdhucAHYcbAB2HLwAdh2MAHYd3AB2HjwAdh58AHYgDAB2IawAdiI8AHYjTAB2I8wAdiT8AHYlbAB2JdwAdibMAHYo7AB2KZwAdiqcAHYrPAB2LVwAdi28AHYuXAB2LxwAdi/8AHYyHAB2MvwAdjUMAHY17AB2NowAdjdMAHY4nAB2OcwAdjqcAHY7PAB2O6wAdjysAHY9fAB2PkwAdj+MAHZAvAB2QawAdkKMAHZDrAB2RBwAdkR8AHZFDAB2RdwAdkasAHZHTAB2SBwAdklcAHZKLAB2SxwAdkxMAHZNbAB2TfwAdk58AHZPvAB2UPwAdlIsAHZUzAB2VXwAdlYsAHZYrAB2W2wAdl0sAHZd7AB2XmwAdl/8AHZgzAB2YawAdmScAHZmPAB2aFwAdmmcAHZrDAB2bHwAdm38AHZuvAB2bzwAdnGcAHZyzAB2c3wAdnTcAHZ2LAB2d2wAdni8AHZ6LAB2fFwAdn0sAHZ+/AB2f8wAdoDMAHaCLAB2gvwAdoN8AHaETAB2hMwAdoVsAHaF7AB2huwAdoeMAHaHzAB2iKwAdok8AHaJ7AB2itwAdotMAHaL3AB2jFwAdozcAHaNnAB2jqwAdo88AHaQLAB2kMwAdpGsAHaSfAB2kvwAdpOMAHaUPAB2lPwAdpW8AHaWbAB2lwwAdpfMAHaYnAB2mXwAdpr8AHacfAB2nZwAdp38AHaenAB2nzwAdp+cAHaf/AB2oIwAdqFcAHahrAB2ofwAdqLsAHajXAB2o9wAdqYsAHao/AB2qbwAdqsMAHasbAB2rMwAdq28AHavLAB2r/wAdrDMAHaxfAB2sjwAdrL8AHazvAB2tHwAdrU8AHa1/AB2ttwAdreMAHa5HAB2uswAdrw8AHa9XAB2vtwAdr/8AHbA3AB2wVwAdsIMAHbDHAB2xRwAdsbsAHbIvAB2ywwAds1cAHbPfAB20EwAdtH8AHbTXAB21MwAdtYMAHbXbAB22OwAdto8AHbbnAB23bwAdt6cAHbfPAB24AwAduF8AHbjDAB24+wAduTMAHbmHAB25qwAdubMAHbnXAB253wAduh8AHborAB26pwAdutMAHbs7AB27awAdu9MAHbwjAB28qwAdvNsAHbz7AB29DwAdvVcAHb2TAB294wAdvisAHb5fAB2+jwAdvtsAHb8fAB2/QwAdv38AHb+zAB2/3wAdwAcAHcBfAB3ArwAdwQsAHcFDAB3BdwAdwc8AHcIfAB3CZwAdwqcAHcL3AB3DPwAdw5cAHcPnAB3EHwAdxE8AHcSbAB3E3wAdxS8AHcV7AB3FqwAdxdsAHcYHAB3GMwAdxnMAHcavAB3G2wAdxwMAHcdDAB3HXwAdx4MAHcebAB3HswAdyA8AHchXAB3InwAdyO8AHckPAB3JfwAdyccAHcoPAB3KhwAdyucAHcsXAB3LSwAdy38AHcujAB3L2wAdzC8AHcxfAB3MnwAdzN8AHc0fAB3NSwAdzXcAHc2bAB3N5wAdzh8AHc57AB3O1wAdzz8AHc+TAB3PxwAd0LcAHdEHAB3RIwAd0UMAHdFfAB3RiwAd0b8AHdHjAB3SAwAd0iMAHdKrAB3TbwAd07MAHdPLAB3UBwAd1E8AHdSPAB3UxwAd1QsAHdVTAB3VawAd1a8AHdXjAB3WDwAd1lMAHda/AB3XCwAd14MAHdfjAB3YUwAd2LcAHdjTAB3Y+wAd2S8AHdljAB3ZpwAd2ccAHdoTAB3aSwAd2rMAHdr3AB3bPwAd25sAHdvnAB3cHwAd3GcAHdy3AB3c7wAd3T8AHd1vAB3dtwAd3gcAHd5TAB3edwAd3ssAHd8HAB3fhwAd38cAHd//AB3gUwAd4GcAHeB3AB3gmwAd4QsAHeFjAB3hrwAd4fMAHeJDAB3izwAd4xMAHeM7AB3jXwAd45MAHePLAB3kPwAd5HMAHeTLAB3lDwAd5WMAHeWfAB3l4wAd5iMAHeZvAB3mqwAd5vMAHeeLAB3nwwAd5/8AHegvAB3oTwAd6IsAHekLAB3pPwAd6WMAHemfAB3p0wAd6f8AHeobAB3qbwAd6o8AHervAB3rMwAd65MAHev7AB3sWwAd7L8AHezzAB3tQwAd7ZsAHe4HAB3uRwAd718AHe+zAB3v0wAd7+8AHfAXAB3wKwAd8HsAHfEXAB3xRwAd8Y8AHfHbAB3yLwAd8ocAHfLvAB3zPwAd81cAHfOrAB3zxwAd9BsAHfQ3AB30iwAd9KcAHfUrAB31WwAd9esAHfZLAB32cwAd9tsAHfcnAB33ewAd9+MAHfhXAB34fwAd+TMAHflTAB35ZwAd+msAHfrHAB362wAd+wMAHft3AB37vwAd+/MAHfxrAB388wAd/WsAHf2PAB395wAd/icAHf53AB3++wAd/18AHf+vAB3/4wAeAAMAHgBDAB4AewAeAKMAHgDXAB4BLwAeAU8AHgGLAB4BxwAeAlMAHgLLAB4DbwAeA6MAHgQvAB4EiwAeBL8AHgUvAB4FnwAeBbsAHgY/AB4GpwAeByMAHgd3AB4HrwAeB98AHghHAB4IWwAeCIMAHgjrAB4JRwAeCW8AHgpXAB4KfwAeCqMAHgrvAB4LOwAeC3MAHgubAB4L+wAeDH8AHgzTAB4NawAeDk8AHg6XAB4OuwAeDxcAHg+DAB4PvwAeED8AHhEjAB4RawAeEbMAHhHzAB4SDwAeEisAHhJPAB4SbwAeEqMAHhL/AB4TJwAeEzcAHhNHAB4TVwAeE4MAHhPfAB4UTwAeFHsAHhTfAB4VVwAeFYsAHhXvAB4WFwAeFisAHhY7AB4WWwAeFtMAHhfTAB4YKwAeGEsAHhi3AB4ZCwAeGVsAHhlvAB4Z0wAeGiMAHho3AB4amwAeGvMAHhsnAB4bewAeG6cAHhvLAB4cEwAeHG8AHhyXAB4cvwAeHQsAHh1bAB4dqwAeHeMAHh4fAB4eywAeH08AHh+TAB4f8wAeIEsAHiCXAB4g3wAeIRcAHiFLAB4hewAeIacAHiHTAB4iWwAeIrMAHiLXAB4jEwAeI0cAHiOnAB4j3wAeJEsAHiS7AB4lBwAeJS8AHiVjAB4lpwAeJfMAHiY/AB4mZwAeJqcAHia/AB4nGwAeJ2cAHie3AB4n7wAeKA8AHigzAB4ogwAeKM8AHikDAB4pRwAeKZcAHinPAB4qDwAeKmMAHiqjAB4qzwAeKw8AHitrAB4rrwAeLDcAHiyPAB4s4wAeLUcAHi1fAB4tiwAeLccAHi4LAB4uSwAeLpcAHi73AB4vNwAeL18AHi+/AB4v+wAeMDcAHjBvAB4wjwAeMMMAHjD7AB4xLwAeMZMAHjHDAB4x7wAeMhsAHjJPAB4yfwAeMt8AHjMLAB4zawAeM5MAHjOzAB4z2wAeNAcAHjR/AB404wAeNR8AHjV/AB41xwAeNjMAHjafAB424wAeN2sAHjfbAB44XwAeONMAHjkbAB45QwAeOaMAHjnjAB46LwAeOmcAHjqzAB468wAeOzMAHjtfAB47jwAeO88AHjv/AB48KwAePG8AHjyDAB48rwAePNcAHj1fAB49lwAePdsAHj4nAB4+uwAePzMAHj9XAB4/rwAeQAsAHkBrAB5AlwAeQQMAHkFzAB5BqwAeQeMAHkJHAB5CrwAeQwcAHkNjAB5DvwAeRB8AHkRnAB5EswAeRNsAHkVPAB5FcwAeRZsAHkXjAB5GLwAeRnMAHkajAB5G2wAeRv8AHkc/AB5HewAeR9cAHkh3AB5JFwAeSacAHkofAB5KowAeSssAHkrzAB5LDwAeSzMAHktPAB5LcwAeS5sAHkvDAB5L8wAeTBsAHkxDAB5MXwAeTHcAHky3AB5M4wAeTO8AHk0TAB5NGwAeTTcAHk1XAB5NnwAeTe8AHk5/AB5OzwAeTwcAHk9DAB5PqwAeT9sAHlA/AB5QqwAeUR8AHlFbAB5RhwAeUaMAHlHvAB5SBwAeUjMAHlKHAB5SswAeUv8AHlMvAB5TiwAeVA8AHlRDAB5UrwAeVMsAHlT/AB5VLwAeVVsAHlWvAB5V5wAeVhsAHlYzAB5WSwAeVo8AHlb7AB5XKwAeV4MAHlffAB5YBwAeWE8AHlhrAB5YgwAeWLMAHljrAB5ZCwAeWWcAHlmXAB5ZxwAeWd8AHloDAB5aFwAeWicAHlovAB5ajwAeWr8AHlrjAB5bBwAeWy8AHltrAB5bkwAeW5sAHlv3AB5cTwAeXJcAHly3AB5c9wAeXSsAHl1/AB5dhwAeXY8AHl3/AB5eFwAeXj8AHl5fAB5euwAeXscAHl7jAB5e+wAeXzcAHl9vAB5f8wAeYDcAHmB3AB5g2wAeYSMAHmFTAB5hhwAeYfsAHmJ7AB5iuwAeY3cAHmPzAB5kNwAeZLcAHmT3AB5lxwAeZkMAHmaDAB5nAwAeZzcAHmdbAB5nfwAeZ+MAHmhDAB5odwAeaJcAHmjjAB5pHwAeaS8AHmk/AB5pbwAeaZ8AHmnbAB5p8wAeaiMAHmpDAB5qgwAeap8AHmq/AB5q2wAeawcAHmsrAB5rRwAea3sAHmufAB5rtwAea+MAHmvzAB5sJwAebD8AHmxbAB5scwAebJcAHmyzAB5s2wAebQcAHm0TAB5tLwAebU8AHm2HAB5uEwAebhsAHm4/AB5uewAebrcAHm7nAB5vRwAeb3sAHm+3AB5v0wAeb9sAHm/jAB5v6wAeb/MAHnBLAB5wUwAecH8AHnCjAB5wvwAecM8AHnEXAB5xRwAecWcAHnGPAB5xywAecfsAHnIjAB5yPwAecnsAHnKzAB5y7wAecvsAHnMXAB5zNwAec08AHnNnAB5zrwAec9cAHnQ3AB50awAedJsAHnTXAB51EwAedWMAHnWfAB51zwAedgMAHnZHAB52ewAedsMAHncLAB53XwAed48AHnfTAB54AwAeeEcAHniDAB54twAeePcAHnlHAB55qwAeegsAHnqHAB56xwAeezMAHnuTAB571wAefBMAHnw/AB58c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wAhbaMAIW3/ACFunwAhbvMAIW8nACFvVwAhb5cAIW+nACFvtwAhb+MAIW//ACFwHwAhcFsAIXCPACFwqwAhcNsAIXELACFxKwAhcTMAIXFfACFxkwAhcdsAIXITACFyLwAhcm8AIXKzACFzDwAhcz8AIXN/ACFznwAhdFsAIXSrACF03wAhdQMAIXVHACF1awAhdZMAIXXfACF2GwAhdl8AIXaLACF2uwAhdxcAIXdTACF3gwAhd/cAIXhXACF4owAheTcAIXlrACF50wAheg8AIXpLACF6kwAhesMAIXrzACF7NwAhe1MAIXujACF7ywAhfAcAIXw7ACF8wwAhfS8AIX1/ACF9pwAhfdsAIX4LACF+ZwAhfpsAIX7PACF/BwAhfzMAIX9rACF/hwAhf58AIX/LACGAFwAhgFcAIYCDACGAwwAhgPsAIYE3ACGBfwAhgYcAIYG/ACGB0wAhgf8AIYIfACGCPwAhgoMAIYKnACGC0wAhgt8AIYMLACGDFwAhg0cAIYOHACGD6wAhhB8AIYRTACGEowAhhMMAIYUHACGFOwAhhZMAIYW/ACGF+wAhhhcAIYZLACGGgwAhhtcAIYcDACGHXwAhh7MAIYffACGIBwAhiDMAIYhTACGIfwAhiNMAIYkHACGJLwAhiVMAIYmfACGJ5wAhigMAIYojACGKdwAhirMAIYrvACGLIwAhi38AIYufACGL1wAhjCcAIYxDACGMbwAhjJcAIYy3ACGM3wAhjP8AIY0nACGNRwAhjV8AIY1zACGNjwAhja8AIY3jACGOEwAhjlsAIY6fACGOzwAhjvcAIY8HACGPLwAhjz8AIY9fACGPkwAhj8MAIZATACGQOwAhkGsAIZCPACGQtwAhkNcAIZD/ACGRKwAhkU8AIZFrACGRhwAhkbcAIZHrACGSHwAhkksAIZKLACGSvwAhkvMAIZMHACGTMwAhk0cAIZOLACGT1wAhlCcAIZRPACGUkwAhlLsAIZT7ACGVEwAhlSsAIZWzACGV4wAhlh8AIZYzACGWXwAhlosAIZa3ACGW4wAhlxcAIZdrACGXfwAhl5MAIZfLACGYFwAhmGsAIZifACGYxwAhmO8AIZlDACGZawAhmZMAIZnLACGaOwAhmqsAIZrvACGbDwAhmy8AIZt7ACGbwwAhm+MAIZw7ACGcVwAhnHcAIZx/ACGchwAhnK8AIZzLACGc4wAhnPsAIZ03ACGddwAhnbcAIZ33ACGeMwAhnlcAIZ57ACGehwAhnpMAIZ6vACGe3wAhnycAIZ+LACGftwAhn9sAIZ/7ACGgKwAhoGMAIaCPACGg1wAhoPMAIaEXACGhSwAhoXcAIaGfACGhpwAhof8AIaInACGigwAhop8AIaLHACGi8wAhox8AIaM3ACGjPwAho1cAIaN3ACGjmwAho7cAIaPLACGj5wAhpAcAIaQvACGkZwAhpHsAIaSbACGkwwAhpQcAIaUjACGlPwAhpVsAIaXHACGl4wAhpgMAIaYfACGmUwAhpn8AIaajACGmxwAhpvcAIacrACGnbwAhp7MAIafPACGoCwAhqDcAIahbACGohwAhqMsAIaj3ACGpMwAhqWsAIamPACGptwAhqesAIaoLACGqNwAhqlcAIarDACGq5wAhqv8AIasTACGrJwAhq2MAIauHACGrrwAhq88AIavvACGsDwAhrC8AIaxPACGsdwAhrJMAIaznACGtAwAhrWsAIa2XACGtywAhrfMAIa4TACGuQwAhrncAIa6zACGu6wAhr4MAIbAHACGwJwAhsEsAIbBvACGwpwAhsO8AIbD/ACGxTwAhsi8AIbLrACGzNwAhs1cAIbOnACG0gwAhtM8AIbTrACG1OwAhtYsAIbYPACG2PwAhtpsAIbbjACG3VwAht48AIbfzACG4FwAhuEsAIbirACG4ywAhuQcAIblvACG5lwAhucsAIbo3ACG7EwAhuzcAIbtXACG74wAhvA8AIbw/ACG8awAhvIsAIbzDACG88wAhvUsAIb1vACG9kwAhvbcAIb4PACG+JwAhvlcAIb57ACG+xwAhvxcAIb9LACG/WwAhv6cAIb/bACG/8wAhwBcAIcA/ACHAZwAhwJ8AIcDDACHA3wAhwQcAIcE/ACHBdwAhwZcAIcGnACHBuwAhwc8AIcHTACHB5wAhwicAIcJTACHCkwAhwvMAIcMDACHDKwAhw0cAIcNjACHD5wAhxBsAIcRjACHEmwAhxM8AIcUDACHFUwAhxXcAIcWfACHF1wAhxisAIcZ7ACHGywAhxwcAIccvACHHfwAhx88AIcgXACHIlwAhyKcAIckHACHJgwAhyd8AIcpbACHKtwAhywMAIctLACHLfwAhy7sAIcv7ACHMzwAhzQsAIc1/ACHNtwAhzhMAIc5DACHOtwAhzycAIc9/ACHPywAhz/8AIdCDACHQ3wAh0aMAIdIHACHSVwAh0qMAIdLvACHTmwAh0/cAIdRTACHVIwAh1fcAIdZDACHWrwAh1vMAIdc3ACHXZwAh16sAIdfPACHYQwAh2G8AIdirACHY5wAh2ScAIdlrACHZwwAh2fsAIdo/ACHaXwAh2oMAIdqrACHa4wAh2wcAIdsnACHbOwAh21sAIduPACHbtwAh2+cAIdxDACHccwAh3KsAIdzbACHdKwAh3VcAId2XACHd2wAh3gcAId4zACHemwAh3uMAId9HACHfbwAh36cAId/XACHgBwAh4FMAIeBbACHgnwAh4PsAIeEjACHhSwAh4X8AIeGvACHh9wAh4h8AIeJLACHibwAh4psAIeMDACHjNwAh43cAIePDACHkFwAh5D8AIeSDACHktwAh5PsAIeUzACHlawAh5bcAIeXPACHl5wAh5icAIeZfACHmlwAh5scAIebPACHnDwAh50MAIedPACHndwAh58cAIef7ACHoTwAh6HsAIei3ACHpLwAh6Y8AIenPACHqFwAh6l8AIep/ACHqtwAh6uMAIer/ACHrVwAh658AIevrACHsKwAh7H8AIezDACHtDwAh7WcAIe2PACHtvwAh7fMAIe4jACHuVwAh7n8AIe6rACHu3wAh7wsAIe9bACHvnwAh7/cAIfAzACHwjwAh8M8AIfDnACHw9wAh8RMAIfFDACHxewAh8a8AIfH/ACHyUwAh8ocAIfOHACHzqwAh88cAIfP/ACH0MwAh9FMAIfRvACH0mwAh9PMAIfUPACH1QwAh9WMAIfWLACH2GwAh9l8AIfajACH21wAh9xMAIfdDACH3ewAh97cAIff3ACH4BwAh+BcAIfgzACH4TwAh+GsAIfiHACH41wAh+RsAIfkvACH56wAh+j8AIfpnACH6jwAh+vcAIfszACH7XwAh+4cAIfvjACH8XwAh/JcAIfznACH9IwAh/UcAIf1nACH9qwAh/csAIf4PACH+LwAh/o8AIf63ACH+5wAh/y8AIf9HACH/YwAh/4MAIf+vACH/8wAiACMAIgBTACIAgwAiAKsAIgDzACIBFwAiAYsAIgGnACIB3wAiAf8AIgI7ACICdwAiAssAIgLjACIDFwAiA0MAIgNrACIDiwAiA78AIgQDACIEJwAiBDMAIgRnACIEnwAiBNMAIgT3ACIFMwAiBWcAIgWfACIF1wAiBhcAIgZbACIGiwAiBtMAIgcbACIHNwAiB3MAIge/ACIH9wAiCBMAIghPACIItwAiCPMAIgkTACIJUwAiCZMAIgnjACIJ9wAiChsAIgpLACIKhwAiCqcAIgrLACIK/wAiCycAIgtrACILlwAiC7sAIgvjACIL/wAiDD8AIgyHACIMwwAiDOcAIg0HACINMwAiDWMAIg2jACINzwAiDfcAIg4jACIOWwAiDocAIg7DACIO6wAiDycAIg8/ACIPZwAiD48AIg+bACIPxwAiD+8AIhAbACIQnwAiEMsAIhDzACIRGwAiEUMAIhFrACIRkwAiEcMAIhHjACISMwAiEmsAIhNTACIThwAiE7sAIhPbACIT9wAiFCcAIhRPACIUZwAiFIMAIhSLACIUkwAiFMsAIhTTACIU2wAiFP8AIhUrACIVVwAiFX8AIhWjACIWowAiFs8AIhcjACIXTwAiF6MAIhfLACIYEwAiGDsAIhhbACIYcwAiGKcAIhjTACIY2wAiGQMAIhkrACIZXwAiGYcAIhmvACIZzwAiGhMAIhorACIaNwAiGkMAIhpzACIakwAiGsMAIhrPACIa9wAiGw8AIhtLACIbbwAiG4cAIhvHACIb/wAiHBcAIhxLACIccwAiHKsAIhzXACIdCwAiHT8AIh17ACIdswAiHe8AIh4bACIeSwAiHlsAIh53ACIepwAiHsMAIh7zACIfHwAiHzsAIh9fACIfjwAiH68AIh/fACIf/wAiIDcAIiBfACIgkwAiILcAIiDvACIhFwAiIT8AIiFXACIhgwAiIZ8AIiHHACIh6wAiIgcAIiJXACIidwAiIscAIiMTACIjSwAiI2sAIiOHACIjowAiI78AIiPXACIj+wAiJBsAIiQ7ACIkUwAiJG8AIiSXACIkswAiJNMAIiTfACIlFwAiJSsAIiVLACIlewAiJa8AIiXfACImEwAiJjcAIiZTACImawAiJnsAIiafACImwwAiJucAIib3ACInGwAiJ0MAIieDACInqwAiJ88AIigHACIoJwAiKD8AIihLACIoawAiKJMAIii7ACIo4wAiKPsAIikjACIpSwAiKXMAIimbACIpwwAiKesAIioTACIqOwAiKmMAIiqLACIqswAiKtsAIisDACIrKwAiK1MAIit7ACIrowAiK8sAIivzACIsGwAiLEMAIixrACIskwAiLLsAIizjACItCwAiLTMAIi1bACItgwAiLasAIi3TACIt+wAiLiMAIi5LACIucwAiLpsAIi7DACIu6wAiLxMAIi87ACIvYwAiL4sAIi+zACIv2wAiMAMAIjArACIwUwAiMHsAIjCjACIwywAiMPMAIjEbACIxQwAiMWsAIjGTACIxuwAiMeMAIjHvACIyBwAiMjsAIjJLACIybwAiMpMAIjK7ACIyywAiMvMAIjMbACIzQwAiM2sAIjN7ACIzkwAiM78AIjPnACI0DwAiNDcAIjRfACI0hwAiNK8AIjTLACI01wAiNOcAIjT/ACI1FwAiNS8AIjVHACI1WwAiNYMAIjWrACI10wAiNfsAIjYjACI2SwAiNnMAIjabACI2wwAiNusAIjcTACI3OwAiN2MAIjeLACI3swAiN9sAIjgDACI4KwAiOFMAIjh7ACI4owAiOMsAIjjzACI5GwAiOUMAIjlrACI5kwAiObsAIjnjACI6CwAiOjMAIjpbACI6gwAiOqsAIjrTACI6+wAiOyMAIjtLACI7cwAiO5sAIjvDACI76wAiPBMAIjw7ACI8YwAiPIsAIjyzACI82wAiPO8AIj0HACI9LwAiPU8AIj1rACI9nwAiPf8AIj4/ACI+dwAiPqcAIj7nACI/ZwAiP4cAIj+7ACI/5wAiQA8AIkBDACJAYwAiQIsAIkCvACJA7wAiQTMAIkFXACJBjwAiQcsAIkHrACJC3wAiQw8AIkMvACJDSwAiQ2MAIkOPACJDvwAiQ9MAIkPrACJECwAiREcAIkRjACJEzwAiRRsAIkVHACJFbwAiRZcAIkW3ACJFwwAiRf8AIkY3ACJGbwAiRp8AIkbzACJHPwAiR2cAIkejACJHwwAiR+8AIkgHACJIOwAiSH8AIkjLACJI8wAiSQsAIkmXACJJ0wAiSfsAIkoTACJKOwAiSlsAIkqDACJLJwAiS3MAIkuPACJLuwAiS98AIkwfACJMXwAiTIcAIkyzACJNDwAiTUcAIk2TACJN7wAiTicAIk5LACJOlwAiTvMAIk8jACJPSwAiT3MAIk/TACJQIwAiUIMAIlCjACJQ4wAiURsAIlFLACJRfwAiUaMAIlHXACJSIwAiUj8AIlKHACJSrwAiUu8AIlMfACJTWwAiU5sAIlO/ACJUBwAiVC8AIlRfACJUiwAiVL8AIlTnACJVLwAiVV8AIlWLACJVuwAiVecAIlYXACJWQwAiVncAIlarACJW3wAiVxsAIldPACJXjwAiWAcAIlgvACJYZwAiWI8AIljjACJZFwAiWWcAIlmTACJZywAiWd8AIlofACJanwAiWucAIlsTACJbUwAiW68AIlvbACJcMwAiXHMAIlyzACJdEwAiXTsAIl1fACJdwwAiXhMAIl43ACJebwAiXq8AIl7jACJfGwAiX1MAIl+bACJf+wAiYEsAImCHACJgtwAiYOcAImEvACJhZwAiYY8AImHLACJh8wAiYhcAImJDACJilwAiYu8AImNDACJjowAiY9cAImQHACJkSwAiZJMAImT7ACJlIwAiZV8AImWfACJl+wAiZmsAImbfACJnLwAiZ48AImfXACJoPwAiaG8AImibACJozwAiaPcAImkPACJpLwAiaVsAImmTACJpswAiafMAImofACJqZwAiarsAImrbACJq+wAiaxsAImtDACJrXwAia6MAImvDACJsSwAibIsAImy3ACJs7wAibTcAIm1rACJtiwAibcsAIm33ACJuTwAibosAIm6/ACJvJwAib1MAIm9nACJviwAib6MAIm/XACJv8wAicCsAInBPACJwowAicOsAInELACJxLwAicZcAInHPACJyAwAickMAInKLACJyzwAicwsAInM3ACJzUwAidD8AInR3ACJ0swAidNMAInUPACJ1SwAidXsAInW/ACJ17wAidgsAInZHACJ2cwAidpsAInbPACJ3AwAidzMAIndnACJ3nwAieEMAInj7ACJ5HwAieVMAInl7ACJ5owAieccAInoDACJ6JwAiekcAInqHACJ7dwAie6cAInvfACJ8VwAifNMAInz/ACJ9bwAifZsAIn3bACJ+AwAifj8AIn57ACJ+zwAify8AIn+nACJ/0wAigAMAIoAvACKAUwAigHcAIoDDACKA3wAigO8AIoELACKBMwAigV8AIoF/ACKBswAigesAIoIzACKCTwAigmcAIoKDACKCqwAigt8AIoM/ACKDYwAig4MAIoOfACKDwwAig+cAIoQnACKEgwAihKsAIoULACKFRwAihX8AIoW7ACKF3wAihhMAIoZTACKGewAihp8AIobfACKHGwAih2cAIoerACKH3wAih/MAIogjACKIUwAiiIMAIoi/ACKI3wAiiP8AIoknACKJcwAiibMAIonfACKKDwAiik8AIop3ACKKvwAiit8AIosfACKLcwAii6cAIovTACKL/wAijEcAIoxrACKMjwAijLMAIozrACKNMwAijW8AIo2XACKNwwAijecAIo4TACKOPwAijpMAIo7vACKPLwAij3sAIo/PACKP5wAikBcAIpBTACKQdwAikKcAIpDrACKRLwAikXMAIpG3ACKR9wAikkMAIpKDACKSswAikwcAIpMnACKTcwAik7MAIpQDACKUPwAilFsAIpTDACKU+wAilTMAIpV/ACKVqwAilb8AIpYPACKWWwAiln8AIpbHACKXNwAil0MAIpd/ACKXpwAil9MAIpgDACKYIwAimGMAIph3ACKYmwAimOMAIpkjACKZPwAimV8AIpmjACKZwwAime8AIpoTACKaIwAimlsAIpqfACKawwAimtsAIprvACKbGwAimzsAIptbACKbhwAim7cAIpvjACKcHwAinGsAIpynACKc7wAinRcAIp0/ACKdbwAinZcAIp2zACKd6wAinhMAIp5XACKeewAinqsAIp7LACKe1wAint8AIp7nACKe7wAinvcAIp7/ACKfBwAin1sAIp/HACKgBwAioCsAIqBnACKgowAioQ8AIqF3ACKhywAiog8AIqJTACKijwAiou8AIqMPACKjOwAio3cAIqOvACKj5wAipAMAIqRTACKkiwAipQMAIqWbACKmKwAipl8AIqajACKm2wAip08AIqfHACKoHwAiqHMAIqi/ACKpGwAiqT8AIqmHACKpwwAiqf8AIqo/ACKquwAiquMAIqsbACKriwAiq+MAIqwvACKshwAirM8AIq0XACKtXwAirXsAIq2XACKtywAiresAIq5DACKvAwAir/MAIrAXACKwOwAisHMAIrCrACKw1wAisScAIrFjACKxfwAisa8AIrHrACKyCwAiskMAIrJfACKyiwAisq8AIrLvACKzDwAiszcAIrNrACKzlwAis7sAIrQLACK0JwAitH8AIrSjACK0wwAitQsAIrU/ACK1WwAitYsAIrW/ACK17wAitksAIraDACK2ywAitwsAIrdHACK3iwAit88AIrgPACK4awAiuJMAIri7ACK41wAiuPsAIrkXACK5RwAiuY8AIrnPACK6DwAiui8AIrp7ACK6wwAiuw8AIrtjACK71wAivNcAIrz/ACK9YwAivacAIr3LACK+AwAivjMAIr53ACK+owAivtMAIr7/ACK/cwAiv6MAIr+3ACK/3wAiwAcAIsAvACLAWwAiwI8AIsCrACLA8wAiwR8AIsF/ACLBrwAiwcMAIsIDACLCLwAiwm8AIsKTACLCzwAiwvMAIsMnACLDQwAiw4cAIsQPACLETwAixGcAIsSLACLEvwAixR8AIsV3ACLFowAixeMAIsYnACLGswAixusAIsdPACLHdwAix88AIshHACLIpwAiyLsAIskHACLJUwAiyYcAIsmXACLJxwAiyj8AIsqPACLKtwAiyuMAIssTACLLRwAiy1cAIsufACLLwwAiy+cAIswLACLMLwAizF8AIsyjACLM6wAizU8AIs1nACLNfwAizbMAIs33ACLOLwAizn8AIs6fACLO4wAizzsAIs+XACLPzwAi0BcAItAvACLQQwAi0FcAItCDACLQuwAi0OMAItEbACLRYwAi0YcAItGnACLR2wAi0hsAItJPACLSgwAi0tcAItMbACLTPwAi01cAItOTACLTwwAi098AItRfACLUfwAi1OsAItV/ACLV4wAi1m8AItbXACLXYwAi19MAItgzACLYfwAi2MMAItkrACLZpwAi2dsAItovACLbOwAi2+MAItwbACLcZwAi3L8AItzfACLdVwAi3YMAIt3PACLeDwAi3lMAIt6TACLewwAi3ucAIt8jACLfmwAi3/MAIuAvACLgjwAi4MsAIuErACLhSwAi4X8AIuGfACLh0wAi4gsAIuJfACLixwAi4zMAIuN7ACLj0wAi5A8AIuRPACLkrwAi5NcAIuUHACLlKwAi5ccAIuZDACLmYwAi5pMAIubHACLndwAi55sAIufXACLoFwAi6EsAIuh/ACLoswAi6OcAIuk3ACLphwAi6ccAIunrACLqDwAi6jcAIupXACLqkwAi6q8AIurPACLrAwAi6yMAIutrACLrhwAi66sAIuu/ACLr7wAi7C8AIuxbACLshwAi7KMAIuzLACLs8wAi7RsAIu1TACLtdwAi7ZcAIu3XACLuCwAi7ksAIu6XACLu6wAi7ysAIu9DACLvWwAi76cAIu/7ACLwGwAi8D8AIvBbACLwiwAi8MMAIvEHACLxLwAi8WcAIvGnACLx3wAi8gMAIvI3ACLydwAi8q8AIvLTACLy9wAi8ycAIvNHACLzcwAi88MAIvQvACL0hwAi9N8AIvUXACL1ewAi9d8AIvYbACL2bwAi9sMAIvcnACL3iwAi9/sAIvhrACL4jwAi+NsAIvknACL5VwAi+YsAIvnbACL5/wAi+iMAIvpTACL6cwAi+pMAIvq7ACL65wAi+wcAIvsvACL7VwAi+38AIvuzACL71wAi/BcAIvwzACL8XwAi/McAIv07ACL96wAi/icAIv5PACL/TwAi/2sAIv9/ACL/mwAi/9sAIv/3ACMAEwAjAD8AIwCbACMAwwAjAPMAIwEvACMBNwAjAT8AIwJnACMD+wAjBFMAIwSfACMFdwAjBp8AIwfvACMJtwAjCisAIwr7ACMMGwAjDWMAIw3PACMODwAjDh8AIw4zACMOcwAjDy8AIxBXACMRowAjEasAIxHfACMSMwAjEmcAIxOvACMUIwAjFI8AIxTDACMU7wAjFQsAIxVfACMVkwAjFcsAIxXfACMWLwAjFmsAIxbfACMW/wAjFzcAIxdLACMXiwAjF7MAIxfLACMX/wAjGCsAIxhHACMYiwAjGTMAIxl/ACMZswAjGe8AIxoHACMaMwAjGmMAIxrLACMa+wAjGycAIxszACMbmwAjG+8AIxwbACMcTwAjHHcAIxynACMdLwAjHU8AIx2bACMeEwAjHmcAIx67ACMfDwAjHysAIx/zACMgHwAjIFMAIyB3ACMgzwAjIQMAIyEnACMhgwAjIc8AIyHrACMiCwAjIm8AIyLXACMjGwAjIz8AIyNjACMjiwAjI7sAIyQjACMkSwAjJHsAIySfACMk5wAjJUsAIyV/ACMlqwAjJdMAIyYbACMmPwAjJl8AIya/ACMm6wAjJwsAIyeDACMnuwAjJ/8AIygnACMoUwAjKGsAIyiXACMotwAjKM8AIyjzACMpFwAjKUMAIylXACMpbwAjKZMAIyoXACMqRwAjKmMAIyqLACMqzwAjKu8AIysLACMrPwAjK3MAIyu7ACMrzwAjK/MAIywjACMsfwAjLJsAIyy7ACMs3wAjLR8AIy1zACMtlwAjLfMAIy5HACMuowAjLr8AIy8XACMvrwAjMGsAIzCbACMw+wAjMTMAIzFrACMxqwAjMgcAIzJLACMygwAjMq8AIzLPACMy6wAjMycAIzNjACMzkwAjM8cAIzPjACM0FwAjNEcAIzRvACM0mwAjNOsAIzVHACM1bwAjNacAIzXbACM2GwAjNj8AIzZrACM2swAjNwsAIzcrACM3awAjN4sAIzfHACM35wAjOBsAIzhLACM4ewAjOKMAIzjLACM49wAjOSsAIzlPACM5dwAjOacAIznHACM6DwAjOkMAIzpzACM6wwAjOt8AIzsTACM7PwAjO38AIzu/ACM79wAjPBcAIzxDACM8iwAjPK8AIzzfACM9EwAjPT8AIz2DACM9wwAjPe8AIz4bACM+PwAjPmMAIz6LACM+vwAjPuMAIz8nACM/awAjP68AIz/3ACNANwAjQH8AI0DHACNBDwAjQUsAI0FvACNBewAjQZcAI0HTACNB9wAjQgsAI0I7ACNCUwAjQmsAI0KDACNCowAjQsMAI0LbACNC8wAjQwsAI0MjACNDOwAjQ1MAI0NrACNDgwAjQ5sAI0OzACND2wAjRBMAI0RPACNEiwAjRLsAI0TbACNE+wAjRR8AI0U7ACNFbwAjRYMAI0WrACNF1wAjRgMAI0YnACNGTwAjRmMAI0anACNG6wAjRx8AI0dXACNHdwAjR5cAI0e7ACNH1wAjSBMAI0hDACNIcwAjSJcAI0jHACNI8wAjSRMAI0lXACNJowAjSb8AI0n7ACNKJwAjSmMAI0qjACNKxwAjSvcAI0s/ACNLhwAjS9MAI0wfACNMawAjTK8AI0z3ACNNKwAjTW8AI02bACNN2wAjTfMAI04jACNOTwAjTnMAI06bACNOvwAjTusAI08zACNPRwAjT2cAI0/TACNP/wAjUCsAI1BfACNQfwAjUNcAI1E/ACNRfwAjUbcAI1HXACNSQwAjUpsAI1LDACNS5wAjUy8AI1NLACNTiwAjU6cAI1PvACNUJwAjVDcAI1RLACNUYwAjVH8AI1SfACNUwwAjVOsAI1UXACNVRwAjVXsAI1WzACNV7wAjVi8AI1ZzACNWuwAjVwcAI1dXACNXqwAjWAMAI1hfACNYcwAjWIcAI1jXACNZMwAjWXcAI1nPACNZ6wAjWh8AI1pjACNaowAjWtMAI1r3ACNbKwAjW1cAI1t7ACNbqwAjW+MAI1wPACNcQwAjXH8AI1y3ACNc+wAjXUcAI113ACNdrwAjXecAI143ACNefwAjXp8AI17bACNe9wAjXxMAI18/ACNfxwAjX98AI2AvACNgXwAjYHsAI2DfACNg/wAjYUMAI2HLACNiGwAjYk8AI2KLACNi2wAjYv8AI2MnACNjWwAjY4sAI2OrACNj/wAjZCsAI2RbACNkywAjZPsAI2VfACNmKwAjZn8AI2bfACNnGwAjZ0sAI2dzACNn6wAjaA8AI2hrACNo6wAjaRcAI2kzACNpUwAjaY8AI2m/ACNqGwAjaksAI2p7ACNqxwAjausAI2tnACNrmwAja8cAI2zHACNs0wAjbXsAI25LACNufwAjbp8AI27XACNvEwAjb1sAI3BbACNwhwAjcK8AI3DbACNw/wAjcS8AI3FXACNxgwAjcbMAI3HbACNyIwAjck8AI3J7ACNyrwAjcxcAI3MnACNzYwAjc88AI3P7ACN0QwAjdJ8AI3T3ACN1KwAjdWMAI3WDACN1owAjdasAI3XrACN2HwAjdjsAI3ZXACN2qwAjdvcAI3czACN3ZwAjd6MAI3gHACN4pwAjeNMAI3jzACN5CwAjeYcAI3nLACN6BwAjejcAI3pzACN6twAjes8AI3snACN7iwAje9MAI3vzACN8OwAjfGsAI3zDACN9AwAjfUcAI32XACN9xwAjfesAI33/ACN+PwAjfosAI367ACN/HwAjf0cAI393ACN/iwAjf5sAI3+7ACN/5wAjgAMAI4A7ACOAUwAjgGcAI4CLACOBXwAjgZsAI4HXACOCEwAjgjsAI4JjACOCiwAjgqMAI4KrACOCwwAjgtcAI4MDACODIwAjg1sAI4OTACOD0wAjg/cAI4P/ACOEFwAjhCsAI4RHACOEXwAjhHMAI4SjACOEywAjhO8AI4UnACOFTwAjhXcAI4WfACOFywAjhe8AI4YbACOGMwAjhlsAI4ZvACOGhwAjhpsAI4avACOG6wAjh1MAI4eXACOHywAjh/MAI4izACOJhwAjicMAI4o7ACOKXwAjio8AI4q7ACOK5wAjiw8AI4tLACOLkwAji98AI4v7ACOMJwAjjE8AI4x7ACOMmwAjjLsAI4z7ACONFwAjjYcAI423ACOOBwAjjjMAI45zACOOlwAjjqMAI46/ACOO9wAjjxcAI48vACOPUwAjj2sAI4+DACOPmwAjj7MAI4/LACOP4wAjj/cAI5AvACOQVwAjkJcAI5DDACORCwAjkTcAI5FjACORjwAjkccAI5HvACOSDwAjkj8AI5JzACOSewAjkoMAI5LXACOTAwAjk1sAI5SDACOU8wAjlUMAI5WDACOV1wAjli8AI5dHACOXrwAjl9sAI5gPACOYQwAjmIsAI5jHACOZCwAjmVsAI5n3ACOabwAjmp8AI5rjACOa+wAjmzMAI5tXACObrwAjm+cAI5wvACOcewAjnRsAI51bACOduwAjnh8AI56DACOerwAjntsAI58nACOfbwAjn8cAI5/nACOgMwAjoGMAI6CHACOgswAjoN8AI6EPACOhOwAjoXcAI6GnACOiCwAjokMAI6KDACOiswAjot8AI6O/ACOj/wAjpCsAI6RnACOkkwAjpLMAI6TzACOlFwAjpVsAI6WnACOl1wAjpg8AI6Y7ACOmVwAjppMAI6cPACOnQwAjp2sAI6e/ACOoGwAjqLcAI6krACOpUwAjqWsAI6mPACOpvwAjqecAI6oTACOqTwAjqosAI6rPACOrDwAjq1sAI6uvACOr+wAjrEcAI6x3ACOspwAjrNcAI60TACOtQwAjrWsAI623ACOt9wAjrjcAI66LACOumwAjrvMAI68HACOvPwAjr18AI6+XACOvzwAjsAMAI7AzACOwZwAjsMMAI7ETACOxZwAjsYcAI7GzACOx5wAjshMAI7JfACOyvwAjsusAI7MjACOzXwAjs6cAI7PvACO0IwAjtFsAI7SfACO04wAjtScAI7VfACO1jwAjtdcAI7YHACO2IwAjtkcAI7ZjACO2lwAjtr8AI7bXACO3JwAjt0MAI7dXACO3uwAjt9sAI7f3ACO4EwAjuDMAI7hLACO42wAjuQMAI7kzACO5ZwAjuYMAI7mrACO59wAjuicAI7qPACO6wwAjut8AI7r7ACO7JwAju1cAI7t3ACO7twAju88AI7v/ACO8KwAjvDsAI7xbACO8fwAjvKcAI7zPACO9bwAjvZsAI73bACO9+wAjvisAI75HACO+bwAjvocAI76jACO/IwAjvzMAI8AnACPATwAjwHsAI8CjACPAxwAjwNsAI8EnACPBVwAjwYsAI8GvACPB4wAjwhcAI8JTACPCdwAjwqsAI8LbACPDcwAjxGcAI8SbACPFRwAjxYsAI8ZHACPGZwAjxwsAI8cvACPHRwAjx08AI8djACPHmwAjx/MAI8grACPIcwAjyLsAI8jLACPI5wAjySsAI8lrACPJswAjyfcAI8oHACPKVwAjys8AI8rzACPLFwAjyzsAI8t/ACPLpwAjy/MAI8wzACPMlwAjzN8AI81LACPNfwAjzbcAI84TACPOVwAjzr8AI88bACPPmwAjz/cAI9B3ACPQ2wAj0WMAI9GjACPR8wAj0mMAI9KfACPS+wAj0zMAI9OLACPT0wAj1DsAI9R7ACPU2wAj1RcAI9VnACPV1wAj1fcAI9Y3ACPWlwAj1uMAI9dPACPXbwAj168AI9fvACPYPwAj2GsAI9iHACPYpwAj2NMAI9jfACPZDwAj2U8AI9mTACPZtwAj2dcAI9nzACPaHwAj2lMAI9pzACPaowAj2sMAI9rrACPbqwAj28sAI9vzACPcKwAj3F8AI9xvACPcgwAj3JcAI9yrACPcvwAj3NcAI9zvACPdBwAj3R8AI90zACPdQwAj3XsAI93LACPd5wAj3h8AI95DACPegwAj3rcAI97fACPfFwAj3+8AI+AHACPgKwAj4FcAI+BzACPgjwAj4KMAI+DPACPg8wAj4SMAI+FTACPhjwAj4dsAI+IzACPiOwAj4kMAI+JrACPiowAj4scAI+MDACPjJwAj408AI+NzACPjnwAj49MAI+QXACPkUwAj5IMAI+TTACPlJwAj5XMAI+W3ACPmAwAj5lMAI+arACPnBwAj50sAI+d/ACPntwAj58sAI+frACPoCwAj6CsAI+iLACPo4wAj6ScAI+lnACPppwAj6esAI+n/ACPqMwAj6ksAI+pvACPqiwAj6qsAI+q3ACPq3wAj6wMAI+tLACPrcwAj63sAI+uXACPrtwAj7CMAI+xHACPsdwAj7K8AI+zbACPtFwAj7S8AI+1rACPtqwAj7esAI+4LACPuNwAj7lcAI+6bACPu3wAj7wcAI+83ACPvcwAj75cAI+/XACPwCwAj8HcAI/CvACPwzwAj8N8AI/EXACPxXwAj8bMAI/H3ACPyRwAj8rcAI/L7ACPzQwAj848AI/OnACPz5wAj9CMAI/RzACP0rwAj9RsAI/WXACP1/wAj9ksAI/aXACP2zwAj9vcAI/c/ACP3dwAj99MAI/gnACP4cwAj+KMAI/jPACP5QwAj+asAI/n/ACP6SwAj+sMAI/rLACP7AwAj+x8AI/trACP7iwAj+9sAI/xPACP86wAj/RMAI/1nACP9mwAj/fsAI/43ACP+nwAj/t8AI/9LACP/jwAj//8AJAATACQAVwAkAJsAJAELACQBLwAkAX8AJAGvACQCCwAkAi8AJAJ/ACQCxwAkAzsAJANnACQDvwAkA+8AJARPACQEjwAkBPsAJAUfACQFcwAkBZcAJAXnACQGLwAkBp8AJAbXACQHOwAkB68AJAhLACQIhwAkCO8AJAkPACQJXwAkCW8AJAmvACQJ6wAkClMAJAqfACQLFwAkC3cAJAv7ACQMSwAkDL8AJA0XACQNlwAkDhMAJA6zACQO+wAkD28AJA+vACQQGwAkEG8AJBDrACQRJwAkEY8AJBG7ACQSEwAkEl8AJBLXACQTEwAkE3sAJBPjACQUbwAkFOMAJBV7ACQV0wAkFhcAJBZHACQWdwAkFucAJBePACQXwwAkF8sAJBfrACQYBwAkGEcAJBiDACQYtwAkGOMAJBj/ACQZBwAkGQ8AJBkzACQZjwAkGb8AJBn7ACQaKwAkGk8AJBpzACQakwAkGsMAJBr7ACQbAwAkG3cAJBuvACQb9wAkHCsAJBxfACQclwAkHM8AJB0TACQdQwAkHWsAJB2PACQd+wAkHjMAJB5jACQepwAkHusAJB8XACQfRwAkH28AJB/bACQgCwAkIE8AJCCTACQgvwAkIPMAJCE7ACQhcwAkIfcAJCI/ACQicwAkIrcAJCL7ACQjHwAkIzsAJCNTACQjowAkJCcAJCS/ACQlPwAkJZMAJCYbACQm2wAkJ2MAJCf/ACQogwAkKM8AJCkfACQpbwAkKZsAJCnHACQqFwAkKmsAJCrnACQrqwAkLE8AJCzfACQtLwAkLasAJC5PACQu3wAkLu8AJC9TACQvdwAkL58AJC+7ACQv8wAkL/sAJDBHACQwWwAkMHMAJDCLACQwowAkMLsAJDDTACQw3wAkMOsAJDD3ACQxAwAkMQ8AJDEnACQxPwAkMVMAJDGTACQxmwAkMccAJDHzACQyKwAkNYsAJDXTACQ5nwAkPW8AJD2XACQ+XwAkPqsAJD67ACQ+wwAkPxMAJD9HACQ/cwAkP5MAJD/jACRARwAkQOcAJEEbACRBawAkQa8AJEHLACRB6wAkQgcAJEI7ACRCdwAkQtMAJEMTACRDHwAkQ0cAJENvACRDwwAkRDcAJESLACRE1wAkRPsAJEUbACRFpwAkRlMAJEaTACRGswAkRtsAJEcnACRHawAkR8sAJEfjACRH+wAkSG8AJEibACRI5wAkSVcAJEmHACRJ6wAkSnMAJEqvACRK3wAkSwcAJEsrACRLZwAkS68AJEvvACRMJwAkTGMAJEyfACRM9wAkTSsAJE1/ACRN6wAkTisAJE5LACROkwAkTt8AJE8LACRPcwAkT6sAJE/fACRP+wAkUF8AJFDbACRREwAkUUsAJFHLACRSBwAkUiMAJFJXACRSkwAkUscAJFMTACRTdwAkU98AJFRHACRUuwAkVOcAJFVLACRVzwAkVfcAJFYLACRWKwAkVlsAJFaDACRWlwAkVrsAJFbTACRW+wAkVycAJFdjACRXowAkV7sAJFffACRYCwAkWEMAJFhXACRYkwAkWMsAJFjrACRZCwAkWTsAJFlfACRZrwAkWfcAJFojACRaVwAkWn8AJFqTACRarwAkWt8AJFsHACRbJwAkW0sAJFuTACRb2wAkXCcAJFxbACRcpwAkXP8AJF0rACRdUwAkXW8AJF2bACRd3wAkXhsAJF5PACRemwAkXu8AJF9DACRfnwAkX9sAJF/7ACRgEwAkYC8AJGBDACRgVwAkYHsAJGCfACRgxwAkYO8AJGEfACRhWwAkYZcAJGHjACRiJwAkYlcAJGJ7ACRiqwAkYtsAJGM/ACRkEwAkZEsAJGSfACRk3wAkZPcAJGUvACRlRwAkZWsAJGWrACRlywAkZgcAJGY7ACRmiwAkZtMAJGcfACRnuwAkaHMAJGi7ACRpDwAkaX8AJGmLACRqcwAkaoMAJGrPACRrIwAka2cAJGvLACRr3wAkbBMAJGwzACRsmwAkbRMAJG2zACRt4wAkbhsAJG6bACRvGwAkb0MAJG+DACRvmwAkb98AJHAPACRwXwAkcJcAJHC3ACRw9wAkcUMAJHFvACRxrwAkce8AJHIbACRyNwAkcl8AJHKLACRyuwAkcw8AJHMjACRzQwAkc1sAJHODACRz5wAkdEsAJHS7ACR1NwAkdcMAJHYHACR2dwAkdqsAJHbTACR2+wAkdycAJHdLACR3nwAkd8cAJHfzACR4KwAkeEcAJHhvACR4lwAkeLcAJHjfACR5BwAkeTMAJHlHACR5bwAkeZcAJHnXACR6RwAkelsAJHqDACR6owAkessAJHsLACR7OwAke4MAJHunACR72wAke/8AJHxTACR8XwAkfJsAJHyvACR8wwAkfNsAJHzzACR9GwAkfV8AJH13ACR9rwAkfccAJH3fACR+CwAkfhcAJH4fACR+JwAkflMAJH6XACR+swAkfucAJH8DACR/IwAkf08AJH93ACR/mwAkf8MAJIADACSAGwAkgDcAJIB7ACSAiwAkgM8AJIDbACSBIwAkgTcAJIF/ACSBlwAkgd8AJIHnACSCKwAkgkcAJIKPACSCowAkgusAJIMTACSDVwAkg2cAJIOfACSDuwAkg9MAJIP7ACSECwAkhCsAJIQ7ACSEWwAkhGsAJISLACSEnwAkhMMAJITXACSE+wAkhQ8AJIUzACSFRwAkhWsAJIV7ACSFmwAkhbsAJIXPACSGCwAkhhcAJIYjACSGPwAkhksAJIZXACSGZwAkhncAJIaHACSGlwAkhscAJIb3ACSHRwAkh1cAJIefACSHvwAkiAMAJIhbACSIlwAkiOcAJIlPACSJiwAkibsAJIoHACSKMwAkilcAJIqfACSKuwAkiusAJIsLACSLXwAki6cAJIvPACSMFwAkjHcAJIzbACSNFwAkjV8AJI2HACSNowAkjccAJI37ACSOLwAkjocAJI7LACSO6wAkjw8AJI8/ACSPjwAkj78AJJAHACSQWwAkkMcAJJEzACSRYwAkkcsAJJIXACSSOwAkkoMAJJLDACSTGwAkk1sAJJOTACST1wAklAMAJJQbACSUQwAklLsAJJUPACSVQwAklXsAJJXLACSWCwAkllsAJJazACSW5wAklxsAJJdbACSYFwAkmGsAJJinACSY+wAkmTcAJJlvACSZrwAkmdMAJJoHACSaQwAkmlcAJJqTACSa4wAkmwsAJJtfACSbzwAknBsAJJwzACSccwAknKsAJJzzACSdMwAknV8AJJ23ACSd3wAknjMAJJ6LACSfEwAkn1cAJJ+vACSgIwAkoK8AJKDfACShIwAkoYMAJKH7ACSiRwAkoqcAJKLvACSjTwAko68AJKP3ACSkawAkpNcAJKU/ACSlkwAkpfsAJKZbACSmowAkps8AJKb7ACSndwAkp+8AJKhLACSowwAkqQcAJKmDACSp+wAkqm8AJKrLACSrKwAkq1cAJKvrACSsRwAkrKsAJK0LACSthwAkrf8AJK5LACSubwAkro8AJK7XACSvEwAkr2sAJK+zACSwFwAksGMAJLDLACSxEwAksV8AJLGvACSyM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wAlRscAJUfHACVIAwAlSIMAJUk7ACVKPwAlSn8AJUsDACVLywAlTOsAJU0vACVNtwAlTn8AJU+fACVP4wAlUGsAJVFHACVRkwAlUiMAJVLvACVTMwAlU7sAJVSXACVU4wAlVXMAJVWnACVWHwAlVjsAJVZXACVWdwAlVpcAJVa3ACVW1wAlVvcAJVcXACVXNwAlV1cAJVd7ACVXnwAlV8cAJVfvACVYHwAlWE8AJViDACVYvwAlWNcAJVkLACVZFwAlWS8AJVlPACVZYwAlWYcAJVmnACVZ4wAlWj8AJVqfACVa3wAlW1sAJVt/ACVb3wAlXEMAJVyjACVdBwAlXSsAJV2LACVdswAlXhcAJV5DACVeqwAlXtcAJV8/ACVfcwAlX+MAJWAPACVgdwAlYKsAJWEbACVhPwAlYU8AJWFfACVhbwAlYX8AJWGPACVhnwAlYa8AJWG/ACVhzwAlYd8AJWHvACVh/wAlYg8AJWIfACViLwAlYj8AJWJPACViXwAlYm8AJWJ/ACVijwAlYp8AJWKvACVivwAlYs8AJWLfACVi7wAlYv8AJWMPACVjHwAlYy8AJWM/ACVjTwAlY18AJWNvACVjfwAlY48AJWOfACVjrwAlY78AJWPPACVj3wAlY+8AJWP/ACVkDwAlZB8AJWQvACVkPwAlZE8AJWRfACVkbwAlZH8AJWSPACVknwAlZK8AJWS/ACVkzwAlZN8AJWTvACVk/wAlZQ8AJWUfACVlLwAlZT8AJWVPACVlXwAlZW8AJWV/ACVljwAlZZ8AJWWvACVlvwAlZc8AJWXfACVl7wAlZf8AJWYPACVmHwAlZi8AJWY/ACVmTwAlZl8AJWZvACVmfwAlZo8AJWafACVmrwAlZr8AJWbPACVm3wAlZu8AJWb/ACVnDwAlZx8AJWcvACVnPwAlZ08AJWdfACVnbwAlZ38AJWePACVnnwAlZ68AJWe/ACVnzwAlZ98AJWfvACVn/wAlaA8AJWgfACVoLwAlaD8AJWhPACVoXwAlaG8AJWh/ACVojwAlaJ8AJWivACVovwAlaM8AJWjfACVo7wAlaP8AJWkPACVpHwAlaS8AJWk/ACVpTwAlaV8AJWlvACVpfwAlaY8AJWmfACVprwAlab8AJWnPACVp3wAlae8AJWn/ACVqDwAlah8AJWovACVqPwAlak8AJWpfACVqbwAlan8AJWqPACVqnwAlaq8AJWq/ACVqzwAlat8AJWrvACVq/wAlaw8AJWsfACVrLwAlaz8AJWtPACVrXwAla28AJWt/ACVrjwAla58AJWuvACVrvwAla88AJWvfACVr7wAla/8AJWwPACVsHwAlbC8AJWw/ACVsTwAlbF8AJWxvACVsfwAlbI8AJWyfACVsrwAlbL8AJWzPACVs3wAlbO8AJWz/ACVtDwAlbR8AJW0vACVtPwAlbU8AJW1fACVtbwAlbX8AJW2PACVtnwAlba8AJW2/ACVtzwAlbd8AJW3vACVt/wAlbg8AJW4fACVuLwAlbj8AJW5PACVuXwAlbm8AJW5/ACVujwAlbp8AJW6vACVuvwAlbs8AJW7fACVu7wAlbv8AJW8PACVvHwAlby8AJW8/ACVvTwAlb18AJW9vACVvfwAlb48AJW+fACVvrwAlb78AJW/PACVv3wAlb+8AJW//ACVwDwAlcB8AJXAvACVwPwAlcE8AJXBfACVwbwAlcH8AJXCPACVwnwAlcK8AJXC/ACVwzwAlcN8AJXDvACVw/wAlcQ8AJXEfACVxLwAlcT8AJXGTACVxpwAlceMAJXHzACVyKwAlcmcAJXLLACVy/wAlc1sAJXN3ACVztwAlc/sAJXQ/ACV0owAldMcAJXUbACV1VwAldY8AJXXDACV2HwAldocAJXbnACV3owAld/sAJXgDACV4NwAleU8AJXmzACV6xwAleycAJXxbACV82wAlffcAJX5fACV/dwAlf9sAJYD3ACWBXwAlgncAJYLbACWD9wAlhF8AJYV3ACWF2wAlhvsAJYdnACWIjwAliQMAJYorACWKnwAli78AJYwrACWNSwAljbcAJY3XACWN9wAljhcAJY43ACWOYwAljo8AJY63ACWO3wAljwsAJY8jACWPPwAlj18AJY+bACWPuwAlj98AJY//ACWQIwAlkE8AJZCjACWQxwAlkOcAJZFHACWRkwAlkcMAJZHvACWSGwAlkksAJZKLACWSowAlktMAJZMDACWTNwAlk28AJZOXACWTywAlk9MAJZQTACWUTwAllHsAJZSDACWUqwAllPMAJZUXACWVKwAllW8AJZWbACWVzwAllf8AJZY3ACWWYwAllqMAJZbvACWXMwAll4MAJZe3ACWX8wAlmDsAJZh7ACWYowAlmN8AJZknACWZZwAlmZ8AJZn3ACWaPwAlmocAJZqbACWaswAlmucAJZsXACWbYwAlm8cAJZwPACWcIwAlnEsAJZ0TACWdMwAlnWsAJZ4zACWegwAlnsMAJZ9HACWgCwAloC8AJaBzACWgkwAloMsAJaELACWhcwAlofMAJaIbACWiawAlotsAJaMrACWjxwAlpCcAJaRzACWk4wAlpO8AJaUrACWlawAlpc8AJaYXACWmSwAlpmMAJaZ/ACWmxwAlpu8AJadDACWnrwAlp7sAJagHACWoKwAlqIsAJajDACWpEwAlqTsAJamfACWprwAlqhcAJap/ACWq9wAlqyMAJatnACWrowAlq78AJavnACWsUwAlrM8AJa0HACWtEwAlrVsAJa2HACWtpwAlrbMAJa3HACWuFwAlrl8AJa57ACWuvwAlrvMAJa77ACWvOwAlr18AJa9rACWvjwAlr78AJa/bACWwKwAlsEMAJbCnACWwzwAlsRsAJbE/ACWxewAlsbsAJbHHACWx7wAlshcAJbJXACWykwAlsqsAJbLDACWy1wAlswMAJbM7ACWzawAls5cAJbPTACWz5wAltCMAJbRrACW1AwAltScAJbXbACW17wAltg8AJbZLACW2ZwAltosAJbavACW2vwAltuMAJbcDACW3LwAlt9MAJbfrACW4jwAluLMAJbmDACW6FwAlunsAJbq3ACW62wAluwMAJbsnACW7TwAlu48AJbwbACW8ywAlvPMAJb0bACW9QwAlvXMAJb2/ACW91wAlvgcAJb5zACW+pwAlvt8AJb8LACW/IwAlvzcAJb9HACW/XwAlv28AJb/PACXAJwAlwGcAJcCnACXA5wAlwSsAJcF3ACXB1wAlwj8AJcKfACXC9wAlw1cAJcObACXD4wAlxDMAJcRXACXElwAlxOsAJcTzACXFRwAlxYcAJcXPACXF7wAlxl8AJcarACXGzwAlxyMAJcdHACXHcwAlx6MAJcezACXH8wAlyBsAJcjjACXJAwAlycMAJcoLACXKHwAlyk8AJcp/ACXKqwAlyyMAJcuHACXLpwAly/8AJcw/ACXMVwAlzJ8AJczPACXNFwAlzWcAJc3HACXOJwAlznMAJc7XACXPKwAlz4MAJc+3ACXQCwAl0C8AJdCPACXQuwAl0P8AJdFnACXRxwAl0gcAJdJnACXSqwAl0sMAJdL3ACXTDwAl0zMAJdPbACXUnwAl1PMAJdUTACXVhwAl1ZMAJdWvACXV4wAl1hcAJdZTACXWfwAl1qsAJdcXACXXIwAl16sAJdgjACXYZwAl2N8AJdk/ACXZlwAl2l8AJdrfACXbGwAl23MAJdvrACXcbwAl3N8AJd0bACXdWwAl3WcAJd1zACXdvwAl3esAJd4HACXeGwAl3ncAJd6vACXfGwAl30cAJd+PACXgAwAl4D8AJeB7ACXg8wAl4UcAJeFvACXhswAl4fcAJeJTACXikwAl4tcAJeLzACXjGwAl40MAJeNjACXjgwAl4+cAJeRHACXkdwAl5JsAJeSzACXlCwAl5ScAJeVLACXlmwAl5dcAJeX/ACXmKwAl5lMAJeaLACXm2wAl5y8AJedfACXnqwAl5+8AJeg7ACXogwAl6L8AJekTACXpVwAl6ZsAJen3ACXqNwAl6nsAJesXACXrewAl69sAJewnACXscwAl7MsAJez3ACXtHwAl7VMAJe13ACXtmwAl7dcAJe33ACXuGwAl7l8AJe6fACXuwwAl7wMAJe8fACXvXwAl72cAJe+jACXvxwAl7/8AJfA3ACXwbwAl8JcAJfCzACXw0wAl8QcAJfErACXxPwAl8V8AJfG3ACXyBwAl8iMAJfIvACXyXwAl8qsAJfLjACXzOwAl81MAJfOLACXzxwAl9BsAJfRrACX1JwAl9VcAJfXnACX1+wAl9icAJfb7ACX3gwAl97cAJfhnACX40wAl+QcAJfk7ACX5bwAl+ZcAJfnXACX6jwAl+z8AJfuDACX7uwAl+88AJfvjACX7+wAl/C8AJfxzACX8owAl/OcAJf0LACX9OwAl/WsAJf2nACX98wAl/icAJf5HACX+hwAl/tsAJf8PACX/KwAl/z8AJf93ACX/1wAmAFMAJgDnACYA8wAmAU8AJgFbACYBfwAmAYsAJgGvACYBuwAmAeMAJgHzACYCJwAmAkcAJgJrACYCgwAmApsAJgLHACYC8wAmAwcAJgMfACYDQwAmA2sAJgObACYDywAmBAMAJgQ/ACYEfwAmBLsAJgTfACYFGwAmBVMAJgVvACYFjwAmBacAJgXXACYGFwAmBmMAJgaDACYG8wAmBxcAJgc3ACYHXwAmB4MAJgffACYIRwAmCLMAJgknACYJfwAmCdsAJgoTACYKNwAmClsAJgqPACYKywAmCusAJgsXACYLHwAmC08AJgvLACYL6wAmDA8AJgxDACYMbwAmDJsAJgzXACYM/wAmDR8AJg1LACYNkwAmDcMAJg3rACYOGwAmDmMAJg7PACYO/wAmDz8AJg+7ACYP4wAmEEMAJhB7ACYQrwAmENsAJhEfACYROwAmEWcAJhHDACYSCwAmEi8AJhJjACYSiwAmEqsAJhLXACYS8wAmEyMAJhNDACYTjwAmE+8AJhQ3ACYUewAmFJ8AJhTHACYU8wAmFY8AJhXnACYWLwAmFkMAJhZnACYWnwAmFr8AJhcPACYXbwAmF58AJhgPACYYQwAmGI8AJhi3ACYY5wAmGRsAJhl3ACYaAwAmGocAJhqzACYa1wAmGucAJhsTACYbWwAmG5MAJhvTACYcHwAmHEsAJhyHACYcwwAmHPsAJh07ACYdiwAmHesAJh47ACYekwAmHuMAJh8XACYfYwAmH7MAJiATACYgdwAmIMMAJiEvACYhiwAmIesAJiJHACYiiwAmIsMAJiMPACYjcwAmI8cAJiQvACYklwAmJOMAJiVLACYlpwAmJhcAJibjACYnYwAmJ4sAJienACYn2wAmKDMAJii/ACYpIwAmKesAJip3ACYqswAmKvMAJit7ACYruwAmLB8AJiyrACYtAwAmLYMAJi3zACYuiwAmLsMAJi77ACYvMwAmL48AJi/HACYv8wAmME8AJjB7ACYwrwAmMQcAJjEvACYxXwAmMZMAJjGvACYxvwAmMf8AJjIbACYyOwAmMn8AJjKbACYy2wAmMy8AJjOrACYz5wAmND8AJjR7ACY00wAmNQsAJjVnACY1owAmNgMAJjY/ACY2YwAmNosAJjajACY20wAmNx8AJjdfACY3pwAmOCsAJjgzACY4gwAmOO8AJjlLACY5owAmOdsAJjojACY6XwAmOr8AJjtDACY7ewAmO+MAJjwnACY8bwAmPNMAJj0TACY9LwAmPY8AJj3fACY+LwAmPoMAJj8jACY/fwAmQCcAJkCHACZBUwAmQe8AJkKHACZCvwAmQx8AJkN/ACZD3wAmRD8AJkRbACZEowAmRM8AJkUjACZFWwAmRacAJkX3ACZGOwAmRl8AJkaXACZG8wAmR0cAJkd3ACZHswAmR9cAJkgjACZIWwAmSI8AJkjXACZJBwAmSWsAJkmzACZKBwAmSlMAJkp/ACZKpwAmSwMAJktDACZLswAmS98AJkx/ACZMpwAmTUcAJk2nACZN4wAmTh8AJk5HACZOewAmTp8AJk6/ACZO8wAmTysAJk9PACZPhwAmT7sAJk/nACZQJwAmUFsAJlCHACZQrwAmUL8AJlDjACZREwAmUSsAJlGPACZRpwAmUdMAJlIDACZSMwAmUmMAJlKfACZS+wAmU3cAJlOXACZTwwAmU/sAJlQfACZUXwAmVKcAJlTPACZVLwAmVXcAJlWHACZVpwAmVgcAJlZDACZWYwAmVnsAJlajACZWywAmVusAJlcbACZXRwAmV4MAJlfjACZYGwAmWFsAJlibACZYxwAmWRcAJllDACZZkwAmWc8AJln3ACZaOwAmWn8AJlqbACZazwAmWyMAJltnACZbxwAmXBMAJlx7ACZcxwAmXO8AJl0jACZdhwAmXbcAJl3rACZeSwAmXl8AJl5zACZeiwAmXqcAJl7DACZe8wAmXwsAJl8rACZfTwAmX68AJl/XACZgNwAmYJ8AJmD3ACZhWwAmYa8AJmIHACZijwAmYvcAJmOjACZkIwAmZGsAJmSfACZk6wAmZTcAJmVzACZlpwAmZecAJmYDACZmSwAmZnMAJmarACZmswAmZt8AJmbzACZnDwAmZy8AJmdfACZnkwAmZ8MAJmfzACZoKwAmaGMAJmhzACZomwAmaLcAJmjTACZo/wAmaTcAJmlvACZpgwAmaacAJmnbACZqBwAmajcAJmpTACZq9wAmawMAJmtDACZrkwAma+MAJmwfACZsWwAmbJcAJmzTACZtAwAmbTMAJm1PACZtawAmbX8AJm2fACZtxwAmbe8AJm4bACZuRwAmbqsAJm7HACZu4wAmbycAJm9rACZvgwAmb9cAJnAbACZwYwAmcMsAJnGrACZx1wAmcf8AJnIvACZybwAmcq8AJnLfACZzEwAmczcAJnNfACZzhwAmc7MAJnPrACZ0EwAmdDcAJnRfACZ0jwAmdNsAJnUrACZ1cwAmdb8AJnXvACZ2GwAmdlcAJnZ/ACZ2vwAmdwsAJncrACZ3WwAmd38AJnejACZ32wAmeCsAJnhfACZ4kwAmeNsAJnk7ACZ5ewAmec8AJnojACZ6cwAmeqMAJnrTACZ7IwAme38AJnu3ACZ8DwAmfDMAJnxjACZ8rwAmfOMAJn0bACZ9TwAmfXMAJn2XACZ9uwAmfesAJn4PACZ+RwAmfoMAJn6/ACZ+/wAmfzcAJn9nACZ/hwAmf58AJn/PACaAEwAmgD8AJoCTACaAxwAmgNcAJoE/ACaBdwAmgbMAJoHzACaCVwAmgocAJoK7ACaC4wAmgw8AJoNbACaDtwAmg+MAJoQPACaEUwAmhH8AJoS3ACaE5wAmhXcAJoWXACaFswAmheMAJoZTACaGgwAmhp8AJoa3ACaGzwAmhycAJoefACaH8wAmiDcAJohnACaIlwAmiLsAJojHACaJJwAmiacAJonTACaJ6wAmihMAJopTACaKZwAminsAJoq3ACaK3wAmiwsAJosvACaLSwAmi2cAJoufACaL1wAmjBMAJoyjACaM2wAmjQcAJo03ACaNVwAmjYcAJo2zACaN4wAmjhMAJo4vACaOhwAmjrsAJo8HACaPPwAmj3sAJo+fACaPwwAmkCsAJpBjACaQqwAmkM8AJpDzACaRIwAmkVcAJpF3ACaR3wAmkkMAJpJ/ACaSqwAmkt8AJpMDACaTPwAmk2MAJpOfACaTzwAmk/8AJpRHACaUdwAmlL8AJpT/ACaVuwAmlmcAJpabACaWzwAmlwcAJpdTACaXiwAml9sAJpgjACaYYwAmmI8AJpjLACaZCwAmmT8AJpmPACaZ7wAmmhcAJppvACaamwAmmw8AJptzACabvwAmm/cAJpxHACaciwAmnNMAJp0PACadTwAmnW8AJp27ACad+wAmnkcAJp6XACae6wAmnysAJp9HACaffwAmn5sAJp/bACagUwAmoLsAJqEHACahIwAmoUsAJqGTACah3wAmojMAJqJ7ACaiowAmotMAJqL7ACajHwAmoycAJqNPACajkwAmo68AJqPjACakBwAmpFsAJqSXACalBwAmpTsAJqVTACallwAmpd8AJqX7ACamPwAmpmMAJqaTACamnwAmpxMAJqdPACandwAmp78AJqgDACaoNwAmqH8AJqi/ACao8wAmqR8AJqlbACapuwAmqhsAJqpXACarFwAmq1cAJqwbACasXwAmrJcAJqyzACatAwAmrSMAJq1HACatawAmrYsAJq3bACat/wAmrlcAJq6DACautwAmrzcAJq+XACav2wAmsEsAJrDDACaxbwAmsfMAJrKrACazCwAmsysAJrOTACaz0wAmtAsAJrRLACa0mwAmtOMAJrVDACa1dwAmtZcAJrXfACa2ZwAmtocAJrbfACa3SwAmt/cAJrgbACa4ZwAmuMcAJrlnACa5jwAmud8AJrpDACa65wAmuxsAJrtbACa7ewAmu7sAJrv/ACa8fwAmvQMAJr1TACa9ewAmvaMAJr3PACa93wAmvf8AJr4LACa+GwAmvjsAJr5HACa+WwAmvn8AJr6bACa+ywAmvuMAJr8PACa/QwAmv3sAJr+PACa/uwAmv+sAJsAzACbAcwAmwMcAJsDzACbBEwAmwacAJsIHACbCewAmwtsAJsMbACbDUwAmw6MAJsPjACbEHwAmxI8AJsUTACbFYwAmxZ8AJsXrACbGFwAmxmMAJsazACbHIwAmx6sAJsgfACbITwAmyJ8AJsjvACbJawAmyfcAJspjACbKzwAmyzMAJsuvACbMBwAmzG8AJsznACbNYwAmzc8AJs3rACbOOwAmzl8AJs6HACbOtwAmzusAJs8HACbPLwAmz1sAJs93ACbPowAmz8MAJs/rACbQEwAm0E8AJtBzACbQqwAm0P8AJtEnACbRWwAm0ZcAJtH7ACbSLwAm0msAJtLPACbTEwAm018AJtPTACbT8wAm1BcAJtRnACbUhwAm1KsAJtT7ACbVKwAm1V8AJtW/ACbV6wAm1h8AJtZ7ACbWpwAm1tsAJtc3ACbXcwAm17cAJtgjACbYYwAm2KcAJtkXACbZYwAm2bcAJtozACbaXwAm2o8AJtrrACbbHwAm21cAJtu7ACbb9wAm3DcAJtyjACbcxwAm3OcAJt0TACbdPwAm3XMAJt2nACbd2wAm3jMAJt6LACbetwAm3vcAJt83ACbfYwAm34cAJt+zACbf/wAm4EsAJuBzACbgywAm4RsAJuF7ACbhkwAm4a8AJuHXACbh9wAm4iMAJuJLACbiawAm4ocAJuLfACbjIwAm408AJuOfACbjywAm5BsAJuRHACbklwAm5LMAJuTzACblMwAm5WcAJuWnACblwwAm5gMAJuZnACbm7wAm548AJufbACboAwAm6McAJulnACbppwAm6hsAJupPACbqgwAm6r8AJut/ACbsZwAm7I8AJu0nACbtQwAm7X8AJu2rACbt3wAm7g8AJu4bACbuewAm7s8AJu7vACbvIwAm70MAJu9nACbvhwAm77cAJu/nACbwJwAm8FsAJvB7ACbwpwAm8LcAJvDXACbw+wAm8T8AJvFjACbxwwAm8f8AJvIjACbyQwAm8n8AJvK7ACby3wAm8xMAJvNrACbz8wAm9EcAJvRfACb0bwAm9K8AJvTDACb1BwAm9R8AJvVnACb1iwAm9bMAJvYHACb2QwAm9ocAJvbzACb3EwAm9ysAJvdzACb3lwAm97sAJvgPACb4RwAm+IMAJvjrACb5LwAm+XcAJvnrACb6EwAm+jMAJvpjACb6owAm+t8AJvsrACb7WwAm+5sAJvvXACb8IwAm/EMAJvxvACb8qwAm/N8AJv0fACb9TwAm/YMAJv2zACb97wAm/h8AJv5DACb+YwAm/nsAJv6jACb+ywAm/vcAJv8jACb/XwAm/5MAJv/PACb/5wAnAAcAJwBHACcAbwAnAJcAJwDfACcBLwAnAUsAJwFzACcBmwAnAecAJwH7ACcCJwAnAksAJwJzACcChwAnAt8AJwM3ACcDYwAnA9sAJwQjACcETwAnBHsAJwS3ACcE4wAnBR8AJwVnACcFkwAnBdcAJwYTACcGbwAnBpsAJwa3ACcG4wAnBx8AJwdzACcHhwAnB6sAJwg7ACcIewAnCPMAJwkvACcJewAnCecAJwobACcKXwAnCncAJwrPACcLDwAnC18AJwvXACcMWwAnDI8AJwzTACcNQwAnDYMAJw3TACcOYwAnDocAJw6vACcO5wAnDx8AJw+PACcPrwAnD+sAJxATACcQqwAnEMcAJxD3ACcRRwAnEYsAJxHvACcSLwAnEl8AJxKHACcS1wAnEycAJxOHACcT4wAnFAcAJxQvACcUcwAnFK8AJxTbACcVFwAnFVMAJxWTACcWCwAnFksAJxaHACcWzwAnFwsAJxc/ACcXbwAnF6cAJxevACcX2wAnGA8AJxg7ACcY1wAnGScAJxk3ACcZdwAnGZsAJxm/ACcaEwAnGiMAJxpjACcahwAnGqMAJxrDACca8wAnGycAJxtbACcbfwAnG58AJxvjACccBwAnHCsAJxxLACccjwAnHKMAJxzfACcdKwAnHXsAJx3LACceCwAnHjMAJx5zACcenwAnHqsAJx63ACcewwAnHs8AJx7bACce5wAnHvMAJx8PACcfKwAnH08AJx+7ACcgEwAnIEcAJyCPACcgtwAnISsAJyFXACchcwAnIZsAJyGvACchwwAnIlMAJyKDACciwwAnIvsAJyOXACcjywAnJAsAJyRLACckkwAnJMMAJyUrACclgwAnJccAJyXnACcl/wAnJicAJyY/ACcmZwAnJp8AJybHACcnAwAnJzsAJydrACcnqwAnJ+8AJyhDACcopwAnKMcAJyjjACco9wAnKT8AJynXACcqBwAnKj8AJyp7ACcqwwAnKuMAJysLACcrPwAnK6sAJywfACcsWwAnLHMAJyy7ACcs0wAnLOsAJy0zACctSwAnLZMAJy2jACctswAnLfMAJy4vACcucwAnLp8AJy63ACcvCwAnL2cAJy+7ACcv8wAnME8AJzCXACcw6wAnMUcAJzGTACcx5wAnMfMAJzI7ACcyYwAnMrMAJzOLACc0RwAnNJcAJzTXACc1EwAnNU8AJzVjACc1fwAnNZ8AJzXLACc13wAnNg8AJzaDACc2twAnNy8AJzdXACc3wwAnN/MAJzhnACc4gwAnOK8AJzkfACc5TwAnOcMAJzo3ACc6cwAnOn8AJzqnACc68wAnOyMAJztnACc7iwAnO+MAJzwTACc8NwAnPF8AJzx/ACc8owAnPOcAJz0LACc9MwAnPVsAJz2bACc9ywAnPfMAJz4XACc+TwAnPpcAJz7nACc/CwAnP0sAJz+DACc/uwAnQBcAJ0BjACdApwAnQPsAJ0FHACdBbwAnQXsAJ0GjACdBrwAnQdsAJ0IDACdCGwAnQkMAJ0KLACdCywAnQu8AJ0L3ACdDIwAnQ3MAJ0OrACdD2wAnRAsAJ0Q7ACdEdwAnRK8AJ0T7ACdFSwAnRWsAJ0W7ACdGVwAnRtMAJ0cDACdHSwAnR5MAJ0e/ACdH4wAnSCMAJ0ibACdIwwAnSPcAJ0knACdJUwAnSXsAJ0mjACdJywAnSfMAJ0oTACdKMwAnSpMAJ0q3ACdK5wAnSyMAJ0tTACdLmwAnS9sAJ0wnACdMZwAnTLMAJ0zXACdNBwAnTTsAJ01bACdNiwAnTb8AJ033ACdOLwAnTmcAJ06fACdOvwAnTvMAJ08TACdPMwAnT2MAJ0+zACdP/wAnUDsAJ1B3ACdQswAnUP8AJ1FHACdRiwAnUc8AJ1ILACdSSwAnUo8AJ1KzACdS2wAnUwcAJ1MvACdTVwAnU38AJ1OTACdTrwAnVAcAJ1R/ACdUxwAnVQ8AJ1VrACdVuwAnVh8AJ1ZfACdWhwAnVrMAJ1bPACdXAwAnV0sAJ1eTACdX1wAnWBcAJ1hnACdYtwAnWRMAJ1k/ACdZcwAnWbcAJ1njACdaHwAnWj8AJ1qLACdawwAnWw8AJ1tbACdbkwAnW9MAJ1wvACdcZwAnXIcAJ1yjACdctwAnXNMAJ1znACddCwAnXScAJ107ACddRwAnXWsAJ12HACddzwAnXfcAJ14zACdeiwAnXr8AJ18HACdfUwAnYDcAJ2BbACdgkwAnYNcAJ2EXACdhSwAnYV8AJ2HLACdiIwAnYoMAJ2L/ACdjVwAnY4MAJ2PfACdkKwAnZKcAJ2T3ACdlRwAnZbcAJ2YDACdmLwAnZnsAJ2aXACdmwwAnZycAJ2dbACdnewAnZ7cAJ2gHACdoNwAnaGcAJ2izACdo4wAnaS8AJ2lHACdpewAnaYsAJ2m3ACdp5wAnaf8AJ2oXACdqMwAnak8AJ2pvACdqwwAnawcAJ2szACdrTwAna5cAJ2vDACdsGwAnbEMAJ2xbACdsmwAnbOMAJ20TACdtRwAnbacAJ23HACdt5wAnbjcAJ257ACduxwAnbzsAJ29XACdvcwAnb6cAJ2+/ACdv1wAnb/MAJ3ALACdwIwAncD8AJ3BbACdwdwAncJMAJ3CrACdwwwAncNsAJ3DzACdxDwAncSsAJ3FHACdxYwAncX8AJ3GbACdxtwAncdMAJ3HvACdyCwAncicAJ3JDACdyXwAncnsAJ3KXACdyswAncs8AJ3LrACdzBwAncyMAJ3M/ACdzWwAnc3cAJ3OPACdzpwAnc8MAJ3PfACdz+wAndBcAJ3Q7ACd0XwAndHsAJ3SXACd0twAndNMAJ3TvACd1BwAndR8AJ3VnACd1rwAndfsAJ3ZDACd2jwAndtsAJ3cjACd3awAnd7cAJ3gDACd4TwAneJsAJ3jnACd5MwAneX8AJ3nLACd6FwAnemMAJ3qvACd6+wAne0cAJ3uPACd72wAnfCcAJ3x7ACd8xwAnfRcAJ31jACd9qwAnfecAJ34TACd+VwAnfpcAJ37TACd/GwAnf0sAJ3+TACd/2wAngAsAJ4BfACeAfwAngKcAJ4DnACeBFwAngVcAJ4F3ACeBowAngdMAJ4IDACeCPwAngnsAJ4KvACeC0wAngvsAJ4NjACeDywAnhC8AJ4SbACeE2wAnhRcAJ4VTACeFgwAnhb8AJ4X/ACeGOwAnhnsAJ4anACeG7wAnhzsAJ4dvACeHtwAnh9MAJ4f/ACeIQwAniIcAJ4jPACeI+wAniSsAJ4lfACeJmwAnidMAJ4oHACeKOwAnin8AJ4qzACeLLwAni48AJ4vPACeL/wAnjK8AJ4zvACeNNwAnjXMAJ42nACeOTwAnjvcAJ49TACePmwAnkHcAJ5DnACeRIwAnkfcAJ5LTACeTOwAnk1cAJ5ODACeUPwAnlG8AJ5SjACeU1wAnlQMAJ5UzACeVywAnlnsAJ5ajACeW8wAnl1cAJ5eTACeXwwAnl/sAJ5gzACeYQwAnmF8AJ5iDACeYnwAnmNsAJ5kLACeZMwAnmWMAJ5mLACeZrwAnmccAJ5nrACeaBwAnmjsAJ5prACeaswAnmwMAJ5s/ACebcwAnm9sAJ5wXACecTwAnnRsAJ53XACeeAwAnnqcAJ57TACee8wAnnycAJ59fACefqwAnn7sAJ5/LACef3wAnoB8AJ6AzACegcwAnoH8AJ6C7ACegzwAnoQcAJ6FjACehtwAnofMAJ6IrACeiiwAnosMAJ6MjACejRwAno5MAJ6O3ACekAwAnpEMAJ6R7ACek8wAnpScAJ6VjACelkwAnpc8AJ6XrACemNwAnpkcAJ6aHACemxwAnpvcAJ6cfACenSwAnp6MAJ6fjACeoIwAnqFsAJ6iLACeozwAnqT8AJ6mvACeqMwAnqqsAJ6s3ACerqwAnrB8AJ6xHACesbwAnrKsAJ6zbACetHwAnrUsAJ613ACetswAnrecAJ647ACeuswAnrs8AJ67vACevGwAnrz8AJ6+XACevuwAnsBMAJ7AzACewUwAnsI8AJ7DHACew7wAnsRsAJ7FzACexiwAnsdMAJ7IfACeybwAnstMAJ7MnACezXwAns4MAJ7ObACezuwAns+8AJ7QLACe0KwAntG8AJ7WfACe1zwAntfMAJ7YbACe2LwAntjsAJ7ZfACe2owAnttMAJ7cXACe3OwAnt38AJ7evACe38wAnuCsAJ7h3ACe4pwAnuN8AJ7kLACe5KwAnuUsAJ7lrACe56wAnuqMAJ7sjACe7owAnvFsAJ7zbACe9UwAnvccAJ73zACe+CwAnvjsAJ75vACe+2wAnvxsAJ79zACe/twAnwAcAJ8A3ACfAcwAnwLMAJ8DnACfBHwAnwVsAJ8GfACfB1wAnwhcAJ8JHACfCZwAnwosAJ8KrACfC+wAnwwsAJ8NLACfDjwAnw7sAJ8PnACfEKwAnxJsAJ8TvACfFswAnxgMAJ8arACfG1wAnxyMAJ8d/ACfHtwAnx88AJ8grACfIowAnyNcAJ8kvACfJmwAnyfcAJ8onACfKfwAnyusAJ8s7ACfLgwAny8MAJ8wjACfMYwAnzK8AJ80LACfNbwAnzcsAJ83bACfN6wAnzisAJ847ACfOewAnzt8AJ89HACfPswAn0CsAJ9C7ACfQ4wAn0ScAJ9FfACfRlwAn0fcAJ9JHACfSlwAn0u8AJ9NDACfTYwAn04cAJ9OrACfT4wAn1B8AJ9SHACfUwwAn1QsAJ9VTACfVrwAn1hMAJ9Y7ACfWrwAn1usAJ9cfACfXVwAn14cAJ9e7ACfX9wAn2EsAJ9iDACfYuwAn2UMAJ9m7ACfaFwAn2mMAJ9q3ACfbCwAn22MAJ9wjACfcNwAn3L8AJ92DACfdswAn3dcAJ93zACfeEwAn3kcAJ957ACfeqwAn308AJ9+fACff0wAn4BMAJ+BHACfghwAn4KMAJ+DfACfhBwAn4VMAJ+F3ACfhhwAn4bMAJ+HXACfiEwAn4ksAJ+J3ACfiqwAn4tcAJ+MTACfjQwAn43cAJ+OvACfjzwAn5AsAJ+QrACfkTwAn5G8AJ+SbACfkywAn5PcAJ+UbACflVwAn5Y8AJ+W7ACfmAwAn5kMAJ+ZnACfmhwAn5t8AJ+cbACfnQwAn52sAJ+eXACfn3wAn5/MAJ+gnACfoYwAn6I8AJ+jLACfpAwAn6RsAJ+lfACfplwAn6b8AJ+n3ACfqHwAn6lcAJ+sPACfrVwAn67MAJ+vfACfsBwAn7C8AJ+xXACfsjwAn7McAJ+zTACfs9wAn7SsAJ+1fACftiwAn7acAJ+33ACfuEwAn7l8AJ+6rACfu7wAn7zcAJ+93ACfvuwAn7/cAJ/AnACfwVwAn8IMAJ/CfACfw5wAn8TMAJ/FzACfxqwAn8fMAJ/IfACfyMwAn8osAJ/K/ACfy/wAn81MAJ/N3ACfzlwAn89cAJ/QHACf0QwAn9GsAJ/SXACf0uwAn9MMAJ/WDACf1twAn9dsAJ/X7ACf2KwAn9nMAJ/ajACf2wwAn9v8AJ/dDACf3awAn94cAJ/e3ACf35wAn+AcAJ/gzACf4iwAn+L8AJ/j3ACf5MwAn+WMAJ/mHACf5pwAn+c8AJ/oHACf6IwAn+jcAJ/pXACf6jwAn+p8AJ/rHACf65wAn+xsAJ/s3ACf7SwAn+3cAJ/vvACf8IwAn/E8AJ/xfACf8kwAn/L8AJ/zXACf9DwAn/TsAJ/1fACf9ewAn/ZcAJ/3PACf+BwAn/j8AJ/6DACf+twAn/tMAJ/8LACf/HwAn/zcAJ/8/ACf/WwAn/3MAJ/+7ACf//wAoAAcAKAAPACgAFwAoAB8AKAAnACgALwAoAEsAKACPACgAtwAoAN8AKAE3ACgBawAoAXsAKAGXACgBxwAoAe8AKAH7ACgCCwAoAi8AKAI7ACgCRwAoAmMAKAJ3ACgCrwAoAtMAKALzACgC+wAoAwMAKAMrACgDpwAoA78AKAPrACgEEwAoBC8AKASbACgFJwAoBV8AKAWrACgF6wAoBh8AKAY7ACgGTwAoBnsAKAaLACgGmwAoBrcAKAa/ACgG3wAoBvcAKAcvACgHTwAoB3cAKAeXACgHvwAoB8sAKAfnACgH/wAoCCsAKAhrACgIqwAoCMcAKAjjACgI6wAoCQsAKAknACgJQwAoCV8AKAl7ACgJlwAoCcMAKAnvACgKGwAoCkcAKApjACgKfwAoCpsAKAq3ACgK3wAoC2sAKAt3ACgLnwAoC8cAKAwHACgMJwAoDEsAKAyHACgMswAoDM8AKA0XACgNMwAoDUcAKA1nACgNdwAoDX8AKA2/ACgN6wAoDhsAKA5zACgOkwAoDtMAKA87ACgPWwAoD5MAKA+nACgP3wAoD/sAKBAnACgQSwAoEH8AKBCfACgQzwAoEPMAKBEnACgRQwAoEVMAKBFjACgRawAoEXMAKBGPACgR6wAoEhsAKBJjACgStwAoEuMAKBMLACgTQwAoE18AKBObACgTywAoE/MAKBQzACgUXwAoFL8AKBT7ACgVPwAoFWcAKBV3ACgVnwAoFccAKBXvACgWLwAoFlcAKBZzACgWpwAoFs8AKBcPACgXVwAoF4cAKBfDACgYFwAoGF8AKBibACgY1wAoGRMAKBljACgZqwAoGf8AKBpbACgazwAoGx8AKBtvACgbqwAoG78AKBvPACgb/wAoHC8AKBxfACgciwAoHMcAKBz3ACgdJwAoHWMAKB2bACgd2wAoHjMAKB6LACge+wAoH0cAKB9rACgfuwAoICMAKCBbACgglwAoINsAKCEbACghbwAoIasAKCHrACgh+wAoIg8AKCIrACgiT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wAoZzsAKGdzAChnwwAoaAcAKGgfAChoXwAoaM8AKGj7AChpTwAoacsAKGo7AChqgwAoarMAKGrvAChrTwAoa4MAKGvLAChr+wAobC8AKGx3AChsvwAobO8AKG03AChtfwAobbcAKG3bAChz2wAoc/8AKHnzACh6NwAoercAKHr/ACh7ewAoe7cAKHvfACh8EwAofB8AKHw7ACh8SwAofHMAKHyLACh8rwAofN8AKHz7ACh9UwAofbMAKH5HACh+kwAofscAKH7/ACh/XwAof/MAKIBLACiAowAogNMAKIE3ACiBTwAogW8AKIHTACiCBwAoglsAKIKbACiCuwAogvMAKIMnACiDNwAog3cAKIPDACiEFwAohGsAKISTACiErwAohX8AKIXPACiF8wAohh8AKIY3ACiGTwAohm8AKIa/ACiG3wAohycAKIdvACiHowAoh9cAKIgDACiIKwAoiGMAKIiTACiIvwAoiNsAKIkfACiJNwAoiVMAKIl3ACiJlwAoia8AKInPACiJ5wAoihMAKIovACiKTwAoimMAKIp3ACiKhwAoipcAKIqvACiK0wAoiu8AKIsPACiLLwAoi2MAKIvLACiMCwAojDsAKIy3ACiNmwAojjsAKI5LACiOXwAojmsAKI57ACiOkwAojr8AKI7rACiO9wAoj18AKI/HACiQHwAokEcAKJDLACiRQwAokVMAKJGXACiR/wAokncAKJLLACiTDwAok7MAKJQzACiUtwAolVsAKJWfACiVywAolfMAKJYfACiWQwAolncAKJajACiWswAolr8AKJbLACiW1wAolu8AKJcnACiXawAol68AKJffACiYDwAomDcAKJhfACiYkwAomOcAKJj/ACiZPwAomW8AKJmbACiZuwAomfcAKJofACiaiwAomtMAKJsLACibQwAom2MAKJvDACicBwAonDsAKJx3ACicrwAonMsAKJ0vACidQwAonYcAKJ3XACieDwAonk8AKJ6TACie3wAonv8AKJ8bACifWwAon3cAKJ+LACiftwAon8cAKJ/TACif+wAooCsAKKBTACigXwAooLcAKKDbACihAwAooSsAKKFbACihZwAooZ8AKKHbACih9wAoogMAKKIjACiiYwAooo8AKKKnACiiywAoovsAKKM3ACijXwAoo5MAKKO3ACij0wAoo+8AKKQbACikUwAopHMAKKTbACilLwAopW8AKKWnACil0wAopicAKKZ7ACimxwAopw8AKKdjACinrwAop/cAKKgvACioYwAoqJcAKKi7ACio7wAoqQ8AKKknACipQwAoqWcAKKmLACiprwAoqcMAKKn/ACiqOwAoqmMAKKqvACiq6wAoqyMAKKtjACirnwAoq9cAKKwLACisLwAorF8AKKyfACiszwAorPcAKK03ACitQwAorYcAKK2zACit2wAoriMAKK5XACiuewAorssAKK8HACivQwAor2cAKK+DACivwwAosDMAKLCvACiw6wAosRcAKLGHACix3wAosgcAKLJPACiyvwAosxcAKLOHACiz6wAotCcAKLS3ACi03wAotX8AKLYHACi2HwAotjsAKLaTACi2vwAotv8AKLc7ACi31wAouCsAKLh3ACi4xwAouQ8AKLlvACi6EwAouksAKLqXACi7ZwAou5sAKLvLACi8KwAovEsAKLyLACi8pwAovPMAKL0jACi9owAovbMAKL4HACi+pwAovs8AKL8rACi/bwAowEsAKMDfACjBIwAowYsAKMHTACjCKwAowkMAKMJzACjCiwAowrMAKML/ACjDPwAow2cAKMOPACjDwwAow+cAKMQzACjEWwAoxJcAKMTXACjE9wAoxTcAKMVnACjFkwAoxa8AKMXLACjF4wAoxiMAKMZ/ACjGxwAoxxcAKMc/ACjHawAox9cAKMgPACjIswAoyVsAKMmbACjJzwAoyhcAKMpPACjKswAoy3cAKMvbACjMRwAozG8AKMybACjM1wAozQcAKM0jACjNZwAozY8AKM2/ACjNxwAozgMAKM4XACjOPwAozm8AKM7nACjPAwAozyMAKM9XACjPdwAoz5cAKNCPACjQpwAo0McAKNDPACjQ8wAo0QsAKNFDACjRdwAo0Z8AKNHrACjSNwAo0oMAKNLPACjTFwAo02MAKNOvACjT+wAo1EMAKNSPACjU1wAo1SMAKNVrACjVtwAo1f8AKNZHACjWkwAo1t8AKNcnACjXbwAo17cAKNgDACjYSwAo2JMAKNjbACjZIwAo2W8AKNm7ACjaBwAo2k8AKNpzACjalwAo2wcAKNszACjbrwAo2/sAKNxLACjcewAo3IMAKNyjACjcuwAo3Q8AKN1HACjdfwAo3ZsAKN27ACjd4wAo3hsAKN47ACjeYwAo3rcAKN8LACjftwAo4GMAKOCPACjg7wAo4UsAKOG3ACjhzwAo4hsAKOJPACjiewAo4qcAKOK/ACjjCwAo49cAKOQbACjkYwAo5LcAKOTnACjlFwAo5TcAKOVbACjltwAo5g8AKOZDACjmcwAo5pcAKOa/ACjnQwAo53sAKOe/ACjn7wAo6CsAKOhnACjotwAo6R8AKOlLACjpjwAo6fMAKOo3ACjqkwAo6ucAKOs/ACjrcwAo668AKOv3ACjsCwAo7DsAKOx3ACjsqwAo7OcAKO7nACjvIwAo73cAKO+DACjvrwAo778AKO//ACjwRwAo8IsAKPCvACjw1wAo8RsAKPFnACjxlwAo8asAKPHjACjyGwAo8kcAKPJ7ACjyrwAo8t8AKPM3ACjzSwAo83sAKPOrACjz2wAo9A8AKPRTACj0owAo9RcAKPU3ACj1YwAo9Z8AKPXPACj1/wAo9i8AKPZzACj24wAo9x8AKPdzACj36wAo+CcAKPiHACj4vwAo+N8AKPkvACj5TwAo+XMAKPoTACj6OwAo+kcAKPprACj6nwAo+tcAKPsLACj7awAo+6MAKPvrACj8BwAo/EMAKPx7ACj8nwAo/MMAKPznACj9CwAo/S8AKP1XACj9iwAo/asAKP23ACj93wAo/fsAKP4bACj+JwAo/mMAKP6zACj+7wAo/y8AKP9/ACj/pwAo/88AKQAPACkATwApAJMAKQDrACkBDwApATMAKQF3ACkCIwApArcAKQL3ACkDTwApA28AKQRLACkFBwApBVcAKQWHACkFowApBfMAKQZ3ACkGqwApBr8AKQb3ACkHbwApCEcAKQkvACkJZwApCXcAKQm3ACkJ2wApCfMAKQoXACkKSwApCoMAKQrDACkLEwApC1MAKQujACkL4wApDBMAKQxXACkMowApDO8AKQ0nACkNWwApDZMAKQ3nACkOIwApDlMAKQ6bACkO7wApDxMAKQ9jACkPlwApD8cAKQ/zACkQLwApEF8AKRCHACkQvwApEOcAKREDACkRJwApEVcAKRGDACkRnwApEdsAKRI7ACkSmwApEsMAKRNbACkTewApE68AKRQLACkUlwApFMcAKRT3ACkVWwApFccAKRYnACkWewApFqsAKRbnACkXMwApF0MAKRdTACkYDwApGM8AKRjvACkZDwApGUMAKRlvACkZuwApGd8AKRoDACkaKwApGrsAKRrTACka/wApGwsAKRs7ACkbbwApG68AKRvfACkcawApHKMAKRznACkdEwApHUcAKR37ACkePwApHp8AKR7rACkfHwApH0MAKR+LACkgGwApIFsAKSCTACkguwApIVsAKSGTACkhxwApIgcAKSIrACkiZwApIqcAKSLTACkjEwApI0MAKSOXACkjuwApJAMAKSRPACkkewApJJ8AKSS/ACkk2wApJTMAKSU7ACklgwApJdsAKSYPACkmGwApJksAKSaDACkmqwApJtMAKSb7ACknJwApJ08AKSffACkopwApKUsAKSlXACkp3wApKe8AKSrfACkr2wApLAcAKSzjACktJwApLW8AKS2nACkt4wApLesAKS4nACkudwApLpsAKS7DACku+wApLycAKS9vACkvvwApL+cAKTATACkwjwApMMMAKTEbACkxXwApMXsAKTGfACkx4wApMgcAKTIjACkyXwApMocAKTK3ACky4wApMxMAKTMzACkzVwApM6sAKTQrACk0wwApNOsAKTUvACk1UwApNdcAKTZfACk2jwApNtMAKTc/ACk3ZwApN48AKTfHACk39wApOBcAKTg3ACk4TwApOHsAKTjTACk5FwApOUsAKTl/ACk5uwApOfMAKTobACk6QwApOmsAKTqTACk6uwApOucAKTsfACk7TwApO2sAKTuHACk7pwApO88AKTvzACk8CwApPN8AKTz7ACk9MwApPWMAKT2TACk9qwApPcMAKT3nACk9/wApPh8AKT5/ACk+owApPssAKT7vACk/GwApP0cAKT9bACk/ewApP6MAKT+3ACk/zwApP+sAKUAfAClAUwApQIcAKUCvAClA5wApQRsAKUFPAClBgwApQasAKUHnAClCIwApQl8AKUKbAClC2wApQycAKUNjAClDhwApQ9MAKUQDAClEOwApREsAKURbAClEgwApRNsAKUVLAClFlwApRbcAKUXvAClGDwApRkcAKUaTAClG/wApR08AKUePAClHwwApR9sAKUgfAClIPwApSGcAKUmbAClJowApSasAKUmzAClJvwApSdMAKUoPAClKWwApSoMAKUqvAClK5wApSysAKUtjAClLowApS+cAKUwfAClMawApTKMAKUz7AClNAwApTUcAKU1vAClNnwApTc8AKU37AClOUwApTnsAKU6bAClO0wApTw8AKU9bAClPawApT5cAKU/HAClQEwApUEsAKVCbAClQ1wApUScAKVFjAClRqwApUd8AKVIDAClSDwApUjsAKVJPAClSmwApUs8AKVMXAClTSwApU4sAKVPfAClUHwApVHMAKVSzAClU/wApVTcAKVWLAClVywApVgsAKVY3AClWfwApVrMAKVb3AClXJwApV08AKVd3AClXhwApV7cAKVfPAClYAwApWCsAKVhTAClYhwApWKcAKVj7AClZPwApWYMAKVm3AClZ6wApWgsAKVpnAClaswApWvsAKVsvAClbZwApW6sAKVvbAClcCwApXGcAKVyvACldDwApXVsAKV2HAClduwApXdcAKV4XACleQwApXmMAKV5rAClenwApXrsAKV8TAClfVwApX4sAKV+nAClf4wApYAsAKWAzAClgQwApYGcAKWCbAClg7wApYS8AKWFHAClhpwApYd8AKWJbAClilwApYxcAKWNTAClj0wApZAcAKWR/AClkiwApZN8AKWTzACllTwApZYMAKWX/AClmMwApZqsAKWbTAClnQwApZ4MAKWgHACloRwApaMsAKWkDAClpfwApab8AKWpDAClqbwApat8AKWsTAClriwApa7sAKWwvAClsPwApbJcAKWynACls/wApbRcAKW13ACltkwApbfcAKW4HACluXwApbm8AKW7HAClu5wApb0sAKW+PAClwEwApcEcAKXC7AClw2wApcT8AKXGLAClyFwApcksAKXLDACly4wApc0sAKXN7AClz7wApdAcAKXRnACl0rwApdTsAKXWHACl2FwApdisAKXaHACl2owApdwcAKXczACl3owApd7sAKXgbACl4IwApeHMAKXiPACl48wApeTcAKXm/ACl52wApej8AKXpnACl60wApeuMAKXs7ACl7RwApe5sAKXv/ACl8PwApfMMAKXzzACl9CwApfUcAKX1vACl9hwApfecAKX4PACl+ewApfrMAKX7vACl/VwApf4sAKX/DACmAJwApgGMAKYCjACmBDwApgUcAKYGDACmB6wApgicAKYJbACmCtwApgtsAKYMHACmDTwApg4cAKYPLACmD9wAphAsAKYQbACmEWwAphGsAKYSrACmEuwAphPsAKYUrACmFcwAphZ8AKYW7ACmF0wAphesAKYYLACmGUwAphn8AKYavACmGywAphucAKYcjACmHUwAph3MAKYejACmH0wApiA8AKYhTACmIvwApiP8AKYlHACmJtwApifsAKYozACmKVwApipcAKYqzACmKywApiu8AKYsPACmLKwApi1sAKYuTACmLpwApi9MAKYv3ACmMVwApjJsAKYznACmNPwApjXsAKY2rACmN8wApjjMAKY5bACmOfwApjqsAKY8zACmP8wApkK8AKZFjACmRlwApkccAKZHvACmSQwApkqsAKZLLACmTNwApk38AKZOvACmT5wAplBcAKZRLACmUhwAplKcAKZTrACmVNwAplWcAKZVzACmVewAplYMAKZWvACmV3wAplisAKZZbACmWawAplpMAKZbHACmXBwAplzMAKZdXACmXowApl/8AKZgjACmYbwApmacAKZnjACmaJwApmm8AKZqrACmaswApmucAKZu3ACmb7wApnBsAKZwzACmcTwApnHMAKZyjACmc1wApnPsAKZ0fACmdJwApnS8AKZ03ACmdPwApnU8AKZ2PACmduwApncsAKZ3TACmd2wApneMAKZ33ACmd/wApnh8AKZ4rACmeNwApnkMAKZ5PACmeWwApnmcAKZ5zACmefwApnosAKZ6XACmeowApnq8AKZ67ACmexwApntMAKZ7fACme6wApnvcAKZ8DACmfCwApnxMAKZ8jACmfKwApn18AKZ+PACmfwwApoAsAKaA/ACmgVwApoHMAKaCXACmgtwApoM8AKaDvACmhBwApoTMAKaFXACmhewApoYcAKaHHACmiFwApoisAKaJXACmijwApoq8AKaK7ACmixwApotMAKaLfACmi6wApovcAKaMDACmjDwApoxsAKaMnACmjQwApo3cAKaOXACmjswApo9sAKaP7ACmkKwAppEsAKaRrACmkrwAppOcAKaU7ACmlmwAppe8AKaY/ACmmdwAppvMAKacnACmnQwApp08AKahPACmojwApqLcAKamTACmqAwApqvsAKasfACmrYwApq4MAKaujACmrzwAprAcAKaxDACmshwAprNcAKa0jACmtpwAprd8AKa5PACmuewAprqcAKa7HACmu+wAprz8AKa9XACmvewApr6MAKa/PACmwBwApsIcAKbC/ACmxQwApsXMAKbHPACmyEwApsoMAKbKvACmy6wApszMAKbN/ACmzrwAps98AKbP/ACm0LwAptEsAKbSbACm1EwAptU8AKbWXACm14wAptf8AKbYfACm2RwAptm8AKbaTACm2rwApts8AKbb3ACm3KwApt+MAKbifACm4xwApuPsAKbk3ACm5bwApuZ8AKbm/ACm58wApuisAKbpLACm6swAputcAKbr3ACm7QwApu3MAKbufACm72wApu/sAKbwvACm8iwApvLMAKbzbACm8/wApvTsAKb1jACm9hwApvcsAKb3rACm+KwApvlMAKb6HACm+0wApvwMAKb9LACm/mwApv8MAKcAXACnAJwApwDcAKcDnACnBPwApwYsAKcHPACnCLwApwlMAKcKfACnC0wApwvcAKcMLACnDPwApw3sAKcPPACnD5wApxCcAKcRrACnExwApxQ8AKcVjACnFqwApxc8AKcXjACnF7wApxhcAKcYrACnGYwApxpMAKcbzACnHLwApx38AKcevACnH4wApyAcAKcgnACnIRwApyH8AKcjLACnI+wApyUcAKcl7ACnJpwApydsAKcn/ACnKNwApym8AKcqXACnK2wApyysAKctfACnLjwApy7sAKcvTACnL/wApzCMAKcxvACnMiwApzKsAKc0fACnNRwApzXsAKc23ACnN9wApzjsAKc5PACnOcwApzqMAKc7HACnPDwApzzsAKc9rACnPqwApz88AKc/zACnQOwAp0HMAKdDnACnRJwAp0UcAKdFXACnRkwAp0d8AKdI/ACnSjwAp0ucAKdNjACnTqwAp0/8AKdQ7ACnUZwAp1LMAKdTzACnVWwAp1XcAKdW/ACnWBwAp1isAKdZrACnWnwAp1u8AKdcbACnXOwAp15cAKdfDACnYDwAp2C8AKdhLACnYewAp2K8AKdjPACnZAwAp2VsAKdmPACnZtwAp2ecAKdo7ACnabwAp2oMAKdqnACnaxwAp2vMAKds3ACnbZwAp25MAKdvPACncCwAp3D8AKdxvACndJwAp3Z8AKd3PACneswAp3vMAKd+jACngEwAp4E8AKeCjACngzwAp4O8AKeEXACnhQwAp4ZsAKeHPACniBwAp4vMAKeOrACnkPwAp5GcAKeR7ACnktwAp5McAKeTfACnlIwAp5UcAKeVfACnlhwAp5csAKeXrACnmTwAp5nMAKea/ACnnZwAp558AKefjACnoZwAp6JcAKei3ACnoxwAp6OsAKeknACnpawAp6X8AKembACnpywAp6fcAKeoTACnqNwAp6lcAKeqLACnquwAp6vsAKes7ACnrVwAp63MAKeu/ACnsMwAp7I8AKezHACns3wAp7S8AKe1bACntewAp7cMAKe4LACnuOwAp7mMAKe6TACnu9wAp7xcAKe9bACnvmwAp7/8AKfBPACnwcwAp8JcAKfDPACnxDwAp8SsAKfFrACnxpwAp8gsAKfI7ACnyUwAp8nsAKfKPACnypwAp8scAKfLjACnzAwAp8yMAKfNLACnzcwAp858AKfPLACn0hwAp9MMAKfTfACn08wAp9RMAKfU3ACn1ZwAp9YsAKfW3ACn12wAp9hMAKfYzACn2YwAp9qMAKfbHACn24wAp9w8AKfdzACn3wwAp99cAKff7ACn4FwAp+D8AKfhXACn4ZwAp+IMAKfijACn5KwAp+VcAKfl3ACn5qwAp+dsAKfojACn6YwAp+s8AKfsLACn7MwAp+4sAKfunACn75wAp/BsAKfynACn8twAp/PMAKf0/ACn9bwAp/aMAKf4TACn+MwAp/msAKf63ACn+8wAp/0cAKf9jACn/fwAp/5MAKf+rACn/vwAp/9MAKgADACoADwAqAE8AKgBvACoAkwAqANcAKgEPACoBZwAqAdMAKgJDACoCTwAqAmcAKgJvACoCiwAqArMAKgLXACoC+wAqAxcAKgNLACoDZwAqA48AKgOnACoD1wAqBAsAKgQjACoEMwAqBFMAKgRrACoEgwAqBLcAKgTbACoE4wAqBPMAKgUbACoFLwAqBUcAKgXDACoGFwAqBmMAKgajACoHBwAqB1MAKge3ACoIIwAqCHMAKgijACoI0wAqCRsAKglLACoJwwAqCiMAKgpXACoKrwAqCwcAKgsvACoLfwAqC8MAKgwTACoMYwAqDHMAKgyTACoMrwAqDO8AKg0fACoNTwAqDX8AKg2bACoNuwAqDjcAKg5jACoOjwAqDrcAKg7/ACoPUwAqD38AKg+zACoP6wAqEC8AKhBfACoQowAqEPcAKhEnACoRVwAqEYcAKhHPACoR7wAqEicAKhJrACoShwAqErMAKhLvACoTNwAqE08AKhODACoTuwAqE9sAKhQHACoUQwAqFHsAKhTfACoVQwAqFZsAKhXvACoWPwAqFlsAKhanACoXFwAqF48AKhfzACoYHwAqGHsAKhijACoY1wAqGPsAKhk3ACoZawAqGaMAKho7ACoa/wAqG7sAKhvnACocJwAqHFcAKhyHACoc0wAqHRMAKh0jACodMwAqHYMAKh2zACod1wAqHhcAKh4rACoehwAqHqsAKh7TACoe8wAqHy8AKh97ACoftwAqH88AKiALACogUwAqIHsAKiCnACog2wAqIQ8AKiFfACohqwAqIe8AKiIrACoiXwAqIoMAKiK3ACoi8wAqIyMAKiNjACojnwAqI/sAKiQ3ACokawAqJM8AKiT/AColNwAqJZsAKiXDAComFwAqJk8AKiazACom8wAqJ18AKieTACon8wAqKDsAKiirACoo6wAqKVcAKim/ACoqSwAqKosAKir3ACorMwAqK5cAKiwDACoslwAqLMsAKi0rACotcwAqLbsAKi4zACouawAqLncAKi7fACovOwAqL5cAKi/jACowLwAqMJsAKjC/ACowywAqMSMAKjGPACox8wAqMlsAKjK/ACozHwAqM1MAKjObACo0AwAqNHMAKjTbACo1SwAqNXMAKjXDACo2AwAqNi8AKjZvACo2kwAqNrsAKjcTACo3UwAqN58AKjfPACo5rwAqOfcAKjofACo6uwAqO2cAKjuPACo7swAqO98AKjwnACo8dwAqPMsAKj0LACo9OwAqPWMAKj2LACo9swAqPdsAKj4DACo+FwAqPicAKj43ACo+XwAqPocAKj6vACo+1wAqPv8AKj83ACo/mwAqQA8AKkAzACpAUwAqQG8AKkB7ACpAiwAqQJsAKkCrACpAwwAqQNMAKkD/ACpBGwAqQTcAKkF/ACpB4wAqQjsAKkJ3ACpCwwAqQu8AKkMjACpDQwAqQ2MAKkPvACpEEwAqREsAKkSHACpEswAqRNcAKkULACpFJwAqRWcAKkWnACpFzwAqRfMAKkYfACpGowAqRy8AKkdjACpHswAqSAsAKkhDACpIewAqSN8AKkkjACpJUwAqSXMAKkn3ACpKEwAqSjcAKkp7ACpLCwAqS1sAKkuzACpLzwAqTLsAKk0PACpNSwAqTasAKk2zACpN9wAqTksAKk63ACpO7wAqTycAKk9/ACpQAwAqUB8AKlBHACpQuwAqUPMAKlF7ACpRmwAqUc8AKlILACpSNwAqUl8AKlKHACpSkwAqUr8AKlLjACpTKwAqU1sAKlOfACpTswAqU98AKlRzACpUqwAqVNcAKlUjACpVTwAqVX8AKlWnACpV1wAqVgsAKlYzACpWXwAqVosAKlaTACpWnwAqVv8AKlcjACpXVwAqV3cAKlezACpYLwAqWQ8AKllHACpZfwAqWmcAKlsPACpbdwAqW6sAKlwDACpcVwAqXIsAKlzfACpc+wAqXRsAKl1TACpdjwAqXeMAKl4jACpebwAqXqcAKl8HACpfZwAqX7cAKmAHACpgQwAqYFcAKmB/ACphFwAqYZsAKmJXACpi3wAqY5MAKmQfACpkowAqZVsAKmYHACpmkwAqZvsAKmdXACpn3wAqaMMAKmmvACpqmwAqa2sAKmwvACptCwAqbc8AKm5/ACpvIwAqb+MAKnCDACpxgwAqclsAKnMLACpz7wAqdOMAKnXXACp2ewAqd1MAKngfACp4xwAqeasAKnprACp64wAqe2cAKnvnACp8hwAqfSMAKn23ACp+SwAqfusAKn+TACqAIwAqgI8AKoEXACqBuwAqgjsAKoLLACqDPwAqg8sAKoRDACqE0wAqhXcAKoYrACqHJwAqiAMAKoinACqJSwAqiecAKoqjACqLawAqjCMAKozDACqNXwAqji8AKo7HACqPiwAqkF8AKpETACqR0wAqkm8AKpNTACqULwAqlRsAKpXbACqWqwAql4sAKphbACqZLwAqmc8AKppnACqa5wAqm28AKpwnACqcuwAqnXMAKp3rACqeawAqn0sAKp+7ACqgPwAqoKsAKqE7ACqiLwAqou8AKqO7ACqkiwAqpWMAKqY7ACqnIwAqp+cAKqhLACqpLwAqqccAKqq3ACqriwAqrHMAKq1TACquOwAqrvsAKq9rACqwVwAqsTsAKrH7ACqy0wAqs5cAKrQ7ACq00wAqtW8AKrYHACq23wAqt6sAKrifACq5lwAqumMAKrsnACq8FwAqvSMAKr3fACq+lwAqv48AKsBrACrBMwAqwgsAKsMfACrECwAqxMMAKsVvACrGbwAqxzsAKsgzACrI6wAqyeMAKsqbACrLfwAqzDsAKsz/ACrNuwAqzl8AKs8HACrPpwAq0A8AKtCnACrROwAq0d8AKtJ7ACrTRwAq09MAKtR/ACrVAwAq1a8AKtaPACrXNwAq1/8AKtifACrZWwAq2gsAKtrTACrbiwAq3EsAKtznACrdlwAq3l8AKt7rACrflwAq4HcAKuFjACriHwAq4psAKuOXACrkUwAq5PMAKuWfACrmmwAq55cAKuiDACrpcwAq6m8AKutjACrsXwAq7U8AKu4nACru6wAq74cAKvBnACrxWwAq8k8AKvMLACrzpwAq9EMAKvU3ACr2LwAq9xsAKvfvACr4uwAq+ZcAKvqXACr7qwAq/McAKv3jACr+kwAq/4cAKwBfACsBdwArAkcAKwM7ACsEDwArBOcAKwXrACsG0wArB8sAKwi/ACsJnwArCnsAKwtfACsMZwArDUsAKw4jACsPDwArD+sAKxDXACsRqwArEq8AKxOnACsUhwArFW8AKxYvACsW5wArF7cAKxhvACsZYwArGksAKxsXACsb9wArHKcAKx1/ACseEwArHzMAKx+rACsgewArITMAKyHPACsilwArI1MAKyQPACskqwArJVcAKyYLACsm4wArJ7cAKyg7ACsowwArKWsAKyoLACsqhwArKy8AKyvTACssewArLRMAKy2rACsuSwArLw8AKy/bACswmwArMT8AKzH7ACsyowArMxsAKzO/ACs0dwArNUMAKzXvACs2rwArN2sAKzgrACs5GwArObsAKzqDACs7WwArPDMAKzzrACs9swArPncAKz8jACs/0wArQFMAK0E3ACtB/wArQucAK0O/ACtEewArRVMAK0YLACtG1wArR6sAK0ifACtJewArSk8AK0sLACtLqwArTFsAK0znACtNjwArTicAK07zACtPnwArUGsAK1EbACtRxwArUmcAK1L3ACtTgwArVCMAK1SzACtVOwArVgMAK1bjACtX1wArWHsAK1kzACtZ4wArWqcAK1tvACtb8wArXJMAK11LACteLwArXscAK1+DACtgMwArYSMAK2HXACtigwArY0MAK2P7ACtk1wArZYsAK2aPACtnZwAraEsAK2k3ACtqHwAraucAK2vHACtsrwArbaMAK25nACtvYwArcHMAK3FjACtyPwArcucAK3OzACt0jwArdTcAK3XPACt2gwArdysAK3e/ACt4VwAreOsAK3mfACt6KwArevMAK3t7ACt8AwArfKcAK31TACt9+wArfn8AK383ACuAAwArgMcAK4FvACuCMwArgvcAK4OXACuEWwArhRMAK4XHACuGewArh0MAK4f7ACuImwAriUsAK4ovACuLMwArjC8AK40jACuN9wArjusAK4/XACuQlwArkT8AK5ILACuSuwArk2MAK5QjACuU+wArlZsAK5Y/ACuW/wArl7sAK5hDACuYywArmV8AK5nvACuaqwArm5cAK5xPACuc4wArnd8AK563ACufiwAroJMAK6FrACuiHwArot8AK6O7ACukiwArpUcAK6YPACumqwArpzMAK6fLACuofwArqXsAK6pnACurTwArq+sAK6x7ACutGwArrbsAK65PACuu7wArr5cAK7AvACuwwwArsYcAK7JHACuy1wArs2MAK7QbACu0+wArta8AK7ZbACu25wArt6MAK7hfACu5NwAruecAK7prACu7MwAru+cAK7xPACu9LwArvcMAK747ACu+qwArvxsAK7+HACu/9wArwG8AK8DfACvBawArwe8AK8JjACvDBwArw78AK8QvACvErwArxW8AK8X3ACvGhwArxxcAK8e3ACvIVwAryOsAK8ljACvJkwArycsAK8nrACvKGwAryj8AK8pzACvKrwAryvMAK8svACvLYwAry68AK8vPACvL9wArzHWNvbXBpbGVyLmJpbi5kYXJ0MmpzZGFydDJqcy5jbWRsaW5lRnV0dXJldXRmOExpbmVTcGxpdHRlcmV4aXRGaWxlRmlsZU1vZGVQbGF0Zm9ybXN0ZGluc3RkZXJySXNvbGF0ZWZlYXBpQ29tcGlsZXJPcHRpb25zc3RhY2tUcmFjZUZpbGVQcmVmaXhIYW5kbGVPcHRpb25kYXRhRXhpdEZ1bmNleGl0Q29kZUNvbXBpbGVGdW5jY29tcGlsZXJPcHRpb25zY29tcGlsZXJJbnB1dGNvbXBpbGVyRGlhZ25vc3RpY3Njb21waWxlck91dHB1dE9wdGlvbkhhbmRsZXJwYXR0ZXJuX2hhbmRsZW11bHRpcGxlQXJndW1lbnRzaGFuZGxlYXJndW1lbnRjYWxsQWJvcnRMZWdtZXNzYWdldG9TdHJpbmdBYm9ydGVkIGR1ZSB0byAtLXRocm93LW9uLWVycm9yOiBfRXhpdFNpZ25hbFJlYWRTdHJhdGVneWluZGV4X25hbWV2YWx1ZXNSZWFkU3RyYXRlZ3kuZnJvbURhcnRSZWFkU3RyYXRlZ3kuZnJvbURhdGFSZWFkU3RyYXRlZ3kuZnJvbUNvZGVnZW5mcm9tRGFydGZyb21EYXRhZnJvbUNvZGVnZW5Xcml0ZVN0cmF0ZWd5V3JpdGVTdHJhdGVneS50b0tlcm5lbFdyaXRlU3RyYXRlZ3kudG9EYXRhV3JpdGVTdHJhdGVneS50b0NvZGVnZW5Xcml0ZVN0cmF0ZWd5LnRvSnN0b0tlcm5lbHRvRGF0YXRvQ29kZWdlbnRvSnNfZGVmYXVsdFNwZWNpZmljYXRpb25VcmkuLi8uLi8uLi8uLi9zZGsvbGliL2xpYnJhcmllcy5qc29uT1VUUFVUX0xBTkdVQUdFX0RBUlREYXJ0QlVJTERfSURkaWFnbm9zdGljSGFuZGxlcmV4aXRGdW5jY29tcGlsZUZ1bmNlbmFibGVXcml0ZVN0cmluZ19FWElUX1NJR05BTGV4dHJhY3RQYXJhbWV0ZXJpc09wdGlvbmFsQXJndW1lbnRtXigtW2EtekEtWl18LS0uKz0pKC4qKWZpcnN0TWF0Y2g9PVVua25vd24gb3B0aW9uICIiLltdZXh0cmFjdFBhdGhpc0RpcmVjdG9yeXBhdGhlbmRzV2l0aC9wYXJzZUNvbW1hbmRMaW5laGFuZGxlcnNhcmd2cGF0dGVybnNoYW5kbGVyYWRkXihqb2luKSR8XigpJGFyZ3VtZW50c2l0ZXJhdG9ybW92ZU5leHRjdXJyZW50bWF0Y2hncm91cENvdW50bGVuZ3RoaTwrSW50ZXJuYWwgZXJyb3I6ICIiIGRpZCBub3QgbWF0Y2hjb21waWxla2VybmVsSW5pdGlhbGl6ZWRDb21waWxlclN0YXRld2FsbGNsb2Nrc3RhcnRsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpcmVzb2x2ZWxpYi9saWJyYXJpZXMuanNvbm91dHB1dFNwZWNpZmllZG91dHNvdXJjZU1hcE91dHJlYWREYXRhVXJpd3JpdGVEYXRhVXJpcmVhZENvZGVnZW5Vcml3cml0ZUNvZGVnZW5Vcmljb2RlZ2VuU2hhcmRjb2RlZ2VuU2hhcmRzYmF6ZWxQYXRoc3BhY2thZ2VDb25maWdwYWNrYWdlUm9vdG9wdGlvbnN3YW50SGVscHdhbnRWZXJzaW9udHJ1c3RUeXBlQW5ub3RhdGlvbnNjaGVja2VkTW9kZXN0cm9uZ01vZGVoaW50c3ZlcmJvc2V0aHJvd09uRXJyb3J0aHJvd09uRXJyb3JDb3VudHNob3dXYXJuaW5nc3Nob3dIaW50c2VuYWJsZUNvbG9yc29wdGltaXphdGlvbkxldmVscGxhdGZvcm1CaW5hcmllc2Vudmlyb25tZW50cmVhZFN0cmF0ZWd5d3JpdGVTdHJhdGVneXBhc3NUaHJvdWdoaWdub3JlT3B0aW9uLS1idWlsZC1pZD1zZXRMaWJyYXJ5U3BlY2lmaWNhdGlvblVyaXNldFBhY2thZ2VSb290c2V0UGFja2FnZUNvbmZpZ3NldE91dHB1dC1vRXJyb3I6IE1pc3NpbmcgZmlsZSBhZnRlciAtbyBvcHRpb24uc2V0T3B0aW1pemF0aW9uTGV2ZWx2YWx1ZT5FcnJvcjogVW5zdXBwb3J0ZWQgb3B0aW1pemF0aW9uIGxldmVsICcnLCBzdXBwb3J0ZWQgbGV2ZWxzIGFyZTogMCwgMSwgMiwgMywgNHNldE91dHB1dFR5cGUtLW91dHB1dC10eXBlPWRhcnQtLW91dHB1dC10eXBlPWRhcnQtbXVsdGktLW91dHB1dC10eXBlPWRhcnQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gSXQgd2FzIGRlcHJlY2F0ZWQgc2luY2UgRGFydCAxLjExIGFuZCByZW1vdmVkIGluIERhcnQgMS4xOS5zZXRTdHJpcE9wdGlvbiAnLS1mb3JjZS1zdHJpcCcgaXMgbm90IGluIHVzZSBub3cgdGhhdC0tb3V0cHV0LXR5cGU9ZGFydCBpcyBubyBsb25nZXIgc3VwcG9ydGVkLnNldEJhemVsUGF0aHNwYXRoc2FkZEFsbHNwbGl0LGdldERlcHNPdXRwdXRzb3VyY2VGaWxlc2ZpbGVuYW1lc21hcHVyaXRvTGlzdHNvcnQKc2V0QWxsb3dOYXRpdmVFeHRlbnNpb25zT3B0aW9uICctLWFsbG93LW5hdGl2ZS1leHRlbnNpb25zJyBpcyBub3Qgc3VwcG9ydGVkLnNldFZlcmJvc2VfLS12ZXJib3Nlc2V0VHJ1c3RUeXBlQW5ub3RhdGlvbnNzZXRDaGVja2VkTW9kZWFkZEluRW52aXJvbm1lbnRlcUluZGV4aW5kZXhPZj1uYW1lc3Vic3RyaW5nW109c2V0Q2F0ZWdvcmllc2NhdGVnb3JpZXNpc1NlcnZlck1vZGVzaW5nbGVTZXJ2ZXJUaGUgLS1jYXRlZ29yaWVzIGZsYWcgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSBkZWxldGVkIGluIGEgZnV0dXJlIHJlbGVhc2UsIHBsZWFzZSB1c2UgJy0tc2VydmVyLW1vZGUnIGluc3RlYWQgb2YgJy0tY2F0ZWdvcmllcz1TZXJ2ZXInLlRoZSAtLWNhdGVnb3JpZXMgZmxhZyBpcyBkZXByZWNhdGVkLCBzZWUgdGhlIHVzYWdlIGZvciBkZXRhaWxzLnNldFBsYXRmb3JtQmluYXJpZXNzZXRSZWFkRGF0YS0tcmVhZC1kYXRhc2V0RGlsbERlcGVuZGVuY2llc2RlcGVuZGVuY2llc3VyaURlcGVuZGVuY2llc3NwbGl0TWFwSm9pbm9uTWF0Y2hvbk5vbk1hdGNocC0tZGlsbC1kZXBlbmRlbmNpZXNzZXRDZmVPbmx5Q2Fubm90IHVzZSAtLWNmZS1vbmx5IGFuZCB3cml0ZSBzZXJpYWxpemVkIGRhdGEgc2ltdWx0YW5lb3VzbHkuYW5kIHdyaXRlIHNlcmlhbGl6ZWQgY29kZWdlbiBzaW11bHRhbmVvdXNseS5zZXRSZWFkQ29kZWdlbi0tcmVhZC1jb2RlZ2Vuc2V0V3JpdGVEYXRhQ2Fubm90IHdyaXRlIHNlcmlhbGl6ZWQgZGF0YSBhbmQgY29kZWdlbiBzaW11bHRhbmVvdXNseS4tLXdyaXRlLWRhdGFzZXRXcml0ZUNvZGVnZW5DYW5ub3Qgd3JpdGUgc2VyaWFsaXplZCBkYXRhIGFuZCBjb2RlZ2VuIGRhdGEgc2ltdWx0YW5lb3VzbHkuLS13cml0ZS1jb2RlZ2Vuc2V0Q29kZWdlblNoYXJkc2V0Q29kZWdlblNoYXJkc3NldER1bXBJbmZvLS1kdW1wLWluZm89anNvbj1iaW5hcnlFcnJvcjogVW5zdXBwb3J0ZWQgZHVtcC1pbmZvIGZvcm1hdCAnc3VwcG9ydGVkIGZvcm1hdHMgYXJlOiBqc29uIG9yIGJpbmFyeWhhbmRsZVRocm93T25FcnJvcnBhcmFtZXRlcmNvdW50aGFuZGxlU2hvcnRPcHRpb25zc2hvcnRPcHRpb25zc2hvcnRPcHRpb252aD9jLS1lbmFibGUtY2hlY2tlZC1tb2RlLS1taW5pZnktW2Nodm0/XSstLXRocm93LW9uLWVycm9yKD86PVswLTldKyk/LS1zdXBwcmVzcy13YXJuaW5ncy0tZmF0YWwtd2FybmluZ3MtLXN1cHByZXNzLWhpbnRzLS1vdXRwdXQtdHlwZT1kYXJ0fC0tb3V0cHV0LXR5cGU9ZGFydC1tdWx0aXwtLW91dHB1dC10eXBlPWpzLS11c2Uta2VybmVsLS1wbGF0Zm9ybS1iaW5hcmllcz0uKy0tbm8tZnJlcXVlbmN5LWJhc2VkLW1pbmlmaWNhdGlvbi0tc2hvdy1pbnRlcm5hbC1wcm9ncmVzcy0tdmVyc2lvbi0tbGlicmFyeS1yb290PS4rLS1saWJyYXJpZXMtc3BlYz0uKz0uK3wtLWNvZGVnZW4tc2hhcmQtLWNvZGVnZW4tc2hhcmRzLS1kZWJ1Zy1nbG9iYWwtaW5mZXJlbmNlLS1vdXQ9Lit8LW8uKi1PLiotLWFsbG93LW1vY2stY29tcGlsYXRpb24tLWZhc3Qtc3RhcnR1cC0tZ2VuZXJpYy1tZXRob2Qtc3ludGF4LS1pbml0aWFsaXppbmctZm9ybWFsLWFjY2Vzcy0tbm8tbWluaWZ5LS1wcmVzZXJ2ZS11cmlzLS1mb3JjZS1zdHJpcD0uKi0tZGlzYWJsZS1kaWFnbm9zdGljLWNvbG9ycy0tZW5hYmxlLWRpYWdub3N0aWMtY29sb3JzLS1lbmFibGVbXy1dY2hlY2tlZFtfLV1tb2RlfC0tY2hlY2tlZC0tZW5hYmxlLWFzc2VydHMtLXRydXN0LXR5cGUtYW5ub3RhdGlvbnMtLXRydXN0LXByaW1pdGl2ZXMtLWV4cGVyaW1lbnRhbC10cnVzdC1qcy1pbnRlcm9wLXR5cGUtYW5ub3RhdGlvbnMtLWhlbHB8L1w/fC9oLS1wYWNrYWdlcz0uKy0tcGFja2FnZS1yb290PS4rfC1wListLW5vLXNvdXJjZS1tYXBzLS1yZXNvbHV0aW9uLWlucHV0PS4rLS1iYXplbC1wYXRocz0uKy0tcmVzb2x2ZS1vbmx5LS1kaXNhYmxlLW5hdGl2ZS1saXZlLXR5cGUtYW5hbHlzaXMtLWNhdGVnb3JpZXM9LiotLWRpc2FibGUtaW5saW5pbmctLWRpc2FibGUtcHJvZ3JhbS1zcGxpdC0tZGlzYWJsZS10eXBlLWluZmVyZW5jZS0tdXNlLXRyaXZpYWwtYWJzdHJhY3QtdmFsdWUtZG9tYWluLS1kaXNhYmxlLXJ0aS1vcHRpbWl6YXRpb24tLXRlcnNlLS1kZWZlcnJlZC1tYXA9ListLW5ldy1kZWZlcnJlZC1zcGxpdC0tcmVwb3J0LWludmFsaWQtZGVmZXJyZWQtdHlwZXMtLWRpc2FsbG93LXVuc2FmZS1ldmFsLS1zaG93LXBhY2thZ2Utd2FybmluZ3N8LS1zaG93LXBhY2thZ2Utd2FybmluZ3M9LiotLWVuYWJsZS1leHBlcmltZW50fC0tZW5hYmxlLWV4cGVyaW1lbnQ9LiotLWNzcC0tZW5hYmxlLWV4cGVyaW1lbnRhbC1taXJyb3JzLS1hc3NlcnQtbWVzc2FnZS0tc3Ryb25nLS1wcmV2aWV3LWRhcnQtMi0tb21pdC1pbXBsaWNpdC1jaGVja3MtLW9taXQtYXMtY2FzdHMtLWxheC1ydW50aW1lLXR5cGUtdG8tc3RyaW5nLS1iZW5jaG1hcmtpbmctcHJvZHVjdGlvbi0tYmVuY2htYXJraW5nLXgtLWNvbmRpdGlvbmFsLWRpcmVjdGl2ZXMtLWVuYWJsZS1hc3luYy0tZW5hYmxlLW51bGwtYXdhcmUtb3BlcmF0b3JzLS1lbmFibGUtZW51bS0tZ2VuZXJhdGUtY29kZS13aXRoLWNvbXBpbGUtdGltZS1lcnJvcnMtLXVzZS1tdWx0aS1zb3VyY2UtaW5mby0tdXNlLW5ldy1zb3VyY2UtaW5mby0tdGVzdC1tb2RlLS1leHBlcmltZW50YWwtdHJhY2stYWxsb2NhdGlvbnMtLWV4cGVyaW1lbnRhbC1hbGxvY2F0aW9ucy1wYXRoLS1leHBlcmltZW50LWNvZGUtMS0tZXhwZXJpbWVudC1jb2RlLTItLWV4cGVyaW1lbnQtY29kZS0zLS1leHBlcmltZW50LWNhbGwtaW5zdHJ1bWVudGF0aW9uLS1leHBlcmltZW50LW5ldy1ydGktRC4rPS4qLS4qVW5rbm93biBvcHRpb24gJycuLippbnB1dFByb3ZpZGVyJyBpcyBub3QgbmVlZGVkIGluIERhcnQgMi4wLiBUbyBlbmFibGUgYXNzZXJ0aW9ucyB1c2UgJycgaW5zdGVhZC4nIGlzIG5vdCBhdmFpbGFibGUgaW4gRGFydCAyLjAuIFRyeSB1c2luZyAnaGludGluZm9pc0VtcHR5Tm8gRGFydCBmaWxlIHNwZWNpZmllZC5leHRyYXN1Ymxpc3RFeHRyYSBhcmd1bWVudHM6ICcgbWF5IG5vdCBiZSB1c2VkIGluIGNoZWNrZWQgbW9kZS5DYW5ub3Qgc3BlY2lmeSBib3RoICctLXBhY2thZ2Utcm9vdCcgYW5kICctLXBhY2thZ2VzLnNjcmlwdE5hbWVvdXQuanNvdXQuZGlsbGFuZCByZWFkIHNlcmlhbGl6ZWQgZGF0YSBzaW11bHRhbmVvdXNseS5hbmQgcmVhZCBzZXJpYWxpemVkIGNvZGVnZW4gc2ltdWx0YW5lb3VzbHkuLmRhdGFDYW5ub3QgcmVhZCBhbmQgd3JpdGUgc2VyaWFsaXplZCBkYXRhIHNpbXVsdGFuZW91c2x5LkNhbm5vdCByZWFkIHNlcmlhbGl6ZWQgY29kZWdlbiBhbmQgd3JpdGUgc2VyaWFsaXplZCBkYXRhIHNpbXVsdGFuZW91c2x5Li5jb2RlQ2Fubm90IHJlYWQgYW5kIHdyaXRlIHNlcmlhbGl6ZWQgY29kZWdlbiBzaW11bHRhbmVvdXNseS5DYW4gb25seSB3cml0ZSBzZXJpYWxpemVkIGNvZGVnZW4gZnJvbSBzZXJpYWxpemVkIGRhdGEuQ2Fubm90IHdyaXRlIHNlcmlhbGl6ZWQgY29kZWdlbiB3aXRob3V0IHNldHRpbmcgLjw9IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLj49IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAtLW91dD0ubWFwLS1zb3VyY2UtbWFwPW91dHB1dFByb3ZpZGVyb25JbmZvb25GYWlsdXJlY29tcGlsYXRpb25Eb25lcmVzdWx0aXNTdWNjZXNzQ29tcGlsYXRpb24gZmFpbGVkLi5kZXBzZ2V0U291cmNlVXJpc2lucHV0aW5wdXRTaXplcHJvY2Vzc05hbWVpbnB1dE5hbWVvdXRwdXRTaXplcHJpbWFyeU91dHB1dFNpemVvdXRwdXROYW1lc3VtbWFyeWNoYXJhY3RlcnMgRGFydGRhcnRDaGFyYWN0ZXJzUmVhZERhcnQgZmlsZSBieXRlcyBkYXRhZGF0YUlucHV0RGF0YSBmaWxlcyAgYW5kIGNvZGVJbnB1dCwgWzAtLV0gQ29tcGlsZWRjaGFyYWN0ZXJzIEphdmFTY3JpcHR0b3RhbENoYXJhY3RlcnNXcml0dGVuSmF2YVNjcmlwdHRvdGFsQ2hhcmFjdGVyc1dyaXR0ZW5QcmltYXJ5b3V0cHV0Y29tcGlsZWQgdG8gSmF2YVNjcmlwdDoga2VybmVsIGJ5dGVzdG90YWxEYXRhV3JpdHRlbmNvbXBpbGVkIHRvIGRpbGw6IFNlcmlhbGl6ZWRkYXRhT3V0cHV0c2VyaWFsaXplZCB0byBkaWxsIGFuZCBkYXRhOiBjb2RlT3V0cHV0c2VyaWFsaXplZCB0byBjb2RlZ2VuIGRhdGE6ICB0byAgaW4gZWxhcHNlZCBzZWNvbmRzaW4gZmlsZXNhbGxPdXRwdXRGaWxlc2pzQ291bnR3aGVyZWYuanNFbWl0dGVkIGZpbGUgIEphdmFTY3JpcHQgZmlsZXMuc2NyaXB0YXV0b1JlYWRGaWxlVXJpZW50cnlQb2ludHRoZW5fZm9ybWF0Q2hhcmFjdGVyQ291bnRzZXBhcmF0b3J0ZXh0cG9zaXRpb25fZm9ybWF0RHVyYXRpb25Bc1NlY29uZHNkdXJhdGlvbndpZHRoc2Vjb25kc2luTWlsbGlzZWNvbmRzZGlnaXRzdG9TdHJpbmdBc0ZpeGVkd3JpdGVTdHJpbmdzY2hlbWVmaWxlVW5oYW5kbGVkIHNjaGVtZSB0b0ZpbGVQYXRob3BlblN5bmNtb2Rld3JpdGVTdHJpbmdTeW5jY2xvc2VTeW5jZmFpbHJlcG9ydHVuYXJ5LWVycm9yRXJyb3I6IGNvbXBpbGVyTWFpbjphc3luY19jb21wbGV0ZXI6cmV0dXJuX3ZhbHVlOmFzeW5jX3N0YWNrX3RyYWNlOmFzeW5jX29wX3RoZW46YXN5bmNfb3BfZXJyb3I6YXdhaXRfanVtcF92YXI6YXdhaXRfY3R4X3ZhcjpzYXZlZF90cnlfY29udGV4dF92YXIwOmFzeW5jX29wOnJlc3VsdDpleGNlcHRpb246c3RhY2tfdHJhY2Vhbnlhc3RhcnRzV2l0aC0tbGlicmFyaWVzLXNwZWM9aXNTY2hlbWVwYWNrYWdlbGlicmFyaWVzSnNvbmNvbXBsZXRlRXJyb3JmdXR1cmVoZWxwVXNhZ2U6IGRhcnQyanMgW29wdGlvbnNdIGRhcnRmaWxlCgpDb21waWxlcyBEYXJ0IHRvIEphdmFTY3JpcHQuCgpDb21tb24gb3B0aW9uczoKICAtbyA8ZmlsZT4gR2VuZXJhdGUgdGhlIG91dHB1dCBpbnRvIDxmaWxlPi4KICAtbSAgICAgICAgR2VuZXJhdGUgbWluaWZpZWQgb3V0cHV0LgogIC1oICAgICAgICBEaXNwbGF5IHRoaXMgbWVzc2FnZSAoYWRkIC12IGZvciBpbmZvcm1hdGlvbiBhYm91dCBhbGwgb3B0aW9ucykudmVyYm9zZUhlbHBVc2FnZTogZGFydDJqcyBbb3B0aW9uc10gZGFydGZpbGUKCkNvbXBpbGVzIERhcnQgdG8gSmF2YVNjcmlwdC4KClN1cHBvcnRlZCBvcHRpb25zOgogIC1oLCAvaCwgLz8sIC0taGVscAogICAgRGlzcGxheSB0aGlzIG1lc3NhZ2UgKGFkZCAtdiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWxsIG9wdGlvbnMpLgoKICAtbyA8ZmlsZT4sIC0tb3V0PTxmaWxlPgogICAgR2VuZXJhdGUgdGhlIG91dHB1dCBpbnRvIDxmaWxlPi4KCiAgLW0sIC0tbWluaWZ5CiAgICBHZW5lcmF0ZSBtaW5pZmllZCBvdXRwdXQuCgogIC0tZW5hYmxlLWFzc2VydHMKICAgIEVuYWJsZSBhc3NlcnRpb25zLgoKICAtdiwgLS12ZXJib3NlCiAgICBEaXNwbGF5IHZlcmJvc2UgaW5mb3JtYXRpb24uCgogIC1EPG5hbWU+PTx2YWx1ZT4KICAgIERlZmluZSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KCiAgLS12ZXJzaW9uCiAgICBEaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24uCgogIC0tcGFja2FnZXM9PHBhdGg+CiAgICBQYXRoIHRvIHRoZSBwYWNrYWdlIHJlc29sdXRpb24gY29uZmlndXJhdGlvbiBmaWxlLCB3aGljaCBzdXBwbGllcyBhIG1hcHBpbmcKICAgIG9mIHBhY2thZ2UgbmFtZXMgdG8gcGF0aHMuCgogIC0tc3VwcHJlc3Mtd2FybmluZ3MKICAgIERvIG5vdCBkaXNwbGF5IGFueSB3YXJuaW5ncy4KCiAgLS1mYXRhbC13YXJuaW5ncwogICAgVHJlYXQgd2FybmluZ3MgYXMgY29tcGlsYXRpb24gZXJyb3JzLgoKICAtLXN1cHByZXNzLWhpbnRzCiAgICBEbyBub3QgZGlzcGxheSBhbnkgaGludHMuCgogIC0tZW5hYmxlLWRpYWdub3N0aWMtY29sb3JzCiAgICBBZGQgY29sb3JzIHRvIGRpYWdub3N0aWMgbWVzc2FnZXMuCgogIC0tdGVyc2UKICAgIEVtaXQgZGlhZ25vc3RpY3Mgd2l0aG91dCBzdWdnZXN0aW9ucyBmb3IgaG93IHRvIGdldCByaWQgb2YgdGhlIGRpYWdub3NlZAogICAgcHJvYmxlbXMuCgogIC0tc2hvdy1wYWNrYWdlLXdhcm5pbmdzCiAgICBTaG93IHdhcm5pbmdzIGFuZCBoaW50cyBnZW5lcmF0ZWQgZnJvbSBwYWNrYWdlcy4KCiAgLS1jc3AKICAgIERpc2FibGUgZHluYW1pYyBnZW5lcmF0aW9uIG9mIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQuIFRoaXMgaXMKICAgIG5lY2Vzc2FyeSB0byBzYXRpc2Z5IENTUCByZXN0cmljdGlvbnMgKHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1AvKS4KCiAgLS1uby1zb3VyY2UtbWFwcwogICAgRG8gbm90IGdlbmVyYXRlIGEgc291cmNlIG1hcCBmaWxlLgoKICAtTzwwLDEsMiwzLDQ+CiAgICBDb250cm9scyBvcHRpbWl6YXRpb25zIHRoYXQgY2FuIGhlbHAgcmVkdWNlIGNvZGUtc2l6ZSBhbmQgaW1wcm92ZQogICAgcGVyZm9ybWFuY2Ugb2YgdGhlIGdlbmVyYXRlZCBjb2RlIGZvciBkZXBsb3ltZW50LgoKICAgIC1PMAogICAgICAgRGlzYWJsZXMgYWxsIG9wdGltaXphdGlvbnMuIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBkYXJ0MmpzIHdpdGggdGhlc2UKICAgICAgIGV4dHJhIGZsYWdzOgogICAgICAgIC0tZGlzYWJsZS1pbmxpbmluZwogICAgICAgIC0tZGlzYWJsZS10eXBlLWluZmVyZW5jZQogICAgICAgIC0tZGlzYWJsZS1ydGktb3B0aW1pemF0aW9ucwoKCiAgICAgICBTb21lIG9wdGltaXphdGlvbnMgY2Fubm90IGJlIGRpc3NhYmxlZCBhdCB0aGlzIHRpbWUsIGFzIHdlIGFkZCB0aGUgb3B0aW9uCiAgICAgICB0byBkaXNhYmxlIHRoZW0sIHRoZXkgd2lsbCBiZSBhZGRlZCBoZXJlIGFzIHdlbGwuCgogICAgLU8xCiAgICAgICBFbmFibGVzIGRlZmF1bHQgb3B0aW1pemF0aW9ucy4gRXF1aXZhbGVudCB0byBjYWxsaW5nIGRhcnQyanMgd2l0aCBubwogICAgICAgZXh0cmEgZmxhZ3MuCgogICAgLU8yCiAgICAgICBFbmFibGVzIG9wdGltaXphdGlvbnMgdGhhdCByZXNwZWN0IHRoZSBsYW5ndWFnZSBzZW1hbnRpY3MgYW5kIGFyZSBzYWZlCiAgICAgICBmb3IgYWxsIHByb2dyYW1zLiBJdCBob3dldmVyIGNoYW5nZXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0eXBlcywKICAgICAgIHdoaWNoIHdpbGwgbm8gbG9uZ2VyIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgRGFydCBWTSBvciBEREMuCgogICAgICAgRXF1aXZhbGVudCB0byBjYWxsaW5nIGRhcnQyanMgd2l0aCB0aGVzZSBleHRyYSBmbGFnczoKICAgICAgICAtLW1pbmlmeQogICAgICAgIC0tbGF4LXJ1bnRpbWUtdHlwZS10by1zdHJpbmcKCiAgICAtTzMKICAgICAgIEVuYWJsZXMgb3B0aW1pemF0aW9ucyB0aGF0IHJlc3BlY3QgdGhlIGxhbmd1YWdlIHNlbWFudGljcyBvbmx5IG9uCiAgICAgICBwcm9ncmFtcyB0aGF0IGRvbid0IGV2ZXIgdGhyb3cgYW55IHN1YnR5cGUgb2YgYEVycm9yYC4gIFRoZXNlCiAgICAgICBvcHRpbWl6YXRpb25zIGltcHJvdmUgdGhlIGdlbmVyYXRlZCBjb2RlLCBidXQgdGhleSBtYXkgY2F1c2UgcHJvZ3JhbXMgdG8KICAgICAgIGJlaGF2ZSB1bmV4cGVjdGVkbHkgaWYgdGhpcyBhc3N1bXB0aW9uIGlzIG5vdCBtZXQuICBUbyB1c2UgdGhpcwogICAgICAgb3B0aW9uLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgcHJvcGVybHkgdGVzdCB5b3VyIGFwcGxpY2F0aW9uIGZpcnN0CiAgICAgICB3aXRob3V0IGl0LCBhbmQgZW5zdXJlIHRoYXQgbm8gc3VidHlwZSBvZiBgRXJyb3JgIChzdWNoIGFzIGBUeXBlRXJyb3JgKQogICAgICAgaXMgZXZlciB0aHJvd24uCgogICAgICAgRXF1aXZhbGVudCB0byBjYWxsaW5nIGRhcnQyanMgd2l0aCB0aGVzZSBleHRyYSBmbGFnczoKICAgICAgICAgLU8yCiAgICAgICAgIC0tb21pdC1pbXBsaWNpdC1jaGVja3MKCiAgICAtTzQKICAgICAgIEVuYWJsZXMgbW9yZSBhZ2dyZXNzaXZlIG9wdGltaXphdGlvbnMgdGhhbiAtTzMsIGJ1dCB3aXRoIHRoZSBzYW1lCiAgICAgICBhc3N1bXB0aW9ucy4gVGhlc2Ugb3B0aW1pemF0aW9ucyBhcmUgb24gYSBzZXBhcmF0ZSBncm91cCBiZWNhdXNlIHRoZXkKICAgICAgIGFyZSBtb3JlIHN1c2NlcHRpYmxlIHRvIHZhcmlhdGlvbnMgaW4gaW5wdXQgZGF0YS4gVG8gdXNlIHRoaXMgb3B0aW9uIHdlCiAgICAgICByZWNvbW1lbmQgdG8gcGF5IHNwZWNpYWwgYXR0ZW50aW9uIHRvIHRlc3QgZWRnZSBjYXNlcyBpbiB1c2VyIGlucHV0LgoKICAgICAgIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBkYXJ0MmpzIHdpdGggdGhlc2UgZXh0cmEgZmxhZ3M6CiAgICAgICAgIC1PMwogICAgICAgICAtLXRydXN0LXByaW1pdGl2ZXMKCiAgICBXaGlsZSBzb21lIG9mIHRoZSBpbmRpdmlkdWFsIG9wdGltaXphdGlvbnMgYW5kIGZsYWdzIG1heSBjaGFuZ2Ugd2l0aCB0aW1lLAogICAgd2UgaW50ZW5kIHRvIGtlZXAgdGhlIC1PKiBmbGFncyBzdGFibGUuIE5ldyBzYWZlIG9wdGltaXphdGlvbnMgbWF5IGJlIGFkZGVkCiAgICBvbiBhbnkgbGV2ZWwsIGFuZCBvcHRpbWl6YXRpb25zIHRoYXQgb25seSB3b3JrIG9uIHNvbWUgcHJvZ3JhbXMgbWF5IG1vdmUgdXAKICAgIGZyb20gb25lIGxldmVsIHRvIHRoZSBuZXh0IChmb3IgaW5zdGFuY2UsIG9uY2UgYWx0ZXJuYXRpdmUgc2FmZQogICAgb3B0aW1pemF0aW9ucyBhcmUgaW1wbGVtZW50ZWQsIGBvbWl0LWltcGxpY2l0LWNoZWNrc2AgbWF5IGJlIHJlbW92ZWQgb3IgbWF5CiAgICBtb3ZlIHRvIHRoZSBPNCBsZXZlbCkuCgpUaGUgZm9sbG93aW5nIGluZGl2aWR1YWwgb3B0aW9ucyBhcmUgaW5jbHVkZWQgaW4gc29tZSBvZiB0aGUgLU8gb3B0aW1pemF0aW9uCmxldmVscyBhYm92ZS4gVGhleSBoZWxwIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsIGJ1dCB0aGV5IG1heQpjYXVzZSBwcm9ncmFtcyB0byBiZWhhdmUgdW5leHBlY3RlZGx5IGlmIGFzc3VtcHRpb25zIGFyZSBub3QgbWV0LiBPbmx5IHR1cm4gb24KdGhlc2UgZmxhZ3MgaWYgeW91IGhhdmUgZW5vdWdoIHRlc3QgY292ZXJhZ2UgdG8gZW5zdXJlIHRoZXkgYXJlIHNhZmUgdG8gdXNlOgoKICAtLW9taXQtaW1wbGljaXQtY2hlY2tzCiAgICBPbWl0IGltcGxpY2l0IHJ1bnRpbWUgY2hlY2tzLCBzdWNoIGFzIHBhcmFtZXRlciBjaGVja3MgYW5kIGltcGxpY2l0CiAgICBkb3duY2FzdHMuIFRoZXNlIGNoZWNrcyBhcmUgaW5jbHVkZWQgYnkgZGVmYXVsdCBpbiBEYXJ0IDIuMC4gQnkKICAgIHVzaW5nIHRoaXMgZmxhZyB0aGUgY2hlY2tzIGFyZSByZW1vdmVkLCBob3dldmVyIHRoZSBjb21waWxlciB3aWxsIGFzc3VtZQogICAgdGhhdCBhbGwgc3VjaCBjaGVja3Mgd2VyZSB2YWxpZCBhbmQgbWF5IHVzZSB0aGlzIGluZm9ybWF0aW9uIGZvcgogICAgb3B0aW1pemF0aW9ucy4gVXNlIHRoaXMgb3B0aW9uIG9ubHkgaWYgeW91IGhhdmUgZW5vdWdoIHRlc3RpbmcgdG8gZW5zdXJlCiAgICB0aGF0IHlvdXIgcHJvZ3JhbSB3b3JrcyB3aXRoIHRoZSBjaGVja3MuCgogIC0tdHJ1c3QtcHJpbWl0aXZlcwogICAgQXNzdW1lIHRoYXQgb3BlcmF0aW9ucyBvbiBudW1iZXJzLCBzdHJpbmdzLCBhbmQgbGlzdHMgaGF2ZSB2YWxpZCBpbnB1dHMuCiAgICBUaGlzIG9wdGlvbiBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGRyb3AgcnVudGltZSBjaGVja3MgZm9yIHRob3NlIG9wZXJhdGlvbnMuCiAgICBOb3RlOiBhIHdlbGwtdHlwZWQgcHJvZ3JhbSBpcyBub3QgZ3VhcmFudGVlZCB0byBoYXZlIHZhbGlkIGlucHV0cy4gRm9yCiAgICBleGFtcGxlLCBhbiBpbnQgaW5kZXggYXJndW1lbnQgbWF5IGJlIG51bGwgb3Igb3V0IG9mIHJhbmdlLgoKICAtLWxheC1ydW50aW1lLXR5cGUtdG8tc3RyaW5nCiAgICBPbWl0cyByZWlmaWVkIGNsYXNzIHR5cGUgYXJndW1lbnRzIHdoZW4gdGhlc2UgYXJlIG9ubHkgbmVlZGVkIGZvciBgdG9TdHJpbmdgCiAgICBvbiBgcnVudGltZVR5cGVgLiBUaGlzIGlzIHVzZWZ1bCBpZiBgcnVudGltZVR5cGUudG9TdHJpbmcoKWAgaXMgb25seSB1c2VkCiAgICBmb3IgZGVidWdnaW5nLiBOb3RlIHRoYXQgc2VtYW50aWNzIG9mIG90aGVyIHVzZXMgb2YgYC5ydW50aW1lVHlwZWAsIGZvcgogICAgaW5zdGFuY2UgYGEucnVudGltZVR5cGUgPT0gYi5ydW50aW1lVHlwZWAsIGlzIG5vdCBhZmZlY3RlZCBieSB0aGlzIGZsYWcuCgpUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIG9ubHkgdXNlZCBmb3IgY29tcGlsZXIgZGV2ZWxvcG1lbnQgYW5kIG1heQpiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb246CgogIC0tdGhyb3ctb24tZXJyb3IKICAgIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBhIGNvbXBpbGUtdGltZSBlcnJvciBpcyBkZXRlY3RlZC4KCiAgLS1saWJyYXJpZXMtc3BlYz08ZmlsZT4KICAgIEEgLmpzb24gZmlsZSBjb250YWluaW5nIHRoZSBsaWJyYXJpZXMgc3BlY2lmaWNhdGlvbiBmb3IgZGFydDJqcy4KCiAgLS1hbGxvdy1tb2NrLWNvbXBpbGF0aW9uCiAgICBEbyBub3QgZ2VuZXJhdGUgYSBjYWxsIHRvIG1haW4gaWYgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcKICAgIGxpYnJhcmllcyBhcmUgdXNlZDogZGFydDpkb20sIGRhcnQ6aHRtbCBkYXJ0OmlvLgoKICAtLWRpc2FibGUtbmF0aXZlLWxpdmUtdHlwZS1hbmFseXNpcwogICAgRGlzYWJsZSB0aGUgb3B0aW1pemF0aW9uIHRoYXQgcmVtb3ZlcyB1bnVzZWQgbmF0aXZlIHR5cGVzIGZyb20gZGFydDpodG1sCiAgICBhbmQgcmVsYXRlZCBsaWJyYXJpZXMuCgogIC0tc2VydmVyLW1vZGUKICAgIENvbXBpbGUgd2l0aCBzZXJ2ZXIgc3VwcG9ydC4gVGhlIGNvbXBpbGVyIHdpbGwgdXNlIGEgbGlicmFyeSBzcGVjaWZpY2F0aW9uCiAgICB0aGF0IGRpc2FibGVzIGRhcnQ6aHRtbCBidXQgc3VwcG9ydHMgZGFydDpqcyBpbiBjb25kaXRpb25hbCBpbXBvcnRzLgoKICAtLWNhdGVnb3JpZXM9PGNhdGVnb3JpZXM+CiAgICAoZGVwcmVjYXRlZCkKICAgIFVzZSAnLS1zZXJ2ZXItbW9kZScgaW5zdGVhZCBvZiAnLS1jYXRlZ29yaWVzPVNlcnZlcicuIEFsbCBvdGhlciBjYXRlZ29yeQogICAgdmFsdWVzIGhhdmUgbm8gZWZmZWN0IG9uIHRoZSBjb21waWxlciBiZWhhdmlvci4KCiAgLS1kZWZlcnJlZC1tYXA9PGZpbGU+CiAgICBHZW5lcmF0ZXMgYSBqc29uIGZpbGUgd2l0aCBhIG1hcHBpbmcgZnJvbSBlYWNoIGRlZmVycmVkIGltcG9ydCB0byBhIGxpc3Qgb2YKICAgIHRoZSBwYXJ0LmpzIGZpbGVzIHRoYXQgd2lsbCBiZSBsb2FkZWQuCgogIC0tZHVtcC1pbmZvWz08Zm9ybWF0Pl0KICAgIEdlbmVyYXRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ2VuZXJhdGVkIGNvZGUuICdmb3JtYXQnIGNhbiBiZSBlaXRoZXIKICAgICdqc29uJyBvciAnYmluYXJ5Jy4KICAgIFlvdSBjYW4gaW5zcGVjdCB0aGUgZ2VuZXJhdGVkIGRhdGEgdXNpbmcgdG9vbHMgZnJvbSAncGFja2FnZTpkYXJ0MmpzX2luZm8nLgoKICAtLWdlbmVyYXRlLWNvZGUtd2l0aC1jb21waWxlLXRpbWUtZXJyb3JzCiAgICBHZW5lcmF0ZXMgb3V0cHV0IGV2ZW4gaWYgdGhlIHByb2dyYW0gY29udGFpbnMgY29tcGlsZS10aW1lIGVycm9ycy4gVXNlIHRoZQogICAgZXhpdCBjb2RlIHRvIGRldGVybWluZSBpZiBjb21waWxhdGlvbiBmYWlsZWQuCgogIC0tbm8tZnJlcXVlbmN5LWJhc2VkLW1pbmlmaWNhdGlvbgogICAgRXhwZXJpbWVudGFsLiAgRGlzYWJsZWQgdGhlIG5ldyBmcmVxdWVuY3kgYmFzZWQgbWluaWZ5aW5nIG5hbWVyIGFuZCB1c2UgdGhlCiAgICBvbGQgbmFtZXIgaW5zdGVhZC4KdHJpbWhlbHBBbmRFeGl0dmVyc2lvbjxub24tU0RLIGJ1aWxkPkRhcnQtdG8tSmF2YVNjcmlwdCBjb21waWxlciAoZGFydDJqcykgdmVyc2lvbjogaGVscEFuZEZhaWxtYWlubGFzdC0tYmF0Y2hpbnRlcm5hbE1haW5vbkVycm9yZXhjZXB0aW9udHJhY2VUaGUgY29tcGlsZXIgY3Jhc2hlZDogaWdub3JlZFRoZSBjb21waWxlciBjcmFzaGVkOiBlcnJvciB3aGlsZSBwcmludGluZyBleGNlcHRpb25jYXRjaEVycm9yYmF0Y2hNYWluYmF0Y2hBcmd1bWVudHNlcnJvckNvZGVzdHJlYW10cmFuc2Zvcm1kZWNvZGVyc3Vic2NyaXB0aW9ubGlzdGVubGluZXBhdXNlYXJnc3dpbmRvd3N3aGVuQ29tcGxldGU+Pj4gVEVTVCBPSz4+PiBURVNUIENSQVNIPj4+IFRFU1QgRkFJTHdyaXRlbG4+Pj4gRU9GIFNUREVSUnJlc3VtZUNvbXBvbmVudGlyVGFyZ2V0RGlhZ25vc3RpY01lc3NhZ2VIYW5kbGVyRXhwZXJpbWVudGFsRmxhZ0ZpbGVTeXN0ZW1Qcm9jZXNzZWRPcHRpb25zTGlicmFyaWVzU3BlY2lmaWNhdGlvbkNvbXBpbGVyQ29udGV4dG1lc3NhZ2VNaXNzaW5nTWFpblNldmVyaXR5Z2VuZXJhdGVLZXJuZWxJbnRlcm5hbEVycm9yVG9rZW5TdHJpbmdUb2tlblRva2VucmVkaXJlY3RpbmdJbml0aWFsaXplZENvbXBpbGVyU3RhdGVlcXVhbExpc3RzZXF1YWxNYXBzcGFyc2VFeHBlcmltZW50YWxGbGFnc0RpYWdub3N0aWNNZXNzYWdlZ2V0TWVzc2FnZUNoYXJPZmZzZXRnZXRNZXNzYWdlSGVhZGVyVGV4dGdldE1lc3NhZ2VMZW5ndGhnZXRNZXNzYWdlUmVsYXRlZEluZm9ybWF0aW9uZ2V0TWVzc2FnZVVyaWRlZmF1bHRFeHBlcmltZW50YWxGbGFnc0ZpbGVTeXN0ZW1FbnRpdHlGaWxlU3lzdGVtRXhjZXB0aW9ua2VybmVsRm9yUHJvZ3JhbURhdGFGaWxlU3lzdGVtRW50aXR5Y29tcHV0ZVBsYXRmb3JtQmluYXJpZXNMb2NhdGlvbkxvY2F0ZWRNZXNzYWdlb3BlcmF0b3JGcm9tU3RyaW5nQXN5bmNNb2RpZmllcmlzVXNlckRlZmluYWJsZU9wZXJhdG9yaXNNaW51c09wZXJhdG9yJCQkMCQ5JEEkQkFDS1NMQVNIJENSJERFTCREUSRIQVNIJExGJExTJFBTJFRBQiRaJF8kYSRnJHMkekxpbmtMaW5rQnVpbGRlckxpbmtFbnRyeXJlbGF0aXZpemVVcmljbGVhclN0cmluZ1Rva2VuQ2Fub25pY2FsaXplcmNsZWFyaW5pdGlhbGl6ZUNvbXBpbGVyb2xkU3RhdGV0YXJnZXRsaW5rZWREZXBlbmRlbmNpZXNwYWNrYWdlc0ZpbGVVcmlleHBlcmltZW50YWxGbGFnc3ZlcmlmeWJjb21wYXJlVG9sZWdhY3lNb2RlcHJvY2Vzc2VkT3B0c3N0YXRlZmlsZVN5c3RlbW9uRGlhZ25vc3RpY2lucHV0c2NsZWFyRmlsZVN5c3RlbUNhY2hlY29udGV4dGNvbXBpbGVyUmVzdWx0Y29tcG9uZW50bWFpbk1ldGhvZE5vICdtYWluJyBtZXRob2QgZm91bmQuVHJ5IGFkZGluZyBhIG1ldGhvZCBuYW1lZCAnbWFpbicgdG8geW91ciBwcm9ncmFtLk1pc3NpbmdNYWluU2V2ZXJpdHkuZXJyb3J3aXRoTG9jYXRpb250b2tlblRvU3RyaW5nYXNzZXJ0aW9uTWVzc2FnZWxleGVtZWdldFN1cHBvcnRlZExpYnJhcnlOYW1lc2pzb25zcGVjaWZpY2F0aW9uRm9yYWxsTGlicmFyaWVzbGlzU3VwcG9ydGVkaXNSZWRpcmVjdGluZ0ZhY3RvcnltZW1iZXJraW5kUHJvY2VkdXJlS2luZC5GYWN0b3J5Ym9keWZ1bmN0aW9uZXhwcmVzc2lvbnZhcmlhYmxlI3JlZGlyZWN0aW5nX2ZhY3Rvcnljb21waWxlcl9uZXdEaWFnbm9zdGljSW5wdXRLaW5kSW5wdXRLaW5kLlVURjhJbnB1dEtpbmQuYmluYXJ5VVRGOGJpbmFyeUlucHV0VGlucHV0S2luZENvbXBpbGVySW5wdXRyZWFkRnJvbVVyaU91dHB1dFR5cGVPdXRwdXRUeXBlLmpzT3V0cHV0VHlwZS5qc1BhcnRPdXRwdXRUeXBlLnNvdXJjZU1hcE91dHB1dFR5cGUuZHVtcEluZm9PdXRwdXRUeXBlLmRlZmVycmVkTWFwT3V0cHV0VHlwZS5kZWJ1Z2pzanNQYXJ0c291cmNlTWFwZHVtcEluZm9kZWZlcnJlZE1hcGRlYnVnT3V0cHV0U2lua2Nsb3NlQmluYXJ5T3V0cHV0U2lua3dyaXRlYnVmZmVyZW5kQ29tcGlsZXJPdXRwdXRjcmVhdGVPdXRwdXRTaW5rZXh0ZW5zaW9udHlwZWNyZWF0ZUJpbmFyeVNpbmtDb21waWxlckRpYWdub3N0aWNzY29kZWJlZ2luQ29tcGlsYXRpb25SZXN1bHRjb21waWxlcmNvbXBpbGVyT3B0aW9ucyBtdXN0IGJlIG5vbi1udWxsY29tcGlsZXJJbnB1dCBtdXN0IGJlIG5vbi1udWxsY29tcGlsZXJEaWFnbm9zdGljcyBtdXN0IGJlIG5vbi1udWxsY29tcGlsZXJPdXRwdXQgbXVzdCBiZSBub24tbnVsbHJ1bnN1Y2Nlc3NrZXJuZWxMb2FkZXJpbml0aWFsaXplZENvbXBpbGVyU3RhdGVkYXJ0MmpzLmNtZGxpbmUub3B0aW9uc0ZsYWdzYWxsb3dNb2NrQ29tcGlsYXRpb25hbGxvd05hdGl2ZUV4dGVuc2lvbnNkaXNhYmxlSW5saW5pbmdkaXNhYmxlUHJvZ3JhbVNwbGl0ZGlzYWJsZURpYWdub3N0aWNDb2xvcnNkaXNhYmxlTmF0aXZlTGl2ZVR5cGVBbmFseXNpc3VzZVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluZGlzYWJsZVR5cGVJbmZlcmVuY2VkaXNhYmxlUnRpT3B0aW1pemF0aW9uZW5hYmxlQXNzZXJ0TWVzc2FnZWVuYWJsZUNoZWNrZWRNb2RlZW5hYmxlQXNzZXJ0c2VuYWJsZURpYWdub3N0aWNDb2xvcnNleHBlcmltZW50YWxUcmFja0FsbG9jYXRpb25zZXhwZXJpbWVudGFsQWxsb2NhdGlvbnNQYXRoZXhwZXJpbWVudExvY2FsTmFtZXNleHBlcmltZW50U3RhcnR1cEZ1bmN0aW9uc2V4cGVyaW1lbnRUb0Jvb2xlYW5leHBlcmltZW50Q2FsbEluc3RydW1lbnRhdGlvbmV4cGVyaW1lbnROZXdSdGllbmFibGVMYW5ndWFnZUV4cGVyaW1lbnRzLS1lbmFibGUtZXhwZXJpbWVudGZhc3RTdGFydHVwZmF0YWxXYXJuaW5nc2dlbmVyYXRlQ29kZVdpdGhDb21waWxlVGltZUVycm9yc3ByZXZpZXdEYXJ0Mm9taXRJbXBsaWNpdENoZWNrc29taXRBc0Nhc3RzbGF4UnVudGltZVR5cGVUb1N0cmluZ21pbmlmeW5vRnJlcXVlbmN5QmFzZWRNaW5pZmljYXRpb25ub01pbmlmeW5vU291cmNlTWFwc3ByZXNlcnZlVXJpc3Nob3dQYWNrYWdlV2FybmluZ3MtLXNob3ctcGFja2FnZS13YXJuaW5nc3N1cHByZXNzSGludHNzdXBwcmVzc1dhcm5pbmdzdGVyc2V0ZXN0TW9kZXRydXN0UHJpbWl0aXZlc3RydXN0SlNJbnRlcm9wVHlwZUFubm90YXRpb25zdXNlQ29udGVudFNlY3VyaXR5UG9saWN5dXNlTXVsdGlTb3VyY2VJbmZvdXNlTmV3U291cmNlSW5mb3Byb2dyZXNzZGlsbERlcGVuZGVuY2llc3JlYWREYXRhd3JpdGVEYXRhcmVhZENvZGVnZW53cml0ZUNvZGVnZW5jZmVPbmx5ZGVidWdHbG9iYWxJbmZlcmVuY2VzZXJ2ZXJNb2RlbmV3RGVmZXJyZWRTcGxpdHJlcG9ydEludmFsaWRJbmZlcnJlZERlZmVycmVkVHlwZXNiZW5jaG1hcmtpbmdQcm9kdWN0aW9uYmVuY2htYXJraW5nRXhwZXJpbWVudGNvbmRpdGlvbmFsRGlyZWN0aXZlc2dlbmVyaWNNZXRob2RTeW50YXhpbml0aWFsaXppbmdGb3JtYWxBY2Nlc3NyZXNvbHZlT25seU9wdGlvbnJlc29sdXRpb25JbnB1dGN1cnJlbnREaXJlY3RvcnluYXRpdmVUb1VyaVBhdGhmaWxlbmFtZXJlcGxhY2VBbGxcOnVyaVBhdGhUb05hdGl2ZW5hdGl2ZVRvVXJpYXBwZW5kU2xhc2hkYXJ0MmpzLnNyYy5vcHRpb25zRGlhZ25vc3RpY09wdGlvbnN0ZXJzZURpYWdub3N0aWNzc2hvd0FsbFBhY2thZ2VXYXJuaW5nc2hpZGVQYWNrYWdlV2FybmluZ3NzaG93UGFja2FnZVdhcm5pbmdzRm9ybGFuZ3VhZ2VFeHBlcmltZW50c2J1aWxkSWRidWlsZCBudW1iZXIgY291bGQgbm90IGJlIGRldGVybWluZWRjb21waWxlRm9yU2VydmVyZGVmZXJyZWRNYXBVcmlzaG93blBhY2thZ2VXYXJuaW5nc3VzZUR1bXBJbmZvQmluYXJ5Rm9ybWF0ZW5hYmxlTWluaWZpY2F0aW9uX2Rpc2FibGVNaW5pZmljYXRpb25lbmFibGVOYXRpdmVMaXZlVHlwZUFuYWx5c2lzZW5hYmxlVXNlckFzc2VydGlvbnNnZW5lcmF0ZVNvdXJjZU1hcG91dHB1dFVyaXNvdXJjZU1hcFVyaWRlZmF1bHRQYXJhbWV0ZXJDaGVja1BvbGljeWRlZmF1bHRJbXBsaWNpdERvd25jYXN0Q2hlY2tQb2xpY3lkZWZhdWx0Q29uZGl0aW9uQ2hlY2tQb2xpY3lkZWZhdWx0RXhwbGljaXRDYXN0Q2hlY2tQb2xpY3l1c2VGcmVxdWVuY3lOYW1lcnNob3dJbnRlcm5hbFByb2dyZXNzdXNlQ0ZFQ29uc3RhbnRzRXhwZXJpbWVudGFsRmxhZy5jb25zdGFudFVwZGF0ZTIwMThoYXNCdWlsZElkcGFyc2VFeHBlcmltZW50YWxGbGFnLmNvbnRyb2xGbG93Q29sbGVjdGlvbnNFeHBlcmltZW50YWxGbGFnLmV4dGVuc2lvbk1ldGhvZHNFeHBlcmltZW50YWxGbGFnLm5vbk51bGxhYmxlRXhwZXJpbWVudGFsRmxhZy5zcHJlYWRDb2xsZWN0aW9uc0V4cGVyaW1lbnRhbEZsYWcudHJpcGxlU2hpZnQtLWRlZmVycmVkLW1hcD0tLXBsYXRmb3JtLWJpbmFyaWVzPXZhbGlkYXRlW2xpYnJhcmllc1NwZWNpZmljYXRpb25VcmldIGlzIG51bGwuW2xpYnJhcmllc1NwZWNpZmljYXRpb25VcmldIHNob3VsZCBiZSBhIGZpbGU6IE9ubHkgb25lIG9mIFtwYWNrYWdlUm9vdF0gb3IgW3BhY2thZ2VDb25maWddIG1heSBiZSBnaXZlbi5bcGFja2FnZVJvb3RdIG11c3QgZW5kIHdpdGggYSAvTWlzc2luZyByZXF1aXJlZCBkZXJpdmVPcHRpb25zY29udGFpbnNwYXRoU2VnbWVudHNmaXJzdENoZWNrUG9saWN5aXNUcnVzdGVkaXNFbWl0dGVkdHJ1c3RlZGNoZWNrZWRDaGVja1BvbGljeShpc1RydXN0ZWQ9aXNFbWl0dGVkPSlfVU5ERVRFUk1JTkVEX0JVSUxEX0lEX2V4dHJhY3RTdHJpbmdPcHRpb25wcmVmaXhkZWZhdWx0VmFsdWVvcHRpb25fZXh0cmFjdFVyaU9wdGlvbl9leHRyYWN0SW50T3B0aW9uX2hhc09wdGlvbl9leHRyYWN0T3B0aW9uYWxDc3ZPcHRpb25mbGFnX2V4dHJhY3RVcmlMaXN0T3B0aW9uc3RyaW5nVXJpc19leHRyYWN0RXhwZXJpbWVudHNleHBlcmltZW50c3NvdXJjZV9maWxlX3Byb3ZpZGVybWF0aGNvbG9yc01lc3NhZ2VDYWxsYmFja1NvdXJjZUZpbGVQcm92aWRlcmlzV2luZG93c2N3ZHV0ZjhTb3VyY2VGaWxlc2JpbmFyeVNvdXJjZUZpbGVzcmVhZEJ5dGVzRnJvbVVyaXJlc291cmNlVXJpaXNBYnNvbHV0ZXJlc29sdmVVcmlfcmVhZEZyb21GaWxlaHR0cGh0dHBzX3JlYWRGcm9tSHR0cFVua25vd24gc2NoZW1lIGluIHVyaSAnJ19yZWFkRnJvbUZpbGVTeW5jc291cmNlemVyb1Rlcm1pbmF0ZWRleG9zRXJyb3JkZXRhaWwgKEVycm9yIHJlYWRpbmcgJycgYXV0b1JlYWRGcm9tRmlsZWVjbGllbnRnZXRVcmxyZXF1ZXN0cmVzcG9uc2VzdGF0dXNDb2RlbXNnRmFpbHVyZSBnZXR0aW5nIDogcmVhc29uUGhyYXNlc3BsaXRDb250ZW50dG90YWxMZW5ndGhmb2xkb2xkbGlzdG9mZnNldGNvbnRlbnRQYXJ0c2V0UmFuZ2V1bmltcGxlbWVudGVkZ2V0VXRmOFNvdXJjZUZpbGV1cmlza2V5c0NvbXBpbGVyU291cmNlRmlsZVByb3ZpZGVyRm9ybWF0dGluZ0RpYWdub3N0aWNIYW5kbGVycHJvdmlkZXJpc0Fib3J0aW5nbGFzdEtpbmRmYXRhbENvdW50RkFUQUxjcmFzaG9yZGluYWxJTkZPdmVyYm9zZSBpbmZvSW5mbzpJbmZvOiBwcmVmaXhNZXNzYWdld2FybmluZ1dhcm5pbmc6IEhpbnQ6IEludGVybmFsIEVycm9yOiBVbmV4cGVjdGVkIGRpYWdub3N0aWMga2luZDogZmF0YWwmaXNJbmZvY29sb3JVbmtub3duIGtpbmQ6IHguZGFydGdldExvY2F0aW9uTWVzc2FnZWNvbG9yaXplQDoKUmFuZG9tQWNjZXNzRmlsZU91dHB1dFByb3ZpZGVydG90YWxDaGFyYWN0ZXJzV3JpdHRlbmNyZWF0ZVVyaVVua25vd24gb3V0cHV0IHR5cGU6IGlzUHJpbWFyeU91dHB1dGNoYXJhY3RlcnNXcml0dGVuY2h1bmtTaXplKm9uRG9uZWJ5dGVzV3JpdHRlbndyaXRlQnl0ZXNTeW5jd3JpdGVGcm9tU3luY1JhbmRvbUFjY2Vzc0JpbmFyeU91dHB1dFNpbmtfT3V0cHV0U2lua1dyYXBwZXJvbkFkZG9uQ2xvc2VfQmluYXJ5T3V0cHV0U2lua1dyYXBwZXJvbldyaXRlQmF6ZWxJbnB1dFByb3ZpZGVyZGlyc3NlYXJjaFBhdGhzX3Jlc29sdmVyZXNvbHZlZFVyaS9iYXplbC1yb290L2JhemVsLXJvb3QvZGlyZXhpc3RzZXhpc3RzU3luY3JlYWRBbGxsZW5ndGhTeW5jYnVmZmVyTGVuZ3RocmVhZEludG9TeW5jZGFydDJqcy51dGlsLmNvbW1hbmRfbGluZUVTQ0FQRV9NQVBQSU5HbnINdAkIDAtzcGxpdExpbmVpblF1b3Rlc29wZW5pbmdRdW90ZSJVbmZpbmlzaGVkIGVzY2FwZTogbmV4dG1hcHBlZGlzTm90RW1wdHlVbmNsb3NlZCBxdW90ZXM6IGRhcnQyanMudXRpbGluZGVudGF0aW9uLmRhcnRIYXNoaW5nU01JX01BU0ttaXhIYXNoQ29kZUJpdHNleGlzdGluZzw8Xj4+aGlnaGxvd29iamVjdEhhc2hvYmplY3RoYXNoQ29kZW9iamVjdHNIYXNob2JqMW9iajJvYmozb2JqNG9iajVoYXNobGlzdEhhc2hzZXRIYXNoRWl0ZXJhYmxldW5vcmRlcmVkTWFwSGFzaGhhc2hDb2Rlc2VudHJ5ZW50cmllc2tleW1hcEhhc2hQYWlyQUJvdGhlcihJbmRlbnRhdGlvbl9pbmRlbnRMZXZlbF9pbmRlbnRMaXN0X2luZGVudGF0aW9uVW5pdCAgaW5kZW50YXRpb25pbmRlbnRhdGlvblVuaXRpbmRlbnRNb3JlaW5kZW50TGVzc2luZGVudEJsb2NrVGFnZ2luZ05zYnRhZ1N0YWNrcHVzaFRhZ3RhZ3ByZXBlbmRwb3BUYWdoZWFkdGFpbHN0cmluZ2FkZERlZmF1bHRQYXJhbWV0ZXJzbm9kZXBhcmFtc29wZW5Ob2RlYWRkQ3VycmVudEluZGVudGFkZFR5cGVXaXRoUGFyYW1zPgpvcGVuQW5kQ2xvc2VOb2RlLz4KY2xvc2VOb2RlPC9mb3JFYWNoa3N0cnZhbHVlVG9TdHJpbmcmbHQ7Jmd0O1tudWxsXT0iZXF1YWxFbGVtZW50c2VxdWFsU2V0c2NvbnRhaW5zQWxsS1Z3cml0ZUpzb25Fc2NhcGVkQ2hhcnNPbmFkZENvZGVVbml0RXNjYXBlZFx1MHRvUmFkaXhTdHJpbmd3cml0ZUVzY2FwZWRPbmNvZGVVbml0QXRcIlx0XG5cclxcd3JpdGVDaGFyQ29kZWNvbXB1dGVIYXNoQ29kZXBhcnQxcGFydDJwYXJ0M3BhcnQ0cGFydDVtb2RpZmllcnNUb1N0cmluZ2lzU3RhdGljaXNBYnN0cmFjdGlzRmluYWxpc1ZhcmlzQ29uc3Rpc0ZhY3Rvcnlpc0V4dGVybmFsaXNDb3ZhcmlhbnRidWlsZGVyYWRkTGFzdHN0YXRpY2Fic3RyYWN0ZmluYWx2YXJjb25zdGZhY3RvcnlleHRlcm5hbGNvdmFyaWFudHRvTGlua3ByaW50T25sb25nZXN0Q29tbW9uUHJlZml4TGVuZ3RobWFrZVVuaXF1ZXN1Z2dlc3RlZE5hbWV1c2VkTmFtZXNjb3VudGVya2VybmVsbG9hZENvbXBvbmVudEZyb21CaW5hcnlieXRlc3JlYWRBc0J5dGVzU3luY2xvYWRDb21wb25lbnRGcm9tQnl0ZXNyZWFkQ29tcG9uZW50bG9hZENvbXBvbmVudFNvdXJjZUZyb21CeXRlc3JlYWRDb21wb25lbnRTb3VyY2V3cml0ZUNvbXBvbmVudFRvQmluYXJ5c2lua251bGxzdGRvdXRub25CbG9ja2luZ29wZW5Xcml0ZXdyaXRlQ29tcG9uZW50RmlsZWZsdXNod3JpdGVMaWJyYXJ5VG9UZXh0bGlicmFyeXdyaXRlTGlicmFyeUZpbGV3cml0ZUFzU3RyaW5nU3luY3dyaXRlQ29tcG9uZW50VG9UZXh0c2hvd0V4dGVybmFsc2hvd09mZnNldHNzaG93TWV0YWRhdGFrZXJuZWwuYXN0Q2Fub25pY2FsTmFtZU5vZGVhY2NlcHR2aXNpdENoaWxkcmVuVHJlZU5vZGVfaGFzaENvdW50ZXJub09mZnNldHBhcmVudGZpbGVPZmZzZXR0cmFuc2Zvcm1DaGlsZHJlbnJlcGxhY2VDaGlsZGNoaWxkcmVwbGFjZW1lbnRyZXBsYWNlV2l0aHJlbW92ZWVuY2xvc2luZ0NvbXBvbmVudGxvY2F0aW9uX2dldExvY2F0aW9uSW5FbmNsb3NpbmdGaWxlTmFtZWROb2RlcmVmZXJlbmNlY2Fub25pY2FsTmFtZUZpbGVVcmlOb2RlZmlsZVVyaUFubm90YXRhYmxlYW5ub3RhdGlvbnNhZGRBbm5vdGF0aW9uUmVmZXJlbmNlUmVmZXJlbmNlIHRvIFVuYm91bmQgcmVmZXJlbmNlYXNMaWJyYXJ5IGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBsaWJyYXJ5IHdhcyBleHBlY3RlZGFzQ2xhc3MgaXMgbm90IGJvdW5kIHRvIGFuIEFTVCBub2RlLiBBIGNsYXNzIHdhcyBleHBlY3RlZGFzTWVtYmVyIGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBtZW1iZXIgd2FzIGV4cGVjdGVkYXNGaWVsZCBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgZmllbGQgd2FzIGV4cGVjdGVkYXNDb25zdHJ1Y3RvciBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgY29uc3RydWN0b3Igd2FzIGV4cGVjdGVkYXNQcm9jZWR1cmUgaXMgbm90IGJvdW5kIHRvIGFuIEFTVCBub2RlLiBBIHByb2NlZHVyZSB3YXMgZXhwZWN0ZWRhc1R5cGVkZWYgaXMgbm90IGJvdW5kIHRvIGFuIEFTVCBub2RlLiBBIHR5cGVkZWYgd2FzIGV4cGVjdGVkTGlicmFyeWltcG9ydFVyaWxhbmd1YWdlVmVyc2lvbk1ham9ybGFuZ3VhZ2VWZXJzaW9uTWlub3JFeHRlcm5hbEZsYWdTeW50aGV0aWNGbGFnZmxhZ3Nwcm9ibGVtc0FzSnNvbmFkZGl0aW9uYWxFeHBvcnRzcGFydHN0eXBlZGVmc2NsYXNzZXNwcm9jZWR1cmVzZmllbGRzX2xpYnJhcnlJZENvdW50ZXJfbGlicmFyeUlkfmlzU3ludGhldGljbWVtYmVyc2V4cGFuZGFkZE1lbWJlcmFkZENsYXNzY2xhc3NfYWRkRmllbGRmaWVsZGFkZFByb2NlZHVyZXByb2NlZHVyZWFkZFR5cGVkZWZ0eXBlZGVmX2NvbXB1dGVDYW5vbmljYWxOYW1lc2dldENoaWxkRnJvbVR5cGVkZWZiaW5kVG9nZXRDaGlsZEZyb21NZW1iZXJnZXRDaGlsZGFkZERlcGVuZGVuY3lhZGRQYXJ0dmlzaXRMaWJyYXJ5TGlicmFyeURlcGVuZGVuY3lpbXBvcnRlZExpYnJhcnlSZWZlcmVuY2Vjb21iaW5hdG9yc0V4cG9ydEZsYWdEZWZlcnJlZEZsYWdpbXBvcnRlZExpYnJhcnlkZWZlcnJlZEltcG9ydGltcG9ydGV4cG9ydGJ5UmVmZXJlbmNlZW5jbG9zaW5nTGlicmFyeXRhcmdldExpYnJhcnlpc0V4cG9ydGlzSW1wb3J0aXNEZWZlcnJlZGFubm90YXRpb252aXNpdExpYnJhcnlEZXBlbmRlbmN5TGlicmFyeVBhcnRwYXJ0VXJpdmlzaXRMaWJyYXJ5UGFydENvbWJpbmF0b3Jpc1Nob3duYW1lc3Nob3doaWRlZGVwZW5kZW5jeWlzSGlkZXZpc2l0Q29tYmluYXRvclR5cGVkZWZ0eXBlUGFyYW1ldGVyc3R5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGVwb3NpdGlvbmFsUGFyYW1ldGVyc25hbWVkUGFyYW1ldGVyc3RoaXNUeXBldmlzaXRUeXBlZGVmdmlzaXREYXJ0VHlwZUNsYXNzTGV2ZWxDbGFzc0xldmVsLlRlbXBvcmFyeUNsYXNzTGV2ZWwuVHlwZUNsYXNzTGV2ZWwuSGllcmFyY2h5Q2xhc3NMZXZlbC5NaXhpbkNsYXNzTGV2ZWwuQm9keVRlbXBvcmFyeVR5cGVIaWVyYXJjaHlNaXhpbkJvZHlDbGFzc3N0YXJ0RmlsZU9mZnNldGZpbGVFbmRPZmZzZXRsZXZlbExldmVsTWFza0ZsYWdBYnN0cmFjdEZsYWdFbnVtRmxhZ0Fub255bW91c01peGluRmxhZ0VsaW1pbmF0ZWRNaXhpbkZsYWdNaXhpbkRlY2xhcmF0aW9uc3VwZXJ0eXBlbWl4ZWRJblR5cGVpbXBsZW1lbnRlZFR5cGVzY29uc3RydWN0b3JzcmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzX3Jhd1R5cGVfdGhpc1R5cGVfYm90dG9tVHlwZWlzQW5vbnltb3VzTWl4aW5pc0VudW1pc0VsaW1pbmF0ZWRNaXhpbmlzTWl4aW5EZWNsYXJhdGlvbnN1cGVyY2xhc3NDb25zdHJhaW50c2NvbnN0cmFpbnRzY2xhc3NOb2RlY3VycmVudENsYXNzc3Vic3RpdHV0aW9uc3Vic3RpdHV0ZVN1cGVydHlwZXN1cGVyY2xhc3NtaXhlZEluQ2xhc3NtaXhpbmlzTWl4aW5BcHBsaWNhdGlvbmRlbWFuZ2xlZE5hbWVuYW1lQXNNaXhpbkFwcGxpY2F0aW9ubmFtZUFzTWl4aW5BcHBsaWNhdGlvblN1YmNsYXNzc3VwZXJzdmlzaXRDbGFzc2FjY2VwdFJlZmVyZW5jZXZpc2l0Q2xhc3NSZWZlcmVuY2Vpc0luRXh0ZXJuYWxMaWJyYXJ5YXNSYXdTdXBlcnR5cGVhc1RoaXNTdXBlcnR5cGVyYXdUeXBlYm90dG9tVHlwZXZpc2l0U3VwZXJ0eXBlTWVtYmVydHJhbnNmb3JtZXJGbGFnc2VuY2xvc2luZ0NsYXNzaGFzR2V0dGVyaGFzU2V0dGVyaXNJbnN0YW5jZU1lbWJlcmdldHRlclR5cGVzZXR0ZXJUeXBlY29udGFpbnNTdXBlckNhbGxzRmllbGRpbml0aWFsaXplckZsYWdGaW5hbEZsYWdDb25zdEZsYWdTdGF0aWNGbGFnSGFzSW1wbGljaXRHZXR0ZXJGbGFnSGFzSW1wbGljaXRTZXR0ZXJGbGFnQ292YXJpYW50RmxhZ0dlbmVyaWNDb3ZhcmlhbnRJbXBsaGFzSW1wbGljaXRHZXR0ZXJoYXNJbXBsaWNpdFNldHRlcmlzR2VuZXJpY0NvdmFyaWFudEltcGxpc011dGFibGVGaWVsZHMgY2Fubm90IGJlIGV4dGVybmFsdmlzaXRGaWVsZHZpc2l0RmllbGRSZWZlcmVuY2VDb25zdHJ1Y3RvcmluaXRpYWxpemVyc0ZsYWdFeHRlcm5hbEZsYWdTeW50aGV0aWN2aXNpdENvbnN0cnVjdG9ydmlzaXRDb25zdHJ1Y3RvclJlZmVyZW5jZVJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ydHlwZUFyZ3VtZW50c3RhcmdldFJlZmVyZW5jZXJlcXVpcmVkUGFyYW1ldGVyQ291bnRpc1VucmVzb2x2ZWR2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ydmlzaXRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvclJlZmVyZW5jZVByb2NlZHVyZWZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRSZWZlcmVuY2Vmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldFJlZmVyZW5jZUZsYWdGb3J3YXJkaW5nU3R1YkZsYWdGb3J3YXJkaW5nU2VtaVN0dWJGbGFnUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JGbGFnTm9TdWNoTWV0aG9kRm9yd2FyZGVyaXNGb3J3YXJkaW5nU3R1YmlzRm9yd2FyZGluZ1NlbWlTdHViZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldGZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0bmV3VmFsdWVzZXRUcmFuc2Zvcm1lckZsYWdzV2l0aG91dExhenlMb2FkaW5naXNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcmlzU3ludGhldGljRm9yd2FyZGVyaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXJpc0dldHRlclByb2NlZHVyZUtpbmQuR2V0dGVyaXNTZXR0ZXJQcm9jZWR1cmVLaW5kLlNldHRlcmlzQWNjZXNzb3J2aXNpdFByb2NlZHVyZXZpc2l0UHJvY2VkdXJlUmVmZXJlbmNlcmV0dXJuVHlwZWZ1bmN0aW9uVHlwZVByb2NlZHVyZUtpbmRQcm9jZWR1cmVLaW5kLk1ldGhvZFByb2NlZHVyZUtpbmQuT3BlcmF0b3JNZXRob2RHZXR0ZXJTZXR0ZXJPcGVyYXRvckZhY3RvcnlJbml0aWFsaXplckludmFsaWRJbml0aWFsaXplcnZpc2l0SW52YWxpZEluaXRpYWxpemVyRmllbGRJbml0aWFsaXplcmZpZWxkUmVmZXJlbmNldmlzaXRGaWVsZEluaXRpYWxpemVyU3VwZXJJbml0aWFsaXplcnZpc2l0U3VwZXJJbml0aWFsaXplclJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJ2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJMb2NhbEluaXRpYWxpemVydmlzaXRMb2NhbEluaXRpYWxpemVyQXNzZXJ0SW5pdGlhbGl6ZXJzdGF0ZW1lbnR2aXNpdEFzc2VydEluaXRpYWxpemVyRnVuY3Rpb25Ob2RlYXN5bmNNYXJrZXJkYXJ0QXN5bmNNYXJrZXJfYm9keWxhenlCdWlsZGVyQXN5bmNNYXJrZXIuU3luY19idWlsZExhenlsYXp5QnVpbGRlckxvY2FsX2dldFR5cGVPZlZhcmlhYmxlX2dldE5hbWVkVHlwZU9mVmFyaWFibGVuYW1lZGdyb3dhYmxldHlwZVBhcmFtZXRlcnNDb3B5dmlzaXRGdW5jdGlvbk5vZGVBc3luY01hcmtlckFzeW5jTWFya2VyLlN5bmNTdGFyQXN5bmNNYXJrZXIuQXN5bmNBc3luY01hcmtlci5Bc3luY1N0YXJBc3luY01hcmtlci5TeW5jWWllbGRpbmdTeW5jU3luY1N0YXJBc3luY0FzeW5jU3RhclN5bmNZaWVsZGluZ0V4cHJlc3Npb25nZXRTdGF0aWNUeXBldHlwZXNnZXRTdGF0aWNUeXBlQXNJbnN0YW5jZU9mYm91bmRudWxsVHlwZXVwY2FzdFR5cGVnZXRUeXBlQXNJbnN0YW5jZU9mdHlwZUVycm9yIGlzIG5vdCBhIHN1YnR5cGUgb2YgYWNjZXB0MWFyZ0ludmFsaWRFeHByZXNzaW9udmlzaXRJbnZhbGlkRXhwcmVzc2lvblZhcmlhYmxlR2V0cHJvbW90ZWRUeXBldmlzaXRWYXJpYWJsZUdldFZhcmlhYmxlU2V0dmlzaXRWYXJpYWJsZVNldFByb3BlcnR5R2V0cmVjZWl2ZXJpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2VpbnRlcmZhY2VUYXJnZXRyZWNlaXZlclR5cGVzdWJzdGl0dXRlVHlwZW5hbWVTdHJpbmdpbnRUeXBlcnVudGltZVR5cGV0eXBlVHlwZXZpc2l0UHJvcGVydHlHZXRQcm9wZXJ0eVNldHZpc2l0UHJvcGVydHlTZXREaXJlY3RQcm9wZXJ0eUdldHZpc2l0RGlyZWN0UHJvcGVydHlHZXREaXJlY3RQcm9wZXJ0eVNldHZpc2l0RGlyZWN0UHJvcGVydHlTZXREaXJlY3RNZXRob2RJbnZvY2F0aW9udmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yZ2V0VHlwZU9mT3ZlcmxvYWRlZEFyaXRobWV0aWNwb3NpdGlvbmFsU3VwZXJQcm9wZXJ0eUdldGRlY2xhcmluZ0NsYXNzdmlzaXRTdXBlclByb3BlcnR5R2V0U3VwZXJQcm9wZXJ0eVNldHZpc2l0U3VwZXJQcm9wZXJ0eVNldFN0YXRpY0dldHZpc2l0U3RhdGljR2V0U3RhdGljU2V0dmlzaXRTdGF0aWNTZXRBcmd1bWVudHNlbXB0eWZvcndhcmRlZHZpc2l0QXJndW1lbnRzTmFtZWRFeHByZXNzaW9udmlzaXROYW1lZEV4cHJlc3Npb25JbnZvY2F0aW9uRXhwcmVzc2lvbk1ldGhvZEludm9jYXRpb25ib29sVHlwZXZpc2l0TWV0aG9kSW52b2NhdGlvblN1cGVyTWV0aG9kSW52b2NhdGlvbnZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uU3RhdGljSW52b2NhdGlvbnZpc2l0U3RhdGljSW52b2NhdGlvbkNvbnN0cnVjdG9ySW52b2NhdGlvbnZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uY29uc3RydWN0ZWRUeXBlSW5zdGFudGlhdGlvbndpdGhvdXRUeXBlUGFyYW1ldGVyc3Zpc2l0SW5zdGFudGlhdGlvbk5vdG9wZXJhbmR2aXNpdE5vdExvZ2ljYWxFeHByZXNzaW9ubGVmdG9wZXJhdG9ycmlnaHR2aXNpdExvZ2ljYWxFeHByZXNzaW9uQ29uZGl0aW9uYWxFeHByZXNzaW9uY29uZGl0aW9ub3RoZXJ3aXNlc3RhdGljVHlwZXZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uU3RyaW5nQ29uY2F0ZW5hdGlvbmV4cHJlc3Npb25zc3RyaW5nVHlwZXZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbkxpc3RDb25jYXRlbmF0aW9udHlwZUFyZ3VtZW50bGlzdHNsaXRlcmFsTGlzdFR5cGV2aXNpdExpc3RDb25jYXRlbmF0aW9uU2V0Q29uY2F0ZW5hdGlvbnNldHNsaXRlcmFsU2V0VHlwZXZpc2l0U2V0Q29uY2F0ZW5hdGlvbk1hcENvbmNhdGVuYXRpb25rZXlUeXBldmFsdWVUeXBlbWFwc2xpdGVyYWxNYXBUeXBldmlzaXRNYXBDb25jYXRlbmF0aW9uSW5zdGFuY2VDcmVhdGlvbmNsYXNzUmVmZXJlbmNlZmllbGRWYWx1ZXNhc3NlcnRzdW51c2VkQXJndW1lbnRzdmlzaXRJbnN0YW5jZUNyZWF0aW9uZmllbGRSZWZ0cmFuc2Zvcm1lZElzRXhwcmVzc2lvbnZpc2l0SXNFeHByZXNzaW9uQXNFeHByZXNzaW9uRmxhZ1R5cGVFcnJvcmlzVHlwZUVycm9ydmlzaXRBc0V4cHJlc3Npb25CYXNpY0xpdGVyYWxTdHJpbmdMaXRlcmFsdmlzaXRTdHJpbmdMaXRlcmFsSW50TGl0ZXJhbHZpc2l0SW50TGl0ZXJhbERvdWJsZUxpdGVyYWxkb3VibGVUeXBldmlzaXREb3VibGVMaXRlcmFsQm9vbExpdGVyYWx2aXNpdEJvb2xMaXRlcmFsTnVsbExpdGVyYWx2aXNpdE51bGxMaXRlcmFsU3ltYm9sTGl0ZXJhbHN5bWJvbFR5cGV2aXNpdFN5bWJvbExpdGVyYWxUeXBlTGl0ZXJhbHZpc2l0VHlwZUxpdGVyYWxUaGlzRXhwcmVzc2lvbnZpc2l0VGhpc0V4cHJlc3Npb25SZXRocm93dmlzaXRSZXRocm93VGhyb3d2aXNpdFRocm93TGlzdExpdGVyYWx2aXNpdExpc3RMaXRlcmFsU2V0TGl0ZXJhbHZpc2l0U2V0TGl0ZXJhbE1hcExpdGVyYWx2aXNpdE1hcExpdGVyYWxNYXBFbnRyeXZpc2l0TWFwRW50cnlBd2FpdEV4cHJlc3Npb251bmZ1dHVyZVR5cGV2aXNpdEF3YWl0RXhwcmVzc2lvbkxvY2FsRnVuY3Rpb25GdW5jdGlvbkV4cHJlc3Npb252aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbkNvbnN0YW50RXhwcmVzc2lvbmNvbnN0YW50dmlzaXRDb25zdGFudEV4cHJlc3Npb252aXNpdENvbnN0YW50TGV0dmlzaXRMZXRCbG9ja0V4cHJlc3Npb252aXNpdEJsb2NrRXhwcmVzc2lvbkxvYWRMaWJyYXJ5ZnV0dXJlVHlwZXZpc2l0TG9hZExpYnJhcnlDaGVja0xpYnJhcnlJc0xvYWRlZG9iamVjdFR5cGV2aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkU3RhdGVtZW50RXhwcmVzc2lvblN0YXRlbWVudHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudEJsb2Nrc3RhdGVtZW50c3JlbW92ZUxhc3R2aXNpdEJsb2NrYWRkU3RhdGVtZW50QXNzZXJ0QmxvY2t2aXNpdEFzc2VydEJsb2NrRW1wdHlTdGF0ZW1lbnR2aXNpdEVtcHR5U3RhdGVtZW50QXNzZXJ0U3RhdGVtZW50Y29uZGl0aW9uU3RhcnRPZmZzZXRjb25kaXRpb25FbmRPZmZzZXR2aXNpdEFzc2VydFN0YXRlbWVudExhYmVsZWRTdGF0ZW1lbnR2aXNpdExhYmVsZWRTdGF0ZW1lbnRCcmVha1N0YXRlbWVudHZpc2l0QnJlYWtTdGF0ZW1lbnRXaGlsZVN0YXRlbWVudHZpc2l0V2hpbGVTdGF0ZW1lbnREb1N0YXRlbWVudHZpc2l0RG9TdGF0ZW1lbnRGb3JTdGF0ZW1lbnR2YXJpYWJsZXN1cGRhdGVzdmlzaXRGb3JTdGF0ZW1lbnRGb3JJblN0YXRlbWVudGJvZHlPZmZzZXRpc0FzeW5jdmlzaXRGb3JJblN0YXRlbWVudFN3aXRjaFN0YXRlbWVudGNhc2VzdmlzaXRTd2l0Y2hTdGF0ZW1lbnRTd2l0Y2hDYXNlZXhwcmVzc2lvbk9mZnNldHNpc0RlZmF1bHRkZWZhdWx0Q2FzZXZpc2l0U3dpdGNoQ2FzZUNvbnRpbnVlU3dpdGNoU3RhdGVtZW50dmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudElmU3RhdGVtZW50dmlzaXRJZlN0YXRlbWVudFJldHVyblN0YXRlbWVudHZpc2l0UmV0dXJuU3RhdGVtZW50VHJ5Q2F0Y2hjYXRjaGVzdmlzaXRUcnlDYXRjaENhdGNoZ3VhcmRzdGFja1RyYWNldmlzaXRDYXRjaFRyeUZpbmFsbHlmaW5hbGl6ZXJ2aXNpdFRyeUZpbmFsbHlZaWVsZFN0YXRlbWVudEZsYWdZaWVsZFN0YXJGbGFnTmF0aXZlaXNZaWVsZFN0YXJpc05hdGl2ZXZpc2l0WWllbGRTdGF0ZW1lbnRWYXJpYWJsZURlY2xhcmF0aW9uZmlsZUVxdWFsc09mZnNldGJpbmFyeU9mZnNldE5vVGFnRmxhZ0ZpZWxkRm9ybWFsRmxhZ0luU2NvcGVpc0ZpZWxkRm9ybWFsZm9yVmFsdWV2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb25GdW5jdGlvbkRlY2xhcmF0aW9udmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uTmFtZV9pbnRlcm5hbGxpYnJhcnlOYW1laXNQcml2YXRldmlzaXROYW1lX1ByaXZhdGVOYW1lOjpfY29tcHV0ZUhhc2hDb2RlX1B1YmxpY05hbWVOdWxsYWJpbGl0eU51bGxhYmlsaXR5LmxlZ2FjeU51bGxhYmlsaXR5Lm51bGxhYmxlTnVsbGFiaWxpdHkubm9uTnVsbGFibGVOdWxsYWJpbGl0eS5uZWl0aGVybGVnYWN5bnVsbGFibGVub25OdWxsYWJsZW5laXRoZXJEYXJ0VHlwZW51bGxhYmlsaXR5dW5hbGlhc3VuYWxpYXNPbmNlSW52YWxpZFR5cGV2aXNpdEludmFsaWRUeXBlSW52YWxpZFR5cGUgZG9lc24ndCBoYXZlIG51bGxhYmlsaWl0eUR5bmFtaWNUeXBldmlzaXREeW5hbWljVHlwZVZvaWRUeXBldmlzaXRWb2lkVHlwZUJvdHRvbVR5cGV2aXNpdEJvdHRvbVR5cGVJbnRlcmZhY2VUeXBlY2xhc3NOYW1lX2RlZmF1bHRUeXBlQXJndW1lbnRzdmlzaXRJbnRlcmZhY2VUeXBlRnVuY3Rpb25UeXBldHlwZWRlZlR5cGVfaGFzaENvZGV0eXBlZGVmUmVmZXJlbmNldHlwZWRlZnZpc2l0RnVuY3Rpb25UeXBlZ2V0TmFtZWRQYXJhbWV0ZXJsb3dlcnVwcGVycGl2b3R+L25hbWVkUGFyYW1ldGVyY29tcGFyaXNvblR5cGVkZWZUeXBldHlwZWRlZk5vZGV2aXNpdFR5cGVkZWZUeXBldmlzaXRUeXBlZGVmUmVmZXJlbmNlTmFtZWRUeXBldmlzaXROYW1lZFR5cGVUeXBlUGFyYW1ldGVyVHlwZWRlY2xhcmVkTnVsbGFiaWxpdHlwcm9tb3RlZEJvdW5kdmlzaXRUeXBlUGFyYW1ldGVyVHlwZWdldE51bGxhYmlsaXR5bGhzTnVsbGFiaWxpdHlib3VuZE51bGxhYmlsaXR5VHlwZVBhcmFtZXRlcmRlZmF1bHRUeXBldmlzaXRUeXBlUGFyYW1ldGVyaXNGdW5jdGlvblR5cGVUeXBlUGFyYW1ldGVyU3VwZXJ0eXBlYXNJbnRlcmZhY2VUeXBlQ29uc3RhbnRnZXRUeXBlYXNFeHByZXNzaW9uUHJpbWl0aXZlQ29uc3RhbnROdWxsQ29uc3RhbnR2aXNpdE51bGxDb25zdGFudHZpc2l0TnVsbENvbnN0YW50UmVmZXJlbmNlQm9vbENvbnN0YW50dmlzaXRCb29sQ29uc3RhbnR2aXNpdEJvb2xDb25zdGFudFJlZmVyZW5jZUludENvbnN0YW50dmlzaXRJbnRDb25zdGFudHZpc2l0SW50Q29uc3RhbnRSZWZlcmVuY2VEb3VibGVDb25zdGFudHZpc2l0RG91YmxlQ29uc3RhbnR2aXNpdERvdWJsZUNvbnN0YW50UmVmZXJlbmNlaXNOYU5TdHJpbmdDb25zdGFudHZpc2l0U3RyaW5nQ29uc3RhbnR2aXNpdFN0cmluZ0NvbnN0YW50UmVmZXJlbmNlU3ltYm9sQ29uc3RhbnRsaWJyYXJ5UmVmZXJlbmNldmlzaXRTeW1ib2xDb25zdGFudHZpc2l0U3ltYm9sQ29uc3RhbnRSZWZlcmVuY2UjTWFwQ29uc3RhbnRfY2FjaGVkSGFzaENvZGV2aXNpdE1hcENvbnN0YW50dmlzaXRNYXBDb25zdGFudFJlZmVyZW5jZT4oQ29uc3RhbnRNYXBFbnRyeUxpc3RDb25zdGFudHZpc2l0TGlzdENvbnN0YW50dmlzaXRMaXN0Q29uc3RhbnRSZWZlcmVuY2VTZXRDb25zdGFudHZpc2l0U2V0Q29uc3RhbnR2aXNpdFNldENvbnN0YW50UmVmZXJlbmNlSW5zdGFuY2VDb25zdGFudHZpc2l0SW5zdGFuY2VDb25zdGFudHZpc2l0SW5zdGFuY2VDb25zdGFudFJlZmVyZW5jZSB7fVBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnR0ZWFyT2ZmQ29uc3RhbnR2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnR2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnRSZWZlcmVuY2U+KXR5cGVFbnZpcm9ubWVudG1hcHBpbmdUZWFyT2ZmQ29uc3RhbnRwcm9jZWR1cmVSZWZlcmVuY2V2aXNpdFRlYXJPZmZDb25zdGFudHZpc2l0VGVhck9mZkNvbnN0YW50UmVmZXJlbmNlVHlwZUxpdGVyYWxDb25zdGFudHZpc2l0VHlwZUxpdGVyYWxDb25zdGFudHZpc2l0VHlwZUxpdGVyYWxDb25zdGFudFJlZmVyZW5jZVVuZXZhbHVhdGVkQ29uc3RhbnR2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnR2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnRSZWZlcmVuY2Vyb290bGlicmFyaWVzdXJpVG9Tb3VyY2VtZXRhZGF0YW1haW5NZXRob2ROYW1lbmFtZVJvb3RhZG9wdENoaWxkcmVuYWRvcHRDaGlsZGNvbXB1dGVDYW5vbmljYWxOYW1lc0ZvckxpYnJhcnlnZXRDaGlsZEZyb21Vcml1bmJpbmRDYW5vbmljYWxOYW1lc3VuYmluZEFsbHZpc2l0Q29tcG9uZW50Z2V0TG9jYXRpb25hZGRNZXRhZGF0YVJlcG9zaXRvcnlyZXBvc2l0b3J5TG9jYXRpb25jb2x1bW5NZXRhZGF0YVJlcG9zaXRvcnl3cml0ZVRvQmluYXJ5cmVhZEZyb21CaW5hcnlCaW5hcnlTaW5rZ2V0QnVmZmVyT2Zmc2V0d3JpdGVCeXRlYnl0ZXdyaXRlQnl0ZXN3cml0ZVVJbnQzMndyaXRlVUludDMwd3JpdGVCeXRlTGlzdHdyaXRlTnVsbEFsbG93ZWRDYW5vbmljYWxOYW1lUmVmZXJlbmNld3JpdGVTdHJpbmdSZWZlcmVuY2V3cml0ZU5hbWV3cml0ZURhcnRUeXBld3JpdGVOb2RlZW50ZXJTY29wZW1lbWJlclNjb3BldmFyaWFibGVTY29wZWxlYXZlU2NvcGVCaW5hcnlTb3VyY2VjdXJyZW50T2Zmc2V0cmVhZEJ5dGVyZWFkQnl0ZXNyZWFkVUludHJlYWRVaW50MzJyZWFkQnl0ZUxpc3RyZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZXJlYWRTdHJpbmdSZWZlcmVuY2VyZWFkTmFtZXJlYWREYXJ0VHlwZXJlYWRGdW5jdGlvbk5vZGVfQ2hpbGRSZXBsYWNlcmRlZmF1bHRUcmVlTm9kZVNvdXJjZWxpbmVTdGFydHNjYWNoZWRUZXh0Z2V0VGV4dExpbmVkZWNvZGVhbGxvd01hbGZvcm1lZGVuZE9mTGluZUludGVybmFsIGVycm9ybWlkbGluZUluZGV4bGluZVN0YXJ0bGluZU51bWJlcmNvbHVtbk51bWJlcl9IYXNoTS03MDcwNjc1NTY1OTIxNDI0MDIzaW50SXM2NEJpdGNvbWJpbmVmaW5pc2hjb21iaW5lRmluaXNoY29tYmluZTJ2YWx1ZTF2YWx1ZTJjb21iaW5lMkZpbmlzaGhhc2gyb2JqZWN0MW9iamVjdDJjb21iaW5lTGlzdEhhc2hpdGVtY29tYmluZUxpc3RoYXNoZXNjb21iaW5lTWFwSGFzaFVub3JkZXJlZGVudHJ5SGFzaGVzX3NocnU5MjIzMzcyMDM2ODU0NzcxNzEyX3RlbXBvcmFyeUhhc2hDb2RlVGFibGVpbmZvcm1hdGl2ZXNldFBhcmVudHNub2Rlc3Zpc2l0TGlzdHZpc2l0b3J2aXNpdEl0ZXJhYmxldHJhbnNmb3JtVHlwZUxpc3RzdG9yZUluZGV4dHJhbnNmb3JtU3VwZXJ0eXBlTGlzdHRyYW5zZm9ybUxpc3RfZ2V0QXNUeXBlQXJndW1lbnRzZ2V0TWVtYmVyUmVmZXJlbmNlZ2V0Q2xhc3NSZWZlcmVuY2VnZXRDYW5vbmljYWxOYW1lT2ZNZW1iZXIgaGFzIG5vIGNhbm9uaWNhbCBuYW1lZ2V0Q2Fub25pY2FsTmFtZU9mQ2xhc3NnZXRDYW5vbmljYWxOYW1lT2ZMaWJyYXJ5bGlzdEhhc2hDb2RlbWFwSGFzaENvZGVtYXBIYXNoQ29kZU9yZGVyZWRtYXBIYXNoQ29kZVVub3JkZXJlZGxpc3RFcXVhbHNtYXBFcXVhbHNjb250YWluc0tleWdldENhbm9uaWNhbE5hbWVPZlR5cGVkZWZfZ2V0TG9jYXRpb25JbkNvbXBvbmVudGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWVuYW1lUGFydHMgd2l0aCBkZW1hbmdsZU1peGluQXBwbGljYXRpb25TdWJjbGFzc05hbWVrZXJuZWwudGFyZ2V0LnRhcmdldHNfVGFyZ2V0QnVpbGRlclRhcmdldEZsYWdzdHJhY2tXaWRnZXRDcmVhdGlvbkRpYWdub3N0aWNSZXBvcnRlckNjaGFyT2Zmc2V0TnVtYmVyU2VtYW50aWNzTnVtYmVyU2VtYW50aWNzLnZtTnVtYmVyU2VtYW50aWNzLmpzdm1Db25zdGFudHNCYWNrZW5kbG93ZXJMaXN0Q29uc3RhbnRsb3dlclNldENvbnN0YW50bG93ZXJNYXBDb25zdGFudG51bWJlclNlbWFudGljc3Nob3VsZElubGluZUNvbnN0YW50c3VwcG9ydHNVbmV2YWx1YXRlZENvbnN0YW50c2V4dHJhUmVxdWlyZWRMaWJyYXJpZXNleHRyYURlY2xhcmVkVmFyaWFibGVzcmVxdWlyZWRTZGtDbGFzc2VzZW5hYmxlTm9TdWNoTWV0aG9kRm9yd2FyZGVyc2VuYWJsZVN1cGVyTWl4aW5zcGVyZm9ybU91dGxpbmVUcmFuc2Zvcm1hdGlvbnNwZXJmb3JtUHJlQ29uc3RhbnRFdmFsdWF0aW9uVHJhbnNmb3JtYXRpb25zY29yZVR5cGVzZGlhZ25vc3RpY1JlcG9ydGVybG9nZ2VycGVyZm9ybU1vZHVsYXJUcmFuc2Zvcm1hdGlvbnNPbkxpYnJhcmllc2hpZXJhcmNoeXBlcmZvcm1UcmFuc2Zvcm1hdGlvbnNPblByb2NlZHVyZW1heURlZmluZVJlc3RyaWN0ZWRUeXBlZGFydGNvcmVhbGxvd1BsYXRmb3JtUHJpdmF0ZUxpYnJhcnlBY2Nlc3NpbXBvcnRlcmltcG9ydGVkZGFydF9pbnRlcm5hbC9lbmFibGVOYXRpdmVuYXRpdmVFeHRlbnNpb25FeHBlY3RzU3RyaW5nZXJyb3JPblVuZXhhY3RXZWJJbnRMaXRlcmFsc3N1cHBvcnRzU2V0TGl0ZXJhbHNpbnN0YW50aWF0ZUludm9jYXRpb25pc1N1cGVyaW5zdGFudGlhdGVOb1N1Y2hNZXRob2RFcnJvcmlzTWV0aG9kaXNGaWVsZGlzTG9jYWxWYXJpYWJsZWlzRHluYW1pY2lzQ29uc3RydWN0b3Jpc1RvcExldmVsY29uZmlndXJlQ29tcG9uZW50VGFyZ2V0KGNvbmNyZXRlTGlzdExpdGVyYWxDbGFzc2NvbmNyZXRlQ29uc3RMaXN0TGl0ZXJhbENsYXNzY29uY3JldGVNYXBMaXRlcmFsQ2xhc3Njb25jcmV0ZUNvbnN0TWFwTGl0ZXJhbENsYXNzY29uY3JldGVJbnRMaXRlcmFsQ2xhc3Njb25jcmV0ZVN0cmluZ0xpdGVyYWxDbGFzc2NvbnN0YW50c0JhY2tlbmROb25lQ29uc3RhbnRzQmFja2VuZE5vbmVUYXJnZXRub25ldGFyZ2V0TmFtZXN0YXJnZXRzZ2V0VGFyZ2V0ZnJvbnRfZW5kLmNvbXBpbGVyX29wdGlvbnNwYXJzZUV4cGVyaW1lbnRhbEZsYWdTdGFuZGFyZEZpbGVTeXN0ZW1zZGtSb290aW5wdXRTdW1tYXJpZXNzZGtTdW1tYXJ5ZGVjbGFyZWRWYXJpYWJsZXNjb21waWxlU2RrY2hhc2VEZXBlbmRlbmNpZXNuZXh0IHJlbGVhc2V0YXJnZXRQYXRjaGVzZW52aXJvbm1lbnREZWZpbmVzZXJyb3JPblVuZXZhbHVhdGVkQ29uc3RhbnRkZWJ1Z0R1bXBvbWl0UGxhdGZvcm1zZXRFeGl0Q29kZU9uUHJvYmxlbWVtYmVkU291cmNlVGV4dHRocm93T25FcnJvcnNGb3JEZWJ1Z2dpbmd0aHJvd09uV2FybmluZ3NGb3JEZWJ1Z2dpbmdieXRlY29kZXdyaXRlRmlsZU9uQ3Jhc2hSZXBvcnRleHBlcmltZW50bm8tVW5rbm93biBleHBlcmltZW50OiBFeHBlcmltZW50YWxGbGFnLmV4cGlyZWRGbGFnRXhwZXJpbWVudCBmbGFnIG5vIGxvbmdlciByZXF1aXJlZDogRXhwZXJpbWVudCBzcGVjaWZpZWQgd2l0aCBjb25mbGljdGluZyB2YWx1ZXM6IE5vIGRlZmF1bHQgdmFsdWUgZm9yIGZyb250X2VuZC5kaWFnbm9zdGljX21lc3NhZ2VDb2RlRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbkZvcm1hdHRlZE1lc3NhZ2VhbnNpRm9ybWF0dGVkcGxhaW5UZXh0Rm9ybWF0dGVkc2V2ZXJpdHlnZXRNZXNzYWdlQ29kZU9iamVjdGdldE1lc3NhZ2VDb2RlZ2V0TWVzc2FnZUFyZ3VtZW50c3JlbGF0ZWRJbmZvcm1hdGlvbmNvbnN0YW50VXBkYXRlMjAxOGNvbnRyb2xGbG93Q29sbGVjdGlvbnNleHRlbnNpb25NZXRob2Rzc3ByZWFkQ29sbGVjdGlvbnN0cmlwbGVTaGlmdGV4cGlyZWRGbGFnY29uc3RhbnQtdXBkYXRlLTIwMThjb250cm9sLWZsb3ctY29sbGVjdGlvbnNleHRlbnNpb24tbWV0aG9kc25vbi1udWxsYWJsZXNwcmVhZC1jb2xsZWN0aW9uc3RyaXBsZS1zaGlmdHNldC1saXRlcmFsc2Zyb250X2VuZC5maWxlX3N5c3RlbWVudGl0eUZvclVyaXJlYWRBc0J5dGVzcmVhZEFzU3RyaW5nRmlsZVN5c3RlbUV4Y2VwdGlvbih1cmk9OyBtZXNzYWdlPVVpbnQ4TGlzdEJpbmFyeUJ1aWxkZXJQYWNrYWdlc3BhY2thZ2VfY29uZmlnTWFwUGFja2FnZXNwcmludERpYWdub3N0aWNNZXNzYWdlY29tbWFuZF9saW5lX3JlcG9ydGluZ01lc3NhZ2VtZXNzYWdlQ2FudEluZmVyUGFja2FnZXNGcm9tTWFueUlucHV0c21lc3NhZ2VDYW50SW5mZXJQYWNrYWdlc0Zyb21QYWNrYWdlVXJpbWVzc2FnZUludGVybmFsUHJvYmxlbVByb3ZpZGVkQm90aENvbXBpbGVTZGtBbmRTZGtTdW1tYXJ5bWVzc2FnZU1pc3NpbmdJbnB1dG5vTGVuZ3RodGVtcGxhdGVDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbnRlbXBsYXRlQ2FudFJlYWRGaWxldGVtcGxhdGVJbnB1dEZpbGVOb3RGb3VuZHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWR0ZW1wbGF0ZVBhY2thZ2VzRmlsZUZvcm1hdHRlbXBsYXRlU2RrUm9vdE5vdEZvdW5kdGVtcGxhdGVTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmR0ZW1wbGF0ZVNka1N1bW1hcnlOb3RGb3VuZERlYnVnQWJvcnRUaWNrZXJVcmlUcmFuc2xhdG9yTGlicmFyaWVzU3BlY2lmaWNhdGlvbkV4Y2VwdGlvblRhcmdldExpYnJhcmllc1NwZWNpZmljYXRpb25fcmF3X3BhY2thZ2VzX3BhY2thZ2VzVXJpX3VyaVRyYW5zbGF0b3Jfc2RrU3VtbWFyeUNvbXBvbmVudF9pbnB1dFN1bW1hcmllc0NvbXBvbmVudHNfbGlua2VkRGVwZW5kZW5jaWVzX3Nka1Jvb3Rfc2RrU3VtbWFyeV9zZGtTdW1tYXJ5Qnl0ZXNfbGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaXRpY2tlcl9maWxlU3lzdGVtX3RhcmdldF9jb21wdXRlZFNka0RlZmF1bHRzaXNWZXJib3NlcGFja2FnZXNVcmlfZW5zdXJlU2RrRGVmYXVsdHNsb2FkU2RrU3VtbWFyeUJ5dGVzX3JlYWRBc0J5dGVzcGFja2FnZXNVcmlSYXdmb3JtYXRmb3JtYXR0ZWRmb3JtYXR0ZWRDb250ZXh0U2V2ZXJpdHkuY29udGV4dHdpdGhGb3JtYXR0aW5nbG9nRXJyb3JyZXBvcnREaWFnbm9zdGljTWVzc2FnZV9kZWZhdWx0RGlhZ25vc3RpY01lc3NhZ2VIYW5kbGVycmVwb3J0V2l0aG91dExvY2F0aW9ud2l0aG91dExvY2F0aW9udmFsaWRhdGVPcHRpb25zZXJyb3JPbk1pc3NpbmdJbnB1dDphc3luY190ZW1wb3JhcnlfMDphc3luY190ZW1wb3JhcnlfMWRlYnVnU3RyaW5nTm8gaW5wdXQgZmlsZSBwcm92aWRlZCB0byB0aGUgY29tcGlsZXIuTWlzc2luZ0lucHV0U0RLIHJvb3QgZGlyZWN0b3J5IG5vdCBmb3VuZDogI3VyaS53aXRoQXJndW1lbnRzU0RLIHN1bW1hcnkgbm90IGZvdW5kOiAjdXJpLlRoZSBjb21waWxlU2RrIGFuZCBzZGtTdW1tYXJ5IG9wdGlvbnMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZUludGVybmFsUHJvYmxlbVByb3ZpZGVkQm90aENvbXBpbGVTZGtBbmRTZGtTdW1tYXJ5U2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtSW5wdXQgZmlsZSBub3QgZm91bmQ6ICN1cmkuX2NyZWF0ZUZpbGVTeXN0ZW1pc0V4cGVyaW1lbnRFbmFibGVkbG9hZFNka1N1bW1hcnlsb2FkQ29tcG9uZW50c2RrU3VtbWFyeUNvbXBvbmVudHBsYXRmb3Jtc2RrU3VtbWFyeSBhbHJlYWR5IGxvYWRlZC5sb2FkSW5wdXRTdW1tYXJpZXNhbGxCeXRlc2lucHV0U3VtbWFyaWVzQ29tcG9uZW50c2NvbXBvbmVudHNpbnB1dFN1bW1hcmllc0NvbXBvbmVudHMgYWxyZWFkeSBsb2FkZWQubG9hZExpbmtEZXBlbmRlbmNpZXNhbHdheXNDcmVhdGVOZXdOYW1lZE5vZGVzZGlzYWJsZUxhenlSZWFkaW5nZ2V0VXJpVHJhbnNsYXRvcmJ5cGFzc0NhY2hlbG9nTXNTdGFydGVkIGJ1aWxkaW5nIFVyaVRyYW5zbGF0b3JfY29tcHV0ZUxpYnJhcnlTcGVjaWZpY2F0aW9uUmVhZCBsaWJyYXJpZXMgZmlsZV9nZXRQYWNrYWdlc3BhY2thZ2VzUmVhZCBwYWNrYWdlcyBmaWxlOnNhdmVkX3RyeV9jb250ZXh0X3ZhcjFfZmFzdGFTREsgbGlicmFyaWVzIHNwZWNpZmljYXRpb24gbm90IGZvdW5kOiAjdXJpLk5vcm1hbGx5LCB0aGUgc3BlY2lmaWNhdGlvbiBpcyBhIGZpbGUgbmFtZWQgJ2xpYnJhcmllcy5qc29uJyBpbiB0aGUgRGFydCBTREsgaW5zdGFsbCBsb2NhdGlvbi5zcGVjVW5hYmxlIHRvIHJlYWQgdGhlICdsaWJyYXJpZXMuanNvbicgc3BlY2lmaWNhdGlvbiBmaWxlOgogICNzdHJpbmcuY3JlYXRlUGFja2FnZXNGcm9tRmlsZUNhbid0IGluZmVyIGEgLnBhY2thZ2VzIGZpbGUgd2hlbiBjb21waWxpbmcgbXVsdGlwbGUgaW5wdXRzLlRyeSBzcGVjaWZ5aW5nIHRoZSBmaWxlIGV4cGxpY2l0bHkgd2l0aCB0aGUgLS1wYWNrYWdlcyBvcHRpb24uQ2FudEluZmVyUGFja2FnZXNGcm9tTWFueUlucHV0c0Nhbid0IGluZmVyIGEgLnBhY2thZ2VzIGZpbGUgZnJvbSBhbiBpbnB1dCAncGFja2FnZToqJyBVUkkuQ2FudEluZmVyUGFja2FnZXNGcm9tUGFja2FnZVVyaV9maW5kUGFja2FnZXNjb250ZW50c0Vycm9yIHdoZW4gcmVhZGluZyAnI3VyaSc6ICNzdHJpbmdQcm9ibGVtIGluIHBhY2thZ2VzIGNvbmZpZ3VyYXRpb24gZmlsZTogI3N0cmluZ3NjcmlwdFVyaVVuc3VwcG9ydGVkIG9wZXJhdGlvbjogJyNuYW1lJy5FeHBlY3RlZCBpbnB1dCBVcmkgdG8gYmUgYWJzb2x1dGU6IGNoZWNrSW5EaXJjYW5kaWRhdGUucGFja2FnZXNwYXJlbnREaXIuLnJlcGxhY2VpbmZlciB0aGUgZGVmYXVsdCBzZGsgbG9jYXRpb252bV9wbGF0Zm9ybV9zdHJvbmcuZGlsbHdyaXRlTGlzdGVsZW1lbnRzOiA8ZW1wdHk+cyAgLSBJbnB1dHM6IE91dHB1dDogV2FzIGRpYWdub3N0aWMgbWVzc2FnZSBoYW5kbGVyIHByb3ZpZGVkOiBub3llc0ZpbGVTeXN0ZW06IChwcm92aWRlZDogSW5wdXQgU3VtbWFyaWVzTGlua2VkIERlcGVuZGVuY2llc1BhY2thZ2VzIHVyaTogUGFja2FnZXM6IENvbXBpbGUgU0RLOiBTREsgcm9vdDogIChwcm92aWRlZDogU0RLIHNwZWNpZmljYXRpb246IFNESyBzdW1tYXJ5OiBMZWdhY3kgbW9kZTogVGFyZ2V0OiB0aHJvd09uRXJyb3JzRm9yRGVidWdnaW5nOiB0aHJvd09uV2FybmluZ3NGb3JEZWJ1Z2dpbmc6IGV4aXQgb24gcHJvYmxlbTogRW1iZWQgc291cmNlczogZGVidWdEdW1wOiB2ZXJib3NlOiB2ZXJpZnk6IEhlcm1ldGljRmlsZVN5c3RlbWluY2x1ZGVkRmlsZXNfcmVhbEZpbGVTeXN0ZW1IZXJtZXRpY0FjY2Vzc0V4Y2VwdGlvbkludmFsaWQgYWNjZXNzIHRvIHRoZSBmaWxlIGlzIGFjY2Vzc2VkIGluIGEgbW9kdWxhciBoZXJtZXRpYyBidWlsZCwgYnV0IGl0IHdhcyBub3QgZXhwbGljaXRseSBsaXN0ZWQgYXMgYW4gaW5wdXQuanNvbkRlY29kZWpzb25FbmNvZGVfdGFyZ2V0c3RhcmdldFNwZWNObyBsaWJyYXJ5IHNwZWNpZmljYXRpb24gZm9yIHRhcmdldCAiYmFzZVVyaWpzb25EYXRhdG9wLWxldmVsIHNwZWNpZmljYXRpb24gaXMgbm90IGEgbWFwdGFyZ2V0TmFtZXRhcmdldERhdGFjb21tZW50OnRhcmdldCBzcGVjaWZpY2F0aW9uIGZvciAnJyBpcyBub3QgYSBtYXB0YXJnZXQgc3BlY2lmaWNhdGlvbiBmb3IgJycgZG9lc24ndCBoYXZlIGEgbGlicmFyaWVzIGVudHJ5bGlicmFyaWVzRGF0YWxpYnJhcmllcyBlbnRyeSBmb3IgJ2xpYnJhcnkgZGF0YSBmb3IgJycgaW4gdGFyZ2V0ICdjaGVja0FuZFJlc29sdmV1cmlTdHJpbmd1cmkgdmFsdWUgJycgaXMgbm90IGEgc3RyaW5nKGZyb20gbGlicmFyeSAnJyl1cmkgc2NoZW1lIGluICdwYXRjaGVzcGF0Y2hlcyBlbnRyeSBmb3IgJycgaXMgbm90IGEgbGlzdCBvciBhIHN0cmluZ3N1cHBvcnRlZCJzdXBwb3J0ZWQiIGVudHJ5OiBleHBlY3RlZCBhICdib29sJyBidXQgZ290IGEgJycgKCdfcmVwb3J0RXJyb3J0b0pzb25TdHJpbmd0b0pzb25NYXBwYXRoRm9yX2xpYnJhcmllc2xpYmxpYnJhcnlJbmZvRm9yTGlicmFyeUluZm9mYXN0YS5jb21waWxlcl9jb250ZXh0Wm9uZXJ1blpvbmVkY29tcHV0ZUVuYWJsZUNvbG9yc21lc3NhZ2VJbnRlcm5hbFByb2JsZW1NaXNzaW5nQ29udGV4dGVycm9yc2VuYWJsZUNvbG9yc0NhY2hlZGNhY2hlZFNka1Jvb3RkaXNhYmxlQ29sb3JzZm9ybWF0V2l0aG91dExvY2F0aW9ucmVjb3JkRGVwZW5kZW5jeUV4cGVjdGVkIGEgZmlsZS1VUkksIGJ1dCBnb3Q6ICdDb21waWxlciBjYW5ub3QgcnVuIHdpdGhvdXQgYSBjb21waWxlciBjb250ZXh0LkFyZSBjYWxscyB0byB0aGUgY29tcGlsZXIgd3JhcHBlZCBpbiBDb21waWxlckNvbnRleHQucnVuSW5Db250ZXh0P0ludGVybmFsUHJvYmxlbU1pc3NpbmdDb250ZXh0dGlwSW50ZXJuYWwgcHJvYmxlbTogClRpcDogaXNBY3RpdmVydW5JbkNvbnRleHRhY3Rpb256b25lVmFsdWVzcnVuV2l0aE9wdGlvbnNydW5XaXRoRGVmYXVsdE9wdGlvbnNjb21waWxlckNvbnRleHRLZXlmYXN0YS5jb2Rlc0pzb25FbmNvZGVydXRpbGZhc3RhX2NvZGVzX2dlbmVyYXRlZC5kYXJ0U3VtbWFyeVRlbXBsYXRldGVtcGxhdGVhbmFseXplckNvZGVzTWVzc2FnZUNvZGVUZW1wbGF0ZW1lc3NhZ2VUZW1wbGF0ZXRpcFRlbXBsYXRlbWVzc2FnZU9iamVjdGxvY2F0ZWRNZXNzYWdlOnN5bmNfb3A6aXRlcmF0b3JfY3VycmVudHRvSnNvbmVuY29kZXJjb252ZXJ0ZnJvbUpzb25qc29uU3RyaW5nZGVjb2RlZFNldmVyaXR5LmVycm9yTGVnYWN5V2FybmluZ1NldmVyaXR5Lmlnbm9yZWRTZXZlcml0eS53YXJuaW5ndGVtcGxhdGVBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvblRoZSBjbGFzcyAnI25hbWUnIGlzIGFic3RyYWN0IGFuZCBjYW4ndCBiZSBpbnN0YW50aWF0ZWQuY29kZUFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25ORVdfV0lUSF9BQlNUUkFDVF9DTEFTU2NvZGVBYnN0cmFjdENsYXNzTWVtYmVyTWVtYmVycyBvZiBjbGFzc2VzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdhYnN0cmFjdCcuVHJ5IHJlbW92aW5nIHRoZSAnYWJzdHJhY3QnIGtleXdvcmQuIFlvdSBjYW4gYWRkIHRoZSAnYWJzdHJhY3QnIGtleXdvcmQgYmVmb3JlIHRoZSBjbGFzcyBkZWNsYXJhdGlvbi5BYnN0cmFjdENsYXNzTWVtYmVybWVzc2FnZUFic3RyYWN0Q2xhc3NNZW1iZXJjb2RlQWJzdHJhY3ROb3RTeW5jQWJzdHJhY3QgbWV0aG9kcyBjYW4ndCB1c2UgJ2FzeW5jJywgJ2FzeW5jKicsIG9yICdzeW5jKicuQWJzdHJhY3ROb3RTeW5jTk9OX1NZTkNfQUJTVFJBQ1RfTUVUSE9EbWVzc2FnZUFic3RyYWN0Tm90U3luY3RlbXBsYXRlQWJzdHJhY3RSZWRpcmVjdGVkQ2xhc3NJbnN0YW50aWF0aW9uRmFjdG9yeSByZWRpcmVjdHMgdG8gY2xhc3MgJyNuYW1lJywgd2hpY2ggaXMgYWJzdHJhY3QgYW5kIGNhbid0IGJlIGluc3RhbnRpYXRlZC5jb2RlQWJzdHJhY3RSZWRpcmVjdGVkQ2xhc3NJbnN0YW50aWF0aW9uQWJzdHJhY3RSZWRpcmVjdGVkQ2xhc3NJbnN0YW50aWF0aW9uRkFDVE9SWV9SRURJUkVDVFNfVE9fQUJTVFJBQ1RfQ0xBU1N0ZW1wbGF0ZUFjY2Vzc0Vycm9yQWNjZXNzIGVycm9yOiAnI25hbWUnLmNvZGVBY2Nlc3NFcnJvckFjY2Vzc0Vycm9ydGVtcGxhdGVBbWJpZ3VvdXNTdXBlcnR5cGVzJyNuYW1lJyBjYW4ndCBpbXBsZW1lbnQgYm90aCAnI3R5cGUnIGFuZCAnI3R5cGUyJ2NvZGVBbWJpZ3VvdXNTdXBlcnR5cGVzQW1iaWd1b3VzU3VwZXJ0eXBlc0FNQklHVU9VU19TVVBFUlRZUEVTY29kZUFub255bW91c0JyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uQ2FuJ3QgYnJlYWsgdG8gYSB0YXJnZXQgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uQW5vbnltb3VzQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb25MQUJFTF9JTl9PVVRFUl9TQ09QRW1lc3NhZ2VBbm9ueW1vdXNCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbmNvZGVBbm9ueW1vdXNDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbkNhbid0IGNvbnRpbnVlIGF0IGEgdGFyZ2V0IGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uLkFub255bW91c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9ubWVzc2FnZUFub255bW91c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9udGVtcGxhdGVBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlVGhlIGFyZ3VtZW50IHR5cGUgJyN0eXBlJyBjYW4ndCBiZSBhc3NpZ25lZCB0byB0aGUgcGFyYW1ldGVyIHR5cGUgJyN0eXBlMicuVHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIsIG9yIGNhc3RpbmcgdGhlIGFyZ3VtZW50IHRvICcjdHlwZTInLmNvZGVBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlQXJndW1lbnRUeXBlTm90QXNzaWduYWJsZUFSR1VNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEV0ZW1wbGF0ZUFzY2lpQ29udHJvbENoYXJhY3RlclRoZSBjb250cm9sIGNoYXJhY3RlciAjdW5pY29kZSBjYW4gb25seSBiZSB1c2VkIGluIHN0cmluZ3MgYW5kIGNvbW1lbnRzLmNvZGVBc2NpaUNvbnRyb2xDaGFyYWN0ZXJBc2NpaUNvbnRyb2xDaGFyYWN0ZXJJTExFR0FMX0NIQVJBQ1RFUmNvZGVBc3NlcnRBc0V4cHJlc3Npb25gYXNzZXJ0YCBjYW4ndCBiZSB1c2VkIGFzIGFuIGV4cHJlc3Npb24uQXNzZXJ0QXNFeHByZXNzaW9ubWVzc2FnZUFzc2VydEFzRXhwcmVzc2lvbmNvZGVBc3NlcnRFeHRyYW5lb3VzQXJndW1lbnRgYXNzZXJ0YCBjYW4ndCBoYXZlIG1vcmUgdGhhbiB0d28gYXJndW1lbnRzLkFzc2VydEV4dHJhbmVvdXNBcmd1bWVudG1lc3NhZ2VBc3NlcnRFeHRyYW5lb3VzQXJndW1lbnRjb2RlQXdhaXRBc0lkZW50aWZpZXInYXdhaXQnIGNhbid0IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBpbiAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJyBtZXRob2RzLkF3YWl0QXNJZGVudGlmaWVyQVNZTkNfS0VZV09SRF9VU0VEX0FTX0lERU5USUZJRVJtZXNzYWdlQXdhaXRBc0lkZW50aWZpZXJjb2RlQXdhaXRGb3JOb3RBc3luY1RoZSBhc3luY2hyb25vdXMgZm9yLWluIGNhbiBvbmx5IGJlIHVzZWQgaW4gZnVuY3Rpb25zIG1hcmtlZCB3aXRoICdhc3luYycgb3IgJ2FzeW5jKicuVHJ5IG1hcmtpbmcgdGhlIGZ1bmN0aW9uIGJvZHkgd2l0aCBlaXRoZXIgJ2FzeW5jJyBvciAnYXN5bmMqJywgb3IgcmVtb3ZpbmcgdGhlICdhd2FpdCcgYmVmb3JlIHRoZSBmb3IgbG9vcC5Bd2FpdEZvck5vdEFzeW5jQVNZTkNfRk9SX0lOX1dST05HX0NPTlRFWFRtZXNzYWdlQXdhaXRGb3JOb3RBc3luY2NvZGVBd2FpdE5vdEFzeW5jJ2F3YWl0JyBjYW4gb25seSBiZSB1c2VkIGluICdhc3luYycgb3IgJ2FzeW5jKicgbWV0aG9kcy5Bd2FpdE5vdEFzeW5jQVdBSVRfSU5fV1JPTkdfQ09OVEVYVG1lc3NhZ2VBd2FpdE5vdEFzeW5jdGVtcGxhdGVCYWRUeXBlVmFyaWFibGVJblN1cGVydHlwZUZvdW5kIHVuc3VwcG9ydGVkIHVzZXMgb2YgJyNuYW1lJyBpbiBzdXBlcnR5cGUgJyNuYW1lMicuY29kZUJhZFR5cGVWYXJpYWJsZUluU3VwZXJ0eXBlQmFkVHlwZVZhcmlhYmxlSW5TdXBlcnR5cGV0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFDeWNsZU5vblNpbXBsaWNpdHlHZW5lcmljIHR5cGUgJyNuYW1lJyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gdGhlIGJvdW5kcyBvZiBpdHMgb3duIHR5cGUgdmFyaWFibGVzLiBJdCBpcyByZWZlcmVuY2VkIGluZGlyZWN0bHkgdGhyb3VnaCAnI25hbWUyJy5UcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIHRvICcjbmFtZTInIGhlcmUgb3IgdG8gc29tZSBvdGhlciByYXcgdHlwZXMgaW4gdGhlIGJvdW5kcyBhbG9uZyB0aGUgcmVmZXJlbmNlIGNoYWluLmNvZGVCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5Qm91bmRJc3N1ZVZpYUN5Y2xlTm9uU2ltcGxpY2l0eU5PVF9JTlNUQU5USUFURURfQk9VTkR0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFMb29wTm9uU2ltcGxpY2l0eUdlbmVyaWMgdHlwZSAnI25hbWUnIGNhbid0IGJlIHVzZWQgd2l0aG91dCB0eXBlIGFyZ3VtZW50cyBpbiB0aGUgYm91bmRzIG9mIGl0cyBvd24gdHlwZSB2YXJpYWJsZXMuVHJ5IHByb3ZpZGluZyB0eXBlIGFyZ3VtZW50cyB0byAnI25hbWUnIGhlcmUuY29kZUJvdW5kSXNzdWVWaWFMb29wTm9uU2ltcGxpY2l0eUJvdW5kSXNzdWVWaWFMb29wTm9uU2ltcGxpY2l0eXRlbXBsYXRlQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzR2VuZXJpYyB0eXBlICcjbmFtZScgY2FuJ3QgYmUgdXNlZCB3aXRob3V0IHR5cGUgYXJndW1lbnRzIGluIGEgdHlwZSB2YXJpYWJsZSBib3VuZC5jb2RlQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzY29kZUJyZWFrT3V0c2lkZU9mTG9vcEEgYnJlYWsgc3RhdGVtZW50IGNhbid0IGJlIHVzZWQgb3V0c2lkZSBvZiBhIGxvb3Agb3Igc3dpdGNoIHN0YXRlbWVudC5UcnkgcmVtb3ZpbmcgdGhlIGJyZWFrIHN0YXRlbWVudC5CcmVha091dHNpZGVPZkxvb3BtZXNzYWdlQnJlYWtPdXRzaWRlT2ZMb29wdGVtcGxhdGVCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbkNhbid0IGJyZWFrIHRvICcjbmFtZScgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uY29kZUJyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb250ZW1wbGF0ZUJ1aWx0SW5JZGVudGlmaWVyQXNUeXBlVGhlIGJ1aWx0LWluIGlkZW50aWZpZXIgJyNsZXhlbWUnIGNhbid0IGJlIHVzZWQgYXMgYSB0eXBlLlRyeSBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIG1hdGNoIGFuIGV4aXN0aW5nIHR5cGUuY29kZUJ1aWx0SW5JZGVudGlmaWVyQXNUeXBlQnVpbHRJbklkZW50aWZpZXJBc1R5cGVCVUlMVF9JTl9JREVOVElGSUVSX0FTX1RZUEV0ZW1wbGF0ZUJ1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbkNhbid0IHVzZSAnI2xleGVtZScgYXMgYSBuYW1lIGhlcmUuY29kZUJ1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbkJ1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbkJVSUxUX0lOX0lERU5USUZJRVJfSU5fREVDTEFSQVRJT05jb2RlQnl0ZWNvZGVMaW1pdEV4Y2VlZGVkVG9vTWFueUFyZ3VtZW50c0RhcnQgYnl0ZWNvZGUgbGltaXQgZXhjZWVkZWQ6IHRvbyBtYW55IGFyZ3VtZW50cy5CeXRlY29kZUxpbWl0RXhjZWVkZWRUb29NYW55QXJndW1lbnRzbWVzc2FnZUJ5dGVjb2RlTGltaXRFeGNlZWRlZFRvb01hbnlBcmd1bWVudHNjb2RlQ2FuZGlkYXRlRm91bmRGb3VuZCB0aGlzIGNhbmRpZGF0ZSwgYnV0IHRoZSBhcmd1bWVudHMgZG9uJ3QgbWF0Y2guQ2FuZGlkYXRlRm91bmRtZXNzYWdlQ2FuZGlkYXRlRm91bmR0ZW1wbGF0ZUNhbmRpZGF0ZUZvdW5kSXNEZWZhdWx0Q29uc3RydWN0b3JUaGUgY2xhc3MgJyNuYW1lJyBoYXMgYSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy5jb2RlQ2FuZGlkYXRlRm91bmRJc0RlZmF1bHRDb25zdHJ1Y3RvckNhbmRpZGF0ZUZvdW5kSXNEZWZhdWx0Q29uc3RydWN0b3Jjb2RlQ2Fubm90QXNzaWduVG9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbkNhbid0IGFzc2lnbiB0byBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbi5DYW5ub3RBc3NpZ25Ub1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uQVNTSUdOTUVOVF9UT19QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05tZXNzYWdlQ2Fubm90QXNzaWduVG9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbmNvZGVDYW5ub3RBc3NpZ25Ub1N1cGVyQ2FuJ3QgYXNzaWduIHRvIHN1cGVyLkNhbm5vdEFzc2lnblRvU3VwZXJOT1RfQU5fTFZBTFVFbWVzc2FnZUNhbm5vdEFzc2lnblRvU3VwZXJjb2RlQ2Fubm90UmVhZFNka1NwZWNpZmljYXRpb25DYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbmNvZGVDYW50RGlzYW1iaWd1YXRlQW1iaWd1b3VzSW5mb3JtYXRpb25Cb3RoIEl0ZXJhYmxlIGFuZCBNYXAgc3ByZWFkIGVsZW1lbnRzIGVuY291bnRlcmVkIGluIGFtYmlndW91cyBsaXRlcmFsLkNhbnREaXNhbWJpZ3VhdGVBbWJpZ3VvdXNJbmZvcm1hdGlvbm1lc3NhZ2VDYW50RGlzYW1iaWd1YXRlQW1iaWd1b3VzSW5mb3JtYXRpb25jb2RlQ2FudERpc2FtYmlndWF0ZU5vdEVub3VnaEluZm9ybWF0aW9uTm90IGVub3VnaCB0eXBlIGluZm9ybWF0aW9uIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIGxpdGVyYWwgc2V0IGFuZCBsaXRlcmFsIG1hcC5UcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIGZvciB0aGUgbGl0ZXJhbCBleHBsaWNpdGx5IHRvIGRpc2FtYmlndWF0ZSBpdC5DYW50RGlzYW1iaWd1YXRlTm90RW5vdWdoSW5mb3JtYXRpb25tZXNzYWdlQ2FudERpc2FtYmlndWF0ZU5vdEVub3VnaEluZm9ybWF0aW9uY29kZUNhbnRJbmZlclBhY2thZ2VzRnJvbU1hbnlJbnB1dHNjb2RlQ2FudEluZmVyUGFja2FnZXNGcm9tUGFja2FnZVVyaXRlbXBsYXRlQ2FudEluZmVyUmV0dXJuVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzQ2FuJ3QgaW5mZXIgYSByZXR1cm4gdHlwZSBmb3IgJyNuYW1lJyBhcyBzb21lIG9mIHRoZSBpbmhlcml0ZWQgbWVtYmVycyBoYXZlIGRpZmZlcmVudCB0eXBlcy5UcnkgYWRkaW5nIGFuIGV4cGxpY2l0IHR5cGUuY29kZUNhbnRJbmZlclJldHVyblR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlc0NhbnRJbmZlclJldHVyblR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlc0lOVkFMSURfTUVUSE9EX09WRVJSSURFdGVtcGxhdGVDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eUNhbid0IGluZmVyIHRoZSB0eXBlIG9mICcjc3RyaW5nJzogY2lyY3VsYXJpdHkgZm91bmQgZHVyaW5nIHR5cGUgaW5mZXJlbmNlLlNwZWNpZnkgdGhlIHR5cGUgZXhwbGljaXRseS5jb2RlQ2FudEluZmVyVHlwZUR1ZVRvQ2lyY3VsYXJpdHlDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eVJFQ1VSU0lWRV9DT01QSUxFX1RJTUVfQ09OU1RBTlR0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlc0Nhbid0IGluZmVyIGEgdHlwZSBmb3IgJyNuYW1lJyBhcyBzb21lIG9mIHRoZSBpbmhlcml0ZWQgbWVtYmVycyBoYXZlIGRpZmZlcmVudCB0eXBlcy5jb2RlQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzY29kZUNhbnRSZWFkRmlsZUNhbnRSZWFkRmlsZVVSSV9ET0VTX05PVF9FWElTVHRlbXBsYXRlQ2FudFVzZUNvbnRyb2xGbG93T3JTcHJlYWRBc0NvbnN0YW50JyNsZXhlbWUnIGlzIG5vdCBzdXBwb3J0ZWQgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuY29kZUNhbnRVc2VDb250cm9sRmxvd09yU3ByZWFkQXNDb25zdGFudENhbnRVc2VDb250cm9sRmxvd09yU3ByZWFkQXNDb25zdGFudE5PVF9DT05TVEFOVF9FWFBSRVNTSU9OdGVtcGxhdGVDYW50VXNlRGVmZXJyZWRQcmVmaXhBc0NvbnN0YW50JyNsZXhlbWUnIGNhbid0IGJlIHVzZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIGJlY2F1c2UgaXQncyBtYXJrZWQgYXMgJ2RlZmVycmVkJyB3aGljaCBtZWFucyBpdCBpc24ndCBhdmFpbGFibGUgdW50aWwgbG9hZGVkLlRyeSBtb3ZpbmcgdGhlIGNvbnN0YW50IGZyb20gdGhlIGRlZmVycmVkIGxpYnJhcnksIG9yIHJlbW92aW5nICdkZWZlcnJlZCcgZnJvbSB0aGUgaW1wb3J0Lgpjb2RlQ2FudFVzZURlZmVycmVkUHJlZml4QXNDb25zdGFudENhbnRVc2VEZWZlcnJlZFByZWZpeEFzQ29uc3RhbnRDT05TVF9ERUZFUlJFRF9DTEFTU2NvZGVDYW50VXNlUHJlZml4QXNFeHByZXNzaW9uQSBwcmVmaXggY2FuJ3QgYmUgdXNlZCBhcyBhbiBleHByZXNzaW9uLkNhbnRVc2VQcmVmaXhBc0V4cHJlc3Npb25QUkVGSVhfSURFTlRJRklFUl9OT1RfRk9MTE9XRURfQllfRE9UbWVzc2FnZUNhbnRVc2VQcmVmaXhBc0V4cHJlc3Npb25jb2RlQ2FudFVzZVByZWZpeFdpdGhOdWxsQXdhcmVBIHByZWZpeCBjYW4ndCBiZSB1c2VkIHdpdGggbnVsbC1hd2FyZSBvcGVyYXRvcnMuSXQgc2hvdWxkIGJlIHNhZmUgdG8gcmVtb3ZlIHRoZSAnPycgYXMgYSBwcmVmaXggaXMgbmV2ZXIgbnVsbC5DYW50VXNlUHJlZml4V2l0aE51bGxBd2FyZW1lc3NhZ2VDYW50VXNlUHJlZml4V2l0aE51bGxBd2FyZWNvZGVDYXRjaFN5bnRheCdjYXRjaCcgbXVzdCBiZSBmb2xsb3dlZCBieSAnKGlkZW50aWZpZXIpJyBvciAnKGlkZW50aWZpZXIsIGlkZW50aWZpZXIpJy5ObyB0eXBlcyBhcmUgbmVlZGVkLCB0aGUgZmlyc3QgaXMgZ2l2ZW4gYnkgJ29uJywgdGhlIHNlY29uZCBpcyBhbHdheXMgJ1N0YWNrVHJhY2UnLkNhdGNoU3ludGF4bWVzc2FnZUNhdGNoU3ludGF4Y29kZUNhdGNoU3ludGF4RXh0cmFQYXJhbWV0ZXJzQ2F0Y2hTeW50YXhFeHRyYVBhcmFtZXRlcnNtZXNzYWdlQ2F0Y2hTeW50YXhFeHRyYVBhcmFtZXRlcnNjb2RlQ2xhc3NJbkNsYXNzQ2xhc3NlcyBjYW4ndCBiZSBkZWNsYXJlZCBpbnNpZGUgb3RoZXIgY2xhc3Nlcy5UcnkgbW92aW5nIHRoZSBjbGFzcyB0byB0aGUgdG9wLWxldmVsLkNsYXNzSW5DbGFzc21lc3NhZ2VDbGFzc0luQ2xhc3Njb2RlQ29sb25JblBsYWNlT2ZJbkZvci1pbiBsb29wcyB1c2UgJ2luJyByYXRoZXIgdGhhbiBhIGNvbG9uLlRyeSByZXBsYWNpbmcgdGhlIGNvbG9uIHdpdGggdGhlIGtleXdvcmQgJ2luJy5Db2xvbkluUGxhY2VPZklubWVzc2FnZUNvbG9uSW5QbGFjZU9mSW50ZW1wbGF0ZUNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlRmFpbGVkQ2xhc3MgJyNuYW1lJyBpbmhlcml0cyBtdWx0aXBsZSBtZW1iZXJzIG5hbWVkICcjbmFtZTInIHdpdGggaW5jb21wYXRpYmxlIHNpZ25hdHVyZXMuVHJ5IGFkZGluZyBhIGRlY2xhcmF0aW9uIG9mICcjbmFtZTInIHRvICcjbmFtZScuY29kZUNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlRmFpbGVkQ29tYmluZWRNZW1iZXJTaWduYXR1cmVGYWlsZWRJTkNPTlNJU1RFTlRfSU5IRVJJVEFOQ0V0ZW1wbGF0ZUNvbmZsaWN0aW5nTW9kaWZpZXJzTWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICcjc3RyaW5nJyBhbmQgJyNzdHJpbmcyJy5UcnkgcmVtb3Zpbmcgb25lIG9mIHRoZSBrZXl3b3Jkcy5jb2RlQ29uZmxpY3RpbmdNb2RpZmllcnNDb25mbGljdGluZ01vZGlmaWVyc3RlbXBsYXRlQ29uZmxpY3RzV2l0aENvbnN0cnVjdG9yQ29uZmxpY3RzIHdpdGggY29uc3RydWN0b3IgJyNuYW1lJy5jb2RlQ29uZmxpY3RzV2l0aENvbnN0cnVjdG9yQ29uZmxpY3RzV2l0aENvbnN0cnVjdG9yQ09ORkxJQ1RTX1dJVEhfQ09OU1RSVUNUT1J0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhGYWN0b3J5Q29uZmxpY3RzIHdpdGggZmFjdG9yeSAnI25hbWUnLmNvZGVDb25mbGljdHNXaXRoRmFjdG9yeUNvbmZsaWN0c1dpdGhGYWN0b3J5dGVtcGxhdGVDb25mbGljdHNXaXRoTWVtYmVyQ29uZmxpY3RzIHdpdGggbWVtYmVyICcjbmFtZScuY29kZUNvbmZsaWN0c1dpdGhNZW1iZXJDb25mbGljdHNXaXRoTWVtYmVyQ09ORkxJQ1RTX1dJVEhfTUVNQkVSdGVtcGxhdGVDb25mbGljdHNXaXRoTWVtYmVyV2FybmluZ2NvZGVDb25mbGljdHNXaXRoTWVtYmVyV2FybmluZ0NvbmZsaWN0c1dpdGhNZW1iZXJXYXJuaW5ndGVtcGxhdGVDb25mbGljdHNXaXRoU2V0dGVyQ29uZmxpY3RzIHdpdGggc2V0dGVyICcjbmFtZScuY29kZUNvbmZsaWN0c1dpdGhTZXR0ZXJDb25mbGljdHNXaXRoU2V0dGVydGVtcGxhdGVDb25mbGljdHNXaXRoU2V0dGVyV2FybmluZ2NvZGVDb25mbGljdHNXaXRoU2V0dGVyV2FybmluZ0NvbmZsaWN0c1dpdGhTZXR0ZXJXYXJuaW5ndGVtcGxhdGVDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ29uZmxpY3RzIHdpdGggdHlwZSB2YXJpYWJsZSAnI25hbWUnLmNvZGVDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZUNPTkZMSUNUSU5HX1RZUEVfVkFSSUFCTEVfQU5EX01FTUJFUmNvZGVDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ2F1c2VUaGlzIGlzIHRoZSB0eXBlIHZhcmlhYmxlLkNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGVDYXVzZW1lc3NhZ2VDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ2F1c2Vjb2RlQ29uc3RBbmRGaW5hbE1lbWJlcnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgYm90aCAnY29uc3QnIGFuZCAnZmluYWwnLlRyeSByZW1vdmluZyBlaXRoZXIgdGhlICdjb25zdCcgb3IgJ2ZpbmFsJyBrZXl3b3JkLkNvbnN0QW5kRmluYWxtZXNzYWdlQ29uc3RBbmRGaW5hbGNvZGVDb25zdENsYXNzQ2xhc3NlcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnY29uc3QnLlRyeSByZW1vdmluZyB0aGUgJ2NvbnN0JyBrZXl3b3JkLiBJZiB5b3UncmUgdHJ5aW5nIHRvIGluZGljYXRlIHRoYXQgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBjYW4gYmUgY29uc3RhbnRzLCBwbGFjZSB0aGUgJ2NvbnN0JyBrZXl3b3JkIG9uICB0aGUgY2xhc3MnIGNvbnN0cnVjdG9yKHMpLkNvbnN0Q2xhc3NtZXNzYWdlQ29uc3RDbGFzc2NvZGVDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENvbnN0cnVjdG9yIGlzIG1hcmtlZCAnY29uc3QnIHNvIGFsbCBmaWVsZHMgbXVzdCBiZSBmaW5hbC5Db25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENPTlNUX0NPTlNUUlVDVE9SX1dJVEhfTk9OX0ZJTkFMX0ZJRUxEbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkY29kZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkQ2F1c2VGaWVsZCBpc24ndCBmaW5hbCwgYnV0IGNvbnN0cnVjdG9yIGlzICdjb25zdCcuQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGRDYXVzZW1lc3NhZ2VDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENhdXNlY29kZUNvbnN0Q29uc3RydWN0b3JSZWRpcmVjdGlvblRvTm9uQ29uc3RBIGNvbnN0YW50IGNvbnN0cnVjdG9yIGNhbid0IGNhbGwgYSBub24tY29uc3RhbnQgY29uc3RydWN0b3IuQ29uc3RDb25zdHJ1Y3RvclJlZGlyZWN0aW9uVG9Ob25Db25zdG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yUmVkaXJlY3Rpb25Ub05vbkNvbnN0Y29kZUNvbnN0Q29uc3RydWN0b3JXaXRoQm9keUEgY29uc3QgY29uc3RydWN0b3IgY2FuJ3QgaGF2ZSBhIGJvZHkuVHJ5IHJlbW92aW5nIGVpdGhlciB0aGUgJ2NvbnN0JyBrZXl3b3JkIG9yIHRoZSBib2R5LkNvbnN0Q29uc3RydWN0b3JXaXRoQm9keUNPTlNUX0NPTlNUUlVDVE9SX1dJVEhfQk9EWW1lc3NhZ2VDb25zdENvbnN0cnVjdG9yV2l0aEJvZHljb2RlQ29uc3RDb25zdHJ1Y3RvcldpdGhOb25Db25zdFN1cGVyQ29uc3RhbnQgY29uc3RydWN0b3IgY2FuJ3QgY2FsbCBub24tY29uc3RhbnQgc3VwZXIgY29uc3RydWN0b3JzLkNvbnN0Q29uc3RydWN0b3JXaXRoTm9uQ29uc3RTdXBlckNPTlNUX0NPTlNUUlVDVE9SX1dJVEhfTk9OX0NPTlNUX1NVUEVSbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JXaXRoTm9uQ29uc3RTdXBlcmNvZGVDb25zdEV2YWxDaXJjdWxhcml0eUNvbnN0YW50IGV4cHJlc3Npb24gZGVwZW5kcyBvbiBpdHNlbGYuQ29uc3RFdmFsQ2lyY3VsYXJpdHltZXNzYWdlQ29uc3RFdmFsQ2lyY3VsYXJpdHljb2RlQ29uc3RFdmFsQ29udGV4dFdoaWxlIGFuYWx5emluZzpDb25zdEV2YWxDb250ZXh0bWVzc2FnZUNvbnN0RXZhbENvbnRleHR0ZW1wbGF0ZUNvbnN0RXZhbERlZmVycmVkTGlicmFyeScjbmFtZScgY2FuJ3QgYmUgdXNlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24gYmVjYXVzZSBpdCdzIG1hcmtlZCBhcyAnZGVmZXJyZWQnIHdoaWNoIG1lYW5zIGl0IGlzbid0IGF2YWlsYWJsZSB1bnRpbCBsb2FkZWQuY29kZUNvbnN0RXZhbERlZmVycmVkTGlicmFyeUNvbnN0RXZhbERlZmVycmVkTGlicmFyeU5PTl9DT05TVEFOVF9ERUZBVUxUX1ZBTFVFX0ZST01fREVGRVJSRURfTElCUkFSWXRlbXBsYXRlQ29uc3RFdmFsRHVwbGljYXRlRWxlbWVudFRoZSBlbGVtZW50ICcjY29uc3RhbnQnIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgZXhpc3RpbmcgZWxlbWVudCBpbiB0aGUgc2V0LmNvZGVDb25zdEV2YWxEdXBsaWNhdGVFbGVtZW50Q29uc3RFdmFsRHVwbGljYXRlRWxlbWVudEVRVUFMX0VMRU1FTlRTX0lOX0NPTlNUX1NFVHRlbXBsYXRlQ29uc3RFdmFsRHVwbGljYXRlS2V5VGhlIGtleSAnI2NvbnN0YW50JyBjb25mbGljdHMgd2l0aCBhbm90aGVyIGV4aXN0aW5nIGtleSBpbiB0aGUgbWFwLmNvZGVDb25zdEV2YWxEdXBsaWNhdGVLZXlDb25zdEV2YWxEdXBsaWNhdGVLZXlFUVVBTF9LRVlTX0lOX0NPTlNUX01BUHRlbXBsYXRlQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbFRoZSBlbGVtZW50ICcjY29uc3RhbnQnIGRvZXMgbm90IGhhdmUgYSBwcmltaXRpdmUgb3BlcmF0b3IgJz09Jy5jb2RlQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbENvbnN0RXZhbEVsZW1lbnRJbXBsZW1lbnRzRXF1YWxDT05TVF9TRVRfRUxFTUVOVF9UWVBFX0lNUExFTUVOVFNfRVFVQUxTY29kZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvblRoaXMgYXNzZXJ0aW9uIGZhaWxlZC5Db25zdEV2YWxGYWlsZWRBc3NlcnRpb25DT05TVF9FVkFMX1RIUk9XU19FWENFUFRJT05tZXNzYWdlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9udGVtcGxhdGVDb25zdEV2YWxGYWlsZWRBc3NlcnRpb25XaXRoTWVzc2FnZVRoaXMgYXNzZXJ0aW9uIGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICNzdHJpbmdjb2RlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uV2l0aE1lc3NhZ2VDb25zdEV2YWxGYWlsZWRBc3NlcnRpb25XaXRoTWVzc2FnZXRlbXBsYXRlQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXJUaGUgdHlwZSAnI3R5cGUnIGlzIG5vdCBhIGNvbnN0YW50IGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIHR5cGUgcGFyYW1ldGVyLCBvbmx5IGluc3RhbnRpYXRlZCB0eXBlcyBhcmUgYWxsb3dlZC5jb2RlQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXJDb25zdEV2YWxGcmVlVHlwZVBhcmFtZXRlcnRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlQmluYXJ5IG9wZXJhdG9yICcjc3RyaW5nJyBvbiAnI2NvbnN0YW50JyByZXF1aXJlcyBvcGVyYW5kIG9mIHR5cGUgJyN0eXBlJywgYnV0IHdhcyBvZiB0eXBlICcjdHlwZTInLmNvZGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGV0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZUJpbmFyeSBvcGVyYXRvciAnPT0nIHJlcXVpcmVzIHJlY2VpdmVyIGNvbnN0YW50ICcjY29uc3RhbnQnIG9mIHR5cGUgJ051bGwnLCAnYm9vbCcsICdpbnQnLCAnZG91YmxlJywgb3IgJ1N0cmluZycsIGJ1dCB3YXMgb2YgdHlwZSAnI3R5cGUnLmNvZGVDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGVDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGV0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uVGhlIG1ldGhvZCAnI3N0cmluZycgY2FuJ3QgYmUgaW52b2tlZCBvbiAnI2NvbnN0YW50JyB3aXRoaW4gYSBjb25zdCBjb250ZXh0LmNvZGVDb25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvbkNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uVU5ERUZJTkVEX09QRVJBVE9SdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkUHJvcGVydHlHZXRUaGUgcHJvcGVydHkgJyNzdHJpbmcnIGNhbid0IGJlIGFjY2Vzc2VkIG9uICcjY29uc3RhbnQnIHdpdGhpbiBhIGNvbnN0IGNvbnRleHQuY29kZUNvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldENvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb25UaGUgaW52b2NhdGlvbiBvZiAnI25hbWUnIGlzIG5vdCBhbGxvd2VkIHdpdGhpbiBhIGNvbnN0IGNvbnRleHQuY29kZUNvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb25DT05TVF9JTklUSUFMSVpFRF9XSVRIX05PTl9DT05TVEFOVF9WQUxVRXRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0cmluZ0ludGVycG9sYXRpb25PcGVyYW5kVGhlICcjY29uc3RhbnQnIGNhbid0IGJlIHVzZWQgYXMgcGFydCBvZiBhIHN0cmluZyBpbnRlcnBvbGF0aW9uIHdpdGhpbiBhIGNvbnN0IGNvbnRleHQsIG9ubHkgdmFsdWVzIG9mIHR5cGUgJ251bGwnLCAnYm9vbCcsICdpbnQnLCAnZG91YmxlJywgb3IgJ1N0cmluZycgY2FuIGJlIHVzZWQuY29kZUNvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZENvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZENPTlNUX0VWQUxfVFlQRV9CT09MX05VTV9TVFJJTkd0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTeW1ib2xOYW1lVGhlIHN5bWJvbCBuYW1lIG11c3QgYmUgYSB2YWxpZCBwdWJsaWMgRGFydCBtZW1iZXIgbmFtZSwgcHVibGljIGNvbnN0cnVjdG9yIG5hbWUsIG9yIGxpYnJhcnkgbmFtZSwgb3B0aW9uYWxseSBxdWFsaWZpZWQsIGJ1dCB3YXMgJyNjb25zdGFudCcuY29kZUNvbnN0RXZhbEludmFsaWRTeW1ib2xOYW1lQ29uc3RFdmFsSW52YWxpZFN5bWJvbE5hbWV0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRUeXBlRXhwZWN0ZWQgY29uc3RhbnQgJyNjb25zdGFudCcgdG8gYmUgb2YgdHlwZSAnI3R5cGUnLCBidXQgd2FzIG9mIHR5cGUgJyN0eXBlMicuY29kZUNvbnN0RXZhbEludmFsaWRUeXBlQ29uc3RFdmFsSW52YWxpZFR5cGV0ZW1wbGF0ZUNvbnN0RXZhbEtleUltcGxlbWVudHNFcXVhbFRoZSBrZXkgJyNjb25zdGFudCcgZG9lcyBub3QgaGF2ZSBhIHByaW1pdGl2ZSBvcGVyYXRvciAnPT0nLmNvZGVDb25zdEV2YWxLZXlJbXBsZW1lbnRzRXF1YWxDb25zdEV2YWxLZXlJbXBsZW1lbnRzRXF1YWxDT05TVF9NQVBfS0VZX0VYUFJFU1NJT05fVFlQRV9JTVBMRU1FTlRTX0VRVUFMU3RlbXBsYXRlQ29uc3RFdmFsTmVnYXRpdmVTaGlmdEJpbmFyeSBvcGVyYXRvciAnI3N0cmluZycgb24gJyNzdHJpbmcyJyByZXF1aXJlcyBub24tbmVnYXRpdmUgb3BlcmFuZCwgYnV0IHdhcyAnI3N0cmluZzMnLmNvZGVDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0Q29uc3RFdmFsTmVnYXRpdmVTaGlmdHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsQ2FuJ3QgaGF2ZSBhIG5vbi1jb25zdGFudCAjc3RyaW5nIGxpdGVyYWwgd2l0aGluIGEgY29uc3QgY29udGV4dC5jb2RlQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsTk9OX0NPTlNUQU5UX0RFRkFVTFRfVkFMVUV0ZW1wbGF0ZUNvbnN0RXZhbE5vbkNvbnN0YW50VmFyaWFibGVHZXRUaGUgdmFyaWFibGUgJyNzdHJpbmcnIGlzIG5vdCBhIGNvbnN0YW50LCBvbmx5IGNvbnN0YW50IGV4cHJlc3Npb25zIGFyZSBhbGxvd2VkLmNvZGVDb25zdEV2YWxOb25Db25zdGFudFZhcmlhYmxlR2V0Q29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldE5PTl9DT05TVEFOVF9WQUxVRV9JTl9JTklUSUFMSVpFUmNvZGVDb25zdEV2YWxOb3RMaXN0T3JTZXRJblNwcmVhZE9ubHkgbGlzdHMgYW5kIHNldHMgY2FuIGJlIHVzZWQgaW4gc3ByZWFkcyBpbiBjb25zdGFudCBsaXN0cyBhbmQgc2V0cy5Db25zdEV2YWxOb3RMaXN0T3JTZXRJblNwcmVhZENPTlNUX1NQUkVBRF9FWFBFQ1RFRF9MSVNUX09SX1NFVG1lc3NhZ2VDb25zdEV2YWxOb3RMaXN0T3JTZXRJblNwcmVhZGNvZGVDb25zdEV2YWxOb3RNYXBJblNwcmVhZE9ubHkgbWFwcyBjYW4gYmUgdXNlZCBpbiBzcHJlYWRzIGluIGNvbnN0YW50IG1hcHMuQ29uc3RFdmFsTm90TWFwSW5TcHJlYWRDT05TVF9TUFJFQURfRVhQRUNURURfTUFQbWVzc2FnZUNvbnN0RXZhbE5vdE1hcEluU3ByZWFkY29kZUNvbnN0RXZhbE51bGxWYWx1ZU51bGwgdmFsdWUgZHVyaW5nIGNvbnN0YW50IGV2YWx1YXRpb24uQ29uc3RFdmFsTnVsbFZhbHVlbWVzc2FnZUNvbnN0RXZhbE51bGxWYWx1ZWNvZGVDb25zdEV2YWxVbmV2YWx1YXRlZENvdWxkIG5vdCBldmFsdWF0ZSBjb25zdGFudCBleHByZXNzaW9uLkNvbnN0RXZhbFVuZXZhbHVhdGVkbWVzc2FnZUNvbnN0RXZhbFVuZXZhbHVhdGVkdGVtcGxhdGVDb25zdEV2YWxaZXJvRGl2aXNvckJpbmFyeSBvcGVyYXRvciAnI3N0cmluZycgb24gJyNzdHJpbmcyJyByZXF1aXJlcyBub24temVybyBkaXZpc29yLCBidXQgZGl2aXNvciB3YXMgJzAnLmNvZGVDb25zdEV2YWxaZXJvRGl2aXNvckNvbnN0RXZhbFplcm9EaXZpc29yQ09OU1RfRVZBTF9USFJPV1NfSURCWkVjb2RlQ29uc3RGYWN0b3J5T25seSByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9ycyBjYW4gYmUgZGVjbGFyZWQgdG8gYmUgJ2NvbnN0Jy5UcnkgcmVtb3ZpbmcgdGhlICdjb25zdCcga2V5d29yZCwgb3IgcmVwbGFjaW5nIHRoZSBib2R5IHdpdGggJz0nIGZvbGxvd2VkIGJ5IGEgdmFsaWQgdGFyZ2V0LkNvbnN0RmFjdG9yeW1lc3NhZ2VDb25zdEZhY3Rvcnljb2RlQ29uc3RGYWN0b3J5UmVkaXJlY3Rpb25Ub05vbkNvbnN0Q29uc3RhbnQgZmFjdG9yeSBjb25zdHJ1Y3RvciBjYW4ndCBkZWxlZ2F0ZSB0byBhIG5vbi1jb25zdGFudCBjb25zdHJ1Y3Rvci5UcnkgcmVkaXJlY3RpbmcgdG8gYSBkaWZmZXJlbnQgY29uc3RydWN0b3Igb3IgbWFya2luZyB0aGUgdGFyZ2V0IGNvbnN0cnVjdG9yICdjb25zdCcuQ29uc3RGYWN0b3J5UmVkaXJlY3Rpb25Ub05vbkNvbnN0UkVESVJFQ1RfVE9fTk9OX0NPTlNUX0NPTlNUUlVDVE9SbWVzc2FnZUNvbnN0RmFjdG9yeVJlZGlyZWN0aW9uVG9Ob25Db25zdHRlbXBsYXRlQ29uc3RGaWVsZFdpdGhvdXRJbml0aWFsaXplclRoZSBjb25zdCB2YXJpYWJsZSAnI25hbWUnIG11c3QgYmUgaW5pdGlhbGl6ZWQuVHJ5IGFkZGluZyBhbiBpbml0aWFsaXplciAoJz0gPGV4cHJlc3Npb24+JykgdG8gdGhlIGRlY2xhcmF0aW9uLmNvZGVDb25zdEZpZWxkV2l0aG91dEluaXRpYWxpemVyQ29uc3RGaWVsZFdpdGhvdXRJbml0aWFsaXplckNPTlNUX05PVF9JTklUSUFMSVpFRGNvZGVDb25zdEluc3RhbmNlRmllbGRPbmx5IHN0YXRpYyBmaWVsZHMgY2FuIGJlIGRlY2xhcmVkIGFzIGNvbnN0LlRyeSB1c2luZyAnZmluYWwnIGluc3RlYWQgb2YgJ2NvbnN0Jywgb3IgYWRkaW5nIHRoZSBrZXl3b3JkICdzdGF0aWMnLkNvbnN0SW5zdGFuY2VGaWVsZENPTlNUX0lOU1RBTkNFX0ZJRUxEbWVzc2FnZUNvbnN0SW5zdGFuY2VGaWVsZGNvZGVDb25zdE1ldGhvZEdldHRlcnMsIHNldHRlcnMgYW5kIG1ldGhvZHMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2NvbnN0Jy5UcnkgcmVtb3ZpbmcgdGhlICdjb25zdCcga2V5d29yZC5Db25zdE1ldGhvZG1lc3NhZ2VDb25zdE1ldGhvZGNvZGVDb25zdHJ1Y3RvckN5Y2xpY1JlZGlyZWN0aW5nIGNvbnN0cnVjdGVycyBjYW4ndCBiZSBjeWNsaWMuVHJ5IHRvIGhhdmUgYWxsIGNvbnN0cnVjdG9ycyBldmVudHVhbGx5IHJlZGlyZWN0IHRvIGEgbm9uLXJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yLkNvbnN0cnVjdG9yQ3ljbGljUkVDVVJTSVZFX0NPTlNUUlVDVE9SX1JFRElSRUNUbWVzc2FnZUNvbnN0cnVjdG9yQ3ljbGljdGVtcGxhdGVDb25zdHJ1Y3Rvck5vdEZvdW5kQ291bGRuJ3QgZmluZCBjb25zdHJ1Y3RvciAnI25hbWUnLmNvZGVDb25zdHJ1Y3Rvck5vdEZvdW5kQ29uc3RydWN0b3JOb3RGb3VuZENPTlNUUlVDVE9SX05PVF9GT1VORGNvZGVDb25zdHJ1Y3Rvck5vdFN5bmNDb25zdHJ1Y3RvciBib2RpZXMgY2FuJ3QgdXNlICdhc3luYycsICdhc3luYyonLCBvciAnc3luYyonLkNvbnN0cnVjdG9yTm90U3luY05PTl9TWU5DX0NPTlNUUlVDVE9SbWVzc2FnZUNvbnN0cnVjdG9yTm90U3luY2NvZGVDb25zdHJ1Y3RvcldpdGhSZXR1cm5UeXBlQ29uc3RydWN0b3JzIGNhbid0IGhhdmUgYSByZXR1cm4gdHlwZS5UcnkgcmVtb3ZpbmcgdGhlIHJldHVybiB0eXBlLkNvbnN0cnVjdG9yV2l0aFJldHVyblR5cGVtZXNzYWdlQ29uc3RydWN0b3JXaXRoUmV0dXJuVHlwZWNvZGVDb25zdHJ1Y3RvcldpdGhUeXBlQXJndW1lbnRzQSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIGNhbid0IGhhdmUgdHlwZSBhcmd1bWVudHMgb24gdGhlIGNvbnN0cnVjdG9yIG5hbWUuVHJ5IHRvIHBsYWNlIHRoZSB0eXBlIGFyZ3VtZW50cyBvbiB0aGUgY2xhc3MgbmFtZS5Db25zdHJ1Y3RvcldpdGhUeXBlQXJndW1lbnRzV1JPTkdfTlVNQkVSX09GX1RZUEVfQVJHVU1FTlRTX0NPTlNUUlVDVE9SbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFR5cGVBcmd1bWVudHNjb2RlQ29uc3RydWN0b3JXaXRoVHlwZVBhcmFtZXRlcnNDb25zdHJ1Y3RvcnMgY2FuJ3QgaGF2ZSB0eXBlIHBhcmFtZXRlcnMuQ29uc3RydWN0b3JXaXRoVHlwZVBhcmFtZXRlcnNUWVBFX1BBUkFNRVRFUl9PTl9DT05TVFJVQ1RPUm1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhUeXBlUGFyYW1ldGVyc2NvZGVDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVUaGUgbmFtZSBvZiBhIGNvbnN0cnVjdG9yIG11c3QgbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcy5Db25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVJTlZBTElEX0NPTlNUUlVDVE9SX05BTUVtZXNzYWdlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1ldGVtcGxhdGVDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVDb250ZXh0VGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcyBpcyAnI25hbWUnLmNvZGVDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVDb250ZXh0Q29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dGNvZGVDb250aW51ZUxhYmVsTm90VGFyZ2V0VGFyZ2V0IG9mIGNvbnRpbnVlIG11c3QgYmUgYSBsYWJlbC5Db250aW51ZUxhYmVsTm90VGFyZ2V0TEFCRUxfVU5ERUZJTkVEbWVzc2FnZUNvbnRpbnVlTGFiZWxOb3RUYXJnZXRjb2RlQ29udGludWVPdXRzaWRlT2ZMb29wQSBjb250aW51ZSBzdGF0ZW1lbnQgY2FuJ3QgYmUgdXNlZCBvdXRzaWRlIG9mIGEgbG9vcCBvciBzd2l0Y2ggc3RhdGVtZW50LlRyeSByZW1vdmluZyB0aGUgY29udGludWUgc3RhdGVtZW50LkNvbnRpbnVlT3V0c2lkZU9mTG9vcG1lc3NhZ2VDb250aW51ZU91dHNpZGVPZkxvb3B0ZW1wbGF0ZUNvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uQ2FuJ3QgY29udGludWUgYXQgJyNuYW1lJyBpbiBhIGRpZmZlcmVudCBmdW5jdGlvbi5jb2RlQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb25Db250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbmNvZGVDb250aW51ZVdpdGhvdXRMYWJlbEluQ2FzZUEgY29udGludWUgc3RhdGVtZW50IGluIGEgc3dpdGNoIHN0YXRlbWVudCBtdXN0IGhhdmUgYSBsYWJlbCBhcyBhIHRhcmdldC5UcnkgYWRkaW5nIGEgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIG9uZSBvZiB0aGUgY2FzZSBjbGF1c2VzIHRvIHRoZSBjb250aW51ZSBzdGF0ZW1lbnQuQ29udGludWVXaXRob3V0TGFiZWxJbkNhc2VtZXNzYWdlQ29udGludWVXaXRob3V0TGFiZWxJbkNhc2V0ZW1wbGF0ZUNvdWxkTm90UGFyc2VVcmlDb3VsZG4ndCBwYXJzZSBVUkkgJyNzdHJpbmcnOgogICNzdHJpbmcyLmNvZGVDb3VsZE5vdFBhcnNlVXJpQ291bGROb3RQYXJzZVVyaWNvZGVDb3ZhcmlhbnRBbmRTdGF0aWNNZW1iZXJzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlIGJvdGggJ2NvdmFyaWFudCcgYW5kICdzdGF0aWMnLlRyeSByZW1vdmluZyBlaXRoZXIgdGhlICdjb3ZhcmlhbnQnIG9yICdzdGF0aWMnIGtleXdvcmQuQ292YXJpYW50QW5kU3RhdGljbWVzc2FnZUNvdmFyaWFudEFuZFN0YXRpY2NvZGVDb3ZhcmlhbnRNZW1iZXJHZXR0ZXJzLCBzZXR0ZXJzIGFuZCBtZXRob2RzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdjb3ZhcmlhbnQnLlRyeSByZW1vdmluZyB0aGUgJ2NvdmFyaWFudCcga2V5d29yZC5Db3ZhcmlhbnRNZW1iZXJtZXNzYWdlQ292YXJpYW50TWVtYmVydGVtcGxhdGVDeWNsZUluVHlwZVZhcmlhYmxlc1R5cGUgJyNuYW1lJyBpcyBhIGJvdW5kIG9mIGl0c2VsZiB2aWEgJyNzdHJpbmcnLlRyeSBicmVha2luZyB0aGUgY3ljbGUgYnkgcmVtb3ZpbmcgYXQgbGVhc3Qgb24gb2YgdGhlICdleHRlbmRzJyBjbGF1c2VzIGluIHRoZSBjeWNsZS5jb2RlQ3ljbGVJblR5cGVWYXJpYWJsZXNDeWNsZUluVHlwZVZhcmlhYmxlc1RZUEVfUEFSQU1FVEVSX1NVUEVSVFlQRV9PRl9JVFNfQk9VTkR0ZW1wbGF0ZUN5Y2xpY0NsYXNzSGllcmFyY2h5JyNuYW1lJyBpcyBhIHN1cGVydHlwZSBvZiBpdHNlbGYuY29kZUN5Y2xpY0NsYXNzSGllcmFyY2h5Q3ljbGljQ2xhc3NIaWVyYXJjaHlSRUNVUlNJVkVfSU5URVJGQUNFX0lOSEVSSVRBTkNFdGVtcGxhdGVDeWNsaWNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnNDeWNsaWMgZGVmaW5pdGlvbiBvZiBmYWN0b3J5ICcjbmFtZScuY29kZUN5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc0N5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc1JFQ1VSU0lWRV9GQUNUT1JZX1JFRElSRUNUdGVtcGxhdGVDeWNsaWNUeXBlZGVmVGhlIHR5cGVkZWYgJyNuYW1lJyBoYXMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLmNvZGVDeWNsaWNUeXBlZGVmQ3ljbGljVHlwZWRlZlRZUEVfQUxJQVNfQ0FOTk9UX1JFRkVSRU5DRV9JVFNFTEZjb2RlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2FuJ3QgZGVjbGFyZSBhIG1lbWJlciB0aGF0IGNvbmZsaWN0cyB3aXRoIGFuIGluaGVyaXRlZCBvbmUuRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyREVDTEFSRURfTUVNQkVSX0NPTkZMSUNUU19XSVRIX0lOSEVSSVRFRG1lc3NhZ2VEZWNsYXJlZE1lbWJlckNvbmZsaWN0c1dpdGhJbmhlcml0ZWRNZW1iZXJjb2RlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2F1c2VUaGlzIGlzIHRoZSBpbmhlcml0ZWQgbWVtYmVyLkRlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlckNhdXNlbWVzc2FnZURlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlckNhdXNldGVtcGxhdGVEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yQ2FuJ3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgaGVyZSBiZWNhdXNlIGFueSBkZWZhdWx0IHZhbHVlcyBvZiAnI25hbWUnIHdvdWxkIGJlIHVzZWQgaW5zdGVhZC5UcnkgcmVtb3ZpbmcgdGhlIGRlZmF1bHQgdmFsdWUuY29kZURlZmF1bHRWYWx1ZUluUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yREVGQVVMVF9WQUxVRV9JTl9SRURJUkVDVElOR19GQUNUT1JZX0NPTlNUUlVDVE9SY29kZURlZmVycmVkQWZ0ZXJQcmVmaXhUaGUgZGVmZXJyZWQga2V5d29yZCBzaG91bGQgY29tZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHByZWZpeCAoJ2FzJyBjbGF1c2UpLlRyeSBtb3ZpbmcgdGhlIGRlZmVycmVkIGtleXdvcmQgYmVmb3JlIHRoZSBwcmVmaXguRGVmZXJyZWRBZnRlclByZWZpeG1lc3NhZ2VEZWZlcnJlZEFmdGVyUHJlZml4dGVtcGxhdGVEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYW4ndCB1c2UgdGhlIG5hbWUgJyNuYW1lJyBmb3IgYSBkZWZlcnJlZCBsaWJyYXJ5LCBhcyB0aGUgbmFtZSBpcyB1c2VkIGVsc2V3aGVyZS5jb2RlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkU0hBUkVEX0RFRkVSUkVEX1BSRUZJWHRlbXBsYXRlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2UnI25hbWUnIGlzIHVzZWQgaGVyZS5jb2RlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2VEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYXVzZXRlbXBsYXRlRGVmZXJyZWRUeXBlQW5ub3RhdGlvblRoZSB0eXBlICcjdHlwZScgaXMgZGVmZXJyZWQgbG9hZGVkIHZpYSBwcmVmaXggJyNuYW1lJyBhbmQgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgYW5ub3RhdGlvbi5UcnkgcmVtb3ZpbmcgJ2RlZmVycmVkJyBmcm9tIHRoZSBpbXBvcnQgb2YgJyNuYW1lJyBvciB1c2UgYSBzdXBlcnR5cGUgb2YgJyN0eXBlJyB0aGF0IGlzbid0IGRlZmVycmVkLmNvZGVEZWZlcnJlZFR5cGVBbm5vdGF0aW9uRGVmZXJyZWRUeXBlQW5ub3RhdGlvblRZUEVfQU5OT1RBVElPTl9ERUZFUlJFRF9DTEFTU3RlbXBsYXRlRGlsbE91dGxpbmVTdW1tYXJ5SW5kZXhlZCAjY291bnQgbGlicmFyaWVzICgjY291bnQyIGJ5dGVzKSBpbiAjbnVtMSUuM21zLCB0aGF0IGlzLAojbnVtMiUxMi4zIGJ5dGVzL21zLCBhbmQKI251bTMlMTIuMyBtcy9saWJyYXJpZXMuY29kZURpbGxPdXRsaW5lU3VtbWFyeURpbGxPdXRsaW5lU3VtbWFyeXRlbXBsYXRlRGlyZWN0Q3ljbGVJblR5cGVWYXJpYWJsZXNUeXBlICcjbmFtZScgY2FuJ3QgdXNlIGl0c2VsZiBhcyBhIGJvdW5kLmNvZGVEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlc0RpcmVjdEN5Y2xlSW5UeXBlVmFyaWFibGVzY29kZURpcmVjdGl2ZUFmdGVyRGVjbGFyYXRpb25EaXJlY3RpdmVzIG11c3QgYXBwZWFyIGJlZm9yZSBhbnkgZGVjbGFyYXRpb25zLlRyeSBtb3ZpbmcgdGhlIGRpcmVjdGl2ZSBiZWZvcmUgYW55IGRlY2xhcmF0aW9ucy5EaXJlY3RpdmVBZnRlckRlY2xhcmF0aW9ubWVzc2FnZURpcmVjdGl2ZUFmdGVyRGVjbGFyYXRpb25jb2RlRHVwbGljYXRlRGVmZXJyZWRBbiBpbXBvcnQgZGlyZWN0aXZlIGNhbiBvbmx5IGhhdmUgb25lICdkZWZlcnJlZCcga2V5d29yZC5UcnkgcmVtb3ZpbmcgYWxsIGJ1dCBvbmUgJ2RlZmVycmVkJyBrZXl3b3JkLkR1cGxpY2F0ZURlZmVycmVkbWVzc2FnZUR1cGxpY2F0ZURlZmVycmVkdGVtcGxhdGVEdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50VGhlIGxhYmVsICcjbmFtZScgd2FzIGFscmVhZHkgdXNlZCBpbiB0aGlzIHN3aXRjaCBzdGF0ZW1lbnQuVHJ5IGNob29zaW5nIGEgZGlmZmVyZW50IG5hbWUgZm9yIHRoaXMgbGFiZWwuY29kZUR1cGxpY2F0ZUxhYmVsSW5Td2l0Y2hTdGF0ZW1lbnREdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50Y29kZUR1cGxpY2F0ZVByZWZpeEFuIGltcG9ydCBkaXJlY3RpdmUgY2FuIG9ubHkgaGF2ZSBvbmUgcHJlZml4ICgnYXMnIGNsYXVzZSkuVHJ5IHJlbW92aW5nIGFsbCBidXQgb25lIHByZWZpeC5EdXBsaWNhdGVQcmVmaXhtZXNzYWdlRHVwbGljYXRlUHJlZml4dGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24nI25hbWUnIGlzIGFscmVhZHkgZGVjbGFyZWQgaW4gdGhpcyBzY29wZS5jb2RlRHVwbGljYXRlZERlY2xhcmF0aW9uRHVwbGljYXRlZERlY2xhcmF0aW9uRFVQTElDQVRFX0RFRklOSVRJT050ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlUHJldmlvdXMgZGVjbGFyYXRpb24gb2YgJyNuYW1lJy5jb2RlRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2VEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZXRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uU3ludGhldGljQ2F1c2VQcmV2aW91cyBkZWNsYXJhdGlvbiBvZiAnI25hbWUnIGlzIGltcGxpZWQgYnkgdGhpcyBkZWZpbml0aW9uLmNvZGVEdXBsaWNhdGVkRGVjbGFyYXRpb25TeW50aGV0aWNDYXVzZUR1cGxpY2F0ZWREZWNsYXJhdGlvblN5bnRoZXRpY0NhdXNldGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2VDYW4ndCB1c2UgJyNuYW1lJyBiZWNhdXNlIGl0IGlzIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLmNvZGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2VEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2V0ZW1wbGF0ZUR1cGxpY2F0ZWRFeHBvcnQnI25hbWUnIGlzIGV4cG9ydGVkIGZyb20gYm90aCAnI3VyaScgYW5kICcjdXJpMicuY29kZUR1cGxpY2F0ZWRFeHBvcnREdXBsaWNhdGVkRXhwb3J0QU1CSUdVT1VTX0VYUE9SVHRlbXBsYXRlRHVwbGljYXRlZEV4cG9ydEluVHlwZWNvZGVEdXBsaWNhdGVkRXhwb3J0SW5UeXBlRHVwbGljYXRlZEV4cG9ydEluVHlwZXRlbXBsYXRlRHVwbGljYXRlZEltcG9ydCcjbmFtZScgaXMgaW1wb3J0ZWQgZnJvbSBib3RoICcjdXJpJyBhbmQgJyN1cmkyJy5jb2RlRHVwbGljYXRlZEltcG9ydER1cGxpY2F0ZWRJbXBvcnR0ZW1wbGF0ZUR1cGxpY2F0ZWRJbXBvcnRJblR5cGVjb2RlRHVwbGljYXRlZEltcG9ydEluVHlwZUR1cGxpY2F0ZWRJbXBvcnRJblR5cGVBTUJJR1VPVVNfSU1QT1JUdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydEEgbGlicmFyeSB3aXRoIG5hbWUgJyNuYW1lJyBpcyBleHBvcnRlZCBtb3JlIHRoYW4gb25jZS5jb2RlRHVwbGljYXRlZExpYnJhcnlFeHBvcnREdXBsaWNhdGVkTGlicmFyeUV4cG9ydEVYUE9SVF9EVVBMSUNBVEVEX0xJQlJBUllfTkFNRUR0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0Q29udGV4dCcjbmFtZScgaXMgYWxzbyBleHBvcnRlZCBoZXJlLmNvZGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydENvbnRleHREdXBsaWNhdGVkTGlicmFyeUV4cG9ydENvbnRleHR0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0QSBsaWJyYXJ5IHdpdGggbmFtZSAnI25hbWUnIGlzIGltcG9ydGVkIG1vcmUgdGhhbiBvbmNlLmNvZGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydER1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0SU1QT1JUX0RVUExJQ0FURURfTElCUkFSWV9OQU1FRHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlJbXBvcnRDb250ZXh0JyNuYW1lJyBpcyBhbHNvIGltcG9ydGVkIGhlcmUuY29kZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dER1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dHRlbXBsYXRlRHVwbGljYXRlZE1vZGlmaWVyVGhlIG1vZGlmaWVyICcjbGV4ZW1lJyB3YXMgYWxyZWFkeSBzcGVjaWZpZWQuVHJ5IHJlbW92aW5nIGFsbCBidXQgb25lIG9jY3VyZW5jZSBvZiB0aGUgbW9kaWZpZXIuY29kZUR1cGxpY2F0ZWRNb2RpZmllckR1cGxpY2F0ZWRNb2RpZmllcnRlbXBsYXRlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZENhbid0IGRlY2xhcmUgJyNuYW1lJyBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBzY29wZS5jb2RlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZER1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRSRUZFUkVOQ0VEX0JFRk9SRV9ERUNMQVJBVElPTnRlbXBsYXRlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZENhdXNlUHJldmlvdXMgdXNlIG9mICcjbmFtZScuY29kZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZXRlbXBsYXRlRHVwbGljYXRlZE5hbWVkQXJndW1lbnREdXBsaWNhdGVkIG5hbWVkIGFyZ3VtZW50ICcjbmFtZScuY29kZUR1cGxpY2F0ZWROYW1lZEFyZ3VtZW50RHVwbGljYXRlZE5hbWVkQXJndW1lbnREVVBMSUNBVEVfTkFNRURfQVJHVU1FTlR0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lRHVwbGljYXRlZCBwYXJhbWV0ZXIgbmFtZSAnI25hbWUnLmNvZGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1ldGVtcGxhdGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZUNhdXNlT3RoZXIgcGFyYW1ldGVyIG5hbWVkICcjbmFtZScuY29kZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2VEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZUNhdXNlY29kZUVtcHR5TmFtZWRQYXJhbWV0ZXJMaXN0TmFtZWQgcGFyYW1ldGVyIGxpc3RzIGNhbm5vdCBiZSBlbXB0eS5UcnkgYWRkaW5nIGEgbmFtZWQgcGFyYW1ldGVyIHRvIHRoZSBsaXN0LkVtcHR5TmFtZWRQYXJhbWV0ZXJMaXN0TUlTU0lOR19JREVOVElGSUVSbWVzc2FnZUVtcHR5TmFtZWRQYXJhbWV0ZXJMaXN0Y29kZUVtcHR5T3B0aW9uYWxQYXJhbWV0ZXJMaXN0T3B0aW9uYWwgcGFyYW1ldGVyIGxpc3RzIGNhbm5vdCBiZSBlbXB0eS5UcnkgYWRkaW5nIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0byB0aGUgbGlzdC5FbXB0eU9wdGlvbmFsUGFyYW1ldGVyTGlzdG1lc3NhZ2VFbXB0eU9wdGlvbmFsUGFyYW1ldGVyTGlzdGNvZGVFbmNvZGluZ1VuYWJsZSB0byBkZWNvZGUgYnl0ZXMgYXMgVVRGLTguRW5jb2RpbmdtZXNzYWdlRW5jb2Rpbmd0ZW1wbGF0ZUVudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3NpbmdOYW1lIG9mIGVudW0gY29uc3RhbnQgJyNuYW1lJyBjYW4ndCBiZSB0aGUgc2FtZSBhcyB0aGUgZW51bSdzIG93biBuYW1lLmNvZGVFbnVtQ29uc3RhbnRTYW1lTmFtZUFzRW5jbG9zaW5nRW51bUNvbnN0YW50U2FtZU5hbWVBc0VuY2xvc2luZ0VOVU1fQ09OU1RBTlRfV0lUSF9FTlVNX05BTUVjb2RlRW51bURlY2xhcmF0aW9uRW1wdHlBbiBlbnVtIGRlY2xhcmF0aW9uIGNhbid0IGJlIGVtcHR5LkVudW1EZWNsYXJhdGlvbkVtcHR5RU1QVFlfRU5VTV9CT0RZbWVzc2FnZUVudW1EZWNsYXJhdGlvbkVtcHR5Y29kZUVudW1JbkNsYXNzRW51bXMgY2FuJ3QgYmUgZGVjbGFyZWQgaW5zaWRlIGNsYXNzZXMuVHJ5IG1vdmluZyB0aGUgZW51bSB0byB0aGUgdG9wLWxldmVsLkVudW1JbkNsYXNzbWVzc2FnZUVudW1JbkNsYXNzY29kZUVudW1JbnN0YW50aWF0aW9uRW51bXMgY2FuJ3QgYmUgaW5zdGFudGlhdGVkLkVudW1JbnN0YW50aWF0aW9uSU5TVEFOVElBVEVfRU5VTW1lc3NhZ2VFbnVtSW5zdGFudGlhdGlvbmNvZGVFcXVhbGl0eUNhbm5vdEJlRXF1YWxpdHlPcGVyYW5kQW4gZXF1YWxpdHkgZXhwcmVzc2lvbiBjYW4ndCBiZSBhbiBvcGVyYW5kIG9mIGFub3RoZXIgZXF1YWxpdHkgZXhwcmVzc2lvbi5UcnkgcmUtd3JpdGluZyB0aGUgZXhwcmVzc2lvbi5FcXVhbGl0eUNhbm5vdEJlRXF1YWxpdHlPcGVyYW5kbWVzc2FnZUVxdWFsaXR5Q2Fubm90QmVFcXVhbGl0eU9wZXJhbmR0ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3RFeHBlY3RlZCAnI3N0cmluZycgYWZ0ZXIgdGhpcy5jb2RlRXhwZWN0ZWRBZnRlckJ1dEdvdEV4cGVjdGVkQWZ0ZXJCdXRHb3RFWFBFQ1RFRF9UT0tFTmNvZGVFeHBlY3RlZEFuSW5pdGlhbGl6ZXJFeHBlY3RlZCBhbiBpbml0aWFsaXplci5FeHBlY3RlZEFuSW5pdGlhbGl6ZXJtZXNzYWdlRXhwZWN0ZWRBbkluaXRpYWxpemVyY29kZUV4cGVjdGVkQmxvY2tFeHBlY3RlZCBhIGJsb2NrLlRyeSBhZGRpbmcge30uRXhwZWN0ZWRCbG9ja21lc3NhZ2VFeHBlY3RlZEJsb2NrY29kZUV4cGVjdGVkQmxvY2tUb1NraXBFeHBlY3RlZCBhIGZ1bmN0aW9uIGJvZHkgb3IgJz0+Jy5FeHBlY3RlZEJsb2NrVG9Ta2lwTUlTU0lOR19GVU5DVElPTl9CT0RZbWVzc2FnZUV4cGVjdGVkQmxvY2tUb1NraXBjb2RlRXhwZWN0ZWRCb2R5RXhwZWN0ZWRCb2R5bWVzc2FnZUV4cGVjdGVkQm9keXRlbXBsYXRlRXhwZWN0ZWRCdXRHb3RFeHBlY3RlZCAnI3N0cmluZycgYmVmb3JlIHRoaXMuY29kZUV4cGVjdGVkQnV0R290RXhwZWN0ZWRCdXRHb3R0ZW1wbGF0ZUV4cGVjdGVkQ2xhc3NNZW1iZXJFeHBlY3RlZCBhIGNsYXNzIG1lbWJlciwgYnV0IGdvdCAnI2xleGVtZScuY29kZUV4cGVjdGVkQ2xhc3NNZW1iZXJFeHBlY3RlZENsYXNzTWVtYmVyRVhQRUNURURfQ0xBU1NfTUVNQkVSdGVtcGxhdGVFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHlBICNzdHJpbmcgbXVzdCBoYXZlIGEgYm9keSwgZXZlbiBpZiBpdCBpcyBlbXB0eS5UcnkgYWRkaW5nIGFuIGVtcHR5IGJvZHkuY29kZUV4cGVjdGVkQ2xhc3NPck1peGluQm9keUV4cGVjdGVkQ2xhc3NPck1peGluQm9keXRlbXBsYXRlRXhwZWN0ZWREZWNsYXJhdGlvbkV4cGVjdGVkIGEgZGVjbGFyYXRpb24sIGJ1dCBnb3QgJyNsZXhlbWUnLmNvZGVFeHBlY3RlZERlY2xhcmF0aW9uRXhwZWN0ZWREZWNsYXJhdGlvbkVYUEVDVEVEX0VYRUNVVEFCTEVjb2RlRXhwZWN0ZWRFbHNlT3JDb21tYUV4cGVjdGVkICdlbHNlJyBvciBjb21tYS5FeHBlY3RlZEVsc2VPckNvbW1hbWVzc2FnZUV4cGVjdGVkRWxzZU9yQ29tbWF0ZW1wbGF0ZUV4cGVjdGVkRW51bUJvZHlFeHBlY3RlZCBhIGVudW0gYm9keSwgYnV0IGdvdCAnI2xleGVtZScuQW4gZW51bSBkZWZpbml0aW9uIG11c3QgaGF2ZSBhIGJvZHkgd2l0aCBhdCBsZWFzdCBvbmUgY29uc3RhbnQgbmFtZS5jb2RlRXhwZWN0ZWRFbnVtQm9keUV4cGVjdGVkRW51bUJvZHlNSVNTSU5HX0VOVU1fQk9EWXRlbXBsYXRlRXhwZWN0ZWRGdW5jdGlvbkJvZHlFeHBlY3RlZCBhIGZ1bmN0aW9uIGJvZHksIGJ1dCBnb3QgJyNsZXhlbWUnLmNvZGVFeHBlY3RlZEZ1bmN0aW9uQm9keUV4cGVjdGVkRnVuY3Rpb25Cb2R5Y29kZUV4cGVjdGVkSGV4RGlnaXRBIGhleCBkaWdpdCAoMC05IG9yIEEtRikgbXVzdCBmb2xsb3cgJzB4Jy5FeHBlY3RlZEhleERpZ2l0TUlTU0lOR19IRVhfRElHSVRtZXNzYWdlRXhwZWN0ZWRIZXhEaWdpdHRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyRXhwZWN0ZWQgYW4gaWRlbnRpZmllciwgYnV0IGdvdCAnI2xleGVtZScuY29kZUV4cGVjdGVkSWRlbnRpZmllckV4cGVjdGVkSWRlbnRpZmllcnRlbXBsYXRlRXhwZWN0ZWRJbnN0ZWFkRXhwZWN0ZWQgJyNzdHJpbmcnIGluc3RlYWQgb2YgdGhpcy5jb2RlRXhwZWN0ZWRJbnN0ZWFkRXhwZWN0ZWRJbnN0ZWFkY29kZUV4cGVjdGVkTmFtZWRBcmd1bWVudEV4cGVjdGVkIG5hbWVkIGFyZ3VtZW50LkV4cGVjdGVkTmFtZWRBcmd1bWVudEVYVFJBX1BPU0lUSU9OQUxfQVJHVU1FTlRTbWVzc2FnZUV4cGVjdGVkTmFtZWRBcmd1bWVudGNvZGVFeHBlY3RlZE9uZUV4cHJlc3Npb25FeHBlY3RlZCBvbmUgZXhwcmVzc2lvbiwgYnV0IGZvdW5kIGFkZGl0aW9uYWwgaW5wdXQuRXhwZWN0ZWRPbmVFeHByZXNzaW9ubWVzc2FnZUV4cGVjdGVkT25lRXhwcmVzc2lvbmNvZGVFeHBlY3RlZE9wZW5QYXJlbnNFeHBlY3RlZCAnKCcuRXhwZWN0ZWRPcGVuUGFyZW5zbWVzc2FnZUV4cGVjdGVkT3BlblBhcmVuc2NvZGVFeHBlY3RlZFN0YXRlbWVudEV4cGVjdGVkIGEgc3RhdGVtZW50LkV4cGVjdGVkU3RhdGVtZW50bWVzc2FnZUV4cGVjdGVkU3RhdGVtZW50dGVtcGxhdGVFeHBlY3RlZFN0cmluZ0V4cGVjdGVkIGEgU3RyaW5nLCBidXQgZ290ICcjbGV4ZW1lJy5jb2RlRXhwZWN0ZWRTdHJpbmdFeHBlY3RlZFN0cmluZ0VYUEVDVEVEX1NUUklOR19MSVRFUkFMdGVtcGxhdGVFeHBlY3RlZFRva2VuRXhwZWN0ZWQgdG8gZmluZCAnI3N0cmluZycuY29kZUV4cGVjdGVkVG9rZW5FeHBlY3RlZFRva2VudGVtcGxhdGVFeHBlY3RlZFR5cGVFeHBlY3RlZCBhIHR5cGUsIGJ1dCBnb3QgJyNsZXhlbWUnLmNvZGVFeHBlY3RlZFR5cGVFeHBlY3RlZFR5cGVFWFBFQ1RFRF9UWVBFX05BTUVjb2RlRXhwZWN0ZWRVcmlFeHBlY3RlZCBhIFVSSS5FeHBlY3RlZFVyaW1lc3NhZ2VFeHBlY3RlZFVyaXRlbXBsYXRlRXhwZXJpbWVudE5vdEVuYWJsZWRUaGlzIHJlcXVpcmVzIHRoZSAnI3N0cmluZycgZXhwZXJpbWVudCB0byBiZSBlbmFibGVkLlRyeSBlbmFibGluZyB0aGlzIGV4cGVyaW1lbnQgYnkgYWRkaW5nIGl0IHRvIHRoZSBjb21tYW5kIGxpbmUgd2hlbiBjb21waWxpbmcgYW5kIHJ1bm5pbmcuY29kZUV4cGVyaW1lbnROb3RFbmFibGVkRXhwZXJpbWVudE5vdEVuYWJsZWRjb2RlRXhwb3J0QWZ0ZXJQYXJ0RXhwb3J0IGRpcmVjdGl2ZXMgbXVzdCBwcmVjZWRlIHBhcnQgZGlyZWN0aXZlcy5UcnkgbW92aW5nIHRoZSBleHBvcnQgZGlyZWN0aXZlcyBiZWZvcmUgdGhlIHBhcnQgZGlyZWN0aXZlcy5FeHBvcnRBZnRlclBhcnRtZXNzYWdlRXhwb3J0QWZ0ZXJQYXJ0dGVtcGxhdGVFeHBvcnRIaWRlc0V4cG9ydEV4cG9ydCBvZiAnI25hbWUnIChmcm9tICcjdXJpJykgaGlkZXMgZXhwb3J0IGZyb20gJyN1cmkyJy5jb2RlRXhwb3J0SGlkZXNFeHBvcnRFeHBvcnRIaWRlc0V4cG9ydGNvZGVFeHByZXNzaW9uTm90TWV0YWRhdGFUaGlzIGNhbid0IGJlIHVzZWQgYXMgbWV0YWRhdGE7IG1ldGFkYXRhIHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byBhIGNvbXBpbGUtdGltZSBjb25zdGFudCB2YXJpYWJsZSwgb3IgYSBjYWxsIHRvIGEgY29uc3RhbnQgY29uc3RydWN0b3IuRXhwcmVzc2lvbk5vdE1ldGFkYXRhbWVzc2FnZUV4cHJlc3Npb25Ob3RNZXRhZGF0YXRlbXBsYXRlRXh0ZW5kaW5nRW51bScjbmFtZScgaXMgYW4gZW51bSBhbmQgY2FuJ3QgYmUgZXh0ZW5kZWQgb3IgaW1wbGVtZW50ZWQuY29kZUV4dGVuZGluZ0VudW1FeHRlbmRpbmdFbnVtRVhURU5EU19FTlVNdGVtcGxhdGVFeHRlbmRpbmdSZXN0cmljdGVkJyNuYW1lJyBpcyByZXN0cmljdGVkIGFuZCBjYW4ndCBiZSBleHRlbmRlZCBvciBpbXBsZW1lbnRlZC5jb2RlRXh0ZW5kaW5nUmVzdHJpY3RlZEV4dGVuZGluZ1Jlc3RyaWN0ZWRFWFRFTkRTX0RJU0FMTE9XRURfQ0xBU1Njb2RlRXh0ZXJuYWxDbGFzc0NsYXNzZXMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2V4dGVybmFsJy5UcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ2V4dGVybmFsJy5FeHRlcm5hbENsYXNzbWVzc2FnZUV4dGVybmFsQ2xhc3Njb2RlRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhCb2R5RXh0ZXJuYWwgY29uc3RydWN0b3JzIGNhbid0IGhhdmUgYSBib2R5LlRyeSByZW1vdmluZyB0aGUgYm9keSBvZiB0aGUgY29uc3RydWN0b3IsIG9yIHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhCb2R5bWVzc2FnZUV4dGVybmFsQ29uc3RydWN0b3JXaXRoQm9keWNvZGVFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEZpZWxkSW5pdGlhbGl6ZXJzQW4gZXh0ZXJuYWwgY29uc3RydWN0b3IgY2FuJ3QgaW5pdGlhbGl6ZSBmaWVsZHMuVHJ5IHJlbW92aW5nIHRoZSBmaWVsZCBpbml0aWFsaXplcnMsIG9yIHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhGaWVsZEluaXRpYWxpemVyc0VYVEVSTkFMX0NPTlNUUlVDVE9SX1dJVEhfRklFTERfSU5JVElBTElaRVJTbWVzc2FnZUV4dGVybmFsQ29uc3RydWN0b3JXaXRoRmllbGRJbml0aWFsaXplcnNjb2RlRXh0ZXJuYWxFbnVtRW51bXMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2V4dGVybmFsJy5FeHRlcm5hbEVudW1tZXNzYWdlRXh0ZXJuYWxFbnVtY29kZUV4dGVybmFsRmFjdG9yeVJlZGlyZWN0aW9uQSByZWRpcmVjdGluZyBmYWN0b3J5IGNhbid0IGJlIGV4dGVybmFsLlRyeSByZW1vdmluZyB0aGUgJ2V4dGVybmFsJyBtb2RpZmllci5FeHRlcm5hbEZhY3RvcnlSZWRpcmVjdGlvbm1lc3NhZ2VFeHRlcm5hbEZhY3RvcnlSZWRpcmVjdGlvbmNvZGVFeHRlcm5hbEZhY3RvcnlXaXRoQm9keUV4dGVybmFsIGZhY3RvcmllcyBjYW4ndCBoYXZlIGEgYm9keS5UcnkgcmVtb3ZpbmcgdGhlIGJvZHkgb2YgdGhlIGZhY3RvcnksIG9yIHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuRXh0ZXJuYWxGYWN0b3J5V2l0aEJvZHltZXNzYWdlRXh0ZXJuYWxGYWN0b3J5V2l0aEJvZHljb2RlRXh0ZXJuYWxGaWVsZEZpZWxkcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnZXh0ZXJuYWwnLkV4dGVybmFsRmllbGRtZXNzYWdlRXh0ZXJuYWxGaWVsZGNvZGVFeHRlcm5hbE1ldGhvZFdpdGhCb2R5QW4gZXh0ZXJuYWwgb3IgbmF0aXZlIG1ldGhvZCBjYW4ndCBoYXZlIGEgYm9keS5FeHRlcm5hbE1ldGhvZFdpdGhCb2R5bWVzc2FnZUV4dGVybmFsTWV0aG9kV2l0aEJvZHljb2RlRXh0ZXJuYWxUeXBlZGVmVHlwZWRlZnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2V4dGVybmFsJy5FeHRlcm5hbFR5cGVkZWZtZXNzYWdlRXh0ZXJuYWxUeXBlZGVmdGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXJDYW4ndCBoYXZlIG1vZGlmaWVyICcjbGV4ZW1lJyBoZXJlLlRyeSByZW1vdmluZyAnI2xleGVtZScuY29kZUV4dHJhbmVvdXNNb2RpZmllckV4dHJhbmVvdXNNb2RpZmllcmNvZGVGYWN0b3J5Tm90U3luY0ZhY3RvcnkgYm9kaWVzIGNhbid0IHVzZSAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJy5GYWN0b3J5Tm90U3luY05PTl9TWU5DX0ZBQ1RPUlltZXNzYWdlRmFjdG9yeU5vdFN5bmNjb2RlRmFjdG9yeVRvcExldmVsRGVjbGFyYXRpb25Ub3AtbGV2ZWwgZGVjbGFyYXRpb25zIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdmYWN0b3J5Jy5UcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ2ZhY3RvcnknLkZhY3RvcnlUb3BMZXZlbERlY2xhcmF0aW9ubWVzc2FnZUZhY3RvcnlUb3BMZXZlbERlY2xhcmF0aW9udGVtcGxhdGVGYXN0YUNMSUFyZ3VtZW50UmVxdWlyZWRFeHBlY3RlZCB2YWx1ZSBhZnRlciAnI25hbWUnLmNvZGVGYXN0YUNMSUFyZ3VtZW50UmVxdWlyZWRGYXN0YUNMSUFyZ3VtZW50UmVxdWlyZWRjb2RlRmFzdGFVc2FnZUxvbmdTdXBwb3J0ZWQgb3B0aW9uczoKCiAgLW8gPGZpbGU+LCAtLW91dHB1dD08ZmlsZT4KICAgIEdlbmVyYXRlIHRoZSBvdXRwdXQgaW50byA8ZmlsZT4uCgogIC1oLCAvaCwgLz8sIC0taGVscAogICAgRGlzcGxheSB0aGlzIG1lc3NhZ2UgKGFkZCAtdiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWxsIG9wdGlvbnMpLgoKICAtdiwgLS12ZXJib3NlCiAgICBEaXNwbGF5IHZlcmJvc2UgaW5mb3JtYXRpb24uCgogIC1EbmFtZQogIC1EbmFtZT12YWx1ZQogICAgRGVmaW5lIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZSBjb21waWxlLXRpbWUgZW52aXJvbm1lbnQuCgogIC0tbm8tZGVmaW5lcwogICAgSWdub3JlIGFsbCAtRCBvcHRpb25zIGFuZCBsZWF2ZSBlbnZpcm9ubWVudCBjb25zdGFudHMgdW5ldmFsdWF0ZWQuCgogIC0tCiAgICBTdG9wIG9wdGlvbiBwYXJzaW5nLCB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCBsaW5lIGlzIGFzc3VtZWQgdG8gYmUKICAgIGZpbGUgbmFtZXMgb3IgYXJndW1lbnRzIHRvIHRoZSBEYXJ0IHByb2dyYW0uCgogIC0tcGFja2FnZXM9PGZpbGU+CiAgICBVc2UgcGFja2FnZSByZXNvbHV0aW9uIGNvbmZpZ3VyYXRpb24gPGZpbGU+LCB3aGljaCBzaG91bGQgY29udGFpbiBhIG1hcHBpbmcKICAgIG9mIHBhY2thZ2UgbmFtZXMgdG8gcGF0aHMuCgogIC0tcGxhdGZvcm09PGZpbGU+CiAgICBSZWFkIHRoZSBTREsgcGxhdGZvcm0gZnJvbSA8ZmlsZT4sIHdoaWNoIHNob3VsZCBiZSBpbiBEaWxsL0tlcm5lbCBJUiBmb3JtYXQKICAgIGFuZCBjb250YWluIHRoZSBEYXJ0IFNESy4KCiAgLS10YXJnZXQ9ZGFydDJqc3xkYXJ0MmpzX3NlcnZlcnxkYXJ0X3J1bm5lcnxmbHV0dGVyfGZsdXR0ZXJfcnVubmVyfG5vbmV8dm0KICAgIFNwZWNpZnkgdGhlIHRhcmdldCBjb25maWd1cmF0aW9uLgoKICAtLWVuYWJsZS1hc3NlcnRzCiAgICBDaGVjayBhc3NlcnRzIGluIGluaXRpYWxpemVycyBkdXJpbmcgY29uc3RhbnQgZXZhbHVhdGlvbi4KCiAgLS12ZXJpZnkKICAgIENoZWNrIHRoYXQgdGhlIGdlbmVyYXRlZCBvdXRwdXQgaXMgZnJlZSBvZiB2YXJpb3VzIHByb2JsZW1zLiBUaGlzIGlzIG1vc3RseQogICAgdXNlZnVsIGZvciBkZXZlbG9wZXJzIG9mIHRoaXMgY29tcGlsZXIgb3IgS2VybmVsIHRyYW5zZm9ybWF0aW9ucy4KCiAgLS1kdW1wLWlyCiAgICBQcmludCBjb21waWxlZCBsaWJyYXJpZXMgaW4gS2VybmVsIHNvdXJjZSBub3RhdGlvbi4KCiAgLS1vbWl0LXBsYXRmb3JtCiAgICBFeGNsdWRlIHRoZSBwbGF0Zm9ybSBmcm9tIHRoZSBzZXJpYWxpemVkIGRpbGwgZmlsZS4KCiAgLS1ieXRlY29kZQogICAgR2VuZXJhdGUgYnl0ZWNvZGUuIFN1cHBvcnRlZCBvbmx5IGZvciBTREsgcGxhdGZvcm0gY29tcGlsYXRpb24uCgogIC0tZXhjbHVkZS1zb3VyY2UKICAgIERvIG5vdCBpbmNsdWRlIHNvdXJjZSBjb2RlIGluIHRoZSBkaWxsIGZpbGUuCgogIC0tY29tcGlsZS1zZGs9PHNkaz4KICAgIENvbXBpbGUgdGhlIFNESyBmcm9tIHNjcmF0Y2ggaW5zdGVhZCBvZiByZWFkaW5nIGl0IGZyb20gYSAuZGlsbCBmaWxlCiAgICAoc2VlIC0tcGxhdGZvcm0pLgoKICAtLXNkaz08c2RrPgogICAgTG9jYXRpb24gb2YgdGhlIFNESyBzb3VyY2VzIGZvciB1c2Ugd2hlbiBjb21waWxpbmcgYWRkaXRpb25hbCBwbGF0Zm9ybQogICAgbGlicmFyaWVzLgoKICAtLXN1cGVybWl4aW4KICAgIElnbm9yZWQgZm9yIG5vdy4KCiAgLS1zaW5nbGUtcm9vdC1zY2hlbWU9U3RyaW5nCiAgLS1zaW5nbGUtcm9vdC1iYXNlPTxkaXI+CiAgICBTcGVjaWZ5IGEgY3VzdG9tIFVSSSBzY2hlbWUgYW5kIGEgbG9jYXRpb24gb24gZGlzayB3aGVyZSBzdWNoIFVSSXMgYXJlCiAgICBtYXBwZWQgdG8uCgogICAgV2hlbiBzcGVjaWZpZWQsIHRoZSBjb21waWxlciBjYW4gYmUgaW52b2tlZCB3aXRoIGlucHV0cyB1c2luZyB0aGUgY3VzdG9tCiAgICBVUkkgc2NoZW1lLiBUaGUgY29tcGlsZXIgY2FuIGlnbm9yZSB0aGUgZXhhY3QgbG9jYXRpb24gb2YgZmlsZXMgb24gZGlzawogICAgYW5kIGFzIGEgcmVzdWx0IHRvIHByb2R1Y2Ugb3V0cHV0IHRoYXQgaXMgaW5kZXBlbmRlbmRlbnQgb2YgdGhlIGFic29sdXRlCiAgICBsb2NhdGlvbiBvZiBmaWxlcyBvbiBkaXNrLiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yIGludGVncmF0aW5nIHdpdGgKICAgIGJ1aWxkIHN5c3RlbXMuCgogIC0tZmF0YWw9ZXJyb3JzCiAgLS1mYXRhbD13YXJuaW5ncwogICAgTWFrZXMgbWVzc2FnZXMgb2YgdGhlIGdpdmVuIGtpbmRzIGZhdGFsLCB0aGF0IGlzLCBpbW1lZGlhdGVseSBzdG9wIHRoZQogICAgY29tcGlsZXIgd2l0aCBhIG5vbi16ZXJvIGV4aXQtY29kZS4gSW4gLS12ZXJib3NlIG1vZGUsIGFsc28gZGlzcGxheSBhbgogICAgaW50ZXJuYWwgc3RhY2sgdHJhY2UgZnJvbSB0aGUgY29tcGlsZXIuIE11bHRpcGxlIGtpbmRzIGNhbiBiZSBzZXBhcmF0ZWQgYnkKICAgIGNvbW1hcywgZm9yIGV4YW1wbGUsIC0tZmF0YWw9ZXJyb3JzLHdhcm5pbmdzLgoKICAtLWVuYWJsZS1leHBlcmltZW50PTxmbGFnPgogICAgRW5hYmxlIG9yIGRpc2FibGUgYW4gZXhwZXJpbWVudGFsIGZsYWcsIHVzZWQgdG8gZ3VhcmQgZmVhdHVyZXMgY3VycmVudGx5CiAgICBpbiBkZXZlbG9wbWVudC4gUHJlZml4IGFuIGV4cGVyaW1lbnQgbmFtZSB3aXRoICduby0nIHRvIGRpc2FibGUgaXQuCiAgICBNdWx0aXBsZSBleHBlcmltZW50cyBjYW4gYmUgc2VwYXJhdGVkIGJ5IGNvbW1hcy5GYXN0YVVzYWdlTG9uZ21lc3NhZ2VGYXN0YVVzYWdlTG9uZ2NvZGVGYXN0YVVzYWdlU2hvcnRGcmVxdWVudGx5IHVzZWQgb3B0aW9uczoKCiAgLW8gPGZpbGU+IEdlbmVyYXRlIHRoZSBvdXRwdXQgaW50byA8ZmlsZT4uCiAgLWggICAgICAgIERpc3BsYXkgdGhpcyBtZXNzYWdlIChhZGQgLXYgZm9yIGluZm9ybWF0aW9uIGFib3V0IGFsbCBvcHRpb25zKS5GYXN0YVVzYWdlU2hvcnRtZXNzYWdlRmFzdGFVc2FnZVNob3J0dGVtcGxhdGVGZmlEYXJ0VHlwZU1pc21hdGNoRXhwZWN0ZWQgJyN0eXBlJyB0byBiZSBhIHN1YnR5cGUgb2YgJyN0eXBlMicuY29kZUZmaURhcnRUeXBlTWlzbWF0Y2hGZmlEYXJ0VHlwZU1pc21hdGNodGVtcGxhdGVGZmlFeHRlbmRzT3JJbXBsZW1lbnRzU2VhbGVkQ2xhc3NDbGFzcyAnI25hbWUnIGNhbm5vdCBiZSBleHRlbmRlZCBvciBpbXBsZW1lbnRlZC5jb2RlRmZpRXh0ZW5kc09ySW1wbGVtZW50c1NlYWxlZENsYXNzRmZpRXh0ZW5kc09ySW1wbGVtZW50c1NlYWxlZENsYXNzdGVtcGxhdGVGZmlGaWVsZEFubm90YXRpb25GaWVsZCAnI25hbWUnIHJlcXVpcmVzIGV4YWN0bHkgb25lIGFubm90YXRpb24gdG8gZGVjbGFyZSBpdHMgQysrIHR5cGUsIHdoaWNoIGNhbm5vdCBiZSBWb2lkLiBkYXJ0OmZmaSBTdHJ1Y3RzIGNhbm5vdCBoYXZlIHJlZ3VsYXIgRGFydCBmaWVsZHMuY29kZUZmaUZpZWxkQW5ub3RhdGlvbkZmaUZpZWxkQW5ub3RhdGlvbnRlbXBsYXRlRmZpRmllbGRJbml0aWFsaXplckZpZWxkICcjbmFtZScgaXMgYSBkYXJ0OmZmaSBQb2ludGVyIHRvIGEgc3RydWN0IGZpZWxkIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjb25zdHJ1Y3RvciBleGVjdXRpb24uY29kZUZmaUZpZWxkSW5pdGlhbGl6ZXJGZmlGaWVsZEluaXRpYWxpemVydGVtcGxhdGVGZmlGaWVsZE5vQW5ub3RhdGlvbkZpZWxkICcjbmFtZScgcmVxdWlyZXMgbm8gYW5ub3RhdGlvbiB0byBkZWNsYXJlIGl0cyBDKysgdHlwZSwgaXQgaXMgYSBQb2ludGVyIHdoaWNoIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBzYW1lIHR5cGUgaW4gRGFydCBhbmQgQysrLmNvZGVGZmlGaWVsZE5vQW5ub3RhdGlvbkZmaUZpZWxkTm9Bbm5vdGF0aW9udGVtcGxhdGVGZmlOb3RTdGF0aWMjbmFtZSBleHBlY3RzIGEgc3RhdGljIGZ1bmN0aW9uIGFzIHBhcmFtZXRlci4gZGFydDpmZmkgb25seSBzdXBwb3J0cyBjYWxsaW5nIHN0YXRpYyBEYXJ0IGZ1bmN0aW9ucyBmcm9tIGMuY29kZUZmaU5vdFN0YXRpY0ZmaU5vdFN0YXRpY3RlbXBsYXRlRmZpU3RydWN0R2VuZXJpY1N0cnVjdCAnI25hbWUnIHNob3VsZCBub3QgYmUgZ2VuZXJpYy5jb2RlRmZpU3RydWN0R2VuZXJpY0ZmaVN0cnVjdEdlbmVyaWN0ZW1wbGF0ZUZmaVR5cGVJbnZhbGlkRXhwZWN0ZWQgdHlwZSAnI3R5cGUnIHRvIGJlIGEgdmFsaWQgYW5kIGluc3RhbnRpYXRlZCBzdWJ0eXBlIG9mICdOYXRpdmVUeXBlJy5jb2RlRmZpVHlwZUludmFsaWRGZmlUeXBlSW52YWxpZHRlbXBsYXRlRmZpVHlwZU1pc21hdGNoRXhwZWN0ZWQgdHlwZSAnI3R5cGUnIHRvIGJlICcjdHlwZTInLCB3aGljaCBpcyB0aGUgRGFydCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gJyN0eXBlMycuY29kZUZmaVR5cGVNaXNtYXRjaEZmaVR5cGVNaXNtYXRjaHRlbXBsYXRlRmZpVHlwZVVuc2l6ZWRNZXRob2QgJyNuYW1lJyBjYW5ub3QgYmUgY2FsbGVkIG9uIHNvbWV0aGluZyBvZiB0eXBlICcjdHlwZScgYXMgdGhpcyB0eXBlIGlzIHVuc2l6ZWQuY29kZUZmaVR5cGVVbnNpemVkRmZpVHlwZVVuc2l6ZWR0ZW1wbGF0ZUZmaVdyb25nU3RydWN0SW5oZXJpdGFuY2VTdHJ1Y3QgJyNuYW1lJyBtdXN0IGluaGVyaXQgZnJvbSAnU3RydWN0PCNuYW1lPicuY29kZUZmaVdyb25nU3RydWN0SW5oZXJpdGFuY2VGZmlXcm9uZ1N0cnVjdEluaGVyaXRhbmNlY29kZUZpZWxkSW5pdGlhbGl6ZWRPdXRzaWRlRGVjbGFyaW5nQ2xhc3NBIGZpZWxkIGNhbiBvbmx5IGJlIGluaXRpYWxpemVkIGluIGl0J3MgZGVjbGFyaW5nIGNsYXNzVHJ5IHBhc3NpbmcgYSB2YWx1ZSBpbnRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLCBvciBtb3ZpbmcgdGhlIGluaXRpYWxpemF0aW9uIGludG8gdGhlIGNvbnN0cnVjdG9yIGJvZHkuRmllbGRJbml0aWFsaXplZE91dHNpZGVEZWNsYXJpbmdDbGFzc21lc3NhZ2VGaWVsZEluaXRpYWxpemVkT3V0c2lkZURlY2xhcmluZ0NsYXNzY29kZUZpZWxkSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3JGaWVsZCBmb3JtYWwgcGFyYW1ldGVycyBjYW4gb25seSBiZSB1c2VkIGluIGEgY29uc3RydWN0b3IuVHJ5IHJlbW92aW5nICd0aGlzLicuRmllbGRJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3Rvcm1lc3NhZ2VGaWVsZEluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9yY29kZUZpbmFsQW5kQ292YXJpYW50TWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdmaW5hbCcgYW5kICdjb3ZhcmlhbnQnLlRyeSByZW1vdmluZyBlaXRoZXIgdGhlICdmaW5hbCcgb3IgJ2NvdmFyaWFudCcga2V5d29yZC5GaW5hbEFuZENvdmFyaWFudG1lc3NhZ2VGaW5hbEFuZENvdmFyaWFudGNvZGVGaW5hbEFuZFZhck1lbWJlcnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgYm90aCAnZmluYWwnIGFuZCAndmFyJy5UcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ3ZhcicuRmluYWxBbmRWYXJtZXNzYWdlRmluYWxBbmRWYXJ0ZW1wbGF0ZUZpbmFsRmllbGROb3RJbml0aWFsaXplZEZpbmFsIGZpZWxkICcjbmFtZScgaXMgbm90IGluaXRpYWxpemVkLlRyeSB0byBpbml0aWFsaXplIHRoZSBmaWVsZCBpbiB0aGUgZGVjbGFyYXRpb24gb3IgaW4gZXZlcnkgY29uc3RydWN0b3IuY29kZUZpbmFsRmllbGROb3RJbml0aWFsaXplZEZpbmFsRmllbGROb3RJbml0aWFsaXplZEZJTkFMX05PVF9JTklUSUFMSVpFRHRlbXBsYXRlRmluYWxGaWVsZE5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvckZpbmFsIGZpZWxkICcjbmFtZScgaXMgbm90IGluaXRpYWxpemVkIGJ5IHRoaXMgY29uc3RydWN0b3IuVHJ5IHRvIGluaXRpYWxpemUgdGhlIGZpZWxkIHVzaW5nIGFuIGluaXRpYWxpemluZyBmb3JtYWwgb3IgYSBmaWVsZCBpbml0aWFsaXplci5jb2RlRmluYWxGaWVsZE5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvckZpbmFsRmllbGROb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3JGSU5BTF9OT1RfSU5JVElBTElaRURfQ09OU1RSVUNUT1JfMXRlbXBsYXRlRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplclRoZSBmaW5hbCB2YXJpYWJsZSAnI25hbWUnIG11c3QgYmUgaW5pdGlhbGl6ZWQuY29kZUZpbmFsRmllbGRXaXRob3V0SW5pdGlhbGl6ZXJGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVydGVtcGxhdGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWQnI25hbWUnIGlzIGEgZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLmNvZGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRGSU5BTF9JTklUSUFMSVpFRF9NVUxUSVBMRV9USU1FU3RlbXBsYXRlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkQ2F1c2UnI25hbWUnIHdhcyBpbml0aWFsaXplZCBoZXJlLmNvZGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRDYXVzZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZENhdXNldGVtcGxhdGVGb3JJbkxvb3BFbGVtZW50VHlwZU5vdEFzc2lnbmFibGVBIHZhbHVlIG9mIHR5cGUgJyN0eXBlJyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJyN0eXBlMicuVHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZS5jb2RlRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlRk9SX0lOX09GX0lOVkFMSURfRUxFTUVOVF9UWVBFY29kZUZvckluTG9vcEV4YWN0bHlPbmVWYXJpYWJsZUEgZm9yLWluIGxvb3AgY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIGxvb3AgdmFyaWFibGUuRm9ySW5Mb29wRXhhY3RseU9uZVZhcmlhYmxlbWVzc2FnZUZvckluTG9vcEV4YWN0bHlPbmVWYXJpYWJsZWNvZGVGb3JJbkxvb3BOb3RBc3NpZ25hYmxlQ2FuJ3QgYXNzaWduIHRvIHRoaXMsIHNvIGl0IGNhbid0IGJlIHVzZWQgaW4gYSBmb3ItaW4gbG9vcC5Gb3JJbkxvb3BOb3RBc3NpZ25hYmxlbWVzc2FnZUZvckluTG9vcE5vdEFzc2lnbmFibGV0ZW1wbGF0ZUZvckluTG9vcFR5cGVOb3RJdGVyYWJsZVRoZSB0eXBlICcjdHlwZScgdXNlZCBpbiB0aGUgJ2ZvcicgbG9vcCBtdXN0IGltcGxlbWVudCAnI3R5cGUyJy5jb2RlRm9ySW5Mb29wVHlwZU5vdEl0ZXJhYmxlRm9ySW5Mb29wVHlwZU5vdEl0ZXJhYmxlRk9SX0lOX09GX0lOVkFMSURfVFlQRWNvZGVGb3JJbkxvb3BXaXRoQ29uc3RWYXJpYWJsZUEgZm9yLWluIGxvb3AtdmFyaWFibGUgY2FuJ3QgYmUgJ2NvbnN0Jy5UcnkgcmVtb3ZpbmcgdGhlICdjb25zdCcgbW9kaWZpZXIuRm9ySW5Mb29wV2l0aENvbnN0VmFyaWFibGVGT1JfSU5fV0lUSF9DT05TVF9WQVJJQUJMRW1lc3NhZ2VGb3JJbkxvb3BXaXRoQ29uc3RWYXJpYWJsZWNvZGVGdW5jdGlvblR5cGVEZWZhdWx0VmFsdWVDYW4ndCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBpbiBhIGZ1bmN0aW9uIHR5cGUuRnVuY3Rpb25UeXBlRGVmYXVsdFZhbHVlREVGQVVMVF9WQUxVRV9JTl9GVU5DVElPTl9UWVBFbWVzc2FnZUZ1bmN0aW9uVHlwZURlZmF1bHRWYWx1ZWNvZGVGdW5jdGlvblR5cGVkUGFyYW1ldGVyVmFyRnVuY3Rpb24tdHlwZWQgcGFyYW1ldGVycyBjYW4ndCBzcGVjaWZ5ICdjb25zdCcsICdmaW5hbCcgb3IgJ3ZhcicgaW4gcGxhY2Ugb2YgYSByZXR1cm4gdHlwZS5UcnkgcmVwbGFjaW5nIHRoZSBrZXl3b3JkIHdpdGggYSByZXR1cm4gdHlwZS5GdW5jdGlvblR5cGVkUGFyYW1ldGVyVmFyRlVOQ1RJT05fVFlQRURfUEFSQU1FVEVSX1ZBUm1lc3NhZ2VGdW5jdGlvblR5cGVkUGFyYW1ldGVyVmFyY29kZUdlbmVyYXRvclJldHVybnNWYWx1ZSdzeW5jKicgYW5kICdhc3luYyonIGNhbid0IHJldHVybiBhIHZhbHVlLkdlbmVyYXRvclJldHVybnNWYWx1ZVJFVFVSTl9JTl9HRU5FUkFUT1JtZXNzYWdlR2VuZXJhdG9yUmV0dXJuc1ZhbHVlY29kZUdlbmVyaWNGdW5jdGlvblR5cGVJbkJvdW5kVHlwZSB2YXJpYWJsZXMgY2FuJ3QgaGF2ZSBnZW5lcmljIGZ1bmN0aW9uIHR5cGVzIGluIHRoZWlyIGJvdW5kcy5HZW5lcmljRnVuY3Rpb25UeXBlSW5Cb3VuZEdFTkVSSUNfRlVOQ1RJT05fVFlQRV9DQU5OT1RfQkVfQk9VTkRtZXNzYWdlR2VuZXJpY0Z1bmN0aW9uVHlwZUluQm91bmR0ZW1wbGF0ZUdlbmVyaWNGdW5jdGlvblR5cGVJbmZlcnJlZEFzQWN0dWFsVHlwZUFyZ3VtZW50VW5leHBlY3RlZCBnZW5lcmljIGZ1bmN0aW9uIHR5cGUgJyN0eXBlJyBpbmZlcnJlZCBhcyBhIHR5cGUgYXJndW1lbnQuVHJ5IHByb3ZpZGluZyBhIG5vbi1nZW5lcmljIGZ1bmN0aW9uIHR5cGUgZXhwbGljaXRseS5jb2RlR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnRHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudEdFTkVSSUNfRlVOQ1RJT05fQ0FOTk9UX0JFX1RZUEVfQVJHVU1FTlRjb2RlR2VuZXJpY0Z1bmN0aW9uVHlwZVVzZWRBc0FjdHVhbFR5cGVBcmd1bWVudFVuZXhwZWN0ZWQgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlIGZvdW5kIGluIGEgdHlwZSBhcmd1bWVudC5UcnkgdXNpbmcgYSBub24tZ2VuZXJpYyBmdW5jdGlvbiB0eXBlLkdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnRtZXNzYWdlR2VuZXJpY0Z1bmN0aW9uVHlwZVVzZWRBc0FjdHVhbFR5cGVBcmd1bWVudHRlbXBsYXRlR2V0dGVyTm90Rm91bmRHZXR0ZXIgbm90IGZvdW5kOiAnI25hbWUnLmNvZGVHZXR0ZXJOb3RGb3VuZEdldHRlck5vdEZvdW5kVU5ERUZJTkVEX0dFVFRFUmNvZGVHZXR0ZXJXaXRoRm9ybWFsc0EgZ2V0dGVyIGNhbid0IGhhdmUgZm9ybWFsIHBhcmFtZXRlcnMuVHJ5IHJlbW92aW5nICcoLi4uKScuR2V0dGVyV2l0aEZvcm1hbHNHRVRURVJfV0lUSF9QQVJBTUVURVJTbWVzc2FnZUdldHRlcldpdGhGb3JtYWxzY29kZUlsbGVnYWxBc3NpZ25tZW50VG9Ob25Bc3NpZ25hYmxlSWxsZWdhbCBhc3NpZ25tZW50IHRvIG5vbi1hc3NpZ25hYmxlIGV4cHJlc3Npb24uSWxsZWdhbEFzc2lnbm1lbnRUb05vbkFzc2lnbmFibGVtZXNzYWdlSWxsZWdhbEFzc2lnbm1lbnRUb05vbkFzc2lnbmFibGVjb2RlSWxsZWdhbEFzeW5jR2VuZXJhdG9yUmV0dXJuVHlwZUZ1bmN0aW9ucyBtYXJrZWQgJ2FzeW5jKicgbXVzdCBoYXZlIGEgcmV0dXJuIHR5cGUgYXNzaWduYWJsZSB0byAnU3RyZWFtJy5JbGxlZ2FsQXN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlSUxMRUdBTF9BU1lOQ19HRU5FUkFUT1JfUkVUVVJOX1RZUEVtZXNzYWdlSWxsZWdhbEFzeW5jR2VuZXJhdG9yUmV0dXJuVHlwZWNvZGVJbGxlZ2FsQXN5bmNHZW5lcmF0b3JWb2lkUmV0dXJuVHlwZUZ1bmN0aW9ucyBtYXJrZWQgJ2FzeW5jKicgY2FuJ3QgaGF2ZSByZXR1cm4gdHlwZSAndm9pZCcuSWxsZWdhbEFzeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGVtZXNzYWdlSWxsZWdhbEFzeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGVjb2RlSWxsZWdhbEFzeW5jUmV0dXJuVHlwZUZ1bmN0aW9ucyBtYXJrZWQgJ2FzeW5jJyBtdXN0IGhhdmUgYSByZXR1cm4gdHlwZSBhc3NpZ25hYmxlIHRvICdGdXR1cmUnLklsbGVnYWxBc3luY1JldHVyblR5cGVJTExFR0FMX0FTWU5DX1JFVFVSTl9UWVBFbWVzc2FnZUlsbGVnYWxBc3luY1JldHVyblR5cGV0ZW1wbGF0ZUlsbGVnYWxNaXhpblRoZSB0eXBlICcjbmFtZScgY2FuJ3QgYmUgbWl4ZWQgaW4uY29kZUlsbGVnYWxNaXhpbklsbGVnYWxNaXhpbklMTEVHQUxfTUlYSU50ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2FuJ3QgdXNlICcjbmFtZScgYXMgYSBtaXhpbiBiZWNhdXNlIGl0IGhhcyBjb25zdHJ1Y3RvcnMuY29kZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNNSVhJTl9ERUNMQVJFU19DT05TVFJVQ1RPUnRlbXBsYXRlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZVRoaXMgY29uc3RydWN0b3IgcHJldmVudHMgdXNpbmcgJyNuYW1lJyBhcyBhIG1peGluLmNvZGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0NhdXNlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZXRlbXBsYXRlSWxsZWdhbFJlY3Vyc2l2ZVR5cGVJbGxlZ2FsIHJlY3Vyc2l2ZSB0eXBlICcjdHlwZScuY29kZUlsbGVnYWxSZWN1cnNpdmVUeXBlSWxsZWdhbFJlY3Vyc2l2ZVR5cGVjb2RlSWxsZWdhbFN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlRnVuY3Rpb25zIG1hcmtlZCAnc3luYyonIG11c3QgaGF2ZSBhIHJldHVybiB0eXBlIGFzc2lnbmFibGUgdG8gJ0l0ZXJhYmxlJy5JbGxlZ2FsU3luY0dlbmVyYXRvclJldHVyblR5cGVJTExFR0FMX1NZTkNfR0VORVJBVE9SX1JFVFVSTl9UWVBFbWVzc2FnZUlsbGVnYWxTeW5jR2VuZXJhdG9yUmV0dXJuVHlwZWNvZGVJbGxlZ2FsU3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlRnVuY3Rpb25zIG1hcmtlZCAnc3luYyonIGNhbid0IGhhdmUgcmV0dXJuIHR5cGUgJ3ZvaWQnLklsbGVnYWxTeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGVtZXNzYWdlSWxsZWdhbFN5bmNHZW5lcmF0b3JWb2lkUmV0dXJuVHlwZWNvZGVJbXBsZW1lbnRzQmVmb3JlRXh0ZW5kc1RoZSBleHRlbmRzIGNsYXVzZSBtdXN0IGJlIGJlZm9yZSB0aGUgaW1wbGVtZW50cyBjbGF1c2UuVHJ5IG1vdmluZyB0aGUgZXh0ZW5kcyBjbGF1c2UgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS5JbXBsZW1lbnRzQmVmb3JlRXh0ZW5kc21lc3NhZ2VJbXBsZW1lbnRzQmVmb3JlRXh0ZW5kc2NvZGVJbXBsZW1lbnRzQmVmb3JlT25UaGUgb24gY2xhdXNlIG11c3QgYmUgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS5UcnkgbW92aW5nIHRoZSBvbiBjbGF1c2UgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS5JbXBsZW1lbnRzQmVmb3JlT25tZXNzYWdlSW1wbGVtZW50c0JlZm9yZU9uY29kZUltcGxlbWVudHNCZWZvcmVXaXRoVGhlIHdpdGggY2xhdXNlIG11c3QgYmUgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS5UcnkgbW92aW5nIHRoZSB3aXRoIGNsYXVzZSBiZWZvcmUgdGhlIGltcGxlbWVudHMgY2xhdXNlLkltcGxlbWVudHNCZWZvcmVXaXRobWVzc2FnZUltcGxlbWVudHNCZWZvcmVXaXRoY29kZUltcGxlbWVudHNGdXR1cmVPcidGdXR1cmVPcicgY2FuJ3QgYmUgdXNlZCBpbiBhbiAnaW1wbGVtZW50cycgY2xhdXNlLkltcGxlbWVudHNGdXR1cmVPcm1lc3NhZ2VJbXBsZW1lbnRzRnV0dXJlT3J0ZW1wbGF0ZUltcGxlbWVudHNSZXBlYXRlZCcjbmFtZScgY2FuIG9ubHkgYmUgaW1wbGVtZW50ZWQgb25jZS5UcnkgcmVtb3ZpbmcgI2NvdW50IG9mIHRoZSBvY2N1cnJlbmNlcy5jb2RlSW1wbGVtZW50c1JlcGVhdGVkSW1wbGVtZW50c1JlcGVhdGVkSU1QTEVNRU5UU19SRVBFQVRFRHRlbXBsYXRlSW1wbGVtZW50c1N1cGVyQ2xhc3MnI25hbWUnIGNhbid0IGJlIHVzZWQgaW4gYm90aCAnZXh0ZW5kcycgYW5kICdpbXBsZW1lbnRzJyBjbGF1c2VzLlRyeSByZW1vdmluZyBvbmUgb2YgdGhlIG9jY3VycmVuY2VzLmNvZGVJbXBsZW1lbnRzU3VwZXJDbGFzc0ltcGxlbWVudHNTdXBlckNsYXNzSU1QTEVNRU5UU19TVVBFUl9DTEFTU3RlbXBsYXRlSW1wbGljaXRDYWxsT2ZOb25NZXRob2RDYW5ub3QgaW52b2tlIGFuIGluc3RhbmNlIG9mICcjdHlwZScgYmVjYXVzZSBpdCBkZWNsYXJlcyAnY2FsbCcgdG8gYmUgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBtZXRob2QuVHJ5IGNoYW5naW5nICdjYWxsJyB0byBhIG1ldGhvZCBvciBleHBsaWNpdGx5IGludm9rZSAnY2FsbCcuY29kZUltcGxpY2l0Q2FsbE9mTm9uTWV0aG9kSW1wbGljaXRDYWxsT2ZOb25NZXRob2RJTVBMSUNJVF9DQUxMX09GX05PTl9NRVRIT0R0ZW1wbGF0ZUltcGxpY2l0TWl4aW5PdmVycmlkZUNvbnRleHRPdmVycmlkZSB3YXMgaW50cm9kdWNlZCB3aGVuIHRoZSBtaXhpbiAnI25hbWUnIHdhcyBhcHBsaWVkIHRvICcjbmFtZTInLmNvZGVJbXBsaWNpdE1peGluT3ZlcnJpZGVDb250ZXh0SW1wbGljaXRNaXhpbk92ZXJyaWRlQ29udGV4dGNvZGVJbXBvcnRBZnRlclBhcnRJbXBvcnQgZGlyZWN0aXZlcyBtdXN0IHByZWNlZGUgcGFydCBkaXJlY3RpdmVzLlRyeSBtb3ZpbmcgdGhlIGltcG9ydCBkaXJlY3RpdmVzIGJlZm9yZSB0aGUgcGFydCBkaXJlY3RpdmVzLkltcG9ydEFmdGVyUGFydG1lc3NhZ2VJbXBvcnRBZnRlclBhcnR0ZW1wbGF0ZUltcG9ydEhpZGVzSW1wb3J0SW1wb3J0IG9mICcjbmFtZScgKGZyb20gJyN1cmknKSBoaWRlcyBpbXBvcnQgZnJvbSAnI3VyaTInLmNvZGVJbXBvcnRIaWRlc0ltcG9ydEltcG9ydEhpZGVzSW1wb3J0dGVtcGxhdGVJbmNvbXBhdGlibGVSZWRpcmVjdGVlRnVuY3Rpb25UeXBlVGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHR5cGUgJyN0eXBlJyBpc24ndCBhIHN1YnR5cGUgb2YgJyN0eXBlMicuY29kZUluY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGVJbmNvbXBhdGlibGVSZWRpcmVjdGVlRnVuY3Rpb25UeXBlUkVESVJFQ1RfVE9fSU5WQUxJRF9UWVBFdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRUeXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjbmFtZTInLlRyeSBjaGFuZ2luZyB0eXBlIGFyZ3VtZW50cyBzbyB0aGF0IHRoZXkgY29uZm9ybSB0byB0aGUgYm91bmRzLmNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmNvcnJlY3RUeXBlQXJndW1lbnRUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFN0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluUmV0dXJuVHlwZVR5cGUgYXJndW1lbnQgJyN0eXBlJyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcjdHlwZTInIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcjbmFtZScgb24gJyNuYW1lMicgaW4gdGhlIHJldHVybiB0eXBlLmNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblJldHVyblR5cGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblJldHVyblR5cGV0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlVHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI25hbWUyJyBpbiB0aGUgc3VwZXJ0eXBlICcjbmFtZTMnIG9mIGNsYXNzICcjbmFtZTQnLmNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBldGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluZmVycmVkSW5mZXJyZWQgdHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI25hbWUyJyBpbiB0aGUgc3VwZXJ0eXBlICcjbmFtZTMnIG9mIGNsYXNzICcjbmFtZTQnLlRyeSBzcGVjaWZ5aW5nIHR5cGUgYXJndW1lbnRzIGV4cGxpY2l0bHkgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy5jb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGVJbmZlcnJlZEluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlSW5mZXJyZWR0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluZmVycmVkSW5mZXJyZWQgdHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI25hbWUyJy5jb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5mZXJyZWRJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmZlcnJlZHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkVHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI3R5cGUzLiNuYW1lMicuY29kZUluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZEluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkSW5mZXJyZWRJbmZlcnJlZCB0eXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjdHlwZTMuI25hbWUyJy5jb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkSW5mZXJyZWRJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRWYXJpYWJsZVRoaXMgaXMgdGhlIHR5cGUgdmFyaWFibGUgd2hvc2UgYm91bmQgaXNuJ3QgY29uZm9ybWVkIHRvLkluY29ycmVjdFR5cGVBcmd1bWVudFZhcmlhYmxlbWVzc2FnZUluY29ycmVjdFR5cGVBcmd1bWVudFZhcmlhYmxldGVtcGxhdGVJbmZlcnJlZFBhY2thZ2VVcmlJbnRlcnByZXRpbmcgdGhpcyBhcyBwYWNrYWdlIFVSSSwgJyN1cmknLmNvZGVJbmZlcnJlZFBhY2thZ2VVcmlJbmZlcnJlZFBhY2thZ2VVcmljb2RlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2FuJ3QgaW5oZXJpdCBtZW1iZXJzIHRoYXQgY29uZmxpY3Qgd2l0aCBlYWNoIG90aGVyLkluaGVyaXRlZE1lbWJlcnNDb25mbGljdENPTkZMSUNUU19XSVRIX0lOSEVSSVRFRF9NRU1CRVJtZXNzYWdlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Y29kZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMVRoaXMgaXMgb25lIGluaGVyaXRlZCBtZW1iZXIuSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UxbWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMWNvZGVJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTJUaGlzIGlzIHRoZSBvdGhlciBpbmhlcml0ZWQgbWVtYmVyLkluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMm1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTJ0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWRUcmllZCB0byBpbml0aWFsaXplIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiAoI3N0cmluZyksIGJ1dCB0aGUgZmlsZSB3YXMgbm90IHNlbGYtY29udGFpbmVkLiBUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LgpJZiB5b3UgYXJlIGNvbWZvcnRhYmxlIHdpdGggaXQsIGl0IHdvdWxkIGltcHJvdmUgdGhlIGNoYW5jZXMgb2YgZml4aW5nIGFueSBidWcgaWYgeW91IGluY2x1ZGVkIHRoZSBmaWxlICN1cmkgaW4geW91ciBlcnJvciByZXBvcnQsIGJ1dCBiZSBhd2FyZSB0aGF0IHRoaXMgZmlsZSBpbmNsdWRlcyB5b3VyIHNvdXJjZSBjb2RlLgpFaXRoZXIgd2F5LCB5b3Ugc2hvdWxkIHByb2JhYmx5IGRlbGV0ZSB0aGUgZmlsZSBzbyBpdCBkb2Vzbid0IHVzZSB1bm5lY2Vzc2FyeSBkaXNrIHNwYWNlLmNvZGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZE5vRHVtcFRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgjc3RyaW5nKSwgYnV0IHRoZSBmaWxlIHdhcyBub3Qgc2VsZi1jb250YWluZWQuIFRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuY29kZUluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWROb0R1bXBJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbVRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgjc3RyaW5nKSwgYnV0IGNvdWxkbid0LgpFcnJvciBtZXNzYWdlIHdhcyAnI3N0cmluZzInLgpTdGFja3RyYWNlIGluY2x1ZGVkICcjc3RyaW5nMycuClRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuCklmIHlvdSBhcmUgY29tZm9ydGFibGUgd2l0aCBpdCwgaXQgd291bGQgaW1wcm92ZSB0aGUgY2hhbmNlcyBvZiBmaXhpbmcgYW55IGJ1ZyBpZiB5b3UgaW5jbHVkZWQgdGhlIGZpbGUgI3VyaSBpbiB5b3VyIGVycm9yIHJlcG9ydCwgYnV0IGJlIGF3YXJlIHRoYXQgdGhpcyBmaWxlIGluY2x1ZGVzIHlvdXIgc291cmNlIGNvZGUuCkVpdGhlciB3YXksIHlvdSBzaG91bGQgcHJvYmFibHkgZGVsZXRlIHRoZSBmaWxlIHNvIGl0IGRvZXNuJ3QgdXNlIHVubmVjZXNzYXJ5IGRpc2sgc3BhY2UuY29kZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW10ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtTm9EdW1wVHJpZWQgdG8gaW5pdGlhbGl6ZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gKCNzdHJpbmcpLCBidXQgY291bGRuJ3QuCkVycm9yIG1lc3NhZ2Ugd2FzICcjc3RyaW5nMicuClN0YWNrdHJhY2UgaW5jbHVkZWQgJyNzdHJpbmczJy4KVGhpcyBtaWdodCBiZSBhIGJ1Zy4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGl0IGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvIHJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy5jb2RlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXBJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbU5vRHVtcGNvZGVJbml0aWFsaXplZFZhcmlhYmxlSW5Gb3JFYWNoVGhlIGxvb3AgdmFyaWFibGUgaW4gYSBmb3ItZWFjaCBsb29wIGNhbid0IGJlIGluaXRpYWxpemVkLlRyeSByZW1vdmluZyB0aGUgaW5pdGlhbGl6ZXIsIG9yIHVzaW5nIGEgZGlmZmVyZW50IGtpbmQgb2YgbG9vcC5Jbml0aWFsaXplZFZhcmlhYmxlSW5Gb3JFYWNobWVzc2FnZUluaXRpYWxpemVkVmFyaWFibGVJbkZvckVhY2h0ZW1wbGF0ZUluaXRpYWxpemVyRm9yU3RhdGljRmllbGQnI25hbWUnIGlzbid0IGFuIGluc3RhbmNlIGZpZWxkIG9mIHRoaXMgY2xhc3MuY29kZUluaXRpYWxpemVyRm9yU3RhdGljRmllbGRJbml0aWFsaXplckZvclN0YXRpY0ZpZWxkSU5JVElBTElaRVJfRk9SX1NUQVRJQ19GSUVMRHRlbXBsYXRlSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3JPbmx5IGNvbnN0cnVjdG9ycyBjYW4gaGF2ZSBpbml0aWFsaXplcnMsIGFuZCAnI25hbWUnIGlzIG5vdCBhIGNvbnN0cnVjdG9yLmNvZGVJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvckluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9ySU5JVElBTElaRVJfT1VUU0lERV9DT05TVFJVQ1RPUnRlbXBsYXRlSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoVGhlIHR5cGUgb2YgcGFyYW1ldGVyICcjbmFtZScsICcjdHlwZScgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCdzIHR5cGUsICcjdHlwZTInLlRyeSBjaGFuZ2luZyB0aGUgdHlwZSBvZiBwYXJhbWV0ZXIgJyNuYW1lJyB0byBhIHN1YnR5cGUgb2YgJyN0eXBlMicuY29kZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaEluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaElOVkFMSURfUEFSQU1FVEVSX0RFQ0xBUkFUSU9OY29kZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaEZpZWxkVGhlIGZpZWxkIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHBhcmFtZXRlci5Jbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2hGaWVsZG1lc3NhZ2VJbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2hGaWVsZGNvZGVJbnB1dEZpbGVOb3RGb3VuZElucHV0RmlsZU5vdEZvdW5kdGVtcGxhdGVJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZVRoZSBpbnRlZ2VyIGxpdGVyYWwgI3N0cmluZyBjYW4ndCBiZSByZXByZXNlbnRlZCBpbiA2NCBiaXRzLlRyeSB1c2luZyB0aGUgQmlnSW50IGNsYXNzIGlmIHlvdSBuZWVkIGFuIGludGVnZXIgbGFyZ2VyIHRoYW4gOSwyMjMsMzcyLDAzNiw4NTQsNzc1LDgwNyBvciBsZXNzIHRoYW4gLTksMjIzLDM3MiwwMzYsODU0LDc3NSw4MDguY29kZUludGVnZXJMaXRlcmFsSXNPdXRPZlJhbmdlSW50ZWdlckxpdGVyYWxJc091dE9mUmFuZ2VJTlRFR0VSX0xJVEVSQUxfT1VUX09GX1JBTkdFdGVtcGxhdGVJbnRlcmZhY2VDaGVja0NvbnRleHRCb3RoIG1lbWJlcnMgYXJlIGluaGVyaXRlZCBieSB0aGUgbm9uLWFic3RyYWN0IGNsYXNzICcjbmFtZScuY29kZUludGVyZmFjZUNoZWNrQ29udGV4dEludGVyZmFjZUNoZWNrQ29udGV4dGNvZGVJbnRlcm5hbFByb2JsZW1BbHJlYWR5SW5pdGlhbGl6ZWRBdHRlbXB0IHRvIHNldCBpbml0aWFsaXplciBvbiBmaWVsZCB3aXRob3V0IGluaXRpYWxpemVyLkludGVybmFsUHJvYmxlbUFscmVhZHlJbml0aWFsaXplZG1lc3NhZ2VJbnRlcm5hbFByb2JsZW1BbHJlYWR5SW5pdGlhbGl6ZWRjb2RlSW50ZXJuYWxQcm9ibGVtQm9keU9uQWJzdHJhY3RNZXRob2RBdHRlbXB0aW5nIHRvIHNldCBib2R5IG9uIGFic3RyYWN0IG1ldGhvZC5JbnRlcm5hbFByb2JsZW1Cb2R5T25BYnN0cmFjdE1ldGhvZG1lc3NhZ2VJbnRlcm5hbFByb2JsZW1Cb2R5T25BYnN0cmFjdE1ldGhvZHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtQ29uc3RydWN0b3JOb3RGb3VuZE5vIGNvbnN0cnVjdG9yIG5hbWVkICcjbmFtZScgaW4gJyN1cmknLmNvZGVJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kSW50ZXJuYWxQcm9ibGVtQ29uc3RydWN0b3JOb3RGb3VuZHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtQ29udGV4dFNldmVyaXR5Tm9uLWNvbnRleHQgbWVzc2FnZSBoYXMgY29udGV4dCBzZXZlcml0eTogI3N0cmluZ2NvZGVJbnRlcm5hbFByb2JsZW1Db250ZXh0U2V2ZXJpdHlJbnRlcm5hbFByb2JsZW1Db250ZXh0U2V2ZXJpdHl0ZW1wbGF0ZUludGVybmFsUHJvYmxlbURlYnVnQWJvcnRDb21waWxhdGlvbiBhYm9ydGVkIGR1ZSB0byBmYXRhbCAnI25hbWUnIGF0Ogojc3RyaW5nY29kZUludGVybmFsUHJvYmxlbURlYnVnQWJvcnRJbnRlcm5hbFByb2JsZW1EZWJ1Z0Fib3J0Y29kZUludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlQ2FuJ3QgZXh0ZW5kIGFuIHVubW9kaWZpYWJsZSBzY29wZS5JbnRlcm5hbFByb2JsZW1FeHRlbmRpbmdVbm1vZGlmaWFibGVTY29wZW1lc3NhZ2VJbnRlcm5hbFByb2JsZW1FeHRlbmRpbmdVbm1vZGlmaWFibGVTY29wZWNvZGVJbnRlcm5hbFByb2JsZW1MYWJlbFVzYWdlSW5WYXJpYWJsZXNEZWNsYXJhdGlvblVuZXhwZWN0ZWQgdXNhZ2Ugb2YgbGFiZWwgaW5zaWRlIGRlY2xhcmF0aW9uIG9mIHZhcmlhYmxlcy5JbnRlcm5hbFByb2JsZW1MYWJlbFVzYWdlSW5WYXJpYWJsZXNEZWNsYXJhdGlvbm1lc3NhZ2VJbnRlcm5hbFByb2JsZW1MYWJlbFVzYWdlSW5WYXJpYWJsZXNEZWNsYXJhdGlvbmNvZGVJbnRlcm5hbFByb2JsZW1NaXNzaW5nQ29udGV4dHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtTm9JbmZlcnJlZFR5cGVTdG9yZWRUaGVyZSdzIG5vIGluZmVycmVkIHR5cGUgZm9yICcjbmFtZScuY29kZUludGVybmFsUHJvYmxlbU5vSW5mZXJyZWRUeXBlU3RvcmVkSW50ZXJuYWxQcm9ibGVtTm9JbmZlcnJlZFR5cGVTdG9yZWR0ZW1wbGF0ZUludGVybmFsUHJvYmxlbU5vdEZvdW5kQ291bGRuJ3QgZmluZCAnI25hbWUnLmNvZGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEludGVybmFsUHJvYmxlbU5vdEZvdW5kdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluQ291bGRuJ3QgZmluZCAnI25hbWUnIGluICcjbmFtZTInLmNvZGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbmNvZGVJbnRlcm5hbFByb2JsZW1QcmV2aW91c1Rva2VuTm90Rm91bmRDb3VsZG4ndCBmaW5kIHByZXZpb3VzIHRva2VuLkludGVybmFsUHJvYmxlbVByZXZpb3VzVG9rZW5Ob3RGb3VuZG1lc3NhZ2VJbnRlcm5hbFByb2JsZW1QcmV2aW91c1Rva2VuTm90Rm91bmR0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVByaXZhdGVDb25zdHJ1Y3RvckFjY2Vzc0Nhbid0IGFjY2VzcyBwcml2YXRlIGNvbnN0cnVjdG9yICcjbmFtZScuY29kZUludGVybmFsUHJvYmxlbVByaXZhdGVDb25zdHJ1Y3RvckFjY2Vzc0ludGVybmFsUHJvYmxlbVByaXZhdGVDb25zdHJ1Y3RvckFjY2Vzc2NvZGVJbnRlcm5hbFByb2JsZW1Qcm92aWRlZEJvdGhDb21waWxlU2RrQW5kU2RrU3VtbWFyeXRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eSNuYW1lLnN0YWNrIGlzbid0IGVtcHR5OgogICNzdHJpbmdjb2RlSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eUludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHl0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVN0b3JpbmdNdWx0aXBsZUluZmVycmVkVHlwZXNUaGVyZSdzIGFscmVhZHkgYW4gaW5mZXJyZWQgdHlwZSwgJyN0eXBlJywgZm9yICcjbmFtZScuY29kZUludGVybmFsUHJvYmxlbVN0b3JpbmdNdWx0aXBsZUluZmVycmVkVHlwZXNJbnRlcm5hbFByb2JsZW1TdG9yaW5nTXVsdGlwbGVJbmZlcnJlZFR5cGVzdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkRXhwZWN0ZWQgJyNzdHJpbmcnLCBidXQgZ290ICcjc3RyaW5nMicuY29kZUludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWRJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWRVbmhhbmRsZWQgI3N0cmluZyBpbiAjc3RyaW5nMi5jb2RlSW50ZXJuYWxQcm9ibGVtVW5oYW5kbGVkSW50ZXJuYWxQcm9ibGVtVW5oYW5kbGVkdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkVW5pbXBsZW1lbnRlZCAjc3RyaW5nLmNvZGVJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkSW50ZXJuYWxQcm9ibGVtVW5pbXBsZW1lbnRlZGNvZGVJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZEludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VcmlNaXNzaW5nU2NoZW1lVGhlIFVSSSAnI3VyaScgaGFzIG5vIHNjaGVtZS5jb2RlSW50ZXJuYWxQcm9ibGVtVXJpTWlzc2luZ1NjaGVtZUludGVybmFsUHJvYmxlbVVyaU1pc3NpbmdTY2hlbWV0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVZlcmlmaWNhdGlvbkVycm9yVmVyaWZpY2F0aW9uIG9mIHRoZSBnZW5lcmF0ZWQgcHJvZ3JhbSBmYWlsZWQ6CiNzdHJpbmdjb2RlSW50ZXJuYWxQcm9ibGVtVmVyaWZpY2F0aW9uRXJyb3JJbnRlcm5hbFByb2JsZW1WZXJpZmljYXRpb25FcnJvcmNvZGVJbnRlcnBvbGF0aW9uSW5VcmlDYW4ndCB1c2Ugc3RyaW5nIGludGVycG9sYXRpb24gaW4gYSBVUkkuSW50ZXJwb2xhdGlvbkluVXJpSU5WQUxJRF9MSVRFUkFMX0lOX0NPTkZJR1VSQVRJT05tZXNzYWdlSW50ZXJwb2xhdGlvbkluVXJpdGVtcGxhdGVJbnRlcnNlY3Rpb25UeXBlQXNUeXBlQXJndW1lbnRDYW4ndCBpbmZlciBhIHR5cGUgZm9yICcjbmFtZScsIGl0IGNhbiBiZSBlaXRoZXIgJyN0eXBlJyBvciAnI3R5cGUyJy5UcnkgYWRkaW5nIGEgdHlwZSBhcmd1bWVudCBzZWxlY3Rpbmcgb25lIG9mIHRoZSBvcHRpb25zLmNvZGVJbnRlcnNlY3Rpb25UeXBlQXNUeXBlQXJndW1lbnRJbnRlcnNlY3Rpb25UeXBlQXNUeXBlQXJndW1lbnR0ZW1wbGF0ZUludmFsaWRBc3NpZ25tZW50VHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHRoZSBsZWZ0IGhhbmQgc2lkZSwgb3IgY2FzdGluZyB0aGUgcmlnaHQgaGFuZCBzaWRlIHRvICcjdHlwZTInLmNvZGVJbnZhbGlkQXNzaWdubWVudEludmFsaWRBc3NpZ25tZW50SU5WQUxJRF9BU1NJR05NRU5UY29kZUludmFsaWRBd2FpdEZvclRoZSBrZXl3b3JkICdhd2FpdCcgaXNuJ3QgYWxsb3dlZCBmb3IgYSBub3JtYWwgJ2Zvcicgc3RhdGVtZW50LlRyeSByZW1vdmluZyB0aGUga2V5d29yZCwgb3IgdXNlIGEgZm9yLWVhY2ggc3RhdGVtZW50LkludmFsaWRBd2FpdEZvcm1lc3NhZ2VJbnZhbGlkQXdhaXRGb3J0ZW1wbGF0ZUludmFsaWRCcmVha1RhcmdldENhbid0IGJyZWFrIHRvICcjbmFtZScuY29kZUludmFsaWRCcmVha1RhcmdldEludmFsaWRCcmVha1RhcmdldHRlbXBsYXRlSW52YWxpZENhc3RGdW5jdGlvbkV4cHJUaGUgZnVuY3Rpb24gZXhwcmVzc2lvbiB0eXBlICcjdHlwZScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy5DaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24gb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC5jb2RlSW52YWxpZENhc3RGdW5jdGlvbkV4cHJJbnZhbGlkQ2FzdEZ1bmN0aW9uRXhwcklOVkFMSURfQ0FTVF9GVU5DVElPTl9FWFBSdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxMaXN0VGhlIGxpc3QgbGl0ZXJhbCB0eXBlICcjdHlwZScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy5DaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGxpc3QgbGl0ZXJhbCBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLmNvZGVJbnZhbGlkQ2FzdExpdGVyYWxMaXN0SW52YWxpZENhc3RMaXRlcmFsTGlzdElOVkFMSURfQ0FTVF9MSVRFUkFMX0xJU1R0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbE1hcFRoZSBtYXAgbGl0ZXJhbCB0eXBlICcjdHlwZScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy5DaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIG1hcCBsaXRlcmFsIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuY29kZUludmFsaWRDYXN0TGl0ZXJhbE1hcEludmFsaWRDYXN0TGl0ZXJhbE1hcElOVkFMSURfQ0FTVF9MSVRFUkFMX01BUHRlbXBsYXRlSW52YWxpZENhc3RMaXRlcmFsU2V0VGhlIHNldCBsaXRlcmFsIHR5cGUgJyN0eXBlJyBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgc2V0IGxpdGVyYWwgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC5jb2RlSW52YWxpZENhc3RMaXRlcmFsU2V0SW52YWxpZENhc3RMaXRlcmFsU2V0SU5WQUxJRF9DQVNUX0xJVEVSQUxfU0VUdGVtcGxhdGVJbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb25UaGUgbG9jYWwgZnVuY3Rpb24gaGFzIHR5cGUgJyN0eXBlJyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLmNvZGVJbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb25JbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb25JTlZBTElEX0NBU1RfRlVOQ1RJT050ZW1wbGF0ZUludmFsaWRDYXN0TmV3RXhwclRoZSBjb25zdHJ1Y3RvciByZXR1cm5zIHR5cGUgJyN0eXBlJyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgY29uc3RydWN0ZWQgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC5jb2RlSW52YWxpZENhc3ROZXdFeHBySW52YWxpZENhc3ROZXdFeHBySU5WQUxJRF9DQVNUX05FV19FWFBSdGVtcGxhdGVJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZFRoZSBzdGF0aWMgbWV0aG9kIGhhcyB0eXBlICcjdHlwZScgdGhhdCBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgbWV0aG9kIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuY29kZUludmFsaWRDYXN0U3RhdGljTWV0aG9kSW52YWxpZENhc3RTdGF0aWNNZXRob2RJTlZBTElEX0NBU1RfTUVUSE9EdGVtcGxhdGVJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb25UaGUgdG9wIGxldmVsIGZ1bmN0aW9uIGhhcyB0eXBlICcjdHlwZScgdGhhdCBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLmNvZGVJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb25JbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb25jb2RlSW52YWxpZENhdGNoQXJndW1lbnRzSW52YWxpZCBjYXRjaCBhcmd1bWVudHMuSW52YWxpZENhdGNoQXJndW1lbnRzSU5WQUxJRF9DQVRDSF9BUkdVTUVOVFNtZXNzYWdlSW52YWxpZENhdGNoQXJndW1lbnRzY29kZUludmFsaWRDb2RlUG9pbnRUaGUgZXNjYXBlIHNlcXVlbmNlIHN0YXJ0aW5nIHdpdGggJ1x1JyBpc24ndCBhIHZhbGlkIGNvZGUgcG9pbnQuSW52YWxpZENvZGVQb2ludElOVkFMSURfQ09ERV9QT0lOVG1lc3NhZ2VJbnZhbGlkQ29kZVBvaW50dGVtcGxhdGVJbnZhbGlkQ29udGludWVUYXJnZXRDYW4ndCBjb250aW51ZSBhdCAnI25hbWUnLmNvZGVJbnZhbGlkQ29udGludWVUYXJnZXRJbnZhbGlkQ29udGludWVUYXJnZXRjb2RlSW52YWxpZEhleEVzY2FwZUFuIGVzY2FwZSBzZXF1ZW5jZSBzdGFydGluZyB3aXRoICdceCcgbXVzdCBiZSBmb2xsb3dlZCBieSAyIGhleGFkZWNpbWFsIGRpZ2l0cy5JbnZhbGlkSGV4RXNjYXBlbWVzc2FnZUludmFsaWRIZXhFc2NhcGVjb2RlSW52YWxpZEluaXRpYWxpemVyTm90IGEgdmFsaWQgaW5pdGlhbGl6ZXIuVG8gaW5pdGlhbGl6ZSBhIGZpZWxkLCB1c2UgdGhlIHN5bnRheCAnbmFtZSA9IHZhbHVlJy5tZXNzYWdlSW52YWxpZEluaXRpYWxpemVyY29kZUludmFsaWRJbmxpbmVGdW5jdGlvblR5cGVJbmxpbmUgZnVuY3Rpb24gdHlwZXMgY2Fubm90IGJlIHVzZWQgZm9yIHBhcmFtZXRlcnMgaW4gYSBnZW5lcmljIGZ1bmN0aW9uIHR5cGUuVHJ5IGNoYW5naW5nIHRoZSBpbmxpbmUgZnVuY3Rpb24gdHlwZSAoYXMgaW4gJ2ludCBmKCknKSB0byBhIHByZWZpeGVkIGZ1bmN0aW9uIHR5cGUgdXNpbmcgdGhlIGBGdW5jdGlvbmAga2V5d29yZCAoYXMgaW4gJ2ludCBGdW5jdGlvbigpIGYnKS5JbnZhbGlkSW5saW5lRnVuY3Rpb25UeXBlSU5WQUxJRF9JTkxJTkVfRlVOQ1RJT05fVFlQRW1lc3NhZ2VJbnZhbGlkSW5saW5lRnVuY3Rpb25UeXBldGVtcGxhdGVJbnZhbGlkT3BlcmF0b3JUaGUgc3RyaW5nICcjbGV4ZW1lJyBpc24ndCBhIHVzZXItZGVmaW5hYmxlIG9wZXJhdG9yLmNvZGVJbnZhbGlkT3BlcmF0b3JJbnZhbGlkT3BlcmF0b3J0ZW1wbGF0ZUludmFsaWRQYWNrYWdlVXJpSW52YWxpZCBwYWNrYWdlIFVSSSAnI3VyaSc6CiAgI3N0cmluZy5jb2RlSW52YWxpZFBhY2thZ2VVcmlJbnZhbGlkUGFja2FnZVVyaWNvZGVJbnZhbGlkU3VwZXJJbkluaXRpYWxpemVyQ2FuIG9ubHkgdXNlICdzdXBlcicgaW4gYW4gaW5pdGlhbGl6ZXIgZm9yIGNhbGxpbmcgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IgKGUuZy4gJ3N1cGVyKCknIG9yICdzdXBlci5uYW1lZENvbnN0cnVjdG9yKCknKUludmFsaWRTdXBlckluSW5pdGlhbGl6ZXJtZXNzYWdlSW52YWxpZFN1cGVySW5Jbml0aWFsaXplcmNvZGVJbnZhbGlkU3luY01vZGlmaWVySW52YWxpZCBtb2RpZmllciAnc3luYycuVHJ5IHJlcGxhY2luZyAnc3luYycgd2l0aCAnc3luYyonLkludmFsaWRTeW5jTW9kaWZpZXJNSVNTSU5HX1NUQVJfQUZURVJfU1lOQ21lc3NhZ2VJbnZhbGlkU3luY01vZGlmaWVyY29kZUludmFsaWRUaGlzSW5Jbml0aWFsaXplckNhbiBvbmx5IHVzZSAndGhpcycgaW4gYW4gaW5pdGlhbGl6ZXIgZm9yIGZpZWxkIGluaXRpYWxpemF0aW9uIChlLmcuICd0aGlzLnggPSBzb21ldGhpbmcnKSBhbmQgY29uc3RydWN0b3IgcmVkaXJlY3Rpb24gKGUuZy4gJ3RoaXMoKScgb3IgJ3RoaXMubmFtZWRDb25zdHJ1Y3RvcigpKUludmFsaWRUaGlzSW5Jbml0aWFsaXplcm1lc3NhZ2VJbnZhbGlkVGhpc0luSW5pdGlhbGl6ZXJjb2RlSW52YWxpZFVuaWNvZGVFc2NhcGVBbiBlc2NhcGUgc2VxdWVuY2Ugc3RhcnRpbmcgd2l0aCAnXHUnIG11c3QgYmUgZm9sbG93ZWQgYnkgNCBoZXhhZGVjaW1hbCBkaWdpdHMgb3IgZnJvbSAxIHRvIDYgZGlnaXRzIGJldHdlZW4gJ3snIGFuZCAnfScuSW52YWxpZFVuaWNvZGVFc2NhcGVtZXNzYWdlSW52YWxpZFVuaWNvZGVFc2NhcGVjb2RlSW52YWxpZFVzZU9mTnVsbEF3YXJlQWNjZXNzQ2Fubm90IHVzZSAnPy4nIGhlcmUuVHJ5IHVzaW5nICcuJy5JbnZhbGlkVXNlT2ZOdWxsQXdhcmVBY2Nlc3NJTlZBTElEX1VTRV9PRl9OVUxMX0FXQVJFX0FDQ0VTU21lc3NhZ2VJbnZhbGlkVXNlT2ZOdWxsQXdhcmVBY2Nlc3Njb2RlSW52YWxpZFZvaWRUeXBlICd2b2lkJyBjYW4ndCBiZSB1c2VkIGhlcmUgYmVjYXVzZSBpdCBpc24ndCBhIHJldHVybiB0eXBlLlRyeSByZW1vdmluZyAndm9pZCcga2V5d29yZCBvciByZXBsYWNlIGl0IHdpdGggJ3ZhcicsICdmaW5hbCcsIG9yIGEgdHlwZS5JbnZhbGlkVm9pZG1lc3NhZ2VJbnZhbGlkVm9pZHRlbXBsYXRlSW52b2tlTm9uRnVuY3Rpb24nI25hbWUnIGlzbid0IGEgZnVuY3Rpb24gb3IgbWV0aG9kIGFuZCBjYW4ndCBiZSBpbnZva2VkLmNvZGVJbnZva2VOb25GdW5jdGlvbkludm9rZU5vbkZ1bmN0aW9uSU5WT0NBVElPTl9PRl9OT05fRlVOQ1RJT050ZW1wbGF0ZUxhYmVsTm90Rm91bmRDYW4ndCBmaW5kIGxhYmVsICcjbmFtZScuVHJ5IGRlZmluaW5nIHRoZSBsYWJlbCwgb3IgY29ycmVjdGluZyB0aGUgbmFtZSB0byBtYXRjaCBhbiBleGlzdGluZyBsYWJlbC5jb2RlTGFiZWxOb3RGb3VuZExhYmVsTm90Rm91bmRjb2RlTGlicmFyeURpcmVjdGl2ZU5vdEZpcnN0VGhlIGxpYnJhcnkgZGlyZWN0aXZlIG11c3QgYXBwZWFyIGJlZm9yZSBhbGwgb3RoZXIgZGlyZWN0aXZlcy5UcnkgbW92aW5nIHRoZSBsaWJyYXJ5IGRpcmVjdGl2ZSBiZWZvcmUgYW55IG90aGVyIGRpcmVjdGl2ZXMuTGlicmFyeURpcmVjdGl2ZU5vdEZpcnN0bWVzc2FnZUxpYnJhcnlEaXJlY3RpdmVOb3RGaXJzdGNvZGVMaXN0TGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzTGlzdCBsaXRlcmFsIHJlcXVpcmVzIGV4YWN0bHkgb25lIHR5cGUgYXJndW1lbnQuTGlzdExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50c0VYUEVDVEVEX09ORV9MSVNUX1RZUEVfQVJHVU1FTlRTbWVzc2FnZUxpc3RMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHN0ZW1wbGF0ZUxvYWRMaWJyYXJ5SGlkZXNNZW1iZXJUaGUgbGlicmFyeSAnI3VyaScgZGVmaW5lcyBhIHRvcC1sZXZlbCBtZW1iZXIgbmFtZWQgJ2xvYWRMaWJyYXJ5Jy4gVGhpcyBtZW1iZXIgaXMgaGlkZGVuIGJ5IHRoZSBzcGVjaWFsIG1lbWJlciAnbG9hZExpYnJhcnknIHRoYXQgdGhlIGxhbmd1YWdlIGFkZHMgdG8gc3VwcG9ydCBkZWZlcnJlZCBsb2FkaW5nLlRyeSB0byByZW5hbWUgb3IgaGlkZSB0aGUgbWVtYmVyLmNvZGVMb2FkTGlicmFyeUhpZGVzTWVtYmVyTG9hZExpYnJhcnlIaWRlc01lbWJlcmNvZGVMb2FkTGlicmFyeVRha2VzTm9Bcmd1bWVudHMnbG9hZExpYnJhcnknIHRha2VzIG5vIGFyZ3VtZW50cy5Mb2FkTGlicmFyeVRha2VzTm9Bcmd1bWVudHNMT0FEX0xJQlJBUllfVEFLRVNfTk9fQVJHVU1FTlRTbWVzc2FnZUxvYWRMaWJyYXJ5VGFrZXNOb0FyZ3VtZW50c3RlbXBsYXRlTG9jYWxEZWZpbml0aW9uSGlkZXNFeHBvcnRMb2NhbCBkZWZpbml0aW9uIG9mICcjbmFtZScgaGlkZXMgZXhwb3J0IGZyb20gJyN1cmknLmNvZGVMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydExvY2FsRGVmaW5pdGlvbkhpZGVzRXhwb3J0dGVtcGxhdGVMb2NhbERlZmluaXRpb25IaWRlc0ltcG9ydExvY2FsIGRlZmluaXRpb24gb2YgJyNuYW1lJyBoaWRlcyBpbXBvcnQgZnJvbSAnI3VyaScuY29kZUxvY2FsRGVmaW5pdGlvbkhpZGVzSW1wb3J0TG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnRjb2RlTWFwTGl0ZXJhbFR5cGVBcmd1bWVudE1pc21hdGNoQSBtYXAgbGl0ZXJhbCByZXF1aXJlcyBleGFjdGx5IHR3byB0eXBlIGFyZ3VtZW50cy5NYXBMaXRlcmFsVHlwZUFyZ3VtZW50TWlzbWF0Y2hFWFBFQ1RFRF9UV09fTUFQX1RZUEVfQVJHVU1FTlRTbWVzc2FnZU1hcExpdGVyYWxUeXBlQXJndW1lbnRNaXNtYXRjaGNvZGVNZW1iZXJXaXRoU2FtZU5hbWVBc0NsYXNzQSBjbGFzcyBtZW1iZXIgY2FuJ3QgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSBlbmNsb3NpbmcgY2xhc3MuTWVtYmVyV2l0aFNhbWVOYW1lQXNDbGFzc21lc3NhZ2VNZW1iZXJXaXRoU2FtZU5hbWVBc0NsYXNzY29kZU1ldGFkYXRhVHlwZUFyZ3VtZW50c0FuIGFubm90YXRpb24gKG1ldGFkYXRhKSBjYW4ndCB1c2UgdHlwZSBhcmd1bWVudHMuTWV0YWRhdGFUeXBlQXJndW1lbnRzQU5OT1RBVElPTl9XSVRIX1RZUEVfQVJHVU1FTlRTbWVzc2FnZU1ldGFkYXRhVHlwZUFyZ3VtZW50c3RlbXBsYXRlTWV0aG9kTm90Rm91bmRNZXRob2Qgbm90IGZvdW5kOiAnI25hbWUnLmNvZGVNZXRob2ROb3RGb3VuZE1ldGhvZE5vdEZvdW5kVU5ERUZJTkVEX01FVEhPRGNvZGVNaXNzaW5nQXJndW1lbnRMaXN0Q29uc3RydWN0b3IgaW52b2NhdGlvbnMgbXVzdCBoYXZlIGFuIGFyZ3VtZW50IGxpc3QuTWlzc2luZ0FyZ3VtZW50TGlzdG1lc3NhZ2VNaXNzaW5nQXJndW1lbnRMaXN0Y29kZU1pc3NpbmdBc3NpZ25hYmxlU2VsZWN0b3JNaXNzaW5nIHNlbGVjdG9yIHN1Y2ggYXMgJy48aWRlbnRpZmllcj4nIG9yICdbMF0nLlRyeSBhZGRpbmcgYSBzZWxlY3Rvci5NaXNzaW5nQXNzaWduYWJsZVNlbGVjdG9ybWVzc2FnZU1pc3NpbmdBc3NpZ25hYmxlU2VsZWN0b3Jjb2RlTWlzc2luZ0Fzc2lnbm1lbnRJbkluaXRpYWxpemVyRXhwZWN0ZWQgYW4gYXNzaWdubWVudCBhZnRlciB0aGUgZmllbGQgbmFtZS5NaXNzaW5nQXNzaWdubWVudEluSW5pdGlhbGl6ZXJtZXNzYWdlTWlzc2luZ0Fzc2lnbm1lbnRJbkluaXRpYWxpemVyY29kZU1pc3NpbmdDb25zdEZpbmFsVmFyT3JUeXBlVmFyaWFibGVzIG11c3QgYmUgZGVjbGFyZWQgdXNpbmcgdGhlIGtleXdvcmRzICdjb25zdCcsICdmaW5hbCcsICd2YXInIG9yIGEgdHlwZSBuYW1lLlRyeSBhZGRpbmcgdGhlIG5hbWUgb2YgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIG9yIHRoZSBrZXl3b3JkICd2YXInLk1pc3NpbmdDb25zdEZpbmFsVmFyT3JUeXBlbWVzc2FnZU1pc3NpbmdDb25zdEZpbmFsVmFyT3JUeXBldGVtcGxhdGVNaXNzaW5nRXhwbGljaXRUeXBlQXJndW1lbnRzTm8gdHlwZSBhcmd1bWVudHMgcHJvdmlkZWQsICNjb3VudCBwb3NzaWJsZS5jb2RlTWlzc2luZ0V4cGxpY2l0VHlwZUFyZ3VtZW50c01pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHNjb2RlTWlzc2luZ0V4cG9uZW50TnVtYmVycyBpbiBleHBvbmVudGlhbCBub3RhdGlvbiBzaG91bGQgYWx3YXlzIGNvbnRhaW4gYW4gZXhwb25lbnQgKGFuIGludGVnZXIgbnVtYmVyIHdpdGggYW4gb3B0aW9uYWwgc2lnbikuTWFrZSBzdXJlIHRoZXJlIGlzIGFuIGV4cG9uZW50LCBhbmQgcmVtb3ZlIGFueSB3aGl0ZXNwYWNlIGJlZm9yZSBpdC5NaXNzaW5nRXhwb25lbnRNSVNTSU5HX0RJR0lUbWVzc2FnZU1pc3NpbmdFeHBvbmVudGNvZGVNaXNzaW5nRXhwcmVzc2lvbkluVGhyb3dNaXNzaW5nIGV4cHJlc3Npb24gYWZ0ZXIgJ3Rocm93Jy5BZGQgYW4gZXhwcmVzc2lvbiBhZnRlciAndGhyb3cnIG9yIHVzZSAncmV0aHJvdycgdG8gdGhyb3cgYSBjYXVnaHQgZXhjZXB0aW9uTWlzc2luZ0V4cHJlc3Npb25JblRocm93bWVzc2FnZU1pc3NpbmdFeHByZXNzaW9uSW5UaHJvd2NvZGVNaXNzaW5nRnVuY3Rpb25QYXJhbWV0ZXJzQSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBuZWVkcyBhbiBleHBsaWNpdCBsaXN0IG9mIHBhcmFtZXRlcnMuVHJ5IGFkZGluZyBhIHBhcmFtZXRlciBsaXN0IHRvIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbi5NaXNzaW5nRnVuY3Rpb25QYXJhbWV0ZXJzTUlTU0lOR19GVU5DVElPTl9QQVJBTUVURVJTbWVzc2FnZU1pc3NpbmdGdW5jdGlvblBhcmFtZXRlcnN0ZW1wbGF0ZU1pc3NpbmdJbXBsZW1lbnRhdGlvbkNhdXNlJyNuYW1lJyBpcyBkZWZpbmVkIGhlcmUuY29kZU1pc3NpbmdJbXBsZW1lbnRhdGlvbkNhdXNlTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2V0ZW1wbGF0ZU1pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0VGhlIG5vbi1hYnN0cmFjdCBjbGFzcyAnI25hbWUnIGlzIG1pc3NpbmcgaW1wbGVtZW50YXRpb25zIGZvciB0aGVzZSBtZW1iZXJzOgojbmFtZXNUcnkgdG8gZWl0aGVyCiAtIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24sCiAtIGluaGVyaXQgYW4gaW1wbGVtZW50YXRpb24gZnJvbSBhIHN1cGVyY2xhc3Mgb3IgbWl4aW4sCiAtIG1hcmsgdGhlIGNsYXNzIGFzIGFic3RyYWN0LCBvcgogLSBwcm92aWRlIGEgJ25vU3VjaE1ldGhvZCcgaW1wbGVtZW50YXRpb24uCmNvZGVNaXNzaW5nSW1wbGVtZW50YXRpb25Ob3RBYnN0cmFjdE1pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0Q09OQ1JFVEVfQ0xBU1NfV0lUSF9BQlNUUkFDVF9NRU1CRVJjb2RlTWlzc2luZ0lucHV0Y29kZU1pc3NpbmdNYWluY29kZU1pc3NpbmdNZXRob2RQYXJhbWV0ZXJzQSBtZXRob2QgZGVjbGFyYXRpb24gbmVlZHMgYW4gZXhwbGljaXQgbGlzdCBvZiBwYXJhbWV0ZXJzLlRyeSBhZGRpbmcgYSBwYXJhbWV0ZXIgbGlzdCB0byB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uLk1pc3NpbmdNZXRob2RQYXJhbWV0ZXJzTUlTU0lOR19NRVRIT0RfUEFSQU1FVEVSU21lc3NhZ2VNaXNzaW5nTWV0aG9kUGFyYW1ldGVyc2NvZGVNaXNzaW5nT3BlcmF0b3JLZXl3b3JkT3BlcmF0b3IgZGVjbGFyYXRpb25zIG11c3QgYmUgcHJlY2VkZWQgYnkgdGhlIGtleXdvcmQgJ29wZXJhdG9yJy5UcnkgYWRkaW5nIHRoZSBrZXl3b3JkICdvcGVyYXRvcicuTWlzc2luZ09wZXJhdG9yS2V5d29yZG1lc3NhZ2VNaXNzaW5nT3BlcmF0b3JLZXl3b3JkdGVtcGxhdGVNaXNzaW5nUGFydE9mQ2FuJ3QgdXNlICcjdXJpJyBhcyBhIHBhcnQsIGJlY2F1c2UgaXQgaGFzIG5vICdwYXJ0IG9mJyBkZWNsYXJhdGlvbi5jb2RlTWlzc2luZ1BhcnRPZk1pc3NpbmdQYXJ0T2ZQQVJUX09GX05PTl9QQVJUY29kZU1pc3NpbmdQcmVmaXhJbkRlZmVycmVkSW1wb3J0RGVmZXJyZWQgaW1wb3J0cyBzaG91bGQgaGF2ZSBhIHByZWZpeC5UcnkgYWRkaW5nIGEgcHJlZml4IHRvIHRoZSBpbXBvcnQuTWlzc2luZ1ByZWZpeEluRGVmZXJyZWRJbXBvcnRtZXNzYWdlTWlzc2luZ1ByZWZpeEluRGVmZXJyZWRJbXBvcnRjb2RlTWlzc2luZ1R5cGVkZWZQYXJhbWV0ZXJzQSB0eXBlZGVmIG5lZWRzIGFuIGV4cGxpY2l0IGxpc3Qgb2YgcGFyYW1ldGVycy5UcnkgYWRkaW5nIGEgcGFyYW1ldGVyIGxpc3QgdG8gdGhlIHR5cGVkZWYuTWlzc2luZ1R5cGVkZWZQYXJhbWV0ZXJzTUlTU0lOR19UWVBFREVGX1BBUkFNRVRFUlNtZXNzYWdlTWlzc2luZ1R5cGVkZWZQYXJhbWV0ZXJzdGVtcGxhdGVNaXhpbkFwcGxpY2F0aW9uSW5jb21wYXRpYmxlU3VwZXJ0eXBlJyN0eXBlJyBkb2Vzbid0IGltcGxlbWVudCAnI3R5cGUyJyBzbyBpdCBjYW4ndCBiZSB1c2VkIHdpdGggJyN0eXBlMycuY29kZU1peGluQXBwbGljYXRpb25JbmNvbXBhdGlibGVTdXBlcnR5cGVNaXhpbkFwcGxpY2F0aW9uSW5jb21wYXRpYmxlU3VwZXJ0eXBlTUlYSU5fQVBQTElDQVRJT05fTk9UX0lNUExFTUVOVEVEX0lOVEVSRkFDRXRlbXBsYXRlTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3NUeXBlIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIGluZmVycmVkIGZvciB0aGUgbWl4aW4gJyNuYW1lJyBiZWNhdXNlICcjbmFtZTInIGRvZXMgbm90IGltcGxlbWVudCB0aGUgbWl4aW4ncyBzdXBlcnR5cGUgY29uc3RyYWludCAnI3R5cGUnLmNvZGVNaXhpbkluZmVyZW5jZU5vTWF0Y2hpbmdDbGFzc01peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzTUlYSU5fSU5GRVJFTkNFX05PX1BPU1NJQkxFX1NVQlNUSVRVVElPTnRlbXBsYXRlTW9kaWZpZXJPdXRPZk9yZGVyVGhlIG1vZGlmaWVyICcjc3RyaW5nJyBzaG91bGQgYmUgYmVmb3JlIHRoZSBtb2RpZmllciAnI3N0cmluZzInLlRyeSByZS1vcmRlcmluZyB0aGUgbW9kaWZpZXJzLmNvZGVNb2RpZmllck91dE9mT3JkZXJNb2RpZmllck91dE9mT3JkZXJjb2RlTW9yZVRoYW5PbmVTdXBlck9yVGhpc0luaXRpYWxpemVyQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lICdzdXBlcicgb3IgJ3RoaXMnIGluaXRpYWxpemVyLk1vcmVUaGFuT25lU3VwZXJPclRoaXNJbml0aWFsaXplclNVUEVSX0lOX1JFRElSRUNUSU5HX0NPTlNUUlVDVE9SbWVzc2FnZU1vcmVUaGFuT25lU3VwZXJPclRoaXNJbml0aWFsaXplcmNvZGVNdWx0aXBsZUV4dGVuZHNFYWNoIGNsYXNzIGRlZmluaXRpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgZXh0ZW5kcyBjbGF1c2UuVHJ5IGNob29zaW5nIG9uZSBzdXBlcmNsYXNzIGFuZCBkZWZpbmUgeW91ciBjbGFzcyB0byBpbXBsZW1lbnQgKG9yIG1peCBpbikgdGhlIG90aGVycy5NdWx0aXBsZUV4dGVuZHNtZXNzYWdlTXVsdGlwbGVFeHRlbmRzY29kZU11bHRpcGxlSW1wbGVtZW50c0VhY2ggY2xhc3MgZGVmaW5pdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBpbXBsZW1lbnRzIGNsYXVzZS5UcnkgY29tYmluaW5nIGFsbCBvZiB0aGUgaW1wbGVtZW50cyBjbGF1c2VzIGludG8gYSBzaW5nbGUgY2xhdXNlLk11bHRpcGxlSW1wbGVtZW50c01VTFRJUExFX0lNUExFTUVOVFNfQ0xBVVNFU21lc3NhZ2VNdWx0aXBsZUltcGxlbWVudHNjb2RlTXVsdGlwbGVMaWJyYXJ5RGlyZWN0aXZlc09ubHkgb25lIGxpYnJhcnkgZGlyZWN0aXZlIG1heSBiZSBkZWNsYXJlZCBpbiBhIGZpbGUuVHJ5IHJlbW92aW5nIGFsbCBidXQgb25lIG9mIHRoZSBsaWJyYXJ5IGRpcmVjdGl2ZXMuTXVsdGlwbGVMaWJyYXJ5RGlyZWN0aXZlc21lc3NhZ2VNdWx0aXBsZUxpYnJhcnlEaXJlY3RpdmVzY29kZU11bHRpcGxlT25DbGF1c2VzRWFjaCBtaXhpbiBkZWZpbml0aW9uIGNhbiBoYXZlIGF0IG1vc3Qgb25lIG9uIGNsYXVzZS5UcnkgY29tYmluaW5nIGFsbCBvZiB0aGUgb24gY2xhdXNlcyBpbnRvIGEgc2luZ2xlIGNsYXVzZS5NdWx0aXBsZU9uQ2xhdXNlc21lc3NhZ2VNdWx0aXBsZU9uQ2xhdXNlc2NvZGVNdWx0aXBsZVdpdGhFYWNoIGNsYXNzIGRlZmluaXRpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgd2l0aCBjbGF1c2UuVHJ5IGNvbWJpbmluZyBhbGwgb2YgdGhlIHdpdGggY2xhdXNlcyBpbnRvIGEgc2luZ2xlIGNsYXVzZS5NdWx0aXBsZVdpdGhtZXNzYWdlTXVsdGlwbGVXaXRoY29kZU5hbWVkRnVuY3Rpb25FeHByZXNzaW9uQSBmdW5jdGlvbiBleHByZXNzaW9uIGNhbid0IGhhdmUgYSBuYW1lLk5hbWVkRnVuY3Rpb25FeHByZXNzaW9uTkFNRURfRlVOQ1RJT05fRVhQUkVTU0lPTm1lc3NhZ2VOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbnRlbXBsYXRlTmFtZWRNaXhpbk92ZXJyaWRlQ29udGV4dE92ZXJyaWRlIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBtaXhpbiBhcHBsaWNhdGlvbiBjbGFzcyAnI25hbWUnLmNvZGVOYW1lZE1peGluT3ZlcnJpZGVDb250ZXh0TmFtZWRNaXhpbk92ZXJyaWRlQ29udGV4dGNvZGVOYXRpdmVDbGF1c2VTaG91bGRCZUFubm90YXRpb25OYXRpdmUgY2xhdXNlIGluIHRoaXMgZm9ybSBpcyBkZXByZWNhdGVkLlRyeSByZW1vdmluZyB0aGlzIG5hdGl2ZSBjbGF1c2UgYW5kIGFkZGluZyBAbmF0aXZlKCkgb3IgQG5hdGl2ZSgnbmF0aXZlLW5hbWUnKSBiZWZvcmUgdGhlIGRlY2xhcmF0aW9uLk5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbm1lc3NhZ2VOYXRpdmVDbGF1c2VTaG91bGRCZUFubm90YXRpb250ZW1wbGF0ZU5vRm9ybWFsc0EgZnVuY3Rpb24gc2hvdWxkIGhhdmUgZm9ybWFsIHBhcmFtZXRlcnMuVHJ5IGFkZGluZyAnKCknIGFmdGVyICcjbGV4ZW1lJywgb3IgYWRkICdnZXQnIGJlZm9yZSAnI2xleGVtZScgdG8gZGVjbGFyZSBhIGdldHRlci5jb2RlTm9Gb3JtYWxzTm9Gb3JtYWxzdGVtcGxhdGVOb1N1Y2hOYW1lZFBhcmFtZXRlck5vIG5hbWVkIHBhcmFtZXRlciB3aXRoIHRoZSBuYW1lICcjbmFtZScuY29kZU5vU3VjaE5hbWVkUGFyYW1ldGVyTm9TdWNoTmFtZWRQYXJhbWV0ZXJVTkRFRklORURfTkFNRURfUEFSQU1FVEVSY29kZU5vVW5uYW1lZENvbnN0cnVjdG9ySW5PYmplY3QnT2JqZWN0JyBoYXMgbm8gdW5uYW1lZCBjb25zdHJ1Y3Rvci5Ob1VubmFtZWRDb25zdHJ1Y3RvckluT2JqZWN0bWVzc2FnZU5vVW5uYW1lZENvbnN0cnVjdG9ySW5PYmplY3R0ZW1wbGF0ZU5vbkFzY2lpSWRlbnRpZmllclRoZSBub24tQVNDSUkgY2hhcmFjdGVyICcjY2hhcmFjdGVyJyAoI3VuaWNvZGUpIGNhbid0IGJlIHVzZWQgaW4gaWRlbnRpZmllcnMsIG9ubHkgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMuVHJ5IHVzaW5nIGFuIFVTLUFTQ0lJIGxldHRlciwgYSBkaWdpdCwgJ18nIChhbiB1bmRlcnNjb3JlKSwgb3IgJyQnIChhIGRvbGxhciBzaWduKS5jb2RlTm9uQXNjaWlJZGVudGlmaWVyTm9uQXNjaWlJZGVudGlmaWVydGVtcGxhdGVOb25Bc2NpaVdoaXRlc3BhY2VUaGUgbm9uLUFTQ0lJIHNwYWNlIGNoYXJhY3RlciAjdW5pY29kZSBjYW4gb25seSBiZSB1c2VkIGluIHN0cmluZ3MgYW5kIGNvbW1lbnRzLmNvZGVOb25Bc2NpaVdoaXRlc3BhY2VOb25Bc2NpaVdoaXRlc3BhY2Vjb2RlTm9uQ29uc3RDb25zdHJ1Y3RvckNhbm5vdCBpbnZva2UgYSBub24tJ2NvbnN0JyBjb25zdHJ1Y3RvciB3aGVyZSBhIGNvbnN0IGV4cHJlc3Npb24gaXMgZXhwZWN0ZWQuVHJ5IHVzaW5nIGEgY29uc3RydWN0b3Igb3IgZmFjdG9yeSB0aGF0IGlzICdjb25zdCcuTm9uQ29uc3RDb25zdHJ1Y3Rvcm1lc3NhZ2VOb25Db25zdENvbnN0cnVjdG9yY29kZU5vbkNvbnN0RmFjdG9yeUNhbm5vdCBpbnZva2UgYSBub24tJ2NvbnN0JyBmYWN0b3J5IHdoZXJlIGEgY29uc3QgZXhwcmVzc2lvbiBpcyBleHBlY3RlZC5Ob25Db25zdEZhY3RvcnltZXNzYWdlTm9uQ29uc3RGYWN0b3J5Y29kZU5vbkluc3RhbmNlVHlwZVZhcmlhYmxlVXNlQ2FuIG9ubHkgdXNlIHR5cGUgdmFyaWFibGVzIGluIGluc3RhbmNlIG1ldGhvZHMuTm9uSW5zdGFuY2VUeXBlVmFyaWFibGVVc2VUWVBFX1BBUkFNRVRFUl9SRUZFUkVOQ0VEX0JZX1NUQVRJQ21lc3NhZ2VOb25JbnN0YW5jZVR5cGVWYXJpYWJsZVVzZWNvZGVOb25OdWxsQXdhcmVTcHJlYWRJc051bGxDYW4ndCBzcHJlYWQgYSB2YWx1ZSB3aXRoIHN0YXRpYyB0eXBlIE51bGwuTm9uTnVsbEF3YXJlU3ByZWFkSXNOdWxsbWVzc2FnZU5vbk51bGxBd2FyZVNwcmVhZElzTnVsbGNvZGVOb25QYXJ0T2ZEaXJlY3RpdmVJblBhcnRUaGUgcGFydC1vZiBkaXJlY3RpdmUgbXVzdCBiZSB0aGUgb25seSBkaXJlY3RpdmUgaW4gYSBwYXJ0LlRyeSByZW1vdmluZyB0aGUgb3RoZXIgZGlyZWN0aXZlcywgb3IgbW92aW5nIHRoZW0gdG8gdGhlIGxpYnJhcnkgZm9yIHdoaWNoIHRoaXMgaXMgYSBwYXJ0Lk5vblBhcnRPZkRpcmVjdGl2ZUluUGFydE5PTl9QQVJUX09GX0RJUkVDVElWRV9JTl9QQVJUbWVzc2FnZU5vblBhcnRPZkRpcmVjdGl2ZUluUGFydHRlbXBsYXRlTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2VCb3VuZCBvZiB0aGlzIHZhcmlhYmxlIHJlZmVyZW5jZXMgcmF3IHR5cGUgJyNuYW1lJy5jb2RlTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2VOb25TaW1wbGVCb3VuZFZpYVJlZmVyZW5jZXRlbXBsYXRlTm9uU2ltcGxlQm91bmRWaWFWYXJpYWJsZUJvdW5kIG9mIHRoaXMgdmFyaWFibGUgcmVmZXJlbmNlcyB2YXJpYWJsZSAnI25hbWUnIGZyb20gdGhlIHNhbWUgZGVjbGFyYXRpb24uY29kZU5vblNpbXBsZUJvdW5kVmlhVmFyaWFibGVOb25TaW1wbGVCb3VuZFZpYVZhcmlhYmxlY29kZU5vdEFDb25zdGFudEV4cHJlc3Npb25Ob3QgYSBjb25zdGFudCBleHByZXNzaW9uLk5vdEFDb25zdGFudEV4cHJlc3Npb25tZXNzYWdlTm90QUNvbnN0YW50RXhwcmVzc2lvbnRlbXBsYXRlTm90QVByZWZpeEluVHlwZUFubm90YXRpb24nI25hbWUuI25hbWUyJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBiZWNhdXNlICcjbmFtZScgZG9lc24ndCByZWZlciB0byBhbiBpbXBvcnQgcHJlZml4LmNvZGVOb3RBUHJlZml4SW5UeXBlQW5ub3RhdGlvbk5vdEFQcmVmaXhJblR5cGVBbm5vdGF0aW9uTk9UX0FfVFlQRXRlbXBsYXRlTm90QVR5cGUnI25hbWUnIGlzbid0IGEgdHlwZS5jb2RlTm90QVR5cGVOb3RBVHlwZWNvZGVOb3RBVHlwZUNvbnRleHRUaGlzIGlzbid0IGEgdHlwZS5Ob3RBVHlwZUNvbnRleHRtZXNzYWdlTm90QVR5cGVDb250ZXh0Y29kZU5vdEFuTHZhbHVlQ2FuJ3QgYXNzaWduIHRvIHRoaXMuTm90QW5MdmFsdWVtZXNzYWdlTm90QW5MdmFsdWV0ZW1wbGF0ZU5vdEJpbmFyeU9wZXJhdG9yJyNsZXhlbWUnIGlzbid0IGEgYmluYXJ5IG9wZXJhdG9yLmNvZGVOb3RCaW5hcnlPcGVyYXRvck5vdEJpbmFyeU9wZXJhdG9ydGVtcGxhdGVOb3RDb25zdGFudEV4cHJlc3Npb24jc3RyaW5nIGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24uY29kZU5vdENvbnN0YW50RXhwcmVzc2lvbk5vdENvbnN0YW50RXhwcmVzc2lvbmNvZGVPYmplY3RFeHRlbmRzVGhlIGNsYXNzICdPYmplY3QnIGNhbid0IGhhdmUgYSBzdXBlcmNsYXNzLk9iamVjdEV4dGVuZHNtZXNzYWdlT2JqZWN0RXh0ZW5kc2NvZGVPYmplY3RJbXBsZW1lbnRzVGhlIGNsYXNzICdPYmplY3QnIGNhbid0IGltcGxlbWVudCBhbnl0aGluZy5PYmplY3RJbXBsZW1lbnRzbWVzc2FnZU9iamVjdEltcGxlbWVudHNjb2RlT2JqZWN0TWl4ZXNJblRoZSBjbGFzcyAnT2JqZWN0JyBjYW4ndCB1c2UgbWl4aW5zLk9iamVjdE1peGVzSW5tZXNzYWdlT2JqZWN0TWl4ZXNJbmNvZGVPbmx5VHJ5QSB0cnkgYmxvY2sgbXVzdCBiZSBmb2xsb3dlZCBieSBhbiAnb24nLCAnY2F0Y2gnLCBvciAnZmluYWxseScgY2xhdXNlLlRyeSBhZGRpbmcgZWl0aGVyIGEgY2F0Y2ggb3IgZmluYWxseSBjbGF1c2UsIG9yIHJlbW92ZSB0aGUgdHJ5IHN0YXRlbWVudC5Pbmx5VHJ5bWVzc2FnZU9ubHlUcnl0ZW1wbGF0ZU9wZXJhdG9yTWludXNQYXJhbWV0ZXJNaXNtYXRjaE9wZXJhdG9yICcjbmFtZScgc2hvdWxkIGhhdmUgemVybyBvciBvbmUgcGFyYW1ldGVyLldpdGggemVybyBwYXJhbWV0ZXJzLCBpdCBoYXMgdGhlIHN5bnRhY3RpYyBmb3JtICctYScsIGZvcm1hbGx5IGtub3duIGFzICd1bmFyeS0nLiBXaXRoIG9uZSBwYXJhbWV0ZXIsIGl0IGhhcyB0aGUgc3ludGFjdGljIGZvcm0gJ2EgLSBiJywgZm9ybWFsbHkga25vd24gYXMgJy0nLmNvZGVPcGVyYXRvck1pbnVzUGFyYW1ldGVyTWlzbWF0Y2hPcGVyYXRvck1pbnVzUGFyYW1ldGVyTWlzbWF0Y2hXUk9OR19OVU1CRVJfT0ZfUEFSQU1FVEVSU19GT1JfT1BFUkFUT1JfTUlOVVN0ZW1wbGF0ZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gwT3BlcmF0b3IgJyNuYW1lJyBzaG91bGRuJ3QgaGF2ZSBhbnkgcGFyYW1ldGVycy5jb2RlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDBPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMHRlbXBsYXRlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDFPcGVyYXRvciAnI25hbWUnIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlci5jb2RlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDFPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMVdST05HX05VTUJFUl9PRl9QQVJBTUVURVJTX0ZPUl9PUEVSQVRPUnRlbXBsYXRlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDJPcGVyYXRvciAnI25hbWUnIHNob3VsZCBoYXZlIGV4YWN0bHkgdHdvIHBhcmFtZXRlcnMuY29kZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gyT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDJjb2RlT3BlcmF0b3JXaXRoT3B0aW9uYWxGb3JtYWxzQW4gb3BlcmF0b3IgY2FuJ3QgaGF2ZSBvcHRpb25hbCBwYXJhbWV0ZXJzLk9wZXJhdG9yV2l0aE9wdGlvbmFsRm9ybWFsc21lc3NhZ2VPcGVyYXRvcldpdGhPcHRpb25hbEZvcm1hbHN0ZW1wbGF0ZU92ZXJyaWRkZW5NZXRob2RDYXVzZVRoaXMgaXMgdGhlIG92ZXJyaWRkZW4gbWV0aG9kICgnI25hbWUnKS5jb2RlT3ZlcnJpZGRlbk1ldGhvZENhdXNlT3ZlcnJpZGRlbk1ldGhvZENhdXNldGVtcGxhdGVPdmVycmlkZUZld2VyTmFtZWRBcmd1bWVudHNUaGUgbWV0aG9kICcjbmFtZScgaGFzIGZld2VyIG5hbWVkIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICcjbmFtZTInLmNvZGVPdmVycmlkZUZld2VyTmFtZWRBcmd1bWVudHNPdmVycmlkZUZld2VyTmFtZWRBcmd1bWVudHNJTlZBTElEX09WRVJSSURFX05BTUVEdGVtcGxhdGVPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50c1RoZSBtZXRob2QgJyNuYW1lJyBoYXMgZmV3ZXIgcG9zaXRpb25hbCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnI25hbWUyJy5jb2RlT3ZlcnJpZGVGZXdlclBvc2l0aW9uYWxBcmd1bWVudHNPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50c0lOVkFMSURfT1ZFUlJJREVfUE9TSVRJT05BTHRlbXBsYXRlT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVyVGhlIG1ldGhvZCAnI25hbWUnIGRvZXNuJ3QgaGF2ZSB0aGUgbmFtZWQgcGFyYW1ldGVyICcjbmFtZTInIG9mIG92ZXJyaWRkZW4gbWV0aG9kICcjbmFtZTMnLmNvZGVPdmVycmlkZU1pc21hdGNoTmFtZWRQYXJhbWV0ZXJPdmVycmlkZU1pc21hdGNoTmFtZWRQYXJhbWV0ZXJ0ZW1wbGF0ZU92ZXJyaWRlTW9yZVJlcXVpcmVkQXJndW1lbnRzVGhlIG1ldGhvZCAnI25hbWUnIGhhcyBtb3JlIHJlcXVpcmVkIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICcjbmFtZTInLmNvZGVPdmVycmlkZU1vcmVSZXF1aXJlZEFyZ3VtZW50c092ZXJyaWRlTW9yZVJlcXVpcmVkQXJndW1lbnRzSU5WQUxJRF9PVkVSUklERV9SRVFVSVJFRHRlbXBsYXRlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hQYXJhbWV0ZXJUaGUgcGFyYW1ldGVyICcjbmFtZScgb2YgdGhlIG1ldGhvZCAnI25hbWUyJyBoYXMgdHlwZSAnI3R5cGUnLCB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyB0eXBlLCAnI3R5cGUyJywgaW4gdGhlIG92ZXJyaWRkZW4gbWV0aG9kLCAnI25hbWUzJy5DaGFuZ2UgdG8gYSBzdXBlcnR5cGUgb2YgJyN0eXBlMicsIG9yLCBmb3IgYSBjb3ZhcmlhbnQgcGFyYW1ldGVyLCBhIHN1YnR5cGUuY29kZU92ZXJyaWRlVHlwZU1pc21hdGNoUGFyYW1ldGVyT3ZlcnJpZGVUeXBlTWlzbWF0Y2hQYXJhbWV0ZXJ0ZW1wbGF0ZU92ZXJyaWRlVHlwZU1pc21hdGNoUmV0dXJuVHlwZVRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kICcjbmFtZScgaXMgJyN0eXBlJywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCAnI3R5cGUyJywgb2YgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLCAnI25hbWUyJy5DaGFuZ2UgdG8gYSBzdWJ0eXBlIG9mICcjdHlwZTInLmNvZGVPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGVPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGV0ZW1wbGF0ZU92ZXJyaWRlVHlwZVZhcmlhYmxlc01pc21hdGNoRGVjbGFyZWQgdHlwZSB2YXJpYWJsZXMgb2YgJyNuYW1lJyBkb2Vzbid0IG1hdGNoIHRob3NlIG9uIG92ZXJyaWRkZW4gbWV0aG9kICcjbmFtZTInLmNvZGVPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaE92ZXJyaWRlVHlwZVZhcmlhYmxlc01pc21hdGNoSU5WQUxJRF9NRVRIT0RfT1ZFUlJJREVfVFlQRV9QQVJBTUVURVJTdGVtcGxhdGVQYWNrYWdlTm90Rm91bmRDb3VsZCBub3QgcmVzb2x2ZSB0aGUgcGFja2FnZSAnI25hbWUnIGluICcjdXJpJy5jb2RlUGFja2FnZU5vdEZvdW5kUGFja2FnZU5vdEZvdW5kY29kZVBhY2thZ2VzRmlsZUZvcm1hdFBhY2thZ2VzRmlsZUZvcm1hdGNvZGVQYXJ0RXhwb3J0Q2FuJ3QgZXhwb3J0IHRoaXMgZmlsZSBiZWNhdXNlIGl0IGNvbnRhaW5zIGEgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLlBhcnRFeHBvcnRFWFBPUlRfT0ZfTk9OX0xJQlJBUlltZXNzYWdlUGFydEV4cG9ydGNvZGVQYXJ0RXhwb3J0Q29udGV4dFRoaXMgaXMgdGhlIGZpbGUgdGhhdCBjYW4ndCBiZSBleHBvcnRlZC5QYXJ0RXhwb3J0Q29udGV4dG1lc3NhZ2VQYXJ0RXhwb3J0Q29udGV4dGNvZGVQYXJ0SW5QYXJ0QSBmaWxlIHRoYXQncyBhIHBhcnQgb2YgYSBsaWJyYXJ5IGNhbid0IGhhdmUgcGFydHMgaXRzZWxmLlRyeSBtb3ZpbmcgdGhlICdwYXJ0JyBkZWNsYXJhdGlvbiB0byB0aGUgY29udGFpbmluZyBsaWJyYXJ5LlBhcnRJblBhcnRtZXNzYWdlUGFydEluUGFydGNvZGVQYXJ0SW5QYXJ0TGlicmFyeUNvbnRleHRUaGlzIGlzIHRoZSBjb250YWluaW5nIGxpYnJhcnkuUGFydEluUGFydExpYnJhcnlDb250ZXh0bWVzc2FnZVBhcnRJblBhcnRMaWJyYXJ5Q29udGV4dHRlbXBsYXRlUGFydE9mSW5MaWJyYXJ5Q2FuJ3QgaW1wb3J0ICcjdXJpJywgYmVjYXVzZSBpdCBoYXMgYSAncGFydCBvZicgZGVjbGFyYXRpb24uVHJ5IHJlbW92aW5nIHRoZSAncGFydCBvZicgZGVjbGFyYXRpb24sIG9yIHVzaW5nICcjdXJpJyBhcyBhIHBhcnQuY29kZVBhcnRPZkluTGlicmFyeVBhcnRPZkluTGlicmFyeUlNUE9SVF9PRl9OT05fTElCUkFSWXRlbXBsYXRlUGFydE9mTGlicmFyeU5hbWVNaXNtYXRjaFVzaW5nICcjdXJpJyBhcyBwYXJ0IG9mICcjbmFtZScgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnI25hbWUyJy5jb2RlUGFydE9mTGlicmFyeU5hbWVNaXNtYXRjaFBhcnRPZkxpYnJhcnlOYW1lTWlzbWF0Y2hQQVJUX09GX0RJRkZFUkVOVF9MSUJSQVJZY29kZVBhcnRPZlNlbGZBIGZpbGUgY2FuJ3QgYmUgYSBwYXJ0IG9mIGl0c2VsZi5QYXJ0T2ZTZWxmbWVzc2FnZVBhcnRPZlNlbGZjb2RlUGFydE9mVHdpY2VPbmx5IG9uZSBwYXJ0LW9mIGRpcmVjdGl2ZSBtYXkgYmUgZGVjbGFyZWQgaW4gYSBmaWxlLlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSBvZiB0aGUgcGFydC1vZiBkaXJlY3RpdmVzLlBhcnRPZlR3aWNlbWVzc2FnZVBhcnRPZlR3aWNlY29kZVBhcnRPZlR3b0xpYnJhcmllc0EgZmlsZSBjYW4ndCBiZSBwYXJ0IG9mIG1vcmUgdGhhbiBvbmUgbGlicmFyeS5UcnkgbW92aW5nIHRoZSBzaGFyZWQgZGVjbGFyYXRpb25zIGludG8gdGhlIGxpYnJhcmllcywgb3IgaW50byBhIG5ldyBsaWJyYXJ5LlBhcnRPZlR3b0xpYnJhcmllc21lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXNjb2RlUGFydE9mVHdvTGlicmFyaWVzQ29udGV4dFVzZWQgYXMgYSBwYXJ0IGluIHRoaXMgbGlicmFyeS5QYXJ0T2ZUd29MaWJyYXJpZXNDb250ZXh0bWVzc2FnZVBhcnRPZlR3b0xpYnJhcmllc0NvbnRleHR0ZW1wbGF0ZVBhcnRPZlVyaU1pc21hdGNoVXNpbmcgJyN1cmknIGFzIHBhcnQgb2YgJyN1cmkyJyBidXQgaXRzICdwYXJ0IG9mJyBkZWNsYXJhdGlvbiBzYXlzICcjdXJpMycuY29kZVBhcnRPZlVyaU1pc21hdGNoUGFydE9mVXJpTWlzbWF0Y2h0ZW1wbGF0ZVBhcnRPZlVzZVVyaVVzaW5nICcjdXJpJyBhcyBwYXJ0IG9mICcjdXJpMicgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnI25hbWUnLlRyeSBjaGFuZ2luZyB0aGUgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uIHRvIHVzZSBhIHJlbGF0aXZlIGZpbGUgbmFtZS5jb2RlUGFydE9mVXNlVXJpUGFydE9mVXNlVXJpUEFSVF9PRl9VTk5BTUVEX0xJQlJBUlljb2RlUGFydE9ycGhhblRoaXMgcGFydCBkb2Vzbid0IGhhdmUgYSBjb250YWluaW5nIGxpYnJhcnkuVHJ5IHJlbW92aW5nIHRoZSAncGFydCBvZicgZGVjbGFyYXRpb24uUGFydE9ycGhhbm1lc3NhZ2VQYXJ0T3JwaGFudGVtcGxhdGVQYXJ0VHdpY2VDYW4ndCB1c2UgJyN1cmknIGFzIGEgcGFydCBtb3JlIHRoYW4gb25jZS5jb2RlUGFydFR3aWNlUGFydFR3aWNlRFVQTElDQVRFX1BBUlRjb2RlUGF0Y2hDbGFzc09yaWdpblRoaXMgaXMgdGhlIG9yaWdpbiBjbGFzcy5QYXRjaENsYXNzT3JpZ2lubWVzc2FnZVBhdGNoQ2xhc3NPcmlnaW5jb2RlUGF0Y2hDbGFzc1R5cGVWYXJpYWJsZXNNaXNtYXRjaEEgcGF0Y2ggY2xhc3MgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiB0eXBlIHZhcmlhYmxlcyBhcyBpdHMgb3JpZ2luIGNsYXNzLlBhdGNoQ2xhc3NUeXBlVmFyaWFibGVzTWlzbWF0Y2htZXNzYWdlUGF0Y2hDbGFzc1R5cGVWYXJpYWJsZXNNaXNtYXRjaGNvZGVQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2hUaGlzIHBhdGNoIGRvZXNuJ3QgbWF0Y2ggb3JpZ2luIGRlY2xhcmF0aW9uLlBhdGNoRGVjbGFyYXRpb25NaXNtYXRjaG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2hjb2RlUGF0Y2hEZWNsYXJhdGlvbk9yaWdpblRoaXMgaXMgdGhlIG9yaWdpbiBkZWNsYXJhdGlvbi5QYXRjaERlY2xhcmF0aW9uT3JpZ2lubWVzc2FnZVBhdGNoRGVjbGFyYXRpb25PcmlnaW50ZW1wbGF0ZVBhdGNoSW5qZWN0aW9uRmFpbGVkQ2FuJ3QgaW5qZWN0ICcjbmFtZScgaW50byAnI3VyaScuVHJ5IGFkZGluZyAnQHBhdGNoJy5jb2RlUGF0Y2hJbmplY3Rpb25GYWlsZWRQYXRjaEluamVjdGlvbkZhaWxlZGNvZGVQYXRjaE5vbkV4dGVybmFsQ2FuJ3QgYXBwbHkgdGhpcyBwYXRjaCBhcyBpdHMgb3JpZ2luIGRlY2xhcmF0aW9uIGlzbid0IGV4dGVybmFsLlRyeSBhZGRpbmcgJ2V4dGVybmFsJyB0byB0aGUgb3JpZ2luIGRlY2xhcmF0aW9uLlBhdGNoTm9uRXh0ZXJuYWxtZXNzYWdlUGF0Y2hOb25FeHRlcm5hbGNvZGVQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzQ2FuJ3QgYWNjZXNzIHBsYXRmb3JtIHByaXZhdGUgbGlicmFyeS5QbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzSU1QT1JUX0lOVEVSTkFMX0xJQlJBUlltZXNzYWdlUGxhdGZvcm1Qcml2YXRlTGlicmFyeUFjY2Vzc2NvZGVQb3NpdGlvbmFsQWZ0ZXJOYW1lZEFyZ3VtZW50UGxhY2UgcG9zaXRpb25hbCBhcmd1bWVudHMgYmVmb3JlIG5hbWVkIGFyZ3VtZW50cy5UcnkgbW92aW5nIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IGJlZm9yZSB0aGUgbmFtZWQgYXJndW1lbnRzLCBvciBhZGQgYSBuYW1lIHRvIHRoZSBhcmd1bWVudC5Qb3NpdGlvbmFsQWZ0ZXJOYW1lZEFyZ3VtZW50UE9TSVRJT05BTF9BRlRFUl9OQU1FRF9BUkdVTUVOVG1lc3NhZ2VQb3NpdGlvbmFsQWZ0ZXJOYW1lZEFyZ3VtZW50Y29kZVBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzUG9zaXRpb25hbCBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbid0IHVzZSAnOicgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUuVHJ5IHJlcGxhY2luZyAnOicgd2l0aCAnPScuUG9zaXRpb25hbFBhcmFtZXRlcldpdGhFcXVhbHNXUk9OR19TRVBBUkFUT1JfRk9SX1BPU0lUSU9OQUxfUEFSQU1FVEVSbWVzc2FnZVBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzY29kZVByZWZpeEFmdGVyQ29tYmluYXRvclRoZSBwcmVmaXggKCdhcycgY2xhdXNlKSBzaG91bGQgY29tZSBiZWZvcmUgYW55IHNob3cvaGlkZSBjb21iaW5hdG9ycy5UcnkgbW92aW5nIHRoZSBwcmVmaXggYmVmb3JlIHRoZSBjb21iaW5hdG9ycy5QcmVmaXhBZnRlckNvbWJpbmF0b3JtZXNzYWdlUHJlZml4QWZ0ZXJDb21iaW5hdG9yY29kZVByaXZhdGVOYW1lZFBhcmFtZXRlckFuIG9wdGlvbmFsIG5hbWVkIHBhcmFtZXRlciBjYW4ndCBzdGFydCB3aXRoICdfJy5Qcml2YXRlTmFtZWRQYXJhbWV0ZXJQUklWQVRFX09QVElPTkFMX1BBUkFNRVRFUm1lc3NhZ2VQcml2YXRlTmFtZWRQYXJhbWV0ZXJjb2RlUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcldpdGhCb2R5UmVkaXJlY3RpbmcgY29uc3RydWN0b3JzIGNhbid0IGhhdmUgYSBib2R5LlRyeSByZW1vdmluZyB0aGUgYm9keSwgb3Igbm90IG1ha2luZyB0aGlzIGEgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IuUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcldpdGhCb2R5bWVzc2FnZVJlZGlyZWN0aW5nQ29uc3RydWN0b3JXaXRoQm9keXRlbXBsYXRlUmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50VGhlIHR5cGUgJyN0eXBlJyBkb2Vzbid0IGV4dGVuZCAnI3R5cGUyJy5UcnkgdXNpbmcgYSBkaWZmZXJlbnQgdHlwZSBhcyBhcmd1bWVudC5jb2RlUmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50UmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50Y29kZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5T25seSBmYWN0b3J5IGNvbnN0cnVjdG9yIGNhbiBzcGVjaWZ5ICc9JyByZWRpcmVjdGlvbi5UcnkgbWFraW5nIHRoaXMgYSBmYWN0b3J5IGNvbnN0cnVjdG9yLCBvciByZW1vdmUgdGhlIHJlZGlyZWN0aW9uLlJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5bWVzc2FnZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5dGVtcGxhdGVSZWRpcmVjdGlvblRhcmdldE5vdEZvdW5kUmVkaXJlY3Rpb24gY29uc3RydWN0b3IgdGFyZ2V0IG5vdCBmb3VuZDogJyNuYW1lJ2NvZGVSZWRpcmVjdGlvblRhcmdldE5vdEZvdW5kUmVkaXJlY3Rpb25UYXJnZXROb3RGb3VuZFJFRElSRUNUX1RPX01JU1NJTkdfQ09OU1RSVUNUT1Jjb2RlUmVxdWlyZWRQYXJhbWV0ZXJXaXRoRGVmYXVsdE5vbi1vcHRpb25hbCBwYXJhbWV0ZXJzIGNhbid0IGhhdmUgYSBkZWZhdWx0IHZhbHVlLlRyeSByZW1vdmluZyB0aGUgZGVmYXVsdCB2YWx1ZSBvciBtYWtpbmcgdGhlIHBhcmFtZXRlciBvcHRpb25hbC5SZXF1aXJlZFBhcmFtZXRlcldpdGhEZWZhdWx0TkFNRURfUEFSQU1FVEVSX09VVFNJREVfR1JPVVBtZXNzYWdlUmVxdWlyZWRQYXJhbWV0ZXJXaXRoRGVmYXVsdGNvZGVSZXRocm93Tm90Q2F0Y2gncmV0aHJvdycgY2FuIG9ubHkgYmUgdXNlZCBpbiBjYXRjaCBjbGF1c2VzLlJldGhyb3dOb3RDYXRjaFJFVEhST1dfT1VUU0lERV9DQVRDSG1lc3NhZ2VSZXRocm93Tm90Q2F0Y2hjb2RlUmV0dXJuRnJvbVZvaWRGdW5jdGlvbkNhbid0IHJldHVybiBhIHZhbHVlIGZyb20gYSB2b2lkIGZ1bmN0aW9uLlJldHVybkZyb21Wb2lkRnVuY3Rpb25SRVRVUk5fT0ZfSU5WQUxJRF9UWVBFbWVzc2FnZVJldHVybkZyb21Wb2lkRnVuY3Rpb25jb2RlUmV0dXJuVHlwZUZ1bmN0aW9uRXhwcmVzc2lvbkEgZnVuY3Rpb24gZXhwcmVzc2lvbiBjYW4ndCBoYXZlIGEgcmV0dXJuIHR5cGUuUmV0dXJuVHlwZUZ1bmN0aW9uRXhwcmVzc2lvbm1lc3NhZ2VSZXR1cm5UeXBlRnVuY3Rpb25FeHByZXNzaW9uY29kZVJldHVybldpdGhvdXRFeHByZXNzaW9uTXVzdCBleHBsaWNpdGx5IHJldHVybiBhIHZhbHVlIGZyb20gYSBub24tdm9pZCBmdW5jdGlvbi5SZXR1cm5XaXRob3V0RXhwcmVzc2lvblJFVFVSTl9XSVRIT1VUX1ZBTFVFbWVzc2FnZVJldHVybldpdGhvdXRFeHByZXNzaW9uY29kZVNka1Jvb3ROb3RGb3VuZFNka1Jvb3ROb3RGb3VuZGNvZGVTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmRTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmRjb2RlU2RrU3VtbWFyeU5vdEZvdW5kU2RrU3VtbWFyeU5vdEZvdW5kY29kZVNldExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50c0Egc2V0IGxpdGVyYWwgcmVxdWlyZXMgZXhhY3RseSBvbmUgdHlwZSBhcmd1bWVudC5TZXRMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHNtZXNzYWdlU2V0TGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzY29kZVNldE9yTWFwTGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzQSBzZXQgb3IgbWFwIGxpdGVyYWwgcmVxdWlyZXMgZXhhY3RseSBvbmUgb3IgdHdvIHR5cGUgYXJndW1lbnRzLCByZXNwZWN0aXZlbHkuU2V0T3JNYXBMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHNtZXNzYWdlU2V0T3JNYXBMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHN0ZW1wbGF0ZVNldHRlck5vdEZvdW5kU2V0dGVyIG5vdCBmb3VuZDogJyNuYW1lJy5jb2RlU2V0dGVyTm90Rm91bmRTZXR0ZXJOb3RGb3VuZFVOREVGSU5FRF9TRVRURVJjb2RlU2V0dGVyTm90U3luY1NldHRlcnMgY2FuJ3QgdXNlICdhc3luYycsICdhc3luYyonLCBvciAnc3luYyonLlNldHRlck5vdFN5bmNJTlZBTElEX01PRElGSUVSX09OX1NFVFRFUm1lc3NhZ2VTZXR0ZXJOb3RTeW5jY29kZVNldHRlcldpdGhXcm9uZ051bWJlck9mRm9ybWFsc0Egc2V0dGVyIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGZvcm1hbCBwYXJhbWV0ZXIuU2V0dGVyV2l0aFdyb25nTnVtYmVyT2ZGb3JtYWxzV1JPTkdfTlVNQkVSX09GX1BBUkFNRVRFUlNfRk9SX1NFVFRFUm1lc3NhZ2VTZXR0ZXJXaXRoV3JvbmdOdW1iZXJPZkZvcm1hbHN0ZW1wbGF0ZVNvdXJjZUJvZHlTdW1tYXJ5QnVpbHQgYm9kaWVzIGZvciAjY291bnQgY29tcGlsYXRpb24gdW5pdHMgKCNjb3VudDIgYnl0ZXMpIGluICNudW0xJS4zbXMsIHRoYXQgaXMsCiNudW0yJTEyLjMgYnl0ZXMvbXMsIGFuZAojbnVtMyUxMi4zIG1zL2NvbXBpbGF0aW9uIHVuaXQuY29kZVNvdXJjZUJvZHlTdW1tYXJ5U291cmNlQm9keVN1bW1hcnl0ZW1wbGF0ZVNvdXJjZU91dGxpbmVTdW1tYXJ5QnVpbHQgb3V0bGluZXMgZm9yICNjb3VudCBjb21waWxhdGlvbiB1bml0cyAoI2NvdW50MiBieXRlcykgaW4gI251bTElLjNtcywgdGhhdCBpcywKI251bTIlMTIuMyBieXRlcy9tcywgYW5kCiNudW0zJTEyLjMgbXMvY29tcGlsYXRpb24gdW5pdC5jb2RlU291cmNlT3V0bGluZVN1bW1hcnlTb3VyY2VPdXRsaW5lU3VtbWFyeWNvZGVTcHJlYWRFbGVtZW50SXRlcmFibGUgc3ByZWFkLlNwcmVhZEVsZW1lbnRtZXNzYWdlU3ByZWFkRWxlbWVudHRlbXBsYXRlU3ByZWFkRWxlbWVudFR5cGVNaXNtYXRjaENhbid0IGFzc2lnbiBzcHJlYWQgZWxlbWVudHMgb2YgdHlwZSAnI3R5cGUnIHRvIGNvbGxlY3Rpb24gZWxlbWVudHMgb2YgdHlwZSAnI3R5cGUyJy5jb2RlU3ByZWFkRWxlbWVudFR5cGVNaXNtYXRjaFNwcmVhZEVsZW1lbnRUeXBlTWlzbWF0Y2hMSVNUX0VMRU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRWNvZGVTcHJlYWRNYXBFbGVtZW50TWFwIHNwcmVhZC5TcHJlYWRNYXBFbGVtZW50bWVzc2FnZVNwcmVhZE1hcEVsZW1lbnR0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5RWxlbWVudEtleVR5cGVNaXNtYXRjaENhbid0IGFzc2lnbiBzcHJlYWQgZW50cnkga2V5cyBvZiB0eXBlICcjdHlwZScgdG8gbWFwIGVudHJ5IGtleXMgb2YgdHlwZSAnI3R5cGUyJy5jb2RlU3ByZWFkTWFwRW50cnlFbGVtZW50S2V5VHlwZU1pc21hdGNoU3ByZWFkTWFwRW50cnlFbGVtZW50S2V5VHlwZU1pc21hdGNoTUFQX0tFWV9UWVBFX05PVF9BU1NJR05BQkxFdGVtcGxhdGVTcHJlYWRNYXBFbnRyeUVsZW1lbnRWYWx1ZVR5cGVNaXNtYXRjaENhbid0IGFzc2lnbiBzcHJlYWQgZW50cnkgdmFsdWVzIG9mIHR5cGUgJyN0eXBlJyB0byBtYXAgZW50cnkgdmFsdWVzIG9mIHR5cGUgJyN0eXBlMicuY29kZVNwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2hNQVBfVkFMVUVfVFlQRV9OT1RfQVNTSUdOQUJMRXRlbXBsYXRlU3ByZWFkTWFwRW50cnlUeXBlTWlzbWF0Y2hVbmV4cGVjdGVkIHR5cGUgJyN0eXBlJyBvZiBhIG1hcCBzcHJlYWQgZW50cnkuICBFeHBlY3RlZCAnZHluYW1pYycgb3IgYSBNYXAuY29kZVNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoU3ByZWFkTWFwRW50cnlUeXBlTWlzbWF0Y2h0ZW1wbGF0ZVNwcmVhZFR5cGVNaXNtYXRjaFVuZXhwZWN0ZWQgdHlwZSAnI3R5cGUnIG9mIGEgc3ByZWFkLiAgRXhwZWN0ZWQgJ2R5bmFtaWMnIG9yIGFuIEl0ZXJhYmxlLmNvZGVTcHJlYWRUeXBlTWlzbWF0Y2hTcHJlYWRUeXBlTWlzbWF0Y2hjb2RlU3RhY2tPdmVyZmxvd1RoZSBmaWxlIGhhcyB0b28gbWFueSBuZXN0ZWQgZXhwcmVzc2lvbnMgb3Igc3RhdGVtZW50cy5Ucnkgc2ltcGxpZnlpbmcgdGhlIGNvZGUuU3RhY2tPdmVyZmxvd21lc3NhZ2VTdGFja092ZXJmbG93Y29kZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RUaGlzIHN0YXRpYyBtZW1iZXIgY29uZmxpY3RzIHdpdGggYW4gaW5zdGFuY2UgbWVtYmVyLlN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RDT05GTElDVElOR19TVEFUSUNfQU5EX0lOU1RBTkNFbWVzc2FnZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3Rjb2RlU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdENhdXNlVGhpcyBpcyB0aGUgaW5zdGFuY2UgbWVtYmVyLlN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RDYXVzZW1lc3NhZ2VTdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0Q2F1c2Vjb2RlU3RhdGljQ29uc3RydWN0b3JDb25zdHJ1Y3RvcnMgY2FuJ3QgYmUgc3RhdGljLlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAnc3RhdGljJy5TdGF0aWNDb25zdHJ1Y3Rvcm1lc3NhZ2VTdGF0aWNDb25zdHJ1Y3RvcmNvZGVTdGF0aWNPcGVyYXRvck9wZXJhdG9ycyBjYW4ndCBiZSBzdGF0aWMuU3RhdGljT3BlcmF0b3JtZXNzYWdlU3RhdGljT3BlcmF0b3Jjb2RlU3VwZXJBc0V4cHJlc3Npb25DYW4ndCB1c2UgJ3N1cGVyJyBhcyBhbiBleHByZXNzaW9uLlRvIGRlbGVnYXRlIGEgY29uc3RydWN0b3IgdG8gYSBzdXBlciBjb25zdHJ1Y3RvciwgcHV0IHRoZSBzdXBlciBjYWxsIGFzIGFuIGluaXRpYWxpemVyLlN1cGVyQXNFeHByZXNzaW9uU1VQRVJfQVNfRVhQUkVTU0lPTm1lc3NhZ2VTdXBlckFzRXhwcmVzc2lvbmNvZGVTdXBlckFzSWRlbnRpZmllckV4cGVjdGVkIGlkZW50aWZpZXIsIGJ1dCBnb3QgJ3N1cGVyJy5TdXBlckFzSWRlbnRpZmllcm1lc3NhZ2VTdXBlckFzSWRlbnRpZmllcmNvZGVTdXBlckluaXRpYWxpemVyTm90TGFzdENhbid0IGhhdmUgaW5pdGlhbGl6ZXJzIGFmdGVyICdzdXBlcicuU3VwZXJJbml0aWFsaXplck5vdExhc3RJTlZBTElEX1NVUEVSX0lOVk9DQVRJT05tZXNzYWdlU3VwZXJJbml0aWFsaXplck5vdExhc3Rjb2RlU3VwZXJOdWxsQXdhcmVUaGUgb3BlcmF0b3IgJz8uJyBjYW5ub3QgYmUgdXNlZCB3aXRoICdzdXBlcicgYmVjYXVzZSAnc3VwZXInIGNhbm5vdCBiZSBudWxsLlRyeSByZXBsYWNpbmcgJz8uJyB3aXRoICcuJ1N1cGVyTnVsbEF3YXJlbWVzc2FnZVN1cGVyTnVsbEF3YXJldGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9Db25zdHJ1Y3RvclN1cGVyY2xhc3MgaGFzIG5vIGNvbnN0cnVjdG9yIG5hbWVkICcjbmFtZScuY29kZVN1cGVyY2xhc3NIYXNOb0NvbnN0cnVjdG9yU3VwZXJjbGFzc0hhc05vQ29uc3RydWN0b3JVTkRFRklORURfQ09OU1RSVUNUT1JfSU5fSU5JVElBTElaRVJVTkRFRklORURfQ09OU1RSVUNUT1JfSU5fSU5JVElBTElaRVJfREVGQVVMVHRlbXBsYXRlU3VwZXJjbGFzc0hhc05vRGVmYXVsdENvbnN0cnVjdG9yVGhlIHN1cGVyY2xhc3MsICcjbmFtZScsIGhhcyBubyB1bm5hbWVkIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLmNvZGVTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3JTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3JOT19ERUZBVUxUX1NVUEVSX0NPTlNUUlVDVE9SX0lNUExJQ0lUdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9HZXR0ZXJTdXBlcmNsYXNzIGhhcyBubyBnZXR0ZXIgbmFtZWQgJyNuYW1lJy5jb2RlU3VwZXJjbGFzc0hhc05vR2V0dGVyU3VwZXJjbGFzc0hhc05vR2V0dGVyVU5ERUZJTkVEX1NVUEVSX0dFVFRFUnRlbXBsYXRlU3VwZXJjbGFzc0hhc05vTWV0aG9kU3VwZXJjbGFzcyBoYXMgbm8gbWV0aG9kIG5hbWVkICcjbmFtZScuY29kZVN1cGVyY2xhc3NIYXNOb01ldGhvZFN1cGVyY2xhc3NIYXNOb01ldGhvZFVOREVGSU5FRF9TVVBFUl9NRVRIT0R0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb1NldHRlclN1cGVyY2xhc3MgaGFzIG5vIHNldHRlciBuYW1lZCAnI25hbWUnLmNvZGVTdXBlcmNsYXNzSGFzTm9TZXR0ZXJTdXBlcmNsYXNzSGFzTm9TZXR0ZXJVTkRFRklORURfU1VQRVJfU0VUVEVSdGVtcGxhdGVTdXBlcmNsYXNzTWV0aG9kQXJndW1lbnRNaXNtYXRjaFN1cGVyY2xhc3MgZG9lc24ndCBoYXZlIGEgbWV0aG9kIG5hbWVkICcjbmFtZScgd2l0aCBtYXRjaGluZyBhcmd1bWVudHMuY29kZVN1cGVyY2xhc3NNZXRob2RBcmd1bWVudE1pc21hdGNoU3VwZXJjbGFzc01ldGhvZEFyZ3VtZW50TWlzbWF0Y2hjb2RlU3VwZXJ0eXBlSXNGdW5jdGlvbkNhbid0IHVzZSBhIGZ1bmN0aW9uIHR5cGUgYXMgc3VwZXJ0eXBlLlN1cGVydHlwZUlzRnVuY3Rpb25tZXNzYWdlU3VwZXJ0eXBlSXNGdW5jdGlvbnRlbXBsYXRlU3VwZXJ0eXBlSXNJbGxlZ2FsVGhlIHR5cGUgJyNuYW1lJyBjYW4ndCBiZSB1c2VkIGFzIHN1cGVydHlwZS5jb2RlU3VwZXJ0eXBlSXNJbGxlZ2FsU3VwZXJ0eXBlSXNJbGxlZ2FsRVhURU5EU19OT05fQ0xBU1N0ZW1wbGF0ZVN1cGVydHlwZUlzVHlwZVZhcmlhYmxlVGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBjYW4ndCBiZSB1c2VkIGFzIHN1cGVydHlwZS5jb2RlU3VwZXJ0eXBlSXNUeXBlVmFyaWFibGVTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZWNvZGVTd2l0Y2hDYXNlRmFsbFRocm91Z2hTd2l0Y2ggY2FzZSBtYXkgZmFsbCB0aHJvdWdoIHRvIHRoZSBuZXh0IGNhc2UuU3dpdGNoQ2FzZUZhbGxUaHJvdWdoQ0FTRV9CTE9DS19OT1RfVEVSTUlOQVRFRG1lc3NhZ2VTd2l0Y2hDYXNlRmFsbFRocm91Z2h0ZW1wbGF0ZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlVHlwZSAnI3R5cGUnIG9mIHRoZSBzd2l0Y2ggZXhwcmVzc2lvbiBpc24ndCBhc3NpZ25hYmxlIHRvIHRoZSB0eXBlICcjdHlwZTInIG9mIHRoaXMgY2FzZSBleHByZXNzaW9uLmNvZGVTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlU1dJVENIX0VYUFJFU1NJT05fTk9UX0FTU0lHTkFCTEVjb2RlU3dpdGNoRXhwcmVzc2lvbk5vdEFzc2lnbmFibGVDYXVzZVRoZSBzd2l0Y2ggZXhwcmVzc2lvbiBpcyBoZXJlLlN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlQ2F1c2VtZXNzYWdlU3dpdGNoRXhwcmVzc2lvbk5vdEFzc2lnbmFibGVDYXVzZWNvZGVTd2l0Y2hIYXNDYXNlQWZ0ZXJEZWZhdWx0VGhlIGRlZmF1bHQgY2FzZSBzaG91bGQgYmUgdGhlIGxhc3QgY2FzZSBpbiBhIHN3aXRjaCBzdGF0ZW1lbnQuVHJ5IG1vdmluZyB0aGUgZGVmYXVsdCBjYXNlIGFmdGVyIHRoZSBvdGhlciBjYXNlIGNsYXVzZXMuU3dpdGNoSGFzQ2FzZUFmdGVyRGVmYXVsdG1lc3NhZ2VTd2l0Y2hIYXNDYXNlQWZ0ZXJEZWZhdWx0Y29kZVN3aXRjaEhhc011bHRpcGxlRGVmYXVsdHNUaGUgJ2RlZmF1bHQnIGNhc2UgY2FuIG9ubHkgYmUgZGVjbGFyZWQgb25jZS5UcnkgcmVtb3ZpbmcgYWxsIGJ1dCBvbmUgZGVmYXVsdCBjYXNlLlN3aXRjaEhhc011bHRpcGxlRGVmYXVsdHNtZXNzYWdlU3dpdGNoSGFzTXVsdGlwbGVEZWZhdWx0c2NvZGVTeW50aGV0aWNUb2tlblRoaXMgY291bGRuJ3QgYmUgcGFyc2VkLlN5bnRoZXRpY1Rva2VubWVzc2FnZVN5bnRoZXRpY1Rva2VudGVtcGxhdGVUaGlzQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyQ2FuJ3QgYWNjZXNzICd0aGlzJyBpbiBhIGZpZWxkIGluaXRpYWxpemVyIHRvIHJlYWQgJyNuYW1lJy5jb2RlVGhpc0FjY2Vzc0luRmllbGRJbml0aWFsaXplclRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXJUSElTX0FDQ0VTU19GUk9NX0ZJRUxEX0lOSVRJQUxJWkVSY29kZVRoaXNBc0lkZW50aWZpZXJFeHBlY3RlZCBpZGVudGlmaWVyLCBidXQgZ290ICd0aGlzJy5UaGlzQXNJZGVudGlmaWVySU5WQUxJRF9SRUZFUkVOQ0VfVE9fVEhJU21lc3NhZ2VUaGlzQXNJZGVudGlmaWVyY29kZVRoaXNJbml0aWFsaXplck5vdEFsb25lQ2FuJ3QgaGF2ZSBvdGhlciBpbml0aWFsaXplcnMgdG9nZXRoZXIgd2l0aCAndGhpcycuVGhpc0luaXRpYWxpemVyTm90QWxvbmVGSUVMRF9JTklUSUFMSVpFUl9SRURJUkVDVElOR19DT05TVFJVQ1RPUm1lc3NhZ2VUaGlzSW5pdGlhbGl6ZXJOb3RBbG9uZXRlbXBsYXRlVGhpc09yU3VwZXJBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXJDYW4ndCBhY2Nlc3MgJyNzdHJpbmcnIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIuY29kZVRoaXNPclN1cGVyQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyVGhpc09yU3VwZXJBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXJUSElTX0FDQ0VTU19GUk9NX0lOSVRJQUxJWkVSdGVtcGxhdGVUb29GZXdBcmd1bWVudHNUb28gZmV3IHBvc2l0aW9uYWwgYXJndW1lbnRzOiAjY291bnQgcmVxdWlyZWQsICNjb3VudDIgZ2l2ZW4uY29kZVRvb0Zld0FyZ3VtZW50c1Rvb0Zld0FyZ3VtZW50c05PVF9FTk9VR0hfUkVRVUlSRURfQVJHVU1FTlRTdGVtcGxhdGVUb29NYW55QXJndW1lbnRzVG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudHM6ICNjb3VudCBhbGxvd2VkLCBidXQgI2NvdW50MiBmb3VuZC5UcnkgcmVtb3ZpbmcgdGhlIGV4dHJhIHBvc2l0aW9uYWwgYXJndW1lbnRzLmNvZGVUb29NYW55QXJndW1lbnRzVG9vTWFueUFyZ3VtZW50c2NvZGVUb3BMZXZlbE9wZXJhdG9yT3BlcmF0b3JzIG11c3QgYmUgZGVjbGFyZWQgd2l0aGluIGEgY2xhc3MuVHJ5IHJlbW92aW5nIHRoZSBvcGVyYXRvciwgbW92aW5nIGl0IHRvIGEgY2xhc3MsIG9yIGNvbnZlcnRpbmcgaXQgdG8gYmUgYSBmdW5jdGlvbi5Ub3BMZXZlbE9wZXJhdG9ybWVzc2FnZVRvcExldmVsT3BlcmF0b3Jjb2RlVHlwZUFmdGVyVmFyVmFyaWFibGVzIGNhbid0IGJlIGRlY2xhcmVkIHVzaW5nIGJvdGggJ3ZhcicgYW5kIGEgdHlwZSBuYW1lLlRyeSByZW1vdmluZyAndmFyLidUeXBlQWZ0ZXJWYXJtZXNzYWdlVHlwZUFmdGVyVmFydGVtcGxhdGVUeXBlQXJndW1lbnRNaXNtYXRjaEV4cGVjdGVkICNjb3VudCB0eXBlIGFyZ3VtZW50cy5jb2RlVHlwZUFyZ3VtZW50TWlzbWF0Y2hUeXBlQXJndW1lbnRNaXNtYXRjaFdST05HX05VTUJFUl9PRl9UWVBFX0FSR1VNRU5UU3RlbXBsYXRlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlQ2FuJ3QgdXNlIHR5cGUgYXJndW1lbnRzIHdpdGggdHlwZSB2YXJpYWJsZSAnI25hbWUnLlRyeSByZW1vdmluZyB0aGUgdHlwZSBhcmd1bWVudHMuY29kZVR5cGVBcmd1bWVudHNPblR5cGVWYXJpYWJsZVR5cGVBcmd1bWVudHNPblR5cGVWYXJpYWJsZWNvZGVUeXBlQmVmb3JlRmFjdG9yeUZhY3RvcnkgY29uc3RydWN0b3JzIGNhbm5vdCBoYXZlIGEgcmV0dXJuIHR5cGUuVHJ5IHJlbW92aW5nIHRoZSB0eXBlIGFwcGVhcmluZyBiZWZvcmUgJ2ZhY3RvcnknLlR5cGVCZWZvcmVGYWN0b3J5bWVzc2FnZVR5cGVCZWZvcmVGYWN0b3J5dGVtcGxhdGVUeXBlTm90Rm91bmRUeXBlICcjbmFtZScgbm90IGZvdW5kLmNvZGVUeXBlTm90Rm91bmRUeXBlTm90Rm91bmRVTkRFRklORURfQ0xBU1N0ZW1wbGF0ZVR5cGVPcmlnaW4nI25hbWUnIGlzIGZyb20gJyN1cmknLmNvZGVUeXBlT3JpZ2luVHlwZU9yaWdpbnRlbXBsYXRlVHlwZU9yaWdpbldpdGhGaWxlVXJpJyNuYW1lJyBpcyBmcm9tICcjdXJpJyAoJyN1cmkyJykuY29kZVR5cGVPcmlnaW5XaXRoRmlsZVVyaVR5cGVPcmlnaW5XaXRoRmlsZVVyaWNvZGVUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUEgdHlwZSB2YXJpYWJsZSBjYW4ndCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYW5vdGhlci5UeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZW1lc3NhZ2VUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZXRlbXBsYXRlVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWVDYXVzZVRoZSBvdGhlciB0eXBlIHZhcmlhYmxlIG5hbWVkICcjbmFtZScuY29kZVR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lQ2F1c2VUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlY29kZVR5cGVWYXJpYWJsZUluQ29uc3RhbnRDb250ZXh0VHlwZSB2YXJpYWJsZXMgY2FuJ3QgYmUgdXNlZCBhcyBjb25zdGFudHMuVHlwZVZhcmlhYmxlSW5Db25zdGFudENvbnRleHRUWVBFX1BBUkFNRVRFUl9JTl9DT05TVF9FWFBSRVNTSU9ObWVzc2FnZVR5cGVWYXJpYWJsZUluQ29uc3RhbnRDb250ZXh0Y29kZVR5cGVWYXJpYWJsZUluU3RhdGljQ29udGV4dFR5cGUgdmFyaWFibGVzIGNhbid0IGJlIHVzZWQgaW4gc3RhdGljIG1lbWJlcnMuVHlwZVZhcmlhYmxlSW5TdGF0aWNDb250ZXh0bWVzc2FnZVR5cGVWYXJpYWJsZUluU3RhdGljQ29udGV4dGNvZGVUeXBlVmFyaWFibGVTYW1lTmFtZUFzRW5jbG9zaW5nQSB0eXBlIHZhcmlhYmxlIGNhbid0IGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBpdHMgZW5jbG9zaW5nIGRlY2xhcmF0aW9uLlR5cGVWYXJpYWJsZVNhbWVOYW1lQXNFbmNsb3NpbmdDT05GTElDVElOR19UWVBFX1ZBUklBQkxFX0FORF9DTEFTU21lc3NhZ2VUeXBlVmFyaWFibGVTYW1lTmFtZUFzRW5jbG9zaW5nY29kZVR5cGVkZWZJbkNsYXNzVHlwZWRlZnMgY2FuJ3QgYmUgZGVjbGFyZWQgaW5zaWRlIGNsYXNzZXMuVHJ5IG1vdmluZyB0aGUgdHlwZWRlZiB0byB0aGUgdG9wLWxldmVsLlR5cGVkZWZJbkNsYXNzbWVzc2FnZVR5cGVkZWZJbkNsYXNzY29kZVR5cGVkZWZOb3RGdW5jdGlvbkNhbid0IGNyZWF0ZSB0eXBlZGVmIGZyb20gbm9uLWZ1bmN0aW9uIHR5cGUuVHlwZWRlZk5vdEZ1bmN0aW9uSU5WQUxJRF9HRU5FUklDX0ZVTkNUSU9OX1RZUEVtZXNzYWdlVHlwZWRlZk5vdEZ1bmN0aW9udGVtcGxhdGVVbmRlZmluZWRHZXR0ZXJUaGUgZ2V0dGVyICcjbmFtZScgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzICcjdHlwZScuVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgZ2V0dGVyLCBvciBkZWZpbmluZyBhIGdldHRlciBvciBmaWVsZCBuYW1lZCAnI25hbWUnLmNvZGVVbmRlZmluZWRHZXR0ZXJVbmRlZmluZWRHZXR0ZXJ0ZW1wbGF0ZVVuZGVmaW5lZE1ldGhvZFRoZSBtZXRob2QgJyNuYW1lJyBpc24ndCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyN0eXBlJy5UcnkgY29ycmVjdGluZyB0aGUgbmFtZSB0byB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBtZXRob2QsIG9yIGRlZmluaW5nIGEgbWV0aG9kIG5hbWVkICcjbmFtZScuY29kZVVuZGVmaW5lZE1ldGhvZFVuZGVmaW5lZE1ldGhvZHRlbXBsYXRlVW5kZWZpbmVkU2V0dGVyVGhlIHNldHRlciAnI25hbWUnIGlzbid0IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnI3R5cGUnLlRyeSBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIHNldHRlciwgb3IgZGVmaW5pbmcgYSBzZXR0ZXIgb3IgZmllbGQgbmFtZWQgJyNuYW1lJy5jb2RlVW5kZWZpbmVkU2V0dGVyVW5kZWZpbmVkU2V0dGVyY29kZVVuZXhwZWN0ZWREb2xsYXJJblN0cmluZ0EgJyQnIGhhcyBzcGVjaWFsIG1lYW5pbmcgaW5zaWRlIGEgc3RyaW5nLCBhbmQgbXVzdCBiZSBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyIG9yIGFuIGV4cHJlc3Npb24gaW4gY3VybHkgYnJhY2VzICh7fSkuVHJ5IGFkZGluZyBhIGJhY2tzbGFzaCAoXCkgdG8gZXNjYXBlIHRoZSAnJCcuVW5leHBlY3RlZERvbGxhckluU3RyaW5nVU5FWFBFQ1RFRF9ET0xMQVJfSU5fU1RSSU5HbWVzc2FnZVVuZXhwZWN0ZWREb2xsYXJJblN0cmluZ3RlbXBsYXRlVW5leHBlY3RlZFRva2VuVW5leHBlY3RlZCB0b2tlbiAnI2xleGVtZScuY29kZVVuZXhwZWN0ZWRUb2tlblVuZXhwZWN0ZWRUb2tlblVORVhQRUNURURfVE9LRU50ZW1wbGF0ZVVubWF0Y2hlZFRva2VuQ2FuJ3QgZmluZCAnI3N0cmluZycgdG8gbWF0Y2ggJyNsZXhlbWUnLmNvZGVVbm1hdGNoZWRUb2tlblVubWF0Y2hlZFRva2VudGVtcGxhdGVVbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvbicjbmFtZS4jbmFtZTInIGNhbid0IGJlIHVzZWQgYXMgYSB0eXBlIGJlY2F1c2UgJyNuYW1lJyBpc24ndCBkZWZpbmVkLmNvZGVVbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvblVucmVzb2x2ZWRQcmVmaXhJblR5cGVBbm5vdGF0aW9udGVtcGxhdGVVbnNwZWNpZmllZCNzdHJpbmdjb2RlVW5zcGVjaWZpZWRVbnNwZWNpZmllZHRlbXBsYXRlVW5zdXBwb3J0ZWRPcGVyYXRvclRoZSAnI2xleGVtZScgb3BlcmF0b3IgaXMgbm90IHN1cHBvcnRlZC5jb2RlVW5zdXBwb3J0ZWRPcGVyYXRvclVuc3VwcG9ydGVkT3BlcmF0b3JVTlNVUFBPUlRFRF9PUEVSQVRPUmNvZGVVbnN1cHBvcnRlZFByZWZpeFBsdXMnKycgaXMgbm90IGEgcHJlZml4IG9wZXJhdG9yLlRyeSByZW1vdmluZyAnKycuVW5zdXBwb3J0ZWRQcmVmaXhQbHVzbWVzc2FnZVVuc3VwcG9ydGVkUHJlZml4UGx1c2NvZGVVbnRlcm1pbmF0ZWRDb21tZW50Q29tbWVudCBzdGFydGluZyB3aXRoICcvKicgbXVzdCBlbmQgd2l0aCAnKi8nLlVudGVybWluYXRlZENvbW1lbnRVTlRFUk1JTkFURURfTVVMVElfTElORV9DT01NRU5UbWVzc2FnZVVudGVybWluYXRlZENvbW1lbnR0ZW1wbGF0ZVVudGVybWluYXRlZFN0cmluZ1N0cmluZyBzdGFydGluZyB3aXRoICNzdHJpbmcgbXVzdCBlbmQgd2l0aCAjc3RyaW5nMi5jb2RlVW50ZXJtaW5hdGVkU3RyaW5nVW50ZXJtaW5hdGVkU3RyaW5nVU5URVJNSU5BVEVEX1NUUklOR19MSVRFUkFMY29kZVVudGVybWluYXRlZFRva2VuSW5jb21wbGV0ZSB0b2tlbi5VbnRlcm1pbmF0ZWRUb2tlbm1lc3NhZ2VVbnRlcm1pbmF0ZWRUb2tlbnRlbXBsYXRlVW50cmFuc2xhdGFibGVVcmlOb3QgZm91bmQ6ICcjdXJpJ2NvZGVVbnRyYW5zbGF0YWJsZVVyaVVudHJhbnNsYXRhYmxlVXJpdGVtcGxhdGVVc2VPZkRlcHJlY2F0ZWRJZGVudGlmaWVyJyNuYW1lJyBpcyBkZXByZWNhdGVkLmNvZGVVc2VPZkRlcHJlY2F0ZWRJZGVudGlmaWVyVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllcmNvZGVWYXJBc1R5cGVOYW1lVGhlIGtleXdvcmQgJ3ZhcicgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgbmFtZS5WYXJBc1R5cGVOYW1lbWVzc2FnZVZhckFzVHlwZU5hbWVjb2RlVmFyUmV0dXJuVHlwZVRoZSByZXR1cm4gdHlwZSBjYW4ndCBiZSAndmFyJy5UcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ3ZhcicsIG9yIHJlcGxhY2luZyBpdCB3aXRoIHRoZSBuYW1lIG9mIHRoZSByZXR1cm4gdHlwZS5WYXJSZXR1cm5UeXBlbWVzc2FnZVZhclJldHVyblR5cGVjb2RlVm9pZEV4cHJlc3Npb25UaGlzIGV4cHJlc3Npb24gaGFzIHR5cGUgJ3ZvaWQnIGFuZCBjYW4ndCBiZSB1c2VkLlZvaWRFeHByZXNzaW9uVVNFX09GX1ZPSURfUkVTVUxUbWVzc2FnZVZvaWRFeHByZXNzaW9udGVtcGxhdGVXZWJMaXRlcmFsQ2Fubm90QmVSZXByZXNlbnRlZEV4YWN0bHlUaGUgaW50ZWdlciBsaXRlcmFsICNzdHJpbmcgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBpbiBKYXZhU2NyaXB0LlRyeSBjaGFuZ2luZyB0aGUgbGl0ZXJhbCB0byBzb21ldGhpbmcgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gSmF2YXNjcmlwdC4gSW4gSmF2YXNjcmlwdCAjc3RyaW5nMiBpcyB0aGUgbmVhcmVzdCB2YWx1ZSB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBleGFjdGx5LmNvZGVXZWJMaXRlcmFsQ2Fubm90QmVSZXByZXNlbnRlZEV4YWN0bHlXZWJMaXRlcmFsQ2Fubm90QmVSZXByZXNlbnRlZEV4YWN0bHljb2RlV2l0aEJlZm9yZUV4dGVuZHNUaGUgZXh0ZW5kcyBjbGF1c2UgbXVzdCBiZSBiZWZvcmUgdGhlIHdpdGggY2xhdXNlLlRyeSBtb3ZpbmcgdGhlIGV4dGVuZHMgY2xhdXNlIGJlZm9yZSB0aGUgd2l0aCBjbGF1c2UuV2l0aEJlZm9yZUV4dGVuZHNtZXNzYWdlV2l0aEJlZm9yZUV4dGVuZHNjb2RlWWllbGRBc0lkZW50aWZpZXIneWllbGQnIGNhbid0IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBpbiAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJyBtZXRob2RzLllpZWxkQXNJZGVudGlmaWVybWVzc2FnZVlpZWxkQXNJZGVudGlmaWVyY29kZVlpZWxkTm90R2VuZXJhdG9yJ3lpZWxkJyBjYW4gb25seSBiZSB1c2VkIGluICdzeW5jKicgb3IgJ2FzeW5jKicgbWV0aG9kcy5ZaWVsZE5vdEdlbmVyYXRvcllJRUxEX0lOX05PTl9HRU5FUkFUT1JtZXNzYWdlWWllbGROb3RHZW5lcmF0b3JpdGVtaXplTmFtZXMgLSBfd2l0aEFyZ3VtZW50c0Fic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uTm8gbmFtZSBwcm92aWRlZFRoZSBjbGFzcyAnJyBpcyBhYnN0cmFjdCBhbmQgY2FuJ3QgYmUgaW5zdGFudGlhdGVkLl93aXRoQXJndW1lbnRzQWJzdHJhY3RSZWRpcmVjdGVkQ2xhc3NJbnN0YW50aWF0aW9uRmFjdG9yeSByZWRpcmVjdHMgdG8gY2xhc3MgJycsIHdoaWNoIGlzIGFic3RyYWN0IGFuZCBjYW4ndCBiZSBpbnN0YW50aWF0ZWQuX3dpdGhBcmd1bWVudHNBY2Nlc3NFcnJvckFjY2VzcyBlcnJvcjogJ193aXRoQXJndW1lbnRzQW1iaWd1b3VzU3VwZXJ0eXBlc190eXBlX3R5cGUybGFiZWxlcnR5cGVQYXJ0c2xhYmVsVHlwZXR5cGUyUGFydHN0eXBlMicgY2FuJ3QgaW1wbGVtZW50IGJvdGggJycgYW5kICdvcmlnaW5NZXNzYWdlc193aXRoQXJndW1lbnRzQXJndW1lbnRUeXBlTm90QXNzaWduYWJsZVRoZSBhcmd1bWVudCB0eXBlICcnIGNhbid0IGJlIGFzc2lnbmVkIHRvIHRoZSBwYXJhbWV0ZXIgdHlwZSAnVHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIsIG9yIGNhc3RpbmcgdGhlIGFyZ3VtZW50IHRvICdfd2l0aEFyZ3VtZW50c0FzY2lpQ29udHJvbENoYXJhY3RlcmNvZGVQb2ludHVuaWNvZGVVK3RvVXBwZXJDYXNlcGFkTGVmdFRoZSBjb250cm9sIGNoYXJhY3RlciAgY2FuIG9ubHkgYmUgdXNlZCBpbiBzdHJpbmdzIGFuZCBjb21tZW50cy5fd2l0aEFyZ3VtZW50c0JhZFR5cGVWYXJpYWJsZUluU3VwZXJ0eXBlbmFtZTJGb3VuZCB1bnN1cHBvcnRlZCB1c2VzIG9mICcnIGluIHN1cGVydHlwZSAnX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5R2VuZXJpYyB0eXBlICcnIGNhbid0IGJlIHVzZWQgd2l0aG91dCB0eXBlIGFyZ3VtZW50cyBpbiB0aGUgYm91bmRzIG9mIGl0cyBvd24gdHlwZSB2YXJpYWJsZXMuIEl0IGlzIHJlZmVyZW5jZWQgaW5kaXJlY3RseSB0aHJvdWdoICdUcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIHRvICcnIGhlcmUgb3IgdG8gc29tZSBvdGhlciByYXcgdHlwZXMgaW4gdGhlIGJvdW5kcyBhbG9uZyB0aGUgcmVmZXJlbmNlIGNoYWluLl93aXRoQXJndW1lbnRzQm91bmRJc3N1ZVZpYUxvb3BOb25TaW1wbGljaXR5JyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gdGhlIGJvdW5kcyBvZiBpdHMgb3duIHR5cGUgdmFyaWFibGVzLicgaGVyZS5fd2l0aEFyZ3VtZW50c0JvdW5kSXNzdWVWaWFSYXdUeXBlV2l0aE5vblNpbXBsZUJvdW5kcycgY2FuJ3QgYmUgdXNlZCB3aXRob3V0IHR5cGUgYXJndW1lbnRzIGluIGEgdHlwZSB2YXJpYWJsZSBib3VuZC5fd2l0aEFyZ3VtZW50c0JyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uQ2FuJ3QgYnJlYWsgdG8gJycgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uX3dpdGhBcmd1bWVudHNCdWlsdEluSWRlbnRpZmllckFzVHlwZXRva2VuVGhlIGJ1aWx0LWluIGlkZW50aWZpZXIgJycgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUuX3dpdGhBcmd1bWVudHNCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb25DYW4ndCB1c2UgJycgYXMgYSBuYW1lIGhlcmUuX3dpdGhBcmd1bWVudHNDYW5kaWRhdGVGb3VuZElzRGVmYXVsdENvbnN0cnVjdG9yJyBoYXMgYSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy5fd2l0aEFyZ3VtZW50c0Nhbm5vdFJlYWRTZGtTcGVjaWZpY2F0aW9uTm8gc3RyaW5nIHByb3ZpZGVkVW5hYmxlIHRvIHJlYWQgdGhlICdsaWJyYXJpZXMuanNvbicgc3BlY2lmaWNhdGlvbiBmaWxlOgogIF93aXRoQXJndW1lbnRzQ2FudEluZmVyUmV0dXJuVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzQ2FuJ3QgaW5mZXIgYSByZXR1cm4gdHlwZSBmb3IgJycgYXMgc29tZSBvZiB0aGUgaW5oZXJpdGVkIG1lbWJlcnMgaGF2ZSBkaWZmZXJlbnQgdHlwZXMuX3dpdGhBcmd1bWVudHNDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eUNhbid0IGluZmVyIHRoZSB0eXBlIG9mICcnOiBjaXJjdWxhcml0eSBmb3VuZCBkdXJpbmcgdHlwZSBpbmZlcmVuY2UuX3dpdGhBcmd1bWVudHNDYW50SW5mZXJUeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXNDYW4ndCBpbmZlciBhIHR5cGUgZm9yICdfd2l0aEFyZ3VtZW50c0NhbnRSZWFkRmlsZXVyaV9FcnJvciB3aGVuIHJlYWRpbmcgJyc6IF93aXRoQXJndW1lbnRzQ2FudFVzZUNvbnRyb2xGbG93T3JTcHJlYWRBc0NvbnN0YW50JyBpcyBub3Qgc3VwcG9ydGVkIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLl93aXRoQXJndW1lbnRzQ2FudFVzZURlZmVycmVkUHJlZml4QXNDb25zdGFudCcgY2FuJ3QgYmUgdXNlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24gYmVjYXVzZSBpdCdzIG1hcmtlZCBhcyAnZGVmZXJyZWQnIHdoaWNoIG1lYW5zIGl0IGlzbid0IGF2YWlsYWJsZSB1bnRpbCBsb2FkZWQuX3dpdGhBcmd1bWVudHNDb21iaW5lZE1lbWJlclNpZ25hdHVyZUZhaWxlZENsYXNzICcnIGluaGVyaXRzIG11bHRpcGxlIG1lbWJlcnMgbmFtZWQgJycgd2l0aCBpbmNvbXBhdGlibGUgc2lnbmF0dXJlcy5UcnkgYWRkaW5nIGEgZGVjbGFyYXRpb24gb2YgJycgdG8gJ193aXRoQXJndW1lbnRzQ29uZmxpY3RpbmdNb2RpZmllcnNzdHJpbmcyTWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhDb25zdHJ1Y3RvckNvbmZsaWN0cyB3aXRoIGNvbnN0cnVjdG9yICdfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhGYWN0b3J5Q29uZmxpY3RzIHdpdGggZmFjdG9yeSAnX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoTWVtYmVyQ29uZmxpY3RzIHdpdGggbWVtYmVyICdfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhNZW1iZXJXYXJuaW5nX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoU2V0dGVyQ29uZmxpY3RzIHdpdGggc2V0dGVyICdfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhTZXR0ZXJXYXJuaW5nX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ29uZmxpY3RzIHdpdGggdHlwZSB2YXJpYWJsZSAnX3dpdGhBcmd1bWVudHNDb25zdEV2YWxEZWZlcnJlZExpYnJhcnlfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnRfY29uc3RhbnRjb25zdGFudFBhcnRzbGFiZWxDb25zdGFudFRoZSBlbGVtZW50ICcnIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgZXhpc3RpbmcgZWxlbWVudCBpbiB0aGUgc2V0Ll93aXRoQXJndW1lbnRzQ29uc3RFdmFsRHVwbGljYXRlS2V5VGhlIGtleSAnJyBjb25mbGljdHMgd2l0aCBhbm90aGVyIGV4aXN0aW5nIGtleSBpbiB0aGUgbWFwLl93aXRoQXJndW1lbnRzQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbCcgZG9lcyBub3QgaGF2ZSBhIHByaW1pdGl2ZSBvcGVyYXRvciAnPT0nLl93aXRoQXJndW1lbnRzQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uV2l0aE1lc3NhZ2VUaGlzIGFzc2VydGlvbiBmYWlsZWQgd2l0aCBtZXNzYWdlOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEZyZWVUeXBlUGFyYW1ldGVyVGhlIHR5cGUgJycgaXMgbm90IGEgY29uc3RhbnQgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIGEgdHlwZSBwYXJhbWV0ZXIsIG9ubHkgaW5zdGFudGlhdGVkIHR5cGVzIGFyZSBhbGxvd2VkLl93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlQmluYXJ5IG9wZXJhdG9yICcnIG9uICcnIHJlcXVpcmVzIG9wZXJhbmQgb2YgdHlwZSAnJywgYnV0IHdhcyBvZiB0eXBlICdfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZUJpbmFyeSBvcGVyYXRvciAnPT0nIHJlcXVpcmVzIHJlY2VpdmVyIGNvbnN0YW50ICcnIG9mIHR5cGUgJ051bGwnLCAnYm9vbCcsICdpbnQnLCAnZG91YmxlJywgb3IgJ1N0cmluZycsIGJ1dCB3YXMgb2YgdHlwZSAnX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvblRoZSBtZXRob2QgJycgY2FuJ3QgYmUgaW52b2tlZCBvbiAnJyB3aXRoaW4gYSBjb25zdCBjb250ZXh0Ll93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFByb3BlcnR5R2V0VGhlIHByb3BlcnR5ICcnIGNhbid0IGJlIGFjY2Vzc2VkIG9uICdfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uVGhlIGludm9jYXRpb24gb2YgJycgaXMgbm90IGFsbG93ZWQgd2l0aGluIGEgY29uc3QgY29udGV4dC5fd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZFRoZSAnJyBjYW4ndCBiZSB1c2VkIGFzIHBhcnQgb2YgYSBzdHJpbmcgaW50ZXJwb2xhdGlvbiB3aXRoaW4gYSBjb25zdCBjb250ZXh0LCBvbmx5IHZhbHVlcyBvZiB0eXBlICdudWxsJywgJ2Jvb2wnLCAnaW50JywgJ2RvdWJsZScsIG9yICdTdHJpbmcnIGNhbiBiZSB1c2VkLl93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFN5bWJvbE5hbWVUaGUgc3ltYm9sIG5hbWUgbXVzdCBiZSBhIHZhbGlkIHB1YmxpYyBEYXJ0IG1lbWJlciBuYW1lLCBwdWJsaWMgY29uc3RydWN0b3IgbmFtZSwgb3IgbGlicmFyeSBuYW1lLCBvcHRpb25hbGx5IHF1YWxpZmllZCwgYnV0IHdhcyAnX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkVHlwZUV4cGVjdGVkIGNvbnN0YW50ICcnIHRvIGJlIG9mIHR5cGUgJ193aXRoQXJndW1lbnRzQ29uc3RFdmFsS2V5SW1wbGVtZW50c0VxdWFsX3dpdGhBcmd1bWVudHNDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0c3RyaW5nMycgcmVxdWlyZXMgbm9uLW5lZ2F0aXZlIG9wZXJhbmQsIGJ1dCB3YXMgJ193aXRoQXJndW1lbnRzQ29uc3RFdmFsTm9uQ29uc3RhbnRMaXRlcmFsQ2FuJ3QgaGF2ZSBhIG5vbi1jb25zdGFudCAgbGl0ZXJhbCB3aXRoaW4gYSBjb25zdCBjb250ZXh0Ll93aXRoQXJndW1lbnRzQ29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldFRoZSB2YXJpYWJsZSAnJyBpcyBub3QgYSBjb25zdGFudCwgb25seSBjb25zdGFudCBleHByZXNzaW9ucyBhcmUgYWxsb3dlZC5fd2l0aEFyZ3VtZW50c0NvbnN0RXZhbFplcm9EaXZpc29yJyByZXF1aXJlcyBub24temVybyBkaXZpc29yLCBidXQgZGl2aXNvciB3YXMgJzAnLl93aXRoQXJndW1lbnRzQ29uc3RGaWVsZFdpdGhvdXRJbml0aWFsaXplclRoZSBjb25zdCB2YXJpYWJsZSAnJyBtdXN0IGJlIGluaXRpYWxpemVkLl93aXRoQXJndW1lbnRzQ29uc3RydWN0b3JOb3RGb3VuZENvdWxkbid0IGZpbmQgY29uc3RydWN0b3IgJ193aXRoQXJndW1lbnRzQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dFRoZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MgaXMgJ193aXRoQXJndW1lbnRzQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb25DYW4ndCBjb250aW51ZSBhdCAnX3dpdGhBcmd1bWVudHNDb3VsZE5vdFBhcnNlVXJpQ291bGRuJ3QgcGFyc2UgVVJJICcnOgogIF93aXRoQXJndW1lbnRzQ3ljbGVJblR5cGVWYXJpYWJsZXNUeXBlICcnIGlzIGEgYm91bmQgb2YgaXRzZWxmIHZpYSAnX3dpdGhBcmd1bWVudHNDeWNsaWNDbGFzc0hpZXJhcmNoeScgaXMgYSBzdXBlcnR5cGUgb2YgaXRzZWxmLl93aXRoQXJndW1lbnRzQ3ljbGljUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzQ3ljbGljIGRlZmluaXRpb24gb2YgZmFjdG9yeSAnX3dpdGhBcmd1bWVudHNDeWNsaWNUeXBlZGVmVGhlIHR5cGVkZWYgJycgaGFzIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi5fd2l0aEFyZ3VtZW50c0RlZmF1bHRWYWx1ZUluUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JDYW4ndCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBoZXJlIGJlY2F1c2UgYW55IGRlZmF1bHQgdmFsdWVzIG9mICcnIHdvdWxkIGJlIHVzZWQgaW5zdGVhZC5fd2l0aEFyZ3VtZW50c0RlZmVycmVkUHJlZml4RHVwbGljYXRlZENhbid0IHVzZSB0aGUgbmFtZSAnJyBmb3IgYSBkZWZlcnJlZCBsaWJyYXJ5LCBhcyB0aGUgbmFtZSBpcyB1c2VkIGVsc2V3aGVyZS5fd2l0aEFyZ3VtZW50c0RlZmVycmVkUHJlZml4RHVwbGljYXRlZENhdXNlJyBpcyB1c2VkIGhlcmUuX3dpdGhBcmd1bWVudHNEZWZlcnJlZFR5cGVBbm5vdGF0aW9uJyBpcyBkZWZlcnJlZCBsb2FkZWQgdmlhIHByZWZpeCAnJyBhbmQgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgYW5ub3RhdGlvbi5UcnkgcmVtb3ZpbmcgJ2RlZmVycmVkJyBmcm9tIHRoZSBpbXBvcnQgb2YgJycgb3IgdXNlIGEgc3VwZXJ0eXBlIG9mICcnIHRoYXQgaXNuJ3QgZGVmZXJyZWQuX3dpdGhBcmd1bWVudHNEaWxsT3V0bGluZVN1bW1hcnljb3VudDJfbnVtMV9udW0yX251bTNObyBjb3VudCBwcm92aWRlZE5vIG51bWJlciBwcm92aWRlZG51bTFudW0ybnVtM0luZGV4ZWQgIGxpYnJhcmllcyAoIGJ5dGVzKSBpbiBtcywgdGhhdCBpcywKIGJ5dGVzL21zLCBhbmQKIG1zL2xpYnJhcmllcy5fd2l0aEFyZ3VtZW50c0RpcmVjdEN5Y2xlSW5UeXBlVmFyaWFibGVzJyBjYW4ndCB1c2UgaXRzZWxmIGFzIGEgYm91bmQuX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50VGhlIGxhYmVsICcnIHdhcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBzd2l0Y2ggc3RhdGVtZW50Ll93aXRoQXJndW1lbnRzRHVwbGljYXRlZERlY2xhcmF0aW9uJyBpcyBhbHJlYWR5IGRlY2xhcmVkIGluIHRoaXMgc2NvcGUuX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZVByZXZpb3VzIGRlY2xhcmF0aW9uIG9mICdfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWREZWNsYXJhdGlvblN5bnRoZXRpY0NhdXNlJyBpcyBpbXBsaWVkIGJ5IHRoaXMgZGVmaW5pdGlvbi5fd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWREZWNsYXJhdGlvblVzZScgYmVjYXVzZSBpdCBpcyBkZWNsYXJlZCBtb3JlIHRoYW4gb25jZS5fd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRFeHBvcnR1cmkyX3VyaTInIGlzIGV4cG9ydGVkIGZyb20gYm90aCAnX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRXhwb3J0SW5UeXBlX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkSW1wb3J0JyBpcyBpbXBvcnRlZCBmcm9tIGJvdGggJ193aXRoQXJndW1lbnRzRHVwbGljYXRlZEltcG9ydEluVHlwZV93aXRoQXJndW1lbnRzRHVwbGljYXRlZExpYnJhcnlFeHBvcnRBIGxpYnJhcnkgd2l0aCBuYW1lICcnIGlzIGV4cG9ydGVkIG1vcmUgdGhhbiBvbmNlLl93aXRoQXJndW1lbnRzRHVwbGljYXRlZExpYnJhcnlFeHBvcnRDb250ZXh0JyBpcyBhbHNvIGV4cG9ydGVkIGhlcmUuX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTGlicmFyeUltcG9ydCcgaXMgaW1wb3J0ZWQgbW9yZSB0aGFuIG9uY2UuX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTGlicmFyeUltcG9ydENvbnRleHQnIGlzIGFsc28gaW1wb3J0ZWQgaGVyZS5fd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRNb2RpZmllclRoZSBtb2RpZmllciAnJyB3YXMgYWxyZWFkeSBzcGVjaWZpZWQuX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2FuJ3QgZGVjbGFyZSAnJyBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBzY29wZS5fd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZVByZXZpb3VzIHVzZSBvZiAnX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTmFtZWRBcmd1bWVudER1cGxpY2F0ZWQgbmFtZWQgYXJndW1lbnQgJ193aXRoQXJndW1lbnRzRHVwbGljYXRlZFBhcmFtZXRlck5hbWVEdXBsaWNhdGVkIHBhcmFtZXRlciBuYW1lICdfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2VPdGhlciBwYXJhbWV0ZXIgbmFtZWQgJ193aXRoQXJndW1lbnRzRW51bUNvbnN0YW50U2FtZU5hbWVBc0VuY2xvc2luZ05hbWUgb2YgZW51bSBjb25zdGFudCAnJyBjYW4ndCBiZSB0aGUgc2FtZSBhcyB0aGUgZW51bSdzIG93biBuYW1lLl93aXRoQXJndW1lbnRzRXhwZWN0ZWRBZnRlckJ1dEdvdEV4cGVjdGVkICcnIGFmdGVyIHRoaXMuX3dpdGhBcmd1bWVudHNFeHBlY3RlZEJ1dEdvdCcgYmVmb3JlIHRoaXMuX3dpdGhBcmd1bWVudHNFeHBlY3RlZENsYXNzTWVtYmVyRXhwZWN0ZWQgYSBjbGFzcyBtZW1iZXIsIGJ1dCBnb3QgJ193aXRoQXJndW1lbnRzRXhwZWN0ZWRDbGFzc09yTWl4aW5Cb2R5QSAgbXVzdCBoYXZlIGEgYm9keSwgZXZlbiBpZiBpdCBpcyBlbXB0eS5fd2l0aEFyZ3VtZW50c0V4cGVjdGVkRGVjbGFyYXRpb25FeHBlY3RlZCBhIGRlY2xhcmF0aW9uLCBidXQgZ290ICdfd2l0aEFyZ3VtZW50c0V4cGVjdGVkRW51bUJvZHlFeHBlY3RlZCBhIGVudW0gYm9keSwgYnV0IGdvdCAnX3dpdGhBcmd1bWVudHNFeHBlY3RlZEZ1bmN0aW9uQm9keUV4cGVjdGVkIGEgZnVuY3Rpb24gYm9keSwgYnV0IGdvdCAnX3dpdGhBcmd1bWVudHNFeHBlY3RlZElkZW50aWZpZXJFeHBlY3RlZCBhbiBpZGVudGlmaWVyLCBidXQgZ290ICdfd2l0aEFyZ3VtZW50c0V4cGVjdGVkSW5zdGVhZCcgaW5zdGVhZCBvZiB0aGlzLl93aXRoQXJndW1lbnRzRXhwZWN0ZWRTdHJpbmdFeHBlY3RlZCBhIFN0cmluZywgYnV0IGdvdCAnX3dpdGhBcmd1bWVudHNFeHBlY3RlZFRva2VuRXhwZWN0ZWQgdG8gZmluZCAnX3dpdGhBcmd1bWVudHNFeHBlY3RlZFR5cGVFeHBlY3RlZCBhIHR5cGUsIGJ1dCBnb3QgJ193aXRoQXJndW1lbnRzRXhwZXJpbWVudE5vdEVuYWJsZWRUaGlzIHJlcXVpcmVzIHRoZSAnJyBleHBlcmltZW50IHRvIGJlIGVuYWJsZWQuX3dpdGhBcmd1bWVudHNFeHBvcnRIaWRlc0V4cG9ydEV4cG9ydCBvZiAnJyAoZnJvbSAnJykgaGlkZXMgZXhwb3J0IGZyb20gJ193aXRoQXJndW1lbnRzRXh0ZW5kaW5nRW51bScgaXMgYW4gZW51bSBhbmQgY2FuJ3QgYmUgZXh0ZW5kZWQgb3IgaW1wbGVtZW50ZWQuX3dpdGhBcmd1bWVudHNFeHRlbmRpbmdSZXN0cmljdGVkJyBpcyByZXN0cmljdGVkIGFuZCBjYW4ndCBiZSBleHRlbmRlZCBvciBpbXBsZW1lbnRlZC5fd2l0aEFyZ3VtZW50c0V4dHJhbmVvdXNNb2RpZmllckNhbid0IGhhdmUgbW9kaWZpZXIgJ1RyeSByZW1vdmluZyAnX3dpdGhBcmd1bWVudHNGYXN0YUNMSUFyZ3VtZW50UmVxdWlyZWRFeHBlY3RlZCB2YWx1ZSBhZnRlciAnX3dpdGhBcmd1bWVudHNGZmlEYXJ0VHlwZU1pc21hdGNoJyB0byBiZSBhIHN1YnR5cGUgb2YgJ193aXRoQXJndW1lbnRzRmZpRXh0ZW5kc09ySW1wbGVtZW50c1NlYWxlZENsYXNzJyBjYW5ub3QgYmUgZXh0ZW5kZWQgb3IgaW1wbGVtZW50ZWQuX3dpdGhBcmd1bWVudHNGZmlGaWVsZEFubm90YXRpb25GaWVsZCAnJyByZXF1aXJlcyBleGFjdGx5IG9uZSBhbm5vdGF0aW9uIHRvIGRlY2xhcmUgaXRzIEMrKyB0eXBlLCB3aGljaCBjYW5ub3QgYmUgVm9pZC4gZGFydDpmZmkgU3RydWN0cyBjYW5ub3QgaGF2ZSByZWd1bGFyIERhcnQgZmllbGRzLl93aXRoQXJndW1lbnRzRmZpRmllbGRJbml0aWFsaXplcicgaXMgYSBkYXJ0OmZmaSBQb2ludGVyIHRvIGEgc3RydWN0IGZpZWxkIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjb25zdHJ1Y3RvciBleGVjdXRpb24uX3dpdGhBcmd1bWVudHNGZmlGaWVsZE5vQW5ub3RhdGlvbicgcmVxdWlyZXMgbm8gYW5ub3RhdGlvbiB0byBkZWNsYXJlIGl0cyBDKysgdHlwZSwgaXQgaXMgYSBQb2ludGVyIHdoaWNoIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBzYW1lIHR5cGUgaW4gRGFydCBhbmQgQysrLl93aXRoQXJndW1lbnRzRmZpTm90U3RhdGljIGV4cGVjdHMgYSBzdGF0aWMgZnVuY3Rpb24gYXMgcGFyYW1ldGVyLiBkYXJ0OmZmaSBvbmx5IHN1cHBvcnRzIGNhbGxpbmcgc3RhdGljIERhcnQgZnVuY3Rpb25zIGZyb20gYy5fd2l0aEFyZ3VtZW50c0ZmaVN0cnVjdEdlbmVyaWNTdHJ1Y3QgJycgc2hvdWxkIG5vdCBiZSBnZW5lcmljLl93aXRoQXJndW1lbnRzRmZpVHlwZUludmFsaWRFeHBlY3RlZCB0eXBlICcnIHRvIGJlIGEgdmFsaWQgYW5kIGluc3RhbnRpYXRlZCBzdWJ0eXBlIG9mICdOYXRpdmVUeXBlJy5fd2l0aEFyZ3VtZW50c0ZmaVR5cGVNaXNtYXRjaF90eXBlM3R5cGUzUGFydHN0eXBlMycgdG8gYmUgJycsIHdoaWNoIGlzIHRoZSBEYXJ0IHR5cGUgY29ycmVzcG9uZGluZyB0byAnX3dpdGhBcmd1bWVudHNGZmlUeXBlVW5zaXplZE1ldGhvZCAnJyBjYW5ub3QgYmUgY2FsbGVkIG9uIHNvbWV0aGluZyBvZiB0eXBlICcnIGFzIHRoaXMgdHlwZSBpcyB1bnNpemVkLl93aXRoQXJndW1lbnRzRmZpV3JvbmdTdHJ1Y3RJbmhlcml0YW5jZScgbXVzdCBpbmhlcml0IGZyb20gJ1N0cnVjdDw+Jy5fd2l0aEFyZ3VtZW50c0ZpbmFsRmllbGROb3RJbml0aWFsaXplZEZpbmFsIGZpZWxkICcnIGlzIG5vdCBpbml0aWFsaXplZC5fd2l0aEFyZ3VtZW50c0ZpbmFsRmllbGROb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3InIGlzIG5vdCBpbml0aWFsaXplZCBieSB0aGlzIGNvbnN0cnVjdG9yLl93aXRoQXJndW1lbnRzRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplclRoZSBmaW5hbCB2YXJpYWJsZSAnX3dpdGhBcmd1bWVudHNGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWQnIGlzIGEgZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLl93aXRoQXJndW1lbnRzRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkQ2F1c2UnIHdhcyBpbml0aWFsaXplZCBoZXJlLl93aXRoQXJndW1lbnRzRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlQSB2YWx1ZSBvZiB0eXBlICcnIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnX3dpdGhBcmd1bWVudHNGb3JJbkxvb3BUeXBlTm90SXRlcmFibGUnIHVzZWQgaW4gdGhlICdmb3InIGxvb3AgbXVzdCBpbXBsZW1lbnQgJ193aXRoQXJndW1lbnRzR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnRVbmV4cGVjdGVkIGdlbmVyaWMgZnVuY3Rpb24gdHlwZSAnJyBpbmZlcnJlZCBhcyBhIHR5cGUgYXJndW1lbnQuX3dpdGhBcmd1bWVudHNHZXR0ZXJOb3RGb3VuZEdldHRlciBub3QgZm91bmQ6ICdfd2l0aEFyZ3VtZW50c0lsbGVnYWxNaXhpbicgY2FuJ3QgYmUgbWl4ZWQgaW4uX3dpdGhBcmd1bWVudHNJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9ycycgYXMgYSBtaXhpbiBiZWNhdXNlIGl0IGhhcyBjb25zdHJ1Y3RvcnMuX3dpdGhBcmd1bWVudHNJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0NhdXNlVGhpcyBjb25zdHJ1Y3RvciBwcmV2ZW50cyB1c2luZyAnJyBhcyBhIG1peGluLl93aXRoQXJndW1lbnRzSWxsZWdhbFJlY3Vyc2l2ZVR5cGVJbGxlZ2FsIHJlY3Vyc2l2ZSB0eXBlICdfd2l0aEFyZ3VtZW50c0ltcGxlbWVudHNSZXBlYXRlZCcgY2FuIG9ubHkgYmUgaW1wbGVtZW50ZWQgb25jZS5UcnkgcmVtb3ZpbmcgIG9mIHRoZSBvY2N1cnJlbmNlcy5fd2l0aEFyZ3VtZW50c0ltcGxlbWVudHNTdXBlckNsYXNzJyBjYW4ndCBiZSB1c2VkIGluIGJvdGggJ2V4dGVuZHMnIGFuZCAnaW1wbGVtZW50cycgY2xhdXNlcy5fd2l0aEFyZ3VtZW50c0ltcGxpY2l0Q2FsbE9mTm9uTWV0aG9kQ2Fubm90IGludm9rZSBhbiBpbnN0YW5jZSBvZiAnJyBiZWNhdXNlIGl0IGRlY2xhcmVzICdjYWxsJyB0byBiZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIG1ldGhvZC5fd2l0aEFyZ3VtZW50c0ltcGxpY2l0TWl4aW5PdmVycmlkZUNvbnRleHRPdmVycmlkZSB3YXMgaW50cm9kdWNlZCB3aGVuIHRoZSBtaXhpbiAnJyB3YXMgYXBwbGllZCB0byAnX3dpdGhBcmd1bWVudHNJbXBvcnRIaWRlc0ltcG9ydEltcG9ydCBvZiAnJykgaGlkZXMgaW1wb3J0IGZyb20gJ193aXRoQXJndW1lbnRzSW5jb21wYXRpYmxlUmVkaXJlY3RlZUZ1bmN0aW9uVHlwZVRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0eXBlICcnIGlzbid0IGEgc3VidHlwZSBvZiAnX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRUeXBlIGFyZ3VtZW50ICcnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJycgb2YgdGhlIHR5cGUgdmFyaWFibGUgJ193aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5SZXR1cm5UeXBlJyBpbiB0aGUgcmV0dXJuIHR5cGUuX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZW5hbWUzbmFtZTQnIGluIHRoZSBzdXBlcnR5cGUgJycgb2YgY2xhc3MgJ193aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGVJbmZlcnJlZEluZmVycmVkIHR5cGUgYXJndW1lbnQgJ193aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5mZXJyZWRfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkSW5mZXJyZWRfd2l0aEFyZ3VtZW50c0luZmVycmVkUGFja2FnZVVyaUludGVycHJldGluZyB0aGlzIGFzIHBhY2thZ2UgVVJJLCAnX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkVHJpZWQgdG8gaW5pdGlhbGl6ZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gKCksIGJ1dCB0aGUgZmlsZSB3YXMgbm90IHNlbGYtY29udGFpbmVkLiBUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LgpJZiB5b3UgYXJlIGNvbWZvcnRhYmxlIHdpdGggaXQsIGl0IHdvdWxkIGltcHJvdmUgdGhlIGNoYW5jZXMgb2YgZml4aW5nIGFueSBidWcgaWYgeW91IGluY2x1ZGVkIHRoZSBmaWxlICBpbiB5b3VyIGVycm9yIHJlcG9ydCwgYnV0IGJlIGF3YXJlIHRoYXQgdGhpcyBmaWxlIGluY2x1ZGVzIHlvdXIgc291cmNlIGNvZGUuCkVpdGhlciB3YXksIHlvdSBzaG91bGQgcHJvYmFibHkgZGVsZXRlIHRoZSBmaWxlIHNvIGl0IGRvZXNuJ3QgdXNlIHVubmVjZXNzYXJ5IGRpc2sgc3BhY2UuX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wKSwgYnV0IHRoZSBmaWxlIHdhcyBub3Qgc2VsZi1jb250YWluZWQuIFRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbSksIGJ1dCBjb3VsZG4ndC4KRXJyb3IgbWVzc2FnZSB3YXMgJycuClN0YWNrdHJhY2UgaW5jbHVkZWQgJycuClRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuCklmIHlvdSBhcmUgY29tZm9ydGFibGUgd2l0aCBpdCwgaXQgd291bGQgaW1wcm92ZSB0aGUgY2hhbmNlcyBvZiBmaXhpbmcgYW55IGJ1ZyBpZiB5b3UgaW5jbHVkZWQgdGhlIGZpbGUgX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbU5vRHVtcCcuClRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuX3dpdGhBcmd1bWVudHNJbml0aWFsaXplckZvclN0YXRpY0ZpZWxkJyBpc24ndCBhbiBpbnN0YW5jZSBmaWVsZCBvZiB0aGlzIGNsYXNzLl93aXRoQXJndW1lbnRzSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3JPbmx5IGNvbnN0cnVjdG9ycyBjYW4gaGF2ZSBpbml0aWFsaXplcnMsIGFuZCAnJyBpcyBub3QgYSBjb25zdHJ1Y3Rvci5fd2l0aEFyZ3VtZW50c0luaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaFRoZSB0eXBlIG9mIHBhcmFtZXRlciAnJywgJycgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCdzIHR5cGUsICdUcnkgY2hhbmdpbmcgdGhlIHR5cGUgb2YgcGFyYW1ldGVyICcnIHRvIGEgc3VidHlwZSBvZiAnX3dpdGhBcmd1bWVudHNJbnB1dEZpbGVOb3RGb3VuZElucHV0IGZpbGUgbm90IGZvdW5kOiBfd2l0aEFyZ3VtZW50c0ludGVnZXJMaXRlcmFsSXNPdXRPZlJhbmdlVGhlIGludGVnZXIgbGl0ZXJhbCAgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgaW4gNjQgYml0cy5fd2l0aEFyZ3VtZW50c0ludGVyZmFjZUNoZWNrQ29udGV4dEJvdGggbWVtYmVycyBhcmUgaW5oZXJpdGVkIGJ5IHRoZSBub24tYWJzdHJhY3QgY2xhc3MgJ193aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtQ29uc3RydWN0b3JOb3RGb3VuZE5vIGNvbnN0cnVjdG9yIG5hbWVkICcnIGluICdfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbUNvbnRleHRTZXZlcml0eU5vbi1jb250ZXh0IG1lc3NhZ2UgaGFzIGNvbnRleHQgc2V2ZXJpdHk6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtRGVidWdBYm9ydENvbXBpbGF0aW9uIGFib3J0ZWQgZHVlIHRvIGZhdGFsICcnIGF0Ogpfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbU5vSW5mZXJyZWRUeXBlU3RvcmVkVGhlcmUncyBubyBpbmZlcnJlZCB0eXBlIGZvciAnX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZENvdWxkbid0IGZpbmQgJ193aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbl93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzQ2FuJ3QgYWNjZXNzIHByaXZhdGUgY29uc3RydWN0b3IgJ193aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eS5zdGFjayBpc24ndCBlbXB0eToKICBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVN0b3JpbmdNdWx0aXBsZUluZmVycmVkVHlwZXNUaGVyZSdzIGFscmVhZHkgYW4gaW5mZXJyZWQgdHlwZSwgJycsIGZvciAnX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkJywgYnV0IGdvdCAnX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWRVbmhhbmRsZWQgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkVW5pbXBsZW1lbnRlZCBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAnX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VcmlNaXNzaW5nU2NoZW1lVGhlIFVSSSAnJyBoYXMgbm8gc2NoZW1lLl93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVmVyaWZpY2F0aW9uRXJyb3JWZXJpZmljYXRpb24gb2YgdGhlIGdlbmVyYXRlZCBwcm9ncmFtIGZhaWxlZDoKX3dpdGhBcmd1bWVudHNJbnRlcnNlY3Rpb25UeXBlQXNUeXBlQXJndW1lbnQnLCBpdCBjYW4gYmUgZWl0aGVyICcnIG9yICdfd2l0aEFyZ3VtZW50c0ludmFsaWRBc3NpZ25tZW50VHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHRoZSBsZWZ0IGhhbmQgc2lkZSwgb3IgY2FzdGluZyB0aGUgcmlnaHQgaGFuZCBzaWRlIHRvICdfd2l0aEFyZ3VtZW50c0ludmFsaWRCcmVha1RhcmdldF93aXRoQXJndW1lbnRzSW52YWxpZENhc3RGdW5jdGlvbkV4cHJUaGUgZnVuY3Rpb24gZXhwcmVzc2lvbiB0eXBlICcnIGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJ193aXRoQXJndW1lbnRzSW52YWxpZENhc3RMaXRlcmFsTGlzdFRoZSBsaXN0IGxpdGVyYWwgdHlwZSAnX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdExpdGVyYWxNYXBUaGUgbWFwIGxpdGVyYWwgdHlwZSAnX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdExpdGVyYWxTZXRUaGUgc2V0IGxpdGVyYWwgdHlwZSAnX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb25UaGUgbG9jYWwgZnVuY3Rpb24gaGFzIHR5cGUgJycgdGhhdCBpc24ndCBvZiBleHBlY3RlZCB0eXBlICdfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TmV3RXhwclRoZSBjb25zdHJ1Y3RvciByZXR1cm5zIHR5cGUgJ193aXRoQXJndW1lbnRzSW52YWxpZENhc3RTdGF0aWNNZXRob2RUaGUgc3RhdGljIG1ldGhvZCBoYXMgdHlwZSAnX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb25UaGUgdG9wIGxldmVsIGZ1bmN0aW9uIGhhcyB0eXBlICdfd2l0aEFyZ3VtZW50c0ludmFsaWRDb250aW51ZVRhcmdldF93aXRoQXJndW1lbnRzSW52YWxpZE9wZXJhdG9yVGhlIHN0cmluZyAnJyBpc24ndCBhIHVzZXItZGVmaW5hYmxlIG9wZXJhdG9yLl93aXRoQXJndW1lbnRzSW52YWxpZFBhY2thZ2VVcmlJbnZhbGlkIHBhY2thZ2UgVVJJICdfd2l0aEFyZ3VtZW50c0ludm9rZU5vbkZ1bmN0aW9uJyBpc24ndCBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBhbmQgY2FuJ3QgYmUgaW52b2tlZC5fd2l0aEFyZ3VtZW50c0xhYmVsTm90Rm91bmRDYW4ndCBmaW5kIGxhYmVsICdfd2l0aEFyZ3VtZW50c0xvYWRMaWJyYXJ5SGlkZXNNZW1iZXJUaGUgbGlicmFyeSAnJyBkZWZpbmVzIGEgdG9wLWxldmVsIG1lbWJlciBuYW1lZCAnbG9hZExpYnJhcnknLiBUaGlzIG1lbWJlciBpcyBoaWRkZW4gYnkgdGhlIHNwZWNpYWwgbWVtYmVyICdsb2FkTGlicmFyeScgdGhhdCB0aGUgbGFuZ3VhZ2UgYWRkcyB0byBzdXBwb3J0IGRlZmVycmVkIGxvYWRpbmcuX3dpdGhBcmd1bWVudHNMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydExvY2FsIGRlZmluaXRpb24gb2YgJycgaGlkZXMgZXhwb3J0IGZyb20gJ193aXRoQXJndW1lbnRzTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnQnIGhpZGVzIGltcG9ydCBmcm9tICdfd2l0aEFyZ3VtZW50c01ldGhvZE5vdEZvdW5kTWV0aG9kIG5vdCBmb3VuZDogJ193aXRoQXJndW1lbnRzTWlzc2luZ0V4cGxpY2l0VHlwZUFyZ3VtZW50c05vIHR5cGUgYXJndW1lbnRzIHByb3ZpZGVkLCAgcG9zc2libGUuX3dpdGhBcmd1bWVudHNNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZScgaXMgZGVmaW5lZCBoZXJlLl93aXRoQXJndW1lbnRzTWlzc2luZ0ltcGxlbWVudGF0aW9uTm90QWJzdHJhY3RfbmFtZXNObyBuYW1lcyBwcm92aWRlZFRoZSBub24tYWJzdHJhY3QgY2xhc3MgJycgaXMgbWlzc2luZyBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZXNlIG1lbWJlcnM6Cl93aXRoQXJndW1lbnRzTWlzc2luZ1BhcnRPZicgYXMgYSBwYXJ0LCBiZWNhdXNlIGl0IGhhcyBubyAncGFydCBvZicgZGVjbGFyYXRpb24uX3dpdGhBcmd1bWVudHNNaXhpbkFwcGxpY2F0aW9uSW5jb21wYXRpYmxlU3VwZXJ0eXBlJyBkb2Vzbid0IGltcGxlbWVudCAnJyBzbyBpdCBjYW4ndCBiZSB1c2VkIHdpdGggJ193aXRoQXJndW1lbnRzTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3NUeXBlIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIGluZmVycmVkIGZvciB0aGUgbWl4aW4gJycgYmVjYXVzZSAnJyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG1peGluJ3Mgc3VwZXJ0eXBlIGNvbnN0cmFpbnQgJ193aXRoQXJndW1lbnRzTW9kaWZpZXJPdXRPZk9yZGVyJyBzaG91bGQgYmUgYmVmb3JlIHRoZSBtb2RpZmllciAnX3dpdGhBcmd1bWVudHNOYW1lZE1peGluT3ZlcnJpZGVDb250ZXh0T3ZlcnJpZGUgd2FzIGludHJvZHVjZWQgaW4gdGhlIG1peGluIGFwcGxpY2F0aW9uIGNsYXNzICdfd2l0aEFyZ3VtZW50c05vRm9ybWFsc1RyeSBhZGRpbmcgJygpJyBhZnRlciAnJywgb3IgYWRkICdnZXQnIGJlZm9yZSAnJyB0byBkZWNsYXJlIGEgZ2V0dGVyLl93aXRoQXJndW1lbnRzTm9TdWNoTmFtZWRQYXJhbWV0ZXJObyBuYW1lZCBwYXJhbWV0ZXIgd2l0aCB0aGUgbmFtZSAnX3dpdGhBcmd1bWVudHNOb25Bc2NpaUlkZW50aWZpZXJjaGFyYWN0ZXJydW5lc05vdCBhIGNoYXJhY3RlciAnVGhlIG5vbi1BU0NJSSBjaGFyYWN0ZXIgJycgKCkgY2FuJ3QgYmUgdXNlZCBpbiBpZGVudGlmaWVycywgb25seSBpbiBzdHJpbmdzIGFuZCBjb21tZW50cy5fd2l0aEFyZ3VtZW50c05vbkFzY2lpV2hpdGVzcGFjZVRoZSBub24tQVNDSUkgc3BhY2UgY2hhcmFjdGVyIF93aXRoQXJndW1lbnRzTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2VCb3VuZCBvZiB0aGlzIHZhcmlhYmxlIHJlZmVyZW5jZXMgcmF3IHR5cGUgJ193aXRoQXJndW1lbnRzTm9uU2ltcGxlQm91bmRWaWFWYXJpYWJsZUJvdW5kIG9mIHRoaXMgdmFyaWFibGUgcmVmZXJlbmNlcyB2YXJpYWJsZSAnJyBmcm9tIHRoZSBzYW1lIGRlY2xhcmF0aW9uLl93aXRoQXJndW1lbnRzTm90QVByZWZpeEluVHlwZUFubm90YXRpb24nIGNhbid0IGJlIHVzZWQgYXMgYSB0eXBlIGJlY2F1c2UgJycgZG9lc24ndCByZWZlciB0byBhbiBpbXBvcnQgcHJlZml4Ll93aXRoQXJndW1lbnRzTm90QVR5cGUnIGlzbid0IGEgdHlwZS5fd2l0aEFyZ3VtZW50c05vdEJpbmFyeU9wZXJhdG9yJyBpc24ndCBhIGJpbmFyeSBvcGVyYXRvci5fd2l0aEFyZ3VtZW50c05vdENvbnN0YW50RXhwcmVzc2lvbiBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uLl93aXRoQXJndW1lbnRzT3BlcmF0b3JNaW51c1BhcmFtZXRlck1pc21hdGNoT3BlcmF0b3IgJycgc2hvdWxkIGhhdmUgemVybyBvciBvbmUgcGFyYW1ldGVyLl93aXRoQXJndW1lbnRzT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDAnIHNob3VsZG4ndCBoYXZlIGFueSBwYXJhbWV0ZXJzLl93aXRoQXJndW1lbnRzT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDEnIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlci5fd2l0aEFyZ3VtZW50c09wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gyJyBzaG91bGQgaGF2ZSBleGFjdGx5IHR3byBwYXJhbWV0ZXJzLl93aXRoQXJndW1lbnRzT3ZlcnJpZGRlbk1ldGhvZENhdXNlVGhpcyBpcyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QgKCcnKS5fd2l0aEFyZ3VtZW50c092ZXJyaWRlRmV3ZXJOYW1lZEFyZ3VtZW50cycgaGFzIGZld2VyIG5hbWVkIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICdfd2l0aEFyZ3VtZW50c092ZXJyaWRlRmV3ZXJQb3NpdGlvbmFsQXJndW1lbnRzJyBoYXMgZmV3ZXIgcG9zaXRpb25hbCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnX3dpdGhBcmd1bWVudHNPdmVycmlkZU1pc21hdGNoTmFtZWRQYXJhbWV0ZXInIGRvZXNuJ3QgaGF2ZSB0aGUgbmFtZWQgcGFyYW1ldGVyICcnIG9mIG92ZXJyaWRkZW4gbWV0aG9kICdfd2l0aEFyZ3VtZW50c092ZXJyaWRlTW9yZVJlcXVpcmVkQXJndW1lbnRzJyBoYXMgbW9yZSByZXF1aXJlZCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnX3dpdGhBcmd1bWVudHNPdmVycmlkZVR5cGVNaXNtYXRjaFBhcmFtZXRlclRoZSBwYXJhbWV0ZXIgJycgb2YgdGhlIG1ldGhvZCAnJyBoYXMgdHlwZSAnJywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSwgJycsIGluIHRoZSBvdmVycmlkZGVuIG1ldGhvZCwgJ0NoYW5nZSB0byBhIHN1cGVydHlwZSBvZiAnJywgb3IsIGZvciBhIGNvdmFyaWFudCBwYXJhbWV0ZXIsIGEgc3VidHlwZS5fd2l0aEFyZ3VtZW50c092ZXJyaWRlVHlwZU1pc21hdGNoUmV0dXJuVHlwZVRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kICcnIGlzICcnLCB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUsICcnLCBvZiB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsICdDaGFuZ2UgdG8gYSBzdWJ0eXBlIG9mICdfd2l0aEFyZ3VtZW50c092ZXJyaWRlVHlwZVZhcmlhYmxlc01pc21hdGNoRGVjbGFyZWQgdHlwZSB2YXJpYWJsZXMgb2YgJycgZG9lc24ndCBtYXRjaCB0aG9zZSBvbiBvdmVycmlkZGVuIG1ldGhvZCAnX3dpdGhBcmd1bWVudHNQYWNrYWdlTm90Rm91bmRDb3VsZCBub3QgcmVzb2x2ZSB0aGUgcGFja2FnZSAnX3dpdGhBcmd1bWVudHNQYWNrYWdlc0ZpbGVGb3JtYXRQcm9ibGVtIGluIHBhY2thZ2VzIGNvbmZpZ3VyYXRpb24gZmlsZTogX3dpdGhBcmd1bWVudHNQYXJ0T2ZJbkxpYnJhcnlDYW4ndCBpbXBvcnQgJycsIGJlY2F1c2UgaXQgaGFzIGEgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLlRyeSByZW1vdmluZyB0aGUgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLCBvciB1c2luZyAnJyBhcyBhIHBhcnQuX3dpdGhBcmd1bWVudHNQYXJ0T2ZMaWJyYXJ5TmFtZU1pc21hdGNoVXNpbmcgJycgYXMgcGFydCBvZiAnJyBidXQgaXRzICdwYXJ0IG9mJyBkZWNsYXJhdGlvbiBzYXlzICdfd2l0aEFyZ3VtZW50c1BhcnRPZlVyaU1pc21hdGNodXJpM191cmkzX3dpdGhBcmd1bWVudHNQYXJ0T2ZVc2VVcmlfd2l0aEFyZ3VtZW50c1BhcnRUd2ljZScgYXMgYSBwYXJ0IG1vcmUgdGhhbiBvbmNlLl93aXRoQXJndW1lbnRzUGF0Y2hJbmplY3Rpb25GYWlsZWRDYW4ndCBpbmplY3QgJycgaW50byAnX3dpdGhBcmd1bWVudHNSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnQnIGRvZXNuJ3QgZXh0ZW5kICdfd2l0aEFyZ3VtZW50c1JlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmRSZWRpcmVjdGlvbiBjb25zdHJ1Y3RvciB0YXJnZXQgbm90IGZvdW5kOiAnX3dpdGhBcmd1bWVudHNTZGtSb290Tm90Rm91bmRTREsgcm9vdCBkaXJlY3Rvcnkgbm90IGZvdW5kOiBfd2l0aEFyZ3VtZW50c1Nka1NwZWNpZmljYXRpb25Ob3RGb3VuZFNESyBsaWJyYXJpZXMgc3BlY2lmaWNhdGlvbiBub3QgZm91bmQ6IF93aXRoQXJndW1lbnRzU2RrU3VtbWFyeU5vdEZvdW5kU0RLIHN1bW1hcnkgbm90IGZvdW5kOiBfd2l0aEFyZ3VtZW50c1NldHRlck5vdEZvdW5kU2V0dGVyIG5vdCBmb3VuZDogJ193aXRoQXJndW1lbnRzU291cmNlQm9keVN1bW1hcnlCdWlsdCBib2RpZXMgZm9yICBjb21waWxhdGlvbiB1bml0cyAoIG1zL2NvbXBpbGF0aW9uIHVuaXQuX3dpdGhBcmd1bWVudHNTb3VyY2VPdXRsaW5lU3VtbWFyeUJ1aWx0IG91dGxpbmVzIGZvciBfd2l0aEFyZ3VtZW50c1NwcmVhZEVsZW1lbnRUeXBlTWlzbWF0Y2hDYW4ndCBhc3NpZ24gc3ByZWFkIGVsZW1lbnRzIG9mIHR5cGUgJycgdG8gY29sbGVjdGlvbiBlbGVtZW50cyBvZiB0eXBlICdfd2l0aEFyZ3VtZW50c1NwcmVhZE1hcEVudHJ5RWxlbWVudEtleVR5cGVNaXNtYXRjaENhbid0IGFzc2lnbiBzcHJlYWQgZW50cnkga2V5cyBvZiB0eXBlICcnIHRvIG1hcCBlbnRyeSBrZXlzIG9mIHR5cGUgJ193aXRoQXJndW1lbnRzU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2hDYW4ndCBhc3NpZ24gc3ByZWFkIGVudHJ5IHZhbHVlcyBvZiB0eXBlICcnIHRvIG1hcCBlbnRyeSB2YWx1ZXMgb2YgdHlwZSAnX3dpdGhBcmd1bWVudHNTcHJlYWRNYXBFbnRyeVR5cGVNaXNtYXRjaFVuZXhwZWN0ZWQgdHlwZSAnJyBvZiBhIG1hcCBzcHJlYWQgZW50cnkuICBFeHBlY3RlZCAnZHluYW1pYycgb3IgYSBNYXAuX3dpdGhBcmd1bWVudHNTcHJlYWRUeXBlTWlzbWF0Y2gnIG9mIGEgc3ByZWFkLiAgRXhwZWN0ZWQgJ2R5bmFtaWMnIG9yIGFuIEl0ZXJhYmxlLl93aXRoQXJndW1lbnRzU3VwZXJjbGFzc0hhc05vQ29uc3RydWN0b3JTdXBlcmNsYXNzIGhhcyBubyBjb25zdHJ1Y3RvciBuYW1lZCAnX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3JUaGUgc3VwZXJjbGFzcywgJycsIGhhcyBubyB1bm5hbWVkIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLl93aXRoQXJndW1lbnRzU3VwZXJjbGFzc0hhc05vR2V0dGVyU3VwZXJjbGFzcyBoYXMgbm8gZ2V0dGVyIG5hbWVkICdfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb01ldGhvZFN1cGVyY2xhc3MgaGFzIG5vIG1ldGhvZCBuYW1lZCAnX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9TZXR0ZXJTdXBlcmNsYXNzIGhhcyBubyBzZXR0ZXIgbmFtZWQgJ193aXRoQXJndW1lbnRzU3VwZXJjbGFzc01ldGhvZEFyZ3VtZW50TWlzbWF0Y2hTdXBlcmNsYXNzIGRvZXNuJ3QgaGF2ZSBhIG1ldGhvZCBuYW1lZCAnJyB3aXRoIG1hdGNoaW5nIGFyZ3VtZW50cy5fd2l0aEFyZ3VtZW50c1N1cGVydHlwZUlzSWxsZWdhbCcgY2FuJ3QgYmUgdXNlZCBhcyBzdXBlcnR5cGUuX3dpdGhBcmd1bWVudHNTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZVRoZSB0eXBlIHZhcmlhYmxlICdfd2l0aEFyZ3VtZW50c1N3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlJyBvZiB0aGUgc3dpdGNoIGV4cHJlc3Npb24gaXNuJ3QgYXNzaWduYWJsZSB0byB0aGUgdHlwZSAnJyBvZiB0aGlzIGNhc2UgZXhwcmVzc2lvbi5fd2l0aEFyZ3VtZW50c1RoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXJDYW4ndCBhY2Nlc3MgJ3RoaXMnIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIgdG8gcmVhZCAnX3dpdGhBcmd1bWVudHNUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplckNhbid0IGFjY2VzcyAnJyBpbiBhIGZpZWxkIGluaXRpYWxpemVyLl93aXRoQXJndW1lbnRzVG9vRmV3QXJndW1lbnRzVG9vIGZldyBwb3NpdGlvbmFsIGFyZ3VtZW50czogIHJlcXVpcmVkLCAgZ2l2ZW4uX3dpdGhBcmd1bWVudHNUb29NYW55QXJndW1lbnRzVG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudHM6ICBhbGxvd2VkLCBidXQgIGZvdW5kLl93aXRoQXJndW1lbnRzVHlwZUFyZ3VtZW50TWlzbWF0Y2hFeHBlY3RlZCAgdHlwZSBhcmd1bWVudHMuX3dpdGhBcmd1bWVudHNUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGVDYW4ndCB1c2UgdHlwZSBhcmd1bWVudHMgd2l0aCB0eXBlIHZhcmlhYmxlICdfd2l0aEFyZ3VtZW50c1R5cGVOb3RGb3VuZCcgbm90IGZvdW5kLl93aXRoQXJndW1lbnRzVHlwZU9yaWdpbicgaXMgZnJvbSAnX3dpdGhBcmd1bWVudHNUeXBlT3JpZ2luV2l0aEZpbGVVcmlfd2l0aEFyZ3VtZW50c1R5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lQ2F1c2VUaGUgb3RoZXIgdHlwZSB2YXJpYWJsZSBuYW1lZCAnX3dpdGhBcmd1bWVudHNVbmRlZmluZWRHZXR0ZXJUaGUgZ2V0dGVyICcnIGlzbid0IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgZ2V0dGVyLCBvciBkZWZpbmluZyBhIGdldHRlciBvciBmaWVsZCBuYW1lZCAnX3dpdGhBcmd1bWVudHNVbmRlZmluZWRNZXRob2RUcnkgY29ycmVjdGluZyB0aGUgbmFtZSB0byB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBtZXRob2QsIG9yIGRlZmluaW5nIGEgbWV0aG9kIG5hbWVkICdfd2l0aEFyZ3VtZW50c1VuZGVmaW5lZFNldHRlclRoZSBzZXR0ZXIgJ1RyeSBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIHNldHRlciwgb3IgZGVmaW5pbmcgYSBzZXR0ZXIgb3IgZmllbGQgbmFtZWQgJ193aXRoQXJndW1lbnRzVW5leHBlY3RlZFRva2VuVW5leHBlY3RlZCB0b2tlbiAnX3dpdGhBcmd1bWVudHNVbm1hdGNoZWRUb2tlbkNhbid0IGZpbmQgJycgdG8gbWF0Y2ggJ193aXRoQXJndW1lbnRzVW5yZXNvbHZlZFByZWZpeEluVHlwZUFubm90YXRpb24nIGlzbid0IGRlZmluZWQuX3dpdGhBcmd1bWVudHNVbnNwZWNpZmllZF93aXRoQXJndW1lbnRzVW5zdXBwb3J0ZWRPcGVyYXRvcicgb3BlcmF0b3IgaXMgbm90IHN1cHBvcnRlZC5fd2l0aEFyZ3VtZW50c1VudGVybWluYXRlZFN0cmluZ1N0cmluZyBzdGFydGluZyB3aXRoICBtdXN0IGVuZCB3aXRoIF93aXRoQXJndW1lbnRzVW50cmFuc2xhdGFibGVVcmlOb3QgZm91bmQ6ICdfd2l0aEFyZ3VtZW50c1VzZU9mRGVwcmVjYXRlZElkZW50aWZpZXInIGlzIGRlcHJlY2F0ZWQuX3dpdGhBcmd1bWVudHNXZWJMaXRlcmFsQ2Fubm90QmVSZXByZXNlbnRlZEV4YWN0bHkgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBpbiBKYXZhU2NyaXB0LlRyeSBjaGFuZ2luZyB0aGUgbGl0ZXJhbCB0byBzb21ldGhpbmcgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gSmF2YXNjcmlwdC4gSW4gSmF2YXNjcmlwdCAgaXMgdGhlIG5lYXJlc3QgdmFsdWUgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgZXhhY3RseS5mYXN0YS5zZXZlcml0eWVycm9yTGVnYWN5V2FybmluZ2ludGVybmFsUHJvYmxlbXNldmVyaXR5RW51bU5hbWVzQ09OVEVYVEVSUk9SRVJST1JfTEVHQUNZX1dBUk5JTkdJR05PUkVESU5URVJOQUxfUFJPQkxFTVdBUk5JTkdzZXZlcml0eUVudW1WYWx1ZXNzZXZlcml0eVByZWZpeGVzRXJyb3JJbnRlcm5hbCBwcm9ibGVtV2FybmluZ0NvbnRleHRzZXZlcml0eVRleHRzaW50ZXJuYWwgcHJvYmxlbWZyb250X2VuZC5rZXJuZWxfZ2VuZXJhdG9yX2ltcGx3aXRoQ3Jhc2hSZXBvcnRpbmdEaWxsVGFyZ2V0S2VybmVsVGFyZ2V0cHJpbnRDb21wb25lbnRUZXh0c2VyaWFsaXplQ29tcG9uZW50dmVyaWZ5Q29tcG9uZW50TG9hZGVyQ29tcGlsZXJSZXN1bHRkZXBza2VybmVsVGFyZ2V0Rm9yVGVzdGluZ2dlbmVyYXRlS2VybmVsYnVpbGRTdW1tYXJ5YnVpbGRDb21wb25lbnR0cnVuY2F0ZVN1bW1hcnlpbmNsdWRlT2Zmc2V0c3JldGFpbkRhdGFGb3JUZXN0aW5nZnNzb3VyY2VMb2FkZXJ1cmlUcmFuc2xhdG9yZGlsbFRhcmdldGV4dGVybmFsTGlic3RvU2V0ZXhjbHVkZWRsb2FkZXJhcHBlbmRMaWJyYXJpZXNmaWx0ZXJpbnB1dFN1bW1hcnlidWlsZE91dGxpbmVza2VybmVsVGFyZ2V0c2V0RW50cnlQb2ludHNzdW1tYXJ5Q29tcG9uZW50bGlicmFyeUZpbHRlcmlzU291cmNlTGlicmFyeXRyaW1tZWRTdW1tYXJ5Q29tcG9uZW50VHJhbnNmb3JtZWQgb3V0bGluZWluY2x1ZGVTb3VyY2VzR2VuZXJhdGVkIG91dGxpbmVHZW5lcmF0ZWQgY29tcG9uZW50Y3VycmVudFVyaUZvckNyYXNoUmVwb3J0aW5nZmFzdGEuc2Nhbm5lcnVuaWNvZGVSZXBsYWNlbWVudENoYXJhY3RlclJ1bmVMYW5ndWFnZVZlcnNpb25DaGFuZ2VkU2Nhbm5lckNvbmZpZ3VyYXRpb25TdHJpbmdTY2FubmVyVXRmOEJ5dGVzU2Nhbm5lcnNjYW5uZXJSZWNvdmVyeUxhbmd1YWdlVmVyc2lvblRva2VuaXNCaW5hcnlPcGVyYXRvcmlzVGVybmFyeU9wZXJhdG9yaXNVbmFyeU9wZXJhdG9yYnVpbGRVbmV4cGVjdGVkQ2hhcmFjdGVyVG9rZW5FT0ZfVE9LRU5LZXl3b3JkUmVjb3ZlcnRva2Vuc1NjYW5uZXJoYXNFcnJvcnNjb25maWd1cmF0aW9uY29uZmlndG9rZW5pemVTY2FubmVyUmVzdWx0dW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyc2NhbmluY2x1ZGVDb21tZW50c2xhbmd1YWdlVmVyc2lvbkNoYW5nZWRbYnl0ZXNdOiB0aGUgbGFzdCBieXRlIG11c3QgYmUgbnVsbC5zY2FubmVyc2NhblN0cmluZ3NvdXJjZSBtdXN0IG5vdCBiZSBudWxsX3Rva2VuaXplQW5kUmVjb3ZlcmVuY29kZWZhc3RhLnJlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keVN1YnN0aXR1dGlvbkVuc3VyZUxvYWRlZFJlZGlyZWN0aW5nRmFjdG9yeUJvZHlpbnRlcm5hbHVucmVzb2x2ZWR1bnJlc29sdmVkTmFtZWJvZHlFeHByZXNzaW9uZ2V0VmFsdWVyZXN0b3JlRnJvbURpbGxlbmNvZGVUeXBlQXJndW1lbnRzdmFyTmFtZVByZWZpeCN0eXBlQXJnZGVjb2RlVHlwZUFyZ3VtZW50c2VuY29kZWRSZWRpcmVjdGlvblRhcmdldGxldE5hbWVoZWxwZXJpc0xvYWRlZGdldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHlnZXRSZWRpcmVjdGlvblRhcmdldHRvcnRvaXNldG9ydG9pc2VCb2R5aGFyZWVuc3VyZUxvYWRlZGhhcmVCb2R5bmV4dFRvcnRvaXNlbmV4dFR5cGVBcmd1bWVudHNzdWJ0eXBlQXJndW1lbnRDb3VudG5leHRUeXBlQXJndW1lbnRDb3VudEluY3JlbWVudGFsQ29tcGlsZXJ3b3JrZXJJbnB1dENhY2hlaW5jcmVtZW50YWxDb21waWxlcldvcmtlcklucHV0Q29tcG9uZW50ZGlnZXN0ZGlnZXN0c0VxdWFsZnJvbnRfZW5kLmtlcm5lbF9nZW5lcmF0b3JrZXJuZWxGb3JQcm9ncmFtSW50ZXJuYWxwT3B0aW9uc2tlcm5lbEZvckNvbXBvbmVudHNvdXJjZXNmcm9udF9lbmQuc3RhbmRhcmRfZmlsZV9zeXN0ZW1pb2luc3RhbmNlU3RhbmRhcmRGaWxlU3lzdGVtIG9ubHkgc3VwcG9ydHMgZmlsZToqIGFuZCBkYXRhOiogVVJJc19Jb0ZpbGVTeXN0ZW1FbnRpdHlfdG9GaWxlU3lzdGVtRXhjZXB0aW9ub3NNZXNzYWdlY29udGVudEFzQnl0ZXNjb250ZW50QXNTdHJpbmdmb3JjZUJ1aWxkRGlydm1EaXJlY3RvcnkvYmluLy4uLy4uLy4uL2xpYi9faW50ZXJuYWwvdHJhbnNsYXRlU2Rrb3JnLWRhcnRsYW5nLXNkay9zZGsvLi4vc2RrL2xpYi9saWJyYXJpZXMuanNvbnNkay9vcmctZGFydGxhbmctc2RrOi8vL3Nkay9pc0V4aXN0aW5nRmlsZWZhc3RhLm9wZXJhdG9yc09wZXJhdG9yLmFkZE9wZXJhdG9yLmJpdHdpc2VBbmRPcGVyYXRvci5iaXR3aXNlTm90T3BlcmF0b3IuYml0d2lzZU9yT3BlcmF0b3IuYml0d2lzZVhvck9wZXJhdG9yLmRpdmlkZU9wZXJhdG9yLmVxdWFsc09wZXJhdG9yLmdyZWF0ZXJUaGFuT3BlcmF0b3IuZ3JlYXRlclRoYW5FcXVhbHNPcGVyYXRvci5pbmRleEdldE9wZXJhdG9yLmluZGV4U2V0T3BlcmF0b3IubGVmdFNoaWZ0T3BlcmF0b3IubGVzc1RoYW5PcGVyYXRvci5sZXNzVGhhbkVxdWFsc09wZXJhdG9yLm1vZHVsb09wZXJhdG9yLm11bHRpcGx5T3BlcmF0b3IucmlnaHRTaGlmdE9wZXJhdG9yLnRyaXBsZVNoaWZ0T3BlcmF0b3Iuc3VidHJhY3RPcGVyYXRvci50cnVuY2F0aW5nRGl2aWRlT3BlcmF0b3IudW5hcnlNaW51c2JpdHdpc2VBbmRiaXR3aXNlTm90Yml0d2lzZU9yYml0d2lzZVhvcmRpdmlkZWVxdWFsc2dyZWF0ZXJUaGFuZ3JlYXRlclRoYW5FcXVhbHNpbmRleEdldGluZGV4U2V0bGVmdFNoaWZ0bGVzc1RoYW5sZXNzVGhhbkVxdWFsc21vZHVsb211bHRpcGx5cmlnaHRTaGlmdHN1YnRyYWN0dHJ1bmNhdGluZ0RpdmlkZXVuYXJ5TWludXMlPj4+b3BlcmF0b3JUb1N0cmluZ29wZXJhdG9yUmVxdWlyZWRBcmd1bWVudENvdW50ZmFzdGEucGFyc2VyLmFzeW5jX21vZGlmaWVyQXN5bmNNb2RpZmllci5TeW5jQXN5bmNNb2RpZmllci5TeW5jU3RhckFzeW5jTW9kaWZpZXIuQXN5bmNBc3luY01vZGlmaWVyLkFzeW5jU3RhcmZhc3RhLnNjYW5uZXIuY2hhcmFjdGVycyRFT0YkU1RYJEJTJFZUQUIkRkYkU1BBQ0UkQkFORyRQRVJDRU5UJEFNUEVSU0FORCRTUSRPUEVOX1BBUkVOJENMT1NFX1BBUkVOJFNUQVIkUExVUyRDT01NQSRNSU5VUyRQRVJJT0QkU0xBU0gkMSQyJDMkNCQ1JDYkNyQ4JENPTE9OJFNFTUlDT0xPTiRMVCRFUSRHVCRRVUVTVElPTiRBVCRCJEMkRCRFJEYkRyRIJEkkSiRLJEwkTSROJE8kUCRRJFIkUyRUJFUkViRXJFgkWSRPUEVOX1NRVUFSRV9CUkFDS0VUJENMT1NFX1NRVUFSRV9CUkFDS0VUJENBUkVUJEJBQ0tQSU5HJGIkYyRkJGUkZiRoJGkkaiRrJGwkbSRuJG8kcCRxJHIkdCR1JHYkdyR4JHkkT1BFTl9DVVJMWV9CUkFDS0VUJEJBUiRDTE9TRV9DVVJMWV9CUkFDS0VUJFRJTERFJE5CU1AkRklSU1RfU1VSUk9HQVRFJExBU1RfU1VSUk9HQVRFJExBU1RfQ09ERV9QT0lOVGlzRGlnaXRjaGFyYWN0ZXJDb2RlaXNIZXhEaWdpdGhleERpZ2l0VmFsdWVoZXhEaWdpdGlzVW5pY29kZVNjYWxhclZhbHVlaXNVdGYxNkxlYWRTdXJyb2dhdGVpc1V0ZjE2VHJhaWxTdXJyb2dhdGVmYXN0YS51dGlsLmxpbmtMaW5rQnVpbGRlckltcGxlbWVudGF0aW9uTGlua0l0ZXJhdG9yTWFwcGVkTGlua0l0ZXJhYmxlbm8gZWxlbWVudHNlbGVtZW50c2VwYXJhdGVkQnlzbG93TGVuZ3RobGlua2ZubWFwVG9MaXN0cmV2ZXJzZXJldmVyc2VQcmVwZW5kQWxsZnJvbXNraXBJbmRleCAgb3V0IG9mIHJhbmdlTGluay5oYXNoQ29kZWdldDpsZW5ndGhObyBlbGVtZW50c01vcmUgdGhhbiBvbmUgZWxlbWVudGV2ZXJ5X3Vuc3VwcG9ydGVkY2FzdGVsZW1lbnRBdGZpcnN0V2hlcmVvckVsc2Vpbml0aWFsVmFsdWVmb2xsb3dlZEJ5Z2V0Omxhc3RsYXN0V2hlcmVyZWR1Y2VyZXR5cGVzaW5nbGVXaGVyZXNraXBXaGlsZXRha2V0YWtlV2hpbGV3aGVyZVR5cGVtZXRob2RfcmVkaXJlY3RpbmcjI3R5cGVBcmcwZmFzdGEudXRpbC5saW5rX2ltcGxlbWVudGF0aW9uSXRlcmFibGVCYXNlVHJhbnNmb3JtYXRpb25TX2xpbmtNYXBwZWRMaW5rSXRlcmF0b3JfdHJhbnNmb3JtYXRpb25bICBdbXlFbGVtZW50c0xpbmtFbnRyeS5oYXNoQ29kZWxhc3RMaW5rZmFzdGEudXRpbC5yZWxhdGl2aXplYmFzZWVxdWFsc05DU3RvTG93ZXJDYXNlbm9ybWFsaXpldXNlckluZm9ob3N0cG9ydHF1ZXJ5ZnJhZ21lbnRsYXN0SW5kZXhPZnVyaVBhcnRzYmFzZVBhcnRzY29tbW9ubmV3X2FwaUNvbXBpbGVySW5wdXRQcm92aWRlclJlYWRTdHJpbmdGcm9tVXJpQ29tcGlsZXJPdXRwdXRQcm92aWRlckRpYWdub3N0aWNIYW5kbGVySElOVFZFUkJPU0VfSU5GT0NSQVNIbGVnX2FwaWltcGxHZW5lcmljVGFza01lYXN1cmVyQ29tcGlsZXJJbXBsbWVhc3VyZXJ1c2VySGFuZGxlclRhc2t1c2VyUHJvdmlkZXJUYXNrbWFrZVJlcG9ydGVydGFza3NEaWFnbm9zdGljIGhhbmRsZXJJbnB1dCBwcm92aWRlcmVuYWJsZVRhc2tNZWFzdXJlbWVudHNsb2djYWxsVXNlckhhbmRsZXJzZXR1cFNka2VudnN1cHBvcnRlZExpYnJhcmllc3NwZWNpZmljYXRpb25VcmlzbG93VGV4dGRhcnQyanNfc2VydmVyZGFydDJqc3NldHVwRHVyYXRpb25lbGFwc2VkV2FsbENsb2Nrc2VsZlRhc2ttZWFzdXJlU3VidGFza2ltcGwucnVudGltaW5nc2NvbXB1dGVUaW1pbmdzX2Zvcm1hdE1zbXNUaW1pbmdzOnRvdGFsRHVyYXRpb25hc3luY0R1cmF0aW9uZWxhcHNlZEFzeW5jV2FsbENsb2NrY3VtdWxhdGVkRHVyYXRpb250aW1pbmdEYXRhdGFza3J1bm5pbmdpc1J1bm5pbmdtaWxsaXNlY29uZHMgICBzdWJ0YXNrc3VidGFza3NzdWJ0aW1lZ2V0U3VidGFza1RpbWVnZXRTdWJ0YXNrSXNSdW5uaW5nID4gbG9uZ2VzdERlc2NyaXB0aW9uZGRlc2NyaXB0aW9ucGFkZGluZ3BlcmNlbnRQYWRkaW5ncGVyY2VudCUpdW5hY2NvdW50ZWREdXJhdGlvbiAgICBUb3RhbCBjb21waWxlLXRpbWUgOyBzZXR1cCAgYXN5bmMgIHVuYWNjb3VudGVkIHJlcG9ydERpYWdub3N0aWNpbmZvc19yZXBvcnREaWFnbm9zdGljTWVzc2FnZWRpYWdub3N0aWNNZXNzYWdlc3BhbnNvdXJjZVNwYW5tZWFzdXJlcmVwb3J0Q3Jhc2hJblVzZXJDb2RlVW5jYXVnaHQgZXhjZXB0aW9uIGluIGRpYWdub3N0aWMgaGFuZGxlcmNhbGxVc2VyUHJvdmlkZXJtZWFzdXJlSW9VbmNhdWdodCBleGNlcHRpb24gaW4gaW5wdXQgcHJvdmlkZXJfRW52aXJvbm1lbnRkZWZpbml0aW9uc19jb21wbGV0ZU1hcHZhbHVlT2ZkYXJ0LmxpYnJhcnkudHJ1ZXRvTWFwX1RpbWluZ0RhdGFfZGFydExpYnJhcnlFbnZpcm9ubWVudFByZWZpeGRhcnQyanMuY29sb3JzUkVTRVQbWzBtQkxBQ0tfQ09MT1IbWzMwbVJFRF9DT0xPUhtbMzFtR1JFRU5fQ09MT1IbWzMybVlFTExPV19DT0xPUhtbMzNtQkxVRV9DT0xPUhtbMzRtTUFHRU5UQV9DT0xPUhtbMzVtQ1lBTl9DT0xPUhtbMzZtV0hJVEVfQ09MT1IbWzM3bXdyYXBibGFja3JlZGdyZWVueWVsbG93Ymx1ZW1hZ2VudGFjeWFud2hpdGVkYXJ0MmpzLmlvLnNvdXJjZV9maWxlTG9jYXRpb25Qcm92aWRlclNvdXJjZUZpbGVjYWNoZWRLZXJuZWxTb3VyY2VsaW5lU3RhcnRzQ2FjaGVrZXJuZWxTb3VyY2VzbG93VXRmOFplcm9UZXJtaW5hdGVkQnl0ZXNsaW5lU3RhcnRzRnJvbVN0cmluZ3N0YXJ0c3Nsb3dTdWJzdHJpbmdpbmNsdWRlU291cmNlTGluZXN0YXJ0TG9jYXRpb25lbmRMb2NhdGlvbmNvbHVtblN0YXJ0bGluZUVuZGNvbHVtbkVuZGJ1ZnRleHRMaW5ldG9Db2x1bW5saW5lc1V0ZjhCeXRlc1NvdXJjZUZpbGV6ZXJvVGVybWluYXRlZENvbnRlbnRsZW5ndGhDYWNoZWNvbnRlbnRDYWNoaW5nVXRmOEJ5dGVzU291cmNlRmlsZVN0cmluZ1NvdXJjZUZpbGVmcm9tVXJpZnJvbU5hbWVCaW5hcnlfemVyb1Rlcm1pbmF0ZUlmTmVjZXNzYXJ5ZGFydDJqcy51dGlsLmVtcHR5c2V0SW1tdXRhYmxlRW1wdHlTZXRSX2ltbXV0YWJsZUVycm9yRW1wdHlTZXQgaXMgaW1tdXRhYmxlbG9va3VwcmVtb3ZlQWxscmVtb3ZlV2hlcmV0ZXN0cmV0YWluQWxscmV0YWluV2hlcmV1bmlvbmludGVyc2VjdGlvbmRpZmZlcmVuY2VfRW1wdHlTZXRJdGVyYXRvcmRhcnQyanMudXRpbC5tYXBsZXRNYXBCYXNlTWFwbGV0X01BUktFUkNBUEFDSVRZX2tleV92YWx1ZV9leHRyYXJlbWFpbmluZ2NvcHlUb2NvcHlGcm9tZWFjaEtleWVhY2hWYWx1ZXZhbHVlSW5kZXhfTWFwbGV0TWFya2VyX01hcGxldEtleUl0ZXJhYmxlbWFwbGV0X01hcGxldFNpbmdsZUl0ZXJhdG9yX2VsZW1lbnRfTWFwbGV0TGlzdEl0ZXJhdG9yX2xpc3RfcmVtYWluaW5nX2luZGV4ZGFydDJqcy51dGlsLnNldGxldFNldEJhc2VTZXRsZXRfY29udGVudHNfbmV3U2V0bmV3U2V0ZWFjaHNldF9TZXRsZXRNYXJrZXJfU2V0bGV0U2luZ2xlSXRlcmF0b3JfU2V0bGV0TGlzdEl0ZXJhdG9ya2VybmVsLmFzdF90b19iaW5hcnlCeXRlc0J1aWxkZXJMaWJyYXJ5RmlsdGVyQmluYXJ5UHJpbnRlcl92YXJpYWJsZUluZGV4ZXJfbGFiZWxJbmRleGVyX3N3aXRjaENhc2VJbmRleGVyX3R5cGVQYXJhbWV0ZXJJbmRleGVyc3RyaW5nSW5kZXhlcl9jb25zdGFudEluZGV4ZXJfc291cmNlVXJpSW5kZXhlcl9jdXJyZW50bHlJbk5vbmltcGxlbWVudGF0aW9uX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uSW5MaWJyYXJ5X2xpYnJhcnlEZXBlbmRlbmN5SW5kZXhfbWV0YWRhdGFTdWJzZWN0aW9uc19tYWluU2lua19tZXRhZGF0YVNpbmtfY29uc3RhbnRzQnl0ZXNTaW5rX2NvbnN0YW50c1Npbmtfc2lua2xpYnJhcnlPZmZzZXRzY2xhc3NPZmZzZXRzcHJvY2VkdXJlT2Zmc2V0c19iaW5hcnlPZmZzZXRGb3JTb3VyY2VUYWJsZV9iaW5hcnlPZmZzZXRGb3JMaW5rVGFibGVfYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFQYXlsb2Fkc19iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YU1hcHBpbmdzX2JpbmFyeU9mZnNldEZvclN0cmluZ1RhYmxlX2JpbmFyeU9mZnNldEZvckNvbnN0YW50VGFibGVfY2Fub25pY2FsTmFtZUxpc3Rfa25vd25DYW5vbmljYWxOYW1lTm9uUm9vdFRvcHNfcmVpbmRleGVkQ2Fub25pY2FsTmFtZXNpbnNpZGVFeHRlcm5hbExpYnJhcnlfZW1wdHlOYW1lX2ZsdXNoZmx1c2hBbmREZXN0cm95YWRkQnl0ZWFkZEJ5dGVzYWRkQnl0ZTJhZGRCeXRlNHV0ZjhCeXRlc3dyaXRlU3RyaW5nVGFibGVpbmRleGVycmVxdWlyZWRNaW5MZW5ndGhhbGxvY2F0ZU1pbkxlbmd0aG5ld0luZGV4bmV3TGVuZ3RoY29udmVydGVkcHV0d3JpdGVTdHJpbmdSZWZlcmVuY2VMaXN0c3RyaW5nc3dyaXRlQ29uc3RhbnRSZWZlcmVuY2V3cml0ZUNvbnN0YW50VGFibGV0YWtlQnl0ZXN3cml0ZUNvbnN0YW50VGFibGVFbnRyeW9sZFNpbmtpbml0aWFsT2Zmc2V0d3JpdGVJbnRlZ2Vyd3JpdGVEb3VibGV3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNld3JpdGVDbGFzc1JlZmVyZW5jZXdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2VVbnN1cHBvcnRlZCBjb25zdGFudCB3cml0ZVVyaVJlZmVyZW5jZWl0ZW1zd3JpdGVJdGVtd3JpdGVOb2RlTGlzdGxlbndyaXRlUHJvY2VkdXJlTm9kZUxpc3R3cml0ZVByb2NlZHVyZU5vZGV3cml0ZUZpZWxkTm9kZUxpc3R3cml0ZUZpZWxkTm9kZXdyaXRlQ2xhc3NOb2RlTGlzdHdyaXRlQ2xhc3NOb2Rld3JpdGVDb25zdHJ1Y3Rvck5vZGVMaXN0d3JpdGVDb25zdHJ1Y3Rvck5vZGV3cml0ZVJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yTm9kZUxpc3R3cml0ZVJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yTm9kZXdyaXRlU3dpdGNoQ2FzZU5vZGVMaXN0d3JpdGVTd2l0Y2hDYXNlTm9kZXdyaXRlQ2F0Y2hOb2RlTGlzdHdyaXRlQ2F0Y2hOb2Rld3JpdGVUeXBlZGVmTm9kZUxpc3R3cml0ZVR5cGVkZWZOb2RlX3dyaXRlTm9kZU1ldGFkYXRhd3JpdGVGdW5jdGlvbk5vZGV3cml0ZUFyZ3VtZW50c05vZGV3cml0ZUxpYnJhcnlOb2Rld3JpdGVPcHRpb25hbE5vZGV3cml0ZU9wdGlvbmFsRnVuY3Rpb25Ob2Rld3JpdGVMaW5rVGFibGV3cml0ZUNhbm9uaWNhbE5hbWVFbnRyeWluZGV4TGlua1RhYmxlc2hvdWxkV3JpdGVMaWJyYXJ5Q2Fub25pY2FsTmFtZXNfaW5kZXhMaW5rVGFibGVJbnRlcm5hbGNoaWxkcmVuY2hpbGRyZW5Pck51bGxpc1Jvb3Rjb21wb25lbnRPZmZzZXQyNDI3MTc4NDc5d3JpdGVMaXN0T2ZTdHJpbmdzX2NvbGxlY3RNZXRhZGF0YV93cml0ZU5vZGVNZXRhZGF0YUltcGxjaGVja0Nhbm9uaWNhbE5hbWV3cml0ZUxpYnJhcmllc3dyaXRlVXJpVG9Tb3VyY2Vfd3JpdGVNZXRhZGF0YVNlY3Rpb253cml0ZUNvbXBvbmVudEluZGV4bm9kZU9mZnNldHN1YnNlY3Rpb25Ob2RlcyBvZiB0eXBlICBjYW4ndCBoYXZlIG1ldGFkYXRhLk5vZGUgd3JpdHRlbiBpbnRvIG1ldGFkYXRhIGNhbid0IGhhdmUgbWV0YWRhdGEgKG1ldGFkYXRhOiAsIG5vZGU6IG1ldGFkYXRhTWFwcGluZ2VudGVycHVzaFNjb3BlcG9wU2NvcGVtYXBwaW5nTGVuZ3RobnVtQ29tcG9uZW50SW5kZXhFbnRyaWVzdW5hbGlnbmVkU2l6ZXVyaUFzU3RyaW5nb3V0cHV0U3RyaW5nVmlhQnVmZmVycHJldmlvdXNMaW5lU3RhcnRqaW1wb3J0VXJpQXNTdHJpbmd3cml0ZUxpYnJhcnlEZXBlbmRlbmN5UmVmZXJlbmNlUmVmZXJlbmNlIHRvIGxpYnJhcnkgZGVwZW5kZW5jeSAgb3V0IG9mIHNjb3BlTWlzc2luZyBjYW5vbmljYWwgbmFtZSBmb3Igd3JpdGVOb25OdWxsUmVmZXJlbmNlR290IG51bGwgcmVmZXJlbmNlbm9uUm9vdFRvcEV4cGVjdGVkIGEgY2Fub25pY2FsIG5hbWUgdG8gYmUgdmFsaWQgYnV0IHdhcyBgbnVsbGAud3JpdGVMaWJyYXJ5UmVmZXJlbmNlYWxsb3dOdWxsRXhwZWN0ZWQgYSBsaWJyYXJ5IHJlZmVyZW5jZSB0byBiZSB2YWxpZCBidXQgd2FzIGBudWxsYC53cml0ZU9mZnNldEV4cGVjdGVkIGEgY2xhc3MgcmVmZXJlbmNlIHRvIGJlIHZhbGlkIGJ1dCB3YXMgYG51bGxgLndyaXRlQW5ub3RhdGlvbkxpc3R3cml0ZUxpYnJhcnlEZXBlbmRlbmNpZXN3cml0ZUFkZGl0aW9uYWxFeHBvcnRzd3JpdGVMaWJyYXJ5UGFydHNzb3VyY2VSZWZlcmVuY2VzT2Zmc2V0c291cmNlUmVmZXJlbmNlc0NvdW50aW1wb3J0Tm9kZXdyaXRlTGlicmFyeURlcGVuZGVuY3lyZWZwYXJ0Tm9kZXdyaXRlTGlicmFyeVBhcnR3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0d3JpdGVBbm5vdGF0aW9uX2VuY29kZUNsYXNzRmxhZ3NsZXZlbEluZGV4cmVzdG9yZVNjb3BlY3VycmVudGx5SW5Ob25pbXBsZW1lbnRhdGlvblNhdmVkd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9ub2xkTGFiZWxzb2xkQ2FzZXNsb2dpY2FsT3BlcmF0b3JJbmRleCYmfHxOb3QgYSBsb2dpY2FsIG9wZXJhdG9yOiBiaWFzZWRWYWx1ZWFic2FkZERvdWJsZXdyaXRlU3RhdGVtZW50T3JFbXB0eV9lbmNvZGVUcnlDYXRjaEZsYWdzbmVlZHNTdGFja1RyYWNld3JpdGVPcHRpb25hbFZhcmlhYmxlRGVjbGFyYXRpb25kZWNsYXJlZGVmYXVsdE5vZGVzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgTm9kZXNkZWZhdWx0Q29uc3RhbnRzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgQ29uc3RhbnRzZGVmYXVsdEJhc2ljTGl0ZXJhbHNlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBCYXNpY0xpdGVyYWxzZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIENvbnN0YW50IHJlZmVyZW5jZXNkZWZhdWx0RGFydFR5cGVzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgRGFydFR5cGVzZGVmYXVsdEV4cHJlc3Npb25zZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgRXhwcmVzc2lvbnNkZWZhdWx0SW5pdGlhbGl6ZXJzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgSW5pdGlhbGl6ZXJzZGVmYXVsdE1lbWJlcnNlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBNZW1iZXJzZGVmYXVsdE1lbWJlclJlZmVyZW5jZXNlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBNZW1iZXIgcmVmZXJlbmNlc2RlZmF1bHRTdGF0ZW1lbnRzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgU3RhdGVtZW50c3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBUcmVlTm9kZXNzZXJpYWxpemF0aW9uIG9mIEJvb2xDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIEJvb2xDb25zdGFudCByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBDbGFzcyByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBDb25zdHJ1Y3RvciByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBEb3VibGVDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIERvdWJsZUNvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIEZpZWxkIHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIEluc3RhbmNlQ29uc3RhbnRzc2VyaWFsaXphdGlvbiBvZiBJbnN0YW5jZUNvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIEludENvbnN0YW50c3NlcmlhbGl6YXRpb24gb2YgSW50Q29uc3RhbnQgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgTGlicmFyeURlcGVuZGVuY3lzc2VyaWFsaXphdGlvbiBvZiBMaWJyYXJ5UGFydHNzZXJpYWxpemF0aW9uIG9mIExpc3RDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIExpc3RDb25zdGFudCByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBTZXRDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIFNldENvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIE1hcENvbnN0YW50c3NlcmlhbGl6YXRpb24gb2YgTWFwQ29uc3RhbnQgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgTmFtZXNzZXJpYWxpemF0aW9uIG9mIE51bGxDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIE51bGxDb25zdGFudCByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBQcm9jZWR1cmUgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgQ29tcG9uZW50c3NlcmlhbGl6YXRpb24gb2YgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgU3RyaW5nQ29uc3RhbnRzc2VyaWFsaXphdGlvbiBvZiBTdHJpbmdDb25zdGFudCByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBTeW1ib2xDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIFN5bWJvbENvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnRzIHNlcmlhbGl6YXRpb24gb2YgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBUZWFyT2ZmQ29uc3RhbnRzIHNlcmlhbGl6YXRpb24gb2YgVGVhck9mZkNvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIFR5cGVMaXRlcmFsQ29uc3RhbnRzc2VyaWFsaXphdGlvbiBvZiBUeXBlTGl0ZXJhbENvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIFR5cGVkZWYgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgVW5ldmFsdWF0ZWRDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIFVuZXZhbHVhdGVkQ29uc3RhbnQgcmVmZXJlbmNlc1ZhcmlhYmxlSW5kZXhlcnNjb3Blc3N0YWNrSGVpZ2h0bnVtYmVyT2ZWYXJpYWJsZXNMYWJlbEluZGV4ZXJTd2l0Y2hDYXNlSW5kZXhlcmNhc2VOb2RlQ29uc3RhbnRJbmRleGVyb2Zmc2V0c25leHRPZmZzZXRfcHJpbnRlcm9sZE9mZnNldG5ld09mZnNldFR5cGVQYXJhbWV0ZXJJbmRleGVyVHlwZSBwYXJhbWV0ZXIgIGlzIG5vdCBpbmRleGVkU3RyaW5nSW5kZXhlclVyaUluZGV4ZXJCdWZmZXJlZFNpbmtTSVpFU0FGRV9TSVpFU01BTExfYnVmZmVyZmx1c2hlZExlbmd0aF9kb3VibGVCdWZmZXJfZG91YmxlQnVmZmVyVWludDhhc1VpbnQ4TGlzdGJ5dGUxYnl0ZTJieXRlM2J5dGU0YWxyZWFkeUVtaXR0ZWRyZW1haW5kZXJfTWV0YWRhdGFTdWJzZWN0aW9uQnl0ZXNTaW5rTm90UXVpdGVTdHJpbmd3cml0ZVV0Zjhjb2RlVW5pdG5leHRDaGFya2VybmVsLmFzdF9mcm9tX2JpbmFyeVBhcnNlRXJyb3JieXRlSW5kZXggYXQgSW52YWxpZEtlcm5lbFZlcnNpb25FcnJvclVuZXhwZWN0ZWQgS2VybmVsIHZlcnNpb24gKGV4cGVjdGVkICkuQ2Fub25pY2FsTmFtZUVycm9yQ2Fub25pY2FsTmFtZVNka0Vycm9yX0NvbXBvbmVudEluZGV4bnVtYmVyT2ZGaXhlZEZpZWxkc2JpbmFyeU9mZnNldEZvclNvdXJjZVRhYmxlYmluYXJ5T2Zmc2V0Rm9yQ2Fub25pY2FsTmFtZXNiaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFNYXBwaW5nc2JpbmFyeU9mZnNldEZvclN0cmluZ1RhYmxlYmluYXJ5T2Zmc2V0Rm9yQ29uc3RhbnRUYWJsZW1haW5NZXRob2RSZWZlcmVuY2VsaWJyYXJ5Q291bnRjb21wb25lbnRGaWxlU2l6ZUluQnl0ZXN2YXJpYWJsZVN0YWNrbGFiZWxTdGFja2xhYmVsU3RhY2tCYXNlc3dpdGNoQ2FzZVN0YWNrdHlwZVBhcmFtZXRlclN0YWNrX2J5dGVzX2J5dGVPZmZzZXRfc3RyaW5nVGFibGVfc291cmNlVXJpVGFibGVfY29uc3RhbnRUYWJsZV9saW5rVGFibGVfdHJhbnNmb3JtZXJGbGFnc19jdXJyZW50TGlicmFyeV9jb21wb25lbnRTdGFydE9mZnNldGRlYnVnUGF0aF9pc1JlYWRpbmdMaWJyYXJ5SW1wbGVtZW50YXRpb25fZGlzYWJsZUxhenlSZWFkaW5nYnl0ZU9mZnNldHJlYWREb3VibGVyZWFkU3RyaW5nRW50cnludW1CeXRlc251bUJ5dGVPcmRlck1hcmtz77u/X3JlYWRNZXRhZGF0YU1hcHBpbmdzX2Fzc29jaWF0ZU1ldGFkYXRhcmVhZFN0cmluZ1RhYmxldGFibGVlbmRPZmZzZXRzc3RhcnRPZmZzZXRyZWFkQ29uc3RhbnRUYWJsZXJlYWRDb25zdGFudFRhYmxlRW50cnljb25zdGFudFRhZ3JlYWRFeHByZXNzaW9ucmVhZExpYnJhcnlSZWZlcmVuY2VyZWFkQ29uc3RhbnRSZWZlcmVuY2VyZWFkQ2xhc3NSZWZlcmVuY2VmaWVsZFZhbHVlQ291bnRnZXRSZWZlcmVuY2V1bmV4cGVjdGVkIGNvbnN0YW50IHRhZzogcmVhZFVyaVJlZmVyZW5jZXJlYWRTdHJpbmdSZWZlcmVuY2VMaXN0cmVhZFN0cmluZ09yTnVsbElmRW1wdHlyZWFkQW5kQ2hlY2tPcHRpb25UYWd1bmV4cGVjdGVkIG9wdGlvbiB0YWc6IHJlYWRBbm5vdGF0aW9uTGlzdF9maWxsVHJlZU5vZGVMaXN0YnVpbGRPYmplY3RfZmlsbE5vblRyZWVOb2RlTGlzdF9za2lwTm9kZUxpc3Rza2lwT2JqZWN0X21lcmdlTmFtZWROb2RlTGlzdHJlYWRPYmplY3RudW1iZXJPZk5vZGVzcmVhZExpbmtUYWJsZWxpbmtSb290Ymlhc2VkUGFyZW50SW5kZXhfaW5kZXhDb21wb25lbnRzc2F2ZWRCeXRlT2Zmc2V0c2l6ZWluZGljYXRlZCBzaXplIGRvZXMgbm90IG1hdGNoIGZpbGUgc2l6ZXJldmVyc2VkY2hlY2tDYW5vbmljYWxOYW1lc21hZ2ljTm90IGEgLmRpbGwgZmlsZSAod3JvbmcgbWFnaWMgbnVtYmVyKS5jb21wb25lbnRGaWxlU2l6ZXNjb21wb25lbnRGaWxlSW5kZXhfcmVhZE9uZUNvbXBvbmVudF9jaGVja0Nhbm9uaWNhbE5hbWVDaGlsZHJlbl9yZWFkT25lQ29tcG9uZW50U291cmNlcmVhZFNpbmdsZUZpbGVDb21wb25lbnRpbnZhbGlkIGNvbXBvbmVudCBkYXRhQ29uY2F0ZW5hdGVkIGNvbXBvbmVudCBmaWxlIGdpdmVuIHdoZW4gYSBzaW5nbGUgY29tcG9uZW50IHdhcyBleHBlY3RlZC5VbnJlY29nbml6ZWQgYnl0ZXMgZm9sbG93aW5nIGNvbXBvbmVudCBkYXRhcGFyZW50Q2hpbGRyZW5AbWV0aG9kc0B0eXBlZGVmc0BmaWVsZHNAZ2V0dGVyc0BzZXR0ZXJzQGZhY3Rvcmllc0Bjb25zdHJ1Y3RvcnNjaGVja1JlZmVyZW5jZU5vZGVidWlsZENhbm9uaWNhbE5hbWVFcnJvck51bGwgcmVmZXJlbmNlICgpIChDYW5vbmljYWwgbmFtZSBhbmQgcmVmZXJlbmNlIGRvZXNuJ3QgYWdyZWUuUmVmZXJlbmNlIGlzIG51bGwgKHByb2JsZW1Ob2RlbGlicmFyeVVyaWRhcnQ6X3JlYWRDb21wb25lbnRJbmRleGNvbXBvbmVudEZpbGVTaXplc2F2ZWRCeXRlSW5kZXhNYWxmb3JtZWQgYmluYXJ5OiBUaGlzIGNvbXBvbmVudCBmaWxlJ3MgY29tcG9uZW50IGluZGV4IGluZGljYXRlcyB0aGF0IHRoZSBmaWxlc2l6ZSBzaG91bGQgYmUgIGJ1dCBvdGhlciBjb21wb25lbnQgaW5kZXhlcyBoYXMgaW5kaWNhdGVkIHRoYXQgdGhlIHNpemUgc2hvdWxkIGJlIGZvcm1hdFZlcnNpb25yZWFkVXJpVG9Tb3VyY2VyZWFkTGlzdE9mU3RyaW5nc251bWJlck9mTGlicmFyaWVzcmVhZExpYnJhcnlnZXRNZW1iZXJSZWZlcmVuY2VGcm9tSW50dXJpQnl0ZXNzb3VyY2VDb2RlbGluZUNvdW50aW1wb3J0VXJpQnl0ZXNnZXRDYW5vbmljYWxOYW1lUmVmZXJlbmNlRnJvbUludHJlYWRMaWJyYXJ5RGVwZW5kZW5jeVJlZmVyZW5jZXJlYWRNZW1iZXJSZWZlcmVuY2VFeHBlY3RlZCBhIG1lbWJlciByZWZlcmVuY2UgdG8gYmUgdmFsaWQgYnV0IHdhcyBgbnVsbGAucmVhZFR5cGVkZWZSZWZlcmVuY2VlbmRPZmZzZXRwcm9jZWR1cmVDb3VudGNsYXNzQ291bnRzaG91bGRXcml0ZURhdGFfcmVhZExpYnJhcnlEZXBlbmRlbmNpZXNfcmVhZEFkZGl0aW9uYWxFeHBvcnRzX3JlYWRMaWJyYXJ5UGFydHNyZWFkVHlwZWRlZnJlYWRDbGFzc3JlYWRGaWVsZHJlYWRQcm9jZWR1cmVyZWFkTGlicmFyeURlcGVuZGVuY3lyZWFkT2Zmc2V0cmVhZEV4cHJlc3Npb25MaXN0cHJlZml4TmFtZXJlYWRDb21iaW5hdG9yTGlzdG51bUV4cG9ydGVkUmVmZXJlbmNlZXhwb3J0ZWROYW1lcmVhZENvbWJpbmF0b3JyZWFkTGlicmFyeVBhcnRyZWFkQW5kUHVzaFR5cGVQYXJhbWV0ZXJMaXN0cmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdG5vcm1hbC1jbGFzc3JlYWRTdXBlcnR5cGVPcHRpb25yZWFkU3VwZXJ0eXBlcmVhZENvbnN0cnVjdG9ycmVhZFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yZ2V0QW5kUmVzZXRUcmFuc2Zvcm1lckZsYWdzYWRkVHJhbnNmb3JtZXJGbGFncmVhZEV4cHJlc3Npb25PcHRpb25jb25zdHJ1Y3RvcnB1c2hWYXJpYWJsZURlY2xhcmF0aW9uc3JlYWRJbml0aWFsaXplcmtpbmRJbmRleGZ1bmN0aW9uTm9kZVNpemVyZWFkRnVuY3Rpb25Ob2RlTm93cmVhZEZ1bmN0aW9uTm9kZU9wdGlvbnJlZGlyZWN0aW5nLWZhY3RvcnktY29uc3RydWN0b3JyZWFkRGFydFR5cGVMaXN0dHlwZVBhcmFtZXRlclN0YWNrSGVpZ2h0dmFyaWFibGVTdGFja0hlaWdodHJlYWRBcmd1bWVudHNyZWFkQW5kUHVzaFZhcmlhYmxlRGVjbGFyYXRpb25yZWFkU3RhdGVtZW50dW5leHBlY3RlZCBpbml0aWFsaXplciB0YWc6IGxhenlMb2FkQm9keW91dGVyRW5kT2Zmc2V0b2xkTGFiZWxTdGFja0Jhc2VyZWFkU3RhdGVtZW50T3B0aW9uX3NldExhenlMb2FkRnVuY3Rpb25jb21wb25lbnRTdGFydE9mZnNldGN1cnJlbnRMaWJyYXJ5cHVzaFZhcmlhYmxlRGVjbGFyYXRpb25yZWFkVmFyaWFibGVSZWZlcmVuY2V1bmV4cGVjdGVkIHZhcmlhYmxlIGluZGV4OiBsb2dpY2FsT3BlcmF0b3JUb1N0cmluZ3VuZXhwZWN0ZWQgbG9naWNhbCBvcGVyYXRvciBpbmRleDogdGFnQnl0ZXJlYWREYXJ0VHlwZU9wdGlvbmFzc2VydENvdW50cmVhZE1hcEVudHJ5TGlzdHJlYWRWYXJpYWJsZURlY2xhcmF0aW9ucmVhZFN0YXRlbWVudExpc3R1bmV4cGVjdGVkIGV4cHJlc3Npb24gdGFnOiByZWFkTWFwRW50cnlyZWFkU3RhdGVtZW50T3JOdWxsSWZFbXB0eXJlYWRCbG9ja3JlYWRBc3NlcnRCbG9ja2xhYmVscmVhZFN3aXRjaENhc2VJbnRvcmVhZENhdGNoTGlzdHVuZXhwZWN0ZWQgc3RhdGVtZW50IHRhZzogcmVhZENhdGNocmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uT3B0aW9ucmVhZFN1cGVydHlwZUxpc3RyZWFkTmFtZWRUeXBlTGlzdHJlYWROYW1lZFR5cGV0b3RhbFBhcmFtZXRlckNvdW50dW5leHBlY3RlZCBkYXJ0IHR5cGUgdGFnOiByZWFkVHlwZVBhcmFtZXRlcm51bUFyZ3VtZW50c3JlYWROYW1lZEV4cHJlc3Npb25MaXN0cmVhZE5hbWVkRXhwcmVzc2lvbkJpbmFyeUJ1aWxkZXJXaXRoTWV0YWRhdGFfc3Vic2VjdGlvbnNzdWJTZWN0aW9uQ291bnRtYXBwaW5nU3RhcnRtZXRhZGF0YU9mZnNldF9yZWFkTWV0YWRhdGFzYXZlZE9mZnNldHBhcmFta2VybmVsLmFzdF90b190ZXh0TmFtZXJnZXROYW1lcHV0SWZBYnNlbnROb3JtYWxOYW1lcl9Db25zdGFudE5hbWVyJlJlY3Vyc2l2ZVZpc2l0b3ImTmFtZXJDb25zdGFudE5hbWVyRGlzYW1iaWd1YXRvclVuYW1lc1RuYW1lc1VkaXNhbWJpZ3VhdGVrZXkxa2V5MnByb3Bvc2VOYW1lZ2V0TmV3TmFtZXByb3Bvc2VkTmFtZUNhbm5vdCBkaXNhbWJpZ3VhdGVOYW1lU3lzdGVtI3QjbSNjbGFzcyNsaWIjVGxhYmVscyNMY29uc3RhbnRzI0NwcmVmaXhlc3BhdGhTZXBhcmF0b3JbXC9dcHVuY3R1YXRpb25bLjpdbmFtZVZhcmlhYmxlbmFtZU1lbWJlcm5hbWVDbGFzc25hbWVMaWJyYXJ5bmFtZVR5cGVQYXJhbWV0ZXJuYW1lU3dpdGNoQ2FzZW5hbWVMYWJlbGVkU3RhdGVtZW50bmFtZUNvbnN0YW50bmFtZUxpYnJhcnlQcmVmaXhhYmJyZXZpYXRlTmFtZWhhc0VtcHR5UGF0aExuYW1lQ2Fub25pY2FsTmFtZUFzTGlicmFyeVByZWZpeHNsYXNoZG90QW5ub3RhdG9yYW5ub3RhdGVWYXJpYWJsZXByaW50ZXJhbm5vdGF0ZVJldHVybmFubm90YXRlRmllbGRQcmludGVyc3ludGhldGljTmFtZXNhbm5vdGF0b3JpbXBvcnRUYWJsZVNQQUNFV09SRFNZTUJPTGVtcHR5TmFtZVN0cmluZ+KAomVtcHR5TmFtZWNyZWF0ZUlubmVyc2hvdWxkSGlnaGxpZ2h0c3RhcnRIaWdobGlnaHRlbmRIaWdobGlnaHRnZXRMaWJyYXJ5TmFtZWdldExpYnJhcnlSZWZlcmVuY2U8Tm8gTGlicmFyeT5nZXRJbXBvcnRJbmRleGdldENsYXNzTmFtZTxObyBDbGFzcz5nZXRUeXBlZGVmUmVmZXJlbmNlPE5vIFR5cGVkZWY+Z2V0TWVtYmVyTmFtZTxObyBNZW1iZXI+Z2V0VmFyaWFibGVOYW1lZ2V0VmFyaWFibGVSZWZlcmVuY2U8Tm8gVmFyaWFibGVEZWNsYXJhdGlvbj5nZXRUeXBlUGFyYW1ldGVyTmFtZWdldFR5cGVQYXJhbWV0ZXJSZWZlcmVuY2U8Tm8gVHlwZVBhcmFtZXRlcj53cml0ZUNvbXBvbmVudFByb2JsZW1zd3JpdGVQcm9ibGVtc0FzSnNvblByb2JsZW1zIGluIGNvbXBvbmVudGhlYWRlcmVuZExpbmUvLy8vIHRyaW1tZWR0cmltUmlnaHR3cml0ZVdvcmRpbXBvcnRzaW5uZXJ3cml0ZVN0YW5kYXJkTGlicmFyeUNvbnRlbnRvdXRlclByaW50ZXJpbXBvcnRzVG9QcmludHByaW50TGlicmFyeUltcG9ydFRhYmxlaW1wb3J0ZWRMaWJyYXJpZXNpbXBvcnRQYXRoZ2V0SW1wb3J0UGF0aHNlbGZpbXBvcnQgc2VsZiBhcyBpbXBvcnQgIiIgYXMgUHJvYmxlbXMgaW4gbGlicmFyeWFkZGl0aW9uYWxFeHBvcnRzID0gKGlzRmlyc3Rub2RlTGlicmFyeXdyaXRlU3BhY2Vkd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNld3JpdGVNZXRhZGF0YWFzY29uc3RhbnRzIGdldFByZWNlZGVuY2V3cml0ZVNwYWNlZW5zdXJlU3BhY2V3cml0ZVN5bWJvbHdyaXRlQ29tbWFlbnN1cmVXb3JkQm91bmRhcnl3cml0ZUluZGVudGF0aW9uPE51bGw+aGlnaGxpZ2h0W11tZG5vZGVNZXRhZGF0YVtAd3JpdGVBbm5vdGF0ZWRUeXBld3JpdGVUeXBlPE5vIERhcnRUeXBlPndyaXRlT3B0aW9uYWxUeXBlPE5vIFN1cGVydHlwZT53cml0ZUNsYXNzUmVmZXJlbmNlRnJvbVJlZmVyZW5jZXdyaXRlVHlwZWRlZlJlZmVyZW5jZXdyaXRlTW9kaWZpZXJpc1RoZXJlPGFub24+d3JpdGVGdW5jdGlvbnRlcm1pbmF0ZUxpbmV3cml0ZVR5cGVQYXJhbWV0ZXJMaXN0d3JpdGVQYXJhbWV0ZXJMaXN0d3JpdGVSZXR1cm5UeXBlZ2V0QXN5bmNNYXJrZXJLZXl3b3JkLyogb3JpZ2luYWxseSovd3JpdGVGdW5jdGlvbkJvZHltYXJrZXJzeW5jc3luYyphc3luY2FzeW5jKnlpZWxkaW5nPEludmFsaWQgYXN5bmMgbWFya2VyOiB7fXs9PndyaXRlRXhwcmVzc2lvbndyaXRlQm9keXdyaXRlRnVuY3Rpb25UeXBldHlwZWRlZlBvc2l0aW9uYWx0eXBlZGVmTmFtZWRwYXJhbWV0ZXJzQW5ub3RhdGVkZm9ybWFs4oaSd3JpdGVOdWxsYWJpbGl0eWNhbGxiYWNrZ2V0Q2xhc3NSZWZlcmVuY2VGcm9tUmVmZXJlbmNlZ2V0Q2Fub25pY2FsTmFtZVN0cmluZ05laXRoZXIgbm9kZSBub3IgY2Fub25pY2FsIG5hbWUgZm91bmRnZXRNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNldW5leHBlY3RlZCByb290dW5leHBlY3RlZCBAbGlicmFyeVN0cmluZ2NsYXNzU3RyaW5nY2xzYXROb2Rld3JpdGVWYXJpYWJsZVJlZmVyZW5jZXdyaXRlVHlwZVBhcmFtZXRlclJlZmVyZW5jZW1pbmltdW1QcmVjZWRlbmNlbmVlZHNQYXJlbnRlc2Vzc2VwYXJhdGVMaW5lc2dlbmVyaWMtY292YXJpYW50LWltcGxbZ2V0dGVyXVtzZXR0ZXJdW25vLWdldHRlcl1bbm8tc2V0dGVyXS8qIGZyb20gICovZm9yd2FyZGluZy1zdHViZm9yd2FyZGluZy1zZW1pLXN0dWJuby1zdWNoLW1ldGhvZC1mb3J3YXJkZXJzeW50aGV0aWNyZWRpcmVjdGluZ19mYWN0b3J5Y2xhc3N3aXRoZXh0ZW5kc2ltcGxlbWVudHNlbmRMaW5lU3RyaW5nIC8vIGZyb20gaW52YWxpZC1leHByZXNzaW9uZXNjYXBlU3RyaW5nd3JpdGVJbnRlcmZhY2VUYXJnZXQuez1zdXBlcm5ldyFwcmVjZWRlbmNlPz8hPXdyaXRlU3RhdGljVHlwZWdldEVzY2FwZWRDaGFyYWN0ZXJcdlxmXCRwYXJ0JHthc3NlcnRfYXNzZXJ0KHVudXNlZEFyZ3VtZW50aXNhc3tUeXBlRXJyb3J9dGhpc3JldGhyb3d0aHJvd2F3YWl0bGV0aW5ibG9ja3dyaXRlQmxvY2tCb2R5ID0+ZGVmZXJyZWRhc3NlcnQpO2JyZWFrd2hpbGVkb2ZvcnVzZVZhcktleXdvcmRzd2l0Y2gpIHtjYXNlZGVmYXVsdGNvbnRpbnVlaWZlbHNlcmV0dXJudHJ5b25jYXRjaG5vLWV4Y2VwdGlvbi12YXJmaW5hbGx5eWllbGQqW3lpZWxkXXlpZWxkLi4uO2FsbEFyZ3NpbnZhbGlkLWluaXRpYWxpemVyaW52YWxpZC10eXBlZHluYW1pY3ZvaWQ+Wz57cGFydGlhbC1pbnN0YW50aWF0aW9udGVhcm9mZmV2YWxQcmVjZWRlbmNlRVhQUkVTU0lPTkNPTkRJVElPTkFMTE9HSUNBTF9OVUxMX0FXQVJFTE9HSUNBTF9PUkxPR0lDQUxfQU5ERVFVQUxJVFlSRUxBVElPTkFMQklUV0lTRV9PUkJJVFdJU0VfWE9SQklUV0lTRV9BTkRTSElGVEFERElUSVZFTVVMVElQTElDQVRJVkVQUkVGSVhQT1NURklYVFlQRV9MSVRFUkFMUFJJTUFSWUNBTExFRWJpbmFyeVByZWNlZGVuY2VvZmlzQXNzb2NpYXRpdmVCaW5hcnlPcGVyYXRvckV4cHJlc3Npb25QcmludGVyd3JpdGVlcmdsb2JhbERlYnVnZ2luZ05hbWVzZGVidWdMaWJyYXJ5TmFtZWRlYnVnQ2xhc3NOYW1lZGVidWdRdWFsaWZpZWRDbGFzc05hbWVkZWJ1Z01lbWJlck5hbWVkZWJ1Z1F1YWxpZmllZE1lbWJlck5hbWVkZWJ1Z1R5cGVQYXJhbWV0ZXJOYW1lZGVidWdRdWFsaWZpZWRUeXBlUGFyYW1ldGVyTmFtZWRlYnVnVmFyaWFibGVEZWNsYXJhdGlvbk5hbWVkZWJ1Z05vZGVUb1N0cmluZ2NvbXBvbmVudFRvU3RyaW5ncHJvY2VkdXJlS2luZFRvU3RyaW5nZ2V0aWxsZWdhbCBQcm9jZWR1cmVLaW5kOiBrZXJuZWwuYXN0LnZpc2l0b3JFeHByZXNzaW9uVmlzaXRvclN0YXRlbWVudFZpc2l0b3JNZW1iZXJWaXNpdG9ySW5pdGlhbGl6ZXJWaXNpdG9yVHJlZVZpc2l0b3JEYXJ0VHlwZVZpc2l0b3JEYXJ0VHlwZVZpc2l0b3IxQ29uc3RhbnRWaXNpdG9yX0NvbnN0YW50Q2FsbGJhY2tfQ29uc3RhbnRDYWxsYmFja1Zpc2l0b3JfY2FsbGJhY2tDb21wdXRlT25jZUNvbnN0YW50VmlzaXRvcl92aXNpdG9yY2FjaGVWaXNpdE9uY2VDb25zdGFudFZpc2l0b3JNZW1iZXJSZWZlcmVuY2VWaXNpdG9yVmlzaXRvclJlY3Vyc2l2ZVZpc2l0b3JUcmFuc2Zvcm1lckV4cHJlc3Npb25WaXNpdG9yMVN0YXRlbWVudFZpc2l0b3IxQm9keVZpc2l0b3Ixa2VybmVsLmNhbm9uaWNhbF9uYW1lX3BhcmVudF9ub25Sb290VG9wX2NoaWxkcmVuaGFzQ2hpbGRnZXRDaGlsZEZyb21RdWFsaWZpZWROYW1lZ2V0Q2hpbGRGcm9tRmllbGRXaXRoTmFtZUNhbm5vdCBhZGQgYSBjaGlsZCB0byAgYmVjYXVzZSB0aGlzIG5hbWUgYWxyZWFkeSBoYXMgYSBjaGlsZCBuYW1lZCByZW1vdmVDaGlsZCBpcyBhbHJlYWR5IGJvdW5kQ2Fubm90IGJpbmQgLCB0YXJnZXQgaXMgYWxyZWFkeSBib3VuZCB0byB1bmJpbmRjaGlsZHJlbl9nZXRNZW1iZXJRdWFsaWZpZXJVbmV4cGVjdGVkIG1lbWJlcjoga2VybmVsLnRyYW5zZm9ybWF0aW9ucy5mbGFnc1RyYW5zZm9ybWVyRmxhZ3N1cGVyQ2FsbHNzZWVuQnlWZXJpZmllcmtlcm5lbC50eXBlX2FsZ2VicmFUeXBlUGFyYW1ldGVyRmlsdGVyUEZyZXNoVHlwZVBhcmFtZXRlcnNmcmVzaFR5cGVQYXJhbWV0ZXJzYXBwbHlUb0Z1bmN0aW9uVHlwZXN1YnN0aXR1dGVzdWJzdGl0dXRlTmFtZWRzdWJzdGl0dXRlU3VwZXJmcm9tTWFwZmlsdGVyZWRmcm9tVXBwZXJBbmRMb3dlckJvdW5kc2Zyb21TdXBlcnR5cGVmcm9tSW50ZXJmYWNlVHlwZWZyb21UeXBlZGVmVHlwZWZyb21QYWlyc3BhcmFtZXRlcnNib3R0b21Gb3JDbGFzc3VwcGVyQm91bmRGb3JDbGFzc3NlY29uZGdldFN1YnN0aXR1dGV1cHBlckJvdW5kY29udHJhdmFyaWFudHZpc2l0X051bGxTdWJzdGl0dXRpb25TdWJzdGl0dXRpb24uZW1wdHlfTWFwU3Vic3RpdHV0aW9uX01hcFN1YnN0aXR1dGlvbihfVG9wU3Vic3RpdHV0b3JpbnZlcnRWYXJpYW5jZWZyZXNoVHlwZVBhcmFtZXRlckNyZWF0ZSBhIGZyZXNoIGVudmlyb25tZW50IGZpcnN0X0NsYXNzQm90dG9tU3Vic3RpdHV0aW9uX0NvbWJpbmVkU3Vic3RpdHV0aW9uX0ZpbHRlcmVkU3Vic3RpdHV0aW9uZmlsdGVyRm5fSW5uZXJUeXBlU3Vic3RpdHV0b3JvdXRlcmZyZXNoX1R5cGVTdWJzdGl0dXRvcmNvdmFyaWFudENvbnRleHR1c2VDb3VudGVybmV3SW5uZXJFbnZpcm9ubWVudGJlZm9yZWJ1bXBDb3VudGVyc1VudGlsX0RlZXBUeXBlU3Vic3RpdHV0b3JkZXB0aGlzSW5maW5pdGVfVHlwZVVuaWZpY2F0aW9ucXVhbnRpZmllZFZhcmlhYmxlc191bml2ZXJzYWxseVF1YW50aWZpZWRWYXJpYWJsZXN0eXBlMV91bmlmeV9zdWJzdGl0dXRlSGVhZG5leHRUeXBlVW5leHBlY3RlZCBjeWNsZSBmb3VuZCBkdXJpbmcgdW5pZmljYXRpb25fZmFpbGxlZnRJbnN0YW5jZXJpZ2h0SW5zdGFuY2VpbnN0YW50aWF0b3JpbnN0YW50aWF0b3JUeXBlbGVmdFJldHVybnJpZ2h0UmV0dXJuX3RyeVN1YnN0aXR1dGlvbmRlZXBTdWJzdGl0dXRlX09jY3VycmVuY2VWaXNpdG9yaGFuZGxlVHlwZVBhcmFtZXRlcmdldFN1YnN0aXR1dGlvbk1hcGdldFVwcGVyQm91bmRTdWJzdGl0dXRpb25NYXBzdWJzdGl0dXRlRGVlcHN1YnN0aXR1dG9yY29udGFpbnNUeXBlVmFyaWFibGV1bmlmeVR5cGVzdW5pZmllcmdldEZyZXNoVHlwZVBhcmFtZXRlcnNmcmVzaFBhcmFtZXRlcnNrZXJuZWwudHlwZV9lbnZpcm9ubWVudEhpZXJhcmNoeUJhc2VkVHlwZUVudmlyb25tZW50RXJyb3JIYW5kbGVyVHlwZUVudmlyb25tZW50eWllbGRUeXBlY3VycmVudEFzeW5jTWFya2VyZXJyb3JIYW5kbGVyZnJvbVN1YmNsYXNzb2JqZWN0Q2xhc3NudWxsQ2xhc3Nib29sQ2xhc3NpbnRDbGFzc251bVR5cGVudW1DbGFzc2RvdWJsZUNsYXNzc3RyaW5nQ2xhc3NzeW1ib2xDbGFzc3R5cGVDbGFzc3Jhd0Z1bmN0aW9uVHlwZWZ1bmN0aW9uQ2xhc3NmdXR1cmVPckNsYXNzZWxlbWVudFR5cGVsaXN0Q2xhc3NzZXRDbGFzc21hcENsYXNzaXRlcmFibGVUeXBlaXRlcmFibGVDbGFzc3N0cmVhbVR5cGVzdHJlYW1DbGFzc2Z1dHVyZUNsYXNzU3VidHlwZVRlc3RlcnR5cGVDaGVja3Npc1RvcF9jb2xsZWN0X2lzU3VidHlwZU9mc3VidHlwZWlzU3VidHlwZU9mc3VidHlwZUFyZ3N1cGVydHlwZUFyZ3N1YnR5cGVGdXR1cmVzdXBlcnR5cGVGdXR1cmVfaXNGdW5jdGlvblN1YnR5cGVPZnN1YlBhcmFtZXRlcnN1cGVyUGFyYW1ldGVyc3ViQm91bmRzdXBlcnR5cGVQYXJhbWV0ZXJzdWJ0eXBlUGFyYW1ldGVyc3VidHlwZU5hbWVJbmRleGtlcm5lbC5jb3FfYW5ub3RDb3FMaWJkZXN0UGF0aFJlbGF0aXZlY29xY29xcmVmbm9jb3Fjb3FvcHRjb3FzaW5nbGVjb3FkZWZjb3FzaW5nbGVkZWZjb3FFbnVtc2tlcm5lbC5jbGFzc19oaWVyYXJjaHlIYW5kbGVBbWJpZ3VvdXNTdXBlcnR5cGVzTWl4aW5JbmZlcnJlcmluZmVyQ2xhc3NIaWVyYXJjaHlvbkFtYmlndW91c1N1cGVydHlwZXNtaXhpbkluZmVycmVyIGNhbid0IGltcGxlbWVudCBib3RoIF9pbml0aWFsaXplZ2V0T3JkZXJlZENsYXNzZXN1bm9yZGVyZWRnZW5lcmljU3VwZXJ0eXBlc09mZ2V0TGVnYWN5TGVhc3RVcHBlckJvdW5kZ2V0Q2xhc3NBc0luc3RhbmNlT2Zhc0luc3RhbnRpYXRpb25PZmdldERpc3BhdGNoVGFyZ2V0c2V0dGVyZ2V0RGlzcGF0Y2hUYXJnZXRzc2V0dGVyc2dldEludGVyZmFjZU1lbWJlcmdldEludGVyZmFjZU1lbWJlcnNnZXREZWNsYXJlZE1lbWJlcnNpc1N1YmNsYXNzT2ZzdWJjbGFzc2lzVXNlZEFzTWl4aW5mb3JFYWNoT3ZlcnJpZGVQYWlyYXBwbHlUcmVlQ2hhbmdlc3JlbW92ZWRMaWJyYXJpZXNlbnN1cmVLbm93bkxpYnJhcmllc3JlaXNzdWVBbWJpZ3VvdXNTdXBlcnR5cGVzRm9yYXBwbHlNZW1iZXJDaGFuZ2VzZmluZERlc2NlbmRhbnRzbWVyZ2VTb3J0ZWRMaXN0c2ZpcnN0TWVtYmVyc2Vjb25kTWVtYmVyY29tcGFyZWNvbXBhcmVNZW1iZXJzY29tcGFyZU5hbWVzZmlyc3ROYW1lc2Vjb25kTmFtZWZpcnN0SGFzaHNlY29uZEhhc2hmaXJzdFN0cmluZ3NlY29uZFN0cmluZ2ZpcnN0TGVuZ3Roc2Vjb25kTGVuZ3RoZmlyc3RMaWJyYXJ5c2Vjb25kTGlicmFyeWZpcnN0VW5pdHNlY29uZFVuaXRkZWx0YWZpbmRNZW1iZXJCeU5hbWVDbGFzc0hpZXJhcmNoeVN1YnR5cGVzZ2V0U3VidHlwZXNPZmdldFNpbmdsZVRhcmdldEZvckludGVyZmFjZUludm9jYXRpb25fQ2xhc3NJbmZvU3VidHlwZWNsYXNzSW5mb3RvcERvd25JbmRleHN1YnR5cGVJbnRlcnZhbExpc3RfQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzX2NsYXNzZXNCeVRvcERvd25JbmRleF9pbmZvTWFwaW52YWxpZGF0ZWRfdG9wRG93blNvcnRJbmRleGFsbEJldHNPZmZfdG9wRG93blNvcnRWaXNpdHN1YkluZm9zdWJ0eXBlU2V0QnVpbGRlcmFkZFNpbmdsZXRvbmRpcmVjdEV4dGVuZGVyc3N1YnR5cGVJbmZvYWRkSW50ZXJ2YWxMaXN0ZGlyZWN0TWl4ZXJzZGlyZWN0SW1wbGVtZW50ZXJzYnVpbGRJbnRlcnZhbExpc3RUaGlzIGRhdGFzdHJ1Y3R1cmUgaGFzIGJlZW4gaW52YWxpZGF0ZWRzdWJ0eXBlc3RvQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeV9vbkFtYmlndW91c1N1cGVydHlwZXNfb25BbWJpZ3VvdXNTdXBlcnR5cGVzTm90V3JhcHBlZGtub3duTGlicmFyaWVzX3JlY29yZGVkQW1iaWd1b3VzU3VwZXJ0eXBlc19jYWNoZWRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzX3RvcFNvcnRJbmRleHJlY29yZGVkaW5mb0ZvcnVzZWRnZXRVc2VkQ2xhc3Nlc3Jlc2V0VXNlZG51bWJlck9mQ2xhc3Nlc2NvbXB1dGVTdWJ0eXBlc0luZm9ybWF0aW9udW5vcmRlcmVkU2V0X2dldFJhbmtlZFN1cGVyY2xhc3NJbmZvc2xlYXN0VXBwZXJCb3VuZEluZm9zaGVhcGNoYWlubGFzdEluZm9uZXh0SW5mb2FkZFRvSGVhcGluZm8xaW5mbzJjbGFzc2VzMWNsYXNzZXMyaTFpMmN1cnJlbnREZXB0aG51bUNhbmRpZGF0ZXNBdFRoaXNEZXB0aG5leHQyc3VwZXJUeXBlMWdlbmVyaWNTdXBlclR5cGVzc3VwZXJUeXBlMjogTm8gY2xhc3MgaW5mbyBmb3Igc3VwZXJJbmZvY2FzdGVkVHlwZWltcGxlbWVudGVkU2V0dGVyc2ltcGxlbWVudGVkR2V0dGVyc0FuZENhbGxzX2J1aWxkSW50ZXJmYWNlTWVtYmVyc2RlY2xhcmVkU2V0dGVyc2RlY2xhcmVkR2V0dGVyc0FuZENhbGxzY3Jvc3NHZXR0ZXJzU2V0dGVyc3N1cGVyR2V0dGVyc3N1cGVyU2V0dGVyc19yZXBvcnRPdmVycmlkZXNkZWNsYXJlZExpc3Rpbmhlcml0ZWRMaXN0ZGVjbGFyZWRpbmhlcml0ZWRzdXBlcnR5cGVzbGlic2FkZGVkQ2xhc3Nlc1NvcnRlZGV4cGVjdGVkU3RhcnRJbmRleF90b3BvbG9naWNhbFNvcnRWaXNpdG9yZGVyZWRMaXN0X2luaXRpYWxpemVUb3BvbG9naWNhbGx5U29ydGVkQ2xhc3Nlc3Byb2Nlc3NlZENsYXNzZXN3b3JrbGlzdHRvcG9sb2dpY2FsSW5kZXhfYnVpbGREZWNsYXJlZE1lbWJlcnNfYnVpbGRJbXBsZW1lbnRlZE1lbWJlcnNpbnRlcmZhY2VTZXR0ZXJzaW50ZXJmYWNlR2V0dGVyc0FuZENhbGxzc2FuaXR5Q2hlY2tBbHNvS25vd3NQYXJlbnRBbmRMaWJyYXJ5RGlkbid0IGtub3cgbGlicmFyeSBvZiAgKGZyb20gRGlkbid0IGtub3cgcGFyZW50IG9mIGV4cGVjdGVkU3RhcnRpbmdUb3BvbG9naWNhbEluZGV4X2NvbGxlY3RTdXBlcnNGb3JDbGFzc19yZWNvcmRTdXBlclR5cGVzTm8gaW5mbyBmb3IgIGZyb20gVW5leHBlY3RlZCB0b3BvbG9naWNhbEluZGV4ICggIT0gKSBmb3IgYmVpbmdWaXNpdGVkQ3ljbGljIGluaGVyaXRhbmNlIGludm9sdmluZyBzdXBlckRlcHRobWl4ZWRJbmZvbWl4aW5NZW1iZXJpbmhlcml0ZWRNZW1iZXJzaW5oZXJpdGVkU2V0dGVyc3NraXBBYnN0cmFjdE1lbWJlcnNhbGxJbmhlcml0ZWRNZW1iZXJzaW5oZXJpdEZyb21faW5oZXJpdE1lbWJlcnNkZWNsYXJlZE1lbWJlcmluaGVyaXRlZE1lbWJlcl9nZXRVbnNoYWRvd2VkSW5oZXJpdGVkTWVtYmVyc3JlY29yZEdlbmVyaWNTdXBlclR5cGVzdXBlcmNsYXNzU2V0QnVpbGRlcnN1cGVydHlwZVNldEJ1aWxkZXJzdXBlcnR5cGVJbmZvc3VwZXJjbGFzc0ludGVydmFsTGlzdHN1cGVydHlwZUludGVydmFsTGlzdG1peGVkSW5UeXBlSW5mb2dldEV4cGVuc2VIaXN0b2dyYW1pbnRlcnZhbHNvbGRMZW5ndGhmaWxsUmFuZ2VnZXRDb21wcmVzc2lvblJhdGlvc2l6ZXNnZXRTdXBlclR5cGVIYXNoVGFibGVTaXplc3VtX0ludGVydmFsTGlzdEJ1aWxkZXJldmVudHNhZGRJbnRlcnZhbGluc2lkZUNvdW50ZXZlbnRfQ2xhc3NJbmZvQ2xhc3NTZXRfY2xhc3Nlc19MdWJIZWFwc29ydHNCZWZvcmVzb3J0c0JlZm9yZVN0YXRpY19pbnRlcnZhbExpc3RDb250YWluc2ludGVydmFsTGlzdF9pbnRlcnZhbExpc3RTaXpla2VybmVsLmNvcmVfdHlwZXNDb3JlVHlwZXNyZXF1aXJlZENsYXNzZXNkYXJ0OmNvcmVPYmplY3ROdWxsYm9vbGludG51bWRvdWJsZVN0cmluZ0xpc3RNYXBJdGVyYWJsZUl0ZXJhdG9yU3ltYm9sRnVuY3Rpb25JbnZvY2F0aW9uRmFsbFRocm91Z2hFcnJvcmRhcnQ6X2ludGVybmFsZGFydDphc3luY1N0cmVhbV9jb3JlTGlicmFyeV9vYmplY3RDbGFzc19udWxsQ2xhc3NfYm9vbENsYXNzX2ludENsYXNzX251bUNsYXNzX2RvdWJsZUNsYXNzX3N0cmluZ0NsYXNzX2xpc3RDbGFzc19zZXRDbGFzc19tYXBDbGFzc19pdGVyYWJsZUNsYXNzX2l0ZXJhdG9yQ2xhc3Nfc3ltYm9sQ2xhc3NfdHlwZUNsYXNzX2Z1bmN0aW9uQ2xhc3NfaW52b2NhdGlvbkNsYXNzX2ludm9jYXRpb25NaXJyb3JDbGFzc19pbnZvY2F0aW9uTWlycm9yV2l0aFR5cGVDb25zdHJ1Y3Rvcl9ub1N1Y2hNZXRob2RFcnJvckRlZmF1bHRDb25zdHJ1Y3Rvcl9saXN0RnJvbUNvbnN0cnVjdG9yX2xpc3RVbm1vZGlmaWFibGVDb25zdHJ1Y3Rvcl9pZGVudGljYWxQcm9jZWR1cmVfZmFsbFRocm91Z2hFcnJvclVybEFuZExpbmVDb25zdHJ1Y3Rvcl9vYmplY3RFcXVhbHNfbWFwVW5tb2RpZmlhYmxlX2ludGVybmFsU3ltYm9sQ2xhc3NfYXN5bmNMaWJyYXJ5X2Z1dHVyZUNsYXNzX3N0YWNrVHJhY2VDbGFzc19zdHJlYW1DbGFzc19hc3luY0F3YWl0Q29tcGxldGVyQ2xhc3NfZnV0dXJlT3JDbGFzc19hc3luY0F3YWl0Q29tcGxldGVyQ29uc3RydWN0b3JfY29tcGxldGVPbkFzeW5jUmV0dXJuUHJvY2VkdXJlX2NvbXBsZXRlckNvbXBsZXRlRXJyb3Jfc3luY0l0ZXJhYmxlRGVmYXVsdENvbnN0cnVjdG9yX3N0cmVhbUl0ZXJhdG9yRGVmYXVsdENvbnN0cnVjdG9yX2FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJEZWZhdWx0Q29uc3RydWN0b3JfYXN5bmNTdGFyTGlzdGVuSGVscGVyUHJvY2VkdXJlX2FzeW5jU3Rhck1vdmVOZXh0SGVscGVyUHJvY2VkdXJlX2FzeW5jU3RhY2tUcmFjZUhlbHBlclByb2NlZHVyZV9hc3luY1RoZW5XcmFwcGVySGVscGVyUHJvY2VkdXJlX2FzeW5jRXJyb3JXcmFwcGVySGVscGVyUHJvY2VkdXJlX2F3YWl0SGVscGVyUHJvY2VkdXJlX2Jvb2xGcm9tRW52aXJvbm1lbnRfbWlycm9yc0xpYnJhcnlfcHJhZ21hQ2xhc3NfcHJhZ21hTmFtZV9wcmFnbWFPcHRpb25zX3ByYWdtYUNvbnN0cnVjdG9yYXN5bmNFcnJvcldyYXBwZXJIZWxwZXJQcm9jZWR1cmVnZXRUb3BMZXZlbE1lbWJlcl9hc3luY0Vycm9yV3JhcHBlckhlbHBlcmFzeW5jTGlicmFyeWdldExpYnJhcnlhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkZ2V0TWVtYmVyX0FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkRXJyb3JhZGRFcnJvcmFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW1hZGRTdHJlYW1hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQ2xhc3NnZXRDbGFzc2FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJDbG9zZWFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJEZWZhdWx0Q29uc3RydWN0b3Jhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyU3RyZWFtZ2V0OnN0cmVhbWFzeW5jU3Rhckxpc3RlbkhlbHBlcl9hc3luY1N0YXJMaXN0ZW5IZWxwZXJhc3luY1N0YXJNb3ZlTmV4dEhlbHBlcl9hc3luY1N0YXJNb3ZlTmV4dEhlbHBlcmFzeW5jU3RhY2tUcmFjZUhlbHBlclByb2NlZHVyZV9hc3luY1N0YWNrVHJhY2VIZWxwZXJhc3luY1RoZW5XcmFwcGVySGVscGVyUHJvY2VkdXJlX2FzeW5jVGhlbldyYXBwZXJIZWxwZXJhd2FpdEhlbHBlclByb2NlZHVyZV9hd2FpdEhlbHBlcmFzeW5jQXdhaXRDb21wbGV0ZXJDbGFzc19Bc3luY0F3YWl0Q29tcGxldGVyYXN5bmNBd2FpdENvbXBsZXRlckNvbnN0cnVjdG9yY29tcGxldGVPbkFzeW5jUmV0dXJuX2NvbXBsZXRlT25Bc3luY1JldHVybmNvbXBsZXRlckNvbXBsZXRlRXJyb3JDb21wbGV0ZXJjb21wbGV0ZXJGdXR1cmVnZXQ6ZnV0dXJlY29yZUxpYnJhcnl0cnlHZXRDbGFzc0Z1dHVyZU9yaWRlbnRpY2FsUHJvY2VkdXJlaWRlbnRpY2FsaW50ZXJuYWxTeW1ib2xDbGFzc2ludm9jYXRpb25DbGFzc2ludm9jYXRpb25NaXJyb3JDbGFzc19JbnZvY2F0aW9uTWlycm9yaW52b2NhdGlvbk1pcnJvcldpdGhUeXBlQ29uc3RydWN0b3Jfd2l0aFR5cGVpdGVyYXRvckNsYXNzbGlzdEZyb21Db25zdHJ1Y3Rvcmxpc3RVbm1vZGlmaWFibGVDb25zdHJ1Y3RvcnVubW9kaWZpYWJsZVNldG1hcFVubW9kaWZpYWJsZW1pcnJvcnNMaWJyYXJ5dHJ5R2V0TGlicmFyeWRhcnQ6bWlycm9yc25vU3VjaE1ldGhvZEVycm9yRGVmYXVsdENvbnN0cnVjdG9yTm9TdWNoTWV0aG9kRXJyb3J3aXRoSW52b2NhdGlvbm9iamVjdEVxdWFsc3ByYWdtYUNsYXNzcHJhZ21hcHJhZ21hTmFtZXByYWdtYU9wdGlvbnNwcmFnbWFDb25zdHJ1Y3RvcnN0YWNrVHJhY2VDbGFzc1N0YWNrVHJhY2VzdHJlYW1JdGVyYXRvclN1YnNjcmlwdGlvbl9TdHJlYW1JdGVyYXRvcl9zdWJzY3JpcHRpb25zdHJlYW1JdGVyYXRvckNhbmNlbGNhbmNlbHN0cmVhbUl0ZXJhdG9yQ2xhc3NzdHJlYW1JdGVyYXRvckRlZmF1bHRDb25zdHJ1Y3RvcnN0cmVhbUl0ZXJhdG9yTW92ZU5leHRzdHJlYW1JdGVyYXRvckN1cnJlbnRnZXQ6Y3VycmVudHN5bmNJdGVyYWJsZURlZmF1bHRDb25zdHJ1Y3Rvcl9TeW5jSXRlcmFibGVzeW5jSXRlcmF0b3JDbGFzc19TeW5jSXRlcmF0b3JzeW5jSXRlcmF0b3JDdXJyZW50c3luY0l0ZXJhdG9yWWllbGRFYWNoSXRlcmFibGVfeWllbGRFYWNoSXRlcmFibGVmYWxsVGhyb3VnaEVycm9yVXJsQW5kTGluZUNvbnN0cnVjdG9yX2NyZWF0ZWJvb2xGcm9tRW52aXJvbm1lbnRmcm9tRW52aXJvbm1lbnRwYWNrYWdlX2NvbmZpZy5wYWNrYWdlc25vUGFja2FnZXNwYWNrYWdlVXJpbm90Rm91bmRhc01hcHBhY2thZ2VfY29uZmlnLnBhY2thZ2VzX2ZpbGVpc1ZhbGlkUGFja2FnZU5hbWViYXNlTG9jYXRpb25pc0NvbW1lbnRzZXBhcmF0b3JJbmRleGNoYXJNaXNzaW5nIHBhY2thZ2UgbmFtZU5vICc6JyBvbiBsaW5lcGFja2FnZU5hbWVOb3QgYSB2YWxpZCBwYWNrYWdlIG5hbWVwYWNrYWdlTG9jYXRpb25TYW1lIHBhY2thZ2UgbmFtZSBvY2N1cmVkIHR3aWNlLnBhY2thZ2VNYXBwaW5nY29tbWVudE11c3QgYmUgYWJzb2x1dGVjb21tZW50TGluZSMgIyBnZW5lcmF0ZWQgYnkgcGFja2FnZTpwYWNrYWdlX2NvbmZpZyBhdCAiIGlzIG5vdCBhIHZhbGlkIHBhY2thZ2UgbmFtZVBhY2thZ2UgbG9jYXRpb24gbXVzdCBub3QgYmUgYSBwYWNrYWdlOiBVUklfcmVsYXRpdml6ZWhhc1F1ZXJ5aGFzRnJhZ21lbnRoYXNBdXRob3JpdHlub3JtYWxpemVQYXRoLi9wYWNrYWdlX2NvbmZpZy5wYWNrYWdlc19pbXBsVW5tb2RpZmlhYmxlTWFwVmlld2NoZWNrVmFsaWRQYWNrYWdlVXJpTm9QYWNrYWdlc05vIHBhY2thZ2UgbmFtZWQgIlBhY2thZ2VzQmFzZXBhY2thZ2VCYXNlZ2V0QmFzZXBhY2thZ2VQYXRoX21hcHBpbmdOb25GaWxlUGFja2FnZXNEaXJlY3RvcnlQYWNrYWdlc19wYWNrYWdlQmFzZV9mYWlsTGlzdGluZ1BhY2thZ2VzQ2Fubm90IGxpc3QgcGFja2FnZXMgZm9yIGEgYmFzZWQgcGFja2FnZSByb290ZnJvbnRfZW5kLnRlcm1pbmFsX2NvbG9yX3N1cHBvcnRQcm9jZXNzUHJvY2Vzc1Jlc3VsdEFMTF9DT0RFU1RFUk1JTkFMX0NBUEFCSUxJVElFU2VuYWJsZVRlcm1pbmFsQ29sb3JzcHJpbnRsbl9jb21wdXRlRW5hYmxlQ29sb3Jzc3VwcG9ydHNBbnNpRXNjYXBlc05vdCBlbmFibGluZyBjb2xvcnMgYXMgQU5TSSBpcyBub3Qgc3VwcG9ydGVkLkVuYWJsaW5nIGNvbG9ycyBhcyBPUyBpcyBXaW5kb3dzLi9iaW4vc2gtY3R0eSA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGxOb3QgZW5hYmxpbmcgY29sb3JzLCBzdGRpbiBpc24ndCBhIHRlcm1pbmFsLnByaW50ZiAnJXMnICdjb2xvcnMKc2V0YWYgMApzZXRhZiAxCnNldGFmIDIKc2V0YWYgMwpzZXRhZiA0CnNldGFmIDUKc2V0YWYgNgpzZXRhZiA3Cm9wCicgfCB0cHV0IC1TTm90IGVuYWJsaW5nIGNvbG9ycywgcnVubmluZyB0cHV0IGZhaWxlZC5Ob3QgZW5hYmxpbmcgY29sb3JzLCB1bmV4cGVjdGVkIG91dHB1dCBmcm9tIHRwdXQ6IG51bWJlck9mQ29sb3JzTm90IGVuYWJsaW5nIGNvbG9ycywgbGVzcyB0aGFuIDggY29sb3JzIHN1cHBvcnRlZDogYWxsQ29kZXMbWzMwbRtbMzFtG1szMm0bWzMzbRtbMzRtG1szNW0bWzM2bRtbMzdtG1szOTs0OW1Ob3QgZW5hYmxpbmcgY29sb3JzLCBjb2xvciBjb2RlcyBkb24ndCBtYXRjaDogRW5hYmxpbmcgY29sb3JzLmZhc3RhLmNvbW1hbmRfbGluZV9yZXBvcnRpbmdtaW5DcmFzaHNhZmVUb1N0cmluZ2dldFNvdXJjZUxpbmV1bmhhbmRsZWRoaWRlV2FybmluZ3Nzb3VyY2VMaW5laW5kZW50TGVuZ3RobGVuZ3RoSW5Tb3VyY2VMaW5lcG9pbnRlcnBvaW50ZXJMZW5ndGguLi5DcmFzaCB3aGVuIGZvcm1hdHRpbmc6IGlzSGlkZGVuc2hvdWxkVGhyb3dPbmlzQ29tcGlsZVRpbWVFcnJvcmZhc3RhLm1lc3NhZ2VzZ2V0TG9jYXRpb25Gcm9tVXJpZ2V0TG9jYXRpb25Gcm9tTm9kZWZhc3RhLnByb2JsZW1zRGVidWdBYm9ydDogd2hhdHVuZXhwZWN0ZWRleHBlY3RlZGFjdHVhbHVuc3VwcG9ydGVkb3BlcmF0aW9uZ2V0RmlsZVVyaWZhc3RhLnRpY2tlcnN3cHJldmlvdXNUaWNrc2luY2VTdGFydG1zLnJlc2V0ZmFzdGEudXJpX3RyYW5zbGF0b3JkYXJ0TGlicmFyaWVzZ2V0RGFydFBhdGNoZXNpc1BsYXRmb3JtSW1wbGVtZW50YXRpb250cmFuc2xhdGVyZXBvcnRNZXNzYWdlX3RyYW5zbGF0ZURhcnRVcmlfdHJhbnNsYXRlUGFja2FnZVVyaWlzTGlicmFyeVN1cHBvcnRlZF9wYWNrYWdlVXJpTm90Rm91bmRfcGFja2FnZVVyaU5vdEZvdW5kTm9SZXBvcnRDOlxyZXNvbHZlSW5wdXRVcmlwYXJzZVVyaWZpbGU6eC1yZXNvbHZlQW1iaWd1b3VzV2luZG93c1BhdGhmYXN0YS5zY2FubmVyLnRva2VuYW5hbHl6ZXJUb2tlblR5cGVJREVOVElGSUVSX1RPS0VOTEFaWV9USFJFU0hPTER2YWx1ZU9yTGF6eVN1YnN0cmluZ2Nhbm9uaWNhbGl6ZXJmcm9tU3RyaW5nY2Fub25pY2FsaXplcHJlY2VkaW5nQ29tbWVudHNmcm9tU3Vic3RyaW5nZnJvbVV0ZjhCeXRlc2FzY2lpT25seWJvb2xWYWx1ZWlzSWRlbnRpZmllcmNhbm9uaWNhbGl6ZWRTdHJpbmdkZWNvZGVVdGY4Y29weWNvcHlDb21tZW50c25vU3VjaE1ldGhvZF92YWx1ZT1TeW50aGV0aWNTdHJpbmdUb2tlbl9sZW5ndGhDb21tZW50VG9rZW5wcmV2aW91c3NldE5leHRXaXRob3V0U2V0dGluZ1ByZXZpb3VzbWFqb3JtaW5vclNJTkdMRV9MSU5FX0NPTU1FTlR0b2tlblN0YXJ0RGFydERvY1Rva2VuX0xhenlTdWJzdHJpbmdfQ29tcGFjdExhenlTdWJzdHJpbmdfRnVsbExhenlTdWJzdHJpbmdERUZBVUxUX0NPTE9SG1szOTs0OW1fc3VwcG9ydHNBbnNpRXNjYXBlc3N0ZGVyclN1cHBvcnRzQ29sb3Jzc3Rkb3V0U3VwcG9ydHNDb2xvcnNOb3QgZW5hYmxpbmcgY29sb3JzLCBzdGRvdXQgZG9lcyBub3Qgc3VwcG9ydCBBTlNJIGNvbG9ycy5Ob3QgZW5hYmxpbmcgY29sb3JzLCBzdGRlcnIgZG9lcyBub3Qgc3VwcG9ydCBBTlNJIGNvbG9ycy5CZWdpblRva2VuZW5kVG9rZW5wcmVjZWRpbmdDb21tZW50TFRPUEVOX0NVUkxZX0JSQUNLRVRPUEVOX1BBUkVOT1BFTl9TUVVBUkVfQlJBQ0tFVD8uW1FVRVNUSU9OX1BFUklPRF9PUEVOX1NRVUFSRV9CUkFDS0VUU1RSSU5HX0lOVEVSUE9MQVRJT05fRVhQUkVTU0lPTmVuZEdyb3VwRG9jdW1lbnRhdGlvbkNvbW1lbnRUb2tlbkFCU1RSQUNUQVNBU1NFUlRBU1lOQ0FXQUlUQlJFQUtDQVNFQ0FUQ0hDTEFTU0NPTlNUQ09OVElOVUVDT1ZBUklBTlRERUZBVUxUREVGRVJSRURET0RZTkFNSUNFTFNFRU5VTWVudW1FWFBPUlRFWFRFTkRTRVhURU5TSU9ORVhURVJOQUxGQUNUT1JZRkFMU0VmYWxzZUZJTkFMRklOQUxMWUZPUkZVTkNUSU9OR0VUSElERUlGSU1QTEVNRU5UU0lNUE9SVElOSU5URVJGQUNFaW50ZXJmYWNlSVNMQVRFbGF0ZUxJQlJBUllNSVhJTk5BVElWRW5hdGl2ZU5FV05VTExPRk9OT1BFUkFUT1JQQVJUUEFUQ0hwYXRjaFJFUVVJUkVEcmVxdWlyZWRSRVRIUk9XUkVUVVJOU0VUU0hPV1NPVVJDRVNUQVRJQ1NVUEVSU1dJVENIU1lOQ1RISVNUSFJPV1RSVUVUUllUWVBFREVGVkFSVk9JRFdISUxFV0lUSFlJRUxEa2V5d29yZHNpc0J1aWx0SW5pc1BzZXVkb2lzTW9kaWZpZXJpc1RvcExldmVsS2V5d29yZGlzQnVpbHRJbk9yUHNldWRvaXNQc2V1ZG9LZXl3b3Jkc3ludGF4X2NyZWF0ZUtleXdvcmRNYXBrZXl3b3JkS2V5d29yZFRva2VuaXNLZXl3b3JkaXNLZXl3b3JkT3JJZGVudGlmaWVyU2ltcGxlVG9rZW5fcHJlY2VkaW5nQ29tbWVudF9zZXRDb21tZW50UGFyZW50Y2hhckNvdW50Y2hhckVuZGJlZm9yZVN5bnRoZXRpY2lzRW9mRU9GaXNPcGVyYXRvcnN0cmluZ1ZhbHVlc2V0TmV4dG1hdGNoZXNBbnlTeW50aGV0aWNCZWdpblRva2VuU3ludGhldGljS2V5d29yZFRva2VucHJlY2VlZGluZ0NvbW1lbnRlb2ZsZXhpY2FsbHlGaXJzdFRva2VuQ2xhc3NOT19DTEFTU0FERElUSVZFX09QRVJBVE9SQVNTSUdOTUVOVF9PUEVSQVRPUkJJVFdJU0VfQU5EX09QRVJBVE9SQklUV0lTRV9PUl9PUEVSQVRPUkJJVFdJU0VfWE9SX09QRVJBVE9SQ0FTQ0FERV9PUEVSQVRPUkNPTkRJVElPTkFMX09QRVJBVE9SRVFVQUxJVFlfT1BFUkFUT1JJRl9OVUxMX09QRVJBVE9STE9HSUNBTF9BTkRfT1BFUkFUT1JMT0dJQ0FMX09SX09QRVJBVE9STVVMVElQTElDQVRJVkVfT1BFUkFUT1JSRUxBVElPTkFMX09QRVJBVE9SU0hJRlRfT1BFUkFUT1JVTkFSWV9QT1NURklYX09QRVJBVE9SVU5BUllfUFJFRklYX09QRVJBVE9SRE9VQkxFSEVYQURFQ0lNQUxoZXhhZGVjaW1hbElERU5USUZJRVJpZGVudGlmaWVySU5UTVVMVElfTElORV9DT01NRU5UU0NSSVBUX1RBR1NUUklOR0FNUEVSU0FOREFNUEVSU0FORF9BTVBFUlNBTkRBTVBFUlNBTkRfQU1QRVJTQU5EX0VRJiY9QU1QRVJTQU5EX0VRJj1BVEJBTkdCQU5HX0VRQkFOR19FUV9FUSE9PUJBUkJBUl9CQVJCQVJfQkFSX0VRfHw9QkFSX0VRfD1DT0xPTkNPTU1BQ0FSRVRDQVJFVF9FUV49Q0xPU0VfQ1VSTFlfQlJBQ0tFVENMT1NFX1BBUkVOQ0xPU0VfU1FVQVJFX0JSQUNLRVRFUUVRX0VRRVFfRVFfRVE9PT1HVEdUX0VRR1RfR1RHVF9HVF9FUT4+PUdUX0dUX0dUR1RfR1RfR1RfRVE+Pj49SEFTSElOREVYSU5ERVhfRVFMVF9FUUxUX0xUTFRfTFRfRVE8PD1NSU5VU01JTlVTX0VRLT1NSU5VU19NSU5VUy0tUEVSQ0VOVFBFUkNFTlRfRVElPVBFUklPRFBFUklPRF9QRVJJT0RQTFVTUExVU19FUSs9UExVU19QTFVTKytRVUVTVElPTlFVRVNUSU9OX1BFUklPRD8uUVVFU1RJT05fUVVFU1RJT05RVUVTVElPTl9RVUVTVElPTl9FUT8/PVNFTUlDT0xPTlNMQVNIU0xBU0hfRVEvPVNUQVJTVEFSX0VRKj1TVFJJTkdfSU5URVJQT0xBVElPTl9JREVOVElGSUVSJFRJTERFVElMREVfU0xBU0hUSUxERV9TTEFTSF9FUX4vPUJBQ0tQSU5HYEJBQ0tTTEFTSFBFUklPRF9QRVJJT0RfUEVSSU9EUEVSSU9EX1BFUklPRF9QRVJJT0RfUVVFU1RJT04uLi4/QkFEX0lOUFVUbWFsZm9ybWVkIGlucHV0UkVDT1ZFUllyZWNvdmVyeWFsbHVuc3BlY2lmaWVkaXNBZGRpdGl2ZU9wZXJhdG9yaXNBc3NpZ25tZW50T3BlcmF0b3Jpc0Fzc29jaWF0aXZlT3BlcmF0b3Jpc0VxdWFsaXR5T3BlcmF0b3Jpc0luY3JlbWVudE9wZXJhdG9yaXNNdWx0aXBsaWNhdGl2ZU9wZXJhdG9yaXNSZWxhdGlvbmFsT3BlcmF0b3Jpc1NoaWZ0T3BlcmF0b3Jpc1VuYXJ5UG9zdGZpeE9wZXJhdG9yaXNVbmFyeVByZWZpeE9wZXJhdG9yaXNTZWxlY3Rvck9wZXJhdG9yTk9fUFJFQ0VERU5DRUFTU0lHTk1FTlRfUFJFQ0VERU5DRUNBU0NBREVfUFJFQ0VERU5DRUNPTkRJVElPTkFMX1BSRUNFREVOQ0VJRl9OVUxMX1BSRUNFREVOQ0VMT0dJQ0FMX09SX1BSRUNFREVOQ0VMT0dJQ0FMX0FORF9QUkVDRURFTkNFRVFVQUxJVFlfUFJFQ0VERU5DRVJFTEFUSU9OQUxfUFJFQ0VERU5DRUJJVFdJU0VfT1JfUFJFQ0VERU5DRUJJVFdJU0VfWE9SX1BSRUNFREVOQ0VCSVRXSVNFX0FORF9QUkVDRURFTkNFU0hJRlRfUFJFQ0VERU5DRUFERElUSVZFX1BSRUNFREVOQ0VNVUxUSVBMSUNBVElWRV9QUkVDRURFTkNFUFJFRklYX1BSRUNFREVOQ0VQT1NURklYX1BSRUNFREVOQ0VTRUxFQ1RPUl9QUkVDRURFTkNFYmxhY2tsaXN0ZWRDb3JlQ2xhc3Nlc1R5cGVMYWJlbGVybmFtZU1hcG51bGwtdHlwZW51bGwtY29uc3RhbnRtZXNzYWdlc29yaWdpbk1lc3NhZ2Vpc09iamVjdG5hbWVGb3JFbnRpdHlub2RlTmFtZWxhYmVsc0Zvck5hbWVlbnRpdHlGb3JOYW1lYm90dG9tLXR5cGUgRnVuY3Rpb24gZXh0ZW5kcyB0eXBlQXJncHJpbnRpbmcgdW5ldmFsdWF0ZWQgY29uc3RhbnRzTGFiZWxlZE5vZGV0eXBlTGFiZWxlci8qCiAtIHVua25vd25Vcml1bmtub3duZmFzdGEuY3Jhc2hDb250ZW50VHlwZUh0dHBDbGllbnRIdHRwQ2xpZW50UmVxdWVzdFNvY2tldEV4Y2VwdGlvbkNyYXNoIHdoZW4gY29tcGlsaW5nICwKYXQgY2hhcmFjdGVyIG9mZnNldCBkZWZhdWx0U2VydmVyQWRkcmVzc2h0dHA6Ly8xMjcuMC4wLjE6NTk0MTAvaGFzQ3Jhc2hlZGZpcnN0U291cmNlVXJpcmVzZXRDcmFzaFJlcG9ydGluZ3JlcG9ydENyYXNoOnNhdmVkX3RyeV9jb250ZXh0X3ZhcjI6ZXhjZXB0aW9uMDpzdGFja190cmFjZTBub3RlcGFja2FnZTpmYXN0YXNlcnZlclVyaXBvc3RVcmxmb3JjZQpTZW5kaW5nIGNyYXNoIHJlcG9ydCBkYXRhcGVyc2lzdGVudENvbm5lY3Rpb25idWZmZXJPdXRwdXRjb25uZWN0aW9uSW5mb3JlbW90ZUFkZHJlc3NyZW1vdGVQb3J0aGVhZGVyc2NvbnRlbnRUeXBlCgoKRkU6OkVSUk9SOjoKCgpFcnJvciB3aGVuIGNvbnZlcnRpbmcgIHRvIHN0cmluZy5jdXJyZW50VXJpZmFzdGEuZGlsbF90YXJnZXRDbGFzc0J1aWxkZXJUYXJnZXRJbXBsZW1lbnRhdGlvbkRpbGxMaWJyYXJ5QnVpbGRlckRpbGxMb2FkZXJsaWJyYXJ5QnVpbGRlcnNiYWNrZW5kVGFyZ2V0YWRkU291cmNlSW5mb3JtYXRpb25maW5hbGl6ZUV4cG9ydHNjcmVhdGVMaWJyYXJ5QnVpbGRlcm9yaWdpbmJyZWFrQ3ljbGVhZGRMaWJyYXJ5ZmFzdGEua2VybmVsX3RhcmdldENsb25lVmlzaXRvckRpbGxNZW1iZXJCdWlsZGVyQW1iaWd1b3VzQnVpbGRlclNvdXJjZUNsYXNzQnVpbGRlclNvdXJjZUxvYWRlcnRyYW5zZm9ybUxpYnJhcmllc0RlY2xhcmF0aW9uSW52YWxpZFR5cGVCdWlsZGVyS2VybmVsRmllbGRCdWlsZGVyS2VybmVsTGlicmFyeUJ1aWxkZXJOYW1lZFR5cGVCdWlsZGVyUHJvY2VkdXJlQnVpbGRlckxpYnJhcnlCdWlsZGVyVHlwZUJ1aWxkZXJUeXBlRGVjbGFyYXRpb25CdWlsZGVyS2VybmVsQ29uc3RhbnRFcnJvclJlcG9ydGVyTWV0YWRhdGFDb2xsZWN0b3JtZXRhZGF0YUNvbGxlY3RvcmR5bmFtaWNUeXBlZXhjbHVkZVNvdXJjZWNsb25lZEZvcm1hbHNjcmVhdGVMb2FkZXJlbnRyeVBvaW50c3BhY2thZ2VzTWFwYXNTdHJpbmdwYWNrYWdlOmFkZFByb2JsZW1yZWFkYWNjZXNzb3JidWlsZGVyc2NvbGxlY3RNeUNsYXNzZXNpc1BhdGNoYmluZG9iamVjdENsYXNzQnVpbGRlcmludGVyZmFjZXNjcmVhdGVUeXBlSW5mZXJlbmNlRW5naW5lYmVjb21lQ29yZUxpYnJhcnlnZXRMb2NhbE1lbWJlcnJlc29sdmVQYXJ0c2NvbXB1dGVMaWJyYXJ5U2NvcGVzcmVzb2x2ZVR5cGVzY29tcHV0ZURlZmF1bHRUeXBlc215Q2xhc3Nlc2NoZWNrU2VtYW50aWNzZmluaXNoVHlwZVZhcmlhYmxlc2ZpbmFsaXplSW5pdGlhbGl6aW5nRm9ybWFsc2luc3RhbGxEZWZhdWx0U3VwZXJ0eXBlc2luc3RhbGxTeW50aGV0aWNDb25zdHJ1Y3RvcnNyZXNvbHZlQ29uc3RydWN0b3JzY29tcHV0ZUNvcmVUeXBlc2J1aWxkQ2xhc3NIaWVyYXJjaHljb21wdXRlSGllcmFyY2h5cGVyZm9ybVRvcExldmVsSW5mZXJlbmNlY2hlY2tTdXBlcnR5cGVzY2hlY2tCb3VuZHNjaGVja092ZXJyaWRlc2NoZWNrQWJzdHJhY3RNZW1iZXJzY2hlY2tSZWRpcmVjdGluZ0ZhY3Rvcmllc2FkZE5vU3VjaE1ldGhvZEZvcndhcmRlcnNjaGVja01peGluc2J1aWxkT3V0bGluZUV4cHJlc3Npb25zaW5zdGFsbEFsbENvbXBvbmVudFByb2JsZW1zYWxsQ29tcG9uZW50UHJvYmxlbXNCdWlsZGluZyBjb21wb25lbnRidWlsZEJvZGllc2ZpbmlzaENsb25lZFBhcmFtZXRlcnNmaW5pc2hEZWZlcnJlZExvYWRUZWFyb2Zmc2ZpbmlzaE5vU3VjaE1ldGhvZEZvcndhcmRlcnNmaW5pc2hOYXRpdmVNZXRob2RzZmluaXNoUGF0Y2hNZXRob2RzZmluaXNoQWxsQ29uc3RydWN0b3JzcnVuQnVpbGRUcmFuc2Zvcm1hdGlvbnNmb3JtYXR0ZWRNZXNzYWdlY29weVNvdXJjZWRlY2xhcmF0aW9uZXhwb3J0U2NvcGVwcm9ibGVtZ2V0Rmlyc3REZWNsYXJhdGlvbkxpbmtlZCBjb21wb25lbnRidWlsZE1peGVkSW5UeXBlSW5zdGFsbGVkIE9iamVjdCBhcyBpbXBsaWNpdCBzdXBlcmNsYXNzaXNFeHRlbnNpb25pbnN0YWxsRm9yd2FyZGluZ0NvbnN0cnVjdG9yc2luc3RhbGxEZWZhdWx0Q29uc3RydWN0b3JJbnN0YWxsZWQgc3ludGhldGljIGNvbnN0cnVjdG9yc3Byb2NhZGRTeW50aGV0aWNDb25zdHJ1Y3Rvcm1ha2VEZWZhdWx0Q29uc3RydWN0b3JzdWJzdGl0dXRpb25NYXBtYWtlTWl4aW5BcHBsaWNhdGlvbkNvbnN0cnVjdG9yY29weUZvcm1hbGNsb25lbWFrZUNvbnN0cnVjdG9yUmV0dXJuVHlwZW9yaWdpbmFsY2xvbmVydHlwZVN1YnN0aXR1dGlvbkNsb25lZCBkZWZhdWx0IHZhbHVlcyBvZiBmb3JtYWxzdHlwZVBhcmFtZXRlclR5cGVzdHlwZVBhcmFtZXRlcnBsYXRmb3JtTGlicmFyeWRhcnQ6Y29sbGVjdGlvbmZvdW5kbWlycm9yc0Nhbid0IGZpbmQgcGxhZm9ybUxpYnJhcmllc2ZpbmlzaENvbnN0cnVjdG9yc0ZpbmlzaGVkIGNvbnN0cnVjdG9yc3VuaW5pdGlhbGl6ZWRGaWVsZHNub25GaW5hbEZpZWxkc2NvbnN0cnVjdG9ySW5pdGlhbGl6ZWRGaWVsZHNzdXBlclRhcmdldGlzUmVkaXJlY3RpbmdteUluaXRpYWxpemVkRmllbGRzZmllbGRCdWlsZGVyc2NvcGVsb2NhbGluaXRpYWxpemVkRmllbGRzZGFydDpodG1sZGFydDpzdmdkYXJ0Ol9uYXRpdmVfdHlwZWRfZGF0YWRhcnQ6X2ludGVyY2VwdG9yc2pzX3N0cmluZy5kYXJ0aW5zZXJ0ZW5hYmxlQ29uc3RhbnRVcGRhdGUyMDE4ZGVzdWdhclNldHNFdmFsdWF0ZWQgY29uc3RhbnRzcnVuUHJvY2VkdXJlVHJhbnNmb3JtYXRpb25zVmVyaWZpZWQgY29tcG9uZW50cmVhZFBhdGNoRmlsZXNwYXJ0T2Zmc2V0c3BhcnRPZlVyaUtlcm5lbERpYWdub3N0aWNSZXBvcnRlcmRlZmF1bHRTdXBlckNvbnN0cnVjdG9ySU9TaW5rTGltaXRlZEJpbmFyeVByaW50ZXJCeXRlU2lua2tEZWJ1Z0NsYXNzTmFtZSNEZWJ1Z0NsYXNzd3JpdGVDb21wb25lbnRUb0ZpbGVieXRlU2lua2NyZWF0ZUV4cHJlc3Npb25FdmFsdWF0aW9uQ29tcG9uZW50ZmFrZUxpYnJhcnlldmFsdWF0ZXJlYWxDbGFzc2Zha2VDbGFzc3R5cGVQYXJhbXN0eXBlUGFyYW1uZXdOb2RldmlzaXRUeXBlc2VyaWFsaXplUHJvY2VkdXJlZmFzdGEudmVyaWZpZXJWZXJpZnlpbmdWaXNpdG9yVHlwZVNjaGVtYVZpc2l0b3JVbmtub3duVHlwZVN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudEZhc3RhVmVyaWZ5aW5nVmlzaXRvcnNraXBQbGF0Zm9ybWlzT3V0bGluZWNoZWNrTG9jYXRpb24nIGhhcyBubyBmaWxlVXJpJyBoYXMgbm8gZmlsZU9mZnNldGNoZWNrU3VwZXJJbnZvY2F0aW9uY29udGFpbmluZ01lbWJlcmdldENvbnRhaW5pbmdNZW1iZXJTdXBlciBjYWxsIG91dHNpZGUgb2YgYW55IG1lbWJlclN1cGVyIGNhbGwgaW4gYSBtZW1iZXIgbGFja2luZyBUcmFuc2Zvcm1lckZsYWcuc3VwZXJDYWxsc2RldGFpbHNObyBvZmZzZXQgZm9yIExlYWtpbmcgc2hhZG93IG5vZGU6IHZpc2l0VW5rbm93blR5cGVVbmV4cGVjdGVkIGFwcGVhcmFuY2Ugb2YgdGhlIHVua25vd24gdHlwZS5BdHRlbXB0IHRvIGludm9rZSByZWRpcmVjdGluZyBmYWN0b3J5LnZlcmlmaWVyZmFzdGEubG9hZGVyUXVldWV1bnBhcnNlZExpYnJhcmllc2hhbmRsZWRFcnJvcnN1bmhhbmRsZWRFcnJvcnNzZWVuTWVzc2FnZXNieXRlQ291bnRvdXRsaW5lU3VtbWFyeVRlbXBsYXRlaXNTb3VyY2VMb2FkZXJkYXJ0LWV4dHRyYW5zbGF0ZVVyaW9yZy1kYXJ0bGFuZy11bnRyYW5zbGF0YWJsZS11cmlsb2FkRXh0cmFSZXF1aXJlZExpYnJhcmllc21heUltcGxlbWVudFJlc3RyaWN0ZWRUeXBlc3JlY29yZEFjY2Vzc2lzUGFydGVuc3VyZUNvcmVMaWJyYXJ5YnVpbGRCb2R5bG9nU3VtbWFyeXJlbW92ZUZpcnN0YnVpbGRPdXRsaW5laW5NaWNyb3NlY29uZHN3YXNIYW5kbGVkcHJvYmxlbU9uTGlicmFyeWFkZE1lc3NhZ2VmaXhTZXZlcml0eW1lc3NhZ2U6IApjaGFyT2Zmc2V0OiAKZmlsZVVyaTogCnNldmVyaXR5OiBjb250ZXh0TWVzc2FnZWNyZWF0ZUZvcm1hdHRlZE1lc3NhZ2VnZXRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yZ2V0Q29tcGlsZVRpbWVFcnJvcmdldER1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3JnZXROYXRpdmVBbm5vdGF0aW9uY29tcHV0ZUNsYXNzQnVpbGRlckZyb21UYXJnZXRDbGFzc2NvbXB1dGVUeXBlQnVpbGRlcnVudHJhbnNsYXRhYmxlVXJpU2NoZW1lZmFzdGEuc2Nhbm5lci5hYnN0cmFjdF9zY2FubmVyTGlzdE1peGluVWludDE2TGlzdFVpbnQzMkxpc3ROb25Bc2NpaUlkZW50aWZpZXJUb2tlbktleXdvcmRTdGF0ZWxhbmd1YWdlVmVyc2lvbkFic3RyYWN0U2Nhbm5lckxBWllfQVNTSUdOTUVOVF9FTkFCTEVEX2VuYWJsZUV4dGVuc2lvbk1ldGhvZHNfZW5hYmxlTm9uTnVsbGFibGVfZW5hYmxlVHJpcGxlU2hpZnRlcnJvclRhaWxjb21tZW50c2NvbW1lbnRzVGFpbGdyb3VwaW5nU3RhY2tudW1iZXJPZkJ5dGVzSGludGVuYWJsZUV4dGVuc2lvbk1ldGhvZHNlbmFibGVOb25OdWxsYWJsZWVuYWJsZVRyaXBsZVNoaWZ0YWR2YW5jZWN1cnJlbnRBc1VuaWNvZGVwZWVraGFuZGxlVW5pY29kZXN0YXJ0U2Nhbk9mZnNldHNjYW5PZmZzZXRzdHJpbmdPZmZzZXRmaXJzdFRva2VuYmVnaW5Ub2tlbmFwcGVuZFN1YnN0cmluZ1Rva2VuZXh0cmFPZmZzZXRhcHBlbmRUb2tlbmNyZWF0ZVN1YnN0cmluZ1Rva2VuYXBwZW5kU3ludGhldGljU3Vic3RyaW5nVG9rZW5zeW50aGV0aWNDaGFyc2NyZWF0ZVN5bnRoZXRpY1N1YnN0cmluZ1Rva2VuYXBwZW5kUHJlY2VkZW5jZVRva2Vuc2VsZWN0Y2hvaWNlYXBwZW5kS2V5d29yZFRva2VuZGlzY2FyZE9wZW5MdGFwcGVuZEVvZlRva2VudW5tYXRjaGVkQmVnaW5Hcm91cGFwcGVuZFdoaXRlU3BhY2VsaW5lRmVlZEluTXVsdGlsaW5lYXBwZW5kQmVnaW5Hcm91cGFwcGVuZEVuZEdyb3Vwb3BlbktpbmRkaXNjYXJkQmVnaW5Hcm91cFVudGlsYXBwZW5kR3RhcHBlbmRHdEd0cHJlcGVuZEVycm9yVG9rZW5jcmVhdGVDb21tZW50VG9rZW5jcmVhdGVEYXJ0RG9jVG9rZW5jcmVhdGVMYW5ndWFnZVZlcnNpb25Ub2tlbm9yaWdpbmFsU3RhY2tkaXNjYXJkSW50ZXJwb2xhdGlvbmF0RW5kT2ZGaWxlb2xkVGFpbGJpZ0hlYWRlclN3aXRjaGJpZ1N3aXRjaHRva2VuaXplU2xhc2hPckNvbW1lbnR0b2tlbml6ZUxhbmd1YWdlVmVyc2lvbk9yU2luZ2xlTGluZUNvbW1lbnRuZXh0TG93ZXJ0b2tlbml6ZVJhd1N0cmluZ0tleXdvcmRPcklkZW50aWZpZXJ0b2tlbml6ZUtleXdvcmRPcklkZW50aWZpZXJ0b2tlbml6ZURvdHNPck51bWJlcnRva2VuaXplRXF1YWxzdG9rZW5pemVTdHJpbmd0b2tlbml6ZUxlc3NUaGFudG9rZW5pemVHcmVhdGVyVGhhbnRva2VuaXplRXhjbGFtYXRpb250b2tlbml6ZU9wZW5TcXVhcmVCcmFja2V0dG9rZW5pemVBdHRva2VuaXplTnVtYmVydG9rZW5pemVBbXBlcnNhbmR0b2tlbml6ZUhleE9yTnVtYmVydG9rZW5pemVRdWVzdGlvbnRva2VuaXplQmFydG9rZW5pemVQbHVzdG9rZW5pemVNaW51c3Rva2VuaXplTXVsdGlwbHl0b2tlbml6ZUNhcmV0dG9rZW5pemVUaWxkZXRva2VuaXplUGVyY2VudHRva2VuaXplVGFndG9rZW5pemVGcmFjdGlvblBhcnRuZXh0bmV4dHRva2VuaXplSGV4aGFzRGlnaXRzZG9uZWhhc0RpZ2l0aGFzRXhwb25lbnREaWdpdHN0b2tlbml6ZU11bHRpTGluZUNvbW1lbnR0b2tlbml6ZVNpbmdsZUxpbmVDb21tZW50dG9rZW5pemVTaW5nbGVMaW5lQ29tbWVudFJlc3RtYWpvclN0YXJ0bWlub3JTdGFydF9hcHBlbmRUb0NvbW1lbnRTdHJlYW1kYXJ0ZG9jYXBwZW5kRGFydERvY2FwcGVuZENvbW1lbnRhc2NpaU9ubHlDb21tZW50YXNjaWlPbmx5TGluZXN1bmljb2RlU3RhcnRuZXN0aW5nYWR2YW5jZUFmdGVyRXJyb3JuZXdDb21tZW50YWxsb3dEb2xsYXJuZXh0Q2FwaXRhbHRva2VuaXplSWRlbnRpZmllcnJhd3F1b3RlQ2hhcnRva2VuaXplTXVsdGlMaW5lU3RyaW5ndG9rZW5pemVTaW5nbGVMaW5lUmF3U3RyaW5ndG9rZW5pemVTaW5nbGVMaW5lU3RyaW5ncXVvdGVTdGFydHRva2VuaXplU3RyaW5nSW50ZXJwb2xhdGlvbnVudGVybWluYXRlZFN0cmluZ2lzTXVsdGlMaW5laXNSYXd0b2tlbml6ZUludGVycG9sYXRlZEV4cHJlc3Npb250b2tlbml6ZUludGVycG9sYXRlZElkZW50aWZpZXJ0b2tlbml6ZU11bHRpTGluZVJhd1N0cmluZ2FzY2lpT25seVN0cmluZ2FzY2lpT25seUxpbmVlcnJvclRva2VuY29kZVVuaXRzc3VmZml4ZXJyb3JTdGFydHNob3VsZEFkdmFuY2VfTGluZVN0YXJ0cyZPYmplY3QmTGlzdE1peGludm06cHJlZmVyLWlubGluZW1hdGNoRm91bmR3cml0ZUFsbF9jbG9zZUdhcF9maWx0ZXJyZXRhaW5NYXRjaGluZ3JldGFpbmVkX2NvbXBhcmVBbnlzaHVmZmxlcmFuZG9tcG9zbmV4dEludHRtcGxpc3RMZW5ndGhnZXRSYW5nZXJlbW92ZVJhbmdlZmlsbHNraXBDb3VudG90aGVyTGlzdG90aGVyU3RhcnRyZXBsYWNlUmFuZ2VuZXdDb250ZW50c3JlbW92ZUxlbmd0aGluc2VydExlbmd0aGluc2VydEVuZGluZGV4V2hlcmVsYXN0SW5kZXhXaGVyZXJlbW92ZUF0aW5zZXJ0QWxsaW5zZXJ0aW9uTGVuZ3Roc2V0QWxsTGluZVN0YXJ0c2FycmF5YXJyYXlMZW5ndGhleHBlY3RlZE51bWJlck9mTGluZXNncm93c3dpdGNoVG9VaW50MzJuZXdMZW5ndGhNaW5pbXVtbmV3QXJyYXljbGFzc2ljY2xvc2VCcmFjZUluZm9Gb3JfaXNJZGVudGlmaWVyQ2hhcmRhcnQyanMuc2Nhbm5lci5zdHJpbmdfc2Nhbm5lcmVuc3VyZVplcm9UZXJtaW5hdGlvbgBpc0xlZ2FsSWRlbnRpZmllcnN0YXJ0VG9rZW5mYXN0YS5zY2FubmVyLnV0ZjhfYnl0ZXNfc2Nhbm5lcnVuaWNvZGVCb21DaGFyYWN0ZXJSdW5lc2NhblNsYWNrc2NhblNsYWNrT2Zmc2V0dXRmOFNsYWNrbGFzdFVuaWNvZGVPZmZzZXRzdHJpbmdPZmZzZXRTbGFja09mZnNldGNvbnRhaW5zQm9tQXRuZXh0Q29kZVBvaW50bmV4dEJ5dGVleHBlY3RlZEhpZ2hCeXRlc3Jlc2Zhc3RhLnNjYW5uZXIucmVjb3ZlckludGVybmFsIGVycm9yOiBBbGwgZXJyb3IgdG9rZW5zIHNob3VsZCBoYXZlIGJlZW4gcHJlcGVuZGVkOnN5bnRoZXNpemVUb2tlbnNraXBUb0VvZmNsb3NlQnJhY2VGb3JvcGVuQnJhY2VjbG9zZVF1b3RlRm9yb3BlblF1b3RlIiIiJycnciJyJ3IiIiJyJycnZGFydF9zY2FubmVyLmVycm9yX3Rva2VuZXJyb3JNc2deI1swLTldKiAqUGFyc2VydHJhY2VMaW5lc3Vuc3VwcG9ydGVkIG9wZXJhdGlvbkVuY29kaW5nRXJyb3JUb2tlbkVuY29kaW5nRXJyb3JUb2tlbigpTm9uQXNjaWlJZGVudGlmaWVyVG9rZW4oTm9uQXNjaWlXaGl0ZXNwYWNlVG9rZW5Ob25Bc2NpaVdoaXRlc3BhY2VUb2tlbihBc2NpaUNvbnRyb2xDaGFyYWN0ZXJUb2tlbkFzY2lpQ29udHJvbENoYXJhY3RlclRva2VuKFVuc3VwcG9ydGVkT3BlcmF0b3IoVW50ZXJtaW5hdGVkU3RyaW5nKFVudGVybWluYXRlZFRva2VuKFVubWF0Y2hlZFRva2VuKGZhc3RhLnNjYW5uZXIudG9rZW5fY29uc3RhbnRzS0VZV09SRF9UT0tFTlNDUklQVF9UT0tFTkJBRF9JTlBVVF9UT0tFTkRPVUJMRV9UT0tFTklOVF9UT0tFTlJFQ09WRVJZX1RPS0VOSEVYQURFQ0lNQUxfVE9LRU5TVFJJTkdfVE9LRU5BTVBFUlNBTkRfVE9LRU5CQUNLUElOR19UT0tFTkJBQ0tTTEFTSF9UT0tFTkJBTkdfVE9LRU5CQVJfVE9LRU5DT0xPTl9UT0tFTkNPTU1BX1RPS0VORVFfVE9LRU5HVF9UT0tFTkhBU0hfVE9LRU5PUEVOX0NVUkxZX0JSQUNLRVRfVE9LRU5PUEVOX1NRVUFSRV9CUkFDS0VUX1RPS0VOT1BFTl9QQVJFTl9UT0tFTkxUX1RPS0VOTUlOVVNfVE9LRU5QRVJJT0RfVE9LRU5QTFVTX1RPS0VOUVVFU1RJT05fVE9LRU5BVF9UT0tFTkNMT1NFX0NVUkxZX0JSQUNLRVRfVE9LRU5DTE9TRV9TUVVBUkVfQlJBQ0tFVF9UT0tFTkNMT1NFX1BBUkVOX1RPS0VOU0VNSUNPTE9OX1RPS0VOU0xBU0hfVE9LRU5USUxERV9UT0tFTlNUQVJfVE9LRU5QRVJDRU5UX1RPS0VOQ0FSRVRfVE9LRU5TVFJJTkdfSU5URVJQT0xBVElPTl9UT0tFTkxUX0VRX1RPS0VORlVOQ1RJT05fVE9LRU5TTEFTSF9FUV9UT0tFTlBFUklPRF9QRVJJT0RfUEVSSU9EX1RPS0VOUEVSSU9EX1BFUklPRF9UT0tFTkVRX0VRX0VRX1RPS0VORVFfRVFfVE9LRU5MVF9MVF9FUV9UT0tFTkxUX0xUX1RPS0VOR1RfRVFfVE9LRU5HVF9HVF9FUV9UT0tFTklOREVYX0VRX1RPS0VOSU5ERVhfVE9LRU5CQU5HX0VRX0VRX1RPS0VOQkFOR19FUV9UT0tFTkFNUEVSU0FORF9BTVBFUlNBTkRfVE9LRU5BTVBFUlNBTkRfQU1QRVJTQU5EX0VRX1RPS0VOQU1QRVJTQU5EX0VRX1RPS0VOQkFSX0JBUl9UT0tFTkJBUl9CQVJfRVFfVE9LRU5CQVJfRVFfVE9LRU5TVEFSX0VRX1RPS0VOUExVU19QTFVTX1RPS0VOUExVU19FUV9UT0tFTk1JTlVTX01JTlVTX1RPS0VOTUlOVVNfRVFfVE9LRU5USUxERV9TTEFTSF9FUV9UT0tFTlRJTERFX1NMQVNIX1RPS0VOUEVSQ0VOVF9FUV9UT0tFTkdUX0dUX1RPS0VOQ0FSRVRfRVFfVE9LRU5DT01NRU5UX1RPS0VOU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUl9UT0tFTlFVRVNUSU9OX1BFUklPRF9UT0tFTlFVRVNUSU9OX1FVRVNUSU9OX1RPS0VOUVVFU1RJT05fUVVFU1RJT05fRVFfVE9LRU5HRU5FUklDX01FVEhPRF9UWVBFX0FTU0lHTl9UT0tFTkdFTkVSSUNfTUVUSE9EX1RZUEVfTElTVF9UT0tFTkdUX0dUX0dUX1RPS0VOUEVSSU9EX1BFUklPRF9QRVJJT0RfUVVFU1RJT05fVE9LRU5HVF9HVF9HVF9FUV9UT0tFTlFVRVNUSU9OX1BFUklPRF9PUEVOX1NRVUFSRV9CUkFDS0VUX1RPS0VOZmFzdGEuYm9keV9idWlsZGVyQ29uc3RhbnRDb250ZXh0ZmFzdGFNb2RpZmllcmNvbnN0TWFza2NvdmFyaWFudE1hc2tmaW5hbE1hc2tjYWxsTmFtZWluZGV4R2V0TmFtZWluZGV4U2V0TmFtZW1pbnVzTmFtZXBsdXNOYW1lQXNzZXJ0UGFyc2VyRm9ybWFsUGFyYW1ldGVyS2luZElkZW50aWZpZXJDb250ZXh0TWVtYmVyS2luZGxlbmd0aEZvclRva2VubGVuZ3RoT2ZTcGFub2Zmc2V0Rm9yVG9rZW5vcHRpb25hbFF1b3RlYW5hbHl6ZVF1b3RldW5lc2NhcGV1bmVzY2FwZUZpcnN0U3RyaW5nUGFydHVuZXNjYXBlTGFzdFN0cmluZ1BhcnR1bmVzY2FwZVN0cmluZ1Byb2JsZW1CdWlsZGVyRml4ZWROdWxsYWJsZUxpc3RHcm93YWJsZUxpc3RKdW1wVGFyZ2V0S2luZE51bGxWYWx1ZVBhcnNlclJlY292ZXJ5U2NvcGVMaXN0ZW5lclR5cGVJbmZlcnJlclR5cGVQcm9tb3RlclR5cGVQcm9tb3Rpb25GYWN0VHlwZVByb21vdGlvblNjb3BlU3ByZWFkTWFwRW50cnljb252ZXJ0VG9NYXBFbnRyeWlzQ29udmVydGlibGVUb01hcEVudHJ5Q29uc3RuZXNzRGVsYXllZEFzc2lnbm1lbnREZWxheWVkUG9zdGZpeEluY3JlbWVudEdlbmVyYXRvckluY29tcGxldGVFcnJvckdlbmVyYXRvckluY29tcGxldGVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvckluY29tcGxldGVTZW5kR2VuZXJhdG9ySW5kZXhlZEFjY2Vzc0dlbmVyYXRvckxvYWRMaWJyYXJ5R2VuZXJhdG9yUGFyZW50aGVzaXplZEV4cHJlc3Npb25HZW5lcmF0b3JQYXJzZXJFcnJvckdlbmVyYXRvclByZWZpeFVzZUdlbmVyYXRvclByb3BlcnR5QWNjZXNzR2VuZXJhdG9yUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3JTZW5kQWNjZXNzR2VuZXJhdG9yU3RhdGljQWNjZXNzR2VuZXJhdG9yU3VwZXJJbmRleGVkQWNjZXNzR2VuZXJhdG9yVGhpc0FjY2Vzc0dlbmVyYXRvclRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvclR5cGVVc2VHZW5lcmF0b3JVbmxpbmtlZEdlbmVyYXRvclVucmVzb2x2ZWROYW1lR2VuZXJhdG9yVmFyaWFibGVVc2VHZW5lcmF0b3JidWlsZElzTnVsbEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXJGYW5nb3JuRm9yZXN0SW1wbGljaXRUeXBlQXJndW1lbnRzaGFkb3dTeW50aGV0aWNXcmFwcGVyY2FsY3VsYXRlQm91bmRzQm9keUJ1aWxkZXJmb3Jlc3RjbGFzc0J1aWxkZXJlbmNsb3NpbmdTY29wZXN0cmluZ0V4cGVjdGVkQWZ0ZXJOYXRpdmVpZ25vcmVNYWluSW5HZXRNYWluQ2xvc3VyZXR5cGVJbmZlcnJlcnR5cGVQcm9tb3Rlcm5lZWRzSW1wbGljaXRTdXBlckluaXRpYWxpemVyZm9ybWFsUGFyYW1ldGVyU2NvcGVpbkluaXRpYWxpemVyaW5GaWVsZEluaXRpYWxpemVyaW5DYXRjaENsYXVzZWluQ2F0Y2hCbG9ja2Z1bmN0aW9uTmVzdGluZ0xldmVsdHJhbnNmb3JtQ29sbGVjdGlvbnN0cmFuc2Zvcm1TZXRMaXRlcmFsc3Byb2JsZW1Jbkxvb3BPclN3aXRjaHN3aXRjaFNjb3BlY29uc3RhbnRDb250ZXh0Q29uc3RhbnRDb250ZXh0Lm5vbmVjdXJyZW50TG9jYWxWYXJpYWJsZVR5cGVjdXJyZW50TG9jYWxWYXJpYWJsZU1vZGlmaWVyc3JlZGlyZWN0aW5nRmFjdG9yeUludm9jYXRpb25zdmFyaWFibGVzV2l0aE1ldGFkYXRhbXVsdGlWYXJpYWJsZXNXaXRoTWV0YWRhdGFleHRlbnNpb25UaGlzX2J1aWx0aW51aXdpdGhQYXJlbnRzZm9yRmllbGRmb3JPdXRsaW5lRXhwcmVzc2lvbnR5cGVJbmZlcmVuY2VFbmdpbmVjcmVhdGVMb2NhbFR5cGVJbmZlcnJlcmluQ29uc3RydWN0b3Jpc0luc3RhbmNlQ29udGV4dHR5cGVTY2hlbWFFbnZpcm9ubWVudGltcGxpY2l0VHlwZUFyZ3VtZW50cHVzaHBvcEZvclZhbHVldG9WYWx1ZXBvcHBvcEZvckVmZmVjdHRvRWZmZWN0cG9wRm9yVmFsdWVJZk5vdE51bGxidWlsZFNpbXBsZVJlYWRidWlsZFByb2JsZW1idWlsZEZvckVmZmVjdHBvcExpc3RGb3JWYWx1ZXBvcExpc3RGb3JFZmZlY3Rwb3BCbG9ja2Nsb3NlQnJhY2VzdGFja3BvcFN0YXRlbWVudElmTm90TnVsbHBvcFN0YXRlbWVudHdyYXBWYXJpYWJsZXNlbnRlclN3aXRjaFNjb3BlTnVsbFZhbHVlLlN3aXRjaFNjb3BlZXhpdFN3aXRjaFNjb3Blb3V0ZXJTd2l0Y2hTY29wZXVuY2xhaW1lZEZvcndhcmREZWNsYXJhdGlvbnN1c2Vyc3dyYXBJblByb2JsZW1TdGF0ZW1lbnRmb3J3YXJkRGVjbGFyZUxhYmVsd3JhcFZhcmlhYmxlSW5pdGlhbGl6ZXJJbkVycm9yd3JhcEluTG9jYXRlZFByb2JsZW1kZWNsYXJlVmFyaWFibGVjcmVhdGVKdW1wVGFyZ2V0aW5mZXJBbm5vdGF0aW9uc2luZmVyTWV0YWRhdGF0cmFuc2Zvcm1MaXN0UG9zdEluZmVyZW5jZWJlZ2luTWV0YWRhdGFkZWJ1Z0V2ZW50Q29uc3RhbnRDb250ZXh0LmluZmVycmVkZW5kTWV0YWRhdGFwZXJpb2RCZWZvcmVOYW1lTWV0YWRhdGFwdXNoUXVhbGlmaWVkUmVmZXJlbmNlYnVpbGRDb25zdHJ1Y3RvclJlZmVyZW5jZUludm9jYXRpb25Db25zdG5lc3MuZXhwbGljaXRDb25zdG5hbWVPcmlnaW5wZXJpb2RnZW5lcmF0b3JidWlsZFByb3BlcnR5QWNjZXNzc2F2ZWRDb25zdGFudENvbnRleHR3cmFwSW5Qcm9ibGVtZW5kTWV0YWRhdGFTdGFyTWV0YWRhdGFTdGFyTnVsbFZhbHVlLk1ldGFkYXRhZW5kVG9wTGV2ZWxGaWVsZHNzdGF0aWNUb2tlbmNvdmFyaWFudFRva2VubGF0ZVRva2VudmFyRmluYWxPckNvbnN0VG9wTGV2ZWxGaWVsZHNyZXBvcnROb25OdWxsYWJsZU1vZGlmaWVyRXJyb3JlbmRGaWVsZHNGaWVsZHNmaW5pc2hGaWVsZHNpbmZlckZpZWxkSW5pdGlhbGl6ZXJidWlsdFR5cGV0cmFuc2Zvcm1Qb3N0SW5mZXJlbmNlYnVpbGREYXJ0VHlwZXJlc29sdmVSZWRpcmVjdGluZ0ZhY3RvcnlUYXJnZXRzZmluaXNoVmFyaWFibGVNZXRhZGF0YWVuZE1lbWJlcmVuZEJsb2NrRnVuY3Rpb25Cb2R5QmxvY2tGdW5jdGlvbkJvZHlOdWxsVmFsdWUuQmxvY2tleGl0TG9jYWxTY29wZXByZXBhcmVJbml0aWFsaXplcnNjb21wdXRlRm9ybWFsUGFyYW1ldGVySW5pdGlhbGl6ZXJTY29wZWZvcm1hbHNpc0luaXRpYWxpemluZ0Zvcm1hbGJ1aWxkSW52YWxpZEluaXRpYWxpemVyZGVzdWdhclN5bnRoZXRpY0V4cHJlc3Npb25idWlsZEZpZWxkSW5pdGlhbGl6ZXJmb3JtYWxUeXBlYWRkSW5pdGlhbGl6ZXJoYW5kbGVOb0luaXRpYWxpemVyc05vSW5pdGlhbGl6ZXJzYmVnaW5Jbml0aWFsaXplcnNlbmRJbml0aWFsaXplcnNJbml0aWFsaXplcnNiZWdpbkluaXRpYWxpemVyZW5kSW5pdGlhbGl6ZXJidWlsZFN1cGVySW5pdGlhbGl6ZXJpc1Rocm93aW5mZXJJbml0aWFsaXplcl9jb21wdXRlUmV0dXJuVHlwZUNvbnRleHRmaW5pc2hGdW5jdGlvbmFzeW5jTW9kaWZpZXJmaW5pc2hlZGlzT3B0aW9uYWxyZWFsUGFyYW1ldGVybGl0ZXJhbE51bGxpbmZlclBhcmFtZXRlckluaXRpYWxpemVyaW5mZXJGdW5jdGlvbkJvZHlmdXR1cmVCb3R0b21UeXBlZnV0dXJlT2ZCb3R0b21zdHJlYW1Cb3R0b21UeXBlc3RyZWFtT2ZCb3R0b21pdGVyYWJsZUJvdHRvbVR5cGVpdGVyYWJsZU9mQm90dG9tYXN5bmMsIGFzeW5jKiwgc3luYywgb3Igc3luYypleHByZXNzaW9uU3RhdGVtZW50ZmluaXNoQ29uc3RydWN0b3JlbnN1cmVMaWJyYXJ5TG9hZGVkaXNCdWlsdEFuZE1hcmtlZGludm9jYXRpb25pbmZlcnJlZFR5cGVpbml0aWFsVGFyZ2V0cmVwbGFjZW1lbnROb2RlcmVkaXJlY3Rpb25UYXJnZXRyZXNvbHZlZFRhcmdldGNvbnN0cnVjdG9yTmFtZUZvckRpYWdub3N0aWNzZXZhbHVhdGVBcmd1bWVudHNCZWZvcmVidWlsZEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3JyZWRpcmVjdGluZ0ZhY3RvcnlCb2R5ZXJyb3JOYW1ldGhyb3dOb1N1Y2hNZXRob2RFcnJvcmJ1aWxkU3RhdGljSW52b2NhdGlvbmNvbnN0bmVzc0NvbnN0bmVzcy5leHBsaWNpdE5ld2ZpbmlzaE1ldGFkYXRhdGVtcG9yYXJ5UGFyZW50cGFyc2VTaW5nbGVFeHByZXNzaW9ucGFyc2VydHlwZVBhcmFtZXRlckJ1aWxkZXJzZW50ZXJGdW5jdGlvblR5cGVTY29wZWVudGVyTG9jYWxTY29wZWNvbXB1dGVGb3JtYWxQYXJhbWV0ZXJTY29wZXBhcnNlRXhwcmVzc2lvbnN5bnRoZXRpY1ByZXZpb3VzVG9rZW5mYWtlUmV0dXJucGFyc2VJbml0aWFsaXplcnNjaGVja0VtcHR5cGFyc2VGaWVsZEluaXRpYWxpemVycGFyc2VBbm5vdGF0aW9ucGFyc2VNZXRhZGF0YWxvb2t1cENvbnN0cnVjdG9yYXJndW1lbnRzRW1wdHljaGVja0FyZ3VtZW50c0ZvckZ1bmN0aW9uZnVsbE5hbWVGb3JFcnJvcnNoYW5kbGVFeHByZXNzaW9uU3RhdGVtZW50ZW5kQXJndW1lbnRzZmlyc3ROYW1lZEFyZ3VtZW50SW5kZXhoYW5kbGVQYXJlbnRoZXNpemVkQ29uZGl0aW9uUGFyZW50aGVzaXplZENvbmRpdGlvbnBhcmVudGhlc2l6ZWRDb25kaXRpb25oYW5kbGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvblBhcmVudGhlc2l6ZWRFeHByZXNzaW9uaXNQYXJlbnRoZXNpemVkaGFuZGxlU2VuZGNoZWNrU3RhdGVOdWxsVmFsdWUuQXJndW1lbnRzTnVsbFZhbHVlLlR5cGVBcmd1bWVudHNTZW5kYXJndW1lbnRzVHlwZUFyZ3VtZW50c2FyZ3VtZW50c1NldFR5cGVBcmd1bWVudHNidWlsZERhcnRUeXBlQXJndW1lbnRzY2FzdEFyZ3VtZW50c2ZpbmlzaFNlbmRkb0ludm9jYXRpb25idWlsZE1ldGhvZEludm9jYXRpb25pc0ltcGxpY2l0Q2FsbGJlZ2luQ2FzY2FkZWV4dGVuZGVuZENhc2NhZGVjYXNjYWRlUmVjZWl2ZXJmaW5hbGl6ZWJlZ2luQ2FzZUV4cHJlc3Npb25jYXNlS2V5d29yZGVuZENhc2VFeHByZXNzaW9uY29sb25iZWdpbkJpbmFyeUV4cHJlc3Npb25saHNlbnRlckxvZ2ljYWxFeHByZXNzaW9uZW5kQmluYXJ5RXhwcmVzc2lvbkJpbmFyeUV4cHJlc3Npb25kb0RvdE9yQ2FzY2FkZUV4cHJlc3Npb25kb0xvZ2ljYWxFeHByZXNzaW9uZG9JZk51bGxkb0lmTm90TnVsbHRoaXNBY2Nlc3NvclJlY2VpdmVydGhpc0V4cHJlc3Npb25idWlsZEJpbmFyeU9wZXJhdG9ybmVnYXRlaXNDb25zdGFudEV4cHJlc3Npb25ub3RFeHByZXNzaW9ubG9naWNhbEV4cHJlc3Npb25leGl0TG9naWNhbEV4cHJlc3Npb25jb25kaXRpb25hbEV4cHJlc3Npb25zZW5kd2l0aFJlY2VpdmVyaXNOdWxsQXdhcmVhcmVBcmd1bWVudHNDb21wYXRpYmxlcGVyaW9kSW5kZXhrZXJuZWxOYW1ld2FyblVucmVzb2x2ZWRHZXRyZXBvcnRXYXJuaW5nd2FyblVucmVzb2x2ZWRTZXR3YXJuVW5yZXNvbHZlZE1ldGhvZHRocm93RXhwcmVzc2lvbmFkZFByb2JsZW1FcnJvcklmQ29uc3RwbGFpbk5hbWVkb3RJbmRleHdhcm5UeXBlQXJndW1lbnRzTWlzbWF0Y2hsb29rdXBJbnN0YW5jZU1lbWJlcmhhbmRsZUlkZW50aWZpZXJkZXByZWNhdGVkZGVwcmVjYXRlZF9pc1Njb3BlUmVmZXJlbmNlc2NvcGVMb29rdXBpbkRlY2xhcmF0aW9udG9wTGV2ZWxWYXJpYWJsZURlY2xhcmF0aW9uZmllbGREZWNsYXJhdGlvbmhhc0NvbnN0Q29uc3RydWN0b3JDb25zdGFudENvbnRleHQucmVxdWlyZWRhbGxvd2VkSW5Db25zdGFudEV4cHJlc3Npb25fY3JlYXRlVmFyaWFibGVHZXRmYWN0Z2V0RmFjdEZvckFjY2Vzc2N1cnJlbnRTY29wZV9jcmVhdGVSZWFkT25seVZhcmlhYmxlQWNjZXNzaXNRdWFsaWZpZWRmaW5kU3RhdGljQnVpbGRlcl9nZXRNYWluQ2xvc3VyZWlzVHlwZURlY2xhcmF0aW9uaXNMb2NhbGdldHRlcmlzUmVndWxhck1ldGhvZGhhc1Byb2JsZW1sb29rdXBTZXR0ZXJyZWFkVGFyZ2V0aGFuZGxlUXVhbGlmaWVkUXVhbGlmaWVkcXVhbGlmaWVyd2l0aFF1YWxpZmllcmJlZ2luTGl0ZXJhbFN0cmluZ2hhbmRsZVN0cmluZ1BhcnRTdHJpbmdQYXJ0ZW5kTGl0ZXJhbFN0cmluZ2ludGVycG9sYXRpb25Db3VudGxpdGVyYWxTdHJpbmdxdW90ZXN0cmluZ0NvbmNhdGVuYXRpb25FeHByZXNzaW9uaGFuZGxlTmF0aXZlQ2xhdXNlbmF0aXZlVG9rZW5oYXNOYW1lTmF0aXZlQ2xhdXNlYXNMaXRlcmFsU3RyaW5naGFuZGxlU2NyaXB0U2NyaXB0aGFuZGxlU3RyaW5nSnV4dGFwb3NpdGlvbmxpdGVyYWxDb3VudFN0cmluZ0p1eHRhcG9zaXRpb25oYW5kbGVMaXRlcmFsSW50TGl0ZXJhbEludGxhcmdlIGludGVnZXJsaXRlcmFsSW50bGl0ZXJhbExhcmdlSW50aGFuZGxlRW1wdHlGdW5jdGlvbkJvZHlzZW1pY29sb25FeHByZXNzaW9uRnVuY3Rpb25Cb2R5aGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keWFycm93VG9rZW5lbmRSZXR1cm5TdGF0ZW1lbnRoYXNFeHByZXNzaW9uYnVpbGRQcm9ibGVtU3RhdGVtZW50cmV0dXJuU3RhdGVtZW50YmVnaW5UaGVuU3RhdGVtZW50ZW50ZXJUaGVuRm9yVHlwZVByb21vdGlvbmVuZFRoZW5TdGF0ZW1lbnRlbnRlckVsc2VlbmRJZlN0YXRlbWVudGlmVG9rZW5lbHNlVG9rZW5lbHNlUGFydHRoZW5QYXJ0ZXhpdENvbmRpdGlvbmFsaWZTdGF0ZW1lbnRlbmRWYXJpYWJsZUluaXRpYWxpemVyYXNzaWdubWVudE9wZXJhdG9yVmFyaWFibGVJbml0aWFsaXplcnB1c2hOZXdMb2NhbFZhcmlhYmxlZXF1YWxzVG9rZW5oYW5kbGVOb1ZhcmlhYmxlSW5pdGlhbGl6ZXJOb1ZhcmlhYmxlSW5pdGlhbGl6ZXJmb3JTeW50aGV0aWNUb2tlbmNoZWNrQm91bmRzSW5WYXJpYWJsZURlY2xhcmF0aW9uYmVnaW5GaWVsZEluaXRpYWxpemVyZW5kRmllbGRJbml0aWFsaXplcmhhbmRsZU5vRmllbGRJbml0aWFsaXplck5vRmllbGRJbml0aWFsaXplck51bGxWYWx1ZS5GaWVsZEluaXRpYWxpemVyZW5kSW5pdGlhbGl6ZWRJZGVudGlmaWVybmFtZVRva2VuSW5pdGlhbGl6ZWRJZGVudGlmaWVyYmVnaW5WYXJpYWJsZXNEZWNsYXJhdGlvbm1vZGlmaWVyc051bGxWYWx1ZS5UeXBlZW5kVmFyaWFibGVzRGVjbGFyYXRpb25WYXJpYWJsZXNEZWNsYXJhdGlvbnZhcmlhYmxlc0RlY2xhcmF0aW9uZW5kQmxvY2toYW5kbGVJbnZhbGlkVG9wTGV2ZWxCbG9ja2hhbmRsZUFzc2lnbm1lbnRFeHByZXNzaW9uQXNzaWdubWVudEV4cHJlc3Npb25lbnRlckxvb3BlbnRlckJyZWFrVGFyZ2V0YnJlYWtUYXJnZXRlbnRlckNvbnRpbnVlVGFyZ2V0Y29udGludWVUYXJnZXRleGl0TG9vcE9yU3dpdGNoYnVpbGRWYXJpYWJsZURlY2xhcmF0aW9uc3ZhcmlhYmxlT3JFeHByZXNzaW9uaXNWYXJpYWJsZXNEZWNsYXJhdGlvbnZhcmlhYmxlc0RlY2xhcmF0aW9uRXh0cmFjdERlY2xhcmF0aW9uc2hhbmRsZUZvckluaXRpYWxpemVyRW1wdHlTdGF0ZW1lbnRGb3JJbml0aWFsaXplckVtcHR5U3RhdGVtZW50TnVsbFZhbHVlLkV4cHJlc3Npb25oYW5kbGVGb3JJbml0aWFsaXplckV4cHJlc3Npb25TdGF0ZW1lbnRGb3JJbml0aWFsaXplckV4cHJlc3Npb25TdGF0ZW1lbnRoYW5kbGVGb3JJbml0aWFsaXplckxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbkZvckluaXRpYWxpemVyTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uaGFuZGxlRm9yTG9vcFBhcnRzZm9yS2V5d29yZGxlZnRQYXJlbmxlZnRTZXBhcmF0b3J1cGRhdGVFeHByZXNzaW9uQ291bnRlbmRGb3JDb250cm9sRmxvd0ZvckNvbnRyb2xGbG93Zm9yVG9rZW5jb25kaXRpb25TdGF0ZW1lbnRlbmFibGVDb250cm9sRmxvd0NvbGxlY3Rpb25zaGFuZGxlUmVjb3ZlcmFibGVFcnJvcmlzRXhwcmVzc2lvblN0YXRlbWVudGdldEV4cHJlc3Npb25Gcm9tRXhwcmVzc2lvblN0YXRlbWVudGlzRW1wdHlTdGF0ZW1lbnRmb3JNYXBFbnRyeWZvckVsZW1lbnRlbmRGb3JTdGF0ZW1lbnRleGl0Q29udGludWVUYXJnZXRleGl0QnJlYWtUYXJnZXRoYXNVc2Vyc3N5bnRoZXRpY0xhYmVsZWRTdGF0ZW1lbnRyZXNvbHZlQ29udGludWVzZm9yU3RhdGVtZW50cmVzb2x2ZUJyZWFrc3N1cHByZXNzTWVzc2FnZWVuZEF3YWl0RXhwcmVzc2lvbmF3YWl0RXhwcmVzc2lvbmVuZEludmFsaWRBd2FpdEV4cHJlc3Npb25oYW5kbGVBc3luY01vZGlmaWVyYXN5bmNUb2tlbnN0YXJUb2tlbmhhbmRsZUxpdGVyYWxMaXN0bGVmdEJyYWNrZXRjb25zdEtleXdvcmRyaWdodEJyYWNrZXRMaXRlcmFsTGlzdGVsZW1saXRlcmFsTGlzdGNoZWNrQm91bmRzSW5MaXN0TGl0ZXJhbGJ1aWxkTGl0ZXJhbFNldGxlZnRCcmFjZXNldE9yTWFwRW50cmllc2xpdGVyYWxTZXRjaGVja0JvdW5kc0luU2V0TGl0ZXJhbGhhbmRsZUxpdGVyYWxTZXRPck1hcHJpZ2h0QnJhY2VoYXNTZXRFbnRyeUxpdGVyYWxTZXRPck1hcHR5cGVBcmdDb3VudGlzU2V0bWFwRW50cmllc2J1aWxkTGl0ZXJhbE1hcGhhbmRsZUxpdGVyYWxCb29sTGl0ZXJhbEJvb2xsaXRlcmFsQm9vbGhhbmRsZUxpdGVyYWxEb3VibGVMaXRlcmFsRG91YmxlbGl0ZXJhbERvdWJsZWhhbmRsZUxpdGVyYWxOdWxsTGl0ZXJhbE51bGxsaXRlcmFsTWFwY2hlY2tCb3VuZHNJbk1hcExpdGVyYWxoYW5kbGVMaXRlcmFsTWFwRW50cnlMaXRlcmFsTWFwRW50cnltYXBFbnRyeXN5bWJvbFBhcnRUb1N0cmluZ2VuZExpdGVyYWxTeW1ib2xoYXNoVG9rZW5pZGVudGlmaWVyQ291bnRMaXRlcmFsU3ltYm9sbGl0ZXJhbFN5bWJvbFNpbmdsdWFybGl0ZXJhbFN5bWJvbE11bHRpcGxlaGFuZGxlTm9uTnVsbEFzc2VydEV4cHJlc3Npb25iYW5ncmVwb3J0Tm9uTnVsbEFzc2VydEV4cHJlc3Npb25Ob3RFbmFibGVkaGFuZGxlVHlwZXF1ZXN0aW9uTWFya3JlcG9ydEVycm9ySWZOdWxsYWJsZVR5cGVxdWFsaWZpZWRxdWFsaWZpZWRMb29rdXBkaXNwbGF5TmFtZWJ1aWxkVHlwZVdpdGhSZXNvbHZlZEFyZ3VtZW50c2JlZ2luRnVuY3Rpb25UeXBldHlwZVZhcmlhYmxlc2NyZWF0ZU5lc3RlZFNjb3BlZnVuY3Rpb24tdHlwZSBzY29wZWlzTW9kaWZpYWJsZXNjb3BlQnVpbGRlcnJlcG9ydER1cGxpY2F0ZWREZWNsYXJhdGlvbmVuZEZ1bmN0aW9uVHlwZWZ1bmN0aW9uVG9rZW50b0Z1bmN0aW9uVHlwZWhhbmRsZVZvaWRLZXl3b3JkVm9pZEtleXdvcmRoYW5kbGVBc09wZXJhdG9yQXNPcGVyYXRvcmNoZWNrQm91bmRzSW5UeXBlQXMgZXhwcmVzc2lvbmhhbmRsZUlzT3BlcmF0b3Jub3RJc09wZXJhdG9yaXNJbnZlcnRlZGlzRXhwcmVzc2lvbmhhbmRsZUlzQ2hlY2tJcyBleHByZXNzaW9uYmVnaW5Db25kaXRpb25hbEV4cHJlc3Npb25xdWVzdGlvbmVudGVyVGhlbmhhbmRsZUNvbmRpdGlvbmFsRXhwcmVzc2lvbkNvbG9uZW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uZWxzZUV4cHJlc3Npb250aGVuRXhwcmVzc2lvbmhhbmRsZVRocm93RXhwcmVzc2lvbnRocm93VG9rZW5UaHJvd0V4cHJlc3Npb25iZWdpbkZvcm1hbFBhcmFtZXRlcnJlcXVpcmVkVG9rZW5lbmRGb3JtYWxQYXJhbWV0ZXJ0aGlzS2V5d29yZHBlcmlvZEFmdGVyVGhpc2luaXRpYWxpemVyU3RhcnRpbml0aWFsaXplckVuZG1lbWJlcktpbmRGb3JtYWxQYXJhbWV0ZXJuYW1lTm9kZU1lbWJlcktpbmQuR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGVnZXRGb3JtYWxidWlsZEZvcm1hbFBhcmFtZXRlcktpbmQubWFuZGF0b3J5ZW5kT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbE5hbWVkRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbFBvc2l0aW9uYWxiZWdpbkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXJlbmRGdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcmJlZ2luRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbmVuZEZvcm1hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZUV4cHJlc3Npb25Gb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uZGVmYXVsdFZhbHVlRXhwcmVzc2lvbmhhbmRsZVZhbHVlZEZvcm1hbFBhcmFtZXRlclZhbHVlZEZvcm1hbFBhcmFtZXRlcmhhbmRsZUZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZUZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZWJlZ2luRm9ybWFsUGFyYW1ldGVyc2VuZEZvcm1hbFBhcmFtZXRlcnNGb3JtYWxQYXJhbWV0ZXJzb3B0aW9uYWxzb3B0aW9uYWxzQ291bnRwb3BQYWRkZWRiZWdpbkNhdGNoQ2xhdXNlZW5kQ2F0Y2hDbGF1c2VDYXRjaENsYXVzZWhhbmRsZUNhdGNoQmxvY2tvbktleXdvcmRjYXRjaEtleXdvcmRjb21tYUNhdGNoQmxvY2tjYXRjaFBhcmFtZXRlcnNwb3BJZk5vdE51bGxleGNlcHRpb25UeXBlY29tcGlsZVRpbWVFcnJvcnNwYXJhbWV0ZXJDb3VudGNhdGNoQ2xhdXNlZW5kVHJ5U3RhdGVtZW50Y2F0Y2hDb3VudHRyeUtleXdvcmRmaW5hbGx5S2V5d29yZGZpbmFsbHlCbG9ja2NhdGNoQmxvY2tzY2F0Y2hCbG9ja3NBbmRFcnJvcnN0cnlCbG9ja3RyeVN0YXRlbWVudGhhbmRsZUluZGV4ZWRFeHByZXNzaW9ub3BlblNxdWFyZUJyYWNrZXRjbG9zZVNxdWFyZUJyYWNrZXRJbmRleGVkRXhwcmVzc2lvbmhhbmRsZVVuYXJ5UHJlZml4RXhwcmVzc2lvblVuYXJ5UHJlZml4RXhwcmVzc2lvbnJlY2VpdmVyVmFsdWVpbmNyZW1lbnRPcGVyYXRvcmhhbmRsZVVuYXJ5UHJlZml4QXNzaWdubWVudEV4cHJlc3Npb25VbmFyeVByZWZpeEFzc2lnbm1lbnRFeHByZXNzaW9uYnVpbGRQcmVmaXhJbmNyZW1lbnRoYW5kbGVVbmFyeVBvc3RmaXhBc3NpZ25tZW50RXhwcmVzc2lvblVuYXJ5UG9zdGZpeEFzc2lnbm1lbnRFeHByZXNzaW9uZW5kQ29uc3RydWN0b3JSZWZlcmVuY2VDb25zdHJ1Y3RvclJlZmVyZW5jZU51bGxWYWx1ZS5JZGVudGlmaWVyQ29uc3RuZXNzLmltcGxpY2l0Y2hhckxlbmd0aGFyZ01lc3NhZ2V3cmFwU3ludGhldGljRXhwcmVzc2lvbndyYXBJbnZhbGlkQ29uc3RydWN0b3JJbnZvY2F0aW9uY2hlY2tCb3VuZHNJbkNvbnN0cnVjdG9ySW52b2NhdGlvbmNoZWNrQm91bmRzSW5GYWN0b3J5SW52b2NhdGlvbmNoZWNrQm91bmRzSW5TdGF0aWNJbnZvY2F0aW9uYXJndW1lbnRzUG9zaXRpb25hbGFyZ3VtZW50c05hbWVkY2hlY2tBcmd1bWVudHNGb3JUeXBlYmVnaW5OZXdFeHByZXNzaW9uTmV3IGV4cHJlc3Npb25iZWdpbkNvbnN0RXhwcmVzc2lvbmJlZ2luQ29uc3RMaXRlcmFsYmVnaW5JbXBsaWNpdENyZWF0aW9uRXhwcmVzc2lvbmVuZENvbnN0TGl0ZXJhbGxpdGVyYWxlbmROZXdFeHByZXNzaW9uTmV3RXhwcmVzc2lvbm5hbWVMYXN0SWRlbnRpZmllcm5hbWVMYXN0VG9rZW5pbnZva2VDb25zdHJ1Y3RvcmVuZEltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb25idWlsZENvbnN0cnVjdG9ySW52b2NhdGlvbmZpbmRDb25zdHJ1Y3Rvck9yRmFjdG9yeXdyYXBVbnJlc29sdmVkVGFyZ2V0SW52b2NhdGlvbmVuZENvbnN0RXhwcmVzc2lvbmJlZ2luSWZDb250cm9sRmxvd2JlZ2luVGhlbkNvbnRyb2xGbG93aGFuZGxlRWxzZUNvbnRyb2xGbG93ZW5kSWZDb250cm9sRmxvd2lmTWFwRW50cnlpZkVsZW1lbnRlbmRJZkVsc2VDb250cm9sRmxvd2Vsc2VFbnRyeXRoZW5FbnRyeWhhbmRsZVNwcmVhZEV4cHJlc3Npb25zcHJlYWRUb2tlblNwcmVhZEV4cHJlc3Npb25lbmFibGVTcHJlYWRDb2xsZWN0aW9uc3NwcmVhZEVsZW1lbnRlbmRUeXBlQXJndW1lbnRzVHlwZUFyZ3VtZW50c2hhbmRsZUludmFsaWRUeXBlQXJndW1lbnRzSW52YWxpZFR5cGVBcmd1bWVudHNoYW5kbGVUaGlzRXhwcmVzc2lvbmhhbmRsZVN1cGVyRXhwcmVzc2lvblN1cGVyRXhwcmVzc2lvbmhhbmRsZU5hbWVkQXJndW1lbnROYW1lZEFyZ3VtZW50ZW5kRnVuY3Rpb25OYW1lRnVuY3Rpb25OYW1laXNMb2NhbEZ1bmN0aW9uZW50ZXJGdW5jdGlvbmV4aXRGdW5jdGlvbk51bGxWYWx1ZS5UeXBlVmFyaWFibGVzYmVnaW5Mb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25iZWdpbk5hbWVkRnVuY3Rpb25FeHByZXNzaW9ubmFtZWQgZnVuY3Rpb25iZWdpbkZ1bmN0aW9uRXhwcmVzc2lvbnB1c2hOYW1lZEZ1bmN0aW9uaXNGdW5jdGlvbkV4cHJlc3Npb25oYXNJbXBsaWNpdFJldHVyblR5cGVidWlsZEZ1bmN0aW9uTm9kZW9sZEluaXRpYWxpemVyaXNFcnJvbmVvdXNOb2RlZW5kTmFtZWRGdW5jdGlvbkV4cHJlc3Npb25lbmRMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25Mb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25lbmRGdW5jdGlvbkV4cHJlc3Npb25lbmREb1doaWxlU3RhdGVtZW50ZG9LZXl3b3Jkd2hpbGVLZXl3b3JkRG9XaGlsZVN0YXRlbWVudGRvU3RhdGVtZW50YmVnaW5Gb3JJbkV4cHJlc3Npb25lbmRGb3JJbkV4cHJlc3Npb25Gb3JJbkV4cHJlc3Npb25oYW5kbGVGb3JJbkxvb3BQYXJ0c2F3YWl0VG9rZW5sZWZ0UGFyZW50aGVzaXNpbktleXdvcmROdWxsVmFsdWUuQXdhaXRUb2tlbmVuZEZvckluQ29udHJvbEZsb3dGb3JJbkNvbnRyb2xGbG93aW5Ub2tlbmx2YWx1ZWJ1aWxkRm9ySW5WYXJpYWJsZWNoZWNrRm9ySW5WYXJpYWJsZXByb2xvZ3VlYnVpbGRGb3JJbkJvZHlmb3JJbk1hcEVudHJ5Zm9ySW5FbGVtZW50c3ludGhldGljQXNzaWdubWVudGJ1aWxkQXNzaWdubWVudHZvaWRDb250ZXh0ZW5kRm9ySW5Gb3JJbmhhbmRsZUxhYmVsTGFiZWxiZWdpbkxhYmVsZWRTdGF0ZW1lbnRsYWJlbENvdW50Y3JlYXRlTmVzdGVkTGFiZWxTY29wZWRlY2xhcmVMYWJlbGVuZExhYmVsZWRTdGF0ZW1lbnRlbmRSZXRocm93U3RhdGVtZW50cmV0aHJvd1Rva2VuUmV0aHJvd1N0YXRlbWVudHJldGhyb3dTdGF0ZW1lbnRoYW5kbGVGaW5hbGx5QmxvY2tGaW5hbGx5QmxvY2tlbmRXaGlsZVN0YXRlbWVudHdoaWxlU3RhdGVtZW50aGFuZGxlRW1wdHlTdGF0ZW1lbnRlbXB0eVN0YXRlbWVudGJlZ2luQXNzZXJ0YXNzZXJ0S2V5d29yZGVuZEFzc2VydGNvbW1hVG9rZW5zZW1pY29sb25Ub2tlbkFzc2VydC5TdGF0ZW1lbnRhc3NlcnRTdGF0ZW1lbnRBc3NlcnQuRXhwcmVzc2lvbkFzc2VydC5Jbml0aWFsaXplcmFzc2VydEluaXRpYWxpemVyZW5kWWllbGRTdGF0ZW1lbnR5aWVsZFRva2VueWllbGRTdGF0ZW1lbnRiZWdpblN3aXRjaEJsb2Nrc3dpdGNoIGJsb2NrYmVnaW5Td2l0Y2hDYXNlZXhwcmVzc2lvbkNvdW50bGFiZWxzQW5kRXhwcmVzc2lvbnNsYWJlbEluZGV4ZXhwcmVzc2lvbkluZGV4bGFiZWxPckV4cHJlc3Npb25sYWJlbE5hbWVoYXNMb2NhbExhYmVsY2xhaW1MYWJlbGNyZWF0ZUdvdG9UYXJnZXROdWxsVmFsdWUuTGFiZWxzc3dpdGNoIGNhc2VlbmRTd2l0Y2hDYXNlZGVmYXVsdEtleXdvcmRjb2xvbkFmdGVyRGVmYXVsdHN0YXRlbWVudENvdW50ZW5kU3dpdGNoU3RhdGVtZW50c3dpdGNoS2V5d29yZGVuZFN3aXRjaEJsb2NrY2FzZUNvdW50U3dpdGNoQmxvY2tsb29rdXBMYWJlbHJlc29sdmVHb3Rvc2xhc3ROb2RlaXNCbG9ja2J1aWxkRmFsbFRocm91Z2hFcnJvcmhhbmRsZUNhc2VNYXRjaENhc2VNYXRjaGhhbmRsZUJyZWFrU3RhdGVtZW50aGFzVGFyZ2V0YnJlYWtLZXl3b3JkaXNCcmVha1RhcmdldGxhYmVsVG9rZW5idWlsZFByb2JsZW1UYXJnZXRPdXRzaWRlTG9jYWxGdW5jdGlvbmJyZWFrU3RhdGVtZW50YWRkQnJlYWtpc0JyZWFraGFuZGxlQ29udGludWVTdGF0ZW1lbnRjb250aW51ZUtleXdvcmRDb250aW51ZVN0YXRlbWVudG5hbWVkVGFyZ2V0aXNHb3RvVGFyZ2V0YWRkR290b2lzQ29udGludWVUYXJnZXRjb250aW51ZVN0YXRlbWVudGFkZENvbnRpbnVlYmVnaW5UeXBlVmFyaWFibGVoYW5kbGVUeXBlVmFyaWFibGVzRGVmaW5lZGVuZFR5cGVWYXJpYWJsZWV4dGVuZHNPclN1cGVyVHlwZVZhcmlhYmxlZW5kVHlwZVZhcmlhYmxlc1R5cGVWYXJpYWJsZXNjYWxjdWxhdGVkQm91bmRzcmVzb2x2ZUluaGFuZGxlTm9UeXBlVmFyaWFibGVzTm9UeXBlVmFyaWFibGVzdHlwZVZhcmlhYmxlQnVpbGRlcnNUb0tlcm5lbHR5cGVWYXJpYWJsZUJ1aWxkZXJzaGFuZGxlSW52YWxpZFN0YXRlbWVudGJ1aWxkSW52YWxpZFN1cGVySW5pdGlhbGl6ZXJidWlsZER1cGxpY2F0ZWRJbml0aWFsaXplcnByZXZpb3VzSW5pdGlhbGl6ZXJPZmZzZXRmaWVsZE5hbWVPZmZzZXRhc3NpZ25tZW50T2Zmc2V0aGFzSW5pdGlhbGl6ZXJidWlsZFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJjaGVja0NvbnN0cnVjdG9yQ3ljbGljaGFuZGxlT3BlcmF0b3JoYW5kbGVTeW1ib2xWb2lkU3ltYm9sVm9pZGhhbmRsZUludmFsaWRGdW5jdGlvbkJvZHlOdWxsVmFsdWUuRnVuY3Rpb25Cb2R5dmFsaWRhdGVUeXBlVXNlbm9uSW5zdGFuY2VBY2Nlc3NJc0Vycm9yaXNUeXBlVmFyaWFibGVpc0lkZW50aWNhbE1ldGhvZCBpbnZvY2F0aW9uaXNUaGlzRXhwcmVzc2lvbm1ha2VTdGF0aWNHZXR3cmFwSW5EZWZlcnJlZENoZWNrY2hlY2tjaGVja0xpYnJhcnlJc0xvYWRlZHVucmVzb2x2ZWRUeXBldW5yZXNvbHZlZFR5cGVzZGVzdWdhcmVkc2hhZG93Tm9kZXdyYXBJbnZhbGlkV3JpdGV3cmFwVW5yZXNvbHZlZFZhcmlhYmxlQXNzaWdubWVudGlzQ29tcG91bmRyaHNvcGVyYXRvcihKdW1wVGFyZ2V0SnVtcFRhcmdldEtpbmQuQnJlYWtKdW1wVGFyZ2V0S2luZC5Db250aW51ZUp1bXBUYXJnZXRLaW5kLkdvdG91c2VyPGp1bXAtdGFyZ2V0PkxhYmVsVGFyZ2V0PGxhYmVsLXRhcmdldD5FbXB0eSBwYXJhbWV0ZXJzIHNob3VsZCBiZSBudWxsaXNOYW1lZEZvcm1hbFBhcmFtZXRlcnMobGFiZWwobm9Mb2NhdGlvbmludmFsaWRDb2xsZWN0aW9uRWxlbWVudGNvbWJpbmVTdGF0ZW1lbnRzZGVidWdOYW1lLnJlc3VsdGdldE5vZGVOYW1lYXN5bmNNYXJrZXJGcm9tVG9rZW5zZmFzdGEuaW5jcmVtZW50YWxfY29tcGlsZXJJbmNyZW1lbnRhbEtlcm5lbEdlbmVyYXRvck1lbW9yeUZpbGVTeXN0ZW1CdWlsZGVyR3JhcGhzYXZlQXNHemlwSHlicmlkRmlsZVN5c3RlbUNsYXNzSGllcmFyY2h5QnVpbGRlclZhcmlhYmxlRGVjbGFyYXRpb25KdWRnbWVudExpYnJhcnlHcmFwaFNvdXJjZUxpYnJhcnlCdWlsZGVyb3V0bGluZU9ubHl0cmFja05lZWRlZERpbGxMaWJyYXJpZXNuZWVkZWREaWxsTGlicmFyaWVzaW52YWxpZGF0ZWRVcmlzZGlsbExvYWRlZERhdGFwbGF0Zm9ybUJ1aWxkZXJzdXNlckJ1aWxkZXJzaW5pdGlhbGl6ZUZyb21EaWxsVXJpY29tcG9uZW50VG9Jbml0aWFsaXplRnJvbWluaXRpYWxpemVkRnJvbURpbGxwcmV2aW91c1BhY2thZ2VzVXJpcHJldmlvdXNQYWNrYWdlc01hcGN1cnJlbnRQYWNrYWdlc01hcGhhc1RvQ2hlY2tQYWNrYWdlVXJpc3JlbWFpbmluZ0NvbXBvbmVudFByb2JsZW1zbW9kdWxlc1RvTG9hZGRlYnVnRXhwclVyaW9yZy1kYXJ0bGFuZy1kZWJ1Z3N5bnRoZXRpY19kZWJ1Z19leHByZXNzaW9udXNlckNvZGVmcm9tQ29tcG9uZW50Y29tcHV0ZURlbHRhZnVsbENvbXBvbmVudGJ5dGVzTGVuZ3RoaW5pdGlhbGl6ZUZyb21Db21wb25lbnRzdW1tYXJ5Qnl0ZXNwcmVwYXJlU3VtbWFyeWluaXRpYWxpemVGcm9tRGlsbHN0Z3pJbml0aWFsaXplZEZyb21pbml0aWFsaXphdGlvbkJ5dGVzaW5pdGlhbGl6ZV9mcm9tLmRpbGxyZWNvcmRUZW1wb3JhcnlGaWxlRm9yVGVzdGluZ2ludmFsaWRhdGVOb3RLZXB0VXNlckJ1aWxkZXJzbm90UmV1c2VkTGlicmFyaWVzcmV1c2VkTGlicmFyaWVzY29tcHV0ZVJldXNlZExpYnJhcmllc25vdFJldXNlZHJlbW92ZWREaWxsQnVpbGRlcnNkaWxsQnVpbGRlcnJlbW92ZUxpYnJhcnlGcm9tUmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXNvbGREaWxsTG9hZGVkRGF0YURlY2lkZWQgdG8gcmV1c2UgIG9mICBsaWJyYXJpZXNsb2FkRW5zdXJlTG9hZGVkQ29tcG9uZW50c3VzZXJDb2RlT2xkY29tcG9uZW50V2l0aERpbGxyZWNvcmROb25GdWxsQ29tcG9uZW50Rm9yVGVzdGluZ3VwZGF0ZU5lZWRlZERpbGxMaWJyYXJlc1dpdGhIaWVyYXJjaHlidWlsZGVySGllcmFyY2h5cmVsZWFzZUFuY2lsbGFyeVJlc291cmNlc2NvbXBpbGVkTGlicmFyaWVzdXNlckxvYWRlZFVyaU1haW5vdXRwdXRMaWJyYXJpZXNjb21wdXRlVHJhbnNpdGl2ZUNsb3N1cmVyZWlzc3VlQ29tcG9uZW50UHJvYmxlbXNyZWlzc3VlTGlicmFyeVByb2JsZW1zZ2V0Q29yZVR5cGVzZ2V0Q2xhc3NIaWVyYXJjaHl1c2VkQ2xhc3Nlc2xvYWRlZE5vdEtlcHRtb2R1bGVsb2FkZWRBbnl0aGluZ3VzZWRDb21wb25lbnRpc3N1ZWRQcm9ibGVtc2dldFBhcnRGaWxlVXJpcGFyZW50RmlsZVVyaWlucHV0TGlicmFyaWVzaW5wdXRMaWJyYXJpZXNGaWx0ZXJlZGxpYnJhcnlNYXBwb3RlbnRpYWxseVJlZmVyZW5jZWRMaWJyYXJpZXNwb3RlbnRpYWxseVJlZmVyZW5jZWRJbnB1dExpYnJhcmllc2dyYXBobmVpZ2hib3JuZWlnaGJvcnNPZnBhcnRGaWxlVXJpUmVhZCBEZXNlcmlhbGl6ZWQgZW50aXR5c2F2ZUNvbXBvbmVudFByb2JsZW1zQWJvdXQgdG8gaW5pdGlhbGl6ZUZyb21Db21wb25lbnRmb3VuZERhcnRDb3JlRGlkIG5vdCBmaW5kIGRhcnQ6Y29yZSB3aGVuIHRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBjb21wb25lbnQuUmFuIGluaXRpYWxpemVGcm9tQ29tcG9uZW50QXBwZW5kZWQgbGlicmFyaWVzY29tcGlsZUV4cHJlc3Npb250eXBlRGVmaW5pdGlvbnNzeW50aGV0aWNQcm9jZWR1cmVOYW1la2VybmVsQ2xhc3NkZWJ1Z0xpYnJhcnljb21iaW5hdG9yYWRkSW1wb3J0YWRkSW1wb3J0c1RvU2NvcGVoZnNtZW1vcnltb2RpZnlUYXJnZXRidWlsZEV4cHJlc3Npb25jb21waWxlZEV4cHJlc3Npb25zb3VyY2VCeXRlc2ludmFsaWRhdGVkSW1wb3J0VXJpc2lzSW52YWxpZGF0ZWRmaXJzdFNsYXNobmV3RmlsZVVyaWFkZEJ1aWxkZXJBbmRJbnZhbGlkYXRlVXJpc3JlY29yZEludmFsaWRhdGVkSW1wb3J0VXJpc0ZvclRlc3RpbmdkaXJlY3REZXBlbmRlbmNpZXN2ZXJ0ZXh2ZXJ0aWNlc3dvcmtMaXN0cmVtb3ZlZHNlZW5VcmlzaW52YWxpZGF0ZWludmFsaWRhdGVBbGxTb3VyY2Vzc2V0TW9kdWxlc1RvTG9hZE9uTmV4dENvbXB1dGVEZWx0YVBhY2thZ2VDaGFuZ2VkRXJyb3JJbml0aWFsaXplRnJvbUNvbXBvbmVudEVycm9ySW5jcmVtZW50YWxDb21waWxlckRhdGFjb21waWxlci5hcGkubGVnYWN5RXZlbnRTaW5rTnVsbFNpbmtMZWdhY3lDb21waWxlcklucHV0X2lucHV0UHJvdmlkZXJzb3VyY2VGaWxlRXhwZWN0ZWQgYSAnU3RyaW5nJyBvciBhICdMaXN0PGludD4nIGZyb20gdGhlIGlucHV0IHByb3ZpZGVyLCBidXQgZ290OiBMZWdhY3lDb21waWxlckRpYWdub3N0aWNzX2hhbmRsZXJMZWdhY3lDb21waWxlck91dHB1dF9vdXRwdXRQcm92aWRlcmRlZmVycmVkX21hcExlZ2FjeUNvbXBpbGVyT3V0cHV0LmNyZWF0ZUJpbmFyeVNpbmtMZWdhY3lPdXRwdXRTaW5rZGFydDJqcy5jb21tb24udGFza3Nab25lRGVsZWdhdGVab25lU3BlY2lmaWNhdGlvbkNvbXBpbGVyVGFza19tZWFzdXJlcl93YXRjaF9zdWJ0YXNrc19hc3luY0NvdW50X3pvbmVTcGVjaWZpY2F0aW9uX3pvbmVWYWx1ZXNfaXNEaXNhYmxlZFVua25vd24gdGFzayAndGltaW5ndG90YWxlbGFwc2VkTWlsbGlzZWNvbmRzX21lYXN1cmVab25lZF9zdGFydF9jdXJyZW50VGFza3N0b3BzdG9wQXN5bmNXYWxsQ2xvY2tfc3RvcHN0YXJ0QXN5bmNXYWxsQ2xvY2t6b25lU3BlY2lmaWNhdGlvbl9ydW5ydW5VbmFyeV9ydW5VbmFyeXJ1bkJpbmFyeV9ydW5CaW5hcnl6b25lVDFUMmExYTJfY3VycmVudEFzeW5jVGFza0Nhbid0IHRyYWNrIGFzeW5jIHRhc2sgJycgYmVjYXVzZSAnJyBpcyBhbHJlYWR5IGJlaW5nIHRyYWNrZWQubWVhc3VyZUlvU3VidGFza193YWxsQ2xvY2tfYXN5bmNXYWxsQ2xvY2tfaGFzaENvZGVHZW5lcmF0b3JzdGFydFdhbGxDbG9ja3N0b3BXYWxsQ2xvY2tkYXJ0MmpzLmNvbW1vbmFzc2VydERlYnVnTW9kZWZhaWxlZEF0TWVzc2FnZUtpbmRTb3VyY2VTcGFuQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRU5PX0xPQ0FUSU9OX1NQQU5OQUJMRVNwYW5uYWJsZVNwYW5uYWJsZUFzc2VydGlvbkZhaWx1cmVkYXJ0MmpzLmNvbXBpbGVyX2Jhc2VTZWxlY3RvcnNVcmlzV29ya0l0ZW1FbGVtZW50RW52aXJvbm1lbnREZWZlcnJlZExvYWRUYXNrT3V0cHV0VW5pdERhdGFNZXNzYWdlVGVtcGxhdGVEdW1wSW5mb1Rhc2tFbnF1ZXVlckVucXVldWVUYXNrUmVzb2x1dGlvbkVucXVldWVyQWJzdHJhY3RWYWx1ZVN0cmF0ZWd5VHJpdmlhbEFic3RyYWN0VmFsdWVTdHJhdGVneVR5cGVNYXNrU3RyYXRlZ3lHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0c0dsb2JhbFR5cGVJbmZlcmVuY2VUYXNrU291cmNlSW5mb3JtYXRpb25Db2RlZ2VuSW5wdXRzSmF2YVNjcmlwdEltcGFjdFN0cmF0ZWd5S2VybmVsTG9hZGVyVGFza0tlcm5lbFJlc3VsdE51bGxDb21waWxlck91dHB1dEhJbnN0cnVjdGlvblNlbGVjdG9ySW1wYWN0U3RyYXRlZ3lXb3JsZEltcGFjdFdvcmxkSW1wYWN0QnVpbGRlckltcGxKQ2xvc2VkV29ybGRLQ2xvc2VkV29ybGRNYWtlUmVwb3J0ZXJGdW5jdGlvbkNvbXBpbGVyZnJvbnRlbmRTdHJhdGVneWJhY2tlbmRTdHJhdGVneV9yZXBvcnRlcl9pbXBhY3RDYWNoZV9pbXBhY3RDYWNoZURlbGV0ZXJpbXBhY3RTdHJhdGVneXN0b3BBZnRlckNsb3NlZFdvcmxkc3RvcEFmdGVyVHlwZUluZmVyZW5jZV91c2VyQ29kZUxvY2F0aW9uc2JhY2tlbmRDbG9zZWRXb3JsZEZvclRlc3RpbmdnbG9iYWxJbmZlcmVuY2VfY29kZWdlbldvcmxkQnVpbGRlcmFic3RyYWN0VmFsdWVTdHJhdGVneWVucXVldWVyZGVmZXJyZWRMb2FkVGFza2R1bXBJbmZvVGFza3NlcmlhbGl6YXRpb25UYXNrUEhBU0VfU0NBTk5JTkdQSEFTRV9SRVNPTFZJTkdQSEFTRV9ET05FX1JFU09MVklOR1BIQVNFX0NPTVBJTElOR3BoYXNlY29tcGlsYXRpb25GYWlsZWRvblJlc29sdXRpb25RdWV1ZUVtcHR5Rm9yVGVzdGluZ29uQ29kZWdlblF1ZXVlRW1wdHlGb3JUZXN0aW5nY29kZWdlbldvcmxkRm9yVGVzdGluZ0JFTklHTl9FUlJPUlNNZXNzYWdlS2luZC5JTlZBTElEX01FVEFEQVRBTWVzc2FnZUtpbmQuSU5WQUxJRF9NRVRBREFUQV9HRU5FUklDa2VybmVsRnJvbnRFbmRUYXNrRnJvbnQgZW5kcmVwb3J0ZXJjcmVhdGVCYWNrZW5kU3RyYXRlZ3ljcmVhdGVEZWZlcnJlZExvYWRUYXNraW1wYWN0Q2FjaGVpbXBhY3RDYWNoZURlbGV0ZXJjdXJyZW50RWxlbWVudHJlc29sdXRpb25Xb3JsZEJ1aWxkZXJyZXNvbHV0aW9ud29ybGRCdWlsZGVyY29kZWdlbldvcmxkQnVpbGRlck5vIGxvY2F0aW9uQ29kZWdlbldvcmxkQnVpbGRlciBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQucnVuSW50ZXJuYWxjbGVhclN0YXRlQ29tcGlsaW5nIGRlc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZWdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzcGVyZm9ybUdsb2JhbFR5cGVJbmZlcmVuY2VjbG9zZWRXb3JsZGdlbmVyYXRlSmF2YVNjcmlwdENvZGVsb2FkS2VybmVsIGxvYWQgY29tcGxldGVyZWdpc3RlckxvYWRlZExpYnJhcmllc3JlcG9ydFdhcm5pbmdNZXNzYWdlTWVzc2FnZUtpbmQuTUlSUk9SU19MSUJSQVJZX05PVF9TVVBQT1JUX1dJVEhfQ0ZFY29tcGlsZUZyb21LZXJuZWxyb290TGlicmFyeVVyaXJlZ2lzdGVySkNsb3NlZFdvcmxkY29kZWdlbklucHV0c29uQ29kZWdlblN0YXJ0ZGVzZXJpYWxpemVDb2RlZ2VuY29kZWdlblJlc3VsdHNDb21waWxpbmcgbWV0aG9kc3J1bkNvZGVnZW5FbnF1ZXVlcmZ1bmN0aW9uQ29tcGlsZXJzZXJpYWxpemVDb2RlZ2Vuc2VsZWN0b3JzdGFydFJlc29sdXRpb25yZXNvbHV0aW9uRW5xdWV1ZXJoYXNSZXNvbHV0aW9uY3JlYXRlUmVzb2x1dGlvbkVucXVldWVyb25SZXNvbHV0aW9uU3RhcnRjb21wdXRlQ2xvc2VkV29ybGRlbGVtZW50RW52aXJvbm1lbnRmb3JFYWNoQ2xhc3NyZWdpc3RlckNsYXNzbWFpbkltcGFjdG1haW5GdW5jdGlvbmNvbXB1dGVNYWluYmVmb3JlUmVzb2x1dGlvbnN1cHBvcnREZWZlcnJlZExvYWRpc1Byb2dyYW1TcGxpdHN1cHBvcnREdW1wSW5mb2FwcGx5SW1wYWN0Q29tcHV0aW5nIGNsb3NlZCB3b3JsZHByb2Nlc3NRdWV1ZW9uUHJvZ3Jlc3NzaG93UmVzb2x1dGlvblByb2dyZXNzb25SZXNvbHV0aW9uRW5kcmVwb3J0U3VwcHJlc3NlZE1lc3NhZ2VzU3VtbWFyeWNoZWNrUXVldWVjbG9zZVJlc29sdXRpb25QZXJmb3JtaW5nIGdsb2JhbCB0eXBlIGluZmVyZW5jZWluZmVycmVkRGF0YUJ1aWxkZXJhbm5vdGF0aW9uc0RhdGFydW5HbG9iYWxUeXBlSW5mZXJlbmNlZ2xvYmFsSW5mZXJlbmNlUmVzdWx0c2NvZGVnZW5FbnF1ZXVlcmNyZWF0ZUNvZGVnZW5FbnF1ZXVlcnNob3dDb2RlZ2VuUHJvZ3Jlc3Njb2RlZ2VuV29ybGRFbWl0dGluZyBKYXZhU2NyaXB0cHJvZ3JhbVNpemVhc3NlbWJsZVByb2dyYW1pbmZlcnJlZERhdGFyZXBvcnRTaXplb25Db2RlZ2VuRW5kc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZXN0cmF0ZWd5aXJEYXRhd29ybGREYXRhc2VyaWFsaXplRGF0YWRlc2VyaWFsaXplRGF0YWRlc2VyaWFsaXplQ29tcG9uZW50a0Nsb3NlZFdvcmxkY2xvc2VXb3JsZGpDbG9zZWRXb3JsZGNyZWF0ZUpDbG9zZWRXb3JsZGVtcHR5UXVldWV3b3Jrd2l0aEN1cnJlbnRFbGVtZW50d29yay5ydW5pbXBhY3RTb3VyY2VvcGVuY2Fub25pY2FsVXJpc3RhcnRQaGFzZXF1ZXVlSXNDbG9zZWRvbkltcGFjdFVzZWRpbXBhY3RVc2VjaGVja05vRW5xdWV1ZWRJbnZva2VkSW5zdGFuY2VNZXRob2RzY2hlY2tRdWV1ZUlzRW1wdHlVbmV4cGVjdGVkIHBoYXNlOiBzaG93UHJvZ3Jlc3NSZXNvbHZlZCBwcm9jZXNzZWRFbnRpdGllcyBlbGVtZW50cy5Db21waWxlZCAgbWV0aG9kcy5vbkNyYXNoSW5Vc2VyQ29kZW1hcmtDb21waWxhdGlvbkFzRmFpbGVkZmF0YWxEaWFnbm9zdGljUmVwb3J0ZWRjdXJyZW50bHlJblVzZXJDb2RlaW5Vc2VyQ29kZWFzc3VtZUluVXNlckNvZGVfdXJpRnJvbUVsZW1lbnRjb2RlTG9jYXRpb25pblNhbWVMb2NhdGlvbmdldENhbm9uaWNhbFVyaXNsYXNoUG9zX0NvbXBpbGVyT3V0cHV0X2NvbXBpbGVyX3VzZXJPdXRwdXRTdXBwcmVzc2lvbkluZm93YXJuaW5nc0NvbXBpbGVyRGlhZ25vc3RpY1JlcG9ydGVyX2N1cnJlbnRFbGVtZW50bGFzdERpYWdub3N0aWNXYXNGaWx0ZXJlZHN1cHByZXNzZWRXYXJuaW5nc2NyZWF0ZU1lc3NhZ2VzcGFubmFibGVtZXNzYWdlS2luZHNwYW5Gcm9tU3Bhbm5hYmxlcmVwb3J0RXJyb3JyZXBvcnREaWFnbm9zdGljSW50ZXJuYWxyZXBvcnRIaW50cmVwb3J0SW5mb2VsZW1lbnRGcm9tU3Bhbm5hYmxlaGFzUmVwb3J0ZWRFcnJvcnJlcG9ydEFzc2VydGlvbkZhaWx1cmVwbGVhc2VSZXBvcnRDcmFzaHVuaGFuZGxlZEV4Y2VwdGlvbk9uRWxlbWVudGRvdWJsZUZhdWx0dHJ5VG9TdHJpbmdNZXNzYWdlS2luZC5HRU5FUklDX3NwYW5Gcm9tU3RyYXRlZ3lObyBlcnJvciBsb2NhdGlvbi5DdXJyZW50IGVsZW1lbnRzb3VyY2VFbGVtZW50c291cmNlSW5mb3JtYXRpb25pbnRlcm5hbEVycm9ycmVhc29uTWVzc2FnZUtpbmQuQ09NUElMRVJfQ1JBU0hFRE1lc3NhZ2VLaW5kLlBMRUFTRV9SRVBPUlRfVEhFX0NSQVNIPGV4Y2VwdGlvbiBpbiB0b1N0cmluZygpPk1lc3NhZ2VLaW5kLkhJRERFTl9XQVJOSU5HU19ISU5UU01lc3NhZ2VLaW5kLkhJRERFTl9ISU5UU01lc3NhZ2VLaW5kLkhJRERFTl9XQVJOSU5HU19NYXBJbXBhY3RDYWNoZURlbGV0ZXJ1bmNhY2hlV29ybGRJbXBhY3RlbXB0eUNhY2hlX0VtcHR5RW52aXJvbm1lbnRQcm9ncmVzc1Byb2dyZXNzSW1wbF9zdG9wd2F0Y2hJbnRlcmFjdGl2ZVByb2dyZXNzX3N0b3B3YXRjaFBoYXNlX3N0b3B3YXRjaEludGVydmFsdGltZXJhdGUbWzFBG1tLG1s0ODs1OzQwbRtbMzBtPT0+G1swbSAgRWxhcHNlZCB0aW1lOiAgcy4gUmF0ZTogIHVuaXRzL21zZGFydDJqcy5tZXNzYWdlc3NoYXJlZF9tZXNzYWdlc01lc3NhZ2VLaW5kLkFCU1RSQUNUX0dFVFRFUk1lc3NhZ2VLaW5kLkNBTk5PVF9SRVNPTFZFTWVzc2FnZUtpbmQuQ09NUExFWF9SRVRVUk5JTkdfTlNNTWVzc2FnZUtpbmQuQ09NUExFWF9USFJPV0lOR19OU01NZXNzYWdlS2luZC5DT05TVF9DT05TVFJVQ1RPUl9XSVRIX0JPRFlNZXNzYWdlS2luZC5DT05TVF9GQUNUT1JZTWVzc2FnZUtpbmQuQ09OU1RSVUNUT1JfV0lUSF9SRVRVUk5fVFlQRU1lc3NhZ2VLaW5kLkNZQ0xJQ19DT01QSUxFX1RJTUVfQ09OU1RBTlRTTWVzc2FnZUtpbmQuRElSRUNUTFlfVEhST1dJTkdfTlNNTWVzc2FnZUtpbmQuRVFVQUxfTUFQX0VOVFJZX0tFWU1lc3NhZ2VLaW5kLkVRVUFMX1NFVF9FTlRSWU1lc3NhZ2VLaW5kLkVYVFJBTkVPVVNfTU9ESUZJRVJNZXNzYWdlS2luZC5FWFRSQU5FT1VTX01PRElGSUVSX1JFUExBQ0VNZXNzYWdlS2luZC5GT1JJTl9OT1RfQVNTSUdOQUJMRU1lc3NhZ2VLaW5kLklNUExJQ0lUX0pTX0lOVEVST1BfRklFTERfTk9UX1NVUFBPUlRFRE1lc3NhZ2VLaW5kLklOVkFMSURfQVNTRVJUX1ZBTFVFTWVzc2FnZUtpbmQuSU5WQUxJRF9BU1NFUlRfVkFMVUVfTUVTU0FHRU1lc3NhZ2VLaW5kLklOVkFMSURfQk9PTF9GUk9NX0VOVklST05NRU5UX0RFRkFVTFRfVkFMVUVfVFlQRU1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQ0FTVE1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQUREX1RZUEVTTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9CSU5BUllfSU5UX1RZUEVNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9OVU1fVFlQRU1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfQklOQVJZX1BSSU1JVElWRV9UWVBFTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9DT01QTEVNRU5UX1RZUEVNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0NPTkRJVElPTkFMX1RZUEVNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0NPTlNUUlVDVE9STWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9ESVZNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX0lOREVYTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9JTlRFUlBPTEFUSU9OX1RZUEVNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX05FR0FURV9UWVBFTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9OT1RfVFlQRU1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfU1RSSU5HX0FERF9UWVBFTWVzc2FnZUtpbmQuSU5WQUxJRF9DT05TVEFOVF9OVU1fQUREX1RZUEVNZXNzYWdlS2luZC5JTlZBTElEX0NPTlNUQU5UX1NUUklOR19MRU5HVEhfVFlQRU1lc3NhZ2VLaW5kLklOVkFMSURfQ09OU1RBTlRfU0hJRlRNZXNzYWdlS2luZC5JTlZBTElEX0ZST01fRU5WSVJPTk1FTlRfTkFNRV9UWVBFTWVzc2FnZUtpbmQuSU5WQUxJRF9JTlRfRlJPTV9FTlZJUk9OTUVOVF9ERUZBVUxUX1ZBTFVFX1RZUEVNZXNzYWdlS2luZC5JTlZBTElEX0xPR0lDQUxfQU5EX09QRVJBTkRfVFlQRU1lc3NhZ2VLaW5kLklOVkFMSURfTE9HSUNBTF9PUl9PUEVSQU5EX1RZUEVNZXNzYWdlS2luZC5JTlZBTElEX1BBQ0tBR0VfQ09ORklHTWVzc2FnZUtpbmQuSU5WQUxJRF9QQUNLQUdFX1VSSU1lc3NhZ2VLaW5kLklOVkFMSURfU1RSSU5HX0ZST01fRU5WSVJPTk1FTlRfREVGQVVMVF9WQUxVRV9UWVBFTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9DTEFTU19DQU5OT1RfRVhURU5EX0RBUlRfQ0xBU1NNZXNzYWdlS2luZC5KU19JTlRFUk9QX0NMQVNTX05PTl9FWFRFUk5BTF9DT05TVFJVQ1RPUk1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfQ0xBU1NfTk9OX0VYVEVSTkFMX01FTUJFUk1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfRklFTERfTk9UX1NVUFBPUlRFRE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfSU5ERVhfTk9UX1NVUFBPUlRFRE1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfTk9OX0VYVEVSTkFMX01FTUJFUk1lc3NhZ2VLaW5kLkpTX0lOVEVST1BfTUVNQkVSX0lOX05PTl9KU19JTlRFUk9QX0NMQVNTTWVzc2FnZUtpbmQuSlNfSU5URVJPUF9NRVRIT0RfV0lUSF9OQU1FRF9BUkdVTUVOVFNNZXNzYWdlS2luZC5KU19PQkpFQ1RfTElURVJBTF9DT05TVFJVQ1RPUl9XSVRIX1BPU0lUSU9OQUxfQVJHVU1FTlRTTWVzc2FnZUtpbmQuSlNfUExBQ0VIT0xERVJfQ0FQVFVSRU1lc3NhZ2VLaW5kLkxJQlJBUllfTk9UX0ZPVU5ETWVzc2FnZUtpbmQuTUlTU0lOR19FWFBSRVNTSU9OX0lOX1RIUk9XTWVzc2FnZUtpbmQuTkFUSVZFX05PTl9JTlNUQU5DRV9JTl9OT05fTkFUSVZFX0NMQVNTTWVzc2FnZUtpbmQuTk9fU1VDSF9TVVBFUl9NRU1CRVJNZXNzYWdlS2luZC5OT05fTkFUSVZFX0VYVEVSTkFMTWVzc2FnZUtpbmQuTk9UX0FfQ09NUElMRV9USU1FX0NPTlNUQU5UTWVzc2FnZUtpbmQuTk9UX0FTU0lHTkFCTEVNZXNzYWdlS2luZC5QUkVBTUJMRU1lc3NhZ2VLaW5kLlJFVEhST1dfT1VUU0lERV9DQVRDSE1lc3NhZ2VLaW5kLlJFVFVSTl9JTl9HRU5FUkFUSVZFX0NPTlNUUlVDVE9STWVzc2FnZUtpbmQuUkVUVVJOX0lOX0dFTkVSQVRPUk1lc3NhZ2VLaW5kLlJVTlRJTUVfVFlQRV9UT19TVFJJTkdfT0JKRUNUTWVzc2FnZUtpbmQuUlVOVElNRV9UWVBFX1RPX1NUUklOR19TVUJUWVBFTWVzc2FnZUtpbmQuU1RSSU5HX0VYUEVDVEVETWVzc2FnZUtpbmQuVU5ERUZJTkVEX0dFVFRFUk1lc3NhZ2VLaW5kLlVOREVGSU5FRF9JTlNUQU5DRV9HRVRURVJfQlVUX1NFVFRFUk1lc3NhZ2VLaW5kLlVOREVGSU5FRF9NRVRIT0RNZXNzYWdlS2luZC5VTkRFRklORURfT1BFUkFUT1JNZXNzYWdlS2luZC5VTkRFRklORURfU0VUVEVSTWVzc2FnZUtpbmQuVU5ERUZJTkVEX1NUQVRJQ19HRVRURVJfQlVUX1NFVFRFUk1lc3NhZ2VLaW5kLlVOREVGSU5FRF9TVEFUSUNfU0VUVEVSX0JVVF9HRVRURVJNZXNzYWdlS2luZC5VTkRFRklORURfU1VQRVJfU0VUVEVSTWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTTWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTX0ZJUlNUTWVzc2FnZUtpbmQuV1JPTkdfQVJHVU1FTlRfRk9SX0pTX1NFQ09ORE1lc3NhZ2VLaW5kLldST05HX0FSR1VNRU5UX0ZPUl9KU19JTlRFUkNFUFRPUl9DT05TVEFOVE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX0ZPUkJJRERFTk1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX1ZBTFVFX09WRVJSSURFU19FUVVBTFNNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9UWVBFU19OT1RfRVFVQUxNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9UWVBFU19OT1RfRVFVQUxfQ0FTRUFCU1RSQUNUX0dFVFRFUkNBTk5PVF9SRVNPTFZFQ09NUElMRVJfQ1JBU0hFRENPTVBMRVhfUkVUVVJOSU5HX05TTUNPTVBMRVhfVEhST1dJTkdfTlNNQ09OU1RfRkFDVE9SWUNPTlNUUlVDVE9SX1dJVEhfUkVUVVJOX1RZUEVDWUNMSUNfQ09NUElMRV9USU1FX0NPTlNUQU5UU0RJUkVDVExZX1RIUk9XSU5HX05TTUVRVUFMX01BUF9FTlRSWV9LRVlFUVVBTF9TRVRfRU5UUllFWFRSQU5FT1VTX01PRElGSUVSRVhUUkFORU9VU19NT0RJRklFUl9SRVBMQUNFRk9SSU5fTk9UX0FTU0lHTkFCTEVHRU5FUklDSElEREVOX0hJTlRTSElEREVOX1dBUk5JTkdTSElEREVOX1dBUk5JTkdTX0hJTlRTSU1QTElDSVRfSlNfSU5URVJPUF9GSUVMRF9OT1RfU1VQUE9SVEVESU5WQUxJRF9BU1NFUlRfVkFMVUVJTlZBTElEX0FTU0VSVF9WQUxVRV9NRVNTQUdFSU5WQUxJRF9CT09MX0ZST01fRU5WSVJPTk1FTlRfREVGQVVMVF9WQUxVRV9UWVBFSU5WQUxJRF9DT05TVEFOVF9DQVNUSU5WQUxJRF9DT05TVEFOVF9BRERfVFlQRVNJTlZBTElEX0NPTlNUQU5UX0JJTkFSWV9JTlRfVFlQRUlOVkFMSURfQ09OU1RBTlRfQklOQVJZX05VTV9UWVBFSU5WQUxJRF9DT05TVEFOVF9CSU5BUllfUFJJTUlUSVZFX1RZUEVJTlZBTElEX0NPTlNUQU5UX0NPTVBMRU1FTlRfVFlQRUlOVkFMSURfQ09OU1RBTlRfQ09ORElUSU9OQUxfVFlQRUlOVkFMSURfQ09OU1RBTlRfQ09OU1RSVUNUT1JJTlZBTElEX0NPTlNUQU5UX0RJVklOVkFMSURfQ09OU1RBTlRfSU5ERVhJTlZBTElEX0NPTlNUQU5UX0lOVEVSUE9MQVRJT05fVFlQRUlOVkFMSURfQ09OU1RBTlRfTkVHQVRFX1RZUEVJTlZBTElEX0NPTlNUQU5UX05PVF9UWVBFSU5WQUxJRF9DT05TVEFOVF9TVFJJTkdfQUREX1RZUEVJTlZBTElEX0NPTlNUQU5UX05VTV9BRERfVFlQRUlOVkFMSURfQ09OU1RBTlRfU1RSSU5HX0xFTkdUSF9UWVBFSU5WQUxJRF9DT05TVEFOVF9TSElGVElOVkFMSURfRlJPTV9FTlZJUk9OTUVOVF9OQU1FX1RZUEVJTlZBTElEX0lOVF9GUk9NX0VOVklST05NRU5UX0RFRkFVTFRfVkFMVUVfVFlQRUlOVkFMSURfTE9HSUNBTF9BTkRfT1BFUkFORF9UWVBFSU5WQUxJRF9MT0dJQ0FMX09SX09QRVJBTkRfVFlQRUlOVkFMSURfTUVUQURBVEFJTlZBTElEX01FVEFEQVRBX0dFTkVSSUNJTlZBTElEX1BBQ0tBR0VfQ09ORklHSU5WQUxJRF9QQUNLQUdFX1VSSUlOVkFMSURfU1RSSU5HX0ZST01fRU5WSVJPTk1FTlRfREVGQVVMVF9WQUxVRV9UWVBFSlNfSU5URVJPUF9DTEFTU19DQU5OT1RfRVhURU5EX0RBUlRfQ0xBU1NKU19JTlRFUk9QX0NMQVNTX05PTl9FWFRFUk5BTF9DT05TVFJVQ1RPUkpTX0lOVEVST1BfQ0xBU1NfTk9OX0VYVEVSTkFMX01FTUJFUkpTX0lOVEVST1BfRklFTERfTk9UX1NVUFBPUlRFREpTX0lOVEVST1BfSU5ERVhfTk9UX1NVUFBPUlRFREpTX0lOVEVST1BfTk9OX0VYVEVSTkFMX01FTUJFUkpTX0lOVEVST1BfTUVNQkVSX0lOX05PTl9KU19JTlRFUk9QX0NMQVNTSlNfSU5URVJPUF9NRVRIT0RfV0lUSF9OQU1FRF9BUkdVTUVOVFNKU19PQkpFQ1RfTElURVJBTF9DT05TVFJVQ1RPUl9XSVRIX1BPU0lUSU9OQUxfQVJHVU1FTlRTSlNfUExBQ0VIT0xERVJfQ0FQVFVSRUxJQlJBUllfTk9UX0ZPVU5ETUlSUk9SU19MSUJSQVJZX05PVF9TVVBQT1JUX1dJVEhfQ0ZFTUlTU0lOR19FWFBSRVNTSU9OX0lOX1RIUk9XTkFUSVZFX05PTl9JTlNUQU5DRV9JTl9OT05fTkFUSVZFX0NMQVNTTk9fU1VDSF9TVVBFUl9NRU1CRVJOT05fTkFUSVZFX0VYVEVSTkFMTk9UX0FfQ09NUElMRV9USU1FX0NPTlNUQU5UTk9UX0FTU0lHTkFCTEVQTEVBU0VfUkVQT1JUX1RIRV9DUkFTSFBSRUFNQkxFUkVUVVJOX0lOX0dFTkVSQVRJVkVfQ09OU1RSVUNUT1JSVU5USU1FX1RZUEVfVE9fU1RSSU5HX09CSkVDVFJVTlRJTUVfVFlQRV9UT19TVFJJTkdfU1VCVFlQRVNUUklOR19FWFBFQ1RFRFVOREVGSU5FRF9JTlNUQU5DRV9HRVRURVJfQlVUX1NFVFRFUlVOREVGSU5FRF9TVEFUSUNfR0VUVEVSX0JVVF9TRVRURVJVTkRFRklORURfU1RBVElDX1NFVFRFUl9CVVRfR0VUVEVSV1JPTkdfQVJHVU1FTlRfRk9SX0pTV1JPTkdfQVJHVU1FTlRfRk9SX0pTX0ZJUlNUV1JPTkdfQVJHVU1FTlRfRk9SX0pTX1NFQ09ORFdST05HX0FSR1VNRU5UX0ZPUl9KU19JTlRFUkNFUFRPUl9DT05TVEFOVFNXSVRDSF9DQVNFX0ZPUkJJRERFTlNXSVRDSF9DQVNFX1ZBTFVFX09WRVJSSURFU19FUVVBTFNTV0lUQ0hfQ0FTRV9UWVBFU19OT1RfRVFVQUxTV0lUQ0hfQ0FTRV9UWVBFU19OT1RfRVFVQUxfQ0FTRWhvd1RvRml4ZXhhbXBsZXNURU1QTEFURVNDb25zdCBjb25zdHJ1Y3RvciBjYW4ndCBoYXZlIGEgYm9keS5UcnkgcmVtb3ZpbmcgdGhlICdjb25zdCcga2V5d29yZCBvciB0aGUgYm9keS4gICAgICAgICBjbGFzcyBDIHsKICAgICAgICAgICBjb25zdCBDKCkge30KICAgICAgICAgfQoKICAgICAgICAgbWFpbigpID0+IG5ldyBDKCk7VHJ5IHJlbW92aW5nIHRoZSAnY29uc3QnIGtleXdvcmQgb3IgcmVwbGFjaW5nIHRoZSBib2R5IHdpdGggJz0nIGZvbGxvd2VkIGJ5IGEgdmFsaWQgdGFyZ2V0LiAgICAgICAgIGNsYXNzIEMgewogICAgICAgICAgIGNvbnN0IGZhY3RvcnkgQygpIHt9CiAgICAgICAgIH0KCiAgICAgICAgIG1haW4oKSA9PiBuZXcgQygpO0Nhbid0IGhhdmUgbW9kaWZpZXIgJyN7bW9kaWZpZXJ9JyBoZXJlLlRyeSByZW1vdmluZyAnI3ttb2RpZmllcn0nLnZhciBTdHJpbmcgZm9vOyBtYWluKCl7fXZhciBmaW5hbCBmb287IG1haW4oKXt9dmFyIHZhciBmb287IG1haW4oKXt9dmFyIGNvbnN0IGZvbzsgbWFpbigpe312YXIgYWJzdHJhY3QgZm9vOyBtYWluKCl7fXZhciBzdGF0aWMgZm9vOyBtYWluKCl7fXZhciBleHRlcm5hbCBmb287IG1haW4oKXt9ZmluYWwgdmFyIGZvbzsgbWFpbigpe31jb25zdCB2YXIgZm9vOyBtYWluKCl7fWFic3RyYWN0IHZhciBmb287IG1haW4oKXt9c3RhdGljIHZhciBmb287IG1haW4oKXt9ZXh0ZXJuYWwgdmFyIGZvbzsgbWFpbigpe31UcnkgcmVwbGFjaW5nIG1vZGlmaWVyICcje21vZGlmaWVyfScgd2l0aCAndmFyJywgJ2ZpbmFsJywgb3IgYSB0eXBlLnNldCBmb287IG1haW4oKXt9YWJzdHJhY3QgZm9vOyBtYWluKCl7fXN0YXRpYyBmb287IG1haW4oKXt9ZXh0ZXJuYWwgZm9vOyBtYWluKCl7fWNsYXNzIEEgeyBpbnQgQSgpIHt9IH0gbWFpbigpIHsgbmV3IEEoKTsgfURpZCB5b3UgbWVhbiAncmV0aHJvdyc/UmV0aHJvdyBtdXN0IGJlIGluc2lkZSBvZiBjYXRjaCBjbGF1c2UuVHJ5IG1vdmluZyB0aGUgZXhwcmVzc2lvbiBpbnRvIGEgY2F0Y2ggY2xhdXNlLCBvciB1c2luZyBhICd0aHJvdycgZXhwcmVzc2lvbi5tYWluKCkgeyByZXRocm93OyB9Q29uc3RydWN0b3JzIGNhbid0IHJldHVybiB2YWx1ZXMuVHJ5IHJlbW92aW5nIHRoZSByZXR1cm4gc3RhdGVtZW50IG9yIHVzaW5nIGEgZmFjdG9yeSBjb25zdHJ1Y3Rvci4gICAgICAgIGNsYXNzIEMgewogICAgICAgICAgQygpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBtYWluKCkgPT4gbmV3IEMoKTtDYW4ndCByZXR1cm4gYSB2YWx1ZSBmcm9tIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uICh1c2luZyB0aGUgJyN7bW9kaWZpZXJ9JyBtb2RpZmllcikuVHJ5IHJlbW92aW5nIHRoZSB2YWx1ZSwgcmVwbGFjaW5nICdyZXR1cm4nIHdpdGggJ3lpZWxkJyBvciBjaGFuZ2luZyB0aGUgbWV0aG9kIGJvZHkgbW9kaWZpZXIuICAgICAgICBmb28oKSBhc3luYyogeyByZXR1cm4gMDsgfQogICAgICAgIG1haW4oKSA9PiBmb28oKTsKICAgICAgICAgICAgICAgIGZvbygpIHN5bmMqIHsgcmV0dXJuIDA7IH0KICAgICAgICBtYWluKCkgPT4gZm9vKCk7CiAgICAgICAgJyN7ZnJvbVR5cGV9JyBpcyBub3QgYXNzaWduYWJsZSB0byAnI3t0b1R5cGV9Jy5UaGUgZWxlbWVudCB0eXBlICcje2N1cnJlbnRUeXBlfScgb2YgJyN7ZXhwcmVzc2lvblR5cGV9JyBpcyBub3QgYXNzaWduYWJsZSB0byAnI3tlbGVtZW50VHlwZX0nLiAgICAgICAgbWFpbigpIHsKICAgICAgICAgIExpc3Q8aW50PiBsaXN0ID0gPGludD5bMSwgMl07CiAgICAgICAgICBmb3IgKFN0cmluZyB4IGluIGxpc3QpIHg7CiAgICAgICAgfQogICAgICAgIENhbid0IHJlc29sdmUgJyN7bmFtZX0nLlRoZSBtZXRob2QgJyN7bWVtYmVyTmFtZX0nIGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyN7Y2xhc3NOYW1lfScuICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgIGZvbygpIHsgYmFyKCk7IH0KICAgICAgICB9CiAgICAgICAgbWFpbigpIHsgbmV3IEEoKS5mb28oKTsgfQogICAgICAgIFRoZSBnZXR0ZXIgJyN7bWVtYmVyTmFtZX0nIGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyN7Y2xhc3NOYW1lfScuY2xhc3MgQSB7fSBtYWluKCkgeyBuZXcgQSgpLng7IH1jbGFzcyBBIHt9IG1haW4oKSB7IEEueDsgfVRoZSBzZXR0ZXIgJyN7bWVtYmVyTmFtZX0nIGluIGNsYXNzICcje2NsYXNzTmFtZX0nIGNhbiBub3QgYmUgdXNlZCBhcyBhIGdldHRlci5jbGFzcyBBIHsgc2V0IHgoeSkge30gfSBtYWluKCkgeyBuZXcgQSgpLng7IH1UaGUgb3BlcmF0b3IgJyN7bWVtYmVyTmFtZX0nIGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyN7Y2xhc3NOYW1lfScuY2xhc3MgQSB7fSBtYWluKCkgeyBuZXcgQSgpICsgMzsgfVRoZSBzZXR0ZXIgJyN7bWVtYmVyTmFtZX0nIGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyN7Y2xhc3NOYW1lfScuY2xhc3MgQSB7fSBtYWluKCkgeyBuZXcgQSgpLnggPSA0OTk7IH1DYW4ndCByZXNvbHZlICcje21lbWJlck5hbWV9JyBpbiBhIHN1cGVyY2xhc3Mgb2YgJyN7Y2xhc3NOYW1lfScuVGhlIHNldHRlciAnI3ttZW1iZXJOYW1lfScgaXMgbm90IGRlZmluZWQgaW4gYSBzdXBlcmNsYXNzIG9mICcje2NsYXNzTmFtZX0nLiAgICAgICAgY2xhc3MgQSB7fQogICAgICAgIGNsYXNzIEIgZXh0ZW5kcyBBIHsKICAgICAgICAgIGZvbygpIHsgc3VwZXIueCA9IDQ5OTsgfQogICAgICAgIH0KICAgICAgICBtYWluKCkgeyBuZXcgQigpLmZvbygpOyB9CiAgICAgICAgQ2Fubm90IHJlc29sdmUgZ2V0dGVyICcje25hbWV9Jy5zZXQgZm9vKHgpIHt9ICBtYWluKCkgeyBmb287IH1DYW5ub3QgcmVzb2x2ZSBzZXR0ZXIgJyN7bmFtZX0nLiAgICAgICAgbWFpbigpIHsKICAgICAgICAgIGZpbmFsIHggPSAxOwogICAgICAgICAgeCA9IDI7CiAgICAgICAgfSAgICAgICAgbWFpbigpIHsKICAgICAgICAgIGNvbnN0IHggPSAxOwogICAgICAgICAgeCA9IDI7CiAgICAgICAgfQogICAgICAgICAgICAgICAgZmluYWwgeCA9IDE7CiAgICAgICAgbWFpbigpIHsgeCA9IDM7IH0KICAgICAgICAgICAgICAgIGNvbnN0IHggPSAxOwogICAgICAgIG1haW4oKSB7IHggPSAzOyB9CiAgICAgICAgZ2V0IGZvbyA9PiBudWxsICBtYWluKCkgeyBmb28gPSA1OyB9Y29uc3QgZm9vID0gMCAgbWFpbigpIHsgZm9vID0gNTsgfSN7dGV4dH1DYW5ub3QgcmVzb2x2ZSAnI3tuYW1lfScuTm90IGEgY29tcGlsZS10aW1lIGNvbnN0YW50LkN5Y2xlIGluIHRoZSBjb21waWxlLXRpbWUgY29uc3RhbnQgY29tcHV0YXRpb24uQ2Fubm90IHJlc29sdmUgc2V0dGVyLkV4cGVjdGVkIGEgJ1N0cmluZycsIGJ1dCBnb3QgYW4gaW5zdGFuY2Ugb2YgJyN7dHlwZX0nLkpzLWludGVyb3AgY2xhc3MgJyN7Y2xzfScgY2Fubm90IGV4dGVuZCBmcm9tIHRoZSBub24ganMtaW50ZXJvcCBjbGFzcyAnI3tzdXBlcmNsYXNzfScuQW5ub3RhdGUgdGhlIHN1cGVyY2xhc3Mgd2l0aCBASlMuICAgICAgICAgICAgICBpbXBvcnQgJ3BhY2thZ2U6anMvanMuZGFydCc7CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7IH0KCiAgICAgICAgICAgICAgQEpTKCkKICAgICAgICAgICAgICBjbGFzcyBCYXIgZXh0ZW5kcyBGb28geyB9CgogICAgICAgICAgICAgIG1haW4oKSB7CiAgICAgICAgICAgICAgICBuZXcgQmFyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIEpzLWludGVyb3AgZG9lcyBub3Qgc3VwcG9ydCBbXSBhbmQgW109IG9wZXJhdG9yIG1ldGhvZHMuVHJ5IHJlcGxhY2luZyBbXSBhbmQgW109IG9wZXJhdG9yIG1ldGhvZHMgd2l0aCBub3JtYWwgbWV0aG9kcy4gICAgICAgIGltcG9ydCAncGFja2FnZTpqcy9qcy5kYXJ0JzsKCiAgICAgICAgQEpTKCkKICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgZXh0ZXJuYWwgb3BlcmF0b3IgW10oYXJnKTsKICAgICAgICB9CgogICAgICAgIG1haW4oKSB7CiAgICAgICAgICBuZXcgRm9vKClbMF07CiAgICAgICAgfQogICAgICAgICAgICAgICAgaW1wb3J0ICdwYWNrYWdlOmpzL2pzLmRhcnQnOwoKICAgICAgICBASlMoKQogICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICBleHRlcm5hbCBvcGVyYXRvciBbXT0oYXJnLCB2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICBtYWluKCkgewogICAgICAgICAgbmV3IEZvbygpWzBdID0gMTsKICAgICAgICB9CiAgICAgICAgU29tZSBwYXJhbWV0ZXJzIGluIGFub255bW91cyBqcy1pbnRlcm9wIGNsYXNzICcje2Nsc30nIG9iamVjdCBsaXRlcmFsIGNvbnN0cnVjdG9yIGFyZSBwb3NpdGlvbmFsIGluc3RlYWQgb2YgbmFtZWQuLk1ha2UgYWxsIGFyZ3VtZW50cyBpbiBleHRlcm5hbCBmYWN0b3J5IG9iamVjdCBsaXRlcmFsIGNvbnN0cnVjdG9ycyBuYW1lZC5jbGFzcyBTdXBlciB7CiAgZmFjdG9yeSBTdXBlci5mb28oKSA9PiBudWxsOwp9CmNsYXNzIENsYXNzIGV4dGVuZHMgU3VwZXIgewogIENsYXNzKCkgOiBzdXBlci5mb28oKTsKfQptYWluKCkgPT4gbmV3IENsYXNzKCk7CkpzLWludGVyb3AgbWVtYmVycyBtdXN0IGJlICdleHRlcm5hbCcuSnMtaW50ZXJvcCBjbGFzcyBtZW1iZXJzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBqcy1pbnRlcm9wIGNsYXNzZXMuVHJ5IG1hcmtpbmcgdGhlIGVuY2xvc2luZyBjbGFzcyBhcyBqcy1pbnRlcm9wIG9yIHJlbW92ZSB0aGUganMtaW50ZXJvcCBhbm5vdGF0aW9uIGZyb20gdGhlIG1lbWJlci5Db25zdHJ1Y3RvciAnI3tjb25zdHJ1Y3Rvcn0nIGluIGpzLWludGVyb3AgY2xhc3MgJyN7Y2xzfScgaXMgbm90IGV4dGVybmFsLlRyeSBhZGRpbmcgdGhlICdleHRlcm5hbCcgdG8gJyN7Y29uc3RydWN0b3J9Jy5NZW1iZXIgJyN7bWVtYmVyfScgaW4ganMtaW50ZXJvcCBjbGFzcyAnI3tjbHN9JyBpcyBub3QgZXh0ZXJuYWwuVHJ5IGFkZGluZyB0aGUgJ2V4dGVybmFsJyB0byAnI3ttZW1iZXJ9Jy4gICAgICAgICAgICAgIGltcG9ydCAncGFja2FnZTpqcy9qcy5kYXJ0JzsKCiAgICAgICAgICAgICAgQEpTKCkKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgYmFyKCkge30KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIG1haW4oKSB7CiAgICAgICAgICAgICAgICBuZXcgRm9vKCkuYmFyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIEpzLWludGVyb3AgbWV0aG9kICcje21ldGhvZH0nIGhhcyBuYW1lZCBhcmd1bWVudHMgYnV0IGlzIG5vdCBhIGZhY3RvcnkgY29uc3RydWN0b3Igb2YgYW4gQGFub255bW91cyBASlMgY2xhc3MuUmVtb3ZlIGFsbCBuYW1lZCBhcmd1bWVudHMgZnJvbSBqcy1pbnRlcm9wIG1ldGhvZCBvciBpbiB0aGUgY2FzZSBvZiBhIGZhY3RvcnkgY29uc3RydWN0b3IgYW5ub3RhdGUgdGhlIGNsYXNzIGFzIEBhbm9ueW1vdXMuICAgICAgICAgICAgICBpbXBvcnQgJ3BhY2thZ2U6anMvanMuZGFydCc7CgogICAgICAgICAgICAgIEBKUygpCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIGV4dGVybmFsIGJhcihmb28sIHtiYXp9KTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIG1haW4oKSB7CiAgICAgICAgICAgICAgICBuZXcgRm9vKCkuYmFyKDQsIGJhejogNSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIEZpZWxkcyBpbiBqcy1pbnRlcm9wIGNsYXNzZXMgYXJlIG5vdCBzdXBwb3J0ZWQuVHJ5IHJlcGxhY2luZyB0aGUgZmllbGQgd2l0aCBhbiBleHRlcm5hbCBnZXR0ZXIgYW5kL29yIHNldHRlci5GaWVsZCBjYW4ndCBiZSBtYXJrZWQgYXMganMtaW50ZXJvcC5MaWJyYXJ5IG5vdCBmb3VuZCAnI3tyZXNvbHZlZFVyaX0nLlBhY2thZ2UgY29uZmlnIGZpbGUgJyN7dXJpfScgaXMgaW52YWxpZC4KI3tleGNlcHRpb259Q29tcHV0ZXIgc2F5cyBubyEnI3t1cml9JyBpcyBub3QgYSB2YWxpZCBwYWNrYWdlIFVSSSAoI3tleGNlcHRpb259KS4vLyBjYW4ndCBoYXZlIGEgJ3RvcCBsZXZlbCcgcGFja2FnZSBVUkkKaW1wb3J0ICdwYWNrYWdlOmZvby5kYXJ0JzsKCm1haW4oKSB7fQovLyBjYW4ndCBoYXZlIDIgc2xhc2hlcwppbXBvcnQgJ3BhY2thZ2U6Ly9mb28vZm9vLmRhcnQnOwoKbWFpbigpIHt9Ci8vIHBhY2thZ2UgbmFtZSBtdXN0IGJlIHZhbGlkCmltcG9ydCAncGFja2FnZTpub3QLYWxpZC9mb28uZGFydCc7CgptYWluKCkge30KSlMgY29kZSBtdXN0IG5vdCB1c2UgJyMnIHBsYWNlaG9sZGVycyBpbnNpZGUgZnVuY3Rpb25zLlVzZSBhbiBpbW1lZGlhdGVseSBjYWxsZWQgSmF2YVNjcmlwdCBmdW5jdGlvbiB0byBjYXB0dXJlIHRoZSB0aGUgcGxhY2Vob2xkZXIgdmFsdWVzIGFzIEphdmFTY3JpcHQgZnVuY3Rpb24gcGFyYW1ldGVycy5KUyBleHByZXNzaW9uIG11c3QgdGFrZSB0d28gb3IgbW9yZSBhcmd1bWVudHMuSlMgc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgbGl0ZXJhbC5Bcmd1bWVudCBmb3IgJ0pTX0lOVEVSQ0VQVE9SX0NPTlNUQU5UJyBtdXN0IGJlIGEgdHlwZSBjb25zdGFudC5UaGUgZ2V0dGVyICcje25hbWV9JyBoYXMgbm8gaW1wbGVtZW50YXRpb24gaW4gY2xhc3MgJyN7Y2xhc3N9Jy5UcnkgYWRkaW5nIGEgYm9keSB0byAnI3tuYW1lfScgb3IgZGVjbGFyaW5nICcje2NsYXNzfScgdG8gYmUgJ2Fic3RyYWN0Jy5jbGFzcyBDbGFzcyB7CiAgZ2V0IGdldHRlcjsKfQptYWluKCkgPT4gbmV3IENsYXNzKCk7CkEgbWV0YWRhdGEgYW5ub3RhdGlvbiBtdXN0IGJlIGVpdGhlciBhIHJlZmVyZW5jZSB0byBhIGNvbXBpbGUtdGltZSBjb25zdGFudCB2YXJpYWJsZSBvciBhIGNhbGwgdG8gYSBjb25zdGFudCBjb25zdHJ1Y3Rvci5UcnkgdXNpbmcgYSBkaWZmZXJlbnQgY29uc3RhbnQgdmFsdWUgb3IgcmVmZXJlbmNpbmcgaXQgdGhyb3VnaCBhIGNvbnN0YW50IHZhcmlhYmxlLkBPYmplY3QgbWFpbigpIHt9QHByaW50IG1haW4oKSB7fUEgbWV0YWRhdGEgYW5ub3RhdGlvbiB1c2luZyBhIGNvbnN0YW50IGNvbnN0cnVjdG9yIGNhbm5vdCB1c2UgdHlwZSBhcmd1bWVudHMuVHJ5IHJlbW92aW5nIHRoZSB0eXBlIGFyZ3VtZW50cyBvciByZWZlcmVuY2luZyB0aGUgY29uc3RhbnQgdGhyb3VnaCBhIGNvbnN0YW50IHZhcmlhYmxlLmNsYXNzIEM8VD4gewogIGNvbnN0IEMoKTsKfQpAQzxpbnQ+KCkgbWFpbigpIHt9CkFuIGVudHJ5IHdpdGggdGhlIHNhbWUga2V5IGFscmVhZHkgZXhpc3RzIGluIHRoZSBtYXAuVHJ5IHJlbW92aW5nIHRoZSBwcmV2aW91cyBlbnRyeSBvciBjaGFuZ2luZyB0aGUga2V5IGluIG9uZSBvZiB0aGUgZW50cmllcy5tYWluKCkgewogIHZhciBtID0gY29uc3Qgeydmb28nOiAxLCAnZm9vJzogMn07Cn1BbiBlbnRyeSBhcHBlYXJzIHR3aWNlIGluIHRoZSBzZXQuVHJ5IHJlbW92aW5nIG9uZSBvZiB0aGUgZW50cmllcy5tYWluKCkgewogIHZhciBtID0gY29uc3Qgeydmb28nLCAnYmFyJywgJ2Zvbyd9Owp9VGhlIGNvbXBpbGVyIGNyYXNoZWQgd2hlbiBjb21waWxpbmcgdGhpcyBlbGVtZW50LlRoZSBjb21waWxlciBpcyBicm9rZW4uCgpXaGVuIGNvbXBpbGluZyB0aGUgYWJvdmUgZWxlbWVudCwgdGhlIGNvbXBpbGVyIGNyYXNoZWQuIEl0IGlzIG5vdApwb3NzaWJsZSB0byB0ZWxsIGlmIHRoaXMgaXMgY2F1c2VkIGJ5IGEgcHJvYmxlbSBpbiB5b3VyIHByb2dyYW0gb3IKbm90LiBSZWdhcmRsZXNzLCB0aGUgY29tcGlsZXIgc2hvdWxkIG5vdCBjcmFzaC4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvCnJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy4KClBsZWFzZSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CgoqIHRoZSBuYW1lIGFuZCB2ZXJzaW9uIG9mIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSwKCiogdGhlIERhcnQgU0RLIGJ1aWxkIG51bWJlciAoI3tidWlsZElkfSksIGFuZAoKKiB0aGUgZW50aXJlIG1lc3NhZ2UgeW91IHNlZSBoZXJlIChpbmNsdWRpbmcgdGhlIGZ1bGwgc3RhY2sgdHJhY2UKICBiZWxvdyBhcyB3ZWxsIGFzIHRoZSBzb3VyY2UgbG9jYXRpb24gYWJvdmUpLgoje3dhcm5pbmdzfSB3YXJuaW5nKHMpIGFuZCAje2hpbnRzfSBoaW50KHMpIHN1cHByZXNzZWQgaW4gI3t1cml9LiN7d2FybmluZ3N9IHdhcm5pbmcocykgc3VwcHJlc3NlZCBpbiAje3VyaX0uI3toaW50c30gaGludChzKSBzdXBwcmVzc2VkIGluICN7dXJpfS5XaGVuIHJ1biBvbiB0aGUgY29tbWFuZC1saW5lLCB0aGUgY29tcGlsZWQgb3V0cHV0IG1pZ2h0IHJlcXVpcmUgYSBwcmVhbWJsZSBmaWxlIGxvY2F0ZWQgaW46CiAgPHNkaz4vbGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9wcmVhbWJsZXMuYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBjb25zdGFudCBjb25kaXRpb24uIE11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdib29sJy5gI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCB2YWxpZCBpbiBjb25zdGFudCBzdHJpbmcgaW50ZXJwb2xhdGlvbi4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ2Jvb2wnLCAnaW50JywgJ2RvdWJsZScsIG9yICdTdHJpbmcnLmAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgb3BlcmFuZCBvZiBhIGNvbnN0YW50IGJpbmFyeSAje29wZXJhdG9yfSBleHByZXNzaW9uLiBNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAnYm9vbCcsICdpbnQnLCAnZG91YmxlJywgJ1N0cmluZycsIG9yICdOdWxsJy5gI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIG9wZXJhbmQgb2YgYSBjb25zdGFudCBiaW5hcnkgKyBleHByZXNzaW9uIG9uICdTdHJpbmcnLiBNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAnU3RyaW5nJy5gI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIG9wZXJhbmQgZm9yIGEgLmxlbmd0aCBleHByZXNzaW9uLiBNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAnU3RyaW5nJy5TaGlmdCBhbW91bnQgbXVzdCBiZSBub24tbmVnYXRpdmUgaW4gYCN7bGVmdH0gI3tvcGVyYXRvcn0gI3tyaWdodH1gLkRpdmlzb3IgbXVzdCBiZSBub24temVybyBpbiBgI3tsZWZ0fSAje29wZXJhdG9yfSAje3JpZ2h0fWAuYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBvcGVyYW5kIG9mIGEgY29uc3RhbnQgYmluYXJ5ICsgZXhwcmVzc2lvbiBvbiAnbnVtJy4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ2ludCcgb3IgJ2RvdWJsZScuYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSBzdWJ0eXBlIG9mICN7Y2FzdFR5cGV9LmAje2xlZnRDb25zdGFudH1gIG9mIHR5cGUgJyN7bGVmdFR5cGV9JyBhbmQgYCN7cmlnaHRDb25zdGFudH1gIG9mIHR5cGUgJyN7cmlnaHRUeXBlfScgYXJlIG5vdCB2YWxpZCBvcGVyYW5kcyBvZiBhIGNvbnN0YW50IGJpbmFyeSArIGV4cHJlc3Npb24uIE11c3QgYm90aCBiZSBlaXRoZXIgb2YgdHlwZSAnU3RyaW5nJywgb3Igb2YgdHlwZXMgJ2ludCcgb3IgJ2RvdWJsZScuYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBvcGVyYW5kIG9mIGEgY29uc3RhbnQgYmluYXJ5ICN7b3BlcmF0b3J9IGV4cHJlc3Npb24uIE11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdpbnQnIG9yICdkb3VibGUnLmAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgb3BlcmFuZCBvZiBhIGNvbnN0YW50IGJpbmFyeSAje29wZXJhdG9yfSBleHByZXNzaW9uLiBNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAnaW50Jy5gI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIG9wZXJhbmQgb2YgYSBjb25zdGFudCB1bmFyeSAje29wZXJhdG9yfSBleHByZXNzaW9uLiBNdXN0IGJlIGEgdmFsdWUgb2YgdHlwZSAnYm9vbCcuYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBvcGVyYW5kIG9mIGEgY29uc3RhbnQgdW5hcnkgI3tvcGVyYXRvcn0gZXhwcmVzc2lvbi4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ2ludCcgb3IgJ2RvdWJsZScuYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBvcGVyYW5kIG9mIGEgY29uc3RhbnQgdW5hcnkgI3tvcGVyYXRvcn0gZXhwcmVzc2lvbi4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ2ludCcuSW5kZXggZXhwcmVzc2lvbnMgYXJlIG5vdCBhbGxvd2VkIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLmAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgZW52aXJvbm1lbnQgbmFtZSBjb25zdGFudC4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ1N0cmluZycuYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBgYm9vbC5mcm9tRW52aXJvbm1lbnRgIGRlZmF1bHQgdmFsdWUgY29uc3RhbnQuIE11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdib29sJyBvciBgbnVsbGAuYCN7Y29uc3RhbnR9YCBvZiB0eXBlICcje3R5cGV9JyBpcyBub3QgYSB2YWxpZCBgaW50LmZyb21FbnZpcm9ubWVudGAgZGVmYXVsdCB2YWx1ZSBjb25zdGFudC4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ2ludCcgb3IgYG51bGxgLmAje2NvbnN0YW50fWAgb2YgdHlwZSAnI3t0eXBlfScgaXMgbm90IGEgdmFsaWQgYFN0cmluZy5mcm9tRW52aXJvbm1lbnRgIGRlZmF1bHQgdmFsdWUgY29uc3RhbnQuIE11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdTdHJpbmcnIG9yIGBudWxsYC5gI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIGxvZ2ljYWwgYW5kIG9wZXJhbmQuIE11c3QgYmUgYSB2YWx1ZSBvZiB0eXBlICdib29sJy5gI3tjb25zdGFudH1gIG9mIHR5cGUgJyN7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIGxvZ2ljYWwgb3Igb3BlcmFuZC4gTXVzdCBiZSBhIHZhbHVlIG9mIHR5cGUgJ2Jvb2wnLkNvbnN0cnVjdG9yICcje2NvbnN0cnVjdG9yTmFtZX0nIGlzIG5vdCBhIHZhbGlkIGNvbnN0YW50IGNvbnN0cnVjdG9yLkFzc2VydGlvbiAnI3thc3NlcnRpb259JyBmYWlsZWQuQXNzZXJ0aW9uIGZhaWxlZDogI3ttZXNzYWdlfWRhcnQyanMgbm8gbG9uZ2VyIHN1cHBvcnRzIHRoZSBkYXJ0Om1pcnJvcnMgbGlicmFyeS4KCkFQSXMgZnJvbSB0aGlzIGxpYnJhcnkgd2lsbCB0aHJvdyBhIHJ1bnRpbWUgZXJyb3IgYXQgdGhpcyB0aW1lLCBidXQgdGhleSB3aWxsCmJlY29tZSBhIGNvbXBpbGUtdGltZSBlcnJvciBpbiB0aGUgZnV0dXJlLlRoaXMgJ25vU3VjaE1ldGhvZCcgaW1wbGVtZW50YXRpb24gaXMgZ3VhcmFudGVlZCB0byB0aHJvdyBhbiBleGNlcHRpb24uIFRoZSBnZW5lcmF0ZWQgY29kZSB3aWxsIGJlIHNtYWxsZXIgaWYgaXQgaXMgcmV3cml0dGVuLlJld3JpdGUgdG8gJ25vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGkpID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpKTsnLlRoaXMgJ25vU3VjaE1ldGhvZCcgaW1wbGVtZW50YXRpb24gaXMgZ3VhcmFudGVlZCB0byB0aHJvdyBhbiBleGNlcHRpb24uIFRoZSBnZW5lcmF0ZWQgY29kZSB3aWxsIGJlIHNtYWxsZXIgYW5kIHRoZSBjb21waWxlciB3aWxsIGJlIGFibGUgdG8gcGVyZm9ybSBtb3JlIG9wdGltaXphdGlvbnMgaWYgaXQgaXMgcmV3cml0dGVuLk92ZXJyaWRpbmcgJ25vU3VjaE1ldGhvZCcgY2F1c2VzIHRoZSBjb21waWxlciB0byBnZW5lcmF0ZSBtb3JlIGNvZGUgYW5kIHByZXZlbnRzIHRoZSBjb21waWxlciBmcm9tIGRvaW5nIHNvbWUgb3B0aW1pemF0aW9ucy5Db25zaWRlciByZW1vdmluZyB0aGlzICdub1N1Y2hNZXRob2QnIGltcGxlbWVudGF0aW9uLlVzaW5nICcucnVudGltZVR5cGUudG9TdHJpbmcoKScgY2F1c2VzIHRoZSBjb21waWxlciB0byBnZW5lcmF0ZSBtb3JlIGNvZGUgYmVjYXVzZSBpdCBuZWVkcyB0byBwcmVzZXJ2ZSB0eXBlIGFyZ3VtZW50cyBvbiBhbGwgZ2VuZXJpYyBjbGFzc2VzLCBldmVuIGlmIHRoZXkgYXJlIG5vdCBuZWNlc3NhcnkgZWxzZXdoZXJlLklmIHVzZWQgb25seSBmb3IgZGVidWdnaW5nLCBjb25zaWRlciB1c2luZyBvcHRpb24gLS1sYXgtcnVudGltZS10eXBlLXRvLXN0cmluZyB0byByZWR1Y2UgdGhlIGNvZGUgc2l6ZSBpbXBhY3QuVXNpbmcgJy5ydW50aW1lVHlwZS50b1N0cmluZygpJyBoZXJlIGNhdXNlcyB0aGUgY29tcGlsZXIgdG8gZ2VuZXJhdGUgbW9yZSBjb2RlIGJlY2F1c2UgaXQgbmVlZHMgdG8gcHJlc2VydmUgdHlwZSBhcmd1bWVudHMgb24gYWxsIGdlbmVyaWMgc3VidHlwZXMgb2YgJyN7cmVjZWl2ZXJUeXBlfScsIGV2ZW4gaWYgdGhleSBhcmUgbm90IG5lY2Vzc2FyeSBlbHNld2hlcmUuT25seSBleHRlcm5hbCBqcy1pbnRlcm9wIGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkLlRyeSByZW1vdmluZyAnZXh0ZXJuYWwnIGtleXdvcmQgb3IgYW5ub3RhdGluZyB0aGUgZnVuY3Rpb24gYXMgYSBqcy1pbnRlcm9wIGZ1bmN0aW9uLk5hdGl2ZSBub24taW5zdGFuY2UgbWVtYmVycyBhcmUgb25seSBhbGxvd2VkIGluIG5hdGl2ZSBjbGFzc2VzLidjYXNlJyBleHByZXNzaW9uIHR5cGUgJyN7dHlwZX0nIG92ZXJyaWRlcyAnb3BlcmF0b3IgPT0nLidjYXNlJyBleHByZXNzaW9uIG1heSBub3QgYmUgb2YgdHlwZSAnI3t0eXBlfScuJ2Nhc2UnIGV4cHJlc3Npb25zIGRvIG5vdCBhbGwgaGF2ZSB0eXBlICcje3R5cGV9Jy4nY2FzZScgZXhwcmVzc2lvbiBvZiB0eXBlICcje3R5cGV9Jy5oYXNIb3dUb0ZpeGNvbXB1dGVNZXNzYWdlI3sjXHsuK1x9TWlzc2luZyBhcmd1bWVudHMgaW4gZXJyb3IgbWVzc2FnZTogIk1lc3NhZ2UuaGFzaENvZGVjb252ZXJ0VG9TdHJpbmd0b0RhcnRUZXh0RE9OVF9LTk9XX0hPV19UT19GSVhFbnZpcm9ubWVudGRhcnQyanMuaW8ubG9jYXRpb25fcHJvdmlkZXJDb2RlT3V0cHV0TGlzdGVuZXJMb2NhdGlvbkNvbGxlY3Rvcl9jb2xsZWN0b25UZXh0bGluZVN0YXJ0cz0sbGVuZ3RoPWtlcm5lbC5iaW5hcnkudGFnVGFnTm90aGluZ1NvbWV0aGluZ0NvbnN0U3RhdGljSW52b2NhdGlvbkNvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uVHJ1ZUxpdGVyYWxGYWxzZUxpdGVyYWxQb3NpdGl2ZUludExpdGVyYWxOZWdhdGl2ZUludExpdGVyYWxCaWdJbnRMaXRlcmFsQ29uc3RMaXN0TGl0ZXJhbENvbnN0TWFwTGl0ZXJhbENvbnN0U2V0TGl0ZXJhbEFzeW5jRm9ySW5TdGF0ZW1lbnRTaW1wbGVJbnRlcmZhY2VUeXBlU2ltcGxlRnVuY3Rpb25UeXBlTnVsbFJlZmVyZW5jZUNsYXNzUmVmZXJlbmNlTWVtYmVyUmVmZXJlbmNlRGVwcmVjYXRlZF9Db25zdGFudEV4cHJlc3Npb25TcGVjaWFsaXplZFRhZ0hpZ2hCaXRTcGVjaWFsaXplZFRhZ01hc2tTcGVjaWFsaXplZFBheWxvYWRNYXNrU3BlY2lhbGl6ZWRWYXJpYWJsZUdldFNwZWNpYWxpemVkVmFyaWFibGVTZXRTcGVjaWFsaXplZEludExpdGVyYWxTcGVjaWFsaXplZEludExpdGVyYWxCaWFzQ29tcG9uZW50RmlsZUJpbmFyeUZvcm1hdFZlcnNpb25Db25zdGFudFRhZ2tlcm5lbC5pbXBvcnRfdGFibGVJbXBvcnRUYWJsZUNvbXBvbmVudEltcG9ydFRhYmxlX2xpYnJhcnlJbmRleExpYnJhcnlJbXBvcnRUYWJsZV9pbXBvcnRQYXRoc19pbXBvcnRlZExpYnJhcmllc2ltcG9ydFBhdGhzX0ltcG9ydFRhYmxlQnVpbGRlcnJlZmVyZW5jZUxpYnJhcnlhZGRMaWJyYXJ5SW1wb3J0cmVmZXJlbmNlVXJpdGFyZ2V0VXJpIGNhbm5vdCByZWZlciB0byBsaWJyYXJ5IHdpdGhvdXQgYW4gaW1wb3J0IFVSSWlzRmlsZU9yQ3VzdG9tU2NoZW1laXNUYXJnZXRTY2hlbWVGaWxlT3JDdXN0b21pc1JlZmVyZW5jZVNjaGVtZUZpbGVPckN1c3RvbXJlbGF0aXZlVXJpIGNhbm5vdCByZWZlciB0byBhcHBsaWNhdGlvbiBsaWJyYXJ5IGV4cG9ydGVkUmVmZXJlbmNlcmVsYXRpdmVVcmlQYXRodGFyZ2V0U2VnbWVudHNyZWZTZWdtZW50c3NhbWVva2Vka2VybmVsLmhpZXJhcmNoeV9iYXNlZF90eXBlX2Vudmlyb25tZW50SGVhcF9pdGVtc19wYXJlbnRJbmRleG9ycGhhbl9yZUluc2VydF9maXJzdENoaWxkSW5kZXhjaGlsZEluZGV4bmV4dENoaWxka2VybmVsLmxpYnJhcnlfaW5kZXhMaWJyYXJ5SW5kZXhnZXR0ZXJQcmVmaXhnZXQ6c2V0dGVyUHJlZml4c2V0OnRvcExldmVsbGlicmFyeVVyaXNsaWJyYXJ5VXJpU2V0YnlVcmljb3JlTGlicmFyaWVzX2dldExpYnJhcnlJbmRleGxpYnJhcnlJbmRleCcgaGFzIG5vdCBiZWVuIGluZGV4ZWRjb250YWluc0xpYnJhcnltZW1iZXJOYW1ldHJ5R2V0TWVtYmVydHJ5R2V0VG9wTGV2ZWxNZW1iZXJfQ2xhc3NUYWJsZWNvbnRhaW5lck5hbWVleHRlcm5hbCBsaWJyYXJ5ICdsaWJyYXJ5ICdfZ2V0Q2xhc3NJbmRleCcgbm90IGZvdW5kIGluIF9NZW1iZXJUYWJsZV9tZW1iZXJzZ2V0RGlzYW1iaWd1YXRlZE5hbWV0b3AtbGV2ZWwgb2YgY2xhc3MgJycgaW4gQSBtZW1iZXIgd2l0aCBkaXNhbWJpZ3VhdGVkIG5hbWUgJycgd2FzIG5vdCBmb3VuZCAuIERpZCB5b3UgbWVhbiAnJz9jaGFyY29kZS5hc2NpaS5kb2xsYXJfbG93ZXJjYXNlJG51bCRzb2gkc3R4JGV0eCRlb3QkZW5xJGFjayRiZWwkYnMkaHQkdGFiJGxmJHZ0JGZmJGNyJHNvJHNpJGRsZSRkYzEkZGMyJGRjMyRkYzQkbmFrJHN5biRldGIkY2FuJGVtJHN1YiRlc2MkZnMkZ3MkcnMkdXMkZGVsJHNwYWNlJGV4Y2xhbWF0aW9uJHF1b3QkcXVvdGUkZG91YmxlX3F1b3RlJHF1b3RhdGlvbiRoYXNoJGRvbGxhciRwZXJjZW50JGFtcCRhbXBlcnNhbmQkYXBvcyRhcG9zdHJvcGhlJHNpbmdsZV9xdW90ZSRscGFyZW4kb3Blbl9wYXJlbiRvcGVuX3BhcmVudGhlc2lzJHJwYXJlbiRjbG9zZV9wYXJlbiRjbG9zZV9wYXJlbnRoZXNpcyRhc3RlcmlzayRwbHVzJGNvbW1hJG1pbnVzJGRhc2gkZG90JGZ1bGxzdG9wJHNsYXNoJHNvbGlkdXMkZGl2aXNpb24kY29sb24kc2VtaWNvbG9uJGx0JGxlc3NfdGhhbiRsYW5nbGUkb3Blbl9hbmdsZSRlcXVhbCRndCRncmVhdGVyX3RoYW4kcmFuZ2xlJGNsb3NlX2FuZ2xlJHF1ZXN0aW9uJGF0JGxicmFja2V0JG9wZW5fYnJhY2tldCRiYWNrc2xhc2gkcmJyYWNrZXQkY2xvc2VfYnJhY2tldCRjaXJjdW1mbGV4JGNhcmV0JGhhdCR1bmRlcnNjb3JlJHVuZGVybGluZSRiYWNrcXVvdGUkZ3JhdmUkbGJyYWNlJG9wZW5fYnJhY2UkcGlwZSRiYXIkcmJyYWNlJGNsb3NlX2JyYWNlJHRpbGRlcGFja2FnZV9jb25maWcudXRpbF92YWxpZFBhY2thZ2VOYW1lQ2hhcmFjdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgICQgJicoKSorLC0uIDAxMjM0NTY3ODkgOyA9ICBAQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogICAgXyBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiAgIH4gX2ZpbmRJbnZhbGlkQ2hhcmFjdGVybm9uRG90Tm90IGEgcGFja2FnZTogVVJJUGFja2FnZSBVUklzIG11c3Qgbm90IGhhdmUgYSBob3N0IHBhcnRQYWNrYWdlIFVSSXMgbXVzdCBub3QgaGF2ZSBhIHF1ZXJ5IHBhcnRQYWNrYWdlIFVSSXMgbXVzdCBub3QgaGF2ZSBhIGZyYWdtZW50IHBhcnRQYWNrYWdlIFVSSXMgbXVzdCBub3Qgc3RhcnQgd2l0aCBhICcvJ1BhY2thZ2UgVVJJcyBtdXN0IHN0YXJ0IHdpdGggdGhlIHBhY2thZ2UgbmFtZSBmb2xsb3dlZCBieSBhICcvJ2JhZEluZGV4UGFja2FnZSBuYW1lcyBtdXMgYmUgbm9uLWVtcHR5UGFja2FnZSBuYW1lcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIG5vbi0nLicgY2hhcmFjdGVyYmFkQ2hhckNvZGViYWRDaGFyUGFja2FnZSBuYW1lcyBtdXN0IG5vdCBjb250YWluIGZhc3RhLnNjYW5uZXIuc3RyaW5nX2Nhbm9uaWNhbGl6ZXJwYXlsb2FkU3RyaW5nQ2Fub25pY2FsaXplck1BU0tJTklUSUFMX1NJWkVfc2l6ZV9jb3VudF9ub2Rlc2hhc2hCeXRlc2hhc2hTdHJpbmdyZWhhc2huZXdTaXplbmV3Tm9kZXNTeW50YWN0aWNFbnRpdHlTdHJpbmdVdGlsaXRpZXNJTlRFUk5FUmludGVybmZhc3RhLmtlcm5lbF9idWlsZGVyRGVsYXllZE1lbWJlckRlbGF5ZWRPdmVycmlkZUNoZWNrSW1wbGljaXRGaWVsZFR5cGVLZXJuZWxNZXRhZGF0YUJ1aWxkZXJLZXJuZWxQcmVmaXhCdWlsZGVyS2VybmVsVmFyaWFibGVCdWlsZGVyTG9hZExpYnJhcnlCdWlsZGVyVW5saW5rZWREZWNsYXJhdGlvbmNvbXBhcmVQcm9jZWR1cmVzaXNSZWRpcmVjdGluZ0dlbmVyYXRpdmVDb25zdHJ1Y3RvckltcGxlbWVudGF0aW9udG9LZXJuZWxDb21iaW5hdG9yc2Zhc3RhQ29tYmluYXRvcnNuYW1lTGlzdGZhc3RhLnRhcmdldF9pbXBsZW1lbnRhdGlvbmJhY2tlbmRyZXdyaXRlU2V2ZXJpdHljYWNoZWRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yY2FjaGVkQ29tcGlsZVRpbWVFcnJvcmNhY2hlZER1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3JjYWNoZWRGYWxsVGhyb3VnaEVycm9yY2FjaGVkTmF0aXZlQW5ub3RhdGlvbmNhY2hlZE5hdGl2ZUV4dGVuc2lvbkFubm90YXRpb25nZXRDb25zdHJ1Y3RvckFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3JfQ29tcGlsZVRpbWVFcnJvcmJ5cGFzc0xpYnJhcnlQcml2YWN5X0R1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3JFeHRlcm5hbE5hbWVtZXNzYWdlQ29udGV4dHByb2Nlc3NlZE9wdGlvbnNmYXN0YS5kaWxsX2xpYnJhcnlfYnVpbGRlckR5bmFtaWNUeXBlQnVpbGRlclNjb3BlRGlsbENsYXNzQnVpbGRlckRpbGxUeXBlQWxpYXNCdWlsZGVyTGF6eUxpYnJhcnlTY29wZWxpYnJhcnlCdWlsZGVydG9wTm8gbGlicmFyeSBidWlsZGVyLnVuc2VyaWFsaXphYmxlRXhwb3J0c2V4cG9ydHNBbHJlYWR5RmluYWxpemVkaXNSZWFkeVRvQnVpbGRpc1JlYWR5VG9GaW5hbGl6ZUV4cG9ydHNpc0J1aWx0bGF6eVNjb3BlbGF6eUV4cG9ydFNjb3BlTm90IHJlYWR5IHRvIGJ1aWxkLk5vdCByZWFkeSB0byBmaW5hbGl6ZSBleHBvcnRzLmFkZFN5bnRoZXRpY0RlY2xhcmF0aW9uT2ZEeW5hbWljYWRkQnVpbGRlcmNsYXNzQnVsZGVyX2V4cG9ydHMjYWRkU2V0dGVyZXhwb3J0U2NvcGVCdWlsZGVyYWRkVG9TY29wZWNvbXB1dGVBbWJpZ3VvdXNEZWNsYXJhdGlvbjxsaWJyYXJ5ICcnPm1hcmtBc1JlYWR5VG9CdWlsZG1hcmtBc1JlYWR5VG9GaW5hbGl6ZUV4cG9ydHNtZXNzYWdlVGV4dE5vIGJ1aWxkZXIgZm9yICdFeHBvcnRlZCBlbGVtZW50ICcnIG5vdCBmb3VuZCBpbiAnZmFzdGEuZGlsbF9sb2FkZXJUeXBlQnVpbGRlckNvbXB1dGVyY29tcG9uZW50TGlicmFyaWVzcmVxdWVzdGVkTGlicmFyaWVzYnVpbGRlci5saWJyYXJ5a2VybmVsTGlicmFyeWtlcm5lbC5jbG9uZXN3aXRjaENhc2VzY2xvbmVBbm5vdGF0aW9uc19hY3RpdmVGaWxlVXJpZW5zdXJlTXV0YWJsZUNsb25pbmcgb2YgbGlicmFyaWVzIGlzIG5vdCBpbXBsZW1lbnRlZENsb25pbmcgb2YgY2xhc3NlcyBpcyBub3QgaW1wbGVtZW50ZWRfY2xvbmVGaWxlT2Zmc2V0YWN0aXZlRmlsZVVyaVNhdmVkY2xvbmVPcHRpb25hbHZpc2l0T3B0aW9uYWxUeXBlbmV3VmFyaWFibGVzd2l0Y2hDYXNlbmV3RXhjZXB0aW9ubmV3U3RhY2tUcmFjZWNsb25lRnVuY3Rpb25Ob2RlQm9keXNhdmVkQ2xvbmVBbm5vdGF0aW9uc1VuaW1wbGVtZW50ZWQgY2xvbmUgZm9yIEtlcm5lbCBleHByZXNzaW9uOiBVbmltcGxlbWVudGVkIGNsb25lIGZvciBLZXJuZWwgaW5pdGlhbGl6ZXI6IFVuaW1wbGVtZW50ZWQgY2xvbmUgZm9yIEtlcm5lbCBtZW1iZXI6IFVuaW1wbGVtZW50ZWQgY2xvbmUgZm9yIEtlcm5lbCBzdGF0ZW1lbnQ6IENsb25pbmcgS2VybmVsIG5vbi1tZW1iZXJzIGlzIG5vdCBzdXBwb3J0ZWQuICBUcmllZCBjbG9uaW5nIENsb25lV2l0aG91dEJvZHlmYXN0YS5kaWxsX21lbWJlcl9idWlsZGVyTWVtYmVyQnVpbGRlcmFic3RyYWN0TWFza2V4dGVybmFsTWFza3N0YXRpY01hc2tpc1JlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0cnVjdG9yY29tcHV0ZU1vZGlmaWVyc21vZGlmaWVyZmFzdGEuc2NvcGVOYW1lSXRlcmF0b3JUeXBlVmFyaWFibGVCdWlsZGVyTXV0YWJsZVNjb3BlY2xhc3NOYW1lT3JEZWJ1Z05hbWVTY29wZShmb3J3YXJkRGVjbGFyZWRMYWJlbHNpbW11dGFibGVuZXN0ZWRuYW1lSXRlcmF0b3Jjb3B5V2l0aFBhcmVudGxvY2FsPXNldHRlcnM9cGFyZW50PWJlY29tZVBhcnRPZndpdGhUeXBlVmFyaWFibGVzbmV3U2NvcGV0eXBlIHZhcmlhYmxlc3JlY29yZFVzZWxvb2t1cEluaXNJbnN0YW5jZVNjb3BlbWVyZ2VtZXJnZU1lbWJlcm5lc3RpbmdMZXZlbHdyaXRlT25pbmRlbnRjb21wdXRlTWl4aW5TY29wZW5lZWRzQ29weVNjb3BlQnVpbGRlckFjY2Vzc0Vycm9yQnVpbGRlclNjb3BlTG9jYWxEZWNsYXJhdGlvbkl0ZXJhdG9yU2NvcGVMb2NhbERlY2xhcmF0aW9uTmFtZUl0ZXJhdG9ybG9jYWxOYW1lc3NldHRlck5hbWVzZmFzdGEuc291cmNlX2NsYXNzX2J1aWxkZXJDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXJGdW5jdGlvbkJ1aWxkZXJNZXRhZGF0YUJ1aWxkZXJWYXJpYW5jZWNvbXB1dGVWYXJpYW5jZWFjdHVhbENsc2NvbnN0cnVjdG9yUmVmZXJlbmNlc29uVHlwZXNzdGFydENoYXJPZmZzZXRjaGFyRW5kT2Zmc2V0YnVpbGRCdWlsZGVyc2NoZWNrU3VwZXJ0eXBlYnVpbGRTdXBlcnR5cGVjb25zdHJ1Y3RvclNjb3BlQnVpbGRlcnZhcmlhbmNlbWVtYmVyQnVpbGRlcmZpbmlzaFBhdGNoY29tcHV0ZURpcmVjdFN1cGVydHlwZXNpbml0aWFsaXplQ2xhc3NmYXN0YS5zb3VyY2VfbG9hZGVySW5zdHJ1bWVudGF0aW9uRXhwb3J0SW1wb3J0U2hhZG93VHlwZUluZmVyZW5jZUVuZ2luZUVudW1CdWlsZGVyRmllbGRCdWlsZGVyQ29sbGVjdGlvblRyYW5zZm9ybWVyU2V0TGl0ZXJhbFRyYW5zZm9ybWVyQ2xhc3NNZW1iZXJQYXJzZXJEaWV0TGlzdGVuZXJEaWV0UGFyc2VyT3V0bGluZUJ1aWxkZXJpbnN0cnVtZW50YXRpb25jb2xsZWN0aW9uVHJhbnNmb3JtZXJzZXRMaXRlcmFsVHJhbnNmb3JtZXJzdXBwcmVzc0xleGljYWxFcnJvcnNhZGRQcm9ibGVtQXRBY2Nlc3NvcnNzeW50aGVzaXplU291cmNlRm9yTWlzc2luZ0ZpbGVoYXNTY2hlbWVvcmctZGFydGxhbmctbWFsZm9ybWVkLXVyaXplcm9UZXJtaW5hdGVkQnl0ZXNyYXdCeXRlc3NldExhbmd1YWdlVmVyc2lvbmdldFNvdXJjZW5ld1BhdGhTZWdtZW50cy1wYXRjaGltcG9ydCAnZGFydDpfaW50ZXJuYWwnOwppbXBvcnQgJ2RhcnQ6YXN5bmMnOwoKZXhwb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZSwgU3RyZWFtOwoKcHJpbnQob2JqZWN0KSB7fQoKY2xhc3MgSXRlcmF0b3Ige30KCmNsYXNzIEl0ZXJhYmxlIHt9CgpjbGFzcyBMaXN0IGV4dGVuZHMgSXRlcmFibGUgewogIGZhY3RvcnkgTGlzdC51bm1vZGlmaWFibGUoZWxlbWVudHMpID0+IG51bGw7Cn0KCmNsYXNzIE1hcCBleHRlbmRzIEl0ZXJhYmxlIHsKICBmYWN0b3J5IE1hcC51bm1vZGlmaWFibGUob3RoZXIpID0+IG51bGw7Cn0KCmNsYXNzIE5vU3VjaE1ldGhvZEVycm9yIHsKICBOb1N1Y2hNZXRob2RFcnJvci53aXRoSW52b2NhdGlvbihyZWNlaXZlciwgaW52b2NhdGlvbik7Cn0KCmNsYXNzIE51bGwge30KCmNsYXNzIE9iamVjdCB7CiAgbm9TdWNoTWV0aG9kKGludm9jYXRpb24pID0+IG51bGw7Cn0KCmNsYXNzIFN0cmluZyB7fQoKY2xhc3MgU3ltYm9sIHt9CgpjbGFzcyBTZXQge30KCmNsYXNzIFR5cGUge30KCmNsYXNzIF9JbnZvY2F0aW9uTWlycm9yIHsKICBfSW52b2NhdGlvbk1pcnJvci5fd2l0aFR5cGUoX21lbWJlck5hbWUsIF90eXBlLCBfdHlwZUFyZ3VtZW50cywKICAgICAgX3Bvc2l0aW9uYWxBcmd1bWVudHMsIF9uYW1lZEFyZ3VtZW50cyk7Cn0KCmNsYXNzIGJvb2wge30KCmNsYXNzIGRvdWJsZSBleHRlbmRzIG51bSB7fQoKY2xhc3MgaW50IGV4dGVuZHMgbnVtIHt9CgpjbGFzcyBudW0ge30KCmNsYXNzIF9TeW5jSXRlcmFibGUge30KCmNsYXNzIF9TeW5jSXRlcmF0b3IgewogIHZhciBfY3VycmVudDsKICB2YXIgX3lpZWxkRWFjaEl0ZXJhYmxlOwp9CgpjbGFzcyBGdW5jdGlvbiB7fQpfYXN5bmNFcnJvcldyYXBwZXJIZWxwZXIoY29udGludWF0aW9uKSB7fQoKX2FzeW5jU3RhY2tUcmFjZUhlbHBlcihhc3luY19vcCkge30KCl9hc3luY1RoZW5XcmFwcGVySGVscGVyKGNvbnRpbnVhdGlvbikge30KCl9hd2FpdEhlbHBlcihvYmplY3QsIHRoZW5DYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgYXdhaXRlcikge30KCl9jb21wbGV0ZU9uQXN5bmNSZXR1cm4oY29tcGxldGVyLCB2YWx1ZSkge30KCmNsYXNzIF9Bc3luY1N0YXJTdHJlYW1Db250cm9sbGVyIHsKICBhZGQoZXZlbnQpIHt9CgogIGFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKSB7fQoKICBhZGRTdHJlYW0oc3RyZWFtKSB7fQoKICBjbG9zZSgpIHt9CgogIGdldCBzdHJlYW0gPT4gbnVsbDsKfQoKY2xhc3MgQ29tcGxldGVyIHsKICBmYWN0b3J5IENvbXBsZXRlci5zeW5jKCkgPT4gbnVsbDsKCiAgZ2V0IGZ1dHVyZTsKCiAgY29tcGxldGUoW3ZhbHVlXSk7CgogIGNvbXBsZXRlRXJyb3IoZXJyb3IsIFtzdGFja1RyYWNlXSk7Cn0KCmNsYXNzIEZ1dHVyZSB7CiAgZmFjdG9yeSBGdXR1cmUubWljcm90YXNrKGNvbXB1dGF0aW9uKSA9PiBudWxsOwp9CgpjbGFzcyBGdXR1cmVPciB7Cn0KCmNsYXNzIF9Bc3luY0F3YWl0Q29tcGxldGVyIGltcGxlbWVudHMgQ29tcGxldGVyIHsKICBnZXQgZnV0dXJlID0+IG51bGw7CgogIGNvbXBsZXRlKFt2YWx1ZV0pIHt9CgogIGNvbXBsZXRlRXJyb3IoZXJyb3IsIFtzdGFja1RyYWNlXSkge30KfQoKY2xhc3MgU3RyZWFtIHt9CgpjbGFzcyBfU3RyZWFtSXRlcmF0b3IgewogIGdldCBjdXJyZW50ID0+IG51bGw7CgogIG1vdmVOZXh0KCkge30KCiAgY2FuY2VsKCkge30KfQpjbGFzcyBfVW5tb2RpZmlhYmxlU2V0IHsKICBmaW5hbCBNYXAgX21hcDsKICBjb25zdCBfVW5tb2RpZmlhYmxlU2V0KHRoaXMuX21hcCk7Cn0KY2xhc3MgU3ltYm9sIHsKICBjb25zdCBTeW1ib2woU3RyaW5nIG5hbWUpOwp9Ci8qIG9mZnNldEluQnl0ZXNsaXN0ZW5lcnBhcnNlVW5pdGNyZWF0ZURpZXRMaXN0ZW5lcnBhcnRPZkxpYnJhcnlkaWV0TGlzdGVuZXJkZWJ1Z0V4cHJlc3Npb24gaW4gZGVidWdFeHByY3JlYXRlTGlzdGVuZXJ1c2VkUGFydHNpbmNsdWRlUGFydHN2YWxpZGF0ZVBhcnRSZXNvbHZlZCBwYXJ0c2FwcGx5UGF0Y2hlc0FwcGxpZWQgcGF0Y2hlc2V4cG9ydGVyc2V4cG9ydGVlc3NvdXJjZUxpYnJhcnlidWlsZEluaXRpYWxTY29wZXNleHBvcnRlcmJvdGhleHBvcnRlZGFkZFRvRXhwb3J0U2NvcGV3YXNDaGFuZ2VkZXhwb3J0ZWVDb21wdXRlZCBsaWJyYXJ5IHNjb3Blc2RlYnVnUHJpbnRFeHBvcnRzZXhwb3J0cyBleHBvcnRzIHR5cGVDb3VudCB0eXBlc2Zvcm1hbENvdW50RmluYWxpemVkICBpbml0aWFsaXppbmcgZm9ybWFsc0ZpbmlzaGVkIGRlZmVycmVkIGxvYWQgdGVhcm9mZnMgZmluaXNoRm9yd2FyZGVyc0ZpbmlzaGVkIGZvcndhcmRlcnMgZm9yICBwcm9jZWR1cmVzIGNvbnN0cnVjdG9ycyB0eXBlLXZhcmlhYmxlIGJvdW5kc0NvbXB1dGVkIGRlZmF1bHQgdHlwZXMgZm9yICB0eXBlIHZhcmlhYmxlc0ZpbmlzaGVkICBuYXRpdmUgbWV0aG9kcyBwYXRjaCBtZXRob2RzY2hlY2tPYmplY3RDbGFzc0hpZXJhcmNoeWhhbmRsZUhpZXJhcmNoeUN5Y2xlc2JsYWNrTGlzdGVkQ2xhc3Nlc3RvcG9sb2dpY2FsbHlTb3J0ZWRDbGFzc2VzcHJldmlvdXNXb3JrTGlzdGRpcmVjdFN1cGVydHlwZXNhbGxTdXBlcnR5cGVzUHJvY2Vzc2VkY2hlY2tDbGFzc1N1cGVydHlwZXNjbGFzc2VzV2l0aEN5Y2xlc0NoZWNrZWQgY2xhc3MgaGllcmFyY2h5aXNDbGFzc0J1aWxkZXJjb25zdHJ1Y3RvcnluYW1lVG9FeHBvcnRzZXJyb3JFeHBvcnRzbmFtZVRvSW1wb3J0c2Vycm9ySW1wb3J0c0NoZWNrZWQgaW1wb3J0cyBhbmQgZXhwb3J0cyBmb3IgZHVwbGljYXRlIG5hbWVzQnVpbHQgY29tcG9uZW50Y29tcHV0ZUZ1bGxDb21wb25lbnRhbWJpZ3VvdXNUeXBlc1JlY29yZHNyZWNvcmRoYW5kbGVBbWJpZ3VvdXNTdXBlcnR5cGVzQ29tcHV0ZWQgY2xhc3MgaGllcmFyY2h5aWdub3JlQW1iaWd1b3VzU3VwZXJ0eXBlc0NvbXB1dGVkIGNvcmUgdHlwZXNzb3VyY2VDbGFzc2VzQ2hlY2tlZCBzdXBlcnR5cGVzY2hlY2tCb3VuZHNJbk91dGxpbmVDaGVja2VkIHR5cGUgYXJndW1lbnRzIG9mIHN1cGVycyBhZ2FpbnN0IHRoZSBib3VuZHNvdmVycmlkZUNoZWNrc0NoZWNrZWQgIG92ZXJyaWRlc2ZpbmlzaFRvcExldmVsSW5pdGlhbGl6aW5nRm9ybWFsc0ZpbmlzaGVkIGluaXRpYWxpemluZyBmb3JtYWxzZGVsYXllZE1lbWJlckNoZWNrc2NoYW5nZWRDbGFzc2VzQ29tcHV0ZWQgIGNvbWJpbmVkIG1lbWJlciBzaWduYXR1cmVzVXBkYXRlZCAgY2xhc3NlcyBpbiBrZXJuZWwgaGllcmFyY2h5Q2hlY2tlZCByZWRpcmVjdGluZyBmYWN0b3JpZXNBZGRlZCBub1N1Y2hNZXRob2QgZm9yd2FyZGVyc2NoZWNrTWl4aW5EZWNsYXJhdGlvbmNoZWNrTWl4aW5BcHBsaWNhdGlvbkNoZWNrZWQgbWl4aW4gZGVjbGFyYXRpb24gYXBwbGljYXRpb25zaGllcmFyY2h5QnVpbGRlckJ1aWx0IGNsYXNzIGhpZXJhcmNoeXByZXBhcmVUb3BMZXZlbGFsbEltcGxpY2l0bHlUeXBlZEZpZWxkc2ltcGxpY2l0bHlUeXBlZEZpZWxkc3Rha2VJbXBsaWNpdGx5VHlwZWRGaWVsZHNpbmZlclR5cGVpc1R5cGVJbmZlcmVuY2VQcmVwYXJlZFBlcmZvcm1lZCB0b3AgbGV2ZWwgaW5mZXJlbmNldHJhbnNmb3JtQ29uc3R0cmFuc2Zvcm1lckFtYmlndW91c1R5cGVzUmVjb3JkZGVmYXVsdERhcnRDb3JlU291cmNlZGVmYXVsdERhcnRBc3luY1NvdXJjZWRlZmF1bHREYXJ0Q29sbGVjdGlvblNvdXJjZWRlZmF1bHREYXJ0SW50ZXJuYWxTb3VyY2VmYXN0YS5jb25zdGFudF9ldmFsdWF0b3Jjb25zdGFudF9jb2xsZWN0aW9uX2J1aWxkZXJzLmRhcnRKYXZhU2NyaXB0SW50Q29uc3RhbnRiaWdJbnRWYWx1ZWZyb21Eb3VibGVmcm9tQmlnSW50dG9Eb3VibGVmcm9tVUludDY0dG9VbnNpZ25lZENvbnN0YW50c1RyYW5zZm9ybWVyY29uc3RhbnRFdmFsdWF0b3JrZWVwRmllbGRza2VlcFZhcmlhYmxlc2V2YWx1YXRlQW5ub3RhdGlvbnNlcnJvclJlcG9ydGVyY29udmVydExpYnJhcnl0cmFuc2Zvcm1Bbm5vdGF0aW9uc3dpdGhOZXdFbnZpcm9ubWVudHRyYW5zZm9ybUV4cHJlc3Npb25zZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dHBvc2l0aW9uYWxQYXJhbWV0ZXJDb3VudGV2YWx1YXRlV2l0aENvbnRleHRhZGRWYXJpYWJsZVZhbHVlbWFrZUNvbnN0YW50RXhwcmVzc2lvbnNob3VsZElubGluZXRyZWVDb250ZXh0cnVuSW5zaWRlQ29udGV4dENvbnN0YW50RXZhbHVhdG9ydW5tb2RpZmlhYmxlU2V0TWFwaXNJbnN0YW50aWF0ZWRjYW5vbmljYWxpemF0aW9uQ2FjaGVub2RlQ2FjaGVwcmltaXRpdmVFcXVhbENhY2hlbnVsbENvbnN0YW50dHJ1ZUNvbnN0YW50ZmFsc2VDb25zdGFudGNvbnRleHRDaGFpbmluc3RhbmNlQnVpbGRlcnJlcGxhY2VtZW50Tm9kZXNsb3dlcmVkc2VlblVuZXZhbHVhdGVkQ2hpbGRsYXp5RGVwdGhwdWJsaWNJZGVudGlmaWVyUmVnRXhwXlthLXpBLVokXVthLXpBLVowLTlfJF0qJG5vblVzYWJsZUtleXdvcmRzTm8gJ2Vudmlyb25tZW50RGVmaW5lcycgcGFzc2VkIHRvIHRoZSBjb25zdGFudCBldmFsdWF0b3IgYnV0IHRoZSBDb25zdGFudHNCYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgdW5ldmFsdWF0ZWQgY29uc3RhbnRzLl9Vbm1vZGlmaWFibGVTZXRfbWFwc2hvdWxkQmVVbmV2YWx1YXRlZHRhcmdldGluZ0phdmFTY3JpcHRnZXRGaWxlT2Zmc2V0X2V2YWx1YXRlU3ViZXhwcmVzc2lvbmNvbnRleHRNZXNzYWdlc2ludmFsaWRyZXBvcnRJbnZhbGlkRXhwcmVzc2lvbnJlcG9ydEludmFsaWR1bmV2YWx1YXRlZGV4dHJhY3RlbnRlckxhenlsZWF2ZUxhenl1bmxvd2Vyd2FzVW5ldmFsdWF0ZWRfZXZhbHVhdGVOdWxsYWJsZVN1YmV4cHJlc3Npb25mdW5wdXNoQ29udGV4dHBvcENvbnRleHRydW5JbnNpZGVDb250ZXh0SWZOb0NvbnRleHRjb250ZXh0Tm9kZUNvbnN0YW50IGV2YWx1YXRpb24gaGFzIG5vIHN1cHBvcnQgZm9yIG1ha2VCb29sQ29uc3RhbnRtYWtlRG91YmxlQ29uc3RhbnRldmFsdWF0ZURhcnRUeXBlaXNGaW5pdGV0cnVuY2F0ZVRvRG91YmxlYWRkU3ByZWFkc2V0X2tsYXNzaXNTeW1ib2xOb24tY29uc3QgY29uc3RydWN0b3IgaW52b2NhdGlvbi5Db25zdHJ1Y3RvciAiIiBoYXMgbm9uLXRyaXZpYWwgYm9keSAiIGJlbG9uZ3MgdG8gYWJzdHJhY3QgY2xhc3MgInBvc2l0aW9uYWxzZXZhbHVhdGVQb3NpdGlvbmFsQXJndW1lbnRzZXZhbHVhdGVOYW1lZEFyZ3VtZW50c3VuZXZhbHVhdGVkQXJndW1lbnRzbmFtZVZhbHVlaXNWYWxpZFN5bWJvbE5hbWVldmFsdWF0ZVR5cGVBcmd1bWVudHN3aXRoTmV3SW5zdGFuY2VCdWlsZGVyaGFuZGxlQ29uc3RydWN0b3JJbnZvY2F0aW9uYnVpbGRVbmV2YWx1YXRlZEluc3RhbmNlYnVpbGRJbnN0YW5jZWNoZWNrQXNzZXJ0c2V0RmllbGRWYWx1ZWlzVmFsaWRQdWJsaWNJZGVudGlmaWVyaGFzTWF0Y2hwb3NpdGlvbmFsQXJndW1lbnRzbmFtZWRBcmd1bWVudHNhZGRUeXBlUGFyYW1ldGVyVmFsdWVpbml0ZXZhbHVhdGVTdXBlclR5cGVBcmd1bWVudHNObyBzdXBwb3J0IGZvciBoYW5kbGluZyBpbml0aWFsaXplciBvZiB0eXBlIHVuZXZhbHVhdGVkVW5yZWFkQ29uc3RhbnRzaXNaZXJvb3BvdGhlclZhbHVldG9JbnRldmFsdWF0ZUJpbmFyeUJpdE9wZXJhdGlvbm5lZ2F0aXZlaXNOZWdhdGl2ZWV2YWx1YXRlQmluYXJ5U2hpZnRPcGVyYXRpb25uZWdhdGl2ZVJlY2VpdmVyZXZhbHVhdGVCaW5hcnlOdW1lcmljT3BlcmF0aW9uSW5zdGFuY2UgZmllbGQgYWNjZXNzIG91dHNpZGUgY29uc3RydWN0b3JDb3VsZCBub3QgZXZhbHVhdGUgZmllbGQgZ2V0ICBvbiBpbmNvbXBsZXRlIGluc3RhbmNlbG9va3VwVmFyaWFibGVWYXJpYWJsZSBnZXQgb2YgYSBub24tY29uc3QgdmFyaWFibGUuTm8gc3VwcG9ydCBmb3IgIGluIGEgc3RhdGljLWdldC5jb25jYXRlbmF0ZWRib29sQ29uc3RhbnRpbnRWYWx1ZWVuc3VyZUlzU3VidHlwZWlzU3VidHlwZWxpYnJhcnlPZmV2YWx1YXRlRGFydFR5cGVzVGhlIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cyBzdXBwbGllZCBpbiB0aGUgcGFydGlhbCBpbnN0YW50aWF0aW9uIGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgb2YgdGhlIE9ubHkgdGVhci1vZmYgY29uc3RhbnRzIGNhbiBiZSBwYXJ0aWFsbHkgaW5zdGFudGlhdGVkLmhhc1ByaW1pdGl2ZUVxdWFsY2xhc3NIYXNQcmltaXRpdmVFcXVhbGNhY2hlZGNvbnN0YW50VHlwZXBhaXJwb3NpdGlvbmFsQXJnc25hbWVkQXJnc29sZEVudjIxNDc0ODM2NDh0b1NpZ25lZFVuZXhwZWN0ZWQgYmluYXJ5IG51bWVyaWMgb3BlcmF0aW9uICdJbnN0YW5jZUJ1aWxkZXJldmFsdWF0b3JFdmFsdWF0aW9uRW52aXJvbm1lbnRfdHlwZVZhcmlhYmxlc192YXJpYWJsZXNfdW5yZWFkVW5ldmFsdWF0ZWRWYXJpYWJsZXNsb29rdXBQYXJhbWV0ZXJWYWx1ZV9BYm9ydER1ZVRvRXJyb3JfQWJvcnREdWVUb0ludmFsaWRFeHByZXNzaW9uRXJyb3JSZXBvcnRlclNpbXBsZUVycm9yUmVwb3J0ZXJfcmVwb3J0IENvbnN0YW50IGV2YWx1YXRpb24gZXJyb3I6IElzSW5zdGFudGlhdGVkVmlzaXRvcl9hdmFpbGFibGVWYXJpYWJsZXNBIHZpc2l0b3IgbWV0aG9kIHNlZW1zIHRvIGJlIHVuaW1wbGVtZW50ZWQhX0xpc3RPclNldENvbnN0YW50QnVpbGRlcm1ha2VMaXRlcmFsYWRkQ29uc3RhbnRzcHJlYWRFeHByZXNzaW9uc3ByZWFkTGlzdENvbnN0YW50QnVpbGRlcmxhc3RQYXJ0Tm9uLWNvbnN0YW50IGluIGNvbnN0YW50IGxpc3RTZXRDb25zdGFudEJ1aWxkZXJzZWVuTm9uLWNvbnN0YW50IGluIGNvbnN0YW50IHNldE1hcENvbnN0YW50QnVpbGRlcnNlZW5LZXlza2V5Q29udGV4dHZhbHVlQ29udGV4dE5vbi1jb25zdGFudCBpbiBjb25zdGFudCBtYXB0cmFuc2Zvcm1Db21wb25lbnRjb25zdGFudHNUcmFuc2Zvcm1lcl9pc0Zvcm1hbFBhcmFtZXRlcmZhc3RhLmtlcm5lbF9jb25zdGFudHNzZXRDb25zdHJ1Y3Rvck5hbWVPZmZzZXRzZXREb2N1bWVudGF0aW9uQ29tbWVudHByZWRpY2F0ZWV4Y2x1ZGVVcmlUb1NvdXJjZWxpYnJhcmllc1RvV3JpdGVrZXJuZWwuY2hlY2tzVmVyaWZpY2F0aW9uRXJyb3I6IFZlcmlmaWNhdGlvbiBlcnJvcjpWZXJpZmljYXRpb24gZXJyb3I6IENvbnRleHQ6ICcnLgpOb2RlOiAnVHlwZWRlZlN0YXRlVHlwZWRlZlN0YXRlLkRvbmVUeXBlZGVmU3RhdGUuQmVpbmdDaGVja2VkRG9uZUJlaW5nQ2hlY2tlZHR5cGVQYXJhbWV0ZXJzSW5TY29wZXR5cGVkZWZTdGF0ZWNsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlY3VycmVudE1lbWJlcmN1cnJlbnRQYXJlbnRlbnRlclBhcmVudEluY29ycmVjdCBwYXJlbnQgcG9pbnRlciBvbiAgZXhwZWN0ZWQgJycsIGJ1dCBmb3VuZDogJ29sZFBhcmVudGV4aXRQYXJlbnR1bmRlY2xhcmVWYXJpYWJsZXZpc2l0V2l0aExvY2FsU2NvcGVkZWNsYXJlTWVtYmVyTWVtYmVyICcnIGhhcyBiZWVuIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLnVuZGVjbGFyZU1lbWJlclZhcmlhYmxlICcnIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLmRlY2xhcmVUeXBlUGFyYW1ldGVyc01pc3NpbmcgYm91bmQgZm9yIHR5cGUgcGFyYW1ldGVyICdUeXBlIHBhcmFtZXRlciAnJyByZWRlY2xhcmVkLnVuZGVjbGFyZVR5cGVQYXJhbWV0ZXJzY2hlY2tWYXJpYWJsZUluU2NvcGUnIHVzZWQgb3V0IG9mIHNjb3BlLlR5cGVkZWYgJ2NoZWNrVHlwZWRlZicgcmVmZXJzIHRvIGl0c2VsZnNhdmVkVHlwZVBhcmFtZXRlcnNzYXZlZFBhcmVudFRoZSB0b3AtbGV2ZWwgZmllbGQgJycgc2hvdWxkIGJlIHN0YXRpY1RoZSBjb25zdCBmaWVsZCAnc2F2ZWRJbkNhdGNoQmxvY2tOYW1lZCBwYXJhbWV0ZXJzIGFyZSBub3Qgc29ydGVkIG9uIGZ1bmN0aW9uIHR5cGUgKFJldGhyb3cgbXVzdCBiZSBpbnNpZGUgYSBDYXRjaCBibG9jay5WYXJpYWJsZURlY2xhcmF0aW9uIG11c3QgYmUgYSBkaXJlY3QgY2hpbGQgb2YgYSBCbG9jaywgbm90IFN0YXRpY0dldCB3aXRob3V0IHRhcmdldC5TdGF0aWNHZXQgb2YgJycgd2l0aG91dCBnZXR0ZXIuJyB0aGF0J3MgYW4gaW5zdGFuY2UgbWVtYmVyLlN0YXRpY1NldCB3aXRob3V0IHRhcmdldC5TdGF0aWNTZXQgdG8gJycgd2l0aG91dCBzZXR0ZXIuY2hlY2tUYXJnZXRlZEludm9jYXRpb25TdGF0aWNJbnZvY2F0aW9uIG9mICdDb25zdGFudCBTdGF0aWNJbnZvY2F0aW9uIG9mICcnIHRoYXQgaXNuJ3QgYSBjb25zdCBleHRlcm5hbCBmYWN0b3J5LiB3aXRob3V0IHRhcmdldC4gd2l0aG91dCBmdW5jdGlvbi4gd2l0aCBpbmNvbXBhdGlibGUgYXJndW1lbnRzIGZvciAnZXhwZWN0ZWRUeXBlUGFyYW1ldGVycyB3aXRoIHdyb25nIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cyBmb3IgJ0RpcmVjdFByb3BlcnR5R2V0IHdpdGhvdXQgdGFyZ2V0LkRpcmVjdFByb3BlcnR5R2V0IG9mICcnIHRoYXQgaXNuJ3QgYW4gaW5zdGFuY2UgbWVtYmVyLkRpcmVjdFByb3BlcnR5U2V0IHdpdGhvdXQgdGFyZ2V0LkRpcmVjdFByb3BlcnR5U2V0IG9mICcnIHRoYXQgaXMgc3RhdGljLkRpcmVjdE1ldGhvZEludm9jYXRpb24gd2l0aG91dCByZWNlaXZlci5Db25zdHJ1Y3Rvckludm9jYXRpb24gb2YgYWJzdHJhY3QgY2xhc3MuQ29uc3RhbnQgQ29uc3RydWN0b3JJbnZvY2F0aW9uIGZvICcnIHRoYXQgaXNuJ3QgY29uc3QuTm8gdGFyZ2V0LlRhcmdldCBoYXMgbm8gcGFyZW50LlN3aXRjaCBjYXNlIGlzbid0IGNoaWxkIG9mIHBhcmVudC5EYW5nbGluZyByZWZlcmVuY2UgdG8gJycsIHBhcmVudCBpczogJycgcmVmZXJlbmNlZCBvdXQgb2Ygc2NvcGUsIHBhcmVudCBpczogJycgcmVmZXJlbmNlZCBmcm9tIHN0YXRpYyBjb250ZXh0LCBwYXJlbnQgaXM6ICdUeXBlICBwcm92aWRlcyAgdHlwZSBhcmd1bWVudHMgYnV0IHRoZSBjbGFzcyBkZWNsYXJlcyBwYXJhbWV0ZXJzLlRoZSB0eXBlZGVmIHR5cGUgIHR5cGUgYXJndW1lbnRzIGJ1dCB0aGUgdHlwZWRlZiBkZWNsYXJlc0NoZWNrUGFyZW50UG9pbnRlcnNQYXJlbnQgcG9pbnRlciBvbiAnaXMgJ2J1dCBzaG91bGQgYmUgJ2NoZWNrSW5pdGlhbGl6ZXJzVHlwZVNjaGVtYVByaW50ZXJfSXNLbm93blZpc2l0b3JwYXJhbWV0ZXJUeXBlbmFtZWRQYXJhbWV0ZXJUeXBlaXNLbm93bnNjaGVtYXR5cGVTY2hlbWFUb1N0cmluZ0luc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVySW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlQXJnc0luZmVyZW5jZUhlbHBlckluY2x1ZGVzVHlwZVBhcmFtZXRlcnNOb25Db3ZhcmlhbnRseVR5cGVJbmZlcmVuY2VFbmdpbmVFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0VHlwZUluZmVycmVySW1wbFR5cGVQcm9tb3RlckltcGxncmVhdGVzdENsb3N1cmVUeXBlU2NoZW1hRW52aXJvbm1lbnRnZXRQb3NpdGlvbmFsUGFyYW1ldGVyVHlwZUNvbnRyb2xGbG93TWFwRW50cnlGb3JFbGVtZW50Rm9ySW5FbGVtZW50Rm9ySW5NYXBFbnRyeUZvck1hcEVudHJ5SWZFbGVtZW50SWZNYXBFbnRyeWNvbnZlcnRUb0VsZW1lbnRtYWtlTGV0aW5mZXJlbmNlX3Zpc2l0b3IuZGFydGluZmVycmVkX3R5cGVfdmlzaXRvci5kYXJ0Q2xhc3NJbmZlcmVuY2VJbmZvbmVlZHNDaGVja1Zpc2l0b3JnZXR0ZXJzQW5kTWV0aG9kc0FyZ3VtZW50c0p1ZGdtZW50X2hhc0V4cGxpY2l0VHlwZUFyZ3VtZW50c3Bvc2l0aW9uYWxKdWRnbWVudHNzZXROb25JbmZlcnJhYmxlQXJndW1lbnRUeXBlc3JlbW92ZU5vbkluZmVycmFibGVBcmd1bWVudFR5cGVzQXNzZXJ0SW5pdGlhbGl6ZXJKdWRnbWVudGp1ZGdtZW50YWNjZXB0SW5mZXJlbmNldmlzaXRBc3NlcnRJbml0aWFsaXplckp1ZGdtZW50QXNzZXJ0U3RhdGVtZW50SnVkZ21lbnRjb25kaXRpb25KdWRnbWVudG1lc3NhZ2VKdWRnbWVudHZpc2l0QXNzZXJ0U3RhdGVtZW50SnVkZ21lbnRCbG9ja0p1ZGdtZW50anVkZ21lbnRzdmlzaXRCbG9ja0p1ZGdtZW50Q2FzY2FkZUp1ZGdtZW50bmV4dENhc2NhZGV0YXJnZXRKdWRnbWVudGNhc2NhZGVKdWRnbWVudHNzZWN0aW9ubmV3Q2FzY2FkZXR5cGVDb250ZXh0dmlzaXRDYXNjYWRlSnVkZ21lbnRDb21wbGV4QXNzaWdubWVudEp1ZGdtZW50Y29tYmluZXJudWxsQXdhcmVDb21iaW5lcmlzUG9zdEluY0RlY2lzUHJlSW5jRGVjX2dldFRvU3RyaW5nUGFydHNkZXN1Z2FyZWQ9cmVhZD1yaHM9d3JpdGU9Y29tYmluZXI9bnVsbEF3YXJlQ29tYmluZXI9aXNQb3N0SW5jRGVjPXRydWVpc1ByZUluY0RlYz10cnVlX2luZmVyUmhzaW5mZXJyZXJyZWFkVHlwZXdyaXRlQ29udGV4dGNvbWJpbmVyTWVtYmVyY29tYmluZWRUeXBlZmluZE1ldGhvZEludm9jYXRpb25NZW1iZXJpbnN0cnVtZW50ZWRpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3JBbmRUeXBlcmhzVHlwZWNvbWJpbmVyVHlwZWdldENhbGxlZUZ1bmN0aW9uVHlwZWdldENhbGxlZVR5cGVpbmZlckV4cHJlc3Npb25leHBlY3RlZFR5cGVlbnN1cmVBc3NpZ25hYmxlY2hlY2tLaW5kcHJlQ2hlY2tJbnZvY2F0aW9uQ29udHJhdmFyaWFuY2VyZXBsYWNlZENvbWJpbmVyaGFuZGxlSW52b2NhdGlvbkNvbnRyYXZhcmlhbmNlcmVwbGFjZWRDb21iaW5lcjJfc3RvcmVMZXRUeXBlaXNWb2lkQWxsb3dlZHJlcGxhY2VkUmhzZXF1YWxzSW52b2NhdGlvbmdldFN0YW5kYXJkVXBwZXJCb3VuZENvbXBsZXhBc3NpZ25tZW50SnVkZ21lbnRXaXRoUmVjZWl2ZXJyZWNlaXZlcj1pc1N1cGVyPXRydWVfaW5mZXJSZWNlaXZlcmNsYXNzSGllcmFyY2h5Q29udGludWVTd2l0Y2hKdWRnbWVudHZpc2l0Q29udGludWVTd2l0Y2hKdWRnbWVudERlZmVycmVkQ2hlY2tKdWRnbWVudHZpc2l0RGVmZXJyZWRDaGVja0p1ZGdtZW50RG9KdWRnbWVudHZpc2l0RG9KdWRnbWVudERvdWJsZUp1ZGdtZW50dmlzaXREb3VibGVKdWRnbWVudEV4cHJlc3Npb25KdWRnbWVudEVtcHR5U3RhdGVtZW50SnVkZ21lbnR2aXNpdEVtcHR5U3RhdGVtZW50SnVkZ21lbnRFeHByZXNzaW9uU3RhdGVtZW50SnVkZ21lbnR2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnRKdWRnbWVudEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudGFyZ3VtZW50SnVkZ21lbnRzdmlzaXRGYWN0b3J5Q29uc3RydWN0b3JJbnZvY2F0aW9uSnVkZ21lbnRTaGFkb3dGaWVsZEluaXRpYWxpemVydmlzaXRTaGFkb3dGaWVsZEluaXRpYWxpemVyRm9ySnVkZ21lbnR1cGRhdGVKdWRnbWVudHN2aXNpdEZvckp1ZGdtZW50RnVuY3Rpb25Ob2RlSnVkZ21lbnRGdW5jdGlvbkRlY2xhcmF0aW9uSnVkZ21lbnRfaGFzSW1wbGljaXRSZXR1cm5UeXBldmFyaWFibGVKdWRnbWVudGZ1bmN0aW9uSnVkZ21lbnR2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb25KdWRnbWVudHNldEhhc0ltcGxpY2l0UmV0dXJuVHlwZUludmFsaWRTdXBlckluaXRpYWxpemVySnVkZ21lbnRhcmd1bWVudHNKdWRnbWVudHZpc2l0SW52YWxpZFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudElmTnVsbEp1ZGdtZW50bGVmdEp1ZGdtZW50cmlnaHRKdWRnbWVudHZpc2l0SWZOdWxsSnVkZ21lbnRJZkp1ZGdtZW50dmlzaXRJZkp1ZGdtZW50SWxsZWdhbEFzc2lnbm1lbnRKdWRnbWVudHZpc2l0SWxsZWdhbEFzc2lnbm1lbnRKdWRnbWVudEluZGV4QXNzaWdubWVudEp1ZGdtZW50X2dldEludm9jYXRpb25Bcmd1bWVudHNpbmRleD12aXNpdEluZGV4QXNzaWdubWVudEp1ZGdtZW50SW5pdGlhbGl6ZXJKdWRnbWVudEludEp1ZGdtZW50YXNEb3VibGVuZWdhdGVkZG91YmxlVmFsdWV2aXNpdEludEp1ZGdtZW50U2hhZG93TGFyZ2VJbnRMaXRlcmFsYXNJbnQ2NHZpc2l0U2hhZG93TGFyZ2VJbnRMaXRlcmFsU2hhZG93SW52YWxpZEluaXRpYWxpemVydmlzaXRTaGFkb3dJbnZhbGlkSW5pdGlhbGl6ZXJTaGFkb3dJbnZhbGlkRmllbGRJbml0aWFsaXplcnZpc2l0U2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXJMaXN0TGl0ZXJhbEp1ZGdtZW50dmlzaXRMaXN0TGl0ZXJhbEp1ZGdtZW50U2V0TGl0ZXJhbEp1ZGdtZW50dmlzaXRTZXRMaXRlcmFsSnVkZ21lbnRNYXBMaXRlcmFsSnVkZ21lbnR2aXNpdE1hcExpdGVyYWxKdWRnbWVudE1ldGhvZEludm9jYXRpb25KdWRnbWVudF9pc0ltcGxpY2l0Q2FsbHZpc2l0TWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50TmFtZWRGdW5jdGlvbkV4cHJlc3Npb25KdWRnbWVudHZpc2l0TmFtZWRGdW5jdGlvbkV4cHJlc3Npb25KdWRnbWVudE51bGxBd2FyZU1ldGhvZEludm9jYXRpb25KdWRnbWVudF9kZXN1Z2FyZWRJbnZvY2F0aW9udmlzaXROdWxsQXdhcmVNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnROdWxsQXdhcmVQcm9wZXJ0eUdldEp1ZGdtZW50X2Rlc3VnYXJlZEdldHJlY2VpdmVySnVkZ21lbnR2aXNpdE51bGxBd2FyZVByb3BlcnR5R2V0SnVkZ21lbnRQcm9wZXJ0eUFzc2lnbm1lbnRKdWRnbWVudG51bGxBd2FyZUd1YXJkbnVsbEF3YXJlR3VhcmQ9X2hhbmRsZVdyaXRlQ29udHJhdmFyaWFuY2VmaW5kUHJvcGVydHlTZXRNZW1iZXJ2aXNpdFByb3BlcnR5QXNzaWdubWVudEp1ZGdtZW50UmVkaXJlY3RpbmdJbml0aWFsaXplckp1ZGdtZW50dmlzaXRSZWRpcmVjdGluZ0luaXRpYWxpemVySnVkZ21lbnRSZXR1cm5KdWRnbWVudHJldHVybktleXdvcmRMZXhlbWV2aXNpdFJldHVybkp1ZGdtZW50U3RhdGVtZW50SnVkZ21lbnRTdGF0aWNBc3NpZ25tZW50SnVkZ21lbnR2aXNpdFN0YXRpY0Fzc2lnbm1lbnRKdWRnbWVudFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudHZpc2l0U3VwZXJJbml0aWFsaXplckp1ZGdtZW50U3VwZXJNZXRob2RJbnZvY2F0aW9uSnVkZ21lbnR2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbkp1ZGdtZW50U3VwZXJQcm9wZXJ0eUdldEp1ZGdtZW50dmlzaXRTdXBlclByb3BlcnR5R2V0SnVkZ21lbnRTd2l0Y2hDYXNlSnVkZ21lbnRleHByZXNzaW9uSnVkZ21lbnRzU3dpdGNoU3RhdGVtZW50SnVkZ21lbnRleHByZXNzaW9uSnVkZ21lbnRjYXNlSnVkZ21lbnRzdmlzaXRTd2l0Y2hTdGF0ZW1lbnRKdWRnbWVudFN5bWJvbExpdGVyYWxKdWRnbWVudHZpc2l0U3ltYm9sTGl0ZXJhbEp1ZGdtZW50SW52YWxpZENvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50dmlzaXRJbnZhbGlkQ29uc3RydWN0b3JJbnZvY2F0aW9uSnVkZ21lbnRJbnZhbGlkV3JpdGVKdWRnbWVudHZpc2l0SW52YWxpZFdyaXRlSnVkZ21lbnR2aXNpdFN5bnRoZXRpY0V4cHJlc3Npb25KdWRnbWVudF9yZXBsYWNlV2l0aERlc3VnYXJlZGRlc3VnYXJlZExldGRlc3VnYXJlZENvbmRpdGlvbmFsRXhwcmVzc2lvbkNhdGNoSnVkZ21lbnRleGNlcHRpb25KdWRnbWVudHN0YWNrVHJhY2VKdWRnbWVudFRyeUNhdGNoSnVkZ21lbnRjYXRjaEp1ZGdtZW50c3Zpc2l0VHJ5Q2F0Y2hKdWRnbWVudFRyeUZpbmFsbHlKdWRnbWVudHZpc2l0VHJ5RmluYWxseUp1ZGdtZW50Y3JlYXRlVG9wTGV2ZWxUeXBlSW5mZXJyZXJTaGFkb3dUeXBlSW5mZXJyZXJwcml2YXRlZW5naW5lZ2V0RmllbGRJbml0aWFsaXplcnR5cGVOZWVkZWRrZXJuZWxJbml0aWFsaXplcmluZmVyU3RhdGVtZW50VHlwZUxpdGVyYWxKdWRnbWVudHZpc2l0VHlwZUxpdGVyYWxKdWRnbWVudFNoYWRvd1R5cGVQcm9tb3RlcmdldFZhcmlhYmxlRnVuY3Rpb25OZXN0aW5nTGV2ZWxfZnVuY3Rpb25OZXN0aW5nTGV2ZWxpc1Byb21vdGlvbkNhbmRpZGF0ZWtlcm5lbFZhcmlhYmxlRGVjbGFyYXRpb25faXNMb2NhbEZ1bmN0aW9uc2FtZUV4cHJlc3Npb25zc2V0VmFyaWFibGVNdXRhdGVkQW55d2hlcmVfbXV0YXRlZEFueXdoZXJlc2V0VmFyaWFibGVNdXRhdGVkSW5DbG9zdXJlX211dGF0ZWRJbkNsb3N1cmV3YXNWYXJpYWJsZU11dGF0ZWRBbnl3aGVyZVZhcmlhYmxlQXNzaWdubWVudEp1ZGdtZW50dmlzaXRWYXJpYWJsZUFzc2lnbm1lbnRKdWRnbWVudF9pbXBsaWNpdGx5VHlwZWRmb3JFZmZlY3Rpbml0aWFsaXplckp1ZGdtZW50dmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uSnVkZ21lbnRpc0ltcGxpY2l0bHlUeXBlZFVucmVzb2x2ZWRUYXJnZXRJbnZvY2F0aW9uSnVkZ21lbnR2aXNpdFVucmVzb2x2ZWRUYXJnZXRJbnZvY2F0aW9uSnVkZ21lbnRVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50SnVkZ21lbnR2aXNpdFVucmVzb2x2ZWRWYXJpYWJsZUFzc2lnbm1lbnRKdWRnbWVudFZhcmlhYmxlR2V0SnVkZ21lbnRfZmFjdF9zY29wZXZpc2l0VmFyaWFibGVHZXRKdWRnbWVudFdoaWxlSnVkZ21lbnR2aXNpdFdoaWxlSnVkZ21lbnRZaWVsZEp1ZGdtZW50dmlzaXRZaWVsZEp1ZGdtZW50TG9hZExpYnJhcnlKdWRnbWVudHZpc2l0TG9hZExpYnJhcnlKdWRnbWVudExvYWRMaWJyYXJ5VGVhck9mZkp1ZGdtZW50dmlzaXRMb2FkTGlicmFyeVRlYXJPZmZKdWRnbWVudF9Db21wbGV4QXNzaWdubWVudEluZmVyZW5jZVJlc3VsdF9VbmZpbmlzaGVkQ2FzY2FkZXdyYXBJbGxlZ2FsQXNzaWdubWVudHdyYXBJbmRleEFzc2lnbm1lbnR3cmFwUHJvcGVydHlBc3NpZ25tZW50d3JhcFN0YXRpY0Fzc2lnbm1lbnR3cmFwVmFyaWFibGVBc3NpZ25tZW50SW5mZXJlbmNlVmlzaXRvcm1hcEVudHJ5Q2xhc3NtYXBFbnRyeU9mZnNldG1hcFNwcmVhZE9mZnNldGl0ZXJhYmxlU3ByZWFkT2Zmc2V0aXRlcmFibGVTcHJlYWRUeXBlaXNFbXB0eUNvbnRleHR3cmFwRnV0dXJlT3JUeXBlc3RvcmVJbmZlcnJlZFR5cGViZWluZ0luZmVycmVkdG9CZUluZmVycmVkaW5mZXJJbml0aWFsaXppbmdGb3JtYWxoYXNFeHBsaWNpdFR5cGVBcmd1bWVudHNpbmZlcmVuY2VSZXN1bHRpbmZlckludm9jYXRpb25pbmZlcnJlZGhhZEV4cGxpY2l0VHlwZUFyZ3VtZW50c2luaXRpYWxpemVyVHlwZWhhbmRsZUZvckluRGVjbGFyaW5nVmFyaWFibGV0eXBlQ2hlY2tzTmVlZGVkaW5mZXJGb3JJbkl0ZXJhYmxldGVtcFZhcnZhcmlhYmxlR2V0aW1wbGljaXREb3duY2FzdHdyYXBUeXBlaW5mZXJyZWRFeHByZXNzaW9uVHlwZXJlc29sdmVUeXBlUGFyYW1ldGVyaGFuZGxlRm9ySW5XaXRob3V0VmFyaWFibGVzeW50aGV0aWNXcml0ZVR5cGV3cml0ZU1lbWJlcmdldFNldHRlclR5cGVoYW5kbGVGb3JJblN0YXRlbWVudFdpdGhvdXRWYXJpYWJsZXVwZGF0ZXZpc2l0RnVuY3Rpb25Ob2RlSnVkZ21lbnRyZXR1cm5Db250ZXh0cmV0dXJuVHlwZUluc3RydW1lbnRhdGlvbk9mZnNldGluZmVyTG9jYWxGdW5jdGlvbmluZmVyTWV0YWRhdGFLZWVwaW5nSGVscGVyc2tpcFR5cGVBcmd1bWVudEluZmVyZW5jZWxoc1R5cGVjYWxsZWVUeXBlZXhwZWN0ZWRJbmRleFR5cGVGb3JXcml0ZWluZGV4Q29udGV4dGluZGV4VHlwZXJlYWRNZW1iZXJjYWxsZWVGdW5jdGlvblR5cGVkZXN1Z2FyZWRJbnZvY2F0aW9ucmVwbGFjZWRSZWFkaXNEb3VibGVDb250ZXh0Z2V0U3ByZWFkRWxlbWVudFR5cGVzcHJlYWRUeXBlaW5mZXJFbGVtZW50aW5mZXJyZWRUeXBlQXJndW1lbnRpbmZlcnJlZFNwcmVhZFR5cGVzaW5mZXJlbmNlTmVlZGVkc3ByZWFkRWxlbWVudFR5cGVpc0Fzc2lnbmFibGVjb25kaXRpb25UeXBldGhlblR5cGVvdGhlcndpc2VUeXBlY2hlY2tFbGVtZW50bGlzdFR5cGVpbmZlcnJlZFR5cGVzZm9ybWFsVHlwZXNhY3R1YWxUeXBlc2luZmVyR2VuZXJpY0Z1bmN0aW9uT3JUeXBldHlwZUFyZ3NzdG9yZVNwcmVhZE1hcEVudHJ5RWxlbWVudFR5cGVzc3ByZWFkTWFwRW50cnlUeXBlaW5mZXJNYXBFbnRyeWluZmVycmVkS2V5VHlwZWluZmVycmVkVmFsdWVUeXBlc3ByZWFkQ29udGV4dGFjdHVhbFR5cGVzRm9yU2V0YWN0dWFsS2V5VHlwZWFjdHVhbFZhbHVlVHlwZWFjdHVhbEVsZW1lbnRUeXBla2V5RXJyb3J2YWx1ZUVycm9yZW50cnlUeXBlaXNNYXBpc0l0ZXJhYmxlYWN0dWFsVHlwZUZvclNldGxlbmd0aEZvclNldGNoZWNrTWFwRW50cnljYWNoZWRLZXljYWNoZWRWYWx1ZW1hcFR5cGV0eXBlQ29udGV4dElzTWFwdHlwZUNvbnRleHRJc0l0ZXJhYmxlc2V0TGl0ZXJhbGNhY2hlZEtleXNjYWNoZWRWYWx1ZXNoYXNNYXBFbnRyeWhhc01hcFNwcmVhZGhhc0l0ZXJhYmxlU3ByZWFkc3ByZWFkVHlwZUNvbnRleHRjYW5CZVNldGNhbkJlTWFwc2V0RWxlbWVudHNmb3JtYWxUeXBlc0ZvclNldHNldFR5cGVpbmZlcnJlZFR5cGVzRm9yU2V0aW5mZXJNZXRob2RJbnZvY2F0aW9ucmVjZWl2ZXJWYXJpYWJsZWluZmVyUHJvcGVydHlHZXRkZXN1Z2FyZWRHZXR2YXJpYWJsZVR5cGVmaW5kUHJvcGVydHlHZXRNZW1iZXJoYW5kbGVQcm9wZXJ0eUdldENvbnRyYXZhcmlhbmNlY2xhc3NUeXBlUGFyYW1ldGVyc2Nsb3N1cmVDb250ZXh0aXNHZW5lcmF0b3JyZXR1cm5PcllpZWxkQ29udGV4dGhhbmRsZVJldHVybmluc3RhbnRpYXRlVGVhck9mZmludGVyZmFjZU1lbWJlcm1ldGhvZE5hbWVwcm9wZXJ0eU5hbWVleHByZXNzaW9uVHlwZWNhc2VFeHByZXNzaW9uY2FzZUV4cHJlc3Npb25UeXBldmlzaXRDYXRjaEp1ZGdtZW50Y2F0Y2hfZGVjbGFyZWRUeXBlaW5mZXJEZWNsYXJhdGlvblR5cGVyZXBsYWNlZEluaXRpYWxpemVybXV0YXRlZEluQ2xvc3VyZWRlY2xhcmVkT3JJbmZlcnJlZFR5cGVjb21wdXRlUHJvbW90ZWRUeXBlaGFuZGxlWWllbGRJbmZlcnJlZFR5cGVWaXNpdG9yZ2V0SW5mZXJyZWRUeXBlcmVhZEluZmVycmVkVHlwZWludmFsaWRUb0JvdHRvbWludmFsaWRUb1RvcGNvbXB1dGVDb25zdHJ1Y3RvclJldHVyblR5cGVnZXRFeHBsaWNpdFR5cGVBcmd1bWVudHNjaGVja1dlYkludExpdGVyYWxzRXJyb3JJZlVuZXhhY3Rhc0ludG5lYXJlc3QweDBYZmFzdGEuYnVpbGRlcklkZW50aWZpZXJRdWFsaWZpZWROYW1lZGVwcmVjYXRlZF9leHRyYWN0VG9rZW5mbGF0dGVuTmFtZUJ1aWx0aW5UeXBlQnVpbGRlckVudW1Db25zdGFudEluZm9Gb3JtYWxQYXJhbWV0ZXJCdWlsZGVyQ29uc3RydWN0b3JCdWlsZGVyUmVkaXJlY3RpbmdGYWN0b3J5QnVpbGRlckZ1bmN0aW9uVHlwZUJ1aWxkZXJNaXhpbkFwcGxpY2F0aW9uQnVpbGRlck1vZGlmaWVyQnVpbGRlclByZWZpeEJ1aWxkZXJUeXBlQWxpYXNCdWlsZGVyVW5yZXNvbHZlZFR5cGVWb2lkVHlwZUJ1aWxkZXJmYXN0YS5zY2FubmVyLmtleXdvcmRzX0tFWVdPUkRfU1RBVEVLRVlXT1JEX1NUQVRFY29tcHV0ZUtleXdvcmRTdGF0ZVRhYmxlaXNMb3dlcmNhc2VjaHVua2NodW5rU3RhcnRpc0xlYWZBcnJheUtleXdvcmRTdGF0ZWZvbzsgTG93ZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGVVcHBlckNhc2VBcnJheUtleXdvcmRTdGF0ZUxlYWZLZXl3b3JkU3RhdGVmYXN0YS5jb25zdGFudF9jb250ZXh0ZmFzdGEubW9kaWZpZXJNb2RpZmllckVudW1Nb2RpZmllckVudW0uQWJzdHJhY3RNb2RpZmllckVudW0uQ29uc3RNb2RpZmllckVudW0uQ292YXJpYW50TW9kaWZpZXJFbnVtLkV4dGVybmFsTW9kaWZpZXJFbnVtLkZpbmFsTW9kaWZpZXJFbnVtLlN0YXRpY01vZGlmaWVyRW51bS5WYXJBYnN0cmFjdENvbnN0Q292YXJpYW50RXh0ZXJuYWxGaW5hbFN0YXRpY1Zhcm1hc2tNb2RpZmllci5mcm9tU3RyaW5nbW9kaWZpZXIoTW9kaWZpZXJFbnVtLnZhbGlkYXRlVmFyRmluYWxPckNvbnN0TW9kaWZpZXIudmFsaWRhdGVWYXJGaW5hbE9yQ29uc3RuYW1lZE1peGluQXBwbGljYXRpb25NYXNrbWl4aW5EZWNsYXJhdGlvbk1hc2tleHRlbnNpb25EZWNsYXJhdGlvbk1hc2toYXNJbml0aWFsaXplck1hc2tpbml0aWFsaXppbmdGb3JtYWxNYXNraGFzQ29uc3RDb25zdHJ1Y3Rvck1hc2t2YXJNYXNrZnJvbnRfZW5kLnNyYy5mYXN0YS5uYW1lc2FtcGVyc2FuZE5hbWViYXJOYW1lY2FyZXROYW1lZGl2aXNpb25OYW1lZG91YmxlQW1wZXJzYW5kTmFtZWRvdWJsZUJhck5hbWVkb3VibGVRdWVzdGlvbk5hbWVlcXVhbHNOYW1lZ3JlYXRlclRoYW5OYW1lZ3JlYXRlclRoYW5PckVxdWFsc05hbWVpZGVudGljYWxOYW1lbGVmdFNoaWZ0TmFtZWxlbmd0aE5hbWVsZXNzVGhhbk5hbWVsZXNzVGhhbk9yRXF1YWxzTmFtZW11bHRpcGx5TmFtZW11c3RhY2hlTmFtZW5lZ2F0aW9uTmFtZW5vU3VjaE1ldGhvZE5hbWVwZXJjZW50TmFtZXJpZ2h0U2hpZnROYW1ldHJpcGxlU2hpZnROYW1ldGlsZGVOYW1ldW5hcnlNaW51c05hbWVmYXN0YS5wYXJzZXJMaXN0ZW5lclBhcnNlckVycm9yVG9wTGV2ZWxQYXJzZXJFcnJvckNvbGxlY3RpbmdMaXN0ZW5lcnJlY292ZXJhYmxlRXJyb3JzZmFzdGEucXVvdGVRdW90ZS5TaW5nbGVRdW90ZS5Eb3VibGVRdW90ZS5NdWx0aUxpbmVTaW5nbGVRdW90ZS5NdWx0aUxpbmVEb3VibGVRdW90ZS5SYXdTaW5nbGVRdW90ZS5SYXdEb3VibGVRdW90ZS5SYXdNdWx0aUxpbmVTaW5nbGVRdW90ZS5SYXdNdWx0aUxpbmVEb3VibGVTaW5nbGVEb3VibGVNdWx0aUxpbmVTaW5nbGVNdWx0aUxpbmVEb3VibGVSYXdTaW5nbGVSYXdEb3VibGVSYXdNdWx0aUxpbmVTaW5nbGVSYXdNdWx0aUxpbmVEb3VibGVVbmVzY2FwZUVycm9yTGlzdGVuZXJoYW5kbGVVbmVzY2FwZUVycm9ybGVuZ3RoT2ZPcHRpb25hbFdoaXRlc3BhY2VQcmVmaXhmaXJzdFF1b3RlTGVuZ3RobGFzdFF1b3RlTGVuZ3RoaXNMYXN0UXVvdGVTeW50aGV0aWN1bmVzY2FwZUNvZGVVbml0c3Jlc3VsdE9mZnNldGRpZ2l0ZmFzdGEuc2NvcGVfbGlzdGVuZXJTdGFja0xpc3RlbmVyQnJlYWtDb250aW51ZUdvdG9KY3JlYXRlQnJlYWtUYXJnZXRjcmVhdGVDb250aW51ZVRhcmdldE51bGxWYWx1ZS5CcmVha1RhcmdldE51bGxWYWx1ZS5Db250aW51ZVRhcmdldGJlZ2luQmxvY2tGdW5jdGlvbkJvZHlibG9jayBmdW5jdGlvbiBib2R5YmVnaW5Gb3JTdGF0ZW1lbnRmb3Igc3RhdG1lbnRiZWdpbkZvckNvbnRyb2xGbG93Zm9yIGluIGEgY29sbGVjdGlvbmJlZ2luQmxvY2tiZWdpbkRvV2hpbGVTdGF0ZW1lbnRiZWdpbldoaWxlU3RhdGVtZW50YmVnaW5Eb1doaWxlU3RhdGVtZW50Qm9keWRvLXdoaWxlIHN0YXRlbWVudCBib2R5ZW5kRG9XaGlsZVN0YXRlbWVudEJvZHliZWdpbldoaWxlU3RhdGVtZW50Qm9keXdoaWxlIHN0YXRlbWVudCBib2R5ZW5kV2hpbGVTdGF0ZW1lbnRCb2R5YmVnaW5Gb3JTdGF0ZW1lbnRCb2R5Zm9yIHN0YXRlbWVudCBib2R5ZW5kRm9yU3RhdGVtZW50Qm9keWJlZ2luRm9ySW5Cb2R5Zm9yLWluIGJvZHllbmRGb3JJbkJvZHliZWdpbkVsc2VTdGF0ZW1lbnRlbmRFbHNlU3RhdGVtZW50VmFsdWVLaW5kQXJndW1lbnRzT3JOdWxsSW50ZWdlck5hbWVPck51bGxOdWxsVmFsdWUuTmFtZU5hbWVPclBhcnNlclJlY292ZXJ5TWV0YWRhdGFMaXN0T3JOdWxsVG9rZW5Pck51bGxOdWxsVmFsdWUuVG9rZW5UeXBlQXJndW1lbnRzT3JOdWxsVHlwZVZhcmlhYmxlTGlzdE9yTnVsbF9TaW5nbGVWYWx1ZUtpbmRudWxsVmFsdWVfVW5pb25WYWx1ZUtpbmRraW5kc3JlcGVhdGVkS2luZHN1bmlvbk9mS2luZHNoYXNBbnlUeXBlVmFyaWFibGVzVHlwZUNvbnN0cmFpbnRHYXRoZXJlcmdldE5hbWVkUGFyYW1ldGVyVHlwZVR5cGVWYXJpYWJsZUVsaW1pbmF0b3JDbG9zdXJlQ29udGV4dGRlY2xhcmVkUmV0dXJuVHlwZV9uZWVkVG9JbmZlclJldHVyblR5cGVfaW5mZXJyZWRVbndyYXBwZWRSZXR1cm5PcllpZWxkVHlwZWlzQXJyb3dyZXR1cm5TdGF0ZW1lbnRzcmV0dXJuRXhwcmVzc2lvblR5cGVzbmVlZFRvSW5mZXJSZXR1cm5UeXBlZ2V0VHlwZUFyZ3VtZW50T2ZjaGVja1ZhbGlkUmV0dXJuZmxhdHRlbmVkUmV0dXJuVHlwZWZsYXR0ZW5lZEV4cHJlc3Npb25UeXBlaXNSZXR1cm5Gcm9tQXN5bmN1bndyYXBwZWRUeXBlX3dyYXBBc3luY09yR2VuZXJhdG9yZ2V0RGVyaXZlZFR5cGVBcmd1bWVudE9maW5mZXJSZXR1cm5UeXBld3JhcEZ1dHVyZVR5cGVNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZE1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kLm5vbmVNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZC5jaGVja01ldGhvZFJldHVybk1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kLmNoZWNrR2V0dGVyUmV0dXJuY2hlY2tNZXRob2RSZXR1cm5jaGVja0dldHRlclJldHVybnVua25vd25GdW5jdGlvbmluZmVycmVkVHlwZXNNYXBsYXN0SW5mZXJyZWRTdWJzdGl0dXRpb25sYXN0Q2FsbGVlVHlwZWFjdHVhbFR5cGVpbml0aWFsRXhwZWN0ZWRUeXBldW5mdXR1cmVkRXhwZWN0ZWRUeXBlZnV0dXJlZEV4cGVjdGVkVHlwZWNhbGxNZW1iZXJfc2hvdWxkVGVhck9mZkNhbGxudWxsQ2hlY2t0ZWFyT2ZmY29uZGl0aW9uYWxlcnJvck5vZGVfZ2V0UHJlY2lzZVR5cGVFcnJvclRlbXBsYXRldHlwZUNoZWNraXNOdWxsZmluZEludGVyZmFjZU1lbWJlcmVycm9yVGVtcGxhdGVfZ2V0SW50ZXJmYWNlTWVtYmVybWV0aG9kSW52b2NhdGlvbnNpZ25hdHVyZXByb3BlcnR5R2V0cHJvcGVydHlTZXRmb2xsb3dDYWxsY2FsbFR5cGVtZW1iZXJDbGFzc3R5cGVBc0luc3RhbmNlT2ZDbGFzc2dldFJlYWxUYXJnZXRzZXR0ZXJQYXJhbWV0ZXJzZXhwcmVzc2lvblRvUmVwbGFjZWNoZWNrUmV0dXJucmVwbGFjZWRFeHByZXNzaW9uY2FsbGVlVHlwZVBhcmFtZXRlcnNleHBsaWNpdFR5cGVBcmd1bWVudHNfZm9yRWFjaEFyZ3VtZW50aW5mZXJyZWRGb3JtYWxUeXBlc2Vlbk5hbWVzbmFtZWRUeXBlSW5kZXh1bmlxdWVOYW1lZHByZXZOYW1lZEV4cHJlc3Npb25udW1Qb3NpdGlvbmFsQXJnc2Zvcm1hbFR5cGVzRnJvbUNvbnRleHRuZWVkVG9TZXRSZXR1cm5UeXBlb2xkQ2xvc3VyZUNvbnRleHRpbmZlcnJlZFJldHVyblR5cGVwYXJlbnRzYWN0dWFsUmVjZWl2ZXJUeXBlYWN0dWFsTWV0aG9kTmFtZWNoZWNrQm91bmRzSW5NZXRob2RJbnZvY2F0aW9udGVhcm9mZlR5cGVpbnN0YW50aWF0ZWRUeXBlcmV0dXJuZWRUeXBlUGFyYW1ldGVyc09jY3VyTm9uQ292YXJpYW50bHljaGVja2VyaW5pdGlhbFZhcmlhbmNlVmFyaWFuY2UuY292YXJpYW50cmVzb2x2ZU9uZVN0ZXByZXNvbHZlZHN0ZXAxc3RlcDJ0eXBlV2l0aG91dEZ1dHVyZU9ybmFtZWRFeHByZXNzaW9uZ2V0Q29tYmluZWRNZW1iZXJTaWduYXR1cmVLZXJuZWxnYXRoZXJlcnJlcG9ydFByb2JsZW1nZW5lcmF0ZUNvbnN0cmFpbnRzbWl4aW5DbGFzc2Jhc2VUeXBlbWl4aW5TdXBlcnR5cGVtaXhpblN1cGVyY2xhc3NDb21waWxlci1nZW5lcmF0ZWQgbWl4aW4gYXBwbGljYXRpb25zIGhhdmUgYSBtaXhpbiBvciBlbHNlIGltcGxlbWVudCBleGFjdGx5IG9uZSB0eXBlIGltcGxlbWVudHMgczBzMXUwdHJ5U3VidHlwZU1hdGNoY29tcHV0ZUNvbnN0cmFpbnRzY29uc3RyYWludGV4YWN0Ym91bmRzZ2V0TmFtZWRGb3JtYWxnZXRQb3NpdGlvbmFsRm9ybWFsaXNPdmVybG9hZGFibGVBcml0aG1ldGljT3BlcmF0b3JkaXNhYmxlZG11dGF0ZVZhcmlhYmxlVHlwZVByb21vdGVyRGlzYWJsZWRfbnVsbEZhY3RzX2ZhY3RDYWNoZV9mYWN0Q2FjaGVTdGF0ZV9jdXJyZW50RmFjdHNfcHJvbW90aW9uRXhwcmVzc2lvbl90cnVlRmFjdHNGb3JQcm9tb3Rpb25FeHByZXNzaW9uX2N1cnJlbnRTY29wZV9sYXN0RmFjdFNlcXVlbmNlTnVtYmVyX2NvbXB1dGVQcm9tb3RlZFR5cGVhZnRlclRydWViZWZvcmVFbHNldHJ1ZUZhY3RzX2ZhY3RzV2hlblRydWVmYWxzZUZhY3RzX2ZhY3RzV2hlbkZhbHNlaXNBbmRfZW5jbG9zaW5nX21lcmdlRmFjdHNfcmVjb3JkUHJvbW90aW9uRXhwcmVzc2lvbnNob3J0Y3V0RmFjdHNfY29tcHV0ZUN1cnJlbnRGYWN0TWFwaXNDaGVja2NvbW1vbkFuY2VzdG9yc2VxdWVuY2VOdW1iZXJwcmV2aW91c0ZvclZhcmlhYmxlbmV3U3RhdGVjdXJyZW50bHlDYWNoZWRfcHJpbnRFdmVudGZhY3RDaGFpbihudWxsKSAtPiAgIF9wcm9tb3Rpb25FeHByZXNzaW9uOiAgICAgaWYgdHJ1ZTogaWZUcnVlaWZGYWxzZV9tdXRhdGVkSW5TY29wZXNfYWNjZXNzZWRJbkNsb3N1cmVJblNjb3Blc3Byb21vdGVyX3JlY29yZEFjY2Vzc2VkSW5TY29wZV9yZWNvcmRNdXRhdGVkSW5TY29wZV9kZXB0aF90b3BMZXZlbGNvbnRhaW5zU2NvcGVfQ29uZGl0aW9uYWxTY29wZWVuY2xvc2luZ19Jc0NoZWNrY2hlY2tlZFR5cGVpc0NoZWNrKHByZXZpb3VzUHJvbW90ZWRUeXBlYXNzaWdubWVudFNjb3BlYWNjZXNzU2NvcGVwcmV2aW91c1R5cGVfTG9naWNhbFNjb3BlX051bGxGYWN0VHJpZWQgdG8gY3JlYXRlIHByb21vdGVkIHR5cGUgZm9yIG5vIHZhcmlhYmxlX1RvcExldmVsU2NvcGVmYXN0YS5jb2xsZWN0aW9uc0NvbnRyb2xGbG93RWxlbWVudF9TcHJlYWRFbGVtZW50JkV4cHJlc3Npb24mQ29udHJvbEZsb3dFbGVtZW50X0lmRWxlbWVudCZFeHByZXNzaW9uJkNvbnRyb2xGbG93RWxlbWVudF9Gb3JFbGVtZW50JkV4cHJlc3Npb24mQ29udHJvbEZsb3dFbGVtZW50X0ZvckluRWxlbWVudCZFeHByZXNzaW9uJkNvbnRyb2xGbG93RWxlbWVudENvbnRyb2xGbG93TWFwRW50cnkua2V5IGdldHRlcmV4cHJDb250cm9sRmxvd01hcEVudHJ5LmtleSBzZXR0ZXJDb250cm9sRmxvd01hcEVudHJ5LnZhbHVlIGdldHRlckNvbnRyb2xGbG93TWFwRW50cnkudmFsdWUgc2V0dGVyX1NwcmVhZE1hcEVudHJ5JlRyZWVOb2RlJkNvbnRyb2xGbG93TWFwRW50cnlfSWZNYXBFbnRyeSZUcmVlTm9kZSZDb250cm9sRmxvd01hcEVudHJ5X0Zvck1hcEVudHJ5JlRyZWVOb2RlJkNvbnRyb2xGbG93TWFwRW50cnlfRm9ySW5NYXBFbnRyeSZUcmVlTm9kZSZDb250cm9sRmxvd01hcEVudHJ5ZmFzdGEuY29uc3RuZXNzZXhwbGljaXRDb25zdGV4cGxpY2l0TmV3aW1wbGljaXRmYXN0YS5leHByZXNzaW9uX2dlbmVyYXRvcnByaW50Tm9kZU9ucHJpbnRRdWFsaWZpZWROYW1lT25faGVscGVyX2ZvcmVzdF9wbGFpbk5hbWVGb3JSZWFkX2RlYnVnTmFtZV91cmlfZmluaXNoX21ha2VTaW1wbGVSZWFkX21ha2VSZWFkY29tcGxleEFzc2lnbm1lbnRzdGFydENvbXBsZXhBc3NpZ25tZW50X21ha2VTaW1wbGVXcml0ZV9tYWtlV3JpdGVidWlsZE51bGxBd2FyZUFzc2lnbm1lbnRidWlsZENvbXBvdW5kQXNzaWdubWVudGJpbmFyeU9wZXJhdG9yYnVpbGRQb3N0Zml4SW5jcmVtZW50dmFsdWVBY2Nlc3NkdW1teV9tYWtlSW52YWxpZFJlYWRfbWFrZUludmFsaWRXcml0ZW9wZXJhdG9yT2Zmc2V0YnVpbGRJbnZhbGlkVHlwZShvZmZzZXQ6ICwgdmFyaWFibGU6ICwgcHJvbW90ZWRUeXBlOiBfcmVjZWl2ZXJWYXJpYWJsZXJlY2VpdmVyQWNjZXNzLCBfcmVjZWl2ZXJWYXJpYWJsZTogLCByZWNlaXZlcjogLCBuYW1lOiAsIGdldHRlcjogLCBzZXR0ZXI6IG1ha2VOdWxsQXdhcmVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcnJlY2VpdmVyRXhwcmVzc2lvbmtlcm5lbFByb3BlcnR5QXNzaWduLCByZWNlaXZlckV4cHJlc3Npb246ICwgdHlwZTogU3VwZXJQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcmluZGV4VmFyaWFibGVpbmRleEFjY2Vzc19tYWtlV3JpdGVBbmRSZXR1cm52YWx1ZVZhcmlhYmxlLCBpbmRleDogLCByZWNlaXZlclZhcmlhYmxlOiAsIGluZGV4VmFyaWFibGU6IFRoaXNJbmRleGVkQWNjZXNzR2VuZXJhdG9yd3JpdGVUYXJnZXRmcm9tQnVpbGRlcmJ1aWxkZXJTZXR0ZXJTdGF0aWNBY2Nlc3NHZW5lcmF0b3IuZnJvbUJ1aWxkZXIsIHJlYWRUYXJnZXQ6ICwgd3JpdGVUYXJnZXQ6IGxvYWRMaWJyYXJ5aW1wb3J0RGVwZW5kZW5jeWNyZWF0ZVRlYXJvZmZNZXRob2RjcmVhdGVMb2FkTGlicmFyeSwgYnVpbGRlcjogRGVmZXJyZWRBY2Nlc3NHZW5lcmF0b3JwcmVmaXhHZW5lcmF0b3JzdWZmaXhHZW5lcmF0b3Jwcm9wZXJ0eUFjY2Vzc2RlZmVycmVkQWNjZXNzb3IucGxhaW5OYW1lRm9yUmVhZCwgcHJlZml4R2VuZXJhdG9yOiAsIHN1ZmZpeEdlbmVyYXRvcjogcGxhaW5OYW1lRm9yUmVhZHR5cGVWYXJpYWJsZXNDb3VudGFyZ3VtZW50QnVpbGRlcnMsIGRlY2xhcmF0aW9uOiAsIHBsYWluTmFtZUZvclJlYWQ6IGxpdGVyYWxUeXBlLCBleHByZXNzaW9uOiAsIHZhbHVlOiBFcnJvbmVvdXNFeHByZXNzaW9uR2VuZXJhdG9yYnVpbGRFcnJvcl9idWlsZFVucmVzb2x2ZWRWYXJpYWJsZUFzc2lnbm1lbnRDb250ZXh0QXdhcmVHZW5lcmF0b3JtYWtlSW52YWxpZFJlYWRoYW5kbGVBc3NpZ25tZW50LCBhc3NpZ25tZW50T3BlcmF0b3I6ICwgYmluYXJ5T3BlcmF0b3I6ICwgaW50ZXJmYWNlVGFyZ2V0OiAnICE9ICwgcHJlZml4OiAsIGRlZmVycmVkOiBVbmV4cGVjdGVkUXVhbGlmaWVkVXNlR2VuZXJhdG9yI3BhcnNlci1lcnJvcmlzSW5pdGlhbGl6ZXIucGxhaW5OYW1lRm9yUmVhZGJ1aWxkRmllbGRJbml0aWFsaXplckVycm9yYnVpbGRDb25zdHJ1Y3RvckluaXRpYWxpemVyZnVsbE5hbWVidWlsZEFzc2lnbm1lbnRFcnJvciwgaXNJbml0aWFsaXplcjogLCBpbkZpZWxkSW5pdGlhbGl6ZXI6ICwgaXNTdXBlcjogX0luY29tcGxldGVFcnJvckdlbmVyYXRvciZFcnJvbmVvdXNFeHByZXNzaW9uR2VuZXJhdG9yJkluY29tcGxldGVTZW5kR2VuZXJhdG9yLCBtZXNzYWdlOiBfU2VuZEFjY2Vzc0dlbmVyYXRvciZHZW5lcmF0b3ImSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3IsIGFyZ3VtZW50czogX0luY29tcGxldGVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciZHZW5lcmF0b3ImSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3JtYWtlQmluYXJ5bWFrZU9yUmV1c2VWYXJpYWJsZWFkanVzdEZvckltcGxpY2l0Q2FsbGlzRmllbGRPckdldHRlcmZhc3RhLmV4cHJlc3Npb25fZ2VuZXJhdG9yX2hlbHBlcmZhc3RhLmZhbmdvcm5jb25kaXRpb25Cb3VuZGFyeWNvbmRpdGlvbkxhc3RUb2tlbm5leHRUb2tlbmRlY2xhcmF0aW9uc2V4Y2VwdGlvblBhcmFtZXRlcnN0YWNrVHJhY2VQYXJhbWV0ZXJzdGFja1RyYWNlVHlwZXVwZGF0ZXJzcmlnaHRQYXJlbnRoZXNpc2lmS2V5d29yZHRoZW5TdGF0ZW1lbnRlbHNlS2V5d29yZGVsc2VTdGF0ZW1lbnRub3RPcGVyYXRvcmxhYmVsZWRTdGF0ZW1lbnRsZWZ0T3BlcmFuZHJpZ2h0T3BlcmFuZHJldGhyb3dLZXl3b3JkcmV0dXJuS2V5d29yZHRocm93S2V5d29yZG9jYXRjaENsYXVzZXN5aWVsZEtleXdvcmRzdGFyc3ludGhfVmFyaWFibGVzRGVjbGFyYXRpb25mYXN0YS5mb3Jlc3RmYXN0YS5pbXBsaWNpdF90eXBlX2FyZ3VtZW50R3JhcGhjb21wdXRlU3Ryb25nQ29tcG9uZW50c1R5cGVWYXJpYWJsZXNHcmFwaGVkZ2VzdmFyaWFibGVJbmRpY2VzY29sbGVjdFJlZmVyZW5jZXNGcm9tdHlwZVZhcmlhYmxlVHlwZVZhcmlhYmxlU2VhcmNoYW55VHlwZVZhcmlhYmxlc3N1YnN0aXR1dGVSYW5nZXVwcGVyU3Vic3RpdHV0aW9ubG93ZXJTdWJzdGl0dXRpb25zdWJzdGl0dXRlZEFyZ3VtZW50Y2hhbmdlZHN0cm9uZ2x5Q29ubmVjdGVkZHluYW1pY1N1YnN0aXR1dGlvbm51bGxTdWJzdGl0dXRpb252YXJpYWJsZUluZGV4ZmluZFZhcmlhYmxlVXNlc0luVHlwZXVzZXNkZXBlbmRlbnRWYXJpYWJsZWZpbmRJbmJvdW5kUmVmZXJlbmNlc3ZhcmlhYmxlc0FuZERlcGVuZGVuY2llc2RlcGVuZGVudGRlcGVuZGVuY2VmaW5kUmF3VHlwZXNXaXRoSW5ib3VuZFJlZmVyZW5jZXN0eXBlc0FuZERlcGVuZGVuY2llc2hhc0luYm91bmRnZXRJbmJvdW5kUmVmZXJlbmNlSXNzdWVzaXNzdWVzcmF3VHlwZXNBbmRNdXR1YWxEZXBlbmRlbmNpZXNmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbnZpc2l0ZWRkZXBlbmRlbmN5UGF0aGZpbmRSYXdUeXBlQ3ljbGVzY3ljbGVzY29udmVydFJhd1R5cGVDeWNsZXNJbnRvSXNzdWVzY3ljbGVmaXJzdEVuY291bnRlcmVkVHlwZWdldE5vblNpbXBsaWNpdHlJc3N1ZXNGb3JUeXBlVmFyaWFibGVzZ2V0Tm9uU2ltcGxpY2l0eUlzc3Vlc0ZvckRlY2xhcmF0aW9ucGVyZm9ybUVycm9yUmVjb3ZlcnljeWNsZXNUb1JlcG9ydGRlY2xhcmF0aW9uUGF0aEFuZE5hbWVsZXhNaW5QYXRoQW5kTmFtZXBhdGhBbmROYW1lcmF3VHlwZUN5Y2xlc0FzSXNzdWVzYnJlYWtDeWNsZXNmaW5kR2VuZXJpY0Z1bmN0aW9uVHlwZXNmYXN0YS5rZXJuZWxfYXBpaW5zdGFudGlhdGVUb0JvdW5kc2Zhc3RhLmtlcm5lbF9hc3RfYXBpZnJvbnRfZW5kLm1lbW9yeV9maWxlX3N5c3RlbV9maWxlc19kaXJlY3Rvcmllcy0gX2FkZFRyYWlsaW5nU2xhc2hNZW1vcnlGaWxlU3lzdGVtRW50aXR5Y3JlYXRlRGlyZWN0b3J5RW50cnkgIGlzIGEgZmlsZS5GaWxlICBkb2VzIG5vdCBleGlzdC53cml0ZUFzQnl0ZXNTeW5jX3VwZGF0ZSBpcyBhIGRpcmVjdG9yeS5mYXN0YS5idWlsZGVyX2dyYXBoTGlicmFyeSBub3QgZm91bmQ6IGZhc3RhLmNvbWJpbmF0b3JEaXJlY3RvcnlHWmlwQ29kZWNnWmlwQ29kZWNnemlwcGVkSW5pdGlhbGl6ZWRGcm9tRGF0YXRlbXBEaXJjcmVhdGVUZW1wU3luYy5nemZyb250X2VuZC5zcmMuaHlicmlkX2ZpbGVfc3lzdGVtcGh5c2ljYWxfcGh5c2ljYWxIeWJyaWRGaWxlU3lzdGVtRW50aXR5X2RlbGVnYXRlX2ZzZGVsZWdhdGVmYXN0YS5rZXJuZWxfbGlicmFyeV9idWlsZGVyVHlwZUFyZ3VtZW50SXNzdWVmaW5kVHlwZUFyZ3VtZW50SXNzdWVzZmluZFR5cGVBcmd1bWVudElzc3Vlc0Zvckludm9jYXRpb25nZXRHZW5lcmljVHlwZU5hbWVEZWNsYXJhdGlvbkJ1aWxkZXJhY3R1YWxPcmlnaW5uYXRpdmVNZXRob2RzYm91bmRsZXNzVHlwZVZhcmlhYmxlc2ZvcndhcmRlcnNPcmlnaW5zX25hbWVPcmlnaW51bnR5cGVkSW5pdGlhbGl6aW5nRm9ybWFsc2FkZE5hbWVkVHlwZWFkZFR5cGVhZGRNaXhpbkFwcGxpY2F0aW9ubWl4aW5zYWRkVm9pZFR5cGVkb2N1bWVudGF0aW9uQ29tbWVudG5hbWVPZmZzZXRzdXBlcnR5cGVPZmZzZXRlbmROZXN0ZWREZWNsYXJhdGlvbmxpYnJhcnlEZWNsYXJhdGlvbmNsYXNzU2NvcGVjbGFzcyBjb25zdHJ1Y3RvclNjb3BlYXBwbHlNaXhpbnN0eXBlVmFyaWFibGVzQnlOYW1lY2hlY2tUeXBlVmFyaWFibGVzc2V0UGFyZW50c2V0UGFyZW50QW5kQ2hlY2tDb25mbGljdHN0dm93bmVyYWRkRXh0ZW5zaW9uRGVjbGFyYXRpb25leHRlbnNpb25OYW1lZXh0ZW5zaW9uIHN1YmNsYXNzTmFtZXVubmFtZWQgbWl4aW4gYXBwbGljYXRpb25ydW5uaW5nTmFtZWlzTmFtZWRNaXhpbkFwcGxpY2F0aW9udHlwZVZhcmlhYmxlTmFtZXN1c2VzVHlwZVZhcmlhYmxlc2lzR2VuZXJpY2Z1bGxuYW1lYXBwbGljYXRpb25UeXBlVmFyaWFibGVzYXBwbGljYXRpb25UeXBlQXJndW1lbnRzYmVnaW5OZXN0ZWREZWNsYXJhdGlvbm1peGluIGFwcGxpY2F0aW9uY29weVR5cGVWYXJpYWJsZXNjdXJyZW50RGVjbGFyYXRpb25uZXdUeXBlc25ld1R5cGVtaXhpbkRlY2xhcmF0aW9uY29tcHV0ZWRTdGFydENoYXJPZmZzZXRhcHBsaWNhdGlvbm1peGluIGFkZE5hbWVkTWl4aW5BcHBsaWNhdGlvbm1peGluQXBwbGljYXRpb25pbml0aWFsaXplclRva2VuY29uc3RJbml0aWFsaXplclRva2VuYWRkQ29uc3RydWN0b3Jjb25zdHJ1Y3Rvck5hbWVjaGFyT3BlblBhcmVuT2Zmc2V0bmF0aXZlTWV0aG9kTmFtZWFkZE5hdGl2ZU1ldGhvZGFkZEZhY3RvcnlNZXRob2RmYWN0b3J5RGVjbGFyYXRpb24jZmFjdG9yeV9tZXRob2Rwcm9jZWR1cmVOYW1lY29tcHV0ZUFuZFZhbGlkYXRlQ29uc3RydWN0b3JOYW1lc2F2ZWREZWNsYXJhdGlvbmFkZEVudW1lbnVtQ29uc3RhbnRJbmZvc2FkZEZ1bmN0aW9uVHlwZUFsaWFzI3R5cGVkZWZhZGRGdW5jdGlvblR5cGUjZnVuY3Rpb25fdHlwZWFkZEZvcm1hbFBhcmFtZXRlcmhhc1RoaXNhZGRUeXBlVmFyaWFibGVidWlsZEJ1aWxkZXJhZGROYXRpdmVEZXBlbmRlbmN5bmF0aXZlSW1wb3J0UGF0aGFkZERlcGVuZGVuY2llc2ltcG9ydEluZGV4ZXhwb3J0SW5kZXhwcmVmaXhCdWlsZGVyaXNMb2FkTGlicmFyeXByZWZlcnJlZG90aGVyVXJpcHJlZmVycmVkVXJpaGlkZGVuVXJpYnVpbGRlclRlbXBsYXRlbG9hZExpYnJhcnlCdWlsZGVyZm9yd2FyZGVycG9zaXRpb25hbENvdW50Zm9yd2FyZGVyUGFyYW1ldGVyb3JpZ2luUGFyYW1ldGVyb3JpZ2luTmFtZWRNYXBvcmlnaW5OYW1lZGZvcndhcmRlck5hbWVkYmVjb21lTmF0aXZlY29tcHV0ZURlZmF1bHRUeXBlc0ZvclZhcmlhYmxlc2hhdmVFcnJvbmVvdXNCb3VuZHNnZW5lcmljRnVuY3Rpb25UeXBlc3JlcG9ydElzc3Vlc2luY2x1ZGVQYXJ0cGFydE9mZnNldHBhcnRJbXBsaWNpdGx5VHlwZWRGaWVsZHNtZW1iZXJMYXN0b3JpZ2luRGVjbGFyYXRpb25zYXBwbHlQYXRjaHBhdGNoRGVjbGFyYXRpb25zaW5qZWN0TWVtYmVyRnJvbVBhdGNoZXhwb3J0TWVtYmVyRnJvbVBhdGNocmVwb3J0VHlwZUFyZ3VtZW50SXNzdWVzdGFyZ2V0UmVjZWl2ZXJpc3N1ZWlzc3VlSW5mZXJyZWRlbmNsb3NpbmdUeXBlZW5jbG9zaW5nTmFtZXJlcG9ydFR5cGVBcmd1bWVudElzc3VlY2hlY2tCb3VuZHNJbkZpZWxkYWxsb3dTdXBlckJvdW5kZWRjaGVja0JvdW5kc0luRnVuY3Rpb25Ob2RlUGFydHNjaGVja0JvdW5kc0luRnVuY3Rpb25Ob2RlcmVjZWl2ZXJUeXBlQXJndW1lbnRzbWV0aG9kUGFyYW1ldGVyc2luc3RhbnRpYXRlZE1ldGhvZFBhcmFtZXRlcnNmaW5hbGl6ZUluaXRpYWxpemluZ0Zvcm1hbGNvbXB1dGVMaWJyYXJ5VXJpbm8gbGlicmFyeSBwYXJlbnRleHRyYWN0TmFtZWZhc3RhLmxpYnJhcnlfZ3JhcGh1cmkxZmFzdGEuc291cmNlX2xpYnJhcnlfYnVpbGRlcnJlc29sdmVSZWxhdGl2ZVVyaUNvbmZpZ3VyYXRpb25NQUxGT1JNRURfVVJJX1NDSEVNRWltcG9ydFNjb3BlaW1wbGVtZW50YXRpb25CdWlsZGVyc2FjY2Vzc29yc3BhcnRPZk5hbWVjYW5BZGRJbXBsZW1lbnRhdGlvbkJ1aWxkZXJzYWNjZXNzUHJvYmxlbWZyb21TY29wZXN0b1Njb3BlYWRkQ29uc3RydWN0b3JSZWZlcmVuY2VoYXNNZW1iZXJzY3JlYXRlTmVzdGVkPHN5bnRheC1lcnJvcj51cmlJc1ZhbGlkdXJpT2Zmc2V0cGFyc2VkVXJpYWRkRXhwb3J0Y29uZmlndXJhdGlvbnNsb29rdXBJbXBvcnRDb25kaXRpb25kb3R0ZWROYW1lZXhwb3J0ZWRMaWJyYXJ5YWRkRXhwb3J0ZXJwcmVmaXhDaGFyT2Zmc2V0bmF0aXZlUGF0aGRhcnQtZXh0OnN0cmlwcGVkVXJpYWRkUGFydE9mYWRkRmllbGRzZmllbGRJbmZvc3BvdGVudGlhbGx5TmVlZEluaXRpYWxpemVySW5PdXRsaW5lYmVmb3JlTGFzdGlzRHVwbGljYXRlZERlY2xhcmF0aW9uYWRkSW1wbGVtZW50YXRpb25CdWlsZGVyc2VlblBhcnRzcGFydERlY2xhcmF0aW9uc2R1cGxpY2F0ZWRleHBsaWNpdENvcmVJbXBvcnRmaW5hbGl6ZUltcG9ydHNjaGVja1R5cGVub3JtYWxpemVUeXBlPGxpYnJhcnk+bmFtZU9yUXVhbGlmaWVkZW5kQ2hhck9mZnNldERlY2xhcmF0aW9uQnVpbGRlcig6bmFtZT1GaWVsZEluZm9JbXBsZW1lbnRhdGlvbkluZm9jb21waWxlci5udWxsX2FwaU51bGxCaW5hcnlTaW5rTnVsbEJpbmFyeVNpbmsoZGFydDJqcy5kaWFnbm9zdGljX2xpc3RlbmVycmVwb3J0RXJyb3JNZXNzYWdlcmVwb3J0SGludE1lc3NhZ2VkYXJ0MmpzLmRpYWdub3N0aWNzLmludmFyaWFudERFQlVHX01PREVEZWJ1ZyBtb2RlIGlzIG5vdCBlbmFibGVkOiBTcGFubmFibGUgd2FzIG51bGwgZm9yIGZhaWxlZEF0LiBVc2UgQ1VSUkVOVF9FTEVNRU5UX1NQQU5OQUJMRS5kYXJ0MmpzLmRpYWdub3N0aWNzLnNvdXJjZV9zcGFuU291cmNlU3BhbihkYXJ0MmpzLmRpYWdub3N0aWNzLnNwYW5uYWJsZV9TcGFubmFibGVTZW50aW5lbEFzc2VydGlvbiBmYWlsdXJlZGFydDJqcy5oZWxwZXJzRGVidWdQcmludERlYnVnV3JhcFByaW50UmVwb3J0SGVyZWRlYnVnTWVzc2FnZV9EZWJ1Z0luZGVudGF0aW9uREVCVUdfUFJJTlRfRU5BQkxFRF9pbmRlbnRhdGlvbl90cmFja2VkT2JqZWN0c3RyYWNrV2l0aFRyYWNlZW5hYmxlRGVidWdNb2RlZGVidWdQcmludF9kZWJ1Z1ByaW50ZGVidWdXcmFwUHJpbnRfZGVidWdXcmFwUHJpbnRzdGFydDplbmQ6ZGVidWdCcmVha3JlcG9ydEhlcmVfcmVwb3J0SGVyZUhFUkU6IHRyYWNrZG9UcmFja3ByaW50VHJhY2V0cmFjazogbGltaXR0aHJvd09uUHJpbnRpZlRyYWNrZWR0cmFja2VkOiBkYXJ0MmpzLmJhY2tlbmRfc3RyYXRlZ3lCYWNrZW5kU3RyYXRlZ3llbWl0dGVyVGFza291dHB1dFVuaXREYXRhY29kZWdlbmNyZWF0ZVNzYUJ1aWxkZXJzb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5Y3JlYXRlVHlwZXNJbmZlcnJlcmZvckVhY2hDb2RlZ2VuTWVtYmVycHJlcGFyZUNvZGVnZW5SZWFkZXJkYXJ0MmpzLmNvbW1vbi5jb2RlZ2VuRW1pdHRlckNvbnN0YW50VXNlRHluYW1pY1VzZVN0YXRpY1VzZVR5cGVVc2VXb3JsZEltcGFjdFZpc2l0b3JDb2RlZ2VuSW1wYWN0cmVhZEZyb21EYXRhU291cmNld3JpdGVUb0RhdGFTaW5rQ29kZWdlbkltcGFjdC53cml0ZVRvRGF0YVNpbmt0eXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2tzY29uc3RTeW1ib2xzc3BlY2lhbGl6ZWRHZXRJbnRlcmNlcHRvcnN1c2VzSW50ZXJjZXB0b3Jhc3luY01hcmtlcnNnZW5lcmljSW5zdGFudGlhdGlvbnNuYXRpdmVCZWhhdmlvcnNvbmVTaG90SW50ZXJjZXB0b3JzX0NvZGVnZW5JbXBhY3Rjb2RlZ2VuLWltcGFjdF90eXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2tzX2NvbnN0U3ltYm9sc19zcGVjaWFsaXplZEdldEludGVyY2VwdG9yc191c2VzSW50ZXJjZXB0b3JfYXN5bmNNYXJrZXJzX2dlbmVyaWNJbnN0YW50aWF0aW9uc19uYXRpdmVCZWhhdmlvcnNfbmF0aXZlTWV0aG9kc19vbmVTaG90SW50ZXJjZXB0b3JzZHluYW1pY1VzZXNzdGF0aWNVc2VzdHlwZVVzZXNjb25zdGFudFVzZXNyZWFkTGlzdGVtcHR5QXNOdWxscmVhZFN0cmluZ3NyZWFkQ2xhc3Nlc3JlYWRCb29sYXN5bmNNYXJrZXJzVmFsdWVyZWFkSW50T3JOdWxscmVhZE1lbWJlcnN1c2V3cml0ZVN0cmluZ3N3cml0ZUNsYXNzZXN3cml0ZUJvb2x3cml0ZUludE9yTnVsbGluc3RhbnRpYXRpb25iZWhhdmlvcndyaXRlTWVtYmVyc2FwcGx5dmlzaXRTdGF0aWNVc2V2aXNpdER5bmFtaWNVc2V2aXNpdFR5cGVVc2V2aXNpdENvbnN0YW50VXNlcmVnaXN0ZXJUeXBlVmFyaWFibGVCb3VuZHNTdWJ0eXBlQ2hlY2tyZWdpc3RlckNvbnN0U3ltYm9scmVnaXN0ZXJTcGVjaWFsaXplZEdldEludGVyY2VwdG9ycmVnaXN0ZXJVc2VJbnRlcmNlcHRvcnJlZ2lzdGVyQXN5bmNNYXJrZXJyZWdpc3RlckdlbmVyaWNJbnN0YW50aWF0aW9ucmVnaXN0ZXJOYXRpdmVCZWhhdmlvcm5hdGl2ZUJlaGF2aW9ycmVnaXN0ZXJOYXRpdmVNZXRob2RyZWdpc3Rlck9uZVNob3RJbnRlcmNlcHRvckNvZGVnZW5JbXBhY3Q6dGl0bGUKIAogIAogdXNlc0ludGVyY2VwdG9yOiB0cnVlQ29kZWdlblJlZ2lzdHJ5X2VsZW1lbnRFbnZpcm9ubWVudF93b3JsZEltcGFjdF9leHByZXNzaW9uc0NvZGVnZW5SZWdpc3RyeSBmb3IgcmVnaXN0ZXJJbnN0YW50aWF0ZWRDbGFzc3JlZ2lzdGVySW5zdGFudGlhdGlvbmdldFJhd1R5cGVyZWdpc3RlclN0YXRpY1VzZXN0YXRpY1VzZXJlZ2lzdGVyRHluYW1pY1VzZWR5bmFtaWNVc2VyZWdpc3RlclR5cGVVc2V0eXBlVXNlcmVnaXN0ZXJDb25zdGFudFVzZWNvbnN0YW50VXNlcmVnaXN0ZXJJbnN0YW50aWF0ZWRDbG9zdXJlcmVnaXN0ZXJNb2R1bGFyTmFtZXJlZ2lzdGVyTW9kdWxhckV4cHJlc3Npb25Db2RlZ2VuUmVzdWx0c2dldENvZGVnZW5SZXN1bHRzT25EZW1hbmRDb2RlZ2VuUmVzdWx0c19mdW5jdGlvbkNvbXBpbGVyRGVzZXJpYWxpemVkQ29kZWdlblJlc3VsdHNObyBjb2RlZ2VuIHJlc3VsdHMgZnJvbSBDb2RlZ2VuUmVzdWx0Y29kZWdlbi1yZXN1bHRpbXBhY3Rtb2R1bGFyTmFtZXNtb2R1bGFyRXhwcmVzc2lvbnNyZWFkSnNOb2RlT3JOdWxsd3JpdGVKc05vZGVPck51bGxhcHBseU1vZHVsYXJTdGF0ZW5hbWVyZW1pdHRlck1vZHVsYXJOYW1lS2luZC5ydGlGaWVsZHJ0aUZpZWxkSnNOYW1lTW9kdWxhck5hbWVLaW5kLnJ1bnRpbWVUeXBlTmFtZXJ1bnRpbWVUeXBlTmFtZU1vZHVsYXJOYW1lS2luZC5jbGFzc05hbWVNb2R1bGFyTmFtZUtpbmQuYWxpYXNlZFN1cGVyTWVtYmVyYWxpYXNlZFN1cGVyTWVtYmVyUHJvcGVydHlOYW1lTW9kdWxhck5hbWVLaW5kLnN0YXRpY0Nsb3N1cmVzdGF0aWNDbG9zdXJlTmFtZU1vZHVsYXJOYW1lS2luZC5tZXRob2RQcm9wZXJ0eW1ldGhvZFByb3BlcnR5TmFtZU1vZHVsYXJOYW1lS2luZC5vcGVyYXRvcklzb3BlcmF0b3JJc01vZHVsYXJOYW1lS2luZC5vcGVyYXRvcklzVHlwZW9wZXJhdG9ySXNUeXBlTW9kdWxhck5hbWVLaW5kLnN1YnN0aXR1dGlvbnN1YnN0aXR1dGlvbk5hbWVNb2R1bGFyTmFtZUtpbmQuaW5zdGFuY2VNZXRob2RpbnN0YW5jZU1ldGhvZE5hbWVNb2R1bGFyTmFtZUtpbmQuaW5zdGFuY2VGaWVsZGluc3RhbmNlRmllbGRQcm9wZXJ0eU5hbWVNb2R1bGFyTmFtZUtpbmQuaW52b2NhdGlvbmludm9jYXRpb25OYW1lTW9kdWxhck5hbWVLaW5kLmxhenlJbml0aWFsaXplcmxhenlJbml0aWFsaXplck5hbWVNb2R1bGFyTmFtZUtpbmQuZ2xvYmFsUHJvcGVydHlOYW1lRm9yQ2xhc3NnbG9iYWxQcm9wZXJ0eU5hbWVGb3JDbGFzc01vZHVsYXJOYW1lS2luZC5nbG9iYWxQcm9wZXJ0eU5hbWVGb3JUeXBlZ2xvYmFsUHJvcGVydHlOYW1lRm9yVHlwZU1vZHVsYXJOYW1lS2luZC5nbG9iYWxQcm9wZXJ0eU5hbWVGb3JNZW1iZXJnbG9iYWxQcm9wZXJ0eU5hbWVGb3JNZW1iZXJNb2R1bGFyTmFtZUtpbmQuZ2xvYmFsTmFtZUZvckludGVyZmFjZVR5cGVWYXJpYWJsZWdsb2JhbE5hbWVGb3JJbnRlcmZhY2VUeXBlVmFyaWFibGVNb2R1bGFyTmFtZUtpbmQubmFtZUZvckdldEludGVyY2VwdG9ybmFtZUZvckdldEludGVyY2VwdG9yTW9kdWxhck5hbWVLaW5kLm5hbWVGb3JPbmVTaG90SW50ZXJjZXB0b3JuYW1lRm9yT25lU2hvdEludGVyY2VwdG9yTW9kdWxhck5hbWVLaW5kLmFzTmFtZWFzTmFtZU1vZHVsYXJFeHByZXNzaW9uS2luZC5nbG9iYWxPYmplY3RGb3JMaWJyYXJ5cmVhZEdsb2JhbE9iamVjdEZvckxpYnJhcnl3aXRoU291cmNlSW5mb3JtYXRpb25Nb2R1bGFyRXhwcmVzc2lvbktpbmQuZ2xvYmFsT2JqZWN0Rm9yQ2xhc3NyZWFkR2xvYmFsT2JqZWN0Rm9yQ2xhc3NNb2R1bGFyRXhwcmVzc2lvbktpbmQuZ2xvYmFsT2JqZWN0Rm9yVHlwZXJlYWRHbG9iYWxPYmplY3RGb3JUeXBlTW9kdWxhckV4cHJlc3Npb25LaW5kLmdsb2JhbE9iamVjdEZvck1lbWJlcnJlYWRHbG9iYWxPYmplY3RGb3JNZW1iZXJNb2R1bGFyRXhwcmVzc2lvbktpbmQuY29uc3RhbnRjb25zdGFudFJlZmVyZW5jZU1vZHVsYXJFeHByZXNzaW9uS2luZC5lbWJlZGRlZEdsb2JhbEFjY2Vzc2dlbmVyYXRlRW1iZWRkZWRHbG9iYWxBY2Nlc3NDb2RlZ2VuUmVzdWx0KGNvZGU9PG51bGw+LGltcGFjdD1tb2R1bGFyTmFtZXM9bW9kdWxhckV4cHJlc3Npb25zPU1vZHVsYXJOYW1lS2luZHJ0aUZpZWxkYWxpYXNlZFN1cGVyTWVtYmVyc3RhdGljQ2xvc3VyZW1ldGhvZFByb3BlcnR5aW5zdGFuY2VNZXRob2RpbnN0YW5jZUZpZWxkbGF6eUluaXRpYWxpemVyTW9kdWxhck5hbWVtb2R1bGFyLW5hbWVyZWFkRW51bWRhdGFJc0NsYXNzRW50aXR5cmVhZFR5cGVWYXJpYWJsZXJlYWRTdHJpbmd3cml0ZUVudW13cml0ZUNsYXNzd3JpdGVUeXBlZGVmd3JpdGVUeXBlVmFyaWFibGV2YWx1ZSBub3Qgc2V0IGZvciBhbGxvd1JlbmFtZWNvbnRhaW5lZE5vZGVzTW9kdWxhck5hbWUoa2luZD0sIGRhdGE9LCB2YWx1ZT1fY2xvbmVNb2R1bGFyRXhwcmVzc2lvbktpbmRnbG9iYWxPYmplY3RGb3JMaWJyYXJ5Z2xvYmFsT2JqZWN0Rm9yQ2xhc3NnbG9iYWxPYmplY3RGb3JUeXBlZ2xvYmFsT2JqZWN0Rm9yTWVtYmVyZW1iZWRkZWRHbG9iYWxBY2Nlc3NNb2R1bGFyRXhwcmVzc2lvbm1vZHVsYXItZXhwcmVzc2lvbnJlYWRDb25zdGFudHdyaXRlTGlicmFyeXdyaXRlQ29uc3RhbnRwcmVjZWRlbmNlTGV2ZWxNb2R1bGFyRXhwcmVzc2lvbihraW5kPSxkYXRhPXRvU3RydWN0dXJlZFRleHQsdmFsdWU9SnNOb2RlS2luZEpzTm9kZUtpbmQuY29tbWVudEpzTm9kZUtpbmQuYXdhaXRKc05vZGVLaW5kLnJlZ0V4cExpdGVyYWxKc05vZGVLaW5kLnByb3BlcnR5SnNOb2RlS2luZC5vYmplY3RJbml0aWFsaXplckpzTm9kZUtpbmQuYXJyYXlIb2xlSnNOb2RlS2luZC5hcnJheUluaXRpYWxpemVySnNOb2RlS2luZC5wYXJlbnRoZXNlc0pzTm9kZUtpbmQubW9kdWxhck5hbWVKc05vZGVLaW5kLmFzeW5jTmFtZUpzTm9kZUtpbmQuc3RyaW5nQmFja2VkTmFtZUpzTm9kZUtpbmQuc3RyaW5nQ29uY2F0ZW5hdGlvbkpzTm9kZUtpbmQubGl0ZXJhbE51bGxKc05vZGVLaW5kLmxpdGVyYWxOdW1iZXJKc05vZGVLaW5kLmxpdGVyYWxTdHJpbmdKc05vZGVLaW5kLmxpdGVyYWxTdHJpbmdGcm9tTmFtZUpzTm9kZUtpbmQubGl0ZXJhbEJvb2xKc05vZGVLaW5kLm1vZHVsYXJFeHByZXNzaW9uSnNOb2RlS2luZC5mdW5jdGlvbkpzTm9kZUtpbmQubmFtZWRGdW5jdGlvbkpzTm9kZUtpbmQuYWNjZXNzSnNOb2RlS2luZC5wYXJhbWV0ZXJKc05vZGVLaW5kLnZhcmlhYmxlRGVjbGFyYXRpb25Kc05vZGVLaW5kLnRoaXNFeHByZXNzaW9uSnNOb2RlS2luZC52YXJpYWJsZVVzZUpzTm9kZUtpbmQucG9zdGZpeEpzTm9kZUtpbmQucHJlZml4SnNOb2RlS2luZC5iaW5hcnlKc05vZGVLaW5kLmNhbGxFeHByZXNzaW9uSnNOb2RlS2luZC5uZXdFeHByZXNzaW9uSnNOb2RlS2luZC5jb25kaXRpb25hbEpzTm9kZUtpbmQudmFyaWFibGVJbml0aWFsaXphdGlvbkpzTm9kZUtpbmQuYXNzaWdubWVudEpzTm9kZUtpbmQudmFyaWFibGVEZWNsYXJhdGlvbkxpc3RKc05vZGVLaW5kLmxpdGVyYWxFeHByZXNzaW9uSnNOb2RlS2luZC5kYXJ0WWllbGRKc05vZGVLaW5kLmxpdGVyYWxTdGF0ZW1lbnRKc05vZGVLaW5kLmxhYmVsZWRTdGF0ZW1lbnRKc05vZGVLaW5kLmZ1bmN0aW9uRGVjbGFyYXRpb25Kc05vZGVLaW5kLnN3aXRjaERlZmF1bHRKc05vZGVLaW5kLnN3aXRjaENhc2VKc05vZGVLaW5kLnN3aXRjaFN0YXRlbWVudEpzTm9kZUtpbmQuY2F0Y2hDbGF1c2VKc05vZGVLaW5kLnRyeVN0YXRlbWVudEpzTm9kZUtpbmQudGhyb3dTdGF0ZW1lbnRKc05vZGVLaW5kLnJldHVyblN0YXRlbWVudEpzTm9kZUtpbmQuYnJlYWtTdGF0ZW1lbnRKc05vZGVLaW5kLmNvbnRpbnVlU3RhdGVtZW50SnNOb2RlS2luZC5kb1N0YXRlbWVudEpzTm9kZUtpbmQud2hpbGVTdGF0ZW1lbnRKc05vZGVLaW5kLmZvckluU3RhdGVtZW50SnNOb2RlS2luZC5mb3JTdGF0ZW1lbnRKc05vZGVLaW5kLmlmU3RhdGVtZW50SnNOb2RlS2luZC5lbXB0eVN0YXRlbWVudEpzTm9kZUtpbmQuZXhwcmVzc2lvblN0YXRlbWVudEpzTm9kZUtpbmQuYmxvY2tKc05vZGVLaW5kLnByb2dyYW1yZWdFeHBMaXRlcmFscHJvcGVydHlvYmplY3RJbml0aWFsaXplcmFycmF5SG9sZWFycmF5SW5pdGlhbGl6ZXJwYXJlbnRoZXNlc21vZHVsYXJOYW1lYXN5bmNOYW1lc3RyaW5nQmFja2VkTmFtZXN0cmluZ0NvbmNhdGVuYXRpb25saXRlcmFsTnVtYmVybGl0ZXJhbFN0cmluZ0Zyb21OYW1lbW9kdWxhckV4cHJlc3Npb25uYW1lZEZ1bmN0aW9uYWNjZXNzdmFyaWFibGVEZWNsYXJhdGlvbnZhcmlhYmxlVXNlcG9zdGZpeGNhbGxFeHByZXNzaW9ubmV3RXhwcmVzc2lvbnZhcmlhYmxlSW5pdGlhbGl6YXRpb25hc3NpZ25tZW50dmFyaWFibGVEZWNsYXJhdGlvbkxpc3RsaXRlcmFsRXhwcmVzc2lvbmRhcnRZaWVsZGxpdGVyYWxTdGF0ZW1lbnRmdW5jdGlvbkRlY2xhcmF0aW9uc3dpdGNoRGVmYXVsdHN3aXRjaFN0YXRlbWVudHRocm93U3RhdGVtZW50Zm9ySW5TdGF0ZW1lbnRwcm9ncmFtSnNOb2RlVGFnc2pzLW5vZGVqcy1jb21tZW50anMtYXdhaXRqcy1yZWdFeHBMaXRlcmFsanMtcHJvcGVydHlqcy1vYmplY3RJbml0aWFsaXplcmpzLWFycmF5SG9sZWpzLWFycmF5SW5pdGlhbGl6ZXJqcy1wYXJlbnRoZXNlc2pzLW1vZHVsYXJOYW1lanMtYXN5bmNOYW1lanMtc3RyaW5nQmFja2VkTmFtZWpzLXN0cmluZ0NvbmNhdGVuYXRpb25qcy1saXRlcmFsTnVsbGpzLWxpdGVyYWxOdW1iZXJqcy1saXRlcmFsU3RyaW5nanMtbGl0ZXJhbFN0cmluZ0Zyb21OYW1lanMtbGl0ZXJhbEJvb2xqcy1tb2R1bGFyRXhwcmVzc2lvbmpzLWZ1bmN0aW9uanMtbmFtZWRGdW5jdGlvbmpzLWFjY2Vzc2pzLXBhcmFtZXRlcmpzLXZhcmlhYmxlRGVjbGFyYXRpb25qcy10aGlzRXhwcmVzc2lvbmpzLXZhcmlhYmxlVXNlanMtcG9zdGZpeGpzLXByZWZpeGpzLWJpbmFyeWpzLWNhbGxFeHByZXNzaW9uanMtbmV3RXhwcmVzc2lvbmpzLWNvbmRpdGlvbmFsanMtdmFyaWFibGVJbml0aWFsaXphdGlvbmpzLWFzc2lnbm1lbnRqcy12YXJpYWJsZURlY2xhcmF0aW9uTGlzdGpzLWxpdGVyYWxFeHByZXNzaW9uanMtZGFydFlpZWxkanMtbGl0ZXJhbFN0YXRlbWVudGpzLWxhYmVsZWRTdGF0ZW1lbnRqcy1mdW5jdGlvbkRlY2xhcmF0aW9uanMtc3dpdGNoRGVmYXVsdGpzLXN3aXRjaENhc2Vqcy1zd2l0Y2hTdGF0ZW1lbnRqcy1jYXRjaENsYXVzZWpzLXRyeVN0YXRlbWVudGpzLXRocm93U3RhdGVtZW50anMtcmV0dXJuU3RhdGVtZW50anMtYnJlYWtTdGF0ZW1lbnRqcy1jb250aW51ZVN0YXRlbWVudGpzLWRvU3RhdGVtZW50anMtd2hpbGVTdGF0ZW1lbnRqcy1mb3JJblN0YXRlbWVudGpzLWZvclN0YXRlbWVudGpzLWlmU3RhdGVtZW50anMtZW1wdHlTdGF0ZW1lbnRqcy1leHByZXNzaW9uU3RhdGVtZW50anMtYmxvY2tqcy1wcm9ncmFtSnNOb2RlU2VyaWFsaXplcnNlcmlhbGl6ZXJfd3JpdGVJbmZvd3JpdGVDYWNoZWR2aXNpdEludGVycG9sYXRlZERlY2xhcmF0aW9uSnNOb2RlU2VyaWFsaXplci52aXNpdEludGVycG9sYXRlZERlY2xhcmF0aW9udmlzaXRJbnRlcnBvbGF0ZWRTdGF0ZW1lbnRKc05vZGVTZXJpYWxpemVyLnZpc2l0SW50ZXJwb2xhdGVkU3RhdGVtZW50dmlzaXRJbnRlcnBvbGF0ZWRTZWxlY3RvcnZpc2l0SW50ZXJwb2xhdGVkUGFyYW1ldGVySnNOb2RlU2VyaWFsaXplci52aXNpdEludGVycG9sYXRlZFBhcmFtZXRlcnZpc2l0SW50ZXJwb2xhdGVkTGl0ZXJhbEpzTm9kZVNlcmlhbGl6ZXIudmlzaXRJbnRlcnBvbGF0ZWRMaXRlcmFsdmlzaXRJbnRlcnBvbGF0ZWRFeHByZXNzaW9uSnNOb2RlU2VyaWFsaXplci52aXNpdEludGVycG9sYXRlZEV4cHJlc3Npb252aXNpdENvbW1lbnR2aXNpdEF3YWl0dmlzaXRSZWdFeHBMaXRlcmFsdmlzaXRQcm9wZXJ0eXZpc2l0T2JqZWN0SW5pdGlhbGl6ZXJwcm9wZXJ0aWVzaXNPbmVMaW5lcnZpc2l0QXJyYXlIb2xldmlzaXRBcnJheUluaXRpYWxpemVydmlzaXRQYXJlbnRoZXNlc2VuY2xvc2VkVW5leHBlY3RlZCBkZWZlcnJlZCBleHByZXNzaW9uOiB2aXNpdExpdGVyYWxOdWxsdmlzaXRMaXRlcmFsTnVtYmVydmlzaXRMaXRlcmFsU3RyaW5ndmlzaXRMaXRlcmFsQm9vbHZpc2l0RGVmZXJyZWRTdHJpbmdKc05vZGVTZXJpYWxpemVyLnZpc2l0RGVmZXJyZWRTdHJpbmd2aXNpdERlZmVycmVkTnVtYmVySnNOb2RlU2VyaWFsaXplci52aXNpdERlZmVycmVkTnVtYmVydmlzaXREZWZlcnJlZEV4cHJlc3Npb252aXNpdEZ1bnZpc2l0TmFtZWRGdW5jdGlvbnZpc2l0QWNjZXNzdmlzaXRQYXJhbWV0ZXJ2aXNpdFRoaXN2aXNpdFZhcmlhYmxlVXNldmlzaXRQb3N0Zml4dmlzaXRQcmVmaXh2aXNpdEJpbmFyeXZpc2l0Q2FsbHZpc2l0TmV3dmlzaXRDb25kaXRpb25hbHZpc2l0VmFyaWFibGVJbml0aWFsaXphdGlvbnZpc2l0QXNzaWdubWVudGxlZnRIYW5kU2lkZXdyaXRlU3RyaW5nT3JOdWxsdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uTGlzdGluZGVudFNwbGl0c3Zpc2l0TGl0ZXJhbEV4cHJlc3Npb252aXNpdERhcnRZaWVsZGhhc1N0YXJ2aXNpdExpdGVyYWxTdGF0ZW1lbnR2aXNpdERlZmF1bHR2aXNpdENhc2V2aXNpdFN3aXRjaHZpc2l0VHJ5Y2F0Y2hQYXJ0ZmluYWxseVBhcnR2aXNpdFJldHVybnZpc2l0QnJlYWt0YXJnZXRMYWJlbHZpc2l0Q29udGludWV2aXNpdERvdmlzaXRXaGlsZXZpc2l0Rm9ySW52aXNpdEZvcnZpc2l0SWZ2aXNpdFByb2dyYW1Kc05vZGVEZXNlcmlhbGl6ZXJkZXNlcmlhbGl6ZXJoYXNWYWx1ZXJlYWRWYWx1ZU9yTnVsbHJlYWRTdHJpbmdPck51bGxyZWFkQ2FjaGVkQ29kZWdlblJlYWRlckltcGxyZWFkQWJzdHJhY3RWYWx1ZWFic3RyYWN0VmFsdWVEb21haW5yZWFkQWJzdHJhY3RWYWx1ZUZyb21EYXRhU291cmNlcmVhZEpzTm9kZXJlYWRPdXRwdXRVbml0UmVmZXJlbmNlb3V0cHV0VW5pdHNyZWFkSW50Q29kZWdlbldyaXRlckltcGx3cml0ZUFic3RyYWN0VmFsdWV3cml0ZUFic3RyYWN0VmFsdWVUb0RhdGFTaW5rd3JpdGVKc05vZGV3cml0ZU91dHB1dFVuaXRSZWZlcmVuY2V3cml0ZUludGRhcnQyanMuY29tbW9uLm5hbWVzUHVibGljTmFtZUNhbGxTdHJ1Y3R1cmVJZGVudGlmaWVyc25vU3VjaE1ldGhvZF9ydW50aW1lVHlwZV86c2lnbmF0dXJlSlNKU19CVUlMVElOSlNfRU1CRURERURfR0xPQkFMSlNfSU5URVJDRVBUT1JfQ09OU1RBTlRKU19TVFJJTkdfQ09OQ0FUREFSVF9DTE9TVVJFX1RPX0pTTmFtZXNkeW5hbWljX3RvU3RyaW5nX0lOREVYX05BTUVJTkRFWF9TRVRfTkFNRUNBTExfTkFNRWdlbmVyaWNJbnN0YW50aWF0aW9uaW5zdGFudGlhdGVub1N1Y2hNZXRob2RHZXR0ZXJ0b1N0cmluZ0dldHRlcmhhc2hDb2RlX0FMTGRhcnRfYXN5bmNkYXJ0X2NvbGxlY3Rpb25jb2xsZWN0aW9uZGFydF9jb3JlZGFydF9odG1saHRtbGRhcnRfaHRtbF9jb21tb25odG1sX2NvbW1vbmRhcnRfaW5kZXhlZF9kYmluZGV4ZWRfZGJkYXJ0X2lzb2xhdGVpc29sYXRlZGFydF9tYXRoZGFydF9taXJyb3JzZGFydF9faW50ZXJuYWxkYXJ0X19uYXRpdmVfdHlwZWRfZGF0YV9uYXRpdmVfdHlwZWRfZGF0YWRhcnRfdHlwZWRfZGF0YXR5cGVkX2RhdGFkYXJ0X3N2Z3N2Z2RhcnRfd2ViX2F1ZGlvd2ViX2F1ZGlvZGFydF93ZWJfZ2x3ZWJfZ2xkYXJ0X3dlYl9zcWx3ZWJfc3FsZGFydF9fanNfaGVscGVyX2pzX2hlbHBlcmRhcnRfX3J0aV9ydGlkYXJ0X19pbnRlcmNlcHRvcnNfaW50ZXJjZXB0b3JzZGFydF9fZm9yZWlnbl9oZWxwZXJfZm9yZWlnbl9oZWxwZXJkYXJ0X19qc19uYW1lc19qc19uYW1lc2RhcnRfX2pzX2VtYmVkZGVkX25hbWVzX2pzX2VtYmVkZGVkX25hbWVzcGFja2FnZV9qc2pzL2pzLmRhcnRwYWNrYWdlX21ldGFfZGFydDJqc21ldGEvZGFydDJqcy5kYXJ0ZGFydDJqcy5jb21tb24ud29ya01lbWJlckVudGl0eWRhcnQyanMudHlwZV9zeXN0ZW1jb25zdGFudF9zeXN0ZW1OYXRpdmVCYXNpY0RhdGFDb21tb25FbGVtZW50c3Jlc291cmNlQ2xhc3N1bm1vZGlmaWFibGVTZXRDbGFzc3R5cGVkRGF0YUxpYnJhcnlqc0hlbHBlckxpYnJhcnlpbnRlcmNlcHRvcnNMaWJyYXJ5Zm9yZWlnbkxpYnJhcnlydGlMaWJyYXJ5aW50ZXJuYWxMaWJyYXJ5dHlwZWREYXRhQ2xhc3NzeW1ib2xDb25zdHJ1Y3RvclRhcmdldGlzU3ltYm9sQ29uc3RydWN0b3JpZGVudGljYWxGdW5jdGlvbmlzRnVuY3Rpb25BcHBseU1ldGhvZHR5cGVMaXRlcmFsVHlwZWlzTnVtYmVyT3JTdHJpbmdTdXBlcnR5cGVpc1N0cmluZ09ubHlTdXBlcnR5cGVpc0xpc3RTdXBlcnR5cGVnZXRDb25zdGFudE1hcFR5cGVGb3Jzb3VyY2VUeXBlaGFzUHJvdG9LZXlvbmx5U3RyaW5nS2V5c2dldENvbnN0YW50U2V0VHlwZUZvcnN5bWJvbEZpZWxkc3ltYm9sSW1wbGVtZW50YXRpb25UeXBlbWFwTGl0ZXJhbENsYXNzbWFwTGl0ZXJhbENvbnN0cnVjdG9ybWFwTGl0ZXJhbENvbnN0cnVjdG9yRW1wdHltYXBMaXRlcmFsVW50eXBlZE1ha2VybWFwTGl0ZXJhbFVudHlwZWRFbXB0eU1ha2Vyc2V0TGl0ZXJhbENsYXNzc2V0TGl0ZXJhbENvbnN0cnVjdG9yc2V0TGl0ZXJhbENvbnN0cnVjdG9yRW1wdHlzZXRMaXRlcmFsVW50eXBlZE1ha2Vyc2V0TGl0ZXJhbFVudHlwZWRFbXB0eU1ha2Vyb2JqZWN0Tm9TdWNoTWV0aG9kaXNEZWZhdWx0Tm9TdWNoTWV0aG9kSW1wbGVtZW50YXRpb25hc3luY0hlbHBlclN0YXJ0U3luY2FzeW5jSGVscGVyQXdhaXRhc3luY0hlbHBlclJldHVybmFzeW5jSGVscGVyUmV0aHJvd3dyYXBCb2R5eWllbGRTdGFyeWllbGRTaW5nbGVzeW5jU3RhclVuY2F1Z2h0RXJyb3Jhc3luY1N0YXJIZWxwZXJzdHJlYW1PZkNvbnRyb2xsZXJlbmRPZkl0ZXJhdGlvbnN5bmNTdGFySXRlcmFibGVmdXR1cmVJbXBsZW1lbnRhdGlvbmNvbnRyb2xsZXJTdHJlYW1zdHJlYW1JdGVyYXRvcnN0cmVhbUl0ZXJhdG9yQ29uc3RydWN0b3JzeW5jU3Rhckl0ZXJhYmxlRmFjdG9yeWFzeW5jQXdhaXRDb21wbGV0ZXJGYWN0b3J5YXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckZhY3Rvcnlqc0ludGVyY2VwdG9yQ2xhc3Nqc1N0cmluZ0NsYXNzanNBcnJheUNsYXNzanNOdW1iZXJDbGFzc2pzSW50Q2xhc3Nqc0RvdWJsZUNsYXNzanNOdWxsQ2xhc3Nqc0Jvb2xDbGFzc2pzUGxhaW5KYXZhU2NyaXB0T2JqZWN0Q2xhc3Nqc1Vua25vd25KYXZhU2NyaXB0T2JqZWN0Q2xhc3Nqc0phdmFTY3JpcHRGdW5jdGlvbkNsYXNzanNKYXZhU2NyaXB0T2JqZWN0Q2xhc3Nqc0luZGV4YWJsZUNsYXNzanNNdXRhYmxlSW5kZXhhYmxlQ2xhc3Nqc011dGFibGVBcnJheUNsYXNzanNGaXhlZEFycmF5Q2xhc3Nqc0V4dGVuZGFibGVBcnJheUNsYXNzanNVbm1vZGlmaWFibGVBcnJheUNsYXNzanNQb3NpdGl2ZUludENsYXNzanNVSW50MzJDbGFzc2pzVUludDMxQ2xhc3Npc0ZpbmRJbmRleEZvck5hdGl2ZVN1YmNsYXNzVHlwZWdldE5hdGl2ZUludGVyY2VwdG9yTWV0aG9kanNBcnJheVR5cGVkQ29uc3RydWN0b3JmaW5kSGVscGVyRnVuY3Rpb25jbG9zdXJlQ2xhc3Nib3VuZENsb3N1cmVDbGFzc3R5cGVMaXRlcmFsQ2xhc3Njb25zdE1hcExpdGVyYWxDbGFzc2NvbnN0U2V0TGl0ZXJhbENsYXNzdHlwZVZhcmlhYmxlQ2xhc3Nqc0ludm9jYXRpb25NaXJyb3JDbGFzc2ludm9jYXRpb25UeXBlQXJndW1lbnRHZXR0ZXJqc0luZGV4aW5nQmVoYXZpb3JJbnRlcmZhY2VzdGFja1RyYWNlSGVscGVyQ2xhc3Njb25zdGFudE1hcENsYXNzY29uc3RhbnRTdHJpbmdNYXBDbGFzc2NvbnN0YW50UHJvdG9NYXBDbGFzc2dlbmVyYWxDb25zdGFudE1hcENsYXNzYW5ub3RhdGlvbkNyZWF0ZXNDbGFzc2Fubm90YXRpb25SZXR1cm5zQ2xhc3Nhbm5vdGF0aW9uSlNOYW1lQ2xhc3NuYXRpdmVBbm5vdGF0aW9uQ2xhc3N0eXBlVmFyaWFibGVDb25zdHJ1Y3RvcmFzc2VydFRlc3Rhc3NlcnRUaHJvd2Fzc2VydEhlbHBlcmFzc2VydFVucmVhY2hhYmxlTWV0aG9kZ2V0SXNvbGF0ZUFmZmluaXR5VGFnTWFya2VycmVxdWlyZXNQcmVhbWJsZU1hcmtlcmxvYWRMaWJyYXJ5V3JhcHBlcmxvYWREZWZlcnJlZExpYnJhcnlib29sQ29udmVyc2lvbkNoZWNrdHJhY2VIZWxwZXJjbG9zdXJlRnJvbVRlYXJPZmZpc0pzSW5kZXhhYmxldGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb250aHJvd0luZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbmV4Y2VwdGlvblVud3JhcHBlcnRocm93UnVudGltZUVycm9ydGhyb3dVbnN1cHBvcnRlZEVycm9ydGhyb3dUeXBlRXJyb3J0aHJvd0Fic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3JjaGVja0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcnRocm93Q29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yc3RyaW5nSW50ZXJwb2xhdGlvbkhlbHBlcndyYXBFeGNlcHRpb25IZWxwZXJ0aHJvd0V4cHJlc3Npb25IZWxwZXJjbG9zdXJlQ29udmVydGVydHJhY2VGcm9tRXhjZXB0aW9uc2V0UnVudGltZVR5cGVJbmZvZ2V0UnVudGltZVR5cGVJbmZvZ2V0VHlwZUFyZ3VtZW50QnlJbmRleGNvbXB1dGVTaWduYXR1cmVnZXRSdW50aW1lVHlwZUFyZ3VtZW50c2dldFJ1bnRpbWVUeXBlQXJndW1lbnRnZXRSdW50aW1lVHlwZUFyZ3VtZW50SW50ZXJjZXB0ZWRhc3NlcnRJc1N1YnR5cGVjaGVja1N1YnR5cGVhc3NlcnRTdWJ0eXBlc3VidHlwZUNhc3RmdW5jdGlvblR5cGVUZXN0ZnV0dXJlT3JUZXN0Y2hlY2tTdWJ0eXBlT2ZSdW50aW1lVHlwZWFzc2VydFN1YnR5cGVPZlJ1bnRpbWVUeXBlc3VidHlwZU9mUnVudGltZVR5cGVDYXN0Y2hlY2tEZWZlcnJlZElzTG9hZGVkdGhyb3dOb1N1Y2hNZXRob2RjcmVhdGVSdW50aW1lVHlwZWZhbGxUaHJvdWdoRXJyb3JjcmVhdGVJbnZvY2F0aW9uTWlycm9yY3JlYXRlVW5tYW5nbGVkSW52b2NhdGlvbk1pcnJvcmN5Y2xpY1Rocm93SGVscGVyZGVmaW5lUHJvcGVydHlpc0V4dHJhY3RUeXBlQXJndW1lbnRzZ2V0SW5zdGFudGlhdGlvbkNsYXNzZ2V0SW5zdGFudGlhdGVGdW5jdGlvbmluc3RhbnRpYXRlZEdlbmVyaWNGdW5jdGlvblR5cGVleHRyYWN0RnVuY3Rpb25UeXBlT2JqZWN0RnJvbUludGVybmFsZmluZFR5cGVpbnN0YW5jZVR5cGV0eXBlTGl0ZXJhbE1ha2VyY2hlY2tUeXBlQm91bmRydGlBc0ZpZWxkcnRpQ2hlY2tGaWVsZHJ0aUlzRmllbGRydGlFdmFsTWV0aG9kcnRpQmluZE1ldGhvZHJ0aUFkZFJ1bGVzTWV0aG9kZ2VuZXJhbElzVGVzdEltcGxlbWVudGF0aW9uZ2VuZXJhbEFzQ2hlY2tJbXBsZW1lbnRhdGlvbmdlbmVyYWxUeXBlQ2hlY2tJbXBsZW1lbnRhdGlvbnNwZWNpYWxpemVkSXNCb29sc3BlY2lhbGl6ZWRBc0Jvb2xOdWxsYWJsZXNwZWNpYWxpemVkQ2hlY2tCb29sTnVsbGFibGVzcGVjaWFsaXplZEFzRG91YmxlTnVsbGFibGVzcGVjaWFsaXplZENoZWNrRG91YmxlTnVsbGFibGVzcGVjaWFsaXplZElzSW50c3BlY2lhbGl6ZWRBc0ludE51bGxhYmxlc3BlY2lhbGl6ZWRDaGVja0ludE51bGxhYmxlc3BlY2lhbGl6ZWRJc051bXNwZWNpYWxpemVkQXNOdW1OdWxsYWJsZXNwZWNpYWxpemVkQ2hlY2tOdW1OdWxsYWJsZXNwZWNpYWxpemVkSXNTdHJpbmdzcGVjaWFsaXplZEFzU3RyaW5nTnVsbGFibGVzcGVjaWFsaXplZENoZWNrU3RyaW5nTnVsbGFibGVzeW1ib2xJbXBsZW1lbnRhdGlvbkNsYXNzZXh0ZXJuYWxOYW1lQ2xhc3NleHRlcm5hbE5hbWVUeXBlc3ltYm9sVmFsaWRhdGVkQ29uc3RydWN0b3Jqc0dldE5hbWVFbnVtaXNGb3JlaWduSGVscGVyZ2V0RGVmYXVsdFN1cGVyY2xhc3NuYXRpdmVCYXNpY0RhdGFLQ29tbW9uRWxlbWVudHNqc0Fubm90YXRpb25DbGFzc2pzQW5vbnltb3VzQ2xhc3NwcmFnbWFDbGFzc05hbWVGaWVsZHByYWdtYUNsYXNzT3B0aW9uc0ZpZWxkaXNDcmVhdGVJbnZvY2F0aW9uTWlycm9ySGVscGVyaXNTeW1ib2xWYWxpZGF0ZWRDb25zdHJ1Y3Rvcm1ldGFOb0lubGluZUNsYXNzbWV0YVRyeUlubGluZUNsYXNzaXNFeHRlcm5hbEFsbG93ZWRKQ29tbW9uRWxlbWVudHNpc1VubmFtZWRMaXN0Q29uc3RydWN0b3Jpc0ZpbGxlZExpc3RDb25zdHJ1Y3RvcmlzRGVmYXVsdEVxdWFsaXR5SW1wbGVtZW50YXRpb25hcHBsaWVzVG9Kc0luZGV4YWJsZUxlbmd0aGpzQXJyYXlSZW1vdmVMYXN0anNBcnJheUFkZGlzSnNTdHJpbmdTcGxpdGFwcGxpZXNUb0pzU3RyaW5nU3BsaXRqc1N0cmluZ1NwbGl0anNTdHJpbmdUb1N0cmluZ2pzU3RyaW5nT3BlcmF0b3JBZGRqc0NvbnN0Q2xhc3Npc0NoZWNrSW50aXNDaGVja051bWlzQ2hlY2tTdHJpbmdpc0luc3RhbnRpYXRpb25DbGFzc3R5cGVkQXJyYXlPZkludENsYXNzdHlwZWRBcnJheU9mRG91YmxlQ2xhc3Nqc0J1aWx0aW5FbnVtaXNGb3JlaWdub3BlcmF0b3JFcUhhbmRsZXNOdWxsQXJndW1lbnRDb21tb25FbGVtZW50c0ltcGxfZW52X29wdGlvbnNfcmVzb3VyY2VDbGFzc191bm1vZGlmaWFibGVTZXRDbGFzc190eXBlZERhdGFMaWJyYXJ5X2pzSGVscGVyTGlicmFyeV9pbnRlcmNlcHRvcnNMaWJyYXJ5X2ZvcmVpZ25MaWJyYXJ5X3J0aUxpYnJhcnlfaW50ZXJuYWxMaWJyYXJ5X3R5cGVkRGF0YUNsYXNzX3N5bWJvbENvbnN0cnVjdG9yVGFyZ2V0X2NvbXB1dGVkU3ltYm9sQ29uc3RydWN0b3JEZXBlbmRlbmNpZXNfc3ltYm9sQ29uc3RydWN0b3JJbXBsZW1lbnRhdGlvblRhcmdldF9pZGVudGljYWxGdW5jdGlvbl9tYXBMaXRlcmFsQ2xhc3NfbWFwTGl0ZXJhbENvbnN0cnVjdG9yX21hcExpdGVyYWxDb25zdHJ1Y3RvckVtcHR5X21hcExpdGVyYWxVbnR5cGVkTWFrZXJfbWFwTGl0ZXJhbFVudHlwZWRFbXB0eU1ha2VyX3NldExpdGVyYWxDbGFzc19zZXRMaXRlcmFsQ29uc3RydWN0b3Jfc2V0TGl0ZXJhbENvbnN0cnVjdG9yRW1wdHlfc2V0TGl0ZXJhbFVudHlwZWRNYWtlcl9zZXRMaXRlcmFsVW50eXBlZEVtcHR5TWFrZXJfb2JqZWN0Tm9TdWNoTWV0aG9kX3N5bmNTdGFySXRlcmFibGVGYWN0b3J5X2FzeW5jQXdhaXRDb21wbGV0ZXJGYWN0b3J5X2FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJGYWN0b3J5X2pzSW50ZXJjZXB0b3JDbGFzc19qc1N0cmluZ0NsYXNzX2pzQXJyYXlDbGFzc19qc051bWJlckNsYXNzX2pzSW50Q2xhc3NfanNEb3VibGVDbGFzc19qc051bGxDbGFzc19qc0Jvb2xDbGFzc19qc1BsYWluSmF2YVNjcmlwdE9iamVjdENsYXNzX2pzVW5rbm93bkphdmFTY3JpcHRPYmplY3RDbGFzc19qc0phdmFTY3JpcHRGdW5jdGlvbkNsYXNzX2pzSmF2YVNjcmlwdE9iamVjdENsYXNzX2pzSW5kZXhhYmxlQ2xhc3NfanNNdXRhYmxlSW5kZXhhYmxlQ2xhc3NfanNNdXRhYmxlQXJyYXlDbGFzc19qc0ZpeGVkQXJyYXlDbGFzc19qc0V4dGVuZGFibGVBcnJheUNsYXNzX2pzVW5tb2RpZmlhYmxlQXJyYXlDbGFzc19qc1Bvc2l0aXZlSW50Q2xhc3NfanNVSW50MzJDbGFzc19qc1VJbnQzMUNsYXNzX2dldE5hdGl2ZUludGVyY2VwdG9yTWV0aG9kX2pzQXJyYXlUeXBlZENvbnN0cnVjdG9yX2pzQXJyYXlSZW1vdmVMYXN0X2pzQXJyYXlBZGRfanNTdHJpbmdTcGxpdF9qc1N0cmluZ1RvU3RyaW5nX2pzU3RyaW5nT3BlcmF0b3JBZGRfanNDb25zdENsYXNzX2pzQW5ub3RhdGlvbkNsYXNzX2pzQW5vbnltb3VzQ2xhc3NfY2xvc3VyZUNsYXNzX2JvdW5kQ2xvc3VyZUNsYXNzX3R5cGVMaXRlcmFsQ2xhc3NfY29uc3RNYXBMaXRlcmFsQ2xhc3NfY29uc3RTZXRMaXRlcmFsQ2xhc3NfdHlwZVZhcmlhYmxlQ2xhc3NfcHJhZ21hQ2xhc3NOYW1lRmllbGRfcHJhZ21hQ2xhc3NPcHRpb25zRmllbGRfanNJbnZvY2F0aW9uTWlycm9yQ2xhc3NfaW52b2NhdGlvblR5cGVBcmd1bWVudEdldHRlcl9qc0luZGV4aW5nQmVoYXZpb3JJbnRlcmZhY2VfbmF0aXZlQW5ub3RhdGlvbkNsYXNzX3R5cGVWYXJpYWJsZUNvbnN0cnVjdG9yX2Fzc2VydFRlc3RfYXNzZXJ0VGhyb3dfYXNzZXJ0SGVscGVyX2Fzc2VydFVucmVhY2hhYmxlTWV0aG9kX2dldElzb2xhdGVBZmZpbml0eVRhZ01hcmtlcl9yZXF1aXJlc1ByZWFtYmxlTWFya2VyX2NhY2hlZENoZWNrQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yX2ZpbmRUeXBlX2luc3RhbmNlVHlwZV90eXBlTGl0ZXJhbE1ha2VyX2NoZWNrVHlwZUJvdW5kX3J0aUFzRmllbGRfcnRpSXNGaWVsZF9ydGlDaGVja0ZpZWxkX3J0aUV2YWxNZXRob2RfcnRpQmluZE1ldGhvZF9ydGlBZGRSdWxlc01ldGhvZF9nZW5lcmFsSXNUZXN0SW1wbGVtZW50YXRpb25fZ2VuZXJhbEFzQ2hlY2tJbXBsZW1lbnRhdGlvbl9nZW5lcmFsVHlwZUNoZWNrSW1wbGVtZW50YXRpb25fc3ltYm9sSW1wbGVtZW50YXRpb25DbGFzc19leHRlcm5hbE5hbWVDbGFzc19zeW1ib2xJbXBsZW1lbnRhdGlvbkZpZWxkX3N5bWJvbFZhbGlkYXRlZENvbnN0cnVjdG9yX3R5cGVkQXJyYXlPZkludENsYXNzX3R5cGVkQXJyYXlPZkRvdWJsZUNsYXNzX2pzR2V0TmFtZUVudW1fanNCdWlsdGluRW51bV9tZXRhQW5ub3RhdGlvbkNoZWNrZWRfbWV0YU5vSW5saW5lQ2xhc3NfbWV0YVRyeUlubGluZUNsYXNzX2ZpbmRDbGFzc1Jlc291cmNlbG9va3VwTGlicmFyeU5hdGl2ZVR5cGVkRGF0YV9maW5kQ29uc3RydWN0b3JfZW5zdXJlU3ltYm9sQ29uc3RydWN0b3JEZXBlbmRlbmNpZXNfZmluZExpYnJhcnlNZW1iZXJmaWxsZWRfZ2V0UmF3VHlwZV9jcmVhdGVJbnRlcmZhY2VUeXBlQ29tcGFyYWJsZVBhdHRlcm5sb29rdXBDbGFzc2xvb2t1cExpYnJhcnlNZW1iZXJfZmluZENsYXNzTWVtYmVybG9va3VwTG9jYWxDbGFzc01lbWJlcmNyZWF0ZUludGVyZmFjZVR5cGVjbGFzc0VsZW1lbnR0cmVhdEFzUmF3c3ltYm9sSW1wbGVtZW50YXRpb25GaWVsZExpbmtlZEhhc2hNYXBfZW5zdXJlTWFwTGl0ZXJhbEhlbHBlcnNfbGl0ZXJhbF9lbXB0eV9tYWtlTGl0ZXJhbF9tYWtlRW1wdHlMaW5rZWRIYXNoU2V0X2Vuc3VyZVNldExpdGVyYWxIZWxwZXJzX2ZpbmRBc3luY0hlbHBlckNsYXNzX2ZpbmRBc3luY0hlbHBlckZ1bmN0aW9uX2FzeW5jU3RhcnRTeW5jX2FzeW5jQXdhaXRfYXN5bmNSZXR1cm5fYXN5bmNSZXRocm93X3dyYXBKc0Z1bmN0aW9uRm9yQXN5bmNfSXRlcmF0aW9uTWFya2VydW5jYXVnaHRFcnJvcl9hc3luY1N0YXJIZWxwZXJfc3RyZWFtT2ZDb250cm9sbGVyX1N5bmNTdGFySXRlcmFibGVfRnV0dXJlX0NvbnRyb2xsZXJTdHJlYW1TdHJlYW1JdGVyYXRvcl9tYWtlU3luY1N0YXJJdGVyYWJsZV9tYWtlQXN5bmNBd2FpdENvbXBsZXRlcl9tYWtlQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcl9maW5kSW50ZXJjZXB0b3JzQ2xhc3NfZmluZEludGVyY2VwdG9yc0Z1bmN0aW9uSW50ZXJjZXB0b3JKU1N0cmluZ0pTQXJyYXlKU051bWJlckpTSW50SlNEb3VibGVKU051bGxKU0Jvb2xQbGFpbkphdmFTY3JpcHRPYmplY3RVbmtub3duSmF2YVNjcmlwdE9iamVjdEphdmFTY3JpcHRGdW5jdGlvbkphdmFTY3JpcHRPYmplY3RKU0luZGV4YWJsZUpTTXV0YWJsZUluZGV4YWJsZUpTTXV0YWJsZUFycmF5SlNGaXhlZEFycmF5SlNFeHRlbmRhYmxlQXJyYXlKU1VubW9kaWZpYWJsZUFycmF5SlNQb3NpdGl2ZUludEpTVUludDMySlNVSW50MzFmaW5kSW5kZXhGb3JOYXRpdmVTdWJjbGFzc1R5cGVnZXROYXRpdmVJbnRlcmNlcHRvcmlzQ2FsbHR5cGVkX2lzSnNTdHJpbmdDbGFzc2FwcGxpZXNpc1RhcmdldGluZ01lbWJlcmlzUG90ZW50aWFsbHlUcnVlSlNfQ09OU1RfQW5vbnltb3VzX2ZpbmRIZWxwZXJGdW5jdGlvbl9maW5kSGVscGVyQ2xhc3NDbG9zdXJlQm91bmRDbG9zdXJlX2ZpbmRSdGlDbGFzc19UeXBlVHlwZUltcGxDb25zdGFudE1hcEpTSW52b2NhdGlvbk1pcnJvckphdmFTY3JpcHRJbmRleGluZ0JlaGF2aW9yX1N0YWNrVHJhY2VDb25zdGFudFN0cmluZ01hcENvbnN0YW50UHJvdG9NYXBHZW5lcmFsQ29uc3RhbnRNYXBDcmVhdGVzUmV0dXJuc0pTTmFtZU5hdGl2ZWFzc2VydFVucmVhY2hhYmxlZ2V0SXNvbGF0ZUFmZmluaXR5VGFncmVxdWlyZXNQcmVhbWJsZV9sb2FkTGlicmFyeVdyYXBwZXJpYWVpb29yZXVud3JhcEV4Y2VwdGlvbmlzRnVuY3Rpb25jaGVja0ludGNoZWNrTnVtY2hlY2tTdHJpbmd3cmFwRXhjZXB0aW9uY29udmVydERhcnRDbG9zdXJlVG9KU2dldFRyYWNlRnJvbUV4Y2VwdGlvbl9maW5kUnRpRnVuY3Rpb25fY3JlYXRlUnVudGltZVR5cGVnZXRGYWxsVGhyb3VnaEVycm9yX2NyZWF0ZUludm9jYXRpb25NaXJyb3J0aHJvd0N5Y2xpY0luaXRleHRyYWN0VHlwZUFyZ3VtZW50c19jaGVja1R5cGVBcmd1bWVudENvdW50VW5zdXBwb3J0ZWQgaW5zdGFudGlhdGlvbiBhcmd1bWVudCBjb3VudDogdHlwZUxpdGVyYWxfcnRpSW1wbENsYXNzUnRpX3J0aVVuaXZlcnNlQ2xhc3NfVW5pdmVyc2VfZmluZFJ0aUNsYXNzRmllbGRfYXNfaXNfY2hlY2tfZXZhbF9iaW5kYWRkUnVsZXNfaXNCb29sX2FzQm9vbE51bGxhYmxlX2NoZWNrQm9vbE51bGxhYmxlX2FzRG91YmxlTnVsbGFibGVfY2hlY2tEb3VibGVOdWxsYWJsZV9pc0ludF9hc0ludE51bGxhYmxlX2NoZWNrSW50TnVsbGFibGVfaXNOdW1fYXNOdW1OdWxsYWJsZV9jaGVja051bU51bGxhYmxlX2lzU3RyaW5nX2FzU3RyaW5nTnVsbGFibGVfY2hlY2tTdHJpbmdOdWxsYWJsZXZhbGlkYXRlZE5hdGl2ZVR5cGVkQXJyYXlPZkludE5hdGl2ZVR5cGVkQXJyYXlPZkRvdWJsZUpzR2V0TmFtZUpzQnVpbHRpbl9lbnN1cmVNZXRhQW5ub3RhdGlvbnNfTm9JbmxpbmVfVHJ5SW5saW5laXNGcm9tRW52aXJvbm1lbnRDb25zdHJ1Y3RvclVuZXhwZWN0ZWQgZnVuY3Rpb24gaXNKc0ludGVyb3BDbGFzc2lzTmF0aXZlQ2xhc3NtYWluTGlicmFyeWZvckVhY2hMaWJyYXJ5TWVtYmVybG9va3VwQ2xhc3NNZW1iZXJnZXRTdXBlckNsYXNzZm9yRWFjaExvY2FsQ2xhc3NNZW1iZXJmb3JFYWNoQ2xhc3NNZW1iZXJmb3JFYWNoQ29uc3RydWN0b3Jza2lwVW5uYW1lZE1peGluQXBwbGljYXRpb25zZm9yRWFjaFN1cGVydHlwZWdldFRoaXNUeXBlaXNHZW5lcmljQ2xhc3Npc1VubmFtZWRNaXhpbkFwcGxpY2F0aW9uZ2V0VHlwZVZhcmlhYmxlQm91bmRnZXRGdW5jdGlvblR5cGVnZXRGdW5jdGlvblR5cGVWYXJpYWJsZXNnZXRMb2NhbEZ1bmN0aW9uVHlwZWdldEZpZWxkVHlwZWdldFVuYWxpYXNlZFR5cGVpc0VudW1DbGFzc0tFbGVtZW50RW52aXJvbm1lbnRmb3JFYWNoTWl4aW5nZXRGaWVsZENvbnN0YW50Rm9yVGVzdGluZ2lzRGVmZXJyZWRMb2FkTGlicmFyeUdldHRlcmdldEltcG9ydHNnZXRMaWJyYXJ5TWV0YWRhdGFnZXRDbGFzc01ldGFkYXRhZ2V0TWVtYmVyTWV0YWRhdGFpbmNsdWRlUGFyYW1ldGVyTWV0YWRhdGFKRWxlbWVudEVudmlyb25tZW50Zm9yRWFjaEluamVjdGVkQ2xhc3NNZW1iZXJmb3JFYWNoQ29uc3RydWN0b3JCb2R5Zm9yRWFjaE5lc3RlZENsb3N1cmVpc1N1cGVyTWl4aW5BcHBsaWNhdGlvbmdldEVmZmVjdGl2ZU1peGluQ2xhc3NnZXRUeXBlVmFyaWFibGVEZWZhdWx0VHlwZWdldEFzeW5jT3JTeW5jU3RhckVsZW1lbnRUeXBlZ2V0RnVuY3Rpb25Bc3luY09yU3luY1N0YXJFbGVtZW50VHlwZWZvckVhY2hJbnN0YW5jZUZpZWxkZm9yRWFjaERpcmVjdEluc3RhbmNlRmllbGRmb3JFYWNoUGFyYW1ldGVyZm9yRWFjaFBhcmFtZXRlckFzTG9jYWxnbG9iYWxMb2NhbHNNYXBkZWZlcnJlZF9sb2FkQ29uc3RhbnRWYWx1ZUNvbnN0cnVjdGVkQ29uc3RhbnRWYWx1ZVR5cGVDb25zdGFudFZhbHVlRGVmZXJyZWRHbG9iYWxDb25zdGFudFZhbHVlSW5zdGFudGlhdGlvbkNvbnN0YW50VmFsdWVLTG9jYWxGdW5jdGlvbkltcGFjdFVzZUNhc2VXb3JsZEltcGFjdFZpc2l0b3JJbXBsT3V0cHV0VW5pdGlzTWFpbk91dHB1dF9pbXBvcnRzb3RoZXJTaXplb3RoZXJJbXBvcnRzY21waW1wb3J0c0ZvclRlc3RpbmdPdXRwdXRVbml0KF9tYWluT3V0cHV0VW5pdF9hbGxPdXRwdXRVbml0c0lNUEFDVF9VU0VEZWZlcnJlZCBsb2FkX2ltcG9ydERlZmVyTmFtZV9jbGFzc1RvU2V0X21lbWJlclRvU2V0X2xvY2FsRnVuY3Rpb25Ub1NldF9jb25zdGFudFRvU2V0X2RlZmVycmVkSW1wb3J0RGVzY3JpcHRpb25zaW1wb3J0U2V0c21haW5TZXR1bml0RGVmZXJyZWQgTG9hZGluZ19hbGxEZWZlcnJlZEltcG9ydHNjb21tb25FbGVtZW50c19pc0V4cGxpY2l0bHlEZWZlcnJlZGNsYXNzSW1wb3J0c1RvbWVtYmVySW1wb3J0c1RvdHlwZWRlZkltcG9ydHNUb19jb2xsZWN0RGlyZWN0TWVtYmVyRGVwZW5kZW5jaWVzaXNNZW1iZXJVc2VkX2NvbGxlY3REZXBlbmRlbmNpZXNGcm9tSW1wYWN0Y29sbGVjdENvbnN0YW50c0luQm9keV9jb2xsZWN0QWxsRWxlbWVudHNBbmRDb25zdGFudHNSZXNvbHZlZEZyb21DbGFzc2FkZExpdmVJbnN0YW5jZU1lbWJlcl9jb2xsZWN0VHlwZURlcGVuZGVuY2llc19jb2xsZWN0QWxsRWxlbWVudHNBbmRDb25zdGFudHNSZXNvbHZlZEZyb21NZW1iZXJpc0dlbmVyYXRpdmVDb25zdHJ1Y3RvcmNvbGxlY3RDb25zdGFudHNGcm9tTWV0YWRhdGFfY29sbGVjdFR5cGVBcmd1bWVudERlcGVuZGVuY2llc3dvcmxkSW1wYWN0dmlzaXRJbXBhY3R1c2VkRW50aXR5VW5leHBlY3RlZCBzdGF0aWMgdXNlIGxvY2FsRnVuY3Rpb25sb2NhbEZ1bmN0aW9uc1N0YXRpY1VzZUtpbmQuQ09OU1RSVUNUT1JfSU5WT0tFU3RhdGljVXNlS2luZC5DT05TVF9DT05TVFJVQ1RPUl9JTlZPS0VTdGF0aWNVc2VLaW5kLlNUQVRJQ19JTlZPS0VTdGF0aWNVc2VLaW5kLkNMT1NVUkVfQ0FMTFN0YXRpY1VzZUtpbmQuRElSRUNUX0lOVk9LRVR5cGVVc2VLaW5kLlRZUEVfTElURVJBTGlzSW50ZXJmYWNlVHlwZVR5cGVVc2VLaW5kLkNPTlNUX0lOU1RBTlRJQVRJT05UeXBlVXNlS2luZC5JTlNUQU5USUFUSU9OVHlwZVVzZUtpbmQuTkFUSVZFX0lOU1RBTlRJQVRJT05UeXBlVXNlS2luZC5JU19DSEVDS1R5cGVVc2VLaW5kLkNBVENIX1RZUEVUeXBlVXNlS2luZC5BU19DQVNUZ2V0RXhwbGljaXRDYXN0Q2hlY2tQb2xpY3lUeXBlVXNlS2luZC5JTVBMSUNJVF9DQVNUZ2V0SW1wbGljaXREb3duY2FzdENoZWNrUG9saWN5VHlwZVVzZUtpbmQuUEFSQU1FVEVSX0NIRUNLZ2V0UGFyYW1ldGVyQ2hlY2tQb2xpY3lUeXBlVXNlS2luZC5SVElfVkFMVUVUeXBlVXNlS2luZC5UWVBFX0FSR1VNRU5UVW5leHBlY3RlZCB0eXBlIHVzZTogX3VwZGF0ZUNvbnN0YW50UmVjdXJzaXZlb2xkU2V0cXVldWVjdXJyZW50U2V0X3VwZGF0ZUNsYXNzUmVjdXJzaXZlZ2V0RGVwZW5kZW5jaWVzVHJpZWQgdG8gYXNzaWduICB0byB0aGUgbWFpbiBvdXRwdXQgdW5pdCwgYnV0IGl0IHdhcyBhc3NpZ25lZCB0byBfcHJvY2Vzc0RlcGVuZGVuY2llc191cGRhdGVNZW1iZXJSZWN1cnNpdmVfdXBkYXRlTG9jYWxGdW5jdGlvbl9zaG91bGRBZGREZWZlcnJlZERlcGVuZGVuY3lfZml4RGVwZW5kZW5jeUluZm8nIGlzIGRlZmVycmVkIGJ1dCBhcHBlYXJzIHRvIGJlIGluZmVycmVkIGFzIGEgcmV0dXJuIHR5cGUgb3IgYSB0eXBlIHBhcmFtZXRlciAoZGFydGJ1Zy5jb20vMzUzMTEpLl9maXhDbGFzc0RlcGVuZGVuY3lJbmZvX2ZpeE1lbWJlckRlcGVuZGVuY3lJbmZvX2ZpeENvbnN0YW50RGVwZW5kZW5jeUluZm9yZXByZXNlbnRlZFR5cGVDbGFzcyAoaW4gY29uc3RhbnQpIFR5cGVkZWYgc2luZ2xldG9uX2NyZWF0ZU91dHB1dFVuaXRzYWRkVW5pdGltcG9ydFNldF9zZXR1cEh1bmtzVG9Mb2FkaHVua3NUb0xvYWR1c2VkSW1wb3J0TmFtZXNjb21wdXRlSW1wb3J0RGVmZXJOYW1lc29ydGVkT3V0cHV0VW5pdHNvdXRwdXRVbml0X2J1aWxkUmVzdWx0YmFja2VuZFVzYWdlZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXNnbG9iYWxDbGFzc0RlcGVuZGVuY2llc25leHRJdGVtY2xhc3NNYXBtZW1iZXJNYXBsb2NhbEZ1bmN0aW9uTWFwY29uc3RhbnRNYXBjbGVhbnVwcHJlcGFyZWNoZWNrRm9yRGVmZXJyZWRFcnJvckNhc2VzaWdub3JlRW50aXR5SW5EdW1wZHVtcGVsZW1lbnRNYXBpZCBjbHMgbWVtYmVybWVtYmVyQ29udGV4dDxhbm9ueW1vdXM+IGxvY2FsaXNQcmltaXRpdmV1bml0VGV4dCA8TUFJTiBVTklUPiBpbXBvcnRzOmVuY2xvc2luZ0xpYnJhcnlVcmkKICAgCiBlbGVtZW50czoKIGNvbnN0YW50czoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KT3V0cHV0IHVuaXQ6IEltcG9ydERlc2NyaXB0aW9uaW1wb3J0aW5nVXJpX2ltcG9ydGluZ0xpYnJhcnlpbXBvcnRpbmdMaWJyYXJ5bWFpbkxpYnJhcnlVcmlfRGVmZXJyZWRJbXBvcnRJbXBvcnRTZXRMYXR0aWNlX2ltcG9ydEluZGV4X2VtcHR5U2V0X2FkZF93cmFwYUltcG9ydHNiSW1wb3J0c2xhc3RBSW5kZXhsYXN0QkluZGV4aW1wb3J0QWltcG9ydEJJbXBvcnRTZXRfdHJhbnNpdGlvbnNJbXBvcnRTZXQoc2l6ZTogV29ya1F1ZXVlcGVuZGluZ0NsYXNzZXNwZW5kaW5nTWVtYmVyc3BlbmRpbmdDb25zdGFudHNfaW1wb3J0U2V0c2ltcG9ydHNUb0FkZENsYXNzV29ya0l0ZW1NZW1iZXJXb3JrSXRlbUNvbnN0YW50V29ya0l0ZW1MYXRlT3V0cHV0VW5pdERhdGFCdWlsZGVyX291dHB1dFVuaXREYXRhcmVnaXN0ZXJDb2xvY2F0ZWRNZW1iZXJzZXhpc3RpbmdFbnRpdHluZXdFbnRpdHlfbWVtYmVyVG9Vbml0b3V0cHV0VW5pdEZvck1lbWJlcm91dHB1dC11bml0LWRhdGFtYWluT3V0cHV0VW5pdF9jbGFzc1RvVW5pdF9sb2NhbEZ1bmN0aW9uVG9Vbml0X2NvbnN0YW50VG9Vbml0Y29udmVydENsYXNzTWFwY29udmVydE1lbWJlck1hcGNvbnZlcnRDb25zdGFudE1hcGNsYXNzVG9Vbml0bWVtYmVyVG9Vbml0Y29uc3RhbnRUb1VuaXRkZWZlcnJlZEltcG9ydERlc2NyaXB0aW9uc3JlYWRJbXBvcnRzcmVhZENsYXNzTWFwcmVhZE1lbWJlck1hcHJlYWRDb25zdGFudE1hcGltcG9ydERlZmVyTmFtZXJlYWRJbXBvcnRNYXByZWFkU3RyaW5nTWFwb3V0cHV0VW5pdEluZGljZXN3cml0ZUltcG9ydHN3cml0ZUNsYXNzTWFwd3JpdGVNZW1iZXJNYXB3cml0ZUNvbnN0YW50TWFwd3JpdGVJbXBvcnRNYXB3cml0ZVN0cmluZ01hcGltcG9ydERlc2NyaXB0aW9ub3V0cHV0VW5pdEZvckNsYXNzTm8gb3V0cHV0IHVuaXQgZm9yIGNsYXNzIG91dHB1dFVuaXRGb3JDbGFzc0ZvclRlc3RpbmdObyBvdXRwdXQgdW5pdCBmb3IgbWVtYmVyIG91dHB1dFVuaXRGb3JNZW1iZXJGb3JUZXN0aW5nY29uc3RhbnRzRm9yVGVzdGluZ291dHB1dFVuaXRGb3JDb25zdGFudG91dHB1dFVuaXRGb3JDb25zdGFudEZvclRlc3Rpbmdpc0RlZmVycmVkQ2xhc3NoYXNPbmx5Tm9uRGVmZXJyZWRJbXBvcnRQYXRoc291dHB1dFVuaXRGcm9tb3V0cHV0VW5pdFRvaGFzT25seU5vbkRlZmVycmVkSW1wb3J0UGF0aHNUb0NvbnN0YW50cmVnaXN0ZXJDb25zdGFudERlZmVycmVkVXNlZ2V0SW1wb3J0RGVmZXJOYW1lTm8gZGVmZXJyZWQgbmFtZSBmb3IgZ2V0SW1wb3J0TmFtZXNjb21wdXRlRGVmZXJyZWRNYXBvbWl0dGVkVW5pdHM8dW5uYW1lZD5wYXJ0RmlsZU5hbWVzRGVwZW5kZW5jaWVzcmVnaXN0ZXJJbXBvcnREZXBlbmRlbmN5SW5mb1R5cGVEZXBlbmRlbmN5VmlzaXRvcl9kZXBlbmRlbmNpZXNfaW1wb3J0X2NvbW1vbkVsZW1lbnRzdmlzaXRGdXR1cmVPclR5cGV1bmFsaWFzZWRwYXJhbWV0ZXJUeXBlc29wdGlvbmFsUGFyYW1ldGVyVHlwZXNuYW1lZFBhcmFtZXRlclR5cGVzdmlzaXRGdW5jdGlvblR5cGVWYXJpYWJsZXZpc2l0VHlwZVZhcmlhYmxlVHlwZWRlZmVycmVkUGFydEZpbGVOYW1lYWRkRXh0ZW5zaW9ub3V0UGF0aG91dE5hbWUucGFydC5qc2RhcnQyanMuZGlhZ25vc3RpY3MuY29kZV9sb2NhdGlvbkNvZGVMb2NhdGlvbnJlbGF0aXZpemVTY2hlbWVMb2NhdGlvblBhY2thZ2VMb2NhdGlvblVyaUxvY2F0aW9uQW55TG9jYXRpb25kdW1wX2luZm9DaHVua2VkQ29udmVyc2lvblNpbmtTdHJpbmdDb252ZXJzaW9uU2lua0ludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZUdsb2JhbFR5cGVJbmZlcmVuY2VNZW1iZXJSZXN1bHRqc0FzdEVsZW1lbnRJbmZvQ29sbGVjdG9yX2dsb2JhbEluZmVyZW5jZVJlc3VsdHNfZW50aXR5VG9JbmZvX2NvbnN0YW50VG9JbmZvX291dHB1dFRvSW5mb19jb25zdGFudFRvTm9kZV9ub2RlRGF0YV91bml0SW5mb0ZvckNvbnN0YW50c2hvdWxkS2VlcGltcGFjdHNpbmxpbmVDb3VudGxpYm5hbWVzaXplT2ZmdW5jdGlvbkluZm92aXNpdEZ1bmN0aW9udG9wTGV2ZWxGdW5jdGlvbnNmaWVsZEluZm90b3BMZXZlbFZhcmlhYmxlc2NsYXp6X3Jlc3VsdE9mTWVtYmVycmVzdWx0T2ZNZW1iZXJfcmVzdWx0T2ZQYXJhbWV0ZXJyZXN1bHRPZlBhcmFtZXRlcmNvbnRhaW5pbmdDbGFzc2lzRGVmaW5pdGVseVRydWVjb2RlT2ZfdW5pdEluZm9Gb3JNZW1iZXJmaWVsZERhdGFmaWVsZEFuYWx5c2lzZ2V0RmllbGREYXRhY292ZXJhZ2VJZGNsb3N1cmVTaXplX2FkZENsb3N1cmVJbmZvX3VuaXRJbmZvRm9yQ2xhc3NmdW5jdGlvbnNjbG9zdXJlSW5mb2Nsb3N1cmVzQ2xhc3MgbWVtYmVyIG5vdCBhIGZ1bmN0aW9uIG9yIGZpZWxkbmVlZGVkQ2xhc3Nlc3Zpc2l0Q2xvc3VyZUNsYXNzY2FsbE1ldGhvZGlzRmFjdG9yeUNvbnN0cnVjdG9yaW5mZXJyZWRQYXJhbWV0ZXJUeXBlc3BhcmFtZXRlckluZGV4c2lkZUVmZmVjdHNnZXRTaWRlRWZmZWN0c09mRWxlbWVudGlubGluZWRDb3VudGZ1bmN0aW9uS2luZG5lc3RlZENsb3N1cmVzY2xvc3VyZV9pbmZvRnJvbU91dHB1dFVuaXRnZW5lcmF0ZWRTaXplU2VsZWN0aW9uc2VsZWN0ZWRFbnRpdHlyZWNlaXZlckNvbnN0cmFpbnRJbmZvUmVwb3J0ZXJyZXBvcnRJbmxpbmVkaW5saW5lZEZyb21EdW1wIGluZm91c2VCaW5hcnlGb3JtYXRpbmZvQ29sbGVjdG9yX3Byb2dyYW1TaXplX2VudGl0eVRvTm9kZXNpbmxpbmVNYXBfc3RhY2tEdW1wIEluZm9yZWdpc3RlckltcGFjdHVucmVnaXN0ZXJJbXBhY3RnZXRSZXRhaW5pbmdzZWxlY3Rpb25zbG9jYXRlTWVtYmVyc3JlZ2lzdGVyRW50aXR5QXN0cmVnaXN0ZXJDb25zdGFudEFzdHNob3VsZEVtaXRUZXh0ZW50ZXJOb2RlZW1pdF90ZXh0ZXhpdE5vZGVjbG9zaW5nc2l6ZU9mTm9kZWFzdGFsbEluZm9idWlsZER1bXBJbmZvRGF0YWR1bXBJbmZvQmluYXJ5ZHVtcEluZm9Kc29uanNvbkJ1ZmZlcnN0YXJ0Q2h1bmtlZENvbnZlcnNpb25pc0JhY2t3YXJkQ29tcGF0aWJsZWluZm8uanNvblZpZXcgdGhlIGR1bXBlZCAuaW5mby5qc29uIGZpbGUgYXQgaHR0cHM6Ly9kYXJ0LWxhbmcuZ2l0aHViLmlvL2R1bXAtaW5mby12aXN1YWxpemVyLmluZm8uZGF0YVVzZSBgcGFja2FnZTpkYXJ0MmpzX2luZm9gIHRvIHBhcnNlIGFuZCBwcm9jZXNzIHRoZSBkdW1wZWQgLmluZm8uZGF0YSBmaWxlLnN0b3B3YXRjaGZ1bmN0aW9uRW50aXRpZXNzZWxlY3Rpb251c2VJbmZvZmllbGRFbnRpdHlvdXRlckluZm9pbmxpbmVkaW5saW5lZEluZm9kZWZlcnJlZEZpbGVzZW50cnlwb2ludGRhcnQyanNWZXJzaW9uY29tcGlsYXRpb25Nb21lbnRjb21waWxhdGlvbkR1cmF0aW9udG9Kc29uRHVyYXRpb25kdW1wSW5mb0R1cmF0aW9ubm9TdWNoTWV0aG9kRW5hYmxlZGlzTm9TdWNoTWV0aG9kVXNlZGlzUnVudGltZVR5cGVVc2VkaXNJc29sYXRlSW5Vc2Vpc0Z1bmN0aW9uQXBwbHlVc2VkaXNNaXJyb3JzVXNlZG1pbmlmaWVkX0NvZGVEYXRhZW50aXRpZXNFbnRpdHlMaWJyYXJ5RW50aXR5SW1wb3J0RW50aXR5aW1wb3J0KCBkZWZlcnJlZENsYXNzRW50aXR5aXNDbG9zdXJlVHlwZWRlZkVudGl0eVR5cGVWYXJpYWJsZUVudGl0eXR5cGVEZWNsYXJhdGlvbkZpZWxkRW50aXR5RnVuY3Rpb25FbnRpdHlwYXJhbWV0ZXJTdHJ1Y3R1cmVTWU5DX1NUQVJBU1lOQ19TVEFSaXNZaWVsZGluZ2FzeW5jUGFyc2VyU3RhdGVDb25zdHJ1Y3RvckVudGl0eUNvbnN0cnVjdG9yQm9keUVudGl0eUxvY2FsUGFyYW1ldGVyU3RydWN0dXJlcGFyYW1ldGVyLXN0cnVjdHVyZXJlcXVpcmVkUGFyYW1ldGVyc2Zyb21UeXBlb3B0aW9uYWxQYXJhbWV0ZXJzdG90YWxQYXJhbWV0ZXJzY2FsbFN0cnVjdHVyZXNob3J0VGV4dFBhcmFtZXRlclN0cnVjdHVyZShyZXF1aXJlZFBhcmFtZXRlcnM9cG9zaXRpb25hbFBhcmFtZXRlcnM9bmFtZWRQYXJhbWV0ZXJzPXt9LHR5cGVQYXJhbWV0ZXJzPWRhcnQyanMuZW5xdWV1ZVN0YXRpY1VzZUtpbmRUeXBlVXNlS2luZF9yZXNvbHV0aW9uY29kZWdlbkVucXVldWVyRm9yVGVzdGluZ0VucXVldWVSZXNvbHV0aW9uRW5xdWV1ZXIgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0Lm9uRW1wdHlGb3JUZXN0aW5nc2tpcEVucXVldWVyQ2hlY2tGb3JUZXN0aW5naXNSZXNvbHV0aW9uUXVldWVxdWV1ZUlzRW1wdHlFbnF1ZXVlckxpc3RlbmVycmVnaXN0ZXJJbnN0YW50aWF0ZWRUeXBlaXNHbG9iYWxuYXRpdmVVc2FnZXJlZ2lzdGVySW1wbGVtZW50ZWRDbGFzc3JlZ2lzdGVyR2V0T2ZTdGF0aWNGdW5jdGlvbnJlZ2lzdGVyQ2xvc3VyaXplZE1lbWJlcnJlZ2lzdGVyVXNlZEVsZW1lbnRyZWdpc3RlclVzZWRDb25zdGFudG9uUXVldWVPcGVub25RdWV1ZUVtcHR5cmVjZW50Q2xhc3Nlc29uUXVldWVDbG9zZWRFbnF1ZXVlckltcGxfaW1wYWN0U3RyYXRlZ3ljaGVja0NsYXNzcHJvY2Vzc1N0YXRpY1VzZXByb2Nlc3NUeXBlVXNlcHJvY2Vzc0R5bmFtaWNVc2Vwcm9jZXNzQ29uc3RhbnRVc2VjaGVja0VucXVldWVyQ29uc2lzdGVuY3lyZXNvbHV0aW9uLmNoZWNrZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzX3JlY2VudENsYXNzZXNfcmVjZW50Q29uc3RhbnRzX3dvcmxkQnVpbGRlcl93b3JrSXRlbUJ1aWxkZXJfYW5ub3RhdGlvbnNEYXRhX2ltcGFjdFZpc2l0b3JfcXVldWVyZXNvbHV0aW9uIGVucXVldWVyIHF1ZXVlIGlzIG5vdCBlbXB0eS5fcmVnaXN0ZXJJbnN0YW50aWF0ZWRUeXBlZ2xvYmFsRGVwZW5kZW5jeXJlc29sdXRpb24udHlwZVVzZXJlZ2lzdGVyVHlwZUluc3RhbnRpYXRpb25fYXBwbHlDbGFzc1VzZXByb2Nlc3NDbGFzc01lbWJlcnN1c2VTZXRVbmVucXVldWVkIHVzZSBvZiBNZW1iZXJVc2UuTk9STUFMTWVtYmVyVXNlLkNMT1NVUklaRV9JTlNUQU5DRU1lbWJlclVzZS5DTE9TVVJJWkVfU1RBVElDX2FwcGx5TWVtYmVyVXNlX2FkZFRvV29ya0xpc3RfcmVnaXN0ZXJDbG9zdXJpemVkTWVtYmVyZ2V0IG9mIHN0YXRpYyBmdW5jdGlvbkNsYXNzVXNlLklOU1RBTlRJQVRFRGluc3RhbnRpYXRlZCBjbGFzc0NsYXNzVXNlLklNUExFTUVOVEVEaW1wbGVtZW50ZWQgY2xhc3NyZXNvbHV0aW9uLmR5bmFtaWNVc2VyZXNvbHV0aW9uLmNvbnN0YW50VXNlY29uc3RhbnQgdXNlcmVzb2x1dGlvbi5zdGF0aWNVc2VfcmVnaXN0ZXJJc0NoZWNrcmVnaXN0ZXJUeXBlVmFyaWFibGVUeXBlTGl0ZXJhbHJlZ2lzdGVySXNDaGVja2Nsb3N1cml6ZWQgbWVtYmVyX2ZvckVhY2hpc01lbWJlclByb2Nlc3NlZHJlZ2lzdGVyUHJvY2Vzc2VkTWVtYmVycmVjZW50c19vblF1ZXVlRW1wdHlFbnF1ZXVlcihwcm9jZXNzZWRNZW1iZXJzcmVnaXN0ZXJQcm9jZXNzZWRFbGVtZW50SW50ZXJuYWx3b3JrSXRlbWNyZWF0ZVdvcmtJdGVtUmVzb2x1dGlvbiB3b3JrIGxpc3QgaXMgY2xvc2VkLiBUcnlpbmcgdG8gYWRkIHVzZWQgZWxlbWVudEVucXVldWVySW1wbEltcGFjdFZpc2l0b3JXb3JrSXRlbUJ1aWxkZXJkYXJ0MmpzLmZyb250ZW5kX3N0cmF0ZWd5RnJvbnRlbmRTdHJhdGVneW5vU3VjaE1ldGhvZFJlZ2lzdHJ5aW1wYWN0QnVpbGRlckFubm90YXRpb25Qcm9jZXNzb3JleHRyYWN0TmF0aXZlQW5ub3RhdGlvbnNleHRyYWN0SnNJbnRlcm9wQW5ub3RhdGlvbnNwcm9jZXNzSnNJbnRlcm9wQW5ub3RhdGlvbnNuYXRpdmVEYXRhQnVpbGRlckltcGFjdENhY2hlRGVsZXRlcmRhcnQyanMuYWJzdHJhY3RfdmFsdWVfZG9tYWluUHJpbWl0aXZlQ29uc3RhbnRWYWx1ZUFic3RyYWN0Qm9vbFRydWVGYWxzZU1heWJlaXNEZWZpbml0ZWx5RmFsc2Vpc1BvdGVudGlhbGx5RmFsc2V0cnVlT3JNYXliZXRydWVPckZhbHNlbWF5YmVPckZhbHNlQWJzdHJhY3RCb29sLmNyZWF0ZURvbWFpbmNyZWF0ZVNlbGVjdG9yU3RyYXRlZ3lBYnN0cmFjdFZhbHVlQWJzdHJhY3RWYWx1ZVdpdGhQcmVjaXNpb25hYnN0cmFjdFZhbHVlaXNQcmVjaXNlQWJzdHJhY3RWYWx1ZVdpdGhQcmVjaXNpb24oLCBpc1ByZWNpc2U6IEFic3RyYWN0VmFsdWVEb21haW5ub25OdWxsVHlwZWdyb3dhYmxlTGlzdFR5cGVmaXhlZExpc3RUeXBldWludDMxVHlwZXVpbnQzMlR5cGVwb3NpdGl2ZUludFR5cGVjb25zdExpc3RUeXBlY29uc3RTZXRUeXBlY29uc3RNYXBUeXBlZW1wdHlUeXBlc3luY1N0YXJJdGVyYWJsZVR5cGVhc3luY0Z1dHVyZVR5cGVhc3luY1N0YXJTdHJlYW1UeXBlY3JlYXRlRnJvbVN0YXRpY1R5cGVjbGFzc1JlbGF0aW9uQ2xhc3NSZWxhdGlvbi5zdWJ0eXBlY3JlYXRlTm9uTnVsbEV4YWN0Y3JlYXRlTnVsbGFibGVFeGFjdGNyZWF0ZU5vbk51bGxTdWJjbGFzc2NyZWF0ZU5vbk51bGxTdWJ0eXBlY3JlYXRlTnVsbGFibGVTdWJ0eXBlaXNUeXBlZEFycmF5Y291bGRCZVR5cGVkQXJyYXlleGNsdWRlTnVsbGluY2x1ZGVOdWxsY29udGFpbnNUeXBlY29udGFpbnNPbmx5VHlwZWlzSW5zdGFuY2VPZk9yTnVsbGlzSW5zdGFuY2VPZmlzRXhhY3Rpc0V4YWN0T3JOdWxsZ2V0RXhhY3RDbGFzc2lzUHJpbWl0aXZlTnVtYmVyaXNQcmltaXRpdmVCb29sZWFuaXNQcmltaXRpdmVBcnJheWlzSW5kZXhhYmxlUHJpbWl0aXZlaXNGaXhlZEFycmF5aXNFeHRlbmRhYmxlQXJyYXlpc011dGFibGVBcnJheWlzTXV0YWJsZUluZGV4YWJsZWlzQXJyYXlpc1ByaW1pdGl2ZVN0cmluZ2lzSW50ZXJjZXB0b3Jpc0ludGVnZXJpc1VJbnQzMmlzVUludDMxaXNQb3NpdGl2ZUludGVnZXJpc1Bvc2l0aXZlSW50ZWdlck9yTnVsbGlzSW50ZWdlck9yTnVsbGlzTnVtYmVyaXNOdW1iZXJPck51bGxpc0RvdWJsZWlzRG91YmxlT3JOdWxsaXNCb29sZWFuaXNCb29sZWFuT3JOdWxsaXNTdHJpbmdpc1N0cmluZ09yTnVsbGlzUHJpbWl0aXZlT3JOdWxsdW5pb25PZk1hbnlhcmVEaXNqb2ludGNvbXB1dGVBYnN0cmFjdFZhbHVlRm9yQ29uc3RhbnRpc0NvbnRhaW5lcmNyZWF0ZUNvbnRhaW5lclZhbHVlb3JpZ2luYWxWYWx1ZWFsbG9jYXRpb25Ob2RlYWxsb2NhdGlvbkVsZW1lbnRnZXRDb250YWluZXJFbGVtZW50VHlwZWdldENvbnRhaW5lckxlbmd0aGNyZWF0ZVNldFZhbHVlZ2V0U2V0RWxlbWVudFR5cGVjcmVhdGVNYXBWYWx1ZWdldE1hcEtleVR5cGVnZXRNYXBWYWx1ZVR5cGVpc0RpY3Rpb25hcnljcmVhdGVEaWN0aW9uYXJ5VmFsdWVtYXBwaW5nc2NvbnRhaW5zRGljdGlvbmFyeUtleWdldERpY3Rpb25hcnlWYWx1ZUZvcktleWlzU3BlY2lhbGl6YXRpb25PZnNwZWNpYWxpemF0aW9uZ2VuZXJhbGl6YXRpb25nZXRHZW5lcmFsaXphdGlvbmdldEFsbG9jYXRpb25Ob2RlZ2V0QWxsb2NhdGlvbkVsZW1lbnRpc1ByaW1pdGl2ZVZhbHVlY3JlYXRlUHJpbWl0aXZlVmFsdWVnZXRQcmltaXRpdmVWYWx1ZWNvbXB1dGVSZWNlaXZlcm5lZWRzTm9TdWNoTWV0aG9kSGFuZGxpbmdnZXRBYnN0cmFjdFZhbHVlRm9yTmF0aXZlTWV0aG9kUGFyYW1ldGVyVHlwZXN1cGVyc2V0c3Vic2V0aXNJbmxvY2F0ZVNpbmdsZU1lbWJlcmlzSnNJbmRleGFibGVBbmRJdGVyYWJsZWlzRml4ZWRMZW5ndGhKc0luZGV4YWJsZWdldENvbXBhY3RUZXh0VHJpdmlhbEFic3RyYWN0VmFsdWVUcml2aWFsQWJzdHJhY3RWYWx1ZURvbWFpblRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLmdldERpY3Rpb25hcnlWYWx1ZUZvcktleVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLmNvbnRhaW5zRGljdGlvbmFyeUtleVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLmdldE1hcFZhbHVlVHlwZVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLmdldE1hcEtleVR5cGVUcml2aWFsQWJzdHJhY3RWYWx1ZURvbWFpbi5nZXRTZXRFbGVtZW50VHlwZVRyaXZpYWxBYnN0cmFjdFZhbHVlRG9tYWluLmdldENvbnRhaW5lckVsZW1lbnRUeXBlVHJpdmlhbFNlbGVjdG9yU3RyYXRlZ3ljcmVhdGVTZWxlY3RvckNvbnN0cmFpbnRzaW5pdGlhbENvbnN0cmFpbnRhcHBsaWVkVW5uYW1lZHdvcmxkYXBwbGllc1VubmFtZWRUcml2aWFsVW5pdmVyc2VTZWxlY3RvckNvbnN0cmFpbnRzYWRkUmVjZWl2ZXJDb25zdHJhaW50Y2FuSGl0VHJpdmlhbFVuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50czptYXNrc1VuaXZlcnNlU2VsZWN0b3JDb25zdHJhaW50c1NlbGVjdG9yQ29uc3RyYWludHNTdHJhdGVneVR5cGVHcmFwaEluZmVycmVyY29udGFpbmVyX3R5cGVfbWFzay5kYXJ0ZGljdGlvbmFyeV90eXBlX21hc2suZGFydGZsYXRfdHlwZV9tYXNrLmRhcnRmb3J3YXJkaW5nX3R5cGVfbWFzay5kYXJ0bWFwX3R5cGVfbWFzay5kYXJ0c2V0X3R5cGVfbWFzay5kYXJ0dHlwZV9tYXNrLmRhcnR1bmlvbl90eXBlX21hc2suZGFydHZhbHVlX3R5cGVfbWFzay5kYXJ0Q29tbW9uTWFza3NfY2xvc2VkV29ybGRfZHluYW1pY1R5cGVfbm9uTnVsbFR5cGVfbnVsbFR5cGVfaW50VHlwZV91aW50MzJUeXBlX3VpbnQzMVR5cGVfcG9zaXRpdmVJbnRUeXBlX2RvdWJsZVR5cGVfbnVtVHlwZV9ib29sVHlwZV9mdW5jdGlvblR5cGVfbGlzdFR5cGVfY29uc3RMaXN0VHlwZV9maXhlZExpc3RUeXBlX2dyb3dhYmxlTGlzdFR5cGVfc2V0VHlwZV9jb25zdFNldFR5cGVfbWFwVHlwZV9jb25zdE1hcFR5cGVfc3RyaW5nVHlwZV90eXBlVHlwZV9zeW5jU3Rhckl0ZXJhYmxlVHlwZV9hc3luY0Z1dHVyZVR5cGVfYXN5bmNTdGFyU3RyZWFtVHlwZV9pbmRleGFibGVQcmltaXRpdmVUeXBlX3JlYWRhYmxlQXJyYXlUeXBlX211dGFibGVBcnJheVR5cGVfdW5tb2RpZmlhYmxlQXJyYXlUeXBlX2ludGVyY2VwdG9yVHlwZV9jYW5vbmljYWxpemVkVHlwZU1hc2tzZ2V0Q2FjaGVkTWFza2NyZWF0ZU1hc2tjYWNoZWRNYXNrc2luZGV4YWJsZVByaW1pdGl2ZVR5cGVyZWFkYWJsZUFycmF5VHlwZW11dGFibGVBcnJheVR5cGV1bm1vZGlmaWFibGVBcnJheVR5cGVpbnRlcmNlcHRvclR5cGVzYXRpc2ZpZXNpbnRlcnNlY3RzQ2xhc3NSZWxhdGlvbi5leGFjdENsYXNzUmVsYXRpb24udGhpc0V4cHJlc3Npb250eXBlTWFza19jb250YWluc1R5cGVfY29udGFpbnNPbmx5VHlwZWNvbnRhaW5zT25seV9pc0luc3RhbmNlT2ZPck51bGxpc0ltcGxlbWVudGVkZXhwcmVzc2lvbk1hc2tpc0Rpc2pvaW50aXNOdWxsYWJsZV9pc051bGxzaW5nbGVDbGFzc2lzVmFsdWV2YWx1ZU1hc2tfY2FuQmVQcmltaXRpdmVOdW1iZXJfY2FuQmVQcmltaXRpdmVBcnJheV9jYW5CZVByaW1pdGl2ZUJvb2xlYW5fY2FuQmVQcmltaXRpdmVTdHJpbmdfaXNJbmRleGFibGVQcmltaXRpdmVjb250YWluc09ubHlTdHJpbmdjb250YWluc09ubHlJbnRjb250YWluc09ubHlOdW1faXNOdW1iZXJPck51bGxjb250YWluc09ubHlEb3VibGVjb250YWluc09ubHlCb29sX2lzQm9vbGVhbk9yTnVsbF9pc1ByaW1pdGl2ZU9yTnVsbGZvcndhcmRUb2hhc0FueVN0cmljdFN1YmNsYXNzbWl4aW5Vc2VzT2Zjb250YWluc01hc2tpc0luTWFza2dldFZhbHVlRm9yS2V5Q29udGFpbmVyVHlwZU1hc2tjb250YWluZXItdHlwZS1tYXNrcmVhZFRyZWVOb2RlT3JOdWxscmVhZE1lbWJlck9yTnVsbFR5cGVNYXNrS2luZC5jb250YWluZXJ3cml0ZVRyZWVOb2RlT3JOdWxsd3JpdGVNZW1iZXJPck51bGxlcXVhbHNEaXNyZWdhcmROdWxsZm9yd2FyZEludGVyc2VjdGlvbmlzRW1wdHlPck51bGxuZXdFbGVtZW50VHlwZW5ld0ZvcndhcmRUb0NvbnRhaW5lcigsIGVsZW1lbnQ6ICwgbGVuZ3RoOiBEaWN0aW9uYXJ5VHlwZU1hc2tkaWN0aW9uYXJ5LXR5cGUtbWFza190eXBlTWFwdHlwZU1hcFR5cGVNYXNrS2luZC5kaWN0aW9uYXJ5bmV3S2V5VHlwZW5ld1ZhbHVlVHlwZURpY3Rpb25hcnkoLCBrZXk6IHZhbHVlOiAsIG1hcDogRmxhdFR5cGVNYXNrZmxhdC10eXBlLW1hc2tFTVBUWUVYQUNUU1VCQ0xBU1NTVUJUWVBFbm9uTnVsbEVtcHR5bm9uTnVsbEV4YWN0bm9uTnVsbFN1YmNsYXNzbm9uTnVsbFN1YnR5cGVub3JtYWxpemVkaGFzQW55U3RyaWN0U3VidHlwZWhhc09ubHlTdWJjbGFzc2VzY29tbW9uTWFza3NyZWFkQ2xhc3NPck51bGxUeXBlTWFza0tpbmQuZmxhdHdyaXRlQ2xhc3NPck51bGxfY2xhc3NRdWVyeUNsYXNzUXVlcnkuRVhBQ1Rpc1N1YmNsYXNzQ2xhc3NRdWVyeS5TVUJDTEFTU0NsYXNzUXVlcnkuU1VCVFlQRWlzVW5pb25pc0ZvcndhcmRpbmdpc1NpbmdsZUltcGxlbWVudGF0aW9uT2ZmbGF0T3RoZXJvdGhlckJhc2V1bmlvblNhbWV1bmlvblN0cmljdFN1YmNsYXNzdW5pb25TdHJpY3RTdWJ0eXBlY29tYmluZWRjb21tb25TdWJjbGFzc2VzU3ViY2xhc3NSZXN1bHRLaW5kLkVNUFRZU3ViY2xhc3NSZXN1bHRLaW5kLkVYQUNUMVN1YmNsYXNzUmVzdWx0S2luZC5FWEFDVDJTdWJjbGFzc1Jlc3VsdEtpbmQuU1VCQ0xBU1MxU3ViY2xhc3NSZXN1bHRLaW5kLlNVQkNMQVNTMlN1YmNsYXNzUmVzdWx0S2luZC5TVUJUWVBFMVN1YmNsYXNzUmVzdWx0S2luZC5TVUJUWVBFMlN1YmNsYXNzUmVzdWx0S2luZC5TRVRfaXNEaXNqb2ludEhlbHBlcnN0cmljdFN1YmNsYXNzZXNPZnN0cmljdFN1YnR5cGVzT2ZpbnRlcnNlY3Rpb25TYW1laW50ZXJzZWN0aW9uU3RyaWN0U3ViY2xhc3NpbnRlcnNlY3Rpb25FbXB0eWhhc0VsZW1lbnRJbmhhc0FueVN1YmNsYXNzVGhhdE1peGVzaGFzQW55U3ViY2xhc3NUaGF0SW1wbGVtZW50c2hhc0FueVN1YmNsYXNzT2ZNaXhpblVzZVRoYXRJbXBsZW1lbnRzbWl4aW5Vc2VzbmVlZHNOb1N1Y2hNZXRob2RpbmNsdWRlc0Nsb3N1cmVDYWxsZXZlcnlTdWJ0eXBlSXNTdWJjbGFzc09mT3JNaXhpblVzZU9maXNTdWJjbGFzc09mTWl4aW5Vc2VPZm90aGVyTWFza1tlbXB0eV1udWxsfGV4YWN0PXN1YmNsYXNzPXN1YnR5cGU9Rm9yd2FyZGluZ1R5cGVNYXNrU3ViY2xhc3Mgc2hvdWxkIGltcGxlbWVudCBoYXNoQ29kZSBnZXR0ZXJBbGxvY2F0aW9uVHlwZU1hc2tNYXBUeXBlTWFza21hcC10eXBlLW1hc2tUeXBlTWFza0tpbmQubWFwbmV3TWFwVHlwZU1hc2tNYXAoU2V0VHlwZU1hc2tzZXQtdHlwZS1tYXNrVHlwZU1hc2tLaW5kLnNldFNldChJbmNyZWFzaW5nVHlwZU1hc2tTZXRpc0FsbF9tYXNrczxhbGw+PG5vbmU+VHlwZU1hc2tTZWxlY3RvclN0cmF0ZWd5VHlwZU1hc2tLaW5kVHlwZU1hc2tLaW5kLnVuaW9uVHlwZU1hc2tLaW5kLnZhbHVlZmxhdGNvbnRhaW5lcmRpY3Rpb25hcnlUeXBlTWFza0Nhbm5vdCBjcmVhdGUgZXhhY3QgdHlwZSBtYXNrIGZvciB1bmluc3RhbnRpYXRlZCAuCmV4YWN0T3JFbXB0eUNhbm5vdCBjcmVhdGUgc3ViY2xhc3MgdHlwZSBtYXNrIGZvciB1bmluc3RhbnRpYXRlZCB0b3Btb3N0Z2V0THViT2ZJbnN0YW50aWF0ZWRTdWJjbGFzc2VzZ2V0THViT2ZJbnN0YW50aWF0ZWRTdWJ0eXBlc25vbk51bGxFeGFjdE9yRW1wdHl1bmlvbk9mVW5leHBlY3RlZCBUeXBlTWFza0tpbmQgbm9uRm9yd2FyZGluZ01hc2thc3NlcnRJc05vcm1hbGl6ZWQgaXMgbm90IG5vcm1hbGl6ZWQ6IGdldE5vdE5vcm1hbGl6ZWRSZWFzb25FeGFjdCAgaXMgbm90IGluc3RhbnRpYXRlZC5TdWJjbGFzcyAgZG9lcyBub3QgaGF2ZSBhbnkgc3ViY2xhc3Nlcy5TdWJ0eXBlICBvbmx5IGhhcyBzdWJjbGFzc2VzLnN1Ym1hc2tkaXNqb2ludE1hc2tzc3VibWFza1JlYXNvblN1Ym1hc2sgVW5rbm93biB0eXBlIG1hc2sgVW5pb25UeXBlTWFza3VuaW9uLXR5cGUtbWFza01BWF9VTklPTl9MRU5HVEhQRVJGT1JNX0VYVFJBX0NPTlRBSU5TX0NIRUNLZGlzam9pbnR1bmlvbk9mSGVscGVyZmxhdE1hc2tpbkxpc3RJbmRleGNvdmVyZWRuZXdNYXNrZmxhdHRlbnVzZVN1YmNsYXNzbWFza3NCYXNlc2NhbmRpZGF0ZXNjb21tb25TdXBlcnR5cGVzT2ZiZXN0RWxlbWVudGJlc3RLaW5kYmVzdFNpemVpc0luc3RhbnRpYXRlZFN0cmljdFN1YmNsYXNzaXNFeHBsaWNpdGx5SW5zdGFudGlhdGVkc3RyaWN0U3ViY2xhc3NDb3VudHN0cmljdFN1YnR5cGVDb3VudG5ld0xpc3RpbnRlcnNlY3Rpb25zbmV3SXRlcmFibGVzbG93Q29udGFpbnNDaGVja2NvbnRhaW5lZEluQW55T2ZtYXNrRGlzcmVnYXJkTnVsbGRpc2pvaW50TWFza2NvbnRhaW5lZFR5cGVNYXNrIGJhc2VkIGNvbnRhaW5tZW50IGNoZWNrIGZhaWxlZCBmb3IgbWFza3NTdHJpbmdVbmlvbihWYWx1ZVR5cGVNYXNrdmFsdWUtdHlwZS1tYXNrVmFsdWUoZm9ybWF0VHlwZUVtcHR5bnVsbEZsYWdzdWJGbGFnIHwgaXNDYWxsZWRPbmNldGhyb3dzQWx3YXlzdHlwZU9mU2VuZHR5cGVPZkdldHRlcnR5cGVPZkl0ZXJhdG9ydHlwZU9mSXRlcmF0b3JNb3ZlTmV4dHR5cGVPZkl0ZXJhdG9yQ3VycmVudEdsb2JhbFR5cGVJbmZlcmVuY2VFbGVtZW50RGF0YWNvbXByZXNzVHlwZXNJbmZlcnJlcmFuYWx5emVNYWluaXNUcml2aWFscmVzdWx0VHlwZU9mU2VsZWN0b3Jpc0ZpeGVkQXJyYXlDaGVja2VkRm9yR3Jvd2FibGV0eXBlT2ZOZXdMaXN0dHlwZU9mTGlzdExpdGVyYWxUeXBlIGluZmVyZW5jZXR5cGVzSW5mZXJyZXJJbnRlcm5hbHJlc3VsdHNGb3JUZXN0aW5nbWFpbkVsZW1lbnRyZXN1bHRzbm9TdWNoTWV0aG9kRGF0YWNhdGVnb3JpemVDb21wbGV4SW1wbGVtZW50YXRpb25zR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHNJbXBsZ2xvYmFsLXR5cGUtaW5mZXJlbmNlLXJlc3VsdHNfZGVhZEZpZWxkUmVzdWx0X2RlYWRNZXRob2RSZXN1bHRfdHJpdmlhbFBhcmFtZXRlclJlc3VsdG1lbWJlclJlc3VsdHNwYXJhbWV0ZXJSZXN1bHRzY2hlY2tlZEZvckdyb3dhYmxlTGlzdHNyZXR1cm5zTGlzdEVsZW1lbnRUeXBlU2V0X2FsbG9jYXRlZExpc3RzZ2V0TWVtYmVyQ29udGV4dE5vZGVyZWFkTG9jYWxNYXByZWFkVHJlZU5vZGVzYWxsb2NhdGVkTGlzdHNyZWFkVHJlZU5vZGVNYXB3cml0ZUxvY2FsTWFwd3JpdGVUcmVlTm9kZXN3cml0ZVRyZWVOb2RlTWFwdW5leHBlY3RlZCBpbnB1dDogQ29uc3RydWN0b3JCb2R5RWxlbWVudHMgYXJlIGNyZWF0ZWQgYWZ0ZXIgZ2xvYmFsIHR5cGUgaW5mZXJlbmNlLCBubyBkYXRhIGlzIGF2YWlhYmxlIGZvciB0aGVtLmlzQ2xvc3VyZUNhbGxpc0luZGV4U2V0cmV0dXJuc0xpc3RFbGVtZW50VHlwZXJldHVybnNNYXBWYWx1ZVR5cGV0eXBlT2ZNZW1iZXJXaXRoU2VsZWN0b3Jpc0luZGV4VW5leHBlY3RlZCBtZW1iZXIgY3RvckNhbGxHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0SW1wbGdsb2JhbC10eXBlLWluZmVyZW5jZS1tZW1iZXItcmVzdWx0X2RhdGF3cml0ZVZhbHVlT3JOdWxsVHJpdmlhbEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzX3RyaXZpYWxNZW1iZXJSZXN1bHRUcml2aWFsR2xvYmFsVHlwZUluZmVyZW5jZU1lbWJlclJlc3VsdFRyaXZpYWxHbG9iYWxUeXBlSW5mZXJlbmNlTWVtYmVyUmVzdWx0LndyaXRlVG9EYXRhU2lua0RlYWRGaWVsZEdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRkb21haW5EZWFkRmllbGRHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0LndyaXRlVG9EYXRhU2lua0RlYWRNZXRob2RHbG9iYWxUeXBlSW5mZXJlbmNlUmVzdWx0ZGFydDJqcy5zb3VyY2VfaW5mb3JtYXRpb25KYXZhU2NyaXB0Tm9kZVNvdXJjZUluZm9ybWF0aW9uaGFzU291cmNlSW5mb3JtYXRpb25wb3NpdGlvblNvdXJjZUluZm9ybWF0aW9ud3JpdGVUb0RhdGFTaW5rSW50ZXJuYWxzdGFydFBvc2l0aW9uaW5uZXJQb3NpdGlvbmVuZFBvc2l0aW9uc291cmNlTG9jYXRpb25zaW5saW5pbmdDb250ZXh0RnJhbWVDb250ZXh0ZnJhbWUtY29udGV4dGNhbGxJbmZvcm1hdGlvbmlubGluZWRNZXRob2ROYW1lKEZyYW1lQ29udGV4dDogU291cmNlSW5mb3JtYXRpb25TdHJhdGVneWNyZWF0ZUJ1aWxkZXJGb3JDb250ZXh0YnVpbGRTb3VyY2VNYXBwZWRNYXJrZXJvbkNvbXBsZXRlU291cmNlSW5mb3JtYXRpb25CdWlsZGVyZm9yQ29udGV4dGJ1aWxkRGVjbGFyYXRpb25idWlsZFN0dWJidWlsZEdlbmVyaWNidWlsZENyZWF0ZWJ1aWxkUmV0dXJuYnVpbGRJbXBsaWNpdFJldHVybmJ1aWxkTG9vcGJ1aWxkR2V0YnVpbGRTZXRidWlsZENhbGxidWlsZElmYnVpbGROZXdidWlsZFRocm93YnVpbGRBc3NlcnRidWlsZFZhcmlhYmxlRGVjbGFyYXRpb25idWlsZEF3YWl0YnVpbGRZaWVsZGJ1aWxkQXN5bmNCb2R5YnVpbGRBc3luY0V4aXRidWlsZEZvcmVpZ25Db2RlYnVpbGRTdHJpbmdJbnRlcnBvbGF0aW9uYnVpbGRGb3JJbkl0ZXJhdG9yYnVpbGRGb3JJbk1vdmVOZXh0YnVpbGRGb3JJbkN1cnJlbnRidWlsZEZvckluU2V0YnVpbGRJbmRleGJ1aWxkSW5kZXhTZXRidWlsZEJpbmFyeWJ1aWxkVW5hcnlidWlsZFRyeWJ1aWxkQ2F0Y2hidWlsZElzYnVpbGRBc2J1aWxkU3dpdGNoYnVpbGRTd2l0Y2hDYXNlYnVpbGRMaXN0TGl0ZXJhbGJ1aWxkR290b1NvdXJjZUxvY2F0aW9uc291cmNlLWxvY2F0aW9uc291cmNlVXJpc291cmNlTmFtZWhhc1NvdXJjZUxvY2F0aW9ucmVhZFVyaXNvdXJjZUxvY2F0aW9ud3JpdGVVcmk6W0RpcmVjdFNvdXJjZUxvY2F0aW9uQWJzdHJhY3RTb3VyY2VMb2NhdGlvbl9zb3VyY2VGaWxlX2xvY2F0aW9uSW52YWxpZCBzb3VyY2UgbG9jYXRpb24gaW4gb2Zmc2V0PSwgbGVuZ3RoPWZyb21Mb2NhdGlvbmZyb21PdGhlck9mZnNldFNvdXJjZUxvY2F0aW9uTm9Tb3VyY2VMb2NhdGlvbk1hcmtlcnNob3J0TmFtZTxuby1sb2NhdGlvbj5GcmFtZUVudHJ5cHVzaExvY2F0aW9uaXNFbXB0eVBvcGlzUHVzaGlzUG9wY29tcHV0ZUVsZW1lbnROYW1lRm9yU291cmNlTWFwc2NvbXB1dGVTdHViU3VmZml4W2Z1bmN0aW9uLWVudHJ5JHBvc2l0aW9uYWxBcmd1bWVudENvdW50Z2V0T3JkZXJlZE5hbWVkQXJndW1lbnRzanNfYmFja2VuZC5iYWNrZW5kRnVuY3Rpb25Db21waWxlcmluaXRpYWxpemVGdW5jdGlvbklubGluZUNhY2hlX3Vua25vd25fbXVzdE5vdElubGluZV9tYXlJbmxpbmVJbkxvb3BNdXN0Tm90T3V0c2lkZV9jYW5JbmxpbmVJbkxvb3BNdXN0Tm90T3V0c2lkZV9jYW5JbmxpbmVJbkxvb3BNYXlJbmxpbmVPdXRzaWRlX2NhbklubGluZV9jYWNoZWREZWNpc2lvbnNfbm9JbmxpbmVGdW5jdGlvbnNfdHJ5SW5saW5lRnVuY3Rpb25zZm9yRWFjaE5vSW5saW5lbWFya0FzTm9JbmxpbmVmb3JFYWNoVHJ5SW5saW5lbWFya0FzVHJ5SW5saW5lY2hlY2tGdW5jdGlvbmo6Z2V0Q3VycmVudENhY2hlRGVjaXNpb25Gb3JUZXN0aW5nY2FuSW5saW5laW5zaWRlTG9vcGRlY2lzaW9ubWFya0FzSW5saW5hYmxlb2xkRGVjaXNpb25DYW4ndCBtYXJrICBhcyBub24taW5saW5hYmxlIGFuZCBpbmxpbmFibGUgYXQgdGhlIHNhbWUgdGltZS5tYXJrQXNOb25JbmxpbmFibGVtYXJrZWRBc05vSW5saW5lbWFya2VkQXNUcnlJbmxpbmVjaGVja2VkTW9kZUhlbHBlcnNydGlTdWJzdGl0dXRpb25zcnRpRW5jb2RlcnJ0aVJlY2lwZUVuY29kZXJ0cmFjZXJydGlUYWdzZml4ZWROYW1lc0NvZGVnZW5JbnB1dHNJbXBsSW5mZXJyZWREYXRhZ2V0U2lkZUVmZmVjdHNPZlNlbGVjdG9yZ2V0Q2Fubm90VGhyb3dpc0NhbGxlZEluTG9vcGdldE1pZ2h0QmVQYXNzZWRUb0FwcGx5SW5mZXJyZWREYXRhQnVpbGRlcnJlZ2lzdGVyU2lkZUVmZmVjdHNGcmVlZ2V0U2lkZUVmZmVjdHNCdWlsZGVycmVnaXN0ZXJNaWdodEJlUGFzc2VkVG9BcHBseWdldEN1cnJlbnRseUtub3duTWlnaHRCZVBhc3NlZFRvQXBwbHlhZGRGdW5jdGlvbkNhbGxlZEluTG9vcHJlZ2lzdGVyQ2Fubm90VGhyb3dJbmZlcnJlZERhdGFJbXBsaW5mZXJyZWQtZGF0YV9mdW5jdGlvbnNDYWxsZWRJbkxvb3Bfc2lkZUVmZmVjdHNfc2lkZUVmZmVjdHNGcmVlRWxlbWVudHNfZWxlbWVudHNUaGF0Q2Fubm90VGhyb3dfZnVuY3Rpb25zVGhhdE1pZ2h0QmVQYXNzZWRUb0FwcGx5ZnVuY3Rpb25zQ2FsbGVkSW5Mb29wc2lkZUVmZmVjdHNGcmVlRWxlbWVudHNlbGVtZW50c1RoYXRDYW5ub3RUaHJvd2Z1bmN0aW9uc1RoYXRNaWdodEJlUGFzc2VkVG9BcHBseWZpZWxkTmV2ZXJDaGFuZ2Vzc2V0RGVwZW5kc09uSW5zdGFuY2VQcm9wZXJ0eVN0b3Jlc2V0Q2hhbmdlc0luc3RhbmNlUHJvcGVydHlzZXRBbGxTaWRlRWZmZWN0c3NldERlcGVuZHNPblNvbWV0aGluZ1NpZGUgZWZmZWN0cyBoYXZlIG5vdCBiZWVuIGNvbXB1dGVkIHlldC5fbWFrZVNpZGVFZmZlY3RzSW5mZXJyZWREYXRhQnVpbGRlckltcGxfc2lkZUVmZmVjdHNCdWlsZGVyc3ByZW1hdHVyZVNpZGVFZmZlY3RBY2Nlc3Nlc2ZvckVhY2hOb1Rocm93c2ZvckVhY2hOb1NpZGVFZmZlY3RzSW5mZXJyZWQgZGF0YSBoYXMgYWxyZWFkeSBiZWVuIGNvbXB1dGVkLnNpZGVFZmZlY3RzQnVpbGRlcnNzaWRlRWZmZWN0c0J1aWxkZXJlbXB0eVdvcmtMaXN0aW5RdWV1ZWRlcGVuZGluZ1RyaXZpYWxJbmZlcnJlZERhdGFfYWxsU2lkZUVmZmVjdHNkYXJ0MmpzLmpzX21vZGVsLnN0cmF0ZWd5S2VybmVsU291cmNlSW5mb3JtYXRpb25TdHJhdGVneVJlY2lwZUVuY29kZXJSZWNpcGVFbmNvZGVySW1wbE1vZHVsYXJFbWl0dGVyQ29kZUVtaXR0ZXJUYXNrSnNCYWNrZW5kU3RyYXRlZ3lfZWxlbWVudE1hcF9jdXN0b21FbGVtZW50c0NvZGVnZW5BbmFseXNpc19uYXRpdmVDb2RlZ2VuRW5xdWV1ZXJfbmFtZXJfY29kZWdlbkltcGFjdFRyYW5zZm9ybWVyX2VtaXR0ZXJUYXNrX3J0aUNoZWNrc0J1aWxkZXJnZW5lcmF0ZWRDb2RlY29kZWdlbkltcGFjdHNGb3JUZXN0aW5nbmFtZXJGb3JUZXN0aW5nbmF0aXZlQ29kZWdlbkVucXVldWVycnRpQ2hlY2tzQnVpbGRlckZvclRlc3RpbmdnZXRHZW5lcmF0ZWRDb2RlRm9yVGVzdGluZ0pzQmFja2VuZFN0cmF0ZWd5LmVsZW1lbnRNYXAgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LmN1c3RvbUVsZW1lbnRzQ29kZWdlbkFuYWx5c2lzQ3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXMgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LnJ0aUNoZWNrc0J1aWxkZXJSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC5ydGlDaGVja3NCdWlsZGVyQ2xvc2VkUnVudGltZVR5cGVzQ2hlY2tzIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQubGl2ZU1lbWJlclVzYWdlX2dsb2JhbExvY2Fsc01hcGNsb3N1cmVEYXRhQnVpbGRlcmNsb3NlZFdvcmxkQnVpbGRlcmNvbnZlcnRDbG9zZWRXb3JsZGNsb3N1cmVNb2RlbHNsYXRlT3V0cHV0VW5pdERhdGFCdWlsZGVybmF0aXZlRGF0YXJ0aU5lZWRydW50aW1lVHlwZXNJbXBsb25lU2hvdEludGVyY2VwdG9yRGF0YWludGVyY2VwdG9yRGF0YV9vbkNvZGVnZW5FbnF1ZXVlclN0YXJ0cHJvZ3JhbUVudm1haW5Db21wb25lbnRkYXJ0VHlwZXNsaXZlTmF0aXZlQ2xhc3Nlc2NyZWF0ZUVtaXR0ZXJuYXRpdmVFbWl0dGVyZ2VuZXJhdGVDb2RlZW50aXR5TG9va3VwY29tcG9uZW50TG9va3VwdXNlRGF0YUtpbmRzcmVnaXN0ZXJDb2RlZ2VuV3JpdGVycmVnaXN0ZXJDb2RlZ2VuUmVhZGVycmVnaXN0ZXJFbnRpdHlMb29rdXByZWdpc3RlckNvbXBvbmVudExvb2t1cHRyYW5zZm9ybUNvZGVnZW5JbXBhY3RlbWl0RGlhZ25vc3RpY2dldFNvdXJjZVNwYW5yZWdpc3RlckVudGl0eVJlYWRlcmVhcmx5TWVtYmVySW5kZXhMaW1pdHByZXBhcmVGb3JDb2RlZ2VuU2VyaWFsaXphdGlvbmVudGl0eVdyaXRlcm1lbWJlckluZGV4Z2V0RW50aXR5S2VybmVsQ29kZWdlbldvcmtJdGVtQnVpbGRlcl9iYWNrZW5kU3RyYXRlZ3lfY29kZWdlblJlc3VsdHNfZW50aXR5TG9va3VwX2NvbXBvbmVudExvb2t1cEtlcm5lbENvZGVnZW5Xb3JrSXRlbUtlcm5lbFNzYUJ1aWxkZXJfdGFza19kdW1wSW5mb1Rhc2tfc291cmNlSW5mb3JtYXRpb25TdHJhdGVneV9pbmxpbmVDYWNoZV9pbmxpbmVEYXRhQ2FjaGVyZWdpc3RyeW9taXRJbXBsaWNpdENhc3RzZ2V0TWVtYmVyVGhpc1R5cGVLZXJuZWxUb1R5cGVJbmZlcmVuY2VNYXBJbXBsX3RhcmdldFJlc3VsdHNfcmVzdWx0T2ZnZXRSZXR1cm5UeXBlT2ZyZWNlaXZlclR5cGVPZkludm9jYXRpb25yZWNlaXZlclR5cGVPZkdldHJlY2VpdmVyVHlwZU9mRGlyZWN0R2V0cmVjZWl2ZXJUeXBlT2ZTZXRsaXN0TGl0ZXJhbGlzSnNJbmRleGFibGVJdGVyYXRvcmluZmVycmVkSW5kZXhUeXBlZ2V0SW5mZXJyZWRUeXBlT2ZnZXRJbmZlcnJlZFR5cGVPZlBhcmFtZXRlcnR5cGVGcm9tTmF0aXZlQmVoYXZpb3JkYXJ0MmpzLmtlcm5lbC5mcm9udGVuZF9zdHJhdGVneUNsb3N1cmVTY29wZU1vZGVsU2NvcGVNb2RlbEtGaWVsZEFuYWx5c2lzTmF0aXZlUmVzb2x1dGlvbkVucXVldWVyS2VybmVsRnJvbnRlbmRTdHJhdGVneW5hdGl2ZUJhc2ljRGF0YUJ1aWxkZXJfbmF0aXZlQmFzaWNEYXRhX2NvbXBpbGVyVGFza19ydW50aW1lVHlwZXNOZWVkQnVpbGRlcl9hbm5vdGF0aW9uUHJvY2Vzc29yX21vZHVsYXJTdHJhdGVneV9pckFubm90YXRpb25EYXRhX25hdGl2ZURhdGFCdWlsZGVyX2JhY2tlbmRVc2FnZUJ1aWxkZXJfbmF0aXZlUmVzb2x1dGlvbkVucXVldWVyX2N1c3RvbUVsZW1lbnRzUmVzb2x1dGlvbkFuYWx5c2lzX2ZpZWxkQW5hbHlzaXNpbXBhY3RUcmFuc2Zvcm1lcm5hdGl2ZVJlc29sdXRpb25FbnF1ZXVlckZvclRlc3RpbmdmaWVsZEFuYWx5c2lzRm9yVGVzdGluZ192YWxpZGF0ZUludGVyY2VwdG9ySW1wbGVtZW50c0FsbE9iamVjdE1ldGhvZHNpbnRlcmNlcHRvckNsYXNzaW50ZXJjZXB0b3JNZW1iZXJNZW1iZXIgIG5vdCBvdmVycmlkZGVuIGluIC4gRm91bmQgcnRpTmVlZEJ1aWxkZXJfY3JlYXRlUnVudGltZVR5cGVzTmVlZEJ1aWxkZXJjbGFzc1F1ZXJpZXNjbGFzc0hpZXJhcmNoeUJ1aWxkZXJhbm5vdGF0aW9uc0RhdGFCdWlsZGVycHJhZ21hQW5ub3RhdGlvbnNpbnRlcmNlcHRvckRhdGFCdWlsZGVyQW5ub3RhdGlvblByb2Nlc3NvciBoYXMgbm90IGJlZW4gY3JlYXRlZC5OYXRpdmVCYXNpY0RhdGEgaGFzIG5vdCBiZWVuIGNvbXB1dGVkIHlldC5rZXJuZWxSZXN1bHRhZGRDb21wb25lbnRyZWdpc3Rlckh0bWxJc0xvYWRlZGlyQW5ub3RhdGlvbkRhdGFGb3JUZXN0aW5nbW9kdWxhclN0cmF0ZWd5Rm9yVGVzdGluZ3J1bnRpbWVUeXBlc05lZWRCdWlsZGVyRm9yVGVzdGluZ0tlcm5lbFdvcmtJdGVtQnVpbGRlcl9pbXBhY3RUcmFuc2Zvcm1lcl9uYXRpdmVNZW1iZXJSZXNvbHZlcl9hbm5vdGF0aW9uc0RhdGFCdWlsZGVyX2Nsb3N1cmVNb2RlbHNLZXJuZWxXb3JrSXRlbWdldE1lbWJlck5vZGVyZXNvbHZlTmF0aXZlTWVtYmVycHJhZ21hQW5ub3RhdGlvbkRhdGFnZXRQcmFnbWFBbm5vdGF0aW9uRGF0YXJlZ2lzdGVyUHJhZ21hQW5ub3RhdGlvbnNtb2R1bGFyTWVtYmVyRGF0YWdldE1vZHVsYXJNZW1iZXJEYXRhc2NvcGVNb2RlbGNsb3N1cmVTY29wZU1vZGVscmVnaXN0ZXJTdGF0aWNGaWVsZGluaXRpYWxpemVyQ29tcGxleGl0eWltcGFjdEJ1aWxkZXJEYXRhY29tcHV0ZVdvcmxkSW1wYWN0dmFyaWFibGVTY29wZU1vZGVsbm9JbmxpbmV0cnlJbmxpbmVkaXNhYmxlRmluYWxub0VsaXNpb25ub1Rocm93c25vU2lkZUVmZmVjdHNhc3N1bWVEeW5hbWljYXM6dHJ1c3RhczpjaGVja3R5cGVzOnRydXN0dHlwZXM6Y2hlY2twYXJhbWV0ZXI6dHJ1c3RwYXJhbWV0ZXI6Y2hlY2tkb3duY2FzdDp0cnVzdGRvd25jYXN0OmNoZWNrdHJhbnNmb3JtUmVzb2x1dGlvbkltcGFjdEtlcm5lbFdvcmtJdGVtKEtlcm5lbE1vZHVsYXJTdHJhdGVneXVzZUFzc2VydHNpbmZlckVmZmVjdGl2ZWx5RmluYWxWYXJpYWJsZVR5cGVzY29tcHV0ZUltcGFjdHVzZUltcGFjdERhdGFGb3JUZXN0aW5nZGFydDJqcy5saWJyYXJ5X2xvYWRlckRhcnQyanNUYXJnZXRfY29tcGlsZXJJbnB1dF9jb21waWxlck91dHB1dGZvcmNlU2VyaWFsaXphdGlvbmtlcm5lbCBsb2FkZXJfcGxhdGZvcm0uZGlsbGlzRGlsbC5kaWxsc2VyaWFsaXplIGRpbGxXcml0aW5nIGRpbGwgdG8gZGlsbE91dHB1dGlyU2lua190b1Jlc3VsdHNlYXJjaGRlcGRhcnRDb3Jlcm9vdD0sbGlicmFyaWVzPVNlcmlhbGl6YXRpb25UYXNrX3Byb3ZpZGVyU2VyaWFsaXphdGlvbnNlcmlhbGl6ZSBkYXRhV3JpdGluZyBkYXRhIHRvIGRlc2VyaWFsaXplIGRpbGxSZWFkaW5nIGRpbGwgZnJvbSBkaWxsSW5wdXRkZXNlcmlhbGl6ZSBkYXRhUmVhZGluZyBkYXRhIGZyb20gc2hhcmRzaGFyZHNjb2RlZ2VuUmVzdWx0c2VyaWFsaXplIGNvZGVnZW5yZWdpc3RlckVudGl0eVdyaXRlcmRlc2VyaWFsaXplIGNvZGVnZW5yZWFkZXJkZXJlZ2lzdGVyQ29kZWdlblJlYWRlciBtZW1iZXJzIGZyb20gc2VyaWFsaXplR2xvYmFsVHlwZUluZmVyZW5jZVJlc3VsdHNkZXNlcmlhbGl6ZUdsb2JhbFR5cGVJbmZlcmVuY2VSZXN1bHRzbmV3Q2xvc2VkV29ybGRuZXdJbmZlcnJlZERhdGFTZXJpYWxpemF0aW9uU3RyYXRlZ3lCeXRlc0luTWVtb3J5U2VyaWFsaXphdGlvblN0cmF0ZWd5Qnl0ZXNPbkRpc2tTZXJpYWxpemF0aW9uU3RyYXRlZ3l3b3JsZC5kYXRhT2JqZWN0c0luTWVtb3J5U2VyaWFsaXphdGlvblN0cmF0ZWd5VHlwZUVudmlyb25tZW50U3RydWN0dXJlVHlwZVJlY2lwZVNpZGVFZmZlY3RzSFZpc2l0b3J2aXNpdEFic3Zpc2l0QWRkdmlzaXRCaXRBbmR2aXNpdEJpdE5vdHZpc2l0Qml0T3J2aXNpdEJpdFhvcnZpc2l0Qm91bmRzQ2hlY2t2aXNpdENyZWF0ZXZpc2l0Q3JlYXRlQm94dmlzaXREaXZpZGV2aXNpdEV4aXR2aXNpdEV4aXRUcnl2aXNpdEZpZWxkR2V0dmlzaXRGaWVsZFNldHZpc2l0Rm9yZWlnbkNvZGV2aXNpdEdldExlbmd0aHZpc2l0R290b3Zpc2l0R3JlYXRlcnZpc2l0R3JlYXRlckVxdWFsdmlzaXRJZGVudGl0eXZpc2l0SW5kZXh2aXNpdEluZGV4QXNzaWdudmlzaXRJbnRlcmNlcHRvcnZpc2l0SW52b2tlQ2xvc3VyZXZpc2l0SW52b2tlRHluYW1pY0dldHRlcnZpc2l0SW52b2tlRHluYW1pY01ldGhvZHZpc2l0SW52b2tlRHluYW1pY1NldHRlcnZpc2l0SW52b2tlU3RhdGljdmlzaXRJbnZva2VTdXBlcnZpc2l0SW52b2tlQ29uc3RydWN0b3JCb2R5dmlzaXRJbnZva2VHZW5lcmF0b3JCb2R5dmlzaXRJc3Zpc2l0SXNWaWFJbnRlcmNlcHRvcnZpc2l0TGF0ZVZhbHVldmlzaXRMYXp5U3RhdGljdmlzaXRMZXNzdmlzaXRMZXNzRXF1YWx2aXNpdExpdGVyYWxMaXN0dmlzaXRMb2NhbEdldHZpc2l0TG9jYWxTZXR2aXNpdExvY2FsVmFsdWV2aXNpdExvb3BCcmFuY2h2aXNpdE11bHRpcGx5dmlzaXROZWdhdGV2aXNpdE9uZVNob3RJbnRlcmNlcHRvcnZpc2l0UGFyYW1ldGVyVmFsdWV2aXNpdFBoaXZpc2l0UmFuZ2VDb252ZXJzaW9udmlzaXRSZWFkTW9kaWZ5V3JpdGV2aXNpdFJlZnZpc2l0UmVtYWluZGVydmlzaXRTaGlmdExlZnR2aXNpdFNoaWZ0UmlnaHR2aXNpdFN0YXRpY3Zpc2l0U3RhdGljU3RvcmV2aXNpdFN0cmluZ0NvbmNhdHZpc2l0U3RyaW5naWZ5dmlzaXRTdWJ0cmFjdHZpc2l0VGhyb3dFeHByZXNzaW9udmlzaXRUcnVuY2F0aW5nRGl2aWRldmlzaXRUeXBlQ29udmVyc2lvbnZpc2l0UHJpbWl0aXZlQ2hlY2t2aXNpdEJvb2xDb252ZXJzaW9udmlzaXRUeXBlS25vd252aXNpdFlpZWxkdmlzaXRUeXBlSW5mb1JlYWRSYXd2aXNpdFR5cGVJbmZvUmVhZFZhcmlhYmxldmlzaXRUeXBlSW5mb0V4cHJlc3Npb252aXNpdElzVGVzdHZpc2l0QXNDaGVja3Zpc2l0QXNDaGVja1NpbXBsZXZpc2l0U3VidHlwZUNoZWNrdmlzaXRMb2FkVHlwZXZpc2l0SW5zdGFuY2VFbnZpcm9ubWVudHZpc2l0VHlwZUV2YWx2aXNpdFR5cGVCaW5kSEdyYXBoVmlzaXRvcnZpc2l0RG9taW5hdG9yVHJlZWZyYW1ldmlzaXRCYXNpY0Jsb2NrZG9taW5hdGVkQmxvY2tzdmlzaXRQb3N0RG9taW5hdG9yVHJlZV9GcmFtZUhJbnN0cnVjdGlvblZpc2l0b3JjdXJyZW50QmxvY2t2aXNpdEluc3RydWN0aW9udmlzaXRJbnN0cnVjdGlvbkxpc3RpbnN0cnVjdGlvbkhHcmFwaHRoaXNJbnN0cnVjdGlvbm5lZWRzQXN5bmNSZXdyaXRlYXN5bmNFbGVtZW50VHlwZWV4cGxpY2l0UmVjZWl2ZXJQYXJhbWV0ZXJpc1JlY3Vyc2l2ZU1ldGhvZGNhbGxlZEluTG9vcGJsb2Nrc2FsbG9jYXRlZEZpeGVkTGlzdHNhZGROZXdCbG9ja2FkZEJsb2NrYWRkTmV3TG9vcEhlYWRlckJsb2NrbG9vcEluZm9ybWF0aW9uaXNDb25zdGFudGFkZEF0RXhpdGFkZERlZmVycmVkQ29uc3RhbnRhZGRDb25zdGFudEludGFkZENvbnN0YW50SW50QXNVbnNpZ25lZGFkZENvbnN0YW50RG91YmxlYWRkQ29uc3RhbnRTdHJpbmdhZGRDb25zdGFudFN0cmluZ0Zyb21OYW1lYWRkQ29uc3RhbnRCb29sYWRkQ29uc3RhbnROdWxsYWRkQ29uc3RhbnRVbnJlYWNoYWJsZWFzc2lnbkRvbWluYXRvcnNwcmVkZWNlc3NvcnNpc0xvb3BIZWFkZXJhc3NpZ25Db21tb25Eb21pbmF0b3Jhc3NpZ25Eb21pbmF0b3JSYW5nZXNkZnNOdW1iZXJkb21pbmF0b3JEZnNJbmRvbWluYXRvckRmc091dGlzVmFsaWR2YWxpZGF0b3J2aXNpdEdyYXBoSEdyYXBoKEhCYXNlVmlzaXRvcnZpc2l0QmluYXJ5QXJpdGhtZXRpY3Zpc2l0SW52b2tlQmluYXJ5dmlzaXRCaW5hcnlCaXRPcHZpc2l0SW52b2tldmlzaXRJbnZva2VEeW5hbWljdmlzaXRJbnZva2VEeW5hbWljRmllbGR2aXNpdEludm9rZVVuYXJ5dmlzaXRDb25kaXRpb25hbEJyYW5jaHZpc2l0Q29udHJvbEZsb3d2aXNpdEZpZWxkQWNjZXNzdmlzaXRSZWxhdGlvbmFsdmlzaXRDaGVja3Zpc2l0SnVtcHZpc2l0TG9jYWxBY2Nlc3NTdWJHcmFwaFN1YkV4cHJlc3Npb25jb25kaXRpb25FeHByZXNzaW9uSEluc3RydWN0aW9uTGlzdGludGVybmFsQWRkQWZ0ZXJjdXJzb3JpbnRlcm5hbEFkZEJlZm9yZWRldGFjaF90cnVuY2F0ZWRDb250YWluc0ZvckFzc2VydGlzSW5CYXNpY0Jsb2NrdXNlZEJ5SEJhc2ljQmxvY2tTVEFUVVNfTkVXU1RBVFVTX09QRU5TVEFUVVNfQ0xPU0VEc3RhdHVzcGhpc2Jsb2NrRmxvd3BhcmVudExvb3BIZWFkZXJpc0xpdmVzdWNjZXNzb3JzZG9taW5hdG9yd2l0aElkaXNOZXdpc09wZW5pc0Nsb3NlZHNldEJsb2NrRmxvd2Jsb2NrSW5mb2NvbnRpbnVhdGlvbmlzTGFiZWxlZEJsb2NrZW5jbG9zaW5nTG9vcEhlYWRlcmFkZEFmdGVyYWRkQXRFbnRyeW5vdGlmeUFkZGVkVG9CbG9ja21vdmVBdEV4aXRhZGRQaGlwaGlyZW1vdmVQaGlub3RpZnlSZW1vdmVkRnJvbUJsb2NrYWRkQmVmb3JlYWRkU3VjY2Vzc29ycG9zdFByb2Nlc3NMb29wSGVhZGVyYWRkQmFja0VkZ2VyZXdyaXRlcmV3cml0ZUlucHV0cmV3cml0ZVdpdGhCZXR0ZXJVc2VyYmV0dGVyY2hlY2tlZElucHV0ZG9taW5hdGVzaXNFeGl0QmxvY2thZGREb21pbmF0ZWRCbG9ja3JlbW92ZURvbWluYXRlZEJsb2NrcHJlZGVjZXNzb3JibG9jazBibG9jazFmb3JFYWNoUGhpc2F2ZWRmb3JFYWNoSW5zdHJ1Y3Rpb25IQmFzaWNCbG9jayhpZENvdW50ZXJfdXNlR3ZuVU5ERUZJTkVEX1RZUEVDT0RFVFlQRV9HVUFSRF9UWVBFQ09ERUJPVU5EU19DSEVDS19UWVBFQ09ERUlOVEVHRVJfQ0hFQ0tfVFlQRUNPREVJTlRFUkNFUFRPUl9UWVBFQ09ERUFERF9UWVBFQ09ERURJVklERV9UWVBFQ09ERU1VTFRJUExZX1RZUEVDT0RFU1VCVFJBQ1RfVFlQRUNPREVTSElGVF9MRUZUX1RZUEVDT0RFQklUX09SX1RZUEVDT0RFQklUX0FORF9UWVBFQ09ERUJJVF9YT1JfVFlQRUNPREVORUdBVEVfVFlQRUNPREVCSVRfTk9UX1RZUEVDT0RFTk9UX1RZUEVDT0RFSURFTlRJVFlfVFlQRUNPREVHUkVBVEVSX1RZUEVDT0RFR1JFQVRFUl9FUVVBTF9UWVBFQ09ERUxFU1NfVFlQRUNPREVMRVNTX0VRVUFMX1RZUEVDT0RFU1RBVElDX1RZUEVDT0RFU1RBVElDX1NUT1JFX1RZUEVDT0RFRklFTERfR0VUX1RZUEVDT0RFVFlQRV9DT05WRVJTSU9OX1RZUEVDT0RFVFlQRV9LTk9XTl9UWVBFQ09ERUlOVk9LRV9TVEFUSUNfVFlQRUNPREVJTkRFWF9UWVBFQ09ERUlTX1RZUEVDT0RFSU5WT0tFX0RZTkFNSUNfVFlQRUNPREVTSElGVF9SSUdIVF9UWVBFQ09ERVRSVU5DQVRJTkdfRElWSURFX1RZUEVDT0RFSVNfVklBX0lOVEVSQ0VQVE9SX1RZUEVDT0RFVFlQRV9JTkZPX1JFQURfUkFXX1RZUEVDT0RFVFlQRV9JTkZPX1JFQURfVkFSSUFCTEVfVFlQRUNPREVUWVBFX0lORk9fRVhQUkVTU0lPTl9UWVBFQ09ERUZPUkVJR05fQ09ERV9UWVBFQ09ERVJFTUFJTkRFUl9UWVBFQ09ERUdFVF9MRU5HVEhfVFlQRUNPREVBQlNfVFlQRUNPREVCT09MX0NPTlZFUlNJT05fVFlQRUNPREVQUklNSVRJVkVfQ0hFQ0tfVFlQRUNPREVJU19URVNUX1RZUEVDT0RFQVNfQ0hFQ0tfVFlQRUNPREVBU19DSEVDS19TSU1QTEVfVFlQRUNPREVTVUJUWVBFX0NIRUNLX1RZUEVDT0RFTE9BRF9UWVBFX1RZUEVDT0RFSU5TVEFOQ0VfRU5WSVJPTk1FTlRfVFlQRUNPREVUWVBFX0VWQUxfVFlQRUNPREVUWVBFX0JJTkRfVFlQRUNPREVpbnN0cnVjdGlvblR5cGVpbnB1dHM6IHVzZUd2bnNldFVzZUd2bmlzTW92YWJsZWlzUHVyZWhhc1NpZGVFZmZlY3RzZGVwZW5kc09uU29tZXRoaW5nY2FuVGhyb3dpc0FsbG9jYXRpb25ub25DaGVja2lzQ29udHJvbEZsb3dpc0NvbmZsaWN0aW5nZ2V0RGFydFJlY2VpdmVyb25seVRocm93c05TTWd2bkVxdWFsc2hhc1NhbWVUeXBldHlwZUVxdWFsc3R5cGVDb2RlaW5wdXRzTGVuZ3Rob3RoZXJJbnB1dHNkYXRhRXF1YWxzZ3ZuSGFzaENvZGV0YXJnZXRCbG9ja3JlbW92ZVVzZXJyZW1vdmVGcm9tTGlzdGNoYW5nZVVzZW9sZElucHV0bmV3SW5wdXRyZXBsYWNlQWxsVXNlcnNEb21pbmF0ZWRCeW5ld0luc3RydWN0aW9ubW92ZUJlZm9yZWlzQ29uc3RhbnRCb29sZWFuaXNDb25zdGFudE51bGxpc0NvbnN0YW50TnVtYmVyaXNDb25zdGFudEludGVnZXJpc0NvbnN0YW50U3RyaW5naXNDb25zdGFudExpc3Rpc0NvbnN0YW50TWFwaXNDb25zdGFudEZhbHNlaXNDb25zdGFudFRydWVpc0NvZGVNb3Rpb25JbnZhcmlhbnRpc0pzU3RhdGVtZW50Y29udmVydFR5cGVpc0Z1bmN0aW9uVHlwZWlzVm9pZGlzRnV0dXJlT3JjcmVhdGluZyBjb21wb3VuZCBjaGVjayB0byAgKHRoaXMgPSBpbnRlcmZhY2VUeXBlaGFzU2FtZUxvb3BIZWFkZXJBcygpRG9taW5hdGVkVXNlc19zb3VyY2VfaW5zdHJ1Y3Rpb25zX2luZGV4ZXNleGNsdWRlRG9taW5hdG9yZXhjbHVkZVBoaU91dEVkZ2VzX2NvbXB1dGVvbGRJbnN0cnVjdGlvbklucHV0ICBjaGFuZ2VkLgogIEZvdW5kOiAKICBFeHBlY3RlZDogaXNTaW5nbGV0b25pbnN0cnVjdGlvbnNfYWRkVXNlaW5wdXRJbmRleHVzZXJzSW5DdXJyZW50QmxvY2tkb21pbmF0b3JCbG9ja0hSZWZjb252ZXJzaW9uSFJlZihITGF0ZUluc3RydWN0aW9uSENoZWNrSEJvdW5kc0NoZWNrQUxXQVlTX0ZBTFNFRlVMTF9DSEVDS0FMV0FZU19BQk9WRV9aRVJPQUxXQVlTX0JFTE9XX0xFTkdUSEFMV0FZU19UUlVFc3RhdGljQ2hlY2tzcmVwb3J0ZWRJbmRleEhDb25kaXRpb25hbEJyYW5jaHRydWVCcmFuY2hmYWxzZUJyYW5jaEhDb250cm9sRmxvd0hDcmVhdGVoYXNSdGlJbnB1dGluc3RhbnRpYXRlZFR5cGVzcnRpSW5wdXRIQ3JlYXRlKEhDcmVhdGVCb3hIQ3JlYXRlQm94KClISW52b2tlX2lzQWxsb2NhdGlvbmlzSW50ZXJjZXB0ZWRDYWxsQVJHVU1FTlRTX09GRlNFVHJlc3VsdFR5cGVzZXRBbGxvY2F0aW9uSEludm9rZUR5bmFtaWNzcGVjaWFsaXplcl9yZWNlaXZlclR5cGVfb3JpZ2luYWxSZWNlaXZlclR5cGVpc0ludGVyY2VwdGVkdXBkYXRlUmVjZWl2ZXJUeXBlaW52b2tlIGR5bmFtaWM6IHNlbGVjdG9yPSwgbWFzaz1pc0NhbGxPbkludGVyY2VwdG9ySEludm9rZUNsb3N1cmVISW52b2tlRHluYW1pY01ldGhvZGludm9rZSBkeW5hbWljIG1ldGhvZDogc2VsZWN0b3I9SEludm9rZUR5bmFtaWNGaWVsZGludm9rZSBkeW5hbWljIGZpZWxkOiBzZWxlY3Rvcj1ISW52b2tlRHluYW1pY0dldHRlcmlzVGVhck9mZmludm9rZSBkeW5hbWljIGdldHRlcjogc2VsZWN0b3I9SEludm9rZUR5bmFtaWNTZXR0ZXJuZWVkc0NoZWNraW52b2tlIGR5bmFtaWMgc2V0dGVyOiBzZWxlY3Rvcj0sIGVsZW1lbnQ9SEludm9rZVN0YXRpY3RhcmdldENhblRocm93aW52b2tlIHN0YXRpYzogSEludm9rZVN1cGVyY2FsbGVyaW52b2tlIHN1cGVyOiBISW52b2tlQ29uc3RydWN0b3JCb2R5aW52b2tlIGNvbnN0cnVjdG9yIGJvZHk6IEhJbnZva2VHZW5lcmF0b3JCb2R5SEludm9rZUdlbmVyYXRvckJvZHkoSEZpZWxkQWNjZXNzSEZpZWxkR2V0Y2xlYXJBbGxTaWRlRWZmZWN0c2NsZWFyQWxsRGVwZW5kZW5jaWVzdGhpc0xvY2FsaXNJbnRlcmNlcHRlZENsYXNzaXNOdWxsQ2hlY2tGaWVsZEdldChlbGVtZW50PSx0eXBlPUhGaWVsZFNldEZpZWxkU2V0KGVsZW1lbnQ9SEdldExlbmd0aEdldExlbmd0aCgpSFJlYWRNb2RpZnlXcml0ZUFTU0lHTl9PUFBSRV9PUFBPU1RfT1Bqc09wb3BLaW5kYXNzaWduT3BwcmVPcHBvc3RPcGlzUHJlT3Bpc1Bvc3RPcGlzQXNzaWduT3BSZWFkTW9kaWZ5V3JpdGUgSExvY2FsQWNjZXNzSExvY2FsR2V0SExvY2FsU2V0SEZvcmVpZ25pc1N0YXRlbWVudEhGb3JlaWduQ29kZWNvZGVUZW1wbGF0ZXRocm93QmVoYXZpb3Jmb3JlaWduRnVuY3Rpb25lZmZlY3Rzb25Ob25OdWxsaXNPbmx5TnVsbE5TTUd1YXJkSEZvcmVpZ25Db2RlKCIiKUhJbnZva2VCaW5hcnlIQmluYXJ5QXJpdGhtZXRpY0hBZGRIRGl2aWRlSE11bHRpcGx5SFN1YnRyYWN0SFRydW5jYXRpbmdEaXZpZGVIUmVtYWluZGVySFN3aXRjaGRlZmF1bHRUYXJnZXRIU3dpdGNoIGNhc2VzID0gSEJpbmFyeUJpdE9wSFNoaWZ0TGVmdEhTaGlmdFJpZ2h0SEJpdE9ySEJpdEFuZEhCaXRYb3JISW52b2tlVW5hcnlITmVnYXRlSEFic0hCaXROb3RIRXhpdEhHb3RvZ290b0hKdW1wdG9MYWJlbEhCcmVha2JyZWFrU3dpdGNoQ29udGludWVMb29wYnJlYWsgSENvbnRpbnVlY29udGludWUgSFRyeWNhdGNoQmxvY2tqb2luQmxvY2tIRXhpdFRyeWV4aXQgdHJ5Ym9keVRyeVN1Y2Nlc3NvckhJZmJsb2NrSW5mb3JtYXRpb250aGVuQmxvY2tlbHNlQmxvY2tITG9vcEJyYW5jaENPTkRJVElPTl9GSVJTVF9MT09QRE9fV0hJTEVfTE9PUGxvb3AtYnJhbmNoSENvbnN0YW50bGl0ZXJhbDogaXNCb29saXNOdW1pc0ludGlzTGlzdGlzRmFsc2Vpc1RydWVITm90SExvY2FsVmFsdWVsb2NhbCBIUGFyYW1ldGVyVmFsdWV1c2VkQXNWYXJpYWJsZXBhcmFtZXRlciBIVGhpc0hQaGlJU19OT1RfTE9HSUNBTF9PUEVSQVRPUklTX0FORElTX09SbG9naWNhbE9wZXJhdG9yVHlwZW5vSW5wdXRzc2luZ2xlSW5wdXRtYW55SW5wdXRzYWRkSW5wdXRwaGkgSFJlbGF0aW9uYWx1c2VzQm9vbGlmaWVkSW50ZXJjZXB0b3JISWRlbnRpdHlzaW5nbGVDb21wYXJpc29uT3BIR3JlYXRlckhHcmVhdGVyRXF1YWxITGVzc0hMZXNzRXF1YWxIUmV0dXJuSFRocm93RXhwcmVzc2lvbnRocm93IGV4cHJlc3Npb25IQXdhaXRIWWllbGRIVGhyb3dpc1JldGhyb3dIU3RhdGljc2V0RGVwZW5kc09uU3RhdGljUHJvcGVydHlTdG9yZXN0YXRpYyBISW50ZXJjZXB0b3JpbnRlcmNlcHRlZENsYXNzZXNpbnRlcmNlcHRvciBvbiBpc0NvbmRpdGlvbmFsQ29uc3RhbnRJbnRlcmNlcHRvcmNvbmRpdGlvbmFsQ29uc3RhbnRJbnRlcmNlcHRvckhPbmVTaG90SW50ZXJjZXB0b3JvbmUgc2hvdCBpbnRlcmNlcHRvcjogc2VsZWN0b3I9SExhenlTdGF0aWNsYXp5IHN0YXRpYyBIU3RhdGljU3RvcmVzZXRDaGFuZ2VzU3RhdGljUHJvcGVydHlzdGF0aWMgc3RvcmUgSExpdGVyYWxMaXN0bGl0ZXJhbCBsaXN0SEluZGV4c2V0RGVwZW5kc09uSW5kZXhTdG9yZWluZGV4IG9wZXJhdG9ySEluZGV4QXNzaWduc2V0Q2hhbmdlc0luZGV4aW5kZXggYXNzaWduIG9wZXJhdG9ySElzUkFXX0NIRUNLQ09NUE9VTkRfQ0hFQ0tWQVJJQUJMRV9DSEVDS3R5cGVFeHByZXNzaW9udXNlSW5zdGFuY2VPZmRpcmVjdGluc3RhbmNlT2Zjb21wb3VuZGludGVyY2VwdG9yVW5leHBlY3RlZCByYXcgaXMtdGVzdCB0eXBlOiBjaGVja0NhbGxpc1Jhd0NoZWNraXNWYXJpYWJsZUNoZWNraXNDb21wb3VuZENoZWNrIGlzIEhJc1ZpYUludGVyY2VwdG9ySExhdGVWYWx1ZUhMYXRlVmFsdWUoSFR5cGVDb252ZXJzaW9uVFlQRV9DSEVDS0NBU1RfQ0hFQ0tpbnB1dFR5cGVpc1R5cGVkZWZ3aXRoVHlwZVJlcHJlc2VudGF0aW9udHlwZVJlcHJlc2VudGF0aW9uaGFzVHlwZVJlcHJlc2VudGF0aW9uaXNUeXBlQ2hlY2tpc0Nhc3RDaGVja2lzUmVkdW5kYW50SFR5cGVDb252ZXJzaW9uKHR5cGU9LCBraW5kPXJlcHJlc2VudGF0aW9uPWNoZWNrZWRJbnB1dD1IUHJpbWl0aXZlQ2hlY2tBUkdVTUVOVF9UWVBFX0NIRUNLUkVDRUlWRVJfVFlQRV9DSEVDS3JlY2VpdmVyVHlwZUNoZWNrU2VsZWN0b3Jpc1JlY2VpdmVyVHlwZUNoZWNraXNBcmd1bWVudFR5cGVDaGVja0hQcmltaXRpdmVDaGVjayhjaGVja2VkVHlwZT1IQm9vbENvbnZlcnNpb25IQm9vbENvbnZlcnNpb24oSFR5cGVLbm93bmtub3duVHlwZV9pc01vdmFibGVwaW5uZWR3aXRuZXNzZWR3aXRuZXNzVHlwZUtub3duIGlzUGlubmVkSFJhbmdlQ29udmVyc2lvbkhTdHJpbmdDb25jYXRzdHJpbmcgY29uY2F0SFN0cmluZ2lmeXN0cmluZ2lmeUhMb29wSW5mb3JtYXRpb25iYWNrRWRnZXNsb29wQmxvY2tJbmZvcm1hdGlvbndvcmtRdWV1ZXBhcmVudEhlYWRlckhCbG9ja0Zsb3dIQmxvY2tJbmZvcm1hdGlvbkhTdGF0ZW1lbnRJbmZvcm1hdGlvbkhFeHByZXNzaW9uSW5mb3JtYXRpb25IU3RhdGVtZW50SW5mb3JtYXRpb25WaXNpdG9ydmlzaXRMYWJlbGVkQmxvY2tJbmZvdmlzaXRMb29wSW5mb3Zpc2l0SWZJbmZvdmlzaXRUcnlJbmZvdmlzaXRTd2l0Y2hJbmZvdmlzaXRTZXF1ZW5jZUluZm92aXNpdFN1YkdyYXBoSW5mb0hFeHByZXNzaW9uSW5mb3JtYXRpb25WaXNpdG9ydmlzaXRBbmRPckluZm92aXNpdFN1YkV4cHJlc3Npb25JbmZvSEJsb2NrSW5mb3JtYXRpb25WaXNpdG9ySFN1YkdyYXBoQmxvY2tJbmZvcm1hdGlvbnN1YkdyYXBoSFN1YkV4cHJlc3Npb25CbG9ja0luZm9ybWF0aW9uc3ViRXhwcmVzc2lvbkhTdGF0ZW1lbnRTZXF1ZW5jZUluZm9ybWF0aW9uSExhYmVsZWRCbG9ja0luZm9ybWF0aW9uaXNDb250aW51ZUhMb29wQmxvY2tJbmZvcm1hdGlvbldISUxFX0xPT1BGT1JfTE9PUEZPUl9JTl9MT09QU1dJVENIX0NPTlRJTlVFX0xPT1BOT1RfQV9MT09QbG9vcEhlYWRlckhJZkJsb2NrSW5mb3JtYXRpb250aGVuR3JhcGhlbHNlR3JhcGhIQW5kT3JCbG9ja0luZm9ybWF0aW9uSFRyeUJsb2NrSW5mb3JtYXRpb25jYXRjaFZhcmlhYmxlSFN3aXRjaEJsb2NrSW5mb3JtYXRpb25IVHlwZUluZm9SZWFkUmF3SFR5cGVJbmZvUmVhZFZhcmlhYmxlaW50ZXJjZXB0ZWRub0ludGVyY2VwdG9ySFR5cGVJbmZvUmVhZFZhcmlhYmxlKFR5cGVJbmZvRXhwcmVzc2lvbktpbmRUeXBlSW5mb0V4cHJlc3Npb25LaW5kLkNPTVBMRVRFVHlwZUluZm9FeHByZXNzaW9uS2luZC5JTlNUQU5DRUNPTVBMRVRFSU5TVEFOQ0VIVHlwZUluZm9FeHByZXNzaW9uZGFydFR5cGVpc1R5cGVWYXJpYWJsZVJlcGxhY2VtZW50SFR5cGVJbmZvRXhwcmVzc2lvbihraW5kQXNTdHJpbmdISXNUZXN0cnRpdHlwZUlucHV0SElzVGVzdCgpSEFzQ2hlY2tjaGVja2VkVHlwZUV4cHJlc3Npb25UeXBlRXJyb3JDYXN0RXJyb3JIQXNDaGVjayhIQXNDaGVja1NpbXBsZUhTdWJ0eXBlQ2hlY2tIU3VidHlwZUNoZWNrKClIUnRpSW5zdHJ1Y3Rpb25ITG9hZFR5cGVITG9hZFR5cGUoSEluc3RhbmNlRW52aXJvbm1lbnRISW5zdGFuY2VFbnZpcm9ubWVudCgpSFR5cGVFdmFsZW52U3RydWN0dXJlSFR5cGVFdmFsKEhUeXBlQmluZEhUeXBlQmluZCgpZGFydDJqcy5zZWxlY3RvcnV0aWxzU2VsZWN0b3JLaW5kR0VUVEVSU0VUVEVSQ0FMTFNQRUNJQUxzcGVjaWFsY2Fub25pY2FsaXplZFZhbHVlc2tpbmQ9LG1lbWJlck5hbWU9LGNhbGxTdHJ1Y3R1cmU6YXJndW1lbnRDb3VudG5hbWVkQXJndW1lbnRDb3VudGlzT3BlcmF0b3JOYW1lVW5hcnlPcGVyYXRvcktpbmQuTkVHQVRFc2VsZWN0b3JOYW1lVW5hcnlPcGVyYXRvcktpbmQuQ09NUExFTUVOVGZyb21FbGVtZW50Q2FuJ3QgZ2V0IHNlbGVjdG9yIGZyb20gdW5hcnlPcGVyYXRvcmNhbGxDbG9zdXJlYXJpdHljYWxsQ2xvc3VyZUZyb21jYWxsQ29uc3RydWN0b3JjYWxsRGVmYXVsdENvbnN0cnVjdG9ycmVhZExpYnJhcnlPck51bGx3cml0ZUxpYnJhcnlPck51bGxpbnZvY2F0aW9uTWlycm9yTWVtYmVyTmFtZWludm9jYXRpb25NaXJyb3JLaW5kc2lnbmF0dXJlQXBwbGllc2FwcGxpZXNUb051bGxXaXRob3V0VGhyb3dTZWxlY3RvcihzdHJ1Y3R1cmVUb1N0cmluZ3RvTm9ybWFsaXplZGlzTm9ybWFsaXplZHRvQ2FsbFNlbGVjdG9ydG9Ob25HZW5lcmljbm9uR2VuZXJpY09uZVNob3RJbnRlcmNlcHRvckRhdGFEeW5hbWljVXNlS2luZENvZGVnZW5Xb3JsZEJ1aWxkZXJhZGRDb21waWxlVGltZUNvbnN0YW50Rm9yRW1pc3Npb25Db2RlZ2VuV29ybGRmb3JFYWNoR2VuZXJpY0Nsb3N1cmVDYWxsTWV0aG9kaGFzSW52b2tlZEdldHRlcmhhc0ludm9rZWRTZXR0ZXJpbnZvY2F0aW9uc0J5TmFtZWdldHRlckludm9jYXRpb25zQnlOYW1lc2V0dGVySW52b2NhdGlvbnNCeU5hbWVmb3JFYWNoSW52b2tlZE5hbWVmb3JFYWNoSW52b2tlZEdldHRlcmZvckVhY2hJbnZva2VkU2V0dGVyaW5zdGFudGlhdGVkQ2xhc3Nlc21ldGhvZHNOZWVkc1N1cGVyR2V0dGVyZm9yRWFjaFN0YXRpY0ZpZWxkY29uc3RUeXBlTGl0ZXJhbHNsaXZlVHlwZUFyZ3VtZW50c2dldENvbnN0YW50c0ZvckVtaXNzaW9ucHJlU29ydENvbXBhcmVpc0FsaWFzZWRTdXBlck1lbWJlckNvZGVnZW5Xb3JsZEJ1aWxkZXJJbXBsX29uZVNob3RJbnRlcmNlcHRvckRhdGFfZGlyZWN0bHlJbnN0YW50aWF0ZWRDbGFzc2VzX2luc3RhbnRpYXRlZFR5cGVzX2ltcGxlbWVudGVkQ2xhc3Nlc19pbnZva2VkTmFtZXNfaW52b2tlZEdldHRlcnNfaW52b2tlZFNldHRlcnNfcHJvY2Vzc2VkQ2xhc3Nlc19tZW1iZXJVc2FnZV9pbnZva2FibGVJbnN0YW5jZU1lbWJlcnNCeU5hbWVfcmVhZGFibGVJbnN0YW5jZU1lbWJlcnNCeU5hbWVfd3JpdGFibGVJbnN0YW5jZU1lbWJlcnNCeU5hbWVfaXNDaGVja3Nfc2VsZWN0b3JDb25zdHJhaW50c1N0cmF0ZWd5X2NvbnN0YW50VmFsdWVzX2NvbnN0VHlwZUxpdGVyYWxzX2xpdmVUeXBlQXJndW1lbnRzX2NvbXBpbGVkQ29uc3RhbnRzY2xhc3NVc2FnZUZvclRlc3RpbmdjbGFzc1VzZWRfcHJvY2Vzc0luc3RhbnRpYXRlZENsYXNzX2dldENsYXNzVXNhZ2VpbXBsZW1lbnRfaGFzTWF0Y2hpbmdTZWxlY3RvcnNlbGVjdG9yc19nZXRNYXRjaGluZ0NhbGxTdHJ1Y3R1cmVzY2FsbFN0cnVjdHVyZXNfZ2V0SW52b2NhdGlvbkNhbGxTdHJ1Y3R1cmVzX2hhc0ludm9rZWRHZXR0ZXJfaGFzSW52b2tlZFNldHRlcm1lbWJlclVzZWRfcHJvY2Vzc3Nob3VsZEJlUmVtb3ZlZF9wcm9jZXNzU2V0dXNhZ2VEeW5hbWljVXNlS2luZC5JTlZPS0VyZWdpc3RlckR5bmFtaWNJbnZvY2F0aW9uX3JlZ2lzdGVyTmV3U2VsZWN0b3JpbnZva2V1aGFzUGVuZGluZ0R5bmFtaWNJbnZva2VEeW5hbWljVXNlS2luZC5HRVRoYXNQZW5kaW5nRHluYW1pY1JlYWREeW5hbWljVXNlS2luZC5TRVRoYXNQZW5kaW5nRHluYW1pY1dyaXRlc2VsZWN0b3JNYXBfZ2V0TWVtYmVyVXNhZ2VTdGF0aWNVc2VLaW5kLlNUQVRJQ19URUFSX09GRlN0YXRpY1VzZUtpbmQuSU5TVEFOQ0VfRklFTERfR0VUU3RhdGljVXNlS2luZC5JTlNUQU5DRV9GSUVMRF9TRVRTdGF0aWNVc2VLaW5kLkNBTExfTUVUSE9EU3RhdGljVXNlS2luZC5TVVBFUl9JTlZPS0VyZWdpc3RlclN0YXRpY0ludm9jYXRpb25TdGF0aWNVc2VLaW5kLlNVUEVSX0ZJRUxEX1NFVFN0YXRpY1VzZUtpbmQuU1VQRVJfU0VUVEVSX1NFVFN0YXRpY1VzZUtpbmQuU1RBVElDX1NFVFN0YXRpY1VzZUtpbmQuU1VQRVJfVEVBUl9PRkZTdGF0aWNVc2VLaW5kLlNVUEVSX0dFVFN0YXRpY1VzZUtpbmQuU1RBVElDX0dFVFN0YXRpY1VzZUtpbmQuRklFTERfSU5JVFN0YXRpY1VzZUtpbmQuRklFTERfQ09OU1RBTlRfSU5JVGNvbnN0YW50SW5pdFN0YXRpY1VzZUtpbmQuSU5MSU5JTkdTdGF0aWNVc2VLaW5kLkNMT1NVUkVTdGF0aWMgdXNlICBpcyBub3Qgc3VwcG9ydGVkIGR1cmluZyBjb2RlZ2VuLl9wcm9jZXNzSW5zdGFudGlhdGVkQ2xhc3NNZW1iZXJVbmVucXVldWVkIHVzYWdlIG9mIDogCmJlZm9yZTogPG5vbmU+CmFmdGVyIDogcG90ZW50aWFsQWNjZXNzZ2V0TWVtYmVyQWNjZXNzcHJvY2Vzc0NsYXNzY29tcGlsZWRDb25zdGFudHNGb3JUZXN0aW5ncmVnaXN0ZXJDb25zdFR5cGVMaXRlcmFscmVnaXN0ZXJUeXBlQXJndW1lbnRoYXNVc2V0eXBlVmFyaWFibGVUeXBlTGl0ZXJhbHNpc0NoZWNrc2NvbXBpbGVkQ29uc3RhbnRzaW52b2tlZE5hbWVzaW52b2tlZEdldHRlcnNpbnZva2VkU2V0dGVyc3N0YXRpY1R5cGVBcmd1bWVudERlcGVuZGVuY2llc2R5bmFtaWNUeXBlQXJndW1lbnREZXBlbmRlbmNpZXNDb2RlZ2VuV29ybGRJbXBsX2xpdmVNZW1iZXJVc2FnZV9zdGF0aWNUeXBlQXJndW1lbnREZXBlbmRlbmNpZXNfZHluYW1pY1R5cGVBcmd1bWVudERlcGVuZGVuY2llc191c2VyTm9TdWNoTWV0aG9kc0NhY2hlX2Nsb3N1cml6ZWRNZW1iZXJzQ2FjaGVfY2xvc3VyaXplZFN0YXRpY3NDYWNoZWZhaWx1cmVmb3JFYWNoR2VuZXJpY01ldGhvZGZvckVhY2hHZW5lcmljSW5zdGFuY2VNZXRob2R1c2VyTm9TdWNoTWV0aG9kc21lbWJlclVzYWdlZ2VuZXJpY0xvY2FsRnVuY3Rpb25zY2xvc3VyaXplZE1lbWJlcnNoYXNSZWFkY2xvc3VyaXplZFN0YXRpY3Nmb3JFYWNoU3RhdGljVHlwZUFyZ3VtZW50Zm9yRWFjaER5bmFtaWNUeXBlQXJndW1lbnRyZWFkc0FjY2Vzcy5keW5hbWljQWNjZXNzQWNjZXNzLnN1cGVyQWNjZXNzd3JpdGVzX2FzVW5tb2RpZmlhYmxlc2VlbkNvbnN0YW50c3NvcnRlZGludm9rZXNCYWNrZW5kVXNhZ2VCYWNrZW5kVXNhZ2VCdWlsZGVySW50ZXJjZXB0b3JEYXRhQnVpbGRlck5hdGl2ZURhdGFCdWlsZGVyT3BlbldvcmxkQ2xhc3NRdWVyaWVzUmVzb2x1dGlvbldvcmxkQnVpbGRlcmNsb3NlZFdvcmxkRm9yVGVzdGluZ1Jlc29sdXRpb25FbnF1ZXVlcldvcmxkQnVpbGRlckluc3RhbmNlSW5zdGFudGlhdGlvbi5ESVJFQ1RMWV9JTlNUQU5USUFURUQgZGlyZWN0bHlJbnN0YW50aWF0aW9uLkFCU1RSQUNUTFlfSU5TVEFOVElBVEVEIGFic3RyYWN0bHlJbnN0YW50aWF0aW9uLlVOSU5TVEFOVElBVEVEIG5vbmVJbnN0YW50aWF0aW9uSW5mb2luc3RhbnRpYXRpb25NYXBpc0RpcmVjdGx5SW5zdGFudGlhdGVkaXNBYnN0cmFjdGx5SW5zdGFudGlhdGVkYWRkSW5zdGFudGlhdGlvbkluc3RhbnRpYXRpb24gIGlzIG5vdCBhbGxvd2VkLmhhc0luc3RhbnRpYXRpb25JbnN0YW50aWF0aW9uSW5mb1tuZWVkc0NvbW1hPHVua25vd24+UmVzb2x1dGlvbldvcmxkQnVpbGRlckltcGxfaW5zdGFudGlhdGlvbkluZm9fYWxsUmVmZXJlbmNlZFN0YXRpY0ZpZWxkc19tZXRob2RzTmVlZGluZ1N1cGVyR2V0dGVyX2ZpZWxkU2V0dGVyc19sb2NhbEZ1bmN0aW9uc19jbG9zdXJpemVkTWVtYmVyc1dpdGhGcmVlVHlwZVZhcmlhYmxlc19kYXJ0VHlwZXNfaW50ZXJjZXB0b3JEYXRhQnVpbGRlcl9ydGlOZWVkQnVpbGRlcl9hbGxvY2F0b3JBbmFseXNpc19ub1N1Y2hNZXRob2RSZWdpc3RyeV9jbGFzc0hpZXJhcmNoeUJ1aWxkZXJfY2xhc3NRdWVyaWVzX2Nsb3NlZF9jbG9zZWRXb3JsZENhY2hlX2xpdmVJbnN0YW5jZU1lbWJlcnNfZ2VuZXJpY0xvY2FsRnVuY3Rpb25zX3Byb2Nlc3NlZE1lbWJlcnNtZW1iZXJVc2FnZUZvclRlc3RpbmdUaGUgd29ybGQgYnVpbGRlciBoYXMgbm90IHlldCBiZWVuIGNsb3NlZC5nZXRJbnN0YW50aWF0aW9uTWFwY29udGFpbnNUeXBlVmFyaWFibGVzdXBkYXRlQ2xhc3NIaWVyYXJjaHlOb2RlRm9yQ2xhc3NkaXJlY3RseUluc3RhbnRpYXRlZGFic3RyYWN0bHlJbnN0YW50aWF0ZWREaXJlY3Qgc3RhdGljIHVzZSBpcyBub3Qgc3VwcG9ydGVkIGZvciByZXNvbHV0aW9uLiBpcyBub3Qgc3VwcG9ydGVkIGR1cmluZyByZXNvbHV0aW9uLl9jcmVhdGVDbGFzc1VzYWdldXBkYXRlVXNhZ2VoYXNQZW5kaW5nRHluYW1pY1VzZTogCmJlZm9yZTogCmFmdGVyIDogYWxsTWl4aW5Vc2VzT2Zwb3B1bGF0ZUhpZXJhcmNoeU5vZGVzdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3Nlc2FkZFN1YnR5cGVzdHlwZXNJbXBsZW1lbnRlZEJ5U3ViY2xhc3Nlc09mQ2xzZ2V0U3VwZXJ0eXBlc2NvbXB1dGVBc3NpZ25lZEluc3RhbmNlTWVtYmVyc2Fzc2lnbmVkSW5zdGFuY2VNZW1iZXJzaW5zdGFuY2VNZW1iZXJpc0luaGVyaXRlZElucmVsYXRpb25pc0luaGVyaXRlZEluQ2xhc3NtZW1iZXJIb2xkaW5nQ2xhc3Npc0luaGVyaXRlZEluRXhhY3RDbGFzc2lzSW5oZXJpdGVkSW5UaGlzQ2xhc3Npc0luaGVyaXRlZEluU3VidHlwZU9mVW5leHBlY3RlZCBDbGFzc1JlbGF0aW9uICBpcyB1c2VkIGJ1dCBub3QgcHJvY2Vzc2VkOiAgaXMgcHJvY2Vzc2VkIGJ1dCBub3QgdXNlZDogIGlzIHByb2Nlc3NlZCBidXQgaGFzIG5vdCB1c2FnZS5pbnN0YW5jZXNpbXBsZW1lbnRlZENsYXNzZXNsaXZlSW5zdGFuY2VNZW1iZXJzY2xvc3VyaXplZE1lbWJlcnNXaXRoRnJlZVR5cGVWYXJpYWJsZXNkYXJ0MmpzLnVuaXZlcnNlLndvcmxkX2ltcGFjdFZpc2l0VXNlbWVtYmVyOiBkeW5hbWljIHVzZXNzdGF0aWMgdXNlc3R5cGUgdXNlc2NvbnN0YW50IHVzZXNXb3JsZEltcGFjdEJ1aWxkZXJfZHluYW1pY1VzZXNfc3RhdGljVXNlc190eXBlVXNlc19jb25zdGFudFVzZXNhZGRJbXBhY3RTdGFnZWRXb3JsZEltcGFjdEJ1aWxkZXJjb2xsZWN0SW1wYWN0c19jdXJyZW50QnVpbGRlcl9idWlsZGVyc19lbnN1cmVCdWlsZGVyd29ybGRJbXBhY3RzVHJhbnNmb3JtZWRXb3JsZEltcGFjdFRyYW5zZm9ybWVkV29ybGRJbXBhY3QoSW1wYWN0VXNlQ2FzZShpbXBhY3RVc2VDYXNlX3Zpc2l0U3RhdGljVXNlX3Zpc2l0RHluYW1pY1VzZV92aXNpdFR5cGVVc2VfdmlzaXRDb25zdGFudFVzZWRhcnQyanMud29ybGRKRmllbGRBbmFseXNpc0ludGVyY2VwdG9yRGF0YU5hdGl2ZURhdGFOb1N1Y2hNZXRob2REYXRhUnVudGltZVR5cGVzTmVlZFdvcmxkY2xvc3VyZURhdGFMb29rdXBzb3J0ZXJ5Y29tcHV0ZVJlY2VpdmVyVHlwZUJ1aWx0V29ybGRkYXJ0MmpzLmNvbnN0YW50cy5leHByZXNzaW9uc0NvbnN0YW50RXhwcmVzc2lvbktpbmRDb25zdGFudEV4cHJlc3Npb25LaW5kLkFTQ29uc3RhbnRFeHByZXNzaW9uS2luZC5CSU5BUllDb25zdGFudEV4cHJlc3Npb25LaW5kLkJPT0xDb25zdGFudEV4cHJlc3Npb25LaW5kLkJPT0xfRlJPTV9FTlZJUk9OTUVOVENvbnN0YW50RXhwcmVzc2lvbktpbmQuQ09OQ0FURU5BVEVDb25zdGFudEV4cHJlc3Npb25LaW5kLkNPTkRJVElPTkFMQ29uc3RhbnRFeHByZXNzaW9uS2luZC5DT05TVFJVQ1RFRENvbnN0YW50RXhwcmVzc2lvbktpbmQuRE9VQkxFQ29uc3RhbnRFeHByZXNzaW9uS2luZC5FUlJPTkVPVVNDb25zdGFudEV4cHJlc3Npb25LaW5kLkZVTkNUSU9OQ29uc3RhbnRFeHByZXNzaW9uS2luZC5GSUVMRENvbnN0YW50RXhwcmVzc2lvbktpbmQuSURFTlRJQ0FMQ29uc3RhbnRFeHByZXNzaW9uS2luZC5JTlRDb25zdGFudEV4cHJlc3Npb25LaW5kLklOVF9GUk9NX0VOVklST05NRU5UQ29uc3RhbnRFeHByZXNzaW9uS2luZC5MSVNUQ29uc3RhbnRFeHByZXNzaW9uS2luZC5TRVRDb25zdGFudEV4cHJlc3Npb25LaW5kLk1BUENvbnN0YW50RXhwcmVzc2lvbktpbmQuTlVMTENvbnN0YW50RXhwcmVzc2lvbktpbmQuU1RSSU5HQ29uc3RhbnRFeHByZXNzaW9uS2luZC5TVFJJTkdfRlJPTV9FTlZJUk9OTUVOVENvbnN0YW50RXhwcmVzc2lvbktpbmQuU1RSSU5HX0xFTkdUSENvbnN0YW50RXhwcmVzc2lvbktpbmQuU1lNQk9MQ29uc3RhbnRFeHByZXNzaW9uS2luZC5UWVBFQ29uc3RhbnRFeHByZXNzaW9uS2luZC5VTkFSWUNvbnN0YW50RXhwcmVzc2lvbktpbmQuTE9DQUxfVkFSSUFCTEVDb25zdGFudEV4cHJlc3Npb25LaW5kLlBPU0lUSU9OQUxfUkVGRVJFTkNFQ29uc3RhbnRFeHByZXNzaW9uS2luZC5OQU1FRF9SRUZFUkVOQ0VDb25zdGFudEV4cHJlc3Npb25LaW5kLkFTU0VSVENvbnN0YW50RXhwcmVzc2lvbktpbmQuSU5TVEFOVElBVElPTkJJTkFSWUJPT0xCT09MX0ZST01fRU5WSVJPTk1FTlRDT05DQVRFTkFURUNPTlNUUlVDVEVERVJST05FT1VTRklFTERJREVOVElDQUxJTlRfRlJPTV9FTlZJUk9OTUVOVExJU1RNQVBTVFJJTkdfRlJPTV9FTlZJUk9OTUVOVFNUUklOR19MRU5HVEhUWVBFVU5BUllMT0NBTF9WQVJJQUJMRVBPU0lUSU9OQUxfUkVGRVJFTkNFTkFNRURfUkVGRVJFTkNFSU5TVEFOVElBVElPTmdldEtub3duVHlwZV9jcmVhdGVTdHJ1Y3R1cmVkVGV4dF9lcXVhbHNVc2UgQ29uc3RhbnRFeHByZXNzaW9uLnRvRGFydFRleHQoKSBvciBDb25zdGFudEV4cHJlc3Npb24udG9TdHJ1Y3R1cmVkVGV4dCgpIGluc3RlYWQgb2YgQ29uc3RhbnRFeHByZXNzaW9uLnRvU3RyaW5nKClpc0ltcGxpY2l0aXNQb3RlbnRpYWxFcnJvbmVvdXNDb25zdGFudEV4cHJlc3Npb25FcnJvbmVvdXMoKUJvb2xDb25zdGFudEV4cHJlc3Npb252aXNpdEJvb2xCb29sKHZhbHVlPUludENvbnN0YW50RXhwcmVzc2lvbnZpc2l0SW50SW50KHZhbHVlPURvdWJsZUNvbnN0YW50RXhwcmVzc2lvbnZpc2l0RG91YmxlRG91YmxlKHZhbHVlPVN0cmluZ0NvbnN0YW50RXhwcmVzc2lvbnZpc2l0U3RyaW5nU3RyaW5nKHZhbHVlPU51bGxDb25zdGFudEV4cHJlc3Npb252aXNpdE51bGxOdWxsKClMaXN0Q29uc3RhbnRFeHByZXNzaW9uTGlzdCh0eXBlPSx2YWx1ZXM9W2RlbGltaXRlcl0pU2V0Q29uc3RhbnRFeHByZXNzaW9udmlzaXRTZXRTZXQodHlwZT1NYXBDb25zdGFudEV4cHJlc3Npb252aXNpdE1hcE1hcCh0eXBlPSxlbnRyaWVzPVstPmV2YWx1YXRlTWFwQm9keUNvbnN0cnVjdGVkQ29uc3RhbnRFeHByZXNzaW9udmlzaXRDb25zdHJ1Y3RlZENvbnN0cnVjdGVkKHR5cGU9LGNvbnN0cnVjdG9yPWNhbGxTdHJ1Y3R1cmU9LGFyZ3VtZW50cz1bY29tcHV0ZUluc3RhbmNlRGF0YWNvbnN0YW50Q29uc3RydWN0b3JnZXRDb25zdHJ1Y3RvckNvbnN0YW50Tm8gY29uc3RhbnQgY29uc3RydWN0b3IgY29tcHV0ZWQgZm9yIGNvbXB1dGVJbnN0YW5jZVR5cGVldmFsdWF0ZUNvbnN0cnVjdG9yaW5zdGFuY2VEYXRhaXNWYWxpZEFzQ29uc3RhbnRmaWVsZE1hcE5vIHZhbHVlIGNvbXB1dGVkIGZvciBhc3NlcnRpb25hc3NlcnRpb25zQ29uY2F0ZW5hdGVDb25zdGFudEV4cHJlc3Npb252aXNpdENvbmNhdGVuYXRlQ29uY2F0ZW5hdGUoZXhwcmVzc2lvbnM9W1N5bWJvbENvbnN0YW50RXhwcmVzc2lvbnZpc2l0U3ltYm9sU3ltYm9sKG5hbWU9VHlwZUNvbnN0YW50RXhwcmVzc2lvblVuZXhwZWN0ZWQgdHlwZSBjb25zdGFudCB0eXBlOiBUeXBlKHR5cGU9QXNDb25zdGFudEV4cHJlc3Npb252aXNpdEFzQXModmFsdWU9ZXhwcmVzc2lvblZhbHVlY2hlY2tDYXN0c3R5cGVJbkNvbnRleHRnZXRUeXBlSW5Db250ZXh0Y2FzdFR5cGVGaWVsZENvbnN0YW50RXhwcmVzc2lvbkZpZWxkKGVsZW1lbnQ9ZXZhbHVhdGVGaWVsZGdldEZpZWxkQ29uc3RhbnRMb2NhbFZhcmlhYmxlQ29uc3RhbnRFeHByZXNzaW9udmlzaXRMb2NhbFZhcmlhYmxlTG9jYWxWYXJpYWJsZShlbGVtZW50PWdldExvY2FsQ29uc3RhbnRGdW5jdGlvbkNvbnN0YW50RXhwcmVzc2lvbkZ1bmN0aW9uKGVsZW1lbnQ9QmluYXJ5Q29uc3RhbnRFeHByZXNzaW9uUFJFQ0VERU5DRV9NQVBCaW5hcnlPcGVyYXRvcktpbmQuRVFCaW5hcnlPcGVyYXRvcktpbmQuTk9UX0VRQmluYXJ5T3BlcmF0b3JLaW5kLkxPR0lDQUxfQU5EQmluYXJ5T3BlcmF0b3JLaW5kLkxPR0lDQUxfT1JCaW5hcnlPcGVyYXRvcktpbmQuWE9SQmluYXJ5T3BlcmF0b3JLaW5kLkFOREJpbmFyeU9wZXJhdG9yS2luZC5PUkJpbmFyeU9wZXJhdG9yS2luZC5TSExCaW5hcnlPcGVyYXRvcktpbmQuU0hSQmluYXJ5T3BlcmF0b3JLaW5kLlNIUlVCaW5hcnlPcGVyYXRvcktpbmQuQUREQmluYXJ5T3BlcmF0b3JLaW5kLlNVQkJpbmFyeU9wZXJhdG9yS2luZC5NVUxCaW5hcnlPcGVyYXRvcktpbmQuRElWQmluYXJ5T3BlcmF0b3JLaW5kLklESVZCaW5hcnlPcGVyYXRvcktpbmQuR1RCaW5hcnlPcGVyYXRvcktpbmQuTFRCaW5hcnlPcGVyYXRvcktpbmQuR1RFUUJpbmFyeU9wZXJhdG9yS2luZC5MVEVRQmluYXJ5T3BlcmF0b3JLaW5kLk1PREJpbmFyeU9wZXJhdG9yS2luZC5JRl9OVUxMQmluYXJ5T3BlcmF0b3JLaW5kLklOREVYTWlzc2luZyBwcmVjZW5kZW5jZSBmb3IgYmluYXJ5IG9wZXJhdG9yOiAncG90ZW50aWFsT3BlcmF0b3JCaW5hcnkobGVmdD0sb3A9LHJpZ2h0PWxlZnRWYWx1ZXJpZ2h0VmFsdWVsZWZ0Q29uc3RhbnRsZWZ0VHlwZXJpZ2h0Q29uc3RhbnRyaWdodFR5cGVzaGlmdGtub3duTGVmdFR5cGVrbm93blJpZ2h0VHlwZVVuZXhwZWN0ZWQgY29uc3RhbnQgYmluYXJ5IG9wZXJhdG9yOiBJZGVudGljYWxDb25zdGFudEV4cHJlc3Npb252aXNpdElkZW50aWNhbElkZW50aWNhbChsZWZ0PVVuYXJ5Q29uc3RhbnRFeHByZXNzaW9uVW5hcnlPcGVyYXRvcktpbmQuTk9UdmlzaXRVbmFyeVVuYXJ5KG9wPSxleHByZXNzaW9uPVN0cmluZ0xlbmd0aENvbnN0YW50RXhwcmVzc2lvbnZpc2l0U3RyaW5nTGVuZ3RoU3RyaW5nTGVuZ3RoKGV4cHJlc3Npb249Q29uZGl0aW9uYWxDb25zdGFudEV4cHJlc3Npb250cnVlRXhwZmFsc2VFeHBDb25kaXRpb25hbChjb25kaXRpb249LHRydWU9LGZhbHNlPWNvbmRpdGlvblZhbHVldHJ1ZVZhbHVlZmFsc2VWYWx1ZXRydWVUeXBlZmFsc2VUeXBlUG9zaXRpb25hbEFyZ3VtZW50UmVmZXJlbmNldmlzaXRQb3NpdGlvbmFsUG9zaXRpb25hbChpbmRleD1nZXRQb3NpdGlvbmFsQXJndW1lbnROYW1lZEFyZ3VtZW50UmVmZXJlbmNldmlzaXROYW1lZE5hbWVkKG5hbWU9Z2V0TmFtZWRBcmd1bWVudEZyb21FbnZpcm9ubWVudENvbnN0YW50RXhwcmVzc2lvbl9jaGVja05hbWVGcm9tRW52aXJvbm1lbnRCb29sRnJvbUVudmlyb25tZW50Q29uc3RhbnRFeHByZXNzaW9udmlzaXRCb29sRnJvbUVudmlyb25tZW50Ym9vbC5mcm9tRW52aXJvbm1lbnQobmFtZT0sZGVmYXVsdFZhbHVlPW5hbWVDb25zdGFudFZhbHVlZGVmYXVsdENvbnN0YW50VmFsdWVuYW1lU3RyaW5nQ29uc3RhbnRWYWx1ZXJlYWRGcm9tRW52aXJvbm1lbnRJbnRGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb252aXNpdEludEZyb21FbnZpcm9ubWVudGludC5mcm9tRW52aXJvbm1lbnQobmFtZT1TdHJpbmdGcm9tRW52aXJvbm1lbnRDb25zdGFudEV4cHJlc3Npb252aXNpdFN0cmluZ0Zyb21FbnZpcm9ubWVudFN0cmluZy5mcm9tRW52aXJvbm1lbnQobmFtZT1Bc3NlcnRDb25zdGFudEV4cHJlc3Npb24sbWVzc2FnZT12YWxpZEFzc2VydGVuYWJsZUFzc2VydGlvbnN2aXNpdEFzc2VydEluc3RhbnRpYXRpb25Db25zdGFudEV4cHJlc3Npb25JbnN0YW50aWF0aW9uKHR5cGVBcmd1bWVudHM9dHlwZUFyZ3VtZW50c0luQ29udGV4dENvbnN0YW50RXhwcmVzc2lvblZpc2l0b3JleHBDb25zdEV4cFByaW50ZXJsZWZ0QXNzb2NpYXRpdmV3cml0ZVR5cGVBcmd1bWVudHMgYXMgY29uc3QgbmFtZWRPZmZzZXRpZGVudGljYWwoLmxlbmd0aCA/ICA6IGFyZ3NbY29uc3QgYm9vbC5mcm9tRW52aXJvbm1lbnQoLCBkZWZhdWx0VmFsdWU6IGNvbnN0IGludC5mcm9tRW52aXJvbm1lbnQoY29uc3QgU3RyaW5nLmZyb21FbnZpcm9ubWVudChkYXJ0MmpzLmNvZGVfb3V0cHV0U291cmNlTG9jYXRpb25zYWRkU291cmNlTG9jYXRpb250YXJnZXRPZmZzZXRzb3VyY2VQb3NpdGlvbmFkZFB1c2hwdXNoUG9zaXRpb25hZGRQb3Bmb3JFYWNoU291cmNlTG9jYXRpb25mcmFtZU1hcmtlcnNfU291cmNlTG9jYXRpb25zSW1wbG1hcmtlcnNmcmFtZXNfbWVyZ2VTb3VyY2VMb2NhdGlvbnNQcm92aWRlcmNyZWF0ZVNvdXJjZUxvY2F0aW9uc0NvZGVPdXRwdXRhZGRCdWZmZXJBYnN0cmFjdENvZGVPdXRwdXRzb3VyY2VMb2NhdGlvbnNNYXBfYWRkSW50ZXJuYWxDb2RlIG91dHB1dCBpcyBjbG9zZWQuIFRyeWluZyB0byB3cml0ZSAnZ2V0VGV4dENvZGUgb3V0cHV0IGlzIGFscmVhZHkgY2xvc2VkLkJ1ZmZlcmVkQ29kZU91dHB1dENvZGVCdWZmZXJEb24ndCB1c2UgQ29kZUJ1ZmZlci50b1N0cmluZygpIHNpbmNlIGl0IGRyb3BzIHNvdXJjZW1hcCBkYXRhLlN0cmVhbUNvZGVPdXRwdXRfbGlzdGVuZXJzSW50ZXJuZXJOdWxsSW50ZXJuZXJmYXN0YS5jbGFzc19oaWVyYXJjaHlfYnVpbGRlclN0YW5kYXJkQm91bmRzVHlwZUNvbnN0cmFpbnRGb3J3YXJkaW5nTm9kZVR5cGVzRGVidWdMb2dnZXJvYmplY3RLZXJuZWxDbGFzc2Z1dHVyZUtlcm5lbENsYXNzZnV0dXJlT3JLZXJuZWxDbGFzc2Z1bmN0aW9uS2VybmVsQ2xhc3NudWxsS2VybmVsQ2xhc3NnZXROb2RlRnJvbUNsYXNzZ2V0Tm9kZUZyb21UeXBlZ2V0Tm9kZUZyb21LZXJuZWxDbGFzc2FzU3VwZXJ0eXBlT2ZjbHNOb2Rlc3VwZXJ0eXBlTm9kZXN1cGVyY2xhc3Nlc3N1cGVydHlwZURlY2xhcmF0aW9uZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZmdldEtlcm5lbExlZ2FjeUxlYXN0VXBwZXJCb3VuZG5vZGUxbm9kZTJub2RlczFjb21wdXRlQWxsU3VwZXJOb2Rlc25vZGVzMmNhbmRpZGF0ZTFjYW5kaWRhdGUybWF4SW5oZXJpdGFuY2VQYXRoZ2V0SW50ZXJmYWNlTWVtYmVyS2VybmVsZ2V0RGlzcGF0Y2hUYXJnZXRLZXJuZWxDbGFzc0hpZXJhcmNoeU5vZGVCdWlsZGVyaGFzTm9TdWNoTWV0aG9kYWJzdHJhY3RNZW1iZXJzc3Vic3RpdHV0aW9uc2hhbmRsZU1lcmdlQ29uZmxpY3RtZXJnZUtpbmRoYW5kbGVNZXJnZUNvbmZsaWN0OiBjaGVja0luaGVyaXRhbmNlQ29uZmxpY3RNZXJnZUtpbmQuc3VwZXJjbGFzc01lbWJlcnNNZXJnZUtpbmQuc3VwZXJjbGFzc1NldHRlcnNzdXBlcmNsYXNzOiBjaGVja1ZhbGlkT3ZlcnJpZGUoY2hlY2tWYWxpZE92ZXJyaWRlcmVjb3JkQWJzdHJhY3RNZW1iZXJpc0luaGVyaXRhYmxlQ29uZmxpY3RNZXJnZUtpbmQubWVtYmVyc1dpdGhTZXR0ZXJzTWVyZ2VLaW5kLnNldHRlcnNXaXRoTWVtYmVyc2luZmVyRmllbGRUeXBlc2luZmVyTWV0aG9kVHlwZXNNZXJnZUtpbmQuaW50ZXJmYWNlc01lbWJlcnNNZXJnZUtpbmQuaW50ZXJmYWNlc1NldHRlcnNNZXJnZUtpbmQuc3VwZXJ0eXBlc01lbWJlcnNNZXJnZUtpbmQuc3VwZXJ0eXBlc1NldHRlcnNzdXBlcnR5cGVzOiBjaGVja1ZhbGlkT3ZlcnJpZGUoYWRkQWxsRGVjbGFyYXRpb25zVG9zdXBlcnR5cGVzOiByZXBvcnRJbmhlcml0YW5jZUNvbmZsaWN0VHJ5aW5nIHRvIGluZmVyIHR5cGVzIGZvciAgYmFzZWQgb24gaGFzU2FtZVNpZ25hdHVyZWluZmVyR2V0dGVyVHlwZWluZmVyU2V0dGVyVHlwZWhhZFR5cGVzSW5mZXJyZWRhQ2xzYVN1YnN0aXR1dGlvbmJDbHNiU3Vic3RpdHV0aW9uYVByb2NlZHVyZUdpdmluZyB1cCAxYlByb2NlZHVyZWFGdW5jdGlvbmJGdW5jdGlvbmFUeXBlUGFyYW1ldGVyc2JUeXBlUGFyYW1ldGVyc3R5cGVQYXJhbWV0ZXJDb3VudEdpdmluZyB1cCAyY29weVR5cGVQYXJhbWV0ZXJDb3ZhcmlhbmNlYUJvdW5kYkJvdW5kR2l2aW5nIHVwIDNhUmV0dXJuVHlwZWJSZXR1cm5UeXBlR2l2aW5nIHVwIDRhUG9zaXRpb25hbGJQb3NpdGlvbmFsR2l2aW5nIHVwIDVHaXZpbmcgdXAgNmFQYXJhbWV0ZXJiUGFyYW1ldGVyY29weVBhcmFtZXRlckNvdmFyaWFuY2VhVHlwZWJUeXBlR2l2aW5nIHVwIDhhTmFtZWRiTmFtZWRHaXZpbmcgdXAgOUdpdmluZyB1cCAxMGFDb3VudGJDb3VudEdpdmluZyB1cCAxMUdpdmluZyB1cCAxMkluZmVycmluZyB0eXBlcyBmb3Igc3VjY2VlZGVkLmZhaWxlZC5JbmZlcnJpbmcgZ2V0dGVyIHR5cGVzIGZvciBiVGFyZ2V0R2l2aW5nIHVwICh0eXBlIG1heSBiZSBpbmZlcnJlZClHaXZpbmcgdXAgKHJldHVybiB0eXBlIG1heSBiZSBpbmZlcnJlZClHaXZpbmcgdXAgKG5vdCBhY2Nlc3NvcjogR2l2aW5nIHVwIChub3QgZmllbGQvcHJvY2VkdXJlOiBJbmZlcnJpbmcgc2V0dGVyIHR5cGVzIGZvciBjb3B5UGFyYW1ldGVyQ292YXJpYW5jZUZyb21GaWVsZGNoZWNrVmFsaWRPdmVycmlkZShhVGFyZ2V0VHJ5aW5nIHRvIGluZmVyIGZpZWxkIHR5cGVzIGZvciBpbmhlcml0ZWRUeXBlY29weUZpZWxkQ292YXJpYW5jZUZyb21QYXJhbWV0ZXJjb3B5RmllbGRDb3ZhcmlhbmNlR2l2aW5nIHVwIChpbmhlcml0ZWRUeXBlID09IG51bGwpCmJGaWVsZGFGaWVsZHN0YXRpY01lbWJlcmR1cGxpY2F0ZWhhbmRsZU9ubHlBaGFuZGxlT25seUJ3aXRoUGFyZW50c3VwZXJub2RlaW5mZXJNaXhpbkFwcGxpY2F0aW9ubG9jYWxNZW1iZXJzbG9jYWxTZXR0ZXJzbWVyZ2VBY2Nlc3NvcnNjbGFzc01lbWJlcnNjbGFzc1NldHRlcnNpbnRlcmZhY2VNZW1iZXJzc3Vic3RTdXBlcnR5cGVzcmVjb3JkU3VwZXJ0eXBlZGlyZWN0SW50ZXJmYWNlc2lnbm9yZUZ1bmN0aW9uc3VwZXJjbGFzc0ludGVyZmFjZXNtZXJnZUludGVyZmFjZXNtZXJnZWRNZW1iZXJzbWVyZ2VkU2V0dGVyc2FkZEludGVyZmFjZWRpcmVjdEludGVyZmFjZWludGVyZmFjZU5vZGVyZXBvcnRNaXNzaW5nTWVtYmVyc2luc3RhbGxOc21IYW5kbGVyc0luICByZWNvcmRTdXBlcnR5cGUoY29tcHV0ZURlZmF1bHRUeXBlQXJndW1lbnRza2VybmVsQXJndW1lbnRza2VybmVsUGFyYW1ldGVycyBhcmVuJ3Qgc3Vic3RlZHN1YnN0ZWRzdWJzdCBpc24ndCBzdWJzdGVkbXlEZXB0aG1lcmdlSW50ZXJmYWNlcyhtZW1iZXJMaXN0c3NldHRlckxpc3RzbWVyZ2VMaXN0c2lzT2RkY29udGV4dE1hcHBhcmVudE5hbWVhTGlzdGJMaXN0a2VybmVsTWl4ZWRJblR5cGVpbmZlcnJlZEFyZ3VtZW50c0NsYXNzSGllcmFyY2h5Tm9kZSAgTG9uZ2VzdCBwYXRoIHRvIE9iamVjdDogICBzdXBlcmNsYXNzZXM6LT4gICBpbnRlcmZhY2VzOnByaW50TWVtYmVyc2hlYWRpbmcgICAgZmluZE1lbWJlcmNvbXBhcmVNYXhJbmhlcml0YW5jZVBhdGhNZXJnZVJlc3VsdE1lcmdlS2luZHN1cGVyY2xhc3NNZW1iZXJzc3VwZXJjbGFzc1NldHRlcnNpbnRlcmZhY2VzTWVtYmVyc2ludGVyZmFjZXNTZXR0ZXJzc3VwZXJ0eXBlc01lbWJlcnNzdXBlcnR5cGVzU2V0dGVyc21lbWJlcnNXaXRoU2V0dGVyc3NldHRlcnNXaXRoTWVtYmVyc0J1aWxkZXJNaXhpbkluZmVycmVyX1R5cGVCdWlsZGVyQ29uc3RyYWludEdhdGhlcmVyJlR5cGVDb25zdHJhaW50R2F0aGVyZXImU3RhbmRhcmRCb3VuZHNzdWJjbGFzc2luZ2dldFN0YW5kYXJkTG93ZXJCb3VuZF9mdW5jdGlvblN0YW5kYXJkTG93ZXJCb3VuZF90eXBlUGFyYW1ldGVyU3RhbmRhcmRVcHBlckJvdW5kX2ludGVyZmFjZVN0YW5kYXJkVXBwZXJCb3VuZF9mdW5jdGlvblN0YW5kYXJkVXBwZXJCb3VuZHR5cGUxID0gOyB0eXBlMiA9IGd0b3RhbFBvc2l0aW9uYWxmVHlwZWdUeXBlaGFzUG9zaXRpb25hbGZOYW1lZ05hbWVvcmRlcmhhc05hbWVkdEFyZ3MxdEFyZ3MydEFyZ3NUeXBlQnVpbGRlckNvbnN0cmFpbnRHYXRoZXJlcmFkZExvd2VyQm91bmRhZGRVcHBlckJvdW5kaXNTdWJ0eXBlT2ZLZXJuZWxjaGVja092ZXJyaWRlaXNJbnRlcmZhY2VDaGVja0RlbGF5ZWQgb3ZlcnJpZGUgY2hlY2sgb2YgIHdydC4gSW5mZXJyZWQgdHlwZSAgZm9yIG1vZGlmeUtlcm5lbEluaGVyaXRlZEltcGxlbWVudGF0aW9uSW50ZXJmYWNlQ29uZmxpY3Rjb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdEluaGVyaXRlZEltcGxlbWVudGF0aW9uSW50ZXJmYWNlQ29uZmxpY3QoY29uY3JldGVJbXBsZW1lbnRhdGlvbmNyZWF0ZUZvcndhcmRlcnNJbnRlcmZhY2VDb25mbGljdEludGVyZmFjZUNvbmZsaWN0KGNvbXB1dGVNZW1iZXJUeXBlaXNNb3JlU3BlY2lmaWNiZXN0U29GYXJiZXN0VHlwZVNvRmFyY2FuZGlkYXRlVHlwZUNvbWJpbmVkIE1lbWJlciBTaWduYXR1cmU6ICA8OiAgITw6IENvbWJpbmVkIE1lbWJlciBTaWduYXR1cmUgYmVzdFNvRmFyOiBkYXJ0OmpzanNfZGFydDJqcy5kYXJ0anNfbnVtYmVyLmRhcnRpc0Fub255bW91c01peGluQXBwbGljYXRpb25Db21iaW5lZCBNZW1iZXIgU2lnbmF0dXJlIG9mIDogbmV3IEZvcndhcmRpbmdOb2RlKHN0dWI6IGFkZGVkIHN0dWIgOiBwaWNrZWQgYmVzdFNvRmFyQWJzdHJhY3RNZW1iZXJPdmVycmlkaW5nSW1wbGVtZW50YXRpb25hYnN0cmFjdE1lbWJlcnNlbGVjdEFic3RyYWN0c2VsZWN0Q29uY3JldGVjb21wYXJlRGVjbGFyYXRpb25zaXNOYW1lVmlzaWJsZUluaXNJbmhlcml0YW5jZUNvbmZsaWN0aW1wbGllc1NldHRlcmFQb3NpdGlvbmFsUGFyYW1ldGVyc2JQb3NpdGlvbmFsUGFyYW1ldGVyc2FOYW1lZFBhcmFtZXRlcnNiTmFtZWRQYXJhbWV0ZXJzaW5oZXJpdGVkQ29uZmxpY3RDb250ZXh0aW5oZXJpdGVkQ29uZmxpY3RDb250ZXh0S2VybmVsYWRkRGVjbGFyYXRpb25JZkRpZmZlcmVudGNvbXBhcmVOYW1lZFBhcmFtZXRlcnNpbmZlclBhcmFtZXRlclR5cGVyZXBvcnRDYW50SW5mZXJQYXJhbWV0ZXJUeXBlcmVwb3J0Q2FudEluZmVyUmV0dXJuVHlwZXJlcG9ydENhbnRJbmZlckZpZWxkVHlwZWhhc0V4cGxpY2l0UmV0dXJuVHlwZWhhc0V4cGxpY2l0bHlUeXBlZEZvcm1hbFBhcmFtZXRlcmZhc3RhLmltcGxpY2l0X3R5cGVpc1N0YXJ0ZWRmYXN0YS5rZXJuZWxfZmllbGRfYnVpbGRlcmNvbXBpbGF0aW9uVW5pdGlzRWxpZ2libGVGb3JJbmZlcmVuY2VWYXJpYW5jZS5jb250cmF2YXJpYW50aXNDbGFzc01lbWJlcmJvZHlCdWlsZGVyaW5mZXJDb3BpZWRUeXBlZmFzdGEua2VybmVsX21ldGFkYXRhX2J1aWxkZXJidWlsZEFubm90YXRpb25zYW5ub3RhdGlvbkJ1aWxkZXJmYXN0YS5rZXJuZWxfcHJlZml4X2J1aWxkZXJmYXN0YS5rZXJuZWxfdmFyaWFibGVfYnVpbGRlcl9fbG9hZExpYnJhcnlfVW5saW5rZWRTY29wZWZhc3RhUGF0aC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvL3BrZy9mcm9udF9lbmQvdG9vbC9fZmFzdGEvY29tbWFuZF9saW5lLmRhcnRrZXJuZWwvYm9keV9idWlsZGVyLmRhcnRmYXN0YS50YXJnZXRmYXN0YS5kaWxsX2NsYXNzX2J1aWxkZXJ0YXJnZXRTdXBlcnR5cGVidWlsZFR5cGVBcmd1bWVudHNtaXhlZEluVHlwZT1jb21wdXRlVHlwZVZhcmlhYmxlQnVpbGRlcnNmYXN0YS5kaWxsX3R5cGVkZWZfYnVpbGRlcmJ1aWxkVGhpc1R5cGVmYXN0YS50eXBlX2J1aWxkZXJfY29tcHV0ZXJVbnN1cHBvcnRlZE5vdCBpbXBsZW1lbnRlZEluc3RydW1lbnRhdGlvblZhbHVlbWF0Y2hlc0luc3RydW1lbnRhdGlvblZhbHVlTGl0ZXJhbF9zaG9ydGVuSW5zdHJ1bWVudGF0aW9uU3RyaW5nZGFydC5jb3JlOjpkYXJ0LmFzeW5jOjp0ZXN0OjpmYXN0YS5leHBvcnRmYXN0YS5pbXBvcnRjcmVhdGVQcmVmaXhCdWlsZGVyZmFzdGEudHJhbnNmb3JtX2NvbGxlY3Rpb25zbGlzdEFkZHNldEZhY3RvcnlzZXRBZGRtYXBQdXRtYXBFbnRyeUtleW1hcEVudHJ5VmFsdWVnZXQ6ZW50cmllc19maW5kU2V0RmFjdG9yeV90cmFuc2xhdGVMaXN0T3JTZXRfYWRkRXhwcmVzc2lvbkVsZW1lbnRfdHJhbnNsYXRlRWxlbWVudF90cmFuc2xhdGVTcHJlYWRFbGVtZW50X3RyYW5zbGF0ZUlmRWxlbWVudF90cmFuc2xhdGVGb3JFbGVtZW50X3RyYW5zbGF0ZUZvckluRWxlbWVudHRoZW5TdGF0ZW1lbnRzZWxzZVN0YXRlbWVudHN0aGVuQm9keWVsc2VCb2R5bG9vcEJvZHlsb29wdGVtcGVsdGNhc3RlZFZhcl90cmFuc2xhdGVDb25zdExpc3RPclNldF90cmFuc2xhdGVDb25zdE1hcF9hZGROb3JtYWxFbnRyeV90cmFuc2xhdGVFbnRyeV90cmFuc2xhdGVTcHJlYWRFbnRyeV90cmFuc2xhdGVJZkVudHJ5X3RyYW5zbGF0ZUZvckVudHJ5X3RyYW5zbGF0ZUZvckluRW50cnlrZXlWYXJ2YWx1ZVZhcmN1cnJlbnRQYXJ0ZmFzdGEudHJhbnNmb3JtX3NldF9saXRlcmFsc2FkZE1ldGhvZHVubW9kaWZpYWJsZVNldENvbnN0cnVjdG9yX2ZpbmRBZGRNZXRob2RfZmluZFVubW9kaWZpYWJsZVNldENvbnN0cnVjdG9yY29sbGVjdGlvblVyaWNvbGxlY3Rpb25MaWJyYXJ5bWFwRXhwc2V0VmFyc2V0RXhwZmFzdGEucGFyc2VyLmNsYXNzX21lbWJlcl9wYXJzZXJFcnJvckRlbGVnYXRpb25MaXN0ZW5lcnNraXBQYXJzZXJza2lwRXhwcmVzc2lvbnBhcnNlSWRlbnRpZmllckV4cHJlc3Npb25tYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnNhc3luY1N0YXRlbG9vcFN0YXRlcGFyc2VBcmd1bWVudHNPcHRza2lwQXJndW1lbnRzT3B0cGFyc2VGdW5jdGlvbkJvZHlhbGxvd0Fic3RyYWN0c2tpcEZ1bmN0aW9uQm9keXBhcnNlSW52YWxpZEJsb2Nrc2tpcEJsb2NrZmFzdGEuZGlldF9saXN0ZW5lcmlzSWdub3JlZFBhcnNlckVycm9yaW1wb3J0RXhwb3J0RGlyZWN0aXZlSW5kZXhwYXJ0RGlyZWN0aXZlSW5kZXhjdXJyZW50Q2xhc3NJc1BhcnNlclJlY292ZXJ5dW5uYW1lZEV4dGVuc2lvbkNvdW50ZXJkaXNjYXJkZW5kUGFydE9mcGFydEtleXdvcmRvZktleXdvcmRQYXJ0T2ZoYW5kbGVJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbkludmFsaWRUb3BMZXZlbERlY2xhcmF0aW9uaGFuZGxlTm9Bcmd1bWVudHNOb0FyZ3VtZW50c2hhbmRsZU5vVHlwZUFyZ3VtZW50c05vVHlwZUFyZ3VtZW50c2hhbmRsZU5vQ29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzaGFuZGxlTm9UeXBlbGFzdENvbnN1bWVkTm9UeXBlZW5kVHlwZUxpc3RUeXBlTGlzdGhhbmRsZU5hbWVkTWl4aW5BcHBsaWNhdGlvbldpdGhDbGF1c2V3aXRoS2V5d29yZE5hbWVkTWl4aW5BcHBsaWNhdGlvbldpdGhDbGF1c2VoYW5kbGVDbGFzc1dpdGhDbGF1c2VDbGFzc1dpdGhDbGF1c2VoYW5kbGVDbGFzc05vV2l0aENsYXVzZUNsYXNzTm9XaXRoQ2xhdXNlaGFuZGxlTm9Gb3JtYWxQYXJhbWV0ZXJzTm9Gb3JtYWxQYXJhbWV0ZXJzZW5kRnVuY3Rpb25UeXBlQWxpYXN0eXBlZGVmS2V5d29yZEZ1bmN0aW9uVHlwZUFsaWFzdHlwZWRlZkJ1aWxkZXJsb29rdXBCdWlsZGVybWV0YWRhdGFUb2tlbnRva2VuRm9yT2Zmc2V0aXNQb3NpdGlvbmFsYnVpbGRGaWVsZHNlbmRUb3BMZXZlbE1ldGhvZGdldE9yU2V0VG9wTGV2ZWxNZXRob2Rib2R5VG9rZW5jcmVhdGVGdW5jdGlvbkxpc3RlbmVyYnVpbGRGdW5jdGlvbkJvZHlNZW1iZXJLaW5kLlRvcExldmVsTWV0aG9kaGFuZGxlTm9GdW5jdGlvbkJvZHlOb0Z1bmN0aW9uQm9keWVuZExpYnJhcnlOYW1lbGlicmFyeUtleXdvcmRoYW5kbGVEb3R0ZWROYW1lZmlyc3RJZGVudGlmaWVyRG90dGVkTmFtZWVuZENvbmRpdGlvbmFsVXJpZXF1YWxTaWduQ29uZGl0aW9uYWxVcmllbmRDb25kaXRpb25hbFVyaXNDb25kaXRpb25hbFVyaXNoYW5kbGVPcGVyYXRvck5hbWVvcGVyYXRvcktleXdvcmRPcGVyYXRvck5hbWVoYW5kbGVJbnZhbGlkT3BlcmF0b3JOYW1lSW52YWxpZE9wZXJhdG9yTmFtZWhhbmRsZUlkZW50aWZpZXJMaXN0SWRlbnRpZmllckxpc3RlbmRTaG93c2hvd0tleXdvcmRTaG93ZW5kSGlkZWhpZGVLZXl3b3JkSGlkZWVuZENvbWJpbmF0b3JzQ29tYmluYXRvcnNoYW5kbGVJbXBvcnRQcmVmaXhkZWZlcnJlZEtleXdvcmRhc0tleXdvcmRJbXBvcnRQcmVmaXhwdXNoSWZOdWxsTnVsbFZhbHVlLlByZWZpeGVuZEltcG9ydGltcG9ydEtleXdvcmRpbXBvcnRVcmlUb2tlbmxpYnJhcnlOb2RlaGFuZGxlUmVjb3ZlckltcG9ydGVuZEV4cG9ydGV4cG9ydEtleXdvcmRlbmRQYXJ0UGFydGVuZEZhY3RvcnlNZXRob2RmYWN0b3J5S2V5d29yZEZhY3RvcnlNZXRob2RidWlsZFJlZGlyZWN0aW5nRmFjdG9yeU1ldGhvZE1lbWJlcktpbmQuRmFjdG9yeWVuZFJlZGlyZWN0aW5nRmFjdG9yeUJvZHloYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlOYXRpdmVGdW5jdGlvbkJvZHloYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkTmF0aXZlRnVuY3Rpb25Cb2R5SWdub3JlZGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keVNraXBwZWROYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkZW5kTWV0aG9kYmVnaW5QYXJhbU1lbWJlcktpbmQuU3RhdGljTWV0aG9kTWVtYmVyS2luZC5Ob25TdGF0aWNNZXRob2R0eXBlUGFyYW1ldGVyU2NvcGVjb21wdXRlVHlwZVBhcmFtZXRlclNjb3BlcGFyc2VNZXRhZGF0YVN0YXJwYXJzZUZvcm1hbFBhcmFtZXRlcnNPcHRwYXJzZUZpZWxkc2hhbmRsZUludmFsaWRNZW1iZXJJbnZhbGlkTWVtYmVyYmVnaW5DbGFzc09yTWl4aW5Cb2R5ZW5kQ2xhc3NPck1peGluQm9keW1lbWJlckNvdW50Q2xhc3NPck1peGluQm9keWJlZ2luQ2xhc3NEZWNsYXJhdGlvbmFic3RyYWN0VG9rZW5lbmRDbGFzc0RlY2xhcmF0aW9uYmVnaW5NaXhpbkRlY2xhcmF0aW9ubWl4aW5LZXl3b3JkZW5kTWl4aW5EZWNsYXJhdGlvbmJlZ2luRXh0ZW5zaW9uRGVjbGFyYXRpb25leHRlbnNpb25LZXl3b3JkZXh0ZW5zaW9uLWVuZEV4dGVuc2lvbkRlY2xhcmF0aW9uZW5kRW51bWVudW1LZXl3b3JkRW51bWVuZE5hbWVkTWl4aW5BcHBsaWNhdGlvbmNsYXNzS2V5d29yZGltcGxlbWVudHNLZXl3b3JkTmFtZWRNaXhpbkFwcGxpY2F0aW9uZ2V0QXN5bmNNYXJrZXJsaXN0ZW5lckZpbmlzaEZ1bmN0aW9ubGlzdGVuZXJGaW5pc2hGaWVsZHNwYXJzZUluaXRpYWxpemVyc09wdHBhcnNlQXN5bmNNb2RpZmllck9wdHBhcnNlVG9wTGV2ZWxNZW1iZXJwYXJzZUNsYXNzT3JNaXhpbk1lbWJlcmhhbmRsZUR1cGxpY2F0ZWROYW1lY2hlY2tCdWlsZGVybmVhcmVzdERlY2xhcmF0aW9ubWluRGlzdGFuY2VkaXN0YW5jZXRva2Vuc0Zvck9mZnNldHNpc0lnbm9yZWRFcnJvcmZhc3RhLmRpZXRfcGFyc2VycGFyc2VGb3JtYWxQYXJhbWV0ZXJzUmVzdHNraXBGb3JtYWxQYXJhbWV0ZXJzUmVzdGZhc3RhLm91dGxpbmVfYnVpbGRlck1ldGhvZEJvZHlNZXRob2RCb2R5LkFic3RyYWN0TWV0aG9kQm9keS5SZWd1bGFyTWV0aG9kQm9keS5SZWRpcmVjdGluZ0ZhY3RvcnlCb2R5UmVndWxhcmluQ29uc3RydWN0b3JOYW1lcG9wQ2hhck9mZnNldHBvcElkZW50aWZpZXJMaXN0aXNQYXJzZXJSZWNvdmVyeXNlbnRpbmVsTnVsbFZhbHVlLkNvbWJpbmF0b3JzRW5kSW1wb3J0cHJlZml4T2Zmc2V0RW5kQ29uZGl0aW9uYWxVcmlzTnVsbFZhbHVlLkNvbmRpdGlvbmFsVXJpc0VuZENvbmRpdGlvbmFsVXJpUmVjb3ZlckltcG9ydE51bGxWYWx1ZS5EZWZlcnJlZGVudW1WYWx1ZURlY2xhcmF0aW9ubWV0aG9kRGVjbGFyYXRpb25oYW5kbGVOb05hbWU6YmFkaW50ZXJwb2xhdGlvbk9mZnNldGVuZElkZW50aWZpZXJMaXN0TnVsbFZhbHVlLklkZW50aWZpZXJMaXN0c3VmZml4T2Zmc2V0YmVnaW5DbGFzc09yTmFtZWRNaXhpbkFwcGxpY2F0aW9uY2xhc3Mgb3IgbWl4aW4gYXBwbGljYXRpb25iZWdpbk5hbWVkTWl4aW5BcHBsaWNhdGlvbmhhbmRsZUNsYXNzT3JNaXhpbkltcGxlbWVudHNpbnRlcmZhY2VzQ291bnRDbGFzc09yTWl4aW5JbXBsZW1lbnRzTnVsbFZhbHVlLlR5cGVCdWlsZGVyTGlzdGhhbmRsZVJlY292ZXJDbGFzc0hlYWRlcmhhbmRsZVJlY292ZXJNaXhpbkhlYWRlcmhhbmRsZUNsYXNzRXh0ZW5kc2V4dGVuZHNLZXl3b3JkaGFuZGxlTWl4aW5Pbm51bGxJZlBhcnNlclJlY292ZXJ5bWl4aW5Ub2tlbnN1cGVydHlwZUNvbnN0cmFpbnRzY29tcHV0ZVByb2NlZHVyZUtpbmRiZWdpblRvcExldmVsTWV0aG9kZXh0ZXJuYWxUb2tlbiNtZXRob2Rmb3JtYWxzT2Zmc2V0aGFuZGxlRnVuY3Rpb25Cb2R5U2tpcHBlZGlzRXhwcmVzc2lvbkJvZHliZWdpbk1ldGhvZE51bGxWYWx1ZS5Nb2RpZmllcnNib2R5S2luZG5hbWVPck9wZXJhdG9ycmVxdWlyZWRBcmd1bWVudENvdW50aXNSZXF1aXJlZHZhckZpbmFsT3JDb25zdE9mZnNldE51bGxWYWx1ZS5Gb3JtYWxQYXJhbWV0ZXJzYmVnaW5GdW5jdGlvblR5cGVBbGlhc3BvcEZpZWxkSW5mb3Npbml0aWFsaXplclRva2VuRm9ySW5mZXJlbmNlVHlwZVZhcmlhYmxlc0RlZmluZWRzdGVwc3ZpYWNvbnRhaW5pbmdMaWJyYXJ5YmVnaW5GYWN0b3J5TWV0aG9kY29uc3RUb2tlbmV4dGVuZHNPZmZzZXRoYW5kbGVDbGFzc0hlYWRlckNsYXNzSGVhZGVyaGFuZGxlTWl4aW5IZWFkZXJnZXREb2N1bWVudGF0aW9uQ29tbWVudGRvY1Rva2VuaW5TbGFzaC8qKi8vL1ZhcmlhbmNlLmludmFyaWFudGludmFyaWFudF92YXJpYW5jZV90eXBlUGFyYW1ldGVyc1RvU2VhcmNoRm9yb2xkVmFyaWFuY2VyZXNvbHZlSW5mZXJlbmNlTm9kZV9UeXBlU2NoZW1hRWxpbWluYXRpb25WaXNpdG9yaXNMZWFzdENsb3N1cmVuZXdSZXR1cm5UeXBlbmV3UG9zaXRpb25hbFBhcmFtZXRlcnNuZXdOYW1lZFBhcmFtZXRlcnNuZXdUeXBlQXJndW1lbnRzbGVhc3RDbG9zdXJlIDw6IDx0eXBlPiA8OiBfVHlwZVNjaGVtYUVudmlyb25tZW50JkhpZXJhcmNoeUJhc2VkVHlwZUVudmlyb25tZW50JlN0YW5kYXJkQm91bmRzdHlwZVBhcmFtZXRlcnNUb0luZmVycmV0dXJuQ29udGV4dFR5cGVpbmZlclR5cGVGcm9tQ29uc3RyYWludHNkb3dud2FyZHNJbmZlclBoYXNlaGFzT21pdHRlZEJvdW5kdHlwZXNGcm9tRG93bndhcmRzSW5mZXJlbmNldHlwZVBhcmFtQm91bmRleHRlbmRzQ29uc3RyYWludF9pbmZlclR5cGVQYXJhbWV0ZXJGcm9tQ29udGV4dF9pbmZlclR5cGVQYXJhbWV0ZXJGcm9tQWxsa25vd25UeXBlc3R5cGVTYXRpc2ZpZXNDb25zdHJhaW50c29sdmVUeXBlQ29uc3RyYWludGdyb3VuZGVkdHlwZUZyb21Db250ZXh0SW5mZXJlbmNlX2NvcmVUeXBlc3N1YnN0aXR1dGVUeXBlUGFyYW1zbmV3VHlwZVBhcmFtZXRlcnNmYXN0YS5xdWFsaWZpZWRfbmFtZXByZXNlcnZlVG9rZW5pZGVudGlmaWVyKF9Ub2tlbklkZW50aWZpZXJ0b2tlbi1pZGVudGlmaWVyKGluaXRpYWxpemVkLWlkZW50aWZpZXIocXVhbGlmaWVkLW5hbWUoX1Rva2VuUXVhbGlmaWVkTmFtZXRva2VuLXF1YWxpZmllZC1uYW1lKGZsYXR0ZW5RdWFsaWZpZWROYW1lT250b2tlbklkZW50aWZpZXJmYXN0YS5idWlsdGluX3R5cGVfYnVpbGRlcmJ1aWxkVHlwZWJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHNmYXN0YS5jbGFzc19idWlsZGVydHlwZV9hbGdlYnJhcmVkaXJlY3RpbmdDb25zdHJ1Y3RvcnNpZ25vcmVyZWRpcmVjdGN5Y2xlUmVwb3J0ZWR0YXJnZXRCdWlsZGVyYWRkUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcnNldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHlhY2Nlc3NpbmdMaWJyYXJ5Zmlyc3RNZW1iZXJOYW1lZHN1cGVyQ2xhc3NzdXBlckNsYXNzVHlwZWRlY2xwcm9ibGVtc3Byb2JsZW1zT2Zmc2V0c2ltcGxlbWVudGVkcmVwZXRpdGlvbnNjaGVja0JvdW5kc0luU3VwZXJ0eXBlY29uc3RydWN0b3JzRmllbGRoYW5kbGVTZWVuQ292YXJpYW50Q29uc3RydWN0b3IgaW4gb3ZlcnJpZGUgY2hlY2suc2VlbkNvdmFyaWFudGNoZWNrTWV0aG9kT3ZlcnJpZGVjaGVja0dldHRlck92ZXJyaWRlY2hlY2tTZXR0ZXJPdmVycmlkZWRlY2xhcmVkTWVtYmVySGFzR2V0dGVyaW50ZXJmYWNlTWVtYmVySGFzR2V0dGVyZGVjbGFyZWRNZW1iZXJIYXNTZXR0ZXJpbnRlcmZhY2VNZW1iZXJIYXNTZXR0ZXJoYXNVc2VyRGVmaW5lZE5vU3VjaE1ldGhvZHRyYW5zZm9ybVByb2NlZHVyZVRvTm9TdWNoTWV0aG9kRm9yd2FyZGVybm9TdWNoTWV0aG9kSW50ZXJmYWNlYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVyRm9yUHJvY2VkdXJlY2xvbmVkYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVyR2V0dGVyRm9yRmllbGRhZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJTZXR0ZXJGb3JGaWVsZGV4aXN0aW5nRm9yd2FyZGVyc05hbWVzZXhpc3RpbmdTZXR0ZXJGb3J3YXJkZXJzTmFtZXNsZWFzdENvbmNyZXRlU3VwZXJjbGFzc3N1cGVySGFzVXNlckRlZmluZWROb1N1Y2hNZXRob2Rjb25jcmV0ZWNvbmNyZXRlU2V0dGVyc2Nsc0hhc1VzZXJEZWZpbmVkTm9TdWNoTWV0aG9kX2dldE1lbWJlclVyaV9jb21wdXRlSW50ZXJmYWNlU3Vic3RpdHV0aW9uZGVjbGFyZWRGdW5jdGlvbmludGVyZmFjZUZ1bmN0aW9uaW50ZXJmYWNlU3Vic3RpdHV0aW9uaW5oZXJpdGVkQ29udGV4dGRlY2xhcmVkUGFyYW1ldGVyaW50ZXJmYWNlUGFyYW1ldGVyZGVjbGFyZWRCb3VuZGludGVyZmFjZUJvdW5kX2NvbXB1dGVEZWNsYXJlZFN1YnN0aXR1dGlvbmRlY2xhcmVkU3Vic3RpdHV0aW9uX2NoZWNrVHlwZXNhc0lmRGVjbGFyZWRQYXJhbWV0ZXJpblBhcmFtZXRlcmRlY2xhcmVkTWVtYmVyTmFtZWludGVyZmFjZU1lbWJlck5hbWVwMHAxc29ydGVkRnJvbURlY2xhcmVkc29ydGVkRnJvbUludGVyZmFjZWRlY2xhcmVkTmFtZWRQYXJhbWV0ZXJzaW50ZXJmYWNlTmFtZWRQYXJhbWV0ZXJzYmFzZU5hbWVtaXhpbk5hbWVjbGFzc05hbWVMZW5ndGhtZW1iZXJQYXRjaG9yaWdpbkxlbmd0aHBhdGNoTGVuZ3RoY29tcHV0ZVJlZGlyZWN0ZWVUeXBldGFyZ2V0RnVuY3Rpb25UeXBldHlwZVBhcmFtZXRlckJvdW5kY29tcHV0ZVJlZGlyZWN0ZWVOYW1lY2hlY2tSZWRpcmVjdGluZ0ZhY3RvcnlmYWN0b3J5VHlwZXJlZGlyZWN0ZWVUeXBlZGlyZWN0U3Vic3RpdHV0aW9uTWFwaW5zdGFuY2VDbGFzcyBleHBlY3RlZCBsb29rdXBDb25zdHJ1Y3RvcldpdGhQYXRjaGVzZ2V0U3VwZXJjbGFzc0NvbnN0cnVjdG9yUmVkaXJlY3Rpb25mYXN0YS5jb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlcm1pZGRsZWZhc3RhLmRlY2xhcmF0aW9uLnRhcmdldC5hcHBseVBhdGNoLmZpbmlzaFBhdGNoZmFzdGEuZHluYW1pY190eXBlX2J1aWxkZXJmYXN0YS5lbnVtX2J1aWxkZXJzZWxmVHlwZWNvbnN0cnVjdG9yQnVpbGRlcnZhbHVlc0J1aWxkZXJ0b1N0cmluZ0J1aWxkZXJlbnVtQ29uc3RhbnRJbmZvc3RhcnRDaGFyT2Zmc2V0Q29tcHV0ZWRlbnVtQnVpbGRlcmVudW0gaW5kZXhGaWVsZEJ1aWxkZXJpbmRleEZpZWxkbmFtZUZpZWxkQnVpbGRlcm5hbWVGaWVsZHN1cGVyQ29uc3RydWN0b3JmYXN0YS5maWVsZF9idWlsZGVyZmFzdGEuZm9ybWFsX3BhcmFtZXRlcl9idWlsZGVyaXNNYW5kYXRvcnlGb3JtYWxQYXJhbWV0ZXJLaW5kaXNPcHRpb25hbE5hbWVkRm9ybWFsUGFyYW1ldGVyS2luZGlzT3B0aW9uYWxQb3NpdGlvbmFsRm9ybWFsUGFyYW1ldGVyS2luZGZvckZvcm1hbFBhcmFtZXRlckluaXRpYWxpemVyU2NvcGVpc0NvbnN0Q29uc3RydWN0b3JQYXJhbWV0ZXJmYXN0YS5wcm9jZWR1cmVfYnVpbGRlcmFjdHVhbEJvZHlmb3JtYWwgcGFyYW1ldGVyZm9ybWFsIHBhcmFtZXRlciBpbml0aWFsaXplcnR5cGUgcGFyYW1ldGVybmV3Qm9keWJ1aWxkRnVuY3Rpb24jc3ludGhldGljcmVtb3ZlVHlwZVZhcmlhYmxlc2NoZWNrUGF0Y2hyZXBvcnRQYXRjaE1pc21hdGNoYWN0dWFsQXN5bmNNb2RpZmllcm5ld01vZGlmaWVyaXNFbGlnaWJsZUZvclRvcExldmVsSW5mZXJlbmNlaGFzTW92ZWRTdXBlckluaXRpYWxpemVyc3VwZXJJbml0aWFsaXplcnJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJmdW5jdGlvbk5vZGVpbmplY3RJbnZhbGlkSW5pdGlhbGl6ZXJsYXN0SW5pdGlhbGl6ZXJyZWRpcmVjdGluZ09yaWdpbmZhc3RhLmZ1bmN0aW9uX3R5cGVfYnVpbGRlcikgLT4gYnVpbHRSZXR1cm5UeXBlY2xvbmVkVHlwZVZhcmlhYmxlc2Zhc3RhLmludmFsaWRfdHlwZV9idWlsZGVyZmFzdGEubGlicmFyeV9idWlsZGVyLmFwcGx5UGF0Y2hlc0xpYnJhcnlMb2NhbERlY2xhcmF0aW9uSXRlcmF0b3JMaWJyYXJ5TG9jYWxEZWNsYXJhdGlvbk5hbWVJdGVyYXRvcmZhc3RhLm1lbWJlcl9idWlsZGVyZmFzdGEubWV0YWRhdGFfYnVpbGRlcmZhc3RhLm1peGluX2FwcGxpY2F0aW9uX2J1aWxkZXJmYXN0YS5tb2RpZmllcl9idWlsZGVyaXNNaXhpbmZhc3RhLm5hbWVfaXRlcmF0b3JmYXN0YS5uYW1lZF90eXBlX2J1aWxkZXJ0eXBlTmFtZXR5cGVOYW1lT2Zmc2V0ZmxhdE5hbWVoYW5kbGVJbnZhbGlkU3VwZXJ0eXBlY2xvbmVkQXJndW1lbnRzZmFzdGEucHJlZml4X2J1aWxkZXJmYXN0YS5mdW5jdGlvbl90eXBlX2FsaWFzX2J1aWxkZXJjeWNsaWNUeXBlQWxpYXNNYXJrZXJmYXN0YS50eXBlX2J1aWxkZXJmYXN0YS50eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXJmYXN0YS50eXBlX3ZhcmlhYmxlX2J1aWxkZXJhY3R1YWxQYXJhbWV0ZXJmcm9tS2VybmVsYXNUeXBlQnVpbGRlcmtlcm5lbFR5cGVQYXJhbWV0ZXJzRnJvbUJ1aWxkZXJzZmFzdGEudW5yZXNvbHZlZF90eXBlVW5yZXNvbHZlZFR5cGUoQGZhc3RhLnZvaWRfdHlwZV9idWlsZGVyZmFzdGEucGFyc2VyLmxpc3RlbmVybG9nRXZlbnRzdXBwcmVzc1BhcnNlRXJyb3JzYmVnaW5Bcmd1bWVudHNiZWdpbkF3YWl0RXhwcmVzc2lvbkludmFsaWRBd2FpdEV4cHJlc3Npb25DYXNjYWRlQ2FzZUV4cHJlc3Npb25DbGFzc0V4dGVuZHNDbGFzc0ltcGxlbWVudHNSZWNvdmVyQ2xhc3NIZWFkZXJDbGFzc0RlY2xhcmF0aW9uTWl4aW5Pbk1peGluSGVhZGVyUmVjb3Zlck1peGluSGVhZGVyTWl4aW5EZWNsYXJhdGlvbkV4dGVuc2lvbkRlY2xhcmF0aW9uYmVnaW5Db21iaW5hdG9yc2JlZ2luQ29tcGlsYXRpb25Vbml0aGFuZGxlRGlyZWN0aXZlc09ubHllbmRDb21waWxhdGlvblVuaXRDb21waWxhdGlvblVuaXRDb25zdExpdGVyYWxiZWdpbkNvbnN0cnVjdG9yUmVmZXJlbmNlRG9XaGlsZVN0YXRlbWVudEJvZHlXaGlsZVN0YXRlbWVudEJvZHliZWdpbkVudW1iZWdpbkV4cG9ydGhhbmRsZUV4dHJhbmVvdXNFeHByZXNzaW9uRXh0cmFuZW91c0V4cHJlc3Npb25Gb3JTdGF0ZW1lbnRCb2R5Rm9ySW5Cb2R5YmVnaW5GdW5jdGlvbk5hbWViZWdpbkhpZGViZWdpblR5cGVMaXN0YmVnaW5JZlN0YXRlbWVudFRoZW5TdGF0ZW1lbnRFbHNlU3RhdGVtZW50YmVnaW5JbXBvcnRJbXBvcnRSZWNvdmVyeWJlZ2luQ29uZGl0aW9uYWxVcmlzYmVnaW5Db25kaXRpb25hbFVyaWJlZ2luSW5pdGlhbGl6ZWRJZGVudGlmaWVyYmVnaW5WYXJpYWJsZUluaXRpYWxpemVyQ29uc3RydWN0b3JJbml0aWFsaXplcmhhbmRsZUludmFsaWRFeHByZXNzaW9uSW52YWxpZEZ1bmN0aW9uQm9keWhhbmRsZUludmFsaWRUeXBlUmVmZXJlbmNlSW52YWxpZFR5cGVSZWZlcmVuY2ViZWdpbkxpYnJhcnlOYW1lTGlicmFyeU5hbWVoYW5kbGVJbnRlcnBvbGF0aW9uRXhwcmVzc2lvbkxpdGVyYWxTdHJpbmdiZWdpbk1lbWJlcmJlZ2luTWV0YWRhdGFTdGFyYmVnaW5PcHRpb25hbEZvcm1hbFBhcmFtZXRlcnNiZWdpblBhcnRiZWdpblBhcnRPZmJlZ2luUmVkaXJlY3RpbmdGYWN0b3J5Qm9keWJlZ2luUmV0dXJuU3RhdGVtZW50RW1wdHlGdW5jdGlvbkJvZHliZWdpblNob3diZWdpblN3aXRjaFN0YXRlbWVudGJlZ2luTGl0ZXJhbFN5bWJvbGJlZ2luUmV0aHJvd1N0YXRlbWVudGVuZFRvcExldmVsRGVjbGFyYXRpb25Ub3BMZXZlbERlY2xhcmF0aW9uYmVnaW5Ub3BMZXZlbE1lbWJlcmJlZ2luVHJ5U3RhdGVtZW50VHJ5U3RhdGVtZW50Tm9uTnVsbEFzc2VydEV4cHJlc3Npb25tb2RpZmllclRva2VuTm9OYW1lYmVnaW5UeXBlQXJndW1lbnRzYmVnaW5UeXBlVmFyaWFibGVzQ29uc3RFeHByZXNzaW9uRWxzZUNvbnRyb2xGbG93YmVnaW5ZaWVsZFN0YXRlbWVudGhhbmRsZUVycm9yVG9rZW5kaXNjYXJkVHlwZVJlcGxhY2VkV2l0aENvbW1lbnRUeXBlQXNzaWduaGFuZGxlQ29tbWVudFJlZmVyZW5jZVRleHRyZWZlcmVuY2VTb3VyY2VyZWZlcmVuY2VPZmZzZXRDb21tZW50UmVmZXJlbmNlVGV4dGhhbmRsZUNvbW1lbnRSZWZlcmVuY2VuZXdLZXl3b3JkaGFuZGxlTm9Db21tZW50UmVmZXJlbmNlZmFzdGEucGFyc2VyLnBhcnNlckZvcndhcmRpbmdMaXN0ZW5lcmxvb2tzTGlrZUV4cHJlc3Npb25TdGFydExpdGVyYWxFbnRyeUluZm9jb21wdXRlTGl0ZXJhbEVudHJ5bG9va3NMaWtlTGl0ZXJhbEVudHJ5c2ltcGxlRW50cnlMb29wU3RhdGVNb2RpZmllclJlY292ZXJ5Q29udGV4dENsYXNzSGVhZGVyUmVjb3ZlcnlMaXN0ZW5lckltcG9ydFJlY292ZXJ5TGlzdGVuZXJNaXhpbkhlYWRlclJlY292ZXJ5TGlzdGVuZXJUb2tlblN0cmVhbVJld3JpdGVyVHlwZUluZm9UeXBlUGFyYW1PckFyZ0luZm9jb21wdXRlTWV0aG9kVHlwZUFyZ3VtZW50c2NvbXB1dGVUeXBlY29tcHV0ZVR5cGVQYXJhbU9yQXJnaXNWYWxpZFR5cGVSZWZlcmVuY2Vub1R5cGVub1R5cGVQYXJhbU9yQXJnZmluZE5vblplcm9MZW5ndGhUb2tlbmZpbmRQcmV2aW91c05vblplcm9MZW5ndGhUb2tlbmlzTGV0dGVyaXNMZXR0ZXJPckRpZ2l0aXNPbmVPZmlzT25lT2ZPckVvZmlzV2hpdGVzcGFjZV9NZXNzYWdlV2l0aEFyZ3VtZW50TG9vcFN0YXRlLk91dHNpZGVMb29wY2FjaGVkUmV3cml0ZXJzdGF0ZW1lbnREZXB0aGV4cHJlc3Npb25EZXB0aHJld3JpdGVyaW5HZW5lcmF0b3JpbkFzeW5jaW5QbGFpblN5bmNpc0JyZWFrQWxsb3dlZGlzQ29udGludWVBbGxvd2VkTG9vcFN0YXRlLkluc2lkZUxvb3Bpc0NvbnRpbnVlV2l0aExhYmVsQWxsb3dlZHNraXBFcnJvclRva2Vuc2RpcmVjdGl2ZVN0YXRlY2hlY2tTY3JpcHRUYWdwYXJzZVNjcmlwdHBhcnNlVG9wTGV2ZWxEZWNsYXJhdGlvbkltcGxyZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VucmVwb3J0QWxsRXJyb3JUb2tlbnNwYXJzZURpcmVjdGl2ZXNuZXh0VmFsdWVjaGVja0ltcG9ydHBhcnNlSW1wb3J0Y2hlY2tFeHBvcnRwYXJzZUV4cG9ydGNoZWNrTGlicmFyeXBhcnNlTGlicmFyeU5hbWVwYXJzZVBhcnRPclBhcnRPZnBhcnNlVG9wTGV2ZWxEZWNsYXJhdGlvbnBhcnNlVG9wTGV2ZWxLZXl3b3JkRGVjbGFyYXRpb25jaGVja0RlY2xhcmF0aW9ucGFyc2VUb3BMZXZlbE1lbWJlckltcGxyZXBvcnRSZWNvdmVyYWJsZUVycm9yaW5zZXJ0U3ludGhldGljSWRlbnRpZmllciNzeW50aGV0aWNfZnVuY3Rpb25fcGFyc2VJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbnBhcnNlQ2xhc3NEZWNsYXJhdGlvbk1vZGlmaWVyc3BhcnNlVG9wTGV2ZWxLZXl3b3JkTW9kaWZpZXJzcmVwb3J0VG9wTGV2ZWxNb2RpZmllckVycm9yYWZ0ZXJNb2RpZmllcnNwYXJzZUNsYXNzT3JOYW1lZE1peGluQXBwbGljYXRpb25wYXJzZUVudW1wYXJzZUV4dGVuc2lvbnBhcnNlVHlwZWRlZnBhcnNlTWl4aW5JbnRlcm5hbCBlcnJvcjogVW5oYW5kbGVkIHRvcCBsZXZlbCBrZXl3b3JkICdwYXJzZVF1YWxpZmllZGxpYnJhcnlOYW1lQ29udGludWF0aW9uZW5zdXJlU2VtaWNvbG9ucGFyc2VJbXBvcnRQcmVmaXhPcHRkZWZlcnJlZFRva2VuZW5zdXJlSWRlbnRpZmllcmltcG9ydFByZWZpeERlY2xhcmF0aW9uZW5zdXJlTGl0ZXJhbFN0cmluZ3BhcnNlQ29uZGl0aW9uYWxVcmlTdGFycGFyc2VDb21iaW5hdG9yU3RhcnBhcnNlSW1wb3J0UmVjb3ZlcnlwcmltYXJ5TGlzdGVuZXJyZWNvdmVyeUxpc3RlbmVyZmlyc3REZWZlcnJlZEtleXdvcmRoYXNQcmVmaXhoYXNDb21iaW5hdG9yc2tpcFVuZXhwZWN0ZWRUb2tlbk9wdHBhcnNlQ29uZGl0aW9uYWxVcmlpbnNlcnRQYXJlbnNwYXJzZURvdHRlZE5hbWVlcXVhbGl0eVNpZ25tb3ZlU3ludGhldGljZG90dGVkTmFtZUNvbnRpbnVhdGlvbnBhcnNlSGlkZXBhcnNlU2hvd3BhcnNlSWRlbnRpZmllckxpc3RwYXJzZVR5cGVMaXN0ZW5zdXJlVHlwZU9yVm9pZGNoZWNrUGFydE9mcGFyc2VQYXJ0T2ZjaGVja1BhcnRwYXJzZVBhcnRwYXJ0TmFtZXBhcnROYW1lQ29udGludWF0aW9uYXRUb2tlbm1ldGFkYXRhUmVmZXJlbmNlcGFyc2VRdWFsaWZpZWRSZXN0T3B0bWV0YWRhdGFDb250aW51YXRpb25wYXJzZUFyZ3VtZW50c21ldGFkYXRhQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzdHlwZUluZm9za2lwVHlwZXR5cGVkZWZEZWNsYXJhdGlvbnBhcnNlVmFyaWFibGVzcGFyc2VUeXBlcGFyc2VGb3JtYWxQYXJhbWV0ZXJzUmVxdWlyZWRPcHRNZW1iZXJLaW5kLkZ1bmN0aW9uVHlwZUFsaWFzcGFyc2VNaXhpbkFwcGxpY2F0aW9uUmVzdGluc2VydFN5bnRoZXRpY0tleXdvcmRwYXJzZVdpdGhDbGF1c2VPcHRwYXJzZUdldHRlck9yRm9ybWFsUGFyYW1ldGVyc3BhcnNlRm9ybWFsUGFyYW1ldGVyc2lzVW5hcnlNaW51c21pc3NpbmdQYXJhbWV0ZXJNZXNzYWdlc2tpcEZvcm1hbFBhcmFtZXRlcnNwYXJzZU9wdGlvbmFsUG9zaXRpb25hbFBhcmFtZXRlcnNlbnN1cmVDbG9zZVBhcmVucGFyc2VPcHRpb25hbE5hbWVkUGFyYW1ldGVyc3Jld3JpdGVTcXVhcmVCcmFja2V0c3BhcnNlRm9ybWFsUGFyYW1ldGVycmV3cml0ZUFuZFJlY292ZXJwYXJhbWV0ZXJLaW5kaW5GdW5jdGlvblR5cGVwYXJzZUZvcm1hbFBhcmFtZXRlck1vZGlmaWVyc2JlZm9yZVR5cGVpc05hbWVkUGFyYW1ldGVybmFtZUNvbnRleHRmb3JtYWxQYXJhbWV0ZXJEZWNsYXJhdGlvbmZpZWxkSW5pdGlhbGl6ZXJiZWZvcmVJbmxpbmVGdW5jdGlvblR5cGVjbG9zZXJlbmRJbmxpbmVGdW5jdGlvblR5cGVNZW1iZXJLaW5kLkZ1bmN0aW9uVHlwZWRQYXJhbWV0ZXJlcXVhbGNvbnRpbnVhdGlvbkNvbnRleHRwYXJzZVF1YWxpZmllZFJlc3RlbnN1cmVCbG9ja2VudW1EZWNsYXJhdGlvbmNsYXNzT3JNaXhpbkRlY2xhcmF0aW9ucGFyc2VOYW1lZE1peGluQXBwbGljYXRpb25wYXJzZUNsYXNzZW5zdXJlVHlwZU5vdFZvaWRwYXJzZUNsYXNzSGVhZGVyT3B0cGFyc2VDbGFzc0hlYWRlclJlY292ZXJ5Y2xhc3MgZGVjbGFyYXRpb25wYXJzZUNsYXNzT3JNaXhpbkJvZHlwYXJzZUNsYXNzRXh0ZW5kc09wdHBhcnNlQ2xhc3NPck1peGluSW1wbGVtZW50c09wdHBhcnNlTmF0aXZlQ2xhdXNlaGFzRXh0ZW5kc2hhc0ltcGxlbWVudHNoYXNXaXRoaW5jb3JyZWN0RXh0ZW5kc0tleXdvcmRoZWFkZXJTdGFydHBhcnNlTWl4aW5IZWFkZXJPcHRwYXJzZU1peGluSGVhZGVyUmVjb3ZlcnltaXhpbiBkZWNsYXJhdGlvbnBhcnNlTWl4aW5Pbk9wdGhhc09ucGFyc2VNaXhpbk9uZXh0ZW5zaW9uIGRlY2xhcmF0aW9ucGFyc2VTdHJpbmdQYXJ0aW5zZXJ0VG9rZW5tZXNzYWdlT25Ub2tlbnJlY292ZXJ5VGVtcGxhdGVub3RFb2ZPclZhbHVlcGFyc2VUeXBlVmFyaWFibGVzT3B0YmVmb3JlU3RhcnRwYXJzZVRvcExldmVsTW9kaWZpZXJzI3N5bnRoZXRpY19pZGVudGlmaWVyX3BhcnNlVG9wTGV2ZWxNZXRob2RmaWVsZENvdW50cGFyc2VGaWVsZEluaXRpYWxpemVyT3B0aW5zZXJ0U3ludGhldGljVG9rZW50b3BMZXZlbEZ1bmN0aW9uRGVjbGFyYXRpb25wYXJzZU1ldGhvZFR5cGVWYXJzYXZlZEFzeW5jTW9kaWZpZXJ0eXBlVmFycGFyc2VWYXJpYWJsZUluaXRpYWxpemVyT3B0cGFyc2VJbml0aWFsaXplcmJlZm9yZUV4cHJlc3Npb25wYXJzZUFzc2VydHBhcnNlU3VwZXJJbml0aWFsaXplckV4cHJlc3Npb25wYXJzZUluaXRpYWxpemVyRXhwcmVzc2lvblJlc3RleHByZXNzaW9uQ29udGludWF0aW9uYmxvY2tLaW5kaW5zZXJ0QmxvY2tiZWdpbkdyb3Vwb3BlblBhcmVuZW5zdXJlQ29sb25uZXdUb2tlbiIicGFyc2VMaXRlcmFsU3RyaW5ncmVwbGFjZVRva2VuRm9sbG93aW5nZXhwZWN0ZWROZXh0ZXhwZWN0ZWRWYWx1ZXNraXBDbGFzc09yTWl4aW5Cb2R5cGFyc2VDbGFzc09yTWl4aW5NZW1iZXJJbXBsdW5hcnlwYXJzZUNsYXNzTWVtYmVyTW9kaWZpZXJzcGFyc2VGYWN0b3J5TWV0aG9kcGFyc2VNZXRob2RwYXJzZUludmFsaWRPcGVyYXRvckRlY2xhcmF0aW9ucmVjb3ZlckZyb21JbnZhbGlkQ2xhc3NNZW1iZXJwYXJzZU9wZXJhdG9yTmFtZW1ldGhvZERlY2xhcmF0aW9uQ29udGludWF0aW9uYmVmb3JlUGFyYW1iZWZvcmVJbml0aWFsaXplcnNwYXJzZVJlZGlyZWN0aW5nRmFjdG9yeUJvZHlzdGF0aWNPckNvdmFyaWFudHBhcnNlTW9kaWZpZXJzQWZ0ZXJGYWN0b3J5YmVmb3JlVG9rZW5wYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbk1lbWJlcktpbmQuTG9jYWxwYXJzZUFzeW5jT3B0Qm9keXBhcnNlRnVuY3Rpb25MaXRlcmFsYmVmb3JlTmFtZXBhcnNlTmFtZWRGdW5jdGlvblJlc3Rsb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25vZkZ1bmN0aW9uRXhwcmVzc2lvbnBhcnNlQ29uc3RydWN0b3JSZWZlcmVuY2Vjb25zdHJ1Y3RvclJlZmVyZW5jZWNvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uY29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNza2lwQXN5bmNNb2RpZmllcnBhcnNlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keXNhdmVkTG9vcFN0YXRlcGFyc2VTdGF0ZW1lbnRyZWNvdmVyRnJvbVN0YWNrT3ZlcmZsb3dwYXJzZVN0YXRlbWVudFhwYXJzZUxhYmVsZWRTdGF0ZW1lbnRwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uQWZ0ZXJNb2RpZmllcnNwYXJzZUJsb2NrcGFyc2VSZXR1cm5TdGF0ZW1lbnR2YXJPckZpbmFscGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbnBhcnNlSWZTdGF0ZW1lbnRwYXJzZUZvclN0YXRlbWVudHBhcnNlUmV0aHJvd1N0YXRlbWVudHBhcnNlV2hpbGVTdGF0ZW1lbnRwYXJzZURvV2hpbGVTdGF0ZW1lbnRwYXJzZVRyeVN0YXRlbWVudHBhcnNlU3dpdGNoU3RhdGVtZW50cGFyc2VCcmVha1N0YXRlbWVudHBhcnNlQ29udGludWVTdGF0ZW1lbnRwYXJzZUFzc2VydFN0YXRlbWVudHBhcnNlRW1wdHlTdGF0ZW1lbnRwYXJzZVlpZWxkU3RhdGVtZW50SW50ZXJuYWwgZXJyb3I6IFVua25vd24gYXN5bmNTdGF0ZTogJ3BhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yQ29uc3REZWNsYXJhdGlvbmxvb2tzTGlrZUF3YWl0RXhwcmVzc2lvbnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudHBhcnNlTGFiZWxsYWJlbERlY2xhcmF0aW9ucGFyc2VUaHJvd0V4cHJlc3Npb25wYXJzZVByZWNlZGVuY2VFeHByZXNzaW9ucGFyc2VFeHByZXNzaW9uV2l0aG91dENhc2NhZGVwYXJzZUNvbmRpdGlvbmFsRXhwcmVzc2lvblJlc3RhbGxvd0Nhc2NhZGVzcGFyc2VVbmFyeUV4cHJlc3Npb250b2tlbkxldmVsX2NvbXB1dGVQcmVjZWRlbmNlbGFzdEJpbmFyeUV4cHJlc3Npb25MZXZlbHBhcnNlQ2FzY2FkZUV4cHJlc3Npb25wYXJzZVByaW1hcnlwYXJzZUFyZ3VtZW50T3JJbmRleFN0YXJwYXJzZUlzT3BlcmF0b3JSZXN0cGFyc2VBc09wZXJhdG9yUmVzdGNhc2NhZGVPcGVyYXRvcnBhcnNlU2VuZG1hcmtwYXJzZUF3YWl0RXhwcmVzc2lvbnBhcnNlSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb25wYXJzZVNlbmRPckZ1bmN0aW9uTGl0ZXJhbHBhcnNlTGl0ZXJhbEludHBhcnNlTGl0ZXJhbERvdWJsZXBhcnNlTGl0ZXJhbFN5bWJvbHBhcnNlTGl0ZXJhbEJvb2xwYXJzZUxpdGVyYWxOdWxscGFyc2VUaGlzRXhwcmVzc2lvbnBhcnNlU3VwZXJFeHByZXNzaW9ucGFyc2VOZXdFeHByZXNzaW9ucGFyc2VDb25zdEV4cHJlc3Npb25wYXJzZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uT3JGdW5jdGlvbkxpdGVyYWxwYXJzZUxpdGVyYWxMaXN0U3VmZml4cGFyc2VMaXRlcmFsU2V0T3JNYXBTdWZmaXhwYXJzZUxpdGVyYWxMaXN0U2V0TWFwT3JGdW5jdGlvbnBhcnNlUGFyZW50aGVzaXplZEV4cHJlc3Npb25lbnN1cmVQYXJlbnRoZXNpemVkQ29uZGl0aW9ucGFyc2VFeHByZXNzaW9uSW5QYXJlbnRoZXNpc1Jlc3RwYXJzZUV4cHJlc3Npb25JblBhcmVudGhlc2lzdGhpc1Rva2Vuc3VwZXJUb2tlbmlmQ291bnRoYXNFbnRyeWlmQ29uZGl0aW9uRGVsdGFjb21wdXRlTmV4dGlzTWFwRW50cnlwYXJzZUxpdGVyYWxGdW5jdGlvblN1ZmZpeHR5cGVQYXJhbU9yQXJncGFyc2VNYXBMaXRlcmFsRW50cnlsb29rc0xpa2VGdW5jdGlvbkJvZHllbnN1cmVBcmd1bWVudHNwYXJzZUFyZ3VtZW50c1Jlc3RwYXJzZUNvbnN0cnVjdG9ySW52b2NhdGlvbkFyZ3VtZW50c3BhcnNlU2luZ2xlTGl0ZXJhbFN0cmluZ2xpdGVyYWxTeW1ib2xsaXRlcmFsU3ltYm9sQ29udGludWF0aW9uaGFzU2Vlbk5hbWVkQXJndW1lbnRuYW1lZEFyZ3VtZW50UmVmZXJlbmNlY29tcHV0ZVR5cGVBZnRlcklzT3JBc3NraXBDaGFpbmVkQXNJc09wZXJhdG9yc2FzTm9uTnVsbGFibGVsb29rc0xpa2VMb2NhbEZ1bmN0aW9ub25seVBhcnNlVmFyaWFibGVEZWNsYXJhdGlvblN0YXJ0cGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uTW9kaWZpZXJzYmVmb3JlRm9ybWFsc2NvdWxkQmVFeHByZXNzaW9uYWZ0ZXJJZGVudGlmaWVyb3JpZ2luYWxMaXN0ZW5lcmFmdGVyRXhwcmVzc2lvbnBhcnNlVmFyaWFibGVzRGVjbGFyYXRpb25SZXN0ZW5kV2l0aFNlbWljb2xvbnBhcnNlT3B0aW9uYWxseUluaXRpYWxpemVkSWRlbnRpZmllcmxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbnBhcnNlRm9yTG9vcFBhcnRzU3RhcnRwYXJzZUZvckxvb3BQYXJ0c01pZHBhcnNlRm9ySW5SZXN0cGFyc2VGb3JSZXN0cGFyc2VGb3JMb29wUGFydHNSZXN0cGFyc2VGb3JJbkxvb3BQYXJ0c1Jlc3R3aGlsZVRva2VuZG9Ub2tlbmZvcndhcmRFcnJvcnN0cnkgc3RhdGVtZW50b3BlblBhcmVuc2V4Y2VwdGlvbk5hbWVjYXRjaFBhcmFtZXRlcnRyYWNlTmFtZU1lbWJlcktpbmQuQ2F0Y2hjYXRjaCBjbGF1c2VmaW5hbGx5IGNsYXVzZUxvb3BTdGF0ZS5JbnNpZGVTd2l0Y2hwYXJzZVN3aXRjaEJsb2NrYmVnaW5Td2l0Y2hzd2l0Y2ggc3RhdGVtZW50YmVnaW5DYXNlcGVla1Bhc3RMYWJlbHNwYXJzZVN0YXRlbWVudHNJblN3aXRjaENhc2VsYWJlbFJlZmVyZW5jZXByZXZpb3VzVG9rZW5yZXBvcnRBbmRTa2lwQ2xhc3NJbkNsYXNzcmVwb3J0QW5kU2tpcEVudW1JbkNsYXNzcmVwb3J0QW5kU2tpcFR5cGVkZWZJbkNsYXNzZmluZERhcnREb2Npc011bHRpbGluZXBhcnNlQ29tbWVudFJlZmVyZW5jZXNwYXJzZVJlZmVyZW5jZXNJblNpbmdsZUxpbmVDb21tZW50c3BhcnNlUmVmZXJlbmNlc0luTXVsdGlMaW5lQ29tbWVudG11bHRpTGluZURvY2luQ29kZUJsb2NrY29kZUJsb2NrYGBgKiAgICAgcGFyc2VDb21tZW50UmVmZXJlbmNlc0luVGV4dC8vLyAgICBjb21tZW50VG9rZW5jaDpdcmVmZXJlbmNlU3RhcnRmaW5kUmVmZXJlbmNlRW5kaXNMaW5rVGV4dGVuZENvZGVCbG9ja3BhcnNlT25lQ29tbWVudFJlZmVyZW5jZXBhcnNlT25lQ29tbWVudFJlZmVyZW5jZVJlc3RpZGVudGlmaWVyT3JPcGVyYXRvcnJpZ2h0SW5kZXhmYXN0YS5wYXJzZXIucGFyc2VyX2Vycm9yYmVnaW5PZmZzZXRmcm9tVG9rZW5zZmFzdGEucGFyc2VyLkFzc2VydGZhc3RhLnBhcnNlci5mb3JtYWxfcGFyYW1ldGVyX2tpbmRtYW5kYXRvcnlvcHRpb25hbE5hbWVkb3B0aW9uYWxQb3NpdGlvbmFsY2xhc3NPck1peGluT3JFeHRlbnNpb25EZWNsYXJhdGlvbnR5cGVWYXJpYWJsZURlY2xhcmF0aW9ucHJlZml4ZWRUeXBlUmVmZXJlbmNldHlwZVJlZmVyZW5jZXR5cGVSZWZlcmVuY2VDb250aW51YXRpb25vcGVyYXRvck5hbWVsb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25Db250aW51YXRpb25pbkxpYnJhcnlPclBhcnRPZkRlY2xhcmF0aW9uaW5TeW1ib2xpc0NvbnRpbnVhdGlvbmlzQnVpbHRJbklkZW50aWZpZXJBbGxvd2VkbG9va3NMaWtlU3RhdGVtZW50U3RhcnRmYXN0YS5wYXJzZXIubWVtYmVyX2tpbmRNZW1iZXJLaW5kLk5vblN0YXRpY0ZpZWxkTWVtYmVyS2luZC5TdGF0aWNGaWVsZE1lbWJlcktpbmQuVG9wTGV2ZWxGaWVsZEZ1bmN0aW9uVHlwZWRQYXJhbWV0ZXJHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZU5vblN0YXRpY01ldGhvZFN0YXRpY01ldGhvZE5vblN0YXRpY0ZpZWxkU3RhdGljRmllbGRUb3BMZXZlbEZpZWxkZmFzdGEucGFyc2VyLnRvcF9sZXZlbF9wYXJzZXJmYXN0YS5wYXJzZXIudXRpbGJlZm9yZUNsb3NlQnJhY2VUb2tlbkZvcnRva2VuVmFsdWVza2lwTWV0YWRhdGFzcGxpdEd0RXFzcGxpdEd0R3RzcGxpdEd0R3RFcXNwbGl0R3RGcm9tR3RHdEVxc3BsaXRHdEZyb21HdEd0R3RzcGxpdEd0RnJvbUd0R3RHdEVxc3ludGhldGljR3RmYXN0YS5zdGFja19saXN0ZW5lck51bGxWYWx1ZS5Bc051bGxWYWx1ZS5DYXNjYWRlUmVjZWl2ZXJOdWxsVmFsdWUuQ29tbWVudHNOdWxsVmFsdWUuQ29uZGl0aW9uYWxseVNlbGVjdGVkSW1wb3J0TnVsbFZhbHVlLkNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJTZXBhcmF0b3JOdWxsVmFsdWUuQ29uc3RydWN0b3JJbml0aWFsaXplcnNOdWxsVmFsdWUuQ29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNOdWxsVmFsdWUuRG9jdW1lbnRhdGlvbkNvbW1lbnROdWxsVmFsdWUuRXh0ZW5kc0NsYXVzZU51bGxWYWx1ZS5GdW5jdGlvbkJvZHlBc3luY1Rva2VuTnVsbFZhbHVlLkZ1bmN0aW9uQm9keVN0YXJUb2tlbk51bGxWYWx1ZS5Jbml0aWFsaXplcnNOdWxsVmFsdWUuUGFyYW1ldGVyRGVmYXVsdFZhbHVlTnVsbFZhbHVlLlN0cmluZ0xpdGVyYWxOdWxsVmFsdWUuVHlwZUxpc3ROdWxsVmFsdWUuVHlwZVZhcmlhYmxlTnVsbFZhbHVlLlZhckZpbmFsT3JDb25zdFRva2VuTnVsbFZhbHVlLldpdGhDbGF1c2VBc0F3YWl0VG9rZW5CcmVha1RhcmdldENhc2NhZGVSZWNlaXZlckNvbW1lbnRzQ29uZGl0aW9uYWxseVNlbGVjdGVkSW1wb3J0Q29uc3RydWN0b3JJbml0aWFsaXplclNlcGFyYXRvckNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzQ29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNDb250aW51ZVRhcmdldERlZmVycmVkRG9jdW1lbnRhdGlvbkNvbW1lbnRFeHRlbmRzQ2xhdXNlRnVuY3Rpb25Cb2R5RnVuY3Rpb25Cb2R5QXN5bmNUb2tlbkZ1bmN0aW9uQm9keVN0YXJUb2tlbkxhYmVsc01vZGlmaWVyc1BhcmFtZXRlckRlZmF1bHRWYWx1ZVByZWZpeFN3aXRjaFNjb3BlVHlwZUJ1aWxkZXJMaXN0VmFyRmluYWxPckNvbnN0VG9rZW5XaXRoQ2xhdXNlY2hlY2tWYWx1ZXN0YWNrSW5kZXhwYWRSaWdodC0tLSBmYWlsdXJlCmZpbmlzaFNpbmdsZUV4cHJlc3Npb250b2tlbk9yTnVsbHByaW50RXZlbnQKLS0tLS0tLS0tLS0tLS0tLS0tICA+PiBzdHJpbmcgaW50ZXJwb2xhdGlvblN0YWNrX2dyb3dwb3BMaXN0c3RhcnRJbmRleGFycmF5SW5kZXhQYXJzZXJSZWNvdmVyeShAVHlwZVZhcmlhYmxlR3JhcGh0eXBlUGFyYW1ldGVySW5kaWNlc2NvbGxlY3Rvcm9jY3VycmVkT2NjdXJyZW5jZUNvbGxlY3RvclZpc2l0b3J1bnJlbGF0ZWRtZWV0dXBwZXJCb3VuZHNsb3dlckJvdW5kc3R5cGVQYXJhbWV0ZXJJbmRleHR5cGVkZWZSaHNSZXN1bHRhcmd1bWVudHNSZXN1bHRhcmd1bWVudHNUb1JlcG9ydHR5cGVkZWZJbnN0YW50aWF0aW9uc2NvbnZlcnRTdXBlckJvdW5kZWRUb1JlZ3VsYXJCb3VuZGVkcmVwbGFjZWRUeXBlQXJndW1lbnRzcmVwbGFjZWRSZXR1cm5UeXBlcmVwbGFjZWRQb3NpdGlvbmFsUGFyYW1ldGVyc3JlcGxhY2VkTmFtZWRQYXJhbWV0ZXJzX3Byb3RvQ29uc3RyYWludHNfcGFyYW1ldGVyc1RvQ29uc3RyYWlucHJvdG9Db25zdHJhaW50aXNVcHBlcm9sZFByb3RvQ29uc3RyYWludHNMZW5ndGhpc01hdGNoX2lzU3VidHlwZU1hdGNoX2NvbnN0cmFpbkxvd2VyX2NvbnN0cmFpblVwcGVyX2lzRnVuY3Rpb25TdWJ0eXBlTWF0Y2hzdWJ0eXBlU3Vic3RpdHV0aW9uc3VwZXJ0eXBlU3Vic3RpdHV0aW9uZnJlc2hUeXBlVmFyaWFibGVzX21hdGNoVHlwZUZvcm1hbHNfaXNJbnRlcmZhY2VTdWJ0eXBlTWF0Y2htYXRjaGluZ1N1cGVydHlwZU9mU3VidHlwZV9pc1RvcHBhcmFtczFwYXJhbXMyc3Vic3RpdHV0aW9uMXN1YnN0aXR1dGlvbjJwRnJlc2h2YXJpYWJsZUZyZXNoYm91bmQxYm91bmQyVHlwZVNjaGVtYUNvbnN0cmFpbnRHYXRoZXJlcl9Qcm90b0NvbnN0cmFpbnRmYXN0YS5ncmFwaHByZW9yZGVyTnVtYmVyc3VuYXNzaWduZWRhc3NpZ25lZHJlY3Vyc2l2ZWx5U2VhcmNobmVpZ2hib3JQcmVvcmRlck51bWJlcmNvbnRhaW5lZFVyaWZhc3RhLmNvbmZpZ3VyYXRpb25UcmFjZVRyYWNlQW5kUmVwb3J0U3RhY2tUcmFjZUxpbmVzbWF4RmlsZUxlbmd0aG1heExpbmVOb0xlbmd0aG1heENvbHVtbk5vTGVuZ3RoZnJvbUxpbmVzZnJvbVRyYWNlcmFuZ2VTdGFydHJhbmdlRW5kZmlsZVByZWZpeGxhbWJkYWluZGV4UGF0dGVybiNcZCtccypyZXBsYWNlRmlyc3Q8YXN5bmNocm9ub3VzIHN1c3BlbnNpb24+bGVmdFBhcmVuUG9zcmlnaHRQYXJlblBvc2xhc3RDb2xvbm5leHRUb0xhc3RDb2xvbmxpbmVOb2NvbHVtbk5vPGFub255bW91cyBjbG9zdXJlPkVycm9yIHByZXR0aWZ5aW5nICIiOiBzdWJ0cmFjZXByZXR0aWZ5c2hvd0NvbHVtbk5vc2hvd0RvdHNkb3RzZmlsZUxlbmd0aCAubGluZU5vTGVuZ3RoY29sdW1uTm9MZW5ndGhTdGFja1RyYWNlTGluZWZpbGVUZXh0bGluZU5vVGV4dGNvbHVtbk5vVGV4dCBAICBbX3RyYWNldHJhY2VFeGNlcHRpb25zZXhjZXB0aW9uc3RyYWNlQW5kUmVwb3J0cmVwb3J0QW5kVHJhY2VfdHJhY2VBbmRSZXBvcnRwcmV0dGlmeVN0YWNrVHJhY2VwYWRpbnRlbmRlZExlbmd0aGRvdHNMZW5ndGhkb3RzSW5kZXhEZWJ1Z0NhbGxiYWNrYXJnMWFyZzJEZWJ1Z01hcGluZGV4U2V0Q2FsbGJhY2twdXRJZkFic2VudENhbGxiYWNrcmVtb3ZlQ2FsbGJhY2thZGRDYWxsYmFja1JLUlZjb250YWluc1ZhbHVlaWZBYnNlbnRhZGRFbnRyaWVzSzJWMnVwZGF0ZUFsbERlYnVnSXRlcmFibGVEZWJ1Z0xpc3RhZGRBbGxDYWxsYmFja2ZpbGxWYWx1ZURlYnVnU2V0TWFwVHlwZUFzc2VydGVycnVudGltZVR5cGVzc2hvd09iamVjdHN2YWx1ZXNUeXBlcyA9PiBDb2xsZWN0aW9uVHlwZUFzc2VydGVyYXNzZXJ0VHlwZUV4cGVuc2l2ZU1hcF9tYXBzY29waWVzS1JWUmV4cGVuc2l2ZShFeHBlbnNpdmVTZXRfc2V0c29iamVjdHNvYmplY3RzVG9SZW1vdmVvYmplY3RzVG9SZXRhaW5yZXRhaW5TZXRTdGF0c3JlY29yZE1hcGZyb21FeGlzdGluZ2dldE1hcHJlY29yZEVsZW1lbnRnZXRMaXN0cmVjb3JkRnJlcXVlbmN5ZXhhbXBsZXJlY29yZEZyZXF1ZW5jaWVzcmVjb3JkZWRGcmVxdWVuY2llc3JlY29yZENvdW50ZXJyZWNvcmRUcmFjZXNhbXBsZUZyZXF1ZW5jeXN0YWNrVHJhY2VTYW1wbGVGcmVxdWVuY3lkdW1wU3RhdHNiZWZvcmVDbG9zZWR1bXBDb3JyZWxhdGlvbmlkQWlkQmRhdGFBZGF0YUJTdGF0c091dHB1dERlYnVnT3V0cHV0U2lua091dHB1dFN0YXRzUHJpbnRlcmdyb3VwY3JlYXRlR3JvdXBDb250ZW50Y3JlYXRlQ2hpbGRDb250ZW50YmVnaW5FeHRyYWVuZEV4dHJhX0Jhc2VQcmludGVyJlN0YXRzUHJpbnRlciZJbmRlbnRhdGlvbkJhc2VQcmludGVyQ29uc29sZVByaW50ZXJleHRyYUxldmVsc3BhY2Vub25OdWxsVmFsdWVzWE1MUHJpbnRlcmVzY2FwZW9wZW5lZDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+X1N0YWNrVHJhY2VOb2RlY29tbW9uUHJlZml4c3VidHJhY2VzbGVhZmFkZFN1YnRyYWNlY29tbW9uUHJlZml4TGVuZ3RoZHVtcFRyYWNlc2R1bXBTdWJ0cmFjZXNzdGVwY291bnRUZXh0Li4uCl9TdGFja1RyYWNlVHJlZXRvdGFsQ291bnRzYW1wbGVBY3RpdmVTdGF0c2ZyZXF1ZW5jeU1hcHNzZXRzTWFwY291bnRlcnNNYXB0cmFjZU1hcGZyZXF1ZW5jeU1hcHN0YXRzZHVtcEZyZXF1ZW5jaWVzZHVtcFNldHNkdW1wQ291bnRlcnNkdW1wSXRlcmFibGVkYXRhTWFwZnJlcXVlbmNpZXNmcmVxdWVuY3lkdW1wRnJlcXVlbmN5c29ydGVkTWFwY291bnRlcnNkdW1wQ291bnRlcmhhc0RhdGFjYXRlZ29yeWV4YW1wbGVzTGltaXRoYXNNb3JlaW5jbHVkZUNvdW50dHJhY2VzZHVtcFRyYWNldHJlZWtleUFrZXlCY29ycmVsYXRpb25zIHZzIGFBbmRCYUFuZE5vdEJub3RBYW5kQmNvcnJlbGF0aW9uICYmICAmJiAhY2hpbGREYXRhbm9uTnVsbEl0ZXJhYmxlX3N0YXRzZW5hYmxlU3RhdHNPdXRwdXR4bWxTdGF0cyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC5pbnZlcnNlTWFwaXNWYWxpZEtleXRyeVNvcnRNYXBzb3J0TWFwVHJhY2tNYXBfY291bnRzX2NvdW50c01hcGNvdW50c3ByaW50SGlzdG9ncmFtIC0tICBtYXBzaW5jcmVtZW50YWNjdW11bGF0ZWQgIC0tICU6IGxlbmd0aCA8PSBfbm90aWZ5TGVuZ3RoQ2hhbmdlZGRhcnQyanMuanMuZW5xdWV1ZUNvZGVnZW5FbnF1ZXVlcl9wcm9jZXNzZWRFbnRpdGllc2NvZGVnZW4gZW5xdWV1ZXJDb2RlZ2VuIHdvcmsgbGlzdCBpcyBjbG9zZWQuIFRyeWluZyB0byBhZGQgY29kZWdlbi50eXBlVXNlY29kZWdlbi5keW5hbWljVXNlY29kZWdlbi5zdGF0aWNVc2Vjb2RlZ2VuLmNvbnN0YW50VXNlZGFydDJqcy5qc19lbWl0dGVyLmNvZGVfZW1pdHRlcl90YXNrc3RhcnR1cF9qc19lbWl0dGVyTmF0aXZlRW1pdHRlclR5cGVUZXN0UmVnaXN0cnl0eXBlVGVzdFJlZ2lzdHJ5X25hdGl2ZUVtaXR0ZXJfZW1pdHRlcl9nZW5lcmF0ZVNvdXJjZU1hcE5hdGl2ZUVtaXR0ZXIgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LkVtaXR0ZXIgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LkNvZGUgZW1pdHRlcl9maW5hbGl6ZVJ0aWNvbXB1dGVSZXF1aXJlZFR5cGVDaGVja3Njb21wdXRlUnRpTmVlZGVkQ2xhc3Nlc2ZpbmFsaXplIHJ0aXByb2dyYW1CdWlsZGVycnRpQ2hlY2tzcnRpTmVlZGVkQ2xhc3Nlc2VtaXRQcm9ncmFtcHJvdG90eXBlQWNjZXNzaGFzQmVlbkluc3RhbnRpYXRlZHN0YXRpY0Z1bmN0aW9uQWNjZXNzc3RhdGljRmllbGRBY2Nlc3Npc29sYXRlTGF6eUluaXRpYWxpemVyQWNjZXNzc3RhdGljQ2xvc3VyZUFjY2Vzc2NvbnN0cnVjdG9yQWNjZXNzdHlwZUFjY2Vzc3R5cGVBY2Nlc3NOZXdSdGl0eXBlVmFyaWFibGVBY2Nlc3NOZXdSdGlnbG9iYWxnZW5lcmF0ZUVtYmVkZGVkR2xvYmFsQWNjZXNzU3RyaW5ncHJvZ3JhbUZvclRlc3RpbmdpbnRlcmNlcHRvclByb3RvdHlwZUFjY2Vzc2ludGVyY2VwdG9yQ2xhc3NBY2Nlc3NnZW5lcmF0ZUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsY29tcGFyZUNvbnN0YW50c2lzQ29uc3RhbnRJbmxpbmVkT3JBbHJlYWR5RW1pdHRlZGFic3RyYWN0X3NpbmsuZGFydGFic3RyYWN0X3NvdXJjZS5kYXJ0YmluYXJ5X3NpbmsuZGFydGJpbmFyeV9zb3VyY2UuZGFydGhlbHBlcnMuZGFydG1lbWJlcl9kYXRhLmRhcnRtaXhpbnMuZGFydG5vZGVfaW5kZXhlci5kYXJ0b2JqZWN0X3NpbmsuZGFydG9iamVjdF9zb3VyY2UuZGFydERhdGFTaW5rd3JpdGVNZW1iZXJOb2Rld3JpdGVNZW1iZXJOb2Rlc3dyaXRlTWVtYmVyTm9kZU1hcHdyaXRlTGlicmFyeURlcGVuZGVuY3lOb2Rld3JpdGVMaWJyYXJ5RGVwZW5kZW5jeU5vZGVPck51bGx3cml0ZVRyZWVOb2Rld3JpdGVUcmVlTm9kZUluQ29udGV4dHdyaXRlVHJlZU5vZGVPck51bGxJbkNvbnRleHR3cml0ZVRyZWVOb2Rlc0luQ29udGV4dHdyaXRlVHJlZU5vZGVNYXBJbkNvbnRleHR3cml0ZVR5cGVQYXJhbWV0ZXJOb2Rld3JpdGVUeXBlUGFyYW1ldGVyTm9kZXN3cml0ZURhcnRUeXBlc3dyaXRlRGFydFR5cGVOb2Rld3JpdGVEYXJ0VHlwZU5vZGVzd3JpdGVTb3VyY2VTcGFud3JpdGVMaWJyYXJ5TWFwd3JpdGVMb2NhbHdyaXRlTG9jYWxPck51bGx3cml0ZUxvY2Fsc3dyaXRlQ29uc3RhbnRPck51bGx3cml0ZUNvbnN0YW50c3dyaXRlRG91YmxlVmFsdWV3cml0ZUludGVnZXJWYWx1ZXdyaXRlSW1wb3J0d3JpdGVJbXBvcnRPck51bGx3cml0ZXJpbk1lbWJlckNvbnRleHREYXRhU291cmNlcmVnaXN0ZXJMb2NhbExvb2t1cGxvY2FsTG9va3VwcmVhZExpYnJhcnlOb2RlcmVhZENsYXNzTm9kZXJlYWRUeXBlZGVmTm9kZXJlYWRNZW1iZXJOb2RlcmVhZE1lbWJlck5vZGVzcmVhZE1lbWJlck5vZGVNYXByZWFkTGlicmFyeURlcGVuZGVuY3lOb2RlcmVhZExpYnJhcnlEZXBlbmRlbmN5Tm9kZU9yTnVsbHJlYWRUcmVlTm9kZXJlYWRUcmVlTm9kZUluQ29udGV4dHJlYWRUcmVlTm9kZU9yTnVsbEluQ29udGV4dHJlYWRUcmVlTm9kZXNJbkNvbnRleHRyZWFkVHJlZU5vZGVNYXBJbkNvbnRleHRyZWFkVHlwZVBhcmFtZXRlck5vZGVyZWFkVHlwZVBhcmFtZXRlck5vZGVzcmVhZERhcnRUeXBlc3JlYWREYXJ0VHlwZU5vZGVyZWFkRGFydFR5cGVOb2Rlc3JlYWRTb3VyY2VTcGFucmVhZExpYnJhcnlNYXByZWFkTG9jYWxyZWFkTG9jYWxPck51bGxyZWFkTG9jYWxzcmVhZENvbnN0YW50T3JOdWxscmVhZERvdWJsZVZhbHVlcmVhZEludGVnZXJWYWx1ZXJlYWRDb25zdGFudHNyZWFkSW1wb3J0cmVhZEltcG9ydE9yTnVsbEVudGl0eUxvb2t1cGdldExpYnJhcnlCeUluZGV4Z2V0Q2xhc3NCeUluZGV4Z2V0VHlwZWRlZkJ5SW5kZXhnZXRNZW1iZXJCeUluZGV4Z2V0VHlwZVZhcmlhYmxlQnlJbmRleEVudGl0eVJlYWRlcnJlYWRMaWJyYXJ5RnJvbURhdGFTb3VyY2VyZWFkQ2xhc3NGcm9tRGF0YVNvdXJjZXJlYWRUeXBlZGVmRnJvbURhdGFTb3VyY2VyZWFkTWVtYmVyRnJvbURhdGFTb3VyY2VyZWFkVHlwZVZhcmlhYmxlRnJvbURhdGFTb3VyY2VFbnRpdHlXcml0ZXJ3cml0ZUxpYnJhcnlUb0RhdGFTaW5rd3JpdGVDbGFzc1RvRGF0YVNpbmtjbGFzc0luZGV4d3JpdGVUeXBlZGVmVG9EYXRhU2lua3R5cGVkZWZJbmRleHdyaXRlTWVtYmVyVG9EYXRhU2lua3dyaXRlVHlwZVZhcmlhYmxlVG9EYXRhU2lua3R5cGVWYXJpYWJsZUluZGV4TG9jYWxMb29rdXBnZXRMb2NhbEJ5SW5kZXhDb2RlZ2VuUmVhZGVyQ29kZWdlbldyaXRlckFic3RyYWN0RGF0YVNpbmtfZGFydFR5cGVXcml0ZXJfZGFydFR5cGVOb2RlV3JpdGVyX3RhZ3NfbWVtYmVyRGF0YV9zdHJpbmdJbmRleF91cmlJbmRleF9tZW1iZXJOb2RlSW5kZXhfY29uc3RhbnRJbmRleF9nZW5lcmFsQ2FjaGVzX2VudGl0eVdyaXRlcl9jb2RlZ2VuV3JpdGVydGFnRnJlcXVlbmN5TWFwX2N1cnJlbnRNZW1iZXJDb250ZXh0X2N1cnJlbnRNZW1iZXJEYXRhX2JlZ2luX2VuZGV4aXN0aW5nVGFnVW5leHBlY3RlZCB0YWcgZW5kLiBFeHBlY3RlZCAsIGZvdW5kIG9sZE1lbWJlckNvbnRleHRvbGRNZW1iZXJEYXRhY3VycmVudE1lbWJlckRhdGFEYXRhU2luayBoYXMgbm8gY3VycmVudCBtZW1iZXIgY29udGV4dC5fd3JpdGVEYXRhS2luZERhdGFLaW5kLnNvdXJjZVNwYW5fd3JpdGVVcmlfd3JpdGVJbnRJbnRlcm5hbERhdGFLaW5kLmRhcnRUeXBlX3dyaXRlRGFydFR5cGVmdW5jdGlvblR5cGVWYXJpYWJsZXNNaXNzaW5nIERhcnRUeXBlIGlzIG5vdCBhbGxvd2VkLkRhcnRUeXBlS2luZC5ub25lRGF0YUtpbmQuZGFydFR5cGVOb2RlX3dyaXRlRGFydFR5cGVOb2RlTWlzc2luZyBpci5EYXJ0VHlwZSBub2RlIGlzIG5vdCBhbGxvd2VkLkRhcnRUeXBlTm9kZUtpbmQubm9uZURhdGFLaW5kLm1lbWJlck5vZGVfd3JpdGVNZW1iZXJOb2RlX3dyaXRlTWVtYmVyTm9kZUludGVybmFsX3dyaXRlRW51bUludGVybmFsTWVtYmVyQ29udGV4dEtpbmQuY2xzX3dyaXRlQ2xhc3NOb2RlX3dyaXRlU3RyaW5nTWVtYmVyQ29udGV4dEtpbmQubGlicmFyeV93cml0ZUxpYnJhcnlOb2RlRGF0YUtpbmQuY2xhc3NOb2RlRGF0YUtpbmQudHlwZWRlZk5vZGVfd3JpdGVUeXBlZGVmTm9kZURhdGFLaW5kLmxpYnJhcnlOb2RlRGF0YUtpbmQuZW51bVZhbHVlRGF0YUtpbmQuYm9vbF93cml0ZUJvb2xEYXRhS2luZC51cmlEYXRhS2luZC5zdHJpbmdEYXRhS2luZC51aW50MzBEYXRhS2luZC50cmVlTm9kZV93cml0ZVRyZWVOb2Rld3JpdGVUcmVlTm9kZUluQ29udGV4dEludGVybmFsbWVtYmVyRGF0YV9nZXRNZW1iZXJEYXRhTm8gZW5jbG9zaW5nIG1lbWJlciBvZiBUcmVlTm9kZSBfVHJlZU5vZGVLaW5kLmNsc19UcmVlTm9kZUtpbmQubWVtYmVyX1RyZWVOb2RlS2luZC5mdW5jdGlvbkRlY2xhcmF0aW9uVmFyaWFibGVfVHJlZU5vZGVLaW5kLmZ1bmN0aW9uTm9kZV93cml0ZUZ1bmN0aW9uTm9kZV9UcmVlTm9kZUtpbmQudHlwZVBhcmFtZXRlcl93cml0ZVR5cGVQYXJhbWV0ZXJfVHJlZU5vZGVLaW5kLmNvbnN0YW50Z2V0SW5kZXhCeUNvbnN0YW50X1RyZWVOb2RlS2luZC5ub2RlZ2V0SW5kZXhCeVRyZWVOb2RlTm8gVHJlZU5vZGUgaW5kZXggZm91bmQgZm9yIGZvdW5kIGluIF9GdW5jdGlvbk5vZGVLaW5kLnByb2NlZHVyZV9GdW5jdGlvbk5vZGVLaW5kLmNvbnN0cnVjdG9yX0Z1bmN0aW9uTm9kZUtpbmQuZnVuY3Rpb25FeHByZXNzaW9uX0Z1bmN0aW9uTm9kZUtpbmQuZnVuY3Rpb25EZWNsYXJhdGlvblVuc3VwcG9ydGVkIEZ1bmN0aW9uTm9kZSBwYXJlbnQgRGF0YUtpbmQudHlwZVBhcmFtZXRlck5vZGVfVHlwZVBhcmFtZXRlcktpbmQuY2xzX1R5cGVQYXJhbWV0ZXJLaW5kLmZ1bmN0aW9uTm9kZVVuc3VwcG9ydGVkIFR5cGVQYXJhbWV0ZXIgcGFyZW50IExvY2FsS2luZC5qTG9jYWxsb2NhbEluZGV4TG9jYWxLaW5kLnRoaXNMb2NhbExvY2FsS2luZC5ib3hMb2NhbExvY2FsS2luZC5hbm9ueW1vdXNDbG9zdXJlTG9jYWxMb2NhbEtpbmQudHlwZVZhcmlhYmxlTG9jYWxVbnN1cHBvcnRlZCBsb2NhbCBEYXRhS2luZC5jb25zdGFudF93cml0ZUNvbnN0YW50RGF0YUtpbmQuZG91YmxlX3dyaXRlRG91YmxlVmFsdWVzZXRGbG9hdDY0Z2V0VWludDE2RGF0YUtpbmQuaW50X3dyaXRlQmlnSW50X3dyaXRlQ29uc3RhbnRJbnRlcm5hbENvbnN0YW50VmFsdWVLaW5kLkJPT0xDb25zdGFudFZhbHVlS2luZC5JTlRDb25zdGFudFZhbHVlS2luZC5ET1VCTEVDb25zdGFudFZhbHVlS2luZC5TVFJJTkdDb25zdGFudFZhbHVlS2luZC5OVUxMQ29uc3RhbnRWYWx1ZUtpbmQuRlVOQ1RJT05Db25zdGFudFZhbHVlS2luZC5MSVNUQ29uc3RhbnRWYWx1ZUtpbmQuU0VUQ29uc3RhbnRWYWx1ZUtpbmQuTUFQa2V5TGlzdHByb3RvVmFsdWVDb25zdGFudFZhbHVlS2luZC5DT05TVFJVQ1RFRENvbnN0YW50VmFsdWVLaW5kLlRZUEVDb25zdGFudFZhbHVlS2luZC5JTlNUQU5USUFUSU9OQ29uc3RhbnRWYWx1ZUtpbmQuTk9OX0NPTlNUQU5UQ29uc3RhbnRWYWx1ZUtpbmQuSU5URVJDRVBUT1JDb25zdGFudFZhbHVlS2luZC5ERUZFUlJFRF9HTE9CQUxyZWZlcmVuY2VkQ29uc3RhbnRWYWx1ZUtpbmQuRFVNTVlfSU5URVJDRVBUT1JDb25zdGFudFZhbHVlS2luZC5VTlJFQUNIQUJMRUNvbnN0YW50VmFsdWVLaW5kLkpTX05BTUVfd3JpdGVTdHJpbmdJbnRlcm5hbF93cml0ZVVyaUludGVybmFsRGF0YUtpbmQuaW1wb3J0X3dyaXRlSW1wb3J0X3dyaXRlSW1wb3J0SW50ZXJuYWxDYW4gbm90IHNlcmlhbGl6ZSBhbiBPdXRwdXRVbml0IHJlZmVyZW5jZSB3aXRob3V0IGEgcmVnaXN0ZXJlZCBjb2RlZ2VuIHdyaXRlci5DYW4gbm90IHNlcmlhbGl6ZSBhbiBBYnN0cmFjdFZhbHVlIHdpdGhvdXQgYSByZWdpc3RlcmVkIGNvZGVnZW4gd3JpdGVyLkNhbiBub3Qgc2VyaWFsaXplIGEgSlMgbmRvZSB3aXRob3V0IGEgcmVnaXN0ZXJlZCBjb2RlZ2VuIHdyaXRlci5BYnN0cmFjdERhdGFTb3VyY2VfZW50aXR5UmVhZGVyX2xvY2FsTG9va3VwX2NvZGVnZW5SZWFkZXJfcmVhZERhcnRUeXBlc19yZWFkRGFydFR5cGVfcmVhZERhcnRUeXBlTm9kZXNfcmVhZERhcnRUeXBlTm9kZV9jaGVja0RhdGFLaW5kX3JlYWRVcmlfcmVhZEludEludGVybmFsRGFydFR5cGVLaW5kLnZvaWRUeXBlRGFydFR5cGVLaW5kLnR5cGVWYXJpYWJsZURhcnRUeXBlS2luZC5mdW5jdGlvblR5cGVWYXJpYWJsZURhcnRUeXBlS2luZC5mdW5jdGlvblR5cGVEYXJ0VHlwZUtpbmQuaW50ZXJmYWNlVHlwZURhcnRUeXBlS2luZC50eXBlZGVmRGFydFR5cGVLaW5kLmR5bmFtaWNUeXBlRGFydFR5cGVLaW5kLmZ1dHVyZU9ydHlwZVZhcmlhYmxlQ291bnRVbmV4cGVjdGVkIERhcnRUeXBlS2luZCBEYXJ0VHlwZU5vZGVLaW5kLnZvaWRUeXBlRGFydFR5cGVOb2RlS2luZC50eXBlUGFyYW1ldGVyVHlwZURhcnRUeXBlTm9kZUtpbmQuZnVuY3Rpb25UeXBlRGFydFR5cGVOb2RlS2luZC5mdW5jdGlvblR5cGVWYXJpYWJsZURhcnRUeXBlTm9kZUtpbmQuaW50ZXJmYWNlVHlwZURhcnRUeXBlTm9kZUtpbmQudHlwZWRlZkRhcnRUeXBlTm9kZUtpbmQuZHluYW1pY1R5cGVEYXJ0VHlwZU5vZGVLaW5kLmJvdHRvbVR5cGVEYXJ0VHlwZU5vZGVLaW5kLmludmFsaWRUeXBlRGFydFR5cGVOb2RlS2luZC50aGlzSW50ZXJmYWNlVHlwZURhcnRUeXBlTm9kZUtpbmQuZXhhY3RJbnRlcmZhY2VUeXBlRGFydFR5cGVOb2RlS2luZC5kb2VzTm90Q29tcGxldGVmdW5jdGlvbi10eXBlLW5vZGVuYW1lZFBhcmFtZXRlckNvdW50X3JlYWRNZW1iZXJEYXRhX3JlYWRNZW1iZXJEYXRhSW50ZXJuYWxfcmVhZEVudW1JbnRlcm5hbF9yZWFkQ2xhc3NEYXRhX3JlYWRTdHJpbmdsb29rdXBNZW1iZXJEYXRhQnlOYW1lX3JlYWRMaWJyYXJ5RGF0YVVuc3VwcG9ydGVkIF9NZW1iZXJLaW5kIGxvb2t1cENsYXNzQnlOYW1lX3JlYWRUeXBlZGVmTm9kZWxvb2t1cFR5cGVkZWZnZXRMaWJyYXJ5RGF0YUJ5VXJpX3JlYWRVcmlJbnRlcm5hbF9yZWFkQm9vbF9yZWFkU3RyaW5nSW50ZXJuYWxfcmVhZFRyZWVOb2RlbGlicmFyeURhdGFjbGFzc0RhdGFsb29rdXBDbGFzc0J5Tm9kZWxvb2t1cE1lbWJlckRhdGFCeU5vZGVyZWFkVHJlZU5vZGVJbkNvbnRleHRJbnRlcm5hbF9yZWFkQ29uc3RhbnRfcmVhZERvdWJsZVZhbHVlc2V0VWludDE2Z2V0RmxvYXQ2NF9yZWFkQmlnSW50X3JlYWRDb25zdGFudEludGVybmFsVW5leHBleHRlZCBjb25zdGFudCB2YWx1ZSBraW5kIF9yZWFkRnVuY3Rpb25Ob2RlX3JlYWRUeXBlUGFyYW1ldGVyZ2V0Q29uc3RhbnRCeUluZGV4dHJlZU5vZGVnZXRUcmVlTm9kZUJ5SW5kZXhObyBUcmVlTm9kZSBmb3VuZCBmb3IgaW5kZXggX2Vycm9yQ29udGV4dFVuZXhwZWN0ZWQgX1RyZWVOb2RlS2luZCBmdW5jdGlvbkV4cHJlc3Npb25VbmV4cGVjdGVkIF9GdW5jdGlvbk5vZGVLaW5kIFVuZXhwZWN0ZWQgX1R5cGVQYXJhbWV0ZXJLaW5kIGtpbmQgZXhwZWN0ZWRLaW5kYWN0dWFsS2luZEludmFsaWQgZGF0YSBraW5kLiBVbmV4cGVjdGVkIGxvY2FsIGtpbmQgX3JlYWRJbXBvcnRfcmVhZEltcG9ydEludGVybmFsQ2FuIG5vdCBkZXNlcmlhbGl6ZSBhbiBPdXRwdXRVbml0IHJlZmVyZW5jZSB3aXRob3V0IGEgcmVnaXN0ZXJlZCBjb2RlZ2VuIHJlYWRlci5DYW4gbm90IGRlc2VyaWFsaXplIGFuIEFic3RyYWN0VmFsdWUgQ2FuIG5vdCBkZXNlcmlhbGl6ZSBhIEpTIG5vZGUgd2l0aG91dCBhIHJlZ2lzdGVyZWQgY29kZWdlbiByZWFkZXIuX2J1ZmZlcmVkU2lua0JpbmFyeVNvdXJjZUltcGxfcmVhZEJ5dGVJbnZhbGlkIGRhdGEga2luZCBpbmRleC4gRXhwZWN0ZWQgb25lIG9mICwgZm91bmQgaW5kZXggIE9mZnNldCBEYXRhS2luZHVpbnQzMGVudW1WYWx1ZW1lbWJlck5vZGV0eXBlUGFyYW1ldGVyTm9kZWRhcnRUeXBlTm9kZU1lbWJlckNvbnRleHRLaW5kTG9jYWxLaW5kakxvY2FsYm94TG9jYWxhbm9ueW1vdXNDbG9zdXJlTG9jYWx0eXBlVmFyaWFibGVMb2NhbF9UcmVlTm9kZUtpbmRmdW5jdGlvbkRlY2xhcmF0aW9uVmFyaWFibGVfRnVuY3Rpb25Ob2RlS2luZF9UeXBlUGFyYW1ldGVyS2luZFRhZyhEYXJ0VHlwZUtpbmR2b2lkVHlwZWZ1bmN0aW9uVHlwZVZhcmlhYmxlZnV0dXJlT3JEYXJ0VHlwZVdyaXRlcnZpc2l0VHlwZXNEYXJ0VHlwZU5vZGVLaW5kdHlwZVBhcmFtZXRlclR5cGVpbnZhbGlkVHlwZXRoaXNJbnRlcmZhY2VUeXBlZXhhY3RJbnRlcmZhY2VUeXBlZG9lc05vdENvbXBsZXRlRGFydFR5cGVOb2RlV3JpdGVyVW5leHBlY3RlZCBpci5EYXJ0VHlwZSBJbmRleGVkU2lua19jYWNoZXdyaXRlVmFsdWVDeWNsaWMgZGVwZW5kZW5jeSBvbiBjYWNoZWQgdmFsdWU6IEluZGV4ZWRTb3VyY2VyZWFkVmFsdWVVbmZpbGxlZCBpbmRleCBDb21wb25lbnRMb29rdXBfY29tcG9uZW50X2xpYnJhcnlNYXBObyBsaWJyYXJ5IGZvdW5kIGZvciBfTGlicmFyeURhdGFfY2xhc3Nlc0J5TmFtZV9jbGFzc2VzQnlOb2RlX3R5cGVkZWZzX21lbWJlcnNCeU5hbWVfbWVtYmVyc0J5Tm9kZV9lbnN1cmVDbGFzc2VzRHVwbGljYXRlIGNsYXNzICd0cnlpbmcgdG8gYWRkIER1cGxpY2F0ZSB0eXBlZGVmICdfZW5zdXJlTWVtYmVyc0R1cGxpY2F0ZSBtZW1iZXIgJ19MaWJyYXJ5RGF0YSgpKV9DbGFzc0RhdGFfQ2xhc3NEYXRhKF9NZW1iZXJEYXRhX2luZGV4VG9Ob2RlTWFwX25vZGVUb0luZGV4TWFwX2NvbnN0YW50SW5kZXhNYXBfZW5zdXJlTWFwc19jcmVhdGVDb25zdGFudEluZGV4ZXJnZXRDb25zdGFudGdldEluZGV4Tm8gaW5kZXggZm91bmQgZm9yIF9NZW1iZXJEYXRhKERhdGFTb3VyY2VNaXhpbmhhc0NsYXNzRGF0YVNpbmtNaXhpbl9UcmVlTm9kZUluZGV4ZXJWaXNpdG9yX2N1cnJlbnRJbmRleHJlZ2lzdGVyTm9kZV9Db25zdGFudE5vZGVJbmRleGVyVmlzaXRvcl92aXNpdGVkTm9uaW5kZXhlZE5vZGVzX3JlZ2lzdGVyQ29uc3RhbnQgd2l0aG91dCBpbmRleDogSW5kZXggd2l0aG91dCBjb25zdGFudDogVW5leHBlY3RlZCBjb25zdGFudDogT2JqZWN0U2lua2JlZ2luOk9iamVjdFNvdXJjZV9yZWFkIHZhbHVlLCBmb3VuZCBleHBlY3RlZFRhZ2FjdHVhbFRhZ1VuZXhwZWN0ZWQgYmVnaW4gdGFnLiBVbmV4cGVjdGVkIGVuZCB0YWcuIAo+IGZ1bmN0aW9uVHlwZU5vZGVUYWdfY29tcHV0ZU1lbWJlck5hbWVzc2FNb2R1bGFyTmFtZXJNb2R1bGFyTmFtZXJJbXBsTW9kdWxhckVtaXR0ZXJJbXBsVHlwZUV4cHJlc3Npb25SZWNpcGVTc2FGdW5jdGlvbkNvbXBpbGVyX2J1aWxkZXJvcHRpbWl6ZXJfY29kZWdlbm9wdGltaXplc291cmNlSW5mb3JtYXRpb25CdWlsZGVyX3Jld3JpdGVBc3luY2FzeW5jVHlwZVBhcmFtZXRlcmJvZHlTb3VyY2VJbmZvcm1hdGlvbmV4aXRTb3VyY2VJbmZvcm1hdGlvbl9tYWtlQXN5bmNSZXdyaXRlcl9tYWtlU3luY1N0YXJSZXdyaXRlcl9tYWtlQXN5bmNTdGFyUmV3cml0ZXJfZmV0Y2hJdGVtVHlwZWdldFR5cGVSZXByZXNlbnRhdGlvbl9mZXRjaEl0ZW1UeXBlTmV3UnRpaGVscGVyRWxlbWVudHJlY2lwZWVuY29kZUdyb3VuZFJlY2lwZSMoIylzdGFydEZ1bmN0aW9uY29tcGxldGVyRmFjdG9yeWl0ZW1UeXBlRXhwcmVzc2lvbmFzeW5jU3RhcnRhc3luY0F3YWl0YXN5bmNSZXR1cm5hc3luY1JldGhyb3djb21wbGV0ZXJGYWN0b3J5VHlwZUFyZ3VtZW50c3NhZmVWYXJpYWJsZU5hbWVzYWZlVmFyaWFibGVQcmVmaXhGb3JBc3luY1Jld3JpdGVib2R5TmFtZWRlcml2ZUFzeW5jQm9keU5hbWVpdGVyYWJsZUZhY3RvcnlpdGVyYWJsZUZhY3RvcnlUeXBlQXJndW1lbnRzeWllbGRTdGFyRXhwcmVzc2lvbnVuY2F1Z2h0RXJyb3JFeHByZXNzaW9ubmV3Q29udHJvbGxlcm5ld0NvbnRyb2xsZXJUeXBlQXJndW1lbnRzeWllbGRFeHByZXNzaW9uU3NhQnVpbGRlclNzYUJ1aWxkZXJUYXNrX3NvdXJjZUluZm9ybWF0aW9uRmFjdG9yeVNTQSBidWlsZGVyQVNTSUdOTUVOVEJJVF9PUkJJVF9YT1JCSVRfQU5ETEVGVF9IQU5EX1NJREVkYXJ0MmpzLmNvbnN0YW50cy52YWx1ZXNDb25zdGFudFZhbHVlS2luZElOVEVSQ0VQVE9SSlNfTkFNRURVTU1ZX0lOVEVSQ0VQVE9SVU5SRUFDSEFCTEVERUZFUlJFRF9HTE9CQUxOT05fQ09OU1RBTlRDb25zdGFudFZhbHVlVmlzaXRvcnZpc2l0RHVtbXlJbnRlcmNlcHRvcnZpc2l0VW5yZWFjaGFibGV2aXNpdEpzTmFtZXZpc2l0RGVmZXJyZWRHbG9iYWx2aXNpdE5vbkNvbnN0YW50aXNDb25zdHJ1Y3RlZE9iamVjdGlzVHlwZWlzRHVtbXlpc01pbnVzWmVyb2lzT25laXNQb3NpdGl2ZUluZmluaXR5aXNOZWdhdGl2ZUluZmluaXR5VXNlIENvbnN0YW50VmFsdWUudG9EYXJ0VGV4dCgpIG9yIENvbnN0YW50VmFsdWUudG9TdHJ1Y3R1cmVkVGV4dCgpIGluc3RlYWQgb2YgQ29uc3RhbnRWYWx1ZS50b1N0cmluZygpLkZ1bmN0aW9uQ29uc3RhbnRWYWx1ZTIxNDc0ODM2NDdGdW5jdGlvbkNvbnN0YW50KFByaW1pdGl2ZUNvbnN0YW50Lj09UHJpbWl0aXZlQ29uc3RhbnQuaGFzaENvZGVOdWxsQ29uc3RhbnRWYWx1ZUpzTnVsbE51bUNvbnN0YW50VmFsdWVJbnRDb25zdGFudFZhbHVlX2NhY2hlZFZhbHVlc2ludENvbnN0YW50VmFsaXNQb3NpdGl2ZW90aGVySW50SW50Q29uc3RhbnQoRG91YmxlQ29uc3RhbnRWYWx1ZU5hTkluZmluaXR5LUluZmluaXR5MC4wMS4wb3RoZXJEb3VibGVEb3VibGVDb25zdGFudChCb29sQ29uc3RhbnRWYWx1ZUJvb2xDb25zdGFudChUcnVlQ29uc3RhbnRWYWx1ZUZhbHNlQ29uc3RhbnRWYWx1ZVN0cmluZ0NvbnN0YW50VmFsdWVvdGhlclN0cmluZ3RvRGFydFN0cmluZ1N0cmluZ0NvbnN0YW50KE9iamVjdENvbnN0YW50VmFsdWVfdW5wYXJzZVR5cGVBcmd1bWVudHNUeXBlQ29uc3RhbnQoTGlzdENvbnN0YW50VmFsdWVMaXN0Q29uc3RhbnQoU2V0Q29uc3RhbnRWYWx1ZW90aGVyU2V0U2V0Q29uc3RhbnQofSlNYXBDb25zdGFudFZhbHVlX2xvb2t1cE1hcG90aGVyTWFwbG9va3VwTWFwTWFwQ29uc3RhbnQoaW50ZXJjZXB0b3IoSW50ZXJjZXB0b3JDb25zdGFudChKc05hbWVDb25zdGFudFZhbHVlanNfbmFtZShKc05hbWVDb25zdGFudChEdW1teUludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZWR1bW15X2ludGVyY2VwdG9yKER1bW15SW50ZXJjZXB0b3JDb25zdGFudChVbnJlYWNoYWJsZUNvbnN0YW50VmFsdWV1bnJlYWNoYWJsZSgpVW5yZWFjaGFibGVDb25zdGFudCgpb3RoZXJWYXJfZmllbGRzU29ydGVkQnlOYW1lQ29uc3RydWN0ZWRDb25zdGFudChJbnN0YW50aWF0aW9uQ29uc3RhbnQoaXNSZWZlcmVuY2VkZWZlcnJlZF9nbG9iYWwoRGVmZXJyZWRHbG9iYWxDb25zdGFudChOb25Db25zdGFudFZhbHVlTm9uQ29uc3RhbnQ+Pm5vbi1jb25zdGFudDw8dHJlYXRBc0R5bmFtaWNpc0Z1bmN0aW9uVHlwZVZhcmlhYmxlY29udGFpbnNGcmVlVHlwZVZhcmlhYmxlc19jb250YWluc0ZyZWVUeXBlVmFyaWFibGVzZm9yRWFjaFR5cGVWYXJpYWJsZWFzc3VtcHRpb25zYmluZGluZ3NfQXNzdW1wdGlvbnNfYXNzdW1wdGlvbk1hcF9hZGRBc3N1bXB0aW9uYXNzdW1lX3JlbW92ZUFzc3VtcHRpb25mb3JnZXRpc0Fzc3VtZWRfQXNzdW1wdGlvbnMoKS0+YXJndW1lbnRIYXNoX2VxdWFsc0ludGVybmFsbmV3VW5hbGlhc2VkVHlwZVZhcmlhYmxlVHlwZUZ1bmN0aW9uVHlwZVZhcmlhYmxlX2JvdW5kQm91bmQgaGFzbid0IGJlZW4gc2V0LkJvdW5kIGhhcyBhbHJlYWR5IGJlZW4gc2V0LkludmFsaWQgcmV0dXJuIHR5cGUgaW4gSW52YWxpZCBwYXJhbWV0ZXIgdHlwZXMgaW4gSW52YWxpZCBvcHRpb25hbCBwYXJhbWV0ZXIgdHlwZXMgaW4gSW52YWxpZCBuYW1lZCBwYXJhbWV0ZXJzIGluIEludmFsaWQgbmFtZWQgcGFyYW1ldGVyIHR5cGVzIGluIEludmFsaWQgdHlwZSB2YXJpYWJsZXMgaW4gcmVzdG9yZWhhc0ZyZWVuZXdQYXJhbWV0ZXJUeXBlc25ld09wdGlvbmFsUGFyYW1ldGVyVHlwZXNuZXdOYW1lZFBhcmFtZXRlclR5cGVzbmV3VHlwZVZhcmlhYmxlc25ld0JvdW5kbmVlZHNPcHRpb25hbENvbW1hbmVlZHNOYW1lZENvbW1hRnV0dXJlT3JUeXBlbmV3VHlwZUFyZ3VtZW50QmFzZURhcnRUeXBlVmlzaXRvckFic3RyYWN0VHlwZVJlbGF0aW9uZW5zdXJlUmVzb2x2ZWRnZXRVbmFsaWFzZWRhc0luc3RhbmNlT2ZnZXRDYWxsVHlwZWludGVybmFsIGVycm9yOiB1bmtub3duIHR5cGUgaW52YWxpZFR5cGVBcmd1bWVudHNpbnZhbGlkRnVuY3Rpb25SZXR1cm5UeXBlc2ludmFsaWRGdW5jdGlvblBhcmFtZXRlclR5cGVzaW52YWxpZFR5cGVWYXJpYWJsZUJvdW5kc2ludmFsaWRDYWxsYWJsZVR5cGVjaGVja1R5cGVBcmd1bWVudHN0VHlwZUFyZ3NzVHlwZUFyZ3N0ZnNmZ2V0Q29tbW9uVHlwZVZhcmlhYmxlc0NvdW50dmlzaXRGdW5jdGlvblR5cGVJbnRlcm5hbHRwc3Nwc3NOb3RFbXB0eXROb3RFbXB0eXROZXh0c05leHRpbmNvbXBhdGlibGVQYXJhbWV0ZXJzdE5hbWVzdFR5cGVzc05hbWVzc1R5cGVzdEluZGV4c0luZGV4c2VlblR5cGVWYXJpYWJsZXNNb3JlU3BlY2lmaWNWaXNpdG9yU3VidHlwZVZpc2l0b3JzRnV0dXJlT3J0SW50ZXJmYWNlUG90ZW50aWFsU3VidHlwZVZpc2l0b3JfYXNzdW1lSW5zdGFudGlhdGlvbnNpc1BvdGVudGlhbFN1YnR5cGVhc3N1bWVJbnN0YW50aWF0aW9uc0RhcnRUeXBlc0lTX1NVQlRZUEVNQVlCRV9TVUJUWVBFTk9UX1NVQlRZUEVjb21wdXRlU3VidHlwZVJlbGF0aW9uc3Vic3RCeUNvbnRleHRnZXRTdXBlcnR5cGVnZXRJbnRlcmZhY2VzY2hlY2tUeXBlVmFyaWFibGVCb3VuZHNjaGVja1R5cGVWYXJpYWJsZUJvdW5kZ2V0Q2xhc3NDb250ZXh0Y29udGV4dENsYXNzX3N1YnN0VHlwZXNfZXF1YWxUeXBlc0RhcnQySlNKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0bW9uaXRvcm91dEJ1ZmZlcmNvZGVQb3NpdGlvbkxpc3RlbmVyb25TdGFydFBvc2l0aW9uY2xvc2luZ1Bvc2l0aW9ub25Qb3NpdGlvbnNBc3RDb250YWluZXJUb2tlbkZpbmFsaXplcmZpbmFsaXplVG9rZW5zVG9rZW5Db3VudGVydmlzaXROb2RlbWFya1NlZW5jb3VudFRva2Vuc1JlZmVyZW5jZUNvdW50ZWRBc3ROb2RlVW5wYXJzZWROb2RlX2VuYWJsZU1pbmlmaWNhdGlvbl9wcm90ZWN0Rm9yRXZhbF9jYWNoZWRMaXRlcmFsZnVuY3Rpb24gZXNjYXBlZFN0cmluZ3ByZXR0eVByaW50YWxsb3dWYXJpYWJsZU1pbmlmaWNhdGlvbnJlbmFtZXJGb3JOYW1lc3Nob3VsZENvbXByZXNzT3V0cHV0bWluaWZ5TG9jYWxWYXJpYWJsZXNjcmVhdGVDb2RlQnVmZmVyc291cmNlSW5mb3JtYXRpb25Qcm9jZXNzb3JjcmVhdGVQcm9jZXNzb3Jwcm9jZXNzaXNJZGVudGl0eVRlbXBsYXRlaXNOdWxsR3VhcmRPbkZpcnN0QXJndW1lbnRob2xlbmFtZU9yUG9zaXRpb25qc19iYWNrZW5kLm5hbWVySGFzaE1hcFJ1bnRpbWVUeXBlVGFnc0pHZW5lcmF0b3JCb2R5ZmllbGRfbmFtaW5nX21peGluLmRhcnRmcmVxdWVuY3lfbmFtZXIuZGFydG1pbmlmeV9uYW1lci5kYXJ0bmFtZXJfbmFtZXMuZGFydGphdmFTY3JpcHRLZXl3b3Jkc2luc3RhbmNlb2Z0eXBlb2ZkZWJ1Z2dlcmRlbGV0ZXB1YmxpY3Byb3RlY3RlZHJlc2VydmVkUHJvcGVydHlTeW1ib2xzX19wcm90b19fcHJvdG90eXBlcmVzZXJ2ZWRHbG9iYWxTeW1ib2xzdW5kZWZpbmVkcGFyc2VJbnRwYXJzZUZsb2F0ZGVjb2RlVVJJZGVjb2RlVVJJQ29tcG9uZW50ZW5jb2RlVVJJZW5jb2RlVVJJQ29tcG9uZW50QXJyYXlCb29sZWFuTnVtYmVyRGF0ZVJlZ0V4cEV2YWxFcnJvclJhbmdlRXJyb3JSZWZlcmVuY2VFcnJvclN5bnRheEVycm9yVVJJRXJyb3JNYXRoYXBwbGljYXRpb25DYWNoZWNsb3NlZENvbXBvbmVudHNjb250cm9sbGVyc2NyeXB0b2RlZmF1bHRTdGF0dXNkaWFsb2dBcmd1bWVudHNkaXJlY3Rvcmllc2RvY3VtZW50ZnJhbWVFbGVtZW50ZnVsbFNjcmVlbmdsb2JhbFN0b3JhZ2VoaXN0b3J5aW5uZXJIZWlnaHRpbm5lcldpZHRobG9jYXRpb25iYXJsb2NhbFN0b3JhZ2VtZW51YmFybW96SW5uZXJTY3JlZW5YbW96SW5uZXJTY3JlZW5ZbW96U2NyZWVuUGl4ZWxzUGVyQ3NzUGl4ZWxuYXZpZ2F0b3JvcGVuZXJvdXRlckhlaWdodG91dGVyV2lkdGhwYWdlWE9mZnNldHBhZ2VZT2Zmc2V0cGVyc29uYWxiYXJwa2NzMTFyZXR1cm5WYWx1ZXNjcmVlbnNjcm9sbGJhcnNzY3JvbGxNYXhYc2Nyb2xsTWF4WXNlc3Npb25TdG9yYWdlc2lkZWJhcnN0YXR1c2JhcnRvb2xiYXJ3aW5kb3dhbGVydGFkZEV2ZW50TGlzdGVuZXJhdG9iYmFja2JsdXJidG9hY2FwdHVyZUV2ZW50c2NsZWFySW50ZXJ2YWxjbGVhclRpbWVvdXRjb25maXJtZGlzYWJsZUV4dGVybmFsQ2FwdHVyZWRpc3BhdGNoRXZlbnRlbmFibGVFeHRlcm5hbENhcHR1cmVmaW5kZm9jdXNmb3J3YXJkR2Vja29BY3RpdmVYT2JqZWN0Z2V0QXR0ZW50aW9uZ2V0QXR0ZW50aW9uV2l0aEN5Y2xlQ291bnRnZXRDb21wdXRlZFN0eWxlZ2V0U2VsZWN0aW9uaG9tZW1heGltaXplbWluaW1pemVtb3ZlQnltb3ZlVG9vcGVuRGlhbG9ncG9zdE1lc3NhZ2VwcmludHByb21wdFF1ZXJ5SW50ZXJmYWNlcmVsZWFzZUV2ZW50c3JlbW92ZUV2ZW50TGlzdGVuZXJyZXNpemVCeXJlc2l6ZVRvcm91dGVFdmVudHNjcm9sbHNjcm9sbEJ5c2Nyb2xsQnlMaW5lc3Njcm9sbEJ5UGFnZXNzY3JvbGxUb3NldEludGVydmFsc2V0UmVzaXplYWJsZXNldFRpbWVvdXRzaG93TW9kYWxEaWFsb2dzaXplVG9Db250ZW50dXVlc2NhcGV1cGRhdGVDb21tYW5kc1hQQ05hdGl2ZVdyYXBwZXJYUENTYWZlSlNPamJlY3RXcmFwcGVyb25hYm9ydG9uYmVmb3JldW5sb2Fkb25jaGFuZ2VvbmNsaWNrb25jbG9zZW9uY29udGV4dG1lbnVvbmRyYWdkcm9wb25lcnJvcm9uZm9jdXNvbmhhc2hjaGFuZ2VvbmtleWRvd25vbmtleXByZXNzb25rZXl1cG9ubG9hZG9ubW91c2Vkb3dub25tb3VzZW1vdmVvbm1vdXNlb3V0b25tb3VzZW92ZXJvbm1vdXNldXBvbm1vem9yaWVudGF0aW9ub25wYWludG9ucmVzZXRvbnJlc2l6ZW9uc2Nyb2xsb25zZWxlY3RvbnN1Ym1pdG9udW5sb2Fkb250b3VjaGNhbmNlbG9udG91Y2hlbmRvbnRvdWNobW92ZW9udG91Y2hzdGFydG9uZ2VzdHVyZXN0YXJ0b25nZXN0dXJlY2hhbmdlb25nZXN0dXJlZW5kdW5ldmFsZ2V0UHJvdG90eXBlT2ZhdHRhY2hFdmVudGNsaWVudEluZm9ybWF0aW9uY2xpcGJvYXJkRGF0YWNyZWF0ZVBvcHVwZGlhbG9nSGVpZ2h0ZGlhbG9nTGVmdGRpYWxvZ1RvcGRpYWxvZ1dpZHRob25hZnRlcnByaW50b25iZWZvcmVkZWFjdGl2YXRlb25iZWZvcmVwcmludG9uY29udHJvbHNlbGVjdG9uZGVhY3RpdmF0ZW9uaGVscG9ucmVzaXplZW5kRGVidWdFbnVtZXJhdG9yR2xvYmFsSW1hZ2VBY3RpdmVYT2JqZWN0VkJBcnJheUFuY2hvckFwcGxldEF0dHJDYW52YXNDYW52YXNHcmFkaWVudENhbnZhc1BhdHRlcm5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkRDREFUQVNlY3Rpb25DaGFyYWN0ZXJEYXRhQ29tbWVudENTUzJQcm9wZXJ0aWVzQ1NTUnVsZUNTU1N0eWxlU2hlZXREb2N1bWVudERvY3VtZW50RnJhZ21lbnREb2N1bWVudFR5cGVET01FeGNlcHRpb25ET01JbXBsZW1lbnRhdGlvbkRPTVBhcnNlckVsZW1lbnRFdmVudEV4dGVybmFsSW50ZXJmYWNlRmxhc2hQbGF5ZXJGb3JtRnJhbWVIaXN0b3J5SFRNTENvbGxlY3Rpb25IVE1MRG9jdW1lbnRIVE1MRWxlbWVudElGcmFtZUpTT2JqZWN0S2V5RXZlbnRNaW1lVHlwZU1vdXNlRXZlbnROYXZpZ2F0b3JOb2RlTGlzdFBsdWdpblByb2Nlc3NpbmdJbnN0cnVjdGlvblJhbmdlUmFuZ2VFeGNlcHRpb25TY3JlZW5TZWxlY3RUYWJsZVRhYmxlQ2VsbFRhYmxlUm93VGFibGVTZWxlY3Rpb25UZXh0VGV4dEFyZWFVSUV2ZW50V2luZG93WE1MSHR0cFJlcXVlc3RYTUxTZXJpYWxpemVyWFBhdGhFeGNlcHRpb25YUGF0aFJlc3VsdFhTTFRQcm9jZXNzb3JqYXZhbmV0c2NhcGVzdW5KYXZhT2JqZWN0SmF2YUNsYXNzSmF2YUFycmF5SmF2YU1lbWJlcnJlc2VydmVkR2xvYmFsT2JqZWN0TmFtZXNERkdIT1FXWFlacmVzZXJ2ZWRHbG9iYWxIZWxwZXJGdW5jdGlvbnN1c2VyR2xvYmFsT2JqZWN0c19qc1Jlc2VydmVkbGF6eUdldHRlclByZWZpeCRnZXQkc3VwZXJQcmVmaXhzdXBlciRtZXRhZGF0YUZpZWxkc3R1Yk5hbWVGaWVsZCRzdHViTmFtZXJlZmxlY3Rpb25JbmZvRmllbGQkcmVmbGVjdGlvbkluZm9yZWZsZWN0aW9uTmFtZUZpZWxkJHJlZmxlY3Rpb25OYW1lbWV0YWRhdGFJbmRleEZpZWxkJG1ldGFkYXRhSW5kZXhtZXRob2RzV2l0aE9wdGlvbmFsQXJndW1lbnRzRmllbGQkbWV0aG9kc1dpdGhPcHRpb25hbEFyZ3VtZW50c19jYWxsUHJlZml4RG9sbGFyY2FsbCRfbGl0ZXJhbERvbGxhcl9saXRlcmFsVW5kZXJzY29yZWxpdGVyYWxQbHVzX2xpdGVyYWxEeW5hbWljX2xpdGVyYWxHZXR0ZXJQcmVmaXhfbGl0ZXJhbFNldHRlclByZWZpeF9zdGF0aWNzUHJvcGVydHlOYW1lX3J0aUZpZWxkSnNOYW1lbmF0aXZlU3BlY1Byb3BlcnR5XltBLVphLXpfJF1bQS1aYS16MC05XyRdKiROT05fSURFTlRJRklFUl9DSEFSW15BLVphLXpfMC05JF1nbG9iYWxTY29wZXVzZXJHbG9iYWxzdXNlckdsb2JhbHNTZWNvbmROYW1laW50ZXJuYWxHbG9iYWxzaW5zdGFuY2VTY29wZXVzZXJJbnN0YW5jZU1lbWJlcnN1c2VySW5zdGFuY2VNZW1iZXJzT3JpZ2luYWxOYW1laW50ZXJuYWxJbnN0YW5jZU1lbWJlcnN1c2VySW5zdGFuY2VPcGVyYXRvcnN1c2VyR2V0dGVyc3VzZXJTZXR0ZXJzX3R5cGVWYXJpYWJsZU5hbWVzX2NvbnN0YW50U2NvcGVfcHJpdmF0ZU5hbWluZ1Njb3Blc3BvcHVsYXJOYW1lQ291bnRlcnNsaWJyYXJ5TG9uZ05hbWVzX2NvbnN0YW50TmFtZXNfY29uc3RhbnRMb25nTmFtZXNfY29uc3RhbnRIYXNoZXJzaG9ydFByaXZhdGVOYW1lT3duZXJzX2xpYnJhcnlLZXlzX25vbklkZW50aWZpZXJSRVteQS1aYS16MC05XyRdZnVuY3Rpb25UeXBlTmFtZU1hcF9mdW5jdGlvblR5cGVOYW1lcmpzUmVzZXJ2ZWRzdGF0aWNzUHJvcGVydHlOYW1lcnRpTmFtZV9yZWdpc3Rlck5hbWVqc05hbWVvcmlnaW5hbE5hbWVpc0ZpbmFsaXplZGdldHRlck5hbWVzZXR0ZXJOYW1lY3JlYXRlTWluaWZpZWRHbG9iYWxOYW1lTWFwY3JlYXRlTWluaWZpZWRJbnN0YW5jZU5hbWVNYXBfbmF0aXZlRGF0YWRlZmVycmVkTWV0YWRhdGFOYW1lZGVmZXJyZWRNZXRhZGF0YWRlZmVycmVkVHlwZXNOYW1lZGVmZXJyZWRUeXBlc2lzb2xhdGVOYW1laXNvbGF0ZVByb3BlcnRpZXNOYW1lJGlzb2xhdGVQcm9wZXJ0aWVzU1RBVElDX0NMT1NVUkVfTkFNRV9OQU1FJG5hbWVjbG9zdXJlSW52b2NhdGlvblNlbGVjdG9yTmFtZXNob3VsZE1pbmlmeV9nZXRQcml2YXRlU2NvcGVGb3Jyb290T2ZTY29wZV9uZXdSZWZlcmVuY2Vjb25zdGFudE5hbWVsb25nTmFtZWNvbnN0YW50TG9uZ05hbWVnZXRGcmVzaE5hbWVwcml2YXRlTmFtZV9wcm9wb3NlTmFtZUZvckxpYnJhcnlfcHJvcG9zZU5hbWVGb3JDb25zdHJ1Y3RvckJvZHljYWxsU3VmZml4Rm9yU2lnbmF0dXJlY29uc3RydWN0b3JCb2R5TmFtZWN0b3JfZGlzYW1iaWd1YXRlSW50ZXJuYWxNZW1iZXJnZW5lcmF0b3JCb2R5SW5zdGFuY2VNZXRob2ROYW1lb3BlcmF0b3JOYW1lVG9JZGVudGlmaWVyJGJvZHkkZGVyaXZlQ2FsbE1ldGhvZE5hbWVjYWxsUHJlZml4Y2FsbFN1ZmZpeEZvclN0cnVjdHVyZXN1ZmZpeGVzZGlzYW1iaWd1YXRlZE5hbWVfZGlzYW1iaWd1YXRlTWVtYmVyZGVyaXZlR2V0dGVyTmFtZWRlcml2ZVNldHRlck5hbWVvcGVyYXRvcklkZW50aWZpZXJfZGlzYW1iaWd1YXRlT3BlcmF0b3JzcGVjaWFsU2VsZWN0b3JOYW1lVW5leHBlY3RlZCBzZWxlY3RvciBraW5kOiBnZW5lcmljSW5zdGFudGlhdGlvblByZWZpeFVuZXhwZWN0ZWQgc3BlY2lhbCBzZWxlY3RvcjogaW52b2NhdGlvbk1pcnJvckludGVybmFsTmFtZWZpZWxkQWNjZXNzb3JOYW1lX2Rpc2FtYmlndWF0ZUdsb2JhbE1lbWJlcmZpZWxkUHJvcGVydHlOYW1lX2Rpc2FtYmlndWF0ZUdsb2JhbFR5cGVfZ2xvYmFsTmFtZUZvckludGVyZmFjZVR5cGVWYXJpYWJsZWhhc0ZpeGVkQmFja2VuZE5hbWVnZXRGaXhlZEJhY2tlbmROYW1lZGVjbGFyZWROYW1lX2lzU2hhZG93aW5nU3VwZXJGaWVsZF9pc1VzZXJDbGFzc0V4dGVuZGluZ05hdGl2ZWZpZWxkTmFtZW1lbWJlckxpYnJhcnlmb3VuZE1lbWJlcmlzTmF0aXZlT3JFeHRlbmRzTmF0aXZlc2V0dGVyRm9yTWVtYmVyZ2V0dGVyRm9yRWxlbWVudGdldHRlckZvck1lbWJlcl9kaXNhbWJpZ3VhdGVJbnRlcm5hbEdsb2JhbG5ld05hbWVpbnRlcm5hbEdsb2JhbF9nZW5lcmF0ZUxpYnJhcnlLZXlrZXlCYXNlX2Rpc2FtYmlndWF0ZUdsb2JhbF9wcm9wb3NlTmFtZUZvck1lbWJlcl9wcm9wb3NlTmFtZUZvclR5cGVnbG9iYWxzbGlicmFyeUtleXNhbml0aXplRm9yQW5ub3RhdGlvbnNfZGlzYW1iaWd1YXRlTWVtYmVyQnlLZXlyZXNlcnZlUHVibGljTWVtYmVyTmFtZWxpYnJhcnlQcmVmaXhpc1VzZWRyZWdpc3RlclVzZXNhbml0aXplRm9yTmF0aXZlc21heUNsYXNoTmF0aXZlX2dlbmVyYXRlRnJlc2hTdHJpbmdGb3JOYW1lX3Nhbml0aXplRm9yQW5ub3RhdGlvbnNfc2FuaXRpemVGb3JOYXRpdmVzX3Nhbml0aXplRm9yS2V5d29yZHNpc1VudXNlZF9wcm9wb3NlTmFtZUZvckNvbnN0cnVjdG9yJGJvZHlfcHJvcG9zZU5hbWVGb3JMYXp5U3RhdGljR2V0dGVycmVwbGFjZXJyZXBsYWNlQWxsTWFwcGVkbGliX2Rpc2FtYmlndWF0ZWRfZ2V0U3VmZml4Rm9ySW50ZXJjZXB0ZWRDbGFzc2VzemdldEludGVyY2VwdG9yJF9pc1Byb3BlcnR5T2ZTdGF0aWNTdGF0ZUhvbGRlcnN0YXRpY1N0YXRlSG9sZGVyJGNsb3N1cmV1bmlxdWVOYW1lRm9yVHlwZUNvbnN0YW50RWxlbWVudGdsb2JhbE9iamVjdEZvckNvbnN0YW50JGluc3RhbnRpYXRldHlwZXNPZmZzZXROYW1ldHlwZXNPZmZzZXRnZXRGdW5jdGlvblR5cGVOYW1lY29tcHV0ZU5hbWVvcGVyYXRvcklzUHJlZml4b3BlcmF0b3JBc1ByZWZpeCRlcSRub3QkaW5kZXgkaW5kZXhTZXQkbXVsJGRpdiRtb2QkdGRpdiRhZGQkc2hsJHNociRzaHJ1JGdlJGxlJGFuZCR4b3Ikb3IkbmVnYXRlZ2V0VHlwZVJlcHJlc2VudGF0aW9uRm9yVHlwZUNvbnN0YW50KCktPkNvbnN0YW50TmFtaW5nVmlzaXRvck1BWF9GUkFHTUVOVFNNQVhfRVhUUkFfTEVOR1RIREVGQVVMVF9UQUdfTEVOR1RIX2hhc2hlcmZhaWxlZGZyYWdtZW50c192aXNpdENPTlNUQU5UZ2V0SGFzaFRhZ0NfaGFzaFdvcmRnZXRIYXNoMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphZGRSb290YWRkSWRlbnRpZmllcmlzRWxpZGVkbWV0aG9kc2R1bW15X2ludGVyY2VwdG9ydW5yZWFjaGFibGVDb25zdGFudENhbm9uaWNhbEhhc2hlcl9NQVNLX1VJTlQzMl9MSU1JVDQyOTQ5NjcyOTZfaGFzaGVzX2hhc2hTdHJpbmdfaGFzaExpc3REdW1teUludGVyY2VwdG9yQ29uc3RhbnRWYWx1ZSBzaG91bGQgbmV2ZXIgYmUgbmFtZWQgYW5kIG5ldmVyIGJlIHN1YmNvbnN0YW50VW5yZWFjaGFibGVDb25zdGFudFZhbHVlIHNob3VsZCBuZXZlciBiZSBuYW1lZCBhbmQgSnNOYW1lQ29uc3RhbnRWYWx1ZSBzaG91bGQgbmV2ZXIgYmUgbmFtZWQgYW5kIF9oYXNoSW50X2hhc2hEb3VibGVtYWduaXR1ZGVzaWduZnJhY3Rpb25fY29tYmluZUZ1bmN0aW9uVHlwZU5hbWVyX2lzU2ltcGxlRnVuY3Rpb25UeXBlTmFtaW5nU2NvcGVfc3VnZ2VzdGVkTmFtZXNfdXNlZE5hbWVzc3VnZ2VzdE5hbWVhZGRTdWdnZXN0aW9uc3VnZ2VzdGlvbmhhc1N1Z2dlc3Rpb25pc1N1Z2dlc3Rpb25GaXhlZE5hbWVzZ2V0JHNldCRjYWxsQ2F0Y2hBbGxOYW1lY2FsbCpjYWxsTmFtZUZpZWxkJGNhbGxOYW1lcmVmbGVjdGFibGVGaWVsZCRyZWZsZWN0YWJsZWNsYXNzRGVzY3JpcHRvclByb3BlcnR5ZGVmYXVsdFZhbHVlc0ZpZWxkJGRlZmF1bHRWYWx1ZXNkZWZlcnJlZEFjdGlvbiRkZWZlcnJlZEFjdGlvbiRpcyRhc29wZXJhdG9yU2lnbmF0dXJlJHNpZ25hdHVyZXJlcXVpcmVkUGFyYW1ldGVyRmllbGQkcmVxdWlyZWRBcmdDb3VudCR0aU1pbmlmaWVkRml4ZWROYW1lc2FzeW5jUHJlZml4JGFzeW5jJF9saXRlcmFsQXN5bmNQcmVmaXhfanNWYXJpYWJsZVJlc2VydmVkQ2FjaGVicmVha0xhYmVsTmFtZWltcGxpY2l0QnJlYWtMYWJlbE5hbWVjb250aW51ZUxhYmVsTmFtZWMkaW1wbGljaXRDb250aW51ZUxhYmVsTmFtZV9qc1ZhcmlhYmxlUmVzZXJ2ZWRnZXROYW1lRm9ySnNHZXROYW1lSnNHZXROYW1lLkdFVFRFUl9QUkVGSVhKc0dldE5hbWUuU0VUVEVSX1BSRUZJWEpzR2V0TmFtZS5DQUxMX1BSRUZJWEpzR2V0TmFtZS5DQUxMX1BSRUZJWDBKc0dldE5hbWUuQ0FMTF9QUkVGSVgxSnNHZXROYW1lLkNBTExfUFJFRklYMkpzR2V0TmFtZS5DQUxMX1BSRUZJWDNKc0dldE5hbWUuQ0FMTF9QUkVGSVg0SnNHZXROYW1lLkNBTExfUFJFRklYNUpzR2V0TmFtZS5DQUxMX0NBVENIX0FMTEpzR2V0TmFtZS5SRUZMRUNUQUJMRUpzR2V0TmFtZS5DTEFTU19ERVNDUklQVE9SX1BST1BFUlRZSnNHZXROYW1lLlJFUVVJUkVEX1BBUkFNRVRFUl9QUk9QRVJUWUpzR2V0TmFtZS5ERUZBVUxUX1ZBTFVFU19QUk9QRVJUWUpzR2V0TmFtZS5DQUxMX05BTUVfUFJPUEVSVFlKc0dldE5hbWUuREVGRVJSRURfQUNUSU9OX1BST1BFUlRZSnNHZXROYW1lLk9QRVJBVE9SX0FTX1BSRUZJWEpzR2V0TmFtZS5TSUdOQVRVUkVfTkFNRUpzR2V0TmFtZS5SVElfTkFNRUpzR2V0TmFtZS5UWVBFREVGX1RBR3R5cGVkZWZUYWdKc0dldE5hbWUuRlVOQ1RJT05fVFlQRV9UQUdmdW5jdGlvblR5cGVUYWdKc0dldE5hbWUuRlVOQ1RJT05fVFlQRV9HRU5FUklDX0JPVU5EU19UQUdmdW5jdGlvblR5cGVHZW5lcmljQm91bmRzVGFnSnNHZXROYW1lLkZVTkNUSU9OX1RZUEVfVk9JRF9SRVRVUk5fVEFHZnVuY3Rpb25UeXBlVm9pZFJldHVyblRhZ0pzR2V0TmFtZS5GVU5DVElPTl9UWVBFX1JFVFVSTl9UWVBFX1RBR2Z1bmN0aW9uVHlwZVJldHVyblR5cGVUYWdKc0dldE5hbWUuRlVOQ1RJT05fVFlQRV9SRVFVSVJFRF9QQVJBTUVURVJTX1RBR2Z1bmN0aW9uVHlwZVJlcXVpcmVkUGFyYW1ldGVyc1RhZ0pzR2V0TmFtZS5GVU5DVElPTl9UWVBFX09QVElPTkFMX1BBUkFNRVRFUlNfVEFHZnVuY3Rpb25UeXBlT3B0aW9uYWxQYXJhbWV0ZXJzVGFnSnNHZXROYW1lLkZVTkNUSU9OX1RZUEVfTkFNRURfUEFSQU1FVEVSU19UQUdmdW5jdGlvblR5cGVOYW1lZFBhcmFtZXRlcnNUYWdKc0dldE5hbWUuRlVUVVJFX09SX1RBR2Z1dHVyZU9yVGFnSnNHZXROYW1lLkZVVFVSRV9PUl9UWVBFX0FSR1VNRU5UX1RBR2Z1dHVyZU9yVHlwZVRhZ0pzR2V0TmFtZS5JU19JTkRFWEFCTEVfRklFTERfTkFNRUpzR2V0TmFtZS5OVUxMX0NMQVNTX1RZUEVfTkFNRUpzR2V0TmFtZS5PQkpFQ1RfQ0xBU1NfVFlQRV9OQU1FSnNHZXROYW1lLkZVTkNUSU9OX0NMQVNTX1RZUEVfTkFNRUpzR2V0TmFtZS5GVVRVUkVfQ0xBU1NfVFlQRV9OQU1FRXJyb3I6IE5hbWVyIGhhcyBubyBuYW1lIGZvciAiX3JlZ2lzdHJ5X01pbmlmaWVkRmllbGROYW1lcmZpZWxkUmVnaXN0cnlfbWluaWZpZWRJbnN0YW5jZUZpZWxkUHJvcGVydHlOYW1lYm94Y29udGFpbnNGaWVsZF9GaWVsZE5hbWluZ1JlZ2lzdHJ5Z2xvYmFsTmFtZXNnbG9iYWxDb3VudG5hbWVTdG9yZWN4Y3lkYmR4ZHlmcmZ4Znlnb2sxazJrM2s0cjFyMnJ4cnl4MXgyeTF5MmFsdGFyY0NDV2luMWluMm0xMW0xMm0xM20xNG0yMW0yMm0yM20yNG0zMW0zMm0zM20zNG00MW00Mm00M200NG1heG5vd09ORXJlbHJldlJHQnNkcHNyY3VpZHVybFVSTGFiYnJheGVzYXhpc0JBQ0tiZXRhYmlhc0Jsb2JCTFVSQk9USEJZVEVjaXRlY2xpcGNvbHNjdWVzREVDUkRPTkVmYWNlZm9udGZvcm1nYWluaHJlZkhSVEZJRExFSU5DUklOSVRpc0lkS0VFUGtuZWVsYW5nTEVTU05vbmVOT05Fb25seU9QRU5waW5ncGxheXJlY3RSZWN0cmVmWHJlZllSR0JBcm93c3NhdmVzZWVkc2Vla1NJTkVzdGF0dGFnc3ZpZXd3YXJuWkVST19GaWVsZE5hbWluZ1Njb3Blc3VwZXJTY29wZV9maWVsZE5hbWVDb3VudGVycm9vdFNjb3BlaW5oZXJpdGluaGVyaXRhbmNlQmFzZWRGaWVsZE5hbWVDb3VudGVyX2xvY2FsRmllbGROYW1lQ291bnRlcnZhbGZvckNsYXNzZGVjbGFyZXJmb3JCb3hfaXNOYW1lVW51c2VkX25leHROYW1lX01peGluRmllbGROYW1pbmdTY29wZW1peGVkSW5wcm9wb3NlZF9Cb3hGaWVsZE5hbWluZ1Njb3BlX0ZyZXF1ZW5jeUJhc2VkTmFtZXImTmFtZXImX01pbmlmaWVkRmllbGROYW1lcl9GcmVxdWVuY3lCYXNlZE5hbWVyJk5hbWVyJl9NaW5pZmllZEZpZWxkTmFtZXImX01pbmlmaWVkT25lU2hvdEludGVyY2VwdG9yTmFtZXIkZ2V0JHNldGNhbGxTdWZmaXgkaW50ZXJjZXB0ZWRGcmVxdWVuY3lCYXNlZE5hbWVyX3Rva2VuU2NvcGVzSW5ld1Njb3BlRm9yaWxsZWdhbE5hbWVzaWxsZWdhbHRva2VuU2NvcGVjb21wYXJlUmVmZXJlbmNlQ291bnRfcmNUb2tlblNjb3BlX2luY3JlbWVudFBvc2l0aW9ub3ZlcmZsb3dfaW5jcmVtZW50TmFtZWdldE5leHROYW1lcHJvcG9zYWxfTWluaWZ5TmFtZXImTmFtZXImX01pbmlmaWVkRmllbGROYW1lcl9NaW5pZnlOYW1lciZOYW1lciZfTWluaWZpZWRGaWVsZE5hbWVyJl9NaW5pZnlDb25zdHJ1Y3RvckJvZHlOYW1lcl9jb25zdHJ1Y3RvckJvZHlTY29wZXNjb25zdHJ1Y3RvckJvZHlLZXlGb3JfTWluaWZ5TmFtZXImTmFtZXImX01pbmlmaWVkRmllbGROYW1lciZfTWluaWZ5Q29uc3RydWN0b3JCb2R5TmFtZXImX01pbmlmaWVkT25lU2hvdEludGVyY2VwdG9yTmFtZXJNaW5pZnlOYW1lckFMUEhBQkVUX0NIQVJBQ1RFUlNBTFBIQU5VTUVSSUNfQ0hBUkFDVEVSU19yZXNlcnZlZE5hdGl2ZVByb3BlcnRpZXNfYmFkTmFtZXNyZXNlcnZlQmFja2VuZE5hbWVzZnJlc2hOYW1lX2dldFVudXNlZE5hbWVfcG9wdWxhdGVTdWdnZXN0ZWROYW1lc2FkZCQxJG5lY2xvbmUkMG1vdmVOZXh0JDBzdHlsZW5vU3VjaE1ldGhvZCQxdG9TdHJpbmckMFVuc3VwcG9ydGVkRXJyb3IkQXJndW1lbnRFcnJvciRTdGF0ZUVycm9yJEtleV9LZXlMaXN0X0xpc3QkZnJvbUxpbmtlZEhhc2hNYXBfTGlua2VkSGFzaE1hcCRfZW1wdHlMaW5rZWRIYXNoTWFwX0xpbmtlZEhhc2hNYXAkX2xpdGVyYWxSYW5nZUVycm9yJHZhbHVlc3VnZ2VzdGlvbnNsZXR0ZXJfY2FsY3VsYXRlSGFzaGNvZGVzX2xldHRlck51bWJlcmgyX2FscGhhTnVtZXJpY051bWJlcl9iYWROYW1lX2hhc0Jhbm5lZFByZWZpeDQyOTQ5NjcyOTVzdGFydExldHRlcl9Db25zdHJ1Y3RvckJvZHlOYW1pbmdTY29wZV9zdGFydEluZGV4X2NvbnN0cnVjdG9yc251bWJlck9mQ29uc3RydWN0b3JzZm9yTWl4aW5BcHBsaWNhdGlvbmNvbnN0cnVjdG9yIGJvZHkgbWlzc2luZ0Bjb25zdHJ1Y3RvckJvZHlAX2dldENvbnN0cnVjdG9yTGlzdF9NaW5pZnlDb25zdHJ1Y3RvckJvZHlOYW1lcl9NaW5pZmllZE9uZVNob3RJbnRlcmNlcHRvck5hbWVyX05hbWVyTmFtZV9raW5kTmFtZShDYW5ub3QgY29udmVydCBhIG5hbWUgdG8gYSBzdHJpbmdfTmFtZXJOYW1lS2luZHNfTmFtZXJOYW1lS2luZHMuU3RyaW5nQmFja2VkX05hbWVyTmFtZUtpbmRzLkdldHRlcl9OYW1lck5hbWVLaW5kcy5TZXR0ZXJfTmFtZXJOYW1lS2luZHMuQXN5bmNfTmFtZXJOYW1lS2luZHMuQ29tcG91bmRfTmFtZXJOYW1lS2luZHMuVG9rZW5TdHJpbmdCYWNrZWRDb21wb3VuZFN0cmluZ0JhY2tlZE5hbWVvdGhlck5hbWVyTmFtZV9QcmVmaXhlZE5hbWVvdGhlclNhbWVLaW5kR2V0dGVyTmFtZVNldHRlck5hbWVBc3luY05hbWVDb21wb3VuZE5hbWVfcGFydHNfY2FjaGVkTmFtZVRva2VuTmFtZVRva2VuTmFtZSgpIGhhcyBub3QgYmVlbiBmaW5hbGl6ZWQub3RoZXJUb2tlbik9IGhhcyBhbHJlYWR5IGJlZW4gZmluYWxpemVkLl9OYW1lUmVmZXJlbmNlc3VmZml4Rm9yR2V0SW50ZXJjZXB0b3JhYmJyZXZpYXRlVHlwZUxvb2t1cHR5cGVTdHJpbmdTcGVjaWFsVHlwZUpzT2JqZWN0PU9iamVjdFVua25vd24gU3BlY2lhbFR5cGUgJ05hdGl2ZVRocm93QmVoYXZpb3JORVZFUk1BWU5VTExfTlNNTlVMTF9OU01fVEhFTl9NQVlfYml0c2lzTnVsbE5TTUd1YXJkbmV2ZXJtYXludWxsKDEpbnVsbCgxKSttYXlOYXRpdmVUaHJvd0JlaGF2aW9yKF9iaXRzVG9WYWx1ZWJpdHNvck5hdGl2ZUJlaGF2aW9ybmF0aXZlLWJlaGF2aW9ydHlwZXNSZXR1cm5lZHR5cGVzSW5zdGFudGlhdGVkY29kZVRlbXBsYXRlVGV4dFBVUkVQVVJFX0FMTE9DQVRJT05DSEFOR0VTX09USEVSREVQRU5EU19PVEhFUnJlYWRUeXBlc3NwZWNpYWxDb3VudHBhcnNlRm9yZWlnbkpTd3JpdGVUeXBlc3NwZWNpYWxUeXBlc05hdGl2ZUJlaGF2aW9yKHJldHVybnM6ICwgY3JlYXRlczogLCBzaWRlRWZmZWN0czogLCB0aHJvd3M6ICwgaXNBbGxvY2F0aW9uLCB1c2VHdm5fbWFrZVB1cmVfbWFrZUNoYW5nZXNPdGhlcl9tYWtlRGVwZW5kc090aGVycHJvY2Vzc1NwZWNTdHJpbmdzcGVjU3RyaW5ndmFsaWRUYWdzc2V0U2lkZUVmZmVjdHNzZXRUaHJvd3NzZXRJc0FsbG9jYXRpb25sb29rdXBUeXBlc2VlbkVycm9ycmVzb2x2ZVR5cGVzU3RyaW5nb25UeXBlb25WYXJvblZvaWR0eXBlc1N0cmluZ3NwZWNzY3JlYXRlc3JldHVybnNkZXBlbmRzdGhyb3dzZ3ZudGFnQW5kVmFsdWVJbnZhbGlkIDx0YWc+Ojx2YWx1ZT4gcGFpciAnRHVwbGljYXRlIHRhZyAnVGFnICcnIGlzIG5vdCB2YWxpZCBoZXJlLlVua25vd24gdGFnICd0YWdWYWx1ZUxvb2t1cHRhZ1N0cmluZ1Vua25vd24gJycgc3BlY2lmaWNhdGlvbjogJ0ludmFsaWQgdHlwZSBzdHJpbmcgJ2NyZWF0ZXM6dGhyb3dzS2luZCduZXcnIGFuZCAnZ3ZuJyBhcmUgaW5jb21wYXRpYmxlcHJvY2Vzc0VmZmVjdHMnZWZmZWN0cycgYW5kICdkZXBlbmRzJyBtdXN0IG9jY3VyIHRvZ2V0aGVyLnNwbGl0RWZmZWN0c01pc3Npbmcgc2lkZS1lZmZlY3QgZmxhZy5lZmZlY3Ruby1pbmRleGNsZWFyQ2hhbmdlc0luZGV4bm8taW5zdGFuY2VjbGVhckNoYW5nZXNJbnN0YW5jZVByb3BlcnR5bm8tc3RhdGljY2xlYXJDaGFuZ2VzU3RhdGljUHJvcGVydHlVbnJlY29nbml6ZWQgc2lkZS1lZmZlY3QgZmxhZzogJ3NwbGl0RGVwZW5kZW5jaWVzTWlzc2luZyBzaWRlLWVmZmVjdCBkZXBlbmRlbmN5IGZsYWcuY2xlYXJEZXBlbmRzT25JbmRleFN0b3JlY2xlYXJEZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmVjbGVhckRlcGVuZHNPblN0YXRpY1Byb3BlcnR5U3RvcmVvZkpzQ2FsbGNvZGVTdHJpbmdzaWRlRWZmZWN0c0FyZUVuY29kZWRJblNwZWNTdHJpbmduZXdFZmZlY3Rzc2V0VG90aHJvd0JlaGF2aW9yRnJvbVNwZWNTdHJpbmdhbmFseXplX2ZpbGxOYXRpdmVCZWhhdmlvck9mQnVpbHRpbk9yRW1iZWRkZWRHbG9iYWxvZkpzQnVpbHRpbkNhbGxvZkpzRW1iZWRkZWRHbG9iYWxDYWxsX3BhcnNlVHlwZUJlaGF2aW9yQnVpbGRlcl9iZWhhdmlvcl9vdmVycmlkZVdpdGhBbm5vdGF0aW9uc2NyZWF0ZXNBbm5vdGF0aW9uc3JldHVybnNBbm5vdGF0aW9uc19lc2NhcGVpc0pzSW50ZXJvcF9jYXB0dXJlYnVpbGRGaWVsZExvYWRCZWhhdmlvcmJ1aWxkRmllbGRTdG9yZUJlaGF2aW9yYnVpbGRNZXRob2RCZWhhdmlvcmNyZWF0ZUFubm90YXRpb25zX2dldEFubm90YXRpb25zY29uc3RydWN0ZWRPYmplY3RBbm5vdGF0aW9ucyBuZWVkcyBvbmUgc3RyaW5nOiBzcGVjU3RyaW5nQ29uc3RhbnRnZXRDcmVhdGVzQW5ub3RhdGlvbnNnZXRSZXR1cm5zQW5ub3RhdGlvbnNjb21waWxlci51bml2ZXJzZS5mZWF0dXJlRmVhdHVyZUZlYXR1cmUuQUJTVFJBQ1RfQ0xBU1NfSU5TVEFOVElBVElPTkZlYXR1cmUuQVNTRVJURmVhdHVyZS5BU1NFUlRfV0lUSF9NRVNTQUdFRmVhdHVyZS5BU1lOQ0ZlYXR1cmUuQVNZTkNfRk9SX0lORmVhdHVyZS5BU1lOQ19TVEFSRmVhdHVyZS5DQVRDSF9TVEFURU1FTlRGZWF0dXJlLkZBTExfVEhST1VHSF9FUlJPUkZlYXR1cmUuRklFTERfV0lUSE9VVF9JTklUSUFMSVpFUkZlYXR1cmUuTEFaWV9GSUVMREZlYXR1cmUuTE9DQUxfV0lUSE9VVF9JTklUSUFMSVpFUkZlYXR1cmUuTE9BRF9MSUJSQVJZRmVhdHVyZS5TVEFDS19UUkFDRV9JTl9DQVRDSEZlYXR1cmUuU1RSSU5HX0lOVEVSUE9MQVRJT05GZWF0dXJlLlNUUklOR19KVVhUQVBPU0lUSU9ORmVhdHVyZS5TVVBFUl9OT19TVUNIX01FVEhPREZlYXR1cmUuU1lNQk9MX0NPTlNUUlVDVE9SRmVhdHVyZS5TWU5DX0ZPUl9JTkZlYXR1cmUuU1lOQ19TVEFSRmVhdHVyZS5USFJPV19FWFBSRVNTSU9ORmVhdHVyZS5USFJPV19OT19TVUNIX01FVEhPREZlYXR1cmUuVEhST1dfUlVOVElNRV9FUlJPUkZlYXR1cmUuVEhST1dfVU5TVVBQT1JURURfRVJST1JGZWF0dXJlLlRZUEVfVkFSSUFCTEVfQk9VTkRTX0NIRUNLQUJTVFJBQ1RfQ0xBU1NfSU5TVEFOVElBVElPTkFTU0VSVF9XSVRIX01FU1NBR0VBU1lOQ19GT1JfSU5DQVRDSF9TVEFURU1FTlRGQUxMX1RIUk9VR0hfRVJST1JGSUVMRF9XSVRIT1VUX0lOSVRJQUxJWkVSTEFaWV9GSUVMRExPQ0FMX1dJVEhPVVRfSU5JVElBTElaRVJMT0FEX0xJQlJBUllTVEFDS19UUkFDRV9JTl9DQVRDSFNUUklOR19JTlRFUlBPTEFUSU9OU1RSSU5HX0pVWFRBUE9TSVRJT05TVVBFUl9OT19TVUNIX01FVEhPRFNZTUJPTF9DT05TVFJVQ1RPUlNZTkNfRk9SX0lOVEhST1dfRVhQUkVTU0lPTlRIUk9XX05PX1NVQ0hfTUVUSE9EVEhST1dfUlVOVElNRV9FUlJPUlRIUk9XX1VOU1VQUE9SVEVEX0VSUk9SVFlQRV9WQVJJQUJMRV9CT1VORFNfQ0hFQ0tNYXBMaXRlcmFsVXNlTWFwTGl0ZXJhbFVzZSgsaXNDb25zdGFudDosaXNFbXB0eTpTZXRMaXRlcmFsVXNlU2V0TGl0ZXJhbFVzZShMaXN0TGl0ZXJhbFVzZUxpc3RMaXRlcmFsVXNlKFJ1bnRpbWVUeXBlVXNlYXJndW1lbnRUeXBlUnVudGltZVR5cGVVc2VLaW5kLnN0cmluZ3N0cmluZzpSdW50aW1lVHlwZVVzZUtpbmQuZXF1YWxzZXF1YWxzOlJ1bnRpbWVUeXBlVXNlS2luZC51bmtub3dudW5rbm93bjpSdW50aW1lVHlwZVVzZShraW5kPSxyZWNlaXZlcj0sYXJndW1lbnQ9R2VuZXJpY0luc3RhbnRpYXRpb25nZW5lcmljLWluc3RhbnRpYXRpb25HZW5lcmljSW5zdGFudGlhdGlvbihmdW5jdGlvblR5cGU6dHlwZUFyZ3VtZW50czpkYXJ0MmpzLnVuaXZlcnNlLnVzZVN0cm9uZ01vZGVDb25zdHJhaW50SU5WT0tFZHluYW1pYy11c2VfdHlwZUFyZ3VtZW50c1R5cGUgYXJndW1lbnQgY291bnQgbWlzbWF0Y2guIFNlbGVjdG9yIGhhcyAgYnV0ICB3ZXJlIHBhc3NlZC5oYXNDb25zdHJhaW50VW5zdXBwb3J0ZWQgcmVjZWl2ZXIgY29uc3RyYWludDogaXNUaGlzdGhpczpleGFjdDpTVEFUSUNfVEVBUl9PRkZTVVBFUl9URUFSX09GRlNVUEVSX0ZJRUxEX1NFVFNVUEVSX0dFVFNVUEVSX1NFVFRFUl9TRVRTVVBFUl9JTlZPS0VJTlNUQU5DRV9GSUVMRF9HRVRJTlNUQU5DRV9GSUVMRF9TRVRDTE9TVVJFQ0xPU1VSRV9DQUxMQ0FMTF9NRVRIT0RDT05TVFJVQ1RPUl9JTlZPS0VDT05TVF9DT05TVFJVQ1RPUl9JTlZPS0VESVJFQ1RfSU5WT0tFSU5MSU5JTkdTVEFUSUNfSU5WT0tFU1RBVElDX0dFVFNUQVRJQ19TRVRGSUVMRF9JTklURklFTERfQ09OU1RBTlRfSU5JVHN0YXRpYy11c2VfY2hlY2tHZW5lcmljSW52YXJpYW50c1R5cGUgYXJndW1lbnQgY291bnQgbWlzbWF0Y2guIENhbGwgc3RydWN0dXJlIGhhcyAgd2VyZSBwYXNzZWQgaW4gVW5zdXBwb3J0ZWQgZW50aXR5OiBpbml0OmRlZjpzdGF0aWNJbnZva2VTdGF0aWMgaW52b2tlIGVsZW1lbnQgIG11c3QgYmUgYSB0b3AtbGV2ZWwgb3Igc3RhdGljIG1ldGhvZC5TdGF0aWMgZ2V0IGVsZW1lbnQgIG11c3QgYmUgYSBmdW5jdGlvbi5Ob3QgQ2FsbFN0cnVjdHVyZSBmb3Igc3RhdGljIGludm9jYXRpb24gb2YgZWxlbWVudCBzdGF0aWNUZWFyT2ZmU3RhdGljIHRlYXItb2ZmIGVsZW1lbnQgc3RhdGljR2V0b3Igc3RhdGljIGZpZWxkIG9yIGdldHRlci4gbXVzdCBiZSBhIGZpZWxkIG9yIGEgZ2V0dGVyLnN0YXRpY1NldFN0YXRpYyBzZXQgZWxlbWVudCBtdXN0IGJlIGEgdG9wLWxldmVsIG9yIHN0YXRpYyBtZXRob2QuIG11c3QgYmUgYSBmaWVsZCBvciBhIHNldHRlci5zdGF0aWNJbml0U3RhdGljIGluaXQgZWxlbWVudCAgbXVzdCBiZSBhIGZpZWxkLnN1cGVySW52b2tlU3VwZXIgaW52b2tlIGVsZW1lbnQgIG11c3QgYmUgYW4gaW5zdGFuY2UgbWV0aG9kLk5vdCBDYWxsU3RydWN0dXJlIGZvciBzdXBlciBpbnZvY2F0aW9uIG9mIGVsZW1lbnQgc3VwZXJHZXRTdXBlciBnZXQgZWxlbWVudCBzdXBlckZpZWxkU2V0U3VwZXIgc2V0IGVsZW1lbnQgc3VwZXJTZXR0ZXJTZXQgbXVzdCBiZSBhIHNldHRlci5zdXBlclRlYXJPZmZzdXBlckNvbnN0cnVjdG9ySW52b2tlQ29uc3RydWN0b3IgaW52b2tlIGVsZW1lbnQgIG11c3QgYmUgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yLk5vdCBDYWxsU3RydWN0dXJlIGZvciBzdXBlciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIG9mIGVsZW1lbnQgY29uc3RydWN0b3JCb2R5SW52b2tlTm90IENhbGxTdHJ1Y3R1cmUgZm9yIGNvbnN0cnVjdG9yIGJvZHkgaW52b2NhdGlvbiBvZiBlbGVtZW50IGdlbmVyYXRvckJvZHlJbnZva2VkaXJlY3RJbnZva2VEaXJlY3QgaW52b2tlIGVsZW1lbnQgIG11c3QgYmUgYW4gaW5zdGFuY2UgbWVtYmVyLiBtdXN0IGJlIGEgbWV0aG9kLmRpcmVjdEdldERpcmVjdCBnZXQgZWxlbWVudCBkaXJlY3RTZXREaXJlY3Qgc2V0IGVsZW1lbnQgY29uc3RydWN0b3JJbnZva2VDb25zdHJ1Y3RvciBpbnZvY2F0aW9uIGVsZW1lbnQgIG11c3QgYmUgYSBjb25zdHJ1Y3Rvci5Ob3QgQ2FsbFN0cnVjdHVyZSBmb3IgY29uc3RydWN0b3IgaW52b2NhdGlvbiBvZiBlbGVtZW50IHR5cGVkQ29uc3RydWN0b3JJbnZva2VObyB0eXBlIHByb3ZpZGVkIGZvciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLlR5cGVkIGNvbnN0cnVjdG9yIGludm9jYXRpb24gZWxlbWVudCBtdXN0IGJlIGEgY29uc3RydWN0b3IuY29uc3RDb25zdHJ1Y3Rvckludm9rZUNvbnN0IGNvbnN0cnVjdG9yIGludm9jYXRpb24gZWxlbWVudCBmaWVsZEluaXRGaWVsZCBpbml0IGVsZW1lbnQgIG11c3QgYmUgYW4gaW5zdGFuY2UgZmllbGQuZmllbGRDb25zdGFudEluaXRmaWVsZEdldCBtdXN0IGJlIGFuIGluc3RhbmNlIG9yIGJveGVkIGZpZWxkLmZpZWxkU2V0Y2xvc3VyZUNhbGxpbXBsaWNpdEludm9rZWNvbnN0cnVjdG9ySW5saW5pbmdtZXRob2RJbmxpbmluZ1N0YXRpY1VzZShJU19DSEVDS0FTX0NBU1RDQVRDSF9UWVBFTkFUSVZFX0lOU1RBTlRJQVRJT05DT05TVF9JTlNUQU5USUFUSU9OSU1QTElDSVRfQ0FTVFBBUkFNRVRFUl9DSEVDS1JUSV9WQUxVRVRZUEVfQVJHVU1FTlR0eXBlLXVzZWlzOmFzOmNhdGNoOmxpdDppbnN0OmNvbnN0Om5hdGl2ZTppbXBsOnBhcmFtOnJ0aTp0eXBlQXJnOmFzQ2FzdHBhcmFtZXRlckNoZWNraW1wbGljaXRDYXN0Y2F0Y2hUeXBlY29uc3RJbnN0YW50aWF0aW9ubmF0aXZlSW5zdGFudGlhdGlvbmNvbnN0VHlwZUxpdGVyYWxpbnN0YW5jZUNvbnN0cnVjdG9yVHlwZVVzZShjb25zdGFudC11c2VjdXN0b21FbGVtZW50c0NvbnN0YW50VXNlKGRhcnQyanMudXRpbC5lbnVtc2V0RW51bVNldGZyb21WYWx1ZWZpeGVkZnJvbVZhbHVlc21pbnVzYml0TGVuZ3RoMV9FbnVtU2V0X0NvbnN0RW51bVNldEVudW1TZXQudmFsdWU9RW51bVNldC5hZGRFbnVtU2V0LmFkZEFsbEVudW1TZXQuY2xlYXJFbnVtU2V0LnJlbW92ZUVudW1TZXQucmVtb3ZlQWxsX0VudW1TZXRJdGVyYWJsZV9lbnVtU2V0X3ZhbHVlc19FbnVtU2V0SXRlcmF0b3JfbWFza2RhcnQyanMuZWxlbWVudHMubmFtZXNpc0FjY2Vzc2libGVGcm9taXNTaW1pbGFyVG9zaW1pbGFySGFzaENvZGVpc1ByaXZhdGVOYW1laXNQdWJsaWNOYW1lUHJpdmF0ZU5hbWVkYXJ0MmpzLmNhbGxfc3RydWN0dXJlY2FsbC1zdHJ1Y3R1cmVOT19BUkdTT05FX0FSR1RXT19BUkdTVEhSRUVfQVJHU0ZPVVJfQVJHU3VubmFtZWR3aXRoVHlwZUFyZ3VtZW50Q291bnRpc1VubmFtZWRhcml0eT0sIHR5cGVzPUNhbGxTdHJ1Y3R1cmUoY2FsbFNlbGVjdG9yb3B0aW9uYWxQYXJhbWV0ZXJDb3VudG5hbWVJbmRleHNhbWVOYW1lc05hbWVkQ2FsbFN0cnVjdHVyZV9vcmRlcmVkTmFtZWRBcmd1bWVudHMsIG5hbWVkPVtkYXJ0MmpzLmNvbnN0YW50X3N5c3RlbU9wZXJhdGlvblVuYXJ5T3BlcmF0aW9uQmluYXJ5T3BlcmF0aW9uQml0Tm90T3BlcmF0aW9uaW50Q29uc3RhbnROZWdhdGVPcGVyYXRpb25fZm9sZGRvdWJsZUNvbnN0YW50Tm90T3BlcmF0aW9uQmluYXJ5Qml0T3BlcmF0aW9ubGVmdEludHJpZ2h0SW50cmVzdWx0VmFsdWVmb2xkSW50c0JpdEFuZE9wZXJhdGlvbkJpdE9yT3BlcmF0aW9uQml0WG9yT3BlcmF0aW9uU2hpZnRMZWZ0T3BlcmF0aW9uU2hpZnRSaWdodE9wZXJhdGlvbnRydW5jYXRlZFZhbHVlU0lHTl9CSVRCaW5hcnlCb29sT3BlcmF0aW9ubGVmdEJvb2xyaWdodEJvb2xmb2xkQm9vbHNCb29sZWFuQW5kT3BlcmF0aW9uQm9vbGVhbk9yT3BlcmF0aW9uQXJpdGhtZXRpY051bU9wZXJhdGlvbmxlZnROdW1yaWdodE51bWZvbGRlZFZhbHVlZm9sZE51bXNpc0RpdmlkZWlzVHJ1bmNhdGluZ0RpdmlkZVN1YnRyYWN0T3BlcmF0aW9uTXVsdGlwbHlPcGVyYXRpb25Nb2R1bG9PcGVyYXRpb25SZW1haW5kZXJPcGVyYXRpb25UcnVuY2F0aW5nRGl2aWRlT3BlcmF0aW9ucmF0aW90cnVuY2F0ZURpdmlkZU9wZXJhdGlvbkFkZE9wZXJhdGlvbmxlZnRTdHJpbmdyaWdodFN0cmluZ1JlbGF0aW9uYWxOdW1PcGVyYXRpb25MZXNzT3BlcmF0aW9uTGVzc0VxdWFsT3BlcmF0aW9uR3JlYXRlck9wZXJhdGlvbkdyZWF0ZXJFcXVhbE9wZXJhdGlvbkVxdWFsc09wZXJhdGlvbklkZW50aXR5T3BlcmF0aW9ubGVmdERvdWJsZXJpZ2h0RG91YmxlSWZOdWxsT3BlcmF0aW9uQ29kZVVuaXRBdE9wZXJhdGlvbmNoYXJDb2RlQXRzdHJpbmdDb25zdGFudGluZGV4Q29uc3RhbnRSb3VuZE9wZXJhdGlvbnJvdW5kdHJ5VG9Sb3VuZHJvdW5kZWRyb3VuZFRvRG91Ymxlcm91bmRlZDExZS0xM3JvdW5kZWQyMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhVbmZvbGRlZFVuYXJ5T3BlcmF0aW9uSmF2YVNjcmlwdFNldENvbnN0YW50SmF2YVNjcmlwdE1hcENvbnN0YW50UFJPVE9fUFJPUEVSVFlEQVJUX0NMQVNTREFSVF9TVFJJTkdfQ0xBU1NEQVJUX1BST1RPX0NMQVNTREFSVF9HRU5FUkFMX0NMQVNTTEVOR1RIX05BTUVKU19PQkpFQ1RfTkFNRV9qc09iamVjdEtFWVNfTkFNRV9rZXlzUFJPVE9fVkFMVUVfcHJvdG9WYWx1ZUpTX0RBVEFfTkFNRV9qc0RhdGFfQklUUzMyYml0QW5kYml0Tm90Yml0T3JiaXRYb3Jib29sZWFuQW5kYm9vbGVhbk9yZ3JlYXRlckVxdWFsZ3JlYXRlcmlkZW50aXR5aWZOdWxsbGVzc0VxdWFsbGVzc3NoaWZ0TGVmdHNoaWZ0UmlnaHRfaW50ZWdlckJlY29tZXNOYW5PckluZmluaXR5X2NvbnZlcnRUb0phdmFTY3JpcHRDb25zdGFudGZsb29yVmFsdWVkb3VibGVSZXN1bHR0cnVuY2F0ZWRjcmVhdGVJbnRjcmVhdGVJbnRGcm9tSW50X2NyZWF0ZUludDMyY3JlYXRlRG91YmxlY3JlYXRlU3RyaW5nY3JlYXRlQm9vbGNyZWF0ZU51bGxjcmVhdGVMaXN0Y3JlYXRlVHlwZWNyZWF0ZVNldG51bGxzY3JlYXRlTWFwa2V5c1R5cGVrZXlzTGlzdGNyZWF0ZVN5bWJvbGxvb2t1cFVuYXJ5bG9va3VwQmluYXJ5anNfYmFja2VuZC5uYXRpdmVfZGF0YWdldE5hdGl2ZVRhZ3NPZkNsYXNzaGFzTmF0aXZlVGFnc0ZvcmNlZE5vbkxlYWZpc0pzSW50ZXJvcFVzZWRpc0pzSW50ZXJvcExpYnJhcnlpc0pzSW50ZXJvcE1lbWJlcmlzTmF0aXZlTWVtYmVyZ2V0TmF0aXZlTWV0aG9kQmVoYXZpb3JnZXROYXRpdmVGaWVsZExvYWRCZWhhdmlvcmdldE5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcmdldEZpeGVkQmFja2VuZE1ldGhvZFBhdGhnZXRKc0ludGVyb3BMaWJyYXJ5TmFtZWlzQW5vbnltb3VzSnNJbnRlcm9wQ2xhc3NnZXRKc0ludGVyb3BDbGFzc05hbWVnZXRKc0ludGVyb3BNZW1iZXJOYW1lY29tcHV0ZVVuZXNjYXBlZEpTSW50ZXJvcE5hbWVOYXRpdmVCYXNpY0RhdGFCdWlsZGVyc2V0TmF0aXZlQ2xhc3NUYWdJbmZvdGFnSW5mb21hcmtBc0pzSW50ZXJvcExpYnJhcnltYXJrQXNKc0ludGVyb3BDbGFzc2lzQW5vbnltb3VzbWFya0FzSnNJbnRlcm9wTWVtYmVyc2V0TmF0aXZlTWV0aG9kQmVoYXZpb3JzZXROYXRpdmVGaWVsZExvYWRCZWhhdmlvcnNldE5hdGl2ZUZpZWxkU3RvcmVCZWhhdmlvcnNldE5hdGl2ZU1lbWJlck5hbWVOYXRpdmVCYXNpY0RhdGFCdWlsZGVySW1wbG5hdGl2ZUNsYXNzVGFnSW5mb2pzSW50ZXJvcExpYnJhcmllc2pzSW50ZXJvcENsYXNzZXNhbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzanNJbnRlcm9wTWVtYmVyc3RhZ1RleHROYXRpdmVCYXNpY0RhdGFCdWlsZGVyIGlzIGNsb3NlZC4gVHJ5aW5nIHRvIG1hcmsgIGFzIGEgbmF0aXZlIGNsYXNzLk5hdGl2ZSB0YWcgaW5mbyBzZXQgaW5jb25zaXN0ZW50bHkgb24gRXhpc3RpbmcgdGFnIGluZm8gJ25ldyB0YWcgaW5mbyAnIGFzIGEganMtaW50ZXJvcCBsaWJyYXJ5LiBhcyBhIGpzLWludGVyb3AgY2xhc3MuIGFzIGEganMtaW50ZXJvcCBtZW1iZXIucmVvcGVuRm9yVGVzdGluZ05hdGl2ZUJhc2ljRGF0YUltcGxuYXRpdmUtYmFzaWMtZGF0YWZyb21JcmZvckVhY2hOYXRpdmVDbGFzc2ZvckVhY2hKc0ludGVyb3BMaWJyYXJ5Zm9yRWFjaEpzSW50ZXJvcENsYXNzZm9yRWFjaEpzSW50ZXJvcE1lbWJlcmlzTm9uTGVhZl9pc0pzSW50ZXJvcE1lbWJlck5hdGl2ZURhdGFCdWlsZGVySW1wbG5hdGl2ZU1lbWJlck5hbWVuYXRpdmVNZXRob2RCZWhhdmlvcm5hdGl2ZUZpZWxkTG9hZEJlaGF2aW9ybmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yTmF0aXZlIG1lbWJlciBuYW1lIHNldCBpbmNvbnNpc3RlbnRseSBvbiBFeGlzdGluZyBuYW1lICduZXcgbmFtZSAnTmF0aXZlRGF0YUltcGxuYXRpdmUtZGF0YV9qc0ludGVyb3BFc2NhcGVQcmVmaXhKUyRmb3JFYWNoTmF0aXZlTWV0aG9kRGF0YWdldE5hdGl2ZUJlaGF2aW9yRm9yTWV0aG9kZm9yRWFjaE5hdGl2ZUZpZWxkRGF0YWdldE5hdGl2ZUJlaGF2aW9yRm9yRmllbGRMb2FkZ2V0TmF0aXZlQmVoYXZpb3JGb3JGaWVsZFN0b3JlX2pzQ2xhc3NOYW1lSGVscGVyX2pzTWVtYmVyTmFtZUhlbHBlcl9qc0xpYnJhcnlOYW1lSGVscGVyanNJbnRlcm9wTmFtZSBpcyBqcyBpbnRlcm9wIGJ1dCBqcyBpbnRlcm9wIG5hbWUgaGFzIG5vdCB5ZXQgYmVlbiBjb21wdXRlZC5fZml4ZWRCYWNrZW5kQ2xhc3NQYXRoTm8gbmF0aXZlIG1ldGhvZCBiZWhhdmlvciBoYXMgYmVlbiBjb21wdXRlZCBmb3IgTm8gbmF0aXZlIGZpZWxkIGxvYWQgYmVoYXZpb3IgaGFzIGJlZW4gY29tcHV0ZWQgZm9yIE5vIG5hdGl2ZSBmaWVsZCBzdG9yZSBiZWhhdmlvciBoYXMgYmVlbiBjb21wdXRlZCBmb3IgTmF0aXZlQ2xhc3NUYWchbm9ubGVhZmRhcnQyanMuanNfbW9kZWwubG9jYWxzR2xvYmFsTG9jYWxzTWFwZ2xvYmFsLWxvY2Fscy1tYXBfbG9jYWxzTWFwc21hcENvdW50bG9jYWxzTWFwcmV2ZXJzZU1hcGdldExvY2Fsc01hcHNldExvY2Fsc01hcE5vIG1lbWJlciBwcm92aWRlZC5Mb2NhbHMgbWFwIGFscmVhZHkgY3JlYXRlZCBmb3IgS2VybmVsVG9Mb2NhbHNNYXBJbXBsbG9jYWxzLW1hcF9jdXJyZW50TWVtYmVyX2xvY2Fsc192YXJpYWJsZU1hcF9qdW1wVGFyZ2V0TWFwX2JyZWFrc0FzQ29udGludWVsb2NhbHNDb3VudGlzUmVndWxhclBhcmFtZXRlcnJlZ2lzdGVyQnlJbmRleGp1bXBDb3VudHJldmVyc2VkTWFwX2Vuc3VyZUp1bXBNYXBqdW1wVGFyZ2V0TWFwYnJlYWtzQXNDb250aW51ZWdldEp1bXBUYXJnZXRGb3JCcmVha05vIHRhcmdldCBmb3IgZ2VuZXJhdGVDb250aW51ZUZvckJyZWFrZ2V0SnVtcFRhcmdldEZvckNvbnRpbnVlU3dpdGNoZ2V0SnVtcFRhcmdldEZvclN3aXRjaENhc2VnZXRKdW1wVGFyZ2V0Rm9yRG9nZXRKdW1wVGFyZ2V0Rm9yTGFiZWxnZXRKdW1wVGFyZ2V0Rm9yU3dpdGNoZ2V0SnVtcFRhcmdldEZvckZvcmdldEp1bXBUYXJnZXRGb3JGb3JJbmdldEp1bXBUYXJnZXRGb3JXaGlsZWdldExvY2FsVmFyaWFibGVyZWdpc3RlcmdldExvY2FsVHlwZVZhcmlhYmxlZ2V0VHlwZVZhcmlhYmxlVHlwZWdldEZ1bmN0aW9uTm9kZUZvclBhcmFtZXRlcmdldERhdGFnZXRMb2NhbFR5cGVnZXREYXJ0VHlwZUp1bXBWaXNpdG9yanVtcEluZGV4X2dldEp1bXBUYXJnZXRpc1N3aXRjaGlzU3dpdGNoQ2FzZV9nZXRPckNyZWF0ZUxhYmVsYWRkTGFiZWxjYW5CZUJyZWFrVGFyZ2V0Y2FuQmVDb250aW51ZVRhcmdldG5lZWRzTGFiZWxKSnVtcFRhcmdldGp1bXAtdGFyZ2V0X2xhYmVsc2RlZmluaXRpb25sYWJlbERlZmluaXRpb25KSnVtcFRhcmdldChtZW1iZXJDb250ZXh0PSxuZXN0aW5nTGV2ZWw9LGlzQnJlYWtUYXJnZXQ9LGlzQ29udGludWVUYXJnZXQ9LGxhYmVscz1KTGFiZWxEZWZpbml0aW9uSkxhYmVsRGVmaW5pdGlvbigsbGFiZWxOYW1lPUpMb2NhbExvY2FsRGF0YWZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQXNMb2NhbGNvbXBpbGVyLnNyYy5rZXJuZWwuZGFydDJqc190YXJnZXRkYXJ0Ol9jaHJvbWVkYXJ0Ol9mb3JlaWduX2hlbHBlcmRhcnQ6X2pzX2VtYmVkZGVkX25hbWVzZGFydDpfanNfaGVscGVyZGFydDpfanNfbmFtZXNkYXJ0Omh0bWxfY29tbW9uZGFydDppbmRleGVkX2RiZGFydDppb2RhcnQ6anNfdXRpbGRhcnQ6d2ViX2F1ZGlvZGFydDp3ZWJfZ2xkYXJ0OndlYl9zcWxEYXJ0MmpzQ29uc3RhbnRzQmFja2VuZF9hbGxvd2VkRGFydFNjaGVtZVBhdGhzanNfdXRpbF9yZXF1aXJlZExpYnJhcmllc21heWJlRW5hYmxlTmF0aXZlYWxsb3dlZFRlc3RMaWJyYXJ5dGVzdHMvY29tcGlsZXIvZGFydDJqc19uYXRpdmV0ZXN0cy9jb21waWxlci9kYXJ0MmpzX2V4dHJhZ2VuZXJhdGVkX3Rlc3RzL2RhcnQyanNfbmF0aXZlL25hdGl2ZV90ZXN0YWxsb3dlZERhcnRMaWJyYXJ5S0xpYnJhcnlrOmxpYnJhcnkoS0NsYXNzY2xhc3MoS1R5cGVkZWZ0eXBlZGVmKEtNZW1iZXJfaXNTdGF0aWNLRnVuY3Rpb25LQ29uc3RydWN0b3JLR2VuZXJhdGl2ZUNvbnN0cnVjdG9yS0ZhY3RvcnlDb25zdHJ1Y3RvcktNZXRob2RLR2V0dGVyS1NldHRlcktGaWVsZEtUeXBlVmFyaWFibGV0eXBlX3ZhcmlhYmxlKGV4ZWN1dGFibGVDb250ZXh0bG9jYWxfZnVuY3Rpb25LTG9jYWxUeXBlVmFyaWFibGVsb2NhbF90eXBlX3ZhcmlhYmxlKGtFbGVtZW50UHJlZml4ZGFydDJqc19pbmZvLmluZm9JbmZvQmFzaWNJbmZvQ29kZUluZm9BbGxJbmZvbWlub3JWZXJzaW9udmlzaXRBbGxQcm9ncmFtSW5mb0luZm9LaW5kLmxpYnJhcnlPdXRwdXRVbml0SW5mb0luZm9LaW5kLm91dHB1dFVuaXR2aXNpdE91dHB1dENsYXNzSW5mb0luZm9LaW5kLmNsYXp6Q29kZVNwYW5Db25zdGFudEluZm9JbmZvS2luZC5jb25zdGFudF9GaWVsZEluZm8mQmFzaWNJbmZvJkNvZGVJbmZvSW5mb0tpbmQuZmllbGRUeXBlZGVmSW5mb0luZm9LaW5kLnR5cGVkZWZfRnVuY3Rpb25JbmZvJkJhc2ljSW5mbyZDb2RlSW5mb0Z1bmN0aW9uSW5mb1RPUF9MRVZFTF9GVU5DVElPTl9LSU5EQ0xPU1VSRV9GVU5DVElPTl9LSU5ETUVUSE9EX0ZVTkNUSU9OX0tJTkRDT05TVFJVQ1RPUl9GVU5DVElPTl9LSU5ESW5mb0tpbmQuZnVuY3Rpb25DbG9zdXJlSW5mb0luZm9LaW5kLmNsb3N1cmV2aXNpdENsb3N1cmVQYXJhbWV0ZXJJbmZvRnVuY3Rpb25Nb2RpZmllcnNJbmZvS2luZEluZm9WaXNpdG9yUmVjdXJzaXZlSW5mb1Zpc2l0b3JraW5kVG9TdHJpbmdraW5kRnJvbVN0cmluZ0pzb25Ub0FsbEluZm9Db252ZXJ0ZXJwYXJzZUxpYnJhcnlwYXJzZUZ1bmN0aW9ucGFyc2VDbG9zdXJlcGFyc2VGaWVsZHBhcnNlQ29uc3RhbnRob2xkaW5ncGFyc2VPdXRwdXRVbml0cGFyc2VQcm9ncmFtZGVmZXJyZWRGaWxlc01hcGltcG9ydE1hcHBhcnNlSWRwYXJzZUNvZGVwcm9ncmFtSW5mb19wYXJzZUR1cmF0aW9ubWljcm9zZWNvbmRzaG91cnNtaW51dGVzdG90YWxNaWxsaXNwYXJzZVBhcmFtZXRlcnBhcnNlTW9kaWZpZXJzc2VyaWFsaXplZElkZnVuY3Rpb24vY2xvc3VyZS9saWJyYXJ5L2NsYXNzL2ZpZWxkL2NvbnN0YW50L3R5cGVkZWYvb3V0cHV0VW5pdC9qc29uQ29kZUFsbEluZm9Ub0pzb25Db252ZXJ0ZXJpZHN1c2VkSWRzaWRGb3J1c2VMaWJyYXJ5VXJpZm9ySWRfdmlzaXRMaXN0X3Zpc2l0QWxsSW5mb0VsZW1lbnRzanNvbkxpYnJhcmllc2pzb25DbGFzc2VzanNvbkZ1bmN0aW9uc2pzb25UeXBlZGVmc2pzb25GaWVsZHNqc29uQ29uc3RhbnRzanNvbkNsb3N1cmVzX3Zpc2l0RGVwZW5kZW5jeUluZm9fdmlzaXRBbGxJbmZvSG9sZGluZ192aXNpdEFsbEluZm9EZXBlbmRlbmNpZXNqc29uSG9sZGluZ2pzb25EZXBlbmRlbmNpZXNkdW1wX3ZlcnNpb25kdW1wX21pbm9yX3ZlcnNpb25fdmlzaXRCYXNpY0luZm9fc2VyaWFsaXplQ29kZV92aXNpdEZ1bmN0aW9uTW9kaWZpZXJzbW9kc192aXNpdFBhcmFtZXRlckluZm9BbGxJbmZvSnNvbkNvZGVjSWRfdG9Tb3J0ZWRTZXJpYWxpemVkSWRzZ2V0SWR3cml0ZURhdGVkYXRldG9Jc284NjAxU3RyaW5nd3JpdGVEdXJhdGlvbndyaXRlSW5mb1dpdGhLaW5kd3JpdGVEZXBlbmRlbmNpZXNfd3JpdGVEZXBlbmRlbmN5SW5mb193cml0ZU91dHB1dE9yTnVsbF92aXNpdENvZGVTcGFuX3dyaXRlQ29uc3RhbnRPck51bGxCaW5hcnlSZWFkZXJyZWFkRGF0ZXJlYWREdXJhdGlvbnJlYWRJbmZvV2l0aEtpbmRyZWFkRnVuY3Rpb25yZWFkT3V0cHV0cmVhZENsb3N1cmV3YXJuaW5nOiBkYXRhIHdhcyBlbmNvZGVkIHdpdGggZm9ybWF0IHZlcnNpb24gLCBidXQgZGVjb2RlZCB3aXRoIHJlYWREZXBlbmRlbmNpZXNfcmVhZERlcGVuZGVuY3lJbmZvZGVwZW5kZW5jaWVzVG90YWxyZWFkUHJvZ3JhbV9yZWFkQmFzaWNJbmZvX3JlYWRPdXRwdXRPck51bGxfcmVhZENvZGVTcGFuX3JlYWRDb25zdGFudE9yTnVsbGhhc091dHB1dF9yZWFkRnVuY3Rpb25Nb2RpZmllcnNfcmVhZFBhcmFtZXRlckluZm9fc3RhdGljTWFza19jb25zdE1hc2tfZmFjdG9yeU1hc2tfZXh0ZXJuYWxNYXNrSkZpZWxkX2NsYXNzRGF0YV9zdGF0aWNGaWVsZERhdGFrZXJuZWxTdHJhdGVneWdldENsYXNzTm9kZWZpZWxkRWxlbWVudGdldEZpZWxkZ2V0Q29uc3RhbnRWYWx1ZXJlcXVpcmVDb25zdGFudGltcGxpY2l0TnVsbGNvbnN0cnVjdG9yRWxlbWVudGluaXRpYWxpemVyVmFsdWVJbml0aWFsaXplcktpbmQuY29tcGxleGNvbnN0YW50VmFsdWVjb21wbGV4aXR5Z2V0QWxsb2NhdG9yRGF0YUZvclRlc3RpbmdnZXRTdGF0aWNGaWVsZERhdGFGb3JUZXN0aW5nQ2xhc3NEYXRhU3RhdGljRmllbGREYXRhaGFzRGVwZW5kZW5jaWVzQWxsb2NhdG9yRGF0YUFsbG9jYXRvckRhdGEoaW5pdGlhbFZhbHVlPWluaXRpYWxpemVycz1Jbml0aWFsaXplcktpbmRJbml0aWFsaXplcktpbmQuZGlyZWN0SW5pdGlhbGl6ZXJLaW5kLnBvc2l0aW9uYWxJbml0aWFsaXplcktpbmQubmFtZWRjb21wbGV4VW5leHBlY3RlZCBraW5kIGZpZWxkLWFuYWx5c2lzX2ZpZWxkRGF0YWNhbkJlRWxpZGVkaGFzTm9FbGlzaW9ua0ZpZWxkakZpZWxkdG9CYWNrZW5kTWVtYmVyaXNUb29Db21wbGV4aW5jbHVkZUluaXRpYWxWYWx1ZWluaXRpYWxDb25zdGFudHNpbkFsbENvbnN0cnVjdG9yc2NvbnN0cnVjdG9yVXNhZ2VpbnZva2VkUGFyYW1ldGVyc3RvQmFja2VuZENvbnN0YW50aXNFZmZlY3RpdmVseUNvbnN0YW50aXNJbml0aWFsaXplZEluQWxsb2NhdG9yaGFzV3JpdGVpc0VmZmVjdGl2ZWx5RmluYWxpbmRlcGVuZGVudEZpZWxkc2RlcGVuZGVudEZpZWxkc3N0YXRpY0ZpZWxkRGF0YXByb2Nlc3NlZEZpZWxkc2N1cnJlbnRGaWVsZHNlYWdlckNyZWF0aW9uSW5kZXhwcm9jZXNzRmllbGRpc0VhZ2VyZWFnZXJGaWVsZERlcGVuZGVuY2llc2NyZWF0aW9uSW5kZXhvdGhlckZpZWxkb3RoZXJEYXRhaXNMYXp5ZWFnZXJGaWVsZERlcGVuZGVuY2llc0ZvclRlc3RpbmdhTG9jYXRpb25iTG9jYXRpb25GaWVsZEFuYWx5c2lzRGF0YWZpZWxkLWFuYWx5c2lzLWRhdGFmcm9tRGF0YVNvdXJjZUZpZWxkQW5hbHlzaXNEYXRhKGluaXRpYWxWYWx1ZT1pc0luaXRpYWxpemVkSW5BbGxvY2F0b3I9aXNFZmZlY3RpdmVseUZpbmFsPSxpc0VsaWRlZD1pc0VhZ2VyPSxlYWdlckNyZWF0aW9uSW5kZXg9ZWFnZXJGaWVsZERlcGVuZGVuY2llcz1CaW5hcnlPdXRwdXRTaW5rQWRhcHRlcmpzX2JhY2tlbmQuYmFja2VuZC5hbm5vdGF0aW9uc1ByYWdtYUFubm90YXRpb25mb3JGdW5jdGlvbnNPbmx5Zm9yRmllbGRzT25seWludGVybmFsT25seWFzVHJ1c3Rhc0NoZWNrdHlwZXNUcnVzdHR5cGVzQ2hlY2twYXJhbWV0ZXJUcnVzdGRvd25jYXN0VHJ1c3Rkb3duY2FzdENoZWNraW1wbGllc2V4Y2x1ZGVzcmVxdWlyZXNBbm5vdGF0aW9uc0RhdGFoYXNBc3N1bWVEeW5hbWljaGFzTm9JbmxpbmVoYXNUcnlJbmxpbmVoYXNEaXNhYmxlRmluYWxoYXNOb1Rocm93c2hhc05vU2lkZUVmZmVjdHNnZXRDb25kaXRpb25DaGVja1BvbGljeUFubm90YXRpb25zRGF0YUltcGxhbm5vdGF0aW9ucy1kYXRhX2RlZmF1bHRQYXJhbWV0ZXJDaGVja1BvbGljeV9kZWZhdWx0SW1wbGljaXREb3duY2FzdENoZWNrUG9saWN5X2RlZmF1bHRDb25kaXRpb25DaGVja1BvbGljeV9kZWZhdWx0RXhwbGljaXRDYXN0Q2hlY2tQb2xpY3lfaGFzUHJhZ21hQW5ub3RhdGlvbnNEYXRhQnVpbGRlcmNvbXB1dGVQcmFnbWFBbm5vdGF0aW9uRGF0YWRhcnQyanM6b3B0aW9uc1ZhbHVlaGFzT3B0aW9uc3Byb2Nlc3NNZW1iZXJBbm5vdGF0aW9uc3BsYXRmb3JtQW5ub3RhdGlvbnNBbGxvd2VkQHByYWdtYSgnJykgYW5ub3RhdGlvbiBkb2VzIG5vdCB0YWtlIG9wdGlvbnMnKSBhbm5vdGF0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBtZXRob2RzIGFuZCBjb25zdHJ1Y3RvcnMuZm9yIGZpZWxkcy5VbnJlY29nbml6ZWQgZGFydDJqcyBwcmFnbWEgQHByYWdtYSgnVW5rbm93biBkYXJ0MmpzIHByYWdtYSBAcHJhZ21hKCdyZXBvcnRlZEV4Y2x1c2lvbnNAcHJhZ21hKCdkYXJ0MmpzOicpIGltcGxpZXMgJykgbXVzdCBub3QgYmUgdXNlZCB3aXRoIEBwcmFnbWEoJ2RhcnQyanM6Jykgc2hvdWxkIGFsd2F5cyBiZSBjb21iaW5lZCB3aXRoIEBwcmFnbWEoJ2RhcnQyanM6TWVtYmVyVXNlZENhbGxiYWNrQ2xhc3NVc2VkQ2FsbGJhY2tBYnN0cmFjdFVzYWdlX3BlbmRpbmdVc2Vfb3JpZ2luYWxVc2VfYXBwbGllZFVzZWhhc1NhbWVVc2FnZU1lbWJlclVzYWdlZW1wdHlTZXRwZW5kaW5nVXNlY3JlYXRlUG90ZW50aWFsQWNjZXNzU2V0QWNjZXNzLnN0YXRpY0FjY2Vzc2NyZWF0ZVBvdGVudGlhbFJlYWRzY3JlYXRlUG90ZW50aWFsV3JpdGVzY3JlYXRlUG90ZW50aWFsSW52b2tlc3BvdGVudGlhbFJlYWRzcG90ZW50aWFsV3JpdGVzcG90ZW50aWFsSW52b2tlc2hhc0luaXRoYXNJbnZva2VhY2Nlc3Nlc1Byb3BlcnR5VXNhZ2VhbHJlYWR5SGFzUmVhZGFscmVhZHlIYXNXcml0ZVByb3BlcnR5VXNhZ2UocmVhZHM9d3JpdGVzPWludm9rZXM9cG90ZW50aWFsUmVhZHM9cG90ZW50aWFsV3JpdGVzPXBvdGVudGlhbEludm9rZXM9cGVuZGluZ1VzZT1pbml0aWFsQ29uc3RhbnRzPUZpZWxkVXNhZ2VfaW5pdGlhbENvbnN0YW50c0ZpZWxkVXNhZ2UoLGhhc0luaXQ9TWV0aG9kVXNhZ2VwYXJhbWV0ZXJVc2FnZWFscmVhZHlIYXNJbnZva2VmdWxseVVzZWlzRnVsbHlVc2VkTWV0aG9kVXNhZ2UocGFyYW1ldGVyVXNhZ2U9TWVtYmVyVXNlTk9STUFMQ0xPU1VSSVpFX0lOU1RBTkNFQ0xPU1VSSVpFX1NUQVRJQ01lbWJlclVzZXNOT1JNQUxfT05MWUNMT1NVUklaRV9JTlNUQU5DRV9PTkxZQ0xPU1VSSVpFX1NUQVRJQ19PTkxZQUxMX0lOU1RBTkNFQUxMX1NUQVRJQ0NsYXNzVXNhZ2VDbGFzc1VzZUlOU1RBTlRJQVRFRElNUExFTUVOVEVEQ2xhc3NVc2VzSU5TVEFOVElBVEVEX09OTFlJTVBMRU1FTlRFRF9PTkxZUGFyYW1ldGVyVXNhZ2VfcGFyYW1ldGVyU3RydWN0dXJlX2hhc0ludm9rZV9wcm92aWRlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzX2FyZUFsbFR5cGVQYXJhbWV0ZXJzUHJvdmlkZWRfdW5wcm92aWRlZE5hbWVkUGFyYW1ldGVyc3Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnNhcmVBbGxUeXBlUGFyYW1ldGVyc1Byb3ZpZGVkdW5wcm92aWRlZE5hbWVkUGFyYW1ldGVyc25ld1Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnNfcHJvdmlkZWROYW1lZFBhcmFtZXRlcnNDb3VudFBhcmFtZXRlclVzYWdlKF9oYXNJbnZva2U9X3Byb3ZpZGVkUG9zaXRpb25hbFBhcmFtZXRlcnM9X2FyZUFsbFR5cGVQYXJhbWV0ZXJzUHJvdmlkZWQ9X3VucHJvdmlkZWROYW1lZFBhcmFtZXRlcnM9QWNjZXNzc3RhdGljQWNjZXNzZHluYW1pY0FjY2Vzc3N1cGVyQWNjZXNzQWNjZXNzZXNNZW1iZXJBY2Nlc3N3b3JsZF9idWlsZGVyU2VsZWN0b3JDb25zdHJhaW50c1N0cm9uZ01vZGVXb3JsZFN0cmF0ZWd5U3Ryb25nTW9kZVdvcmxkQ29uc3RyYWludHNfY29uc3RyYWludHNTdHJvbmdNb2RlQ29uc3RyYWludChXb3JsZEJ1aWxkZXJXb3JsZEJ1aWxkZXJCYXNlX3JlZ2lzdGVyU3RhdGljVHlwZUFyZ3VtZW50RGVwZW5kZW5jeV9yZWdpc3RlckR5bmFtaWNUeXBlQXJndW1lbnREZXBlbmRlbmN5Tm9TdWNoTWV0aG9kUmVnaXN0cnlyZWdpc3Rlck5vU3VjaE1ldGhvZG5vU3VjaE1ldGhvZEVsZW1lbnRoYXNUaHJvd2luZ05vU3VjaE1ldGhvZGhhc0NvbXBsZXhOb1N1Y2hNZXRob2ROb1N1Y2hNZXRob2RSZWdpc3RyeUltcGxkZWZhdWx0SW1wbHN0aHJvd2luZ0ltcGxzbm90QXBwbGljYWJsZUltcGxzb3RoZXJJbXBsc191bmNhdGVnb3JpemVkSW1wbHNmb3J3YXJkaW5nU3ludGF4SW1wbHNfcmVzb2x2ZXJpbnRlcm5hbFJlc29sdmVyRm9yVGVzdGluZ19jYXRlZ29yaXplSW1wbE5zbUNhdGVnb3J5LkRFRkFVTFROc21DYXRlZ29yeS5USFJPV0lOR05zbUNhdGVnb3J5Lk9USEVSTnNtQ2F0ZWdvcnkuTk9UX0FQUExJQ0FCTEVoYXNGb3J3YXJkaW5nU3ludGF4c3VwZXJDYWxsZ2V0U3VwZXJOb1N1Y2hNZXRob2RoYXNUaHJvd2luZ1N5bnRheGlzQ29tcGxleE5vU3VjaE1ldGhvZERhdGFJbXBsbm8tc3VjaC1tZXRob2QtZGF0YWNvbXBsZXhOb1JldHVybkltcGxzY29tcGxleFJldHVybmluZ0ltcGxzTnNtQ2F0ZWdvcnlUSFJPV0lOR05PVF9BUFBMSUNBQkxFT1RIRVJOb1N1Y2hNZXRob2RSZXNvbHZlckNsYXNzUmVsYXRpb25TdGF0aWNUeXBlVmlzaXRvcl9leHByZXNzaW9uVHlwZUNhY2hlX2ZvckluSXRlcmF0b3JUeXBlQ2FjaGV0eXBlTWFwc0ZvclRlc3RpbmdfcGVuZGluZ1J1bnRpbWVUeXBlVXNlRGF0YV9jdXJyZW50VmFyaWFibGVzX2ludmFsaWRhdGVkVmFyaWFibGVzX3R5cGVNYXBCYXNlX3R5cGVNYXBXaGVuVHJ1ZV90eXBlTWFwV2hlbkZhbHNlZ2V0U3RhdGljVHlwZUNhY2hlY29tcGxldGVzdHlwZU1hcFdoZW5UcnVldHlwZU1hcFdoZW5GYWxzZVVuaGFuZGxlZCBub2RlIHZpc2l0Tm9kZXNnZXRJbnRlcmZhY2VUeXBlT2ZfY29tcHV0ZVByb3BlcnR5R2V0VHlwZWhhbmRsZVByb3BlcnR5R2V0aGFuZGxlUnVudGltZVR5cGVVc2VfbmFycm93SW5zdGFuY2VSZWNlaXZlcmxlZnRSdW50aW1lVHlwZUV4cHJlc3Npb25yaWdodFJ1bnRpbWVUeXBlRXhwcmVzc2lvblVuZXhwZWN0ZWQgUnVudGltZVR5cGVVc2VEYXRhIGZvciBpc0NvbXBsZXRlaGFuZGxlUHJvcGVydHlTZXRyZWNlaXZlclN1YnN0aXR1dGlvbmhhbmRsZUFzRXhwcmVzc2lvbmhhbmRsZURpcmVjdFByb3BlcnR5R2V0aGFuZGxlRGlyZWN0TWV0aG9kSW52b2NhdGlvbmFyZ3VtZW50VHlwZXNfdmlzaXRBcmd1bWVudHNoYW5kbGVEaXJlY3RQcm9wZXJ0eVNldGlzU3BlY2lhbENhc2VkQmluYXJ5T3BlcmF0b3JfZ2V0TWVtYmVyX2lzQXBwbGljYWJsZWlzRnVuY3Rpb25UeXBlQXBwbGljYWJsZWdldE5hbWVkUGFyYW1ldGVyc2lzVHlwZUFwcGxpY2FibGVfdXBkYXRlTWV0aG9kSW52b2NhdGlvblRhcmdldG5lZWRlZFBvc2l0aW9uYWxDaGVja3NuZWVkZWROYW1lZENoZWNrc2FyZ3VtZW50SW5kZXhuYW1lZEFyZ3VtZW50bmFtZWRUeXBlbGV0VmFyaWFibGVzdXBkYXRlQXJndW1lbnRjaGVja2VkUGFyYW1ldGVyVHlwZWhhbmRsZVZhcmlhYmxlRGVjbGFyYXRpb25oYW5kbGVWYXJpYWJsZUdldF9jb21wdXRlTWV0aG9kSW52b2NhdGlvblR5cGVoYW5kbGVNZXRob2RJbnZvY2F0aW9uYWZ0ZXJJbnZvY2F0aW9ucHJvbW90ZXR5cGVPZlVuZXhwZWN0ZWQgcHJvbW90aW9uIG9mIGhhbmRsZVZhcmlhYmxlU2V0aGFuZGxlU3RhdGljR2V0aGFuZGxlU3RhdGljU2V0aGFuZGxlU3RhdGljSW52b2NhdGlvbmhhbmRsZVN1cGVyUHJvcGVydHlHZXRoYW5kbGVTdXBlclByb3BlcnR5U2V0aGFuZGxlU3VwZXJNZXRob2RJbnZvY2F0aW9uYWZ0ZXJMZWZ0V2hlblRydWVhZnRlckxlZnRXaGVuRmFsc2VhZnRlclJpZ2h0V2hlblRydWVhZnRlclJpZ2h0V2hlbkZhbHNlYWZ0ZXJPcGVyYW5kV2hlblRydWVhZnRlck9wZXJhbmRXaGVuRmFsc2VfaGFuZGxlQ29uZGl0aW9uYWxhZnRlckNvbmRpdGlvbldoZW5UcnVlYWZ0ZXJDb25kaXRpb25XaGVuRmFsc2VhZnRlclRoZW5hZnRlck90aGVyd2lzZWhhbmRsZUlzRXhwcmVzc2lvbmFmdGVyT3BlcmFuZF9wcm9jZXNzTG9jYWxWYXJpYWJsZV9jb21wdXRlSW5zdGFudGlhdGlvblR5cGVoYW5kbGVJbnN0YW50aWF0aW9uSW5jb21wbGV0ZSBSdW50aW1lVHlwZVVzZURhdGE6IG9wZXJhbmRUeXBlaGFuZGxlU3RyaW5nQ29uY2F0ZW5hdGlvbmhhbmRsZUludExpdGVyYWxoYW5kbGVEb3VibGVMaXRlcmFsaGFuZGxlQm9vbExpdGVyYWxoYW5kbGVTdHJpbmdMaXRlcmFsaGFuZGxlU3ltYm9sTGl0ZXJhbGhhbmRsZU51bGxMaXRlcmFsaGFuZGxlTGlzdExpdGVyYWxoYW5kbGVTZXRMaXRlcmFsaGFuZGxlTWFwTGl0ZXJhbGhhbmRsZUZ1bmN0aW9uRXhwcmVzc2lvbmJlZm9yZUNsb3N1cmVnZXRTY29wZUZvcmFzc2lnbmVkVmFyaWFibGVzX29sZFZhcmlhYmxlc3Zpc2l0U2lnbmF0dXJlaGFuZGxlVGhyb3doYW5kbGVGaWVsZEluaXRpYWxpemVyaGFuZGxlUmVkaXJlY3RpbmdJbml0aWFsaXplcmhhbmRsZVN1cGVySW5pdGlhbGl6ZXJiZWZvcmVMb29waGFuZGxlRm9ySW5TdGF0ZW1lbnRpdGVyYXRvclR5cGVzdHJlYW1JbnRlcmZhY2VUeXBlaXRlcmFibGVJbnRlcmZhY2VUeXBlaGFuZGxlU3dpdGNoU3RhdGVtZW50YWZ0ZXJTdGF0ZW1lbnRiZWZvcmVDYXNlaGFzQ29udGludWVTd2l0Y2hoYW5kbGVDYXRjaGhhbmRsZVR5cGVMaXRlcmFsaGFuZGxlTG9hZExpYnJhcnloYW5kbGVBc3NlcnRTdGF0ZW1lbnRiZWZvcmVDb25kaXRpb25oYW5kbGVGdW5jdGlvbkRlY2xhcmF0aW9uaGFuZGxlUGFyYW1ldGVyaGFuZGxlU2lnbmF0dXJlaGFuZGxlUHJvY2VkdXJlaGFuZGxlQ29uc3RydWN0b3JoYW5kbGVGaWVsZGhhbmRsZUNvbnN0YW50RXhwcmVzc2lvbkFyZ3VtZW50VHlwZXNUeXBlSG9sZGVydHJ1ZVR5cGVzZmFsc2VUeXBlc19nZXRUZXh0dHlwZXNUb1RleHR0cnVlOmZhbHNlOlR5cGVIb2xkZXIoZGVjbGFyZWQ9VGFyZ2V0SW5mb3R5cGVIb2xkZXJzdHlwZXNPZkludGVyZXN0bmV3VHlwZUhvbGRlcnNhZGRUeXBlSG9sZGVydHlwZUhvbGRlcmFkZEFzQ29weW5ld1R5cGVzT2ZJbnRlcmVzdGFkZFR5cGVIb2xkZXJzb3RoZXJUcnVlVHlwZXNvdGhlckZhbHNlVHlwZXNvdGhlclR5cGVzT2ZJbnRlcmVzdG5ld1RydWVUeXBlc25ld0ZhbHNlVHlwZXN0aGlzVHJ1ZVR5cGVzdGhpc0ZhbHNlVHlwZXNUYXJnZXRJbmZvKGRlY2xhcmVkVHlwZT10eXBlSG9sZGVycz1kZWNsYXJhdGlvbnNPZkludGVyZXN0PVR5cGVNYXBfdGFyZ2V0SW5mb01hcG5ld0luZm9NYXB0YXJnZXRJbmZvdHlwZU9mSW50ZXJlc3R0eXBlSG9sZGVySWZOb25OdWxsdHlwZUhvbGRlcklmTnVsbFR5cGVNYXAoY29tcHV0ZUNsYXNzUmVsYXRpb25Gcm9tVHlwZWlzSW5kaXJlY3RseUluc3RhbnRpYXRlZHN1YmNsYXNzZXNPZmZvckVhY2hTdHJpY3RTdWJjbGFzc09mYW55U3RyaWN0U3ViY2xhc3NPZnN1YnR5cGVzT2Zmb3JFYWNoU3RyaWN0U3VidHlwZU9mYW55U3RyaWN0U3VidHlwZU9maGF2ZUFueUNvbW1vblN1YnR5cGVzY2xzMXF1ZXJ5MWNsczJxdWVyeTJnZXRDbGFzc0hpZXJhcmNoeU5vZGVnZXRDbGFzc1NldENsYXNzSGllcmFyY2h5SW1wbGNsYXNzLWhpZXJhcmNoeV9jbGFzc0hpZXJhcmNoeU5vZGVzX2NsYXNzU2V0c2NsYXNzSGllcmFyY2h5Tm9kZXNjbGFzc1NldHNjbGFzc1NldGZvckVhY2hTdWJjbGFzc05vIENsYXNzU2V0IGZvciApOiBjbGFzc0hpZXJhcmNoeU5vZGVObyBDbGFzc0hpZXJhcmNoeU5vZGUgZm9yIGhhc1N1YnR5cGVoYXNTdWJjbGFzc3N1YmNsYXNzZXNCeU1hc2tzdWJjbGFzc2Vzc3RyaWN0aW5zdGFudGlhdGVkU3ViY2xhc3NDb3VudGFueVN1YmNsYXNzc3VidHlwZXNCeU1hc2tpbnN0YW50aWF0ZWRTdWJ0eXBlQ291bnRmb3JFYWNoU3VidHlwZWFueVN1YnR5cGVjbGFzc1NldEFjbGFzc1NldEJzdWJ0eXBlc09mQnN1YnR5cGVPZkFoYXNPbmx5SW5zdGFudGlhdGVkU3ViY2xhc3Nlc0l0ZXJhdGlvblN0ZXAuU0tJUF9TVUJDTEFTU0VTSXRlcmF0aW9uU3RlcC5DT05USU5VRUNsYXNzZXMgaW4gdGhlIGNsb3NlZCB3b3JsZCByZWxhdGVkIHRvIEluc3RhbnRpYXRlZCBjbGFzc2VzIGluIHRoZSBjbG9zZWQgd29ybGQ6Cmluc3RhbnRpYXRlZE9ubHl3aXRoUmVzcGVjdFRvX2luaGVyaXRlZEluVGhpc0NsYXNzQ2FjaGVNYXBfaW5oZXJpdGVkSW5TdWJ0eXBlQ2FjaGVNYXBDbGFzc0hpZXJhcmNoeU5vZGUvQ2xhc3NTZXQgbWlzbWF0Y2g6IF9lbnN1cmVDbGFzc1NldGdldERlY2xhcmF0aW9uX2Vuc3VyZUNsYXNzSGllcmFyY2h5Tm9kZXBhcmVudE5vZGVnZXRIaWVyYXJjaHlEZXB0aHN1YnR5cGVTZXRhZGRTdWJ0eXBlYXBwbGllZE1peGluZ2V0QXBwbGllZE1peGlucmVnaXN0ZXJNaXhpblVzZW1peGluU2V0X3VwZGF0ZVN1cGVyQ2xhc3NIaWVyYXJjaHlOb2RlRm9yQ2xhc3NpbXBsZW1lbnRzRnVuY3Rpb25faXNTdWJ0eXBlT2ZDbGFzc1NldCBmb3IgIGhhcyBub3QgYmVlbiBjb21wdXRlZCB5ZXQuZXhhY3RDbGFzc2V4YWN0Q2xhc3NOb2RlbWVtYmVySG9sZGluZ0NsYXNzU2V0bWl4aW5BcHBsaWNhdGlvbk5vZGVzdGhpc0NsYXNzaXNJbmhlcml0ZWRJblRoaXNDbGFzc09mX0luaGVyaXRlZEluVGhpc0NsYXNzQ2FjaGVfaW5oZXJpdGluZ0NsYXNzZXNfY29tcHV0ZUluaGVyaXRpbmdJblRoaXNDbGFzc1NldGhhc0xpdmVDbGFzc21lbWJlckhvbGRpbmdDbGFzc05vZGV2YWxpZGF0aW5nU2V0cHJvY2Vzc0hpZXJhcmNoeW1peGVyTm9kZWluaGVyaXRpbmdDbGFzc2luaGVyaXRpbmdDbGFzc05vZGV0aGlzQ2xhc3NTZXRfSW5oZXJpdGVkSW5TdWJ0eXBlQ2FjaGVfY29tcHV0ZUluaGVyaXRpbmdJblN1YnR5cGVTZXRzdWJjbGFzc0ltcGxlbWVudHNfTGl2ZVNldF9yZXN1bHRDbGFzc1F1ZXJ5U3ViY2xhc3NSZXN1bHRLaW5kRVhBQ1QxRVhBQ1QyU1VCQ0xBU1MxU1VCQ0xBU1MyU1VCVFlQRTFTVUJUWVBFMlN1YmNsYXNzUmVzdWx0U3ViY2xhc3NSZXN1bHQoLGNsYXNzZXM9dHlwZV9ncmFwaF9pbmZlcnJlckpDbG9zdXJlQ2FsbE1ldGhvZGRvTm90RW5xdWV1ZV9pbmZlcnJlZERhdGFCdWlsZGVyR3JhcGggaW5mZXJyZXJjcmVhdGVJbmZlcnJlckVuZ2luZUZvcnJ1bk92ZXJBbGxFbGVtZW50c2J1aWxkUmVzdWx0c2dldENhbGxlcnNPZkZvclRlc3RpbmdjcmVhdGVNZW1iZXJSZXN1bHRzdHlwZUluZm9ybWF0aW9uZGF0YU9mTWVtYmVyZnJlZVZhcmlhYmxlc2ZvckVhY2hNZW1iZXJUeXBlZ2V0U2NvcGVJbmZvZm9yRWFjaEZyZWVWYXJpYWJsZWdldEluZmVycmVkVHlwZU9mTWVtYmVyY29tcHV0ZUlzQ2FsbGVkT25jZWZvckVhY2hQYXJhbWV0ZXJUeXBlY2hlY2tzR3Jvd2FibGV0eXBlcy5jb25zdGFudHNDb25zdGFudFZhbHVlVHlwZU1hc2tzY29tcHV0ZVR5cGVNYXNrSlJlY29yZEZpZWxkSnNUb0VsZW1lbnRNYXBnZXRJbnRlcmZhY2VUeXBlZ2V0Q2FsbFN0cnVjdHVyZWdldFNlbGVjdG9yZ2V0TWV0aG9kZ2V0VHlwZWRlZlR5cGVnZXRTdXBlck1lbWJlcmdldE5hdGl2ZUJlaGF2aW9yRm9ySnNDYWxsZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0J1aWx0aW5DYWxsZ2V0TmF0aXZlQmVoYXZpb3JGb3JKc0VtYmVkZGVkR2xvYmFsQ2FsbGdldEltcG9ydGdldENsYXNzRGVmaW5pdGlvbmdldERhcnRUeXBlc2dldE1lbWJlckRlZmluaXRpb25nZXRDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzc0Zvck1lbWJlcmdldFNwYW5uYWJsZWdldENvbnN0cnVjdG9yQm9keWdldEdlbmVyYXRvckJvZHltYWtlUmVjb3JkQ29udGFpbmVyZ2V0U3RhdGljVHlwZVByb3ZpZGVyS2VybmVsVG9UeXBlSW5mZXJlbmNlTWFwS2VybmVsVG9Mb2NhbHNNYXBNZW1iZXJLaW5kLnJlZ3VsYXJNZW1iZXJLaW5kLmNvbnN0cnVjdG9yTWVtYmVyS2luZC5jb25zdHJ1Y3RvckJvZHlNZW1iZXJLaW5kLmNsb3N1cmVDYWxsTWVtYmVyS2luZC5jbG9zdXJlRmllbGRNZW1iZXJLaW5kLnNpZ25hdHVyZU1lbWJlcktpbmQuZ2VuZXJhdG9yQm9keXJlZ3VsYXJjb25zdHJ1Y3RvckJvZHljbG9zdXJlRmllbGRnZW5lcmF0b3JCb2R5TWVtYmVyRGVmaW5pdGlvblVuZXhwZWN0ZWQgTWVtYmVyS2luZCBDbGFzc0tpbmRDbGFzc0tpbmQucmVndWxhckNsYXNzS2luZC5jbG9zdXJlQ2xhc3NLaW5kLnJlY29yZFJlZ3VsYXJNZW1iZXJEZWZpbml0aW9ucmVndWxhci1tZW1iZXItZGVmaW5pdGlvblJlZ3VsYXJNZW1iZXJEZWZpbml0aW9uKGtpbmQ6bm9kZTosbG9jYXRpb246U3BlY2lhbE1lbWJlckRlZmluaXRpb25zcGVjaWFsLW1lbWJlci1kZWZpbml0aW9uU3BlY2lhbE1lbWJlckRlZmluaXRpb24oa2luZDpDbGFzc0RlZmluaXRpb25VbmV4cGVjdGVkIENsYXNzS2luZCBSZWd1bGFyQ2xhc3NEZWZpbml0aW9ucmVndWxhci1jbGFzcy1kZWZpbml0aW9uUmVndWxhckNsYXNzRGVmaW5pdGlvbihraW5kOmdldEZ1bmN0aW9uTm9kZWZvckVhY2hPcmRlcmVkUGFyYW1ldGVyQnlGdW5jdGlvbk5vZGV1c2VOYXRpdmVPcmRlcmluZ2ZvckVhY2hPcmRlcmVkUGFyYW1ldGVyVW5leHBlY3RlZCBmdW5jdGlvbiBkZWZpbml0aW9uIEluZmVycmVyRW5naW5lY29uY3JldGVUeXBlc2FuYWx5emVMaXN0QW5kRW5xdWV1ZWFuYWx5emVTZXRBbmRFbnF1ZXVlYW5hbHl6ZU1hcEFuZEVucXVldWVhZGRSZXR1cm5UeXBlRm9yTWV0aG9kdW51c2VkZm9yRWFjaEVsZW1lbnRNYXRjaGluZ2dldERlZmF1bHRUeXBlT2ZQYXJhbWV0ZXJoYXNBbHJlYWR5Q29tcHV0ZWRUeXBlT2ZQYXJhbWV0ZXJEZWZhdWx0c2V0RGVmYXVsdFR5cGVPZlBhcmFtZXRlcmNoZWNrSWZFeHBvc2VzVGhpc3JlY29yZEV4cG9zZXNUaGlzZXhwb3Nlc1RoaXNyZWNvcmRSZXR1cm5UeXBlcmVjb3JkVHlwZU9mRmllbGRyZWdpc3RlckF3YWl0cmVnaXN0ZXJZaWVsZHJlZ2lzdGVyQ2FsbGVkQ2xvc3VyZWluTG9vcHJlZ2lzdGVyQ2FsbGVkTWVtYmVyY2FsbGVlcmVnaXN0ZXJDYWxsZWRTZWxlY3RvcmlzQ29uZGl0aW9uYWx1cGRhdGVQYXJhbWV0ZXJBc3NpZ25tZW50c2FkZFRvUXVldWV1cGRhdGVTZWxlY3RvckluTWVtYmVycmV0dXJuVHlwZU9mTWVtYmVydHlwZU9mTWVtYmVydHlwZU9mUGFyYW1ldGVydHlwZU9mTmF0aXZlQmVoYXZpb3JjYW5GaWVsZEJlVXNlZEZvckdsb2JhbE9wdGltaXphdGlvbnNjYW5GdW5jdGlvblBhcmFtZXRlcnNCZVVzZWRGb3JHbG9iYWxPcHRpbWl6YXRpb25zSW5mZXJyZXJFbmdpbmVJbXBsZGVmYXVsdFR5cGVPZlBhcmFtZXRlcmFuYWx5emVkRWxlbWVudHNNQVhfQ0hBTkdFX0NPVU5Ub3ZlcmFsbFJlZmluZUNvdW50YWRkZWRJbkdyYXBoZ2VuZXJhdGl2ZUNvbnN0cnVjdG9yc0V4cG9zaW5nVGhpc3VwZGF0ZVNpZGVFZmZlY3Rzc2V0QWxsU2lkZUVmZmVjdHNBbmREZXBlbmRzT25Tb21ldGhpbmdtYXBwZWRUeXBlY29tcHV0ZUxVQkNhbGxUeXBlLmFjY2Vzc3NldFR5cGVNYXNrQ2FsbFR5cGUuZm9ySW5zZXRJdGVyYXRvclR5cGVNYXNrc2V0Q3VycmVudFR5cGVNYXNrc2V0TW92ZU5leHRUeXBlTWFza2FuYWx5emVkc3VjY2VlZGVkYmFpbGVkT3V0b3JpZ2luYWxUeXBlY2FsbHNHcm93YWJsZU1ldGhvZGFzc2lnbm1lbnRzYWRkQXNzaWdubWVudGtleUFzc2lnbm1lbnRzYWRkRW50cnlBc3NpZ25tZW50dmFsdWVBc3NpZ25tZW50c21hcEFzc2lnbm1lbnRzYWRkTWFwQXNzaWdubWVudG1hcmtBc0luZmVycmVkdHlwZUluZm9NYXBhbmFseXplQWxsRWxlbWVudHNiZWZvcmVBbmFseXNpc2J1aWxkV29ya1F1ZXVlcmVmaW5lYWxsb2NhdGVkU2V0c2FsbG9jYXRlZE1hcHNiYWlsZWRPdXRPbmFsbG9jYXRlZENsb3N1cmVzY29udGludWVBbmFseXppbmd0cmFjZWQgY2xvc3VyZSAgKGJhaWwpZ2l2ZVVwY2xlYXJBc3NpZ25tZW50c21heWJlUmVzdW1ldHJhY2VkVHlwZW1pZ2h0QmVQYXNzZWRUb0Z1bmN0aW9uQXBwbHljYWxsZWRFbGVtZW50bG9va3VwQ2FsbE1ldGhvZGNhbGxlZXNVbmV4cGVjdGVkIGNsb3N1cmUgYWxsb2NhdGlvbiBpbmZvIGJlZm9yZVRyYWNpbmdzZWVuVHlwZXNfaW5mb2F0IGFmdGVyIHJlZmluZUNvdW50Z2V0SW5mZXJyZWRTaWduYXR1cmVoYXNDbG9zdXJlQ2FsbFRhcmdldHM8Q2xvc3VyZS5jYWxsPmNvbmNyZXRlVGFyZ2V0c2dldEluZmVycmVkU2lnbmF0dXJlT2ZNZXRob2QgZm9yIHNvbWUgdW5rbm93biBraW5kIG9mIGNsb3N1cmUgOjogYWZ0ZXJBbmFseXNpc0luZmVycmVkICB0eXBlcy5wcm9jZXNzTG9vcEluZm9ybWF0aW9uQWRkZWQgIGVsZW1lbnRzIGluIGluZmVyZW5jaW5nIGdyYXBoLndpdGhNZW1iZXJjb21wdXRlTWVtYmVyQm9keVVuZXhwZWN0ZWQgbWVtYmVyIGRlZmluaXRpb246IGNvbXB1dGVNZW1iZXJUeXBlSW5mb3JtYXRpb25mdW5jdGlvbkNvbnN0YW50YWxsb2NhdGVDbG9zdXJlcmVmaW5lZFR5cGVhbGxvY2F0ZWRUeXBlc2lzRmllbGRJbml0aWFsaXplclBvdGVudGlhbGx5TnVsbGhhc0NhbGxUeXBlYWxsb2NhdGVkQ2FsbHNvbGRUeXBlYWJhbmRvbkluZmVyZW5jaW5nQU5PTUFMWSBXQVJOSU5HOiBtYXggcmVmaW5lbWVudCByZWFjaGVkIGZvciBoYXNTdGFibGVUeXBlc3RhYmlsaXplb3JkZXJlZFR5cGVJbmZvcm1hdGlvbnNyZW1vdmVBc3NpZ25tZW50Y2xvc3VyaXplZENvdW50dGFnQXNUZWFyT2ZmQ2xvc3VyZVBhcmFtZXRlck5vIGRlZmF1bHQgdHlwZSBmb3IgYWRkVXNlcnNPZmFkZFRvR3JhcGhtZW1iZXJUeXBlSW5mb3JtYXRpb25zcGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uc2NhbGxlcnNGb3JUZXN0aW5naXNGaWVsZFVzZWRCeUJhY2tlbmRpc0Z1bmN0aW9uVXNlZEJ5QmFja2VuZEtlcm5lbFR5cGVTeXN0ZW1TdHJhdGVneWNoZWNrQ2xhc3NFbnRpdHljaGVja01hcE5vZGVjaGVja1NldE5vZGVjaGVja0xpc3ROb2RlY2hlY2tMb29wUGhpTm9kZWNoZWNrUGhpTm9kZWNyZWF0ZVBhcmFtZXRlclR5cGVJbmZvcm1hdGlvbmdldENsb3N1cmVJbmZvbWVtYmVyVHlwZUluZm9ybWF0aW9uY3JlYXRlTWVtYmVyVHlwZUluZm9ybWF0aW9uS2VybmVsR2xvYmFsVHlwZUluZmVyZW5jZUVsZW1lbnREYXRhZ2xvYmFsLXR5cGUtaW5mZXJlbmNlLWVsZW1lbnQtZGF0YV9zZW5kTWFwX2l0ZXJhdG9yTWFwX2N1cnJlbnRNYXBfbW92ZU5leHRNYXBzZW5kTWFwaXRlcmF0b3JNYXBjdXJyZW50TWFwbW92ZU5leHRNYXBfbWFwc1RvTnVsbGRhcnQyanMuc291cmNlX2luZm9ybWF0aW9uLnBvc2l0aW9uUG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvbnNvdXJjZS1pbmZvcm1hdGlvbl9jb21wdXRlVGV4dHVyaVRleHQtW0Fic3RyYWN0UG9zaXRpb25Tb3VyY2VJbmZvcm1hdGlvblN0cmF0ZWd5U291cmNlTWFwcGVkTWFya2VyQ29kZVBvc2l0aW9uZ2V0UG9zaXRpb25Db2RlUG9zaXRpb25LaW5kLlNUQVJUQ29kZVBvc2l0aW9uS2luZC5FTkRDb2RlUG9zaXRpb25LaW5kLkNMT1NJTkdDb2RlUG9zaXRpb24oc3RhcnQ9ZW5kPSxjbG9zaW5nPUNvZGVQb3NpdGlvbk1hcENvZGVQb3NpdGlvblJlY29yZGVyX2NvZGVQb3NpdGlvbk1hcHJlZ2lzdGVyUG9zaXRpb25zcmVnaXN0ZXJDb2RlUG9zaXRpb25jb2RlUG9zaXRpb25Tb3VyY2VQb3NpdGlvbktpbmRTb3VyY2VQb3NpdGlvbktpbmQuU1RBUlRTb3VyY2VQb3NpdGlvbktpbmQuSU5ORVJTVEFSVElOTkVSQ29kZVBvc2l0aW9uS2luZENMT1NJTkdFTkRQb3NpdGlvblNvdXJjZUluZm9ybWF0aW9uUHJvY2Vzc29ydjJjb2RlUG9zaXRpb25SZWNvcmRlcmNvZGVQb3NpdGlvbk1hcHRyYWNlTGlzdGVuZXJzaW5saW5pbmdMaXN0ZW5lcmNvdmVyYWdlc291cmNlTWFwcGVyY3JlYXRlU291cmNlTWFwcGVyTm9kZVNvdXJjZUluZm9ybWF0aW9uZ2V0U291cmNlSW5mb3JtYXRpb25Ob2RlVG9Tb3VyY2VJbmZvcm1hdGlvbk1peGluY29tcHV0ZVNvdXJjZUluZm9ybWF0aW9uX0lubGluaW5nVHJhY2VMaXN0ZW5lciZUcmFjZUxpc3RlbmVyJk5vZGVUb1NvdXJjZUluZm9ybWF0aW9uTWl4aW5JbmxpbmluZ1RyYWNlTGlzdGVuZXJfZnJhbWVzb25TdGVwU3RlcEtpbmQuRlVOX0VYSVRsYXN0SW5saW5pbmdDb250ZXh0bmV3SW5saW5pbmdDb250ZXh0cG9wQ291bnRwdXNoZXNyZWdpc3RlclBvcHJlZ2lzdGVyUHVzaF9Qb3NpdGlvblRyYWNlTGlzdGVuZXImVHJhY2VMaXN0ZW5lciZOb2RlVG9Tb3VyY2VJbmZvcm1hdGlvbk1peGluUG9zaXRpb25UcmFjZUxpc3RlbmVyU3RlcEtpbmQuTk9fSU5GT3JlZ2lzdGVyUG9zaXRpb25zb3VyY2VQb3NpdGlvbktpbmRTdGVwS2luZC5GVU5fRU5UUllTdGVwS2luZC5DQUxMY2FsbFBvc2l0aW9uU3RlcEtpbmQuQUNDRVNTU3RlcEtpbmQuTkVXU3RlcEtpbmQuUkVUVVJOU3RlcEtpbmQuQlJFQUtTdGVwS2luZC5DT05USU5VRVN0ZXBLaW5kLlRIUk9XU3RlcEtpbmQuRVhQUkVTU0lPTl9TVEFURU1FTlRTdGVwS2luZC5JRl9DT05ESVRJT05TdGVwS2luZC5GT1JfSU5JVElBTElaRVJTdGVwS2luZC5GT1JfQ09ORElUSU9OU3RlcEtpbmQuRk9SX1VQREFURVN0ZXBLaW5kLldISUxFX0NPTkRJVElPTlN0ZXBLaW5kLkRPX0NPTkRJVElPTlN0ZXBLaW5kLlNXSVRDSF9FWFBSRVNTSU9OQ2FsbFBvc2l0aW9uY29kZVBvc2l0aW9uS2luZGdldFNlbWFudGljUG9zaXRpb25Gb3JDYWxscHVyZUFjY2Vzc3RhcmdldEFjY2Vzc1VuZXhwZWN0ZWQgcHJvcGVydHkgYWNjZXNzIE9mZnNldHN0YXRlbWVudE9mZnNldHN1YmV4cHJlc3Npb25PZmZzZXRsZWZ0VG9SaWdodE9mZnNldE9mZnNldFtzdGF0ZW1lbnRPZmZzZXQ9bGVmdFRvUmlnaHRPZmZzZXQ9c3ViZXhwcmVzc2lvbk9mZnNldD1CcmFuY2hLaW5kQnJhbmNoS2luZC5DT05ESVRJT05CcmFuY2hLaW5kLkxPT1BCcmFuY2hLaW5kLkNBVENIQnJhbmNoS2luZC5GSU5BTExZQnJhbmNoS2luZC5DQVNFQ09ORElUSU9OTE9PUFN0ZXBLaW5kRlVOX0VOVFJZRlVOX0VYSVRBQ0NFU1NFWFBSRVNTSU9OX1NUQVRFTUVOVElGX0NPTkRJVElPTkZPUl9JTklUSUFMSVpFUkZPUl9DT05ESVRJT05GT1JfVVBEQVRFV0hJTEVfQ09ORElUSU9ORE9fQ09ORElUSU9OU1dJVENIX0VYUFJFU1NJT05OT19JTkZPVHJhY2VMaXN0ZW5lcm9uU3RhcnRvbkVuZHB1c2hCcmFuY2hwb3BCcmFuY2hKYXZhU2NyaXB0VHJhY2VyY29kZVBvc2l0aW9uc2xpc3RlbmVyc29mZnNldFBvc2l0aW9uYWN0aXZlbm90aWZ5U3RhcnRub3RpZnlFbmRub3RpZnlQdXNoQnJhbmNobm90aWZ5UG9wQnJhbmNobm90aWZ5U3RlcGdldFN5bnRheE9mZnNldGdldE9mZnNldEZvck5vZGVicmFuY2hub2RlTGlzdF9oYW5kbGVGdW5jdGlvbmFjdGl2ZUJlZm9yZWVudHJ5T2Zmc2V0ZXhpdE9mZnNldHZpc2l0U3ViZXhwcmVzc2lvbmNvZGVPZmZzZXRvbGRTdGVwc29sZFBvc2l0aW9ucG9zaXRpb25Ob2RlY2FsbE9mZnNldENvdmVyYWdlX25vZGVzV2l0aEluZm9fbm9kZXNXaXRoSW5mb0NvdW50X25vZGVzV2l0aG91dEluZm9fbm9kZXNXaXRob3V0SW5mb0NvdW50X25vZGVzV2l0aG91dEluZm9Db3VudEJ5VHlwZV9ub2Rlc1dpdGhvdXRPZmZzZXRfbm9kZXNXaXRob3V0T2Zmc2V0Q291bnRyZWdpc3Rlck5vZGVXaXRoSW5mb3JlZ2lzdGVyTm9kZVdpdGhvdXRJbmZvcmVnaXN0ZXJOb2Rlc1dpdGhvdXRPZmZzZXRjb2xsYXBzZWdldENvdmVyYWdlUmVwb3J0JSkgbm9kZXMgd2l0aCBpbmZvLk5vIG5vZGVzLiBub2RlIHdpdGhvdXQgb2Zmc2V0LgpOb2RlcyB3aXRob3V0IGluZm8gKCkgYnkgcnVudGltZSB0eXBlOl9Db3ZlcmFnZUxpc3RlbmVyJlRyYWNlTGlzdGVuZXImTm9kZVRvU291cmNlSW5mb3JtYXRpb25NaXhpbkNvdmVyYWdlTGlzdGVuZXJDb2RlUG9zaXRpb25Db3ZlcmFnZWdldFNvdXJjZUxvY2F0aW9uZGFydDJqcy5qc19tb2RlbC5lbGVtZW50c0NsYXNzSGllcmFyY2h5Tm9kZXNNYXBLZXlKTGlicmFyeUpDbGFzc0tpbmRKQ2xhc3NLaW5kLm5vZGVKQ2xhc3NLaW5kLmNsb3N1cmVKQ2xhc3NLaW5kLnJlY29yZF9KQ2xhc3MmSW5kZXhlZENsYXNzJkNsYXNzSGllcmFyY2h5Tm9kZXNNYXBLZXlfY2xhc3NIaWVyYXJjaHlOb2RlSkNsYXNzSlR5cGVkZWZKTWVtYmVyS2luZEpNZW1iZXJLaW5kLmdlbmVyYXRpdmVDb25zdHJ1Y3RvckpNZW1iZXJLaW5kLmZhY3RvcnlDb25zdHJ1Y3RvckpNZW1iZXJLaW5kLmNvbnN0cnVjdG9yQm9keUpNZW1iZXJLaW5kLmZpZWxkSk1lbWJlcktpbmQuZ2V0dGVySk1lbWJlcktpbmQuc2V0dGVySk1lbWJlcktpbmQubWV0aG9kSk1lbWJlcktpbmQuY2xvc3VyZUZpZWxkSk1lbWJlcktpbmQuY2xvc3VyZUNhbGxNZXRob2RKTWVtYmVyS2luZC5nZW5lcmF0b3JCb2R5Sk1lbWJlcktpbmQuc2lnbmF0dXJlTWV0aG9kSk1lbWJlcktpbmQucmVjb3JkRmllbGRnZW5lcmF0aXZlQ29uc3RydWN0b3JmYWN0b3J5Q29uc3RydWN0b3JjbG9zdXJlQ2FsbE1ldGhvZHNpZ25hdHVyZU1ldGhvZHJlY29yZEZpZWxkSk1lbWJlclVuZXhwZWN0ZWQgSk1lbWJlcktpbmQgSkZ1bmN0aW9uSkNvbnN0cnVjdG9ySkdlbmVyYXRpdmVDb25zdHJ1Y3RvcmdlbmVyYXRpdmUtY29uc3RydWN0b3JKRmFjdG9yeUNvbnN0cnVjdG9yZmFjdG9yeS1jb25zdHJ1Y3RvckpDb25zdHJ1Y3RvckJvZHljb25zdHJ1Y3Rvci1ib2R5Y29uc3RydWN0b3JfYm9keUpNZXRob2RnZW5lcmF0b3ItYm9keWdlbmVyYXRvcl9ib2R5SkdldHRlckpTZXR0ZXJjbG9zdXJlLWNhbGwtbWV0aG9kY2xvc3VyZV9jYWxsSlNpZ25hdHVyZU1ldGhvZHNpZ25hdHVyZS1tZXRob2RKVHlwZVZhcmlhYmxlS2luZEpUeXBlVmFyaWFibGVLaW5kLmNsc0pUeXBlVmFyaWFibGVLaW5kLm1lbWJlckpUeXBlVmFyaWFibGVLaW5kLnR5cGVkZWZKVHlwZVZhcmlhYmxlS2luZC5sb2NhbEpUeXBlVmFyaWFibGV0eXBlLXZhcmlhYmxlVW5leHBlY3RlZCB0eXBlIHZhcmlhYmxlIGRlY2xhcmVyIGpzRWxlbWVudFByZWZpeEhUcmFjZXJUcmFjZXJ0cmFjZUFjdGl2ZXRyYWNlRmlsdGVyY2ZnaXNFbmFibGVkdHJhY2VDb21waWxhdGlvbmNvbXBpbGF0aW9ucHJpbnRQcm9wZXJ0eW1pbGxpc2Vjb25kc1NpbmNlRXBvY2h0cmFjZUdyYXBoaXJPYmplY3RUcmFjZXJVdGlsX2luZHRhZ05hbWViZWdpbl9lbmRfYWRkSW5kZW50cHJpbnRFbXB0eVByb3BlcnR5Zm9ybWF0UHJ0eWludmFsaWQgcHJvcGVydHkgdHlwZTogVFJBQ0VfRklMVEVSX1BBVFRFUk5fRlJPTV9FTlZJUk9OTUVOVFRSQUNFX0ZJTFRFUl9QQVRURVJOX0ZPUl9URVNUVFJBQ0VfRklMVEVSX1BBVFRFUk5Tc2FDb2RlR2VuZXJhdG9yQ2hlY2tlZE1vZGVIZWxwZXJnZXRTdGF0aWNVc2VnZW5lcmF0ZUFkZGl0aW9uYWxBcmd1bWVudHNQcm9wZXJ0eUNoZWNrZWRNb2RlSGVscGVyYWRkaXRpb25hbEFyZ3VtZW50cXVvdGVOYW1lVHlwZVZhcmlhYmxlQ2hlY2tlZE1vZGVIZWxwZXJGdW5jdGlvblR5cGVSZXByZXNlbnRhdGlvbkNoZWNrZWRNb2RlSGVscGVyRnV0dXJlT3JSZXByZXNlbnRhdGlvbkNoZWNrZWRNb2RlSGVscGVyU3VidHlwZUNoZWNrZWRNb2RlSGVscGVyQ2hlY2tlZE1vZGVIZWxwZXJzaGVscGVyc3N0cmluZ1R5cGVDYXN0c3RyaW5nVHlwZUNoZWNrZG91YmxlVHlwZUNhc3Rkb3VibGVUeXBlQ2hlY2tudW1UeXBlQ2FzdG51bVR5cGVDaGVja2Jvb2xUeXBlQ2FzdGJvb2xUeXBlQ2hlY2tpbnRUeXBlQ2FzdGludFR5cGVDaGVja251bWJlck9yU3RyaW5nU3VwZXJOYXRpdmVUeXBlQ2FzdG51bWJlck9yU3RyaW5nU3VwZXJOYXRpdmVUeXBlQ2hlY2tudW1iZXJPclN0cmluZ1N1cGVyVHlwZUNhc3RudW1iZXJPclN0cmluZ1N1cGVyVHlwZUNoZWNrc3RyaW5nU3VwZXJOYXRpdmVUeXBlQ2FzdHN0cmluZ1N1cGVyTmF0aXZlVHlwZUNoZWNrc3RyaW5nU3VwZXJUeXBlQ2FzdHN0cmluZ1N1cGVyVHlwZUNoZWNrbGlzdFR5cGVDYXN0bGlzdFR5cGVDaGVja2xpc3RTdXBlck5hdGl2ZVR5cGVDYXN0bGlzdFN1cGVyTmF0aXZlVHlwZUNoZWNrbGlzdFN1cGVyVHlwZUNhc3RsaXN0U3VwZXJUeXBlQ2hlY2tpbnRlcmNlcHRlZFR5cGVDYXN0aW50ZXJjZXB0ZWRUeXBlQ2hlY2twcm9wZXJ0eVR5cGVDYXN0cHJvcGVydHlUeXBlQ2hlY2tmdW5jdGlvblR5cGVDYXN0ZnVuY3Rpb25UeXBlQ2hlY2tmdXR1cmVPckNhc3RmdXR1cmVPckNoZWNrY2hlY2tlZE1vZGVIZWxwZXJCeU5hbWVnZXRDaGVja2VkTW9kZUhlbHBlcnR5cGVDYXN0Z2V0Q2hlY2tlZE1vZGVIZWxwZXJJbnRlcm5hbG5hdGl2ZUNoZWNrT25seWdldE5hdGl2ZUNoZWNrZWRNb2RlSGVscGVyZ2V0Q2hlY2tlZE1vZGVIZWxwZXJOYW1lSW50ZXJuYWxVbmV4cGVjdGVkIHR5cGU6IG5hdGl2ZUNoZWNrVHlwZUNhc3RUeXBlQ2hlY2tudW1iZXJPclN0cmluZ1N1cGVyTmF0aXZlbnVtYmVyT3JTdHJpbmdTdXBlcnN0cmluZ1N1cGVyTmF0aXZlc3RyaW5nU3VwZXJsaXN0U3VwZXJOYXRpdmVsaXN0U3VwZXJqc19iYWNrZW5kLnJ1bnRpbWVfdHlwZXNPblZhcmlhYmxlQ2FsbGJhY2tTaG91bGRFbmNvZGVUeXBlZGVmQ2FsbGJhY2tSdW50aW1lVHlwZXNDaGVja3NyZXF1aXJlZENoZWNrc1RyaXZpYWxUeXBlc0NoZWNrc190eXBlQ2hlY2tzX2FsbENsYXNzZXNSdW50aW1lVHlwZXNDaGVja3NCdWlsZGVyY29tcHV0ZVJlcXVpcmVkQ2hlY2tzVHJpdmlhbFJ1bnRpbWVUeXBlc0NoZWNrc0J1aWxkZXJfc3Vic3RpdHV0aW9uc2NsYXNzVXNlTWFwY2xhc3NVc2VkaXJlY3RJbnN0YW5jZWNoZWNrZWRJbnN0YW5jZWNoZWNrZWRUeXBlQXJndW1lbnRfcmVxdWlyZWRDaGVja3NfY29tcHV0ZUNoZWNrc2NvbXB1dGVDaGVja2VkQ2xhc3Nlc2ltcGxpY2l0SXNDaGVja3Njb21wdXRlQ2hlY2tlZEZ1bmN0aW9uc1J1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnNNaXhpbl90eXBlc19ydGlOZWVkaGFuZGxlZGVtcHR5VXNlY29tcHV0ZUNoZWNrc2NoZWNrc3N1cGVyQ2hlY2tzZXh0ZW5kc1N1cGVyQ2xhc3NUcml2aWFsbHlpc1RyaXZpYWxTdWJzdGl0dXRpb25jb21wdXRlU3Vic3RpdHV0aW9ubmVlZHNJc2luaGVyaXRlZENsYXNzZXNwcm9jZXNzU3VwZXJ0eXBlY2hlY2tlZENsYXNzY2hlY2tlZENsYXNzVXNlaW5oZXJpdHNGcm9tQ2hlY2tlZENsYXNzbmVlZHNUeXBlQXJndW1lbnRzRm9yQ2hlY2tlZENsYXNzY2xhc3NOZWVkc1R5cGVBcmd1bWVudHNpc0NoZWNrZWRpbXBsZW1lbnRzQ2hlY2tlZFRyaXZpYWxseWlzQ2hlY2tlZEdlbmVyaWNjaGVja0Zyb21TdXBlckNsYXNzZ2V0Q2xhc3Nlc1VzZWRJblN1YnN0aXR1dGlvbnNpbnN0YW50aWF0ZWRjbGFzc0NoZWNrc2NvbGxlY3RBbGxnZXRTdWJzdGl0dXRpb25hbHdheXNHZW5lcmF0ZUZ1bmN0aW9uVHJpdmlhbFJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnNSdW50aW1lVHlwZXNFbmNvZGVyZ2V0U2lnbmF0dXJlRW5jb2Rpbmd0aGlzX3RlbXBsYXRlRm9ySXNGdW5jdGlvblR5cGV0ZW1wbGF0ZUZvcklzRnV0dXJlT3JUeXBldGVtcGxhdGVGb3JJc1ZvaWRUeXBldGVtcGxhdGVGb3JJc0R5bmFtaWNUeXBldGVtcGxhdGVGb3JJc0pzSW50ZXJvcFR5cGVBcmd1bWVudG9uVmFyaWFibGVzaG91bGRFbmNvZGVUeXBlZGVmZ2V0SnNJbnRlcm9wVHlwZUFyZ3VtZW50c19SdW50aW1lVHlwZXNDaGVja3NfdHlwZUxpdGVyYWxzX1J1bnRpbWVUeXBlc0ltcGwmT2JqZWN0JlJ1bnRpbWVUeXBlc1N1YnN0aXR1dGlvbnNNaXhpblJ1bnRpbWVUeXBlc0ltcGxjaGVja2VkVHlwZUFyZ3VtZW50c2NoZWNrZWRCb3VuZHNjYWNoZWRSZXF1aXJlZENoZWNrc2NsYXNzVXNlTWFwRm9yVGVzdGluZ3R5cGVWYXJpYWJsZVRlc3RzZm9yUnRpTmVlZHNleHBsaWNpdElzQ2hlY2tzY2hlY2tlZEZ1bmN0aW9uVHlwZXN0eXBlTGl0ZXJhbHNsaXZlVHlwZVZpc2l0b3JvbkNsYXNzVHlwZVZpc2l0b3JTdGF0ZS5jb3ZhcmlhbnRUeXBlQXJndW1lbnRUeXBlVmlzaXRvclN0YXRlLmNvbnRyYXZhcmlhbnRUeXBlQXJndW1lbnRUeXBlVmlzaXRvclN0YXRlLnR5cGVMaXRlcmFsVHlwZVZpc2l0b3JTdGF0ZS5kaXJlY3R0ZXN0ZWRUeXBlVmlzaXRvcnZpc2l0ZWRTdXBlckNsYXNzZXNwcm9jZXNzTWV0aG9kVHlwZUFyZ3VtZW50c2lzRnVuY3Rpb25DaGVja2VkcHJvY2Vzc0NoZWNrZWRUeXBlbGl2ZUNsYXNzZXNtZXRob2ROZWVkc1R5cGVBcmd1bWVudHNSdW50aW1lVHlwZXNFbmNvZGVySW1wbF9yZXByZXNlbnRhdGlvbkdlbmVyYXRvcmdldFR5cGVWYXJpYWJsZU5hbWVnZXRUeXBlRW5jb2RpbmdlbmNvZGluZ2Z1bmN0aW9uKCMpIHsgcmV0dXJuICMgfWNvbnRleHROYW1lZnVuY3Rpb24gKCkgeyByZXR1cm4gIygjLCAjLCAjKTsgfWZ1bmNyZXRvcHRUeXBlUmVwcmVzZW50YXRpb25HZW5lcmF0b3JfcnRpVGFnc3R5cGVkZWZCaW5kaW5nc2VuY29kZVR5cGVkZWZyZXByZXNlbnRhdGlvbmdldEphdmFTY3JpcHRDbGFzc05hbWVnZXREeW5hbWljVmFsdWVnZXRWb2lkVmFsdWUtMWdldEpzSW50ZXJvcFR5cGVBcmd1bWVudFZhbHVlLTJudW1iZXJleHByZXNzaW9uVGVtcGxhdGVGb3InIGluICMjID09PSAtMSMgPT0gbnVsbCMgPT09IC0yYWRkUHJvcGVydHlzaG91bGRFbmNvZGV1bmFsaWFzZWRUeXBlb2xkQmluZGluZ3NlbmNvZGVkVHlwZWRlZlR5cGVDaGVja01hcHBpbmdob2xkZXJBcmd1bWVudENvbGxlY3RvcmNvbGxlY3Rpc1R5cGVBcmd1bWVudEZ1bmN0aW9uQXJndW1lbnRDb2xsZWN0b3JUeXBlVmlzaXRvclN0YXRlY292YXJpYW50VHlwZUFyZ3VtZW50Y29udHJhdmFyaWFudFR5cGVBcmd1bWVudFR5cGVWaXNpdG9yX3Zpc2l0ZWRGdW5jdGlvblR5cGVWYXJpYWJsZXNvblR5cGVWYXJpYWJsZW9uRnVuY3Rpb25UeXBlY292YXJpYW50QXJndW1lbnRVbmV4cGVjdGVkIFR5cGVWaXNpdG9yU3RhdGUgY29udHJhdmFyaWFudEFyZ3VtZW50cnRpVmFsdWVDbGFzc1VzZShfY29tcHV0ZUZ1bmN0aW9uVHlwZXNpZ25hdHVyZUZ1bmN0aW9uY2FsbEZ1bmN0aW9uanNfYmFja2VuZC5ydW50aW1lX3R5cGVzX2NvZGVnZW5DbGFzc0Z1bmN0aW9uVHlwZV9uZXh0SGFzaFR5cGVDaGVjayhjbHM9LG5lZWRzSXM9LHN1YnN0aXR1dGlvbj1DbGFzc0NoZWNrc0NsYXNzQ2hlY2tzKFR5cGVDaGVja3N0cml2aWFsanNJbnRlcm9wU3Vic3RpdHV0aW9uKGlzVHJpdmlhbD1pc0Z1bmN0aW9uPSxpc0pzSW50ZXJvcD0sYXJndW1lbnRzPXBhcmFtZXRlcnM9UnVudGltZVR5cGVzU3Vic3RpdHV0aW9uc2hhc1R5cGVBcmd1bWVudHNqc19iYWNrZW5kLnJ1bnRpbWVfdHlwZXNfbmV3ZW5jb2RlUmVjaXBlZW52aXJvbm1lbnRTdHJ1Y3R1cmVlbmNvZGVSZWNpcGVXaXRoVmFyaWFibGVzUmVwbGFjZUJ5QW55ZXZhbHVhdGVSZWNpcGVlbmNvZGVTaWduYXR1cmVfcnRpU3Vic3RpdHV0aW9uc2hhY2tUeXBlVmFyaWFibGVzVG9BbnlSZWNpcGVFbmNvZGVySW1wbC5nZXRTaWduYXR1cmVFbmNvZGluZ19SZWNpcGVHZW5lcmF0b3JfZW5jb2Rlcl9lbnZpcm9ubWVudF9yZWNpcGVfZnJhZ21lbnRzX2NvZGVzX2ZsdXNoQ29kZXNfc3RhcnRGdWxsVHlwZUVudmlyb25tZW50UmVjaXBlY2xhc3NUeXBlX2VtaXRDb2RlX2VtaXRJbnRlZ2VyX2VtaXRTdHJpbmdVbmVzY2FwZWRfZW1pdE5hbWVfZW1pdEV4dGVuc2lvbk9wX2luZGV4SW50b0NsYXNzVHlwZVZhcmlhYmxlc2VtaXROYW1lZEdyb3VwUnVsZXNldEVuY29kZXJfcmVjaXBlRW5jb2Rlcl9sZWZ0QnJhY2VzdHJpbmdQYXJ0X3JpZ2h0QnJhY2VfbGVmdEJyYWNrZXRfcmlnaHRCcmFja2V0X2NvbG9uX2NvbW1hX3F1b3RlX2lzT2JqZWN0ZW5jb2RlUnVsZXNldHJ1bGVzZXRjb25jYXRlbmF0ZVN0cmluZ3Nqb2luTGl0ZXJhbHNfZW5jb2RlUnVsZXRhcmdldFR5cGVfZW5jb2RlU3VwZXJ0eXBlX2VuY29kZVN1cGVydHlwZUludGVyZmFjZV9lbmNvZGVTdXBlcnR5cGVUeXBlVmFyaWFibGVzc3VwZXJ0eXBlQXJndW1lbnRfZW5jb2RlU3VwZXJ0eXBlQXJndW1lbnR0aGlzU3VwZXJ0eXBlc3VwZXJ0eXBlQXJndW1lbnRzX2VuY29kZVN1cGVydHlwZVR5cGVWYXJpYWJsZXVuaXZlcnNlLnNpZGVfZWZmZWN0c3NpZGUtZWZmZWN0c0ZMQUdfQ0hBTkdFU19JTkRFWEZMQUdfQ0hBTkdFU19JTlNUQU5DRV9QUk9QRVJUWUZMQUdfQ0hBTkdFU19TVEFUSUNfUFJPUEVSVFlGTEFHX0NIQU5HRVNfQ09VTlRGTEFHX0RFUEVORFNfT05fSU5ERVhfU1RPUkVGTEFHX0RFUEVORFNfT05fSU5TVEFOQ0VfUFJPUEVSVFlfU1RPUkVGTEFHX0RFUEVORFNfT05fU1RBVElDX1BST1BFUlRZX1NUT1JFRkxBR19ERVBFTkRTX09OX0NPVU5UX2ZsYWdzZnJvbUZsYWdzU2lkZUVmZmVjdHMuaGFzaENvZGVfZ2V0RmxhZ19zZXRGbGFnX2NsZWFyRmxhZ2dldENoYW5nZXNGbGFnc2dldERlcGVuZHNPbkZsYWdzZGVwZW5kc09uU3RhdGljUHJvcGVydHlTdG9yZWNoYW5nZXNTdGF0aWNQcm9wZXJ0eWRlcGVuZHNPbkluZGV4U3RvcmVjaGFuZ2VzSW5kZXhkZXBlbmRzT25JbnN0YW5jZVByb3BlcnR5U3RvcmVjaGFuZ2VzSW5zdGFuY2VQcm9wZXJ0eWNvbXB1dGVEZXBlbmRzT25GbGFnc2RlcGVuZHNPbmRlcGVuZHNGbGFnc1NpZGVFZmZlY3RzKHJlYWRzIG5vdGhpbmcgYW55dGhpbmcgaW5kZXggZmllbGQgc3RhdGljOyB3cml0ZXNTaWRlRWZmZWN0c0J1aWxkZXJfbWVtYmVyX2ZyZWVfZGVwZW5kaW5nZnJlZVNpZGVFZmZlY3RzQnVpbGRlcihtZW1iZXI9ZnJlZT1zaWRlRWZmZWN0cz1kZXBlbmRpbmc9ZGFydDJqcy5zb3VyY2VfaW5mb3JtYXRpb24ua2VybmVsS2VybmVsU291cmNlSW5mb3JtYXRpb25CdWlsZGVyd2l0aENvbnRleHRfZ2V0U291cmNlTG9jYXRpb25ObyBsb2NhdGlvbiBmb3VuZCBmb3IgX2J1aWxkRnVuY3Rpb25fYnVpbGRUcmVlTm9kZV9idWlsZEZ1bmN0aW9uRW5kX2J1aWxkRnVuY3Rpb25FeGl0X2J1aWxkQm9keV9idWlsZE1lbWJlckJvZHlfYnVpbGRNZW1iZXJFeGl0bmV3Q29udGV4dEtlcm5lbFNvdXJjZUxvY2F0aW9uY29tcHV0ZUtlcm5lbEVsZW1lbnROYW1lRm9yU291cmNlTWFwczxhbm9ueW1vdXMgZnVuY3Rpb24+Ljxhbm9ueW1vdXMgZnVuY3Rpb24+ZW5jbG9zaW5nTWVtYmVyZW5jbG9zaW5nTWVtYmVyTmFtZWpzLnNvdXJjZV9tYXBwaW5nSmF2YVNjcmlwdFNvdXJjZUluZm9ybWF0aW9uU3RyYXRlZ3lzb3VyY2VNYXBwZXJQcm92aWRlclNvdXJjZUluZm9ybWF0aW9uUmVhZGVyQ29kZVBvc2l0aW9uTGlzdGVuZXJTb3VyY2VNYXBwZXJQcm92aWRlclNvdXJjZU1hcHBlclByb3ZpZGVySW1wbFNvdXJjZU1hcHBlclNvdXJjZUxvY2F0aW9uc01hcHBlclNvdXJjZUluZm9ybWF0aW9uUHJvY2Vzc29yZGFydDJqcy5qc19oZWxwZXJzLmltcGFjdEJhY2tlbmRGZWF0dXJlQmFja2VuZEZlYXR1cmUubmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZ0JhY2tlbmRGZWF0dXJlLm5lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5bmVlZFRvSW5pdGlhbGl6ZUlzb2xhdGVBZmZpbml0eVRhZ25lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5QmFja2VuZEltcGFjdGdsb2JhbFVzZXNnbG9iYWxDbGFzc2Vzb3RoZXJJbXBhY3RzX2ZlYXR1cmVzZmVhdHVyZXNjcmVhdGVJbXBhY3R3b3JsZEltcGFjdEJ1aWxkZXJvdGhlckltcGFjdEJhY2tlbmRJbXBhY3RzX25ld1J0aV9nZXRSdW50aW1lVHlwZUFyZ3VtZW50X2NvbXB1dGVTaWduYXR1cmVfbWFpbldpdGhBcmd1bWVudHNfYXN5bmNCb2R5X3N5bmNTdGFyQm9keV9hc3luY1N0YXJCb2R5X3R5cGVWYXJpYWJsZUJvdW5kQ2hlY2tfYWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25fZmFsbFRocm91Z2hFcnJvcl9hc0NoZWNrX3Rocm93Tm9TdWNoTWV0aG9kX3N0cmluZ1ZhbHVlc19udW1WYWx1ZXNfYm9vbFZhbHVlc19udWxsVmFsdWVfbGlzdFZhbHVlc190aHJvd1J1bnRpbWVFcnJvcl90aHJvd1Vuc3VwcG9ydGVkRXJyb3Jfc3VwZXJOb1N1Y2hNZXRob2RfY29uc3RhbnRNYXBMaXRlcmFsX2NvbnN0YW50U2V0TGl0ZXJhbF9zeW1ib2xDb25zdHJ1Y3Rvcl9jb25zdFN5bWJvbF9hc3NlcnRXaXRob3V0TWVzc2FnZV9hc3NlcnRXaXRoTWVzc2FnZV9hc3luY0ZvckluX3N0cmluZ0ludGVycG9sYXRpb25fc3RyaW5nSnV4dGFwb3NpdGlvbl9jYXRjaFN0YXRlbWVudF90aHJvd0V4cHJlc3Npb25fbGF6eUZpZWxkX3R5cGVMaXRlcmFsX3N0YWNrVHJhY2VJbkNhdGNoX3N5bmNGb3JJbl90eXBlVmFyaWFibGVFeHByZXNzaW9uX3R5cGVDaGVja19nZW5lcmljVHlwZUNoZWNrX2dlbmVyaWNJc0NoZWNrX3R5cGVWYXJpYWJsZVR5cGVDaGVja19mdW5jdGlvblR5cGVDaGVja19mdXR1cmVPclR5cGVDaGVja19uYXRpdmVUeXBlQ2hlY2tfY2xvc3VyZV9pbnRlcmNlcHRvclVzZV9udW1DbGFzc2VzX2xpc3RPclN0cmluZ0NsYXNzZXNfbmF0aXZlT3JFeHRlbmRzQ2xhc3NfbGlzdENsYXNzZXNfanNJbmRleGluZ0JlaGF2aW9yX3RyYWNlSGVscGVyX2Fzc2VydFVucmVhY2hhYmxlX3J1bnRpbWVUeXBlU3VwcG9ydF9kZWZlcnJlZExvYWRpbmdfbm9TdWNoTWV0aG9kU3VwcG9ydF9sb2FkTGlicmFyeV9tZW1iZXJDbG9zdXJlX3N0YXRpY0Nsb3N1cmVfdHlwZVZhcmlhYmxlTWlycm9yX2dlbmVyaWNJbnN0YW50aWF0aW9uX3J0aUFkZFJ1bGVzbmV3UnRpSW1wYWN0c2xpc3RWYWx1ZXNtYWluV2l0aEFyZ3VtZW50c2FzeW5jQm9keXN5bmNTdGFyQm9keWFzeW5jU3RhckJvZHl0eXBlVmFyaWFibGVCb3VuZENoZWNrYWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25fbmVlZHNTdHJpbmdOZWVkZWQgdG8gZW5jb2RlIHRoZSBtZXNzYWdlLl9uZWVkc0xpc3ROZWVkZWQgdG8gZW5jb2RlIHRoZSBhcmd1bWVudHMgZm9yIHRocm93IE5vU3VjaE1ldGhvZEVycm9yLk5lZWRlZCB0byBlbmNvZGUgdGhlIG5hbWUgZm9yIHRocm93IE5vU3VjaE1ldGhvZEVycm9yLnN0cmluZ1ZhbHVlc251bVZhbHVlc2ludFZhbHVlc2RvdWJsZVZhbHVlc2Jvb2xWYWx1ZXNzdXBlck5vU3VjaE1ldGhvZF9uZWVkc0ludE5lZWRlZCB0byBlbmNvZGUgdGhlIGludm9jYXRpb24ga2luZCBvZiBzdXBlci5ub1N1Y2hNZXRob2QuTmVlZGVkIHRvIGVuY29kZSB0aGUgYXJndW1lbnRzIG9mIHN1cGVyLm5vU3VjaE1ldGhvZC5OZWVkZWQgdG8gZW5jb2RlIHRoZSBuYW1lIG9mIHN1cGVyLm5vU3VjaE1ldGhvZC5jb25zdGFudE1hcExpdGVyYWxjb25zdGFudFNldExpdGVyYWxzeW1ib2xDb25zdHJ1Y3RvcmNvbnN0U3ltYm9sYXNzZXJ0V2l0aG91dE1lc3NhZ2Vhc3NlcnRXaXRoTWVzc2FnZWFzeW5jRm9ySW5zdHJpbmdJbnRlcnBvbGF0aW9uU3RyaW5ncyBhcmUgY3JlYXRlZC5zdHJpbmdKdXh0YXBvc2l0aW9uU3RyaW5nLmNvbmNhdCBpcyB1c2VkLm51bGxMaXRlcmFsYm9vbExpdGVyYWxpbnRMaXRlcmFsZG91YmxlTGl0ZXJhbHN0cmluZ0xpdGVyYWxjYXRjaFN0YXRlbWVudGxhenlGaWVsZHN0YWNrVHJhY2VJbkNhdGNoc3luY0ZvckludHlwZVZhcmlhYmxlRXhwcmVzc2lvbk5lZWRlZCBmb3IgYWNjZXNzaW5nIGEgdHlwZSB2YXJpYWJsZSBsaXRlcmFsIG9uIHRoaXMuZ2VuZXJpY1R5cGVDaGVja2dlbmVyaWNJc0NoZWNrdHlwZVZhcmlhYmxlVHlwZUNoZWNrZnV0dXJlT3JUeXBlQ2hlY2tuYXRpdmVUeXBlQ2hlY2tpbnRlcmNlcHRvclVzZW51bUNsYXNzZXNsaXN0T3JTdHJpbmdDbGFzc2VzbmF0aXZlT3JFeHRlbmRzQ2xhc3NsaXN0Q2xhc3Nlc2pzSW5kZXhpbmdCZWhhdmlvcnJ1bnRpbWVUeXBlU3VwcG9ydGRlZmVycmVkTG9hZGluZ25vU3VjaE1ldGhvZFN1cHBvcnRtZW1iZXJDbG9zdXJldHlwZVZhcmlhYmxlTWlycm9yZ2V0R2VuZXJpY0luc3RhbnRpYXRpb25ydGlBZGRSdWxlc05lZWRlZCB0byBlbmNvZGUgdGhlIG5ldyBSVEkgcnVsZXNldC5qc19iYWNrZW5kLmJhY2tlbmQuY29kZWdlbl9saXN0ZW5lckNvZGVnZW5FbnF1ZXVlckxpc3RlbmVyX2ltcGFjdHNfYmFja2VuZFVzYWdlX2N1c3RvbUVsZW1lbnRzQW5hbHlzaXNfbmF0aXZlRW5xdWV1ZXJfaXNOb1N1Y2hNZXRob2RVc2VkX2lzTmV3UnRpVXNlZG1ldGhvZE5lZWRzU2lnbmF0dXJlX3JlZ2lzdGVyQ29tcHV0ZVNpZ25hdHVyZW9uSW5zdGFudGlhdGVkVHlwZV9jb21wdXRlTWFpbkltcGFjdHByb2Nlc3NOYXRpdmVDbGFzc2VzbmV3UnRpSW1wYWN0X2NvbXB1dGVJbXBhY3RGb3JDb21waWxlVGltZUNvbnN0YW50X2NvbXB1dGVJbXBhY3RGb3JDb21waWxlVGltZUNvbnN0YW50SW50ZXJuYWxfY29tcHV0ZUltcGFjdEZvckluc3RhbnRpYXRlZENvbnN0YW50VHlwZXJlZ2lzdGVyVHlwZUNvbnN0YW50X3Byb2Nlc3NDbGFzc0N1c3RvbUVsZW1lbnRzQW5hbHlzaXNCYXNlZGVtYW5kZWRDdXN0b21FbGVtZW50c1Jlc29sdXRpb25BbmFseXNpc2JhY2tlbmRVc2FnZUJ1aWxkZXJhbGxDbGFzc2VzU2VsZWN0ZWRyZWdpc3RlclR5cGVMaXRlcmFsc2VsZWN0ZWRDbGFzc2VzQ3VzdG9tRWxlbWVudHNDb2RlZ2VuQW5hbHlzaXNuZWVkc1RhYmxlbmVlZHNDbGFzc2FjdGl2ZUNsYXNzZXNjb21wdXRlRXNjYXBpbmdDb25zdHJ1Y3RvcnNDdXN0b21FbGVtZW50c0FuYWx5c2lzSm9pbmZvclJlc29sdXRpb25uZXdBY3RpdmVDbGFzc2VzZXNjYXBpbmdDb25zdHJ1Y3RvcnNyZWdpc3Rlckdsb2JhbEZ1bmN0aW9uRGVwZW5kZW5jeV9tYWtlVHlwZUNvbnN0YW50anNfYmFja2VuZC5iYWNrZW5kLmltcGFjdF90cmFuc2Zvcm1lckltcGFjdFRyYW5zZm9ybWVyUmVzb2x1dGlvbkltcGFjdEphdmFTY3JpcHRJbXBhY3RUcmFuc2Zvcm1lcnByb2Nlc3NCYWNrZW5kSW1wYWN0ZmVhdHVyZWhhc0FzQ2FzdGhhc1R5cGVMaXRlcmFsb25Jc0NoZWNrcmVnaXN0ZXJDbGFzc1VzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbHJlZ2lzdGVyTWV0aG9kVXNpbmdUeXBlVmFyaWFibGVMaXRlcmFscmVnaXN0ZXJMb2NhbEZ1bmN0aW9uVXNpbmdUeXBlVmFyaWFibGVMaXRlcmFsbWFwTGl0ZXJhbFVzZW1hcExpdGVyYWxzc2V0TGl0ZXJhbFVzZXNldExpdGVyYWxzbGlzdExpdGVyYWxVc2VsaXN0TGl0ZXJhbHNydW50aW1lVHlwZVVzZXJ1bnRpbWVUeXBlVXNlc3JlZ2lzdGVyUnVudGltZVR5cGVVc2Vjb25zdFN5bWJvbE5hbWVzY29uc3RhbnRMaXRlcmFsc1VuZXhwZWN0ZWQgY29uc3RhbnQgbGl0ZXJhbDogY2xhc3NFbnRpdHlzZWVuQ2xhc3Nlc0NvZGVnZW5JbXBhY3RUcmFuc2Zvcm1lcm9uSXNDaGVja0ZvckNvZGVnZW5oYXNJbnN0YW50aWF0ZWROYXRpdmVDbGFzc2VzanNfYmFja2VuZC5pbnRlcmNlcHRvcl9kYXRhaXNJbnRlcmNlcHRlZE1ldGhvZGZpZWxkSGFzSW50ZXJjZXB0ZWRHZXR0ZXJmaWVsZEhhc0ludGVyY2VwdGVkU2V0dGVyaXNJbnRlcmNlcHRlZE5hbWVpc0ludGVyY2VwdGVkU2VsZWN0b3Jpc0ludGVyY2VwdGVkTWl4aW5TZWxlY3RvcmlzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzc2dldEludGVyY2VwdGVkQ2xhc3Nlc09ubWF5R2VuZXJhdGVJbnN0YW5jZW9mQ2hlY2thZGRJbnRlcmNlcHRvcnNhZGRJbnRlcmNlcHRvcnNGb3JOYXRpdmVDbGFzc01lbWJlcnNJbnRlcmNlcHRvckRhdGFJbXBsaW50ZXJjZXB0b3ItZGF0YWludGVyY2VwdGVkTWVtYmVyc2NsYXNzZXNNaXhlZEludG9JbnRlcmNlcHRlZENsYXNzZXNfaW50ZXJjZXB0ZWRNaXhpbkVsZW1lbnRzX2ludGVyY2VwdGVkQ2xhc3Nlc0NhY2hlX25vQ2xhc3Nlc2ludGVyY2VwdGVkTWVtYmVyc0NvdW50X2lzQ29tcGlsZVRpbWVPbmx5Q2xhc3NuYXRpdmVTdWJjbGFzc2VzbmF0aXZlU3ViY2xhc3Nlc09mTWl4aW5JbnRlcmNlcHRvckRhdGFCdWlsZGVySW1wbF9pbnRlcmNlcHRlZEVsZW1lbnRzX2ludGVyY2VwdGVkQ2xhc3Nlc19jbGFzc2VzTWl4ZWRJbnRvSW50ZXJjZXB0ZWRDbGFzc2VzX2ludGVyY2VwdG9yRGF0YWludGVyY2VwdG9yc09uZVNob3RJbnRlcmNlcHRvck9uZVNob3RJbnRlcmNlcHRvcihzZWxlY3Rvcj0sa2V5PVNwZWNpYWxpemVkR2V0SW50ZXJjZXB0b3JTcGVjaWFsaXplZEdldEludGVyY2VwdG9yKGtleT1kYXJ0MmpzLmpzX2VtaXR0ZXJOYXRpdmVDbGFzc0ZpbmRlck5hdGl2ZUVucXVldWVyY2F1c2VOYXRpdmVFbnF1ZXVlckJhc2VfcmVnaXN0ZXJlZENsYXNzZXNfdW51c2VkQ2xhc3Nlc19hbGxVc2VkTWVzc2FnZWVuYWJsZUxpdmVUeXBlQW5hbHlzaXNfcmVnaXN0ZXJUeXBlVXNlc19wcm9jZXNzTmF0aXZlQmVoYXZpb3J1bnVzZWRCZWZvcmVtYXRjaGluZ0NsYXNzZXNfZmluZFVudXNlZENsYXNzZXNNYXRjaGluZ25hdGl2ZUNsYXNzbmF0aXZlVHlwZXNwZWNUeXBlIHdhcyBfb25GaXJzdE5hdGl2ZUNsYXNzQWxsIG5hdGl2ZSB0eXBlcyBtYXJrZWQgYXMgdXNlZCBkdWUgdG8gX2ZpbmROYXRpdmVFeGNlcHRpb25zRXhjZXB0aW9uX25hdGl2ZUNsYXNzRmluZGVyX25hdGl2ZUNsYXNzZXNuYXRpdmVDbGFzc2VzRm9yVGVzdGluZ3JlZ2lzdGVyZWRDbGFzc2VzRm9yVGVzdGluZ25hdGl2ZUNsYXNzZXNjb21wdXRlTmF0aXZlQ2xhc3Nlc2ZvcmNlZCBuYXRpdmUgZWxlbWVudHMgdXNlZCwgIG5hdGl2ZSBlbGVtZW50cyBkZWFkLk5hdGl2ZUNvZGVnZW5FbnF1ZXVlcl9kb25lQWRkU3VidHlwZXN3YXMgcmVzb2x2ZWRfYWRkU3VidHlwZXNkaXJlY3RTdWJ0eXBlcyBuYXRpdmUgY2xhc3NlcywgIG5hdGl2ZSBjbGFzc2VzIG9taXR0ZWQuVGFyZ2V0Q2hlY2tzU3RhY2tGcmFtZWxldEJpbmRpbmdzdHlwZUluZmVyZW5jZU1hcHN0YXRpY1R5cGVQcm92aWRlcktlcm5lbFNzYUdyYXBoQnVpbGRlcl9pblRyeVN0YXRlbWVudGxvY2Fsc0hhbmRsZXJsb29wRGVwdGhqdW1wVGFyZ2V0c3RhcmdldEVsZW1lbnRfaW5pdGlhbFRhcmdldEVsZW1lbnRfY2xvc3VyZURhdGFMb29rdXBfdHJhY2VyX3J0aUVuY29kZXJfY3VycmVudEltcGxpY2l0SW5zdGFudGlhdGlvbnNfaW5mb1JlcG9ydGVyX3JldGhyb3dhYmxlRXhjZXB0aW9uX2xvb3BIYW5kbGVyX3R5cGVCdWlsZGVyX2luRXhwcmVzc2lvbk9mVGhyb3dfaW5saW5pbmdTdGFja19yZXR1cm5Mb2NhbF9yZXR1cm5UeXBlX2luTGF6eUluaXRpYWxpemVyRXhwcmVzc2lvbl9jdXJyZW50RnJhbWVsYXN0T3BlbmVkQmxvY2tfaXNSZWFjaGFibGVsYXN0QWRkZWRQYXJhbWV0ZXJlbGlkZWRQYXJhbWV0ZXJzX2Z1bmN0aW9uVHlwZVBhcmFtZXRlckxvY2Fsc19lbnRlckZyYW1lX3NvdXJjZUluZm9ybWF0aW9uQnVpbGRlcl9sb2NhbHNNYXBfbGV0QmluZGluZ3NfdHlwZUluZmVyZW5jZU1hcF9hYnN0cmFjdFZhbHVlRG9tYWluX2luZmVycmVkRGF0YXB1c2hDaGVja051bGxfY2xvc2VBbmRHb3RvRXhpdGlzQWJvcnRlZG9wZW5OZXdCbG9ja25ld0Jsb2NrYWRkUGFyYW1ldGVyd3JhcFN0YXRlbWVudEdyYXBod3JhcEV4cHJlc3Npb25HcmFwaF9idWlsZExpdGVyYWxMaXN0X2NhbGxTZXRSdW50aW1lVHlwZUluZm9XaXRoVHlwZUFyZ3VtZW50c3J0aUlucHV0c25ld09iamVjdF9jYWxsU2V0UnVudGltZVR5cGVJbmZvX2hhbmRsZUluVHJ5U3RhdGVtZW50X2dldEZsYWdWYWx1ZWZsYWdOYW1lTUlOSUZJRURNVVNUX1JFVEFJTl9NRVRBREFUQVVTRV9DT05URU5UX1NFQ1VSSVRZX1BPTElDWVVTRV9ORVdfUlRJX2dldFN0YXRpY1R5cGVfZ2V0U3RhdGljRm9ySW5JdGVyYXRvclR5cGVnZXRGb3JJbkl0ZXJhdG9yVHlwZV9lZmZlY3RpdmVUYXJnZXRFbGVtZW50Rm9yY2FsbFNvdXJjZUluZm9ybWF0aW9uX2xlYXZlRnJhbWVfYnVpbGRFeHRlcm5hbEZ1bmN0aW9uTm9kZV9lbnN1cmVEZWZhdWx0QXJndW1lbnRWYWx1ZXNfYnVpbGRGdW5jdGlvbk5vZGVfYnVpbGRGaWVsZE5vIGNhc2UgaW1wbGVtZW50ZWQgdG8gaGFuZGxlIHRhcmdldDogX2J1aWxkQ29uc3RydWN0b3JfYnVpbGRDb25zdHJ1Y3RvckJvZHlvcmlnaW5hbENsb3N1cmVOb2RlVW5leHBlY3RlZCBmdW5jdGlvbiBzaWduYXR1cmU6ICBpbnNpZGUgYSBub24tY2xvc3VyZTogX2J1aWxkTWV0aG9kU2lnbmF0dXJlTmV3UnRpX2J1aWxkTWV0aG9kU2lnbmF0dXJlX2J1aWxkR2VuZXJhdG9yQm9keV9mdW5jdGlvbk5vZGVPZkludmFsaWQgZ3JhcGggZm9yICAoYm9keSlfcmVnaXN0ZXJEZWZhdWx0VmFsdWVObyBjb25zdGFudCBjb21wdXRlZCBmb3IgX29wZW5GdW5jdGlvbnJlYWRUaGlzcG90ZW50aWFsbHlDaGVja09yVHJ1c3RUeXBlT2ZQYXJhbWV0ZXJfZ2V0RGFydFR5cGVJZlZhbGlkZmllbGRWYWx1ZWNoZWNrSW5zdHJ1Y3Rpb25wb3RlbnRpYWxseUNoZWNrT3JUcnVzdFR5cGVPZkFzc2lnbm1lbnRfY2xvc2VGdW5jdGlvbnBvcEJvb2xpZmllZHBvdGVudGlhbGx5Q2hlY2tPclRydXN0VHlwZU9mQ29uZGl0aW9uX2FkZENsYXNzVHlwZVZhcmlhYmxlc0lmTmVlZGVkbmVlZHNUeXBlQXJndW1lbnRzX3R5cGVWYXJpYWJsZXR5cGVWYXJpYWJsZVR5cGVnZXRUeXBlVmFyaWFibGVBc0xvY2FsZGlyZWN0TG9jYWxzX2FkZEZ1bmN0aW9uVHlwZVZhcmlhYmxlc0lmTmVlZGVkZWxpZGVUeXBlUGFyYW1ldGVyc19jb21wdXRlVHlwZUFyZ3VtZW50RGVmYXVsdFZhbHVlY29uc3RydWN0b3JEYXRhX2J1aWxkSW5pdGlhbGl6ZXJzY29uc3RydWN0b3JBcmd1bWVudHNpc0N1c3RvbUVsZW1lbnRObyBpbml0aWFsaXplciB2YWx1ZSBmb3IgZmllbGQgc3Vic3RJbkNvbnRleHRfYWRkSW1wbGljaXRJbnN0YW50aWF0aW9uYW5hbHl6ZVR5cGVBcmd1bWVudE5ld1J0aV9yZW1vdmVJbXBsaWNpdEluc3RhbnRpYXRpb25jb25zdHJ1Y3RvckNoYWluYm9keUNhbGxJbnB1dHNpbmxpbmVkQ29uc3RydWN0b3JfaW5saW5lZEZyb21pc0JveGVkc2NvcGVEYXRhZ2V0Q2FwdHVyZWRTY29wZXJlcXVpcmVzQ29udGV4dEJveGlubGluZWRDb25zdHJ1Y3RvckNsYXNzYW5hbHl6ZVR5cGVBcmd1bWVudF90cnlJbmxpbmVNZXRob2RfaW52b2tlQ29uc3RydWN0b3JCb2R5dXBkYXRlTG9jYWxfaXNFbXB0eVN0YXRlbWVudGlubGluZWRUYXJnZXRfZW5zdXJlVHlwZVZhcmlhYmxlc0ZvckluaXRpYWxpemVyc2luY2x1ZGVkQ2xhc3Nlc19jb2xsZWN0RmllbGRWYWx1ZXNVbmV4cGVjdGVkIG1lbWJlciBkZWZpbml0aW9uIGlnbm9yZUFsbG9jYXRvckFuYWx5c2lzX2lzUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcmJ1dCBmb3VuZCBmb3VuZFN1cGVyT3JSZWRpcmVjdENhbGxfaW5saW5lU3VwZXJJbml0aWFsaXplcl9pbmxpbmVSZWRpcmVjdGluZ0luaXRpYWxpemVyaXIuSW52YWxpZEluaXRpYWxpemVyIG5vdCBoYW5kbGVkVW5oYW5kbGVkIGluaXRpYWxpemVyIGlyLkFsbCBjb25zdHJ1Y3RvcnMgc2hvdWxkIGhhdmUgc3VwZXItIG9yIHJlZGlyZWN0aW5nLSBpbml0aWFsaXplcnMsIGV4Y2VwdCBPYmplY3QoKV9ub3JtYWxpemVBbmRCdWlsZEFyZ3VtZW50c2J1aWx0QXJndW1lbnRzcG9zaXRpb25hbEluZGV4Y29ycmVzcG9uZGluZ05hbWVkc3VwZXJPclJlZGlyZWN0Q29uc3RydWN0b3JfaW5saW5lU3VwZXJPclJlZGlyZWN0Q29tbW9uY2FsbGVyQ2xhc3NvbGRTY29wZUluZm9zY29wZUluZm9uZXdTY29wZUluZm9fYnVpbGRHZW5lcmF0b3JfY2hlY2tzRm9yRnVuY3Rpb25faGFuZGxlSWZ2aXNpdENvbmRpdGlvbnZpc2l0VGhlbnZpc2l0RWxzZWVtcHR5UGFyYW1ldGVyc19hZGRDb21tZW50IGluZmVycmVkIGFzIFtlbXB0eV1zdGF0ZW1lbnRUZW1wbGF0ZVlpZWxkaW5nX2dlbmVyYXRlZEVudHJ5SXNFbXB0eV9wb3RlbnRpYWxseUFkZEZ1bmN0aW9uUGFyYW1ldGVyVHlwZUNoZWNrc3RhcmdldENoZWNrc2NoZWNrVHlwZVBhcmFtZXRlcnNfY2hlY2tUeXBlVmFyaWFibGVCb3VuZHNub2RlSXNDb25zdHJ1Y3RvckJvZHlfaGFuZGxlUGFyYW1ldGVyaXNCb3hlZFZhcmlhYmxlbmV3UGFyYW1ldGVyTm8gaW5pdGlhbCBpbnN0cnVjdGlvbiBmb3IgY2hlY2tBbGxQYXJhbWV0ZXJzY2hlY2tDb3ZhcmlhbnRQYXJhbWV0ZXJzdHJ1c3RUeXBlT2ZQYXJhbWV0ZXJfYXNzZXJ0SXNUeXBlVGhlIHR5cGUgYXJndW1lbnQgJycgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgdHlwZSB2YXJpYWJsZSBib3VuZCAnJyBvZiB0eXBlIHZhcmlhYmxlICduYXRpdmVOYW1ldGVtcGxhdGVSZWNlaXZlcnRlbXBsYXRlQXJndW1lbnRzIy5fcHVzaFN0YXRpY0ludm9jYXRpb24gPSB1bmNhY2hlZEV4cHJlc3Npb25UZW1wbGF0ZXBhcmFtZXRlck1hcGVsaWRlZFBhcmFtZXRlclNldGlzR2VuZXJhdGl2ZUNvbnN0cnVjdG9yQm9keV9kZWZhdWx0VmFsdWVGb3JQYXJhbWV0ZXJfaW5zZXJ0Q292ZXJhZ2VDYWxsY2hlY2tMb2FkbG9hZElkcHJlZml4Q29uc3RhbnR1cmlDb25zdGFudE5vbi1lbXB0eSBpbnN0cnVjdGlvbiBzdGFjay5Ob24tZW1wdHkgaW5zdHJ1Y3Rpb24gc3RhY2tfdmlzaXRUaHJvd0V4cHJlc3Npb25kZWZlcnJlZENvbnN0YW50X2VtaXRSZXR1cm5idWlsZEluaXRpYWxpemVyYnVpbGRDb25kaXRpb25idWlsZFVwZGF0ZWp1bXBUYXJnZXRoYW5kbGVMb29wZ2V0Q2FwdHVyZWRMb29wU2NvcGVfYnVpbGRBc3luY0ZvckluX2J1aWxkRm9ySW5JbmRleGFibGVfYnVpbGRGb3JJbkl0ZXJhdG9yY3JlYXRlTG9jYWxfaWlzRml4ZWRvcmlnaW5hbExlbmd0aGJ1aWxkR2V0TGVuZ3RoYnVpbGRDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3JDaGVja2xvb3BWYXJpYWJsZUxvY2Fsb25lYWRkSW5zdHJ1Y3Rpb25fcHVzaER5bmFtaWNJbnZvY2F0aW9uc3RhdGljSW5zdGFuY2VUeXBlX2FkZFR5cGVBcmd1bWVudHN0cnlCdWlsZGVyZmluYWxpemVyRnVuY3Rpb25jbG9zZVRyeUJvZHlidWlsZEZpbmFsbHlCbG9ja2NsZWFuVXB0eXBlSW5mb1NldHRlckZuVW5leHBlY3RlZCBgc3RhY2subGFzdGA6IEZvdW5kIGV4cGVjdGVkICBvciBhbiBISW52b2tlU3RhdGljLiBTdGF0ZTogdHlwZUluZm89LCBzdGFjaz1zYXZlZExvY2Fsc2xvb3BDbG9zdXJlSW5mb3N0YXJ0TG9vcGp1bXBIYW5kbGVyYmVnaW5Mb29wSGVhZGVybG9vcEluZm9sb29wRW50cnlCbG9ja2JvZHlFbnRyeUJsb2NraGFzQ29udGludWVzZW50ZXJMb29wQm9keWJvZHlFeGl0QmxvY2tpc0Fib3J0aW5nQm9keWxvb3BJc0RlZ2VuZXJhdGVjb25kaXRpb25CbG9ja2NvbnRpbnVlSGFuZGxlcnNmb3JFYWNoQ29udGludWVsb2NhbHNtZXJnZU11bHRpcGxlYm9keUdyYXBoYm9keUluZm9jb25kaXRpb25JbnN0cnVjdGlvbmNvbmRpdGlvbkVuZEJsb2NrYXZvaWRDcml0aWNhbEVkZ2Vjb25kaXRpb25FeGl0QmxvY2tlbmRMb29wbG9vcEJsb2NrSW5mb2hhc0FueUJyZWFrZm9yRWFjaEJyZWFrYnJlYWtJbnN0cnVjdGlvbmJyYW5jaEJ1aWxkZXJoYW5kbGVJZmV4cHJlc3Npb25JbnN0cnVjdGlvbl9nZW5lcmF0ZVR5cGVFcnJvcmludmFsaWQgdHlwZXBvbGljeWJ1aWxkVHlwZUNvbnZlcnNpb25fZ2VuZXJhdGVFcnJvcmVycm9yTWVzc2FnZV9nZW5lcmF0ZVVuc3VwcG9ydGVkRXJyb3JjcmVhdGVKdW1wSGFuZGxlcmlzTG9vcEp1bXBnZW5lcmF0ZUNvbnRpbnVlZ2VuZXJhdGVCcmVha2JlZm9yZUxvY2Fsc2JyZWFrSGFuZGxlcnNfYnVpbGRTd2l0Y2hDYXNlQ29uc3RhbnRzaGFzQ29udGludWVjYXNlSW5kZXhzd2l0Y2hJbmRleGhhc0RlZmF1bHRfYnVpbGRTaW1wbGVTd2l0Y2hTdGF0ZW1lbnRfYnVpbGRDb21wbGV4U3dpdGNoU3RhdGVtZW50X2lzRGVmYXVsdENhc2VfYnVpbGRFeHByZXNzaW9uX2dldFN3aXRjaENvbnN0YW50c3BhcmVudFN3aXRjaGNvbnN0YW50c0xvb2t1cGNvbnN0YW50TGlzdF9oYW5kbGVTd2l0Y2hzd2l0Y2hUYXJnZXRjYXNlU291cmNlSW5mb3JtYXRpb25ub3RVc2VkZ2V0Q29uc3RhbnRzaXNEZWZhdWx0Q2FzZWV4cHJlc3Npb25TdGFydHN3aXRjaEluc3RydWN0aW9uZXhwcmVzc2lvbkVuZGhDb25zdGFudGNhc2VIYW5kbGVyc0NvbnRpbnVlIGNhbm5vdCB0YXJnZXQgYSBzd2l0Y2guZXhwcmVzc2lvbkluZm9icmFuY2hlcmhhbmRsZUNvbmRpdGlvbmFsX2hhbmRsZUxvZ2ljYWxFeHByZXNzaW9udmlzaXRSaWdodGlubmVyTGVmdGhhbmRsZUxvZ2ljYWxCaW5hcnlfc2V0TGlzdFJ1bnRpbWVUeXBlSW5mb0lmTmVlZGVkYXJyYXlUeXBlbGlzdEluc3RydWN0aW9uYXJnTGlzdHR5cGVJbnB1dHNyZXR1cm5UeXBlTWFza2NvbnN0cnVjdG9yQXJnc2lyLk1hcEVudHJ5IHNob3VsZCBiZSBoYW5kbGVkIGluIHZpc2l0TWFwTGl0ZXJhbFVuZXhwZWN0ZWQgdHlwZSBsaXRlcmFsIHN0YXRpY1RhcmdldFVuZXhwZWN0ZWQgZmllbGQgZGF0YSBmb3IgbGV0QmluZGluZ2lyLkRpcmVjdFByb3BlcnR5U2V0aXIuRGlyZWN0TWV0aG9kSW52b2NhdGlvbl9nZW5lcmF0ZVN1cGVyTm9TdWNoTWV0aG9kX2J1aWxkSW52b2tlU3VwZXJfdmlzaXRMb2NhbFNldHRlcmluaXRpYWxpemVkVmFsdWVfdmlzaXRQb3NpdGlvbmFsQXJndW1lbnRzX3Zpc2l0QXJndW1lbnRzRm9yRHluYW1pY1RhcmdldG5hbWVkVmFsdWVzX3Zpc2l0QXJndW1lbnRzRm9yTmF0aXZlU3RhdGljVGFyZ2V0X2ZpbGxEeW5hbWljVHlwZUFyZ3VtZW50c3NlbGVjdG9yTmVlZHNUeXBlQXJndW1lbnRzX2dldENvbnN0cnVjdG9yVHlwZUFyZ3VtZW50c19nZXRDbGFzc1R5cGVBcmd1bWVudHNfZ2V0U3RhdGljVHlwZUFyZ3VtZW50c192aXNpdEFyZ3VtZW50c0ZvclN0YXRpY1RhcmdldF9oYW5kbGVJbnZva2VTdGF0aWNGb3JlaWduX2hhbmRsZUV4dHJhY3RUeXBlQXJndW1lbnRzX2hhbmRsZUludm9rZUZhY3RvcnlDb25zdHJ1Y3RvcmNhbiBvbmx5IGJlIHVzZWQgYXMgYSBjb25zdCBjb25zdHJ1Y3RvcmlzRml4ZWRMaXN0aXNGaXhlZExpc3RDb25zdHJ1Y3RvckNhbGxpc0dyb3dhYmxlTGlzdENvbnN0cnVjdG9yQ2FsbGlzSlNBcnJheVR5cGVkQ29uc3RydWN0b3JfaW5mZXJyZWRUeXBlT2ZOZXdMaXN0VW5leHBlY3RlZCBhcmd1bWVudHMuIEV4cGVjdGVkIDEtMiBhcmd1bWVudCwgYWN0dWFsOiBsZW5ndGhJbnB1dG5ldyBBcnJheSgjKWZvcmVpZ24jLmZpeGVkJGxlbmd0aCA9IEFycmF5bmV3SW5zdGFuY2V0eXBlVmFsdWVfaW50ZXJjZXB0b3JGb3JyZWNlaXZlclN0YXRpY1R5cGVfaGFuZGxlRm9yZWlnbkpzX2hhbmRsZUZvcmVpZ25EYXJ0Q2xvc3VyZVRvSnNSQVdfREFSVF9GVU5DVElPTl9SRUZfaGFuZGxlRm9yZWlnblJhd0Z1bmN0aW9uUmVmSlNfU0VUX1NUQVRJQ19TVEFURV9oYW5kbGVGb3JlaWduSnNTZXRTdGF0aWNTdGF0ZUpTX0dFVF9TVEFUSUNfU1RBVEVfaGFuZGxlRm9yZWlnbkpzR2V0U3RhdGljU3RhdGVKU19HRVRfTkFNRV9oYW5kbGVGb3JlaWduSnNHZXROYW1lX2hhbmRsZUZvcmVpZ25Kc0VtYmVkZGVkR2xvYmFsX2hhbmRsZUZvcmVpZ25Kc0J1aWx0aW5KU19HRVRfRkxBR19oYW5kbGVGb3JlaWduSnNHZXRGbGFnSlNfRUZGRUNUX2hhbmRsZUpzSW50ZXJjZXB0b3JDb25zdGFudGdldEludGVyY2VwdG9yX2hhbmRsZUZvcmVpZ25HZXRJbnRlcmNlcHRvcmdldEpTQXJyYXlJbnRlcm9wUnRpX2hhbmRsZUZvcmVpZ25HZXRKU0FycmF5SW50ZXJvcFJ0aV9oYW5kbGVKc1N0cmluZ0NvbmNhdF9oYW5kbGVDcmVhdGVJbnZvY2F0aW9uTWlycm9yVW5rbm93biBmb3JlaWduOiBuYW1lTGl0ZXJhbHR5cGVBcmd1bWVudHNMaXRlcmFscG9zaXRpb25hbEFyZ3VtZW50c0xpdGVyYWxuYW1lZEFyZ3VtZW50c0xpdGVyYWxraW5kTGl0ZXJhbFVuZXhwZWN0ZWQgbmFtZWQgYXJndW1lbnRzIHZhbHVlIGluIGNyZWF0ZUludm9jYXRpb25NaXJycm9yOiBhcmd1bWVudHNJbnN0cnVjdGlvbmFyZ3VtZW50TmFtZXNhcmd1bWVudE5hbWVhcmd1bWVudE5hbWVDb25zdGFudGFyZ3VtZW50TmFtZXNJbnN0cnVjdGlvbmludGVybmFsTmFtZWtpbmRDb25zdGFudF91bmV4cGVjdGVkRm9yZWlnbkFyZ3VtZW50c21pblBvc2l0aW9uYWxtYXhQb3NpdGlvbmFscGx1cmFsaXplQXJndW1lbnRzYWRqZWN0aXZlbm8gb25lIHR3byBiYWR0eXBlIEVycm9yOiAnJyB0YWtlcyAsIG5vdCBwaHJhc2VhdCBsZWFzdCBFcnJvcjogVG9vIGZldyBhcmd1bWVudHMuICdhdCBtb3N0IEVycm9yOiBUb28gbWFueSBhcmd1bWVudHMuICcnIGRvZXMgbm90IHRha2UgbmFtZWQgYXJndW1lbnRzLl9mb3JlaWduQ29uc3RhbnRTdHJpbmdBcmd1bWVudEVycm9yOiBFeHBlY3RlZCBTdHJpbmcgY29uc3RhbnQgYXMgYXJndW1lbnQgdG8gJ3JlcXVpcmVzIGEgc3RhdGljIG1ldGhvZCBvciB0b3AtbGV2ZWwgbWV0aG9kaGFuZGxlVGFyZ2V0ZXhwcmVzc2lvblRlbXBsYXRlWWllbGRpbmdkb2VzIG5vdCBoYW5kbGUgYSBjbG9zdXJlIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyA9ICNfZ2V0TmFtZUZvckpzR2V0TmFtZUVycm9yOiBFeHBlY3RlZCBhIEpzR2V0TmFtZSBlbnVtIHZhbHVlLl9leHRyYWN0RW51bUluZGV4RnJvbUNvbnN0YW50VmFsdWVnbG9iYWxOYW1lc2Vjb25kIE5vIE5hdGl2ZUJlaGF2aW9yIGZvciBzc2FUeXBlbmFtZUFyZ3VtZW50X2dldEpzQnVpbHRpblRlbXBsYXRlRXJyb3I6IEV4cGVjdGVkIGEgSnNCdWlsdGluIGVudW0gdmFsdWUuX3RlbXBsYXRlRm9yQnVpbHRpbkpzQnVpbHRpbi5kYXJ0T2JqZWN0Q29uc3RydWN0b3JKc0J1aWx0aW4uZGFydENsb3N1cmVDb25zdHJ1Y3RvckpzQnVpbHRpbi5pc0NoZWNrUHJvcGVydHlUb0pzQ29uc3RydWN0b3JOYW1lSnNCdWlsdGluLmlzRnVuY3Rpb25UeXBlSnNCdWlsdGluLmlzRnV0dXJlT3JUeXBlSnNCdWlsdGluLmlzVm9pZFR5cGVKc0J1aWx0aW4uaXNEeW5hbWljVHlwZUpzQnVpbHRpbi5pc0pzSW50ZXJvcFR5cGVBcmd1bWVudEpzQnVpbHRpbi5yYXdSdGlUb0pzQ29uc3RydWN0b3JOYW1lSnNCdWlsdGluLnJhd1J1bnRpbWVUeXBlSnNCdWlsdGluLmlzU3VidHlwZUpzQnVpbHRpbi5pc0dpdmVuVHlwZVJ0aUpzQnVpbHRpbi5nZXRNZXRhZGF0YUpzQnVpbHRpbi5nZXRUeXBlYnVpbHRpbmlzUHJlZml4TGVuZ3RoIy5zdWJzdHJpbmcoIy5uYW1lIy5jb25zdHJ1Y3RvcmlzUHJlZml4KCcnICsgIykgaW4gIy5wcm90b3R5cGUjLm5hbWUgPT09ICNtZXRhZGF0YUFjY2Vzc1sjXXR5cGVzQWNjZXNzVW5oYW5kbGVkIEJ1aWx0aW46IEVycm9yOiBVbmtub3duIGludGVybmFsIGZsYWcgImFyZ3VtZW50SW5zdHJ1Y3Rpb25hcmd1bWVudENvbnN0YW50aW50ZXJvcFR5cGVNaXNtYXRjaCBiZXR3ZWVuIG51bWJlciBvZiBwbGFjZWhvbGRlcnMgYW5kIG51bWJlciBvZiBhcmd1bWVudHMudHJ1c3RlZE1hc2t0cnVzdFR5cGVNYXNrVHlwZSBhcmd1bWVudCB0b28gbmFycm93IGZvciBzcGVjaWZpZWQgYmVoYXZpb3IgdHlwZSAgZG9lcyBub3QgYWxsb3cgYWxsIHZhbHVlcyBpbiBfaW52b2tlSnNJbnRlcm9wRnVuY3Rpb25zdGF0aWNSZWNlaXZlclR5cGV0eXBlQm91bmRpc09wdGltaXphYmxlT3BlcmF0aW9uT25JbmRleGFibGVpc0xlbmd0aGlzT3B0aW1pemFibGVPcGVyYXRpb25wb3NpdGlvbnNmaWx0ZXJlZEFyZ3VtZW50c3BhcmFtZXRlck5hbWVNYXBwYXJhbWV0ZXJOYW1lIyA9ICNuZXcgIygjKGNsb3N1cmVDbGFzc0VudGl0eWNhcHR1cmVkVmFyaWFibGVzZ2V0TG9jYWxGb3JGaWVsZGZ1bmNFeHByZXNzaW9udHlwZUFyZ3VtZW50c05lZWRlZGluc3RhbnRpYXRpb25OZWVkc1R5cGVBcmd1bWVudHNHZW5lcmljIGZ1bmN0aW9uIGluc3RhbnRpYXRpb24gbm90IGltcGxlbWVudGVkIGZvciAgdHlwZSBhcmd1bWVudHNfY29udGFpbmluZ0NsYXNzcHVibGljTmFtZXRhcmdldERlZmluaXRpb25zdWJ0eXBlSW5zdHJ1Y3Rpb25pbmZpeHN1cGVydHlwZUluc3RydWN0aW9ucHJlZml4SW5zdHJ1Y3Rpb25pbmZpeEluc3RydWN0aW9uc3VmZml4SW5zdHJ1Y3Rpb250eXBlSW5zdHJ1Y3Rpb252YXJpYWJsZU5hbWVib3VuZEluc3RydWN0aW9udmFyaWFibGVOYW1lSW5zdHJ1Y3Rpb25jaGVja0JvdW5kX3B1c2hJc1Rlc3RhZGRUeXBlVmFyaWFibGVSZWZlcmVuY2VfY2FuSWdub3JlVHlwZUFyZ3VtZW50c3JlcHJlc2VudGF0aW9uc2J1aWxkVHlwZUFyZ3VtZW50UmVwcmVzZW50YXRpb25zaXNGaWVsZE5hbWVhc0ZpZWxkTmFtZV9oYXNEaXJlY3RDaGVja0ZvcmF3YWl0ZWRyZXRocm93YWJsZUV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIG51bGwuc3RyaW5nQ29uY2F0c3RyaW5nQnVpbGRlcnRyeUNhdGNocHJvdmlkZWRBcmd1bWVudHNjdXJyZW50Tm9kZWNhY2hlZENhbkJlSW5saW5lZG1lZXRzSGFyZENvbnN0cmFpbnRzTWlzc2luZyBzZWxlY3RvciBmb3IgaW5saW5pbmcgb2YgZG9lc05vdENvbnRhaW5Db2RlaW5saW5lRGF0YWNhbkJlSW5saW5lZG1heElubGluaW5nTm9kZXNyZWR1Y3RpdmVIZXVyaXN0aWNfaXNDYWxsZWRPbmNlY2FuQmVJbmxpbmVkUmVkdWN0aXZlaGV1cmlzdGljU2F5R29vZFRvR29nZXRJbmxpbmVEYXRhY2Fubm90QmVJbmxpbmVkUmVhc29uYWxsb3dMb29wc0Nhbm5vdCBpbmxpbmUgbnVtUGFyYW1ldGVyc21hcmtlZFRyeUlubGluZWNhbGxlZE9uY2VfaXNGdW5jdGlvbkNhbGxlZE9uY2Vkb0lubGluaW5nVW5leHBlY3RlZCBpbnN0YW5jZSB0eXBlIGZvciBjb21waWxlZEFyZ3VtZW50c19jb21wbGV0ZUNhbGxBcmd1bWVudHNMaXN0X2VudGVySW5saW5lZE1ldGhvZF9kb0lubGluZV9sZWF2ZUlubGluZWRNZXRob2RfcHJvdmlkZWRBcmd1bWVudHNLbm93blRvQmVDb21wbGV0ZV9jb21wbGV0ZUR5bmFtaWNDYWxsQXJndW1lbnRzTGlzdHNlbGVjdG9yQXJndW1lbnROYW1lc2NvbXBpbGVkQXJndW1lbnRJbmRleHBvc2l0aW9uYWxBcmd1bWVudE9mZnNldG5hbWVkQXJndW1lbnRPZmZzZXRwb3NpdGlvbmFsQXJndW1lbnRJbmRleG5hbWVkQXJndW1lbnRJbmRleE5vIGNvbnN0YW50IGNvbXB1dGVkIGZvciBwYXJhbWV0ZXIgdHlwZUFyZ3VtZW50T2Zmc2V0dHlwZUFyZ3VtZW50SW5kZXhfc2V0dXBTdGF0ZUZvcklubGluaW5nZm9yR2VuZXJhdGl2ZUNvbnN0cnVjdG9yQm9keWhhc0JveGlubGluZWRCb3hpbmxpbmVUeXBlUGFyYW1ldGVyc09ubHkgYXJndW1lbnRzIGhhdmUgYmVlbiByZWFkIGZyb206ICBwYXNzZWQgdG8gX3Jlc3RvcmVTdGF0ZW9sZExvY2Fsc0hhbmRsZXJvbGRSZXR1cm5Mb2NhbGluVHJ5U3RhdGVtZW50b2xkUmV0dXJuVHlwZW9sZFN0YWNrX3Zpc2l0SW5saW5lZEZ1bmN0aW9uX3BvdGVudGlhbGx5Q2hlY2tJbmxpbmVkUGFyYW1ldGVyVHlwZXNVbmV4cGVjdGVkIGlubGluZWQgZnVuY3Rpb246IGNoZWNrZWRPclRydXN0ZWRfYWxsSW5saW5lZEZ1bmN0aW9uc0NhbGxlZE9uY2VhbGxGdW5jdGlvbnNDYWxsZWRPbmNlaWRDb25zdGFudENvbnN0cnVjdG9yRGF0YUtlcm5lbElubGluaW5nU3RhdGVLZXJuZWxJbmxpbmluZ1N0YXRlKGFsbEZ1bmN0aW9uc0NhbGxlZE9uY2U9VHJ5Q2F0Y2hGaW5hbGx5QnVpbGRlcmtlcm5lbEJ1aWxkZXJ0cnlTb3VyY2VJbmZvcm1hdGlvbmVudGVyQmxvY2tzdGFydFRyeUJsb2NrZW5kVHJ5QmxvY2tzdGFydENhdGNoQmxvY2tlbmRDYXRjaEJsb2Nrc3RhcnRGaW5hbGx5QmxvY2tlbmRGaW5hbGx5QmxvY2tleGl0QmxvY2t0cnlJbnN0cnVjdGlvbnByZXZpb3VzbHlJblRyeVN0YXRlbWVudGNhdGNoR3JhcGhmaW5hbGx5R3JhcGhvcmlnaW5hbFNhdmVkTG9jYWxzX2FkZEV4aXRUcnlTdWNjZXNzb3JzdWNjZXNzb3JfYWRkT3B0aW9uYWxTdWNjZXNzb3JibG9jazJfc2V0QmxvY2tTdWNjZXNzb3JzYnVpbGRGaW5hbGl6ZXJvbGRSZXRocm93YWJsZUV4Y2VwdGlvbnVud3JhcHBlZEV4Y2VwdGlvbmNhdGNoZXNJbmRleHB1c2hDb25kaXRpb25leGNlcHRpb25WYXJpYWJsZXRyYWNlSW5zdHJ1Y3Rpb250cmFjZVZhcmlhYmxlbmV4dENhdGNoZmlyc3RCbG9ja0tlcm5lbFR5cGVCdWlsZGVyY29tcHV0ZVR5cGVWYXJpYWJsZUFjY2Vzc19FcnJvbmVvdXNJbml0aWFsaXplclZpc2l0b3JLZXJuZWxTd2l0Y2hDYXNlSnVtcEhhbmRsZXJ0YXJnZXRJbmRleE1hcFN0YXRpY1R5cGVTdGF0aWNUeXBlKElubGluZURhdGFjb2RlQWZ0ZXJSZXR1cm5oYXNMb29waGFzQ2xvc3VyZWhhc1RyeWhhc0FzeW5jQXdhaXRoYXNUaHJvd2hhc0xvbmdTdHJpbmdoYXNFeHRlcm5hbENvbnN0YW50Q29uc3RydWN0b3JDYWxsaGFzQXJndW1lbnREZWZhdWx0aW5naGFzQ2FzdGhhc0lmYXJndW1lbnRDb3VudHNyZWd1bGFyTm9kZUNvdW50Y2FsbENvdW50cmVkdWN0aXZlTm9kZUNvdW50Y29kZSBhZnRlciByZXR1cm5hc3luYy9hd2FpdHRvbyBtYW55IG5vZGVzIChjYW5ub3RCZUlubGluZWRSZWR1Y3RpdmVSZWFzb250b28gbWFueSBjYWxsc2xvbmcgc3RyaW5nZXh0ZXJuYWwgY29uc3QgY29uc3RydWN0b3J0eXBlIGFyZ3VtZW50c2FyZ3VtZW50IGRlZmF1bHRpbmdpbmNyZWFzaW5nIGFyZ3VtZW50c0lubGluZURhdGEoYXJndW1lbnRDb3VudHM9e3JlZ3VsYXJOb2RlQ291bnQ9Y2FsbENvdW50PXJlZHVjdGl2ZU5vZGVDb3VudD1JbmxpbmVEYXRhQ2FjaGVJbmxpbmVXZWVkZXJJTkxJTklOR19OT0RFU19PVVRTSURFX0xPT1BJTkxJTklOR19OT0RFU19PVVRTSURFX0xPT1BfQVJHX0ZBQ1RPUklOTElOSU5HX05PREVTX0lOU0lERV9MT09QSU5MSU5JTkdfTk9ERVNfSU5TSURFX0xPT1BfQVJHX0ZBQ1RPUnNlZW5SZXR1cm5jb3VudFJlZ3VsYXJOb2RlY291bnRSZWR1Y3RpdmVOb2RlY29tcHV0ZUlubGluZURhdGFza2lwUmVkdWN0aXZlTm9kZXNza2lwUmVndWxhck5vZGVzb2xkQ291bnRSZWd1bGFyTm9kZW9sZENvdW50UmVkdWN0aXZlTm9kZXJlZ2lzdGVyUmVndWxhck5vZGVyZWdpc3RlclJlZHVjdGl2ZU5vZGV1bnJlZ2lzdGVyUmVkdWN0aXZlTm9kZV9oYW5kbGVMb29wY29tbW9uUHJlZml4Q291bnR0aGVuQ291bnRlbHNlQ291bnRyZWdpc3RlckNhbGxfcHJvY2Vzc0FyZ3VtZW50c0Fic3RyYWN0VmFsdWVGYWN0b3J5aW5mZXJyZWRSZXR1cm5UeXBlRm9yRWxlbWVudGluZmVycmVkVHlwZUZvck1lbWJlcmluZmVycmVkVHlwZUZvclBhcmFtZXRlcmluZmVycmVkUmVzdWx0VHlwZUZvclNlbGVjdG9yZnJvbU5hdGl2ZUJlaGF2aW9yZnJvbU5hdGl2ZVR5cGVVbmV4cGVjdGVkIGVtcHR5IHJldHVybiB2YWx1ZSBmb3IgSnNDbG9zZWRXb3JsZEJ1aWxkZXJDbG9zdXJlRGF0YUltcGxjbG9zdXJlLWRhdGFfc2NvcGVNYXBfY2FwdHVyZWRTY29wZXNNYXBfY2FwdHVyZWRTY29wZUZvclNpZ25hdHVyZU1hcF9sb2NhbENsb3N1cmVSZXByZXNlbnRhdGlvbk1hcHNjb3BlTWFwY2FwdHVyZWRTY29wZXNNYXBjYXB0dXJlZFNjb3BlRm9yU2lnbmF0dXJlTWFwbG9jYWxDbG9zdXJlUmVwcmVzZW50YXRpb25NYXBNaXNzaW5nIHNjb3BlIGluZm8gZm9yIGxvb3BOb2RlQ29ycmVzcG9uZGluZyBjbG9zdXJlIGNsYXNzIG5vdCBmb3VuZCBmb3IgQ2xvc3VyZXMgZm91bmQgZm9yIENsb3N1cmVEYXRhQnVpbGRlcl91cGRhdGVTY29wZUJhc2VkT25SdGlOZWVkb3V0ZXJtb3N0RW50aXR5aW5jbHVkZUZvclJ0aVZhcmlhYmxlVXNlS2luZC5leHBsaWNpdFZhcmlhYmxlVXNlS2luZC5pbXBsaWNpdENhc3RWYXJpYWJsZVVzZUtpbmQubG9jYWxUeXBlVmFyaWFibGVVc2VLaW5kLmNvbnN0cnVjdG9yVHlwZUFyZ3VtZW50VmFyaWFibGVVc2VLaW5kLnN0YXRpY1R5cGVBcmd1bWVudFZhcmlhYmxlVXNlS2luZC5pbnN0YW5jZVR5cGVBcmd1bWVudFZhcmlhYmxlVXNlS2luZC5sb2NhbFR5cGVBcmd1bWVudGxvY2FsRnVuY3Rpb25OZWVkc1R5cGVBcmd1bWVudHNWYXJpYWJsZVVzZUtpbmQubWVtYmVyUGFyYW1ldGVyVmFyaWFibGVVc2VLaW5kLmxvY2FsUGFyYW1ldGVybG9jYWxGdW5jdGlvbk5lZWRzU2lnbmF0dXJlVmFyaWFibGVVc2VLaW5kLm1lbWJlclJldHVyblR5cGVWYXJpYWJsZVVzZUtpbmQubG9jYWxSZXR1cm5UeXBlVmFyaWFibGVVc2VLaW5kLmZpZWxkVHlwZVZhcmlhYmxlVXNlS2luZC5saXN0TGl0ZXJhbFZhcmlhYmxlVXNlS2luZC5zZXRMaXRlcmFsVmFyaWFibGVVc2VLaW5kLm1hcExpdGVyYWxWYXJpYWJsZVVzZUtpbmQuaW5zdGFudGlhdGlvblR5cGVBcmd1bWVudHRoaXNVc2VkQXNGcmVlVmFyaWFibGVJZk5lZWRzUnRpdGhpc1VzZWRBc0ZyZWVWYXJpYWJsZWZyZWVWYXJpYWJsZXNGb3JSdGljcmVhdGVDbG9zdXJlRW50aXRpZXNjYWxsTWV0aG9kc21vZGVsYWxsQm94ZWRWYXJpYWJsZXNib3hlZFZhcmlhYmxlc2Nsb3N1cmVzVG9HZW5lcmF0ZWNsb3N1cmVDbGFzc0luZm9fcHJvZHVjZVN5bnRoZXRpY0VsZW1lbnRzY3JlYXRlU2lnbmF0dXJlTWV0aG9kY2FwdHVyZWRTY29wZXNpZ25hdHVyZUNhcHR1cmVkU2NvcGVidWlsZENsb3N1cmVDbGFzc0pzU2NvcGVJbmZvc2NvcGUtaW5mb2xvY2Fsc1VzZWRJblRyeU9yU3luY2hhc1RoaXNMb2NhbGZvckVhY2hCb3hlZFZhcmlhYmxlbG9jYWxJc1VzZWRJblRyeU9yU3luY3RoaXM9bG9jYWxzVXNlZEluVHJ5T3JTeW5jPXtTY29wZUluZm9LaW5kLnNjb3BlSW5mb0pzQ2FwdHVyZWRTY29wZWNhcHR1cmVkLXNjb3BlU2NvcGVJbmZvS2luZC5jYXB0dXJlZFNjb3BlSnNDYXB0dXJlZExvb3BTY29wZWNhcHR1cmVkLWxvb3Atc2NvcGVib3hlZExvb3BWYXJpYWJsZXNoYXNCb3hlZExvb3BWYXJpYWJsZXNTY29wZUluZm9LaW5kLmNhcHR1cmVkTG9vcFNjb3BlS2VybmVsQ2xvc3VyZUNsYXNzSW5mb2Nsb3N1cmUtcmVwcmVzZW50YXRpb24taW5mb2Nsb3N1cmVFbnRpdHlsb2NhbFRvRmllbGRNYXBmcm9tU2NvcGVJbmZvY2xvc3VyZVNvdXJjZU5vZGVTY29wZUluZm9LaW5kLmNsb3N1cmVSZXByZXNlbnRhdGlvbkluZm9jcmVhdGVkRmllbGRFbnRpdGllc05vIGxvY2FsIGZvciAuIE9wdGlvbnM6IHRoaXNGaWVsZEVudGl0eUpDbG9zdXJlQ2xhc3NjbG9zdXJlLWNsYXNzY2xvc3VyZV9jbGFzcyhBbm9ueW1vdXNDbG9zdXJlTG9jYWxhbm9ueW1vdXNfY2xvc3VyZV9sb2NhbChKQ2xvc3VyZUZpZWxkY2xvc3VyZS1maWVsZFJlY29yZENsYXNzRGF0YXJlY29yZC1jbGFzcy1kYXRhb3JkZXJlZFR5cGVTZXRKQ2xhc3NEYXRhS2luZC5yZWNvcmRKUmVjb3JkcmVjb3JkX2NvbnRhaW5lcihyZWNvcmQtZmllbGRDbG9zdXJlQ2xhc3NEYXRhY2xvc3VyZS1jbGFzcy1kYXRhSkNsYXNzRGF0YUtpbmQuY2xvc3VyZUNsb3N1cmVDbGFzc0RlZmluaXRpb25jbG9zdXJlLWNsYXNzLWRlZmluaXRpb25DbG9zdXJlQ2xhc3NEZWZpbml0aW9uLm5vZGUgZm9yIENsb3N1cmVDbGFzc0RlZmluaXRpb24oa2luZDpDbG9zdXJlTWVtYmVyRGF0YW1lbWJlclRoaXNUeXBlc3RhdGljVHlwZXNDbG9zdXJlTWVtYmVyRGF0YS5zdGF0aWNUeXBlc19DbG9zdXJlRnVuY3Rpb25EYXRhJkNsb3N1cmVNZW1iZXJEYXRhJkZ1bmN0aW9uRGF0YVR5cGVWYXJpYWJsZXNNaXhpbl9DbG9zdXJlRnVuY3Rpb25EYXRhJkNsb3N1cmVNZW1iZXJEYXRhJkZ1bmN0aW9uRGF0YVR5cGVWYXJpYWJsZXNNaXhpbiZGdW5jdGlvbkRhdGFGb3JFYWNoUGFyYW1ldGVyTWl4aW5DbG9zdXJlRnVuY3Rpb25EYXRhY2xvc3VyZS1mdW5jdGlvbi1kYXRhY2xhc3NUeXBlVmFyaWFibGVBY2Nlc3NDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5ub25lQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3MucHJvcGVydHlDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5wYXJhbWV0ZXJDbGFzc1R5cGVWYXJpYWJsZUFjY2Vzcy5pbnN0YW5jZUZpZWxkSk1lbWJlckRhdGFLaW5kLmNsb3N1cmVGdW5jdGlvbkNsb3N1cmVGaWVsZERhdGFjbG9zdXJlLWZpZWxkLWRhdGFKTWVtYmVyRGF0YUtpbmQuY2xvc3VyZUZpZWxkc291cmNlTm9kZVVuZXhwZWN0ZWQgbm9kZSB0eXBlIENsb3N1cmVGaWVsZERhdGEuZ2V0RmllbGRUeXBlZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb25VbmV4cGVjdGVkIGZpZWxkIENsb3N1cmVGaWVsZERhdGEuZ2V0RmllbGRDb25zdGFudEV4cHJlc3Npb25DbG9zdXJlTWVtYmVyRGVmaW5pdGlvbmNsb3N1cmUtbWVtYmVyLWRlZmluaXRpb25DbG9zdXJlTWVtYmVyRGVmaW5pdGlvbihraW5kOlJlY29yZENvbnRhaW5lckRlZmluaXRpb25yZWNvcmQtZGVmaW5pdGlvblJlY29yZENvbnRhaW5lckRlZmluaXRpb24ubm9kZSBmb3IgUmVjb3JkQ29udGFpbmVyRGVmaW5pdGlvbihraW5kOkNsb3N1cmVSdGlOZWVkX2dldExvY2FsT25seSBrbm93IGhvdyB0byBnZXQvY3JlYXRlIGxvY2FscyBmb3IgVmFyaWFibGVEZWNsYXJhdGlvbnMgb3IgVHlwZVBhcmFtZXRlclR5cGVXaXRoQ29udGV4dC4gUmVjaWV2ZWQgQm94TG9jYWxUaGlzTG9jYWxKc0tlcm5lbFRvRWxlbWVudE1hcGpzLWtlcm5lbC10by1lbGVtZW50LW1hcGxpYnJhcnlUYWdjbGFzc1RhZ21lbWJlclRhZ3R5cGVWYXJpYWJsZVRhZ3R5cGUtdmFyaWFibGVzbGlicmFyeURhdGFUYWdsaWJyYXJ5LWRhdGFjbGFzc0RhdGFUYWdjbGFzcy1kYXRhdHlwZWRlZkRhdGFUYWd0eXBlZGVmLWRhdGFtZW1iZXJEYXRhVGFnbWVtYmVyLWRhdGF0eXBlVmFyaWFibGVEYXRhVGFndHlwZS12YXJpYWJsZS1kYXRhbmVzdGVkQ2xvc3VyZXNUYWduZXN0ZWQtY2xvc3VyZXNfdHlwZUNvbnZlcnRlcl9jb25zdGFudEVudmlyb25tZW50X3R5cGVFbnZpcm9ubWVudF9jbGFzc0hpZXJhcmNoeV9jb25zdGFudFZhbHVlZmllcnR5cGVkZWZNYXB0eXBlVmFyaWFibGVNYXBjb25zdHJ1Y3Rvck1hcG1ldGhvZE1hcF9uZXN0ZWRDbG9zdXJlTWFwX2dlbmVyYXRvckJvZGllc19pbmplY3RlZENsYXNzTWVtYmVyc19jYWNoZWRUeXBlTG9va3VwUmF3X2NhY2hlZFR5cGVMb29rdXBGdWxsb2xkTGlicmFyeWdldEVudm5ld0xpYnJhcnluZXdFbnZyZWdpc3RlckxpYnJhcnlvbGRDbGFzc25ld0NsYXNzb2xkVHlwZWRlZm5ld1R5cGVkZWZvbGRNZW1iZXJza2lwSW5kZXhuZXdNZW1iZXJNZW1iZXIgaW5kZXggbWlzbWF0Y2g6IE9sZCBtZW1iZXIgIGhhcyBpbmRleCB3aGVyZWFzIG5ldyBtZW1iZXIgb2xkVHlwZVZhcmlhYmxlb2xkVHlwZVZhcmlhYmxlRGF0YW5ld1R5cGVEZWNsYXJhdGlvbm5ld1R5cGVWYXJpYWJsZWNyZWF0ZVR5cGVWYXJpYWJsZWVudklzQ2xvc2VkdHlwZWRlZkNvdW50cmVnaXN0ZXJUeXBlZGVmcmVnaXN0ZXJNZW1iZXJyZWdpc3RlclR5cGVWYXJpYWJsZWZvckVhY2hMaWJyYXJ5Zm9yRWFjaFR5cGVkZWZmb3JFYWNoTWVtYmVyX19fbWFpbkZ1bmN0aW9uZ2V0TWV0aG9kSW50ZXJuYWxfbWFpbkxpYnJhcnlnZXRMaWJyYXJ5SW50ZXJuYWxmcm9tU3Bhbm5hYmxlTm8gZGF0YSBmb3IgbGlicmFyeUVudl9nZXRMaWJyYXJ5TmFtZWNoZWNrRmFtaWx5bG9va3VwTWVtYmVyX2ZvckVhY2hMaWJyYXJ5TWVtYmVyY2xhc3NFbnZnZXRDbGFzc0ludGVybmFsX2ZvckVhY2hDbGFzc2dldFN1cGVyVHlwZV9lbnN1cmVTdXBlcnR5cGVzX2Vuc3VyZVRoaXNBbmRSYXdUeXBlZ2V0VHlwZVZhcmlhYmxlSW50ZXJuYWxnZXRUeXBlVmFyaWFibGVzdXBlcmRhdGFsaW5rQnVpbGRlcmRlZmF1bHRTdXBlcmNsYXNzc2V0QnVpbGRlcmNyZWF0ZU9yZGVyZWRUeXBlU2V0Z2V0VHlwZWRlZkludGVybmFsZ2V0RmllbGRJbnRlcm5hbGdldENvbnN0cnVjdG9ySW50ZXJuYWxObyBlbmNsb3NpbmcgY2xhc3MgZm9yIHN1cGVyIG1lbWJlciBhY2Nlc3MgaW4gc3VwZXJNZW1iZXJnZXRTdXBlckNvbnN0cnVjdG9ydGFyZ2V0Tm9kZXNvdXJjZUNsYXNzdGFyZ2V0Q2xhc3NTdXBlciBjb25zdHJ1Y3RvciBmb3IgIG5vdCBmb3VuZC5nZXRQYXJhbWV0ZXJUeXBlc29ydGVkTmFtZWRQYXJhbWV0ZXJzY29tcHV0ZUNvbnN0YW50VmFsdWVfZ2V0Q29uc3RhbnRWYWx1ZWNvbnN0YW50UmVxdWlyZWRfZ2V0RnVuY3Rpb25UeXBlX2dldEZ1bmN0aW9uVHlwZVZhcmlhYmxlc19nZXRGaWVsZFR5cGVnZXRCb3VuZF9nZXRUeXBlVmFyaWFibGVEZWZhdWx0VHlwZWdldERlZmF1bHRUeXBlX2lzTWl4aW5BcHBsaWNhdGlvbl9pc1VubmFtZWRNaXhpbkFwcGxpY2F0aW9uX2lzU3VwZXJNaXhpbkFwcGxpY2F0aW9uX2ZvckVhY2hTdXBlcnR5cGVfZm9yRWFjaENvbnN0cnVjdG9yX2ZvckVhY2hMb2NhbENsYXNzTWVtYmVyX2ZvckVhY2hDbGFzc01lbWJlcl9nZXRDb25zdHJ1Y3RvckNvbnN0YW50X2dldEZpZWxkQ29uc3RhbnRFeHByZXNzaW9uZ2V0T3JkZXJlZFR5cGVTZXRtYXhEZXB0aGdldE1lbWJlckRlZmluaXRpb25JbnRlcm5hbGdldENsYXNzRGVmaW5pdGlvbkludGVybmFsbWVtYmVyRGVmaW5pdGlvbmNhY2hlZFN0YXRpY1R5cGVzTm8gc3RhdGljIHR5cGVzIGNhY2hlZCBmb3IgZ2V0R2V0dGVyU2VsZWN0b3JnZXRTZXR0ZXJTZWxlY3RvcmdldEludm9jYXRpb25TZWxlY3RvckNhbiBvbmx5IGdldCB0aGUgc2VsZWN0b3IgZm9yIGEgcHJvcGVydHkgZ2V0IG9yIGFuIGludm9jYXRpb246IGlyTmFtZXR5cGVMb29rdXByZXNvbHZlQXNSYXdfdHlwZUxvb2t1cGNhY2hlZE1heUxvb2t1cEluTWFpbm1heUxvb2t1cEluTWFpbm1haW5VcmlmaW5kSW5MaWJyYXJ5ZmluZEluX2dldFN0cmluZ0FyZ3VtZW50SlMgYnVpbHRpbiBleHByZXNzaW9uIGhhcyBubyB0eXBlLkpTIGJ1aWx0aW4gaXMgbWlzc2luZyBuYW1lLlVuZXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQuSlMgZW1iZWRkZWQgZ2xvYmFsIGV4cHJlc3Npb24gaGFzIG5vIHR5cGUuSlMgZW1iZWRkZWQgZ2xvYmFsIGlzIG1pc3NpbmcgbmFtZS5KUyBlbWJlZGRlZCBnbG9iYWwgaGFzIG1vcmUgdGhhbiAyIGFyZ3VtZW50cy5ObyBleHByZXNzaW9uIGZvciBjb25zdGFudC5ObyBjb25zdGFudCBmb3IgZ2V0TWV0YWRhdGFObyBzdXBlciBub1N1Y2hNZXRob2QgZm91bmQgZm9yIGNsYXNzIGNyZWF0ZUNvbnN0cnVjdG9yQm9keWNyZWF0ZUdlbmVyYXRvckJvZHlVbmV4cGVjdGVkIGVudGl0eSAsIGV4cGVjdGVkIGZhbWlseSBsaWJyYXJ5TGlzdEludGVybmFsTm8gbGlicmFyeSBlbnRpdHkgZm9yIE5vIGNsYXNzIGVudGl0eSBmb3IgTm8gZmllbGQgZW50aXR5IGZvciBObyBmdW5jdGlvbiBlbnRpdHkgZm9yIE5vIGNvbnN0cnVjdG9yIGVudGl0eSBmb3IgTm8gdHlwZSB2YXJpYWJsZSBlbnRpdHkgZm9yICBvbiBObyB0eXBlZGVmIGVudGl0eSBmb3IgX2dldENvbnN0cnVjdG9yQm9keV9nZXRQYXJhbWV0ZXJTdHJ1Y3R1cmVGcm9tRnVuY3Rpb25Ob2RlYWRkQ29uc3RydWN0b3JCb2R5Z2V0UGFyZW50TWVtYmVyVW5leHBlY3RlZCBtZW1iZXIga2luZCBfY29uc3RydWN0UmVjb3JkRmllbGRFbnRyeWJveGVkRmllbGRib3hlZEZpZWxkc2NhcHR1cmVkVmFyaWFibGVzQWNjZXNzb3Jjb250YWluZXJEYXRhZXh0ZW5kQ2xhc3NfaXNJblJlY29yZHJlY29yZEZpZWxkc1Zpc2libGVJblNjb3BlY29uc3RydWN0Q2xvc3VyZUNsYXNzdHlwZVZhcmlhYmxlQWNjZXNzX2NvbXB1dGVDbG9zdXJlTmFtZWNsb3N1cmVEYXRhX2J1aWxkQ2xvc3VyZUNsYXNzRmllbGRzX2NvbnN0cnVjdFNpZ25hdHVyZU1ldGhvZGZpZWxkTnVtYmVyY2FwdHVyZWRMb2NhbGNvbnN0cnVjdGVkRmllbGRfY29uc3RydWN0Q2xvc3VyZUZpZWxkRm9yUmVjb3JkX2NvbnN0cnVjdENsb3N1cmVGaWVsZFVuZXhwZWN0ZWQgZmllbGQgbm9kZSB0eXBlOiBfYm94X19nZXRDbG9zdXJlVmFyaWFibGVOYW1lYW5vbnltb3VzX2NhcHR1cmVkX2Z1bmN0aW9uRGF0YUpzRWxlbWVudEVudmlyb25tZW50VW5leHBlY3RlZCBtYXJrZXIgVGhlIGNvbnN0cnVjdG9yICcnIHdhcyBub3QgZm91bmQgaW4gY2xhc3MgJ2luIGxpYnJhcnkgVGhlIG1lbWJlciAnJyB3YXMgbm90IGZvdW5kIGluICcgd2FzIG5vdCBmb3VuZCBpbiBsaWJyYXJ5ICcnICB3YXMgbm90IGZvdW5kIGluIGxpYnJhcnkgJycgd2FzIG5vdCBmb3VuZC5Kc0JlaGF2aW9yQnVpbGRlckpzQ29uc3RhbnRFbnZpcm9ubWVudF92YWx1ZU1hcEpzRXZhbHVhdGlvbkVudmlyb25tZW50X0V2YWx1YXRpb25FbnZpcm9ubWVudC5nZXRMb2NhbENvbnN0YW50X0VudGl0eUxvb2t1cExpYnJhcnkgZm9yIGluZGV4ICBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuQ2xhc3MgZm9yIGluZGV4IFR5cGVkZWYgZm9yIGluZGV4IE1lbWJlciBmb3IgaW5kZXggVHlwZSB2YXJpYWJsZSBmb3IgaW5kZXggTm8gbGlicmFyeSBmb3VuZCBmb3IgaW5kZXggTm8gY2xhc3MgZm91bmQgZm9yIGluZGV4IE5vIHR5cGVkZWYgZm91bmQgZm9yIGluZGV4IE5vIG1lbWJlciBmb3VuZCBmb3IgaW5kZXggTm8gdHlwZSB2YXJpYWJsZSBmb3VuZCBmb3IgaW5kZXggQ2xvc2VkRW50aXR5TG9va3VwTGF0ZU1lbWJlcktpbmRMYXRlTWVtYmVyS2luZC5jb25zdHJ1Y3RvckJvZHlMYXRlTWVtYmVyS2luZC5nZW5lcmF0b3JCb2R5Q2xvc2VkRW50aXR5UmVhZGVyX3JlYWRMYXRlTWVtYmVyRnJvbURhdGFTb3VyY2VVbmV4cGVjdGVkIGxhdGUgbWVtYmVyIGtpbmQ6IENsb3NlZEVudGl0eVdyaXRlcl9lYXJseU1lbWJlckluZGV4TGltaXRfd3JpdGVMYXRlTWVtYmVyVG9EYXRhU2lua1VuZXhwZWN0ZWQgbGF0ZSBtZW1iZXIgRnVuY3Rpb25TZXRKc0Nsb3NlZFdvcmxkY2xvc2VkLXdvcmxkX2FsbEZ1bmN0aW9uc19saXZlTWl4aW5Vc2VzX3N1YnR5cGVDb3ZlcmVkQnlDYWNoZV9zb3J0ZXJtZW1iZXJBY2Nlc3NhbGxvY2F0b3JBbmFseXNpc3NlY29uZE1hcHN1YmNsYXNzZXNOZWVkTm9TdWNoTWV0aG9kcm9vdE5vZGVyb290Q2xhc3NfaGFzQ29uY3JldGVNYXRjaHN0b3BBdFN1cGVyY2xhc3NJdGVyYXRpb25TdGVwLlNUT1BObyBjbGFzcyBzZXQgZm9yIHN1YnR5cGVOb2Rlc3VidHlwZU5vZGVzdHlwZVNldG90aGVyVHlwZVNldHNvdGhlckNsYXNzb3RoZXJUeXBlU2V0Y29tbW9uU3VwZXJ0eXBlc2FkZExpdmVVc2VfaXNOYW1lZE1peGluQXBwbGljYXRpb25jdXJyZW50TWl4aW5fZW5zdXJlRnVuY3Rpb25TZXRoYXNBbnlVc2VyRGVmaW5lZEdldHRlciBoYXMgbm90IGJlZW4gaW5zdGFudGlhdGVkLktlcm5lbFNvcnRlcl9jb21wYXJlTGlicmFyaWVzX2NvbXBhcmVTb3VyY2VTcGFuc2VudGl0eTFzb3VyY2VTcGFuMWVudGl0eTJzb3VyY2VTcGFuMnNvcnRMaWJyYXJpZXNzb3J0TWVtYmVyc2NvbXBhcmVNZW1iZXJzQnlMb2NhdGlvbnNvcnRDbGFzc2VzcmVndWxhckNsYXNzZXN1bm5hbWVkTWl4aW5zY29tcGFyZUNsYXNzZXNCeUxvY2F0aW9uTXVsdGlwbGUgbWl4aW5zIG5hbWVkIHNvcnRUeXBlZGVmc2NvbXBhcmVMaWJyYXJpZXNCeUxvY2F0aW9uZGVmaW5pdGlvbjFkZWZpbml0aW9uMmNvbXBhcmVUeXBlZGVmc0J5TG9jYXRpb25LZXJuZWxTb3J0ZXIuY29tcGFyZVR5cGVkZWZzQnlMb2NhdGlvbiB1bmltcGxlbWVudGVkTG9jYWxMb29rdXBJbXBsX0VudGl0eUNvbnZlcnRlcl9jbG9zdXJlRGF0YUJ1aWxkZXJfYWJzdHJhY3RWYWx1ZVN0cmF0ZWd5a091dHB1dFVuaXREYXRhX2NvbnZlcnRCYWNrZW5kVXNhZ2VfY29udmVydE5hdGl2ZURhdGFfY29udmVydEludGVyY2VwdG9yRGF0YWNvbnZlcnRDbGFzc0hpZXJhcmNoeU5vZGV0b0JhY2tlbmRDbGFzc2hpZXJhcmNoeURlcHRoY29udmVydENsYXNzU2V0bmV3Q2xhc3NTZXRuZXdTdWJ0eXBldG9CYWNrZW5kTWVtYmVyU2V0dG9CYWNrZW5kQ2xhc3NNYXB0b0JhY2tlbmRDbGFzc1NldHRvQmFja2VuZE1lbWJlck1hcGtlcm5lbFJ0aU5lZWRsb2NhbEZ1bmN0aW9uc05vZGVzTmVlZGluZ1NpZ25hdHVyZWxvY2FsRnVuY3Rpb25zTmVlZGluZ1NpZ25hdHVyZWxvY2FsRnVuY3Rpb25zTm9kZXNOZWVkaW5nVHlwZUFyZ3VtZW50c2xvY2FsRnVuY3Rpb25zTmVlZGluZ1R5cGVBcmd1bWVudHNqUnRpTmVlZF9jb252ZXJ0UnVudGltZVR5cGVzTmVlZGNhbGxNZXRob2RzTmVlZGluZ1NpZ25hdHVyZWNhbGxNZXRob2RzTmVlZGluZ1R5cGVBcmd1bWVudHNtZXRob2RzTmVlZGluZ1NpZ25hdHVyZW1ldGhvZHNOZWVkaW5nVHlwZUFyZ3VtZW50c29sZE5vU3VjaE1ldGhvZERhdGF0b0JhY2tlbmRGdW5jdGlvblNldG9sZEFubm90YXRpb25zRGF0YV9jb252ZXJ0T3V0cHV0VW5pdERhdGFoZWxwZXJGdW5jdGlvbnNVc2VkaGVscGVyQ2xhc3Nlc1VzZWR0b0JhY2tlbmRUeXBlaXNIdG1sTG9hZGVkX2NvbnZlcnROYXRpdmVCYXNpY0RhdGF0b0JhY2tlbmRMaWJyYXJ5TWFwY29udmVydE5hdGl2ZUJlaGF2aW9yVHlwZWFsbG93RnJlZVZhcmlhYmxlc2NvbnZlcnROYXRpdmVCZWhhdmlvcm5ld0JlaGF2aW9yYmFja2VuZE1ldGhvZGNsYXNzZXNOZWVkaW5nVHlwZUFyZ3VtZW50c3NlbGVjdG9yc05lZWRpbmdUeXBlQXJndW1lbnRzdG9CYWNrZW5kTGlicmFyeWluc3RhbnRpYXRpb25zTmVlZGluZ1R5cGVBcmd1bWVudHNvcmlnaW5hbENsb3N1cmVGdW5jdGlvbk5vZGViYWNrZW5kRW50aXR5VHJpdmlhbENsb3N1cmVSdGlOZWVkSnNDbG9zdXJlUnRpTmVlZEpzVG9Gcm9udGVuZE1hcHRvQmFja2VuZExpYnJhcnlTZXR0b0JhY2tlbmRGaWVsZFNldGJhY2tlbmRGaWVsZGJhY2tlbmRGdW5jdGlvblYxSnNUb0Zyb250ZW5kTWFwSW1wbF9iYWNrZW5kdG9CYWNrZW5kRW50aXR5dG9CYWNrZW5kVHlwZWRlZnRvQmFja2VuZFR5cGVWYXJpYWJsZXVuZXhwZWN0ZWQgZW50aXR5IExvY2FsIGZ1bmN0aW9uIHR5cGUgdmFyaWFibGVzIGFyZSBub3Qgc3VwcG9ydGVkLmluZGV4ZWRUeXBlVmFyaWFibGVOdWxsIG5vdCBhbGxvd2VkIGFzIGNvbnN0YW50IHZhbHVlLl9UeXBlQ29udmVydGVyX2Z1bmN0aW9uVHlwZVZhcmlhYmxlc2NvbnZlcnRUeXBlc2NvbnZlcnRlckZ1bmN0aW9uIHR5cGUgdmFyaWFibGUgIG5vdCBmb3VuZCBpbiBfQ29uc3RhbnRDb252ZXJ0ZXJ0eXBlQ29udmVydGVyX2hhbmRsZVZhbHVlc05vIGJhY2tlbmQgZmllbGQgZm9yIFVuZXhwZWN0ZWQgdmlzaXRJbnRlcmNlcHRvciBVbmV4cGVjdGVkIERlZmVycmVkR2xvYmFsQ29uc3RhbnRWYWx1ZSBjb252ZXJ0TWFwY29udmVydEtleWNvbnZlcnRWYWx1ZW5ld01hcG5ld0tleWRhcnQyanMuYmFja2VuZF9hcGlkYXJ0MmpzLmNvbW1vbi5yZXNvbHV0aW9uSXJBbm5vdGF0aW9uRGF0YV9uYXRpdmVDbGFzc05hbWVzX25hdGl2ZU1lbWJlcnNfbmF0aXZlTWVtYmVyTmFtZXNfY3JlYXRlc0Fubm90YXRpb25zX3JldHVybnNBbm5vdGF0aW9uc19qc0ludGVyb3BMaWJyYXJ5TmFtZXNfanNJbnRlcm9wQ2xhc3NOYW1lc19hbm9ueW1vdXNKc0ludGVyb3BDbGFzc2VzX2pzSW50ZXJvcE1lbWJlck5hbWVzX21lbWJlclByYWdtYUFubm90YXRpb25zZ2V0TmF0aXZlQ2xhc3NOYW1laGFzTmF0aXZlQm9keWdldE5hdGl2ZU1lbWJlck5hbWVnZXRNZW1iZXJQcmFnbWFBbm5vdGF0aW9uRGF0YVByYWdtYUFubm90YXRpb25EYXRhUHJhZ21hQW5ub3RhdGlvbkRhdGEocHJvY2Vzc0Fubm90YXRpb25zbW9kdWxhckNvcmVwcm9jZXNzTWVtYmVycHJhZ21hQW5ub3RhdGlvbm5hdGl2ZUNsYXNzTmFtZV9nZXROYXRpdmVDbGFzc05hbWVfaXNOYXRpdmVNZW1iZXJfZ2V0TmF0aXZlTWVtYmVyTmFtZV9nZXRDcmVhdGVzQW5ub3RhdGlvbl9nZXRSZXR1cm5zQW5ub3RhdGlvbl9nZXRKc0ludGVyb3BOYW1lX2lzQW5vbnltb3VzSnNJbnRlcm9wX2dldFByYWdtYUFubm90YXRpb25jb21wdXRlUHJhZ21hQW5ub3RhdGlvbkRhdGFGcm9tSXJjb25zdGFudEV4cHJlc3Npb25VbmV4cGVjdGVkIHVuZXZhbHVhdGVkIGNvbnN0YW50IG9uIEtlcm5lbFNjb3BlSW5mb3dpdGhCb3hlZFZhcmlhYmxlc0tlcm5lbFNjb3BlSW5mbyh0aGlzPWZyZWVWcmlhYmxlcz1mcmVlVmFyaWFibGVzRm9yUnRpPXtLZXJuZWxDYXB0dXJlZFNjb3BlZm9yU2lnbmF0dXJlS2VybmVsQ2FwdHVyZWRMb29wU2NvcGVOb2RlQm94VmFyaWFibGVVc2VLaW5kZXhwbGljaXRsb2NhbFR5cGVtYXBMaXRlcmFsY29uc3RydWN0b3JUeXBlQXJndW1lbnRzdGF0aWNUeXBlQXJndW1lbnRpbnN0YW5jZVR5cGVBcmd1bWVudGxvY2FsVHlwZUFyZ3VtZW50bWVtYmVyUGFyYW1ldGVybG9jYWxQYXJhbWV0ZXJtZW1iZXJSZXR1cm5UeXBlbG9jYWxSZXR1cm5UeXBlZmllbGRUeXBlaW5zdGFudGlhdGlvblR5cGVBcmd1bWVudFZhcmlhYmxlVXNlX3NpbXBsZVZhcmlhYmxlVXNlKGtpbmQ9LG1lbWJlcj1sb2NhbEZ1bmN0aW9uPSxpbnZvY2F0aW9uPWluc3RhbnRpYXRpb249VHlwZVZhcmlhYmxlS2luZFR5cGVWYXJpYWJsZUtpbmQuY2xzVHlwZVZhcmlhYmxlS2luZC5tZXRob2RUeXBlVmFyaWFibGVLaW5kLmxvY2FsVHlwZVZhcmlhYmxlS2luZC5mdW5jdGlvblR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dFVuZXhwZWN0ZWQgdHlwZSBkZWNsYXJhdGlvbjogVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0LmFjY2VwdFR5cGVWYXJpYWJsZVR5cGVXaXRoQ29udGV4dC52aXNpdENoaWxkcmVuVHlwZVZhcmlhYmxlVHlwZVdpdGhDb250ZXh0KHR5cGU9LGNvbnRleHQ9LHR5cGVEZWNsYXJhdGlvbj1JbXBhY3RSZWdpc3RyeXJlZ2lzdGVySW50TGl0ZXJhbHJlZ2lzdGVyRG91YmxlTGl0ZXJhbHJlZ2lzdGVyQm9vbExpdGVyYWxyZWdpc3RlclN0cmluZ0xpdGVyYWxyZWdpc3RlclN5bWJvbExpdGVyYWxyZWdpc3Rlck51bGxMaXRlcmFscmVnaXN0ZXJMaXN0TGl0ZXJhbHJlZ2lzdGVyU2V0TGl0ZXJhbHJlZ2lzdGVyTWFwTGl0ZXJhbHJlZ2lzdGVyU3RhdGljVGVhck9mZnJlZ2lzdGVyU3RhdGljR2V0cmVnaXN0ZXJTdGF0aWNTZXRyZWdpc3RlckFzc2VydHdpdGhNZXNzYWdlcmVnaXN0ZXJTeW5jU3RhcnJlZ2lzdGVyQXN5bmNyZWdpc3RlckFzeW5jU3RhcnJlZ2lzdGVyU3RyaW5nQ29uY2F0ZW5hdGlvbnJlZ2lzdGVyTG9jYWxGdW5jdGlvbnJlZ2lzdGVyTG9jYWxXaXRob3V0SW5pdGlhbGl6ZXJyZWdpc3RlckltcGxpY2l0Q2FzdHJlZ2lzdGVyQXNDYXN0cmVnaXN0ZXJUaHJvd3JlZ2lzdGVyU3luY0ZvckluaXRlcmF0b3JDbGFzc1JlbGF0aW9ucmVnaXN0ZXJBc3luY0ZvcklucmVnaXN0ZXJDYXRjaHJlZ2lzdGVyU3RhY2tUcmFjZXJlZ2lzdGVyQ2F0Y2hUeXBlcmVnaXN0ZXJGaWVsZEluaXRpYWxpemF0aW9ucmVnaXN0ZXJGaWVsZENvbnN0YW50SW5pdGlhbGl6YXRpb25yZWdpc3RlckxvYWRMaWJyYXJ5cmVnaXN0ZXJSZWRpcmVjdGluZ0luaXRpYWxpemVycmVnaXN0ZXJQYXJhbWV0ZXJDaGVja3JlZ2lzdGVyTGF6eUZpZWxkcmVnaXN0ZXJOZXdyZWdpc3RlckNvbnN0SW5zdGFudGlhdGlvbnJlZ2lzdGVyTG9jYWxGdW5jdGlvbkludm9jYXRpb25yZWdpc3Rlckluc3RhbmNlSW52b2NhdGlvbnJlZ2lzdGVyRnVuY3Rpb25JbnZvY2F0aW9ucmVnaXN0ZXJEeW5hbWljR2V0cmVnaXN0ZXJJbnN0YW5jZUdldHJlZ2lzdGVyRHluYW1pY1NldHJlZ2lzdGVySW5zdGFuY2VTZXRyZWdpc3RlclN1cGVySW52b2NhdGlvbnJlZ2lzdGVyU3VwZXJHZXRyZWdpc3RlclN1cGVyU2V0cmVnaXN0ZXJTdXBlckluaXRpYWxpemVycmVnaXN0ZXJDb25zdHJ1Y3Rvck5vZGVyZWdpc3RlckZpZWxkTm9kZXJlZ2lzdGVyUHJvY2VkdXJlTm9kZXJlZ2lzdGVyU3RhdGljSW52b2NhdGlvbk5vZGVyZWdpc3RlclN3aXRjaFN0YXRlbWVudE5vZGVyZWdpc3RlckNvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uTm9kZUltcGFjdEJ1aWxkZXJCYXNlaGFuZGxlQXN5bmNNYXJrZXJVbmV4cGVjdGVkIGFzeW5jIG1hcmtlcjogcG9zaXRpb25Bcmd1bWVudHNfSW1wYWN0QnVpbGRlciZJbXBhY3RCdWlsZGVyQmFzZSZJbXBhY3RSZWdpc3RyeU1peGluaW1wYWN0RGF0YV9yZWdpc3RlckZlYXR1cmVfcmVnaXN0ZXJUeXBlVXNlX3N1cGVySW5pdGlhbGl6ZXJzX3N1cGVyU2V0c19zdXBlckdldHNfc3VwZXJJbnZvY2F0aW9uc19pbnN0YW5jZVNldHNfZHluYW1pY1NldHNfaW5zdGFuY2VHZXRzX2R5bmFtaWNHZXRzX2Z1bmN0aW9uSW52b2NhdGlvbnNfaW5zdGFuY2VJbnZvY2F0aW9uc19keW5hbWljSW52b2NhdGlvbnNfbG9jYWxGdW5jdGlvbkludm9jYXRpb25zX3N0YXRpY0ludm9jYXRpb25zX2NvbnN0cnVjdG9ySW52b2NhdGlvbnNfY29uc3RJbnN0YW50aWF0aW9uc19GZWF0dXJlLmxhenlGaWVsZF9UeXBlVXNlS2luZC5wYXJhbWV0ZXJDaGVja19yZWRpcmVjdGluZ0luaXRpYWxpemVyc19GZWF0dXJlLmxvYWRMaWJyYXJ5X2ZpZWxkSW5pdGlhbGl6ZXJzX2ZpZWxkQ29uc3RhbnRJbml0aWFsaXplcnNfVHlwZVVzZUtpbmQuY2F0Y2hUeXBlX0ZlYXR1cmUuc3RhY2tUcmFjZV9GZWF0dXJlLmNhdGNoQ2xhdXNlX2ZvckluRGF0YV9GZWF0dXJlLnRocm93RXhwcmVzc2lvbl9UeXBlVXNlS2luZC5hc0Nhc3RfVHlwZVVzZUtpbmQuaW1wbGljaXRDYXN0X1R5cGVVc2VLaW5kLmlzQ2hlY2tfRmVhdHVyZS5sb2NhbFdpdGhvdXRJbml0aWFsaXplcl9GZWF0dXJlLnN0cmluZ0NvbmNhdGVuYXRpb25fVHlwZVVzZUtpbmQuYXN5bmNTdGFyTWFya2VyX1R5cGVVc2VLaW5kLmFzeW5jTWFya2VyX1R5cGVVc2VLaW5kLnN5bmNTdGFyTWFya2VyX0ZlYXR1cmUuYXNzZXJ0V2l0aE1lc3NhZ2VfRmVhdHVyZS5hc3NlcnRXaXRob3V0TWVzc2FnZV9zdGF0aWNTZXRzX3N0YXRpY0dldHNfc3RhdGljVGVhck9mZnNfbWFwTGl0ZXJhbHNfbGlzdExpdGVyYWxzX3NldExpdGVyYWxzX0ZlYXR1cmUubnVsbExpdGVyYWxfc3ltYm9sTGl0ZXJhbHNfc3RyaW5nTGl0ZXJhbHNfYm9vbExpdGVyYWxzX2RvdWJsZUxpdGVyYWxzX2ludExpdGVyYWxzX3J1bnRpbWVUeXBlVXNlc19jb25zdHJ1Y3Rvck5vZGVzX2ZpZWxkTm9kZXNfcHJvY2VkdXJlTm9kZXNfc3RhdGljSW52b2NhdGlvbk5vZGVzX3N3aXRjaFN0YXRlbWVudE5vZGVzX2NvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uTm9kZXNJbXBhY3RCdWlsZGVySW1wYWN0QnVpbGRlckRhdGFDb25zdGFudEltcGFjdFZpc2l0b3JVbmV4cGVjdGVkIGNvbnN0YW50IF9nZXROYW1lZEFyZ3VtZW50c01vZHVsYXJDb3JlTW9kdWxhck1lbWJlckRhdGFNb2R1bGFyU3RyYXRlZ3ljb21wdXRlTW9kZWxWYXJpYWJsZVNjb3BlTW9kZWxWYXJpYWJsZVNjb3BlTW9kZWxJbXBsX2Fzc2lnbmVkVmFyaWFibGVzY3JlYXRlU2NvcGVGb3JyZWdpc3RlckFzc2lnbmVkVmFyaWFibGVWYXJpYWJsZVNjb3BlVmFyaWFibGVTY29wZUltcGxfc3ViU2NvcGVzYWRkU3ViU2NvcGVzdWJTY29wZVZhcmlhYmxlQ29sbGVjdG9yTWl4aW5jdXJyZW50VmFyaWFibGVTY29wZXZpc2l0SW5WYXJpYWJsZVNjb3Blb2xkU2NvcGVyZWdpc3RlckNvbnRpbnVlU3dpdGNocmVnaXN0ZXJCYWNrZW5kRnVuY3Rpb25Vc2VyZWdpc3RlckJhY2tlbmRDbGFzc1VzZXJlZ2lzdGVyR2xvYmFsQ2xhc3NEZXBlbmRlbmN5YmFja2VuZEltcGFjdHJlZ2lzdGVyVXNlZE1lbWJlckJhY2tlbmRVc2FnZUJ1aWxkZXJJbXBsX2Zyb250ZW5kU3RyYXRlZ3lfZ2xvYmFsRnVuY3Rpb25EZXBlbmRlbmNpZXNfZ2xvYmFsQ2xhc3NEZXBlbmRlbmNpZXNfaGVscGVyRnVuY3Rpb25zVXNlZF9oZWxwZXJDbGFzc2VzVXNlZF9uZWVkVG9Jbml0aWFsaXplSXNvbGF0ZUFmZmluaXR5VGFnX25lZWRUb0luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5X2lzVmFsaWRCYWNrZW5kVXNlQmFja2VuZCB1c2Ugb2YgX2lzVmFsaWRFbnRpdHlfaW50ZXJuYWwvanNfcnVudGltZS9saWIvX3Byb2Nlc3NCYWNrZW5kU3RhdGljVXNlX3Byb2Nlc3NCYWNrZW5kSW5zdGFudGlhdGlvbkJhY2tlbmRVc2FnZUltcGxiYWNrZW5kLXVzYWdlanNfYmFja2VuZC5iYWNrZW5kLnJlc29sdXRpb25fbGlzdGVuZXJSZXNvbHV0aW9uRW5xdWV1ZXJMaXN0ZW5lcl9kZWZlcnJlZExvYWRUYXNrX2lzTG9hZExpYnJhcnlGdW5jdGlvblJlc29sdmVkX3JlZ2lzdGVyQmFja2VuZEltcGFjdF9hZGRJbnRlcmNlcHRvcnNfY29tcHV0ZURlZmVycmVkTG9hZGluZ0ltcGFjdGRlZmVycmVkIGxvYWRuYXRpdmUgY2xhc3Nlc21haW4gaW1wYWN0Y29tcHV0ZUhlbHBlcnNJbXBhY3RhbGxQYXJhbWV0ZXJUeXBlc19yZWdpc3RlclJ1bnRpbWVUeXBlX3JlZ2lzdGVyQ2hlY2tlZE1vZGVIZWxwZXJzanNfYmFja2VuZC5ydW50aW1lX3R5cGVzX3Jlc29sdXRpb25SdGlOb2RlX3Rlc3RTdGF0ZV9saXRlcmFsU3RhdGVoYXNEaXJlY3RUZXN0aGFzSW5kaXJlY3RUZXN0aGFzVGVzdGhhc0RpcmVjdExpdGVyYWxoYXNJbmRpcmVjdExpdGVyYWxoYXNMaXRlcmFsbWFya1Rlc3RzZXRUZXN0U3RhdGVtYXJrRGlyZWN0VGVzdG1hcmtJbmRpcmVjdFRlc3RtYXJrRGlyZWN0TGl0ZXJhbHNldExpdGVyYWxTdGF0ZW1hcmtJbmRpcmVjdExpdGVyYWxDbGFzc05vZGVNZXRob2ROb2RlaXNDYWxsVGFyZ2V0aW5zdGFuY2VOYW1laXNOb1N1Y2hNZXRob2RzZWxlY3RvckFwcGxpZXNNZXRob2ROb2RlKGZ1bmN0aW9uPSxwYXJhbWV0ZXJTdHJ1Y3R1cmU9LGlzQ2FsbFRhcmdldD0saW5zdGFuY2VOYW1lPVR5cGVWYXJpYWJsZVRlc3RzX21ldGhvZHNfYXBwbGllZFNlbGVjdG9yTWFwX2luc3RhbnRpYXRpb25NYXBfc2V0dXBEZXBlbmRlbmNpZXNfcHJvcGFnYXRlVGVzdHNfcHJvcGFnYXRlTGl0ZXJhbHNfY29sbGVjdFJlc3VsdHNjbGFzc1Rlc3RzRm9yVGVzdGluZ2RpcmVjdENsYXNzVGVzdHNGb3JUZXN0aW5nbWV0aG9kVGVzdHNGb3JUZXN0aW5nZGlyZWN0TWV0aG9kVGVzdHNGb3JUZXN0aW5nZ2V0VHlwZUFyZ3VtZW50RGVwZW5kZW5jaWVzZm9yRWFjaEFwcGxpZWRTZWxlY3RvcmZvckVhY2hHZW5lcmljSW5zdGFudGlhdGlvbl9nZXRDbGFzc05vZGVfZ2V0TWV0aG9kTm9kZXJlZ2lzdGVyRGVwZW5kZW5jaWVzcHJvY2Vzc0VudGl0eXByb2Nlc3NUeXBlVmFyaWFibGVUeXBlcHJvY2Vzc1R5cGVhZGROb2RlIGRpcmVjdCB0ZXN0IGluZGlyZWN0IHRlc3QgZGlyZWN0IGxpdGVyYWwgaW5kaXJlY3QgbGl0ZXJhbGNsYXNzZXM6bWV0aG9kczpleHBsaWNpdCBpcy10ZXN0czppbXBsaWNpdCBpcy10ZXN0czphZGRJbXBsaWNpdENoZWNrYWRkSW1wbGljaXRDaGVja3NUcml2aWFsUnVudGltZVR5cGVzTmVlZFJ1bnRpbWVUeXBlc05lZWRJbXBscnVudGltZS10eXBlcy1uZWVkUnVudGltZVR5cGVzTmVlZEJ1aWxkZXJjb21wdXRlUnVudGltZVR5cGVzTmVlZFRyaXZpYWxSdW50aW1lVHlwZXNOZWVkQnVpbGRlclJ1bnRpbWVUeXBlc05lZWRCdWlsZGVySW1wbGNsYXNzZXNVc2luZ1R5cGVWYXJpYWJsZUxpdGVyYWxzbWV0aG9kc1VzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbHNsb2NhbEZ1bmN0aW9uc1VzaW5nVHlwZVZhcmlhYmxlTGl0ZXJhbHNzZWxlY3RvcnNOZWVkaW5nVHlwZUFyZ3VtZW50c0ZvclRlc3RpbmdpbnN0YW50aWF0aW9uc05lZWRpbmdUeXBlQXJndW1lbnRzRm9yVGVzdGluZ3R5cGVWYXJpYWJsZVRlc3RzRm9yVGVzdGluZ3BvdGVudGlhbGx5TmVlZFR5cGVBcmd1bWVudHNjaGVja0Nsb3N1cmVzcG90ZW50aWFsU3VidHlwZU9mY2hlY2tGdW5jdGlvblR5cGVsb2NhbEZ1bmN0aW9uc1RvUmVtb3ZlY2xvc3VyaXplZE1lbWJlcnNUb1JlbW92ZXByb2Nlc3NDaGVja3NpdGZuZWVkZWRPbkFsbG5lZWRlZE9uRnVuY3Rpb25zY2xhc3Nlc0RpcmVjdGx5TmVlZGluZ1J1bnRpbWVUeXBlaW1wbGllZENsYXNzZXNVbmV4cGVjdGVkIHR5cGUgcmVjZWl2ZXJDbGFzc2VzYXJndW1lbnRDbGFzc2VzcmVjZWl2ZXJDbGFzc2FyZ3VtZW50Q2xhc3NhbGxDbGFzc2VzTmVlZGluZ1J1bnRpbWVUeXBlTmF0aXZlTWVtYmVyUmVzb2x2ZXJhbm5vdGF0aW9uRGF0YUJhc2VOYXRpdmVDbGFzc0ZpbmRlcl90YWdPd25lcl9wcm9jZXNzTmF0aXZlQ2xhc3Nlc0luTGlicmFyeV9wcm9jZXNzU3ViY2xhc3Nlc09mTmF0aXZlQ2xhc3Nlc19wcm9jZXNzTmF0aXZlQ2xhc3MnIGFscmVhZHkgaW4gdXNlIGJ5ICdfZmluZEV4dGVuZHNOYW1lT2ZDbGFzc25hdGl2ZUNsYXNzZXNBbmRTdWJjbGFzc2VzcG90ZW50aWFsRXh0ZW5kc2V4dGVuZHNOYW1lcG90ZW50aWFsU3ViY2xhc3Nlc25hdGl2ZVN1cGVyY2xhc3NPZndhbGtQb3RlbnRpYWxTdWJjbGFzc2VzbmF0aXZlU3VwZXJjbGFzc2lzQW5ub3RhdGlvbmFubm90YXRpb25DbGFzc3JlYWRBbm5vdGF0aW9uTmFtZWtlcm5lbC5kZWZlcnJlZF9sb2FkX2RhdGFLZXJuZWxEZWZlcnJlZExvYWRUYXNrX2FkZGl0aW9uYWxFeHBvcnRzU2V0c19maW5kSW1wb3J0c1RvZmluZC1pbXBvcnRzZ2V0TGlicmFyeU5vZGVnZXRUeXBlZGVmTm9kZUNvbnN0YW50Q29sbGVjdG9yX2lzVmlzaWJsZUtlcm5lbFRvRWxlbWVudE1hcGdldEZvcmVpZ25LaW5kZ2V0SW50ZXJmYWNlVHlwZUZvckpzSW50ZXJjZXB0b3JDYWxsZ2V0TG9jYWxGdW5jdGlvbkZvcmVpZ25LaW5kRm9yZWlnbktpbmQuSlNGb3JlaWduS2luZC5KU19CVUlMVElORm9yZWlnbktpbmQuSlNfRU1CRURERURfR0xPQkFMRm9yZWlnbktpbmQuSlNfSU5URVJDRVBUT1JfQ09OU1RBTlRGb3JlaWduS2luZC5OT05FZGFydDJqcy5rZXJuZWwuZWxlbWVudF9tYXBuYXRpdmVfYmFzaWNfZGF0YS5kYXJ0bm9fc3VjaF9tZXRob2RfcmVzb2x2ZXIuZGFydEtlcm5lbFRvRWxlbWVudE1hcEltcGxfY29uc3RhbnRFdmFsdWF0b3JfbmF0aXZlQmVoYXZpb3JCdWlsZGVyZW5zdXJlQ2xhc3NNZW1iZXJzZW5zdXJlTWVtYmVyc19mb3JFYWNoTWl4aW5LZXJuZWxUb0VsZW1lbnRNYXBCYXNlLl9mb3JFYWNoSW5qZWN0ZWRDbGFzc01lbWJlcl9nZXRUeXBlZGVmTm9kZWdldFBhcmFtZXRlclN0cnVjdHVyZWluY2x1ZGVUeXBlUGFyYW1ldGVyc2V4dHJhY3RFbnVtSW5kZXhGcm9tQ29uc3RhbnRWYWx1ZV9nZXRMaWJyYXJ5Q3JlYXRlRW52aXJvbm1lbnQgb2YgIGlzIGNsb3NlZC4gVHJ5aW5nIHRvIGNyZWF0ZSBsaWJyYXJ5IGZvciBjcmVhdGVMaWJyYXJ5X2dldENsYXNzQ3JlYXRlY2xhc3MgZm9yIGNyZWF0ZUNsYXNzX2dldFR5cGVkZWZDcmVhdGV0eXBlZGVmIGZvciBjcmVhdGVUeXBlZGVmX2dldFR5cGVWYXJpYWJsZUNyZWF0ZXR5cGUgdmFyaWFibGUgZm9yIFVuc3VwcG9ydGVkIGZ1bmN0aW9uIHR5cGUgcGFyYW1ldGVyIHBhcmVudCBub2RlIFVuc3VwcG9ydGVkIHR5cGUgcGFyYW1ldGVyIHR5cGUgbm9kZSBfZ2V0Q29uc3RydWN0b3JDcmVhdGVjb25zdHJ1Y3RvciBmb3IgY3JlYXRlR2VuZXJhdGl2ZUNvbnN0cnVjdG9yaXNGcm9tRW52aXJvbm1lbnRjcmVhdGVGYWN0b3J5Q29uc3RydWN0b3JVbmV4cGVjdGVkIGNvbnN0cnVjdG9yIG5vZGU6IF9nZXRNZXRob2RDcmVhdGVmdW5jdGlvbiBmb3IgQ2Fubm90IGNyZWF0ZSBtZXRob2QgZnJvbSBmYWN0b3J5LmNyZWF0ZUdldHRlcmNyZWF0ZU1ldGhvZGNyZWF0ZVNldHRlcl9nZXRGaWVsZENyZWF0ZWZpZWxkIGZvciBjcmVhdGVGaWVsZG5hdGl2ZUJlaGF2aW9yQnVpbGRlcmdldENhY2hlZFN0YXRpY1R5cGVzZ2V0VHlwZU1hcHNGb3JUZXN0aW5nX2xvb2t1cFByb2NlZHVyZV9pbXBsZW1lbnRzRnVuY3Rpb25VbmV4cGVjdGVkIG1ldGhvZCBub2RlIEtlcm5lbEVsZW1lbnRFbnZpcm9ubWVudEtlcm5lbEJlaGF2aW9yQnVpbGRlcktlcm5lbENvbnN0YW50RW52aXJvbm1lbnRLZXJuZWxFdmFsdWF0aW9uRW52aXJvbm1lbnRLZXJuZWxOYXRpdmVNZW1iZXJSZXNvbHZlcl9pZGVudGlmaWVyXlthLXpBLVpfJF1bYS16QS1aMC05XyRdKiRfcHJvY2Vzc01ldGhvZEFubm90YXRpb25zX2NvbXB1dGVOYXRpdmVNZXRob2RCZWhhdmlvcl9wcm9jZXNzRmllbGRBbm5vdGF0aW9uc2ZpZWxkTG9hZEJlaGF2aW9yX2NvbXB1dGVOYXRpdmVGaWVsZExvYWRCZWhhdmlvcmZpZWxkU3RvcmVCZWhhdmlvcl9jb21wdXRlTmF0aXZlRmllbGRTdG9yZUJlaGF2aW9yX3NldE5hdGl2ZU5hbWVfZmluZEpzTmFtZUZyb21Bbm5vdGF0aW9uQEpTTmFtZSguLi4pIGFubm90YXRpb24gaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RhdGljIGZpZWxkczogX2lzTmF0aXZlTWV0aG9kX3NldE5hdGl2ZU5hbWVGb3JTdGF0aWNNZXRob2RfaXNJZGVudGlmaWVybmF0aXZlTmFtZXNVbmFibGUgdG8gZGV0ZXJtaW5lIGEgbmF0aXZlIG5hbWUgZm9yIHRoZSBlbmNsb3NpbmcgY2xhc3MsIG9wdGlvbnM6IFRvbyBtYW55IEpTTmFtZSBhbm5vdGF0aW9uczogS2VybmVsQ2xhc3NRdWVyaWVzS2VybmVsQW5ub3RhdGlvblByb2Nlc3Nvcl9uYXRpdmVCYXNpY0RhdGFCdWlsZGVyYW5ub3RhdGlvbk5hbWVUb28gbWFueSBuYW1lIGFubm90YXRpb25zLmdldEpzSW50ZXJvcE5hbWVjaGVja0Z1bmN0aW9uUGFyYW1ldGVyc2lzRXhwbGljaXRseWx5SnNMaWJyYXJ5aXNKc0xpYnJhcnlpbXBsZW1lbnRzSnNKYXZhU2NyaXB0T2JqZWN0Q2xhc3NLZXJuZWxOb1N1Y2hNZXRob2RSZXNvbHZlcmZpcnN0UGFyYW1ldGVyX2NyZWF0ZURpYWdub3N0aWNNZXNzYWdlcmVwb3J0TG9jYXRlZE1lc3NhZ2Vjb21waWxlci5rZXJuZWwuZnJvbnRfZW5kX2FkYXB0ZXJDb21waWxlckZpbGVTeXN0ZW1fQ29tcGlsZXJGaWxlU3lzdGVtRW50aXR5RmlsZSBub3QgZm91bmRyZXBvcnRGcm9udEVuZE1lc3NhZ2VfZ2V0U3Bhbm5hYmxlX2NvbnZlcnRNZXNzYWdlbWFpbk1lc3NhZ2V1bmhhbmRsZWQgc2V2ZXJpdHkgQ2xvc3VyZURhdGFTY29wZUluZm9LaW5kY2FwdHVyZWRMb29wU2NvcGVjbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvU2NvcGVJbmZvVW5leHBlY3RlZCBTY29wZUluZm9LaW5kIC53cml0ZVRvRGF0YVNpbmtDYXB0dXJlZFNjb3BlVW5leHBlY3RlZCBDYXB0dXJlZFNjb3BlIGtpbmQgQ2FwdHVyZWRMb29wU2NvcGVVbmV4cGVjdGVkIENhcHR1cmVkTG9vcFNjb3BlIGtpbmQgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mb1VuZXhwZWN0ZWQgQ2xvc3VyZVJlcHJlc2VudGF0aW9uSW5mbyBraW5kIEJveExvY2FsKFR5cGVWYXJpYWJsZUxvY2FsdHlwZV92YXJpYWJsZV9sb2NhbChKU0VudGl0eVByaXZhdGVseU5hbWVkSlNFbnRpdHllbGVtZW50cy5qdW1wc0xhYmVsRGVmaW5pdGlvbmlzVGFyZ2V0ZGFydDJqcy5qc19tb2RlbC50eXBlX3JlY2lwZV9zYW1lRnVsbFN0cnVjdHVyZWFCaW5kaW5nc2JCaW5kaW5nc1NpbmdsZXRvblR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZVNpbmdsZXRvblR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZShGdWxsVHlwZUVudmlyb25tZW50U3RydWN0dXJlRnVsbFR5cGVFbnZpcm9ubWVudFN0cnVjdHVyZSh5aWVsZHNTYW1lVHlwZXJlY2lwZUFzdHJ1Y3R1cmVBcmVjaXBlQnN0cnVjdHVyZUJpc0lkZW50aXR5c3RydWN0dXJlVHlwZUV4cHJlc3Npb25SZWNpcGUoVHlwZUVudmlyb25tZW50UmVjaXBlU2luZ2xldG9uVHlwZUVudmlyb25tZW50UmVjaXBlU2luZ2xldG9uVHlwZUVudmlyb25tZW50UmVjaXBlKEZ1bGxUeXBlRW52aXJvbm1lbnRSZWNpcGVfZXF1YWxhVHlwZXNiVHlwZXNGdWxsVHlwZUVudmlyb25tZW50UmVjaXBlKEludm9rZUR5bmFtaWNTcGVjaWFsaXplcmNvbXB1dGVUeXBlRnJvbUlucHV0VHlwZXN0cnlDb252ZXJ0VG9CdWlsdGlucmVuYW1lVG9PcHRpbWl6ZWRTZWxlY3Rvcmxvb2t1cFNwZWNpYWxpemVySW5kZXhBc3NpZ25TcGVjaWFsaXplcl92YWx1ZVBhcmFtZXRlckNoZWNrQWx3YXlzU3VjY2VlZHNyZWdpc3RlckluZGV4QXNzaWduSW5kZXhTcGVjaWFsaXplcnJlZ2lzdGVySW5kZXhCaXROb3RTcGVjaWFsaXplcnJlZ2lzdGVyQml0Tm90VW5hcnlOZWdhdGVTcGVjaWFsaXplcnJlZ2lzdGVyVW5hcnlOZWdhdGVBYnNTcGVjaWFsaXplcnJlZ2lzdGVyQWJzcmVnaXN0ZXJPcHRpbWl6YXRpb25CaW5hcnlBcml0aG1ldGljU3BlY2lhbGl6ZXJpc0J1aWx0aW5uZXdCdWlsdGluVmFyaWFudGlucHV0c0FyZU51bWlucHV0c0FyZVBvc2l0aXZlSW50ZWdlcnNpbnB1dHNBcmVVSW50MzFBZGRTcGVjaWFsaXplcnJlZ2lzdGVyQWRkRGl2aWRlU3BlY2lhbGl6ZXJyZWdpc3RlckRpdmlkZU1vZHVsb1NwZWNpYWxpemVyY2FuQmVQb3NpdGl2ZVplcm9pblBoaWNhbkJlTmVnYXRpdmVaZXJvcmVnaXN0ZXJNb2R1bG9SZW1haW5kZXJTcGVjaWFsaXplcnJlZ2lzdGVyUmVtYWluZGVyTXVsdGlwbHlTcGVjaWFsaXplcnJlZ2lzdGVyTXVsdGlwbHlTdWJ0cmFjdFNwZWNpYWxpemVycmVnaXN0ZXJTdWJ0cmFjdFRydW5jYXRpbmdEaXZpZGVTcGVjaWFsaXplcmhhc1VpbnQzMVJlc3VsdGlzTm90WmVyb2lzVHdvT3JHcmVhdGVyX3RkaXZGYXN0cmVnaXN0ZXJUcnVuY2F0aW5nRGl2aWRlQmluYXJ5Qml0T3BTcGVjaWFsaXplcmFyZ3VtZW50TGVzc1RoYW4zMmFyZ3VtZW50SW5SYW5nZVNoaWZ0TGVmdFNwZWNpYWxpemVyX3NobFBvc2l0aXZlcmVnaXN0ZXJTaGlmdExlZnRTaGlmdFJpZ2h0U3BlY2lhbGl6ZXJfc2hyQm90aFBvc2l0aXZlX3NoclJlY2VpdmVyUG9zaXRpdmVfc2hyT3RoZXJQb3NpdGl2ZXJlZ2lzdGVyU2hpZnRSaWdodEJpdE9yU3BlY2lhbGl6ZXJyZWdpc3RlckJpdE9yQml0QW5kU3BlY2lhbGl6ZXJyZWdpc3RlckJpdEFuZEJpdFhvclNwZWNpYWxpemVycmVnaXN0ZXJCaXRYb3JSZWxhdGlvbmFsU3BlY2lhbGl6ZXJFcXVhbHNTcGVjaWFsaXplcnJlZ2lzdGVyRXF1YWxzTGVzc1NwZWNpYWxpemVycmVnaXN0ZXJMZXNzR3JlYXRlclNwZWNpYWxpemVycmVnaXN0ZXJHcmVhdGVyR3JlYXRlckVxdWFsU3BlY2lhbGl6ZXJyZWdpc3RlckdyZWF0ZXJFcXVhbExlc3NFcXVhbFNwZWNpYWxpemVycmVnaXN0ZXJMZXNzRXF1YWxDb2RlVW5pdEF0U3BlY2lhbGl6ZXJfY29kZVVuaXRBdHJlZ2lzdGVyQ29kZVVuaXRBdENvbXBhcmVUb1NwZWNpYWxpemVycmVnaXN0ZXJDb21wYXJlVG9JZGVtcG90ZW50U3RyaW5nT3BlcmF0aW9uU3BlY2lhbGl6ZXJTdWJzdHJpbmdTcGVjaWFsaXplcnJlZ2lzdGVyU3Vic3RyaW5nVHJpbVNwZWNpYWxpemVycmVnaXN0ZXJUcmltUGF0dGVybk1hdGNoU3BlY2lhbGl6ZXJyZWdpc3RlclBhdHRlcm5NYXRjaFJvdW5kU3BlY2lhbGl6ZXJyZWdpc3RlclJvdW5kSFZhbGlkYXRvcnZpc2l0ZWVtYXJrSW52YWxpZGVtcHR5IGJsb2NrYmxvY2sgZW5kcyB3aXRoIG5vbi10YWlsIG5vZGUuSWYgbm9kZSB3aXRob3V0IHR3byBzdWNjZXNzb3JzQ29uZGl0aW9uYWwgbm9kZSB3aXRob3V0IHR3byBzdWNjZXNzb3JzYXZvaWRDcml0aWNhbEVkZ2VCbG9ja0NyaXRpY2FsIGVkZ2UgYmxvY2sgY29udGFpbnMgaW5zdHJ1Y3Rpb25zR290byBub2RlIHdpdGggbm90IGV4YWN0bHkgb25lIHN1Y2Nlc3NvckJyZWFrIG9yIGNvbnRpbnVlIG5vZGUgd2l0aG91dCBvbmUgc3VjY2Vzc29yUmV0dXJuIG9yIHRocm93IG5vZGUgd2l0aCA+IDEgc3VjY2Vzc29yIG9yIG5vdCBnb2luZyB0byBleGl0LWJsb2NrRXhpdCBibG9jayB3aXRoIHN1Y2Nlc3Nvck5vbi1leGl0IGJsb2NrIHdpdGhvdXQgc3VjY2Vzc29yYmxvY2sgd2l0aG91dCBpZHN1Y2Nlc3NvciB3aXRob3V0IGlkc3VjY2Vzc29yIHdpdGggbG93ZXIgaWQsIGJ1dCBub3QgYSBsb29wLWhlYWRlclNTQSBncmFwaCBjb250YWlucyBjcml0aWNhbCBlZGdlLmxhc3RJZGRvbWluYXRlZGRvbWluYXRlZCBibG9jayBub3QgcG9pbnRpbmcgYmFja2RvbWluYXRlZC5pZCA9PSBudWxsIG9yIGRvbWluYXRlZCBoYXMgPD0gaWREZWZpbml0aW9uIGRvZXMgbm90IGRvbWluYXRlIHVzZWNvdW50SW5zdHJ1Y3Rpb25ldmVyeUluc3RydWN0aW9uaGFzQ29ycmVjdElucHV0c2luQmFzaWNCbG9ja2hhc0NvcnJlY3RVc2VzSW5zdHJ1Y3Rpb24gaW4gd3JvbmcgYmxvY2tJbmNvcnJlY3QgaW5wdXRzSW5jb3JyZWN0IHVzZXNlbnRpdHlfdXRpbHNjb21wYXJlTGlicmFyaWVzVXJpc2J5Q2Fub25pY2FsVXJpUGF0aF9jb21wYXJlQ2Fub25pY2FsVXJpYVNlZ21lbnRzYlNlZ21lbnRzYUliSWFTZWdtZW50YlNlZ21lbnRjb21wYXJlU291cmNlVXJpc2NvbXBhcmVFbnRpdGllc2VsZW1lbnQxbGluZTFjb2x1bW4xZWxlbWVudDJsaW5lMmNvbHVtbjJyZWNvbnN0cnVjdENvbnN0cnVjdG9yTmFtZXJlY29uc3RydWN0Q29uc3RydWN0b3JOYW1lU291cmNlU3RyaW5nb3BlcmF0b3IkZXFvcGVyYXRvciRub3RvcGVyYXRvciRpbmRleG9wZXJhdG9yJGluZGV4U2V0b3BlcmF0b3IkbXVsb3BlcmF0b3IkZGl2b3BlcmF0b3IkbW9kb3BlcmF0b3IkdGRpdm9wZXJhdG9yJGFkZG9wZXJhdG9yJHNobG9wZXJhdG9yJHNocm9wZXJhdG9yJHNocnVvcGVyYXRvciRnZW9wZXJhdG9yJGd0b3BlcmF0b3IkbGVvcGVyYXRvciRsdG9wZXJhdG9yJGFuZG9wZXJhdG9yJHhvcm9wZXJhdG9yJG9yb3BlcmF0b3Ikc3Vib3BlcmF0b3IkbmVnYXRlY29uc3RydWN0T3BlcmF0b3JOYW1lT3JOdWxsaXNVbmFyeWNvbnN0cnVjdE9wZXJhdG9yTmFtZVVuaGFuZGxlZCBvcGVyYXRvcjogZGFydDJqcy5vcGVyYXRvcnNVbmFyeU9wZXJhdG9yS2luZE5PVE5FR0FURUNPTVBMRU1FTlRVbmFyeU9wZXJhdG9yaXNVc2VyRGVmaW5hYmxlZnJvbUtpbmRCaW5hcnlPcGVyYXRvcktpbmROT1RfRVFBRERTVUJNVUxESVZJRElWTU9EU0hMU0hSU0hSVUdURVFMVEVRQU5ET1JYT1JJRl9OVUxMQmluYXJ5T3BlcmF0b3JwYXJzZVVzZXJEZWZpbmFibGVfTm90RXF1YWxzT3BlcmF0b3JfTG9naWNhbE9wZXJhdG9yX0lmTnVsbE9wZXJhdG9yaW52b2NhdGlvbk1pcnJvck1ldGhvZEtpbmRpbnZvY2F0aW9uTWlycm9yR2V0dGVyS2luZGludm9jYXRpb25NaXJyb3JTZXR0ZXJLaW5kS0Nsb3NlZFdvcmxkSW1wbGRhcnQyanMud29ybGQuY2xhc3Nfc2V0SW5kZXhlZENsYXNzRm9yRWFjaEZ1bmN0aW9uSW5zdGFudGlhdGlvbi5JTkRJUkVDVExZX0lOU1RBTlRJQVRFRFVOSU5TVEFOVElBVEVERElSRUNUTFlfSU5TVEFOVElBVEVESU5ESVJFQ1RMWV9JTlNUQU5USUFURURBQlNUUkFDVExZX0lOU1RBTlRJQVRFRGNsYXNzLWhpZXJhcmNoeS1ub2RlRVhQTElDSVRMWV9JTlNUQU5USUFURURfbGVhc3RVcHBlckluc3RhbnRpYXRlZFN1YmNsYXNzX2luc3RhbnRpYXRlZFN1YmNsYXNzQ291bnRfZGlyZWN0U3ViY2xhc3Nlc2FkZERpcmVjdFN1YmNsYXNzaW5jbHVkZURpcmVjdGx5SW5zdGFudGlhdGVkaW5jbHVkZUluZGlyZWN0bHlJbnN0YW50aWF0ZWRpbmNsdWRlVW5pbnN0YW50aWF0ZWRpbmNsdWRlQWJzdHJhY3RseUluc3RhbnRpYXRlZF91cGRhdGVQYXJlbnRJbnN0YW50aWF0ZWRTdWJjbGFzc0NvdW50X3VwZGF0ZUluc3RhbnRpYXRlZFN1YmNsYXNzQ291bnRjaGFuZ2VhZnRlcm5vZGVNYXBObyBDbGFzc0hpZXJhcmNoeU5vZGUgZm9yIHN1cGVyY2xhc3MgbWFza1ZhbHVlZGlyZWN0U3ViY2xhc3Nlc2luY2x1ZGVSb290d3JhcHBlcm5leHRTdGVwc3ViRm9yRWFjaF9jb21wdXRlTGVhc3RVcHBlckluc3RhbnRpYXRlZFN1YmNsYXNzaXNSZWxhdGVkVG9fc3ViY2xhc3NhYnN0cmFjdCAgaW5kaXJlY3RseSwKY2xhc3Mtc2V0X2xlYXN0VXBwZXJJbnN0YW50aWF0ZWRTdWJ0eXBlX3N1YnR5cGVzX21peGluQXBwbGljYXRpb25zbWl4aW5BcHBsaWNhdGlvbnNuZXdTdWJ0eXBlc2FkZGVkb3RoZXJTdWJ0eXBlb3RoZXJIaWVyYXJjaHlEZXB0aF9jb21wdXRlTGVhc3RVcHBlckluc3RhbnRpYXRlZFN1YnR5cGVzdWJub2RlWwogIHN1YnR5cGVzOgogIG1peGluLWFwcGxpY2F0aW9uczoKQ2xhc3NIaWVyYXJjaHlOb2RlSXRlcmFibGVObyByb290IGZvciBpdGVyYWJsZS5DbGFzc0hpZXJhcmNoeU5vZGVJdGVyYXRvcl9maW5kTmV4dF9pc1ZhbGlkU3VidHlwZXNJdGVyYWJsZVN1YnR5cGVzSXRlcmF0b3JoaWVyYXJjaHlOb2Rlc0l0ZXJhdGlvblN0ZXBTVE9QU0tJUF9TVUJDTEFTU0VTQ2xhc3NIaWVyYXJjaHlOb2Rlc01hcENsYXNzSGllcmFyY2h5Tm9kZXNNYXAgZm9yIENsYXNzSGllcmFyY2h5Tm9kZXNNYXAua2V5c0NsYXNzSGllcmFyY2h5Tm9kZXNNYXAucmVtb3ZlQ2xhc3NIaWVyYXJjaHlOb2Rlc01hcC5jbGVhcmRhcnQyanMuanNfZW1pdHRlci5zb3J0ZXJTb3J0ZXJkYXJ0MmpzLmNvbnN0YW50cy5jb25zdHJ1Y3RvcnNDb25zdGFudENvbnN0cnVjdG9yS2luZENvbnN0YW50Q29uc3RydWN0b3JLaW5kLkdFTkVSQVRJVkVDb25zdGFudENvbnN0cnVjdG9yS2luZC5SRURJUkVDVElOR19HRU5FUkFUSVZFQ29uc3RhbnRDb25zdHJ1Y3RvcktpbmQuUkVESVJFQ1RJTkdfRkFDVE9SWUNvbnN0YW50Q29uc3RydWN0b3JLaW5kLkVSUk9ORU9VU0dFTkVSQVRJVkVSRURJUkVDVElOR19HRU5FUkFUSVZFUkVESVJFQ1RJTkdfRkFDVE9SWUluc3RhbmNlRGF0YUNvbnN0YW50Q29uc3RydWN0b3JDb25zdGFudENvbnN0cnVjdG9yVmlzaXRvcnZpc2l0R2VuZXJhdGl2ZXZpc2l0UmVkaXJlY3RpbmdHZW5lcmF0aXZldmlzaXRSZWRpcmVjdGluZ0ZhY3Rvcnl2aXNpdEVycm9uZW91c0dlbmVyYXRpdmVDb25zdGFudENvbnN0cnVjdG9yZGVmYXVsdFZhbHVlc3N1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uYXBwbGllZEluc3RhbmNlRGF0YXsndHlwZSc6ICwKICdkZWZhdWx0OiwKICdmaWVsZDosCiAnY29uc3RydWN0b3I6IG1hcDFtYXAyYXBwbHlJbnN0YW5jZURhdGFjb25zdHJ1Y3Rvckludm9jYXRpb25hcHBsaWVkRmllbGRNYXBhcHBsaWVkQXNzZXJ0aW9uc1JlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0YW50Q29uc3RydWN0b3J0aGlzQ29uc3RydWN0b3JJbnZvY2F0aW9uLAogJ2NvbnN0cnVjdG9yJzogUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RhbnRDb25zdHJ1Y3RvcnRhcmdldENvbnN0cnVjdG9ySW52b2NhdGlvbidjb25zdHJ1Y3Rvcic6IEVycm9uZW91c0NvbnN0YW50Q29uc3RydWN0b3JFcnJvbmVvdXNDb25zdGFudENvbnN0cnVjdG9yLmNvbXB1dGVJbnN0YW5jZVR5cGVkYXJ0MmpzLmNvbnN0YW50cy5ldmFsdWF0aW9uZW5jbG9zaW5nQ29uc3RydWN0ZWRUeXBlRXZhbHVhdGlvbkVudmlyb25tZW50QmFzZV9zcGFubmFibGVTdGFja19jdXJyZW50bHlFdmFsdWF0ZWRGaWVsZHNfc3Bhbm5hYmxlTm9ybWFsaXplZEFyZ3VtZW50c05vIGRlZmF1bHQgdmFsdWUgZm9yIG5hbWVkIGFyZ3VtZW50ICdObyB2YWx1ZSBmb3IgbmFtZWQgYXJndW1lbnQgJ05vIGRlZmF1bHQgdmFsdWUgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQgTm8gdmFsdWUgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQgTm9ybWFsaXplZEFyZ3VtZW50c1tkZWZhdWx0VmFsdWVzPXt9LGNhbGxTdHJ1Y3R1cmU9XV1fY2FuZGlkYXRlc19jb21wdXRlQ292YXJpYW5jZUZpeGVzX3N1YnN0aXR1dGlvbkZvcmdldENhbmRpZGF0ZUF0X2NyZWF0ZUZvcndhcmRpbmdTdHViaW50ZXJmYWNlUG9zaXRpb25hbFBhcmFtZXRlcnNnZXRQb3NpdGlvbmFsUGFyYW1ldGVyc2ludGVyZmFjZVR5cGVQYXJhbWV0ZXJzY3JlYXRlU3R1YklmTmVlZGVkaXNJbXBsQ3JlYXRlZGNyZWF0ZUltcGxJZk5lZWRlZF9jcmVhdGVGb3J3YXJkaW5nSW1wbElmTmVlZGVkb3RoZXJNZW1iZXJvdGhlclBvc2l0aW9uYWxQYXJhbWV0ZXJzb3RoZXJQYXJhbWV0ZXJzdXBlclR5cGVQYXJhbWV0ZXJvdGhlclR5cGVQYXJhbWV0ZXJzb3RoZXJUeXBlUGFyYW1ldGVyY29weVBhcmFtZXRlcnRhcmdldFR5cGVQYXJhbWV0ZXJzYWRkaXRpb25hbFN1YnN0aXR1dGlvbnRhcmdldFR5cGVQYXJhbWV0ZXJnZXRSZXF1aXJlZFBhcmFtZXRlckNvdW50Z2V0UmV0dXJuVHlwZWZpbmFsVGFyZ2V0X2dldEZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRmb3J3YXJkaW5nU3R1YmZhc3RhLnR5cGVzaXNTdWJ0eXBlT2ZLZXJuZWxOdWxsYWJpbGl0eXNOdWxsYWJpbGl0eXROdWxsYWJpbGl0eWlzRHluYW1pY1JlbGF0ZWRpc1ZvaWRSZWxhdGVkaXNGdXR1cmVPclJlbGF0ZWRpc0ludGVyZmFjZVJlbGF0ZWRpc0Z1bmN0aW9uUmVsYXRlZGlzVHlwZVBhcmFtZXRlclJlbGF0ZWRpc0ludGVyc2VjdGlvblJlbGF0ZWRpc1R5cGVkZWZSZWxhdGVkVW5oYW5kbGVkIHR5cGU6IFVuaGFuZGxlZCB0eXBlIGNvbWJpbmF0aW9uOiBhcmVTdWJ0eXBlc09mS2VybmVsTnVtYmVycyBvZiB0eXBlIGFyZ3VtZW50cyBkb24ndCBtYXRjaCBpc1NhbWVUeXBlS2VybmVsVHlwZVJlbGF0aW9uaW50ZXJzZWN0aW9uTnVsbGFiaWxpdHlmdXR1cmVPck51bGxhYmlsaXR5SXNJbnRlcmZhY2VTdWJ0eXBlT2Zhc1N1cGVydHlwZUlzRnVuY3Rpb25TdWJ0eXBlT2ZzVHlwZVZhcmlhYmxlc3RUeXBlVmFyaWFibGVzdHlwZVZhcmlhYmxlU3Vic3RpdHV0aW9uc2Vjb25kQm91bmRzQ2hlY2tOZWVkZWRzVHlwZVZhcmlhYmxldFR5cGVWYXJpYWJsZXNQb3NpdGlvbmFsdFBvc2l0aW9uYWxzTmFtZWR0TmFtZWRzQ291bnR0Q291bnRJc1R5cGVQYXJhbWV0ZXJTdWJ0eXBlT2ZJc1R5cGVkZWZTdWJ0eXBlT2ZJc0Z1dHVyZU9yU3VidHlwZU9mc0Z1dHVyZU9yTnVsbGFiaWxpdHl0RnV0dXJlT3J0RnV0dXJlT3JOdWxsYWJpbGl0eUlzSW50ZXJzZWN0aW9uU3VidHlwZU9mc0ludGVyc2VjdGlvbnNJbnRlcnNlY3Rpb25OdWxsYWJpbGl0eXRJbnRlcnNlY3Rpb250SW50ZXJzZWN0aW9uTnVsbGFiaWxpdHlmYXN0YS5pZ25vcmVkX3BhcnNlcl9lcnJvcnNEaXJlY3RpdmVDb250ZXh0RGlyZWN0aXZlU3RhdGUuVW5rbm93bkRpcmVjdGl2ZVN0YXRlLlNjcmlwdEludGVybmFsIGVycm9yOiBVbmV4cGVjdGVkIHNjcmlwdCB0YWcuRGlyZWN0aXZlU3RhdGUuUGFydE9mRGlyZWN0aXZlU3RhdGUuRGVjbGFyYXRpb25zRGlyZWN0aXZlU3RhdGUuSW1wb3J0QW5kRXhwb3J0RGlyZWN0aXZlU3RhdGUuUGFydERpcmVjdGl2ZVN0YXRlLkxpYnJhcnlEaXJlY3RpdmVTdGF0ZVVua25vd25JbXBvcnRBbmRFeHBvcnREZWNsYXJhdGlvbnNJbnRlcm5hbCBFcnJvcjogc2hvdWxkIG5vdCBjYWxsIHBhcnNlIHNob3VsZCBpbXBsZW1lbnQgcGFyc2VmYXN0YS5wYXJzZXIubG9vcF9zdGF0ZU91dHNpZGVMb29wSW5zaWRlU3dpdGNoSW5zaWRlTG9vcGZpbmFsVG9rZW52YXJUb2tlbmFmdGVyRmFjdG9yeUludGVybmFsIGVycm9yOiBVbmV4cGVjdGVkIHN0YXRpY09yQ292YXJpYW50ICdJbnRlcm5hbCBlcnJvcjogVW5leHBlY3RlZCB2YXJGaW5hbE9yQ29uc3QgJ3JlcG9ydEV4dHJhbmVvdXNNb2RpZmllcnBhcnNlQWJzdHJhY3RwYXJzZUNvbnN0cGFyc2VDb3ZhcmlhbnRwYXJzZUV4dGVybmFscGFyc2VGaW5hbHBhcnNlTGF0ZXBhcnNlUmVxdWlyZWRwYXJzZVN0YXRpY3BhcnNlVmFySW50ZXJuYWwgRXJyb3I6IFVuaGFuZGxlZCBtb2RpZmllcjogcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVycmVwb3J0Q29uZmxpY3RpbmdNb2RpZmllcnNJbnRlcm5hbCBFcnJvcjogVW5leHBlY3RlZCB2YXJGaW5hbE9yQ29uc3Q6IEludGVybmFsIEVycm9yOiBVbmhhbmRsZWQgcmVjb3Zlcnk6IGVhcmxpZXJNb2RpZmllcmJlZm9yZU1vZGlmaWVyX1Rva2VuU3RyZWFtUmV3cml0ZXImT2JqZWN0Jl9Ub2tlblN0cmVhbU1peGlubmV3VG9rZW5UeXBldXNlIGluc2VydFN5bnRoZXRpY0tleXdvcmQgaW5zdGVhZGluY2x1ZGVJZGVudGlmaWVycmVwbGFjZW1lbnRUb2tlbnJlcGxhY2VkVG9rZW5fbGFzdFRva2VuSW5DaGFpbl9Ub2tlblN0cmVhbUdob3N0V3JpdGVyJk9iamVjdCZfVG9rZW5TdHJlYW1NaXhpblRva2VuU3RyZWFtR2hvc3RXcml0ZXJyaWdodFBhcmVubmV3RW5kR3JvdXBfVG9rZW5TdHJlYW1NaXhpbmZhc3RhLnBhcnNlci50eXBlX2luZm9wYXJzZVR5cGVOb3RWb2lkaXNTaW1wbGVUeXBlQXJndW1lbnQgaXMgbm90IGEgU2ltcGxlVHlwZUFyZ3VtZW50LmlzR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGVjb21wdXRlQnVpbHRpbk9yVmFyQXNUeXBlY29tcHV0ZVByZWZpeGVkVHlwZWNvbXB1dGVWb2lkR0ZUY29tcHV0ZU5vVHlwZUdGVGNvbXB1dGVTaW1wbGVXaXRoVHlwZUFyZ3VtZW50c2NvbXB1dGVJZGVudGlmaWVyR0ZUY29tcHV0ZUlkZW50aWZpZXJRdWVzdGlvbkdGVGNvbXB1dGVDYXRjaFBhcmFtZXRlcklkZW50aWZpZXJDb250ZXh0Q2xhc3NPck1peGluT3JFeHRlbnNpb25JZGVudGlmaWVyQ29udGV4dENvbWJpbmF0b3JJZGVudGlmaWVyQ29udGV4dENvbnN0cnVjdG9yUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHRjb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNEb3R0ZWROYW1lSWRlbnRpZmllckNvbnRleHRFbnVtRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dEVudW1WYWx1ZURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHRFeHByZXNzaW9uSWRlbnRpZmllckNvbnRleHRGaWVsZERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHRGaWVsZEluaXRpYWxpemVySWRlbnRpZmllckNvbnRleHRGb3JtYWxQYXJhbWV0ZXJEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0SW1wb3J0UHJlZml4SWRlbnRpZmllckNvbnRleHRMaXRlcmFsU3ltYm9sSWRlbnRpZmllckNvbnRleHRMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dExhYmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dExhYmVsUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHRMaWJyYXJ5SWRlbnRpZmllckNvbnRleHRMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dE1ldGFkYXRhUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHRNZXRob2REZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0TmFtZWRBcmd1bWVudFJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0Zm9sbG93aW5nVmFsdWVzVHlwZWRlZkRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHRUeXBlUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHRwcmVmaXhlZFR5cGVWYXJpYWJsZURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHRjaGVja0FzeW5jQXdhaXRZaWVsZEFzSWRlbnRpZmllcmxvb2tzTGlrZVN0YXJ0T2ZOZXh0Q2xhc3NNZW1iZXJsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb25kYXJ0MmpzLmpzX2VtaXR0ZXIucHJvZ3JhbV9idWlsZGVyQ2xhc3NTdHViR2VuZXJhdG9ySW5zdGFudGlhdGlvblN0dWJHZW5lcmF0b3JJbnRlcmNlcHRvclN0dWJHZW5lcmF0b3JNYWluQ2FsbFN0dWJHZW5lcmF0b3JQYXJhbWV0ZXJTdHViR2VuZXJhdG9yUnVudGltZVR5cGVHZW5lcmF0b3JUeXBlVGVzdFByb3BlcnRpZXNjb2xsZWN0b3IuZGFydGZpZWxkX3Zpc2l0b3IuZGFydHJlZ2lzdHJ5LmRhcnRBY2NlcHRGaWVsZGFjY2Vzc29yTmFtZW5lZWRzR2V0dGVybmVlZHNTZXR0ZXJuZWVkc0NoZWNrZWRTZXR0ZXJQcm9ncmFtQnVpbGRlcl9jb2RlZ2VuV29ybGRfcnRpQ2hlY2tzX3J0aVJlY2lwZUVuY29kZXJfZ2VuZXJhdGVkQ29kZV9ydGlOZWVkZWRDbGFzc2VzX3N0b3JlRnVuY3Rpb25UeXBlc0luTWV0YWRhdGFfb3V0cHV0c19jb25zdGFudHNfdW5uZWVkZWROYXRpdmVDbGFzc2VzX25vdFNvZnREZWZlcnJlZGJ1aWxkUHJvZ3JhbXN0b3JlRnVuY3Rpb25UeXBlc0luTWV0YWRhdGFfaW5pdGlhbGl6ZVNvZnREZWZlcnJlZE1hcHJlZ2lzdGVyT3V0cHV0VW5pdG91dHB1dENsYXNzTGlzdHNyZWdpc3RlckNsYXNzZXNvdXRwdXRTdGF0aWNMaXN0c3JlZ2lzdGVyTWVtYmVyc291dHB1dENvbnN0YW50TGlzdHNfcmVnaXN0ZXJDb25zdGFudHNvdXRwdXRTdGF0aWNOb25GaW5hbEZpZWxkTGlzdHNfcmVnaXN0ZXJTdGF0aWNTdGF0ZUhvbGRlcl9idWlsZENsYXNzc2V0U3VwZXJjbGFzc05vIENsYXNzIGZvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBzdXBlcmNsYXNzIGlzU2ltcGxlTWl4aW5BcHBsaWNhdGlvbmVmZmVjdGl2ZU1peGluQ2xhc3NzZXRNaXhpbkNsYXNzTm8gY2xhc3MgZm9yIGVmZmVjdGl2ZSBtaXhpbiBpbnRlcmNlcHRvckNsYXNzZXNOZWVkZWRCeUNvbnN0YW50c2NvbXB1dGVJbnRlcmNlcHRvcnNSZWZlcmVuY2VkRnJvbUNvbnN0YW50c3ByZXBhcmVOYXRpdmVDbGFzc2VzX2FkZEpzSW50ZXJvcFN0dWJzbWFpbkxpYnJhcmllc01hcG1haW5GcmFnbWVudF9idWlsZE1haW5GcmFnbWVudGRlZmVycmVkRnJhZ21lbnRzZGVmZXJyZWRMaWJyYXJpZXNNYXBfYnVpbGREZWZlcnJlZEZyYWdtZW50bGlicmFyaWVzTWFwQ291bnRfbWFya0VhZ2VyQ2xhc3Nlc2hvbGRlcnNuZWVkc05hdGl2ZVN1cHBvcnRmaW5hbGl6ZXJzbmFtaW5nRmluYWxpemVyX2J1aWxkTG9hZE1hcF9idWlsZFR5cGVUb0ludGVyY2VwdG9yTWFwb3V0cHV0Q29udGFpbnNDb25zdGFudExpc3RoYXNTb2Z0RGVmZXJyZWRDbGFzc2VzX21hcmtFYWdlckludGVyY2VwdG9yQ2xhc3Nlc2FsbG9jYXRlZENsYXNzZXNQYXRoYmxhY2tMaXN0ZGFydDp0eXBlZF9kYXRhX2ltcGxlbWVudGF0aW9uUHJvZmlsZSBmaWxlIGRvZXMgbm90IGV4aXN0OiBQcm9maWxlIGluZm9ybWF0aW9uIChhbGxvY2F0ZWQgY2xhc3NlcykgaXMgZW1wdHkucmVhZEFzU3RyaW5nU3luY2FsbG9jYXRlZENsYXNzZXNLZXlzYWxsb2NhdGVkQ2xhc3Nlc2xvYWRNYXBzdHViR2VuZXJhdG9yZ2VuZXJhdGVUeXBlVG9JbnRlcmNlcHRvck1hcGxpYnJhcmllc01hcF9idWlsZEludm9rZU1haW5fYnVpbGRMaWJyYXJpZXNfYnVpbGRTdGF0aWNOb25GaW5hbEZpZWxkc19idWlsZFN0YXRpY0xhemlseUluaXRpYWxpemVkRmllbGRzX2J1aWxkQ29uc3RhbnRzY29uc3RhbnRWYWx1ZXNzdGF0aWNOb25GaW5hbEZpZWxkc19idWlsZFN0YXRpY0ZpZWxkcmVnaXN0ZXJIb2xkZXJpc0NvbnN0YW50c0hvbGRlcmlzSW5pdGlhbGl6ZWRCeUNvbnN0YW50bGF6eUZpZWxkc19idWlsZExhenlGaWVsZF9idWlsZExpYnJhcnl0b1N0cmluZ0ludm9jYXRpb25jYWxsU3R1YnNfYnVpbGRTdHViTWV0aG9kZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLiModGhpcykgfXN0dWJOYW1lc2NsYXNzRWxlbWVudHNzdHViTmFtZWZ1bmN0aW9uKG9iaikgeyByZXR1cm4gb2JqLiMgfWZ1bmN0aW9uKG9iaiwgdikgeyByZXR1cm4gb2JqLiMgPSB2IH1pc0Z1bmN0aW9uTGlrZW1pbkFyZ3NtYXhBcmdzZnVuY3Rpb24ocmVjZWl2ZXIsICMpIHsgcmV0dXJuIHJlY2VpdmVyLiMoIykgfW1lbWJlckVsZW1lbnRzc3RhdGljc19idWlsZFN0YXRpY01ldGhvZF9nZW5lcmF0ZUdldEludGVyY2VwdG9yTWV0aG9kc19nZW5lcmF0ZU9uZVNob3RJbnRlcmNlcHRvcnN2aXNpdFN0YXRpY3NzdGF0aWNGaWVsZHNGb3JSZWZsZWN0aW9uX2J1aWxkRmllbGRzX2lzU29mdERlZmVycmVkb25seUZvclJ0aWNsYXNzZXNPbmx5TmVlZGVkRm9yUnRpaGFzUnRpRmllbGRpc0Nsb3N1cmVCYXNlQ2xhc3NjbGFzc1N0dWJHZW5lcmF0b3JydW50aW1lVHlwZUdlbmVyYXRvcnZpc2l0SW5zdGFuY2VNZW1iZXJfYnVpbGRNZXRob2RjYWxsU3R1YnNGb3JNZW1iZXJnZW5lcmF0ZUNhbGxTdHVic0ZvckdldHRlcnZpc2l0TWVtYmVybm9TdWNoTWV0aG9kU3R1YnNjb21wdXRlU2VsZWN0b3JzRm9yTnNtSGFuZGxlcnNnZW5lcmF0ZVN0dWJGb3JOb1N1Y2hNZXRob2RmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH1fZ2VuZXJhdGVJbnN0YW50aWF0aW9uU3R1YnNpbnN0YW5jZUZpZWxkc2lzSG9sZGVySW50ZXJjZXB0ZWRDbGFzc3R5cGVUZXN0c2dlbmVyYXRlSXNUZXN0c3N0b3JlRnVuY3Rpb25UeXBlSW5NZXRhZGF0YWNoZWNrZWRTZXR0ZXJzZm9yRWFjaFByb3BlcnR5bmVlZHNVbmNoZWNrZWRTZXR0ZXJObyBzZXR0ZXIgY29kZSBmb3IgZmllbGQ6IGZ1bmN0aW9uKCkge31ob2xkZXJOYW1lZnVuY3Rpb25UeXBlSW5kZXhpc1NvZnREZWZlcnJlZF9tZXRob2ROZWVkc1N0dWJzX21ldGhvZENhbkJlQXBwbGllZF9jb21wdXRlUGFyYW1ldGVyRGVmYXVsdFZhbHVlc29wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlc2NhblRlYXJPZmZ0ZWFyT2ZmTmFtZWlzQ2xvc3VyZUNhbGxNZXRob2Rpc05vdEFwcGx5VGFyZ2V0Y2FuQmVBcHBsaWVkYWxpYXNOYW1lbWVtYmVyVHlwZV9nZW5lcmF0ZUZ1bmN0aW9uVHlwZWFwcGx5SW5kZXhfZ2VuZXJhdGVQYXJhbWV0ZXJTdHVic25lZWRzVGVhck9mZnRoaXNBY2Nlc3N0aGlzLiRyZWNlaXZlcnJlaWZ5VHlwZWdlbmVyYXRlUGFyYW1ldGVyU3R1YnNpbnN0YW50aWF0aW9uQ2xhc3NnZW5lcmF0ZVN0dWJzaW50ZXJjZXB0b3JNYXBEdXBsaWNhdGUgc3BlY2lhbGl6ZWQgZ2V0IGludGVyY2VwdG9yIGZvciA6IEV4aXN0aW5nOiAsIG5ldyBnZW5lcmF0ZUdldEludGVyY2VwdG9yTWV0aG9kZ2V0dGVyRmxhZ3NzZXR0ZXJGbGFnc2luaXRpYWxpemVySW5BbGxvY2F0b3J2aXNpdEZpZWxkc2dlbmVyYXRlT25lU2hvdEludGVyY2VwdG9yaXNBcHBseVRhcmdldHJlZ2lzdGVyQ29uc3RhbnRjb25zdGFudE9iamVjdGlzU3RhdGljU3RhdGVIb2xkZXJDb2xsZWN0b3JvdXRwdXRMaWJyYXJ5TGlzdHNpbnRlcmNlcHRvckNvbnN0YW50Y29tcHV0ZUNsYXNzRmlsdGVyYmFja2VuZFR5cGVIZWxwZXJzdW5uZWVkZWRDbGFzc2VzbmVlZGVkZ2V0QmFja2VuZFR5cGVIZWxwZXJzY29tcHV0ZU5lZWRlZENvbnN0YW50c2NvbnN0YW50VW5pdGNvbXB1dGVOZWVkZWREZWNsYXJhdGlvbnNhZGRDbGFzc1dpdGhTdXBlcmNsYXNzZXNhZGRDbGFzc2VzV2l0aFN1cGVyY2xhc3Nlc21peGluQ2xhc3Nlc3NvcnRlZENsYXNzZXNjb21wdXRlTmVlZGVkU3RhdGljc2lzU3RhdGljRnVuY3Rpb25jb21wdXRlTmVlZGVkU3RhdGljTm9uRmluYWxGaWVsZHNhZGRUb091dHB1dFVuaXRlYWdlckZpZWxkc2FGaWVsZERhdGFiRmllbGREYXRhYUluZGV4YkluZGV4Y29tcHV0ZU5lZWRlZExpYnJhcmllc0ZpZWxkVmlzaXRvcmlzTGlicmFyeUV4cGVjdGVkIGEgQ2xhc3NFbnRpdHkgb3IgYSBMaWJyYXJ5RW50aXR5LmlzTWl4aW5OYXRpdmVGaWVsZGZpZWxkTmVlZHNHZXR0ZXJmaWVsZE5lZWRzU2V0dGVyY2FuQXZvaWRHZW5lcmF0ZWRDaGVja2VkU2V0dGVyZmllbGRBY2Nlc3NOZXZlclRocm93c0xpYnJhcnlDb250ZW50c0xpYnJhcmllc01hcF9sYXN0TGlicmFyeV9sYXN0TWFwcGluZ19nZXRNYXBwaW5nUmVnaXN0cnlfaG9sZGVyc01hcF9kZWZlcnJlZExpYnJhcmllc01hcF9sYXN0T3V0cHV0VW5pdF9sYXN0TGlicmFyaWVzTWFwX21hcFVuaXRUb0xpYnJhcmllc01hcHRhcmdldFVuaXR0YXJnZXRMaWJyYXJpZXNNYXBkYXJ0MmpzLmpzX2VtaXR0ZXIuc3RhcnR1cF9lbWl0dGVyTW9kdWxhckVtaXR0ZXJCYXNlZ2xvYmFsUHJvcGVydHlBY2Nlc3NGb3JDbGFzc3BhZ2xvYmFsUHJvcGVydHlBY2Nlc3NGb3JUeXBlZ2xvYmFsUHJvcGVydHlBY2Nlc3NGb3JNZW1iZXIjLnByb3RvdHlwZWluaXQuX2NvbnN0YW50RW1pdHRlcmdlbmVyYXRlRW1pdHRlckltcGxzaG91bGRHZW5lcmF0ZVNvdXJjZU1hcGJ1aWxkIHByb2dyYW1lbWl0IHByb2dyYW1nZW5lcmF0ZUNvbnN0YW50UmVmZXJlbmNlb21pdHRlZEZyYWdtZW50c291dHB1dEJ1ZmZlcnNkYXJ0MmpzLmpzX2VtaXR0ZXIubWV0YWRhdGFfY29sbGVjdG9yanNfcHJlY2VkZW5jZV9NZXRhZGF0YUVudHJ5X0JvdW5kTWV0YWRhdGFFbnRyeV9Cb3VuZE1ldGFkYXRhRW50cnkoLHJjPSxfdmFsdWU9X01ldGFkYXRhTGlzdHNldEV4cHJlc3Npb25fbWV0YWRhdGFUb2tlbnNfbWV0YWRhdGFNYXBfdHlwZXNUb2tlbnNfdHlwZXNNYXBnZXRNZXRhZGF0YUZvck91dHB1dFVuaXRnZXRUeXBlc0Zvck91dHB1dFVuaXRyZWlmeURlZmF1bHRBcmd1bWVudHNfYWRkR2xvYmFsTWV0YWRhdGFhZGRUeXBlSW5PdXRwdXRVbml0cmVpZnlOYW1lcmVpZnlFeHByZXNzaW9ubmFtZVRvS2V5cHJpbnRlZF9jb21wdXRlVHlwZVJlcHJlc2VudGF0aW9uVHlwZSByZXByZXNlbnRhdGlvbiBmb3IgdHlwZSB2YXJpYWJsZSAgaXMgbm90IHN1cHBvcnRlZC5yZWlmaWVkIHR5cGVzIHNob3VsZCBub3QgYmUgc3RyaW5ncy5fY29tcHV0ZVR5cGVSZXByZXNlbnRhdGlvbk5ld1J0aWNvdW50VG9rZW5zSW5UeXBlc2ZpbmFsaXplTWFwbWV0YWRhdGFNYXB0eXBlc01hcGRhcnQyanMubmV3X2pzX2VtaXR0ZXIubW9kZWxub2RlVG9TdHJpbmdQcm9ncmFtdHlwZVRvSW50ZXJjZXB0b3JNYXBfbWV0YWRhdGFDb2xsZWN0b3JtZXRhZGF0YUZvck91dHB1dFVuaXRtZXRhZGF0YVR5cGVzRm9yT3V0cHV0VW5pdGlzU3BsaXRIb2xkZXJIb2xkZXIobmFtZT1GcmFnbWVudHN0YXRpY0xhemlseUluaXRpYWxpemVkRmllbGRzb3V0cHV0RmlsZU5hbWVpc01haW5GcmFnbWVudE1haW5GcmFnbWVudGludm9rZU1haW5NYWluRnJhZ21lbnQoKURlZmVycmVkRnJhZ21lbnREZWZlcnJlZEZyYWdtZW50KG5hbWU9Q29uc3RhbnQobmFtZT1GaWVsZENvbnRhaW5lckxpYnJhcnkodXJpPSxlbGVtZW50PVN0YXRpY0ZpZWxkKG5hbWU9X3N1cGVyY2xhc3NfbWl4aW5DbGFzc2NsYXNzQ2hlY2tzTmV3UnRpbmF0aXZlTGVhZlRhZ3NuYXRpdmVOb25MZWFmVGFnc25hdGl2ZUV4dGVuc2lvbnNzdXBlcmNsYXNzTmFtZXN1cGVyY2xhc3NIb2xkZXJJbmRleENsYXNzKG5hbWU9TWl4aW5BcHBsaWNhdGlvbk1peGluKG5hbWU9bmVlZHNJbnRlcmNlcHRlZEdldHRlcm5lZWRzSW50ZXJjZXB0ZWRTZXR0ZXJuZWVkc0ludGVyY2VwdGVkR2V0dGVyT25SZWNlaXZlcm5lZWRzSW50ZXJjZXB0ZWRTZXR0ZXJPblJlY2VpdmVybmVlZHNJbnRlcmNlcHRlZEdldHRlck9uVGhpc25lZWRzSW50ZXJjZXB0ZWRTZXR0ZXJPblRoaXNGaWVsZChuYW1lPURhcnRNZXRob2RwYXJhbWV0ZXJTdHVic0luc3RhbmNlTWV0aG9kSW5zdGFuY2VNZXRob2QobmFtZT0sY29kZT1TdHViTWV0aG9kU3R1Yk1ldGhvZChuYW1lPVBhcmFtZXRlclN0dWJNZXRob2RQYXJhbWV0ZXJTdHViTWV0aG9kKG5hbWU9LCBjYWxsTmFtZT0sIGNvZGU9U3RhdGljRGFydE1ldGhvZFN0YXRpY0RhcnRNZXRob2QobmFtZT1TdGF0aWNTdHViTWV0aG9kU3RhdGljU3R1Yk1ldGhvZChuYW1lPWRhcnQyanMuanNfZW1pdHRlci5uYXRpdmVfZW1pdHRlcmhhc05hdGl2ZUNsYXNzZXNjbGFzc2VzTmVlZGVkRm9yUnRpcHJlT3JkZXJ3YWxrbm9uTGVhZkNsYXNzZXNleHRlbnNpb25Qb2ludHNjb21wdXRlRXh0ZW5zaW9uUG9pbnRzaXNUcml2aWFsQ2xhc3NsZWFmVGFnc25vbmxlYWZUYWdzbmF0aXZlVGFnc3N1ZmZpY2luZ0ludGVyY2VwdG9yZmlsbE5hdGl2ZUluZm9uYXRpdmVBbmNlc3Rvck9mbmF0aXZlQW5jZXN0b3JuZWVkc0FjY2Vzc29ycG90ZW50aWFsbHlDb252ZXJ0RGFydENsb3N1cmVzVG9Kc3N0dWJQYXJhbWV0ZXJzc3R1YlBhcmFtZXRlciMgPSAjKCMsIGdlbmVyYXRlUGFyYW1ldGVyU3R1YlN0YXRlbWVudHNhcmd1bWVudHNCdWZmZXJpbmRleE9mTGFzdE9wdGlvbmFsQXJndW1lbnRJblBhcmFtZXRlcnNyZXR1cm4gIy4jKCMpaXNTdXBlcnR5cGVPZk5hdGl2ZUNsYXNzcmVxdWlyZXNOYXRpdmVJc0NoZWNrZGFydDJqcy5qc19lbWl0dGVyLnR5cGVfdGVzdF9yZWdpc3RyeVJ1bnRpbWVUeXBlc0NoZWNrcyBoYXMgbm90IGJlZW4gY29tcHV0ZWQgeWV0LnJ0aU5lZWRlZENsYXNzZXMgaGFzIG5vdCBiZWVuIGNvbXB1dGVkIHlldC5saXZlTWVtYmVyc19JbmRleGVkSW5kZXhlZExpYnJhcnlJbmRleGVkTWVtYmVySW5kZXhlZEZ1bmN0aW9uSW5kZXhlZENvbnN0cnVjdG9ySW5kZXhlZEZpZWxkSW5kZXhlZFR5cGVWYXJpYWJsZUluZGV4ZWRUeXBlZGVmSW5kZXhlZExvY2FsRW50aXR5TWFwQmFzZUVudGl0eU1hcEUwVHJ5aW5nIHRvIHJlZ2lzdGVyICB3aGVuIGNsb3NlZC5FbnRpdHlEYXRhTWFwQmFzZURhdGEgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY3JlYXRlZCBmb3IgRW50aXR5RGF0YU1hcEQwRGF0YSBsaXN0IGxlbmd0aCAgaW5jb25zaXN0ZW50IHdpdGggZW50aXR5IGxpc3QgbGVuZ3RoIERhdGEgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY3JlYXRlZC5FbnRpdHlEYXRhRW52TWFwQmFzZUVudiBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBjcmVhdGVkIGZvciBFbnRpdHlEYXRhRW52TWFwVjBFbnYgbGlzdCBsZW5ndGggRW52IGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGNyZWF0ZWQuUmVwb3J0RXJyb3JGdW5jdGlvbkRhcnQyanNDb25zdGFudEV2YWx1YXRvcl9zdXBwb3J0UmVldmFsdWF0aW9uRm9yVGVzdGluZ3JlcXVpcmVzQ29uc3RhbnRzdXBwb3J0UmVldmFsdWF0aW9uRm9yVGVzdGluZ0ludmFsaWQgY29uc3RhbnQgcmVzdWx0IFVuZXZhbHVhdGVkQ29uc3RhbnRGaW5kZXJDb25zdGFudFJlZmVyZW5jZUNvbnN0YW50UmVmZXJlbmNlLnZpc2l0Q2hpbGRyZW5Db25zdGFudFJlZmVyZW5jZS5hY2NlcHRDb25zdGFudFJlZmVyZW5jZS50cmFuc2Zvcm1DaGlsZHJlbkNvbnN0YW50UmVmZXJlbmNlKGNvbnN0YW50PURvZXNOb3RDb21wbGV0ZVR5cGVEb2VzTm90Q29tcGxldGVUeXBlKClUaGlzSW50ZXJmYWNlVHlwZUV4YWN0SW50ZXJmYWNlVHlwZVN0YXRpY1R5cGVCYXNlcmV3cml0ZV9hc3luY2Vycm9yX2NvZGVzQXN5bmNSZXdyaXRlckJhc2Vsb2NhbFZhcmlhYmxlc2NvbnRpbnVlTGFiZWxzYnJlYWtMYWJlbHNmaW5hbGx5TGFiZWxzaGFuZGxlckxhYmVsc2V4aXRMYWJlbHJldGhyb3dMYWJlbGNvbnRpbnVlU3RhY2ticmVha1N0YWNrcmV0dXJuU3RhY2t2YXJpYWJsZVJlbmFtaW5nc2FuYWx5c2lzcmVzdWx0TmFtZWVycm9yQ29kZU5hbWVnb3RvTmFtZWhhbmRsZXJOYW1laGFzSGFuZGxlckxhYmVsc25leHROYW1lcmV0dXJuVmFsdWVOYW1lY3VycmVudEVycm9yTmFtZW91dGVyTGFiZWxOYW1lc2VsZk5hbWV0eXBlQXJndW1lbnROYW1lc19jdXJyZW50TGFiZWxjdXJyZW50VGVtcFZhckluZGV4dGVtcFZhckhpZ2hXYXRlck1hcmt0ZW1wVmFyTmFtZXNsYWJlbGxlZFBhcnRzbGFiZWxDb21tZW50c2hhc1RyeUJsb2Nrc2luc2lkZVVudHJhbnNsYXRlZEJyZWFrYWJsZWhhc0p1bXBUaG91Z2hPdXRlckxhYmVsbmVlZHNSZXRocm93Y3VycmVudFN0YXRlbWVudEJ1ZmZlcmN1cnJlbnRFcnJvcmlzU3luY1N0YXJpc0FzeW5jU3RhcmluaXRpYWxpemVOYW1lc3Jld3JpdGVGdW5jdGlvbmN1cnJlbnRFcnJvckhhbmRsZXJhbGxvY2F0ZVRlbXBWYXJ1c2VUZW1wVmFyc2FmZU5hbWVwcm9jZXNzVHlwZUFyZ3VtZW50c25ld0xhYmVsYmVnaW5MYWJlbHNldEdvdG9WYXJpYWJsZWdvdG9BbmRCcmVha2dvdG8gYWRkRXhwcmVzc2lvblN0YXRlbWVudHNob3VsZFRyYW5zZm9ybWhhc0F3YWl0T3JZaWVsZE5vZGUgIGNhbm5vdCBiZSB0cmFuc2Zvcm1lZCBieSB0aGUgYXdhaXQtc3luYyB0cmFuc2Zvcm1lckludGVybmFsIGVycm9yLCB0cnlpbmcgdG8gdmlzaXQgdmlzaXRTdGF0ZW1lbnR2aXNpdEV4cHJlc3Npb25JZ25vcmVSZXN1bHR2aXNpdEV4cHJlc3Npb25fc3RvcmVJZk5lY2Vzc2FyeSMgPSAjO3dpdGhFeHByZXNzaW9uc3RvcmVvbGRUZW1wVmFySW5kZXh3aXRoQ2FsbFRhcmdldEV4cHJlc3Npb25zdG9yZWRJZk5lZWRlZHdpdGhFeHByZXNzaW9uMndpdGhFeHByZXNzaW9uc2xhc3RUcmFuc2Zvcm1JbmRleGFkZFN1Y2Nlc3NFeGl0YWRkRXJyb3JFeGl0YWRkRnVuY3Rpb25FeGl0c3Jld3JpdHRlbkJvZHl2YXJpYWJsZURlY2xhcmF0aW9uc2Z1bmN0aW9uU291cmNlSW5mb3JtYXRpb252YXJpYWJsZUluaXRpYWxpemF0aW9uc0Z1bmN0aW9uIHN0YXJ0aGFzRXhwbGljaXRSZXR1cm5zY2xhdXNlc3doaWxlICh0cnVlKSB7I31oYXNGaW5hbGx5aGFzWWllbGROZXN0ZWQgZnVuY3Rpb24gaXMgYSBnZW5lcmF0b3Igb3IgYXN5bmNocm9ub3VzLiNbI11ldmFsdWF0ZWRVbmV4cGVjdGVkIGFzc2lnbm1lbnQgbGVmdCBoYW5kIHNpZGUgYXdhaXRTdGF0ZW1lbnRhZnRlckF3YWl0cmV0dXJuaW5nIGZyb20gYXdhaXQuaXNSZXN1bHR0aGVuTGFiZWxqb2luTGFiZWxhc3NpZ25MZWZ0aWYgKCMpIHsjfSBlbHNlICN0cmFuc2xhdGVKdW1wc3RvcmVUYXJnZXQjID8gIyA6ICNlbHNlTGFiZWwjID0gIyA/ICMgOiAjO2p1bXBTdGFja2ZpcnN0VGFyZ2V0anNKdW1wU3RhY2tvbGRJbnNpZGVVbnRyYW5zbGF0ZWRCcmVha2FibGVkbyB7I30gd2hpbGUgKCMpdHJhbnNsYXRlVG9TdGF0ZW1lbnRzdGFydExhYmVsZG8gYm9keWNvbnRpbnVlTGFiZWxkbyBjb25kaXRpb25hZnRlckxhYmVsYWZ0ZXIgZG9pZiAoIykgI29sZEluc2lkZVVudHJhbnNsYXRlZGZvciBjb25kaXRpb25mb3IgdXBkYXRlYWZ0ZXIgZm9ydHJpdmlhbCBjb25kaXRpb25KYXZhc2NyaXB0IGZvci1pbiBub3QgaW1wbGVtZW50ZWQgeWV0IGluIHRoZSBhd2FpdCB0cmFuc2Zvcm1hdGlvbnRyYW5zbGF0ZVRvU3RhdGVtZW50U2VxdWVuY2VvbGRCdWZmZXJyZXN1bHRCdWZmZXJ0cmFuc2xhdGVUb0Jsb2NrdHJhbnNsYXRlZFRoZW50cmFuc2xhdGVkRWxzZWJyZWFrTGFiZWxVbmV4cGVjdGVkIHBvc3RmaXggb3BlcmF0b3IgYXJndW1lbnQgVW5leHBlY3RlZCBwcmVmaXggIG9wZXJhdG9yIGNsYXVzZWFmdGVyIHN3aXRjaGFueUNhc2VFeHByZXNzaW9uVHJhbnNmb3JtZWRkZWZhdWx0SW5kZXhVbmtub3duIGNsYXVzZSB0eXBlIHNldEVycm9ySGFuZGxlcl9maW5hbGxpZXNVcFRvQW5kRW5jbG9zaW5nSGFuZGxlcmhhbmRsZXJMYWJlbGZpbmFsbHlMYWJlbHVuY2F1Z2h0TGFiZWx1bmNhdWdodGFmdGVyRmluYWxseUxhYmVsYWZ0ZXIgZmluYWxseSMucHVzaCgjKTtlcnJvclJlbmFtZWVuY2xvc2luZ0ZpbmFsbGllc25leHRMYWJlbC8vIGdvdG8gdGhlIG5leHQgZmluYWxseSBoYW5kbGVyIyA9ICMucG9wKCk7aW5pdGlhbGl6YXRpb25yZW5hbWluZ3doaWxlIGNvbmRpdGlvbmFmdGVyIHdoaWxlYWRkWWllbGRhZnRlciB5aWVsZEFzeW5jUmV3cml0ZXJjb21wbGV0ZXJOYW1lY29tcGxldGVyWWllbGQgaW4gbm9uLWdlbmVyYXRpbmcgYXN5bmMgZnVuY3Rpb250aGVuSGVscGVyQ2FsbCN0aGVuSGVscGVyKCNjdXJyZW50RXJyb3IsICNjb21wbGV0ZXIpdGhlbkhlbHBlcmltcGxpY2l0IHJldHVybnJ1bnRpbWVIZWxwZXJDYWxsI3J1bnRpbWVIZWxwZXIoI3JldHVyblZhbHVlLCAjY29tcGxldGVyKXJ1bnRpbWVIZWxwZXJhc3luY0hlbHBlckNhbGwjYXN5bmNIZWxwZXIoI3ZhbHVlLCAjYm9keU5hbWUpYXN5bmNIZWxwZXJhc3luY1JldGhyb3dDYWxsI2FzeW5jUmV0aHJvdygjcmVzdWx0LCAjY29tcGxldGVyKXJldHVybkFzeW5jUmV0aHJvd2Vycm9yQ2hlY2sgICAgICBpZiAoI2Vycm9yQ29kZSA9PT0gI0VSUk9SKSB7CiAgICAgICAgaWYgKCNoYXNIYW5kbGVyTGFiZWxzKSB7CiAgICAgICAgICAgICNjdXJyZW50RXJyb3IgPSAjcmVzdWx0OwogICAgICAgICAgICAjZ290byA9ICNoYW5kbGVyOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICAjcmV0dXJuQXN5bmNSZXRocm93OwogICAgICB9aW5uZXJGdW5jdGlvbiAgICAgIGZ1bmN0aW9uICgjZXJyb3JDb2RlLCAjcmVzdWx0KSB7CiAgICAgICAgI2Vycm9yQ2hlY2s7CiAgICAgICAgI3Jld3JpdHRlbkJvZHk7CiAgICAgIH1hc3luY1N0YXJ0Q2FsbCNhc3luY1N0YXJ0KCNib2R5TmFtZSwgI2NvbXBsZXRlcilyZXR1cm5Bc3luY1N0YXJ0d3JhcEJvZHlDYWxsI3dyYXBCb2R5KCNpbm5lckZ1bmN0aW9uKSAgICAgICAgZnVuY3Rpb24gKCNwYXJhbWV0ZXJzLCAjdHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICAgICN2YXJpYWJsZURlY2xhcmF0aW9uczsKICAgICAgICAgIHZhciAjYm9keU5hbWUgPSAjd3JhcEJvZHlDYWxsOwogICAgICAgICAgI3JldHVybkFzeW5jU3RhcnQ7CiAgICAgICAgfVN5bmNTdGFyUmV3cml0ZXJkaWFnbm9zdGljTGlzdGVuZXJyZW5hbWVkUGFyYW1ldGVyc3JlbmFtZWROYW1lY29weVBhcmFtZXRlcnNzZXRDdXJyZW50RXJyb3IjY3VycmVudEVycm9yID0gI3Jlc3VsdHNldEdvdG8jZ290byA9ICNoYW5kbGVyY2hlY2tFcnJvckNvZGUgICAgICAgICAgaWYgKCNlcnJvckNvZGUgPT09ICNFUlJPUikgewogICAgICAgICAgICAgICNzZXRDdXJyZW50RXJyb3I7CiAgICAgICAgICAgICAgI3NldEdvdG87CiAgICAgICAgICB9aW5uZXJJbm5lckZ1bmN0aW9uICAgICAgICAgIGZ1bmN0aW9uICNib2R5KCNlcnJvckNvZGUsICNyZXN1bHQpIHsKICAgICAgICAgICAgI2NoZWNrRXJyb3JDb2RlOwogICAgICAgICAgICAjaGVscGVyQm9keTsKICAgICAgICAgIH1oZWxwZXJCb2R5cmV0dXJuSW5uZXJJbm5lckZ1bmN0aW9uICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCNoYXNQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgICAgI2NvcHlQYXJhbWV0ZXJzOwogICAgICAgICAgICB9CiAgICAgICAgICAgICN2YXJEZWNsOwogICAgICAgICAgICAjcmV0dXJuSW5uZXJJbm5lckZ1bmN0aW9uOwogICAgICAgICAgfWhhc1BhcmFtZXRlcnN2YXJEZWNsY2FsbEl0ZXJhYmxlRmFjdG9yeSNpdGVyYWJsZUZhY3RvcnkoI2lubmVyRnVuY3Rpb24sICN0eXBlKXJldHVybkNhbGxJdGVyYWJsZUZhY3RvcnkgICAgICAgICAgZnVuY3Rpb24gKCNyZW5hbWVkUGFyYW1ldGVycywgI3R5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGlmICgjbmVlZHNUaGlzKQogICAgICAgICAgICAgIHZhciAjc2VsZiA9IHRoaXM7CiAgICAgICAgICAgICNyZXR1cm5DYWxsSXRlcmFibGVGYWN0b3J5OwogICAgICAgICAgfQogICAgICAgICAgbmVlZHNUaGlzdW5jYXVnaHRFcnJvckV4cHJlc3Npb25DYWxsZW5kT2ZJdGVyYXRpb25DYWxsIygpU3luYyogZnVuY3Rpb25zIGNhbm5vdCBjb250YWluIGF3YWl0IHN0YXRlbWVudHMuQXN5bmNTdGFyUmV3cml0ZXJuZXh0V2hlbkNhbmNlbGVkTmFtZWNvbnRyb2xsZXJOYW1lbmV4dFdoZW5DYW5jZWxlZGNvbnRyb2xsZXJlbmNsb3NpbmdGaW5hbGx5TGFiZWxzeWllbGRFeHByZXNzaW9uQ2FsbCN5aWVsZEV4cHJlc3Npb24oI2V4cHJlc3Npb24pYXN5bmNTdGFySGVscGVyQ2FsbCNhc3luY1N0YXJIZWxwZXIoI3lpZWxkRXhwcmVzc2lvbkNhbGwsICNib2R5TmFtZSwgI2NvbnRyb2xsZXIpdXBkYXRlTmV4dCNuZXh0ID0gI25leHRXaGVuQ2FuY2VsZWRjYWxsUG9wI25leHQucG9wKClnb3RvQ2FuY2VsbGVkI2dvdG8gPSAjY2FsbFBvcHVwZGF0ZUVycm9yZ290b0Vycm9yICAgICAgICBzd2l0Y2ggKCNlcnJvckNvZGUpIHsKICAgICAgICAgIGNhc2UgI1NUUkVBTV9XQVNfQ0FOQ0VMRUQ6CiAgICAgICAgICAgICN1cGRhdGVOZXh0OwogICAgICAgICAgICAjZ290b0NhbmNlbGxlZDsKICAgICAgICAgICAgI2JyZWFrOwogICAgICAgICAgY2FzZSAjRVJST1I6CiAgICAgICAgICAgICN1cGRhdGVFcnJvcjsKICAgICAgICAgICAgI2dvdG9FcnJvcjsKICAgICAgICB9U1RSRUFNX1dBU19DQU5DRUxFRGlmRXJyb3IgICAgICAgIGlmICgjZXJyb3JDb2RlID09PSAjRVJST1IpIHsKICAgICAgICAgICN1cGRhdGVFcnJvcjsKICAgICAgICAgICNnb3RvRXJyb3I7CiAgICAgICAgfWlmSGFzWWllbGQgICAgICAgIGlmICgjaGFzWWllbGQpIHsKICAgICAgICAgICNzd2l0Y2hDYXNlCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICNpZkVycm9yOwogICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gKCNlcnJvckNvZGUsICNyZXN1bHQpIHsKICAgICAgICAgICNpZkhhc1lpZWxkOwogICAgICAgICAgI3Jld3JpdHRlbkJvZHk7CiAgICAgICAgfWRlY2xhcmVCb2R5TmFtZXZhciAjYm9keU5hbWUgPSAjd3JhcEJvZHlDYWxsO3N0cmVhbU9mQ29udHJvbGxlckNhbGwjc3RyZWFtT2ZDb250cm9sbGVyKCNjb250cm9sbGVyKXJldHVyblN0cmVhbU9mQ29udHJvbGxlckNhbGwgICAgICAgIGZ1bmN0aW9uICgjcGFyYW1ldGVycywgI3R5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAjZGVjbGFyZUJvZHlOYW1lOwogICAgICAgICAgI3ZhcmlhYmxlRGVjbGFyYXRpb25zOwogICAgICAgICAgI3JldHVyblN0cmVhbU9mQ29udHJvbGxlckNhbGw7CiAgICAgICAgfSNhc3luY0hlbHBlcigjY3VycmVudEVycm9yLCAjZXJyb3JDb2RlLCAjY29udHJvbGxlcilzdHJlYW1IZWxwZXJDYWxsI3N0cmVhbUhlbHBlcihudWxsLCAjc3VjY2Vzc0NvZGUsICNjb250cm9sbGVyKXN0cmVhbUhlbHBlcnN1Y2Nlc3NDb2RlIygjLCAjKSNhc3luY0hlbHBlcigjdmFsdWUsICNib2R5TmFtZSwgI2NvbnRyb2xsZXIpUHJlVHJhbnNsYXRpb25BbmFseXNpc2xvb3BzQW5kU3dpdGNoZXNsYWJlbGxlZFN0YXRlbWVudHNjdXJyZW50RnVuY3Rpb25jb250YWluc0F3YWl0c3RtdGFyZ2V0U3RhdGVtZW50VW5leHBlY3RlZF9tYWtlVmFyaWFibGVJbml0aWFsaXplcmluaXRWYWx1ZUNvZGVnZW5QaGFzZVNzYUNvZGVHZW5lcmF0b3JUYXNrU1NBIGNvZGUgZ2VuZXJhdG9yYnVpbGRKYXZhU2NyaXB0RnVuY3Rpb25nZW5lcmF0ZUxhenlJbml0aWFsaXplcmdlbmVyYXRlTWV0aG9kY29kZUdlbmVyYXRvclRZUEVfU1RBVEVNRU5UVFlQRV9FWFBSRVNTSU9OVFlQRV9ERUNMQVJBVElPTmlzR2VuZXJhdGluZ0V4cHJlc3Npb25fY29kZWdlblRhc2tfY2hlY2tlZE1vZGVIZWxwZXJzZ2VuZXJhdGVBdFVzZVNpdGVjb250cm9sRmxvd09wZXJhdG9yc2JyZWFrQWN0aW9uY29udGludWVBY3Rpb25pbXBsaWNpdENvbnRpbnVlQWN0aW9uY3VycmVudENvbnRhaW5lcmV4cHJlc3Npb25TdGFja29sZENvbnRhaW5lclN0YWNrdmFyaWFibGVOYW1lc3Nob3VsZEdyb3VwVmFyRGVjbGFyYXRpb25zY29sbGVjdGVkVmFyaWFibGVEZWNsYXJhdGlvbnNkZWNsYXJlZExvY2Fsc2N1cnJlbnRHcmFwaGN1cnJlbnRCbG9ja0luZm9ybWF0aW9uYmxvY2tRdWV1ZWlzR2VuZXJhdGVBdFVzZVNpdGVoYXNOb25CaXRPcFVzZXJwaGlTZXRiaXRXaWR0aGJpdE9wbGVmdFdpZHRoc2hpZnRDb3VudHJlcXVpcmVzVWludENvbnZlcnNpb25wdXNoU3RhdGVtZW50aW5zZXJ0U3RhdGVtZW50QXRTdGFydHB1c2hFeHByZXNzaW9uQXNTdGF0ZW1lbnRwcmVHZW5lcmF0ZU1ldGhvZHJ1blBoYXNlR3JhcGggbm90IHZhbGlkIGFmdGVyIGludGVydmFsQnVpbGRlcmFsbG9jYXRvcmxpdmVJbnN0cnVjdGlvbnNsaXZlSW50ZXJ2YWxzaGFuZGxlRGVsYXllZFZhcmlhYmxlRGVjbGFyYXRpb25zbmV4dFN0YXRlbWVudF9zYWZlSW5Jbml0aWFsaXplcnVuaW5pdGlhbGl6ZWRkZWNsYXJhdGlvbkxpc3R2aXNpdFN1YkdyYXBobmV3U3ViR3JhcGhvbGRTdWJHcmFwaG9sZEJsb2NrUXVldWVlbnRlclN1YkdyYXBobGltaXRzYmFzaWNCbG9ja2lzSlNFeHByZXNzaW9uaXNKU0NvbmRpdGlvbmdlbmVyYXRlU3RhdGVtZW50c2dlbmVyYXRlU3RhdGVtZW50c0luTmV3QmxvY2tvbGRDb250YWluZXJ1bndyYXBTdGF0ZW1lbnRnZW5lcmF0ZUV4cHJlc3Npb25vbGRJc0dlbmVyYXRpbmdFeHByZXNzaW9ub2xkRXhwcmVzc2lvblN0YWNrc2VxdWVuY2VFbGVtZW50c2V4cHJlc3Npb25TdWJHcmFwaGlzVmFyaWFibGVEZWNsYXJlZGdlbmVyYXRlRXhwcmVzc2lvbkFzc2lnbm1lbnRhc3NpZ25WYXJpYWJsZWRlZmluZW5lZWRzQXNzaWdubWVudGNvbnRpbnVlQXNCcmVha2ltcGxpY2l0Q29udGludWVBc0JyZWFraW1wbGljaXRCcmVha1dpdGhMYWJlbHdyYXBJbnRvTGFiZWxzYnJlYWtMYWJlbFN0cmluZ2hhbmRsZWREZWZhdWx0c3RhdGVtZW50SW5kZXh2aXNpdEJvZHlJZ25vcmVMYWJlbHNvbGRJbmZvaXNDb25kaXRpb25FeHByZXNzaW9uaW5pdGlhbGl6YXRpb25UeXBlYXZvaWRDb250YWluZXJhc3NpZ25QaGlzT2ZTdWNjZXNzb3JzaGFzUGhpVXBkYXRlc2pzSW5pdGlhbGl6YXRpb25kZWxheWVkVmFyaWFibGVzQ291bnRhbGxTaW1wbGVBc3NpZ25tZW50c2lzQ29tbWFPcGVyYXRvcmluaXRzanNDb25kaXRpb25qc1VwZGF0ZXNuZXdMaXRlcmFsQm9vbGlmVGVzdGpzQnJlYWtleGl0TG9vcHdyYXBMb29wQm9keUZvckNvbnRpbnVlZXhpdEF2b2lkQ29udGFpbmVyaGFzRXhpdFBoaVVwZGF0ZXNhdm9pZEVkZ2V1cGRhdGVCb2R5VW5leHBlY3RlZCBsb29wIGtpbmQ6IGNvbnRpbnVlTGFiZWxTdHJpbmdsYWJlbGVkQmxvY2tJbmZvY29udGludWVPdmVycmlkZXNoYW5kbGVCbG9ja0Zsb3dvbGRCbG9ja0luZm9ybWF0aW9uY29udGludWVTdWJHcmFwaGl0ZXJhdGVCYXNpY0Jsb2NrZW1pdEFzc2lnbm1lbnRkZXN0aW5hdGlvbnNlcXVlbnRpYWxpemVDb3BpZXNpbnN0cnVjdGlvbkNvcGllc3RlbXBOYW1lZG9Bc3NpZ25tZW50c291cmNlSW5mb3JtYXRpb25NYXBkZXN0aW5hdGlvbk5hbWVjdXJyZW50TG9jYXRpb25yZWFkeXBydW5lZENvcGllc2dldENvcHlIYW5kbGVyZ2V0U3dhcFRlbXBoYW5kbGVJbnZva2VCaW5hcnlqc0xlZnR2aXNpdEJpdEludm9rZUJpbmFyeXZpc2l0Qml0SW52b2tlVW5hcnllbWl0SWRlbnRpdHlDb21wYXJpc29uaW52ZXJzZWxlZnRFcXVhbHNOdWxscmlnaHRFcXVhbHNOdWxsdHJpcGxlRXFNYXRoLmFicygjKWRvbWluYXRlZC5sZW5ndGggPSBub2RlLmJsb2NrICE9IGN1cnJlbnRHcmFwaC5lbnRyeXZpc2l0VHJ5IHNob3VsZCBub3QgYmUgY2FsbGVkLnRyeUNvbnRyb2xGbG93T3BlcmF0aW9uYXRVc2VTaXRlZ2VuZXJhdGVJZmdlbmVyYXRlTm90X2Fzc2VtYmxlSWZUaGVuRWxzZSMgJiYgI21ldGhvZExpdGVyYWxyZWdpc3Rlck1ldGhvZEludm9rZXJlZ2lzdGVyR2V0dGVycmVnaXN0ZXJTZXR0ZXJnZXRPcHRpbWl6ZWRTZWxlY3RvckZvckVsZW1lbnQgdG8gYmUgbWl4ZWQgaW4uIGRvZXMgbm90IGFwcGx5IHRvIFVuZXhwZWN0ZWQgZGlyZWN0IGludm9jYXRpb24gc2VsZWN0b3I6IHRocm93RnVuY3Rpb24oMCwgIykoIykjIHx8ICNzdXBlckVsZW1lbnR1c2VBbGlhc2VkU3VwZXIjLiMuY2FsbCgjKSMuIygjKXJlZ2lzdGVyRm9yZWlnblR5cGVzaW50ZXJwb2xhdGVkRXhwcmVzc2lvbnNqc0NsYXNzUmVmZXJlbmNlZ2VuZXJhdGVDb25zdGFudHR5cGVDb25zdGFudG1hcFJlbGF0aW9uYWxPcGVyYXRvcmludmVyc2VPcGVyYXRvcmNhbkdlbmVyYXRlT3B0aW1pemVkQ29tcGFyaXNvbnJlbGF0aW9uYWxoYW5kbGVkQnlTcGVjaWFsQ2FzZWVtaXRJc2VtaXRJc1ZpYUludGVyY2VwdG9yaWZCbG9ja2dlbmVyYXRlVGhyb3dXaXRoSGVscGVydW5kZXJvdmVyIyA8IDBqc0luZGV4IyA+Pj4gMCAhPT0gI3VuZGVyT3ZlcmpzSGVscGVybGF6eUdldHRlcmdlbmVyYXRlQXJyYXlMaXRlcmFsb3IwY2hlY2tCaWdJbnRtYXRoRmxvb3JDYWxsTWF0aC5mbG9vcigjKSAjY2hlY2tUeXBlT2ZjaGVja0RvdWJsZWNoZWNrQm9vbGJvb2xlYW5jaGVja09iamVjdG5vdE51bGxlcU51bGxjaGVja0FycmF5Y2hlY2tGaWVsZEV4aXN0c2NoZWNrRmllbGREb2VzTm90RXhpc3RjaGVja0ltbXV0YWJsZUFycmF5aW1tdXRhYmxlJGxpc3RjaGVja011dGFibGVBcnJheWNoZWNrRXh0ZW5kYWJsZUFycmF5Zml4ZWQkbGVuZ3RoY2hlY2tGaXhlZEFycmF5Y2hlY2tOdWxsY2hlY2tOb25OdWxsY2hlY2tUeXBlVmlhUHJvcGVydHljaGVja1R5cGVWaWFJbnN0YW5jZW9mIyBpbnN0YW5jZW9mICNoYW5kbGVOdW1iZXJPclN0cmluZ1N1cGVydHlwZUNoZWNrbnVtYmVyVGVzdHN0cmluZ1Rlc3RvYmplY3RUZXN0Y29tYmluZXIyaGFuZGxlU3RyaW5nU3VwZXJ0eXBlQ2hlY2toYW5kbGVMaXN0T3JTdXBlcnR5cGVDaGVja2FycmF5VGVzdG51bVRlc3RfZ2VuZXJhdGVSZWNlaXZlck9yQXJndW1lbnRUeXBlVGVzdFVuZXhwZWN0ZWQgY2hlY2s6ICMuI3R5cGVWYXJpYWJsZUFjY2Vzc05lZWRzU3Vic3RpdHV0aW9uIygjLCAjLCAjLCAjKSMoIywgIywgIylOb3QgYWxsIGlucHV0IGlzIHJlYWQgZm9yIHR5cGUgcmVjZWl2ZXJNYXNrbWV0aG9kQWNjZXNzU3NhQ29kZUdlbmVyYXRvci52aXNpdFN1YnR5cGVDaGVjayAgZXh0ZW5zaW9uc09wdGltaXphdGlvblBoYXNlU3NhT3B0aW1pemVyVGFza3Jhbmdlc2xvZ2dlcnNGb3JUZXN0aW5nU1NBIG9wdGltaXplcmJvdW5kc0NoZWNrZWRjb2RlTW90aW9ubG9hZEVsaW1pbmF0aW9ucGhhc2VzZGNlbW92ZWRDb2RlZWxpbWluYXRlZFNpZGVFZmZlY3RzbmV3R3ZuQ2FuZGlkYXRlc1NzYUluc3RydWN0aW9uU2ltcGxpZmllck1BWF9TSEFSRURfQ09OU1RBTlRfRk9MREVEX1NUUklOR19MRU5HVEhfbG9nX2dyYXBoc2ltcGxpZnlQaGlzYjFiMmNvbnRyb2xGbG93dGVzdGVkd2hlbk51bGxWYWx1ZXdoZW5Ob3ROdWxsVmFsdWV3aGVuTnVsbEJsb2Nrd2hlbk5vdE51bGxCbG9ja19zYW1lT3JSZWZpbmVtZW50T2ZfaXNCb29sQ29uc3RhbnRfbW9zdGx5RW1wdHlpbnNuZ2V0Q29uc3RhbnRGcm9tVHlwZXByb3BhZ2F0ZUNvbnN0YW50VmFsdWVUb1VzZXNmb2xkZWRmb2xkVW5hcnl0cnlPcHRpbWl6ZUxlbmd0aEludGVyY2VwdGVkR2V0dGVyYWN0dWFsUmVjZWl2ZXJjb25zdGFudElucHV0aGFuZGxlSW50ZXJjZXB0ZWRDYWxsZm9sZEJpbmFyeWhhbmRsZVN0cmluZ1NwbGl0b3B0aW1pemVkcmVzdWx0TWFza3NwbGl0SW5zdHJ1Y3Rpb25zdHJpbmdUeXBlSW5mb3RhZ0luc3RydWN0aW9udHJ5SW5saW5lTmF0aXZlTWV0aG9kaW5zZXJ0aW9uUG9pbnRkdW1teUdldHJlZ2lzdGVyRmllbGRDYWxscmVnaXN0ZXJDb25zdGFudEZpZWxkQ2FsbGlucHV0UG9zaXRpb25jaGVja1BhcmFtZXRlclR5cGVwYXJhbWV0ZXJBYnN0cmFjdFZhbHVlY29uc3RhbnRJbnN0cnVjdGlvbm9wMW9wMmhhbmRsZUlkZW50aXR5Q2hlY2ttYWtlVHJ1ZW1ha2VGYWxzZWNvbXBhcmVDb25zdGFudHNpbXBsaWZ5Q29uZGl0aW9uaXNOZWdhdGVkZG9taW5hdGluZ2hvaXN0ZWRyZXBmaW5kQ29uY3JldGVGaWVsZEZvckR5bmFtaWNBY2Nlc3Njb25zdHJ1Y3RlZENvbnN0YW50Y29uc3RhbnRSZWNlaXZlcmluZGV4SW5zdHJ1Y3Rpb25yZWdpc3RlckZpZWxkR2V0cmVnaXN0ZXJDb25zdGFudEZpZWxkR2V0X2RpcmVjdEZpZWxkR2V0cmVnaXN0ZXJGaWVsZFNldGhhbmRsZUFycmF5VHlwZUluZm9maXJzdEFyZ3VtZW50Z2V0U3RyaW5nbGVmdENvbmNhdHRyeUNvbnN0YW50dG9TdHJpbmdUeXBlbmVlZHNTdWJzdGl0dXRpb25Gb3JUeXBlVmFyaWFibGVBY2Nlc3N0cnlDb3B5SW5mb2V4cGVjdGVkSW5kZXhuZXh0U291cmNlZmluaXNoR3JvdW5kVHlwZWdyb3VuZFR5cGV0eXBlQXRWYXJpYWJsZWZpbmlzaFN1YnN0aXR1dGVkY3JlYXRlZENsYXNzc2VsZWN0VHlwZUFyZ3VtZW50RnJvbU9iamVjdENyZWF0aW9uaW5zdHJ1Y3Rpb25Gb3JUeXBlVmFyaWFibGVyZWdpc3Rlckluc3RhbnRpYXRpb25zc3BlY2lhbGl6ZWRDaGVja1NzYUNoZWNrSW5zZXJ0ZXJpbnNlcnRCb3VuZHNDaGVja2luZGV4Tm9kZWluZGV4QXJndW1lbnRtaW51c09uZVNzYURlYWRDb2RlRWxpbWluYXRvcnRyaXZpYWxEZWFkU3RvcmVSZWNlaXZlcnN6YXBJbnN0cnVjdGlvbkNhY2hlemFwSW5zdHJ1Y3Rpb250ZW1wbGF0ZVRocm93c05TTW9uTnVsbGhhc0ZvbGxvd2luZ1Rocm93aW5nTlNNaXNEZWFkQmxvY2tpc1RyaXZpYWxEZWFkU3RvcmVSZWNlaXZlcmlzRGVhZFVzZWlzRGVhZENvZGVpc1RyaXZpYWxEZWFkU3RvcmVjbGVhblBoaXNzaW1wbGlmeUNvbnRyb2xGbG93cmVtb3ZlVXNlcnNzaW1wbGlmeVBoaWV2YWN1YXRlVGFrZW5CcmFuY2hzZWVuVW5yZWZpbmVkQmFzZXJlZmluZW1lbnR0aGVuU2l6ZW1lYXN1cmVFbXB0eUludGVydmFsZWxzZVNpemVuZXdDb25kaXRpb25yZXBsYWNlSW5wdXRpbmRleE9mTGl2ZWJ5cmVtb3ZlSW5wdXRTc2FMaXZlQmxvY2tBbmFseXplcmxpdmVtYXJrQmxvY2tMaXZlc3dpdGNoUmFuZ2Vsb3dlclZhbHVldXBwZXJWYWx1ZWxpdmVMYWJlbHNTc2FEZWFkUGhpRWxpbWluYXRvcmxpdmVQaGlzU3NhUmVkdW5kYW50UGhpRWxpbWluYXRvckd2bldvcmtJdGVtdmFsdWVTZXRTc2FHbG9iYWxWYWx1ZU51bWJlcmVyYmxvY2tDaGFuZ2VzRmxhZ3Nsb29wQ2hhbmdlc0ZsYWdzY29tcHV0ZUNoYW5nZXNGbGFnc21vdmVMb29wSW52YXJpYW50Q29kZWNoYW5nZXNGbGFnc21vdmVMb29wSW52YXJpYW50Q29kZUZyb21CbG9ja3ByZWhlYWRlcmlzTG9vcEFsd2F5c1Rha2VuZmlyc3RJbnN0cnVjdGlvbkluTG9vcGxvb3BJbnZhcmlhbnRJbnB1dHNpc0lucHV0RGVmaW5lZEFmdGVyRG9taW5hdG9yb2xkQ2hhbmdlc0ZsYWdza2lsbHN1Y2Nlc3NvclZhbHVlc2dldENoYW5nZXNGbGFnc0ZvckRvbWluYXRlZEJsb2NrU3NhQ29kZU1vdGlvbmluc24xaW5zbjJ0b1Jld3JpdGVjYW5CZU1vdmVkU3NhVHlwZUNvbnZlcnNpb25JbnNlcnRlclNzYVR5cGVjb252ZXJzaW9uSW5zZXJ0ZXJpbnNlcnRUeXBlUHJvcGFnYXRpb25Gb3JEb21pbmF0ZWRVc2Vyc2NvbnZlcnRlZFR5cGVkb21pbmF0ZWRVc2VzdHJ1ZVRhcmdldHNmYWxzZVRhcmdldHNjb2xsZWN0VGFyZ2V0c1NzYUxvYWRFbGltaW5hdGlvbm1lbW9yeVNldG1lbW9yaWVzaW50ZXJzZWN0aW9uRm9yY2hlY2tOZXdHdm5DYW5kaWRhdGVzaGFzVXNlR3ZuX3Zpc2l0RmllbGRHZXRsb29rdXBGaWVsZFZhbHVlTWVtb3J5RmVhdHVyZS5sZW5ndGhyZWdpc3RlckZpZWxkVmFsdWVyZWdpc3RlckZpZWxkVmFsdWVVcGRhdGVyZWdpc3RlckFsbG9jYXRpb25zaG91bGRUcmFja0luaXRpYWxWYWx1ZXNraWxsQWZmZWN0ZWRCeWludGVyZXN0aW5nVXNlaGVhcERlcHRoaGFuZGxlU3RhdGljTG9hZGxvb2t1cEtleWVkVmFsdWVyZWdpc3RlcktleWVkVmFsdWVyZWdpc3RlcktleWVkVmFsdWVVcGRhdGVNZW1vcnlGZWF0dXJlTWVtb3J5U2V0a2V5ZWRWYWx1ZXNub25Fc2NhcGluZ1JlY2VpdmVyc211c3RBbGlhc21heUFsaWFzaXNDb25jcmV0ZWVzY2FwZXNVbmV4cGVjdGVkIG1lbWJlci9mZWF0dXJlOiByZWNlaXZlcnNUb1JlbW92ZWZpZWxkc1RvUmVtb3Zld2Vha0luZGV4b3RoZXJJbmRleGZpbmRDb21tb25JbnN0cnVjdGlvbnByZWRlY2Vzc29ySW5kZXh1c2VyMnBoaVR5cGVpc05vbkVzY2FwaW5nVXNlb3RoZXJWYWx1ZXNpc0ZpeGVkTGVuZ3RoanNfYXN0Y2hhckNvZGVzc3JjL25vZGVzLmRhcnRzcmMvYnVpbGRlci5kYXJ0c3JjL3ByaW50ZXIuZGFydHNyYy90ZW1wbGF0ZS5kYXJ0c3JjL2VxdWl2YWxlbmNlX3Zpc2l0b3IuZGFydFJlbmFtZXJJbnN0YW50aWF0b3JOb2RlVmlzaXRvcmNvbmRCYXNlVmlzaXRvcnZpc2l0TG9vcHZpc2l0VmFyaWFibGVSZWZlcmVuY2V2aXNpdFRva2VudmlzaXRMaXRlcmFsdmlzaXRJbnRlcnBvbGF0ZWROb2RlTm9kZVZpc2l0b3IxQmFzZVZpc2l0b3IxdmlzaXRDaGlsZHJlbjFfc291cmNlSW5mb3JtYXRpb25hc1ZhcmlhYmxlVXNldG9TdGF0ZW1lbnRJZm5vRWxzZWhhc0Vsc2VMb29wRm9yV2hpbGVEb1JldHVyblRyeVN3aXRjaFN3aXRjaENsYXVzZUNhc2VEZWZhdWx0TGl0ZXJhbFN0YXRlbWVudERhcnRZaWVsZExpdGVyYWxTdHJpbmdGcm9tTmFtZUxpdGVyYWxFeHByZXNzaW9ud2l0aERhdGFWYXJpYWJsZURlY2xhcmF0aW9uTGlzdFBhcmVudGhlc2VzQXNzaWdubWVudFZhcmlhYmxlSW5pdGlhbGl6YXRpb25Db25kaXRpb25hbENhbGxOZXdJbnRlcm5hbCBFcnJvcjogVW5oYW5kbGVkIGJpbmFyeSBvcGVyYXRvcjogUG9zdGZpeFZhcmlhYmxlUmVmZXJlbmNlX2lkZW50aWZpZXJSRV5bQS1aYS16XyRdW0EtWmEtel8kMC05XSokTm9uLWlkZW50aWZpZXIgbmFtZSAnVmFyaWFibGVVc2UoUGFyYW1ldGVyVGhpc05hbWVkRnVuY3Rpb25GdW5hc3luY1N0YXJzeW5jU3RhclByb3BlcnR5QWNjZXNzaW5kZXhlZERlZmVycmVkVG9rZW5EZWZlcnJlZE51bWJlckRlZmVycmVkU3RyaW5nRGVmZXJyZWRFeHByZXNzaW9uTGl0ZXJhbExpdGVyYWxOdW1iZXJBcnJheUluaXRpYWxpemVyQXJyYXlIb2xlT2JqZWN0SW5pdGlhbGl6ZXJQcm9wZXJ0eUludGVycG9sYXRlZE5vZGVfSW50ZXJwb2xhdGVkRXhwcmVzc2lvbiZFeHByZXNzaW9uJkludGVycG9sYXRlZE5vZGVJbnRlcnBvbGF0ZWRFeHByZXNzaW9uX0ludGVycG9sYXRlZExpdGVyYWwmTGl0ZXJhbCZJbnRlcnBvbGF0ZWROb2RlSW50ZXJwb2xhdGVkTGl0ZXJhbF9JbnRlcnBvbGF0ZWRQYXJhbWV0ZXImRXhwcmVzc2lvbiZJbnRlcnBvbGF0ZWROb2RlSW50ZXJwb2xhdGVkUGFyYW1ldGVySW50ZXJwb2xhdGVkUGFyYW1ldGVyLm5hbWUgbXVzdCBub3QgYmUgaW52b2tlZF9JbnRlcnBvbGF0ZWRTZWxlY3RvciZFeHByZXNzaW9uJkludGVycG9sYXRlZE5vZGVJbnRlcnBvbGF0ZWRTZWxlY3Rvcl9JbnRlcnBvbGF0ZWRTdGF0ZW1lbnQmU3RhdGVtZW50JkludGVycG9sYXRlZE5vZGVJbnRlcnBvbGF0ZWRTdGF0ZW1lbnRfSW50ZXJwb2xhdGVkRGVjbGFyYXRpb24mRXhwcmVzc2lvbiZJbnRlcnBvbGF0ZWROb2RlSW50ZXJwb2xhdGVkRGVjbGFyYXRpb25ObyBuYW1lIGZvciB0aGUgaW50ZXJwb2xhdGVkIG5vZGVSZWdFeHBMaXRlcmFsQXdhaXRKc0J1aWxkZXJfZmluZEV4cHJlc3Npb25UZW1wbGF0ZV9maW5kU3RhdGVtZW50VGVtcGxhdGV0aHJvdyBsb29rdXBFeHByZXNzaW9uVGVtcGxhdGVkZWZpbmVFeHByZXNzaW9uVGVtcGxhdGVsb29rdXBTdGF0ZW1lbnRUZW1wbGF0ZWRlZmluZVN0YXRlbWVudFRlbXBsYXRlZm9yY2VDb3B5dW5jYWNoZWRTdGF0ZW1lbnRUZW1wbGF0ZV9sZWdhY3lFc2NhcGVkU3RyaW5nZXNjYXBlZAp8InwIfAl8C3wNXGJVbmV4cGVjdGVkIG1hdGNoOiBhc2NpaUNhbm5vdCBiZSBib3RoIFVURjggYW5kIEFTQ0lJc2luZ2xlUXVvdGVzZG91YmxlUXVvdGVzb3RoZXJFc2NhcGVzdW5wYWlyZWRTdXJyb2dhdGVzcnVuZXVzZVNpbmdsZVF1b3Rlc1x4bGVhZGluZ3RyYWlsaW5nX2lzVW5wYWlyZWRTdXJyb2dhdGU0Mjk0OTY1MjQ4X2lycmVndWxhckVzY2FwZVwnYWRkUXVvdGVzbnVtQXJyYXlzdHJpbmdBcnJheXByb3BlcnR5Q2FsbG9iamVjdExpdGVyYWxNaW5pSnNQYXJzZXJFcnJvcmxhc3RQb3NpdGlvbm5ld2xpbmVQb3NsYXN0TGluZVN0YXJ0c3BhY2VzW15cdF1FcnJvciBpbiBNaW5pSnNQYXJzZXI6Cl4KTWluaUpzUGFyc2VybGFzdENhdGVnb3J5bGFzdFRva2Vuc2tpcHBlZE5ld2xpbmVpbnRlcnBvbGF0ZWRWYWx1ZXNBTFBIQU5VTUVSSUNET1RMUEFSRU5SUEFSRU5MQlJBQ0VSQlJBQ0VMU1FVQVJFUlNRVUFSRVFVRVJZV0hJVEVTUEFDRUNBVEVHT1JJRVNISUdIRVNUX1BBUlNFX0JJTkFSWV9QUkVDRURFTkNFQklOQVJZX1BSRUNFREVOQ0VVTkFSWV9PUEVSQVRPUlNPUEVSQVRPUlNfVEhBVF9MT09LX0xJS0VfSURFTlRJRklFUlNnZXRUb2tlbmhhc05hbWVkSG9sZXNoYXNQb3NpdGlvbmFsSG9sZXNzaW5nbGVDaGFyQ2F0ZWdvcnljYXRlZ29yeVRvU3RyaW5nY2F0VW5rbm93bjogaXNBc3NpZ25tZW50c3ltYm9sZ2V0RGVsaW1pdGVkY3VycmVudENvZGVVbnRlcm1pbmF0ZWQgbGl0ZXJhbE51bWVyaWMgYW5kIGhleCBlc2NhcGVzIGFyZSBub3QgYWxsb3dlZCBpbiBsaXRlcmFsc25leHRQb3NpdGlvblVudGVybWluYXRlZCBjb21tZW50VW5wYXJzZWFibGUgbnVtYmVybmV3Q2F0YmluYXJ5UHJlY2VuZGVuY2VVbmtub3duIG9wZXJhdG9yZXhwZWN0Q2F0ZWdvcnlhY2NlcHRDYXRlZ29yeWV4cGVjdFNlbWljb2xvbmFjY2VwdFNlbWljb2xvbkV4cGVjdGVkIFNFTUlDT0xPTk5vIGF1dG9tYXRpYyBzZW1pY29sb24gaW5zZXJ0aW9uIGF0IHByZWNlZGluZyBuZXdsaW5lYWNjZXB0U3RyaW5ncGFyc2VIYXNoaG9sZU5hbWVIb2xlcyBtdXN0IGFsbCBiZSBwb3NpdGlvbmFsIG9yIG5hbWVkLiBwYXJzZU9iamVjdEluaXRpYWxpemVycGFyc2VBc3NpZ25tZW50cmVnZXhwRXhwZWN0ZWQgcHJpbWFyeSBleHByZXNzaW9ucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9ucGFyc2VGdW5Pbmx5IHN5bmMqIGlzIHZhbGlkIC0gc3luYyBpcyBpbXBsaWVkaW50ZXJwb2xhdGVkTGl0ZXJhbEV4cGVjdGVkIHByb3BlcnR5IG5hbWVwYXJzZU1lbWJlcmdldERvdFJoc2luQnJhY2VzcGFyc2VDYWxsUGFyZW50aGVzZXMgYXJlIHJlcXVpcmVkIGZvciBuZXdFeHBlY3RlZCBhbHBoYW51bWVyaWMgaWRlbnRpZmllcnBhcnNlUG9zdGZpeHBhcnNlVW5hcnlIaWdocGFyc2VVbmFyeUxvd3BhcnNlQmluYXJ5bWF4UHJlY2VkZW5jZW1pblByZWNlZGVuY2VsYXN0U3ltYm9saGlnaGVycGFyc2VDb25kaXRpb25hbHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3RmaXJzdFZhcmlhYmxlZmluaXNoVmFyaWFibGVEZWNsYXJhdGlvbkxpc3RwYXJzZVZhckRlY2xhcmF0aW9uT3JFeHByZXNzaW9uVW5wYXJzZWQganVuazogcGFyc2VSZXR1cm5wYXJzZVRocm93cGFyc2VCcmVha09yQ29udGludWVwYXJzZUlmVGhlbkVsc2VwYXJzZUZvcnBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbnBhcnNlVHJ5cGFyc2VXaGlsZXBhcnNlRG9wYXJzZVN3aXRjaENhc2Ugb3V0c2lkZSBzd2l0Y2guRGVmYXVsdCBvdXRzaWRlIHN3aXRjaC5wYXJzZVlpZWxkTm90IGltcGxlbWVudGVkIGluIG1pbmkgcGFyc2VyY2hlY2tGb3JJbnRlcnBvbGF0ZWRTdGF0ZW1lbnR0aHJvdyBleHByZXNzaW9uIG11c3QgYmUgb24gc2FtZSBsaW5lZmluaXNoRm9yb2JqZWN0RXhwcmVzc2lvbnBhcnNlQ2F0Y2hleHBlY3RlZCAnZmluYWxseSdwYXJzZVN3aXRjaENsYXVzZWV4cGVjdGVkIGNhc2Ugb3IgZGVmYXVsdE1pc3Npbmcgd2hpbGUgYWZ0ZXIgZG8gYm9keS5fSW50ZXJsZWF2ZUl0ZXJhdG9yaXNOZXh0U2VwYXJhdG9yaXNJbml0aWFsaXplZF9JbnRlcmxlYXZlSXRlcmFibGVKYXZhU2NyaXB0UHJpbnRpbmdPcHRpb25zcHJlZmVyU2VtaWNvbG9uVG9OZXdsaW5lSW5NaW5pZmllZE91dHB1dGlkZW50aXR5UmVuYW1lckphdmFTY3JpcHRQcmludGluZ0NvbnRleHRTaW1wbGVKYXZhU2NyaXB0UHJpbnRpbmdDb250ZXh0ZGFuZ2xpbmdFbHNlVmlzaXRvcmxvY2FsTmFtZXJfY2hhckNvdW50aW5Gb3JJbml0YXRTdGF0ZW1lbnRCZWdpbnBlbmRpbmdTZW1pY29sb25wZW5kaW5nU3BhY2VpZGVudGlmaWVyQ2hhcmFjdGVyUmVnRXhwXlthLXpBLVpfMC05JF1leHByZXNzaW9uQ29udGludWF0aW9uUmVnRXhwXlstKyhbXWxhc3RBZGRlZFN0cmluZ2RldGVybWluZVJlbmFtZXJmb3JjZUxpbmVsaW5lT3V0c3BhY2VPdXRsYXN0Q2hhckNvZGVfZW1pdG91dExub3V0U2VtaWNvbG9uTG5vdXRJbmRlbnRvdXRJbmRlbnRMbnN0YXJ0Tm9kZWFkZFRvTm9kZWVuZE5vZGV2aXNpdENvbW1hU2VwYXJhdGVkaGFzUmVxdWlyZWRUeXBlbmV3SW5Gb3JJbml0bmV3QXRTdGF0ZW1lbnRCZWdpbnZpc2l0TmVzdGVkRXhwcmVzc2lvbnVud3JhcEJsb2NrSWZTaW5nbGVTdGF0ZW1lbnRibG9ja0JvZHluZWVkc1NlcGFyYXRpb25uZWVkc05ld2xpbmVibG9ja091dHNob3VsZEluZGVudGJsb2NrT3V0V2l0aG91dEJyYWNlc2lmT3V0bmVlZHNCcmFjZXN0aGVuV2FzQmxvY2sgaW5kZWZhdWx0OmZ1bmN0aW9uT3V0dmFyc3JlcXVpcmVkUHJlY2VkZW5jZW5lZWRzUGFyZW50aGVzZXN2YXIgdXNlSW5kZW50bGFzdFdhc0JpZ3RoaXNJc0JpZ19pc1NtYWxsSW5pdGlhbGl6YXRpb25fb3V0cHV0SW5jRGVjYWxpYXNyaWdodEhhbmRTaWRlckxlZnRyUmlnaHRuZXcgbGVmdFByZWNlZGVuY2VSZXF1aXJlbWVudHJpZ2h0UHJlY2VkZW5jZVJlcXVpcmVtZW50bGVmdFNwYWNlRm9yZ290IG9wZXJhdG9yOiBjaGFyQ29kZWlzVmFsaWRKYXZhU2NyaXB0SWQic3VwZXIiImNhdGNoImZpZWxkV2l0aFF1b3Rlc291dHB1dE51bWJlcldpdGhSZXF1aXJlZFdoaXRlc3BhY2VVbnJlYWNoYWJsZWV4aXRPbmVMaW5lck1vZGVuYW1lTnVtYmVyV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgSlM6IGF3YWl0IE9yZGVyZWRTZXRWYXJDb2xsZWN0b3JlbmFibGVSZW5hbWluZ2Rpc2FibGVWYXJpYWJsZU1pbmlmaWNhdGlvblBhdHRlcm46Om5vcmVuYW1pbmc6OmVuYWJsZVZhcmlhYmxlTWluaWZpY2F0aW9uUGF0dGVybjo6ZG9yZW5hbWluZzo6Zm9yRWFjaFZhcmZvckVhY2hQYXJhbWNvbGxlY3RWYXJzSW5GdW5jdGlvbkRhbmdsaW5nRWxzZVZpc2l0b3JGb3Jnb3Qgbm9kZTogTG9jYWxOYW1lcm9sZE5hbWVkZWNsYXJlUGFyYW1ldGVySWRlbnRpdHlOYW1lck1pbmlmeVJlbmFtZXJwYXJhbWV0ZXJOdW1iZXJTdGFja3ZhcmlhYmxlTnVtYmVyU3RhY2twYXJhbWV0ZXJOdW1iZXJ2YXJpYWJsZU51bWJlckxPV0VSX0NBU0VfTEVUVEVSU0xFVFRFUlNESUdJVFNudGhMZXR0ZXJhdm9pZFJlbmFtaW5nZ2V0TmFtZU51bWJlcmFscGhhQ2hhcnNuYW1lU3BhY2VTaXplW2EtekEtWl1bYS16QS1aMC05XSpFbnRlckV4aXROb2RlVGVtcGxhdGVNYW5hZ2VyZXhwcmVzc2lvblRlbXBsYXRlc3N0YXRlbWVudFRlbXBsYXRlc2hvbGVOYW1lc19jb21waWxld2l0aEV4cHJlc3Npb25SZXN1bHRfY2hlY2tOb1BsYWNlaG9sZGVyc3dpdGhTdGF0ZW1lbnRSZXN1bHRXcm9uZyBudW1iZXIgb2YgdGVtcGxhdGUgYXJndW1lbnRzLCBnaXZlbiAsIHNvdXJjZTogInVudXNlZE5hbWVzVGVtcGxhdGUgYXJndW1lbnRzIGhhcyB1bnVzZWQgbWFwcGluZ3M6IFRlbXBsYXRlIGFyZ3VtZW50cyBpcyBtaXNzaW5nIG1hcHBpbmdzIGZvcjogSW5zdGFudGlhdG9yR2VuZXJhdG9yVmlzaXRvcmlkZW50aWZpZXJSRW1ha2VOdWxsY29udGFpbnNJbnRlcnBvbGF0ZWROb2Rlc3Zpc2l0TnVsbGFibGV2aXNpdFNwbGF5YWJsZVVuaW1wbGVtZW50ZWQgSW5zdGFudGlhdG9yR2VuZXJhdG9yVmlzaXRvciBmb3IgY29udmVydFN0cmluZ1RvVmFyaWFibGVVc2Vjb252ZXJ0U3RyaW5nVG9WYXJpYWJsZURlY2xhcmF0aW9uSW50ZXJwb2xhdGVkIHZhbHVlICMgaXMgbm90IGFuIEV4cHJlc3Npb246ICBpcyBub3QgYSBkZWNsYXJhdGlvbjogdmlzaXRTcGxheWFibGVFeHByZXNzaW9udG9FeHByZXNzaW9uIGlzIG5vdCBhbiBFeHByZXNzaW9uIG9yIExpc3Qgb2YgRXhwcmVzc2lvbnM6ICBpcyBub3QgYSBMaXRlcmFsOiB0b1BhcmFtZXRlciBpcyBub3QgYSBQYXJhbWV0ZXIgb3IgTGlzdCBvZiBQYXJhbWV0ZXJzOiAgaXMgbm90IGEgc2VsZWN0b3I6ICBpcyBub3QgYSBTdGF0ZW1lbnQ6IHZpc2l0U3BsYXlhYmxlU3RhdGVtZW50YSBTdGF0ZW1lbnQgb3IgTGlzdCBvZiBTdGF0ZW1lbnRzOiBpbnN0YW50aWF0b3JzdmlzaXRJZkNvbmRpdGlvbmFsQ29tcGlsYXRpb252aXNpdElmTm9ybWFsY29tcGlsZUNvbmRpdGlvbmlzIG5vdCBhbiBFeHByZXNzaW9uOiBtYWtlQ29uZGl0aW9ubWFrZVRoZW5tYWtlT3RoZXJ3aXNlbWFrZUluaXRtYWtlVXBkYXRlbWFrZUJvZHltYWtlTGVmdEhhbmRTaWRlbWFrZU9iamVjdFRPRE9tYWtlRXhwcmVzc2lvbm1ha2VDYXRjaG1ha2VGaW5hbGx5bWFrZURlY2xhcmF0aW9ubWFrZUtleW1ha2VDYXNlc21ha2VDYXNlbWFrZU5hbWVtYWtlRnVuY3Rpb25kZWNsYXJhdGlvbk1ha2Vyc21ha2VWYWx1ZWhhbmRsZUNhbGxPck5ld21ha2VUYXJnZXRhcmd1bWVudE1ha2Vyc2NhbGxBcmd1bWVudHNtYWtlTGVmdG1ha2VSaWdodG1ha2VPcGVyYW5kbWFrZVJlY2VpdmVybWFrZVNlbGVjdG9ycGFyYW1NYWtlcnNwYXJ0TWFrZXJzbWFrZUVuY2xvc2VkZWxlbWVudE1ha2Vyc3Byb3BlcnR5TWFrZXJzSW50ZXJwb2xhdGVkTm9kZUFuYWx5c2lzY29udGFpbnNJbnRlcnBvbGF0ZWROb2RlRXF1aXZhbGVuY2VWaXNpdG9yZmFpbEF0dGVzdFZhbHVlc3Rlc3RMYWJlbHNsYWJlbDFsYWJlbDJ0ZXN0Tm9kZXN0ZXN0Tm9kZUxpc3RzbGlzdDFsaXN0MnRlbXBsYXRlTWFuYWdlcnVuZGVmZXJqcy5kZWJ1Z19EZWJ1Z1ByaW50ZXImQmFzZVZpc2l0b3ImSW5kZW50YXRpb25fRGVidWdQcmludGVyJkJhc2VWaXNpdG9yJkluZGVudGF0aW9uJlRhZ2dpbmdEZWJ1Z1ByaW50ZXJ2aXNpdE5vZGVXaXRoQ2hpbGRyZW5MZW5pZW50UHJpbnRpbmdDb250ZXh0cHJldHR5cHJpbnRpbmdDb250ZXh0ZGFydDJqcy5fZW1iZWRkZWRfbmFtZXNHRVRURVJfUFJFRklYU0VUVEVSX1BSRUZJWENBTExfUFJFRklYQ0FMTF9QUkVGSVgwQ0FMTF9QUkVGSVgxQ0FMTF9QUkVGSVgyQ0FMTF9QUkVGSVgzQ0FMTF9QUkVGSVg0Q0FMTF9QUkVGSVg1Q0FMTF9DQVRDSF9BTExSRUZMRUNUQUJMRUNMQVNTX0RFU0NSSVBUT1JfUFJPUEVSVFlSRVFVSVJFRF9QQVJBTUVURVJfUFJPUEVSVFlERUZBVUxUX1ZBTFVFU19QUk9QRVJUWUNBTExfTkFNRV9QUk9QRVJUWURFRkVSUkVEX0FDVElPTl9QUk9QRVJUWU9QRVJBVE9SX0FTX1BSRUZJWFNJR05BVFVSRV9OQU1FUlRJX05BTUVUWVBFREVGX1RBR0ZVTkNUSU9OX1RZUEVfVEFHRlVOQ1RJT05fVFlQRV9HRU5FUklDX0JPVU5EU19UQUdGVU5DVElPTl9UWVBFX1ZPSURfUkVUVVJOX1RBR0ZVTkNUSU9OX1RZUEVfUkVUVVJOX1RZUEVfVEFHRlVOQ1RJT05fVFlQRV9SRVFVSVJFRF9QQVJBTUVURVJTX1RBR0ZVTkNUSU9OX1RZUEVfT1BUSU9OQUxfUEFSQU1FVEVSU19UQUdGVU5DVElPTl9UWVBFX05BTUVEX1BBUkFNRVRFUlNfVEFHRlVUVVJFX09SX1RBR0ZVVFVSRV9PUl9UWVBFX0FSR1VNRU5UX1RBR0ZVVFVSRV9DTEFTU19UWVBFX05BTUVJU19JTkRFWEFCTEVfRklFTERfTkFNRU5VTExfQ0xBU1NfVFlQRV9OQU1FT0JKRUNUX0NMQVNTX1RZUEVfTkFNRUZVTkNUSU9OX0NMQVNTX1RZUEVfTkFNRWRhcnRPYmplY3RDb25zdHJ1Y3RvcmRhcnRDbG9zdXJlQ29uc3RydWN0b3Jpc0NoZWNrUHJvcGVydHlUb0pzQ29uc3RydWN0b3JOYW1laXNGdXR1cmVPclR5cGVpc1ZvaWRUeXBlaXNEeW5hbWljVHlwZWlzSnNJbnRlcm9wVHlwZUFyZ3VtZW50cmF3UnRpVG9Kc0NvbnN0cnVjdG9yTmFtZXJhd1J1bnRpbWVUeXBlaXNHaXZlblR5cGVSdGlSdGlVbml2ZXJzZUZpZWxkTmFtZXNldmFsQ2FjaGVlQ3R5cGVSdWxlc3RSc2hhcmVkRW1wdHlBcnJheXNFQVRZUEVERUZfUFJFRElDQVRFX1BST1BFUlRZX05BTUUkJGlzVHlwZWRlZlRZUEVERUZfVFlQRV9QUk9QRVJUWV9OQU1FJHR5cGVkZWZUeXBlTkFUSVZFX1NVUEVSQ0xBU1NfVEFHX05BTUUkbmF0aXZlU3VwZXJjbGFzc1RhZ1NUQVRJQ19GVU5DVElPTl9OQU1FX1BST1BFUlRZX05BTUUkc3RhdGljX25hbWVNRVRBREFUQVRZUEVTR0VUX1RZUEVfRlJPTV9OQU1FZ2V0VHlwZUZyb21OYW1lTUFOR0xFRF9HTE9CQUxfTkFNRVNtYW5nbGVkR2xvYmFsTmFtZXNNQU5HTEVEX05BTUVTbWFuZ2xlZE5hbWVzSU5URVJDRVBUT1JTX0JZX1RBR2ludGVyY2VwdG9yc0J5VGFnTEVBRl9UQUdTR0VUX0lTT0xBVEVfVEFHZ2V0SXNvbGF0ZVRhZ0lTT0xBVEVfVEFHaXNvbGF0ZVRhZ0RJU1BBVENIX1BST1BFUlRZX05BTUVkaXNwYXRjaFByb3BlcnR5TmFtZVRZUEVfVE9fSU5URVJDRVBUT1JfTUFQQ1VSUkVOVF9TQ1JJUFRjdXJyZW50U2NyaXB0REVGRVJSRURfTElCUkFSWV9QQVJUU2RlZmVycmVkTGlicmFyeVBhcnRzREVGRVJSRURfUEFSVF9VUklTZGVmZXJyZWRQYXJ0VXJpc0RFRkVSUkVEX1BBUlRfSEFTSEVTZGVmZXJyZWRQYXJ0SGFzaGVzSU5JVElBTElaRV9MT0FERURfSFVOS2luaXRpYWxpemVMb2FkZWRIdW5rSVNfSFVOS19MT0FERURpc0h1bmtMb2FkZWRJU19IVU5LX0lOSVRJQUxJWkVEaXNIdW5rSW5pdGlhbGl6ZWRERUZFUlJFRF9JTklUSUFMSVpFRGRlZmVycmVkSW5pdGlhbGl6ZWRSVElfVU5JVkVSU0V0eXBlVW5pdmVyc2VQUkVDT01QSUxFRHByZWNvbXBpbGVkRklOSVNIRURfQ0xBU1NFU2ZpbmlzaGVkQ2xhc3Nlc0FMTF9DTEFTU0VTYWxsQ2xhc3Nlc1RZUEVfSU5GT1JNQVRJT05TVEFUSUNTTElCUkFSSUVTTEFaSUVTbGF6aWVzSGFzQ2FwdHVyZWRQbGFjZWhvbGRlcnNlbmNsb3NpbmdGdW5jdGlvbnNTaWRlRWZmZWN0c1Zpc2l0b3JUaHJvd0JlaGF2aW9yVmlzaXRvcnNlcXVlbmNlX2lzRmlyc3RJbnRlcnBvbGF0ZWRQcm9wZXJ0eVJ1bnRpbWVUeXBlVXNlS2luZFJ1bnRpbWVUeXBlVXNlRGF0YVVuZXhwZWN0ZWQgUnVudGltZVR5cGVVc2VLaW5kIFJ1bnRpbWVUeXBlVXNlRGF0YShraW5kPXJlY2VpdmVyR2V0PXJlY2VpdmVyVHlwZT0sYXJndW1lbnRHZXQ9YXJndW1lbnQ9LGFyZ3VtZW50VHlwZT1jb21wdXRlUnVudGltZVR5cGVVc2VyZWNlaXZlckRhdGFpc0dldFJ1bnRpbWVUeXBlYXNHZXRSdW50aW1lVHlwZWlzSW52b2tlVG9TdHJpbmdyZWNlaXZlckdldGFyZ3VtZW50R2V0bnVsbEF3YXJlb3RoZXJHZXRSdW50aW1lVHlwZW90aGVyTnVsbEF3YXJlTWlzc2luZyByZWNlaXZlckdldCBpbiBNaXNzaW5nIGFyZ3VtZW50R2V0IGluIER1cGxpY2F0ZSBwcm9wZXJ0eSBnZXQgaW4gZGFydDJqc19pbmZvLnNyYy51dGlsZ3JhcGhGcm9tSW5mbyAgaW5mbzogZGVwZW5kZW5jeSBncmFwaCBpbmZvcm1hdGlvbiBpcyB3b3JrIGluIHByb2dyZXNzIGFuZCBtaWdodCBiZSBpbmNvbXBsZXRlYWRkRWRnZWluZm9QYXRoc2VnbWVudGN1cnJlbnRCYXNlc2VnbWVudFN0cmluZ193cml0ZUludF9yZWFkSW50X3BlbmRpbmdzZXJpYWxpemF0aW9uIGN5Y2xlcyBub3Qgc3VwcG9ydGVkX1Njb3BlTW9kZWxCdWlsZGVyJlZpc2l0b3ImVmFyaWFibGVDb2xsZWN0b3JNaXhpblNjb3BlTW9kZWxCdWlsZGVyX21vZGVsX3Njb3BlVmFyaWFibGVzX2V4ZWN1dGFibGVDb250ZXh0X2lzSW5zaWRlQ2xvc3VyZV9vdXRlcm1vc3ROb2RlX211dGF0ZWRWYXJpYWJsZXNfY2FwdHVyZWRWYXJpYWJsZXNfaW5UcnlfY3VycmVudFNjb3BlSW5mb19oYXNUaGlzTG9jYWxfYm94Q291bnRlcl9jdXJyZW50VHlwZVVzYWdlX3Njb3Blc0NhcHR1cmVkSW5DbG9zdXJlTWFwX2Nsb3N1cmVzVG9HZW5lcmF0ZUNvbXBsZXhpdHlMZXZlbC5kZWZpbml0ZWx5TGF6eUNvbXBsZXhpdHlMZXZlbC5jb25zdGFudGF0dGFjaENhcHR1cmVkU2NvcGVWYXJpYWJsZXNjYXB0dXJlZFZhcmlhYmxlc0ZvclNjb3Blbm9kZUJveGdldEJveE5hbWVlbnRlck5ld1Njb3BldmlzaXROZXdTY29wZW9sZFNjb3BlVmFyaWFibGVzb2xkSW5UcnlfbWFya1ZhcmlhYmxlQXNVc2VkdmlzaXRJbkNvbnRleHRfaGFuZGxlVmFyaWFibGVEZWNsYXJhdGlvbl9pbkN1cnJlbnRDb250ZXh0X3JlZ2lzdGVyTmVlZHNUaGlzX3VzZVR5cGVWYXJpYWJsZUFzTG9jYWx2aXNpdE5vZGVzSW5Db250ZXh0dmlzaXRJbnZva2FibGVvbGRJc0luc2lkZUNsb3N1cmVvbGRFeGVjdXRhYmxlQ29udGV4dHNhdmVkU2NvcGVJbmZvc2F2ZWRJc0luc2lkZUNsb3N1cmVmcmVlVmFyaWFibGVmcmVlVmFyaWFibGVGb3JSdGlfYW5hbHl6ZVR5cGVWYXJpYWJsZW9sZEN1cnJlbnRUeXBlVXNhZ2VtYWtlRWFnZXJfaXNGaWVsZE9yQ29uc3RydWN0b3JDb21wbGV4aXR5TGV2ZWxDb21wbGV4aXR5TGV2ZWwucG90ZW50aWFsbHlFYWdlcnBvdGVudGlhbGx5RWFnZXJkZWZpbml0ZWx5TGF6eUluaXRpYWxpemVyQ29tcGxleGl0eWVhZ2VybGF6eSZmaWVsZHM9W1VuZXhwZWN0ZWQgY29tcGxleGl0eSBsZXZlbCBJbml0aWFsaXplckNvbXBsZXhpdHkoTnVsbEF3YXJlRXhwcmVzc2lvbnN5bnRoZXRpY1ZhcmlhYmxlX0ZyZWVWYXJpYWJsZVZpc2l0b3JGcmVlVmFyaWFibGVWaXNpdG9yLmRlZmF1bHRUeXBlTm9kZW5vZGVUb0RlYnVnU3RyaW5ndGV4dExlbmd0aGJsb2NrVGV4dG5hbWVkT3JkZXJpbmduYXRpdmVPcmRlcmluZ2NvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlQXN5bmMgbWFya2VyIGdldE51bGxBd2FyZUV4cHJlc3Npb25nZXREZWZlcnJlZEltcG9ydGNvbnRhaW5zRnJlZVZhcmlhYmxlc1N0YXRpY1R5cGVDYWNoZXN0YXRpYy10eXBlLWNhY2hlX2V4cHJlc3Npb25UeXBlc19mb3JJbkl0ZXJhdG9yVHlwZXNleHByZXNzaW9uVHlwZXNmb3JJbkl0ZXJhdG9yVHlwZXNjb21waWxlci5zcmMuaW5mZXJyZXIudHlwZV9ncmFwaF9ub2Rlc0FyZ3VtZW50c1R5cGVzVHlwZUluZm9ybWF0aW9uX2Fzc2lnbm1lbnRzaXNTdGFibGVfc3RhdGljSGFzaENvZGVTVE9QX1RSQUNLSU5HX0FTU0lHTk1FTlRTX01BUktFUm5vQXNzaWdubWVudHN1bnRyYWNrZWR3aXRoQXNzaWdubWVudHNjb250ZXh0TWVtYmVybWlnaHRSZXN1bWVhZGRVc2VyYXJlQXNzaWdubWVudHNUcmFja2Vkc2FmZVR5cGVyZW1vdmVBbmRDbGVhclJlZmVyZW5jZXNfdG9TdHJ1Y3R1cmVkVGV4dEFwcGx5YWJsZVR5cGVJbmZvcm1hdGlvblBsYWNlaG9sZGVyVHlwZUluZm9ybWF0aW9uQ2Fubm90IHZpc2l0IHBsYWNlaG9sZGVyQ2Fubm90IHJlZmluZSBwbGFjZWhvbGRlclBsYWNlaG9sZGVyIFtQYXJhbWV0ZXJBc3NpZ25tZW50c0VsZW1lbnRUeXBlSW5mb3JtYXRpb25kaXNhYmxlSW5mZXJlbmNlRm9yQ2xvc3VyZXNfd2l0aEFzc2lnbm1lbnRzX01lbWJlclR5cGVJbmZvcm1hdGlvbiZFbGVtZW50VHlwZUluZm9ybWF0aW9uJkFwcGx5YWJsZVR5cGVJbmZvcm1hdGlvbk1lbWJlclR5cGVJbmZvcm1hdGlvbl9jYWxsZXJzYWRkQ2FsbHJlbW92ZUNhbGxjYWxsc19jb21wdXRlSXNDYWxsZWRPbmNlaXNDYWxsZWRPbmNlIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQuaXNDbG9zdXJpemVkaGFuZGxlU3BlY2lhbENhc2VzX2hhbmRsZUZ1bmN0aW9uQ2FzZXBvdGVudGlhbGx5TmFycm93VHlwZV9wb3RlbnRpYWxseU5hcnJvd1R5cGV2aXNpdE1lbWJlclR5cGVJbmZvcm1hdGlvbkZpZWxkVHlwZUluZm9ybWF0aW9uX2ZpZWxkR2V0dGVyVHlwZUluZm9ybWF0aW9uX2dldHRlclNldHRlclR5cGVJbmZvcm1hdGlvbl9zZXR0ZXJNZXRob2RUeXBlSW5mb3JtYXRpb25fbWV0aG9kRmFjdG9yeUNvbnN0cnVjdG9yVHlwZUluZm9ybWF0aW9uX2NvbnN0cnVjdG9yR2VuZXJhdGl2ZUNvbnN0cnVjdG9yVHlwZUluZm9ybWF0aW9uUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uX3BhcmFtZXRlcl9pc0luc3RhbmNlTWVtYmVyUGFyYW1ldGVyX2lzQ2xvc3VyZVBhcmFtZXRlcl9pc0luaXRpYWxpemluZ0Zvcm1hbF9pc1RlYXJPZmZDbG9zdXJlUGFyYW1ldGVydmlzaXRQYXJhbWV0ZXJUeXBlSW5mb3JtYXRpb25QYXJhbWV0ZXIgUGFyYW1ldGVyVHlwZUluZm9ybWF0aW9uLmdldEluZmVycmVkU2lnbmF0dXJlQ2FsbFR5cGVmb3JJbl9DYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbiZUeXBlSW5mb3JtYXRpb24mQXBwbHlhYmxlVHlwZUluZm9ybWF0aW9uQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb25fY2FsbENhbGwgc2l0ZSBTdGF0aWNDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbl9nZXRDYWxsZWRUeXBlSW5mb2lzU3ludGhlc2l6ZWRfZ2V0Q2FsbGVkVHlwZUluZm9XaXRoU2VsZWN0b3J2aXNpdFN0YXRpY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uRHluYW1pY0NhbGxTaXRlVHlwZUluZm9ybWF0aW9uX2NhbGxUeXBlX2hhc0Nsb3N1cmVDYWxsVGFyZ2V0c19jb25jcmV0ZVRhcmdldHNjb21wdXRlVHlwZWRTZWxlY3RvcnRhcmdldHNJbmNsdWRlQ29tcGxleE5vU3VjaE1ldGhvZGhhbmRsZUludHJpc2lmaWVkU2VsZWN0b3J1aW50MzFJbXBsZW1lbnRhdGlvbmlzUG9zaXRpdmVJbnR0cnlMYXRlcm5vbk51bGxFbXB0eVR5cGVoYXNOb0FyZ3VtZW50c29sZFRhcmdldHNqb2luVHlwZU1hc2tzRGljdGlvbmFyeSBsb29rdXAgZm9yICB5aWVsZHMgIHlpZWxkcyBbbnVsbF0uTWFwIGxvb2t1cCBmb3IgdmlzaXREeW5hbWljQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb25DbG9zdXJlQ2FsbFNpdGVUeXBlSW5mb3JtYXRpb25DYW5ub3QgY29tcHV0ZSBjYWxsZWVzIG9mIGEgY2xvc3VyZSBjYWxsLkNsb3N1cmUgY2FsbCB2aXNpdENsb3N1cmVDYWxsU2l0ZVR5cGVJbmZvcm1hdGlvbkNvbmNyZXRlVHlwZUluZm9ybWF0aW9uTm90IHN1cHBvcnRlZHZpc2l0Q29uY3JldGVUeXBlSW5mb3JtYXRpb25TdHJpbmdMaXRlcmFsVHlwZUluZm9ybWF0aW9uIHZhbHVlIHZpc2l0U3RyaW5nTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbkJvb2xMaXRlcmFsVHlwZUluZm9ybWF0aW9udmlzaXRCb29sTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbk5hcnJvd1R5cGVJbmZvcm1hdGlvbnR5cGVBbm5vdGF0aW9ubmFycm93ZWRUeXBlQU5PTUFMWSBXQVJOSU5HOiBuYXJyb3dlZCAgdmlhIE5hcnJvdyB0byB2aXNpdE5hcnJvd1R5cGVJbmZvcm1hdGlvbkluZmVycmVkVHlwZUluZm9ybWF0aW9ucGFyZW50VHlwZV9MaXN0VHlwZUluZm9ybWF0aW9uJlR5cGVJbmZvcm1hdGlvbiZUcmFjZWRUeXBlSW5mb3JtYXRpb25fZmxvd3NJbnRvZmxvd3NJbnRvYWRkRmxvd3NJbnRvVGFyZ2V0c0xpc3RUeXBlSW5mb3JtYXRpb25pbmZlcnJlZExlbmd0aExpc3QgdHlwZSB2aXNpdExpc3RUeXBlSW5mb3JtYXRpb25FbGVtZW50SW5Db250YWluZXJUeXBlSW5mb3JtYXRpb25FbGVtZW50IGluIGNvbnRhaW5lciB2aXNpdEVsZW1lbnRJbkNvbnRhaW5lclR5cGVJbmZvcm1hdGlvbl9TZXRUeXBlSW5mb3JtYXRpb24mVHlwZUluZm9ybWF0aW9uJlRyYWNlZFR5cGVJbmZvcm1hdGlvblNldFR5cGVJbmZvcm1hdGlvblNldCB0eXBlIHZpc2l0U2V0VHlwZUluZm9ybWF0aW9uRWxlbWVudEluU2V0VHlwZUluZm9ybWF0aW9uRWxlbWVudCBpbiBzZXQgdmlzaXRFbGVtZW50SW5TZXRUeXBlSW5mb3JtYXRpb25fTWFwVHlwZUluZm9ybWF0aW9uJlR5cGVJbmZvcm1hdGlvbiZUcmFjZWRUeXBlSW5mb3JtYXRpb25NYXBUeXBlSW5mb3JtYXRpb25fYWxsS2V5c0FyZVN0cmluZ3NpbkRpY3Rpb25hcnlNb2Rlbm9uTnVsbG5ld0luZm9rZXlTdHJpbmduZXdJbmZvc25vdCBzdXBwb3J0ZWR2aXNpdE1hcFR5cGVJbmZvcm1hdGlvbnRvVHlwZU1hc2tNYXAgIChLOiwgVjopIGNvbnRlbnRzIEtleUluTWFwVHlwZUluZm9ybWF0aW9udmlzaXRLZXlJbk1hcFR5cGVJbmZvcm1hdGlvbktleSBpbiBNYXAgVmFsdWVJbk1hcFR5cGVJbmZvcm1hdGlvbnZpc2l0VmFsdWVJbk1hcFR5cGVJbmZvcm1hdGlvblZhbHVlIGluIE1hcCBQaGlFbGVtZW50VHlwZUluZm9ybWF0aW9uYnJhbmNoTm9kZWlzVHJ5UGhpKCBbIC4uLiBddmlzaXRQaGlFbGVtZW50VHlwZUluZm9ybWF0aW9uX0Nsb3N1cmVUeXBlSW5mb3JtYXRpb24mVHlwZUluZm9ybWF0aW9uJkFwcGx5YWJsZVR5cGVJbmZvcm1hdGlvbkNsb3N1cmVUeXBlSW5mb3JtYXRpb25DbG9zdXJlIHZpc2l0Q2xvc3VyZVR5cGVJbmZvcm1hdGlvblRyYWNlZFR5cGVJbmZvcm1hdGlvbkF3YWl0VHlwZUluZm9ybWF0aW9uX25vZGV2aXNpdEF3YWl0VHlwZUluZm9ybWF0aW9uWWllbGRUeXBlSW5mb3JtYXRpb25ZaWVsZHZpc2l0WWllbGRUeXBlSW5mb3JtYXRpb25UeXBlSW5mb3JtYXRpb25WaXNpdG9ydmFsaWRDYWxsVHlwZVVuZXhwZWN0ZWQgY2FsbCB0eXBlIF9uYXJyb3dUeXBlb3RoZXJUeXBlU3RhdGljVHlwZVByb3ZpZGVyQ2xhc3NUeXBlVmFyaWFibGVBY2Nlc3NfdHJ1c3RUeXBlX2NoZWNrVHlwZV9jaGVja0Jvb2xDb252ZXJpb25wYXJhbWV0ZXJDaGVja1BvbGljeWNvbmRpdGlvbkNoZWNrUG9saWN5cmVhZEFzUHJvcGVydHlyZWFkQXNQYXJhbWV0ZXJVbmV4cGVjdGVkIHR5cGUgdmFyaWFibGUgaW4gc3RhdGljIGNvbnRleHQuVW5leHBlY3RlZCB0eXBlIHZhcmlhYmxlIGFjY2VzczogZW52aXJvbm1lbnRBY2Nlc3NfYnVpbGRFbnZpcm9ubWVudEZvclR5cGV1c2VzSW5zdGFuY2VQYXJhbWV0ZXJzcHJvY2Vzc1R5cGVWYXJpYWJsZXNpbmdsZXRvblN0cnVjdHVyZXNpbmdsZXRvblR1cGxlZnVsbFN0cnVjdHVyZWJ1aWxkQXNDaGVja3JlaWZpZWRUeXBlcmVmaW5lZE1hc2tfRW52aXJvbm1lbnRFeHByZXNzaW9uQW5kU3RydWN0dXJlS2VybmVsVHlwZUdyYXBoQnVpbGRlcl9pbmZlcnJlcl9hbmFseXplZE1lbWJlcl9hbmFseXplZE5vZGVfaW5HZW5lcmF0aXZlQ29uc3RydWN0b3Jfc3RhdGVJbnRlcm5hbF9zdGF0ZUFmdGVyV2hlblRydWVJbnRlcm5hbF9zdGF0ZUFmdGVyV2hlbkZhbHNlSW50ZXJuYWxfc2lkZUVmZmVjdHNCdWlsZGVyX2JyZWFrc0Zvcl9jb250aW51ZXNGb3JfY2FwdHVyZWRBbmRCb3hlZF9zdGF0aWNUeXBlUHJvdmlkZXJfYWNjdW11bGF0ZUlzQ2hlY2tzX2xvb3BMZXZlbGNhcHR1cmVkQW5kQm94ZWRfc3RhdGVpbkdlbmVyYXRpdmVDb25zdHJ1Y3Rvcl9zdGF0ZUFmdGVyV2hlblRydWVfc3RhdGVBZnRlcldoZW5GYWxzZV9zZXRTdGF0ZUFmdGVyd2hlblRydWV3aGVuRmFsc2VfaXNJbkNsYXNzT3JTdWJjbGFzc19jaGVja0lmRXhwb3Nlc1RoaXNpc1RoaXNFeHBvc2VkbWFya1RoaXNBc0V4cG9zZWRpc0luY29tcGF0aWJsZUludm9rZWFuYWx5emVkTWV0aG9kY29uZGl0aW9uQ29udGV4dG9sZEFjY3VtdWxhdGVJc0NoZWNrc2hhbmRsZVBhcmFtZXRlcnN1cGRhdGVGaWVsZGFuYWx5emVBcmd1bWVudHNoYW5kbGVDb25zdHJ1Y3Rvckludm9rZXNlZW5SZXR1cm5PclRocm93Y3JlYXRlSW5zdGFudGlhdGlvblR5cGVJbmZvcm1hdGlvblVuaGFuZGxlZCBleHByZXNzaW9uOiBVbmhhbmRsZWQgc3RhdGVtZW50OiBjcmVhdGVOdWxsVHlwZUluZm9ybWF0aW9uYWJvcnRzc3RhdGVCZWZvcmVoYW5kbGVDb25kaXRpb25zdGF0ZUFmdGVyTWVzc2FnZW1lcmdlRGlhbW9uZEZsb3dzZWVuQnJlYWtPckNvbnRpbnVlX3NldHVwQnJlYWtzQW5kQ29udGludWVzbWVyZ2VBZnRlckJyZWFrc19nZXRCcmVha3NfY2xlYXJCcmVha3NBbmRDb250aW51ZXNjb250aW51ZVRhcmdldHNzdGF0ZUJlZm9yZUNhc2VzdGF0ZUFmdGVyQ2FzZW1lcmdlQWxsc3RhdGVzVG9NZXJnZWhhc0RlZmF1bHRDYXNla2VlcE93bkxvY2Fsc2NyZWF0ZUxpc3RUeXBlSW5mb3JtYXRpb25lbGVtZW50VHlwZXNhbGxvY2F0ZVBoaWFkZFBoaUlucHV0Y29udGFpbmVyVHlwZWFsbG9jYXRlTGlzdGNyZWF0ZVNldFR5cGVJbmZvcm1hdGlvbmFsbG9jYXRlU2V0Y3JlYXRlTWFwVHlwZUluZm9ybWF0aW9uZW50cnlUeXBlc2tleVR5cGVzdmFsdWVUeXBlc2FsbG9jYXRlTWFwbWFya0luaXRpYWxpemF0aW9uQXNJbmRlZmluaXRlY3JlYXRlQm9vbFR5cGVJbmZvcm1hdGlvbmJvb2xMaXRlcmFsVHlwZWNyZWF0ZUludFR5cGVJbmZvcm1hdGlvbmdldENvbmNyZXRlVHlwZUZvcmNyZWF0ZURvdWJsZVR5cGVJbmZvcm1hdGlvbmNyZWF0ZVN0cmluZ1R5cGVJbmZvcm1hdGlvbnN0cmluZ0xpdGVyYWxUeXBlY3JlYXRlU3ltYm9sTGl0ZXJhbFR5cGVJbmZvcm1hdGlvbmNyZWF0ZVR5cGVMaXRlcmFsSW5mb3JtYXRpb25VbmV4cGVjdGVkIHBhcmFtZXRlciBkZWNsYXJhdGlvbi5NaXNzaW5nIHR5cGUgaW5mb3JtYXRpb24gZm9yIGhhbmRsZVN0YXRpY0ludm9rZW5hcnJvd1R5cGVfcG90ZW50aWFsbHlBZGROdWxsQ2hlY2tuZXdUeXBlZFNlbGVjdG9yaGFuZGxlRHluYW1pY0ludm9rZV9oYW5kbGVEeW5hbWljc2VsZWN0b3JOZWVkc1VwZGF0ZWhhbmRsZUR5bmFtaWNHZXRoYW5kbGVEeW5hbWljU2V0Y3VycmVudE1hc2ttb3ZlTmV4dE1hc2tpdGVyYXRvclNlbGVjdG9yaXRlcmF0b3JNYXNrY3VycmVudFR5cGVfZ2V0TG9vcEJhY2tFZGdlc2xvZ2ljX2ZpbmRMZW5ndGhpc1ZhbGlkSW50X2lzQ29uc3RydWN0b3JPZlR5cGVkQXJyYXlTdWJjbGFzc2FyZ3VtZW50c1R5cGVzaGFuZGxlQ2xvc3VyZUNhbGxoYW5kbGVGb3JlaWduSW52b2tlVW5leHBlY3RlZCBzdGF0aWMgaW52b2NhdGlvbiB0YXJnZXQ6IGNyZWF0ZVN0YXRpY0dldFR5cGVJbmZvcm1hdGlvbnR5cGVkTWFza19wb3RlbnRpYWxseUFkZElzQ2hlY2tzdGF0ZUFmdGVyQ2hlY2tXaGVuVHJ1ZXN0YXRlQWZ0ZXJDaGVja1doZW5GYWxzZW5hcnJvd0xvY2Fsc3RhdGVBZnRlckNvbmRpdGlvbldoZW5UcnVlc3RhdGVBZnRlckNvbmRpdGlvbldoZW5GYWxzZXN0YXRlQWZ0ZXJUaGVuc3RhdGVBZnRlckVsc2VzdGF0ZUFmdGVyT3BlcmFuZFdoZW5UcnVlc3RhdGVBZnRlck9wZXJhbmRXaGVuRmFsc2VzdGF0ZUFmdGVyTGVmdFdoZW5UcnVlc3RhdGVBZnRlckxlZnRXaGVuRmFsc2VzdGF0ZUFmdGVyUmlnaHRXaGVuVHJ1ZXN0YXRlQWZ0ZXJSaWdodFdoZW5GYWxzZXN0YXRlQWZ0ZXJXaGVuVHJ1ZXN0YXRlQWZ0ZXJXaGVuRmFsc2VzdGF0ZUFmdGVyVW5leHBlY3RlZCBsb2dpY2FsIG9wZXJhdG9yICdmaXJzdFR5cGVzZWNvbmRUeXBlYWxsb2NhdGVEaWFtb25kUGhpaGFuZGxlTG9jYWxGdW5jdGlvbmxvY2FsRnVuY3Rpb25UeXBlY2xvc3VyZVN0YXRlc3RhdGVBZnRlckJvZHltZXJnZUZsb3dzdGF0ZUJlZm9yZUNhdGNoc3RhdGVBZnRlckNhdGNoaGFuZGxlU3VwZXJOb1N1Y2hNZXRob2RObyBtZW1iZXIgZm91bmQgZm9yIHN1cGVyIHByb3BlcnR5IGdldDogTm8gbWVtYmVyIGZvdW5kIGZvciBzdXBlciBwcm9wZXJ0eSBzZXQ6IFVuZXhwZWN0ZWQgc3VwZXIgaW52b2NhdGlvbiB0YXJnZXQ6IFR5cGVJbmZvcm1hdGlvbkNvbnN0YW50VmlzaXRvclVuZXhwZWN0ZWQgdW5ldmFsdWF0ZWQgY29uc3RhbnQ6IFJlZmluZW1lbnRMb2NhbFN0YXRlX2ZpZWxkc190cnlCbG9ja2luaXRpYWxjaGlsZFBhdGhkZWVwQ29weU9mZmllbGRTY29wZWlzSW5kZWZpbml0ZXRoZW5CcmFuY2hlbHNlQnJhbmNoaW5QbGFjZXN0YXRlc2FsbEJyYW5jaGVzQWJvcnRMb2NhbFN0YXRlKCkgWyAgbG9jYWxzOgpdbG9jYWxzPSxmaWVsZHM9LHNlZW5SZXR1cm5PclRocm93LHNlZW5CcmVha09yQ29udGludWVjb21waWxlci5zcmMuaW5mZXJyZXIuY2xvc3VyZV90cmFjZXJDbG9zdXJlVHJhY2VyVmlzaXRvcnRyYWNlZEVsZW1lbnRzX2NhbGxzVG9BbmFseXplVHJhY2luZyBhYnN0cmFjdCBtZXRob2RzOiBfYW5hbHl6ZUNhbGxfdGFnQXNGdW5jdGlvbkFwcGx5VGFyZ2V0IG1pZ2h0IGJlIHBhc3NlZCB0byBhcHBseTogX3JlZ2lzdGVyQ2FsbEZvckxhdGVyQW5hbHlzaXNmdW5jdGlvbkVsZW1lbnRjdXJyZW50VXNlcmJhaWxvdXRQYXNzZWQgdG8gYSBjbG9zdXJlY2FsbGVkVXNlZCBpbiBKUyBfY2hlY2tJZkZ1bmN0aW9uQXBwbHlzdGF0aWMgY2FsbF9jaGVja0lmQ3VycmVudFVzZXJkeW5hbWljIGNhbGxhZGROZXdFc2NhcGVJbmZvcm1hdGlvblN0YXRpY1RlYXJPZmZDbG9zdXJlVHJhY2VyVmlzaXRvcnRyYWNlZEVsZW1lbnRjb21waWxlci5zcmMuaW5mZXJyZXIuZGVidWdWRVJCT1NFUFJJTlRfU1VNTUFSWUFOT01BTFlfV0FSTlBSSU5UX0dSQVBIUFJJTlRfR1JBUEhfQUxMX05PREVTbG9jYWxzX2hhbmRsZXJJdGVyYWJsZU1peGluX2xldmVsY29weU9mVW5leHBlY3RlZCBibG9jayAgZm9yIFZhcmlhYmxlU2NvcGUudHJ5QmxvY2tjb21tb25QYXJlbnRmb3JFYWNoTG9jYWxVbnRpbFNjb3BlX2ZvckVhY2hMb2NhbFVudGlsU2NvcGVzZWVuTG9jYWxzU2NvcGUgbm90IGZvdW5kOiAKb3JpZ2luPXNjb3BlPWZvckVhY2hMb2NhbFZhcmlhYmxlU2NvcGUoICBsZXZlbDogIGNvcHlPZjpWYXJpYWJsZVNjb3BlKCAgdHJ5QmxvY2s6ICAgdmFyaWFibGVzOiAgICAgICAgcGFyZW50OiAgICAgcmVzdH0gRmllbGRJbml0aWFsaXphdGlvblNjb3BlaW50ZXJuYWxGcm9tdGhlblNjb3BlZWxzZVNjb3Blb3RoZXJTY29wZXsgcG9zaXRpb25hbCA9ICwgbmFtZWQgPSAgfUFyZ3VtZW50c1R5cGVzLmhhc2hDb2RlQXJndW1lbnRzVHlwZXNJdGVyYXRvcl9pdGVyYXRlUG9zaXRpb25hbGl0ZXJhdGVlX2N1cnJlbnRJdGVyYXRvckxvY2Fsc0hhbmRsZXJObyBjb21tb24gcGFyZW50IGZvcgoxOjI6Tm9uLWVtcHR5IGNvbW1vbiBwYXJlbnQgZm9yCm15VHlwZW1lcmdlTG9jYWxlbHNlVHlwZURpZmYgY29tbW9uIHBhcmVudCBmb3IKCjI6Y29tbW9uOm1lcmdlZGFsbG9jYXRlTG9vcFBoaUxvY2Fsc0hhbmRsZXIoY29tcGlsZXIuc3JjLmluZmVycmVyLmxpc3RfdHJhY2VyTGlzdFRyYWNlclZpc2l0b3Jwb3NpdGlvbmFsTGVuZ3RoVXNlZCBpbiBhIG5vdC1vayBzZWxlY3Rvcm9rTGlzdFNlbGVjdG9yc1NldGNoZWNrTXV0YWJsZWNoZWNrR3Jvd2FibGVkb05vdENoYW5nZUxlbmd0aFNlbGVjdG9yc1NldGNvbXBpbGVyLnNyYy5pbmZlcnJlci5tYXBfdHJhY2VyTWFwVHJhY2VyVmlzaXRvckFkZGluZyBtYXAgd2l0aCB1bmtub3duIHR5cGVpbmZvIHRvIGN1cnJlbnQgbWFwTWFwIHVzZWQgaW4gYSBub3Qtb2sgc2VsZWN0b3IgW29rTWFwU2VsZWN0b3JzU2V0Y29tcGlsZXIuc3JjLmluZmVycmVyLnNldF90cmFjZXJTZXRUcmFjZXJWaXNpdG9yQWRkaW5nIGl0ZXJhYmxlIHdpdGggdW5rbm93biB0eXBlaW5mbyB0byBjdXJyZW50IHNldFNldCB1c2VkIGluIGEgbm90LW9rIHNlbGVjdG9yIFtva1NldFNlbGVjdG9yU2V0ZGFydDJqcy5pbmZlcnJlci50eXBlX2dyYXBoX2R1bXBUeXBlR3JhcGhEdW1wb3V0cHV0RGlydHlwZWdyYXBoYXNzaWdubWVudHNCZWZvcmVBbmFseXNpc2Fzc2lnbm1lbnRzQmVmb3JlVHJhY2luZ3VzZWRGaWxlbmFtZXNhbGxUeXBlc2ZpbGVuYW1lRnJvbUVsZW1lbnRhZGRNaXNzaW5nTm9kZXNnZXQtc2V0LS1jb25zdHJ1Y3RvcnNlcmlhbE51bWJlcl9HcmFwaEdlbmVyYXRvcm5vZGVJZGVzY2FwZVJlZ2V4cFsie308PnxdZGVmYXVsdE5vZGVDb2xvciNlZWZmZWVwaGlDb2xvciNlZWZmZmZuYXJyb3dDb2xvcmNhbGxDb2xvciNmZmZmZWV1bmNoYW5nZWRFZGdlYWRkZWRFZGdlZ3JlZW40cmVtb3ZlZEVkZ2VyZWQzdGVtcG9yYXJ5RWRnZW9yYW5nZWdldE5vZGVhcHBlbmRkaWdyYXBoIHtzaG9ydGVuZ2V0RnJlc2hJZGVzY2FwZUxhYmVsZHN0ZHN0VGV4dENvbmNyZXRlfDxyZXR1cm5UeXBlPiAgW3NoYXBlPXJlY29yZCxzdHlsZT1kb3R0ZWQsbGFiZWw9IiJdIFtjb2xvcj0iOnJldHVyblR5cGUgLT4gZ2V0U3R5bGVGb3JOb2Rlc3R5bGU9ZG90dGVkc3R5bGU9ZmlsbGVkLGZpbGxjb2xvcj0iYXBwZW5kRGV0YWlscwoocmV0dXJuIHZhbHVlKQooZnJvbSA8YT4ge3t9fCBbc2hhcGU9cmVjb3JkLGxhYmVsPSIiLG9yaWdpbmFsU2V0dHJhY2VyU2V0TmFycm93ClBoaSBFbGVtZW50SW5Db250YWluZXJFbGVtZW50SW5TZXRLZXlJbk1hcFZhbHVlSW5NYXBTdHJpbmdMaXRlcmFsCiJCb29sTGl0ZXJhbApoYW5kbGVDYWxsYXJnTmFtZUNsb3N1cmVDYWxsU2l0ZVN0YXRpY0NhbGxTaXRlRHluYW1pY0NhbGxTaXRlb2JqTWVtYmVyCkNsb3N1cmUKQXdhaXQKWWllbGQKVHlwZVN5c3RlbVN0cmF0ZWd5VHlwZVN5c3RlbV9vcmRlcmVkVHlwZUluZm9ybWF0aW9uc251bGxUeXBlQ2FjaGVpbnRUeXBlQ2FjaGV1aW50MzJUeXBlQ2FjaGV1aW50MzFUeXBlQ2FjaGVwb3NpdGl2ZUludFR5cGVDYWNoZWRvdWJsZVR5cGVDYWNoZW51bVR5cGVDYWNoZWJvb2xUeXBlQ2FjaGVmdW5jdGlvblR5cGVDYWNoZWxpc3RUeXBlQ2FjaGVjb25zdExpc3RUeXBlQ2FjaGVmaXhlZExpc3RUeXBlQ2FjaGVncm93YWJsZUxpc3RUeXBlQ2FjaGVzZXRUeXBlQ2FjaGVjb25zdFNldFR5cGVDYWNoZW1hcFR5cGVDYWNoZWNvbnN0TWFwVHlwZUNhY2hlc3RyaW5nVHlwZUNhY2hldHlwZVR5cGVDYWNoZWR5bmFtaWNUeXBlQ2FjaGVhc3luY0Z1dHVyZVR5cGVDYWNoZXN5bmNTdGFySXRlcmFibGVUeXBlQ2FjaGVhc3luY1N0YXJTdHJlYW1UeXBlQ2FjaGVBbHJlYWR5IGNvbnN0cnVjdGluZyBncmFwaCBmb3IgX2lzTm9uTnVsbE5hcnJvd1VuZXhwZWN0ZWQgYWJzdHJhY3QgbWVtYmVyIF9nZXRJbmZlcnJlZFR5cGVPZk1lbWJlcmlzRWxlbWVudEluZmVycmVkZWxlbWVudFR5cGVNYXNra2V5VHlwZU1hc2t2YWx1ZVR5cGVNYXNra2V5VHlwZUluZm92YWx1ZVR5cGVJbmZvZmlyc3RJbnB1dHNlY29uZElucHV0X2FkZFBoaWlzRHluYW1pY0luZ29yaW5nTnVsbG1heUJlTnVsbHNzYS50cmFjZXJfSFRyYWNlciZIR3JhcGhWaXNpdG9yJlRyYWNlclV0aWxhZGRQcmVkZWNlc3NvcnMgIkJhZGRTdWNjZXNzb3JzYWRkSW5zdHJ1Y3Rpb25zc3RyaW5naWZpZXJiY2ljaGFuZ2VzdGVtcG9yYXJ5SWRpbnN0cnVjdGlvblN0cmluZyA8fEAKZnJvbV9iY2l0b19iY2l4aGFuZGxlcnNwaGlJZGlucHV0SWRzIFsgSElSSEluc3RydWN0aW9uU3RyaW5naWZpZXJMYXRlVmFsdWU6IG9wY29kZUFiczogQWRkQml0QW5kQml0Tm90OiBCaXRPckJpdFhvcmxlbmd0aElkaW5kZXhJZEJvdW5kc0NoZWNrOiBsZW5ndGggPSAsIGluZGV4ID0gQnJlYWsgOiAoQkJyZWFrOiAoQkNvbnN0YW50OiBDb250aW51ZSBDb250aW51ZTogKEJoYW5kbGVHZW5lcmljSW52b2tlQ3JlYXRlQ3JlYXRlQm94RGl2aWRlRXhpdEZpZWxkR2V0OiBOdWxsQ2hlY2sgRmllbGRHZXQ6IHZhbHVlSWRGaWVsZFNldDogcmVjZWl2ZXJJZFJlYWRNb2RpZnlXcml0ZTogPSBHZXRMZW5ndGg6IGxvY2FsTmFtZUxvY2FsR2V0OiBMb2NhbFNldDogR290bzogKEJHcmVhdGVyR3JlYXRlckVxdWFsSWRlbnRpdHljb25kaXRpb25JZElmICgpOiAoQikgZWxzZSAoQmludm9rZVR5cGVmdW5jdGlvbk5hbWVhcmd1bWVudHNTdHJpbmdJbmRleDogSW5kZXhBc3NpZ246IF0gPSBJbnRlcmNlcHRvciAoSW50ZXJjZXB0b3I6IGhhbmRsZUludm9rZUR5bmFtaWNJbnZva2VDbG9zdXJlSW52b2tlRHluYW1pY01ldGhvZEludm9rZUR5bmFtaWNHZXR0ZXJJbnZva2VEeW5hbWljU2V0dGVySW52b2tlU3RhdGljSW52b2tlU3VwZXJJbnZva2VDb25zdHJ1Y3RvckJvZHlJbnZva2VHZW5lcmF0b3JCb2R5Rm9yZWlnbkNvZGU6IExlc3NMZXNzRXF1YWxlbGVtZW50c1N0cmluZ0xpdGVyYWxMaXN0OiBbYm9keUJsb2NrTG9vcEJyYW5jaCAoKSB0aGVuIChCTXVsdGlwbHlOZWdhdGU6IE5vdDogUGFyYW1ldGVyVmFsdWU6IExvY2FsVmFsdWU6IFBoaTogUmVmOiBSZXR1cm46IFNoaWZ0TGVmdFNoaWZ0UmlnaHRTdGF0aWM6IExhenlTdGF0aWM6IFN0YXRpY1N0b3JlOiBsZWZ0SWRyaWdodElkU3RyaW5nQ29uY2F0OiAgKyBTdHJpbmdpZnk6IFN1YnRyYWN0U3dpdGNoOiAoOiBCZGVmYXVsdDogQlRocm93OiBUaHJvd0V4cHJlc3Npb246IFRydW5jYXRpbmdEaXZpZGVSZW1haW5kZXJFeGl0VHJ5VHJ5OiAsIENhdGNoOiAsIEZpbmFsbHk6IEpvaW46IEJJczogSXNWaWFJbnRlcmNlcHRvcjogX3R5cGVDb252ZXJzaW9uS2luZFR5cGVDb252ZXJzaW9uOiBfcHJpbWl0aXZlQ2hlY2tLaW5kUHJpbWl0aXZlQ2hlY2s6IFJFQ0VJVkVSQVJHVU1FTlRCb29sQ29udmVyc2lvbjogVHlwZUtub3duOiAgd2l0bmVzc2VkIGJ5IFJhbmdlQ29udmVyc2lvbjogVHlwZUluZm9SZWFkUmF3OiBUeXBlSW5mb1JlYWRWYXJpYWJsZTogVHlwZUluZm9FeHByZXNzaW9uOiBBd2FpdDogSXNUZXN0OiBBc0NoZWNrOiBBc0NoZWNrU2ltcGxlOiBTdWJ0eXBlQ2hlY2s6IExvYWRUeXBlOiBJbnN0YW5jZUVudmlyb25tZW50OiBUeXBlRXZhbDogVHlwZUJpbmQ6IGRhcnQyanMuX3JlY2lwZV9zeW50YXhSZWNpcGVzZXBhcmF0b3JTdHJpbmd0b1R5cGV0b1R5cGVTdHJpbmdwdXNoRHluYW1pY3B1c2hEeW5hbWljU3RyaW5ncHVzaFZvaWRwdXNoVm9pZFN0cmluZ3dyYXBTdGFyd3JhcFN0YXJTdHJpbmd3cmFwUXVlc3Rpb253cmFwUXVlc3Rpb25TdHJpbmd3cmFwRnV0dXJlT3J3cmFwRnV0dXJlT3JTdHJpbmdzdGFydFR5cGVBcmd1bWVudHNzdGFydFR5cGVBcmd1bWVudHNTdHJpbmdlbmRUeXBlQXJndW1lbnRzU3RyaW5nc3RhcnRGdW5jdGlvbkFyZ3VtZW50c3N0YXJ0RnVuY3Rpb25Bcmd1bWVudHNTdHJpbmdlbmRGdW5jdGlvbkFyZ3VtZW50c2VuZEZ1bmN0aW9uQXJndW1lbnRzU3RyaW5nc3RhcnRPcHRpb25hbEdyb3Vwc3RhcnRPcHRpb25hbEdyb3VwU3RyaW5nZW5kT3B0aW9uYWxHcm91cGVuZE9wdGlvbmFsR3JvdXBTdHJpbmdzdGFydE5hbWVkR3JvdXBzdGFydE5hbWVkR3JvdXBTdHJpbmdlbmROYW1lZEdyb3VwZW5kTmFtZWRHcm91cFN0cmluZ25hbWVTZXBhcmF0b3JuYW1lU2VwYXJhdG9yU3RyaW5nZ2VuZXJpY0Z1bmN0aW9uVHlwZVBhcmFtZXRlckluZGV4Z2VuZXJpY0Z1bmN0aW9uVHlwZVBhcmFtZXRlckluZGV4U3RyaW5nZXh0ZW5zaW9uT3BleHRlbnNpb25PcFN0cmluZ3B1c2hOZXZlckV4dGVuc2lvbnB1c2hOZXZlckV4dGVuc2lvblN0cmluZ3B1c2hBbnlFeHRlbnNpb25wdXNoQW55RXh0ZW5zaW9uU3RyaW5nX2Zvcm1mZWVkX2Zvcm1mZWVkU3RyaW5nX3NwYWNlX3NwYWNlU3RyaW5nX2V4Y2xhbWF0aW9uX2V4Y2xhbWF0aW9uU3RyaW5nX2hhc2hfZG9sbGFyX2RvbGxhclN0cmluZ19wZXJjZW50X3BlcmNlbnRTdHJpbmdfYW1wZXJzYW5kX2FtcGVyc2FuZFN0cmluZ19hcG9zdHJvcGhlX2Fwb3N0cm9waGVTdHJpbmdfbGVmdFBhcmVuX2xlZnRQYXJlblN0cmluZ19yaWdodFBhcmVuX3JpZ2h0UGFyZW5TdHJpbmdfYXN0ZXJpc2tfYXN0ZXJpc2tTdHJpbmdfcGx1c19wbHVzU3RyaW5nX2NvbW1hU3RyaW5nX21pbnVzX21pbnVzU3RyaW5nX3BlcmlvZF9wZXJpb2RTdHJpbmdfc2xhc2hfc2xhc2hTdHJpbmdfZGlnaXQwX2RpZ2l0OV9jb2xvblN0cmluZ19zZW1pY29sb25fc2VtaWNvbG9uU3RyaW5nX2xlc3NUaGFuX2xlc3NUaGFuU3RyaW5nX2VxdWFsc1N0cmluZ19ncmVhdGVyVGhhbl9ncmVhdGVyVGhhblN0cmluZ19xdWVzdGlvbl9xdWVzdGlvblN0cmluZ19hdF9hdFN0cmluZ191cHBlcmNhc2VBX3VwcGVyY2FzZVpfbGVmdEJyYWNrZXRTdHJpbmdfYmFja3NsYXNoX2JhY2tzbGFzaFN0cmluZ19yaWdodEJyYWNrZXRTdHJpbmdfY2lyY3VtZmxleF9jaXJjdW1mbGV4U3RyaW5nX3VuZGVyc2NvcmVfdW5kZXJzY29yZVN0cmluZ19iYWNrdGlja19iYWNrdGlja1N0cmluZ19sb3dlcmNhc2VBX2xvd2VyY2FzZVpfbGVmdEJyYWNlU3RyaW5nX3ZlcnRpY2FsX3ZlcnRpY2FsU3RyaW5nX3JpZ2h0QnJhY2VTdHJpbmdfdGlsZGVfdGlsZGVTdHJpbmdkaWdpdFZhbHVlaXNJZGVudGlmaWVyU3RhcnR0ZXN0RXF1aXZhbGVuY2U6IFN0cmluZy5mcm9tQ2hhckNvZGUoKSAhPSB0ZXN0RXh0ZW5zaW9uLnRvU3RyaW5nKCkgIT0gZGFydDJqcy5qc19lbWl0dGVyLmNsYXNzX3N0dWJfZ2VuZXJhdG9yZ2VuZXJhdGVDbGFzc0NvbnN0cnVjdG9ydHlwZUluaXRzdGhpcy4jID0gI2ZpZWxkSW5pdGlhbGl6ZXJzZnVuY3Rpb24oIywgIykgeyAjOyAjOyB0aGlzLiMoKTt9Z2VuZXJhdGVHZXR0ZXJmdW5jdGlvbigjKSB7IHJldHVybiAjLiMgfWdlbmVyYXRlU2V0dGVyZnVuY3Rpb24oIywgdikgeyByZXR1cm4gIy4jID0gdjsgfWJ1aWxkR2V0dGVyJHJlY2VpdmVydGhpcy4jKCMpIy4jKClnZW5lcmF0ZWRTdHVic2dlbmVyYXRlZFNlbGVjdG9yc2Nsb3N1cmVDYWxsTmFtZWZ1bmN0aW9uKCMpIHsgcmV0dXJuICMuIygjKTsgfWpzTmFtZXNhZGROb1N1Y2hNZXRob2RIYW5kbGVyc21hc2tTZXRwYXJhbWV0ZXJOYW1lc2FyZ05hbWVzdGhpcy4jbm9TdWNoTWV0aG9kTmFtZSgjcmVjZWl2ZXIsCiAgICAgICAgICAgICAgICAgICAgI2NyZWF0ZUludm9jYXRpb25NaXJyb3IoI21ldGhvZE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ludGVybmFsTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYXJndW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNuYW1lZEFyZ3VtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdHlwZUFyZ3VtZW50Q291bnQpKWZ1bmN0aW9uKCRyZWNlaXZlciwgIykgeyByZXR1cm4gIyB9YnVpbGRUZWFyT2ZmQ29kZXRlYXJPZmZBY2Nlc3NFeHByZXNzaW9udGVhck9mZkdsb2JhbE9iamVjdFN0cmluZ3RlYXJPZmZHbG9iYWxPYmplY3RmdW5jdGlvbigpIHsgdGhyb3cgIkhlbHBlciAnY2xvc3VyZUZyb21UZWFyT2ZmJyBtaXNzaW5nLiIgfU1pc3NpbmdIZWxwZXJGdW5jdGlvbihmdW5jdGlvbigpIHsgdGhyb3cgIkhlbHBlciAnY2xvc3VyZUZyb21UZWFyT2ZmJyBtaXNzaW5nLiIgfSkoKXRlYXJPZmZHZXR0ZXJ0ZWFyT2ZmQWNjZXNzVGV4dGZ1bmN0aW9uIHRlYXJPZmZHZXR0ZXIoZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LCByZWZsZWN0aW9uSW5mbywgbmFtZSwgaXNJbnRlcmNlcHRlZCkgewogIHJldHVybiBpc0ludGVyY2VwdGVkCiAgICAgID8gbmV3IEZ1bmN0aW9uKCJmdW5jcyIsICJhcHBseVRyYW1wb2xpbmVJbmRleCIsICJyZWZsZWN0aW9uSW5mbyIsICJuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgI3RlYXJPZmZHbG9iYWxPYmplY3RTdHJpbmcsICJjIiwKICAgICAgICAgICJyZXR1cm4gZnVuY3Rpb24gdGVhck9mZl8iICsgbmFtZSArIChmdW5jdGlvbkNvdW50ZXIrKykgKyAiKHJlY2VpdmVyKSB7IiArCiAgICAgICAgICAgICJpZiAoYyA9PT0gbnVsbCkgYyA9ICIgKyAjdGVhck9mZkFjY2Vzc1RleHQgKyAiKCIgKwogICAgICAgICAgICAgICAgInRoaXMsIGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIGZhbHNlLCB0cnVlLCBuYW1lKTsiICsKICAgICAgICAgICAgICAgICJyZXR1cm4gbmV3IGModGhpcywgZnVuY3NbMF0sIHJlY2VpdmVyLCBuYW1lKTsiICsKICAgICAgICAgICAifSIpKGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIG5hbWUsICN0ZWFyT2ZmR2xvYmFsT2JqZWN0LCBudWxsKQogICAgICA6IG5ldyBGdW5jdGlvbigiZnVuY3MiLCAiYXBwbHlUcmFtcG9saW5lSW5kZXgiLCAicmVmbGVjdGlvbkluZm8iLCAibmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICN0ZWFyT2ZmR2xvYmFsT2JqZWN0U3RyaW5nLCAiYyIsCiAgICAgICAgICAicmV0dXJuIGZ1bmN0aW9uIHRlYXJPZmZfIiArIG5hbWUgKyAoZnVuY3Rpb25Db3VudGVyKyspKyAiKCkgeyIgKwogICAgICAgICAgICAiaWYgKGMgPT09IG51bGwpIGMgPSAiICsgI3RlYXJPZmZBY2Nlc3NUZXh0ICsgIigiICsKICAgICAgICAgICAgICAgICJ0aGlzLCBmdW5jcywgYXBwbHlUcmFtcG9saW5lSW5kZXgsIHJlZmxlY3Rpb25JbmZvLCBmYWxzZSwgZmFsc2UsIG5hbWUpOyIgKwogICAgICAgICAgICAgICAgInJldHVybiBuZXcgYyh0aGlzLCBmdW5jc1swXSwgbnVsbCwgbmFtZSk7IiArCiAgICAgICAgICAgICAifSIpKGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIG5hbWUsICN0ZWFyT2ZmR2xvYmFsT2JqZWN0LCBudWxsKTsKfSAgICAgIGZ1bmN0aW9uIHRlYXJPZmZHZXR0ZXIoZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LCByZWZsZWN0aW9uSW5mbywgbmFtZSwgaXNJbnRlcmNlcHRlZCkgewogICAgICAgIHZhciBjYWNoZSA9IG51bGw7CiAgICAgICAgcmV0dXJuIGlzSW50ZXJjZXB0ZWQKICAgICAgICAgICAgPyBmdW5jdGlvbihyZWNlaXZlcikgewogICAgICAgICAgICAgICAgaWYgKGNhY2hlID09PSBudWxsKSBjYWNoZSA9ICMoCiAgICAgICAgICAgICAgICAgICAgdGhpcywgZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LCByZWZsZWN0aW9uSW5mbywgZmFsc2UsIHRydWUsIG5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBjYWNoZSh0aGlzLCBmdW5jc1swXSwgcmVjZWl2ZXIsIG5hbWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZSA9PT0gbnVsbCkgY2FjaGUgPSAjKAogICAgICAgICAgICAgICAgICAgIHRoaXMsIGZ1bmNzLCBhcHBseVRyYW1wb2xpbmVJbmRleCwgcmVmbGVjdGlvbkluZm8sIGZhbHNlLCBmYWxzZSwgbmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGNhY2hlKHRoaXMsIGZ1bmNzWzBdLCBudWxsLCBuYW1lKTsKICAgICAgICAgICAgICB9OwogICAgICB9ICAgICAgZnVuY3Rpb24gdGVhck9mZihmdW5jcywgYXBwbHlUcmFtcG9saW5lSW5kZXgsCiAgICAgICAgICByZWZsZWN0aW9uSW5mbywgaXNTdGF0aWMsIG5hbWUsIGlzSW50ZXJjZXB0ZWQpIHsKICAgICAgdmFyIGNhY2hlID0gbnVsbDsKICAgICAgcmV0dXJuIGlzU3RhdGljCiAgICAgICAgICA/IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGlmIChjYWNoZSA9PT0gbnVsbCkgY2FjaGUgPSAjdGVhck9mZigKICAgICAgICAgICAgICAgICAgdGhpcywgZnVuY3MsIGFwcGx5VHJhbXBvbGluZUluZGV4LAogICAgICAgICAgICAgICAgICByZWZsZWN0aW9uSW5mbywgdHJ1ZSwgZmFsc2UsIG5hbWUpLnByb3RvdHlwZTsKICAgICAgICAgICAgICByZXR1cm4gY2FjaGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIDogdGVhck9mZkdldHRlcihmdW5jcywgYXBwbHlUcmFtcG9saW5lSW5kZXgsCiAgICAgICAgICAgICAgcmVmbGVjdGlvbkluZm8sIG5hbWUsIGlzSW50ZXJjZXB0ZWQpOwogICAgfWRhcnQyanMuanNfZW1pdHRlci5pbnN0YW50aWF0aW9uX3N0dWJfZ2VuZXJhdG9yX2dlbmVyYXRlU3R1YmZ1bmN0aW9uRmllbGR0YXJnZXRTZWxlY3RvcnRoaXMuI1sjXWZ1bmN0aW9uKCMpIHsgcmV0dXJuIHRoaXMuIy4jKCMpOyB9X2dlbmVyYXRlU2lnbmF0dXJlU3R1YmZ1bmN0aW9uKCkgeyByZXR1cm4gIygjKHRoaXMuIyksIHRoaXMuIyk7IH1fZ2VuZXJpY0Nsb3N1cmVDYW4ndCBmaW5kIENsb3N1cmUgZmllbGQgb2YgY2FsbFNlbGVjdG9yc2NvbXB1dGVMaXZlUGFyYW1ldGVyU3RydWN0dXJlc3BhcmFtZXRlclN0cnVjdHVyZXNzdHVic2dlbmVyaWNDYWxsU3RydWN0dXJlZ2VuZXJpY1NlbGVjdG9yZGFydDJqcy5qc19lbWl0dGVyLmludGVyY2VwdG9yX3N0dWJfZ2VuZXJhdG9yZW1iZWRkZWROYW1lc2ludGVyY2VwdG9yRm9yYnVpbGRJbnRlcmNlcHRvckNoZWNrKHR5cGVvZiByZWNlaXZlcikgPT0gImJvb2xlYW4iaW50ZXJuYWwgZXJyb3JyZWNlaXZlci5jb25zdHJ1Y3RvciA9PSBBcnJheSh0eXBlb2YgcmVjZWl2ZXIpID09ICJzdHJpbmcicmVjZWl2ZXIgPT0gbnVsbGlmICgjKSByZXR1cm4gI2hhc0FycmF5aGFzQm9vbGhhc0RvdWJsZWhhc0ludGhhc051bGxoYXNOdW1iZXJoYXNTdHJpbmdoYXNOYXRpdmVhbnlOYXRpdmVDbGFzc2Vzd2hlbk51bWJlcmludGVyY2VwdG9yRm9yTnVtYmVyewogICAgICAgICAgICBpZiAoTWF0aC5mbG9vcihyZWNlaXZlcikgPT0gcmVjZWl2ZXIpIHJldHVybiAjOwogICAgICAgICAgICByZXR1cm4gIzsKICAgICAgICB9cmV0dXJuICNpZiAodHlwZW9mIHJlY2VpdmVyID09ICJudW1iZXIiKSAjO2lmIChyZWNlaXZlciA9PSBudWxsKSByZXR1cm4gcmVjZWl2ZXJ7CiAgICAgICAgICBpZiAodHlwZW9mIHJlY2VpdmVyICE9ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWNlaXZlciA9PSAiZnVuY3Rpb24iICkgcmV0dXJuICM7CiAgICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVyOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgIykgcmV0dXJuIHJlY2VpdmVyOwogICAgICAgICAgcmV0dXJuICMocmVjZWl2ZXIpOwogICAgICB9anNVbmtub3duaWYgKCEocmVjZWl2ZXIgaW5zdGFuY2VvZiAjKSkgcmV0dXJuICM7cmV0dXJuIHJlY2VpdmVyZnVuY3Rpb24ocmVjZWl2ZXIpIHsgIzsgfV9nZW5lcmF0ZUlzSnNJbmRleGFibGVDYWxsdXNlMXVzZTJkaXNwYXRjaFByb3BlcnR5aGVscGVyRXhwcmVzc2lvbl9mYXN0UGF0aEZvck9uZVNob3RJbnRlcmNlcHRvcnsKICAgICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSByZXR1cm4gYTAgPT0gbnVsbDsKICAgICAgICAgIGlmICh0eXBlb2YgcmVjZWl2ZXIgIT0gIm9iamVjdCIpCiAgICAgICAgICAgIHJldHVybiBhMCAhPSBudWxsICYmIHJlY2VpdmVyID09PSBhMDsKICAgICAgICB9cmVjZWl2ZXIgIGEwIyA+Pj4gMGlmICh0eXBlb2YgcmVjZWl2ZXIgPT0gIm51bWJlciIgJiYgdHlwZW9mIGEwID09ICJudW1iZXIiKSAgcmV0dXJuICM7aWYgKHR5cGVvZiByZWNlaXZlciA9PSAibnVtYmVyIikgcmV0dXJuIC1yZWNlaXZlciAgICAgICAgICBpZiAodHlwZW9mIHJlY2VpdmVyID09ICJudW1iZXIiICYmIE1hdGguZmxvb3IocmVjZWl2ZXIpID09IHJlY2VpdmVyKQogICAgICAgICAgICByZXR1cm4gKH5yZWNlaXZlcikgPj4+IDA7CiAgICAgICAgICBjb250YWluc0FycmF5Y29udGFpbnNTdHJpbmdjb250YWluc0pzSW5kZXhhYmxlYXJyYXlDaGVja2dlbmVyaWNJbmRleGFibGVDaGVja29yRXhwdHlwZW9mIHJlY2VpdmVyID09ICJzdHJpbmciICAgICAgICAgIGlmICh0eXBlb2YgYTAgPT09ICJudW1iZXIiKQogICAgICAgICAgICBpZiAoIykKICAgICAgICAgICAgICBpZiAoKGEwID4+PiAwKSA9PT0gYTAgJiYgYTAgPCByZWNlaXZlci5sZW5ndGgpCiAgICAgICAgICAgICAgICByZXR1cm4gcmVjZWl2ZXJbYTBdOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYTAgPT09ICJudW1iZXIiKQogICAgICAgICAgICBpZiAoIyAmJiAhcmVjZWl2ZXIuaW1tdXRhYmxlJGxpc3QgJiYKICAgICAgICAgICAgICAgIChhMCA+Pj4gMCkgPT09IGEwICYmIGEwIDwgcmVjZWl2ZXIubGVuZ3RoKQogICAgICAgICAgICAgIHJldHVybiByZWNlaXZlclthMF0gPSBhMTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlY2VpdmVyID09PSAibnVtYmVyIikgcmV0dXJuIE1hdGguYWJzKHJlY2VpdmVyKTsKICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWNlaXZlciA9PT0gIm51bWJlciIpCiAgICAgICAgICAgICByZXR1cm4gcmVjZWl2ZXIgPiAwID8gMSA6IHJlY2VpdmVyIDwgMCA/IC0xIDogcmVjZWl2ZXI7CiAgICAgICAgZ2V0SW50ZXJjZXB0b3JOYW1lZ2xvYmFsT2JqZWN0b3B0aW1pemVkUGF0aGZ1bmN0aW9uKCMpIHsgIzsgcmV0dXJuICMuIyhyZWNlaXZlcikuIygjKSB9ZGFydDJqcy5qc19lbWl0dGVyLm1haW5fY2FsbF9zdHViX2dlbmVyYXRvcmdlbmVyYXRlSW52b2tlTWFpbm1haW5DYWxsQ2xvc3VyZWN1cnJlbnRTY3JpcHRBY2Nlc3MgICAgICAoZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBXaGVuIHJ1bm5pbmcgYXMgYSBjb250ZW50LXNjcmlwdCBvZiBhIGNocm9tZS1leHRlbnNpb24gdGhlCiAgICAgICAgLy8gJ2N1cnJlbnRTY3JpcHQnIGlzIGBudWxsYCAoYnV0IG5vdCB1bmRlZmluZWQpLgogICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQuY3VycmVudFNjcmlwdCAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgY2FsbGJhY2soZG9jdW1lbnQuY3VycmVudFNjcmlwdCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0cyA9IGRvY3VtZW50LnNjcmlwdHM7CiAgICAgICAgZnVuY3Rpb24gb25Mb2FkKGV2ZW50KSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgc2NyaXB0c1tpXS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIiwgb25Mb2FkLCBmYWxzZSk7CiAgICAgICAgICB9CiAgICAgICAgICBjYWxsYmFjayhldmVudC50YXJnZXQpOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIHNjcmlwdHNbaV0uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIG9uTG9hZCwgZmFsc2UpOwogICAgICAgIH0KICAgICAgfSkoZnVuY3Rpb24oY3VycmVudFNjcmlwdCkgewogICAgICAgICNjdXJyZW50U2NyaXB0ID0gY3VycmVudFNjcmlwdDsKCiAgICAgICAgaWYgKHR5cGVvZiBkYXJ0TWFpblJ1bm5lciA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgZGFydE1haW5SdW5uZXIoI21haW5DYWxsQ2xvc3VyZSwgW10pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAjbWFpbkNhbGxDbG9zdXJlKFtdKTsKICAgICAgICB9CiAgICAgIH0pZGFydDJqcy5qc19lbWl0dGVyLm5hdGl2ZV9nZW5lcmF0b3JOYXRpdmVHZW5lcmF0b3JuZWVkc0lzb2xhdGVBZmZpbml0eVRhZ0luaXRpYWxpemF0aW9uZ2VuZXJhdGVJc29sYXRlQWZmaW5pdHlUYWdJbml0aWFsaXphdGlvbmludGVyblN0cmluZ0Z1bmN0aW9uZ2V0SXNvbGF0ZVRhZ0FjY2Vzc2lzb2xhdGVUYWdBY2Nlc3NkaXNwYXRjaFByb3BlcnR5TmFtZUFjY2VzcyAgICAgICFmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaW50ZXJuID0gI2ludGVyblN0cmluZ0Z1bmN0aW9uOwoKICAgICAgICAjZ2V0SXNvbGF0ZVRhZyA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgIHJldHVybiBpbnRlcm4oIl9fX2RhcnRfIiArIG5hbWUgKyAjaXNvbGF0ZVRhZyk7CiAgICAgICAgfTsKCiAgICAgICAgLy8gVG8gZW5zdXJlIHRoYXQgZGlmZmVyZW50IHByb2dyYW1zIGxvYWRlZCBpbnRvIHRoZSBzYW1lIGNvbnRleHQgKHBhZ2UpCiAgICAgICAgLy8gdXNlIGRpc3RpbmN0IGRpc3BhdGNoIHByb3Blcmllcywgd2UgcGxhY2UgYW4gb2JqZWN0IG9uIGBPYmplY3RgIHRvCiAgICAgICAgLy8gY29udGFpbiB0aGUgbmFtZXMgYWxyZWFkeSBpbiB1c2UuCiAgICAgICAgdmFyIHRhYmxlUHJvcGVydHkgPSAiX19fZGFydF9pc29sYXRlX3RhZ3NfIjsKICAgICAgICB2YXIgdXNlZFByb3BlcnRpZXMgPSBPYmplY3RbdGFibGVQcm9wZXJ0eV0gfHwKICAgICAgICAgICAgKE9iamVjdFt0YWJsZVByb3BlcnR5XSA9IE9iamVjdC5jcmVhdGUobnVsbCkpOwoKICAgICAgICB2YXIgcm9vdFByb3BlcnR5ID0gIl8iOwogICAgICAgIGZvciAodmFyIGkgPSAwOyA7IGkrKykgewogICAgICAgICAgdmFyIHByb3BlcnR5ID0gaW50ZXJuKHJvb3RQcm9wZXJ0eSArICJfIiArIGkgKyAiXyIpOwogICAgICAgICAgaWYgKCEocHJvcGVydHkgaW4gdXNlZFByb3BlcnRpZXMpKSB7CiAgICAgICAgICAgIHVzZWRQcm9wZXJ0aWVzW3Byb3BlcnR5XSA9IDE7CiAgICAgICAgICAgICNpc29sYXRlVGFnID0gcHJvcGVydHk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoI2luaXRpYWxpemVEaXNwYXRjaFByb3BlcnR5KSB7CiAgICAgICAgICAjZGlzcGF0Y2hQcm9wZXJ0eU5hbWUgPSAjZ2V0SXNvbGF0ZVRhZygiZGlzcGF0Y2hfcmVjb3JkIik7CiAgICAgICAgfQogICAgICB9KCk7CiAgICBpbml0aWFsaXplRGlzcGF0Y2hQcm9wZXJ0eWdlbmVyYXRlSXNvbGF0ZVRhZ1Jvb3RaeFl4WGVuY29kZU5hdGl2ZUluZm9ub25MZWFmVGFnc2Zvcm1hdFRhZ3NsZWFmU3Rybm9uTGVhZlN0cmJ1aWxkTmF0aXZlSW5mb0hhbmRsZXJpbmZvQWNjZXNzc3ViY2xhc3NSZWFkR2VuZXJhdG9yaW50ZXJjZXB0b3JzQnlUYWdBY2Nlc3NsZWFmVGFnc0FjY2Vzc3N1YmNsYXNzUmVhZHN1YmNsYXNzZXNbaV0gICAgICAgICAgLy8gVGhlIG5hdGl2ZSBpbmZvIGxvb2tzIGxpa2UgdGhpczoKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBIdG1sRWxlbWVudDogewogICAgICAgICAgLy8gICAgICIlIjogIkhUTUxEaXZFbGVtZW50fEhUTUxBbmNob3JFbGVtZW50O0hUTUxFbGVtZW50O0ZhbmN5QnV0dG9uIgogICAgICAgICAgLy8KICAgICAgICAgIC8vIFRoZSBmaXJzdCB0d28gc2VtaWNvbG9uLXNlcGFyYXRlZCBwYXJ0cyBjb250YWluIGRpc3BhdGNoIHRhZ3MsIHRoZQogICAgICAgICAgLy8gdGhpcmQgY29udGFpbnMgdGhlIEphdmFTY3JpcHQgbmFtZXMgZm9yIGNsYXNzZXMuCiAgICAgICAgICAvLwogICAgICAgICAgLy8gVGhlIHRhZ3MgaW5kaWNhdGUgdGhhdCBKYXZhU2NyaXB0IG9iamVjdHMgd2l0aCB0aGUgZGlzcGF0Y2ggdGFncwogICAgICAgICAgLy8gKHVzdWFsbHkgY29uc3RydWN0b3IgbmFtZXMpIEhUTUxEaXZFbGVtZW50LCBIVE1MQW5jaG9yRWxlbWVudCBhbmQKICAgICAgICAgIC8vIEhUTUxFbGVtZW50IGFsbCBtYXAgdG8gdGhlIERhcnQgbmF0aXZlIGNsYXNzIG5hbWVkIEh0bWxFbGVtZW50LgogICAgICAgICAgLy8gVGhlIGZpcnN0IHNldCBpcyBmb3IgZWZmZWN0aXZlIGxlYWYgbm9kZXMgaW4gdGhlIGhpZXJhcmNoeSwgdGhlCiAgICAgICAgICAvLyBzZWNvbmQgc2V0IGlzIG5vbi1sZWFmIG5vZGVzLgogICAgICAgICAgLy8KICAgICAgICAgIC8vIFRoZSB0aGlyZCBwYXJ0IGNvbnRhaW5zIHRoZSBKYXZhU2NyaXB0IG5hbWVzIG9mIERhcnQgY2xhc3NlcyB0aGF0CiAgICAgICAgICAvLyBleHRlbmQgdGhlIG5hdGl2ZSBjbGFzcy4gSGVyZSwgRmFuY3lCdXR0b24gZXh0ZW5kcyBIdG1sRWxlbWVudCwgc28KICAgICAgICAgIC8vIHRoZSBydW50aW1lIG5lZWRzIHRvIGtub3cgdGhhdCB3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlIGlzIHRoZQogICAgICAgICAgLy8gcHJvdG90eXBlIHRoYXQgbmVlZHMgdG8gYmUgZXh0ZW5kZWQgaW4gY3JlYXRpbmcgdGhlIGN1c3RvbSBlbGVtZW50LgogICAgICAgICAgLy8KICAgICAgICAgIC8vIFRoZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGJ1aWxkIHRhYmxlcyByZWZlcmVuY2VkIGJ5CiAgICAgICAgICAvLyBnZXROYXRpdmVJbnRlcmNlcHRvciBhbmQgY3VzdG9tIGVsZW1lbnQgc3VwcG9ydC4KICAgICAgICAgIHsKICAgICAgICAgICAgdmFyIG5hdGl2ZVNwZWMgPSAjaW5mby5zcGxpdCgiOyIpOwogICAgICAgICAgICBpZiAobmF0aXZlU3BlY1swXSkgewogICAgICAgICAgICAgIHZhciB0YWdzID0gbmF0aXZlU3BlY1swXS5zcGxpdCgifCIpOwogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgI2ludGVyY2VwdG9yc0J5VGFnQWNjZXNzW3RhZ3NbaV1dID0gI2NvbnN0cnVjdG9yOwogICAgICAgICAgICAgICAgI2xlYWZUYWdzQWNjZXNzW3RhZ3NbaV1dID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5hdGl2ZVNwZWNbMV0pIHsKICAgICAgICAgICAgICB0YWdzID0gbmF0aXZlU3BlY1sxXS5zcGxpdCgifCIpOwogICAgICAgICAgICAgIGlmICgjYWxsb3dOYXRpdmVzU3ViY2xhc3NpbmcpIHsKICAgICAgICAgICAgICAgIGlmIChuYXRpdmVTcGVjWzJdKSB7CiAgICAgICAgICAgICAgICAgIHZhciBzdWJjbGFzc2VzID0gbmF0aXZlU3BlY1syXS5zcGxpdCgifCIpOwogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YmNsYXNzZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ViY2xhc3MgPSAjc3ViY2xhc3NSZWFkOwogICAgICAgICAgICAgICAgICAgIHN1YmNsYXNzLiNuYXRpdmVTdXBlcmNsYXNzVGFnTmFtZSA9IHRhZ3NbMF07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICNpbnRlcmNlcHRvcnNCeVRhZ0FjY2Vzc1t0YWdzW2ldXSA9ICNjb25zdHJ1Y3RvcjsKICAgICAgICAgICAgICAgICAgI2xlYWZUYWdzQWNjZXNzW3RhZ3NbaV1dID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICBuYXRpdmVTdXBlcmNsYXNzVGFnTmFtZWFsbG93TmF0aXZlc1N1YmNsYXNzaW5nZGFydDJqcy5qc19lbWl0dGVyLnBhcmFtZXRlcl9zdHViX2dlbmVyYXRvcmVtcHR5U2VsZWN0b3JTZXRuZWVkc1N1cGVyR2V0dGVyZ2VuZXJhdGVQYXJhbWV0ZXJTdHViZXh0cmFBcmd1bWVudENvdW50cmVjZWl2ZXJBcmd1bWVudE5hbWV0YXJnZXRBcmd1bWVudHNvcHRpb25hbFBhcmFtZXRlclN0YXJ0dHlwZVJ0aXJldHVybiAjLiMuY2FsbCh0aGlzLCAjKTtyZXR1cm4gdGhpcy4jKCMpO3JldHVybiAjKCMpZnVuY3Rpb24oIykgeyAjOyB9bGl2ZVNlbGVjdG9yc21lbWJlclR5cGVQYXJhbWV0ZXJzcmVuYW1lZENhbGxTZWxlY3RvcnNzdHViU2VsZWN0b3JzbmFtZWRTZWxlY3RvcmNsb3N1cmVTZWxlY3RvcnJlbmFtZWRTZWxlY3RvcnJlbmFtZWRTZWxlY3RvcldpdGhUeXBlQXJndW1lbnRzZGFydDJqcy5qc19lbWl0dGVyLnJ1bnRpbWVfdHlwZV9nZW5lcmF0b3Jqc0ludGVyb3BBbmFseXNpc0Z1bmN0aW9uVHlwZVNpZ25hdHVyZUVtaXR0ZXJjbGFzc0Z1bmN0aW9uVHlwZVR5cGVUZXN0VHlwZVRlc3RzaXNUZXN0X3Byb3BlcnRpZXNhZGRJc1Rlc3RhZGRTdWJzdGl0dXRpb25hZGRTaWduYXR1cmVoYW5kbGVUeXBlVGVzdHR5cGVUZXN0X291dHB1dFVuaXRWaXNpdG9yZ2VuZXJhdGVGdW5jdGlvblR5cGVTaWduYXR1cmVpc1R5cGVDb250YWluZWRJbmdlbmVyYXRlVHlwZUNoZWNrX2dldFN1YnN0aXR1dGlvbkNvZGVfZ2VuZXJhdGVJc1Rlc3RzT25mdW5jdGlvbigpIHsgcmV0dXJuICMgfV9nZXRWYXJpYWJsZU5hbWVfZ2V0U3Vic3RpdHV0aW9uUmVwcmVzZW50YXRpb25lbWl0VHlwZUNoZWNrZ2VuZXJhdGVkX1R5cGVDb250YWluZWRJbk91dHB1dFVuaXRWaXNpdG9yZGFydDJqcy50YXJnZXRfY2hlY2tzZHluYW1pY0NoZWNrc2NvdmFyaWFudENoZWNrc19jaGVja090aGVyUGFyYW1ldGVyc19jaGVja0NvdmFyaWFudFBhcmFtZXRlcnNfY2hlY2tUeXBlUGFyYW1ldGVyc19KdW1wSGFuZGxlckVudHJ5anVtcEluc3RydWN0aW9uSnVtcEhhbmRsZXJoYXNBbnlDb250aW51ZU51bGxKdW1wSGFuZGxlck51bGxKdW1wSGFuZGxlci5nZW5lcmF0ZUJyZWFrIHNob3VsZCBub3QgYmUgY2FsbGVkLk51bGxKdW1wSGFuZGxlci5nZW5lcmF0ZUNvbnRpbnVlIHNob3VsZCBub3QgYmUgY2FsbGVkLlRhcmdldEp1bXBIYW5kbGVyanVtcHNjb250aW51ZUluc3RydWN0aW9uU3dpdGNoQ2FzZUp1bXBIYW5kbGVyaXNDb250aW51ZVRvU3dpdGNoQ2FzZUtlcm5lbFN0cmluZ0J1aWxkZXJVbmV4cGVjdGVkIG5vZGU6IGNvbmNhdHJlZGlyZWN0aW9uTWFwcGluZ3R5cGVWYXJpYWJsZUxvY2Fsc2NhY2hlZFR5cGVPZlRoaXNjYWNoZWRUeXBlc09mQ2FwdHVyZWRWYXJpYWJsZXNhY3RpdmF0aW9uVmFyaWFibGVzcmVkaXJlY3RFbGVtZW50aXNTdG9yZWRJbkNsb3N1cmVGaWVsZGNyZWF0ZUJveGpGcm9taXNQYXJhbWV0ZXJ1cGRhdGVDYXB0dXJlQm94Y3VycmVudEJveHRvQmVDb3BpZWRFbGVtZW50c29sZEJveG5ld0JveGJveGVkVmFyaWFibGVvbGRWYWx1ZWdldFR5cGVPZlRoaXNpc05hdGl2ZVVwZ3JhZGVGYWN0b3J5aXNBY2Nlc3NlZERpcmVjdGx5cmVkaXJlY3RUYXJnZXRfaXNVc2VkSW5UcnlPckdlbmVyYXRvclJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxlIGZvciBDYW5ub3QgZmluZCB2YWx1ZSBnZXRUeXBlT2ZDYXB0dXJlZFZhcmlhYmxlbG9jYWxCb3hsb2NhbFZhbHVlZ2V0TG9jYWxMb2NhbCAgaXMgc3RvcmVkIGluIGEgY2xvc3VyZSBmaWVsZC5sb29wRW50cnlzYXZlZERpcmVjdExvY2Fsc2VudGVyTG9vcFVwZGF0ZXNwb3N0TG9vcERlZmluaXRpb25tZXJnZVdpdGhvdGhlckxvY2Fsc2pvaW5lZExvY2Fsc21pbmVsb2NhbHNIYW5kbGVyc3RoaXNWYWx1ZVN5bnRoZXRpY0xvY2FsX25leHRIYXNoQ29kZVN5bnRoZXRpY0xvY2FsKExvb3BIYW5kbGVyaW5pdGlhbGl6ZXJHcmFwaHN0YXJ0QmxvY2tpbml0aWFsaXplckJsb2NrYmVnaW5Cb2R5QmxvY2t1cGRhdGVHcmFwaHVwZGF0ZUJsb2NrdXBkYXRlRW5kQmxvY2tsb29wS2luZGxhYmVsR3JhcGhsYWJlbEluZm9wcmV2aW91c0Jsb2NrYnJhbmNoRXhpdEJsb2NrbG9vcEV4aXRCbG9ja0tlcm5lbExvb3BIYW5kbGVyX0tlcm5lbExvb3BUeXBlVmlzaXRvclNzYUJyYW5jaHN0YXJ0TG9jYWxzZXhpdExvY2Fsc1NzYUJyYW5jaEJ1aWxkZXJkaWFnbm9zdGljTm9kZWNoZWNrTm90QWJvcnRlZGFib3J0ZWQgY29udHJvbCBmbG93Y29uZGl0aW9uQnJhbmNoc3RhcnRCcmFuY2hjb25kaXRpb25CcmFuY2hMb2NhbHNDYW5CZVJldXNlZG1lcmdlTG9jYWxzbWF5UmV1c2VGcm9tTG9jYWxzZnJvbUJyYW5jaHRvQnJhbmNoZnJvbUxvY2Fsc2J1aWxkQnJhbmNodmlzaXRCcmFuY2hqb2luQnJhbmNoX2hhbmRsZURpYW1vbmRCcmFuY2hoYW5kbGVJZk51bGxsZWZ0RXhwcmVzc2lvbmJvb2xpZmllZExlZnRib29saWZpZWRSaWdodG5vdElzQW5kdGhlblZhbHVlZWxzZVZhbHVlY29uZGl0aW9uU3RhcnRCbG9ja2NvbmRpdGlvbkdyYXBoU3dpdGNoQ29udGludWVBbmFseXNpc2NvbnRhaW5zQ29udGludWVzd2l0Y2hDYXNlQm9keWNvbnRpbnVlU3RtdHRyeUZpbmFsbHlTdGF0ZW1lbnQgdHlwZSAgbm90IGhhbmRsZWQgaW4gSXJUb0VsZW1lbnRNYXBkYXJ0MmpzLmpzX21vZGVsLmVudkpQcm9ncmFtRW52X2NvbXBvbmVudHNKTGlicmFyeUVudmxpYnJhcnktZW52X2NsYXNzTWFwX21lbWJlck1hcF9zZXR0ZXJNYXBzZXR0ZXJNYXBKTGlicmFyeURhdGFpbXBvcnRDb3VudEpDbGFzc0VudktpbmRKQ2xhc3NFbnZLaW5kLm5vZGVKQ2xhc3NFbnZLaW5kLmNsb3N1cmVKQ2xhc3NFbnZLaW5kLnJlY29yZEpDbGFzc0VudlVuc3VwcG9ydGVkIEpDbGFzc0VudktpbmQgSkNsYXNzRW52SW1wbGNsYXNzLWVudl9jb25zdHJ1Y3Rvck1hcF9jb25zdHJ1Y3RvckJvZHlMaXN0UmVjb3JkRW52cmVjb3JkLWVudkNsb3N1cmVDbGFzc0VudmNsb3N1cmUtY2xhc3MtZW52SkNsYXNzRGF0YUtpbmRKQ2xhc3NEYXRhS2luZC5ub2RlSkNsYXNzRGF0YVVuZXhwZWN0ZWQgSkNsYXNzRGF0YUtpbmQgSkNsYXNzRGF0YUltcGxpc0NhbGxUeXBlQ29tcHV0ZWRKTWVtYmVyRGF0YUtpbmRKTWVtYmVyRGF0YUtpbmQuZnVuY3Rpb25KTWVtYmVyRGF0YUtpbmQuZmllbGRKTWVtYmVyRGF0YUtpbmQuY29uc3RydWN0b3JKTWVtYmVyRGF0YUtpbmQuY29uc3RydWN0b3JCb2R5Sk1lbWJlckRhdGFLaW5kLnNpZ25hdHVyZUpNZW1iZXJEYXRhS2luZC5nZW5lcmF0b3JCb2R5Y2xvc3VyZUZ1bmN0aW9uSk1lbWJlckRhdGFVbmV4cGVjdGVkIEpNZW1iZXJEYXRhS2luZCBKTWVtYmVyRGF0YUltcGxGdW5jdGlvbkRhdGFGdW5jdGlvbkRhdGFUeXBlVmFyaWFibGVzTWl4aW5GdW5jdGlvbkRhdGFGb3JFYWNoUGFyYW1ldGVyTWl4aW5fRnVuY3Rpb25EYXRhSW1wbCZKTWVtYmVyRGF0YUltcGwmRnVuY3Rpb25EYXRhVHlwZVZhcmlhYmxlc01peGluX0Z1bmN0aW9uRGF0YUltcGwmSk1lbWJlckRhdGFJbXBsJkZ1bmN0aW9uRGF0YVR5cGVWYXJpYWJsZXNNaXhpbiZGdW5jdGlvbkRhdGFGb3JFYWNoUGFyYW1ldGVyTWl4aW5GdW5jdGlvbkRhdGFJbXBsZnVuY3Rpb24tZGF0YVVuZXhwZWN0ZWQgbWVtYmVyIG5vZGUgU2lnbmF0dXJlRnVuY3Rpb25EYXRhc2lnbmF0dXJlLWZ1bmN0aW9uLWRhdGFTaWduYXR1cmVGdW5jdGlvbkRhdGEuZ2V0RnVuY3Rpb25UeXBlU2lnbmF0dXJlRGF0YS5mb3JFYWNoUGFyYW1ldGVyRGVsZWdhdGVkRnVuY3Rpb25EYXRhYmFzZURhdGFHZW5lcmF0b3JCb2R5RnVuY3Rpb25EYXRhZ2VuZXJhdG9yLWJvZHktZGF0YUpDb25zdHJ1Y3RvckRhdGFKQ29uc3RydWN0b3JEYXRhSW1wbGNvbnN0cnVjdG9yLWRhdGFfY29uc3RhbnRDb25zdHJ1Y3RvcmNvbXB1dGVDb25zdGFudENvbnN0cnVjdG9yVW5leHBlY3RlZCBjb25zdHJ1Y3RvciBDb25zdHJ1Y3RvckRhdGFJbXBsLl9nZXRDb25zdHJ1Y3RvckNvbnN0YW50Q29uc3RydWN0b3JCb2R5RGF0YUltcGxjb25zdHJ1Y3Rvci1ib2R5LWRhdGFKRmllbGREYXRhSkZpZWxkRGF0YUltcGxmaWVsZC1kYXRhX2NvbnN0YW50RXhwcmVzc2lvbkZpZWxkRGF0YUltcGwuZ2V0RmllbGRDb25zdGFudEpUeXBlZGVmRGF0YUpUeXBlVmFyaWFibGVEYXRhX2RlZmF1bHRUeXBlb3JkZXJlZF90eXBlc2V0T3JkZXJlZFR5cGVTZXRvcmRlcmVkLXR5cGUtc2V0X2xldmVsc3R5cGVzQ291bnR0eXBlTGlua0J1aWxkZXJsaW5rc2xldmVsQ291bnRsZXZlbHN0eXBlTGlzdGxldmVsTGlzdENhbm5vdCBleHRlbmQgZ2VuZXJpYyBjbGFzcyAgdXNpbmcgT3JkZXJlZFR5cGVTZXQuZXh0ZW5kQ2xhc3NleHRlbmRlZFR5cGVzbGV2ZWxPZmZzZXRzT3JkZXJlZFR5cGVTZXRCdWlsZGVyT3JkZXJlZFR5cGVTZXRCdWlsZGVyQmFzZV9hZGRBbGxTdXBlcnR5cGVzdG9UeXBlU2V0U3VwZXJ0eXBlcyBub3QgY29tcHV0ZWQgb24gZHVyaW5nIHJlc29sdXRpb24gb2YgX2FkZEF0RGVwdGhwcmV2ZXhpc3RpbmdUeXBlSW52YWxpZCBvcmRlcmVkIHR5cGVzZXQgZm9yIGRhcnQyanMuY29tcGlsZV90aW1lX2NvbnN0YW50X2V2YWx1YXRvckNvbnN0YW50RW52aXJvbm1lbnRCYWNrZW5kQ29uc3RhbnRFbnZpcm9ubWVudHJlZ2lzdGVyTGF6eVN0YXRpY0NvbnN0YW50Q29tcGlsZXJUYXNrQ2FjaGVkU3RhdGljVHlwZU5vIHN0YXRpYyB0eXBlIGZvdW5kIGZvciBObyBmb3ItaW4gaXRlcmF0b3IgdHlwZSBmb3VuZCBmb3IgTm8gc3RhdGljIHR5cGUgY2FjaGVkIGZvciBrZXJuZWwuZGVidWdfRGVidWdQcmludGVyJlZpc2l0b3ImSW5kZW50YXRpb25fRGVidWdQcmludGVyJlZpc2l0b3ImSW5kZW50YXRpb24mVGFnZ2luZy0tdW5uYW1lZC0tS2VybmVsRGFydFR5cGVzc3VidHlwZVZpc2l0b3Jwb3RlbnRpYWxTdWJ0eXBlVmlzaXRvcktlcm5lbE9yZGVyZWRUeXBlU2V0QnVpbGRlckFic3RyYWN0VHlwZVJlbGF0aW9uTWl4aW5fS2VybmVsU3VidHlwZVZpc2l0b3ImU3VidHlwZVZpc2l0b3ImQWJzdHJhY3RUeXBlUmVsYXRpb25NaXhpbktlcm5lbFN1YnR5cGVWaXNpdG9yX19LZXJuZWxQb3RlbnRpYWxTdWJ0eXBlVmlzaXRvciZQb3RlbnRpYWxTdWJ0eXBlVmlzaXRvciZBYnN0cmFjdFR5cGVSZWxhdGlvbk1peGluX0tlcm5lbFBvdGVudGlhbFN1YnR5cGVWaXNpdG9yU3RyaW5naWZpZXJDb25zdGFudGlmaWVyZmFpbE5vZGVfaW5pdGlhbGl6ZXJMb2NhbHNfY29tcHV0ZUxpc3RfY29tcHV0ZUFyZ3VtZW50c19jb21wdXRlQ29uc3RydWN0b3JJbnZvY2F0aW9ucmVnaXN0ZXJGaWVsZFVuZXhwZWN0ZWQgaW5pdGlhbGl6ZXIgRGFydFR5cGVDb252ZXJ0ZXJjdXJyZW50RnVuY3Rpb25UeXBlUGFyYW1ldGVyc0NvbnN0YW50VmFsdWVmaWVyVW5leHBlY3RlZCB1bmV2YWx1YXRlZCBjb25zdGFudCBkYXJ0MmpzLmtlcm5lbC5lbnZtZXJnZVNvcnRLUHJvZ3JhbUVudl9hZGRMaWJyYXJpZXNfZW5zdXJlTGlicmFyeU1hcEtMaWJyYXJ5RW52X2Vuc3VyZUNsYXNzTWFwX2Vuc3VyZU1lbWJlck1hcHNVbmV4cGVjdGVkIGxpYnJhcnkgbWVtYmVyIG5vZGU6IEtMaWJyYXJ5RGF0YV9tZXRhZGF0YUtDbGFzc0VudktDbGFzc0VudkltcGxfYnVpbGRGb3J3YXJkaW5nQ29uc3RydWN0b3JzdXBlcmNsYXNzQ29uc3RydWN0b3JzdXBlckZ1bmN0aW9uY2xvbmVWYXJpYWJsZWluY2x1ZGVTdGF0aWNpbmNsdWRlTm9TdWNoTWV0aG9kRm9yd2FyZGVyc2FkZENvbnN0cnVjdG9yc21peGluTWVtYmVyQ291bnRjbG9uZVZpc2l0b3JzdXBlcmNsYXNzU3Vic3RpdHV0aW9uc3VwZXJjbGFzc0Nsb25lcmZvcndhcmRpbmdDb25zdHJ1Y3RvcktDbGFzc0RhdGFLQ2xhc3NEYXRhSW1wbEtNZW1iZXJEYXRhS01lbWJlckRhdGFJbXBsS0Z1bmN0aW9uRGF0YUtGdW5jdGlvbkRhdGFNaXhpbl9LRnVuY3Rpb25EYXRhSW1wbCZLTWVtYmVyRGF0YUltcGwmS0Z1bmN0aW9uRGF0YU1peGluS0Z1bmN0aW9uRGF0YUltcGxLQ29uc3RydWN0b3JEYXRhS0NvbnN0cnVjdG9yRGF0YUltcGxLRmllbGREYXRhS0ZpZWxkRGF0YUltcGxLVHlwZWRlZkRhdGFLVHlwZVZhcmlhYmxlRGF0YW9yZGVyQnlGaWxlT2Zmc2V0YUxvY2JMb2NhVXJpYlVyaXVyaUNvbXBhcmV1bml2ZXJzZS5mdW5jdGlvbl9zZXRjb21wdXRlTWFza19jcmVhdGVTZWxlY3Rvck1hc2tzZWxlY3Rvck1hc2tub1N1Y2hNZXRob2RNYXNrbm9TdWNoTWV0aG9kc1NlbGVjdG9yTWFza0Z1bmN0aW9uU2V0Tm9kZU1BWF9FTEVNRU5UU19JTl9MSVNUbm9TdWNoTWV0aG9kUXVlcnlGdW5jdGlvblNldE5vZGUoRnVuY3Rpb25TZXRRdWVyeUVtcHR5RnVuY3Rpb25TZXRRdWVyeTxlbXB0eT5GdWxsRnVuY3Rpb25TZXRRdWVyeV9yZWNlaXZlckltcGFjdFJlZ2lzdHJ5TWl4aW5JbXBhY3REYXRhdG9EYXRhU2lua0ltcGFjdERhdGFJbXBsX0NhbGxTdHJ1Y3R1cmVfU3VwZXJJbml0aWFsaXplcnNvdXJjZUNvbnN0cnVjdG9ydGFyZ2V0Q29uc3RydWN0b3JfU3VwZXJJbnZvY2F0aW9uX0luc3RhbmNlQWNjZXNzX0R5bmFtaWNBY2Nlc3NfRnVuY3Rpb25JbnZvY2F0aW9uX0luc3RhbmNlSW52b2NhdGlvbl9EeW5hbWljSW52b2NhdGlvbl9Mb2NhbEZ1bmN0aW9uSW52b2NhdGlvbl9TdGF0aWNJbnZvY2F0aW9uX0NvbnN0cnVjdG9ySW52b2NhdGlvbl9Db25zdEluc3RhbnRpYXRpb25fRmVhdHVyZWxvY2FsV2l0aG91dEluaXRpYWxpemVyX1R5cGVVc2VfVHlwZVVzZUtpbmRhc3luY1N0YXJNYXJrZXJzeW5jU3Rhck1hcmtlcl9SZWRpcmVjdGluZ0luaXRpYWxpemVyX1R5cGVMaXRlcmFsX0dlbmVyaWNJbnN0YW50aWF0aW9uX1N0YXRpY0FjY2Vzc19NYXBMaXRlcmFsX0NvbnRhaW5lckxpdGVyYWxfUnVudGltZVR5cGVVc2VfRm9ySW5EYXRhZnJvbnRfZW5kLmNvbnN0YW50X2V2YWx1YXRvclJlc29sdXRpb25Xb3JsZEltcGFjdEJ1aWxkZXJfS2VybmVsSW1wYWN0QnVpbGRlciZJbXBhY3RCdWlsZGVyQmFzZSZLZXJuZWxJbXBhY3RSZWdpc3RyeU1peGluX2NvbXB1dGVSZWNlaXZlckNvbnN0cmFpbnRpclR5cGVfZ2V0VHlwZUFyZ3VtZW50c3JlZ2lzdGVyRmVhdHVyZXJlZ2lzdGVyTmF0aXZlRGF0YXJlZ2lzdGVyQ29uc3RhbnRMaXRlcmFscmVnaXN0ZXJDb25zdFN5bWJvbE5hbWVkYXJ0VHlwZUFyZ3VtZW50c21hdGNoZWRUeXBlcmVjZWl2ZXJEYXJ0VHlwZWFyZ3VtZW50RGFydFR5cGVmaXJzdENhc2VmaXJzdENhc2VUeXBlb3ZlcnJpZGVzRXF1YWxzS2VybmVsSW1wYWN0QnVpbGRlcl9hbm5vdGF0aW9uc0tlcm5lbEltcGFjdENvbnZlcnRlcktlcm5lbEltcGFjdFJlZ2lzdHJ5TWl4aW5PcHRpbWl6YXRpb25UZXN0TG9nX3VuY29udmVydGVkPG51bGwtZ3VhcmQ+RmllbGRHZXRGaWVsZFNldEZpZWxkQ2FsbENvbnN0YW50RmllbGRHZXRDb25zdGFudEZpZWxkQ2FsbF9yZWdpc3RlclNwZWNpYWxpemVydW5jb252ZXJ0ZWROYW1lU3BlY2lhbGl6ZXJJbmRleEFzc2lnbkluZGV4Qml0Tm90TmVnYXRlQWJzTW9kdWxvRHluYW1pY01vZHVsb1RydW5jYXRpbmdEaXZpZGUuU2hpZnRMZWZ0LlNoaWZ0UmlnaHQuRXF1YWxzTGVzc0VxdWFsc0dyZWF0ZXJFcXVhbHNDb2RlVW5pdEF0Q29tcGFyZVRvU3Vic3RyaW5nVHJpbVBhdHRlcm5NYXRjaFJvdW5kcmVnaXN0ZXJQcmltaXRpdmVDaGVja1ByaW1pdGl2ZUNoZWNrT3B0aW1pemF0aW9uTG9nKE9wdGltaXphdGlvbkxvZ0VudHJ5Rm9yQ29uZGl0aW9uaW5TdHlsZUZvclNwcmVhZEZvckluU3ByZWFkRm9yRW50cnlGb3JJbkVudHJ5Rm9yQ29tcGxldGVGb3JJbkNvbXBsZXRlSWZDb25kaXRpb25JZlNwcmVhZElmRW50cnlJZkNvbXBsZXRlSWZFbHNlRWxzZVNwcmVhZEVsc2VFbnRyeUlmRWxzZUNvbXBsZXRlU3ByZWFkT3BlcmF0b3JOZXN0ZWRuZXN0ZWRTdGVwbGFzdFN0ZXBpZkNvbmRpdGlvbnNwcmVhZE9wZXJhdG9yZmFzdGEucGFyc2VyLnR5cGVfaW5mb19pbXBsUHJlZml4ZWRUeXBlU2ltcGxlTnVsbGFibGVUeXBlV2l0aDFBcmd1bWVudHBhcnNlVHlwZVJlc3RTaW1wbGVUeXBlV2l0aDFBcmd1bWVudFNpbXBsZU51bGxhYmxlVHlwZVNpbXBsZVR5cGVDb21wbGV4VHlwZUluZm9iZWZvcmVRdWVzdGlvbk1hcmt0eXBlVmFyaWFibGVTdGFydGVyc2dmdEhhc1JldHVyblR5cGVfbm9uTnVsbGFibGV0eXBlVmFyaWFibGVFbmRHcm91cHN0eXBlUmVmT3JQcmVmaXhlbmRHcm91cEluZGV4Y29tcHV0ZVJlc3R0eXBlVmFyaWFibGVTdGFydE5vVHlwZVBhcmFtT3JBcmdTaW1wbGVUeXBlQXJndW1lbnQxcGFyc2VFbmRHcm91cHNraXBFbmRHcm91cFNpbXBsZVR5cGVBcmd1bWVudDFHdEVxYmVmb3JlRW5kR3JvdXBTaW1wbGVUeXBlQXJndW1lbnQxR3RHdENvbXBsZXhUeXBlUGFyYW1PckFyZ0luZm9za2lwRW5kcGFyc2VVbmV4cGVjdGVkRW5kcGFyc2VNaXNzaW5nQ29tbWF0eXBlU3RhcnRzc3VwZXJUeXBlSW5mb3N0b2tlbjJpc0FyZ3VtZW50c2Vycm9yUmVwb3J0ZWR0eXBlRm9sbG93c0V4dGVuZHNpbnZhbGlkVHlwZVZhcnNpbXBsZVR5cGVzaW1wbGVOdWxsYWJsZVR5cGVwcmVmaXhlZFR5cGVzaW1wbGVUeXBlV2l0aDFBcmd1bWVudHNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50R3RFcXNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50R3RHdHNpbXBsZU51bGxhYmxlVHlwZVdpdGgxQXJndW1lbnRzaW1wbGVUeXBlQXJndW1lbnQxc2ltcGxlVHlwZUFyZ3VtZW50MUd0RXFzaW1wbGVUeXBlQXJndW1lbnQxR3RHdGxvb2tzTGlrZU5hbWVsb29rc0xpa2VUeXBlUGFyYW1PckFyZ2lzQ2xvc2VycGFyc2VDbG9zZXJiZWZvcmVDbG9zZXJ1bnNwbGl0c3BsaXRDbG9zZXJfQ29uc3RhbnRSZWZlcmVuY2VHZW5lcmF0b3JfQ29uc3RhbnRMaXN0R2VuZXJhdG9yTW9kdWxhckNvbnN0YW50RW1pdHRlcl9leHBvbmVudGlhbFJFKFstK10/KShbMC05XSspKC4oWzAtOV0qKSk/ZShbLStdP1swLTldKylUaGUgZnVuY3Rpb24gY29uc3RhbnQgZG9lcyBub3QgbmVlZCBzcGVjaWZpYyBKUyBjb2RlLl9zaG9ydGVuRXhwb25lbnRpYWxSZXByZXNlbnRhdGlvbm51bWJlclN0cmluZ2xlYWRpbmdEaWdpdHNmcmFjdGlvbkRpZ2l0c2V4cG9uZW50YWx0ZXJuYXRpdmVjdXRvZmZ0b1N0cmluZ0FzRXhwb25lbnRpYWwwLzAxLzAtMS8wc2hvcnRlbmVkITAhMUNvbnN0YW50RW1pdHRlckNPTU1FTlRfUkVeICooLy8uKik/XG58ICAqLy9bXicnIlxuXSokbXVsdGlMaW5lX2NvbnN0YW50UmVmZXJlbmNlR2VuZXJhdG9yX21ha2VDb25zdGFudExpc3RtYXliZUFkZExpc3RUeXBlQXJndW1lbnRzTmV3UnRpbWF5YmVBZGRUeXBlQXJndW1lbnRzQ29tcGlsZXIgZW5jb3V0ZXJlZCB1bmV4cGVjdGVkIHNldCBjbGFzcyBfcmVpZmllZFR5cGVOZXdSdGlfcmVpZmllZFR5cGVBcmd1bWVudHNqc01hcGtleUV4cHJlc3Npb252YWx1ZUV4cHJlc3Npb25qc0dlbmVyYWxNYXBlbWl0dGVkQXJndW1lbnRDb3VudENvbXBpbGVyIGhhcyB1bmV4cGVjdGVkIGZpZWxkIENvbXBpbGVyIGFuZCAgZGlzYWdyZWUgb24gbnVtYmVyIG9mIGZpZWxkcy5nZXRIZWxwZXJQcm9wZXJ0eV92YXJpYWJsZVVuZXhwZWN0ZWQgdHlwZSB2YXJpYWJsZSAnIGluIGNvbnN0YW50ICdzdHJpcENvbW1lbnRzcmF3SmF2YVNjcmlwdGRhcnQyanMuanNfZW1pdHRlci5zdGFydHVwX2VtaXR0ZXIubW9kZWxfZW1pdHRlclJhbmRvbUhhc2hlclNvdXJjZU1hcEJ1aWxkZXJDb25zdGFudE9yZGVyaW5nZnJhZ21lbnRfZW1pdHRlci5kYXJ0TW9kZWxFbWl0dGVyX3Nob3VsZEdlbmVyYXRlU291cmNlTWFwX2NvbnN0YW50T3JkZXJpbmdkZWZlcnJlZEluaXRpYWxpemVyc0dsb2JhbCRfX2RhcnRfZGVmZXJyZWRfaW5pdGlhbGl6ZXJzX19wYXJ0RXh0ZW5zaW9uZGVmZXJyZWRFeHRlbnNpb25wYXJ0LmpzdHlwZU5hbWVQcm9wZXJ0eWJ1aWx0aW4kY2xzY29uc3RhbnRMaXN0R2VuZXJhdG9ybWFrZUNvbnN0TGlzdCgjKWNtcDFjbXAyZnJhZ21lbnRFbWl0dGVyZGVmZXJyZWRMb2FkaW5nU3RhdGVtYWluQ29kZWVtaXRNYWluRnJhZ21lbnRkZWZlcnJlZEZyYWdtZW50c0NvZGVmcmFnbWVudENvZGVlbWl0RGVmZXJyZWRGcmFnbWVudGh1bmtIYXNoZXN3cml0ZSBmcmFnbWVudHN3cml0ZURlZmVycmVkRnJhZ21lbnRzZmluYWxpemVEZWZlcnJlZExvYWRpbmdEYXRhd3JpdGVNYWluRnJhZ21lbnR3cml0ZURlZmVycmVkTWFwYnVpbGRHZW5lcmF0ZWRCeWZsYXZvcmZhc3Qgc3RhcnR1cCBlbWl0dGVyLCBzdHJvbmcsIHRydXN0IHByaW1pdGl2ZXMsIG9taXQgY2hlY2tzLCBsYXggcnVudGltZSB0eXBlLCBDU1BmcmFnbWVudHNDb2Rld3JpdGVEZWZlcnJlZEZyYWdtZW50YnVpbGREZWZlcnJlZEluaXRpYWxpemVyR2xvYmFsc2VsZi4jZGVmZXJyZWRJbml0aWFsaXplcnMgPSBzZWxmLiNkZWZlcnJlZEluaXRpYWxpemVycyB8fCBPYmplY3QuY3JlYXRlKG51bGwpO2RlZmVycmVkSW5pdGlhbGl6ZXJzbG9jYXRpb25Db2xsZWN0b3Jjb2RlT3V0cHV0TGlzdGVuZXJzc291cmNlLW1hcHNtYWluT3V0cHV0Ly8gVGhlIGNvZGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBob29rczoKLy8gZGFydFByaW50KG1lc3NhZ2UpOgovLyAgICBpZiB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaXQgaXMgY2FsbGVkIGluc3RlYWQgb2YgdGhlIERhcnQgW3ByaW50XQovLyAgICBtZXRob2QuCi8vCi8vIGRhcnRNYWluUnVubmVyKG1haW4sIGFyZ3MpOgovLyAgICBpZiB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQsIHRoZSBEYXJ0IFttYWluXSBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZAovLyAgICBkaXJlY3RseS4gSW5zdGVhZCwgYSBjbG9zdXJlIHRoYXQgd2lsbCBpbnZva2UgW21haW5dLCBhbmQgaXRzIGFyZ3VtZW50cwovLyAgICBbYXJnc10gaXMgcGFzc2VkIHRvIFtkYXJ0TWFpblJ1bm5lcl0uCi8vCi8vIGRhcnREZWZlcnJlZExpYnJhcnlMb2FkZXIodXJpLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOgovLyAgICBpZiB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGl0IHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBkZWZlcnJlZCBsaWJyYXJ5Ci8vICAgIGlzIGxvYWRlZC4gSXQgc2hvdWxkIGxvYWQgYW5kIGV2YWwgdGhlIGphdmFzY3JpcHQgb2YgYHVyaWAsIGFuZCBjYWxsCi8vICAgIHN1Y2Nlc3NDYWxsYmFjay4gSWYgaXQgZmFpbHMgdG8gZG8gc28sIGl0IHNob3VsZCBjYWxsIGVycm9yQ2FsbGJhY2sgd2l0aAovLyAgICBhbiBlcnJvci4KLy8KLy8gZGFydENhbGxJbnN0cnVtZW50YXRpb24oaWQsIHF1YWxpZmllZE5hbWUpOgovLyAgICBpZiB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGl0IHdpbGwgYmUgY2FsbGVkIGF0IGVhY2ggZW50cnkgb2YgYQovLyAgICBtZXRob2Qgb3IgY29uc3RydWN0b3IuIFVzZWQgb25seSB3aGVuIGNvbXBpbGluZyBwcm9ncmFtcyB3aXRoCi8vICAgIC0tZXhwZXJpbWVudC1jYWxsLWluc3RydW1lbnRhdGlvbi4KZW1pdCBidWZmZXJzb3V0cHV0TGlzdGVuZXJzaGFzaGVyaHVua1ByZWZpeC5jdXJyZW50ID0gI1siIl0gPSAuY3VycmVudG1hcFVyaWh1bmtGaWxlTmFtZW1hcEZpbGVOYW1lbWFwU2VnbWVudHNwYXJ0U2VnbWVudHNfY29tbWVudFRoaXMgbWFwcGluZyBzaG93cyB3aGljaCBjb21waWxlZCBgLmpzYCBmaWxlcyBhcmUgbmVlZGVkIGZvciBhIGdpdmVuIGRlZmVycmVkIGxpYnJhcnkgaW1wb3J0LkZyYWdtZW50RW1pdHRlcl9tb2RlbEVtaXR0ZXJfcnVsZXNldEVuY29kZXJfY2FsbDBOYW1lX2NhbGwxTmFtZV9jYWxsMk5hbWVjYWxsME5hbWVjYWxsMU5hbWVjYWxsMk5hbWVub25TdGF0aWNTdGF0ZUhvbGRlcnNzb2Z0RGVmZXJyZWRJZHNvZnREZWZlcnJlZGhvbGRlckNvZGVlbWl0SG9sZGVyc2luaXRpYWxpemVFbXB0eUhvbGRlcnMoZnVuY3Rpb24gZGFydFByb2dyYW0oKSB7Ci8vIENvcGllcyB0aGUgb3duIHByb3BlcnRpZXMgZnJvbSBbZnJvbV0gdG8gW3RvXS4KZnVuY3Rpb24gY29weVByb3BlcnRpZXMoZnJvbSwgdG8pIHsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyb20pOwogIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgdmFyIGtleSA9IGtleXNbaV07CiAgICB0b1trZXldID0gZnJvbVtrZXldOwogIH0KfQoKLy8gT25seSB1c2UgZGlyZWN0IHByb3RvIGFjY2VzcyB0byBjb25zdHJ1Y3QgdGhlIHByb3RvdHlwZSBjaGFpbiAoaW5zdGVhZCBvZgovLyBjb3B5aW5nIHByb3BlcnRpZXMpIG9uIHBsYXRmb3JtcyB3aGVyZSB3ZSBrbm93IGl0IHdvcmtzIHdlbGwgKENocm9tZSAvIGQ4KS4KdmFyIHN1cHBvcnRzRGlyZWN0UHJvdG9BY2Nlc3MgPSAjZGlyZWN0QWNjZXNzVGVzdEV4cHJlc3Npb247CgovLyBTZXRzIHRoZSBuYW1lIHByb3BlcnR5IG9mIGZ1bmN0aW9ucywgaWYgdGhlIEpTIGVuZ2luZSBkb2Vzbid0IHNldCB0aGUgbmFtZQovLyBpdHNlbGYuCi8vIEFzIG9mIDIwMTggb25seSBJRTExIGRvZXNuJ3Qgc2V0IHRoZSBuYW1lLgpmdW5jdGlvbiBzZXRGdW5jdGlvbk5hbWVzSWZOZWNlc3NhcnkoaG9sZGVycykgewogIGZ1bmN0aW9uIHQoKXt9OwogIGlmICh0eXBlb2YgdC5uYW1lID09ICJzdHJpbmciKSByZXR1cm47CgogIGZvciAodmFyIGkgPSAwOyBpIDwgaG9sZGVycy5sZW5ndGg7IGkrKykgewogICAgdmFyIGhvbGRlciA9IGhvbGRlcnNbaV07CiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGhvbGRlcik7CiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyBqKyspIHsKICAgICAgdmFyIGtleSA9IGtleXNbal07CiAgICAgIHZhciBmID0gaG9sZGVyW2tleV07CiAgICAgIGlmICh0eXBlb2YgZiA9PSAnZnVuY3Rpb24nKSBmLm5hbWUgPSBrZXk7CiAgICB9CiAgfQp9CgovLyBNYWtlcyBbY2xzXSBpbmhlcml0IGZyb20gW3N1cF0uCi8vIE9uIENocm9tZSwgRmlyZWZveCBhbmQgcmVjZW50IElFcyB0aGlzIGhhcHBlbnMgYnkgdXBkYXRpbmcgdGhlIGludGVybmFsCi8vIHByb3RvLXByb3BlcnR5IG9mIHRoZSBjbGFzc2VzICdwcm90b3R5cGUnIGZpZWxkLgovLyBPbGRlciBJRXMgdXNlIGBPYmplY3QuY3JlYXRlYCBhbmQgY29weSBvdmVyIHRoZSBwcm9wZXJ0aWVzLgpmdW5jdGlvbiBpbmhlcml0KGNscywgc3VwKSB7CiAgLy8gTm90ZSB0aGF0IFJUSSBuZWVkcyBjbHMubmFtZSwgYnV0IHdlIGRvbid0IG5lZWQgdG8gc2V0IGl0IGFueW1vcmUuCiAgY2xzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNsczsKICBjbHMucHJvdG90eXBlWyNvcGVyYXRvcklzUHJlZml4ICsgY2xzLm5hbWVdID0gY2xzOwoKICAvLyBUaGUgc3VwZXJjbGFzcyBpcyBvbmx5IG51bGwgZm9yIHRoZSBEYXJ0IE9iamVjdC4KICBpZiAoc3VwICE9IG51bGwpIHsKICAgIGlmIChzdXBwb3J0c0RpcmVjdFByb3RvQWNjZXNzKSB7CiAgICAgIC8vIEZpcmVmb3ggZG9lc24ndCBsaWtlIHRvIHVwZGF0ZSB0aGUgcHJvdG90eXBlcywgYnV0IHdoZW4gc2V0dGluZyB1cAogICAgICAvLyB0aGUgaGllcmFyY2h5IGNoYWluIGl0J3Mgb2suCiAgICAgIGNscy5wcm90b3R5cGUuX19wcm90b19fID0gc3VwLnByb3RvdHlwZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIGNsc1Byb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwLnByb3RvdHlwZSk7CiAgICBjb3B5UHJvcGVydGllcyhjbHMucHJvdG90eXBlLCBjbHNQcm90b3R5cGUpOwogICAgY2xzLnByb3RvdHlwZSA9IGNsc1Byb3RvdHlwZTsKICB9Cn0KCi8vIEJhdGNoZWQgdmVyc2lvbiBvZiBbaW5oZXJpdF0gZm9yIG11bHRpcGxlIGNsYXNzZXMgZnJvbSBvbmUgc3VwZXJjbGFzcy4KZnVuY3Rpb24gaW5oZXJpdE1hbnkoc3VwLCBjbGFzc2VzKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7CiAgICBpbmhlcml0KGNsYXNzZXNbaV0sIHN1cCk7CiAgfQp9CgovLyBNaXhlcyBpbiB0aGUgcHJvcGVydGllcyBvZiBbbWl4aW5dIGludG8gW2Nsc10uCmZ1bmN0aW9uIG1peGluKGNscywgbWl4aW4pIHsKICBjb3B5UHJvcGVydGllcyhtaXhpbi5wcm90b3R5cGUsIGNscy5wcm90b3R5cGUpOwogIGNscy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjbHM7Cn0KCi8vIENyZWF0ZXMgYSBsYXp5IGZpZWxkLgovLwovLyBBIGxhenkgZmllbGQgaGFzIGEgc3RvcmFnZSBlbnRyeSwgW25hbWVdLCB3aGljaCBob2xkcyB0aGUgdmFsdWUsIGFuZCBhCi8vIGdldHRlciAoW2dldHRlck5hbWVdKSB0byBhY2Nlc3MgdGhlIGZpZWxkLiBJZiB0aGUgZmllbGQgd2Fzbid0IHNldCBiZWZvcmUKLy8gdGhlIGZpcnN0IGFjY2VzcywgaXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgW2luaXRpYWxpemVyXS4KZnVuY3Rpb24gbGF6eShob2xkZXIsIG5hbWUsIGdldHRlck5hbWUsIGluaXRpYWxpemVyKSB7CiAgdmFyIHVuaW5pdGlhbGl6ZWRTZW50aW5lbCA9IGhvbGRlcjsKICBob2xkZXJbbmFtZV0gPSB1bmluaXRpYWxpemVkU2VudGluZWw7CiAgaG9sZGVyW2dldHRlck5hbWVdID0gZnVuY3Rpb24oKSB7CiAgICBob2xkZXJbZ2V0dGVyTmFtZV0gPSBmdW5jdGlvbigpIHsgI2N5Y2xpY1Rocm93KG5hbWUpIH07CiAgICB2YXIgcmVzdWx0OwogICAgdmFyIHNlbnRpbmVsSW5Qcm9ncmVzcyA9IGluaXRpYWxpemVyOwogICAgdHJ5IHsKICAgICAgaWYgKGhvbGRlcltuYW1lXSA9PT0gdW5pbml0aWFsaXplZFNlbnRpbmVsKSB7CiAgICAgICAgcmVzdWx0ID0gaG9sZGVyW25hbWVdID0gc2VudGluZWxJblByb2dyZXNzOwogICAgICAgIHJlc3VsdCA9IGhvbGRlcltuYW1lXSA9IGluaXRpYWxpemVyKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ID0gaG9sZGVyW25hbWVdOwogICAgICB9CiAgICB9IGZpbmFsbHkgewogICAgICAvLyBVc2UgdHJ5LWZpbmFsbHksIG5vdCB0cnktY2F0Y2gvdGhyb3cgYXMgaXQgZGVzdHJveXMgdGhlIHN0YWNrCiAgICAgIC8vIHRyYWNlLgogICAgICBpZiAocmVzdWx0ID09PSBzZW50aW5lbEluUHJvZ3Jlc3MpIHsKICAgICAgICAvLyBUaGUgbGF6eSBzdGF0aWMgKGhvbGRlcltuYW1lXSkgbWlnaHQgaGF2ZSBiZWVuIHNldCB0byBhIGRpZmZlcmVudAogICAgICAgIC8vIHZhbHVlLiBBY2NvcmRpbmcgdG8gc3BlYyB3ZSBzdGlsbCBoYXZlIHRvIHJlc2V0IGl0IHRvIG51bGwsIGlmCiAgICAgICAgLy8gdGhlIGluaXRpYWxpemF0aW9uIGZhaWxlZC4KICAgICAgICBob2xkZXJbbmFtZV0gPSBudWxsOwogICAgICB9CiAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB0aGUgZnVuY3Rpb24gc2hvdWxkIHByb2JhYmx5CiAgICAgIC8vIGJlIHVuaXF1ZSBmb3IgZWFjaCBzdGF0aWMuCiAgICAgIGhvbGRlcltnZXR0ZXJOYW1lXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpc1tuYW1lXTsgfTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfTsKfQoKLy8gR2l2ZW4gYSBsaXN0LCBtYXJrcyBpdCBhcyBjb25zdGFudC4KLy8KLy8gVGhlIHJ1bnRpbWUgZW5zdXJlcyB0aGF0IGNvbnN0LWxpc3RzIGNhbm5vdCBiZSBtb2RpZmllZC4KZnVuY3Rpb24gbWFrZUNvbnN0TGlzdChsaXN0KSB7CiAgLy8gQnkgYXNzaWduaW5nIGEgZnVuY3Rpb24gdG8gdGhlIHByb3BlcnRpZXMgdGhleSBiZWNvbWUgcGFydCBvZiB0aGUKICAvLyBoaWRkZW4gY2xhc3MuIFRoZSBhY3R1YWwgdmFsdWVzIG9mIHRoZSBmaWVsZHMgZG9uJ3QgbWF0dGVyLCBzaW5jZSB3ZQogIC8vIG9ubHkgY2hlY2sgaWYgdGhleSBleGlzdC4KICBsaXN0LmltbXV0YWJsZSRsaXN0ID0gQXJyYXk7CiAgbGlzdC5maXhlZCRsZW5ndGggPSBBcnJheTsKICByZXR1cm4gbGlzdDsKfQoKZnVuY3Rpb24gY29udmVydFRvRmFzdE9iamVjdChwcm9wZXJ0aWVzKSB7CiAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIHRoYXQgdXNlcyAncHJvcGVydGllcycgYXMgcHJvdG90eXBlLiBUaGlzIHNob3VsZAogIC8vIG1ha2UgJ3Byb3BlcnRpZXMnIGEgZmFzdCBvYmplY3QuCiAgZnVuY3Rpb24gdCgpIHt9CiAgdC5wcm90b3R5cGUgPSBwcm9wZXJ0aWVzOwogIG5ldyB0KCk7CiAgcmV0dXJuIHByb3BlcnRpZXM7Cn0KCmZ1bmN0aW9uIGNvbnZlcnRBbGxUb0Zhc3RPYmplY3QoYXJyYXlPZk9iamVjdHMpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZPYmplY3RzLmxlbmd0aDsgKytpKSB7CiAgICBjb252ZXJ0VG9GYXN0T2JqZWN0KGFycmF5T2ZPYmplY3RzW2ldKTsKICB9Cn0KCi8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCBieSB0aGUgdGVhck9mZkNvZGUgdG8gZ3VhcmFudGVlIHVuaXF1ZSBmdW5jdGlvbnMgcGVyCi8vIHRlYXItb2Zmcy4KdmFyIGZ1bmN0aW9uQ291bnRlciA9IDA7CiN0ZWFyT2ZmQ29kZTsKCi8vIEVhY2ggZGVmZXJyZWQgaHVuayBjb21lcyB3aXRoIGl0cyBvd24gdHlwZXMgd2hpY2ggYXJlIGFkZGVkIHRvIHRoZSBlbmQKLy8gb2YgdGhlIHR5cGVzLWFycmF5LgovLyBUaGUgYGZ1blR5cGVzYCBwYXNzZWQgdG8gdGhlIGBpbnN0YWxsVGVhck9mZmAgZnVuY3Rpb24gYmVsb3cgaXMgcmVsYXRpdmUgdG8KLy8gdGhlIGh1bmsgdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20uIFRoZSBgdHlwZXNPZmZzZXRgIHZhcmlhYmxlIGVuY29kZXMgdGhlCi8vIG9mZnNldCBhdCB3aGljaCB0aGUgbmV3IHR5cGVzIHdpbGwgYmUgYWRkZWQuCnZhciB0eXBlc09mZnNldCA9IDA7CgovLyBBZGFwdHMgdGhlIHN0b3JlZCBkYXRhLCBzbyBpdCdzIHN1aXRhYmxlIGZvciBhIHRlYXJPZmYgY2FsbC4KLy8KLy8gU3RvcmVzIHRoZSB0ZWFyLW9mZiBnZXR0ZXItZnVuY3Rpb24gaW4gdGhlIFtjb250YWluZXJdJ3MgW2dldHRlck5hbWVdCi8vIHByb3BlcnR5LgovLwovLyBUaGUgW2NvbnRhaW5lcl0gaXMgZWl0aGVyIGEgY2xhc3MgKHRoYXQgaXMsIGl0cyBwcm90b3R5cGUpLCBvciB0aGUgaG9sZGVyIGZvcgovLyBzdGF0aWMgZnVuY3Rpb25zLgovLwovLyBUaGUgYXJndW1lbnQgW2Z1bnNPck5hbWVzXSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzIG9yIGZ1bmN0aW9ucy4gSWYgaXQgaXMgYQovLyBuYW1lLCB0aGVuIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgZmV0Y2hlZCBmcm9tIHRoZSBjb250YWluZXIuIFRoZSBmaXJzdAovLyBlbnRyeSBpbiB0aGF0IGFycmF5ICptdXN0KiBiZSBhIHN0cmluZy4KLy8KLy8gVE9ETyhmbG9pdHNjaCk6IENoYW5nZSB0ZWFyT2ZmQ29kZSB0byBhY2NlcHQgdGhlIGRhdGEgZGlyZWN0bHksIG9yIGNyZWF0ZSBhCi8vIGRpZmZlcmVudCB0ZWFyT2ZmQ29kZT8KZnVuY3Rpb24gaW5zdGFsbFRlYXJPZmYoCiAgICBjb250YWluZXIsIGdldHRlck5hbWUsIGlzU3RhdGljLCBpc0ludGVyY2VwdGVkLCByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLCBjYWxsTmFtZXMsIGZ1bnNPck5hbWVzLCBmdW5UeXBlLCBhcHBseUluZGV4KSB7CiAgLy8gQSBmdW5jdGlvbiBjYW4gaGF2ZSBzZXZlcmFsIHN0dWJzIChmb3IgZXhhbXBsZSB0byBmaWxsIGluIG9wdGlvbmFsCiAgLy8gYXJndW1lbnRzKS4gV2UgY29sbGVjdCB0aGVzZSBmdW5jdGlvbnMgaW4gdGhlIGBmdW5zYCBhcnJheS4KICB2YXIgZnVucyA9IFtdOwogIGZvciAodmFyIGkgPSAwOyBpIDwgZnVuc09yTmFtZXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBmdW4gPSBmdW5zT3JOYW1lc1tpXTsKICAgIGlmICgodHlwZW9mIGZ1bikgPT0gJ3N0cmluZycpIGZ1biA9IGNvbnRhaW5lcltmdW5dOwogICAgZnVuLiNjYWxsTmFtZSA9IGNhbGxOYW1lc1tpXTsKICAgIGZ1bnMucHVzaChmdW4pOwogIH0KCiAgLy8gVGhlIG1haW4gZnVuY3Rpb24gdG8gd2hpY2ggYWxsIHN0dWJzIHJlZGlyZWN0LgogIHZhciBmdW4gPSBmdW5zWzBdOwoKICBmdW5bI2FyZ3VtZW50Q291bnRdID0gcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDsKICBmdW5bI2RlZmF1bHRBcmd1bWVudFZhbHVlc10gPSBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXM7CiAgdmFyIHJlZmxlY3Rpb25JbmZvID0gZnVuVHlwZTsKICBpZiAodHlwZW9mIHJlZmxlY3Rpb25JbmZvID09ICJudW1iZXIiKSB7CiAgICAvLyBUaGUgcmVmbGVjdGlvbkluZm8gY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uLCBvciBhIHBvaW50ZXIgaW50byB0aGUgdHlwZXMKICAgIC8vIHRhYmxlLiBJZiBpdCBwb2ludHMgaW50byB0aGUgdHlwZXMtdGFibGUgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGluZGV4LAogICAgLy8gaW4gY2FzZSB0aGUgdGVhci1vZmYgaXMgcGFydCBvZiBhIGRlZmVycmVkIGh1bmsuCiAgICByZWZsZWN0aW9uSW5mbyA9IHJlZmxlY3Rpb25JbmZvICsgdHlwZXNPZmZzZXQ7CiAgfQogIHZhciBuYW1lID0gZnVuc09yTmFtZXNbMF07CiAgZnVuLiNzdHViTmFtZSA9IG5hbWU7CiAgdmFyIGdldHRlckZ1bmN0aW9uID0KICAgICAgdGVhck9mZihmdW5zLCBhcHBseUluZGV4IHx8IDAsIHJlZmxlY3Rpb25JbmZvLCBpc1N0YXRpYywgbmFtZSwgaXNJbnRlcmNlcHRlZCk7CiAgY29udGFpbmVyW2dldHRlck5hbWVdID0gZ2V0dGVyRnVuY3Rpb247CiAgaWYgKGlzU3RhdGljKSB7CiAgICBmdW4uJHRlYXJPZmYgPSBnZXR0ZXJGdW5jdGlvbjsKICB9Cn0KCmZ1bmN0aW9uIGluc3RhbGxTdGF0aWNUZWFyT2ZmKAogICAgY29udGFpbmVyLCBnZXR0ZXJOYW1lLAogICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgY2FsbE5hbWVzLCBmdW5zT3JOYW1lcywgZnVuVHlwZSwgYXBwbHlJbmRleCkgewogIC8vIFRPRE8oc3JhKTogU3BlY2lhbGl6ZSBpbnN0YWxsVGVhck9mZiBmb3Igc3RhdGljIG1ldGhvZHMuIEl0IG1pZ2h0IGJlCiAgLy8gcG9zc2libGUgdG8gaGFuZGxlIHNvbWUgdmVyeSBjb21tb24gc2ltcGxlIGNhc2VzIGRpcmVjdGx5LgogIHJldHVybiBpbnN0YWxsVGVhck9mZigKICAgICAgY29udGFpbmVyLCBnZXR0ZXJOYW1lLCB0cnVlLCBmYWxzZSwKICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICBjYWxsTmFtZXMsIGZ1bnNPck5hbWVzLCBmdW5UeXBlLCBhcHBseUluZGV4KTsKfQoKZnVuY3Rpb24gaW5zdGFsbEluc3RhbmNlVGVhck9mZigKICAgIGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwgaXNJbnRlcmNlcHRlZCwKICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgIGNhbGxOYW1lcywgZnVuc09yTmFtZXMsIGZ1blR5cGUsIGFwcGx5SW5kZXgpIHsKICAvLyBUT0RPKHNyYSk6IFNwZWNpYWxpemUgaW5zdGFsbFRlYXJPZmYgZm9yIGluc3RhbmNlIG1ldGhvZHMuCiAgcmV0dXJuIGluc3RhbGxUZWFyT2ZmKAogICAgICBjb250YWluZXIsIGdldHRlck5hbWUsIGZhbHNlLCBpc0ludGVyY2VwdGVkLAogICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50LCBvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgIGNhbGxOYW1lcywgZnVuc09yTmFtZXMsIGZ1blR5cGUsIGFwcGx5SW5kZXgpOwp9CgovLyBJbnN0ZWFkIG9mIHNldHRpbmcgdGhlIGludGVyY2VwdG9yIHRhZ3MgZGlyZWN0bHkgd2UgdXNlIHRoaXMgdXBkYXRlCi8vIGZ1bmN0aW9uLiBUaGlzIG1ha2VzIGl0IGVhc2llciBmb3IgZGVmZXJyZWQgZnJhZ21lbnRzIHRvIGNvbnRyaWJ1dGUgdG8gdGhlCi8vIGVtYmVkZGVkIGdsb2JhbC4KZnVuY3Rpb24gc2V0T3JVcGRhdGVJbnRlcmNlcHRvcnNCeVRhZyhuZXdUYWdzKSB7CiAgdmFyIHRhZ3MgPSAjZW1iZWRkZWRJbnRlcmNlcHRvclRhZ3M7CiAgaWYgKCF0YWdzKSB7CiAgICAjZW1iZWRkZWRJbnRlcmNlcHRvclRhZ3MgPSBuZXdUYWdzOwogICAgcmV0dXJuOwogIH0KICBjb3B5UHJvcGVydGllcyhuZXdUYWdzLCB0YWdzKTsKfQoKLy8gSW5zdGVhZCBvZiBzZXR0aW5nIHRoZSBsZWFmIHRhZ3MgZGlyZWN0bHkgd2UgdXNlIHRoaXMgdXBkYXRlCi8vIGZ1bmN0aW9uLiBUaGlzIG1ha2VzIGl0IGVhc2llciBmb3IgZGVmZXJyZWQgZnJhZ21lbnRzIHRvIGNvbnRyaWJ1dGUgdG8gdGhlCi8vIGVtYmVkZGVkIGdsb2JhbC4KZnVuY3Rpb24gc2V0T3JVcGRhdGVMZWFmVGFncyhuZXdUYWdzKSB7CiAgdmFyIHRhZ3MgPSAjZW1iZWRkZWRMZWFmVGFnczsKICBpZiAoIXRhZ3MpIHsKICAgICNlbWJlZGRlZExlYWZUYWdzID0gbmV3VGFnczsKICAgIHJldHVybjsKICB9CiAgY29weVByb3BlcnRpZXMobmV3VGFncywgdGFncyk7Cn0KCi8vIFVwZGF0ZXMgdGhlIHR5cGVzIGVtYmVkZGVkIGdsb2JhbC4KZnVuY3Rpb24gdXBkYXRlVHlwZXMobmV3VHlwZXMpIHsKICB2YXIgdHlwZXMgPSAjZW1iZWRkZWRUeXBlczsKICB2YXIgbGVuZ3RoID0gdHlwZXMubGVuZ3RoOwogIC8vIFRoZSB0ZWFyLW9mZiBmdW5jdGlvbiB1c2VzIGFub3RoZXIgJ3R5cGVzT2Zmc2V0JyB2YWx1ZSBjYWNoZWQgaW4KICAvLyBbaW5pdGlhbGl6ZURlZmVycmVkSHVua10gc28gW3VwZGF0ZVR5cGVzXSBjYW4gYmUgY2FsbGVkIGVpdGhlciBiZWZvcmUgb3IKICAvLyBhZnRlciB0aGUgdGVhcm9mZnMgaGF2ZSBiZWVuIGluc3RhbGxlZC4KICB0eXBlcy5wdXNoLmFwcGx5KHR5cGVzLCBuZXdUeXBlcyk7CiAgcmV0dXJuIGxlbmd0aDsKfQoKLy8gVXBkYXRlcyB0aGUgZ2l2ZW4gaG9sZGVyIHdpdGggdGhlIHByb3BlcnRpZXMgb2YgdGhlIFtuZXdIb2xkZXJdLgovLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBhIGRlZmVycmVkIGZyYWdtZW50IGlzIGluaXRpYWxpemVkLgpmdW5jdGlvbiB1cGRhdGVIb2xkZXIoaG9sZGVyLCBuZXdIb2xkZXIpIHsKICBjb3B5UHJvcGVydGllcyhuZXdIb2xkZXIsIGhvbGRlcik7CiAgcmV0dXJuIGhvbGRlcjsKfQoKdmFyICNodW5rSGVscGVycyA9IChmdW5jdGlvbigpewogIHZhciBta0luc3RhbmNlID0gZnVuY3Rpb24oCiAgICAgIGlzSW50ZXJjZXB0ZWQsIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgY2FsbE5hbWVzLCBhcHBseUluZGV4KSB7CiAgICByZXR1cm4gZnVuY3Rpb24oY29udGFpbmVyLCBnZXR0ZXJOYW1lLCBuYW1lLCBmdW5UeXBlKSB7CiAgICAgIHJldHVybiBpbnN0YWxsSW5zdGFuY2VUZWFyT2ZmKAogICAgICAgICAgY29udGFpbmVyLCBnZXR0ZXJOYW1lLCBpc0ludGVyY2VwdGVkLAogICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwgb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICAgICAgY2FsbE5hbWVzLCBbbmFtZV0sIGZ1blR5cGUsIGFwcGx5SW5kZXgpOwogICAgfQogIH0sCgogIG1rU3RhdGljID0gZnVuY3Rpb24oCiAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgY2FsbE5hbWVzLCBhcHBseUluZGV4KSB7CiAgICByZXR1cm4gZnVuY3Rpb24oY29udGFpbmVyLCBnZXR0ZXJOYW1lLCBuYW1lLCBmdW5UeXBlKSB7CiAgICAgIHJldHVybiBpbnN0YWxsU3RhdGljVGVhck9mZigKICAgICAgICAgIGNvbnRhaW5lciwgZ2V0dGVyTmFtZSwKICAgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsIG9wdGlvbmFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlcywKICAgICAgICAgIGNhbGxOYW1lcywgW25hbWVdLCBmdW5UeXBlLCBhcHBseUluZGV4KTsKICAgIH0KICB9OwoKICAvLyBUT0RPKHNyYSk6IE1pbmlmeSBwcm9wZXJ0aWVzIG9mICdodW5rSGVscGVycycuCiAgcmV0dXJuIHsKICAgIGluaGVyaXQ6IGluaGVyaXQsCiAgICBpbmhlcml0TWFueTogaW5oZXJpdE1hbnksCiAgICBtaXhpbjogbWl4aW4sCiAgICBpbnN0YWxsU3RhdGljVGVhck9mZjogaW5zdGFsbFN0YXRpY1RlYXJPZmYsCiAgICBpbnN0YWxsSW5zdGFuY2VUZWFyT2ZmOiBpbnN0YWxsSW5zdGFuY2VUZWFyT2ZmLAoKICAgICAgICAvLyBVbmludGVyY2VwdGVkIG1ldGhvZHMuCiAgICBfaW5zdGFuY2VfMHU6IG1rSW5zdGFuY2UoMCwgMCwgbnVsbCwgWyNjYWxsMHNlbGVjdG9yXSwgMCksCiAgICBfaW5zdGFuY2VfMXU6IG1rSW5zdGFuY2UoMCwgMSwgbnVsbCwgWyNjYWxsMXNlbGVjdG9yXSwgMCksCiAgICBfaW5zdGFuY2VfMnU6IG1rSW5zdGFuY2UoMCwgMiwgbnVsbCwgWyNjYWxsMnNlbGVjdG9yXSwgMCksCgogICAgICAgIC8vIEludGVyY2VwdGVkIG1ldGhvZHMuCiAgICBfaW5zdGFuY2VfMGk6IG1rSW5zdGFuY2UoMSwgMCwgbnVsbCwgWyNjYWxsMHNlbGVjdG9yXSwgMCksCiAgICBfaW5zdGFuY2VfMWk6IG1rSW5zdGFuY2UoMSwgMSwgbnVsbCwgWyNjYWxsMXNlbGVjdG9yXSwgMCksCiAgICBfaW5zdGFuY2VfMmk6IG1rSW5zdGFuY2UoMSwgMiwgbnVsbCwgWyNjYWxsMnNlbGVjdG9yXSwgMCksCgogICAgICAgIC8vIFN0YXRpYyBtZXRob2RzLgogICAgX3N0YXRpY18wOiBta1N0YXRpYygwLCBudWxsLCBbI2NhbGwwc2VsZWN0b3JdLCAwKSwKICAgIF9zdGF0aWNfMTogbWtTdGF0aWMoMSwgbnVsbCwgWyNjYWxsMXNlbGVjdG9yXSwgMCksCiAgICBfc3RhdGljXzI6IG1rU3RhdGljKDIsIG51bGwsIFsjY2FsbDJzZWxlY3Rvcl0sIDApLAoKICAgIG1ha2VDb25zdExpc3Q6IG1ha2VDb25zdExpc3QsCiAgICBsYXp5OiBsYXp5LAogICAgdXBkYXRlSG9sZGVyOiB1cGRhdGVIb2xkZXIsCiAgICBjb252ZXJ0VG9GYXN0T2JqZWN0OiBjb252ZXJ0VG9GYXN0T2JqZWN0LAogICAgc2V0RnVuY3Rpb25OYW1lc0lmTmVjZXNzYXJ5OiBzZXRGdW5jdGlvbk5hbWVzSWZOZWNlc3NhcnksCiAgICB1cGRhdGVUeXBlczogdXBkYXRlVHlwZXMsCiAgICBzZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5VGFnOiBzZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5VGFnLAogICAgc2V0T3JVcGRhdGVMZWFmVGFnczogc2V0T3JVcGRhdGVMZWFmVGFncywKICB9Owp9KSgpOwoKLy8gRXZlcnkgZGVmZXJyZWQgaHVuayAoaS5lLiBmcmFnbWVudCkgaXMgYSBmdW5jdGlvbiB0aGF0IHdlIGNhbiBpbnZva2UgdG8KLy8gaW5pdGlhbGl6ZSBpdC4gQXQgdGhpcyBtb21lbnQgaXQgY29udHJpYnV0ZXMgaXRzIGRhdGEgdG8gdGhlIG1haW4gaHVuay4KZnVuY3Rpb24gaW5pdGlhbGl6ZURlZmVycmVkSHVuayhodW5rKSB7CiAgLy8gVXBkYXRlIHRoZSB0eXBlc09mZnNldCBmb3IgdGhlIG5leHQgZGVmZXJyZWQgbGlicmFyeS4KICB0eXBlc09mZnNldCA9ICNlbWJlZGRlZFR5cGVzLmxlbmd0aDsKCiAgLy8gVE9ETyhmbG9pdHNjaCk6IGV4dGVuZCBuYXRpdmVzLgogIGh1bmsoaHVua0hlbHBlcnMsICNlbWJlZGRlZEdsb2JhbHNPYmplY3QsIGhvbGRlcnMsICNzdGF0aWNTdGF0ZSk7Cn0KCi8vIFJldHVybnMgdGhlIGdsb2JhbCB3aXRoIHRoZSBnaXZlbiBbbmFtZV0uCmZ1bmN0aW9uIGdldEdsb2JhbEZyb21OYW1lKG5hbWUpIHsKICAvLyBUT0RPKGZsb2l0c2NoKTogd2UgYXJlIHJ1bm5pbmcgdGhyb3VnaCBhbGwgaG9sZGVycy4gU2luY2UgbmVnYXRpdmUKICAvLyBsb29rdXBzIGFyZSBleHBlbnNpdmUgd2UgbWlnaHQgbmVlZCB0byBpbXByb3ZlIHRoaXMuCiAgLy8gUmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgYWxsIG5hbWVzIGFyZSB1bmlxdWUgYWNyb3NzIGFsbCBob2xkZXJzLgogIGZvciAodmFyIGkgPSAwOyBpIDwgaG9sZGVycy5sZW5ndGg7IGkrKykgewogICAgLy8gVGhlIGNvbnN0YW50IGhvbGRlciByZXVzZXMgdGhlIHNhbWUgbmFtZXMuIFRoZXJlZm9yZSB3ZSBtdXN0IHNraXAgaXQuCiAgICBpZiAoaG9sZGVyc1tpXSA9PSAjY29uc3RhbnRIb2xkZXJSZWZlcmVuY2UpIGNvbnRpbnVlOwogICAgLy8gUmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgYWxsIHZhcmlhYmxlcyBhcmUgdW5pcXVlLgogICAgaWYgKGhvbGRlcnNbaV1bbmFtZV0pIHJldHVybiBob2xkZXJzW2ldW25hbWVdOwogIH0KfQoKaWYgKCNoYXNTb2Z0RGVmZXJyZWRDbGFzc2VzKSB7CiAgLy8gTG9hZHMgdGhlIHNvZnQtZGVmZXJyZWQgY2xhc3NlcyBhbmQgaW5pdGlhbGl6ZXMgdGhlbS4KICAvLyBVcGRhdGVzIHRoZSBwcm90b3R5cGUgb2YgdGhlIGdpdmVuIG9iamVjdC4KICBmdW5jdGlvbiBzb2Z0RGVmKG8pIHsKICAgIHNvZnREZWYgPSBmdW5jdGlvbihvKSB7fTsgIC8vIFJlcGxhY2Ugb3Vyc2VsdmVzLgogICAgI2RlZmVycmVkR2xvYmFsWyNzb2Z0SWRdKAogICAgICAgIGhvbGRlcnMsICNlbWJlZGRlZEdsb2JhbHNPYmplY3QsICNzdGF0aWNTdGF0ZSwKICAgICAgICBodW5rSGVscGVycyk7CiAgICBpZiAobyAhPSBudWxsKSB7CiAgICAgIC8vIFRPRE8oMjk1NzQpOiBzaG91bGQgd2UgZG8gc29tZXRoaW5nIGRpZmZlcmVudCBmb3IgRmlyZWZveD8KICAgICAgLy8gSWYgd2UgcmVjb21tZW5kIHRoYXQgdGhlIHByb2dyYW0gdHJpZ2dlcnMgdGhlIGxvYWQgYnkgaXRzZWxmIGJlZm9yZQogICAgICAvLyBjbGFzc2VzIGFyZSBuZWVkZWQsIHRoZW4gdGhpcyBsaW5lIHNob3VsZCByYXJlbHkgYmUgaGl0LgogICAgICAvLyBBbHNvLCBpdCBpcyBvbmx5IGhpdCBhdCBtb3N0IG9uY2UgKHBlciBzb2Z0LWRlZmVycmVkIGNodW5rKS4KICAgICAgby5fX3Byb3RvX18gPSBvLmNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICAgIH0KICB9Cn0KCmlmICgjaXNUcmFja2luZ0FsbG9jYXRpb25zKSB7CiAgdmFyIGFsbG9jYXRpb25zID0gI2RlZmVycmVkR2xvYmFsWydhbGxvY2F0aW9ucyddID0ge307Cn0KCi8vIENyZWF0ZXMgdGhlIGhvbGRlcnMuCiNob2xkZXJzOwoKLy8gSWYgdGhlIG5hbWUgaXMgbm90IHNldCBvbiB0aGUgZnVuY3Rpb25zLCBkbyBpdCBub3cuCmh1bmtIZWxwZXJzLnNldEZ1bmN0aW9uTmFtZXNJZk5lY2Vzc2FyeShob2xkZXJzKTsKCi8vIFRPRE8oZmxvaXRzY2gpOiB3ZSBzaG91bGQgYnVpbGQgdGhpcyBvYmplY3QgYXMgYSBsaXRlcmFsLgp2YXIgI3N0YXRpY1N0YXRlRGVjbGFyYXRpb24gPSB7fTsKCi8vIFNldHMgdGhlIHByb3RvdHlwZXMgb2YgY2xhc3Nlcy4KI3Byb3RvdHlwZXM7Ci8vIFNldHMgYWxpYXNlcyBvZiBtZXRob2RzIChvbiB0aGUgcHJvdG90eXBlcyBvZiBjbGFzc2VzKS4KI2FsaWFzZXM7Ci8vIEluc3RhbGxzIHRoZSB0ZWFyLW9mZnMgb2YgZnVuY3Rpb25zLgojdGVhck9mZnM7Ci8vIEJ1aWxkcyB0aGUgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgojaW5oZXJpdGFuY2U7CgovLyBFbWl0cyB0aGUgZW1iZWRkZWQgZ2xvYmFscy4gVGhpcyBuZWVkcyB0byBiZSBiZWZvcmUgY29uc3RhbnRzIHNvIHRoZSBlbWJlZGRlZAovLyBnbG9iYWwgdHlwZSByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSBmb3IgZ2VuZXJhdGluZyBjb25zdGFudHMuCiNlbWJlZGRlZEdsb2JhbHNQYXJ0MTsKCi8vIEFkZHMgdGhlIHN1YnR5cGUgcnVsZXMgZm9yIHRoZSBuZXcgUlRJLgojdHlwZVJ1bGVzOwoKLy8gSW5zdGFudGlhdGVzIGFsbCBjb25zdGFudHMuCiNjb25zdGFudHM7CgovLyBBZGRzIHRvIHRoZSBlbWJlZGRlZCBnbG9iYWxzLiBBIGZldyBnbG9iYWxzIHJlZmVyIHRvIGNvbnN0YW50cy4KI2VtYmVkZGVkR2xvYmFsc1BhcnQyOyAKCi8vIEluaXRpYWxpemVzIHRoZSBzdGF0aWMgbm9uLWZpbmFsIGZpZWxkcyAod2l0aCB0aGVpciBjb25zdGFudCB2YWx1ZXMpLgojc3RhdGljTm9uRmluYWxGaWVsZHM7Ci8vIENyZWF0ZXMgbGF6eSBnZXR0ZXJzIGZvciBzdGF0aWNzIHRoYXQgbXVzdCBydW4gaW5pdGlhbGl6ZXJzIG9uIGZpcnN0IGFjY2Vzcy4KI2xhenlTdGF0aWNzOwoKLy8gU2V0cyB1cCB0aGUgbmF0aXZlIHN1cHBvcnQuCi8vIE5hdGl2ZS1zdXBwb3J0IHVzZXMgc2V0T3JVcGRhdGVJbnRlcmNlcHRvcnNCeVRhZyBhbmQgc2V0T3JVcGRhdGVMZWFmVGFncy4KI25hdGl2ZVN1cHBvcnQ7CgovLyBTZXRzIHVwIHRoZSBqcy1pbnRlcm9wIHN1cHBvcnQuCiNqc0ludGVyb3BTdXBwb3J0OwoKLy8gRW5zdXJlIGhvbGRlcnMgYXJlIGluIGZhc3QgbW9kZSwgbm93IHdlIGhhdmUgZmluaXNoZWQgYWRkaW5nIHRoaW5ncy4KY29udmVydEFsbFRvRmFzdE9iamVjdChob2xkZXJzKTsKY29udmVydFRvRmFzdE9iamVjdCgjc3RhdGljU3RhdGUpOwoKLy8gSW52b2tlcyBtYWluIChtYWtpbmcgc3VyZSB0aGF0IGl0IHJlY29yZHMgdGhlICdjdXJyZW50LXNjcmlwdCcgdmFsdWUpLgojaW52b2tlTWFpbjsKfSkoKQpodW5rSGVscGVyc2RpcmVjdEFjY2Vzc1Rlc3RFeHByZXNzaW9uICAoZnVuY3Rpb24gKCkgewogICAgdmFyIGNscyA9IGZ1bmN0aW9uICgpIHt9OwogICAgY2xzLnByb3RvdHlwZSA9IHsncCc6IHt9fTsKICAgIHZhciBvYmplY3QgPSBuZXcgY2xzKCk7CiAgICBpZiAoIShvYmplY3QuX19wcm90b19fICYmIG9iamVjdC5fX3Byb3RvX18ucCA9PT0gY2xzLnByb3RvdHlwZS5wKSkKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIHRyeSB7CiAgICAgIC8vIEFyZSB3ZSBydW5uaW5nIG9uIGEgcGxhdGZvcm0gd2hlcmUgdGhlIHBlcmZvcm1hbmNlIGlzIGdvb2Q/CiAgICAgIC8vIChpLmUuIENocm9tZSBvciBkOCkuCgogICAgICAvLyBDaHJvbWUgdXNlckFnZW50PwogICAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPSAidW5kZWZpbmVkIiAmJgogICAgICAgICAgdHlwZW9mIG5hdmlnYXRvci51c2VyQWdlbnQgPT0gInN0cmluZyIgJiYKICAgICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lLyIpID49IDApIHJldHVybiB0cnVlOwogICAgICAvLyBkOCB2ZXJzaW9uKCkgbG9va3MgbGlrZSAiTi5OLk4uTiIsIGpzc2hlbGwgdmVyc2lvbigpIGxpa2UgIk4iLgogICAgICBpZiAodHlwZW9mIHZlcnNpb24gPT0gImZ1bmN0aW9uIiAmJgogICAgICAgICAgdmVyc2lvbi5sZW5ndGggPT0gMCkgewogICAgICAgIHZhciB2ID0gdmVyc2lvbigpOwogICAgICAgIGlmICgvXlxkK1wuXGQrXC5cZCtcLlxkKyQvLnRlc3QodikpIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9IGNhdGNoKF8pIHt9CgogICAgcmV0dXJuIGZhbHNlOwogIH0pKCkKY3ljbGljVGhyb3d0ZWFyT2ZmQ29kZWVtYmVkZGVkVHlwZXNlbWJlZGRlZEludGVyY2VwdG9yVGFnc2VtYmVkZGVkTGVhZlRhZ3NlbWJlZGRlZEdsb2JhbHNPYmplY3RzdGF0aWNTdGF0ZURlY2xhcmF0aW9uc3RhdGljU3RhdGVjb25zdGFudEhvbGRlclJlZmVyZW5jZWJ1aWxkQ29uc3RhbnRIb2xkZXJSZWZlcmVuY2VkZWZhdWx0QXJndW1lbnRWYWx1ZXNkZWZlcnJlZEdsb2JhbHNvZnRJZGlzVHJhY2tpbmdBbGxvY2F0aW9uc3Byb3RvdHlwZXNlbWl0UHJvdG90eXBlc2luaGVyaXRhbmNlZW1pdEluaGVyaXRhbmNlYWxpYXNlc2VtaXRJbnN0YW5jZU1ldGhvZEFsaWFzZXN0ZWFyT2Zmc2VtaXRJbnN0YWxsVGVhck9mZnNlbWl0Q29uc3RhbnRzZW1pdFN0YXRpY05vbkZpbmFsRmllbGRzbGF6eVN0YXRpY3NlbWl0TGF6aWx5SW5pdGlhbGl6ZWRTdGF0aWNzZW1iZWRkZWRHbG9iYWxzUGFydDFlbWl0RW1iZWRkZWRHbG9iYWxzUGFydDFlbWJlZGRlZEdsb2JhbHNQYXJ0MmVtaXRFbWJlZGRlZEdsb2JhbHNQYXJ0MmVtaXRUeXBlUnVsZXNuYXRpdmVTdXBwb3J0ZW1pdE5hdGl2ZVN1cHBvcnRqc0ludGVyb3BTdXBwb3J0Y2FsbDBzZWxlY3RvcmNhbGwxc2VsZWN0b3JjYWxsMnNlbGVjdG9yI2RlZmVycmVkR2xvYmFsWyNzb2Z0SWRdID0KICBmdW5jdGlvbihob2xkZXJzTGlzdCwgI2VtYmVkZGVkR2xvYmFsc09iamVjdCwgI3N0YXRpY1N0YXRlLAogICAgICAgICAgIGh1bmtIZWxwZXJzKSB7CgovLyBJbnN0YWxscyB0aGUgaG9sZGVycyBhcyBsb2NhbCB2YXJpYWJsZXMuCiNpbnN0YWxsSG9sZGVyc0FzTG9jYWxzOwovLyBTZXRzIHRoZSBwcm90b3R5cGVzIG9mIHRoZSBuZXcgY2xhc3Nlcy4KI3Byb3RvdHlwZXM7Ci8vIFNldHMgYWxpYXNlcyBvZiBtZXRob2RzIChvbiB0aGUgcHJvdG90eXBlcyBvZiBjbGFzc2VzKS4KI2FsaWFzZXM7Ci8vIEluc3RhbGxzIHRoZSB0ZWFyLW9mZnMgb2YgZnVuY3Rpb25zLgojdGVhck9mZnM7Ci8vIEJ1aWxkcyB0aGUgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgojaW5oZXJpdGFuY2U7Cn1pbnN0YWxsSG9sZGVyc0FzTG9jYWxzZW1pdEluc3RhbGxIb2xkZXJzQXNMb2NhbHNob2xkZXJJbml0c2hvbGRlcnNMaXN0WyNddXBkYXRlSG9sZGVyQXNzaWdubWVudHNhY3RpdmVIb2xkZXJzI2hvbGRlciA9IGh1bmtIZWxwZXJzLnVwZGF0ZUhvbGRlcihob2xkZXJzTGlzdFsjaW5kZXhdLCAjaG9sZGVyKSNob2xkZXIgPSBob2xkZXJzTGlzdFsjaW5kZXhdY2xhc3NQcm90b3R5cGVzaW5jbHVkZUNsb3N1cmVzY2xvc3VyZVByb3RvdHlwZXNtZXRob2RBbGlhc2VzbGF6eUluaXRpYWxpemVyc2Z1bmN0aW9uKGh1bmtIZWxwZXJzLCAjZW1iZWRkZWRHbG9iYWxzT2JqZWN0LCBob2xkZXJzTGlzdCwgI3N0YXRpY1N0YXRlKSB7CgovLyBCdWlsZHMgdGhlIGhvbGRlcnMuIFRoZXkgb25seSBjb250YWluIHRoZSBkYXRhIGZvciBuZXcgaG9sZGVycy4KI2hvbGRlcnM7CgovLyBJZiB0aGUgbmFtZSBpcyBub3Qgc2V0IG9uIHRoZSBmdW5jdGlvbnMsIGRvIGl0IG5vdy4KaHVua0hlbHBlcnMuc2V0RnVuY3Rpb25OYW1lc0lmTmVjZXNzYXJ5KCNkZWZlcnJlZEhvbGRlcnNMaXN0KTsKCi8vIFVwZGF0ZXMgdGhlIGhvbGRlcnMgb2YgdGhlIG1haW4tZnJhZ21lbnQuIFVzZXMgdGhlIHByb3ZpZGVkIGhvbGRlcnNMaXN0IHRvCi8vIGFjY2VzcyB0aGUgbWFpbiBob2xkZXJzLgovLyBUaGUgbG9jYWwgaG9sZGVycyBhcmUgcmVwbGFjZWQgYnkgdGhlIGNvbWJpbmVkIGhvbGRlcnMuIFRoaXMgaXMgbmVjZXNzYXJ5Ci8vIGZvciB0aGUgaW5oZXJpdGFuY2Ugc2V0dXAgYmVsb3cuCiN1cGRhdGVIb2xkZXJzOwovLyBTZXRzIHRoZSBwcm90b3R5cGVzIG9mIHRoZSBuZXcgY2xhc3Nlcy4KI3Byb3RvdHlwZXM7Ci8vIEFkZCBzaWduYXR1cmUgZnVuY3Rpb24gdHlwZXMgYW5kIGNvbXB1dGUgdGhlIHR5cGVzIG9mZnNldCBpbiBgaW5pdC50eXBlc2AuCi8vIFRoZXNlIGNhbiBvbmx5IHJlZmVyIHRvIHJlZ3VsYXIgY2xhc3NlcyBhbmQgaW4gRGFydCAyIG9ubHkgY2xvc3VyZXMgaGF2ZQovLyBmdW5jdGlvbiB0eXBlcyBzbyB0aGUgYHR5cGVzT2Zmc2V0YCBoYXMgYmVlbiBzYWZlbHkgY29tcHV0ZWQgYmVmb3JlIGl0J3MKLy8gcmVmZXJyZWQgaW4gdGhlIHNpZ25hdHVyZXMgb2YgdGhlIGBjbG9zdXJlc2AgYmVsb3cuCnZhciAjdHlwZXNPZmZzZXQgPSBodW5rSGVscGVycy51cGRhdGVUeXBlcygjdHlwZXMpOwojY2xvc3VyZXM7Ci8vIFNldHMgYWxpYXNlcyBvZiBtZXRob2RzIChvbiB0aGUgcHJvdG90eXBlcyBvZiBjbGFzc2VzKS4KI2FsaWFzZXM7Ci8vIEluc3RhbGxzIHRoZSB0ZWFyLW9mZnMgb2YgZnVuY3Rpb25zLgojdGVhck9mZnM7Ci8vIEJ1aWxkcyB0aGUgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgojaW5oZXJpdGFuY2U7CgovLyBBZGRzIHRoZSBzdWJ0eXBlIHJ1bGVzIGZvciB0aGUgbmV3IFJUSS4KI3R5cGVSdWxlczsKCi8vIEluc3RhbnRpYXRlcyBhbGwgY29uc3RhbnRzIG9mIHRoaXMgZGVmZXJyZWQgZnJhZ21lbnQuCi8vIE5vdGUgdGhhdCB0aGUgY29uc3RhbnQtaG9sZGVyIGhhcyBiZWVuIHVwZGF0ZWQgZWFybGllciBhbmQgc3RvcmluZyB0aGUKLy8gY29uc3RhbnQgdmFsdWVzIGluIHRoZSBjb25zdGFudC1ob2xkZXIgbWFrZXMgdGhlbSBhdmFpbGFibGUgZ2xvYmFsbHkuCiNjb25zdGFudHM7Ci8vIEluaXRpYWxpemVzIHRoZSBzdGF0aWMgbm9uLWZpbmFsIGZpZWxkcyAod2l0aCB0aGVpciBjb25zdGFudCB2YWx1ZXMpLgojc3RhdGljTm9uRmluYWxGaWVsZHM7Ci8vIENyZWF0ZXMgbGF6eSBnZXR0ZXJzIGZvciBzdGF0aWNzIHRoYXQgbXVzdCBydW4gaW5pdGlhbGl6ZXJzIG9uIGZpcnN0IGFjY2Vzcy4KI2xhenlTdGF0aWNzOwoKLy8gTmF0aXZlLXN1cHBvcnQgdXNlcyBzZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5VGFnIGFuZCBzZXRPclVwZGF0ZUxlYWZUYWdzLgojbmF0aXZlU3VwcG9ydDsKfWRlZmVycmVkSG9sZGVyc0xpc3R1cGRhdGVIb2xkZXJzcHJvcGVydHlNYXBlbWl0U3RhdGljTWV0aG9kZW1pdENvbnN0cnVjdG9yaG9sZGVySW5pdGlhbGl6YXRpb25zdmFyIGhvbGRlcnMgPSAjY29uc3RhbnRIb2xkZXJqc01ldGhvZHNmdW5jdGlvbiAjKCkgeyB9dGhpc1JlZnNvZnREZWYodGhpcylxdWFsaWZpZWROYW1lYWxsb2NhdGlvbnNbIiJdID0gdHJ1ZWVtaXR0ZWRGaWVsZHN1bmRlcnNjb3JldmFyICMgPSB0aGlzO2NoYWluTGVuZ3RocHJldmlvdXNDb25zdGFudGZsdXNoQXNzaWdubWVudCM7Iy4jID0gI2Z1bmN0aW9uICMoIykgeyAjIH1wcm90byMucHJvdG90eXBlID0gIztlbWl0UHJvdG90eXBlZ2V0dGVyc1NldHRlcnNnZW5lcmF0ZUdldHRlcnNTZXR0ZXJzYWxsTWV0aG9kc2VtaXRJbnN0YW5jZU1ldGhvZHByb3BObyBjb25zdGFudCB2YWx1ZSBmb3IgZWxpZGVkIGZpZWxkOiBmdW5jdGlvbigpIHsgcmV0dXJuICM7IH1mdW5jdGlvbihyZWNlaXZlcikgeyByZXR1cm4gcmVjZWl2ZXJbI107IH1mdW5jdGlvbihyZWNlaXZlcikgeyByZXR1cm4gdGhpc1sjXTsgfWZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpc1sjXTsgfWZ1bmN0aW9uKCkgeyB9ZnVuY3Rpb24ocmVjZWl2ZXIsIHZhbCkgeyByZXR1cm4gcmVjZWl2ZXJbI10gPSB2YWw7IH1mdW5jdGlvbihyZWNlaXZlciwgdmFsKSB7IHJldHVybiB0aGlzWyNdID0gdmFsOyB9ZnVuY3Rpb24odmFsKSB7IHJldHVybiB0aGlzWyNdID0gdmFsOyB9Z2V0dGVyc3N0dWJNZXRob2Rmb3JjZUFkZGFwcGx5TmFtZV9lbmNvZGVPcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXNpbmhlcml0Q2FsbHNtaXhpbkNhbGxzY2xhc3Nlc0luRnJhZ21lbnRfbWl4aW5odW5rSGVscGVycy5taXhpbnN1cGVyY2xhc3NSZWZlcmVuY2VfaW5oZXJpdGh1bmtIZWxwZXJzLmluaGVyaXRsaXN0RWxlbWVudHNmaXJzdENsYXNzX2luaGVyaXRNYW55aHVua0hlbHBlcnMuaW5oZXJpdE1hbnl3cmFwUGhhc2VmaXJzdEFsaWFzdmFyIF8gPSAjLnByb3RvdHlwZTtfID0gIy5wcm90b3R5cGVfLiMgPSBfLiMoZnVuY3Rpb24gIygpeyN9KSgpO2VtaXRJbnN0YWxsVGVhck9mZmNhbGxOYW1lc2Z1bnNPck5hbWVzYWRkRnVuT3JOYW1lY2FsbE5hbWVBcnJheWZ1bnNPck5hbWVzQXJyYXlpbnN0YWxsX3N0YXRpY19odW5rSGVscGVycy5fc3RhdGljXyAgICAgICAgICAgICAgICAjaW5zdGFsbCgjY29udGFpbmVyLCAjZ2V0dGVyTmFtZSwgI25hbWUsICNmdW5UeXBlKWZ1blR5cGVpbnN0YWxsZWROYW1lX3N0YXRpY2h1bmtIZWxwZXJzLmluc3RhbGxTdGF0aWNUZWFyT2ZmICAgICAgICAgICAgI2luc3RhbGwoI2NvbnRhaW5lciwgI2dldHRlck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICNyZXF1aXJlZFBhcmFtZXRlckNvdW50LCAjb3B0aW9uYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgI2NhbGxOYW1lcywgI2Z1bnNPck5hbWVzLCAjZnVuVHlwZSwgI2FwcGx5SW5kZXgpaXNJbnRlcmNlcHRlZFRhZ19pbnN0YW5jZV9odW5rSGVscGVycy5faW5zdGFuY2VfX2luc3RhbmNlaHVua0hlbHBlcnMuaW5zdGFsbEluc3RhbmNlVGVhck9mZiAgICAgICAgICAgICNpbnN0YWxsKCNjb250YWluZXIsICNnZXR0ZXJOYW1lLCAjaXNJbnRlcmNlcHRlZCwKICAgICAgICAgICAgICAgICAgICAgI3JlcXVpcmVkUGFyYW1ldGVyQ291bnQsICNvcHRpb25hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICNjYWxsTmFtZXMsICNmdW5zT3JOYW1lcywgI2Z1blR5cGUsICNhcHBseUluZGV4KXZhciBfO2luc3RhbGxUZWFyT2Zmc2hhc0xpc3R2YXIgbWFrZUNvbnN0TGlzdCA9IGh1bmtIZWxwZXJzLm1ha2VDb25zdExpc3Q7Iy4jID0gIztObyBjb2RlIGZvciAjLiMgPSAjKCk7c3RhdGljRmllbGRzIygjLCAjLCAjLCAjKTtfbGF6eWh1bmtIZWxwZXJzLmxhenllbWl0RW1iZWRkZWRHbG9iYWxzRm9yRGVmZXJyZWRMb2FkaW5nT2JqZWN0LmNyZWF0ZShudWxsKWlzSHVua0xvYWRlZEZ1bmN0aW9uZnVuY3Rpb24oaGFzaCkgeyByZXR1cm4gISFbaGFzaF07IH1pc0h1bmtJbml0aWFsaXplZEZ1bmN0aW9uZnVuY3Rpb24oaGFzaCkgeyByZXR1cm4gISEjZGVmZXJyZWRJbml0aWFsaXplZFtoYXNoXTsgfWluaXRpYWxpemVMb2FkZWRIdW5rRnVuY3Rpb24gICAgICAgICAgICBmdW5jdGlvbihoYXNoKSB7CiAgICAgICAgICAgICAgdmFyIGh1bmsgPSBbaGFzaF07CiAgICAgICAgICAgICAgaWYgKGh1bmsgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgIkRlZmVycmVkTG9hZGluZyBzdGF0ZSBlcnJvcjogY29kZSB3aXRoIGhhc2ggJyIgKwogICAgICAgICAgICAgICAgICAgIGhhc2ggKyAiJyB3YXMgbm90IGxvYWRlZCI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGluaXRpYWxpemVEZWZlcnJlZEh1bmsoaHVuayk7CiAgICAgICAgICAgICAgI2RlZmVycmVkSW5pdGlhbGl6ZWRbaGFzaF0gPSB0cnVlOwogICAgICAgICAgICB9ZGVmZXJyZWRMb2FkSGFzaGVzZnJhZ21lbnRJbmRleGVzZnJhZ21lbnRVcmlzZnJhZ21lbnRIYXNoZXNsaWJyYXJ5UGFydHNNYXBFbnRyaWVzZnJhZ21lbnRMaXN0aW5kZXhlc2ZyYWdtZW50SGFzaHNldFZhbHVlZW1pdE1hbmdsZWRHbG9iYWxOYW1lc25hdGl2ZUNsYXNzZXNOZWVkaW5nVW5tYW5nbGVkTmFtZWVtaXRHZXRUeXBlRnJvbU5hbWVnZXRHbG9iYWxGcm9tTmFtZWVtaXRNZXRhZGF0YW1ldGFkYXRhR2xvYmFsc2NyZWF0ZUdsb2JhbG1haW5Vbml0Y3JlYXRlUnRpVW5pdmVyc2VnbG9iYWxzT2JqZWN0dmFyIGluaXQgPSAjO2luaXQuIyA9ICM7Iyhpbml0LiMsSlNPTi5wYXJzZSgjKSk7dW5pdmVyc2VGaWVsZHNpbml0RmllbGRuZXcgTWFwKCkgICAgICAgIC8vIE9uIFY4LCB0aGUgJ2ludGVybicgZnVuY3Rpb24gY29udmVydHMgYSBzdHJpbmcgdG8gYSBzeW1ib2wsIHdoaWNoCiAgICAgICAgLy8gbWFrZXMgcHJvcGVydHkgYWNjZXNzIG11Y2ggZmFzdGVyLgogICAgICAgIC8vIFRPRE8oc3JhKTogVXNlIFN5bWJvbCBvbiBub24tSUUxMSBicm93c2Vycy4KICAgICAgICBmdW5jdGlvbiAocykgewogICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgIG9bc10gPSAxOwogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGh1bmtIZWxwZXJzLmNvbnZlcnRUb0Zhc3RPYmplY3QobykpWzBdOwogICAgICAgIH1zdWJjbGFzc0Fzc2lnbm1lbnRzaHVua0hlbHBlcnMuc2V0T3JVcGRhdGVJbnRlcmNlcHRvcnNCeVRhZygjKTtodW5rSGVscGVycy5zZXRPclVwZGF0ZUxlYWZUYWdzKCMpO0xvY2FsQWxpYXNlc2luaXRpYWxpemF0aW9uc0hvbGRlckNvZGVEZWZlcnJlZExvYWRpbmdTdGF0ZURlZmVycmVkUHJpbWFyeUV4cHJlc3Npb250ZWFyT2ZmUHJvcGVydHlOYW1lJHRlYXJPZmZjYWNoZWRDbGFzc0ZpZWxkTmFtZXMkY2FjaGVkRmllbGROYW1lc21haW5Cb2lsZXJwbGF0ZWRlZmVycmVkQm9pbGVycGxhdGVEYXJ0MnNvZnREZWZlcnJlZEJvaWxlcnBsYXRlU1VDQ0VTU19Tc2FJbnN0cnVjdGlvblNlbGVjdGlvbiZIQmFzZVZpc2l0b3ImQ29kZWdlblBoYXNlU3NhSW5zdHJ1Y3Rpb25TZWxlY3Rpb25zaW1wbGVPcF9pbnRlcmNlcHRlZHRyeVJlcGxhY2VFeHBsaWNpdFJlY2VpdmVyV2l0aER1bW15cmVjZWl2ZXJBcmd1bWVudGlzTWF0Y2hpbmdSZWFkbm9NYXRjaGluZ1JlYWRyZXBsYWNlT3BwbHVzT3JNaW51c2luY3JlbWVudE9wcm13c2ltcGxlc2ltcGxlQmluYXJ5Yml0b3BvcGVyYW5kMW9wZXJhbmQyX1NzYVR5cGVLbm93blJlbW92ZXImSEJhc2VWaXNpdG9yJkNvZGVnZW5QaGFzZVNzYVR5cGVLbm93blJlbW92ZXJfU3NhVHJ1c3RlZENoZWNrUmVtb3ZlciZIQmFzZVZpc2l0b3ImQ29kZWdlblBoYXNlU3NhVHJ1c3RlZENoZWNrUmVtb3Zlcl9Tc2FBc3NpZ25tZW50Q2hhaW5pbmcmSEJhc2VWaXNpdG9yJkNvZGVnZW5QaGFzZVNzYUFzc2lnbm1lbnRDaGFpbmluZ3RyeUNoYWluQXNzaWdubWVudG5leHRTZXR0ZXJuZXh0U3RvcmVzaW1wbGVTb3VyY2VfU3NhSW5zdHJ1Y3Rpb25NZXJnZXImSEJhc2VWaXNpdG9yJkNvZGVnZW5QaGFzZVNzYUluc3RydWN0aW9uTWVyZ2VyZXhwZWN0ZWRJbnB1dHNwdXJlSW5wdXRzbWFya0FzR2VuZXJhdGVBdFVzZVNpdGVhbmFseXplSW5wdXRzaXNFZmZlY3RpdmVseVB1cmVpc0Fzc2lnbmVkTG9jYWxpbml0aWFsaXppbmdBc3NpZ25tZW50Q291bnRzdXBlck1ldGhvZHRyeUdlbmVyYXRlQXRVc2VTaXRlaXNCbG9ja1NpbmdsZVByZWRlY2Vzc29ydHJ5TWVyZ2luZ0V4cHJlc3Npb25zZmluZEluSW5wdXRzQW5kUG9wTm9uTWF0Y2hpbmduZXh0SW5wdXRuZXdJbnB1dHNuZXdDb3VudF9Tc2FDb25kaXRpb25NZXJnZXImSEdyYXBoVmlzaXRvciZDb2RlZ2VuUGhhc2VTc2FDb25kaXRpb25NZXJnZXJoYXNBbnlTdGF0ZW1lbnRpc1NhZmVUb0dlbmVyYXRlQXRVc2VTaXRlc3RhcnRJZnRoZW5JbnB1dGVsc2VJbnB1dG90aGVySWZvdGhlckpvaW5vdGhlclBoaW5leHRJbnN0cnVjdGlvbl9Tc2FTaGFyZVJlZ2lvbkNvbnN0YW50cyZIQmFzZVZpc2l0b3ImQ29kZWdlblBoYXNlU3NhU2hhcmVSZWdpb25Db25zdGFudHNfY291bnRDYWNoZWFibGVVc2VzY2FjaGVhYmxldXNlQ291bnRfdGhpc19oYW5kbGVOdWxsX2hhbmRsZUludF9oYW5kbGVTdHJpbmdfaXNDYWNoZWFibGVVc2VfbnVsbF9zX0V4cHJlc3Npb25OYW1lY2FuVXNlQWxpYXNlZFN1cGVyTWVtYmVyTGl2ZVJhbmdlTGl2ZUludGVydmFsZm9yQ2hlY2tjaGVja2VkSW50ZXJ2YWxsb29wVXBkYXRlcmFuZ2VpbnRlcnZhbGRpZXNBdGF0TGl2ZUVudmlyb25tZW50c3RhcnRJZGVuZElkbG9vcE1hcmtlcnN1c2VySWRleGlzdGluZ0lkYWRkTG9vcE1hcmtlcnJlbW92ZUxvb3BNYXJrZXJfU3NhTGl2ZUludGVydmFsQnVpbGRlciZIQmFzZVZpc2l0b3ImQ29kZWdlblBoYXNlU3NhTGl2ZUludGVydmFsQnVpbGRlcmluc3RydWN0aW9uSWRMaXZlSW50ZXJ2YWxCdWlsZGVyLm1hcmtJbnB1dHNBc0xpdmVJbkVudmlyb25tZW50bWFya0FzTGl2ZUluRW52aXJvbm1lbnRjaGVja2VkSW5zdHJ1Y3Rpb25Pck5vbkdlbmVyYXRlQXRVc2VTaXRlcmVtb3ZlRnJvbUVudmlyb25tZW50aWZJbnN0cnVjdGlvbnN1Y2Nlc3NvckVudnVwZGF0ZUxvb3BNYXJrZXJDb3B5IDwtIENvcHlIYW5kbGVyYWRkQ29weUNvcGllczogLCBhc3NpZ25tZW50czogVmFyaWFibGVOYW1lc293bk5hbWVjb3B5SGFuZGxlcnNhbGxVc2VkTmFtZXNzd2FwVGVtcHQwYWRkTmFtZVVzZWRWYXJpYWJsZU5hbWVyZnJlZVRlbXBvcmFyeU5hbWVzdGVtcG9yYXJ5SW5kZXh0WzAtOV0rYWxsb2NhdGVXaXRoSGludGFsbG9jYXRlVGVtcG9yYXJ5Zmlyc3RQaGlVc2VyV2l0aEVsZW1lbnRhbGxvY2F0ZU5hbWVhZGRBbGxvY2F0ZWROYW1lZnJlZU5hbWVfU3NhVmFyaWFibGVBbGxvY2F0b3ImSEJhc2VWaXNpdG9yJkNvZGVnZW5QaGFzZVNzYVZhcmlhYmxlQWxsb2NhdG9ydmFyaWFibGVOYW1lcmhhbmRsZVBoaWhhbmRsZUluc3RydWN0aW9ubmVlZHNOYW1lYXRJbnRlcnZhbGluc3RydWN0aW9uSW50ZXJ2YWxmcmVlVXNlZE5hbWVzQXRTcGVjaWFsaXplZENoZWNrc2ZpbmRBc0NoZWNrX2ZpbmRBc0NoZWNrU3NhU2ltcGxpZnlJbnRlcmNlcHRvcnNfZW5jbG9zaW5nQ2xhc3NzaG91bGRSZW1vdmV0cnlDb21wdXRlQ29uc3RhbnRJbnRlcmNlcHRvcmNhblVzZVNlbGZGb3JJbnRlcmNlcHRvcmNvbnN0YW50SW50ZXJjZXB0b3J0cnlDb21wdXRlQ29uc3RhbnRJbnRlcmNlcHRvckZyb21UeXBlZmluZERvbWluYXRvcnJld3JpdGVTZWxmSW50ZXJjZXB0b3JVc2VzcmVwbGFjZVVzZXJXaXRoaW5zdGFuY2VvZkNoZWNrb25lU2hvdEludGVyY2VwdG9yZmluaXNoSW52b2tlY2FsbFJlY2VpdmVyU3NhVHlwZVByb3BhZ2F0b3J3b3JrbWFwcGVuZGluZ09wdGltaXphdGlvbnN1cGRhdGVUeXBlcHJvY2Vzc1dvcmtsaXN0YWRkVG9Xb3JrTGlzdGFkZERlcGVuZGVudEluc3RydWN0aW9uc1RvV29ya0xpc3Rwcm9jZXNzUGVuZGluZ09wdGltaXphdGlvbnNjaGVja1Bvc2l0aXZlSW50ZWdlcm91dHB1dFR5cGVfbnVtZXJpY0ZpeHVwY29udmVydElucHV0aXNDaGVja0Vub3VnaEZvck5zbU9yQWVjaGVja1JlY2VpdmVyY2hlY2tBcmd1bWVudGFkZEFsbFVzZXJzQnV0Y2hlY2tJbnB1dHNWYWx1ZVJhbmdlSW5mb2ludFplcm9pbnRPbmVuZXdJbnRWYWx1ZW5ld0luc3RydWN0aW9uVmFsdWVuZXdQb3NpdGl2ZVZhbHVlbmV3QWRkVmFsdWVuZXdTdWJ0cmFjdFZhbHVlbmV3TmVnYXRlVmFsdWVuZXdVbmJvdW5kUmFuZ2VuZXdOb3JtYWxpemVkUmFuZ2V1cG5ld01hcmtlclJhbmdlVmFsdWVNYXJrZXJWYWx1ZXBvc2l0aXZlSW50VmFsdWVJbnRWYWx1ZS5oYXNoQ29kZUludFZhbHVlIE1heEludFZhbHVlTWF4TWluSW50VmFsdWVNaW5Vbmtub3duVmFsdWVJbnN0cnVjdGlvblZhbHVlSW5zdHJ1Y3Rpb25WYWx1ZS5oYXNoQ29kZUluc3RydWN0aW9uOiBQb3NpdGl2ZVZhbHVlQmluYXJ5T3BlcmF0aW9uVmFsdWVBZGRWYWx1ZUFkZFZhbHVlLmhhc2hDb2RlU3VidHJhY3RWYWx1ZVN1YnRyYWN0VmFsdWUuaGFzaENvZGVOZWdhdGVWYWx1ZU5lZ2F0ZS5oYXNoQ29kZXVuYm91bmRpc1NpbmdsZVZhbHVlUmFuZ2UuaGFzaENvZGVTc2FWYWx1ZVJhbmdlQW5hbHl6ZXJjb252ZXJzaW9uc1NTQSB2YWx1ZSByYW5nZSBidWlsZGVycmVtb3ZlUmFuZ2VDb252ZXJzaW9uY29uc3RhbnROdW1pbmRleFJhbmdlbGVuZ3RoUmFuZ2VtYXhJbmRleGJlbG93TGVuZ3RoY3JlYXRlUmFuZ2VDb252ZXJzaW9ubmV3SW5kZXhSYW5nZXJpZ2h0UmFuZ2VsZWZ0UmFuZ2VoYW5kbGVFcXVhbGl0eUNoZWNraGFuZGxlSW52b2tlTW9kdWxvZGl2aXNvcmRpdmlkZW5kaGFuZGxlQmluYXJ5T3BlcmF0aW9udHJ5Q29tcHV0ZVJhbmdlbmVnYXRlT3BlcmF0aW9uZmxpcE9wZXJhdGlvbmNvbXB1dGVDb25zdHJhaW5lZFJhbmdlbWlycm9yT3ByZXZlcnNlZE1pcnJvckxvb3BVcGRhdGVSZWNvZ25pemVybG9vcFBoaXVwZGF0ZVJhbmdlc3RhcnRSYW5nZXBoaVJhbmdlaW5wdXRSYW5nZVZhbHVlU2V0Y29sbGlzaW9uc2NhcGFjaXR5cmVzaXplcHJvYmVvbGRTaXplb2xkVGFibGVvbGRDb2xsaXNpb25zVmFsdWVTZXROb2RlanNfY2hhcmFjdGVyX2NvZGVzX01FUkdFX1NPUlRfTElNSVRiaW5hcnlTZWFyY2hzb3J0ZWRMaXN0Y29tcGxvd2VyQm91bmR0bXAxX3JldmVyc2VpbnNlcnRpb25Tb3J0c2NyYXRjaFNwYWNlX21vdmluZ0luc2VydGlvblNvcnRfbWVyZ2VTb3J0dGFyZ2V0TWlkZGxlZmlyc3RMaXN0Zmlyc3RTdGFydGZpcnN0RW5kc2Vjb25kTGlzdHNlY29uZFN0YXJ0c2Vjb25kRW5kY3Vyc29yMWN1cnNvcjJmaXJzdEVsZW1lbnRzZWNvbmRFbGVtZW50X0Nhbm9uaWNhbGl6ZV9Jc1ZhbGlkS2V5Q2Fub25pY2FsaXplZE1hcF9jYW5vbmljYWxpemVfaXNWYWxpZEtleUZuX2Jhc2VfaXNWYWxpZEtleXsuLi59X3RvU3RyaW5nVmlzaXRpbmdfaXNUb1N0cmluZ1Zpc2l0aW5nQ29tYmluZWRJdGVyYWJsZVZpZXdfaXRlcmFibGVzX0NvbWJpbmVkSXRlcmF0b3JfaXRlcmF0b3JzQ29tYmluZWRMaXN0Vmlld19saXN0c190aHJvd0Nhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIExpc3Rpbml0aWFsSW5kZXhDb21iaW5lZE1hcFZpZXdfemVyb191cHBlckNhc2VBX3VwcGVyQ2FzZVpfbG93ZXJDYXNlQV9sb3dlckNhc2VaX2FzY2lpQ2FzZUJpdGVxdWFsc0lnbm9yZUFzY2lpQ2FzZWFDaGFyYkNoYXJhQ2hhckxvd2VyQ2FzZWhhc2hJZ25vcmVBc2NpaUNhc2Vjb21wYXJlQXNjaWlVcHBlckNhc2VkZWZhdWx0UmVzdWx0YVVwcGVyQ2FzZWJVcHBlckNhc2Vjb21wYXJlQXNjaWlMb3dlckNhc2VhTG93ZXJDYXNlYkxvd2VyQ2FzZWNvbXBhcmVOYXR1cmFsY29tcGFyZUFzY2lpTG93ZXJDYXNlTmF0dXJhbGNvbXBhcmVBc2NpaVVwcGVyQ2FzZU5hdHVyYWxfY29tcGFyZU5hdHVyYWxseWFJc0RpZ2l0YklzRGlnaXRfY29tcGFyZU51bWVyaWNhbGx5X2NvbXBhcmVEaWdpdENvdW50X2lzRGlnaXRfaXNOb25aZXJvTnVtYmVyU3VmZml4X0dldEtleUVxdWFsaXR5ZTFlMkVxdWFsaXR5QnlfZ2V0S2V5X2lubmVyZ2V0S2V5RGVmYXVsdEVxdWFsaXR5SWRlbnRpdHlFcXVhbGl0eUl0ZXJhYmxlRXF1YWxpdHlfZWxlbWVudEVxdWFsaXR5ZWxlbWVudEVxdWFsaXR5ZWxlbWVudHMxZWxlbWVudHMyaXQxaXQyaGFzTmV4dExpc3RFcXVhbGl0eV9Vbm9yZGVyZWRFcXVhbGl0eVVub3JkZXJlZEl0ZXJhYmxlRXF1YWxpdHlTZXRFcXVhbGl0eV9NYXBFbnRyeWVxdWFsaXR5X2tleUVxdWFsaXR5X3ZhbHVlRXF1YWxpdHlNYXBFcXVhbGl0eWVxdWFsRWxlbWVudENvdW50c2tleUhhc2h2YWx1ZUhhc2hNdWx0aUVxdWFsaXR5X2VxdWFsaXRpZXNlcXVhbGl0aWVzZXFEZWVwQ29sbGVjdGlvbkVxdWFsaXR5X3Vub3JkZXJlZENhc2VJbnNlbnNpdGl2ZUVxdWFsaXR5c3RyaW5nMV9IQVNIX01BU0tFcXVhbGl0eU1hcEVxdWFsaXR5U2V0bWFwTWFwSzFtYXBLZXltYXBWYWx1ZW1lcmdlTWFwc2dyb3VwQnltaW5CeW9yZGVyQnltaW5WYWx1ZW1pbk9yZGVyQnllbGVtZW50T3JkZXJCeW1heEJ5bWF4VmFsdWVtYXhPcmRlckJ5dHJhbnNpdGl2ZUNsb3N1cmV2ZXJ0ZXgxdmVydGV4MnZlcnRleDNzdHJvbmdseUNvbm5lY3RlZENvbXBvbmVudHNpbmRpY2VzbG93TGlua3NvblN0YWNrc3Ryb25nQ29ubmVjdEl0ZXJhYmxlWmlwaXRlcmFibGVzaXRlcmF0b3JzX0l0ZXJhdG9yWmlwUHJpb3JpdHlRdWV1ZUhlYXBQcmlvcml0eVF1ZXVlX0lOSVRJQUxfQ0FQQUNJVFlfbG9jYXRlTm8gc3VjaCBlbGVtZW50X3JlbW92ZUxhc3RfYnViYmxlVXBfYnViYmxlRG93bmxlZnRDaGlsZFBvc2l0aW9ucGFyZW50SW5kZXhyaWdodENoaWxkSW5kZXhsZWZ0Q2hpbGRJbmRleGxlZnRDaGlsZHJpZ2h0Q2hpbGRtaW5DaGlsZEluZGV4bWluQ2hpbGRuZXdDYXBhY2l0eW5ld1F1ZXVlX1F1ZXVlTGlzdCZPYmplY3QmTGlzdE1peGluUXVldWVMaXN0X3RhYmxlX2hlYWRfdGFpbGluaXRpYWxDYXBhY2l0eV9jYXN0RnJvbXNvdXJjZUxpc3RhZGRDb3VudF9wcmVHcm93ZW5kU3BhY2VwcmVTcGFjZWFkZEZpcnN0Tm8gZWxlbWVudExlbmd0aCAgbWF5IG5vdCBiZSBuZWdhdGl2ZS5uZXdUYWlsIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLi5faXNQb3dlck9mMl9uZXh0UG93ZXJPZjJuZXh0TnVtYmVybmV3VGFibGVfd3JpdGVUb0xpc3RmaXJzdFBhcnRTaXplbmV3RWxlbWVudENvdW50X0Nhc3RRdWV1ZUxpc3RfVW5pb25TZXQmU2V0QmFzZSZVbm1vZGlmaWFibGVTZXRNaXhpbkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIFNldFVuaW9uU2V0X2Rpc2pvaW50X2l0ZXJhYmxlX2RlZHVwSXRlcmFibGVVbmlvblNldENvbnRyb2xsZXJfc2V0VW5tb2RpZmlhYmxlTGlzdFZpZXdfTm9uR3Jvd2FibGVMaXN0VmlldyZEZWxlZ2F0aW5nTGlzdCZOb25Hcm93YWJsZUxpc3RNaXhpbkNhbm5vdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiBhIGZpeGVkLWxlbmd0aCBsaXN0Tm9uR3Jvd2FibGVMaXN0Vmlld2xpc3RCYXNlTm9uR3Jvd2FibGVMaXN0TWl4aW5fVW5tb2RpZmlhYmxlU2V0VmlldyZEZWxlZ2F0aW5nU2V0JlVubW9kaWZpYWJsZVNldE1peGluVW5tb2RpZmlhYmxlU2V0Vmlld3NldEJhc2VVbm1vZGlmaWFibGVTZXRNaXhpblVubW9kaWZpYWJsZU1hcE1peGluQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgTWFwX0tleUZvclZhbHVlX0RlbGVnYXRpbmdJdGVyYWJsZUJhc2VEZWxlZ2F0aW5nSXRlcmFibGVVc2UgaXRlcmFibGUuY2FzdDxFPiBpbnN0ZWFkLkRlbGVnYXRpbmdMaXN0VXNlIGxpc3QuY2FzdDxFPiBpbnN0ZWFkLl9saXN0QmFzZURlbGVnYXRpbmdTZXRVc2Ugc2V0LmNhc3Q8RT4gaW5zdGVhZC5fc2V0QmFzZURlbGVnYXRpbmdRdWV1ZVVzZSBxdWV1ZS5jYXN0PEU+IGluc3RlYWQuX2Jhc2VRdWV1ZURlbGVnYXRpbmdNYXBVc2UgbWFwLmNhc3Q8SywgVj4gaW5zdGVhZC5fTWFwS2V5U2V0Jl9EZWxlZ2F0aW5nSXRlcmFibGVCYXNlJlVubW9kaWZpYWJsZVNldE1peGluTWFwS2V5U2V0X2Jhc2VNYXBNYXBLZXlTZXQgZG9lc24ndCBzdXBwb3J0IGxvb2t1cCgpLk1hcFZhbHVlU2V0X2tleUZvclZhbHVla2V5Rm9yVmFsdWV0b1JlbW92ZXZhbHVlc1RvUmV0YWlua2V5c1RvUmVtb3ZlZGFydDJqc19pbmZvLnNyYy5ncmFwaG5vZGVDb3VudHRhcmdldHNPZnNvdXJjZXNPZmNvbXB1dGVUb3BvbG9naWNhbFNvcnRmaW5kZXJjb250YWluc1BhdGhwb3N0T3JkZXJmaW5kQ3ljbGVDb250YWluaW5nX2NvbXBvbmVudENvbnRhaW5pbmdkb21pbmF0b3JUcmVlaURvbWltbWVkaWF0ZURvbWluYXRvcnNFZGdlTGlzdEdyYXBoX2VkZ2VzX3JldkVkZ2VzcmVtb3ZlRWRnZXJlbW92ZU5vZGVyZW1vdmVBbGxOb2Rlc19Ob2RlSW5mb2xvd2xpbmtfU2NjRmluZGVyX2FsbENvbXBvbmVudHNfc3Ryb25nQ29ubmVjdG5vZGVJbmZvX3BvcF9wdXNodkluZm93d0luZm9fRG9taW5hdG9yRmluZGVycG9zdE9yZGVySWRub2Rlc0luUG9zdE9yZGVybm9kZXNJblJldmVyc2VkUG9zdE9yZGVyaWRvbV9pbnRlcnNlY3RmaW5nZXIxZmluZ2VyMmNvbXBpbGVyLnNyYy5pbmZlcnJlci5ub2RlX3RyYWNlclRyYWNlclZpc2l0b3JNQVhfQU5BTFlTSVNfQ09VTlRsaXN0c1RvQW5hbHl6ZXNldHNUb0FuYWx5emVtYXBzVG9BbmFseXplX3dvdWxkQmVUb29NYW55VXNlcnNzZWVuU29GYXJhY3R1YWxXb3JrVG9vIG1hbnkgdXNlcnNhbmFseXplU3RvcmVkSW50b0xpc3RhbmFseXplU3RvcmVkSW50b1NldGFuYWx5emVTdG9yZWRJbnRvTWFwQmFpbGluZyBvdXQgb24gIGJlY2F1c2U6IFBhc3NlZCB0aHJvdWdoIGF3YWl0UGFzc2VkIHRocm91Z2ggeWllbGRVc2VkIGFzIGtleSBpbiBNYXBTdG9yZWQgaW4gYSBsaXN0IHRoYXQgYmFpbGVkIG91dGZsb3dFc2NhcGUgZnJvbSBhIGxpc3QgdmlhIFtTdG9yZWQgaW4gYSBzZXQgdGhhdCBiYWlsZWQgb3V0RXNjYXBlIGZyb20gYSBzZXQgdmlhIFtTdG9yZWQgaW4gYSBtYXAgdGhhdCBiYWlsZWQgb3V0RXNjYXBlIGZyb20gYSBtYXAgdmlhIFttaWdodEFkZFRvQ29udGFpbmVyaXNJbmRleFNldEFyZ3VtZW50aXNJbmRleFNldEtleWlzSW5kZXhTZXRWYWx1ZWJhaWxvdXRJZlJlYWNoZXNSZWFjaGVkIHN1cHByZXNzZWQgcGFyYW1ldGVyIHdpdGhvdXQgcHJlY2lzZSByZWNlaXZlcmFkZHNUb0NvbnRhaW5lclN0b3JlZCBpbiB0b28gbWFueSBjb250YWluZXJzYWRkc1RvTWFwVmFsdWVTdG9yZWQgaW4gdG9vIG1hbnkgbWFwc2FkZHNUb01hcEtleWlzUGFyYW1ldGVyT2ZMaXN0QWRkaW5nTWV0aG9kaXNQYXJhbWV0ZXJPZk1hcEFkZGluZ01ldGhvZFBhc3NlZCB0byBub1N1Y2hNZXRob2RpbmZlcnJlZFRhcmdldFR5cGVzcGFyYW1ldGVySW5mb1JldHVybmVkIGZyb20gYSBjbG9zdXJpemVkIG1ldGhvZFJldHVybmVkIGZyb20gYSBjbG9zdXJlRXNjYXBlIHRvIGNvZGUgdGhhdCBoYXMgc3BlY2lhbCBiYWNrZW5kIHRyZWF0bWVudFBhc3NlZCB0byBhIG5hdGl2ZSBtZXRob2Rkb2VzTm90RXNjYXBlTGlzdFNldGRvZXNOb3RFc2NhcGVTZXRTZXRkb2VzTm90RXNjYXBlTWFwU2V0Y29tcGlsZXIuc3JjLmpzX2JhY2tlbmQuanNfaW50ZXJvcF9hbmFseXNpc2J1aWxkSnNJbnRlcm9wQm9vdHN0cmFwY2FuZGlkYXRlUGFyYW1ldGVyTmFtZXNhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaRnVuY3Rpb24ucHJvdG90eXBlLiMgPSBmdW5jdGlvbigjKSB7IHJldHVybiB0aGlzKCMpIH1idWlsZEpzRnVuY3Rpb25UeXBlZGFydDJqcy5yZXNvbHV0aW9uLnJlZ2lzdHJ5X2NvbnN0U3ltYm9sTmFtZXNfY29uc3RhbnRMaXRlcmFsc19zZWVuQ2xhc3Nlc3JlZ2lzdGVyU2VlbkNsYXNzc2VlbkNsYXNzUmVzb2x1dGlvbldvcmxkSW1wYWN0QnVpbGRlcigKIGZlYXR1cmVzOgogbWFwLWxpdGVyYWxzOgogc2V0LWxpdGVyYWxzOgogbGlzdC1saXRlcmFsczoKIGNvbnN0LWxpdGVyYWxzOgogY29uc3Qtc3ltYm9sLW5hbWVzOiAKIG5hdGl2ZS1kYXRhOgogaW5zdGFudGlhdGlvbnM6RmVhdHVyZXNfdW5zb3J0ZWRhZGRFbGVtZW50bWFya0FzVW5zb3J0ZWRGZWF0dXJlcyhmcm9tVGV4dGVxUG9zY29tbWFQb3NlbmREZWxpbWl0ZXJzdmFsdWVTdGFydGVuZERlbGltaXRlckZlYXR1cmVzRGF0YUludGVycHJldGVyaXNBc0V4cGVjdGVkYWN0dWFsRmVhdHVyZXNleHBlY3RlZERhdGFFeHBlY3RlZCBlbXB0eSBkYXRhLmVycm9yc0ZvdW5kZXhwZWN0ZWRGZWF0dXJlc3ZhbGlkYXRlZEZlYXR1cmVzZXhwZWN0TWF0Y2hhY3R1YWxWYWx1ZVVuZXhwZWN0ZWQgZGF0YSBmb3VuZCBmb3IgTm8gZGF0YSBmb3VuZCBmb3IgTm9uLWVtcHR5IGRhdGEgZm91bmQgZm9yIGFjdHVhbExpc3RleHBlY3RlZE9iamVjdGV4cGVjdGVkVGV4dGFjdHVhbE9iamVjdE5vIG1hdGNoIGZvdW5kIGZvciA9W0V4dHJhIGRhdGEgZm91bmQgTGlzdCBkYXRhIGV4cGVjdGVkIGZvciBleHBlY3RlZCAnJywgZm91bmQgJ01pc21hdGNoIGZvciA6IGV4cGVjdGVkICdFeHRyYSBkYXRhIGZvdW5kICdhY3R1YWxEYXRhX2RpZ2VzdFNpbmtfYnl0ZVNpbmtfRGlnZXN0U2lua2RhcnQyanMuc291cmNlX21hcF9idWlsZGVydGFyZ2V0RmlsZVVyaWxvY2F0aW9uUHJvdmlkZXJtaW5pZmllZEdsb2JhbE5hbWVzbWluaWZpZWRJbnN0YW5jZU5hbWVzYWRkTWFwcGluZ3ByaW50U3RyaW5nTGlzdE9ubGluZUNvbHVtbk1hcHNvdXJjZUxvY2F0aW9uTWFwc291cmNlTWFwRW50cnlrZXJuZWxMb2NhdGlvbnNvdXJjZUxpbmVDb2x1bW5NYXBfYnVpbGR1cmlNYXByZWdpc3RlckxvY2F0aW9uZm9yRWFjaEVsZW1lbnRtYXBwaW5nc0J1ZmZlcndyaXRlRW50cmllc3sKICAidmVyc2lvbiI6IDMsCiAgImVuZ2luZSI6ICIiLAogICJmaWxlIjogICAic291cmNlUm9vdCI6ICIiLAogICJzb3VyY2VzIjogcmVsYXRpdmVTb3VyY2VVcmlMaXN0ICAibmFtZXMiOiAgICJtYXBwaW5ncyI6ICIgICJ4X29yZ19kYXJ0bGFuZ19kYXJ0MmpzIjogewogICAgIm1pbmlmaWVkX25hbWVzIjogewogICAgICAiZ2xvYmFsIjogd3JpdGVNaW5pZmllZE5hbWVzICAgICAgImluc3RhbmNlIjogCiAgICB9LAogICAgImZyYW1lcyI6IHdyaXRlRnJhbWVzCiAgfQp9CnByZXZpb3VzU291cmNlTG9jYXRpb25wcmV2aW91c1RhcmdldExpbmV0YXJnZXRDb2x1bW5FbmNvZGVyZmlyc3RFbnRyeUluTGluZXNvdXJjZVVyaUluZGV4RW5jb2RlcnNvdXJjZUxpbmVFbmNvZGVyc291cmNlQ29sdW1uRW5jb2RlcnNvdXJjZU5hbWVJbmRleEVuY29kZXJ0YXJnZXRMaW5ldGFyZ2V0Q29sdW1ubWluaWZpZWROYW1lc21pbmlmaWVkTmFtZW9mZnNldEVuY29kZXJ1cmlFbmNvZGVybGluZUVuY29kZXJjb2x1bW5FbmNvZGVybmFtZUVuY29kZXJnZW5lcmF0ZVNvdXJjZU1hcFRhZ3NvdXJjZU1hcEZpbGVOYW1lCi8vIyBzb3VyY2VNYXBwaW5nVVJMPW91dHB1dFNvdXJjZU1hcHNvdXJjZUxvY2F0aW9uc1Byb3ZpZGVyc291cmNlTWFwQnVpbGRlcmpzLm1hcG1hcC5qcy5tYXAuRGVsdGFFbmNvZGVyVkxRX0JBU0VfU0hJRlRWTFFfQkFTRV9NQVNLVkxRX0NPTlRJTlVBVElPTl9CSVRWTFFfQ09OVElOVUFUSU9OX01BU0tCQVNFNjRfRElHSVRTQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL2VuY29kZVZMUXNpZ25CaXRTb3VyY2VNYXBFbnRyeUxpbmVDb2x1bW5NYXBfZ2V0TGlzdGxpbmVNYXBmb3JFYWNoTGluZWdldEZpcnN0RWxlbWVudHNJbkxpbmVjb2x1bW5zZm9yRWFjaENvbHVtbkluZGV4TWFwanNfYmFja2VuZGRhcnQyanMuanNfZW1pdHRlci5jb25zdGFudF9vcmRlcmluZ19Db25zdGFudE9yZGVyaW5nX2RhcnRUeXBlT3JkZXJpbmdjb21wYXJlVmFsdWVzY29tcGFyZU51bGxhYmxlY29tcGFyZUxpc3RzY29tcGFyZUNsYXNzZXNjb21wYXJlVHlwZWRlZnNjb21wYXJlRGFydFR5cGVzYUludGJJbnRhU3RyaW5nYlN0cmluZ2FGaWVsZHNiRmllbGRzX0RhcnRUeXBlS2luZFZpc2l0b3JfRGFydFR5cGVPcmRlcmluZ19yb290VHlwZSB2YXJpYWJsZXMgYXJlIG5vdCBleHBlY3RlZCBpbiBjb25zdGFudHM6ICdfY29tcGFyZVR5cGVBcmd1bWVudHNhQXJndW1lbnRzYkFyZ3VtZW50c2RhcnQyanMuanNfZW1pdHRlci5oZWFkZXJzSE9PS1NfQVBJX1VTQUdFZ2VuZXJhdGVkQnkgdmVyc2lvbjogLy8gR2VuZXJhdGVkIGJ5IGRhcnQyanN0aGUgRGFydCB0byBKYXZhU2NyaXB0IGNvbXBpbGVyZGVmYXVsdENvbXBhcmVFbXB0eVVubW9kaWZpYWJsZVNldFJ1blRlc3RGdW5jdGlvbnByaW50Q29kZXN1Y2NpbmN0dGVzdEFmdGVyRmFpbHVyZXN0ZXN0RGF0YU1lbWJlckFubm90YXRpb25zRGF0YVR5cGVfY29tcHV0ZWREYXRhRm9yRWFjaEZpbGVnbG9iYWxEYXRhY29tcHV0ZWREYXRhTWVtYmVyQW5ub3RhdGlvbnMoZGF0YTp7Z2xvYmFsOlRlc3REYXRhdGVzdEZpbGVVcmltZW1vcnlTb3VyY2VGaWxlc2V4cGVjdGVkTWFwc2xpYkZpbGVOYW1lc0NvbXBpbGVkRGF0YWFjdHVhbE1hcHNjb21wdXRlQW5ub3RhdGlvbnNhY3R1YWxNYXBjb21wdXRlRGlmZkFubm90YXRpb25zQWdhaW5zdHRoaXNNYXBpbmNsdWRlTWF0Y2hlc3RoaXNEYXRhZ2V0T2Zmc2V0RnJvbUlkRGF0YUludGVycHJldGVyU3RyaW5nRGF0YUludGVycHJldGVySWREYXRhX2NvbXBpbGVkRGF0YV9hY3R1YWxNYXBzYWN0dWFsQ29kZWRpZmZDb2RlZGF0YVZhbGlkYXRvcnVuZXhwZWN0ZWRNZXNzYWdlY2ZlTWFya2VyY2ZlZGFydDJqc01hcmtlcmFuYWx5emVyTWFya2Vyc2hhcmVkTWFya2Vyc3VzZUNvbG9yc2NvbG9yaXplTWVzc2FnZWNvbG9yaXplTWF0Y2hjb2xvcml6ZVNpbmdsZWNvbG9yaXplQWN0dWFsY29sb3JpemVFeHBlY3RlZGNvbG9yaXplRGVsaW1pdGVyY29sb3JpemVEaWZmY29sb3JpemVBbm5vdGF0aW9uY29tcHV0ZUV4cGVjdGVkTWFwbWFwS2V5c2ZpbGVBbm5vdGF0aW9uc05vIGFubm90YXRpb25zIGZvciBleHBlY3RlZFZhbHVlc2lkVmFsdWVFcnJvciBpbiB0ZXN0ICdEdXBsaWNhdGUgYW5ub3RhdGlvbnMgZm9yIGNvbXB1dGVUZXN0RGF0YXRlc3RGaWxldGVzdExpYkRpcmVjdG9yeXN1cHBvcnRlZE1hcmtlcnNjcmVhdGVVcmlGb3JGaWxlTmFtZWlzTGlibWFpbi5kYXJ0bWFpblRlc3RGaWxlYWRkaXRpb25hbEZpbGVzbGlzdFN5bmNyZWN1cnNpdmVhbm5vdGF0ZWRDb2RldGVzdE1hcmtlcmFkZFN1cHBvcnRpbmdGaWxlbGliRmlsZU5hbWVsaWJFbnRpdHlsaWJGaWxlVXJpbGliQ29kZWFubm90YXRlZExpYkNvZGVhZGRpdGlvbmFsRmlsZURhdGF3aXRoQW5ub3RhdGlvbnNjaGVja0NvZGVtb2RlTmFtZW1haW5GaWxlVXJpY29tcGlsZWREYXRhZmlsdGVyQWN0dWFsRGF0YWZhdGFsRXJyb3JzaGFzRmFpbHVyZW5lZWRlZERpZmZzY2hlY2tBY3R1YWxNYXBleHBlY3RlZE1hcGhhc0xvY2FsRmFpbHVyZWFjdHVhbFRleHRhY3R1YWxWYWx1ZVRleHRFWFRSQSAgREFUQSBmb3IgZGVzY3JpcHRvcjoKIG9iamVjdCAgIDogb2JqZWN0VGV4dGFjdHVhbCAgIDogRGF0YSB3YXMgZXhwZWN0ZWQgZm9yIHRoZXNlIGlkczogVU5FWFBFQ1RFRCBkZXRhaWwgIDogb2JqZWN0ICA6IGV4cGVjdGVkOiBhY3R1YWwgIDogbWlzc2luZ0lkc2NoZWNrTWlzc2luZ01JU1NJTkcgLS1hbm5vdGF0aW9ucyBkaWZmIFtdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1NSVNTSU5HIGlkczogRXJyb3JzIGZvdW5kLnJ1blRlc3RzZGF0YURpcmxpYkRpcmVjdG9yeXNoYXJkSW5kZXhvblRlc3RydW5UZXN0LXYtc3Nob3VsZENvbnRpbnVlLWEtcGNvbnRpbnVlZGhhc0ZhaWx1cmVzcmVsYXRpdmVEaXJEYXRhIGRpcjogdGVzdENvdW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVRlc3QgZmlsZTogU3VwcG9ydGluZyBsaWJyYXJpZXM6ICAgIC0gbGlicy9ObyBmaWxlcyB3ZXJlIHRlc3RlZC5Bbm5vdGF0aW9uQW5ub3RhdGlvbihsaW5lTm89LGNvbHVtbk5vPSxvZmZzZXQ9LHRleHQ9QW5ub3RhdGVkQ29kZV9saW5lU3RhcnRzQHtjb2RlQnVmZmVyc3RhcnRNYXRjaG1hdGNoQXNQcmVmaXhlbmRNYXRjaGVzYWxsTWF0Y2hlc2VuZE1hdGNoX2Vuc3VyZUxpbmVTdGFydHN0b1RleHRfTEZfQ1JhdEJyYWNlU3RhcnRicmFjZUVuZGNvbW1lbnRTdGFydC9cKmNvbW1lbnRFbmRcKi9ccypzcGxpdEJ5UHJlZml4ZXNwcmVmaXhTZXRkb3RQb3Nhbm5vdGF0aW9uUHJlZml4YW5ub3RhdGlvblRleHRJZEtpbmRJZEtpbmQubWVtYmVySWRLaW5kLmNsc0lkS2luZC5saWJyYXJ5SWRLaW5kLm5vZGVJZEtpbmQuaW52b2tlSWRLaW5kLnVwZGF0ZUlkS2luZC5pdGVyYXRvcklkS2luZC5jdXJyZW50SWRLaW5kLm1vdmVOZXh0SWRLaW5kLnN0bXRJZEtpbmQuZXJyb3JzdG10SWRWYWx1ZWdsb2JhbFByZWZpeGdsb2JhbCNtZW1iZXJQcmVmaXhjbGFzc1ByZWZpeGNsYXNzOiBsaWJyYXJ5OiBpbnZva2VQcmVmaXhpbnZva2U6IHVwZGF0ZVByZWZpeHVwZGF0ZTogaXRlcmF0b3JQcmVmaXhpdGVyYXRvcjogY3VycmVudFByZWZpeGN1cnJlbnQ6IG1vdmVOZXh0UHJlZml4bW92ZU5leHQ6IHN0bXRQcmVmaXhzdG10OiBlcnJvclByZWZpeGVycm9yOiBpZFRvU3RyaW5nZWxlbWVudElkY2xhc3NJZFVuZXhwZWN0ZWQgaWQga2luZDogY29sb25Qb3NJbnZhbGlkIG1lbWJlciBpZDogJ0ludmFsaWQgY2xhc3MgaWQ6ICdccyooXG5ccyopK1xzKk1lbWJlcklkbWVtYmVyIG1lbWJlcjpDbGFzc0lkY2xhc3M6TGlicmFyeUlkbGlicmFyeSBsaWJyYXJ5Ok5vZGVJZG9mZnNldCBBY3R1YWxEYXRhX29mZnNldG9iamVjdCBgYCAoQWN0dWFsRGF0YShpZD0sdXJpPSxvYmplY3Q9RGF0YVJlZ2lzdHJ5cmVnaXN0ZXJWYWx1ZWV4aXN0aW5nRGF0YUR1cGxpY2F0ZSBpZCAsIG9iamVjdD1vYmplY3Q9RGlnZXN0SGFzaGJsb2NrU2l6ZWlubmVyU2lua291dGVyU2lua0htYWNfSG1hY1Npbmtfb3V0ZXJTaW5rX2lubmVyUmVzdWx0U2lua19pbm5lclNpbmtfaXNDbG9zZWRITUFDIGlzIGNsb3NlZGFkZFNsaWNlaXNMYXN0TUQ1X01ENVNpbmsxNzMyNTg0MTkzNDAyMzIzMzQxNzI1NjIzODMxMDJlbmRpYW51cGRhdGVIYXNoMzYxNDA5MDM2MDM5MDU0MDI3MTAzMjUwNDQxOTY2NDExODU0ODM5OTEyMDAwODA0MjYyODIxNzM1OTU1NDI0OTI2MTMxMzE3NzAwMzU0MTYyMzM2NTUyODc5NDI5NDkyNTIzMzIzMDQ1NjMxMzQxODA0NjAzNjgyNDI1NDYyNjE5NTI3OTI5NjUwMDYxMjM2NTM1MzI5NDEyOTE3MDc4NjMyMjU0NjU2NjQzOTIxMDY5OTk0MzU5MzQwODYwNTM2MzQ0ODg5NjEzODg5NDI5NDQ4MzI3NTE2MzYwNjQxMDc2MDMzMzUxMTYzNTMxNTAxMjg1MDI4NTgyOTQyNDM1NjM1MTIxNzM1MzI4NDczMjM2ODM1OTU2MjQyOTQ1ODg3MzgyMjcyMzkyODMzMTgzOTAzMDU2MjQyNTk2NTc3NDAyNzYzOTc1MjM2MTI3Mjg5MzM1MzQxMzk0Njk2NjQzMjAwMjM2NjU2MzkzNjQzMDA3NDM1NzI0NDUzMTczNjU0NjAyODA5Mzg3MzE1MTQ2MTMyOTk2Mjg2NDU0MDk2MzM2NDUyMTEyNjg5MTQxNTI4Nzg2MTIzOTE0MjM3NTMzMjQxMTcwMDQ4NTU3MTIzOTk5ODA2OTA0MjkzOTE1NzczMjI0MDA0NDQ5NzE4NzMzMTMzNTk0MjY0MzU1NTUyMjczNDc2ODkxNjEzMDkxNTE2NDk0MTQ5NDQ0MjI2MzE3NDc1NjkxNzM5NTE0ODE3NDVtZDVfbm9pc2Vfc2hpZnRBbW91bnRzU2hhMV9TaGExU2lua19leHRlbmRlZDMyODUzNzc1MjBuZXdBMTUxODUwMDI0OTE4NTk3NzUzOTMyNDAwOTU5NzA4MzM5NTQ2OTc4MnNoYTFTaGEyNTZfU2hhMjU2U2luazE3NzkwMzM3MDMzMTQ0MTM0Mjc3Mjc3MzQ4MDc2MjEzNTk4OTMxMTkyNjAwODIyOTI0MTU0MTQ1OTIyNV9yb3RyMzJfY2hfbWFqX2JzaWcwX2JzaWcxX3NzaWcwX3NzaWcxdGVtcDExMTE2MzUyNDA4MTg5OTQ0NzQ0MTMwNDkzMjM0NzEzOTIxMDA5NTczMTUwODk3MDk5MzI0NTM2MzU3NDgyODcwNzYzMjIxMzYyNDM4MTA4MDE0MjY4ODE5ODcxOTI1MDc4Mzg4MjE2MjA3ODIwNjI2MTQ4ODgxMDMzMjQ4MjIyNTgwMzgzNTM5MDQwMTQwMjIyMjQ3NzQxMjQ5MTUwMTIyMTU1NTA4MTY5MjE5OTYwNjQ5ODYyNTU0MjIwODgyMjgyMTgzNDM0OTI5NTI5OTY4MDgzMjEwMzEzNjcxMzMzNjU3MTg5MTM1ODQ1Mjg3MTExMjk0NzU3MzcyMTM5NjE4MjI5MTE2OTUxODM3MDAxOTg2NjYxMDUxMjE3NzAyNjM1MDI0NTY5NTYwMzcyNzMwNDg1OTIxMjgyMDMwMjQxMTMyNTk3MzA4MDAzMzQ1NzY0NzcxMzUxNjA2NTgxNzM2MDAzNTI4MDQ0MDk0NTcxOTA5MTMyMjgyMjIxODE1MzcwMDIwNjMxNzQ3ODczNzc5MTk1NTU2MjIyMjIwMjQxMDQ4MTUyMjI3NzMwNDUyMjM2MTg1MjQyNDI0Mjg0MzY0NzQyNzU2NzM0MTg3MzIwNDAzMTQ3OTMzMjkzMjUyOTh0ZW1wMnNoYTI1NkRpZ2VzdFNpbmtIYXNoU2lua19lbmRpYW5fY3VycmVudENodW5rX21heE1lc3NhZ2VMZW5ndGhJbkJ5dGVzMTEyNTg5OTkwNjg0MjYyM19sZW5ndGhJbkJ5dGVzX3BlbmRpbmdEYXRhY2h1bmtTaXplSW5Xb3Jkc0hhc2guYWRkKCkgY2FsbGVkIGFmdGVyIGNsb3NlKCkuX2l0ZXJhdGVfZmluYWxpemVEYXRhX2J5dGVEaWdlc3RieXRlRGlnZXN0bGVuZ3RoSW5CeXRlc2J5dGVEYXRhYXNCeXRlRGF0YXNldFVpbnQzMnBlbmRpbmdEYXRhQnl0ZXNwZW5kaW5nRGF0YUNodW5rc2dldFVpbnQzMmNvbnRlbnRzTGVuZ3RoZmluYWxpemVkTGVuZ3RoX3JvdW5kVXBIYXNoaW5nIGlzIHVuc3VwcG9ydGVkIGZvciBtZXNzYWdlcyB3aXRoIG1vcmUgdGhhbiAyXjUzIGJpdHMubGVuZ3RoSW5CaXRzaGlnaEJpdHNsb3dCaXRzbWFzazMyYml0c1BlckJ5dGVieXRlc1BlcldvcmRhZGQzMnJvdGwzMm1vZFNoaWZ0QWNjdW11bGF0b3JTaW5rX2V2ZW50c0Nhbid0IGFkZCB0byBhIGNsb3NlZCBzaW5rLkJ5dGVBY2N1bXVsYXRvclNpbmtjb252ZXJ0LmhleGhleEVuY29kZXJoZXhEZWNvZGVySGV4Q29kZWNoZXhjb252ZXJ0LnBlcmNlbnRwZXJjZW50RW5jb2RlcnBlcmNlbnREZWNvZGVyUGVyY2VudENvZGVjU3RyaW5nQWNjdW11bGF0b3JTaW5rY29udmVydC5oZXguZW5jb2RlckhleEVuY29kZXJfSGV4RW5jb2RlclNpbmtfY29udmVydGJ1ZmZlckluZGV4Ynl0ZU9ySW52YWxpZCBieXRlIF9jb2RlVW5pdEZvckRpZ2l0Y29udmVydC5oZXguZGVjb2RlckhleERlY29kZXJpc0V2ZW5JbnZhbGlkIGlucHV0IGxlbmd0aCwgbXVzdCBiZSBldmVuLl9IZXhEZWNvZGVyU2lua19sYXN0RGlnaXRfY2xvc2VieXRlc1N0YXJ0aGV4UGFpcnNhc1V0ZjhTaW5rSW5wdXQgZW5kZWQgd2l0aCBpbmNvbXBsZXRlIGVuY29kZWQgYnl0ZS5fSGV4RGVjb2RlckJ5dGVTaW5rX2RlY29kZXNvdXJjZVN0YXJ0c291cmNlRW5kZGVzdGluYXRpb25TdGFydGRlc3RpbmF0aW9uSW5kZXhmaXJzdERpZ2l0c2Vjb25kRGlnaXRjb252ZXJ0LnBlcmNlbnQuZW5jb2RlclBlcmNlbnRFbmNvZGVyX1BlcmNlbnRFbmNvZGVyU2lua2NvbnZlcnQucGVyY2VudC5kZWNvZGVyUGVyY2VudERlY29kZXJsYXN0RGlnaXRfUGVyY2VudERlY29kZXJTaW5rX1BlcmNlbnREZWNvZGVyQnl0ZVNpbmtfbGFzdFBlcmNlbnRjb2RlVW5pdE9yc2xpY2VTdGFydF9jaGVja0ZvckludmFsaWRDb2RlVW5pdE5vbi1BU0NJSSBjb2RlIHVuaXQgdHlwZWRfZGF0YS50eXBlZF9idWZmZXJzTGlzdEJhc2VfVHlwZWREYXRhQnVmZmVySU5JVElBTF9MRU5HVEhfdHlwZWRCdWZmZXJfZGVmYXVsdFZhbHVlbmV3QnVmZmVyX2NyZWF0ZUJ1ZmZlcl9jcmVhdGVCaWdnZXJCdWZmZXJfYWRkQWxsX2luc2VydEtub3duTGVuZ3Rod3JpdGVJbmRleFRvbyBmZXcgZWxlbWVudHN2YWx1ZXNMZW5ndGhfZW5zdXJlQ2FwYWNpdHlyZXF1aXJlZENhcGFjaXR5X3NldFJhbmdlZWxlbWVudFNpemVJbkJ5dGVzX0ludEJ1ZmZlcl9GbG9hdEJ1ZmZlclVpbnQ4QnVmZmVyaW5pdGlhbExlbmd0aEludDhCdWZmZXJVaW50OENsYW1wZWRCdWZmZXJVaW50MTZCdWZmZXJJbnQxNkJ1ZmZlclVpbnQzMkJ1ZmZlckludDMyQnVmZmVyVWludDY0QnVmZmVySW50NjRCdWZmZXJGbG9hdDMyQnVmZmVyRmxvYXQ2NEJ1ZmZlckludDMyeDRCdWZmZXJGbG9hdDMyeDRCdWZmZXJjb252ZXJ0LnV0aWxzZGlnaXRGb3JDb2RlVW5pdEludmFsaWQgaGV4YWRlY2ltYWwgY29kZSB1bml0IGRhcnQuYXN5bmNWTUxpYnJhcnlIb29rc0Nhc3RTdHJlYW1DYXN0U3RyZWFtVHJhbnNmb3JtZXJFbXB0eUl0ZXJhdG9ySXRlcmFibGVFbGVtZW50RXJyb3JwcmludFRvWm9uZXByaW50VG9Db25zb2xlU2luY2Vhc3luY19lcnJvci5kYXJ0YnJvYWRjYXN0X3N0cmVhbV9jb250cm9sbGVyLmRhcnRkZWZlcnJlZF9sb2FkLmRhcnRmdXR1cmUuZGFydGZ1dHVyZV9pbXBsLmRhcnRzY2hlZHVsZV9taWNyb3Rhc2suZGFydHN0cmVhbS5kYXJ0c3RyZWFtX2NvbnRyb2xsZXIuZGFydHN0cmVhbV9pbXBsLmRhcnRzdHJlYW1fcGlwZS5kYXJ0c3RyZWFtX3RyYW5zZm9ybWVycy5kYXJ0dGltZXIuZGFydHpvbmUuZGFydF9TY2hlZHVsZUltbWVkaWF0ZUNsb3N1cmVfVGltZXJGYWN0b3J5Q2xvc3VyZXJlcGVhdGluZ19GdXR1cmVPblZhbHVlX0Z1dHVyZUVycm9yVGVzdF9GdXR1cmVBY3Rpb25fQXN5bmNDYWxsYmFja19UaW1lckNhbGxiYWNrQ29udHJvbGxlckNhbGxiYWNrQ29udHJvbGxlckNhbmNlbENhbGxiYWNrX05vdGlmaWNhdGlvbkhhbmRsZXJfRXZlbnRHZW5lcmF0b3JfRGF0YUhhbmRsZXJfRG9uZUhhbmRsZXJfQnJvYWRjYXN0Q2FsbGJhY2tfRXJyb3JDYWxsYmFja19QcmVkaWNhdGVfVHJhbnNmb3JtYXRpb25fRXJyb3JUZXN0X0VxdWFsaXR5X1NpbmtNYXBwZXJfVHJhbnNmb3JtRGF0YUhhbmRsZXJfVHJhbnNmb3JtRXJyb3JIYW5kbGVyX1RyYW5zZm9ybURvbmVIYW5kbGVyX1N1YnNjcmlwdGlvblRyYW5zZm9ybWVyY2FuY2VsT25FcnJvclpvbmVDYWxsYmFja1pvbmVVbmFyeUNhbGxiYWNrWm9uZUJpbmFyeUNhbGxiYWNrSGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXJSdW5IYW5kbGVyUnVuVW5hcnlIYW5kbGVyUnVuQmluYXJ5SGFuZGxlclJlZ2lzdGVyQ2FsbGJhY2tIYW5kbGVyUmVnaXN0ZXJVbmFyeUNhbGxiYWNrSGFuZGxlclJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2tIYW5kbGVyRXJyb3JDYWxsYmFja0hhbmRsZXJTY2hlZHVsZU1pY3JvdGFza0hhbmRsZXJDcmVhdGVUaW1lckhhbmRsZXJDcmVhdGVQZXJpb2RpY1RpbWVySGFuZGxlclByaW50SGFuZGxlckZvcmtIYW5kbGVyc3BlY2lmaWNhdGlvbl9jb21wbGV0ZXJpc1N5bmNjb21wbGV0ZWlzQ29tcGxldGVkdm06ZW50cnktcG9pbnRpc0FkZGluZ29uTGlzdGVuUmVjZWl2ZWRpc1NjaGVkdWxlZGlzU3VzcGVuZGVkQXRZaWVsZGNhbmNlbGxhdGlvbkNvbXBsZXRlcm9uTGlzdGVub25SZXN1bWVvbkNhbmNlbF9nZW5lcmF0b3JydW5Cb2R5c2NoZWR1bGVHZW5lcmF0b3Jpc1BhdXNlZHlpZWxkIGJlZm9yZSBzdHJlYW0gaXMgbGlzdGVuZWQgdG91bmV4cGVjdGVkIHlpZWxkaGFzTGlzdGVuZXJ3aGVuRG9uZUFkZGluZ19TY2hlZHVsZUltbWVkaWF0ZV9UaW1lckZhY3RvcnlfZmFjdG9yeV9Ccm9hZGNhc3RTdHJlYW1pc0Jyb2FkY2FzdF9Ccm9hZGNhc3RTdWJzY3JpcHRpb25fU1RBVEVfRVZFTlRfSURfU1RBVEVfRklSSU5HX1NUQVRFX1JFTU9WRV9BRlRFUl9GSVJJTkdfZXZlbnRTdGF0ZV9uZXh0X3ByZXZpb3Vzb25EYXRhX2V4cGVjdHNFdmVudGV2ZW50SWRfdG9nZ2xlRXZlbnRJZF9pc0ZpcmluZ19zZXRSZW1vdmVBZnRlckZpcmluZ19yZW1vdmVBZnRlckZpcmluZ19vblBhdXNlX29uUmVzdW1lX0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXJfU1RBVEVfSU5JVElBTF9TVEFURV9DTE9TRURfU1RBVEVfQUREU1RSRUFNX2ZpcnN0U3Vic2NyaXB0aW9uX2xhc3RTdWJzY3JpcHRpb25fYWRkU3RyZWFtU3RhdGVfZG9uZUZ1dHVyZW9uUGF1c2VCcm9hZGNhc3Qgc3RyZWFtIGNvbnRyb2xsZXJzIGRvIG5vdCBzdXBwb3J0IHBhdXNlIGNhbGxiYWNrc29uUGF1c2VIYW5kbGVyb25SZXN1bWVIYW5kbGVyX2lzRW1wdHlfaGFzT25lTGlzdGVuZXJfaXNBZGRpbmdTdHJlYW1fbWF5QWRkRXZlbnRfZW5zdXJlRG9uZUZ1dHVyZV9hZGRMaXN0ZW5lcm9sZExhc3RfcmVtb3ZlTGlzdGVuZXJfY29udHJvbGxlcl9zdWJzY3JpYmVfcmVjb3JkQ2FuY2VsX2NhbGxPbkNhbmNlbF9yZWNvcmRQYXVzZV9yZWNvcmRSZXN1bWVfYWRkRXZlbnRFcnJvckNhbm5vdCBhZGQgbmV3IGV2ZW50cyBhZnRlciBjYWxsaW5nIGNsb3NlQ2Fubm90IGFkZCBuZXcgZXZlbnRzIHdoaWxlIGRvaW5nIGFuIGFkZFN0cmVhbV9zZW5kRGF0YWVycm9yQ2FsbGJhY2tfc2VuZEVycm9yZG9uZUZ1dHVyZV9zZW5kRG9uZWFkZFN0cmVhbUZ1dHVyZV9hZGRFcnJvcmFkZFN0YXRlX2ZvckVhY2hMaXN0ZW5lckNhbm5vdCBmaXJlIG5ldyBldmVudC4gQ29udHJvbGxlciBpcyBhbHJlYWR5IGZpcmluZyBhbiBldmVudF9tYXlDb21wbGV0ZV9hc3luY0NvbXBsZXRlX1N5bmNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyX0FzeW5jQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcl9hZGRQZW5kaW5nX0FzQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcl9oYXNQZW5kaW5nX2FkZFBlbmRpbmdFdmVudGhhbmRsZU5leHREZWZlcnJlZExpYnJhcnlEYXJ0IHNkayB2LiAxLjhEZWZlcnJlZExvYWRFeGNlcHRpb25EZWZlcnJlZExvYWRFeGNlcHRpb246ICdGdXR1cmVPciBjYW4ndCBiZSBpbnN0YW50aWF0ZWRfbnVsbEZ1dHVyZV9mYWxzZUZ1dHVyZWNvbXB1dGF0aW9uX2NvbXBsZXRlbWljcm90YXNrX2FzeW5jQ29tcGxldGVFcnJvcmRlbGF5ZWR3YWl0ZnV0dXJlc2VhZ2VyRXJyb3JoYW5kbGVFcnJvcnRoZUVycm9ydGhlU3RhY2tUcmFjZV9jb21wbGV0ZUVycm9yX2NvbXBsZXRlV2l0aFZhbHVlb25WYWx1ZV9rVHJ1ZWRvV2hpbGVkb25lU2lnbmFsbmV4dEl0ZXJhdGlvbmJpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZGtlZXBHb2luZ2FzU3RyZWFtdGltZW91dHRpbWVMaW1pdG9uVGltZW91dFRpbWVvdXRFeGNlcHRpb25UaW1lb3V0RXhjZXB0aW9uIGFmdGVyIF9Db21wbGV0ZXJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWRfQXN5bmNDb21wbGV0ZXJfU3luY0NvbXBsZXRlcl9GdXR1cmVMaXN0ZW5lcm1hc2tFcnJvcm1hc2tUZXN0RXJyb3JtYXNrV2hlbmNvbXBsZXRlc3RhdGVDaGFpbnN0YXRlVGhlbnN0YXRlVGhlbk9uZXJyb3JzdGF0ZUNhdGNoZXJyb3JzdGF0ZUNhdGNoZXJyb3JUZXN0c3RhdGVXaGVuY29tcGxldGVfbmV4dExpc3RlbmVyX3pvbmVoYW5kbGVzVmFsdWVoYW5kbGVzRXJyb3JoYXNFcnJvclRlc3RoYW5kbGVzQ29tcGxldGVfb25WYWx1ZV9vbkVycm9yX2Vycm9yVGVzdF93aGVuQ29tcGxldGVBY3Rpb25oYXNFcnJvckNhbGxiYWNraGFuZGxlVmFsdWVzb3VyY2VSZXN1bHRtYXRjaGVzRXJyb3JUZXN0YXN5bmNFcnJvcmhhbmRsZVdoZW5Db21wbGV0ZV9hd2FpdGVyX3N0YXRlSW5jb21wbGV0ZV9zdGF0ZVBlbmRpbmdDb21wbGV0ZV9zdGF0ZUNoYWluZWRfc3RhdGVWYWx1ZV9zdGF0ZUVycm9yX3Jlc3VsdE9yTGlzdGVuZXJzaW1tZWRpYXRlem9uZVZhbHVlX3NldFZhbHVlaW1tZWRpYXRlRXJyb3JfaXNQZW5kaW5nQ29tcGxldGVfbWF5QWRkTGlzdGVuZXJfaXNDaGFpbmVkX2lzQ29tcGxldGVfaGFzRXJyb3Jfc2V0Q2hhaW5lZGN1cnJlbnRab25lcmVnaXN0ZXJVbmFyeUNhbGxiYWNrX3RoZW5Ob1pvbmVSZWdpc3RyYXRpb25yZWdpc3RlckNhbGxiYWNrX3NldFBlbmRpbmdDb21wbGV0ZV9jbGVhclBlbmRpbmdDb21wbGV0ZV9lcnJvcl9jaGFpblNvdXJjZV9zZXRFcnJvck9iamVjdF9zZXRFcnJvcl9jbG9uZVJlc3VsdHNjaGVkdWxlTWljcm90YXNrX3ByZXBlbmRMaXN0ZW5lcnNleGlzdGluZ0xpc3RlbmVyc19yZXZlcnNlTGlzdGVuZXJzX3JlbW92ZUxpc3RlbmVyc19jaGFpbkZvcmVpZ25GdXR1cmVfY2hhaW5Db3JlRnV0dXJlX2NoYWluRnV0dXJlX3Byb3BhZ2F0ZVRvTGlzdGVuZXJzaGFzRXJyb3JoYW5kbGVVbmNhdWdodEVycm9ybGlzdGVuZXJIYXNFcnJvcmxpc3RlbmVyVmFsdWVPckVycm9yaW5TYW1lRXJyb3Jab25lb2xkWm9uZWhhbmRsZVdoZW5Db21wbGV0ZUNhbGxiYWNrY29tcGxldGVSZXN1bHRvcmlnaW5hbFNvdXJjZWhhbmRsZVZhbHVlQ2FsbGJhY2tjaGFpblNvdXJjZXRpbWVyRnV0dXJlIG5vdCBjb21wbGV0ZWRfQXN5bmNDYWxsYmFja0VudHJ5X0FzeW5jUnVuX3NjaGVkdWxlSW1tZWRpYXRlTWljcm90YXNrcyBhcmUgbm90IHN1cHBvcnRlZDIuNV9jbG9zZVVuY2hlY2tlZGZyb21GdXR1cmVmcm9tRnV0dXJlc2Zyb21JdGVyYWJsZXBlcmlvZGljY29tcHV0YXRpb25Db3VudHdhdGNoc2VuZEV2ZW50c3RhcnRQZXJpb2RpY1RpbWVyZXZlbnRUcmFuc2Zvcm1lZG1hcFNpbmtjYXN0RnJvbWFzQnJvYWRjYXN0U3RyZWFtYXN5bmNNYXBhc3luY0V4cGFuZG5ld1N0cmVhbXBpcGVzdHJlYW1Db25zdW1lcnN0cmVhbVRyYW5zZm9ybWVyc2VlbkZpcnN0bmVlZGxlZHJhaW5mdXR1cmVWYWx1ZWFzRnV0dXJlZGlzdGluY3Rmb3VuZFJlc3VsdGVsZW1lbnRJbmRleGNyZWF0ZVRpbWVyTm8gc3RyZWFtIGV2ZW50cmVnaXN0ZXJlZE9uVGltZW91dHJ1blVuYXJ5R3VhcmRlZFN0cmVhbVN1YnNjcmlwdGlvbmhhbmRsZURhdGFoYW5kbGVEb25lcmVzdW1lU2lnbmFsU3RyZWFtVmlld19zdHJlYW1TdHJlYW1Db25zdW1lclN0cmVhbVNpbmtTdHJlYW1UcmFuc2Zvcm1lciN0eXBlQXJnMWZyb21IYW5kbGVyc2Zyb21CaW5kMi4xU1NTVFRTVFRSU1JUU3RyZWFtVHJhbnNmb3JtZXJCYXNlX0NvbnRyb2xsZXJFdmVudFNpbmtXcmFwcGVyU3RyZWFtQ29udHJvbGxlcmJyb2FkY2FzdG9uTGlzdGVuSGFuZGxlcm9uQ2FuY2VsSGFuZGxlclN5bmNocm9ub3VzU3RyZWFtQ29udHJvbGxlcl9TdHJlYW1Db250cm9sbGVyTGlmZWN5Y2xlX1N0cmVhbUNvbnRyb2xsZXJCYXNlX1N0cmVhbUNvbnRyb2xsZXJfU1RBVEVfU1VCU0NSSUJFRF9TVEFURV9DQU5DRUxFRF9TVEFURV9TVUJTQ1JJUFRJT05fTUFTS192YXJEYXRhX2lzQ2FuY2VsZWRfaXNJbml0aWFsU3RhdGVfaXNJbnB1dFBhdXNlZF9wZW5kaW5nRXZlbnRzdmFyRGF0YV9lbnN1cmVQZW5kaW5nRXZlbnRzX2JhZEV2ZW50U3RhdGVDYW5ub3QgYWRkIGV2ZW50IGFmdGVyIGNsb3NpbmdDYW5ub3QgYWRkIGV2ZW50IHdoaWxlIGFkZGluZyBhIHN0cmVhbVN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGxpc3RlbmVkIHRvLnBlbmRpbmdFdmVudHNfc2V0UGVuZGluZ0V2ZW50c19ndWFyZENhbGxiYWNrX1N5bmNTdHJlYW1Db250cm9sbGVyRGlzcGF0Y2hfQXN5bmNTdHJlYW1Db250cm9sbGVyRGlzcGF0Y2hfQXN5bmNTdHJlYW1Db250cm9sbGVyX1N5bmNTdHJlYW1Db250cm9sbGVyX2NyZWF0ZVN1YnNjcmlwdGlvbl9Db250cm9sbGVyU3Vic2NyaXB0aW9uX29uQ2FuY2VsX1N0cmVhbVNpbmtXcmFwcGVyX0FkZFN0cmVhbVN0YXRlYWRkU3Vic2NyaXB0aW9ubWFrZUVycm9ySGFuZGxlcl9TdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtU3RhdGVfRXZlbnRTaW5rX0V2ZW50RGlzcGF0Y2hfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uX1NUQVRFX0NBTkNFTF9PTl9FUlJPUl9TVEFURV9JTlBVVF9QQVVTRURfU1RBVEVfV0FJVF9GT1JfQ0FOQ0VMX1NUQVRFX0lOX0NBTExCQUNLX1NUQVRFX0hBU19QRU5ESU5HX1NUQVRFX1BBVVNFX0NPVU5UX29uRGF0YV9vbkRvbmVfY2FuY2VsRnV0dXJlc2NoZWR1bGVyZWdpc3RlckJpbmFyeUNhbGxiYWNraGFuZGxlRXJyb3IgY2FsbGJhY2sgbXVzdCB0YWtlIGVpdGhlciBhbiBPYmplY3QgKHRoZSBlcnJvciksIG9yIGJvdGggYW4gT2JqZWN0ICh0aGUgZXJyb3IpIGFuZCBhIFN0YWNrVHJhY2Uud2FzUGF1c2VkX2lzUGF1c2Vkd2FzSW5wdXRQYXVzZWRjYW5jZWxTY2hlZHVsZV9pbkNhbGxiYWNrX2RlY3JlbWVudFBhdXNlQ291bnRfbWF5UmVzdW1lSW5wdXRfY2FuY2VsY2FuY2VsRnV0dXJlX3dhaXRzRm9yQ2FuY2VsX2NhbkZpcmVfY2FuY2VsT25FcnJvcnBlbmRpbmdfY2hlY2tTdGF0ZXNlbmRFcnJvcnJ1bkJpbmFyeUd1YXJkZWRzZW5kRG9uZXJ1bkd1YXJkZWRpc0lucHV0UGF1c2VkX1N0cmVhbUltcGxfb25MaXN0ZW5fR2VuZXJhdGVkU3RyZWFtSW1wbF9pc1VzZWRfSXRlcmFibGVQZW5kaW5nRXZlbnRzX2l0ZXJhdG9yZGlzcGF0Y2hObyBldmVudHMgcGVuZGluZy5fRGVsYXllZEV2ZW50cGVyZm9ybV9EZWxheWVkRGF0YV9EZWxheWVkRXJyb3JfRGVsYXllZERvbmVObyBldmVudHMgYWZ0ZXIgYSBkb25lLl9QZW5kaW5nRXZlbnRzX1NUQVRFX1VOU0NIRURVTEVEX1NUQVRFX1NDSEVEVUxFRF9ldmVudFNjaGVkdWxlZF9TdHJlYW1JbXBsRXZlbnRzZmlyc3RQZW5kaW5nRXZlbnRsYXN0UGVuZGluZ0V2ZW50X0RvbmVTdHJlYW1TdWJzY3JpcHRpb25fRE9ORV9TRU5UX1NDSEVEVUxFRF9QQVVTRURfc2NoZWR1bGVfaXNTZW50X2lzU2NoZWR1bGVkX0FzQnJvYWRjYXN0U3RyZWFtX29uTGlzdGVuSGFuZGxlcl9vbkNhbmNlbEhhbmRsZXJzaHV0ZG93bl9jYW5jZWxTdWJzY3JpcHRpb25fcGF1c2VTdWJzY3JpcHRpb25fcmVzdW1lU3Vic2NyaXB0aW9uX2lzU3Vic2NyaXB0aW9uUGF1c2VkX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbldyYXBwZXJDYW5ub3QgY2hhbmdlIGhhbmRsZXJzIG9mIGFzQnJvYWRjYXN0U3RyZWFtIHNvdXJjZSBzdWJzY3JpcHRpb24uX3N0YXRlRGF0YUFscmVhZHkgd2FpdGluZyBmb3IgbmV4dC5faW5pdGlhbGl6ZU9yRG9uZXN0YXRlRGF0YW1vdmVOZXh0RnV0dXJlX0VtcHR5U3RyZWFtX0ZvcndhcmRpbmdTdHJlYW1faGFuZGxlRGF0YV9oYW5kbGVFcnJvcl9oYW5kbGVEb25lX0ZvcndhcmRpbmdTdHJlYW1TdWJzY3JpcHRpb25fV2hlcmVTdHJlYW1fdGVzdGlucHV0RXZlbnRfTWFwU3RyZWFtX3RyYW5zZm9ybW91dHB1dEV2ZW50X0V4cGFuZFN0cmVhbV9leHBhbmRfSGFuZGxlRXJyb3JTdHJlYW1fVGFrZVN0cmVhbV9TdGF0ZVN0cmVhbVN1YnNjcmlwdGlvbl9zaGFyZWRTdGF0ZV9mbGFnX1Rha2VXaGlsZVN0cmVhbV9Ta2lwU3RyZWFtX1NraXBXaGlsZVN0cmVhbWhhc0ZhaWxlZF9EaXN0aW5jdFN0cmVhbV9TRU5USU5FTHByZXZpb3VzRXZlbnRpc0VxdWFsX0V2ZW50U2lua1dyYXBwZXJfU2lua1RyYW5zZm9ybWVyU3RyZWFtU3Vic2NyaXB0aW9uX3RyYW5zZm9ybWVyU2lua21hcHBlcmV2ZW50U2lua19pc1N1YnNjcmliZWRTdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWRfU3RyZWFtU2lua1RyYW5zZm9ybWVyX3NpbmtNYXBwZXJfQm91bmRTaW5rU3RyZWFtX0hhbmRsZXJFdmVudFNpbmtUaGUgcHJvdmlkZWQgc2luayBtdXN0IG5vdCBiZSBudWxsLlNpbmsgaXMgY2xvc2VkX1N0cmVhbUhhbmRsZXJUcmFuc2Zvcm1lcm91dHB1dFNpbmtfU3RyZWFtQmluZFRyYW5zZm9ybWVyX1N0cmVhbVN1YnNjcmlwdGlvblRyYW5zZm9ybWVyX0JvdW5kU3Vic2NyaXB0aW9uU3RyZWFtVGltZXJiaW5kQ2FsbGJhY2tHdWFyZGVkY3JlYXRlUGVyaW9kaWNUaW1lcmJvdW5kQ2FsbGJhY2t0aWNrX2NyZWF0ZVRpbWVyVGltZXIgaW50ZXJmYWNlIG5vdCBzdXBwb3J0ZWQuX2NyZWF0ZVBlcmlvZGljVGltZXJBc3luY0Vycm9yX3N0YWNrVHJhY2Vfc3RhY2tUcmFjZT1fWm9uZUZ1bmN0aW9uZm9ya19ab25lU3BlY2lmaWNhdGlvbmVycm9yWm9uZW90aGVyWm9uZWFyZ3VtZW50MWFyZ3VtZW50MmJpbmRDYWxsYmFja2JpbmRVbmFyeUNhbGxiYWNrYmluZEJpbmFyeUNhbGxiYWNrYmluZEJpbmFyeUNhbGxiYWNrR3VhcmRlZF9lbnRlcl9sZWF2ZV9ab25lRGVsZWdhdGVfZGVsZWdhdGlvblRhcmdldGltcGxlbWVudGF0aW9uX2hhbmRsZVVuY2F1Z2h0RXJyb3JpbXBsWm9uZV9yZWdpc3RlckNhbGxiYWNrX3JlZ2lzdGVyVW5hcnlDYWxsYmFja19yZWdpc3RlckJpbmFyeUNhbGxiYWNrX2Vycm9yQ2FsbGJhY2tfc2NoZWR1bGVNaWNyb3Rhc2tfcHJpbnRfZm9ya19ab25lX0N1c3RvbVpvbmVfZGVsZWdhdGVDYWNoZXJlZ2lzdGVyZWRwYXJlbnREZWxlZ2F0ZWltcGxlbWVudGF0aW9uWm9uZV9Sb290Wm9uZV9yb290TWFwX3Jvb3REZWxlZ2F0ZV9sb2FkZWRMaWJyYXJpZXNfbmV4dENhbGxiYWNrX2xhc3RDYWxsYmFja19sYXN0UHJpb3JpdHlDYWxsYmFja19pc0luQ2FsbGJhY2tMb29wX3Jvb3Rab25lX2ZhdGFsRGFydEFzeW5jX2ZhdGFsdGhlbkNhbGxiYWNrYXdhaXRlclN0YWNrVHJhY2VfYXN5bmNTdGFja1RyYWNlSGVscGVyYXN5bmNfb3BfY2xlYXJBc3luY1RocmVhZFN0YWNrVHJhY2VTdGFja1RyYWNlX2NsZWFyQXN5bmNUaHJlYWRTdGFja1RyYWNlX3NldEFzeW5jVGhyZWFkU3RhY2tUcmFjZVN0YWNrVHJhY2Vfc2V0QXN5bmNUaHJlYWRTdGFja1RyYWNlX21vdmVOZXh0RGVidWdnZXJTdGVwQ2hlY2tBc3luY1N0YXJNb3ZlTmV4dF9kZWJ1Z2dlclN0ZXBDaGVja19zZXRTY2hlZHVsZUltbWVkaWF0ZUNsb3N1cmVfZW5zdXJlU2NoZWR1bGVJbW1lZGlhdGVfaW52b2tlRXJyb3JIYW5kbGVydW5hcnlFcnJvckhhbmRsZXJfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFja19hc3luY0NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2tfbm9uTnVsbEVycm9yX3JlZ2lzdGVyRXJyb3JIYW5kbGVyRXJyb3IgaGFuZGxlciBtdXN0IGFjY2VwdCBvbmUgT2JqZWN0IG9yIG9uZSBPYmplY3QgYW5kIGEgU3RhY2tUcmFjZSBhcyBhcmd1bWVudHMsIGFuZCByZXR1cm4gYSBhIHZhbGlkIHJlc3VsdF9taWNyb3Rhc2tMb29wX3N0YXJ0TWljcm90YXNrTG9vcF9zY2hlZHVsZUFzeW5jQ2FsbGJhY2tuZXdFbnRyeV9zY2hlZHVsZVByaW9yaXR5QXN5bmNDYWxsYmFja19ydW5HdWFyZGVkbm90aWZpY2F0aW9uSGFuZGxlcl9udWxsRGF0YUhhbmRsZXJfbnVsbEVycm9ySGFuZGxlcl9udWxsRG9uZUhhbmRsZXJfcnVuVXNlckNvZGVvblN1Y2Nlc3NfY2FuY2VsQW5kRXJyb3JfY2FuY2VsQW5kRXJyb3JXaXRoUmVwbGFjZW1lbnRfY2FuY2VsQW5kRXJyb3JDbG9zdXJlX2NhbmNlbEFuZFZhbHVlX2FkZEVycm9yV2l0aFJlcGxhY2VtZW50X3BhcmVudERlbGVnYXRlX3Jvb3RIYW5kbGVVbmNhdWdodEVycm9yX3JldGhyb3dBc3luY19yZXRocm93X3Jvb3RSdW5fcm9vdFJ1blVuYXJ5X3Jvb3RSdW5CaW5hcnlfcm9vdFJlZ2lzdGVyQ2FsbGJhY2tfcm9vdFJlZ2lzdGVyVW5hcnlDYWxsYmFja19yb290UmVnaXN0ZXJCaW5hcnlDYWxsYmFja19yb290RXJyb3JDYWxsYmFja19yb290U2NoZWR1bGVNaWNyb3Rhc2toYXNFcnJvckhhbmRsZXJfcm9vdENyZWF0ZVRpbWVyX3Jvb3RDcmVhdGVQZXJpb2RpY1RpbWVyX3Jvb3RQcmludF9wcmludFRvWm9uZV9yb290Rm9ya1pvbmVTcGVjaWZpY2F0aW9ucyBtdXN0IGJlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3Rvci52YWx1ZU1hcHVuYXJ5T25FcnJvcmJpbmFyeU9uRXJyb3JvbkVycm9yIGNhbGxiYWNrIG11c3QgdGFrZSBlaXRoZXIgYW4gT2JqZWN0IF9ydW5ab25lZGRhcnQuY29sbGVjdGlvbmNvbGxlY3Rpb25zLmRhcnRoYXNoX21hcC5kYXJ0aGFzaF9zZXQuZGFydGl0ZXJhYmxlLmRhcnRpdGVyYXRvci5kYXJ0bGlua2VkX2hhc2hfbWFwLmRhcnRsaW5rZWRfaGFzaF9zZXQuZGFydGxpbmtlZF9saXN0LmRhcnRsaXN0LmRhcnRtYXBzLmRhcnRxdWV1ZS5kYXJ0c2V0LmRhcnRzcGxheV90cmVlLmRhcnRfSGFzaGVyX0hhc2hNYXBfZWxlbWVudENvdW50X2J1Y2tldHNfbW9kaWZpY2F0aW9uQ291bnRidWNrZXRzX2FkZEVudHJ5c3RhbXBfcmVtb3ZlRW50cnlwcmV2aW91c0luQnVja2V0YnVja2V0SW5kZXhuZXdFbGVtZW50c19yZXNpemVvbGRCdWNrZXRzbmV3QnVja2V0c19uZXdLZXlTZXRfQ3VzdG9tSGFzaE1hcF92YWxpZEtleXZhbGlkS2V5X0lkZW50aXR5SGFzaE1hcF9IYXNoTWFwRW50cnlfSGFzaE1hcEl0ZXJhYmxlX0hhc2hNYXBLZXlJdGVyYWJsZV9IYXNoTWFwVmFsdWVJdGVyYWJsZV9IYXNoTWFwSXRlcmF0b3Jfc3RhbXBfZW50cnlfSGFzaE1hcEtleUl0ZXJhdG9yX0hhc2hNYXBWYWx1ZUl0ZXJhdG9yX0hhc2hTZXRfbmV3RW1wdHlfcmVtb3ZlX2ZpbHRlcldoZXJlcmVtb3ZlTWF0Y2hpbmdtb2RpZmljYXRpb25Db3VudHRlc3RSZXN1bHRfbmV3U2ltaWxhclNldF9JZGVudGl0eUhhc2hTZXRfQ3VzdG9tSGFzaFNldF9lcXVhbGl0eV9IYXNoU2V0RW50cnlfSGFzaFNldEl0ZXJhdG9yX0hhc2hGaWVsZEJhc2VfaGFzaE1hc2tfdXNlZERhdGFfZGVsZXRlZEtleXNkYXRhU2l6ZV9IYXNoVk1CYXNldm06ZXhhY3QtcmVzdWx0LXR5cGVkYXJ0OnR5cGVkX2RhdGEjX1VpbnQzMkxpc3RMaW5rZWRIYXNoTWFwX2dldEluZGV4TGlua2VkSGFzaE1hcF9zZXRJbmRleGRhcnQ6Y29yZSNfU21pTGlua2VkSGFzaE1hcF9nZXRIYXNoTWFza0xpbmtlZEhhc2hNYXBfc2V0SGFzaE1hc2tkYXJ0OmNvcmUjX0xpc3RMaW5rZWRIYXNoTWFwX2dldERhdGFMaW5rZWRIYXNoTWFwX3NldERhdGFMaW5rZWRIYXNoTWFwX2dldFVzZWREYXRhTGlua2VkSGFzaE1hcF9zZXRVc2VkRGF0YUxpbmtlZEhhc2hNYXBfZ2V0RGVsZXRlZEtleXNMaW5rZWRIYXNoTWFwX3NldERlbGV0ZWRLZXlzX0hhc2hCYXNlX0lOSVRJQUxfSU5ERVhfQklUU19JTklUSUFMX0lOREVYX1NJWkVfVU5VU0VEX1BBSVJfREVMRVRFRF9QQUlSX2luZGV4U2l6ZVRvSGFzaE1hc2tpbmRleFNpemVpbmRleEJpdHNfaGFzaFBhdHRlcm5mdWxsSGFzaGhhc2hNYXNrbWFza2VkSGFzaF9maXJzdFByb2Jlc2l6ZU1hc2tfbmV4dFByb2JlX2lzRGVsZXRlZGtleU9yVmFsdWVfc2V0RGVsZXRlZEF0X2NoZWNrU3VtX2lzTW9kaWZpZWRTaW5jZW9sZERhdGFvbGRDaGVja1N1bV9PcGVyYXRvckVxdWFsc0FuZEhhc2hDb2RlX0lkZW50aWNhbEFuZElkZW50aXR5SGFzaENvZGVfX0ludGVybmFsTGlua2VkSGFzaE1hcCZfSGFzaFZNQmFzZSZNYXBNaXhpbktleSBub3QgaW4gbWFwLm5ld0VudHJpZXNfX0ludGVybmFsTGlua2VkSGFzaE1hcCZfSGFzaFZNQmFzZSZNYXBNaXhpbiZfTGlua2VkSGFzaE1hcE1peGluX3JlaGFzaF9pbml0b2xkVXNlZF9yZWdlbmVyYXRlSW5kZXh0bXBVc2VkX2luc2VydGhhc2hQYXR0ZXJuX2ZpbmRWYWx1ZU9ySW5zZXJ0UG9pbnRtYXhFbnRyaWVzZmlyc3REZWxldGVkX2dldFZhbHVlT3JEYXRha2l2aV9fSW50ZXJuYWxMaW5rZWRIYXNoTWFwJl9IYXNoVk1CYXNlJk1hcE1peGluJl9MaW5rZWRIYXNoTWFwTWl4aW4mX0hhc2hCYXNlX19JbnRlcm5hbExpbmtlZEhhc2hNYXAmX0hhc2hWTUJhc2UmTWFwTWl4aW4mX0xpbmtlZEhhc2hNYXBNaXhpbiZfSGFzaEJhc2UmX09wZXJhdG9yRXF1YWxzQW5kSGFzaENvZGVfSW50ZXJuYWxMaW5rZWRIYXNoTWFwX0xpbmtlZEhhc2hNYXBNaXhpbl9fQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaE1hcCZfSGFzaEZpZWxkQmFzZSZNYXBNaXhpbl9fQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaE1hcCZfSGFzaEZpZWxkQmFzZSZNYXBNaXhpbiZfTGlua2VkSGFzaE1hcE1peGluX19Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoTWFwJl9IYXNoRmllbGRCYXNlJk1hcE1peGluJl9MaW5rZWRIYXNoTWFwTWl4aW4mX0hhc2hCYXNlX19Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoTWFwJl9IYXNoRmllbGRCYXNlJk1hcE1peGluJl9MaW5rZWRIYXNoTWFwTWl4aW4mX0hhc2hCYXNlJl9JZGVudGljYWxBbmRJZGVudGl0eUhhc2hDb2RlX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hNYXBfX0NvbXBhY3RMaW5rZWRDdXN0b21IYXNoTWFwJl9IYXNoRmllbGRCYXNlJk1hcE1peGluX19Db21wYWN0TGlua2VkQ3VzdG9tSGFzaE1hcCZfSGFzaEZpZWxkQmFzZSZNYXBNaXhpbiZfTGlua2VkSGFzaE1hcE1peGluX19Db21wYWN0TGlua2VkQ3VzdG9tSGFzaE1hcCZfSGFzaEZpZWxkQmFzZSZNYXBNaXhpbiZfTGlua2VkSGFzaE1hcE1peGluJl9IYXNoQmFzZV9Db21wYWN0TGlua2VkQ3VzdG9tSGFzaE1hcF9Db21wYWN0SXRlcmFibGVfbGVuX3N0ZXBfQ29tcGFjdEl0ZXJhdG9yX19Db21wYWN0TGlua2VkSGFzaFNldCZfSGFzaEZpZWxkQmFzZSZfSGFzaEJhc2VfX0NvbXBhY3RMaW5rZWRIYXNoU2V0Jl9IYXNoRmllbGRCYXNlJl9IYXNoQmFzZSZfT3BlcmF0b3JFcXVhbHNBbmRIYXNoQ29kZV9fQ29tcGFjdExpbmtlZEhhc2hTZXQmX0hhc2hGaWVsZEJhc2UmX0hhc2hCYXNlJl9PcGVyYXRvckVxdWFsc0FuZEhhc2hDb2RlJlNldE1peGluaXRmb3VuZE1hdGNoaW5nX0NvbXBhY3RMaW5rZWRIYXNoU2V0X2dldEtleU9yRGF0YV9fQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaFNldCZfQ29tcGFjdExpbmtlZEhhc2hTZXQmX0lkZW50aWNhbEFuZElkZW50aXR5SGFzaENvZGVfQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaFNldF9Db21wYWN0TGlua2VkQ3VzdG9tSGFzaFNldGZyb21JdGVyYWJsZXNmcm9tRW50cmllc0hhc2hTZXRpdGVyYWJsZVRvU2hvcnRTdHJpbmdsZWZ0RGVsaW1pdGVycmlnaHREZWxpbWl0ZXIoLi4uKWl0ZXJhYmxlVG9GdWxsU3RyaW5nSGFzTmV4dEl0ZXJhdG9yX0hBU19ORVhUX0FORF9ORVhUX0lOX0NVUlJFTlRfTk9fTkVYVF9OT1RfTU9WRURfWUVUX21vdmVObyBtb3JlIGVsZW1lbnRzTGlua2VkTGlzdF9maXJzdF9pbnNlcnRCZWZvcmV1cGRhdGVGaXJzdF91bmxpbmtUb28gbWFueSBlbGVtZW50c0xpbmtlZExpc3RFbnRyeSBpcyBhbHJlYWR5IGluIGEgTGlua2VkTGlzdF9MaW5rZWRMaXN0SXRlcmF0b3JfdmlzaXRlZEZpcnN0TGlua2VkTGlzdEVudHJ5dW5saW5raW5zZXJ0QWZ0ZXJpbnNlcnRCZWZvcmVfTGlzdEJhc2UmT2JqZWN0Jkxpc3RNaXhpbmxpc3RUb1N0cmluZ21hcFRvU3RyaW5nX2lkX2ZpbGxNYXBXaXRoTWFwcGVkSXRlcmFibGVfZmlsbE1hcFdpdGhJdGVyYWJsZXNrZXlJdGVyYXRvcnZhbHVlSXRlcmF0b3JoYXNOZXh0S2V5aGFzTmV4dFZhbHVlSXRlcmFibGVzIGRvIG5vdCBoYXZlIHNhbWUgbGVuZ3RoLk1hcE1peGluVW5tb2RpZmlhYmxlTWFwQmFzZUNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1hcF9NYXBCYXNlVmFsdWVJdGVyYWJsZV9NYXBCYXNlVmFsdWVJdGVyYXRvcl9Vbm1vZGlmaWFibGVNYXBNaXhpbk1hcFZpZXdfVW5tb2RpZmlhYmxlTWFwVmlldyZNYXBWaWV3Jl9Vbm1vZGlmaWFibGVNYXBNaXhpbl9Eb3VibGVMaW5rX3ByZXZpb3VzTGlua19uZXh0TGlua0RvdWJsZUxpbmtlZFF1ZXVlRW50cnlwcmV2aW91c0VudHJ5bmV4dEVudHJ5X0RvdWJsZUxpbmtlZFF1ZXVlRW50cnlfYXNOb25TZW50aW5lbEVudHJ5X2FwcGVuZF9wcmVwZW5kX0RvdWJsZUxpbmtlZFF1ZXVlRWxlbWVudF9Eb3VibGVMaW5rZWRRdWV1ZVNlbnRpbmVsRG91YmxlTGlua2VkUXVldWVfc2VudGluZWxsYXN0RW50cnlmaXJzdEVudHJ5Zm9yRWFjaEVudHJ5X0RvdWJsZUxpbmtlZFF1ZXVlSXRlcmF0b3JfbmV4dEVudHJ5ZWxlbWVudEVudHJ5TGlzdFF1ZXVlX2NoZWNrTW9kaWZpY2F0aW9uZXhwZWN0ZWRNb2RpZmljYXRpb25Db3VudHN0YXJ0RGlzdGFuY2VlbmREaXN0YW5jZXByZXZPZmZzZXRfTGlzdFF1ZXVlSXRlcmF0b3JfcG9zaXRpb25TZXRNaXhpbl9TZXRCYXNlJk9iamVjdCZTZXRNaXhpbnNldFRvU3RyaW5nX1NldEJhc2VDYW5ub3QgY2hhbmdlIHVubW9kaWZpYWJsZSBzZXRfU3BsYXlUcmVlTm9kZV9TcGxheVRyZWVNYXBOb2RlX1NwbGF5VHJlZV9zcGxheUNvdW50X2R1bW15X2NvbXBhcmF0b3JfY29tcGFyZV9zcGxheV9zcGxheU1pbl9zcGxheU1heF9hZGROZXdSb290X2xhc3RfY2xlYXJfVHlwZVRlc3RfU3BsYXlUcmVlTWFwJl9TcGxheVRyZWUmTWFwTWl4aW5TcGxheVRyZWVNYXBtYXBSb290c3BsYXlDb3VudGluaXRpYWxTcGxheUNvdW50Zmlyc3RLZXlsYXN0S2V5bGFzdEtleUJlZm9yZWZpcnN0S2V5QWZ0ZXJfU3BsYXlUcmVlSXRlcmF0b3JfdHJlZV93b3JrTGlzdF9jdXJyZW50Tm9kZV9maW5kTGVmdE1vc3REZXNjZW5kZW50c3RhcnRBdHN0YXJ0S2V5X2dldFZhbHVlX3JlYnVpbGRXb3JrTGlzdF9TcGxheVRyZWVLZXlJdGVyYWJsZV9jb3B5Tm9kZV9TcGxheVRyZWVWYWx1ZUl0ZXJhYmxlX1NwbGF5VHJlZUtleUl0ZXJhdG9yX1NwbGF5VHJlZVZhbHVlSXRlcmF0b3JtYXBOb2RlX1NwbGF5VHJlZU5vZGVJdGVyYXRvcl9TcGxheVRyZWVTZXQmX1NwbGF5VHJlZSZJdGVyYWJsZU1peGluX1NwbGF5VHJlZVNldCZfU3BsYXlUcmVlJkl0ZXJhYmxlTWl4aW4mU2V0TWl4aW5TcGxheVRyZWVTZXRfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0tfcmVoYXNoT2JqZWN0c19kZWZhdWx0RXF1YWxzX2RlZmF1bHRIYXNoQ29kZV9pdGVyYWJsZVBhcnRzVG9TdHJpbmdzcGVudWx0aW1hdGVTdHJpbmd1bHRpbWF0ZVN0cmluZ3BlbnVsdGltYXRldWx0aW1hdGVlbGlzaW9uX2R5bmFtaWNDb21wYXJlX2RlZmF1bHRDb21wYXJlZGFydC5jb252ZXJ0UE9XRVJTX09GX1RFTkNsYXNzSURDYXN0Q29udmVydGVycGFyc2VIZXhCeXRlYXNjaWkuZGFydGJhc2U2NC5kYXJ0Ynl0ZV9jb252ZXJzaW9uLmRhcnRjaHVua2VkX2NvbnZlcnNpb24uZGFydGNvZGVjLmRhcnRjb252ZXJ0ZXIuZGFydGVuY29kaW5nLmRhcnRodG1sX2VzY2FwZS5kYXJ0anNvbi5kYXJ0bGF0aW4xLmRhcnRsaW5lX3NwbGl0dGVyLmRhcnRzdHJpbmdfY29udmVyc2lvbi5kYXJ0dXRmLmRhcnRfSnNvblV0ZjhEZWNvZGVyX3Jldml2ZXJfYWxsb3dNYWxmb3JtZWRjaHVua0VuZF9Kc29uTGlzdGVuZXJoYW5kbGVTdHJpbmdoYW5kbGVOdW1iZXJoYW5kbGVCb29saGFuZGxlTnVsbGJlZ2luT2JqZWN0cHJvcGVydHlWYWx1ZWVuZE9iamVjdGJlZ2luQXJyYXlhcnJheUVsZW1lbnRlbmRBcnJheV9CdWlsZEpzb25MaXN0ZW5lcnB1c2hDb250YWluZXJwb3BDb250YWluZXJfUmV2aXZlckpzb25MaXN0ZW5lcnJldml2ZXJfTnVtYmVyQnVmZmVybWluQ2FwYWNpdHlrRGVmYXVsdE92ZXJoZWFkX2luaXRpYWxDYXBhY2l0eWVuc3VyZUNhcGFjaXR5cGFyc2VOdW1wYXJzZURvdWJsZV9DaHVua2VkSnNvblBhcnNlclRPUF9MRVZFTElOU0lERV9BUlJBWUlOU0lERV9PQkpFQ1RBRlRFUl9DT0xPTkFMTE9XX1NUUklOR19NQVNLQUxMT1dfVkFMVUVfTUFTS0FMTE9XX1ZBTFVFU1RSSU5HX09OTFlOT19WQUxVRVNOT05fRU1QVFlFTVBUWV9NQVNLU1RBVEVfSU5JVElBTFNUQVRFX0VORFNUQVRFX0FSUkFZX0VNUFRZU1RBVEVfQVJSQVlfVkFMVUVTVEFURV9BUlJBWV9DT01NQVNUQVRFX09CSkVDVF9FTVBUWVNUQVRFX09CSkVDVF9LRVlTVEFURV9PQkpFQ1RfQ09MT05TVEFURV9PQkpFQ1RfVkFMVUVTVEFURV9PQkpFQ1RfQ09NTUFWQUxVRV9SRUFEX0JJVFNCQUNLU1BBQ0VUQUJORVdMSU5FQ0FSUklBR0VfUkVUVVJORk9STV9GRUVEUVVPVEVERUNJTUFMUE9JTlRDSEFSXzBDSEFSXzlDSEFSX0VMQlJBQ0tFVFJCUkFDS0VUQ0hBUl9hQ0hBUl9iQ0hBUl9lQ0hBUl9mQ0hBUl9sQ0hBUl9uQ0hBUl9yQ0hBUl9zQ0hBUl90Q0hBUl91Tk9fUEFSVElBTFBBUlRJQUxfU1RSSU5HUEFSVElBTF9OVU1FUkFMUEFSVElBTF9LRVlXT1JETUFTS19QQVJUSUFMTlVNX1NJR05OVU1fWkVST05VTV9ESUdJVE5VTV9ET1ROVU1fRE9UX0RJR0lUTlVNX0VOVU1fRV9TSUdOTlVNX0VfRElHSVROVU1fU1VDQ0VTU1NUUl9QTEFJTlNUUl9FU0NBUEVTVFJfVVNUUl9VX0NPVU5UX1NISUZUU1RSX1VfVkFMVUVfU0hJRlRLV0RfVFlQRV9NQVNLS1dEX1RZUEVfU0hJRlRLV0RfTlVMTEtXRF9UUlVFS1dEX0ZBTFNFS1dEX0JPTUtXRF9DT1VOVF9TSElGVFRXT19CSVRfTUFTS3BhcnRpYWxTdGF0ZXNhdmVTdGF0ZXJlc3RvcmVTdGF0ZXBhcnRpYWxUeXBlbnVtU3RhdGVmaW5pc2hDaHVua051bWJlclVudGVybWluYXRlZCBzdHJpbmdnZXRDaGFyY29weUNoYXJzVG9MaXN0YmVnaW5TdHJpbmdhZGRDaGFyVG9TdHJpbmdhZGRTbGljZVRvU3RyaW5nZW5kU3RyaW5ncGFyc2VQYXJ0aWFscGFyc2VQYXJ0aWFsU3RyaW5ncGFyc2VQYXJ0aWFsTnVtYmVycGFyc2VQYXJ0aWFsS2V5d29yZGNvbnRpbnVlQ2h1bmtOdW1iZXJwYXJzZVN0cmluZ1RvQnVmZmVycGFyc2VTdHJpbmdFc2NhcGVjaHVua1N0cmluZ0VzY2FwZVVwYXJzZUhleERpZ2l0SW52YWxpZCBoZXggZGlnaXRrZXl3b3JkVHlwZWtleXdvcmRUeXBlSW5kZXjDr8K7wr9leHBlY3RlZENoYXJwYXJzZVN0cmluZ3BhcnNlTnVsbHBhcnNlRmFsc2VwYXJzZVRydWVwYXJzZU51bWJlcnBhcnNlS2V5d29yZFByZWZpeGNoYXJzc2xpY2VFbmRDb250cm9sIGNoYXJhY3RlciBpbiBzdHJpbmdjaHVua1N0cmluZ3N0cmluZ1N0YXRlcXVvdGVQb3NpdGlvbmhleFN0YXJ0SW52YWxpZCB1bmljb2RlIGVzY2FwZVVucmVjb2duaXplZCBzdHJpbmcgZXNjYXBlYmVnaW5DaHVua051bWJlcmFkZE51bWJlckNodW5rb3ZlcmhlYWRVbnRlcm1pbmF0ZWQgbnVtYmVyIGxpdGVyYWxNaXNzaW5nIGV4cGVjdGVkIGRpZ2l0ZGlnaXRDb3VudGhpZ2hEaWdpdDkyMjMzNzIwMzY4NTQ3NzU4MGV4cFNpZ25leHBvbmVudE92ZXJmbG93Yml0RmxhZzkwMDcxOTkyNTQ3NDA5OTIuMHNpZ25lZE1hbnRpc3NhMTAuMDEwMC4wMTAwMC4wMTAwMDAuMDEwMDAwMC4wMTAwMDAwMC4wMTAwMDAwMDAuMDEwMDAwMDAwMC4wMTAwMDAwMDAwMC4wMTAwMDAwMDAwMDAuMDEwMDAwMDAwMDAwMC4wMTAwMDAwMDAwMDAwMC4wMTAwMDAwMDAwMDAwMDAuMDEwMDAwMDAwMDAwMDAwMC4wMTAwMDAwMDAwMDAwMDAwMC4wMTAwMDAwMDAwMDAwMDAwMDAuMDEwMDAwMDAwMDAwMDAwMDAwMC4wMTAwMDAwMDAwMDAwMDAwMDAwMC4wMTAwMDAwMDAwMDAwMDAwMDAwMDAuMDEwMDAwMDAwMDAwMDAwMDAwMDAwMC4wMWUrMjExZSsyMlVuZXhwZWN0ZWQgY2hhcmFjdGVyVW5leHBlY3RlZCBlbmQgb2YgaW5wdXRfSnNvblN0cmluZ1BhcnNlcl9Kc29uU3RyaW5nRGVjb2RlclNpbmtfcGFyc2VyX2NyZWF0ZVBhcnNlcl9VdGY4U3RyaW5nQnVmZmVySU5JVElBTF9DQVBBQ0lUWU1BU0tfVFdPX0JJVE1BU0tfU0laRVNISUZUX01JU1NJTkdTSElGVF9WQUxVRU1BWF9BU0NJSU1BWF9UV09fQllURU1BWF9USFJFRV9CWVRFTUFYX1VOSUNPREVNQVNLX1RXT19CWVRFTUFTS19USFJFRV9CWVRFTUFTS19GT1VSX0JZVEVNQVNLX0NPTlRJTlVFX1RBR01BU0tfQ09OVElOVUVfVkFMVUVDT05USU5VRV9UQUdMRUFEX1NVUlJPR0FURVRBSUxfU1VSUk9HQVRFU0hJRlRfSElHSF9TVVJST0dBVEVNQVNLX0xPV19TVVJST0dBVEVpc0xhdGluMWFkZENvbnRpbnVhdGlvbm1pc3Npbmdjb2RlRW5kYWRkQ2hhckNvZGVFeHBlY3RlZCBVVEYtOCBjb250aW51YXRpb24gYnl0ZSwgZm91bmQgSW52YWxpZCBlbmNvZGluZzogVSsgZW5jb2RlZCBpbiAgYnl0ZXMuSW5jb21wbGV0ZSBVVEYtOCBzZXF1ZW5jZV90bzE2Qml0Y29udGludWVCeXRlQ291bnRVbmV4cGVjdGVkIFVURi04IGNvbnRpbnVhdGlvbiBieXRlSW52YWxpZCBVVEYtOCBieXRlOiBzZWVuQnl0ZUNvdW50X0pzb25VdGY4UGFyc2VyX0pzb25VdGY4RGVjb2RlclNpbmtfYWRkQ2h1bmtBc2NpaUNvZGVjX2FsbG93SW52YWxpZGFsbG93SW52YWxpZHVzLWFzY2lpX1VuaWNvZGVTdWJzZXRFbmNvZGVyX3N1YnNldE1hc2tzdHJpbmdMZW5ndGhDb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuQXNjaWlFbmNvZGVyX1VuaWNvZGVTdWJzZXRFbmNvZGVyU2lua1NvdXJjZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciB3aXRoIGNvZGUgcG9pbnQ6IF9Vbmljb2RlU3Vic2V0RGVjb2RlckludmFsaWQgdmFsdWUgaW4gaW5wdXQ6IF9jb252ZXJ0SW52YWxpZEFzY2lpRGVjb2RlcnN0cmluZ1NpbmtfRXJyb3JIYW5kbGluZ0FzY2lpRGVjb2RlclNpbmtfdXRmOFNpbmtfU2ltcGxlQXNjaWlEZWNvZGVyU2lua1NvdXJjZSBjb250YWlucyBub24tQVNDSUkgYnl0ZXMuQmFzZTY0Q29kZWN1cmxTYWZlYWxwaGFiZXRpbnZlcnNlQWxwaGFiZXRmaXJzdFBhZGRpbmdmaXJzdFBhZGRpbmdTb3VyY2VJbmRleHBhZGRpbmdDb3VudG9yaWdpbmFsQ2hhckludmFsaWQgYmFzZTY0IGRhdGFlbmRMZW5ndGhJbnZhbGlkIGJhc2U2NCBlbmNvZGluZyBsZW5ndGggX2NoZWNrUGFkZGluZ3NvdXJjZUluZGV4SW52YWxpZCBiYXNlNjQgcGFkZGluZywgcGFkZGVkIGxlbmd0aCBtdXN0IGJlIG11bHRpcGxlIG9mIGZvdXIsIGlzIEludmFsaWQgYmFzZTY0IHBhZGRpbmcsICc9JyBub3QgYXQgdGhlIGVuZEludmFsaWQgYmFzZTY0IHBhZGRpbmcsIG1vcmUgdGhhbiB0d28gJz0nIGNoYXJhY3RlcnNCYXNlNjRFbmNvZGVyX3VybFNhZmVfQmFzZTY0RW5jb2Rlcl9iYXNlNjRBbHBoYWJldF9iYXNlNjRVcmxBbHBoYWJldEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV9fdmFsdWVTaGlmdF9jb3VudE1hc2tfc2l4Qml0TWFza19hbHBoYWJldF9lbmNvZGVTdGF0ZV9zdGF0ZUJpdHNfc3RhdGVDb3VudGNyZWF0ZUJ1ZmZlcmZ1bGxDaHVua3NwYXJ0aWFsQ2h1bmtMZW5ndGhlbmNvZGVDaHVua291dHB1dEluZGV4ZXhwZWN0ZWRDaGFyc05vdCBhIGJ5dGUgdmFsdWUgYXQgaW5kZXggOiAweHdyaXRlRmluYWxDaHVua19CdWZmZXJDYWNoaW5nQmFzZTY0RW5jb2RlcmJ1ZmZlckNhY2hlX0Jhc2U2NEVuY29kZXJTaW5rX0FzY2lpQmFzZTY0RW5jb2RlclNpbmtfVXRmOEJhc2U2NEVuY29kZXJTaW5rQmFzZTY0RGVjb2Rlcl9CYXNlNjREZWNvZGVyX2ludmFsaWRfcGFkZGluZ19wX2ludmVyc2VBbHBoYWJldF9jaGFyX3BlcmNlbnRfY2hhcl8zX2NoYXJfZF9lbmNvZGVDaGFyYWN0ZXJTdGF0ZV9lbmNvZGVQYWRkaW5nU3RhdGVleHBlY3RlZFBhZGRpbmdfc3RhdGVQYWRkaW5nX2hhc1NlZW5QYWRkaW5nTWlzc2luZyBwYWRkaW5nIGNoYXJhY3RlckludmFsaWQgbGVuZ3RoLCBtdXN0IGJlIG11bHRpcGxlIG9mIGZvdXJkZWNvZGVDaHVua291dEluZGV4Y2hhck9ySW52YWxpZCBlbmNvZGluZyBiZWZvcmUgcGFkZGluZ0ludmFsaWQgY2hhcmFjdGVyX2FsbG9jYXRlQnVmZmVycGFkZGluZ1N0YXJ0cmVtYWluZGVyTGVuZ3RoX3RyaW1QYWRkaW5nQ2hhcnNuZXdFbmRleHBlY3RlZFBhcnRpYWxQYWRkaW5nSW52YWxpZCBwYWRkaW5nIGNoYXJhY3Rlcl9CYXNlNjREZWNvZGVyU2lua19kZWNvZGVyQnl0ZUNvbnZlcnNpb25TaW5rd2l0aENhbGxiYWNrQnl0ZUNvbnZlcnNpb25TaW5rQmFzZV9CeXRlQWRhcHRlclNpbmtfQnl0ZUNhbGxiYWNrU2lua19JTklUSUFMX0JVRkZFUl9TSVpFX2J1ZmZlckluZGV4ZnJlZUNvdW50Z3Jvd25fcm91bmRUb1Bvd2VyT2YyX1NpbXBsZUNhbGxiYWNrU2lua19hY2N1bXVsYXRlZF9Db252ZXJ0ZXJTdHJlYW1FdmVudFNpbmtfZXZlbnRTaW5rX2NodW5rZWRTaW5rQ29kZWNmdXNlaW52ZXJ0ZWRfRnVzZWRDb2RlY19zZWNvbmRfSW52ZXJ0ZWRDb2RlY19jb2RlY2NvZGVjQ29udmVydGVyVGhpcyBjb252ZXJ0ZXIgZG9lcyBub3Qgc3VwcG9ydCBjaHVua2VkIGNvbnZlcnNpb25zOiBfRnVzZWRDb252ZXJ0ZXJfbmFtZVRvRW5jb2Rpbmdpc29fODg1OS0xOjE5ODdpc28taXItMTAwaXNvXzg4NTktMWlzby04ODU5LTFsYXRpbjFsMWlibTgxOWNwODE5Y3Npc29sYXRpbjFpc28taXItNmFuc2lfeDMuNC0xOTY4YW5zaV94My40LTE5ODZpc29fNjQ2LmlydjoxOTkxaXNvNjQ2LXVzdXNpYm0zNjdjcDM2N2NzYXNjaWljc3V0Zjh1dGYtOGRlY29kZVN0cmVhbWJ5dGVTdHJlYW1nZXRCeU5hbWVIdG1sRXNjYXBlTW9kZWVzY2FwZUx0R3Rlc2NhcGVRdW90ZXNjYXBlQXBvc2VzY2FwZVNsYXNoYXR0cmlidXRlc3FBdHRyaWJ1dGVjdXN0b21IdG1sRXNjYXBlJmFtcDsmcXVvdDsmIzM5OyYjNDc7X0h0bWxFc2NhcGVTaW5rSnNvblVuc3VwcG9ydGVkT2JqZWN0RXJyb3J1bnN1cHBvcnRlZE9iamVjdHBhcnRpYWxSZXN1bHRzYWZlU3RyaW5nQ29udmVydGluZyBvYmplY3QgdG8gYW4gZW5jb2RhYmxlIG9iamVjdCBmYWlsZWQ6Q29udmVydGluZyBvYmplY3QgZGlkIG5vdCByZXR1cm4gYW4gZW5jb2RhYmxlIG9iamVjdDpKc29uQ3ljbGljRXJyb3JDeWNsaWMgZXJyb3IgaW4gSlNPTiBzdHJpbmdpZnlKc29uQ29kZWNfdG9FbmNvZGFibGV0b0VuY29kYWJsZXdpdGhSZXZpdmVyd2l0aEluZGVudEpzb25VdGY4RW5jb2Rlcl9kZWZhdWx0QnVmZmVyU2l6ZURFRkFVTFRfQlVGRkVSX1NJWkVfaW5kZW50X2J1ZmZlclNpemVidWZmZXJTaXplX3V0ZjhFbmNvZGVhZGRDaHVua2J5dGVMaXN0X0pzb25FbmNvZGVyU2lua19pc0RvbmVPbmx5IG9uZSBjYWxsIHRvIGFkZCBhbGxvd2VkYXNTdHJpbmdTaW5rX0pzb25VdGY4RW5jb2RlclNpbmtKc29uRGVjb2Rlcl9Kc29uU3RyaW5naWZpZXJiYWNrc3BhY2V0YWJuZXdsaW5lY2FycmlhZ2VSZXR1cm5mb3JtRmVlZGNoYXJfMGJhY2tzbGFzaGNoYXJfYmNoYXJfZmNoYXJfbmNoYXJfcmNoYXJfdGNoYXJfdV9zZWVuX3BhcnRpYWxSZXN1bHRjaGFyYWN0ZXJzd3JpdGVTdHJpbmdTbGljZXdyaXRlTnVtYmVyd3JpdGVTdHJpbmdDb250ZW50X2NoZWNrQ3ljbGVfcmVtb3ZlU2VlbndyaXRlT2JqZWN0d3JpdGVKc29uVmFsdWVjdXN0b21Kc29ud3JpdGVNYXBrZXlWYWx1ZUxpc3RhbGxTdHJpbmdLZXlzLCIiOl9Kc29uUHJldHR5UHJpbnRNaXhpbmluZGVudExldmVsX0pzb25TdHJpbmdTdHJpbmdpZmllcl9fSnNvblN0cmluZ1N0cmluZ2lmaWVyUHJldHR5Jl9Kc29uU3RyaW5nU3RyaW5naWZpZXImX0pzb25QcmV0dHlQcmludE1peGluX0pzb25TdHJpbmdTdHJpbmdpZmllclByZXR0eV9Kc29uVXRmOFN0cmluZ2lmaWVyd3JpdGVBc2NpaVN0cmluZ3dyaXRlRm91ckJ5dGVDaGFyQ29kZXdyaXRlTXVsdGlCeXRlQ2hhckNvZGVfX0pzb25VdGY4U3RyaW5naWZpZXJQcmV0dHkmX0pzb25VdGY4U3RyaW5naWZpZXImX0pzb25QcmV0dHlQcmludE1peGluX0pzb25VdGY4U3RyaW5naWZpZXJQcmV0dHlMYXRpbjFDb2RlY0xhdGluMUVuY29kZXJMYXRpbjFEZWNvZGVyX0xhdGluMURlY29kZXJTaW5rX2FkZFNsaWNlVG9TaW5rX2NoZWNrVmFsaWRMYXRpbjFfcmVwb3J0SW52YWxpZExhdGluMVNvdXJjZSBjb250YWlucyBub24tTGF0aW4tMSBjaGFyYWN0ZXJzLl9MYXRpbjFBbGxvd0ludmFsaWREZWNvZGVyU2lua3ByZXZpb3VzQ2hhcl9MaW5lU3BsaXR0ZXJTaW5rX2NhcnJ5X3NraXBMZWFkaW5nTEZfYWRkTGluZXNfTGluZVNwbGl0dGVyRXZlbnRTaW5rZnJvbVN0cmluZ1NpbmtDbG9zYWJsZVN0cmluZ1NpbmtfQ2xvc2FibGVTdHJpbmdTaW5rX1N0cmluZ0NvbnZlcnNpb25TaW5rQXNTdHJpbmdTaW5rQWRhcHRlcl9NSU5fU1RSSU5HX1NJWkVTdHJpbmdDb252ZXJzaW9uU2lua0Jhc2VTdHJpbmdDb252ZXJzaW9uU2lua01peGluX1N0cmluZ1NpbmtDb252ZXJzaW9uU2lua1RTdHJpbmdTaW5rX3N0cmluZ1NpbmtfU3RyaW5nQ2FsbGJhY2tTaW5rX1N0cmluZ0FkYXB0ZXJTaW5rX1V0ZjhTdHJpbmdTaW5rQWRhcHRlcmVuZEluZGV4X1V0ZjhDb252ZXJzaW9uU2lua3N0cmluZ0J1ZmZlclV0ZjhDb2RlY1V0ZjhFbmNvZGVyX2ZpbGxCdWZmZXJsYXN0Q29kZVVuaXR3YXNDb21iaW5lZF93cml0ZVN1cnJvZ2F0ZV9VdGY4RW5jb2Rlcl9ERUZBVUxUX0JZVEVfQlVGRkVSX1NJWkV3aXRoQnVmZmVyU2l6ZWxlYWRpbmdTdXJyb2dhdGVuZXh0Q29kZVVuaXRzdHJpbmdJbmRleF9fVXRmOEVuY29kZXJTaW5rJl9VdGY4RW5jb2RlciZTdHJpbmdDb252ZXJzaW9uU2lua01peGluX1V0ZjhFbmNvZGVyU2lua2lzTGFzdFNsaWNlaGFzQmVlbkNvbWJpbmVkVXRmOERlY29kZXJvbmVCeXRlc2lzRmlyc3RDaGFyYWN0ZXJmaXJzdFBhcnRfaXNGaXJzdENoYXJhY3Rlcl9jb252ZXJ0SW50ZXJjZXB0ZWRfVXRmOERlY29kZXJfZXhwZWN0ZWRVbml0c19leHRyYVVuaXRzX0xJTUlUU2hhc1BhcnRpYWxJbnB1dFVuZmluaXNoZWQgVVRGLTggb2N0ZXQgc2VxdWVuY2VleHBlY3RlZFVuaXRzZXh0cmFVbml0c0JhZCBVVEYtOCBlbmNvZGluZyAweE92ZXJsb25nIGVuY29kaW5nIG9mIDB4Q2hhcmFjdGVyIG91dHNpZGUgdmFsaWQgVW5pY29kZSByYW5nZTogTmVnYXRpdmUgVVRGLTggY29kZSB1bml0OiAtMHhfYXNjaWlNYXNrYmFzZTY0YmFzZTY0VXJsX3BhZGRpbmdDaGFyaHRtbEVzY2FwZV9sYXRpbjFNYXNrX09ORV9CWVRFX0xJTUlUX1RXT19CWVRFX0xJTUlUX1RIUkVFX0JZVEVfTElNSVRfRk9VUl9CWVRFX0xJTUlUX1NVUlJPR0FURV9UQUdfTUFTS19TVVJST0dBVEVfVkFMVUVfTUFTS19MRUFEX1NVUlJPR0FURV9NSU5fVEFJTF9TVVJST0dBVEVfTUlOX3BhcnNlRG91YmxlRG91YmxlX3BhcnNlYmFzZTY0RW5jb2RlYmFzZTY0VXJsRW5jb2RlYmFzZTY0RGVjb2RlX3BhcnNlSnNvbl9kZWZhdWx0VG9FbmNvZGFibGVfaXNMZWFkU3Vycm9nYXRlX2lzVGFpbFN1cnJvZ2F0ZV9jb21iaW5lU3Vycm9nYXRlUGFpcmxlYWRfc2Nhbk9uZUJ5dGVDaGFyYWN0ZXJzdW5pdHNkYXJ0LmRldmVsb3BlclNlbmRQb3J0UmF3UmVjZWl2ZVBvcnRleHRlbnNpb24uZGFydHByb2ZpbGVyLmRhcnRzZXJ2aWNlLmRhcnR0aW1lbGluZS5kYXJ0U2VydmljZUV4dGVuc2lvbkhhbmRsZXJUaW1lbGluZVN5bmNGdW5jdGlvblRpbWVsaW5lQXN5bmNGdW5jdGlvbl9Vc2VyVGFnVXNlclRhZ19uZXdVc2VyVGFnX2xhYmVsbWFrZUN1cnJlbnRVc2VyVGFnX21ha2VDdXJyZW50U2VydmljZUV4dGVuc2lvblJlc3BvbnNlZXJyb3JEZXRhaWxrSW52YWxpZFBhcmFtc2tFeHRlbnNpb25FcnJvcmtFeHRlbnNpb25FcnJvck1heGtFeHRlbnNpb25FcnJvck1pbmludmFsaWRQYXJhbXNleHRlbnNpb25FcnJvcmV4dGVuc2lvbkVycm9yTWF4ZXh0ZW5zaW9uRXJyb3JNaW5fZXJyb3JDb2RlTWVzc2FnZUludmFsaWQgcGFyYW1zU2VydmVyIGVycm9yX3ZhbGlkYXRlRXJyb3JDb2RlT3V0IG9mIHJhbmdlaXNFcnJvcl90b1N0cmluZ1VzZXJUYWdNQVhfVVNFUl9UQUdTZGVmYXVsdFRhZ01ldHJpY0ludmFsaWQgTWV0cmljIG5hbWUuX3RvSlNPTkdhdWdlbWluIG11c3QgYmUgbGVzcyB0aGFuIG1heG1ldHJpY3MvQ291bnRlck1ldHJpY3NfbWV0cmljc21ldHJpY1JlZ2lzdGVyZWQgbWV0cmljcyBoYXZlIHVuaXF1ZSBuYW1lc2RlcmVnaXN0ZXJfcHJpbnRNZXRyaWNfcHJpbnRNZXRyaWNzbWV0cmljc01ldHJpY0xpc3RTZXJ2aWNlUHJvdG9jb2xJbmZvbWFqb3JWZXJzaW9uRGFydCBWTSBTZXJ2aWNlIFByb3RvY29sIHZsaXN0ZW5pbmcgb24gU2VydmljZWdldEluZm9yZWNlaXZlUG9ydHVyaUNvbXBsZXRlcnNlbmRQb3J0Y29udHJvbFdlYlNlcnZlcmVuYWJsZWdldElzb2xhdGVJRGNvbnRyb2xQb3J0Rmxvd1RpbWVsaW5lc3RhcnRTeW5jX2FyZ3VtZW50c2ZpbmlzaFN5bmNVbmV2ZW4gY2FsbHMgdG8gc3RhcnRTeW5jIGFuZCBmaW5pc2hTeW5jaW5zdGFudFN5bmNpbnN0YW50QXJndW1lbnRzdGltZVN5bmNUaW1lbGluZVRhc2tfdGFza0lkd2l0aFRhc2tJZHRhc2tJZGluc3RhbnRVbmV2ZW4gY2FsbHMgdG8gc3RhcnQgYW5kIGZpbmlzaHBhc3NZb3UgY2Fubm90IHBhc3MgYSBUaW1lbGluZVRhc2sgd2l0aG91dCBmaW5pc2hpbmcgYWxsIHN0YXJ0ZWQgb3BlcmF0aW9uc19Bc3luY0Jsb2NrX1N5bmNCbG9ja19zdGFydENwdV9mbG93X25leHRTZXF1ZW5jZU51bWJlcl9oYXNUaW1lbGluZURldmVsb3Blcl9sb2d0aW1lc3RhbXBfcnVuRXh0ZW5zaW9ucGFyYW1ldGVyS2V5c3BhcmFtZXRlclZhbHVlc3JlcGx5UG9ydHRyYWNlX3NlcnZpY2VlcnJvckRldGFpbHNFeHRlbnNpb24gaGFuZGxlciBtdXN0IHJldHVybiBhIEZ1dHVyZUV4dGVuc2lvbiBoYW5kbGVyIG11c3QgY29tcGxldGUgdG8gYSBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2VfcG9zdFJlc3BvbnNldm0tc2VydmljZTogcG9zdGluZyBubyByZXNwb25zZSBmb3IgcmVxdWVzdHsianNvbnJwYyI6IjIuMCIsdm0tc2VydmljZTogcG9zdGluZyBlcnJvciByZXNwb25zZSBmb3IgcmVxdWVzdCAiZXJyb3IiOnZtLXNlcnZpY2U6IHBvc3RpbmcgcmVzcG9uc2UgZm9yIHJlcXVlc3QgInJlc3VsdCI6ImlkIjoiIn0iaWQiOl9nZXRDdXJyZW50VGFnUHJvZmlsZXJfZ2V0Q3VycmVudFRhZ19nZXREZWZhdWx0VGFnVXNlclRhZ19kZWZhdWx0VGFnRGV2ZWxvcGVyX2RlYnVnZ2Vyd2hlbmluc3BlY3REZXZlbG9wZXJfaW5zcGVjdE11c3QgYmUgYSBTdHJpbmdNdXN0IGJlIGEgRGF0ZVRpbWVyZWdpc3RlckV4dGVuc2lvbmV4dC5NdXN0IGJlZ2luIHdpdGggZXh0LkV4dGVuc2lvbiBhbHJlYWR5IHJlZ2lzdGVyZWQ6IHBvc3RFdmVudGV2ZW50S2luZGV2ZW50RGF0YWV2ZW50RGF0YUFzU3RyaW5nX3Bvc3RFdmVudERldmVsb3Blcl9wb3N0RXZlbnRfbG9va3VwRXh0ZW5zaW9uRGV2ZWxvcGVyX2xvb2t1cEV4dGVuc2lvbl9yZWdpc3RlckV4dGVuc2lvbkRldmVsb3Blcl9yZWdpc3RlckV4dGVuc2lvbmdldEN1cnJlbnRUYWdfZ2V0U2VydmVySW5mb0RldmVsb3Blcl9nZXRTZXJ2ZXJJbmZvX3dlYlNlcnZlckNvbnRyb2xEZXZlbG9wZXJfd2ViU2VydmVyQ29udHJvbF9nZXRTZXJ2aWNlTWFqb3JWZXJzaW9uRGV2ZWxvcGVyX2dldFNlcnZpY2VNYWpvclZlcnNpb25fZ2V0U2VydmljZU1pbm9yVmVyc2lvbkRldmVsb3Blcl9nZXRTZXJ2aWNlTWlub3JWZXJzaW9uX2dldElzb2xhdGVJREZyb21TZW5kUG9ydERldmVsb3Blcl9nZXRJc29sYXRlSURGcm9tU2VuZFBvcnRfYXJndW1lbnRzQXNKc29uX2lzRGFydFN0cmVhbUVuYWJsZWRUaW1lbGluZV9pc0RhcnRTdHJlYW1FbmFibGVkX2dldE5leHRBc3luY0lkVGltZWxpbmVfZ2V0TmV4dEFzeW5jSWRfZ2V0VHJhY2VDbG9ja1RpbWVsaW5lX2dldFRyYWNlQ2xvY2tfZ2V0VGhyZWFkQ3B1Q2xvY2tUaW1lbGluZV9nZXRUaHJlYWRDcHVDbG9ja19yZXBvcnRUYXNrRXZlbnRUaW1lbGluZV9yZXBvcnRUYXNrRXZlbnRhcmd1bWVudHNBc0pzb25fcmVwb3J0Q29tcGxldGVFdmVudFRpbWVsaW5lX3JlcG9ydENvbXBsZXRlRXZlbnRzdGFydENwdV9yZXBvcnRGbG93RXZlbnRUaW1lbGluZV9yZXBvcnRGbG93RXZlbnRfcmVwb3J0SW5zdGFudEV2ZW50VGltZWxpbmVfcmVwb3J0SW5zdGFudEV2ZW50ZGFydC5mZmluYXRpdmVfdHlwZS5kYXJ0YW5ub3RhdGlvbnMuZGFydGR5bmFtaWNfbGlicmFyeS5kYXJ0c3RydWN0LmRhcnRQb2ludGVyYWxsb2NhdGVmcm9tQWRkcmVzc3B0cmZyb21GdW5jdGlvbkZmaV9mcm9tRnVuY3Rpb25leGNlcHRpb25hbFJldHVybkZmaV9zdG9yZUZmaV9sb2FkYWRkcmVzc0ZmaV9hZGRyZXNzRmZpX2VsZW1lbnRBdG9mZnNldEJ5RmZpX29mZnNldEJ5RmZpX2Nhc3Rhc0Z1bmN0aW9uUG9pbnRlci5hc0Z1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgZHluYW1pY2FsbHkuRmZpX2ZyZWVOYXRpdmVUeXBlX05hdGl2ZUludGVnZXJfTmF0aXZlRG91YmxlSW50OEludDE2SW50MzJJbnQ2NFVpbnQ4VWludDE2VWludDMyVWludDY0SW50UHRyRmxvYXRWb2lkTmF0aXZlRnVuY3Rpb25EYXJ0UmVwcmVzZW50YXRpb25PZlVuc2l6ZWREeW5hbWljTGlicmFyeWdldEhhbmRsZUZmaV9kbF9nZXRIYW5kbGVGZmlfZGxfbG9va3Vwc3ltYm9sTmFtZWxvb2t1cEZ1bmN0aW9uRHluYW1pYyBpbnZvY2F0aW9uIG9mIGxvb2t1cEZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuU3RydWN0YWRkcmVzc09mZnJvbVBvaW50ZXJudWxscHRydW5zaXplZF9vcGVuRmZpX2RsX29wZW5fYWxsb2NhdGVGZmlfYWxsb2NhdGVfZnJvbUFkZHJlc3NGZmlfZnJvbUFkZHJlc3NfYXNGdW5jdGlvbkludGVybmFsRmZpX2FzRnVuY3Rpb25JbnRlcm5hbERTTlNGZmlfc2l6ZU9mZGFydC5faW50ZXJuYWxJbnQzMkxpc3Rhc3luY19jYXN0LmRhcnRjYXN0LmRhcnRwcmludC5kYXJ0c29ydC5kYXJ0c3ltYm9sLmRhcnRfUHJpbnRDbG9zdXJlX0VsZW1lbnRQcmVkaWNhdGVfRXhwYW5kRnVuY3Rpb250aW1lckZhY3RvcnlldmVudEhhbmRsZXJTZW5kRGF0YXRpbWVyTWlsbGlzZWNvbmRDbG9ja3Jlc291cmNlUmVhZEFzQnl0ZXNwYWNrYWdlUm9vdFN0cmluZ3BhY2thZ2VDb25maWdTdHJpbmdwYWNrYWdlUm9vdFVyaUZ1dHVyZXBhY2thZ2VDb25maWdVcmlGdXR1cmVyZXNvbHZlUGFja2FnZVVyaUZ1dHVyZV9jb21wdXRlU2NyaXB0VXJpX2NhY2hlZFNjcmlwdHBsYXRmb3JtU2NyaXB0TGlzdHNzcmNTdGFydGRzdFN0YXJ0Y2lkQXJyYXljaWRFeHRlcm5hbE9uZUJ5dGVTdHJpbmdjaWRHcm93YWJsZU9iamVjdEFycmF5Y2lkSW1tdXRhYmxlQXJyYXljaWRPbmVCeXRlU3RyaW5nY2lkVHdvQnl0ZVN0cmluZ2NpZFVpbnQ4QXJyYXlWaWV3Z2V0SURDbGFzc0lEX2dldElEX1BhdGNoQ29kZVVuaXRzX3N0cmluZ3N0cmluZ09mMi4ySHR0cFN0YXR1c2NvbnRpbnVlX3N3aXRjaGluZ1Byb3RvY29sc3Byb2Nlc3Npbmdva2NyZWF0ZWRhY2NlcHRlZG5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbm5vQ29udGVudHJlc2V0Q29udGVudHBhcnRpYWxDb250ZW50bXVsdGlTdGF0dXNhbHJlYWR5UmVwb3J0ZWRpbVVzZWRtdWx0aXBsZUNob2ljZXNtb3ZlZFBlcm1hbmVudGx5bW92ZWRUZW1wb3JhcmlseXNlZU90aGVybm90TW9kaWZpZWR1c2VQcm94eXRlbXBvcmFyeVJlZGlyZWN0cGVybWFuZW50UmVkaXJlY3RiYWRSZXF1ZXN0dW5hdXRob3JpemVkcGF5bWVudFJlcXVpcmVkZm9yYmlkZGVubWV0aG9kTm90QWxsb3dlZG5vdEFjY2VwdGFibGVwcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWRyZXF1ZXN0VGltZW91dGNvbmZsaWN0Z29uZWxlbmd0aFJlcXVpcmVkcHJlY29uZGl0aW9uRmFpbGVkcmVxdWVzdEVudGl0eVRvb0xhcmdlcmVxdWVzdFVyaVRvb0xvbmd1bnN1cHBvcnRlZE1lZGlhVHlwZXJlcXVlc3RlZFJhbmdlTm90U2F0aXNmaWFibGVleHBlY3RhdGlvbkZhaWxlZG1pc2RpcmVjdGVkUmVxdWVzdHVucHJvY2Vzc2FibGVFbnRpdHlsb2NrZWRmYWlsZWREZXBlbmRlbmN5dXBncmFkZVJlcXVpcmVkcHJlY29uZGl0aW9uUmVxdWlyZWR0b29NYW55UmVxdWVzdHNyZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2Vjb25uZWN0aW9uQ2xvc2VkV2l0aG91dFJlc3BvbnNldW5hdmFpbGFibGVGb3JMZWdhbFJlYXNvbnNjbGllbnRDbG9zZWRSZXF1ZXN0aW50ZXJuYWxTZXJ2ZXJFcnJvcm5vdEltcGxlbWVudGVkYmFkR2F0ZXdheXNlcnZpY2VVbmF2YWlsYWJsZWdhdGV3YXlUaW1lb3V0aHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWR2YXJpYW50QWxzb05lZ290aWF0ZXNpbnN1ZmZpY2llbnRTdG9yYWdlbG9vcERldGVjdGVkbm90RXh0ZW5kZWRuZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZG5ldHdvcmtDb25uZWN0VGltZW91dEVycm9yVXNlIGNvbnRpbnVlXyBpbnN0ZWFkU1dJVENISU5HX1BST1RPQ09MU1VzZSBzd2l0Y2hpbmdQcm90b2NvbHMgaW5zdGVhZE9LVXNlIG9rIGluc3RlYWRDUkVBVEVEVXNlIGNyZWF0ZWQgaW5zdGVhZEFDQ0VQVEVEVXNlIGFjY2VwdGVkIGluc3RlYWROT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTlVzZSBub25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb24gaW5zdGVhZE5PX0NPTlRFTlRVc2Ugbm9Db250ZW50IGluc3RlYWRSRVNFVF9DT05URU5UVXNlIHJlc2V0Q29udGVudCBpbnN0ZWFkUEFSVElBTF9DT05URU5UVXNlIHBhcnRpYWxDb250ZW50IGluc3RlYWRNVUxUSVBMRV9DSE9JQ0VTVXNlIG11bHRpcGxlQ2hvaWNlcyBpbnN0ZWFkTU9WRURfUEVSTUFORU5UTFlVc2UgbW92ZWRQZXJtYW5lbnRseSBpbnN0ZWFkRk9VTkRVc2UgZm91bmQgaW5zdGVhZE1PVkVEX1RFTVBPUkFSSUxZVXNlIG1vdmVkVGVtcG9yYXJpbHkgaW5zdGVhZFNFRV9PVEhFUlVzZSBzZWVPdGhlciBpbnN0ZWFkTk9UX01PRElGSUVEVXNlIG5vdE1vZGlmaWVkIGluc3RlYWRVU0VfUFJPWFlVc2UgdXNlUHJveHkgaW5zdGVhZFRFTVBPUkFSWV9SRURJUkVDVFVzZSB0ZW1wb3JhcnlSZWRpcmVjdCBpbnN0ZWFkQkFEX1JFUVVFU1RVc2UgYmFkUmVxdWVzdCBpbnN0ZWFkVU5BVVRIT1JJWkVEVXNlIHVuYXV0aG9yaXplZCBpbnN0ZWFkUEFZTUVOVF9SRVFVSVJFRFVzZSBwYXltZW50UmVxdWlyZWQgaW5zdGVhZEZPUkJJRERFTlVzZSBmb3JiaWRkZW4gaW5zdGVhZE5PVF9GT1VORFVzZSBub3RGb3VuZCBpbnN0ZWFkTUVUSE9EX05PVF9BTExPV0VEVXNlIG1ldGhvZE5vdEFsbG93ZWQgaW5zdGVhZE5PVF9BQ0NFUFRBQkxFVXNlIG5vdEFjY2VwdGFibGUgaW5zdGVhZFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEVXNlIHByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZCBpbnN0ZWFkUkVRVUVTVF9USU1FT1VUVXNlIHJlcXVlc3RUaW1lb3V0IGluc3RlYWRDT05GTElDVFVzZSBjb25mbGljdCBpbnN0ZWFkR09ORVVzZSBnb25lIGluc3RlYWRMRU5HVEhfUkVRVUlSRURVc2UgbGVuZ3RoUmVxdWlyZWQgaW5zdGVhZFBSRUNPTkRJVElPTl9GQUlMRURVc2UgcHJlY29uZGl0aW9uRmFpbGVkIGluc3RlYWRSRVFVRVNUX0VOVElUWV9UT09fTEFSR0VVc2UgcmVxdWVzdEVudGl0eVRvb0xhcmdlIGluc3RlYWRSRVFVRVNUX1VSSV9UT09fTE9OR1VzZSByZXF1ZXN0VXJpVG9vTG9uZyBpbnN0ZWFkVU5TVVBQT1JURURfTUVESUFfVFlQRVVzZSB1bnN1cHBvcnRlZE1lZGlhVHlwZSBpbnN0ZWFkUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRVVzZSByZXF1ZXN0ZWRSYW5nZU5vdFNhdGlzZmlhYmxlIGluc3RlYWRFWFBFQ1RBVElPTl9GQUlMRURVc2UgZXhwZWN0YXRpb25GYWlsZWQgaW5zdGVhZFVQR1JBREVfUkVRVUlSRURVc2UgdXBncmFkZVJlcXVpcmVkIGluc3RlYWRJTlRFUk5BTF9TRVJWRVJfRVJST1JVc2UgaW50ZXJuYWxTZXJ2ZXJFcnJvciBpbnN0ZWFkTk9UX0lNUExFTUVOVEVEVXNlIG5vdEltcGxlbWVudGVkIGluc3RlYWRCQURfR0FURVdBWVVzZSBiYWRHYXRld2F5IGluc3RlYWRTRVJWSUNFX1VOQVZBSUxBQkxFVXNlIHNlcnZpY2VVbmF2YWlsYWJsZSBpbnN0ZWFkR0FURVdBWV9USU1FT1VUVXNlIGdhdGV3YXlUaW1lb3V0IGluc3RlYWRIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRFVzZSBodHRwVmVyc2lvbk5vdFN1cHBvcnRlZCBpbnN0ZWFkTkVUV09SS19DT05ORUNUX1RJTUVPVVRfRVJST1JVc2UgbmV0d29ya0Nvbm5lY3RUaW1lb3V0RXJyb3IgaW5zdGVhZENhc3RTdHJlYW1TdWJzY3JpcHRpb25fQ2FzdEl0ZXJhYmxlQmFzZUNhc3RJdGVyYXRvckNhc3RJdGVyYWJsZV9FZmZpY2llbnRMZW5ndGhDYXN0SXRlcmFibGVfX0Nhc3RMaXN0QmFzZSZfQ2FzdEl0ZXJhYmxlQmFzZSZMaXN0TWl4aW5fQ2FzdExpc3RCYXNldjFDYXN0TGlzdENhc3RTZXRfZGVmYXVsdEVtcHR5U2V0X2NvbmRpdGlvbmFsQWRkb3RoZXJDb250YWluc2Nhc3RFbGVtZW50Q2FzdE1hcFNLU1ZDYXN0UXVldWVFZmZpY2llbnRMZW5ndGhJdGVyYWJsZUxpc3RJdGVyYWJsZVN1Ykxpc3RJdGVyYWJsZV9lbmRPckxlbmd0aF9lbmRJbmRleHJlYWxJbmRleG5ld1N0YXJ0TGlzdEl0ZXJhdG9yTWFwcGVkSXRlcmFibGVfZkVmZmljaWVudExlbmd0aE1hcHBlZEl0ZXJhYmxlTWFwcGVkSXRlcmF0b3JNYXBwZWRMaXN0SXRlcmFibGVXaGVyZUl0ZXJhYmxlV2hlcmVJdGVyYXRvckV4cGFuZEl0ZXJhYmxlRXhwYW5kSXRlcmF0b3JfY3VycmVudEV4cGFuc2lvblRha2VJdGVyYWJsZV90YWtlQ291bnR0YWtlQ291bnRFZmZpY2llbnRMZW5ndGhUYWtlSXRlcmFibGVpdGVyYWJsZUxlbmd0aFRha2VJdGVyYXRvclRha2VXaGlsZUl0ZXJhYmxlVGFrZVdoaWxlSXRlcmF0b3JfaXNGaW5pc2hlZFNraXBJdGVyYWJsZV9za2lwQ291bnRFZmZpY2llbnRMZW5ndGhTa2lwSXRlcmFibGVTa2lwSXRlcmF0b3JTa2lwV2hpbGVJdGVyYWJsZVNraXBXaGlsZUl0ZXJhdG9yX2hhc1NraXBwZWRFbXB0eUl0ZXJhYmxlRm9sbG93ZWRCeUl0ZXJhYmxlZmlyc3RFZmZpY2llbnRFZmZpY2llbnRMZW5ndGhGb2xsb3dlZEJ5SXRlcmFibGVGb2xsb3dlZEJ5SXRlcmF0b3JfbmV4dEl0ZXJhYmxlV2hlcmVUeXBlSXRlcmFibGVXaGVyZVR5cGVJdGVyYXRvcm5vRWxlbWVudHRvb01hbnl0b29GZXdGaXhlZExlbmd0aExpc3RNaXhpbkNhbm5vdCBhZGQgdG8gYSBmaXhlZC1sZW5ndGggbGlzdENhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Q2Fubm90IGNsZWFyIGEgZml4ZWQtbGVuZ3RoIGxpc3RVbm1vZGlmaWFibGVMaXN0TWl4aW5DYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBsaXN0Q2Fubm90IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIGFuIHVubW9kaWZpYWJsZSBsaXN0Q2Fubm90IGFkZCB0byBhbiB1bm1vZGlmaWFibGUgbGlzdENhbm5vdCByZW1vdmUgZnJvbSBhbiB1bm1vZGlmaWFibGUgbGlzdENhbm5vdCBjbGVhciBhbiB1bm1vZGlmaWFibGUgbGlzdEZpeGVkTGVuZ3RoTGlzdEJhc2VVbm1vZGlmaWFibGVMaXN0QmFzZV9MaXN0SW5kaWNlc0l0ZXJhYmxlX2JhY2tlZExpc3RMaXN0TWFwVmlld1JldmVyc2VkTGlzdEl0ZXJhYmxlVW5tb2RpZmlhYmxlTGlzdEVycm9yQ2Fubm90IGFkZCB0byB1bm1vZGlmaWFibGUgTGlzdENhbm5vdCBjaGFuZ2UgdGhlIGNvbnRlbnQgb2YgYW4gdW5tb2RpZmlhYmxlIExpc3RDYW5ub3QgY2hhbmdlIGxlbmd0aCBvZiB1bm1vZGlmaWFibGUgTGlzdENhbm5vdCByZW1vdmUgZnJvbSB1bm1vZGlmaWFibGUgTGlzdE5vbkdyb3dhYmxlTGlzdEVycm9yQ2Fubm90IGFkZCB0byBub24tZ3Jvd2FibGUgTGlzdENhbm5vdCBjaGFuZ2UgbGVuZ3RoIG9mIG5vbi1ncm93YWJsZSBMaXN0Q2Fubm90IHJlbW92ZSBmcm9tIG5vbi1ncm93YWJsZSBMaXN0U29ydF9JTlNFUlRJT05fU09SVF9USFJFU0hPTERzb3J0UmFuZ2VPdXRPZlJhbmdlX2RvU29ydF9pbnNlcnRpb25Tb3J0ZWxfZHVhbFBpdm90UXVpY2tzb3J0c2l4dGhpbmRleDFpbmRleDVpbmRleDNpbmRleDJpbmRleDRlbDFlbDJlbDNlbDRlbDVwaXZvdDFwaXZvdDJncmVhdHBpdm90c19hcmVfZXF1YWxha2NvbXBfcGl2b3QxY29tcF9waXZvdDJyZXNlcnZlZFdvcmRSRSg/OmFzc2VydHxicmVha3xjKD86YSg/OnNlfHRjaCl8bGFzc3xvbig/OnN0fHRpbnVlKSl8ZCg/OmVmYXVsdHxvKXxlKD86bHNlfG51bXx4dGVuZHMpfGYoPzphbHNlfGluYWwoPzpseSk/fG9yKXxpW2Zuc118big/OmV3fHVsbCl8cmV0KD86aHJvd3x1cm4pfHMoPzp1cGVyfHdpdGNoKXx0KD86aCg/OmlzfHJvdyl8cig/OnVlfHkpKXx2KD86YXJ8b2lkKXx3KD86aGlsZXxpdGgpKXB1YmxpY0lkZW50aWZpZXJSRSg/ISg/OmFzc2VydHxicmVha3xjKD86YSg/OnNlfHRjaCl8bGFzc3xvbig/OnN0fHRpbnVlKSl8ZCg/OmVmYXVsdHxvKXxlKD86bHNlfG51bXx4dGVuZHMpfGYoPzphbHNlfGluYWwoPzpseSk/fG9yKXxpW2Zuc118big/OmV3fHVsbCl8cmV0KD86aHJvd3x1cm4pfHMoPzp1cGVyfHdpdGNoKXx0KD86aCg/OmlzfHJvdyl8cig/OnVlfHkpKXx2KD86YXJ8b2lkKXx3KD86aGlsZXxpdGgpKVxiKD8hXCQpKVthLXpBLVokXVtcdyRdKig/ISg/OmFzc2VydHxicmVha3xjKD86YSg/OnNlfHRjaCl8bGFzc3xvbig/OnN0fHRpbnVlKSl8ZCg/OmVmYXVsdHxvKXxlKD86bHNlfG51bXx4dGVuZHMpfGYoPzphbHNlfGluYWwoPzpseSk/fG9yKXxpW2Zuc118big/OmV3fHVsbCl8cmV0KD86aHJvd3x1cm4pfHMoPzp1cGVyfHdpdGNoKXx0KD86aCg/OmlzfHJvdyl8cig/OnVlfHkpKXx2KD86YXJ8b2lkKXx3KD86aGlsZXxpdGgpKVxiKD8hXCQpKVthLXpBLVokX11bXHckXSpvcGVyYXRvclJFKD86W1wtKyovJSZ8Xl18XFtcXT0/fD09fH4vP3w8Wzw9XT98Pls+PV0/fHVuYXJ5LSlwdWJsaWNTeW1ib2xQYXR0ZXJuXig/OiR8KD86PT8kfFsuXSg/ISQpKSkrPyRzeW1ib2xQYXR0ZXJudW52YWxpZGF0ZWRTeW1ib2woInZhbGlkYXRlUHVibGljU3ltYm9sIiBpcyBhIHByaXZhdGUgaWRlbnRpZmllciIgaXMgbm90IGEgdmFsaWQgKHF1YWxpZmllZCkgc3ltYm9sIG5hbWVpc1ZhbGlkU3ltYm9sY29tcHV0ZVVubWFuZ2xlZE5hbWVhZGRfc2V0dGVyX3N1ZmZpeG5ld0xhc3RuZXdGaXJzdGlzNjRCaXRfcHJpbnRDbG9zdXJlX2lucXVpcmVJczY0Qml0SW50ZXJuYWxfaW5xdWlyZUlzNjRCaXRfY2xhc3NSYW5nZUNoZWNrY2lkbG93ZXJMaW1pdHVwcGVyTGltaXRfcHJlcGVuZFR5cGVBcmd1bWVudHNJbnRlcm5hbF9wcmVwZW5kVHlwZUFyZ3VtZW50c2Z1bmN0aW9uVHlwZUFyZ3VtZW50c3BhcmVudFR5cGVBcmd1bWVudHNwYXJlbnRMZW50b3RhbExlbl9ib3VuZHNDaGVja0ZvclBhcnRpYWxJbnN0YW50aWF0aW9uSW50ZXJuYWxfYm91bmRzQ2hlY2tGb3JQYXJ0aWFsSW5zdGFudGlhdGlvbl9ncm93UmVnRXhwU3RhY2tuZXdTdGFja3Vuc2FmZUNhc3RJbnRlcm5hbF91bnNhZmVDYXN0X3Vuc3VwcG9ydGVkUHJpbnQncHJpbnQnIGlzIG5vdCBzdXBwb3J0ZWRkaWdpdDFkaWdpdDJJbnRlcm5hbF9leHRyYWN0VHlwZUFyZ3VtZW50c19jaGVja0NvdW50bWFrZUxpc3RGaXhlZExlbmd0aEludGVybmFsX21ha2VMaXN0Rml4ZWRMZW5ndGhncm93YWJsZUxpc3RtYWtlRml4ZWRMaXN0VW5tb2RpZmlhYmxlSW50ZXJuYWxfbWFrZUZpeGVkTGlzdFVubW9kaWZpYWJsZWZpeGVkTGVuZ3RoTGlzdGRhcnQuaXNvbGF0ZUJ5dGVCdWZmZXJUeXBlZERhdGFjYXBhYmlsaXR5LmRhcnRfSW1tZWRpYXRlQ2FsbGJhY2tfTnVsbGFyeUZ1bmN0aW9uX1VuYXJ5RnVuY3Rpb25fQmluYXJ5RnVuY3Rpb25fQ2FwYWJpbGl0eUltcGxDYXBhYmlsaXR5SW1wbF9mYWN0b3J5X2dldF9oYXNoY29kZUNhcGFiaWxpdHlJbXBsX2VxdWFsc0NhcGFiaWxpdHlJbXBsX2dldF9oYXNoY29kZV9SZWNlaXZlUG9ydEltcGxfcmF3UG9ydGZyb21SYXdSZWNlaXZlUG9ydF9SYXdSZWNlaXZlUG9ydEltcGxfaGFuZGxlck1hcFJhd1JlY2VpdmVQb3J0SW1wbF9mYWN0b3J5X2Nsb3NlSW50ZXJuYWxfZ2V0X3NlbmRwb3J0X2dldF9pZFJhd1JlY2VpdmVQb3J0SW1wbF9nZXRfaWRSYXdSZWNlaXZlUG9ydEltcGxfZ2V0X3NlbmRwb3J0X2xvb2t1cEhhbmRsZXJfaGFuZGxlTWVzc2FnZVJhd1JlY2VpdmVQb3J0SW1wbF9jbG9zZUludGVybmFsX2luaXRIYW5kbGVyTWFwdGVtcE1hcF9TZW5kUG9ydEltcGxfdW5pbnN0YW50aWFibGVfc2VuZEludGVybmFsU2VuZFBvcnRJbXBsX2dldF9pZFNlbmRQb3J0SW1wbF9nZXRfaGFzaGNvZGVTZW5kUG9ydEltcGxfc2VuZEludGVybmFsX19UcmFuc2ZlcmFibGVUeXBlZERhdGFJbXBsVHJhbnNmZXJhYmxlVHlwZWREYXRhX2ZhY3RvcnltYXRlcmlhbGl6ZV9tYXRlcmlhbGl6ZUludG9VaW50OExpc3RUcmFuc2ZlcmFibGVUeXBlZERhdGFfbWF0ZXJpYWxpemVfVGltZXJIZWFwX3VzZWRpbml0U2l6ZV9pbmRleE9yTmV4dF9jb21wYXJlVG9fc3dhcGxlZnRJbmRleG5ld2VzdF9sZWZ0Q2hpbGRfcmlnaHRDaGlsZF9sZWZ0Q2hpbGRJbmRleF9yaWdodENoaWxkSW5kZXhfVGltZXJfTk9fVElNRVJfWkVST19FVkVOVF9USU1FT1VUX0VWRU5UX2hlYXBfZmlyc3RaZXJvVGltZXJfbGFzdFplcm9UaW1lcl9JRF9NQVNLX2lkQ291bnRfcmVjZWl2ZVBvcnRfc2VuZFBvcnRfc2NoZWR1bGVkV2FrZXVwVGltZV9oYW5kbGluZ0NhbGxiYWNrc193YWtldXBUaW1lX21pbGxpU2Vjb25kc19yZXBlYXRpbmdfdGlja19uZXh0SWRtaWxsaVNlY29uZHN3YWtldXBUaW1lX2VucXVldWVfaXNJbkhlYXBfYWR2YW5jZVdha2V1cFRpbWVfbm90aWZ5WmVyb0hhbmRsZXJfcXVldWVGcm9tWmVyb0V2ZW50cGVuZGluZ1RpbWVyc19ub3RpZnlFdmVudEhhbmRsZXJfcXVldWVGcm9tVGltZW91dEV2ZW50Y3VycmVudFRpbWVfcnVuVGltZXJzb3ZlcmR1ZW1pc3NlZFRpY2tzaW1tZWRpYXRlQ2FsbGJhY2tfc2NoZWR1bGVXYWtldXBfY2FuY2VsV2FrZXVwX2NyZWF0ZVRpbWVySGFuZGxlcl9zaHV0ZG93blRpbWVySGFuZGxlcklzb2xhdGVTcGF3bkV4Y2VwdGlvbklzb2xhdGVTcGF3bkV4Y2VwdGlvbjogX2N1cnJlbnRJc29sYXRlX3Jvb3RVcmlfUEFVU0VfUkVTVU1FX1BJTkdfS0lMTF9BRERfRVhJVF9ERUxfRVhJVF9BRERfRVJST1JfREVMX0VSUk9SX0VSUk9SX0ZBVEFMYmVmb3JlTmV4dEV2ZW50cGF1c2VDYXBhYmlsaXR5dGVybWluYXRlQ2FwYWJpbGl0eV9wYWNrYWdlU3VwcG9ydGVkX3NwYXduQ29tbW9ucmVhZHlQb3J0cmVhZHlNZXNzYWdlY2FwYWJpbGl0aWVzVW5hYmxlIHRvIHNwYXduIGlzb2xhdGU6IEludGVybmFsIGVycm9yOiB1bmV4cGVjdGVkIGZvcm1hdCBmb3IgcmVhZHkgbWVzc2FnZTogX3NwYXduRnVuY3Rpb25Jc29sYXRlX3NwYXduRnVuY3Rpb250b3BMZXZlbEZ1bmN0aW9ucGF1c2VkZXJyb3JzQXJlRmF0YWxvbkV4aXRfc3Bhd25VcmlJc29sYXRlX3NwYXduVXJpX3NlbmRPT0JJc29sYXRlX3NlbmRPT0JfZ2V0RGVidWdOYW1lSXNvbGF0ZV9nZXREZWJ1Z05hbWVfZ2V0Q3VycmVudElzb2xhdGVwb3J0QW5kQ2FwYWJpbGl0aWVzX2dldFBvcnRBbmRDYXBhYmlsaXRpZXNPZkN1cnJlbnRJc29sYXRlSXNvbGF0ZV9nZXRQb3J0QW5kQ2FwYWJpbGl0aWVzT2ZDdXJyZW50SXNvbGF0ZV9nZXRDdXJyZW50Um9vdFVyaV9nZXRDdXJyZW50Um9vdFVyaVN0cklzb2xhdGVfZ2V0Q3VycmVudFJvb3RVcmlTdHIyLjNwYWNrYWdlcy8gZGlyZWN0b3J5IHJlc29sdXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBEYXJ0IDIuaG9va0lzb2xhdGUucGFja2FnZVJvb3RJc29sYXRlLnBhY2thZ2VDb25maWdyZXNvbHZlUGFja2FnZVVyaUlzb2xhdGUucmVzb2x2ZVBhY2thZ2VVcmlzcGF3bklzb2xhdGUuc3Bhd25zcGF3blVyaWF1dG9tYXRpY1BhY2thZ2VSZXNvbHV0aW9uQ2Fubm90IHNpbXVsdGFuZW91c2x5IHJlcXVlc3QgYXV0b21hdGljUGFja2FnZVJlc29sdXRpb24gYW5kIHNwZWNpZnkgYXBhY2thZ2VSb290LnBhY2thZ2VDb25maWcuQ2Fubm90IHNpbXVsdGFuZW91c2x5IHNwZWNpZnkgYSBwYWNrYWdlUm9vdCBhbmQgYSBwYWNrYWdlQ29uZmlnLnNwYXduZWRVcmlyZXN1bWVDYXBhYmlsaXR5X3BhdXNlYWRkT25FeGl0TGlzdGVuZXJyZXNwb25zZVBvcnRyZW1vdmVPbkV4aXRMaXN0ZW5lcnNldEVycm9yc0ZhdGFscHJpb3JpdHlhZGRFcnJvckxpc3RlbmVycmVtb3ZlRXJyb3JMaXN0ZW5lcmxpc3RNZXNzYWdlZXJyb3JEZXNjcmlwdGlvbnN0YWNrRGVzY3JpcHRpb25SZWNlaXZlUG9ydHJhd1BvcnRuZXdIYW5kbGVyUmVtb3RlRXJyb3JfZGVzY3JpcHRpb25UcmFuc2ZlcmFibGVUeXBlZERhdGEyLjMuMmZyb21MaXN0Y2h1bmtzQ2FwYWJpbGl0eV9wZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2tfaXNvbGF0ZVNjaGVkdWxlSW1tZWRpYXRlX3J1blBlbmRpbmdJbW1lZGlhdGVDYWxsYmFja19yZW1vdmVQZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2tfZ2V0SXNvbGF0ZVNjaGVkdWxlSW1tZWRpYXRlQ2xvc3VyZV9zdGFydE1haW5Jc29sYXRlX2dldFN0YXJ0TWFpbklzb2xhdGVGdW5jdGlvbl9zdGFydElzb2xhdGVwYXJlbnRQb3J0aXNTcGF3blVyaV9zZXR1cEhvb2tzZGFydC5tYXRoamVua2luc19zbWlfaGFzaC5kYXJ0cG9pbnQuZGFydHJhbmRvbS5kYXJ0cmVjdGFuZ2xlLmRhcnRfUmFuZG9tX2tTVEFURV9MT19rU1RBVEVfSElfUE9XMl8zMl9QT1cyXzUzX0RfUE9XMl8yN19EMTM0MjE3NzI4LjBfcHJuZ193aXRoU3RhdGVfbmV4dFN0YXRlUmFuZG9tX25leHRTdGF0ZU11c3QgYmUgcG9zaXRpdmUgYW5kIDw9IDJeMzJybmQzMm5leHREb3VibGVuZXh0Qm9vbF9zZXR1cFNlZWRSYW5kb21fc2V0dXBTZWVkX2luaXRpYWxTZWVkUmFuZG9tX2luaXRpYWxTZWVkX25leHRTZWVkX1NlY3VyZVJhbmRvbV9nZXRCeXRlc1NlY3VyZVJhbmRvbV9nZXRCeXRlc3JuZF9KZW5raW5zU21pSGFzaGhhc2g0UG9pbnRQb2ludChmYWN0b3JkaXN0YW5jZVRvc3F1YXJlZERpc3RhbmNlVG9zZWN1cmVfUmVjdGFuZ2xlQmFzZWhlaWdodGJvdHRvbVJlY3RhbmdsZSAoIHggeDB5MGJvdW5kaW5nQm94Y29udGFpbnNSZWN0YW5nbGVhbm90aGVyY29udGFpbnNQb2ludHRvcExlZnR0b3BSaWdodGJvdHRvbVJpZ2h0Ym90dG9tTGVmdFJlY3RhbmdsZWZyb21Qb2ludHNNdXRhYmxlUmVjdGFuZ2xlX3dpZHRoX2hlaWdodDIuNzE4MjgxODI4NDU5MDQ1bG4xMDIuMzAyNTg1MDkyOTk0MDQ2bG4yMC42OTMxNDcxODA1NTk5NDUzbG9nMmUxLjQ0MjY5NTA0MDg4ODk2MzRsb2cxMGUwLjQzNDI5NDQ4MTkwMzI1MThwaTMuMTQxNTkyNjUzNTg5Nzkzc3FydDFfMjAuNzA3MTA2NzgxMTg2NTQ3NnNxcnQyMS40MTQyMTM1NjIzNzMwOTUxX2RvdWJsZVBvd2RhcnQ6Y29yZSNfRG91YmxlX3Bvd01hdGhfZG91YmxlUG93X2ludFBvd19hdGFuMk1hdGhfYXRhbjJfc2luTWF0aF9zaW5fY29zTWF0aF9jb3NfdGFuTWF0aF90YW5fYWNvc01hdGhfYWNvc19hc2luTWF0aF9hc2luX2F0YW5NYXRoX2F0YW5fc3FydE1hdGhfc3FydF9leHBNYXRoX2V4cE1hdGhfbG9nYXRhbjJ2bTpuZXZlci1pbmxpbmVwb3dzaW5yYWRpYW5zY29zdGFuYWNvc2FzaW5hdGFuc3FydF9jbGFtcFRvWmVyb2RhcnQubWlycm9yc19JbnRlcm5hbE1pcnJvckVycm9yX21zZ19Mb2NhbE1pcnJvclN5c3RlbV9pc29sYXRlX2NvbXB1dGVMaWJyYXJpZXNNaXJyb3JTeXN0ZW1fbGlicmFyaWVzX2NvbXB1dGVJc29sYXRlTWlycm9yU3lzdGVtX2lzb2xhdGVNaXJyb3JTeXN0ZW0gZm9yIGlzb2xhdGUgJ19Tb3VyY2VMb2NhdGlvbl9Mb2NhbE1pcnJvcl9Mb2NhbElzb2xhdGVNaXJyb3Jyb290TGlicmFyeWlzQ3VycmVudElzb2xhdGVNaXJyb3Igb24gJ2xvYWRVcmlDYW5ub3QgbG9hZCBfbG9hZFVyaUlzb2xhdGVNaXJyb3JfbG9hZFVyaV9TeW50aGV0aWNBY2Nlc3NvcnNpbXBsZU5hbWVpc0NvbnN0Q29uc3RydWN0b3Jpc1JlZGlyZWN0aW5nQ29uc3RydWN0b3JfU3ludGhldGljU2V0dGVyUGFyYW1ldGVyaGFzRGVmYXVsdFZhbHVlX0xvY2FsT2JqZWN0TWlycm9yX3JlZmxlY3RlZV9pbnZva2VyZWZsZWN0ZWVfaW52b2tlR2V0dGVyX2ludm9rZVNldHRlcm51bVBvc2l0aW9uYWxBcmd1bWVudHNudW1OYW1lZEFyZ3VtZW50c3NldEZpZWxkdW53cmFwcGVkd2l0aG91dEVxdWFsX0xvY2FsSW5zdGFuY2VNaXJyb3JoYXNSZWZsZWN0ZWVJbnN0YW5jZU1pcnJvciBvbiBJbnN0YW5jZU1pcnJvcl9pbnZva2VJbnN0YW5jZU1pcnJvcl9pbnZva2VHZXR0ZXJJbnN0YW5jZU1pcnJvcl9pbnZva2VTZXR0ZXJfY29tcHV0ZVR5cGVJbnN0YW5jZU1pcnJvcl9jb21wdXRlVHlwZV9Mb2NhbENsb3N1cmVNaXJyb3JfZnVuY3Rpb25DbG9zdXJlTWlycm9yIG9uICdfY29tcHV0ZUZ1bmN0aW9uQ2xvc3VyZU1pcnJvcl9mdW5jdGlvbl9Mb2NhbFR5cGVNaXJyb3JfcmVmbGVjdGVkVHlwZV9Mb2NhbENsYXNzTWlycm9yX3NpbXBsZU5hbWVfb3duZXJfaXNHZW5lcmljX2lzVHJhbnNmb3JtZWRNaXhpbkFwcGxpY2F0aW9uX2lzR2VuZXJpY0RlY2xhcmF0aW9uX2luc3RhbnRpYXRvcl9xdWFsaWZpZWROYW1lX3RydWVTdXBlcmNsYXNzRmllbGRfc3VwZXJpbnRlcmZhY2VzX2NhY2hlZFN0YXRpY01lbWJlcnNfY2FjaGVkSW5zdGFuY2VNZW1iZXJzX2RlY2xhcmF0aW9uc3JlZmxlY3RlZFR5cGVoYXNSZWZsZWN0ZWRUeXBlRGVjbGFyYXRpb25zIG9mIGdlbmVyaWNzIGhhdmUgbm8gcmVmbGVjdGVkIHR5cGVfbWl4aW5BcHBsaWNhdGlvbk5hbWVfdHJ1ZVN1cGVyY2xhc3Npc09yaWdpbmFsRGVjbGFyYXRpb25zdXBlcmludGVyZmFjZXNpbnRlcmZhY2VUeXBlc2ludGVyZmFjZU1pcnJvcnNtaXhpblR5cGVzdGF0aWNNZW1iZXJzaW5zdGFuY2VNZW1iZXJzZGVjbHNfY29tcHV0ZU1lbWJlcnNfY29tcHV0ZUNvbnN0cnVjdG9yc3N0cmluZ05hbWVfcGF0Y2hDb25zdHJ1Y3Rvck5hbWVfaXNBbm9ueW1vdXNNaXhpbkFwcGxpY2F0aW9ub3JpZ2luYWxEZWNsYXJhdGlvbm1pcnJvckNsYXNzTWlycm9yIG9uICdpc0Fzc2lnbmFibGVUb290aGVyUmVmbGVjdGVkVHlwZW90aGVyRGVjbGFyYXRpb25fbGlicmFyeVVyaUNsYXNzTWlycm9yX2xpYnJhcnlVcmlfc3VwZXJ0eXBlQ2xhc3NNaXJyb3Jfc3VwZXJ0eXBlX3N1cGVydHlwZUluc3RhbnRpYXRlZENsYXNzTWlycm9yX3N1cGVydHlwZV9pbnN0YW50aWF0ZWRfbmF0aXZlSW50ZXJmYWNlc0NsYXNzTWlycm9yX2ludGVyZmFjZXNfbmF0aXZlSW50ZXJmYWNlc0luc3RhbnRpYXRlZENsYXNzTWlycm9yX2ludGVyZmFjZXNfaW5zdGFudGlhdGVkX25hdGl2ZU1peGluQ2xhc3NNaXJyb3JfbWl4aW5fbmF0aXZlTWl4aW5JbnN0YW50aWF0ZWRDbGFzc01pcnJvcl9taXhpbl9pbnN0YW50aWF0ZWRDbGFzc01pcnJvcl9tZW1iZXJzQ2xhc3NNaXJyb3JfY29uc3RydWN0b3JzQ2xhc3NNaXJyb3JfaW52b2tlQ2xhc3NNaXJyb3JfaW52b2tlR2V0dGVyQ2xhc3NNaXJyb3JfaW52b2tlU2V0dGVyX2ludm9rZUNvbnN0cnVjdG9yQ2xhc3NNaXJyb3JfaW52b2tlQ29uc3RydWN0b3JfQ2xhc3NNaXJyb3JfdHlwZV92YXJpYWJsZXNDbGFzc01pcnJvcl90eXBlX3ZhcmlhYmxlc19jb21wdXRlVHlwZUFyZ3VtZW50c0NsYXNzTWlycm9yX3R5cGVfYXJndW1lbnRzX0xvY2FsRnVuY3Rpb25UeXBlTWlycm9yX2Z1bmN0aW9uUmVmbGVjdGVlX2NhbGxNZXRob2RfcGFyYW1ldGVyc19GdW5jdGlvblR5cGVNaXJyb3JfY2FsbF9tZXRob2RfRnVuY3Rpb25UeXBlTWlycm9yX3BhcmFtZXRlcnNGdW5jdGlvblR5cGVNaXJyb3Igb24gJ0Z1bmN0aW9uVHlwZU1pcnJvcl9jYWxsX21ldGhvZGZ1bmN0aW9uUmVmbGVjdGVlX0Z1bmN0aW9uVHlwZU1pcnJvcl9yZXR1cm5fdHlwZUZ1bmN0aW9uVHlwZU1pcnJvcl9yZXR1cm5fdHlwZUZ1bmN0aW9uVHlwZU1pcnJvcl9wYXJhbWV0ZXJzX0xvY2FsRGVjbGFyYXRpb25NaXJyb3JfTG9jYWxUeXBlVmFyaWFibGVNaXJyb3JfdXBwZXJCb3VuZFR5cGUgdmFyaWFibGVzIGhhdmUgbm8gcmVmbGVjdGVkIHR5cGVUeXBlVmFyaWFibGVNaXJyb3Igb24gJ19UeXBlVmFyaWFibGVNaXJyb3Jfb3duZXJUeXBlVmFyaWFibGVNaXJyb3Jfb3duZXJfVHlwZVZhcmlhYmxlTWlycm9yX3VwcGVyX2JvdW5kVHlwZVZhcmlhYmxlTWlycm9yX3VwcGVyX2JvdW5kX0xvY2FsVHlwZWRlZk1pcnJvcl9yZWZlcmVudHJlZmVyZW50VHlwZWRlZk1pcnJvciBvbiAnX25hdGl2ZVJlZmVyZW50VHlwZWRlZk1pcnJvcl9yZWZlcmVudF9uYXRpdmVEZWNsYXJhdGlvblR5cGVkZWZNaXJyb3JfZGVjbGFyYXRpb25fTG9jYWxMaWJyYXJ5TWlycm9yX2NhY2hlZExpYnJhcnlEZXBlbmRlbmNpZXNMaWJyYXJ5TWlycm9yIG9uICdsaWJyYXJ5RGVwZW5kZW5jaWVzX2xpYnJhcnlEZXBlbmRlbmNpZXNMaWJyYXJ5TWlycm9yX2xpYnJhcnlEZXBlbmRlbmNpZXNMaWJyYXJ5TWlycm9yX2ludm9rZUxpYnJhcnlNaXJyb3JfaW52b2tlR2V0dGVyTGlicmFyeU1pcnJvcl9pbnZva2VTZXR0ZXJMaWJyYXJ5TWlycm9yX21lbWJlcnNfTG9jYWxMaWJyYXJ5RGVwZW5kZW5jeU1pcnJvcl90YXJnZXRNaXJyb3JPclByZWZpeG11dGFibGVDb21iaW5hdG9yc3ByZWZpeFN0cmluZ3Vud3JhcHBlZE1ldGFkYXRhbWlycm9yT3JOdWxsc2F2ZWRQcmVmaXhfdHJ5VXBncmFkZVByZWZpeExpYnJhcnlNaXJyb3JfZnJvbVByZWZpeF9Mb2NhbENvbWJpbmF0b3JNaXJyb3JpZGVudGlmaWVyc2lkZW50aWZpZXJTdHJpbmdfTG9jYWxNZXRob2RNaXJyb3Jfa2luZEZsYWdza0Fic3RyYWN0a0dldHRlcmtTZXR0ZXJrQ29uc3RydWN0b3JrQ29uc3RDdG9ya0dlbmVyYXRpdmVDdG9ya1JlZGlyZWN0aW5nQ3RvcmtGYWN0b3J5Q3RvcmtFeHRlcm5hbGtTeW50aGV0aWNfb3BlcmF0b3JzX2NvbnN0cnVjdG9yTmFtZV9NZXRob2RNaXJyb3JfcGFyYW1ldGVyc0ludGVybmFsIGVycm9yIGluIE1ldGhvZE1pcnJvci5jb25zdHJ1Y3Rvck5hbWU6IG1hbGZvcm1lZCBuYW1lIDxkZWZpbmluZ0xpYnJhcnlvd25lck5hbWVjbk1ldGhvZE1pcnJvciBvbiAnX01ldGhvZE1pcnJvcl9vd25lck1ldGhvZE1pcnJvcl9vd25lcl9NZXRob2RNaXJyb3JfcmV0dXJuX3R5cGVNZXRob2RNaXJyb3JfcmV0dXJuX3R5cGVNZXRob2RNaXJyb3JfcGFyYW1ldGVyc19NZXRob2RNaXJyb3Jfc291cmNlTWV0aG9kTWlycm9yX3NvdXJjZV9Mb2NhbFZhcmlhYmxlTWlycm9ydW5leHBlY3RlZCBvd25lciBWYXJpYWJsZU1pcnJvciBvbiAnX1ZhcmlhYmxlTWlycm9yX3R5cGVWYXJpYWJsZU1pcnJvcl90eXBlX0xvY2FsUGFyYW1ldGVyTWlycm9yX3VubWlycm9yZWRNZXRhZGF0YV9kZWZhdWx0VmFsdWVSZWZsZWN0ZWVQYXJhbWV0ZXJNaXJyb3IubG9jYXRpb24gdW5pbXBsZW1lbnRlZFBhcmFtZXRlck1pcnJvciBvbiAnX1BhcmFtZXRlck1pcnJvcl90eXBlUGFyYW1ldGVyTWlycm9yX3R5cGVfU3BlY2lhbFR5cGVNaXJyb3J2b2lkIGhhcyBubyByZWZsZWN0ZWQgdHlwZVR5cGVNaXJyb3Igb24gJ19NaXJyb3JzX2N1cnJlbnRNaXJyb3JTeXN0ZW1fZGVjbGFyYXRpb25DYWNoZUNsYXNzTWlycm9yX2luc3RhbnRpYXRpb25DYWNoZVR5cGVNaXJyb3JjdXJyZW50TWlycm9yU3lzdGVtcmVmbGVjdF9tYWtlTG9jYWxDbGFzc01pcnJvck1pcnJvcnNfbWFrZUxvY2FsQ2xhc3NNaXJyb3JfbWFrZUxvY2FsVHlwZU1pcnJvck1pcnJvcnNfbWFrZUxvY2FsVHlwZU1pcnJvcl9pbnN0YW50aWF0ZUdlbmVyaWNUeXBlTWlycm9yc19pbnN0YW50aWF0ZUdlbmVyaWNUeXBlcmVmbGVjdENsYXNzY2xhc3NNaXJyb3JyZWZsZWN0VHlwZXR5cGVNaXJyb3JfaW5zdGFudGlhdGVUeXBlVHlwZSBhcmd1bWVudHMgbGlzdCBjYW5ub3QgYmUgZW1wdHkuX01pcnJvclJlZmVyZW5jZU1pcnJvclJlZmVyZW5jZV9lcXVhbHNNaXJyb3JTeXN0ZW1fbWFuZ2xlTmFtZU1pcnJvcnNfbWFuZ2xlTmFtZWZpbmRMaWJyYXJ5VGhlcmUgYXJlIG11bHRpcGxlIGxpYnJhcmllcyBuYW1lZCBUaGVyZSBpcyBubyBsaWJyYXJ5IG5hbWVkICdnZXRTeW1ib2xNaXJyb3JJc29sYXRlTWlycm9yRGVjbGFyYXRpb25NaXJyb3JPYmplY3RNaXJyb3JJbnN0YW5jZU1pcnJvckNsb3N1cmVNaXJyb3JMaWJyYXJ5TWlycm9yTGlicmFyeURlcGVuZGVuY3lNaXJyb3JDb21iaW5hdG9yTWlycm9yRnVuY3Rpb25UeXBlTWlycm9yVHlwZVZhcmlhYmxlTWlycm9yVHlwZWRlZk1pcnJvck1ldGhvZE1pcnJvclZhcmlhYmxlTWlycm9yUGFyYW1ldGVyTWlycm9ydHJpbW1lZFRleHRpc0RvY0NvbW1lbnRNaXJyb3JzVXNlZE5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4gV2lsbCBiZSByZW1vdmVkIGluIGEgbGF0ZXIgcmVsZWFzZS5zeW1ib2xzbWV0YVRhcmdldHNvdmVycmlkZV9kaXJ0eV9uX2NvbXB1dGVRdWFsaWZpZWROYW1lX21ha2VTaWduYXR1cmVTdHJpbmdmb3VuZF9vcHRpb25hbF9wb3NpdGlvbmFsZm91bmRfb3B0aW9uYWxfbmFtZWREZWNsYXJhdGlvbk1pcnJvcl9sb2NhdGlvbkRlY2xhcmF0aW9uTWlycm9yX21ldGFkYXRhX3N1YnR5cGVUZXN0VHlwZU1pcnJvcl9zdWJ0eXBlVGVzdF9hc1NldHRlcmRhcnQucHJvZmlsZXJEYXJ0IFNESyAxLjEyZGFydC50eXBlZF9kYXRhdW5tb2RpZmlhYmxlX3R5cGVkX2RhdGEuZGFydF9UeXBlZExpc3RCYXNlQ2Fubm90IHJlc2l6ZSBhIGZpeGVkLWxlbmd0aCBsaXN0VHlwZWREYXRhX3NldFJhbmdlc3RhcnRJbkJ5dGVzc3RhcnRGcm9tSW5CeXRlc3RvQ2lkZnJvbUNpZF9JbnRMaXN0TWl4aW5DYW5ub3QgaW5zZXJ0IGludG8gYSBmaXhlZC1sZW5ndGggbGlzdF9UeXBlZEludExpc3RNaXhpblNwYXduZWRUeXBlX2NyZWF0ZUxpc3Rmcm9tQXNUeXBlZExpc3Rmcm9tQXNMaXN0dGVtcEJ1ZmZlcl9Eb3VibGVMaXN0TWl4aW5fVHlwZWREb3VibGVMaXN0TWl4aW5fRmxvYXQzMng0TGlzdE1peGluU0lNRCBkb24ndCBoYXZlIGRlZmF1bHQgY29tcGFyZS5fSW50MzJ4NExpc3RNaXhpbl9GbG9hdDY0eDJMaXN0TWl4aW5fQnl0ZUJ1ZmZlcl9OZXdhc0ludDhMaXN0YXNVaW50OENsYW1wZWRMaXN0YXNJbnQxNkxpc3Rhc1VpbnQxNkxpc3Rhc0ludDMyTGlzdGFzVWludDMyTGlzdGFzSW50NjRMaXN0YXNVaW50NjRMaXN0YXNGbG9hdDMyTGlzdGFzRmxvYXQ2NExpc3Rhc0Zsb2F0MzJ4NExpc3Rhc0ludDMyeDRMaXN0YXNGbG9hdDY0eDJMaXN0X1R5cGVkTGlzdFR5cGVkRGF0YV9sZW5ndGhfZ2V0SW50OFR5cGVkRGF0YV9HZXRJbnQ4X3NldEludDhUeXBlZERhdGFfU2V0SW50OF9nZXRVaW50OFR5cGVkRGF0YV9HZXRVaW50OF9zZXRVaW50OFR5cGVkRGF0YV9TZXRVaW50OF9nZXRJbnQxNlR5cGVkRGF0YV9HZXRJbnQxNl9zZXRJbnQxNlR5cGVkRGF0YV9TZXRJbnQxNl9nZXRVaW50MTZUeXBlZERhdGFfR2V0VWludDE2X3NldFVpbnQxNlR5cGVkRGF0YV9TZXRVaW50MTZfZ2V0SW50MzJUeXBlZERhdGFfR2V0SW50MzJfc2V0SW50MzJUeXBlZERhdGFfU2V0SW50MzJfZ2V0VWludDMyVHlwZWREYXRhX0dldFVpbnQzMl9zZXRVaW50MzJUeXBlZERhdGFfU2V0VWludDMyX2dldEludDY0VHlwZWREYXRhX0dldEludDY0X3NldEludDY0VHlwZWREYXRhX1NldEludDY0X2dldFVpbnQ2NFR5cGVkRGF0YV9HZXRVaW50NjRfc2V0VWludDY0VHlwZWREYXRhX1NldFVpbnQ2NF9nZXRGbG9hdDMyVHlwZWREYXRhX0dldEZsb2F0MzJfc2V0RmxvYXQzMlR5cGVkRGF0YV9TZXRGbG9hdDMyX2dldEZsb2F0NjRUeXBlZERhdGFfR2V0RmxvYXQ2NF9zZXRGbG9hdDY0VHlwZWREYXRhX1NldEZsb2F0NjRfZ2V0RmxvYXQzMng0VHlwZWREYXRhX0dldEZsb2F0MzJ4NF9zZXRGbG9hdDMyeDRUeXBlZERhdGFfU2V0RmxvYXQzMng0X2dldEludDMyeDRUeXBlZERhdGFfR2V0SW50MzJ4NF9zZXRJbnQzMng0VHlwZWREYXRhX1NldEludDMyeDRfZ2V0RmxvYXQ2NHgyVHlwZWREYXRhX0dldEZsb2F0NjR4Ml9zZXRGbG9hdDY0eDJUeXBlZERhdGFfU2V0RmxvYXQ2NHgyX3NldENvZGVVbml0c2J5dGVTdGFydHNraXBDb3VudCArIGxlbmd0aF9fSW50OExpc3QmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19JbnQ4TGlzdCZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW4mX1R5cGVkSW50TGlzdE1peGluX0ludDhMaXN0X19VaW50OExpc3QmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19VaW50OExpc3QmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluJl9UeXBlZEludExpc3RNaXhpbl9VaW50OExpc3RfX1VpbnQ4Q2xhbXBlZExpc3QmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19VaW50OENsYW1wZWRMaXN0Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbiZfVHlwZWRJbnRMaXN0TWl4aW5fVWludDhDbGFtcGVkTGlzdF9fSW50MTZMaXN0Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbl9fSW50MTZMaXN0Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbiZfVHlwZWRJbnRMaXN0TWl4aW5fSW50MTZMaXN0X2dldEluZGV4ZWRJbnQxNl9zZXRJbmRleGVkSW50MTZfX1VpbnQxNkxpc3QmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19VaW50MTZMaXN0Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbiZfVHlwZWRJbnRMaXN0TWl4aW5fVWludDE2TGlzdF9nZXRJbmRleGVkVWludDE2X3NldEluZGV4ZWRVaW50MTZfX0ludDMyTGlzdCZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fX0ludDMyTGlzdCZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW4mX1R5cGVkSW50TGlzdE1peGluX0ludDMyTGlzdF9nZXRJbmRleGVkSW50MzJfc2V0SW5kZXhlZEludDMyX19VaW50MzJMaXN0Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbl9fVWludDMyTGlzdCZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW4mX1R5cGVkSW50TGlzdE1peGluX1VpbnQzMkxpc3RfZ2V0SW5kZXhlZFVpbnQzMl9zZXRJbmRleGVkVWludDMyX19JbnQ2NExpc3QmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19JbnQ2NExpc3QmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluJl9UeXBlZEludExpc3RNaXhpbl9JbnQ2NExpc3RfZ2V0SW5kZXhlZEludDY0X3NldEluZGV4ZWRJbnQ2NF9fVWludDY0TGlzdCZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fX1VpbnQ2NExpc3QmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluJl9UeXBlZEludExpc3RNaXhpbl9VaW50NjRMaXN0X2dldEluZGV4ZWRVaW50NjRfc2V0SW5kZXhlZFVpbnQ2NF9fRmxvYXQzMkxpc3QmX1R5cGVkTGlzdCZfRG91YmxlTGlzdE1peGluX19GbG9hdDMyTGlzdCZfVHlwZWRMaXN0Jl9Eb3VibGVMaXN0TWl4aW4mX1R5cGVkRG91YmxlTGlzdE1peGluX0Zsb2F0MzJMaXN0X2dldEluZGV4ZWRGbG9hdDMyX3NldEluZGV4ZWRGbG9hdDMyX19GbG9hdDY0TGlzdCZfVHlwZWRMaXN0Jl9Eb3VibGVMaXN0TWl4aW5fX0Zsb2F0NjRMaXN0Jl9UeXBlZExpc3QmX0RvdWJsZUxpc3RNaXhpbiZfVHlwZWREb3VibGVMaXN0TWl4aW5fRmxvYXQ2NExpc3RfZ2V0SW5kZXhlZEZsb2F0NjRfc2V0SW5kZXhlZEZsb2F0NjRfX0Zsb2F0MzJ4NExpc3QmX1R5cGVkTGlzdCZfRmxvYXQzMng0TGlzdE1peGluX0Zsb2F0MzJ4NExpc3RfZ2V0SW5kZXhlZEZsb2F0MzJ4NF9zZXRJbmRleGVkRmxvYXQzMng0X19JbnQzMng0TGlzdCZfVHlwZWRMaXN0Jl9JbnQzMng0TGlzdE1peGluX0ludDMyeDRMaXN0X2dldEluZGV4ZWRJbnQzMng0X3NldEluZGV4ZWRJbnQzMng0X19GbG9hdDY0eDJMaXN0Jl9UeXBlZExpc3QmX0Zsb2F0NjR4Mkxpc3RNaXhpbl9GbG9hdDY0eDJMaXN0X2dldEluZGV4ZWRGbG9hdDY0eDJfc2V0SW5kZXhlZEZsb2F0NjR4Ml9fRXh0ZXJuYWxJbnQ4QXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19FeHRlcm5hbEludDhBcnJheSZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW4mX1R5cGVkSW50TGlzdE1peGluX0V4dGVybmFsSW50OEFycmF5X19FeHRlcm5hbFVpbnQ4QXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19FeHRlcm5hbFVpbnQ4QXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluJl9UeXBlZEludExpc3RNaXhpbl9FeHRlcm5hbFVpbnQ4QXJyYXlfX0V4dGVybmFsVWludDhDbGFtcGVkQXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19FeHRlcm5hbFVpbnQ4Q2xhbXBlZEFycmF5Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbiZfVHlwZWRJbnRMaXN0TWl4aW5fRXh0ZXJuYWxVaW50OENsYW1wZWRBcnJheV9fRXh0ZXJuYWxJbnQxNkFycmF5Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbl9fRXh0ZXJuYWxJbnQxNkFycmF5Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbiZfVHlwZWRJbnRMaXN0TWl4aW5fRXh0ZXJuYWxJbnQxNkFycmF5X19FeHRlcm5hbFVpbnQxNkFycmF5Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbl9fRXh0ZXJuYWxVaW50MTZBcnJheSZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW4mX1R5cGVkSW50TGlzdE1peGluX0V4dGVybmFsVWludDE2QXJyYXlfX0V4dGVybmFsSW50MzJBcnJheSZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fX0V4dGVybmFsSW50MzJBcnJheSZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW4mX1R5cGVkSW50TGlzdE1peGluX0V4dGVybmFsSW50MzJBcnJheV9fRXh0ZXJuYWxVaW50MzJBcnJheSZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fX0V4dGVybmFsVWludDMyQXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluJl9UeXBlZEludExpc3RNaXhpbl9FeHRlcm5hbFVpbnQzMkFycmF5X19FeHRlcm5hbEludDY0QXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19FeHRlcm5hbEludDY0QXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluJl9UeXBlZEludExpc3RNaXhpbl9FeHRlcm5hbEludDY0QXJyYXlfX0V4dGVybmFsVWludDY0QXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19FeHRlcm5hbFVpbnQ2NEFycmF5Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbiZfVHlwZWRJbnRMaXN0TWl4aW5fRXh0ZXJuYWxVaW50NjRBcnJheV9fRXh0ZXJuYWxGbG9hdDMyQXJyYXkmX1R5cGVkTGlzdCZfRG91YmxlTGlzdE1peGluX19FeHRlcm5hbEZsb2F0MzJBcnJheSZfVHlwZWRMaXN0Jl9Eb3VibGVMaXN0TWl4aW4mX1R5cGVkRG91YmxlTGlzdE1peGluX0V4dGVybmFsRmxvYXQzMkFycmF5X19FeHRlcm5hbEZsb2F0NjRBcnJheSZfVHlwZWRMaXN0Jl9Eb3VibGVMaXN0TWl4aW5fX0V4dGVybmFsRmxvYXQ2NEFycmF5Jl9UeXBlZExpc3QmX0RvdWJsZUxpc3RNaXhpbiZfVHlwZWREb3VibGVMaXN0TWl4aW5fRXh0ZXJuYWxGbG9hdDY0QXJyYXlfX0V4dGVybmFsRmxvYXQzMng0QXJyYXkmX1R5cGVkTGlzdCZfRmxvYXQzMng0TGlzdE1peGluX0V4dGVybmFsRmxvYXQzMng0QXJyYXlfX0V4dGVybmFsSW50MzJ4NEFycmF5Jl9UeXBlZExpc3QmX0ludDMyeDRMaXN0TWl4aW5fRXh0ZXJuYWxJbnQzMng0QXJyYXlfX0V4dGVybmFsRmxvYXQ2NHgyQXJyYXkmX1R5cGVkTGlzdCZfRmxvYXQ2NHgyTGlzdE1peGluX0V4dGVybmFsRmxvYXQ2NHgyQXJyYXlfRmxvYXQzMng0RmxvYXQzMng0X2FkZEZsb2F0MzJ4NF9uZWdhdGVGbG9hdDMyeDRfc3ViRmxvYXQzMng0X211bEZsb2F0MzJ4NF9kaXZGbG9hdDMyeDRfY21wbHRsZXNzVGhhbk9yRXF1YWxGbG9hdDMyeDRfY21wbHRlRmxvYXQzMng0X2NtcGd0Z3JlYXRlclRoYW5PckVxdWFsRmxvYXQzMng0X2NtcGd0ZUZsb2F0MzJ4NF9jbXBlcXVhbG5vdEVxdWFsRmxvYXQzMng0X2NtcG5lcXVhbHNjYWxlRmxvYXQzMng0X3NjYWxlRmxvYXQzMng0X2Fic2NsYW1wRmxvYXQzMng0X2NsYW1wRmxvYXQzMng0X2dldFhGbG9hdDMyeDRfZ2V0WUZsb2F0MzJ4NF9nZXRaRmxvYXQzMng0X2dldFdzaWduTWFza0Zsb2F0MzJ4NF9nZXRTaWduTWFza0Zsb2F0MzJ4NF9zaHVmZmxlc2h1ZmZsZU1peEZsb2F0MzJ4NF9zaHVmZmxlTWl4end3aXRoWEZsb2F0MzJ4NF9zZXRYd2l0aFlGbG9hdDMyeDRfc2V0WXdpdGhaRmxvYXQzMng0X3NldFp3aXRoV0Zsb2F0MzJ4NF9zZXRXRmxvYXQzMng0X21pbkZsb2F0MzJ4NF9tYXhGbG9hdDMyeDRfc3FydHJlY2lwcm9jYWxGbG9hdDMyeDRfcmVjaXByb2NhbHJlY2lwcm9jYWxTcXJ0RmxvYXQzMng0X3JlY2lwcm9jYWxTcXJ0X0ludDMyeDRJbnQzMng0X29ySW50MzJ4NF9hbmRJbnQzMng0X3hvckludDMyeDRfYWRkSW50MzJ4NF9zdWJJbnQzMng0X2dldFhJbnQzMng0X2dldFlJbnQzMng0X2dldFpJbnQzMng0X2dldFdJbnQzMng0X2dldFNpZ25NYXNrSW50MzJ4NF9zaHVmZmxlSW50MzJ4NF9zaHVmZmxlTWl4SW50MzJ4NF9zZXRYSW50MzJ4NF9zZXRZSW50MzJ4NF9zZXRaSW50MzJ4NF9zZXRXZmxhZ1hJbnQzMng0X2dldEZsYWdYZmxhZ1lJbnQzMng0X2dldEZsYWdZZmxhZ1pJbnQzMng0X2dldEZsYWdaZmxhZ1dJbnQzMng0X2dldEZsYWdXd2l0aEZsYWdYSW50MzJ4NF9zZXRGbGFnWHdpdGhGbGFnWUludDMyeDRfc2V0RmxhZ1l3aXRoRmxhZ1pJbnQzMng0X3NldEZsYWdad2l0aEZsYWdXSW50MzJ4NF9zZXRGbGFnV0ludDMyeDRfc2VsZWN0X0Zsb2F0NjR4MkZsb2F0NjR4Ml9hZGRGbG9hdDY0eDJfbmVnYXRlRmxvYXQ2NHgyX3N1YkZsb2F0NjR4Ml9tdWxGbG9hdDY0eDJfZGl2RmxvYXQ2NHgyX3NjYWxlRmxvYXQ2NHgyX2Fic0Zsb2F0NjR4Ml9jbGFtcEZsb2F0NjR4Ml9nZXRYRmxvYXQ2NHgyX2dldFlGbG9hdDY0eDJfZ2V0U2lnbk1hc2tGbG9hdDY0eDJfc2V0WEZsb2F0NjR4Ml9zZXRZRmxvYXQ2NHgyX21pbkZsb2F0NjR4Ml9tYXhGbG9hdDY0eDJfc3FydF9UeXBlZExpc3RJdGVyYXRvcl9hcnJheV9UeXBlZExpc3RWaWV3X3R5cGVkRGF0YXZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZVR5cGVkRGF0YVZpZXdfdHlwZWREYXRhVHlwZWREYXRhVmlld19vZmZzZXRJbkJ5dGVzVHlwZWREYXRhVmlld19sZW5ndGhfX0ludDhBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbl9fSW50OEFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfSW50TGlzdE1peGluJl9UeXBlZEludExpc3RNaXhpbl9JbnQ4QXJyYXlWaWV3VHlwZWREYXRhVmlld19JbnQ4QXJyYXlWaWV3X25ld19fVWludDhBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbl9fVWludDhBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbiZfVHlwZWRJbnRMaXN0TWl4aW5fVWludDhBcnJheVZpZXdUeXBlZERhdGFWaWV3X1VpbnQ4QXJyYXlWaWV3X25ld19fVWludDhDbGFtcGVkQXJyYXlWaWV3Jl9UeXBlZExpc3RWaWV3Jl9JbnRMaXN0TWl4aW5fX1VpbnQ4Q2xhbXBlZEFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfSW50TGlzdE1peGluJl9UeXBlZEludExpc3RNaXhpbl9VaW50OENsYW1wZWRBcnJheVZpZXdUeXBlZERhdGFWaWV3X1VpbnQ4Q2xhbXBlZEFycmF5Vmlld19uZXdfX0ludDE2QXJyYXlWaWV3Jl9UeXBlZExpc3RWaWV3Jl9JbnRMaXN0TWl4aW5fX0ludDE2QXJyYXlWaWV3Jl9UeXBlZExpc3RWaWV3Jl9JbnRMaXN0TWl4aW4mX1R5cGVkSW50TGlzdE1peGluX0ludDE2QXJyYXlWaWV3VHlwZWREYXRhVmlld19JbnQxNkFycmF5Vmlld19uZXdfX1VpbnQxNkFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfSW50TGlzdE1peGluX19VaW50MTZBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbiZfVHlwZWRJbnRMaXN0TWl4aW5fVWludDE2QXJyYXlWaWV3VHlwZWREYXRhVmlld19VaW50MTZBcnJheVZpZXdfbmV3X19JbnQzMkFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfSW50TGlzdE1peGluX19JbnQzMkFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfSW50TGlzdE1peGluJl9UeXBlZEludExpc3RNaXhpbl9JbnQzMkFycmF5Vmlld1R5cGVkRGF0YVZpZXdfSW50MzJBcnJheVZpZXdfbmV3X19VaW50MzJBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbl9fVWludDMyQXJyYXlWaWV3Jl9UeXBlZExpc3RWaWV3Jl9JbnRMaXN0TWl4aW4mX1R5cGVkSW50TGlzdE1peGluX1VpbnQzMkFycmF5Vmlld1R5cGVkRGF0YVZpZXdfVWludDMyQXJyYXlWaWV3X25ld19fSW50NjRBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbl9fSW50NjRBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbiZfVHlwZWRJbnRMaXN0TWl4aW5fSW50NjRBcnJheVZpZXdUeXBlZERhdGFWaWV3X0ludDY0QXJyYXlWaWV3X25ld19fVWludDY0QXJyYXlWaWV3Jl9UeXBlZExpc3RWaWV3Jl9JbnRMaXN0TWl4aW5fX1VpbnQ2NEFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfSW50TGlzdE1peGluJl9UeXBlZEludExpc3RNaXhpbl9VaW50NjRBcnJheVZpZXdUeXBlZERhdGFWaWV3X1VpbnQ2NEFycmF5Vmlld19uZXdfX0Zsb2F0MzJBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0RvdWJsZUxpc3RNaXhpbl9fRmxvYXQzMkFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfRG91YmxlTGlzdE1peGluJl9UeXBlZERvdWJsZUxpc3RNaXhpbl9GbG9hdDMyQXJyYXlWaWV3VHlwZWREYXRhVmlld19GbG9hdDMyQXJyYXlWaWV3X25ld19fRmxvYXQ2NEFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfRG91YmxlTGlzdE1peGluX19GbG9hdDY0QXJyYXlWaWV3Jl9UeXBlZExpc3RWaWV3Jl9Eb3VibGVMaXN0TWl4aW4mX1R5cGVkRG91YmxlTGlzdE1peGluX0Zsb2F0NjRBcnJheVZpZXdUeXBlZERhdGFWaWV3X0Zsb2F0NjRBcnJheVZpZXdfbmV3X19GbG9hdDMyeDRBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0Zsb2F0MzJ4NExpc3RNaXhpbl9GbG9hdDMyeDRBcnJheVZpZXdUeXBlZERhdGFWaWV3X0Zsb2F0MzJ4NEFycmF5Vmlld19uZXdfX0ludDMyeDRBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludDMyeDRMaXN0TWl4aW5fSW50MzJ4NEFycmF5Vmlld1R5cGVkRGF0YVZpZXdfSW50MzJ4NEFycmF5Vmlld19uZXdfX0Zsb2F0NjR4MkFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfRmxvYXQ2NHgyTGlzdE1peGluX0Zsb2F0NjR4MkFycmF5Vmlld1R5cGVkRGF0YVZpZXdfRmxvYXQ2NHgyQXJyYXlWaWV3X25ld19CeXRlRGF0YVZpZXdUeXBlZERhdGFWaWV3X0J5dGVEYXRhVmlld19uZXdnZXRJbnQ4c2V0SW50OGdldFVpbnQ4c2V0VWludDhnZXRJbnQxNnNldEludDE2Z2V0SW50MzJzZXRJbnQzMmdldEludDY0c2V0SW50NjRnZXRVaW50NjRzZXRVaW50NjRnZXRGbG9hdDMyc2V0RmxvYXQzMmdldEZsb2F0MzJ4NHNldEZsb2F0MzJ4NF9UeXBlZEludExpc3RfVHlwZWRGbG9hdExpc3RFbmRpYW5fbGl0dGxlRW5kaWFuYmlnbGl0dGxlQnl0ZURhdGFfdmlld3R5cGVkRGF0YUludDhMaXN0Ynl0ZXNQZXJFbGVtZW50VHlwZWREYXRhX0ludDhBcnJheV9uZXdUeXBlZERhdGFfVWludDhBcnJheV9uZXdVaW50OENsYW1wZWRMaXN0VHlwZWREYXRhX1VpbnQ4Q2xhbXBlZEFycmF5X25ld0ludDE2TGlzdFR5cGVkRGF0YV9JbnQxNkFycmF5X25ld1R5cGVkRGF0YV9VaW50MTZBcnJheV9uZXdUeXBlZERhdGFfSW50MzJBcnJheV9uZXdUeXBlZERhdGFfVWludDMyQXJyYXlfbmV3SW50NjRMaXN0VHlwZWREYXRhX0ludDY0QXJyYXlfbmV3VWludDY0TGlzdFR5cGVkRGF0YV9VaW50NjRBcnJheV9uZXdGbG9hdDMyTGlzdFR5cGVkRGF0YV9GbG9hdDMyQXJyYXlfbmV3RmxvYXQ2NExpc3RUeXBlZERhdGFfRmxvYXQ2NEFycmF5X25ld0Zsb2F0MzJ4NExpc3RUeXBlZERhdGFfRmxvYXQzMng0QXJyYXlfbmV3SW50MzJ4NExpc3RUeXBlZERhdGFfSW50MzJ4NEFycmF5X25ld0Zsb2F0NjR4Mkxpc3RUeXBlZERhdGFfRmxvYXQ2NHgyQXJyYXlfbmV3RmxvYXQzMng0eHh4eHh4eHl4eHh6eHh4d3h4eXh4eHl5eHh5enh4eXd4eHp4eHh6eXh4enp4eHp3eHh3eHh4d3l4eHd6eHh3d3h5eHh4eXh5eHl4enh5eHd4eXl4eHl5eXh5eXp4eXl3eHl6eHh5enl4eXp6eHl6d3h5d3h4eXd5eHl3enh5d3d4enh4eHp4eXh6eHp4enh3eHp5eHh6eXl4enl6eHp5d3h6enh4enp5eHp6enh6end4end4eHp3eXh6d3p4end3eHd4eHh3eHl4d3h6eHd4d3h3eXh4d3l5eHd5enh3eXd4d3p4eHd6eXh3enp4d3p3eHd3eHh3d3l4d3d6eHd3d3l4eHh5eHh5eXh4enl4eHd5eHl4eXh5eXl4eXp5eHl3eXh6eHl4enl5eHp6eXh6d3l4d3h5eHd5eXh3enl4d3d5eXh4eXl4eXl5eHp5eXh3eXl5eHl5eXl5eXl6eXl5d3l5enh5eXp5eXl6enl5end5eXd4eXl3eXl5d3p5eXd3eXp4eHl6eHl5enh6eXp4d3l6eXh5enl5eXp5enl6eXd5enp4eXp6eXl6enp5enp3eXp3eHl6d3l5end6eXp3d3l3eHh5d3h5eXd4enl3eHd5d3l4eXd5eXl3eXp5d3l3eXd6eHl3enl5d3p6eXd6d3l3d3h5d3d5eXd3enl3d3d6eHh4enh4eXp4eHp6eHh3enh5eHp4eXl6eHl6enh5d3p4enh6eHp5enh6enp4end6eHd4enh3eXp4d3p6eHd3enl4eHp5eHl6eXh6enl4d3p5eXh6eXl5enl5enp5eXd6eXp4enl6eXp5enp6eXp3enl3eHp5d3l6eXd6enl3d3p6eHh6enh5enp4enp6eHd6enl4enp5eXp6eXp6enl3enp6eHp6enl6enp6enp6d3p6d3h6end5enp3enp6d3d6d3h4end4eXp3eHp6d3h3end5eHp3eXl6d3l6end5d3p3enh6d3p5end6enp3end6d3d4end3eXp3d3p6d3d3d3h4eHd4eHl3eHh6d3h4d3d4eXh3eHl5d3h5end4eXd3eHp4d3h6eXd4enp3eHp3d3h3eHd4d3l3eHd6d3h3d3d5eHh3eXh5d3l4end5eHd3eXl4d3l5eXd5eXp3eXl3d3l6eHd5enl3eXp6d3l6d3d5d3h3eXd5d3l3end5d3d3enh4d3p4eXd6eHp3enh3d3p5eHd6eXl3enl6d3p5d3d6enh3enp5d3p6end6end3end4d3p3eXd6d3p3end3d3d4eHd3eHl3d3h6d3d4d3d3eXh3d3l5d3d5end3eXd3d3p4d3d6eXd3enp3d3p3d3d3eHd3d3l3d3d6d3d3d0Zsb2F0MzJ4NF9mcm9tRG91Ymxlc3NwbGF0RmxvYXQzMng0X3NwbGF0emVyb0Zsb2F0MzJ4NF96ZXJvZnJvbUludDMyeDRCaXRzRmxvYXQzMng0X2Zyb21JbnQzMng0Qml0c2Zyb21GbG9hdDY0eDJGbG9hdDMyeDRfZnJvbUZsb2F0NjR4MkludDMyeDRJbnQzMng0X2Zyb21JbnRzSW50MzJ4NF9mcm9tQm9vbHNmcm9tRmxvYXQzMng0Qml0c0ludDMyeDRfZnJvbUZsb2F0MzJ4NEJpdHNGbG9hdDY0eDJGbG9hdDY0eDJfZnJvbURvdWJsZXNGbG9hdDY0eDJfc3BsYXRGbG9hdDY0eDJfemVyb2Zyb21GbG9hdDMyeDRGbG9hdDY0eDJfZnJvbUZsb2F0MzJ4NFVubW9kaWZpYWJsZUJ5dGVCdWZmZXJWaWV3VW5tb2RpZmlhYmxlQnl0ZURhdGFWaWV3QW4gVW5tb2RpZmlhYmxlQnl0ZURhdGFWaWV3IG1heSBub3QgYmUgbW9kaWZpZWRfVW5tb2RpZmlhYmxlTGlzdE1peGluVERzdWJsaXN0TGVuZ3RoX1VubW9kaWZpYWJsZVVpbnQ4TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZVVpbnQ4TGlzdFZpZXdfVW5tb2RpZmlhYmxlSW50OExpc3RWaWV3JlVubW9kaWZpYWJsZUxpc3RCYXNlJl9Vbm1vZGlmaWFibGVMaXN0TWl4aW5Vbm1vZGlmaWFibGVJbnQ4TGlzdFZpZXdfVW5tb2RpZmlhYmxlVWludDhDbGFtcGVkTGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZVVpbnQ4Q2xhbXBlZExpc3RWaWV3X1VubW9kaWZpYWJsZVVpbnQxNkxpc3RWaWV3JlVubW9kaWZpYWJsZUxpc3RCYXNlJl9Vbm1vZGlmaWFibGVMaXN0TWl4aW5Vbm1vZGlmaWFibGVVaW50MTZMaXN0Vmlld19Vbm1vZGlmaWFibGVJbnQxNkxpc3RWaWV3JlVubW9kaWZpYWJsZUxpc3RCYXNlJl9Vbm1vZGlmaWFibGVMaXN0TWl4aW5Vbm1vZGlmaWFibGVJbnQxNkxpc3RWaWV3X1VubW9kaWZpYWJsZVVpbnQzMkxpc3RWaWV3JlVubW9kaWZpYWJsZUxpc3RCYXNlJl9Vbm1vZGlmaWFibGVMaXN0TWl4aW5Vbm1vZGlmaWFibGVVaW50MzJMaXN0Vmlld19Vbm1vZGlmaWFibGVJbnQzMkxpc3RWaWV3JlVubW9kaWZpYWJsZUxpc3RCYXNlJl9Vbm1vZGlmaWFibGVMaXN0TWl4aW5Vbm1vZGlmaWFibGVJbnQzMkxpc3RWaWV3X1VubW9kaWZpYWJsZVVpbnQ2NExpc3RWaWV3JlVubW9kaWZpYWJsZUxpc3RCYXNlJl9Vbm1vZGlmaWFibGVMaXN0TWl4aW5Vbm1vZGlmaWFibGVVaW50NjRMaXN0Vmlld19Vbm1vZGlmaWFibGVJbnQ2NExpc3RWaWV3JlVubW9kaWZpYWJsZUxpc3RCYXNlJl9Vbm1vZGlmaWFibGVMaXN0TWl4aW5Vbm1vZGlmaWFibGVJbnQ2NExpc3RWaWV3X1VubW9kaWZpYWJsZUludDMyeDRMaXN0VmlldyZVbm1vZGlmaWFibGVMaXN0QmFzZSZfVW5tb2RpZmlhYmxlTGlzdE1peGluVW5tb2RpZmlhYmxlSW50MzJ4NExpc3RWaWV3X1VubW9kaWZpYWJsZUZsb2F0MzJ4NExpc3RWaWV3JlVubW9kaWZpYWJsZUxpc3RCYXNlJl9Vbm1vZGlmaWFibGVMaXN0TWl4aW5Vbm1vZGlmaWFibGVGbG9hdDMyeDRMaXN0Vmlld19Vbm1vZGlmaWFibGVGbG9hdDY0eDJMaXN0VmlldyZVbm1vZGlmaWFibGVMaXN0QmFzZSZfVW5tb2RpZmlhYmxlTGlzdE1peGluVW5tb2RpZmlhYmxlRmxvYXQ2NHgyTGlzdFZpZXdfVW5tb2RpZmlhYmxlRmxvYXQzMkxpc3RWaWV3JlVubW9kaWZpYWJsZUxpc3RCYXNlJl9Vbm1vZGlmaWFibGVMaXN0TWl4aW5Vbm1vZGlmaWFibGVGbG9hdDMyTGlzdFZpZXdfVW5tb2RpZmlhYmxlRmxvYXQ2NExpc3RWaWV3JlVubW9kaWZpYWJsZUxpc3RCYXNlJl9Vbm1vZGlmaWFibGVMaXN0TWl4aW5Vbm1vZGlmaWFibGVGbG9hdDY0TGlzdFZpZXdfY29udlUzMl9jb252VTY0X2NvbnZGMzJfY29udkY2NF9ieXRlU3dhcDE2X2J5dGVTd2FwMzI0Mjc4MjU1MzYwNDI5NDkwMTc2MF9ieXRlU3dhcDY0X3RvSW50X3RvSW50OF90b1VpbnQ4X3RvQ2xhbXBlZFVpbnQ4X3RvSW50MTZfdG9VaW50MTZfdG9JbnQzMl90b1VpbnQzMl9yYW5nZUNoZWNrX29mZnNldEFsaWdubWVudENoZWNrYWxpZ25tZW50T2Zmc2V0ICgpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBCWVRFU19QRVJfRUxFTUVOVCAodm1zZXJ2aWNlX2lvbG9hZGVyLmRhcnRzZXJ2ZXIuZGFydFBlbmRpbmdXcml0ZXBhcmVudF9kaXJlY3RvcnljcmVhdGV3cml0ZUFzQnl0ZXNXcml0ZUxpbWl0ZXJwZW5kaW5nV3JpdGVza01heE9wZW5Xcml0ZXNvcGVuV3JpdGVzc2NoZWR1bGVXcml0ZXB3X21heWJlV3JpdGVGaWxlc193cml0ZUNvbXBsZXRlZEZpbGVSZXF1ZXN0c3BsaWJyYXJ5VXJsSXNvbGF0ZUxvYWRlclN0YXRlaXNvbGF0ZUlkX2RlYWRfd29ya2luZ0RpcmVjdG9yeV9yb290U2NyaXB0X3BhY2thZ2VFcnJvcl9wYWNrYWdlUm9vdF9wYWNrYWdlQ29uZmlnX3BhY2thZ2VNYXBfbWF4RmlsZVJlcXVlc3RzY3VycmVudEZpbGVSZXF1ZXN0c19maWxlUmVxdWVzdFF1ZXVlX3BlbmRpbmdQYWNrYWdlTG9hZHNfcGFja2FnZXNQb3J0cGFja2FnZVJvb3RGbGFncGFja2FnZXNDb25maWdGbGFnd29ya2luZ0RpcmVjdG9yeXJvb3RTY3JpcHRfc2V0UGFja2FnZVJvb3Rfc2V0UGFja2FnZXNDb25maWd1cGRhdGVQYWNrYWdlTWFwX3BhY2thZ2VzUmVhZHlzaG91bGRJc3N1ZUZpbGVSZXF1ZXN0ZW5xdWV1ZUZpbGVSZXF1ZXN0ZGVxdWV1ZUZpbGVSZXF1ZXN0aHR0cDpodHRwczpwYWNrYWdlc1BhcmFtcGFja2FnZXNOYW1lX3JlcXVlc3RQYWNrYWdlc01hcF90cmlnZ2VyUGFja2FnZVJlc29sdXRpb25fcmVzb2x2ZVBhY2thZ2VVcml3cm9uZ3BhY2thZ2U6Ly9VUklzIHVzaW5nIHRoZSAncGFja2FnZTonIHNjaGVtZSBzaG91bGQgbG9vayBsaWtlICcsIG5vdCAncGFja2FnZU5hbWVFbmRVUklTIHVzaW5nIHRoZSAncGFja2FnZTonIHNjaGVtZSBzaG91bGQgbG9vayBsaWtlICdwYWNrYWdlOnBhY2thZ2VOYW1lJywgbm90ICdwYWNrYWdlOlJlc29sdmluZyBwYWNrYWdlIHdpdGggdXJpIHBhdGg6IFJlc29sdmluZyBwYWNrYWdlIHdpdGggcGVuZGluZyByZXNvbHV0aW9uIGVycm9yOiAncGFja2FnZTovJywgbm90ICdwYWNrYWdlOk1hcHBlZCAnJyBwYWNrYWdlIHRvICdObyBtYXBwaW5nIGZvciAnJyBwYWNrYWdlIHdoZW4gcmVzb2x2aW5nICdQYXRoIHRvIGJlIHJlc29sdmVkIGluIHBhY2thZ2U6IFJlc29sdmVkICdfaGFuZGxlUGFja2FnZXNSZXBseVJlcXVlc3RlZCBwYWNrYWdlcyBtYXAgZm9yICdHb3QgcGFja2FnZXMgcmVwbHk6IEdvdCBmYWlsdXJlIHJlc3BvbnNlIG9uIHBhY2thZ2UgcG9ydDogJ1JlY2VpdmVkIHBhY2thZ2Ugcm9vdDogJ1NldHVwIHBhY2thZ2UgbWFwOiBCYWQgdHlwZSBvZiBwYWNrYWdlcyByZXBseTogcmVxV2ViU29ja2V0Q2xpZW50UEFSU0VfRVJST1JfQ09ERUJJTkFSWV9NRVNTQUdFX0VSUk9SX0NPREVOT1RfTUFQX0VSUk9SX0NPREVJRF9FUlJPUl9DT0RFc29ja2V0c2VydmljZW9uV2ViU29ja2V0TWVzc2FnZWRpc2Nvbm5lY3RNZXNzYWdlIHBhcnNlIGVycm9yOiBNZXNzYWdlIG11c3QgYmUgYSBKU09OIG1hcC5ycGNNZXNzYWdlVHlwZS5SZXF1ZXN0b25SZXF1ZXN0TWVzc2FnZVR5cGUuTm90aWZpY2F0aW9ub25Ob3RpZmljYXRpb25NZXNzYWdlVHlwZS5SZXNwb25zZW9uUmVzcG9uc2VNZXNzYWdlIG11c3QgYmUgYSBzdHJpbmcucG9zdFJlc3BvbnNlUGF5bG9hZEtpbmQuU3RyaW5nUmVzcG9uc2VQYXlsb2FkS2luZC5CaW5hcnlSZXNwb25zZVBheWxvYWRLaW5kLlV0ZjhTdHJpbmdhZGRVdGY4VGV4dEh0dHBSZXF1ZXN0Q2xpZW50anNvbkNvbnRlbnRUeXBlY2hhcnNldHNlbmRFdmVudHNBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5DYW4gbm90IGhhbmRsZSBiaW5hcnkgcmVzcG9uc2VzV0VCU09DS0VUX1BBVEgvd3NST09UX1JFRElSRUNUX1BBVEgvaW5kZXguaHRtbF9zZXJ2aWNlX2lwX3BvcnRfb3JpZ2luQ2hlY2tEaXNhYmxlZF9hdXRoQ29kZXNEaXNhYmxlZF9zZXJ2ZXJhdXRoQ29kZXNEaXNhYmxlZHNlcnZlckFkZHJlc3NpcF9pc0FsbG93ZWRPcmlnaW5sb2NhbGhvc3Q6OjExMjcuMC4wLjFfb3JpZ2luQ2hlY2tvcmlnaW5zU2VjLVdlYlNvY2tldC1PcmlnaW5PcmlnaW5fY2hlY2tBdXRoVG9rZW5BbmRHZXRQYXRocmVxdWVzdFVyaXJlcXVlc3RQYXRoU2VnbWVudHNhdXRoVG9rZW5fcmVxdWVzdEhhbmRsZXJmb3JiaWRkZW4gb3JpZ2luUFVUZnNOYW1lTGlzdGZzUGF0aExpc3Rmc1BhdGhCYXNlNjRMaXN0ZnNVcmlCYXNlNjRMaXN0ZnNOYW1lZnNQYXRoZnNVcmlkZXZfZnNfbmFtZWRldl9mc191cmlfYjY0ZGVjb2RlZEZzVXJpZGV2X2ZzX3BhdGhkZXZfZnNfcGF0aF9iNjRkZXZmc2hhbmRsZVB1dFN0cmVhbW1ldGhvZCBub3QgYWxsb3dlZG1pc3Npbmcgb3IgaW52YWxpZCBhdXRoZW50aWNhdGlvbiBjb2Rld2ViU29ja2V0VGhpcyBWTSB3YXMgYnVpbHQgd2l0aG91dCB0aGUgT2JzZXJ2YXRvcnkgVUkuYXNzZXRtaW1lVHlwZXF1ZXJ5UGFyYW1ldGVyc3N0YXJ0dXBwb2xsRXJyb3Jwb2xsU3RhY2twb2xsYWRkcmVzc2VzYXR0ZW1wdHNtYXhBdHRlbXB0c09ic2VydmF0b3J5IHNlcnZlciBmYWlsZWQgdG8gc3RhcnQgYWZ0ZXIgIHRyaWVzQ291bGQgbm90IHN0YXJ0IE9ic2VydmF0b3J5IEhUVFAgc2VydmVyOgppc0V4aXRpbmdPYnNlcnZhdG9yeSBIVFRQIHNlcnZlciBleGl0aW5nIGJlZm9yZSBsaXN0ZW5pbmcgYXMgdm0gc2VydmljZSBoYXMgcmVjZWl2ZWQgZXhpdCByZXF1ZXN0Ck9ic2VydmF0b3J5IGxpc3RlbmluZyBvbiAvZGFydC5zZXJ2aWNlcy9DcmVhdGluZyBjcmVhdGVTeW5jRGVsZXRpbmcgZGVsZXRlU3luY29sZFNlcnZlckFkZHJlc3NPYnNlcnZhdG9yeSBubyBsb25nZXIgbGlzdGVuaW5nIG9uIENvdWxkIG5vdCBzaHV0ZG93biBPYnNlcnZhdG9yeSBIVFRQIHNlcnZlcjoKX2F1dG9TdGFydF9pc1dpbmRvd3NfaXNGdWNoc2lhX3NpZ25hbFdhdGNoX3NpZ25hbFN1YnNjcmlwdGlvbnNlcnZlcnNlcnZlckZ1dHVyZV9yZWdpc3RlclNpZ25hbEhhbmRsZXJUaW1lcl90cmFjZUxvYWRpbmdfZGV0ZXJtaW5pc3RpY19odHRwQ2xpZW50X1NQQUNFX0hBU0hfRE9UX0NPTE9OX0RFTF9pbnZhbGlkUGFja2FnZU5hbWVDaGFyc19EYXJ0X2tDYW5vbmljYWxpemVVcmxfRGFydF9rU2NyaXB0VGFnX0RhcnRfa1NvdXJjZVRhZ19EYXJ0X2tJbXBvcnRUYWdfRGFydF9rSW5pdExvYWRlcl9EYXJ0X2tSZXNvdXJjZUxvYWRfRGFydF9rR2V0UGFja2FnZVJvb3RVcmlfRGFydF9rR2V0UGFja2FnZUNvbmZpZ1VyaV9EYXJ0X2tSZXNvbHZlUGFja2FnZVVyaV9EYXJ0X2tJbXBvcnRFeHRlbnNpb25fRGFydF9rUmVzb2x2ZUFzRmlsZVBhdGhzaWxlbnRPYnNlcnZhdG9yeVNJTEVOVF9PQlNFUlZBVE9SWV9zYW5pdGl6ZVdpbmRvd3NQYXRoZml4ZWRQYXRoX3RyaW1XaW5kb3dzUGF0aF9lbmZvcmNlVHJhaWxpbmdTbGFzaCUgX3NlbmRSZXNvdXJjZVJlc3BvbnNlQ291bGQgbm90IGxvYWQgIkNvdWxkIG5vdCBpbXBvcnQgIiIgZnJvbSAiX3NlbmRFeHRlbnNpb25JbXBvcnRSZXNwb25zZUNvdWxkIG5vdCByZXNvbHZlICJfbG9hZEh0dHBtYXhDb25uZWN0aW9uc1Blckhvc3RfbG9hZEZpbGVsb2FkZXJTdGF0ZV9sb2FkRGF0YVVyaW1pbWVhcHBsaWNhdGlvbi9kYXJ0dGV4dC9wbGFpbk1JTUUtdHlwZSBtdXN0IGJlIGFwcGxpY2F0aW9uL2RhcnQgb3IgdGV4dC9wbGFpbjogVVMtQVNDSUlPbmx5IHV0Zi04IG9yIFVTLUFTQ0lJIGVuY29kaW5ncyBhcmUgc3VwcG9ydGVkOiBJbnZhbGlkIGRhdGEgdXJpICgpOgogIF9sb2FkUGFja2FnZXRyYWNlTG9hZGluZ0V4Y2VwdGlvbiAoKSB3aGVuIHJlc29sdmluZyBwYWNrYWdlIFVSSTogUGVuZGluZyBwYWNrYWdlIGxvYWQgb2YgJyBwZW5kaW5nX2hhbmRsZVJlc291cmNlUmVxdWVzdFVua25vd24gc2NoZW1lICgpIGZvciBfcGFyc2VQYWNrYWdlc0ZpbGVwYWNrYWdlc0ZpbGVpbnZhbGlkUGFja2FnZU5hbWVTa2lwcGluZyBjb21tZW50IGluIExpbmUgc3RhcnRzIHdpdGggJzonIGluIE1pc3NpbmcgcGFja2FnZSBuYW1lIGluIExpbmUgaGFzIG5vICc6JyBpbiBNaXNzaW5nICc6JyBzZXBhcmF0b3IgaW4gSW52YWxpZCBwYWNrYWdlIG5hbWUgSW52YWxpZCBwYWNrYWdlIG5hbWUgJ3BhY2thZ2VOYW1lOiBvcmlnaW5hbCBwYWNrYWdlVXJpOiBtYXBwaW5nOiBQYXJzZWQgcGFja2FnZXMgZmlsZSBhdCAuIFNlbmRpbmc6Cl9sb2FkUGFja2FnZXNGaWxlTG9hZGVkIHBhY2thZ2VzIGZpbGUgZnJvbSBFcnJvciBsb2FkaW5nIHBhY2thZ2VzOiBVbmNhdWdodCBlcnJvciAoKSBsb2FkaW5nIHBhY2thZ2VzIGZpbGUuX2ZpbmRQYWNrYWdlc0ZpbGVkaXJVcmlDaGVja2luZyBmb3IgIGZpbGUuIGV4aXN0czogQ291bGQgbm90IHJlc29sdmUgYSBwYWNrYWdlIGxvY2F0aW9uIGZyb20gQ291bGQgbm90IHJlc29sdmUgYSBwYWNrYWdlIGxvY2F0aW9uIGZvciBiYXNlIGF0IF9sb2FkSHR0cFBhY2thZ2VzRmlsZXJlc291cmNlRmV0Y2hpbmcgcGFja2FnZXMgZmlsZSBmcm9tICdyc3A6c3RyZWFtOmZvci1pdGVyYXRvcjpwcm9kdWN0LW1vZGVkYXJ0LnZtLnByb2R1Y3RHb3Qgc3RhdHVzICBmZXRjaGluZyAnTG9hZGVkIHBhY2thZ2VzIGZpbGUgZnJvbSAnJzoKRXJyb3IgbG9hZGluZyBwYWNrYWdlcyBmaWxlIGZyb20gJykgbG9hZGluZyBwYWNrYWdlcyBmaWxlIGZyb20gJ19sb2FkUGFja2FnZXNEYXRhTUlNRS10eXBlIG11c3QgYmUgdGV4dC9wbGFpbjogKSBsb2FkaW5nIHBhY2thZ2VzIGRhdGEuX2hhbmRsZVBhY2thZ2VzUmVxdWVzdFVuc3VwcG9ydGVkIHNjaGVtZSB1c2VkIHRvIGxvY2F0ZSAucGFja2FnZXMgZmlsZTogSGFuZGxpbmcgbG9hZCBvZiBwYWNrYWdlcyBtYXA6ICdQYWNrYWdlcyBmaWxlICcpIGZvciBwYWNrYWdlIGZpbGUgYXQgVW5rbm93biBwYWNrYWdlcyByZXF1ZXN0IHRhZzogRXJyb3IgaGFuZGxpbmcgcGFja2FnZXMgcmVxdWVzdDogKSBoYW5kbGluZyBwYWNrYWdlcyByZXF1ZXN0LnNodXRkb3duTG9hZGVyc1NlcnZpY2Ugc2h1dGRvd25pZWRpbHNfcHJvY2Vzc0xvYWRSZXF1ZXN0aXNSZWxvYWRpbmdwYXRoVXJpKSBpbiBDYW5ub3QgcmVzb2x2ZSBzY2hlbWUgKCkgdG8gZmlsZSBwYXRoVW5rbm93biBsb2FkZXIgcmVxdWVzdCB0YWc9c2VydmVyUHJpbnRfbm90aWZ5U2VydmVyU3RhdGVWTVNlcnZpY2VJT19Ob3RpZnlTZXJ2ZXJTdGF0ZV9sYXp5U2VydmVyQm9vdGNsZWFudXBDYWxsYmFja0Vycm9yIGluIHZtLXNlcnZpY2Ugc2h1dGRvd246IGNyZWF0ZVRlbXBEaXJDYWxsYmFja2NyZWF0ZVRlbXBkZWxldGVEaXJDYWxsYmFja3dyaXRlRmlsZUNhbGxiYWNrd3JpdGVTdHJlYW1GaWxlQ2FsbGJhY2tyZWFkRmlsZUNhbGxiYWNrbGlzdEZpbGVzQ2FsbGJhY2tkaXJQYXRoZGlyUGF0aFN0cmZpbGVFbnRpdHlmaWxlUGF0aG1vZGlmaWVkc2VydmVySW5mb3JtYXRpb25DYWxsYmFja3dlYlNlcnZlckNvbnRyb2xDYWxsYmFja19jbGVhckZ1dHVyZV9vblNpZ25hbHNpZ25hbF9yZWdpc3RlclNpZ25hbEhhbmRsZXJTSUdRVUlUX3NodXRkb3duVk1TZXJ2aWNlSU9fU2h1dGRvd25kYXJ0Ll92bXNlcnZpY2Vhc3NldC5kYXJ0Y2xpZW50LmRhcnRkZXZmcy5kYXJ0Y29uc3RhbnRzLmRhcnRydW5uaW5nX2lzb2xhdGUuZGFydHJ1bm5pbmdfaXNvbGF0ZXMuZGFydG1lc3NhZ2UuZGFydG1lc3NhZ2Vfcm91dGVyLmRhcnRuYW1lZF9sb29rdXAuZGFydFNlcnZlclN0YXJ0Q2FsbGJhY2tTZXJ2ZXJTdG9wQ2FsbGJhY2tDbGVhbnVwQ2FsbGJhY2tDcmVhdGVUZW1wRGlyQ2FsbGJhY2tEZWxldGVEaXJDYWxsYmFja1dyaXRlRmlsZUNhbGxiYWNrV3JpdGVTdHJlYW1GaWxlQ2FsbGJhY2tSZWFkRmlsZUNhbGxiYWNrTGlzdEZpbGVzQ2FsbGJhY2tTZXJ2ZXJJbmZvcm1hbWVzc2FnZV9yb3V0ZXJ0aW9uQ2FsbGJhY2tTZXJ2ZXJJbmZvcm1hdGlvbkNhbGxiYWNrV2ViU2VydmVyQ29udHJvbENhbGxiYWNrQ2xpZW50U2VydmljZUhhbmRsZUlzb2xhdGVFbWJlZGRlckRhdGFWTVNlcnZpY2VFbWJlZGRlckhvb2tzc2VydmVyU3RhcnRzZXJ2ZXJTdG9wY3JlYXRlVGVtcERpcmRlbGV0ZURpcndyaXRlRmlsZXdyaXRlU3RyZWFtRmlsZXJlYWRGaWxlbGlzdEZpbGVzc2VydmVySW5mb3JtYXRpb253ZWJTZXJ2ZXJDb250cm9sVk1TZXJ2aWNlc2VydmljZU5hbWVzcGFjZWNsaWVudHNfc2VydmljZVJlcXVlc3Rzc3JydW5uaW5nSXNvbGF0ZXNldmVudFBvcnRrU2VydmljZVN0cmVhbXNlcnZpY2VTdHJlYW1zbWVzc2FnZUhhbmRsZXJfYWRkQ2xpZW50c3RyZWFtc3NlcnZpY2VzX3JlbW92ZUNsaWVudG5hbWVzcGFjZWtleU9mc3RyZWFtSWRfaXNBbnlDbGllbnRTdWJzY3JpYmVkX2V2ZW50TWVzc2FnZUhhbmRsZXJqc29ucnBjMi4wc3RyZWFtTm90aWZ5U2VydmljZVVucmVnaXN0ZXJlZHNlcnZpY2VIYW5kbGVzX2NvbnRyb2xNZXNzYWdlSGFuZGxlcnBvcnRJZGlzb2xhdGVTdGFydHVwaXNvbGF0ZVNodXRkb3duX3NlcnZlck1lc3NhZ2VIYW5kbGVyX2hhbmRsZU5hdGl2ZVJwY0NhbGxUaGUgY2xpZW50IHNlbnQgYSBub24tcmVxdWVzdCBqc29uLXJwYyBtZXNzYWdlLnJvdXRlUmVxdWVzdFRoZSBycGMgY2FsbCByZXN1bHRlZCBpbiBleGNlcHRpb246IF9leGl0Y2xpZW50c0xpc3RJbnRlcm5hbCB2bS1zZXJ2aWNlIGVycm9yOiBpZ25vcmluZyBpbGxlZ2FsIG1lc3NhZ2U6IF9maW5kRmlyc3RDbGllbnRUaGF0SGFuZGxlc1NlcnZpY2Vfc3RyZWFtTGlzdGVuc3RyZWFtTGlzdGVuOiBpbnZhbGlkICdzdHJlYW1JZCcgcGFyYW1ldGVyOiBfc2VuZFNlcnZpY2VSZWdpc3RlcmVkRXZlbnRfc3RyZWFtQ2FuY2VsX2hhc05hbWVzcGFjZV9nZXROYW1lc3BhY2VfZ2V0TWV0aG9kX3JlZ2lzdGVyU2VydmljZXJlZ2lzdGVyU2VydmljZTogaW52YWxpZCAnc2VydmljZScgcGFyYW1ldGVyOiByZWdpc3RlclNlcnZpY2U6IGludmFsaWQgJ2FsaWFzJyBwYXJhbWV0ZXI6IFNlcnZpY2VSZWdpc3RlcmVkX2hhbmRsZVNlcnZpY2VuZXdJZG9sZElkc2VyaWFsZm9yd2FyZFRvSnNvblVua25vd24gc2VydmljZTogYXJnc09mU3RyaW5nX3JvdXRlUmVxdWVzdEltcGxjb21wbGV0ZWRzdHJlYW1MaXN0ZW5zdHJlYW1DYW5jZWxyZWdpc3RlclNlcnZpY2VzaG91bGRIYW5kbGVNZXNzYWdlaGFuZGxlTWVzc2FnZXNlbmRUb1ZNc2V0RXJyb3JSZXNwb25zZVVuZXhwZWN0ZWQgZXhjZXB0aW9uOnJvdXRlUmVzcG9uc2VyZWxlYXNlQXNzZXRleHRlbnNpb25TdGFydHRleHQvaHRtbDsgY2hhcnNldD1VVEYtOGFwcGxpY2F0aW9uL2RhcnQ7IGNoYXJzZXQ9VVRGLThhcHBsaWNhdGlvbi9qYXZhc2NyaXB0OyBjaGFyc2V0PVVURi04Y3NzdGV4dC9jc3M7IGNoYXJzZXQ9VVRGLThnaWZpbWFnZS9naWZwbmdpbWFnZS9wbmdqcGdpbWFnZS9qcGVnanBlZ2ltYWdlL3N2Zyt4bWx0YXJCeXRlc2Fzc2V0TGlzdGFzc2V0c0NsaWVudF9GaWxlU3lzdGVtcmVzb2x2ZVBhdGhEZXZGU19mc01hcF9ycGNOYW1lc19saXN0RGV2RlNfY3JlYXRlRGV2RlNfZGVsZXRlRGV2RlNfcmVhZERldkZTRmlsZV93cml0ZURldkZTRmlsZV93cml0ZURldkZTRmlsZXNfbGlzdERldkZTRmlsZXNkZWxldGlvbnNVbmV4cGVjdGVkIHJwYyBGaWxlU3lzdGVtTGlzdGZzTmFtZXN1cmlQYXJhbUZTRmlsZWZpbGVDb250ZW50c19yZWFkRGV2RlNGaWxlOiBkZWNvZGVkRmlsZUNvbnRlbnRzZmlsZUluZm86IGludmFsaWQgJ2ZpbGVzJyBwYXJhbWV0ZXIgYXQgaW5kZXggZmlsZUxpc3RGU0ZpbGVMaXN0Q29uc3RhbnRzU0VSVklDRV9FWElUX01FU1NBR0VfSURJU09MQVRFX1NUQVJUVVBfTUVTU0FHRV9JRElTT0xBVEVfU0hVVERPV05fTUVTU0FHRV9JRFdFQl9TRVJWRVJfQ09OVFJPTF9NRVNTQUdFX0lEU0VSVkVSX0lORk9fTUVTU0FHRV9JRE1FVEhPRF9DQUxMX0ZST01fTkFUSVZFUnVubmluZ0lzb2xhdGVzZXJ2aWNlSWRpc29sYXRlcy9zZW5kVG9Jc29sYXRlUnVubmluZ0lzb2xhdGVzaXNvbGF0ZXNfcm9vdFBvcnRJZHJpaXNvbGF0ZVBhcmFtaW52YWxpZCAnaXNvbGF0ZUlkJyBwYXJhbWV0ZXI6IFNlbnRpbmVsQ29sbGVjdGVkdmFsdWVBc1N0cmluZzxjb2xsZWN0ZWQ+c2V0UmVzcG9uc2VldmFsdWF0ZUluRnJhbWVfRXZhbHVhdG9yX21lc3NhZ2VfYnVpbGRTY29wZWJ1aWxkU2NvcGVSZXNwb25zZXJlc3BvbnNlSnNvbmRlY29kZUpzb25rZXJuZWxCYXNlNjRfY29tcGlsZUV4cHJlc3Npb25fZXZhbHVhdGVDb21waWxlZEV4cHJlc3Npb25fc2V0dXBQYXJhbXNidWlsZFNjb3BlUGFyYW1zX2J1aWxkRXhwcmVzc2lvbkV2YWx1YXRpb25TY29wZWJ1aWxkU2NvcGVidWlsZFNjb3BlUmVzcG9uc2VSZXN1bHRleHRlcm5hbENsaWVudGNvbXBpbGVQYXJhbXNwYXJhbV9uYW1lc3R5cGVfcGFyYW1zX25hbWVzanNvbk1hcGtlcm5lbEJ5dGVzY29tcGlsZUV4cHJlc3Npb25QYXJhbXNkaXNhYmxlQnJlYWtwb2ludHNydW5QYXJhbXNydW5FeHByZXNzaW9uZnJhbWVJbmRleHRhcmdldElkTWVzc2FnZVR5cGVSZXF1ZXN0Tm90aWZpY2F0aW9uUmVzcG9uc2VfZnJvbUpzb25ScGNSZXF1ZXN0X2Zyb21Kc29uUnBjTm90aWZpY2F0aW9uX2Zyb21Kc29uUnBjUmVzdWx0X2Zyb21Kc29uUnBjRXJyb3Jmb3JNZXRob2Rmb3JJc29sYXRlZnJvbUpzb25ScGMiaWQiIG11c3QgYmUgYSBudW1iZXIsIHN0cmluZywgb3IgbnVsbC5JbnZhbGlkIG1lc3NhZ2UgZm9ybWF0X21ldGhvZE5hbWVGcm9tVXJpdG9VcmlvdmVybG9hZHNfbWFrZUFsbFN0cmluZ25ld19saXN0X3NldFJlc3BvbnNlRnJvbVBvcnRjb3VsZCBub3Qgc2VuZCBtZXNzYWdlIFtdIHRvIGlzb2xhdGVfbWV0aG9kTmVlZHNPYmplY3RQYXJhbWV0ZXJzTWVzc2FnZVJvdXRlclJlc3BvbnNlUGF5bG9hZEtpbmRVdGY4U3RyaW5nU2VydmljZUVycm9ySW50ZXJuYWxFcnJvclVucmVjb2duaXplZCByZXNwb25zZTogQmluYXJ5IHJlc3BvbnNlcyBjYW4gbm90IGJlIGRlY29kZWRfTmFtZWRMb29rdXAmT2JqZWN0Jkl0ZXJhYmxlTWl4aW5OYW1lZExvb2t1cF9lbGVtZW50c19pZHNJZEdlbmVyYXRvcmlzb2xhdGVDb250cm9sUG9ydHNjcmlwdExvYWRQb3J0c2VydmljZUF1dGhUb2tlbmlzb2xhdGVFbWJlZGRlckRhdGFrUGFyc2VFcnJvcmtJbnZhbGlkUmVxdWVzdGtNZXRob2ROb3RGb3VuZGtJbnRlcm5hbEVycm9ya0ZlYXR1cmVEaXNhYmxlZGtDYW5ub3RBZGRCcmVha3BvaW50a1N0cmVhbUFscmVhZHlTdWJzY3JpYmVka1N0cmVhbU5vdFN1YnNjcmliZWRrSXNvbGF0ZU11c3RCZVJ1bm5hYmxla0lzb2xhdGVNdXN0QmVQYXVzZWRrQ2Fubm90UmVzdW1la0lzb2xhdGVJc1JlbG9hZGluZ2tJc29sYXRlUmVsb2FkQmFycmVka0lzb2xhdGVNdXN0SGF2ZVJlbG9hZGVka1NlcnZpY2VBbHJlYWR5UmVnaXN0ZXJlZGtTZXJ2aWNlRGlzYXBwZWFyZWRrRXhwcmVzc2lvbkNvbXBpbGF0aW9uRXJyb3JrSW52YWxpZFRpbWVsaW5lUmVxdWVzdGtGaWxlU3lzdGVtQWxyZWFkeUV4aXN0c2tGaWxlU3lzdGVtRG9lc05vdEV4aXN0a0ZpbGVEb2VzTm90RXhpc3RfZXJyb3JNZXNzYWdlc0ZlYXR1cmUgaXMgZGlzYWJsZWRTdHJlYW0gYWxyZWFkeSBzdWJzY3JpYmVkU3RyZWFtIG5vdCBzdWJzY3JpYmVkRmlsZSBzeXN0ZW0gYWxyZWFkeSBleGlzdHNGaWxlIHN5c3RlbSBkb2VzIG5vdCBleGlzdEZpbGUgZG9lcyBub3QgZXhpc3RTZXJ2aWNlIGFscmVhZHkgcmVnaXN0ZXJlZFNlcnZpY2UgaGFzIGRpc2FwcGVhcmVkRXhwcmVzc2lvbiBjb21waWxhdGlvbiBlcnJvclRoZSB0aW1lbGluZSByZWxhdGVkIHJlcXVlc3QgY291bGQgbm90IGJlIGNvbXBsZXRlZGR1ZSB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uc2hvcnREZWxheV9hc3NldHNfZGVjb2RlQXNzZXRzVk1TZXJ2aWNlX0RlY29kZUFzc2V0c0NvdWxkIG5vdCBsb2FkIE9ic2VydmF0b3J5IGFzc2V0czogX2VuY29kZURldkZTRGlzYWJsZWRFcnJvckRldkZTIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBEYXJ0IGltcGxlbWVudGF0aW9uX2VuY29kZUZpbGVTeXN0ZW1BbHJlYWR5RXhpc3RzRXJyb3I6IGZpbGUgc3lzdGVtICcnIGFscmVhZHkgZXhpc3RzX2VuY29kZUZpbGVTeXN0ZW1Eb2VzTm90RXhpc3RFcnJvcicgZG9lcyBub3QgZXhpc3RzZW5kSXNvbGF0ZVNlcnZpY2VNZXNzYWdlVk1TZXJ2aWNlX1NlbmRJc29sYXRlU2VydmljZU1lc3NhZ2VzZW5kUm9vdFNlcnZpY2VNZXNzYWdlVk1TZXJ2aWNlX1NlbmRSb290U2VydmljZU1lc3NhZ2VzZW5kT2JqZWN0Um9vdFNlcnZpY2VNZXNzYWdlVk1TZXJ2aWNlX1NlbmRPYmplY3RSb290U2VydmljZU1lc3NhZ2VfbWFrZUF1dGhUb2tlbmtUb2tlbkJ5dGVTaXplZW5jb2RlUnBjRXJyb3JlbmNvZGVNaXNzaW5nUGFyYW1FcnJvciBleHBlY3RzIHRoZSAnJyBwYXJhbWV0ZXJlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcjogaW52YWxpZCAnJyBwYXJhbWV0ZXI6IGVuY29kZUNvbXBpbGF0aW9uRXJyb3JkaWFnbm9zdGljZW5jb2RlUmVzdWx0ZW5jb2RlU3VjY2Vzc1N1Y2Nlc3Nib290X3JlZ2lzdGVySXNvbGF0ZXBvcnRfaWRfb25TdGFydFZNU2VydmljZV9PblN0YXJ0X29uRXhpdFZNU2VydmljZV9PbkV4aXRvblNlcnZlckFkZHJlc3NDaGFuZ2VWTVNlcnZpY2VfT25TZXJ2ZXJBZGRyZXNzQ2hhbmdlX3ZtTGlzdGVuU3RyZWFtVk1TZXJ2aWNlX0xpc3RlblN0cmVhbV92bUNhbmNlbFN0cmVhbVZNU2VydmljZV9DYW5jZWxTdHJlYW1fcmVxdWVzdEFzc2V0c1ZNU2VydmljZV9SZXF1ZXN0QXNzZXRzX3NwYXduVXJpTm90aWZ5Vk1TZXJ2aWNlX3NwYXduVXJpTm90aWZ5X3NldHVwQ29tcGxldGVkX2xvYWRQb3J0X2lzb2xhdGVJZF9sb2dJZF9wcmludFN0cmluZ0J1aWx0aW5fUHJpbnRTdHJpbmdfZ2V0UHJpbnRDbG9zdXJlX21ha2VMb2FkZXJSZXF1ZXN0U2VydmljZSBpc29sYXRlIGlzIG5vdCBhdmFpbGFibGUuKiBfc2V0V29ya2luZ0RpcmVjdG9yeVNldHRpbmcgd29ya2luZyBkaXJlY3Rvcnk6IFdvcmtpbmcgZGlyZWN0b3J5IFVSSTogU2V0dGluZyBwYWNrYWdlIHJvb3Q6IHBhY2thZ2VSb290U3RyUGFja2FnZSByb290IFVSSTogX3NldFBhY2thZ2VzTWFwUmVzb2x2aW5nIHBhY2thZ2VzIG1hcDogTm8gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBzZXQucGFja2FnZXNVcmlTdHJSZXNvbHZlZCBwYWNrYWdlcyBtYXAgdG86IF9yZXNvbHZlU2NyaXB0VXJpUmVzb2x2aW5nIHNjcmlwdDogUmVzb2x2ZWQgZW50cnkgcG9pbnQgdG86IF9maWxlUGF0aEZyb21Vcml1c2VyVXJpR2V0dGluZyBmaWxlIHBhdGggZnJvbTogTm90IGEga25vd24gc2NoZW1lOiBfcmVzb3VyY2VSZWFkQXNCeXRlc19nZXRQYWNrYWdlUm9vdEZ1dHVyZVJlcXVlc3QgZm9yIHBhY2thZ2Ugcm9vdCBmcm9tIHVzZXIgY29kZS5fZ2V0UGFja2FnZUNvbmZpZ0Z1dHVyZVJlcXVlc3QgZm9yIHBhY2thZ2UgY29uZmlnIGZyb20gdXNlciBjb2RlLl9yZXNvbHZlUGFja2FnZVVyaUZ1dHVyZVJlcXVlc3QgZm9yIHBhY2thZ2UgVXJpIHJlc29sdXRpb24gZnJvbSB1c2VyIGNvZGU6IE5vbi1wYWNrYWdlIFVyaSwgcmV0dXJuaW5nIHVubW9kaWZpZWQ6IEV4Y2VwdGlvbiB3aGVuIHJlc29sdmluZyBwYWNrYWdlIFVSSTogbmF0aXZld3JhcHBlcnNOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczFOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczJOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczNOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczRkYXJ0LmlvYnl0ZXNfYnVpbGRlci5kYXJ0Y29tbW9uLmRhcnRkYXRhX3RyYW5zZm9ybWVyLmRhcnRkaXJlY3RvcnkuZGFydGRpcmVjdG9yeV9pbXBsLmRhcnRlbWJlZGRlcl9jb25maWcuZGFydGV2ZW50aGFuZGxlci5kYXJ0ZmlsZS5kYXJ0ZmlsZV9pbXBsLmRhcnRmaWxlX3N5c3RlbV9lbnRpdHkuZGFydGlvX3Jlc291cmNlX2luZm8uZGFydGlvX3NpbmsuZGFydGlvX3NlcnZpY2UuZGFydGxpbmsuZGFydG5hbWVzcGFjZV9pbXBsLmRhcnRvdmVycmlkZXMuZGFydHBsYXRmb3JtLmRhcnRwbGF0Zm9ybV9pbXBsLmRhcnRwcm9jZXNzLmRhcnRzZWN1cmVfc2VydmVyX3NvY2tldC5kYXJ0c2VjdXJlX3NvY2tldC5kYXJ0c2VjdXJpdHlfY29udGV4dC5kYXJ0c2VydmljZV9vYmplY3QuZGFydHNvY2tldC5kYXJ0c3RkaW8uZGFydHN0cmluZ190cmFuc2Zvcm1lci5kYXJ0c3luY19zb2NrZXQuZGFydF9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wc0ltcGxfc2V0UG9pbnRlckRpcmVjdG9yeV9TZXRBc3luY0RpcmVjdG9yeUxpc3RlclBvaW50ZXJnZXRQb2ludGVyRGlyZWN0b3J5X0dldEFzeW5jRGlyZWN0b3J5TGlzdGVyUG9pbnRlcl9SYW5kb21BY2Nlc3NGaWxlT3BzSW1wbEZpbGVfU2V0UG9pbnRlckZpbGVfR2V0UG9pbnRlckZpbGVfQ2xvc2VGaWxlX1JlYWRCeXRlRmlsZV9SZWFkcmVhZEludG9GaWxlX1JlYWRJbnRvRmlsZV9Xcml0ZUJ5dGV3cml0ZUZyb21GaWxlX1dyaXRlRnJvbUZpbGVfUG9zaXRpb25zZXRQb3NpdGlvbkZpbGVfU2V0UG9zaXRpb25GaWxlX1RydW5jYXRlRmlsZV9MZW5ndGhGaWxlX0ZsdXNobG9ja0ZpbGVfTG9ja19XYXRjaGVyUGF0aHBhdGhJZF9Jbm90aWZ5RmlsZVN5c3RlbVdhdGNoZXJfaWRNYXBfbmV3V2F0Y2hlcl9kb25lV2F0Y2hlcl9wYXRoV2F0Y2hlZF93YXRjaGVyUGF0aF9wYXRoV2F0Y2hlZEVuZF9XaW4zMkZpbGVTeXN0ZW1XYXRjaGVyX0ZTRXZlbnRTdHJlYW1GaWxlU3lzdGVtV2F0Y2hlcnNvY2tldElkX0ZpbHRlckltcGxGaWx0ZXJfUHJvY2Vzc3Byb2Nlc3NlZEZpbHRlcl9Qcm9jZXNzZWRfWkxpYkluZmxhdGVGaWx0ZXJ3aW5kb3dCaXRzRmlsdGVyX0NyZWF0ZVpMaWJJbmZsYXRlX1pMaWJEZWZsYXRlRmlsdGVyZ3ppcG1lbUxldmVsRmlsdGVyX0NyZWF0ZVpMaWJEZWZsYXRlX0lPU2VydmljZVBvcnRzbWF4UG9ydHNfcG9ydHNfZnJlZVBvcnRzX3VzZWRQb3J0c19nZXRQb3J0Zm9yUmVxdWVzdElkX3JldHVyblBvcnRfbmV3U2VydmljZVBvcnRJT1NlcnZpY2VfTmV3U2VydmljZVBvcnRfTmFtZXNwYWNlSW1wbF9jYWNoZWROYW1lc3BhY2VOYW1lc3BhY2VfQ3JlYXRlX2dldFBvaW50ZXJOYW1lc3BhY2VfR2V0UG9pbnRlcl9nZXREZWZhdWx0TmFtZXNwYWNlX0dldERlZmF1bHRfc2V0dXBOYW1lc3BhY2VfbmFtZXNwYWNlX25hbWVzcGFjZVBvaW50ZXJfU2lnbmFsQ29udHJvbGxlcl9saXN0ZW5fc2lnbmFsTnVtYmVyRmFpbGVkIHRvIGxpc3RlbiBmb3IgX3NldFNpZ25hbEhhbmRsZXJQcm9jZXNzX1NldFNpZ25hbEhhbmRsZXJfY2xlYXJTaWduYWxIYW5kbGVyUHJvY2Vzc19DbGVhclNpZ25hbEhhbmRsZXJfUHJvY2Vzc1N0YXJ0U3RhdHVzX2Vycm9yQ29kZV9lcnJvck1lc3NhZ2VfUHJvY2Vzc0ltcGxOYXRpdmVXcmFwcGVyX1Byb2Nlc3NJbXBsX3Jlc291cmNlSW5mb2Nvbm5lY3RlZFJlc291cmNlSGFuZGxlcl9wYXRoX21vZGVfc3RkaW5fc3Rkb3V0X3N0ZGVycl9leGl0SGFuZGxlcl9lbmRlZF9zdGFydGVkX2V4aXRDb2RlaW5jbHVkZVBhcmVudEVudmlyb25tZW50cnVuSW5TaGVsbGV4dC5kYXJ0LmlvLmdldFByb2Nlc3Nlc2V4dC5kYXJ0LmlvLmdldFByb2Nlc3NCeUlkUGF0aCBpcyBub3QgYSBTdHJpbmc6IEFyZ3VtZW50cyBpcyBub3QgYSBMaXN0OiBOb24tc3RyaW5nIGFyZ3VtZW50OiBfd2luZG93c0FyZ3VtZW50RXNjYXBlV29ya2luZ0RpcmVjdG9yeSBpcyBub3QgYSBTdHJpbmc6IEVudmlyb25tZW50IGlzIG5vdCBhIG1hcDogRW52aXJvbm1lbnQga2V5IG9yIHZhbHVlIGlzIG5vdCBhIHN0cmluZzogKE1vZGUgaXMgbm90IGEgUHJvY2Vzc1N0YXJ0TW9kZTogX3N0ZGluTmF0aXZlU29ja2V0X25hdGl2ZVNvY2tldF9zdGRvdXROYXRpdmVTb2NrZXRfc3RkZXJyTmF0aXZlU29ja2V0X21vZGVJc0F0dGFjaGVkX21vZGVIYXNTdGRpb19nZXRTaGVsbENvbW1hbmRjbWQuZXhlX2dldFNoZWxsQXJndW1lbnRzZXhlY3V0YWJsZXNoZWxsQXJndW1lbnRzL2Njb21tYW5kTGluZSciJyInbmV4dFBvc3F1b3RlUG9zbnVtQmFja3NsYXNoX2ludEZyb21CeXRlc19zdGFydE5hdGl2ZWV4aXREYXRhUmVhZEVYSVRfREFUQV9TSVpFZXhpdERhdGFCdWZmZXJpbnRzaGFuZGxlRXhpdGRlc3Ryb3lzdG9wcGVkX3J1bkFuZFdhaXRzdGRvdXRFbmNvZGluZ3N0ZGVyckVuY29kaW5nX3dhaXRnZXRPdXRwdXRQcm9jZXNzX1N0YXJ0ZXhpdEhhbmRsZXJQcm9jZXNzX1dhaXRTSUdURVJNQXJndW1lbnQgJ3NpZ25hbCcgbXVzdCBiZSBhIFByb2Nlc3NTaWduYWxwaWRfSW50ZXJuZXRBZGRyZXNzX2FkZHJlc3NMb29wYmFja0lQdjRfYWRkcmVzc0xvb3BiYWNrSVB2Nl9hZGRyZXNzQW55SVB2NF9hZGRyZXNzQW55SVB2Nl9JUHY0QWRkckxlbmd0aF9JUHY2QWRkckxlbmd0aGxvb3BiYWNrSVB2NGxvb3BiYWNrSVB2NmFueUlQdjRhbnlJUHY2X2hvc3RfaW5fYWRkcnJhd0FkZHJlc3Npc0xvb3BiYWNraXNMaW5rTG9jYWxpc011bHRpY2FzdEludmFsaWQgaW50ZXJuZXQgYWRkcmVzcyBpbl9hZGRyMC4wLjAuMF9jbG9uZVdpdGhOZXdIb3N0SW50ZXJuZXRBZGRyZXNzKCdfcGFyc2VJbnRlcm5ldEFkZHJlc3NfUGFyc2VfTmV0d29ya0ludGVyZmFjZU5ldHdvcmtJbnRlcmZhY2UoJ19OYXRpdmVTb2NrZXROYXRpdmVXcmFwcGVyX19OYXRpdmVTb2NrZXQmX05hdGl2ZVNvY2tldE5hdGl2ZVdyYXBwZXImX1NlcnZpY2VPYmplY3RfX3NlcnZpY2VJZF9zZXJ2aWNlSWRfc2VydmljZVBhdGhfc2VydmljZVR5cGVQYXRoX3NlcnZpY2VUeXBlTmFtZV9zZXJ2aWNlVHlwZV9OYXRpdmVTb2NrZXRyZWFkRXZlbnR3cml0ZUV2ZW50ZXJyb3JFdmVudGNsb3NlZEV2ZW50ZGVzdHJveWVkRXZlbnRmaXJzdEV2ZW50bGFzdEV2ZW50ZXZlbnRDb3VudGNsb3NlQ29tbWFuZHNodXRkb3duUmVhZENvbW1hbmRzaHV0ZG93bldyaXRlQ29tbWFuZHJldHVyblRva2VuQ29tbWFuZHNldEV2ZW50TWFza0NvbW1hbmRmaXJzdENvbW1hbmRsYXN0Q29tbWFuZGxpc3RlbmluZ1NvY2tldHBpcGVTb2NrZXR0eXBlTm9ybWFsU29ja2V0dHlwZUxpc3RlbmluZ1NvY2tldHR5cGVQaXBldHlwZVR5cGVNYXNrdGNwU29ja2V0dWRwU29ja2V0aW50ZXJuYWxTb2NrZXRpbnRlcm5hbFNpZ25hbFNvY2tldHR5cGVUY3BTb2NrZXR0eXBlVWRwU29ja2V0dHlwZUludGVybmFsU29ja2V0dHlwZUludGVybmFsU2lnbmFsU29ja2V0dHlwZVByb3RvY29sTWFza2hvc3ROYW1lTG9va3VwTWVzc2FnZWxpc3RJbnRlcmZhY2VzTWVzc2FnZXJldmVyc2VMb29rdXBNZXNzYWdlcHJvdG9jb2xJUHY0cHJvdG9jb2xJUHY2bm9ybWFsVG9rZW5CYXRjaFNpemVsaXN0ZW5pbmdUb2tlbkJhdGNoU2l6ZV9yZXRyeUR1cmF0aW9uX3JldHJ5RHVyYXRpb25Mb29wYmFja2lzQ2xvc2luZ2lzQ2xvc2VkUmVhZGNsb3NlZFJlYWRFdmVudFNlbnRpc0Nsb3NlZFdyaXRlY2xvc2VDb21wbGV0ZXJldmVudEhhbmRsZXJzZmxhZ3NTZW50dHlwZUZsYWdzbG9jYWxQb3J0bG9jYWxBZGRyZXNzYXZhaWxhYmxlc2VuZFJlYWRFdmVudHNyZWFkRXZlbnRJc3N1ZWRzZW5kV3JpdGVFdmVudHN3cml0ZUV2ZW50SXNzdWVkd3JpdGVBdmFpbGFibGVyZXNvdXJjZUluZm9kYXRhZ3JhbW5vcm1hbF93YXRjaENvbW1vbm5hdGl2ZVNldFNvY2tldElkd2F0Y2hTaWduYWxGYWlsZWQgaG9zdCBsb29rdXA6ICdyZXZlcnNlTG9va3VwYWRkckZhaWxlZCByZXZlcnNlIGhvc3QgbG9va3VwbGlzdEludGVyZmFjZXNpbmNsdWRlTG9vcGJhY2tpbmNsdWRlTGlua0xvY2FsRmFpbGVkIGxpc3RpbmcgaW50ZXJmYWNlc3N0YXJ0Q29ubmVjdHNvdXJjZUFkZHJlc3Njb25uZWN0aW5nY29ubmVjdE5leHRuYXRpdmVDcmVhdGVDb25uZWN0bmF0aXZlQ3JlYXRlQmluZENvbm5lY3Rpc0JpbmRFcnJvckJpbmQgZmFpbGVkQ29ubmVjdGlvbiBmYWlsZWRzZXRIYW5kbGVyc25hdGl2ZUdldEVycm9yc2V0TGlzdGVuaW5nQ29ubmVjdGlvbiBhdHRlbXB0IGNhbmNlbGxlZCwgaG9zdDogLCBwb3J0OiBjb25uZWN0c29ja2V0RnV0dXJlQ29ubmVjdGlvbiB0aW1lZCBvdXQsIGhvc3Q6IF9yZXNvbHZlSG9zdGJhY2tsb2d2Nk9ubHlzaGFyZWRuYXRpdmVDcmVhdGVCaW5kTGlzdGVuRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0Y29ubmVjdFRvRXZlbnRIYW5kbGVyc2V0dXBSZXNvdXJjZUluZm9iaW5kRGF0YWdyYW1yZXVzZUFkZHJlc3NyZXVzZVBvcnR0dGxuYXRpdmVDcmVhdGVCaW5kRGF0YWdyYW1GYWlsZWQgdG8gY3JlYXRlIGRhdGFncmFtIHNvY2tldGlzTGlzdGVuaW5naXNQaXBlaXNJbnRlcm5hbGlzSW50ZXJuYWxTaWduYWxpc1RjcGlzVWRwSWxsZWdhbCBsZW5ndGggbmF0aXZlUmVhZFJlYWQgZmFpbGVkdG90YWxSZWFkZGlkUmVhZHJlY2VpdmVuYXRpdmVSZWN2RnJvbVJlY2VpdmUgZmFpbGVkbmF0aXZlQXZhaWxhYmxlSW52YWxpZCBhcmd1bWVudHMgdG8gd3JpdGUgb24gU29ja2V0YnVmZmVyQW5kU3RhcnRuYXRpdmVXcml0ZVdyaXRlIGZhaWxlZGFkZFdyaXRlbmF0aXZlU2VuZFRvU2VuZCBmYWlsZWRyZXR1cm5Ub2tlbnNuYXRpdmVBY2NlcHRhZGRSZWFkU29ja2V0IGhhcyBiZWVuIGNsb3NlZG5hdGl2ZUdldFBvcnRuYXRpdmVHZXRSZW1vdGVQZWVyaXNzdWVSZWFkRXZlbnRpc3N1ZVdyaXRlRXZlbnRtdWx0aXBsZXhldmVudHNPYmpkaXNjb25uZWN0RnJvbUV2ZW50SGFuZGxlcnRva2VuQmF0Y2hTaXplc2VuZFRvRXZlbnRIYW5kbGVyZGVzdHJveWVkZGlyZWN0aW9uc2h1dGRvd25SZWFkc2h1dGRvd25Xcml0ZWZ1bGxEYXRhZXh0LmRhcnQuaW8uZ2V0T3BlblNvY2tldHNleHQuZGFydC5pby5nZXRTb2NrZXRCeUlEaXNFcnJvclJlc3BvbnNlY3JlYXRlRXJyb3JVbmtub3duIGVycm9yZ2V0T3B0aW9ubmF0aXZlR2V0T3B0aW9uc2V0T3B0aW9ubmF0aXZlU2V0T3B0aW9uZ2V0UmF3T3B0aW9ub3B0aW9uLnZhbHVlbmF0aXZlR2V0UmF3T3B0aW9uc2V0UmF3T3B0aW9ubmF0aXZlU2V0UmF3T3B0aW9ubXVsdGljYXN0QWRkcmVzc1RoZSBuZXR3b3JrIGludGVyZmFjZSBkb2VzIG5vdCBoYXZlIGFuIGFkZHJlc3Mgb2YgdGhlIHNhbWUgZmFtaWx5IGFzIHRoZSBtdWx0aWNhc3QgYWRkcmVzc2pvaW5NdWx0aWNhc3RpbnRlcmZhY2VBZGRyaW50ZXJmYWNlSW5kZXhuYXRpdmVKb2luTXVsdGljYXN0bGVhdmVNdWx0aWNhc3RuYXRpdmVMZWF2ZU11bHRpY2FzdFNvY2tldF9TZXRTb2NrZXRJZFNvY2tldF9BdmFpbGFibGVTb2NrZXRfUmVhZFNvY2tldF9SZWN2RnJvbVNvY2tldF9Xcml0ZUxpc3RTb2NrZXRfU2VuZFRvU29ja2V0X0NyZWF0ZUNvbm5lY3RTb2NrZXRfQ3JlYXRlQmluZENvbm5lY3Rzb3VyY2VBZGRyU29ja2V0QmFzZV9Jc0JpbmRFcnJvcmVycm9yTnVtYmVyU2VydmVyU29ja2V0X0NyZWF0ZUJpbmRMaXN0ZW5Tb2NrZXRfQ3JlYXRlQmluZERhdGFncmFtU2VydmVyU29ja2V0X0FjY2VwdFNvY2tldF9HZXRQb3J0U29ja2V0X0dldFJlbW90ZVBlZXJuYXRpdmVHZXRTb2NrZXRJZFNvY2tldF9HZXRTb2NrZXRJZFNvY2tldF9HZXRFcnJvclNvY2tldF9HZXRPcHRpb25wcm90b2NvbFNvY2tldF9HZXRSYXdPcHRpb25Tb2NrZXRfU2V0T3B0aW9uU29ja2V0X1NldFJhd09wdGlvblNvY2tldF9Kb2luTXVsdGljYXN0U29ja2V0X0xlYXZlTXVsdGljYXN0X1Jhd1NlcnZlclNvY2tldF9zb2NrZXRfcmVmZXJlbmNlUG9ydF92Nk9ubHlJbnZhbGlkIGJhY2tsb2cgU3RyZWFtIHdhcyBhbHJlYWR5IGxpc3RlbmVkIHRvX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2Vfb25QYXVzZVN0YXRlQ2hhbmdlX3Jlc3VtZV9SYXdTb2NrZXRfcmVhZEV2ZW50c0VuYWJsZWRfd3JpdGVFdmVudHNFbmFibGVkX2lzTWFjT1NUZXJtaW5hbElucHV0d3JpdGVFdmVudHNFbmFibGVkbmF0aXZlVGFza25hdGl2ZVNvY2tldF93cml0ZVBpcGVfcmVhZFBpcGVmZHNvY2tldFR5cGVyZWFkRXZlbnRzRW5hYmxlZGVuYWJsZWRfU2VydmVyU29ja2V0cmF3U29ja2V0X1NvY2tldFN0cmVhbUNvbnN1bWVyc3RyZWFtQ29tcGxldGVyX2Vuc3VyZVJhd1NvY2tldFN1YnNjcmlwdGlvbl9jb25zdW1lckRvbmVfd3JpdGVfZW5hYmxlV3JpdGVFdmVudF9kaXNhYmxlV3JpdGVFdmVudF9Tb2NrZXRfY29udHJvbGxlckNsb3NlZF9jb25zdW1lcl9kZXRhY2hSZWFkeXNlcENhbm5vdCBzZW5kIGVycm9ycyBvbiBzb2NrZXRzX2Nsb3NlUmF3U29ja2V0X2RldGFjaFJhd19SYXdEYXRhZ3JhbVNvY2tldG11bHRpY2FzdExvb3BiYWNrbXVsdGljYXN0SG9wc211bHRpY2FzdEludGVyZmFjZWJyb2FkY2FzdEVuYWJsZWRfU2VjdXJlU29ja2V0cmVuZWdvdGlhdGV1c2VTZXNzaW9uQ2FjaGVyZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGVyZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGVwZWVyQ2VydGlmaWNhdGVwZWVyQ2VydGlmaWNhdGUgY2FsbGVkIG9uIGRlc3Ryb3llZCBTZWN1cmVTb2NrZXRzZWxlY3RlZFByb3RvY29sc2VsZWN0ZWRQcm90b2NvbCBjYWxsZWQgb24gZGVzdHJveWVkIFNlY3VyZVNvY2tldF9TZWN1cmVGaWx0ZXJJbXBsRU5DUllQVEVEX1NJWkVidWZmZXJzU2VjdXJlU29ja2V0X0Nvbm5lY3Rob3N0TmFtZWlzX3NlcnZlcnByb3RvY29sc19kZXN0cm95U2VjdXJlU29ja2V0X0Rlc3Ryb3loYW5kc2hha2VTZWN1cmVTb2NrZXRfSGFuZHNoYWtlcmVoYW5kc2hha2Vwcm9jZXNzQnVmZmVyU2VjdXJlU29ja2V0X0dldFNlbGVjdGVkUHJvdG9jb2xTZWN1cmVTb2NrZXRfUmVuZWdvdGlhdGVTZWN1cmVTb2NrZXRfSW5pdFNlY3VyZVNvY2tldF9QZWVyQ2VydGlmaWNhdGVyZWdpc3RlckJhZENlcnRpZmljYXRlQ2FsbGJhY2tTZWN1cmVTb2NrZXRfUmVnaXN0ZXJCYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrcmVnaXN0ZXJIYW5kc2hha2VDb21wbGV0ZUNhbGxiYWNrU2VjdXJlU29ja2V0X1JlZ2lzdGVySGFuZHNoYWtlQ29tcGxldGVDYWxsYmFja2hhbmRzaGFrZUNvbXBsZXRlSGFuZGxlcl9wb2ludGVyU2VjdXJlU29ja2V0X0ZpbHRlclBvaW50ZXJfU2VjdXJpdHlDb250ZXh0ZGVmYXVsdENvbnRleHR3aXRoVHJ1c3RlZFJvb3RzX2NyZWF0ZU5hdGl2ZUNvbnRleHRfdHJ1c3RCdWlsdGluUm9vdHNTZWN1cml0eUNvbnRleHRfQWxsb2NhdGV1c2VQcml2YXRlS2V5cGFzc3dvcmR1c2VQcml2YXRlS2V5Qnl0ZXNTZWN1cml0eUNvbnRleHRfVXNlUHJpdmF0ZUtleUJ5dGVza2V5Qnl0ZXNzZXRUcnVzdGVkQ2VydGlmaWNhdGVzc2V0VHJ1c3RlZENlcnRpZmljYXRlc0J5dGVzU2VjdXJpdHlDb250ZXh0X1NldFRydXN0ZWRDZXJ0aWZpY2F0ZXNCeXRlc2NlcnRCeXRlc3VzZUNlcnRpZmljYXRlQ2hhaW51c2VDZXJ0aWZpY2F0ZUNoYWluQnl0ZXNTZWN1cml0eUNvbnRleHRfVXNlQ2VydGlmaWNhdGVDaGFpbkJ5dGVzY2hhaW5CeXRlc3NldENsaWVudEF1dGhvcml0aWVzc2V0Q2xpZW50QXV0aG9yaXRpZXNCeXRlc1NlY3VyaXR5Q29udGV4dF9TZXRDbGllbnRBdXRob3JpdGllc0J5dGVzYXV0aENlcnRCeXRlc3NldEFscG5Qcm90b2NvbHNpc1NlcnZlcmVuY29kZWRQcm90b2NvbHNfc2V0QWxwblByb3RvY29sc1NlY3VyaXR5Q29udGV4dF9TZXRBbHBuUHJvdG9jb2xzU2VjdXJpdHlDb250ZXh0X1RydXN0QnVpbHRpblJvb3RzX1g1MDlDZXJ0aWZpY2F0ZUltcGxfY2FjaGVkRGVyX2NhY2hlZFBlbV9jYWNoZWRTaGExX2Rlclg1MDlfRGVyZGVyX3BlbVg1MDlfUGVtcGVtX3NoYTFYNTA5X1NoYTFzdWJqZWN0WDUwOV9TdWJqZWN0aXNzdWVyWDUwOV9Jc3N1ZXJzdGFydFZhbGlkaXR5X3N0YXJ0VmFsaWRpdHlpc1V0Y2VuZFZhbGlkaXR5X2VuZFZhbGlkaXR5WDUwOV9TdGFydFZhbGlkaXR5WDUwOV9FbmRWYWxpZGl0eV9SYXdTeW5jaHJvbm91c1NvY2tldGNvbm5lY3RTeW5jcmVhZFN5bmNfTmF0aXZlU3luY2hyb25vdXNTb2NrZXROYXRpdmVXcmFwcGVyX05hdGl2ZVN5bmNocm9ub3VzU29ja2V0UGFyYW1ldGVyIGhvc3QgY2Fubm90IGJlIG51bGxfbmF0aXZlQ3JlYXRlQ29ubmVjdFN5bmNfbmF0aXZlQXZhaWxhYmxlX25hdGl2ZUdldFBvcnRfbmF0aXZlR2V0UmVtb3RlUGVlcl9uYXRpdmVDbG9zZVN5bmNfY2hlY2tBdmFpbGFibGVTb2NrZXQgaXMgY2xvc2VkIGZvciByZWFkaW5nSW52YWxpZCBhcmd1bWVudHMgdG8gcmVhZEludG9TeW5jc3RhcnQgY2Fubm90IGJlIG51bGxfbmF0aXZlUmVhZEludG9yZWFkSW50b1N5bmMgZmFpbGVkX25hdGl2ZVJlYWRfbmF0aXZlU2h1dGRvd25SZWFkX25hdGl2ZVNodXRkb3duV3JpdGVTb2NrZXQgaXMgY2xvc2VkIGZvciB3cml0aW5nSW52YWxpZCBhcmd1bWVudHMgdG8gd3JpdGVGcm9tU3luY3N0YXJ0IGNhbm5vdCBiZSBlcXVhbCB0byBudWxsX25hdGl2ZVdyaXRld3JpdGVGcm9tU3luYyBmYWlsZWRfbmF0aXZlTG9va3VwUmVxdWVzdFN5bmNocm9ub3VzU29ja2V0X0xvb2t1cFJlcXVlc3RTeW5jaHJvbm91c1NvY2tldF9DcmVhdGVDb25uZWN0U3luY1N5bmNocm9ub3VzU29ja2V0X0F2YWlsYWJsZVN5bmNocm9ub3VzU29ja2V0X0Nsb3NlU3luY1N5bmNocm9ub3VzU29ja2V0X0dldFBvcnRTeW5jaHJvbm91c1NvY2tldF9HZXRSZW1vdGVQZWVyU3luY2hyb25vdXNTb2NrZXRfUmVhZFN5bmNocm9ub3VzU29ja2V0X1JlYWRMaXN0U3luY2hyb25vdXNTb2NrZXRfU2h1dGRvd25SZWFkU3luY2hyb25vdXNTb2NrZXRfU2h1dGRvd25Xcml0ZVN5bmNocm9ub3VzU29ja2V0X1dyaXRlTGlzdHRvQnl0ZXNfQ29weWluZ0J5dGVzQnVpbGRlcl9pbml0U2l6ZV9lbXB0eUxpc3RfcG93MnJvdW5kdXBfQnl0ZXNCdWlsZGVyX2NodW5rc3R5cGVkQnl0ZXNJT0V4Y2VwdGlvbk9TRXJyb3Jub0Vycm9yQ29kZU9TIEVycm9yLCBlcnJubyA9IDogZXJybm8gPSBfQnVmZmVyQW5kU3RhcnRfSU9DcnlwdG9nZXRSYW5kb21CeXRlc0NyeXB0b19HZXRSYW5kb21CeXRlc1pMaWJPcHRpb25taW5XaW5kb3dCaXRzTUlOX1dJTkRPV19CSVRTVXNlIG1pbldpbmRvd0JpdHMgaW5zdGVhZG1heFdpbmRvd0JpdHNNQVhfV0lORE9XX0JJVFNVc2UgbWF4V2luZG93Qml0cyBpbnN0ZWFkZGVmYXVsdFdpbmRvd0JpdHNERUZBVUxUX1dJTkRPV19CSVRTVXNlIGRlZmF1bHRXaW5kb3dCaXRzIGluc3RlYWRtaW5MZXZlbE1JTl9MRVZFTFVzZSBtaW5MZXZlbCBpbnN0ZWFkbWF4TGV2ZWxNQVhfTEVWRUxVc2UgbWF4TGV2ZWwgaW5zdGVhZGRlZmF1bHRMZXZlbERFRkFVTFRfTEVWRUxVc2UgZGVmYXVsdExldmVsIGluc3RlYWRtaW5NZW1MZXZlbE1JTl9NRU1fTEVWRUxVc2UgbWluTWVtTGV2ZWwgaW5zdGVhZG1heE1lbUxldmVsTUFYX01FTV9MRVZFTFVzZSBtYXhNZW1MZXZlbCBpbnN0ZWFkZGVmYXVsdE1lbUxldmVsREVGQVVMVF9NRU1fTEVWRUxVc2UgZGVmYXVsdE1lbUxldmVsIGluc3RlYWRzdHJhdGVneUZpbHRlcmVkU1RSQVRFR1lfRklMVEVSRURVc2Ugc3RyYXRlZ3lGaWx0ZXJlZCBpbnN0ZWFkc3RyYXRlZ3lIdWZmbWFuT25seVNUUkFURUdZX0hVRkZNQU5fT05MWVVzZSBzdHJhdGVneUh1ZmZtYW5Pbmx5IGluc3RlYWRzdHJhdGVneVJsZVNUUkFURUdZX1JMRVVzZSBzdHJhdGVneVJsZSBpbnN0ZWFkc3RyYXRlZ3lGaXhlZFNUUkFURUdZX0ZJWEVEVXNlIHN0cmF0ZWd5Rml4ZWQgaW5zdGVhZHN0cmF0ZWd5RGVmYXVsdFNUUkFURUdZX0RFRkFVTFRVc2Ugc3RyYXRlZ3lEZWZhdWx0IGluc3RlYWRaTGliQ29kZWNfZGVmYXVsdFpMaWJFbmNvZGVyWkxpYkRlY29kZXJSYXdaTGliRmlsdGVyZGVmbGF0ZUZpbHRlcmluZmxhdGVGaWx0ZXJfbWFrZVpMaWJEZWZsYXRlRmlsdGVyX21ha2VaTGliSW5mbGF0ZUZpbHRlcl9CdWZmZXJTaW5rX1pMaWJFbmNvZGVyU2lua19aTGliRGVjb2RlclNpbmtfRmlsdGVyU2lua292ZXJyaWRlc2Zyb21SYXdQYXRoZ2V0Q3VycmVudERpcmVjdG9yeXNldEN1cnJlbnREaXJlY3RvcnlzeXN0ZW1UZW1wZ2V0U3lzdGVtVGVtcERpcmVjdG9yeXJlc29sdmVTeW1ib2xpY0xpbmtzcmVzb2x2ZVN5bWJvbGljTGlua3NTeW5jcmVuYW1lbmV3UGF0aHJlbmFtZVN5bmNhYnNvbHV0ZWZvbGxvd0xpbmtzX0RpcmVjdG9yeV9yYXdQYXRocmF3UGF0aHJhd1BhdGggY2Fubm90IGJlIG51bGxEaXJlY3RvcnlfQ3VycmVudF9zZXRDdXJyZW50RGlyZWN0b3J5X1NldEN1cnJlbnRfY3JlYXRlVGVtcERpcmVjdG9yeV9DcmVhdGVUZW1wX3N5c3RlbVRlbXBEaXJlY3RvcnlfU3lzdGVtVGVtcF9leGlzdHNEaXJlY3RvcnlfRXhpc3RzRGlyZWN0b3J5X0NyZWF0ZV9kZWxldGVOYXRpdmVEaXJlY3RvcnlfRGVsZXRlX3JlbmFtZURpcmVjdG9yeV9SZW5hbWVfZmlsbFdpdGhEaXJlY3RvcnlMaXN0aW5nRGlyZWN0b3J5X0ZpbGxXaXRoRGlyZWN0b3J5TGlzdGluZ0dldHRpbmcgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmYWlsZWQgaXMgbm90IGEgU3RyaW5nIG9yIERpcmVjdG9yeVRoaXMgZW1iZWRkZXIgZGlzYWxsb3dzIHNldHRpbmcgRGlyZWN0b3J5LmN1cnJlbnRTZXR0aW5nIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZmFpbGVkX2lzRXJyb3JSZXNwb25zZV9leGNlcHRpb25PckVycm9yRnJvbVJlc3BvbnNlRXhpc3RzIGZhaWxlZF9hYnNvbHV0ZVBhdGhDcmVhdGlvbiBmYWlsZWREaXJlY3RvcnkuY3JlYXRlVGVtcCBjYWxsZWQgd2l0aCBhbiBlbXB0eSBwYXRoLiBUbyB1c2UgdGhlIHN5c3RlbSB0ZW1wIGRpcmVjdG9yeSwgdXNlIERpcmVjdG9yeS5zeXN0ZW1UZW1wZnVsbFByZWZpeENyZWF0aW9uIG9mIHRlbXBvcmFyeSBkaXJlY3RvcnkgZmFpbGVkX2RlbGV0ZURlbGV0aW9uIGZhaWxlZF9kZWxldGVTeW5jUmVuYW1lIGZhaWxlZERpcmVjdG9yeTogJ2Vycl9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wc19Bc3luY0RpcmVjdG9yeUxpc3Rlcmxpc3RGaWxlbGlzdERpcmVjdG9yeWxpc3RMaW5rbGlzdEVycm9ybGlzdERvbmVyZXNwb25zZVR5cGVyZXNwb25zZVBhdGhyZXNwb25zZUNvbXBsZXRlcmVzcG9uc2VFcnJvcmNhbmNlbGVkbmV4dFJ1bm5pbmdfb3BzX2NsZWFudXBlcnJvclR5cGVyZXNwb25zZUVycm9ySW5mb2Vycm9yUGF0aERpcmVjdG9yeSBsaXN0aW5nIGZhaWxlZF9FbWJlZGRlckNvbmZpZ19tYXlDaGRpcl9tYXlFeGl0X21heVNldEVjaG9Nb2RlX21heVNldExpbmVNb2RlX21heVNsZWVwX0V2ZW50SGFuZGxlcl90aW1lck1pbGxpc2Vjb25kQ2xvY2tFdmVudEhhbmRsZXJfVGltZXJNaWxsaXNlY29uZENsb2NrRXZlbnRIYW5kbGVyX1NlbmREYXRhc2VuZGVyUkVBRFVzZSByZWFkIGluc3RlYWRXUklURVVzZSB3cml0ZSBpbnN0ZWFkQVBQRU5EVXNlIGFwcGVuZCBpbnN0ZWFkd3JpdGVPbmx5V1JJVEVfT05MWVVzZSB3cml0ZU9ubHkgaW5zdGVhZHdyaXRlT25seUFwcGVuZFdSSVRFX09OTFlfQVBQRU5EVXNlIHdyaXRlT25seUFwcGVuZCBpbnN0ZWFkRmlsZUxvY2tTSEFSRURVc2Ugc2hhcmVkIGluc3RlYWRleGNsdXNpdmVFWENMVVNJVkVVc2UgZXhjbHVzaXZlIGluc3RlYWRibG9ja2luZ1NoYXJlZEJMT0NLSU5HX1NIQVJFRFVzZSBibG9ja2luZ1NoYXJlZCBpbnN0ZWFkYmxvY2tpbmdFeGNsdXNpdmVCTE9DS0lOR19FWENMVVNJVkVVc2UgYmxvY2tpbmdFeGNsdXNpdmUgaW5zdGVhZGNyZWF0ZUZpbGVjb3B5U3luY2xhc3RBY2Nlc3NlZGxhc3RBY2Nlc3NlZFN5bmNzZXRMYXN0QWNjZXNzZWRzZXRMYXN0QWNjZXNzZWRTeW5jbGFzdE1vZGlmaWVkbGFzdE1vZGlmaWVkU3luY3NldExhc3RNb2RpZmllZHNldExhc3RNb2RpZmllZFN5bmNvcGVuUmVhZHJlYWRBc0xpbmVzcmVhZEFzTGluZXNTeW5jd3JpdGVBc1N0cmluZ1JhbmRvbUFjY2Vzc0ZpbGVyZWFkQnl0ZVN5bmN3cml0ZUJ5dGVTeW5jcG9zaXRpb25TeW5jc2V0UG9zaXRpb25TeW5jdHJ1bmNhdGVTeW5jZmx1c2hTeW5jbG9ja1N5bmN1bmxvY2t1bmxvY2tTeW5jLCBwYXRoID0gJ19GaWxlU3RyZWFtX29wZW5lZEZpbGVfY2xvc2VDb21wbGV0ZXJfdW5zdWJzY3JpYmVkX3JlYWRJblByb2dyZXNzX2F0RW5kZm9yU3RkaW5fc2V0dXBDb250cm9sbGVyX3JlYWRCbG9ja19jbG9zZUZpbGVCYWQgZW5kIHBvc2l0aW9uOiBCYWQgc3RhcnQgcG9zaXRpb246IG9uUmVhZHlvbk9wZW5GaWxlb3BlbkZhaWxlZF9GaWxlU3RyZWFtQ29uc3VtZXJfZmlsZV9vcGVuRnV0dXJlZnJvbVN0ZGlvb3BlbmVkRmlsZV9GaWxlX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZUNhbm5vdCBjaGVjayBleGlzdGVuY2VGaWxlX0V4aXN0c0Nhbm5vdCBjaGVjayBleGlzdGVuY2Ugb2YgZmlsZUNhbm5vdCBjcmVhdGUgZmlsZUZpbGVfQ3JlYXRlX2NyZWF0ZUxpbmtGaWxlX0NyZWF0ZUxpbmtfbGlua1RhcmdldEZpbGVfTGlua1RhcmdldENhbm5vdCBkZWxldGUgZmlsZUZpbGVfRGVsZXRlX2RlbGV0ZUxpbmtOYXRpdmVGaWxlX0RlbGV0ZUxpbmtDYW5ub3QgcmVuYW1lIGZpbGUgdG8gJ0ZpbGVfUmVuYW1lb2xkUGF0aF9yZW5hbWVMaW5rRmlsZV9SZW5hbWVMaW5rQ2Fubm90IGNvcHkgZmlsZSB0byAnX2NvcHlGaWxlX0NvcHlJbnZhbGlkIGZpbGUgbW9kZSBmb3IgdGhpcyBvcGVyYXRpb25DYW5ub3Qgb3BlbiBmaWxlQ2Fubm90IHJldHJpZXZlIGxlbmd0aCBvZiBmaWxlX2xlbmd0aEZyb21QYXRoRmlsZV9MZW5ndGhGcm9tUGF0aENhbm5vdCByZXRyaWV2ZSBhY2Nlc3MgdGltZV9sYXN0QWNjZXNzZWRGaWxlX0xhc3RBY2Nlc3NlZG1pbGxpc0Nhbm5vdCBzZXQgYWNjZXNzIHRpbWVfc2V0TGFzdEFjY2Vzc2VkRmlsZV9TZXRMYXN0QWNjZXNzZWRGYWlsZWQgdG8gc2V0IGZpbGUgYWNjZXNzIHRpbWVDYW5ub3QgcmV0cmlldmUgbW9kaWZpY2F0aW9uIHRpbWVfbGFzdE1vZGlmaWVkRmlsZV9MYXN0TW9kaWZpZWRDYW5ub3Qgc2V0IG1vZGlmaWNhdGlvbiB0aW1lX3NldExhc3RNb2RpZmllZEZpbGVfU2V0TGFzdE1vZGlmaWVkRmFpbGVkIHRvIHNldCBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lRmlsZV9PcGVuX29wZW5TdGRpb0ZpbGVfT3BlblN0ZGlvX29wZW5TdGRpb1N5bmNDYW5ub3Qgb3BlbiBzdGRpbyBmaWxlIGZvcjogY29uc3VtZXJyZWFkRGF0YUNodW5rZWRfdHJ5RGVjb2RlRmFpbGVkIHRvIGRlY29kZSBkYXRhIHVzaW5nIGVuY29kaW5nICdGaWxlOiAndGhyb3dJZkVycm9yX1JhbmRvbUFjY2Vzc0ZpbGVPcHNfUmFuZG9tQWNjZXNzRmlsZV9jb25uZWN0ZWRSZXNvdXJjZUhhbmRsZXJfYXN5bmNEaXNwYXRjaGVkX2ZpbGVTZXJ2aWNlbG9ja1VubG9ja19tYXliZUNvbm5lY3RIYW5kbGVyX21heWJlUGVyZm9ybUNsZWFudXBleHQuZGFydC5pby5nZXRPcGVuRmlsZXNleHQuZGFydC5pby5nZXRGaWxlQnlJRF9kaXNwYXRjaG1hcmtDbG9zZWRDYW5ub3QgY2xvc2UgZmlsZXJlYWRCeXRlIGZhaWxlZHJlYWQgZmFpbGVkcmVhZFN5bmMgZmFpbGVkcmVhZEludG8gZmFpbGVkd3JpdGVCeXRlIGZhaWxlZEludmFsaWQgYXJndW1lbnRzIHRvIHdyaXRlRnJvbXdyaXRlRnJvbSBmYWlsZWRwb3NpdGlvbiBmYWlsZWRzZXRQb3NpdGlvbiBmYWlsZWR0cnVuY2F0ZSBmYWlsZWRsZW5ndGggZmFpbGVkZmx1c2ggZmFpbGVkX2ZpbGVMb2NrVmFsdWVmbGxvY2sgZmFpbGVkdW5sb2NrIGZhaWxlZEZpbGUgY2xvc2VkQW4gYXN5bmMgb3BlcmF0aW9uIGlzIGN1cnJlbnRseSBwZW5kaW5nRmlsZVN5c3RlbUVudGl0eVR5cGVGSUxFVXNlIGZpbGUgaW5zdGVhZGRpcmVjdG9yeURJUkVDVE9SWVVzZSBkaXJlY3RvcnkgaW5zdGVhZExJTktVc2UgbGluayBpbnN0ZWFkX3R5cGVMaXN0X2xvb2t1cEZpbGVTdGF0X2NoYW5nZWRUaW1lX21vZGlmaWVkVGltZV9hY2Nlc3NlZFRpbWVfbm90Rm91bmRhY2Nlc3NlZF9pbnRlcm5hbE5vdEZvdW5kX3N0YXRTeW5jRmlsZV9TdGF0c3RhdFN5bmNfc3RhdFN5bmNJbnRlcm5hbF9zdGF0RmlsZVN0YXQ6IHR5cGUgCiAgICAgICAgICBjaGFuZ2VkIAogICAgICAgICAgbW9kaWZpZWQgCiAgICAgICAgICBhY2Nlc3NlZCAKICAgICAgICAgIG1vZGUgbW9kZVN0cmluZwogICAgICAgICAgc2l6ZSBwZXJtaXNzaW9ucy0teC13LS13eHItLXIteHJ3LXJ3eChzdWlkKSAoZ3VpZCkgKHN0aWNreSkgX2Fic29sdXRlV2luZG93c1BhdGhQYXR0ZXJuXihcXFxcfFthLXpBLVpdOlsvXFxdKV9wYXJlbnRSZWdFeHBbXi9cXF1bL1xcXStbXi9cXF1bXi9dLytbXi9dQ2Fubm90IHJlc29sdmUgc3ltYm9saWMgbGlua3N0cmltbWVkUGF0aGZzV2F0Y2hfaWRlbnRpY2FscGF0aDFwYXRoMkVycm9yIGluIEZpbGVTeXN0ZW1FbnRpdHkuaWRlbnRpY2FsKGZzZUlkZW50aWNhbF9yYXdBYnNvbHV0ZVBhdGhfaWRlbnRpY2FsU3luY0Vycm9yIGluIEZpbGVTeXN0ZW1FbnRpdHkuaWRlbnRpY2FsU3luY2lkZW50aWNhbFN5bmNmc2VJZGVudGljYWxTeW5jaXNXYXRjaFN1cHBvcnRlZGZzV2F0Y2hJc1N1cHBvcnRlZF90b1V0ZjhBcnJheV90b051bGxUZXJtaW5hdGVkVXRmOEFycmF5X3RvU3RyaW5nRnJvbVV0ZjhBcnJheW5vbk51bGxUZXJtaW5hdGVkdHlwZVN5bmNpc0xpbmtfaXNMaW5rUmF3aXNGaWxlaXNMaW5rU3luY19pc0xpbmtSYXdTeW5jaXNGaWxlU3luY2lzRGlyZWN0b3J5U3luY19nZXRUeXBlTmF0aXZlRmlsZV9HZXRUeXBlX2lkZW50aWNhbE5hdGl2ZUZpbGVfQXJlSWRlbnRpY2FsX3Jlc29sdmVTeW1ib2xpY0xpbmtzRmlsZV9SZXNvbHZlU3ltYm9saWNMaW5rc3BhcmVudE9mcm9vdEVuZFsvXFxdX2dldFR5cGVTeW5jSGVscGVyRXJyb3IgZ2V0dGluZyB0eXBlIG9mIEZpbGVTeXN0ZW1FbnRpdHlfZ2V0VHlwZVN5bmNmc2VHZXRUeXBlU3luY19nZXRUeXBlUmVxdWVzdEVycm9yIGdldHRpbmcgdHlwZV9nZXRUeXBlZnNlR2V0VHlwZV90aHJvd0lmRXJyb3JfdHJpbVRyYWlsaW5nUGF0aFNlcGFyYXRvcnNfZW5zdXJlVHJhaWxpbmdQYXRoU2VwYXJhdG9yc0ZpbGVTeXN0ZW1FdmVudENSRUFURVVzZSBjcmVhdGUgaW5zdGVhZG1vZGlmeU1PRElGWVVzZSBtb2RpZnkgaW5zdGVhZERFTEVURVVzZSBkZWxldGUgaW5zdGVhZG1vdmVNT1ZFVXNlIG1vdmUgaW5zdGVhZFVzZSBhbGwgaW5zdGVhZF9tb2RpZnlBdHRyaWJ1dGVzX2RlbGV0ZVNlbGZfaXNEaXJGaWxlU3lzdGVtQ3JlYXRlRXZlbnRGaWxlU3lzdGVtQ3JlYXRlRXZlbnQoJ0ZpbGVTeXN0ZW1Nb2RpZnlFdmVudGNvbnRlbnRDaGFuZ2VkRmlsZVN5c3RlbU1vZGlmeUV2ZW50KCcnLCBjb250ZW50Q2hhbmdlZD1GaWxlU3lzdGVtRGVsZXRlRXZlbnRGaWxlU3lzdGVtRGVsZXRlRXZlbnQoJ0ZpbGVTeXN0ZW1Nb3ZlRXZlbnRGaWxlU3lzdGVtTW92ZUV2ZW50KCcsICdfRmlsZVN5c3RlbVdhdGNoZXJfcmVjdXJzaXZlX2Jyb2FkY2FzdENvbnRyb2xsZXJGaWxlIHN5c3RlbSB3YXRjaGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm1GYWlsZWQgdG8gaW5pdGlhbGl6ZSBmaWxlIHN5c3RlbSBlbnRpdHkgd2F0Y2hlckZhaWxlZCB0byB3YXRjaCBwYXRoX2RvbmVQYXRoV2F0Y2hlZF9wYXRoRnJvbVBhdGhJZF9saXN0ZW5PblNvY2tldHN0b3BzZ2V0UGF0aGdldElzRGlycmV3cml0ZU1vdmVpc0Rpcl9pbml0V2F0Y2hlckZpbGVTeXN0ZW1XYXRjaGVyX0luaXRXYXRjaGVyX2Nsb3NlV2F0Y2hlckZpbGVTeXN0ZW1XYXRjaGVyX0Nsb3NlV2F0Y2hlcl93YXRjaFBhdGhGaWxlU3lzdGVtV2F0Y2hlcl9XYXRjaFBhdGhfdW53YXRjaFBhdGhGaWxlU3lzdGVtV2F0Y2hlcl9VbndhdGNoUGF0aHBhdGhfaWRfcmVhZEV2ZW50c0ZpbGVTeXN0ZW1XYXRjaGVyX1JlYWRFdmVudHNfZ2V0U29ja2V0SWRGaWxlU3lzdGVtV2F0Y2hlcl9HZXRTb2NrZXRJZEZpbGVTeXN0ZW1XYXRjaGVyX0lzU3VwcG9ydGVkX0lPUmVzb3VyY2VJbmZvX3N3X3N0YXJ0VGltZWVsYXBzZWRNaWNyb3NlY29uZHNmdWxsVmFsdWVNYXByZWZlcmVuY2VWYWx1ZU1hcGdldE5leHRJRF9SZWFkV3JpdGVSZXNvdXJjZUluZm90b3RhbFdyaXR0ZW5yZWFkQ291bnR3cml0ZUNvdW50bGFzdFJlYWRsYXN0V3JpdGVfRmlsZVJlc291cmNlSW5mb29wZW5GaWxlc0ZpbGVPcGVuZWRGaWxlQ2xvc2VkZ2V0T3BlbkZpbGVzTGlzdGdldE9wZW5GaWxlc19vcGVuZmlsZXNqc29uVmFsdWVnZXRGaWxlSW5mb01hcGdldEZpbGVJbmZvTWFwQnlJRF9Qcm9jZXNzUmVzb3VyY2VJbmZvc3RhcnRlZEF0c3RhcnRlZFByb2Nlc3Nlc1Byb2Nlc3NTdGFydGVkUHJvY2Vzc1N0b3BwZWRnZXRTdGFydGVkUHJvY2Vzc2VzTGlzdGdldFN0YXJ0ZWRQcm9jZXNzZXNfc3RhcnRlZHByb2Nlc3Nlc2dldFByb2Nlc3NJbmZvTWFwQnlJZF9Tb2NrZXRSZXNvdXJjZUluZm9fdGNwU3RyaW5nVENQX3VkcFN0cmluZ1VEUG9wZW5Tb2NrZXRzbGlzdGVuaW5nOnJlbW90ZXJlbW90ZUhvc3RnZXRPcGVuU29ja2V0c0xpc3RnZXRTb2NrZXRJbmZvTWFwbGlzdGVuaW5nTkFhZGRyZXNzVHlwZWdldFNvY2tldEluZm9NYXBCeUlEZ2V0T3BlblNvY2tldHNfb3BlbnNvY2tldHNTb2NrZXRPcGVuZWRTb2NrZXRDbG9zZWRfU3RyZWFtU2lua0ltcGxfZG9uZUNvbXBsZXRlcl9jb250cm9sbGVySW5zdGFuY2VfY29udHJvbGxlckNvbXBsZXRlcl9pc0JvdW5kU3RyZWFtU2luayBpcyBjbG9zZWRTdHJlYW1TaW5rIGlzIGFscmVhZHkgYm91bmQgdG8gYSBzdHJlYW1TdHJlYW1TaW5rIGlzIGJvdW5kIHRvIGEgc3RyZWFtX2Nsb3NlVGFyZ2V0X2NvbXBsZXRlRG9uZVZhbHVlX2NvbXBsZXRlRG9uZUVycm9yX0lPU2lua0ltcGxfZW5jb2RpbmdfZW5jb2RpbmdNdXRhYmxlSU9TaW5rIGVuY29kaW5nIGlzIG5vdCBtdXRhYmxlX0lPU2VydmljZV9zZXJ2aWNlUG9ydHNfcmVwbHlUb1BvcnRfbWVzc2FnZU1hcGZpbGVFeGlzdHNmaWxlQ3JlYXRlZmlsZURlbGV0ZWZpbGVSZW5hbWVmaWxlQ29weWZpbGVPcGVuZmlsZVJlc29sdmVTeW1ib2xpY0xpbmtzZmlsZUNsb3NlZmlsZVBvc2l0aW9uZmlsZVNldFBvc2l0aW9uZmlsZVRydW5jYXRlZmlsZUxlbmd0aEZyb21QYXRoZmlsZUxhc3RBY2Nlc3NlZGZpbGVTZXRMYXN0QWNjZXNzZWRmaWxlTGFzdE1vZGlmaWVkZmlsZVNldExhc3RNb2RpZmllZGZpbGVGbHVzaGZpbGVSZWFkQnl0ZWZpbGVXcml0ZUJ5dGVmaWxlUmVhZGZpbGVSZWFkSW50b2ZpbGVXcml0ZUZyb21maWxlQ3JlYXRlTGlua2ZpbGVEZWxldGVMaW5rZmlsZVJlbmFtZUxpbmtmaWxlTGlua1RhcmdldGZpbGVUeXBlZmlsZUlkZW50aWNhbGZpbGVTdGF0ZmlsZUxvY2tzb2NrZXRMb29rdXBzb2NrZXRMaXN0SW50ZXJmYWNlc3NvY2tldFJldmVyc2VMb29rdXBkaXJlY3RvcnlDcmVhdGVkaXJlY3RvcnlEZWxldGVkaXJlY3RvcnlFeGlzdHNkaXJlY3RvcnlDcmVhdGVUZW1wZGlyZWN0b3J5TGlzdFN0YXJ0ZGlyZWN0b3J5TGlzdE5leHRkaXJlY3RvcnlMaXN0U3RvcGRpcmVjdG9yeVJlbmFtZXNzbFByb2Nlc3NGaWx0ZXJfZW5zdXJlSW5pdGlhbGl6ZV9maW5hbGl6ZV9nZXROZXh0SWRzZXJ2aWNlUG9ydGNyZWF0ZUxpbmt1cGRhdGVTeW5jdGFyZ2V0U3luY19MaW5rTGluazogJ19leGNlcHRpb25Gcm9tUmVzcG9uc2VDYW5ub3QgY3JlYXRlIGxpbmsgdG8gdGFyZ2V0ICdDYW5ub3QgY3JlYXRlIGxpbmtDYW5ub3QgZGVsZXRlIGxpbmtDYW5ub3QgcmVuYW1lIGxpbmsgdG8gJ0Nhbm5vdCByZW5hbWUgbGluayAnQ2Fubm90IGdldCB0YXJnZXQgb2YgbGlua0Nhbm5vdCByZWFkIGxpbmtfTmFtZXNwYWNlSU9PdmVycmlkZXNfZ2xvYmFsc29ja2V0Q29ubmVjdHNvY2tldFN0YXJ0Q29ubmVjdHJ1bldpdGhJT092ZXJyaWRlc19JT092ZXJyaWRlc1Njb3BlX2NyZWF0ZURpcmVjdG9yeV9nZXRDdXJyZW50RGlyZWN0b3J5X3NldEN1cnJlbnREaXJlY3RvcnlfZ2V0U3lzdGVtVGVtcERpcmVjdG9yeV9jcmVhdGVGaWxlX2ZzZUlkZW50aWNhbF9mc2VJZGVudGljYWxTeW5jX2ZzZUdldFR5cGVfZnNlR2V0VHlwZVN5bmNfZnNXYXRjaF9mc1dhdGNoSXNTdXBwb3J0ZWRfc29ja2V0Q29ubmVjdF9zb2NrZXRTdGFydENvbm5lY3RfbnVtYmVyT2ZQcm9jZXNzb3JzX3BhdGhTZXBhcmF0b3Jfb3BlcmF0aW5nU3lzdGVtX29wZXJhdGluZ1N5c3RlbVZlcnNpb25fbG9jYWxIb3N0bmFtZV92ZXJzaW9uaXNMaW51eGxpbnV4aXNNYWNPU21hY29zaXNBbmRyb2lkYW5kcm9pZGlzSU9TaW9zaXNGdWNoc2lhZnVjaHNpYW51bWJlck9mUHJvY2Vzc29yc2xvY2FsZU5hbWVvcGVyYXRpbmdTeXN0ZW1vcGVyYXRpbmdTeXN0ZW1WZXJzaW9ubG9jYWxIb3N0bmFtZXJlc29sdmVkRXhlY3V0YWJsZWV4ZWN1dGFibGVBcmd1bWVudHNwYWNrYWdlcy8gZGlyZWN0b3J5IHJlc29sdXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBEYXJ0IDJfUGxhdGZvcm1fbG9jYWxlQ2xvc3VyZV9lbnZpcm9ubWVudENhY2hlX2NhY2hlZE9TVmVyc2lvbl9uYXRpdmVTY3JpcHRkYXRhOlBsYXRmb3JtX051bWJlck9mUHJvY2Vzc29yc1BsYXRmb3JtX1BhdGhTZXBhcmF0b3JQbGF0Zm9ybV9PcGVyYXRpbmdTeXN0ZW1QbGF0Zm9ybV9PcGVyYXRpbmdTeXN0ZW1WZXJzaW9uUGxhdGZvcm1fTG9jYWxIb3N0bmFtZV9leGVjdXRhYmxlUGxhdGZvcm1fRXhlY3V0YWJsZU5hbWVfcmVzb2x2ZWRFeGVjdXRhYmxlUGxhdGZvcm1fUmVzb2x2ZWRFeGVjdXRhYmxlTmFtZVBsYXRmb3JtX0Vudmlyb25tZW50X2V4ZWN1dGFibGVBcmd1bWVudHNQbGF0Zm9ybV9FeGVjdXRhYmxlQXJndW1lbnRzUGxhdGZvcm1fR2V0VmVyc2lvbl9sb2NhbGVOYW1lUGxhdGZvcm1fTG9jYWxlTmFtZV9zY3JpcHRlcXVhbHNJbmRleF9DYXNlSW5zZW5zaXRpdmVTdHJpbmdNYXBfUHJvY2Vzc1V0aWxzX2tpbGxQaWRQcm9jZXNzX0tpbGxQaWRfd2F0Y2hTaWduYWxJbnRlcm5hbFByb2Nlc3NfRXhpdF9zZXRFeGl0Q29kZVByb2Nlc3NfU2V0RXhpdENvZGVfZ2V0RXhpdENvZGVQcm9jZXNzX0dldEV4aXRDb2RlX3NsZWVwUHJvY2Vzc19TbGVlcF9waWRQcm9jZXNzX1BpZF93YXRjaFNpZ25hbFNJR0hVUFNJR0lOVFNJR1VTUjFTSUdVU1IyU0lHV0lOQ0hMaXN0ZW5pbmcgZm9yIHNpZ25hbCAgaXMgbm90IHN1cHBvcnRlZFByb2Nlc3NJbmZvX21heFJzc1Byb2Nlc3NJbmZvX01heFJTU19jdXJyZW50UnNzUHJvY2Vzc0luZm9fQ3VycmVudFJTU2N1cnJlbnRSc3NtYXhSc3NQcm9jZXNzU3RhcnRNb2RlVXNlIG5vcm1hbCBpbnN0ZWFkaW5oZXJpdFN0ZGlvSU5IRVJJVF9TVERJT1VzZSBpbmhlcml0U3RkaW8gaW5zdGVhZGRldGFjaGVkREVUQUNIRURVc2UgZGV0YWNoZWQgaW5zdGVhZGRldGFjaGVkV2l0aFN0ZGlvREVUQUNIRURfV0lUSF9TVERJT1VzZSBkZXRhY2hlZFdpdGhTdGRpbyBpbnN0ZWFkcnVuU3luY2tpbGxQaWRQcm9jZXNzU2lnbmFsc2lnaHVwc2lnaW50c2lncXVpdHNpZ2lsbFNJR0lMTHNpZ3RyYXBTSUdUUkFQc2lnYWJydFNJR0FCUlRzaWdidXNTSUdCVVNzaWdmcGVTSUdGUEVzaWdraWxsU0lHS0lMTHNpZ3VzcjFzaWdzZWd2U0lHU0VHVnNpZ3VzcjJzaWdwaXBlU0lHUElQRXNpZ2Fscm1TSUdBTFJNc2lndGVybXNpZ2NobGRTSUdDSExEc2lnY29udFNJR0NPTlRzaWdzdG9wU0lHU1RPUHNpZ3RzdHBTSUdUU1RQc2lndHRpblNJR1RUSU5zaWd0dG91U0lHVFRPVXNpZ3VyZ1NJR1VSR3NpZ3hjcHVTSUdYQ1BVc2lneGZzelNJR1hGU1pzaWd2dGFscm1TSUdWVEFMUk1zaWdwcm9mU0lHUFJPRnNpZ3dpbmNoc2lncG9sbFNJR1BPTExzaWdzeXNTSUdTWVNVc2Ugc2lnaHVwIGluc3RlYWRVc2Ugc2lnaW50IGluc3RlYWRVc2Ugc2lncXVpdCBpbnN0ZWFkVXNlIHNpZ2lsbCBpbnN0ZWFkVXNlIHNpZ3RyYXAgaW5zdGVhZFVzZSBzaWdhYnJ0IGluc3RlYWRVc2Ugc2lnYnVzIGluc3RlYWRVc2Ugc2lnZnBlIGluc3RlYWRVc2Ugc2lna2lsbCBpbnN0ZWFkVXNlIHNpZ3VzcjEgaW5zdGVhZFVzZSBzaWdzZWd2IGluc3RlYWRVc2Ugc2lndXNyMiBpbnN0ZWFkVXNlIHNpZ3BpcGUgaW5zdGVhZFVzZSBzaWdhbHJtIGluc3RlYWRVc2Ugc2lndGVybSBpbnN0ZWFkVXNlIHNpZ2NobGQgaW5zdGVhZFVzZSBzaWdjb250IGluc3RlYWRVc2Ugc2lnc3RvcCBpbnN0ZWFkVXNlIHNpZ3RzdHAgaW5zdGVhZFVzZSBzaWd0dGluIGluc3RlYWRVc2Ugc2lndHRvdSBpbnN0ZWFkVXNlIHNpZ3VyZyBpbnN0ZWFkVXNlIHNpZ3hjcHUgaW5zdGVhZFVzZSBzaWd4ZnN6IGluc3RlYWRVc2Ugc2lndnRhbHJtIGluc3RlYWRVc2Ugc2lncHJvZiBpbnN0ZWFkVXNlIHNpZ3dpbmNoIGluc3RlYWRVc2Ugc2lncG9sbCBpbnN0ZWFkVXNlIHNpZ3N5cyBpbnN0ZWFkU2lnbmFsRXhjZXB0aW9uLCBvc0Vycm9yOiBTaWduYWxFeGNlcHRpb246IFByb2Nlc3NFeGNlcHRpb25PUyBlcnJvciBjb2RlOiBQcm9jZXNzRXhjZXB0aW9uOiAKICBDb21tYW5kOiBTZWN1cmVTZXJ2ZXJTb2NrZXRzdXBwb3J0ZWRQcm90b2NvbHNzZXJ2ZXJTb2NrZXRSYXdTZWN1cmVTZXJ2ZXJTb2NrZXRfY29udGV4dGNvbm5lY3Rpb25zZWN1cmVDb25uZWN0aW9uU2VjdXJlU29ja2V0b25CYWRDZXJ0aWZpY2F0ZXJhd1N0YXRlZGV0YWNoZWRSYXdzZWN1cmVTZXJ2ZXJidWZmZXJlZERhdGFSYXdTZWN1cmVTb2NrZXRYNTA5Q2VydGlmaWNhdGVfRmlsdGVyU3RhdHVzcmVhZEVtcHR5d3JpdGVFbXB0eXJlYWRQbGFpbnRleHROb0xvbmdlckVtcHR5d3JpdGVQbGFpbnRleHROb0xvbmdlckZ1bGxyZWFkRW5jcnlwdGVkTm9Mb25nZXJGdWxsd3JpdGVFbmNyeXB0ZWROb0xvbmdlckVtcHR5X1Jhd1NlY3VyZVNvY2tldGhhbmRzaGFrZVN0YXR1c2Nvbm5lY3RlZFN0YXR1c2Nsb3NlZFN0YXR1c3JlYWRQbGFpbnRleHRJZHdyaXRlUGxhaW50ZXh0SWRyZWFkRW5jcnlwdGVkSWR3cml0ZUVuY3J5cHRlZElkYnVmZmVyQ291bnRfaGFuZHNoYWtlQ29tcGxldGVfc29ja2V0U3Vic2NyaXB0aW9uX2J1ZmZlcmVkRGF0YV9idWZmZXJlZERhdGFJbmRleF9zdGF0dXNfcGF1c2VDb3VudF9wZW5kaW5nUmVhZEV2ZW50X3NvY2tldENsb3NlZFJlYWRfc29ja2V0Q2xvc2VkV3JpdGVfY2xvc2VkUmVhZF9jbG9zZWRXcml0ZV9maWx0ZXJTdGF0dXNfY29ubmVjdFBlbmRpbmdfZmlsdGVyUGVuZGluZ19maWx0ZXJBY3RpdmVfc2VjdXJlRmlsdGVyX3NlbGVjdGVkUHJvdG9jb2xyZXF1ZXN0ZWRQb3J0X3NlY3VyZUhhbmRzaGFrZUNvbXBsZXRlSGFuZGxlcl9vbkJhZENlcnRpZmljYXRlV3JhcHBlcl9ldmVudERpc3BhdGNoZXJfZG9uZUhhbmRsZXJTdWJzY3JpcHRpb24gcGFzc2VkIHRvIFRMUyB1cGdyYWRlIGlzIHBhdXNlZF9zZWN1cmVIYW5kc2hha2VfaXNCdWZmZXJFbmNyeXB0ZWRfc2VuZFdyaXRlRXZlbnRfdmVyaWZ5RmllbGRzaG9zdCBpcyBub3QgYSBTdHJpbmcgb3IgYW4gSW50ZXJuZXRBZGRyZXNzcmVxdWVzdGVkUG9ydCBpcyBub3QgaW4gdGhlIHJhbmdlIDAuLjY1NTM1X2NvbXBsZXRlQ2xvc2VDb21wbGV0ZXJfc2NoZWR1bGVSZWFkRXZlbnRJbnZhbGlkIGxlbmd0aCBwYXJhbWV0ZXIgaW4gU2VjdXJlU29ja2V0LnJlYWQgKGxlbmd0aDogUmVhZGluZyBmcm9tIGEgY2xvc2VkIHNvY2tldF9zY2hlZHVsZUZpbHRlckludmFsaWQgYnl0ZXMgcGFyYW1ldGVyIGluIFNlY3VyZVNvY2tldC5yZWFkIChieXRlczogSW52YWxpZCBvZmZzZXQgcGFyYW1ldGVyIGluIFNlY3VyZVNvY2tldC5yZWFkIChvZmZzZXQ6IFdyaXRpbmcgdG8gYSBjbG9zZWQgc29ja2V0d3JpdHRlbmNlcnRpZmljYXRlb25CYWRDZXJ0aWZpY2F0ZSBjYWxsYmFjayByZXR1cm5lZCBub24tYm9vbGVhbiBfcmVhZEhhbmRsZXJfd3JpdGVIYW5kbGVyX2Nsb3NlSGFuZGxlcl9yZWFkU29ja2V0X3dyaXRlU29ja2V0Q29ubmVjdGlvbiB0ZXJtaW5hdGVkIGR1cmluZyBoYW5kc2hha2VDYWxsZWQgcmVuZWdvdGlhdGUgb24gYSBub24tY29ubmVjdGVkIHNvY2tldF90cnlGaWx0ZXJfcHVzaEFsbEZpbHRlclN0YWdlc19yZWFkU29ja2V0T3JCdWZmZXJlZERhdGF3cml0ZUZyb21Tb3VyY2VyZWFkVG9Tb2NrZXRfc2VuZFJlYWRFdmVudHdhc0luSGFuZHNoYWtlYnVmcyBlcnJvciBuZXdfc3RhcnRuZXdfZW5kX0V4dGVybmFsQnVmZmVyYWR2YW5jZVN0YXJ0YWR2YW5jZUVuZGxpbmVhckxlbmd0aGxpbmVhckZyZWVieXRlc1JlYWR0b1JlYWRpbnB1dERhdGF0b1dyaXRlX1NlY3VyZUZpbHRlclRsc0V4Y2VwdGlvbkhhbmRzaGFrZUV4Y2VwdGlvbkNlcnRpZmljYXRlRXhjZXB0aW9uU2VjdXJpdHlDb250ZXh0YWxwblN1cHBvcnRlZF9wcm90b2NvbHNUb0xlbmd0aEVuY29kaW5ncHJvdG9jb2xzTGVuZ3RoZXhwZWN0ZWRMZW5ndGhMZW5ndGggb2YgcHJvdG9jb2wgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSAod2FzOiBUaGUgbWF4aW11bSBtZXNzYWdlIGxlbmd0aCBzdXBwb3J0ZWQgaXMgMl4xMy0xLmJ5dGVzT2Zmc2V0X3Byb3RvY29sc1RvTGVuZ3RoRW5jb2RpbmdOb25Bc2NpaUJhaWxvdXRhZGRQcm90b2NvbG91dEJ5dGVzcHJvdG9jb2xCeXRlc19TZXJ2aWNlT2JqZWN0SW50ZXJuZXRBZGRyZXNzVHlwZUlQdjRJUHY2SVBfVjRVc2UgSVB2NCBpbnN0ZWFkSVBfVjZVc2UgSVB2NiBpbnN0ZWFkQU5ZVXNlIGFueSBpbnN0ZWFkX2Zyb21JbnZhbGlkIHR5cGU6IEludmFsaWQgSW50ZXJuZXRBZGRyZXNzSW50ZXJuZXRBZGRyZXNzVHlwZTogSW50ZXJuZXRBZGRyZXNzTE9PUEJBQ0tfSVBfVjRVc2UgbG9vcGJhY2tJUHY0IGluc3RlYWRMT09QQkFDS19JUF9WNlVzZSBsb29wYmFja0lQdjYgaW5zdGVhZEFOWV9JUF9WNFVzZSBhbnlJUHY0IGluc3RlYWRBTllfSVBfVjZVc2UgYW55SVB2NiBpbnN0ZWFkTmV0d29ya0ludGVyZmFjZV9saXN0U3VwcG9ydGVkTmV0d29ya0ludGVyZmFjZV9MaXN0U3VwcG9ydGVkbGlzdFN1cHBvcnRlZFJhd1NlcnZlclNvY2tldFNlcnZlclNvY2tldFNvY2tldERpcmVjdGlvblJFQ0VJVkVVc2UgcmVjZWl2ZSBpbnN0ZWFkU0VORFVzZSBzZW5kIGluc3RlYWRVc2UgYm90aCBpbnN0ZWFkU29ja2V0T3B0aW9udGNwTm9EZWxheVRDUF9OT0RFTEFZVXNlIHRjcE5vRGVsYXkgaW5zdGVhZF9pcE11bHRpY2FzdExvb3BfaXBNdWx0aWNhc3RIb3BzX2lwTXVsdGljYXN0SWZfaXBCcm9hZGNhc3RfUmF3U29ja2V0T3B0aW9uc19SYXdTb2NrZXRPcHRpb25zLlNPTF9TT0NLRVRfUmF3U29ja2V0T3B0aW9ucy5JUFBST1RPX0lQX1Jhd1NvY2tldE9wdGlvbnMuSVBfTVVMVElDQVNUX0lGX1Jhd1NvY2tldE9wdGlvbnMuSVBQUk9UT19JUFY2X1Jhd1NvY2tldE9wdGlvbnMuSVBWNl9NVUxUSUNBU1RfSUZfUmF3U29ja2V0T3B0aW9ucy5JUFBST1RPX1RDUF9SYXdTb2NrZXRPcHRpb25zLklQUFJPVE9fVURQU09MX1NPQ0tFVElQUFJPVE9fSVBJUF9NVUxUSUNBU1RfSUZJUFBST1RPX0lQVjZJUFY2X01VTFRJQ0FTVF9JRklQUFJPVE9fVENQSVBQUk9UT19VRFBSYXdTb2NrZXRPcHRpb25fb3B0aW9uc0NhY2hlX2dldE5hdGl2ZU9wdGlvblZhbHVlUmF3U29ja2V0T3B0aW9uX0dldE9wdGlvblZhbHVlZnJvbUludGZyb21Cb29sbGV2ZWxTb2NrZXRsZXZlbElQdjRJUHY0TXVsdGljYXN0SW50ZXJmYWNlbGV2ZWxJUHY2SVB2Nk11bHRpY2FzdEludGVyZmFjZWxldmVsVGNwbGV2ZWxVZHBfZ2V0T3B0aW9uVmFsdWVSYXdTb2NrZXRFdmVudHJlYWRDbG9zZWRSRUFEX0NMT1NFRFVzZSByZWFkQ2xvc2VkIGluc3RlYWRDTE9TRURVc2UgY2xvc2VkIGluc3RlYWRSYXdTb2NrZXRFdmVudC5yZWFkUmF3U29ja2V0RXZlbnQud3JpdGVSYXdTb2NrZXRFdmVudC5yZWFkQ2xvc2VkUmF3U29ja2V0RXZlbnQuY2xvc2VkQ29ubmVjdGlvblRhc2tSYXdTb2NrZXRTb2NrZXRfY29ubmVjdF9zdGFydENvbm5lY3RyYXdUYXNrRGF0YWdyYW1SYXdEYXRhZ3JhbVNvY2tldFRoaXMgcHJvcGVydHkgaXMgbm90IGltcGxlbWVudGVkLiBVc2UgZ2V0UmF3T3B0aW9uIGFuZCBzZXRSYXdPcHRpb24gaW5zdGVhZC4sIGFkZHJlc3MgPSAsIHBvcnQgPSBfU3RkU3RyZWFtU3RkaW5fZmRfZWNob01vZGVTdGRpbl9HZXRFY2hvTW9kZV9zZXRFY2hvTW9kZVN0ZGluX1NldEVjaG9Nb2RlX2xpbmVNb2RlU3RkaW5fR2V0TGluZU1vZGVfc2V0TGluZU1vZGVTdGRpbl9TZXRMaW5lTW9kZVN0ZGluX1JlYWRCeXRlU3RkaW5fQW5zaVN1cHBvcnRlZHJlYWRMaW5lU3luY3JldGFpbk5ld2xpbmVzY3JJc05ld2xpbmV0ZXJtaW5hbGxpbmVNb2RlZWNob01vZGVFcnJvciBnZXR0aW5nIHRlcm1pbmFsIGVjaG8gbW9kZVRoaXMgZW1iZWRkZXIgZGlzYWxsb3dzIHNldHRpbmcgU3RkaW4uZWNob01vZGVFcnJvciBzZXR0aW5nIHRlcm1pbmFsIGVjaG8gbW9kZUVycm9yIGdldHRpbmcgdGVybWluYWwgbGluZSBtb2RlVGhpcyBlbWJlZGRlciBkaXNhbGxvd3Mgc2V0dGluZyBTdGRpbi5saW5lTW9kZUVycm9yIHNldHRpbmcgdGVybWluYWwgbGluZSBtb2RlRXJyb3IgZGV0ZXJtaW5pbmcgQU5TSSBzdXBwb3J0RXJyb3IgcmVhZGluZyBieXRlIGZyb20gc3RkaW5oYXNUZXJtaW5hbFN0ZG91dF9ub25CbG9ja2luZ190ZXJtaW5hbFNpemVDb3VsZCBub3QgZ2V0IHRlcm1pbmFsIHNpemVfZ2V0VGVybWluYWxTaXplU3Rkb3V0X0dldFRlcm1pbmFsU2l6ZV9nZXRBbnNpU3VwcG9ydGVkU3Rkb3V0X0Fuc2lTdXBwb3J0ZWRfaGFzVGVybWluYWx0ZXJtaW5hbENvbHVtbnNfdGVybWluYWxDb2x1bW5zdGVybWluYWxMaW5lc190ZXJtaW5hbExpbmVzU3Rkb3V0RXhjZXB0aW9uU3Rkb3V0RXhjZXB0aW9uOiBTdGRpbkV4Y2VwdGlvblN0ZGluRXhjZXB0aW9uOiBfU3RkQ29uc3VtZXJfU3RkU2lua1N0ZGlvVHlwZVRFUk1JTkFMVXNlIHRlcm1pbmFsIGluc3RlYWRQSVBFVXNlIHBpcGUgaW5zdGVhZFVzZSBvdGhlciBpbnN0ZWFkU3RkaW9UeXBlOiBfU3RkSU9VdGlsc19uYXRpdmVTb2NrZXRUeXBlRXJyb3IgcmV0cmlldmluZyBzb2NrZXQgdHlwZV9nZXRTdGRpb091dHB1dFN0cmVhbUNvdWxkbid0IGRldGVybWluZSBmaWxlIHR5cGUgb2Ygc3RkaW8gaGFuZGxlIChmZCBfZ2V0U3RkaW9JbnB1dFN0cmVhbUNvdWxkbid0IGRldGVybWluZSBmaWxlIHR5cGUgb2Ygc3RkaW4gKGZkIF9zb2NrZXRUeXBlX2dldFN0ZGlvSGFuZGxlVHlwZUZpbGVfR2V0U3RkaW9IYW5kbGVUeXBlU3lzdGVtRW5jb2RpbmdzeXN0ZW1fV2luZG93c0NvZGVQYWdlRW5jb2RlckludmFsaWQgY2hhcmFjdGVyIGZvciBlbmNvZGluZ19lbmNvZGVTdHJpbmdTdHJpbmdUb1N5c3RlbUVuY29kaW5nX1dpbmRvd3NDb2RlUGFnZUVuY29kZXJTaW5rX1dpbmRvd3NDb2RlUGFnZURlY29kZXJfZGVjb2RlQnl0ZXNTeXN0ZW1FbmNvZGluZ1RvU3RyaW5nX1dpbmRvd3NDb2RlUGFnZURlY29kZXJTaW5rUmF3U3luY2hyb25vdXNTb2NrZXRfc2lnbmFsQ29udHJvbGxlcnNfc3VjY2Vzc1Jlc3BvbnNlX2lsbGVnYWxBcmd1bWVudFJlc3BvbnNlX29zRXJyb3JSZXNwb25zZV9maWxlQ2xvc2VkUmVzcG9uc2VfZXJyb3JSZXNwb25zZUVycm9yVHlwZV9vc0Vycm9yUmVzcG9uc2VFcnJvckNvZGVfb3NFcnJvclJlc3BvbnNlTWVzc2FnZXpsaWJaTElCVXNlIHpsaWIgaW5zdGVhZEdaSVBVc2UgZ3ppcCBpbnN0ZWFkVXNlIEZpbGVNb2RlLnJlYWQgaW5zdGVhZFVzZSBGaWxlTW9kZS53cml0ZSBpbnN0ZWFkVXNlIEZpbGVNb2RlLmFwcGVuZCBpbnN0ZWFkVXNlIEZpbGVNb2RlLndyaXRlT25seSBpbnN0ZWFkVXNlIEZpbGVNb2RlLndyaXRlT25seUFwcGVuZCBpbnN0ZWFkX2Jsb2NrU2l6ZV9pb092ZXJyaWRlc1Rva2VuX2FzeW5jUnVuWm9uZWRfbmV4dFNlcnZpY2VJZF9zdGRpb0hhbmRsZVR5cGVUZXJtaW5hbF9zdGRpb0hhbmRsZVR5cGVQaXBlX3N0ZGlvSGFuZGxlVHlwZUZpbGVfc3RkaW9IYW5kbGVUeXBlU29ja2V0X3N0ZGlvSGFuZGxlVHlwZU90aGVyX3N0ZGluRkRfc3Rkb3V0RkRfc3RkZXJyRkRzeXN0ZW1FbmNvZGluZ1NZU1RFTV9FTkNPRElOR1VzZSBzeXN0ZW1FbmNvZGluZyBpbnN0ZWFkX3VyaUJhc2VDbG9zdXJlX2dldFVyaUJhc2VDbG9zdXJlX21ha2VVaW50OExpc3RWaWV3X2dldFdhdGNoU2lnbmFsSW50ZXJuYWxfcnVuTm9uSW50ZXJhY3RpdmVQcm9jZXNzZm9sZFN0cmVhbV9ydW5Ob25JbnRlcmFjdGl2ZVByb2Nlc3NTeW5jX3Rocm93T25CYWRQb3J0SW52YWxpZCBwb3J0IF90aHJvd09uQmFkVHRsSW52YWxpZCB0dGwgX21ha2VEYXRhZ3JhbV9nZXRTdGRpb0hhbmRsZVNvY2tldF9HZXRTdGRpb0hhbmRsZV9nZXRTb2NrZXRUeXBlU29ja2V0X0dldFR5cGVfZW5zdXJlRmFzdEFuZFNlcmlhbGl6YWJsZUJ5dGVEYXRhTGlzdCBlbGVtZW50IGlzIG51bGwgYXQgaW5kZXggX3ZhbGlkYXRlWkxpYldpbmRvd0JpdHNfdmFsaWRhdGVaTGliZUxldmVsX3ZhbGlkYXRlWkxpYk1lbUxldmVsX3ZhbGlkYXRlWkxpYlN0cmF0ZWd5VW5zdXBwb3J0ZWQgJ3N0cmF0ZWd5J1RoaXMgZW1iZWRkZXIgZGlzYWxsb3dzIGNhbGxpbmcgZGFydDppbydzIGV4aXQoKXNsZWVwc2xlZXA6IGR1cmF0aW9uIGNhbm5vdCBiZSBuZWdhdGl2ZVRoaXMgZW1iZWRkZXIgZGlzYWxsb3dzIGNhbGxpbmcgZGFydDppbydzIHNsZWVwKClfc2V0U3RkaW9GRHNzdGRpb1R5cGVzdGRpb2ZkZGFydC5jbGl3YWl0X2Zvci5kYXJ0X1dhaXRGb3JVdGlsc3dhaXRGb3JFdmVudHdhaXRGb3IgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVtYmVkZGVyX3dhaXRGb3JFdmVudENsb3N1cmVfd2FpdEZvckV2ZW50Q0xJX1dhaXRGb3JFdmVudHRpbWVvdXRNaWxsaXNfZ2V0V2FpdEZvckV2ZW50d2FpdEZvcmZ1dHVyZUNvbXBsZXRlZHN0YWNrdHJhY2V3YWl0Rm9yKCkgdGltZWQgb3V0ZGFydC5jb3JlTWFwc2JpZ2ludC5kYXJ0Ym9vbC5kYXJ0Y29tcGFyYWJsZS5kYXJ0ZGF0ZV90aW1lLmRhcnRkb3VibGUuZGFydGR1cmF0aW9uLmRhcnRlcnJvcnMuZGFydGV4Y2VwdGlvbnMuZGFydGV4cGFuZG8uZGFydGZ1bmN0aW9uLmRhcnRpZGVudGljYWwuZGFydGludC5kYXJ0aW52b2NhdGlvbi5kYXJ0bWFwLmRhcnRudWxsLmRhcnRudW0uZGFydG9iamVjdC5kYXJ0cGF0dGVybi5kYXJ0cmVnZXhwLmRhcnRzaW5rLmRhcnRzdGFja3RyYWNlLmRhcnRzdG9wd2F0Y2guZGFydHN0cmluZy5kYXJ0c3RyaW5nX2J1ZmZlci5kYXJ0c3RyaW5nX3NpbmsuZGFydHR5cGUuZGFydHVyaS5kYXJ0X1N5bmNHZW5lcmF0b3JDYWxsYmFja19VcmlCYXNlQ2xvc3VyZUNvbXBhcmF0b3JfR2VuZXJhdG9yX21vdmVOZXh0Rm5feWllbGRFYWNoSXRlcmF0b3JfTGlzdExpc3RfYWxsb2NhdGVMaXN0X2dldEluZGV4ZWRfc2V0SW5kZXhlZExpc3Rfc2V0SW5kZXhlZExpc3RfZ2V0TGVuZ3RoX3NsaWNlbmVlZHNUeXBlQXJndW1lbnRfc2xpY2VJbnRlcm5hbExpc3Rfc2xpY2VpdGVyYWJsZUFzTGlzdF9zZXRMZW5ndGhfSW1tdXRhYmxlTGlzdEltbXV0YWJsZUFycmF5IGNhbiBvbmx5IGJlIGFsbG9jYXRlZCBieSB0aGUgVk1JbW11dGFibGVMaXN0X2Zyb21fRml4ZWRTaXplQXJyYXlJdGVyYXRvcl9CaWdJbnRJbXBsX2RpZ2l0Qml0c19kaWdpdEJhc2VfZGlnaXRNYXNrX2hhbGZEaWdpdEJpdHNfaGFsZkRpZ2l0TWFza3R3b19taW51c09uZV9vbmVEaWdpdE1hc2tfdHdvRGlnaXRNYXNrX29uZUJpbGxpb25fbWluSW50LTkyMjMzNzIwMzY4NTQ3NzU4MDhfbWF4SW50OTIyMzM3MjAzNjg1NDc3NTgwN19sYXN0RGl2aWRlbmREaWdpdHNfbGFzdERpdmlkZW5kVXNlZF9sYXN0RGl2aXNvckRpZ2l0c19sYXN0RGl2aXNvclVzZWRfbGFzdFF1b1JlbURpZ2l0c19sYXN0UXVvUmVtVXNlZF9sYXN0UmVtVXNlZF9sYXN0UmVtX25zaF9pc05lZ2F0aXZlX2RpZ2l0c19iaXRzRm9yRnJvbURvdWJsZV9kaXZpc29yTG93VG9wRGlnaXRfZGl2aXNvclRvcERpZ2l0X3F1b3RpZW50RGlnaXRfcXVvdGllbnRIaWdoRGlnaXRfbm9ybWFsaXplZHJhZGl4Q291bGQgbm90IHBhcnNlIEJpZ0ludF9wYXJzZURlY2ltYWxkaWdpdEluUGFydENvdW50X2NvZGVVbml0VG9SYWRpeFZhbHVlX3BhcnNlSGV4c3RhcnRQb3NoZXhDaGFyc1BlckRpZ2l0c291cmNlTGVuZ3RobGFzdERpZ2l0TGVuZ3RoZGlnaXRJbmRleF9wYXJzZVJhZGl4X3RyeVBhcnNlcmVeXHMqKFsrLV0/KSgoMHhbYS1mMC05XSspfChcZCspfChbYS16MC05XSspKVxzKiRjYXNlU2Vuc2l0aXZlc2lnbkluZGV4aGV4SW5kZXhkZWNpbWFsSW5kZXhub25EZWNpbWFsSGV4SW5kZXhkZWNpbWFsTWF0Y2hoZXhNYXRjaG5vbkRlY2ltYWxNYXRjaGlzIG5vdCBhbiBpbnRlZ2VyX25vcm1hbGl6ZV9pc1plcm9fY2xvbmVEaWdpdHNyZXN1bHREaWdpdHNfZnJvbUludF9mcm9tRG91YmxlVmFsdWUgbXVzdCBiZSBmaW5pdGU6IGZsb29yVG9Eb3VibGViaWFzZWRFeHBvbmVudHVuc2hpZnRlZERpZ2l0c3Vuc2hpZnRlZEJpZ2Fic1Jlc3VsdF9kbFNoaWZ0cmVzdWx0VXNlZF9kbFNoaWZ0RGlnaXRzeERpZ2l0c3hVc2VkX2RyU2hpZnRfZHJTaGlmdERpZ2l0c19sc2hkaWdpdFNoaWZ0Yml0U2hpZnRjYXJyeUJpdFNoaWZ0Yml0TWFza2NhcnJ5c2hpZnRBbW91bnRzaGlmdC1hbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSBfbFNoaWZ0RGlnaXRzZGlnaXRzU2hpZnRfcnNoX3JTaGlmdERpZ2l0c19hYnNDb21wYXJlYmlnSW50X2NvbXBhcmVEaWdpdHNvdGhlckRpZ2l0c290aGVyVXNlZF9hYnNBZGRfYWJzU3ViX2Fic0FkZFNldFNpZ25fYWJzU3ViU2V0U2lnbl9hYnNBbmRTZXRTaWduX2Fic0FuZE5vdFNldFNpZ25fYWJzT3JTZXRTaWdubERpZ2l0c19hYnNYb3JTZXRTaWdudGhpczFvdGhlcjFuMV9tdWxBZGR4SW5kZXhtdWx0aXBsaWNhbmREaWdpdHNhY2N1bXVsYXRvckRpZ2l0c3hseGhtbG1ocGhwbF9zcXJBZGRhY2N1bHVtYXRvckRpZ2l0c19tdWxEaWdpdHNfc3FyRGlnaXRzX2VzdGltYXRlUXVvdGllbnREaWdpdHF1b3RpZW50RGlnaXRfZGl2X2RpdlJlbWxhc3RRdW9fdXNlZHF1b19kaWdpdHNxdW9fcmVtcmVtRGlnaXRzcmVtbnNoeURpZ2l0c3lVc2VkbnVtRXh0cmFEaWdpdHN0bXBEaWdpdHNueURpZ2l0c2QwZDFfcmVtRGlnaXRzRXhwb25lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmU6IG1vZFBvd2JpZ0V4cG9uZW50YmlnTW9kdWx1c21vZHVsdXNleHBvbmVudCBtdXN0IGJlIHBvc2l0aXZlOiBtb2R1bHVzIG11c3QgYmUgc3RyaWN0bHkgcG9zaXRpdmU6IGV4cG9uZW50Qml0bGVuY2Fubm90VXNlTW9udGdvbWVyeV9ub3JtTW9kdWx1c1VzZWRyZXN1bHQyRGlnaXRzZ0RpZ2l0c2dVc2VkcmVzdWx0MlVzZWRfc3FyX211bF9yZXZlcnRrbWcyRGlnaXRzZzJVc2VkZXhwb25lbnREaWdpdHNnd0RpZ2l0c3N3YXBEaWdpdHNzd2FwVXNlZF9iaW5hcnlHY2RpbnZtYXhVc2VkbWF4TGVuTm90IGNvcHJpbWVtdXN0IG5vdCBiZSB6ZXJvZGlnaXRTaGlmdEFtb3VudHVEaWdpdHN2RGlnaXRzYWNhYmNkVXNlZGFiY2RMZW5hRGlnaXRzYkRpZ2l0c2NEaWdpdHNkRGlnaXRzYUlzTmVnYXRpdmViSXNOZWdhdGl2ZWNJc05lZ2F0aXZlZElzTmVnYXRpdmVhX2NtcF9jYl9jbXBfZGNfY21wX2FkX2NtcF9ibW9kSW52ZXJzZU1vZHVsdXMgbXVzdCBiZSBzdHJpY3RseSBwb3NpdGl2ZTogZ2NkcmVzdWx0Qml0c2NhY2hlZEJpdHNjYWNoZWRCaXRzTGVuZ3RocmVhZEJpdHNuZXh0RGlnaXRuZXh0RGlnaXRMZW5ndGhsZWFkaW5nQml0c3JvdW5kVXBkZWNpbWFsRGlnaXRDaHVua3NkaWdpdHM5emVyb3MwMDAwMDAwMDAwMDAwMF90b1JhZGl4Q29kZVVuaXRkaWdpdFN0cmluZ190b0hleFN0cmluZ3JldmVyc2VkRGlnaXRDb2RlVW5pdHNtc2JDaHVua19CaWdJbnRSZWR1Y3Rpb25fQmlnSW50TW9udGdvbWVyeVJlZHVjdGlvbl9tb2R1bHVzX21vZHVsdXNEaWdpdHNfYXJnc19kaWdpdHNQZXJTdGVwX3hEaWdpdF94SGlnaERpZ2l0X3Job0RpZ2l0X3Job0hpZ2hEaWdpdF9tdURpZ2l0X211SGlnaERpZ2l0X2ludkRpZ2l0X2ludkRpZ2l0UGFpcl9tdWxNb2RyaG9scmhvaGRoZGxfcmVkdWNlX0JpZ0ludENsYXNzaWNSZWR1Y3Rpb25fbm9ybU1vZHVsdXNfbm9ybU1vZHVsdXNEaWdpdHNfbmVnTm9ybU1vZHVsdXNEaWdpdHNfbW9kdWx1c05zaF90bXBEaWdpdHNuZWdOb3JtTW9kdWx1c19Eb3VibGVDQUNIRV9TSVpFX0xPRzJDQUNIRV9MRU5HVEhDQUNIRV9NQVNLX2NhY2hlRXZpY3RJbmRleGZyb21JbnRlZ2VyRG91YmxlX2RvdWJsZUZyb21JbnRlZ2VyRG91YmxlX2hhc2hDb2RlX2lkZW50aXR5SGFzaENvZGVEb3VibGVfYWRkX3N1YkRvdWJsZV9zdWJEb3VibGVfbXVsX3RydW5jX2RpdkRvdWJsZV90cnVuY19kaXZEb3VibGVfZGl2X21vZHVsb0RvdWJsZV9tb2R1bG9fcmVtYWluZGVyRG91YmxlX3JlbWFpbmRlckRvdWJsZV9mbGlwU2lnbkJpdERvdWJsZV9lcXVhbF9lcXVhbFRvSW50ZWdlckRvdWJsZV9lcXVhbFRvSW50ZWdlckRvdWJsZV9ncmVhdGVyVGhhbl9hZGRGcm9tSW50ZWdlcl9zdWJGcm9tSW50ZWdlcl9tdWxGcm9tSW50ZWdlcl90cnVuY0RpdkZyb21JbnRlZ2VyX21vZHVsb0Zyb21JbnRlZ2VyX3JlbWFpbmRlckZyb21JbnRlZ2VyX2dyZWF0ZXJUaGFuRnJvbUludGVnZXJEb3VibGVfZ3JlYXRlclRoYW5Gcm9tSW50ZWdlckRvdWJsZV9nZXRJc05lZ2F0aXZlRG91YmxlX2dldElzSW5maW5pdGVEb3VibGVfZ2V0SXNOYU5mbG9vcmNlaWxjZWlsVG9Eb3VibGVEb3VibGVfcm91bmREb3VibGVfZmxvb3JEb3VibGVfY2VpbERvdWJsZV90cnVuY2F0ZW5vdCBhIG51bWJlckRvdWJsZV90b0ludERvdWJsZV90b1N0cmluZ25vdCBhbiBpbnRlZ2VyX3RvU3RyaW5nQXNGaXhlZERvdWJsZV90b1N0cmluZ0FzRml4ZWRfdG9TdHJpbmdBc0V4cG9uZW50aWFsRG91YmxlX3RvU3RyaW5nQXNFeHBvbmVudGlhbHRvU3RyaW5nQXNQcmVjaXNpb25wcmVjaXNpb25fdG9TdHJpbmdBc1ByZWNpc2lvbkRvdWJsZV90b1N0cmluZ0FzUHJlY2lzaW9udGhpc0lzTmVnYXRpdmVvdGhlcklzTmVnYXRpdmUtOTAwNzE5OTI1NDc0MDk5MjkwMDcxOTkyNTQ3NDA5OTI5MjIzMzcyMDM2ODU0Nzc2MDAwLjBfQXNzZXJ0aW9uRXJyb3JfZmFpbGVkQXNzZXJ0aW9uX3VybF9saW5lX2NvbHVtbl90aHJvd05ld2Fzc2VydGlvblN0YXJ0YXNzZXJ0aW9uRW5kX2RvVGhyb3dOZXdBc3NlcnRpb25FcnJvcl90aHJvd05ld19ldmFsdWF0ZUFzc2VydGlvbl9tZXNzYWdlU3RyaW5naXMgbm90IHRydWUuY29sdW1uSW5mbyBwb3MgJzogRmFpbGVkIGFzc2VydGlvbjogbGluZSBfVHlwZUVycm9yaXMgYXNzaWduYWJsZVR5cGVFcnJvcl90aHJvd05ld3NyY192YWx1ZWRzdF90eXBlZHN0X25hbWVfQ2FzdEVycm9yX2Vycm9yTXNnX0ludGVybmFsRXJyb3JJbnRlcm5hbEVycm9yOiAnRXJyb3I6IGZpZWxkICcnIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuX0Nsb3N1cmVfaW5zdGFudGlhdG9yX3R5cGVfYXJndW1lbnRzX2Z1bmN0aW9uX3R5cGVfYXJndW1lbnRzX2RlbGF5ZWRfdHlwZV9hcmd1bWVudHNDbG9zdXJlX2VxdWFsc19jb21wdXRlSGFzaENsb3N1cmVfY2xvbmVDbG9zdXJlX2NvbXB1dGVIYXNoX0dyb3dhYmxlTGlzdHdpdGhDYXBhY2l0eV93aXRoRGF0YUdyb3dhYmxlTGlzdF9hbGxvY2F0ZV9jYXBhY2l0eUdyb3dhYmxlTGlzdF9nZXRDYXBhY2l0eUdyb3dhYmxlTGlzdF9nZXRMZW5ndGhuZXdfbGVuZ3Rob2xkX2NhcGFjaXR5bmV3X2NhcGFjaXR5c2hvdWxkU2hyaW5rVG9GaXRfc2hyaW5rR3Jvd2FibGVMaXN0X3NldExlbmd0aF9zZXREYXRhR3Jvd2FibGVMaXN0X3NldERhdGFHcm93YWJsZUxpc3RfZ2V0SW5kZXhlZEdyb3dhYmxlTGlzdF9zZXRJbmRleGVkX25leHRDYXBhY2l0eWlzVk1MaXN0Y2FwaXRlckxlbm5ld0xlbl9hbGxvY2F0ZURhdGFuZXdEYXRhX2pvaW5XaXRoU2VwYXJhdG9yY29kZVVuaXRDb3VudGZpcnN0Tm9uT25lQnl0ZVN0cmluZ0xpbWl0bmV4dEVsZW1lbnRjb3B5SW5kZXhvbmVieXRlQ2FuYXJ5ZWxlbWVudFN0cmluZ19JbW11dGFibGVNYXBfa3ZQYWlyc2tleVZhbHVlUGFpcnNDYW5ub3Qgc2V0IHZhbHVlIGluIHVubW9kaWZpYWJsZSBNYXBDYW5ub3QgY2xlYXIgdW5tb2RpZmlhYmxlIE1hcENhbm5vdCByZW1vdmUgZnJvbSB1bm1vZGlmaWFibGUgTWFwX0ltbXV0YWJsZU1hcEtleUl0ZXJhYmxlX0ltbXV0YWJsZU1hcFZhbHVlSXRlcmFibGVfSW1tdXRhYmxlTWFwRW50cnlJdGVyYWJsZV9JbW11dGFibGVNYXBLZXlJdGVyYXRvcl9uZXh0SW5kZXhfSW1tdXRhYmxlTWFwVmFsdWVJdGVyYXRvcl9JbW11dGFibGVNYXBFbnRyeUl0ZXJhdG9yX0ludGVnZXJJbXBsZW1lbnRhdGlvbjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5el9iaXRBbmRGcm9tSW50ZWdlcl9iaXRPckZyb21JbnRlZ2VyX2JpdFhvckZyb21JbnRlZ2VyX2JpdEFuZEZyb21TbWlJbnRlZ2VyX2JpdEFuZEZyb21JbnRlZ2VySW50ZWdlcl9iaXRPckZyb21JbnRlZ2VySW50ZWdlcl9iaXRYb3JGcm9tSW50ZWdlcl9zaHJGcm9tSW50ZWdlckludGVnZXJfc2hyRnJvbUludGVnZXJfc2hsRnJvbUludGVnZXJJbnRlZ2VyX3NobEZyb21JbnRlZ2VySW50ZWdlcl9hZGRGcm9tSW50ZWdlckludGVnZXJfc3ViRnJvbUludGVnZXJJbnRlZ2VyX211bEZyb21JbnRlZ2VySW50ZWdlcl90cnVuY0RpdkZyb21JbnRlZ2VySW50ZWdlcl9tb2R1bG9Gcm9tSW50ZWdlckludGVnZXJfZ3JlYXRlclRoYW5Gcm9tSW50ZWdlckludGVnZXJfZXF1YWxUb0ludGVnZXItOTIyMzM3MjAzNjg1NDc3NjAwMC4wX3RvUG93MlN0cmluZ19taW5JbnQ2NFRvUmFkaXhTdHJpbmdfc2V0QXRiaXRzUGVyRGlnaXQzMDM3MDAwNDk5X1NtaV9kaWdpdFRhYmxlX3NtYWxsTG9va3VwVGFibGUtOTktOTgtOTctOTYtOTUtOTQtOTMtOTItOTEtOTAtODktODgtODctODYtODUtODQtODMtODItODEtODAtNzktNzgtNzctNzYtNzUtNzQtNzMtNzItNzEtNzAtNjktNjgtNjctNjYtNjUtNjQtNjMtNjItNjEtNjAtNTktNTgtNTctNTYtNTUtNTQtNTMtNTItNTEtNTAtNDktNDgtNDctNDYtNDUtNDQtNDMtNDItNDEtNDAtMzktMzgtMzctMzYtMzUtMzQtMzMtMzItMzEtMzAtMjktMjgtMjctMjYtMjUtMjQtMjMtMjItMjEtMjAtMTktMTgtMTctMTYtMTUtMTQtMTMtMTItMTEtMTAtOS04LTctNi01LTQtMzIzNDU2Nzg5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5X1BPV18xMF83X1BPV18xMF84X1BPV18xMF85U21pX2JpdE5lZ2F0ZVNtaV9iaXRMZW5ndGhTbWlfYml0QW5kRnJvbVNtaV9wb3NpdGl2ZUJhc2UxMExlbmd0aHNtaXR3b0RpZ2l0c19uZWdhdGl2ZUJhc2UxMExlbmd0aG5lZ1NtaV9uZWdhdGl2ZVRvU3RyaW5nX01pbnRNaW50X2JpdE5lZ2F0ZU1pbnRfYml0TGVuZ3RoX01FVEhPRF9HRVRURVJfU0VUVEVSX0ZJRUxEX0xPQ0FMX1ZBUl9LSU5EX1NISUZUX0tJTkRfQklUU19LSU5EX01BU0tfRFlOQU1JQ19TVVBFUl9TVEFUSUNfQ09OU1RSVUNUT1JfVE9QX0xFVkVMX0xFVkVMX1NISUZUX0xFVkVMX0JJVFNfTEVWRUxfTUFTS19UWVBFX0FSR1NfTEVOX0NPVU5UX1BPU0lUSU9OQUxfQ09VTlRfRklSU1RfTkFNRURfRU5UUllfZnVuY3Rpb25OYW1lX2FyZ3VtZW50c0Rlc2NyaXB0b3JfaXNTdXBlckludm9jYXRpb25fZGVsYXllZFR5cGVBcmd1bWVudHNMZW5fbWVtYmVyTmFtZV9wb3NpdGlvbmFsQXJndW1lbnRzX25hbWVkQXJndW1lbnRzX3dpdGhvdXRUeXBlX3NldE1lbWJlck5hbWVBbmRUeXBlX3R5cGVBcmdzTGVudHlwZUFyZ3NMZW5fdW5wYWNrVHlwZUFyZ3VtZW50c0ludm9jYXRpb25NaXJyb3JfdW5wYWNrVHlwZUFyZ3VtZW50c251bVR5cGVBcmd1bWVudHNyZWNlaXZlckluZGV4bmFtZWRFbnRyeUluZGV4YXJnX25hbWVhcmdfdmFsdWVfYWxsb2NhdGVJbnZvY2F0aW9uTWlycm9yYXJndW1lbnRzRGVzY3JpcHRvcmlzU3VwZXJJbnZvY2F0aW9uX2FsbG9jYXRlSW52b2NhdGlvbk1pcnJvckZvckNsb3N1cmVkZWxheWVkVHlwZUFyZ3VtZW50c0xlbl9MaWJyYXJ5UHJlZml4X2xvYWRMaWJyYXJ5UHJlZml4X2xvYWRfbG9hZEVycm9yTGlicmFyeVByZWZpeF9sb2FkRXJyb3JMaWJyYXJ5UHJlZml4X2lzTG9hZGVkX2ludmFsaWRhdGVEZXBlbmRlbnRDb2RlTGlicmFyeVByZWZpeF9pbnZhbGlkYXRlRGVwZW5kZW50Q29kZWhhc0NvbXBsZXRlZF9SZWdFeHBIYXNoS2V5ZG90QWxsdGhhdF9SZWdFeHBIYXNoVmFsdWVfUmVnRXhwTWF0Y2hfcmVnZXhwX21hdGNoX01BVENIX1BBSVJncm91cElkeF9ncm91cENvdW50X3N1YnN0cmluZ1VuY2hlY2tlZGdyb3Vwc2dyb3Vwc1NwZWNncm91cHNMaXN0bmFtZWRHcm91cGlkeF9ncm91cE5hbWVJbmRleE5vdCBhIGNhcHR1cmUgZ3JvdXAgbmFtZTogZ3JvdXBOYW1lc19ncm91cE5hbWVzX1JlZ0V4cF93b3JkQ2hhcmFjdGVyTWFwUmVnRXhwX2ZhY3RvcnlfRXhlY3V0ZU1hdGNoX0V4ZWN1dGVNYXRjaFN0aWNreXN0cmluZ01hdGNoUmVnRXhwX2dldFBhdHRlcm5SZWdFeHBfZ2V0SXNNdWx0aUxpbmVpc0Nhc2VTZW5zaXRpdmVSZWdFeHBfZ2V0SXNDYXNlU2Vuc2l0aXZlaXNVbmljb2RlUmVnRXhwX2dldElzVW5pY29kZWlzRG90QWxsUmVnRXhwX2dldElzRG90QWxsUmVnRXhwX2dldEdyb3VwQ291bnRfZ3JvdXBOYW1lTGlzdFJlZ0V4cF9nZXRHcm91cE5hbWVNYXBSZWdFeHBfRXhlY3V0ZU1hdGNoc3RhcnRfaW5kZXhSZWdFeHBfRXhlY3V0ZU1hdGNoU3RpY2t5X0FsbE1hdGNoZXNJdGVyYWJsZV9yZV9zdHJfQWxsTWF0Y2hlc0l0ZXJhdG9yX2lzVHJhaWxTdXJyb2dhdGVfU3RyaW5nQmFzZV9sZW5ndGhCaXRzX21heExlbmd0aFZhbHVlX2xlbmd0aE1hc2tfc3RhcnRCaXRzX21heFN0YXJ0VmFsdWVfbWF4VW5zaWduZWRTbWlCaXRzX21heEpvaW5SZXBsYWNlT25lQnl0ZVN0cmluZ0xlbmd0aF9pc1doaXRlc3BhY2VfU3RyaW5nQmFzZSBjYW4ndCBiZSBpbnN0YW5pYXRlZFN0cmluZ19nZXRIYXNoQ29kZV9pc09uZUJ5dGVjcmVhdGVGcm9tQ2hhckNvZGVzY2NpZGNvZGVDb3VudF9zY2FuQ29kZVVuaXRzX2NyZWF0ZVN0cmluZ0Zyb21JdGVyYWJsZWNoYXJDb2RlTGlzdGlzT25lQnl0ZVN0cmluZ19jcmVhdGVPbmVCeXRlU3RyaW5nX2NyZWF0ZUZyb21Db2RlUG9pbnRzU3RyaW5nQmFzZV9jcmVhdGVGcm9tQ29kZVBvaW50c2NvZGVQb2ludHNTdHJpbmdfY2hhckF0U3RyaW5nX2dldExlbmd0aFN0cmluZ19jb25jYXR0aGlzTGVuZ3Rob3RoZXJMZW5ndGh0aGlzQ29kZVVuaXRvdGhlckNvZGVVbml0X3N1YnN0cmluZ01hdGNoZXNfc3Vic3RyaW5nVW5jaGVja2VkTmF0aXZlU3RyaW5nQmFzZV9zdWJzdHJpbmdVbmNoZWNrZWRfaXNPbmVCeXRlV2hpdGVzcGFjZV9pc1R3b0J5dGVXaGl0ZXNwYWNlX2ZpcnN0Tm9uV2hpdGVzcGFjZV9sYXN0Tm9uV2hpdGVzcGFjZXRyaW1MZWZ0dGltZXMgaXMgbm90IGEgUGF0dGVybiBpcyBub3QgYSBTdHJpbmcgaXMgbm90IGFuIGludHJlcGxhY2VtZW50SXNPbmVCeXRlcmVwbGFjZW1lbnRMZW5ndGhzbGljZXNfYWRkUmVwbGFjZVNsaWNlX2pvaW5SZXBsYWNlQWxsT25lQnl0ZVJlc3VsdHNsaWNlTGVuZ3RoX2pvaW5SZXBsYWNlQWxsUmVzdWx0U3RyaW5nQmFzZV9qb2luUmVwbGFjZUFsbFJlc3VsdHJlcGxhY2VtZW50U3RyaW5nc0FyZU9uZUJ5dGVyZXBsYWNlRmlyc3RNYXBwZWRfbWF0Y2hTdHJpbmdfc3RyaW5nSWRlbnRpdHlfc3BsaXRNYXBKb2luRW1wdHlTdHJpbmdzdHJpbmdQYXR0ZXJuX2ludGVycG9sYXRlU2luZ2xlX2ludGVycG9sYXRlcHJldmlvdXNJbmRleFN0cmluZ190b1VwcGVyQ2FzZVN0cmluZ190b0xvd2VyQ2FzZV9jb25jYXRSYW5nZV9jb25jYXRSYW5nZU5hdGl2ZVN0cmluZ19jb25jYXRSYW5nZV9PbmVCeXRlU3RyaW5nX0xDX1RBQkxFAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn/CgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucK6wrvCvMK9wr7Cv8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDl8O4w7nDusO7w7zDvcO+w5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8w73DvsO/X1VDX1RBQkxFAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlae3x9fn/CgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqzCrcKuwq/CsMKxwrLCs8K0AMK2wrfCuMK5wrrCu8K8wr3CvsK/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOXw5jDmcOaw5vDnMOdw54Aw4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsO3w5jDmcOaw5vDnMOdw54AU3RyaW5nX2NvZGVVbml0QXRPbmVCeXRlU3RyaW5nX3N1YnN0cmluZ1VuY2hlY2tlZF9zcGxpdFdpdGhDaGFyQ29kZU9uZUJ5dGVTdHJpbmdfc3BsaXRXaXRoQ2hhckNvZGVwYXR0ZXJuQXNTdHJpbmdfY29uY2F0QWxsc3RyaW5nc0xlbmd0aHJJeGVMZW5ndGhwQ2lkcGF0dGVybkN1MHBhZENpZHBhZExlbmd0aHJlc3VsdExlbmd0aHBhZENoYXJPbmVCeXRlU3RyaW5nX2FsbG9jYXRlX2FsbG9jYXRlRnJvbU9uZUJ5dGVMaXN0T25lQnl0ZVN0cmluZ19hbGxvY2F0ZUZyb21PbmVCeXRlTGlzdE9uZUJ5dGVTdHJpbmdfc2V0QXRvbmVCeXRlU3RyaW5nX1R3b0J5dGVTdHJpbmdfYWxsb2NhdGVGcm9tVHdvQnl0ZUxpc3RUd29CeXRlU3RyaW5nX2FsbG9jYXRlRnJvbVR3b0J5dGVMaXN0X0V4dGVybmFsT25lQnl0ZVN0cmluZ19FeHRlcm5hbFR3b0J5dGVTdHJpbmdfU3RyaW5nTWF0Y2hfU3RyaW5nQWxsTWF0Y2hlc0l0ZXJhYmxlX2lucHV0X3BhdHRlcm5fU3RyaW5nQWxsTWF0Y2hlc0l0ZXJhdG9yX0Fic3RyYWN0VHlwZUFic3RyYWN0VHlwZV90b1N0cmluZ1R5cGVfZ2V0SGFzaENvZGVfVHlwZVJlZl9UeXBlUGFyYW1ldGVyX1dlYWtQcm9wZXJ0eV9uZXdXZWFrUHJvcGVydHlfbmV3V2Vha1Byb3BlcnR5X2dldEtleVdlYWtQcm9wZXJ0eV9nZXRWYWx1ZVdlYWtQcm9wZXJ0eV9zZXRWYWx1ZURlcHJlY2F0ZWRleHBpcmVzVXNlIGBtZXNzYWdlYCBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gRGFydCAzLjAuMERlcHJlY2F0ZWQgZmVhdHVyZTogX092ZXJyaWRlUHJvdmlzaW9uYWxfUHJveHlCaWdJbnR0cnlQYXJzZUJvb2xfZnJvbUVudmlyb25tZW50RGF0ZVRpbWVfTUlDUk9TRUNPTkRfSU5ERVhfTUlMTElTRUNPTkRfSU5ERVhfU0VDT05EX0lOREVYX01JTlVURV9JTkRFWF9IT1VSX0lOREVYX0RBWV9JTkRFWF9XRUVLREFZX0lOREVYX01PTlRIX0lOREVYX1lFQVJfSU5ERVhfX3BhcnRzX0RBWVNfVU5USUxfTU9OVEhtb25kYXl0dWVzZGF5d2VkbmVzZGF5dGh1cnNkYXlmcmlkYXlzYXR1cmRheXN1bmRheWRheXNQZXJXZWVramFudWFyeWZlYnJ1YXJ5bWFyY2hhcHJpbGp1bmVqdWx5YXVndXN0c2VwdGVtYmVyb2N0b2Jlcm5vdmVtYmVyZGVjZW1iZXJtb250aHNQZXJZZWFyX21heE1pbGxpc2Vjb25kc1NpbmNlRXBvY2g4NjQwMDAwMDAwMDAwMDAwX3BhcnNlRm9ybWF0XihbKy1dP1xkezQsNn0pLT8oXGRcZCktPyhcZFxkKSg/OlsgVF0oXGRcZCkoPzo6PyhcZFxkKSg/Ojo/KFxkXGQpKD86Wy4sXShcZHsxLDZ9KSk/KT8pPyggP1t6Wl18ID8oWy0rXSkoXGRcZCkoPzo6PyhcZFxkKSk/KT8pPyR5ZWFybW9udGhkYXlob3VybWludXRlbWlsbGlzZWNvbmRtaWNyb3NlY29uZHV0Y2Zyb21NaWxsaXNlY29uZHNTaW5jZUVwb2NoZnJvbU1pY3Jvc2Vjb25kc1NpbmNlRXBvY2htaWNyb3NlY29uZHNTaW5jZUVwb2NoX3dpdGhWYWx1ZURhdGVUaW1lIGlzIG91dHNpZGUgdmFsaWQgcmFuZ2U6ICdpc1V0YycgZmxhZyBtYXkgbm90IGJlICdudWxsJ19ub3dfZ2V0Q3VycmVudE1pY3Jvc0RhdGVUaW1lX2N1cnJlbnRUaW1lTWljcm9zX3RpbWVab25lTmFtZUZvckNsYW1wZWRTZWNvbmRzRGF0ZVRpbWVfdGltZVpvbmVOYW1lc2Vjb25kc1NpbmNlRXBvY2hfdGltZVpvbmVPZmZzZXRJblNlY29uZHNGb3JDbGFtcGVkU2Vjb25kc0RhdGVUaW1lX3RpbWVab25lT2Zmc2V0SW5TZWNvbmRzX2xvY2FsVGltZVpvbmVBZGp1c3RtZW50SW5TZWNvbmRzRGF0ZVRpbWVfbG9jYWxUaW1lWm9uZUFkanVzdG1lbnRJblNlY29uZHNfY29tcHV0ZVVwcGVyUGFydGxvY2FsTWljcm9zcmVzdWx0WWVhcnJlc3VsdE1vbnRocmVzdWx0RGF5ZGF5c1NpbmNlMTk3MDg2NDAwMDAwMDAwZGF5c3lkMXlkMnlkM2lzTGVhcGRheXNVbnRpbE1vbnRocmVzdWx0TWljcm9zZWNvbmRyZXN1bHRNaWxsaXNlY29uZHJlc3VsdFNlY29uZHJlc3VsdE1pbnV0ZXJlc3VsdEhvdXIzNjAwMDAwMDAwcmVzdWx0V2Vla2RheV9sb2NhbERhdGVJblV0Y01pY3Jvc21pY3Jvc19mbG9vcmVkRGl2aXNpb25fZGF5RnJvbVllYXJfaXNMZWFwWWVhcl93ZWVrRGF5X2VxdWl2YWxlbnRZZWFycmVjZW50WWVhcl95ZWFyc0Zyb21TZWNvbmRzU2luY2VFcG9jaF9lcXVpdmFsZW50U2Vjb25kc2VxdWl2YWxlbnRZZWFyZXF1aXZhbGVudERheXNkaWZmRGF5c190aW1lWm9uZU9mZnNldEluU2Vjb25kc2VxdWl2YWxlbnRTZWNvbmRzX3RpbWVab25lTmFtZWZvcm1hdHRlZFN0cmluZ3BhcnNlSW50T3JaZXJvbWF0Y2hlZHBhcnNlTWlsbGlBbmRNaWNyb3NlY29uZHN5ZWFyc2FkZE9uZU1pbGxpc2Vjb25kbWlsbGlBbmRNaWNyb3NlY29uZHNob3VyRGlmZmVyZW5jZW1pbnV0ZURpZmZlcmVuY2VUaW1lIG91dCBvZiByYW5nZUludmFsaWQgZGF0ZSBmb3JtYXRpc0JlZm9yZWlzQWZ0ZXJpc0F0U2FtZU1vbWVudEFzdG9Mb2NhbHRvVXRjX2ZvdXJEaWdpdHNhYnNOMDAwX3NpeERpZ2l0c190aHJlZURpZ2l0c190d29EaWdpdHNzZWNfYnJva2VuRG93bkRhdGVUb1ZhbHVlcmVhbE1vbnRoYWRqdXN0bWVudHpvbmVPZmZzZXR0aW1lWm9uZU5hbWVVVEN0aW1lWm9uZU9mZnNldG9mZnNldEluU2Vjb25kc3dlZWtkYXluYW5pbmZpbml0eW5lZ2F0aXZlSW5maW5pdHltaW5Qb3NpdGl2ZTVlLTMyNG1heEZpbml0ZV9uYXRpdmVQYXJzZV90cnlQYXJzZURvdWJsZWRpZ2l0c1NlZW5leHBvbmVudERlbHRhZmlyc3RDaGFybmZpbml0eWV4cFBhcnRuZWdFeHBvbmVudEludmFsaWQgZG91YmxlRHVyYXRpb25taWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZG1pbGxpc2Vjb25kc1BlclNlY29uZHNlY29uZHNQZXJNaW51dGVtaW51dGVzUGVySG91cmhvdXJzUGVyRGF5bWljcm9zZWNvbmRzUGVyU2Vjb25kbWljcm9zZWNvbmRzUGVyTWludXRlbWljcm9zZWNvbmRzUGVySG91cm1pY3Jvc2Vjb25kc1BlckRheW1pbGxpc2Vjb25kc1Blck1pbnV0ZW1pbGxpc2Vjb25kc1BlckhvdXJtaWxsaXNlY29uZHNQZXJEYXlzZWNvbmRzUGVySG91cnNlY29uZHNQZXJEYXltaW51dGVzUGVyRGF5X2R1cmF0aW9uX21pY3Jvc2Vjb25kc3F1b3RpZW50aW5EYXlzaW5Ib3Vyc2luTWludXRlc2luU2Vjb25kc3NpeERpZ2l0czAwMDAwdHdvRGlnaXRNaW51dGVzdHdvRGlnaXRTZWNvbmRzc2l4RGlnaXRVc19zdHJpbmdUb1NhZmVTdHJpbmdfb2JqZWN0VG9TdHJpbmdBc3NlcnRpb25FcnJvckFzc2VydGlvbiBmYWlsZWROdWxsVGhyb3duRXJyb3JUaHJvdyBvZiBudWxsLkFyZ3VtZW50RXJyb3JfaGFzVmFsdWVpbnZhbGlkVmFsdWVNdXN0IG5vdCBiZSBudWxsY2hlY2tOb3ROdWxsX2Vycm9yTmFtZUludmFsaWQgYXJndW1lbnQocylfZXJyb3JFeHBsYW5hdGlvbmV4cGxhbmF0aW9uZXJyb3JWYWx1ZVZhbHVlIG5vdCBpbiByYW5nZUludmFsaWQgdmFsdWVpbmRleGFibGVjaGVja1ZhbHVlSW5JbnRlcnZhbGNoZWNrVmFsaWRJbmRleGNoZWNrVmFsaWRSYW5nZXN0YXJ0TmFtZWVuZE5hbWVjaGVja05vdE5lZ2F0aXZlOiBOb3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDogTm90IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA6IE5vdCBpbiByYW5nZSAsIGluY2x1c2l2ZTogVmFsaWQgdmFsdWUgcmFuZ2UgaXMgZW1wdHk6IE9ubHkgdmFsaWQgdmFsdWUgaXMgSW5kZXhFcnJvckluZGV4IG91dCBvZiByYW5nZTogaW5kZXggbXVzdCBub3QgYmUgbmVnYXRpdmU6IG5vIGluZGljZXMgYXJlIHZhbGlkOiBpbmRleCBzaG91bGQgYmUgbGVzcyB0aGFuIEZhbGxUaHJvdWdoRXJyb3JfdGhyb3dOZXdjYXNlX2NsYXVzZV9wb3MnOiBTd2l0Y2ggY2FzZSBmYWxsLXRocm91Z2ggYXQgbGluZSBfY2xhc3NOYW1lQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcl90aHJvd05ld0Nhbm5vdCBpbnN0YW50aWF0ZSBhYnN0cmFjdCBjbGFzcyBfdXJsICcnIGxpbmUgX2V4aXN0aW5nQXJndW1lbnROYW1lc19pbnZvY2F0aW9uX2ludm9jYXRpb25fdHlwZWludm9jYXRpb25fdHlwZVVzZSBOb1N1Y2hNZXRob2Qud2l0aEludm9jYXRpb24gaW5zdGVhZGV4aXN0aW5nQXJndW1lbnROYW1lc190aHJvd05ld0ludm9jYXRpb25fdGhyb3dOZXdJZk5vdExvYWRlZF9OYW1lZEFyZ3VtZW50c01hcF9leGlzdGluZ01ldGhvZFNpZ25hdHVyZU5vU3VjaE1ldGhvZEVycm9yX2V4aXN0aW5nTWV0aG9kU2lnbmF0dXJlaW52b2NhdGlvblR5cGVfdG9TdHJpbmdEZXByZWNhdGVkTm9TdWNoTWV0aG9kRXJyb3I6IENhbm5vdCBhc3NpZ24gdG8gZmluYWwgdmFyaWFibGUgJ2FyZ3NfbWlzbWF0Y2hhcmdzX21lc3NhZ2Ugd2l0aCBtYXRjaGluZyBhcmd1bWVudHN0eXBlX3N0cmdldHRlciBvciBzZXR0ZXJtc2dfYnVmTm9TdWNoTWV0aG9kRXJyb3I6IGlzX3R5cGVfY2FsbFRoZSBudWxsIG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgVGhlICcgd2FzIGNhbGxlZCBvbiBudWxsLkNsb3N1cmUgY2FsbCB3aXRoIG1pc21hdGNoZWQgYXJndW1lbnRzOiBmdW5jdGlvbiAnQXR0ZW1wdGVkIHRvIHVzZSB0eXBlICcnIGFzIGEgZnVuY3Rpb24uIFNpbmNlIHR5cGVzIGRvIG5vdCBkZWZpbmUgYSBtZXRob2QgJ2NhbGwnLCB0aGlzIGlzIG5vdCBwb3NzaWJsZS4gRGlkIHlvdSBpbnRlbmQgdG8gY2FsbCB0aGUgIGNvbnN0cnVjdG9yIGFuZCBmb3JnZXQgdGhlICduZXcnIG9wZXJhdG9yPycgaGFzIG5vIGluc3RhbmNlIFN1cGVyIGNsYXNzIG9mIGNsYXNzICcnIGhhcyBubyBpbnN0YW5jZSBzdXBlci5ObyBzdGF0aWMgZGVjbGFyZWQgaW4gY2xhc3MgJ05vIGNvbnN0cnVjdG9yICcgZGVjbGFyZWQgaW4gY2xhc3MgJ05vIHRvcC1sZXZlbCBkZWNsYXJlZC5SZWNlaXZlcjogdG9wLWxldmVsUmVjZWl2ZXI6IFRyaWVkIGNhbGxpbmc6IGZvcm1hbFBhcmFtZXRlcnMKRm91bmQ6IHR5cGVBcmd1bWVudHNCdWZhcmd1bWVudHNCdWZleGlzdGluZ1NpZ2FyZ3NNc2draW5kQnVmbXNnQnVmVW5zdXBwb3J0ZWRFcnJvclVuc3VwcG9ydGVkIG9wZXJhdGlvbjogVW5pbXBsZW1lbnRlZEVycm9yVW5pbXBsZW1lbnRlZEVycm9yOiBTdGF0ZUVycm9yQmFkIHN0YXRlOiBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3Jtb2RpZmllZE9iamVjdENvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb24uQ29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbjogT3V0T2ZNZW1vcnlFcnJvck91dCBvZiBNZW1vcnlTdGFja092ZXJmbG93RXJyb3JTdGFjayBPdmVyZmxvd0N5Y2xpY0luaXRpYWxpemF0aW9uRXJyb3JSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uUmVhZGluZyBzdGF0aWMgdmFyaWFibGUgJycgZHVyaW5nIGl0cyBpbml0aWFsaXphdGlvbl9FeGNlcHRpb25FeGNlcHRpb246IEZvcm1hdEV4Y2VwdGlvbm9iamVjdFNvdXJjZWxpbmVOdW1wcmV2aW91c0NoYXJXYXNDUiAoYXQgbGluZSAsIGNoYXJhY3RlciApCiAoYXQgY2hhcmFjdGVyIHNsaWNlbWFya09mZnNldCAoYXQgb2Zmc2V0IEludGVnZXJEaXZpc2lvbkJ5WmVyb0V4Y2VwdGlvbkV4cGFuZG9fbWluU2l6ZV9kZWxldGVkRW50cnlvbGRfZGF0YW5ld19zaXplRXhwYW5kb3MgYXJlIG5vdCBhbGxvd2VkIG9uIHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zIG9yIG51bGxfbGltaXRFeHBhbmRvOndwZW1wdHlfaWR4X2FwcGx5RnVuY3Rpb25fYXBwbHlfUEFSU0VfTElNSVRTMTA3Mzc0MTgyNDQ2MTE2ODYwMTg0MjczODc5MDQ0MDUyNTU1MTUzMDE4OTc2MjY3MTE1MjkyMTUwNDYwNjg0Njk3NjE0OTAxMTYxMTkzODQ3NjU2MjU3ODk3MzAyMjMwNTM2MDI4MTYzOTA5ODIxMDQ4NTgyOTg4MDQ5MTM1MDg1MTcxNzY3Mjk5MjA4OTEwMDAwMDAwMDAwMDAwMDAwMDA1MDU0NDcwMjg0OTkyOTM3NzEyMjE4NjExMTA2NzQwNDM2OTkyNjY1NDE2NjA5MTgzMTc5ODQxMjE3Nzk1MzMzNzgwOTM3MTEzNjQzNzg5Mzg5MDM4MDg1OTM3NTI4NjI0MjMwNTE1MDk4MTU3OTMzNzQ4MTMzNjc1ODIwODEwMjQ3OTkwMDY2ODU3ODI4ODQxMjExNjM4NDAwMDAwMDAwMDAwMDAwMzI0MzkxOTkzMjUyMTUwODY4MTI4MjgxMDA1Nzg4MzA4Mjc1MjUwNDAzNjM2MTkzNjQ2NzM4Mzg3NjQ4ODMzODQ2NTM1NzgyNDI0ODExNTI4NzMyMDM3MzY1NzYyMzIyMTgyNjUwODkyMTI0MTYzNTM4MTQ3ODMyMDU0NjkwNDE1MzE0NDEwMDAwMDAwMDAwMDA3ODc2NjI3ODM3ODg1NDk3NjExNjY3ODg5NTE0OTUyOTg0OTYxMjM4NjQyMDY4MzY5MzEwMTA1NjMzNzkyMjA1MDgwNTY2NDA2MjUxMzE2MjE3MDM4NDIyNjcxMzZfbWF4SW50NjRfbWluSW50NjRfaW50NjRVbnNpZ25lZE92ZXJmbG93TGltaXRzNjg3MTk0NzY3MzVfaW50NjRVbnNpZ25lZFNtaU92ZXJmbG93TGltaXRzMTE1MjkyMTUwNDYwNjg0Njk3NV9pbnQ2NE92ZXJmbG93TGltaXRzX3RyeVBhcnNlU21paXhzbWlMaW1pdF9rTnVsbF90aHJvd0Zvcm1hdEV4Y2VwdGlvbkludmFsaWQgbnVtYmVySW52YWxpZCByYWRpeC0gbnVtYmVyYWxsb3dVNjR0YWJsZUluZGV4c21hbGxCbG9ja1NpemVibG9ja0VuZG11bHRpcGxpZXJwb3NpdGl2ZU92ZXJmbG93TGltaXRuZWdhdGl2ZU92ZXJmbG93TGltaXRQb3NpdGl2ZSBpbnB1dCBleGNlZWRzIHRoZSBsaW1pdCBvZiBpbnRlZ2VyTmVnYXRpdmUgaW5wdXQgZXhjZWVkcyB0aGUgbGltaXQgb2YgaW50ZWdlcl9wYXJzZUJsb2NrX2luaXRJbnQ2NE92ZXJmbG93TGltaXRzSW50ZWdlcl9mcm9tRW52aXJvbm1lbnRUaGUgc291cmNlIG11c3Qgbm90IGJlIG51bGxSYWRpeCAgbm90IGluIHJhbmdlIDIuLjM2Z2VuZXJpY01ldGhvZF9JbnZvY2F0aW9uX3Bvc2l0aW9uYWxfbmFtZWRfZW5zdXJlTm9uTnVsbFR5cGVzVHlwZSBhcmd1bWVudHMgbXVzdCBiZSBub24tbnVsbCwgd2FzIG51bGwgYXQgaW5kZXggX21ha2VVbm1vZGlmaWFibGVfR2VuZXJhdG9ySXRlcmFibGVCaWRpcmVjdGlvbmFsSXRlcmF0b3Jtb3ZlUHJldmlvdXNfZnJvbUxpdGVyYWxMaXN0X25ld2NvcHlSYW5nZU5vdCBiaWcgZW5vdWdoIHRvIGhvbGQgIGVsZW1lbnRzIGF0IHBvc2l0aW9uIHdyaXRlSXRlcmFibGV0YXJnZXRMZW5ndGhNYXBFbnRyeShfSEFTSF9DT0RFY2xhc3MgTnVsbCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkX3JldHVybkludE51bGxfcmV0dXJuRG91YmxlTnVsbF9oYXNoQ29kZVJuZF9vYmplY3RIYXNoQ29kZU9iamVjdF90b1N0cmluZ19oYXZlU2FtZVJ1bnRpbWVUeXBlT2JqZWN0X2hhdmVTYW1lUnVudGltZVR5cGVfaW5zdGFuY2VPZk9iamVjdF9pbnN0YW5jZU9maW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50c19zaW1wbGVJbnN0YW5jZU9mT2JqZWN0X3NpbXBsZUluc3RhbmNlT2Zfc2ltcGxlSW5zdGFuY2VPZlRydWVfc2ltcGxlSW5zdGFuY2VPZkZhbHNlT2JqZWN0X2VxdWFsc2RhcnQ6Y29yZSNfVHlwZU9iamVjdF9ydW50aW1lVHlwZU1hdGNoZ3JvdXBJbmRpY2VzX01BWF9DQUNIRV9TSVpFX3JlY2VudGx5VXNlZF9maW5kRXNjYXBlQ2hhcgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBZXNjYXBlQ2hhckluZGV4cHJldmlvdXNTbGljZUVuZEluZGV4Mi40UmVnRXhwTWF0Y2hTaW5rc3RhY2tUcmFjZVN0cmluZ1N0YWNrVHJhY2VfY3VycmVudF9TdHJpbmdTdGFja1RyYWNlU3RvcHdhdGNoX2ZyZXF1ZW5jeV9jb21wdXRlRnJlcXVlbmN5U3RvcHdhdGNoX2ZyZXF1ZW5jeWVsYXBzZWRUaWNrc3RpY2tzdGlja3NQZXJTZWNvbmRyZW1haW5pbmdUaWNrc19pbml0VGlja2VyU3RvcHdhdGNoX25vd2Zyb21DaGFyQ29kZXNmcm9tQ2hhckNvZGVTdHJpbmdfZnJvbUVudmlyb25tZW50UnVuZXNObyBlbGVtZW50cy5wcmV2aW91c0NvZGVSdW5lSXRlcmF0b3JfbmV4dFBvc2l0aW9uX2N1cnJlbnRDb2RlUG9pbnRfY2hlY2tTcGxpdFN1cnJvZ2F0ZUluZGV4IGluc2lkZSBzdXJyb2dhdGUgcGFpcjogcmF3SW5kZXhjdXJyZW50U2l6ZWN1cnJlbnRBc1N0cmluZ3ByZXZDb2RlVW5pdFN0cmluZ0J1ZmZlcl9CVUZGRVJfU0laRV9QQVJUU19UT19DT01QQUNUX1BBUlRTX1RPX0NPTVBBQ1RfU0laRV9MSU1JVF9wYXJ0c0NvZGVVbml0c19wYXJ0c0NvbXBhY3Rpb25JbmRleF9wYXJ0c0NvZGVVbml0c1NpbmNlQ29tcGFjdGlvbl9idWZmZXJQb3NpdGlvbl9idWZmZXJDb2RlVW5pdE1hZ25pdHVkZV9jb25zdW1lQnVmZmVyX2FkZFBhcnRwYXJ0c1NpbmNlQ29tcGFjdGlvbl9jb21wYWN0Y29tcGFjdGVkU3RyaW5nQnVmZmVyX2NyZWF0ZVN0cmluZ0Zyb21VaW50MTZBcnJheVN0cmluZ1NpbmtVcmlhdXRob3JpdHl1bmVuY29kZWRQYXRoZGF0YUZyb21TdHJpbmdkYXRhRnJvbUJ5dGVzYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtcGVyY2VudEVuY29kZWRxdWVyeVBhcmFtZXRlcnNBbGxoYXNQb3J0aGFzQWJzb2x1dGVQYXRocmVtb3ZlRnJhZ21lbnRkYXRhRGVsdGFzY2hlbWVFbmRob3N0U3RhcnRwb3J0U3RhcnRwYXRoU3RhcnRxdWVyeVN0YXJ0ZnJhZ21lbnRTdGFydGlzU2ltcGxlLy4uc2NoZW1lQXV0aGZpbGU6Ly9maWxlOi8vLzQ0M2VuY29kZUNvbXBvbmVudGVuY29kZVF1ZXJ5Q29tcG9uZW50ZGVjb2RlQ29tcG9uZW50ZW5jb2RlZENvbXBvbmVudGRlY29kZVF1ZXJ5Q29tcG9uZW50ZW5jb2RlRnVsbGRlY29kZUZ1bGxzcGxpdFF1ZXJ5U3RyaW5ncGFyc2VJUHY0QWRkcmVzc19wYXJzZUlQdjRBZGRyZXNzSWxsZWdhbCBJUHY0IGFkZHJlc3MsIHBhcnRJbmRleHBhcnRTdGFydGludmFsaWQgY2hhcmFjdGVySVB2NCBhZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0c2VhY2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSAwLi4yNTVwYXJzZUlQdjZBZGRyZXNzSWxsZWdhbCBJUHY2IGFkZHJlc3MsIHBhcnNlSGV4YW4gSVB2NiBwYXJ0IGNhbiBvbmx5IGNvbnRhaW4gYSBtYXhpbXVtIG9mIDQgaGV4IGRpZ2l0c2VhY2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiBgMHgwLi4weEZGRkZgYWRkcmVzcyBpcyB0b28gc2hvcnR3aWxkY2FyZFNlZW5zZWVuRG90aW52YWxpZCBzdGFydCBjb2xvbi5vbmx5IG9uZSB3aWxkY2FyZCBgOjpgIGlzIGFsbG93ZWR0b28gZmV3IHBhcnRzYXRFbmRpc0xhc3RXaWxkY2FyZGV4cGVjdGVkIGEgcGFydCBhZnRlciBsYXN0IGA6YGFuIGFkZHJlc3Mgd2l0aCBhIHdpbGRjYXJkIG11c3QgaGF2ZSBsZXNzIHRoYW4gNyBwYXJ0c2FuIGFkZHJlc3Mgd2l0aG91dCBhIHdpbGRjYXJkIG11c3QgY29udGFpbiBleGFjdGx5IDggcGFydHN3aWxkQ2FyZExlbmd0aF9VcmlfaXNXaW5kb3dzQ2FjaGVkX3VzZXJJbmZvX3F1ZXJ5X2ZyYWdtZW50X3BhdGhTZWdtZW50c19oYXNoQ29kZUNhY2hlX3F1ZXJ5UGFyYW1ldGVyc19xdWVyeVBhcmFtZXRlckxpc3RzX3VucmVzZXJ2ZWRUYWJsZV91bnJlc2VydmVkMjM5NlRhYmxlX2VuY29kZUZ1bGxUYWJsZV9zY2hlbWVUYWJsZV9zY2hlbWVMb3dlclRhYmxlX3N1YkRlbGltaXRlcnNUYWJsZV9nZW5EZWxpbWl0ZXJzVGFibGVfdXNlcmluZm9UYWJsZV9yZWdOYW1lVGFibGVfcGF0aENoYXJUYWJsZV9wYXRoQ2hhck9yU2xhc2hUYWJsZV9xdWVyeUNoYXJUYWJsZV96b25lSURUYWJsZV9pc1dpbmRvd3NQbGF0Zm9ybVVyaV9pc1dpbmRvd3NQbGF0Zm9ybW5vdFNpbXBsZUludmFsaWQgZW1wdHkgc2NoZW1ldXNlckluZm9TdGFydEludmFsaWQgcG9ydGFsbG93U2NoZW1lX3dyaXRlQXV0aG9yaXR5X2RlZmF1bHRQb3J0dGhpc1NjaGVtZV9jb21wYXJlU2NoZW1lc2NoZW1lQ2hhcnVyaUNoYXJsb3dlckNoYXJfbWFrZUh0dHBVcmloYXNVc2VySW5mb2hvc3RFbmRlc2NhcGVGb3Jab25lSURJbnZhbGlkIElQdjYgaG9zdCBlbnRyeS5JbnZhbGlkIGVuZCBvZiBhdXRob3JpdHlwb3J0U3RyaW5nX2NoZWNrTm9uV2luZG93c1BhdGhSZXNlcnZlZENoYXJhY3RlcnNzZWdtZW50c2FyZ3VtZW50RXJyb3JJbGxlZ2FsIHBhdGggY2hhcmFjdGVyIF9jaGVja1dpbmRvd3NQYXRoUmVzZXJ2ZWRDaGFyYWN0ZXJzZmlyc3RTZWdtZW50WyIqLzo8Pj9cXHxdSWxsZWdhbCBjaGFyYWN0ZXIgaW4gcGF0aElsbGVnYWwgY2hhcmFjdGVyIGluIHBhdGg6IF9jaGVja1dpbmRvd3NEcml2ZUxldHRlcklsbGVnYWwgZHJpdmUgbGV0dGVyIF9tYWtlRmlsZVVyaXNsYXNoVGVybWluYXRlZF9tYWtlV2luZG93c0ZpbGVVcmxcXD9cVU5DXFdpbmRvd3MgcGF0aHMgd2l0aCBcXD9cIHByZWZpeCBtdXN0IGJlIGFic29sdXRlV2luZG93cyBwYXRocyB3aXRoIGRyaXZlIGxldHRlciBtdXN0IGJlIGFic29sdXRlaG9zdFBhcnRwYXRoUGFydHNjaGVtZUNoYW5nZWRwYXRoVG9TcGxpdHF1ZXJ5UGFyYW1ldGVyTGlzdHNfbWFrZVBvcnRfbWFrZUhvc3RzdHJpY3RJUHY2TWlzc2luZyBlbmQgYF1gIHRvIG1hdGNoIGBbYCBpbiBob3N0em9uZUlEem9uZUlEc3RhcnQlMjVfY2hlY2tab25lSURfaXNab25lSURDaGFyX25vcm1hbGl6ZVpvbmVJRHNlY3Rpb25TdGFydFpvbmVJRCBzaG91bGQgbm90IGNvbnRhaW4gJSBhbnltb3JlX2lzUmVnTmFtZUNoYXJfbm9ybWFsaXplUmVnTmFtZV9tYWtlU2NoZW1lZmlyc3RDb2RlVW5pdFNjaGVtZSBub3Qgc3RhcnRpbmcgd2l0aCBhbHBoYWJldGljIGNoYXJhY3RlcmNvbnRhaW5zVXBwZXJDYXNlSWxsZWdhbCBzY2hlbWUgY2hhcmFjdGVyX2Nhbm9uaWNhbGl6ZVNjaGVtZV9tYWtlVXNlckluZm9fbWFrZVBhdGhlbnN1cmVMZWFkaW5nU2xhc2hCb3RoIHBhdGggYW5kIHBhdGhTZWdtZW50cyBzcGVjaWZpZWRlc2NhcGVEZWxpbWl0ZXJzX25vcm1hbGl6ZVBhdGhfbWFrZVF1ZXJ5Qm90aCBxdWVyeSBhbmQgcXVlcnlQYXJhbWV0ZXJzIHNwZWNpZmllZHdyaXRlUGFyYW1ldGVyX21ha2VGcmFnbWVudF9ub3JtYWxpemVFc2NhcGVsb3dlckNhc2VmaXJzdERpZ2l0VmFsdWVzZWNvbmREaWdpdFZhbHVlX2VzY2FwZUNoYXIwMTIzNDU2Nzg5QUJDREVGZW5jb2RlZEJ5dGVzX25vcm1hbGl6ZU9yU3Vic3RyaW5nY2hhclRhYmxlX2lzU2NoZW1lQ2hhcmFjdGVyX2lzR2VuZXJhbERlbGltaXRlcl9tZXJnZVBhdGhzYmFja0NvdW50cmVmU3RhcnRiYXNlRW5kX21heUNvbnRhaW5Eb3RTZWdtZW50cy8uX3JlbW92ZURvdFNlZ21lbnRzX25vcm1hbGl6ZVJlbGF0aXZlUGF0aF9lc2NhcGVTY2hlbWUlM0F0YXJnZXRTY2hlbWV0YXJnZXRVc2VySW5mb3RhcmdldEhvc3R0YXJnZXRQb3J0dGFyZ2V0UGF0aHRhcmdldFF1ZXJ5bWVyZ2VkUGF0aENhbm5vdCB1c2Ugb3JpZ2luIHdpdGhvdXQgYSBzY2hlbWU6IE9yaWdpbiBpcyBvbmx5IGFwcGxpY2FibGUgc2NoZW1lcyBodHRwIGFuZCBodHRwczogOiBVUkkgc2hvdWxkIGhhdmUgYSBub24tZW1wdHkgaG9zdCBuYW1lOiA6Ly9DYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgIFVSSUNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIHF1ZXJ5IGNvbXBvbmVudENhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIGZyYWdtZW50IGNvbXBvbmVudF90b0ZpbGVQYXRoQ2Fubm90IGV4dHJhY3QgYSBub24tV2luZG93cyBmaWxlIHBhdGggZnJvbSBhIGZpbGUgVVJJIHdpdGggYW4gYXV0aG9yaXR5X3RvV2luZG93c0ZpbGVQYXRoaGFzRHJpdmVMZXR0ZXJfaXNQYXRoQWJzb2x1dGVzc19pbml0aWFsaXplVGV4dF9zcGxpdFF1ZXJ5U3RyaW5nQWxscGFyc2VQYWlyX3VyaUVuY29kZWNhbm9uaWNhbFRhYmxlc3BhY2VUb1BsdXNfaGV4Q2hhclBhaXJUb0J5dGVJbnZhbGlkIFVSTCBlbmNvZGluZ191cmlEZWNvZGVwbHVzVG9TcGFjZUlsbGVnYWwgcGVyY2VudCBlbmNvZGluZyBpbiBVUklUcnVuY2F0ZWQgVVJJX2lzQWxwaGFiZXRpY0NoYXJhY3Rlcl9pc1VucmVzZXJ2ZWRDaGFyVXJpRGF0YV9ub1NjaGVtZV9zZXBhcmF0b3JJbmRpY2VzX3VyaUNhY2hlX2Jhc2U2NF90b2tlbkNoYXJUYWJsZV91cmljVGFibGVfYmFzZTY0VGFibGVjaGFyc2V0TmFtZWVuY29kaW5nTmFtZTtiYXNlNjQsZnJvbUJ5dGVzU2NoZW1lIG11c3QgYmUgJ2RhdGEnRGF0YSB1cmkgbXVzdCBub3QgaGF2ZSBhdXRob3JpdHlEYXRhIHVyaSBtdXN0IG5vdCBoYXZlIGEgZnJhZ21lbnQgcGFydHNsYXNoSW5kZXhJbnZhbGlkIE1JTUUgdHlwZTtjaGFyc2V0PVBhcmFtZXRlciBuYW1lcyBtdXN0IG5vdCBiZSBlbXB0eVBhcmFtZXRlciB2YWx1ZXMgbXVzdCBub3QgYmUgZW1wdHlwYXJhbWV0ZXJzWyJfdmFsaWRhdGVNaW1lVHlwZURvZXMgbm90IHN0YXJ0IHdpdGggJ2RhdGE6J2NvbG9uSW5kZXhxdWVyeUluZGV4cGFyYW1ldGVyU3RhcnRwYXJhbWV0ZXJFbmRpc0Jhc2U2NGtleVN0YXJ0a2V5RW5kY29udGVudFRleHRJbnZhbGlkIHBlcmNlbnQgZXNjYXBlVW5rbm93biBjaGFyc2V0OiBsYXN0U2VwYXJhdG9yRXhwZWN0aW5nICc9J191cmlFbmNvZGVCeXRlc25vbi1ieXRlIHZhbHVlX1NpbXBsZVVyaV9zY2hlbWVFbmRfaG9zdFN0YXJ0X3BvcnRTdGFydF9wYXRoU3RhcnRfcXVlcnlTdGFydF9mcmFnbWVudFN0YXJ0X3NjaGVtZUNhY2hlX2lzRmlsZV9pc0h0dHBfaXNIdHRwc19pc1BhY2thZ2VfaXNTY2hlbWVpc0h0dHBPcmlnaW4gaXMgb25seSBhcHBsaWNhYmxlIHRvIHNjaGVtZXMgaHR0cCBhbmQgaHR0cHM6IF9pc1BvcnRwb3J0RGlnaXRTdGFydF9zaW1wbGVNZXJnZV90b05vblNpbXBsZW5ld1VyaXJlZlVyaWJhc2VTdGFydHJlZkVuZF9EYXRhVXJpX291dHN0YW5kaW5nTG9hZFJlcXVlc3RzX21heEFzY2lpX21heExhdGluMV9tYXhVdGYxNl9tYXhVbmljb2RlcHJvdmlzaW9uYWxwcm94eV9QRVJDRU5UX0FNUEVSU0FORF9QTFVTX1NMQVNIX0VRVUFMU19VUFBFUl9DQVNFX0FfVVBQRVJfQ0FTRV9aX0xFRlRfQlJBQ0tFVF9CQUNLU0xBU0hfUklHSFRfQlJBQ0tFVF9MT1dFUl9DQVNFX0FfTE9XRVJfQ0FTRV9GX0xPV0VSX0NBU0VfWl9oZXhEaWdpdHNfc2NoZW1lRW5kSW5kZXhfaG9zdFN0YXJ0SW5kZXhfcG9ydFN0YXJ0SW5kZXhfcGF0aFN0YXJ0SW5kZXhfcXVlcnlTdGFydEluZGV4X2ZyYWdtZW50U3RhcnRJbmRleF9ub3RTaW1wbGVJbmRleF91cmlTdGFydF9ub25TaW1wbGVFbmRTdGF0ZXNfc2NoZW1lU3RhcnRfc2Nhbm5lclRhYmxlc19tYXhfbWluX25ld0RpZ2l0c19jb21wbGV0ZURlZmVycmVkTG9hZHNzdGlsbE91dHN0YW5kaW5nTG9hZFJlcXVlc3Rzb3V0c3RhbmRpbmdSZXF1ZXN0c19nZXRIYXNoT2JqZWN0X2dldEhhc2hfc2V0SGFzaE9iamVjdF9zZXRIYXNoX3Vuc3VwcG9ydGVkVXJpQmFzZSdVcmkuYmFzZScgaXMgbm90IHN1cHBvcnRlZElkZW50aWNhbF9jb21wYXJpc29uaWRlbnRpdHlIYXNoQ29kZV9jcmVhdGVUYWJsZXN0YWJsZXNkZWZhdWx0VHJhbnNpdGlvbnNldENoYXJzdHJhbnNpdGlvbjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LS5ffiEkJicoKSorLDs9QVowOWF6Ky0uX3NjYW5fc3RhcnRzV2l0aERhdGFfc3RyaW5nT3JOdWxsTGVuZ3RoZGFydC5faHR0cGNyeXB0by5kYXJ0aHR0cF9kYXRlLmRhcnRodHRwX2hlYWRlcnMuZGFydGh0dHBfaW1wbC5kYXJ0aHR0cF9wYXJzZXIuZGFydGh0dHBfc2Vzc2lvbi5kYXJ0d2Vic29ja2V0LmRhcnR3ZWJzb2NrZXRfaW1wbC5kYXJ0X0J5dGVzQ29uc3VtZXJCYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrY3JfUHJvdG9jb2xTZWxlY3Rvckh0dHBTZXJ2ZXJzZXJ2ZXJIZWFkZXJhdXRvQ29tcHJlc3NpZGxlVGltZW91dGRlZmF1bHRSZXNwb25zZUhlYWRlcnNiaW5kU2VjdXJlbGlzdGVuT25zZXNzaW9uVGltZW91dGNvbm5lY3Rpb25zSW5mb0h0dHBDb25uZWN0aW9uc0luZm9pZGxlSHR0cEhlYWRlcnNhY2NlcHRIZWFkZXJhY2NlcHRDaGFyc2V0SGVhZGVyYWNjZXB0LWNoYXJzZXRhY2NlcHRFbmNvZGluZ0hlYWRlcmFjY2VwdC1lbmNvZGluZ2FjY2VwdExhbmd1YWdlSGVhZGVyYWNjZXB0LWxhbmd1YWdlYWNjZXB0UmFuZ2VzSGVhZGVyYWNjZXB0LXJhbmdlc2FnZUhlYWRlcmFnZWFsbG93SGVhZGVyYWxsb3dhdXRob3JpemF0aW9uSGVhZGVyYXV0aG9yaXphdGlvbmNhY2hlQ29udHJvbEhlYWRlcmNhY2hlLWNvbnRyb2xjb25uZWN0aW9uSGVhZGVyY29udGVudEVuY29kaW5nSGVhZGVyY29udGVudC1lbmNvZGluZ2NvbnRlbnRMYW5ndWFnZUhlYWRlcmNvbnRlbnQtbGFuZ3VhZ2Vjb250ZW50TGVuZ3RoSGVhZGVyY29udGVudC1sZW5ndGhjb250ZW50TG9jYXRpb25IZWFkZXJjb250ZW50LWxvY2F0aW9uY29udGVudE1ENUhlYWRlcmNvbnRlbnQtbWQ1Y29udGVudFJhbmdlSGVhZGVyY29udGVudC1yYW5nZWNvbnRlbnRUeXBlSGVhZGVyY29udGVudC10eXBlZGF0ZUhlYWRlcmV0YWdIZWFkZXJldGFnZXhwZWN0SGVhZGVyZXhwZWN0ZXhwaXJlc0hlYWRlcmZyb21IZWFkZXJob3N0SGVhZGVyaWZNYXRjaEhlYWRlcmlmLW1hdGNoaWZNb2RpZmllZFNpbmNlSGVhZGVyaWYtbW9kaWZpZWQtc2luY2VpZk5vbmVNYXRjaEhlYWRlcmlmLW5vbmUtbWF0Y2hpZlJhbmdlSGVhZGVyaWYtcmFuZ2VpZlVubW9kaWZpZWRTaW5jZUhlYWRlcmlmLXVubW9kaWZpZWQtc2luY2VsYXN0TW9kaWZpZWRIZWFkZXJsYXN0LW1vZGlmaWVkbG9jYXRpb25IZWFkZXJtYXhGb3J3YXJkc0hlYWRlcm1heC1mb3J3YXJkc3ByYWdtYUhlYWRlcnByb3h5QXV0aGVudGljYXRlSGVhZGVycHJveHktYXV0aGVudGljYXRlcHJveHlBdXRob3JpemF0aW9uSGVhZGVycHJveHktYXV0aG9yaXphdGlvbnJhbmdlSGVhZGVycmVmZXJlckhlYWRlcnJlZmVyZXJyZXRyeUFmdGVySGVhZGVycmV0cnktYWZ0ZXJ0ZUhlYWRlcnRldHJhaWxlckhlYWRlcnRyYWlsZXJ0cmFuc2ZlckVuY29kaW5nSGVhZGVydHJhbnNmZXItZW5jb2Rpbmd1cGdyYWRlSGVhZGVydXBncmFkZXVzZXJBZ2VudEhlYWRlcnVzZXItYWdlbnR2YXJ5SGVhZGVydmFyeXZpYUhlYWRlcndhcm5pbmdIZWFkZXJ3d3dBdXRoZW50aWNhdGVIZWFkZXJ3d3ctYXV0aGVudGljYXRlQUNDRVBUVXNlIGFjY2VwdEhlYWRlciBpbnN0ZWFkQUNDRVBUX0NIQVJTRVRVc2UgYWNjZXB0Q2hhcnNldEhlYWRlciBpbnN0ZWFkQUNDRVBUX0VOQ09ESU5HVXNlIGFjY2VwdEVuY29kaW5nSGVhZGVyIGluc3RlYWRBQ0NFUFRfTEFOR1VBR0VVc2UgYWNjZXB0TGFuZ3VhZ2VIZWFkZXIgaW5zdGVhZEFDQ0VQVF9SQU5HRVNVc2UgYWNjZXB0UmFuZ2VzSGVhZGVyIGluc3RlYWRBR0VVc2UgYWdlSGVhZGVyIGluc3RlYWRBTExPV1VzZSBhbGxvd0hlYWRlciBpbnN0ZWFkQVVUSE9SSVpBVElPTlVzZSBhdXRob3JpemF0aW9uSGVhZGVyIGluc3RlYWRDQUNIRV9DT05UUk9MVXNlIGNhY2hlQ29udHJvbEhlYWRlciBpbnN0ZWFkQ09OTkVDVElPTlVzZSBjb25uZWN0aW9uSGVhZGVyIGluc3RlYWRDT05URU5UX0VOQ09ESU5HVXNlIGNvbnRlbnRFbmNvZGluZ0hlYWRlciBpbnN0ZWFkQ09OVEVOVF9MQU5HVUFHRVVzZSBjb250ZW50TGFuZ3VhZ2VIZWFkZXIgaW5zdGVhZENPTlRFTlRfTEVOR1RIVXNlIGNvbnRlbnRMZW5ndGhIZWFkZXIgaW5zdGVhZENPTlRFTlRfTE9DQVRJT05Vc2UgY29udGVudExvY2F0aW9uSGVhZGVyIGluc3RlYWRDT05URU5UX01ENVVzZSBjb250ZW50TUQ1SGVhZGVyIGluc3RlYWRDT05URU5UX1JBTkdFVXNlIGNvbnRlbnRSYW5nZUhlYWRlciBpbnN0ZWFkQ09OVEVOVF9UWVBFVXNlIGNvbnRlbnRUeXBlSGVhZGVyIGluc3RlYWREQVRFVXNlIGRhdGVIZWFkZXIgaW5zdGVhZEVUQUdVc2UgZXRhZ0hlYWRlciBpbnN0ZWFkRVhQRUNUVXNlIGV4cGVjdEhlYWRlciBpbnN0ZWFkRVhQSVJFU1VzZSBleHBpcmVzSGVhZGVyIGluc3RlYWRGUk9NVXNlIGZyb21IZWFkZXIgaW5zdGVhZEhPU1RVc2UgaG9zdEhlYWRlciBpbnN0ZWFkSUZfTUFUQ0hVc2UgaWZNYXRjaEhlYWRlciBpbnN0ZWFkSUZfTU9ESUZJRURfU0lOQ0VVc2UgaWZNb2RpZmllZFNpbmNlSGVhZGVyIGluc3RlYWRJRl9OT05FX01BVENIVXNlIGlmTm9uZU1hdGNoSGVhZGVyIGluc3RlYWRJRl9SQU5HRVVzZSBpZlJhbmdlSGVhZGVyIGluc3RlYWRJRl9VTk1PRElGSUVEX1NJTkNFVXNlIGlmVW5tb2RpZmllZFNpbmNlSGVhZGVyIGluc3RlYWRMQVNUX01PRElGSUVEVXNlIGxhc3RNb2RpZmllZEhlYWRlciBpbnN0ZWFkTE9DQVRJT05Vc2UgbG9jYXRpb25IZWFkZXIgaW5zdGVhZE1BWF9GT1JXQVJEU1VzZSBtYXhGb3J3YXJkc0hlYWRlciBpbnN0ZWFkUFJBR01BVXNlIHByYWdtYUhlYWRlciBpbnN0ZWFkUFJPWFlfQVVUSEVOVElDQVRFVXNlIHByb3h5QXV0aGVudGljYXRlSGVhZGVyIGluc3RlYWRQUk9YWV9BVVRIT1JJWkFUSU9OVXNlIHByb3h5QXV0aG9yaXphdGlvbkhlYWRlciBpbnN0ZWFkUkFOR0VVc2UgcmFuZ2VIZWFkZXIgaW5zdGVhZFJFRkVSRVJVc2UgcmVmZXJlckhlYWRlciBpbnN0ZWFkUkVUUllfQUZURVJVc2UgcmV0cnlBZnRlckhlYWRlciBpbnN0ZWFkU0VSVkVSVXNlIHNlcnZlckhlYWRlciBpbnN0ZWFkVEVVc2UgdGVIZWFkZXIgaW5zdGVhZFRSQUlMRVJVc2UgdHJhaWxlckhlYWRlciBpbnN0ZWFkVFJBTlNGRVJfRU5DT0RJTkdVc2UgdHJhbnNmZXJFbmNvZGluZ0hlYWRlciBpbnN0ZWFkVVBHUkFERVVzZSB1cGdyYWRlSGVhZGVyIGluc3RlYWRVU0VSX0FHRU5UVXNlIHVzZXJBZ2VudEhlYWRlciBpbnN0ZWFkVkFSWVVzZSB2YXJ5SGVhZGVyIGluc3RlYWRWSUFVc2UgdmlhSGVhZGVyIGluc3RlYWRVc2Ugd2FybmluZ0hlYWRlciBpbnN0ZWFkV1dXX0FVVEhFTlRJQ0FURVVzZSB3d3dBdXRoZW50aWNhdGVIZWFkZXIgaW5zdGVhZGNvb2tpZUhlYWRlcmNvb2tpZXNldENvb2tpZUhlYWRlcnNldC1jb29raWVDT09LSUVVc2UgY29va2llSGVhZGVyIGluc3RlYWRTRVRfQ09PS0lFVXNlIHNldENvb2tpZUhlYWRlciBpbnN0ZWFkZ2VuZXJhbEhlYWRlcnNHRU5FUkFMX0hFQURFUlNVc2UgZ2VuZXJhbEhlYWRlcnMgaW5zdGVhZGVudGl0eUhlYWRlcnNFTlRJVFlfSEVBREVSU1VzZSBlbnRpdHlIZWFkZXJzIGluc3RlYWRyZXNwb25zZUhlYWRlcnNSRVNQT05TRV9IRUFERVJTVXNlIHJlc3BvbnNlSGVhZGVycyBpbnN0ZWFkcmVxdWVzdEhlYWRlcnNSRVFVRVNUX0hFQURFUlNVc2UgcmVxdWVzdEhlYWRlcnMgaW5zdGVhZGlmTW9kaWZpZWRTaW5jZWNvbnRlbnRMZW5ndGhjaHVua2VkVHJhbnNmZXJFbmNvZGluZ25vRm9sZGluZ0hlYWRlclZhbHVlcGFyYW1ldGVyU2VwYXJhdG9ydmFsdWVTZXBhcmF0b3JwcmVzZXJ2ZUJhY2tzbGFzaEh0dHBTZXNzaW9ucGxhaW5URVhUVXNlIHRleHQgaW5zdGVhZEhUTUxVc2UgaHRtbCBpbnN0ZWFkSlNPTlVzZSBqc29uIGluc3RlYWRvY3RldC1zdHJlYW1Vc2UgYmluYXJ5IGluc3RlYWRwcmltYXJ5VHlwZXN1YlR5cGVDb29raWVtYXhBZ2VodHRwT25seWZyb21TZXRDb29raWVWYWx1ZUh0dHBSZXF1ZXN0cmVxdWVzdGVkVXJpY29va2llc3Nlc3Npb25wcm90b2NvbFZlcnNpb25IdHRwUmVzcG9uc2VkZWFkbGluZWRldGFjaFNvY2tldHdyaXRlSGVhZGVyc2RlZmF1bHRIdHRwUG9ydERFRkFVTFRfSFRUUF9QT1JUVXNlIGRlZmF1bHRIdHRwUG9ydCBpbnN0ZWFkZGVmYXVsdEh0dHBzUG9ydERFRkFVTFRfSFRUUFNfUE9SVFVzZSBkZWZhdWx0SHR0cHNQb3J0IGluc3RlYWRjb25uZWN0aW9uVGltZW91dGF1dG9VbmNvbXByZXNzdXNlckFnZW50Y3JlYXRlSHR0cENsaWVudG9wZW5VcmxwdXRVcmxkZWxldGVVcmxwYXRjaFVybGhlYWRVcmxhdXRoZW50aWNhdGVhZGRDcmVkZW50aWFsc3JlYWxtY3JlZGVudGlhbHNmaW5kUHJveHlmaW5kUHJveHlGcm9tRW52aXJvbm1lbnRhdXRoZW50aWNhdGVQcm94eWFkZFByb3h5Q3JlZGVudGlhbHNiYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrZm9sbG93UmVkaXJlY3RzbWF4UmVkaXJlY3RzSHR0cENsaWVudFJlc3BvbnNlY29tcHJlc3Npb25TdGF0ZWlzUmVkaXJlY3RyZWRpcmVjdHNmb2xsb3dMb29wc0h0dHBDbGllbnRSZXNwb25zZUNvbXByZXNzaW9uU3RhdGVIdHRwQ2xpZW50UmVzcG9uc2VDb21wcmVzc2lvblN0YXRlLm5vdENvbXByZXNzZWRIdHRwQ2xpZW50UmVzcG9uc2VDb21wcmVzc2lvblN0YXRlLmRlY29tcHJlc3NlZEh0dHBDbGllbnRSZXNwb25zZUNvbXByZXNzaW9uU3RhdGUuY29tcHJlc3NlZG5vdENvbXByZXNzZWRkZWNvbXByZXNzZWRjb21wcmVzc2VkSHR0cENsaWVudENyZWRlbnRpYWxzSHR0cENsaWVudEJhc2ljQ3JlZGVudGlhbHN1c2VybmFtZUh0dHBDbGllbnREaWdlc3RDcmVkZW50aWFsc0h0dHBDb25uZWN0aW9uSW5mb1JlZGlyZWN0SW5mb0RldGFjaGVkU29ja2V0dW5wYXJzZWREYXRhSHR0cEV4Y2VwdGlvbkh0dHBFeGNlcHRpb246ICwgdXJpID0gUmVkaXJlY3RFeGNlcHRpb25SZWRpcmVjdEV4Y2VwdGlvbjogX0NyeXB0b1V0aWxzUEFEQ1JMRkxJTkVfTEVOR1RIX2VuY29kZVRhYmxlX2VuY29kZVRhYmxlVXJsU2FmZV9kZWNvZGVUYWJsZV9ybmdieXRlc1RvSGV4Ynl0ZXNUb0Jhc2U2NGFkZExpbmVTZXBhcmF0b3JjaHVua0xlbmd0aG91dHB1dExlbmJhc2U2NFN0cmluZ1RvQnl0ZXNpZ25vcmVJbnZhbGlkQ2hhcmFjdGVyc2V4dHJhc0xlbkludmFsaWQgY2hhcmFjdGVyOiBTaXplIG9mIEJhc2UgNjQgY2hhcmFjdGVycyBpbiBJbnB1dAogICAgICAgICAgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIElucHV0OiBjdXJyZW50Q29kZVVuaXRfY2h1bmtTaXplSW5Xb3Jkc19kaWdlc3RTaXplSW5Xb3Jkc19iaWdFbmRpYW5Xb3Jkc19oX2RpZ2VzdENhbGxlZEhhc2ggdXBkYXRlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgZGlnZXN0IHdhcyByZXRyaWV2ZWRfcmVzdWx0QXNCeXRlc191cGRhdGVIYXNoX2FkZDMyX3JvdGwzMm1vZF9zaGlmdF93b3JkVG9CeXRlc19ieXRlc1RvQ2h1bmtkYXRhSW5kZXh3b3JkSW5kZXh3M3cydzF3MHdvcmRjaHVua1NpemVJbkJ5dGVzemVyb1BhZGRpbmdfTUQ1X2tfcnQxX1NIQTFfd0h0dHBEYXRlTW9uVHVlV2VkVGh1RnJpU2F0U3VuSmFuRmViTWFyQXByTWF5SnVuSnVsQXVnU2VwT2N0Tm92RGVjIDA6MCBHTVRTUGZvcm1hdFJmYzExMjNmb3JtYXRSZmM4NTBmb3JtYXRBc2N0aW1lSW52YWxpZCBIVFRQIGRhdGUgZXhwZWN0V2Vla2RheU1vbmRheVR1ZXNkYXlXZWRuZXNkYXlUaHVyc2RheUZyaWRheVNhdHVyZGF5U3VuZGF5ZXhwZWN0TW9udGhleHBlY3ROdW1leHBlY3RFbmRHTVRfcGFyc2VDb29raWVEYXRlSW52YWxpZCBjb29raWUgZGF0ZSBpc0VuZGlzRGVsaW1pdGVyaXNOb25EZWxpbWl0ZXJnZXRNb250aGphbmZlYm1hcmFwcmp1bmp1bGF1Z29jdG5vdmRlY3RpbWVTdHJkYXlPZk1vbnRoU3RybW9udGhTdHJ5ZWFyU3RyZGF5T2ZNb250aHRpbWVMaXN0X0h0dHBIZWFkZXJzX2hlYWRlcnNfbXV0YWJsZV9ub0ZvbGRpbmdIZWFkZXJzX2NvbnRlbnRMZW5ndGhfcGVyc2lzdGVudENvbm5lY3Rpb25fY2h1bmtlZFRyYW5zZmVyRW5jb2RpbmdfZGVmYXVsdFBvcnRGb3JTY2hlbWVkZWZhdWx0UG9ydEZvclNjaGVtZWluaXRpYWxIZWFkZXJzTW9yZSB0aGFuIG9uZSB2YWx1ZSBmb3IgaGVhZGVyIF9jaGVja011dGFibGVjaHVua2VkMS4xVHJ5aW5nIHRvIHNldCAnQ29ubmVjdGlvbjogS2VlcC1BbGl2ZScgb24gSFRUUCAxLjAgaGVhZGVycyB3aXRoIG5vIENvbnRlbnRMZW5ndGhrZWVwLWFsaXZlVHJ5aW5nIHRvIGNsZWFyIENvbnRlbnRMZW5ndGggb24gSFRUUCAxLjAgaGVhZGVycyB3aXRoICdDb25uZWN0aW9uOiBLZWVwLUFsaXZlJyBzZXRUcnlpbmcgdG8gc2V0ICdUcmFuc2Zlci1FbmNvZGluZzogQ2h1bmtlZCcgb24gSFRUUCAxLjAgaGVhZGVyc19hZGRWYWx1ZV91cGRhdGVIb3N0SGVhZGVyX2FkZERhdGVfYWRkSG9zdF9hZGRFeHBpcmVzX2FkZENvbm5lY3Rpb25fYWRkQ29udGVudFR5cGVfYWRkQ29udGVudExlbmd0aF9hZGRUcmFuc2ZlckVuY29kaW5nX2FkZElmTW9kaWZpZWRTaW5jZVVuZXhwZWN0ZWQgdHlwZSBmb3IgaGVhZGVyIG5hbWVkIGxvd2VyQ2FzZVZhbHVlSFRUUCBoZWFkZXJzIGFyZSBub3QgbXV0YWJsZWRlZmF1bHRQb3J0X2ZvbGRIZWFkZXJuYW1lRGF0YV9wYXJzZUNvb2tpZXNwYXJzZUNvb2tpZVN0cmluZ3NraXBXU3BhcnNlTmFtZXBhcnNlVmFsdWVoZWFkZXJWYWx1ZV92YWxpZGF0ZUZpZWxkSW52YWxpZCBIVFRQIGhlYWRlciBmaWVsZCBuYW1lOiBfdmFsaWRhdGVWYWx1ZUludmFsaWQgSFRUUCBoZWFkZXIgZmllbGQgdmFsdWU6IF9IZWFkZXJWYWx1ZV91bm1vZGlmaWFibGVQYXJhbWV0ZXJzX2Vuc3VyZVBhcmFtZXRlcnNGYWlsZWQgdG8gcGFyc2UgaGVhZGVyIHZhbHVlbWF5YmVFeHBlY3RwYXJzZVBhcmFtZXRlcnNwYXJzZVBhcmFtZXRlck5hbWVwYXJzZVBhcmFtZXRlclZhbHVlX0NvbnRlbnRUeXBlX3ByaW1hcnlUeXBlX3N1YlR5cGVsb3dlckNhc2VLZXlfQ29va2llX3BhcnNlU2V0Q29va2llVmFsdWVGYWlsZWQgdG8gcGFyc2UgaGVhZGVyIHZhbHVlIFtwYXJzZUF0dHJpYnV0ZXNwYXJzZUF0dHJpYnV0ZU5hbWVwYXJzZUF0dHJpYnV0ZVZhbHVlbWF4LWFnZWh0dHBvbmx5OyBFeHBpcmVzPTsgTWF4LUFnZT07IERvbWFpbj07IFBhdGg9OyBTZWN1cmU7IEh0dHBPbmx5X3ZhbGlkYXRlTmFtZUludmFsaWQgY2hhcmFjdGVyIGluIGNvb2tpZSBuYW1lLCBjb2RlIHVuaXQ6ICdJbnZhbGlkIGNoYXJhY3RlciBpbiBjb29raWUgdmFsdWUsIGNvZGUgdW5pdDogJ19JTklUX1NJWkVfSHR0cEluY29taW5nX3RyYW5zZmVyTGVuZ3RoX2RhdGFDb21wbGV0ZXJmdWxsQm9keVJlYWR1cGdyYWRlZGhhc1N1YnNjcmliZXJ0cmFuc2Zlckxlbmd0aGRhdGFEb25lX0h0dHBJbmJvdW5kTWVzc2FnZUxpc3RJbnRfaW5jb21pbmdfY29va2llc19IdHRwSW5ib3VuZE1lc3NhZ2VfSHR0cFJlcXVlc3RfaHR0cFNlcnZlcl9odHRwQ29ubmVjdGlvbl9zZXNzaW9uX3JlcXVlc3RlZFVyaV9zZXNzaW9uTWFuYWdlckluc3RhbmNlc2Vzc2lvbklkc0RBUlRTRVNTSURzZXNzaW9uSWRfc2Vzc2lvbk1hbmFnZXJnZXRTZXNzaW9uX21hcmtTZWVueC1mb3J3YXJkZWQtcHJvdG9ob3N0TGlzdHgtZm9yd2FyZGVkLWhvc3RfZGVzdHJveWVkY3JlYXRlU2Vzc2lvbl9IdHRwQ2xpZW50UmVzcG9uc2VfaHR0cFJlcXVlc3RfcmVzcG9uc2VSZWRpcmVjdHNfZ2V0Q29tcHJlc3Npb25TdGF0ZWh0dHBDbGllbnRfaHR0cENsaWVudENvbm5lY3Rpb25IRUFEUE9TVFJlc3BvbnNlIGhhcyBubyBMb2NhdGlvbiBoZWFkZXIgZm9yIHJlZGlyZWN0UmVkaXJlY3QgbG9vcCBkZXRlY3RlZF9vcGVuVXJsRnJvbVJlcXVlc3RfY29ubmVjdGlvbkNsb3NlZF9zaG91bGRBdXRoZW50aWNhdGVQcm94eWNoYWxsZW5nZV9zaG91bGRBdXRoZW50aWNhdGVfYXV0aGVudGljYXRlcHJveHlBdXRocmV0cnlhdXRoQ2hhbGxlbmdlZmluZENyZWRlbnRpYWxzX2ZpbmRQcm94eUNyZWRlbnRpYWxzX3Byb3h5X2ZpbmRDcmVkZW50aWFsc3JlbW92ZUNyZWRlbnRpYWxzX3JlbW92ZVByb3h5Q3JlZGVudGlhbHNfcmVtb3ZlQ3JlZGVudGlhbHNyZXF1ZXN0QXV0aGVudGljYXRpb25fYXV0aGVudGljYXRlUHJveHlhbGdvcml0aG1ub25jZXFvcG5vbmNlQ291bnRzdGFsZWNyZWRzQXZhaWxhYmxlX1RvVWludDhMaXN0X1VpbnQ4TGlzdENvbnZlcnNpb25TaW5rdGFyZ2V0QWRkU3RyZWFtX0h0dHBPdXRib3VuZE1lc3NhZ2VfZW5jb2RpbmdTZXRfYnVmZmVyT3V0cHV0X291dGdvaW5nb3V0Z29pbmdvdXRib3VuZGhlYWRlcnNXcml0dGVuSGVhZGVyIGFscmVhZHkgc2VudF93cml0ZUhlYWRlcl9pc0Nvbm5lY3Rpb25DbG9zZWRfSHR0cFJlc3BvbnNlX3N0YXR1c0NvZGVfcmVhc29uUGhyYXNlX2RlYWRsaW5lX2RlYWRsaW5lVGltZXJkZWZhdWx0SGVhZGVyc19pc0Nsb3NpbmdfZmluZFJlYXNvblBocmFzZUhlYWRlcnMgYWxyZWFkeSBzZW50aGVhZGVyc0Z1dHVyZWRyYWluUmVxdWVzdHNldE91dGdvaW5nX2lzTmV3aGVhZGVyQnl0ZXNzZXRIZWFkZXJTd2l0Y2hpbmcgUHJvdG9jb2xzQ3JlYXRlZEFjY2VwdGVkTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb25ObyBDb250ZW50UmVzZXQgQ29udGVudFBhcnRpYWwgQ29udGVudE11bHRpcGxlIENob2ljZXNNb3ZlZCBQZXJtYW5lbnRseUZvdW5kU2VlIE90aGVyTm90IE1vZGlmaWVkVXNlIFByb3h5VGVtcG9yYXJ5IFJlZGlyZWN0QmFkIFJlcXVlc3RVbmF1dGhvcml6ZWRQYXltZW50IFJlcXVpcmVkRm9yYmlkZGVuTm90IEZvdW5kTWV0aG9kIE5vdCBBbGxvd2VkTm90IEFjY2VwdGFibGVQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZFJlcXVlc3QgVGltZS1vdXRDb25mbGljdEdvbmVMZW5ndGggUmVxdWlyZWRQcmVjb25kaXRpb24gRmFpbGVkUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlUmVxdWVzdC1VUkkgVG9vIExvbmdVbnN1cHBvcnRlZCBNZWRpYSBUeXBlUmVxdWVzdGVkIHJhbmdlIG5vdCBzYXRpc2ZpYWJsZUV4cGVjdGF0aW9uIEZhaWxlZEludGVybmFsIFNlcnZlciBFcnJvck5vdCBJbXBsZW1lbnRlZEJhZCBHYXRld2F5U2VydmljZSBVbmF2YWlsYWJsZUdhdGV3YXkgVGltZS1vdXRIdHRwIFZlcnNpb24gbm90IHN1cHBvcnRlZFN0YXR1cyBfSHR0cENsaWVudFJlcXVlc3RfcmVzcG9uc2VDb21wbGV0ZXJfcmVzcG9uc2VfZm9sbG93UmVkaXJlY3RzX21heFJlZGlyZWN0c1JlcXVlc3QgYWxyZWFkeSBzZW50X29uSW5jb21pbmdpbmNvbWluZ1JlZGlyZWN0IGxpbWl0IGV4Y2VlZGVkX3JlcXVlc3RVcml1cmlTdGFydGluZ0Zyb21QYXRoaXNEaXJlY3RDT05ORUNUX3Byb3h5VHVubmVsX0h0dHBHWmlwU2lua19jb25zdW1lX0h0dHBPdXRnb2luZ19mb290ZXJBbmRDaHVuazBMZW5ndGhfY2h1bmswTGVuZ3RoaWdub3JlQm9keV9jbG9zZUZ1dHVyZV9wZW5kaW5nQ2h1bmtlZEZvb3Rlcl9ieXRlc1dyaXR0ZW5fZ3ppcF9nemlwU2lua19nemlwQWRkX2d6aXBCdWZmZXJfZ3ppcEJ1ZmZlckxlbmd0aF9zb2NrZXRFcnJvcmRyYWluRnV0dXJlYWNjZXB0RW5jb2RpbmdzY29udGVudEVuY29kaW5nX2FkZEdaaXBDaHVua19jaHVua0hlYWRlckNvbnRlbnQgc2l6ZSBleGNlZWRzIHNwZWNpZmllZCBjb250ZW50TGVuZ3RoLiAgYnl0ZXMgd3JpdHRlbiB3aGlsZSBleHBlY3RlZCBfaWdub3JlRXJyb3JObyBjb250ZW50IGV2ZW4gdGhvdWdoIGNvbnRlbnRMZW5ndGggd2FzIHNwZWNpZmllZCB0byBiZSBncmVhdGVyIHRoYW4gMDogQ29udGVudCBzaXplIGJlbG93IHNwZWNpZmllZCBjb250ZW50TGVuZ3RoLiAgYnl0ZXMgd3JpdHRlbiBidXQgZXhwZWN0ZWQgZm9vdGVyQW5kSGVhZGVyX0h0dHBDbGllbnRDb25uZWN0aW9uX2h0dHBQYXJzZXJfZGlzcG9zZV9pZGxlVGltZXJfY3VycmVudFVyaV9uZXh0UmVzcG9uc2VDb21wbGV0ZXJfc3RyZWFtRnV0dXJlbGlzdGVuVG9TdHJlYW1VbmV4cGVjdGVkIHJlc3BvbnNlICh1bnNvbGljaXRlZCByZXNwb25zZSB3aXRob3V0IHJlcXVlc3QpLkNvbm5lY3Rpb24gY2xvc2VkIGJlZm9yZSByZXNwb25zZSB3YXMgcmVjZWl2ZWRTb2NrZXQgY2xvc2VkIGJlZm9yZSByZXF1ZXN0IHdhcyBzZW50cHJveHlDcmVkc2NyZWRzaXNBdXRoZW50aWNhdGVkYXV0aEJhc2ljIF9wcm94eUNyZWRlbnRpYWxzYXV0aG9yaXplaXNIZWFkc3RhcnRUaW1lcl9yZXR1cm5Db25uZWN0aW9uYXV0aEluZm9wcm94eS1hdXRoZW50aWNhdGlvbi1pbmZvbmV4dG5vbmNlYXV0aGVudGljYXRpb24taW5mb0Nvbm5lY3Rpb24gY2xvc2VkIGJlZm9yZSBkYXRhIHdhcyByZWNlaXZlZGRldGFjaEluY29taW5nY3JlYXRlUHJveHlUdW5uZWxQcm94eSBmYWlsZWQgdG8gZXN0YWJsaXNoIHR1bm5lbCBzZWN1cmVTb2NrZXRpc1NlY3VyZXNzaDpzdG9wVGltZXJfQ29ubmVjdGlvbkluZm9fQ29ubmVjdGlvblRhcmdldF9pZGxlX2FjdGl2ZV9zb2NrZXRUYXNrc19jb25uZWN0aW5naGFzSWRsZWhhc0FjdGl2ZXRha2VJZGxlX2NoZWNrUGVuZGluZ2FkZE5ld0FjdGl2ZXJldHVybkNvbm5lY3Rpb25jb25uZWN0aW9uQ2xvc2VkdXJpSG9zdHVyaVBvcnRfY29ubmVjdGlvbnNDaGFuZ2VkY3VycmVudEJhZENlcnRpZmljYXRlQ2FsbGJhY2tfYmFkQ2VydGlmaWNhdGVDYWxsYmFja2Nvbm5lY3Rpb25UYXNrdHVubmVsX2dldENvbm5lY3Rpb25UYXJnZXRfSHR0cENsaWVudF9jbG9zaW5nX2Nsb3NpbmdGb3JjZWZ1bGx5X2Nvbm5lY3Rpb25UYXJnZXRzX2NyZWRlbnRpYWxzX2ZpbmRQcm94eV9pZGxlVGltZW91dF9wbGF0Zm9ybUVudmlyb25tZW50Q2FjaGVfb3BlblVybF9jbG9zZUNvbm5lY3Rpb25zQ2xpZW50IGlzIGNsb3NlZE5vIGhvc3Qgc3BlY2lmaWVkIGluIFVSSSBVbnN1cHBvcnRlZCBzY2hlbWUgJycgaW4gVVJJIHByb3h5Q29uZl9nZXRDb25uZWN0aW9uY29ubmVjdGlvblRhcmdldHByb3hpZXNObyBwcm94aWVzIGdpdmVuc2l0ZUNyZWRlbnRpYWxzX2ZpbmRQcm94eUZyb21FbnZpcm9ubWVudGNoZWNrTm9Qcm94eURJUkVDVGNoZWNrUHJveHk6MTA4MFBST1hZIHByb3h5Q2Znbm9Qcm94eW5vX3Byb3h5Tk9fUFJPWFlodHRwX3Byb3h5SFRUUF9QUk9YWWh0dHBzX3Byb3h5SFRUUFNfUFJPWFlfX0h0dHBDb25uZWN0aW9uJkxpbmtlZExpc3RFbnRyeSZfU2VydmljZU9iamVjdF9IdHRwQ29ubmVjdGlvbl9BQ1RJVkVfSURMRV9DTE9TSU5HX0RFVEFDSEVEX2Nvbm5lY3Rpb25zX2lkbGVNYXJrX21hcmtBY3RpdmVfbWFya0lkbGVfaGFuZGxlUmVxdWVzdG1hcmtJZGxlaXNNYXJrZWRJZGxlZGV0YWNoZWRJbmNvbWluZ19pc0FjdGl2ZV9pc0lkbGVfaXNEZXRhY2hlZGlvL2h0dHAvc2VydmVyY29ubmVjdGlvbnNIdHRwU2VydmVyQ29ubmVjdGlvbiA8LT4gdXNlcl9uYW1lQFNvY2tldFVzZXJTb2NrZXRBY3RpdmVJZGxlQ2xvc2luZ0RldGFjaGVkX19IdHRwU2VydmVyJlN0cmVhbSZfU2VydmljZU9iamVjdF9IdHRwU2VydmVyX3NlcnZlcnNfc2VydmVyU29ja2V0X2Nsb3NlU2VydmVyX2FjdGl2ZUNvbm5lY3Rpb25zX2lkbGVDb25uZWN0aW9uc19pbml0RGVmYXVsdFJlc3BvbnNlSGVhZGVyc1gtRnJhbWUtT3B0aW9uc1NBTUVPUklHSU5YLUNvbnRlbnQtVHlwZS1PcHRpb25zbm9zbmlmZlgtWFNTLVByb3RlY3Rpb24xOyBtb2RlPWJsb2NrSHR0cFNlcnZlciBpcyBub3QgYm91bmQgdG8gYSBzb2NrZXRjb25uaW8vaHR0cC9zZXJ2ZXJzX1Byb3h5Q29uZmlndXJhdGlvblBST1hZX1BSRUZJWERJUkVDVF9QUkVGSVhJbnZhbGlkIHByb3h5IGNvbmZpZ3VyYXRpb24gdXNlcmluZm9pbnZhbGlkIHBvcnQgJ19IdHRwQ29ubmVjdGlvbkluZm9fRGV0YWNoZWRTb2NrZXRfQXV0aGVudGljYXRpb25TY2hlbWVfc2NoZW1lVU5LTk9XTkJBU0lDRElHRVNUYmFzaWNCYXNpY19DcmVkZW50aWFsc2hhMV9TaXRlQ3JlZGVudGlhbHN0aGlzUG9ydG90aGVyUG9ydF9Qcm94eUNyZWRlbnRpYWxzYXV0aG9yaXplUHJveHlfSHR0cENsaWVudENyZWRlbnRpYWxzX0h0dHBDbGllbnRCYXNpY0NyZWRlbnRpYWxzX0h0dHBDbGllbnREaWdlc3RDcmVkZW50aWFsc2hhMmNub25jZW5jRGlnZXN0IHVzZXJuYW1lPSIsIHJlYWxtPSIsIG5vbmNlPSIsIHVyaT0iLCBhbGdvcml0aG09IiwgcW9wPSIsIGNub25jZT0iLCBuYz0iLCByZXNwb25zZT0iX1JlZGlyZWN0SW5mb19Db25zdEhUVFBIVFRQMURPVEhUVFAxMEhUVFAxMVNFUEFSQVRPUl9NQVBfQ2hhckNvZGVIVERBU0hTRU1JX0NPTE9ORVFVQUxfU3RhdGVNRVRIT0RfT1JfUkVTUE9OU0VfSFRUUF9WRVJTSU9OUkVTUE9OU0VfSFRUUF9WRVJTSU9OUkVRVUVTVF9MSU5FX01FVEhPRFJFUVVFU1RfTElORV9VUklSRVFVRVNUX0xJTkVfSFRUUF9WRVJTSU9OUkVRVUVTVF9MSU5FX0VORElOR1JFU1BPTlNFX0xJTkVfU1RBVFVTX0NPREVSRVNQT05TRV9MSU5FX1JFQVNPTl9QSFJBU0VSRVNQT05TRV9MSU5FX0VORElOR0hFQURFUl9TVEFSVEhFQURFUl9GSUVMREhFQURFUl9WQUxVRV9TVEFSVEhFQURFUl9WQUxVRUhFQURFUl9WQUxVRV9GT0xESU5HX09SX0VORElOR0hFQURFUl9WQUxVRV9GT0xEX09SX0VOREhFQURFUl9FTkRJTkdDSFVOS19TSVpFX1NUQVJUSU5HX0NSQ0hVTktfU0laRV9TVEFSVElOR19MRkNIVU5LX1NJWkVDSFVOS19TSVpFX0VYVEVOU0lPTkNIVU5LX1NJWkVfRU5ESU5HQ0hVTktFRF9CT0RZX0RPTkVfQ1JDSFVOS0VEX0JPRFlfRE9ORV9MRkJPRFlVUEdSQURFREZBSUxVUkVGSVJTVF9CT0RZX1NUQVRFX0h0dHBWZXJzaW9uVU5ERVRFUk1JTkVEX01lc3NhZ2VUeXBlUkVRVUVTVFJFU1BPTlNFX0h0dHBEZXRhY2hlZFN0cmVhbVN1YnNjcmlwdGlvbl9pbmplY3REYXRhX3VzZXJPbkRhdGFfc2NoZWR1bGVkX21heWJlU2NoZWR1bGVEYXRhX0h0dHBEZXRhY2hlZEluY29taW5nX0h0dHBQYXJzZXJfcGFyc2VyQ2FsbGVkX3JlcXVlc3RQYXJzZXJfaHR0cFZlcnNpb25JbmRleF9tZXNzYWdlVHlwZV9zdGF0dXNDb2RlTGVuZ3RoX3VyaV9vcl9yZWFzb25fcGhyYXNlX2hlYWRlckZpZWxkX2hlYWRlclZhbHVlX2h0dHBWZXJzaW9uX2Nvbm5lY3Rpb25VcGdyYWRlX2NodW5rZWRfbm9NZXNzYWdlQm9keV9yZW1haW5pbmdDb250ZW50X3BhdXNlZF9ib2R5UGF1c2VkX2JvZHlDb250cm9sbGVyX3BhdXNlU3RhdGVDaGFuZ2VkX3Jlc2V0cmVxdWVzdFBhcnNlcnJlc3BvbnNlUGFyc2VyX2RvUGFyc2VfaGVhZGVyc0VuZF9jcmVhdGVJbmNvbWluZ19jbG9zZUluY29taW5nRGF0YSBvbiBjbG9zZWQgY29ubmVjdGlvbkRhdGEgb24gZmFpbGVkIGNvbm5lY3Rpb25JbnZhbGlkIHJlcXVlc3QgbWV0aG9kSW52YWxpZCByZXNwb25zZSBsaW5lSW52YWxpZCByZXF1ZXN0IGxpbmVfZXhwZWN0SW52YWxpZCByZXF1ZXN0IFVSSUludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGVJbnZhbGlkIHJlc3BvbnNlIHJlYXNvbiBwaHJhc2VJbnZhbGlkIGhlYWRlciBmaWVsZCBuYW1laGVhZGVyRmllbGRfY2FzZUluc2Vuc2l0aXZlQ29tcGFyZWlzUmVzcG9uc2Vpc1VwZ3JhZGVDb2RlaXNVcGdyYWRlX2V4cGVjdEhleERpZ2l0ZGF0YUF2YWlsYWJsZV9yZWxlYXNlQnVmZmVyQ29ubmVjdGlvbiBjbG9zZWQgd2hpbGUgcmVjZWl2aW5nIGRhdGFDb25uZWN0aW9uIGNsb3NlZCBiZWZvcmUgZnVsbCBoZWFkZXIgd2FzIHJlY2VpdmVkQ29ubmVjdGlvbiBjbG9zZWQgYmVmb3JlIGZ1bGwgYm9keSB3YXMgcmVjZWl2ZWRtZXNzYWdlVHlwZXJlYWRVbnBhcnNlZERhdGFfaXNUb2tlbkNoYXJfaXNWYWx1ZUNoYXJfdG9rZW5pemVGaWVsZFZhbHVlX3RvTG93ZXJDYXNlQnl0ZXZhbDF2YWwyRmFpbGVkIHRvIHBhcnNlIEhUVFBfSHR0cFNlc3Npb25fbGFzdFNlZW5fdGltZW91dENhbGxiYWNrX3ByZXZfcmVtb3ZlRnJvbVRpbWVvdXRRdWV1ZV9zZXNzaW9uc19idW1wVG9FbmRsYXN0U2Vlbkh0dHBTZXNzaW9uIGlkOl9IdHRwU2Vzc2lvbk1hbmFnZXJfc2Vzc2lvblRpbWVvdXRfdGltZXJjcmVhdGVTZXNzaW9uSWRfYWRkVG9UaW1lb3V0UXVldWVfc3RvcFRpbWVyX3N0YXJ0VGltZXJfdGltZXJUaW1lb3V0SHR0cE92ZXJyaWRlc3J1bldpdGhIdHRwT3ZlcnJpZGVzX0h0dHBPdmVycmlkZXNTY29wZV9jcmVhdGVIdHRwQ2xpZW50V2ViU29ja2V0U3RhdHVzbm9ybWFsQ2xvc3VyZWdvaW5nQXdheXByb3RvY29sRXJyb3J1bnN1cHBvcnRlZERhdGFyZXNlcnZlZDEwMDRub1N0YXR1c1JlY2VpdmVkYWJub3JtYWxDbG9zdXJlaW52YWxpZEZyYW1lUGF5bG9hZERhdGFwb2xpY3lWaW9sYXRpb25tZXNzYWdlVG9vQmlnbWlzc2luZ01hbmRhdG9yeUV4dGVuc2lvbnJlc2VydmVkMTAxNU5PUk1BTF9DTE9TVVJFVXNlIG5vcm1hbENsb3N1cmUgaW5zdGVhZEdPSU5HX0FXQVlVc2UgZ29pbmdBd2F5IGluc3RlYWRQUk9UT0NPTF9FUlJPUlVzZSBwcm90b2NvbEVycm9yIGluc3RlYWRVTlNVUFBPUlRFRF9EQVRBVXNlIHVuc3VwcG9ydGVkRGF0YSBpbnN0ZWFkUkVTRVJWRURfMTAwNFVzZSByZXNlcnZlZDEwMDQgaW5zdGVhZE5PX1NUQVRVU19SRUNFSVZFRFVzZSBub1N0YXR1c1JlY2VpdmVkIGluc3RlYWRBQk5PUk1BTF9DTE9TVVJFVXNlIGFibm9ybWFsQ2xvc3VyZSBpbnN0ZWFkSU5WQUxJRF9GUkFNRV9QQVlMT0FEX0RBVEFVc2UgaW52YWxpZEZyYW1lUGF5bG9hZERhdGEgaW5zdGVhZFBPTElDWV9WSU9MQVRJT05Vc2UgcG9saWN5VmlvbGF0aW9uIGluc3RlYWRNRVNTQUdFX1RPT19CSUdVc2UgbWVzc2FnZVRvb0JpZyBpbnN0ZWFkTUlTU0lOR19NQU5EQVRPUllfRVhURU5TSU9OVXNlIG1pc3NpbmdNYW5kYXRvcnlFeHRlbnNpb24gaW5zdGVhZFJFU0VSVkVEXzEwMTVVc2UgcmVzZXJ2ZWQxMDE1IGluc3RlYWRDb21wcmVzc2lvbk9wdGlvbnNjb21wcmVzc2lvbkRlZmF1bHRVc2UgY29tcHJlc3Npb25EZWZhdWx0IGluc3RlYWRjb21wcmVzc2lvbk9mZk9GRlVzZSBjb21wcmVzc2lvbk9mZiBpbnN0ZWFkY2xpZW50Tm9Db250ZXh0VGFrZW92ZXJzZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlcmNsaWVudE1heFdpbmRvd0JpdHNzZXJ2ZXJNYXhXaW5kb3dCaXRzX2NyZWF0ZVNlcnZlclJlc3BvbnNlSGVhZGVycmVxdWVzdGVkbXdic2VydmVyX21heF93aW5kb3dfYml0c0lsbGVnYWwgMCBwYWRkaW5nIG9uIHZhbHVlLjsgc2VydmVyX21heF93aW5kb3dfYml0cz1fY3JlYXRlQ2xpZW50UmVxdWVzdEhlYWRlcjsgY2xpZW50X21heF93aW5kb3dfYml0cz07IGNsaWVudF9tYXhfd2luZG93X2JpdHNfY3JlYXRlSGVhZGVycGVybWVzc2FnZS1kZWZsYXRlY2xpZW50X25vX2NvbnRleHRfdGFrZW92ZXI7IGNsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyc2VydmVyX25vX2NvbnRleHRfdGFrZW92ZXI7IHNlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyaGVhZGVyTGlzdFdlYlNvY2tldFRyYW5zZm9ybWVycHJvdG9jb2xTZWxlY3RvcmNvbXByZXNzaW9uaXNVcGdyYWRlUmVxdWVzdFdlYlNvY2tldENPTk5FQ1RJTkdVc2UgY29ubmVjdGluZyBpbnN0ZWFkVXNlIG9wZW4gaW5zdGVhZFVzZSBjbG9zaW5nIGluc3RlYWRwaW5nSW50ZXJ2YWxUaGlzIGNvbnN0cnVjdG9yIHdpbGwgYmUgcmVtb3ZlZCBpbiBEYXJ0IDIuMC4gVXNlIGBpbXBsZW1lbnRzYCBpbnN0ZWFkIG9mIGBleHRlbmRzYCBpZiBpbXBsZW1lbnRpbmcgdGhpcyBhYnN0cmFjdCBjbGFzcy5mcm9tVXBncmFkZWRTb2NrZXRzZXJ2ZXJTaWRlVGhlIHNlcnZlclNpZGUgYXJndW1lbnQgbXVzdCBiZSBwYXNzZWQgZXhwbGljaXRseSB0byBXZWJTb2NrZXQuZnJvbVVwZ3JhZGVkU29ja2V0LnJlYWR5U3RhdGVjbG9zZUNvZGVjbG9zZVJlYXNvbldlYlNvY2tldEV4Y2VwdGlvbldlYlNvY2tldEV4Y2VwdGlvbjogX1dlYlNvY2tldE1lc3NhZ2VUeXBlX1dlYlNvY2tldE9wY29kZUNPTlRJTlVBVElPTlJFU0VSVkVEXzNSRVNFUlZFRF80UkVTRVJWRURfNVJFU0VSVkVEXzZSRVNFUlZFRF83Q0xPU0VQSU5HUE9OR1JFU0VSVkVEX0JSRVNFUlZFRF9DUkVTRVJWRURfRFJFU0VSVkVEX0VSRVNFUlZFRF9GX0VuY29kZWRTdHJpbmdfQ29tcHJlc3Npb25NYXhXaW5kb3dCaXRzX1dlYlNvY2tldFByb3RvY29sVHJhbnNmb3JtZXJMRU5fRklSU1RMRU5fUkVTVFBBWUxPQURGSU5SU1YxUlNWMlJTVjNPUENPREVfZmluX2NvbXByZXNzZWRfb3Bjb2RlX21hc2tlZF9yZW1haW5pbmdMZW5CeXRlc19yZW1haW5pbmdNYXNraW5nS2V5Qnl0ZXNfcmVtYWluaW5nUGF5bG9hZEJ5dGVzX3VubWFza2luZ0luZGV4X2N1cnJlbnRNZXNzYWdlVHlwZV9zZXJ2ZXJTaWRlX21hc2tpbmdCeXRlc19wYXlsb2FkX2RlZmxhdGVXZWJTb2NrZXQgdHJhbnNmb3JtZXIgYWxyZWFkeSB1c2VkLmxhc3RJbmRleFByb3RvY29sIGVycm9yX2lzQ29udHJvbEZyYW1lX2xlbmd0aERvbmVfbWFza0RvbmVwYXlsb2FkTGVuZ3RoX3VubWFza19jb250cm9sRnJhbWVFbmRfbWVzc2FnZUZyYW1lRW5kYmxvY2tDb3VudGJsb2NrTWFza2Jsb2NrQnVmZmVyUmVjZWl2ZWQgbWFza2VkIGZyYW1lIGZyb20gc2VydmVyUmVjZWl2ZWQgdW5tYXNrZWQgZnJhbWUgZnJvbSBjbGllbnRfc3RhcnRQYXlsb2FkX3ByZXBhcmVGb3JOZXh0RnJhbWVwcm9jZXNzSW5jb21pbmdNZXNzYWdlX1dlYlNvY2tldFBpbmdfV2ViU29ja2V0UG9uZ19XZWJTb2NrZXRUcmFuc2Zvcm1lckltcGxfcHJvdG9jb2xTZWxlY3Rvcl9jb21wcmVzc2lvbl91cGdyYWRlSW52YWxpZCBXZWJTb2NrZXQgdXBncmFkZSByZXF1ZXN0VXBncmFkZXdlYnNvY2tldFNlYy1XZWJTb2NrZXQtS2V5MjU4RUFGQTUtRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjExU2VjLVdlYlNvY2tldC1BY2NlcHRTZWMtV2ViU29ja2V0LVByb3RvY29sZGVmbGF0ZVNlbGVjdGVkIHByb3RvY29sIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBhdmFpbGFibGUgcHJvdG9jb2xzX25lZ290aWF0ZUNvbXByZXNzaW9uZXh0ZW5zaW9uSGVhZGVyU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zaHZfaXNVcGdyYWRlUmVxdWVzdFNlYy1XZWJTb2NrZXQtVmVyc2lvbl9XZWJTb2NrZXRQZXJNZXNzYWdlRGVmbGF0ZV9lbnN1cmVEZWNvZGVyX2Vuc3VyZUVuY29kZXJwcm9jZXNzT3V0Z29pbmdNZXNzYWdlTGlzdCBlbGVtZW50IGlzIG5vdCBhIGJ5dGUgdmFsdWUgKHZhbHVlICBhdCBpbmRleCBfV2ViU29ja2V0T3V0Z29pbmdUcmFuc2Zvcm1lcl9kZWZsYXRlSGVscGVyV2ViU29ja2V0IHRyYW5zZm9ybWVyIGFscmVhZHkgdXNlZGFkZEZyYW1lX291dENsb3NlQ29kZV9vdXRDbG9zZVJlYXNvbmNyZWF0ZUZyYW1lZGF0YUxlbmd0aGhlYWRlclNpemVob2NsZW5ndGhCeXRlc21hc2tCeXRlc19XZWJTb2NrZXRDb25zdW1lcl9pc3N1ZWRQYXVzZV9lbnN1cmVDb250cm9sbGVyX2RvbmVjbG9zZVNvY2tldF9fV2ViU29ja2V0SW1wbCZTdHJlYW0mX1NlcnZpY2VPYmplY3RfV2ViU29ja2V0SW1wbF93ZWJTb2NrZXRzUEVSX01FU1NBR0VfREVGTEFURV9yZWFkeVN0YXRlX3dyaXRlQ2xvc2VkX2Nsb3NlQ29kZV9jbG9zZVJlYXNvbl9waW5nSW50ZXJ2YWxfcGluZ1RpbWVyX2Nsb3NlVGltZXJfZnJvbVNvY2tldHdzd3NzVW5zdXBwb3J0ZWQgVVJMIHNjaGVtZSAnbm9uY2VEYXRhQ2FjaGUtQ29udHJvbG5vLWNhY2hlQ29ubmVjdGlvbiB0byAnJyB3YXMgbm90IHVwZ3JhZGVkIHRvIHdlYnNvY2tldFJlc3BvbnNlIGRpZCBub3QgY29udGFpbiBhICdTZWMtV2ViU29ja2V0LUFjY2VwdCcgaGVhZGVyZXhwZWN0ZWRBY2NlcHRyZWNlaXZlZEFjY2VwdFJlc3BvbnNlIGhlYWRlciAnU2VjLVdlYlNvY2tldC1BY2NlcHQnIGlzIHRoZSB3cm9uZyBsZW5ndGhCYWQgcmVzcG9uc2UgJ1NlYy1XZWJTb2NrZXQtQWNjZXB0JyBoZWFkZXJuZWdvdGlhdGVDbGllbnRDb21wcmVzc2lvbmdldFdpbmRvd0JpdHNjbGllbnRfbWF4X3dpbmRvd19iaXRzUmVzZXJ2ZWQgc3RhdHVzIGNvZGUgaW8vd2Vic29ja2V0c19pc1Jlc2VydmVkU3RhdHVzQ29kZV9NQVNLXzhfTUFTS18zMl9CSVRTX1BFUl9CWVRFX0JZVEVTX1BFUl9XT1JEX09VVEdPSU5HX0JVRkZFUl9TSVpFX0RBUlRfU0VTU0lPTl9JRF9odHRwT3ZlcnJpZGVzVG9rZW5fd2ViU29ja2V0R1VJRF9jbGllbnROb0NvbnRleHRUYWtlb3Zlcl9zZXJ2ZXJOb0NvbnRleHRUYWtlb3Zlcl9jbGllbnRNYXhXaW5kb3dCaXRzX3NlcnZlck1heFdpbmRvd0JpdHNfZ2V0SHR0cFZlcnNpb25EYXJ0LyAoZGFydDppbylzZGtyb290Oi9wa2cvY29tcGlsZXIvYmluL2RhcnQyanMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2RhcnQyanMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvZGFydDJqcy5kYXJ0cGFja2FnZTpjb21waWxlci9jb21waWxlcl9uZXcuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbW1hbmRsaW5lX29wdGlvbnMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2ZpbGVuYW1lcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvb3B0aW9ucy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc291cmNlX2ZpbGVfcHJvdmlkZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3V0aWwvY29tbWFuZF9saW5lLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL3V0aWwuZGFydHBhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0cGFja2FnZTprZXJuZWwvYXN0LmRhcnRwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvY29tcGlsZXJfb3B0aW9ucy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvZGlhZ25vc3RpY19tZXNzYWdlLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9leHBlcmltZW50YWxfZmxhZ3MuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL2ZpbGVfc3lzdGVtLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvYmFzZS9wcm9jZXNzZWRfb3B0aW9ucy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Jhc2UvbGlicmFyaWVzX3NwZWNpZmljYXRpb24uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9jb21waWxlcl9jb250ZXh0LmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZmFzdGFfY29kZXMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zZXZlcml0eS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2tlcm5lbF9nZW5lcmF0b3JfaW1wbC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvcmVkaXJlY3RpbmdfZmFjdG9yeV9ib2R5LmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL2NvbXBpbGVyX3N0YXRlLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Vuc3RhYmxlL3V0aWwuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL2tlcm5lbF9nZW5lcmF0b3IuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL3N0YW5kYXJkX2ZpbGVfc3lzdGVtLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvY29tcHV0ZV9wbGF0Zm9ybV9iaW5hcmllc19sb2NhdGlvbi5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL29wZXJhdG9yLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2FzeW5jX21vZGlmaWVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc2Nhbm5lci9jaGFyYWN0ZXJzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXRpbC9saW5rLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXRpbC9saW5rX2ltcGxlbWVudGF0aW9uLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXRpbC9yZWxhdGl2aXplLmRhcnRwYWNrYWdlOmNvbXBpbGVyL2NvbXBpbGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9hcGlpbXBsLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb2xvcnMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lvL3NvdXJjZV9maWxlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL2VtcHR5c2V0LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL21hcGxldC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdXRpbC9zZXRsZXQuZGFydHBhY2thZ2U6a2VybmVsL2JpbmFyeS9hc3RfdG9fYmluYXJ5LmRhcnRwYWNrYWdlOmtlcm5lbC9iaW5hcnkvYXN0X2Zyb21fYmluYXJ5LmRhcnRwYWNrYWdlOmtlcm5lbC90ZXh0L2FzdF90b190ZXh0LmRhcnRwYWNrYWdlOmtlcm5lbC92aXNpdG9yLmRhcnRwYWNrYWdlOmtlcm5lbC9jYW5vbmljYWxfbmFtZS5kYXJ0cGFja2FnZTprZXJuZWwvdHJhbnNmb3JtYXRpb25zL2ZsYWdzLmRhcnRwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydHBhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydHBhY2thZ2U6a2VybmVsL2NvcV9hbm5vdC5kYXJ0cGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnRwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnRwYWNrYWdlOnBhY2thZ2VfY29uZmlnL3BhY2thZ2VzLmRhcnRwYWNrYWdlOnBhY2thZ2VfY29uZmlnL3BhY2thZ2VzX2ZpbGUuZGFydHBhY2thZ2U6cGFja2FnZV9jb25maWcvc3JjL3BhY2thZ2VzX2ltcGwuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL3Rlcm1pbmFsX2NvbG9yX3N1cHBvcnQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9jb21tYW5kX2xpbmVfcmVwb3J0aW5nLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvbWVzc2FnZXMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wcm9ibGVtcy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3RpY2tlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3VyaV90cmFuc2xhdG9yLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcmVzb2x2ZV9pbnB1dF91cmkuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY2FubmVyL3Rva2VuLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvc2Nhbm5lci90b2tlbi5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2NvbG9ycy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC90eXBlX2xhYmVsZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9jcmFzaC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2RpbGwvZGlsbF90YXJnZXQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX3RhcmdldC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC91dGlscy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC92ZXJpZmllci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2xvYWRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvYWJzdHJhY3Rfc2Nhbm5lci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvc3RyaW5nX3NjYW5uZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY2FubmVyL3V0ZjhfYnl0ZXNfc2Nhbm5lci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvcmVjb3Zlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIvZXJyb3JfdG9rZW4uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY2FubmVyL3Rva2VuX2NvbnN0YW50cy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9ib2R5X2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9pbmNyZW1lbnRhbF9jb21waWxlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvb2xkX3RvX25ld19hcGkuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbW1vbi90YXNrcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvY29tbW9uLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21waWxlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvZGlhZ25vc3RpY3MvbWVzc2FnZXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2Vudmlyb25tZW50LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pby9sb2NhdGlvbl9wcm92aWRlci5kYXJ0cGFja2FnZTprZXJuZWwvYmluYXJ5L3RhZy5kYXJ0cGFja2FnZTprZXJuZWwvaW1wb3J0X3RhYmxlLmRhcnRwYWNrYWdlOmtlcm5lbC9zcmMvaGllcmFyY2h5X2Jhc2VkX3R5cGVfZW52aXJvbm1lbnQuZGFydHBhY2thZ2U6a2VybmVsL3NyYy9oZWFwLmRhcnRwYWNrYWdlOmtlcm5lbC9saWJyYXJ5X2luZGV4LmRhcnRwYWNrYWdlOmNoYXJjb2RlL2FzY2lpLmRhcnRwYWNrYWdlOnBhY2thZ2VfY29uZmlnL3NyYy91dGlsLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc2Nhbm5lci9zdHJpbmdfY2Fub25pY2FsaXplci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Jhc2Uvc3ludGFjdGljX2VudGl0eS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL3NjYW5uZXIvc3RyaW5nX3V0aWxpdGllcy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2JsYWNrbGlzdGVkX2NsYXNzZXMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90YXJnZXRfaW1wbGVtZW50YXRpb24uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZGlsbC9kaWxsX2xvYWRlci5kYXJ0cGFja2FnZTprZXJuZWwvY2xvbmUuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfbWVtYmVyX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY29wZS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9zb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9zb3VyY2VfbG9hZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2NvbnN0YW50X2V2YWx1YXRvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfY29uc3RhbnRzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL21ldGFkYXRhX2NvbGxlY3Rvci5kYXJ0cGFja2FnZTprZXJuZWwvYmluYXJ5L2xpbWl0ZWRfYXN0X3RvX2JpbmFyeS5kYXJ0cGFja2FnZTprZXJuZWwvdmVyaWZpZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX3NjaGVtYS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfc2hhZG93X2FzdC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NjYW5uZXIva2V5d29yZF9zdGF0ZS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2NvbnN0YW50X2NvbnRleHQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9tb2RpZmllci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL25hbWVzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcXVvdGUuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2Uvc2NvcGVfbGlzdGVuZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2UvdmFsdWVfa2luZHMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9wcm9tb3Rpb24uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvY29sbGVjdGlvbnMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvY29uc3RuZXNzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2V4cHJlc3Npb25fZ2VuZXJhdG9yLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2V4cHJlc3Npb25fZ2VuZXJhdG9yX2hlbHBlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9mYW5nb3JuLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2ZvcmVzdC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9pbXBsaWNpdF90eXBlX2FyZ3VtZW50LmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3R5cGVfYWxnb3JpdGhtcy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfYXBpLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9hc3RfYXBpLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9pbmNyZW1lbnRhbF9rZXJuZWxfZ2VuZXJhdG9yLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9tZW1vcnlfZmlsZV9zeXN0ZW0uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyX2dyYXBoLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvY29tYmluYXRvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3V0aWwvZXJyb3JfcmVwb3J0ZXJfZmlsZV9jb3BpZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9oeWJyaWRfZmlsZV9zeXN0ZW0uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2xpYnJhcnlfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2xpYnJhcnlfZ3JhcGguZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvbnVsbF9jb21waWxlcl9vdXRwdXQuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2RpYWdub3N0aWNzL2RpYWdub3N0aWNfbGlzdGVuZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2RpYWdub3N0aWNzL2ludmFyaWFudC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvZGlhZ25vc3RpY3Mvc291cmNlX3NwYW4uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2RpYWdub3N0aWNzL3NwYW5uYWJsZS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaGVscGVycy9oZWxwZXJzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9iYWNrZW5kX3N0cmF0ZWd5LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21tb24vY29kZWdlbi5kYXJ0cGFja2FnZTpqc19hc3QvanNfYXN0LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21tb24vbmFtZXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbW1vbi93b3JrLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21tb25fZWxlbWVudHMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2RlZmVycmVkX2xvYWQuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2RpYWdub3N0aWNzL2NvZGVfbG9jYXRpb24uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2R1bXBfaW5mby5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvZWxlbWVudHMvZW50aXRpZXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2VucXVldWUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2Zyb250ZW5kX3N0cmF0ZWd5LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci9hYnN0cmFjdF92YWx1ZV9kb21haW4uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3RyaXZpYWwuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3R5cGVtYXNrcy9tYXNrcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvdHlwZXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lvL3NvdXJjZV9pbmZvcm1hdGlvbi5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9iYWNrZW5kLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2luZmVycmVkX2RhdGEuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX21vZGVsL2pzX3N0cmF0ZWd5LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwva2VybmVsX3N0cmF0ZWd5LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwvbG9hZGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zZXJpYWxpemF0aW9uL3Rhc2suZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NlcmlhbGl6YXRpb24vc3RyYXRlZ2llcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL25vZGVzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91bml2ZXJzZS9zZWxlY3Rvci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvY29kZWdlbl93b3JsZF9idWlsZGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91bml2ZXJzZS9yZXNvbHV0aW9uX3dvcmxkX2J1aWxkZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL3dvcmxkX2ltcGFjdC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvd29ybGQuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2RpYWdub3N0aWNzL2dlbmVyYXRlZC9zaGFyZWRfbWVzc2FnZXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbnN0YW50cy9leHByZXNzaW9ucy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaW8vY29kZV9vdXRwdXQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9zY2FubmVyL2ludGVybmVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2NsYXNzX2hpZXJhcmNoeV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2Uvc3RhbmRhcmRfYm91bmRzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2ltcGxpY2l0X2ZpZWxkX3R5cGUuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2ZpZWxkX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX21ldGFkYXRhX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX3ByZWZpeF9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF92YXJpYWJsZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2xvYWRfbGlicmFyeV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3VubGlua2VkX3Njb3BlLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcmV3cml0ZV9zZXZlcml0eS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3RhcmdldC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2RpbGwvZGlsbF9jbGFzc19idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZGlsbC9kaWxsX3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC90eXBlX2J1aWxkZXJfY29tcHV0ZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9iYXNlL2luc3RydW1lbnRhdGlvbi5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2V4cG9ydC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2ltcG9ydC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC90cmFuc2Zvcm1fY29sbGVjdGlvbnMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdHJhbnNmb3JtX3NldF9saXRlcmFscy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9jbGFzc19tZW1iZXJfcGFyc2VyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc291cmNlL2RpZXRfbGlzdGVuZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2UvZGlldF9wYXJzZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2Uvb3V0bGluZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvaW5mZXJlbmNlX2hlbHBlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hX2VsaW1pbmF0aW9uLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWFfZW52aXJvbm1lbnQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9pZGVudGlmaWVycy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvYnVpbHRpbl90eXBlX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2NsYXNzX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2NvbnN0cnVjdG9yX3JlZmVyZW5jZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9kZWNsYXJhdGlvbi5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZHluYW1pY190eXBlX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2VudW1fYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZmllbGRfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZm9ybWFsX3BhcmFtZXRlcl9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9wcm9jZWR1cmVfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZnVuY3Rpb25fdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9pbnZhbGlkX3R5cGVfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9tZW1iZXJfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbWV0YWRhdGFfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbWl4aW5fYXBwbGljYXRpb25fYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbW9kaWZpZXJfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbmFtZV9pdGVyYXRvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbmFtZWRfdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9wcmVmaXhfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdHlwZV9hbGlhc19idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci90eXBlX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdHlwZV92YXJpYWJsZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci91bnJlc29sdmVkX3R5cGUuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3ZvaWRfdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2xpc3RlbmVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL3BhcnNlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9wYXJzZXJfZXJyb3IuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvYXNzZXJ0LmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2Zvcm1hbF9wYXJhbWV0ZXJfa2luZC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9pZGVudGlmaWVyX2NvbnRleHQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvbWVtYmVyX2tpbmQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvdG9wX2xldmVsX3BhcnNlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci91dGlsLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc291cmNlL3N0YWNrX2xpc3RlbmVyLmRhcnRwYWNrYWdlOmtlcm5lbC9zcmMvYm91bmRzX2NoZWNrcy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfY29uc3RyYWludF9nYXRoZXJlci5kYXJ0cGFja2FnZTprZXJuZWwvdXRpbC9ncmFwaC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Jhc2UvcmVzb2x2ZV9yZWxhdGl2ZV91cmkuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9jb25maWd1cmF0aW9uLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9oZWxwZXJzL3RyYWNlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9oZWxwZXJzL2RlYnVnX2NvbGxlY3Rpb24uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2hlbHBlcnMvZXhwZW5zaXZlX21hcC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaGVscGVycy9leHBlbnNpdmVfc2V0LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9oZWxwZXJzL3N0YXRzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9oZWxwZXJzL3RyYWNrX21hcC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9lbnF1ZXVlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9jb2RlX2VtaXR0ZXJfdGFzay5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc2VyaWFsaXphdGlvbi9zZXJpYWxpemF0aW9uLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2Evc3NhLmRhcnRwYWNrYWdlOmpzX2FzdC9zcmMvcHJlY2VkZW5jZS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvY29uc3RhbnRzL3ZhbHVlcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvZWxlbWVudHMvdHlwZXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzL2pzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL25hbWVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9uYXRpdmUvYmVoYXZpb3IuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL2ZlYXR1cmUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL3VzZS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdXRpbC9lbnVtc2V0LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9lbGVtZW50cy9uYW1lcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvY2FsbF9zdHJ1Y3R1cmUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2NvbnN0YW50cy9jb25zdGFudF9zeXN0ZW0uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvbmF0aXZlX2RhdGEuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX21vZGVsL2xvY2Fscy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMva2VybmVsL2RhcnQyanNfdGFyZ2V0LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwva2VsZW1lbnRzLmRhcnRwYWNrYWdlOmRhcnQyanNfaW5mby9pbmZvLmRhcnRwYWNrYWdlOmRhcnQyanNfaW5mby9qc29uX2luZm9fY29kZWMuZGFydHBhY2thZ2U6ZGFydDJqc19pbmZvL2JpbmFyeV9zZXJpYWxpemF0aW9uLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2ZpZWxkX2FuYWx5c2lzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91dGlsL3NpbmtfYWRhcHRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9hbm5vdGF0aW9ucy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvbWVtYmVyX3VzYWdlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91bml2ZXJzZS93b3JsZF9idWlsZGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL25vX3N1Y2hfbWV0aG9kX3JlZ2lzdHJ5LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9zdGF0aWNfdHlwZS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvY2xhc3NfaGllcmFyY2h5LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlX2dyYXBoX2luZmVycmVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci90eXBlbWFza3MvY29uc3RhbnRzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19tb2RlbC9lbGVtZW50X21hcC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvaW5mZXJyZXJfZW5naW5lLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pby9wb3NpdGlvbl9pbmZvcm1hdGlvbi5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfbW9kZWwvZWxlbWVudHMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL2NsYXNzX3NldC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdHJhY2VyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2NoZWNrZWRfbW9kZV9oZWxwZXJzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvcnVudGltZV90eXBlc19jb2RlZ2VuLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXNfbmV3LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy91bml2ZXJzZS9zaWRlX2VmZmVjdHMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lvL2tlcm5lbF9zb3VyY2VfaW5mb3JtYXRpb24uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzL2pzX3NvdXJjZV9tYXBwaW5nLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2JhY2tlbmRfaW1wYWN0LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2NvZGVnZW5fbGlzdGVuZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvY3VzdG9tX2VsZW1lbnRzX2FuYWx5c2lzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2ltcGFjdF90cmFuc2Zvcm1lci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9pbnRlcmNlcHRvcl9kYXRhLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL2pzX2VtaXR0ZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL25hdGl2ZS9lbnF1ZXVlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvYnVpbGRlcl9rZXJuZWwuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS90eXBlcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfbW9kZWwvY2xvc3VyZS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfbW9kZWwvZW52LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19tb2RlbC9lbGVtZW50X21hcF9pbXBsLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19tb2RlbC9qc193b3JsZC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfbW9kZWwvanNfd29ybGRfYnVpbGRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvY29tbW9uL2JhY2tlbmRfYXBpLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21tb24vcmVzb2x1dGlvbi5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaXIvYW5ub3RhdGlvbnMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL2Nsb3N1cmUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL2ltcGFjdC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaXIvaW1wYWN0X2RhdGEuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL21vZHVsYXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL3Njb3BlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2JhY2tlbmRfdXNhZ2UuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvcmVzb2x1dGlvbl9saXN0ZW5lci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9ydW50aW1lX3R5cGVzX3Jlc29sdXRpb24uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL25hdGl2ZS9yZXNvbHZlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMva2VybmVsL2RlZmVycmVkX2xvYWQuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9lbGVtZW50X21hcC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMva2VybmVsL2VsZW1lbnRfbWFwX2ltcGwuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9mcm9udF9lbmRfYWRhcHRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvY2xvc3VyZS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvZWxlbWVudHMvanVtcHMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX21vZGVsL3R5cGVfcmVjaXBlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvaW52b2tlX2R5bmFtaWNfc3BlY2lhbGl6ZXJzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvdmFsaWRhdGUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2VsZW1lbnRzL2VudGl0eV91dGlscy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvZWxlbWVudHMvb3BlcmF0b3JzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwvaW52b2NhdGlvbl9taXJyb3JfY29uc3RhbnRzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwva2VybmVsX3dvcmxkLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL3NvcnRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvY29uc3RhbnRzL2NvbnN0cnVjdG9ycy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvY29uc3RhbnRzL2V2YWx1YXRpb24uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvZm9yd2FyZGluZ19ub2RlLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3R5cGVzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2Vycm9yX2RlbGVnYXRpb25fbGlzdGVuZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9pZ25vcmVkX3BhcnNlcl9lcnJvcnMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvZGlyZWN0aXZlX2NvbnRleHQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvZm9yd2FyZGluZ19saXN0ZW5lci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9saXRlcmFsX2VudHJ5X2luZm8uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvbG9vcF9zdGF0ZS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci9tb2RpZmllcl9jb250ZXh0LmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL3JlY292ZXJ5X2xpc3RlbmVycy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3BhcnNlci90b2tlbl9zdHJlYW1fcmV3cml0ZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvdHlwZV9pbmZvLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcGFyc2VyL2lkZW50aWZpZXJfY29udGV4dF9pbXBsLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL3Byb2dyYW1fYnVpbGRlci9wcm9ncmFtX2J1aWxkZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvc3RhcnR1cF9lbWl0dGVyL2VtaXR0ZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvbWV0YWRhdGFfY29sbGVjdG9yLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL21vZGVsLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL25hdGl2ZV9lbWl0dGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL3R5cGVfdGVzdF9yZWdpc3RyeS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvZWxlbWVudHMvaW5kZXhlZC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaXIvY29uc3RhbnRzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9zdGF0aWNfdHlwZV9iYXNlLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qcy9yZXdyaXRlX2FzeW5jLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvY29kZWdlbi5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL29wdGltaXplLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qcy9qc19kZWJ1Zy5kYXJ0cGFja2FnZTpqc19ydW50aW1lL3NoYXJlZC9lbWJlZGRlZF9uYW1lcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvbmF0aXZlL2pzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9ydW50aW1lX3R5cGVfYW5hbHlzaXMuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9jb2xsZWN0aW9uLmRhcnRwYWNrYWdlOmRhcnQyanNfaW5mby9zcmMvdXRpbC5kYXJ0cGFja2FnZTpkYXJ0MmpzX2luZm8vc3JjL2JpbmFyeS9zaW5rLmRhcnRwYWNrYWdlOmRhcnQyanNfaW5mby9zcmMvYmluYXJ5L3NvdXJjZS5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaXIvc2NvcGVfdmlzaXRvci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaXIvdXRpbC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaXIvc3RhdGljX3R5cGVfY2FjaGUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3R5cGVfZ3JhcGhfbm9kZXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL3N0YXRpY190eXBlX3Byb3ZpZGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci9idWlsZGVyX2tlcm5lbC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvY2xvc3VyZV90cmFjZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL2RlYnVnLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pbmZlcnJlci9sb2NhbHNfaGFuZGxlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvbGlzdF90cmFjZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL21hcF90cmFjZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3NldF90cmFjZXIuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL3R5cGVfZ3JhcGhfZHVtcC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaW5mZXJyZXIvdHlwZV9zeXN0ZW0uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9zc2FfdHJhY2VyLmRhcnRwYWNrYWdlOmpzX3J1bnRpbWUvc2hhcmVkL3JlY2lwZV9zeW50YXguZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvY2xhc3Nfc3R1Yl9nZW5lcmF0b3IuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvaW5zdGFudGlhdGlvbl9zdHViX2dlbmVyYXRvci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9pbnRlcmNlcHRvcl9zdHViX2dlbmVyYXRvci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9tYWluX2NhbGxfc3R1Yl9nZW5lcmF0b3IuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvbmF0aXZlX2dlbmVyYXRvci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9wYXJhbWV0ZXJfc3R1Yl9nZW5lcmF0b3IuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2VtaXR0ZXIvcnVudGltZV90eXBlX2dlbmVyYXRvci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvdW5pdmVyc2UvdGFyZ2V0X2NoZWNrcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL2p1bXBfaGFuZGxlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL2tlcm5lbF9zdHJpbmdfYnVpbGRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL2xvY2Fsc19oYW5kbGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvbG9vcF9oYW5kbGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2Evc3NhX2JyYW5jaF9idWlsZGVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2Evc3dpdGNoX2NvbnRpbnVlX2FuYWx5c2lzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9lbGVtZW50X21hcC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvb3JkZXJlZF90eXBlc2V0LmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9jb21waWxlX3RpbWVfY29uc3RhbnRzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci9jYWNoZWRfc3RhdGljX3R5cGUuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lyL2RlYnVnLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9pci90eXBlcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvaXIvdmlzaXRvcnMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2tlcm5lbC9lbnYuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3VuaXZlcnNlL2Z1bmN0aW9uX3NldC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvY29uc3RhbnRfZXZhbHVhdG9yLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9rZXJuZWwva2VybmVsX2ltcGFjdC5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL2xvZ2dpbmcuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvbGl0ZXJhbF9lbnRyeV9pbmZvX2ltcGwuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9wYXJzZXIvdHlwZV9pbmZvX2ltcGwuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2pzX2JhY2tlbmQvY29uc3RhbnRfZW1pdHRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfZW1pdHRlci9zdGFydHVwX2VtaXR0ZXIvbW9kZWxfZW1pdHRlci5kYXJ0cGFja2FnZTpqc19ydW50aW1lL3NoYXJlZC9hc3luY19hd2FpdF9lcnJvcl9jb2Rlcy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL2NvZGVnZW5faGVscGVycy5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL3ZhcmlhYmxlX2FsbG9jYXRvci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9zcGVjaWFsaXplZF9jaGVja3MuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS9pbnRlcmNlcHRvcl9zaW1wbGlmaWVyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9zc2EvdHlwZXNfcHJvcGFnYXRpb24uZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3NzYS92YWx1ZV9yYW5nZV9hbmFseXplci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvc3NhL3ZhbHVlX3NldC5kYXJ0cGFja2FnZTpqc19hc3Qvc3JjL2NoYXJhY3RlcnMuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvYWxnb3JpdGhtcy5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9jYW5vbmljYWxpemVkX21hcC5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9jb21iaW5lZF93cmFwcGVycy9jb21iaW5lZF9pdGVyYWJsZS5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9jb21iaW5lZF93cmFwcGVycy9jb21iaW5lZF9saXN0LmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX21hcC5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9jb21wYXJhdG9ycy5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9lcXVhbGl0eS5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9lcXVhbGl0eV9tYXAuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvZXF1YWxpdHlfc2V0LmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2Z1bmN0aW9ucy5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9pdGVyYWJsZV96aXAuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvcHJpb3JpdHlfcXVldWUuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvcXVldWVfbGlzdC5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy91bmlvbl9zZXQuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvdW5tb2RpZmlhYmxlX3dyYXBwZXJzLmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL3VuaW9uX3NldF9jb250cm9sbGVyLmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL3dyYXBwZXJzLmRhcnRwYWNrYWdlOmRhcnQyanNfaW5mby9zcmMvZ3JhcGguZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2luZmVycmVyL25vZGVfdHJhY2VyLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19iYWNrZW5kL2pzX2ludGVyb3BfYW5hbHlzaXMuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL3Jlc29sdXRpb24vcmVnaXN0cnkuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy90ZXN0aW5nL2ZlYXR1cmVzLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9oYXNoL3NoYTEuZGFydHBhY2thZ2U6Y29tcGlsZXIvc3JjL2lvL3NvdXJjZV9tYXBfYnVpbGRlci5kYXJ0cGFja2FnZTpjb21waWxlci9zcmMvanNfYmFja2VuZC9qc19iYWNrZW5kLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL2NvbnN0YW50X29yZGVyaW5nLmRhcnRwYWNrYWdlOmNvbXBpbGVyL3NyYy9qc19lbWl0dGVyL2hlYWRlcnMuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvdXRpbHMuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvZW1wdHlfdW5tb2RpZmlhYmxlX3NldC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL3Rlc3RpbmcvaWRfdGVzdGluZy5kYXJ0cGFja2FnZTpjcnlwdG8vY3J5cHRvLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvdGVzdGluZy9hbm5vdGF0ZWRfY29kZV9oZWxwZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy90ZXN0aW5nL2lkLmRhcnRwYWNrYWdlOmNyeXB0by9zcmMvZGlnZXN0LmRhcnRwYWNrYWdlOmNyeXB0by9zcmMvaGFzaC5kYXJ0cGFja2FnZTpjcnlwdG8vc3JjL2htYWMuZGFydHBhY2thZ2U6Y3J5cHRvL3NyYy9tZDUuZGFydHBhY2thZ2U6Y3J5cHRvL3NyYy9zaGExLmRhcnRwYWNrYWdlOmNyeXB0by9zcmMvc2hhMjU2LmRhcnRwYWNrYWdlOmNvbnZlcnQvY29udmVydC5kYXJ0cGFja2FnZTpjcnlwdG8vc3JjL2RpZ2VzdF9zaW5rLmRhcnRwYWNrYWdlOmNyeXB0by9zcmMvaGFzaF9zaW5rLmRhcnRwYWNrYWdlOmNyeXB0by9zcmMvdXRpbHMuZGFydHBhY2thZ2U6Y29udmVydC9zcmMvYWNjdW11bGF0b3Jfc2luay5kYXJ0cGFja2FnZTpjb252ZXJ0L3NyYy9ieXRlX2FjY3VtdWxhdG9yX3NpbmsuZGFydHBhY2thZ2U6Y29udmVydC9zcmMvaGV4LmRhcnRwYWNrYWdlOmNvbnZlcnQvc3JjL3BlcmNlbnQuZGFydHBhY2thZ2U6Y29udmVydC9zcmMvc3RyaW5nX2FjY3VtdWxhdG9yX3NpbmsuZGFydHBhY2thZ2U6dHlwZWRfZGF0YS90eXBlZF9kYXRhLmRhcnRwYWNrYWdlOmNvbnZlcnQvc3JjL2hleC9lbmNvZGVyLmRhcnRwYWNrYWdlOmNvbnZlcnQvc3JjL2hleC9kZWNvZGVyLmRhcnRwYWNrYWdlOmNvbnZlcnQvc3JjL3BlcmNlbnQvZW5jb2Rlci5kYXJ0cGFja2FnZTpjb252ZXJ0L3NyYy9wZXJjZW50L2RlY29kZXIuZGFydHBhY2thZ2U6dHlwZWRfZGF0YS90eXBlZF9idWZmZXJzLmRhcnRwYWNrYWdlOmNvbnZlcnQvc3JjL3V0aWxzLmRhcnRkYXJ0OmNvbnZlcnRkYXJ0OmRldmVsb3BlcmRhcnQ6ZmZpZGFydDppc29sYXRlZGFydDptYXRoZGFydDpwcm9maWxlcmRhcnQ6dHlwZWRfZGF0YWRhcnQ6dm1zZXJ2aWNlX2lvZGFydDpfdm1zZXJ2aWNlZGFydDpfYnVpbHRpbmRhcnQ6bmF0aXZld3JhcHBlcnNkYXJ0OmNsaWRhcnQ6X2h0dHB2bS5jYWxsLXNpdGUtYXR0cmlidXRlcy5tZXRhZGF0YafWAQAIwAD5xgAAApMEKgg3AAI5CTsLApQEKwg3AAI5FTsXApUELAg3AAI5ITsjB2A3Aw0ZJQQxCEQAAkYJSDQEMghEAAJGFUg+BDMIRAACRiFISAKWBDQIRAACRlJIVAdgRAQ2QEpWBDoEPArAAOo0ClwINAAAAQEABICyBIDHBIDNBIDVBIDYBIDdBIDgBIDjBIDnBIDyBIDzBID0BID1BID2BEUEgPcEgPoEgPsEgPwEgP8EgQAEgLYEgQEE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AraHgz62icAA2q4Er0AItoUAAraHg++2icAA2sAEr0IItoUAAraHg/K2icAA2tIEr0QItoUAAraHwACNJLaJwADa5ASvRgi2hQACtofAAIxbtonAANr4BK9ICLaFAAK2h4P1tonAANsMBK9KCLaFAAK2h8AAg8G2icAA2x4Er0wItoUAAraHwACBcraJwADbMgSvTgi2hQACtoeDUbaJwADbRgSvUAi2hQACtofAAHx6tonAANtYBK9SCLaFAAK2h8AAfVC2icAA22wEr1QItoUAAraHwAB7u7aJwADbgASvVgi2vwACtsEJtsPAANuUBK9ZCLa/AAK2wRW2w8AA26UEr1sItr8AArbBIbbDwADbtgSvXQi2vwACtsFStsPAANvHBK9fCLa/AAK2wYFVtsPAANvYBK9hCLa/AAK2wYI8tsPAANvqB2C2hRTAANolwADaNsAA2kfAANpYwADaacAA2nvAANqNwADan8AA2rHAANrDwADa1cAA2ufAANr7wADbD8AA2yHAANs1wADbScAA21vAANtvwADbgwSvcQdgwACTrAAFtfyvgAdgtr8GwADbl8AA26jAANu5wADbysAA29vAANvtBK+IBK+SCLblAAK25wm26cAA3IAEr5MItuUAArbnFbbpwADckQSvlAi25QACtuchtunAANyiBK+VCLblAAK251K26cAA3LMEr5YItuUAArbngVW26cAA3MQEr5cItuUAArbngjy26cAA3NYEr5gItuUAArbnhAi26cAA3OgEr5kItuUAArbnhOC26cAA3PoEr5oItuUAArbngz626cAA3QwEr5sItuUAArbng++26cAA3R4Er5wItuUAArbng/K26cAA3TAEr50ItuUAArbnwACNJLbpwADdQgSvngi25QACtufAAIxbtunAAN1WBK+fCLblAAK254P1tunAAN1qBK+gCLblAAK258AAg8G26cAA3XwEr6EItuUAArbnwACBcrbpwADdkASvogi25QACtueDUbbpwADdpASvowi25QACtufAAHx6tunAAN22BK+kCLblAAK258AAfVC26cAA3coEr6UItuUAArbnwAB7u7bpwADd3gSvpgi25QACtufAAGmttunAAN3yBK+nCLblAAK258AAdZe26cAA3gYEr6gItuUAArbnwAB1DLbpwADeGgSvqQi25QACtufAAGQgtunAAN4uBK+qCLblAAK258AAY2e26cAA3kIEr6sItuUAArbnwABwz7bpwADeVgSvrAi25QACtufAAGM0tunAAN5qBK+tCLblAAK258AAYwG26cAA3n4Er64ItuUAArbnwABij7bpwADekgSvrwi25QACtuexvrbpwADepgSvsAi25QACtufAAGCutunAAN64BK+xCLblAAK258AAYB226cAA3swEr7IItuUAArbngyu26cAA3uAEr7MItuUAArbnwABd67bpwADe8gSvtAi25QACtueD7LbpwADfBgSvtQi25QACtufAAF2NtunAAN8YBK+2CLblAAK2563/tunAAN8sBK+3CLblAAK258AAWse26cAA3z4Er7gItuUAArbnwABZd7bpwADfUgSvuQi25QACtufAAFhYtunAAN9mBK+6CLblAAK258AAV5+26cAA33oEr7sItuUAArbnsRq26cAA344Er7wItuUAArbnwABCIrbpwADfoASvvQi25QACtufAAEHvtunAAN+0BK++CLblAAK258AAQby26cAA38gEr78ItuUAArbnv1m26cAA39wEr8AItuUAArbnr8+26cAA3+4Er8EItuUAArbnwABY3rbpwADgAASvwgi25QACtuezDLbpwADgFASvwwi25QACtue1rbbpwADgJgSvxAi25QACtue1hbbpwADgOASvxQi25QACtueJA7bpwADgSgSvxgi25QACtueNc7bpwADgXASvxwi25QACtueSWLbpwADgbgSvyAi25QACtueSg7bpwADggASvyQi25QACtuefk7bpwADgkgSvygi25QACtufAAGIdtunAAOCkB2C25TnAANyDwADclMAA3KXAANy2wADcx8AA3NnAANzrwADc/cAA3Q/AAN0hwADdM8AA3UXAAN1ZwADdbcAA3X/AAN2TwADdp8AA3bnAAN3NwADd4cAA3fXAAN4JwADeHcAA3jHAAN5FwADeWcAA3m3AAN6BwADelcAA3qnAAN67wADez8AA3uPAAN71wADfCcAA3xvAAN8vwADfQcAA31XAAN9pwADffcAA35HAAN+jwADft8AA38vAAN/fwADf8cAA4APAAOAXwADgKcAA4DvAAOBNwADgX8AA4HHAAOCDwADglcAA4KcEr+wEr+0Er+4Er+8Er/AEr/EEr/IEr/MEr/QEr/UEr/YEr/cEr/gEr/kEr/oEr/sEr/wEr/0Er/4Er/8EsAAEsAEEsAIEsAMEsAQEsAUEsAYEsAcEsAgEsAkEsAoEsAsEsAwEsA0EsA4EsA8EsBAEsBEEsBIEsBMEsBQEsBUEsBYEsBcEsBgEsBkEsBoEsBsEsBwEsB0EsB4EsB8EsCAEsCEEsCIEsCMEsCQEsCUIwACV8QAEwACV8wnAAJX0AMAAlfUAwACV9sAAoScIwACV8QAEwACV8xXAAJX0dcAAlfUAwACV9sAAlY4EmaoIwACV8QAEwACV8yHAAJX0dcAAlfV1wACV9sAA4osEmagIwACV8QAEwACV81LAAJX0AMAAlfV1wACV9sAA4qwHYMAAlfEEwADiT8AA4m3AAOKOwADirwQgBF4EnF0EXAStMwSB5wSc7QSFgARhBLCKBLCLBLCMBLCNBLCOBLCPBLCQCMAAaHYAAsAAaHjAAOLkwABoeQAIwABodgACwABoeMAA4ubAAGh5AAjAAGh2AALAAGh4wACYLsAAaHkACMAAaHYAAsAAaHjAAOLrwABoeQAEXQjAAGh2AALAAGh4wADjYMAAaHkACMAAaHYAAsAAaHjAAOLzwABoeQAEIwjAAGh2AALAAGh4wADjisAAaHkACMAAaHYAAsAAaHjAAK1NwABoeQAIwABodgACwABoeMAArYXAAGh5AAjAAGh2AALAAGh4wADi+cAAaHkACMAAaHYAAsAAaHjAAOL2wABoeQAEsJgIwABodgACwABoeMAA4/DAAGh5AAjAAGh2AALAAGh4wADi+8AAaHkABJxNCMAAaHYAAsAAaHjAAOQbwABoeQAIwABolwACwABonwnAAGigCQjAAGiXAALAAGifCcAAaKAVBIPBCMAAaHYAAsAAaHjAAORUwABoeQAEgksIwABodgACwABoeMAA5GvAAGh5AASECwjAAGh2AALAAGh4wADkgsAAaHkABLJqBLJuBLJvBLJwBLLvCMAATOgAAcAATOrAAOSlBLMRCMAAZ3IAAsAAZ3TAAI0kwABndsAA5LcEsxIIwABncgACwABndMAAjFvAAGd2wADk0QSzEwjAAGdyAALAAGd0wACBcsAAZ3bAAOTrBLMUCMAAZ3IAAsAAZ3SD78AAZ3bAAOUFBLMVCMAAZ3IAAsAAZ3SD9cAAZ3bAAOUdBLMWCMAAZ8QAAsAAZ8ZSwABnyMAA5TUEsxgIwABnxAACwABnxoQIwABnyMAA5UwEsxkIwABnxAACwABnxoFVwABnyMAA5WQEsxoIwABnxAACwABnxoI8wABnyMAA5XwEsxsIwABnxAACwABnxgnAAGfIwADllASzHAjAAGfEAALAAGfGIcAAZ8jAAOWrBLMdCMAAZ8QAAsAAZ8YVwABnyMAA5cIEsx8IwABnxAACwABnxoTgwABnyMAA5dkEsyEIwABnxAACwABnxoM+wABnyMAA5fEEsyMIwABnxAACwABnxoPvwABnyMAA5gkEsyQIwABnxAACwABnxoPywABnyMAA5iEHYLtuAASziQjAAPd+AmC88GC7GwHAAPeBgmIEtBMIwABM6AABwABM6sAA5lQHYLxWAAdgwABsjQAEg9wIwADHsQACwADHs8AA5nLAAMe1dwS0ZASkhgjAAEzoAAHAAEzqwADmjAS0mgS0pAjAAG7qAALAAG7sCcAAbu7AAOahBLSlCMAAbuoAAsAAbuwVwABu7sAA5rgEtKYIwABu6gACwABu7CHAAG7uwADmzwdgwABu6gPAAOakwADmu8AA5tIEtKsIwABvDwACwABvEQnAAG8TwADm+QS0rQjAAG8PAALAAG8RFcAAbxPAAOcQCL2xAAG9tHUIvbEAAb20AAi9sQABvbR3BLTzCMAAb/UAAsAAb/cJwABv+cAA5z8IvkwAAAi9zgACvdDAAOdWvdEACL5RAAAIvswAAAi+0gAACL+4AAK/v3e/wBUIv7gAAr+/d7/ACQS1jgjAAG/1AALAAG/3IcAAb/nAAOeOBLWPCMAAb/UAAsAAb/cVwABv+cAA56UEtbEEtbQIwABAeQACwABAeyHAAEB9wADnvwS1wAS1wwjAAEB5AALAAEB7gjzAAEB9wADn2QS1ywS12QjAAEB5AALAAEB7CcAAQH3AAOf0BLXcCMAAcWkAAsAAcWsJwABxbcAA6AsEtd4IwABxaQACwABxaxXAAHFtwADoIgS13wjAAHFpAALAAHFrIcAAcW3AAOg5BLXqCMAAcXYAAsAAcXgJwABxesAA6FAEtesIwABxdgACwABxeBXAAHF6wADoZwS17AjAAHF2AALAAHF4IcAAcXrAAOh+BLXtCMAAcXYAAsAAcXhSwABxesAA6JUEte4IwABxdgACwABxeIFVwABxesAA6KwEte8IwABxdgACwABxeII8wABxesAA6MQEtfAIwABxdgACwABxeIQIwABxesAA6NwEtfEIwABxdgACwABxeITgwABxesAA6PQEtgsEtgwIwABAeQACwABAe4FVwABAfcAA6Q8EthAEthEIwABAeQACwABAe1LAAEB9wADpKgS2GgjAAEB5AALAAEB7FcAAQH3AAOlBBLYbCMAAQHkAAsAAQHuECMAAQH3AAOlYB2DAAEB5B8AA5/fAAOlEwADnwsAA6S3AAOkSwADn3MAA6VsEtjoEtlsKvtwEtnoEtpYIwABzTAAABLasBLbcCMAAQkgAAAS3DQS3LwrAAELICMAAeGkAAAjAAHaiAAAIwABk2gAACMAAZMgAAAjAAG9pAAAIwACC4wAABLfoCMAAbhQABcAAbhcJwABuGMAA6evAAG4ZdcAAbhoAwABuGwAEt+kIwABuFAAFwABuFxXAAG4YwADqEcAAbhl1wABuGgDAAG4bAAS36gjAAG4UAAXAAG4XIcAAbhjAAOo3wABuGXXAAG4aAMAAbht1BLfrCMAAbhQABcAAbhdSwABuGMAA6l3AAG4ZAMAAbhoAwABuGwAEt+wIwABuFAAFwABuF4FVwABuGMAA6oPAAG4ZdcAAbhoAwABuG3UEt+0IwABuFAAFwABuF4I8wABuGMAA6qrAAG4ZdcAAbhoAwABuG3UEt+4IwABuFAAFwABuF4QIwABuGMAA6tHAAG4ZdcAAbhoAwABuG3UEt+8IwABuFAAFwABuF4TgwABuGMAA6vjAAG4ZAMAAbhoAwABuGwAEt/AIwABuFAAFwABuF4M+wABuGMAA6x/AAG4ZAMAAbhoAwABuGwAEt/EIwABuFAAFwABuF4PvwABuGMAA60bAAG4ZAMAAbhoAwABuGwAEt/IIwABuFAAFwABuF4PywABuGMAA623AAG4ZAMAAbhoAwABuGwAEt/MIwABuFAAFwABuF8AAjSTAAG4YwADrlMAAbhkAwABuGgDAAG4bAAS39AjAAG4UAAXAAG4XwACMW8AAbhjAAOu9wABuGQDAAG4aAMAAbhsABLf1CMAAbhQABcAAbheD9cAAbhjAAOvmwABuGQDAAG4aAMAAbhsABLf2CMAAbhQABcAAbhfAAIPBwABuGMAA7A3AAG4ZAMAAbhoAwABuGwAHYMAAbhQPwADp7sAA6hTAAOo6wADqYMAA6obAAOqtwADq1MAA6vvAAOsiwADrScAA63DAAOuXwADrwMAA6+nAAOwQCMAAYPoAAAjAAGIAAAAHYMAARSoACJLiAWDAAEYSAAjAAIWkAAAHYMAAYk8ACMAAZpwAAcAAZqMVCMAAabAAAcAAabLAAJJiCMAAaaYAAcAAaajAAJJtCMAAaYEAAcAAaYPAAJJnCMAAaXgAAcAAaXrAAJJkCMAAaZwAAcAAaZ7AAJJvBJgqCMAAaZMAAcAAaZXAAOz9CMAAaUgAAcAAaUrAAJJfCMAAaVAAAcAAaVLAAJJcCMAAaTgAAcAAaTrAAJJTCMAAaTAAAcAAaTLAAJJZCMAAaUAAAcAAaULAAJJWBKF8CMAAaRwAAcAAaR7AAO1aBJfICMAAagoAAcAAagzAAO1sCMAAaRUAAcAAaRfAALJeB2DAAEVhAAjAAGnrAAHAAGntwACrdAjAAGnRAAHAAGnTwACSSAjAAGnaAAHAAGncwACSSwjAAGm/AAHAAGnBwACSTgjAAGnIAAHAAGnKwACSUAdgwACFUQAEuqoIwABKsQACwABKswnAAEq1wADt5gS6qwjAAEqxAALAAEqzFcAASrXAAO39B2DAAEqxAsAA7enAAO4ABKGnCMAASzcAAsAASznAAO4jwABLOgkEmwYIwABLNwACwABLOcAA7jrAAEs6FQjAAEs3AALAAEs5wADi5MAASzohCMAASzcAAsAASznAAJ6HwABLOlIEJwjAAEs3AALAAEs5wADuecAASzqBVQS60AjAAEs3AALAAEs5wADukMAASzqCPAdgwABLNwbAAO4mwADuPcAA7lHAAO5lwADue8AA7pMEpN4EutgIwACGtQACwACGtxXAAIa5wADuygjAAIbCAAPAAIbEwADuzcAAhsXAAJJkwACGxsAA1WIEutoIwACGtQACwACGtyHAAIa5wADvAAjAAIbCAAPAAIbEwADvA8AAhsXAALJewACGxsAAsl4IwABolwACwABonwnAAGigIQjAAGh2AALAAGh4hAbAAGh5AAdgwABolwAEuyoIwABnUQACwABnUwnAAGdVwADvYAjAAGg/AWDAAG83AcAAaEFSBLswCMAAZ1EAAsAAZ1MVwABnVcAA74gEuzIIwABnUQACwABnUyHAAGdVwADvnwS7NgjAAGdyAALAAGd0CcAAZ3bAAO+2CMAAaD8BYMAAbzcBwABoQRUEuzcIwABncgACwABndIQIwABndsAA794EuzgIwABncgACwABndITgwABndsAA7/YEuzkIwABncgACwABndIPywABndsAA8A4EuzoIwABncgACwABndII8wABndsAA8CYIwABoPwFgwABvNwHAAGhBgjwEuzwIwABncgACwABndCHAAGd2wADwUAS7PQjAAGdyAALAAGd0gVXAAGd2wADwZwS7PgjAAGdyAALAAGd0wAB8esAAZ3bAAPB/BLs/CMAAZ3IAAsAAZ3QVwABndsAA8JkEu0AIwABncgACwABndFLAAGd2wADwsAS7QQjAAGdyAALAAGd0g1HAAGd2wADwxwS7QgjAAGdyAALAAGd0wAB9UMAAZ3bAAPDfBLtDCMAAZ3IAAsAAZ3TAAHu7wABndsAA8PkEu0UIwABncgACwABndMAAg8HAAGd2wADxEwS7RgjAAGdyAALAAGd0gz7AAGd2wADxLQdgvPAABLtuCMAAbzcAAsAAbzkVwABvO8AA8UoEu28IwABvNwACwABvOSHAAG87wADxYQS7fwjAAIdjAALAAIdlFcAAh2fAAPF4BLuBCMAAh2MAAsAAh2VSwACHZ8AA8Y8Eu4MIwACHYwACwACHZQnAAIdnwADxpgdgvKUAB2DAAGdeAAdgwABnkAAHYMAAZ9kAB2DAAGf2AAjAAEyRAAAEu/MIwABNbwACwABNcQnAAE1zwADx5QS79AjAAE1vAALAAE1xFcAATXPAAPH8BLv1CMAATW8AAsAATXEhwABNc8AA8hMEu/YIwABNbwACwABNcVLAAE1zwADyKgS79wjAAE1vAALAAE1xgVXAAE1zwADyQQS7+AjAAE1vAALAAE1xgjzAAE1zwADyWQS7+QjAAE1vAALAAE1xhAjAAE1zwADycQS7+gjAAE1vAALAAE1xhODAAE1zwADyiQS7+wjAAE1vAALAAE1xgz7AAE1zwADyoQS7/AjAAE1vAALAAE1xg+/AAE1zwADyuQS7/QjAAE1vAALAAE1xg/LAAE1zwADy0QS7/gjAAE1vAALAAE1xwACNJMAATXPAAPLpBLv/CMAATW8AAsAATXHAAIxbwABNc8AA8wMEvAAIwABNbwACwABNcYP1wABNc8AA8x0EvAEIwABNbwACwABNccAAg8HAAE1zwADzNQS8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wAEL2ATAAERHCMAAXsIAAsAAXsSCPMAAXsbAAQvxBMAAREgIwABewgACwABexFLAAF7GwAEMCwTAAERKCMAAXsIAAsAAXsSBVcAAXsbAAQwkBMAAREwIwABewgACwABexIQIwABexsABDD4EwABETgjAAF7CAALAAF7EIcAAXsbAAQxYBMAARFIIwABe0wACwABe1QnAAF7XwAEMcQTAAERTCMAAXtMAAsAAXtUVwABe18ABDIoEwABEVAjAAF7TAALAAF7VIcAAXtfAAQyjBMAARFUIwABe0wACwABe1VLAAF7XwAEMvATAAERXCMAAXosAAsAAXo2D8sAAXo/AAQzVBMAARFgIwABe4QACwABe4wnAAF7lwAEM7wTAAERZCMAAXuEAAsAAXuMVwABe5cABDQgEwABEWwjAAF6zAALAAF61CcAAXrfAAQ0hBMAARF0IwABeswACwABetRXAAF63wAENOgTAAEReCMAAXrMAAsAAXrUhwABet8ABDVMEwABEXwjAAF6zAALAAF61UsAAXrfAAQ1sBMAARGAIwABeswACwABetYFVwABet8ABDYUEwABEYgjAAF6LAALAAF6NwACDwcAAXo/AAQ2fBMAARGQIwABeiwACwABejYNRwABej8ABDbsEwABEaAjAAF6LAALAAF6NwAB8esAAXo/AAQ3VBMAARGsIwABgiQACwABgi4FVwABgjcABDfEEwABEbAjAAGCJAALAAGCLIcAAYI3AAQ4LBMAARG0IwABgiQACwABgi1LAAGCNwAEOJATAAERuCMAAYIkAAsAAYIuCPMAAYI3AAQ49BMAARG8IwABgiQACwABgixXAAGCNwAEOVwTAAERwCMAAYIkAAsAAYIsJwABgjcABDnAEwABEcQjAAGCJAALAAGCLhAjAAGCNwAEOiQTAAERyCMAAYIkAAsAAYIuE4MAAYI3AAQ6jBMAARHMIwABgiQACwABgi4M+wABgjcABDr0EwABEdgjAAGCJAALAAGCLg+/AAGCNwAEO1wTAAER3CMAAYIkAAsAAYIuD8sAAYI3AAQ7xBMAARHgIwABgiQACwABgi8AAgXLAAGCNwAEPCwTAAER5CMAAYIkAAsAAYIvAAHx6wABgjcABDycEwABEegjAAGCJAALAAGCLwACNJMAAYI3AAQ9DBMAARHsIwABgiQACwABgi4NRwABgjcABD18EwABEfQjAAGCJAALAAGCLg/XAAGCNwAEPeQTAAER+CMAAYIkAAsAAYIvAAIPBwABgjcABD5MEwABEfwjAAGCJAALAAGCLwACMW8AAYI3AAQ+vBMAARIIIwABeiwACwABejcAAgXLAAF6PwAEPywjAAF2DAAAEwABElAjAAF73AALAAF75FcAAXvvAAQ/uBMAARJUIwABe9wACwABe+SHAAF77wAEQBwTAAESWCMAAXvcAAsAAXvlSwABe+8ABECAEwABElwjAAF73AALAAF75gVXAAF77wAEQOQTAAESYCMAAXvcAAsAAXvmCPMAAXvvAARBTBMAARJkIwABe9wACwABe+YQIwABe+8ABEG0EwABEmgjAAF73AALAAF75hODAAF77wAEQhwTAAESbCMAAXvcAAsAAXvmDPsAAXvvAARChB2DAAF73CcABCkTAAQ/zwAEQDMABECXAARA+wAEQWMABEHLAARCMwAEQpgjAAGLJAAAIwABi1QAABMAARJ4IwABfGwACwABfHRXAAF8fwAEQ9ATAAESfCMAAXxsAAsAAXx0hwABfH8ABEQ0EwABEoAjAAF8bAALAAF8dUsAAXx/AAREmBMAARKEIwABfGwACwABfHYFVwABfH8ABET8EwABEogjAAF8bAALAAF8dgjzAAF8fwAERWQTAAESjCMAAXxsAAsAAXx2ECMAAXx/AARFzBMAARKQIwABfGwACwABfHYTgwABfH8ABEY0EwABEpQjAAF8bAALAAF8dgz7AAF8fwAERpwTAAESmCMAAXxsAAsAAXx2D78AAXx/AARHBBMAARKcIwABfGwACwABfHYPywABfH8ABEdsEwABEqAjAAF8bAALAAF8dwACNJMAAXx/AARH1BMAARKkIwABfGwACwABfHcAAjFvAAF8fwAESEQdgwABfGw3AAQp5wAEQ+cABERLAARErwAERRMABEV7AARF4wAERksABEazAARHGwAER4MABEfrAARIWCMAAjsAAAYjkhIIEwABEqgdgwABepwLAAQrFwAEKrAdgwABgiRLAAQ51wAEOXMABDhDAAQ4pwAEN9sABDkLAAQ6OwAEOqMABDsLAAQ7cwAEO9sABD0jAAQ+0wAEPfsABD5jAAQ8QwAEPZMABDywHYMAAXsIHwAELxMABC93AAQxdwAEMEMABDCnAAQv2wAEMQwdgwABe0wTAAQx2wAEMj8ABDKjAAQzBB2DAAF7hAsABDPTAAQ0NB2DAAF6LEsABC0XAAQuRwAELeMABCyzAAQtewAELEsABCt7AAQr4wAEKksABC6rAAQzawAEKKMABCl3AAQoOwAENpMABD9DAAQ3AwAEN2gdgwABeswXAAQ0mwAENP8ABDVjAAQ1xwAENigjAAJdRAAAIwABolwACwABonxXAAGigCQjAAGiXAALAAGifFcAAaKAVB2DAAGC7AAMAAAAAAAD4/wjAAGEuAAHAAGEwwAETuQMAAAAAAADwfwjAAGEuAAHAAGEwwAET0QMAAAAAAADw/wjAAGEuAAHAAGEwwAET6QMAAAAAAAAAAAjAAGEuAAHAAGEwwAEUAQMAAAAAAADwPwjAAGEuAAHAAGEwwAEUGQjAAGFVAAAIwABhYwAAB2DAAGK0AArAAJfrCMAAeG4AAATAAEZZBMAARloEwABGWwSCagTAAEZcBJn1BKrUBMAARl0EwABGXgdgwAD9tlbAAJX+wACX9sABFFLAARRXwACWNsAAmGbAAJ2nwACid8AAlm7AAJpewACfn8AAoq/AAJcWwACalsAAoO/AAKLnwAEUXMABFGHAAKFfwACjH8AAl4bAAJt2wAChl8ABFGTAAJwewACiB8AAlqbAAJiewACZDsAAoLfAAJbewACY1sAAm+bAAJuuwAEUacABFGzAARRvwACjV8AAnFbAALVwwAEUdMAAoH/AAJX+wACX9sAAnB7AARRXwACWNsAAmGbAARRSwACid8AAlm7AAJjWwACdp8AAoq/AAJamwACZDsAAn5/AAKLnwACW3sAAml7AAKC3wACjH8AAlxbAAJqWwACg78AAo1fAARRcwAEUYcAAoV/AAJeGwACbdsAAoZfAARRkwACb5sAAogfAAKNXwAEUacAAoH/AAJiewACVxsAAm67AALVwwAEUdMAAnFbAARRswAEUbwTAAEZgBMAARmEEmNUEmhwEWwdgwAD9tgbAARXYwAEV3cABFeLAAOLkwAEV5cABFegEwABFnATAAEWdBMAARmMEwABGZATAAEZlBIanBKkhBMAARmYEwABGZwTAAEZoBMAARmkEm8AEwABGagTAAEZrBMAARmwEwABGbQTAAEZuBMAARm8EwABGcATAAEZxBMAARnIEurkEwABGcwTAAEZ0BMAAQy4EoGgEwABGdQTAAEZ2BMAARncEluoEwABGeATAAEZ5BMAARnoEwABGewTAAEZ8BMAARn0EwABGfgS88QTAAEZ/BMAARoAEwABGgQTAAEaCBMAARoMEhFsEwABGhATAAEaFBMAARoYEwABGhwTAAEaIBMAARokEgL0EwABGigTAAEaLBMAARowEwABGjQTAAEaOBMAARo8EhFIEwABGkATAAEaRBMAARpIEwABGkwTAAEaUBMAARpUEwABGlgSZeATAAEaXBMAARpgEuMsEwABGmQTAAEaaBKfXBMAARpsEwABGnATAAEadBMAARp4EwABGnwTAAEagBMAARqEEwABGogTAAEajBMAARqQEgogEwABGpQTAAEamBMAARqcEs1MEwABGqATAAEapBMAARqoEwABGqwTAAEasBMAARq0EwABGrgTAAEavBMAARrAEwABGsQTAAEayBMAARrMEwABGtATAAEa1BKUXBMAARrYEwABGtwTAAEa4BMAARrkEwABGugTAAEa7BMAARrwEwABGvQTAAEa+BMAARewEwABGvwTAAEbABMAARsEEwABGwgTAAEbDBMAARsQEwABGxQTAAEbGBMAARscEwABGyATAAEbJBKRYBMAARsoEwABGywTAAEbMBMAARs0EwABGzgTAAEbPBMAARtAEwABG0QTAAEbSBMAARtMEwABG1ATAAEbVBMAARtYEwABG1wTAAEbYBMAARtkEwABG2gTAAEbbBMAARtwEwABG3QTAAEbeBMAARt8EwABG4ATAAEbhBMAARuIEwABG4wTAAEbkBMAARuUEwABG5gTAAEbnBMAARugEwABG6QTAAEbqBMAARusEwABG7ATAAEbtBMAARu4EwABG7wTAAEbwBMAARvEEwABG8gTAAEbzBMAARvQEwABG9QTAAEb2BMAARvcEwABG+ATAAEb5BMAARvoEwABG+wTAAEb8BMAARv0EwABG/gTAAEb/BMAARwAEm7IEwABHAQTAAEcCBMAARwMEwABHBATAAEcFBMAARwYEnBIElrEEwABHBwTAAEcIBMAARwkEwABHCgTAAEcLBMAARwwEwABHDQTAAEcOBMAARw8EwABHEATAAEcRBMAARxIEwABHEwTAAEcUBMAARxUEwABHFgTAAEcXBMAARxgEwABHGQTAAEcaBMAARxsEwABHHATAAEcdBMAARx4EwABHHwTAAEcgBMAARyEEwABHIgTAAEcjBMAARyQEgnUEwABHJQTAAEcmBII9BIbiBMAARycEwABHKATAAEcpBIRMBMAARyoEgt8EwABHKwTAAEcsBMAARy0EwABHLgTAAEcvBMAARzAEwABHMQTAAEcyBMAARzMEwABHNATAAEc1BMAARzYEwABHNwTAAEc4BMAARzkEwABHOgTAAEc7BMAARzwEwABHPQTAAEc+BIfGBMAARz8EwABHQATAAEdBBMAAR0IEwABHQwTAAEdEBJvIBJw5B2DAAP22gRHAARYJwAEWDsABFhPAARXlwAEWGMABFh3AARYiwAEWJcABFijAARYtwAEWMsABFjfAARY8wACazsABFj/AALVIwAEWRMABFknAARZOwAEWU8AAjlTAARZYwAEWXcABFmLAARZnwAEWbMABFm/AARZ0wAEV6MABFnnAARZ+wAEWgcABFobAARaLwAEWkMABFpPAARaYwAEWncABFqLAARanwAEWrMABFrHAARa2wAEWucABFr7AARbDwAEWyMABFs3AAOL5wAEW0sABFtXAARbawAEW38ABFuTAARbpwAEW7sABFvPAARb2wAEW+8ABFwDAARcFwAEXCsABFw/AARcUwAEXF8ABFxzAARchwAEXJsABFyvAARcwwAEXNcABFzrAARc9wAEXQsABF0fAARdKwAEXT8ABF1TAARdXwAEXXMABF2HAARdmwAEXa8ABF3DAARd1wAEXesABF3/AAReEwAEXicABF4zAAReRwAEXlsABF5vAAReewAEWecABF6PAAReowAEXrcABF7LAARe3wAEXvMABF8HAARfGwAEXy8ABF9DAARfVwAEX2sABF9/AARfkwAEX58ABF+zAARfxwAEX9sABF/vAARgAwAEYBcABGArAARgPwAEYFMABGBnAARgewAEYI8ABGCjAARgtwAEYMsABGDfAARg8wAEYQcABGEbAARhLwAEYUMABGFPAARhYwAEYXcABGGLAARhnwAEYbMABGHHAARh2wAEYe8ABGIDAARiFwAEYisABGI/AARiUwAEYmcABGJ7AARijwAEYqMABGK3AARiywAEYt8ABGLzAARjBwAEYxsABGMvAARjQwAEY1cABGNrAARjfwAEY5MABGOnAARjuwAEY88ABGPjAARj9wAEZAsABGQfAARkMwAEZEcABGRbAARRpwACjV8ABGRvAARkgwAEZJcABGSrAARkvwAEZNMABGTnAARk+wAEZQ8ABGUjAARlNwAEZUsABGVfAARlcwAEZYcABGWbAAJl+wAEZacABGW7AARlzwAEZeMABGX3AARmCwAEWi8AA44rAARmHwAEV4sABFd3AARmKwAEZjcABGZLAARmXwAEZnMABGaHAARmmwAEZq8ABGbDAARm1wAEZusABGb/AARnEwAEZycABGc7AARnTwAEZ2MABGd3AARniwAEZ58ABGezAARnxwAEZ9sABGfvAARoAwAEaBcABGgrAARoPwAEaFMABGhnAARoewAEZeMABGiPAARomwAEaK8ABGjDAARozwAEaNsABGjvAARpAwAEaRcABGkjAARpNwAEaUMABGlXAARpawAEaX8ABGmTAARppwAEabsABGnPAARp4wAEafcABGoLAARqHwAEajMABGpHAARqWwAEam8ABGqDAARqlwAEaqsABGq/AARq0wAEat8ABGrzAARrBwAEaxsABGsvAARrQwAEa1cABGtgEg9QEg9UEh00EwABHRgSDywTAAEdHBMAAR0gEwABHSQSsEASEAwSZPgSHFASD4wTAAEdKBJpyBMAAR0sElvMElkcEgnYEmRoEhAQEwABHTATAAEdNBMAAR04EwABHTwdgwAD9thnAAR8nwAEfKsABHy3AAR8wwAEfNcABHzjAAR89wAEfQsABH0fAAR9KwAEfTcABH1DAAR9TwAEfVsABH1vAAR9ewAEfY8ABH2bAAR9pwAEfbMABH2/AAR9ywAEfd8ABH3zAAR+BBKk9BAwHYMAA/bYCwAEf8cABH/QEwABHYwI33////wI5wABIKQTAAEhiCMAAmgEAAsAAmgMJwACaBcABIBYEwABIYwjAAJoBAALAAJoDFcAAmgXAASAvBMAASGQIwACaAQACwACaAyHAAJoFwAEgSATAAEhlCMAAmgEAAsAAmgNSwACaBcABIGEEwABIZgjAAJoBAALAAJoDgVXAAJoFwAEgegTAAEhnCMAAmgEAAsAAmgOCPMAAmgXAASCUBMAASGgIwACaAQACwACaA4QIwACaBcABIK4EwABIaQjAAJoBAALAAJoDhODAAJoFwAEgyATAAEhqCMAAmgEAAsAAmgODPsAAmgXAASDiBMAASGsIwACaAQACwACaA4PvwACaBcABIPwEwABIbAjAAJoBAALAAJoDg/LAAJoFwAEhFgTAAEhtCMAAmgEAAsAAmgPAAI0kwACaBcABITAEwABIbgjAAJoBAALAAJoDwACMW8AAmgXAASFMBMAASG8IwACaAQACwACaA4P1wACaBcABIWgEwABIcAjAAJoBAALAAJoDwACDwcAAmgXAASGCBMAASHEIwACaAQACwACaA8AAgXLAAJoFwAEhngTAAEhyCMAAmgEAAsAAmgODUcAAmgXAASG6BMAASHMIwACaAQACwACaA8AAfHrAAJoFwAEh1ATAAEh0CMAAmgEAAsAAmgPAAH1QwACaBcABIfAEwABIdQjAAJoBAALAAJoDwAB7u8AAmgXAASIMBMAASHcIwACaAQACwACaA8AAaa3AAJoFwAEiKATAAEh5CMAAmgEAAsAAmgPAAHWXwACaBcABIkQEwABIewjAAJoBAALAAJoDwAB1DMAAmgXAASJgBMAASH0IwACaAQACwACaA8AAZCDAAJoFwAEifATAAEh/CMAAmgEAAsAAmgPAAGNnwACaBcABIpgEwABIgQjAAJoBAALAAJoDwABwz8AAmgXAASK0BMAASIMIwACaAQACwACaA8AAYzTAAJoFwAEi0ATAAEiFCMAAmgEAAsAAmgPAAGMBwACaBcABIuwEwABIhwjAAJoBAALAAJoDwABij8AAmgXAASMIBMAASIkIwACaAQACwACaA8AAYK7AAJoFwAEjJATAAEiKCMAAmgEAAsAAmgPAAGAdwACaBcABI0AEwABIiwjAAJoBAALAAJoDgyvAAJoFwAEjXATAAEiMCMAAmgEAAsAAmgPAAF3rwACaBcABI3YEwABIjQjAAJoBAALAAJoDsb7AAJoFwAEjkgSB1QSWlgSDTQSDewS77gTAAEfwBMAAQgcEwABImQTAAEiaBMAASJsEwABInATAAEidBMAASJ4EwABInwTAAEigBMAASKEEs1UEwABIogTAAEijBMAASKQEwABIpQTAAEimBMAASKcEwABIqATAAEipBMAASKoEwABIqwTAAEisBMAASK0EVgSd6gTAAEiuBMAASK8EwABIsASy6QSDmgSCjATAAEixBMAASLIEg9EElnIEg74EwABIswTAAEi0BMAASLUEwABItgTAAEi3BMAASLgEwABIuQTAAEi6BMAASLsEwABIvATAAEi9BMAASL4EwABIvwTAAEjABMAASMEEwABIwgTAAEjDBJynBMAASMQEwABIxQSXUwSWzATAAEjGBMAASMcEwABIyATAAEjJBMAASMoEg+cEwABIywSArATAAEjMBMAASM0EwABIzgTAAEjPBMAASNAEwABI0QTAAEjSBMAASNMEwABI1ASWzwTAAEjVBIJpBLwRBMAASNYEwABI1wTAAEjYBMAASNkEgpMEwABI2gTAAEjbBMAASNwEwABI3QTAAEjeBIG7BAcEn7gEwABI3wTAAEjgBMAASOEEg8gEg+oEg70EllYEwABI4gTAAEjjBMAASOQEwABI5QTAAEjmBMAASOcEhyIEwABI6ASCZwTAAEjpBMAASOoEha8EwABI6wSB+gSWIwSDWwSkzgS+TwSBvwTAAEjsBMAASO0EwABI7gTAAEjvBMAASPAEwABI8QSWVwTAAEjyBMAASPMEwABI9ATAAEj1BMAASPYEhtIEwABI9wTAAEj4BMAASPkEwABI+gShggTAAEj7BJiABJamBMAASPwEwABDOQTAAEj9BIGwBKVhBIKQBMAASP4EwABI/wSWygTAAEkAB2DAAP22gLTAASOsg5SAnMABI6/AASOyg5qDiMABI7XAASO4wAEju8ABH17AASPAwAEjxcABI8rAASPPwAEj1MABI9nAASPewAEj48ABI+jAASPtwAEj8sABI/XAASP6wAEj/8ABJATAASQJwAEkDsABJBPAASQYwAEkHcABJCLAASQnwAEkLMABJDHAASQzwAEkNsABJDvAASRAwAEkRcABJEjAASRLwACbBsABJE7AASRTwACmjsABJFjAASRbwAEkXsABJGHAASRmwAEka8ABJHDAASR1wAEkesABJH/AASSEwAEkicABJI7AASSTwAEkmMABJJ3AASSiwAEkp8ABJKzAASSxwAEktsABJLnAASS+wAEkw8ABJMbAASTJwAEkzsABJNPAASTYwACf18ABJN3AASTiwAEXVMABJOXAASTqwAEk7cABJPLAAST3wAEXZsABGZfAAST8wAElAcABF2vAASUGwAElC8ABJRDAASUVwAElGsABF3DAASUdwAElIsABJSXAASUowAEXdcABJS3AASUywAElN8ABJTzAASU/wAElRMAAtXbAASVJwAElTsABJVPAASVYwAElW8ABJV3AARejwAElYMABJWXAASVqwAElb8ABJXLAASV1gVfAASV4wAEle8ABJYDAASWFwAElioNBwAElj8ABJZTAASWZwAElnMABJaHAASWkwAElqcABJa7AASWxwAEltsABJbnAASW8wAElv8ABJcLAASXFwAEW88ABGkXAASXIwAElzcABJdLAARfkwAEl18ABJdzAASXhwAEl5sABJenAASXuwAEl88ABJfjAASX9wAEmAsABJgXAASYKwAEmD8ABJhTAARc6wAEmGcAAoA/AASYcwAEmIcABJiTAASYnwAEmLMABGFDAASYxwAEmNsABGoLAASY5wAEmPMABJj/AASZEwAEmScABJkwIlBUBYMAA/bYABMAASAYEwABJNQTAAEgMBMAASA4EwABICATAAEf+BMAASTYEwABIAATAAEgBBMAASA0EwABJNwSncQSndgTAAEgLBMAASAoEwABJOASD7gTAAEgPBKC/BGoEgkUEwABIBwSAlgSBtATAAEk5BMAASToEwABIAgTAAEgDBKdKBMAAR/8EwABIBATAAEgFBMAASTsHYMAA/bYmwAEpJ8ABKSzAASkxwAEpNsAA4ubAASk7wAEpQMABKUXAASlKwAEpT8ABKVTAASlZwADi68AA4vnAASlewAEpYcABKWTAASlpwAEpbsABKXPAAJ5PwAEpdsABKXvAARc6wAEpfsABKYDAASmDwAEpiMABKYvAASmOwAEpk8ABKZjAASmdwAEposABKaXAASmqwAEpr8ABKbQEsoAEsnoEwABJPASyeQTAAEk9BLJmBLJlBMAAST4EwABH8QTAAEk/BMAASUAEwABJQQTAAElCBMAASUMEskUEskcEskYEsV8EsUsEsV0HYMAA/bYlwAEWPMABKljAASlAwAEfZsABKlvAASpewADi+cABKaLAASknwAEpYcABKWnAASlewAEpZMABJDHAASpjwAEqZsABKmvAASpuwAEqccABKnbAASSxwAEpmMABGtXAASp7wAEpncABKoDAASqFwAEqisABJLbAASqPwAEqlMABKpfAASqawAEqncAAtUjAASqgwAEqowdgvOQABMAASV4IwABmAAACwABmAgnAAGYEwAErRgTAAElfCMAAZgAAAsAAZgIVwABmBMABK18EwABJYAjAAGYAAALAAGYCIcAAZgTAASt4BMAASWEIwABmAAACwABmAlLAAGYEwAErkQTAAEliCMAAZgAAAsAAZgKBVcAAZgTAASuqBMAASWMIwABmAAACwABmAoI8wABmBMABK8QHYMAAZgAGwAErS8ABK2TAASt9wAErlsABK6/AASvJBcAAY66vgATAAEl9CMAAZpAAAcAAZpLAASwECMAAZpwAAcAAZqMJCMAAZpwAAcAAZqMhCMAAZpwAAcAAZqNSB2DAAGacBMABLBjAAOymwAEsJMABLDAEwABJjwTAAEm0BMAASbUEwABJtgS50QTAAEm3BMAASbgHYMAA/bYHwAEsWMABLF3AASxiwAEsZ8ABLGrAASxvwACdpwTAAEmGBMAASYcEwABJiATAAEmJB1sIwAEsl8ABLBjAASycwADspsABLKHAASwkwAEspsABLDAIwAD3fgJgwAD9tmDAAGacAcAA94HAASyrB1sEwAChz3XAAJnuAAjAAPd+AmDAAP22YMAA+goBwAD3gcABLOcEwABJywTAAEnNBMAASc8EwABJ9gjAAGbtAALAAGbvCcAAZvHAAS0cBMAASfcIwABm7QACwABm7xXAAGbxwAEtNQTAAEn4CMAAZu0AAsAAZu8hwABm8cABLU4EwABJ+QjAAGbtAALAAGbvUsAAZvHAAS1nBMAASfoIwABm7QACwABm74FVwABm8cABLYAEwABJ+wjAAGbtAALAAGbvgjzAAGbxwAEtmgTAAEn8CMAAZu0AAsAAZu+ECMAAZvHAAS20BMAASf0IwABm7QACwABm74TgwABm8cABLc4EwABJ/gjAAGbtAALAAGbvgz7AAGbxwAEt6ATAAEn/CMAAZu0AAsAAZu+D78AAZvHAAS4CBMAASgAIwABm7QACwABm74PywABm8cABLhwEwABKAQjAAGbtAALAAGbvwACNJMAAZvHAAS42BMAASgIIwABm7QACwABm78AAjFvAAGbxwAEuUgTAAEoDCMAAZu0AAsAAZu+D9cAAZvHAAS5uBMAASgQIwABm7QACwABm78AAg8HAAGbxwAEuiATAAEoFCMAAZu0AAsAAZu/AAIFywABm8cABLqQEwABKBgjAAGbtAALAAGbvg1HAAGbxwAEuwATAAEoHCMAAZu0AAsAAZu/AAHx6wABm8cABLtoEwABKCAjAAGbtAALAAGbvwAB9UMAAZvHAAS72BMAASgkIwABm7QACwABm78AAe7vAAGbxwAEvEgTAAEoKCMAAZu0AAsAAZu/AAGmtwABm8cABLy4EwABKCwjAAGbtAALAAGbvwAB1l8AAZvHAAS9KBMAASgwIwABm7QACwABm78AAdQzAAGbxwAEvZgTAAEoNCMAAZu0AAsAAZu/AAGQgwABm8cABL4IHYMAAZu0YwAEtIcABLTrAAS1TwAEtbMABLYXAAS2fwAEtucABLdPAAS3twAEuB8ABLiHAAS47wAEuV8ABLnPAAS6NwAEuqcABLsXAAS7fwAEu+8ABLxfAAS8zwAEvT8ABL2vAAS+HBMAASiwIwACaiAACwACaiiHAAJqMwAEwBQTAAEouCMAAmogAAsAAmooVwACajMABMB4EwABKMAjAAJqIAALAAJqKCcAAmozAATA3BMAASjYHYMAAZ1EDwADvY8AA74vAAO+iBMAASjwHYMAAZ3IUwADvucAA8JzAAPBTwADws8AA8GrAAPApwADv4cAA7/nAAPEwwADlCMAA8BHAAOS6wADk1MAA5SDAAPEWwADk7sAA8MrAAPCCwADw4sAA8PwEwABKWgdgwABnxAvAAOWXwADlxcAA5a7AAOU4wADlZ8AA5X/AAOVPwADl3MAA5fTAAOYMwADmJATAAEquBMAASsMEwABK4wjAAGiXAALAAGifCcAAaKBSCMAAaJcAAsAAaJ8JwABooIFVA4J2SWjCJTw9A////////+9/BJzwBMAAS0UEwABLRwTAAEtJBMAAS0sIwABpXwABwABpYcAAkfMIwABpZwABwABpacAAkfYIwABp8wABwABp9cAAkkAIwABpigABwABpjMAAkmoIwABpIwABwABpJcAAqEUEwABLLwjAAGn7AAHAAGn9wAExogTAAEszCMAAagMAAcAAagXAATG2BMAAS54EwABLrwTAAEuxBMAAS8YEwABL0ATAAEv8BJZ6BMAATA0EwABMDgSeyATAAEwPBMAATBAEwABMEQSexwSexQTAAEwSBMAATBMEwABMFAS98QTAAEwVBJ7GBMAATBYEwABMFwTAAEwYB2DAAP22FcABMevAATHwwAEx9cAAtXjAATH4wAEx/cABMgLAATIHwAC1e8AAtX7AATIKwAEyDcABMhLAATIXwAEyHMABMh/AALWEwAEyJMABMifAATIswAEyMQSWeQdgwAD9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PwFgwABu6gHAAGhBgjwIwABoPwFgwABu6gHAAGhBIQjAAGg/AWDAAG7qAcAAaEGBVQjAAGg/AWDAAG8PAcAAaEEJCMAAaD8BYMAAbw8BwABoQRUIwABoPwFgwABvDwHAAGhBIQjAAGg/AWDAAG8PAcAAaEFSB2DAAG8PAsAA5vzAAOcTBMAATZAEwABNqgjAAG/dAALAAG/fCcAAb+HAAToqBMAATasIwABv3QACwABv3xXAAG/hwAE6QwTAAE2sCMAAb90AAsAAb99SwABv4cABOlwEwABNrQjAAG/dAALAAG/fIcAAb+HAATp1BMAATbQHYMAAb90EwAE6L8ABOkjAATp6wAE6YQdgwABv9QPAAOdCwADnqMAA55EIwAD3fgJgiE5gwABwxAHAAPeBgmIIwABw0gABwABw1cABOr0EwABObQjAAHGIAALAAHGKwADoU8AAcYt3CMAAcYgAAsAAcYrAAOhqwABxi3cIwABxiAACwABxisAA6IHAAHGLdwjAAHGIAALAAHGKwADomMAAcYt3CMAAcYgAAsAAcYrAAOivwABxi3cIwABxiAACwABxisAA6N/AAHGLdwTAAE6ICMAAh/MAAsAAh/UhwACH98ABO14EwABOiQjAAIfzAALAAIf1CcAAh/fAATt3CMAAcYgAAsAAcYrAAOjHwABxi3cHYMAAcWkDwADoDsAA6CXAAOg8B2DAAHF2CMAA6FPAAOhqwADogcAA6JjAAOivwADox8AA6N/AAOj3CMAAcbkAAATAAE7wCMAAciYAAsAAcigJwAByKsABO+UEwABO8QjAAHImAALAAHIoFcAAcirAATv+BMAATvIIwAByJgACwAByKCHAAHIqwAE8FwTAAE7zCMAAciYAAsAAcihSwAByKsABPDAEwABO9AjAAHImAALAAHIogVXAAHIqwAE8SQTAAE71CMAAciYAAsAAciiCPMAAcirAATxjBMAATvYIwAByJgACwAByKIQIwAByKsABPH0HYMAAciYHwAE76sABPAPAATwcwAE8NcABPE7AATxowAE8ggTAAE7+CMAAckAAAsAAckIJwAByRMABPLoEwABO/wjAAHJAAALAAHJCFcAAckTAATzTBMAATwAIwAByQAACwAByQiHAAHJEwAE87AdgwAByQAPAATy/wAE82MABPPEEwABPAgTAAE8HBMAA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AALAAHb2IcAAdvjAAUenBMAAUS4IwAB29AACwAB29lLAAHb4wAFHwATAAFEvCMAAdvQAAsAAdvYJwAB2+MABR9kIwAD3fgJgvKVgwAB3LAHAAPeBgmIIwAB3OAACwAB3O8ABR/LAAHc8dwdgwAB29ATAAUfewAFHk8ABR6zAAUfFBMAAUbIHYMAAeAIACMAAeJUAAATAAFH7CMAAeJsAAsAAeJ0JwAB4n8ABSEUEwABR/AjAAHibAALAAHidFcAAeJ/AAUheB2DAAHibAsABSErAAUhjB2DAAGJ2AAdgwAB4pwAIwABoPwFgwAB4mwHAAGhBCQTAAFLVBMAAU0YEwABTRwTAAFNIBMAAU0kKwAB65ArAAHvbCsAAewgHYMAAmgEiwAEgG8ABIDTAASBNwAEgZsABIH/AASCZwAEgs8ABIM3AASDnwAEhAcABIRvAASE1wAEhUcABIW3AASGHwAEho8ABIb/AASHZwAEh9cABIhHAASItwAEiScABImXAASKBwAEincABIrnAASLVwAEi8cABIw3AASOXwAEjKcABI0XAASNhwAEjewTAAFS8CMAAmi0AAsAAmi8JwACaMcABSVwEwABUvQjAAJotAALAAJovFcAAmjHAAUl1BMAAVL4IwACaLQACwACaLyHAAJoxwAFJjgTAAFS/CMAAmi0AAsAAmi9SwACaMcABSacEwABUwAjAAJotAALAAJovgVXAAJoxwAFJwATAAFTBCMAAmi0AAsAAmi+CPMAAmjHAAUnaBMAAVMIIwACaLQACwACaL4QIwACaMcABSfQEwABUwwjAAJotAALAAJovhODAAJoxwAFKDgTAAFTECMAAmi0AAsAAmi+DPsAAmjHAAUooBMAAVMUIwACaLQACwACaL4PvwACaMcABSkIEwABUxgjAAJotAALAAJovg/LAAJoxwAFKXATAAFTHCMAAmi0AAsAAmi/AAI0kwACaMcABSnYEwABUyAjAAJotAALAAJovwACMW8AAmjHAAUqSBMAAVMkIwACaLQACwACaL4P1wACaMcABSq4HYMAAmi0OwAFJYcABSXrAAUmTwAFJrMABScXAAUnfwAFJ+cABShPAAUotwAFKR8ABSmHAAUp7wAFKl8ABSrMEhtUEhWcEwABVuAjAAIUFAAAIwACFDQAABMAAVckIwACAOgACwACAPAnAAIA+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wABtggI5wABtgwI5wABthAI5wABthQI5wABthgI5wABthwI5wABtiAI5wABtiQI5wABtigI5wABtiwI35l5aUQI5wABtjAI5wABtjQI3wkQUUwI5wABtjgI5wABtjwI34eHN5gI5wABtkAI5wABtkQI5wABtkgI5wABtkwI5wABtlAI5wABtlQI5wABtlgI5wABtlwI5wABtmAI5wABtmQI5wABtmgI5wABtmwI5wABtnAI5wABtnQI5wABtngI36Jt+xgI5wABtnwI5wABtoAI3xIgdBQI5wABtoQI5wABtogI336J8+AI5wABtowI5wABtpAI5wABtpQI5wABtpgI5wABtpwI5wABtqAI5wABtqQI5wABtqgI5wABtqwI5wABtrAI5wABtrQI5wABtrgI5wABtrwI5wABtsAI5wABtsQI36tfSuwI5wABtsgdgwAD70EDAAWqnwAFqrcABarPAAWq5wAFqv8ABasXAAWrLwAFq0cABatfAAWrdwAFq48ABaunAAWrvwAFq9cABavvAAWsBwAFrB8ABaw3AAWsTwAFrGcABax/AAWslwAFrK8ABazHAAWs3wAFrPcABa0PAAWtJwAFrT8ABa1XAAWtbwAFrYcABa2fAAWttwAFrc8ABa3nAAWt/wAFrhcABa4vAAWuRwAFrl8ABa53AAWujwAFrqcABa6/AAWu1wAFru8ABa8HAAWvHwAFrzcABa9PAAWvZwAFr38ABa+XAAWvrwAFr8cABa/fAAWv9wAFsA8ABbAnAAWwPwAFsFcABbBvAAWwhB2DAAPvQQITgwACMW8AAfHrAAHUMhODAAIxbwAB8esAAdQyE4MAAjFvAAHx6wAB1DITgwACMW8AAfHrAAHUMgjyD78AAg8HAAGmtgjyD78AAg8HAAGmtgjyD78AAg8HAAGmtgjyD78AAg8HAAGmtgVXAAI0kg1HAAGQggVXAAI0kg1HAAGQggVXAAI0kg1HAAGQggVXAAI0kg1HAAGQghAiD8sAAgXLAAHWXhAiD8sAAgXLAAHWXhAiD8sAAgXLAAHWXhAiD8sAAgXLAAHWXAjnAAG3QAjnAAG3RAjnAAG3SAjnAAG3TAjf5VsJbAjnAAG3UAjnAAG3VAjnAAG3WAjnAAG3XAjfSg1sBAjfkMYW+AjnAAG3YAjnAAG3ZAjnAAG3aAjnAAG3bAjnAAG3c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AXgBB2DAAPvQAcAAjsMIwADJNAAAB2DAAPvQBIP4wAF3dcABd3nAAJF9CMAAxmUAAcAAxmjAAXfnAjfAAPwABMAAdA4IwADLBgABwADLCMABeSgEwAB0JQjAAMsGAAHAAMsIwAF5PATAAHQmCMAAywYAAcAAywjAAXlQBMAAdCgIwADLBgABwADLCMABeWQCOMAAf1oCOMAAfQACOMAAfRAIwAD50QACwAD508ABcLnAAPnUdQTAAHRyCMAAywYAAcAAywjAAXmeBMAAdIcIwADLBgABwADLCMABebIEwAB0iQjAAMsGAAHAAMsIwAF5xgTAAHSKCMAAywYAAcAAywjAAXnaBMAAdI0IwADLBgABwADLCMABee4EwAB0mQjAAMsGAAHAAMsIwAF6AgTAAHSbCMAAywYAAcAAywjAAXoWBMAAdJ0IwADLBgABwADLCMABeioEwAB0oAjAAMsGAAHAAMsIwAF6PgTAAHSiCMAAywYAAcAAywjAAXpSBMAAdKQIwADLBgABwADLCMABemYEwAB0pgjAAMsGAAHAAMsIwAF6egTAAHSoCMAAywYAAcAAywjAAXqOBMAAdKsIwADLBgABwADLCMABeqIEwAB0rQjAAMsGAAHAAMsIwAF6tgTAAHSvCMAAywYAAcAAywjAAXrKBMAAdLEIwADLBgABwADLCMABet4EwAB0swjAAMsGAAHAAMsIwAF68gTAAHS2CMAAywYAAcAAywjAAXsGBMAAdLkIwADLBgABwADLCMABexoEwAB0uwjAAMsGAAHAAMsIwAF7LgTAAHTGCMAAywYAAcAAywjAAXtCCMAAyp4AAATAAHTICMAAywYAAcAAywjAAXtdBMAAdMkIwADLBgABwADLCMABe3EEwAB0ywjAAMsGAAHAAMsIwAF7hQTAAHTMCMAAywYAAcAAywjAAXuZBMAAdM4IwADLBgABwADLCMABe60EwAB0zwjAAMsGAAHAAMsIwAF7wQTAAHTSCMAAywYAAcAAywjAAXvVCMAAyqEAAATAAHTmCMAAywYAAcAAywjAAXvwBMAAdOcIwADLBgABwADLCMABfAQEwAB08QjAAMsGAAHAAMsIwAF8GATAAHTzCMAAywYAAcAAywjAAXwsBMAAdPUIwADLBgABwADLCMABfEAEwAB09wjAAMsGAAHAAMsIwAF8VATAAHT6CMAAywYAAcAAywjAAXxoBMAAdRwIwADLBgABwADLCMABfHwEwAB1IQjAAMsLAAHAAMsNwAF8kAI3gMkCN4DKAjeAywI3gMwCN4DNAjeAzgI3gM8CN4DQAjeA4gI3gSwCN4EtAjeBLgI3gS8CN4EwAjeBMQI3gTMCN4E0AjeBkAI3gZECN4GSAjeBkwI3gZQCN4GVAjeBlgI3gZcCN4GYAjeBmQI3gZoCN4GbAjeBnAI3gZ0CN4GeAjeBnwI3gaACN4GhAjeBpQI3gaYCN4GnAjeBqAI3gaoCN4GsAjeBrQI3ga8CN4G8AjeBwwI3gfMCN4H0AjeB9QI3gfYCN4H3AjeB+AI3gfkCN4H6AjeB+wI3gfwCN4H+AjeB/wI3glcEwAB1YAjAAPm9AAHAAPm/wAF9jATAAHViCMAA+b0AAcAA+b/AAX2gBMAAdWQIwAD5vQABwAD5v8ABfbQEwAB1ZgjAAPm9AAHAAPm/wAF9yATAAHVoCMAA+b0AAcAA+b/AAX3cBMAAdWoIwAD5vQABwAD5v8ABffAEwAB1bAjAAPm9AAHAAPm/wAF+BATAAHVuCMAA+b0AAcAA+b/AAX4YBMAAdXAIwAD5vQABwAD5v8ABfiwEwAB1cgjAAPm9AAHAAPm/wAF+QATAAHV0CMAA+b0AAcAA+b/AAX5UBMAAdXYIwAD5vQABwAD5v8ABfmgEwAB1eAjAAPm9AAHAAPm/wAF+fATAAHV6CMAA+b0AAcAA+b/AAX6QBMAAdXwIwAD5vQABwAD5v8ABfqQEwAB1fgjAAPm9AAHAAPm/wAF+uATAAHWACMAA+b0AAcAA+b/AAX7MBMAAdYIIwAD5vQABwAD5v8ABfuAEwAB1hAjAAPm9AAHAAPm/wAF+9ATAAHWGCMAA+b0AAcAA+b/AAX8IBMAAdYgIwAD5vQABwAD5v8ABfxwEwAB1igjAAPm9AAHAAPm/wAF/MATAAHWMCMAA+b0AAcAA+b/AAX9EBMAAdY4IwAD5vQABwAD5v8ABf1gEwAB1kAjAAPm9AAHAAPm/wAF/bATAAHWSCMAA+b0AAcAA+b/AAX+ABMAAdZQIwAD5vQABwAD5v8ABf5QEwAB1lgjAAPm9AAHAAPm/wAF/qATAAHWYCMAA+b0AAcAA+b/AAX+8BMAAdZoIwAD5vQABwAD5v8ABf9AEwAB1nAjAAPm9AAHAAPm/wAF/5ATAAHWeCMAA+b0AAcAA+b/AAX/4BMAAdaAIwAD5vQABwAD5v8ABgAwEwAB1ogjAAPm9AAHAAPm/wAGAIATAAHWkCMAA+b0AAcAA+b/AAYA0BMAAdaYIwAD5vQABwAD5v8ABgEgEwAB1qAjAAPm9AAHAAPm/wAGAXATAAHWqCMAA+b0AAcAA+b/AAYBwBMAAdawIwAD5vQABwAD5v8ABgIQEwAB1rgjAAPm9AAHAAPm/wAGAmATAAHWwCMAA+b0AAcAA+b/AAYCsBMAAdbIIwAD5vQABwAD5v8ABgMAEwAB1tAjAAPm9AAHAAPm/wAGA1ATAAHYoBMAAdioEwAB2KwTAAHYtAjfACiQVCsAAyskEwAB2QAjAAMsGAAHAAMsIwAGBBwtgwAD6CgjAAPnRAALAAPnTwAF02cAA+dTAAYEbBMAAdkYIwADLBgABwADLCMABgTgEwAB2TAjAAMsGAAHAAMsIwAGBTATAAHZQCMAAywYAAcAAywjAAYFgBMAAdlUIwADLBgABwADLCMABgXQEwAB2WAjAAMsGAAHAAMsIwAGBiATAAHZbCMAAywYAAcAAywjAAYGcBMAAdmYIwADLBgABwADLCMABgbAEwAB2aAjAAMsGAAHAAMsIwAGBxATAAHZpCMAAywYAAcAAywjAAYHYBMAAdm8IwADLBgABwADLCMABgewEwAB2cwjAAMsGAAHAAMsIwAGCAATAAHZ0CMAAywYAAcAAywjAAYIUBMAAdncIwADLBgABwADLCMABgigEwAB2fQjAAMsGAAHAAMsIwAGCPATAAHZ+CMAAywYAAcAAywjAAYJQBMAAdn8IwADLBgABwADLCMABgmQEwAB2gQjAAMsGAAHAAMsIwAGCeATAAHaECMAAywYAAcAAywjAAYKMCsAAz1cEwAB2zgjAAMsGAAHAAMsIwAGCpQTAAHbUCMAAywYAAcAAywjAAYK5BMAAdtYIwADLBgABwADLCMABgs0EwAB22AjAAMsGAAHAAMsIwAGC4QTAAHbcCMAAywYAAcAAywjAAYL1BMAAdt8IwADLBgABwADLCMABgwkEwAB24AjAAMsLAAHAAMsNwAGDHQTAAHbhCMAA+b0AAcAA+b/AAYMxBcAAzsjAAHBtBcAAzsjAAHBuBMAAdwQIwADLCwABwADLDcABg1cKwADO0wrAAM7XCsAAz1wDAAAAAAAAoEEEwAB3IgjAAMsGAAHAAMsIwAGDgwTAAHcoCMAAywYAAcAAywjAAYOXBMAAdyoIwADLBgABwADLCMABg6sEwAB3LgjAAMsGAAHAAMsIwAGDvwNpVxSLCr8FQAMWVbW7sWsCQAPvOfr+Qi7mPwP+gitlRxX3PwMO5SYVe8vbPwMYLURU+yEJQAPNO39mnqDmPwPNO39mnqD2PwTAAHdcCMAA+dEAAsAA+dPAAXTZwAD51MABhBsEwAB3XgjAAMsGAAHAAMsIwAGENwTAAHdhCMAAywYAAcAAywjAAYRLBMAAd2MIwADLBgABwADLCMABhF8EwAB3ZQjAAMsGAAHAAMsIwAGEcwTAAHdnCMAAywYAAcAAywjAAYSHBMAAd2kIwADLBgABwADLCMABhJsEwAB3awjAAMsGAAHAAMsIwAGErwTAAHdtCMAAywYAAcAAywjAAYTDBMAAd28IwADLBgABwADLCMABhNcEwAB3cQjAAMsGAAHAAMsIwAGE6wTAAHdyCMAAywYAAcAAywjAAYT/BMAAd3QIwAD50QACwAD508ABhRPAAPnUdwTAAHeFCMAAywYAAcAAywjAAYUsBMAAd4cIwADLBgABwADLCMABhUAEwAB3kgjAAMsGAAHAAMsIwAGFVAUAAAdgwADTVgAHYMAA0tYABMAAd6cIwADLBgABwADLCMABhXkEwAB3qAjAAMsGAAHAAMsIwAGFjQTAAHepCMAAywYAAcAAywjAAYWhBMAAd6sIwADLBgABwADLCMABhbUFACAEwAB3sAjAAMsGAAHAAMsIwAGFzAdgwADTKQAHYMAA0wUACsAA0IEEwAB32QjAAMsGAAHAAMsIwAGF8wTAAHfbCMAAywYAAcAAywjAAYYHBMAAd90IwADLBgABwADLCMABhhsEwAB33wjAAMsGAAHAAMsIwAGGLwTAAHfhCMAAywYAAcAAywjAAYZDBMAAd+MIwADLBgABwADLCMABhlcEwAB35QjAAMsGAAHAAMsIwAGGawTAAHfmCMAAywYAAcAAywjAAYZ/BMAAd+cIwADLBgABwADLCMABhpMEwAB36AjAAMsGAAHAAMsIwAGGpwTAAHfpCMAAywYAAcAAywjAAYa7BMAAd+oIwADLBgABwADLCMABhs8EwAB37AjAAMsGAAHAAMsIwAGG4wTAAHfuCMAAywYAAcAAywjAAYb3BMAAd/AIwADLBgABwADLCMABhwsEwAB3+AjAAMsGAAHAAMsIwAGHHwTAAHf7CMAAywYAAcAAywjAAYczBMAAd/wIwADLBgABwADLCMABh0cEwAB4AwjAAMsGAAHAAMsIwAGHWwTAAHgFCMAAywYAAcAAywjAAYdvBMAAeAsIwADLBgABwADLCMABh4MEwAB4DQjAAMsGAAHAAMsIwAGHlwTAAHgTCMAAywYAAcAAywjAAYerBMAAeBQIwADLBgABwADLCMABh78EwAB4FQjAAMsGAAHAAMsIwAGH0wTAAHgWCMAAywYAAcAAywjAAYfnBMAAeBcIwADLBgABwADLCMABh/sEwAB4IAjAAMsGAAHAAMsIwAGIDwdgwAD9thTAAJJqwACSWcAAkmfAAJJiwACSZMAAkm3AAJJOwACSX8AAklDAAJJDwACSSMAAkkvAAJJcwACtTcAArYXAAJJWwACSU8AAsl7AANViwACSbwTAAHg6CMAAywYAAcAAywjAAYh6BMAAeDwIwADLBgABwADLCMABiI4EwAB4PQjAAMsGAAHAAMsIwAGIogTAAHg/CMAAywYAAcAAywjAAYi2BMAAeEQIwADLBgABwADLCMABiMoEwAB4SwjAAMsGAAHAAMsIwAGI3gUAmhYEwAB4WAjAAMsGAAHAAMsIwAGI9gTAAHhaCMAAywYAAcAAywjAAYkKBMAAeFwIwADLBgABwADLCMABiR4EwAB4ZAjAAMsGAAHAAMsIwAGJMgTAAHhnCMAAywYAAcAAywjAAYlGBMAAeH4IwAD5vQABwAD5v8ABiVoEwAB4iAjAAMsGAAHAAMsIwAGJbgTAAHiJCMAAywYAAcAAywjAAYmCBMAAeIsIwADLBgABwADLCMABiZYEwAB4jgjAAPm9AAHAAPm/wAGJqgTAAHiTCMAAywYAAcAAywjAAYm+BMAAeLYIwADLBgABwADLCMABidIEwAB4uAjAAMsGAAHAAMsIwAGJ5gTAAHi6CMAAywYAAcAAywjAAYn6BMAAeLwIwADLBgABwADLCMABig4EwAB4vgjAAMsGAAHAAMsIwAGKIgTAAHjACMAAywYAAcAAywjAAYo2BMAAeMIIwADLBgABwADLCMABikoEwAB4xAjAAMsGAAHAAMsIwAGKXgTAAHjGCMAAywYAAcAAywjAAYpyBMAAeMgIwADLBgABwADLCMABioYEwAB4ygjAAMsGAAHAAMsIwAGKmgTAAHjMCMAAywYAAcAAywjAAYquBMAAeM4IwADLBgABwADLCMABisIEwAB40AjAAMsGAAHAAMsIwAGK1gTAAHjSCMAAywYAAcAAywjAAYrqBMAAeNQIwADLBgABwADLCMABiv4EwAB41gjAAMsGAAHAAMsIwAGLEgTAAHjYCMAAywYAAcAAywjAAYsmBMAAeNoIwADLBgABwADLCMABizoEwAB43AjAAMsGAAHAAMsIwAGLTgTAAHjeCMAAywYAAcAAywjAAYtiC2DAAN3JCMAA+dEAAsAA+dPAAXTZwAD51MABi3YEwAB44AjAAMsGAAHAAMsIwAGLkwTAAHjiCMAAywYAAcAAywjAAYunC2DAAN3sCMAA+dEAAsAA+dPAAXTZwAD51MABi7sEwAB45AjAAMsGAAHAAMsIwAGL2ATAAHjmCMAAywYAAcAAywjAAYvsBMAAeOgIwADLBgABwADLCMABjAAEwAB46gjAAMsGAAHAAMsIwAGMFAtgwADeCgjAAPnRAALAAPnTwAF02cAA+dTAAYwoBMAAeVMIwADLBgABwADLCMABjEUEwAB5VAjAAMsGAAHAAMsIwAGMWQTAAHlVCMAAywYAAcAAywjAAYxtBMAAeVYIwADLBgABwADLCMABjIEEwAB5VwjAAMsGAAHAAMsIwAGMlQTAAHlYCMAAywYAAcAAywjAAYypBMAAeVoIwADLBgABwADLCMABjL0EwAB5WwjAAMsGAAHAAMsIwAGM0QTAAHldCMAAywYAAcAAywjAAYzlBMAAeV4IwADLBgABwADLCMABjPkEwAB5YAjAAMsGAAHAAMsIwAGNDQTAAHliCMAAywYAAcAAywjAAY0hBMAAeWMIwADLBgABwADLCMABjTUEwAB5ZQjAAMsGAAHAAMsIwAGNSQTAAHlmCMAAywYAAcAAywjAAY1dBMAAeWcIwADLBgABwADLCMABjXEEwAB5aAjAAMsGAAHAAMsIwAGNhQTAAHlpCMAAywYAAcAAywjAAY2ZBMAAeWsIwADLBgABwADLCMABja0EwAB5bAjAAMsGAAHAAMsIwAGNwQTAAHluCMAAywYAAcAAywjAAY3VBMAAeXEIwADLBgABwADLCMABjekEwAB5cwjAAMsGAAHAAMsIwAGN/QTAAHl1CMAAywYAAcAAywjAAY4RBMAAeXcIwADLBgABwADLCMABjiUEwAB5eAjAAMsGAAHAAMsIwAGOOQTAAHl5CMAAywYAAcAAywjAAY5NBMAAeXoIwADLBgABwADLCMABjmEEwAB5fAjAAMsGAAHAAMsIwAGOdQTAAHl+CMAAywYAAcAAywjAAY6JBMAAeYAIwADLBgABwADLCMABjp0EwAB5gQjAAMsGAAHAAMsIwAGOsQTAAHmCCMAAywYAAcAAywjAAY7FBMAAeYMIwADLBgABwADLCMABjtkEwAB5hAjAAMsGAAHAAMsIwAGO7QTAAHmFCMAAywYAAcAAywjAAY8BBMAAeYYIwADLBgABwADLCMABjxUEwAB5hwjAAMsGAAHAAMsIwAGPKQTAAHmICMAAywYAAcAAywjAAY89BMAAeYkIwADLBgABwADLCMABj1EEwAB5igjAAMsGAAHAAMsIwAGPZQTAAHmLCMAAywYAAcAAywjAAY95BMAAeYwIwADLBgABwADLCMABj40EwAB5jQjAAMsGAAHAAMsIwAGPoQTAAHmOCMAAywYAAcAAywjAAY+1BMAAeY8IwADLBgABwADLCMABj8kEwAB5kQjAAMsGAAHAAMsIwAGP3QTAAHmTCMAAywYAAcAAywjAAY/xBMAAeZUIwADLBgABwADLCMABkAUEwAB5lwjAAMsGAAHAAMsIwAGQGQTAAHmZCMAAywYAAcAAywjAAZAtBMAAeZsIwADLBgABwADLCMABkEEEwAB5nQjAAMsGAAHAAMsIwAGQVQTAAHmfCMAAywYAAcAAywjAAZBpBMAAeaAIwADLBgABwADLCMABkH0EwAB5ogjAAMsGAAHAAMsIwAGQkQTAAHmjCMAAywYAAcAAywjAAZClBMAAeaQIwADLBgABwADLCMABkLkEwAB5pQjAAMsGAAHAAMsIwAGQzQTAAHmmCMAAywYAAcAAywjAAZDhBMAAeacIwADLBgABwADLCMABkPUEwAB5qAjAAMsGAAHAAMsIwAGRCQTAAHmpCMAAywYAAcAAywjAAZEdBMAAeaoIwADLBgABwADLCMABkTEEwAB5qwjAAMsGAAHAAMsIwAGRRQTAAHmsCMAAywYAAcAAywjAAZFZBMAAea0IwADLBgABwADLCMABkW0EwAB5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wADLBgABwADLCMABoxMEwAB/6wjAAMsGAAHAAMsIwAGjJwTAAH/sCMAAywYAAcAAywjAAaM7BMAAf+0IwADLBgABwADLCMABo08EwAB/7gjAAMsGAAHAAMsIwAGjYwTAAH/wCMAAywYAAcAAywjAAaN3BMAAf/IIwADLBgABwADLCMABo4sEwAB/9QjAAMsGAAHAAMsIwAGjnwTAAH/7CMAAywYAAcAAywjAAaOzBMAAf/8IwADLBgABwADLCMABo8cEwACAAwjAAMsGAAHAAMsIwAGj2wTAAIAHCMAAywYAAcAAywjAAaPvBMAAgAsIwADLBgABwADLCMABpAMEwACAEQjAAMsGAAHAAMsIwAGkFwTAAIASCMAAywYAAcAAywjAAaQrBMAAgBgIwADLBgABwADLCMABpD8EwACAGwjAAMsGAAHAAMsIwAGkUwTAAIAeCMAAywYAAcAAywjAAaRnBMAAgCAIwADLBgABwADLCMABpHsEwACAIgjAAMsGAAHAAMsIwAGkjwTAAIAoCMAAywYAAcAAywjAAaSjBMAAgCkIwADLBgABwADLCMABpLcEwACARAjAAMsGAAHAAMsIwAGkywTAAIBFCMAAywYAAcAAywjAAaTfBMAAgEYIwADLBgABwADLCMABpPMEwACARwjAAMsGAAHAAMsIwAGlBwTAAIBICMAAywYAAcAAywjAAaUbBMAAgEkIwADLBgABwADLCMABpS8EwACASgjAAMsGAAHAAMsIwAGlQwTAAIBLCMAAywYAAcAAywjAAaVXBMAAgEwIwADLBgABwADLCMABpWsEwACATQjAAMsGAAHAAMsIwAGlfwTAAIBOCMAAywYAAcAAywjAAaWTBMAAgGAIwADLBgABwADLCMABpacEwACAZAjAAPm9AAHAAPm/wAGluwTAAIBnCMAA+b0AAcAA+b/AAaXPBMAAgGoIwAD5vQABwAD5v8ABpeMEwACAbQjAAPm9AAHAAPm/wAGl9wTAAIBwCMAA+b0AAcAA+b/AAaYLBMAAgHMIwAD5vQABwAD5v8ABph8EwACAdgjAAPm9AAHAAPm/wAGmMwTAAIB5CMAA+b0AAcAA+b/AAaZHBMAAgHwIwAD5vQABwAD5v8ABplsEwACAfwjAAPm9AAHAAPm/wAGmbwTAAICCCMAA+b0AAcAA+b/AAaaDBMAAgIUIwAD5vQABwAD5v8ABppcEwACAiAjAAPm9AAHAAPm/wAGmqwTAAICLCMAA+b0AAcAA+b/AAaa/BMAAgKoIwADLBgABwADLCMABptMEwACArAjAAMsGAAHAAMsIwAGm5wTAAICuCMAAywYAAcAAywjAAab7BMAAgLAIwADLBgABwADLCMABpw8EwACAsgjAAMsGAAHAAMsIwAGnIwTAAICzCMAAywYAAcAAywjAAac3BMAAgLUIwADLBgABwADLCMABp0sEwACAtwjAAMsGAAHAAMsIwAGnXwTAAIC5CMAAywYAAcAAywjAAadzBMAAgOkIwADLBgABwADLCMABp4cEwACA6gjAAMsGAAHAAMsIwAGnmwjAAO5vAAHAAO58CQTAAIDtCMAA+b0AAcAA+b/AAae7BMAAgO8IwAD5vQABwAD5v8ABp88IwADubwABwADufCEEwACA8QjAAPm9AAHAAPm/wAGn7wjAAO5vAAHAAO58UgTAAID0CMAA+b0AAcAA+b/AAagPCMAA7m8AAcAA7nyBVQTAAID3CMAA+b0AAcAA+b/AAagwCMAA7oAAAcAA7osVBMAAgPoIwAD5vQABwAD5v8ABqFAIwADugAABwADuiyEEwACA/QjAAPm9AAHAAPm/wAGocAjAAO6AAAHAAO6LUgTAAIEACMAA+b0AAcAA+b/AAaiQCMAA7oAAAcAA7ouBVQTAAIEDCMAA+b0AAcAA+b/AAaixBMAAgTQIwADLBgABwADLCMABqMUEwACBNwjAAMsGAAHAAMsIwAGo2QTAAIE5CMAAywYAAcAAywjAAajtBMAAgTsIwADLBgABwADLCMABqQEEwACBPQjAAMsGAAHAAMsIwAGpFQTAAIE/CMAAywYAAcAAywjAAakpBMAAgUEIwADLBgABwADLCMABqT0EwACBRAjAAMsGAAHAAMsIwAGpUQTAAIFHCMAAywYAAcAAywjAAallBMAAgUwIwADLBgABwADLCMABqXkEwACBTwjAAMsGAAHAAMsIwAGpjQTAAIFTCMAAywYAAcAAywjAAamhBMAAgVcIwADLBgABwADLCMABqbUEwACBWgjAAMsGAAHAAMsIwAGpyQTAAIFcCMAAywYAAcAAywjAAandBMAAgV4IwADLBgABwADLCMABqfEIwADIlAAACsAA8HoKwADwfATAAIGICMAA+b0AAcAA+b/AAaoWCMAA74sAAcAA75cVBMAAgYsIwAD5vQABwAD5v8ABqjYIwADviwABwADvlyEEwACBjQjAAPm9AAHAAPm/wAGqVgjAAO+LAAHAAO+XUgdgwADviwTAAZs0wAGqKsABqkrAAapqBMAAgYkEnGEHYMAA/bYEwAElWMABqo3AASW5wAGqkgjAAO+fAAbAAO+pd8AA76p3wADvq3fAAO+swAGqasAA760JwADvroGcBMAAgZgIwADLBgABwADLCMABqtUEwABCagTAAIGkBMAAgaUEwACBpgTAAIGnBMAAgagEwACBqQTAAIGqB2DAAP22CMABqunAAaruwAGq88ABqvjAAar9wAGrAsABqwfAAasMBMAAgc8IwADLBgABwADLCMABqzgEwACB0QjAAMsGAAHAAMsIwAGrTATAAIHTCMAAywYAAcAAywjAAatgBMAAgeQIwAD5vQABwAD5v8ABq3QEwACB5wjAAPm9AAHAAPm/wAGriATAAIHpCMAA+b0AAcAA+b/AAaucBMAAgewIwAD5vQABwAD5v8ABq7AEwACB7QjAAPm9AAHAAPm/wAGrxATAAIILCMAAywYAAcAAywjAAavYBMAAgg0IwADLBgABwADLCMABq+wEwACCDwjAAMsGAAHAAMsIwAGsAATAAIIRCMAAywYAAcAAywjAAawUBMAAghQIwADLBgABwADLCMABrCgEwACCFgjAAMsGAAHAAMsIwAGsPATAAIIXCMAAywYAAcAAywjAAaxQBMAAgS0EuyYEwACCOgTAAII8BMAAf6oKwAC37gTAAILECMAA+b0AAcAA+b/AAayABMAAgssIwADLBgABwADLCMABrJQEwACCzAjAAMsGAAHAAMsIwAGsqATAAILNCMAAywYAAcAAywjAAay8BMAAgs4IwADLBgABwADLCMABrNAEwACCzwjAAMsGAAHAAMsIwAGs5ATAAILRCMAAywYAAcAAywjAAaz4BMAAgtMIwADLBgABwADLCMABrQwEwACC1AjAAMsGAAHAAMsIwAGtIATAAILWCMAAywYAAcAAywjAAa00BMAAgtcIwADLBgABwADLCMABrUgEwACC2QjAAMsGAAHAAMsIwAGtXATAAILfCMAAywYAAcAAywjAAa1wBMAAguEIwADLBgABwADLCMABrYQEwACC4wjAAMsGAAHAAMsIwAGtmATAAILlCMAAywYAAcAAywjAAa2sBMAAgucIwADLBgABwADLCMABrcAEwACC6QjAAMsGAAHAAMsIwAGt1ATAAILrCMAA8kEAAsAA8n4VwADyf8ABregEwACC7AjAAPJBAALAAPJ+IcAA8n/AAa4BBMAAgu0IwADyQQACwADyfoPywADyf8ABrhoEwACC7gjAAPJBAALAAPJ+wACMW8AA8n/AAa40BMAAgu8IwADyQQACwADyfsAAYo/AAPJ/wAGuUATAAIL0CMAAywYAAcAAywjAAa5sBMAAgvYIwADLBgABwADLCMABroAEwACC+gjAAPm9AAHAAPm/wAGulATAAIL9CMAA+b0AAcAA+b/AAa6oCMAA8hcAAcAA8iIhBMAAgwAIwAD5vQABwAD5v8ABrsgEwACDAwjAAPm9AAHAAPm/wAGu3AdgwADyFwTAAZ+ZwAGfpcABrrzAAZ+xBMAAfyUEwACC+wTAAIL+BMAAgwEHYMAA/bYEwAGvB8ABrwzAAa8RwAGvFgjAAPUoAAAEwACDCwjAAPJBAALAAPJ+gVXAAPJ/wAGvOQTAAIMNCMAA8kEAAsAA8n6CPMAA8n/AAa9TBMAAgw8IwADyQQACwADyfoQIwADyf8ABr20EwACDEQjAAPJBAALAAPJ+hODAAPJ/wAGvhwTAAIMTCMAA8kEAAsAA8n6DPsAA8n/AAa+hBMAAgxUIwADyQQACwADyfoPvwADyf8ABr7sEwACDGAjAAPJBAALAAPJ+wACNJMAA8n/AAa/VBMAAgxsIwADyQQACwADyfoP1wADyf8ABr/EEwACDHQjAAPJBAALAAPJ+wACDwcAA8n/AAbALBMAAgyAIwADyQQACwADyfsAAfHrAAPJ/wAGwJwTAAIMiCMAA8kEAAsAA8n7AAH1QwADyf8ABsEMEwACDJAjAAPJBAALAAPJ+wAB7u8AA8n/AAbBfBMAAgyYIwADyQQACwADyfsAAaa3AAPJ/wAGwewTAAIMoCMAA8kEAAsAA8n7AAHWXwADyf8ABsJcEwACDKgjAAPJBAALAAPJ+wAB1DMAA8n/AAbCzBMAAgywIwADyQQACwADyfsAAZCDAAPJ/wAGwzwTAAIMuCMAA8kEAAsAA8n7AAGNnwADyf8ABsOsEwACDMAjAAPJBAALAAPJ+wABwz8AA8n/AAbEHBMAAgzIIwADyQQACwADyfsAAYzTAAPJ/wAGxIwTAAIM0CMAA8kEAAsAA8n7AAGMBwADyf8ABsT8EwACDNwjAAPJBAALAAPJ+sb7AAPJ/wAGxWwTAAIM5CMAA8kEAAsAA8n7AAGAdwADyf8ABsXUEwACDOgjAAPm9AAHAAPm/wAGxkQTAAIM7CMAA+b0AAcAA+b/AAbGlBMAAgzwIwAD5vQABwAD5v8ABsbkEwACDPQjAAPm9AAHAAPm/wAGxzQTAAIM+CMAA+b0AAcAA+b/AAbHhBMAAgz8IwAD5vQABwAD5v8ABsfUEwACDQAjAAPm9AAHAAPm/wAGyCQTAAINBCMAA+b0AAcAA+b/AAbIdBMAAg0IIwAD5vQABwAD5v8ABsjEEwACDQwjAAPm9AAHAAPm/wAGyRQTAAINECMAA+b0AAcAA+b/AAbJZBMAAg0UIwAD5vQABwAD5v8ABsm0EwACDRgjAAPm9AAHAAPm/wAGygQTAAINHCMAA+b0AAcAA+b/AAbKVBMAAg0gIwAD5vQABwAD5v8ABsqkEwACDSQjAAPm9AAHAAPm/wAGyvQTAAINKCMAA+b0AAcAA+b/AAbLRBMAAg0sIwAD5vQABwAD5v8ABsuUEwACDTAjAAPm9AAHAAPm/wAGy+QTAAINNCMAA+b0AAcAA+b/AAbMNBMAAg04IwAD5vQABwAD5v8ABsyEEwACDTwjAAPm9AAHAAPm/wAGzNQTAAINQCMAA+b0AAcAA+b/AAbNJBMAAg1EIwAD5vQABwAD5v8ABs10EwACDUgjAAPm9AAHAAPm/wAGzcQTAAINTCMAA+b0AAcAA+b/AAbOFBMAAg1QIwAD5vQABwAD5v8ABs5kEwACDVQjAAPm9AAHAAPm/wAGzrQTAAINWCMAA+b0AAcAA+b/AAbPBBMAAg9UIwAD5vQABwAD5v8ABs9UEwACD1wjAAPm9AAHAAPm/wAGz6QTAAIPZCMAA+b0AAcAA+b/AAbP9BMAAg+AIwAD5vQABwAD5v8ABtBEEwACD4gjAAPm9AAHAAPm/wAG0JQTAAIPkCMAA+b0AAcAA+b/AAbQ5BMAAg+YIwAD5vQABwAD5v8ABtE0EwACD6QjAAMsGAAHAAMsIwAG0YQTAAIPvCMAA+b0AAcAA+b/AAbR1BMAAg/EIwAD5vQABwAD5v8ABtIkEwACD8gjAAPm9AAHAAPm/wAG0nQjAAPQFAAHAAPQOCQTAAIP2CMAA+b0AAcAA+b/AAbS9CMAA9AUAAcAA9A5SBMAAg/wIwAD0EgACwAD0FAnAAPQWwAG03QTAAIP9CMAA9BIAAsAA9BQVwAD0FsABtPYEwACD/gjAAPQSAALAAPQUIcAA9BbAAbUPBMAAg/8IwAD0EgACwAD0FFLAAPQWwAG1KATAAIQACMAA9BIAAsAA9BSBVcAA9BbAAbVBBMAAhAEIwAD0EgACwAD0FII8wAD0FsABtVsEwACEAgjAAPQSAALAAPQUhAjAAPQWwAG1dQdgwAD0EgfAAbTiwAG0+8ABtRTAAbUtwAG1RsABtWDAAbV6BMAAhA0IwADLBgABwADLCMABtbIEwACEGwjAAPm9AAHAAPm/wAG1xgTAAIQdCMAA+b0AAcAA+b/AAbXaBMAAhB4EwACEHwTAAIQgBMAAhCEHYMAA/bYEwAG17sABtfPAAbX4wAG1/QTAAIQqCMAA+b0AAcAA+b/AAbYZBMAAhDEIwADLBgABwADLCMABti0EwACEMwjAAMsGAAHAAMsIwAG2QQTAAIQ1CMAAywYAAcAAywjAAbZVBMAAhDcIwADLBgABwADLCMABtmkEwACEOAjAAMsGAAHAAMsIwAG2fQTAAIQ5CMAAywYAAcAAywjAAbaRBMAAhD0IwAD1DgABwAD1GMABtqUEwACETgjAAMsGAAHAAMsIwAG2uQTAAIRQCMAAywYAAcAAywjAAbbNBMAAb6AIwAD1DgABwAD1GMABtuEIwAD1DgABwAD1GMABJVgEg9YIwAD1DgABwAD1GMABtwQEwACEXgjAAPm9AAHAAPm/wAG3FgTAAIRgCMAA+b0AAcAA+b/AAbcqBMAAhGEIwAD5vQABwAD5v8ABtz4EwACEbAjAAMsGAAHAAMsIwAG3UgjAAPUyAAAIwAD1RAAABMAAhHIIwADLBgABwADLCMABt3QEwACEdgjAAMsGAAHAAMsIwAG3iAjAAO2TAAfAAO2VAMAA7ZaECMAA7ZeDPsAA7ZgJwADtmcAAgXLAAO2aAMAA7Zt3BMAAhIMIwAD5vQABwAD5v8ABt8sEwACEhQjAAPm9AAHAAPm/wAG33wTAAISGCMAA+b0AAcAA+b/AAbfzBMAAhIcIwAD5vQABwAD5v8ABuAcEwACEiAjAAPm9AAHAAPm/wAG4GwTAAISJCMAA+b0AAcAA+b/AAbgvBMAAhIoIwAD5vQABwAD5v8ABuEMEwACEmQjAAPm9AAHAAPm/wAG4VwrAAO5sCsAA7msKwADqIQrAAPIEBMAAhKcIwADLBgABwADLCMABuH8EwACEqQjAAMsGAAHAAMsIwAG4kwdgwAD70AUVIVKBVQkEwACEvwjAAMsGAAHAAMsIwAG4tArAAPVrC13AAPXJAVsIwAD50QACwAD508ABdNnAAPnUwAG4zQTAAITqCMAAywYAAcAAywjAAbjsBMAAhOsIwADLBgABwADLCMABuQAEwACE7QjAAMsGAAHAAMsIwAG5FATAAITuCMAAywYAAcAAywjAAbkoBMAAhPIIwADLBgABwADLCMABuTwEwACE9wjAAMsGAAHAAMsIwAG5UAI5wACFBQI5wACFBwI3hDMIwAD7rAAAAjeDywtgwAD2sAjAAPnRAALAAPnTwAF02cAA+dTAAbl/BMAAhegIwADLBgABwADLCMABuZwEwACF6QjAAMsGAAHAAMsIwAG5sATAAIXrCMAAywYAAcAAywjAAbnEBMAAhe0IwADLBgABwADLCMABudgEwACF7gjAAMsGAAHAAMsIwAG57ATAAIXwCMAAywYAAcAAywjAAboABMAAhfEIwADLBgABwADLCMABuhQEwACF8wjAAMsGAAHAAMsIwAG6KATAAIX1CMAAywYAAcAAywjAAbo8BMAAhfYIwADLBgABwADLCMABulAEwACF9wjAAMsGAAHAAMsIwAG6ZATAAIX5CMAAywYAAcAAywjAAbp4BMAAhfoIwADLBgABwADLCMABuowEwACGAgjAAMsGAAHAAMsIwAG6oATAAIYDCMAAywYAAcAAywjAAbq0BMAAhgQIwADLBgABwADLCMABusgEwACGBQjAAMsGAAHAAMsIwAG63ATAAIYJCMAAywYAAcAAywjAAbrwBMAAhgoIwADLBgABwADLCMABuwQEwACGCwjAAMsGAAHAAMsIwAG7GATAAIYMCMAAywYAAcAAywjAAbssBMAAhg4IwADLBgABwADLCMABu0AEwACGDwjAAMsGAAHAAMsIwAG7VATAAIYSCMAAywYAAcAAywjAAbtoBMAAhhQIwADLBgABwADLCMABu3wEwACGGAjAAMsGAAHAAMsIwAG7kAI5wACGGwI5wACGHAMAAAAAAADgQwTAAIYnCMAAywYAAcAAywjAAbu5BMAAhjAIwADLBgABwADLCMABu80EwACGPgjAAMsGAAHAAMsIwAG74QTAAIZACMAAywYAAcAAywjAAbv1BMAAhkEIwADLBgABwADLCMABvAkLXcAA90wBWwjAAPnRAALAAPnTwAF02cAA+dTAAbwdBMAAhkUIwADLBgABwADLCMABvDwEwACGRwjAAMsGAAHAAMsIwAG8UATAAIZICMAAywYAAcAAywjAAbxkBMAAhk4IwADLBgABwADLCMABvHgEwACGUAjAAMsGAAHAAMsIwAG8jATAAIZRCMAAywYAAcAAywjAAbygBMAAhlIIwADLBgABwADLCMABvLQEwACGbwTAAIZ0CMAAywYAAcAAywjAAbzNBMAAhnUIwADLBgABwADLCMABvOEEwACGdgjAAMsGAAHAAMsIwAG89QTAAIZ4CMAAywYAAcAAywjAAb0JBMAAhnoIwADLBgABwADLCMABvR0EwACGewjAAMsGAAHAAMsIwAG9MQTAAIZ8CMAAywYAAcAAywjAAb1FBMAAhn0IwADLBgABwADLCMABvVkEwACGfgjAAMsGAAHAAMsIwAG9bQTAAIZ/CMAAywYAAcAAywjAAb2BBMAAhoAIwADLBgABwADLCMABvZUEwACGgQjAAMsGAAHAAMsIwAG9qQMAAAAAAADgwwI5wACGhwdgwAD70IDIswyzDLMMta2zDLWFswyJA7MMjXOzDJJYswySg7MMn5OzDMAAYh2zDMAAhNi1rbMMta21rbWttYW1rYkDta2Nc7Wtkli1rZKDta2fk7WtwABiHbWtwACE2LWFswy1hbWttYW1hbWFiQO1hY1ztYWSWLWFkoO1hZ+TtYXAAGIdtYXAAITYiQOzDIkDta2JA7WFiQOJA4kDjXOJA5JYiQOSg4kDn5OJA8AAYh2JA8AAhNiNc7MMjXO1rY1ztYWNc4kDjXONc41zkliNc5KDjXOfk41zwABiHY1zwACE2JJYswySWLWtkli1hZJYiQOSWI1zkliSWJJYkoOSWJ+TkljAAGIdkljAAITYkoOzDJKDta2Sg7WFkoOJA5KDjXOSg5JYkoOSg5KDn5OSg8AAYh2Sg8AAhNifk7MMn5O1rZ+TtYWfk4kDn5ONc5+Tklifk5KDn5Ofk5+TwABiHZ+TwACE2MAAYh2zDMAAYh21rcAAYh21hcAAYh2JA8AAYh2Nc8AAYh2SWMAAYh2Sg8AAYh2fk8AAYh3AAGIdwABiHcAAhNjAAITYswzAAITYta3AAITYtYXAAITYiQPAAITYjXPAAITYkljAAITYkoPAAITYn5PAAITYwABiHcAAhNjAAITYBMAAhosEwACGjATAAIaNBMAAho4EwACGjwTAAIaQBMAAhpEEwACGkgTAAIaTBMAAhpQEwACGlQTAAIaWBMAAhpcEwACGmATAAIaZBMAAhpoEwACGmwTAAIacBMAAhp0EwACGngTAAIafBMAAhqAEwACGoQTAAIaiBMAAhqMEwACGpATAAIalBMAAhqYEwACGpwTAAIaoBMAAhqkEwACGqgTAAIarBMAAhqwEwACGrQTAAIauBMAAhq8EwACGsATAAIaxBMAAhrIEwACGswTAAIa0BMAAhrUEwACGtgTAAIa3BMAAhrgEwACGuQTAAIa6BMAAhrsEwACGvATAAIa9BMAAhr4EwACGvwTAAIbABMAAhsEEwACGwgTAAIbDBMAAhsQEwACGxQTAAIbGBMAAhscEwACGyATAAIbJBMAAhsoEwACGywTAAIbMBMAAhs0EwACGzgTAAIbPBMAAhtAEwACG0QTAAIbSBMAAhtMEwACG1ATAAIbVBMAAhtYEwACG1wTAAIbYBMAAhtkEwACG2gTAAIbbBMAAhtwEwACG3QTAAIbeBMAAht8EwACG4ATAAIbhBMAAhuIEwACG4wTAAIbkBMAAhuUEwACG5gTAAIbnBMAAhugEwACG6QTAAIbqBMAAhusEwABRTATAAFFKBMAAhuwEwACG7QTAAIbuBMAAhu8EwACG8ATAAIbxBMAAhvIEwACG8wTAAIb0BMAAhvUEwACG9gTAAIb3BMAAhvgEwACG+QTAAIb6BMAAhvsEwACG/ATAAIb9BMAAhv4EwACG/wTAAIcABMAAhwEEwACHAgTAAIcDBMAAhwQEwACHBQTAAIcGBMAAhwcEwACHCATAAIcJBMAAhwoEwACHCwTAAIcMBMAAhw0EwACHDgTAAIcPBMAAhxAEwACHEQTAAIcSBMAAhxMEwACHFATAAIcVBMAAhxYEwACHFwTAAIcYBMAAhxkEwACHGgTAAIcbBMAAhxwEwACHHQTAAIceBMAAhx8EwACHIATAAIchBMAAhyIEwACHIwTAAIckBMAAhyUEwACHJgTAAIcnBMAAhygEwACHKQTAAIcqBMAAhysEwACHLATAAIctBMAAhy4EwACHLwTAAIcwBMAAhzEEwACHMgTAAIczBMAAhzQEwACHNQTAAIc2BMAAhzcEwACHOATAAIc5BMAAhzoEwACHOwTAAIc8BMAAhz0EwACHPgTAAIc/BMAAh0AEwACHQQTAAIdCBMAAh0MEwACHRATAAIdFBMAAh0YEwACHRwTAAIdIBMAAh0kEwACHSgTAAIdLBMAAh0wEwACHTQdgwAD9toDHwAG/tMABv7nAAb++wAG/w8ABv8jAAb/NwAG/0sABv9fAAb/cwAG/4cABv+bAAb/rwAG/8MABv/XAAb/6wAG//8ABwATAAcAJwAHADsABwBPAAcAYwAHAHcABwCLAAcAnwAHALMABwDHAAcA2wAHAO8ABwEDAAcBFwAHASsABwE/AAcBUwAHAWcABwF7AAcBjwAHAaMABwG3AAcBywAHAd8ABwHzAAcCBwAHAhsABwIvAAcCQwAHAlcABwJrAAcCfwAHApMABwKnAAcCuwAHAs8ABwLjAAcC9wAHAwsABwMfAAcDMwAHA0cABwNbAAcDbwAHA4MABwOXAAcDqwAHA78ABwPTAAcD5wAHA/sABwQPAAcEIwAHBDcABwRLAAcEXwAHBHMABwSHAAcEmwAHBK8ABwTDAAcE1wAHBOsABwT/AAcFEwAHBScABwU7AAcFTwAHBWMABwV3AAcFiwAHBZ8ABwWzAAcFxwAHBdsABwXvAAcGAwAHBhcABwYrAAcGPwAHBlMABwZnAAcGewAFiaMABYmvAAcGjwAHBqMABwa3AAcGywAHBt8ABwbzAAcHBwAHBxsABwcvAAcHQwAHB1cABwdrAAcHfwAHB5MABwenAAcHuwAHB88ABwfjAAcH9wAHCAsABwgfAAcIMwAHCEcABwhbAAcIbwAHCIMABwiXAAcIqwAHCL8ABwjTAAcI5wAHCPsABwkPAAcJIwAHCTcABwlLAAcJXwAHCXMABwmHAAcJmwAHCa8ABwnDAAcJ1wAHCesABwn/AAcKEwAHCicABwo7AAcKTwAHCmMABwp3AAcKiwAHCp8ABwqzAAcKxwAHCtsABwrvAAcLAwAHCxcABwsrAAcLPwAHC1MABwtnAAcLewAHC48ABwujAAcLtwAHC8sABwvfAAcL8wAHDAcABwwbAAcMLwAHDEMABwxXAAcMawAHDH8ABwyTAAcMpwAHDLsABwzPAAcM4wAHDPcABw0LAAcNHwAHDTMABw1HAAcNWwAHDW8ABw2DAAcNlwAHDasABw2/AAcN0wAHDecABw37AAcODwAHDiAI3wJiWgAI3xfXhAAI3+5rKAATAAIdRCMAAywYAAcAAywjAAcbDBMAAh1IIwADLBgABwADLCMABxtcEwACHUwjAAMsGAAHAAMsIwAHG6wTAAIdbCMAAywYAAcAAywjAAcb/BMAAh1wIwADLBgABwADLCMABxxMEwACHfQjAAMsGAAHAAMsIwAHHJwTAAIeKCMAAywYAAcAAywjAAcc7BMAAh4wIwADLBgABwADLCMABx08EwACHjQjAAMsGAAHAAMsIwAHHYwTAAIePCMAAywYAAcAAywjAAcd3B2DAAPvQgQAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQnAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBCQkJCQkJCcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBCQkJCcABeAEJwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAHAAXgBwAF4AcABeAEJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJBMAAh6cIwADLBgABwADLCMAByVAEwACHqwjAAMsGAAHAAMsIwAHJZATAAIesCMAAywYAAcAAywjAAcl4BMAAh64IwADLBgABwADLCMAByYwEwACHsAjAAMsGAAHAAMsIwAHJoATAAIeyCMAAywYAAcAAywjAAcm0BMAAh7MIwADLBgABwADLCMABycgEwACHtQjAAMsGAAHAAMsIwAHJ3ATAAIe2CMAAywYAAcAAywjAAcnwBMAAh7gIwADLBgABwADLCMABygQCN8AH//8EwACHyAjAAMsGAAHAAMsIwAHKHgTAAIfTCMAAywYAAcAAywjAAcoyBMAAh9UIwADLBgABwADLCMABykYEwACH1gjAAMsGAAHAAMsIwAHKWgTAAIfXCMAAywYAAcAAywjAAcpuBMAAh94IwADLBgABwADLCMAByoIEwACH7wjAAMsGAAHAAMsIwAHKlgrAAPkKCsAA+QsEwACH+QjAAMsGAAHAAMsIwAHKtATAAIf6CMAAywYAAcAAywjAAcrIBMAAh/0IwADLBgABwADLCMABytwEwACIAATAAIgCBMAAiAMIwADLBgABwADLCMAByvoLYMAA+TwIwAD50QACwAD508ABdNnAAPnUwAHLDgTAAIgECMAAywYAAcAAywjAAcsrBMAAiAYIwADLBgABwADLCMAByz8EwACIEgjAAMsGAAHAAMsIwAHLUwTAAIgUCMAAywYAAcAAywjAActnBMAAiBUIwADLBgABwADLCMABy3sEwACIGQjAAMsGAAHAAMsIwAHLjwTAAIgiCMAAywYAAcAAywjAAcujBMAAiCMIwADLBgABwADLCMABy7cEwACIKAjAAMsGAAHAAMsIwAHLywTAAIgpCMAAywYAAcAAywjAAcvfBMAAiCoIwADLBgABwADLCMABy/MEwACIKwjAAMsGAAHAAMsIwAHMBwTAAIguCMAA+b0AAcAA+b/AAcwbBMAAiDUIwADLBgABwADLCMABzC8CN4ERAjeBTgdgwAD70AwJwABgHZMxwACRAcAAkVjAALAlwAGYE8ABl8PAAZiTwAHMQ8ABfNjAAcxHAjeBEgI3gU8HYMAA+9AMCcAAYB2VusAAkQTAAJFbwACv78ABmFfAAZgLwAGXz8ABzH3AAXzcwAHMgQddwAD8dAFgwAD70ALAAcxLwAHMhQI5wACIVwTAAIhsCMAAywYAAcAAywjAAczSBMAAiG4IwADLBgABwADLCMABzOYEwACIcQjAAMsGAAHAAMsIwAHM+gTAAIhzCMAAywYAAcAAywjAAc0OAjnAAIh6AjfIwD4QAjfAAjqxAjfABhqAAjfAAI6sAjeFtQI3w5OHAAI5wACIhgI3wAFRgAI3wACw6gMBAAAAAAAAAAI3xSZcAAI3jhACN4WgBMAAiQgIwADLBgABwADLCMABzXMEwACJDAjAAMsGAAHAAMsIwAHNhwTAAIkUCMAA+b0AAcAA+b/AAc2bBMAAiRoIwADLBgABwADLCMABza8EwACJIgSCbAdgwAD9tgXAAUNhwADuI8AA7jrAAc3DwAHNyAXAAPVzwABwbQXAAPVzwABwbgTAAIlzCMAAywYAAcAAywjAAc34AjnAAIl1AjnAAIl2AjfXF5FJAjnAAIl3AjnAAIl4AjfOjUpRAjnAAIl5AjfVn9gAAjnAAIl6AjfQ1jrxAjnAAIl7AjnAAIl8AjnAAIl9AjfMxtthAjnAAIl+AjfZoQAAAjnAAIl/AjfwnxAhAjnAAImAAjfGSHuAAjnAAImBAjfKLxtvAjnAAImCAjfQAAAAAjfYdUVxAjnAAImDAjfkfbyAAjnAAImEAjf1R2Z7AjnAAImFAjfD0JAAAjnAAImGAjfFHK/pAjnAAImHAjfGwgpAAjnAAImIAjfI0tkxAjnAAImJAjfLZAAAAjnAAImKAjfSaa5AAjnAAImLAjfcuRAAAjnAAImMAjfjdEiZAjnAAImNAjfrc6hAAjnAAImOAjf05jtBAjnAAImPAjfCVSihAjnAAImQAjfCtUogAjnAAImRAjfDIWuTAjnAAImSAjfDmqQAAjnAAImTB2DAAPvQgIzAAGCuwAHODJ3FwAHOEsAAfVDAAc4YwABYWMABzh7AAIFywAHODMAAYK7AAc4kwACMW8ABzirAAGM0wAHOMMAAjSTAAc42wABkIMABzjyD8sABzkLAAHUMwAHOSIPywAHODMAAaa3AAc4kg+/AAc4YwAB7u8ABzk6D78ABxr3AAH1QwAHOVIM+wAHOWsAAfHrAAc5ggz7AAc5mwAB8esABzmyDPsABznKDUcABzniE4MABzn6DUcABzoSE4MABzorAAIFywAHOkITgwAHOlsAAgXLAAc4khODAAc6cwACBcsABzqKE4MABzqjAAIPBwAHOroTgwAHOtMAAg8HAAc66hAjAAc7AwACDwcABzsaECMABzszAAIPBwAHO0oQIwAHO2IP1wAHO3oQIwAHO5IP1wAHO6oQIwAHO8IP1wAHO9oQIwAHOKoP1wAHOMIQIwAHO/IP1wAHPAoQIwAHOGIP1wAHOHoQIwAHPCMAAjFvAAc8OhAjAAc8UwACMW8ABzxqECMABzyDAAIxbwAHPJoQIwAHPLMAAjFvAAc8yhAjAAc4MwACMW8ABziSCPMABzzjAAIxbwAHPPoI8wAHPRMAAjFvAAc9KgjzAAc9QwACMW8ABz1aCPMABz1zAAI0kwAHPYgI5wACJlwdgwAD70ALAAdFSwACBcgI3z////wI5wACJmQdgwAD70ALAAdFnwAHRbQTAAImuCMAAywYAAcAAywjAAdGCCsAA++MIwAD3fgJgwAD+KGDAAP0cAcAA94GCYgrAAPxlBMAAib0IwADLBgABwADLCMAB0bcCN4fbBMAAicoIwADLBgABwADLCMAB0c8EwACJzAjAAMsGAAHAAMsIwAHR4wTAAInOCMAAywYAAcAAywjAAdH3BMAAidEIwADLBgABwADLCMAB0gsEwACJ1AjAAMsGAAHAAMsIwAHSHwTAAInVCMAA+dEAAsAA+dPAAXTZwAD51MAB0jMEwACJ1gjAAMsGAAHAAMsIwAHSTwTAAIncBMAAid8IwADLCwABwADLDcAB0mgEwACJ4wjAAMsGAAHAAMsIwAHSfATAAInoCMAAywYAAcAAywjAAdKQBMAAie4IwADLBgABwADLCMAB0qQEwACJ8QjAAMsGAAHAAMsIwAHSuATAAIoMCMAAywYAAcAAywjAAdLMBQCBxATAAIoTAjfAAGeCAjfAAP/+AjfAAIf/AjfAAEf/B2DAAPvQCAkJwAHS6cABd4nAAdLvwAHS9cAB0u/AAdL7AjfAAGAAB2DAAPvQCAkJwAHTIsABd4nAAdLvwAHS9cAB0u/AAdL7AjfAAP/aAjfAAK//B2DAAPvQCAkJwAHTScAB00/AAXd5wAHS9cAB0u/AAdL7AjfAAGgAB2DAAPvQCAkJwAHTdsABd4nAAdLvwAF3dcAB0u/AAXd1B2DAAPvQCAkJwAHTdsABd4kJCcAB0u/AAXd1AjfAAH/SAjer/wdgwAD70AgJCcAB07jAAdO+wAHS78AB0vXAAdLvwAHS+wI3wACACAI3wACEAAI3qAAHYMAA+9AICQnAAdPjwAHT6RXAAdPvCQkCN6//B2DAAPvQCAkJwAHTuMAB1AvAAdLvwAHS9cAB0u/AAdL7AjfAAH/yB2DAAPvQCAkJwAHUMMAB077AAdLvwAHS9cAB0u/AAdL7B2DAAPvQCAkJwAHTuMAB1AvAAXd5wAHS9cAB0u/AAdL7AjfAAP/SB2DAAPvQCAkJwAHUeMAB1AvAAXd5wAHS9cAB0u/AAdL7B2DAAPvQCAkJwAHUeMAB00/AAXd5wAHS9cAB0u/AAdL7BMAAil4IwADLBgABwADLCMAB1MAKwAD+aQTAAIqsCsAA/tcCN8AAbNICN8AAx/8CN8AAf/8HYMAA+9AICQnAAdTjwAF3icAB0u/AAdTpwAF3ecAB1O8CN8AAiAAHYMAA+9AICQnAAdUWwAF3icAB0u/AAXd1wAHS78ABd3UIwAD3fgJgwAD9tl3AAPx0AWDAAP22AcAA94GCYgrAAPWpCMAA+c4AAATAAItECMAAywYAAcAAywjAAdVmBMAAi0YIwADLBgABwADLCMAB1XoEwACLSQjAAMsGAAHAAMsIwAHVjgTAAItQBIRNBMAAi3MEwACLdQTAAIt3BMAAi3kEwACLewTAAIt9BMAAi38EwACLgQTAAINjBMAAi4QEwACLhgTAAIuIBMAAi4oEwACLjATAAIuOBMAAi5AEwABMoATAAIuTBMAAi5UEwACILQSWKATAAIuaBMAAi5wEwACLngTAAIugBMAAi6IEwACLpATAAIunBJxDBMAAi6oEwACLrATAAGn0BMAAi68EwACLsQTAAHwnBMAAi7MEwACLtQTAAIu3BMAAi7kEwACLuwTAAIu9BL9NBMAAi8EEwACLwwjAAPm9AAHAAPm/wAHWewTAAIvFCMAA+b0AAcAA+b/AAdaPBMAAi8cIwAD5vQABwAD5v8AB1qMEwACLyQjAAPm9AAHAAPm/wAHWtwTAAIvLCMAA+b0AAcAA+b/AAdbLBMAAi80IwAD5vQABwAD5v8AB1t8EwACLzwjAAPm9AAHAAPm/wAHW8wTAAIvRCMAA+b0AAcAA+b/AAdcHBMAAi9MIwAD5vQABwAD5v8AB1xsEwACL1QjAAPm9AAHAAPm/wAHXLwTAAIvXCMAA+b0AAcAA+b/AAddDBMAAi9kIwAD5vQABwAD5v8AB11cEwACL2wjAAPm9AAHAAPm/wAHXawTAAIvdCMAA+b0AAcAA+b/AAdd/BMAAi98IwAD5vQABwAD5v8AB15MEwACL4QjAAPm9AAHAAPm/wAHXpwTAAIvjCMAA+b0AAcAA+b/AAde7BMAAi+UI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